diff --git a/.github/scripts/build_tests_matrix.py b/.github/scripts/build_tests_matrix.py index a3bb3329e..69d18560e 100644 --- a/.github/scripts/build_tests_matrix.py +++ b/.github/scripts/build_tests_matrix.py @@ -1,4 +1,5 @@ #!/usr/bin/env python3 +import os import yaml def main(): @@ -8,6 +9,10 @@ def main(): with open(file_name, "r") as fp: yaml_root = yaml.safe_load(fp) + # Get excluded test list + excluded = os.environ.get("EXCLUDE_TESTS", "") + excluded = [s.strip() for s in excluded.strip().split(",")] + # Get test list content = yaml_root["contents"][0] tests = content["tests"] @@ -20,7 +25,9 @@ def main(): for i, part in enumerate(parts): if part == "test_suites" and i + 1 < len(parts): - test_list.append(parts[i+1]) + test_name = parts[i+1] + if test_name not in excluded: + test_list.append(test_name) break # Output names diff --git a/.github/scripts/gdb_test.sh b/.github/scripts/gdb_test.sh new file mode 100755 index 000000000..90eb5ac6b --- /dev/null +++ b/.github/scripts/gdb_test.sh @@ -0,0 +1,87 @@ +#!/bin/bash +# +# This script runs Verilator RTL simulation and OpenOCD in background, invokes +# the supplied test command and shuts everything down. + +SIM_LOG=`realpath sim.log` +OPENOCD_LOG=`realpath openocd.log` + +set +e + +if [ "$#" -lt 1 ]; then + echo "Usage: gdb_test.sh [args ...]" + exit 1 +fi + +# Utils +source `dirname ${BASH_SOURCE[0]}`/utils.sh + +terminate_all () { + terminate ${OPENOCD_PID} + terminate ${SIM_PID} +} + +print_logs () { + echo -e "${COLOR_WHITE}======== Simulation log ========${COLOR_OFF}" + cat ${SIM_LOG} || true + echo -e "${COLOR_WHITE}======== OpenOCD log ========${COLOR_OFF}" + cat ${OPENOCD_LOG} || true +} + +echo -e "${COLOR_WHITE}======== Launching interactive simulation ========${COLOR_OFF}" + +# Start the simulation +echo -e "Starting simulation..." +obj_dir/Vcaliptra_top_tb >"${SIM_LOG}" 2>&1 & +SIM_PID=$! + +# Wait +wait_for_phrase "${SIM_LOG}" "CLP: ROM Flow in progress..." +if [ $? -ne 0 ]; then + echo -e "${COLOR_RED}Failed to start the simulation!${COLOR_OFF}" + print_logs + terminate_all; exit -1 +fi +echo -e "Simulation running and ready (pid=${SIM_PID})" + +# Launch OpenOCD +echo -e "Launching OpenOCD..." +cd ${CALIPTRA_ROOT}/tools/scripts/openocd && openocd -d2 -f board/caliptra-verilator.cfg >"${OPENOCD_LOG}" 2>&1 & +OPENOCD_PID=$! + +# Wait +wait_for_phrase "${OPENOCD_LOG}" "Listening on port 3333 for gdb connections" +if [ $? -ne 0 ]; then + echo -e "${COLOR_RED}Failed to start OpenOCD!${COLOR_OFF}" + print_logs + terminate_all; exit -1 +fi +echo -e "OpenOCD running and ready (pid=${OPENOCD_PID})" + +# Wait a bit +sleep 1s + +# Run the test +echo -e "${COLOR_WHITE}======== Running test '$@' ========${COLOR_OFF}" + +bash -c "$(printf ' %q' "$@")" +EXITCODE=$? + +if [ ${EXITCODE} -eq 0 ]; then + echo -e "${COLOR_GREEN}[PASSED]${COLOR_OFF}" +else + echo -e "${COLOR_RED}[FAILED]${COLOR_OFF}" +fi + +sleep 1s + +# Terminate +echo -e "${COLOR_WHITE}Terminating...${COLOR_OFF}" +terminate_all + +# Display logs +print_logs + +# Honor the exitcode +exit ${EXITCODE} + diff --git a/.github/scripts/openocd_test.sh b/.github/scripts/openocd_test.sh new file mode 100755 index 000000000..75a96ba6a --- /dev/null +++ b/.github/scripts/openocd_test.sh @@ -0,0 +1,68 @@ +#!/bin/bash +# +# This script runs Verilator RTL simulation in background and invokes OpenOCD +# to perform JTAG access test + +SIM_LOG=`realpath sim.log` +OPENOCD_LOG=`realpath openocd.log` + +set +e + +if [ "$#" -lt 1 ]; then + echo "Usage: openocd_test.sh [openocd args ...]" + exit 1 +fi +OPENOCD_ARGS=$@ + +# Utils +source `dirname ${BASH_SOURCE[0]}`/utils.sh + +print_logs () { + echo -e "${COLOR_WHITE}======== Simulation log ========${COLOR_OFF}" + cat ${SIM_LOG} || true + echo -e "${COLOR_WHITE}======== OpenOCD log ========${COLOR_OFF}" + cat ${OPENOCD_LOG} || true +} + +echo -e "${COLOR_WHITE}======== Launching interactive simulation ========${COLOR_OFF}" + +# Start the simulation +echo -e "Starting simulation..." +obj_dir/Vcaliptra_top_tb >"${SIM_LOG}" 2>&1 & +SIM_PID=$! + +# Wait +wait_for_phrase "${SIM_LOG}" "CLP: ROM Flow in progress..." +if [ $? -ne 0 ]; then + echo -e "${COLOR_RED}Failed to start the simulation!${COLOR_OFF}" + print_logs + terminate ${SIM_PID}; exit -1 +fi +echo -e "Simulation running and ready (pid=${SIM_PID})" + +# Wait a bit +sleep 5s + +# Run the test +echo -e "${COLOR_WHITE}======== Running OpenOCD test '$@' ========${COLOR_OFF}" +cd ${CALIPTRA_ROOT}/tools/scripts/openocd && openocd -d2 ${OPENOCD_ARGS} >"${OPENOCD_LOG}" 2>&1 +EXITCODE=$? + +if [ ${EXITCODE} -eq 0 ]; then + echo -e "${COLOR_GREEN}[PASSED]${COLOR_OFF}" +else + echo -e "${COLOR_RED}[FAILED]${COLOR_OFF}" +fi + +sleep 1s + +# Terminate +echo -e "${COLOR_WHITE}Terminating...${COLOR_OFF}" +terminate ${SIM_PID} + +# Display logs +print_logs + +# Honor the exitcode +exit ${EXITCODE} + diff --git a/.github/scripts/utils.sh b/.github/scripts/utils.sh new file mode 100644 index 000000000..e5496afd9 --- /dev/null +++ b/.github/scripts/utils.sh @@ -0,0 +1,49 @@ +#!/bin/bash + +# Colors +COLOR_OFF='\033[0m' +COLOR_RED='\033[31m' +COLOR_GREEN='\033[32m' +COLOR_WHITE='\033[1;37m' + +# Waits until the given phrase appears in a log file (actively written to) +# Usage: wait_for_phrase +wait_for_phrase () { + + # Check if the log exists + sleep 1s + if ! [ -f "$1" ]; then + echo -e "${COLOR_RED}Log file '$1' not found!${COLOR_OFF}" + return -1 + fi + + # Wait for the phrase + DEADLINE=$((${EPOCHSECONDS} + 30)) + while [ ${EPOCHSECONDS} -lt ${DEADLINE} ] + do + # Check for the phrase + grep "$2" "$1" >/dev/null + if [ $? -eq 0 ]; then + return 0 + fi + + # Sleep and retry + sleep 1s + done + + # Timeout + return -1 +} + +# Terminates a process. First via SIGINT and if this doesn't work after 10s +# retries with SIGKILL +# Usage: terminate +terminate () { + + local PID=$1 + + # Gently interrupt, wait some time and then kill + /bin/kill -s SIGINT ${PID} || true + sleep 10s + /bin/kill -s SIGKILL ${PID} || true +} diff --git a/.github/workflows/build-test-verilator.yml b/.github/workflows/build-test-verilator.yml index e39295552..53d8b407c 100644 --- a/.github/workflows/build-test-verilator.yml +++ b/.github/workflows/build-test-verilator.yml @@ -13,8 +13,7 @@ env: CARGO_INCREMENTAL: 0 SCCACHE_VERSION: 0.3.3 RISCV_VERSION: v12.1.0 - # TODO: To update to 5.006, clean up lint errors - VERILATOR_VERSION: v5.002 + VERILATOR_VERSION: v5.012 PKG_CONFIG_PATH: /opt/verilator/share/pkgconfig SCCACHE_GHA_CACHE_TO: sccache-verilator-10000 SCCACHE_GHA_CACHE_FROM: sccache-verilator- @@ -22,32 +21,10 @@ env: SCCACHE_C_CUSTOM_CACHE_BUSTER: f3e6951f0c1d jobs: - build_matrix: - name: Build Smoke Test matrix + build_tools: + name: Build Tools runs-on: ubuntu-22.04 - outputs: - test_names: ${{ steps.output-matrix.outputs.test_names }} - steps: - - uses: actions/checkout@v3 - - name: Install deps - run: | - sudo apt-get update -qy && sudo apt-get install -qy --no-install-recommends \ - python3-minimal python3-yaml - - name: Build matrix - id: output-matrix - run: | - echo "test_names=$(python3 .github/scripts/build_tests_matrix.py)" >> $GITHUB_OUTPUT - - build_and_test: - name: Verilator Smoke Test - runs-on: ubuntu-22.04 - needs: build_matrix - - strategy: - fail-fast: false - matrix: - test_name: ${{fromJSON(needs.build_matrix.outputs.test_names)}} - + steps: - uses: actions/checkout@v3 with: @@ -145,6 +122,8 @@ jobs: needs: build_tools outputs: test_names: ${{ steps.output-matrix.outputs.test_names }} + env: + EXCLUDE_TESTS: "smoke_test_clk_gating, smoke_test_cg_wdt, smoke_test_mbox_cg, smoke_test_kv_cg, smoke_test_doe_cg" steps: - uses: actions/checkout@v3 - name: Install deps @@ -157,7 +136,7 @@ jobs: echo "test_names=$(python3 .github/scripts/build_tests_matrix.py)" >> $GITHUB_OUTPUT build_and_test: - name: Verilator Smoke Test + name: Verilator runs-on: ubuntu-22.04 needs: build_matrix @@ -211,7 +190,6 @@ jobs: run: | CALIPTRA_ROOT=$(pwd) cd tools/scripts - make verilator CALIPTRA_ROOT=$CALIPTRA_ROOT TESTNAME=${{ matrix.test_name }} | tee output.log # Search the last 30 lines of the output for "TESTCASE PASSED" tail -n 30 output.log | grep "TESTCASE PASSED" diff --git a/.github/workflows/interactive-debugging.yml b/.github/workflows/interactive-debugging.yml new file mode 100644 index 000000000..570323a50 --- /dev/null +++ b/.github/workflows/interactive-debugging.yml @@ -0,0 +1,317 @@ +# docs: https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions + +name: Interactive debugging + +on: + push: + branches: ["main", "dev-goog", "dev-msft", "dev-public"] + pull_request: + + workflow_dispatch: + +jobs: + build_verilator: + name: + runs-on: ubuntu-22.04 + + env: + CARGO_INCREMENTAL: 0 + SCCACHE_VERSION: 0.3.3 + # TODO: To update to 5.006, clean up lint errors + VERILATOR_VERSION: v5.012 + SCCACHE_GHA_CACHE_TO: sccache-verilator-10000 + SCCACHE_GHA_CACHE_FROM: sccache-verilator- + # Change this to a new random value if you suspect the cache is corrupted + SCCACHE_C_CUSTOM_CACHE_BUSTER: f3e6951f0c1d + + steps: + - name: Restore sccache binary + uses: actions/cache/restore@v3 + id: sccache_bin_restore + with: + path: ~/.cargo/bin/sccache + key: sccache-bin-${{ env.SCCACHE_VERSION }}-${{ env.SCCACHE_C_CUSTOM_CACHE_BUSTER }} + + - name: Install sccache + if: steps.sccache_bin_restore.outputs.cache-hit != 'true' + run: | + cargo install sccache --version ${SCCACHE_VERSION} --no-default-features --features=gha + + - name: Save sccache binary + uses: actions/cache/save@v3 + if: steps.sccache_bin_restore.outputs.cache-hit != 'true' + with: + path: ~/.cargo/bin/sccache + key: sccache-bin-${{ env.SCCACHE_VERSION }}-${{ env.SCCACHE_C_CUSTOM_CACHE_BUSTER }} + + - name: Configure sccache + uses: actions/github-script@v6 + with: + script: | + core.exportVariable('ACTIONS_CACHE_URL', process.env.ACTIONS_CACHE_URL || ''); + core.exportVariable('ACTIONS_RUNTIME_TOKEN', process.env.ACTIONS_RUNTIME_TOKEN || ''); + + - name: Restore verilator dir + uses: actions/cache/restore@v3 + id: verilator_restore + with: + path: /opt/verilator + key: verilator-${{ env.VERILATOR_VERSION }}-${{ env.SCCACHE_C_CUSTOM_CACHE_BUSTER }} + + - name: Install verilator + if: steps.verilator_restore.outputs.cache-hit != 'true' + run: | + sudo apt-get install flex bison libfl2 libfl-dev help2man + cd /tmp/ + git clone -b "${VERILATOR_VERSION}" https://github.com/verilator/verilator + cd verilator + autoconf + ./configure --prefix=/opt/verilator CC="sccache gcc" CXX="sccache g++" + make -j6 + sudo make install + + - name: Save verilator dir + uses: actions/cache/save@v3 + if: steps.verilator_restore.outputs.cache-hit != 'true' + with: + path: /opt/verilator + key: verilator-${{ env.VERILATOR_VERSION }}-${{ env.SCCACHE_C_CUSTOM_CACHE_BUSTER }} + + - name: Pack Verilator + run: | + cd /opt && tar -czvf verilator.tar.gz verilator/ + + - name: Store Verilator binaries + uses: actions/upload-artifact@v3 + with: + name: verilator + path: /opt/*.tar.gz + retention-days: 1 + + build_openocd: + name: + runs-on: ubuntu-22.04 + + env: + CARGO_INCREMENTAL: 0 + SCCACHE_VERSION: 0.3.3 + # A custom fork is needed to allow bypassing core examination and accessing + # peripherals regardless of core state. + OPENOCD_REPO: https://github.com/antmicro/openocd + OPENOCD_VERSION: riscv-nohalt + SCCACHE_GHA_CACHE_TO: sccache-openocd-10000 + SCCACHE_GHA_CACHE_FROM: sccache-openocd- + # Change this to a new random value if you suspect the cache is corrupted + SCCACHE_C_CUSTOM_CACHE_BUSTER: f3e6951f0c1e + + steps: + - name: Restore sccache binary + uses: actions/cache/restore@v3 + id: sccache_bin_restore + with: + path: ~/.cargo/bin/sccache + key: sccache-bin-${{ env.SCCACHE_VERSION }}-${{ env.SCCACHE_C_CUSTOM_CACHE_BUSTER }} + + - name: Install sccache + if: steps.sccache_bin_restore.outputs.cache-hit != 'true' + run: | + cargo install sccache --version ${SCCACHE_VERSION} --no-default-features --features=gha + + - name: Save sccache binary + uses: actions/cache/save@v3 + if: steps.sccache_bin_restore.outputs.cache-hit != 'true' + with: + path: ~/.cargo/bin/sccache + key: sccache-bin-${{ env.SCCACHE_VERSION }}-${{ env.SCCACHE_C_CUSTOM_CACHE_BUSTER }} + + - name: Configure sccache + uses: actions/github-script@v6 + with: + script: | + core.exportVariable('ACTIONS_CACHE_URL', process.env.ACTIONS_CACHE_URL || ''); + core.exportVariable('ACTIONS_RUNTIME_TOKEN', process.env.ACTIONS_RUNTIME_TOKEN || ''); + + - name: Restore OpenOCD dir + uses: actions/cache/restore@v3 + id: openocd_restore + with: + path: /opt/openocd + key: openocd-${{ env.OPENOCD_VERSION }}-${{ env.SCCACHE_C_CUSTOM_CACHE_BUSTER }} + + - name: Install OpenOCD + if: steps.openocd_restore.outputs.cache-hit != 'true' + run: | + sudo apt-get install make libtool pkg-config autoconf automake texinfo + cd /tmp/ + git clone -b "${OPENOCD_VERSION}" https://github.com/antmicro/openocd + cd openocd + ./bootstrap + ./configure --prefix=/opt/openocd --enable-remote-bitbang \ + CC="sccache gcc" CXX="sccache g++" \ + CFLAGS="-Wno-error=misleading-indentation -Wno-error=stringop-overflow" + make -j6 + sudo make install + + - name: Save OpenOCD dir + uses: actions/cache/save@v3 + if: steps.openocd_restore.outputs.cache-hit != 'true' + with: + path: /opt/openocd + key: openocd-${{ env.OPENOCD_VERSION }}-${{ env.SCCACHE_C_CUSTOM_CACHE_BUSTER }} + + - name: Pack OpenOCD + run: | + cd /opt && tar -czvf openocd.tar.gz openocd/ + + - name: Store OpenOCD binaries + uses: actions/upload-artifact@v3 + with: + name: openocd + path: /opt/*.tar.gz + retention-days: 1 + + gdb_tests: + name: Run GDB debugging tests + runs-on: ubuntu-22.04 + needs: [build_verilator, build_openocd] + + env: + CARGO_INCREMENTAL: 0 + PKG_CONFIG_PATH: /opt/verilator/share/pkgconfig + DEBIAN_FRONTEND: "noninteractive" + + steps: + + - name: Install Risc V Toolchain + run: | + # Building from source takes around 6.65 GB of disk and download size + wget -O toolchain.tar.gz https://github.com/stnolting/riscv-gcc-prebuilt/releases/download/rv64imc-3.0.0/riscv64-unknown-elf.gcc-12.1.0.tar.gz + mkdir /opt/riscv + tar -xzf toolchain.tar.gz -C /opt/riscv/ + + - name: Install dependencies + run: | + # For some reason GDB requires libpython3.8.so + sudo add-apt-repository ppa:deadsnakes/ppa -y + sudo apt update -qy && sudo apt install -qy --no-install-recommends \ + libpython3.8 + + - name: Download Verilator binaries + uses: actions/download-artifact@v3 + with: + name: verilator + path: /opt + + - name: Download OpenOCD binaries + uses: actions/download-artifact@v3 + with: + name: openocd + path: /opt + + - name: Unpack binaries + run: | + pushd /opt + tar -zxvf verilator.tar.gz + tar -zxvf openocd.tar.gz + popd + + - name: Setup path + run: | + echo /opt/riscv/bin:/opt/verilator/bin:/opt/openocd/bin >> $GITHUB_PATH + + - name: Clone repository + uses: actions/checkout@v3 + with: + submodules: 'true' + + - name: Build Verilated simulation + run: | + export CALIPTRA_ROOT=$(pwd) + mkdir run + make -C run -f ${CALIPTRA_ROOT}/tools/scripts/Makefile verilator-build TESTNAME=infinite_loop DEBUG_UNLOCKED=1 \ + OBJCACHE="" CC=gcc CXX=g++ LINK=g++ + make -C run -f ${CALIPTRA_ROOT}/tools/scripts/Makefile program.hex TESTNAME=infinite_loop + + - name: Test core register access + run: | + export CALIPTRA_ROOT=$(pwd) + cd run + ${CALIPTRA_ROOT}/.github/scripts/gdb_test.sh \ + /bin/bash -c 'cd ${CALIPTRA_ROOT}/src/integration/test_suites/infinite_loop && ./dump_and_compare.sh' + + - name: Test memory access + run: | + export CALIPTRA_ROOT=$(pwd) + cd run + ${CALIPTRA_ROOT}/.github/scripts/gdb_test.sh \ + /bin/bash -c 'cd ${CALIPTRA_ROOT}/src/integration/test_suites/infinite_loop && ./mem_access.sh' + + - name: Test peripheral access + run: | + export CALIPTRA_ROOT=$(pwd) + cd run + ${CALIPTRA_ROOT}/.github/scripts/gdb_test.sh \ + /bin/bash -c 'cd ${CALIPTRA_ROOT}/src/integration/test_suites/infinite_loop && ./peripheral_access.sh' + + openocd_tests: + name: Run OpenOCD debugging tests + runs-on: ubuntu-22.04 + needs: [build_verilator, build_openocd] + + env: + CARGO_INCREMENTAL: 0 + PKG_CONFIG_PATH: /opt/verilator/share/pkgconfig + DEBIAN_FRONTEND: "noninteractive" + + steps: + + - name: Install Risc V Toolchain + run: | + # Building from source takes around 6.65 GB of disk and download size + wget -O toolchain.tar.gz https://github.com/stnolting/riscv-gcc-prebuilt/releases/download/rv64imc-3.0.0/riscv64-unknown-elf.gcc-12.1.0.tar.gz + mkdir /opt/riscv + tar -xzf toolchain.tar.gz -C /opt/riscv/ + + - name: Download Verilator binaries + uses: actions/download-artifact@v3 + with: + name: verilator + path: /opt + + - name: Download OpenOCD binaries + uses: actions/download-artifact@v3 + with: + name: openocd + path: /opt + + - name: Unpack binaries + run: | + pushd /opt + tar -zxvf verilator.tar.gz + tar -zxvf openocd.tar.gz + popd + + - name: Setup path + run: | + echo /opt/riscv/bin:/opt/verilator/bin:/opt/openocd/bin >> $GITHUB_PATH + + - name: Clone repository + uses: actions/checkout@v3 + with: + submodules: 'true' + + - name: Build Verilated simulation + run: | + export CALIPTRA_ROOT=$(pwd) + mkdir run + make -C run -f ${CALIPTRA_ROOT}/tools/scripts/Makefile verilator-build TESTNAME=infinite_loop DEBUG_UNLOCKED=1 FORCE_CPU_RESET=1 \ + OBJCACHE="" CC=gcc CXX=g++ LINK=g++ + make -C run -f ${CALIPTRA_ROOT}/tools/scripts/Makefile program.hex TESTNAME=infinite_loop + + - name: Test peripheral access with core in reset + run: | + export CALIPTRA_ROOT=$(pwd) + cd run + ${CALIPTRA_ROOT}/.github/scripts/openocd_test.sh \ + -f board/caliptra-verilator-rst.cfg \ + -f ${CALIPTRA_ROOT}/src/integration/test_suites/infinite_loop/peripheral_access.tcl diff --git a/README.md b/README.md index 09599077e..7070e2e35 100644 --- a/README.md +++ b/README.md @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and
limitations under the License.*_
# **Caliptra Hands-On Guide** # -_*Last Update: 2023/05/09*_ +_*Last Update: 2023/09/06*_ ## **Tools Used** ## @@ -32,7 +32,7 @@ Simulation: - Synopsys VCS with Verdi - `Version R-2020.12-SP2-7_Full64` - Verilator - - `Version 4.228` + - `Version 5.012` - Mentor Graphics QVIP - `Version 2021.2.1` of AHB/APB models - UVM installation @@ -44,13 +44,28 @@ Synthesis: GCC: - RISCV Toolchain for generating memory initialization files - - `riscv64-unknown-elf-gcc-8.2.0-2019.02.0-x86_64-linux-centos6` - - G++ Used to compile Verilator objects - - `g++ (GCC) 8.2.0` + - `Version 2023.04.29` + - `riscv64-unknown-elf-gcc (g) 12.2.0` + - G++ Used to compile Verilator objects and test firmware + - `g++ (GCC) 11.2.0` Other: - Playbook (Microsoft Internal workflow management tool) +### **RISCV Toolchain installation** ### +Note that there is significant configurability when installing the RISCV toolchain. +These instructions may be used to create a RISCV installation that will be compatible +with the provided Makefile for compiling test C programs. + +1. Install from this repository: + - https://github.com/riscv-collab/riscv-gnu-toolchain + - Follow the included README in that repository for installation instructions +2. The most recently tested toolchain build that was confirmed to work was 2023-04-29 + - https://github.com/riscv-collab/riscv-gnu-toolchain/releases/tag/2023.04.29 +3. A compatible tool installation requires newlib cross-compiler, multilib support, and the zicsr/zifencei extensions. Use this configure command: + - `./configure --enable-multilib --prefix=/path/to/tools/riscv-gnu/2023.04.29 --with-multilib-generator="rv32imc-ilp32--a*zicsr*zifencei"` +4. Use `make` instead of `make linux` to install the tool (using newlib option) + ## **ENVIRONMENT VARIABLES** ## Required for simulation:
`CALIPTRA_WORKSPACE`: Defines the absolute path to the directory where the Verilator "scratch" output directory will be created. Recommended to define as the absolute path to the directory that contains the Project repository root (called "Caliptra" or "caliptra-rtl")
@@ -64,14 +79,16 @@ Required for Firmware (i.e. Test suites) makefile:
Caliptra |-- LICENSE |-- README.md -|-- Release_notes.txt +|-- Release_Notes.md |-- docs | |-- Caliptra_Integration_Specification.pdf -| |-- Caliptra_Hardware_Spec.pdf -| |-- Caliptra_TestPlan_L1.pdf +| |-- Caliptra_Hardware_Specification.pdf +| `-- Caliptra_TestPlan.xlsx |-- src | |-- aes | |-- ahb_lite_bus +| |-- caliptra_prim +| |-- caliptra_prim_generic | |-- csrng | |-- datavault | |-- doe @@ -86,19 +103,17 @@ Caliptra | |-- lc_ctrl | |-- libs | |-- pcrvault -| |-- prim -| |-- prim_generic | |-- riscv_core | |-- sha256 | |-- sha512 | |-- sha512_masked | |-- soc_ifc | |-- spi_host -| |-- uart +| `-- uart `-- tools - |-- config |-- README - `-- scripts + |-- scripts + `-- templates ``` The root of the repository is structured as shown above, to a depth of 2 layers.
Each sub-component is accompanied by a file list summary (located in src//config/.vf) that comprises all the filenames required to compile the component, and an optional testbench filelist for unit-level simulation.
@@ -119,38 +134,41 @@ The "Integration" sub-component contains the top-level fileset for Caliptra. `sr `run_verilator_l0_regression.py`: Wrapper to run the L0 smoke test regression suite using the Makefile flow in Verilator
`integration_vector_gen.py`: Generates test vectors for crypto core tests
`veer_build_command.sh`: Shell script used to generate the VeeR-EL2 repository present in `src/riscv_core/veer_el2`
+`openocd`: Open-Source FW debug utility used for JTAG testing in automated workflows ## **Simulation Flow** ## ### VCS Steps: ### 1. Setup tools, add to PATH (ensure riscv64-unknown-elf-gcc is also available) -1. Define all environment variables above +2. Define all environment variables above - For the initial test run after downloading repository, `iccm_lock` is recommended for TESTNAME -1. Create a run folder for build outputs (and cd to it) -1. Invoke `${CALIPTRA_ROOT}/tools/scripts/Makefile` with target 'program.hex' to produce SRAM initialization files from the firmware found in `src/integration/test_suites/${TESTNAME}` +3. Create a run folder for build outputs (and cd to it) +4. [OPTIONAL] By default, this run flow will use the riscv64 toolchain to compile test firmware (according to TESTNAME) into program.hex, iccm.hex, dccm.hex, and mailbox.hex. As a first pass, integrators may alternatively use the pre-built hexfiles for convenience (available for `iccm_lock` test). To do this, copy `iccm_lock.hex` to the run directory and rename to `program.hex`. `dccm.hex` should also be copied to the run directory, as-is. Use `touch iccm.hex mailbox.hex` to create empty hex files, as these are unnecessary for `iccm_lock` test. +5. Invoke `${CALIPTRA_ROOT}/tools/scripts/Makefile` with target 'program.hex' to produce SRAM initialization files from the firmware found in `src/integration/test_suites/${TESTNAME}` - E.g.: `make -f ${CALIPTRA_ROOT}/tools/scripts/Makefile program.hex` -1. Compile complete project using `src/integration/config/caliptra_top_tb.vf` as a compilation target in VCS. When running the `vcs` command to generate simv, users should ensure that `caliptra_top_tb` is explicitly specified as the top-level component in their command to ensure this is the sole "top" that gets simulated. -1. Simulate project with `caliptra_top_tb` as the top target +6. Compile complete project using `src/integration/config/caliptra_top_tb.vf` as a compilation target in VCS. When running the `vcs` command to generate simv, users should ensure that `caliptra_top_tb` is explicitly specified as the top-level component in their command to ensure this is the sole "top" that gets simulated. +7. Simulate project with `caliptra_top_tb` as the top target ### Verilator Steps: ### 1. Setup tools, add to PATH (ensure Verilator, GCC, and riscv64-unknown-elf-gcc are available) -1. Define all environment variables above +2. Define all environment variables above - For the initial test run after downloading repository, `iccm_lock` is recommended for TESTNAME -1. Create a run folder for build outputs +3. Create a run folder for build outputs - Recommended to place run folder under `${CALIPTRA_WORKSPACE}/scratch/$USER/verilator/` -1. Run Caliptra/tools/scripts/Makefile, which provides steps to run a top-level simulation in Verilator +4. [OPTIONAL] By default, this run flow will use the riscv64 toolchain to compile test firmware (according to TESTNAME) into program.hex, iccm.hex, dccm.hex, and mailbox.hex. As a first pass, integrators may alternatively use the pre-built hexfiles for convenience (available for `iccm_lock` test). To do this, copy `iccm_lock.hex` to the run directory and rename to `program.hex`. `dccm.hex` should also be copied to the run directory, as-is. Use `touch iccm.hex mailbox.hex` to create empty hex files, as these are unnecessary for `iccm_lock` test. +5. Run Caliptra/tools/scripts/Makefile, which provides steps to run a top-level simulation in Verilator - Example command: `make -C -f ${CALIPTRA_ROOT}/tools/scripts/Makefile TESTNAME=${TESTNAME} debug=1 verilator` - NOTE: `debug=1` is optional; if provided, the verilator run will produce a .vcd file with waveform information - NOTE: `TESTNAME=${TESTNAME}` is optional; if not provided, test defaults to value of TESTNAME environment variable, then to `iccm_lock` - NOTE: Users may wish to produce a run log by piping the make command to a tee command, e.g.: `make ... ... | tee /verilate.log` -1. Users have the option to run the entire suite of smoke tests using the provided python script `run_verilator_l0_regression.py` +6. Users have the option to run the entire suite of smoke tests using the provided python script `run_verilator_l0_regression.py` 1. Ensure Python 3.9.2 is available by adding to the $PATH variable - 1. Run the script with: + 2. Run the script with: `python3 run_verilator_l0_regression.py` - 1. NOTE: The script automatically creates run output folders at `${CALIPTRA_WORKSPACE}/scratch/$USER/verilator//` for each test run - 1. NOTE: The output folder is populated with a run log that reports the run results and pass/fail status + 3. NOTE: The script automatically creates run output folders at `${CALIPTRA_WORKSPACE}/scratch/$USER/verilator//` for each test run + 4. NOTE: The output folder is populated with a run log that reports the run results and pass/fail status ### UVM Testbench Steps for `caliptra_top`:
@@ -163,16 +181,18 @@ The UVM Framework generation tool was used to create the baseline UVM testbench Steps:
1. Compile UVM 1.1d library -1. Compile the AHB/APB QVIP source -1. Compile the UVMF wrapper for APB/AHB in Caliptra/src/libs/uvmf -1. Compile the `verification_ip` provided for `soc_ifc` found in `Caliptra/src/soc_ifc/uvmf_soc_ifc` -1. Compile the `caliptra_top` testbench found in `Caliptra/src/integration/uvmf_caliptra_top` -1. `Caliptra/src/integration/uvmf_caliptra_top/uvmf_template_output/project_benches/caliptra_top/tb/testbench/hdl_top.sv` is the top-level TB wrapper for the system -1. Select a test to run from the set of tests in `Caliptra/src/integration/uvmf_caliptra_top/uvmf_template_output/project_benches/caliptra_top/tb/tests/src` -1. Provide `+UVM_TESTNAME=` argument to simulation +2. Compile the AHB/APB QVIP source +3. Compile the UVMF wrapper for APB/AHB in Caliptra/src/libs/uvmf +4. Compile the `verification_ip` provided for `soc_ifc` found in `Caliptra/src/soc_ifc/uvmf_soc_ifc` +5. Compile the `caliptra_top` testbench found in `Caliptra/src/integration/uvmf_caliptra_top` +6. `Caliptra/src/integration/uvmf_caliptra_top/uvmf_template_output/project_benches/caliptra_top/tb/testbench/hdl_top.sv` is the top-level TB wrapper for the system +7. Select a test to run from the set of tests in `Caliptra/src/integration/uvmf_caliptra_top/uvmf_template_output/project_benches/caliptra_top/tb/tests/src` +8. Provide `+UVM_TESTNAME=` argument to simulation + +## **Regression Tests** ## +Only tests from the L0 Regression List should be run. ## **NOTES** ## -* The internal registers are auto rendered at the [GitHub - page](https://chipsalliance.github.io/caliptra-rtl/main/internal-regs) +* The internal registers are auto rendered at the [GitHub page](https://chipsalliance.github.io/caliptra-rtl/main/internal-regs) * So are the [external registers](https://chipsalliance.github.io/caliptra-rtl/main/external-regs) diff --git a/Release_Notes.md b/Release_Notes.md index e0986bb3b..3dc7c388d 100644 --- a/Release_Notes.md +++ b/Release_Notes.md @@ -14,13 +14,113 @@ See the License for the specific language governing permissions and
limitations under the License.*_
# **Release Notes** # -_*Last Update: 2023/05/09*_ +_*Last Update: 2023/09/13*_ -## Rev 0p8 ## +## Rev 1p0 ## -### DISCALIMER: This is NOT A BUG-FREE MODEL YET. This is a 0p8 release model. Please see testplan document in docs folder to know the status of validation. ### -#### This model is released mainly for interface, floorplan planning purposes for consumers. #### -#### Rev 0p8 release date: 03-31-2023 #### +### Rev 1p0 release date: (pending ROM release for official declaration) ### +- Caliptra IP Specification: see docs/ folder +- Caliptra Integration Specification: see docs/ folder +- Caliptra testplan: see docs/ folder +- Data Vault +- RISC-V Timers + - mtime + mtimecmp implementation + - Watchdog timer configuration by SOC; escalate interrupts to error +- Reliability, Availability, Serviceability Features + - Connectivity for cptra_error_fatal/cptra_error_non_fatal interrupts + - Mailbox protocol violation detection and Error state + - SRAM ECC error detection and reporting for ICCM, DCCM, Mailbox + - Key clearing and system reset on fatal errors +- SOC Interface + - QSPI inout changed to input+output+enable + - FUSE PAUSER config registers and enforcement +- Reset Domain Crossing (RDC) fixes + - Reset-triggered clock gating on cross-domain registers + - Reset timing changes for noncore reset assertion + - Migrate most internal logic to the noncore reset domain + - Migrate APB interface to noncore reset domain +- FIPS compliance updates + - SHA Accelerator LOCK default to Caliptra-owned + - LMS Fuse + - SOC Stepping ID field in HW Revision + - Extended pcr_nonce from 32-bit to 256-bit + - TRNG Data Clear +- RISC-V Core + - Increase ROM size to 48KiB + - Added 2:1 AHB lite mux on LSU and SB buses to allow debug access to + peripherals +- Timing Optimizations + - Remove PSEL loopback path in APB slave + - Remove unnecessary Mailbox SRAM ECC writeback path +- Validation enhancements + - SOC_IFC/Mailbox randomized regressions via UVM testbench + - SOC Interface Register validation via directed + random tests + - Coverage reporting and analysis for all interfaces, registers, FSM + - Automated GitHub action using OpenOCD for interactive JTAG debugging + - SHA Formal Verification + +### Bug Fixes ### +[CLK GATING] Fatal error should wake up clks
+[CLK GATING] JTAG accesses need to wake up clocks
+[DOE] add zeroize to clear all internal regs
+[DOE] DOE IV reg needs hwclr input
+[DOE] doe_fsm incr_dest_sel logic can be removed since FE now only takes up 12 dwords
+[DOE] doe_fsm write_offset increments to 0xC
+[DOE] Simplify kv_write dest_valid hardcoded value in doe_fsm
+[ECC] ECC input register bound check
+[ECC] ECC output register bound check
+[ECC] ECC Public key validation check
+[ECC] mismatch of final reduction in Mont. mult in the case of prime<= p_internal
+[ECC] mismatch of modular addition result in the case of p<= a+b < 2^384
+[ECC] remove FW read access to kv/privkey reg
+[ECC} error trigger when pcr_sign ctrl input is set in keygen/verifying mode
+[KV] Debug Mode and Scan Mode switch doesn't flush locked registers
+[KV] Debug mode should flush KV even if core is asleep
+[KV] Dest_valid and last_dword should check lock_use to clear along with lock_wr
+[KV] KV may still contain secrets during scan mode
+[KV] kv_reg.rdl still has 6 bits for dest_valid while we have 5 valid clients
+[KV] KV->SHA ->FW read path and KV->HMAC->FW read path should NOT exist in the design
+[KV] last dword of secret values stays in KV/crypto interface
+[KV] Suppress writes to an entry altogether when it's being cleared
+[MBOX] ECC error decode may detect error on mbox_sram when a write is in progress
+[MBOX] First resp read data is zero after handling a command with DLEN > MBOX SIZE
+[MBOX] HWCLR triggered by force-unlock has lower precedence than SW writes
+[MBOX] Mailbox data length limiting reads is calculated incorrectly
+[MBOX] Mailbox does not flag protocol error for attempted writes to DLEN
+[MBOX] mailbox returns non-zero data in an overread case
+[MBOX] New RAS feature to detect protocol violation incorrectly decodes certain reg accesses as errors
+[MBOX] SOC can read mbox_dataout with stale data
+[MBOX] Writes beyond the mailbox size overwrite the last data dword in mailbox memory
+[MBOX] Writes to (a) unaligned addresses (b) size < AHB_DATA_WIDTH may corrupt memory
+[MBOX] error_cmd_fail_sts.hwset is continuously set when mailbox protocol error occurs
+[PCR] Extend PCR Nonce from 32-bit to 256-bit to protect replay attack
+[PCR] PCR dword mismatch
+[PCR] Update the reset of the 'lock' PCR control to the core reset domain (so that a FW update reset or warm reset can also unlock the PCR)
+[PCR] zeroize doesn't take effect if is set with pcr at the same cycle
+[SHA ACCEL] SoC requester can use mailbox mode
+[SOC_IFC] Arbiter lets direct request dv through at the same time as soc ifc mailbox request causing deadlock
+[SOC_IFC] Breakpoint is unreachable
+[SOC_IFC] Fuse Registers can never be written using non-default values programmed in FUSE_VALID_PAUSER
+[SOC_IFC] Generic Input Wires toggle (any bit) should trigger notification interrupt to uC
+[SOC_IFC] INTERNAL_HW_ERROR_FATAL_MASK and INTERNAL_HW_ERROR_NON_FATAL_MASK allow writes to (and non-zero reads from) reserved fields.
+[SOC_IFC] Mailbox ECC errors detected during SHA Accel direct accesses are not detected/corrected
+[SOC_IFC] mbox_execute can be cleared by SOC at any point after acquiring lock
+[SOC_IFC] uC can't write to CPTRA_FW_ERROR regs (Github issue #64)
+[SOC_IFC] WDT may not correctly detect when uC services the timer expiration interrupt
+[WDT] CPTRA_WDT_STATUS reg should be FW writeable so it can clear the flags
+[WDT] First stage interrupt output should be "error_intr" instead of "notif_intr"
+[WDT] WDT registers need to be on ungated clk
+[AHB] AHB 2:1 Mux hangs with back to back transactions after a stall
+[RST] scan_mode should not corrupt resets
+[TOP] EL2 Mem interface is not instantiated with a modport at all levels + +## Previous Releases ## + +### Rev 0p8 ### + +#### DISCALIMER: This is NOT A BUG-FREE MODEL YET. This is a 0p8 release model. Please see testplan document in docs folder to know the status of validation. #### +##### This model is released mainly for interface, floorplan planning purposes for consumers. ##### +##### Rev 0p8 release date: 03-31-2023 ##### - Caliptra IP Specification: see docs/ folder - Caliptra Integration Specification: see docs/ folder @@ -59,13 +159,6 @@ _*Last Update: 2023/05/09*_ - UVMF for multiple DUT blocks and SOC interface - DV complete for first cut of the boot & reset flows, Fuses, SOC registers, Crypto blocks, Key vault, PCR Vault, PCR extend, PCR signing, Mailbox -## Pending for RTL 1p0: ## -- Timers, integrated-TRNG integration w/ Caliptra, Error domain logic -- Lots of bug fixes :-) -- Data Vault, TRNG REQ protocol, SHA384 acceleration, More mailbox val, PCR val, cross product flows - -## Previous Releases ## - ### Rev Pre0p8: ### #### DISCLAIMER: This is NOT A BUG-FREE MODEL. This is a pre-0p8 development model that will be sync’d every week. #### #### This model is released mainly for interface, floorplan planning purposes for consumers. #### diff --git a/docs/Caliptra_Hardware_Specification.pdf b/docs/Caliptra_Hardware_Specification.pdf index 6896ae8e2..68f46575c 100755 Binary files a/docs/Caliptra_Hardware_Specification.pdf and b/docs/Caliptra_Hardware_Specification.pdf differ diff --git a/docs/Caliptra_Integration_Specification.pdf b/docs/Caliptra_Integration_Specification.pdf index 2d8aed469..0cc3f9ebe 100755 Binary files a/docs/Caliptra_Integration_Specification.pdf and b/docs/Caliptra_Integration_Specification.pdf differ diff --git a/docs/Caliptra_TestPlan.pdf b/docs/Caliptra_TestPlan.pdf deleted file mode 100755 index 30d1afd45..000000000 Binary files a/docs/Caliptra_TestPlan.pdf and /dev/null differ diff --git a/docs/Caliptra_TestPlan.xlsx b/docs/Caliptra_TestPlan.xlsx new file mode 100755 index 000000000..f93fe7421 Binary files /dev/null and b/docs/Caliptra_TestPlan.xlsx differ diff --git a/src/aes/config/aes.vf b/src/aes/config/aes.vf index 2c5c07735..9592049a5 100644 --- a/src/aes/config/aes.vf +++ b/src/aes/config/aes.vf @@ -1,10 +1,15 @@ ++incdir+${CALIPTRA_ROOT}/src/entropy_src/rtl +incdir+${CALIPTRA_ROOT}/src/integration/rtl +incdir+${CALIPTRA_ROOT}/src/libs/rtl -+incdir+${CALIPTRA_ROOT}/src/prim/rtl ++incdir+${CALIPTRA_ROOT}/src/caliptra_prim/rtl +incdir+${CALIPTRA_ROOT}/src/lc_ctrl/rtl +incdir+${CALIPTRA_ROOT}/src/edn/rtl ++incdir+${CALIPTRA_ROOT}/src/caliptra_prim_generic/rtl +incdir+${CALIPTRA_ROOT}/src/aes/rtl -+incdir+${CALIPTRA_ROOT}/src/prim_generic/rtl +${CALIPTRA_ROOT}/src/entropy_src/rtl/entropy_src_main_sm_pkg.sv +${CALIPTRA_ROOT}/src/entropy_src/rtl/entropy_src_ack_sm_pkg.sv +${CALIPTRA_ROOT}/src/entropy_src/rtl/entropy_src_reg_pkg.sv +${CALIPTRA_ROOT}/src/entropy_src/rtl/entropy_src_pkg.sv ${CALIPTRA_ROOT}/src/integration/rtl/config_defines.svh ${CALIPTRA_ROOT}/src/integration/rtl/caliptra_reg_defines.svh ${CALIPTRA_ROOT}/src/libs/rtl/caliptra_sva.svh @@ -16,51 +21,56 @@ ${CALIPTRA_ROOT}/src/libs/rtl/apb_slv_sif.sv ${CALIPTRA_ROOT}/src/libs/rtl/ahb_slv_sif.sv ${CALIPTRA_ROOT}/src/libs/rtl/caliptra_icg.sv ${CALIPTRA_ROOT}/src/libs/rtl/clk_gate.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_util_pkg.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_alert_pkg.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_subreg_pkg.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_mubi_pkg.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_cipher_pkg.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_pkg.sv +${CALIPTRA_ROOT}/src/libs/rtl/caliptra_2ff_sync.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_util_pkg.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_alert_pkg.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_subreg_pkg.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_mubi_pkg.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_cipher_pkg.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_pkg.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_sparse_fsm_pkg.sv ${CALIPTRA_ROOT}/src/lc_ctrl/rtl/lc_ctrl_reg_pkg.sv ${CALIPTRA_ROOT}/src/lc_ctrl/rtl/lc_ctrl_state_pkg.sv ${CALIPTRA_ROOT}/src/lc_ctrl/rtl/lc_ctrl_pkg.sv ${CALIPTRA_ROOT}/src/edn/rtl/edn_pkg.sv +${CALIPTRA_ROOT}/src/libs/rtl/ahb_to_reg_adapter.sv +${CALIPTRA_ROOT}/src/caliptra_prim_generic/rtl/caliptra_prim_generic_flop_en.sv +${CALIPTRA_ROOT}/src/caliptra_prim_generic/rtl/caliptra_prim_generic_flop.sv +${CALIPTRA_ROOT}/src/caliptra_prim_generic/rtl/caliptra_prim_generic_buf.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_flop_en.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_cdc_rand_delay.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_flop_2sync.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_lfsr.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_mubi4_sync.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_diff_decode.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_sec_anchor_buf.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_slicer.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_count.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_sparse_fsm_flop.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_dom_and_2share.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_sec_anchor_flop.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_reg_we_check.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_packer_fifo.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_max_tree.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_subreg_arb.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_subreg.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_intr_hw.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_onehot_check.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_mubi8_sync.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_fifo_sync_cnt.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_buf.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_lc_sync.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_alert_receiver.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_flop.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_alert_sender.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_fifo_sync.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_arbiter_ppc.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_sum_tree.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_subreg_ext.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_edge_detector.sv ${CALIPTRA_ROOT}/src/aes/rtl/aes_reg_pkg.sv ${CALIPTRA_ROOT}/src/aes/rtl/aes_pkg.sv ${CALIPTRA_ROOT}/src/aes/rtl/aes_sbox_canright_pkg.sv -${CALIPTRA_ROOT}/src/libs/rtl/ahb_to_reg_adapter.sv -${CALIPTRA_ROOT}/src/prim_generic/rtl/prim_generic_flop.sv -${CALIPTRA_ROOT}/src/prim_generic/rtl/prim_generic_buf.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_flop_2sync.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_lfsr.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_mubi4_sync.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_diff_decode.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_sec_anchor_buf.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_slicer.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_count.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_sparse_fsm_flop.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_dom_and_2share.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_sec_anchor_flop.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_reg_we_check.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_packer_fifo.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_max_tree.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_subreg_arb.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_subreg.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_intr_hw.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_onehot_check.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_mubi8_sync.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_fifo_sync_cnt.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_buf.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_lc_sync.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_alert_receiver.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_flop.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_alert_sender.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_fifo_sync.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_arbiter_ppc.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_sum_tree.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_subreg_ext.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_edge_detector.sv ${CALIPTRA_ROOT}/src/aes/rtl/aes_sbox_canright.sv ${CALIPTRA_ROOT}/src/aes/rtl/aes_sbox_canright_masked.sv ${CALIPTRA_ROOT}/src/aes/rtl/aes_cipher_core.sv @@ -78,4 +88,4 @@ ${CALIPTRA_ROOT}/src/aes/rtl/aes_shift_rows.sv ${CALIPTRA_ROOT}/src/aes/rtl/aes_mix_single_column.sv ${CALIPTRA_ROOT}/src/aes/rtl/aes_cipher_control.sv ${CALIPTRA_ROOT}/src/aes/rtl/aes_prng_masking.sv -${CALIPTRA_ROOT}/src/aes/rtl/aes_key_expand.sv \ No newline at end of file +${CALIPTRA_ROOT}/src/aes/rtl/aes_key_expand.sv diff --git a/src/aes/config/aes_pkg.vf b/src/aes/config/aes_pkg.vf index 75b3506c8..5c75eb1af 100644 --- a/src/aes/config/aes_pkg.vf +++ b/src/aes/config/aes_pkg.vf @@ -1,6 +1,73 @@ ++incdir+${CALIPTRA_ROOT}/src/entropy_src/rtl ++incdir+${CALIPTRA_ROOT}/src/integration/rtl ++incdir+${CALIPTRA_ROOT}/src/libs/rtl ++incdir+${CALIPTRA_ROOT}/src/caliptra_prim/rtl ++incdir+${CALIPTRA_ROOT}/src/lc_ctrl/rtl +incdir+${CALIPTRA_ROOT}/src/edn/rtl ++incdir+${CALIPTRA_ROOT}/src/caliptra_prim_generic/rtl +incdir+${CALIPTRA_ROOT}/src/aes/rtl +${CALIPTRA_ROOT}/src/entropy_src/rtl/entropy_src_main_sm_pkg.sv +${CALIPTRA_ROOT}/src/entropy_src/rtl/entropy_src_ack_sm_pkg.sv +${CALIPTRA_ROOT}/src/entropy_src/rtl/entropy_src_reg_pkg.sv +${CALIPTRA_ROOT}/src/entropy_src/rtl/entropy_src_pkg.sv +${CALIPTRA_ROOT}/src/integration/rtl/config_defines.svh +${CALIPTRA_ROOT}/src/integration/rtl/caliptra_reg_defines.svh +${CALIPTRA_ROOT}/src/libs/rtl/caliptra_sva.svh +${CALIPTRA_ROOT}/src/libs/rtl/caliptra_macros.svh +${CALIPTRA_ROOT}/src/libs/rtl/caliptra_sram.sv +${CALIPTRA_ROOT}/src/libs/rtl/ahb_defines_pkg.sv +${CALIPTRA_ROOT}/src/libs/rtl/caliptra_ahb_srom.sv +${CALIPTRA_ROOT}/src/libs/rtl/apb_slv_sif.sv +${CALIPTRA_ROOT}/src/libs/rtl/ahb_slv_sif.sv +${CALIPTRA_ROOT}/src/libs/rtl/caliptra_icg.sv +${CALIPTRA_ROOT}/src/libs/rtl/clk_gate.sv +${CALIPTRA_ROOT}/src/libs/rtl/caliptra_2ff_sync.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_util_pkg.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_alert_pkg.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_subreg_pkg.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_mubi_pkg.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_cipher_pkg.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_pkg.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_sparse_fsm_pkg.sv +${CALIPTRA_ROOT}/src/lc_ctrl/rtl/lc_ctrl_reg_pkg.sv +${CALIPTRA_ROOT}/src/lc_ctrl/rtl/lc_ctrl_state_pkg.sv +${CALIPTRA_ROOT}/src/lc_ctrl/rtl/lc_ctrl_pkg.sv ${CALIPTRA_ROOT}/src/edn/rtl/edn_pkg.sv +${CALIPTRA_ROOT}/src/libs/rtl/ahb_to_reg_adapter.sv +${CALIPTRA_ROOT}/src/caliptra_prim_generic/rtl/caliptra_prim_generic_flop_en.sv +${CALIPTRA_ROOT}/src/caliptra_prim_generic/rtl/caliptra_prim_generic_flop.sv +${CALIPTRA_ROOT}/src/caliptra_prim_generic/rtl/caliptra_prim_generic_buf.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_flop_en.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_cdc_rand_delay.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_flop_2sync.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_lfsr.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_mubi4_sync.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_diff_decode.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_sec_anchor_buf.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_slicer.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_count.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_sparse_fsm_flop.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_dom_and_2share.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_sec_anchor_flop.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_reg_we_check.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_packer_fifo.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_max_tree.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_subreg_arb.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_subreg.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_intr_hw.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_onehot_check.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_mubi8_sync.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_fifo_sync_cnt.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_buf.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_lc_sync.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_alert_receiver.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_flop.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_alert_sender.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_fifo_sync.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_arbiter_ppc.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_sum_tree.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_subreg_ext.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_edge_detector.sv ${CALIPTRA_ROOT}/src/aes/rtl/aes_reg_pkg.sv ${CALIPTRA_ROOT}/src/aes/rtl/aes_pkg.sv ${CALIPTRA_ROOT}/src/aes/rtl/aes_sbox_canright_pkg.sv \ No newline at end of file diff --git a/src/aes/config/compile.yml b/src/aes/config/compile.yml index b58d3118f..fc4379b07 100644 --- a/src/aes/config/compile.yml +++ b/src/aes/config/compile.yml @@ -3,6 +3,7 @@ provides: [aes_pkg] schema_version: 2.4.0 requires: - edn_pkg + - caliptra_prim targets: rtl: directories: [$COMPILE_ROOT/rtl] @@ -15,7 +16,6 @@ provides: [aes] schema_version: 2.4.0 requires: - aes_pkg - - prim targets: rtl: directories: [$COMPILE_ROOT/rtl] @@ -38,4 +38,4 @@ targets: - $COMPILE_ROOT/rtl/aes_cipher_control.sv - $COMPILE_ROOT/rtl/aes_prng_masking.sv - $COMPILE_ROOT/rtl/aes_key_expand.sv - tops: [aes_fixme] + tops: [aes_cipher_core] diff --git a/src/aes/rtl/aes_cipher_control.sv b/src/aes/rtl/aes_cipher_control.sv index 2e9745d18..ea0c65092 100644 --- a/src/aes/rtl/aes_cipher_control.sv +++ b/src/aes/rtl/aes_cipher_control.sv @@ -6,7 +6,7 @@ // // This module controls the AES cipher core including the key expand module. -`include "prim_assert.sv" +`include "caliptra_prim_assert.sv" module aes_cipher_control import aes_pkg::*; #( @@ -400,7 +400,7 @@ module aes_cipher_control import aes_pkg::*; // The following primitives are used to place a size-only constraint on the // flops in order to prevent optimizations on these status signals. logic [Sp2VWidth-1:0] crypt_q_raw; - prim_flop #( + caliptra_prim_flop #( .Width ( Sp2VWidth ), .ResetValue ( Sp2VWidth'(SP2V_LOW) ) ) u_crypt_regs ( @@ -411,7 +411,7 @@ module aes_cipher_control import aes_pkg::*; ); logic [Sp2VWidth-1:0] dec_key_gen_q_raw; - prim_flop #( + caliptra_prim_flop #( .Width ( Sp2VWidth ), .ResetValue ( Sp2VWidth'(SP2V_LOW) ) ) u_dec_key_gen_regs ( diff --git a/src/aes/rtl/aes_cipher_control_fsm.sv b/src/aes/rtl/aes_cipher_control_fsm.sv index 3bc037086..3d63128fa 100644 --- a/src/aes/rtl/aes_cipher_control_fsm.sv +++ b/src/aes/rtl/aes_cipher_control_fsm.sv @@ -6,7 +6,7 @@ // // This module contains the AES cipher core control FSM. -`include "prim_assert.sv" +`include "caliptra_prim_assert.sv" module aes_cipher_control_fsm import aes_pkg::*; #( @@ -445,7 +445,7 @@ module aes_cipher_control_fsm import aes_pkg::*; end // SEC_CM: CIPHER.FSM.SPARSE - `PRIM_FLOP_SPARSE_FSM(u_state_regs, aes_cipher_ctrl_ns, + `CALIPTRA_PRIM_FLOP_SPARSE_FSM(u_state_regs, aes_cipher_ctrl_ns, aes_cipher_ctrl_cs, aes_cipher_ctrl_e, CIPHER_CTRL_IDLE) always_ff @(posedge clk_i or negedge rst_ni) begin : reg_fsm diff --git a/src/aes/rtl/aes_cipher_control_fsm_n.sv b/src/aes/rtl/aes_cipher_control_fsm_n.sv index d862938dd..f56153b3b 100644 --- a/src/aes/rtl/aes_cipher_control_fsm_n.sv +++ b/src/aes/rtl/aes_cipher_control_fsm_n.sv @@ -8,7 +8,7 @@ // values of important control signals. This is achieved by: // - instantiating the regular AES cipher core control FSM operating on and producing the positive // values of these signals, and -// - inverting these signals between the regular FSM and the prim_buf synthesis barriers. +// - inverting these signals between the regular FSM and the caliptra_prim_buf synthesis barriers. // Synthesis tools will then push the inverters into the actual FSM. module aes_cipher_control_fsm_n import aes_pkg::*; @@ -142,9 +142,9 @@ module aes_cipher_control_fsm_n import aes_pkg::*; // This primitive is used to place a size-only constraint on the // buffers to act as a synthesis optimization barrier. - prim_buf #( + caliptra_prim_buf #( .Width(NumInBufBits) - ) u_prim_buf_in ( + ) u_caliptra_prim_buf_in ( .in_i(in), .out_o(in_buf) ); @@ -233,7 +233,7 @@ module aes_cipher_control_fsm_n import aes_pkg::*; // The regular FSM operates on and produces the positive values of important control signals. // Invert *_n input signals here to get the positive values for the regular FSM. To obtain the - // negated outputs, important output signals are inverted further below. Thanks to the prim_buf + // negated outputs, important output signals are inverted further below. Thanks to the caliptra_prim_buf // synthesis optimization barriers, tools will push the inverters into the regular FSM. aes_cipher_control_fsm #( .SecMasking ( SecMasking ), @@ -364,9 +364,9 @@ module aes_cipher_control_fsm_n import aes_pkg::*; // This primitive is used to place a size-only constraint on the // buffers to act as a synthesis optimization barrier. - prim_buf #( + caliptra_prim_buf #( .Width(NumOutBufBits) - ) u_prim_buf_out ( + ) u_caliptra_prim_buf_out ( .in_i(out), .out_o(out_buf) ); diff --git a/src/aes/rtl/aes_cipher_control_fsm_p.sv b/src/aes/rtl/aes_cipher_control_fsm_p.sv index ee823b3c1..749eaf2fc 100644 --- a/src/aes/rtl/aes_cipher_control_fsm_p.sv +++ b/src/aes/rtl/aes_cipher_control_fsm_p.sv @@ -138,9 +138,9 @@ module aes_cipher_control_fsm_p import aes_pkg::*; // This primitive is used to place a size-only constraint on the // buffers to act as a synthesis optimization barrier. - prim_buf #( + caliptra_prim_buf #( .Width(NumInBufBits) - ) u_prim_buf_in ( + ) u_caliptra_prim_buf_in ( .in_i(in), .out_o(in_buf) ); @@ -354,9 +354,9 @@ module aes_cipher_control_fsm_p import aes_pkg::*; // This primitive is used to place a size-only constraint on the // buffers to act as a synthesis optimization barrier. - prim_buf #( + caliptra_prim_buf #( .Width(NumOutBufBits) - ) u_prim_buf_out ( + ) u_caliptra_prim_buf_out ( .in_i(out), .out_o(out_buf) ); diff --git a/src/aes/rtl/aes_cipher_core.sv b/src/aes/rtl/aes_cipher_core.sv index cd8b7fc16..c6754c35a 100644 --- a/src/aes/rtl/aes_cipher_core.sv +++ b/src/aes/rtl/aes_cipher_core.sv @@ -90,7 +90,7 @@ // - KEY_SHARE0_6 32h'{ . . . . } // - KEY_SHARE0_7 32h'{ b31, b30, b29, b28 } . -`include "prim_assert.sv" +`include "caliptra_prim_assert.sv" module aes_cipher_core import aes_pkg::*; #( diff --git a/src/aes/rtl/aes_key_expand.sv b/src/aes/rtl/aes_key_expand.sv index a90ff804c..230536856 100644 --- a/src/aes/rtl/aes_key_expand.sv +++ b/src/aes/rtl/aes_key_expand.sv @@ -4,7 +4,7 @@ // // AES KeyExpand -`include "prim_assert.sv" +`include "caliptra_prim_assert.sv" module aes_key_expand import aes_pkg::*; #( diff --git a/src/aes/rtl/aes_pkg.sv b/src/aes/rtl/aes_pkg.sv index 6eeb549ae..170be20f2 100644 --- a/src/aes/rtl/aes_pkg.sv +++ b/src/aes/rtl/aes_pkg.sv @@ -17,7 +17,7 @@ parameter int unsigned NumSharesKey = 2; // Software updates IV in chunks of 32 bits, the counter updates 16 bits at a time. parameter int unsigned SliceSizeCtr = 16; parameter int unsigned NumSlicesCtr = aes_reg_pkg::NumRegsIv * 32 / SliceSizeCtr; -parameter int unsigned SliceIdxWidth = prim_util_pkg::vbits(NumSlicesCtr); +parameter int unsigned SliceIdxWidth = caliptra_prim_util_pkg::vbits(NumSlicesCtr); // Widths of signals carrying pseudo-random data for clearing parameter int unsigned WidthPRDClearing = 64; diff --git a/src/aes/rtl/aes_prng_masking.sv b/src/aes/rtl/aes_prng_masking.sv index 011a15acd..455cafebb 100644 --- a/src/aes/rtl/aes_prng_masking.sv +++ b/src/aes/rtl/aes_prng_masking.sv @@ -18,7 +18,7 @@ // for masking purposes. // /////////////////////////////////////////////////////////////////////////////////////////////////// -`include "prim_assert.sv" +`include "caliptra_prim_assert.sv" module aes_prng_masking import aes_pkg::*; #( @@ -96,7 +96,7 @@ module aes_prng_masking import aes_pkg::*; if (ChunkSize == EntropyWidth) begin : gen_counter // We can reseed chunk by chunk as we get fresh entropy. Need to keep track of which chunk to // reseed next. - localparam int unsigned ChunkIdxWidth = prim_util_pkg::vbits(NumChunks); + localparam int unsigned ChunkIdxWidth = caliptra_prim_util_pkg::vbits(NumChunks); logic [ChunkIdxWidth-1:0] chunk_idx_d, chunk_idx_q; logic prng_reseed_done; @@ -133,11 +133,11 @@ module aes_prng_masking import aes_pkg::*; assign entropy_req_o = SecSkipPRNGReseeding ? 1'b0 : reseed_req_i & ~seed_valid; assign reseed_ack_o = SecSkipPRNGReseeding ? reseed_req_i : seed_valid; - prim_packer_fifo #( + caliptra_prim_packer_fifo #( .InW ( EntropyWidth ), .OutW ( Width ), .ClearOnRead ( 1'b0 ) - ) u_prim_packer_fifo ( + ) u_caliptra_prim_packer_fifo ( .clk_i ( clk_i ), .rst_ni ( rst_ni ), .clr_i ( 1'b0 ), // Not needed. @@ -163,7 +163,7 @@ module aes_prng_masking import aes_pkg::*; // We use multiple LFSR instances each having a width of ChunkSize. for (genvar c = 0; c < NumChunks; c++) begin : gen_lfsrs - prim_lfsr #( + caliptra_prim_lfsr #( .LfsrType ( "GAL_XOR" ), .LfsrDw ( ChunkSize ), .StateOutDw ( ChunkSize ), diff --git a/src/aes/rtl/aes_sbox.sv b/src/aes/rtl/aes_sbox.sv index a13900c3e..560720c7d 100644 --- a/src/aes/rtl/aes_sbox.sv +++ b/src/aes/rtl/aes_sbox.sv @@ -4,7 +4,7 @@ // // AES SBox -`include "prim_assert.sv" +`include "caliptra_prim_assert.sv" module aes_sbox import aes_pkg::*; #( diff --git a/src/aes/rtl/aes_sbox_canright_masked.sv b/src/aes/rtl/aes_sbox_canright_masked.sv index 45c4ff749..a20001478 100644 --- a/src/aes/rtl/aes_sbox_canright_masked.sv +++ b/src/aes/rtl/aes_sbox_canright_masked.sv @@ -24,7 +24,7 @@ // IMPORTANT NOTE: // // DO NOT USE THIS FOR SYNTHESIS BLINDLY! // // // -// This implementation relies on primitive cells like prim_buf/xor2 containing tool-specific // +// This implementation relies on primitive cells like caliptra_prim_buf/xor2 containing tool-specific // // synthesis attributes to enforce the correct ordering of operations and avoid aggressive // // optimization. Without the proper primitives, synthesis tools might heavily optimize the // // design. The result is likely insecure. Use with care. // @@ -59,9 +59,9 @@ module aes_masked_inverse_gf2p4 ( // Avoid aggressive synthesis optimizations. logic [1:0] mul_b0_q1_buf, mul_b1_q0_buf, mul_q1_q0_buf; - prim_buf #( + caliptra_prim_buf #( .Width ( 6 ) - ) u_prim_buf_mul_bq01 ( + ) u_caliptra_prim_buf_mul_bq01 ( .in_i ( {mul_b0_q1, mul_b1_q0, mul_q1_q0} ), .out_o ( {mul_b0_q1_buf, mul_b1_q0_buf, mul_q1_q0_buf} ) ); @@ -85,16 +85,16 @@ module aes_masked_inverse_gf2p4 ( // These terms are added to other terms that depend on the same inputs. // Avoid aggressive synthesis optimizations. logic [1:0] scale_omega2_b_buf, scale_omega2_q_buf; - prim_buf #( + caliptra_prim_buf #( .Width ( 4 ) - ) u_prim_buf_scale_omega2_bq ( + ) u_caliptra_prim_buf_scale_omega2_bq ( .in_i ( {scale_omega2_b, scale_omega2_q} ), .out_o ( {scale_omega2_b_buf, scale_omega2_q_buf} ) ); logic [1:0] mul_b1_b0_buf; - prim_buf #( + caliptra_prim_buf #( .Width ( 2 ) - ) u_prim_buf_mul_b1_b0 ( + ) u_caliptra_prim_buf_mul_b1_b0 ( .in_i ( mul_b1_b0 ), .out_o ( mul_b1_b0_buf ) ); @@ -111,9 +111,9 @@ module aes_masked_inverse_gf2p4 ( // Avoid aggressive synthesis optimizations. for (genvar i = 0; i < 6; i++) begin : gen_c_buf - prim_buf #( + caliptra_prim_buf #( .Width ( 2 ) - ) u_prim_buf_c_i ( + ) u_caliptra_prim_buf_c_i ( .in_i ( c[i] ), .out_o ( c_buf[i] ) ); @@ -137,32 +137,32 @@ module aes_masked_inverse_gf2p4 ( // Get intermediate terms. logic [1:0] xor_q1_r_sq, xor_q0_q1, c1_inv, c2_inv; - prim_xor2 #( + caliptra_prim_xor2 #( .Width ( 2 ) - ) u_prim_xor_q1_r_sq ( + ) u_caliptra_prim_xor_q1_r_sq ( .in0_i ( q1 ), .in1_i ( r_sq ), .out_o ( xor_q1_r_sq ) ); - prim_xor2 #( + caliptra_prim_xor2 #( .Width ( 2 ) - ) u_prim_xor_q0_q1 ( + ) u_caliptra_prim_xor_q0_q1 ( .in0_i ( q0 ), .in1_i ( q1 ), .out_o ( xor_q0_q1 ) ); // Generate c1_inv and c2_inv. - prim_xor2 #( + caliptra_prim_xor2 #( .Width ( 2 ) - ) u_prim_c1_inv ( + ) u_caliptra_prim_c1_inv ( .in0_i ( xor_q1_r_sq ), .in1_i ( c_inv ), .out_o ( c1_inv ) ); - prim_xor2 #( + caliptra_prim_xor2 #( .Width ( 2 ) - ) u_prim_c2_inv ( + ) u_caliptra_prim_c2_inv ( .in0_i ( c1_inv ), .in1_i ( xor_q0_q1 ), .out_o ( c2_inv ) @@ -187,9 +187,9 @@ module aes_masked_inverse_gf2p4 ( // The multiplier outputs are added to terms that depend on the same inputs. // Avoid aggressive synthesis optimizations. logic [1:0] mul_b0_c1_inv_buf, mul_q0_c1_inv_buf, mul_b1_c2_inv_buf, mul_q1_c2_inv_buf; - prim_buf #( + caliptra_prim_buf #( .Width ( 8 ) - ) u_prim_buf_mul_bq01_c12_inv ( + ) u_caliptra_prim_buf_mul_bq01_c12_inv ( .in_i ( {mul_b0_c1_inv, mul_q0_c1_inv, mul_b1_c2_inv, mul_q1_c2_inv} ), .out_o ( {mul_b0_c1_inv_buf, mul_q0_c1_inv_buf, mul_b1_c2_inv_buf, mul_q1_c2_inv_buf} ) ); @@ -210,15 +210,15 @@ module aes_masked_inverse_gf2p4 ( // Avoid aggressive synthesis optimizations. for (genvar i = 0; i < 4; i++) begin : gen_a01_inv_buf - prim_buf #( + caliptra_prim_buf #( .Width ( 2 ) - ) u_prim_buf_b1_inv_i ( + ) u_caliptra_prim_buf_b1_inv_i ( .in_i ( b1_inv[i] ), .out_o ( b1_inv_buf[i] ) ); - prim_buf #( + caliptra_prim_buf #( .Width ( 2 ) - ) u_prim_buf_b0_inv_i ( + ) u_caliptra_prim_buf_b0_inv_i ( .in_i ( b0_inv[i] ), .out_o ( b0_inv_buf[i] ) ); @@ -268,9 +268,9 @@ module aes_masked_inverse_gf2p8 ( // Avoid aggressive synthesis optimizations. logic [3:0] mul_a0_m1_buf, mul_a1_m0_buf, mul_m0_m1_buf; - prim_buf #( + caliptra_prim_buf #( .Width ( 12 ) - ) u_prim_buf_mul_bq01 ( + ) u_caliptra_prim_buf_mul_bq01 ( .in_i ( {mul_a0_m1, mul_a1_m0, mul_m0_m1} ), .out_o ( {mul_a0_m1_buf, mul_a1_m0_buf, mul_m0_m1_buf} ) ); @@ -295,9 +295,9 @@ module aes_masked_inverse_gf2p8 ( // The multiplier output is added to terms that depend on the same inputs. // Avoid aggressive synthesis optimizations. logic [3:0] mul_a1_a0_buf; - prim_buf #( + caliptra_prim_buf #( .Width ( 4 ) - ) u_prim_buf_mul_am01 ( + ) u_caliptra_prim_buf_mul_am01 ( .in_i ( mul_a1_a0 ), .out_o ( mul_a1_a0_buf ) ); @@ -314,9 +314,9 @@ module aes_masked_inverse_gf2p8 ( // Avoid aggressive synthesis optimizations. for (genvar i = 0; i < 6; i++) begin : gen_b_buf - prim_buf #( + caliptra_prim_buf #( .Width ( 4 ) - ) u_prim_buf_b_i ( + ) u_caliptra_prim_buf_b_i ( .in_i ( b[i] ), .out_o ( b_buf[i] ) ); @@ -339,9 +339,9 @@ module aes_masked_inverse_gf2p8 ( // with inputs to the GF(2^4) inverter. Aggressive synthesis optimizations across the GF(2^4) // inverter may result in SCA leakage and should be avoided. logic [3:0] b_inv_buf; - prim_buf #( + caliptra_prim_buf #( .Width ( 4 ) - ) u_prim_buf_b_inv ( + ) u_caliptra_prim_buf_b_inv ( .in_i ( b_inv ), .out_o ( b_inv_buf ) ); @@ -354,16 +354,16 @@ module aes_masked_inverse_gf2p8 ( // Generate b2_inv step by step. logic [3:0] xor_m1_m0, b2_inv; - prim_xor2 #( + caliptra_prim_xor2 #( .Width ( 4 ) - ) u_prim_xor_m1_m0 ( + ) u_caliptra_prim_xor_m1_m0 ( .in0_i ( m1 ), .in1_i ( m0 ), .out_o ( xor_m1_m0 ) ); - prim_xor2 #( + caliptra_prim_xor2 #( .Width ( 4 ) - ) u_prim_xor_b2_inv ( + ) u_caliptra_prim_xor_b2_inv ( .in0_i ( b_inv_buf ), .in1_i ( xor_m1_m0 ), .out_o ( b2_inv ) @@ -388,9 +388,9 @@ module aes_masked_inverse_gf2p8 ( // The multiplier outputs are added to terms that depend on the same inputs. // Avoid aggressive synthesis optimizations. logic [3:0] mul_a0_b_inv_buf, mul_m0_b_inv_buf, mul_a1_b2_inv_buf, mul_m1_b2_inv_buf; - prim_buf #( + caliptra_prim_buf #( .Width ( 16 ) - ) u_prim_buf_mul_bq01_c12_inv ( + ) u_caliptra_prim_buf_mul_bq01_c12_inv ( .in_i ( {mul_a0_b_inv, mul_m0_b_inv, mul_a1_b2_inv, mul_m1_b2_inv} ), .out_o ( {mul_a0_b_inv_buf, mul_m0_b_inv_buf, mul_a1_b2_inv_buf, mul_m1_b2_inv_buf} ) ); @@ -411,15 +411,15 @@ module aes_masked_inverse_gf2p8 ( // Avoid aggressive synthesis optimizations. for (genvar i = 0; i < 4; i++) begin : gen_a01_inv_buf - prim_buf #( + caliptra_prim_buf #( .Width ( 4 ) - ) u_prim_buf_a1_inv_i ( + ) u_caliptra_prim_buf_a1_inv_i ( .in_i ( a1_inv[i] ), .out_o ( a1_inv_buf[i] ) ); - prim_buf #( + caliptra_prim_buf #( .Width ( 4 ) - ) u_prim_buf_a0_inv_i ( + ) u_caliptra_prim_buf_a0_inv_i ( .in_i ( a0_inv[i] ), .out_o ( a0_inv_buf[i] ) ); diff --git a/src/aes/rtl/aes_sbox_canright_masked_noreuse.sv b/src/aes/rtl/aes_sbox_canright_masked_noreuse.sv index 983a692d5..b4e8631e6 100644 --- a/src/aes/rtl/aes_sbox_canright_masked_noreuse.sv +++ b/src/aes/rtl/aes_sbox_canright_masked_noreuse.sv @@ -23,7 +23,7 @@ // IMPORTANT NOTE: // // DO NOT USE THIS FOR SYNTHESIS BLINDLY! // // // -// This implementation relies on primitive cells like prim_buf containing tool-specific // +// This implementation relies on primitive cells like caliptra_prim_buf containing tool-specific // // synthesis attributes to enforce the correct ordering of operations and avoid aggressive // // optimization. Without the proper primitives, synthesis tools might heavily optimize the // // design. The result is likely insecure. Use with care. // @@ -72,16 +72,16 @@ module aes_masked_inverse_gf2p4_noreuse ( // These terms are added to other terms that depend on the same inputs. // Avoid aggressive synthesis optimizations. logic [1:0] scale_omega2_b_buf, scale_omega2_q_buf; - prim_buf #( + caliptra_prim_buf #( .Width ( 4 ) - ) u_prim_buf_scale_omega2_bq ( + ) u_caliptra_prim_buf_scale_omega2_bq ( .in_i ( {scale_omega2_b, scale_omega2_q} ), .out_o ( {scale_omega2_b_buf, scale_omega2_q_buf} ) ); logic [1:0] mul_b1_b0_buf, mul_b1_q0_buf, mul_b0_q1_buf, mul_q1_q0_buf; - prim_buf #( + caliptra_prim_buf #( .Width ( 8 ) - ) u_prim_buf_mul_bq01 ( + ) u_caliptra_prim_buf_mul_bq01 ( .in_i ( {mul_b1_b0, mul_b1_q0, mul_b0_q1, mul_q1_q0} ), .out_o ( {mul_b1_b0_buf, mul_b1_q0_buf, mul_b0_q1_buf, mul_q1_q0_buf} ) ); @@ -98,9 +98,9 @@ module aes_masked_inverse_gf2p4_noreuse ( // Avoid aggressive synthesis optimizations. for (genvar i = 0; i < 6; i++) begin : gen_c_buf - prim_buf #( + caliptra_prim_buf #( .Width ( 2 ) - ) u_prim_buf_c_i ( + ) u_caliptra_prim_buf_c_i ( .in_i ( c[i] ), .out_o ( c_buf[i] ) ); @@ -136,16 +136,16 @@ module aes_masked_inverse_gf2p4_noreuse ( // The multiplier outputs are added to terms that depend on the same inputs. // Avoid aggressive synthesis optimizations. logic [1:0] mul_b0_r_sq_buf, mul_q0_c_inv_buf, mul_q0_r_sq_buf; - prim_buf #( + caliptra_prim_buf #( .Width ( 6 ) - ) u_prim_buf_mul_bq0 ( + ) u_caliptra_prim_buf_mul_bq0 ( .in_i ( {mul_b0_r_sq, mul_q0_c_inv, mul_q0_r_sq} ), .out_o ( {mul_b0_r_sq_buf, mul_q0_c_inv_buf, mul_q0_r_sq_buf} ) ); logic [1:0] mul_b1_r_sq_buf, mul_q1_c_inv_buf, mul_q1_r_sq_buf; - prim_buf #( + caliptra_prim_buf #( .Width ( 6 ) - ) u_prim_buf_mul_bq1 ( + ) u_caliptra_prim_buf_mul_bq1 ( .in_i ( {mul_b1_r_sq, mul_q1_c_inv, mul_q1_r_sq} ), .out_o ( {mul_b1_r_sq_buf, mul_q1_c_inv_buf, mul_q1_r_sq_buf} ) ); @@ -166,15 +166,15 @@ module aes_masked_inverse_gf2p4_noreuse ( // Avoid aggressive synthesis optimizations. for (genvar i = 0; i < 4; i++) begin : gen_a01_inv_buf - prim_buf #( + caliptra_prim_buf #( .Width ( 2 ) - ) u_prim_buf_b1_inv_i ( + ) u_caliptra_prim_buf_b1_inv_i ( .in_i ( b1_inv[i] ), .out_o ( b1_inv_buf[i] ) ); - prim_buf #( + caliptra_prim_buf #( .Width ( 2 ) - ) u_prim_buf_b0_inv_i ( + ) u_caliptra_prim_buf_b0_inv_i ( .in_i ( b0_inv[i] ), .out_o ( b0_inv_buf[i] ) ); @@ -264,9 +264,9 @@ module aes_masked_inverse_gf2p8_noreuse ( // The multiplier outputs are added to terms that depend on the same inputs. // Avoid aggressive synthesis optimizations. logic [3:0] mul_a1_a0_buf, mul_a1_m0_buf, mul_a0_m1_buf, mul_m0_m1_buf; - prim_buf #( + caliptra_prim_buf #( .Width ( 16 ) - ) u_prim_buf_mul_am01 ( + ) u_caliptra_prim_buf_mul_am01 ( .in_i ( {mul_a1_a0, mul_a1_m0, mul_a0_m1, mul_m0_m1} ), .out_o ( {mul_a1_a0_buf, mul_a1_m0_buf, mul_a0_m1_buf, mul_m0_m1_buf} ) ); @@ -283,9 +283,9 @@ module aes_masked_inverse_gf2p8_noreuse ( // Avoid aggressive synthesis optimizations. for (genvar i = 0; i < 6; i++) begin : gen_b_buf - prim_buf #( + caliptra_prim_buf #( .Width ( 4 ) - ) u_prim_buf_b_i ( + ) u_caliptra_prim_buf_b_i ( .in_i ( b[i] ), .out_o ( b_buf[i] ) ); @@ -308,9 +308,9 @@ module aes_masked_inverse_gf2p8_noreuse ( // with inputs to the GF(2^4) inverter. Aggressive synthesis optimizations across the GF(2^4) // inverter may result in SCA leakage and should be avoided. logic [3:0] b_inv_buf; - prim_buf #( + caliptra_prim_buf #( .Width ( 4 ) - ) u_prim_buf_b_inv ( + ) u_caliptra_prim_buf_b_inv ( .in_i ( b_inv ), .out_o ( b_inv_buf ) ); @@ -339,16 +339,16 @@ module aes_masked_inverse_gf2p8_noreuse ( // The multiplier outputs are added to terms that depend on the same inputs. // Avoid aggressive synthesis optimizations. logic [3:0] mul_a0_b_inv_buf, mul_a0_t_buf, mul_m0_b_inv_buf, mul_m0_t_buf; - prim_buf #( + caliptra_prim_buf #( .Width ( 16 ) - ) u_prim_buf_mul_am0 ( + ) u_caliptra_prim_buf_mul_am0 ( .in_i ( {mul_a0_b_inv, mul_a0_t, mul_m0_b_inv, mul_m0_t} ), .out_o ( {mul_a0_b_inv_buf, mul_a0_t_buf, mul_m0_b_inv_buf, mul_m0_t_buf} ) ); logic [3:0] mul_a1_b_inv_buf, mul_a1_t_buf, mul_m1_b_inv_buf, mul_m1_t_buf; - prim_buf #( + caliptra_prim_buf #( .Width ( 16 ) - ) u_prim_buf_mul_am1 ( + ) u_caliptra_prim_buf_mul_am1 ( .in_i ( {mul_a1_b_inv, mul_a1_t, mul_m1_b_inv, mul_m1_t} ), .out_o ( {mul_a1_b_inv_buf, mul_a1_t_buf, mul_m1_b_inv_buf, mul_m1_t_buf} ) ); @@ -369,15 +369,15 @@ module aes_masked_inverse_gf2p8_noreuse ( // Avoid aggressive synthesis optimizations. for (genvar i = 0; i < 4; i++) begin : gen_a01_inv_buf - prim_buf #( + caliptra_prim_buf #( .Width ( 4 ) - ) u_prim_buf_a1_inv_i ( + ) u_caliptra_prim_buf_a1_inv_i ( .in_i ( a1_inv[i] ), .out_o ( a1_inv_buf[i] ) ); - prim_buf #( + caliptra_prim_buf #( .Width ( 4 ) - ) u_prim_buf_a0_inv_i ( + ) u_caliptra_prim_buf_a0_inv_i ( .in_i ( a0_inv[i] ), .out_o ( a0_inv_buf[i] ) ); diff --git a/src/aes/rtl/aes_sbox_dom.sv b/src/aes/rtl/aes_sbox_dom.sv index c3519b3d4..6eedae7ef 100644 --- a/src/aes/rtl/aes_sbox_dom.sv +++ b/src/aes/rtl/aes_sbox_dom.sv @@ -32,13 +32,13 @@ // IMPORTANT NOTE: // // DO NOT USE THIS FOR SYNTHESIS BLINDLY! // // // -// This implementation relies on primitive cells like prim_buf/flop_en containing tool-specific // +// This implementation relies on primitive cells like caliptra_prim_buf/flop_en containing tool-specific // // synthesis attributes to prevent the synthesis tool from optimizing away/re-ordering registers // // and to enforce the correct ordering of operations. Without the proper primitives, synthesis // // tools might heavily optimize the design. The result is likely insecure. Use with care. // /////////////////////////////////////////////////////////////////////////////////////////////////// -`include "prim_assert.sv" +`include "caliptra_prim_assert.sv" // Packed struct for pseudo-random data (PRD) input. Stages 1, 3 and 4 require 8 bits each. Stage 2 // requires just 4 bits. @@ -115,10 +115,10 @@ module aes_dom_indep_mul_gf2pn #( assign bq_z0_d = z_0 ^ mul_ay_bx; // Registers - prim_flop_en #( + caliptra_prim_flop_en #( .Width ( 2*NPower ), .ResetValue ( '0 ) - ) u_prim_flop_abq_z0 ( + ) u_caliptra_prim_flop_abq_z0 ( .clk_i ( clk_i ), .rst_ni ( rst_ni ), .en_i ( we_i ), @@ -137,10 +137,10 @@ module aes_dom_indep_mul_gf2pn #( // reshared cross-domain terms with inner-domain terms derived from different input data. logic [NPower-1:0] mul_ax_ay_q, mul_bx_by_q; - prim_flop_en #( + caliptra_prim_flop_en #( .Width ( 2*NPower ), .ResetValue ( '0 ) - ) u_prim_flop_mul_abx_aby ( + ) u_caliptra_prim_flop_mul_abx_aby ( .clk_i ( clk_i ), .rst_ni ( rst_ni ), .en_i ( we_i ), @@ -159,9 +159,9 @@ module aes_dom_indep_mul_gf2pn #( // Avoid aggressive synthesis optimizations. logic [NPower-1:0] mul_ax_ay_buf, mul_bx_by_buf; - prim_buf #( + caliptra_prim_buf #( .Width ( 2*NPower ) - ) u_prim_buf_mul_abx_aby ( + ) u_caliptra_prim_buf_mul_abx_aby ( .in_i ( {mul_ax_ay_d, mul_bx_by_d} ), .out_o ( {mul_ax_ay_buf, mul_bx_by_buf} ) ); @@ -217,10 +217,10 @@ module aes_dom_dep_mul_gf2pn_unopt #( assign b_yz_d = b_y ^ b_z; // Registers - prim_flop_en #( + caliptra_prim_flop_en #( .Width ( 2*NPower ), .ResetValue ( '0 ) - ) u_prim_flop_ab_yz ( + ) u_caliptra_prim_flop_ab_yz ( .clk_i ( clk_i ), .rst_ni ( rst_ni ), .en_i ( we_i ), @@ -259,10 +259,10 @@ module aes_dom_dep_mul_gf2pn_unopt #( // different clock cycles. logic [NPower-1:0] a_x_q, b_x_q; - prim_flop_en #( + caliptra_prim_flop_en #( .Width ( 2*NPower ), .ResetValue ( '0 ) - ) u_prim_flop_ab_x ( + ) u_caliptra_prim_flop_ab_x ( .clk_i ( clk_i ), .rst_ni ( rst_ni ), .en_i ( we_i ), @@ -357,10 +357,10 @@ module aes_dom_dep_mul_gf2pn #( assign b_yz0_d = b_y ^ z_0; // Registers - prim_flop_en #( + caliptra_prim_flop_en #( .Width ( 2*NPower ), .ResetValue ( '0 ) - ) u_prim_flop_ab_yz0 ( + ) u_caliptra_prim_flop_ab_yz0 ( .clk_i ( clk_i ), .rst_ni ( rst_ni ), .en_i ( we_i ), @@ -389,9 +389,9 @@ module aes_dom_dep_mul_gf2pn #( // Avoid aggressive synthesis optimizations. logic [NPower-1:0] mul_ax_z0_buf, mul_bx_z0_buf; - prim_buf #( + caliptra_prim_buf #( .Width ( 2*NPower ) - ) u_prim_buf_mul_abx_z0 ( + ) u_caliptra_prim_buf_mul_abx_z0 ( .in_i ( {mul_ax_z0, mul_bx_z0} ), .out_o ( {mul_ax_z0_buf, mul_bx_z0_buf} ) ); @@ -403,10 +403,10 @@ module aes_dom_dep_mul_gf2pn #( assign bxz0_z1_d = mul_bx_z0_buf ^ z_1; // Registers - prim_flop_en #( + caliptra_prim_flop_en #( .Width ( 2*NPower ), .ResetValue ( '0 ) - ) u_prim_flop_abxz0_z1 ( + ) u_caliptra_prim_flop_abxz0_z1 ( .clk_i ( clk_i ), .rst_ni ( rst_ni ), .en_i ( we_i ), @@ -493,10 +493,10 @@ module aes_dom_dep_mul_gf2pn #( end // Registers - prim_flop_en #( + caliptra_prim_flop_en #( .Width ( 2*NPower ), .ResetValue ( '0 ) - ) u_prim_flop_mul_abx_aby ( + ) u_caliptra_prim_flop_mul_abx_aby ( .clk_i ( clk_i ), .rst_ni ( rst_ni ), .en_i ( we_i ), @@ -518,9 +518,9 @@ module aes_dom_dep_mul_gf2pn #( // Avoid aggressive synthesis optimizations. logic [NPower-1:0] mul_ax_byz0_buf, mul_bx_ayz0_buf; - prim_buf #( + caliptra_prim_buf #( .Width ( 2*NPower ) - ) u_prim_buf_mul_abx_bayz0 ( + ) u_caliptra_prim_buf_mul_abx_bayz0 ( .in_i ( {mul_ax_byz0, mul_bx_ayz0} ), .out_o ( {mul_ax_byz0_buf, mul_bx_ayz0_buf} ) ); @@ -541,9 +541,9 @@ module aes_dom_dep_mul_gf2pn #( // Avoid aggressive synthesis optimizations. logic [NPower-1:0] a_b_buf, b_b_buf; - prim_buf #( + caliptra_prim_buf #( .Width ( 2*NPower ) - ) u_prim_buf_ab_b ( + ) u_caliptra_prim_buf_ab_b ( .in_i ( {a_b, b_b} ), .out_o ( {a_b_buf, b_b_buf} ) ); @@ -560,9 +560,9 @@ module aes_dom_dep_mul_gf2pn #( // Avoid aggressive synthesis optimizations. logic [NPower-1:0] a_mul_ax_b_buf, b_mul_bx_b_buf; - prim_buf #( + caliptra_prim_buf #( .Width ( 2*NPower ) - ) u_prim_buf_ab_mul_abx_b ( + ) u_caliptra_prim_buf_ab_mul_abx_b ( .in_i ( {a_mul_ax_b, b_mul_bx_b} ), .out_o ( {a_mul_ax_b_buf, b_mul_bx_b_buf} ) ); @@ -612,10 +612,10 @@ module aes_dom_inverse_gf2p4 #( logic [1:0] a_gamma_ss_q, b_gamma_ss_q; assign a_gamma_ss_d = aes_scale_omega2_gf2p2(aes_square_gf2p2(a_gamma1 ^ a_gamma0)); assign b_gamma_ss_d = aes_scale_omega2_gf2p2(aes_square_gf2p2(b_gamma1 ^ b_gamma0)); - prim_flop_en #( + caliptra_prim_flop_en #( .Width ( 4 ), .ResetValue ( '0 ) - ) u_prim_flop_ab_gamma_ss ( + ) u_caliptra_prim_flop_ab_gamma_ss ( .clk_i ( clk_i ), .rst_ni ( rst_ni ), .en_i ( we_i[0] ), @@ -624,10 +624,10 @@ module aes_dom_inverse_gf2p4 #( ); logic [1:0] a_gamma1_q, a_gamma0_q, b_gamma1_q, b_gamma0_q; - prim_flop_en #( + caliptra_prim_flop_en #( .Width ( 8 ), .ResetValue ( '0 ) - ) u_prim_flop_ab_gamma10 ( + ) u_caliptra_prim_flop_ab_gamma10 ( .clk_i ( clk_i ), .rst_ni ( rst_ni ), .en_i ( we_i[0] ), @@ -684,23 +684,23 @@ module aes_dom_inverse_gf2p4 #( // Avoid aggressive synthesis optimizations. logic [1:0] a_omega_buf, b_omega_buf; - prim_buf #( + caliptra_prim_buf #( .Width ( 4 ) - ) u_prim_buf_ab_omega ( + ) u_caliptra_prim_buf_ab_omega ( .in_i ( {a_omega, b_omega} ), .out_o ( {a_omega_buf, b_omega_buf} ) ); // Pipeline registers logic [1:0] a_gamma1_qq, a_gamma0_qq, b_gamma1_qq, b_gamma0_qq, a_omega_buf_q, b_omega_buf_q; - if (PipelineMul == 1'b1) begin: gen_prim_flop_omega_gamma10 + if (PipelineMul == 1'b1) begin: gen_caliptra_prim_flop_omega_gamma10 // We instantiate the input pipeline registers for the DOM-dep multiplier outside of the // multiplier to enable sharing of pipeline registers where applicable. - prim_flop_en #( + caliptra_prim_flop_en #( .Width ( 8 ), .ResetValue ( '0 ) - ) u_prim_flop_ab_gamma10_q ( + ) u_caliptra_prim_flop_ab_gamma10_q ( .clk_i ( clk_i ), .rst_ni ( rst_ni ), .en_i ( we_i[1] ), @@ -709,10 +709,10 @@ module aes_dom_inverse_gf2p4 #( ); // These inputs are used by both DOM-dep multipliers below. - prim_flop_en #( + caliptra_prim_flop_en #( .Width ( 4 ), .ResetValue ( '0 ) - ) u_prim_flop_ab_omega_buf ( + ) u_caliptra_prim_flop_ab_omega_buf ( .clk_i ( clk_i ), .rst_ni ( rst_ni ), .en_i ( we_i[1] ), @@ -720,7 +720,7 @@ module aes_dom_inverse_gf2p4 #( .q_o ( {a_omega_buf_q, b_omega_buf_q} ) ); - end else begin : gen_no_prim_flop_ab_y10 + end else begin : gen_no_caliptra_prim_flop_ab_y10 // When using un-pipelined multipliers, there is no need to insert additional registers. // We drive the corresponding inputs to 0 to make sure the functionality isn't correct in case // the pipeliend inputs are erroneously used. @@ -823,10 +823,10 @@ module aes_dom_inverse_gf2p8 #( logic [3:0] a_y_ss_q, b_y_ss_q; assign a_y_ss_d = aes_square_scale_gf2p4_gf2p2(a_y1 ^ a_y0); assign b_y_ss_d = aes_square_scale_gf2p4_gf2p2(b_y1 ^ b_y0); - prim_flop_en #( + caliptra_prim_flop_en #( .Width ( 8 ), .ResetValue ( '0 ) - ) u_prim_flop_ab_y_ss ( + ) u_caliptra_prim_flop_ab_y_ss ( .clk_i ( clk_i ), .rst_ni ( rst_ni ), .en_i ( we_i[0] ), @@ -835,14 +835,14 @@ module aes_dom_inverse_gf2p8 #( ); logic [3:0] a_y1_q, a_y0_q, b_y1_q, b_y0_q; - if (PipelineMul == 1'b1) begin: gen_prim_flop_ab_y10 + if (PipelineMul == 1'b1) begin: gen_caliptra_prim_flop_ab_y10 // We instantiate the input pipeline registers for the DOM-dep multiplier outside of the // multiplier to enable sharing of pipeline registers where applicable. - prim_flop_en #( + caliptra_prim_flop_en #( .Width ( 16 ), .ResetValue ( '0 ) - ) u_prim_flop_ab_y10 ( + ) u_caliptra_prim_flop_ab_y10 ( .clk_i ( clk_i ), .rst_ni ( rst_ni ), .en_i ( we_i[0] ), @@ -850,7 +850,7 @@ module aes_dom_inverse_gf2p8 #( .q_o ( {a_y1_q, a_y0_q, b_y1_q, b_y0_q} ) ); - end else begin : gen_no_prim_flop_ab_y10 + end else begin : gen_no_caliptra_prim_flop_ab_y10 // When using un-pipelined multipliers, there is no need to insert additional registers. // We drive the corresponding inputs to 0 to make sure the functionality isn't correct in case // the pipeliend inputs are erroneously used. @@ -891,9 +891,9 @@ module aes_dom_inverse_gf2p8 #( // Avoid aggressive synthesis optimizations. logic [3:0] a_gamma_buf, b_gamma_buf; - prim_buf #( + caliptra_prim_buf #( .Width ( 8 ) - ) u_prim_buf_ab_gamma ( + ) u_caliptra_prim_buf_ab_gamma ( .in_i ( {a_gamma, b_gamma} ), .out_o ( {a_gamma_buf, b_gamma_buf} ) ); @@ -935,10 +935,10 @@ module aes_dom_inverse_gf2p8 #( // Formulas 18 and 19 in [2]. logic [3:0] a_y1_qqq, a_y0_qqq, b_y1_qqq, b_y0_qqq; - prim_flop_en #( + caliptra_prim_flop_en #( .Width ( 16 ), .ResetValue ( '0 ) - ) u_prim_flop_ab_y10_qqq ( + ) u_caliptra_prim_flop_ab_y10_qqq ( .clk_i ( clk_i ), .rst_ni ( rst_ni ), .en_i ( we_i[2] ), @@ -1070,10 +1070,10 @@ module aes_sbox_dom // Buffer and forward PRD for the individual stages. We get 8 bits from the PRNG for usage in the // first cycle. Stages 2, 3 and 4 are driven by other S-Box instances. assign prd1_d = we[0] ? prd_i[7:0] : prd1_q; - prim_flop #( + caliptra_prim_flop #( .Width ( 8 ), .ResetValue ( '0 ) - ) u_prim_flop_prd1_q ( + ) u_caliptra_prim_flop_prd1_q ( .clk_i ( clk_i ), .rst_ni ( rst_ni ), .d_i ( prd1_d ), diff --git a/src/aes/rtl/aes_sel_buf_chk.sv b/src/aes/rtl/aes_sel_buf_chk.sv index 5bee783b2..b6cb03cfd 100644 --- a/src/aes/rtl/aes_sel_buf_chk.sv +++ b/src/aes/rtl/aes_sel_buf_chk.sv @@ -9,7 +9,7 @@ // 2. to check that the selector signal is valid, i.e., doesn't take on invalid values. // Whenever the selector signal takes on an invalid value, an error is signaled. -`include "prim_assert.sv" +`include "caliptra_prim_assert.sv" module aes_sel_buf_chk #( parameter int Num = 2, @@ -36,16 +36,16 @@ module aes_sel_buf_chk #( //////////// if (EnSecBuf) begin : gen_sec_buf - prim_sec_anchor_buf #( + caliptra_prim_sec_anchor_buf #( .Width ( Width ) - ) u_prim_buf_sel_i ( + ) u_caliptra_prim_buf_sel_i ( .in_i ( sel_i ), .out_o ( sel_o ) ); end else begin : gen_buf - prim_buf #( + caliptra_prim_buf #( .Width ( Width ) - ) u_prim_buf_sel_i ( + ) u_caliptra_prim_buf_sel_i ( .in_i ( sel_i ), .out_o ( sel_o ) ); diff --git a/src/ahb_lite_bus/config/ahb_lite_bus.vf b/src/ahb_lite_bus/config/ahb_lite_bus.vf index 27ca1516c..86fbbb2e2 100644 --- a/src/ahb_lite_bus/config/ahb_lite_bus.vf +++ b/src/ahb_lite_bus/config/ahb_lite_bus.vf @@ -1,4 +1,19 @@ ++incdir+${CALIPTRA_ROOT}/src/integration/rtl ++incdir+${CALIPTRA_ROOT}/src/libs/rtl +incdir+${CALIPTRA_ROOT}/src/ahb_lite_bus/rtl +${CALIPTRA_ROOT}/src/integration/rtl/config_defines.svh +${CALIPTRA_ROOT}/src/integration/rtl/caliptra_reg_defines.svh +${CALIPTRA_ROOT}/src/libs/rtl/caliptra_sva.svh +${CALIPTRA_ROOT}/src/libs/rtl/caliptra_macros.svh +${CALIPTRA_ROOT}/src/libs/rtl/caliptra_sram.sv +${CALIPTRA_ROOT}/src/libs/rtl/ahb_defines_pkg.sv +${CALIPTRA_ROOT}/src/libs/rtl/caliptra_ahb_srom.sv +${CALIPTRA_ROOT}/src/libs/rtl/apb_slv_sif.sv +${CALIPTRA_ROOT}/src/libs/rtl/ahb_slv_sif.sv +${CALIPTRA_ROOT}/src/libs/rtl/caliptra_icg.sv +${CALIPTRA_ROOT}/src/libs/rtl/clk_gate.sv +${CALIPTRA_ROOT}/src/libs/rtl/caliptra_2ff_sync.sv +${CALIPTRA_ROOT}/src/libs/rtl/ahb_to_reg_adapter.sv ${CALIPTRA_ROOT}/src/ahb_lite_bus/rtl/ahb_lite_bus_inf.sv ${CALIPTRA_ROOT}/src/ahb_lite_bus/rtl/ahb_lite_address_decoder.sv ${CALIPTRA_ROOT}/src/ahb_lite_bus/rtl/ahb_lite_bus.sv diff --git a/src/ahb_lite_bus/config/ahb_node_wrap.vf b/src/ahb_lite_bus/config/ahb_node_wrap.vf deleted file mode 100644 index fb670ea20..000000000 --- a/src/ahb_lite_bus/config/ahb_node_wrap.vf +++ /dev/null @@ -1,4 +0,0 @@ -+incdir+${CALIPTRA_ROOT}/src/ahb_lite_bus/rtl -${CALIPTRA_ROOT}/src/ahb_lite_bus/rtl/ahb_bus.sv -${CALIPTRA_ROOT}/src/ahb_lite_bus/rtl/ahb_node.sv -${CALIPTRA_ROOT}/src/ahb_lite_bus/rtl/ahb_node_wrap.sv diff --git a/src/ahb_lite_bus/config/compile.yml b/src/ahb_lite_bus/config/compile.yml index 38bba9e49..2529a1177 100755 --- a/src/ahb_lite_bus/config/compile.yml +++ b/src/ahb_lite_bus/config/compile.yml @@ -1,5 +1,7 @@ --- provides: [ahb_lite_bus] +requires: + - libs schema_version: 2.4.0 targets: rtl: diff --git a/src/ahb_lite_bus/rtl/ahb_lite_2to1_mux.sv b/src/ahb_lite_bus/rtl/ahb_lite_2to1_mux.sv index 5d5641522..017539252 100644 --- a/src/ahb_lite_bus/rtl/ahb_lite_2to1_mux.sv +++ b/src/ahb_lite_bus/rtl/ahb_lite_2to1_mux.sv @@ -21,13 +21,15 @@ module ahb_lite_2to1_mux #( parameter AHB_LITE_ADDR_WIDTH = 32, - parameter AHB_LITE_DATA_WIDTH = 32 + parameter AHB_LITE_DATA_WIDTH = 32, + parameter AHB_NO_OPT = 0 ) ( // --------------------------------------- // Global clock/reset // --------------------------------------- input logic hclk, input logic hreset_n, + input logic force_bus_idle, // --------------------------------------- // From Initiator 0 @@ -80,7 +82,9 @@ module ahb_lite_2to1_mux #( //Initiator 0 always takes priority logic initiator0_address_ph, initiator1_address_ph; +logic initiator0_data_ph_nq, initiator1_data_ph_nq; logic initiator0_data_ph, initiator1_data_ph; +logic initiator0_pend_addr_ph_nq, initiator1_pend_addr_ph_nq; logic initiator0_pend_addr_ph, initiator1_pend_addr_ph; logic initiator0_gnt, initiator1_gnt; logic [AHB_LITE_ADDR_WIDTH-1:0] initiator0_pend_haddr, initiator1_pend_haddr; @@ -93,8 +97,8 @@ logic initiator0_pend_hwrite, initiator1_pend_hwrite; logic initiator0_hwrite, initiator1_hwrite; //Detect address phase -always_comb initiator0_address_ph = hsel_i_0 & hready_i_0 & htrans_i_0 inside {2'b10, 2'b11}; -always_comb initiator1_address_ph = hsel_i_1 & hready_i_1 & htrans_i_1 inside {2'b10, 2'b11}; +always_comb initiator0_address_ph = hsel_i_0 & hready_i_0 & htrans_i_0 inside {2'b10, 2'b11} & ~force_bus_idle; +always_comb initiator1_address_ph = hsel_i_1 & hready_i_1 & htrans_i_1 inside {2'b10, 2'b11} & ~force_bus_idle; always_ff @(posedge hclk or negedge hreset_n) begin if (~hreset_n) begin @@ -106,10 +110,10 @@ always_ff @(posedge hclk or negedge hreset_n) begin initiator1_pend_hsize <= '0; initiator0_pend_hwrite <= '0; initiator1_pend_hwrite <= '0; - initiator0_pend_addr_ph <= '0; - initiator1_pend_addr_ph <= '0; - initiator0_data_ph <= '0; - initiator1_data_ph <= '0; + initiator0_pend_addr_ph_nq <= '0; + initiator1_pend_addr_ph_nq <= '0; + initiator0_data_ph_nq <= '0; + initiator1_data_ph_nq <= '0; end else begin //Capture the address during the address phase for each initiator @@ -123,15 +127,20 @@ always_ff @(posedge hclk or negedge hreset_n) begin initiator1_pend_hwrite <= initiator1_address_ph & ~initiator1_pend_addr_ph ? hwrite_i_1 : initiator1_pend_hwrite; //Capture pending address phase when initiators collide - initiator0_pend_addr_ph <= (initiator0_address_ph | initiator0_pend_addr_ph) & ~initiator0_gnt; - initiator1_pend_addr_ph <= (initiator1_address_ph | initiator1_pend_addr_ph) & ~initiator1_gnt; + initiator0_pend_addr_ph_nq <= (initiator0_address_ph | initiator0_pend_addr_ph) & ~(hreadyout_i & initiator0_gnt); + initiator1_pend_addr_ph_nq <= (initiator1_address_ph | initiator1_pend_addr_ph) & ~(hreadyout_i & initiator1_gnt); //Transition to data phase when endpoint accepts address phase, hold when not ready - initiator0_data_ph <= (initiator0_gnt) | (initiator0_data_ph & ~hreadyout_i); - initiator1_data_ph <= (initiator1_gnt) | (initiator1_data_ph & ~hreadyout_i); + initiator0_data_ph_nq <= (initiator0_gnt) | (initiator0_data_ph & ~hreadyout_i); + initiator1_data_ph_nq <= (initiator1_gnt) | (initiator1_data_ph & ~hreadyout_i); end end +always_comb initiator0_data_ph = initiator0_data_ph_nq & ~force_bus_idle; +always_comb initiator1_data_ph = initiator1_data_ph_nq & ~force_bus_idle; +always_comb initiator0_pend_addr_ph = initiator0_pend_addr_ph_nq & ~force_bus_idle; +always_comb initiator1_pend_addr_ph = initiator1_pend_addr_ph_nq & ~force_bus_idle; + always_comb initiator0_haddr = initiator0_pend_addr_ph ? initiator0_pend_haddr : haddr_i_0; always_comb initiator0_htrans = initiator0_pend_addr_ph ? initiator0_pend_htrans : htrans_i_0; always_comb initiator0_hsize = initiator0_pend_addr_ph ? initiator0_pend_hsize : hsize_i_0; @@ -143,12 +152,29 @@ always_comb initiator1_hsize = initiator1_pend_addr_ph ? initiator1_pend_hsize : always_comb initiator1_hwrite = initiator1_pend_addr_ph ? initiator1_pend_hwrite : hwrite_i_1; //Select the appropriate initiator -//Initiator 0 gets priority -//Stall the grant if initiator 1 is processing a data phase and address phase b2b -always_comb initiator0_gnt = (initiator0_address_ph | initiator0_pend_addr_ph) & hreadyout_i; - -//Initiator 1 gets through only if initiator 0 isn't getting granted -always_comb initiator1_gnt = (initiator1_address_ph | initiator1_pend_addr_ph) & hreadyout_i & ~initiator0_gnt; +generate + if (AHB_NO_OPT) begin + //no optimization, data phase must complete before driving new address phase + //Initiator 0 gets priority + //Stall the grant only if initiator 1 is on its data phase + always_comb initiator0_gnt = (initiator0_address_ph | initiator0_pend_addr_ph) & ~initiator1_data_ph; + + //Initiator 1 gets through only if initiator 0 address phase isn't getting gnt, or in data phase + always_comb initiator1_gnt = (initiator1_address_ph | initiator1_pend_addr_ph) & ~initiator0_data_ph & ~initiator0_gnt; + end else begin + //optimized to allow addr phase to overlap data phase, assumes no stalls + //Initiator 0 gets priority + //Stall the grant if initiator 1 is processing a data phase and address phase b2b + always_comb initiator0_gnt = (initiator0_address_ph | initiator0_pend_addr_ph); + + //Initiator 1 gets through only if initiator 0 isn't getting granted + always_comb initiator1_gnt = (initiator1_address_ph | initiator1_pend_addr_ph) & ~initiator0_gnt; + + //optimized path doesn't look at stall + //only time this stalls is on error condition + `CALIPTRA_ASSERT_NEVER(ERR_2TO1MUX_STALL, ~hreadyout_i & (hresp_i == 1'b0), hclk, hreset_n) + end +endgenerate //Mux the appropriate initiator and send out //Keep driving initiator 1 controls on data phase if init0 isn't getting a grant in that cycle @@ -165,14 +191,52 @@ always_comb hready_o = initiator1_gnt | (initiator1_data_ph & ~initiator0_gnt) ? //Send the data coming from responder when selected always_comb hresp_o_0 = initiator0_data_ph ? hresp_i : '0; always_comb hrdata_o_0 = initiator0_data_ph ? hrdata_i : '0; -always_comb hready_o_0 = initiator0_pend_addr_ph ? '0 : - initiator0_data_ph ? hreadyout_i : '1; +always_comb hready_o_0 = initiator0_data_ph ? hreadyout_i : + initiator0_pend_addr_ph ? '0 : '1; always_comb hresp_o_1 = initiator1_data_ph? hresp_i: '0; always_comb hrdata_o_1 = initiator1_data_ph ? hrdata_i: '0; -always_comb hready_o_1 = initiator1_pend_addr_ph ? '0 : - initiator1_data_ph ? hreadyout_i : '1; +always_comb hready_o_1 = initiator1_data_ph ? hreadyout_i : + initiator1_pend_addr_ph ? '0 : '1; `CALIPTRA_ASSERT_MUTEX(ERR_2TO1MUX_MUTEX_DATA_PH, {initiator0_data_ph,initiator1_data_ph}, hclk, hreset_n) `CALIPTRA_ASSERT_NEVER(ERR_2TO1MUX_BAD_HTRANS, (htrans_o == 2'b01), hclk, hreset_n) + +//Coverage +`ifndef VERILATOR +`ifdef FCOV + +covergroup ahb_lite_2to1_mux_cov_grp @(posedge hclk iff hreset_n); + option.per_instance = 1; + + init0_addr_cp: coverpoint initiator0_address_ph; + init0_pend_addr_cp: coverpoint initiator0_pend_addr_ph; + init0_data_cp: coverpoint initiator0_data_ph; + init0_gnt_cp : coverpoint initiator0_gnt; + + init1_addr_cp: coverpoint initiator1_address_ph; + init1_pend_addr_cp: coverpoint initiator1_pend_addr_ph; + init1_data_cp: coverpoint initiator1_data_ph; + init1_gnt_cp : coverpoint initiator1_gnt; + + init0_pend_addr_not_ready: coverpoint initiator0_pend_addr_ph & ~hreadyout_i; + init1_pend_addr_not_ready: coverpoint initiator1_pend_addr_ph & ~hreadyout_i; + + init0_data_not_ready: coverpoint initiator0_data_ph & ~hreadyout_i; + init1_data_not_ready: coverpoint initiator1_data_ph & ~hreadyout_i; + + init0_dataXinit1_gnt: cross init0_data_cp, init1_gnt_cp; + init1_dataXinit0_gnt: cross init1_data_cp, init0_gnt_cp; + + init0_addrXpend: cross init0_addr_cp, init0_pend_addr_cp; + init1_addrXpend: cross init1_addr_cp, init1_pend_addr_cp; + init0Xinit1_addr: cross init0_addr_cp, init1_addr_cp; + init0Xinit1_pend_addr: cross init0_pend_addr_cp, init1_pend_addr_cp; + +endgroup + + ahb_lite_2to1_mux_cov_grp ahb_lite_2to1_mux_cov_grp1 = new(); + +`endif +`endif endmodule diff --git a/src/ahb_lite_bus/rtl/ahb_lite_address_decoder.sv b/src/ahb_lite_bus/rtl/ahb_lite_address_decoder.sv index 9b87d0fbd..918529300 100644 --- a/src/ahb_lite_bus/rtl/ahb_lite_address_decoder.sv +++ b/src/ahb_lite_bus/rtl/ahb_lite_address_decoder.sv @@ -27,7 +27,7 @@ module ahb_lite_address_decoder #( // --------------------------------------- input logic hclk, input logic hreset_n, - + input logic force_bus_idle, // --------------------------------------- // From Initiator Interface Port // --------------------------------------- @@ -57,7 +57,7 @@ module ahb_lite_address_decoder #( output logic [NUM_RESPONDERS-1:0][2:0] hsize_o, // ---------------------------------------------- - // Respnder Disable + // Responder Disable // ---------------------------------------------- input logic [NUM_RESPONDERS-1:0] responder_disable_i, output logic [NUM_RESPONDERS-1:0] access_blocked_o, @@ -78,19 +78,23 @@ module ahb_lite_address_decoder #( logic [NUM_RESPONDERS-1:0] pending_hsel; logic hinitiator_ready_default; logic hinitiator_ready_int; + logic hinitiator_ready_int_q; logic [NUM_RESPONDERS-1:0] hsel_o_int_pre; logic [NUM_RESPONDERS-1:0] hsel_blocked; logic [NUM_RESPONDERS-1:0] hsel_o_int; logic hresp_error; logic hresp_error_r; + logic [1:0] htrans_q; + + always_comb htrans_q = force_bus_idle ? AHB_XFER_IDLE : htrans_i; // Decode the address to appropriate Responder HSEL genvar resp_num; generate for (resp_num = 0; resp_num < NUM_RESPONDERS; resp_num++) begin: gen_responder_hsel - assign hsel_o_int_pre[resp_num] = (haddr_i >= responder_start_addr_i[resp_num]) && (haddr_i <= responder_end_addr_i[resp_num]); + assign hsel_o_int_pre[resp_num] = ~force_bus_idle && (haddr_i >= responder_start_addr_i[resp_num]) && (haddr_i <= responder_end_addr_i[resp_num]); assign hsel_blocked [resp_num] = hsel_o_int_pre[resp_num] && responder_disable_i[resp_num]; assign hsel_o_int [resp_num] = hsel_o_int_pre[resp_num] && !responder_disable_i[resp_num]; end @@ -100,7 +104,7 @@ module ahb_lite_address_decoder #( always @(posedge hclk or negedge hreset_n) begin if (!hreset_n) access_blocked_o <= '0; - else if (|htrans_i && hinitiator_ready_int && |hsel_blocked) + else if (|htrans_q && hinitiator_ready_int_q && |hsel_blocked) access_blocked_o <= hsel_blocked; else access_blocked_o <= '0; @@ -109,16 +113,16 @@ module ahb_lite_address_decoder #( always @(posedge hclk or negedge hreset_n) begin if (!hreset_n) pending_hsel <= '0; - else if (|htrans_i && hinitiator_ready_int) + else if (|htrans_q && hinitiator_ready_int_q) pending_hsel <= hsel_o_int; - else if (hinitiator_ready_int) + else if (hinitiator_ready_int_q) pending_hsel <= '0; end always_comb begin // Only flag errors for NONSEQ or SEQ type transfers // (BUSY transfers require OKAY response) - hresp_error = htrans_i inside {AHB_XFER_NONSEQ, AHB_XFER_SEQ} && hinitiator_ready_int && ~|hsel_o_int; + hresp_error = htrans_q inside {AHB_XFER_NONSEQ, AHB_XFER_SEQ} && hinitiator_ready_int_q && ~|hsel_o_int; end always @(posedge hclk or negedge hreset_n) begin @@ -133,18 +137,19 @@ module ahb_lite_address_decoder #( hresp_error_r <= 1'b0; else if (hresp_error) hresp_error_r <= 1'b1; - else if (hinitiator_ready_int) + else if (hinitiator_ready_int_q) hresp_error_r <= 1'b0; else hresp_error_r <= hresp_error_r; end // Drive the address phase of the AHB Lite Transaction + // For RDC force ready signal when we force the bus idle always_comb begin for (int rr = 0; rr < NUM_RESPONDERS; rr++) begin - hresponderready_o[rr] = hinitiator_ready_int; + hresponderready_o[rr] = hinitiator_ready_int_q; hwrite_o[rr] = hwrite_i; - htrans_o[rr] = htrans_i; + htrans_o[rr] = htrans_q; hsize_o[rr] = hsize_i; haddr_o[rr] = haddr_i; hwdata_o[rr] = hwdata_i; @@ -171,9 +176,27 @@ module ahb_lite_address_decoder #( hinitiator_ready_int = hreadyout_i[rr]; end end + hinitiator_ready_int_q = hinitiator_ready_int | force_bus_idle; end assign hsel_o = hsel_o_int; - assign hinitiatorready_o = hinitiator_ready_int; + assign hinitiatorready_o = hinitiator_ready_int_q; + +//Coverage +`ifndef VERILATOR +`ifdef FCOV + +covergroup ahb_lite_address_decode_cov_grp @(posedge hclk iff hreset_n); + option.per_instance = 1; + + access_blocked_cp: coverpoint |access_blocked_o {option.comment = "Received a transaction to a locked memory region";} + oob_access_cp: coverpoint |htrans_i && ~|hsel_o_int_pre {option.comment = "Received a transaction to an unmapped memory region";} + hresp_cp: coverpoint hresp_o {option.comment = "AHB Response - can be ERROR or OKAY";} +endgroup + + ahb_lite_address_decode_cov_grp ahb_lite_address_decode_cov_grp1 = new(); +`endif +`endif + endmodule diff --git a/src/ahb_lite_bus/rtl/ahb_lite_bus.sv b/src/ahb_lite_bus/rtl/ahb_lite_bus.sv index 0294c0d06..4cc2cc372 100644 --- a/src/ahb_lite_bus/rtl/ahb_lite_bus.sv +++ b/src/ahb_lite_bus/rtl/ahb_lite_bus.sv @@ -45,10 +45,15 @@ module ahb_lite_bus #( output logic [NUM_RESPONDERS-1:0] ahb_lite_resp_access_blocked_o, // ---------------------------------------------- - // Respnder Address Map (Start and End addresses) + // Responder Address Map (Start and End addresses) // ---------------------------------------------- input logic [NUM_RESPONDERS-1:0][AHB_LITE_ADDR_WIDTH-1:0] ahb_lite_start_addr_i, - input logic [NUM_RESPONDERS-1:0][AHB_LITE_ADDR_WIDTH-1:0] ahb_lite_end_addr_i + input logic [NUM_RESPONDERS-1:0][AHB_LITE_ADDR_WIDTH-1:0] ahb_lite_end_addr_i, + + // ---------------------------------------------- + // Force bus idle during uc reset to prevent RDC violations + // ---------------------------------------------- + input logic force_bus_idle ); logic [NUM_RESPONDERS-1:0][AHB_LITE_ADDR_WIDTH-1:0] haddr; @@ -105,7 +110,7 @@ module ahb_lite_bus #( .hsize_i (ahb_lite_initiator.hsize), // Outputs .hresp_o (ahb_lite_initiator.hresp), - .hinitiatorready_o (ahb_lite_initiator.hready), + .hinitiatorready_o (ahb_lite_initiator.hreadyout), .hrdata_o (ahb_lite_initiator.hrdata), // -------------------------------------- @@ -125,8 +130,10 @@ module ahb_lite_bus #( .htrans_o (htrans), .hsize_o (hsize), + .force_bus_idle (force_bus_idle), + // ---------------------------------------------- - // Respnder Disable + // Responder Disable // ---------------------------------------------- .responder_disable_i (ahb_lite_resp_disable_i), .access_blocked_o (ahb_lite_resp_access_blocked_o), diff --git a/src/ahb_lite_bus/rtl/ahb_lite_bus_inf.sv b/src/ahb_lite_bus/rtl/ahb_lite_bus_inf.sv index 74b00cb9c..d21c78be4 100644 --- a/src/ahb_lite_bus/rtl/ahb_lite_bus_inf.sv +++ b/src/ahb_lite_bus/rtl/ahb_lite_bus_inf.sv @@ -43,7 +43,7 @@ interface CALIPTRA_AHB_LITE_BUS_INF modport Initiator_Interface_Ports ( input haddr, hwdata, hwrite, hsize, htrans, // from AHB Initiator to AHB Responder - output hresp, hrdata, hready // from AHB Responder to AHB Initiator + output hresp, hrdata, hreadyout // from AHB Responder to AHB Initiator ); // ------------------------------------------- diff --git a/src/caliptra_prim/config/caliptra_prim.vf b/src/caliptra_prim/config/caliptra_prim.vf new file mode 100644 index 000000000..59740aec8 --- /dev/null +++ b/src/caliptra_prim/config/caliptra_prim.vf @@ -0,0 +1,62 @@ ++incdir+${CALIPTRA_ROOT}/src/integration/rtl ++incdir+${CALIPTRA_ROOT}/src/libs/rtl ++incdir+${CALIPTRA_ROOT}/src/caliptra_prim/rtl ++incdir+${CALIPTRA_ROOT}/src/lc_ctrl/rtl ++incdir+${CALIPTRA_ROOT}/src/caliptra_prim_generic/rtl +${CALIPTRA_ROOT}/src/integration/rtl/config_defines.svh +${CALIPTRA_ROOT}/src/integration/rtl/caliptra_reg_defines.svh +${CALIPTRA_ROOT}/src/libs/rtl/caliptra_sva.svh +${CALIPTRA_ROOT}/src/libs/rtl/caliptra_macros.svh +${CALIPTRA_ROOT}/src/libs/rtl/caliptra_sram.sv +${CALIPTRA_ROOT}/src/libs/rtl/ahb_defines_pkg.sv +${CALIPTRA_ROOT}/src/libs/rtl/caliptra_ahb_srom.sv +${CALIPTRA_ROOT}/src/libs/rtl/apb_slv_sif.sv +${CALIPTRA_ROOT}/src/libs/rtl/ahb_slv_sif.sv +${CALIPTRA_ROOT}/src/libs/rtl/caliptra_icg.sv +${CALIPTRA_ROOT}/src/libs/rtl/clk_gate.sv +${CALIPTRA_ROOT}/src/libs/rtl/caliptra_2ff_sync.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_util_pkg.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_alert_pkg.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_subreg_pkg.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_mubi_pkg.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_cipher_pkg.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_pkg.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_sparse_fsm_pkg.sv +${CALIPTRA_ROOT}/src/lc_ctrl/rtl/lc_ctrl_reg_pkg.sv +${CALIPTRA_ROOT}/src/lc_ctrl/rtl/lc_ctrl_state_pkg.sv +${CALIPTRA_ROOT}/src/lc_ctrl/rtl/lc_ctrl_pkg.sv +${CALIPTRA_ROOT}/src/libs/rtl/ahb_to_reg_adapter.sv +${CALIPTRA_ROOT}/src/caliptra_prim_generic/rtl/caliptra_prim_generic_flop_en.sv +${CALIPTRA_ROOT}/src/caliptra_prim_generic/rtl/caliptra_prim_generic_flop.sv +${CALIPTRA_ROOT}/src/caliptra_prim_generic/rtl/caliptra_prim_generic_buf.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_flop_en.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_cdc_rand_delay.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_flop_2sync.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_lfsr.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_mubi4_sync.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_diff_decode.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_sec_anchor_buf.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_slicer.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_count.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_sparse_fsm_flop.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_dom_and_2share.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_sec_anchor_flop.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_reg_we_check.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_packer_fifo.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_max_tree.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_subreg_arb.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_subreg.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_intr_hw.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_onehot_check.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_mubi8_sync.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_fifo_sync_cnt.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_buf.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_lc_sync.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_alert_receiver.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_flop.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_alert_sender.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_fifo_sync.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_arbiter_ppc.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_sum_tree.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_subreg_ext.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_edge_detector.sv diff --git a/src/caliptra_prim/config/caliptra_prim_pkg.vf b/src/caliptra_prim/config/caliptra_prim_pkg.vf new file mode 100644 index 000000000..dfed9ddd5 --- /dev/null +++ b/src/caliptra_prim/config/caliptra_prim_pkg.vf @@ -0,0 +1,9 @@ ++incdir+${CALIPTRA_ROOT}/src/caliptra_prim/rtl +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_util_pkg.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_alert_pkg.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_subreg_pkg.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_mubi_pkg.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_cipher_pkg.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_pkg.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_sparse_fsm_pkg.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_sparse_fsm_pkg.sv diff --git a/src/caliptra_prim/config/compile.yml b/src/caliptra_prim/config/compile.yml new file mode 100644 index 000000000..70fac1887 --- /dev/null +++ b/src/caliptra_prim/config/compile.yml @@ -0,0 +1,74 @@ +--- +provides: [caliptra_prim_pkg] +schema_version: 2.4.0 +targets: + rtl: + directories: [$COMPILE_ROOT/rtl] + files: + - $COMPILE_ROOT/rtl/caliptra_prim_util_pkg.sv + - $COMPILE_ROOT/rtl/caliptra_prim_alert_pkg.sv + - $COMPILE_ROOT/rtl/caliptra_prim_subreg_pkg.sv + - $COMPILE_ROOT/rtl/caliptra_prim_mubi_pkg.sv + - $COMPILE_ROOT/rtl/caliptra_prim_cipher_pkg.sv + - $COMPILE_ROOT/rtl/caliptra_prim_pkg.sv + - $COMPILE_ROOT/rtl/caliptra_prim_sparse_fsm_pkg.sv + tb: + directories: [$COMPILE_ROOT/rtl] + files: + - $COMPILE_ROOT/rtl/caliptra_prim_util_pkg.sv + - $COMPILE_ROOT/rtl/caliptra_prim_alert_pkg.sv + - $COMPILE_ROOT/rtl/caliptra_prim_subreg_pkg.sv + - $COMPILE_ROOT/rtl/caliptra_prim_mubi_pkg.sv + - $COMPILE_ROOT/rtl/caliptra_prim_cipher_pkg.sv + - $COMPILE_ROOT/rtl/caliptra_prim_pkg.sv + - $COMPILE_ROOT/rtl/caliptra_prim_sparse_fsm_pkg.sv +--- +provides: [caliptra_prim] +schema_version: 2.4.0 +requires: + - libs + - lc_ctrl_pkg + - caliptra_prim_pkg + - caliptra_prim_generic +targets: + rtl: + directories: [$COMPILE_ROOT/rtl] + files: +# - $COMPILE_ROOT/rtl/caliptra_prim_flop_macros.sv + - $COMPILE_ROOT/rtl/caliptra_prim_flop_en.sv + - $COMPILE_ROOT/rtl/caliptra_prim_cdc_rand_delay.sv + - $COMPILE_ROOT/rtl/caliptra_prim_flop_2sync.sv + - $COMPILE_ROOT/rtl/caliptra_prim_lfsr.sv + - $COMPILE_ROOT/rtl/caliptra_prim_mubi4_sync.sv + - $COMPILE_ROOT/rtl/caliptra_prim_diff_decode.sv + - $COMPILE_ROOT/rtl/caliptra_prim_sec_anchor_buf.sv + - $COMPILE_ROOT/rtl/caliptra_prim_slicer.sv +# - $COMPILE_ROOT/rtl/caliptra_prim_assert_dummy_macros.svh + - $COMPILE_ROOT/rtl/caliptra_prim_count.sv +# - $COMPILE_ROOT/rtl/caliptra_prim_assert_yosys_macros.svh + - $COMPILE_ROOT/rtl/caliptra_prim_sparse_fsm_flop.sv + - $COMPILE_ROOT/rtl/caliptra_prim_dom_and_2share.sv + - $COMPILE_ROOT/rtl/caliptra_prim_sec_anchor_flop.sv + - $COMPILE_ROOT/rtl/caliptra_prim_reg_we_check.sv + - $COMPILE_ROOT/rtl/caliptra_prim_packer_fifo.sv + - $COMPILE_ROOT/rtl/caliptra_prim_max_tree.sv + - $COMPILE_ROOT/rtl/caliptra_prim_subreg_arb.sv + - $COMPILE_ROOT/rtl/caliptra_prim_subreg.sv + - $COMPILE_ROOT/rtl/caliptra_prim_intr_hw.sv + - $COMPILE_ROOT/rtl/caliptra_prim_onehot_check.sv + - $COMPILE_ROOT/rtl/caliptra_prim_mubi8_sync.sv + - $COMPILE_ROOT/rtl/caliptra_prim_fifo_sync_cnt.sv + - $COMPILE_ROOT/rtl/caliptra_prim_buf.sv + - $COMPILE_ROOT/rtl/caliptra_prim_lc_sync.sv + - $COMPILE_ROOT/rtl/caliptra_prim_alert_receiver.sv +# - $COMPILE_ROOT/rtl/caliptra_prim_assert_standard_macros.svh + - $COMPILE_ROOT/rtl/caliptra_prim_flop.sv + - $COMPILE_ROOT/rtl/caliptra_prim_alert_sender.sv + - $COMPILE_ROOT/rtl/caliptra_prim_fifo_sync.sv + - $COMPILE_ROOT/rtl/caliptra_prim_arbiter_ppc.sv +# - $COMPILE_ROOT/rtl/caliptra_prim_assert.sv +# - $COMPILE_ROOT/rtl/caliptra_prim_assert_sec_cm.svh + - $COMPILE_ROOT/rtl/caliptra_prim_sum_tree.sv + - $COMPILE_ROOT/rtl/caliptra_prim_subreg_ext.sv + - $COMPILE_ROOT/rtl/caliptra_prim_edge_detector.sv + tops: [caliptra_prim] diff --git a/src/caliptra_prim/lint/caliptra_prim_arbiter.vlt b/src/caliptra_prim/lint/caliptra_prim_arbiter.vlt new file mode 100644 index 000000000..414c503fa --- /dev/null +++ b/src/caliptra_prim/lint/caliptra_prim_arbiter.vlt @@ -0,0 +1,45 @@ +// Copyright lowRISC contributors. +// Licensed under the Apache License, Version 2.0, see LICENSE for details. +// SPDX-License-Identifier: Apache-2.0 + +`verilator_config + +// Tell the Verilator scheduler to split up these variables into +// separate pieces when it's figuring out process scheduling. This +// avoids spurious UNOPTFLAT warnings caused by the fact that the +// arrays feed into themselves (with different bits for different +// positions in the tree). +split_var -module "caliptra_prim_arbiter_fixed" -var "data_tree" +split_var -module "caliptra_prim_arbiter_fixed" -var "gnt_tree" +split_var -module "caliptra_prim_arbiter_fixed" -var "idx_tree" +split_var -module "caliptra_prim_arbiter_fixed" -var "req_tree" + +split_var -module "caliptra_prim_arbiter_tree" -var "req_tree" +split_var -module "caliptra_prim_arbiter_tree" -var "prio_tree" +split_var -module "caliptra_prim_arbiter_tree" -var "sel_tree" +split_var -module "caliptra_prim_arbiter_tree" -var "mask_tree" +split_var -module "caliptra_prim_arbiter_tree" -var "idx_tree" +split_var -module "caliptra_prim_arbiter_tree" -var "data_tree" + +// Waive ALWCOMBORDER warnings about the tree variables. We've got +// lines like "req_tree[Pa] = req_tree[C0] | req_tree[C1];" and it +// seems that the ALWCOMBORDER warning isn't affected by the split_var +// rules above. +lint_off -rule ALWCOMBORDER -file "*/rtl/caliptra_prim_arbiter_fixed.sv" -match "*data_tree*" +lint_off -rule ALWCOMBORDER -file "*/rtl/caliptra_prim_arbiter_fixed.sv" -match "*gnt_tree*" +lint_off -rule ALWCOMBORDER -file "*/rtl/caliptra_prim_arbiter_fixed.sv" -match "*idx_tree*" +lint_off -rule ALWCOMBORDER -file "*/rtl/caliptra_prim_arbiter_fixed.sv" -match "*req_tree*" + +lint_off -rule ALWCOMBORDER -file "*/rtl/caliptra_prim_arbiter_tree.sv" -match "*req_tree*" +lint_off -rule ALWCOMBORDER -file "*/rtl/caliptra_prim_arbiter_tree.sv" -match "*prio_tree*" +lint_off -rule ALWCOMBORDER -file "*/rtl/caliptra_prim_arbiter_tree.sv" -match "*sel_tree*" +lint_off -rule ALWCOMBORDER -file "*/rtl/caliptra_prim_arbiter_tree.sv" -match "*mask_tree*" +lint_off -rule ALWCOMBORDER -file "*/rtl/caliptra_prim_arbiter_tree.sv" -match "*idx_tree*" +lint_off -rule ALWCOMBORDER -file "*/rtl/caliptra_prim_arbiter_tree.sv" -match "*data_tree*" + +lint_off -rule ALWCOMBORDER -file "*/rtl/caliptra_prim_arbiter_ppc.sv" -match "*ppc_out*" + +// Waive unused clk and reset signals: they're just used for +// assertions (which Verilator doesn't see) +lint_off -rule UNUSED -file "*/rtl/caliptra_prim_arbiter_fixed.sv" -match "*clk_i*" +lint_off -rule UNUSED -file "*/rtl/caliptra_prim_arbiter_fixed.sv" -match "*rst_ni*" diff --git a/src/caliptra_prim/lint/caliptra_prim_arbiter.waiver b/src/caliptra_prim/lint/caliptra_prim_arbiter.waiver new file mode 100644 index 000000000..038288027 --- /dev/null +++ b/src/caliptra_prim/lint/caliptra_prim_arbiter.waiver @@ -0,0 +1,13 @@ +# Copyright lowRISC contributors. +# Licensed under the Apache License, Version 2.0, see LICENSE for details. +# SPDX-License-Identifier: Apache-2.0 +# +# waiver file for caliptra_prim_arbiter + +waive -rules PARTIAL_CONST_ASSIGN -location {caliptra_prim_arbiter_*.sv} -regexp {'mask.0.' is conditionally assigned a constant} \ + -comment "makes the code more readable" +waive -rules CONST_FF -location {caliptra_prim_arbiter_*.sv} -regexp {Flip-flop 'mask.0.' is driven by constant} \ + -comment "makes the code more readable" + +waive -rules {HIER_BRANCH_NOT_READ INPUT_NOT_READ} -location {caliptra_prim_arbiter_fixed.sv} -regexp {.*'(clk_i|rst_ni)' is not read from in module 'caliptra_prim_arbiter_fixed'.*} \ + -comment "clk_ and rst_ni are only used for assertions in this module." diff --git a/src/prim/lint/prim_max_tree.vlt b/src/caliptra_prim/lint/caliptra_prim_max_tree.vlt similarity index 58% rename from src/prim/lint/prim_max_tree.vlt rename to src/caliptra_prim/lint/caliptra_prim_max_tree.vlt index fe2485c89..c26d4121b 100644 --- a/src/prim/lint/prim_max_tree.vlt +++ b/src/caliptra_prim/lint/caliptra_prim_max_tree.vlt @@ -9,10 +9,10 @@ // avoids spurious UNOPTFLAT warnings caused by the fact that the // arrays feed into themselves (with different bits for different // positions in the tree). -split_var -module "prim_max_tree" -var "max_tree" -split_var -module "prim_max_tree" -var "vld_tree" -split_var -module "prim_max_tree" -var "idx_tree" +split_var -module "caliptra_prim_max_tree" -var "max_tree" +split_var -module "caliptra_prim_max_tree" -var "vld_tree" +split_var -module "caliptra_prim_max_tree" -var "idx_tree" // The clock and reset are only used for assertions in this module. -lint_off -rule UNUSED -file "*/rtl/prim_max_tree.sv" -match "Signal is not used: 'clk_i'" -lint_off -rule UNUSED -file "*/rtl/prim_max_tree.sv" -match "Signal is not used: 'rst_ni'" +lint_off -rule UNUSED -file "*/rtl/caliptra_prim_max_tree.sv" -match "Signal is not used: 'clk_i'" +lint_off -rule UNUSED -file "*/rtl/caliptra_prim_max_tree.sv" -match "Signal is not used: 'rst_ni'" diff --git a/src/prim/lint/prim_sum_tree.waiver b/src/caliptra_prim/lint/caliptra_prim_max_tree.waiver similarity index 51% rename from src/prim/lint/prim_sum_tree.waiver rename to src/caliptra_prim/lint/caliptra_prim_max_tree.waiver index 7f2fa7c93..64e911834 100644 --- a/src/prim/lint/prim_sum_tree.waiver +++ b/src/caliptra_prim/lint/caliptra_prim_max_tree.waiver @@ -2,7 +2,7 @@ # Licensed under the Apache License, Version 2.0, see LICENSE for details. # SPDX-License-Identifier: Apache-2.0 # -# waiver file for prim_arbiter +# waiver file for caliptra_prim_arbiter -waive -rules {HIER_BRANCH_NOT_READ INPUT_NOT_READ} -location {prim_sum_tree.sv} -regexp {.*'(clk_i|rst_ni)' is not read from in module 'prim_sum_tree'.*} \ +waive -rules {HIER_BRANCH_NOT_READ INPUT_NOT_READ} -location {caliptra_prim_max_tree.sv} -regexp {.*'(clk_i|rst_ni)' is not read from in module 'caliptra_prim_max_tree'.*} \ -comment "clk_ and rst_ni are only used for assertions in this module." diff --git a/src/prim/lint/prim_onehot_check.vlt b/src/caliptra_prim/lint/caliptra_prim_onehot_check.vlt similarity index 57% rename from src/prim/lint/prim_onehot_check.vlt rename to src/caliptra_prim/lint/caliptra_prim_onehot_check.vlt index d7d927bae..26796713c 100644 --- a/src/prim/lint/prim_onehot_check.vlt +++ b/src/caliptra_prim/lint/caliptra_prim_onehot_check.vlt @@ -9,14 +9,14 @@ // avoids spurious UNOPTFLAT warnings caused by the fact that the // arrays feed into themselves (with different bits for different // positions in the tree). -split_var -module "prim_onehot_check" -var "or_tree" -split_var -module "prim_onehot_check" -var "and_tree" -split_var -module "prim_onehot_check" -var "err_tree" +split_var -module "caliptra_prim_onehot_check" -var "or_tree" +split_var -module "caliptra_prim_onehot_check" -var "and_tree" +split_var -module "caliptra_prim_onehot_check" -var "err_tree" // The clock and reset are only used for assertions in this module. -lint_off -rule UNUSED -file "*/rtl/prim_onehot_check.sv" -match "Signal is not used: 'clk_i'" -lint_off -rule UNUSED -file "*/rtl/prim_onehot_check.sv" -match "Signal is not used: 'rst_ni'" +lint_off -rule UNUSED -file "*/rtl/caliptra_prim_onehot_check.sv" -match "Signal is not used: 'clk_i'" +lint_off -rule UNUSED -file "*/rtl/caliptra_prim_onehot_check.sv" -match "Signal is not used: 'rst_ni'" // The EnableAlertTriggerSVA parameter is only used by modules bound // in for DV testing. Waive the warning that we don't read it. -lint_off -rule UNUSED -file "*/rtl/prim_onehot_check.sv" -match "*EnableAlertTriggerSVA*" +lint_off -rule UNUSED -file "*/rtl/caliptra_prim_onehot_check.sv" -match "*EnableAlertTriggerSVA*" diff --git a/src/caliptra_prim/lint/caliptra_prim_onehot_check.waiver b/src/caliptra_prim/lint/caliptra_prim_onehot_check.waiver new file mode 100644 index 000000000..15ca76824 --- /dev/null +++ b/src/caliptra_prim/lint/caliptra_prim_onehot_check.waiver @@ -0,0 +1,11 @@ +# Copyright lowRISC contributors. +# Licensed under the Apache License, Version 2.0, see LICENSE for details. +# SPDX-License-Identifier: Apache-2.0 +# +# waiver file for caliptra_prim_onehot_check + +waive -rules {HIER_BRANCH_NOT_READ INPUT_NOT_READ} -location {caliptra_prim_onehot_check.sv} -regexp {.*'(clk_i|rst_ni)' is not read from in module 'caliptra_prim_onehot_check'.*} \ + -comment "clk_ and rst_ni are only used for assertions in this module." + +waive -rules {PARAM_NOT_USED} -location {caliptra_prim_onehot_check.sv} -regexp {.*EnableAlertTriggerSVA.*} \ + -comment "The disable parameter is used only during DV / FPV." diff --git a/src/prim/lint/prim_sum_tree.vlt b/src/caliptra_prim/lint/caliptra_prim_sum_tree.vlt similarity index 62% rename from src/prim/lint/prim_sum_tree.vlt rename to src/caliptra_prim/lint/caliptra_prim_sum_tree.vlt index bb990bd78..bc0ec8f77 100644 --- a/src/prim/lint/prim_sum_tree.vlt +++ b/src/caliptra_prim/lint/caliptra_prim_sum_tree.vlt @@ -9,9 +9,9 @@ // avoids spurious UNOPTFLAT warnings caused by the fact that the // arrays feed into themselves (with different bits for different // positions in the tree). -split_var -module "prim_sum_tree" -var "sum_tree" -split_var -module "prim_sum_tree" -var "vld_tree" +split_var -module "caliptra_prim_sum_tree" -var "sum_tree" +split_var -module "caliptra_prim_sum_tree" -var "vld_tree" // The clock and reset are only used for assertions in this module. -lint_off -rule UNUSED -file "*/rtl/prim_sum_tree.sv" -match "Signal is not used: 'clk_i'" -lint_off -rule UNUSED -file "*/rtl/prim_sum_tree.sv" -match "Signal is not used: 'rst_ni'" +lint_off -rule UNUSED -file "*/rtl/caliptra_prim_sum_tree.sv" -match "Signal is not used: 'clk_i'" +lint_off -rule UNUSED -file "*/rtl/caliptra_prim_sum_tree.sv" -match "Signal is not used: 'rst_ni'" diff --git a/src/prim/lint/prim_max_tree.waiver b/src/caliptra_prim/lint/caliptra_prim_sum_tree.waiver similarity index 51% rename from src/prim/lint/prim_max_tree.waiver rename to src/caliptra_prim/lint/caliptra_prim_sum_tree.waiver index 870802010..987be5cd1 100644 --- a/src/prim/lint/prim_max_tree.waiver +++ b/src/caliptra_prim/lint/caliptra_prim_sum_tree.waiver @@ -2,7 +2,7 @@ # Licensed under the Apache License, Version 2.0, see LICENSE for details. # SPDX-License-Identifier: Apache-2.0 # -# waiver file for prim_arbiter +# waiver file for caliptra_prim_arbiter -waive -rules {HIER_BRANCH_NOT_READ INPUT_NOT_READ} -location {prim_max_tree.sv} -regexp {.*'(clk_i|rst_ni)' is not read from in module 'prim_max_tree'.*} \ +waive -rules {HIER_BRANCH_NOT_READ INPUT_NOT_READ} -location {caliptra_prim_sum_tree.sv} -regexp {.*'(clk_i|rst_ni)' is not read from in module 'caliptra_prim_sum_tree'.*} \ -comment "clk_ and rst_ni are only used for assertions in this module." diff --git a/src/prim/rtl/prim_alert_pkg.sv b/src/caliptra_prim/rtl/caliptra_prim_alert_pkg.sv similarity index 90% rename from src/prim/rtl/prim_alert_pkg.sv rename to src/caliptra_prim/rtl/caliptra_prim_alert_pkg.sv index a3594b619..1f9935a4c 100644 --- a/src/prim/rtl/prim_alert_pkg.sv +++ b/src/caliptra_prim/rtl/caliptra_prim_alert_pkg.sv @@ -2,7 +2,7 @@ // Licensed under the Apache License, Version 2.0, see LICENSE for details. // SPDX-License-Identifier: Apache-2.0 -package prim_alert_pkg; +package caliptra_prim_alert_pkg; typedef struct packed { logic alert_p; @@ -24,4 +24,4 @@ package prim_alert_pkg; ack_p: 1'b0, ack_n: 1'b1}; -endpackage : prim_alert_pkg +endpackage : caliptra_prim_alert_pkg diff --git a/src/prim/rtl/prim_alert_receiver.sv b/src/caliptra_prim/rtl/caliptra_prim_alert_receiver.sv similarity index 95% rename from src/prim/rtl/prim_alert_receiver.sv rename to src/caliptra_prim/rtl/caliptra_prim_alert_receiver.sv index dc0632267..0421cb953 100644 --- a/src/prim/rtl/prim_alert_receiver.sv +++ b/src/caliptra_prim/rtl/caliptra_prim_alert_receiver.sv @@ -25,13 +25,13 @@ // Note that in case of synchronous operation, alerts on the diffpair are // decoded combinationally and forwarded on alert_o within the same cycle. // -// See also: prim_alert_sender, prim_diff_decode, alert_handler +// See also: caliptra_prim_alert_sender, caliptra_prim_diff_decode, alert_handler -`include "prim_assert.sv" +`include "caliptra_prim_assert.sv" -module prim_alert_receiver - import prim_alert_pkg::*; - import prim_mubi_pkg::mubi4_t; +module caliptra_prim_alert_receiver + import caliptra_prim_alert_pkg::*; + import caliptra_prim_mubi_pkg::mubi4_t; #( // enables additional synchronization logic parameter bit AsyncOn = 1'b0 @@ -56,7 +56,7 @@ module prim_alert_receiver input alert_tx_t alert_tx_i ); - import prim_mubi_pkg::mubi4_test_true_strict; + import caliptra_prim_mubi_pkg::mubi4_test_true_strict; ///////////////////////////////// // decode differential signals // @@ -64,16 +64,16 @@ module prim_alert_receiver logic alert_level, alert_sigint, alert_p, alert_n; // This prevents further tool optimizations of the differential signal. - prim_sec_anchor_buf #( + caliptra_prim_sec_anchor_buf #( .Width(2) - ) u_prim_buf_in ( + ) u_caliptra_prim_buf_in ( .in_i({alert_tx_i.alert_n, alert_tx_i.alert_p}), .out_o({alert_n, alert_p}) ); - prim_diff_decode #( + caliptra_prim_diff_decode #( .AsyncOn(AsyncOn) ) u_decode_alert ( .clk_i, @@ -112,10 +112,10 @@ module prim_alert_receiver assign ping_tog_dn = ~ping_tog_pd; // This prevents further tool optimizations of the differential signal. - prim_sec_anchor_flop #( + caliptra_prim_sec_anchor_flop #( .Width (2), .ResetValue(2'b10) - ) u_prim_generic_flop_ack ( + ) u_caliptra_prim_generic_flop_ack ( .clk_i, .rst_ni, .d_i({ack_dn, @@ -124,10 +124,10 @@ module prim_alert_receiver ack_pq}) ); - prim_sec_anchor_flop #( + caliptra_prim_sec_anchor_flop #( .Width (2), .ResetValue(2'b10) - ) u_prim_generic_flop_ping ( + ) u_caliptra_prim_generic_flop_ping ( .clk_i, .rst_ni, .d_i({ping_tog_dn, @@ -268,8 +268,8 @@ module prim_alert_receiver // assertions // //////////////// -`ifdef INC_ASSERT - import prim_mubi_pkg::mubi4_test_false_loose; +`ifdef CALIPTRA_INC_ASSERT + import caliptra_prim_mubi_pkg::mubi4_test_false_loose; `endif // check whether all outputs have a good known state after reset @@ -383,4 +383,4 @@ module prim_alert_receiver |-> ping_ok_o) -endmodule : prim_alert_receiver +endmodule : caliptra_prim_alert_receiver diff --git a/src/prim/rtl/prim_alert_sender.sv b/src/caliptra_prim/rtl/caliptra_prim_alert_sender.sv similarity index 94% rename from src/prim/rtl/prim_alert_sender.sv rename to src/caliptra_prim/rtl/caliptra_prim_alert_sender.sv index e945482e9..b2f0ad09e 100644 --- a/src/prim/rtl/prim_alert_sender.sv +++ b/src/caliptra_prim/rtl/caliptra_prim_alert_sender.sv @@ -3,7 +3,7 @@ // SPDX-License-Identifier: Apache-2.0 // // The alert sender primitive module differentially encodes and transmits an -// alert signal to the prim_alert_receiver module. An alert will be signalled +// alert signal to the caliptra_prim_alert_receiver module. An alert will be signalled // by a full handshake on alert_p/n and ack_p/n. The alert_req_i signal may // be continuously asserted, in which case the alert signalling handshake // will be repeatedly initiated. @@ -37,12 +37,12 @@ // to the receiver by placing an inconsistent diff value on the differential // output (and continuously toggling it). // -// See also: prim_alert_receiver, prim_diff_decode, alert_handler +// See also: caliptra_prim_alert_receiver, caliptra_prim_diff_decode, alert_handler -`include "prim_assert.sv" +`include "caliptra_prim_assert.sv" -module prim_alert_sender - import prim_alert_pkg::*; +module caliptra_prim_alert_sender + import caliptra_prim_alert_pkg::*; #( // enables additional synchronization logic parameter bit AsyncOn = 1'b1, @@ -72,16 +72,16 @@ module prim_alert_sender logic ping_sigint, ping_event, ping_n, ping_p; // This prevents further tool optimizations of the differential signal. - prim_sec_anchor_buf #( + caliptra_prim_sec_anchor_buf #( .Width(2) - ) u_prim_buf_ping ( + ) u_caliptra_prim_buf_ping ( .in_i({alert_rx_i.ping_n, alert_rx_i.ping_p}), .out_o({ping_n, ping_p}) ); - prim_diff_decode #( + caliptra_prim_diff_decode #( .AsyncOn(AsyncOn) ) u_decode_ping ( .clk_i, @@ -98,16 +98,16 @@ module prim_alert_sender logic ack_sigint, ack_level, ack_n, ack_p; // This prevents further tool optimizations of the differential signal. - prim_sec_anchor_buf #( + caliptra_prim_sec_anchor_buf #( .Width(2) - ) u_prim_buf_ack ( + ) u_caliptra_prim_buf_ack ( .in_i({alert_rx_i.ack_n, alert_rx_i.ack_p}), .out_o({ack_n, ack_p}) ); - prim_diff_decode #( + caliptra_prim_diff_decode #( .AsyncOn(AsyncOn) ) u_decode_ack ( .clk_i, @@ -153,9 +153,9 @@ module prim_alert_sender // if handshake is ongoing, capture additional alert requests. logic alert_req; - prim_sec_anchor_buf #( + caliptra_prim_sec_anchor_buf #( .Width(1) - ) u_prim_buf_in_req ( + ) u_caliptra_prim_buf_in_req ( .in_i(alert_req_i), .out_o(alert_req) ); @@ -262,10 +262,10 @@ module prim_alert_sender end // This prevents further tool optimizations of the differential signal. - prim_sec_anchor_flop #( + caliptra_prim_sec_anchor_flop #( .Width (2), .ResetValue(2'b10) - ) u_prim_flop_alert ( + ) u_caliptra_prim_flop_alert ( .clk_i, .rst_ni, .d_i({alert_nd, alert_pd}), @@ -292,8 +292,8 @@ module prim_alert_sender //////////////// // however, since we use sequence constructs below, we need to wrap the entire block again. -// typically, the CALIPTRA_ASSERT macros already contain this INC_ASSERT macro. -`ifdef INC_ASSERT +// typically, the CALIPTRA_ASSERT macros already contain this CALIPTRA_INC_ASSERT macro. +`ifdef CALIPTRA_INC_ASSERT // check whether all outputs have a good known state after reset `CALIPTRA_ASSERT_KNOWN(AlertPKnownO_A, alert_tx_o) @@ -389,4 +389,4 @@ module prim_alert_sender `CALIPTRA_ASSUME_FPV(TriggerAlertInit_S, $stable(rst_ni) == 0 |=> alert_rx_i.ping_p == alert_rx_i.ping_n) `CALIPTRA_ASSUME_FPV(PingDiffPair_S, ##2 alert_rx_i.ping_p != alert_rx_i.ping_n) `endif -endmodule : prim_alert_sender +endmodule : caliptra_prim_alert_sender diff --git a/src/prim/rtl/prim_arbiter_ppc.sv b/src/caliptra_prim/rtl/caliptra_prim_arbiter_ppc.sv similarity index 98% rename from src/prim/rtl/prim_arbiter_ppc.sv rename to src/caliptra_prim/rtl/caliptra_prim_arbiter_ppc.sv index cb160116c..f3275abd5 100644 --- a/src/prim/rtl/prim_arbiter_ppc.sv +++ b/src/caliptra_prim/rtl/caliptra_prim_arbiter_ppc.sv @@ -20,11 +20,11 @@ // until they have been served. This assertion can be gated by driving the req_chk_i low. This is // a non-functional input and does not affect the designs behavior. // -// See also: prim_arbiter_tree +// See also: caliptra_prim_arbiter_tree -`include "prim_assert.sv" +`include "caliptra_prim_assert.sv" -module prim_arbiter_ppc #( +module caliptra_prim_arbiter_ppc #( parameter int unsigned N = 8, parameter int unsigned DW = 32, @@ -222,4 +222,4 @@ end req_i[k], clk_i, !rst_ni || !req_chk_i) `endif -endmodule : prim_arbiter_ppc +endmodule : caliptra_prim_arbiter_ppc diff --git a/src/prim/rtl/prim_assert.sv b/src/caliptra_prim/rtl/caliptra_prim_assert.sv similarity index 91% rename from src/prim/rtl/prim_assert.sv rename to src/caliptra_prim/rtl/caliptra_prim_assert.sv index 77539d3f2..7a91601a9 100644 --- a/src/prim/rtl/prim_assert.sv +++ b/src/caliptra_prim/rtl/caliptra_prim_assert.sv @@ -7,7 +7,7 @@ // - Provides boiler plate template for common assertions `ifndef PRIM_ASSERT_SV -`define PRIM_ASSERT_SV +`define CALIPTRA_PRIM_ASSERT_SV /////////////////// // Helper macros // @@ -21,7 +21,7 @@ `endif // Converts an arbitrary block of code into a Verilog string -`define PRIM_STRINGIFY(__x) `"__x`" +`define CALIPTRA_PRIM_STRINGIFY(__x) `"__x`" // CALIPTRA_ASSERT_ERROR logs an error message with either `uvm_error or with $error. // @@ -29,11 +29,11 @@ // for redefining it here is to avoid creating a dependency. `define CALIPTRA_ASSERT_ERROR(__name) \ `ifdef UVM \ - uvm_pkg::uvm_report_error("CALIPTRA_ASSERT FAILED", `PRIM_STRINGIFY(__name), uvm_pkg::UVM_NONE, \ + uvm_pkg::uvm_report_error("CALIPTRA_ASSERT FAILED", `CALIPTRA_PRIM_STRINGIFY(__name), uvm_pkg::UVM_NONE, \ `__FILE__, `__LINE__, "", 1); \ `else \ $error("%0t: (%0s:%0d) [%m] [CALIPTRA_ASSERT FAILED] %0s", $time, `__FILE__, `__LINE__, \ - `PRIM_STRINGIFY(__name)); \ + `CALIPTRA_PRIM_STRINGIFY(__name)); \ `endif // This macro is suitable for conditionally triggering lint errors, e.g., if a Sec parameter takes @@ -59,8 +59,8 @@ // the same thing in each case (except for the dummy flavour), but in a way that the respective // tools support. // -// If the tool supports assertions in some form, we also define INC_ASSERT (which can be used to -// hide signal definitions that are only used for assertions). +// If the tool supports assertions in some form, we also define CALIPTRA_INC_ASSERT (which can be +// used to hide signal definitions that are only used for assertions). // // The list of basic macros supported is: // @@ -94,15 +94,15 @@ // CALIPTRA_ASSUME_I: Assume an immediate property `ifdef VERILATOR - `include "prim_assert_dummy_macros.svh" + `include "caliptra_prim_assert_dummy_macros.svh" `elsif SYNTHESIS - `include "prim_assert_dummy_macros.svh" + `include "caliptra_prim_assert_dummy_macros.svh" `elsif YOSYS - `include "prim_assert_yosys_macros.svh" - `define INC_ASSERT + `include "caliptra_prim_assert_yosys_macros.svh" + `define CALIPTRA_INC_ASSERT `else - `include "prim_assert_standard_macros.svh" - `define INC_ASSERT + `include "caliptra_prim_assert_standard_macros.svh" + `define CALIPTRA_INC_ASSERT `endif ////////////////////////////// @@ -159,7 +159,7 @@ // Create a small "gray" window beyond the usual rst time to avoid // checking. `define CALIPTRA_ASSERT_FPV_LINEAR_FSM(__name, __state, __type, __clk = `CALIPTRA_ASSERT_DEFAULT_CLK, __rst = `CALIPTRA_ASSERT_DEFAULT_RST) \ - `ifdef INC_ASSERT \ + `ifdef CALIPTRA_INC_ASSERT \ bit __name``_cond; \ always_ff @(posedge __clk or posedge __rst) begin \ if (__rst) begin \ @@ -176,7 +176,7 @@ `CALIPTRA_ASSERT(__name, __name``_p, __clk, __rst) \ `endif -`include "prim_assert_sec_cm.svh" -`include "prim_flop_macros.sv" +`include "caliptra_prim_assert_sec_cm.svh" +`include "caliptra_prim_flop_macros.sv" `endif // PRIM_ASSERT_SV diff --git a/src/prim/rtl/prim_assert_dummy_macros.svh b/src/caliptra_prim/rtl/caliptra_prim_assert_dummy_macros.svh similarity index 85% rename from src/prim/rtl/prim_assert_dummy_macros.svh rename to src/caliptra_prim/rtl/caliptra_prim_assert_dummy_macros.svh index a868a9a29..047bb9a58 100644 --- a/src/prim/rtl/prim_assert_dummy_macros.svh +++ b/src/caliptra_prim/rtl/caliptra_prim_assert_dummy_macros.svh @@ -2,8 +2,8 @@ // Licensed under the Apache License, Version 2.0, see LICENSE for details. // SPDX-License-Identifier: Apache-2.0 -// Macro bodies included by prim_assert.sv for tools that don't support assertions. See -// prim_assert.sv for documentation for each of the macros. +// Macro bodies included by caliptra_prim_assert.sv for tools that don't support assertions. See +// caliptra_prim_assert.sv for documentation for each of the macros. `define CALIPTRA_ASSERT_I(__name, __prop) `define CALIPTRA_ASSERT_INIT(__name, __prop) diff --git a/src/caliptra_prim/rtl/caliptra_prim_assert_sec_cm.svh b/src/caliptra_prim/rtl/caliptra_prim_assert_sec_cm.svh new file mode 100644 index 000000000..096b7b61f --- /dev/null +++ b/src/caliptra_prim/rtl/caliptra_prim_assert_sec_cm.svh @@ -0,0 +1,48 @@ +// Copyright lowRISC contributors. +// Licensed under the Apache License, Version 2.0, see LICENSE for details. +// SPDX-License-Identifier: Apache-2.0 + +// // Macros and helper code for security countermeasures. + +`ifndef PRIM_ASSERT_SEC_CM_SVH +`define CALIPTRA_PRIM_ASSERT_SEC_CM_SVH + +`define _CALIPTRA_SEC_CM_ALERT_MAX_CYC 30 + +// Helper macros +`define CALIPTRA_ASSERT_ERROR_TRIGGER_ALERT(NAME_, PRIM_HIER_, ALERT_, GATE_, MAX_CYCLES_, ERR_NAME_) \ + `CALIPTRA_ASSERT(FpvSecCm``NAME_``, \ + $rose(PRIM_HIER_.ERR_NAME_) && !(GATE_) \ + |-> ##[0:MAX_CYCLES_] (ALERT_.alert_p)) \ + `ifdef CALIPTRA_INC_ASSERT \ + assign PRIM_HIER_.unused_assert_connected = 1'b1; \ + `endif \ + `CALIPTRA_ASSUME_FPV(``NAME_``TriggerAfterAlertInit_S, $stable(rst_ni) == 0 |-> \ + PRIM_HIER_.ERR_NAME_ == 0 [*10]) + +`define CALIPTRA_ASSERT_ERROR_TRIGGER_ERR(NAME_, PRIM_HIER_, ERR_, GATE_, MAX_CYCLES_, ERR_NAME_, CLK_, RST_) \ + `CALIPTRA_ASSERT(FpvSecCm``NAME_``, \ + $rose(PRIM_HIER_.ERR_NAME_) && !(GATE_) \ + |-> ##[0:MAX_CYCLES_] (ERR_), CLK_, RST_) \ + `ifdef CALIPTRA_INC_ASSERT \ + assign PRIM_HIER_.unused_assert_connected = 1'b1; \ + `endif + +// macros for security countermeasures that will trigger alert +`define CALIPTRA_ASSERT_PRIM_COUNT_ERROR_TRIGGER_ALERT(NAME_, PRIM_HIER_, ALERT_, GATE_ = 0, MAX_CYCLES_ = `_CALIPTRA_SEC_CM_ALERT_MAX_CYC) \ + `CALIPTRA_ASSERT_ERROR_TRIGGER_ALERT(NAME_, PRIM_HIER_, ALERT_, GATE_, MAX_CYCLES_, err_o) + +`define CALIPTRA_ASSERT_PRIM_DOUBLE_LFSR_ERROR_TRIGGER_ALERT(NAME_, PRIM_HIER_, ALERT_, GATE_ = 0, MAX_CYCLES_ = `_CALIPTRA_SEC_CM_ALERT_MAX_CYC) \ + `CALIPTRA_ASSERT_ERROR_TRIGGER_ALERT(NAME_, PRIM_HIER_, ALERT_, GATE_, MAX_CYCLES_, err_o) + +`define CALIPTRA_ASSERT_PRIM_FSM_ERROR_TRIGGER_ALERT(NAME_, PRIM_HIER_, ALERT_, GATE_ = 0, MAX_CYCLES_ = `_CALIPTRA_SEC_CM_ALERT_MAX_CYC) \ + `CALIPTRA_ASSERT_ERROR_TRIGGER_ALERT(NAME_, PRIM_HIER_, ALERT_, GATE_, MAX_CYCLES_, unused_err_o) + +`define CALIPTRA_ASSERT_PRIM_ONEHOT_ERROR_TRIGGER_ALERT(NAME_, PRIM_HIER_, ALERT_, GATE_ = 0, MAX_CYCLES_ = `_CALIPTRA_SEC_CM_ALERT_MAX_CYC) \ + `CALIPTRA_ASSERT_ERROR_TRIGGER_ALERT(NAME_, PRIM_HIER_, ALERT_, GATE_, MAX_CYCLES_, err_o) + +`define CALIPTRA_ASSERT_PRIM_REG_WE_ONEHOT_ERROR_TRIGGER_ALERT(NAME_, REG_TOP_HIER_, ALERT_, GATE_ = 0, MAX_CYCLES_ = `_CALIPTRA_SEC_CM_ALERT_MAX_CYC) \ + `CALIPTRA_ASSERT_PRIM_ONEHOT_ERROR_TRIGGER_ALERT(NAME_, \ + REG_TOP_HIER_.u_caliptra_prim_reg_we_check.u_caliptra_prim_onehot_check, ALERT_, GATE_, MAX_CYCLES_) + +`endif // PRIM_ASSERT_SEC_CM_SVH diff --git a/src/prim/rtl/prim_assert_standard_macros.svh b/src/caliptra_prim/rtl/caliptra_prim_assert_standard_macros.svh similarity index 96% rename from src/prim/rtl/prim_assert_standard_macros.svh rename to src/caliptra_prim/rtl/caliptra_prim_assert_standard_macros.svh index 611cd366d..966906340 100644 --- a/src/prim/rtl/prim_assert_standard_macros.svh +++ b/src/caliptra_prim/rtl/caliptra_prim_assert_standard_macros.svh @@ -2,8 +2,8 @@ // Licensed under the Apache License, Version 2.0, see LICENSE for details. // SPDX-License-Identifier: Apache-2.0 -// Macro bodies included by prim_assert.sv for tools that support full SystemVerilog and SVA syntax. -// See prim_assert.sv for documentation for each of the macros. +// Macro bodies included by caliptra_prim_assert.sv for tools that support full SystemVerilog and SVA syntax. +// See caliptra_prim_assert.sv for documentation for each of the macros. `define CALIPTRA_ASSERT_I(__name, __prop) \ __name: assert (__prop) \ diff --git a/src/prim/rtl/prim_assert_yosys_macros.svh b/src/caliptra_prim/rtl/caliptra_prim_assert_yosys_macros.svh similarity index 95% rename from src/prim/rtl/prim_assert_yosys_macros.svh rename to src/caliptra_prim/rtl/caliptra_prim_assert_yosys_macros.svh index c5d237c8a..f47b5b796 100644 --- a/src/prim/rtl/prim_assert_yosys_macros.svh +++ b/src/caliptra_prim/rtl/caliptra_prim_assert_yosys_macros.svh @@ -2,7 +2,7 @@ // Licensed under the Apache License, Version 2.0, see LICENSE for details. // SPDX-License-Identifier: Apache-2.0 -// Macro bodies included by prim_assert.sv for formal verification with Yosys. See prim_assert.sv +// Macro bodies included by caliptra_prim_assert.sv for formal verification with Yosys. See caliptra_prim_assert.sv // for documentation for each of the macros. `define CALIPTRA_ASSERT_I(__name, __prop) \ diff --git a/src/prim/rtl/prim_buf.sv b/src/caliptra_prim/rtl/caliptra_prim_buf.sv similarity index 75% rename from src/prim/rtl/prim_buf.sv rename to src/caliptra_prim/rtl/caliptra_prim_buf.sv index d0e5839fb..5567894bc 100755 --- a/src/prim/rtl/prim_buf.sv +++ b/src/caliptra_prim/rtl/caliptra_prim_buf.sv @@ -6,7 +6,7 @@ // Used parser: Verible `ifndef PRIM_DEFAULT_IMPL - `define PRIM_DEFAULT_IMPL prim_pkg::ImplGeneric + `define CALIPTRA_PRIM_DEFAULT_IMPL caliptra_prim_pkg::ImplGeneric `endif // This is to prevent AscentLint warnings in the generated @@ -14,7 +14,7 @@ // use. TODO: we may want to move these inline waivers // into a separate, generated waiver file for consistency. //ri lint_check_off OUTPUT_NOT_DRIVEN INPUT_NOT_READ HIER_BRANCH_NOT_READ -module prim_buf +module caliptra_prim_buf #( parameter int Width = 1 @@ -22,16 +22,16 @@ parameter int Width = 1 input [Width-1:0] in_i, output logic [Width-1:0] out_o ); - parameter prim_pkg::impl_e Impl = `PRIM_DEFAULT_IMPL; + parameter caliptra_prim_pkg::impl_e Impl = `CALIPTRA_PRIM_DEFAULT_IMPL; -if (Impl == prim_pkg::ImplXilinx) begin : gen_xilinx - prim_xilinx_buf #( +if (Impl == caliptra_prim_pkg::ImplXilinx) begin : gen_xilinx + caliptra_prim_xilinx_buf #( .Width(Width) ) u_impl_xilinx ( .* ); end else begin : gen_generic - prim_generic_buf #( + caliptra_prim_generic_buf #( .Width(Width) ) u_impl_generic ( .* diff --git a/src/caliptra_prim/rtl/caliptra_prim_cdc_rand_delay.sv b/src/caliptra_prim/rtl/caliptra_prim_cdc_rand_delay.sv new file mode 100644 index 000000000..8b63739c3 --- /dev/null +++ b/src/caliptra_prim/rtl/caliptra_prim_cdc_rand_delay.sv @@ -0,0 +1,63 @@ +// Copyright lowRISC contributors. +// Licensed under the Apache License, Version 2.0, see LICENSE for details. +// SPDX-License-Identifier: Apache-2.0 + +// This module should be instantiated within flops of CDC synchronization primitives, +// and allows DV to model real CDC delays within simulations, especially useful at the chip level +// or in IPs that communicate across clock domains. +// +// The instrumentation is very simple: when this is enabled the input into the first +// synchronizer flop has a mux where the select is randomly set. One of the mux inputs is the input +// of this module, and the other is the output of the first flop: selecting the latter models the +// effect of the first flop missing the input transition. +// +// Notice the delay should cause the input to be skipped by at most a single cycle. As a perhaps +// unnecessary precaution, the select will only be allowed to be random when the input changes. + +module caliptra_prim_cdc_rand_delay #( + parameter int DataWidth = 1, + parameter bit Enable = 1 +) ( + input logic clk_i, + input logic rst_ni, + input logic [DataWidth-1:0] prev_data_i, + input logic [DataWidth-1:0] src_data_i, + output logic [DataWidth-1:0] dst_data_o +); +`ifdef CALIPTRA_SIMULATION + if (Enable) begin : gen_enable + + // This controls dst_data_o: any bit with its data_sel set uses prev_data_i, others use + // src_data_i. + bit [DataWidth-1:0] data_sel; + bit cdc_instrumentation_enabled; + + function automatic bit [DataWidth-1:0] fast_randomize(); + bit [DataWidth-1:0] data; + bit [31:0] urandom_result; + for (int i = 0; i < DataWidth; i += 32) begin + data = data << 32; + urandom_result = $urandom(); + data = data | urandom_result; + end + return data; + endfunction + + initial begin + void'($value$plusargs("cdc_instrumentation_enabled=%d", cdc_instrumentation_enabled)); + data_sel = '0; + end + + // Set data_sel at random combinationally when the input changes. + always @(src_data_i) begin + data_sel = cdc_instrumentation_enabled ? fast_randomize() : 0; + end + + always_comb dst_data_o = (prev_data_i & data_sel) | (src_data_i & ~data_sel); + end else begin : gen_no_enable + assign dst_data_o = src_data_i; + end +`else // CALIPTRA_SIMULATION + assign dst_data_o = src_data_i; +`endif // CALIPTRA_SIMULATION +endmodule diff --git a/src/prim/rtl/prim_cipher_pkg.sv b/src/caliptra_prim/rtl/caliptra_prim_cipher_pkg.sv similarity index 99% rename from src/prim/rtl/prim_cipher_pkg.sv rename to src/caliptra_prim/rtl/caliptra_prim_cipher_pkg.sv index 742c92536..a9f9532a2 100644 --- a/src/prim/rtl/prim_cipher_pkg.sv +++ b/src/caliptra_prim/rtl/caliptra_prim_cipher_pkg.sv @@ -5,7 +5,7 @@ // This package holds common constants and functions for PRESENT- and // PRINCE-based scrambling devices. // -// See also: prim_present, prim_prince +// See also: caliptra_prim_present, caliptra_prim_prince // // References: - https://en.wikipedia.org/wiki/PRESENT // - https://en.wikipedia.org/wiki/Prince_(cipher) @@ -14,7 +14,7 @@ // - https://eprint.iacr.org/2015/372.pdf // - https://eprint.iacr.org/2014/656.pdf -package prim_cipher_pkg; +package caliptra_prim_cipher_pkg; /////////////////// // PRINCE Cipher // @@ -394,4 +394,4 @@ package prim_cipher_pkg; return state_out; endfunction : perm_64bit -endpackage : prim_cipher_pkg +endpackage : caliptra_prim_cipher_pkg diff --git a/src/prim/rtl/prim_count.sv b/src/caliptra_prim/rtl/caliptra_prim_count.sv similarity index 97% rename from src/prim/rtl/prim_count.sv rename to src/caliptra_prim/rtl/caliptra_prim_count.sv index 257a574f1..1e8dc7465 100644 --- a/src/prim/rtl/prim_count.sv +++ b/src/caliptra_prim/rtl/caliptra_prim_count.sv @@ -20,9 +20,9 @@ // Note that if both incr_en_i and decr_en_i are asserted at the same time, the counter remains // unchanged. The counter is also protected against under- and overflows. -`include "prim_assert.sv" +`include "caliptra_prim_assert.sv" -module prim_count #( +module caliptra_prim_count #( parameter int Width = 2, // Can be used to reset the counter to a different value than 0, for example when // the counter is used as a down-counter. @@ -101,7 +101,7 @@ module prim_count #( (cnt_en) ? cnt_sat : cnt_q[k]; logic [Width-1:0] cnt_unforced_q; - prim_flop #( + caliptra_prim_flop #( .Width(Width), .ResetValue(ResetValues[k]) ) u_cnt_flop ( @@ -127,7 +127,7 @@ module prim_count #( //////////////// // Assertions // //////////////// -`ifdef INC_ASSERT +`ifdef CALIPTRA_INC_ASSERT //VCS coverage off // pragma coverage off @@ -251,11 +251,11 @@ module prim_count #( (cnt_q[1] + cnt_q[0]) != {Width{1'b1}}) // This logic that will be assign to one, when user adds macro - // CALIPTRA_ASSERT_PRIM_COUNT_ERROR_TRIGGER_ALERT to check the error with alert, in case that prim_count + // CALIPTRA_ASSERT_PRIM_COUNT_ERROR_TRIGGER_ALERT to check the error with alert, in case that caliptra_prim_count // is used in design without adding this assertion check. logic unused_assert_connected; `CALIPTRA_ASSERT_INIT_NET(AssertConnected_A, unused_assert_connected === 1'b1 || !EnableAlertTriggerSVA) `endif -endmodule // prim_count +endmodule // caliptra_prim_count diff --git a/src/prim/rtl/prim_diff_decode.sv b/src/caliptra_prim/rtl/caliptra_prim_diff_decode.sv similarity index 97% rename from src/prim/rtl/prim_diff_decode.sv rename to src/caliptra_prim/rtl/caliptra_prim_diff_decode.sv index 3c0818b8e..40450d7e6 100644 --- a/src/prim/rtl/prim_diff_decode.sv +++ b/src/caliptra_prim/rtl/caliptra_prim_diff_decode.sv @@ -13,11 +13,11 @@ // the differential pair (i.e., when level changes on the diff pair are // sampled one cycle apart due to a timing skew between the two wires). // -// See also: prim_alert_sender, prim_alert_receiver, alert_handler +// See also: caliptra_prim_alert_sender, caliptra_prim_alert_receiver, alert_handler -`include "prim_assert.sv" +`include "caliptra_prim_assert.sv" -module prim_diff_decode #( +module caliptra_prim_diff_decode #( // enables additional synchronization logic parameter bit AsyncOn = 1'b0 ) ( @@ -51,7 +51,7 @@ module prim_diff_decode #( // 2 sync regs, one reg for edge detection logic diff_pq, diff_nq, diff_pd, diff_nd; - prim_flop_2sync #( + caliptra_prim_flop_2sync #( .Width(1), .ResetValue('0) ) i_sync_p ( @@ -61,7 +61,7 @@ module prim_diff_decode #( .q_o(diff_pd) ); - prim_flop_2sync #( + caliptra_prim_flop_2sync #( .Width(1), .ResetValue(1'b1) ) i_sync_n ( @@ -219,7 +219,7 @@ module prim_diff_decode #( if (AsyncOn) begin : gen_async_assert // assertions for asynchronous case -`ifdef INC_ASSERT +`ifdef CALIPTRA_INC_ASSERT `ifndef FPV_ALERT_NO_SIGINT_ERR // correctly detect sigint issue (only one transition cycle of permissible due to skew) `CALIPTRA_ASSERT(SigintCheck0_A, gen_async.diff_pd == gen_async.diff_nd [*2] |-> sigint_o) @@ -282,4 +282,4 @@ module prim_diff_decode #( `CALIPTRA_ASSERT(LevelCheck_A, (diff_pi ^ diff_ni) |-> diff_pi == level_o) end -endmodule : prim_diff_decode +endmodule : caliptra_prim_diff_decode diff --git a/src/prim/rtl/prim_dom_and_2share.sv b/src/caliptra_prim/rtl/caliptra_prim_dom_and_2share.sv similarity index 94% rename from src/prim/rtl/prim_dom_and_2share.sv rename to src/caliptra_prim/rtl/caliptra_prim_dom_and_2share.sv index f81994301..3ed0e0dd1 100644 --- a/src/prim/rtl/prim_dom_and_2share.sv +++ b/src/caliptra_prim/rtl/caliptra_prim_dom_and_2share.sv @@ -23,9 +23,9 @@ // Q1 = t{1,1} + sig(j>1,1)(...) + sig(j<1,1)(t{1,j} + Z{j}) // = a1&b1 + (0 + a1&b0 + z0) -`include "prim_assert.sv" +`include "caliptra_prim_assert.sv" -module prim_dom_and_2share #( +module caliptra_prim_dom_and_2share #( parameter int DW = 64, // Input width parameter bit Pipeline = 1'b0 // Enable full pipelining ) ( @@ -66,19 +66,19 @@ module prim_dom_and_2share #( // Resharing of cross-domain terms // Preserve the logic sequence for XOR not to proceed cross-domain AND. - prim_xor2 #( + caliptra_prim_xor2 #( .Width ( DW*2 ) - ) u_prim_xor_t01 ( + ) u_caliptra_prim_xor_t01 ( .in0_i ( {t_a0b1, t_a1b0} ), .in1_i ( {z_i, z_i} ), .out_o ( {t0_d, t1_d} ) ); // Register stage - prim_flop_en #( + caliptra_prim_flop_en #( .Width ( DW*2 ), .ResetValue ( '0 ) - ) u_prim_flop_t01 ( + ) u_caliptra_prim_flop_t01 ( .clk_i ( clk_i ), .rst_ni ( rst_ni ), .en_i ( z_valid_i ), @@ -96,10 +96,10 @@ module prim_dom_and_2share #( // reshared cross-domain terms with inner-domain terms derived from different input data. logic [DW-1:0] t_a0b0_q, t_a1b1_q; - prim_flop_en #( + caliptra_prim_flop_en #( .Width ( DW*2 ), .ResetValue ( '0 ) - ) u_prim_flop_tab01 ( + ) u_caliptra_prim_flop_tab01 ( .clk_i ( clk_i ), .rst_ni ( rst_ni ), .en_i ( z_valid_i ), @@ -125,9 +125,9 @@ module prim_dom_and_2share #( ///////////////// // Preserve the logic sequence for XOR not to proceed the inner-domain AND. - prim_xor2 #( + caliptra_prim_xor2 #( .Width ( DW*2 ) - ) u_prim_xor_q01 ( + ) u_caliptra_prim_xor_q01 ( .in0_i ( {t_a0b0, t_a1b1} ), .in1_i ( {t0_q, t1_q} ), .out_o ( {q0_o, q1_o} ) diff --git a/src/prim/rtl/prim_edge_detector.sv b/src/caliptra_prim/rtl/caliptra_prim_edge_detector.sv similarity index 91% rename from src/prim/rtl/prim_edge_detector.sv rename to src/caliptra_prim/rtl/caliptra_prim_edge_detector.sv index 2b0a92fb7..98b93624e 100644 --- a/src/prim/rtl/prim_edge_detector.sv +++ b/src/caliptra_prim/rtl/caliptra_prim_edge_detector.sv @@ -4,7 +4,7 @@ // // Edge Detector -module prim_edge_detector #( +module caliptra_prim_edge_detector #( parameter int unsigned Width = 1, parameter logic [Width-1:0] ResetValue = '0, @@ -28,7 +28,7 @@ module prim_edge_detector #( logic [Width-1:0] q_sync_d, q_sync_q; if (EnSync) begin : g_sync - prim_flop_2sync #( + caliptra_prim_flop_2sync #( .Width (Width), .ResetValue (ResetValue) ) u_sync ( @@ -52,4 +52,4 @@ module prim_edge_detector #( assign q_posedge_pulse_o = q_sync_d & ~q_sync_q; assign q_negedge_pulse_o = ~q_sync_d & q_sync_q; -endmodule : prim_edge_detector +endmodule : caliptra_prim_edge_detector diff --git a/src/prim/rtl/prim_fifo_sync.sv b/src/caliptra_prim/rtl/caliptra_prim_fifo_sync.sv similarity index 95% rename from src/prim/rtl/prim_fifo_sync.sv rename to src/caliptra_prim/rtl/caliptra_prim_fifo_sync.sv index d45db0ff1..a9713b85d 100644 --- a/src/prim/rtl/prim_fifo_sync.sv +++ b/src/caliptra_prim/rtl/caliptra_prim_fifo_sync.sv @@ -4,16 +4,16 @@ // // Generic synchronous fifo for use in a variety of devices. -`include "prim_assert.sv" +`include "caliptra_prim_assert.sv" -module prim_fifo_sync #( +module caliptra_prim_fifo_sync #( parameter int unsigned Width = 16, parameter bit Pass = 1'b1, // if == 1 allow requests to pass through empty FIFO parameter int unsigned Depth = 4, parameter bit OutputZeroIfEmpty = 1'b1, // if == 1 always output 0 when FIFO is empty parameter bit Secure = 1'b0, // use prim count for pointers // derived parameter - localparam int DepthW = prim_util_pkg::vbits(Depth+1) + localparam int DepthW = caliptra_prim_util_pkg::vbits(Depth+1) ) ( input clk_i, input rst_ni, @@ -58,7 +58,7 @@ module prim_fifo_sync #( // Normal FIFO construction end else begin : gen_normal_fifo - localparam int unsigned PTRV_W = prim_util_pkg::vbits(Depth); + localparam int unsigned PTRV_W = caliptra_prim_util_pkg::vbits(Depth); localparam int unsigned PTR_WIDTH = PTRV_W+1; logic [PTR_WIDTH-1:0] fifo_wptr, fifo_rptr; @@ -99,7 +99,7 @@ module prim_fifo_sync #( assign full_o = full; assign rvalid_o = ~empty & ~under_rst; - prim_fifo_sync_cnt #( + caliptra_prim_fifo_sync_cnt #( .Width(PTR_WIDTH), .Depth(Depth), .Secure(Secure) diff --git a/src/prim/rtl/prim_fifo_sync_cnt.sv b/src/caliptra_prim/rtl/caliptra_prim_fifo_sync_cnt.sv similarity index 93% rename from src/prim/rtl/prim_fifo_sync_cnt.sv rename to src/caliptra_prim/rtl/caliptra_prim_fifo_sync_cnt.sv index ec69515b0..02f05b823 100644 --- a/src/prim/rtl/prim_fifo_sync_cnt.sv +++ b/src/caliptra_prim/rtl/caliptra_prim_fifo_sync_cnt.sv @@ -4,9 +4,9 @@ // // Generic synchronous fifo for use in a variety of devices. -`include "prim_assert.sv" +`include "caliptra_prim_assert.sv" -module prim_fifo_sync_cnt #( +module caliptra_prim_fifo_sync_cnt #( parameter int Depth = 4, parameter int Width = 16, parameter bit Secure = 1'b0 @@ -34,7 +34,7 @@ module prim_fifo_sync_cnt #( if (Secure) begin : gen_secure_ptrs logic wptr_err; - prim_count #( + caliptra_prim_count #( .Width(Width) ) u_wptr ( .clk_i, @@ -51,7 +51,7 @@ module prim_fifo_sync_cnt #( ); logic rptr_err; - prim_count #( + caliptra_prim_count #( .Width(Width) ) u_rptr ( .clk_i, @@ -99,4 +99,4 @@ module prim_fifo_sync_cnt #( -endmodule // prim_fifo_sync_cnt +endmodule // caliptra_prim_fifo_sync_cnt diff --git a/src/prim/rtl/prim_flop.sv b/src/caliptra_prim/rtl/caliptra_prim_flop.sv similarity index 78% rename from src/prim/rtl/prim_flop.sv rename to src/caliptra_prim/rtl/caliptra_prim_flop.sv index 3c4667512..395a53c68 100755 --- a/src/prim/rtl/prim_flop.sv +++ b/src/caliptra_prim/rtl/caliptra_prim_flop.sv @@ -6,7 +6,7 @@ // Used parser: Fallback (regex) `ifndef PRIM_DEFAULT_IMPL - `define PRIM_DEFAULT_IMPL prim_pkg::ImplGeneric + `define CALIPTRA_PRIM_DEFAULT_IMPL caliptra_prim_pkg::ImplGeneric `endif // This is to prevent AscentLint warnings in the generated @@ -14,7 +14,7 @@ // use. TODO: we may want to move these inline waivers // into a separate, generated waiver file for consistency. //ri lint_check_off OUTPUT_NOT_DRIVEN INPUT_NOT_READ HIER_BRANCH_NOT_READ -module prim_flop +module caliptra_prim_flop #( @@ -27,17 +27,17 @@ module prim_flop input [Width-1:0] d_i, output logic [Width-1:0] q_o ); - parameter prim_pkg::impl_e Impl = `PRIM_DEFAULT_IMPL; + parameter caliptra_prim_pkg::impl_e Impl = `CALIPTRA_PRIM_DEFAULT_IMPL; -if (Impl == prim_pkg::ImplXilinx) begin : gen_xilinx - prim_xilinx_flop #( +if (Impl == caliptra_prim_pkg::ImplXilinx) begin : gen_xilinx + caliptra_prim_xilinx_flop #( .ResetValue(ResetValue), .Width(Width) ) u_impl_xilinx ( .* ); end else begin : gen_generic - prim_generic_flop #( + caliptra_prim_generic_flop #( .ResetValue(ResetValue), .Width(Width) ) u_impl_generic ( diff --git a/src/prim/rtl/prim_flop_2sync.sv b/src/caliptra_prim/rtl/caliptra_prim_flop_2sync.sv similarity index 73% rename from src/prim/rtl/prim_flop_2sync.sv rename to src/caliptra_prim/rtl/caliptra_prim_flop_2sync.sv index 7ff3c76ae..4c8b929a7 100644 --- a/src/prim/rtl/prim_flop_2sync.sv +++ b/src/caliptra_prim/rtl/caliptra_prim_flop_2sync.sv @@ -3,10 +3,10 @@ // SPDX-License-Identifier: Apache-2.0 // // Generic double-synchronizer flop -// This may need to be moved to prim_generic if libraries have a specific cell +// This may need to be moved to caliptra_prim_generic if libraries have a specific cell // for synchronization -module prim_flop_2sync #( +module caliptra_prim_flop_2sync #( parameter int Width = 16, parameter logic [Width-1:0] ResetValue = '0, parameter bit EnablePrimCdcRand = 1 @@ -20,25 +20,25 @@ module prim_flop_2sync #( logic [Width-1:0] d_o; logic [Width-1:0] intq; -`ifdef SIMULATION +`ifdef CALIPTRA_SIMULATION - prim_cdc_rand_delay #( + caliptra_prim_cdc_rand_delay #( .DataWidth(Width), .Enable(EnablePrimCdcRand) - ) u_prim_cdc_rand_delay ( + ) u_caliptra_prim_cdc_rand_delay ( .clk_i, .rst_ni, .src_data_i(d_i), .prev_data_i(intq), .dst_data_o(d_o) ); -`else // !`ifdef SIMULATION +`else // !`ifdef CALIPTRA_SIMULATION logic unused_sig; assign unused_sig = EnablePrimCdcRand; always_comb d_o = d_i; -`endif // !`ifdef SIMULATION +`endif // !`ifdef CALIPTRA_SIMULATION - prim_flop #( + caliptra_prim_flop #( .Width(Width), .ResetValue(ResetValue) ) u_sync_1 ( @@ -48,7 +48,7 @@ module prim_flop_2sync #( .q_o(intq) ); - prim_flop #( + caliptra_prim_flop #( .Width(Width), .ResetValue(ResetValue) ) u_sync_2 ( @@ -58,4 +58,4 @@ module prim_flop_2sync #( .q_o ); -endmodule : prim_flop_2sync +endmodule : caliptra_prim_flop_2sync diff --git a/src/prim/rtl/prim_flop_en.sv b/src/caliptra_prim/rtl/caliptra_prim_flop_en.sv similarity index 80% rename from src/prim/rtl/prim_flop_en.sv rename to src/caliptra_prim/rtl/caliptra_prim_flop_en.sv index 8f9ba1a10..f7b073e33 100644 --- a/src/prim/rtl/prim_flop_en.sv +++ b/src/caliptra_prim/rtl/caliptra_prim_flop_en.sv @@ -6,7 +6,7 @@ // Used parser: Fallback (regex) `ifndef PRIM_DEFAULT_IMPL - `define PRIM_DEFAULT_IMPL prim_pkg::ImplGeneric + `define CALIPTRA_PRIM_DEFAULT_IMPL caliptra_prim_pkg::ImplGeneric `endif // This is to prevent AscentLint warnings in the generated @@ -14,7 +14,7 @@ // use. TODO: we may want to move these inline waivers // into a separate, generated waiver file for consistency. //ri lint_check_off OUTPUT_NOT_DRIVEN INPUT_NOT_READ HIER_BRANCH_NOT_READ -module prim_flop_en +module caliptra_prim_flop_en #( @@ -29,10 +29,10 @@ module prim_flop_en input [Width-1:0] d_i, output logic [Width-1:0] q_o ); - parameter prim_pkg::impl_e Impl = `PRIM_DEFAULT_IMPL; + parameter caliptra_prim_pkg::impl_e Impl = `CALIPTRA_PRIM_DEFAULT_IMPL; -if (Impl == prim_pkg::ImplXilinx) begin : gen_xilinx - prim_xilinx_flop_en #( +if (Impl == caliptra_prim_pkg::ImplXilinx) begin : gen_xilinx + caliptra_prim_xilinx_flop_en #( .EnSecBuf(EnSecBuf), .ResetValue(ResetValue), .Width(Width) @@ -40,7 +40,7 @@ if (Impl == prim_pkg::ImplXilinx) begin : gen_xilinx .* ); end else begin : gen_generic - prim_generic_flop_en #( + caliptra_prim_generic_flop_en #( .EnSecBuf(EnSecBuf), .ResetValue(ResetValue), .Width(Width) diff --git a/src/prim/rtl/prim_flop_macros.sv b/src/caliptra_prim/rtl/caliptra_prim_flop_macros.sv similarity index 74% rename from src/prim/rtl/prim_flop_macros.sv rename to src/caliptra_prim/rtl/caliptra_prim_flop_macros.sv index 5d5945866..7c72af795 100644 --- a/src/prim/rtl/prim_flop_macros.sv +++ b/src/caliptra_prim/rtl/caliptra_prim_flop_macros.sv @@ -3,15 +3,15 @@ // SPDX-License-Identifier: Apache-2.0 `ifndef PRIM_FLOP_MACROS_SV -`define PRIM_FLOP_MACROS_SV +`define CALIPTRA_PRIM_FLOP_MACROS_SV ///////////////////////////////////// // Default Values for Macros below // ///////////////////////////////////// -`define PRIM_FLOP_CLK clk_i -`define PRIM_FLOP_RST rst_ni -`define PRIM_FLOP_RESVAL '0 +`define CALIPTRA_PRIM_FLOP_CLK clk_i +`define CALIPTRA_PRIM_FLOP_RST rst_ni +`define CALIPTRA_PRIM_FLOP_RESVAL '0 ///////////////////// // Register Macros // @@ -21,7 +21,7 @@ // to make the code more concise. // Register with asynchronous reset. -`define PRIM_FLOP_A(__d, __q, __resval = `PRIM_FLOP_RESVAL, __clk = `PRIM_FLOP_CLK, __rst_n = `PRIM_FLOP_RST) \ +`define CALIPTRA_PRIM_FLOP_A(__d, __q, __resval = `CALIPTRA_PRIM_FLOP_RESVAL, __clk = `CALIPTRA_PRIM_FLOP_CLK, __rst_n = `CALIPTRA_PRIM_FLOP_RST) \ always_ff @(posedge __clk or negedge __rst_n) begin \ if (!__rst_n) begin \ __q <= __resval; \ @@ -38,27 +38,27 @@ // like Xcelium and VCS seem to have problems inferring FSMs if the state register is not coded in // a behavioral always_ff block in the same hierarchy. To that end, this uses a modified variant // with a second behavioral register definition for RTL simulations so that FSMs can be inferred. -// Note that in this variant, the __q output is disconnected from prim_sparse_fsm_flop and attached +// Note that in this variant, the __q output is disconnected from caliptra_prim_sparse_fsm_flop and attached // to the behavioral flop. An assertion is added to ensure equivalence between the -// prim_sparse_fsm_flop output and the behavioral flop output in that case. -`define PRIM_FLOP_SPARSE_FSM(__name, __d, __q, __type, __resval = `PRIM_FLOP_RESVAL, __clk = `PRIM_FLOP_CLK, __rst_n = `PRIM_FLOP_RST, __alert_trigger_sva_en = 1) \ - `ifdef SIMULATION \ - prim_sparse_fsm_flop #( \ +// caliptra_prim_sparse_fsm_flop output and the behavioral flop output in that case. +`define CALIPTRA_PRIM_FLOP_SPARSE_FSM(__name, __d, __q, __type, __resval = `CALIPTRA_PRIM_FLOP_RESVAL, __clk = `CALIPTRA_PRIM_FLOP_CLK, __rst_n = `CALIPTRA_PRIM_FLOP_RST, __alert_trigger_sva_en = 1) \ + `ifdef CALIPTRA_SIMULATION \ + caliptra_prim_sparse_fsm_flop #( \ .StateEnumT(__type), \ .Width($bits(__type)), \ .ResetValue($bits(__type)'(__resval)), \ .EnableAlertTriggerSVA(__alert_trigger_sva_en), \ - .CustomForceName(`PRIM_STRINGIFY(__q)) \ + .CustomForceName(`CALIPTRA_PRIM_STRINGIFY(__q)) \ ) __name ( \ .clk_i ( __clk ), \ .rst_ni ( __rst_n ), \ .state_i ( __d ), \ .state_o ( ) \ ); \ - `PRIM_FLOP_A(__d, __q, __resval, __clk, __rst_n) \ + `CALIPTRA_PRIM_FLOP_A(__d, __q, __resval, __clk, __rst_n) \ `CALIPTRA_ASSERT(``__name``_A, __q === ``__name``.state_o) \ `else \ - prim_sparse_fsm_flop #( \ + caliptra_prim_sparse_fsm_flop #( \ .StateEnumT(__type), \ .Width($bits(__type)), \ .ResetValue($bits(__type)'(__resval)), \ diff --git a/src/prim/rtl/prim_intr_hw.sv b/src/caliptra_prim/rtl/caliptra_prim_intr_hw.sv similarity index 99% rename from src/prim/rtl/prim_intr_hw.sv rename to src/caliptra_prim/rtl/caliptra_prim_intr_hw.sv index 15aae5eb2..f9a8fdbc8 100644 --- a/src/prim/rtl/prim_intr_hw.sv +++ b/src/caliptra_prim/rtl/caliptra_prim_intr_hw.sv @@ -7,7 +7,7 @@ // This module can be instantiated once per interrupt field, or // "bussified" with all fields of the interrupt vector. -module prim_intr_hw # ( +module caliptra_prim_intr_hw # ( parameter int unsigned Width = 1, parameter bit FlopOutput = 1, diff --git a/src/prim/rtl/prim_lc_sync.sv b/src/caliptra_prim/rtl/caliptra_prim_lc_sync.sv similarity index 94% rename from src/prim/rtl/prim_lc_sync.sv rename to src/caliptra_prim/rtl/caliptra_prim_lc_sync.sv index b33600d25..5f83c11e6 100644 --- a/src/prim/rtl/prim_lc_sync.sv +++ b/src/caliptra_prim/rtl/caliptra_prim_lc_sync.sv @@ -8,9 +8,9 @@ // Should be used exactly as recommended in the life cycle controller spec: // https://docs.opentitan.org/hw/ip/lc_ctrl/doc/index.html#control-signal-propagation -`include "prim_assert.sv" +`include "caliptra_prim_assert.sv" -module prim_lc_sync #( +module caliptra_prim_lc_sync #( // Number of separately buffered output signals. // The buffer cells have a don't touch constraint // on them such that synthesis tools won't collapse @@ -37,10 +37,10 @@ module prim_lc_sync #( logic [lc_ctrl_pkg::TxWidth-1:0] lc_en; if (AsyncOn) begin : gen_flops - prim_flop_2sync #( + caliptra_prim_flop_2sync #( .Width(lc_ctrl_pkg::TxWidth), .ResetValue(lc_ctrl_pkg::TxWidth'(LcResetValue)) - ) u_prim_flop_2sync ( + ) u_caliptra_prim_flop_2sync ( .clk_i, .rst_ni, .d_i(lc_en_i), @@ -62,7 +62,7 @@ module prim_lc_sync #( // cycle, whereas RTL will because SVAs sample values in the "preponed" region. To that end we make // use of an RTL helper variable to sample the lc_en_i signal, hence ensuring that there are no // sampling mismatches. -`ifdef INC_ASSERT +`ifdef CALIPTRA_INC_ASSERT lc_ctrl_pkg::lc_tx_t lc_en_in_sva_q; always_ff @(posedge clk_i) begin lc_en_in_sva_q <= lc_en_i; @@ -99,7 +99,7 @@ module prim_lc_sync #( for (genvar j = 0; j < NumCopies; j++) begin : gen_buffs logic [lc_ctrl_pkg::TxWidth-1:0] lc_en_out; for (genvar k = 0; k < lc_ctrl_pkg::TxWidth; k++) begin : gen_bits - prim_sec_anchor_buf u_prim_buf ( + caliptra_prim_sec_anchor_buf u_caliptra_prim_buf ( .in_i(lc_en[k]), .out_o(lc_en_out[k]) ); @@ -114,4 +114,4 @@ module prim_lc_sync #( // The outputs should be known at all times. `CALIPTRA_ASSERT_KNOWN(OutputsKnown_A, lc_en_o) -endmodule : prim_lc_sync +endmodule : caliptra_prim_lc_sync diff --git a/src/prim/rtl/prim_lfsr.sv b/src/caliptra_prim/rtl/caliptra_prim_lfsr.sv similarity index 97% rename from src/prim/rtl/prim_lfsr.sv rename to src/caliptra_prim/rtl/caliptra_prim_lfsr.sv index 1b6e11278..8801ef48f 100644 --- a/src/prim/rtl/prim_lfsr.sv +++ b/src/caliptra_prim/rtl/caliptra_prim_lfsr.sv @@ -24,9 +24,9 @@ // [2] https://users.ece.cmu.edu/~koopman/lfsr/ // [3] https://www.xilinx.com/support/documentation/application_notes/xapp052.pdf -`include "prim_assert.sv" +`include "caliptra_prim_assert.sv" -module prim_lfsr #( +module caliptra_prim_lfsr #( // Lfsr Type, can be FIB_XNOR or GAL_XOR parameter LfsrType = "GAL_XOR", // Lfsr width @@ -312,21 +312,21 @@ module prim_lfsr #( logic [LfsrDw-1:0] next_lfsr_state, coeffs; // Enable the randomization of DefaultSeed using DefaultSeedLocal in DV simulations. - `ifdef SIMULATION + `ifdef CALIPTRA_SIMULATION `ifdef VERILATOR localparam logic [LfsrDw-1:0] DefaultSeedLocal = DefaultSeed; `else logic [LfsrDw-1:0] DefaultSeedLocal; - logic prim_lfsr_use_default_seed; + logic caliptra_prim_lfsr_use_default_seed; initial begin : p_randomize_default_seed - if (!$value$plusargs("prim_lfsr_use_default_seed=%0d", prim_lfsr_use_default_seed)) begin + if (!$value$plusargs("caliptra_prim_lfsr_use_default_seed=%0d", caliptra_prim_lfsr_use_default_seed)) begin // 30% of the time, use the DefaultSeed parameter; 70% of the time, randomize it. - `CALIPTRA_ASSERT_I(UseDefaultSeedRandomizeCheck_A, std::randomize(prim_lfsr_use_default_seed) with { - prim_lfsr_use_default_seed dist {0:/7, 1:/3};}) + `CALIPTRA_ASSERT_I(UseDefaultSeedRandomizeCheck_A, std::randomize(caliptra_prim_lfsr_use_default_seed) with { + caliptra_prim_lfsr_use_default_seed dist {0:/7, 1:/3};}) end - if (prim_lfsr_use_default_seed) begin + if (caliptra_prim_lfsr_use_default_seed) begin DefaultSeedLocal = DefaultSeed; end else begin // Randomize the DefaultSeedLocal ensuring its not all 0s or all 1s. @@ -340,7 +340,7 @@ module prim_lfsr #( `else localparam logic [LfsrDw-1:0] DefaultSeedLocal = DefaultSeed; - `endif // ifdef SIMULATION + `endif // ifdef CALIPTRA_SIMULATION //////////////// // Galois XOR // @@ -524,7 +524,7 @@ module prim_lfsr #( lfsr_q[sbox_in_indices[k*4 + 2]], lfsr_q[sbox_in_indices[k*4 + 1]], lfsr_q[sbox_in_indices[k*4 + 0]]}; - assign sbox_out[k*4 +: 4] = prim_cipher_pkg::PRINCE_SBOX4[sbox_in]; + assign sbox_out[k*4 +: 4] = caliptra_prim_cipher_pkg::PRINCE_SBOX4[sbox_in]; end end else begin : gen_out_passthru assign sbox_out = lfsr_q; diff --git a/src/prim/rtl/prim_max_tree.sv b/src/caliptra_prim/rtl/caliptra_prim_max_tree.sv similarity index 97% rename from src/prim/rtl/prim_max_tree.sv rename to src/caliptra_prim/rtl/caliptra_prim_max_tree.sv index f218626ab..3b0f9b086 100644 --- a/src/prim/rtl/prim_max_tree.sv +++ b/src/caliptra_prim/rtl/caliptra_prim_max_tree.sv @@ -14,9 +14,9 @@ // be equal to the input value at index 0. -`include "prim_assert.sv" +`include "caliptra_prim_assert.sv" -module prim_max_tree #( +module caliptra_prim_max_tree #( parameter int NumSrc = 32, parameter int Width = 8, // Derived parameters @@ -104,7 +104,7 @@ module prim_max_tree #( // Assertions // //////////////// -`ifdef INC_ASSERT +`ifdef CALIPTRA_INC_ASSERT //VCS coverage off // pragma coverage off @@ -149,4 +149,4 @@ module prim_max_tree #( `CALIPTRA_ASSERT(MaxIndexComputationInvalid_A, !max_valid_o |-> max_idx_o == '0) `endif -endmodule : prim_max_tree +endmodule : caliptra_prim_max_tree diff --git a/src/prim/rtl/prim_mubi4_sync.sv b/src/caliptra_prim/rtl/caliptra_prim_mubi4_sync.sv similarity index 93% rename from src/prim/rtl/prim_mubi4_sync.sv rename to src/caliptra_prim/rtl/caliptra_prim_mubi4_sync.sv index f0bfb06b5..572219fac 100644 --- a/src/prim/rtl/prim_mubi4_sync.sv +++ b/src/caliptra_prim/rtl/caliptra_prim_mubi4_sync.sv @@ -9,10 +9,10 @@ // // Double-synchronizer flop for multibit signals with additional output buffers. -`include "prim_assert.sv" +`include "caliptra_prim_assert.sv" -module prim_mubi4_sync - import prim_mubi_pkg::*; +module caliptra_prim_mubi4_sync + import caliptra_prim_mubi_pkg::*; #( // Number of separately buffered output signals. // The buffer cells have a don't touch constraint @@ -43,10 +43,10 @@ module prim_mubi4_sync logic [MuBi4Width-1:0] mubi; if (AsyncOn) begin : gen_flops logic [MuBi4Width-1:0] mubi_sync; - prim_flop_2sync #( + caliptra_prim_flop_2sync #( .Width(MuBi4Width), .ResetValue(MuBi4Width'(ResetValue)) - ) u_prim_flop_2sync ( + ) u_caliptra_prim_flop_2sync ( .clk_i, .rst_ni, .d_i(MuBi4Width'(mubi_i)), @@ -55,10 +55,10 @@ module prim_mubi4_sync if (StabilityCheck) begin : gen_stable_chks logic [MuBi4Width-1:0] mubi_q; - prim_flop #( + caliptra_prim_flop #( .Width(MuBi4Width), .ResetValue(MuBi4Width'(ResetValue)) - ) u_prim_flop_3rd_stage ( + ) u_caliptra_prim_flop_3rd_stage ( .clk_i, .rst_ni, .d_i(mubi_sync), @@ -66,7 +66,7 @@ module prim_mubi4_sync ); logic [MuBi4Width-1:0] sig_unstable; - prim_xor2 #( + caliptra_prim_xor2 #( .Width(MuBi4Width) ) u_mubi_xor ( .in0_i(mubi_sync), @@ -82,7 +82,7 @@ module prim_mubi4_sync // each mux gets its own buffered output, this ensures the OR-ing // cannot be defeated in one place. - prim_sec_anchor_buf #( + caliptra_prim_sec_anchor_buf #( .Width(MuBi4Width) ) u_sig_unstable_buf ( .in_i(sig_unstable), @@ -111,7 +111,7 @@ module prim_mubi4_sync // cycle, whereas RTL will because SVAs sample values in the "preponed" region. To that end we make // use of an RTL helper variable to sample the lc_en_i signal, hence ensuring that there are no // sampling mismatches. -`ifdef INC_ASSERT +`ifdef CALIPTRA_INC_ASSERT mubi4_t mubi_in_sva_q; always_ff @(posedge clk_i) begin mubi_in_sva_q <= mubi_i; @@ -122,7 +122,7 @@ module prim_mubi4_sync `endif end else begin : gen_no_stable_chks assign mubi = mubi_sync; -`ifdef INC_ASSERT +`ifdef CALIPTRA_INC_ASSERT mubi4_t mubi_in_sva_q; always_ff @(posedge clk_i) begin mubi_in_sva_q <= mubi_i; @@ -160,7 +160,7 @@ module prim_mubi4_sync for (genvar j = 0; j < NumCopies; j++) begin : gen_buffs logic [MuBi4Width-1:0] mubi_out; for (genvar k = 0; k < MuBi4Width; k++) begin : gen_bits - prim_buf u_prim_buf ( + caliptra_prim_buf u_caliptra_prim_buf ( .in_i(mubi[k]), .out_o(mubi_out[k]) ); @@ -175,4 +175,4 @@ module prim_mubi4_sync // The outputs should be known at all times. `CALIPTRA_ASSERT_KNOWN(OutputsKnown_A, mubi_o) -endmodule : prim_mubi4_sync +endmodule : caliptra_prim_mubi4_sync diff --git a/src/prim/rtl/prim_mubi8_sync.sv b/src/caliptra_prim/rtl/caliptra_prim_mubi8_sync.sv similarity index 93% rename from src/prim/rtl/prim_mubi8_sync.sv rename to src/caliptra_prim/rtl/caliptra_prim_mubi8_sync.sv index f5696db62..dcc04fa90 100644 --- a/src/prim/rtl/prim_mubi8_sync.sv +++ b/src/caliptra_prim/rtl/caliptra_prim_mubi8_sync.sv @@ -9,10 +9,10 @@ // // Double-synchronizer flop for multibit signals with additional output buffers. -`include "prim_assert.sv" +`include "caliptra_prim_assert.sv" -module prim_mubi8_sync - import prim_mubi_pkg::*; +module caliptra_prim_mubi8_sync + import caliptra_prim_mubi_pkg::*; #( // Number of separately buffered output signals. // The buffer cells have a don't touch constraint @@ -43,10 +43,10 @@ module prim_mubi8_sync logic [MuBi8Width-1:0] mubi; if (AsyncOn) begin : gen_flops logic [MuBi8Width-1:0] mubi_sync; - prim_flop_2sync #( + caliptra_prim_flop_2sync #( .Width(MuBi8Width), .ResetValue(MuBi8Width'(ResetValue)) - ) u_prim_flop_2sync ( + ) u_caliptra_prim_flop_2sync ( .clk_i, .rst_ni, .d_i(MuBi8Width'(mubi_i)), @@ -55,10 +55,10 @@ module prim_mubi8_sync if (StabilityCheck) begin : gen_stable_chks logic [MuBi8Width-1:0] mubi_q; - prim_flop #( + caliptra_prim_flop #( .Width(MuBi8Width), .ResetValue(MuBi8Width'(ResetValue)) - ) u_prim_flop_3rd_stage ( + ) u_caliptra_prim_flop_3rd_stage ( .clk_i, .rst_ni, .d_i(mubi_sync), @@ -66,7 +66,7 @@ module prim_mubi8_sync ); logic [MuBi8Width-1:0] sig_unstable; - prim_xor2 #( + caliptra_prim_xor2 #( .Width(MuBi8Width) ) u_mubi_xor ( .in0_i(mubi_sync), @@ -82,7 +82,7 @@ module prim_mubi8_sync // each mux gets its own buffered output, this ensures the OR-ing // cannot be defeated in one place. - prim_sec_anchor_buf #( + caliptra_prim_sec_anchor_buf #( .Width(MuBi8Width) ) u_sig_unstable_buf ( .in_i(sig_unstable), @@ -111,7 +111,7 @@ module prim_mubi8_sync // cycle, whereas RTL will because SVAs sample values in the "preponed" region. To that end we make // use of an RTL helper variable to sample the lc_en_i signal, hence ensuring that there are no // sampling mismatches. -`ifdef INC_ASSERT +`ifdef CALIPTRA_INC_ASSERT mubi8_t mubi_in_sva_q; always_ff @(posedge clk_i) begin mubi_in_sva_q <= mubi_i; @@ -122,7 +122,7 @@ module prim_mubi8_sync `endif end else begin : gen_no_stable_chks assign mubi = mubi_sync; -`ifdef INC_ASSERT +`ifdef CALIPTRA_INC_ASSERT mubi8_t mubi_in_sva_q; always_ff @(posedge clk_i) begin mubi_in_sva_q <= mubi_i; @@ -161,7 +161,7 @@ module prim_mubi8_sync for (genvar j = 0; j < NumCopies; j++) begin : gen_buffs logic [MuBi8Width-1:0] mubi_out; for (genvar k = 0; k < MuBi8Width; k++) begin : gen_bits - prim_buf u_prim_buf ( + caliptra_prim_buf u_caliptra_prim_buf ( .in_i(mubi[k]), .out_o(mubi_out[k]) ); @@ -176,4 +176,4 @@ module prim_mubi8_sync // The outputs should be known at all times. `CALIPTRA_ASSERT_KNOWN(OutputsKnown_A, mubi_o) -endmodule : prim_mubi8_sync +endmodule : caliptra_prim_mubi8_sync diff --git a/src/prim/rtl/prim_mubi_pkg.sv b/src/caliptra_prim/rtl/caliptra_prim_mubi_pkg.sv similarity index 99% rename from src/prim/rtl/prim_mubi_pkg.sv rename to src/caliptra_prim/rtl/caliptra_prim_mubi_pkg.sv index 118f9ad60..cc474c97d 100644 --- a/src/prim/rtl/prim_mubi_pkg.sv +++ b/src/caliptra_prim/rtl/caliptra_prim_mubi_pkg.sv @@ -10,9 +10,9 @@ // This package defines common multibit signal types, active high and active low values and // the corresponding functions to test whether the values are set or not. -`include "prim_assert.sv" +`include "caliptra_prim_assert.sv" -package prim_mubi_pkg; +package caliptra_prim_mubi_pkg; ////////////////////////////////////////////// // 4 Bit Multibit Type and Functions // @@ -542,4 +542,4 @@ package prim_mubi_pkg; return mubi16_and(a, b, MuBi16False); endfunction : mubi16_and_lo -endpackage : prim_mubi_pkg +endpackage : caliptra_prim_mubi_pkg diff --git a/src/prim/rtl/prim_onehot_check.sv b/src/caliptra_prim/rtl/caliptra_prim_onehot_check.sv similarity index 93% rename from src/prim/rtl/prim_onehot_check.sv rename to src/caliptra_prim/rtl/caliptra_prim_onehot_check.sv index 47d5ff4e3..e5bfcb450 100644 --- a/src/prim/rtl/prim_onehot_check.sv +++ b/src/caliptra_prim/rtl/caliptra_prim_onehot_check.sv @@ -16,9 +16,9 @@ // All checks make use of an explicit binary tree implementation in order to minimize the delay. // -`include "prim_assert.sv" +`include "caliptra_prim_assert.sv" -module prim_onehot_check #( +module caliptra_prim_onehot_check #( parameter int unsigned AddrWidth = 5, // The onehot width can be <= 2**AddrWidth and does not have to be a power of two. parameter int unsigned OneHotWidth = 2**AddrWidth, @@ -139,17 +139,17 @@ module prim_onehot_check #( // This logic that will be assign to one, when user adds macro // CALIPTRA_ASSERT_PRIM_ONEHOT_ERROR_TRIGGER_ALERT to check the error with alert, in case that - // prim_onehot_check is used in design without adding this assertion check. - `ifdef INC_ASSERT + // caliptra_prim_onehot_check is used in design without adding this assertion check. + `ifdef CALIPTRA_INC_ASSERT `ifndef PRIM_DEFAULT_IMPL - `define PRIM_DEFAULT_IMPL prim_pkg::ImplGeneric + `define CALIPTRA_PRIM_DEFAULT_IMPL caliptra_prim_pkg::ImplGeneric `endif - parameter prim_pkg::impl_e Impl = `PRIM_DEFAULT_IMPL; + parameter caliptra_prim_pkg::impl_e Impl = `CALIPTRA_PRIM_DEFAULT_IMPL; logic unused_assert_connected; // TODO(#13337): only check generic for now. The path of this prim in other Impl may differ - if (Impl == prim_pkg::ImplGeneric) begin : gen_generic + if (Impl == caliptra_prim_pkg::ImplGeneric) begin : gen_generic `CALIPTRA_ASSERT_INIT_NET(AssertConnected_A, unused_assert_connected === 1'b1 || !EnableAlertTriggerSVA) end `endif -endmodule : prim_onehot_check +endmodule : caliptra_prim_onehot_check diff --git a/src/prim/rtl/prim_packer_fifo.sv b/src/caliptra_prim/rtl/caliptra_prim_packer_fifo.sv similarity index 98% rename from src/prim/rtl/prim_packer_fifo.sv rename to src/caliptra_prim/rtl/caliptra_prim_packer_fifo.sv index 095635ea3..24fdd1429 100644 --- a/src/prim/rtl/prim_packer_fifo.sv +++ b/src/caliptra_prim/rtl/caliptra_prim_packer_fifo.sv @@ -39,9 +39,9 @@ // depth_o 0000000000|1111111111|00000000000000000000000000000000000000000 -`include "prim_assert.sv" +`include "caliptra_prim_assert.sv" -module prim_packer_fifo #( +module caliptra_prim_packer_fifo #( parameter int InW = 32, parameter int OutW = 8, parameter bit ClearOnRead = 1'b1, // if == 1 always output 0 after read diff --git a/src/prim/rtl/prim_pkg.sv b/src/caliptra_prim/rtl/caliptra_prim_pkg.sv similarity index 85% rename from src/prim/rtl/prim_pkg.sv rename to src/caliptra_prim/rtl/caliptra_prim_pkg.sv index 938bf7390..97242c359 100755 --- a/src/prim/rtl/prim_pkg.sv +++ b/src/caliptra_prim/rtl/caliptra_prim_pkg.sv @@ -6,7 +6,7 @@ // This file is auto-generated. -package prim_pkg; +package caliptra_prim_pkg; // Implementation target specialization typedef enum integer { @@ -14,4 +14,4 @@ package prim_pkg; ImplXilinx, ImplBadbit } impl_e; -endpackage : prim_pkg +endpackage : caliptra_prim_pkg diff --git a/src/prim/rtl/prim_reg_we_check.sv b/src/caliptra_prim/rtl/caliptra_prim_reg_we_check.sv similarity index 82% rename from src/prim/rtl/prim_reg_we_check.sv rename to src/caliptra_prim/rtl/caliptra_prim_reg_we_check.sv index 51373ca37..a55c2fea9 100644 --- a/src/prim/rtl/prim_reg_we_check.sv +++ b/src/caliptra_prim/rtl/caliptra_prim_reg_we_check.sv @@ -5,9 +5,9 @@ // Spurious write-enable checker for autogenerated CSR node. // This module has additional simulation features for error injection testing. -`include "prim_assert.sv" +`include "caliptra_prim_assert.sv" -module prim_reg_we_check #( +module caliptra_prim_reg_we_check #( parameter int unsigned OneHotWidth = 32 ) ( // The module is combinational - the clock and reset are only used for assertions. @@ -22,16 +22,16 @@ module prim_reg_we_check #( // Prevent optimization of the onehot input buffer. logic [OneHotWidth-1:0] oh_buf; - prim_buf #( + caliptra_prim_buf #( .Width(OneHotWidth) - ) u_prim_buf ( + ) u_caliptra_prim_buf ( .in_i(oh_i), .out_o(oh_buf) ); - prim_onehot_check #( + caliptra_prim_onehot_check #( .OneHotWidth(OneHotWidth), - .AddrWidth (prim_util_pkg::vbits(OneHotWidth)), + .AddrWidth (caliptra_prim_util_pkg::vbits(OneHotWidth)), .EnableCheck(1), // Since certain peripherals may have a very large address space // (e.g. > 20bit), the inverse address decoding check (which is @@ -42,7 +42,7 @@ module prim_reg_we_check #( // we do not perform strict checks. I.e., we allow cases // where en_i is set to 1, but the oh_i vector is all-zeroes. .StrictCheck(0) - ) u_prim_onehot_check ( + ) u_caliptra_prim_onehot_check ( .clk_i, .rst_ni, .oh_i(oh_buf), @@ -51,4 +51,4 @@ module prim_reg_we_check #( .err_o ); -endmodule : prim_reg_we_check +endmodule : caliptra_prim_reg_we_check diff --git a/src/prim/rtl/prim_sec_anchor_buf.sv b/src/caliptra_prim/rtl/caliptra_prim_sec_anchor_buf.sv similarity index 77% rename from src/prim/rtl/prim_sec_anchor_buf.sv rename to src/caliptra_prim/rtl/caliptra_prim_sec_anchor_buf.sv index 1ea71841a..ae8753ad4 100644 --- a/src/prim/rtl/prim_sec_anchor_buf.sv +++ b/src/caliptra_prim/rtl/caliptra_prim_sec_anchor_buf.sv @@ -2,16 +2,16 @@ // Licensed under the Apache License, Version 2.0, see LICENSE for details. // SPDX-License-Identifier: Apache-2.0 -`include "prim_assert.sv" +`include "caliptra_prim_assert.sv" -module prim_sec_anchor_buf #( +module caliptra_prim_sec_anchor_buf #( parameter int Width = 1 ) ( input [Width-1:0] in_i, output logic [Width-1:0] out_o ); - prim_buf #( + caliptra_prim_buf #( .Width(Width) ) u_secure_anchor_buf ( .in_i, diff --git a/src/prim/rtl/prim_sec_anchor_flop.sv b/src/caliptra_prim/rtl/caliptra_prim_sec_anchor_flop.sv similarity index 83% rename from src/prim/rtl/prim_sec_anchor_flop.sv rename to src/caliptra_prim/rtl/caliptra_prim_sec_anchor_flop.sv index ce18b47d4..c475864b6 100644 --- a/src/prim/rtl/prim_sec_anchor_flop.sv +++ b/src/caliptra_prim/rtl/caliptra_prim_sec_anchor_flop.sv @@ -2,9 +2,9 @@ // Licensed under the Apache License, Version 2.0, see LICENSE for details. // SPDX-License-Identifier: Apache-2.0 -`include "prim_assert.sv" +`include "caliptra_prim_assert.sv" -module prim_sec_anchor_flop #( +module caliptra_prim_sec_anchor_flop #( parameter int Width = 1, parameter logic [Width-1:0] ResetValue = 0 ) ( @@ -14,7 +14,7 @@ module prim_sec_anchor_flop #( output logic [Width-1:0] q_o ); - prim_flop #( + caliptra_prim_flop #( .Width(Width), .ResetValue(ResetValue) ) u_secure_anchor_flop ( diff --git a/src/prim/rtl/prim_slicer.sv b/src/caliptra_prim/rtl/caliptra_prim_slicer.sv similarity index 91% rename from src/prim/rtl/prim_slicer.sv rename to src/caliptra_prim/rtl/caliptra_prim_slicer.sv index 370158858..33493f03b 100644 --- a/src/prim/rtl/prim_slicer.sv +++ b/src/caliptra_prim/rtl/caliptra_prim_slicer.sv @@ -5,9 +5,9 @@ // Slicer chops the incoming bitstring into OutW granularity. // It supports fractional InW/OutW which fills 0 at the end of message. -`include "prim_assert.sv" +`include "caliptra_prim_assert.sv" -module prim_slicer #( +module caliptra_prim_slicer #( parameter int InW = 64, parameter int OutW = 8, diff --git a/src/prim/rtl/prim_sparse_fsm_flop.sv b/src/caliptra_prim/rtl/caliptra_prim_sparse_fsm_flop.sv similarity index 80% rename from src/prim/rtl/prim_sparse_fsm_flop.sv rename to src/caliptra_prim/rtl/caliptra_prim_sparse_fsm_flop.sv index 846eb9665..b0483a7a5 100644 --- a/src/prim/rtl/prim_sparse_fsm_flop.sv +++ b/src/caliptra_prim/rtl/caliptra_prim_sparse_fsm_flop.sv @@ -2,20 +2,22 @@ // Licensed under the Apache License, Version 2.0, see LICENSE for details. // SPDX-License-Identifier: Apache-2.0 -`include "prim_assert.sv" +`include "caliptra_prim_assert.sv" -module prim_sparse_fsm_flop #( +module caliptra_prim_sparse_fsm_flop + import caliptra_prim_sparse_fsm_pkg::*; +#( parameter int Width = 1, - parameter type StateEnumT = logic [Width-1:0], + parameter type StateEnumT = state_t, parameter logic [Width-1:0] ResetValue = '0, // This should only be disabled in special circumstances, for example // in non-comportable IPs where an error does not trigger an alert. parameter bit EnableAlertTriggerSVA = 1 -`ifdef SIMULATION +`ifdef CALIPTRA_SIMULATION , // In case this parameter is set to a non-empty string, the - // prim_sparse_fsm_flop_if will also force the signal with this name - // in the parent module that instantiates prim_sparse_fsm_flop. + // caliptra_prim_sparse_fsm_flop_if will also force the signal with this name + // in the parent module that instantiates caliptra_prim_sparse_fsm_flop. parameter string CustomForceName = "" `endif ) ( @@ -28,7 +30,7 @@ module prim_sparse_fsm_flop #( logic unused_err_o; logic [Width-1:0] state_raw; - prim_flop #( + caliptra_prim_flop #( .Width(Width), .ResetValue(ResetValue) ) u_state_flop ( @@ -39,7 +41,7 @@ module prim_sparse_fsm_flop #( ); assign state_o = StateEnumT'(state_raw); - `ifdef INC_ASSERT + `ifdef CALIPTRA_INC_ASSERT assign unused_err_o = is_undefined_state(state_o); function automatic logic is_undefined_state(StateEnumT sig); @@ -58,7 +60,7 @@ module prim_sparse_fsm_flop #( // If CALIPTRA_ASSERT_PRIM_FSM_ERROR_TRIGGER_ALERT is declared, the unused_assert_connected signal will // be set to 1 and the below check will pass. // If the assertion is not declared however, the statement below will fail. - `ifdef INC_ASSERT + `ifdef CALIPTRA_INC_ASSERT logic unused_assert_connected; `CALIPTRA_ASSERT_INIT_NET(AssertConnected_A, unused_assert_connected === 1'b1 || !EnableAlertTriggerSVA) diff --git a/src/caliptra_prim/rtl/caliptra_prim_sparse_fsm_pkg.sv b/src/caliptra_prim/rtl/caliptra_prim_sparse_fsm_pkg.sv new file mode 100644 index 000000000..5f0b716c4 --- /dev/null +++ b/src/caliptra_prim/rtl/caliptra_prim_sparse_fsm_pkg.sv @@ -0,0 +1,7 @@ +// Copyright lowRISC contributors. +// Licensed under the Apache License, Version 2.0, see LICENSE for details. +// SPDX-License-Identifier: Apache-2.0 + +package caliptra_prim_sparse_fsm_pkg; + typedef enum logic {Idle, Done} state_t; +endpackage : caliptra_prim_sparse_fsm_pkg diff --git a/src/prim/rtl/prim_subreg.sv b/src/caliptra_prim/rtl/caliptra_prim_subreg.sv similarity index 93% rename from src/prim/rtl/prim_subreg.sv rename to src/caliptra_prim/rtl/caliptra_prim_subreg.sv index 1215e430f..8bb91d955 100644 --- a/src/prim/rtl/prim_subreg.sv +++ b/src/caliptra_prim/rtl/caliptra_prim_subreg.sv @@ -4,8 +4,8 @@ // // Register slice conforming to Comportibility guide. -module prim_subreg - import prim_subreg_pkg::*; +module caliptra_prim_subreg + import caliptra_prim_subreg_pkg::*; #( parameter int DW = 32, parameter sw_access_e SwAccess = SwAccessRW, @@ -37,7 +37,7 @@ module prim_subreg logic wr_en; logic [DW-1:0] wr_data; - prim_subreg_arb #( + caliptra_prim_subreg_arb #( .DW ( DW ), .SwAccess ( SwAccess ) ) wr_en_data_arb ( diff --git a/src/prim/rtl/prim_subreg_arb.sv b/src/caliptra_prim/rtl/caliptra_prim_subreg_arb.sv similarity index 97% rename from src/prim/rtl/prim_subreg_arb.sv rename to src/caliptra_prim/rtl/caliptra_prim_subreg_arb.sv index 80033366c..d660a5465 100644 --- a/src/prim/rtl/prim_subreg_arb.sv +++ b/src/caliptra_prim/rtl/caliptra_prim_subreg_arb.sv @@ -4,8 +4,8 @@ // // Write enable and data arbitration logic for register slice conforming to Comportibility guide. -module prim_subreg_arb - import prim_subreg_pkg::*; +module caliptra_prim_subreg_arb + import caliptra_prim_subreg_pkg::*; #( parameter int DW = 32, parameter sw_access_e SwAccess = SwAccessRW diff --git a/src/prim/rtl/prim_subreg_ext.sv b/src/caliptra_prim/rtl/caliptra_prim_subreg_ext.sv similarity index 95% rename from src/prim/rtl/prim_subreg_ext.sv rename to src/caliptra_prim/rtl/caliptra_prim_subreg_ext.sv index 30a40c60c..217d11c66 100644 --- a/src/prim/rtl/prim_subreg_ext.sv +++ b/src/caliptra_prim/rtl/caliptra_prim_subreg_ext.sv @@ -4,7 +4,7 @@ // // Register slice conforming to Comportibility guide. -module prim_subreg_ext #( +module caliptra_prim_subreg_ext #( parameter int unsigned DW = 32 ) ( input re, diff --git a/src/prim/rtl/prim_subreg_pkg.sv b/src/caliptra_prim/rtl/caliptra_prim_subreg_pkg.sv similarity index 94% rename from src/prim/rtl/prim_subreg_pkg.sv rename to src/caliptra_prim/rtl/caliptra_prim_subreg_pkg.sv index 6e1da0436..7e374d1b1 100644 --- a/src/prim/rtl/prim_subreg_pkg.sv +++ b/src/caliptra_prim/rtl/caliptra_prim_subreg_pkg.sv @@ -2,7 +2,7 @@ // Licensed under the Apache License, Version 2.0, see LICENSE for details. // SPDX-License-Identifier: Apache-2.0 -package prim_subreg_pkg; +package caliptra_prim_subreg_pkg; // Register access specifier typedef enum logic [2:0] { diff --git a/src/prim/rtl/prim_sum_tree.sv b/src/caliptra_prim/rtl/caliptra_prim_sum_tree.sv similarity index 95% rename from src/prim/rtl/prim_sum_tree.sv rename to src/caliptra_prim/rtl/caliptra_prim_sum_tree.sv index 8961d1f83..be17bc1b0 100644 --- a/src/prim/rtl/prim_sum_tree.sv +++ b/src/caliptra_prim/rtl/caliptra_prim_sum_tree.sv @@ -2,7 +2,7 @@ // Licensed under the Apache License, Version 2.0, see LICENSE for details. // SPDX-License-Identifier: Apache-2.0 // -// Based on prim_max_tree, this module implements an explicit binary tree to find the +// Based on caliptra_prim_max_tree, this module implements an explicit binary tree to find the // sum of this inputs. The solution has O(N) area and O(log(N)) delay complexity, and // thus scales well with many input sources. // @@ -10,9 +10,9 @@ // Invalid values are treated as 0. // -`include "prim_assert.sv" +`include "caliptra_prim_assert.sv" -module prim_sum_tree #( +module caliptra_prim_sum_tree #( parameter int NumSrc = 32, parameter int Width = 8 ) ( @@ -95,7 +95,7 @@ module prim_sum_tree #( // Assertions // //////////////// -`ifdef INC_ASSERT +`ifdef CALIPTRA_INC_ASSERT //VCS coverage off // pragma coverage off @@ -121,4 +121,4 @@ module prim_sum_tree #( `CALIPTRA_ASSERT(SumComputationInvalid_A, !sum_valid_o |-> sum_value_o == '0) `endif -endmodule : prim_sum_tree +endmodule : caliptra_prim_sum_tree diff --git a/src/prim/rtl/prim_util_pkg.sv b/src/caliptra_prim/rtl/caliptra_prim_util_pkg.sv similarity index 98% rename from src/prim/rtl/prim_util_pkg.sv rename to src/caliptra_prim/rtl/caliptra_prim_util_pkg.sv index f5e3c92af..4a6f7c7a9 100644 --- a/src/prim/rtl/prim_util_pkg.sv +++ b/src/caliptra_prim/rtl/caliptra_prim_util_pkg.sv @@ -6,7 +6,7 @@ /** * Utility functions */ -package prim_util_pkg; +package caliptra_prim_util_pkg; /** * Math function: $clog2 as specified in Verilog-2005 * @@ -86,7 +86,7 @@ package prim_util_pkg; `endif endfunction -`ifdef INC_ASSERT +`ifdef CALIPTRA_INC_ASSERT // Package-scoped variable to detect the end of simulation. // // Used only in DV simulations. The bit will be used by assertions in RTL to perform end-of-test diff --git a/src/caliptra_prim_generic/config/caliptra_prim_generic.vf b/src/caliptra_prim_generic/config/caliptra_prim_generic.vf new file mode 100644 index 000000000..38af67734 --- /dev/null +++ b/src/caliptra_prim_generic/config/caliptra_prim_generic.vf @@ -0,0 +1,4 @@ ++incdir+${CALIPTRA_ROOT}/src/caliptra_prim_generic/rtl +${CALIPTRA_ROOT}/src/caliptra_prim_generic/rtl/caliptra_prim_generic_flop_en.sv +${CALIPTRA_ROOT}/src/caliptra_prim_generic/rtl/caliptra_prim_generic_flop.sv +${CALIPTRA_ROOT}/src/caliptra_prim_generic/rtl/caliptra_prim_generic_buf.sv diff --git a/src/caliptra_prim_generic/config/compile.yml b/src/caliptra_prim_generic/config/compile.yml new file mode 100644 index 000000000..f18389093 --- /dev/null +++ b/src/caliptra_prim_generic/config/compile.yml @@ -0,0 +1,10 @@ +--- +provides: [caliptra_prim_generic] +schema_version: 2.4.0 +targets: + rtl: + directories: [$COMPILE_ROOT/rtl] + files: + - $COMPILE_ROOT/rtl/caliptra_prim_generic_flop_en.sv + - $COMPILE_ROOT/rtl/caliptra_prim_generic_flop.sv + - $COMPILE_ROOT/rtl/caliptra_prim_generic_buf.sv diff --git a/src/prim_generic/rtl/prim_generic_buf.sv b/src/caliptra_prim_generic/rtl/caliptra_prim_generic_buf.sv similarity index 82% rename from src/prim_generic/rtl/prim_generic_buf.sv rename to src/caliptra_prim_generic/rtl/caliptra_prim_generic_buf.sv index 1b2fbffad..02d5b7da7 100644 --- a/src/prim_generic/rtl/prim_generic_buf.sv +++ b/src/caliptra_prim_generic/rtl/caliptra_prim_generic_buf.sv @@ -2,9 +2,9 @@ // Licensed under the Apache License, Version 2.0, see LICENSE for details. // SPDX-License-Identifier: Apache-2.0 -`include "prim_assert.sv" +`include "caliptra_prim_assert.sv" -module prim_generic_buf #( +module caliptra_prim_generic_buf #( parameter int Width = 1 ) ( input [Width-1:0] in_i, diff --git a/src/prim_generic/rtl/prim_generic_flop.sv b/src/caliptra_prim_generic/rtl/caliptra_prim_generic_flop.sv similarity index 88% rename from src/prim_generic/rtl/prim_generic_flop.sv rename to src/caliptra_prim_generic/rtl/caliptra_prim_generic_flop.sv index 67b6e8906..4bce14585 100644 --- a/src/prim_generic/rtl/prim_generic_flop.sv +++ b/src/caliptra_prim_generic/rtl/caliptra_prim_generic_flop.sv @@ -2,9 +2,9 @@ // Licensed under the Apache License, Version 2.0, see LICENSE for details. // SPDX-License-Identifier: Apache-2.0 -`include "prim_assert.sv" +`include "caliptra_prim_assert.sv" -module prim_generic_flop #( +module caliptra_prim_generic_flop #( parameter int Width = 1, parameter logic [Width-1:0] ResetValue = 0 ) ( diff --git a/src/prim_generic/rtl/prim_generic_flop_en.sv b/src/caliptra_prim_generic/rtl/caliptra_prim_generic_flop_en.sv similarity index 88% rename from src/prim_generic/rtl/prim_generic_flop_en.sv rename to src/caliptra_prim_generic/rtl/caliptra_prim_generic_flop_en.sv index 3c367b735..0a6ffba17 100644 --- a/src/prim_generic/rtl/prim_generic_flop_en.sv +++ b/src/caliptra_prim_generic/rtl/caliptra_prim_generic_flop_en.sv @@ -2,9 +2,9 @@ // Licensed under the Apache License, Version 2.0, see LICENSE for details. // SPDX-License-Identifier: Apache-2.0 -`include "prim_assert.sv" +`include "caliptra_prim_assert.sv" -module prim_generic_flop_en #( +module caliptra_prim_generic_flop_en #( parameter int Width = 1, parameter bit EnSecBuf = 0, parameter logic [Width-1:0] ResetValue = 0 @@ -18,7 +18,7 @@ module prim_generic_flop_en #( logic en; if (EnSecBuf) begin : gen_en_sec_buf - prim_sec_anchor_buf #( + caliptra_prim_sec_anchor_buf #( .Width(1) ) u_en_buf ( .in_i(en_i), diff --git a/src/csrng/config/compile.yml b/src/csrng/config/compile.yml index 2c4db93c2..146c5653c 100644 --- a/src/csrng/config/compile.yml +++ b/src/csrng/config/compile.yml @@ -1,6 +1,8 @@ --- provides: [csrng_pkg] schema_version: 2.4.0 +requires: + - entropy_src_pkg targets: rtl: directories: [$COMPILE_ROOT/rtl] @@ -17,8 +19,8 @@ provides: [csrng] schema_version: 2.4.0 requires: - libs - - prim_generic - - prim + - caliptra_prim_generic + - caliptra_prim - lc_ctrl_pkg - entropy_src_pkg - edn_pkg diff --git a/src/csrng/config/csrng.vf b/src/csrng/config/csrng.vf index 70811b6d7..ef06dd886 100644 --- a/src/csrng/config/csrng.vf +++ b/src/csrng/config/csrng.vf @@ -1,10 +1,10 @@ +incdir+${CALIPTRA_ROOT}/src/integration/rtl +incdir+${CALIPTRA_ROOT}/src/libs/rtl -+incdir+${CALIPTRA_ROOT}/src/prim/rtl ++incdir+${CALIPTRA_ROOT}/src/caliptra_prim/rtl +incdir+${CALIPTRA_ROOT}/src/lc_ctrl/rtl +incdir+${CALIPTRA_ROOT}/src/entropy_src/rtl +incdir+${CALIPTRA_ROOT}/src/csrng/rtl -+incdir+${CALIPTRA_ROOT}/src/prim_generic/rtl ++incdir+${CALIPTRA_ROOT}/src/caliptra_prim_generic/rtl +incdir+${CALIPTRA_ROOT}/src/edn/rtl +incdir+${CALIPTRA_ROOT}/src/aes/rtl ${CALIPTRA_ROOT}/src/integration/rtl/config_defines.svh @@ -18,12 +18,14 @@ ${CALIPTRA_ROOT}/src/libs/rtl/apb_slv_sif.sv ${CALIPTRA_ROOT}/src/libs/rtl/ahb_slv_sif.sv ${CALIPTRA_ROOT}/src/libs/rtl/caliptra_icg.sv ${CALIPTRA_ROOT}/src/libs/rtl/clk_gate.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_util_pkg.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_alert_pkg.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_subreg_pkg.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_mubi_pkg.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_cipher_pkg.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_pkg.sv +${CALIPTRA_ROOT}/src/libs/rtl/caliptra_2ff_sync.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_util_pkg.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_alert_pkg.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_subreg_pkg.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_mubi_pkg.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_cipher_pkg.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_pkg.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_sparse_fsm_pkg.sv ${CALIPTRA_ROOT}/src/lc_ctrl/rtl/lc_ctrl_reg_pkg.sv ${CALIPTRA_ROOT}/src/lc_ctrl/rtl/lc_ctrl_state_pkg.sv ${CALIPTRA_ROOT}/src/lc_ctrl/rtl/lc_ctrl_pkg.sv @@ -34,37 +36,40 @@ ${CALIPTRA_ROOT}/src/entropy_src/rtl/entropy_src_pkg.sv ${CALIPTRA_ROOT}/src/csrng/rtl/csrng_reg_pkg.sv ${CALIPTRA_ROOT}/src/csrng/rtl/csrng_pkg.sv ${CALIPTRA_ROOT}/src/libs/rtl/ahb_to_reg_adapter.sv -${CALIPTRA_ROOT}/src/prim_generic/rtl/prim_generic_flop.sv -${CALIPTRA_ROOT}/src/prim_generic/rtl/prim_generic_buf.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_flop_2sync.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_lfsr.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_mubi4_sync.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_diff_decode.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_sec_anchor_buf.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_slicer.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_count.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_sparse_fsm_flop.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_dom_and_2share.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_sec_anchor_flop.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_reg_we_check.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_packer_fifo.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_max_tree.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_subreg_arb.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_subreg.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_intr_hw.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_onehot_check.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_mubi8_sync.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_fifo_sync_cnt.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_buf.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_lc_sync.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_alert_receiver.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_flop.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_alert_sender.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_fifo_sync.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_arbiter_ppc.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_sum_tree.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_subreg_ext.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_edge_detector.sv +${CALIPTRA_ROOT}/src/caliptra_prim_generic/rtl/caliptra_prim_generic_flop_en.sv +${CALIPTRA_ROOT}/src/caliptra_prim_generic/rtl/caliptra_prim_generic_flop.sv +${CALIPTRA_ROOT}/src/caliptra_prim_generic/rtl/caliptra_prim_generic_buf.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_flop_en.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_cdc_rand_delay.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_flop_2sync.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_lfsr.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_mubi4_sync.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_diff_decode.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_sec_anchor_buf.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_slicer.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_count.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_sparse_fsm_flop.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_dom_and_2share.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_sec_anchor_flop.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_reg_we_check.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_packer_fifo.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_max_tree.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_subreg_arb.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_subreg.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_intr_hw.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_onehot_check.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_mubi8_sync.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_fifo_sync_cnt.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_buf.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_lc_sync.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_alert_receiver.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_flop.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_alert_sender.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_fifo_sync.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_arbiter_ppc.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_sum_tree.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_subreg_ext.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_edge_detector.sv ${CALIPTRA_ROOT}/src/edn/rtl/edn_pkg.sv ${CALIPTRA_ROOT}/src/aes/rtl/aes_reg_pkg.sv ${CALIPTRA_ROOT}/src/aes/rtl/aes_pkg.sv @@ -96,4 +101,5 @@ ${CALIPTRA_ROOT}/src/csrng/rtl/csrng_ctr_drbg_gen.sv ${CALIPTRA_ROOT}/src/csrng/rtl/csrng_block_encrypt.sv ${CALIPTRA_ROOT}/src/csrng/rtl/csrng_state_db.sv ${CALIPTRA_ROOT}/src/csrng/rtl/csrng_cmd_stage.sv -${CALIPTRA_ROOT}/src/csrng/rtl/csrng.sv \ No newline at end of file +${CALIPTRA_ROOT}/src/csrng/rtl/csrng.sv +${CALIPTRA_ROOT}/src/csrng/tb/csrng_tb.sv diff --git a/src/csrng/config/csrng.vlt b/src/csrng/config/csrng.vlt index 9aba1faef..7ef75610e 100644 --- a/src/csrng/config/csrng.vlt +++ b/src/csrng/config/csrng.vlt @@ -1,6 +1,6 @@ // Licensed under the Apache License, Version 2.0, see LICENSE for details. // SPDX-License-Identifier: Apache-2.0 // -${CALIPTRA_ROOT}/src/prim/lint/prim_onehot_check.vlt -${CALIPTRA_ROOT}/src/prim/lint/prim_arbiter.vlt +${CALIPTRA_ROOT}/src/caliptra_prim/lint/caliptra_prim_onehot_check.vlt +${CALIPTRA_ROOT}/src/caliptra_prim/lint/caliptra_prim_arbiter.vlt ${CALIPTRA_ROOT}/src/csrng/lint/csrng.vlt diff --git a/src/csrng/config/csrng_pkg.vf b/src/csrng/config/csrng_pkg.vf index 5c3f2e165..6badfdba1 100644 --- a/src/csrng/config/csrng_pkg.vf +++ b/src/csrng/config/csrng_pkg.vf @@ -1,4 +1,9 @@ ++incdir+${CALIPTRA_ROOT}/src/entropy_src/rtl +incdir+${CALIPTRA_ROOT}/src/csrng/rtl +${CALIPTRA_ROOT}/src/entropy_src/rtl/entropy_src_main_sm_pkg.sv +${CALIPTRA_ROOT}/src/entropy_src/rtl/entropy_src_ack_sm_pkg.sv +${CALIPTRA_ROOT}/src/entropy_src/rtl/entropy_src_reg_pkg.sv +${CALIPTRA_ROOT}/src/entropy_src/rtl/entropy_src_pkg.sv ${CALIPTRA_ROOT}/src/csrng/rtl/csrng_reg_pkg.sv ${CALIPTRA_ROOT}/src/csrng/rtl/csrng_pkg.sv ${CALIPTRA_ROOT}/src/csrng/rtl/csrng_pkg.sv \ No newline at end of file diff --git a/src/csrng/config/csrng_tb.vf b/src/csrng/config/csrng_tb.vf index 71bd1fab4..4793e52ec 100644 --- a/src/csrng/config/csrng_tb.vf +++ b/src/csrng/config/csrng_tb.vf @@ -1,10 +1,10 @@ +incdir+${CALIPTRA_ROOT}/src/integration/rtl +incdir+${CALIPTRA_ROOT}/src/libs/rtl -+incdir+${CALIPTRA_ROOT}/src/prim/rtl ++incdir+${CALIPTRA_ROOT}/src/caliptra_prim/rtl +incdir+${CALIPTRA_ROOT}/src/lc_ctrl/rtl +incdir+${CALIPTRA_ROOT}/src/entropy_src/rtl +incdir+${CALIPTRA_ROOT}/src/csrng/rtl -+incdir+${CALIPTRA_ROOT}/src/prim_generic/rtl ++incdir+${CALIPTRA_ROOT}/src/caliptra_prim_generic/rtl +incdir+${CALIPTRA_ROOT}/src/edn/rtl +incdir+${CALIPTRA_ROOT}/src/aes/rtl +incdir+${CALIPTRA_ROOT}/src/csrng/tb @@ -19,12 +19,14 @@ ${CALIPTRA_ROOT}/src/libs/rtl/apb_slv_sif.sv ${CALIPTRA_ROOT}/src/libs/rtl/ahb_slv_sif.sv ${CALIPTRA_ROOT}/src/libs/rtl/caliptra_icg.sv ${CALIPTRA_ROOT}/src/libs/rtl/clk_gate.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_util_pkg.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_alert_pkg.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_subreg_pkg.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_mubi_pkg.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_cipher_pkg.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_pkg.sv +${CALIPTRA_ROOT}/src/libs/rtl/caliptra_2ff_sync.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_util_pkg.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_alert_pkg.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_subreg_pkg.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_mubi_pkg.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_cipher_pkg.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_pkg.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_sparse_fsm_pkg.sv ${CALIPTRA_ROOT}/src/lc_ctrl/rtl/lc_ctrl_reg_pkg.sv ${CALIPTRA_ROOT}/src/lc_ctrl/rtl/lc_ctrl_state_pkg.sv ${CALIPTRA_ROOT}/src/lc_ctrl/rtl/lc_ctrl_pkg.sv @@ -35,37 +37,40 @@ ${CALIPTRA_ROOT}/src/entropy_src/rtl/entropy_src_pkg.sv ${CALIPTRA_ROOT}/src/csrng/rtl/csrng_reg_pkg.sv ${CALIPTRA_ROOT}/src/csrng/rtl/csrng_pkg.sv ${CALIPTRA_ROOT}/src/libs/rtl/ahb_to_reg_adapter.sv -${CALIPTRA_ROOT}/src/prim_generic/rtl/prim_generic_flop.sv -${CALIPTRA_ROOT}/src/prim_generic/rtl/prim_generic_buf.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_flop_2sync.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_lfsr.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_mubi4_sync.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_diff_decode.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_sec_anchor_buf.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_slicer.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_count.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_sparse_fsm_flop.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_dom_and_2share.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_sec_anchor_flop.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_reg_we_check.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_packer_fifo.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_max_tree.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_subreg_arb.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_subreg.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_intr_hw.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_onehot_check.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_mubi8_sync.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_fifo_sync_cnt.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_buf.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_lc_sync.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_alert_receiver.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_flop.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_alert_sender.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_fifo_sync.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_arbiter_ppc.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_sum_tree.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_subreg_ext.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_edge_detector.sv +${CALIPTRA_ROOT}/src/caliptra_prim_generic/rtl/caliptra_prim_generic_flop_en.sv +${CALIPTRA_ROOT}/src/caliptra_prim_generic/rtl/caliptra_prim_generic_flop.sv +${CALIPTRA_ROOT}/src/caliptra_prim_generic/rtl/caliptra_prim_generic_buf.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_flop_en.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_cdc_rand_delay.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_flop_2sync.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_lfsr.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_mubi4_sync.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_diff_decode.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_sec_anchor_buf.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_slicer.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_count.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_sparse_fsm_flop.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_dom_and_2share.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_sec_anchor_flop.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_reg_we_check.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_packer_fifo.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_max_tree.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_subreg_arb.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_subreg.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_intr_hw.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_onehot_check.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_mubi8_sync.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_fifo_sync_cnt.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_buf.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_lc_sync.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_alert_receiver.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_flop.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_alert_sender.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_fifo_sync.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_arbiter_ppc.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_sum_tree.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_subreg_ext.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_edge_detector.sv ${CALIPTRA_ROOT}/src/edn/rtl/edn_pkg.sv ${CALIPTRA_ROOT}/src/aes/rtl/aes_reg_pkg.sv ${CALIPTRA_ROOT}/src/aes/rtl/aes_pkg.sv @@ -98,4 +103,4 @@ ${CALIPTRA_ROOT}/src/csrng/rtl/csrng_block_encrypt.sv ${CALIPTRA_ROOT}/src/csrng/rtl/csrng_state_db.sv ${CALIPTRA_ROOT}/src/csrng/rtl/csrng_cmd_stage.sv ${CALIPTRA_ROOT}/src/csrng/rtl/csrng.sv -${CALIPTRA_ROOT}/src/csrng/tb/csrng_tb.sv \ No newline at end of file +${CALIPTRA_ROOT}/src/csrng/tb/csrng_tb.sv diff --git a/src/csrng/data/csrng.hjson b/src/csrng/data/csrng.hjson index 0c6c911f9..1748549ed 100644 --- a/src/csrng/data/csrng.hjson +++ b/src/csrng/data/csrng.hjson @@ -75,7 +75,7 @@ type: "uni" name: "otp_en_csrng_sw_app_read" act: "rcv" - package: "prim_mubi_pkg" + package: "caliptra_prim_mubi_pkg" } { struct: "lc_tx" type: "uni" diff --git a/src/csrng/data/csrng.json b/src/csrng/data/csrng.json index b25e5c086..d9c035aed 100644 --- a/src/csrng/data/csrng.json +++ b/src/csrng/data/csrng.json @@ -92,7 +92,7 @@ "type": "uni", "name": "otp_en_csrng_sw_app_read", "act": "rcv", - "package": "prim_mubi_pkg" + "package": "caliptra_prim_mubi_pkg" }, { "struct": "lc_tx", diff --git a/src/csrng/lint/csrng.waiver b/src/csrng/lint/csrng.waiver index 75a4e51a7..2c9b4c8a3 100644 --- a/src/csrng/lint/csrng.waiver +++ b/src/csrng/lint/csrng.waiver @@ -4,7 +4,7 @@ # # waiver file for csrng -waive -rules {ONE_BIT_MEM_WIDTH} -location {prim_arbiter_ppc.sv} -regexp {.*has word width which is single bit wide.*} \ +waive -rules {ONE_BIT_MEM_WIDTH} -location {caliptra_prim_arbiter_ppc.sv} -regexp {.*has word width which is single bit wide.*} \ -comment "Usage case specific to CSRNG and how the arbiter is used." waive -rules {LHS_TOO_SHORT} -location {aes_cipher_control_fsm.sv aes_cipher_core.sv aes_key_expand.sv aes_sbox.sv} -regexp {Bitlength mismatch between 'unused_assert_static_lint_error' length 1 and.*} \ -comment "CSRNG intentionally uses an unmasked AES implementation." diff --git a/src/csrng/rtl/csrng.sv b/src/csrng/rtl/csrng.sv index 70350a1f4..8aed50dba 100644 --- a/src/csrng/rtl/csrng.sv +++ b/src/csrng/rtl/csrng.sv @@ -4,7 +4,7 @@ // // Description: csrng top level wrapper file -`include "prim_assert.sv" +`include "caliptra_prim_assert.sv" module csrng import csrng_pkg::*; @@ -38,7 +38,7 @@ module csrng // OTP Interface // SEC_CM: INTERSIG.MUBI - input prim_mubi_pkg::mubi8_t otp_en_csrng_sw_app_read_i, + input caliptra_prim_mubi_pkg::mubi8_t otp_en_csrng_sw_app_read_i, // Lifecycle broadcast inputs input lc_ctrl_pkg::lc_tx_t lc_hw_debug_en_i, @@ -56,8 +56,8 @@ module csrng output csrng_rsp_t [NHwApps-1:0] csrng_cmd_o, // Alerts - input prim_alert_pkg::alert_rx_t [NumAlerts-1:0] alert_rx_i, - output prim_alert_pkg::alert_tx_t [NumAlerts-1:0] alert_tx_o, + input caliptra_prim_alert_pkg::alert_rx_t [NumAlerts-1:0] alert_rx_i, + output caliptra_prim_alert_pkg::alert_tx_t [NumAlerts-1:0] alert_tx_o, // Interrupts output logic intr_cs_cmd_req_done_o, @@ -144,10 +144,10 @@ module csrng // Alert generation /////////////////////////// for (genvar i = 0; i < NumAlerts; i++) begin : gen_alert_tx - prim_alert_sender #( + caliptra_prim_alert_sender #( .AsyncOn(AlertAsyncOn[i]), .IsFatal(i) - ) u_prim_alert_sender ( + ) u_caliptra_prim_alert_sender ( .clk_i, .rst_ni, .alert_test_i (alert_test[i] ), @@ -185,16 +185,16 @@ module csrng `CALIPTRA_ASSERT_KNOWN(IntrCsFatalErrKnownO_A, intr_cs_fatal_err_o) `CALIPTRA_ASSERT_PRIM_COUNT_ERROR_TRIGGER_ALERT(CtrDrbgUpdAlertCheck_A, - u_csrng_core.u_csrng_ctr_drbg_upd.u_prim_count_ctr_drbg, + u_csrng_core.u_csrng_ctr_drbg_upd.u_caliptra_prim_count_ctr_drbg, alert_tx_o[1]) `CALIPTRA_ASSERT_PRIM_COUNT_ERROR_TRIGGER_ALERT(CtrDrbgGenAlertCheck_A, - u_csrng_core.u_csrng_ctr_drbg_gen.u_prim_count_ctr_drbg, + u_csrng_core.u_csrng_ctr_drbg_gen.u_caliptra_prim_count_ctr_drbg, alert_tx_o[1]) for (genvar i = 0; i < NHwApps + 1; i++) begin : gen_cnt_asserts `CALIPTRA_ASSERT_PRIM_COUNT_ERROR_TRIGGER_ALERT(CntAlertCheck_A, - u_csrng_core.gen_cmd_stage[i].u_csrng_cmd_stage.u_prim_count_cmd_gen_cntr, + u_csrng_core.gen_cmd_stage[i].u_csrng_cmd_stage.u_caliptra_prim_count_cmd_gen_cntr, alert_tx_o[1]) `CALIPTRA_ASSERT_PRIM_FSM_ERROR_TRIGGER_ALERT(DrbgCmdFsmCheck_A, diff --git a/src/csrng/rtl/csrng_block_encrypt.sv b/src/csrng/rtl/csrng_block_encrypt.sv index 853e566f5..a05152b65 100644 --- a/src/csrng/rtl/csrng_block_encrypt.sv +++ b/src/csrng/rtl/csrng_block_encrypt.sv @@ -137,11 +137,11 @@ module csrng_block_encrypt import csrng_pkg::*; #( // cmd / id tracking fifo //-------------------------------------------- - prim_fifo_sync #( + caliptra_prim_fifo_sync #( .Width(BlkEncFifoWidth), .Pass(0), .Depth(BlkEncFifoDepth) - ) u_prim_fifo_sync_blkenc ( + ) u_caliptra_prim_fifo_sync_blkenc ( .clk_i (clk_i), .rst_ni (rst_ni), .clr_i (!block_encrypt_enable_i), diff --git a/src/csrng/rtl/csrng_cmd_stage.sv b/src/csrng/rtl/csrng_cmd_stage.sv index a8d1eae76..f62311e79 100644 --- a/src/csrng/rtl/csrng_cmd_stage.sv +++ b/src/csrng/rtl/csrng_cmd_stage.sv @@ -116,12 +116,12 @@ module csrng_cmd_stage import csrng_pkg::*; #( // Capture the transfer length of data behind the command. //--------------------------------------------------------- - prim_fifo_sync #( + caliptra_prim_fifo_sync #( .Width(CmdFifoWidth), .Pass(0), .Depth(CmdFifoDepth), .OutputZeroIfEmpty(1'b0) - ) u_prim_fifo_cmd ( + ) u_caliptra_prim_fifo_cmd ( .clk_i (clk_i), .rst_ni (rst_ni), .clr_i (!cs_enable_i), @@ -180,10 +180,10 @@ module csrng_cmd_stage import csrng_pkg::*; #( cmd_gen_cmd_q; // SEC_CM: GEN_CMD.CTR.REDUN - prim_count #( + caliptra_prim_count #( .Width(GenBitsCntrWidth), .ResetValue({GenBitsCntrWidth{1'b1}}) - ) u_prim_count_cmd_gen_cntr ( + ) u_caliptra_prim_count_cmd_gen_cntr ( .clk_i, .rst_ni, .clr_i(!cs_enable_i), @@ -239,7 +239,7 @@ module csrng_cmd_stage import csrng_pkg::*; #( } state_e; state_e state_d, state_q; - `PRIM_FLOP_SPARSE_FSM(u_state_regs, state_d, state_q, state_e, Idle) + `CALIPTRA_PRIM_FLOP_SPARSE_FSM(u_state_regs, state_d, state_q, state_e, Idle) always_comb begin state_d = state_q; @@ -367,12 +367,12 @@ module csrng_cmd_stage import csrng_pkg::*; #( // Genbits FIFO. //--------------------------------------------------------- - prim_fifo_sync #( + caliptra_prim_fifo_sync #( .Width(GenBitsFifoWidth), .Pass(0), .Depth(GenBitsFifoDepth), .OutputZeroIfEmpty(0) // Set to 0, and let last data drive out. - ) u_prim_fifo_genbits ( + ) u_caliptra_prim_fifo_genbits ( .clk_i (clk_i), .rst_ni (rst_ni), .clr_i (!cs_enable_i), diff --git a/src/csrng/rtl/csrng_core.sv b/src/csrng/rtl/csrng_core.sv index 9aa6bf678..8fc153a01 100644 --- a/src/csrng/rtl/csrng_core.sv +++ b/src/csrng/rtl/csrng_core.sv @@ -19,7 +19,7 @@ module csrng_core import csrng_pkg::*; #( output csrng_reg_pkg::csrng_hw2reg_t hw2reg, // Efuse Interface - input prim_mubi_pkg::mubi8_t otp_en_csrng_sw_app_read_i, + input caliptra_prim_mubi_pkg::mubi8_t otp_en_csrng_sw_app_read_i, // Lifecycle broadcast inputs input lc_ctrl_pkg::lc_tx_t lc_hw_debug_en_i, @@ -51,9 +51,9 @@ module csrng_core import csrng_pkg::*; #( import csrng_reg_pkg::*; - import prim_mubi_pkg::mubi4_t; - import prim_mubi_pkg::mubi4_test_true_strict; - import prim_mubi_pkg::mubi4_test_invalid; + import caliptra_prim_mubi_pkg::mubi4_t; + import caliptra_prim_mubi_pkg::mubi4_test_true_strict; + import caliptra_prim_mubi_pkg::mubi4_test_invalid; localparam int NApps = NHwApps + 1; localparam int AppCmdWidth = 32; @@ -353,9 +353,9 @@ module csrng_core import csrng_pkg::*; #( logic unused_reg2hw_genbits; logic unused_int_state_val; - prim_mubi_pkg::mubi8_t [1:0] en_csrng_sw_app_read; - prim_mubi_pkg::mubi4_t [CsEnableCopies-1:0] mubi_cs_enable_fanout; - prim_mubi_pkg::mubi4_t [Flag0Copies-1:0] mubi_flag0_fanout; + caliptra_prim_mubi_pkg::mubi8_t [1:0] en_csrng_sw_app_read; + caliptra_prim_mubi_pkg::mubi4_t [CsEnableCopies-1:0] mubi_cs_enable_fanout; + caliptra_prim_mubi_pkg::mubi4_t [Flag0Copies-1:0] mubi_flag0_fanout; // flops logic [2:0] acmd_q, acmd_d; @@ -379,7 +379,7 @@ module csrng_core import csrng_pkg::*; #( acmd_q <= '0; shid_q <= '0; gen_last_q <= '0; - flag0_q <= prim_mubi_pkg::MuBi4False; + flag0_q <= caliptra_prim_mubi_pkg::MuBi4False; cmd_arb_idx_q <= '0; statedb_wr_select_q <= '0; genbits_stage_fips_sw_q <= '0; @@ -414,7 +414,7 @@ module csrng_core import csrng_pkg::*; #( //-------------------------------------------- // All TLUL interrupts are collect in the section. - prim_intr_hw #( + caliptra_prim_intr_hw #( .Width(1) ) u_intr_hw_cs_cmd_req_done ( .clk_i (clk_i), @@ -429,7 +429,7 @@ module csrng_core import csrng_pkg::*; #( .intr_o (intr_cs_cmd_req_done_o) ); - prim_intr_hw #( + caliptra_prim_intr_hw #( .Width(1) ) u_intr_hw_cs_entropy_req ( .clk_i (clk_i), @@ -445,7 +445,7 @@ module csrng_core import csrng_pkg::*; #( ); - prim_intr_hw #( + caliptra_prim_intr_hw #( .Width(1) ) u_intr_hw_cs_hw_inst_exc ( .clk_i (clk_i), @@ -461,7 +461,7 @@ module csrng_core import csrng_pkg::*; #( ); - prim_intr_hw #( + caliptra_prim_intr_hw #( .Width(1) ) u_intr_hw_cs_fatal_err ( .clk_i (clk_i), @@ -734,11 +734,11 @@ module csrng_core import csrng_pkg::*; #( cs_bus_cmp_alert; - prim_edge_detector #( + caliptra_prim_edge_detector #( .Width(1), .ResetValue(0), .EnSync(0) - ) u_prim_edge_detector_recov_alert ( + ) u_caliptra_prim_edge_detector_recov_alert ( .clk_i, .rst_ni, .d_i(recov_alert_event), @@ -761,10 +761,10 @@ module csrng_core import csrng_pkg::*; #( assign cs_enable_fo[i] = mubi4_test_true_strict(mubi_cs_enable_fanout[i]); end : gen_mubi_en_copies - prim_mubi4_sync #( + caliptra_prim_mubi4_sync #( .NumCopies(CsEnableCopies), .AsyncOn(0) - ) u_prim_mubi4_sync_cs_enable ( + ) u_caliptra_prim_mubi4_sync_cs_enable ( .clk_i, .rst_ni, .mubi_i(mubi_cs_enable), @@ -780,10 +780,10 @@ module csrng_core import csrng_pkg::*; #( assign hw2reg.recov_alert_sts.sw_app_enable_field_alert.de = sw_app_enable_pfa; assign hw2reg.recov_alert_sts.sw_app_enable_field_alert.d = sw_app_enable_pfa; - prim_mubi4_sync #( + caliptra_prim_mubi4_sync #( .NumCopies(2), .AsyncOn(0) - ) u_prim_mubi4_sync_sw_app_enable ( + ) u_caliptra_prim_mubi4_sync_sw_app_enable ( .clk_i, .rst_ni, .mubi_i(mubi_sw_app_enable), @@ -799,10 +799,10 @@ module csrng_core import csrng_pkg::*; #( assign hw2reg.recov_alert_sts.read_int_state_field_alert.de = read_int_state_pfa; assign hw2reg.recov_alert_sts.read_int_state_field_alert.d = read_int_state_pfa; - prim_mubi4_sync #( + caliptra_prim_mubi4_sync #( .NumCopies(2), .AsyncOn(0) - ) u_prim_mubi4_sync_read_int_state ( + ) u_caliptra_prim_mubi4_sync_read_int_state ( .clk_i, .rst_ni, .mubi_i(mubi_read_int_state), @@ -885,13 +885,13 @@ module csrng_core import csrng_pkg::*; #( assign hw2reg.genbits.d = (sw_app_enable && efuse_sw_app_enable[0]) ? genbits_stage_bus_sw : '0; assign genbits_stage_bus_rd_sw = reg2hw.genbits.re; - assign efuse_sw_app_enable[0] = prim_mubi_pkg::mubi8_test_true_strict(en_csrng_sw_app_read[0]); - assign efuse_sw_app_enable[1] = prim_mubi_pkg::mubi8_test_true_strict(en_csrng_sw_app_read[1]); + assign efuse_sw_app_enable[0] = caliptra_prim_mubi_pkg::mubi8_test_true_strict(en_csrng_sw_app_read[0]); + assign efuse_sw_app_enable[1] = caliptra_prim_mubi_pkg::mubi8_test_true_strict(en_csrng_sw_app_read[1]); - prim_mubi8_sync #( + caliptra_prim_mubi8_sync #( .NumCopies(2), .AsyncOn(1) - ) u_prim_mubi8_sync_sw_app_read ( + ) u_caliptra_prim_mubi8_sync_sw_app_read ( .clk_i, .rst_ni, .mubi_i(otp_en_csrng_sw_app_read_i), @@ -900,11 +900,11 @@ module csrng_core import csrng_pkg::*; #( // pack the gen bits into a 32 bit register sized word - prim_packer_fifo #( + caliptra_prim_packer_fifo #( .InW(BlkLen), .OutW(32), .ClearOnRead(1'b0) - ) u_prim_packer_fifo_sw_genbits ( + ) u_caliptra_prim_packer_fifo_sw_genbits ( .clk_i (clk_i), .rst_ni (rst_ni), .clr_i (!cs_enable_fo[29]), @@ -1015,11 +1015,11 @@ module csrng_core import csrng_pkg::*; #( // Can't be fed directly to port-list per Synthesis failure assign cmd_arb_di = '{1'b0, 1'b0, 1'b0}; - prim_arbiter_ppc #( + caliptra_prim_arbiter_ppc #( .EnDataPort(0), // Ignore data port .N(NApps), // Number of request ports .DW(1) // Data width - ) u_prim_arbiter_ppc_acmd ( + ) u_caliptra_prim_arbiter_ppc_acmd ( .clk_i (clk_i), .rst_ni (rst_ni), .req_chk_i(cs_enable_fo[1]), @@ -1060,7 +1060,7 @@ module csrng_core import csrng_pkg::*; #( gen_last_q; assign flag0_d = - (!cs_enable_fo[35]) ? prim_mubi_pkg::MuBi4False : + (!cs_enable_fo[35]) ? caliptra_prim_mubi_pkg::MuBi4False : (acmd_sop && ((acmd_bus[2:0] == INS) || (acmd_bus[2:0] == RES))) ? flag0 : flag0_q; @@ -1072,10 +1072,10 @@ module csrng_core import csrng_pkg::*; #( assign flag0_fo[i] = mubi4_test_true_strict(mubi_flag0_fanout[i]); end : gen_mubi_flag0_copies - prim_mubi4_sync #( + caliptra_prim_mubi4_sync #( .NumCopies(Flag0Copies), .AsyncOn(0) - ) u_prim_mubi4_sync_flag0 ( + ) u_caliptra_prim_mubi4_sync_flag0 ( .clk_i, .rst_ni, .mubi_i(mubi_flag0), @@ -1131,11 +1131,11 @@ module csrng_core import csrng_pkg::*; #( end : gen_cmd_ack - prim_packer_fifo #( + caliptra_prim_packer_fifo #( .InW(32), .OutW(SeedLen), .ClearOnRead(1'b1) - ) u_prim_packer_fifo_adata ( + ) u_caliptra_prim_packer_fifo_adata ( .clk_i (clk_i), .rst_ni (rst_ni), .clr_i (!cs_enable_fo[37] || packer_adata_clr), @@ -1422,10 +1422,10 @@ module csrng_core import csrng_pkg::*; #( // update block arbiter - prim_arbiter_ppc #( + caliptra_prim_arbiter_ppc #( .N(NUpdateArbReqs), // (cmd req and gen req) .DW(UpdateArbWidth) // Data width - ) u_prim_arbiter_ppc_updblk_arb ( + ) u_caliptra_prim_arbiter_ppc_updblk_arb ( .clk_i(clk_i), .rst_ni(rst_ni), .req_chk_i(cs_enable_fo[1]), @@ -1464,9 +1464,9 @@ module csrng_core import csrng_pkg::*; #( lc_ctrl_pkg::lc_tx_t [LcHwDebugCopies-1:0] lc_hw_debug_en_out; - prim_lc_sync #( + caliptra_prim_lc_sync #( .NumCopies(LcHwDebugCopies) - ) u_prim_lc_sync ( + ) u_caliptra_prim_lc_sync ( .clk_i, .rst_ni, .lc_en_i(lc_hw_debug_en_i), @@ -1515,10 +1515,10 @@ module csrng_core import csrng_pkg::*; #( ); - prim_arbiter_ppc #( + caliptra_prim_arbiter_ppc #( .N(NBlkEncArbReqs), // (upd req and gen req) .DW(BlkEncArbWidth) // Data width - ) u_prim_arbiter_ppc_benblk_arb ( + ) u_caliptra_prim_arbiter_ppc_benblk_arb ( .clk_i(clk_i), .rst_ni(rst_ni), .req_chk_i(cs_enable_fo[1]), diff --git a/src/csrng/rtl/csrng_ctr_drbg_cmd.sv b/src/csrng/rtl/csrng_ctr_drbg_cmd.sv index d4df09ade..567cbbf24 100644 --- a/src/csrng/rtl/csrng_ctr_drbg_cmd.sv +++ b/src/csrng/rtl/csrng_ctr_drbg_cmd.sv @@ -138,12 +138,12 @@ module csrng_ctr_drbg_cmd import csrng_pkg::*; #( // input request fifo for staging cmd request //-------------------------------------------- - prim_fifo_sync #( + caliptra_prim_fifo_sync #( .Width(CmdreqFifoWidth), .Pass(0), .Depth(CmdreqFifoDepth), .OutputZeroIfEmpty(1'b0) - ) u_prim_fifo_sync_cmdreq ( + ) u_caliptra_prim_fifo_sync_cmdreq ( .clk_i (clk_i), .rst_ni (rst_ni), .clr_i (!ctr_drbg_cmd_enable_i), @@ -235,12 +235,12 @@ module csrng_ctr_drbg_cmd import csrng_pkg::*; #( // fifo to stage rc and command, waiting for update block to ack //-------------------------------------------- - prim_fifo_sync #( + caliptra_prim_fifo_sync #( .Width(RCStageFifoWidth), .Pass(0), .Depth(RCStageFifoDepth), .OutputZeroIfEmpty(1'b0) - ) u_prim_fifo_sync_rcstage ( + ) u_caliptra_prim_fifo_sync_rcstage ( .clk_i (clk_i), .rst_ni (rst_ni), .clr_i (!ctr_drbg_cmd_enable_i), @@ -274,12 +274,12 @@ module csrng_ctr_drbg_cmd import csrng_pkg::*; #( // final cmd block processing //-------------------------------------------- - prim_fifo_sync #( + caliptra_prim_fifo_sync #( .Width(KeyVRCFifoWidth), .Pass(0), .Depth(KeyVRCFifoDepth), .OutputZeroIfEmpty(1'b0) - ) u_prim_fifo_sync_keyvrc ( + ) u_caliptra_prim_fifo_sync_keyvrc ( .clk_i (clk_i), .rst_ni (rst_ni), .clr_i (!ctr_drbg_cmd_enable_i), diff --git a/src/csrng/rtl/csrng_ctr_drbg_gen.sv b/src/csrng/rtl/csrng_ctr_drbg_gen.sv index 2b2adfd3f..66aed6132 100644 --- a/src/csrng/rtl/csrng_ctr_drbg_gen.sv +++ b/src/csrng/rtl/csrng_ctr_drbg_gen.sv @@ -216,7 +216,7 @@ module csrng_ctr_drbg_gen import csrng_pkg::*; #( state_e state_d, state_q; // SEC_CM: UPDATE.FSM.SPARSE - `PRIM_FLOP_SPARSE_FSM(u_state_regs, state_d, state_q, state_e, ReqIdle) + `CALIPTRA_PRIM_FLOP_SPARSE_FSM(u_state_regs, state_d, state_q, state_e, ReqIdle) always_ff @(posedge clk_i or negedge rst_ni) if (!rst_ni) begin @@ -235,12 +235,12 @@ module csrng_ctr_drbg_gen import csrng_pkg::*; #( // input request fifo for staging gen request //-------------------------------------------- - prim_fifo_sync #( + caliptra_prim_fifo_sync #( .Width(GenreqFifoWidth), .Pass(0), .Depth(GenreqFifoDepth), .OutputZeroIfEmpty(1'b0) - ) u_prim_fifo_sync_genreq ( + ) u_caliptra_prim_fifo_sync_genreq ( .clk_i (clk_i), .rst_ni (rst_ni), .clr_i (!ctr_drbg_gen_enable_i), @@ -289,9 +289,9 @@ module csrng_ctr_drbg_gen import csrng_pkg::*; #( end // SEC_CM: DRBG_GEN.CTR.REDUN - prim_count #( + caliptra_prim_count #( .Width(CtrLen) - ) u_prim_count_ctr_drbg ( + ) u_caliptra_prim_count_ctr_drbg ( .clk_i, .rst_ni, .clr_i(!ctr_drbg_gen_enable_i), @@ -386,12 +386,12 @@ module csrng_ctr_drbg_gen import csrng_pkg::*; #( // fifo to stage key, v, rc, and adata, waiting for update block to ack //-------------------------------------------- - prim_fifo_sync #( + caliptra_prim_fifo_sync #( .Width(AdstageFifoWidth), .Pass(0), .Depth(AdstageFifoDepth), .OutputZeroIfEmpty(1'b0) - ) u_prim_fifo_sync_adstage ( + ) u_caliptra_prim_fifo_sync_adstage ( .clk_i (clk_i), .rst_ni (rst_ni), .clr_i (!ctr_drbg_gen_enable_i), @@ -446,12 +446,12 @@ module csrng_ctr_drbg_gen import csrng_pkg::*; #( // block_encrypt response fifo from block encrypt //-------------------------------------------- - prim_fifo_sync #( + caliptra_prim_fifo_sync #( .Width(BlkEncAckFifoWidth), .Pass(0), .Depth(BlkEncAckFifoDepth), .OutputZeroIfEmpty(1'b0) - ) u_prim_fifo_sync_bencack ( + ) u_caliptra_prim_fifo_sync_bencack ( .clk_i (clk_i), .rst_ni (rst_ni), .clr_i (!ctr_drbg_gen_enable_i), @@ -501,12 +501,12 @@ module csrng_ctr_drbg_gen import csrng_pkg::*; #( // fifo to stage rc, waiting for update block to ack //-------------------------------------------- - prim_fifo_sync #( + caliptra_prim_fifo_sync #( .Width(RCStageFifoWidth), .Pass(0), .Depth(RCStageFifoDepth), .OutputZeroIfEmpty(1'b0) - ) u_prim_fifo_sync_rcstage ( + ) u_caliptra_prim_fifo_sync_rcstage ( .clk_i (clk_i), .rst_ni (rst_ni), .clr_i (!ctr_drbg_gen_enable_i), @@ -544,12 +544,12 @@ module csrng_ctr_drbg_gen import csrng_pkg::*; #( // final cmd block processing //-------------------------------------------- - prim_fifo_sync #( + caliptra_prim_fifo_sync #( .Width(GenbitsFifoWidth), .Pass(0), .Depth(GenbitsFifoDepth), .OutputZeroIfEmpty(1'b0) - ) u_prim_fifo_sync_genbits ( + ) u_caliptra_prim_fifo_sync_genbits ( .clk_i (clk_i), .rst_ni (rst_ni), .clr_i (!ctr_drbg_gen_enable_i), diff --git a/src/csrng/rtl/csrng_ctr_drbg_upd.sv b/src/csrng/rtl/csrng_ctr_drbg_upd.sv index 232ad994c..8e5320b4a 100644 --- a/src/csrng/rtl/csrng_ctr_drbg_upd.sv +++ b/src/csrng/rtl/csrng_ctr_drbg_upd.sv @@ -184,7 +184,7 @@ module csrng_ctr_drbg_upd #( blk_enc_state_e blk_enc_state_d, blk_enc_state_q; // SEC_CM: BLK_ENC.FSM.SPARSE - `PRIM_FLOP_SPARSE_FSM(u_blk_enc_state_regs, blk_enc_state_d, + `CALIPTRA_PRIM_FLOP_SPARSE_FSM(u_blk_enc_state_regs, blk_enc_state_d, blk_enc_state_q, blk_enc_state_e, ReqIdle) // Encoding generated with: @@ -218,7 +218,7 @@ module csrng_ctr_drbg_upd #( outblk_state_e outblk_state_d, outblk_state_q; // SEC_CM: OUTBLK.FSM.SPARSE - `PRIM_FLOP_SPARSE_FSM(u_outblk_state_regs, outblk_state_d, + `CALIPTRA_PRIM_FLOP_SPARSE_FSM(u_outblk_state_regs, outblk_state_d, outblk_state_q, outblk_state_e, AckIdle) always_ff @(posedge clk_i or negedge rst_ni) @@ -241,12 +241,12 @@ module csrng_ctr_drbg_upd #( // input request fifo for staging update requests //-------------------------------------------- - prim_fifo_sync #( + caliptra_prim_fifo_sync #( .Width(UpdReqFifoWidth), .Pass(0), .Depth(UpdReqFifoDepth), .OutputZeroIfEmpty(1'b0) - ) u_prim_fifo_sync_updreq ( + ) u_caliptra_prim_fifo_sync_updreq ( .clk_i (clk_i), .rst_ni (rst_ni), .clr_i (!ctr_drbg_upd_enable_i), @@ -287,9 +287,9 @@ module csrng_ctr_drbg_upd #( end // SEC_CM: DRBG_UPD.CTR.REDUN - prim_count #( + caliptra_prim_count #( .Width(CtrLen) - ) u_prim_count_ctr_drbg ( + ) u_caliptra_prim_count_ctr_drbg ( .clk_i, .rst_ni, .clr_i(!ctr_drbg_upd_enable_i), @@ -377,12 +377,12 @@ module csrng_ctr_drbg_upd #( // block_encrypt request fifo for staging aes requests //-------------------------------------------- - prim_fifo_sync #( + caliptra_prim_fifo_sync #( .Width(BlkEncReqFifoWidth), .Pass(0), .Depth(BlkEncReqFifoDepth), .OutputZeroIfEmpty(1'b0) - ) u_prim_fifo_sync_bencreq ( + ) u_caliptra_prim_fifo_sync_bencreq ( .clk_i (clk_i), .rst_ni (rst_ni), .clr_i (!ctr_drbg_upd_enable_i), @@ -420,12 +420,12 @@ module csrng_ctr_drbg_upd #( // block_encrypt response fifo from block encrypt //-------------------------------------------- - prim_fifo_sync #( + caliptra_prim_fifo_sync #( .Width(BlkEncAckFifoWidth), .Pass(0), .Depth(BlkEncAckFifoDepth), .OutputZeroIfEmpty(1'b0) - ) u_prim_fifo_sync_bencack ( + ) u_caliptra_prim_fifo_sync_bencack ( .clk_i (clk_i), .rst_ni (rst_ni), .clr_i (!ctr_drbg_upd_enable_i), @@ -455,12 +455,12 @@ module csrng_ctr_drbg_upd #( // fifo to stage provided_data, waiting for blk_encrypt to ack //-------------------------------------------- - prim_fifo_sync #( + caliptra_prim_fifo_sync #( .Width(PDataFifoWidth), .Pass(0), .Depth(PDataFifoDepth), .OutputZeroIfEmpty(1'b0) - ) u_prim_fifo_sync_pdata ( + ) u_caliptra_prim_fifo_sync_pdata ( .clk_i (clk_i), .rst_ni (rst_ni), .clr_i (!ctr_drbg_upd_enable_i), @@ -579,12 +579,12 @@ module csrng_ctr_drbg_upd #( // XOR the additional data with the new key and value from block encryption assign updated_key_and_v = concat_outblk_q ^ sfifo_pdata_v; - prim_fifo_sync #( + caliptra_prim_fifo_sync #( .Width(FinalFifoWidth), .Pass(0), .Depth(FinalFifoDepth), .OutputZeroIfEmpty(1'b0) - ) u_prim_fifo_sync_final ( + ) u_caliptra_prim_fifo_sync_final ( .clk_i (clk_i), .rst_ni (rst_ni), .clr_i (!ctr_drbg_upd_enable_i), diff --git a/src/csrng/rtl/csrng_main_sm.sv b/src/csrng/rtl/csrng_main_sm.sv index d494ad225..625fb7b7c 100644 --- a/src/csrng/rtl/csrng_main_sm.sv +++ b/src/csrng/rtl/csrng_main_sm.sv @@ -33,7 +33,7 @@ module csrng_main_sm import csrng_pkg::*; #() ( ); main_sm_state_e state_d, state_q; - `PRIM_FLOP_SPARSE_FSM(u_state_regs, state_d, state_q, main_sm_state_e, MainSmIdle) + `CALIPTRA_PRIM_FLOP_SPARSE_FSM(u_state_regs, state_d, state_q, main_sm_state_e, MainSmIdle) assign main_sm_state_o = {state_q}; diff --git a/src/csrng/rtl/csrng_reg_top.sv b/src/csrng/rtl/csrng_reg_top.sv index 021ad65f0..70a8d0056 100644 --- a/src/csrng/rtl/csrng_reg_top.sv +++ b/src/csrng/rtl/csrng_reg_top.sv @@ -4,7 +4,7 @@ // // Register Top module auto-generated by `reggen` -`include "prim_assert.sv" +`include "caliptra_prim_assert.sv" module csrng_reg_top #( parameter AHBDataWidth = 64, @@ -67,9 +67,9 @@ module csrng_reg_top #( // also check for spurious write enables logic reg_we_err; logic [16:0] reg_we_check; - prim_reg_we_check #( + caliptra_prim_reg_we_check #( .OneHotWidth(17) - ) u_prim_reg_we_check ( + ) u_caliptra_prim_reg_we_check ( .clk_i(clk_i), .rst_ni(rst_ni), .oh_i (reg_we_check), @@ -249,9 +249,9 @@ module csrng_reg_top #( // Register instances // R[intr_state]: V(False) // F[cs_cmd_req_done]: 0:0 - prim_subreg #( + caliptra_prim_subreg #( .DW (1), - .SwAccess(prim_subreg_pkg::SwAccessW1C), + .SwAccess(caliptra_prim_subreg_pkg::SwAccessW1C), .RESVAL (1'h0) ) u_intr_state_cs_cmd_req_done ( .clk_i (clk_i), @@ -275,9 +275,9 @@ module csrng_reg_top #( ); // F[cs_entropy_req]: 1:1 - prim_subreg #( + caliptra_prim_subreg #( .DW (1), - .SwAccess(prim_subreg_pkg::SwAccessW1C), + .SwAccess(caliptra_prim_subreg_pkg::SwAccessW1C), .RESVAL (1'h0) ) u_intr_state_cs_entropy_req ( .clk_i (clk_i), @@ -301,9 +301,9 @@ module csrng_reg_top #( ); // F[cs_hw_inst_exc]: 2:2 - prim_subreg #( + caliptra_prim_subreg #( .DW (1), - .SwAccess(prim_subreg_pkg::SwAccessW1C), + .SwAccess(caliptra_prim_subreg_pkg::SwAccessW1C), .RESVAL (1'h0) ) u_intr_state_cs_hw_inst_exc ( .clk_i (clk_i), @@ -327,9 +327,9 @@ module csrng_reg_top #( ); // F[cs_fatal_err]: 3:3 - prim_subreg #( + caliptra_prim_subreg #( .DW (1), - .SwAccess(prim_subreg_pkg::SwAccessW1C), + .SwAccess(caliptra_prim_subreg_pkg::SwAccessW1C), .RESVAL (1'h0) ) u_intr_state_cs_fatal_err ( .clk_i (clk_i), @@ -355,9 +355,9 @@ module csrng_reg_top #( // R[intr_enable]: V(False) // F[cs_cmd_req_done]: 0:0 - prim_subreg #( + caliptra_prim_subreg #( .DW (1), - .SwAccess(prim_subreg_pkg::SwAccessRW), + .SwAccess(caliptra_prim_subreg_pkg::SwAccessRW), .RESVAL (1'h0) ) u_intr_enable_cs_cmd_req_done ( .clk_i (clk_i), @@ -381,9 +381,9 @@ module csrng_reg_top #( ); // F[cs_entropy_req]: 1:1 - prim_subreg #( + caliptra_prim_subreg #( .DW (1), - .SwAccess(prim_subreg_pkg::SwAccessRW), + .SwAccess(caliptra_prim_subreg_pkg::SwAccessRW), .RESVAL (1'h0) ) u_intr_enable_cs_entropy_req ( .clk_i (clk_i), @@ -407,9 +407,9 @@ module csrng_reg_top #( ); // F[cs_hw_inst_exc]: 2:2 - prim_subreg #( + caliptra_prim_subreg #( .DW (1), - .SwAccess(prim_subreg_pkg::SwAccessRW), + .SwAccess(caliptra_prim_subreg_pkg::SwAccessRW), .RESVAL (1'h0) ) u_intr_enable_cs_hw_inst_exc ( .clk_i (clk_i), @@ -433,9 +433,9 @@ module csrng_reg_top #( ); // F[cs_fatal_err]: 3:3 - prim_subreg #( + caliptra_prim_subreg #( .DW (1), - .SwAccess(prim_subreg_pkg::SwAccessRW), + .SwAccess(caliptra_prim_subreg_pkg::SwAccessRW), .RESVAL (1'h0) ) u_intr_enable_cs_fatal_err ( .clk_i (clk_i), @@ -464,7 +464,7 @@ module csrng_reg_top #( logic [3:0] intr_test_flds_we; assign intr_test_qe = &intr_test_flds_we; // F[cs_cmd_req_done]: 0:0 - prim_subreg_ext #( + caliptra_prim_subreg_ext #( .DW (1) ) u_intr_test_cs_cmd_req_done ( .re (1'b0), @@ -480,7 +480,7 @@ module csrng_reg_top #( assign reg2hw.intr_test.cs_cmd_req_done.qe = intr_test_qe; // F[cs_entropy_req]: 1:1 - prim_subreg_ext #( + caliptra_prim_subreg_ext #( .DW (1) ) u_intr_test_cs_entropy_req ( .re (1'b0), @@ -496,7 +496,7 @@ module csrng_reg_top #( assign reg2hw.intr_test.cs_entropy_req.qe = intr_test_qe; // F[cs_hw_inst_exc]: 2:2 - prim_subreg_ext #( + caliptra_prim_subreg_ext #( .DW (1) ) u_intr_test_cs_hw_inst_exc ( .re (1'b0), @@ -512,7 +512,7 @@ module csrng_reg_top #( assign reg2hw.intr_test.cs_hw_inst_exc.qe = intr_test_qe; // F[cs_fatal_err]: 3:3 - prim_subreg_ext #( + caliptra_prim_subreg_ext #( .DW (1) ) u_intr_test_cs_fatal_err ( .re (1'b0), @@ -533,7 +533,7 @@ module csrng_reg_top #( logic [1:0] alert_test_flds_we; assign alert_test_qe = &alert_test_flds_we; // F[recov_alert]: 0:0 - prim_subreg_ext #( + caliptra_prim_subreg_ext #( .DW (1) ) u_alert_test_recov_alert ( .re (1'b0), @@ -549,7 +549,7 @@ module csrng_reg_top #( assign reg2hw.alert_test.recov_alert.qe = alert_test_qe; // F[fatal_alert]: 1:1 - prim_subreg_ext #( + caliptra_prim_subreg_ext #( .DW (1) ) u_alert_test_fatal_alert ( .re (1'b0), @@ -566,9 +566,9 @@ module csrng_reg_top #( // R[regwen]: V(False) - prim_subreg #( + caliptra_prim_subreg #( .DW (1), - .SwAccess(prim_subreg_pkg::SwAccessW0C), + .SwAccess(caliptra_prim_subreg_pkg::SwAccessW0C), .RESVAL (1'h1) ) u_regwen ( .clk_i (clk_i), @@ -597,9 +597,9 @@ module csrng_reg_top #( logic ctrl_gated_we; assign ctrl_gated_we = ctrl_we & regwen_qs; // F[enable]: 3:0 - prim_subreg #( + caliptra_prim_subreg #( .DW (4), - .SwAccess(prim_subreg_pkg::SwAccessRW), + .SwAccess(caliptra_prim_subreg_pkg::SwAccessRW), .RESVAL (4'h9) ) u_ctrl_enable ( .clk_i (clk_i), @@ -623,9 +623,9 @@ module csrng_reg_top #( ); // F[sw_app_enable]: 7:4 - prim_subreg #( + caliptra_prim_subreg #( .DW (4), - .SwAccess(prim_subreg_pkg::SwAccessRW), + .SwAccess(caliptra_prim_subreg_pkg::SwAccessRW), .RESVAL (4'h9) ) u_ctrl_sw_app_enable ( .clk_i (clk_i), @@ -649,9 +649,9 @@ module csrng_reg_top #( ); // F[read_int_state]: 11:8 - prim_subreg #( + caliptra_prim_subreg #( .DW (4), - .SwAccess(prim_subreg_pkg::SwAccessRW), + .SwAccess(caliptra_prim_subreg_pkg::SwAccessRW), .RESVAL (4'h9) ) u_ctrl_read_int_state ( .clk_i (clk_i), @@ -678,7 +678,7 @@ module csrng_reg_top #( // R[cmd_req]: V(False) logic cmd_req_qe; logic [0:0] cmd_req_flds_we; - prim_flop #( + caliptra_prim_flop #( .Width(1), .ResetValue(0) ) u_cmd_req0_qe ( @@ -687,9 +687,9 @@ module csrng_reg_top #( .d_i(&cmd_req_flds_we), .q_o(cmd_req_qe) ); - prim_subreg #( + caliptra_prim_subreg #( .DW (32), - .SwAccess(prim_subreg_pkg::SwAccessWO), + .SwAccess(caliptra_prim_subreg_pkg::SwAccessWO), .RESVAL (32'h0) ) u_cmd_req ( .clk_i (clk_i), @@ -716,9 +716,9 @@ module csrng_reg_top #( // R[sw_cmd_sts]: V(False) // F[cmd_rdy]: 0:0 - prim_subreg #( + caliptra_prim_subreg #( .DW (1), - .SwAccess(prim_subreg_pkg::SwAccessRO), + .SwAccess(caliptra_prim_subreg_pkg::SwAccessRO), .RESVAL (1'h1) ) u_sw_cmd_sts_cmd_rdy ( .clk_i (clk_i), @@ -742,9 +742,9 @@ module csrng_reg_top #( ); // F[cmd_sts]: 1:1 - prim_subreg #( + caliptra_prim_subreg #( .DW (1), - .SwAccess(prim_subreg_pkg::SwAccessRO), + .SwAccess(caliptra_prim_subreg_pkg::SwAccessRO), .RESVAL (1'h0) ) u_sw_cmd_sts_cmd_sts ( .clk_i (clk_i), @@ -770,7 +770,7 @@ module csrng_reg_top #( // R[genbits_vld]: V(True) // F[genbits_vld]: 0:0 - prim_subreg_ext #( + caliptra_prim_subreg_ext #( .DW (1) ) u_genbits_vld_genbits_vld ( .re (genbits_vld_re), @@ -785,7 +785,7 @@ module csrng_reg_top #( ); // F[genbits_fips]: 1:1 - prim_subreg_ext #( + caliptra_prim_subreg_ext #( .DW (1) ) u_genbits_vld_genbits_fips ( .re (genbits_vld_re), @@ -801,7 +801,7 @@ module csrng_reg_top #( // R[genbits]: V(True) - prim_subreg_ext #( + caliptra_prim_subreg_ext #( .DW (32) ) u_genbits ( .re (genbits_re), @@ -819,7 +819,7 @@ module csrng_reg_top #( // R[int_state_num]: V(False) logic int_state_num_qe; logic [0:0] int_state_num_flds_we; - prim_flop #( + caliptra_prim_flop #( .Width(1), .ResetValue(0) ) u_int_state_num0_qe ( @@ -828,9 +828,9 @@ module csrng_reg_top #( .d_i(&int_state_num_flds_we), .q_o(int_state_num_qe) ); - prim_subreg #( + caliptra_prim_subreg #( .DW (4), - .SwAccess(prim_subreg_pkg::SwAccessRW), + .SwAccess(caliptra_prim_subreg_pkg::SwAccessRW), .RESVAL (4'h0) ) u_int_state_num ( .clk_i (clk_i), @@ -856,7 +856,7 @@ module csrng_reg_top #( // R[int_state_val]: V(True) - prim_subreg_ext #( + caliptra_prim_subreg_ext #( .DW (32) ) u_int_state_val ( .re (int_state_val_re), @@ -872,9 +872,9 @@ module csrng_reg_top #( // R[hw_exc_sts]: V(False) - prim_subreg #( + caliptra_prim_subreg #( .DW (16), - .SwAccess(prim_subreg_pkg::SwAccessW0C), + .SwAccess(caliptra_prim_subreg_pkg::SwAccessW0C), .RESVAL (16'h0) ) u_hw_exc_sts ( .clk_i (clk_i), @@ -900,9 +900,9 @@ module csrng_reg_top #( // R[recov_alert_sts]: V(False) // F[enable_field_alert]: 0:0 - prim_subreg #( + caliptra_prim_subreg #( .DW (1), - .SwAccess(prim_subreg_pkg::SwAccessW0C), + .SwAccess(caliptra_prim_subreg_pkg::SwAccessW0C), .RESVAL (1'h0) ) u_recov_alert_sts_enable_field_alert ( .clk_i (clk_i), @@ -926,9 +926,9 @@ module csrng_reg_top #( ); // F[sw_app_enable_field_alert]: 1:1 - prim_subreg #( + caliptra_prim_subreg #( .DW (1), - .SwAccess(prim_subreg_pkg::SwAccessW0C), + .SwAccess(caliptra_prim_subreg_pkg::SwAccessW0C), .RESVAL (1'h0) ) u_recov_alert_sts_sw_app_enable_field_alert ( .clk_i (clk_i), @@ -952,9 +952,9 @@ module csrng_reg_top #( ); // F[read_int_state_field_alert]: 2:2 - prim_subreg #( + caliptra_prim_subreg #( .DW (1), - .SwAccess(prim_subreg_pkg::SwAccessW0C), + .SwAccess(caliptra_prim_subreg_pkg::SwAccessW0C), .RESVAL (1'h0) ) u_recov_alert_sts_read_int_state_field_alert ( .clk_i (clk_i), @@ -978,9 +978,9 @@ module csrng_reg_top #( ); // F[acmd_flag0_field_alert]: 3:3 - prim_subreg #( + caliptra_prim_subreg #( .DW (1), - .SwAccess(prim_subreg_pkg::SwAccessW0C), + .SwAccess(caliptra_prim_subreg_pkg::SwAccessW0C), .RESVAL (1'h0) ) u_recov_alert_sts_acmd_flag0_field_alert ( .clk_i (clk_i), @@ -1004,9 +1004,9 @@ module csrng_reg_top #( ); // F[cs_bus_cmp_alert]: 12:12 - prim_subreg #( + caliptra_prim_subreg #( .DW (1), - .SwAccess(prim_subreg_pkg::SwAccessW0C), + .SwAccess(caliptra_prim_subreg_pkg::SwAccessW0C), .RESVAL (1'h0) ) u_recov_alert_sts_cs_bus_cmp_alert ( .clk_i (clk_i), @@ -1030,9 +1030,9 @@ module csrng_reg_top #( ); // F[cs_main_sm_alert]: 13:13 - prim_subreg #( + caliptra_prim_subreg #( .DW (1), - .SwAccess(prim_subreg_pkg::SwAccessW0C), + .SwAccess(caliptra_prim_subreg_pkg::SwAccessW0C), .RESVAL (1'h0) ) u_recov_alert_sts_cs_main_sm_alert ( .clk_i (clk_i), @@ -1058,9 +1058,9 @@ module csrng_reg_top #( // R[err_code]: V(False) // F[sfifo_cmd_err]: 0:0 - prim_subreg #( + caliptra_prim_subreg #( .DW (1), - .SwAccess(prim_subreg_pkg::SwAccessRO), + .SwAccess(caliptra_prim_subreg_pkg::SwAccessRO), .RESVAL (1'h0) ) u_err_code_sfifo_cmd_err ( .clk_i (clk_i), @@ -1084,9 +1084,9 @@ module csrng_reg_top #( ); // F[sfifo_genbits_err]: 1:1 - prim_subreg #( + caliptra_prim_subreg #( .DW (1), - .SwAccess(prim_subreg_pkg::SwAccessRO), + .SwAccess(caliptra_prim_subreg_pkg::SwAccessRO), .RESVAL (1'h0) ) u_err_code_sfifo_genbits_err ( .clk_i (clk_i), @@ -1110,9 +1110,9 @@ module csrng_reg_top #( ); // F[sfifo_cmdreq_err]: 2:2 - prim_subreg #( + caliptra_prim_subreg #( .DW (1), - .SwAccess(prim_subreg_pkg::SwAccessRO), + .SwAccess(caliptra_prim_subreg_pkg::SwAccessRO), .RESVAL (1'h0) ) u_err_code_sfifo_cmdreq_err ( .clk_i (clk_i), @@ -1136,9 +1136,9 @@ module csrng_reg_top #( ); // F[sfifo_rcstage_err]: 3:3 - prim_subreg #( + caliptra_prim_subreg #( .DW (1), - .SwAccess(prim_subreg_pkg::SwAccessRO), + .SwAccess(caliptra_prim_subreg_pkg::SwAccessRO), .RESVAL (1'h0) ) u_err_code_sfifo_rcstage_err ( .clk_i (clk_i), @@ -1162,9 +1162,9 @@ module csrng_reg_top #( ); // F[sfifo_keyvrc_err]: 4:4 - prim_subreg #( + caliptra_prim_subreg #( .DW (1), - .SwAccess(prim_subreg_pkg::SwAccessRO), + .SwAccess(caliptra_prim_subreg_pkg::SwAccessRO), .RESVAL (1'h0) ) u_err_code_sfifo_keyvrc_err ( .clk_i (clk_i), @@ -1188,9 +1188,9 @@ module csrng_reg_top #( ); // F[sfifo_updreq_err]: 5:5 - prim_subreg #( + caliptra_prim_subreg #( .DW (1), - .SwAccess(prim_subreg_pkg::SwAccessRO), + .SwAccess(caliptra_prim_subreg_pkg::SwAccessRO), .RESVAL (1'h0) ) u_err_code_sfifo_updreq_err ( .clk_i (clk_i), @@ -1214,9 +1214,9 @@ module csrng_reg_top #( ); // F[sfifo_bencreq_err]: 6:6 - prim_subreg #( + caliptra_prim_subreg #( .DW (1), - .SwAccess(prim_subreg_pkg::SwAccessRO), + .SwAccess(caliptra_prim_subreg_pkg::SwAccessRO), .RESVAL (1'h0) ) u_err_code_sfifo_bencreq_err ( .clk_i (clk_i), @@ -1240,9 +1240,9 @@ module csrng_reg_top #( ); // F[sfifo_bencack_err]: 7:7 - prim_subreg #( + caliptra_prim_subreg #( .DW (1), - .SwAccess(prim_subreg_pkg::SwAccessRO), + .SwAccess(caliptra_prim_subreg_pkg::SwAccessRO), .RESVAL (1'h0) ) u_err_code_sfifo_bencack_err ( .clk_i (clk_i), @@ -1266,9 +1266,9 @@ module csrng_reg_top #( ); // F[sfifo_pdata_err]: 8:8 - prim_subreg #( + caliptra_prim_subreg #( .DW (1), - .SwAccess(prim_subreg_pkg::SwAccessRO), + .SwAccess(caliptra_prim_subreg_pkg::SwAccessRO), .RESVAL (1'h0) ) u_err_code_sfifo_pdata_err ( .clk_i (clk_i), @@ -1292,9 +1292,9 @@ module csrng_reg_top #( ); // F[sfifo_final_err]: 9:9 - prim_subreg #( + caliptra_prim_subreg #( .DW (1), - .SwAccess(prim_subreg_pkg::SwAccessRO), + .SwAccess(caliptra_prim_subreg_pkg::SwAccessRO), .RESVAL (1'h0) ) u_err_code_sfifo_final_err ( .clk_i (clk_i), @@ -1318,9 +1318,9 @@ module csrng_reg_top #( ); // F[sfifo_gbencack_err]: 10:10 - prim_subreg #( + caliptra_prim_subreg #( .DW (1), - .SwAccess(prim_subreg_pkg::SwAccessRO), + .SwAccess(caliptra_prim_subreg_pkg::SwAccessRO), .RESVAL (1'h0) ) u_err_code_sfifo_gbencack_err ( .clk_i (clk_i), @@ -1344,9 +1344,9 @@ module csrng_reg_top #( ); // F[sfifo_grcstage_err]: 11:11 - prim_subreg #( + caliptra_prim_subreg #( .DW (1), - .SwAccess(prim_subreg_pkg::SwAccessRO), + .SwAccess(caliptra_prim_subreg_pkg::SwAccessRO), .RESVAL (1'h0) ) u_err_code_sfifo_grcstage_err ( .clk_i (clk_i), @@ -1370,9 +1370,9 @@ module csrng_reg_top #( ); // F[sfifo_ggenreq_err]: 12:12 - prim_subreg #( + caliptra_prim_subreg #( .DW (1), - .SwAccess(prim_subreg_pkg::SwAccessRO), + .SwAccess(caliptra_prim_subreg_pkg::SwAccessRO), .RESVAL (1'h0) ) u_err_code_sfifo_ggenreq_err ( .clk_i (clk_i), @@ -1396,9 +1396,9 @@ module csrng_reg_top #( ); // F[sfifo_gadstage_err]: 13:13 - prim_subreg #( + caliptra_prim_subreg #( .DW (1), - .SwAccess(prim_subreg_pkg::SwAccessRO), + .SwAccess(caliptra_prim_subreg_pkg::SwAccessRO), .RESVAL (1'h0) ) u_err_code_sfifo_gadstage_err ( .clk_i (clk_i), @@ -1422,9 +1422,9 @@ module csrng_reg_top #( ); // F[sfifo_ggenbits_err]: 14:14 - prim_subreg #( + caliptra_prim_subreg #( .DW (1), - .SwAccess(prim_subreg_pkg::SwAccessRO), + .SwAccess(caliptra_prim_subreg_pkg::SwAccessRO), .RESVAL (1'h0) ) u_err_code_sfifo_ggenbits_err ( .clk_i (clk_i), @@ -1448,9 +1448,9 @@ module csrng_reg_top #( ); // F[sfifo_blkenc_err]: 15:15 - prim_subreg #( + caliptra_prim_subreg #( .DW (1), - .SwAccess(prim_subreg_pkg::SwAccessRO), + .SwAccess(caliptra_prim_subreg_pkg::SwAccessRO), .RESVAL (1'h0) ) u_err_code_sfifo_blkenc_err ( .clk_i (clk_i), @@ -1474,9 +1474,9 @@ module csrng_reg_top #( ); // F[cmd_stage_sm_err]: 20:20 - prim_subreg #( + caliptra_prim_subreg #( .DW (1), - .SwAccess(prim_subreg_pkg::SwAccessRO), + .SwAccess(caliptra_prim_subreg_pkg::SwAccessRO), .RESVAL (1'h0) ) u_err_code_cmd_stage_sm_err ( .clk_i (clk_i), @@ -1500,9 +1500,9 @@ module csrng_reg_top #( ); // F[main_sm_err]: 21:21 - prim_subreg #( + caliptra_prim_subreg #( .DW (1), - .SwAccess(prim_subreg_pkg::SwAccessRO), + .SwAccess(caliptra_prim_subreg_pkg::SwAccessRO), .RESVAL (1'h0) ) u_err_code_main_sm_err ( .clk_i (clk_i), @@ -1526,9 +1526,9 @@ module csrng_reg_top #( ); // F[drbg_gen_sm_err]: 22:22 - prim_subreg #( + caliptra_prim_subreg #( .DW (1), - .SwAccess(prim_subreg_pkg::SwAccessRO), + .SwAccess(caliptra_prim_subreg_pkg::SwAccessRO), .RESVAL (1'h0) ) u_err_code_drbg_gen_sm_err ( .clk_i (clk_i), @@ -1552,9 +1552,9 @@ module csrng_reg_top #( ); // F[drbg_updbe_sm_err]: 23:23 - prim_subreg #( + caliptra_prim_subreg #( .DW (1), - .SwAccess(prim_subreg_pkg::SwAccessRO), + .SwAccess(caliptra_prim_subreg_pkg::SwAccessRO), .RESVAL (1'h0) ) u_err_code_drbg_updbe_sm_err ( .clk_i (clk_i), @@ -1578,9 +1578,9 @@ module csrng_reg_top #( ); // F[drbg_updob_sm_err]: 24:24 - prim_subreg #( + caliptra_prim_subreg #( .DW (1), - .SwAccess(prim_subreg_pkg::SwAccessRO), + .SwAccess(caliptra_prim_subreg_pkg::SwAccessRO), .RESVAL (1'h0) ) u_err_code_drbg_updob_sm_err ( .clk_i (clk_i), @@ -1604,9 +1604,9 @@ module csrng_reg_top #( ); // F[aes_cipher_sm_err]: 25:25 - prim_subreg #( + caliptra_prim_subreg #( .DW (1), - .SwAccess(prim_subreg_pkg::SwAccessRO), + .SwAccess(caliptra_prim_subreg_pkg::SwAccessRO), .RESVAL (1'h0) ) u_err_code_aes_cipher_sm_err ( .clk_i (clk_i), @@ -1630,9 +1630,9 @@ module csrng_reg_top #( ); // F[cmd_gen_cnt_err]: 26:26 - prim_subreg #( + caliptra_prim_subreg #( .DW (1), - .SwAccess(prim_subreg_pkg::SwAccessRO), + .SwAccess(caliptra_prim_subreg_pkg::SwAccessRO), .RESVAL (1'h0) ) u_err_code_cmd_gen_cnt_err ( .clk_i (clk_i), @@ -1656,9 +1656,9 @@ module csrng_reg_top #( ); // F[fifo_write_err]: 28:28 - prim_subreg #( + caliptra_prim_subreg #( .DW (1), - .SwAccess(prim_subreg_pkg::SwAccessRO), + .SwAccess(caliptra_prim_subreg_pkg::SwAccessRO), .RESVAL (1'h0) ) u_err_code_fifo_write_err ( .clk_i (clk_i), @@ -1682,9 +1682,9 @@ module csrng_reg_top #( ); // F[fifo_read_err]: 29:29 - prim_subreg #( + caliptra_prim_subreg #( .DW (1), - .SwAccess(prim_subreg_pkg::SwAccessRO), + .SwAccess(caliptra_prim_subreg_pkg::SwAccessRO), .RESVAL (1'h0) ) u_err_code_fifo_read_err ( .clk_i (clk_i), @@ -1708,9 +1708,9 @@ module csrng_reg_top #( ); // F[fifo_state_err]: 30:30 - prim_subreg #( + caliptra_prim_subreg #( .DW (1), - .SwAccess(prim_subreg_pkg::SwAccessRO), + .SwAccess(caliptra_prim_subreg_pkg::SwAccessRO), .RESVAL (1'h0) ) u_err_code_fifo_state_err ( .clk_i (clk_i), @@ -1737,7 +1737,7 @@ module csrng_reg_top #( // R[err_code_test]: V(False) logic err_code_test_qe; logic [0:0] err_code_test_flds_we; - prim_flop #( + caliptra_prim_flop #( .Width(1), .ResetValue(0) ) u_err_code_test0_qe ( @@ -1749,9 +1749,9 @@ module csrng_reg_top #( // Create REGWEN-gated WE signal logic err_code_test_gated_we; assign err_code_test_gated_we = err_code_test_we & regwen_qs; - prim_subreg #( + caliptra_prim_subreg #( .DW (5), - .SwAccess(prim_subreg_pkg::SwAccessRW), + .SwAccess(caliptra_prim_subreg_pkg::SwAccessRW), .RESVAL (5'h0) ) u_err_code_test ( .clk_i (clk_i), @@ -1777,9 +1777,9 @@ module csrng_reg_top #( // R[main_sm_state]: V(False) - prim_subreg #( + caliptra_prim_subreg #( .DW (8), - .SwAccess(prim_subreg_pkg::SwAccessRO), + .SwAccess(caliptra_prim_subreg_pkg::SwAccessRO), .RESVAL (8'h4e) ) u_main_sm_state ( .clk_i (clk_i), @@ -2059,10 +2059,6 @@ module csrng_reg_top #( addr_hit[16]: begin reg_rdata_next[7:0] = main_sm_state_qs; end - - default: begin - reg_rdata_next = '1; - end endcase end diff --git a/src/csrng/rtl/csrng_state_db.sv b/src/csrng/rtl/csrng_state_db.sv index 0716b3f2e..034304bba 100644 --- a/src/csrng/rtl/csrng_state_db.sv +++ b/src/csrng/rtl/csrng_state_db.sv @@ -7,7 +7,7 @@ // This is the container for accessing the current // working state for a given drbg instance. -`include "prim_assert.sv" +`include "caliptra_prim_assert.sv" module csrng_state_db import csrng_pkg::*; #( parameter int NApps = 4, diff --git a/src/csrng/tb/Makefile b/src/csrng/tb/Makefile index 1ab01e91a..4c29d9279 100644 --- a/src/csrng/tb/Makefile +++ b/src/csrng/tb/Makefile @@ -44,10 +44,10 @@ verilator-build: $(TBFILES) $(VERILATOR_LINT_FILES) test_$(IPNAME)_tb.cpp $(VERILATOR) --cc \ --timing \ --timescale 1ns/1ps \ - -f $(CONFIGDIR)/$(IPNAME).vf --top-module $(IPNAME)_tb \ + -f $(CONFIGDIR)/$(IPNAME)_tb.vf --top-module $(IPNAME)_tb \ -f $(VERILATOR_LINT_FILES) \ -exe test_$(IPNAME)_tb.cpp \ - --trace + --trace --trace-structs cp test_$(IPNAME)_tb.cpp obj_dir/ $(MAKE) -j -e -C obj_dir/ -f V$(IPNAME)_tb.mk $(VERILATOR_MAKE_FLAGS) VM_PARALLEL_BUILDS=1 touch verilator-build diff --git a/src/csrng/tb/csrng_tb.sv b/src/csrng/tb/csrng_tb.sv index 9666eece9..726aab0f4 100644 --- a/src/csrng/tb/csrng_tb.sv +++ b/src/csrng/tb/csrng_tb.sv @@ -27,7 +27,7 @@ module csrng_tb import entropy_src_pkg::*; import entropy_src_reg_pkg::*; import lc_ctrl_pkg::*; - import prim_mubi_pkg::mubi8_t; + import caliptra_prim_mubi_pkg::mubi8_t; ( `ifdef VERILATOR input bit clk_tb @@ -126,7 +126,7 @@ module csrng_tb .hreadyout_o (hreadyout_o_tb), .hrdata_o (hrdata_o_tb), // OTP Interface - .otp_en_csrng_sw_app_read_i(prim_mubi_pkg::MuBi8True), + .otp_en_csrng_sw_app_read_i(caliptra_prim_mubi_pkg::MuBi8True), // Lifecycle broadcast inputs .lc_hw_debug_en_i(lc_ctrl_pkg::On), // Entropy Interface @@ -167,7 +167,7 @@ module csrng_tb // the dut as needed. //---------------------------------------------------------------- always @(posedge clk_tb) begin : sys_monitor - cycle_ctr = cycle_ctr + 1; + cycle_ctr = (!reset_n_tb) ? 32'h0 : cycle_ctr + 1; end @@ -199,7 +199,6 @@ module csrng_tb //---------------------------------------------------------------- task init_sim; begin - cycle_ctr = '0; error_ctr = '0; tc_ctr = '0; `ifndef VERILATOR @@ -254,6 +253,7 @@ module csrng_tb $display("[%t] write_single_word(addr=0x%x, word=0x%x)", $time, address, word); hsel_i_tb = 1; haddr_i_tb = address; + hwdata_i_tb = word; hwrite_i_tb = 1; hready_i_tb = 1; htrans_i_tb = AHB_HTRANS_NONSEQ; @@ -261,7 +261,6 @@ module csrng_tb @(posedge clk_tb); haddr_i_tb = 'Z; - hwdata_i_tb = word; hwrite_i_tb = 0; htrans_i_tb = AHB_HTRANS_IDLE; wait(hreadyout_o_tb == 1'b1); diff --git a/src/datavault/config/datavault.vf b/src/datavault/config/datavault.vf index 26a98c56a..829d888e8 100644 --- a/src/datavault/config/datavault.vf +++ b/src/datavault/config/datavault.vf @@ -12,6 +12,7 @@ ${CALIPTRA_ROOT}/src/libs/rtl/apb_slv_sif.sv ${CALIPTRA_ROOT}/src/libs/rtl/ahb_slv_sif.sv ${CALIPTRA_ROOT}/src/libs/rtl/caliptra_icg.sv ${CALIPTRA_ROOT}/src/libs/rtl/clk_gate.sv +${CALIPTRA_ROOT}/src/libs/rtl/caliptra_2ff_sync.sv ${CALIPTRA_ROOT}/src/datavault/rtl/dv_defines_pkg.sv ${CALIPTRA_ROOT}/src/libs/rtl/ahb_to_reg_adapter.sv ${CALIPTRA_ROOT}/src/datavault/rtl/dv_reg_pkg.sv diff --git a/src/datavault/rtl/dv.sv b/src/datavault/rtl/dv.sv index b725b9e11..a4f2e459f 100644 --- a/src/datavault/rtl/dv.sv +++ b/src/datavault/rtl/dv.sv @@ -104,17 +104,17 @@ always_comb begin: datavault end //Non-Sticky Data Vault Regs & Controls - for (int entry = 0; entry < NONSTICKY_DV_NUM_ENTRIES; entry++) begin - dv_reg_hwif_in.NonStickyDataVaultCtrl[entry].lock_entry.swwel = dv_reg_hwif_out.NonStickyDataVaultCtrl[entry].lock_entry.value; + for (int entry = 0; entry < DV_NUM_ENTRIES; entry++) begin + dv_reg_hwif_in.DataVaultCtrl[entry].lock_entry.swwel = dv_reg_hwif_out.DataVaultCtrl[entry].lock_entry.value; for (int dword = 0; dword < DV_NUM_DWORDS; dword++) begin - dv_reg_hwif_in.NONSTICKY_DATA_VAULT_ENTRY[entry][dword].data.swwel = dv_reg_hwif_out.NonStickyDataVaultCtrl[entry].lock_entry.value; + dv_reg_hwif_in.DATA_VAULT_ENTRY[entry][dword].data.swwel = dv_reg_hwif_out.DataVaultCtrl[entry].lock_entry.value; end end //Non-Sticky Generic Lockable Registers in the Data Vault - for (int entry = 0; entry < NONSTICKY_LOCK_SCRATCH_NUM_ENTRIES; entry++) begin - dv_reg_hwif_in.NonStickyLockableScratchRegCtrl[entry].lock_entry.swwel = dv_reg_hwif_out.NonStickyLockableScratchRegCtrl[entry].lock_entry.value; - dv_reg_hwif_in.NonStickyLockableScratchReg[entry].data.swwel = dv_reg_hwif_out.NonStickyLockableScratchRegCtrl[entry].lock_entry.value; + for (int entry = 0; entry < LOCK_SCRATCH_NUM_ENTRIES; entry++) begin + dv_reg_hwif_in.LockableScratchRegCtrl[entry].lock_entry.swwel = dv_reg_hwif_out.LockableScratchRegCtrl[entry].lock_entry.value; + dv_reg_hwif_in.LockableScratchReg[entry].data.swwel = dv_reg_hwif_out.LockableScratchRegCtrl[entry].lock_entry.value; end //Sticky Generic Lockable Registers in the Data Vault diff --git a/src/datavault/rtl/dv_defines_pkg.sv b/src/datavault/rtl/dv_defines_pkg.sv index 0883025e3..7ff199f1d 100644 --- a/src/datavault/rtl/dv_defines_pkg.sv +++ b/src/datavault/rtl/dv_defines_pkg.sv @@ -21,8 +21,8 @@ package dv_defines_pkg; parameter DV_DATA_W = 32; parameter STICKY_DV_NUM_ENTRIES = 10; - parameter NONSTICKY_DV_NUM_ENTRIES = 10; - parameter NONSTICKY_LOCK_SCRATCH_NUM_ENTRIES = 10; + parameter DV_NUM_ENTRIES = 10; + parameter LOCK_SCRATCH_NUM_ENTRIES = 10; parameter STICKY_LOCK_SCRATCH_NUM_ENTRIES = 8; parameter NONSTICKY_SCRATCH_NUM_ENTRIES = 8; parameter DV_NUM_DWORDS = 12; diff --git a/src/datavault/rtl/dv_reg.rdl b/src/datavault/rtl/dv_reg.rdl index 27d6e59db..6e4d57a51 100644 --- a/src/datavault/rtl/dv_reg.rdl +++ b/src/datavault/rtl/dv_reg.rdl @@ -19,51 +19,53 @@ addrmap dv_reg { signal {activelow; async;} hard_reset_b; // Sticky DataVault registers - field StickyDataVaultEntry {desc="DataVault Entry"; sw=rw; hw=na; swwel=true; resetsignal = hard_reset_b;}; + field StickyDataVaultEntry {desc="DataVault Entry (cleared on hard reset)"; sw=rw; hw=na; swwel=true; resetsignal = hard_reset_b;}; reg StickyDataVaultReg {StickyDataVaultEntry data[32]=0;}; //generic reg for DataVault - // NonSticky DataVault registers (reset on warm reset) - field NonStickyDataVaultEntry {desc="DataVault Entry"; sw=rw; hw=na; swwel=true; resetsignal = reset_b;}; - reg NonStickyDataVaultReg {NonStickyDataVaultEntry data[32]=0;}; //generic reg for DataVault + // Sticky DataVault registers (reset on hard reset) + field DataVaultEntry {desc="DataVault Entry (cleared on hard reset)"; sw=rw; hw=na; swwel=true; resetsignal = hard_reset_b;}; + reg DataVaultReg {DataVaultEntry data[32]=0;}; //generic reg for DataVault // ============== Data Vault Registers =========================== reg { - desc="Controls for the Sticky Data Vault Entries"; + desc="Controls for the Sticky Data Vault Entries (cleared on hard reset)"; field {desc="Lock writes to this entry. Writes will be suppressed when locked."; - sw=rw; swwel=true; hw=r; resetsignal=hard_reset_b;} lock_entry=0; //Shoud reflect NONSTICKY_DV_NUM_ENTRIES from kv_defines_pkg.sv + sw=rw; swwel=true; hw=r; resetsignal=hard_reset_b;} lock_entry=0; //Shoud reflect STICKY_DV_NUM_ENTRIES from dv_defines_pkg.sv } StickyDataVaultCtrl[10]; - StickyDataVaultReg STICKY_DATA_VAULT_ENTRY[10][12];//Shoud reflect STICKY_DV_NUM_ENTRIES and DV_NUM_DWORDS from kv_defines_pkg.sv + StickyDataVaultReg STICKY_DATA_VAULT_ENTRY[10][12];//Shoud reflect STICKY_DV_NUM_ENTRIES and DV_NUM_DWORDS from dv_defines_pkg.sv reg { - desc="Controls for the Non-Sticky Data Vault Entries"; + desc="Controls for the Data Vault Entries (cleared on warm reset)"; field {desc="Lock writes to this entry. Writes will be suppressed when locked."; - sw=rw; swwel=true; hw=r; resetsignal=core_only_rst_b;} lock_entry=0; //Shoud reflect STICKY_DV_NUM_ENTRIES and DV_NUM_DWORDS from kv_defines_pkg.sv - } NonStickyDataVaultCtrl[10];// CAREFUL with the address extensions + sw=rw; swwel=true; hw=r; resetsignal=core_only_rst_b;} lock_entry=0; //Shoud reflect DV_NUM_ENTRIES and DV_NUM_DWORDS from dv_defines_pkg.sv + } DataVaultCtrl[10];// CAREFUL with the address extensions - NonStickyDataVaultReg NONSTICKY_DATA_VAULT_ENTRY[10][12];//Shoud reflect NONSTICKY_DV_NUM_ENTRIES and DV_NUM_DWORDS from kv_defines_pkg.sv + DataVaultReg DATA_VAULT_ENTRY[10][12];//Shoud reflect DV_NUM_ENTRIES and DV_NUM_DWORDS from dv_defines_pkg.sv reg { - desc="Non-Sticky Scratch Register Controls"; + desc="Scratch Register Controls (cleared on warm reset)"; field {desc="Lock writes to the Scratch registers. Writes will be suppressed when locked."; sw=rw; swwel=true; hw=r; resetsignal=core_only_rst_b;} lock_entry=0; - } NonStickyLockableScratchRegCtrl[10]; //Shoud reflect NONSTICKY_SCRATCH_NUM_ENTRIES from kv_defines_pkg.sv & CAREFUL with the address extensions + } LockableScratchRegCtrl[10]; //Shoud reflect LOCK_SCRATCH_NUM_ENTRIES from dv_defines_pkg.sv & CAREFUL with the address extensions reg { - field {sw=rw; swwel=true; hw=na; resetsignal=reset_b;} data[32]=0; - } NonStickyLockableScratchReg[10]; //Shoud reflect NONSTICKY_LOCKQ_SCRATCH_NUM_ENTRIES from kv_defines_pkg.sv + desc="Scratch Register Entrie (cleared on hard reset)"; + field {sw=rw; swwel=true; hw=na; resetsignal=hard_reset_b;} data[32]=0; + } LockableScratchReg[10]; //Shoud reflect LOCK_SCRATCH_NUM_ENTRIES from dv_defines_pkg.sv reg { field {sw=rw; hw=na; resetsignal=reset_b;} data[32]=0; - } NonStickyGenericScratchReg[8]; //Shoud reflect NONSTICKY_SCRATCH_NUM_ENTRIES from kv_defines_pkg.sv & CAREFUL with the address extensions + } NonStickyGenericScratchReg[8]; //Shoud reflect NONSTICKY_SCRATCH_NUM_ENTRIES from dv_defines_pkg.sv & CAREFUL with the address extensions reg { - desc="Sticky Scratch Register Controls"; + desc="Sticky Scratch Register Controls (cleared on hard reset)"; field {desc="Lock writes to the Scratch registers. Writes will be suppressed when locked."; sw=rw; swwel=true; hw=r; resetsignal=hard_reset_b;} lock_entry=0; } StickyLockableScratchRegCtrl[8]; //should reflect STICKY_LOCKQ_SCRATCH_NUM_ENTRIES reg { + desc="Sticky Scratch Register Entries (cleared on hard reset)"; field {sw=rw; swwel=true; hw=na; resetsignal=hard_reset_b;} data[32]=0; } StickyLockableScratchReg[8]; //should reflect STICKY_LOCKQ_SCRATCH_NUM_ENTRIES diff --git a/src/datavault/rtl/dv_reg.sv b/src/datavault/rtl/dv_reg.sv index 5eec7ce22..ded8e5d15 100644 --- a/src/datavault/rtl/dv_reg.sv +++ b/src/datavault/rtl/dv_reg.sv @@ -66,10 +66,10 @@ module dv_reg ( typedef struct packed{ logic [10-1:0]StickyDataVaultCtrl; logic [10-1:0][12-1:0]STICKY_DATA_VAULT_ENTRY; - logic [10-1:0]NonStickyDataVaultCtrl; - logic [10-1:0][12-1:0]NONSTICKY_DATA_VAULT_ENTRY; - logic [10-1:0]NonStickyLockableScratchRegCtrl; - logic [10-1:0]NonStickyLockableScratchReg; + logic [10-1:0]DataVaultCtrl; + logic [10-1:0][12-1:0]DATA_VAULT_ENTRY; + logic [10-1:0]LockableScratchRegCtrl; + logic [10-1:0]LockableScratchReg; logic [8-1:0]NonStickyGenericScratchReg; logic [8-1:0]StickyLockableScratchRegCtrl; logic [8-1:0]StickyLockableScratchReg; @@ -90,18 +90,18 @@ module dv_reg ( end end for(int i0=0; i0<10; i0++) begin - decoded_reg_strb.NonStickyDataVaultCtrl[i0] = cpuif_req_masked & (cpuif_addr == 'h208 + i0*'h4); + decoded_reg_strb.DataVaultCtrl[i0] = cpuif_req_masked & (cpuif_addr == 'h208 + i0*'h4); end for(int i0=0; i0<10; i0++) begin for(int i1=0; i1<12; i1++) begin - decoded_reg_strb.NONSTICKY_DATA_VAULT_ENTRY[i0][i1] = cpuif_req_masked & (cpuif_addr == 'h230 + i0*'h30 + i1*'h4); + decoded_reg_strb.DATA_VAULT_ENTRY[i0][i1] = cpuif_req_masked & (cpuif_addr == 'h230 + i0*'h30 + i1*'h4); end end for(int i0=0; i0<10; i0++) begin - decoded_reg_strb.NonStickyLockableScratchRegCtrl[i0] = cpuif_req_masked & (cpuif_addr == 'h410 + i0*'h4); + decoded_reg_strb.LockableScratchRegCtrl[i0] = cpuif_req_masked & (cpuif_addr == 'h410 + i0*'h4); end for(int i0=0; i0<10; i0++) begin - decoded_reg_strb.NonStickyLockableScratchReg[i0] = cpuif_req_masked & (cpuif_addr == 'h438 + i0*'h4); + decoded_reg_strb.LockableScratchReg[i0] = cpuif_req_masked & (cpuif_addr == 'h438 + i0*'h4); end for(int i0=0; i0<8; i0++) begin decoded_reg_strb.NonStickyGenericScratchReg[i0] = cpuif_req_masked & (cpuif_addr == 'h460 + i0*'h4); @@ -145,25 +145,25 @@ module dv_reg ( logic next; logic load_next; } lock_entry; - } [10-1:0]NonStickyDataVaultCtrl; + } [10-1:0]DataVaultCtrl; struct packed{ struct packed{ logic [31:0] next; logic load_next; } data; - } [10-1:0][12-1:0]NONSTICKY_DATA_VAULT_ENTRY; + } [10-1:0][12-1:0]DATA_VAULT_ENTRY; struct packed{ struct packed{ logic next; logic load_next; } lock_entry; - } [10-1:0]NonStickyLockableScratchRegCtrl; + } [10-1:0]LockableScratchRegCtrl; struct packed{ struct packed{ logic [31:0] next; logic load_next; } data; - } [10-1:0]NonStickyLockableScratchReg; + } [10-1:0]LockableScratchReg; struct packed{ struct packed{ logic [31:0] next; @@ -200,22 +200,22 @@ module dv_reg ( struct packed{ logic value; } lock_entry; - } [10-1:0]NonStickyDataVaultCtrl; + } [10-1:0]DataVaultCtrl; struct packed{ struct packed{ logic [31:0] value; } data; - } [10-1:0][12-1:0]NONSTICKY_DATA_VAULT_ENTRY; + } [10-1:0][12-1:0]DATA_VAULT_ENTRY; struct packed{ struct packed{ logic value; } lock_entry; - } [10-1:0]NonStickyLockableScratchRegCtrl; + } [10-1:0]LockableScratchRegCtrl; struct packed{ struct packed{ logic [31:0] value; } data; - } [10-1:0]NonStickyLockableScratchReg; + } [10-1:0]LockableScratchReg; struct packed{ struct packed{ logic [31:0] value; @@ -278,86 +278,86 @@ module dv_reg ( end end for(genvar i0=0; i0<10; i0++) begin - // Field: dv_reg.NonStickyDataVaultCtrl[].lock_entry + // Field: dv_reg.DataVaultCtrl[].lock_entry always_comb begin - automatic logic [0:0] next_c = field_storage.NonStickyDataVaultCtrl[i0].lock_entry.value; + automatic logic [0:0] next_c = field_storage.DataVaultCtrl[i0].lock_entry.value; automatic logic load_next_c = '0; - if(decoded_reg_strb.NonStickyDataVaultCtrl[i0] && decoded_req_is_wr && !(hwif_in.NonStickyDataVaultCtrl[i0].lock_entry.swwel)) begin // SW write - next_c = (field_storage.NonStickyDataVaultCtrl[i0].lock_entry.value & ~decoded_wr_biten[0:0]) | (decoded_wr_data[0:0] & decoded_wr_biten[0:0]); + if(decoded_reg_strb.DataVaultCtrl[i0] && decoded_req_is_wr && !(hwif_in.DataVaultCtrl[i0].lock_entry.swwel)) begin // SW write + next_c = (field_storage.DataVaultCtrl[i0].lock_entry.value & ~decoded_wr_biten[0:0]) | (decoded_wr_data[0:0] & decoded_wr_biten[0:0]); load_next_c = '1; end - field_combo.NonStickyDataVaultCtrl[i0].lock_entry.next = next_c; - field_combo.NonStickyDataVaultCtrl[i0].lock_entry.load_next = load_next_c; + field_combo.DataVaultCtrl[i0].lock_entry.next = next_c; + field_combo.DataVaultCtrl[i0].lock_entry.load_next = load_next_c; end always_ff @(posedge clk or negedge hwif_in.core_only_rst_b) begin if(~hwif_in.core_only_rst_b) begin - field_storage.NonStickyDataVaultCtrl[i0].lock_entry.value <= 'h0; - end else if(field_combo.NonStickyDataVaultCtrl[i0].lock_entry.load_next) begin - field_storage.NonStickyDataVaultCtrl[i0].lock_entry.value <= field_combo.NonStickyDataVaultCtrl[i0].lock_entry.next; + field_storage.DataVaultCtrl[i0].lock_entry.value <= 'h0; + end else if(field_combo.DataVaultCtrl[i0].lock_entry.load_next) begin + field_storage.DataVaultCtrl[i0].lock_entry.value <= field_combo.DataVaultCtrl[i0].lock_entry.next; end end - assign hwif_out.NonStickyDataVaultCtrl[i0].lock_entry.value = field_storage.NonStickyDataVaultCtrl[i0].lock_entry.value; + assign hwif_out.DataVaultCtrl[i0].lock_entry.value = field_storage.DataVaultCtrl[i0].lock_entry.value; end for(genvar i0=0; i0<10; i0++) begin for(genvar i1=0; i1<12; i1++) begin - // Field: dv_reg.NONSTICKY_DATA_VAULT_ENTRY[][].data + // Field: dv_reg.DATA_VAULT_ENTRY[][].data always_comb begin - automatic logic [31:0] next_c = field_storage.NONSTICKY_DATA_VAULT_ENTRY[i0][i1].data.value; + automatic logic [31:0] next_c = field_storage.DATA_VAULT_ENTRY[i0][i1].data.value; automatic logic load_next_c = '0; - if(decoded_reg_strb.NONSTICKY_DATA_VAULT_ENTRY[i0][i1] && decoded_req_is_wr && !(hwif_in.NONSTICKY_DATA_VAULT_ENTRY[i0][i1].data.swwel)) begin // SW write - next_c = (field_storage.NONSTICKY_DATA_VAULT_ENTRY[i0][i1].data.value & ~decoded_wr_biten[31:0]) | (decoded_wr_data[31:0] & decoded_wr_biten[31:0]); + if(decoded_reg_strb.DATA_VAULT_ENTRY[i0][i1] && decoded_req_is_wr && !(hwif_in.DATA_VAULT_ENTRY[i0][i1].data.swwel)) begin // SW write + next_c = (field_storage.DATA_VAULT_ENTRY[i0][i1].data.value & ~decoded_wr_biten[31:0]) | (decoded_wr_data[31:0] & decoded_wr_biten[31:0]); load_next_c = '1; end - field_combo.NONSTICKY_DATA_VAULT_ENTRY[i0][i1].data.next = next_c; - field_combo.NONSTICKY_DATA_VAULT_ENTRY[i0][i1].data.load_next = load_next_c; + field_combo.DATA_VAULT_ENTRY[i0][i1].data.next = next_c; + field_combo.DATA_VAULT_ENTRY[i0][i1].data.load_next = load_next_c; end - always_ff @(posedge clk or negedge hwif_in.reset_b) begin - if(~hwif_in.reset_b) begin - field_storage.NONSTICKY_DATA_VAULT_ENTRY[i0][i1].data.value <= 'h0; - end else if(field_combo.NONSTICKY_DATA_VAULT_ENTRY[i0][i1].data.load_next) begin - field_storage.NONSTICKY_DATA_VAULT_ENTRY[i0][i1].data.value <= field_combo.NONSTICKY_DATA_VAULT_ENTRY[i0][i1].data.next; + always_ff @(posedge clk or negedge hwif_in.hard_reset_b) begin + if(~hwif_in.hard_reset_b) begin + field_storage.DATA_VAULT_ENTRY[i0][i1].data.value <= 'h0; + end else if(field_combo.DATA_VAULT_ENTRY[i0][i1].data.load_next) begin + field_storage.DATA_VAULT_ENTRY[i0][i1].data.value <= field_combo.DATA_VAULT_ENTRY[i0][i1].data.next; end end end end for(genvar i0=0; i0<10; i0++) begin - // Field: dv_reg.NonStickyLockableScratchRegCtrl[].lock_entry + // Field: dv_reg.LockableScratchRegCtrl[].lock_entry always_comb begin - automatic logic [0:0] next_c = field_storage.NonStickyLockableScratchRegCtrl[i0].lock_entry.value; + automatic logic [0:0] next_c = field_storage.LockableScratchRegCtrl[i0].lock_entry.value; automatic logic load_next_c = '0; - if(decoded_reg_strb.NonStickyLockableScratchRegCtrl[i0] && decoded_req_is_wr && !(hwif_in.NonStickyLockableScratchRegCtrl[i0].lock_entry.swwel)) begin // SW write - next_c = (field_storage.NonStickyLockableScratchRegCtrl[i0].lock_entry.value & ~decoded_wr_biten[0:0]) | (decoded_wr_data[0:0] & decoded_wr_biten[0:0]); + if(decoded_reg_strb.LockableScratchRegCtrl[i0] && decoded_req_is_wr && !(hwif_in.LockableScratchRegCtrl[i0].lock_entry.swwel)) begin // SW write + next_c = (field_storage.LockableScratchRegCtrl[i0].lock_entry.value & ~decoded_wr_biten[0:0]) | (decoded_wr_data[0:0] & decoded_wr_biten[0:0]); load_next_c = '1; end - field_combo.NonStickyLockableScratchRegCtrl[i0].lock_entry.next = next_c; - field_combo.NonStickyLockableScratchRegCtrl[i0].lock_entry.load_next = load_next_c; + field_combo.LockableScratchRegCtrl[i0].lock_entry.next = next_c; + field_combo.LockableScratchRegCtrl[i0].lock_entry.load_next = load_next_c; end always_ff @(posedge clk or negedge hwif_in.core_only_rst_b) begin if(~hwif_in.core_only_rst_b) begin - field_storage.NonStickyLockableScratchRegCtrl[i0].lock_entry.value <= 'h0; - end else if(field_combo.NonStickyLockableScratchRegCtrl[i0].lock_entry.load_next) begin - field_storage.NonStickyLockableScratchRegCtrl[i0].lock_entry.value <= field_combo.NonStickyLockableScratchRegCtrl[i0].lock_entry.next; + field_storage.LockableScratchRegCtrl[i0].lock_entry.value <= 'h0; + end else if(field_combo.LockableScratchRegCtrl[i0].lock_entry.load_next) begin + field_storage.LockableScratchRegCtrl[i0].lock_entry.value <= field_combo.LockableScratchRegCtrl[i0].lock_entry.next; end end - assign hwif_out.NonStickyLockableScratchRegCtrl[i0].lock_entry.value = field_storage.NonStickyLockableScratchRegCtrl[i0].lock_entry.value; + assign hwif_out.LockableScratchRegCtrl[i0].lock_entry.value = field_storage.LockableScratchRegCtrl[i0].lock_entry.value; end for(genvar i0=0; i0<10; i0++) begin - // Field: dv_reg.NonStickyLockableScratchReg[].data + // Field: dv_reg.LockableScratchReg[].data always_comb begin - automatic logic [31:0] next_c = field_storage.NonStickyLockableScratchReg[i0].data.value; + automatic logic [31:0] next_c = field_storage.LockableScratchReg[i0].data.value; automatic logic load_next_c = '0; - if(decoded_reg_strb.NonStickyLockableScratchReg[i0] && decoded_req_is_wr && !(hwif_in.NonStickyLockableScratchReg[i0].data.swwel)) begin // SW write - next_c = (field_storage.NonStickyLockableScratchReg[i0].data.value & ~decoded_wr_biten[31:0]) | (decoded_wr_data[31:0] & decoded_wr_biten[31:0]); + if(decoded_reg_strb.LockableScratchReg[i0] && decoded_req_is_wr && !(hwif_in.LockableScratchReg[i0].data.swwel)) begin // SW write + next_c = (field_storage.LockableScratchReg[i0].data.value & ~decoded_wr_biten[31:0]) | (decoded_wr_data[31:0] & decoded_wr_biten[31:0]); load_next_c = '1; end - field_combo.NonStickyLockableScratchReg[i0].data.next = next_c; - field_combo.NonStickyLockableScratchReg[i0].data.load_next = load_next_c; + field_combo.LockableScratchReg[i0].data.next = next_c; + field_combo.LockableScratchReg[i0].data.load_next = load_next_c; end - always_ff @(posedge clk or negedge hwif_in.reset_b) begin - if(~hwif_in.reset_b) begin - field_storage.NonStickyLockableScratchReg[i0].data.value <= 'h0; - end else if(field_combo.NonStickyLockableScratchReg[i0].data.load_next) begin - field_storage.NonStickyLockableScratchReg[i0].data.value <= field_combo.NonStickyLockableScratchReg[i0].data.next; + always_ff @(posedge clk or negedge hwif_in.hard_reset_b) begin + if(~hwif_in.hard_reset_b) begin + field_storage.LockableScratchReg[i0].data.value <= 'h0; + end else if(field_combo.LockableScratchReg[i0].data.load_next) begin + field_storage.LockableScratchReg[i0].data.value <= field_combo.LockableScratchReg[i0].data.next; end end end @@ -441,20 +441,20 @@ module dv_reg ( end end for(genvar i0=0; i0<10; i0++) begin - assign readback_array[i0*1 + 130][0:0] = (decoded_reg_strb.NonStickyDataVaultCtrl[i0] && !decoded_req_is_wr) ? field_storage.NonStickyDataVaultCtrl[i0].lock_entry.value : '0; + assign readback_array[i0*1 + 130][0:0] = (decoded_reg_strb.DataVaultCtrl[i0] && !decoded_req_is_wr) ? field_storage.DataVaultCtrl[i0].lock_entry.value : '0; assign readback_array[i0*1 + 130][31:1] = '0; end for(genvar i0=0; i0<10; i0++) begin for(genvar i1=0; i1<12; i1++) begin - assign readback_array[i0*12 + i1*1 + 140][31:0] = (decoded_reg_strb.NONSTICKY_DATA_VAULT_ENTRY[i0][i1] && !decoded_req_is_wr) ? field_storage.NONSTICKY_DATA_VAULT_ENTRY[i0][i1].data.value : '0; + assign readback_array[i0*12 + i1*1 + 140][31:0] = (decoded_reg_strb.DATA_VAULT_ENTRY[i0][i1] && !decoded_req_is_wr) ? field_storage.DATA_VAULT_ENTRY[i0][i1].data.value : '0; end end for(genvar i0=0; i0<10; i0++) begin - assign readback_array[i0*1 + 260][0:0] = (decoded_reg_strb.NonStickyLockableScratchRegCtrl[i0] && !decoded_req_is_wr) ? field_storage.NonStickyLockableScratchRegCtrl[i0].lock_entry.value : '0; + assign readback_array[i0*1 + 260][0:0] = (decoded_reg_strb.LockableScratchRegCtrl[i0] && !decoded_req_is_wr) ? field_storage.LockableScratchRegCtrl[i0].lock_entry.value : '0; assign readback_array[i0*1 + 260][31:1] = '0; end for(genvar i0=0; i0<10; i0++) begin - assign readback_array[i0*1 + 270][31:0] = (decoded_reg_strb.NonStickyLockableScratchReg[i0] && !decoded_req_is_wr) ? field_storage.NonStickyLockableScratchReg[i0].data.value : '0; + assign readback_array[i0*1 + 270][31:0] = (decoded_reg_strb.LockableScratchReg[i0] && !decoded_req_is_wr) ? field_storage.LockableScratchReg[i0].data.value : '0; end for(genvar i0=0; i0<8; i0++) begin assign readback_array[i0*1 + 280][31:0] = (decoded_reg_strb.NonStickyGenericScratchReg[i0] && !decoded_req_is_wr) ? field_storage.NonStickyGenericScratchReg[i0].data.value : '0; diff --git a/src/datavault/rtl/dv_reg_pkg.sv b/src/datavault/rtl/dv_reg_pkg.sv index 465927a3b..ee3801467 100644 --- a/src/datavault/rtl/dv_reg_pkg.sv +++ b/src/datavault/rtl/dv_reg_pkg.sv @@ -20,35 +20,35 @@ package dv_reg_pkg; typedef struct packed{ logic swwel; - } dv_reg__NonStickyDataVaultCtrl__lock_entry__in_t; + } dv_reg__DataVaultCtrl__lock_entry__in_t; typedef struct packed{ - dv_reg__NonStickyDataVaultCtrl__lock_entry__in_t lock_entry; - } dv_reg__NonStickyDataVaultCtrl__in_t; + dv_reg__DataVaultCtrl__lock_entry__in_t lock_entry; + } dv_reg__DataVaultCtrl__in_t; typedef struct packed{ logic swwel; - } dv_reg__NonStickyDataVaultEntry_w32__in_t; + } dv_reg__DataVaultEntry_w32__in_t; typedef struct packed{ - dv_reg__NonStickyDataVaultEntry_w32__in_t data; - } dv_reg__NonStickyDataVaultReg__in_t; + dv_reg__DataVaultEntry_w32__in_t data; + } dv_reg__DataVaultReg__in_t; typedef struct packed{ logic swwel; - } dv_reg__NonStickyLockableScratchRegCtrl__lock_entry__in_t; + } dv_reg__LockableScratchRegCtrl__lock_entry__in_t; typedef struct packed{ - dv_reg__NonStickyLockableScratchRegCtrl__lock_entry__in_t lock_entry; - } dv_reg__NonStickyLockableScratchRegCtrl__in_t; + dv_reg__LockableScratchRegCtrl__lock_entry__in_t lock_entry; + } dv_reg__LockableScratchRegCtrl__in_t; typedef struct packed{ logic swwel; - } dv_reg__NonStickyLockableScratchReg__data__in_t; + } dv_reg__LockableScratchReg__data__in_t; typedef struct packed{ - dv_reg__NonStickyLockableScratchReg__data__in_t data; - } dv_reg__NonStickyLockableScratchReg__in_t; + dv_reg__LockableScratchReg__data__in_t data; + } dv_reg__LockableScratchReg__in_t; typedef struct packed{ logic swwel; @@ -72,10 +72,10 @@ package dv_reg_pkg; logic hard_reset_b; dv_reg__StickyDataVaultCtrl__in_t [10-1:0]StickyDataVaultCtrl; dv_reg__StickyDataVaultReg__in_t [10-1:0][12-1:0]STICKY_DATA_VAULT_ENTRY; - dv_reg__NonStickyDataVaultCtrl__in_t [10-1:0]NonStickyDataVaultCtrl; - dv_reg__NonStickyDataVaultReg__in_t [10-1:0][12-1:0]NONSTICKY_DATA_VAULT_ENTRY; - dv_reg__NonStickyLockableScratchRegCtrl__in_t [10-1:0]NonStickyLockableScratchRegCtrl; - dv_reg__NonStickyLockableScratchReg__in_t [10-1:0]NonStickyLockableScratchReg; + dv_reg__DataVaultCtrl__in_t [10-1:0]DataVaultCtrl; + dv_reg__DataVaultReg__in_t [10-1:0][12-1:0]DATA_VAULT_ENTRY; + dv_reg__LockableScratchRegCtrl__in_t [10-1:0]LockableScratchRegCtrl; + dv_reg__LockableScratchReg__in_t [10-1:0]LockableScratchReg; dv_reg__StickyLockableScratchRegCtrl__in_t [8-1:0]StickyLockableScratchRegCtrl; dv_reg__StickyLockableScratchReg__in_t [8-1:0]StickyLockableScratchReg; } dv_reg__in_t; @@ -90,19 +90,19 @@ package dv_reg_pkg; typedef struct packed{ logic value; - } dv_reg__NonStickyDataVaultCtrl__lock_entry__out_t; + } dv_reg__DataVaultCtrl__lock_entry__out_t; typedef struct packed{ - dv_reg__NonStickyDataVaultCtrl__lock_entry__out_t lock_entry; - } dv_reg__NonStickyDataVaultCtrl__out_t; + dv_reg__DataVaultCtrl__lock_entry__out_t lock_entry; + } dv_reg__DataVaultCtrl__out_t; typedef struct packed{ logic value; - } dv_reg__NonStickyLockableScratchRegCtrl__lock_entry__out_t; + } dv_reg__LockableScratchRegCtrl__lock_entry__out_t; typedef struct packed{ - dv_reg__NonStickyLockableScratchRegCtrl__lock_entry__out_t lock_entry; - } dv_reg__NonStickyLockableScratchRegCtrl__out_t; + dv_reg__LockableScratchRegCtrl__lock_entry__out_t lock_entry; + } dv_reg__LockableScratchRegCtrl__out_t; typedef struct packed{ logic value; @@ -114,8 +114,8 @@ package dv_reg_pkg; typedef struct packed{ dv_reg__StickyDataVaultCtrl__out_t [10-1:0]StickyDataVaultCtrl; - dv_reg__NonStickyDataVaultCtrl__out_t [10-1:0]NonStickyDataVaultCtrl; - dv_reg__NonStickyLockableScratchRegCtrl__out_t [10-1:0]NonStickyLockableScratchRegCtrl; + dv_reg__DataVaultCtrl__out_t [10-1:0]DataVaultCtrl; + dv_reg__LockableScratchRegCtrl__out_t [10-1:0]LockableScratchRegCtrl; dv_reg__StickyLockableScratchRegCtrl__out_t [8-1:0]StickyLockableScratchRegCtrl; } dv_reg__out_t; diff --git a/src/datavault/rtl/dv_reg_uvm.sv b/src/datavault/rtl/dv_reg_uvm.sv index 4c4ac0719..9517e8221 100644 --- a/src/datavault/rtl/dv_reg_uvm.sv +++ b/src/datavault/rtl/dv_reg_uvm.sv @@ -3,130 +3,274 @@ package dv_reg_uvm; `include "uvm_macros.svh" import uvm_pkg::*; - + `include "dv_reg_covergroups.svh" // Reg - dv_reg::StickyDataVaultCtrl class dv_reg__StickyDataVaultCtrl extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + dv_reg__StickyDataVaultCtrl_bit_cg lock_entry_bit_cg[1]; + dv_reg__StickyDataVaultCtrl_fld_cg fld_cg; rand uvm_reg_field lock_entry; function new(string name = "dv_reg__StickyDataVaultCtrl"); - super.new(name, 32, UVM_NO_COVERAGE); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); virtual function void build(); this.lock_entry = new("lock_entry"); this.lock_entry.configure(this, 1, 0, "RW", 0, 'h0, 1, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(lock_entry_bit_cg[bt]) lock_entry_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); endfunction : build endclass : dv_reg__StickyDataVaultCtrl // Reg - dv_reg::StickyDataVaultReg class dv_reg__StickyDataVaultReg extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + dv_reg__StickyDataVaultReg_bit_cg data_bit_cg[32]; + dv_reg__StickyDataVaultReg_fld_cg fld_cg; rand uvm_reg_field data; function new(string name = "dv_reg__StickyDataVaultReg"); - super.new(name, 32, UVM_NO_COVERAGE); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); virtual function void build(); this.data = new("data"); this.data.configure(this, 32, 0, "RW", 0, 'h0, 1, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(data_bit_cg[bt]) data_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); endfunction : build endclass : dv_reg__StickyDataVaultReg - // Reg - dv_reg::NonStickyDataVaultCtrl - class dv_reg__NonStickyDataVaultCtrl extends uvm_reg; + // Reg - dv_reg::DataVaultCtrl + class dv_reg__DataVaultCtrl extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + dv_reg__DataVaultCtrl_bit_cg lock_entry_bit_cg[1]; + dv_reg__DataVaultCtrl_fld_cg fld_cg; rand uvm_reg_field lock_entry; - function new(string name = "dv_reg__NonStickyDataVaultCtrl"); - super.new(name, 32, UVM_NO_COVERAGE); + function new(string name = "dv_reg__DataVaultCtrl"); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); virtual function void build(); this.lock_entry = new("lock_entry"); this.lock_entry.configure(this, 1, 0, "RW", 0, 'h0, 1, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(lock_entry_bit_cg[bt]) lock_entry_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); endfunction : build - endclass : dv_reg__NonStickyDataVaultCtrl + endclass : dv_reg__DataVaultCtrl + + // Reg - dv_reg::DataVaultReg + class dv_reg__DataVaultReg extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; - // Reg - dv_reg::NonStickyDataVaultReg - class dv_reg__NonStickyDataVaultReg extends uvm_reg; + dv_reg__DataVaultReg_bit_cg data_bit_cg[32]; + dv_reg__DataVaultReg_fld_cg fld_cg; rand uvm_reg_field data; - function new(string name = "dv_reg__NonStickyDataVaultReg"); - super.new(name, 32, UVM_NO_COVERAGE); + function new(string name = "dv_reg__DataVaultReg"); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); virtual function void build(); this.data = new("data"); this.data.configure(this, 32, 0, "RW", 0, 'h0, 1, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(data_bit_cg[bt]) data_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); endfunction : build - endclass : dv_reg__NonStickyDataVaultReg + endclass : dv_reg__DataVaultReg + + // Reg - dv_reg::LockableScratchRegCtrl + class dv_reg__LockableScratchRegCtrl extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; - // Reg - dv_reg::NonStickyLockableScratchRegCtrl - class dv_reg__NonStickyLockableScratchRegCtrl extends uvm_reg; + dv_reg__LockableScratchRegCtrl_bit_cg lock_entry_bit_cg[1]; + dv_reg__LockableScratchRegCtrl_fld_cg fld_cg; rand uvm_reg_field lock_entry; - function new(string name = "dv_reg__NonStickyLockableScratchRegCtrl"); - super.new(name, 32, UVM_NO_COVERAGE); + function new(string name = "dv_reg__LockableScratchRegCtrl"); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); virtual function void build(); this.lock_entry = new("lock_entry"); this.lock_entry.configure(this, 1, 0, "RW", 0, 'h0, 1, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(lock_entry_bit_cg[bt]) lock_entry_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); endfunction : build - endclass : dv_reg__NonStickyLockableScratchRegCtrl + endclass : dv_reg__LockableScratchRegCtrl + + // Reg - dv_reg::LockableScratchReg + class dv_reg__LockableScratchReg extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; - // Reg - dv_reg::NonStickyLockableScratchReg - class dv_reg__NonStickyLockableScratchReg extends uvm_reg; + dv_reg__LockableScratchReg_bit_cg data_bit_cg[32]; + dv_reg__LockableScratchReg_fld_cg fld_cg; rand uvm_reg_field data; - function new(string name = "dv_reg__NonStickyLockableScratchReg"); - super.new(name, 32, UVM_NO_COVERAGE); + function new(string name = "dv_reg__LockableScratchReg"); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); virtual function void build(); this.data = new("data"); this.data.configure(this, 32, 0, "RW", 0, 'h0, 1, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(data_bit_cg[bt]) data_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); endfunction : build - endclass : dv_reg__NonStickyLockableScratchReg + endclass : dv_reg__LockableScratchReg // Reg - dv_reg::NonStickyGenericScratchReg class dv_reg__NonStickyGenericScratchReg extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + dv_reg__NonStickyGenericScratchReg_bit_cg data_bit_cg[32]; + dv_reg__NonStickyGenericScratchReg_fld_cg fld_cg; rand uvm_reg_field data; function new(string name = "dv_reg__NonStickyGenericScratchReg"); - super.new(name, 32, UVM_NO_COVERAGE); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); virtual function void build(); this.data = new("data"); this.data.configure(this, 32, 0, "RW", 0, 'h0, 1, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(data_bit_cg[bt]) data_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); endfunction : build endclass : dv_reg__NonStickyGenericScratchReg // Reg - dv_reg::StickyLockableScratchRegCtrl class dv_reg__StickyLockableScratchRegCtrl extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + dv_reg__StickyLockableScratchRegCtrl_bit_cg lock_entry_bit_cg[1]; + dv_reg__StickyLockableScratchRegCtrl_fld_cg fld_cg; rand uvm_reg_field lock_entry; function new(string name = "dv_reg__StickyLockableScratchRegCtrl"); - super.new(name, 32, UVM_NO_COVERAGE); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); virtual function void build(); this.lock_entry = new("lock_entry"); this.lock_entry.configure(this, 1, 0, "RW", 0, 'h0, 1, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(lock_entry_bit_cg[bt]) lock_entry_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); endfunction : build endclass : dv_reg__StickyLockableScratchRegCtrl // Reg - dv_reg::StickyLockableScratchReg class dv_reg__StickyLockableScratchReg extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + dv_reg__StickyLockableScratchReg_bit_cg data_bit_cg[32]; + dv_reg__StickyLockableScratchReg_fld_cg fld_cg; rand uvm_reg_field data; function new(string name = "dv_reg__StickyLockableScratchReg"); - super.new(name, 32, UVM_NO_COVERAGE); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); virtual function void build(); this.data = new("data"); this.data.configure(this, 32, 0, "RW", 0, 'h0, 1, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(data_bit_cg[bt]) data_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); endfunction : build endclass : dv_reg__StickyLockableScratchReg @@ -134,10 +278,10 @@ package dv_reg_uvm; class dv_reg extends uvm_reg_block; rand dv_reg__StickyDataVaultCtrl StickyDataVaultCtrl[10]; rand dv_reg__StickyDataVaultReg STICKY_DATA_VAULT_ENTRY[10][12]; - rand dv_reg__NonStickyDataVaultCtrl NonStickyDataVaultCtrl[10]; - rand dv_reg__NonStickyDataVaultReg NONSTICKY_DATA_VAULT_ENTRY[10][12]; - rand dv_reg__NonStickyLockableScratchRegCtrl NonStickyLockableScratchRegCtrl[10]; - rand dv_reg__NonStickyLockableScratchReg NonStickyLockableScratchReg[10]; + rand dv_reg__DataVaultCtrl DataVaultCtrl[10]; + rand dv_reg__DataVaultReg DATA_VAULT_ENTRY[10][12]; + rand dv_reg__LockableScratchRegCtrl LockableScratchRegCtrl[10]; + rand dv_reg__LockableScratchReg LockableScratchReg[10]; rand dv_reg__NonStickyGenericScratchReg NonStickyGenericScratchReg[8]; rand dv_reg__StickyLockableScratchRegCtrl StickyLockableScratchRegCtrl[8]; rand dv_reg__StickyLockableScratchReg StickyLockableScratchReg[8]; @@ -162,33 +306,33 @@ package dv_reg_uvm; this.STICKY_DATA_VAULT_ENTRY[i0][i1].build(); this.default_map.add_reg(this.STICKY_DATA_VAULT_ENTRY[i0][i1], 'h28 + i0*'h30 + i1*'h4); end - foreach(this.NonStickyDataVaultCtrl[i0]) begin - this.NonStickyDataVaultCtrl[i0] = new($sformatf("NonStickyDataVaultCtrl[%0d]", i0)); - this.NonStickyDataVaultCtrl[i0].configure(this); + foreach(this.DataVaultCtrl[i0]) begin + this.DataVaultCtrl[i0] = new($sformatf("DataVaultCtrl[%0d]", i0)); + this.DataVaultCtrl[i0].configure(this); - this.NonStickyDataVaultCtrl[i0].build(); - this.default_map.add_reg(this.NonStickyDataVaultCtrl[i0], 'h208 + i0*'h4); + this.DataVaultCtrl[i0].build(); + this.default_map.add_reg(this.DataVaultCtrl[i0], 'h208 + i0*'h4); end - foreach(this.NONSTICKY_DATA_VAULT_ENTRY[i0, i1]) begin - this.NONSTICKY_DATA_VAULT_ENTRY[i0][i1] = new($sformatf("NONSTICKY_DATA_VAULT_ENTRY[%0d][%0d]", i0, i1)); - this.NONSTICKY_DATA_VAULT_ENTRY[i0][i1].configure(this); + foreach(this.DATA_VAULT_ENTRY[i0, i1]) begin + this.DATA_VAULT_ENTRY[i0][i1] = new($sformatf("DATA_VAULT_ENTRY[%0d][%0d]", i0, i1)); + this.DATA_VAULT_ENTRY[i0][i1].configure(this); - this.NONSTICKY_DATA_VAULT_ENTRY[i0][i1].build(); - this.default_map.add_reg(this.NONSTICKY_DATA_VAULT_ENTRY[i0][i1], 'h230 + i0*'h30 + i1*'h4); + this.DATA_VAULT_ENTRY[i0][i1].build(); + this.default_map.add_reg(this.DATA_VAULT_ENTRY[i0][i1], 'h230 + i0*'h30 + i1*'h4); end - foreach(this.NonStickyLockableScratchRegCtrl[i0]) begin - this.NonStickyLockableScratchRegCtrl[i0] = new($sformatf("NonStickyLockableScratchRegCtrl[%0d]", i0)); - this.NonStickyLockableScratchRegCtrl[i0].configure(this); + foreach(this.LockableScratchRegCtrl[i0]) begin + this.LockableScratchRegCtrl[i0] = new($sformatf("LockableScratchRegCtrl[%0d]", i0)); + this.LockableScratchRegCtrl[i0].configure(this); - this.NonStickyLockableScratchRegCtrl[i0].build(); - this.default_map.add_reg(this.NonStickyLockableScratchRegCtrl[i0], 'h410 + i0*'h4); + this.LockableScratchRegCtrl[i0].build(); + this.default_map.add_reg(this.LockableScratchRegCtrl[i0], 'h410 + i0*'h4); end - foreach(this.NonStickyLockableScratchReg[i0]) begin - this.NonStickyLockableScratchReg[i0] = new($sformatf("NonStickyLockableScratchReg[%0d]", i0)); - this.NonStickyLockableScratchReg[i0].configure(this); + foreach(this.LockableScratchReg[i0]) begin + this.LockableScratchReg[i0] = new($sformatf("LockableScratchReg[%0d]", i0)); + this.LockableScratchReg[i0].configure(this); - this.NonStickyLockableScratchReg[i0].build(); - this.default_map.add_reg(this.NonStickyLockableScratchReg[i0], 'h438 + i0*'h4); + this.LockableScratchReg[i0].build(); + this.default_map.add_reg(this.LockableScratchReg[i0], 'h438 + i0*'h4); end foreach(this.NonStickyGenericScratchReg[i0]) begin this.NonStickyGenericScratchReg[i0] = new($sformatf("NonStickyGenericScratchReg[%0d]", i0)); @@ -214,4 +358,5 @@ package dv_reg_uvm; endfunction : build endclass : dv_reg + `include "dv_reg_sample.svh" endpackage: dv_reg_uvm diff --git a/src/doe/config/compile.yml b/src/doe/config/compile.yml index 7b1815664..39c70d8c4 100755 --- a/src/doe/config/compile.yml +++ b/src/doe/config/compile.yml @@ -53,6 +53,18 @@ targets: files: - $COMPILE_ROOT/tb/doe_cbc_tb.sv tops: [doe_cbc_tb] +--- +provides: [doe_core_cbc_tb] +schema_version: 2.4.0 +requires: + - doe_ctrl +targets: + tb: + directories: + - $COMPILE_ROOT/tb + files: + - $COMPILE_ROOT/tb/doe_core_cbc_tb.sv + tops: [doe_core_cbc_tb] global: tool: vcs: diff --git a/src/doe/config/doe_cbc_tb.vf b/src/doe/config/doe_cbc_tb.vf index 6feae6b6b..343b1bc45 100644 --- a/src/doe/config/doe_cbc_tb.vf +++ b/src/doe/config/doe_cbc_tb.vf @@ -14,6 +14,7 @@ ${CALIPTRA_ROOT}/src/libs/rtl/apb_slv_sif.sv ${CALIPTRA_ROOT}/src/libs/rtl/ahb_slv_sif.sv ${CALIPTRA_ROOT}/src/libs/rtl/caliptra_icg.sv ${CALIPTRA_ROOT}/src/libs/rtl/clk_gate.sv +${CALIPTRA_ROOT}/src/libs/rtl/caliptra_2ff_sync.sv ${CALIPTRA_ROOT}/src/keyvault/rtl/kv_defines_pkg.sv ${CALIPTRA_ROOT}/src/keyvault/rtl/kv_macros.svh ${CALIPTRA_ROOT}/src/doe/rtl/doe_defines_pkg.sv diff --git a/src/doe/config/doe_core_cbc_tb.vf b/src/doe/config/doe_core_cbc_tb.vf new file mode 100644 index 000000000..be61bb115 --- /dev/null +++ b/src/doe/config/doe_core_cbc_tb.vf @@ -0,0 +1,39 @@ ++incdir+${CALIPTRA_ROOT}/src/integration/rtl ++incdir+${CALIPTRA_ROOT}/src/libs/rtl ++incdir+${CALIPTRA_ROOT}/src/keyvault/rtl ++incdir+${CALIPTRA_ROOT}/src/doe/rtl ++incdir+${CALIPTRA_ROOT}/src/doe/tb +${CALIPTRA_ROOT}/src/integration/rtl/config_defines.svh +${CALIPTRA_ROOT}/src/integration/rtl/caliptra_reg_defines.svh +${CALIPTRA_ROOT}/src/libs/rtl/caliptra_sva.svh +${CALIPTRA_ROOT}/src/libs/rtl/caliptra_macros.svh +${CALIPTRA_ROOT}/src/libs/rtl/caliptra_sram.sv +${CALIPTRA_ROOT}/src/libs/rtl/ahb_defines_pkg.sv +${CALIPTRA_ROOT}/src/libs/rtl/caliptra_ahb_srom.sv +${CALIPTRA_ROOT}/src/libs/rtl/apb_slv_sif.sv +${CALIPTRA_ROOT}/src/libs/rtl/ahb_slv_sif.sv +${CALIPTRA_ROOT}/src/libs/rtl/caliptra_icg.sv +${CALIPTRA_ROOT}/src/libs/rtl/clk_gate.sv +${CALIPTRA_ROOT}/src/libs/rtl/caliptra_2ff_sync.sv +${CALIPTRA_ROOT}/src/keyvault/rtl/kv_defines_pkg.sv +${CALIPTRA_ROOT}/src/keyvault/rtl/kv_macros.svh +${CALIPTRA_ROOT}/src/doe/rtl/doe_defines_pkg.sv +${CALIPTRA_ROOT}/src/doe/tb/doe_core_cbc_tb.sv +${CALIPTRA_ROOT}/src/libs/rtl/ahb_to_reg_adapter.sv +${CALIPTRA_ROOT}/src/keyvault/rtl/kv_reg_pkg.sv +${CALIPTRA_ROOT}/src/keyvault/rtl/kv_reg.sv +${CALIPTRA_ROOT}/src/keyvault/rtl/kv.sv +${CALIPTRA_ROOT}/src/keyvault/rtl/kv_fsm.sv +${CALIPTRA_ROOT}/src/keyvault/rtl/kv_read_client.sv +${CALIPTRA_ROOT}/src/keyvault/rtl/kv_write_client.sv +${CALIPTRA_ROOT}/src/doe/rtl/doe_reg_pkg.sv +${CALIPTRA_ROOT}/src/doe/rtl/doe_ctrl.sv +${CALIPTRA_ROOT}/src/doe/rtl/doe_decipher_block.sv +${CALIPTRA_ROOT}/src/doe/rtl/doe_encipher_block.sv +${CALIPTRA_ROOT}/src/doe/rtl/doe_inv_sbox.sv +${CALIPTRA_ROOT}/src/doe/rtl/doe_key_mem.sv +${CALIPTRA_ROOT}/src/doe/rtl/doe_sbox.sv +${CALIPTRA_ROOT}/src/doe/rtl/doe_cbc.sv +${CALIPTRA_ROOT}/src/doe/rtl/doe_core_cbc.sv +${CALIPTRA_ROOT}/src/doe/rtl/doe_reg.sv +${CALIPTRA_ROOT}/src/doe/rtl/doe_fsm.sv \ No newline at end of file diff --git a/src/doe/config/doe_ctrl.vf b/src/doe/config/doe_ctrl.vf index e4141e256..09ff0b298 100644 --- a/src/doe/config/doe_ctrl.vf +++ b/src/doe/config/doe_ctrl.vf @@ -13,6 +13,7 @@ ${CALIPTRA_ROOT}/src/libs/rtl/apb_slv_sif.sv ${CALIPTRA_ROOT}/src/libs/rtl/ahb_slv_sif.sv ${CALIPTRA_ROOT}/src/libs/rtl/caliptra_icg.sv ${CALIPTRA_ROOT}/src/libs/rtl/clk_gate.sv +${CALIPTRA_ROOT}/src/libs/rtl/caliptra_2ff_sync.sv ${CALIPTRA_ROOT}/src/keyvault/rtl/kv_defines_pkg.sv ${CALIPTRA_ROOT}/src/keyvault/rtl/kv_macros.svh ${CALIPTRA_ROOT}/src/doe/rtl/doe_defines_pkg.sv diff --git a/src/doe/coverage/config/doe_cm_hier.cfg b/src/doe/coverage/config/doe_cm_hier.cfg new file mode 100644 index 000000000..bcd0cda31 --- /dev/null +++ b/src/doe/coverage/config/doe_cm_hier.cfg @@ -0,0 +1,3 @@ +begin line+tgl+fsm+cond+branch + +tree doe_core_cbc_tb.dut 0 +end \ No newline at end of file diff --git a/src/doe/rtl/doe_cbc.sv b/src/doe/rtl/doe_cbc.sv index 68f15f0d4..70dec5840 100644 --- a/src/doe/rtl/doe_cbc.sv +++ b/src/doe/rtl/doe_cbc.sv @@ -67,7 +67,8 @@ module doe_cbc output logic clear_obf_secrets, //interface with kv - output kv_write_t kv_write + output kv_write_t kv_write, + input logic debugUnlock_or_scan_mode_switch ); //---------------------------------------------------------------- @@ -106,6 +107,7 @@ module doe_cbc logic doe_init; logic doe_next; + logic zeroize; logic flow_done; logic flow_in_progress, lock_fe_flow, lock_uds_flow; @@ -133,6 +135,7 @@ module doe_cbc doe_core_cbc i_doe_core_cbc( .clk(clk), .reset_n(reset_n), + .zeroize(zeroize), .encdec(core_encdec), .init_cmd(core_init), @@ -163,6 +166,11 @@ module doe_cbc ready_reg <= '0; kv_result_reg <= '0; end + else if (zeroize) begin + block_reg <= '0; + ready_reg <= '0; + kv_result_reg <= '0; + end else begin ready_reg <= core_ready; kv_result_reg <= core_result; @@ -191,7 +199,8 @@ assign doe_cmd_reg.dest_sel = hwif_out.DOE_CTRL.DEST.value; //FW can do this to clear the obfuscation related secrets //the Obfuscated UDS, FE, and OBF KEY -always_comb clear_obf_secrets = (doe_cmd_reg.cmd == DOE_CLEAR); +always_comb clear_obf_secrets = (doe_cmd_reg.cmd == DOE_CLEAR) || debugUnlock_or_scan_mode_switch; +always_comb zeroize = clear_obf_secrets; always_comb begin IV_updated = '0; @@ -201,6 +210,13 @@ always_comb begin end end +//TODO: flow_done also? +always_comb begin + for (int dword = 0; dword < IV_NO; dword++) begin + hwif_in.DOE_IV[dword].IV.hwclr = zeroize; + end +end + doe_fsm doe_fsm1 ( @@ -231,7 +247,8 @@ doe_fsm1 .flow_done(flow_done), .flow_in_progress(flow_in_progress), .lock_uds_flow(lock_uds_flow), - .lock_fe_flow(lock_fe_flow) + .lock_fe_flow(lock_fe_flow), + .zeroize(zeroize) ); diff --git a/src/doe/rtl/doe_core_cbc.sv b/src/doe/rtl/doe_core_cbc.sv index 69f473122..213fe2d80 100644 --- a/src/doe/rtl/doe_core_cbc.sv +++ b/src/doe/rtl/doe_core_cbc.sv @@ -47,6 +47,7 @@ module doe_core_cbc( // Clock and reset. input wire clk, input wire reset_n, + input wire zeroize, // Control. input wire encdec, @@ -143,6 +144,7 @@ module doe_core_cbc( doe_encipher_block enc_block( .clk(clk), .reset_n(reset_n), + .zeroize(zeroize), .next_cmd(enc_next), @@ -162,6 +164,7 @@ module doe_core_cbc( doe_decipher_block dec_block( .clk(clk), .reset_n(reset_n), + .zeroize(zeroize), .next_cmd(dec_next), @@ -178,6 +181,7 @@ module doe_core_cbc( doe_key_mem keymem( .clk(clk), .reset_n(reset_n), + .zeroize(zeroize), .key(key), .keylen(keylen), @@ -215,6 +219,15 @@ module doe_core_cbc( IV_dec_state <= st_IV_engine_idle; IV_updated_delayed <= 1'b0; end + else if (zeroize) + begin + IV_encry <= 128'h0; + IV_decry <= 128'h0; + IV_decry_next <= 128'h0; + IV_enc_state <= st_IV_engine_idle; + IV_dec_state <= st_IV_engine_idle; + IV_updated_delayed <= 1'b0; + end else begin @@ -325,6 +338,12 @@ module doe_core_cbc( ready_reg <= 1'b1; doe_core_ctrl_reg <= CTRL_IDLE; end + else if (zeroize) + begin + result_valid_reg <= 1'b0; + ready_reg <= 1'b1; + doe_core_ctrl_reg <= CTRL_IDLE; + end else begin if (result_valid_we) diff --git a/src/doe/rtl/doe_ctrl.sv b/src/doe/rtl/doe_ctrl.sv index bcf05c9fa..03fb1306f 100644 --- a/src/doe/rtl/doe_ctrl.sv +++ b/src/doe/rtl/doe_ctrl.sv @@ -61,7 +61,8 @@ module doe_ctrl // Interrupt output logic error_intr, - output logic notif_intr + output logic notif_intr, + input logic debugUnlock_or_scan_mode_switch ); //---------------------------------------------------------------- @@ -91,7 +92,8 @@ module doe_ctrl .error_intr(error_intr), .notif_intr(notif_intr), .clear_obf_secrets(clear_obf_secrets), - .kv_write(kv_write) + .kv_write(kv_write), + .debugUnlock_or_scan_mode_switch(debugUnlock_or_scan_mode_switch) ); diff --git a/src/doe/rtl/doe_decipher_block.sv b/src/doe/rtl/doe_decipher_block.sv index 236b7a8d6..3fef11af7 100644 --- a/src/doe/rtl/doe_decipher_block.sv +++ b/src/doe/rtl/doe_decipher_block.sv @@ -42,6 +42,7 @@ module doe_decipher_block( //Clock and reset. input wire clk, input wire reset_n, + input wire zeroize, //Control input wire next_cmd, @@ -265,6 +266,17 @@ module doe_decipher_block( ready_reg <= 1'b1; dec_ctrl_reg <= CTRL_IDLE; end + else if (zeroize) + begin + block_w0_reg <= 32'h0; + block_w1_reg <= 32'h0; + block_w2_reg <= 32'h0; + block_w3_reg <= 32'h0; + sword_ctr_reg <= 2'h0; + round_ctr_reg <= 4'h0; + ready_reg <= 1'b1; + dec_ctrl_reg <= CTRL_IDLE; + end else begin if (block_w0_we) diff --git a/src/doe/rtl/doe_defines_pkg.sv b/src/doe/rtl/doe_defines_pkg.sv index 1f9dc1cbf..b5032b3fe 100644 --- a/src/doe/rtl/doe_defines_pkg.sv +++ b/src/doe/rtl/doe_defines_pkg.sv @@ -22,39 +22,6 @@ package doe_defines_pkg; //---------------------------------------------------------------- // Internal constant and parameter definitions. //---------------------------------------------------------------- - localparam DOE_ADDR_NAME0 = 32'h00000000; - localparam DOE_ADDR_NAME1 = 32'h00000004; - localparam DOE_ADDR_VERSION0 = 32'h00000008; - localparam DOE_ADDR_VERSION1 = 32'h0000000c; - - localparam DOE_ADDR_CTRL = 32'h00000010; - localparam DOE_CTRL_INIT_BIT = 0; - localparam DOE_CTRL_NEXT_BIT = 1; - - localparam DOE_ADDR_STATUS = 32'h00000018; - localparam DOE_STATUS_READY_BIT = 0; - localparam DOE_STATUS_VALID_BIT = 1; - - localparam DOE_ADDR_CONFIG = 32'h00000020; - localparam DOE_CTRL_ENCDEC_BIT = 0; - localparam DOE_CTRL_KEYLEN_BIT = 1; - - localparam DOE_ADDR_KEY_START = 32'h00000040; - localparam DOE_ADDR_KEY_END = 32'h0000005c; - - localparam DOE_ADDR_BLOCK_START = 32'h00000080; - localparam DOE_ADDR_BLOCK_END = 32'h0000008c; - - localparam DOE_ADDR_RESULT_START= 32'h00000100; - localparam DOE_ADDR_RESULT_END = 32'h0000010c; - - localparam DOE_ADDR_IV_START = 32'h00000110; - localparam DOE_ADDR_IV_END = 32'h0000011c; - - localparam DOE_ADDR_KV_CTRL = 32'h00000200; - - localparam DOE_ADDR_INTR_START = 32'h00000800; // span = 0x400; 0x800 base offset matches mailbox for fw ease - localparam DOE_ADDR_INTR_END = 32'h00000BFC; localparam DOE_CORE_NAME = 64'h20202020_73206165; // "doe " localparam DOE_CORE_VERSION = 64'h00000000_3630302e; // "0.60" diff --git a/src/doe/rtl/doe_encipher_block.sv b/src/doe/rtl/doe_encipher_block.sv index 2249d4419..faf9347b4 100644 --- a/src/doe/rtl/doe_encipher_block.sv +++ b/src/doe/rtl/doe_encipher_block.sv @@ -41,6 +41,7 @@ module doe_encipher_block( input wire clk, input wire reset_n, + input wire zeroize, input wire next_cmd, @@ -224,6 +225,17 @@ module doe_encipher_block( ready_reg <= 1'b1; enc_ctrl_reg <= CTRL_IDLE; end + else if (zeroize) + begin + block_w0_reg <= 32'h0; + block_w1_reg <= 32'h0; + block_w2_reg <= 32'h0; + block_w3_reg <= 32'h0; + sword_ctr_reg <= 2'h0; + round_ctr_reg <= 4'h0; + ready_reg <= 1'b1; + enc_ctrl_reg <= CTRL_IDLE; + end else begin if (block_w0_we) diff --git a/src/doe/rtl/doe_fsm.sv b/src/doe/rtl/doe_fsm.sv index 32717e4ab..f6f1a934f 100644 --- a/src/doe/rtl/doe_fsm.sv +++ b/src/doe/rtl/doe_fsm.sv @@ -57,7 +57,8 @@ module doe_fsm output logic flow_done, output logic flow_in_progress, output logic lock_uds_flow, - output logic lock_fe_flow + output logic lock_fe_flow, + input logic zeroize ); localparam UDS_BLOCK_OFFSET_W = $clog2(UDS_NUM_BLOCKS); localparam FE_BLOCK_OFFSET_W = $clog2(FE_NUM_BLOCKS); @@ -87,7 +88,7 @@ logic dest_write_done; logic [BLOCK_OFFSET_W-1:0] block_offset, block_offset_nxt; logic block_offset_en; logic block_done; - +logic zeroize_reg; kv_doe_fsm_state_e kv_doe_fsm_ps, kv_doe_fsm_ns; logic arc_DOE_IDLE_DOE_INIT; @@ -96,6 +97,22 @@ logic arc_DOE_WAIT_DOE_WRITE; logic arc_DOE_WRITE_DOE_BLOCK; logic arc_DOE_WRITE_DOE_DONE; +//zeroize input is a single pulse. However, when we detect zeroize, we'd like the fsm +//to remain in IDLE until next DOE_CMD is issued. To avoid other arcs moving the fsm +//to other states, extending zeroize to a level so we can keep the fsm in IDLE. When the +//next command is issued, this extended signal is reset and fsm advances. +always_ff @(posedge clk or negedge rst_b) begin + if (~rst_b) begin + zeroize_reg <= 0; + end + else if (zeroize) begin + zeroize_reg <= 1; + end + else if (running_uds || running_fe) begin + zeroize_reg <= 0; + end +end + always_comb running_uds = (doe_cmd_reg.cmd == DOE_UDS); always_comb running_fe = (doe_cmd_reg.cmd == DOE_FE); always_comb block_done = running_uds ? (block_offset == (UDS_NUM_BLOCKS-1)) : @@ -157,6 +174,7 @@ always_comb begin : kv_doe_fsm //increment dest offset each clock, clear when done dest_write_offset_en = '1; dest_write_offset_nxt = (dest_write_offset == 'hb) ? 'h0 : dest_write_offset + 'd1; + //go back to idle if dest done, and done with blocks if (arc_DOE_WRITE_DOE_DONE) kv_doe_fsm_ns = DOE_DONE; //go back to block stage for next block if not done with blocks @@ -215,6 +233,12 @@ always_ff @(posedge clk or negedge rst_b) begin block_offset <= '0; dest_addr <= '0; end + else if (zeroize_reg) begin + kv_doe_fsm_ps <= DOE_IDLE; + dest_write_offset <= '0; + block_offset <= '0; + dest_addr <= '0; + end else begin kv_doe_fsm_ps <= kv_doe_fsm_ns; dest_write_offset <= dest_write_offset_en ? dest_write_offset_nxt : dest_write_offset; diff --git a/src/doe/rtl/doe_key_mem.sv b/src/doe/rtl/doe_key_mem.sv index 5c4b6d007..7b2100e06 100644 --- a/src/doe/rtl/doe_key_mem.sv +++ b/src/doe/rtl/doe_key_mem.sv @@ -39,6 +39,7 @@ module doe_key_mem( input wire clk, input wire reset_n, + input wire zeroize, input wire [255 : 0] key, input wire keylen, @@ -144,6 +145,18 @@ module doe_key_mem( prev_key1_reg <= 128'h0; key_mem_ctrl_reg <= CTRL_IDLE; end + else if (zeroize) + begin + for (ii = 0 ; ii <= DOE_256_NUM_ROUNDS ; ii = ii + 1) + key_mem [ii] <= 128'h0; + + ready_reg <= 1'b0; + rcon_reg <= 8'h0; + round_ctr_reg <= 4'h0; + prev_key0_reg <= 128'h0; + prev_key1_reg <= 128'h0; + key_mem_ctrl_reg <= CTRL_IDLE; + end else begin if (ready_we) diff --git a/src/doe/rtl/doe_reg.rdl b/src/doe/rtl/doe_reg.rdl index 8c2012b30..b969aaa0f 100644 --- a/src/doe/rtl/doe_reg.rdl +++ b/src/doe/rtl/doe_reg.rdl @@ -50,7 +50,7 @@ addrmap doe_reg { default sw = rw; default hw = r; default resetsignal = reset_b; - field {desc = "IV input field"; swmod;} IV[32] = 32'b0; + field {desc = "IV input field"; swmod; hwclr;} IV[32] = 32'b0; } DOE_IV[4]; diff --git a/src/doe/rtl/doe_reg.sv b/src/doe/rtl/doe_reg.sv index 9d333e5f5..2f567cc7f 100644 --- a/src/doe/rtl/doe_reg.sv +++ b/src/doe/rtl/doe_reg.sv @@ -508,6 +508,9 @@ module doe_reg ( if(decoded_reg_strb.DOE_IV[i0] && decoded_req_is_wr) begin // SW write next_c = (field_storage.DOE_IV[i0].IV.value & ~decoded_wr_biten[31:0]) | (decoded_wr_data[31:0] & decoded_wr_biten[31:0]); load_next_c = '1; + end else if(hwif_in.DOE_IV[i0].IV.hwclr) begin // HW Clear + next_c = '0; + load_next_c = '1; end field_combo.DOE_IV[i0].IV.next = next_c; field_combo.DOE_IV[i0].IV.load_next = load_next_c; diff --git a/src/doe/rtl/doe_reg_pkg.sv b/src/doe/rtl/doe_reg_pkg.sv index 6571ce468..e8d318c07 100644 --- a/src/doe/rtl/doe_reg_pkg.sv +++ b/src/doe/rtl/doe_reg_pkg.sv @@ -2,6 +2,14 @@ // https://github.com/SystemRDL/PeakRDL-regblock package doe_reg_pkg; + typedef struct packed{ + logic hwclr; + } doe_reg__DOE_IV__IV__in_t; + + typedef struct packed{ + doe_reg__DOE_IV__IV__in_t IV; + } doe_reg__DOE_IV__in_t; + typedef struct packed{ logic hwclr; } doe_reg__DOE_CTRL__CMD__in_t; @@ -79,6 +87,7 @@ package doe_reg_pkg; typedef struct packed{ logic reset_b; logic cptra_pwrgood; + doe_reg__DOE_IV__in_t [4-1:0]DOE_IV; doe_reg__DOE_CTRL__in_t DOE_CTRL; doe_reg__DOE_STATUS__in_t DOE_STATUS; doe_reg__intr_block_t__in_t intr_block_rf; diff --git a/src/doe/rtl/doe_reg_uvm.sv b/src/doe/rtl/doe_reg_uvm.sv index 02a5da800..c6613d480 100644 --- a/src/doe/rtl/doe_reg_uvm.sv +++ b/src/doe/rtl/doe_reg_uvm.sv @@ -3,40 +3,84 @@ package doe_reg_uvm; `include "uvm_macros.svh" import uvm_pkg::*; - + `include "doe_reg_covergroups.svh" // Reg - doe_reg::DOE_IV class doe_reg__DOE_IV extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + doe_reg__DOE_IV_bit_cg IV_bit_cg[32]; + doe_reg__DOE_IV_fld_cg fld_cg; rand uvm_reg_field IV; function new(string name = "doe_reg__DOE_IV"); - super.new(name, 32, UVM_NO_COVERAGE); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); virtual function void build(); this.IV = new("IV"); - this.IV.configure(this, 32, 0, "RW", 0, 'h0, 1, 1, 0); + this.IV.configure(this, 32, 0, "RW", 1, 'h0, 1, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(IV_bit_cg[bt]) IV_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); endfunction : build endclass : doe_reg__DOE_IV // Reg - doe_reg::DOE_CTRL class doe_reg__DOE_CTRL extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + doe_reg__DOE_CTRL_bit_cg CMD_bit_cg[2]; + doe_reg__DOE_CTRL_bit_cg DEST_bit_cg[5]; + doe_reg__DOE_CTRL_fld_cg fld_cg; rand uvm_reg_field CMD; rand uvm_reg_field DEST; function new(string name = "doe_reg__DOE_CTRL"); - super.new(name, 32, UVM_NO_COVERAGE); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); virtual function void build(); this.CMD = new("CMD"); this.CMD.configure(this, 2, 0, "RW", 1, 'h0, 1, 1, 0); this.DEST = new("DEST"); this.DEST.configure(this, 5, 2, "RW", 0, 'h0, 1, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(CMD_bit_cg[bt]) CMD_bit_cg[bt] = new(); + foreach(DEST_bit_cg[bt]) DEST_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); endfunction : build endclass : doe_reg__DOE_CTRL // Reg - doe_reg::DOE_STATUS class doe_reg__DOE_STATUS extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + doe_reg__DOE_STATUS_bit_cg READY_bit_cg[1]; + doe_reg__DOE_STATUS_bit_cg VALID_bit_cg[1]; + doe_reg__DOE_STATUS_bit_cg UDS_FLOW_DONE_bit_cg[1]; + doe_reg__DOE_STATUS_bit_cg FE_FLOW_DONE_bit_cg[1]; + doe_reg__DOE_STATUS_bit_cg DEOBF_SECRETS_CLEARED_bit_cg[1]; + doe_reg__DOE_STATUS_fld_cg fld_cg; rand uvm_reg_field READY; rand uvm_reg_field VALID; rand uvm_reg_field UDS_FLOW_DONE; @@ -44,8 +88,13 @@ package doe_reg_uvm; rand uvm_reg_field DEOBF_SECRETS_CLEARED; function new(string name = "doe_reg__DOE_STATUS"); - super.new(name, 32, UVM_NO_COVERAGE); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); virtual function void build(); this.READY = new("READY"); @@ -58,36 +107,77 @@ package doe_reg_uvm; this.FE_FLOW_DONE.configure(this, 1, 3, "RO", 1, 'h0, 1, 1, 0); this.DEOBF_SECRETS_CLEARED = new("DEOBF_SECRETS_CLEARED"); this.DEOBF_SECRETS_CLEARED.configure(this, 1, 4, "RO", 1, 'h0, 1, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(READY_bit_cg[bt]) READY_bit_cg[bt] = new(); + foreach(VALID_bit_cg[bt]) VALID_bit_cg[bt] = new(); + foreach(UDS_FLOW_DONE_bit_cg[bt]) UDS_FLOW_DONE_bit_cg[bt] = new(); + foreach(FE_FLOW_DONE_bit_cg[bt]) FE_FLOW_DONE_bit_cg[bt] = new(); + foreach(DEOBF_SECRETS_CLEARED_bit_cg[bt]) DEOBF_SECRETS_CLEARED_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); endfunction : build endclass : doe_reg__DOE_STATUS // Reg - doe_reg::global_intr_en_t class doe_reg__global_intr_en_t extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + doe_reg__global_intr_en_t_bit_cg error_en_bit_cg[1]; + doe_reg__global_intr_en_t_bit_cg notif_en_bit_cg[1]; + doe_reg__global_intr_en_t_fld_cg fld_cg; rand uvm_reg_field error_en; rand uvm_reg_field notif_en; function new(string name = "doe_reg__global_intr_en_t"); - super.new(name, 32, UVM_NO_COVERAGE); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); virtual function void build(); this.error_en = new("error_en"); this.error_en.configure(this, 1, 0, "RW", 0, 'h0, 1, 1, 0); this.notif_en = new("notif_en"); this.notif_en.configure(this, 1, 1, "RW", 0, 'h0, 1, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(error_en_bit_cg[bt]) error_en_bit_cg[bt] = new(); + foreach(notif_en_bit_cg[bt]) notif_en_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); endfunction : build endclass : doe_reg__global_intr_en_t // Reg - doe_reg::error_intr_en_t class doe_reg__error_intr_en_t extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + doe_reg__error_intr_en_t_bit_cg error0_en_bit_cg[1]; + doe_reg__error_intr_en_t_bit_cg error1_en_bit_cg[1]; + doe_reg__error_intr_en_t_bit_cg error2_en_bit_cg[1]; + doe_reg__error_intr_en_t_bit_cg error3_en_bit_cg[1]; + doe_reg__error_intr_en_t_fld_cg fld_cg; rand uvm_reg_field error0_en; rand uvm_reg_field error1_en; rand uvm_reg_field error2_en; rand uvm_reg_field error3_en; function new(string name = "doe_reg__error_intr_en_t"); - super.new(name, 32, UVM_NO_COVERAGE); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); virtual function void build(); this.error0_en = new("error0_en"); @@ -98,61 +188,131 @@ package doe_reg_uvm; this.error2_en.configure(this, 1, 2, "RW", 0, 'h0, 1, 1, 0); this.error3_en = new("error3_en"); this.error3_en.configure(this, 1, 3, "RW", 0, 'h0, 1, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(error0_en_bit_cg[bt]) error0_en_bit_cg[bt] = new(); + foreach(error1_en_bit_cg[bt]) error1_en_bit_cg[bt] = new(); + foreach(error2_en_bit_cg[bt]) error2_en_bit_cg[bt] = new(); + foreach(error3_en_bit_cg[bt]) error3_en_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); endfunction : build endclass : doe_reg__error_intr_en_t // Reg - doe_reg::notif_intr_en_t class doe_reg__notif_intr_en_t extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + doe_reg__notif_intr_en_t_bit_cg notif_cmd_done_en_bit_cg[1]; + doe_reg__notif_intr_en_t_fld_cg fld_cg; rand uvm_reg_field notif_cmd_done_en; function new(string name = "doe_reg__notif_intr_en_t"); - super.new(name, 32, UVM_NO_COVERAGE); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); virtual function void build(); this.notif_cmd_done_en = new("notif_cmd_done_en"); this.notif_cmd_done_en.configure(this, 1, 0, "RW", 0, 'h0, 1, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(notif_cmd_done_en_bit_cg[bt]) notif_cmd_done_en_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); endfunction : build endclass : doe_reg__notif_intr_en_t // Reg - doe_reg::global_intr_t_agg_sts_dd3dcf0a class doe_reg__global_intr_t_agg_sts_dd3dcf0a extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + doe_reg__global_intr_t_agg_sts_dd3dcf0a_bit_cg agg_sts_bit_cg[1]; + doe_reg__global_intr_t_agg_sts_dd3dcf0a_fld_cg fld_cg; rand uvm_reg_field agg_sts; function new(string name = "doe_reg__global_intr_t_agg_sts_dd3dcf0a"); - super.new(name, 32, UVM_NO_COVERAGE); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); virtual function void build(); this.agg_sts = new("agg_sts"); this.agg_sts.configure(this, 1, 0, "RO", 1, 'h0, 1, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(agg_sts_bit_cg[bt]) agg_sts_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); endfunction : build endclass : doe_reg__global_intr_t_agg_sts_dd3dcf0a // Reg - doe_reg::global_intr_t_agg_sts_e6399b4a class doe_reg__global_intr_t_agg_sts_e6399b4a extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + doe_reg__global_intr_t_agg_sts_e6399b4a_bit_cg agg_sts_bit_cg[1]; + doe_reg__global_intr_t_agg_sts_e6399b4a_fld_cg fld_cg; rand uvm_reg_field agg_sts; function new(string name = "doe_reg__global_intr_t_agg_sts_e6399b4a"); - super.new(name, 32, UVM_NO_COVERAGE); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); virtual function void build(); this.agg_sts = new("agg_sts"); this.agg_sts.configure(this, 1, 0, "RO", 1, 'h0, 1, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(agg_sts_bit_cg[bt]) agg_sts_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); endfunction : build endclass : doe_reg__global_intr_t_agg_sts_e6399b4a // Reg - doe_reg::error_intr_t_error0_sts_5ee134bf_error1_sts_aad9583f_error2_sts_6cad4575_error3_sts_735bbeba class doe_reg__error_intr_t_error0_sts_5ee134bf_error1_sts_aad9583f_error2_sts_6cad4575_error3_sts_735bbeba extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + doe_reg__error_intr_t_error0_sts_5ee134bf_error1_sts_aad9583f_error2_sts_6cad4575_error3_sts_735bbeba_bit_cg error0_sts_bit_cg[1]; + doe_reg__error_intr_t_error0_sts_5ee134bf_error1_sts_aad9583f_error2_sts_6cad4575_error3_sts_735bbeba_bit_cg error1_sts_bit_cg[1]; + doe_reg__error_intr_t_error0_sts_5ee134bf_error1_sts_aad9583f_error2_sts_6cad4575_error3_sts_735bbeba_bit_cg error2_sts_bit_cg[1]; + doe_reg__error_intr_t_error0_sts_5ee134bf_error1_sts_aad9583f_error2_sts_6cad4575_error3_sts_735bbeba_bit_cg error3_sts_bit_cg[1]; + doe_reg__error_intr_t_error0_sts_5ee134bf_error1_sts_aad9583f_error2_sts_6cad4575_error3_sts_735bbeba_fld_cg fld_cg; rand uvm_reg_field error0_sts; rand uvm_reg_field error1_sts; rand uvm_reg_field error2_sts; rand uvm_reg_field error3_sts; function new(string name = "doe_reg__error_intr_t_error0_sts_5ee134bf_error1_sts_aad9583f_error2_sts_6cad4575_error3_sts_735bbeba"); - super.new(name, 32, UVM_NO_COVERAGE); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); virtual function void build(); this.error0_sts = new("error0_sts"); @@ -163,33 +323,71 @@ package doe_reg_uvm; this.error2_sts.configure(this, 1, 2, "W1C", 1, 'h0, 1, 1, 0); this.error3_sts = new("error3_sts"); this.error3_sts.configure(this, 1, 3, "W1C", 1, 'h0, 1, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(error0_sts_bit_cg[bt]) error0_sts_bit_cg[bt] = new(); + foreach(error1_sts_bit_cg[bt]) error1_sts_bit_cg[bt] = new(); + foreach(error2_sts_bit_cg[bt]) error2_sts_bit_cg[bt] = new(); + foreach(error3_sts_bit_cg[bt]) error3_sts_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); endfunction : build endclass : doe_reg__error_intr_t_error0_sts_5ee134bf_error1_sts_aad9583f_error2_sts_6cad4575_error3_sts_735bbeba // Reg - doe_reg::notif_intr_t_notif_cmd_done_sts_1c68637e class doe_reg__notif_intr_t_notif_cmd_done_sts_1c68637e extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + doe_reg__notif_intr_t_notif_cmd_done_sts_1c68637e_bit_cg notif_cmd_done_sts_bit_cg[1]; + doe_reg__notif_intr_t_notif_cmd_done_sts_1c68637e_fld_cg fld_cg; rand uvm_reg_field notif_cmd_done_sts; function new(string name = "doe_reg__notif_intr_t_notif_cmd_done_sts_1c68637e"); - super.new(name, 32, UVM_NO_COVERAGE); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); virtual function void build(); this.notif_cmd_done_sts = new("notif_cmd_done_sts"); this.notif_cmd_done_sts.configure(this, 1, 0, "W1C", 1, 'h0, 1, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(notif_cmd_done_sts_bit_cg[bt]) notif_cmd_done_sts_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); endfunction : build endclass : doe_reg__notif_intr_t_notif_cmd_done_sts_1c68637e // Reg - doe_reg::error_intr_trig_t class doe_reg__error_intr_trig_t extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + doe_reg__error_intr_trig_t_bit_cg error0_trig_bit_cg[1]; + doe_reg__error_intr_trig_t_bit_cg error1_trig_bit_cg[1]; + doe_reg__error_intr_trig_t_bit_cg error2_trig_bit_cg[1]; + doe_reg__error_intr_trig_t_bit_cg error3_trig_bit_cg[1]; + doe_reg__error_intr_trig_t_fld_cg fld_cg; rand uvm_reg_field error0_trig; rand uvm_reg_field error1_trig; rand uvm_reg_field error2_trig; rand uvm_reg_field error3_trig; function new(string name = "doe_reg__error_intr_trig_t"); - super.new(name, 32, UVM_NO_COVERAGE); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); virtual function void build(); this.error0_trig = new("error0_trig"); @@ -200,160 +398,344 @@ package doe_reg_uvm; this.error2_trig.configure(this, 1, 2, "W1S", 0, 'h0, 1, 1, 0); this.error3_trig = new("error3_trig"); this.error3_trig.configure(this, 1, 3, "W1S", 0, 'h0, 1, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(error0_trig_bit_cg[bt]) error0_trig_bit_cg[bt] = new(); + foreach(error1_trig_bit_cg[bt]) error1_trig_bit_cg[bt] = new(); + foreach(error2_trig_bit_cg[bt]) error2_trig_bit_cg[bt] = new(); + foreach(error3_trig_bit_cg[bt]) error3_trig_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); endfunction : build endclass : doe_reg__error_intr_trig_t // Reg - doe_reg::notif_intr_trig_t class doe_reg__notif_intr_trig_t extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + doe_reg__notif_intr_trig_t_bit_cg notif_cmd_done_trig_bit_cg[1]; + doe_reg__notif_intr_trig_t_fld_cg fld_cg; rand uvm_reg_field notif_cmd_done_trig; function new(string name = "doe_reg__notif_intr_trig_t"); - super.new(name, 32, UVM_NO_COVERAGE); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); virtual function void build(); this.notif_cmd_done_trig = new("notif_cmd_done_trig"); this.notif_cmd_done_trig.configure(this, 1, 0, "W1S", 0, 'h0, 1, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(notif_cmd_done_trig_bit_cg[bt]) notif_cmd_done_trig_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); endfunction : build endclass : doe_reg__notif_intr_trig_t // Reg - doe_reg::intr_count_t_cnt_130ab269 class doe_reg__intr_count_t_cnt_130ab269 extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + doe_reg__intr_count_t_cnt_130ab269_bit_cg cnt_bit_cg[32]; + doe_reg__intr_count_t_cnt_130ab269_fld_cg fld_cg; rand uvm_reg_field cnt; function new(string name = "doe_reg__intr_count_t_cnt_130ab269"); - super.new(name, 32, UVM_NO_COVERAGE); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); virtual function void build(); this.cnt = new("cnt"); this.cnt.configure(this, 32, 0, "RW", 1, 'h0, 1, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(cnt_bit_cg[bt]) cnt_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); endfunction : build endclass : doe_reg__intr_count_t_cnt_130ab269 // Reg - doe_reg::intr_count_t_cnt_324dfc53 class doe_reg__intr_count_t_cnt_324dfc53 extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + doe_reg__intr_count_t_cnt_324dfc53_bit_cg cnt_bit_cg[32]; + doe_reg__intr_count_t_cnt_324dfc53_fld_cg fld_cg; rand uvm_reg_field cnt; function new(string name = "doe_reg__intr_count_t_cnt_324dfc53"); - super.new(name, 32, UVM_NO_COVERAGE); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); virtual function void build(); this.cnt = new("cnt"); this.cnt.configure(this, 32, 0, "RW", 1, 'h0, 1, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(cnt_bit_cg[bt]) cnt_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); endfunction : build endclass : doe_reg__intr_count_t_cnt_324dfc53 // Reg - doe_reg::intr_count_t_cnt_791a4799 class doe_reg__intr_count_t_cnt_791a4799 extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + doe_reg__intr_count_t_cnt_791a4799_bit_cg cnt_bit_cg[32]; + doe_reg__intr_count_t_cnt_791a4799_fld_cg fld_cg; rand uvm_reg_field cnt; function new(string name = "doe_reg__intr_count_t_cnt_791a4799"); - super.new(name, 32, UVM_NO_COVERAGE); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); virtual function void build(); this.cnt = new("cnt"); this.cnt.configure(this, 32, 0, "RW", 1, 'h0, 1, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(cnt_bit_cg[bt]) cnt_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); endfunction : build endclass : doe_reg__intr_count_t_cnt_791a4799 // Reg - doe_reg::intr_count_t_cnt_e9de7334 class doe_reg__intr_count_t_cnt_e9de7334 extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + doe_reg__intr_count_t_cnt_e9de7334_bit_cg cnt_bit_cg[32]; + doe_reg__intr_count_t_cnt_e9de7334_fld_cg fld_cg; rand uvm_reg_field cnt; function new(string name = "doe_reg__intr_count_t_cnt_e9de7334"); - super.new(name, 32, UVM_NO_COVERAGE); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); virtual function void build(); this.cnt = new("cnt"); this.cnt.configure(this, 32, 0, "RW", 1, 'h0, 1, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(cnt_bit_cg[bt]) cnt_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); endfunction : build endclass : doe_reg__intr_count_t_cnt_e9de7334 // Reg - doe_reg::intr_count_t_cnt_be67d6d5 class doe_reg__intr_count_t_cnt_be67d6d5 extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + doe_reg__intr_count_t_cnt_be67d6d5_bit_cg cnt_bit_cg[32]; + doe_reg__intr_count_t_cnt_be67d6d5_fld_cg fld_cg; rand uvm_reg_field cnt; function new(string name = "doe_reg__intr_count_t_cnt_be67d6d5"); - super.new(name, 32, UVM_NO_COVERAGE); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); virtual function void build(); this.cnt = new("cnt"); this.cnt.configure(this, 32, 0, "RW", 1, 'h0, 1, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(cnt_bit_cg[bt]) cnt_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); endfunction : build endclass : doe_reg__intr_count_t_cnt_be67d6d5 // Reg - doe_reg::intr_count_incr_t_pulse_37026c97 class doe_reg__intr_count_incr_t_pulse_37026c97 extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + doe_reg__intr_count_incr_t_pulse_37026c97_bit_cg pulse_bit_cg[1]; + doe_reg__intr_count_incr_t_pulse_37026c97_fld_cg fld_cg; rand uvm_reg_field pulse; function new(string name = "doe_reg__intr_count_incr_t_pulse_37026c97"); - super.new(name, 32, UVM_NO_COVERAGE); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); virtual function void build(); this.pulse = new("pulse"); this.pulse.configure(this, 1, 0, "RO", 1, 'h0, 1, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(pulse_bit_cg[bt]) pulse_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); endfunction : build endclass : doe_reg__intr_count_incr_t_pulse_37026c97 // Reg - doe_reg::intr_count_incr_t_pulse_d860d977 class doe_reg__intr_count_incr_t_pulse_d860d977 extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + doe_reg__intr_count_incr_t_pulse_d860d977_bit_cg pulse_bit_cg[1]; + doe_reg__intr_count_incr_t_pulse_d860d977_fld_cg fld_cg; rand uvm_reg_field pulse; function new(string name = "doe_reg__intr_count_incr_t_pulse_d860d977"); - super.new(name, 32, UVM_NO_COVERAGE); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); virtual function void build(); this.pulse = new("pulse"); this.pulse.configure(this, 1, 0, "RO", 1, 'h0, 1, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(pulse_bit_cg[bt]) pulse_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); endfunction : build endclass : doe_reg__intr_count_incr_t_pulse_d860d977 // Reg - doe_reg::intr_count_incr_t_pulse_87b45fe7 class doe_reg__intr_count_incr_t_pulse_87b45fe7 extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + doe_reg__intr_count_incr_t_pulse_87b45fe7_bit_cg pulse_bit_cg[1]; + doe_reg__intr_count_incr_t_pulse_87b45fe7_fld_cg fld_cg; rand uvm_reg_field pulse; function new(string name = "doe_reg__intr_count_incr_t_pulse_87b45fe7"); - super.new(name, 32, UVM_NO_COVERAGE); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); virtual function void build(); this.pulse = new("pulse"); this.pulse.configure(this, 1, 0, "RO", 1, 'h0, 1, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(pulse_bit_cg[bt]) pulse_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); endfunction : build endclass : doe_reg__intr_count_incr_t_pulse_87b45fe7 // Reg - doe_reg::intr_count_incr_t_pulse_c1689ee6 class doe_reg__intr_count_incr_t_pulse_c1689ee6 extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + doe_reg__intr_count_incr_t_pulse_c1689ee6_bit_cg pulse_bit_cg[1]; + doe_reg__intr_count_incr_t_pulse_c1689ee6_fld_cg fld_cg; rand uvm_reg_field pulse; function new(string name = "doe_reg__intr_count_incr_t_pulse_c1689ee6"); - super.new(name, 32, UVM_NO_COVERAGE); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); virtual function void build(); this.pulse = new("pulse"); this.pulse.configure(this, 1, 0, "RO", 1, 'h0, 1, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(pulse_bit_cg[bt]) pulse_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); endfunction : build endclass : doe_reg__intr_count_incr_t_pulse_c1689ee6 // Reg - doe_reg::intr_count_incr_t_pulse_6173128e class doe_reg__intr_count_incr_t_pulse_6173128e extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + doe_reg__intr_count_incr_t_pulse_6173128e_bit_cg pulse_bit_cg[1]; + doe_reg__intr_count_incr_t_pulse_6173128e_fld_cg fld_cg; rand uvm_reg_field pulse; function new(string name = "doe_reg__intr_count_incr_t_pulse_6173128e"); - super.new(name, 32, UVM_NO_COVERAGE); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); virtual function void build(); this.pulse = new("pulse"); this.pulse.configure(this, 1, 0, "RO", 1, 'h0, 1, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(pulse_bit_cg[bt]) pulse_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); endfunction : build endclass : doe_reg__intr_count_incr_t_pulse_6173128e @@ -520,4 +902,5 @@ package doe_reg_uvm; endfunction : build endclass : doe_reg + `include "doe_reg_sample.svh" endpackage: doe_reg_uvm diff --git a/src/doe/stimulus/tests/directed/doe_cbc_nist_test.yml b/src/doe/stimulus/tests/directed/doe_cbc_nist_test.yml new file mode 100644 index 000000000..8005b2f5c --- /dev/null +++ b/src/doe/stimulus/tests/directed/doe_cbc_nist_test.yml @@ -0,0 +1,17 @@ +# SPDX-License-Identifier: Apache-2.0 +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +--- +testname: doe_cbc_nist_test +seed: 1 \ No newline at end of file diff --git a/src/doe/stimulus/testsuites/doe_nightly_directed_regression.yml b/src/doe/stimulus/testsuites/doe_nightly_directed_regression.yml new file mode 100644 index 000000000..1af388109 --- /dev/null +++ b/src/doe/stimulus/testsuites/doe_nightly_directed_regression.yml @@ -0,0 +1,8 @@ +document: + schema: 1.0 + +contents: + - tests: + tags: ["L0", "directed", "nightly", "DOE"] + paths: + - ${CALIPTRA_ROOT}/src/doe/stimulus/tests/directed/doe_cbc_nist_test.yml diff --git a/src/doe/tb/doe_core_cbc_tb.sv b/src/doe/tb/doe_core_cbc_tb.sv new file mode 100644 index 000000000..bd5bcfa55 --- /dev/null +++ b/src/doe/tb/doe_core_cbc_tb.sv @@ -0,0 +1,671 @@ +// SPDX-License-Identifier: Apache-2.0 +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +//====================================================================== +// +// doe_core_cbc_tb.sv +// -------- +// DOE testbench for the DOE core CBC. +// +// +//====================================================================== + +module doe_core_cbc_tb(); + +//---------------------------------------------------------------- + // Internal constant and parameter definitions. + //---------------------------------------------------------------- + parameter DEBUG = 0; + + parameter CLK_HALF_PERIOD = 1; + parameter CLK_PERIOD = 2 * CLK_HALF_PERIOD; + + + parameter DOE_128_BIT_KEY = 0; + parameter DOE_256_BIT_KEY = 1; + + parameter DOE_DECIPHER = 1'b0; + parameter DOE_ENCIPHER = 1'b1; + + //---------------------------------------------------------------- + // Register and Wire declarations. + //---------------------------------------------------------------- + reg [63 : 0] cycle_ctr; + reg [63 : 0] error_ctr; + reg [63 : 0] tc_ctr; + reg [63 : 0] temp_ctr; + + reg clk_tb; + reg reset_n_tb; + reg zeroize_tb; + + logic core_encdec_tb; + logic core_init_tb; + logic core_next_tb; + logic core_ready_tb; + logic [255:0] core_key_tb; + logic core_keylen_tb; + logic [127:0] core_IV_tb; + logic IV_updated_tb; + logic [127:0] core_block_tb; + logic [127:0] core_result_tb; + logic core_valid_tb; + + + //---------------------------------------------------------------- + // Device Under Test. + //---------------------------------------------------------------- + doe_core_cbc dut ( + .clk(clk_tb), + .reset_n(reset_n_tb), + .zeroize(zeroize_tb), + + .encdec(core_encdec_tb), + .init_cmd(core_init_tb), + .next_cmd(core_next_tb), + .ready(core_ready_tb), + + .key(core_key_tb), + .keylen(core_keylen_tb), + + .IV(core_IV_tb), + .IV_updated(IV_updated_tb), + + .block_msg(core_block_tb), + .result(core_result_tb), + .result_valid(core_valid_tb) + ); + + + //---------------------------------------------------------------- + // clk_gen + // + // Always running clock generator process. + //---------------------------------------------------------------- + always + begin : clk_gen + #CLK_HALF_PERIOD; + clk_tb = !clk_tb; + end // clk_gen + + + //---------------------------------------------------------------- + // sys_monitor() + // + // An always running process that creates a cycle counter and + // conditionally displays information about the DUT. + //---------------------------------------------------------------- + always + begin : sys_monitor + #(CLK_PERIOD); + cycle_ctr = cycle_ctr + 1; + end + + + //---------------------------------------------------------------- + // reset_dut() + // + // Toggle reset to put the DUT into a well known state. + //---------------------------------------------------------------- + task reset_dut; + begin + $display("*** Toggle reset."); + reset_n_tb = 0; + + #(2 * CLK_PERIOD); + reset_n_tb = 1; + $display(""); + end + endtask // reset_dut + + + //---------------------------------------------------------------- + // display_test_results() + // + // Display the accumulated test results. + //---------------------------------------------------------------- + task display_test_results; + begin + if (error_ctr == 0) + begin + $display("*** All %02d test cases completed successfully", tc_ctr); + $display("* TESTCASE PASSED"); + end + else + begin + $display("*** %02d tests completed - %02d test cases did not complete successfully.", + tc_ctr, error_ctr); + $display("* TESTCASE FAILED"); + end + end + endtask // display_test_results + + //---------------------------------------------------------------- + // init_sim() + // + // Initialize all counters and testbed functionality as well + // as setting the DUT inputs to defined values. + //---------------------------------------------------------------- + task init_sim; + begin + cycle_ctr = 0; + error_ctr = 0; + tc_ctr = 0; + temp_ctr = 0; + + clk_tb = 0; + reset_n_tb = 0; + zeroize_tb = 0; + + core_encdec_tb = 0; + core_init_tb = 0; + core_next_tb = 0; + core_key_tb = 0; + core_keylen_tb = 0; + core_IV_tb = 0; + IV_updated_tb = 0; + core_block_tb = 0; + end + endtask // init_sim + + + //---------------------------------------------------------------- + // wait_ready() + // + // Wait for the ready flag in the dut to be set. + // (Actually we wait for either ready or valid to be set.) + // + // Note: It is the callers responsibility to call the function + // when the dut is actively processing and will in fact at some + // point set the flag. + //---------------------------------------------------------------- + task wait_ready; + begin + #(CLK_PERIOD); + while (core_ready_tb == 0) + begin + #(CLK_PERIOD); + end + end + endtask // wait_ready + + + + //---------------------------------------------------------------- + // init_key() + // + // init the key in the dut by writing the given key and + // key length and then trigger init processing. + //---------------------------------------------------------------- + task init_key(input [255 : 0] key, input key_length); + begin + core_key_tb = key; + core_keylen_tb = key_length; + core_init_tb = 1'b1; + + #CLK_PERIOD; + core_init_tb = 0; + + wait_ready(); + + end + endtask // init_key + + + //---------------------------------------------------------------- + // cbc_mode_single_block_test() + // + // Perform CBC mode encryption or decryption single block test. + //---------------------------------------------------------------- + task cbc_mode_single_block_test(input [7 : 0] tc_number, + input encdec, + input [255 : 0] key, + input key_length, + input [127 : 0] IV, + input [127 : 0] block, + input [127 : 0] expected); + reg [31 : 0] start_time; + reg [31 : 0] end_time; + + begin + $display("*** TC %0d CBC mode test started.", tc_number); + if (encdec==0) + $display("*** DECRYPTION *** "); + else + $display("*** ENCRYPTION *** "); + tc_ctr = tc_ctr + 1; + + start_time = cycle_ctr; + init_key(key, key_length); + + core_IV_tb = IV; + IV_updated_tb = 1'b1; + + #(CLK_PERIOD); + IV_updated_tb = 0; + core_block_tb = block; + core_encdec_tb = encdec; + core_next_tb = 1'b1; + + #(CLK_PERIOD); + core_next_tb = 0; + wait_ready(); + end_time = cycle_ctr - start_time; + $display("*** Single block test processing time = %01d cycles", end_time); + + if (core_result_tb == expected) + begin + $display("*** TC %0d successful.", tc_number); + $display(""); + end + else + begin + $display("*** ERROR: TC %0d NOT successful.", tc_number); + $display("Expected: 0x%032x", expected); + $display("Got: 0x%032x", core_result_tb); + $display(""); + + error_ctr = error_ctr + 1; + end + end + endtask // cbc_mode_single_block_test + + + //---------------------------------------------------------------- + // cbc_mode_double_block_test() + // + // Perform CBC mode encryption or decryption double block test. + //---------------------------------------------------------------- + task cbc_mode_double_block_test(input [7 : 0] tc_number, + input encdec, + input [255 : 0] key, + input key_length, + input [127 : 0] IV, + input [127 : 0] block1, + input [127 : 0] block2, + input [127 : 0] expected1, + input [127 : 0] expected2 + ); + reg [31 : 0] start_time; + reg [31 : 0] end_time; + + begin + $display("*** TC %0d CBC mode DOUBLE BLOCK test started.", tc_number); + tc_ctr = tc_ctr + 1; + + if (encdec==0) + $display("*** DECRYPTION *** "); + else + $display("*** ENCRYPTION *** "); + + start_time = cycle_ctr; + init_key(key, key_length); + + core_IV_tb = IV; + IV_updated_tb = 1'b1; + + #CLK_PERIOD; + IV_updated_tb = 0; + // first block + core_block_tb = block1; + core_encdec_tb = encdec; + core_next_tb = 1'b1; + + #(CLK_PERIOD); + core_next_tb = 0; + wait_ready(); + + if (core_result_tb == expected1) + begin + $display("*** TC %0d first block successful.", tc_number); + $display(""); + end + else + begin + $display("*** ERROR: TC %0d first block NOT successful.", tc_number); + $display("Expected: 0x%032x", expected1); + $display("Got: 0x%032x", core_result_tb); + $display(""); + + error_ctr = error_ctr + 1; + end + + // second block + core_block_tb = block2; + core_next_tb = 1'b1; + + #(CLK_PERIOD); + core_next_tb = 0; + wait_ready(); + + if (core_result_tb == expected2) + begin + $display("*** TC %0d second block successful.", tc_number); + $display(""); + end + else + begin + $display("*** ERROR: TC %0d second block NOT successful.", tc_number); + $display("Expected: 0x%032x", expected2); + $display("Got: 0x%032x", core_result_tb); + $display(""); + + error_ctr = error_ctr + 1; + end + end + endtask // cbc_mode_dual_block_test + + + + + //---------------------------------------------------------------- + // cbc_mode_quadratic_block_test() + // + // Perform CBC mode encryption or decryption quadratic block test. + //---------------------------------------------------------------- + task cbc_mode_quadratic_block_test(input [7 : 0] tc_number, + input encdec, + input [255 : 0] key, + input key_length, + input [127 : 0] IV, + input [127 : 0] block1, + input [127 : 0] block2, + input [127 : 0] block3, + input [127 : 0] block4, + input [127 : 0] expected1, + input [127 : 0] expected2, + input [127 : 0] expected3, + input [127 : 0] expected4 + ); + reg [31 : 0] start_time; + reg [31 : 0] end_time; + + begin + $display("*** TC %0d CBC mode FOUR BLOCK test started.", tc_number); + tc_ctr = tc_ctr + 1; + + + if (encdec==0) + $display("*** DECRYPTION *** "); + else + $display("*** ENCRYPTION *** "); + + start_time = cycle_ctr; + init_key(key, key_length); + + core_IV_tb = IV; + IV_updated_tb = 1'b1; + + #CLK_PERIOD; + IV_updated_tb = 0; + // first block + core_block_tb = block1; + core_encdec_tb = encdec; + core_next_tb = 1'b1; + + #(CLK_PERIOD); + core_next_tb = 0; + wait_ready(); + + if (core_result_tb == expected1) + begin + $display("*** TC %0d first block successful.", tc_number); + $display(""); + end + else + begin + $display("*** ERROR: TC %0d first block NOT successful.", tc_number); + $display("Expected: 0x%032x", expected1); + $display("Got: 0x%032x", core_result_tb); + $display(""); + + error_ctr = error_ctr + 1; + end + + // second block + core_block_tb = block2; + core_next_tb = 1'b1; + + #(CLK_PERIOD); + core_next_tb = 0; + wait_ready(); + + if (core_result_tb == expected2) + begin + $display("*** TC %0d second block successful.", tc_number); + $display(""); + end + else + begin + $display("*** ERROR: TC %0d second block NOT successful.", tc_number); + $display("Expected: 0x%032x", expected2); + $display("Got: 0x%032x", core_result_tb); + $display(""); + + error_ctr = error_ctr + 1; + end + + // third block + core_block_tb = block3; + core_next_tb = 1'b1; + + #(CLK_PERIOD); + core_next_tb = 0; + wait_ready(); + + if (core_result_tb == expected3) + begin + $display("*** TC %0d third block successful.", tc_number); + $display(""); + end + else + begin + $display("*** ERROR: TC %0d third block NOT successful.", tc_number); + $display("Expected: 0x%032x", expected3); + $display("Got: 0x%032x", core_result_tb); + $display(""); + + error_ctr = error_ctr + 1; + end + + // final block + core_block_tb = block4; + core_next_tb = 1'b1; + + #(CLK_PERIOD); + core_next_tb = 0; + wait_ready(); + + if (core_result_tb == expected4) + begin + $display("*** TC %0d fourth block successful.", tc_number); + $display(""); + end + else + begin + $display("*** ERROR: TC %0d fourth block NOT successful.", tc_number); + $display("Expected: 0x%032x", expected4); + $display("Got: 0x%032x", core_result_tb); + $display(""); + + error_ctr = error_ctr + 1; + end + + end_time = cycle_ctr - start_time; + + end + endtask // cbc_mode_quat_block_test + + + //---------------------------------------------------------------- + // doe_cbc_test() + // + // + // Main test task will perform complete test of DOE. + // Test vectors copied from the follwing documents. + // + // https://datatracker.ietf.org/doc/html/rfc3602 + // + // + //---------------------------------------------------------------- + task doe_cbc_test; + reg [255 : 0] nist_doe_key ; + + + reg [127 : 0] nist_IV0; + + reg [127 : 0] nist_plaintext0; + + reg [127 : 0] nist_plaintext1; + + reg [127 : 0] nist_plaintext2; + + reg [127 : 0] nist_plaintext3; + + reg [127 : 0] nist_cbc_128_enc_expected0; + + reg [127 : 0] nist_cbc_128_enc_expected1; + + reg [127 : 0] nist_cbc_128_enc_expected2; + + reg [127 : 0] nist_cbc_128_enc_expected3; + + reg [127 : 0] nist_cbc_256_enc_expected0; + + reg [127 : 0] nist_cbc_256_enc_expected1; + + reg [127 : 0] nist_cbc_256_enc_expected2; + + reg [127 : 0] nist_cbc_256_enc_expected3; + + begin + nist_doe_key = 256'hc286696d887c9aa0611bbb3e2025a45a00000000000000000000000000000000; + nist_IV0 = 128'h562e17996d093d28ddb3ba695a2e6f58; + nist_plaintext0 = 128'h000102030405060708090a0b0c0d0e0f; + nist_cbc_128_enc_expected0 = 128'hd296cd94c2cccf8a3a863028b5e1dc0a; + + $display("CBC 128 bit key single block tests"); + $display("---------------------"); + cbc_mode_single_block_test(8'h01, DOE_ENCIPHER, nist_doe_key , DOE_128_BIT_KEY, nist_IV0, + nist_plaintext0, nist_cbc_128_enc_expected0); + $display("---------------------"); + cbc_mode_single_block_test(8'h01, DOE_DECIPHER, nist_doe_key , DOE_128_BIT_KEY, nist_IV0, + nist_cbc_128_enc_expected0, nist_plaintext0); + + $display("---------------------"); + + nist_doe_key = 256'h56e47a38c5598974bc46903dba29034900000000000000000000000000000000; + nist_IV0 = 128'h8ce82eefbea0da3c44699ed7db51b7d9; + nist_plaintext0 = 128'ha0a1a2a3a4a5a6a7a8a9aaabacadaeaf; + nist_cbc_128_enc_expected0 = 128'hc30e32ffedc0774e6aff6af0869f71aa; + + cbc_mode_single_block_test(8'h02, DOE_ENCIPHER, nist_doe_key , DOE_128_BIT_KEY, nist_IV0, + nist_plaintext0, nist_cbc_128_enc_expected0); + $display("---------------------"); + cbc_mode_single_block_test(8'h03, DOE_DECIPHER, nist_doe_key , DOE_128_BIT_KEY, nist_IV0, + nist_cbc_128_enc_expected0, nist_plaintext0); + $display("---------------------"); + + nist_doe_key = 256'hc286696d887c9aa0611bbb3e2025a45a00000000000000000000000000000000; + nist_IV0 = 128'h562e17996d093d28ddb3ba695a2e6f58; + nist_plaintext0 = 128'h000102030405060708090a0b0c0d0e0f; + nist_plaintext1 = 128'h101112131415161718191a1b1c1d1e1f; + nist_cbc_128_enc_expected0 = 128'hd296cd94c2cccf8a3a863028b5e1dc0a; + nist_cbc_128_enc_expected1 = 128'h7586602d253cfff91b8266bea6d61ab1; + $display("---------------------"); + cbc_mode_double_block_test(8'h04, DOE_ENCIPHER, nist_doe_key , DOE_128_BIT_KEY, nist_IV0, + nist_plaintext0, + nist_plaintext1, + nist_cbc_128_enc_expected0, + nist_cbc_128_enc_expected1); + + $display("---------------------"); + cbc_mode_double_block_test(8'h05, DOE_DECIPHER, nist_doe_key , DOE_128_BIT_KEY, nist_IV0, + nist_cbc_128_enc_expected0, + nist_cbc_128_enc_expected1, + nist_plaintext0, + nist_plaintext1); + $display("---------------------"); + nist_doe_key = 256'h56e47a38c5598974bc46903dba29034900000000000000000000000000000000; + nist_IV0 = 128'h8ce82eefbea0da3c44699ed7db51b7d9; + nist_plaintext0 = 128'ha0a1a2a3a4a5a6a7a8a9aaabacadaeaf; + nist_plaintext1 = 128'hb0b1b2b3b4b5b6b7b8b9babbbcbdbebf; + nist_plaintext2 = 128'hc0c1c2c3c4c5c6c7c8c9cacbcccdcecf; + nist_plaintext3 = 128'hd0d1d2d3d4d5d6d7d8d9dadbdcdddedf; + nist_cbc_128_enc_expected0 = 128'hc30e32ffedc0774e6aff6af0869f71aa; + nist_cbc_128_enc_expected1 = 128'h0f3af07a9a31a9c684db207eb0ef8e4e; + nist_cbc_128_enc_expected2 = 128'h35907aa632c3ffdf868bb7b29d3d46ad; + nist_cbc_128_enc_expected3 = 128'h83ce9f9a102ee99d49a53e87f4c3da55; + + cbc_mode_quadratic_block_test(8'h06, DOE_ENCIPHER, nist_doe_key , DOE_128_BIT_KEY, nist_IV0, + nist_plaintext0, + nist_plaintext1, + nist_plaintext2, + nist_plaintext3, + nist_cbc_128_enc_expected0, + nist_cbc_128_enc_expected1, + nist_cbc_128_enc_expected2, + nist_cbc_128_enc_expected3); + $display("---------------------"); + cbc_mode_quadratic_block_test(8'h07, DOE_DECIPHER, nist_doe_key , DOE_128_BIT_KEY, nist_IV0, + nist_cbc_128_enc_expected0, + nist_cbc_128_enc_expected1, + nist_cbc_128_enc_expected2, + nist_cbc_128_enc_expected3, + nist_plaintext0, + nist_plaintext1, + nist_plaintext2, + nist_plaintext3); + + $display("---------------------"); + + nist_doe_key = 256'h603deb1015ca71be2b73aef0857d77811f352c073b6108d72d9810a30914dff4; + nist_IV0 = 128'h000102030405060708090A0B0C0D0E0F; + nist_plaintext0 = 128'h6bc1bee22e409f96e93d7e117393172a; + nist_cbc_128_enc_expected0 = 128'hf58c4c04d6e5f1ba779eabfb5f7bfbd6; + + $display("CBC 256 bit key single block tests"); + + cbc_mode_single_block_test(8'h08, DOE_ENCIPHER, nist_doe_key, DOE_256_BIT_KEY, nist_IV0, + nist_plaintext0, nist_cbc_128_enc_expected0); + + $display("---------------------"); + + end + endtask // doe_cbc_test + + //---------------------------------------------------------------- + // main + // + // The main test functionality. + //---------------------------------------------------------------- + initial + begin : main + $display(" -= Testbench for DOE CBC started =-"); + $display(" =============================="); + $display(""); + + init_sim(); + reset_dut(); + + doe_cbc_test(); + + display_test_results(); + + $display(""); + $display("*** DOE simulation done. ***"); + $finish; + end // main + +endmodule // doe_tb diff --git a/src/doe/tb/doe_test_gen.py b/src/doe/tb/doe_test_gen.py new file mode 100644 index 000000000..9040b73fa --- /dev/null +++ b/src/doe/tb/doe_test_gen.py @@ -0,0 +1,139 @@ +#usr/local/bin/python3 +#******************************************************************************** +# SPDX-License-Identifier: Apache-2.0 +# Copyright 2020 Western Digital Corporation or its affiliates. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +#******************************************************************************** +# +# This script generates: +# UDS, key, IV, ciphertext +# FE, key, IV, ciphertext +#******************************************************************************** +import os +import subprocess +import re +import random +import secrets +from pathlib import Path + +def encrypt(plaintext_filename, key_str, iv_str): + #Encrypt UDS (to be used to drive DOE) + command = 'cat '+ plaintext_filename +' | xxd -r -ps | openssl enc -aes-256-cbc -e -out temp -K ' + key_str + ' -iv ' + iv_str + ' -nopad' + subprocess.run(command, shell=True) + command = 'xxd -p -c 1000 temp' + encrypted = subprocess.check_output(command, shell=True) + cipher_str = str(encrypted)[2:-3] #Chomp extra chars and convert to string + return cipher_str + +def decrypt_and_compare(ciphertext_filename, key_str, iv_str, plain_str, flow): + #Decrypt previous (this step is only to make sure openssl command is working) + command = 'cat ' + ciphertext_filename + ' | xxd -r -ps | openssl enc -aes-256-cbc -d -out temp -K ' + key_str + ' -iv ' + iv_str + ' -nopad' + subprocess.run(command, shell=True) + command = 'xxd -p -c 1000 temp' + decrypted = subprocess.check_output(command, shell=True) + decrypted_str = str(decrypted)[2:-3] + + #Compare decrypted and plaintext to make sure they're matching + if decrypted_str != plain_str: + print(decrypted_str+'\n'+plain_str) + print("Plaintext mismatch when decrypting " + flow + "! Check openssl command\n") + +def generate_rand_bytes(num_bytes): #(key_bytes, iv_bytes, plaintext_bytes): + #Generate 256-bit OBF KEY - UDS + #key_str = str(secrets.token_hex(key_bytes)) #OBF KEY - 256 bit + + #Generate 128-bit IV + #iv_str = str(secrets.token_hex(iv_bytes)) #IV - 128 bit + + #Generate 384-bit UDS (plaintext) + #plain_str = str(secrets.token_hex(plaintext_bytes)) #UDS - 384 bit (12 dwords) + #return key_str, iv_str, plain_str + rand_str = str(secrets.token_hex(num_bytes)) + return rand_str + + +def generate_doe_testvector(): + f = open("doe_test_vector.txt", "w") + g = open("doe_test_vectors_all.txt", "a") + + #------------------------------------- + #UDS + #------------------------------------- + p = open("uds", "w") + c = open("ciphertext", "w") + + #key_str, iv_str, plain_str = generate_rand_bytes(32, 16, 48) + key_str = generate_rand_bytes(32) + iv_str = generate_rand_bytes(16) + plain_str = generate_rand_bytes(48) + # key_str = "002ec695b21f27581a745c72e5b9f484865bc95eb10a13d584f57062166838d6" + # iv_str = "a07b6cf2c26e78194b698f30ed0f5bdb" + # plain_str = "754e68e5bdb5df41fca420e77655c76fe8ac8e4bc55727b2132bfdf9419a3b21b0dcc413c6f3f64a9b2d6cc1d861065b" + p.write(plain_str) + p.close() + + #Encrypt plaintext + cipher_str = encrypt("uds", key_str, iv_str) + c.write(cipher_str) + c.close() + + #Decrypt ciphertext and make sure it matches with generated plaintext + decrypt_and_compare("ciphertext", key_str, iv_str, plain_str, "UDS") + + + #Write all values to a file to be used in test + f.write(key_str+'\n'+iv_str+'\n'+plain_str+'\n'+cipher_str+'\n') + g.write("OBF UDS key: "+key_str+'\n'+ "IV: "+iv_str+'\n'+ "UDS plaintext: "+plain_str+'\n'+ "UDS ciphertext: "+cipher_str+'\n') + + #------------------------------------- + #FE + #------------------------------------- + p = open("fe", "w") + c = open("ciphertext", "w") + + plain_str = "" #Clear out plain str + #iv_str, plain_str = generate_rand_bytes(16, 32) #Use same key as UDS + iv_str = generate_rand_bytes(16) + plain_str = generate_rand_bytes(32) + p.write(plain_str) + p.close() + + #Encrypt plaintext + cipher_str = encrypt("fe", key_str, iv_str) + c.write(cipher_str) + c.close() + + #Decrypt ciphertext and make sure it matches with generated plaintext + decrypt_and_compare("ciphertext", key_str, iv_str, plain_str, "FE") + + + #Write all values to a file to be used in test + f.write(key_str+'\n'+iv_str+'\n'+plain_str+'\n'+cipher_str+'\n') + g.write("OBF FE key: "+key_str+'\n'+"IV: "+iv_str+'\n'+"FE plaintext: "+plain_str+'\n'+"FE ciphertext: "+cipher_str+'\n') + + g.write('---------------------------------\n') + f.close() + g.close() + + #Temp file clean up + os.remove("uds") + os.remove("fe") + os.remove("ciphertext") + os.remove("temp") + +def main(): + generate_doe_testvector() + +main() + \ No newline at end of file diff --git a/src/ecc/config/compile.yml b/src/ecc/config/compile.yml index d8fd3ced7..369d1ed2c 100755 --- a/src/ecc/config/compile.yml +++ b/src/ecc/config/compile.yml @@ -50,14 +50,40 @@ requires: - ecc_top - keyvault - caliptra_top_defines + - ecc_coverage targets: tb: directories: - $COMPILE_ROOT/tb files: - $COMPILE_ROOT/tb/ecc_top_tb.sv - tops: [ecc_top_tb] +--- +provides: [ecc_montgomerymultiplier_tb] +schema_version: 2.4.0 +requires: + - ecc_top +targets: + tb: + directories: + - $COMPILE_ROOT/tb + files: + - $COMPILE_ROOT/tb/ecc_montgomerymultiplier_tb.sv + tops: [ecc_montgomerymultiplier_tb] + sim: + pre_exec: 'echo "[PRE-EXEC] Copying Mont multiplication test vector to $PWD" && cp $COMPILE_ROOT/tb/test_vectors/mm_test_vectors*.hex .' +--- +provides: [ecc_coverage] +schema_version: 2.4.0 +requires: + - ecc_top +targets: + tb: + directories: + - $COMPILE_ROOT/coverage + files: + - $COMPILE_ROOT/coverage/ecc_top_cov_if.sv + - $COMPILE_ROOT/coverage/ecc_top_cov_bind.sv global: tool: vcs: diff --git a/src/ecc/config/ecc_montgomerymultiplier_tb.vf b/src/ecc/config/ecc_montgomerymultiplier_tb.vf new file mode 100644 index 000000000..0754d8f22 --- /dev/null +++ b/src/ecc/config/ecc_montgomerymultiplier_tb.vf @@ -0,0 +1,81 @@ ++incdir+${CALIPTRA_ROOT}/src/integration/rtl ++incdir+${CALIPTRA_ROOT}/src/libs/rtl ++incdir+${CALIPTRA_ROOT}/src/keyvault/rtl ++incdir+${CALIPTRA_ROOT}/src/pcrvault/rtl ++incdir+${CALIPTRA_ROOT}/src/ecc/tb ++incdir+${CALIPTRA_ROOT}/src/sha512/rtl ++incdir+${CALIPTRA_ROOT}/src/sha512_masked/rtl ++incdir+${CALIPTRA_ROOT}/src/hmac/rtl ++incdir+${CALIPTRA_ROOT}/src/hmac_drbg/rtl ++incdir+${CALIPTRA_ROOT}/src/ecc/rtl +${CALIPTRA_ROOT}/src/integration/rtl/config_defines.svh +${CALIPTRA_ROOT}/src/integration/rtl/caliptra_reg_defines.svh +${CALIPTRA_ROOT}/src/libs/rtl/caliptra_sva.svh +${CALIPTRA_ROOT}/src/libs/rtl/caliptra_macros.svh +${CALIPTRA_ROOT}/src/libs/rtl/caliptra_sram.sv +${CALIPTRA_ROOT}/src/libs/rtl/ahb_defines_pkg.sv +${CALIPTRA_ROOT}/src/libs/rtl/caliptra_ahb_srom.sv +${CALIPTRA_ROOT}/src/libs/rtl/apb_slv_sif.sv +${CALIPTRA_ROOT}/src/libs/rtl/ahb_slv_sif.sv +${CALIPTRA_ROOT}/src/libs/rtl/caliptra_icg.sv +${CALIPTRA_ROOT}/src/libs/rtl/clk_gate.sv +${CALIPTRA_ROOT}/src/libs/rtl/caliptra_2ff_sync.sv +${CALIPTRA_ROOT}/src/keyvault/rtl/kv_defines_pkg.sv +${CALIPTRA_ROOT}/src/keyvault/rtl/kv_macros.svh +${CALIPTRA_ROOT}/src/pcrvault/rtl/pv_defines_pkg.sv +${CALIPTRA_ROOT}/src/pcrvault/rtl/pv_macros.svh +${CALIPTRA_ROOT}/src/pcrvault/rtl/pv_gen_hash.sv +${CALIPTRA_ROOT}/src/ecc/tb/ecc_montgomerymultiplier_tb.sv +${CALIPTRA_ROOT}/src/libs/rtl/ahb_to_reg_adapter.sv +${CALIPTRA_ROOT}/src/keyvault/rtl/kv_reg_pkg.sv +${CALIPTRA_ROOT}/src/keyvault/rtl/kv_reg.sv +${CALIPTRA_ROOT}/src/keyvault/rtl/kv.sv +${CALIPTRA_ROOT}/src/keyvault/rtl/kv_fsm.sv +${CALIPTRA_ROOT}/src/keyvault/rtl/kv_read_client.sv +${CALIPTRA_ROOT}/src/keyvault/rtl/kv_write_client.sv +${CALIPTRA_ROOT}/src/pcrvault/rtl/pv_reg_pkg.sv +${CALIPTRA_ROOT}/src/pcrvault/rtl/pv_reg.sv +${CALIPTRA_ROOT}/src/pcrvault/rtl/pv.sv +${CALIPTRA_ROOT}/src/sha512/rtl/sha512_reg_pkg.sv +${CALIPTRA_ROOT}/src/sha512/rtl/sha512_params_pkg.sv +${CALIPTRA_ROOT}/src/sha512/rtl/sha512_ctrl.sv +${CALIPTRA_ROOT}/src/sha512/rtl/sha512.sv +${CALIPTRA_ROOT}/src/sha512/rtl/sha512_core.v +${CALIPTRA_ROOT}/src/sha512/rtl/sha512_h_constants.v +${CALIPTRA_ROOT}/src/sha512/rtl/sha512_k_constants.v +${CALIPTRA_ROOT}/src/sha512/rtl/sha512_w_mem.v +${CALIPTRA_ROOT}/src/sha512/rtl/sha512_reg.sv +${CALIPTRA_ROOT}/src/sha512_masked/rtl/sha512_masked_defines_pkg.sv +${CALIPTRA_ROOT}/src/sha512_masked/rtl/sha512_masked_core.sv +${CALIPTRA_ROOT}/src/sha512_masked/rtl/sha512_masked_lfsr.sv +${CALIPTRA_ROOT}/src/hmac/rtl/hmac_param_pkg.sv +${CALIPTRA_ROOT}/src/hmac/rtl/hmac_reg_pkg.sv +${CALIPTRA_ROOT}/src/hmac/rtl/hmac_ctrl.sv +${CALIPTRA_ROOT}/src/hmac/rtl/hmac.sv +${CALIPTRA_ROOT}/src/hmac/rtl/hmac_core.v +${CALIPTRA_ROOT}/src/hmac/rtl/hmac_reg.sv +${CALIPTRA_ROOT}/src/hmac_drbg/rtl/hmac_drbg.sv +${CALIPTRA_ROOT}/src/hmac_drbg/rtl/hmac_drbg_lfsr.sv +${CALIPTRA_ROOT}/src/ecc/rtl/ecc_reg_pkg.sv +${CALIPTRA_ROOT}/src/ecc/rtl/ecc_defines_pkg.sv +${CALIPTRA_ROOT}/src/ecc/rtl/ecc_params_pkg.sv +${CALIPTRA_ROOT}/src/ecc/rtl/ecc_dsa_uop_pkg.sv +${CALIPTRA_ROOT}/src/ecc/rtl/ecc_pm_uop_pkg.sv +${CALIPTRA_ROOT}/src/ecc/rtl/ecc_top.sv +${CALIPTRA_ROOT}/src/ecc/rtl/ecc_reg.sv +${CALIPTRA_ROOT}/src/ecc/rtl/ecc_dsa_ctrl.sv +${CALIPTRA_ROOT}/src/ecc/rtl/ecc_dsa_sequencer.sv +${CALIPTRA_ROOT}/src/ecc/rtl/ecc_scalar_blinding.sv +${CALIPTRA_ROOT}/src/ecc/rtl/ecc_hmac_drbg_interface.sv +${CALIPTRA_ROOT}/src/ecc/rtl/ecc_arith_unit.sv +${CALIPTRA_ROOT}/src/ecc/rtl/ecc_pm_ctrl.sv +${CALIPTRA_ROOT}/src/ecc/rtl/ecc_pm_sequencer.sv +${CALIPTRA_ROOT}/src/ecc/rtl/ecc_ram_tdp_file.sv +${CALIPTRA_ROOT}/src/ecc/rtl/ecc_fau.sv +${CALIPTRA_ROOT}/src/ecc/rtl/ecc_montgomerymultiplier.sv +${CALIPTRA_ROOT}/src/ecc/rtl/ecc_pe_first.sv +${CALIPTRA_ROOT}/src/ecc/rtl/ecc_pe.sv +${CALIPTRA_ROOT}/src/ecc/rtl/ecc_pe_final.sv +${CALIPTRA_ROOT}/src/ecc/rtl/ecc_mult_dsp.sv +${CALIPTRA_ROOT}/src/ecc/rtl/ecc_add_sub_mod_alter.sv +${CALIPTRA_ROOT}/src/ecc/rtl/ecc_adder.sv \ No newline at end of file diff --git a/src/ecc/config/ecc_top.vf b/src/ecc/config/ecc_top.vf index ad7987f01..51e02138b 100644 --- a/src/ecc/config/ecc_top.vf +++ b/src/ecc/config/ecc_top.vf @@ -18,6 +18,7 @@ ${CALIPTRA_ROOT}/src/libs/rtl/apb_slv_sif.sv ${CALIPTRA_ROOT}/src/libs/rtl/ahb_slv_sif.sv ${CALIPTRA_ROOT}/src/libs/rtl/caliptra_icg.sv ${CALIPTRA_ROOT}/src/libs/rtl/clk_gate.sv +${CALIPTRA_ROOT}/src/libs/rtl/caliptra_2ff_sync.sv ${CALIPTRA_ROOT}/src/keyvault/rtl/kv_defines_pkg.sv ${CALIPTRA_ROOT}/src/keyvault/rtl/kv_macros.svh ${CALIPTRA_ROOT}/src/pcrvault/rtl/pv_defines_pkg.sv @@ -34,9 +35,9 @@ ${CALIPTRA_ROOT}/src/pcrvault/rtl/pv_reg_pkg.sv ${CALIPTRA_ROOT}/src/pcrvault/rtl/pv_reg.sv ${CALIPTRA_ROOT}/src/pcrvault/rtl/pv.sv ${CALIPTRA_ROOT}/src/sha512/rtl/sha512_reg_pkg.sv +${CALIPTRA_ROOT}/src/sha512/rtl/sha512_params_pkg.sv ${CALIPTRA_ROOT}/src/sha512/rtl/sha512_ctrl.sv ${CALIPTRA_ROOT}/src/sha512/rtl/sha512.sv -${CALIPTRA_ROOT}/src/sha512/rtl/sha512_param.sv ${CALIPTRA_ROOT}/src/sha512/rtl/sha512_core.v ${CALIPTRA_ROOT}/src/sha512/rtl/sha512_h_constants.v ${CALIPTRA_ROOT}/src/sha512/rtl/sha512_k_constants.v diff --git a/src/ecc/config/ecc_top_tb.vf b/src/ecc/config/ecc_top_tb.vf index ab0098841..ea081512c 100644 --- a/src/ecc/config/ecc_top_tb.vf +++ b/src/ecc/config/ecc_top_tb.vf @@ -2,6 +2,7 @@ +incdir+${CALIPTRA_ROOT}/src/libs/rtl +incdir+${CALIPTRA_ROOT}/src/keyvault/rtl +incdir+${CALIPTRA_ROOT}/src/pcrvault/rtl ++incdir+${CALIPTRA_ROOT}/src/ecc/coverage +incdir+${CALIPTRA_ROOT}/src/ecc/tb +incdir+${CALIPTRA_ROOT}/src/sha512/rtl +incdir+${CALIPTRA_ROOT}/src/sha512_masked/rtl @@ -19,11 +20,14 @@ ${CALIPTRA_ROOT}/src/libs/rtl/apb_slv_sif.sv ${CALIPTRA_ROOT}/src/libs/rtl/ahb_slv_sif.sv ${CALIPTRA_ROOT}/src/libs/rtl/caliptra_icg.sv ${CALIPTRA_ROOT}/src/libs/rtl/clk_gate.sv +${CALIPTRA_ROOT}/src/libs/rtl/caliptra_2ff_sync.sv ${CALIPTRA_ROOT}/src/keyvault/rtl/kv_defines_pkg.sv ${CALIPTRA_ROOT}/src/keyvault/rtl/kv_macros.svh ${CALIPTRA_ROOT}/src/pcrvault/rtl/pv_defines_pkg.sv ${CALIPTRA_ROOT}/src/pcrvault/rtl/pv_macros.svh ${CALIPTRA_ROOT}/src/pcrvault/rtl/pv_gen_hash.sv +${CALIPTRA_ROOT}/src/ecc/coverage/ecc_top_cov_if.sv +${CALIPTRA_ROOT}/src/ecc/coverage/ecc_top_cov_bind.sv ${CALIPTRA_ROOT}/src/ecc/tb/ecc_top_tb.sv ${CALIPTRA_ROOT}/src/libs/rtl/ahb_to_reg_adapter.sv ${CALIPTRA_ROOT}/src/keyvault/rtl/kv_reg_pkg.sv @@ -36,9 +40,9 @@ ${CALIPTRA_ROOT}/src/pcrvault/rtl/pv_reg_pkg.sv ${CALIPTRA_ROOT}/src/pcrvault/rtl/pv_reg.sv ${CALIPTRA_ROOT}/src/pcrvault/rtl/pv.sv ${CALIPTRA_ROOT}/src/sha512/rtl/sha512_reg_pkg.sv +${CALIPTRA_ROOT}/src/sha512/rtl/sha512_params_pkg.sv ${CALIPTRA_ROOT}/src/sha512/rtl/sha512_ctrl.sv ${CALIPTRA_ROOT}/src/sha512/rtl/sha512.sv -${CALIPTRA_ROOT}/src/sha512/rtl/sha512_param.sv ${CALIPTRA_ROOT}/src/sha512/rtl/sha512_core.v ${CALIPTRA_ROOT}/src/sha512/rtl/sha512_h_constants.v ${CALIPTRA_ROOT}/src/sha512/rtl/sha512_k_constants.v diff --git a/src/ecc/coverage/ecc_top_cov_bind.sv b/src/ecc/coverage/ecc_top_cov_bind.sv new file mode 100644 index 000000000..a04dc5097 --- /dev/null +++ b/src/ecc/coverage/ecc_top_cov_bind.sv @@ -0,0 +1,20 @@ +// SPDX-License-Identifier: Apache-2.0 +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + + +module ecc_top_cov_bind; + `ifdef FCOV + bind ecc_top ecc_top_cov_if i_ecc_top_cov_if(.*); + `endif +endmodule diff --git a/src/ecc/coverage/ecc_top_cov_if.sv b/src/ecc/coverage/ecc_top_cov_if.sv new file mode 100644 index 000000000..97f1a8cac --- /dev/null +++ b/src/ecc/coverage/ecc_top_cov_if.sv @@ -0,0 +1,155 @@ +// SPDX-License-Identifier: Apache-2.0 +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +`ifndef VERILATOR + +interface ecc_top_cov_if + ( + input logic clk, + input logic reset_n, + input logic cptra_pwrgood + +); + + logic [1 : 0] ecc_cmd; + logic [1 : 0] ecc_sw_cmd; + logic zeroize; + logic pcr_sign_mode; + logic ready; + logic valid; + + logic dest_keyvault; + + logic error_flag; + logic privkey_input_outofrange; + logic r_output_outofrange; + logic r_input_outofrange; + logic s_input_outofrange; + logic pubkeyx_input_outofrange; + logic pubkeyy_input_outofrange; + logic pubkey_input_invalid; + logic pcr_sign_input_invalid; + logic keygen_process; + logic signing_process; + logic verifying_process; + + + logic mod_p_q; + logic add_en; + logic add_sub_i; + logic [383 : 0] add_res0; + logic add_cout0; + logic add_cout1; + logic add_res_less_than_prime; + logic add_res_greater_than_prime; + logic add_res_greater_than_384_bit; + + logic mult_ready; + logic mult_last_reduction; + logic mult_final_subtraction; + + assign mod_p_q = ecc_top.ecc_dsa_ctrl_i.ecc_arith_unit_i.mod_p_q; + assign add_en = ecc_top.ecc_dsa_ctrl_i.ecc_arith_unit_i.ecc_fau_i.add_en_i; + assign add_sub_i = ecc_top.ecc_dsa_ctrl_i.ecc_arith_unit_i.ecc_fau_i.sub_i; + assign add_res0 = ecc_top.ecc_dsa_ctrl_i.ecc_arith_unit_i.ecc_fau_i.i_ADDER_SUBTRACTOR.r0_reg; + assign add_cout0 = ecc_top.ecc_dsa_ctrl_i.ecc_arith_unit_i.ecc_fau_i.i_ADDER_SUBTRACTOR.carry0_reg; + assign add_cout1 = ecc_top.ecc_dsa_ctrl_i.ecc_arith_unit_i.ecc_fau_i.i_ADDER_SUBTRACTOR.carry1; + assign add_res_less_than_prime = ((add_cout0 == 1'b0) & (add_res0 < ecc_top.ecc_dsa_ctrl_i.ecc_arith_unit_i.ecc_fau_i.prime_i)); + assign add_res_greater_than_prime = ((add_cout0 == 1'b0) & (add_res0 >= ecc_top.ecc_dsa_ctrl_i.ecc_arith_unit_i.ecc_fau_i.prime_i)); + assign add_res_greater_than_384_bit = (add_cout0 == 1'b1); + + assign mult_ready = ecc_top.ecc_dsa_ctrl_i.ecc_arith_unit_i.ecc_fau_i.i_MULTIPLIER.ready_o; + assign mult_last_reduction = ecc_top.ecc_dsa_ctrl_i.ecc_arith_unit_i.ecc_fau_i.i_MULTIPLIER.last_reduction; + assign mult_final_subtraction = mult_ready & mult_last_reduction; + + assign ecc_cmd = ecc_top.ecc_dsa_ctrl_i.cmd_reg; + assign pcr_sign_mode = ecc_top.ecc_dsa_ctrl_i.pcr_sign_mode; + assign zeroize = ecc_top.ecc_dsa_ctrl_i.zeroize_reg; + assign ready = ecc_top.ecc_dsa_ctrl_i.dsa_ready_reg; + assign valid = ecc_top.ecc_dsa_ctrl_i.dsa_valid_reg; + + always_ff @(posedge clk) begin + if (!reset_n) begin + ecc_sw_cmd <= '0; + end + else if (ecc_top.ecc_reg1.decoded_reg_strb.ECC_CTRL && ecc_top.ecc_reg1.decoded_req_is_wr) begin // SW write + ecc_sw_cmd <= (ecc_top.ecc_reg1.field_storage.ECC_CTRL.CTRL.value & ~ecc_top.ecc_reg1.decoded_wr_biten[1:0]) | (ecc_top.ecc_reg1.decoded_wr_data[1:0] & ecc_top.ecc_reg1.decoded_wr_biten[1:0]); + end + end + + assign dest_keyvault = ecc_top.ecc_dsa_ctrl_i.dest_keyvault; + + assign error_flag = ecc_top.ecc_dsa_ctrl_i.error_flag; + assign privkey_input_outofrange = ecc_top.ecc_dsa_ctrl_i.privkey_input_outofrange; + assign r_output_outofrange = ecc_top.ecc_dsa_ctrl_i.r_output_outofrange; + assign r_input_outofrange = ecc_top.ecc_dsa_ctrl_i.r_input_outofrange; + assign s_input_outofrange = ecc_top.ecc_dsa_ctrl_i.s_input_outofrange; + assign pubkeyx_input_outofrange = ecc_top.ecc_dsa_ctrl_i.pubkeyx_input_outofrange; + assign pubkeyy_input_outofrange = ecc_top.ecc_dsa_ctrl_i.pubkeyy_input_outofrange; + assign pubkey_input_invalid = ecc_top.ecc_dsa_ctrl_i.pubkey_input_invalid; + assign pcr_sign_input_invalid = ecc_top.ecc_dsa_ctrl_i.pcr_sign_input_invalid; + assign keygen_process = ecc_top.ecc_dsa_ctrl_i.keygen_process; + assign signing_process = ecc_top.ecc_dsa_ctrl_i.signing_process; + assign verifying_process = ecc_top.ecc_dsa_ctrl_i.verifying_process; + + covergroup ecc_top_cov_grp @(posedge clk); + reset_cp: coverpoint reset_n; + cptra_pwrgood_cp: coverpoint cptra_pwrgood; + + ecc_cmd_cp: coverpoint ecc_cmd; + pcr_sign_cp: coverpoint pcr_sign_mode; + zeroize_cp: coverpoint zeroize; + ready_cp: coverpoint ready; + valid_cp: coverpoint valid; + + dest_keyvault_cp: coverpoint dest_keyvault; + + error_flag_cp: coverpoint error_flag; + privkey_input_outofrange_cp: coverpoint privkey_input_outofrange; + r_output_outofrange_cp: coverpoint r_output_outofrange; + r_input_outofrange_cp: coverpoint r_input_outofrange; + s_input_outofrange_cp: coverpoint s_input_outofrange; + pubkeyx_input_outofrange_cp: coverpoint pubkeyx_input_outofrange; + pubkeyy_input_outofrange_cp: coverpoint pubkeyy_input_outofrange; + pubkey_input_invalid_cp: coverpoint pubkey_input_invalid; + pcr_sign_input_invalid_cp: coverpoint pcr_sign_input_invalid; + + cmd_ready_cp: cross ecc_sw_cmd, ready; + cmd_kv_cp: cross ecc_cmd, dest_keyvault; + pcr_ready_cp: cross ready, pcr_sign_mode; + pcr_cmd_cp: cross pcr_sign_mode, ecc_cmd; + zeroize_pcr_cp: cross zeroize, pcr_sign_mode; + zeroize_cmd_cp: cross zeroize, ecc_cmd; + zeroize_error_cp: cross zeroize, error_flag; + zeroize_ready_cp: cross ready, zeroize; + pcr_sign_input_invalid_cmd_cp: cross error_flag, ecc_cmd; + error_keygen_cp: cross error_flag, keygen_process; + error_signing_cp: cross error_flag, signing_process; + error_verifying_cp: cross error_flag, verifying_process; + + // modular operation + mult_final_subtraction_cp: coverpoint mult_final_subtraction; + add_carry_cp: cross mod_p_q, add_sub_i, add_cout0, add_cout1; + add_result_less_than_prime_cp: cross mod_p_q, add_sub_i, add_res_less_than_prime; + add_result_greater_than_prime_cp: cross mod_p_q, add_sub_i, add_res_greater_than_prime; + add_result_greater_than_384_bit_cp: cross mod_p_q, add_sub_i, add_res_greater_than_384_bit; + + + endgroup + + ecc_top_cov_grp ecc_top_cov_grp1 = new(); + +endinterface + +`endif \ No newline at end of file diff --git a/src/ecc/rtl/ecc_add_sub_mod_alter.sv b/src/ecc/rtl/ecc_add_sub_mod_alter.sv index c335d368c..2bf3eb332 100644 --- a/src/ecc/rtl/ecc_add_sub_mod_alter.sv +++ b/src/ecc/rtl/ecc_add_sub_mod_alter.sv @@ -50,7 +50,8 @@ module ecc_add_sub_mod_alter #( logic [REG_SIZE-1 : 0] r0_reg; logic carry0_reg; - logic carry_garbage_bit; + logic carry1; + logic [1 : 0] push_result_reg; ecc_adder #( .RADIX(REG_SIZE) @@ -71,7 +72,7 @@ module ecc_add_sub_mod_alter #( .b_i(opb1), .cin_i(sub_n), .s_o(r1), - .cout_o(carry_garbage_bit) + .cout_o(carry1) ); @@ -84,22 +85,31 @@ module ecc_add_sub_mod_alter #( if(!reset_n) begin r0_reg <= '0; carry0_reg <= '0; - ready_o <= 1'b0; end else if (zeroize) begin r0_reg <= '0; carry0_reg <= '0; - ready_o <= 1'b0; end else if (add_en_i) begin r0_reg <= r0; carry0_reg <= carry0; - ready_o <= 1'b0; end - else - ready_o <= 1'b1; end - assign res_o = (sub_n ^ carry0_reg)? r0 : r1; + // Determines when results are ready + always_ff @(posedge clk or negedge reset_n) begin + if (!reset_n) + push_result_reg <= 2'b0; + else if (zeroize) + push_result_reg <= 2'b0; + else if (add_en_i) + push_result_reg <= 2'b10; + else // one shift to right + push_result_reg <= (push_result_reg >> 1); + end + + assign ready_o = push_result_reg[0]; + + assign res_o = sub_n ? (carry0_reg ^ carry1)? r1 : r0 : (carry0_reg) ? r0 : r1; endmodule diff --git a/src/ecc/rtl/ecc_dsa_ctrl.sv b/src/ecc/rtl/ecc_dsa_ctrl.sv index 058d6ad0d..48eb05af2 100644 --- a/src/ecc/rtl/ecc_dsa_ctrl.sv +++ b/src/ecc/rtl/ecc_dsa_ctrl.sv @@ -81,7 +81,8 @@ module ecc_dsa_ctrl // Interrupts (from ecc_reg) output logic error_intr, - output logic notif_intr + output logic notif_intr, + input logic debugUnlock_or_scan_mode_switch ); //---------------------------------------------------------------- @@ -116,6 +117,7 @@ module ecc_dsa_ctrl logic hw_scalar_G_we; logic hw_scalar_PK_we; logic hw_verify_r_we; + logic hw_pk_chk_we; logic scalar_G_sel; logic dsa_valid_reg; @@ -140,6 +142,7 @@ module ecc_dsa_ctrl logic [REG_SIZE-1 : 0] lambda_reg; logic [REG_SIZE-1 : 0] masking_rnd; logic [REG_SIZE-1 : 0] masking_rnd_reg; + logic [REG_SIZE-1 : 0] pk_chk_reg; logic [REG_SIZE-1 : 0] scalar_G_reg; logic [REG_SIZE-1 : 0] scalar_PK_reg; @@ -174,7 +177,10 @@ module ecc_dsa_ctrl logic kv_privkey_ready, kv_privkey_done; logic kv_seed_ready, kv_seed_done ; logic kv_write_ready, kv_write_done; - + //KV Read Data Present + logic kv_read_data_present; + logic kv_read_data_present_set, kv_read_data_present_reset; + kv_read_ctrl_reg_t kv_privkey_read_ctrl_reg; kv_read_ctrl_reg_t kv_seed_read_ctrl_reg; kv_write_ctrl_reg_t kv_write_ctrl_reg; @@ -182,6 +188,25 @@ module ecc_dsa_ctrl logic pcr_sign_mode; instr_struct_t prog_instr; + + // ERROR + logic keygen_process; + logic signing_process; + logic verifying_process; + + logic privkey_input_outofrange; + logic r_output_outofrange; + logic r_input_outofrange; + logic s_input_outofrange; + logic pubkeyx_input_outofrange; + logic pubkeyy_input_outofrange; + logic pubkey_input_invalid; + logic pcr_sign_input_invalid; + + logic error_flag; + logic error_flag_reg; + logic error_flag_edge; + //---------------------------------------------------------------- // Module instantiantions. //---------------------------------------------------------------- @@ -283,7 +308,7 @@ module ecc_dsa_ctrl // read the registers written by sw always_comb begin cmd_reg = hwif_out.ECC_CTRL.CTRL.value; - zeroize_reg = hwif_out.ECC_CTRL.ZEROIZE.value; + zeroize_reg = hwif_out.ECC_CTRL.ZEROIZE.value || debugUnlock_or_scan_mode_switch; sca_point_rnd_en = 1'b1; sca_mask_sign_en = 1'b1; @@ -297,18 +322,23 @@ module ecc_dsa_ctrl privkey_we_reg <= '0; privkey_we_reg_ff <= '0; kv_reg <= '0; + kv_read_data_present <= '0; end else if (zeroize_reg) begin privkey_we_reg <= '0; privkey_we_reg_ff <= '0; kv_reg <= '0; + kv_read_data_present <= '0; end //Store private key here before pushing to keyvault else begin privkey_we_reg <= hw_privkey_we; privkey_we_reg_ff <= privkey_we_reg; - if (privkey_out_we & dest_keyvault) + if (privkey_out_we & (dest_keyvault | kv_read_data_present)) kv_reg <= read_reg; + + kv_read_data_present <= kv_read_data_present_set ? '1 : + kv_read_data_present_reset ? '0 : kv_read_data_present; end end @@ -335,23 +365,23 @@ module ecc_dsa_ctrl //Key Vault has priority if enabled to drive these registers //don't store the private key generated in sw accessible register if it's going to keyvault privkey_reg[dword] = hwif_out.ECC_PRIVKEY_IN[11-dword].PRIVKEY_IN.value; - hwif_in.ECC_PRIVKEY_IN[dword].PRIVKEY_IN.we = pcr_sign_mode | (kv_privkey_write_en & (kv_privkey_write_offset == dword)); + hwif_in.ECC_PRIVKEY_IN[dword].PRIVKEY_IN.we = (pcr_sign_mode | (kv_privkey_write_en & (kv_privkey_write_offset == dword))) & !zeroize_reg; hwif_in.ECC_PRIVKEY_IN[dword].PRIVKEY_IN.next = pcr_sign_mode ? pcr_signing_data.pcr_signing_privkey[dword] : kv_privkey_write_en? kv_privkey_write_data : read_reg[11-dword]; hwif_in.ECC_PRIVKEY_IN[dword].PRIVKEY_IN.hwclr = zeroize_reg; end for (int dword=0; dword < 12; dword++)begin //If keyvault is not enabled, grab the sw value as usual - hwif_in.ECC_PRIVKEY_OUT[dword].PRIVKEY_OUT.we = privkey_out_we & ~dest_keyvault; + hwif_in.ECC_PRIVKEY_OUT[dword].PRIVKEY_OUT.we = (privkey_out_we & ~(dest_keyvault | kv_read_data_present)) & !zeroize_reg; hwif_in.ECC_PRIVKEY_OUT[dword].PRIVKEY_OUT.next = read_reg[11-dword]; hwif_in.ECC_PRIVKEY_OUT[dword].PRIVKEY_OUT.hwclr = zeroize_reg; end for (int dword=0; dword < 12; dword++)begin seed_reg[dword] = hwif_out.ECC_SEED[11-dword].SEED.value; - hwif_in.ECC_SEED[dword].SEED.we = kv_seed_write_en & (kv_seed_write_offset == dword); + hwif_in.ECC_SEED[dword].SEED.we = (kv_seed_write_en & (kv_seed_write_offset == dword)) & !zeroize_reg; hwif_in.ECC_SEED[dword].SEED.next = kv_seed_write_data; - hwif_in.ECC_SEED[dword].SEED.hwclr = zeroize_reg; + hwif_in.ECC_SEED[dword].SEED.hwclr = zeroize_reg | kv_read_data_present_reset; end for (int dword=0; dword < 12; dword++)begin @@ -361,41 +391,41 @@ module ecc_dsa_ctrl for (int dword=0; dword < 12; dword++)begin msg_reg[dword] = hwif_out.ECC_MSG[11-dword].MSG.value; - hwif_in.ECC_MSG[dword].MSG.we = pcr_sign_mode; + hwif_in.ECC_MSG[dword].MSG.we = pcr_sign_mode & !zeroize_reg; hwif_in.ECC_MSG[dword].MSG.next = pcr_signing_data.pcr_hash[dword]; hwif_in.ECC_MSG[dword].MSG.hwclr = zeroize_reg; end for (int dword=0; dword < 12; dword++)begin pubkeyx_reg[dword] = hwif_out.ECC_PUBKEY_X[11-dword].PUBKEY_X.value; - hwif_in.ECC_PUBKEY_X[dword].PUBKEY_X.we = hw_pubkeyx_we; + hwif_in.ECC_PUBKEY_X[dword].PUBKEY_X.we = hw_pubkeyx_we & !zeroize_reg; hwif_in.ECC_PUBKEY_X[dword].PUBKEY_X.next = read_reg[11-dword]; hwif_in.ECC_PUBKEY_X[dword].PUBKEY_X.hwclr = zeroize_reg; end for (int dword=0; dword < 12; dword++)begin pubkeyy_reg[dword] = hwif_out.ECC_PUBKEY_Y[11-dword].PUBKEY_Y.value; - hwif_in.ECC_PUBKEY_Y[dword].PUBKEY_Y.we = hw_pubkeyy_we; + hwif_in.ECC_PUBKEY_Y[dword].PUBKEY_Y.we = hw_pubkeyy_we & !zeroize_reg; hwif_in.ECC_PUBKEY_Y[dword].PUBKEY_Y.next = read_reg[11-dword]; hwif_in.ECC_PUBKEY_Y[dword].PUBKEY_Y.hwclr = zeroize_reg; end for (int dword=0; dword < 12; dword++)begin r_reg[dword] = hwif_out.ECC_SIGN_R[11-dword].SIGN_R.value; - hwif_in.ECC_SIGN_R[dword].SIGN_R.we = hw_r_we; + hwif_in.ECC_SIGN_R[dword].SIGN_R.we = hw_r_we & !zeroize_reg; hwif_in.ECC_SIGN_R[dword].SIGN_R.next = read_reg[11-dword]; hwif_in.ECC_SIGN_R[dword].SIGN_R.hwclr = zeroize_reg; end for (int dword=0; dword < 12; dword++)begin s_reg[dword] = hwif_out.ECC_SIGN_S[11-dword].SIGN_S.value; - hwif_in.ECC_SIGN_S[dword].SIGN_S.we = hw_s_we; + hwif_in.ECC_SIGN_S[dword].SIGN_S.we = hw_s_we & !zeroize_reg; hwif_in.ECC_SIGN_S[dword].SIGN_S.next = read_reg[11-dword]; hwif_in.ECC_SIGN_S[dword].SIGN_S.hwclr = zeroize_reg; end for (int dword=0; dword < 12; dword++)begin - hwif_in.ECC_VERIFY_R[dword].VERIFY_R.we = hw_verify_r_we; + hwif_in.ECC_VERIFY_R[dword].VERIFY_R.we = hw_verify_r_we & !zeroize_reg; hwif_in.ECC_VERIFY_R[dword].VERIFY_R.next = read_reg[11-dword]; hwif_in.ECC_VERIFY_R[dword].VERIFY_R.hwclr = zeroize_reg; end @@ -411,7 +441,7 @@ module ecc_dsa_ctrl always_comb hwif_in.ECC_CTRL.PCR_SIGN.hwclr = hwif_out.ECC_CTRL.PCR_SIGN.value; // TODO add other interrupt hwset signals (errors) - always_comb hwif_in.intr_block_rf.error_internal_intr_r.error_internal_sts.hwset = 1'b0; + always_comb hwif_in.intr_block_rf.error_internal_intr_r.error_internal_sts.hwset = error_flag_reg; always_comb hwif_in.intr_block_rf.notif_internal_intr_r.notif_cmd_done_sts.hwset = ecc_status_done_p; @@ -443,6 +473,10 @@ module ecc_dsa_ctrl `CALIPTRA_KV_READ_CTRL_REG2STRUCT(kv_seed_read_ctrl_reg, ecc_kv_rd_seed_ctrl) `CALIPTRA_KV_WRITE_CTRL_REG2STRUCT(kv_write_ctrl_reg, ecc_kv_wr_pkey_ctrl) + //Force result into KV reg whenever source came from KV + always_comb kv_read_data_present_set = kv_seed_read_ctrl_reg.read_en; + always_comb kv_read_data_present_reset = kv_read_data_present & privkey_out_we; + always_comb pcr_sign_mode = hwif_out.ECC_CTRL.PCR_SIGN.value; //---------------------------------------------------------------- @@ -483,7 +517,8 @@ module ecc_dsa_ctrl hw_scalar_G_we = 0; hw_scalar_PK_we = 0; hw_verify_r_we = 0; - if (prog_instr.opcode == DSA_UOP_RD_CORE)begin + hw_pk_chk_we = 0; + if ((prog_instr.opcode == DSA_UOP_RD_CORE) & (cycle_cnt == 0)) begin unique casez (prog_instr.reg_id) PRIVKEY_ID : hw_privkey_we = 1; PUBKEYX_ID : hw_pubkeyx_we = 1; @@ -493,6 +528,7 @@ module ecc_dsa_ctrl SCALAR_G_ID : hw_scalar_G_we = 1; SCALAR_PK_ID : hw_scalar_PK_we = 1; VERIFY_R_ID : hw_verify_r_we = 1; + PK_VALID_ID : hw_pk_chk_we = 1; default : begin hw_privkey_we = 0; @@ -503,6 +539,7 @@ module ecc_dsa_ctrl hw_scalar_G_we = 0; hw_scalar_PK_we = 0; hw_verify_r_we = 0; + hw_pk_chk_we = 0; end endcase end @@ -519,6 +556,7 @@ module ecc_dsa_ctrl CONST_ZERO_ID : write_reg = {zero_pad, ZERO_CONST}; CONST_ONE_ID : write_reg = {zero_pad, ONE_CONST}; CONST_E_a_MONT_ID : write_reg = {zero_pad, E_a_MONT}; + CONST_E_b_MONT_ID : write_reg = {zero_pad, E_b_MONT}; CONST_E_3b_MONT_ID : write_reg = {zero_pad, E_3b_MONT}; CONST_ONE_p_MONT_ID : write_reg = {zero_pad, ONE_p_MONT}; CONST_R2_p_MONT_ID : write_reg = {zero_pad, R2_p_MONT}; @@ -567,6 +605,55 @@ module ecc_dsa_ctrl assign hmac_busy = ~hmac_ready; assign subcomponent_busy = pm_busy_o | hmac_busy | scalar_sca_busy_o; + + //---------------------------------------------------------------- + // ERROR detection + // + // bound check for different input/output registers. + //---------------------------------------------------------------- + always_ff @(posedge clk or negedge reset_n) + begin : pk_chk + if(!reset_n) begin + pk_chk_reg <= '0; + end + else if(zeroize_reg) begin + pk_chk_reg <= '0; + end + else begin + if (hw_pk_chk_we) begin + pk_chk_reg <= read_reg; + end + end + end // pk_chk + + always_ff @(posedge clk or negedge reset_n) + begin : error_detection + if(!reset_n) begin + error_flag_reg <= '0; + end + else if(zeroize_reg) begin + error_flag_reg <= '0; + end + else begin + error_flag_reg <= error_flag; + end + end // error_detection + + assign error_flag_edge = error_flag & (!error_flag_reg); + + assign privkey_input_outofrange = signing_process & ((privkey_reg == 0) | (privkey_reg >= GROUP_ORDER)); + assign r_output_outofrange = signing_process & (hw_r_we & (read_reg == 0)); + + assign r_input_outofrange = verifying_process & ((r_reg == 0) | (r_reg >= GROUP_ORDER)); + assign s_input_outofrange = verifying_process & ((s_reg == 0) | (s_reg >= GROUP_ORDER)); + assign pubkeyx_input_outofrange = verifying_process & (pubkeyx_reg >= PRIME); + assign pubkeyy_input_outofrange = verifying_process & (pubkeyy_reg >= PRIME); + assign pubkey_input_invalid = verifying_process & (pk_chk_reg != 0); + + assign pcr_sign_input_invalid = ((cmd_reg == KEYGEN) | (cmd_reg == VERIFY)) & pcr_sign_mode; + + assign error_flag = privkey_input_outofrange | r_output_outofrange | r_input_outofrange | s_input_outofrange | pubkeyx_input_outofrange | pubkeyy_input_outofrange | pubkey_input_invalid | pcr_sign_input_invalid; + //---------------------------------------------------------------- // ECDSA_FSM_flow // @@ -577,27 +664,40 @@ module ecc_dsa_ctrl always_ff @(posedge clk or negedge reset_n) begin : ECDSA_FSM if(!reset_n) begin - prog_cntr <= DSA_RESET; - cycle_cnt <= '0; - pm_cmd_reg <= '0; - dsa_valid_reg <= 0; - scalar_G_sel <= 0; - hmac_mode <= 0; - hmac_init <= 0; - scalar_sca_en <= 0; + prog_cntr <= DSA_RESET; + cycle_cnt <= '0; + pm_cmd_reg <= '0; + dsa_valid_reg <= 0; + scalar_G_sel <= 0; + hmac_mode <= 0; + hmac_init <= 0; + scalar_sca_en <= 0; + keygen_process <= 0; + signing_process <= 0; + verifying_process <= 0; end else if(zeroize_reg) begin - prog_cntr <= DSA_RESET; - cycle_cnt <= '0; - pm_cmd_reg <= '0; - dsa_valid_reg <= 0; - scalar_G_sel <= 0; - hmac_mode <= 0; - hmac_init <= 0; - scalar_sca_en <= 0; + prog_cntr <= DSA_RESET; + cycle_cnt <= '0; + pm_cmd_reg <= '0; + dsa_valid_reg <= 0; + scalar_G_sel <= 0; + hmac_mode <= 0; + hmac_init <= 0; + scalar_sca_en <= 0; + keygen_process <= 0; + signing_process <= 0; + verifying_process <= 0; end else begin - if (subcomponent_busy) begin //Stalled until sub-component is done + if (error_flag_edge) begin + prog_cntr <= DSA_NOP; + cycle_cnt <= 2'd3; + pm_cmd_reg <= '0; + scalar_sca_en <= 0; + hmac_init <= 0; + end + else if (subcomponent_busy) begin //Stalled until sub-component is done prog_cntr <= prog_cntr; cycle_cnt <= 2'd3; pm_cmd_reg <= '0; @@ -611,6 +711,9 @@ module ecc_dsa_ctrl cycle_cnt <= '0; unique casez (prog_cntr) DSA_NOP : begin + keygen_process <= 0; + signing_process <= 0; + verifying_process <= 0; // Waiting for new valid command unique casez (cmd_reg) KEYGEN : begin // keygen @@ -618,6 +721,7 @@ module ecc_dsa_ctrl dsa_valid_reg <= 0; scalar_G_sel <= 0; hmac_mode <= 0; + keygen_process <= 1; end SIGN : begin // signing @@ -625,12 +729,14 @@ module ecc_dsa_ctrl dsa_valid_reg <= 0; scalar_G_sel <= 0; hmac_mode <= 1; + signing_process <= 1; end VERIFY : begin // verifying prog_cntr <= DSA_VER_S; dsa_valid_reg <= 0; scalar_G_sel <= 1; + verifying_process <= 1; end default : begin @@ -702,6 +808,7 @@ module ecc_dsa_ctrl ( .clk(clk), .rst_b(reset_n), + .zeroize(zeroize_reg), //client control register .read_ctrl_reg(kv_privkey_read_ctrl_reg), @@ -729,6 +836,7 @@ module ecc_dsa_ctrl ( .clk(clk), .rst_b(reset_n), + .zeroize(zeroize_reg), //client control register .read_ctrl_reg(kv_seed_read_ctrl_reg), @@ -755,6 +863,7 @@ module ecc_dsa_ctrl ( .clk(clk), .rst_b(reset_n), + .zeroize(zeroize_reg), //client control register .write_ctrl_reg(kv_write_ctrl_reg), diff --git a/src/ecc/rtl/ecc_dsa_sequencer.sv b/src/ecc/rtl/ecc_dsa_sequencer.sv index 6c5ce3398..a41c080cb 100644 --- a/src/ecc/rtl/ecc_dsa_sequencer.sv +++ b/src/ecc/rtl/ecc_dsa_sequencer.sv @@ -112,24 +112,30 @@ module ecc_dsa_sequencer DSA_SGN_S+ 14 : douta <= {DSA_UOP_NOP, NOP_ID, UOP_OPR_DONTCARE}; //VERIFY - DSA_VER_S : douta <= {DSA_UOP_WR_CORE, MSG_ID, UOP_OPR_HASH_MSG}; - DSA_VER_S+ 1 : douta <= {DSA_UOP_WR_CORE, R_ID, UOP_OPR_SIGN_R}; - DSA_VER_S+ 2 : douta <= {DSA_UOP_WR_CORE, S_ID, UOP_OPR_SIGN_S}; - DSA_VER_S+ 3 : douta <= {DSA_UOP_WR_CORE, CONST_ONE_ID, UOP_OPR_LAMBDA}; - DSA_VER_S+ 4 : douta <= {DSA_UOP_VERIFY0, NOP_ID, UOP_OPR_DONTCARE}; - DSA_VER_S+ 5 : douta <= {DSA_UOP_NOP, NOP_ID, UOP_OPR_DONTCARE}; - DSA_VER_S+ 6 : douta <= {DSA_UOP_RD_CORE, SCALAR_G_ID, UOP_OPR_SCALAR_G}; - DSA_VER_S+ 7 : douta <= {DSA_UOP_RD_CORE, SCALAR_PK_ID, UOP_OPR_SCALAR_PK}; - DSA_VER_S+ 8 : douta <= {DSA_UOP_WR_SCALAR, SCALAR_G_ID, UOP_OPR_DONTCARE}; - DSA_VER_S+ 9 : douta <= {DSA_UOP_VERIFY1, NOP_ID, UOP_OPR_DONTCARE}; - DSA_VER_S+ 10 : douta <= {DSA_UOP_NOP, NOP_ID, UOP_OPR_DONTCARE}; - DSA_VER_S+ 11 : douta <= {DSA_UOP_WR_CORE, PUBKEYX_ID, UOP_OPR_Qx_AFFN}; - DSA_VER_S+ 12 : douta <= {DSA_UOP_WR_CORE, PUBKEYY_ID, UOP_OPR_Qy_AFFN}; - DSA_VER_S+ 13 : douta <= {DSA_UOP_WR_SCALAR, SCALAR_PK_ID, UOP_OPR_DONTCARE}; - DSA_VER_S+ 14 : douta <= {DSA_UOP_VERIFY2, NOP_ID, UOP_OPR_DONTCARE}; - DSA_VER_S+ 15 : douta <= {DSA_UOP_NOP, NOP_ID, UOP_OPR_DONTCARE}; - DSA_VER_S+ 16 : douta <= {DSA_UOP_RD_CORE, VERIFY_R_ID, UOP_OPR_Qx_AFFN}; - DSA_VER_S+ 17 : douta <= {DSA_UOP_NOP, NOP_ID, UOP_OPR_DONTCARE}; + DSA_VER_S : douta <= {DSA_UOP_WR_CORE, CONST_E_b_MONT_ID, UOP_OPR_CONST_E_b}; + DSA_VER_S+ 1 : douta <= {DSA_UOP_WR_CORE, PUBKEYX_ID, UOP_OPR_Qx_AFFN}; + DSA_VER_S+ 2 : douta <= {DSA_UOP_WR_CORE, PUBKEYY_ID, UOP_OPR_Qy_AFFN}; + DSA_VER_S+ 3 : douta <= {DSA_UOP_PK_CHK, NOP_ID, UOP_OPR_DONTCARE}; + DSA_VER_S+ 4 : douta <= {DSA_UOP_NOP, NOP_ID, UOP_OPR_DONTCARE}; + DSA_VER_S+ 5 : douta <= {DSA_UOP_RD_CORE, PK_VALID_ID, UOP_OPR_PK_VALID}; + DSA_VER_S+ 6 : douta <= {DSA_UOP_WR_CORE, MSG_ID, UOP_OPR_HASH_MSG}; + DSA_VER_S+ 7 : douta <= {DSA_UOP_WR_CORE, R_ID, UOP_OPR_SIGN_R}; + DSA_VER_S+ 8 : douta <= {DSA_UOP_WR_CORE, S_ID, UOP_OPR_SIGN_S}; + DSA_VER_S+ 9 : douta <= {DSA_UOP_WR_CORE, CONST_ONE_ID, UOP_OPR_LAMBDA}; + DSA_VER_S+ 10 : douta <= {DSA_UOP_VERIFY0, NOP_ID, UOP_OPR_DONTCARE}; + DSA_VER_S+ 11 : douta <= {DSA_UOP_NOP, NOP_ID, UOP_OPR_DONTCARE}; + DSA_VER_S+ 12 : douta <= {DSA_UOP_RD_CORE, SCALAR_G_ID, UOP_OPR_SCALAR_G}; + DSA_VER_S+ 13 : douta <= {DSA_UOP_RD_CORE, SCALAR_PK_ID, UOP_OPR_SCALAR_PK}; + DSA_VER_S+ 14 : douta <= {DSA_UOP_WR_SCALAR, SCALAR_G_ID, UOP_OPR_DONTCARE}; + DSA_VER_S+ 15 : douta <= {DSA_UOP_VERIFY1, NOP_ID, UOP_OPR_DONTCARE}; + DSA_VER_S+ 16 : douta <= {DSA_UOP_NOP, NOP_ID, UOP_OPR_DONTCARE}; + DSA_VER_S+ 17 : douta <= {DSA_UOP_WR_CORE, PUBKEYX_ID, UOP_OPR_Qx_AFFN}; + DSA_VER_S+ 18 : douta <= {DSA_UOP_WR_CORE, PUBKEYY_ID, UOP_OPR_Qy_AFFN}; + DSA_VER_S+ 19 : douta <= {DSA_UOP_WR_SCALAR, SCALAR_PK_ID, UOP_OPR_DONTCARE}; + DSA_VER_S+ 20 : douta <= {DSA_UOP_VERIFY2, NOP_ID, UOP_OPR_DONTCARE}; + DSA_VER_S+ 21 : douta <= {DSA_UOP_NOP, NOP_ID, UOP_OPR_DONTCARE}; + DSA_VER_S+ 22 : douta <= {DSA_UOP_RD_CORE, VERIFY_R_ID, UOP_OPR_Qx_AFFN}; + DSA_VER_S+ 23 : douta <= {DSA_UOP_NOP, NOP_ID, UOP_OPR_DONTCARE}; default : douta <= {DSA_UOP_NOP, NOP_ID, UOP_OPR_DONTCARE}; endcase diff --git a/src/ecc/rtl/ecc_dsa_uop_pkg.sv b/src/ecc/rtl/ecc_dsa_uop_pkg.sv index 822814317..02439063c 100644 --- a/src/ecc/rtl/ecc_dsa_uop_pkg.sv +++ b/src/ecc/rtl/ecc_dsa_uop_pkg.sv @@ -30,7 +30,7 @@ package ecc_dsa_uop_pkg; localparam integer DSA_UOP_ADDR_WIDTH = 8; localparam integer DSA_OPR_ADDR_WIDTH = 6; -localparam DSA_PROG_ADDR_W = 6; //$clog2(DSA_VER_E+2); +localparam DSA_PROG_ADDR_W = 7; //$clog2(DSA_VER_E+2); localparam DSA_INSTRUCTION_LENGTH = DSA_UOP_ADDR_WIDTH + (2*DSA_OPR_ADDR_WIDTH); // opcode + 2 * operand typedef enum logic[2 : 0] @@ -40,7 +40,8 @@ typedef enum logic[2 : 0] sign_cmd = 3'b010, verify0_cmd = 3'b100, verify1_cmd = 3'b101, - verify2_cmd = 3'b110 + verify2_cmd = 3'b110, + pk_chk_cmd = 3'b111 } cmd_t; typedef struct packed @@ -70,6 +71,7 @@ localparam opcode_t DSA_UOP_SIGN = '{op_sel:1'b0, wr_en:1'b0, rd_en:1 localparam opcode_t DSA_UOP_VERIFY0 = '{op_sel:1'b0, wr_en:1'b0, rd_en:1'b0, pm_cmd:verify0_cmd, hmac_drbg_en:1'b0, sca_en:1'b0}; // = 8'b0010_0000; localparam opcode_t DSA_UOP_VERIFY1 = '{op_sel:1'b0, wr_en:1'b0, rd_en:1'b0, pm_cmd:verify1_cmd, hmac_drbg_en:1'b0, sca_en:1'b0}; // = 8'b0010_1000; localparam opcode_t DSA_UOP_VERIFY2 = '{op_sel:1'b0, wr_en:1'b0, rd_en:1'b0, pm_cmd:verify2_cmd, hmac_drbg_en:1'b0, sca_en:1'b0}; // = 8'b0011_0000; +localparam opcode_t DSA_UOP_PK_CHK = '{op_sel:1'b0, wr_en:1'b0, rd_en:1'b0, pm_cmd:pk_chk_cmd, hmac_drbg_en:1'b0, sca_en:1'b0}; // = 8'b0011_1000; localparam opcode_t DSA_UOP_HMAC_DRBG = '{op_sel:1'b0, wr_en:1'b0, rd_en:1'b0, pm_cmd:no_cmd, hmac_drbg_en:1'b1, sca_en:1'b0}; // = 8'b0100_0000; localparam opcode_t DSA_UOP_SCALAR_SCA = '{op_sel:1'b0, wr_en:1'b0, rd_en:1'b0, pm_cmd:no_cmd, hmac_drbg_en:1'b0, sca_en:1'b1}; // = 8'b1000_0000; @@ -85,6 +87,7 @@ localparam [DSA_OPR_ADDR_WIDTH-1 : 0] CONST_G_X_MONT_ID = 6'd7; localparam [DSA_OPR_ADDR_WIDTH-1 : 0] CONST_G_Y_MONT_ID = 6'd8; localparam [DSA_OPR_ADDR_WIDTH-1 : 0] CONST_R2_q_MONT_ID = 6'd9; localparam [DSA_OPR_ADDR_WIDTH-1 : 0] CONST_ONE_q_MONT_ID = 6'd10; +localparam [DSA_OPR_ADDR_WIDTH-1 : 0] CONST_E_b_MONT_ID = 6'd11; localparam [DSA_OPR_ADDR_WIDTH-1 : 0] SEED_ID = 6'd16; localparam [DSA_OPR_ADDR_WIDTH-1 : 0] MSG_ID = 6'd17; @@ -99,6 +102,7 @@ localparam [DSA_OPR_ADDR_WIDTH-1 : 0] SCALAR_PK_ID = 6'd25; localparam [DSA_OPR_ADDR_WIDTH-1 : 0] VERIFY_R_ID = 6'd26; localparam [DSA_OPR_ADDR_WIDTH-1 : 0] LAMBDA_ID = 6'd27; localparam [DSA_OPR_ADDR_WIDTH-1 : 0] MASKING_ID = 6'd28; +localparam [DSA_OPR_ADDR_WIDTH-1 : 0] PK_VALID_ID = 6'd29; // DSA Subroutine listing localparam [DSA_PROG_ADDR_W-1 : 0] DSA_RESET = 6'd0; @@ -108,7 +112,7 @@ localparam [DSA_PROG_ADDR_W-1 : 0] DSA_KG_E = DSA_KG_S + 12; localparam [DSA_PROG_ADDR_W-1 : 0] DSA_SGN_S = DSA_KG_E + 2; localparam [DSA_PROG_ADDR_W-1 : 0] DSA_SGN_E = DSA_SGN_S + 14; localparam [DSA_PROG_ADDR_W-1 : 0] DSA_VER_S = DSA_SGN_E + 2; -localparam [DSA_PROG_ADDR_W-1 : 0] DSA_VER_E = DSA_VER_S + 17; +localparam [DSA_PROG_ADDR_W-1 : 0] DSA_VER_E = DSA_VER_S + 23; endpackage diff --git a/src/ecc/rtl/ecc_fau.sv b/src/ecc/rtl/ecc_fau.sv index b729cec65..56b82a6ec 100644 --- a/src/ecc/rtl/ecc_fau.sv +++ b/src/ecc/rtl/ecc_fau.sv @@ -51,7 +51,9 @@ module ecc_fau #( reg mult_start; reg mult_start_dly; wire mult_start_edge; - reg add_en; + logic add_start; + logic add_start_dly; + logic add_start_edge; reg sub; logic add_ready_o; @@ -97,7 +99,7 @@ module ecc_fau #( .reset_n(reset_n), .zeroize(zeroize), - .add_en_i(add_en), + .add_en_i(add_start_edge), .sub_i(sub), .opa_i(opa_i), .opb_i(opb_i), @@ -114,34 +116,41 @@ module ecc_fau #( begin if (!reset_n) begin mult_start <= '0; - add_en <= '0; + add_start <= '0; sub <= '0; end else if (zeroize) begin mult_start <= '0; - add_en <= '0; + add_start <= '0; sub <= '0; end else begin mult_start <= mult_en_i; - add_en <= add_en_i; + add_start <= add_en_i; sub <= sub_i; end end always_ff @(posedge clk or negedge reset_n) begin - if (!reset_n) + if (!reset_n) begin mult_start_dly <= '0; - else if (zeroize) + add_start_dly <= '0; + end + else if (zeroize) begin mult_start_dly <= '0; - else + add_start_dly <= '0; + end + else begin mult_start_dly <= mult_start; + add_start_dly <= add_start; + end end assign ready_garbage_bit = add_ready_o & mult_ready_o; // generate a pulse enable for mult assign mult_start_edge = mult_start & ~mult_start_dly; + assign add_start_edge = add_start & ~add_start_dly; //---------------------------------------------------------------- // Concurrent connectivity for ports etc. diff --git a/src/ecc/rtl/ecc_montgomerymultiplier.sv b/src/ecc/rtl/ecc_montgomerymultiplier.sv index df0fb79a2..db767af83 100644 --- a/src/ecc/rtl/ecc_montgomerymultiplier.sv +++ b/src/ecc/rtl/ecc_montgomerymultiplier.sv @@ -100,6 +100,7 @@ module ecc_montgomerymultiplier #( logic [RADIX-1 : 0] last_s_reg; logic [FULL_REG_SIZE-1:0] p_internal; logic [FULL_REG_SIZE-1:0] p_subtracted_internal; + logic last_reduction; //---------------------------------------------------------------- // Processing elements (PEs) @@ -291,8 +292,15 @@ module ecc_montgomerymultiplier #( always_comb sub_b_i[t1] = 1; else always_comb sub_b_i[t1] = sub_b_o[t1 - 1]; - - always_comb sub_b_o[t1] = sub_res[t1][RADIX]; + + always_ff @(posedge clk or negedge reset_n) begin + if (~reset_n) + sub_b_o[t1] <= '0; + else if (zeroize) + sub_b_o[t1] <= '0; + else + sub_b_o[t1] <= sub_res[t1][RADIX]; + end end endgenerate @@ -337,7 +345,8 @@ module ecc_montgomerymultiplier #( end endgenerate - assign p_o = (sub_b_o[2*(PE_UNITS+1)])? p_subtracted_internal[REG_SIZE-1:0] : p_internal[REG_SIZE-1:0]; + always_comb last_reduction = (sub_b_o[2*(PE_UNITS+1)]); + assign p_o = (last_reduction)? p_subtracted_internal[REG_SIZE-1:0] : p_internal[REG_SIZE-1:0]; // Determines when results are ready based on S_NUM always_ff @(posedge clk or negedge reset_n) begin diff --git a/src/ecc/rtl/ecc_params_pkg.sv b/src/ecc/rtl/ecc_params_pkg.sv index 04112fed8..4838971af 100644 --- a/src/ecc/rtl/ecc_params_pkg.sv +++ b/src/ecc/rtl/ecc_params_pkg.sv @@ -53,6 +53,7 @@ package ecc_params_pkg; parameter [REG_SIZE-1 : 0] ZERO_CONST = 384'h0; parameter [REG_SIZE-1 : 0] ONE_CONST = 384'h1; parameter [REG_SIZE-1 : 0] E_a_MONT = 384'hfffffffffffffffffffffffffffffffffffffffffffffffffffffffcfffffffbffffffff00000002fffffffdffffffff; + parameter [REG_SIZE-1 : 0] E_b_MONT = 384'h604fbff9b62b21f41f022094e3374bee94938ae277f2209b1920022fc431bf244754443708118870d0391c81cd08114b; parameter [REG_SIZE-1 : 0] E_3b_MONT = 384'h20ef3fed228165dc5d0661bea9a5e3cbbdbaa0a767d661d14b60068f4c953d6dd5fccca61834995270ab5584671833e2; parameter [REG_SIZE-1 : 0] ONE_p_MONT = 384'h100000000ffffffffffffffff0000000100000000; parameter [REG_SIZE-1 : 0] R2_p_MONT = 384'h10000000200000000fffffffe000000000000000200000000fffffffe000000010000000000000000; diff --git a/src/ecc/rtl/ecc_pm_ctrl.sv b/src/ecc/rtl/ecc_pm_ctrl.sv index 94776280f..0593c5f65 100644 --- a/src/ecc/rtl/ecc_pm_ctrl.sv +++ b/src/ecc/rtl/ecc_pm_ctrl.sv @@ -65,7 +65,7 @@ module ecc_pm_ctrl //---------------------------------------------------------------- // Internal constant and parameter definitions. //---------------------------------------------------------------- - localparam [7 : 0] MULT_DELAY = 8'd38; //39 -1; + localparam [7 : 0] MULT_DELAY = 8'd39; //40 -1; localparam [7 : 0] ADD_DELAY = 8'd1; // 2 -1; localparam [9 : 0] Secp384_SCA_MONT_COUNT = REG_SIZE[9 : 0] + RND_SIZE[9 : 0]; @@ -189,6 +189,10 @@ module ecc_pm_ctrl prog_cntr <= VER1_ST_S; end + CHK_PK_CMD : begin + prog_cntr <= CHK_PK_S; + end + default : prog_cntr <= NOP; endcase @@ -269,6 +273,10 @@ module ecc_pm_ctrl prog_cntr <= NOP; end + CHK_PK_E: begin // End of public key validation before verifying process + prog_cntr <= NOP; + end + VER0_P0_E : begin // End of verfying part 0 to convert inputs to Mont domain prog_cntr <= INVq_S; end diff --git a/src/ecc/rtl/ecc_pm_sequencer.sv b/src/ecc/rtl/ecc_pm_sequencer.sv index c9f178158..d4d758d9e 100644 --- a/src/ecc/rtl/ecc_pm_sequencer.sv +++ b/src/ecc/rtl/ecc_pm_sequencer.sv @@ -26,7 +26,8 @@ // 3) All modular operations are performed in Montgomery domain. // mod p are modular operation respect to PRIME of SECP384 curve. // mod q are modular operation respect to GROUP ORDER of SECP384 curve. -// +// 4) To validate the given public key, we compare YY = Y^2 with +// RHS = X^3 + A X + B. // //====================================================================== @@ -2397,6 +2398,30 @@ module ecc_pm_sequencer SIGN1_S+ 10 : douta <= {UOP_NOP, UOP_OPR_DONTCARE, UOP_OPR_DONTCARE}; SIGN1_S+ 11 : douta <= {UOP_NOP, UOP_OPR_DONTCARE, UOP_OPR_DONTCARE}; + // check the given public key is a valid curve point + CHK_PK_S : douta <= {UOP_DO_MUL_p, UOP_OPR_Qy_AFFN, UOP_OPR_CONST_R2_p}; // A = mm(Qy, R2) % q + CHK_PK_S+ 1 : douta <= {UOP_ST_MUL_p, UOP_OPR_DONTCARE, UOP_OPR_A}; + CHK_PK_S+ 2 : douta <= {UOP_DO_MUL_p, UOP_OPR_A, UOP_OPR_A}; // A = A*A % q + CHK_PK_S+ 3 : douta <= {UOP_ST_MUL_p, UOP_OPR_DONTCARE, UOP_OPR_A}; + CHK_PK_S+ 4 : douta <= {UOP_DO_MUL_p, UOP_OPR_Qx_AFFN, UOP_OPR_CONST_R2_p}; // B = mm(Qx, R2) % q + CHK_PK_S+ 5 : douta <= {UOP_ST_MUL_p, UOP_OPR_DONTCARE, UOP_OPR_B}; + CHK_PK_S+ 6 : douta <= {UOP_DO_MUL_p, UOP_OPR_B, UOP_OPR_B}; // C = B*B % q + CHK_PK_S+ 7 : douta <= {UOP_ST_MUL_p, UOP_OPR_DONTCARE, UOP_OPR_C}; + CHK_PK_S+ 8 : douta <= {UOP_DO_MUL_p, UOP_OPR_C, UOP_OPR_B}; // C = C*B % q + CHK_PK_S+ 9 : douta <= {UOP_ST_MUL_p, UOP_OPR_DONTCARE, UOP_OPR_C}; + CHK_PK_S+ 10 : douta <= {UOP_DO_MUL_p, UOP_OPR_CONST_E_a, UOP_OPR_B}; // D = ECC.a*B % q + CHK_PK_S+ 11 : douta <= {UOP_ST_MUL_p, UOP_OPR_DONTCARE, UOP_OPR_D}; + CHK_PK_S+ 12 : douta <= {UOP_DO_ADD_p, UOP_OPR_C, UOP_OPR_D}; // C = C + D % q + CHK_PK_S+ 13 : douta <= {UOP_ST_ADD_p, UOP_OPR_C, UOP_OPR_DONTCARE}; + CHK_PK_S+ 14 : douta <= {UOP_DO_ADD_p, UOP_OPR_C, UOP_OPR_CONST_E_b}; // C = C + ECC.b % q + CHK_PK_S+ 15 : douta <= {UOP_ST_ADD_p, UOP_OPR_C, UOP_OPR_DONTCARE}; + CHK_PK_S+ 16 : douta <= {UOP_DO_SUB_p, UOP_OPR_A, UOP_OPR_C}; // C = C + ECC.b % q + CHK_PK_S+ 17 : douta <= {UOP_ST_ADD_p, UOP_OPR_PK_VALID, UOP_OPR_DONTCARE}; + CHK_PK_S+ 18 : douta <= {UOP_NOP, UOP_OPR_DONTCARE, UOP_OPR_DONTCARE}; + CHK_PK_S+ 19 : douta <= {UOP_NOP, UOP_OPR_DONTCARE, UOP_OPR_DONTCARE}; + CHK_PK_S+ 20 : douta <= {UOP_NOP, UOP_OPR_DONTCARE, UOP_OPR_DONTCARE}; + CHK_PK_S+ 21 : douta <= {UOP_NOP, UOP_OPR_DONTCARE, UOP_OPR_DONTCARE}; + // VERIFY0 SCALAR part0 to convert inputs to Mont domain VER0_P0_S : douta <= {UOP_DO_MUL_q, UOP_OPR_HASH_MSG, UOP_OPR_CONST_R2_q}; // A = mm(h, R2) % q VER0_P0_S+ 1 : douta <= {UOP_ST_MUL_q, UOP_OPR_DONTCARE, UOP_OPR_A}; diff --git a/src/ecc/rtl/ecc_pm_uop_pkg.sv b/src/ecc/rtl/ecc_pm_uop_pkg.sv index c006f33c1..7f8646c4a 100644 --- a/src/ecc/rtl/ecc_pm_uop_pkg.sv +++ b/src/ecc/rtl/ecc_pm_uop_pkg.sv @@ -75,8 +75,8 @@ localparam [OPR_ADDR_WIDTH-1 : 0] UOP_OPR_CONST_R2_p = 6'd5; localparam [OPR_ADDR_WIDTH-1 : 0] UOP_OPR_CONST_GX_MONT = 6'd6; localparam [OPR_ADDR_WIDTH-1 : 0] UOP_OPR_CONST_GY_MONT = 6'd7; -localparam [OPR_ADDR_WIDTH-1 : 0] UOP_OPR_R0_X = 6'd8; // 8'b0000_1000; -localparam [OPR_ADDR_WIDTH-1 : 0] UOP_OPR_R0_Y = 6'd9; // 8'b0000_1001; +localparam [OPR_ADDR_WIDTH-1 : 0] UOP_OPR_R0_X = 6'd8; // 8'b0000_1000; +localparam [OPR_ADDR_WIDTH-1 : 0] UOP_OPR_R0_Y = 6'd9; // 8'b0000_1001; localparam [OPR_ADDR_WIDTH-1 : 0] UOP_OPR_R0_Z = 6'd10; // 8'b0000_1010; localparam [OPR_ADDR_WIDTH-1 : 0] UOP_OPR_R1_X = 6'd12; // 8'b0000_1100; @@ -129,12 +129,16 @@ localparam [OPR_ADDR_WIDTH-1 : 0] UOP_OPR_P1_X_MONT = 6'd53; localparam [OPR_ADDR_WIDTH-1 : 0] UOP_OPR_P1_Y_MONT = 6'd54; localparam [OPR_ADDR_WIDTH-1 : 0] UOP_OPR_P1_Z_MONT = 6'd55; +localparam [OPR_ADDR_WIDTH-1 : 0] UOP_OPR_CONST_E_b = 6'd56; +localparam [OPR_ADDR_WIDTH-1 : 0] UOP_OPR_PK_VALID = 6'd57; + //PM command listing localparam [2 : 0] KEYGEN_CMD = 3'b001; localparam [2 : 0] SIGN_CMD = 3'b010; localparam [2 : 0] VER_PART0_CMD = 3'b100; localparam [2 : 0] VER_PART1_CMD = 3'b101; -localparam [2 : 0] VER_PART2_CMD = 3'b110; +localparam [2 : 0] VER_PART2_CMD = 3'b110; +localparam [2 : 0] CHK_PK_CMD = 3'b111; //PM Subroutine listing localparam [PROG_ADDR_W-1 : 0] NOP = 12'd0; @@ -158,7 +162,9 @@ localparam [PROG_ADDR_W-1 : 0] INVq_E = INVq_S + 1043; localparam [PROG_ADDR_W-1 : 0] SIGN1_S = INVq_E + 2; // signing proof r part1 localparam [PROG_ADDR_W-1 : 0] SIGN1_E = SIGN1_S + 11; -localparam [PROG_ADDR_W-1 : 0] VER0_P0_S = SIGN1_E + 2; // verifying0 part0 to convert inputs to Mont domain +localparam [PROG_ADDR_W-1 : 0] CHK_PK_S = SIGN1_E + 2; // check the given public key is a valid curve point +localparam [PROG_ADDR_W-1 : 0] CHK_PK_E = CHK_PK_S + 21; +localparam [PROG_ADDR_W-1 : 0] VER0_P0_S = CHK_PK_E + 2; // verifying0 part0 to convert inputs to Mont domain localparam [PROG_ADDR_W-1 : 0] VER0_P0_E = VER0_P0_S + 9; localparam [PROG_ADDR_W-1 : 0] VER0_P1_S = VER0_P0_E + 2; // verifying0 part1 to compute (h*s_inv) and (r*s_inv) localparam [PROG_ADDR_W-1 : 0] VER0_P1_E = VER0_P1_S + 11; diff --git a/src/ecc/rtl/ecc_reg.rdl b/src/ecc/rtl/ecc_reg.rdl index 09332d1b1..4446bf8fa 100644 --- a/src/ecc/rtl/ecc_reg.rdl +++ b/src/ecc/rtl/ecc_reg.rdl @@ -81,7 +81,7 @@ addrmap ecc_reg { default hw = r; default resetsignal = reset_b; field {desc = "Control command field"; swwe = ecc_ready; hwclr;} CTRL[2] = 2'b0; - field {desc = "Zeroize all internal registers"; swwe = ecc_ready; singlepulse;} ZEROIZE = 1'b0; + field {desc = "Zeroize all internal registers"; singlepulse;} ZEROIZE = 1'b0; field {desc = "Run PCR Signing flow"; swwe = ecc_ready; hwclr;} PCR_SIGN = 1'b0; } ECC_CTRL @0x00000010; diff --git a/src/ecc/rtl/ecc_reg.sv b/src/ecc/rtl/ecc_reg.sv index d40d0106d..212ad6d15 100644 --- a/src/ecc/rtl/ecc_reg.sv +++ b/src/ecc/rtl/ecc_reg.sv @@ -682,7 +682,7 @@ module ecc_reg ( always_comb begin automatic logic [0:0] next_c = field_storage.ECC_CTRL.ZEROIZE.value; automatic logic load_next_c = '0; - if(decoded_reg_strb.ECC_CTRL && decoded_req_is_wr && hwif_in.ecc_ready) begin // SW write + if(decoded_reg_strb.ECC_CTRL && decoded_req_is_wr) begin // SW write next_c = (field_storage.ECC_CTRL.ZEROIZE.value & ~decoded_wr_biten[2:2]) | (decoded_wr_data[2:2] & decoded_wr_biten[2:2]); load_next_c = '1; end else if(1) begin // singlepulse clears back to 0 diff --git a/src/ecc/rtl/ecc_reg_uvm.sv b/src/ecc/rtl/ecc_reg_uvm.sv index 4f037836b..2e574c8c6 100644 --- a/src/ecc/rtl/ecc_reg_uvm.sv +++ b/src/ecc/rtl/ecc_reg_uvm.sv @@ -3,44 +3,89 @@ package ecc_reg_uvm; `include "uvm_macros.svh" import uvm_pkg::*; - + `include "ecc_reg_covergroups.svh" // Reg - ecc_reg::ECC_NAME class ecc_reg__ECC_NAME extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + ecc_reg__ECC_NAME_bit_cg NAME_bit_cg[32]; + ecc_reg__ECC_NAME_fld_cg fld_cg; rand uvm_reg_field NAME; function new(string name = "ecc_reg__ECC_NAME"); - super.new(name, 32, UVM_NO_COVERAGE); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); virtual function void build(); this.NAME = new("NAME"); this.NAME.configure(this, 32, 0, "RO", 1, 'h0, 0, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(NAME_bit_cg[bt]) NAME_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); endfunction : build endclass : ecc_reg__ECC_NAME // Reg - ecc_reg::ECC_VERSION class ecc_reg__ECC_VERSION extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + ecc_reg__ECC_VERSION_bit_cg VERSION_bit_cg[32]; + ecc_reg__ECC_VERSION_fld_cg fld_cg; rand uvm_reg_field VERSION; function new(string name = "ecc_reg__ECC_VERSION"); - super.new(name, 32, UVM_NO_COVERAGE); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); virtual function void build(); this.VERSION = new("VERSION"); this.VERSION.configure(this, 32, 0, "RO", 1, 'h0, 0, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(VERSION_bit_cg[bt]) VERSION_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); endfunction : build endclass : ecc_reg__ECC_VERSION // Reg - ecc_reg::ECC_CTRL class ecc_reg__ECC_CTRL extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + ecc_reg__ECC_CTRL_bit_cg CTRL_bit_cg[2]; + ecc_reg__ECC_CTRL_bit_cg ZEROIZE_bit_cg[1]; + ecc_reg__ECC_CTRL_bit_cg PCR_SIGN_bit_cg[1]; + ecc_reg__ECC_CTRL_fld_cg fld_cg; rand uvm_reg_field CTRL; rand uvm_reg_field ZEROIZE; rand uvm_reg_field PCR_SIGN; function new(string name = "ecc_reg__ECC_CTRL"); - super.new(name, 32, UVM_NO_COVERAGE); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); virtual function void build(); this.CTRL = new("CTRL"); @@ -49,190 +94,405 @@ package ecc_reg_uvm; this.ZEROIZE.configure(this, 1, 2, "WO", 0, 'h0, 1, 1, 0); this.PCR_SIGN = new("PCR_SIGN"); this.PCR_SIGN.configure(this, 1, 3, "WO", 1, 'h0, 1, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(CTRL_bit_cg[bt]) CTRL_bit_cg[bt] = new(); + foreach(ZEROIZE_bit_cg[bt]) ZEROIZE_bit_cg[bt] = new(); + foreach(PCR_SIGN_bit_cg[bt]) PCR_SIGN_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); endfunction : build endclass : ecc_reg__ECC_CTRL // Reg - ecc_reg::ECC_STATUS class ecc_reg__ECC_STATUS extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + ecc_reg__ECC_STATUS_bit_cg READY_bit_cg[1]; + ecc_reg__ECC_STATUS_bit_cg VALID_bit_cg[1]; + ecc_reg__ECC_STATUS_fld_cg fld_cg; rand uvm_reg_field READY; rand uvm_reg_field VALID; function new(string name = "ecc_reg__ECC_STATUS"); - super.new(name, 32, UVM_NO_COVERAGE); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); virtual function void build(); this.READY = new("READY"); this.READY.configure(this, 1, 0, "RO", 1, 'h0, 1, 1, 0); this.VALID = new("VALID"); this.VALID.configure(this, 1, 1, "RO", 1, 'h0, 1, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(READY_bit_cg[bt]) READY_bit_cg[bt] = new(); + foreach(VALID_bit_cg[bt]) VALID_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); endfunction : build endclass : ecc_reg__ECC_STATUS // Reg - ecc_reg::ECC_SEED class ecc_reg__ECC_SEED extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + ecc_reg__ECC_SEED_bit_cg SEED_bit_cg[32]; + ecc_reg__ECC_SEED_fld_cg fld_cg; rand uvm_reg_field SEED; function new(string name = "ecc_reg__ECC_SEED"); - super.new(name, 32, UVM_NO_COVERAGE); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); virtual function void build(); this.SEED = new("SEED"); this.SEED.configure(this, 32, 0, "WO", 1, 'h0, 1, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(SEED_bit_cg[bt]) SEED_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); endfunction : build endclass : ecc_reg__ECC_SEED // Reg - ecc_reg::ECC_MSG class ecc_reg__ECC_MSG extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + ecc_reg__ECC_MSG_bit_cg MSG_bit_cg[32]; + ecc_reg__ECC_MSG_fld_cg fld_cg; rand uvm_reg_field MSG; function new(string name = "ecc_reg__ECC_MSG"); - super.new(name, 32, UVM_NO_COVERAGE); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); virtual function void build(); this.MSG = new("MSG"); this.MSG.configure(this, 32, 0, "WO", 1, 'h0, 1, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(MSG_bit_cg[bt]) MSG_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); endfunction : build endclass : ecc_reg__ECC_MSG // Reg - ecc_reg::ECC_PRIVKEY_OUT class ecc_reg__ECC_PRIVKEY_OUT extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + ecc_reg__ECC_PRIVKEY_OUT_bit_cg PRIVKEY_OUT_bit_cg[32]; + ecc_reg__ECC_PRIVKEY_OUT_fld_cg fld_cg; rand uvm_reg_field PRIVKEY_OUT; function new(string name = "ecc_reg__ECC_PRIVKEY_OUT"); - super.new(name, 32, UVM_NO_COVERAGE); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); virtual function void build(); this.PRIVKEY_OUT = new("PRIVKEY_OUT"); this.PRIVKEY_OUT.configure(this, 32, 0, "RO", 1, 'h0, 1, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(PRIVKEY_OUT_bit_cg[bt]) PRIVKEY_OUT_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); endfunction : build endclass : ecc_reg__ECC_PRIVKEY_OUT // Reg - ecc_reg::ECC_PUBKEY_X class ecc_reg__ECC_PUBKEY_X extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + ecc_reg__ECC_PUBKEY_X_bit_cg PUBKEY_X_bit_cg[32]; + ecc_reg__ECC_PUBKEY_X_fld_cg fld_cg; rand uvm_reg_field PUBKEY_X; function new(string name = "ecc_reg__ECC_PUBKEY_X"); - super.new(name, 32, UVM_NO_COVERAGE); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); virtual function void build(); this.PUBKEY_X = new("PUBKEY_X"); this.PUBKEY_X.configure(this, 32, 0, "RW", 1, 'h0, 1, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(PUBKEY_X_bit_cg[bt]) PUBKEY_X_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); endfunction : build endclass : ecc_reg__ECC_PUBKEY_X // Reg - ecc_reg::ECC_PUBKEY_Y class ecc_reg__ECC_PUBKEY_Y extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + ecc_reg__ECC_PUBKEY_Y_bit_cg PUBKEY_Y_bit_cg[32]; + ecc_reg__ECC_PUBKEY_Y_fld_cg fld_cg; rand uvm_reg_field PUBKEY_Y; function new(string name = "ecc_reg__ECC_PUBKEY_Y"); - super.new(name, 32, UVM_NO_COVERAGE); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); virtual function void build(); this.PUBKEY_Y = new("PUBKEY_Y"); this.PUBKEY_Y.configure(this, 32, 0, "RW", 1, 'h0, 1, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(PUBKEY_Y_bit_cg[bt]) PUBKEY_Y_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); endfunction : build endclass : ecc_reg__ECC_PUBKEY_Y // Reg - ecc_reg::ECC_SIGN_R class ecc_reg__ECC_SIGN_R extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + ecc_reg__ECC_SIGN_R_bit_cg SIGN_R_bit_cg[32]; + ecc_reg__ECC_SIGN_R_fld_cg fld_cg; rand uvm_reg_field SIGN_R; function new(string name = "ecc_reg__ECC_SIGN_R"); - super.new(name, 32, UVM_NO_COVERAGE); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); virtual function void build(); this.SIGN_R = new("SIGN_R"); this.SIGN_R.configure(this, 32, 0, "RW", 1, 'h0, 1, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(SIGN_R_bit_cg[bt]) SIGN_R_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); endfunction : build endclass : ecc_reg__ECC_SIGN_R // Reg - ecc_reg::ECC_SIGN_S class ecc_reg__ECC_SIGN_S extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + ecc_reg__ECC_SIGN_S_bit_cg SIGN_S_bit_cg[32]; + ecc_reg__ECC_SIGN_S_fld_cg fld_cg; rand uvm_reg_field SIGN_S; function new(string name = "ecc_reg__ECC_SIGN_S"); - super.new(name, 32, UVM_NO_COVERAGE); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); virtual function void build(); this.SIGN_S = new("SIGN_S"); this.SIGN_S.configure(this, 32, 0, "RW", 1, 'h0, 1, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(SIGN_S_bit_cg[bt]) SIGN_S_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); endfunction : build endclass : ecc_reg__ECC_SIGN_S // Reg - ecc_reg::ECC_VERIFY_R class ecc_reg__ECC_VERIFY_R extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + ecc_reg__ECC_VERIFY_R_bit_cg VERIFY_R_bit_cg[32]; + ecc_reg__ECC_VERIFY_R_fld_cg fld_cg; rand uvm_reg_field VERIFY_R; function new(string name = "ecc_reg__ECC_VERIFY_R"); - super.new(name, 32, UVM_NO_COVERAGE); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); virtual function void build(); this.VERIFY_R = new("VERIFY_R"); this.VERIFY_R.configure(this, 32, 0, "RO", 1, 'h0, 1, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(VERIFY_R_bit_cg[bt]) VERIFY_R_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); endfunction : build endclass : ecc_reg__ECC_VERIFY_R // Reg - ecc_reg::ECC_IV class ecc_reg__ECC_IV extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + ecc_reg__ECC_IV_bit_cg IV_bit_cg[32]; + ecc_reg__ECC_IV_fld_cg fld_cg; rand uvm_reg_field IV; function new(string name = "ecc_reg__ECC_IV"); - super.new(name, 32, UVM_NO_COVERAGE); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); virtual function void build(); this.IV = new("IV"); this.IV.configure(this, 32, 0, "WO", 1, 'h0, 1, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(IV_bit_cg[bt]) IV_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); endfunction : build endclass : ecc_reg__ECC_IV // Reg - ecc_reg::ECC_NONCE class ecc_reg__ECC_NONCE extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + ecc_reg__ECC_NONCE_bit_cg NONCE_bit_cg[32]; + ecc_reg__ECC_NONCE_fld_cg fld_cg; rand uvm_reg_field NONCE; function new(string name = "ecc_reg__ECC_NONCE"); - super.new(name, 32, UVM_NO_COVERAGE); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); virtual function void build(); this.NONCE = new("NONCE"); this.NONCE.configure(this, 32, 0, "WO", 1, 'h0, 1, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(NONCE_bit_cg[bt]) NONCE_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); endfunction : build endclass : ecc_reg__ECC_NONCE // Reg - ecc_reg::ECC_PRIVKEY_IN class ecc_reg__ECC_PRIVKEY_IN extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + ecc_reg__ECC_PRIVKEY_IN_bit_cg PRIVKEY_IN_bit_cg[32]; + ecc_reg__ECC_PRIVKEY_IN_fld_cg fld_cg; rand uvm_reg_field PRIVKEY_IN; function new(string name = "ecc_reg__ECC_PRIVKEY_IN"); - super.new(name, 32, UVM_NO_COVERAGE); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); virtual function void build(); this.PRIVKEY_IN = new("PRIVKEY_IN"); this.PRIVKEY_IN.configure(this, 32, 0, "WO", 1, 'h0, 1, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(PRIVKEY_IN_bit_cg[bt]) PRIVKEY_IN_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); endfunction : build endclass : ecc_reg__ECC_PRIVKEY_IN // Reg - kv_read_ctrl_reg class kv_read_ctrl_reg extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + kv_read_ctrl_reg_bit_cg read_en_bit_cg[1]; + kv_read_ctrl_reg_bit_cg read_entry_bit_cg[5]; + kv_read_ctrl_reg_bit_cg pcr_hash_extend_bit_cg[1]; + kv_read_ctrl_reg_bit_cg rsvd_bit_cg[25]; + kv_read_ctrl_reg_fld_cg fld_cg; rand uvm_reg_field read_en; rand uvm_reg_field read_entry; rand uvm_reg_field pcr_hash_extend; rand uvm_reg_field rsvd; function new(string name = "kv_read_ctrl_reg"); - super.new(name, 32, UVM_NO_COVERAGE); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); virtual function void build(); this.read_en = new("read_en"); @@ -243,18 +503,39 @@ package ecc_reg_uvm; this.pcr_hash_extend.configure(this, 1, 6, "RW", 0, 'h0, 1, 1, 0); this.rsvd = new("rsvd"); this.rsvd.configure(this, 25, 7, "RW", 0, 'h0, 1, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(read_en_bit_cg[bt]) read_en_bit_cg[bt] = new(); + foreach(read_entry_bit_cg[bt]) read_entry_bit_cg[bt] = new(); + foreach(pcr_hash_extend_bit_cg[bt]) pcr_hash_extend_bit_cg[bt] = new(); + foreach(rsvd_bit_cg[bt]) rsvd_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); endfunction : build endclass : kv_read_ctrl_reg // Reg - kv_status_reg class kv_status_reg extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + kv_status_reg_bit_cg READY_bit_cg[1]; + kv_status_reg_bit_cg VALID_bit_cg[1]; + kv_status_reg_bit_cg ERROR_bit_cg[8]; + kv_status_reg_fld_cg fld_cg; rand uvm_reg_field READY; rand uvm_reg_field VALID; rand uvm_reg_field ERROR; function new(string name = "kv_status_reg"); - super.new(name, 32, UVM_NO_COVERAGE); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); virtual function void build(); this.READY = new("READY"); @@ -263,11 +544,31 @@ package ecc_reg_uvm; this.VALID.configure(this, 1, 1, "RO", 1, 'h0, 1, 1, 0); this.ERROR = new("ERROR"); this.ERROR.configure(this, 8, 2, "RO", 1, 'h0, 1, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(READY_bit_cg[bt]) READY_bit_cg[bt] = new(); + foreach(VALID_bit_cg[bt]) VALID_bit_cg[bt] = new(); + foreach(ERROR_bit_cg[bt]) ERROR_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); endfunction : build endclass : kv_status_reg // Reg - kv_write_ctrl_reg class kv_write_ctrl_reg extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + kv_write_ctrl_reg_bit_cg write_en_bit_cg[1]; + kv_write_ctrl_reg_bit_cg write_entry_bit_cg[5]; + kv_write_ctrl_reg_bit_cg hmac_key_dest_valid_bit_cg[1]; + kv_write_ctrl_reg_bit_cg hmac_block_dest_valid_bit_cg[1]; + kv_write_ctrl_reg_bit_cg sha_block_dest_valid_bit_cg[1]; + kv_write_ctrl_reg_bit_cg ecc_pkey_dest_valid_bit_cg[1]; + kv_write_ctrl_reg_bit_cg ecc_seed_dest_valid_bit_cg[1]; + kv_write_ctrl_reg_bit_cg rsvd_bit_cg[21]; + kv_write_ctrl_reg_fld_cg fld_cg; rand uvm_reg_field write_en; rand uvm_reg_field write_entry; rand uvm_reg_field hmac_key_dest_valid; @@ -278,8 +579,13 @@ package ecc_reg_uvm; rand uvm_reg_field rsvd; function new(string name = "kv_write_ctrl_reg"); - super.new(name, 32, UVM_NO_COVERAGE); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); virtual function void build(); this.write_en = new("write_en"); @@ -298,191 +604,413 @@ package ecc_reg_uvm; this.ecc_seed_dest_valid.configure(this, 1, 10, "RW", 0, 'h0, 1, 1, 0); this.rsvd = new("rsvd"); this.rsvd.configure(this, 21, 11, "RW", 0, 'h0, 1, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(write_en_bit_cg[bt]) write_en_bit_cg[bt] = new(); + foreach(write_entry_bit_cg[bt]) write_entry_bit_cg[bt] = new(); + foreach(hmac_key_dest_valid_bit_cg[bt]) hmac_key_dest_valid_bit_cg[bt] = new(); + foreach(hmac_block_dest_valid_bit_cg[bt]) hmac_block_dest_valid_bit_cg[bt] = new(); + foreach(sha_block_dest_valid_bit_cg[bt]) sha_block_dest_valid_bit_cg[bt] = new(); + foreach(ecc_pkey_dest_valid_bit_cg[bt]) ecc_pkey_dest_valid_bit_cg[bt] = new(); + foreach(ecc_seed_dest_valid_bit_cg[bt]) ecc_seed_dest_valid_bit_cg[bt] = new(); + foreach(rsvd_bit_cg[bt]) rsvd_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); endfunction : build endclass : kv_write_ctrl_reg // Reg - ecc_reg::intr_block_t::global_intr_en_t class ecc_reg__intr_block_t__global_intr_en_t extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + ecc_reg__intr_block_t__global_intr_en_t_bit_cg error_en_bit_cg[1]; + ecc_reg__intr_block_t__global_intr_en_t_bit_cg notif_en_bit_cg[1]; + ecc_reg__intr_block_t__global_intr_en_t_fld_cg fld_cg; rand uvm_reg_field error_en; rand uvm_reg_field notif_en; function new(string name = "ecc_reg__intr_block_t__global_intr_en_t"); - super.new(name, 32, UVM_NO_COVERAGE); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); virtual function void build(); this.error_en = new("error_en"); this.error_en.configure(this, 1, 0, "RW", 0, 'h0, 1, 1, 0); this.notif_en = new("notif_en"); this.notif_en.configure(this, 1, 1, "RW", 0, 'h0, 1, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(error_en_bit_cg[bt]) error_en_bit_cg[bt] = new(); + foreach(notif_en_bit_cg[bt]) notif_en_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); endfunction : build endclass : ecc_reg__intr_block_t__global_intr_en_t // Reg - ecc_reg::intr_block_t::error_intr_en_t class ecc_reg__intr_block_t__error_intr_en_t extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + ecc_reg__intr_block_t__error_intr_en_t_bit_cg error_internal_en_bit_cg[1]; + ecc_reg__intr_block_t__error_intr_en_t_fld_cg fld_cg; rand uvm_reg_field error_internal_en; function new(string name = "ecc_reg__intr_block_t__error_intr_en_t"); - super.new(name, 32, UVM_NO_COVERAGE); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); virtual function void build(); this.error_internal_en = new("error_internal_en"); this.error_internal_en.configure(this, 1, 0, "RW", 0, 'h0, 1, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(error_internal_en_bit_cg[bt]) error_internal_en_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); endfunction : build endclass : ecc_reg__intr_block_t__error_intr_en_t // Reg - ecc_reg::intr_block_t::notif_intr_en_t class ecc_reg__intr_block_t__notif_intr_en_t extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + ecc_reg__intr_block_t__notif_intr_en_t_bit_cg notif_cmd_done_en_bit_cg[1]; + ecc_reg__intr_block_t__notif_intr_en_t_fld_cg fld_cg; rand uvm_reg_field notif_cmd_done_en; function new(string name = "ecc_reg__intr_block_t__notif_intr_en_t"); - super.new(name, 32, UVM_NO_COVERAGE); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); virtual function void build(); this.notif_cmd_done_en = new("notif_cmd_done_en"); this.notif_cmd_done_en.configure(this, 1, 0, "RW", 0, 'h0, 1, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(notif_cmd_done_en_bit_cg[bt]) notif_cmd_done_en_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); endfunction : build endclass : ecc_reg__intr_block_t__notif_intr_en_t // Reg - ecc_reg::intr_block_t::global_intr_t_agg_sts_dd3dcf0a class ecc_reg__intr_block_t__global_intr_t_agg_sts_dd3dcf0a extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + ecc_reg__intr_block_t__global_intr_t_agg_sts_dd3dcf0a_bit_cg agg_sts_bit_cg[1]; + ecc_reg__intr_block_t__global_intr_t_agg_sts_dd3dcf0a_fld_cg fld_cg; rand uvm_reg_field agg_sts; function new(string name = "ecc_reg__intr_block_t__global_intr_t_agg_sts_dd3dcf0a"); - super.new(name, 32, UVM_NO_COVERAGE); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); virtual function void build(); this.agg_sts = new("agg_sts"); this.agg_sts.configure(this, 1, 0, "RO", 1, 'h0, 1, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(agg_sts_bit_cg[bt]) agg_sts_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); endfunction : build endclass : ecc_reg__intr_block_t__global_intr_t_agg_sts_dd3dcf0a // Reg - ecc_reg::intr_block_t::global_intr_t_agg_sts_e6399b4a class ecc_reg__intr_block_t__global_intr_t_agg_sts_e6399b4a extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + ecc_reg__intr_block_t__global_intr_t_agg_sts_e6399b4a_bit_cg agg_sts_bit_cg[1]; + ecc_reg__intr_block_t__global_intr_t_agg_sts_e6399b4a_fld_cg fld_cg; rand uvm_reg_field agg_sts; function new(string name = "ecc_reg__intr_block_t__global_intr_t_agg_sts_e6399b4a"); - super.new(name, 32, UVM_NO_COVERAGE); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); virtual function void build(); this.agg_sts = new("agg_sts"); this.agg_sts.configure(this, 1, 0, "RO", 1, 'h0, 1, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(agg_sts_bit_cg[bt]) agg_sts_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); endfunction : build endclass : ecc_reg__intr_block_t__global_intr_t_agg_sts_e6399b4a // Reg - ecc_reg::intr_block_t::error_intr_t_error_internal_sts_83adab02 class ecc_reg__intr_block_t__error_intr_t_error_internal_sts_83adab02 extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + ecc_reg__intr_block_t__error_intr_t_error_internal_sts_83adab02_bit_cg error_internal_sts_bit_cg[1]; + ecc_reg__intr_block_t__error_intr_t_error_internal_sts_83adab02_fld_cg fld_cg; rand uvm_reg_field error_internal_sts; function new(string name = "ecc_reg__intr_block_t__error_intr_t_error_internal_sts_83adab02"); - super.new(name, 32, UVM_NO_COVERAGE); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); virtual function void build(); this.error_internal_sts = new("error_internal_sts"); this.error_internal_sts.configure(this, 1, 0, "W1C", 1, 'h0, 1, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(error_internal_sts_bit_cg[bt]) error_internal_sts_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); endfunction : build endclass : ecc_reg__intr_block_t__error_intr_t_error_internal_sts_83adab02 // Reg - ecc_reg::intr_block_t::notif_intr_t_notif_cmd_done_sts_1c68637e class ecc_reg__intr_block_t__notif_intr_t_notif_cmd_done_sts_1c68637e extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + ecc_reg__intr_block_t__notif_intr_t_notif_cmd_done_sts_1c68637e_bit_cg notif_cmd_done_sts_bit_cg[1]; + ecc_reg__intr_block_t__notif_intr_t_notif_cmd_done_sts_1c68637e_fld_cg fld_cg; rand uvm_reg_field notif_cmd_done_sts; function new(string name = "ecc_reg__intr_block_t__notif_intr_t_notif_cmd_done_sts_1c68637e"); - super.new(name, 32, UVM_NO_COVERAGE); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); virtual function void build(); this.notif_cmd_done_sts = new("notif_cmd_done_sts"); this.notif_cmd_done_sts.configure(this, 1, 0, "W1C", 1, 'h0, 1, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(notif_cmd_done_sts_bit_cg[bt]) notif_cmd_done_sts_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); endfunction : build endclass : ecc_reg__intr_block_t__notif_intr_t_notif_cmd_done_sts_1c68637e // Reg - ecc_reg::intr_block_t::error_intr_trig_t class ecc_reg__intr_block_t__error_intr_trig_t extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + ecc_reg__intr_block_t__error_intr_trig_t_bit_cg error_internal_trig_bit_cg[1]; + ecc_reg__intr_block_t__error_intr_trig_t_fld_cg fld_cg; rand uvm_reg_field error_internal_trig; function new(string name = "ecc_reg__intr_block_t__error_intr_trig_t"); - super.new(name, 32, UVM_NO_COVERAGE); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); virtual function void build(); this.error_internal_trig = new("error_internal_trig"); this.error_internal_trig.configure(this, 1, 0, "W1S", 0, 'h0, 1, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(error_internal_trig_bit_cg[bt]) error_internal_trig_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); endfunction : build endclass : ecc_reg__intr_block_t__error_intr_trig_t // Reg - ecc_reg::intr_block_t::notif_intr_trig_t class ecc_reg__intr_block_t__notif_intr_trig_t extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + ecc_reg__intr_block_t__notif_intr_trig_t_bit_cg notif_cmd_done_trig_bit_cg[1]; + ecc_reg__intr_block_t__notif_intr_trig_t_fld_cg fld_cg; rand uvm_reg_field notif_cmd_done_trig; function new(string name = "ecc_reg__intr_block_t__notif_intr_trig_t"); - super.new(name, 32, UVM_NO_COVERAGE); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); virtual function void build(); this.notif_cmd_done_trig = new("notif_cmd_done_trig"); this.notif_cmd_done_trig.configure(this, 1, 0, "W1S", 0, 'h0, 1, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(notif_cmd_done_trig_bit_cg[bt]) notif_cmd_done_trig_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); endfunction : build endclass : ecc_reg__intr_block_t__notif_intr_trig_t // Reg - ecc_reg::intr_block_t::intr_count_t_cnt_60ddff93 class ecc_reg__intr_block_t__intr_count_t_cnt_60ddff93 extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + ecc_reg__intr_block_t__intr_count_t_cnt_60ddff93_bit_cg cnt_bit_cg[32]; + ecc_reg__intr_block_t__intr_count_t_cnt_60ddff93_fld_cg fld_cg; rand uvm_reg_field cnt; function new(string name = "ecc_reg__intr_block_t__intr_count_t_cnt_60ddff93"); - super.new(name, 32, UVM_NO_COVERAGE); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); virtual function void build(); this.cnt = new("cnt"); this.cnt.configure(this, 32, 0, "RW", 1, 'h0, 1, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(cnt_bit_cg[bt]) cnt_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); endfunction : build endclass : ecc_reg__intr_block_t__intr_count_t_cnt_60ddff93 // Reg - ecc_reg::intr_block_t::intr_count_t_cnt_be67d6d5 class ecc_reg__intr_block_t__intr_count_t_cnt_be67d6d5 extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + ecc_reg__intr_block_t__intr_count_t_cnt_be67d6d5_bit_cg cnt_bit_cg[32]; + ecc_reg__intr_block_t__intr_count_t_cnt_be67d6d5_fld_cg fld_cg; rand uvm_reg_field cnt; function new(string name = "ecc_reg__intr_block_t__intr_count_t_cnt_be67d6d5"); - super.new(name, 32, UVM_NO_COVERAGE); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); virtual function void build(); this.cnt = new("cnt"); this.cnt.configure(this, 32, 0, "RW", 1, 'h0, 1, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(cnt_bit_cg[bt]) cnt_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); endfunction : build endclass : ecc_reg__intr_block_t__intr_count_t_cnt_be67d6d5 // Reg - ecc_reg::intr_block_t::intr_count_incr_t_pulse_15e6ed7e class ecc_reg__intr_block_t__intr_count_incr_t_pulse_15e6ed7e extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + ecc_reg__intr_block_t__intr_count_incr_t_pulse_15e6ed7e_bit_cg pulse_bit_cg[1]; + ecc_reg__intr_block_t__intr_count_incr_t_pulse_15e6ed7e_fld_cg fld_cg; rand uvm_reg_field pulse; function new(string name = "ecc_reg__intr_block_t__intr_count_incr_t_pulse_15e6ed7e"); - super.new(name, 32, UVM_NO_COVERAGE); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); virtual function void build(); this.pulse = new("pulse"); this.pulse.configure(this, 1, 0, "RO", 1, 'h0, 1, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(pulse_bit_cg[bt]) pulse_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); endfunction : build endclass : ecc_reg__intr_block_t__intr_count_incr_t_pulse_15e6ed7e // Reg - ecc_reg::intr_block_t::intr_count_incr_t_pulse_6173128e class ecc_reg__intr_block_t__intr_count_incr_t_pulse_6173128e extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + ecc_reg__intr_block_t__intr_count_incr_t_pulse_6173128e_bit_cg pulse_bit_cg[1]; + ecc_reg__intr_block_t__intr_count_incr_t_pulse_6173128e_fld_cg fld_cg; rand uvm_reg_field pulse; function new(string name = "ecc_reg__intr_block_t__intr_count_incr_t_pulse_6173128e"); - super.new(name, 32, UVM_NO_COVERAGE); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); virtual function void build(); this.pulse = new("pulse"); this.pulse.configure(this, 1, 0, "RO", 1, 'h0, 1, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(pulse_bit_cg[bt]) pulse_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); endfunction : build endclass : ecc_reg__intr_block_t__intr_count_incr_t_pulse_6173128e @@ -745,4 +1273,5 @@ package ecc_reg_uvm; endfunction : build endclass : ecc_reg + `include "ecc_reg_sample.svh" endpackage: ecc_reg_uvm diff --git a/src/ecc/rtl/ecc_top.sv b/src/ecc/rtl/ecc_top.sv index a3333e100..b78ae1535 100644 --- a/src/ecc/rtl/ecc_top.sv +++ b/src/ecc/rtl/ecc_top.sv @@ -57,7 +57,8 @@ module ecc_top input pcr_signing_t pcr_signing_data, output logic error_intr, - output logic notif_intr + output logic notif_intr, + input logic debugUnlock_or_scan_mode_switch ); //gasket to assemble ecc request @@ -148,7 +149,8 @@ module ecc_top .pcr_signing_data(pcr_signing_data), .error_intr(error_intr), - .notif_intr(notif_intr) + .notif_intr(notif_intr), + .debugUnlock_or_scan_mode_switch(debugUnlock_or_scan_mode_switch) ); endmodule diff --git a/src/ecc/tb/ecc_montgomerymultiplier_tb.sv b/src/ecc/tb/ecc_montgomerymultiplier_tb.sv index eb11056c5..5fef6665d 100644 --- a/src/ecc/tb/ecc_montgomerymultiplier_tb.sv +++ b/src/ecc/tb/ecc_montgomerymultiplier_tb.sv @@ -22,9 +22,9 @@ //====================================================================== module ecc_montgomerymultiplier_tb #( - parameter OPERAND_WIDTH = 384, - parameter WORD_WIDTH = 32, - parameter TEST_VECTOR_NUM = 102 + parameter OPERAND_WIDTH = 16, + parameter WORD_WIDTH = 4, + parameter TEST_VECTOR_NUM = 5 ) (); @@ -91,6 +91,7 @@ module ecc_montgomerymultiplier_tb #( mm_dut ( .clk (clk_tb), .reset_n (reset_n_tb), + .zeroize (1'b0), .start_i (start_i_tb), .opa_i (opa_i_tb), @@ -317,7 +318,8 @@ module ecc_montgomerymultiplier_tb #( $display(" -= Testbench for mm started =-"); $display(" ==============================\n"); - fname = $sformatf("/home/mojtabab/workspace_aha_poc/ws1/Caliptra/src/ecc/tb/test_vectors/mm_test_vectors_%0d_key_%0d_word_%0d.hex", TEST_VECTOR_NUM, OPERAND_WIDTH, WORD_WIDTH); + fname = $sformatf("mm_test_vectors_%0d_key_%0d_word_%0d.hex", TEST_VECTOR_NUM, OPERAND_WIDTH, WORD_WIDTH); + read_test_vectors(fname); init_sim(); diff --git a/src/ecc/tb/ecc_top_tb.sv b/src/ecc/tb/ecc_top_tb.sv index 9333b7610..9112a4718 100644 --- a/src/ecc/tb/ecc_top_tb.sv +++ b/src/ecc/tb/ecc_top_tb.sv @@ -138,6 +138,9 @@ module ecc_top_tb end end + //bind coverage file + ecc_top_cov_bind i_ecc_top_cov_bind(); + //---------------------------------------------------------------- // Device Under Test. //---------------------------------------------------------------- @@ -169,7 +172,8 @@ module ecc_top_tb .pcr_signing_data(pcr_signing_data_tb), .error_intr(error_intr_tb), - .notif_intr(notif_intr_tb) + .notif_intr(notif_intr_tb), + .debugUnlock_or_scan_mode_switch('0) ); @@ -206,18 +210,15 @@ module ecc_top_tb task reset_dut; begin $display("*** Toggle reset."); + cptra_pwrgood_tb = '0; reset_n_tb = 0; - cptra_pwrgood_tb = 0; #(2 * CLK_PERIOD); - - @(posedge clk_tb); - reset_n_tb = 1; cptra_pwrgood_tb = 1; #(2 * CLK_PERIOD); + reset_n_tb = 1; - @(posedge clk_tb); $display(""); end endtask // reset_dut @@ -307,22 +308,18 @@ module ecc_top_tb task write_single_word(input [31 : 0] address, input [31 : 0] word); begin - hsel_i_tb <= 1; - haddr_i_tb <= address; - hwrite_i_tb <= 1; - hready_i_tb <= 1; - htrans_i_tb <= AHB_HTRANS_NONSEQ; - hsize_i_tb <= 3'b010; - - @(posedge clk_tb); - haddr_i_tb <= 'Z; - hwdata_i_tb <= word; - hwrite_i_tb <= 0; - htrans_i_tb <= AHB_HTRANS_IDLE; - wait(hreadyout_o_tb == 1'b1); - - @(posedge clk_tb); - hsel_i_tb <= 0; + hsel_i_tb = 1; + haddr_i_tb = address; + hwrite_i_tb = 1; + hready_i_tb = 1; + htrans_i_tb = AHB_HTRANS_NONSEQ; + hsize_i_tb = 3'b010; + #(CLK_PERIOD); + + haddr_i_tb = 'Z; + hwdata_i_tb = word; + hwrite_i_tb = 0; + htrans_i_tb = AHB_HTRANS_IDLE; end endtask // write_single_word @@ -359,21 +356,17 @@ module ecc_top_tb //---------------------------------------------------------------- task read_single_word(input [31 : 0] address); begin - hsel_i_tb <= 1; - haddr_i_tb <= address; - hwrite_i_tb <= 0; - hready_i_tb <= 1; - htrans_i_tb <= AHB_HTRANS_NONSEQ; - hsize_i_tb <= 3'b010; + hsel_i_tb = 1; + haddr_i_tb = address; + hwrite_i_tb = 0; + hready_i_tb = 1; + htrans_i_tb = AHB_HTRANS_NONSEQ; + hsize_i_tb = 3'b010; + #(CLK_PERIOD); - @(posedge clk_tb); - hwdata_i_tb <= 0; - haddr_i_tb <= 'Z; - htrans_i_tb <= AHB_HTRANS_IDLE; - wait(hreadyout_o_tb == 1'b1); - - @(posedge clk_tb); - hsel_i_tb <= 0; + hwdata_i_tb = 0; + haddr_i_tb = 'Z; + htrans_i_tb = AHB_HTRANS_IDLE; end endtask // read_word @@ -455,7 +448,10 @@ module ecc_top_tb //---------------------------------------------------------------- task trig_ECC(input [2 : 0] cmd); begin - write_single_word(`ECC_REG_ECC_CTRL , cmd); + write_single_word(`ECC_REG_ECC_CTRL, cmd); + #(CLK_PERIOD); + hsel_i_tb = 0; + #(CLK_PERIOD); end endtask // trig_ECC @@ -469,7 +465,7 @@ module ecc_top_tb input test_vector_t test_vector); reg [31 : 0] start_time; reg [31 : 0] end_time; - reg [383 : 0] privkey; + operand_t privkey; affn_point_t pubkey; begin wait_ready(); @@ -488,7 +484,6 @@ module ecc_top_tb $display("*** TC %0d starting ECC keygen flow", tc_number); trig_ECC(ECC_CMD_KEYGEN); - #(CLK_PERIOD); wait_ready(); @@ -504,6 +499,8 @@ module ecc_top_tb read_block(`ECC_REG_ECC_PUBKEY_Y_0); pubkey.y = reg_read_data; + trig_ECC(`ECC_REG_ECC_CTRL_ZEROIZE_MASK); //zeroize + end_time = cycle_ctr - start_time; $display("*** keygen test processing time = %01d cycles.", end_time); $display("privkey : 0x%96x", privkey); @@ -539,8 +536,8 @@ module ecc_top_tb input test_vector_t test_vector); reg [31 : 0] start_time; reg [31 : 0] end_time; - reg [383 : 0] R; - reg [383 : 0] S; + operand_t R; + operand_t S; begin wait_ready(); @@ -559,7 +556,6 @@ module ecc_top_tb $display("*** TC %0d starting ECC signing flow", tc_number); trig_ECC(ECC_CMD_SIGNING); - #(CLK_PERIOD); wait_ready(); @@ -571,6 +567,8 @@ module ecc_top_tb read_block(`ECC_REG_ECC_SIGN_S_0); S = reg_read_data; + trig_ECC(`ECC_REG_ECC_CTRL_ZEROIZE_MASK); //zeroize + end_time = cycle_ctr - start_time; $display("*** signing test processing time = %01d cycles.", end_time); $display("privkey : 0x%96x", test_vector.privkey); @@ -604,7 +602,7 @@ module ecc_top_tb input test_vector_t test_vector); reg [31 : 0] start_time; reg [31 : 0] end_time; - reg [383 : 0] verify_r; + operand_t verify_r; begin wait_ready(); @@ -627,7 +625,6 @@ module ecc_top_tb $display("*** TC %0d starting ECC verify flow", tc_number); trig_ECC(ECC_CMD_VERIFYING); - #(CLK_PERIOD); wait_ready(); @@ -635,6 +632,8 @@ module ecc_top_tb read_block(`ECC_REG_ECC_VERIFY_R_0); verify_r = reg_read_data; + trig_ECC(`ECC_REG_ECC_CTRL_ZEROIZE_MASK); //zeroize + end_time = cycle_ctr - start_time; $display("*** verifying test processing time = %01d cycles.", end_time); $display("privkey : 0x%96x", test_vector.privkey); @@ -657,6 +656,304 @@ module ecc_top_tb endtask // ecc_verifying_test + + //---------------------------------------------------------------- + // continuous_cmd_test() + // + // + // Perform test of chaning the command during the process. + //---------------------------------------------------------------- + task continuous_cmd_test(input test_vector_t test_vector); + operand_t privkey; + affn_point_t pubkey; + operand_t R; + operand_t S; + operand_t verify_r; + + begin + + $display("*** continuous_cmd_test started."); + + $display("*** starting ECC keygen flow"); + wait_ready(); + tc_ctr = tc_ctr + 1; + + write_block(`ECC_REG_ECC_SEED_0, test_vector.seed); + write_block(`ECC_REG_ECC_NONCE_0, test_vector.nonce); + write_block(`ECC_REG_ECC_IV_0, test_vector.IV); + + trig_ECC(ECC_CMD_KEYGEN); + + for (int i=0; i<10; i++) + begin + trig_ECC(ECC_CMD_SIGNING); + #(10*CLK_PERIOD); + trig_ECC(ECC_CMD_KEYGEN); + #(10*CLK_PERIOD); + trig_ECC(ECC_CMD_VERIFYING); + #(10*CLK_PERIOD); + end + + wait_ready(); + + read_block(`ECC_REG_ECC_PRIVKEY_OUT_0); + privkey = reg_read_data; + read_block(`ECC_REG_ECC_PUBKEY_X_0); + pubkey.x = reg_read_data; + read_block(`ECC_REG_ECC_PUBKEY_Y_0); + pubkey.y = reg_read_data; + + trig_ECC(`ECC_REG_ECC_CTRL_ZEROIZE_MASK); //zeroize + + if ((privkey == test_vector.privkey) & (pubkey == test_vector.pubkey)) + begin + $display("*** TC %0d keygen successful.", tc_ctr); + $display(""); + end + else + begin + $display("*** ERROR: TC %0d keygen NOT successful.", tc_ctr); + $display("Expected_x: 0x%96x", test_vector.pubkey.x); + $display("Got: 0x%96x", pubkey.x); + $display("Expected_y: 0x%96x", test_vector.pubkey.y); + $display("Got: 0x%96x", pubkey.y); + $display(""); + + error_ctr = error_ctr + 1; + end + + + $display("*** signing test started."); + wait_ready(); + tc_ctr = tc_ctr + 1; + + write_block(`ECC_REG_ECC_MSG_0, test_vector.hashed_msg); + write_block(`ECC_REG_ECC_PRIVKEY_IN_0, test_vector.privkey); + write_block(`ECC_REG_ECC_IV_0, test_vector.IV); + + trig_ECC(ECC_CMD_SIGNING); + + for (int i=0; i<10; i++) + begin + trig_ECC(ECC_CMD_SIGNING); + #(10*CLK_PERIOD); + trig_ECC(ECC_CMD_KEYGEN); + #(10*CLK_PERIOD); + trig_ECC(ECC_CMD_VERIFYING); + #(10*CLK_PERIOD); + end + + wait_ready(); + + read_block(`ECC_REG_ECC_SIGN_R_0); + R = reg_read_data; + read_block(`ECC_REG_ECC_SIGN_S_0); + S = reg_read_data; + + trig_ECC(`ECC_REG_ECC_CTRL_ZEROIZE_MASK); //zeroize + + if (R == test_vector.R & S == test_vector.S) + begin + $display("*** TC %0d signing successful.", tc_ctr); + $display(""); + end + else + begin + $display("*** ERROR: TC %0d signing NOT successful.", tc_ctr); + $display("Expected_R: 0x%96x", test_vector.R); + $display("Got: 0x%96x", R); + $display("Expected_S: 0x%96x", test_vector.S); + $display("Got: 0x%96x", S); + $display(""); + + error_ctr = error_ctr + 1; + end + + + $display("*** verifying test started."); + wait_ready(); + tc_ctr = tc_ctr + 1; + + write_block(`ECC_REG_ECC_MSG_0, test_vector.hashed_msg); + write_block(`ECC_REG_ECC_PUBKEY_X_0, test_vector.pubkey.x); + write_block(`ECC_REG_ECC_PUBKEY_Y_0, test_vector.pubkey.y); + write_block(`ECC_REG_ECC_SIGN_R_0, test_vector.R); + write_block(`ECC_REG_ECC_SIGN_S_0, test_vector.S); + + trig_ECC(ECC_CMD_VERIFYING); + + for (int i=0; i<10; i++) + begin + trig_ECC(ECC_CMD_SIGNING); + #(10*CLK_PERIOD); + trig_ECC(ECC_CMD_KEYGEN); + #(10*CLK_PERIOD); + trig_ECC(ECC_CMD_VERIFYING); + #(10*CLK_PERIOD); + end + + wait_ready(); + + read_block(`ECC_REG_ECC_VERIFY_R_0); + verify_r = reg_read_data; + + trig_ECC(`ECC_REG_ECC_CTRL_ZEROIZE_MASK); //zeroize + + if (verify_r == test_vector.R) + begin + $display("*** TC %0d verifying successful.", tc_ctr); + $display(""); + end + else + begin + $display("*** ERROR: TC %0d verifying NOT successful.", tc_ctr); + $display("Expected_R: 0x%96x", test_vector.R); + $display("Got: 0x%96x", verify_r); + $display(""); + + error_ctr = error_ctr + 1; + end + end + endtask // continuous_cmd_test + + + //---------------------------------------------------------------- + // zeroize_test() + // + //---------------------------------------------------------------- + task zeroize_test(input test_vector_t test_vector); + operand_t privkey; + affn_point_t pubkey; + operand_t R; + operand_t S; + operand_t verify_r; + + begin + + $display("*** zeroize test started."); + + for (int i=0; i<2; i++) begin + // First test: assert zeroize with KEYGEN + wait_ready(); + write_block(`ECC_REG_ECC_SEED_0, test_vector.seed); + write_block(`ECC_REG_ECC_NONCE_0, test_vector.nonce); + write_block(`ECC_REG_ECC_IV_0, test_vector.IV); + + if (i==0) begin + trig_ECC(ECC_CMD_KEYGEN); + #(100 * CLK_PERIOD); + trig_ECC(`ECC_REG_ECC_CTRL_ZEROIZE_MASK); //zeroize + #(CLK_PERIOD); + end + else begin + trig_ECC(`ECC_REG_ECC_CTRL_ZEROIZE_MASK | ECC_CMD_KEYGEN); //zeroize + end + + wait_ready(); + + read_block(`ECC_REG_ECC_PRIVKEY_OUT_0); + privkey = reg_read_data; + read_block(`ECC_REG_ECC_PUBKEY_X_0); + pubkey.x = reg_read_data; + read_block(`ECC_REG_ECC_PUBKEY_Y_0); + pubkey.y = reg_read_data; + + if ((privkey == 0) & (pubkey == 0)) + begin + $display("*** TC %0d keygen successful.", tc_ctr); + $display(""); + end + else + begin + $display("*** ERROR: TC %0d keygen NOT successful.", tc_ctr); + $display("Got: 0x%96x", pubkey.x); + $display("Got: 0x%96x", pubkey.y); + $display(""); + + error_ctr = error_ctr + 1; + end + tc_ctr = tc_ctr + 1; + + // Second test: assert zeroize with Signing + wait_ready(); + write_block(`ECC_REG_ECC_MSG_0, test_vector.hashed_msg); + write_block(`ECC_REG_ECC_PRIVKEY_IN_0, test_vector.privkey); + write_block(`ECC_REG_ECC_IV_0, test_vector.IV); + + if (i==0) begin + trig_ECC(ECC_CMD_SIGNING); + #(100 * CLK_PERIOD); + trig_ECC(`ECC_REG_ECC_CTRL_ZEROIZE_MASK); //zeroize + end + else begin + trig_ECC(`ECC_REG_ECC_CTRL_ZEROIZE_MASK | ECC_CMD_SIGNING); //zeroize + end + + wait_ready(); + + read_block(`ECC_REG_ECC_SIGN_R_0); + R = reg_read_data; + read_block(`ECC_REG_ECC_SIGN_S_0); + S = reg_read_data; + + if (R == 0 & S == 0) + begin + $display("*** TC %0d signing successful.", tc_ctr); + $display(""); + end + else + begin + $display("*** ERROR: TC %0d signing NOT successful.", tc_ctr); + $display("Got: 0x%96x", R); + $display("Got: 0x%96x", S); + $display(""); + + error_ctr = error_ctr + 1; + end + tc_ctr = tc_ctr + 1; + + // Third test: assert zeroize when Verifying is working + wait_ready(); + write_block(`ECC_REG_ECC_MSG_0, test_vector.hashed_msg); + write_block(`ECC_REG_ECC_PUBKEY_X_0, test_vector.pubkey.x); + write_block(`ECC_REG_ECC_PUBKEY_Y_0, test_vector.pubkey.y); + write_block(`ECC_REG_ECC_SIGN_R_0, test_vector.R); + write_block(`ECC_REG_ECC_SIGN_S_0, test_vector.S); + + if (i==0) begin + trig_ECC(ECC_CMD_VERIFYING); + #(100 * CLK_PERIOD); + trig_ECC(`ECC_REG_ECC_CTRL_ZEROIZE_MASK); //zeroize + end + else begin + trig_ECC(`ECC_REG_ECC_CTRL_ZEROIZE_MASK | ECC_CMD_VERIFYING); //zeroize + end + + wait_ready(); + + read_block(`ECC_REG_ECC_VERIFY_R_0); + verify_r = reg_read_data; + + if (verify_r == 0) + begin + $display("*** TC %0d verifying successful.", tc_ctr); + $display(""); + end + else + begin + $display("*** ERROR: TC %0d verifying NOT successful.", tc_ctr); + $display("Got: 0x%96x", verify_r); + $display(""); + + error_ctr = error_ctr + 1; + end + tc_ctr = tc_ctr + 1; + end + + $display("*** TC%01d - zeroize test done.", tc_ctr); + end + endtask // zeroize_test + //---------------------------------------------------------------- // ecc_openssl_keygen_test() // @@ -732,6 +1029,9 @@ module ecc_top_tb ecc_onthefly_reset_test(i, test_vectors[i]); end end + + continuous_cmd_test(test_vectors[0]); + zeroize_test(test_vectors[1]); end endtask // ecc_test diff --git a/src/ecc/tb/test_vectors/mm_test_vectors_5_key_16_word_4.hex b/src/ecc/tb/test_vectors/mm_test_vectors_5_key_16_word_4.hex new file mode 100644 index 000000000..56ea6deda --- /dev/null +++ b/src/ecc/tb/test_vectors/mm_test_vectors_5_key_16_word_4.hex @@ -0,0 +1,30 @@ +0013 +0d79 +fffb +0d +0000 +0 +0015 +00ff +fff1 +0f +b00c +1 +0026 +e509 +fffb +0d +0000 +2 +c15f +5445 +fff1 +0f +0006 +3 +bfff +2fff +fff1 +0f +002f +4 \ No newline at end of file diff --git a/src/ecc/uvmf_ecc/config/compile.yml b/src/ecc/uvmf_ecc/config/compile.yml index 2b821a758..991c25a93 100644 --- a/src/ecc/uvmf_ecc/config/compile.yml +++ b/src/ecc/uvmf_ecc/config/compile.yml @@ -4,6 +4,7 @@ schema_version: 2.4.0 requires: - uvmf_lib - ecc_top + - ecc_coverage targets: tb: directories: diff --git a/src/ecc/uvmf_ecc/uvmf_template_output/project_benches/ECC/tb/testbench/hdl_top.sv b/src/ecc/uvmf_ecc/uvmf_template_output/project_benches/ECC/tb/testbench/hdl_top.sv index 13891f689..d9d9209bb 100644 --- a/src/ecc/uvmf_ecc/uvmf_template_output/project_benches/ECC/tb/testbench/hdl_top.sv +++ b/src/ecc/uvmf_ecc/uvmf_template_output/project_benches/ECC/tb/testbench/hdl_top.sv @@ -116,7 +116,8 @@ import uvmf_base_pkg_hdl::*; .hrdata_o (ECC_out_agent_bus.hrdata), .error_intr (), - .notif_intr () + .notif_intr (), + .debugUnlock_or_scan_mode_switch('0) ); // pragma uvmf custom dut_instantiation end diff --git a/src/edn/config/compile.yml b/src/edn/config/compile.yml index 9f1b4fa4f..569411ae1 100644 --- a/src/edn/config/compile.yml +++ b/src/edn/config/compile.yml @@ -1,5 +1,7 @@ --- provides: [edn_pkg] +requires: + - entropy_src_pkg schema_version: 2.4.0 targets: rtl: diff --git a/src/edn/config/edn_pkg.vf b/src/edn/config/edn_pkg.vf index e90a6984a..cc750fdb6 100644 --- a/src/edn/config/edn_pkg.vf +++ b/src/edn/config/edn_pkg.vf @@ -1,2 +1,7 @@ ++incdir+${CALIPTRA_ROOT}/src/entropy_src/rtl +incdir+${CALIPTRA_ROOT}/src/edn/rtl +${CALIPTRA_ROOT}/src/entropy_src/rtl/entropy_src_main_sm_pkg.sv +${CALIPTRA_ROOT}/src/entropy_src/rtl/entropy_src_ack_sm_pkg.sv +${CALIPTRA_ROOT}/src/entropy_src/rtl/entropy_src_reg_pkg.sv +${CALIPTRA_ROOT}/src/entropy_src/rtl/entropy_src_pkg.sv ${CALIPTRA_ROOT}/src/edn/rtl/edn_pkg.sv \ No newline at end of file diff --git a/src/entropy_src/config/compile.yml b/src/entropy_src/config/compile.yml index 99b8c9449..9cdb9c50a 100644 --- a/src/entropy_src/config/compile.yml +++ b/src/entropy_src/config/compile.yml @@ -23,8 +23,8 @@ requires: - entropy_src_pkg - libs - kmac - - prim_generic - - prim + - caliptra_prim_generic + - caliptra_prim targets: rtl: directories: [$COMPILE_ROOT/rtl] @@ -56,6 +56,7 @@ targets: rtl: directories: [$COMPILE_ROOT/tb] files: + - $COMPILE_ROOT/tb/physical_rng.sv - $COMPILE_ROOT/tb/entropy_src_tb.sv tops: [entropy_src_tb] global: diff --git a/src/entropy_src/config/entropy_src.vf b/src/entropy_src/config/entropy_src.vf index 535b9751a..f8a916e71 100644 --- a/src/entropy_src/config/entropy_src.vf +++ b/src/entropy_src/config/entropy_src.vf @@ -1,11 +1,11 @@ +incdir+${CALIPTRA_ROOT}/src/entropy_src/rtl +incdir+${CALIPTRA_ROOT}/src/integration/rtl +incdir+${CALIPTRA_ROOT}/src/libs/rtl -+incdir+${CALIPTRA_ROOT}/src/prim/rtl ++incdir+${CALIPTRA_ROOT}/src/caliptra_prim/rtl +incdir+${CALIPTRA_ROOT}/src/lc_ctrl/rtl +incdir+${CALIPTRA_ROOT}/src/entropy_src/tb +incdir+${CALIPTRA_ROOT}/src/kmac/rtl -+incdir+${CALIPTRA_ROOT}/src/prim_generic/rtl ++incdir+${CALIPTRA_ROOT}/src/caliptra_prim_generic/rtl ${CALIPTRA_ROOT}/src/entropy_src/rtl/entropy_src_main_sm_pkg.sv ${CALIPTRA_ROOT}/src/entropy_src/rtl/entropy_src_ack_sm_pkg.sv ${CALIPTRA_ROOT}/src/entropy_src/rtl/entropy_src_reg_pkg.sv @@ -21,12 +21,14 @@ ${CALIPTRA_ROOT}/src/libs/rtl/apb_slv_sif.sv ${CALIPTRA_ROOT}/src/libs/rtl/ahb_slv_sif.sv ${CALIPTRA_ROOT}/src/libs/rtl/caliptra_icg.sv ${CALIPTRA_ROOT}/src/libs/rtl/clk_gate.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_util_pkg.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_alert_pkg.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_subreg_pkg.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_mubi_pkg.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_cipher_pkg.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_pkg.sv +${CALIPTRA_ROOT}/src/libs/rtl/caliptra_2ff_sync.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_util_pkg.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_alert_pkg.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_subreg_pkg.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_mubi_pkg.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_cipher_pkg.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_pkg.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_sparse_fsm_pkg.sv ${CALIPTRA_ROOT}/src/lc_ctrl/rtl/lc_ctrl_reg_pkg.sv ${CALIPTRA_ROOT}/src/lc_ctrl/rtl/lc_ctrl_state_pkg.sv ${CALIPTRA_ROOT}/src/lc_ctrl/rtl/lc_ctrl_pkg.sv @@ -37,37 +39,40 @@ ${CALIPTRA_ROOT}/src/kmac/rtl/keccak_round.sv ${CALIPTRA_ROOT}/src/kmac/rtl/keccak_2share.sv ${CALIPTRA_ROOT}/src/kmac/rtl/sha3pad.sv ${CALIPTRA_ROOT}/src/kmac/rtl/sha3.sv -${CALIPTRA_ROOT}/src/prim_generic/rtl/prim_generic_flop.sv -${CALIPTRA_ROOT}/src/prim_generic/rtl/prim_generic_buf.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_flop_2sync.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_lfsr.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_mubi4_sync.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_diff_decode.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_sec_anchor_buf.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_slicer.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_count.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_sparse_fsm_flop.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_dom_and_2share.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_sec_anchor_flop.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_reg_we_check.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_packer_fifo.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_max_tree.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_subreg_arb.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_subreg.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_intr_hw.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_onehot_check.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_mubi8_sync.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_fifo_sync_cnt.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_buf.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_lc_sync.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_alert_receiver.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_flop.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_alert_sender.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_fifo_sync.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_arbiter_ppc.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_sum_tree.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_subreg_ext.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_edge_detector.sv +${CALIPTRA_ROOT}/src/caliptra_prim_generic/rtl/caliptra_prim_generic_flop_en.sv +${CALIPTRA_ROOT}/src/caliptra_prim_generic/rtl/caliptra_prim_generic_flop.sv +${CALIPTRA_ROOT}/src/caliptra_prim_generic/rtl/caliptra_prim_generic_buf.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_flop_en.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_cdc_rand_delay.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_flop_2sync.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_lfsr.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_mubi4_sync.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_diff_decode.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_sec_anchor_buf.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_slicer.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_count.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_sparse_fsm_flop.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_dom_and_2share.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_sec_anchor_flop.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_reg_we_check.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_packer_fifo.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_max_tree.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_subreg_arb.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_subreg.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_intr_hw.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_onehot_check.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_mubi8_sync.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_fifo_sync_cnt.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_buf.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_lc_sync.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_alert_receiver.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_flop.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_alert_sender.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_fifo_sync.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_arbiter_ppc.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_sum_tree.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_subreg_ext.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_edge_detector.sv ${CALIPTRA_ROOT}/src/entropy_src/rtl/entropy_src_reg_top.sv ${CALIPTRA_ROOT}/src/entropy_src/rtl/entropy_src_bucket_ht.sv ${CALIPTRA_ROOT}/src/entropy_src/rtl/entropy_src_cntr_reg.sv @@ -80,4 +85,4 @@ ${CALIPTRA_ROOT}/src/entropy_src/rtl/entropy_src_adaptp_ht.sv ${CALIPTRA_ROOT}/src/entropy_src/rtl/entropy_src_core.sv ${CALIPTRA_ROOT}/src/entropy_src/rtl/entropy_src_repcnt_ht.sv ${CALIPTRA_ROOT}/src/entropy_src/rtl/entropy_src_ack_sm.sv -${CALIPTRA_ROOT}/src/entropy_src/rtl/entropy_src.sv \ No newline at end of file +${CALIPTRA_ROOT}/src/entropy_src/rtl/entropy_src.sv diff --git a/src/entropy_src/config/entropy_src.vlt b/src/entropy_src/config/entropy_src.vlt index 21794084e..5e03da9c1 100644 --- a/src/entropy_src/config/entropy_src.vlt +++ b/src/entropy_src/config/entropy_src.vlt @@ -1,6 +1,6 @@ // Licensed under the Apache License, Version 2.0, see LICENSE for details. // SPDX-License-Identifier: Apache-2.0 // -${CALIPTRA_ROOT}/src/prim/lint/prim_max_tree.vlt -${CALIPTRA_ROOT}/src/prim/lint/prim_sum_tree.vlt -${CALIPTRA_ROOT}/src/prim/lint/prim_onehot_check.vlt +${CALIPTRA_ROOT}/src/caliptra_prim/lint/caliptra_prim_max_tree.vlt +${CALIPTRA_ROOT}/src/caliptra_prim/lint/caliptra_prim_sum_tree.vlt +${CALIPTRA_ROOT}/src/caliptra_prim/lint/caliptra_prim_onehot_check.vlt diff --git a/src/entropy_src/config/entropy_src_tb.vf b/src/entropy_src/config/entropy_src_tb.vf index 95547b682..f0f720b91 100644 --- a/src/entropy_src/config/entropy_src_tb.vf +++ b/src/entropy_src/config/entropy_src_tb.vf @@ -1,11 +1,11 @@ +incdir+${CALIPTRA_ROOT}/src/entropy_src/rtl +incdir+${CALIPTRA_ROOT}/src/integration/rtl +incdir+${CALIPTRA_ROOT}/src/libs/rtl -+incdir+${CALIPTRA_ROOT}/src/prim/rtl ++incdir+${CALIPTRA_ROOT}/src/caliptra_prim/rtl +incdir+${CALIPTRA_ROOT}/src/lc_ctrl/rtl +incdir+${CALIPTRA_ROOT}/src/entropy_src/tb +incdir+${CALIPTRA_ROOT}/src/kmac/rtl -+incdir+${CALIPTRA_ROOT}/src/prim_generic/rtl ++incdir+${CALIPTRA_ROOT}/src/caliptra_prim_generic/rtl ${CALIPTRA_ROOT}/src/entropy_src/rtl/entropy_src_main_sm_pkg.sv ${CALIPTRA_ROOT}/src/entropy_src/rtl/entropy_src_ack_sm_pkg.sv ${CALIPTRA_ROOT}/src/entropy_src/rtl/entropy_src_reg_pkg.sv @@ -21,12 +21,14 @@ ${CALIPTRA_ROOT}/src/libs/rtl/apb_slv_sif.sv ${CALIPTRA_ROOT}/src/libs/rtl/ahb_slv_sif.sv ${CALIPTRA_ROOT}/src/libs/rtl/caliptra_icg.sv ${CALIPTRA_ROOT}/src/libs/rtl/clk_gate.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_util_pkg.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_alert_pkg.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_subreg_pkg.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_mubi_pkg.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_cipher_pkg.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_pkg.sv +${CALIPTRA_ROOT}/src/libs/rtl/caliptra_2ff_sync.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_util_pkg.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_alert_pkg.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_subreg_pkg.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_mubi_pkg.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_cipher_pkg.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_pkg.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_sparse_fsm_pkg.sv ${CALIPTRA_ROOT}/src/lc_ctrl/rtl/lc_ctrl_reg_pkg.sv ${CALIPTRA_ROOT}/src/lc_ctrl/rtl/lc_ctrl_state_pkg.sv ${CALIPTRA_ROOT}/src/lc_ctrl/rtl/lc_ctrl_pkg.sv @@ -37,37 +39,40 @@ ${CALIPTRA_ROOT}/src/kmac/rtl/keccak_round.sv ${CALIPTRA_ROOT}/src/kmac/rtl/keccak_2share.sv ${CALIPTRA_ROOT}/src/kmac/rtl/sha3pad.sv ${CALIPTRA_ROOT}/src/kmac/rtl/sha3.sv -${CALIPTRA_ROOT}/src/prim_generic/rtl/prim_generic_flop.sv -${CALIPTRA_ROOT}/src/prim_generic/rtl/prim_generic_buf.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_flop_2sync.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_lfsr.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_mubi4_sync.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_diff_decode.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_sec_anchor_buf.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_slicer.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_count.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_sparse_fsm_flop.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_dom_and_2share.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_sec_anchor_flop.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_reg_we_check.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_packer_fifo.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_max_tree.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_subreg_arb.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_subreg.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_intr_hw.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_onehot_check.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_mubi8_sync.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_fifo_sync_cnt.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_buf.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_lc_sync.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_alert_receiver.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_flop.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_alert_sender.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_fifo_sync.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_arbiter_ppc.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_sum_tree.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_subreg_ext.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_edge_detector.sv +${CALIPTRA_ROOT}/src/caliptra_prim_generic/rtl/caliptra_prim_generic_flop_en.sv +${CALIPTRA_ROOT}/src/caliptra_prim_generic/rtl/caliptra_prim_generic_flop.sv +${CALIPTRA_ROOT}/src/caliptra_prim_generic/rtl/caliptra_prim_generic_buf.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_flop_en.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_cdc_rand_delay.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_flop_2sync.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_lfsr.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_mubi4_sync.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_diff_decode.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_sec_anchor_buf.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_slicer.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_count.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_sparse_fsm_flop.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_dom_and_2share.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_sec_anchor_flop.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_reg_we_check.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_packer_fifo.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_max_tree.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_subreg_arb.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_subreg.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_intr_hw.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_onehot_check.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_mubi8_sync.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_fifo_sync_cnt.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_buf.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_lc_sync.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_alert_receiver.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_flop.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_alert_sender.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_fifo_sync.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_arbiter_ppc.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_sum_tree.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_subreg_ext.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_edge_detector.sv ${CALIPTRA_ROOT}/src/entropy_src/rtl/entropy_src_reg_top.sv ${CALIPTRA_ROOT}/src/entropy_src/rtl/entropy_src_bucket_ht.sv ${CALIPTRA_ROOT}/src/entropy_src/rtl/entropy_src_cntr_reg.sv @@ -81,4 +86,4 @@ ${CALIPTRA_ROOT}/src/entropy_src/rtl/entropy_src_core.sv ${CALIPTRA_ROOT}/src/entropy_src/rtl/entropy_src_repcnt_ht.sv ${CALIPTRA_ROOT}/src/entropy_src/rtl/entropy_src_ack_sm.sv ${CALIPTRA_ROOT}/src/entropy_src/rtl/entropy_src.sv -${CALIPTRA_ROOT}/src/entropy_src/tb/entropy_src_tb.sv \ No newline at end of file +${CALIPTRA_ROOT}/src/entropy_src/tb/entropy_src_tb.sv diff --git a/src/entropy_src/data/entropy_src.hjson b/src/entropy_src/data/entropy_src.hjson index 74a76233d..65202bab5 100644 --- a/src/entropy_src/data/entropy_src.hjson +++ b/src/entropy_src/data/entropy_src.hjson @@ -45,13 +45,13 @@ type: "uni" name: "otp_en_entropy_src_fw_read" act: "rcv" - package: "prim_mubi_pkg" + package: "caliptra_prim_mubi_pkg" } { struct: "mubi8" type: "uni" name: "otp_en_entropy_src_fw_over" act: "rcv" - package: "prim_mubi_pkg" + package: "caliptra_prim_mubi_pkg" } { struct: "logic" type: "uni" diff --git a/src/entropy_src/data/entropy_src.json b/src/entropy_src/data/entropy_src.json index 6cdd99c15..522b3403e 100644 --- a/src/entropy_src/data/entropy_src.json +++ b/src/entropy_src/data/entropy_src.json @@ -64,14 +64,14 @@ "type": "uni", "name": "otp_en_entropy_src_fw_read", "act": "rcv", - "package": "prim_mubi_pkg" + "package": "caliptra_prim_mubi_pkg" }, { "struct": "mubi8", "type": "uni", "name": "otp_en_entropy_src_fw_over", "act": "rcv", - "package": "prim_mubi_pkg" + "package": "caliptra_prim_mubi_pkg" }, { "struct": "logic", diff --git a/src/entropy_src/rtl/entropy_src.sv b/src/entropy_src/rtl/entropy_src.sv index ece5b8e40..d4af6c202 100644 --- a/src/entropy_src/rtl/entropy_src.sv +++ b/src/entropy_src/rtl/entropy_src.sv @@ -4,13 +4,13 @@ // // Description: entropy_src top level wrapper file -`include "prim_assert.sv" +`include "caliptra_prim_assert.sv" module entropy_src import entropy_src_pkg::*; import entropy_src_reg_pkg::*; - import prim_mubi_pkg::mubi8_t; + import caliptra_prim_mubi_pkg::mubi8_t; #( parameter bit Stub = 1'b0, parameter logic [NumAlerts-1:0] AlertAsyncOn = {NumAlerts{1'b1}}, @@ -60,8 +60,8 @@ module entropy_src input entropy_src_xht_rsp_t entropy_src_xht_i, // Alerts - input prim_alert_pkg::alert_rx_t [NumAlerts-1:0] alert_rx_i, - output prim_alert_pkg::alert_tx_t [NumAlerts-1:0] alert_tx_o, + input caliptra_prim_alert_pkg::alert_rx_t [NumAlerts-1:0] alert_rx_i, + output caliptra_prim_alert_pkg::alert_tx_t [NumAlerts-1:0] alert_tx_o, // Interrupts output logic intr_es_entropy_valid_o, @@ -203,18 +203,18 @@ module entropy_src }; // once enabled, stub entropy is always available - import prim_mubi_pkg::mubi4_t; - import prim_mubi_pkg::mubi4_test_true_strict; + import caliptra_prim_mubi_pkg::mubi4_t; + import caliptra_prim_mubi_pkg::mubi4_test_true_strict; mubi4_t mubi_module_en; assign mubi_module_en = mubi4_t'(reg2hw.module_enable.q); assign stub_es_valid = mubi4_test_true_strict(mubi_module_en); if (Stub) begin : gen_stub_entropy_src - prim_lfsr #( + caliptra_prim_lfsr #( .LfsrDw(StubLfsrWidth), .StateOutDw(StubLfsrWidth) - ) u_prim_lfsr ( + ) u_caliptra_prim_lfsr ( .clk_i (clk_i), .rst_ni (rst_ni), .seed_en_i ('0), @@ -248,10 +248,10 @@ module entropy_src // Alert generation /////////////////////////// for (genvar i = 0; i < NumAlerts; i++) begin : gen_alert_tx - prim_alert_sender #( + caliptra_prim_alert_sender #( .AsyncOn(AlertAsyncOn[i]), .IsFatal(i) - ) u_prim_alert_sender ( + ) u_caliptra_prim_alert_sender ( .clk_i, .rst_ni, .alert_test_i ( alert_test[i] ), @@ -292,37 +292,37 @@ module entropy_src `CALIPTRA_ASSERT_KNOWN(IntrEsHealthTestFailedKnownO_A, intr_es_health_test_failed_o) `CALIPTRA_ASSERT_KNOWN(IntrEsFifoErrKnownO_A, intr_es_fatal_err_o) - // prim_count alerts + // caliptra_prim_count alerts `CALIPTRA_ASSERT_PRIM_COUNT_ERROR_TRIGGER_ALERT(CntAlertCheck0_A, - u_entropy_src_core.u_prim_count_window_cntr, + u_entropy_src_core.u_caliptra_prim_count_window_cntr, alert_tx_o[1]) for (genvar sh = 0; sh < RngBusWidth; sh = sh+1) begin : gen_bit_cntrs `CALIPTRA_ASSERT_PRIM_COUNT_ERROR_TRIGGER_ALERT(CntAlertCheck1_A, - u_entropy_src_core.u_entropy_src_adaptp_ht.gen_cntrs[sh].u_prim_count_test_cnt, + u_entropy_src_core.u_entropy_src_adaptp_ht.gen_cntrs[sh].u_caliptra_prim_count_test_cnt, alert_tx_o[1]) end : gen_bit_cntrs for (genvar i = 0; i < NumBins; i = i + 1) begin : gen_symbol_match `CALIPTRA_ASSERT_PRIM_COUNT_ERROR_TRIGGER_ALERT(CntAlertCheck_A, - u_entropy_src_core.u_entropy_src_bucket_ht.gen_symbol_match[i].u_prim_count_bin_cntr, + u_entropy_src_core.u_entropy_src_bucket_ht.gen_symbol_match[i].u_caliptra_prim_count_bin_cntr, alert_tx_o[1]) end : gen_symbol_match for (genvar sh = 0; sh < RngBusWidth; sh = sh+1) begin : gen_pair_cntrs `CALIPTRA_ASSERT_PRIM_COUNT_ERROR_TRIGGER_ALERT(CntAlertCheck_A, - u_entropy_src_core.u_entropy_src_markov_ht.gen_cntrs[sh].u_prim_count_pair_cntr, + u_entropy_src_core.u_entropy_src_markov_ht.gen_cntrs[sh].u_caliptra_prim_count_pair_cntr, alert_tx_o[1]) end : gen_pair_cntrs for (genvar sh = 0; sh < RngBusWidth; sh = sh+1) begin : gen_rep_cntrs `CALIPTRA_ASSERT_PRIM_COUNT_ERROR_TRIGGER_ALERT(CntAlertCheck_A, - u_entropy_src_core.u_entropy_src_repcnt_ht.gen_cntrs[sh].u_prim_count_rep_cntr, + u_entropy_src_core.u_entropy_src_repcnt_ht.gen_cntrs[sh].u_caliptra_prim_count_rep_cntr, alert_tx_o[1]) end : gen_rep_cntrs `CALIPTRA_ASSERT_PRIM_COUNT_ERROR_TRIGGER_ALERT(CntAlertCheck7_A, - u_entropy_src_core.u_entropy_src_repcnts_ht.u_prim_count_rep_cntr, + u_entropy_src_core.u_entropy_src_repcnts_ht.u_caliptra_prim_count_rep_cntr, alert_tx_o[1]) `CALIPTRA_ASSERT_PRIM_FSM_ERROR_TRIGGER_ALERT(CtrlMainFsmCheck_A, @@ -350,79 +350,79 @@ module entropy_src u_entropy_src_core.u_sha3.u_keccak.u_round_count, alert_tx_o[1]) `CALIPTRA_ASSERT_PRIM_COUNT_ERROR_TRIGGER_ALERT(CntAlertCheck8_A, - u_entropy_src_core.u_entropy_src_cntr_reg_repcnt.u_prim_count_cntr_reg, + u_entropy_src_core.u_entropy_src_cntr_reg_repcnt.u_caliptra_prim_count_cntr_reg, alert_tx_o[1]) `CALIPTRA_ASSERT_PRIM_COUNT_ERROR_TRIGGER_ALERT(CntAlertCheck9_A, - u_entropy_src_core.u_entropy_src_cntr_reg_repcnts.u_prim_count_cntr_reg, + u_entropy_src_core.u_entropy_src_cntr_reg_repcnts.u_caliptra_prim_count_cntr_reg, alert_tx_o[1]) `CALIPTRA_ASSERT_PRIM_COUNT_ERROR_TRIGGER_ALERT(CntAlertCheck10_A, - u_entropy_src_core.u_entropy_src_cntr_reg_adaptp_hi.u_prim_count_cntr_reg, + u_entropy_src_core.u_entropy_src_cntr_reg_adaptp_hi.u_caliptra_prim_count_cntr_reg, alert_tx_o[1]) `CALIPTRA_ASSERT_PRIM_COUNT_ERROR_TRIGGER_ALERT(CntAlertCheck11_A, - u_entropy_src_core.u_entropy_src_cntr_reg_adaptp_lo.u_prim_count_cntr_reg, + u_entropy_src_core.u_entropy_src_cntr_reg_adaptp_lo.u_caliptra_prim_count_cntr_reg, alert_tx_o[1]) `CALIPTRA_ASSERT_PRIM_COUNT_ERROR_TRIGGER_ALERT(CntAlertCheck12_A, - u_entropy_src_core.u_entropy_src_cntr_reg_bucket.u_prim_count_cntr_reg, + u_entropy_src_core.u_entropy_src_cntr_reg_bucket.u_caliptra_prim_count_cntr_reg, alert_tx_o[1]) `CALIPTRA_ASSERT_PRIM_COUNT_ERROR_TRIGGER_ALERT(CntAlertCheck13_A, - u_entropy_src_core.u_entropy_src_cntr_reg_markov_hi.u_prim_count_cntr_reg, + u_entropy_src_core.u_entropy_src_cntr_reg_markov_hi.u_caliptra_prim_count_cntr_reg, alert_tx_o[1]) `CALIPTRA_ASSERT_PRIM_COUNT_ERROR_TRIGGER_ALERT(CntAlertCheck14_A, - u_entropy_src_core.u_entropy_src_cntr_reg_markov_lo.u_prim_count_cntr_reg, + u_entropy_src_core.u_entropy_src_cntr_reg_markov_lo.u_caliptra_prim_count_cntr_reg, alert_tx_o[1]) `CALIPTRA_ASSERT_PRIM_COUNT_ERROR_TRIGGER_ALERT(CntAlertCheck15_A, - u_entropy_src_core.u_entropy_src_cntr_reg_extht_hi.u_prim_count_cntr_reg, + u_entropy_src_core.u_entropy_src_cntr_reg_extht_hi.u_caliptra_prim_count_cntr_reg, alert_tx_o[1]) `CALIPTRA_ASSERT_PRIM_COUNT_ERROR_TRIGGER_ALERT(CntAlertCheck16_A, - u_entropy_src_core.u_entropy_src_cntr_reg_extht_lo.u_prim_count_cntr_reg, + u_entropy_src_core.u_entropy_src_cntr_reg_extht_lo.u_caliptra_prim_count_cntr_reg, alert_tx_o[1]) `CALIPTRA_ASSERT_PRIM_COUNT_ERROR_TRIGGER_ALERT(CntAlertCheck17_A, - u_entropy_src_core.u_entropy_src_cntr_reg_any_alert_fails.u_prim_count_cntr_reg, + u_entropy_src_core.u_entropy_src_cntr_reg_any_alert_fails.u_caliptra_prim_count_cntr_reg, alert_tx_o[1]) `CALIPTRA_ASSERT_PRIM_COUNT_ERROR_TRIGGER_ALERT(CntAlertCheck18_A, - u_entropy_src_core.u_entropy_src_cntr_reg_repcnt_alert_fails.u_prim_count_cntr_reg, + u_entropy_src_core.u_entropy_src_cntr_reg_repcnt_alert_fails.u_caliptra_prim_count_cntr_reg, alert_tx_o[1]) `CALIPTRA_ASSERT_PRIM_COUNT_ERROR_TRIGGER_ALERT(CntAlertCheck19_A, - u_entropy_src_core.u_entropy_src_cntr_reg_repcnts_alert_fails.u_prim_count_cntr_reg, + u_entropy_src_core.u_entropy_src_cntr_reg_repcnts_alert_fails.u_caliptra_prim_count_cntr_reg, alert_tx_o[1]) `CALIPTRA_ASSERT_PRIM_COUNT_ERROR_TRIGGER_ALERT(CntAlertCheck20_A, - u_entropy_src_core.u_entropy_src_cntr_reg_adaptp_hi_alert_fails.u_prim_count_cntr_reg, + u_entropy_src_core.u_entropy_src_cntr_reg_adaptp_hi_alert_fails.u_caliptra_prim_count_cntr_reg, alert_tx_o[1]) `CALIPTRA_ASSERT_PRIM_COUNT_ERROR_TRIGGER_ALERT(CntAlertCheck21_A, - u_entropy_src_core.u_entropy_src_cntr_reg_adaptp_lo_alert_fails.u_prim_count_cntr_reg, + u_entropy_src_core.u_entropy_src_cntr_reg_adaptp_lo_alert_fails.u_caliptra_prim_count_cntr_reg, alert_tx_o[1]) `CALIPTRA_ASSERT_PRIM_COUNT_ERROR_TRIGGER_ALERT(CntAlertCheck22_A, - u_entropy_src_core.u_entropy_src_cntr_reg_bucket_alert_fails.u_prim_count_cntr_reg, + u_entropy_src_core.u_entropy_src_cntr_reg_bucket_alert_fails.u_caliptra_prim_count_cntr_reg, alert_tx_o[1]) `CALIPTRA_ASSERT_PRIM_COUNT_ERROR_TRIGGER_ALERT(CntAlertCheck23_A, - u_entropy_src_core.u_entropy_src_cntr_reg_markov_hi_alert_fails.u_prim_count_cntr_reg, + u_entropy_src_core.u_entropy_src_cntr_reg_markov_hi_alert_fails.u_caliptra_prim_count_cntr_reg, alert_tx_o[1]) `CALIPTRA_ASSERT_PRIM_COUNT_ERROR_TRIGGER_ALERT(CntAlertCheck24_A, - u_entropy_src_core.u_entropy_src_cntr_reg_markov_lo_alert_fails.u_prim_count_cntr_reg, + u_entropy_src_core.u_entropy_src_cntr_reg_markov_lo_alert_fails.u_caliptra_prim_count_cntr_reg, alert_tx_o[1]) `CALIPTRA_ASSERT_PRIM_COUNT_ERROR_TRIGGER_ALERT(CntAlertCheck25_A, - u_entropy_src_core.u_entropy_src_cntr_reg_extht_hi_alert_fails.u_prim_count_cntr_reg, + u_entropy_src_core.u_entropy_src_cntr_reg_extht_hi_alert_fails.u_caliptra_prim_count_cntr_reg, alert_tx_o[1]) `CALIPTRA_ASSERT_PRIM_COUNT_ERROR_TRIGGER_ALERT(CntAlertCheck26_A, - u_entropy_src_core.u_entropy_src_cntr_reg_extht_lo_alert_fails.u_prim_count_cntr_reg, + u_entropy_src_core.u_entropy_src_cntr_reg_extht_lo_alert_fails.u_caliptra_prim_count_cntr_reg, alert_tx_o[1]) // Alert assertions for reg_we onehot check diff --git a/src/entropy_src/rtl/entropy_src_ack_sm.sv b/src/entropy_src/rtl/entropy_src_ack_sm.sv index a5d12e750..6fda7f6ce 100644 --- a/src/entropy_src/rtl/entropy_src_ack_sm.sv +++ b/src/entropy_src/rtl/entropy_src_ack_sm.sv @@ -22,7 +22,7 @@ module entropy_src_ack_sm ( state_e state_d, state_q; - `PRIM_FLOP_SPARSE_FSM(u_state_regs, state_d, state_q, state_e, Idle) + `CALIPTRA_PRIM_FLOP_SPARSE_FSM(u_state_regs, state_d, state_q, state_e, Idle) always_comb begin state_d = state_q; diff --git a/src/entropy_src/rtl/entropy_src_adaptp_ht.sv b/src/entropy_src/rtl/entropy_src_adaptp_ht.sv index 1ef799702..4c58bbc33 100644 --- a/src/entropy_src/rtl/entropy_src_adaptp_ht.sv +++ b/src/entropy_src/rtl/entropy_src_adaptp_ht.sv @@ -47,9 +47,9 @@ module entropy_src_adaptp_ht #( // cumulative ones counter // SEC_CM: CTR.REDUN - prim_count #( + caliptra_prim_count #( .Width(RegWidth) - ) u_prim_count_test_cnt ( + ) u_caliptra_prim_count_test_cnt ( .clk_i, .rst_ni, .clr_i(window_wrap_pulse_i), @@ -65,7 +65,7 @@ module entropy_src_adaptp_ht #( end : gen_cntrs // determine the highest counter counter value - prim_max_tree #( + caliptra_prim_max_tree #( .NumSrc(RngBusWidth), .Width(RegWidth) ) u_max ( @@ -79,9 +79,9 @@ module entropy_src_adaptp_ht #( ); // determine the lowest counter value - // Negate the inputs and outputs of prim_max_tree to find the minimum + // Negate the inputs and outputs of caliptra_prim_max_tree to find the minimum // For this unsigned application, one's complement negation (i.e. logical inversion) is fine. - prim_max_tree #( + caliptra_prim_max_tree #( .NumSrc(RngBusWidth), .Width(RegWidth) ) u_min ( @@ -96,7 +96,7 @@ module entropy_src_adaptp_ht #( assign test_cnt_min = ~test_cnt_min_tmp; - prim_sum_tree #( + caliptra_prim_sum_tree #( .NumSrc(RngBusWidth), .Width(RegWidth) ) u_sum ( diff --git a/src/entropy_src/rtl/entropy_src_bucket_ht.sv b/src/entropy_src/rtl/entropy_src_bucket_ht.sv index ecf2e9ba9..a59e62f46 100644 --- a/src/entropy_src/rtl/entropy_src_bucket_ht.sv +++ b/src/entropy_src/rtl/entropy_src_bucket_ht.sv @@ -49,9 +49,9 @@ module entropy_src_bucket_ht #( assign bin_incr[i] = entropy_bit_vld_i && (entropy_bit_i == i); // use the bin incrementer to increase the bin total count // SEC_CM: CTR.REDUN - prim_count #( + caliptra_prim_count #( .Width(RegWidth) - ) u_prim_count_bin_cntr ( + ) u_caliptra_prim_count_bin_cntr ( .clk_i, .rst_ni, .clr_i(window_wrap_pulse_i), @@ -67,10 +67,10 @@ module entropy_src_bucket_ht #( assign bin_cnt_exceeds_thresh[i] = (bin_cntr[i] > thresh_i); end : gen_symbol_match - prim_max_tree #( + caliptra_prim_max_tree #( .NumSrc(NUM_BINS), .Width(RegWidth) - ) u_prim_max_tree_bin_cntr_max ( + ) u_caliptra_prim_max_tree_bin_cntr_max ( .clk_i, .rst_ni, .values_i (bin_cntr), diff --git a/src/entropy_src/rtl/entropy_src_cntr_reg.sv b/src/entropy_src/rtl/entropy_src_cntr_reg.sv index fbb5c3425..65c1a506d 100644 --- a/src/entropy_src/rtl/entropy_src_cntr_reg.sv +++ b/src/entropy_src/rtl/entropy_src_cntr_reg.sv @@ -22,9 +22,9 @@ module entropy_src_cntr_reg #( logic [RegWidth-1:0] counter_value; // counter will not wrap when full value is reached - prim_count #( + caliptra_prim_count #( .Width(RegWidth) - ) u_prim_count_cntr_reg ( + ) u_caliptra_prim_count_cntr_reg ( .clk_i, .rst_ni, .clr_i(clear_i), diff --git a/src/entropy_src/rtl/entropy_src_core.sv b/src/entropy_src/rtl/entropy_src_core.sv index 6c5bcaeb5..cb58c0e4d 100644 --- a/src/entropy_src/rtl/entropy_src_core.sv +++ b/src/entropy_src/rtl/entropy_src_core.sv @@ -15,8 +15,8 @@ module entropy_src_core import entropy_src_pkg::*; #( output entropy_src_reg_pkg::entropy_src_hw2reg_t hw2reg, // Efuse Interface - input prim_mubi_pkg::mubi8_t otp_en_entropy_src_fw_read_i, - input prim_mubi_pkg::mubi8_t otp_en_entropy_src_fw_over_i, + input caliptra_prim_mubi_pkg::mubi8_t otp_en_entropy_src_fw_read_i, + input caliptra_prim_mubi_pkg::mubi8_t otp_en_entropy_src_fw_over_i, // RNG Interface output logic rng_fips_o, @@ -49,11 +49,11 @@ module entropy_src_core import entropy_src_pkg::*; #( ); import entropy_src_reg_pkg::*; - import prim_mubi_pkg::mubi4_t; - import prim_mubi_pkg::mubi4_test_true_strict; - import prim_mubi_pkg::mubi4_and_hi; - import prim_mubi_pkg::mubi4_test_false_loose; - import prim_mubi_pkg::mubi4_test_invalid; + import caliptra_prim_mubi_pkg::mubi4_t; + import caliptra_prim_mubi_pkg::mubi4_test_true_strict; + import caliptra_prim_mubi_pkg::mubi4_and_hi; + import caliptra_prim_mubi_pkg::mubi4_test_false_loose; + import caliptra_prim_mubi_pkg::mubi4_test_invalid; localparam int Clog2EsFifoDepth = $clog2(EsFifoDepth); localparam int PostHTWidth = 32; @@ -406,8 +406,8 @@ module entropy_src_core import entropy_src_pkg::*; #( logic sha3_msg_end; logic sha3_msg_rdy_mask; logic sha3_block_processed; - prim_mubi_pkg::mubi4_t sha3_done; - prim_mubi_pkg::mubi4_t sha3_absorbed; + caliptra_prim_mubi_pkg::mubi4_t sha3_done; + caliptra_prim_mubi_pkg::mubi4_t sha3_absorbed; logic sha3_squeezing; logic [2:0] sha3_fsm; logic [32:0] sha3_err; @@ -448,8 +448,8 @@ module entropy_src_core import entropy_src_pkg::*; #( logic unused_entropy_data; logic unused_fw_ov_rd_data; - prim_mubi_pkg::mubi8_t en_entropy_src_fw_read; - prim_mubi_pkg::mubi8_t en_entropy_src_fw_over; + caliptra_prim_mubi_pkg::mubi8_t en_entropy_src_fw_read; + caliptra_prim_mubi_pkg::mubi8_t en_entropy_src_fw_over; mubi4_t mubi_es_enable; mubi4_t mubi_module_en_pulse; @@ -495,7 +495,7 @@ module entropy_src_core import entropy_src_pkg::*; #( es_rdata_capt_vld_q <= '0; fw_ov_sha3_start_pfe_q <= '0; sha3_msg_rdy_mask_q <= '0; - mubi_mod_en_dly_q <= prim_mubi_pkg::MuBi4False; + mubi_mod_en_dly_q <= caliptra_prim_mubi_pkg::MuBi4False; sha3_flush_q <= '0; sha3_start_mask_q <= '0; fw_ov_corrupted_q <= 2'b00; @@ -544,10 +544,10 @@ module entropy_src_core import entropy_src_pkg::*; #( assign hw2reg.recov_alert_sts.module_enable_field_alert.de = es_enable_pfa; assign hw2reg.recov_alert_sts.module_enable_field_alert.d = es_enable_pfa; - prim_mubi4_sync #( + caliptra_prim_mubi4_sync #( .NumCopies(3), .AsyncOn(0) - ) u_prim_mubi4_sync_entropy_module_en ( + ) u_caliptra_prim_mubi4_sync_entropy_module_en ( .clk_i, .rst_ni, .mubi_i(mubi_module_en_raw), @@ -580,10 +580,10 @@ module entropy_src_core import entropy_src_pkg::*; #( assign es_enable_fo[i] = mubi4_test_true_strict(mubi_es_enable_fanout[i]); end : gen_mubi_en_copies - prim_mubi4_sync #( + caliptra_prim_mubi4_sync #( .NumCopies(EsEnableCopies), .AsyncOn(0) - ) u_prim_mubi4_sync_es_enable ( + ) u_caliptra_prim_mubi4_sync_es_enable ( .clk_i, .rst_ni, .mubi_i(mubi_es_enable), @@ -594,10 +594,10 @@ module entropy_src_core import entropy_src_pkg::*; #( assign module_en_pulse_fo[i] = mubi4_test_true_strict(mubi_module_en_pulse_fanout[i]); end : gen_mubi_en_pulse_copies - prim_mubi4_sync #( + caliptra_prim_mubi4_sync #( .NumCopies(EsEnPulseCopies), .AsyncOn(0) - ) u_prim_mubi4_sync_es_enable_pulse ( + ) u_caliptra_prim_mubi4_sync_es_enable_pulse ( .clk_i, .rst_ni, .mubi_i(mubi_module_en_pulse), @@ -625,10 +625,10 @@ module entropy_src_core import entropy_src_pkg::*; #( assign hw2reg.recov_alert_sts.fips_enable_field_alert.de = fips_enable_pfa; assign hw2reg.recov_alert_sts.fips_enable_field_alert.d = fips_enable_pfa; - prim_mubi4_sync #( + caliptra_prim_mubi4_sync #( .NumCopies(2), .AsyncOn(0) - ) u_prim_mubi4_sync_entropy_fips_en ( + ) u_caliptra_prim_mubi4_sync_entropy_fips_en ( .clk_i, .rst_ni, .mubi_i(mubi_fips_en), @@ -644,10 +644,10 @@ module entropy_src_core import entropy_src_pkg::*; #( assign hw2reg.recov_alert_sts.entropy_data_reg_en_field_alert.de = entropy_data_reg_en_pfa; assign hw2reg.recov_alert_sts.entropy_data_reg_en_field_alert.d = entropy_data_reg_en_pfa; - prim_mubi4_sync #( + caliptra_prim_mubi4_sync #( .NumCopies(2), .AsyncOn(0) - ) u_prim_mubi4_sync_entropy_data_reg_en ( + ) u_caliptra_prim_mubi4_sync_entropy_data_reg_en ( .clk_i, .rst_ni, .mubi_i(mubi_entropy_reg_en), @@ -665,10 +665,10 @@ module entropy_src_core import entropy_src_pkg::*; #( assign hw2reg.recov_alert_sts.fw_ov_mode_field_alert.de = fw_ov_mode_pfa; assign hw2reg.recov_alert_sts.fw_ov_mode_field_alert.d = fw_ov_mode_pfa; - prim_mubi4_sync #( + caliptra_prim_mubi4_sync #( .NumCopies(2), .AsyncOn(0) - ) u_prim_mubi4_sync_fw_ov_mode ( + ) u_caliptra_prim_mubi4_sync_fw_ov_mode ( .clk_i, .rst_ni, .mubi_i(mubi_fw_ov_mode), @@ -684,10 +684,10 @@ module entropy_src_core import entropy_src_pkg::*; #( assign hw2reg.recov_alert_sts.fw_ov_entropy_insert_field_alert.de = fw_ov_entropy_insert_pfa; assign hw2reg.recov_alert_sts.fw_ov_entropy_insert_field_alert.d = fw_ov_entropy_insert_pfa; - prim_mubi4_sync #( + caliptra_prim_mubi4_sync #( .NumCopies(2), .AsyncOn(0) - ) u_prim_mubi4_sync_fw_ov_entropy_insert ( + ) u_caliptra_prim_mubi4_sync_fw_ov_entropy_insert ( .clk_i, .rst_ni, .mubi_i(mubi_fw_ov_entropy_insert), @@ -703,10 +703,10 @@ module entropy_src_core import entropy_src_pkg::*; #( assign hw2reg.recov_alert_sts.fw_ov_sha3_start_field_alert.de = fw_ov_sha3_start_pfa; assign hw2reg.recov_alert_sts.fw_ov_sha3_start_field_alert.d = fw_ov_sha3_start_pfa; - prim_mubi4_sync #( + caliptra_prim_mubi4_sync #( .NumCopies(2), .AsyncOn(0) - ) u_prim_mubi4_sync_fw_ov_sha3_start ( + ) u_caliptra_prim_mubi4_sync_fw_ov_sha3_start ( .clk_i, .rst_ni, .mubi_i(mubi_fw_ov_sha3_start), @@ -721,12 +721,12 @@ module entropy_src_core import entropy_src_pkg::*; #( assign fw_ov_fifo_wr_pulse = reg2hw.fw_ov_wr_data.qe; assign fw_ov_wr_data = reg2hw.fw_ov_wr_data.q; - assign efuse_es_sw_ov_en = prim_mubi_pkg::mubi8_test_true_strict(en_entropy_src_fw_over); + assign efuse_es_sw_ov_en = caliptra_prim_mubi_pkg::mubi8_test_true_strict(en_entropy_src_fw_over); - prim_mubi8_sync #( + caliptra_prim_mubi8_sync #( .NumCopies(1), .AsyncOn(1) // must be set to one, see note below - ) u_prim_mubi8_sync_es_fw_over ( + ) u_caliptra_prim_mubi8_sync_es_fw_over ( .clk_i, .rst_ni, .mubi_i(otp_en_entropy_src_fw_over_i), @@ -749,7 +749,7 @@ module entropy_src_core import entropy_src_pkg::*; #( // instantiate interrupt hardware primitives //-------------------------------------------- - prim_intr_hw #( + caliptra_prim_intr_hw #( .Width(1) ) u_intr_hw_es_entropy_valid ( .clk_i (clk_i), @@ -764,7 +764,7 @@ module entropy_src_core import entropy_src_pkg::*; #( .intr_o (intr_es_entropy_valid_o) ); - prim_intr_hw #( + caliptra_prim_intr_hw #( .Width(1) ) u_intr_hw_es_health_test_failed ( .clk_i (clk_i), @@ -780,7 +780,7 @@ module entropy_src_core import entropy_src_pkg::*; #( ); - prim_intr_hw #( + caliptra_prim_intr_hw #( .Width(1) ) u_intr_hw_es_observe_fifo_ready ( .clk_i (clk_i), @@ -795,7 +795,7 @@ module entropy_src_core import entropy_src_pkg::*; #( .intr_o (intr_es_observe_fifo_ready_o) ); - prim_intr_hw #( + caliptra_prim_intr_hw #( .Width(1) ) u_intr_hw_es_fatal_err ( .clk_i (clk_i), @@ -827,7 +827,7 @@ module entropy_src_core import entropy_src_pkg::*; #( sfifo_test_err_sum) ) || es_ack_sm_err_sum || es_main_sm_err_sum || - es_cntr_err_sum || // prim_count err is always active + es_cntr_err_sum || // caliptra_prim_count err is always active sha3_rst_storage_err_sum || sha3_state_error_sum; @@ -935,7 +935,7 @@ module entropy_src_core import entropy_src_pkg::*; #( assign hw2reg.debug_status.sha3_block_pr.d = sha3_block_processed; assign hw2reg.debug_status.sha3_squeezing.d = sha3_squeezing; assign hw2reg.debug_status.sha3_absorbed.d = - prim_mubi_pkg::mubi4_test_true_strict(sha3_absorbed) ? 1'b 1 : 1'b 0; + caliptra_prim_mubi_pkg::mubi4_test_true_strict(sha3_absorbed) ? 1'b 1 : 1'b 0; assign hw2reg.debug_status.sha3_err.d = sha3_err_q; assign sha3_err_d = @@ -961,11 +961,11 @@ module entropy_src_core import entropy_src_pkg::*; #( //-------------------------------------------- - prim_fifo_sync #( + caliptra_prim_fifo_sync #( .Width(RngBusWidth), .Pass(0), .Depth(2) - ) u_prim_fifo_sync_esrng ( + ) u_caliptra_prim_fifo_sync_esrng ( .clk_i (clk_i), .rst_ni (rst_ni), .clr_i (sfifo_esrng_clr), @@ -989,7 +989,7 @@ module entropy_src_core import entropy_src_pkg::*; #( pfifo_postht_not_full ); // fifo err - // Note: for prim_fifo_sync is not an error to push to a fifo that is full. In fact, the + // Note: for caliptra_prim_fifo_sync is not an error to push to a fifo that is full. In fact, the // backpressure mechanism applied to the RNG inputs counts on this. assign sfifo_esrng_err = {1'b0, @@ -1006,10 +1006,10 @@ module entropy_src_core import entropy_src_pkg::*; #( assign hw2reg.recov_alert_sts.rng_bit_enable_field_alert.de = rng_bit_enable_pfa; assign hw2reg.recov_alert_sts.rng_bit_enable_field_alert.d = rng_bit_enable_pfa; - prim_mubi4_sync #( + caliptra_prim_mubi4_sync #( .NumCopies(2), .AsyncOn(0) - ) u_prim_mubi4_sync_rng_bit_en ( + ) u_caliptra_prim_mubi4_sync_rng_bit_en ( .clk_i, .rst_ni, .mubi_i(mubi_rng_bit_en), @@ -1020,11 +1020,11 @@ module entropy_src_core import entropy_src_pkg::*; #( assign rng_bit_en = rng_bit_enable_pfe; assign rng_bit_sel = reg2hw.conf.rng_bit_sel.q; - prim_packer_fifo #( + caliptra_prim_packer_fifo #( .InW(1), .OutW(RngBusWidth), .ClearOnRead(1'b0) - ) u_prim_packer_fifo_esbit ( + ) u_caliptra_prim_packer_fifo_esbit ( .clk_i (clk_i), .rst_ni (rst_ni), .clr_i (pfifo_esbit_clr), @@ -1422,10 +1422,10 @@ module entropy_src_core import entropy_src_pkg::*; #( assign hw2reg.recov_alert_sts.es_route_field_alert.de = es_route_pfa; assign hw2reg.recov_alert_sts.es_route_field_alert.d = es_route_pfa; - prim_mubi4_sync #( + caliptra_prim_mubi4_sync #( .NumCopies(2), .AsyncOn(0) - ) u_prim_mubi4_sync_es_route ( + ) u_caliptra_prim_mubi4_sync_es_route ( .clk_i, .rst_ni, .mubi_i(mubi_es_route), @@ -1441,10 +1441,10 @@ module entropy_src_core import entropy_src_pkg::*; #( assign hw2reg.recov_alert_sts.es_type_field_alert.de = es_type_pfa; assign hw2reg.recov_alert_sts.es_type_field_alert.d = es_type_pfa; - prim_mubi4_sync #( + caliptra_prim_mubi4_sync #( .NumCopies(2), .AsyncOn(0) - ) u_prim_mubi4_sync_es_type ( + ) u_caliptra_prim_mubi4_sync_es_type ( .clk_i, .rst_ni, .mubi_i(mubi_es_type), @@ -1474,9 +1474,9 @@ module entropy_src_core import entropy_src_pkg::*; #( // Window counter // SEC_CM: CTR.REDUN - prim_count #( + caliptra_prim_count #( .Width(HalfRegWidth) - ) u_prim_count_window_cntr ( + ) u_caliptra_prim_count_window_cntr ( .clk_i, .rst_ni, .clr_i(!es_delayed_enable), @@ -2079,11 +2079,11 @@ module entropy_src_core import entropy_src_pkg::*; #( (any_fail_count >= alert_threshold) && (alert_threshold != '0); - prim_edge_detector #( + caliptra_prim_edge_detector #( .Width(1), .ResetValue(0), .EnSync(0) - ) u_prim_edge_detector_recov_alert ( + ) u_caliptra_prim_edge_detector_recov_alert ( .clk_i, .rst_ni, .d_i(recov_alert_state), @@ -2262,11 +2262,11 @@ module entropy_src_core import entropy_src_pkg::*; #( // pack tested entropy into 32 bit packer //-------------------------------------------- - prim_packer_fifo #( + caliptra_prim_packer_fifo #( .InW(RngBusWidth), .OutW(PostHTWidth), .ClearOnRead(1'b0) - ) u_prim_packer_fifo_postht ( + ) u_caliptra_prim_packer_fifo_postht ( .clk_i (clk_i), .rst_ni (rst_ni), .clr_i (pfifo_postht_clr), @@ -2305,11 +2305,11 @@ module entropy_src_core import entropy_src_pkg::*; #( // store entropy into a 64 entry deep FIFO //-------------------------------------------- - prim_fifo_sync #( + caliptra_prim_fifo_sync #( .Width(ObserveFifoWidth), .Pass(0), .Depth(ObserveFifoDepth) - ) u_prim_fifo_sync_observe ( + ) u_caliptra_prim_fifo_sync_observe ( .clk_i (clk_i), .rst_ni (rst_ni), .clr_i (sfifo_observe_clr), @@ -2373,11 +2373,11 @@ module entropy_src_core import entropy_src_pkg::*; #( // pack entropy into 64 bit packer //-------------------------------------------- - prim_packer_fifo #( + caliptra_prim_packer_fifo #( .InW(ObserveFifoWidth), .OutW(PreCondWidth), .ClearOnRead(1'b0) - ) u_prim_packer_fifo_precon ( + ) u_caliptra_prim_packer_fifo_precon ( .clk_i (clk_i), .rst_ni (rst_ni), .clr_i (pfifo_precon_clr), @@ -2512,11 +2512,11 @@ module entropy_src_core import entropy_src_pkg::*; #( // bypass SHA conditioner path //-------------------------------------------- - prim_packer_fifo #( + caliptra_prim_packer_fifo #( .InW(PostHTWidth), .OutW(SeedLen), .ClearOnRead(1'b0) - ) u_prim_packer_fifo_bypass ( + ) u_caliptra_prim_packer_fifo_bypass ( .clk_i (clk_i), .rst_ni (rst_ni), .clr_i (pfifo_bypass_clr), @@ -2645,11 +2645,11 @@ module entropy_src_core import entropy_src_pkg::*; #( // send processed entropy to final fifo //-------------------------------------------- - prim_fifo_sync #( + caliptra_prim_fifo_sync #( .Width(1+SeedLen), .Pass(0), .Depth(EsFifoDepth) - ) u_prim_fifo_sync_esfinal ( + ) u_caliptra_prim_fifo_sync_esfinal ( .clk_i (clk_i), .rst_ni (rst_ni), .clr_i (sfifo_esfinal_clr), @@ -2679,7 +2679,7 @@ module entropy_src_core import entropy_src_pkg::*; #( assign {esfinal_fips_flag,esfinal_data} = sfifo_esfinal_rdata; // fifo err - // Note: for prim_fifo_sync is not an error to push to a fifo that is full. In fact, the + // Note: for caliptra_prim_fifo_sync is not an error to push to a fifo that is full. In fact, the // backpressure mechanism applied to the previous FIFO counts on this. assign sfifo_esfinal_err = {1'b0, @@ -2733,11 +2733,11 @@ module entropy_src_core import entropy_src_pkg::*; #( // software es read path //-------------------------------------------- - prim_packer_fifo #( + caliptra_prim_packer_fifo #( .InW(SeedLen), .OutW(FullRegWidth), .ClearOnRead(1'b0) - ) u_prim_packer_fifo_swread ( + ) u_caliptra_prim_packer_fifo_swread ( .clk_i (clk_i), .rst_ni (rst_ni), .clr_i (pfifo_swread_clr), @@ -2761,12 +2761,12 @@ module entropy_src_core import entropy_src_pkg::*; #( assign hw2reg.entropy_data.d = es_data_reg_rd_en ? pfifo_swread_rdata : '0; assign sw_es_rd_pulse = es_data_reg_rd_en && reg2hw.entropy_data.re; - assign efuse_es_sw_reg_en = prim_mubi_pkg::mubi8_test_true_strict(en_entropy_src_fw_read); + assign efuse_es_sw_reg_en = caliptra_prim_mubi_pkg::mubi8_test_true_strict(en_entropy_src_fw_read); - prim_mubi8_sync #( + caliptra_prim_mubi8_sync #( .NumCopies(1), .AsyncOn(1) // must be set to one, see note below - ) u_prim_mubi8_sync_es_fw_read ( + ) u_caliptra_prim_mubi8_sync_es_fw_read ( .clk_i, .rst_ni, .mubi_i(otp_en_entropy_src_fw_read_i), diff --git a/src/entropy_src/rtl/entropy_src_enable_delay.sv b/src/entropy_src/rtl/entropy_src_enable_delay.sv index dc23fbc45..aab25ab79 100644 --- a/src/entropy_src/rtl/entropy_src_enable_delay.sv +++ b/src/entropy_src/rtl/entropy_src_enable_delay.sv @@ -30,7 +30,7 @@ // 2b. One clock after the SHA engine completes, // Whichever comes later. -module entropy_src_enable_delay import prim_mubi_pkg::*; ( +module entropy_src_enable_delay import caliptra_prim_mubi_pkg::*; ( input logic clk_i, input logic rst_ni, @@ -70,7 +70,7 @@ module entropy_src_enable_delay import prim_mubi_pkg::*; ( if (!rst_ni) begin sha3_active_post_en_q <= 1'b0; fifo_timer_q <= '0; - sha3_done_q <= prim_mubi_pkg::MuBi4False; + sha3_done_q <= caliptra_prim_mubi_pkg::MuBi4False; extend_enable_q <= 1'b0; end else begin sha3_active_post_en_q <= sha3_active_post_en_d; diff --git a/src/entropy_src/rtl/entropy_src_main_sm.sv b/src/entropy_src/rtl/entropy_src_main_sm.sv index 23f397ebe..fd223f1bb 100644 --- a/src/entropy_src/rtl/entropy_src_main_sm.sv +++ b/src/entropy_src/rtl/entropy_src_main_sm.sv @@ -28,7 +28,7 @@ module entropy_src_main_sm output logic boot_phase_done_o, output logic sha3_start_o, output logic sha3_process_o, - output prim_mubi_pkg::mubi4_t sha3_done_o, + output caliptra_prim_mubi_pkg::mubi4_t sha3_done_o, output logic cs_aes_halt_req_o, input logic cs_aes_halt_ack_i, input logic local_escalate_i, @@ -41,7 +41,7 @@ module entropy_src_main_sm // The definition of state_e, the sparse FSM state enum, is in entropy_src_main_sm_pkg.sv state_e state_d, state_q; - `PRIM_FLOP_SPARSE_FSM(u_state_regs, state_d, state_q, state_e, Idle) + `CALIPTRA_PRIM_FLOP_SPARSE_FSM(u_state_regs, state_d, state_q, state_e, Idle) assign main_sm_state_o = state_q; @@ -53,7 +53,7 @@ module entropy_src_main_sm boot_phase_done_o = 1'b0; sha3_start_o = 1'b0; sha3_process_o = 1'b0; - sha3_done_o = prim_mubi_pkg::MuBi4False; + sha3_done_o = caliptra_prim_mubi_pkg::MuBi4False; cs_aes_halt_req_o = 1'b0; main_sm_alert_o = 1'b0; main_sm_idle_o = 1'b0; @@ -240,11 +240,11 @@ module entropy_src_main_sm end Sha3Done: begin if (!enable_i) begin - sha3_done_o = prim_mubi_pkg::MuBi4True; + sha3_done_o = caliptra_prim_mubi_pkg::MuBi4True; state_d = Sha3MsgDone; end else begin if (main_stage_rdy_i) begin - sha3_done_o = prim_mubi_pkg::MuBi4True; + sha3_done_o = caliptra_prim_mubi_pkg::MuBi4True; main_stage_push_o = 1'b1; state_d = Sha3MsgDone; end diff --git a/src/entropy_src/rtl/entropy_src_markov_ht.sv b/src/entropy_src/rtl/entropy_src_markov_ht.sv index 647669380..dd9ebfb01 100644 --- a/src/entropy_src/rtl/entropy_src_markov_ht.sv +++ b/src/entropy_src/rtl/entropy_src_markov_ht.sv @@ -70,9 +70,9 @@ module entropy_src_markov_ht #( (prev_sample_q[sh] == !entropy_bit_i[sh]); // pair counter - prim_count #( + caliptra_prim_count #( .Width(RegWidth) - ) u_prim_count_pair_cntr ( + ) u_caliptra_prim_count_pair_cntr ( .clk_i, .rst_ni, .clr_i(window_wrap_pulse_i), @@ -94,7 +94,7 @@ module entropy_src_markov_ht #( toggle_q; // determine the highest counter pair counter value - prim_max_tree #( + caliptra_prim_max_tree #( .NumSrc(RngBusWidth), .Width(RegWidth) ) u_max ( @@ -108,9 +108,9 @@ module entropy_src_markov_ht #( ); // determine the lowest counter pair counter value - // Negate the inputs and outputs of prim_max_tree to find the minimum + // Negate the inputs and outputs of caliptra_prim_max_tree to find the minimum // For this unsigned application, one's complement negation (i.e. logical inversion) is fine. - prim_max_tree #( + caliptra_prim_max_tree #( .NumSrc(RngBusWidth), .Width(RegWidth) ) u_min ( @@ -126,7 +126,7 @@ module entropy_src_markov_ht #( // Invert the output back. assign pair_cntr_min = ~pair_cntr_min_tmp; - prim_sum_tree #( + caliptra_prim_sum_tree #( .NumSrc(RngBusWidth), .Width(RegWidth) ) u_sum ( diff --git a/src/entropy_src/rtl/entropy_src_reg_top.sv b/src/entropy_src/rtl/entropy_src_reg_top.sv index e50577687..e443608a4 100644 --- a/src/entropy_src/rtl/entropy_src_reg_top.sv +++ b/src/entropy_src/rtl/entropy_src_reg_top.sv @@ -4,7 +4,7 @@ // // Register Top module auto-generated by `reggen` -`include "prim_assert.sv" +`include "caliptra_prim_assert.sv" module entropy_src_reg_top #( parameter AHBDataWidth = 64, @@ -67,9 +67,9 @@ module entropy_src_reg_top #( // also check for spurious write enables logic reg_we_err; logic [56:0] reg_we_check; - prim_reg_we_check #( + caliptra_prim_reg_we_check #( .OneHotWidth(57) - ) u_prim_reg_we_check ( + ) u_caliptra_prim_reg_we_check ( .clk_i(clk_i), .rst_ni(rst_ni), .oh_i (reg_we_check), @@ -409,9 +409,9 @@ module entropy_src_reg_top #( // Register instances // R[intr_state]: V(False) // F[es_entropy_valid]: 0:0 - prim_subreg #( + caliptra_prim_subreg #( .DW (1), - .SwAccess(prim_subreg_pkg::SwAccessW1C), + .SwAccess(caliptra_prim_subreg_pkg::SwAccessW1C), .RESVAL (1'h0) ) u_intr_state_es_entropy_valid ( .clk_i (clk_i), @@ -435,9 +435,9 @@ module entropy_src_reg_top #( ); // F[es_health_test_failed]: 1:1 - prim_subreg #( + caliptra_prim_subreg #( .DW (1), - .SwAccess(prim_subreg_pkg::SwAccessW1C), + .SwAccess(caliptra_prim_subreg_pkg::SwAccessW1C), .RESVAL (1'h0) ) u_intr_state_es_health_test_failed ( .clk_i (clk_i), @@ -461,9 +461,9 @@ module entropy_src_reg_top #( ); // F[es_observe_fifo_ready]: 2:2 - prim_subreg #( + caliptra_prim_subreg #( .DW (1), - .SwAccess(prim_subreg_pkg::SwAccessW1C), + .SwAccess(caliptra_prim_subreg_pkg::SwAccessW1C), .RESVAL (1'h0) ) u_intr_state_es_observe_fifo_ready ( .clk_i (clk_i), @@ -487,9 +487,9 @@ module entropy_src_reg_top #( ); // F[es_fatal_err]: 3:3 - prim_subreg #( + caliptra_prim_subreg #( .DW (1), - .SwAccess(prim_subreg_pkg::SwAccessW1C), + .SwAccess(caliptra_prim_subreg_pkg::SwAccessW1C), .RESVAL (1'h0) ) u_intr_state_es_fatal_err ( .clk_i (clk_i), @@ -515,9 +515,9 @@ module entropy_src_reg_top #( // R[intr_enable]: V(False) // F[es_entropy_valid]: 0:0 - prim_subreg #( + caliptra_prim_subreg #( .DW (1), - .SwAccess(prim_subreg_pkg::SwAccessRW), + .SwAccess(caliptra_prim_subreg_pkg::SwAccessRW), .RESVAL (1'h0) ) u_intr_enable_es_entropy_valid ( .clk_i (clk_i), @@ -541,9 +541,9 @@ module entropy_src_reg_top #( ); // F[es_health_test_failed]: 1:1 - prim_subreg #( + caliptra_prim_subreg #( .DW (1), - .SwAccess(prim_subreg_pkg::SwAccessRW), + .SwAccess(caliptra_prim_subreg_pkg::SwAccessRW), .RESVAL (1'h0) ) u_intr_enable_es_health_test_failed ( .clk_i (clk_i), @@ -567,9 +567,9 @@ module entropy_src_reg_top #( ); // F[es_observe_fifo_ready]: 2:2 - prim_subreg #( + caliptra_prim_subreg #( .DW (1), - .SwAccess(prim_subreg_pkg::SwAccessRW), + .SwAccess(caliptra_prim_subreg_pkg::SwAccessRW), .RESVAL (1'h0) ) u_intr_enable_es_observe_fifo_ready ( .clk_i (clk_i), @@ -593,9 +593,9 @@ module entropy_src_reg_top #( ); // F[es_fatal_err]: 3:3 - prim_subreg #( + caliptra_prim_subreg #( .DW (1), - .SwAccess(prim_subreg_pkg::SwAccessRW), + .SwAccess(caliptra_prim_subreg_pkg::SwAccessRW), .RESVAL (1'h0) ) u_intr_enable_es_fatal_err ( .clk_i (clk_i), @@ -624,7 +624,7 @@ module entropy_src_reg_top #( logic [3:0] intr_test_flds_we; assign intr_test_qe = &intr_test_flds_we; // F[es_entropy_valid]: 0:0 - prim_subreg_ext #( + caliptra_prim_subreg_ext #( .DW (1) ) u_intr_test_es_entropy_valid ( .re (1'b0), @@ -640,7 +640,7 @@ module entropy_src_reg_top #( assign reg2hw.intr_test.es_entropy_valid.qe = intr_test_qe; // F[es_health_test_failed]: 1:1 - prim_subreg_ext #( + caliptra_prim_subreg_ext #( .DW (1) ) u_intr_test_es_health_test_failed ( .re (1'b0), @@ -656,7 +656,7 @@ module entropy_src_reg_top #( assign reg2hw.intr_test.es_health_test_failed.qe = intr_test_qe; // F[es_observe_fifo_ready]: 2:2 - prim_subreg_ext #( + caliptra_prim_subreg_ext #( .DW (1) ) u_intr_test_es_observe_fifo_ready ( .re (1'b0), @@ -672,7 +672,7 @@ module entropy_src_reg_top #( assign reg2hw.intr_test.es_observe_fifo_ready.qe = intr_test_qe; // F[es_fatal_err]: 3:3 - prim_subreg_ext #( + caliptra_prim_subreg_ext #( .DW (1) ) u_intr_test_es_fatal_err ( .re (1'b0), @@ -693,7 +693,7 @@ module entropy_src_reg_top #( logic [1:0] alert_test_flds_we; assign alert_test_qe = &alert_test_flds_we; // F[recov_alert]: 0:0 - prim_subreg_ext #( + caliptra_prim_subreg_ext #( .DW (1) ) u_alert_test_recov_alert ( .re (1'b0), @@ -709,7 +709,7 @@ module entropy_src_reg_top #( assign reg2hw.alert_test.recov_alert.qe = alert_test_qe; // F[fatal_alert]: 1:1 - prim_subreg_ext #( + caliptra_prim_subreg_ext #( .DW (1) ) u_alert_test_fatal_alert ( .re (1'b0), @@ -726,9 +726,9 @@ module entropy_src_reg_top #( // R[me_regwen]: V(False) - prim_subreg #( + caliptra_prim_subreg #( .DW (1), - .SwAccess(prim_subreg_pkg::SwAccessW0C), + .SwAccess(caliptra_prim_subreg_pkg::SwAccessW0C), .RESVAL (1'h1) ) u_me_regwen ( .clk_i (clk_i), @@ -753,9 +753,9 @@ module entropy_src_reg_top #( // R[sw_regupd]: V(False) - prim_subreg #( + caliptra_prim_subreg #( .DW (1), - .SwAccess(prim_subreg_pkg::SwAccessW0C), + .SwAccess(caliptra_prim_subreg_pkg::SwAccessW0C), .RESVAL (1'h1) ) u_sw_regupd ( .clk_i (clk_i), @@ -780,9 +780,9 @@ module entropy_src_reg_top #( // R[regwen]: V(False) - prim_subreg #( + caliptra_prim_subreg #( .DW (1), - .SwAccess(prim_subreg_pkg::SwAccessRO), + .SwAccess(caliptra_prim_subreg_pkg::SwAccessRO), .RESVAL (1'h1) ) u_regwen ( .clk_i (clk_i), @@ -824,9 +824,9 @@ module entropy_src_reg_top #( // Create REGWEN-gated WE signal logic module_enable_gated_we; assign module_enable_gated_we = module_enable_we & me_regwen_qs; - prim_subreg #( + caliptra_prim_subreg #( .DW (4), - .SwAccess(prim_subreg_pkg::SwAccessRW), + .SwAccess(caliptra_prim_subreg_pkg::SwAccessRW), .RESVAL (4'h9) ) u_module_enable ( .clk_i (clk_i), @@ -855,9 +855,9 @@ module entropy_src_reg_top #( logic conf_gated_we; assign conf_gated_we = conf_we & regwen_qs; // F[fips_enable]: 3:0 - prim_subreg #( + caliptra_prim_subreg #( .DW (4), - .SwAccess(prim_subreg_pkg::SwAccessRW), + .SwAccess(caliptra_prim_subreg_pkg::SwAccessRW), .RESVAL (4'h9) ) u_conf_fips_enable ( .clk_i (clk_i), @@ -881,9 +881,9 @@ module entropy_src_reg_top #( ); // F[entropy_data_reg_enable]: 7:4 - prim_subreg #( + caliptra_prim_subreg #( .DW (4), - .SwAccess(prim_subreg_pkg::SwAccessRW), + .SwAccess(caliptra_prim_subreg_pkg::SwAccessRW), .RESVAL (4'h9) ) u_conf_entropy_data_reg_enable ( .clk_i (clk_i), @@ -907,9 +907,9 @@ module entropy_src_reg_top #( ); // F[threshold_scope]: 15:12 - prim_subreg #( + caliptra_prim_subreg #( .DW (4), - .SwAccess(prim_subreg_pkg::SwAccessRW), + .SwAccess(caliptra_prim_subreg_pkg::SwAccessRW), .RESVAL (4'h9) ) u_conf_threshold_scope ( .clk_i (clk_i), @@ -933,9 +933,9 @@ module entropy_src_reg_top #( ); // F[rng_bit_enable]: 23:20 - prim_subreg #( + caliptra_prim_subreg #( .DW (4), - .SwAccess(prim_subreg_pkg::SwAccessRW), + .SwAccess(caliptra_prim_subreg_pkg::SwAccessRW), .RESVAL (4'h9) ) u_conf_rng_bit_enable ( .clk_i (clk_i), @@ -959,9 +959,9 @@ module entropy_src_reg_top #( ); // F[rng_bit_sel]: 25:24 - prim_subreg #( + caliptra_prim_subreg #( .DW (2), - .SwAccess(prim_subreg_pkg::SwAccessRW), + .SwAccess(caliptra_prim_subreg_pkg::SwAccessRW), .RESVAL (2'h0) ) u_conf_rng_bit_sel ( .clk_i (clk_i), @@ -990,9 +990,9 @@ module entropy_src_reg_top #( logic entropy_control_gated_we; assign entropy_control_gated_we = entropy_control_we & regwen_qs; // F[es_route]: 3:0 - prim_subreg #( + caliptra_prim_subreg #( .DW (4), - .SwAccess(prim_subreg_pkg::SwAccessRW), + .SwAccess(caliptra_prim_subreg_pkg::SwAccessRW), .RESVAL (4'h9) ) u_entropy_control_es_route ( .clk_i (clk_i), @@ -1016,9 +1016,9 @@ module entropy_src_reg_top #( ); // F[es_type]: 7:4 - prim_subreg #( + caliptra_prim_subreg #( .DW (4), - .SwAccess(prim_subreg_pkg::SwAccessRW), + .SwAccess(caliptra_prim_subreg_pkg::SwAccessRW), .RESVAL (4'h9) ) u_entropy_control_es_type ( .clk_i (clk_i), @@ -1043,7 +1043,7 @@ module entropy_src_reg_top #( // R[entropy_data]: V(True) - prim_subreg_ext #( + caliptra_prim_subreg_ext #( .DW (32) ) u_entropy_data ( .re (entropy_data_re), @@ -1063,9 +1063,9 @@ module entropy_src_reg_top #( logic health_test_windows_gated_we; assign health_test_windows_gated_we = health_test_windows_we & regwen_qs; // F[fips_window]: 15:0 - prim_subreg #( + caliptra_prim_subreg #( .DW (16), - .SwAccess(prim_subreg_pkg::SwAccessRW), + .SwAccess(caliptra_prim_subreg_pkg::SwAccessRW), .RESVAL (16'h200) ) u_health_test_windows_fips_window ( .clk_i (clk_i), @@ -1089,9 +1089,9 @@ module entropy_src_reg_top #( ); // F[bypass_window]: 31:16 - prim_subreg #( + caliptra_prim_subreg #( .DW (16), - .SwAccess(prim_subreg_pkg::SwAccessRW), + .SwAccess(caliptra_prim_subreg_pkg::SwAccessRW), .RESVAL (16'h60) ) u_health_test_windows_bypass_window ( .clk_i (clk_i), @@ -1123,7 +1123,7 @@ module entropy_src_reg_top #( logic repcnt_thresholds_gated_we; assign repcnt_thresholds_gated_we = repcnt_thresholds_we & regwen_qs; // F[fips_thresh]: 15:0 - prim_subreg_ext #( + caliptra_prim_subreg_ext #( .DW (16) ) u_repcnt_thresholds_fips_thresh ( .re (repcnt_thresholds_re), @@ -1139,7 +1139,7 @@ module entropy_src_reg_top #( assign reg2hw.repcnt_thresholds.fips_thresh.qe = repcnt_thresholds_qe; // F[bypass_thresh]: 31:16 - prim_subreg_ext #( + caliptra_prim_subreg_ext #( .DW (16) ) u_repcnt_thresholds_bypass_thresh ( .re (repcnt_thresholds_re), @@ -1163,7 +1163,7 @@ module entropy_src_reg_top #( logic repcnts_thresholds_gated_we; assign repcnts_thresholds_gated_we = repcnts_thresholds_we & regwen_qs; // F[fips_thresh]: 15:0 - prim_subreg_ext #( + caliptra_prim_subreg_ext #( .DW (16) ) u_repcnts_thresholds_fips_thresh ( .re (repcnts_thresholds_re), @@ -1179,7 +1179,7 @@ module entropy_src_reg_top #( assign reg2hw.repcnts_thresholds.fips_thresh.qe = repcnts_thresholds_qe; // F[bypass_thresh]: 31:16 - prim_subreg_ext #( + caliptra_prim_subreg_ext #( .DW (16) ) u_repcnts_thresholds_bypass_thresh ( .re (repcnts_thresholds_re), @@ -1203,7 +1203,7 @@ module entropy_src_reg_top #( logic adaptp_hi_thresholds_gated_we; assign adaptp_hi_thresholds_gated_we = adaptp_hi_thresholds_we & regwen_qs; // F[fips_thresh]: 15:0 - prim_subreg_ext #( + caliptra_prim_subreg_ext #( .DW (16) ) u_adaptp_hi_thresholds_fips_thresh ( .re (adaptp_hi_thresholds_re), @@ -1219,7 +1219,7 @@ module entropy_src_reg_top #( assign reg2hw.adaptp_hi_thresholds.fips_thresh.qe = adaptp_hi_thresholds_qe; // F[bypass_thresh]: 31:16 - prim_subreg_ext #( + caliptra_prim_subreg_ext #( .DW (16) ) u_adaptp_hi_thresholds_bypass_thresh ( .re (adaptp_hi_thresholds_re), @@ -1243,7 +1243,7 @@ module entropy_src_reg_top #( logic adaptp_lo_thresholds_gated_we; assign adaptp_lo_thresholds_gated_we = adaptp_lo_thresholds_we & regwen_qs; // F[fips_thresh]: 15:0 - prim_subreg_ext #( + caliptra_prim_subreg_ext #( .DW (16) ) u_adaptp_lo_thresholds_fips_thresh ( .re (adaptp_lo_thresholds_re), @@ -1259,7 +1259,7 @@ module entropy_src_reg_top #( assign reg2hw.adaptp_lo_thresholds.fips_thresh.qe = adaptp_lo_thresholds_qe; // F[bypass_thresh]: 31:16 - prim_subreg_ext #( + caliptra_prim_subreg_ext #( .DW (16) ) u_adaptp_lo_thresholds_bypass_thresh ( .re (adaptp_lo_thresholds_re), @@ -1283,7 +1283,7 @@ module entropy_src_reg_top #( logic bucket_thresholds_gated_we; assign bucket_thresholds_gated_we = bucket_thresholds_we & regwen_qs; // F[fips_thresh]: 15:0 - prim_subreg_ext #( + caliptra_prim_subreg_ext #( .DW (16) ) u_bucket_thresholds_fips_thresh ( .re (bucket_thresholds_re), @@ -1299,7 +1299,7 @@ module entropy_src_reg_top #( assign reg2hw.bucket_thresholds.fips_thresh.qe = bucket_thresholds_qe; // F[bypass_thresh]: 31:16 - prim_subreg_ext #( + caliptra_prim_subreg_ext #( .DW (16) ) u_bucket_thresholds_bypass_thresh ( .re (bucket_thresholds_re), @@ -1323,7 +1323,7 @@ module entropy_src_reg_top #( logic markov_hi_thresholds_gated_we; assign markov_hi_thresholds_gated_we = markov_hi_thresholds_we & regwen_qs; // F[fips_thresh]: 15:0 - prim_subreg_ext #( + caliptra_prim_subreg_ext #( .DW (16) ) u_markov_hi_thresholds_fips_thresh ( .re (markov_hi_thresholds_re), @@ -1339,7 +1339,7 @@ module entropy_src_reg_top #( assign reg2hw.markov_hi_thresholds.fips_thresh.qe = markov_hi_thresholds_qe; // F[bypass_thresh]: 31:16 - prim_subreg_ext #( + caliptra_prim_subreg_ext #( .DW (16) ) u_markov_hi_thresholds_bypass_thresh ( .re (markov_hi_thresholds_re), @@ -1363,7 +1363,7 @@ module entropy_src_reg_top #( logic markov_lo_thresholds_gated_we; assign markov_lo_thresholds_gated_we = markov_lo_thresholds_we & regwen_qs; // F[fips_thresh]: 15:0 - prim_subreg_ext #( + caliptra_prim_subreg_ext #( .DW (16) ) u_markov_lo_thresholds_fips_thresh ( .re (markov_lo_thresholds_re), @@ -1379,7 +1379,7 @@ module entropy_src_reg_top #( assign reg2hw.markov_lo_thresholds.fips_thresh.qe = markov_lo_thresholds_qe; // F[bypass_thresh]: 31:16 - prim_subreg_ext #( + caliptra_prim_subreg_ext #( .DW (16) ) u_markov_lo_thresholds_bypass_thresh ( .re (markov_lo_thresholds_re), @@ -1403,7 +1403,7 @@ module entropy_src_reg_top #( logic extht_hi_thresholds_gated_we; assign extht_hi_thresholds_gated_we = extht_hi_thresholds_we & regwen_qs; // F[fips_thresh]: 15:0 - prim_subreg_ext #( + caliptra_prim_subreg_ext #( .DW (16) ) u_extht_hi_thresholds_fips_thresh ( .re (extht_hi_thresholds_re), @@ -1419,7 +1419,7 @@ module entropy_src_reg_top #( assign reg2hw.extht_hi_thresholds.fips_thresh.qe = extht_hi_thresholds_qe; // F[bypass_thresh]: 31:16 - prim_subreg_ext #( + caliptra_prim_subreg_ext #( .DW (16) ) u_extht_hi_thresholds_bypass_thresh ( .re (extht_hi_thresholds_re), @@ -1443,7 +1443,7 @@ module entropy_src_reg_top #( logic extht_lo_thresholds_gated_we; assign extht_lo_thresholds_gated_we = extht_lo_thresholds_we & regwen_qs; // F[fips_thresh]: 15:0 - prim_subreg_ext #( + caliptra_prim_subreg_ext #( .DW (16) ) u_extht_lo_thresholds_fips_thresh ( .re (extht_lo_thresholds_re), @@ -1459,7 +1459,7 @@ module entropy_src_reg_top #( assign reg2hw.extht_lo_thresholds.fips_thresh.qe = extht_lo_thresholds_qe; // F[bypass_thresh]: 31:16 - prim_subreg_ext #( + caliptra_prim_subreg_ext #( .DW (16) ) u_extht_lo_thresholds_bypass_thresh ( .re (extht_lo_thresholds_re), @@ -1477,7 +1477,7 @@ module entropy_src_reg_top #( // R[repcnt_hi_watermarks]: V(True) // F[fips_watermark]: 15:0 - prim_subreg_ext #( + caliptra_prim_subreg_ext #( .DW (16) ) u_repcnt_hi_watermarks_fips_watermark ( .re (repcnt_hi_watermarks_re), @@ -1492,7 +1492,7 @@ module entropy_src_reg_top #( ); // F[bypass_watermark]: 31:16 - prim_subreg_ext #( + caliptra_prim_subreg_ext #( .DW (16) ) u_repcnt_hi_watermarks_bypass_watermark ( .re (repcnt_hi_watermarks_re), @@ -1509,7 +1509,7 @@ module entropy_src_reg_top #( // R[repcnts_hi_watermarks]: V(True) // F[fips_watermark]: 15:0 - prim_subreg_ext #( + caliptra_prim_subreg_ext #( .DW (16) ) u_repcnts_hi_watermarks_fips_watermark ( .re (repcnts_hi_watermarks_re), @@ -1524,7 +1524,7 @@ module entropy_src_reg_top #( ); // F[bypass_watermark]: 31:16 - prim_subreg_ext #( + caliptra_prim_subreg_ext #( .DW (16) ) u_repcnts_hi_watermarks_bypass_watermark ( .re (repcnts_hi_watermarks_re), @@ -1541,7 +1541,7 @@ module entropy_src_reg_top #( // R[adaptp_hi_watermarks]: V(True) // F[fips_watermark]: 15:0 - prim_subreg_ext #( + caliptra_prim_subreg_ext #( .DW (16) ) u_adaptp_hi_watermarks_fips_watermark ( .re (adaptp_hi_watermarks_re), @@ -1556,7 +1556,7 @@ module entropy_src_reg_top #( ); // F[bypass_watermark]: 31:16 - prim_subreg_ext #( + caliptra_prim_subreg_ext #( .DW (16) ) u_adaptp_hi_watermarks_bypass_watermark ( .re (adaptp_hi_watermarks_re), @@ -1573,7 +1573,7 @@ module entropy_src_reg_top #( // R[adaptp_lo_watermarks]: V(True) // F[fips_watermark]: 15:0 - prim_subreg_ext #( + caliptra_prim_subreg_ext #( .DW (16) ) u_adaptp_lo_watermarks_fips_watermark ( .re (adaptp_lo_watermarks_re), @@ -1588,7 +1588,7 @@ module entropy_src_reg_top #( ); // F[bypass_watermark]: 31:16 - prim_subreg_ext #( + caliptra_prim_subreg_ext #( .DW (16) ) u_adaptp_lo_watermarks_bypass_watermark ( .re (adaptp_lo_watermarks_re), @@ -1605,7 +1605,7 @@ module entropy_src_reg_top #( // R[extht_hi_watermarks]: V(True) // F[fips_watermark]: 15:0 - prim_subreg_ext #( + caliptra_prim_subreg_ext #( .DW (16) ) u_extht_hi_watermarks_fips_watermark ( .re (extht_hi_watermarks_re), @@ -1620,7 +1620,7 @@ module entropy_src_reg_top #( ); // F[bypass_watermark]: 31:16 - prim_subreg_ext #( + caliptra_prim_subreg_ext #( .DW (16) ) u_extht_hi_watermarks_bypass_watermark ( .re (extht_hi_watermarks_re), @@ -1637,7 +1637,7 @@ module entropy_src_reg_top #( // R[extht_lo_watermarks]: V(True) // F[fips_watermark]: 15:0 - prim_subreg_ext #( + caliptra_prim_subreg_ext #( .DW (16) ) u_extht_lo_watermarks_fips_watermark ( .re (extht_lo_watermarks_re), @@ -1652,7 +1652,7 @@ module entropy_src_reg_top #( ); // F[bypass_watermark]: 31:16 - prim_subreg_ext #( + caliptra_prim_subreg_ext #( .DW (16) ) u_extht_lo_watermarks_bypass_watermark ( .re (extht_lo_watermarks_re), @@ -1669,7 +1669,7 @@ module entropy_src_reg_top #( // R[bucket_hi_watermarks]: V(True) // F[fips_watermark]: 15:0 - prim_subreg_ext #( + caliptra_prim_subreg_ext #( .DW (16) ) u_bucket_hi_watermarks_fips_watermark ( .re (bucket_hi_watermarks_re), @@ -1684,7 +1684,7 @@ module entropy_src_reg_top #( ); // F[bypass_watermark]: 31:16 - prim_subreg_ext #( + caliptra_prim_subreg_ext #( .DW (16) ) u_bucket_hi_watermarks_bypass_watermark ( .re (bucket_hi_watermarks_re), @@ -1701,7 +1701,7 @@ module entropy_src_reg_top #( // R[markov_hi_watermarks]: V(True) // F[fips_watermark]: 15:0 - prim_subreg_ext #( + caliptra_prim_subreg_ext #( .DW (16) ) u_markov_hi_watermarks_fips_watermark ( .re (markov_hi_watermarks_re), @@ -1716,7 +1716,7 @@ module entropy_src_reg_top #( ); // F[bypass_watermark]: 31:16 - prim_subreg_ext #( + caliptra_prim_subreg_ext #( .DW (16) ) u_markov_hi_watermarks_bypass_watermark ( .re (markov_hi_watermarks_re), @@ -1733,7 +1733,7 @@ module entropy_src_reg_top #( // R[markov_lo_watermarks]: V(True) // F[fips_watermark]: 15:0 - prim_subreg_ext #( + caliptra_prim_subreg_ext #( .DW (16) ) u_markov_lo_watermarks_fips_watermark ( .re (markov_lo_watermarks_re), @@ -1748,7 +1748,7 @@ module entropy_src_reg_top #( ); // F[bypass_watermark]: 31:16 - prim_subreg_ext #( + caliptra_prim_subreg_ext #( .DW (16) ) u_markov_lo_watermarks_bypass_watermark ( .re (markov_lo_watermarks_re), @@ -1764,7 +1764,7 @@ module entropy_src_reg_top #( // R[repcnt_total_fails]: V(True) - prim_subreg_ext #( + caliptra_prim_subreg_ext #( .DW (32) ) u_repcnt_total_fails ( .re (repcnt_total_fails_re), @@ -1780,7 +1780,7 @@ module entropy_src_reg_top #( // R[repcnts_total_fails]: V(True) - prim_subreg_ext #( + caliptra_prim_subreg_ext #( .DW (32) ) u_repcnts_total_fails ( .re (repcnts_total_fails_re), @@ -1796,7 +1796,7 @@ module entropy_src_reg_top #( // R[adaptp_hi_total_fails]: V(True) - prim_subreg_ext #( + caliptra_prim_subreg_ext #( .DW (32) ) u_adaptp_hi_total_fails ( .re (adaptp_hi_total_fails_re), @@ -1812,7 +1812,7 @@ module entropy_src_reg_top #( // R[adaptp_lo_total_fails]: V(True) - prim_subreg_ext #( + caliptra_prim_subreg_ext #( .DW (32) ) u_adaptp_lo_total_fails ( .re (adaptp_lo_total_fails_re), @@ -1828,7 +1828,7 @@ module entropy_src_reg_top #( // R[bucket_total_fails]: V(True) - prim_subreg_ext #( + caliptra_prim_subreg_ext #( .DW (32) ) u_bucket_total_fails ( .re (bucket_total_fails_re), @@ -1844,7 +1844,7 @@ module entropy_src_reg_top #( // R[markov_hi_total_fails]: V(True) - prim_subreg_ext #( + caliptra_prim_subreg_ext #( .DW (32) ) u_markov_hi_total_fails ( .re (markov_hi_total_fails_re), @@ -1860,7 +1860,7 @@ module entropy_src_reg_top #( // R[markov_lo_total_fails]: V(True) - prim_subreg_ext #( + caliptra_prim_subreg_ext #( .DW (32) ) u_markov_lo_total_fails ( .re (markov_lo_total_fails_re), @@ -1876,7 +1876,7 @@ module entropy_src_reg_top #( // R[extht_hi_total_fails]: V(True) - prim_subreg_ext #( + caliptra_prim_subreg_ext #( .DW (32) ) u_extht_hi_total_fails ( .re (extht_hi_total_fails_re), @@ -1892,7 +1892,7 @@ module entropy_src_reg_top #( // R[extht_lo_total_fails]: V(True) - prim_subreg_ext #( + caliptra_prim_subreg_ext #( .DW (32) ) u_extht_lo_total_fails ( .re (extht_lo_total_fails_re), @@ -1912,9 +1912,9 @@ module entropy_src_reg_top #( logic alert_threshold_gated_we; assign alert_threshold_gated_we = alert_threshold_we & regwen_qs; // F[alert_threshold]: 15:0 - prim_subreg #( + caliptra_prim_subreg #( .DW (16), - .SwAccess(prim_subreg_pkg::SwAccessRW), + .SwAccess(caliptra_prim_subreg_pkg::SwAccessRW), .RESVAL (16'h2) ) u_alert_threshold_alert_threshold ( .clk_i (clk_i), @@ -1938,9 +1938,9 @@ module entropy_src_reg_top #( ); // F[alert_threshold_inv]: 31:16 - prim_subreg #( + caliptra_prim_subreg #( .DW (16), - .SwAccess(prim_subreg_pkg::SwAccessRW), + .SwAccess(caliptra_prim_subreg_pkg::SwAccessRW), .RESVAL (16'hfffd) ) u_alert_threshold_alert_threshold_inv ( .clk_i (clk_i), @@ -1965,7 +1965,7 @@ module entropy_src_reg_top #( // R[alert_summary_fail_counts]: V(True) - prim_subreg_ext #( + caliptra_prim_subreg_ext #( .DW (16) ) u_alert_summary_fail_counts ( .re (alert_summary_fail_counts_re), @@ -1982,7 +1982,7 @@ module entropy_src_reg_top #( // R[alert_fail_counts]: V(True) // F[repcnt_fail_count]: 7:4 - prim_subreg_ext #( + caliptra_prim_subreg_ext #( .DW (4) ) u_alert_fail_counts_repcnt_fail_count ( .re (alert_fail_counts_re), @@ -1997,7 +1997,7 @@ module entropy_src_reg_top #( ); // F[adaptp_hi_fail_count]: 11:8 - prim_subreg_ext #( + caliptra_prim_subreg_ext #( .DW (4) ) u_alert_fail_counts_adaptp_hi_fail_count ( .re (alert_fail_counts_re), @@ -2012,7 +2012,7 @@ module entropy_src_reg_top #( ); // F[adaptp_lo_fail_count]: 15:12 - prim_subreg_ext #( + caliptra_prim_subreg_ext #( .DW (4) ) u_alert_fail_counts_adaptp_lo_fail_count ( .re (alert_fail_counts_re), @@ -2027,7 +2027,7 @@ module entropy_src_reg_top #( ); // F[bucket_fail_count]: 19:16 - prim_subreg_ext #( + caliptra_prim_subreg_ext #( .DW (4) ) u_alert_fail_counts_bucket_fail_count ( .re (alert_fail_counts_re), @@ -2042,7 +2042,7 @@ module entropy_src_reg_top #( ); // F[markov_hi_fail_count]: 23:20 - prim_subreg_ext #( + caliptra_prim_subreg_ext #( .DW (4) ) u_alert_fail_counts_markov_hi_fail_count ( .re (alert_fail_counts_re), @@ -2057,7 +2057,7 @@ module entropy_src_reg_top #( ); // F[markov_lo_fail_count]: 27:24 - prim_subreg_ext #( + caliptra_prim_subreg_ext #( .DW (4) ) u_alert_fail_counts_markov_lo_fail_count ( .re (alert_fail_counts_re), @@ -2072,7 +2072,7 @@ module entropy_src_reg_top #( ); // F[repcnts_fail_count]: 31:28 - prim_subreg_ext #( + caliptra_prim_subreg_ext #( .DW (4) ) u_alert_fail_counts_repcnts_fail_count ( .re (alert_fail_counts_re), @@ -2089,7 +2089,7 @@ module entropy_src_reg_top #( // R[extht_fail_counts]: V(True) // F[extht_hi_fail_count]: 3:0 - prim_subreg_ext #( + caliptra_prim_subreg_ext #( .DW (4) ) u_extht_fail_counts_extht_hi_fail_count ( .re (extht_fail_counts_re), @@ -2104,7 +2104,7 @@ module entropy_src_reg_top #( ); // F[extht_lo_fail_count]: 7:4 - prim_subreg_ext #( + caliptra_prim_subreg_ext #( .DW (4) ) u_extht_fail_counts_extht_lo_fail_count ( .re (extht_fail_counts_re), @@ -2124,9 +2124,9 @@ module entropy_src_reg_top #( logic fw_ov_control_gated_we; assign fw_ov_control_gated_we = fw_ov_control_we & regwen_qs; // F[fw_ov_mode]: 3:0 - prim_subreg #( + caliptra_prim_subreg #( .DW (4), - .SwAccess(prim_subreg_pkg::SwAccessRW), + .SwAccess(caliptra_prim_subreg_pkg::SwAccessRW), .RESVAL (4'h9) ) u_fw_ov_control_fw_ov_mode ( .clk_i (clk_i), @@ -2150,9 +2150,9 @@ module entropy_src_reg_top #( ); // F[fw_ov_entropy_insert]: 7:4 - prim_subreg #( + caliptra_prim_subreg #( .DW (4), - .SwAccess(prim_subreg_pkg::SwAccessRW), + .SwAccess(caliptra_prim_subreg_pkg::SwAccessRW), .RESVAL (4'h9) ) u_fw_ov_control_fw_ov_entropy_insert ( .clk_i (clk_i), @@ -2177,9 +2177,9 @@ module entropy_src_reg_top #( // R[fw_ov_sha3_start]: V(False) - prim_subreg #( + caliptra_prim_subreg #( .DW (4), - .SwAccess(prim_subreg_pkg::SwAccessRW), + .SwAccess(caliptra_prim_subreg_pkg::SwAccessRW), .RESVAL (4'h9) ) u_fw_ov_sha3_start ( .clk_i (clk_i), @@ -2204,7 +2204,7 @@ module entropy_src_reg_top #( // R[fw_ov_wr_fifo_full]: V(True) - prim_subreg_ext #( + caliptra_prim_subreg_ext #( .DW (1) ) u_fw_ov_wr_fifo_full ( .re (fw_ov_wr_fifo_full_re), @@ -2220,9 +2220,9 @@ module entropy_src_reg_top #( // R[fw_ov_rd_fifo_overflow]: V(False) - prim_subreg #( + caliptra_prim_subreg #( .DW (1), - .SwAccess(prim_subreg_pkg::SwAccessW0C), + .SwAccess(caliptra_prim_subreg_pkg::SwAccessW0C), .RESVAL (1'h0) ) u_fw_ov_rd_fifo_overflow ( .clk_i (clk_i), @@ -2247,7 +2247,7 @@ module entropy_src_reg_top #( // R[fw_ov_rd_data]: V(True) - prim_subreg_ext #( + caliptra_prim_subreg_ext #( .DW (32) ) u_fw_ov_rd_data ( .re (fw_ov_rd_data_re), @@ -2266,7 +2266,7 @@ module entropy_src_reg_top #( logic fw_ov_wr_data_qe; logic [0:0] fw_ov_wr_data_flds_we; assign fw_ov_wr_data_qe = &fw_ov_wr_data_flds_we; - prim_subreg_ext #( + caliptra_prim_subreg_ext #( .DW (32) ) u_fw_ov_wr_data ( .re (1'b0), @@ -2286,9 +2286,9 @@ module entropy_src_reg_top #( // Create REGWEN-gated WE signal logic observe_fifo_thresh_gated_we; assign observe_fifo_thresh_gated_we = observe_fifo_thresh_we & regwen_qs; - prim_subreg #( + caliptra_prim_subreg #( .DW (7), - .SwAccess(prim_subreg_pkg::SwAccessRW), + .SwAccess(caliptra_prim_subreg_pkg::SwAccessRW), .RESVAL (7'h20) ) u_observe_fifo_thresh ( .clk_i (clk_i), @@ -2313,7 +2313,7 @@ module entropy_src_reg_top #( // R[observe_fifo_depth]: V(True) - prim_subreg_ext #( + caliptra_prim_subreg_ext #( .DW (7) ) u_observe_fifo_depth ( .re (observe_fifo_depth_re), @@ -2330,7 +2330,7 @@ module entropy_src_reg_top #( // R[debug_status]: V(True) // F[entropy_fifo_depth]: 2:0 - prim_subreg_ext #( + caliptra_prim_subreg_ext #( .DW (3) ) u_debug_status_entropy_fifo_depth ( .re (debug_status_re), @@ -2345,7 +2345,7 @@ module entropy_src_reg_top #( ); // F[sha3_fsm]: 5:3 - prim_subreg_ext #( + caliptra_prim_subreg_ext #( .DW (3) ) u_debug_status_sha3_fsm ( .re (debug_status_re), @@ -2360,7 +2360,7 @@ module entropy_src_reg_top #( ); // F[sha3_block_pr]: 6:6 - prim_subreg_ext #( + caliptra_prim_subreg_ext #( .DW (1) ) u_debug_status_sha3_block_pr ( .re (debug_status_re), @@ -2375,7 +2375,7 @@ module entropy_src_reg_top #( ); // F[sha3_squeezing]: 7:7 - prim_subreg_ext #( + caliptra_prim_subreg_ext #( .DW (1) ) u_debug_status_sha3_squeezing ( .re (debug_status_re), @@ -2390,7 +2390,7 @@ module entropy_src_reg_top #( ); // F[sha3_absorbed]: 8:8 - prim_subreg_ext #( + caliptra_prim_subreg_ext #( .DW (1) ) u_debug_status_sha3_absorbed ( .re (debug_status_re), @@ -2405,7 +2405,7 @@ module entropy_src_reg_top #( ); // F[sha3_err]: 9:9 - prim_subreg_ext #( + caliptra_prim_subreg_ext #( .DW (1) ) u_debug_status_sha3_err ( .re (debug_status_re), @@ -2420,7 +2420,7 @@ module entropy_src_reg_top #( ); // F[main_sm_idle]: 16:16 - prim_subreg_ext #( + caliptra_prim_subreg_ext #( .DW (1) ) u_debug_status_main_sm_idle ( .re (debug_status_re), @@ -2435,7 +2435,7 @@ module entropy_src_reg_top #( ); // F[main_sm_boot_done]: 17:17 - prim_subreg_ext #( + caliptra_prim_subreg_ext #( .DW (1) ) u_debug_status_main_sm_boot_done ( .re (debug_status_re), @@ -2452,9 +2452,9 @@ module entropy_src_reg_top #( // R[recov_alert_sts]: V(False) // F[fips_enable_field_alert]: 0:0 - prim_subreg #( + caliptra_prim_subreg #( .DW (1), - .SwAccess(prim_subreg_pkg::SwAccessW0C), + .SwAccess(caliptra_prim_subreg_pkg::SwAccessW0C), .RESVAL (1'h0) ) u_recov_alert_sts_fips_enable_field_alert ( .clk_i (clk_i), @@ -2478,9 +2478,9 @@ module entropy_src_reg_top #( ); // F[entropy_data_reg_en_field_alert]: 1:1 - prim_subreg #( + caliptra_prim_subreg #( .DW (1), - .SwAccess(prim_subreg_pkg::SwAccessW0C), + .SwAccess(caliptra_prim_subreg_pkg::SwAccessW0C), .RESVAL (1'h0) ) u_recov_alert_sts_entropy_data_reg_en_field_alert ( .clk_i (clk_i), @@ -2504,9 +2504,9 @@ module entropy_src_reg_top #( ); // F[module_enable_field_alert]: 2:2 - prim_subreg #( + caliptra_prim_subreg #( .DW (1), - .SwAccess(prim_subreg_pkg::SwAccessW0C), + .SwAccess(caliptra_prim_subreg_pkg::SwAccessW0C), .RESVAL (1'h0) ) u_recov_alert_sts_module_enable_field_alert ( .clk_i (clk_i), @@ -2530,9 +2530,9 @@ module entropy_src_reg_top #( ); // F[threshold_scope_field_alert]: 3:3 - prim_subreg #( + caliptra_prim_subreg #( .DW (1), - .SwAccess(prim_subreg_pkg::SwAccessW0C), + .SwAccess(caliptra_prim_subreg_pkg::SwAccessW0C), .RESVAL (1'h0) ) u_recov_alert_sts_threshold_scope_field_alert ( .clk_i (clk_i), @@ -2556,9 +2556,9 @@ module entropy_src_reg_top #( ); // F[rng_bit_enable_field_alert]: 5:5 - prim_subreg #( + caliptra_prim_subreg #( .DW (1), - .SwAccess(prim_subreg_pkg::SwAccessW0C), + .SwAccess(caliptra_prim_subreg_pkg::SwAccessW0C), .RESVAL (1'h0) ) u_recov_alert_sts_rng_bit_enable_field_alert ( .clk_i (clk_i), @@ -2582,9 +2582,9 @@ module entropy_src_reg_top #( ); // F[fw_ov_sha3_start_field_alert]: 7:7 - prim_subreg #( + caliptra_prim_subreg #( .DW (1), - .SwAccess(prim_subreg_pkg::SwAccessW0C), + .SwAccess(caliptra_prim_subreg_pkg::SwAccessW0C), .RESVAL (1'h0) ) u_recov_alert_sts_fw_ov_sha3_start_field_alert ( .clk_i (clk_i), @@ -2608,9 +2608,9 @@ module entropy_src_reg_top #( ); // F[fw_ov_mode_field_alert]: 8:8 - prim_subreg #( + caliptra_prim_subreg #( .DW (1), - .SwAccess(prim_subreg_pkg::SwAccessW0C), + .SwAccess(caliptra_prim_subreg_pkg::SwAccessW0C), .RESVAL (1'h0) ) u_recov_alert_sts_fw_ov_mode_field_alert ( .clk_i (clk_i), @@ -2634,9 +2634,9 @@ module entropy_src_reg_top #( ); // F[fw_ov_entropy_insert_field_alert]: 9:9 - prim_subreg #( + caliptra_prim_subreg #( .DW (1), - .SwAccess(prim_subreg_pkg::SwAccessW0C), + .SwAccess(caliptra_prim_subreg_pkg::SwAccessW0C), .RESVAL (1'h0) ) u_recov_alert_sts_fw_ov_entropy_insert_field_alert ( .clk_i (clk_i), @@ -2660,9 +2660,9 @@ module entropy_src_reg_top #( ); // F[es_route_field_alert]: 10:10 - prim_subreg #( + caliptra_prim_subreg #( .DW (1), - .SwAccess(prim_subreg_pkg::SwAccessW0C), + .SwAccess(caliptra_prim_subreg_pkg::SwAccessW0C), .RESVAL (1'h0) ) u_recov_alert_sts_es_route_field_alert ( .clk_i (clk_i), @@ -2686,9 +2686,9 @@ module entropy_src_reg_top #( ); // F[es_type_field_alert]: 11:11 - prim_subreg #( + caliptra_prim_subreg #( .DW (1), - .SwAccess(prim_subreg_pkg::SwAccessW0C), + .SwAccess(caliptra_prim_subreg_pkg::SwAccessW0C), .RESVAL (1'h0) ) u_recov_alert_sts_es_type_field_alert ( .clk_i (clk_i), @@ -2712,9 +2712,9 @@ module entropy_src_reg_top #( ); // F[es_main_sm_alert]: 12:12 - prim_subreg #( + caliptra_prim_subreg #( .DW (1), - .SwAccess(prim_subreg_pkg::SwAccessW0C), + .SwAccess(caliptra_prim_subreg_pkg::SwAccessW0C), .RESVAL (1'h0) ) u_recov_alert_sts_es_main_sm_alert ( .clk_i (clk_i), @@ -2738,9 +2738,9 @@ module entropy_src_reg_top #( ); // F[es_bus_cmp_alert]: 13:13 - prim_subreg #( + caliptra_prim_subreg #( .DW (1), - .SwAccess(prim_subreg_pkg::SwAccessW0C), + .SwAccess(caliptra_prim_subreg_pkg::SwAccessW0C), .RESVAL (1'h0) ) u_recov_alert_sts_es_bus_cmp_alert ( .clk_i (clk_i), @@ -2764,9 +2764,9 @@ module entropy_src_reg_top #( ); // F[es_thresh_cfg_alert]: 14:14 - prim_subreg #( + caliptra_prim_subreg #( .DW (1), - .SwAccess(prim_subreg_pkg::SwAccessW0C), + .SwAccess(caliptra_prim_subreg_pkg::SwAccessW0C), .RESVAL (1'h0) ) u_recov_alert_sts_es_thresh_cfg_alert ( .clk_i (clk_i), @@ -2790,9 +2790,9 @@ module entropy_src_reg_top #( ); // F[es_fw_ov_wr_alert]: 15:15 - prim_subreg #( + caliptra_prim_subreg #( .DW (1), - .SwAccess(prim_subreg_pkg::SwAccessW0C), + .SwAccess(caliptra_prim_subreg_pkg::SwAccessW0C), .RESVAL (1'h0) ) u_recov_alert_sts_es_fw_ov_wr_alert ( .clk_i (clk_i), @@ -2816,9 +2816,9 @@ module entropy_src_reg_top #( ); // F[es_fw_ov_disable_alert]: 16:16 - prim_subreg #( + caliptra_prim_subreg #( .DW (1), - .SwAccess(prim_subreg_pkg::SwAccessW0C), + .SwAccess(caliptra_prim_subreg_pkg::SwAccessW0C), .RESVAL (1'h0) ) u_recov_alert_sts_es_fw_ov_disable_alert ( .clk_i (clk_i), @@ -2844,9 +2844,9 @@ module entropy_src_reg_top #( // R[err_code]: V(False) // F[sfifo_esrng_err]: 0:0 - prim_subreg #( + caliptra_prim_subreg #( .DW (1), - .SwAccess(prim_subreg_pkg::SwAccessRO), + .SwAccess(caliptra_prim_subreg_pkg::SwAccessRO), .RESVAL (1'h0) ) u_err_code_sfifo_esrng_err ( .clk_i (clk_i), @@ -2870,9 +2870,9 @@ module entropy_src_reg_top #( ); // F[sfifo_observe_err]: 1:1 - prim_subreg #( + caliptra_prim_subreg #( .DW (1), - .SwAccess(prim_subreg_pkg::SwAccessRO), + .SwAccess(caliptra_prim_subreg_pkg::SwAccessRO), .RESVAL (1'h0) ) u_err_code_sfifo_observe_err ( .clk_i (clk_i), @@ -2896,9 +2896,9 @@ module entropy_src_reg_top #( ); // F[sfifo_esfinal_err]: 2:2 - prim_subreg #( + caliptra_prim_subreg #( .DW (1), - .SwAccess(prim_subreg_pkg::SwAccessRO), + .SwAccess(caliptra_prim_subreg_pkg::SwAccessRO), .RESVAL (1'h0) ) u_err_code_sfifo_esfinal_err ( .clk_i (clk_i), @@ -2922,9 +2922,9 @@ module entropy_src_reg_top #( ); // F[es_ack_sm_err]: 20:20 - prim_subreg #( + caliptra_prim_subreg #( .DW (1), - .SwAccess(prim_subreg_pkg::SwAccessRO), + .SwAccess(caliptra_prim_subreg_pkg::SwAccessRO), .RESVAL (1'h0) ) u_err_code_es_ack_sm_err ( .clk_i (clk_i), @@ -2948,9 +2948,9 @@ module entropy_src_reg_top #( ); // F[es_main_sm_err]: 21:21 - prim_subreg #( + caliptra_prim_subreg #( .DW (1), - .SwAccess(prim_subreg_pkg::SwAccessRO), + .SwAccess(caliptra_prim_subreg_pkg::SwAccessRO), .RESVAL (1'h0) ) u_err_code_es_main_sm_err ( .clk_i (clk_i), @@ -2974,9 +2974,9 @@ module entropy_src_reg_top #( ); // F[es_cntr_err]: 22:22 - prim_subreg #( + caliptra_prim_subreg #( .DW (1), - .SwAccess(prim_subreg_pkg::SwAccessRO), + .SwAccess(caliptra_prim_subreg_pkg::SwAccessRO), .RESVAL (1'h0) ) u_err_code_es_cntr_err ( .clk_i (clk_i), @@ -3000,9 +3000,9 @@ module entropy_src_reg_top #( ); // F[sha3_state_err]: 23:23 - prim_subreg #( + caliptra_prim_subreg #( .DW (1), - .SwAccess(prim_subreg_pkg::SwAccessRO), + .SwAccess(caliptra_prim_subreg_pkg::SwAccessRO), .RESVAL (1'h0) ) u_err_code_sha3_state_err ( .clk_i (clk_i), @@ -3026,9 +3026,9 @@ module entropy_src_reg_top #( ); // F[sha3_rst_storage_err]: 24:24 - prim_subreg #( + caliptra_prim_subreg #( .DW (1), - .SwAccess(prim_subreg_pkg::SwAccessRO), + .SwAccess(caliptra_prim_subreg_pkg::SwAccessRO), .RESVAL (1'h0) ) u_err_code_sha3_rst_storage_err ( .clk_i (clk_i), @@ -3052,9 +3052,9 @@ module entropy_src_reg_top #( ); // F[fifo_write_err]: 28:28 - prim_subreg #( + caliptra_prim_subreg #( .DW (1), - .SwAccess(prim_subreg_pkg::SwAccessRO), + .SwAccess(caliptra_prim_subreg_pkg::SwAccessRO), .RESVAL (1'h0) ) u_err_code_fifo_write_err ( .clk_i (clk_i), @@ -3078,9 +3078,9 @@ module entropy_src_reg_top #( ); // F[fifo_read_err]: 29:29 - prim_subreg #( + caliptra_prim_subreg #( .DW (1), - .SwAccess(prim_subreg_pkg::SwAccessRO), + .SwAccess(caliptra_prim_subreg_pkg::SwAccessRO), .RESVAL (1'h0) ) u_err_code_fifo_read_err ( .clk_i (clk_i), @@ -3104,9 +3104,9 @@ module entropy_src_reg_top #( ); // F[fifo_state_err]: 30:30 - prim_subreg #( + caliptra_prim_subreg #( .DW (1), - .SwAccess(prim_subreg_pkg::SwAccessRO), + .SwAccess(caliptra_prim_subreg_pkg::SwAccessRO), .RESVAL (1'h0) ) u_err_code_fifo_state_err ( .clk_i (clk_i), @@ -3133,7 +3133,7 @@ module entropy_src_reg_top #( // R[err_code_test]: V(False) logic err_code_test_qe; logic [0:0] err_code_test_flds_we; - prim_flop #( + caliptra_prim_flop #( .Width(1), .ResetValue(0) ) u_err_code_test0_qe ( @@ -3142,9 +3142,9 @@ module entropy_src_reg_top #( .d_i(&err_code_test_flds_we), .q_o(err_code_test_qe) ); - prim_subreg #( + caliptra_prim_subreg #( .DW (5), - .SwAccess(prim_subreg_pkg::SwAccessRW), + .SwAccess(caliptra_prim_subreg_pkg::SwAccessRW), .RESVAL (5'h0) ) u_err_code_test ( .clk_i (clk_i), @@ -3170,9 +3170,9 @@ module entropy_src_reg_top #( // R[main_sm_state]: V(False) - prim_subreg #( + caliptra_prim_subreg #( .DW (9), - .SwAccess(prim_subreg_pkg::SwAccessRO), + .SwAccess(caliptra_prim_subreg_pkg::SwAccessRO), .RESVAL (9'hf5) ) u_main_sm_state ( .clk_i (clk_i), @@ -3892,10 +3892,6 @@ module entropy_src_reg_top #( addr_hit[56]: begin reg_rdata_next[8:0] = main_sm_state_qs; end - - default: begin - reg_rdata_next = '1; - end endcase end diff --git a/src/entropy_src/rtl/entropy_src_repcnt_ht.sv b/src/entropy_src/rtl/entropy_src_repcnt_ht.sv index 99999a839..847aef3b6 100644 --- a/src/entropy_src/rtl/entropy_src_repcnt_ht.sv +++ b/src/entropy_src/rtl/entropy_src_repcnt_ht.sv @@ -68,9 +68,9 @@ module entropy_src_repcnt_ht #( // NIST B counter // SEC_CM: CTR.REDUN - prim_count #( + caliptra_prim_count #( .Width(RegWidth) - ) u_prim_count_rep_cntr ( + ) u_caliptra_prim_count_rep_cntr ( .clk_i, .rst_ni, .clr_i(1'b0), @@ -88,10 +88,10 @@ module entropy_src_repcnt_ht #( end : gen_cntrs - prim_max_tree #( + caliptra_prim_max_tree #( .NumSrc(RngBusWidth), .Width(RegWidth) - ) u_prim_max_tree_rep_cntr_max ( + ) u_caliptra_prim_max_tree_rep_cntr_max ( .clk_i, .rst_ni, .values_i (rep_cntr), diff --git a/src/entropy_src/rtl/entropy_src_repcnts_ht.sv b/src/entropy_src/rtl/entropy_src_repcnts_ht.sv index 561a4da07..26ff0df79 100644 --- a/src/entropy_src/rtl/entropy_src_repcnts_ht.sv +++ b/src/entropy_src/rtl/entropy_src_repcnts_ht.sv @@ -64,9 +64,9 @@ module entropy_src_repcnts_ht #( // NIST B counter // SEC_CM: CTR.REDUN - prim_count #( + caliptra_prim_count #( .Width(RegWidth) - ) u_prim_count_rep_cntr ( + ) u_caliptra_prim_count_rep_cntr ( .clk_i, .rst_ni, .clr_i(1'b0), diff --git a/src/entropy_src/tb/Makefile b/src/entropy_src/tb/Makefile index f7387c682..7fc2f8cc5 100644 --- a/src/entropy_src/tb/Makefile +++ b/src/entropy_src/tb/Makefile @@ -44,7 +44,7 @@ verilator-build: $(TBFILES) $(VERILATOR_LINT_FILES) test_$(IPNAME)_tb.cpp $(VERILATOR) --cc \ --timing \ --timescale 1ns/1ps \ - -f $(CONFIGDIR)/$(IPNAME).vf --top-module $(IPNAME)_tb \ + -f $(CONFIGDIR)/$(IPNAME)_tb.vf --top-module $(IPNAME)_tb \ -f $(VERILATOR_LINT_FILES) \ -exe test_$(IPNAME)_tb.cpp \ --trace diff --git a/src/entropy_src/tb/entropy_src_tb.sv b/src/entropy_src/tb/entropy_src_tb.sv index 8c6bf6c09..c01cb59b4 100644 --- a/src/entropy_src/tb/entropy_src_tb.sv +++ b/src/entropy_src/tb/entropy_src_tb.sv @@ -24,7 +24,7 @@ module entropy_src_tb import entropy_src_pkg::*; import entropy_src_reg_pkg::*; - import prim_mubi_pkg::mubi8_t; + import caliptra_prim_mubi_pkg::mubi8_t; ( `ifdef VERILATOR input bit clk_tb @@ -160,8 +160,8 @@ module entropy_src_tb .hreadyout_o (hreadyout_o_tb), .hrdata_o (hrdata_o_tb), // OTP Interface - .otp_en_entropy_src_fw_read_i (prim_mubi_pkg::MuBi8True), - .otp_en_entropy_src_fw_over_i (prim_mubi_pkg::MuBi8True), + .otp_en_entropy_src_fw_read_i (caliptra_prim_mubi_pkg::MuBi8True), + .otp_en_entropy_src_fw_over_i (caliptra_prim_mubi_pkg::MuBi8True), // RNG Interface .rng_fips_o (), // Entropy Interface @@ -213,7 +213,7 @@ module entropy_src_tb // the dut as needed. //---------------------------------------------------------------- always @(posedge clk_tb) begin : sys_monitor - cycle_ctr = cycle_ctr + 1; + cycle_ctr = (!reset_n_tb) ? 32'h0 : cycle_ctr + 1; end @@ -246,7 +246,6 @@ module entropy_src_tb task init_sim; begin generate_rng = '0; - cycle_ctr = '0; error_ctr = '0; tc_ctr = '0; `ifndef VERILATOR @@ -297,6 +296,7 @@ module entropy_src_tb $display("[%t] write_single_word(addr=0x%x, word=0x%x)", $time, address, word); hsel_i_tb = 1; haddr_i_tb = address; + hwdata_i_tb = word; hwrite_i_tb = 1; hready_i_tb = 1; htrans_i_tb = AHB_HTRANS_NONSEQ; @@ -304,7 +304,6 @@ module entropy_src_tb @(posedge clk_tb); haddr_i_tb = 'Z; - hwdata_i_tb = word; hwrite_i_tb = 0; htrans_i_tb = AHB_HTRANS_IDLE; wait(hreadyout_o_tb == 1'b1); diff --git a/src/hmac/config/compile.yml b/src/hmac/config/compile.yml index fe54fef0c..181ae1ce8 100755 --- a/src/hmac/config/compile.yml +++ b/src/hmac/config/compile.yml @@ -27,6 +27,7 @@ provides: [hmac_ctrl_tb] schema_version: 2.4.0 requires: - hmac_ctrl + - hmac_coverage targets: tb: directories: @@ -34,6 +35,18 @@ targets: files: - $COMPILE_ROOT/tb/hmac_ctrl_tb.sv tops: [hmac_ctrl_tb] +--- +provides: [hmac_coverage] +schema_version: 2.4.0 +requires: + - hmac_ctrl +targets: + tb: + directories: + - $COMPILE_ROOT/coverage + files: + - $COMPILE_ROOT/coverage/hmac_ctrl_cov_if.sv + - $COMPILE_ROOT/coverage/hmac_ctrl_cov_bind.sv global: tool: vcs: diff --git a/src/hmac/config/hmac_coverage.vf b/src/hmac/config/hmac_coverage.vf new file mode 100644 index 000000000..f74b96944 --- /dev/null +++ b/src/hmac/config/hmac_coverage.vf @@ -0,0 +1,54 @@ ++incdir+${CALIPTRA_ROOT}/src/integration/rtl ++incdir+${CALIPTRA_ROOT}/src/libs/rtl ++incdir+${CALIPTRA_ROOT}/src/keyvault/rtl ++incdir+${CALIPTRA_ROOT}/src/pcrvault/rtl ++incdir+${CALIPTRA_ROOT}/src/hmac/coverage ++incdir+${CALIPTRA_ROOT}/src/sha512/rtl ++incdir+${CALIPTRA_ROOT}/src/sha512_masked/rtl ++incdir+${CALIPTRA_ROOT}/src/hmac/rtl +${CALIPTRA_ROOT}/src/integration/rtl/config_defines.svh +${CALIPTRA_ROOT}/src/integration/rtl/caliptra_reg_defines.svh +${CALIPTRA_ROOT}/src/libs/rtl/caliptra_sva.svh +${CALIPTRA_ROOT}/src/libs/rtl/caliptra_macros.svh +${CALIPTRA_ROOT}/src/libs/rtl/caliptra_sram.sv +${CALIPTRA_ROOT}/src/libs/rtl/ahb_defines_pkg.sv +${CALIPTRA_ROOT}/src/libs/rtl/caliptra_ahb_srom.sv +${CALIPTRA_ROOT}/src/libs/rtl/apb_slv_sif.sv +${CALIPTRA_ROOT}/src/libs/rtl/ahb_slv_sif.sv +${CALIPTRA_ROOT}/src/libs/rtl/caliptra_icg.sv +${CALIPTRA_ROOT}/src/libs/rtl/clk_gate.sv +${CALIPTRA_ROOT}/src/keyvault/rtl/kv_defines_pkg.sv +${CALIPTRA_ROOT}/src/keyvault/rtl/kv_macros.svh +${CALIPTRA_ROOT}/src/pcrvault/rtl/pv_defines_pkg.sv +${CALIPTRA_ROOT}/src/pcrvault/rtl/pv_macros.svh +${CALIPTRA_ROOT}/src/pcrvault/rtl/pv_gen_hash.sv +${CALIPTRA_ROOT}/src/hmac/coverage/hmac_ctrl_cov_if.sv +${CALIPTRA_ROOT}/src/hmac/coverage/hmac_ctrl_cov_bind.sv +${CALIPTRA_ROOT}/src/libs/rtl/ahb_to_reg_adapter.sv +${CALIPTRA_ROOT}/src/keyvault/rtl/kv_reg_pkg.sv +${CALIPTRA_ROOT}/src/keyvault/rtl/kv_reg.sv +${CALIPTRA_ROOT}/src/keyvault/rtl/kv.sv +${CALIPTRA_ROOT}/src/keyvault/rtl/kv_fsm.sv +${CALIPTRA_ROOT}/src/keyvault/rtl/kv_read_client.sv +${CALIPTRA_ROOT}/src/keyvault/rtl/kv_write_client.sv +${CALIPTRA_ROOT}/src/pcrvault/rtl/pv_reg_pkg.sv +${CALIPTRA_ROOT}/src/pcrvault/rtl/pv_reg.sv +${CALIPTRA_ROOT}/src/pcrvault/rtl/pv.sv +${CALIPTRA_ROOT}/src/sha512/rtl/sha512_reg_pkg.sv +${CALIPTRA_ROOT}/src/sha512/rtl/sha512_params_pkg.sv +${CALIPTRA_ROOT}/src/sha512/rtl/sha512_ctrl.sv +${CALIPTRA_ROOT}/src/sha512/rtl/sha512.sv +${CALIPTRA_ROOT}/src/sha512/rtl/sha512_core.v +${CALIPTRA_ROOT}/src/sha512/rtl/sha512_h_constants.v +${CALIPTRA_ROOT}/src/sha512/rtl/sha512_k_constants.v +${CALIPTRA_ROOT}/src/sha512/rtl/sha512_w_mem.v +${CALIPTRA_ROOT}/src/sha512/rtl/sha512_reg.sv +${CALIPTRA_ROOT}/src/sha512_masked/rtl/sha512_masked_defines_pkg.sv +${CALIPTRA_ROOT}/src/sha512_masked/rtl/sha512_masked_core.sv +${CALIPTRA_ROOT}/src/sha512_masked/rtl/sha512_masked_lfsr.sv +${CALIPTRA_ROOT}/src/hmac/rtl/hmac_param_pkg.sv +${CALIPTRA_ROOT}/src/hmac/rtl/hmac_reg_pkg.sv +${CALIPTRA_ROOT}/src/hmac/rtl/hmac_ctrl.sv +${CALIPTRA_ROOT}/src/hmac/rtl/hmac.sv +${CALIPTRA_ROOT}/src/hmac/rtl/hmac_core.v +${CALIPTRA_ROOT}/src/hmac/rtl/hmac_reg.sv \ No newline at end of file diff --git a/src/hmac/config/hmac_ctrl.vf b/src/hmac/config/hmac_ctrl.vf index 87401410d..666c3371f 100644 --- a/src/hmac/config/hmac_ctrl.vf +++ b/src/hmac/config/hmac_ctrl.vf @@ -16,6 +16,7 @@ ${CALIPTRA_ROOT}/src/libs/rtl/apb_slv_sif.sv ${CALIPTRA_ROOT}/src/libs/rtl/ahb_slv_sif.sv ${CALIPTRA_ROOT}/src/libs/rtl/caliptra_icg.sv ${CALIPTRA_ROOT}/src/libs/rtl/clk_gate.sv +${CALIPTRA_ROOT}/src/libs/rtl/caliptra_2ff_sync.sv ${CALIPTRA_ROOT}/src/keyvault/rtl/kv_defines_pkg.sv ${CALIPTRA_ROOT}/src/keyvault/rtl/kv_macros.svh ${CALIPTRA_ROOT}/src/pcrvault/rtl/pv_defines_pkg.sv @@ -32,9 +33,9 @@ ${CALIPTRA_ROOT}/src/pcrvault/rtl/pv_reg_pkg.sv ${CALIPTRA_ROOT}/src/pcrvault/rtl/pv_reg.sv ${CALIPTRA_ROOT}/src/pcrvault/rtl/pv.sv ${CALIPTRA_ROOT}/src/sha512/rtl/sha512_reg_pkg.sv +${CALIPTRA_ROOT}/src/sha512/rtl/sha512_params_pkg.sv ${CALIPTRA_ROOT}/src/sha512/rtl/sha512_ctrl.sv ${CALIPTRA_ROOT}/src/sha512/rtl/sha512.sv -${CALIPTRA_ROOT}/src/sha512/rtl/sha512_param.sv ${CALIPTRA_ROOT}/src/sha512/rtl/sha512_core.v ${CALIPTRA_ROOT}/src/sha512/rtl/sha512_h_constants.v ${CALIPTRA_ROOT}/src/sha512/rtl/sha512_k_constants.v diff --git a/src/hmac/config/hmac_ctrl_tb.vf b/src/hmac/config/hmac_ctrl_tb.vf index 1cb35069c..1ca5eaa69 100644 --- a/src/hmac/config/hmac_ctrl_tb.vf +++ b/src/hmac/config/hmac_ctrl_tb.vf @@ -2,6 +2,7 @@ +incdir+${CALIPTRA_ROOT}/src/libs/rtl +incdir+${CALIPTRA_ROOT}/src/keyvault/rtl +incdir+${CALIPTRA_ROOT}/src/pcrvault/rtl ++incdir+${CALIPTRA_ROOT}/src/hmac/coverage +incdir+${CALIPTRA_ROOT}/src/hmac/tb +incdir+${CALIPTRA_ROOT}/src/sha512/rtl +incdir+${CALIPTRA_ROOT}/src/sha512_masked/rtl @@ -17,11 +18,14 @@ ${CALIPTRA_ROOT}/src/libs/rtl/apb_slv_sif.sv ${CALIPTRA_ROOT}/src/libs/rtl/ahb_slv_sif.sv ${CALIPTRA_ROOT}/src/libs/rtl/caliptra_icg.sv ${CALIPTRA_ROOT}/src/libs/rtl/clk_gate.sv +${CALIPTRA_ROOT}/src/libs/rtl/caliptra_2ff_sync.sv ${CALIPTRA_ROOT}/src/keyvault/rtl/kv_defines_pkg.sv ${CALIPTRA_ROOT}/src/keyvault/rtl/kv_macros.svh ${CALIPTRA_ROOT}/src/pcrvault/rtl/pv_defines_pkg.sv ${CALIPTRA_ROOT}/src/pcrvault/rtl/pv_macros.svh ${CALIPTRA_ROOT}/src/pcrvault/rtl/pv_gen_hash.sv +${CALIPTRA_ROOT}/src/hmac/coverage/hmac_ctrl_cov_if.sv +${CALIPTRA_ROOT}/src/hmac/coverage/hmac_ctrl_cov_bind.sv ${CALIPTRA_ROOT}/src/hmac/tb/hmac_ctrl_tb.sv ${CALIPTRA_ROOT}/src/libs/rtl/ahb_to_reg_adapter.sv ${CALIPTRA_ROOT}/src/keyvault/rtl/kv_reg_pkg.sv @@ -34,9 +38,9 @@ ${CALIPTRA_ROOT}/src/pcrvault/rtl/pv_reg_pkg.sv ${CALIPTRA_ROOT}/src/pcrvault/rtl/pv_reg.sv ${CALIPTRA_ROOT}/src/pcrvault/rtl/pv.sv ${CALIPTRA_ROOT}/src/sha512/rtl/sha512_reg_pkg.sv +${CALIPTRA_ROOT}/src/sha512/rtl/sha512_params_pkg.sv ${CALIPTRA_ROOT}/src/sha512/rtl/sha512_ctrl.sv ${CALIPTRA_ROOT}/src/sha512/rtl/sha512.sv -${CALIPTRA_ROOT}/src/sha512/rtl/sha512_param.sv ${CALIPTRA_ROOT}/src/sha512/rtl/sha512_core.v ${CALIPTRA_ROOT}/src/sha512/rtl/sha512_h_constants.v ${CALIPTRA_ROOT}/src/sha512/rtl/sha512_k_constants.v diff --git a/src/hmac/coverage/hmac_ctrl_cov_bind.sv b/src/hmac/coverage/hmac_ctrl_cov_bind.sv new file mode 100644 index 000000000..7d731b056 --- /dev/null +++ b/src/hmac/coverage/hmac_ctrl_cov_bind.sv @@ -0,0 +1,20 @@ +// SPDX-License-Identifier: Apache-2.0 +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + + +module hmac_ctrl_cov_bind; + `ifdef FCOV + bind hmac_ctrl hmac_ctrl_cov_if i_hmac_ctrl_cov_if(.*); + `endif +endmodule diff --git a/src/hmac/coverage/hmac_ctrl_cov_if.sv b/src/hmac/coverage/hmac_ctrl_cov_if.sv new file mode 100644 index 000000000..231213b0b --- /dev/null +++ b/src/hmac/coverage/hmac_ctrl_cov_if.sv @@ -0,0 +1,71 @@ +// SPDX-License-Identifier: Apache-2.0 +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +`ifndef VERILATOR + +interface hmac_ctrl_cov_if + ( + input logic clk, + input logic reset_n, + input logic cptra_pwrgood + +); + + logic init; + logic next; + logic zeroize; + logic ready; + logic valid; + + logic core_tag_we; + + logic [1 : 0] hmac_cmd; + + assign init = hmac_ctrl.hmac_inst.init_reg; + assign next = hmac_ctrl.hmac_inst.next_reg; + assign zeroize = hmac_ctrl.hmac_inst.zeroize_reg; + assign ready = hmac_ctrl.hmac_inst.ready_reg; + assign valid = hmac_ctrl.hmac_inst.tag_valid_reg; + + assign core_tag_we = hmac_ctrl.hmac_inst.core_tag_we; + + assign hmac_cmd = {next, init}; + + covergroup hmac_ctrl_cov_grp @(posedge clk); + reset_cp: coverpoint reset_n; + cptra_pwrgood_cp: coverpoint cptra_pwrgood; + + init_cp: coverpoint init; + next_cp: coverpoint next; + zeroize_cp: coverpoint zeroize; + ready_cp: coverpoint ready; + valid_cp: coverpoint valid; + + core_tag_we_cp: coverpoint core_tag_we; + + hmac_cmd_cp: coverpoint hmac_cmd {bins cmd[] = (0, 0 => 1, 2 => 0, 0);} + + init_ready_cp: cross ready, init; + next_ready_cp: cross ready, next; + zeroize_ready_cp: cross ready, zeroize; + zeroize_init_cp: cross zeroize, init; + zeroize_next_cp: cross zeroize, next; + + endgroup + + hmac_ctrl_cov_grp hmac_ctrl_cov_grp1 = new(); + +endinterface + +`endif \ No newline at end of file diff --git a/src/hmac/rtl/hmac.sv b/src/hmac/rtl/hmac.sv index 81f9810f4..a9d0114c4 100644 --- a/src/hmac/rtl/hmac.sv +++ b/src/hmac/rtl/hmac.sv @@ -50,7 +50,8 @@ module hmac input kv_wr_resp_t kv_wr_resp, output wire error_intr, - output wire notif_intr + output wire notif_intr, + input logic debugUnlock_or_scan_mode_switch ); //---------------------------------------------------------------- @@ -102,6 +103,9 @@ module hmac logic kv_block_write_en; logic [4:0] kv_block_write_offset; logic [31:0] kv_block_write_data; + //KV Read Data Present + logic kv_read_data_present; + logic kv_read_data_present_set, kv_read_data_present_reset; logic dest_keyvault; kv_error_code_e kv_key_error, kv_block_error, kv_write_error; @@ -113,7 +117,6 @@ module hmac kv_read_ctrl_reg_t kv_block_read_ctrl_reg; kv_write_ctrl_reg_t kv_write_ctrl_reg; logic core_tag_we; - logic core_ready_reg; //---------------------------------------------------------------- // Concurrent connectivity for ports etc. //---------------------------------------------------------------- @@ -173,26 +176,30 @@ module hmac kv_reg <= '0; tag_reg <= '0; tag_valid_reg <= '0; - core_ready_reg <= '0; + ready_reg <= '0; + kv_read_data_present <= '0; end else if (zeroize_reg) begin kv_reg <= '0; tag_reg <= '0; tag_valid_reg <= '0; - core_ready_reg <= '0; + ready_reg <= '0; + kv_read_data_present <= '0; end else begin tag_valid_reg <= core_tag_valid; - core_ready_reg <= core_ready; + ready_reg <= core_ready; //write to sw register - if (core_tag_we & ~dest_keyvault) + if (core_tag_we & ~(dest_keyvault | kv_read_data_present)) tag_reg <= core_tag; - if (core_tag_we & dest_keyvault) + if (core_tag_we & (dest_keyvault | kv_read_data_present)) kv_reg <= core_tag; + kv_read_data_present <= kv_read_data_present_set ? '1 : + kv_read_data_present_reset ? '0 : kv_read_data_present; end end // reg_update @@ -210,10 +217,10 @@ always_comb begin //assign hardware readable registers to drive hmac core init_reg = hwif_out.HMAC384_CTRL.INIT.value; next_reg = hwif_out.HMAC384_CTRL.NEXT.value; - zeroize_reg = hwif_out.HMAC384_CTRL.ZEROIZE.value; + zeroize_reg = hwif_out.HMAC384_CTRL.ZEROIZE.value || debugUnlock_or_scan_mode_switch; //drive hardware writeable registers from hmac core - hwif_in.HMAC384_STATUS.READY.next = core_ready_reg; + hwif_in.HMAC384_STATUS.READY.next = ready_reg; hwif_in.HMAC384_STATUS.VALID.next = tag_valid_reg; for (int dword=0; dword < TAG_NUM_DWORDS; dword++) begin hwif_in.HMAC384_TAG[dword].TAG.next = tag_reg[(TAG_NUM_DWORDS - 1)-dword]; @@ -221,14 +228,14 @@ always_comb begin end //drive hardware writable registers from key vault for (int dword=0; dword < BLOCK_NUM_DWORDS; dword++)begin - hwif_in.HMAC384_BLOCK[dword].BLOCK.we = kv_block_write_en & (kv_block_write_offset == dword); + hwif_in.HMAC384_BLOCK[dword].BLOCK.we = (kv_block_write_en & (kv_block_write_offset == dword)) & !(zeroize_reg | kv_read_data_present_reset); hwif_in.HMAC384_BLOCK[dword].BLOCK.next = kv_block_write_data; - hwif_in.HMAC384_BLOCK[dword].BLOCK.hwclr = zeroize_reg; + hwif_in.HMAC384_BLOCK[dword].BLOCK.hwclr = zeroize_reg | kv_read_data_present_reset; end for (int dword=0; dword < KEY_NUM_DWORDS; dword++)begin - hwif_in.HMAC384_KEY[dword].KEY.we = kv_key_write_en & (kv_key_write_offset == dword); + hwif_in.HMAC384_KEY[dword].KEY.we = (kv_key_write_en & (kv_key_write_offset == dword)) & !(zeroize_reg | kv_read_data_present_reset); hwif_in.HMAC384_KEY[dword].KEY.next = kv_key_write_data; - hwif_in.HMAC384_KEY[dword].KEY.hwclr = zeroize_reg; + hwif_in.HMAC384_KEY[dword].KEY.hwclr = zeroize_reg | kv_read_data_present_reset; end //set ready when keyvault isn't busy hwif_in.HMAC384_KV_RD_KEY_STATUS.READY.next = kv_key_ready; @@ -268,6 +275,10 @@ end `CALIPTRA_KV_READ_CTRL_REG2STRUCT(kv_block_read_ctrl_reg, HMAC384_KV_RD_BLOCK_CTRL) `CALIPTRA_KV_WRITE_CTRL_REG2STRUCT(kv_write_ctrl_reg, HMAC384_KV_WR_CTRL) +//Force result into KV reg whenever source came from KV +always_comb kv_read_data_present_set = kv_key_read_ctrl_reg.read_en | kv_block_read_ctrl_reg.read_en; +always_comb kv_read_data_present_reset = kv_read_data_present & core_tag_we; + // Register block hmac_reg i_hmac_reg ( .clk(clk), @@ -309,6 +320,7 @@ hmac_key_kv_read ( .clk(clk), .rst_b(reset_n), + .zeroize(zeroize_reg), //client control register .read_ctrl_reg(kv_key_read_ctrl_reg), @@ -337,6 +349,7 @@ hmac_block_kv_read ( .clk(clk), .rst_b(reset_n), + .zeroize(zeroize_reg), //client control register .read_ctrl_reg(kv_block_read_ctrl_reg), @@ -363,6 +376,7 @@ hmac_result_kv_write ( .clk(clk), .rst_b(reset_n), + .zeroize(zeroize_reg), //client control register .write_ctrl_reg(kv_write_ctrl_reg), diff --git a/src/hmac/rtl/hmac_ctrl.sv b/src/hmac/rtl/hmac_ctrl.sv index f26c00284..b9c5482f6 100644 --- a/src/hmac/rtl/hmac_ctrl.sv +++ b/src/hmac/rtl/hmac_ctrl.sv @@ -58,7 +58,8 @@ module hmac_ctrl // Interrupt output logic error_intr, - output logic notif_intr + output logic notif_intr, + input logic debugUnlock_or_scan_mode_switch ); //---------------------------------------------------------------- @@ -88,7 +89,8 @@ module hmac_ctrl .kv_rd_resp(kv_rd_resp), .kv_wr_resp(kv_wr_resp), .error_intr(error_intr), - .notif_intr(notif_intr) + .notif_intr(notif_intr), + .debugUnlock_or_scan_mode_switch(debugUnlock_or_scan_mode_switch) ); //instantiate ahb lite module diff --git a/src/hmac/rtl/hmac_reg_uvm.sv b/src/hmac/rtl/hmac_reg_uvm.sv index 06f298f7c..f8259d2d8 100644 --- a/src/hmac/rtl/hmac_reg_uvm.sv +++ b/src/hmac/rtl/hmac_reg_uvm.sv @@ -3,44 +3,89 @@ package hmac_reg_uvm; `include "uvm_macros.svh" import uvm_pkg::*; - + `include "hmac_reg_covergroups.svh" // Reg - hmac_reg::HMAC384_NAME class hmac_reg__HMAC384_NAME extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + hmac_reg__HMAC384_NAME_bit_cg NAME_bit_cg[32]; + hmac_reg__HMAC384_NAME_fld_cg fld_cg; rand uvm_reg_field NAME; function new(string name = "hmac_reg__HMAC384_NAME"); - super.new(name, 32, UVM_NO_COVERAGE); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); virtual function void build(); this.NAME = new("NAME"); this.NAME.configure(this, 32, 0, "RO", 1, 'h0, 0, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(NAME_bit_cg[bt]) NAME_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); endfunction : build endclass : hmac_reg__HMAC384_NAME // Reg - hmac_reg::HMAC384_VERSION class hmac_reg__HMAC384_VERSION extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + hmac_reg__HMAC384_VERSION_bit_cg VERSION_bit_cg[32]; + hmac_reg__HMAC384_VERSION_fld_cg fld_cg; rand uvm_reg_field VERSION; function new(string name = "hmac_reg__HMAC384_VERSION"); - super.new(name, 32, UVM_NO_COVERAGE); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); virtual function void build(); this.VERSION = new("VERSION"); this.VERSION.configure(this, 32, 0, "RO", 1, 'h0, 0, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(VERSION_bit_cg[bt]) VERSION_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); endfunction : build endclass : hmac_reg__HMAC384_VERSION // Reg - hmac_reg::HMAC384_CTRL class hmac_reg__HMAC384_CTRL extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + hmac_reg__HMAC384_CTRL_bit_cg INIT_bit_cg[1]; + hmac_reg__HMAC384_CTRL_bit_cg NEXT_bit_cg[1]; + hmac_reg__HMAC384_CTRL_bit_cg ZEROIZE_bit_cg[1]; + hmac_reg__HMAC384_CTRL_fld_cg fld_cg; rand uvm_reg_field INIT; rand uvm_reg_field NEXT; rand uvm_reg_field ZEROIZE; function new(string name = "hmac_reg__HMAC384_CTRL"); - super.new(name, 32, UVM_NO_COVERAGE); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); virtual function void build(); this.INIT = new("INIT"); @@ -49,92 +94,195 @@ package hmac_reg_uvm; this.NEXT.configure(this, 1, 1, "WO", 0, 'h0, 1, 1, 0); this.ZEROIZE = new("ZEROIZE"); this.ZEROIZE.configure(this, 1, 2, "WO", 0, 'h0, 1, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(INIT_bit_cg[bt]) INIT_bit_cg[bt] = new(); + foreach(NEXT_bit_cg[bt]) NEXT_bit_cg[bt] = new(); + foreach(ZEROIZE_bit_cg[bt]) ZEROIZE_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); endfunction : build endclass : hmac_reg__HMAC384_CTRL // Reg - hmac_reg::HMAC384_STATUS class hmac_reg__HMAC384_STATUS extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + hmac_reg__HMAC384_STATUS_bit_cg READY_bit_cg[1]; + hmac_reg__HMAC384_STATUS_bit_cg VALID_bit_cg[1]; + hmac_reg__HMAC384_STATUS_fld_cg fld_cg; rand uvm_reg_field READY; rand uvm_reg_field VALID; function new(string name = "hmac_reg__HMAC384_STATUS"); - super.new(name, 32, UVM_NO_COVERAGE); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); virtual function void build(); this.READY = new("READY"); this.READY.configure(this, 1, 0, "RO", 1, 'h0, 1, 1, 0); this.VALID = new("VALID"); this.VALID.configure(this, 1, 1, "RO", 1, 'h0, 1, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(READY_bit_cg[bt]) READY_bit_cg[bt] = new(); + foreach(VALID_bit_cg[bt]) VALID_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); endfunction : build endclass : hmac_reg__HMAC384_STATUS // Reg - hmac_reg::HMAC384_KEY class hmac_reg__HMAC384_KEY extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + hmac_reg__HMAC384_KEY_bit_cg KEY_bit_cg[32]; + hmac_reg__HMAC384_KEY_fld_cg fld_cg; rand uvm_reg_field KEY; function new(string name = "hmac_reg__HMAC384_KEY"); - super.new(name, 32, UVM_NO_COVERAGE); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); virtual function void build(); this.KEY = new("KEY"); this.KEY.configure(this, 32, 0, "WO", 1, 'h0, 1, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(KEY_bit_cg[bt]) KEY_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); endfunction : build endclass : hmac_reg__HMAC384_KEY // Reg - hmac_reg::HMAC384_BLOCK class hmac_reg__HMAC384_BLOCK extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + hmac_reg__HMAC384_BLOCK_bit_cg BLOCK_bit_cg[32]; + hmac_reg__HMAC384_BLOCK_fld_cg fld_cg; rand uvm_reg_field BLOCK; function new(string name = "hmac_reg__HMAC384_BLOCK"); - super.new(name, 32, UVM_NO_COVERAGE); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); virtual function void build(); this.BLOCK = new("BLOCK"); this.BLOCK.configure(this, 32, 0, "WO", 1, 'h0, 1, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(BLOCK_bit_cg[bt]) BLOCK_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); endfunction : build endclass : hmac_reg__HMAC384_BLOCK // Reg - hmac_reg::HMAC384_TAG class hmac_reg__HMAC384_TAG extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + hmac_reg__HMAC384_TAG_bit_cg TAG_bit_cg[32]; + hmac_reg__HMAC384_TAG_fld_cg fld_cg; rand uvm_reg_field TAG; function new(string name = "hmac_reg__HMAC384_TAG"); - super.new(name, 32, UVM_NO_COVERAGE); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); virtual function void build(); this.TAG = new("TAG"); this.TAG.configure(this, 32, 0, "RO", 1, 'h0, 1, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(TAG_bit_cg[bt]) TAG_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); endfunction : build endclass : hmac_reg__HMAC384_TAG // Reg - hmac_reg::HMAC384_LFSR_SEED class hmac_reg__HMAC384_LFSR_SEED extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + hmac_reg__HMAC384_LFSR_SEED_bit_cg LFSR_SEED_bit_cg[32]; + hmac_reg__HMAC384_LFSR_SEED_fld_cg fld_cg; rand uvm_reg_field LFSR_SEED; function new(string name = "hmac_reg__HMAC384_LFSR_SEED"); - super.new(name, 32, UVM_NO_COVERAGE); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); virtual function void build(); this.LFSR_SEED = new("LFSR_SEED"); this.LFSR_SEED.configure(this, 32, 0, "WO", 0, 'h3cabffb0, 1, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(LFSR_SEED_bit_cg[bt]) LFSR_SEED_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); endfunction : build endclass : hmac_reg__HMAC384_LFSR_SEED // Reg - kv_read_ctrl_reg class kv_read_ctrl_reg extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + kv_read_ctrl_reg_bit_cg read_en_bit_cg[1]; + kv_read_ctrl_reg_bit_cg read_entry_bit_cg[5]; + kv_read_ctrl_reg_bit_cg pcr_hash_extend_bit_cg[1]; + kv_read_ctrl_reg_bit_cg rsvd_bit_cg[25]; + kv_read_ctrl_reg_fld_cg fld_cg; rand uvm_reg_field read_en; rand uvm_reg_field read_entry; rand uvm_reg_field pcr_hash_extend; rand uvm_reg_field rsvd; function new(string name = "kv_read_ctrl_reg"); - super.new(name, 32, UVM_NO_COVERAGE); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); virtual function void build(); this.read_en = new("read_en"); @@ -145,18 +293,39 @@ package hmac_reg_uvm; this.pcr_hash_extend.configure(this, 1, 6, "RW", 0, 'h0, 1, 1, 0); this.rsvd = new("rsvd"); this.rsvd.configure(this, 25, 7, "RW", 0, 'h0, 1, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(read_en_bit_cg[bt]) read_en_bit_cg[bt] = new(); + foreach(read_entry_bit_cg[bt]) read_entry_bit_cg[bt] = new(); + foreach(pcr_hash_extend_bit_cg[bt]) pcr_hash_extend_bit_cg[bt] = new(); + foreach(rsvd_bit_cg[bt]) rsvd_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); endfunction : build endclass : kv_read_ctrl_reg // Reg - kv_status_reg class kv_status_reg extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + kv_status_reg_bit_cg READY_bit_cg[1]; + kv_status_reg_bit_cg VALID_bit_cg[1]; + kv_status_reg_bit_cg ERROR_bit_cg[8]; + kv_status_reg_fld_cg fld_cg; rand uvm_reg_field READY; rand uvm_reg_field VALID; rand uvm_reg_field ERROR; function new(string name = "kv_status_reg"); - super.new(name, 32, UVM_NO_COVERAGE); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); virtual function void build(); this.READY = new("READY"); @@ -165,11 +334,31 @@ package hmac_reg_uvm; this.VALID.configure(this, 1, 1, "RO", 1, 'h0, 1, 1, 0); this.ERROR = new("ERROR"); this.ERROR.configure(this, 8, 2, "RO", 1, 'h0, 1, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(READY_bit_cg[bt]) READY_bit_cg[bt] = new(); + foreach(VALID_bit_cg[bt]) VALID_bit_cg[bt] = new(); + foreach(ERROR_bit_cg[bt]) ERROR_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); endfunction : build endclass : kv_status_reg // Reg - kv_write_ctrl_reg class kv_write_ctrl_reg extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + kv_write_ctrl_reg_bit_cg write_en_bit_cg[1]; + kv_write_ctrl_reg_bit_cg write_entry_bit_cg[5]; + kv_write_ctrl_reg_bit_cg hmac_key_dest_valid_bit_cg[1]; + kv_write_ctrl_reg_bit_cg hmac_block_dest_valid_bit_cg[1]; + kv_write_ctrl_reg_bit_cg sha_block_dest_valid_bit_cg[1]; + kv_write_ctrl_reg_bit_cg ecc_pkey_dest_valid_bit_cg[1]; + kv_write_ctrl_reg_bit_cg ecc_seed_dest_valid_bit_cg[1]; + kv_write_ctrl_reg_bit_cg rsvd_bit_cg[21]; + kv_write_ctrl_reg_fld_cg fld_cg; rand uvm_reg_field write_en; rand uvm_reg_field write_entry; rand uvm_reg_field hmac_key_dest_valid; @@ -180,8 +369,13 @@ package hmac_reg_uvm; rand uvm_reg_field rsvd; function new(string name = "kv_write_ctrl_reg"); - super.new(name, 32, UVM_NO_COVERAGE); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); virtual function void build(); this.write_en = new("write_en"); @@ -200,36 +394,80 @@ package hmac_reg_uvm; this.ecc_seed_dest_valid.configure(this, 1, 10, "RW", 0, 'h0, 1, 1, 0); this.rsvd = new("rsvd"); this.rsvd.configure(this, 21, 11, "RW", 0, 'h0, 1, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(write_en_bit_cg[bt]) write_en_bit_cg[bt] = new(); + foreach(write_entry_bit_cg[bt]) write_entry_bit_cg[bt] = new(); + foreach(hmac_key_dest_valid_bit_cg[bt]) hmac_key_dest_valid_bit_cg[bt] = new(); + foreach(hmac_block_dest_valid_bit_cg[bt]) hmac_block_dest_valid_bit_cg[bt] = new(); + foreach(sha_block_dest_valid_bit_cg[bt]) sha_block_dest_valid_bit_cg[bt] = new(); + foreach(ecc_pkey_dest_valid_bit_cg[bt]) ecc_pkey_dest_valid_bit_cg[bt] = new(); + foreach(ecc_seed_dest_valid_bit_cg[bt]) ecc_seed_dest_valid_bit_cg[bt] = new(); + foreach(rsvd_bit_cg[bt]) rsvd_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); endfunction : build endclass : kv_write_ctrl_reg // Reg - hmac_reg::global_intr_en_t class hmac_reg__global_intr_en_t extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + hmac_reg__global_intr_en_t_bit_cg error_en_bit_cg[1]; + hmac_reg__global_intr_en_t_bit_cg notif_en_bit_cg[1]; + hmac_reg__global_intr_en_t_fld_cg fld_cg; rand uvm_reg_field error_en; rand uvm_reg_field notif_en; function new(string name = "hmac_reg__global_intr_en_t"); - super.new(name, 32, UVM_NO_COVERAGE); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); virtual function void build(); this.error_en = new("error_en"); this.error_en.configure(this, 1, 0, "RW", 0, 'h0, 1, 1, 0); this.notif_en = new("notif_en"); this.notif_en.configure(this, 1, 1, "RW", 0, 'h0, 1, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(error_en_bit_cg[bt]) error_en_bit_cg[bt] = new(); + foreach(notif_en_bit_cg[bt]) notif_en_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); endfunction : build endclass : hmac_reg__global_intr_en_t // Reg - hmac_reg::error_intr_en_t class hmac_reg__error_intr_en_t extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + hmac_reg__error_intr_en_t_bit_cg error0_en_bit_cg[1]; + hmac_reg__error_intr_en_t_bit_cg error1_en_bit_cg[1]; + hmac_reg__error_intr_en_t_bit_cg error2_en_bit_cg[1]; + hmac_reg__error_intr_en_t_bit_cg error3_en_bit_cg[1]; + hmac_reg__error_intr_en_t_fld_cg fld_cg; rand uvm_reg_field error0_en; rand uvm_reg_field error1_en; rand uvm_reg_field error2_en; rand uvm_reg_field error3_en; function new(string name = "hmac_reg__error_intr_en_t"); - super.new(name, 32, UVM_NO_COVERAGE); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); virtual function void build(); this.error0_en = new("error0_en"); @@ -240,61 +478,131 @@ package hmac_reg_uvm; this.error2_en.configure(this, 1, 2, "RW", 0, 'h0, 1, 1, 0); this.error3_en = new("error3_en"); this.error3_en.configure(this, 1, 3, "RW", 0, 'h0, 1, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(error0_en_bit_cg[bt]) error0_en_bit_cg[bt] = new(); + foreach(error1_en_bit_cg[bt]) error1_en_bit_cg[bt] = new(); + foreach(error2_en_bit_cg[bt]) error2_en_bit_cg[bt] = new(); + foreach(error3_en_bit_cg[bt]) error3_en_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); endfunction : build endclass : hmac_reg__error_intr_en_t // Reg - hmac_reg::notif_intr_en_t class hmac_reg__notif_intr_en_t extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + hmac_reg__notif_intr_en_t_bit_cg notif_cmd_done_en_bit_cg[1]; + hmac_reg__notif_intr_en_t_fld_cg fld_cg; rand uvm_reg_field notif_cmd_done_en; function new(string name = "hmac_reg__notif_intr_en_t"); - super.new(name, 32, UVM_NO_COVERAGE); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); virtual function void build(); this.notif_cmd_done_en = new("notif_cmd_done_en"); this.notif_cmd_done_en.configure(this, 1, 0, "RW", 0, 'h0, 1, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(notif_cmd_done_en_bit_cg[bt]) notif_cmd_done_en_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); endfunction : build endclass : hmac_reg__notif_intr_en_t // Reg - hmac_reg::global_intr_t_agg_sts_dd3dcf0a class hmac_reg__global_intr_t_agg_sts_dd3dcf0a extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + hmac_reg__global_intr_t_agg_sts_dd3dcf0a_bit_cg agg_sts_bit_cg[1]; + hmac_reg__global_intr_t_agg_sts_dd3dcf0a_fld_cg fld_cg; rand uvm_reg_field agg_sts; function new(string name = "hmac_reg__global_intr_t_agg_sts_dd3dcf0a"); - super.new(name, 32, UVM_NO_COVERAGE); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); virtual function void build(); this.agg_sts = new("agg_sts"); this.agg_sts.configure(this, 1, 0, "RO", 1, 'h0, 1, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(agg_sts_bit_cg[bt]) agg_sts_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); endfunction : build endclass : hmac_reg__global_intr_t_agg_sts_dd3dcf0a // Reg - hmac_reg::global_intr_t_agg_sts_e6399b4a class hmac_reg__global_intr_t_agg_sts_e6399b4a extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + hmac_reg__global_intr_t_agg_sts_e6399b4a_bit_cg agg_sts_bit_cg[1]; + hmac_reg__global_intr_t_agg_sts_e6399b4a_fld_cg fld_cg; rand uvm_reg_field agg_sts; function new(string name = "hmac_reg__global_intr_t_agg_sts_e6399b4a"); - super.new(name, 32, UVM_NO_COVERAGE); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); virtual function void build(); this.agg_sts = new("agg_sts"); this.agg_sts.configure(this, 1, 0, "RO", 1, 'h0, 1, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(agg_sts_bit_cg[bt]) agg_sts_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); endfunction : build endclass : hmac_reg__global_intr_t_agg_sts_e6399b4a // Reg - hmac_reg::error_intr_t_error0_sts_28545624_error1_sts_40e0d3e1_error2_sts_b1cf2205_error3_sts_74a35378 class hmac_reg__error_intr_t_error0_sts_28545624_error1_sts_40e0d3e1_error2_sts_b1cf2205_error3_sts_74a35378 extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + hmac_reg__error_intr_t_error0_sts_28545624_error1_sts_40e0d3e1_error2_sts_b1cf2205_error3_sts_74a35378_bit_cg error0_sts_bit_cg[1]; + hmac_reg__error_intr_t_error0_sts_28545624_error1_sts_40e0d3e1_error2_sts_b1cf2205_error3_sts_74a35378_bit_cg error1_sts_bit_cg[1]; + hmac_reg__error_intr_t_error0_sts_28545624_error1_sts_40e0d3e1_error2_sts_b1cf2205_error3_sts_74a35378_bit_cg error2_sts_bit_cg[1]; + hmac_reg__error_intr_t_error0_sts_28545624_error1_sts_40e0d3e1_error2_sts_b1cf2205_error3_sts_74a35378_bit_cg error3_sts_bit_cg[1]; + hmac_reg__error_intr_t_error0_sts_28545624_error1_sts_40e0d3e1_error2_sts_b1cf2205_error3_sts_74a35378_fld_cg fld_cg; rand uvm_reg_field error0_sts; rand uvm_reg_field error1_sts; rand uvm_reg_field error2_sts; rand uvm_reg_field error3_sts; function new(string name = "hmac_reg__error_intr_t_error0_sts_28545624_error1_sts_40e0d3e1_error2_sts_b1cf2205_error3_sts_74a35378"); - super.new(name, 32, UVM_NO_COVERAGE); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); virtual function void build(); this.error0_sts = new("error0_sts"); @@ -305,33 +613,71 @@ package hmac_reg_uvm; this.error2_sts.configure(this, 1, 2, "W1C", 1, 'h0, 1, 1, 0); this.error3_sts = new("error3_sts"); this.error3_sts.configure(this, 1, 3, "W1C", 1, 'h0, 1, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(error0_sts_bit_cg[bt]) error0_sts_bit_cg[bt] = new(); + foreach(error1_sts_bit_cg[bt]) error1_sts_bit_cg[bt] = new(); + foreach(error2_sts_bit_cg[bt]) error2_sts_bit_cg[bt] = new(); + foreach(error3_sts_bit_cg[bt]) error3_sts_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); endfunction : build endclass : hmac_reg__error_intr_t_error0_sts_28545624_error1_sts_40e0d3e1_error2_sts_b1cf2205_error3_sts_74a35378 // Reg - hmac_reg::notif_intr_t_notif_cmd_done_sts_1c68637e class hmac_reg__notif_intr_t_notif_cmd_done_sts_1c68637e extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + hmac_reg__notif_intr_t_notif_cmd_done_sts_1c68637e_bit_cg notif_cmd_done_sts_bit_cg[1]; + hmac_reg__notif_intr_t_notif_cmd_done_sts_1c68637e_fld_cg fld_cg; rand uvm_reg_field notif_cmd_done_sts; function new(string name = "hmac_reg__notif_intr_t_notif_cmd_done_sts_1c68637e"); - super.new(name, 32, UVM_NO_COVERAGE); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); virtual function void build(); this.notif_cmd_done_sts = new("notif_cmd_done_sts"); this.notif_cmd_done_sts.configure(this, 1, 0, "W1C", 1, 'h0, 1, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(notif_cmd_done_sts_bit_cg[bt]) notif_cmd_done_sts_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); endfunction : build endclass : hmac_reg__notif_intr_t_notif_cmd_done_sts_1c68637e // Reg - hmac_reg::error_intr_trig_t class hmac_reg__error_intr_trig_t extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + hmac_reg__error_intr_trig_t_bit_cg error0_trig_bit_cg[1]; + hmac_reg__error_intr_trig_t_bit_cg error1_trig_bit_cg[1]; + hmac_reg__error_intr_trig_t_bit_cg error2_trig_bit_cg[1]; + hmac_reg__error_intr_trig_t_bit_cg error3_trig_bit_cg[1]; + hmac_reg__error_intr_trig_t_fld_cg fld_cg; rand uvm_reg_field error0_trig; rand uvm_reg_field error1_trig; rand uvm_reg_field error2_trig; rand uvm_reg_field error3_trig; function new(string name = "hmac_reg__error_intr_trig_t"); - super.new(name, 32, UVM_NO_COVERAGE); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); virtual function void build(); this.error0_trig = new("error0_trig"); @@ -342,160 +688,344 @@ package hmac_reg_uvm; this.error2_trig.configure(this, 1, 2, "W1S", 0, 'h0, 1, 1, 0); this.error3_trig = new("error3_trig"); this.error3_trig.configure(this, 1, 3, "W1S", 0, 'h0, 1, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(error0_trig_bit_cg[bt]) error0_trig_bit_cg[bt] = new(); + foreach(error1_trig_bit_cg[bt]) error1_trig_bit_cg[bt] = new(); + foreach(error2_trig_bit_cg[bt]) error2_trig_bit_cg[bt] = new(); + foreach(error3_trig_bit_cg[bt]) error3_trig_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); endfunction : build endclass : hmac_reg__error_intr_trig_t // Reg - hmac_reg::notif_intr_trig_t class hmac_reg__notif_intr_trig_t extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + hmac_reg__notif_intr_trig_t_bit_cg notif_cmd_done_trig_bit_cg[1]; + hmac_reg__notif_intr_trig_t_fld_cg fld_cg; rand uvm_reg_field notif_cmd_done_trig; function new(string name = "hmac_reg__notif_intr_trig_t"); - super.new(name, 32, UVM_NO_COVERAGE); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); virtual function void build(); this.notif_cmd_done_trig = new("notif_cmd_done_trig"); this.notif_cmd_done_trig.configure(this, 1, 0, "W1S", 0, 'h0, 1, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(notif_cmd_done_trig_bit_cg[bt]) notif_cmd_done_trig_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); endfunction : build endclass : hmac_reg__notif_intr_trig_t // Reg - hmac_reg::intr_count_t_cnt_35ace267 class hmac_reg__intr_count_t_cnt_35ace267 extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + hmac_reg__intr_count_t_cnt_35ace267_bit_cg cnt_bit_cg[32]; + hmac_reg__intr_count_t_cnt_35ace267_fld_cg fld_cg; rand uvm_reg_field cnt; function new(string name = "hmac_reg__intr_count_t_cnt_35ace267"); - super.new(name, 32, UVM_NO_COVERAGE); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); virtual function void build(); this.cnt = new("cnt"); this.cnt.configure(this, 32, 0, "RW", 1, 'h0, 1, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(cnt_bit_cg[bt]) cnt_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); endfunction : build endclass : hmac_reg__intr_count_t_cnt_35ace267 // Reg - hmac_reg::intr_count_t_cnt_73c42c28 class hmac_reg__intr_count_t_cnt_73c42c28 extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + hmac_reg__intr_count_t_cnt_73c42c28_bit_cg cnt_bit_cg[32]; + hmac_reg__intr_count_t_cnt_73c42c28_fld_cg fld_cg; rand uvm_reg_field cnt; function new(string name = "hmac_reg__intr_count_t_cnt_73c42c28"); - super.new(name, 32, UVM_NO_COVERAGE); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); virtual function void build(); this.cnt = new("cnt"); this.cnt.configure(this, 32, 0, "RW", 1, 'h0, 1, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(cnt_bit_cg[bt]) cnt_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); endfunction : build endclass : hmac_reg__intr_count_t_cnt_73c42c28 // Reg - hmac_reg::intr_count_t_cnt_d8af96ff class hmac_reg__intr_count_t_cnt_d8af96ff extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + hmac_reg__intr_count_t_cnt_d8af96ff_bit_cg cnt_bit_cg[32]; + hmac_reg__intr_count_t_cnt_d8af96ff_fld_cg fld_cg; rand uvm_reg_field cnt; function new(string name = "hmac_reg__intr_count_t_cnt_d8af96ff"); - super.new(name, 32, UVM_NO_COVERAGE); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); virtual function void build(); this.cnt = new("cnt"); this.cnt.configure(this, 32, 0, "RW", 1, 'h0, 1, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(cnt_bit_cg[bt]) cnt_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); endfunction : build endclass : hmac_reg__intr_count_t_cnt_d8af96ff // Reg - hmac_reg::intr_count_t_cnt_9bd7f809 class hmac_reg__intr_count_t_cnt_9bd7f809 extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + hmac_reg__intr_count_t_cnt_9bd7f809_bit_cg cnt_bit_cg[32]; + hmac_reg__intr_count_t_cnt_9bd7f809_fld_cg fld_cg; rand uvm_reg_field cnt; function new(string name = "hmac_reg__intr_count_t_cnt_9bd7f809"); - super.new(name, 32, UVM_NO_COVERAGE); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); virtual function void build(); this.cnt = new("cnt"); this.cnt.configure(this, 32, 0, "RW", 1, 'h0, 1, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(cnt_bit_cg[bt]) cnt_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); endfunction : build endclass : hmac_reg__intr_count_t_cnt_9bd7f809 // Reg - hmac_reg::intr_count_t_cnt_be67d6d5 class hmac_reg__intr_count_t_cnt_be67d6d5 extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + hmac_reg__intr_count_t_cnt_be67d6d5_bit_cg cnt_bit_cg[32]; + hmac_reg__intr_count_t_cnt_be67d6d5_fld_cg fld_cg; rand uvm_reg_field cnt; function new(string name = "hmac_reg__intr_count_t_cnt_be67d6d5"); - super.new(name, 32, UVM_NO_COVERAGE); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); virtual function void build(); this.cnt = new("cnt"); this.cnt.configure(this, 32, 0, "RW", 1, 'h0, 1, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(cnt_bit_cg[bt]) cnt_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); endfunction : build endclass : hmac_reg__intr_count_t_cnt_be67d6d5 // Reg - hmac_reg::intr_count_incr_t_pulse_37026c97 class hmac_reg__intr_count_incr_t_pulse_37026c97 extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + hmac_reg__intr_count_incr_t_pulse_37026c97_bit_cg pulse_bit_cg[1]; + hmac_reg__intr_count_incr_t_pulse_37026c97_fld_cg fld_cg; rand uvm_reg_field pulse; function new(string name = "hmac_reg__intr_count_incr_t_pulse_37026c97"); - super.new(name, 32, UVM_NO_COVERAGE); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); virtual function void build(); this.pulse = new("pulse"); this.pulse.configure(this, 1, 0, "RO", 1, 'h0, 1, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(pulse_bit_cg[bt]) pulse_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); endfunction : build endclass : hmac_reg__intr_count_incr_t_pulse_37026c97 // Reg - hmac_reg::intr_count_incr_t_pulse_d860d977 class hmac_reg__intr_count_incr_t_pulse_d860d977 extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + hmac_reg__intr_count_incr_t_pulse_d860d977_bit_cg pulse_bit_cg[1]; + hmac_reg__intr_count_incr_t_pulse_d860d977_fld_cg fld_cg; rand uvm_reg_field pulse; function new(string name = "hmac_reg__intr_count_incr_t_pulse_d860d977"); - super.new(name, 32, UVM_NO_COVERAGE); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); virtual function void build(); this.pulse = new("pulse"); this.pulse.configure(this, 1, 0, "RO", 1, 'h0, 1, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(pulse_bit_cg[bt]) pulse_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); endfunction : build endclass : hmac_reg__intr_count_incr_t_pulse_d860d977 // Reg - hmac_reg::intr_count_incr_t_pulse_87b45fe7 class hmac_reg__intr_count_incr_t_pulse_87b45fe7 extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + hmac_reg__intr_count_incr_t_pulse_87b45fe7_bit_cg pulse_bit_cg[1]; + hmac_reg__intr_count_incr_t_pulse_87b45fe7_fld_cg fld_cg; rand uvm_reg_field pulse; function new(string name = "hmac_reg__intr_count_incr_t_pulse_87b45fe7"); - super.new(name, 32, UVM_NO_COVERAGE); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); virtual function void build(); this.pulse = new("pulse"); this.pulse.configure(this, 1, 0, "RO", 1, 'h0, 1, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(pulse_bit_cg[bt]) pulse_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); endfunction : build endclass : hmac_reg__intr_count_incr_t_pulse_87b45fe7 // Reg - hmac_reg::intr_count_incr_t_pulse_c1689ee6 class hmac_reg__intr_count_incr_t_pulse_c1689ee6 extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + hmac_reg__intr_count_incr_t_pulse_c1689ee6_bit_cg pulse_bit_cg[1]; + hmac_reg__intr_count_incr_t_pulse_c1689ee6_fld_cg fld_cg; rand uvm_reg_field pulse; function new(string name = "hmac_reg__intr_count_incr_t_pulse_c1689ee6"); - super.new(name, 32, UVM_NO_COVERAGE); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); virtual function void build(); this.pulse = new("pulse"); this.pulse.configure(this, 1, 0, "RO", 1, 'h0, 1, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(pulse_bit_cg[bt]) pulse_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); endfunction : build endclass : hmac_reg__intr_count_incr_t_pulse_c1689ee6 // Reg - hmac_reg::intr_count_incr_t_pulse_6173128e class hmac_reg__intr_count_incr_t_pulse_6173128e extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + hmac_reg__intr_count_incr_t_pulse_6173128e_bit_cg pulse_bit_cg[1]; + hmac_reg__intr_count_incr_t_pulse_6173128e_fld_cg fld_cg; rand uvm_reg_field pulse; function new(string name = "hmac_reg__intr_count_incr_t_pulse_6173128e"); - super.new(name, 32, UVM_NO_COVERAGE); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); virtual function void build(); this.pulse = new("pulse"); this.pulse.configure(this, 1, 0, "RO", 1, 'h0, 1, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(pulse_bit_cg[bt]) pulse_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); endfunction : build endclass : hmac_reg__intr_count_incr_t_pulse_6173128e @@ -738,4 +1268,5 @@ package hmac_reg_uvm; endfunction : build endclass : hmac_reg + `include "hmac_reg_sample.svh" endpackage: hmac_reg_uvm diff --git a/src/hmac/tb/hmac_ctrl_tb.sv b/src/hmac/tb/hmac_ctrl_tb.sv index 3b9658f7b..c070ed310 100644 --- a/src/hmac/tb/hmac_ctrl_tb.sv +++ b/src/hmac/tb/hmac_ctrl_tb.sv @@ -39,9 +39,8 @@ module hmac_ctrl_tb(); parameter ADDR_VERSION = BASE_ADDR + 32'h00000008; parameter ADDR_CTRL = BASE_ADDR + 32'h00000010; - parameter CTRL_INIT_VALUE = 8'h01; - parameter CTRL_NEXT_VALUE = 8'h02; - parameter CTRL_MODE_VALUE = 8'h04; + parameter CTRL_INIT_VALUE = 2'h1; + parameter CTRL_NEXT_VALUE = 2'h2; parameter ADDR_STATUS = BASE_ADDR + 32'h00000018; parameter STATUS_READY_BIT = 0; @@ -146,6 +145,9 @@ module hmac_ctrl_tb(); reg [63 : 0] read_data; reg [383 : 0] digest_data; + //bind coverage file + hmac_ctrl_cov_bind i_hmac_ctrl_cov_bind(); + //---------------------------------------------------------------- // Device Under Test. //---------------------------------------------------------------- @@ -176,7 +178,8 @@ module hmac_ctrl_tb(); .kv_wr_resp('x), .error_intr(), - .notif_intr() + .notif_intr(), + .debugUnlock_or_scan_mode_switch('0) ); @@ -537,6 +540,9 @@ module hmac_ctrl_tb(); wait_ready(); data_in_time = cycle_ctr; read_digest(); + + write_single_word(ADDR_CTRL, {29'h0, 1'b1, 2'b0}); //zeroize + data_in_time = cycle_ctr - data_in_time; $display("*** DATA OUT processing time = %01d cycles", data_in_time); end_time = cycle_ctr - start_time; @@ -549,8 +555,8 @@ module hmac_ctrl_tb(); else begin $display("TC%01d: ERROR.", tc_ctr); - $display("TC%01d: Expected: 0x%064x", tc_ctr, expected); - $display("TC%01d: Got: 0x%064x", tc_ctr, digest_data); + $display("TC%01d: Expected: 0x%096x", tc_ctr, expected); + $display("TC%01d: Got: 0x%096x", tc_ctr, digest_data); error_ctr = error_ctr + 1; end $display("*** TC%01d - Single block test done.", tc_ctr); @@ -604,6 +610,8 @@ module hmac_ctrl_tb(); wait_ready(); read_digest(); + write_single_word(ADDR_CTRL, {29'h0, 1'b1, 2'b0}); //zeroize + end_time = cycle_ctr - start_time; $display("*** Double block test processing time = %01d cycles", end_time); @@ -614,8 +622,8 @@ module hmac_ctrl_tb(); else begin $display("TC%01d: ERROR in final digest", tc_ctr); - $display("TC%01d: Expected: 0x%064x", tc_ctr, expected); - $display("TC%01d: Got: 0x%064x", tc_ctr, digest_data); + $display("TC%01d: Expected: 0x%096x", tc_ctr, expected); + $display("TC%01d: Got: 0x%096x", tc_ctr, digest_data); error_ctr = error_ctr + 1; end @@ -625,6 +633,230 @@ module hmac_ctrl_tb(); endtask // double_block_test + //---------------------------------------------------------------- + // continuous_cmd_test() + // + // + // Perform test of a double block digest. + //---------------------------------------------------------------- + task continuous_cmd_test(input [383 : 0] key, + input [1023: 0] block0, + input [1023: 0] block1, + input [159: 0] seed, + input [383 : 0] expected + ); + begin + reg [31 : 0] start_time; + reg [31 : 0] end_time; + + start_time = cycle_ctr; + $display("*** TC%01d - continuous_cmd_test started.", tc_ctr); + + write_key(key); + + // First block + write_block(block0); + + write_seed(seed); + + write_single_word(ADDR_CTRL, CTRL_INIT_VALUE); + #CLK_PERIOD; + hsel_i_tb = 0; + + #(CLK_PERIOD); + + for (int i=0; i<10; i++) + begin + write_single_word(ADDR_CTRL, CTRL_INIT_VALUE); + #CLK_PERIOD; + write_single_word(ADDR_CTRL, CTRL_NEXT_VALUE); + #CLK_PERIOD; + end + + #(CLK_PERIOD); + wait_ready(); + + // Final block + write_block(block1); + + write_single_word(ADDR_CTRL, CTRL_NEXT_VALUE); + #CLK_PERIOD; + hsel_i_tb = 0; + + #(CLK_PERIOD); + + for (int i=0; i<10; i++) + begin + write_single_word(ADDR_CTRL, CTRL_INIT_VALUE); + #CLK_PERIOD; + write_single_word(ADDR_CTRL, CTRL_NEXT_VALUE); + #CLK_PERIOD; + end + + #(CLK_PERIOD); + wait_ready(); + read_digest(); + + write_single_word(ADDR_CTRL, {29'h0, 1'b1, 2'b0}); //zeroize + + end_time = cycle_ctr - start_time; + $display("*** continuous_cmd_test processing time = %01d cycles", end_time); + + if (digest_data == expected) + begin + $display("TC%01d final block: OK.", tc_ctr); + end + else + begin + $display("TC%01d: ERROR in final digest", tc_ctr); + $display("TC%01d: Expected: 0x%096x", tc_ctr, expected); + $display("TC%01d: Got: 0x%096x", tc_ctr, digest_data); + error_ctr = error_ctr + 1; + end + + $display("*** TC%01d - continuous_cmd_test done.", tc_ctr); + tc_ctr = tc_ctr + 1; + end + endtask // continuous_cmd_test + + //---------------------------------------------------------------- + // zeroize_test() + // + //---------------------------------------------------------------- + task zeroize_test(input [383 : 0] key, + input [1023: 0] block0, + input [1023: 0] block1, + input [159: 0] seed, + input [383 : 0] expected + ); + begin + + $display("*** TC%01d - zeroize test started.", tc_ctr); + + // First test: assert zeroize when engine is working + write_key(key); + + write_block(block0); + + write_seed(seed); + + write_single_word(ADDR_CTRL, CTRL_INIT_VALUE); + #CLK_PERIOD; + hsel_i_tb = 0; + + for (int i=0; i<10; i++) + begin + #(CLK_PERIOD); + end + + write_single_word(ADDR_CTRL, {29'h0, 1'b1, 2'b0}); //zeroize + + wait_ready(); + read_digest(); + if (digest_data == 0) + begin + $display("TC%01d final block: OK.", tc_ctr); + end + else + begin + $display("TC%01d: ERROR in final digest", tc_ctr); + $display("TC%01d: Expected: 0x%096x", tc_ctr, 0); + $display("TC%01d: Got: 0x%096x", tc_ctr, digest_data); + error_ctr = error_ctr + 1; + end + tc_ctr = tc_ctr + 1; + + // Second test: assert zeroize with INIT + write_key(key); + + write_block(block0); + + write_seed(seed); + + write_single_word(ADDR_CTRL, {29'h0, 1'b1, CTRL_INIT_VALUE}); //zeroize + #CLK_PERIOD; + hsel_i_tb = 0; + #(CLK_PERIOD); + + wait_ready(); + read_digest(); + if (digest_data == 0) + begin + $display("TC%01d final block: OK.", tc_ctr); + end + else + begin + $display("TC%01d: ERROR in final digest", tc_ctr); + $display("TC%01d: Expected: 0x%096x", tc_ctr, 0); + $display("TC%01d: Got: 0x%096x", tc_ctr, digest_data); + error_ctr = error_ctr + 1; + end + tc_ctr = tc_ctr + 1; + + // Third test: assert zeroize with NEXT + write_key(key); + + write_block(block0); + + write_seed(seed); + + write_single_word(ADDR_CTRL, {29'h0, 1'b1, CTRL_NEXT_VALUE}); //zeroize + #CLK_PERIOD; + hsel_i_tb = 0; + #(CLK_PERIOD); + + wait_ready(); + read_digest(); + if (digest_data == 0) + begin + $display("TC%01d final block: OK.", tc_ctr); + end + else + begin + $display("TC%01d: ERROR in final digest", tc_ctr); + $display("TC%01d: Expected: 0x%096x", tc_ctr, 0); + $display("TC%01d: Got: 0x%096x", tc_ctr, digest_data); + error_ctr = error_ctr + 1; + end + tc_ctr = tc_ctr + 1; + + // Forth test: assert zeroize after NEXT + write_key(key); + + write_block(block0); + + write_seed(seed); + + write_single_word(ADDR_CTRL, CTRL_NEXT_VALUE); + #CLK_PERIOD; + hsel_i_tb = 0; + + for (int i=0; i<10; i++) + begin + #(CLK_PERIOD); + end + + write_single_word(ADDR_CTRL, {29'h0, 1'b1, 2'b0}); //zeroize + + wait_ready(); + read_digest(); + if (digest_data == 0) + begin + $display("TC%01d final block: OK.", tc_ctr); + end + else + begin + $display("TC%01d: ERROR in final digest", tc_ctr); + $display("TC%01d: Expected: 0x%096x", tc_ctr, 0); + $display("TC%01d: Got: 0x%096x", tc_ctr, digest_data); + error_ctr = error_ctr + 1; + end + + $display("*** TC%01d - zeroize test done.", tc_ctr); + tc_ctr = tc_ctr + 1; + end + endtask // zeroize_test + //---------------------------------------------------------------- // hmac_tests() // @@ -699,6 +931,10 @@ module hmac_ctrl_tb(); seed4 = random_gen(); double_block_test(key4, data40, data41, seed4, expected4); + + continuous_cmd_test(key4, data40, data41, seed4, expected4); + + zeroize_test(key4, data40, data41, seed4, expected4); $display("*** Testcases for PRF-HMAC-SHA-384 functionality completed."); end diff --git a/src/hmac/uvmf_2022/config/compile.yml b/src/hmac/uvmf_2022/config/compile.yml index 46d7a406a..1fc2a84f7 100644 --- a/src/hmac/uvmf_2022/config/compile.yml +++ b/src/hmac/uvmf_2022/config/compile.yml @@ -4,6 +4,7 @@ schema_version: 2.4.0 requires: - uvmf_lib - hmac_ctrl + - hmac_coverage targets: tb: directories: diff --git a/src/hmac/uvmf_2022/uvmf_template_output/project_benches/HMAC/tb/testbench/hdl_top.sv b/src/hmac/uvmf_2022/uvmf_template_output/project_benches/HMAC/tb/testbench/hdl_top.sv index 9758dbce2..feeda3abe 100644 --- a/src/hmac/uvmf_2022/uvmf_template_output/project_benches/HMAC/tb/testbench/hdl_top.sv +++ b/src/hmac/uvmf_2022/uvmf_template_output/project_benches/HMAC/tb/testbench/hdl_top.sv @@ -98,7 +98,14 @@ hmac_ctrl #( .hsize_i (HMAC_in_agent_bus.hsize), .hresp_o (HMAC_out_agent_bus.hresp), .hreadyout_o (HMAC_out_agent_bus.hreadyout), - .hrdata_o (HMAC_out_agent_bus.hrdata) + .hrdata_o (HMAC_out_agent_bus.hrdata), + .kv_read (), + .kv_write (), + .kv_rd_resp (), + .kv_wr_resp (), + .error_intr (), + .notif_intr (), + .debugUnlock_or_scan_mode_switch('0) ); // pragma uvmf custom dut_instantiation end diff --git a/src/hmac_drbg/config/hmac_drbg.vf b/src/hmac_drbg/config/hmac_drbg.vf index 8e31d11fa..2e7367213 100644 --- a/src/hmac_drbg/config/hmac_drbg.vf +++ b/src/hmac_drbg/config/hmac_drbg.vf @@ -17,6 +17,7 @@ ${CALIPTRA_ROOT}/src/libs/rtl/apb_slv_sif.sv ${CALIPTRA_ROOT}/src/libs/rtl/ahb_slv_sif.sv ${CALIPTRA_ROOT}/src/libs/rtl/caliptra_icg.sv ${CALIPTRA_ROOT}/src/libs/rtl/clk_gate.sv +${CALIPTRA_ROOT}/src/libs/rtl/caliptra_2ff_sync.sv ${CALIPTRA_ROOT}/src/keyvault/rtl/kv_defines_pkg.sv ${CALIPTRA_ROOT}/src/keyvault/rtl/kv_macros.svh ${CALIPTRA_ROOT}/src/pcrvault/rtl/pv_defines_pkg.sv @@ -33,9 +34,9 @@ ${CALIPTRA_ROOT}/src/pcrvault/rtl/pv_reg_pkg.sv ${CALIPTRA_ROOT}/src/pcrvault/rtl/pv_reg.sv ${CALIPTRA_ROOT}/src/pcrvault/rtl/pv.sv ${CALIPTRA_ROOT}/src/sha512/rtl/sha512_reg_pkg.sv +${CALIPTRA_ROOT}/src/sha512/rtl/sha512_params_pkg.sv ${CALIPTRA_ROOT}/src/sha512/rtl/sha512_ctrl.sv ${CALIPTRA_ROOT}/src/sha512/rtl/sha512.sv -${CALIPTRA_ROOT}/src/sha512/rtl/sha512_param.sv ${CALIPTRA_ROOT}/src/sha512/rtl/sha512_core.v ${CALIPTRA_ROOT}/src/sha512/rtl/sha512_h_constants.v ${CALIPTRA_ROOT}/src/sha512/rtl/sha512_k_constants.v diff --git a/src/hmac_drbg/config/hmac_drbg_tb.vf b/src/hmac_drbg/config/hmac_drbg_tb.vf index ab917c28f..9754c6784 100644 --- a/src/hmac_drbg/config/hmac_drbg_tb.vf +++ b/src/hmac_drbg/config/hmac_drbg_tb.vf @@ -18,6 +18,7 @@ ${CALIPTRA_ROOT}/src/libs/rtl/apb_slv_sif.sv ${CALIPTRA_ROOT}/src/libs/rtl/ahb_slv_sif.sv ${CALIPTRA_ROOT}/src/libs/rtl/caliptra_icg.sv ${CALIPTRA_ROOT}/src/libs/rtl/clk_gate.sv +${CALIPTRA_ROOT}/src/libs/rtl/caliptra_2ff_sync.sv ${CALIPTRA_ROOT}/src/keyvault/rtl/kv_defines_pkg.sv ${CALIPTRA_ROOT}/src/keyvault/rtl/kv_macros.svh ${CALIPTRA_ROOT}/src/pcrvault/rtl/pv_defines_pkg.sv @@ -35,9 +36,9 @@ ${CALIPTRA_ROOT}/src/pcrvault/rtl/pv_reg_pkg.sv ${CALIPTRA_ROOT}/src/pcrvault/rtl/pv_reg.sv ${CALIPTRA_ROOT}/src/pcrvault/rtl/pv.sv ${CALIPTRA_ROOT}/src/sha512/rtl/sha512_reg_pkg.sv +${CALIPTRA_ROOT}/src/sha512/rtl/sha512_params_pkg.sv ${CALIPTRA_ROOT}/src/sha512/rtl/sha512_ctrl.sv ${CALIPTRA_ROOT}/src/sha512/rtl/sha512.sv -${CALIPTRA_ROOT}/src/sha512/rtl/sha512_param.sv ${CALIPTRA_ROOT}/src/sha512/rtl/sha512_core.v ${CALIPTRA_ROOT}/src/sha512/rtl/sha512_h_constants.v ${CALIPTRA_ROOT}/src/sha512/rtl/sha512_k_constants.v diff --git a/src/integration/asserts/caliptra_top_sva.sv b/src/integration/asserts/caliptra_top_sva.sv index ad44256df..8da8234aa 100644 --- a/src/integration/asserts/caliptra_top_sva.sv +++ b/src/integration/asserts/caliptra_top_sva.sv @@ -20,17 +20,23 @@ //`include "kv_defines_pkg.sv" //`include "doe_defines_pkg.sv" `define CPTRA_TOP_PATH caliptra_top_tb.caliptra_top_dut -`define KEYVAULT_PATH caliptra_top_tb.caliptra_top_dut.key_vault1 -`define DOE_PATH caliptra_top_tb.caliptra_top_dut.doe.doe_inst.doe_fsm1 -`define DOE_REG_PATH caliptra_top_tb.caliptra_top_dut.doe.doe_inst.i_doe_reg +`define KEYVAULT_PATH `CPTRA_TOP_PATH.key_vault1 +`define DOE_INST_PATH `CPTRA_TOP_PATH.doe.doe_inst +`define DOE_PATH `DOE_INST_PATH.doe_fsm1 +`define DOE_REG_PATH `DOE_INST_PATH.i_doe_reg `define SERVICES_PATH caliptra_top_tb.tb_services_i -`define SHA512_PATH caliptra_top_tb.caliptra_top_dut.sha512.sha512_inst -`define HMAC_PATH caliptra_top_tb.caliptra_top_dut.hmac.hmac_inst -`define ECC_PATH caliptra_top_tb.caliptra_top_dut.ecc_top1.ecc_dsa_ctrl_i -`define ECC_REG_PATH caliptra_top_tb.caliptra_top_dut.ecc_top1.ecc_reg1 -`define SHA256_PATH caliptra_top_tb.caliptra_top_dut.sha256.sha256_inst -`define SHA512_MASKED_PATH caliptra_top_tb.caliptra_top_dut.ecc_top1.ecc_dsa_ctrl_i.ecc_hmac_drbg_interface_i.hmac_drbg_i.HMAC_K.u_sha512_core_h1 - +`define SHA512_PATH `CPTRA_TOP_PATH.sha512.sha512_inst +`define HMAC_PATH `CPTRA_TOP_PATH.hmac.hmac_inst +`define ECC_PATH `CPTRA_TOP_PATH.ecc_top1.ecc_dsa_ctrl_i +`define ECC_REG_PATH `CPTRA_TOP_PATH.ecc_top1.ecc_reg1 +`define SHA256_PATH `CPTRA_TOP_PATH.sha256.sha256_inst +`define SHA512_MASKED_PATH `CPTRA_TOP_PATH.ecc_top1.ecc_dsa_ctrl_i.ecc_hmac_drbg_interface_i.hmac_drbg_i.HMAC_K.u_sha512_core_h1 +`define SOC_IFC_TOP_PATH `CPTRA_TOP_PATH.soc_ifc_top1 +`define WDT_PATH `SOC_IFC_TOP_PATH.i_wdt + +`define SVA_RDC_CLK `CPTRA_TOP_PATH.rdc_clk_cg +`define SVA_CLK caliptra_top_tb.core_clk +`define SVA_RST caliptra_top_tb.cptra_rst_b module caliptra_top_sva import doe_defines_pkg::*; @@ -47,54 +53,63 @@ module caliptra_top_sva localparam ECC_MEM_ADDR = 2**6; //'ECC_PATH.ecc_arith_unit_i.ram_tdp_file_i.mem.ADDR_LENGTH localparam SHA256_DIG_NUM_DWORDS = 8; //`SHA256_PATH.DIG_NUM_DWORDS; localparam SHA256_BLOCK_NUM_DWORDS = 16; //`SHA256_PATH.BLOCK_NUM_DWORDS; + localparam DOE_256_NUM_ROUNDS = 14; //`DOE_INST_PATH.i_doe_core_cbc.keymem.DOE_256_NUM_ROUNDS //TODO: add disable condition based on doe cmd reg DOE_lock_uds_set: assert property ( - @(posedge `DOE_PATH.clk) + @(posedge `SVA_RDC_CLK) + disable iff (~`SVA_RST) $rose(`DOE_PATH.flow_done) && $past(doe_cmd_reg_t'(`DOE_PATH.doe_cmd_reg.cmd) == DOE_UDS) |=> `DOE_PATH.lock_uds_flow ) else $display("SVA ERROR: lock_uds_flow was not set after UDS flow"); + //Note: lock + reset checks will use ungated clock. Using RDC clk throws the SVA off in the very first cycle where lock was 0 + //but there's no $past value to compare against. This problem doesn't exist when using ungated clk because in the first cycle, + //pwrgood is also 0, so SVA is disabled. DOE_lock_uds_cold_reset: assert property ( - @(posedge `DOE_PATH.clk) + @(posedge `SVA_CLK) ~`DOE_PATH.hard_rst_b |-> (`DOE_PATH.lock_uds_flow == 0) ) else $display("SVA ERROR: lock_uds_flow was not reset on hard reset"); DOE_lock_uds_warm_reset: assert property ( - @(posedge `DOE_PATH.clk) + @(posedge `SVA_CLK) disable iff (~`DOE_PATH.rst_b && ~`DOE_PATH.hard_rst_b) ~`DOE_PATH.rst_b |-> $past(`DOE_PATH.lock_uds_flow) == `DOE_PATH.lock_uds_flow ) else $display("SVA ERROR: lock_uds_flow toggled after warm reset"); - DOE_lock_fe_set: assert property ( - @(posedge `DOE_PATH.clk) + @(posedge `SVA_RDC_CLK) + disable iff (~`SVA_RST) $rose(`DOE_PATH.flow_done) && $past(doe_cmd_reg_t'(`DOE_PATH.doe_cmd_reg.cmd) == DOE_FE) |=> `DOE_PATH.lock_fe_flow ) else $display("SVA ERROR: lock_fe_flow was not set after FE flow"); DOE_lock_fe_cold_reset: assert property ( - @(posedge `DOE_PATH.clk) + @(posedge `SVA_CLK) ~`DOE_PATH.hard_rst_b |-> (`DOE_PATH.lock_fe_flow == 0) ) else $display("SVA ERROR: lock_fe_flow was not reset on hard reset"); DOE_lock_fe_warm_reset: assert property ( - @(posedge `DOE_PATH.clk) + @(posedge `SVA_CLK) disable iff (~`DOE_PATH.rst_b && ~`DOE_PATH.hard_rst_b) ~`DOE_PATH.rst_b |-> $past(`DOE_PATH.lock_fe_flow) == `DOE_PATH.lock_fe_flow ) else $display("SVA ERROR: lock_fe_flow toggled after warm reset"); + //Corner case: when clear_obf_secrets and reset events happen in the same cycle, reset deassertion will cause SVA to start checking + //But if clear_obf_secrets was already 1 (not a pulse), it expects to see status valid in the next clk, but in design, it takes an extra + //cycle to update status. Adding a 1 cycle delay to avoid this case by starting the check when reset is deasserted DOE_clear_obf_status_valid: assert property ( - @(posedge `CPTRA_TOP_PATH.clk) - `CPTRA_TOP_PATH.clear_obf_secrets |=> (`DOE_REG_PATH.field_storage.DOE_STATUS.VALID.value && `DOE_REG_PATH.field_storage.DOE_STATUS.DEOBF_SECRETS_CLEARED.value) + @(posedge `SVA_RDC_CLK) + disable iff (~`DOE_PATH.rst_b) + `CPTRA_TOP_PATH.clear_obf_secrets && `DOE_PATH.rst_b |=> (`DOE_REG_PATH.field_storage.DOE_STATUS.VALID.value && `DOE_REG_PATH.field_storage.DOE_STATUS.DEOBF_SECRETS_CLEARED.value) ) else $display("SVA ERROR: DOE STATUS valid bit not set after clear obf secrets cmd"); KV_haddr_valid: assert property ( - @(posedge `CPTRA_TOP_PATH.clk) + @(posedge `SVA_RDC_CLK) disable iff (~`KEYVAULT_PATH.hsel_i) `KEYVAULT_PATH.hsel_i |-> !$isunknown(`KEYVAULT_PATH.haddr_i) ) @@ -104,16 +119,16 @@ module caliptra_top_sva for(genvar entry=0; entry < KV_NUM_KEYS; entry++) begin for(genvar dword = 0; dword < KV_NUM_DWORDS; dword++) begin KV_debug_value0: assert property ( - @(posedge `KEYVAULT_PATH.clk) + @(posedge `SVA_RDC_CLK) disable iff(!`KEYVAULT_PATH.cptra_pwrgood) - `KEYVAULT_PATH.flush_keyvault && (`KEYVAULT_PATH.kv_reg_hwif_out.CLEAR_SECRETS.sel_debug_value.value == 0) && `KEYVAULT_PATH.cptra_pwrgood |=> (`KEYVAULT_PATH.kv_reg1.hwif_out.KEY_ENTRY[entry][dword] == CLP_DEBUG_MODE_KV_0) + $rose(~`CPTRA_TOP_PATH.cptra_security_state_Latched.debug_locked || `SOC_IFC_TOP_PATH.cptra_error_fatal || `CPTRA_TOP_PATH.cptra_scan_mode_Latched) && (`KEYVAULT_PATH.kv_reg_hwif_out.CLEAR_SECRETS.sel_debug_value.value == 0) && `KEYVAULT_PATH.cptra_pwrgood |=> (`KEYVAULT_PATH.kv_reg1.hwif_out.KEY_ENTRY[entry][dword] == CLP_DEBUG_MODE_KV_0) ) else $display("SVA ERROR: KV not flushed with correct debug values"); KV_debug_value1: assert property ( - @(posedge `KEYVAULT_PATH.clk) + @(posedge `SVA_RDC_CLK) disable iff(!`KEYVAULT_PATH.cptra_pwrgood) - `KEYVAULT_PATH.flush_keyvault && (`KEYVAULT_PATH.kv_reg_hwif_out.CLEAR_SECRETS.sel_debug_value.value == 1) && `KEYVAULT_PATH.cptra_pwrgood |=> (`KEYVAULT_PATH.kv_reg1.hwif_out.KEY_ENTRY[entry][dword] == CLP_DEBUG_MODE_KV_1) + $rose(~`CPTRA_TOP_PATH.cptra_security_state_Latched.debug_locked || `SOC_IFC_TOP_PATH.cptra_error_fatal || `CPTRA_TOP_PATH.cptra_scan_mode_Latched) && (`KEYVAULT_PATH.kv_reg_hwif_out.CLEAR_SECRETS.sel_debug_value.value == 1) && `KEYVAULT_PATH.cptra_pwrgood |=> (`KEYVAULT_PATH.kv_reg1.hwif_out.KEY_ENTRY[entry][dword] == CLP_DEBUG_MODE_KV_1) ) else $display("SVA ERROR: KV not flushed with correct debug values"); end @@ -124,7 +139,7 @@ module caliptra_top_sva for(genvar dword = 0; dword < KV_NUM_DWORDS; dword++) begin //sha512 block read kv_sha512_block_r_flow: assert property ( - @(posedge `KEYVAULT_PATH.clk) + @(posedge `SVA_RDC_CLK) $rose(`SHA512_PATH.kv_src_done & ~`SHA512_PATH.pcr_hash_extend_ip) && (dword < (`KEYVAULT_PATH.kv_reg1.hwif_out.KEY_CTRL[`SHA512_PATH.kv_read.read_entry].last_dword + 1)) |-> (`KEYVAULT_PATH.kv_reg1.hwif_out.KEY_ENTRY[`SHA512_PATH.kv_read.read_entry][dword] == `SHA512_PATH.block_reg[dword]) ) else $display("SVA ERROR: SHA384 block mismatch!, 0x%04x, 0x%04x", `KEYVAULT_PATH.kv_reg1.hwif_out.KEY_ENTRY[`SHA512_PATH.kv_read.read_entry][dword], `SHA512_PATH.block_reg[dword]); @@ -132,7 +147,7 @@ module caliptra_top_sva //sha512 digest write if (dword < SHA512_DIG_NUM_DWORDS) begin kv_sha512_digest_w_flow: assert property ( - @(posedge `KEYVAULT_PATH.clk) + @(posedge `SVA_RDC_CLK) `SHA512_PATH.kv_dest_done & ~`SHA512_PATH.pcr_hash_extend_ip |-> (`KEYVAULT_PATH.kv_reg1.hwif_out.KEY_ENTRY[`SHA512_PATH.kv_write_ctrl_reg.write_entry][dword] == `SHA512_PATH.kv_reg[(KV_NUM_DWORDS-1) - dword]) ) else $display("SVA ERROR: SHA384 digest mismatch!, 0x%04x, 0x%04x", `KEYVAULT_PATH.kv_reg1.hwif_out.KEY_ENTRY[`SHA512_PATH.kv_write_ctrl_reg.write_entry][dword], `SHA512_PATH.kv_reg[(KV_NUM_DWORDS-1) - dword]); @@ -140,7 +155,7 @@ module caliptra_top_sva //hmac block read kv_hmac_block_r_flow: assert property ( - @(posedge `KEYVAULT_PATH.clk) + @(posedge `SVA_RDC_CLK) $rose(`HMAC_PATH.kv_block_done) && (dword < (`KEYVAULT_PATH.kv_reg1.hwif_out.KEY_CTRL[`HMAC_PATH.kv_read[1].read_entry].last_dword + 1)) |-> (`KEYVAULT_PATH.kv_reg1.hwif_out.KEY_ENTRY[`HMAC_PATH.kv_read[1].read_entry][dword] == `HMAC_PATH.block_reg[dword]) ) else $display("SVA ERROR: HMAC384 block mismatch!, 0x%04x, 0x%04x", `KEYVAULT_PATH.kv_reg1.hwif_out.KEY_ENTRY[`HMAC_PATH.kv_read[1].read_entry][dword], `HMAC_PATH.block_reg[dword]); @@ -148,7 +163,7 @@ module caliptra_top_sva //hmac key read if (dword < HMAC_KEY_NUM_DWORDS) begin kv_hmac_key_r_flow: assert property ( - @(posedge `KEYVAULT_PATH.clk) + @(posedge `SVA_RDC_CLK) $fell(`HMAC_PATH.kv_key_write_en) |-> (`KEYVAULT_PATH.kv_reg1.hwif_out.KEY_ENTRY[`HMAC_PATH.kv_read[0].read_entry][dword] == `HMAC_PATH.key_reg[dword]) ) else $display("SVA ERROR: HMAC384 key mismatch!, 0x%04x, 0x%04x", `KEYVAULT_PATH.kv_reg1.hwif_out.KEY_ENTRY[`HMAC_PATH.kv_read[0].read_entry][dword], `HMAC_PATH.key_reg[dword]); @@ -157,7 +172,7 @@ module caliptra_top_sva //hmac tag write if (dword < HMAC_TAG_NUM_DWORDS) begin kv_hmac_tag_w_flow: assert property ( - @(posedge `KEYVAULT_PATH.clk) + @(posedge `SVA_RDC_CLK) `HMAC_PATH.kv_write_done |-> (`KEYVAULT_PATH.kv_reg1.hwif_out.KEY_ENTRY[`HMAC_PATH.kv_write_ctrl_reg.write_entry][dword] == `HMAC_PATH.kv_reg[(`HMAC_PATH.TAG_NUM_DWORDS-1) - dword]) ) else $display("SVA ERROR: HMAC384 tag mismatch!, 0x%04x, 0x%04x", `KEYVAULT_PATH.kv_reg1.hwif_out.KEY_ENTRY[`HMAC_PATH.kv_write_ctrl_reg.write_entry][dword], `HMAC_PATH.kv_reg[(`HMAC_PATH.TAG_NUM_DWORDS-1) - dword]); @@ -167,46 +182,124 @@ module caliptra_top_sva if (dword < ECC_REG_NUM_DWORDS) begin //ecc privkey read kv_ecc_privkey_r_flow: assert property ( - @(posedge `KEYVAULT_PATH.clk) + @(posedge `SVA_RDC_CLK) $fell(`ECC_PATH.kv_privkey_write_en) |-> (`KEYVAULT_PATH.kv_reg1.hwif_out.KEY_ENTRY[`ECC_PATH.kv_read[0].read_entry][dword] == `ECC_PATH.privkey_reg[(`ECC_PATH.REG_NUM_DWORDS-1) - dword]) ) else $display("SVA ERROR: ECC privkey read mismatch!, 0x%04x, 0x%04x", `KEYVAULT_PATH.kv_reg1.hwif_out.KEY_ENTRY[`ECC_PATH.kv_read[0].read_entry][dword], `ECC_PATH.privkey_reg[(`ECC_PATH.REG_NUM_DWORDS-1) - dword]); kv_ecc_seed_r_flow: assert property ( - @(posedge `KEYVAULT_PATH.clk) + @(posedge `SVA_RDC_CLK) $fell(`ECC_PATH.kv_seed_write_en) |-> (`KEYVAULT_PATH.kv_reg1.hwif_out.KEY_ENTRY[`ECC_PATH.kv_read[1].read_entry][dword] == `ECC_PATH.seed_reg[(`ECC_PATH.REG_NUM_DWORDS-1) - dword]) ) else $display("SVA ERROR: ECC seed mismatch!, 0x%04x, 0x%04x", `KEYVAULT_PATH.kv_reg1.hwif_out.KEY_ENTRY[`ECC_PATH.kv_read[1].read_entry][dword], `ECC_PATH.seed_reg[(`ECC_PATH.REG_NUM_DWORDS-1) - dword]); //ecc privkey write kv_ecc_privkey_w_flow: assert property ( - @(posedge `KEYVAULT_PATH.clk) + @(posedge `SVA_RDC_CLK) `ECC_PATH.kv_write_done |-> (`KEYVAULT_PATH.kv_reg1.hwif_out.KEY_ENTRY[`ECC_PATH.kv_write_ctrl_reg.write_entry][dword] == `ECC_PATH.kv_reg[(`ECC_PATH.REG_NUM_DWORDS-1) - dword]) ) else $display("SVA ERROR: ECC privkey write mismatch!, 0x%04x, 0x%04x", `KEYVAULT_PATH.kv_reg1.hwif_out.KEY_ENTRY[`ECC_PATH.kv_write_ctrl_reg.write_entry][dword], `ECC_PATH.kv_reg[(`ECC_PATH.REG_NUM_DWORDS-1) - dword]); //ecc sign r pcr_ecc_sign_r: assert property ( - @(posedge `SERVICES_PATH.clk) + @(posedge `SVA_RDC_CLK) `SERVICES_PATH.check_pcr_signing |-> (`SERVICES_PATH.test_vector.R[dword] == `ECC_PATH.hwif_out.ECC_SIGN_R[dword].SIGN_R.value) ) else $display("SVA ERROR: PCR SIGNING SIGN_R mismatch!, 0x%04x, 0x%04x", `SERVICES_PATH.test_vector.R[dword], `ECC_PATH.hwif_out.ECC_SIGN_R[dword].SIGN_R.value); //ecc sign s pcr_ecc_sign_s: assert property ( - @(posedge `SERVICES_PATH.clk) + @(posedge `SVA_RDC_CLK) `SERVICES_PATH.check_pcr_signing |-> (`SERVICES_PATH.test_vector.S[dword] == `ECC_PATH.hwif_out.ECC_SIGN_S[dword].SIGN_S.value) ) else $display("SVA ERROR: PCR SIGNING SIGN_S mismatch!, 0x%04x, 0x%04x", `SERVICES_PATH.test_vector.S[dword], `ECC_PATH.hwif_out.ECC_SIGN_S[dword].SIGN_S.value); end + end + endgenerate + `ifndef VERILATOR + generate + begin: UDS_data_check + for(genvar dword = 0; dword < `CLP_OBF_UDS_DWORDS; dword++) begin + DOE_UDS_data_check: assert property ( + @(posedge `SVA_RDC_CLK) + disable iff (`CPTRA_TOP_PATH.scan_mode || !`CPTRA_TOP_PATH.security_state.debug_locked) + (`SERVICES_PATH.WriteData == 'hEC && `SERVICES_PATH.mailbox_write) |=> ##[1:$] $rose(`DOE_PATH.lock_uds_flow) |=> (`KEYVAULT_PATH.kv_reg1.hwif_out.KEY_ENTRY[`DOE_REG_PATH.hwif_out.DOE_CTRL.DEST.value][dword] == `SERVICES_PATH.doe_test_vector.uds_plaintext[dword]) + + ) + else $display("SVA ERROR: DOE UDS output %h does not match plaintext %h!", `KEYVAULT_PATH.kv_reg1.hwif_out.KEY_ENTRY[`DOE_REG_PATH.hwif_out.DOE_CTRL.DEST.value][dword], `SERVICES_PATH.doe_test_vector.uds_plaintext[dword]); + end + end + endgenerate + generate + begin: FE_data_check + for(genvar dword = 0; dword < `CLP_OBF_FE_DWORDS; dword++) begin + + DOE_FE_data_check: assert property ( + @(posedge `SVA_RDC_CLK) + disable iff (`CPTRA_TOP_PATH.scan_mode || !`CPTRA_TOP_PATH.security_state.debug_locked) + (`SERVICES_PATH.WriteData == 'hED && `SERVICES_PATH.mailbox_write) |=> ##[1:$] $rose(`DOE_PATH.lock_fe_flow) |=> (`KEYVAULT_PATH.kv_reg1.hwif_out.KEY_ENTRY[`DOE_REG_PATH.hwif_out.DOE_CTRL.DEST.value][dword] == `SERVICES_PATH.doe_test_vector.fe_plaintext[dword]) + ) + else $display("SVA ERROR: DOE FE output %h does not match plaintext %h!", `KEYVAULT_PATH.kv_reg1.hwif_out.KEY_ENTRY[`DOE_REG_PATH.hwif_out.DOE_CTRL.DEST.value][dword], `SERVICES_PATH.doe_test_vector.fe_plaintext[dword]); end + end endgenerate + `endif + + //Generate disable signal for fuse_wr_check sva when hwclr is asserted. The disable needs to be for 3 clks in order to ignore the fuses being cleared + logic clear_obf_secrets_f; + logic clear_obf_secrets_ff; + logic clear_obf_secrets_int; + + logic cptra_in_debug_scan_mode_f; + logic cptra_in_debug_scan_mode_fall_trans; + logic cptra_in_debug_scan_mode_fall_trans_f; + logic cptra_in_debug_scan_mode_int; + + always@(posedge `SVA_RDC_CLK or negedge `CPTRA_TOP_PATH.cptra_rst_b) begin + if(!`CPTRA_TOP_PATH.cptra_rst_b) begin + clear_obf_secrets_f <= 'b0; + clear_obf_secrets_ff <= 'b0; + end + else begin + clear_obf_secrets_f <= `SOC_IFC_TOP_PATH.clear_obf_secrets; + clear_obf_secrets_ff <= clear_obf_secrets_f; + end + end + + always@(posedge `SVA_RDC_CLK or negedge `CPTRA_TOP_PATH.cptra_rst_b) begin + if(!`CPTRA_TOP_PATH.cptra_rst_b) begin + cptra_in_debug_scan_mode_f <= 'b0; + cptra_in_debug_scan_mode_fall_trans_f <= 'b0; + end + else begin + cptra_in_debug_scan_mode_f <= `CPTRA_TOP_PATH.cptra_in_debug_scan_mode; + cptra_in_debug_scan_mode_fall_trans_f <= cptra_in_debug_scan_mode_fall_trans; + end + end + + assign clear_obf_secrets_int = `SOC_IFC_TOP_PATH.clear_obf_secrets | clear_obf_secrets_f | clear_obf_secrets_ff; + assign cptra_in_debug_scan_mode_fall_trans = !`CPTRA_TOP_PATH.cptra_in_debug_scan_mode && cptra_in_debug_scan_mode_f; + assign cptra_in_debug_scan_mode_int = cptra_in_debug_scan_mode_fall_trans | cptra_in_debug_scan_mode_fall_trans_f; + + UDS_fuse_wr_check: assert property ( + @(posedge `SVA_RDC_CLK) + disable iff(`CPTRA_TOP_PATH.cptra_in_debug_scan_mode || clear_obf_secrets_int || cptra_in_debug_scan_mode_int) + (`SOC_IFC_TOP_PATH.soc_ifc_reg_hwif_out.CPTRA_FUSE_WR_DONE.done.value) |-> `CPTRA_TOP_PATH.obf_uds_seed == $past(`CPTRA_TOP_PATH.obf_uds_seed) + ) + else $display("SVA ERROR: Unexpected write to obf uds seed!"); + + FE_fuse_wr_check: assert property ( + @(posedge `SVA_RDC_CLK) + disable iff(`CPTRA_TOP_PATH.cptra_in_debug_scan_mode || clear_obf_secrets_int || cptra_in_debug_scan_mode_int) + (`SOC_IFC_TOP_PATH.soc_ifc_reg_hwif_out.CPTRA_FUSE_WR_DONE.done.value) |-> `CPTRA_TOP_PATH.obf_field_entropy == $past(`CPTRA_TOP_PATH.obf_field_entropy) + ) + else $display("SVA ERROR: Unexpected write to obf field entropy!"); //ZEROIZE SVA generate for(genvar dword = 0; dword < SHA256_BLOCK_NUM_DWORDS; dword++) begin sha256_block_zeroize: assert property ( - @(posedge `SHA256_PATH.clk) + @(posedge `SVA_RDC_CLK) `SHA256_PATH.hwif_out.SHA256_CTRL.ZEROIZE.value |=> (`SHA256_PATH.hwif_out.SHA256_BLOCK[dword].BLOCK.value == 0) ) else $display("SVA ERROR: SHA256 block zeroize mismatch!"); @@ -214,7 +307,7 @@ module caliptra_top_sva for(genvar dword = 0; dword < SHA256_DIG_NUM_DWORDS; dword++) begin sha256_digest_zeroize: assert property ( - @(posedge `SHA256_PATH.clk) + @(posedge `SVA_RDC_CLK) `SHA256_PATH.hwif_out.SHA256_CTRL.ZEROIZE.value |=> (`SHA256_PATH.digest_reg[dword] == 0) & (`SHA256_PATH.i_sha256_reg.decoded_reg_strb.SHA256_DIGEST[dword] == 0) ) else $display("SVA ERROR: SHA256 digest zeroize mismatch!"); @@ -222,7 +315,7 @@ module caliptra_top_sva for(genvar dword = 0; dword < SHA512_BLOCK_NUM_DWORDS; dword++) begin sha512_block_zeroize: assert property ( - @(posedge `SHA512_PATH.clk) + @(posedge `SVA_RDC_CLK) `SHA512_PATH.hwif_out.SHA512_CTRL.ZEROIZE.value |=> (`SHA512_PATH.hwif_out.SHA512_BLOCK[dword].BLOCK.value == 0) ) else $display("SVA ERROR: SHA512 block zeroize mismatch!"); @@ -230,7 +323,7 @@ module caliptra_top_sva for(genvar dword = 0; dword < SHA512_DIG_NUM_DWORDS; dword++) begin sha512_digest_zeroize: assert property ( - @(posedge `SHA512_PATH.clk) + @(posedge `SVA_RDC_CLK) `SHA512_PATH.hwif_out.SHA512_CTRL.ZEROIZE.value |=> (`SHA512_PATH.digest_reg[dword] == 0) & (`SHA512_PATH.i_sha512_reg.decoded_reg_strb.SHA512_DIGEST[dword] == 0) ) else $display("SVA ERROR: SHA512 digest zeroize mismatch!"); @@ -238,7 +331,7 @@ module caliptra_top_sva for(genvar dword = 0; dword < HMAC_KEY_NUM_DWORDS; dword++) begin hmac_key_zeroize: assert property ( - @(posedge `HMAC_PATH.clk) + @(posedge `SVA_RDC_CLK) `HMAC_PATH.hwif_out.HMAC384_CTRL.ZEROIZE.value |=> (`HMAC_PATH.hwif_out.HMAC384_KEY[dword].KEY.value == 0) ) else $display("SVA ERROR: HMAC384 key zeroize mismatch!"); @@ -246,7 +339,7 @@ module caliptra_top_sva for(genvar dword = 0; dword < HMAC_BLOCK_NUM_DWORDS; dword++) begin hmac_block_zeroize: assert property ( - @(posedge `HMAC_PATH.clk) + @(posedge `SVA_RDC_CLK) `HMAC_PATH.hwif_out.HMAC384_CTRL.ZEROIZE.value |=> (`HMAC_PATH.hwif_out.HMAC384_BLOCK[dword].BLOCK.value == 0) ) else $display("SVA ERROR: HMAC384 block zeroize mismatch!"); @@ -254,7 +347,7 @@ module caliptra_top_sva for(genvar dword = 0; dword < HMAC_TAG_NUM_DWORDS; dword++) begin hmac_tag_zeroize: assert property ( - @(posedge `HMAC_PATH.clk) + @(posedge `SVA_RDC_CLK) `HMAC_PATH.hwif_out.HMAC384_CTRL.ZEROIZE.value |=> (`HMAC_PATH.tag_reg[dword] == 0) & (`HMAC_PATH.i_hmac_reg.decoded_reg_strb.HMAC384_TAG[dword] == 0) ) else $display("SVA ERROR: HMAC384 tag zeroize mismatch!"); @@ -263,36 +356,62 @@ module caliptra_top_sva for(genvar dword = 0; dword < ECC_REG_NUM_DWORDS; dword++) begin ecc_reg_zeroize: assert property ( - @(posedge `ECC_PATH.clk) + @(posedge `SVA_RDC_CLK) `ECC_PATH.hwif_out.ECC_CTRL.ZEROIZE.value |=> (`ECC_PATH.hwif_out.ECC_SEED[dword].SEED.value == 0) & (`ECC_PATH.hwif_out.ECC_NONCE[dword].NONCE.value == 0) & (`ECC_PATH.hwif_out.ECC_PRIVKEY_IN[dword].PRIVKEY_IN.value == 0) & (`ECC_PATH.hwif_out.ECC_MSG[dword].MSG.value == 0) & (`ECC_PATH.hwif_out.ECC_PUBKEY_X[dword].PUBKEY_X.value == 0) & (`ECC_PATH.hwif_out.ECC_PUBKEY_Y[dword].PUBKEY_Y.value == 0) & (`ECC_PATH.hwif_out.ECC_SIGN_R[dword].SIGN_R.value == 0) & (`ECC_PATH.hwif_out.ECC_SIGN_S[dword].SIGN_S.value == 0) & (`ECC_PATH.hwif_out.ECC_VERIFY_R[dword].VERIFY_R.value == 0) & (`ECC_PATH.hwif_out.ECC_IV[dword].IV.value == 0) & (`ECC_REG_PATH.decoded_reg_strb.ECC_PRIVKEY_OUT[dword] == 0) ) else $display("SVA ERROR: ECC reg zeroize mismatch!"); - end + end for(genvar addr = 0; addr < ECC_MEM_ADDR; addr++) begin ecc_mem_zeroize: assert property ( - @(posedge `ECC_PATH.clk) + @(posedge `SVA_RDC_CLK) `ECC_PATH.hwif_out.ECC_CTRL.ZEROIZE.value |=> (`ECC_PATH.ecc_arith_unit_i.ram_tdp_file_i.mem[addr] == 0) ) else $display("SVA ERROR: ECC mem zeroize mismatch!"); - end + end + + for(genvar addr = 0; addr < DOE_256_NUM_ROUNDS; addr++) begin + doe_mem_zeroize: assert property ( + @(posedge `DOE_INST_PATH.clk) + `DOE_INST_PATH.zeroize |=> (`DOE_INST_PATH.i_doe_core_cbc.keymem.key_mem[addr] == 0) + ) + else $display("SVA ERROR: DOE mem zeroize mismatch!"); + end endgenerate sha512_masked_core_digest_zeroize: assert property ( - @(posedge `ECC_PATH.clk) + @(posedge `SVA_RDC_CLK) `ECC_PATH.hwif_out.ECC_CTRL.ZEROIZE.value |=> (`SHA512_MASKED_PATH.digest == 0) & (`SHA512_MASKED_PATH.a_reg == 0) & (`SHA512_MASKED_PATH.b_reg == 0) & (`SHA512_MASKED_PATH.c_reg == 0) & (`SHA512_MASKED_PATH.d_reg == 0) & (`SHA512_MASKED_PATH.e_reg == 0) & (`SHA512_MASKED_PATH.f_reg == 0) & (`SHA512_MASKED_PATH.g_reg == 0) & (`SHA512_MASKED_PATH.h_reg == 0) ) else $display("SVA ERROR: SHA512_masked_core digest zeroize mismatch!"); + + doe_block_zeroize: assert property ( + @(posedge `DOE_INST_PATH.clk) + `DOE_INST_PATH.zeroize |=> (`DOE_INST_PATH.i_doe_core_cbc.enc_block.new_block == 0) & (`DOE_INST_PATH.i_doe_core_cbc.dec_block.new_block == 0) + ) + else $display("SVA ERROR: DOE block zeroize mismatch!"); + doe_reg_zeroize: assert property ( + @(posedge `DOE_INST_PATH.clk) + `DOE_INST_PATH.zeroize |=> (`DOE_INST_PATH.core_block == 0) & (`DOE_INST_PATH.core_IV == 0) + ) + else $display("SVA ERROR: DOE reg zeroize mismatch!"); + + doe_key_clear: assert property ( + @(posedge `DOE_INST_PATH.clk) + disable iff(`CPTRA_TOP_PATH.cptra_in_debug_scan_mode) + `DOE_INST_PATH.zeroize |=> (`DOE_INST_PATH.core_key == 0) + ) + else $display("SVA ERROR: DOE key clear mismatch!"); genvar client; generate for(client = 0; client < KV_NUM_WRITE; client++) begin KV_client_wrdata_not_unknown: assert property ( - @(posedge `KEYVAULT_PATH.clk) + @(posedge `SVA_RDC_CLK) disable iff (!`KEYVAULT_PATH.kv_write[client].write_en || !`KEYVAULT_PATH.rst_b) `KEYVAULT_PATH.kv_write[client].write_en |-> !$isunknown(`KEYVAULT_PATH.kv_write[client].write_data) ) @@ -301,14 +420,113 @@ module caliptra_top_sva for(client = 0; client < KV_NUM_READ; client++) begin KV_client_rddata_not_unknown: assert property ( - @(posedge `KEYVAULT_PATH.clk) + @(posedge `SVA_RDC_CLK) disable iff (!`KEYVAULT_PATH.rst_b) !$isunknown(`KEYVAULT_PATH.kv_rd_resp[client].read_data) ) else $display("SVA ERROR: KV client %0d data is unknown", client); end endgenerate - + + //WDT checks: + cascade_wdt_t1_pet: assert property ( + @(posedge `WDT_PATH.clk) + (`WDT_PATH.timer1_restart && !`WDT_PATH.timer2_en) |=> (`WDT_PATH.timer1_count == 'h0) + ) + else $display("SVA ERROR: [Cascade] WDT Timer1 did not restart on pet"); + + cascade_wdt_t2_pet: assert property ( + @(posedge `WDT_PATH.clk) + (`WDT_PATH.timer2_restart && !`WDT_PATH.timer2_en) |=> (`WDT_PATH.timer2_count == 'h0) + ) + else $display("SVA ERROR: [Cascade] WDT Timer2 did not restart on pet"); + + cascade_wdt_t1_service: assert property ( + @(posedge `WDT_PATH.clk) + (`WDT_PATH.wdt_timer1_timeout_serviced && !`WDT_PATH.timer2_en && !`WDT_PATH.t2_timeout) |=> (`WDT_PATH.timer1_count == 'h0) + ) + else $display("SVA ERROR: [Cascade] WDT Timer1 did not restart after interrupt service"); + + cascade_wdt_t2_service: assert property ( + @(posedge `WDT_PATH.clk) + (`WDT_PATH.wdt_timer2_timeout_serviced && !`WDT_PATH.timer2_en) |=> (`WDT_PATH.timer2_count == 'h0) + ) + else $display("SVA ERROR: [Cascade] WDT Timer2 did not restart after interrupt service"); + + independent_wdt_t1_pet: assert property ( + @(posedge `WDT_PATH.clk) + (`WDT_PATH.timer1_restart && `WDT_PATH.timer2_en) |=> (`WDT_PATH.timer1_count == 'h0) + ) + else $display("SVA ERROR: [Independent] WDT Timer1 did not restart on pet"); + + independent_wdt_t2_pet: assert property ( + @(posedge `WDT_PATH.clk) + (`WDT_PATH.timer2_restart && `WDT_PATH.timer2_en) |=> (`WDT_PATH.timer2_count == 'h0) + ) + else $display("SVA ERROR: [Independent] WDT Timer2 did not restart on pet"); + + independent_wdt_t1_service: assert property ( + @(posedge `WDT_PATH.clk) + (`WDT_PATH.wdt_timer1_timeout_serviced && `WDT_PATH.timer2_en && !`WDT_PATH.t2_timeout) |=> (`WDT_PATH.timer1_count == 'h0) + ) + else $display("SVA ERROR: [Independent] WDT Timer1 did not restart after interrupt service"); + + independent_wdt_t2_service: assert property ( + @(posedge `WDT_PATH.clk) + (`WDT_PATH.wdt_timer2_timeout_serviced && `WDT_PATH.timer2_en) |=> (`WDT_PATH.timer2_count == 'h0) + ) + else $display("SVA ERROR: [Independent] WDT Timer2 did not restart after interrupt service"); + + + + //VALID flag SVA + sha512_valid_flag: assert property ( + @(posedge `SVA_RDC_CLK) + `SHA512_PATH.digest_valid_reg |-> `SHA512_PATH.ready_reg + ) + else $display("SVA ERROR: SHA512 VALID flag mismatch!"); + + sha256_valid_flag: assert property ( + @(posedge `SVA_RDC_CLK) + `SHA256_PATH.digest_valid_reg |-> `SHA256_PATH.ready_reg + ) + else $display("SVA ERROR: SHA256 VALID flag mismatch!"); + + HMAC_valid_flag: assert property ( + @(posedge `SVA_RDC_CLK) + `HMAC_PATH.tag_valid_reg |-> `HMAC_PATH.ready_reg + ) + else $display("SVA ERROR: HMAC VALID flag mismatch!"); + + ECC_valid_flag: assert property ( + @(posedge `SVA_RDC_CLK) + `ECC_PATH.dsa_valid_reg |-> `ECC_PATH.dsa_ready_reg + ) + else $display("SVA ERROR: ECC VALID flag mismatch!"); + + //SVA for modular operations + ecc_opa_input: assert property ( + @(posedge `SVA_RDC_CLK) + (`ECC_PATH.ecc_arith_unit_i.ecc_fau_i.add_en_i | `ECC_PATH.ecc_arith_unit_i.ecc_fau_i.mult_en_i) |-> (`ECC_PATH.ecc_arith_unit_i.ecc_fau_i.opa_i < `ECC_PATH.ecc_arith_unit_i.ecc_fau_i.prime_i) + ) + else $display("SVA ERROR: ECC opa input is not valid!"); + + ecc_opb_input: assert property ( + @(posedge `SVA_RDC_CLK) + (`ECC_PATH.ecc_arith_unit_i.ecc_fau_i.add_en_i | `ECC_PATH.ecc_arith_unit_i.ecc_fau_i.mult_en_i) |-> (`ECC_PATH.ecc_arith_unit_i.ecc_fau_i.opb_i < `ECC_PATH.ecc_arith_unit_i.ecc_fau_i.prime_i) + ) + else $display("SVA ERROR: ECC opb input is not valid!"); + + ecc_add_result: assert property ( + @(posedge `SVA_RDC_CLK) + `ECC_PATH.ecc_arith_unit_i.ecc_instr_s.opcode.add_we |-> (`ECC_PATH.ecc_arith_unit_i.add_res_s < `ECC_PATH.ecc_arith_unit_i.adder_prime) + ) + else $display("SVA ERROR: ECC adder result is not valid!"); + ecc_mult_result: assert property ( + @(posedge `SVA_RDC_CLK) + `ECC_PATH.ecc_arith_unit_i.ecc_instr_s.opcode.mult_we |-> (`ECC_PATH.ecc_arith_unit_i.mult_res_s < `ECC_PATH.ecc_arith_unit_i.adder_prime) + ) + else $display("SVA ERROR: ECC multiplier result is not valid!"); endmodule diff --git a/src/integration/config/caliptra_top.vf b/src/integration/config/caliptra_top.vf index cfe8a2c30..44074db29 100644 --- a/src/integration/config/caliptra_top.vf +++ b/src/integration/config/caliptra_top.vf @@ -4,14 +4,15 @@ +incdir+${CALIPTRA_ROOT}/src/pcrvault/rtl +incdir+${CALIPTRA_ROOT}/src/datavault/rtl +incdir+${CALIPTRA_ROOT}/src/soc_ifc/rtl -+incdir+${CALIPTRA_ROOT}/src/soc_ifc/coverage +incdir+${CALIPTRA_ROOT}/src/riscv_core/veer_el2/rtl +incdir+${CALIPTRA_ROOT}/src/doe/rtl +incdir+${CALIPTRA_ROOT}/src/entropy_src/rtl -+incdir+${CALIPTRA_ROOT}/src/prim/rtl ++incdir+${CALIPTRA_ROOT}/src/caliptra_prim/rtl +incdir+${CALIPTRA_ROOT}/src/lc_ctrl/rtl +incdir+${CALIPTRA_ROOT}/src/entropy_src/tb +incdir+${CALIPTRA_ROOT}/src/csrng/rtl ++incdir+${CALIPTRA_ROOT}/src/spi_host/rtl ++incdir+${CALIPTRA_ROOT}/src/uart/rtl +incdir+${CALIPTRA_ROOT}/src/ahb_lite_bus/rtl +incdir+${CALIPTRA_ROOT}/src/sha512/rtl +incdir+${CALIPTRA_ROOT}/src/sha256/rtl @@ -20,7 +21,7 @@ +incdir+${CALIPTRA_ROOT}/src/hmac_drbg/rtl +incdir+${CALIPTRA_ROOT}/src/ecc/rtl +incdir+${CALIPTRA_ROOT}/src/kmac/rtl -+incdir+${CALIPTRA_ROOT}/src/prim_generic/rtl ++incdir+${CALIPTRA_ROOT}/src/caliptra_prim_generic/rtl +incdir+${CALIPTRA_ROOT}/src/edn/rtl +incdir+${CALIPTRA_ROOT}/src/aes/rtl ${CALIPTRA_ROOT}/src/integration/rtl/config_defines.svh @@ -34,6 +35,7 @@ ${CALIPTRA_ROOT}/src/libs/rtl/apb_slv_sif.sv ${CALIPTRA_ROOT}/src/libs/rtl/ahb_slv_sif.sv ${CALIPTRA_ROOT}/src/libs/rtl/caliptra_icg.sv ${CALIPTRA_ROOT}/src/libs/rtl/clk_gate.sv +${CALIPTRA_ROOT}/src/libs/rtl/caliptra_2ff_sync.sv ${CALIPTRA_ROOT}/src/keyvault/rtl/kv_defines_pkg.sv ${CALIPTRA_ROOT}/src/keyvault/rtl/kv_macros.svh ${CALIPTRA_ROOT}/src/pcrvault/rtl/pv_defines_pkg.sv @@ -42,8 +44,6 @@ ${CALIPTRA_ROOT}/src/pcrvault/rtl/pv_gen_hash.sv ${CALIPTRA_ROOT}/src/datavault/rtl/dv_defines_pkg.sv ${CALIPTRA_ROOT}/src/soc_ifc/rtl/soc_ifc_pkg.sv ${CALIPTRA_ROOT}/src/soc_ifc/rtl/soc_ifc_reg_pkg.sv -${CALIPTRA_ROOT}/src/soc_ifc/coverage/soc_ifc_cov_if.sv -${CALIPTRA_ROOT}/src/soc_ifc/coverage/soc_ifc_cov_bind.sv ${CALIPTRA_ROOT}/src/riscv_core/veer_el2/rtl/el2_pdef.vh ${CALIPTRA_ROOT}/src/riscv_core/veer_el2/rtl/include/el2_def.sv ${CALIPTRA_ROOT}/src/riscv_core/veer_el2/rtl/common_defines.sv @@ -52,18 +52,22 @@ ${CALIPTRA_ROOT}/src/entropy_src/rtl/entropy_src_main_sm_pkg.sv ${CALIPTRA_ROOT}/src/entropy_src/rtl/entropy_src_ack_sm_pkg.sv ${CALIPTRA_ROOT}/src/entropy_src/rtl/entropy_src_reg_pkg.sv ${CALIPTRA_ROOT}/src/entropy_src/rtl/entropy_src_pkg.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_util_pkg.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_alert_pkg.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_subreg_pkg.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_mubi_pkg.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_cipher_pkg.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_pkg.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_util_pkg.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_alert_pkg.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_subreg_pkg.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_mubi_pkg.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_cipher_pkg.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_pkg.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_sparse_fsm_pkg.sv ${CALIPTRA_ROOT}/src/lc_ctrl/rtl/lc_ctrl_reg_pkg.sv ${CALIPTRA_ROOT}/src/lc_ctrl/rtl/lc_ctrl_state_pkg.sv ${CALIPTRA_ROOT}/src/lc_ctrl/rtl/lc_ctrl_pkg.sv ${CALIPTRA_ROOT}/src/entropy_src/tb/physical_rng.sv ${CALIPTRA_ROOT}/src/csrng/rtl/csrng_reg_pkg.sv ${CALIPTRA_ROOT}/src/csrng/rtl/csrng_pkg.sv +${CALIPTRA_ROOT}/src/spi_host/rtl/spi_host_reg_pkg.sv +${CALIPTRA_ROOT}/src/spi_host/rtl/spi_host_cmd_pkg.sv +${CALIPTRA_ROOT}/src/uart/rtl/uart_reg_pkg.sv ${CALIPTRA_ROOT}/src/libs/rtl/ahb_to_reg_adapter.sv ${CALIPTRA_ROOT}/src/soc_ifc/rtl/mbox_csr_pkg.sv ${CALIPTRA_ROOT}/src/soc_ifc/rtl/sha512_acc_csr_pkg.sv @@ -125,18 +129,18 @@ ${CALIPTRA_ROOT}/src/pcrvault/rtl/pv_reg_pkg.sv ${CALIPTRA_ROOT}/src/pcrvault/rtl/pv_reg.sv ${CALIPTRA_ROOT}/src/pcrvault/rtl/pv.sv ${CALIPTRA_ROOT}/src/sha512/rtl/sha512_reg_pkg.sv +${CALIPTRA_ROOT}/src/sha512/rtl/sha512_params_pkg.sv ${CALIPTRA_ROOT}/src/sha512/rtl/sha512_ctrl.sv ${CALIPTRA_ROOT}/src/sha512/rtl/sha512.sv -${CALIPTRA_ROOT}/src/sha512/rtl/sha512_param.sv ${CALIPTRA_ROOT}/src/sha512/rtl/sha512_core.v ${CALIPTRA_ROOT}/src/sha512/rtl/sha512_h_constants.v ${CALIPTRA_ROOT}/src/sha512/rtl/sha512_k_constants.v ${CALIPTRA_ROOT}/src/sha512/rtl/sha512_w_mem.v ${CALIPTRA_ROOT}/src/sha512/rtl/sha512_reg.sv ${CALIPTRA_ROOT}/src/sha256/rtl/sha256_reg_pkg.sv +${CALIPTRA_ROOT}/src/sha256/rtl/sha256_params_pkg.sv ${CALIPTRA_ROOT}/src/sha256/rtl/sha256_ctrl.sv ${CALIPTRA_ROOT}/src/sha256/rtl/sha256.sv -${CALIPTRA_ROOT}/src/sha256/rtl/sha256_param.sv ${CALIPTRA_ROOT}/src/sha256/rtl/sha256_core.v ${CALIPTRA_ROOT}/src/sha256/rtl/sha256_k_constants.v ${CALIPTRA_ROOT}/src/sha256/rtl/sha256_w_mem.v @@ -203,37 +207,40 @@ ${CALIPTRA_ROOT}/src/kmac/rtl/keccak_round.sv ${CALIPTRA_ROOT}/src/kmac/rtl/keccak_2share.sv ${CALIPTRA_ROOT}/src/kmac/rtl/sha3pad.sv ${CALIPTRA_ROOT}/src/kmac/rtl/sha3.sv -${CALIPTRA_ROOT}/src/prim_generic/rtl/prim_generic_flop.sv -${CALIPTRA_ROOT}/src/prim_generic/rtl/prim_generic_buf.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_flop_2sync.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_lfsr.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_mubi4_sync.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_diff_decode.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_sec_anchor_buf.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_slicer.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_count.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_sparse_fsm_flop.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_dom_and_2share.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_sec_anchor_flop.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_reg_we_check.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_packer_fifo.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_max_tree.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_subreg_arb.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_subreg.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_intr_hw.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_onehot_check.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_mubi8_sync.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_fifo_sync_cnt.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_buf.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_lc_sync.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_alert_receiver.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_flop.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_alert_sender.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_fifo_sync.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_arbiter_ppc.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_sum_tree.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_subreg_ext.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_edge_detector.sv +${CALIPTRA_ROOT}/src/caliptra_prim_generic/rtl/caliptra_prim_generic_flop_en.sv +${CALIPTRA_ROOT}/src/caliptra_prim_generic/rtl/caliptra_prim_generic_flop.sv +${CALIPTRA_ROOT}/src/caliptra_prim_generic/rtl/caliptra_prim_generic_buf.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_flop_en.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_cdc_rand_delay.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_flop_2sync.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_lfsr.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_mubi4_sync.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_diff_decode.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_sec_anchor_buf.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_slicer.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_count.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_sparse_fsm_flop.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_dom_and_2share.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_sec_anchor_flop.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_reg_we_check.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_packer_fifo.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_max_tree.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_subreg_arb.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_subreg.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_intr_hw.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_onehot_check.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_mubi8_sync.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_fifo_sync_cnt.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_buf.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_lc_sync.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_alert_receiver.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_flop.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_alert_sender.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_fifo_sync.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_arbiter_ppc.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_sum_tree.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_subreg_ext.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_edge_detector.sv ${CALIPTRA_ROOT}/src/entropy_src/rtl/entropy_src_reg_top.sv ${CALIPTRA_ROOT}/src/entropy_src/rtl/entropy_src_bucket_ht.sv ${CALIPTRA_ROOT}/src/entropy_src/rtl/entropy_src_cntr_reg.sv @@ -279,4 +286,18 @@ ${CALIPTRA_ROOT}/src/csrng/rtl/csrng_block_encrypt.sv ${CALIPTRA_ROOT}/src/csrng/rtl/csrng_state_db.sv ${CALIPTRA_ROOT}/src/csrng/rtl/csrng_cmd_stage.sv ${CALIPTRA_ROOT}/src/csrng/rtl/csrng.sv -${CALIPTRA_ROOT}/src/integration/rtl/caliptra_top.sv \ No newline at end of file +${CALIPTRA_ROOT}/src/spi_host/rtl/spi_host.sv +${CALIPTRA_ROOT}/src/spi_host/rtl/spi_host_byte_merge.sv +${CALIPTRA_ROOT}/src/spi_host/rtl/spi_host_byte_select.sv +${CALIPTRA_ROOT}/src/spi_host/rtl/spi_host_command_queue.sv +${CALIPTRA_ROOT}/src/spi_host/rtl/spi_host_core.sv +${CALIPTRA_ROOT}/src/spi_host/rtl/spi_host_data_fifos.sv +${CALIPTRA_ROOT}/src/spi_host/rtl/spi_host_fsm.sv +${CALIPTRA_ROOT}/src/spi_host/rtl/spi_host_reg_top.sv +${CALIPTRA_ROOT}/src/spi_host/rtl/spi_host_shift_register.sv +${CALIPTRA_ROOT}/src/uart/rtl/uart_tx.sv +${CALIPTRA_ROOT}/src/uart/rtl/uart_reg_top.sv +${CALIPTRA_ROOT}/src/uart/rtl/uart_rx.sv +${CALIPTRA_ROOT}/src/uart/rtl/uart.sv +${CALIPTRA_ROOT}/src/uart/rtl/uart_core.sv +${CALIPTRA_ROOT}/src/integration/rtl/caliptra_top.sv diff --git a/src/integration/config/caliptra_top_tb.vf b/src/integration/config/caliptra_top_tb.vf index 3760bc2f3..836578fd2 100644 --- a/src/integration/config/caliptra_top_tb.vf +++ b/src/integration/config/caliptra_top_tb.vf @@ -3,17 +3,26 @@ +incdir+${CALIPTRA_ROOT}/src/integration/asserts +incdir+${CALIPTRA_ROOT}/src/integration/rtl +incdir+${CALIPTRA_ROOT}/src/libs/rtl ++incdir+${CALIPTRA_ROOT}/src/caliptra_prim/rtl ++incdir+${CALIPTRA_ROOT}/src/lc_ctrl/rtl ++incdir+${CALIPTRA_ROOT}/src/spi_host/rtl ++incdir+${CALIPTRA_ROOT}/src/spi_host/tb +incdir+${CALIPTRA_ROOT}/src/pcrvault/rtl +incdir+${CALIPTRA_ROOT}/src/datavault/rtl +incdir+${CALIPTRA_ROOT}/src/soc_ifc/rtl -+incdir+${CALIPTRA_ROOT}/src/soc_ifc/coverage +incdir+${CALIPTRA_ROOT}/src/riscv_core/veer_el2/rtl +incdir+${CALIPTRA_ROOT}/src/entropy_src/rtl -+incdir+${CALIPTRA_ROOT}/src/prim/rtl -+incdir+${CALIPTRA_ROOT}/src/lc_ctrl/rtl +incdir+${CALIPTRA_ROOT}/src/entropy_src/tb +incdir+${CALIPTRA_ROOT}/src/csrng/rtl ++incdir+${CALIPTRA_ROOT}/src/uart/rtl ++incdir+${CALIPTRA_ROOT}/src/sha512/coverage ++incdir+${CALIPTRA_ROOT}/src/sha256/coverage ++incdir+${CALIPTRA_ROOT}/src/hmac/coverage ++incdir+${CALIPTRA_ROOT}/src/ecc/coverage ++incdir+${CALIPTRA_ROOT}/src/soc_ifc/coverage +incdir+${CALIPTRA_ROOT}/src/integration/tb ++incdir+${CALIPTRA_ROOT}/src/integration/coverage ++incdir+${CALIPTRA_ROOT}/src/caliptra_prim_generic/rtl +incdir+${CALIPTRA_ROOT}/src/ahb_lite_bus/rtl +incdir+${CALIPTRA_ROOT}/src/sha512/rtl +incdir+${CALIPTRA_ROOT}/src/sha256/rtl @@ -22,7 +31,6 @@ +incdir+${CALIPTRA_ROOT}/src/hmac_drbg/rtl +incdir+${CALIPTRA_ROOT}/src/ecc/rtl +incdir+${CALIPTRA_ROOT}/src/kmac/rtl -+incdir+${CALIPTRA_ROOT}/src/prim_generic/rtl +incdir+${CALIPTRA_ROOT}/src/edn/rtl +incdir+${CALIPTRA_ROOT}/src/aes/rtl ${CALIPTRA_ROOT}/src/keyvault/rtl/kv_defines_pkg.sv @@ -40,14 +48,27 @@ ${CALIPTRA_ROOT}/src/libs/rtl/apb_slv_sif.sv ${CALIPTRA_ROOT}/src/libs/rtl/ahb_slv_sif.sv ${CALIPTRA_ROOT}/src/libs/rtl/caliptra_icg.sv ${CALIPTRA_ROOT}/src/libs/rtl/clk_gate.sv +${CALIPTRA_ROOT}/src/libs/rtl/caliptra_2ff_sync.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_util_pkg.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_alert_pkg.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_subreg_pkg.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_mubi_pkg.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_cipher_pkg.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_pkg.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_sparse_fsm_pkg.sv +${CALIPTRA_ROOT}/src/lc_ctrl/rtl/lc_ctrl_reg_pkg.sv +${CALIPTRA_ROOT}/src/lc_ctrl/rtl/lc_ctrl_state_pkg.sv +${CALIPTRA_ROOT}/src/lc_ctrl/rtl/lc_ctrl_pkg.sv +${CALIPTRA_ROOT}/src/spi_host/rtl/spi_host_reg_pkg.sv +${CALIPTRA_ROOT}/src/spi_host/rtl/spi_host_cmd_pkg.sv +${CALIPTRA_ROOT}/src/spi_host/tb/spi_device_pkg.sv +${CALIPTRA_ROOT}/src/spi_host/tb/spiflash.sv ${CALIPTRA_ROOT}/src/pcrvault/rtl/pv_defines_pkg.sv ${CALIPTRA_ROOT}/src/pcrvault/rtl/pv_macros.svh ${CALIPTRA_ROOT}/src/pcrvault/rtl/pv_gen_hash.sv ${CALIPTRA_ROOT}/src/datavault/rtl/dv_defines_pkg.sv ${CALIPTRA_ROOT}/src/soc_ifc/rtl/soc_ifc_pkg.sv ${CALIPTRA_ROOT}/src/soc_ifc/rtl/soc_ifc_reg_pkg.sv -${CALIPTRA_ROOT}/src/soc_ifc/coverage/soc_ifc_cov_if.sv -${CALIPTRA_ROOT}/src/soc_ifc/coverage/soc_ifc_cov_bind.sv ${CALIPTRA_ROOT}/src/riscv_core/veer_el2/rtl/el2_pdef.vh ${CALIPTRA_ROOT}/src/riscv_core/veer_el2/rtl/include/el2_def.sv ${CALIPTRA_ROOT}/src/riscv_core/veer_el2/rtl/common_defines.sv @@ -55,23 +76,71 @@ ${CALIPTRA_ROOT}/src/entropy_src/rtl/entropy_src_main_sm_pkg.sv ${CALIPTRA_ROOT}/src/entropy_src/rtl/entropy_src_ack_sm_pkg.sv ${CALIPTRA_ROOT}/src/entropy_src/rtl/entropy_src_reg_pkg.sv ${CALIPTRA_ROOT}/src/entropy_src/rtl/entropy_src_pkg.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_util_pkg.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_alert_pkg.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_subreg_pkg.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_mubi_pkg.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_cipher_pkg.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_pkg.sv -${CALIPTRA_ROOT}/src/lc_ctrl/rtl/lc_ctrl_reg_pkg.sv -${CALIPTRA_ROOT}/src/lc_ctrl/rtl/lc_ctrl_state_pkg.sv -${CALIPTRA_ROOT}/src/lc_ctrl/rtl/lc_ctrl_pkg.sv ${CALIPTRA_ROOT}/src/entropy_src/tb/physical_rng.sv ${CALIPTRA_ROOT}/src/csrng/rtl/csrng_reg_pkg.sv ${CALIPTRA_ROOT}/src/csrng/rtl/csrng_pkg.sv -${CALIPTRA_ROOT}/src/integration/tb/caliptra_veer_sram_export.sv +${CALIPTRA_ROOT}/src/uart/rtl/uart_reg_pkg.sv +${CALIPTRA_ROOT}/src/sha512/coverage/sha512_ctrl_cov_if.sv +${CALIPTRA_ROOT}/src/sha512/coverage/sha512_ctrl_cov_bind.sv +${CALIPTRA_ROOT}/src/sha256/coverage/sha256_ctrl_cov_if.sv +${CALIPTRA_ROOT}/src/sha256/coverage/sha256_ctrl_cov_bind.sv +${CALIPTRA_ROOT}/src/hmac/coverage/hmac_ctrl_cov_if.sv +${CALIPTRA_ROOT}/src/hmac/coverage/hmac_ctrl_cov_bind.sv +${CALIPTRA_ROOT}/src/ecc/coverage/ecc_top_cov_if.sv +${CALIPTRA_ROOT}/src/ecc/coverage/ecc_top_cov_bind.sv +${CALIPTRA_ROOT}/src/soc_ifc/coverage/soc_ifc_cov_if.sv +${CALIPTRA_ROOT}/src/soc_ifc/coverage/soc_ifc_cov_bind.sv ${CALIPTRA_ROOT}/src/integration/tb/caliptra_top_tb_pkg.sv +${CALIPTRA_ROOT}/src/integration/tb/caliptra_veer_sram_export.sv ${CALIPTRA_ROOT}/src/integration/tb/caliptra_top_tb_services.sv +${CALIPTRA_ROOT}/src/integration/coverage/caliptra_top_cov_if.sv +${CALIPTRA_ROOT}/src/integration/coverage/caliptra_top_cov_bind.sv +${CALIPTRA_ROOT}/src/integration/test_suites/libs/jtagdpi/jtagdpi.sv ${CALIPTRA_ROOT}/src/integration/tb/caliptra_top_tb.sv ${CALIPTRA_ROOT}/src/libs/rtl/ahb_to_reg_adapter.sv +${CALIPTRA_ROOT}/src/caliptra_prim_generic/rtl/caliptra_prim_generic_flop_en.sv +${CALIPTRA_ROOT}/src/caliptra_prim_generic/rtl/caliptra_prim_generic_flop.sv +${CALIPTRA_ROOT}/src/caliptra_prim_generic/rtl/caliptra_prim_generic_buf.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_flop_en.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_cdc_rand_delay.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_flop_2sync.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_lfsr.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_mubi4_sync.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_diff_decode.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_sec_anchor_buf.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_slicer.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_count.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_sparse_fsm_flop.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_dom_and_2share.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_sec_anchor_flop.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_reg_we_check.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_packer_fifo.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_max_tree.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_subreg_arb.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_subreg.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_intr_hw.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_onehot_check.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_mubi8_sync.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_fifo_sync_cnt.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_buf.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_lc_sync.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_alert_receiver.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_flop.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_alert_sender.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_fifo_sync.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_arbiter_ppc.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_sum_tree.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_subreg_ext.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_edge_detector.sv +${CALIPTRA_ROOT}/src/spi_host/rtl/spi_host.sv +${CALIPTRA_ROOT}/src/spi_host/rtl/spi_host_byte_merge.sv +${CALIPTRA_ROOT}/src/spi_host/rtl/spi_host_byte_select.sv +${CALIPTRA_ROOT}/src/spi_host/rtl/spi_host_command_queue.sv +${CALIPTRA_ROOT}/src/spi_host/rtl/spi_host_core.sv +${CALIPTRA_ROOT}/src/spi_host/rtl/spi_host_data_fifos.sv +${CALIPTRA_ROOT}/src/spi_host/rtl/spi_host_fsm.sv +${CALIPTRA_ROOT}/src/spi_host/rtl/spi_host_reg_top.sv +${CALIPTRA_ROOT}/src/spi_host/rtl/spi_host_shift_register.sv ${CALIPTRA_ROOT}/src/soc_ifc/rtl/mbox_csr_pkg.sv ${CALIPTRA_ROOT}/src/soc_ifc/rtl/sha512_acc_csr_pkg.sv ${CALIPTRA_ROOT}/src/riscv_core/veer_el2/rtl/lib/beh_lib.sv @@ -132,18 +201,18 @@ ${CALIPTRA_ROOT}/src/pcrvault/rtl/pv_reg_pkg.sv ${CALIPTRA_ROOT}/src/pcrvault/rtl/pv_reg.sv ${CALIPTRA_ROOT}/src/pcrvault/rtl/pv.sv ${CALIPTRA_ROOT}/src/sha512/rtl/sha512_reg_pkg.sv +${CALIPTRA_ROOT}/src/sha512/rtl/sha512_params_pkg.sv ${CALIPTRA_ROOT}/src/sha512/rtl/sha512_ctrl.sv ${CALIPTRA_ROOT}/src/sha512/rtl/sha512.sv -${CALIPTRA_ROOT}/src/sha512/rtl/sha512_param.sv ${CALIPTRA_ROOT}/src/sha512/rtl/sha512_core.v ${CALIPTRA_ROOT}/src/sha512/rtl/sha512_h_constants.v ${CALIPTRA_ROOT}/src/sha512/rtl/sha512_k_constants.v ${CALIPTRA_ROOT}/src/sha512/rtl/sha512_w_mem.v ${CALIPTRA_ROOT}/src/sha512/rtl/sha512_reg.sv ${CALIPTRA_ROOT}/src/sha256/rtl/sha256_reg_pkg.sv +${CALIPTRA_ROOT}/src/sha256/rtl/sha256_params_pkg.sv ${CALIPTRA_ROOT}/src/sha256/rtl/sha256_ctrl.sv ${CALIPTRA_ROOT}/src/sha256/rtl/sha256.sv -${CALIPTRA_ROOT}/src/sha256/rtl/sha256_param.sv ${CALIPTRA_ROOT}/src/sha256/rtl/sha256_core.v ${CALIPTRA_ROOT}/src/sha256/rtl/sha256_k_constants.v ${CALIPTRA_ROOT}/src/sha256/rtl/sha256_w_mem.v @@ -210,39 +279,6 @@ ${CALIPTRA_ROOT}/src/kmac/rtl/keccak_round.sv ${CALIPTRA_ROOT}/src/kmac/rtl/keccak_2share.sv ${CALIPTRA_ROOT}/src/kmac/rtl/sha3pad.sv ${CALIPTRA_ROOT}/src/kmac/rtl/sha3.sv -${CALIPTRA_ROOT}/src/prim_generic/rtl/prim_generic_flop_en.sv -${CALIPTRA_ROOT}/src/prim_generic/rtl/prim_generic_flop.sv -${CALIPTRA_ROOT}/src/prim_generic/rtl/prim_generic_buf.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_flop_en.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_flop_2sync.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_lfsr.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_mubi4_sync.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_diff_decode.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_sec_anchor_buf.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_slicer.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_count.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_sparse_fsm_flop.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_dom_and_2share.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_sec_anchor_flop.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_reg_we_check.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_packer_fifo.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_max_tree.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_subreg_arb.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_subreg.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_intr_hw.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_onehot_check.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_mubi8_sync.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_fifo_sync_cnt.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_buf.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_lc_sync.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_alert_receiver.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_flop.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_alert_sender.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_fifo_sync.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_arbiter_ppc.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_sum_tree.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_subreg_ext.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_edge_detector.sv ${CALIPTRA_ROOT}/src/entropy_src/rtl/entropy_src_reg_top.sv ${CALIPTRA_ROOT}/src/entropy_src/rtl/entropy_src_bucket_ht.sv ${CALIPTRA_ROOT}/src/entropy_src/rtl/entropy_src_cntr_reg.sv @@ -288,21 +324,7 @@ ${CALIPTRA_ROOT}/src/csrng/rtl/csrng_block_encrypt.sv ${CALIPTRA_ROOT}/src/csrng/rtl/csrng_state_db.sv ${CALIPTRA_ROOT}/src/csrng/rtl/csrng_cmd_stage.sv ${CALIPTRA_ROOT}/src/csrng/rtl/csrng.sv -${CALIPTRA_ROOT}/src/spi_host/rtl/spi_host_reg_pkg.sv -${CALIPTRA_ROOT}/src/spi_host/rtl/spi_host_cmd_pkg.sv -${CALIPTRA_ROOT}/src/spi_host/rtl/spi_host.sv -${CALIPTRA_ROOT}/src/spi_host/rtl/spi_host_byte_merge.sv -${CALIPTRA_ROOT}/src/spi_host/rtl/spi_host_byte_select.sv -${CALIPTRA_ROOT}/src/spi_host/rtl/spi_host_command_queue.sv -${CALIPTRA_ROOT}/src/spi_host/rtl/spi_host_core.sv -${CALIPTRA_ROOT}/src/spi_host/rtl/spi_host_data_fifos.sv -${CALIPTRA_ROOT}/src/spi_host/rtl/spi_host_fsm.sv -${CALIPTRA_ROOT}/src/spi_host/rtl/spi_host_reg_top.sv -${CALIPTRA_ROOT}/src/spi_host/rtl/spi_host_shift_register.sv -${CALIPTRA_ROOT}/src/spi_host/tb/spi_device_pkg.sv -${CALIPTRA_ROOT}/src/spi_host/tb/spiflash.sv ${CALIPTRA_ROOT}/src/uart/rtl/uart_tx.sv -${CALIPTRA_ROOT}/src/uart/rtl/uart_reg_pkg.sv ${CALIPTRA_ROOT}/src/uart/rtl/uart_reg_top.sv ${CALIPTRA_ROOT}/src/uart/rtl/uart_rx.sv ${CALIPTRA_ROOT}/src/uart/rtl/uart.sv diff --git a/src/integration/config/caliptra_top_tb.vlt b/src/integration/config/caliptra_top_tb.vlt index c56aba880..0aad893c5 100644 --- a/src/integration/config/caliptra_top_tb.vlt +++ b/src/integration/config/caliptra_top_tb.vlt @@ -1,9 +1,9 @@ // Licensed under the Apache License, Version 2.0, see LICENSE for details. // SPDX-License-Identifier: Apache-2.0 // -${CALIPTRA_ROOT}/src/prim/lint/prim_onehot_check.vlt -${CALIPTRA_ROOT}/src/prim/lint/prim_arbiter.vlt +${CALIPTRA_ROOT}/src/caliptra_prim/lint/caliptra_prim_onehot_check.vlt +${CALIPTRA_ROOT}/src/caliptra_prim/lint/caliptra_prim_arbiter.vlt ${CALIPTRA_ROOT}/src/csrng/lint/csrng.vlt -${CALIPTRA_ROOT}/src/prim/lint/prim_max_tree.vlt -${CALIPTRA_ROOT}/src/prim/lint/prim_sum_tree.vlt -${CALIPTRA_ROOT}/src/prim/lint/prim_onehot_check.vlt +${CALIPTRA_ROOT}/src/caliptra_prim/lint/caliptra_prim_max_tree.vlt +${CALIPTRA_ROOT}/src/caliptra_prim/lint/caliptra_prim_sum_tree.vlt +${CALIPTRA_ROOT}/src/caliptra_prim/lint/caliptra_prim_onehot_check.vlt diff --git a/src/integration/config/caliptra_top_trng_tb.vf b/src/integration/config/caliptra_top_trng_tb.vf new file mode 100644 index 000000000..6e8b39584 --- /dev/null +++ b/src/integration/config/caliptra_top_trng_tb.vf @@ -0,0 +1,332 @@ ++incdir+${CALIPTRA_ROOT}/src/keyvault/rtl ++incdir+${CALIPTRA_ROOT}/src/doe/rtl ++incdir+${CALIPTRA_ROOT}/src/integration/asserts ++incdir+${CALIPTRA_ROOT}/src/integration/rtl ++incdir+${CALIPTRA_ROOT}/src/libs/rtl ++incdir+${CALIPTRA_ROOT}/src/caliptra_prim/rtl ++incdir+${CALIPTRA_ROOT}/src/lc_ctrl/rtl ++incdir+${CALIPTRA_ROOT}/src/spi_host/rtl ++incdir+${CALIPTRA_ROOT}/src/spi_host/tb ++incdir+${CALIPTRA_ROOT}/src/pcrvault/rtl ++incdir+${CALIPTRA_ROOT}/src/datavault/rtl ++incdir+${CALIPTRA_ROOT}/src/soc_ifc/rtl ++incdir+${CALIPTRA_ROOT}/src/riscv_core/veer_el2/rtl ++incdir+${CALIPTRA_ROOT}/src/entropy_src/rtl ++incdir+${CALIPTRA_ROOT}/src/entropy_src/tb ++incdir+${CALIPTRA_ROOT}/src/csrng/rtl ++incdir+${CALIPTRA_ROOT}/src/uart/rtl ++incdir+${CALIPTRA_ROOT}/src/sha512/coverage ++incdir+${CALIPTRA_ROOT}/src/sha256/coverage ++incdir+${CALIPTRA_ROOT}/src/hmac/coverage ++incdir+${CALIPTRA_ROOT}/src/ecc/coverage ++incdir+${CALIPTRA_ROOT}/src/soc_ifc/coverage ++incdir+${CALIPTRA_ROOT}/src/integration/tb ++incdir+${CALIPTRA_ROOT}/src/integration/coverage ++incdir+${CALIPTRA_ROOT}/src/caliptra_prim_generic/rtl ++incdir+${CALIPTRA_ROOT}/src/ahb_lite_bus/rtl ++incdir+${CALIPTRA_ROOT}/src/sha512/rtl ++incdir+${CALIPTRA_ROOT}/src/sha256/rtl ++incdir+${CALIPTRA_ROOT}/src/sha512_masked/rtl ++incdir+${CALIPTRA_ROOT}/src/hmac/rtl ++incdir+${CALIPTRA_ROOT}/src/hmac_drbg/rtl ++incdir+${CALIPTRA_ROOT}/src/ecc/rtl ++incdir+${CALIPTRA_ROOT}/src/kmac/rtl ++incdir+${CALIPTRA_ROOT}/src/edn/rtl ++incdir+${CALIPTRA_ROOT}/src/aes/rtl +${CALIPTRA_ROOT}/src/keyvault/rtl/kv_defines_pkg.sv +${CALIPTRA_ROOT}/src/keyvault/rtl/kv_macros.svh +${CALIPTRA_ROOT}/src/doe/rtl/doe_defines_pkg.sv +${CALIPTRA_ROOT}/src/integration/asserts/caliptra_top_sva.sv +${CALIPTRA_ROOT}/src/integration/rtl/config_defines.svh +${CALIPTRA_ROOT}/src/integration/rtl/caliptra_reg_defines.svh +${CALIPTRA_ROOT}/src/libs/rtl/caliptra_sva.svh +${CALIPTRA_ROOT}/src/libs/rtl/caliptra_macros.svh +${CALIPTRA_ROOT}/src/libs/rtl/caliptra_sram.sv +${CALIPTRA_ROOT}/src/libs/rtl/ahb_defines_pkg.sv +${CALIPTRA_ROOT}/src/libs/rtl/caliptra_ahb_srom.sv +${CALIPTRA_ROOT}/src/libs/rtl/apb_slv_sif.sv +${CALIPTRA_ROOT}/src/libs/rtl/ahb_slv_sif.sv +${CALIPTRA_ROOT}/src/libs/rtl/caliptra_icg.sv +${CALIPTRA_ROOT}/src/libs/rtl/clk_gate.sv +${CALIPTRA_ROOT}/src/libs/rtl/caliptra_2ff_sync.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_util_pkg.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_alert_pkg.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_subreg_pkg.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_mubi_pkg.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_cipher_pkg.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_pkg.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_sparse_fsm_pkg.sv +${CALIPTRA_ROOT}/src/lc_ctrl/rtl/lc_ctrl_reg_pkg.sv +${CALIPTRA_ROOT}/src/lc_ctrl/rtl/lc_ctrl_state_pkg.sv +${CALIPTRA_ROOT}/src/lc_ctrl/rtl/lc_ctrl_pkg.sv +${CALIPTRA_ROOT}/src/spi_host/rtl/spi_host_reg_pkg.sv +${CALIPTRA_ROOT}/src/spi_host/rtl/spi_host_cmd_pkg.sv +${CALIPTRA_ROOT}/src/spi_host/tb/spi_device_pkg.sv +${CALIPTRA_ROOT}/src/spi_host/tb/spiflash.sv +${CALIPTRA_ROOT}/src/pcrvault/rtl/pv_defines_pkg.sv +${CALIPTRA_ROOT}/src/pcrvault/rtl/pv_macros.svh +${CALIPTRA_ROOT}/src/pcrvault/rtl/pv_gen_hash.sv +${CALIPTRA_ROOT}/src/datavault/rtl/dv_defines_pkg.sv +${CALIPTRA_ROOT}/src/soc_ifc/rtl/soc_ifc_pkg.sv +${CALIPTRA_ROOT}/src/soc_ifc/rtl/soc_ifc_reg_pkg.sv +${CALIPTRA_ROOT}/src/riscv_core/veer_el2/rtl/el2_pdef.vh +${CALIPTRA_ROOT}/src/riscv_core/veer_el2/rtl/include/el2_def.sv +${CALIPTRA_ROOT}/src/riscv_core/veer_el2/rtl/common_defines.sv +${CALIPTRA_ROOT}/src/entropy_src/rtl/entropy_src_main_sm_pkg.sv +${CALIPTRA_ROOT}/src/entropy_src/rtl/entropy_src_ack_sm_pkg.sv +${CALIPTRA_ROOT}/src/entropy_src/rtl/entropy_src_reg_pkg.sv +${CALIPTRA_ROOT}/src/entropy_src/rtl/entropy_src_pkg.sv +${CALIPTRA_ROOT}/src/entropy_src/tb/physical_rng.sv +${CALIPTRA_ROOT}/src/csrng/rtl/csrng_reg_pkg.sv +${CALIPTRA_ROOT}/src/csrng/rtl/csrng_pkg.sv +${CALIPTRA_ROOT}/src/uart/rtl/uart_reg_pkg.sv +${CALIPTRA_ROOT}/src/sha512/coverage/sha512_ctrl_cov_if.sv +${CALIPTRA_ROOT}/src/sha512/coverage/sha512_ctrl_cov_bind.sv +${CALIPTRA_ROOT}/src/sha256/coverage/sha256_ctrl_cov_if.sv +${CALIPTRA_ROOT}/src/sha256/coverage/sha256_ctrl_cov_bind.sv +${CALIPTRA_ROOT}/src/hmac/coverage/hmac_ctrl_cov_if.sv +${CALIPTRA_ROOT}/src/hmac/coverage/hmac_ctrl_cov_bind.sv +${CALIPTRA_ROOT}/src/ecc/coverage/ecc_top_cov_if.sv +${CALIPTRA_ROOT}/src/ecc/coverage/ecc_top_cov_bind.sv +${CALIPTRA_ROOT}/src/soc_ifc/coverage/soc_ifc_cov_if.sv +${CALIPTRA_ROOT}/src/soc_ifc/coverage/soc_ifc_cov_bind.sv +${CALIPTRA_ROOT}/src/integration/tb/caliptra_top_tb_pkg.sv +${CALIPTRA_ROOT}/src/integration/tb/caliptra_veer_sram_export.sv +${CALIPTRA_ROOT}/src/integration/tb/caliptra_top_tb_services.sv +${CALIPTRA_ROOT}/src/integration/coverage/caliptra_top_cov_if.sv +${CALIPTRA_ROOT}/src/integration/coverage/caliptra_top_cov_bind.sv +${CALIPTRA_ROOT}/src/integration/test_suites/libs/jtagdpi/jtagdpi.sv +${CALIPTRA_ROOT}/src/integration/tb/caliptra_top_tb.sv +${CALIPTRA_ROOT}/src/libs/rtl/ahb_to_reg_adapter.sv +${CALIPTRA_ROOT}/src/caliptra_prim_generic/rtl/caliptra_prim_generic_flop_en.sv +${CALIPTRA_ROOT}/src/caliptra_prim_generic/rtl/caliptra_prim_generic_flop.sv +${CALIPTRA_ROOT}/src/caliptra_prim_generic/rtl/caliptra_prim_generic_buf.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_flop_en.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_cdc_rand_delay.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_flop_2sync.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_lfsr.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_mubi4_sync.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_diff_decode.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_sec_anchor_buf.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_slicer.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_count.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_sparse_fsm_flop.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_dom_and_2share.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_sec_anchor_flop.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_reg_we_check.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_packer_fifo.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_max_tree.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_subreg_arb.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_subreg.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_intr_hw.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_onehot_check.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_mubi8_sync.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_fifo_sync_cnt.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_buf.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_lc_sync.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_alert_receiver.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_flop.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_alert_sender.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_fifo_sync.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_arbiter_ppc.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_sum_tree.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_subreg_ext.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_edge_detector.sv +${CALIPTRA_ROOT}/src/spi_host/rtl/spi_host.sv +${CALIPTRA_ROOT}/src/spi_host/rtl/spi_host_byte_merge.sv +${CALIPTRA_ROOT}/src/spi_host/rtl/spi_host_byte_select.sv +${CALIPTRA_ROOT}/src/spi_host/rtl/spi_host_command_queue.sv +${CALIPTRA_ROOT}/src/spi_host/rtl/spi_host_core.sv +${CALIPTRA_ROOT}/src/spi_host/rtl/spi_host_data_fifos.sv +${CALIPTRA_ROOT}/src/spi_host/rtl/spi_host_fsm.sv +${CALIPTRA_ROOT}/src/spi_host/rtl/spi_host_reg_top.sv +${CALIPTRA_ROOT}/src/spi_host/rtl/spi_host_shift_register.sv +${CALIPTRA_ROOT}/src/soc_ifc/rtl/mbox_csr_pkg.sv +${CALIPTRA_ROOT}/src/soc_ifc/rtl/sha512_acc_csr_pkg.sv +${CALIPTRA_ROOT}/src/riscv_core/veer_el2/rtl/lib/beh_lib.sv +${CALIPTRA_ROOT}/src/riscv_core/veer_el2/rtl/el2_mem.sv +${CALIPTRA_ROOT}/src/riscv_core/veer_el2/rtl/el2_dma_ctrl.sv +${CALIPTRA_ROOT}/src/riscv_core/veer_el2/rtl/el2_pic_ctrl.sv +${CALIPTRA_ROOT}/src/riscv_core/veer_el2/rtl/el2_veer.sv +${CALIPTRA_ROOT}/src/riscv_core/veer_el2/rtl/el2_veer_wrapper.sv +${CALIPTRA_ROOT}/src/riscv_core/veer_el2/rtl/dbg/el2_dbg.sv +${CALIPTRA_ROOT}/src/riscv_core/veer_el2/rtl/dec/el2_dec_decode_ctl.sv +${CALIPTRA_ROOT}/src/riscv_core/veer_el2/rtl/dec/el2_dec_gpr_ctl.sv +${CALIPTRA_ROOT}/src/riscv_core/veer_el2/rtl/dec/el2_dec_ib_ctl.sv +${CALIPTRA_ROOT}/src/riscv_core/veer_el2/rtl/dec/el2_dec.sv +${CALIPTRA_ROOT}/src/riscv_core/veer_el2/rtl/dec/el2_dec_tlu_ctl.sv +${CALIPTRA_ROOT}/src/riscv_core/veer_el2/rtl/dec/el2_dec_trigger.sv +${CALIPTRA_ROOT}/src/riscv_core/veer_el2/rtl/dmi/dmi_jtag_to_core_sync.v +${CALIPTRA_ROOT}/src/riscv_core/veer_el2/rtl/dmi/dmi_wrapper.v +${CALIPTRA_ROOT}/src/riscv_core/veer_el2/rtl/dmi/rvjtag_tap.v +${CALIPTRA_ROOT}/src/riscv_core/veer_el2/rtl/exu/el2_exu_alu_ctl.sv +${CALIPTRA_ROOT}/src/riscv_core/veer_el2/rtl/exu/el2_exu_div_ctl.sv +${CALIPTRA_ROOT}/src/riscv_core/veer_el2/rtl/exu/el2_exu_mul_ctl.sv +${CALIPTRA_ROOT}/src/riscv_core/veer_el2/rtl/exu/el2_exu.sv +${CALIPTRA_ROOT}/src/riscv_core/veer_el2/rtl/ifu/el2_ifu_aln_ctl.sv +${CALIPTRA_ROOT}/src/riscv_core/veer_el2/rtl/ifu/el2_ifu_bp_ctl.sv +${CALIPTRA_ROOT}/src/riscv_core/veer_el2/rtl/ifu/el2_ifu_compress_ctl.sv +${CALIPTRA_ROOT}/src/riscv_core/veer_el2/rtl/ifu/el2_ifu_iccm_mem.sv +${CALIPTRA_ROOT}/src/riscv_core/veer_el2/rtl/ifu/el2_ifu_ic_mem.sv +${CALIPTRA_ROOT}/src/riscv_core/veer_el2/rtl/ifu/el2_ifu_ifc_ctl.sv +${CALIPTRA_ROOT}/src/riscv_core/veer_el2/rtl/ifu/el2_ifu_mem_ctl.sv +${CALIPTRA_ROOT}/src/riscv_core/veer_el2/rtl/ifu/el2_ifu.sv +${CALIPTRA_ROOT}/src/riscv_core/veer_el2/rtl/lib/ahb_to_axi4.sv +${CALIPTRA_ROOT}/src/riscv_core/veer_el2/rtl/lib/axi4_to_ahb.sv +${CALIPTRA_ROOT}/src/riscv_core/veer_el2/rtl/lib/el2_lib.sv +${CALIPTRA_ROOT}/src/riscv_core/veer_el2/rtl/lib/mem_lib.sv +${CALIPTRA_ROOT}/src/riscv_core/veer_el2/rtl/lib/el2_mem_if.sv +${CALIPTRA_ROOT}/src/riscv_core/veer_el2/rtl/lsu/el2_lsu_addrcheck.sv +${CALIPTRA_ROOT}/src/riscv_core/veer_el2/rtl/lsu/el2_lsu_bus_buffer.sv +${CALIPTRA_ROOT}/src/riscv_core/veer_el2/rtl/lsu/el2_lsu_bus_intf.sv +${CALIPTRA_ROOT}/src/riscv_core/veer_el2/rtl/lsu/el2_lsu_clkdomain.sv +${CALIPTRA_ROOT}/src/riscv_core/veer_el2/rtl/lsu/el2_lsu_dccm_ctl.sv +${CALIPTRA_ROOT}/src/riscv_core/veer_el2/rtl/lsu/el2_lsu_dccm_mem.sv +${CALIPTRA_ROOT}/src/riscv_core/veer_el2/rtl/lsu/el2_lsu_ecc.sv +${CALIPTRA_ROOT}/src/riscv_core/veer_el2/rtl/lsu/el2_lsu_lsc_ctl.sv +${CALIPTRA_ROOT}/src/riscv_core/veer_el2/rtl/lsu/el2_lsu_stbuf.sv +${CALIPTRA_ROOT}/src/riscv_core/veer_el2/rtl/lsu/el2_lsu.sv +${CALIPTRA_ROOT}/src/riscv_core/veer_el2/rtl/lsu/el2_lsu_trigger.sv +${CALIPTRA_ROOT}/src/ahb_lite_bus/rtl/ahb_lite_bus_inf.sv +${CALIPTRA_ROOT}/src/ahb_lite_bus/rtl/ahb_lite_address_decoder.sv +${CALIPTRA_ROOT}/src/ahb_lite_bus/rtl/ahb_lite_bus.sv +${CALIPTRA_ROOT}/src/ahb_lite_bus/rtl/ahb_lite_2to1_mux.sv +${CALIPTRA_ROOT}/src/keyvault/rtl/kv_reg_pkg.sv +${CALIPTRA_ROOT}/src/keyvault/rtl/kv_reg.sv +${CALIPTRA_ROOT}/src/keyvault/rtl/kv.sv +${CALIPTRA_ROOT}/src/keyvault/rtl/kv_fsm.sv +${CALIPTRA_ROOT}/src/keyvault/rtl/kv_read_client.sv +${CALIPTRA_ROOT}/src/keyvault/rtl/kv_write_client.sv +${CALIPTRA_ROOT}/src/pcrvault/rtl/pv_reg_pkg.sv +${CALIPTRA_ROOT}/src/pcrvault/rtl/pv_reg.sv +${CALIPTRA_ROOT}/src/pcrvault/rtl/pv.sv +${CALIPTRA_ROOT}/src/sha512/rtl/sha512_reg_pkg.sv +${CALIPTRA_ROOT}/src/sha512/rtl/sha512_params_pkg.sv +${CALIPTRA_ROOT}/src/sha512/rtl/sha512_ctrl.sv +${CALIPTRA_ROOT}/src/sha512/rtl/sha512.sv +${CALIPTRA_ROOT}/src/sha512/rtl/sha512_core.v +${CALIPTRA_ROOT}/src/sha512/rtl/sha512_h_constants.v +${CALIPTRA_ROOT}/src/sha512/rtl/sha512_k_constants.v +${CALIPTRA_ROOT}/src/sha512/rtl/sha512_w_mem.v +${CALIPTRA_ROOT}/src/sha512/rtl/sha512_reg.sv +${CALIPTRA_ROOT}/src/sha256/rtl/sha256_reg_pkg.sv +${CALIPTRA_ROOT}/src/sha256/rtl/sha256_params_pkg.sv +${CALIPTRA_ROOT}/src/sha256/rtl/sha256_ctrl.sv +${CALIPTRA_ROOT}/src/sha256/rtl/sha256.sv +${CALIPTRA_ROOT}/src/sha256/rtl/sha256_core.v +${CALIPTRA_ROOT}/src/sha256/rtl/sha256_k_constants.v +${CALIPTRA_ROOT}/src/sha256/rtl/sha256_w_mem.v +${CALIPTRA_ROOT}/src/sha256/rtl/sha256_reg.sv +${CALIPTRA_ROOT}/src/doe/rtl/doe_reg_pkg.sv +${CALIPTRA_ROOT}/src/doe/rtl/doe_ctrl.sv +${CALIPTRA_ROOT}/src/doe/rtl/doe_decipher_block.sv +${CALIPTRA_ROOT}/src/doe/rtl/doe_encipher_block.sv +${CALIPTRA_ROOT}/src/doe/rtl/doe_inv_sbox.sv +${CALIPTRA_ROOT}/src/doe/rtl/doe_key_mem.sv +${CALIPTRA_ROOT}/src/doe/rtl/doe_sbox.sv +${CALIPTRA_ROOT}/src/doe/rtl/doe_cbc.sv +${CALIPTRA_ROOT}/src/doe/rtl/doe_core_cbc.sv +${CALIPTRA_ROOT}/src/doe/rtl/doe_reg.sv +${CALIPTRA_ROOT}/src/doe/rtl/doe_fsm.sv +${CALIPTRA_ROOT}/src/sha512_masked/rtl/sha512_masked_defines_pkg.sv +${CALIPTRA_ROOT}/src/sha512_masked/rtl/sha512_masked_core.sv +${CALIPTRA_ROOT}/src/sha512_masked/rtl/sha512_masked_lfsr.sv +${CALIPTRA_ROOT}/src/hmac/rtl/hmac_param_pkg.sv +${CALIPTRA_ROOT}/src/hmac/rtl/hmac_reg_pkg.sv +${CALIPTRA_ROOT}/src/hmac/rtl/hmac_ctrl.sv +${CALIPTRA_ROOT}/src/hmac/rtl/hmac.sv +${CALIPTRA_ROOT}/src/hmac/rtl/hmac_core.v +${CALIPTRA_ROOT}/src/hmac/rtl/hmac_reg.sv +${CALIPTRA_ROOT}/src/hmac_drbg/rtl/hmac_drbg.sv +${CALIPTRA_ROOT}/src/hmac_drbg/rtl/hmac_drbg_lfsr.sv +${CALIPTRA_ROOT}/src/ecc/rtl/ecc_reg_pkg.sv +${CALIPTRA_ROOT}/src/ecc/rtl/ecc_defines_pkg.sv +${CALIPTRA_ROOT}/src/ecc/rtl/ecc_params_pkg.sv +${CALIPTRA_ROOT}/src/ecc/rtl/ecc_dsa_uop_pkg.sv +${CALIPTRA_ROOT}/src/ecc/rtl/ecc_pm_uop_pkg.sv +${CALIPTRA_ROOT}/src/ecc/rtl/ecc_top.sv +${CALIPTRA_ROOT}/src/ecc/rtl/ecc_reg.sv +${CALIPTRA_ROOT}/src/ecc/rtl/ecc_dsa_ctrl.sv +${CALIPTRA_ROOT}/src/ecc/rtl/ecc_dsa_sequencer.sv +${CALIPTRA_ROOT}/src/ecc/rtl/ecc_scalar_blinding.sv +${CALIPTRA_ROOT}/src/ecc/rtl/ecc_hmac_drbg_interface.sv +${CALIPTRA_ROOT}/src/ecc/rtl/ecc_arith_unit.sv +${CALIPTRA_ROOT}/src/ecc/rtl/ecc_pm_ctrl.sv +${CALIPTRA_ROOT}/src/ecc/rtl/ecc_pm_sequencer.sv +${CALIPTRA_ROOT}/src/ecc/rtl/ecc_ram_tdp_file.sv +${CALIPTRA_ROOT}/src/ecc/rtl/ecc_fau.sv +${CALIPTRA_ROOT}/src/ecc/rtl/ecc_montgomerymultiplier.sv +${CALIPTRA_ROOT}/src/ecc/rtl/ecc_pe_first.sv +${CALIPTRA_ROOT}/src/ecc/rtl/ecc_pe.sv +${CALIPTRA_ROOT}/src/ecc/rtl/ecc_pe_final.sv +${CALIPTRA_ROOT}/src/ecc/rtl/ecc_mult_dsp.sv +${CALIPTRA_ROOT}/src/ecc/rtl/ecc_add_sub_mod_alter.sv +${CALIPTRA_ROOT}/src/ecc/rtl/ecc_adder.sv +${CALIPTRA_ROOT}/src/datavault/rtl/dv_reg_pkg.sv +${CALIPTRA_ROOT}/src/datavault/rtl/dv_reg.sv +${CALIPTRA_ROOT}/src/datavault/rtl/dv.sv +${CALIPTRA_ROOT}/src/soc_ifc/rtl/soc_ifc_top.sv +${CALIPTRA_ROOT}/src/soc_ifc/rtl/soc_ifc_boot_fsm.sv +${CALIPTRA_ROOT}/src/soc_ifc/rtl/soc_ifc_arb.sv +${CALIPTRA_ROOT}/src/soc_ifc/rtl/soc_ifc_reg.sv +${CALIPTRA_ROOT}/src/soc_ifc/rtl/mbox.sv +${CALIPTRA_ROOT}/src/soc_ifc/rtl/mbox_csr.sv +${CALIPTRA_ROOT}/src/soc_ifc/rtl/sha512_acc_top.sv +${CALIPTRA_ROOT}/src/soc_ifc/rtl/sha512_acc_csr.sv +${CALIPTRA_ROOT}/src/soc_ifc/rtl/wdt.sv +${CALIPTRA_ROOT}/src/kmac/rtl/sha3_pkg.sv +${CALIPTRA_ROOT}/src/kmac/rtl/keccak_round.sv +${CALIPTRA_ROOT}/src/kmac/rtl/keccak_2share.sv +${CALIPTRA_ROOT}/src/kmac/rtl/sha3pad.sv +${CALIPTRA_ROOT}/src/kmac/rtl/sha3.sv +${CALIPTRA_ROOT}/src/entropy_src/rtl/entropy_src_reg_top.sv +${CALIPTRA_ROOT}/src/entropy_src/rtl/entropy_src_bucket_ht.sv +${CALIPTRA_ROOT}/src/entropy_src/rtl/entropy_src_cntr_reg.sv +${CALIPTRA_ROOT}/src/entropy_src/rtl/entropy_src_enable_delay.sv +${CALIPTRA_ROOT}/src/entropy_src/rtl/entropy_src_markov_ht.sv +${CALIPTRA_ROOT}/src/entropy_src/rtl/entropy_src_watermark_reg.sv +${CALIPTRA_ROOT}/src/entropy_src/rtl/entropy_src_main_sm.sv +${CALIPTRA_ROOT}/src/entropy_src/rtl/entropy_src_repcnts_ht.sv +${CALIPTRA_ROOT}/src/entropy_src/rtl/entropy_src_adaptp_ht.sv +${CALIPTRA_ROOT}/src/entropy_src/rtl/entropy_src_core.sv +${CALIPTRA_ROOT}/src/entropy_src/rtl/entropy_src_repcnt_ht.sv +${CALIPTRA_ROOT}/src/entropy_src/rtl/entropy_src_ack_sm.sv +${CALIPTRA_ROOT}/src/entropy_src/rtl/entropy_src.sv +${CALIPTRA_ROOT}/src/edn/rtl/edn_pkg.sv +${CALIPTRA_ROOT}/src/aes/rtl/aes_reg_pkg.sv +${CALIPTRA_ROOT}/src/aes/rtl/aes_pkg.sv +${CALIPTRA_ROOT}/src/aes/rtl/aes_sbox_canright_pkg.sv +${CALIPTRA_ROOT}/src/aes/rtl/aes_sbox_canright.sv +${CALIPTRA_ROOT}/src/aes/rtl/aes_sbox_canright_masked.sv +${CALIPTRA_ROOT}/src/aes/rtl/aes_cipher_core.sv +${CALIPTRA_ROOT}/src/aes/rtl/aes_sbox.sv +${CALIPTRA_ROOT}/src/aes/rtl/aes_cipher_control_fsm_n.sv +${CALIPTRA_ROOT}/src/aes/rtl/aes_cipher_control_fsm_p.sv +${CALIPTRA_ROOT}/src/aes/rtl/aes_sbox_lut.sv +${CALIPTRA_ROOT}/src/aes/rtl/aes_mix_columns.sv +${CALIPTRA_ROOT}/src/aes/rtl/aes_sbox_dom.sv +${CALIPTRA_ROOT}/src/aes/rtl/aes_sub_bytes.sv +${CALIPTRA_ROOT}/src/aes/rtl/aes_sbox_canright_masked_noreuse.sv +${CALIPTRA_ROOT}/src/aes/rtl/aes_sel_buf_chk.sv +${CALIPTRA_ROOT}/src/aes/rtl/aes_cipher_control_fsm.sv +${CALIPTRA_ROOT}/src/aes/rtl/aes_shift_rows.sv +${CALIPTRA_ROOT}/src/aes/rtl/aes_mix_single_column.sv +${CALIPTRA_ROOT}/src/aes/rtl/aes_cipher_control.sv +${CALIPTRA_ROOT}/src/aes/rtl/aes_prng_masking.sv +${CALIPTRA_ROOT}/src/aes/rtl/aes_key_expand.sv +${CALIPTRA_ROOT}/src/csrng/rtl/csrng_core.sv +${CALIPTRA_ROOT}/src/csrng/rtl/csrng_main_sm.sv +${CALIPTRA_ROOT}/src/csrng/rtl/csrng_ctr_drbg_upd.sv +${CALIPTRA_ROOT}/src/csrng/rtl/csrng_ctr_drbg_cmd.sv +${CALIPTRA_ROOT}/src/csrng/rtl/csrng_reg_top.sv +${CALIPTRA_ROOT}/src/csrng/rtl/csrng_ctr_drbg_gen.sv +${CALIPTRA_ROOT}/src/csrng/rtl/csrng_block_encrypt.sv +${CALIPTRA_ROOT}/src/csrng/rtl/csrng_state_db.sv +${CALIPTRA_ROOT}/src/csrng/rtl/csrng_cmd_stage.sv +${CALIPTRA_ROOT}/src/csrng/rtl/csrng.sv +${CALIPTRA_ROOT}/src/uart/rtl/uart_tx.sv +${CALIPTRA_ROOT}/src/uart/rtl/uart_reg_top.sv +${CALIPTRA_ROOT}/src/uart/rtl/uart_rx.sv +${CALIPTRA_ROOT}/src/uart/rtl/uart.sv +${CALIPTRA_ROOT}/src/uart/rtl/uart_core.sv +${CALIPTRA_ROOT}/src/integration/rtl/caliptra_top.sv \ No newline at end of file diff --git a/src/integration/config/compile.yml b/src/integration/config/compile.yml index b1aa6e888..564ce173c 100644 --- a/src/integration/config/compile.yml +++ b/src/integration/config/compile.yml @@ -65,20 +65,49 @@ schema_version: 2.4.0 requires: - asserts - libs + - spiflash - caliptra_top - el2_veer_pkg - el2_veer_wrapper + - sha512_coverage + - sha256_coverage + - hmac_coverage + - ecc_coverage + - soc_ifc_coverage targets: + dpi_compile: + directories: + - $COMPILE_ROOT/test_suites/libs/tcp_server + - $COMPILE_ROOT/test_suites/libs/jtagdpi + files: + - $COMPILE_ROOT/test_suites/libs/tcp_server/tcp_server.h + - $COMPILE_ROOT/test_suites/libs/tcp_server/tcp_server.c + - $COMPILE_ROOT/test_suites/libs/jtagdpi/jtagdpi.h + - $COMPILE_ROOT/test_suites/libs/jtagdpi/jtagdpi.c + options: + - '-Wno-unused-variable' + - '-Wno-unused-function' + - tool: + vcs: + - '-DVCS' + ius: + - '-DXCELIUM' tb: - directories: [$COMPILE_ROOT/tb] + directories: #[$COMPILE_ROOT/tb] + - $COMPILE_ROOT/tb + - $COMPILE_ROOT/coverage files: - - $COMPILE_ROOT/tb/caliptra_veer_sram_export.sv - $COMPILE_ROOT/tb/caliptra_top_tb_pkg.sv + - $COMPILE_ROOT/tb/caliptra_veer_sram_export.sv - $COMPILE_ROOT/tb/caliptra_top_tb_services.sv + - $COMPILE_ROOT/coverage/caliptra_top_cov_if.sv + - $COMPILE_ROOT/coverage/caliptra_top_cov_bind.sv + - $COMPILE_ROOT/test_suites/libs/jtagdpi/jtagdpi.sv - $COMPILE_ROOT/tb/caliptra_top_tb.sv tops: [caliptra_top_tb] sim: - pre_exec: '$MSFT_TOOLS/scripts/run_test_makefile && echo "[PRE-EXEC] Copying ECC vector generator to $(pwd)" && cp $COMPILE_ROOT/../ecc/tb/ecdsa_secp384r1.exe .' + pre_exec: '$MSFT_TOOLS/scripts/run_test_makefile && echo "[PRE-EXEC] Copying ECC vector generator to ${pwd}" && cp $COMPILE_ROOT/../ecc/tb/ecdsa_secp384r1.exe . + && echo "[PRE-EXEC] Copying DOE vector generator to ${pwd}" && cp $COMPILE_ROOT/../doe/tb/doe_test_gen.py .' global: tool: vcs: @@ -93,3 +122,22 @@ global: #sim: #- '-ucli -i dump.ucli' +--- +provides: [caliptra_top_trng_tb] +schema_version: 2.4.0 +requires: + - caliptra_top_tb +targets: + tb: + tops: [caliptra_top_tb] + sim: + pre_exec: '$MSFT_TOOLS/scripts/run_test_makefile && echo "[PRE-EXEC] Copying ECC vector generator to ${pwd}" && cp $COMPILE_ROOT/../ecc/tb/ecdsa_secp384r1.exe . + && echo "[PRE-EXEC] Copying DOE vector generator to ${pwd}" && cp $COMPILE_ROOT/../doe/tb/doe_test_gen.py .' +global: + tool: + vcs: + default: + - '-assert svaext' + - +define+CLP_ASSERT_ON + - '-noinherit_timescale=1ns/1ps' + - '+define+CALIPTRA_INTERNAL_TRNG' diff --git a/src/integration/coverage/caliptra_top_cov_bind.sv b/src/integration/coverage/caliptra_top_cov_bind.sv new file mode 100644 index 000000000..7f7903840 --- /dev/null +++ b/src/integration/coverage/caliptra_top_cov_bind.sv @@ -0,0 +1,20 @@ +// SPDX-License-Identifier: Apache-2.0 +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + + +module caliptra_top_cov_bind; + `ifdef FCOV + bind caliptra_top caliptra_top_cov_if i_caliptra_top_cov_if(.*); + `endif +endmodule diff --git a/src/integration/coverage/caliptra_top_cov_if.sv b/src/integration/coverage/caliptra_top_cov_if.sv new file mode 100644 index 000000000..fe5ff93b3 --- /dev/null +++ b/src/integration/coverage/caliptra_top_cov_if.sv @@ -0,0 +1,118 @@ +// SPDX-License-Identifier: Apache-2.0 +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +`ifndef VERILATOR + +interface caliptra_top_cov_if + import soc_ifc_pkg::*; + ( + input logic clk, + input logic PSEL, + input logic [63:0] generic_input_wires, + input logic cptra_rst_b, + input logic cptra_pwrgood, + input logic scan_mode, + input security_state_t security_state, + input logic cptra_error_fatal +); + + logic clk_gating_en; + logic cpu_halt_status; + logic wdt_timer1_en; + logic wdt_timer2_en; + logic nmi_int; + + assign clk_gating_en = caliptra_top.cg.clk_gate_en; + assign cpu_halt_status = caliptra_top.cg.cpu_halt_status; + assign wdt_timer1_en = caliptra_top.soc_ifc_top1.i_wdt.timer1_en; + assign wdt_timer2_en = caliptra_top.soc_ifc_top1.i_wdt.timer2_en; + assign nmi_int = caliptra_top.nmi_int; + + + covergroup caliptra_top_cov_grp @(posedge clk); + option.per_instance = 1; + + //----------------------------------------- + //WDT coverpoints + //----------------------------------------- + wdt_t1: coverpoint wdt_timer1_en; + wdt_t2: coverpoint wdt_timer2_en; + wdt_t1Xt2: cross wdt_t1, wdt_t2; + wdt_t1t2Xwarmrst: cross wdt_t1Xt2, cptra_rst_b; + wdt_t1t2Xcoldrst: cross wdt_t1Xt2, cptra_pwrgood; + + //----------------------------------------- + //CLK GATING coverpoints + //----------------------------------------- + apb_txn: coverpoint PSEL { + bins single_apb_txn = (0 => 1 => 0); + bins b2b_apb_txn = (1 [*5]); //5 txns in a row + } + cg_en: coverpoint clk_gating_en; + core_asleep_value: coverpoint cpu_halt_status; + core_asleep_trans: coverpoint cpu_halt_status { + bins bin01 = (0 => 1); + bins bin10 = (1 => 0); + } + warm_rst: coverpoint cptra_rst_b; + + scan: coverpoint scan_mode; + debug: coverpoint security_state.debug_locked; + fatal_error: coverpoint cptra_error_fatal; + nmi: coverpoint nmi_int; + generic: coverpoint generic_input_wires; + + enXcore_asleep: cross cg_en, core_asleep_value { + ignore_bins b0 = enXcore_asleep with ((cg_en == 0) && (core_asleep_value == 1)); + } + enXcore_asleepXwarm_rst: cross enXcore_asleep, warm_rst; + enXcore_asleepXcold_rst: cross enXcore_asleep, cptra_pwrgood; + // { + // ignore_bins b0 = enXcore_asleepXwarm_rst with ((cg_en == 1) && (core_asleep_value == 1) && (warm_rst == 0)); + // } + enXcore_asleepXwdt1: cross enXcore_asleep, wdt_t1; + enXcore_asleepXwdt2: cross enXcore_asleep, wdt_t2; + + enXcore_asleepXscan: cross enXcore_asleep, scan; + enXcore_asleepXdebug: cross enXcore_asleep, debug; + enXcore_asleepXfatalerr: cross enXcore_asleep, fatal_error; + enXcore_asleepXnmi: cross enXcore_asleep, nmi; + enXcore_asleepXapb: cross enXcore_asleep, apb_txn; + enXcore_asleepXgeneric: cross enXcore_asleep, generic; + endgroup + + covergroup generic_input_wires_cg(input logic generic_bit) @(posedge clk); + option.per_instance = 1; + value: coverpoint generic_bit; + transition: coverpoint generic_bit { + bins bin01 = (0 => 1); + bins bin10 = (1 => 0); + } + endgroup + + // CLK_GATING_cov_grp CLK_GATING_cov_grp1 = new(); + // WDT_cov_grp WDT_cov_grp1 = new(); + caliptra_top_cov_grp caliptra_top_cov_grp1 = new(); + + generic_input_wires_cg giw_cg[64]; + //foreach(giw_cg[i]) giw_cg[i] = new(generic_input_wires[i]); + initial begin + for(int i = 0; i < 64; i++) begin + giw_cg[i] = new(generic_input_wires[i]); + end + end + +endinterface + +`endif \ No newline at end of file diff --git a/src/integration/rtl/caliptra_reg.h b/src/integration/rtl/caliptra_reg.h index 82028a21e..eb10fd96d 100644 --- a/src/integration/rtl/caliptra_reg.h +++ b/src/integration/rtl/caliptra_reg.h @@ -15,6 +15,7 @@ #ifndef CALIPTRA_REG_HEADER #define CALIPTRA_REG_HEADER + #define CLP_BASE_ADDR (0x0) #define CLP_DOE_REG_BASE_ADDR (0x10000000) #define CLP_DOE_REG_DOE_IV_0 (0x10000000) @@ -3481,346 +3482,346 @@ #define DV_REG_STICKY_DATA_VAULT_ENTRY_9_10 (0x200) #define CLP_DV_REG_STICKY_DATA_VAULT_ENTRY_9_11 (0x1001c204) #define DV_REG_STICKY_DATA_VAULT_ENTRY_9_11 (0x204) -#define CLP_DV_REG_NONSTICKYDATAVAULTCTRL_0 (0x1001c208) -#define DV_REG_NONSTICKYDATAVAULTCTRL_0 (0x208) -#define DV_REG_NONSTICKYDATAVAULTCTRL_0_LOCK_ENTRY_LOW (0) -#define DV_REG_NONSTICKYDATAVAULTCTRL_0_LOCK_ENTRY_MASK (0x1) -#define CLP_DV_REG_NONSTICKYDATAVAULTCTRL_1 (0x1001c20c) -#define DV_REG_NONSTICKYDATAVAULTCTRL_1 (0x20c) -#define DV_REG_NONSTICKYDATAVAULTCTRL_1_LOCK_ENTRY_LOW (0) -#define DV_REG_NONSTICKYDATAVAULTCTRL_1_LOCK_ENTRY_MASK (0x1) -#define CLP_DV_REG_NONSTICKYDATAVAULTCTRL_2 (0x1001c210) -#define DV_REG_NONSTICKYDATAVAULTCTRL_2 (0x210) -#define DV_REG_NONSTICKYDATAVAULTCTRL_2_LOCK_ENTRY_LOW (0) -#define DV_REG_NONSTICKYDATAVAULTCTRL_2_LOCK_ENTRY_MASK (0x1) -#define CLP_DV_REG_NONSTICKYDATAVAULTCTRL_3 (0x1001c214) -#define DV_REG_NONSTICKYDATAVAULTCTRL_3 (0x214) -#define DV_REG_NONSTICKYDATAVAULTCTRL_3_LOCK_ENTRY_LOW (0) -#define DV_REG_NONSTICKYDATAVAULTCTRL_3_LOCK_ENTRY_MASK (0x1) -#define CLP_DV_REG_NONSTICKYDATAVAULTCTRL_4 (0x1001c218) -#define DV_REG_NONSTICKYDATAVAULTCTRL_4 (0x218) -#define DV_REG_NONSTICKYDATAVAULTCTRL_4_LOCK_ENTRY_LOW (0) -#define DV_REG_NONSTICKYDATAVAULTCTRL_4_LOCK_ENTRY_MASK (0x1) -#define CLP_DV_REG_NONSTICKYDATAVAULTCTRL_5 (0x1001c21c) -#define DV_REG_NONSTICKYDATAVAULTCTRL_5 (0x21c) -#define DV_REG_NONSTICKYDATAVAULTCTRL_5_LOCK_ENTRY_LOW (0) -#define DV_REG_NONSTICKYDATAVAULTCTRL_5_LOCK_ENTRY_MASK (0x1) -#define CLP_DV_REG_NONSTICKYDATAVAULTCTRL_6 (0x1001c220) -#define DV_REG_NONSTICKYDATAVAULTCTRL_6 (0x220) -#define DV_REG_NONSTICKYDATAVAULTCTRL_6_LOCK_ENTRY_LOW (0) -#define DV_REG_NONSTICKYDATAVAULTCTRL_6_LOCK_ENTRY_MASK (0x1) -#define CLP_DV_REG_NONSTICKYDATAVAULTCTRL_7 (0x1001c224) -#define DV_REG_NONSTICKYDATAVAULTCTRL_7 (0x224) -#define DV_REG_NONSTICKYDATAVAULTCTRL_7_LOCK_ENTRY_LOW (0) -#define DV_REG_NONSTICKYDATAVAULTCTRL_7_LOCK_ENTRY_MASK (0x1) -#define CLP_DV_REG_NONSTICKYDATAVAULTCTRL_8 (0x1001c228) -#define DV_REG_NONSTICKYDATAVAULTCTRL_8 (0x228) -#define DV_REG_NONSTICKYDATAVAULTCTRL_8_LOCK_ENTRY_LOW (0) -#define DV_REG_NONSTICKYDATAVAULTCTRL_8_LOCK_ENTRY_MASK (0x1) -#define CLP_DV_REG_NONSTICKYDATAVAULTCTRL_9 (0x1001c22c) -#define DV_REG_NONSTICKYDATAVAULTCTRL_9 (0x22c) -#define DV_REG_NONSTICKYDATAVAULTCTRL_9_LOCK_ENTRY_LOW (0) -#define DV_REG_NONSTICKYDATAVAULTCTRL_9_LOCK_ENTRY_MASK (0x1) -#define CLP_DV_REG_NONSTICKY_DATA_VAULT_ENTRY_0_0 (0x1001c230) -#define DV_REG_NONSTICKY_DATA_VAULT_ENTRY_0_0 (0x230) -#define CLP_DV_REG_NONSTICKY_DATA_VAULT_ENTRY_0_1 (0x1001c234) -#define DV_REG_NONSTICKY_DATA_VAULT_ENTRY_0_1 (0x234) -#define CLP_DV_REG_NONSTICKY_DATA_VAULT_ENTRY_0_2 (0x1001c238) -#define DV_REG_NONSTICKY_DATA_VAULT_ENTRY_0_2 (0x238) -#define CLP_DV_REG_NONSTICKY_DATA_VAULT_ENTRY_0_3 (0x1001c23c) -#define DV_REG_NONSTICKY_DATA_VAULT_ENTRY_0_3 (0x23c) -#define CLP_DV_REG_NONSTICKY_DATA_VAULT_ENTRY_0_4 (0x1001c240) -#define DV_REG_NONSTICKY_DATA_VAULT_ENTRY_0_4 (0x240) -#define CLP_DV_REG_NONSTICKY_DATA_VAULT_ENTRY_0_5 (0x1001c244) -#define DV_REG_NONSTICKY_DATA_VAULT_ENTRY_0_5 (0x244) -#define CLP_DV_REG_NONSTICKY_DATA_VAULT_ENTRY_0_6 (0x1001c248) -#define DV_REG_NONSTICKY_DATA_VAULT_ENTRY_0_6 (0x248) -#define CLP_DV_REG_NONSTICKY_DATA_VAULT_ENTRY_0_7 (0x1001c24c) -#define DV_REG_NONSTICKY_DATA_VAULT_ENTRY_0_7 (0x24c) -#define CLP_DV_REG_NONSTICKY_DATA_VAULT_ENTRY_0_8 (0x1001c250) -#define DV_REG_NONSTICKY_DATA_VAULT_ENTRY_0_8 (0x250) -#define CLP_DV_REG_NONSTICKY_DATA_VAULT_ENTRY_0_9 (0x1001c254) -#define DV_REG_NONSTICKY_DATA_VAULT_ENTRY_0_9 (0x254) -#define CLP_DV_REG_NONSTICKY_DATA_VAULT_ENTRY_0_10 (0x1001c258) -#define DV_REG_NONSTICKY_DATA_VAULT_ENTRY_0_10 (0x258) -#define CLP_DV_REG_NONSTICKY_DATA_VAULT_ENTRY_0_11 (0x1001c25c) -#define DV_REG_NONSTICKY_DATA_VAULT_ENTRY_0_11 (0x25c) -#define CLP_DV_REG_NONSTICKY_DATA_VAULT_ENTRY_1_0 (0x1001c260) -#define DV_REG_NONSTICKY_DATA_VAULT_ENTRY_1_0 (0x260) -#define CLP_DV_REG_NONSTICKY_DATA_VAULT_ENTRY_1_1 (0x1001c264) -#define DV_REG_NONSTICKY_DATA_VAULT_ENTRY_1_1 (0x264) -#define CLP_DV_REG_NONSTICKY_DATA_VAULT_ENTRY_1_2 (0x1001c268) -#define DV_REG_NONSTICKY_DATA_VAULT_ENTRY_1_2 (0x268) -#define CLP_DV_REG_NONSTICKY_DATA_VAULT_ENTRY_1_3 (0x1001c26c) -#define DV_REG_NONSTICKY_DATA_VAULT_ENTRY_1_3 (0x26c) -#define CLP_DV_REG_NONSTICKY_DATA_VAULT_ENTRY_1_4 (0x1001c270) -#define DV_REG_NONSTICKY_DATA_VAULT_ENTRY_1_4 (0x270) -#define CLP_DV_REG_NONSTICKY_DATA_VAULT_ENTRY_1_5 (0x1001c274) -#define DV_REG_NONSTICKY_DATA_VAULT_ENTRY_1_5 (0x274) -#define CLP_DV_REG_NONSTICKY_DATA_VAULT_ENTRY_1_6 (0x1001c278) -#define DV_REG_NONSTICKY_DATA_VAULT_ENTRY_1_6 (0x278) -#define CLP_DV_REG_NONSTICKY_DATA_VAULT_ENTRY_1_7 (0x1001c27c) -#define DV_REG_NONSTICKY_DATA_VAULT_ENTRY_1_7 (0x27c) -#define CLP_DV_REG_NONSTICKY_DATA_VAULT_ENTRY_1_8 (0x1001c280) -#define DV_REG_NONSTICKY_DATA_VAULT_ENTRY_1_8 (0x280) -#define CLP_DV_REG_NONSTICKY_DATA_VAULT_ENTRY_1_9 (0x1001c284) -#define DV_REG_NONSTICKY_DATA_VAULT_ENTRY_1_9 (0x284) -#define CLP_DV_REG_NONSTICKY_DATA_VAULT_ENTRY_1_10 (0x1001c288) -#define DV_REG_NONSTICKY_DATA_VAULT_ENTRY_1_10 (0x288) -#define CLP_DV_REG_NONSTICKY_DATA_VAULT_ENTRY_1_11 (0x1001c28c) -#define DV_REG_NONSTICKY_DATA_VAULT_ENTRY_1_11 (0x28c) -#define CLP_DV_REG_NONSTICKY_DATA_VAULT_ENTRY_2_0 (0x1001c290) -#define DV_REG_NONSTICKY_DATA_VAULT_ENTRY_2_0 (0x290) -#define CLP_DV_REG_NONSTICKY_DATA_VAULT_ENTRY_2_1 (0x1001c294) -#define DV_REG_NONSTICKY_DATA_VAULT_ENTRY_2_1 (0x294) -#define CLP_DV_REG_NONSTICKY_DATA_VAULT_ENTRY_2_2 (0x1001c298) -#define DV_REG_NONSTICKY_DATA_VAULT_ENTRY_2_2 (0x298) -#define CLP_DV_REG_NONSTICKY_DATA_VAULT_ENTRY_2_3 (0x1001c29c) -#define DV_REG_NONSTICKY_DATA_VAULT_ENTRY_2_3 (0x29c) -#define CLP_DV_REG_NONSTICKY_DATA_VAULT_ENTRY_2_4 (0x1001c2a0) -#define DV_REG_NONSTICKY_DATA_VAULT_ENTRY_2_4 (0x2a0) -#define CLP_DV_REG_NONSTICKY_DATA_VAULT_ENTRY_2_5 (0x1001c2a4) -#define DV_REG_NONSTICKY_DATA_VAULT_ENTRY_2_5 (0x2a4) -#define CLP_DV_REG_NONSTICKY_DATA_VAULT_ENTRY_2_6 (0x1001c2a8) -#define DV_REG_NONSTICKY_DATA_VAULT_ENTRY_2_6 (0x2a8) -#define CLP_DV_REG_NONSTICKY_DATA_VAULT_ENTRY_2_7 (0x1001c2ac) -#define DV_REG_NONSTICKY_DATA_VAULT_ENTRY_2_7 (0x2ac) -#define CLP_DV_REG_NONSTICKY_DATA_VAULT_ENTRY_2_8 (0x1001c2b0) -#define DV_REG_NONSTICKY_DATA_VAULT_ENTRY_2_8 (0x2b0) -#define CLP_DV_REG_NONSTICKY_DATA_VAULT_ENTRY_2_9 (0x1001c2b4) -#define DV_REG_NONSTICKY_DATA_VAULT_ENTRY_2_9 (0x2b4) -#define CLP_DV_REG_NONSTICKY_DATA_VAULT_ENTRY_2_10 (0x1001c2b8) -#define DV_REG_NONSTICKY_DATA_VAULT_ENTRY_2_10 (0x2b8) -#define CLP_DV_REG_NONSTICKY_DATA_VAULT_ENTRY_2_11 (0x1001c2bc) -#define DV_REG_NONSTICKY_DATA_VAULT_ENTRY_2_11 (0x2bc) -#define CLP_DV_REG_NONSTICKY_DATA_VAULT_ENTRY_3_0 (0x1001c2c0) -#define DV_REG_NONSTICKY_DATA_VAULT_ENTRY_3_0 (0x2c0) -#define CLP_DV_REG_NONSTICKY_DATA_VAULT_ENTRY_3_1 (0x1001c2c4) -#define DV_REG_NONSTICKY_DATA_VAULT_ENTRY_3_1 (0x2c4) -#define CLP_DV_REG_NONSTICKY_DATA_VAULT_ENTRY_3_2 (0x1001c2c8) -#define DV_REG_NONSTICKY_DATA_VAULT_ENTRY_3_2 (0x2c8) -#define CLP_DV_REG_NONSTICKY_DATA_VAULT_ENTRY_3_3 (0x1001c2cc) -#define DV_REG_NONSTICKY_DATA_VAULT_ENTRY_3_3 (0x2cc) -#define CLP_DV_REG_NONSTICKY_DATA_VAULT_ENTRY_3_4 (0x1001c2d0) -#define DV_REG_NONSTICKY_DATA_VAULT_ENTRY_3_4 (0x2d0) -#define CLP_DV_REG_NONSTICKY_DATA_VAULT_ENTRY_3_5 (0x1001c2d4) -#define DV_REG_NONSTICKY_DATA_VAULT_ENTRY_3_5 (0x2d4) -#define CLP_DV_REG_NONSTICKY_DATA_VAULT_ENTRY_3_6 (0x1001c2d8) -#define DV_REG_NONSTICKY_DATA_VAULT_ENTRY_3_6 (0x2d8) -#define CLP_DV_REG_NONSTICKY_DATA_VAULT_ENTRY_3_7 (0x1001c2dc) -#define DV_REG_NONSTICKY_DATA_VAULT_ENTRY_3_7 (0x2dc) -#define CLP_DV_REG_NONSTICKY_DATA_VAULT_ENTRY_3_8 (0x1001c2e0) -#define DV_REG_NONSTICKY_DATA_VAULT_ENTRY_3_8 (0x2e0) -#define CLP_DV_REG_NONSTICKY_DATA_VAULT_ENTRY_3_9 (0x1001c2e4) -#define DV_REG_NONSTICKY_DATA_VAULT_ENTRY_3_9 (0x2e4) -#define CLP_DV_REG_NONSTICKY_DATA_VAULT_ENTRY_3_10 (0x1001c2e8) -#define DV_REG_NONSTICKY_DATA_VAULT_ENTRY_3_10 (0x2e8) -#define CLP_DV_REG_NONSTICKY_DATA_VAULT_ENTRY_3_11 (0x1001c2ec) -#define DV_REG_NONSTICKY_DATA_VAULT_ENTRY_3_11 (0x2ec) -#define CLP_DV_REG_NONSTICKY_DATA_VAULT_ENTRY_4_0 (0x1001c2f0) -#define DV_REG_NONSTICKY_DATA_VAULT_ENTRY_4_0 (0x2f0) -#define CLP_DV_REG_NONSTICKY_DATA_VAULT_ENTRY_4_1 (0x1001c2f4) -#define DV_REG_NONSTICKY_DATA_VAULT_ENTRY_4_1 (0x2f4) -#define CLP_DV_REG_NONSTICKY_DATA_VAULT_ENTRY_4_2 (0x1001c2f8) -#define DV_REG_NONSTICKY_DATA_VAULT_ENTRY_4_2 (0x2f8) -#define CLP_DV_REG_NONSTICKY_DATA_VAULT_ENTRY_4_3 (0x1001c2fc) -#define DV_REG_NONSTICKY_DATA_VAULT_ENTRY_4_3 (0x2fc) -#define CLP_DV_REG_NONSTICKY_DATA_VAULT_ENTRY_4_4 (0x1001c300) -#define DV_REG_NONSTICKY_DATA_VAULT_ENTRY_4_4 (0x300) -#define CLP_DV_REG_NONSTICKY_DATA_VAULT_ENTRY_4_5 (0x1001c304) -#define DV_REG_NONSTICKY_DATA_VAULT_ENTRY_4_5 (0x304) -#define CLP_DV_REG_NONSTICKY_DATA_VAULT_ENTRY_4_6 (0x1001c308) -#define DV_REG_NONSTICKY_DATA_VAULT_ENTRY_4_6 (0x308) -#define CLP_DV_REG_NONSTICKY_DATA_VAULT_ENTRY_4_7 (0x1001c30c) -#define DV_REG_NONSTICKY_DATA_VAULT_ENTRY_4_7 (0x30c) -#define CLP_DV_REG_NONSTICKY_DATA_VAULT_ENTRY_4_8 (0x1001c310) -#define DV_REG_NONSTICKY_DATA_VAULT_ENTRY_4_8 (0x310) -#define CLP_DV_REG_NONSTICKY_DATA_VAULT_ENTRY_4_9 (0x1001c314) -#define DV_REG_NONSTICKY_DATA_VAULT_ENTRY_4_9 (0x314) -#define CLP_DV_REG_NONSTICKY_DATA_VAULT_ENTRY_4_10 (0x1001c318) -#define DV_REG_NONSTICKY_DATA_VAULT_ENTRY_4_10 (0x318) -#define CLP_DV_REG_NONSTICKY_DATA_VAULT_ENTRY_4_11 (0x1001c31c) -#define DV_REG_NONSTICKY_DATA_VAULT_ENTRY_4_11 (0x31c) -#define CLP_DV_REG_NONSTICKY_DATA_VAULT_ENTRY_5_0 (0x1001c320) -#define DV_REG_NONSTICKY_DATA_VAULT_ENTRY_5_0 (0x320) -#define CLP_DV_REG_NONSTICKY_DATA_VAULT_ENTRY_5_1 (0x1001c324) -#define DV_REG_NONSTICKY_DATA_VAULT_ENTRY_5_1 (0x324) -#define CLP_DV_REG_NONSTICKY_DATA_VAULT_ENTRY_5_2 (0x1001c328) -#define DV_REG_NONSTICKY_DATA_VAULT_ENTRY_5_2 (0x328) -#define CLP_DV_REG_NONSTICKY_DATA_VAULT_ENTRY_5_3 (0x1001c32c) -#define DV_REG_NONSTICKY_DATA_VAULT_ENTRY_5_3 (0x32c) -#define CLP_DV_REG_NONSTICKY_DATA_VAULT_ENTRY_5_4 (0x1001c330) -#define DV_REG_NONSTICKY_DATA_VAULT_ENTRY_5_4 (0x330) -#define CLP_DV_REG_NONSTICKY_DATA_VAULT_ENTRY_5_5 (0x1001c334) -#define DV_REG_NONSTICKY_DATA_VAULT_ENTRY_5_5 (0x334) -#define CLP_DV_REG_NONSTICKY_DATA_VAULT_ENTRY_5_6 (0x1001c338) -#define DV_REG_NONSTICKY_DATA_VAULT_ENTRY_5_6 (0x338) -#define CLP_DV_REG_NONSTICKY_DATA_VAULT_ENTRY_5_7 (0x1001c33c) -#define DV_REG_NONSTICKY_DATA_VAULT_ENTRY_5_7 (0x33c) -#define CLP_DV_REG_NONSTICKY_DATA_VAULT_ENTRY_5_8 (0x1001c340) -#define DV_REG_NONSTICKY_DATA_VAULT_ENTRY_5_8 (0x340) -#define CLP_DV_REG_NONSTICKY_DATA_VAULT_ENTRY_5_9 (0x1001c344) -#define DV_REG_NONSTICKY_DATA_VAULT_ENTRY_5_9 (0x344) -#define CLP_DV_REG_NONSTICKY_DATA_VAULT_ENTRY_5_10 (0x1001c348) -#define DV_REG_NONSTICKY_DATA_VAULT_ENTRY_5_10 (0x348) -#define CLP_DV_REG_NONSTICKY_DATA_VAULT_ENTRY_5_11 (0x1001c34c) -#define DV_REG_NONSTICKY_DATA_VAULT_ENTRY_5_11 (0x34c) -#define CLP_DV_REG_NONSTICKY_DATA_VAULT_ENTRY_6_0 (0x1001c350) -#define DV_REG_NONSTICKY_DATA_VAULT_ENTRY_6_0 (0x350) -#define CLP_DV_REG_NONSTICKY_DATA_VAULT_ENTRY_6_1 (0x1001c354) -#define DV_REG_NONSTICKY_DATA_VAULT_ENTRY_6_1 (0x354) -#define CLP_DV_REG_NONSTICKY_DATA_VAULT_ENTRY_6_2 (0x1001c358) -#define DV_REG_NONSTICKY_DATA_VAULT_ENTRY_6_2 (0x358) -#define CLP_DV_REG_NONSTICKY_DATA_VAULT_ENTRY_6_3 (0x1001c35c) -#define DV_REG_NONSTICKY_DATA_VAULT_ENTRY_6_3 (0x35c) -#define CLP_DV_REG_NONSTICKY_DATA_VAULT_ENTRY_6_4 (0x1001c360) -#define DV_REG_NONSTICKY_DATA_VAULT_ENTRY_6_4 (0x360) -#define CLP_DV_REG_NONSTICKY_DATA_VAULT_ENTRY_6_5 (0x1001c364) -#define DV_REG_NONSTICKY_DATA_VAULT_ENTRY_6_5 (0x364) -#define CLP_DV_REG_NONSTICKY_DATA_VAULT_ENTRY_6_6 (0x1001c368) -#define DV_REG_NONSTICKY_DATA_VAULT_ENTRY_6_6 (0x368) -#define CLP_DV_REG_NONSTICKY_DATA_VAULT_ENTRY_6_7 (0x1001c36c) -#define DV_REG_NONSTICKY_DATA_VAULT_ENTRY_6_7 (0x36c) -#define CLP_DV_REG_NONSTICKY_DATA_VAULT_ENTRY_6_8 (0x1001c370) -#define DV_REG_NONSTICKY_DATA_VAULT_ENTRY_6_8 (0x370) -#define CLP_DV_REG_NONSTICKY_DATA_VAULT_ENTRY_6_9 (0x1001c374) -#define DV_REG_NONSTICKY_DATA_VAULT_ENTRY_6_9 (0x374) -#define CLP_DV_REG_NONSTICKY_DATA_VAULT_ENTRY_6_10 (0x1001c378) -#define DV_REG_NONSTICKY_DATA_VAULT_ENTRY_6_10 (0x378) -#define CLP_DV_REG_NONSTICKY_DATA_VAULT_ENTRY_6_11 (0x1001c37c) -#define DV_REG_NONSTICKY_DATA_VAULT_ENTRY_6_11 (0x37c) -#define CLP_DV_REG_NONSTICKY_DATA_VAULT_ENTRY_7_0 (0x1001c380) -#define DV_REG_NONSTICKY_DATA_VAULT_ENTRY_7_0 (0x380) -#define CLP_DV_REG_NONSTICKY_DATA_VAULT_ENTRY_7_1 (0x1001c384) -#define DV_REG_NONSTICKY_DATA_VAULT_ENTRY_7_1 (0x384) -#define CLP_DV_REG_NONSTICKY_DATA_VAULT_ENTRY_7_2 (0x1001c388) -#define DV_REG_NONSTICKY_DATA_VAULT_ENTRY_7_2 (0x388) -#define CLP_DV_REG_NONSTICKY_DATA_VAULT_ENTRY_7_3 (0x1001c38c) -#define DV_REG_NONSTICKY_DATA_VAULT_ENTRY_7_3 (0x38c) -#define CLP_DV_REG_NONSTICKY_DATA_VAULT_ENTRY_7_4 (0x1001c390) -#define DV_REG_NONSTICKY_DATA_VAULT_ENTRY_7_4 (0x390) -#define CLP_DV_REG_NONSTICKY_DATA_VAULT_ENTRY_7_5 (0x1001c394) -#define DV_REG_NONSTICKY_DATA_VAULT_ENTRY_7_5 (0x394) -#define CLP_DV_REG_NONSTICKY_DATA_VAULT_ENTRY_7_6 (0x1001c398) -#define DV_REG_NONSTICKY_DATA_VAULT_ENTRY_7_6 (0x398) -#define CLP_DV_REG_NONSTICKY_DATA_VAULT_ENTRY_7_7 (0x1001c39c) -#define DV_REG_NONSTICKY_DATA_VAULT_ENTRY_7_7 (0x39c) -#define CLP_DV_REG_NONSTICKY_DATA_VAULT_ENTRY_7_8 (0x1001c3a0) -#define DV_REG_NONSTICKY_DATA_VAULT_ENTRY_7_8 (0x3a0) -#define CLP_DV_REG_NONSTICKY_DATA_VAULT_ENTRY_7_9 (0x1001c3a4) -#define DV_REG_NONSTICKY_DATA_VAULT_ENTRY_7_9 (0x3a4) -#define CLP_DV_REG_NONSTICKY_DATA_VAULT_ENTRY_7_10 (0x1001c3a8) -#define DV_REG_NONSTICKY_DATA_VAULT_ENTRY_7_10 (0x3a8) -#define CLP_DV_REG_NONSTICKY_DATA_VAULT_ENTRY_7_11 (0x1001c3ac) -#define DV_REG_NONSTICKY_DATA_VAULT_ENTRY_7_11 (0x3ac) -#define CLP_DV_REG_NONSTICKY_DATA_VAULT_ENTRY_8_0 (0x1001c3b0) -#define DV_REG_NONSTICKY_DATA_VAULT_ENTRY_8_0 (0x3b0) -#define CLP_DV_REG_NONSTICKY_DATA_VAULT_ENTRY_8_1 (0x1001c3b4) -#define DV_REG_NONSTICKY_DATA_VAULT_ENTRY_8_1 (0x3b4) -#define CLP_DV_REG_NONSTICKY_DATA_VAULT_ENTRY_8_2 (0x1001c3b8) -#define DV_REG_NONSTICKY_DATA_VAULT_ENTRY_8_2 (0x3b8) -#define CLP_DV_REG_NONSTICKY_DATA_VAULT_ENTRY_8_3 (0x1001c3bc) -#define DV_REG_NONSTICKY_DATA_VAULT_ENTRY_8_3 (0x3bc) -#define CLP_DV_REG_NONSTICKY_DATA_VAULT_ENTRY_8_4 (0x1001c3c0) -#define DV_REG_NONSTICKY_DATA_VAULT_ENTRY_8_4 (0x3c0) -#define CLP_DV_REG_NONSTICKY_DATA_VAULT_ENTRY_8_5 (0x1001c3c4) -#define DV_REG_NONSTICKY_DATA_VAULT_ENTRY_8_5 (0x3c4) -#define CLP_DV_REG_NONSTICKY_DATA_VAULT_ENTRY_8_6 (0x1001c3c8) -#define DV_REG_NONSTICKY_DATA_VAULT_ENTRY_8_6 (0x3c8) -#define CLP_DV_REG_NONSTICKY_DATA_VAULT_ENTRY_8_7 (0x1001c3cc) -#define DV_REG_NONSTICKY_DATA_VAULT_ENTRY_8_7 (0x3cc) -#define CLP_DV_REG_NONSTICKY_DATA_VAULT_ENTRY_8_8 (0x1001c3d0) -#define DV_REG_NONSTICKY_DATA_VAULT_ENTRY_8_8 (0x3d0) -#define CLP_DV_REG_NONSTICKY_DATA_VAULT_ENTRY_8_9 (0x1001c3d4) -#define DV_REG_NONSTICKY_DATA_VAULT_ENTRY_8_9 (0x3d4) -#define CLP_DV_REG_NONSTICKY_DATA_VAULT_ENTRY_8_10 (0x1001c3d8) -#define DV_REG_NONSTICKY_DATA_VAULT_ENTRY_8_10 (0x3d8) -#define CLP_DV_REG_NONSTICKY_DATA_VAULT_ENTRY_8_11 (0x1001c3dc) -#define DV_REG_NONSTICKY_DATA_VAULT_ENTRY_8_11 (0x3dc) -#define CLP_DV_REG_NONSTICKY_DATA_VAULT_ENTRY_9_0 (0x1001c3e0) -#define DV_REG_NONSTICKY_DATA_VAULT_ENTRY_9_0 (0x3e0) -#define CLP_DV_REG_NONSTICKY_DATA_VAULT_ENTRY_9_1 (0x1001c3e4) -#define DV_REG_NONSTICKY_DATA_VAULT_ENTRY_9_1 (0x3e4) -#define CLP_DV_REG_NONSTICKY_DATA_VAULT_ENTRY_9_2 (0x1001c3e8) -#define DV_REG_NONSTICKY_DATA_VAULT_ENTRY_9_2 (0x3e8) -#define CLP_DV_REG_NONSTICKY_DATA_VAULT_ENTRY_9_3 (0x1001c3ec) -#define DV_REG_NONSTICKY_DATA_VAULT_ENTRY_9_3 (0x3ec) -#define CLP_DV_REG_NONSTICKY_DATA_VAULT_ENTRY_9_4 (0x1001c3f0) -#define DV_REG_NONSTICKY_DATA_VAULT_ENTRY_9_4 (0x3f0) -#define CLP_DV_REG_NONSTICKY_DATA_VAULT_ENTRY_9_5 (0x1001c3f4) -#define DV_REG_NONSTICKY_DATA_VAULT_ENTRY_9_5 (0x3f4) -#define CLP_DV_REG_NONSTICKY_DATA_VAULT_ENTRY_9_6 (0x1001c3f8) -#define DV_REG_NONSTICKY_DATA_VAULT_ENTRY_9_6 (0x3f8) -#define CLP_DV_REG_NONSTICKY_DATA_VAULT_ENTRY_9_7 (0x1001c3fc) -#define DV_REG_NONSTICKY_DATA_VAULT_ENTRY_9_7 (0x3fc) -#define CLP_DV_REG_NONSTICKY_DATA_VAULT_ENTRY_9_8 (0x1001c400) -#define DV_REG_NONSTICKY_DATA_VAULT_ENTRY_9_8 (0x400) -#define CLP_DV_REG_NONSTICKY_DATA_VAULT_ENTRY_9_9 (0x1001c404) -#define DV_REG_NONSTICKY_DATA_VAULT_ENTRY_9_9 (0x404) -#define CLP_DV_REG_NONSTICKY_DATA_VAULT_ENTRY_9_10 (0x1001c408) -#define DV_REG_NONSTICKY_DATA_VAULT_ENTRY_9_10 (0x408) -#define CLP_DV_REG_NONSTICKY_DATA_VAULT_ENTRY_9_11 (0x1001c40c) -#define DV_REG_NONSTICKY_DATA_VAULT_ENTRY_9_11 (0x40c) -#define CLP_DV_REG_NONSTICKYLOCKABLESCRATCHREGCTRL_0 (0x1001c410) -#define DV_REG_NONSTICKYLOCKABLESCRATCHREGCTRL_0 (0x410) -#define DV_REG_NONSTICKYLOCKABLESCRATCHREGCTRL_0_LOCK_ENTRY_LOW (0) -#define DV_REG_NONSTICKYLOCKABLESCRATCHREGCTRL_0_LOCK_ENTRY_MASK (0x1) -#define CLP_DV_REG_NONSTICKYLOCKABLESCRATCHREGCTRL_1 (0x1001c414) -#define DV_REG_NONSTICKYLOCKABLESCRATCHREGCTRL_1 (0x414) -#define DV_REG_NONSTICKYLOCKABLESCRATCHREGCTRL_1_LOCK_ENTRY_LOW (0) -#define DV_REG_NONSTICKYLOCKABLESCRATCHREGCTRL_1_LOCK_ENTRY_MASK (0x1) -#define CLP_DV_REG_NONSTICKYLOCKABLESCRATCHREGCTRL_2 (0x1001c418) -#define DV_REG_NONSTICKYLOCKABLESCRATCHREGCTRL_2 (0x418) -#define DV_REG_NONSTICKYLOCKABLESCRATCHREGCTRL_2_LOCK_ENTRY_LOW (0) -#define DV_REG_NONSTICKYLOCKABLESCRATCHREGCTRL_2_LOCK_ENTRY_MASK (0x1) -#define CLP_DV_REG_NONSTICKYLOCKABLESCRATCHREGCTRL_3 (0x1001c41c) -#define DV_REG_NONSTICKYLOCKABLESCRATCHREGCTRL_3 (0x41c) -#define DV_REG_NONSTICKYLOCKABLESCRATCHREGCTRL_3_LOCK_ENTRY_LOW (0) -#define DV_REG_NONSTICKYLOCKABLESCRATCHREGCTRL_3_LOCK_ENTRY_MASK (0x1) -#define CLP_DV_REG_NONSTICKYLOCKABLESCRATCHREGCTRL_4 (0x1001c420) -#define DV_REG_NONSTICKYLOCKABLESCRATCHREGCTRL_4 (0x420) -#define DV_REG_NONSTICKYLOCKABLESCRATCHREGCTRL_4_LOCK_ENTRY_LOW (0) -#define DV_REG_NONSTICKYLOCKABLESCRATCHREGCTRL_4_LOCK_ENTRY_MASK (0x1) -#define CLP_DV_REG_NONSTICKYLOCKABLESCRATCHREGCTRL_5 (0x1001c424) -#define DV_REG_NONSTICKYLOCKABLESCRATCHREGCTRL_5 (0x424) -#define DV_REG_NONSTICKYLOCKABLESCRATCHREGCTRL_5_LOCK_ENTRY_LOW (0) -#define DV_REG_NONSTICKYLOCKABLESCRATCHREGCTRL_5_LOCK_ENTRY_MASK (0x1) -#define CLP_DV_REG_NONSTICKYLOCKABLESCRATCHREGCTRL_6 (0x1001c428) -#define DV_REG_NONSTICKYLOCKABLESCRATCHREGCTRL_6 (0x428) -#define DV_REG_NONSTICKYLOCKABLESCRATCHREGCTRL_6_LOCK_ENTRY_LOW (0) -#define DV_REG_NONSTICKYLOCKABLESCRATCHREGCTRL_6_LOCK_ENTRY_MASK (0x1) -#define CLP_DV_REG_NONSTICKYLOCKABLESCRATCHREGCTRL_7 (0x1001c42c) -#define DV_REG_NONSTICKYLOCKABLESCRATCHREGCTRL_7 (0x42c) -#define DV_REG_NONSTICKYLOCKABLESCRATCHREGCTRL_7_LOCK_ENTRY_LOW (0) -#define DV_REG_NONSTICKYLOCKABLESCRATCHREGCTRL_7_LOCK_ENTRY_MASK (0x1) -#define CLP_DV_REG_NONSTICKYLOCKABLESCRATCHREGCTRL_8 (0x1001c430) -#define DV_REG_NONSTICKYLOCKABLESCRATCHREGCTRL_8 (0x430) -#define DV_REG_NONSTICKYLOCKABLESCRATCHREGCTRL_8_LOCK_ENTRY_LOW (0) -#define DV_REG_NONSTICKYLOCKABLESCRATCHREGCTRL_8_LOCK_ENTRY_MASK (0x1) -#define CLP_DV_REG_NONSTICKYLOCKABLESCRATCHREGCTRL_9 (0x1001c434) -#define DV_REG_NONSTICKYLOCKABLESCRATCHREGCTRL_9 (0x434) -#define DV_REG_NONSTICKYLOCKABLESCRATCHREGCTRL_9_LOCK_ENTRY_LOW (0) -#define DV_REG_NONSTICKYLOCKABLESCRATCHREGCTRL_9_LOCK_ENTRY_MASK (0x1) -#define CLP_DV_REG_NONSTICKYLOCKABLESCRATCHREG_0 (0x1001c438) -#define DV_REG_NONSTICKYLOCKABLESCRATCHREG_0 (0x438) -#define CLP_DV_REG_NONSTICKYLOCKABLESCRATCHREG_1 (0x1001c43c) -#define DV_REG_NONSTICKYLOCKABLESCRATCHREG_1 (0x43c) -#define CLP_DV_REG_NONSTICKYLOCKABLESCRATCHREG_2 (0x1001c440) -#define DV_REG_NONSTICKYLOCKABLESCRATCHREG_2 (0x440) -#define CLP_DV_REG_NONSTICKYLOCKABLESCRATCHREG_3 (0x1001c444) -#define DV_REG_NONSTICKYLOCKABLESCRATCHREG_3 (0x444) -#define CLP_DV_REG_NONSTICKYLOCKABLESCRATCHREG_4 (0x1001c448) -#define DV_REG_NONSTICKYLOCKABLESCRATCHREG_4 (0x448) -#define CLP_DV_REG_NONSTICKYLOCKABLESCRATCHREG_5 (0x1001c44c) -#define DV_REG_NONSTICKYLOCKABLESCRATCHREG_5 (0x44c) -#define CLP_DV_REG_NONSTICKYLOCKABLESCRATCHREG_6 (0x1001c450) -#define DV_REG_NONSTICKYLOCKABLESCRATCHREG_6 (0x450) -#define CLP_DV_REG_NONSTICKYLOCKABLESCRATCHREG_7 (0x1001c454) -#define DV_REG_NONSTICKYLOCKABLESCRATCHREG_7 (0x454) -#define CLP_DV_REG_NONSTICKYLOCKABLESCRATCHREG_8 (0x1001c458) -#define DV_REG_NONSTICKYLOCKABLESCRATCHREG_8 (0x458) -#define CLP_DV_REG_NONSTICKYLOCKABLESCRATCHREG_9 (0x1001c45c) -#define DV_REG_NONSTICKYLOCKABLESCRATCHREG_9 (0x45c) +#define CLP_DV_REG_DATAVAULTCTRL_0 (0x1001c208) +#define DV_REG_DATAVAULTCTRL_0 (0x208) +#define DV_REG_DATAVAULTCTRL_0_LOCK_ENTRY_LOW (0) +#define DV_REG_DATAVAULTCTRL_0_LOCK_ENTRY_MASK (0x1) +#define CLP_DV_REG_DATAVAULTCTRL_1 (0x1001c20c) +#define DV_REG_DATAVAULTCTRL_1 (0x20c) +#define DV_REG_DATAVAULTCTRL_1_LOCK_ENTRY_LOW (0) +#define DV_REG_DATAVAULTCTRL_1_LOCK_ENTRY_MASK (0x1) +#define CLP_DV_REG_DATAVAULTCTRL_2 (0x1001c210) +#define DV_REG_DATAVAULTCTRL_2 (0x210) +#define DV_REG_DATAVAULTCTRL_2_LOCK_ENTRY_LOW (0) +#define DV_REG_DATAVAULTCTRL_2_LOCK_ENTRY_MASK (0x1) +#define CLP_DV_REG_DATAVAULTCTRL_3 (0x1001c214) +#define DV_REG_DATAVAULTCTRL_3 (0x214) +#define DV_REG_DATAVAULTCTRL_3_LOCK_ENTRY_LOW (0) +#define DV_REG_DATAVAULTCTRL_3_LOCK_ENTRY_MASK (0x1) +#define CLP_DV_REG_DATAVAULTCTRL_4 (0x1001c218) +#define DV_REG_DATAVAULTCTRL_4 (0x218) +#define DV_REG_DATAVAULTCTRL_4_LOCK_ENTRY_LOW (0) +#define DV_REG_DATAVAULTCTRL_4_LOCK_ENTRY_MASK (0x1) +#define CLP_DV_REG_DATAVAULTCTRL_5 (0x1001c21c) +#define DV_REG_DATAVAULTCTRL_5 (0x21c) +#define DV_REG_DATAVAULTCTRL_5_LOCK_ENTRY_LOW (0) +#define DV_REG_DATAVAULTCTRL_5_LOCK_ENTRY_MASK (0x1) +#define CLP_DV_REG_DATAVAULTCTRL_6 (0x1001c220) +#define DV_REG_DATAVAULTCTRL_6 (0x220) +#define DV_REG_DATAVAULTCTRL_6_LOCK_ENTRY_LOW (0) +#define DV_REG_DATAVAULTCTRL_6_LOCK_ENTRY_MASK (0x1) +#define CLP_DV_REG_DATAVAULTCTRL_7 (0x1001c224) +#define DV_REG_DATAVAULTCTRL_7 (0x224) +#define DV_REG_DATAVAULTCTRL_7_LOCK_ENTRY_LOW (0) +#define DV_REG_DATAVAULTCTRL_7_LOCK_ENTRY_MASK (0x1) +#define CLP_DV_REG_DATAVAULTCTRL_8 (0x1001c228) +#define DV_REG_DATAVAULTCTRL_8 (0x228) +#define DV_REG_DATAVAULTCTRL_8_LOCK_ENTRY_LOW (0) +#define DV_REG_DATAVAULTCTRL_8_LOCK_ENTRY_MASK (0x1) +#define CLP_DV_REG_DATAVAULTCTRL_9 (0x1001c22c) +#define DV_REG_DATAVAULTCTRL_9 (0x22c) +#define DV_REG_DATAVAULTCTRL_9_LOCK_ENTRY_LOW (0) +#define DV_REG_DATAVAULTCTRL_9_LOCK_ENTRY_MASK (0x1) +#define CLP_DV_REG_DATA_VAULT_ENTRY_0_0 (0x1001c230) +#define DV_REG_DATA_VAULT_ENTRY_0_0 (0x230) +#define CLP_DV_REG_DATA_VAULT_ENTRY_0_1 (0x1001c234) +#define DV_REG_DATA_VAULT_ENTRY_0_1 (0x234) +#define CLP_DV_REG_DATA_VAULT_ENTRY_0_2 (0x1001c238) +#define DV_REG_DATA_VAULT_ENTRY_0_2 (0x238) +#define CLP_DV_REG_DATA_VAULT_ENTRY_0_3 (0x1001c23c) +#define DV_REG_DATA_VAULT_ENTRY_0_3 (0x23c) +#define CLP_DV_REG_DATA_VAULT_ENTRY_0_4 (0x1001c240) +#define DV_REG_DATA_VAULT_ENTRY_0_4 (0x240) +#define CLP_DV_REG_DATA_VAULT_ENTRY_0_5 (0x1001c244) +#define DV_REG_DATA_VAULT_ENTRY_0_5 (0x244) +#define CLP_DV_REG_DATA_VAULT_ENTRY_0_6 (0x1001c248) +#define DV_REG_DATA_VAULT_ENTRY_0_6 (0x248) +#define CLP_DV_REG_DATA_VAULT_ENTRY_0_7 (0x1001c24c) +#define DV_REG_DATA_VAULT_ENTRY_0_7 (0x24c) +#define CLP_DV_REG_DATA_VAULT_ENTRY_0_8 (0x1001c250) +#define DV_REG_DATA_VAULT_ENTRY_0_8 (0x250) +#define CLP_DV_REG_DATA_VAULT_ENTRY_0_9 (0x1001c254) +#define DV_REG_DATA_VAULT_ENTRY_0_9 (0x254) +#define CLP_DV_REG_DATA_VAULT_ENTRY_0_10 (0x1001c258) +#define DV_REG_DATA_VAULT_ENTRY_0_10 (0x258) +#define CLP_DV_REG_DATA_VAULT_ENTRY_0_11 (0x1001c25c) +#define DV_REG_DATA_VAULT_ENTRY_0_11 (0x25c) +#define CLP_DV_REG_DATA_VAULT_ENTRY_1_0 (0x1001c260) +#define DV_REG_DATA_VAULT_ENTRY_1_0 (0x260) +#define CLP_DV_REG_DATA_VAULT_ENTRY_1_1 (0x1001c264) +#define DV_REG_DATA_VAULT_ENTRY_1_1 (0x264) +#define CLP_DV_REG_DATA_VAULT_ENTRY_1_2 (0x1001c268) +#define DV_REG_DATA_VAULT_ENTRY_1_2 (0x268) +#define CLP_DV_REG_DATA_VAULT_ENTRY_1_3 (0x1001c26c) +#define DV_REG_DATA_VAULT_ENTRY_1_3 (0x26c) +#define CLP_DV_REG_DATA_VAULT_ENTRY_1_4 (0x1001c270) +#define DV_REG_DATA_VAULT_ENTRY_1_4 (0x270) +#define CLP_DV_REG_DATA_VAULT_ENTRY_1_5 (0x1001c274) +#define DV_REG_DATA_VAULT_ENTRY_1_5 (0x274) +#define CLP_DV_REG_DATA_VAULT_ENTRY_1_6 (0x1001c278) +#define DV_REG_DATA_VAULT_ENTRY_1_6 (0x278) +#define CLP_DV_REG_DATA_VAULT_ENTRY_1_7 (0x1001c27c) +#define DV_REG_DATA_VAULT_ENTRY_1_7 (0x27c) +#define CLP_DV_REG_DATA_VAULT_ENTRY_1_8 (0x1001c280) +#define DV_REG_DATA_VAULT_ENTRY_1_8 (0x280) +#define CLP_DV_REG_DATA_VAULT_ENTRY_1_9 (0x1001c284) +#define DV_REG_DATA_VAULT_ENTRY_1_9 (0x284) +#define CLP_DV_REG_DATA_VAULT_ENTRY_1_10 (0x1001c288) +#define DV_REG_DATA_VAULT_ENTRY_1_10 (0x288) +#define CLP_DV_REG_DATA_VAULT_ENTRY_1_11 (0x1001c28c) +#define DV_REG_DATA_VAULT_ENTRY_1_11 (0x28c) +#define CLP_DV_REG_DATA_VAULT_ENTRY_2_0 (0x1001c290) +#define DV_REG_DATA_VAULT_ENTRY_2_0 (0x290) +#define CLP_DV_REG_DATA_VAULT_ENTRY_2_1 (0x1001c294) +#define DV_REG_DATA_VAULT_ENTRY_2_1 (0x294) +#define CLP_DV_REG_DATA_VAULT_ENTRY_2_2 (0x1001c298) +#define DV_REG_DATA_VAULT_ENTRY_2_2 (0x298) +#define CLP_DV_REG_DATA_VAULT_ENTRY_2_3 (0x1001c29c) +#define DV_REG_DATA_VAULT_ENTRY_2_3 (0x29c) +#define CLP_DV_REG_DATA_VAULT_ENTRY_2_4 (0x1001c2a0) +#define DV_REG_DATA_VAULT_ENTRY_2_4 (0x2a0) +#define CLP_DV_REG_DATA_VAULT_ENTRY_2_5 (0x1001c2a4) +#define DV_REG_DATA_VAULT_ENTRY_2_5 (0x2a4) +#define CLP_DV_REG_DATA_VAULT_ENTRY_2_6 (0x1001c2a8) +#define DV_REG_DATA_VAULT_ENTRY_2_6 (0x2a8) +#define CLP_DV_REG_DATA_VAULT_ENTRY_2_7 (0x1001c2ac) +#define DV_REG_DATA_VAULT_ENTRY_2_7 (0x2ac) +#define CLP_DV_REG_DATA_VAULT_ENTRY_2_8 (0x1001c2b0) +#define DV_REG_DATA_VAULT_ENTRY_2_8 (0x2b0) +#define CLP_DV_REG_DATA_VAULT_ENTRY_2_9 (0x1001c2b4) +#define DV_REG_DATA_VAULT_ENTRY_2_9 (0x2b4) +#define CLP_DV_REG_DATA_VAULT_ENTRY_2_10 (0x1001c2b8) +#define DV_REG_DATA_VAULT_ENTRY_2_10 (0x2b8) +#define CLP_DV_REG_DATA_VAULT_ENTRY_2_11 (0x1001c2bc) +#define DV_REG_DATA_VAULT_ENTRY_2_11 (0x2bc) +#define CLP_DV_REG_DATA_VAULT_ENTRY_3_0 (0x1001c2c0) +#define DV_REG_DATA_VAULT_ENTRY_3_0 (0x2c0) +#define CLP_DV_REG_DATA_VAULT_ENTRY_3_1 (0x1001c2c4) +#define DV_REG_DATA_VAULT_ENTRY_3_1 (0x2c4) +#define CLP_DV_REG_DATA_VAULT_ENTRY_3_2 (0x1001c2c8) +#define DV_REG_DATA_VAULT_ENTRY_3_2 (0x2c8) +#define CLP_DV_REG_DATA_VAULT_ENTRY_3_3 (0x1001c2cc) +#define DV_REG_DATA_VAULT_ENTRY_3_3 (0x2cc) +#define CLP_DV_REG_DATA_VAULT_ENTRY_3_4 (0x1001c2d0) +#define DV_REG_DATA_VAULT_ENTRY_3_4 (0x2d0) +#define CLP_DV_REG_DATA_VAULT_ENTRY_3_5 (0x1001c2d4) +#define DV_REG_DATA_VAULT_ENTRY_3_5 (0x2d4) +#define CLP_DV_REG_DATA_VAULT_ENTRY_3_6 (0x1001c2d8) +#define DV_REG_DATA_VAULT_ENTRY_3_6 (0x2d8) +#define CLP_DV_REG_DATA_VAULT_ENTRY_3_7 (0x1001c2dc) +#define DV_REG_DATA_VAULT_ENTRY_3_7 (0x2dc) +#define CLP_DV_REG_DATA_VAULT_ENTRY_3_8 (0x1001c2e0) +#define DV_REG_DATA_VAULT_ENTRY_3_8 (0x2e0) +#define CLP_DV_REG_DATA_VAULT_ENTRY_3_9 (0x1001c2e4) +#define DV_REG_DATA_VAULT_ENTRY_3_9 (0x2e4) +#define CLP_DV_REG_DATA_VAULT_ENTRY_3_10 (0x1001c2e8) +#define DV_REG_DATA_VAULT_ENTRY_3_10 (0x2e8) +#define CLP_DV_REG_DATA_VAULT_ENTRY_3_11 (0x1001c2ec) +#define DV_REG_DATA_VAULT_ENTRY_3_11 (0x2ec) +#define CLP_DV_REG_DATA_VAULT_ENTRY_4_0 (0x1001c2f0) +#define DV_REG_DATA_VAULT_ENTRY_4_0 (0x2f0) +#define CLP_DV_REG_DATA_VAULT_ENTRY_4_1 (0x1001c2f4) +#define DV_REG_DATA_VAULT_ENTRY_4_1 (0x2f4) +#define CLP_DV_REG_DATA_VAULT_ENTRY_4_2 (0x1001c2f8) +#define DV_REG_DATA_VAULT_ENTRY_4_2 (0x2f8) +#define CLP_DV_REG_DATA_VAULT_ENTRY_4_3 (0x1001c2fc) +#define DV_REG_DATA_VAULT_ENTRY_4_3 (0x2fc) +#define CLP_DV_REG_DATA_VAULT_ENTRY_4_4 (0x1001c300) +#define DV_REG_DATA_VAULT_ENTRY_4_4 (0x300) +#define CLP_DV_REG_DATA_VAULT_ENTRY_4_5 (0x1001c304) +#define DV_REG_DATA_VAULT_ENTRY_4_5 (0x304) +#define CLP_DV_REG_DATA_VAULT_ENTRY_4_6 (0x1001c308) +#define DV_REG_DATA_VAULT_ENTRY_4_6 (0x308) +#define CLP_DV_REG_DATA_VAULT_ENTRY_4_7 (0x1001c30c) +#define DV_REG_DATA_VAULT_ENTRY_4_7 (0x30c) +#define CLP_DV_REG_DATA_VAULT_ENTRY_4_8 (0x1001c310) +#define DV_REG_DATA_VAULT_ENTRY_4_8 (0x310) +#define CLP_DV_REG_DATA_VAULT_ENTRY_4_9 (0x1001c314) +#define DV_REG_DATA_VAULT_ENTRY_4_9 (0x314) +#define CLP_DV_REG_DATA_VAULT_ENTRY_4_10 (0x1001c318) +#define DV_REG_DATA_VAULT_ENTRY_4_10 (0x318) +#define CLP_DV_REG_DATA_VAULT_ENTRY_4_11 (0x1001c31c) +#define DV_REG_DATA_VAULT_ENTRY_4_11 (0x31c) +#define CLP_DV_REG_DATA_VAULT_ENTRY_5_0 (0x1001c320) +#define DV_REG_DATA_VAULT_ENTRY_5_0 (0x320) +#define CLP_DV_REG_DATA_VAULT_ENTRY_5_1 (0x1001c324) +#define DV_REG_DATA_VAULT_ENTRY_5_1 (0x324) +#define CLP_DV_REG_DATA_VAULT_ENTRY_5_2 (0x1001c328) +#define DV_REG_DATA_VAULT_ENTRY_5_2 (0x328) +#define CLP_DV_REG_DATA_VAULT_ENTRY_5_3 (0x1001c32c) +#define DV_REG_DATA_VAULT_ENTRY_5_3 (0x32c) +#define CLP_DV_REG_DATA_VAULT_ENTRY_5_4 (0x1001c330) +#define DV_REG_DATA_VAULT_ENTRY_5_4 (0x330) +#define CLP_DV_REG_DATA_VAULT_ENTRY_5_5 (0x1001c334) +#define DV_REG_DATA_VAULT_ENTRY_5_5 (0x334) +#define CLP_DV_REG_DATA_VAULT_ENTRY_5_6 (0x1001c338) +#define DV_REG_DATA_VAULT_ENTRY_5_6 (0x338) +#define CLP_DV_REG_DATA_VAULT_ENTRY_5_7 (0x1001c33c) +#define DV_REG_DATA_VAULT_ENTRY_5_7 (0x33c) +#define CLP_DV_REG_DATA_VAULT_ENTRY_5_8 (0x1001c340) +#define DV_REG_DATA_VAULT_ENTRY_5_8 (0x340) +#define CLP_DV_REG_DATA_VAULT_ENTRY_5_9 (0x1001c344) +#define DV_REG_DATA_VAULT_ENTRY_5_9 (0x344) +#define CLP_DV_REG_DATA_VAULT_ENTRY_5_10 (0x1001c348) +#define DV_REG_DATA_VAULT_ENTRY_5_10 (0x348) +#define CLP_DV_REG_DATA_VAULT_ENTRY_5_11 (0x1001c34c) +#define DV_REG_DATA_VAULT_ENTRY_5_11 (0x34c) +#define CLP_DV_REG_DATA_VAULT_ENTRY_6_0 (0x1001c350) +#define DV_REG_DATA_VAULT_ENTRY_6_0 (0x350) +#define CLP_DV_REG_DATA_VAULT_ENTRY_6_1 (0x1001c354) +#define DV_REG_DATA_VAULT_ENTRY_6_1 (0x354) +#define CLP_DV_REG_DATA_VAULT_ENTRY_6_2 (0x1001c358) +#define DV_REG_DATA_VAULT_ENTRY_6_2 (0x358) +#define CLP_DV_REG_DATA_VAULT_ENTRY_6_3 (0x1001c35c) +#define DV_REG_DATA_VAULT_ENTRY_6_3 (0x35c) +#define CLP_DV_REG_DATA_VAULT_ENTRY_6_4 (0x1001c360) +#define DV_REG_DATA_VAULT_ENTRY_6_4 (0x360) +#define CLP_DV_REG_DATA_VAULT_ENTRY_6_5 (0x1001c364) +#define DV_REG_DATA_VAULT_ENTRY_6_5 (0x364) +#define CLP_DV_REG_DATA_VAULT_ENTRY_6_6 (0x1001c368) +#define DV_REG_DATA_VAULT_ENTRY_6_6 (0x368) +#define CLP_DV_REG_DATA_VAULT_ENTRY_6_7 (0x1001c36c) +#define DV_REG_DATA_VAULT_ENTRY_6_7 (0x36c) +#define CLP_DV_REG_DATA_VAULT_ENTRY_6_8 (0x1001c370) +#define DV_REG_DATA_VAULT_ENTRY_6_8 (0x370) +#define CLP_DV_REG_DATA_VAULT_ENTRY_6_9 (0x1001c374) +#define DV_REG_DATA_VAULT_ENTRY_6_9 (0x374) +#define CLP_DV_REG_DATA_VAULT_ENTRY_6_10 (0x1001c378) +#define DV_REG_DATA_VAULT_ENTRY_6_10 (0x378) +#define CLP_DV_REG_DATA_VAULT_ENTRY_6_11 (0x1001c37c) +#define DV_REG_DATA_VAULT_ENTRY_6_11 (0x37c) +#define CLP_DV_REG_DATA_VAULT_ENTRY_7_0 (0x1001c380) +#define DV_REG_DATA_VAULT_ENTRY_7_0 (0x380) +#define CLP_DV_REG_DATA_VAULT_ENTRY_7_1 (0x1001c384) +#define DV_REG_DATA_VAULT_ENTRY_7_1 (0x384) +#define CLP_DV_REG_DATA_VAULT_ENTRY_7_2 (0x1001c388) +#define DV_REG_DATA_VAULT_ENTRY_7_2 (0x388) +#define CLP_DV_REG_DATA_VAULT_ENTRY_7_3 (0x1001c38c) +#define DV_REG_DATA_VAULT_ENTRY_7_3 (0x38c) +#define CLP_DV_REG_DATA_VAULT_ENTRY_7_4 (0x1001c390) +#define DV_REG_DATA_VAULT_ENTRY_7_4 (0x390) +#define CLP_DV_REG_DATA_VAULT_ENTRY_7_5 (0x1001c394) +#define DV_REG_DATA_VAULT_ENTRY_7_5 (0x394) +#define CLP_DV_REG_DATA_VAULT_ENTRY_7_6 (0x1001c398) +#define DV_REG_DATA_VAULT_ENTRY_7_6 (0x398) +#define CLP_DV_REG_DATA_VAULT_ENTRY_7_7 (0x1001c39c) +#define DV_REG_DATA_VAULT_ENTRY_7_7 (0x39c) +#define CLP_DV_REG_DATA_VAULT_ENTRY_7_8 (0x1001c3a0) +#define DV_REG_DATA_VAULT_ENTRY_7_8 (0x3a0) +#define CLP_DV_REG_DATA_VAULT_ENTRY_7_9 (0x1001c3a4) +#define DV_REG_DATA_VAULT_ENTRY_7_9 (0x3a4) +#define CLP_DV_REG_DATA_VAULT_ENTRY_7_10 (0x1001c3a8) +#define DV_REG_DATA_VAULT_ENTRY_7_10 (0x3a8) +#define CLP_DV_REG_DATA_VAULT_ENTRY_7_11 (0x1001c3ac) +#define DV_REG_DATA_VAULT_ENTRY_7_11 (0x3ac) +#define CLP_DV_REG_DATA_VAULT_ENTRY_8_0 (0x1001c3b0) +#define DV_REG_DATA_VAULT_ENTRY_8_0 (0x3b0) +#define CLP_DV_REG_DATA_VAULT_ENTRY_8_1 (0x1001c3b4) +#define DV_REG_DATA_VAULT_ENTRY_8_1 (0x3b4) +#define CLP_DV_REG_DATA_VAULT_ENTRY_8_2 (0x1001c3b8) +#define DV_REG_DATA_VAULT_ENTRY_8_2 (0x3b8) +#define CLP_DV_REG_DATA_VAULT_ENTRY_8_3 (0x1001c3bc) +#define DV_REG_DATA_VAULT_ENTRY_8_3 (0x3bc) +#define CLP_DV_REG_DATA_VAULT_ENTRY_8_4 (0x1001c3c0) +#define DV_REG_DATA_VAULT_ENTRY_8_4 (0x3c0) +#define CLP_DV_REG_DATA_VAULT_ENTRY_8_5 (0x1001c3c4) +#define DV_REG_DATA_VAULT_ENTRY_8_5 (0x3c4) +#define CLP_DV_REG_DATA_VAULT_ENTRY_8_6 (0x1001c3c8) +#define DV_REG_DATA_VAULT_ENTRY_8_6 (0x3c8) +#define CLP_DV_REG_DATA_VAULT_ENTRY_8_7 (0x1001c3cc) +#define DV_REG_DATA_VAULT_ENTRY_8_7 (0x3cc) +#define CLP_DV_REG_DATA_VAULT_ENTRY_8_8 (0x1001c3d0) +#define DV_REG_DATA_VAULT_ENTRY_8_8 (0x3d0) +#define CLP_DV_REG_DATA_VAULT_ENTRY_8_9 (0x1001c3d4) +#define DV_REG_DATA_VAULT_ENTRY_8_9 (0x3d4) +#define CLP_DV_REG_DATA_VAULT_ENTRY_8_10 (0x1001c3d8) +#define DV_REG_DATA_VAULT_ENTRY_8_10 (0x3d8) +#define CLP_DV_REG_DATA_VAULT_ENTRY_8_11 (0x1001c3dc) +#define DV_REG_DATA_VAULT_ENTRY_8_11 (0x3dc) +#define CLP_DV_REG_DATA_VAULT_ENTRY_9_0 (0x1001c3e0) +#define DV_REG_DATA_VAULT_ENTRY_9_0 (0x3e0) +#define CLP_DV_REG_DATA_VAULT_ENTRY_9_1 (0x1001c3e4) +#define DV_REG_DATA_VAULT_ENTRY_9_1 (0x3e4) +#define CLP_DV_REG_DATA_VAULT_ENTRY_9_2 (0x1001c3e8) +#define DV_REG_DATA_VAULT_ENTRY_9_2 (0x3e8) +#define CLP_DV_REG_DATA_VAULT_ENTRY_9_3 (0x1001c3ec) +#define DV_REG_DATA_VAULT_ENTRY_9_3 (0x3ec) +#define CLP_DV_REG_DATA_VAULT_ENTRY_9_4 (0x1001c3f0) +#define DV_REG_DATA_VAULT_ENTRY_9_4 (0x3f0) +#define CLP_DV_REG_DATA_VAULT_ENTRY_9_5 (0x1001c3f4) +#define DV_REG_DATA_VAULT_ENTRY_9_5 (0x3f4) +#define CLP_DV_REG_DATA_VAULT_ENTRY_9_6 (0x1001c3f8) +#define DV_REG_DATA_VAULT_ENTRY_9_6 (0x3f8) +#define CLP_DV_REG_DATA_VAULT_ENTRY_9_7 (0x1001c3fc) +#define DV_REG_DATA_VAULT_ENTRY_9_7 (0x3fc) +#define CLP_DV_REG_DATA_VAULT_ENTRY_9_8 (0x1001c400) +#define DV_REG_DATA_VAULT_ENTRY_9_8 (0x400) +#define CLP_DV_REG_DATA_VAULT_ENTRY_9_9 (0x1001c404) +#define DV_REG_DATA_VAULT_ENTRY_9_9 (0x404) +#define CLP_DV_REG_DATA_VAULT_ENTRY_9_10 (0x1001c408) +#define DV_REG_DATA_VAULT_ENTRY_9_10 (0x408) +#define CLP_DV_REG_DATA_VAULT_ENTRY_9_11 (0x1001c40c) +#define DV_REG_DATA_VAULT_ENTRY_9_11 (0x40c) +#define CLP_DV_REG_LOCKABLESCRATCHREGCTRL_0 (0x1001c410) +#define DV_REG_LOCKABLESCRATCHREGCTRL_0 (0x410) +#define DV_REG_LOCKABLESCRATCHREGCTRL_0_LOCK_ENTRY_LOW (0) +#define DV_REG_LOCKABLESCRATCHREGCTRL_0_LOCK_ENTRY_MASK (0x1) +#define CLP_DV_REG_LOCKABLESCRATCHREGCTRL_1 (0x1001c414) +#define DV_REG_LOCKABLESCRATCHREGCTRL_1 (0x414) +#define DV_REG_LOCKABLESCRATCHREGCTRL_1_LOCK_ENTRY_LOW (0) +#define DV_REG_LOCKABLESCRATCHREGCTRL_1_LOCK_ENTRY_MASK (0x1) +#define CLP_DV_REG_LOCKABLESCRATCHREGCTRL_2 (0x1001c418) +#define DV_REG_LOCKABLESCRATCHREGCTRL_2 (0x418) +#define DV_REG_LOCKABLESCRATCHREGCTRL_2_LOCK_ENTRY_LOW (0) +#define DV_REG_LOCKABLESCRATCHREGCTRL_2_LOCK_ENTRY_MASK (0x1) +#define CLP_DV_REG_LOCKABLESCRATCHREGCTRL_3 (0x1001c41c) +#define DV_REG_LOCKABLESCRATCHREGCTRL_3 (0x41c) +#define DV_REG_LOCKABLESCRATCHREGCTRL_3_LOCK_ENTRY_LOW (0) +#define DV_REG_LOCKABLESCRATCHREGCTRL_3_LOCK_ENTRY_MASK (0x1) +#define CLP_DV_REG_LOCKABLESCRATCHREGCTRL_4 (0x1001c420) +#define DV_REG_LOCKABLESCRATCHREGCTRL_4 (0x420) +#define DV_REG_LOCKABLESCRATCHREGCTRL_4_LOCK_ENTRY_LOW (0) +#define DV_REG_LOCKABLESCRATCHREGCTRL_4_LOCK_ENTRY_MASK (0x1) +#define CLP_DV_REG_LOCKABLESCRATCHREGCTRL_5 (0x1001c424) +#define DV_REG_LOCKABLESCRATCHREGCTRL_5 (0x424) +#define DV_REG_LOCKABLESCRATCHREGCTRL_5_LOCK_ENTRY_LOW (0) +#define DV_REG_LOCKABLESCRATCHREGCTRL_5_LOCK_ENTRY_MASK (0x1) +#define CLP_DV_REG_LOCKABLESCRATCHREGCTRL_6 (0x1001c428) +#define DV_REG_LOCKABLESCRATCHREGCTRL_6 (0x428) +#define DV_REG_LOCKABLESCRATCHREGCTRL_6_LOCK_ENTRY_LOW (0) +#define DV_REG_LOCKABLESCRATCHREGCTRL_6_LOCK_ENTRY_MASK (0x1) +#define CLP_DV_REG_LOCKABLESCRATCHREGCTRL_7 (0x1001c42c) +#define DV_REG_LOCKABLESCRATCHREGCTRL_7 (0x42c) +#define DV_REG_LOCKABLESCRATCHREGCTRL_7_LOCK_ENTRY_LOW (0) +#define DV_REG_LOCKABLESCRATCHREGCTRL_7_LOCK_ENTRY_MASK (0x1) +#define CLP_DV_REG_LOCKABLESCRATCHREGCTRL_8 (0x1001c430) +#define DV_REG_LOCKABLESCRATCHREGCTRL_8 (0x430) +#define DV_REG_LOCKABLESCRATCHREGCTRL_8_LOCK_ENTRY_LOW (0) +#define DV_REG_LOCKABLESCRATCHREGCTRL_8_LOCK_ENTRY_MASK (0x1) +#define CLP_DV_REG_LOCKABLESCRATCHREGCTRL_9 (0x1001c434) +#define DV_REG_LOCKABLESCRATCHREGCTRL_9 (0x434) +#define DV_REG_LOCKABLESCRATCHREGCTRL_9_LOCK_ENTRY_LOW (0) +#define DV_REG_LOCKABLESCRATCHREGCTRL_9_LOCK_ENTRY_MASK (0x1) +#define CLP_DV_REG_LOCKABLESCRATCHREG_0 (0x1001c438) +#define DV_REG_LOCKABLESCRATCHREG_0 (0x438) +#define CLP_DV_REG_LOCKABLESCRATCHREG_1 (0x1001c43c) +#define DV_REG_LOCKABLESCRATCHREG_1 (0x43c) +#define CLP_DV_REG_LOCKABLESCRATCHREG_2 (0x1001c440) +#define DV_REG_LOCKABLESCRATCHREG_2 (0x440) +#define CLP_DV_REG_LOCKABLESCRATCHREG_3 (0x1001c444) +#define DV_REG_LOCKABLESCRATCHREG_3 (0x444) +#define CLP_DV_REG_LOCKABLESCRATCHREG_4 (0x1001c448) +#define DV_REG_LOCKABLESCRATCHREG_4 (0x448) +#define CLP_DV_REG_LOCKABLESCRATCHREG_5 (0x1001c44c) +#define DV_REG_LOCKABLESCRATCHREG_5 (0x44c) +#define CLP_DV_REG_LOCKABLESCRATCHREG_6 (0x1001c450) +#define DV_REG_LOCKABLESCRATCHREG_6 (0x450) +#define CLP_DV_REG_LOCKABLESCRATCHREG_7 (0x1001c454) +#define DV_REG_LOCKABLESCRATCHREG_7 (0x454) +#define CLP_DV_REG_LOCKABLESCRATCHREG_8 (0x1001c458) +#define DV_REG_LOCKABLESCRATCHREG_8 (0x458) +#define CLP_DV_REG_LOCKABLESCRATCHREG_9 (0x1001c45c) +#define DV_REG_LOCKABLESCRATCHREG_9 (0x45c) #define CLP_DV_REG_NONSTICKYGENERICSCRATCHREG_0 (0x1001c460) #define DV_REG_NONSTICKYGENERICSCRATCHREG_0 (0x460) #define CLP_DV_REG_NONSTICKYGENERICSCRATCHREG_1 (0x1001c464) @@ -4052,42 +4053,56 @@ #define SHA512_REG_SHA512_KV_WR_STATUS_VALID_MASK (0x2) #define SHA512_REG_SHA512_KV_WR_STATUS_ERROR_LOW (2) #define SHA512_REG_SHA512_KV_WR_STATUS_ERROR_MASK (0x3fc) -#define CLP_SHA512_REG_SHA512_GEN_PCR_HASH_NONCE (0x10020610) -#define SHA512_REG_SHA512_GEN_PCR_HASH_NONCE (0x610) -#define CLP_SHA512_REG_SHA512_GEN_PCR_HASH_CTRL (0x10020614) -#define SHA512_REG_SHA512_GEN_PCR_HASH_CTRL (0x614) +#define CLP_SHA512_REG_SHA512_GEN_PCR_HASH_NONCE_0 (0x10020610) +#define SHA512_REG_SHA512_GEN_PCR_HASH_NONCE_0 (0x610) +#define CLP_SHA512_REG_SHA512_GEN_PCR_HASH_NONCE_1 (0x10020614) +#define SHA512_REG_SHA512_GEN_PCR_HASH_NONCE_1 (0x614) +#define CLP_SHA512_REG_SHA512_GEN_PCR_HASH_NONCE_2 (0x10020618) +#define SHA512_REG_SHA512_GEN_PCR_HASH_NONCE_2 (0x618) +#define CLP_SHA512_REG_SHA512_GEN_PCR_HASH_NONCE_3 (0x1002061c) +#define SHA512_REG_SHA512_GEN_PCR_HASH_NONCE_3 (0x61c) +#define CLP_SHA512_REG_SHA512_GEN_PCR_HASH_NONCE_4 (0x10020620) +#define SHA512_REG_SHA512_GEN_PCR_HASH_NONCE_4 (0x620) +#define CLP_SHA512_REG_SHA512_GEN_PCR_HASH_NONCE_5 (0x10020624) +#define SHA512_REG_SHA512_GEN_PCR_HASH_NONCE_5 (0x624) +#define CLP_SHA512_REG_SHA512_GEN_PCR_HASH_NONCE_6 (0x10020628) +#define SHA512_REG_SHA512_GEN_PCR_HASH_NONCE_6 (0x628) +#define CLP_SHA512_REG_SHA512_GEN_PCR_HASH_NONCE_7 (0x1002062c) +#define SHA512_REG_SHA512_GEN_PCR_HASH_NONCE_7 (0x62c) +#define CLP_SHA512_REG_SHA512_GEN_PCR_HASH_CTRL (0x10020630) +#define SHA512_REG_SHA512_GEN_PCR_HASH_CTRL (0x630) #define SHA512_REG_SHA512_GEN_PCR_HASH_CTRL_START_LOW (0) #define SHA512_REG_SHA512_GEN_PCR_HASH_CTRL_START_MASK (0x1) -#define CLP_SHA512_REG_SHA512_GEN_PCR_HASH_STATUS (0x10020618) -#define SHA512_REG_SHA512_GEN_PCR_HASH_STATUS (0x618) +#define CLP_SHA512_REG_SHA512_GEN_PCR_HASH_STATUS (0x10020634) +#define SHA512_REG_SHA512_GEN_PCR_HASH_STATUS (0x634) #define SHA512_REG_SHA512_GEN_PCR_HASH_STATUS_READY_LOW (0) #define SHA512_REG_SHA512_GEN_PCR_HASH_STATUS_READY_MASK (0x1) #define SHA512_REG_SHA512_GEN_PCR_HASH_STATUS_VALID_LOW (1) #define SHA512_REG_SHA512_GEN_PCR_HASH_STATUS_VALID_MASK (0x2) -#define CLP_SHA512_REG_SHA512_GEN_PCR_HASH_DIGEST_0 (0x1002061c) -#define SHA512_REG_SHA512_GEN_PCR_HASH_DIGEST_0 (0x61c) -#define CLP_SHA512_REG_SHA512_GEN_PCR_HASH_DIGEST_1 (0x10020620) -#define SHA512_REG_SHA512_GEN_PCR_HASH_DIGEST_1 (0x620) -#define CLP_SHA512_REG_SHA512_GEN_PCR_HASH_DIGEST_2 (0x10020624) -#define SHA512_REG_SHA512_GEN_PCR_HASH_DIGEST_2 (0x624) -#define CLP_SHA512_REG_SHA512_GEN_PCR_HASH_DIGEST_3 (0x10020628) -#define SHA512_REG_SHA512_GEN_PCR_HASH_DIGEST_3 (0x628) -#define CLP_SHA512_REG_SHA512_GEN_PCR_HASH_DIGEST_4 (0x1002062c) -#define SHA512_REG_SHA512_GEN_PCR_HASH_DIGEST_4 (0x62c) -#define CLP_SHA512_REG_SHA512_GEN_PCR_HASH_DIGEST_5 (0x10020630) -#define SHA512_REG_SHA512_GEN_PCR_HASH_DIGEST_5 (0x630) -#define CLP_SHA512_REG_SHA512_GEN_PCR_HASH_DIGEST_6 (0x10020634) -#define SHA512_REG_SHA512_GEN_PCR_HASH_DIGEST_6 (0x634) -#define CLP_SHA512_REG_SHA512_GEN_PCR_HASH_DIGEST_7 (0x10020638) -#define SHA512_REG_SHA512_GEN_PCR_HASH_DIGEST_7 (0x638) -#define CLP_SHA512_REG_SHA512_GEN_PCR_HASH_DIGEST_8 (0x1002063c) -#define SHA512_REG_SHA512_GEN_PCR_HASH_DIGEST_8 (0x63c) -#define CLP_SHA512_REG_SHA512_GEN_PCR_HASH_DIGEST_9 (0x10020640) -#define SHA512_REG_SHA512_GEN_PCR_HASH_DIGEST_9 (0x640) -#define CLP_SHA512_REG_SHA512_GEN_PCR_HASH_DIGEST_10 (0x10020644) -#define SHA512_REG_SHA512_GEN_PCR_HASH_DIGEST_10 (0x644) -#define CLP_SHA512_REG_SHA512_GEN_PCR_HASH_DIGEST_11 (0x10020648) -#define SHA512_REG_SHA512_GEN_PCR_HASH_DIGEST_11 (0x648) +#define CLP_SHA512_REG_SHA512_GEN_PCR_HASH_DIGEST_0 (0x10020638) +#define SHA512_REG_SHA512_GEN_PCR_HASH_DIGEST_0 (0x638) +#define CLP_SHA512_REG_SHA512_GEN_PCR_HASH_DIGEST_1 (0x1002063c) +#define SHA512_REG_SHA512_GEN_PCR_HASH_DIGEST_1 (0x63c) +#define CLP_SHA512_REG_SHA512_GEN_PCR_HASH_DIGEST_2 (0x10020640) +#define SHA512_REG_SHA512_GEN_PCR_HASH_DIGEST_2 (0x640) +#define CLP_SHA512_REG_SHA512_GEN_PCR_HASH_DIGEST_3 (0x10020644) +#define SHA512_REG_SHA512_GEN_PCR_HASH_DIGEST_3 (0x644) +#define CLP_SHA512_REG_SHA512_GEN_PCR_HASH_DIGEST_4 (0x10020648) +#define SHA512_REG_SHA512_GEN_PCR_HASH_DIGEST_4 (0x648) +#define CLP_SHA512_REG_SHA512_GEN_PCR_HASH_DIGEST_5 (0x1002064c) +#define SHA512_REG_SHA512_GEN_PCR_HASH_DIGEST_5 (0x64c) +#define CLP_SHA512_REG_SHA512_GEN_PCR_HASH_DIGEST_6 (0x10020650) +#define SHA512_REG_SHA512_GEN_PCR_HASH_DIGEST_6 (0x650) +#define CLP_SHA512_REG_SHA512_GEN_PCR_HASH_DIGEST_7 (0x10020654) +#define SHA512_REG_SHA512_GEN_PCR_HASH_DIGEST_7 (0x654) +#define CLP_SHA512_REG_SHA512_GEN_PCR_HASH_DIGEST_8 (0x10020658) +#define SHA512_REG_SHA512_GEN_PCR_HASH_DIGEST_8 (0x658) +#define CLP_SHA512_REG_SHA512_GEN_PCR_HASH_DIGEST_9 (0x1002065c) +#define SHA512_REG_SHA512_GEN_PCR_HASH_DIGEST_9 (0x65c) +#define CLP_SHA512_REG_SHA512_GEN_PCR_HASH_DIGEST_10 (0x10020660) +#define SHA512_REG_SHA512_GEN_PCR_HASH_DIGEST_10 (0x660) +#define CLP_SHA512_REG_SHA512_GEN_PCR_HASH_DIGEST_11 (0x10020664) +#define SHA512_REG_SHA512_GEN_PCR_HASH_DIGEST_11 (0x664) #define CLP_SHA512_REG_INTR_BLOCK_RF_START (0x10020800) #define CLP_SHA512_REG_INTR_BLOCK_RF_GLOBAL_INTR_EN_R (0x10020800) #define SHA512_REG_INTR_BLOCK_RF_GLOBAL_INTR_EN_R (0x800) @@ -4335,6 +4350,292 @@ #define SHA256_REG_INTR_BLOCK_RF_NOTIF_CMD_DONE_INTR_COUNT_INCR_R (0xa10) #define SHA256_REG_INTR_BLOCK_RF_NOTIF_CMD_DONE_INTR_COUNT_INCR_R_PULSE_LOW (0) #define SHA256_REG_INTR_BLOCK_RF_NOTIF_CMD_DONE_INTR_COUNT_INCR_R_PULSE_MASK (0x1) +#define CLP_SPI_HOST_REG_BASE_ADDR (0x20000000) +#define CLP_SPI_HOST_REG_INTERRUPT_STATE (0x20000000) +#define SPI_HOST_REG_INTERRUPT_STATE (0x0) +#define SPI_HOST_REG_INTERRUPT_STATE_ERROR_LOW (0) +#define SPI_HOST_REG_INTERRUPT_STATE_ERROR_MASK (0x1) +#define SPI_HOST_REG_INTERRUPT_STATE_SPI_EVENT_LOW (1) +#define SPI_HOST_REG_INTERRUPT_STATE_SPI_EVENT_MASK (0x2) +#define CLP_SPI_HOST_REG_INTERRUPT_ENABLE (0x20000004) +#define SPI_HOST_REG_INTERRUPT_ENABLE (0x4) +#define SPI_HOST_REG_INTERRUPT_ENABLE_ERROR_LOW (0) +#define SPI_HOST_REG_INTERRUPT_ENABLE_ERROR_MASK (0x1) +#define SPI_HOST_REG_INTERRUPT_ENABLE_SPI_EVENT_LOW (1) +#define SPI_HOST_REG_INTERRUPT_ENABLE_SPI_EVENT_MASK (0x2) +#define CLP_SPI_HOST_REG_INTERRUPT_TEST (0x20000008) +#define SPI_HOST_REG_INTERRUPT_TEST (0x8) +#define SPI_HOST_REG_INTERRUPT_TEST_ERROR_LOW (0) +#define SPI_HOST_REG_INTERRUPT_TEST_ERROR_MASK (0x1) +#define SPI_HOST_REG_INTERRUPT_TEST_SPI_EVENT_LOW (1) +#define SPI_HOST_REG_INTERRUPT_TEST_SPI_EVENT_MASK (0x2) +#define CLP_SPI_HOST_REG_ALERT_TEST (0x2000000c) +#define SPI_HOST_REG_ALERT_TEST (0xc) +#define SPI_HOST_REG_ALERT_TEST_FATAL_FAULT_LOW (0) +#define SPI_HOST_REG_ALERT_TEST_FATAL_FAULT_MASK (0x1) +#define CLP_SPI_HOST_REG_CONTROL (0x20000010) +#define SPI_HOST_REG_CONTROL (0x10) +#define SPI_HOST_REG_CONTROL_RX_WATERMARK_LOW (0) +#define SPI_HOST_REG_CONTROL_RX_WATERMARK_MASK (0xff) +#define SPI_HOST_REG_CONTROL_TX_WATERMARK_LOW (8) +#define SPI_HOST_REG_CONTROL_TX_WATERMARK_MASK (0xff00) +#define SPI_HOST_REG_CONTROL_OUTPUT_EN_LOW (29) +#define SPI_HOST_REG_CONTROL_OUTPUT_EN_MASK (0x20000000) +#define SPI_HOST_REG_CONTROL_SW_RST_LOW (30) +#define SPI_HOST_REG_CONTROL_SW_RST_MASK (0x40000000) +#define SPI_HOST_REG_CONTROL_SPIEN_LOW (31) +#define SPI_HOST_REG_CONTROL_SPIEN_MASK (0x80000000) +#define CLP_SPI_HOST_REG_STATUS (0x20000014) +#define SPI_HOST_REG_STATUS (0x14) +#define SPI_HOST_REG_STATUS_TXQD_LOW (0) +#define SPI_HOST_REG_STATUS_TXQD_MASK (0xff) +#define SPI_HOST_REG_STATUS_RXQD_LOW (8) +#define SPI_HOST_REG_STATUS_RXQD_MASK (0xff00) +#define SPI_HOST_REG_STATUS_CMDQD_LOW (16) +#define SPI_HOST_REG_STATUS_CMDQD_MASK (0xf0000) +#define SPI_HOST_REG_STATUS_RXWM_LOW (20) +#define SPI_HOST_REG_STATUS_RXWM_MASK (0x100000) +#define SPI_HOST_REG_STATUS_BYTEORDER_LOW (22) +#define SPI_HOST_REG_STATUS_BYTEORDER_MASK (0x400000) +#define SPI_HOST_REG_STATUS_RXSTALL_LOW (23) +#define SPI_HOST_REG_STATUS_RXSTALL_MASK (0x800000) +#define SPI_HOST_REG_STATUS_RXEMPTY_LOW (24) +#define SPI_HOST_REG_STATUS_RXEMPTY_MASK (0x1000000) +#define SPI_HOST_REG_STATUS_RXFULL_LOW (25) +#define SPI_HOST_REG_STATUS_RXFULL_MASK (0x2000000) +#define SPI_HOST_REG_STATUS_TXWM_LOW (26) +#define SPI_HOST_REG_STATUS_TXWM_MASK (0x4000000) +#define SPI_HOST_REG_STATUS_TXSTALL_LOW (27) +#define SPI_HOST_REG_STATUS_TXSTALL_MASK (0x8000000) +#define SPI_HOST_REG_STATUS_TXEMPTY_LOW (28) +#define SPI_HOST_REG_STATUS_TXEMPTY_MASK (0x10000000) +#define SPI_HOST_REG_STATUS_TXFULL_LOW (29) +#define SPI_HOST_REG_STATUS_TXFULL_MASK (0x20000000) +#define SPI_HOST_REG_STATUS_ACTIVE_LOW (30) +#define SPI_HOST_REG_STATUS_ACTIVE_MASK (0x40000000) +#define SPI_HOST_REG_STATUS_READY_LOW (31) +#define SPI_HOST_REG_STATUS_READY_MASK (0x80000000) +#define CLP_SPI_HOST_REG_CONFIGOPTS_0 (0x20000018) +#define SPI_HOST_REG_CONFIGOPTS_0 (0x18) +#define SPI_HOST_REG_CONFIGOPTS_0_CLKDIV_LOW (0) +#define SPI_HOST_REG_CONFIGOPTS_0_CLKDIV_MASK (0xffff) +#define SPI_HOST_REG_CONFIGOPTS_0_CSNIDLE_LOW (16) +#define SPI_HOST_REG_CONFIGOPTS_0_CSNIDLE_MASK (0xf0000) +#define SPI_HOST_REG_CONFIGOPTS_0_CSNTRAIL_LOW (20) +#define SPI_HOST_REG_CONFIGOPTS_0_CSNTRAIL_MASK (0xf00000) +#define SPI_HOST_REG_CONFIGOPTS_0_CSNLEAD_LOW (24) +#define SPI_HOST_REG_CONFIGOPTS_0_CSNLEAD_MASK (0xf000000) +#define SPI_HOST_REG_CONFIGOPTS_0_FULLCYC_LOW (29) +#define SPI_HOST_REG_CONFIGOPTS_0_FULLCYC_MASK (0x20000000) +#define SPI_HOST_REG_CONFIGOPTS_0_CPHA_LOW (30) +#define SPI_HOST_REG_CONFIGOPTS_0_CPHA_MASK (0x40000000) +#define SPI_HOST_REG_CONFIGOPTS_0_CPOL_LOW (31) +#define SPI_HOST_REG_CONFIGOPTS_0_CPOL_MASK (0x80000000) +#define CLP_SPI_HOST_REG_CONFIGOPTS_1 (0x2000001c) +#define SPI_HOST_REG_CONFIGOPTS_1 (0x1c) +#define SPI_HOST_REG_CONFIGOPTS_1_CLKDIV_LOW (0) +#define SPI_HOST_REG_CONFIGOPTS_1_CLKDIV_MASK (0xffff) +#define SPI_HOST_REG_CONFIGOPTS_1_CSNIDLE_LOW (16) +#define SPI_HOST_REG_CONFIGOPTS_1_CSNIDLE_MASK (0xf0000) +#define SPI_HOST_REG_CONFIGOPTS_1_CSNTRAIL_LOW (20) +#define SPI_HOST_REG_CONFIGOPTS_1_CSNTRAIL_MASK (0xf00000) +#define SPI_HOST_REG_CONFIGOPTS_1_CSNLEAD_LOW (24) +#define SPI_HOST_REG_CONFIGOPTS_1_CSNLEAD_MASK (0xf000000) +#define SPI_HOST_REG_CONFIGOPTS_1_FULLCYC_LOW (29) +#define SPI_HOST_REG_CONFIGOPTS_1_FULLCYC_MASK (0x20000000) +#define SPI_HOST_REG_CONFIGOPTS_1_CPHA_LOW (30) +#define SPI_HOST_REG_CONFIGOPTS_1_CPHA_MASK (0x40000000) +#define SPI_HOST_REG_CONFIGOPTS_1_CPOL_LOW (31) +#define SPI_HOST_REG_CONFIGOPTS_1_CPOL_MASK (0x80000000) +#define CLP_SPI_HOST_REG_CSID (0x20000020) +#define SPI_HOST_REG_CSID (0x20) +#define CLP_SPI_HOST_REG_COMMAND (0x20000024) +#define SPI_HOST_REG_COMMAND (0x24) +#define SPI_HOST_REG_COMMAND_LEN_LOW (0) +#define SPI_HOST_REG_COMMAND_LEN_MASK (0x1ff) +#define SPI_HOST_REG_COMMAND_CSAAT_LOW (9) +#define SPI_HOST_REG_COMMAND_CSAAT_MASK (0x200) +#define SPI_HOST_REG_COMMAND_SPEED_LOW (10) +#define SPI_HOST_REG_COMMAND_SPEED_MASK (0xc00) +#define SPI_HOST_REG_COMMAND_DIRECTION_LOW (12) +#define SPI_HOST_REG_COMMAND_DIRECTION_MASK (0x3000) +#define CLP_SPI_HOST_REG_RXDATA (0x20000028) +#define SPI_HOST_REG_RXDATA (0x28) +#define CLP_SPI_HOST_REG_TXDATA (0x2000002c) +#define SPI_HOST_REG_TXDATA (0x2c) +#define CLP_SPI_HOST_REG_ERROR_ENABLE (0x20000030) +#define SPI_HOST_REG_ERROR_ENABLE (0x30) +#define SPI_HOST_REG_ERROR_ENABLE_CMDBUSY_LOW (0) +#define SPI_HOST_REG_ERROR_ENABLE_CMDBUSY_MASK (0x1) +#define SPI_HOST_REG_ERROR_ENABLE_OVERFLOW_LOW (1) +#define SPI_HOST_REG_ERROR_ENABLE_OVERFLOW_MASK (0x2) +#define SPI_HOST_REG_ERROR_ENABLE_UNDERFLOW_LOW (2) +#define SPI_HOST_REG_ERROR_ENABLE_UNDERFLOW_MASK (0x4) +#define SPI_HOST_REG_ERROR_ENABLE_CMDINVAL_LOW (3) +#define SPI_HOST_REG_ERROR_ENABLE_CMDINVAL_MASK (0x8) +#define SPI_HOST_REG_ERROR_ENABLE_CSIDINVAL_LOW (4) +#define SPI_HOST_REG_ERROR_ENABLE_CSIDINVAL_MASK (0x10) +#define CLP_SPI_HOST_REG_ERROR_STATUS (0x20000034) +#define SPI_HOST_REG_ERROR_STATUS (0x34) +#define SPI_HOST_REG_ERROR_STATUS_CMDBUSY_LOW (0) +#define SPI_HOST_REG_ERROR_STATUS_CMDBUSY_MASK (0x1) +#define SPI_HOST_REG_ERROR_STATUS_OVERFLOW_LOW (1) +#define SPI_HOST_REG_ERROR_STATUS_OVERFLOW_MASK (0x2) +#define SPI_HOST_REG_ERROR_STATUS_UNDERFLOW_LOW (2) +#define SPI_HOST_REG_ERROR_STATUS_UNDERFLOW_MASK (0x4) +#define SPI_HOST_REG_ERROR_STATUS_CMDINVAL_LOW (3) +#define SPI_HOST_REG_ERROR_STATUS_CMDINVAL_MASK (0x8) +#define SPI_HOST_REG_ERROR_STATUS_CSIDINVAL_LOW (4) +#define SPI_HOST_REG_ERROR_STATUS_CSIDINVAL_MASK (0x10) +#define SPI_HOST_REG_ERROR_STATUS_ACCESSINVAL_LOW (5) +#define SPI_HOST_REG_ERROR_STATUS_ACCESSINVAL_MASK (0x20) +#define CLP_SPI_HOST_REG_EVENT_ENABLE (0x20000038) +#define SPI_HOST_REG_EVENT_ENABLE (0x38) +#define SPI_HOST_REG_EVENT_ENABLE_RXFULL_LOW (0) +#define SPI_HOST_REG_EVENT_ENABLE_RXFULL_MASK (0x1) +#define SPI_HOST_REG_EVENT_ENABLE_TXEMPTY_LOW (1) +#define SPI_HOST_REG_EVENT_ENABLE_TXEMPTY_MASK (0x2) +#define SPI_HOST_REG_EVENT_ENABLE_RXWM_LOW (2) +#define SPI_HOST_REG_EVENT_ENABLE_RXWM_MASK (0x4) +#define SPI_HOST_REG_EVENT_ENABLE_TXWM_LOW (3) +#define SPI_HOST_REG_EVENT_ENABLE_TXWM_MASK (0x8) +#define SPI_HOST_REG_EVENT_ENABLE_READY_LOW (4) +#define SPI_HOST_REG_EVENT_ENABLE_READY_MASK (0x10) +#define SPI_HOST_REG_EVENT_ENABLE_IDLE_LOW (5) +#define SPI_HOST_REG_EVENT_ENABLE_IDLE_MASK (0x20) +#define CLP_UART_BASE_ADDR (0x20001000) +#define CLP_UART_INTERRUPT_STATE (0x20001000) +#define UART_INTERRUPT_STATE (0x0) +#define UART_INTERRUPT_STATE_TX_WATERMARK_LOW (0) +#define UART_INTERRUPT_STATE_TX_WATERMARK_MASK (0x1) +#define UART_INTERRUPT_STATE_RX_WATERMARK_LOW (1) +#define UART_INTERRUPT_STATE_RX_WATERMARK_MASK (0x2) +#define UART_INTERRUPT_STATE_TX_EMPTY_LOW (2) +#define UART_INTERRUPT_STATE_TX_EMPTY_MASK (0x4) +#define UART_INTERRUPT_STATE_RX_OVERFLOW_LOW (3) +#define UART_INTERRUPT_STATE_RX_OVERFLOW_MASK (0x8) +#define UART_INTERRUPT_STATE_RX_FRAME_ERR_LOW (4) +#define UART_INTERRUPT_STATE_RX_FRAME_ERR_MASK (0x10) +#define UART_INTERRUPT_STATE_RX_BREAK_ERR_LOW (5) +#define UART_INTERRUPT_STATE_RX_BREAK_ERR_MASK (0x20) +#define UART_INTERRUPT_STATE_RX_TIMEOUT_LOW (6) +#define UART_INTERRUPT_STATE_RX_TIMEOUT_MASK (0x40) +#define UART_INTERRUPT_STATE_RX_PARITY_ERR_LOW (7) +#define UART_INTERRUPT_STATE_RX_PARITY_ERR_MASK (0x80) +#define CLP_UART_INTERRUPT_ENABLE (0x20001004) +#define UART_INTERRUPT_ENABLE (0x4) +#define UART_INTERRUPT_ENABLE_TX_WATERMARK_LOW (0) +#define UART_INTERRUPT_ENABLE_TX_WATERMARK_MASK (0x1) +#define UART_INTERRUPT_ENABLE_RX_WATERMARK_LOW (1) +#define UART_INTERRUPT_ENABLE_RX_WATERMARK_MASK (0x2) +#define UART_INTERRUPT_ENABLE_TX_EMPTY_LOW (2) +#define UART_INTERRUPT_ENABLE_TX_EMPTY_MASK (0x4) +#define UART_INTERRUPT_ENABLE_RX_OVERFLOW_LOW (3) +#define UART_INTERRUPT_ENABLE_RX_OVERFLOW_MASK (0x8) +#define UART_INTERRUPT_ENABLE_RX_FRAME_ERR_LOW (4) +#define UART_INTERRUPT_ENABLE_RX_FRAME_ERR_MASK (0x10) +#define UART_INTERRUPT_ENABLE_RX_BREAK_ERR_LOW (5) +#define UART_INTERRUPT_ENABLE_RX_BREAK_ERR_MASK (0x20) +#define UART_INTERRUPT_ENABLE_RX_TIMEOUT_LOW (6) +#define UART_INTERRUPT_ENABLE_RX_TIMEOUT_MASK (0x40) +#define UART_INTERRUPT_ENABLE_RX_PARITY_ERR_LOW (7) +#define UART_INTERRUPT_ENABLE_RX_PARITY_ERR_MASK (0x80) +#define CLP_UART_INTERRUPT_TEST (0x20001008) +#define UART_INTERRUPT_TEST (0x8) +#define UART_INTERRUPT_TEST_TX_WATERMARK_LOW (0) +#define UART_INTERRUPT_TEST_TX_WATERMARK_MASK (0x1) +#define UART_INTERRUPT_TEST_RX_WATERMARK_LOW (1) +#define UART_INTERRUPT_TEST_RX_WATERMARK_MASK (0x2) +#define UART_INTERRUPT_TEST_TX_EMPTY_LOW (2) +#define UART_INTERRUPT_TEST_TX_EMPTY_MASK (0x4) +#define UART_INTERRUPT_TEST_RX_OVERFLOW_LOW (3) +#define UART_INTERRUPT_TEST_RX_OVERFLOW_MASK (0x8) +#define UART_INTERRUPT_TEST_RX_FRAME_ERR_LOW (4) +#define UART_INTERRUPT_TEST_RX_FRAME_ERR_MASK (0x10) +#define UART_INTERRUPT_TEST_RX_BREAK_ERR_LOW (5) +#define UART_INTERRUPT_TEST_RX_BREAK_ERR_MASK (0x20) +#define UART_INTERRUPT_TEST_RX_TIMEOUT_LOW (6) +#define UART_INTERRUPT_TEST_RX_TIMEOUT_MASK (0x40) +#define UART_INTERRUPT_TEST_RX_PARITY_ERR_LOW (7) +#define UART_INTERRUPT_TEST_RX_PARITY_ERR_MASK (0x80) +#define CLP_UART_ALERT_TEST (0x2000100c) +#define UART_ALERT_TEST (0xc) +#define UART_ALERT_TEST_FATAL_FAULT_LOW (0) +#define UART_ALERT_TEST_FATAL_FAULT_MASK (0x1) +#define CLP_UART_CTRL (0x20001010) +#define UART_CTRL (0x10) +#define UART_CTRL_TX_LOW (0) +#define UART_CTRL_TX_MASK (0x1) +#define UART_CTRL_RX_LOW (1) +#define UART_CTRL_RX_MASK (0x2) +#define UART_CTRL_NF_LOW (2) +#define UART_CTRL_NF_MASK (0x4) +#define UART_CTRL_SLPBK_LOW (4) +#define UART_CTRL_SLPBK_MASK (0x10) +#define UART_CTRL_LLPBK_LOW (5) +#define UART_CTRL_LLPBK_MASK (0x20) +#define UART_CTRL_PARITY_EN_LOW (6) +#define UART_CTRL_PARITY_EN_MASK (0x40) +#define UART_CTRL_PARITY_ODD_LOW (7) +#define UART_CTRL_PARITY_ODD_MASK (0x80) +#define UART_CTRL_RXBLVL_LOW (8) +#define UART_CTRL_RXBLVL_MASK (0x300) +#define UART_CTRL_NCO_LOW (16) +#define UART_CTRL_NCO_MASK (0xffff0000) +#define CLP_UART_STATUS (0x20001014) +#define UART_STATUS (0x14) +#define UART_STATUS_TXFULL_LOW (0) +#define UART_STATUS_TXFULL_MASK (0x1) +#define UART_STATUS_RXFULL_LOW (1) +#define UART_STATUS_RXFULL_MASK (0x2) +#define UART_STATUS_TXEMPTY_LOW (2) +#define UART_STATUS_TXEMPTY_MASK (0x4) +#define UART_STATUS_TXIDLE_LOW (3) +#define UART_STATUS_TXIDLE_MASK (0x8) +#define UART_STATUS_RXIDLE_LOW (4) +#define UART_STATUS_RXIDLE_MASK (0x10) +#define UART_STATUS_RXEMPTY_LOW (5) +#define UART_STATUS_RXEMPTY_MASK (0x20) +#define CLP_UART_RDATA (0x20001018) +#define UART_RDATA (0x18) +#define UART_RDATA_RDATA_LOW (0) +#define UART_RDATA_RDATA_MASK (0xff) +#define CLP_UART_WDATA (0x2000101c) +#define UART_WDATA (0x1c) +#define UART_WDATA_WDATA_LOW (0) +#define UART_WDATA_WDATA_MASK (0xff) +#define CLP_UART_FIFO_CTRL (0x20001020) +#define UART_FIFO_CTRL (0x20) +#define UART_FIFO_CTRL_RXRST_LOW (0) +#define UART_FIFO_CTRL_RXRST_MASK (0x1) +#define UART_FIFO_CTRL_TXRST_LOW (1) +#define UART_FIFO_CTRL_TXRST_MASK (0x2) +#define UART_FIFO_CTRL_RXILVL_LOW (2) +#define UART_FIFO_CTRL_RXILVL_MASK (0x1c) +#define UART_FIFO_CTRL_TXILVL_LOW (5) +#define UART_FIFO_CTRL_TXILVL_MASK (0x60) +#define CLP_UART_FIFO_STATUS (0x20001024) +#define UART_FIFO_STATUS (0x24) +#define UART_FIFO_STATUS_TXLVL_LOW (0) +#define UART_FIFO_STATUS_TXLVL_MASK (0x3f) +#define UART_FIFO_STATUS_RXLVL_LOW (16) +#define UART_FIFO_STATUS_RXLVL_MASK (0x3f0000) +#define CLP_UART_OVRD (0x20001028) +#define UART_OVRD (0x28) +#define UART_OVRD_TXEN_LOW (0) +#define UART_OVRD_TXEN_MASK (0x1) +#define UART_OVRD_TXVAL_LOW (1) +#define UART_OVRD_TXVAL_MASK (0x2) +#define CLP_UART_VAL (0x2000102c) +#define UART_VAL (0x2c) +#define UART_VAL_RX_LOW (0) +#define UART_VAL_RX_MASK (0xffff) +#define CLP_UART_TIMEOUT_CTRL (0x20001030) +#define UART_TIMEOUT_CTRL (0x30) +#define UART_TIMEOUT_CTRL_VAL_LOW (0) +#define UART_TIMEOUT_CTRL_VAL_MASK (0xffffff) +#define UART_TIMEOUT_CTRL_EN_LOW (31) +#define UART_TIMEOUT_CTRL_EN_MASK (0x80000000) #define CLP_CSRNG_REG_BASE_ADDR (0x20002000) #define CLP_CSRNG_REG_INTERRUPT_STATE (0x20002000) #define CSRNG_REG_INTERRUPT_STATE (0x0) @@ -4386,6 +4687,14 @@ #define CSRNG_REG_CTRL_READ_INT_STATE_MASK (0xf00) #define CLP_CSRNG_REG_CMD_REQ (0x20002018) #define CSRNG_REG_CMD_REQ (0x18) +#define CSRNG_REG_CMD_REQ_ACMD_LOW (0) +#define CSRNG_REG_CMD_REQ_ACMD_MASK (0xf) +#define CSRNG_REG_CMD_REQ_CLEN_LOW (4) +#define CSRNG_REG_CMD_REQ_CLEN_MASK (0xf0) +#define CSRNG_REG_CMD_REQ_FLAG0_LOW (8) +#define CSRNG_REG_CMD_REQ_FLAG0_MASK (0xf00) +#define CSRNG_REG_CMD_REQ_GLEN_LOW (12) +#define CSRNG_REG_CMD_REQ_GLEN_MASK (0x1fff000) #define CLP_CSRNG_REG_SW_CMD_STS (0x2000201c) #define CSRNG_REG_SW_CMD_STS (0x1c) #define CSRNG_REG_SW_CMD_STS_CMD_RDY_LOW (0) @@ -4874,6 +5183,8 @@ #define MBOX_CSR_MBOX_STATUS_MBOX_FSM_PS_MASK (0x1c0) #define MBOX_CSR_MBOX_STATUS_SOC_HAS_LOCK_LOW (9) #define MBOX_CSR_MBOX_STATUS_SOC_HAS_LOCK_MASK (0x200) +#define MBOX_CSR_MBOX_STATUS_MBOX_RDPTR_LOW (10) +#define MBOX_CSR_MBOX_STATUS_MBOX_RDPTR_MASK (0x1fffc00) #define CLP_MBOX_CSR_MBOX_UNLOCK (0x30020020) #define MBOX_CSR_MBOX_UNLOCK (0x20) #define MBOX_CSR_MBOX_UNLOCK_UNLOCK_LOW (0) @@ -4905,6 +5216,8 @@ #define SHA512_ACC_CSR_STATUS (0x1c) #define SHA512_ACC_CSR_STATUS_VALID_LOW (0) #define SHA512_ACC_CSR_STATUS_VALID_MASK (0x1) +#define SHA512_ACC_CSR_STATUS_SOC_HAS_LOCK_LOW (1) +#define SHA512_ACC_CSR_STATUS_SOC_HAS_LOCK_MASK (0x2) #define CLP_SHA512_ACC_CSR_DIGEST_0 (0x30021020) #define SHA512_ACC_CSR_DIGEST_0 (0x20) #define CLP_SHA512_ACC_CSR_DIGEST_1 (0x30021024) @@ -5031,8 +5344,20 @@ #define CLP_SOC_IFC_REG_BASE_ADDR (0x30030000) #define CLP_SOC_IFC_REG_CPTRA_HW_ERROR_FATAL (0x30030000) #define SOC_IFC_REG_CPTRA_HW_ERROR_FATAL (0x0) +#define SOC_IFC_REG_CPTRA_HW_ERROR_FATAL_ICCM_ECC_UNC_LOW (0) +#define SOC_IFC_REG_CPTRA_HW_ERROR_FATAL_ICCM_ECC_UNC_MASK (0x1) +#define SOC_IFC_REG_CPTRA_HW_ERROR_FATAL_DCCM_ECC_UNC_LOW (1) +#define SOC_IFC_REG_CPTRA_HW_ERROR_FATAL_DCCM_ECC_UNC_MASK (0x2) +#define SOC_IFC_REG_CPTRA_HW_ERROR_FATAL_NMI_PIN_LOW (2) +#define SOC_IFC_REG_CPTRA_HW_ERROR_FATAL_NMI_PIN_MASK (0x4) #define CLP_SOC_IFC_REG_CPTRA_HW_ERROR_NON_FATAL (0x30030004) #define SOC_IFC_REG_CPTRA_HW_ERROR_NON_FATAL (0x4) +#define SOC_IFC_REG_CPTRA_HW_ERROR_NON_FATAL_MBOX_PROT_NO_LOCK_LOW (0) +#define SOC_IFC_REG_CPTRA_HW_ERROR_NON_FATAL_MBOX_PROT_NO_LOCK_MASK (0x1) +#define SOC_IFC_REG_CPTRA_HW_ERROR_NON_FATAL_MBOX_PROT_OOO_LOW (1) +#define SOC_IFC_REG_CPTRA_HW_ERROR_NON_FATAL_MBOX_PROT_OOO_MASK (0x2) +#define SOC_IFC_REG_CPTRA_HW_ERROR_NON_FATAL_MBOX_ECC_UNC_LOW (2) +#define SOC_IFC_REG_CPTRA_HW_ERROR_NON_FATAL_MBOX_ECC_UNC_MASK (0x4) #define CLP_SOC_IFC_REG_CPTRA_FW_ERROR_FATAL (0x30030008) #define SOC_IFC_REG_CPTRA_FW_ERROR_FATAL (0x8) #define CLP_SOC_IFC_REG_CPTRA_FW_ERROR_NON_FATAL (0x3003000c) @@ -5062,7 +5387,11 @@ #define CLP_SOC_IFC_REG_CPTRA_FLOW_STATUS (0x3003003c) #define SOC_IFC_REG_CPTRA_FLOW_STATUS (0x3c) #define SOC_IFC_REG_CPTRA_FLOW_STATUS_STATUS_LOW (0) -#define SOC_IFC_REG_CPTRA_FLOW_STATUS_STATUS_MASK (0xfffffff) +#define SOC_IFC_REG_CPTRA_FLOW_STATUS_STATUS_MASK (0xffffff) +#define SOC_IFC_REG_CPTRA_FLOW_STATUS_IDEVID_CSR_READY_LOW (24) +#define SOC_IFC_REG_CPTRA_FLOW_STATUS_IDEVID_CSR_READY_MASK (0x1000000) +#define SOC_IFC_REG_CPTRA_FLOW_STATUS_BOOT_FSM_PS_LOW (25) +#define SOC_IFC_REG_CPTRA_FLOW_STATUS_BOOT_FSM_PS_MASK (0xe000000) #define SOC_IFC_REG_CPTRA_FLOW_STATUS_READY_FOR_FW_LOW (28) #define SOC_IFC_REG_CPTRA_FLOW_STATUS_READY_FOR_FW_MASK (0x10000000) #define SOC_IFC_REG_CPTRA_FLOW_STATUS_READY_FOR_RUNTIME_LOW (29) @@ -5147,80 +5476,116 @@ #define SOC_IFC_REG_CPTRA_TRNG_DATA_10 (0xa0) #define CLP_SOC_IFC_REG_CPTRA_TRNG_DATA_11 (0x300300a4) #define SOC_IFC_REG_CPTRA_TRNG_DATA_11 (0xa4) -#define CLP_SOC_IFC_REG_CPTRA_TRNG_STATUS (0x300300a8) -#define SOC_IFC_REG_CPTRA_TRNG_STATUS (0xa8) +#define CLP_SOC_IFC_REG_CPTRA_TRNG_CTRL (0x300300a8) +#define SOC_IFC_REG_CPTRA_TRNG_CTRL (0xa8) +#define SOC_IFC_REG_CPTRA_TRNG_CTRL_CLEAR_LOW (0) +#define SOC_IFC_REG_CPTRA_TRNG_CTRL_CLEAR_MASK (0x1) +#define CLP_SOC_IFC_REG_CPTRA_TRNG_STATUS (0x300300ac) +#define SOC_IFC_REG_CPTRA_TRNG_STATUS (0xac) #define SOC_IFC_REG_CPTRA_TRNG_STATUS_DATA_REQ_LOW (0) #define SOC_IFC_REG_CPTRA_TRNG_STATUS_DATA_REQ_MASK (0x1) #define SOC_IFC_REG_CPTRA_TRNG_STATUS_DATA_WR_DONE_LOW (1) #define SOC_IFC_REG_CPTRA_TRNG_STATUS_DATA_WR_DONE_MASK (0x2) -#define CLP_SOC_IFC_REG_CPTRA_FUSE_WR_DONE (0x300300ac) -#define SOC_IFC_REG_CPTRA_FUSE_WR_DONE (0xac) +#define CLP_SOC_IFC_REG_CPTRA_FUSE_WR_DONE (0x300300b0) +#define SOC_IFC_REG_CPTRA_FUSE_WR_DONE (0xb0) #define SOC_IFC_REG_CPTRA_FUSE_WR_DONE_DONE_LOW (0) #define SOC_IFC_REG_CPTRA_FUSE_WR_DONE_DONE_MASK (0x1) -#define CLP_SOC_IFC_REG_CPTRA_TIMER_CONFIG (0x300300b0) -#define SOC_IFC_REG_CPTRA_TIMER_CONFIG (0xb0) -#define CLP_SOC_IFC_REG_CPTRA_BOOTFSM_GO (0x300300b4) -#define SOC_IFC_REG_CPTRA_BOOTFSM_GO (0xb4) +#define CLP_SOC_IFC_REG_CPTRA_TIMER_CONFIG (0x300300b4) +#define SOC_IFC_REG_CPTRA_TIMER_CONFIG (0xb4) +#define CLP_SOC_IFC_REG_CPTRA_BOOTFSM_GO (0x300300b8) +#define SOC_IFC_REG_CPTRA_BOOTFSM_GO (0xb8) #define SOC_IFC_REG_CPTRA_BOOTFSM_GO_GO_LOW (0) #define SOC_IFC_REG_CPTRA_BOOTFSM_GO_GO_MASK (0x1) -#define CLP_SOC_IFC_REG_CPTRA_DBG_MANUF_SERVICE_REG (0x300300b8) -#define SOC_IFC_REG_CPTRA_DBG_MANUF_SERVICE_REG (0xb8) -#define CLP_SOC_IFC_REG_CPTRA_CLK_GATING_EN (0x300300bc) -#define SOC_IFC_REG_CPTRA_CLK_GATING_EN (0xbc) +#define CLP_SOC_IFC_REG_CPTRA_DBG_MANUF_SERVICE_REG (0x300300bc) +#define SOC_IFC_REG_CPTRA_DBG_MANUF_SERVICE_REG (0xbc) +#define CLP_SOC_IFC_REG_CPTRA_CLK_GATING_EN (0x300300c0) +#define SOC_IFC_REG_CPTRA_CLK_GATING_EN (0xc0) #define SOC_IFC_REG_CPTRA_CLK_GATING_EN_CLK_GATING_EN_LOW (0) #define SOC_IFC_REG_CPTRA_CLK_GATING_EN_CLK_GATING_EN_MASK (0x1) -#define CLP_SOC_IFC_REG_CPTRA_GENERIC_INPUT_WIRES_0 (0x300300c0) -#define SOC_IFC_REG_CPTRA_GENERIC_INPUT_WIRES_0 (0xc0) -#define CLP_SOC_IFC_REG_CPTRA_GENERIC_INPUT_WIRES_1 (0x300300c4) -#define SOC_IFC_REG_CPTRA_GENERIC_INPUT_WIRES_1 (0xc4) -#define CLP_SOC_IFC_REG_CPTRA_GENERIC_OUTPUT_WIRES_0 (0x300300c8) -#define SOC_IFC_REG_CPTRA_GENERIC_OUTPUT_WIRES_0 (0xc8) -#define CLP_SOC_IFC_REG_CPTRA_GENERIC_OUTPUT_WIRES_1 (0x300300cc) -#define SOC_IFC_REG_CPTRA_GENERIC_OUTPUT_WIRES_1 (0xcc) -#define CLP_SOC_IFC_REG_CPTRA_HW_REV_ID (0x300300d0) -#define SOC_IFC_REG_CPTRA_HW_REV_ID (0xd0) -#define CLP_SOC_IFC_REG_CPTRA_FW_REV_ID_0 (0x300300d4) -#define SOC_IFC_REG_CPTRA_FW_REV_ID_0 (0xd4) -#define CLP_SOC_IFC_REG_CPTRA_FW_REV_ID_1 (0x300300d8) -#define SOC_IFC_REG_CPTRA_FW_REV_ID_1 (0xd8) -#define CLP_SOC_IFC_REG_CPTRA_HW_CONFIG (0x300300dc) -#define SOC_IFC_REG_CPTRA_HW_CONFIG (0xdc) +#define CLP_SOC_IFC_REG_CPTRA_GENERIC_INPUT_WIRES_0 (0x300300c4) +#define SOC_IFC_REG_CPTRA_GENERIC_INPUT_WIRES_0 (0xc4) +#define CLP_SOC_IFC_REG_CPTRA_GENERIC_INPUT_WIRES_1 (0x300300c8) +#define SOC_IFC_REG_CPTRA_GENERIC_INPUT_WIRES_1 (0xc8) +#define CLP_SOC_IFC_REG_CPTRA_GENERIC_OUTPUT_WIRES_0 (0x300300cc) +#define SOC_IFC_REG_CPTRA_GENERIC_OUTPUT_WIRES_0 (0xcc) +#define CLP_SOC_IFC_REG_CPTRA_GENERIC_OUTPUT_WIRES_1 (0x300300d0) +#define SOC_IFC_REG_CPTRA_GENERIC_OUTPUT_WIRES_1 (0xd0) +#define CLP_SOC_IFC_REG_CPTRA_HW_REV_ID (0x300300d4) +#define SOC_IFC_REG_CPTRA_HW_REV_ID (0xd4) +#define SOC_IFC_REG_CPTRA_HW_REV_ID_CPTRA_GENERATION_LOW (0) +#define SOC_IFC_REG_CPTRA_HW_REV_ID_CPTRA_GENERATION_MASK (0xffff) +#define SOC_IFC_REG_CPTRA_HW_REV_ID_SOC_STEPPING_ID_LOW (16) +#define SOC_IFC_REG_CPTRA_HW_REV_ID_SOC_STEPPING_ID_MASK (0xffff0000) +#define CLP_SOC_IFC_REG_CPTRA_FW_REV_ID_0 (0x300300d8) +#define SOC_IFC_REG_CPTRA_FW_REV_ID_0 (0xd8) +#define CLP_SOC_IFC_REG_CPTRA_FW_REV_ID_1 (0x300300dc) +#define SOC_IFC_REG_CPTRA_FW_REV_ID_1 (0xdc) +#define CLP_SOC_IFC_REG_CPTRA_HW_CONFIG (0x300300e0) +#define SOC_IFC_REG_CPTRA_HW_CONFIG (0xe0) #define SOC_IFC_REG_CPTRA_HW_CONFIG_ITRNG_EN_LOW (0) #define SOC_IFC_REG_CPTRA_HW_CONFIG_ITRNG_EN_MASK (0x1) #define SOC_IFC_REG_CPTRA_HW_CONFIG_QSPI_EN_LOW (1) #define SOC_IFC_REG_CPTRA_HW_CONFIG_QSPI_EN_MASK (0x2) #define SOC_IFC_REG_CPTRA_HW_CONFIG_I3C_EN_LOW (2) #define SOC_IFC_REG_CPTRA_HW_CONFIG_I3C_EN_MASK (0x4) -#define CLP_SOC_IFC_REG_CPTRA_WDT_TIMER1_EN (0x300300e0) -#define SOC_IFC_REG_CPTRA_WDT_TIMER1_EN (0xe0) +#define SOC_IFC_REG_CPTRA_HW_CONFIG_UART_EN_LOW (3) +#define SOC_IFC_REG_CPTRA_HW_CONFIG_UART_EN_MASK (0x8) +#define CLP_SOC_IFC_REG_CPTRA_WDT_TIMER1_EN (0x300300e4) +#define SOC_IFC_REG_CPTRA_WDT_TIMER1_EN (0xe4) #define SOC_IFC_REG_CPTRA_WDT_TIMER1_EN_TIMER1_EN_LOW (0) #define SOC_IFC_REG_CPTRA_WDT_TIMER1_EN_TIMER1_EN_MASK (0x1) -#define CLP_SOC_IFC_REG_CPTRA_WDT_TIMER1_CTRL (0x300300e4) -#define SOC_IFC_REG_CPTRA_WDT_TIMER1_CTRL (0xe4) +#define CLP_SOC_IFC_REG_CPTRA_WDT_TIMER1_CTRL (0x300300e8) +#define SOC_IFC_REG_CPTRA_WDT_TIMER1_CTRL (0xe8) #define SOC_IFC_REG_CPTRA_WDT_TIMER1_CTRL_TIMER1_RESTART_LOW (0) #define SOC_IFC_REG_CPTRA_WDT_TIMER1_CTRL_TIMER1_RESTART_MASK (0x1) -#define CLP_SOC_IFC_REG_CPTRA_WDT_TIMER1_TIMEOUT_PERIOD_0 (0x300300e8) -#define SOC_IFC_REG_CPTRA_WDT_TIMER1_TIMEOUT_PERIOD_0 (0xe8) -#define CLP_SOC_IFC_REG_CPTRA_WDT_TIMER1_TIMEOUT_PERIOD_1 (0x300300ec) -#define SOC_IFC_REG_CPTRA_WDT_TIMER1_TIMEOUT_PERIOD_1 (0xec) -#define CLP_SOC_IFC_REG_CPTRA_WDT_TIMER2_EN (0x300300f0) -#define SOC_IFC_REG_CPTRA_WDT_TIMER2_EN (0xf0) +#define CLP_SOC_IFC_REG_CPTRA_WDT_TIMER1_TIMEOUT_PERIOD_0 (0x300300ec) +#define SOC_IFC_REG_CPTRA_WDT_TIMER1_TIMEOUT_PERIOD_0 (0xec) +#define CLP_SOC_IFC_REG_CPTRA_WDT_TIMER1_TIMEOUT_PERIOD_1 (0x300300f0) +#define SOC_IFC_REG_CPTRA_WDT_TIMER1_TIMEOUT_PERIOD_1 (0xf0) +#define CLP_SOC_IFC_REG_CPTRA_WDT_TIMER2_EN (0x300300f4) +#define SOC_IFC_REG_CPTRA_WDT_TIMER2_EN (0xf4) #define SOC_IFC_REG_CPTRA_WDT_TIMER2_EN_TIMER2_EN_LOW (0) #define SOC_IFC_REG_CPTRA_WDT_TIMER2_EN_TIMER2_EN_MASK (0x1) -#define CLP_SOC_IFC_REG_CPTRA_WDT_TIMER2_CTRL (0x300300f4) -#define SOC_IFC_REG_CPTRA_WDT_TIMER2_CTRL (0xf4) +#define CLP_SOC_IFC_REG_CPTRA_WDT_TIMER2_CTRL (0x300300f8) +#define SOC_IFC_REG_CPTRA_WDT_TIMER2_CTRL (0xf8) #define SOC_IFC_REG_CPTRA_WDT_TIMER2_CTRL_TIMER2_RESTART_LOW (0) #define SOC_IFC_REG_CPTRA_WDT_TIMER2_CTRL_TIMER2_RESTART_MASK (0x1) -#define CLP_SOC_IFC_REG_CPTRA_WDT_TIMER2_TIMEOUT_PERIOD_0 (0x300300f8) -#define SOC_IFC_REG_CPTRA_WDT_TIMER2_TIMEOUT_PERIOD_0 (0xf8) -#define CLP_SOC_IFC_REG_CPTRA_WDT_TIMER2_TIMEOUT_PERIOD_1 (0x300300fc) -#define SOC_IFC_REG_CPTRA_WDT_TIMER2_TIMEOUT_PERIOD_1 (0xfc) -#define CLP_SOC_IFC_REG_CPTRA_WDT_STATUS (0x30030100) -#define SOC_IFC_REG_CPTRA_WDT_STATUS (0x100) +#define CLP_SOC_IFC_REG_CPTRA_WDT_TIMER2_TIMEOUT_PERIOD_0 (0x300300fc) +#define SOC_IFC_REG_CPTRA_WDT_TIMER2_TIMEOUT_PERIOD_0 (0xfc) +#define CLP_SOC_IFC_REG_CPTRA_WDT_TIMER2_TIMEOUT_PERIOD_1 (0x30030100) +#define SOC_IFC_REG_CPTRA_WDT_TIMER2_TIMEOUT_PERIOD_1 (0x100) +#define CLP_SOC_IFC_REG_CPTRA_WDT_STATUS (0x30030104) +#define SOC_IFC_REG_CPTRA_WDT_STATUS (0x104) #define SOC_IFC_REG_CPTRA_WDT_STATUS_T1_TIMEOUT_LOW (0) #define SOC_IFC_REG_CPTRA_WDT_STATUS_T1_TIMEOUT_MASK (0x1) #define SOC_IFC_REG_CPTRA_WDT_STATUS_T2_TIMEOUT_LOW (1) #define SOC_IFC_REG_CPTRA_WDT_STATUS_T2_TIMEOUT_MASK (0x2) +#define CLP_SOC_IFC_REG_CPTRA_FUSE_VALID_PAUSER (0x30030108) +#define SOC_IFC_REG_CPTRA_FUSE_VALID_PAUSER (0x108) +#define CLP_SOC_IFC_REG_CPTRA_FUSE_PAUSER_LOCK (0x3003010c) +#define SOC_IFC_REG_CPTRA_FUSE_PAUSER_LOCK (0x10c) +#define SOC_IFC_REG_CPTRA_FUSE_PAUSER_LOCK_LOCK_LOW (0) +#define SOC_IFC_REG_CPTRA_FUSE_PAUSER_LOCK_LOCK_MASK (0x1) +#define CLP_SOC_IFC_REG_CPTRA_WDT_CFG_0 (0x30030110) +#define SOC_IFC_REG_CPTRA_WDT_CFG_0 (0x110) +#define CLP_SOC_IFC_REG_CPTRA_WDT_CFG_1 (0x30030114) +#define SOC_IFC_REG_CPTRA_WDT_CFG_1 (0x114) +#define CLP_SOC_IFC_REG_CPTRA_ITRNG_ENTROPY_CONFIG_0 (0x30030118) +#define SOC_IFC_REG_CPTRA_ITRNG_ENTROPY_CONFIG_0 (0x118) +#define SOC_IFC_REG_CPTRA_ITRNG_ENTROPY_CONFIG_0_LOW_THRESHOLD_LOW (0) +#define SOC_IFC_REG_CPTRA_ITRNG_ENTROPY_CONFIG_0_LOW_THRESHOLD_MASK (0xffff) +#define SOC_IFC_REG_CPTRA_ITRNG_ENTROPY_CONFIG_0_HIGH_THRESHOLD_LOW (16) +#define SOC_IFC_REG_CPTRA_ITRNG_ENTROPY_CONFIG_0_HIGH_THRESHOLD_MASK (0xffff0000) +#define CLP_SOC_IFC_REG_CPTRA_ITRNG_ENTROPY_CONFIG_1 (0x3003011c) +#define SOC_IFC_REG_CPTRA_ITRNG_ENTROPY_CONFIG_1 (0x11c) +#define SOC_IFC_REG_CPTRA_ITRNG_ENTROPY_CONFIG_1_REPETITION_COUNT_LOW (0) +#define SOC_IFC_REG_CPTRA_ITRNG_ENTROPY_CONFIG_1_REPETITION_COUNT_MASK (0xffff) +#define SOC_IFC_REG_CPTRA_ITRNG_ENTROPY_CONFIG_1_RSVD_LOW (16) +#define SOC_IFC_REG_CPTRA_ITRNG_ENTROPY_CONFIG_1_RSVD_MASK (0xffff0000) +#define CLP_SOC_IFC_REG_CPTRA_RSVD_REG_0 (0x30030120) +#define SOC_IFC_REG_CPTRA_RSVD_REG_0 (0x120) +#define CLP_SOC_IFC_REG_CPTRA_RSVD_REG_1 (0x30030124) +#define SOC_IFC_REG_CPTRA_RSVD_REG_1 (0x124) #define CLP_SOC_IFC_REG_FUSE_UDS_SEED_0 (0x30030200) #define SOC_IFC_REG_FUSE_UDS_SEED_0 (0x200) #define CLP_SOC_IFC_REG_FUSE_UDS_SEED_1 (0x30030204) @@ -5387,6 +5752,16 @@ #define SOC_IFC_REG_FUSE_LIFE_CYCLE (0x33c) #define SOC_IFC_REG_FUSE_LIFE_CYCLE_LIFE_CYCLE_LOW (0) #define SOC_IFC_REG_FUSE_LIFE_CYCLE_LIFE_CYCLE_MASK (0x3) +#define CLP_SOC_IFC_REG_FUSE_LMS_VERIFY (0x30030340) +#define SOC_IFC_REG_FUSE_LMS_VERIFY (0x340) +#define SOC_IFC_REG_FUSE_LMS_VERIFY_LMS_VERIFY_LOW (0) +#define SOC_IFC_REG_FUSE_LMS_VERIFY_LMS_VERIFY_MASK (0x1) +#define CLP_SOC_IFC_REG_FUSE_LMS_REVOCATION (0x30030344) +#define SOC_IFC_REG_FUSE_LMS_REVOCATION (0x344) +#define CLP_SOC_IFC_REG_FUSE_SOC_STEPPING_ID (0x30030348) +#define SOC_IFC_REG_FUSE_SOC_STEPPING_ID (0x348) +#define SOC_IFC_REG_FUSE_SOC_STEPPING_ID_SOC_STEPPING_ID_LOW (0) +#define SOC_IFC_REG_FUSE_SOC_STEPPING_ID_SOC_STEPPING_ID_MASK (0xffff) #define CLP_SOC_IFC_REG_INTERNAL_OBF_KEY_0 (0x30030600) #define SOC_IFC_REG_INTERNAL_OBF_KEY_0 (0x600) #define CLP_SOC_IFC_REG_INTERNAL_OBF_KEY_1 (0x30030604) @@ -5417,6 +5792,34 @@ #define SOC_IFC_REG_INTERNAL_FW_UPDATE_RESET_WAIT_CYCLES_WAIT_CYCLES_MASK (0xff) #define CLP_SOC_IFC_REG_INTERNAL_NMI_VECTOR (0x3003062c) #define SOC_IFC_REG_INTERNAL_NMI_VECTOR (0x62c) +#define CLP_SOC_IFC_REG_INTERNAL_HW_ERROR_FATAL_MASK (0x30030630) +#define SOC_IFC_REG_INTERNAL_HW_ERROR_FATAL_MASK (0x630) +#define SOC_IFC_REG_INTERNAL_HW_ERROR_FATAL_MASK_MASK_ICCM_ECC_UNC_LOW (0) +#define SOC_IFC_REG_INTERNAL_HW_ERROR_FATAL_MASK_MASK_ICCM_ECC_UNC_MASK (0x1) +#define SOC_IFC_REG_INTERNAL_HW_ERROR_FATAL_MASK_MASK_DCCM_ECC_UNC_LOW (1) +#define SOC_IFC_REG_INTERNAL_HW_ERROR_FATAL_MASK_MASK_DCCM_ECC_UNC_MASK (0x2) +#define SOC_IFC_REG_INTERNAL_HW_ERROR_FATAL_MASK_MASK_NMI_PIN_LOW (2) +#define SOC_IFC_REG_INTERNAL_HW_ERROR_FATAL_MASK_MASK_NMI_PIN_MASK (0x4) +#define CLP_SOC_IFC_REG_INTERNAL_HW_ERROR_NON_FATAL_MASK (0x30030634) +#define SOC_IFC_REG_INTERNAL_HW_ERROR_NON_FATAL_MASK (0x634) +#define SOC_IFC_REG_INTERNAL_HW_ERROR_NON_FATAL_MASK_MASK_MBOX_PROT_NO_LOCK_LOW (0) +#define SOC_IFC_REG_INTERNAL_HW_ERROR_NON_FATAL_MASK_MASK_MBOX_PROT_NO_LOCK_MASK (0x1) +#define SOC_IFC_REG_INTERNAL_HW_ERROR_NON_FATAL_MASK_MASK_MBOX_PROT_OOO_LOW (1) +#define SOC_IFC_REG_INTERNAL_HW_ERROR_NON_FATAL_MASK_MASK_MBOX_PROT_OOO_MASK (0x2) +#define SOC_IFC_REG_INTERNAL_HW_ERROR_NON_FATAL_MASK_MASK_MBOX_ECC_UNC_LOW (2) +#define SOC_IFC_REG_INTERNAL_HW_ERROR_NON_FATAL_MASK_MASK_MBOX_ECC_UNC_MASK (0x4) +#define CLP_SOC_IFC_REG_INTERNAL_FW_ERROR_FATAL_MASK (0x30030638) +#define SOC_IFC_REG_INTERNAL_FW_ERROR_FATAL_MASK (0x638) +#define CLP_SOC_IFC_REG_INTERNAL_FW_ERROR_NON_FATAL_MASK (0x3003063c) +#define SOC_IFC_REG_INTERNAL_FW_ERROR_NON_FATAL_MASK (0x63c) +#define CLP_SOC_IFC_REG_INTERNAL_RV_MTIME_L (0x30030640) +#define SOC_IFC_REG_INTERNAL_RV_MTIME_L (0x640) +#define CLP_SOC_IFC_REG_INTERNAL_RV_MTIME_H (0x30030644) +#define SOC_IFC_REG_INTERNAL_RV_MTIME_H (0x644) +#define CLP_SOC_IFC_REG_INTERNAL_RV_MTIMECMP_L (0x30030648) +#define SOC_IFC_REG_INTERNAL_RV_MTIMECMP_L (0x648) +#define CLP_SOC_IFC_REG_INTERNAL_RV_MTIMECMP_H (0x3003064c) +#define SOC_IFC_REG_INTERNAL_RV_MTIMECMP_H (0x64c) #define CLP_SOC_IFC_REG_INTR_BLOCK_RF_START (0x30030800) #define CLP_SOC_IFC_REG_INTR_BLOCK_RF_GLOBAL_INTR_EN_R (0x30030800) #define SOC_IFC_REG_INTR_BLOCK_RF_GLOBAL_INTR_EN_R (0x800) @@ -5450,8 +5853,12 @@ #define SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTR_EN_R_NOTIF_MBOX_ECC_COR_EN_MASK (0x2) #define SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTR_EN_R_NOTIF_DEBUG_LOCKED_EN_LOW (2) #define SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTR_EN_R_NOTIF_DEBUG_LOCKED_EN_MASK (0x4) -#define SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTR_EN_R_NOTIF_SOC_REQ_LOCK_EN_LOW (3) -#define SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTR_EN_R_NOTIF_SOC_REQ_LOCK_EN_MASK (0x8) +#define SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTR_EN_R_NOTIF_SCAN_MODE_EN_LOW (3) +#define SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTR_EN_R_NOTIF_SCAN_MODE_EN_MASK (0x8) +#define SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTR_EN_R_NOTIF_SOC_REQ_LOCK_EN_LOW (4) +#define SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTR_EN_R_NOTIF_SOC_REQ_LOCK_EN_MASK (0x10) +#define SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTR_EN_R_NOTIF_GEN_IN_TOGGLE_EN_LOW (5) +#define SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTR_EN_R_NOTIF_GEN_IN_TOGGLE_EN_MASK (0x20) #define CLP_SOC_IFC_REG_INTR_BLOCK_RF_ERROR_GLOBAL_INTR_R (0x3003080c) #define SOC_IFC_REG_INTR_BLOCK_RF_ERROR_GLOBAL_INTR_R (0x80c) #define SOC_IFC_REG_INTR_BLOCK_RF_ERROR_GLOBAL_INTR_R_AGG_STS_LOW (0) @@ -5486,8 +5893,12 @@ #define SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_MBOX_ECC_COR_STS_MASK (0x2) #define SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_DEBUG_LOCKED_STS_LOW (2) #define SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_DEBUG_LOCKED_STS_MASK (0x4) -#define SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_SOC_REQ_LOCK_STS_LOW (3) -#define SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_SOC_REQ_LOCK_STS_MASK (0x8) +#define SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_SCAN_MODE_STS_LOW (3) +#define SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_SCAN_MODE_STS_MASK (0x8) +#define SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_SOC_REQ_LOCK_STS_LOW (4) +#define SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_SOC_REQ_LOCK_STS_MASK (0x10) +#define SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_GEN_IN_TOGGLE_STS_LOW (5) +#define SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_GEN_IN_TOGGLE_STS_MASK (0x20) #define CLP_SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTR_TRIG_R (0x3003081c) #define SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTR_TRIG_R (0x81c) #define SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTR_TRIG_R_ERROR_INTERNAL_TRIG_LOW (0) @@ -5514,8 +5925,12 @@ #define SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTR_TRIG_R_NOTIF_MBOX_ECC_COR_TRIG_MASK (0x2) #define SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTR_TRIG_R_NOTIF_DEBUG_LOCKED_TRIG_LOW (2) #define SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTR_TRIG_R_NOTIF_DEBUG_LOCKED_TRIG_MASK (0x4) -#define SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTR_TRIG_R_NOTIF_SOC_REQ_LOCK_TRIG_LOW (3) -#define SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTR_TRIG_R_NOTIF_SOC_REQ_LOCK_TRIG_MASK (0x8) +#define SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTR_TRIG_R_NOTIF_SCAN_MODE_TRIG_LOW (3) +#define SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTR_TRIG_R_NOTIF_SCAN_MODE_TRIG_MASK (0x8) +#define SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTR_TRIG_R_NOTIF_SOC_REQ_LOCK_TRIG_LOW (4) +#define SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTR_TRIG_R_NOTIF_SOC_REQ_LOCK_TRIG_MASK (0x10) +#define SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTR_TRIG_R_NOTIF_GEN_IN_TOGGLE_TRIG_LOW (5) +#define SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTR_TRIG_R_NOTIF_GEN_IN_TOGGLE_TRIG_MASK (0x20) #define CLP_SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_COUNT_R (0x30030900) #define SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_COUNT_R (0x900) #define CLP_SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INV_DEV_INTR_COUNT_R (0x30030904) @@ -5538,8 +5953,12 @@ #define SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_MBOX_ECC_COR_INTR_COUNT_R (0x984) #define CLP_SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_DEBUG_LOCKED_INTR_COUNT_R (0x30030988) #define SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_DEBUG_LOCKED_INTR_COUNT_R (0x988) -#define CLP_SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_SOC_REQ_LOCK_INTR_COUNT_R (0x3003098c) -#define SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_SOC_REQ_LOCK_INTR_COUNT_R (0x98c) +#define CLP_SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_SCAN_MODE_INTR_COUNT_R (0x3003098c) +#define SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_SCAN_MODE_INTR_COUNT_R (0x98c) +#define CLP_SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_SOC_REQ_LOCK_INTR_COUNT_R (0x30030990) +#define SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_SOC_REQ_LOCK_INTR_COUNT_R (0x990) +#define CLP_SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_GEN_IN_TOGGLE_INTR_COUNT_R (0x30030994) +#define SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_GEN_IN_TOGGLE_INTR_COUNT_R (0x994) #define CLP_SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_COUNT_INCR_R (0x30030a00) #define SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_COUNT_INCR_R (0xa00) #define SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_COUNT_INCR_R_PULSE_LOW (0) @@ -5584,10 +6003,18 @@ #define SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_DEBUG_LOCKED_INTR_COUNT_INCR_R (0xa28) #define SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_DEBUG_LOCKED_INTR_COUNT_INCR_R_PULSE_LOW (0) #define SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_DEBUG_LOCKED_INTR_COUNT_INCR_R_PULSE_MASK (0x1) -#define CLP_SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_SOC_REQ_LOCK_INTR_COUNT_INCR_R (0x30030a2c) -#define SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_SOC_REQ_LOCK_INTR_COUNT_INCR_R (0xa2c) +#define CLP_SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_SCAN_MODE_INTR_COUNT_INCR_R (0x30030a2c) +#define SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_SCAN_MODE_INTR_COUNT_INCR_R (0xa2c) +#define SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_SCAN_MODE_INTR_COUNT_INCR_R_PULSE_LOW (0) +#define SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_SCAN_MODE_INTR_COUNT_INCR_R_PULSE_MASK (0x1) +#define CLP_SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_SOC_REQ_LOCK_INTR_COUNT_INCR_R (0x30030a30) +#define SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_SOC_REQ_LOCK_INTR_COUNT_INCR_R (0xa30) #define SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_SOC_REQ_LOCK_INTR_COUNT_INCR_R_PULSE_LOW (0) #define SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_SOC_REQ_LOCK_INTR_COUNT_INCR_R_PULSE_MASK (0x1) +#define CLP_SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_GEN_IN_TOGGLE_INTR_COUNT_INCR_R (0x30030a34) +#define SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_GEN_IN_TOGGLE_INTR_COUNT_INCR_R (0xa34) +#define SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_GEN_IN_TOGGLE_INTR_COUNT_INCR_R_PULSE_LOW (0) +#define SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_GEN_IN_TOGGLE_INTR_COUNT_INCR_R_PULSE_MASK (0x1) -#endif +#endif \ No newline at end of file diff --git a/src/integration/rtl/caliptra_reg_defines.svh b/src/integration/rtl/caliptra_reg_defines.svh index 8b7c2851e..c7af5ea04 100644 --- a/src/integration/rtl/caliptra_reg_defines.svh +++ b/src/integration/rtl/caliptra_reg_defines.svh @@ -3482,346 +3482,346 @@ `define DV_REG_STICKY_DATA_VAULT_ENTRY_9_10 (32'h200) `define CLP_DV_REG_STICKY_DATA_VAULT_ENTRY_9_11 (32'h1001c204) `define DV_REG_STICKY_DATA_VAULT_ENTRY_9_11 (32'h204) -`define CLP_DV_REG_NONSTICKYDATAVAULTCTRL_0 (32'h1001c208) -`define DV_REG_NONSTICKYDATAVAULTCTRL_0 (32'h208) -`define DV_REG_NONSTICKYDATAVAULTCTRL_0_LOCK_ENTRY_LOW (0) -`define DV_REG_NONSTICKYDATAVAULTCTRL_0_LOCK_ENTRY_MASK (32'h1) -`define CLP_DV_REG_NONSTICKYDATAVAULTCTRL_1 (32'h1001c20c) -`define DV_REG_NONSTICKYDATAVAULTCTRL_1 (32'h20c) -`define DV_REG_NONSTICKYDATAVAULTCTRL_1_LOCK_ENTRY_LOW (0) -`define DV_REG_NONSTICKYDATAVAULTCTRL_1_LOCK_ENTRY_MASK (32'h1) -`define CLP_DV_REG_NONSTICKYDATAVAULTCTRL_2 (32'h1001c210) -`define DV_REG_NONSTICKYDATAVAULTCTRL_2 (32'h210) -`define DV_REG_NONSTICKYDATAVAULTCTRL_2_LOCK_ENTRY_LOW (0) -`define DV_REG_NONSTICKYDATAVAULTCTRL_2_LOCK_ENTRY_MASK (32'h1) -`define CLP_DV_REG_NONSTICKYDATAVAULTCTRL_3 (32'h1001c214) -`define DV_REG_NONSTICKYDATAVAULTCTRL_3 (32'h214) -`define DV_REG_NONSTICKYDATAVAULTCTRL_3_LOCK_ENTRY_LOW (0) -`define DV_REG_NONSTICKYDATAVAULTCTRL_3_LOCK_ENTRY_MASK (32'h1) -`define CLP_DV_REG_NONSTICKYDATAVAULTCTRL_4 (32'h1001c218) -`define DV_REG_NONSTICKYDATAVAULTCTRL_4 (32'h218) -`define DV_REG_NONSTICKYDATAVAULTCTRL_4_LOCK_ENTRY_LOW (0) -`define DV_REG_NONSTICKYDATAVAULTCTRL_4_LOCK_ENTRY_MASK (32'h1) -`define CLP_DV_REG_NONSTICKYDATAVAULTCTRL_5 (32'h1001c21c) -`define DV_REG_NONSTICKYDATAVAULTCTRL_5 (32'h21c) -`define DV_REG_NONSTICKYDATAVAULTCTRL_5_LOCK_ENTRY_LOW (0) -`define DV_REG_NONSTICKYDATAVAULTCTRL_5_LOCK_ENTRY_MASK (32'h1) -`define CLP_DV_REG_NONSTICKYDATAVAULTCTRL_6 (32'h1001c220) -`define DV_REG_NONSTICKYDATAVAULTCTRL_6 (32'h220) -`define DV_REG_NONSTICKYDATAVAULTCTRL_6_LOCK_ENTRY_LOW (0) -`define DV_REG_NONSTICKYDATAVAULTCTRL_6_LOCK_ENTRY_MASK (32'h1) -`define CLP_DV_REG_NONSTICKYDATAVAULTCTRL_7 (32'h1001c224) -`define DV_REG_NONSTICKYDATAVAULTCTRL_7 (32'h224) -`define DV_REG_NONSTICKYDATAVAULTCTRL_7_LOCK_ENTRY_LOW (0) -`define DV_REG_NONSTICKYDATAVAULTCTRL_7_LOCK_ENTRY_MASK (32'h1) -`define CLP_DV_REG_NONSTICKYDATAVAULTCTRL_8 (32'h1001c228) -`define DV_REG_NONSTICKYDATAVAULTCTRL_8 (32'h228) -`define DV_REG_NONSTICKYDATAVAULTCTRL_8_LOCK_ENTRY_LOW (0) -`define DV_REG_NONSTICKYDATAVAULTCTRL_8_LOCK_ENTRY_MASK (32'h1) -`define CLP_DV_REG_NONSTICKYDATAVAULTCTRL_9 (32'h1001c22c) -`define DV_REG_NONSTICKYDATAVAULTCTRL_9 (32'h22c) -`define DV_REG_NONSTICKYDATAVAULTCTRL_9_LOCK_ENTRY_LOW (0) -`define DV_REG_NONSTICKYDATAVAULTCTRL_9_LOCK_ENTRY_MASK (32'h1) -`define CLP_DV_REG_NONSTICKY_DATA_VAULT_ENTRY_0_0 (32'h1001c230) -`define DV_REG_NONSTICKY_DATA_VAULT_ENTRY_0_0 (32'h230) -`define CLP_DV_REG_NONSTICKY_DATA_VAULT_ENTRY_0_1 (32'h1001c234) -`define DV_REG_NONSTICKY_DATA_VAULT_ENTRY_0_1 (32'h234) -`define CLP_DV_REG_NONSTICKY_DATA_VAULT_ENTRY_0_2 (32'h1001c238) -`define DV_REG_NONSTICKY_DATA_VAULT_ENTRY_0_2 (32'h238) -`define CLP_DV_REG_NONSTICKY_DATA_VAULT_ENTRY_0_3 (32'h1001c23c) -`define DV_REG_NONSTICKY_DATA_VAULT_ENTRY_0_3 (32'h23c) -`define CLP_DV_REG_NONSTICKY_DATA_VAULT_ENTRY_0_4 (32'h1001c240) -`define DV_REG_NONSTICKY_DATA_VAULT_ENTRY_0_4 (32'h240) -`define CLP_DV_REG_NONSTICKY_DATA_VAULT_ENTRY_0_5 (32'h1001c244) -`define DV_REG_NONSTICKY_DATA_VAULT_ENTRY_0_5 (32'h244) -`define CLP_DV_REG_NONSTICKY_DATA_VAULT_ENTRY_0_6 (32'h1001c248) -`define DV_REG_NONSTICKY_DATA_VAULT_ENTRY_0_6 (32'h248) -`define CLP_DV_REG_NONSTICKY_DATA_VAULT_ENTRY_0_7 (32'h1001c24c) -`define DV_REG_NONSTICKY_DATA_VAULT_ENTRY_0_7 (32'h24c) -`define CLP_DV_REG_NONSTICKY_DATA_VAULT_ENTRY_0_8 (32'h1001c250) -`define DV_REG_NONSTICKY_DATA_VAULT_ENTRY_0_8 (32'h250) -`define CLP_DV_REG_NONSTICKY_DATA_VAULT_ENTRY_0_9 (32'h1001c254) -`define DV_REG_NONSTICKY_DATA_VAULT_ENTRY_0_9 (32'h254) -`define CLP_DV_REG_NONSTICKY_DATA_VAULT_ENTRY_0_10 (32'h1001c258) -`define DV_REG_NONSTICKY_DATA_VAULT_ENTRY_0_10 (32'h258) -`define CLP_DV_REG_NONSTICKY_DATA_VAULT_ENTRY_0_11 (32'h1001c25c) -`define DV_REG_NONSTICKY_DATA_VAULT_ENTRY_0_11 (32'h25c) -`define CLP_DV_REG_NONSTICKY_DATA_VAULT_ENTRY_1_0 (32'h1001c260) -`define DV_REG_NONSTICKY_DATA_VAULT_ENTRY_1_0 (32'h260) -`define CLP_DV_REG_NONSTICKY_DATA_VAULT_ENTRY_1_1 (32'h1001c264) -`define DV_REG_NONSTICKY_DATA_VAULT_ENTRY_1_1 (32'h264) -`define CLP_DV_REG_NONSTICKY_DATA_VAULT_ENTRY_1_2 (32'h1001c268) -`define DV_REG_NONSTICKY_DATA_VAULT_ENTRY_1_2 (32'h268) -`define CLP_DV_REG_NONSTICKY_DATA_VAULT_ENTRY_1_3 (32'h1001c26c) -`define DV_REG_NONSTICKY_DATA_VAULT_ENTRY_1_3 (32'h26c) -`define CLP_DV_REG_NONSTICKY_DATA_VAULT_ENTRY_1_4 (32'h1001c270) -`define DV_REG_NONSTICKY_DATA_VAULT_ENTRY_1_4 (32'h270) -`define CLP_DV_REG_NONSTICKY_DATA_VAULT_ENTRY_1_5 (32'h1001c274) -`define DV_REG_NONSTICKY_DATA_VAULT_ENTRY_1_5 (32'h274) -`define CLP_DV_REG_NONSTICKY_DATA_VAULT_ENTRY_1_6 (32'h1001c278) -`define DV_REG_NONSTICKY_DATA_VAULT_ENTRY_1_6 (32'h278) -`define CLP_DV_REG_NONSTICKY_DATA_VAULT_ENTRY_1_7 (32'h1001c27c) -`define DV_REG_NONSTICKY_DATA_VAULT_ENTRY_1_7 (32'h27c) -`define CLP_DV_REG_NONSTICKY_DATA_VAULT_ENTRY_1_8 (32'h1001c280) -`define DV_REG_NONSTICKY_DATA_VAULT_ENTRY_1_8 (32'h280) -`define CLP_DV_REG_NONSTICKY_DATA_VAULT_ENTRY_1_9 (32'h1001c284) -`define DV_REG_NONSTICKY_DATA_VAULT_ENTRY_1_9 (32'h284) -`define CLP_DV_REG_NONSTICKY_DATA_VAULT_ENTRY_1_10 (32'h1001c288) -`define DV_REG_NONSTICKY_DATA_VAULT_ENTRY_1_10 (32'h288) -`define CLP_DV_REG_NONSTICKY_DATA_VAULT_ENTRY_1_11 (32'h1001c28c) -`define DV_REG_NONSTICKY_DATA_VAULT_ENTRY_1_11 (32'h28c) -`define CLP_DV_REG_NONSTICKY_DATA_VAULT_ENTRY_2_0 (32'h1001c290) -`define DV_REG_NONSTICKY_DATA_VAULT_ENTRY_2_0 (32'h290) -`define CLP_DV_REG_NONSTICKY_DATA_VAULT_ENTRY_2_1 (32'h1001c294) -`define DV_REG_NONSTICKY_DATA_VAULT_ENTRY_2_1 (32'h294) -`define CLP_DV_REG_NONSTICKY_DATA_VAULT_ENTRY_2_2 (32'h1001c298) -`define DV_REG_NONSTICKY_DATA_VAULT_ENTRY_2_2 (32'h298) -`define CLP_DV_REG_NONSTICKY_DATA_VAULT_ENTRY_2_3 (32'h1001c29c) -`define DV_REG_NONSTICKY_DATA_VAULT_ENTRY_2_3 (32'h29c) -`define CLP_DV_REG_NONSTICKY_DATA_VAULT_ENTRY_2_4 (32'h1001c2a0) -`define DV_REG_NONSTICKY_DATA_VAULT_ENTRY_2_4 (32'h2a0) -`define CLP_DV_REG_NONSTICKY_DATA_VAULT_ENTRY_2_5 (32'h1001c2a4) -`define DV_REG_NONSTICKY_DATA_VAULT_ENTRY_2_5 (32'h2a4) -`define CLP_DV_REG_NONSTICKY_DATA_VAULT_ENTRY_2_6 (32'h1001c2a8) -`define DV_REG_NONSTICKY_DATA_VAULT_ENTRY_2_6 (32'h2a8) -`define CLP_DV_REG_NONSTICKY_DATA_VAULT_ENTRY_2_7 (32'h1001c2ac) -`define DV_REG_NONSTICKY_DATA_VAULT_ENTRY_2_7 (32'h2ac) -`define CLP_DV_REG_NONSTICKY_DATA_VAULT_ENTRY_2_8 (32'h1001c2b0) -`define DV_REG_NONSTICKY_DATA_VAULT_ENTRY_2_8 (32'h2b0) -`define CLP_DV_REG_NONSTICKY_DATA_VAULT_ENTRY_2_9 (32'h1001c2b4) -`define DV_REG_NONSTICKY_DATA_VAULT_ENTRY_2_9 (32'h2b4) -`define CLP_DV_REG_NONSTICKY_DATA_VAULT_ENTRY_2_10 (32'h1001c2b8) -`define DV_REG_NONSTICKY_DATA_VAULT_ENTRY_2_10 (32'h2b8) -`define CLP_DV_REG_NONSTICKY_DATA_VAULT_ENTRY_2_11 (32'h1001c2bc) -`define DV_REG_NONSTICKY_DATA_VAULT_ENTRY_2_11 (32'h2bc) -`define CLP_DV_REG_NONSTICKY_DATA_VAULT_ENTRY_3_0 (32'h1001c2c0) -`define DV_REG_NONSTICKY_DATA_VAULT_ENTRY_3_0 (32'h2c0) -`define CLP_DV_REG_NONSTICKY_DATA_VAULT_ENTRY_3_1 (32'h1001c2c4) -`define DV_REG_NONSTICKY_DATA_VAULT_ENTRY_3_1 (32'h2c4) -`define CLP_DV_REG_NONSTICKY_DATA_VAULT_ENTRY_3_2 (32'h1001c2c8) -`define DV_REG_NONSTICKY_DATA_VAULT_ENTRY_3_2 (32'h2c8) -`define CLP_DV_REG_NONSTICKY_DATA_VAULT_ENTRY_3_3 (32'h1001c2cc) -`define DV_REG_NONSTICKY_DATA_VAULT_ENTRY_3_3 (32'h2cc) -`define CLP_DV_REG_NONSTICKY_DATA_VAULT_ENTRY_3_4 (32'h1001c2d0) -`define DV_REG_NONSTICKY_DATA_VAULT_ENTRY_3_4 (32'h2d0) -`define CLP_DV_REG_NONSTICKY_DATA_VAULT_ENTRY_3_5 (32'h1001c2d4) -`define DV_REG_NONSTICKY_DATA_VAULT_ENTRY_3_5 (32'h2d4) -`define CLP_DV_REG_NONSTICKY_DATA_VAULT_ENTRY_3_6 (32'h1001c2d8) -`define DV_REG_NONSTICKY_DATA_VAULT_ENTRY_3_6 (32'h2d8) -`define CLP_DV_REG_NONSTICKY_DATA_VAULT_ENTRY_3_7 (32'h1001c2dc) -`define DV_REG_NONSTICKY_DATA_VAULT_ENTRY_3_7 (32'h2dc) -`define CLP_DV_REG_NONSTICKY_DATA_VAULT_ENTRY_3_8 (32'h1001c2e0) -`define DV_REG_NONSTICKY_DATA_VAULT_ENTRY_3_8 (32'h2e0) -`define CLP_DV_REG_NONSTICKY_DATA_VAULT_ENTRY_3_9 (32'h1001c2e4) -`define DV_REG_NONSTICKY_DATA_VAULT_ENTRY_3_9 (32'h2e4) -`define CLP_DV_REG_NONSTICKY_DATA_VAULT_ENTRY_3_10 (32'h1001c2e8) -`define DV_REG_NONSTICKY_DATA_VAULT_ENTRY_3_10 (32'h2e8) -`define CLP_DV_REG_NONSTICKY_DATA_VAULT_ENTRY_3_11 (32'h1001c2ec) -`define DV_REG_NONSTICKY_DATA_VAULT_ENTRY_3_11 (32'h2ec) -`define CLP_DV_REG_NONSTICKY_DATA_VAULT_ENTRY_4_0 (32'h1001c2f0) -`define DV_REG_NONSTICKY_DATA_VAULT_ENTRY_4_0 (32'h2f0) -`define CLP_DV_REG_NONSTICKY_DATA_VAULT_ENTRY_4_1 (32'h1001c2f4) -`define DV_REG_NONSTICKY_DATA_VAULT_ENTRY_4_1 (32'h2f4) -`define CLP_DV_REG_NONSTICKY_DATA_VAULT_ENTRY_4_2 (32'h1001c2f8) -`define DV_REG_NONSTICKY_DATA_VAULT_ENTRY_4_2 (32'h2f8) -`define CLP_DV_REG_NONSTICKY_DATA_VAULT_ENTRY_4_3 (32'h1001c2fc) -`define DV_REG_NONSTICKY_DATA_VAULT_ENTRY_4_3 (32'h2fc) -`define CLP_DV_REG_NONSTICKY_DATA_VAULT_ENTRY_4_4 (32'h1001c300) -`define DV_REG_NONSTICKY_DATA_VAULT_ENTRY_4_4 (32'h300) -`define CLP_DV_REG_NONSTICKY_DATA_VAULT_ENTRY_4_5 (32'h1001c304) -`define DV_REG_NONSTICKY_DATA_VAULT_ENTRY_4_5 (32'h304) -`define CLP_DV_REG_NONSTICKY_DATA_VAULT_ENTRY_4_6 (32'h1001c308) -`define DV_REG_NONSTICKY_DATA_VAULT_ENTRY_4_6 (32'h308) -`define CLP_DV_REG_NONSTICKY_DATA_VAULT_ENTRY_4_7 (32'h1001c30c) -`define DV_REG_NONSTICKY_DATA_VAULT_ENTRY_4_7 (32'h30c) -`define CLP_DV_REG_NONSTICKY_DATA_VAULT_ENTRY_4_8 (32'h1001c310) -`define DV_REG_NONSTICKY_DATA_VAULT_ENTRY_4_8 (32'h310) -`define CLP_DV_REG_NONSTICKY_DATA_VAULT_ENTRY_4_9 (32'h1001c314) -`define DV_REG_NONSTICKY_DATA_VAULT_ENTRY_4_9 (32'h314) -`define CLP_DV_REG_NONSTICKY_DATA_VAULT_ENTRY_4_10 (32'h1001c318) -`define DV_REG_NONSTICKY_DATA_VAULT_ENTRY_4_10 (32'h318) -`define CLP_DV_REG_NONSTICKY_DATA_VAULT_ENTRY_4_11 (32'h1001c31c) -`define DV_REG_NONSTICKY_DATA_VAULT_ENTRY_4_11 (32'h31c) -`define CLP_DV_REG_NONSTICKY_DATA_VAULT_ENTRY_5_0 (32'h1001c320) -`define DV_REG_NONSTICKY_DATA_VAULT_ENTRY_5_0 (32'h320) -`define CLP_DV_REG_NONSTICKY_DATA_VAULT_ENTRY_5_1 (32'h1001c324) -`define DV_REG_NONSTICKY_DATA_VAULT_ENTRY_5_1 (32'h324) -`define CLP_DV_REG_NONSTICKY_DATA_VAULT_ENTRY_5_2 (32'h1001c328) -`define DV_REG_NONSTICKY_DATA_VAULT_ENTRY_5_2 (32'h328) -`define CLP_DV_REG_NONSTICKY_DATA_VAULT_ENTRY_5_3 (32'h1001c32c) -`define DV_REG_NONSTICKY_DATA_VAULT_ENTRY_5_3 (32'h32c) -`define CLP_DV_REG_NONSTICKY_DATA_VAULT_ENTRY_5_4 (32'h1001c330) -`define DV_REG_NONSTICKY_DATA_VAULT_ENTRY_5_4 (32'h330) -`define CLP_DV_REG_NONSTICKY_DATA_VAULT_ENTRY_5_5 (32'h1001c334) -`define DV_REG_NONSTICKY_DATA_VAULT_ENTRY_5_5 (32'h334) -`define CLP_DV_REG_NONSTICKY_DATA_VAULT_ENTRY_5_6 (32'h1001c338) -`define DV_REG_NONSTICKY_DATA_VAULT_ENTRY_5_6 (32'h338) -`define CLP_DV_REG_NONSTICKY_DATA_VAULT_ENTRY_5_7 (32'h1001c33c) -`define DV_REG_NONSTICKY_DATA_VAULT_ENTRY_5_7 (32'h33c) -`define CLP_DV_REG_NONSTICKY_DATA_VAULT_ENTRY_5_8 (32'h1001c340) -`define DV_REG_NONSTICKY_DATA_VAULT_ENTRY_5_8 (32'h340) -`define CLP_DV_REG_NONSTICKY_DATA_VAULT_ENTRY_5_9 (32'h1001c344) -`define DV_REG_NONSTICKY_DATA_VAULT_ENTRY_5_9 (32'h344) -`define CLP_DV_REG_NONSTICKY_DATA_VAULT_ENTRY_5_10 (32'h1001c348) -`define DV_REG_NONSTICKY_DATA_VAULT_ENTRY_5_10 (32'h348) -`define CLP_DV_REG_NONSTICKY_DATA_VAULT_ENTRY_5_11 (32'h1001c34c) -`define DV_REG_NONSTICKY_DATA_VAULT_ENTRY_5_11 (32'h34c) -`define CLP_DV_REG_NONSTICKY_DATA_VAULT_ENTRY_6_0 (32'h1001c350) -`define DV_REG_NONSTICKY_DATA_VAULT_ENTRY_6_0 (32'h350) -`define CLP_DV_REG_NONSTICKY_DATA_VAULT_ENTRY_6_1 (32'h1001c354) -`define DV_REG_NONSTICKY_DATA_VAULT_ENTRY_6_1 (32'h354) -`define CLP_DV_REG_NONSTICKY_DATA_VAULT_ENTRY_6_2 (32'h1001c358) -`define DV_REG_NONSTICKY_DATA_VAULT_ENTRY_6_2 (32'h358) -`define CLP_DV_REG_NONSTICKY_DATA_VAULT_ENTRY_6_3 (32'h1001c35c) -`define DV_REG_NONSTICKY_DATA_VAULT_ENTRY_6_3 (32'h35c) -`define CLP_DV_REG_NONSTICKY_DATA_VAULT_ENTRY_6_4 (32'h1001c360) -`define DV_REG_NONSTICKY_DATA_VAULT_ENTRY_6_4 (32'h360) -`define CLP_DV_REG_NONSTICKY_DATA_VAULT_ENTRY_6_5 (32'h1001c364) -`define DV_REG_NONSTICKY_DATA_VAULT_ENTRY_6_5 (32'h364) -`define CLP_DV_REG_NONSTICKY_DATA_VAULT_ENTRY_6_6 (32'h1001c368) -`define DV_REG_NONSTICKY_DATA_VAULT_ENTRY_6_6 (32'h368) -`define CLP_DV_REG_NONSTICKY_DATA_VAULT_ENTRY_6_7 (32'h1001c36c) -`define DV_REG_NONSTICKY_DATA_VAULT_ENTRY_6_7 (32'h36c) -`define CLP_DV_REG_NONSTICKY_DATA_VAULT_ENTRY_6_8 (32'h1001c370) -`define DV_REG_NONSTICKY_DATA_VAULT_ENTRY_6_8 (32'h370) -`define CLP_DV_REG_NONSTICKY_DATA_VAULT_ENTRY_6_9 (32'h1001c374) -`define DV_REG_NONSTICKY_DATA_VAULT_ENTRY_6_9 (32'h374) -`define CLP_DV_REG_NONSTICKY_DATA_VAULT_ENTRY_6_10 (32'h1001c378) -`define DV_REG_NONSTICKY_DATA_VAULT_ENTRY_6_10 (32'h378) -`define CLP_DV_REG_NONSTICKY_DATA_VAULT_ENTRY_6_11 (32'h1001c37c) -`define DV_REG_NONSTICKY_DATA_VAULT_ENTRY_6_11 (32'h37c) -`define CLP_DV_REG_NONSTICKY_DATA_VAULT_ENTRY_7_0 (32'h1001c380) -`define DV_REG_NONSTICKY_DATA_VAULT_ENTRY_7_0 (32'h380) -`define CLP_DV_REG_NONSTICKY_DATA_VAULT_ENTRY_7_1 (32'h1001c384) -`define DV_REG_NONSTICKY_DATA_VAULT_ENTRY_7_1 (32'h384) -`define CLP_DV_REG_NONSTICKY_DATA_VAULT_ENTRY_7_2 (32'h1001c388) -`define DV_REG_NONSTICKY_DATA_VAULT_ENTRY_7_2 (32'h388) -`define CLP_DV_REG_NONSTICKY_DATA_VAULT_ENTRY_7_3 (32'h1001c38c) -`define DV_REG_NONSTICKY_DATA_VAULT_ENTRY_7_3 (32'h38c) -`define CLP_DV_REG_NONSTICKY_DATA_VAULT_ENTRY_7_4 (32'h1001c390) -`define DV_REG_NONSTICKY_DATA_VAULT_ENTRY_7_4 (32'h390) -`define CLP_DV_REG_NONSTICKY_DATA_VAULT_ENTRY_7_5 (32'h1001c394) -`define DV_REG_NONSTICKY_DATA_VAULT_ENTRY_7_5 (32'h394) -`define CLP_DV_REG_NONSTICKY_DATA_VAULT_ENTRY_7_6 (32'h1001c398) -`define DV_REG_NONSTICKY_DATA_VAULT_ENTRY_7_6 (32'h398) -`define CLP_DV_REG_NONSTICKY_DATA_VAULT_ENTRY_7_7 (32'h1001c39c) -`define DV_REG_NONSTICKY_DATA_VAULT_ENTRY_7_7 (32'h39c) -`define CLP_DV_REG_NONSTICKY_DATA_VAULT_ENTRY_7_8 (32'h1001c3a0) -`define DV_REG_NONSTICKY_DATA_VAULT_ENTRY_7_8 (32'h3a0) -`define CLP_DV_REG_NONSTICKY_DATA_VAULT_ENTRY_7_9 (32'h1001c3a4) -`define DV_REG_NONSTICKY_DATA_VAULT_ENTRY_7_9 (32'h3a4) -`define CLP_DV_REG_NONSTICKY_DATA_VAULT_ENTRY_7_10 (32'h1001c3a8) -`define DV_REG_NONSTICKY_DATA_VAULT_ENTRY_7_10 (32'h3a8) -`define CLP_DV_REG_NONSTICKY_DATA_VAULT_ENTRY_7_11 (32'h1001c3ac) -`define DV_REG_NONSTICKY_DATA_VAULT_ENTRY_7_11 (32'h3ac) -`define CLP_DV_REG_NONSTICKY_DATA_VAULT_ENTRY_8_0 (32'h1001c3b0) -`define DV_REG_NONSTICKY_DATA_VAULT_ENTRY_8_0 (32'h3b0) -`define CLP_DV_REG_NONSTICKY_DATA_VAULT_ENTRY_8_1 (32'h1001c3b4) -`define DV_REG_NONSTICKY_DATA_VAULT_ENTRY_8_1 (32'h3b4) -`define CLP_DV_REG_NONSTICKY_DATA_VAULT_ENTRY_8_2 (32'h1001c3b8) -`define DV_REG_NONSTICKY_DATA_VAULT_ENTRY_8_2 (32'h3b8) -`define CLP_DV_REG_NONSTICKY_DATA_VAULT_ENTRY_8_3 (32'h1001c3bc) -`define DV_REG_NONSTICKY_DATA_VAULT_ENTRY_8_3 (32'h3bc) -`define CLP_DV_REG_NONSTICKY_DATA_VAULT_ENTRY_8_4 (32'h1001c3c0) -`define DV_REG_NONSTICKY_DATA_VAULT_ENTRY_8_4 (32'h3c0) -`define CLP_DV_REG_NONSTICKY_DATA_VAULT_ENTRY_8_5 (32'h1001c3c4) -`define DV_REG_NONSTICKY_DATA_VAULT_ENTRY_8_5 (32'h3c4) -`define CLP_DV_REG_NONSTICKY_DATA_VAULT_ENTRY_8_6 (32'h1001c3c8) -`define DV_REG_NONSTICKY_DATA_VAULT_ENTRY_8_6 (32'h3c8) -`define CLP_DV_REG_NONSTICKY_DATA_VAULT_ENTRY_8_7 (32'h1001c3cc) -`define DV_REG_NONSTICKY_DATA_VAULT_ENTRY_8_7 (32'h3cc) -`define CLP_DV_REG_NONSTICKY_DATA_VAULT_ENTRY_8_8 (32'h1001c3d0) -`define DV_REG_NONSTICKY_DATA_VAULT_ENTRY_8_8 (32'h3d0) -`define CLP_DV_REG_NONSTICKY_DATA_VAULT_ENTRY_8_9 (32'h1001c3d4) -`define DV_REG_NONSTICKY_DATA_VAULT_ENTRY_8_9 (32'h3d4) -`define CLP_DV_REG_NONSTICKY_DATA_VAULT_ENTRY_8_10 (32'h1001c3d8) -`define DV_REG_NONSTICKY_DATA_VAULT_ENTRY_8_10 (32'h3d8) -`define CLP_DV_REG_NONSTICKY_DATA_VAULT_ENTRY_8_11 (32'h1001c3dc) -`define DV_REG_NONSTICKY_DATA_VAULT_ENTRY_8_11 (32'h3dc) -`define CLP_DV_REG_NONSTICKY_DATA_VAULT_ENTRY_9_0 (32'h1001c3e0) -`define DV_REG_NONSTICKY_DATA_VAULT_ENTRY_9_0 (32'h3e0) -`define CLP_DV_REG_NONSTICKY_DATA_VAULT_ENTRY_9_1 (32'h1001c3e4) -`define DV_REG_NONSTICKY_DATA_VAULT_ENTRY_9_1 (32'h3e4) -`define CLP_DV_REG_NONSTICKY_DATA_VAULT_ENTRY_9_2 (32'h1001c3e8) -`define DV_REG_NONSTICKY_DATA_VAULT_ENTRY_9_2 (32'h3e8) -`define CLP_DV_REG_NONSTICKY_DATA_VAULT_ENTRY_9_3 (32'h1001c3ec) -`define DV_REG_NONSTICKY_DATA_VAULT_ENTRY_9_3 (32'h3ec) -`define CLP_DV_REG_NONSTICKY_DATA_VAULT_ENTRY_9_4 (32'h1001c3f0) -`define DV_REG_NONSTICKY_DATA_VAULT_ENTRY_9_4 (32'h3f0) -`define CLP_DV_REG_NONSTICKY_DATA_VAULT_ENTRY_9_5 (32'h1001c3f4) -`define DV_REG_NONSTICKY_DATA_VAULT_ENTRY_9_5 (32'h3f4) -`define CLP_DV_REG_NONSTICKY_DATA_VAULT_ENTRY_9_6 (32'h1001c3f8) -`define DV_REG_NONSTICKY_DATA_VAULT_ENTRY_9_6 (32'h3f8) -`define CLP_DV_REG_NONSTICKY_DATA_VAULT_ENTRY_9_7 (32'h1001c3fc) -`define DV_REG_NONSTICKY_DATA_VAULT_ENTRY_9_7 (32'h3fc) -`define CLP_DV_REG_NONSTICKY_DATA_VAULT_ENTRY_9_8 (32'h1001c400) -`define DV_REG_NONSTICKY_DATA_VAULT_ENTRY_9_8 (32'h400) -`define CLP_DV_REG_NONSTICKY_DATA_VAULT_ENTRY_9_9 (32'h1001c404) -`define DV_REG_NONSTICKY_DATA_VAULT_ENTRY_9_9 (32'h404) -`define CLP_DV_REG_NONSTICKY_DATA_VAULT_ENTRY_9_10 (32'h1001c408) -`define DV_REG_NONSTICKY_DATA_VAULT_ENTRY_9_10 (32'h408) -`define CLP_DV_REG_NONSTICKY_DATA_VAULT_ENTRY_9_11 (32'h1001c40c) -`define DV_REG_NONSTICKY_DATA_VAULT_ENTRY_9_11 (32'h40c) -`define CLP_DV_REG_NONSTICKYLOCKABLESCRATCHREGCTRL_0 (32'h1001c410) -`define DV_REG_NONSTICKYLOCKABLESCRATCHREGCTRL_0 (32'h410) -`define DV_REG_NONSTICKYLOCKABLESCRATCHREGCTRL_0_LOCK_ENTRY_LOW (0) -`define DV_REG_NONSTICKYLOCKABLESCRATCHREGCTRL_0_LOCK_ENTRY_MASK (32'h1) -`define CLP_DV_REG_NONSTICKYLOCKABLESCRATCHREGCTRL_1 (32'h1001c414) -`define DV_REG_NONSTICKYLOCKABLESCRATCHREGCTRL_1 (32'h414) -`define DV_REG_NONSTICKYLOCKABLESCRATCHREGCTRL_1_LOCK_ENTRY_LOW (0) -`define DV_REG_NONSTICKYLOCKABLESCRATCHREGCTRL_1_LOCK_ENTRY_MASK (32'h1) -`define CLP_DV_REG_NONSTICKYLOCKABLESCRATCHREGCTRL_2 (32'h1001c418) -`define DV_REG_NONSTICKYLOCKABLESCRATCHREGCTRL_2 (32'h418) -`define DV_REG_NONSTICKYLOCKABLESCRATCHREGCTRL_2_LOCK_ENTRY_LOW (0) -`define DV_REG_NONSTICKYLOCKABLESCRATCHREGCTRL_2_LOCK_ENTRY_MASK (32'h1) -`define CLP_DV_REG_NONSTICKYLOCKABLESCRATCHREGCTRL_3 (32'h1001c41c) -`define DV_REG_NONSTICKYLOCKABLESCRATCHREGCTRL_3 (32'h41c) -`define DV_REG_NONSTICKYLOCKABLESCRATCHREGCTRL_3_LOCK_ENTRY_LOW (0) -`define DV_REG_NONSTICKYLOCKABLESCRATCHREGCTRL_3_LOCK_ENTRY_MASK (32'h1) -`define CLP_DV_REG_NONSTICKYLOCKABLESCRATCHREGCTRL_4 (32'h1001c420) -`define DV_REG_NONSTICKYLOCKABLESCRATCHREGCTRL_4 (32'h420) -`define DV_REG_NONSTICKYLOCKABLESCRATCHREGCTRL_4_LOCK_ENTRY_LOW (0) -`define DV_REG_NONSTICKYLOCKABLESCRATCHREGCTRL_4_LOCK_ENTRY_MASK (32'h1) -`define CLP_DV_REG_NONSTICKYLOCKABLESCRATCHREGCTRL_5 (32'h1001c424) -`define DV_REG_NONSTICKYLOCKABLESCRATCHREGCTRL_5 (32'h424) -`define DV_REG_NONSTICKYLOCKABLESCRATCHREGCTRL_5_LOCK_ENTRY_LOW (0) -`define DV_REG_NONSTICKYLOCKABLESCRATCHREGCTRL_5_LOCK_ENTRY_MASK (32'h1) -`define CLP_DV_REG_NONSTICKYLOCKABLESCRATCHREGCTRL_6 (32'h1001c428) -`define DV_REG_NONSTICKYLOCKABLESCRATCHREGCTRL_6 (32'h428) -`define DV_REG_NONSTICKYLOCKABLESCRATCHREGCTRL_6_LOCK_ENTRY_LOW (0) -`define DV_REG_NONSTICKYLOCKABLESCRATCHREGCTRL_6_LOCK_ENTRY_MASK (32'h1) -`define CLP_DV_REG_NONSTICKYLOCKABLESCRATCHREGCTRL_7 (32'h1001c42c) -`define DV_REG_NONSTICKYLOCKABLESCRATCHREGCTRL_7 (32'h42c) -`define DV_REG_NONSTICKYLOCKABLESCRATCHREGCTRL_7_LOCK_ENTRY_LOW (0) -`define DV_REG_NONSTICKYLOCKABLESCRATCHREGCTRL_7_LOCK_ENTRY_MASK (32'h1) -`define CLP_DV_REG_NONSTICKYLOCKABLESCRATCHREGCTRL_8 (32'h1001c430) -`define DV_REG_NONSTICKYLOCKABLESCRATCHREGCTRL_8 (32'h430) -`define DV_REG_NONSTICKYLOCKABLESCRATCHREGCTRL_8_LOCK_ENTRY_LOW (0) -`define DV_REG_NONSTICKYLOCKABLESCRATCHREGCTRL_8_LOCK_ENTRY_MASK (32'h1) -`define CLP_DV_REG_NONSTICKYLOCKABLESCRATCHREGCTRL_9 (32'h1001c434) -`define DV_REG_NONSTICKYLOCKABLESCRATCHREGCTRL_9 (32'h434) -`define DV_REG_NONSTICKYLOCKABLESCRATCHREGCTRL_9_LOCK_ENTRY_LOW (0) -`define DV_REG_NONSTICKYLOCKABLESCRATCHREGCTRL_9_LOCK_ENTRY_MASK (32'h1) -`define CLP_DV_REG_NONSTICKYLOCKABLESCRATCHREG_0 (32'h1001c438) -`define DV_REG_NONSTICKYLOCKABLESCRATCHREG_0 (32'h438) -`define CLP_DV_REG_NONSTICKYLOCKABLESCRATCHREG_1 (32'h1001c43c) -`define DV_REG_NONSTICKYLOCKABLESCRATCHREG_1 (32'h43c) -`define CLP_DV_REG_NONSTICKYLOCKABLESCRATCHREG_2 (32'h1001c440) -`define DV_REG_NONSTICKYLOCKABLESCRATCHREG_2 (32'h440) -`define CLP_DV_REG_NONSTICKYLOCKABLESCRATCHREG_3 (32'h1001c444) -`define DV_REG_NONSTICKYLOCKABLESCRATCHREG_3 (32'h444) -`define CLP_DV_REG_NONSTICKYLOCKABLESCRATCHREG_4 (32'h1001c448) -`define DV_REG_NONSTICKYLOCKABLESCRATCHREG_4 (32'h448) -`define CLP_DV_REG_NONSTICKYLOCKABLESCRATCHREG_5 (32'h1001c44c) -`define DV_REG_NONSTICKYLOCKABLESCRATCHREG_5 (32'h44c) -`define CLP_DV_REG_NONSTICKYLOCKABLESCRATCHREG_6 (32'h1001c450) -`define DV_REG_NONSTICKYLOCKABLESCRATCHREG_6 (32'h450) -`define CLP_DV_REG_NONSTICKYLOCKABLESCRATCHREG_7 (32'h1001c454) -`define DV_REG_NONSTICKYLOCKABLESCRATCHREG_7 (32'h454) -`define CLP_DV_REG_NONSTICKYLOCKABLESCRATCHREG_8 (32'h1001c458) -`define DV_REG_NONSTICKYLOCKABLESCRATCHREG_8 (32'h458) -`define CLP_DV_REG_NONSTICKYLOCKABLESCRATCHREG_9 (32'h1001c45c) -`define DV_REG_NONSTICKYLOCKABLESCRATCHREG_9 (32'h45c) +`define CLP_DV_REG_DATAVAULTCTRL_0 (32'h1001c208) +`define DV_REG_DATAVAULTCTRL_0 (32'h208) +`define DV_REG_DATAVAULTCTRL_0_LOCK_ENTRY_LOW (0) +`define DV_REG_DATAVAULTCTRL_0_LOCK_ENTRY_MASK (32'h1) +`define CLP_DV_REG_DATAVAULTCTRL_1 (32'h1001c20c) +`define DV_REG_DATAVAULTCTRL_1 (32'h20c) +`define DV_REG_DATAVAULTCTRL_1_LOCK_ENTRY_LOW (0) +`define DV_REG_DATAVAULTCTRL_1_LOCK_ENTRY_MASK (32'h1) +`define CLP_DV_REG_DATAVAULTCTRL_2 (32'h1001c210) +`define DV_REG_DATAVAULTCTRL_2 (32'h210) +`define DV_REG_DATAVAULTCTRL_2_LOCK_ENTRY_LOW (0) +`define DV_REG_DATAVAULTCTRL_2_LOCK_ENTRY_MASK (32'h1) +`define CLP_DV_REG_DATAVAULTCTRL_3 (32'h1001c214) +`define DV_REG_DATAVAULTCTRL_3 (32'h214) +`define DV_REG_DATAVAULTCTRL_3_LOCK_ENTRY_LOW (0) +`define DV_REG_DATAVAULTCTRL_3_LOCK_ENTRY_MASK (32'h1) +`define CLP_DV_REG_DATAVAULTCTRL_4 (32'h1001c218) +`define DV_REG_DATAVAULTCTRL_4 (32'h218) +`define DV_REG_DATAVAULTCTRL_4_LOCK_ENTRY_LOW (0) +`define DV_REG_DATAVAULTCTRL_4_LOCK_ENTRY_MASK (32'h1) +`define CLP_DV_REG_DATAVAULTCTRL_5 (32'h1001c21c) +`define DV_REG_DATAVAULTCTRL_5 (32'h21c) +`define DV_REG_DATAVAULTCTRL_5_LOCK_ENTRY_LOW (0) +`define DV_REG_DATAVAULTCTRL_5_LOCK_ENTRY_MASK (32'h1) +`define CLP_DV_REG_DATAVAULTCTRL_6 (32'h1001c220) +`define DV_REG_DATAVAULTCTRL_6 (32'h220) +`define DV_REG_DATAVAULTCTRL_6_LOCK_ENTRY_LOW (0) +`define DV_REG_DATAVAULTCTRL_6_LOCK_ENTRY_MASK (32'h1) +`define CLP_DV_REG_DATAVAULTCTRL_7 (32'h1001c224) +`define DV_REG_DATAVAULTCTRL_7 (32'h224) +`define DV_REG_DATAVAULTCTRL_7_LOCK_ENTRY_LOW (0) +`define DV_REG_DATAVAULTCTRL_7_LOCK_ENTRY_MASK (32'h1) +`define CLP_DV_REG_DATAVAULTCTRL_8 (32'h1001c228) +`define DV_REG_DATAVAULTCTRL_8 (32'h228) +`define DV_REG_DATAVAULTCTRL_8_LOCK_ENTRY_LOW (0) +`define DV_REG_DATAVAULTCTRL_8_LOCK_ENTRY_MASK (32'h1) +`define CLP_DV_REG_DATAVAULTCTRL_9 (32'h1001c22c) +`define DV_REG_DATAVAULTCTRL_9 (32'h22c) +`define DV_REG_DATAVAULTCTRL_9_LOCK_ENTRY_LOW (0) +`define DV_REG_DATAVAULTCTRL_9_LOCK_ENTRY_MASK (32'h1) +`define CLP_DV_REG_DATA_VAULT_ENTRY_0_0 (32'h1001c230) +`define DV_REG_DATA_VAULT_ENTRY_0_0 (32'h230) +`define CLP_DV_REG_DATA_VAULT_ENTRY_0_1 (32'h1001c234) +`define DV_REG_DATA_VAULT_ENTRY_0_1 (32'h234) +`define CLP_DV_REG_DATA_VAULT_ENTRY_0_2 (32'h1001c238) +`define DV_REG_DATA_VAULT_ENTRY_0_2 (32'h238) +`define CLP_DV_REG_DATA_VAULT_ENTRY_0_3 (32'h1001c23c) +`define DV_REG_DATA_VAULT_ENTRY_0_3 (32'h23c) +`define CLP_DV_REG_DATA_VAULT_ENTRY_0_4 (32'h1001c240) +`define DV_REG_DATA_VAULT_ENTRY_0_4 (32'h240) +`define CLP_DV_REG_DATA_VAULT_ENTRY_0_5 (32'h1001c244) +`define DV_REG_DATA_VAULT_ENTRY_0_5 (32'h244) +`define CLP_DV_REG_DATA_VAULT_ENTRY_0_6 (32'h1001c248) +`define DV_REG_DATA_VAULT_ENTRY_0_6 (32'h248) +`define CLP_DV_REG_DATA_VAULT_ENTRY_0_7 (32'h1001c24c) +`define DV_REG_DATA_VAULT_ENTRY_0_7 (32'h24c) +`define CLP_DV_REG_DATA_VAULT_ENTRY_0_8 (32'h1001c250) +`define DV_REG_DATA_VAULT_ENTRY_0_8 (32'h250) +`define CLP_DV_REG_DATA_VAULT_ENTRY_0_9 (32'h1001c254) +`define DV_REG_DATA_VAULT_ENTRY_0_9 (32'h254) +`define CLP_DV_REG_DATA_VAULT_ENTRY_0_10 (32'h1001c258) +`define DV_REG_DATA_VAULT_ENTRY_0_10 (32'h258) +`define CLP_DV_REG_DATA_VAULT_ENTRY_0_11 (32'h1001c25c) +`define DV_REG_DATA_VAULT_ENTRY_0_11 (32'h25c) +`define CLP_DV_REG_DATA_VAULT_ENTRY_1_0 (32'h1001c260) +`define DV_REG_DATA_VAULT_ENTRY_1_0 (32'h260) +`define CLP_DV_REG_DATA_VAULT_ENTRY_1_1 (32'h1001c264) +`define DV_REG_DATA_VAULT_ENTRY_1_1 (32'h264) +`define CLP_DV_REG_DATA_VAULT_ENTRY_1_2 (32'h1001c268) +`define DV_REG_DATA_VAULT_ENTRY_1_2 (32'h268) +`define CLP_DV_REG_DATA_VAULT_ENTRY_1_3 (32'h1001c26c) +`define DV_REG_DATA_VAULT_ENTRY_1_3 (32'h26c) +`define CLP_DV_REG_DATA_VAULT_ENTRY_1_4 (32'h1001c270) +`define DV_REG_DATA_VAULT_ENTRY_1_4 (32'h270) +`define CLP_DV_REG_DATA_VAULT_ENTRY_1_5 (32'h1001c274) +`define DV_REG_DATA_VAULT_ENTRY_1_5 (32'h274) +`define CLP_DV_REG_DATA_VAULT_ENTRY_1_6 (32'h1001c278) +`define DV_REG_DATA_VAULT_ENTRY_1_6 (32'h278) +`define CLP_DV_REG_DATA_VAULT_ENTRY_1_7 (32'h1001c27c) +`define DV_REG_DATA_VAULT_ENTRY_1_7 (32'h27c) +`define CLP_DV_REG_DATA_VAULT_ENTRY_1_8 (32'h1001c280) +`define DV_REG_DATA_VAULT_ENTRY_1_8 (32'h280) +`define CLP_DV_REG_DATA_VAULT_ENTRY_1_9 (32'h1001c284) +`define DV_REG_DATA_VAULT_ENTRY_1_9 (32'h284) +`define CLP_DV_REG_DATA_VAULT_ENTRY_1_10 (32'h1001c288) +`define DV_REG_DATA_VAULT_ENTRY_1_10 (32'h288) +`define CLP_DV_REG_DATA_VAULT_ENTRY_1_11 (32'h1001c28c) +`define DV_REG_DATA_VAULT_ENTRY_1_11 (32'h28c) +`define CLP_DV_REG_DATA_VAULT_ENTRY_2_0 (32'h1001c290) +`define DV_REG_DATA_VAULT_ENTRY_2_0 (32'h290) +`define CLP_DV_REG_DATA_VAULT_ENTRY_2_1 (32'h1001c294) +`define DV_REG_DATA_VAULT_ENTRY_2_1 (32'h294) +`define CLP_DV_REG_DATA_VAULT_ENTRY_2_2 (32'h1001c298) +`define DV_REG_DATA_VAULT_ENTRY_2_2 (32'h298) +`define CLP_DV_REG_DATA_VAULT_ENTRY_2_3 (32'h1001c29c) +`define DV_REG_DATA_VAULT_ENTRY_2_3 (32'h29c) +`define CLP_DV_REG_DATA_VAULT_ENTRY_2_4 (32'h1001c2a0) +`define DV_REG_DATA_VAULT_ENTRY_2_4 (32'h2a0) +`define CLP_DV_REG_DATA_VAULT_ENTRY_2_5 (32'h1001c2a4) +`define DV_REG_DATA_VAULT_ENTRY_2_5 (32'h2a4) +`define CLP_DV_REG_DATA_VAULT_ENTRY_2_6 (32'h1001c2a8) +`define DV_REG_DATA_VAULT_ENTRY_2_6 (32'h2a8) +`define CLP_DV_REG_DATA_VAULT_ENTRY_2_7 (32'h1001c2ac) +`define DV_REG_DATA_VAULT_ENTRY_2_7 (32'h2ac) +`define CLP_DV_REG_DATA_VAULT_ENTRY_2_8 (32'h1001c2b0) +`define DV_REG_DATA_VAULT_ENTRY_2_8 (32'h2b0) +`define CLP_DV_REG_DATA_VAULT_ENTRY_2_9 (32'h1001c2b4) +`define DV_REG_DATA_VAULT_ENTRY_2_9 (32'h2b4) +`define CLP_DV_REG_DATA_VAULT_ENTRY_2_10 (32'h1001c2b8) +`define DV_REG_DATA_VAULT_ENTRY_2_10 (32'h2b8) +`define CLP_DV_REG_DATA_VAULT_ENTRY_2_11 (32'h1001c2bc) +`define DV_REG_DATA_VAULT_ENTRY_2_11 (32'h2bc) +`define CLP_DV_REG_DATA_VAULT_ENTRY_3_0 (32'h1001c2c0) +`define DV_REG_DATA_VAULT_ENTRY_3_0 (32'h2c0) +`define CLP_DV_REG_DATA_VAULT_ENTRY_3_1 (32'h1001c2c4) +`define DV_REG_DATA_VAULT_ENTRY_3_1 (32'h2c4) +`define CLP_DV_REG_DATA_VAULT_ENTRY_3_2 (32'h1001c2c8) +`define DV_REG_DATA_VAULT_ENTRY_3_2 (32'h2c8) +`define CLP_DV_REG_DATA_VAULT_ENTRY_3_3 (32'h1001c2cc) +`define DV_REG_DATA_VAULT_ENTRY_3_3 (32'h2cc) +`define CLP_DV_REG_DATA_VAULT_ENTRY_3_4 (32'h1001c2d0) +`define DV_REG_DATA_VAULT_ENTRY_3_4 (32'h2d0) +`define CLP_DV_REG_DATA_VAULT_ENTRY_3_5 (32'h1001c2d4) +`define DV_REG_DATA_VAULT_ENTRY_3_5 (32'h2d4) +`define CLP_DV_REG_DATA_VAULT_ENTRY_3_6 (32'h1001c2d8) +`define DV_REG_DATA_VAULT_ENTRY_3_6 (32'h2d8) +`define CLP_DV_REG_DATA_VAULT_ENTRY_3_7 (32'h1001c2dc) +`define DV_REG_DATA_VAULT_ENTRY_3_7 (32'h2dc) +`define CLP_DV_REG_DATA_VAULT_ENTRY_3_8 (32'h1001c2e0) +`define DV_REG_DATA_VAULT_ENTRY_3_8 (32'h2e0) +`define CLP_DV_REG_DATA_VAULT_ENTRY_3_9 (32'h1001c2e4) +`define DV_REG_DATA_VAULT_ENTRY_3_9 (32'h2e4) +`define CLP_DV_REG_DATA_VAULT_ENTRY_3_10 (32'h1001c2e8) +`define DV_REG_DATA_VAULT_ENTRY_3_10 (32'h2e8) +`define CLP_DV_REG_DATA_VAULT_ENTRY_3_11 (32'h1001c2ec) +`define DV_REG_DATA_VAULT_ENTRY_3_11 (32'h2ec) +`define CLP_DV_REG_DATA_VAULT_ENTRY_4_0 (32'h1001c2f0) +`define DV_REG_DATA_VAULT_ENTRY_4_0 (32'h2f0) +`define CLP_DV_REG_DATA_VAULT_ENTRY_4_1 (32'h1001c2f4) +`define DV_REG_DATA_VAULT_ENTRY_4_1 (32'h2f4) +`define CLP_DV_REG_DATA_VAULT_ENTRY_4_2 (32'h1001c2f8) +`define DV_REG_DATA_VAULT_ENTRY_4_2 (32'h2f8) +`define CLP_DV_REG_DATA_VAULT_ENTRY_4_3 (32'h1001c2fc) +`define DV_REG_DATA_VAULT_ENTRY_4_3 (32'h2fc) +`define CLP_DV_REG_DATA_VAULT_ENTRY_4_4 (32'h1001c300) +`define DV_REG_DATA_VAULT_ENTRY_4_4 (32'h300) +`define CLP_DV_REG_DATA_VAULT_ENTRY_4_5 (32'h1001c304) +`define DV_REG_DATA_VAULT_ENTRY_4_5 (32'h304) +`define CLP_DV_REG_DATA_VAULT_ENTRY_4_6 (32'h1001c308) +`define DV_REG_DATA_VAULT_ENTRY_4_6 (32'h308) +`define CLP_DV_REG_DATA_VAULT_ENTRY_4_7 (32'h1001c30c) +`define DV_REG_DATA_VAULT_ENTRY_4_7 (32'h30c) +`define CLP_DV_REG_DATA_VAULT_ENTRY_4_8 (32'h1001c310) +`define DV_REG_DATA_VAULT_ENTRY_4_8 (32'h310) +`define CLP_DV_REG_DATA_VAULT_ENTRY_4_9 (32'h1001c314) +`define DV_REG_DATA_VAULT_ENTRY_4_9 (32'h314) +`define CLP_DV_REG_DATA_VAULT_ENTRY_4_10 (32'h1001c318) +`define DV_REG_DATA_VAULT_ENTRY_4_10 (32'h318) +`define CLP_DV_REG_DATA_VAULT_ENTRY_4_11 (32'h1001c31c) +`define DV_REG_DATA_VAULT_ENTRY_4_11 (32'h31c) +`define CLP_DV_REG_DATA_VAULT_ENTRY_5_0 (32'h1001c320) +`define DV_REG_DATA_VAULT_ENTRY_5_0 (32'h320) +`define CLP_DV_REG_DATA_VAULT_ENTRY_5_1 (32'h1001c324) +`define DV_REG_DATA_VAULT_ENTRY_5_1 (32'h324) +`define CLP_DV_REG_DATA_VAULT_ENTRY_5_2 (32'h1001c328) +`define DV_REG_DATA_VAULT_ENTRY_5_2 (32'h328) +`define CLP_DV_REG_DATA_VAULT_ENTRY_5_3 (32'h1001c32c) +`define DV_REG_DATA_VAULT_ENTRY_5_3 (32'h32c) +`define CLP_DV_REG_DATA_VAULT_ENTRY_5_4 (32'h1001c330) +`define DV_REG_DATA_VAULT_ENTRY_5_4 (32'h330) +`define CLP_DV_REG_DATA_VAULT_ENTRY_5_5 (32'h1001c334) +`define DV_REG_DATA_VAULT_ENTRY_5_5 (32'h334) +`define CLP_DV_REG_DATA_VAULT_ENTRY_5_6 (32'h1001c338) +`define DV_REG_DATA_VAULT_ENTRY_5_6 (32'h338) +`define CLP_DV_REG_DATA_VAULT_ENTRY_5_7 (32'h1001c33c) +`define DV_REG_DATA_VAULT_ENTRY_5_7 (32'h33c) +`define CLP_DV_REG_DATA_VAULT_ENTRY_5_8 (32'h1001c340) +`define DV_REG_DATA_VAULT_ENTRY_5_8 (32'h340) +`define CLP_DV_REG_DATA_VAULT_ENTRY_5_9 (32'h1001c344) +`define DV_REG_DATA_VAULT_ENTRY_5_9 (32'h344) +`define CLP_DV_REG_DATA_VAULT_ENTRY_5_10 (32'h1001c348) +`define DV_REG_DATA_VAULT_ENTRY_5_10 (32'h348) +`define CLP_DV_REG_DATA_VAULT_ENTRY_5_11 (32'h1001c34c) +`define DV_REG_DATA_VAULT_ENTRY_5_11 (32'h34c) +`define CLP_DV_REG_DATA_VAULT_ENTRY_6_0 (32'h1001c350) +`define DV_REG_DATA_VAULT_ENTRY_6_0 (32'h350) +`define CLP_DV_REG_DATA_VAULT_ENTRY_6_1 (32'h1001c354) +`define DV_REG_DATA_VAULT_ENTRY_6_1 (32'h354) +`define CLP_DV_REG_DATA_VAULT_ENTRY_6_2 (32'h1001c358) +`define DV_REG_DATA_VAULT_ENTRY_6_2 (32'h358) +`define CLP_DV_REG_DATA_VAULT_ENTRY_6_3 (32'h1001c35c) +`define DV_REG_DATA_VAULT_ENTRY_6_3 (32'h35c) +`define CLP_DV_REG_DATA_VAULT_ENTRY_6_4 (32'h1001c360) +`define DV_REG_DATA_VAULT_ENTRY_6_4 (32'h360) +`define CLP_DV_REG_DATA_VAULT_ENTRY_6_5 (32'h1001c364) +`define DV_REG_DATA_VAULT_ENTRY_6_5 (32'h364) +`define CLP_DV_REG_DATA_VAULT_ENTRY_6_6 (32'h1001c368) +`define DV_REG_DATA_VAULT_ENTRY_6_6 (32'h368) +`define CLP_DV_REG_DATA_VAULT_ENTRY_6_7 (32'h1001c36c) +`define DV_REG_DATA_VAULT_ENTRY_6_7 (32'h36c) +`define CLP_DV_REG_DATA_VAULT_ENTRY_6_8 (32'h1001c370) +`define DV_REG_DATA_VAULT_ENTRY_6_8 (32'h370) +`define CLP_DV_REG_DATA_VAULT_ENTRY_6_9 (32'h1001c374) +`define DV_REG_DATA_VAULT_ENTRY_6_9 (32'h374) +`define CLP_DV_REG_DATA_VAULT_ENTRY_6_10 (32'h1001c378) +`define DV_REG_DATA_VAULT_ENTRY_6_10 (32'h378) +`define CLP_DV_REG_DATA_VAULT_ENTRY_6_11 (32'h1001c37c) +`define DV_REG_DATA_VAULT_ENTRY_6_11 (32'h37c) +`define CLP_DV_REG_DATA_VAULT_ENTRY_7_0 (32'h1001c380) +`define DV_REG_DATA_VAULT_ENTRY_7_0 (32'h380) +`define CLP_DV_REG_DATA_VAULT_ENTRY_7_1 (32'h1001c384) +`define DV_REG_DATA_VAULT_ENTRY_7_1 (32'h384) +`define CLP_DV_REG_DATA_VAULT_ENTRY_7_2 (32'h1001c388) +`define DV_REG_DATA_VAULT_ENTRY_7_2 (32'h388) +`define CLP_DV_REG_DATA_VAULT_ENTRY_7_3 (32'h1001c38c) +`define DV_REG_DATA_VAULT_ENTRY_7_3 (32'h38c) +`define CLP_DV_REG_DATA_VAULT_ENTRY_7_4 (32'h1001c390) +`define DV_REG_DATA_VAULT_ENTRY_7_4 (32'h390) +`define CLP_DV_REG_DATA_VAULT_ENTRY_7_5 (32'h1001c394) +`define DV_REG_DATA_VAULT_ENTRY_7_5 (32'h394) +`define CLP_DV_REG_DATA_VAULT_ENTRY_7_6 (32'h1001c398) +`define DV_REG_DATA_VAULT_ENTRY_7_6 (32'h398) +`define CLP_DV_REG_DATA_VAULT_ENTRY_7_7 (32'h1001c39c) +`define DV_REG_DATA_VAULT_ENTRY_7_7 (32'h39c) +`define CLP_DV_REG_DATA_VAULT_ENTRY_7_8 (32'h1001c3a0) +`define DV_REG_DATA_VAULT_ENTRY_7_8 (32'h3a0) +`define CLP_DV_REG_DATA_VAULT_ENTRY_7_9 (32'h1001c3a4) +`define DV_REG_DATA_VAULT_ENTRY_7_9 (32'h3a4) +`define CLP_DV_REG_DATA_VAULT_ENTRY_7_10 (32'h1001c3a8) +`define DV_REG_DATA_VAULT_ENTRY_7_10 (32'h3a8) +`define CLP_DV_REG_DATA_VAULT_ENTRY_7_11 (32'h1001c3ac) +`define DV_REG_DATA_VAULT_ENTRY_7_11 (32'h3ac) +`define CLP_DV_REG_DATA_VAULT_ENTRY_8_0 (32'h1001c3b0) +`define DV_REG_DATA_VAULT_ENTRY_8_0 (32'h3b0) +`define CLP_DV_REG_DATA_VAULT_ENTRY_8_1 (32'h1001c3b4) +`define DV_REG_DATA_VAULT_ENTRY_8_1 (32'h3b4) +`define CLP_DV_REG_DATA_VAULT_ENTRY_8_2 (32'h1001c3b8) +`define DV_REG_DATA_VAULT_ENTRY_8_2 (32'h3b8) +`define CLP_DV_REG_DATA_VAULT_ENTRY_8_3 (32'h1001c3bc) +`define DV_REG_DATA_VAULT_ENTRY_8_3 (32'h3bc) +`define CLP_DV_REG_DATA_VAULT_ENTRY_8_4 (32'h1001c3c0) +`define DV_REG_DATA_VAULT_ENTRY_8_4 (32'h3c0) +`define CLP_DV_REG_DATA_VAULT_ENTRY_8_5 (32'h1001c3c4) +`define DV_REG_DATA_VAULT_ENTRY_8_5 (32'h3c4) +`define CLP_DV_REG_DATA_VAULT_ENTRY_8_6 (32'h1001c3c8) +`define DV_REG_DATA_VAULT_ENTRY_8_6 (32'h3c8) +`define CLP_DV_REG_DATA_VAULT_ENTRY_8_7 (32'h1001c3cc) +`define DV_REG_DATA_VAULT_ENTRY_8_7 (32'h3cc) +`define CLP_DV_REG_DATA_VAULT_ENTRY_8_8 (32'h1001c3d0) +`define DV_REG_DATA_VAULT_ENTRY_8_8 (32'h3d0) +`define CLP_DV_REG_DATA_VAULT_ENTRY_8_9 (32'h1001c3d4) +`define DV_REG_DATA_VAULT_ENTRY_8_9 (32'h3d4) +`define CLP_DV_REG_DATA_VAULT_ENTRY_8_10 (32'h1001c3d8) +`define DV_REG_DATA_VAULT_ENTRY_8_10 (32'h3d8) +`define CLP_DV_REG_DATA_VAULT_ENTRY_8_11 (32'h1001c3dc) +`define DV_REG_DATA_VAULT_ENTRY_8_11 (32'h3dc) +`define CLP_DV_REG_DATA_VAULT_ENTRY_9_0 (32'h1001c3e0) +`define DV_REG_DATA_VAULT_ENTRY_9_0 (32'h3e0) +`define CLP_DV_REG_DATA_VAULT_ENTRY_9_1 (32'h1001c3e4) +`define DV_REG_DATA_VAULT_ENTRY_9_1 (32'h3e4) +`define CLP_DV_REG_DATA_VAULT_ENTRY_9_2 (32'h1001c3e8) +`define DV_REG_DATA_VAULT_ENTRY_9_2 (32'h3e8) +`define CLP_DV_REG_DATA_VAULT_ENTRY_9_3 (32'h1001c3ec) +`define DV_REG_DATA_VAULT_ENTRY_9_3 (32'h3ec) +`define CLP_DV_REG_DATA_VAULT_ENTRY_9_4 (32'h1001c3f0) +`define DV_REG_DATA_VAULT_ENTRY_9_4 (32'h3f0) +`define CLP_DV_REG_DATA_VAULT_ENTRY_9_5 (32'h1001c3f4) +`define DV_REG_DATA_VAULT_ENTRY_9_5 (32'h3f4) +`define CLP_DV_REG_DATA_VAULT_ENTRY_9_6 (32'h1001c3f8) +`define DV_REG_DATA_VAULT_ENTRY_9_6 (32'h3f8) +`define CLP_DV_REG_DATA_VAULT_ENTRY_9_7 (32'h1001c3fc) +`define DV_REG_DATA_VAULT_ENTRY_9_7 (32'h3fc) +`define CLP_DV_REG_DATA_VAULT_ENTRY_9_8 (32'h1001c400) +`define DV_REG_DATA_VAULT_ENTRY_9_8 (32'h400) +`define CLP_DV_REG_DATA_VAULT_ENTRY_9_9 (32'h1001c404) +`define DV_REG_DATA_VAULT_ENTRY_9_9 (32'h404) +`define CLP_DV_REG_DATA_VAULT_ENTRY_9_10 (32'h1001c408) +`define DV_REG_DATA_VAULT_ENTRY_9_10 (32'h408) +`define CLP_DV_REG_DATA_VAULT_ENTRY_9_11 (32'h1001c40c) +`define DV_REG_DATA_VAULT_ENTRY_9_11 (32'h40c) +`define CLP_DV_REG_LOCKABLESCRATCHREGCTRL_0 (32'h1001c410) +`define DV_REG_LOCKABLESCRATCHREGCTRL_0 (32'h410) +`define DV_REG_LOCKABLESCRATCHREGCTRL_0_LOCK_ENTRY_LOW (0) +`define DV_REG_LOCKABLESCRATCHREGCTRL_0_LOCK_ENTRY_MASK (32'h1) +`define CLP_DV_REG_LOCKABLESCRATCHREGCTRL_1 (32'h1001c414) +`define DV_REG_LOCKABLESCRATCHREGCTRL_1 (32'h414) +`define DV_REG_LOCKABLESCRATCHREGCTRL_1_LOCK_ENTRY_LOW (0) +`define DV_REG_LOCKABLESCRATCHREGCTRL_1_LOCK_ENTRY_MASK (32'h1) +`define CLP_DV_REG_LOCKABLESCRATCHREGCTRL_2 (32'h1001c418) +`define DV_REG_LOCKABLESCRATCHREGCTRL_2 (32'h418) +`define DV_REG_LOCKABLESCRATCHREGCTRL_2_LOCK_ENTRY_LOW (0) +`define DV_REG_LOCKABLESCRATCHREGCTRL_2_LOCK_ENTRY_MASK (32'h1) +`define CLP_DV_REG_LOCKABLESCRATCHREGCTRL_3 (32'h1001c41c) +`define DV_REG_LOCKABLESCRATCHREGCTRL_3 (32'h41c) +`define DV_REG_LOCKABLESCRATCHREGCTRL_3_LOCK_ENTRY_LOW (0) +`define DV_REG_LOCKABLESCRATCHREGCTRL_3_LOCK_ENTRY_MASK (32'h1) +`define CLP_DV_REG_LOCKABLESCRATCHREGCTRL_4 (32'h1001c420) +`define DV_REG_LOCKABLESCRATCHREGCTRL_4 (32'h420) +`define DV_REG_LOCKABLESCRATCHREGCTRL_4_LOCK_ENTRY_LOW (0) +`define DV_REG_LOCKABLESCRATCHREGCTRL_4_LOCK_ENTRY_MASK (32'h1) +`define CLP_DV_REG_LOCKABLESCRATCHREGCTRL_5 (32'h1001c424) +`define DV_REG_LOCKABLESCRATCHREGCTRL_5 (32'h424) +`define DV_REG_LOCKABLESCRATCHREGCTRL_5_LOCK_ENTRY_LOW (0) +`define DV_REG_LOCKABLESCRATCHREGCTRL_5_LOCK_ENTRY_MASK (32'h1) +`define CLP_DV_REG_LOCKABLESCRATCHREGCTRL_6 (32'h1001c428) +`define DV_REG_LOCKABLESCRATCHREGCTRL_6 (32'h428) +`define DV_REG_LOCKABLESCRATCHREGCTRL_6_LOCK_ENTRY_LOW (0) +`define DV_REG_LOCKABLESCRATCHREGCTRL_6_LOCK_ENTRY_MASK (32'h1) +`define CLP_DV_REG_LOCKABLESCRATCHREGCTRL_7 (32'h1001c42c) +`define DV_REG_LOCKABLESCRATCHREGCTRL_7 (32'h42c) +`define DV_REG_LOCKABLESCRATCHREGCTRL_7_LOCK_ENTRY_LOW (0) +`define DV_REG_LOCKABLESCRATCHREGCTRL_7_LOCK_ENTRY_MASK (32'h1) +`define CLP_DV_REG_LOCKABLESCRATCHREGCTRL_8 (32'h1001c430) +`define DV_REG_LOCKABLESCRATCHREGCTRL_8 (32'h430) +`define DV_REG_LOCKABLESCRATCHREGCTRL_8_LOCK_ENTRY_LOW (0) +`define DV_REG_LOCKABLESCRATCHREGCTRL_8_LOCK_ENTRY_MASK (32'h1) +`define CLP_DV_REG_LOCKABLESCRATCHREGCTRL_9 (32'h1001c434) +`define DV_REG_LOCKABLESCRATCHREGCTRL_9 (32'h434) +`define DV_REG_LOCKABLESCRATCHREGCTRL_9_LOCK_ENTRY_LOW (0) +`define DV_REG_LOCKABLESCRATCHREGCTRL_9_LOCK_ENTRY_MASK (32'h1) +`define CLP_DV_REG_LOCKABLESCRATCHREG_0 (32'h1001c438) +`define DV_REG_LOCKABLESCRATCHREG_0 (32'h438) +`define CLP_DV_REG_LOCKABLESCRATCHREG_1 (32'h1001c43c) +`define DV_REG_LOCKABLESCRATCHREG_1 (32'h43c) +`define CLP_DV_REG_LOCKABLESCRATCHREG_2 (32'h1001c440) +`define DV_REG_LOCKABLESCRATCHREG_2 (32'h440) +`define CLP_DV_REG_LOCKABLESCRATCHREG_3 (32'h1001c444) +`define DV_REG_LOCKABLESCRATCHREG_3 (32'h444) +`define CLP_DV_REG_LOCKABLESCRATCHREG_4 (32'h1001c448) +`define DV_REG_LOCKABLESCRATCHREG_4 (32'h448) +`define CLP_DV_REG_LOCKABLESCRATCHREG_5 (32'h1001c44c) +`define DV_REG_LOCKABLESCRATCHREG_5 (32'h44c) +`define CLP_DV_REG_LOCKABLESCRATCHREG_6 (32'h1001c450) +`define DV_REG_LOCKABLESCRATCHREG_6 (32'h450) +`define CLP_DV_REG_LOCKABLESCRATCHREG_7 (32'h1001c454) +`define DV_REG_LOCKABLESCRATCHREG_7 (32'h454) +`define CLP_DV_REG_LOCKABLESCRATCHREG_8 (32'h1001c458) +`define DV_REG_LOCKABLESCRATCHREG_8 (32'h458) +`define CLP_DV_REG_LOCKABLESCRATCHREG_9 (32'h1001c45c) +`define DV_REG_LOCKABLESCRATCHREG_9 (32'h45c) `define CLP_DV_REG_NONSTICKYGENERICSCRATCHREG_0 (32'h1001c460) `define DV_REG_NONSTICKYGENERICSCRATCHREG_0 (32'h460) `define CLP_DV_REG_NONSTICKYGENERICSCRATCHREG_1 (32'h1001c464) @@ -4053,42 +4053,56 @@ `define SHA512_REG_SHA512_KV_WR_STATUS_VALID_MASK (32'h2) `define SHA512_REG_SHA512_KV_WR_STATUS_ERROR_LOW (2) `define SHA512_REG_SHA512_KV_WR_STATUS_ERROR_MASK (32'h3fc) -`define CLP_SHA512_REG_SHA512_GEN_PCR_HASH_NONCE (32'h10020610) -`define SHA512_REG_SHA512_GEN_PCR_HASH_NONCE (32'h610) -`define CLP_SHA512_REG_SHA512_GEN_PCR_HASH_CTRL (32'h10020614) -`define SHA512_REG_SHA512_GEN_PCR_HASH_CTRL (32'h614) +`define CLP_SHA512_REG_SHA512_GEN_PCR_HASH_NONCE_0 (32'h10020610) +`define SHA512_REG_SHA512_GEN_PCR_HASH_NONCE_0 (32'h610) +`define CLP_SHA512_REG_SHA512_GEN_PCR_HASH_NONCE_1 (32'h10020614) +`define SHA512_REG_SHA512_GEN_PCR_HASH_NONCE_1 (32'h614) +`define CLP_SHA512_REG_SHA512_GEN_PCR_HASH_NONCE_2 (32'h10020618) +`define SHA512_REG_SHA512_GEN_PCR_HASH_NONCE_2 (32'h618) +`define CLP_SHA512_REG_SHA512_GEN_PCR_HASH_NONCE_3 (32'h1002061c) +`define SHA512_REG_SHA512_GEN_PCR_HASH_NONCE_3 (32'h61c) +`define CLP_SHA512_REG_SHA512_GEN_PCR_HASH_NONCE_4 (32'h10020620) +`define SHA512_REG_SHA512_GEN_PCR_HASH_NONCE_4 (32'h620) +`define CLP_SHA512_REG_SHA512_GEN_PCR_HASH_NONCE_5 (32'h10020624) +`define SHA512_REG_SHA512_GEN_PCR_HASH_NONCE_5 (32'h624) +`define CLP_SHA512_REG_SHA512_GEN_PCR_HASH_NONCE_6 (32'h10020628) +`define SHA512_REG_SHA512_GEN_PCR_HASH_NONCE_6 (32'h628) +`define CLP_SHA512_REG_SHA512_GEN_PCR_HASH_NONCE_7 (32'h1002062c) +`define SHA512_REG_SHA512_GEN_PCR_HASH_NONCE_7 (32'h62c) +`define CLP_SHA512_REG_SHA512_GEN_PCR_HASH_CTRL (32'h10020630) +`define SHA512_REG_SHA512_GEN_PCR_HASH_CTRL (32'h630) `define SHA512_REG_SHA512_GEN_PCR_HASH_CTRL_START_LOW (0) `define SHA512_REG_SHA512_GEN_PCR_HASH_CTRL_START_MASK (32'h1) -`define CLP_SHA512_REG_SHA512_GEN_PCR_HASH_STATUS (32'h10020618) -`define SHA512_REG_SHA512_GEN_PCR_HASH_STATUS (32'h618) +`define CLP_SHA512_REG_SHA512_GEN_PCR_HASH_STATUS (32'h10020634) +`define SHA512_REG_SHA512_GEN_PCR_HASH_STATUS (32'h634) `define SHA512_REG_SHA512_GEN_PCR_HASH_STATUS_READY_LOW (0) `define SHA512_REG_SHA512_GEN_PCR_HASH_STATUS_READY_MASK (32'h1) `define SHA512_REG_SHA512_GEN_PCR_HASH_STATUS_VALID_LOW (1) `define SHA512_REG_SHA512_GEN_PCR_HASH_STATUS_VALID_MASK (32'h2) -`define CLP_SHA512_REG_SHA512_GEN_PCR_HASH_DIGEST_0 (32'h1002061c) -`define SHA512_REG_SHA512_GEN_PCR_HASH_DIGEST_0 (32'h61c) -`define CLP_SHA512_REG_SHA512_GEN_PCR_HASH_DIGEST_1 (32'h10020620) -`define SHA512_REG_SHA512_GEN_PCR_HASH_DIGEST_1 (32'h620) -`define CLP_SHA512_REG_SHA512_GEN_PCR_HASH_DIGEST_2 (32'h10020624) -`define SHA512_REG_SHA512_GEN_PCR_HASH_DIGEST_2 (32'h624) -`define CLP_SHA512_REG_SHA512_GEN_PCR_HASH_DIGEST_3 (32'h10020628) -`define SHA512_REG_SHA512_GEN_PCR_HASH_DIGEST_3 (32'h628) -`define CLP_SHA512_REG_SHA512_GEN_PCR_HASH_DIGEST_4 (32'h1002062c) -`define SHA512_REG_SHA512_GEN_PCR_HASH_DIGEST_4 (32'h62c) -`define CLP_SHA512_REG_SHA512_GEN_PCR_HASH_DIGEST_5 (32'h10020630) -`define SHA512_REG_SHA512_GEN_PCR_HASH_DIGEST_5 (32'h630) -`define CLP_SHA512_REG_SHA512_GEN_PCR_HASH_DIGEST_6 (32'h10020634) -`define SHA512_REG_SHA512_GEN_PCR_HASH_DIGEST_6 (32'h634) -`define CLP_SHA512_REG_SHA512_GEN_PCR_HASH_DIGEST_7 (32'h10020638) -`define SHA512_REG_SHA512_GEN_PCR_HASH_DIGEST_7 (32'h638) -`define CLP_SHA512_REG_SHA512_GEN_PCR_HASH_DIGEST_8 (32'h1002063c) -`define SHA512_REG_SHA512_GEN_PCR_HASH_DIGEST_8 (32'h63c) -`define CLP_SHA512_REG_SHA512_GEN_PCR_HASH_DIGEST_9 (32'h10020640) -`define SHA512_REG_SHA512_GEN_PCR_HASH_DIGEST_9 (32'h640) -`define CLP_SHA512_REG_SHA512_GEN_PCR_HASH_DIGEST_10 (32'h10020644) -`define SHA512_REG_SHA512_GEN_PCR_HASH_DIGEST_10 (32'h644) -`define CLP_SHA512_REG_SHA512_GEN_PCR_HASH_DIGEST_11 (32'h10020648) -`define SHA512_REG_SHA512_GEN_PCR_HASH_DIGEST_11 (32'h648) +`define CLP_SHA512_REG_SHA512_GEN_PCR_HASH_DIGEST_0 (32'h10020638) +`define SHA512_REG_SHA512_GEN_PCR_HASH_DIGEST_0 (32'h638) +`define CLP_SHA512_REG_SHA512_GEN_PCR_HASH_DIGEST_1 (32'h1002063c) +`define SHA512_REG_SHA512_GEN_PCR_HASH_DIGEST_1 (32'h63c) +`define CLP_SHA512_REG_SHA512_GEN_PCR_HASH_DIGEST_2 (32'h10020640) +`define SHA512_REG_SHA512_GEN_PCR_HASH_DIGEST_2 (32'h640) +`define CLP_SHA512_REG_SHA512_GEN_PCR_HASH_DIGEST_3 (32'h10020644) +`define SHA512_REG_SHA512_GEN_PCR_HASH_DIGEST_3 (32'h644) +`define CLP_SHA512_REG_SHA512_GEN_PCR_HASH_DIGEST_4 (32'h10020648) +`define SHA512_REG_SHA512_GEN_PCR_HASH_DIGEST_4 (32'h648) +`define CLP_SHA512_REG_SHA512_GEN_PCR_HASH_DIGEST_5 (32'h1002064c) +`define SHA512_REG_SHA512_GEN_PCR_HASH_DIGEST_5 (32'h64c) +`define CLP_SHA512_REG_SHA512_GEN_PCR_HASH_DIGEST_6 (32'h10020650) +`define SHA512_REG_SHA512_GEN_PCR_HASH_DIGEST_6 (32'h650) +`define CLP_SHA512_REG_SHA512_GEN_PCR_HASH_DIGEST_7 (32'h10020654) +`define SHA512_REG_SHA512_GEN_PCR_HASH_DIGEST_7 (32'h654) +`define CLP_SHA512_REG_SHA512_GEN_PCR_HASH_DIGEST_8 (32'h10020658) +`define SHA512_REG_SHA512_GEN_PCR_HASH_DIGEST_8 (32'h658) +`define CLP_SHA512_REG_SHA512_GEN_PCR_HASH_DIGEST_9 (32'h1002065c) +`define SHA512_REG_SHA512_GEN_PCR_HASH_DIGEST_9 (32'h65c) +`define CLP_SHA512_REG_SHA512_GEN_PCR_HASH_DIGEST_10 (32'h10020660) +`define SHA512_REG_SHA512_GEN_PCR_HASH_DIGEST_10 (32'h660) +`define CLP_SHA512_REG_SHA512_GEN_PCR_HASH_DIGEST_11 (32'h10020664) +`define SHA512_REG_SHA512_GEN_PCR_HASH_DIGEST_11 (32'h664) `define CLP_SHA512_REG_INTR_BLOCK_RF_START (32'h10020800) `define CLP_SHA512_REG_INTR_BLOCK_RF_GLOBAL_INTR_EN_R (32'h10020800) `define SHA512_REG_INTR_BLOCK_RF_GLOBAL_INTR_EN_R (32'h800) @@ -5169,6 +5183,8 @@ `define MBOX_CSR_MBOX_STATUS_MBOX_FSM_PS_MASK (32'h1c0) `define MBOX_CSR_MBOX_STATUS_SOC_HAS_LOCK_LOW (9) `define MBOX_CSR_MBOX_STATUS_SOC_HAS_LOCK_MASK (32'h200) +`define MBOX_CSR_MBOX_STATUS_MBOX_RDPTR_LOW (10) +`define MBOX_CSR_MBOX_STATUS_MBOX_RDPTR_MASK (32'h1fffc00) `define CLP_MBOX_CSR_MBOX_UNLOCK (32'h30020020) `define MBOX_CSR_MBOX_UNLOCK (32'h20) `define MBOX_CSR_MBOX_UNLOCK_UNLOCK_LOW (0) @@ -5200,6 +5216,8 @@ `define SHA512_ACC_CSR_STATUS (32'h1c) `define SHA512_ACC_CSR_STATUS_VALID_LOW (0) `define SHA512_ACC_CSR_STATUS_VALID_MASK (32'h1) +`define SHA512_ACC_CSR_STATUS_SOC_HAS_LOCK_LOW (1) +`define SHA512_ACC_CSR_STATUS_SOC_HAS_LOCK_MASK (32'h2) `define CLP_SHA512_ACC_CSR_DIGEST_0 (32'h30021020) `define SHA512_ACC_CSR_DIGEST_0 (32'h20) `define CLP_SHA512_ACC_CSR_DIGEST_1 (32'h30021024) @@ -5326,8 +5344,20 @@ `define CLP_SOC_IFC_REG_BASE_ADDR (32'h30030000) `define CLP_SOC_IFC_REG_CPTRA_HW_ERROR_FATAL (32'h30030000) `define SOC_IFC_REG_CPTRA_HW_ERROR_FATAL (32'h0) +`define SOC_IFC_REG_CPTRA_HW_ERROR_FATAL_ICCM_ECC_UNC_LOW (0) +`define SOC_IFC_REG_CPTRA_HW_ERROR_FATAL_ICCM_ECC_UNC_MASK (32'h1) +`define SOC_IFC_REG_CPTRA_HW_ERROR_FATAL_DCCM_ECC_UNC_LOW (1) +`define SOC_IFC_REG_CPTRA_HW_ERROR_FATAL_DCCM_ECC_UNC_MASK (32'h2) +`define SOC_IFC_REG_CPTRA_HW_ERROR_FATAL_NMI_PIN_LOW (2) +`define SOC_IFC_REG_CPTRA_HW_ERROR_FATAL_NMI_PIN_MASK (32'h4) `define CLP_SOC_IFC_REG_CPTRA_HW_ERROR_NON_FATAL (32'h30030004) `define SOC_IFC_REG_CPTRA_HW_ERROR_NON_FATAL (32'h4) +`define SOC_IFC_REG_CPTRA_HW_ERROR_NON_FATAL_MBOX_PROT_NO_LOCK_LOW (0) +`define SOC_IFC_REG_CPTRA_HW_ERROR_NON_FATAL_MBOX_PROT_NO_LOCK_MASK (32'h1) +`define SOC_IFC_REG_CPTRA_HW_ERROR_NON_FATAL_MBOX_PROT_OOO_LOW (1) +`define SOC_IFC_REG_CPTRA_HW_ERROR_NON_FATAL_MBOX_PROT_OOO_MASK (32'h2) +`define SOC_IFC_REG_CPTRA_HW_ERROR_NON_FATAL_MBOX_ECC_UNC_LOW (2) +`define SOC_IFC_REG_CPTRA_HW_ERROR_NON_FATAL_MBOX_ECC_UNC_MASK (32'h4) `define CLP_SOC_IFC_REG_CPTRA_FW_ERROR_FATAL (32'h30030008) `define SOC_IFC_REG_CPTRA_FW_ERROR_FATAL (32'h8) `define CLP_SOC_IFC_REG_CPTRA_FW_ERROR_NON_FATAL (32'h3003000c) @@ -5357,7 +5387,11 @@ `define CLP_SOC_IFC_REG_CPTRA_FLOW_STATUS (32'h3003003c) `define SOC_IFC_REG_CPTRA_FLOW_STATUS (32'h3c) `define SOC_IFC_REG_CPTRA_FLOW_STATUS_STATUS_LOW (0) -`define SOC_IFC_REG_CPTRA_FLOW_STATUS_STATUS_MASK (32'hfffffff) +`define SOC_IFC_REG_CPTRA_FLOW_STATUS_STATUS_MASK (32'hffffff) +`define SOC_IFC_REG_CPTRA_FLOW_STATUS_IDEVID_CSR_READY_LOW (24) +`define SOC_IFC_REG_CPTRA_FLOW_STATUS_IDEVID_CSR_READY_MASK (32'h1000000) +`define SOC_IFC_REG_CPTRA_FLOW_STATUS_BOOT_FSM_PS_LOW (25) +`define SOC_IFC_REG_CPTRA_FLOW_STATUS_BOOT_FSM_PS_MASK (32'he000000) `define SOC_IFC_REG_CPTRA_FLOW_STATUS_READY_FOR_FW_LOW (28) `define SOC_IFC_REG_CPTRA_FLOW_STATUS_READY_FOR_FW_MASK (32'h10000000) `define SOC_IFC_REG_CPTRA_FLOW_STATUS_READY_FOR_RUNTIME_LOW (29) @@ -5442,44 +5476,52 @@ `define SOC_IFC_REG_CPTRA_TRNG_DATA_10 (32'ha0) `define CLP_SOC_IFC_REG_CPTRA_TRNG_DATA_11 (32'h300300a4) `define SOC_IFC_REG_CPTRA_TRNG_DATA_11 (32'ha4) -`define CLP_SOC_IFC_REG_CPTRA_TRNG_STATUS (32'h300300a8) -`define SOC_IFC_REG_CPTRA_TRNG_STATUS (32'ha8) +`define CLP_SOC_IFC_REG_CPTRA_TRNG_CTRL (32'h300300a8) +`define SOC_IFC_REG_CPTRA_TRNG_CTRL (32'ha8) +`define SOC_IFC_REG_CPTRA_TRNG_CTRL_CLEAR_LOW (0) +`define SOC_IFC_REG_CPTRA_TRNG_CTRL_CLEAR_MASK (32'h1) +`define CLP_SOC_IFC_REG_CPTRA_TRNG_STATUS (32'h300300ac) +`define SOC_IFC_REG_CPTRA_TRNG_STATUS (32'hac) `define SOC_IFC_REG_CPTRA_TRNG_STATUS_DATA_REQ_LOW (0) `define SOC_IFC_REG_CPTRA_TRNG_STATUS_DATA_REQ_MASK (32'h1) `define SOC_IFC_REG_CPTRA_TRNG_STATUS_DATA_WR_DONE_LOW (1) `define SOC_IFC_REG_CPTRA_TRNG_STATUS_DATA_WR_DONE_MASK (32'h2) -`define CLP_SOC_IFC_REG_CPTRA_FUSE_WR_DONE (32'h300300ac) -`define SOC_IFC_REG_CPTRA_FUSE_WR_DONE (32'hac) +`define CLP_SOC_IFC_REG_CPTRA_FUSE_WR_DONE (32'h300300b0) +`define SOC_IFC_REG_CPTRA_FUSE_WR_DONE (32'hb0) `define SOC_IFC_REG_CPTRA_FUSE_WR_DONE_DONE_LOW (0) `define SOC_IFC_REG_CPTRA_FUSE_WR_DONE_DONE_MASK (32'h1) -`define CLP_SOC_IFC_REG_CPTRA_TIMER_CONFIG (32'h300300b0) -`define SOC_IFC_REG_CPTRA_TIMER_CONFIG (32'hb0) -`define CLP_SOC_IFC_REG_CPTRA_BOOTFSM_GO (32'h300300b4) -`define SOC_IFC_REG_CPTRA_BOOTFSM_GO (32'hb4) +`define CLP_SOC_IFC_REG_CPTRA_TIMER_CONFIG (32'h300300b4) +`define SOC_IFC_REG_CPTRA_TIMER_CONFIG (32'hb4) +`define CLP_SOC_IFC_REG_CPTRA_BOOTFSM_GO (32'h300300b8) +`define SOC_IFC_REG_CPTRA_BOOTFSM_GO (32'hb8) `define SOC_IFC_REG_CPTRA_BOOTFSM_GO_GO_LOW (0) `define SOC_IFC_REG_CPTRA_BOOTFSM_GO_GO_MASK (32'h1) -`define CLP_SOC_IFC_REG_CPTRA_DBG_MANUF_SERVICE_REG (32'h300300b8) -`define SOC_IFC_REG_CPTRA_DBG_MANUF_SERVICE_REG (32'hb8) -`define CLP_SOC_IFC_REG_CPTRA_CLK_GATING_EN (32'h300300bc) -`define SOC_IFC_REG_CPTRA_CLK_GATING_EN (32'hbc) +`define CLP_SOC_IFC_REG_CPTRA_DBG_MANUF_SERVICE_REG (32'h300300bc) +`define SOC_IFC_REG_CPTRA_DBG_MANUF_SERVICE_REG (32'hbc) +`define CLP_SOC_IFC_REG_CPTRA_CLK_GATING_EN (32'h300300c0) +`define SOC_IFC_REG_CPTRA_CLK_GATING_EN (32'hc0) `define SOC_IFC_REG_CPTRA_CLK_GATING_EN_CLK_GATING_EN_LOW (0) `define SOC_IFC_REG_CPTRA_CLK_GATING_EN_CLK_GATING_EN_MASK (32'h1) -`define CLP_SOC_IFC_REG_CPTRA_GENERIC_INPUT_WIRES_0 (32'h300300c0) -`define SOC_IFC_REG_CPTRA_GENERIC_INPUT_WIRES_0 (32'hc0) -`define CLP_SOC_IFC_REG_CPTRA_GENERIC_INPUT_WIRES_1 (32'h300300c4) -`define SOC_IFC_REG_CPTRA_GENERIC_INPUT_WIRES_1 (32'hc4) -`define CLP_SOC_IFC_REG_CPTRA_GENERIC_OUTPUT_WIRES_0 (32'h300300c8) -`define SOC_IFC_REG_CPTRA_GENERIC_OUTPUT_WIRES_0 (32'hc8) -`define CLP_SOC_IFC_REG_CPTRA_GENERIC_OUTPUT_WIRES_1 (32'h300300cc) -`define SOC_IFC_REG_CPTRA_GENERIC_OUTPUT_WIRES_1 (32'hcc) -`define CLP_SOC_IFC_REG_CPTRA_HW_REV_ID (32'h300300d0) -`define SOC_IFC_REG_CPTRA_HW_REV_ID (32'hd0) -`define CLP_SOC_IFC_REG_CPTRA_FW_REV_ID_0 (32'h300300d4) -`define SOC_IFC_REG_CPTRA_FW_REV_ID_0 (32'hd4) -`define CLP_SOC_IFC_REG_CPTRA_FW_REV_ID_1 (32'h300300d8) -`define SOC_IFC_REG_CPTRA_FW_REV_ID_1 (32'hd8) -`define CLP_SOC_IFC_REG_CPTRA_HW_CONFIG (32'h300300dc) -`define SOC_IFC_REG_CPTRA_HW_CONFIG (32'hdc) +`define CLP_SOC_IFC_REG_CPTRA_GENERIC_INPUT_WIRES_0 (32'h300300c4) +`define SOC_IFC_REG_CPTRA_GENERIC_INPUT_WIRES_0 (32'hc4) +`define CLP_SOC_IFC_REG_CPTRA_GENERIC_INPUT_WIRES_1 (32'h300300c8) +`define SOC_IFC_REG_CPTRA_GENERIC_INPUT_WIRES_1 (32'hc8) +`define CLP_SOC_IFC_REG_CPTRA_GENERIC_OUTPUT_WIRES_0 (32'h300300cc) +`define SOC_IFC_REG_CPTRA_GENERIC_OUTPUT_WIRES_0 (32'hcc) +`define CLP_SOC_IFC_REG_CPTRA_GENERIC_OUTPUT_WIRES_1 (32'h300300d0) +`define SOC_IFC_REG_CPTRA_GENERIC_OUTPUT_WIRES_1 (32'hd0) +`define CLP_SOC_IFC_REG_CPTRA_HW_REV_ID (32'h300300d4) +`define SOC_IFC_REG_CPTRA_HW_REV_ID (32'hd4) +`define SOC_IFC_REG_CPTRA_HW_REV_ID_CPTRA_GENERATION_LOW (0) +`define SOC_IFC_REG_CPTRA_HW_REV_ID_CPTRA_GENERATION_MASK (32'hffff) +`define SOC_IFC_REG_CPTRA_HW_REV_ID_SOC_STEPPING_ID_LOW (16) +`define SOC_IFC_REG_CPTRA_HW_REV_ID_SOC_STEPPING_ID_MASK (32'hffff0000) +`define CLP_SOC_IFC_REG_CPTRA_FW_REV_ID_0 (32'h300300d8) +`define SOC_IFC_REG_CPTRA_FW_REV_ID_0 (32'hd8) +`define CLP_SOC_IFC_REG_CPTRA_FW_REV_ID_1 (32'h300300dc) +`define SOC_IFC_REG_CPTRA_FW_REV_ID_1 (32'hdc) +`define CLP_SOC_IFC_REG_CPTRA_HW_CONFIG (32'h300300e0) +`define SOC_IFC_REG_CPTRA_HW_CONFIG (32'he0) `define SOC_IFC_REG_CPTRA_HW_CONFIG_ITRNG_EN_LOW (0) `define SOC_IFC_REG_CPTRA_HW_CONFIG_ITRNG_EN_MASK (32'h1) `define SOC_IFC_REG_CPTRA_HW_CONFIG_QSPI_EN_LOW (1) @@ -5488,36 +5530,62 @@ `define SOC_IFC_REG_CPTRA_HW_CONFIG_I3C_EN_MASK (32'h4) `define SOC_IFC_REG_CPTRA_HW_CONFIG_UART_EN_LOW (3) `define SOC_IFC_REG_CPTRA_HW_CONFIG_UART_EN_MASK (32'h8) -`define CLP_SOC_IFC_REG_CPTRA_WDT_TIMER1_EN (32'h300300e0) -`define SOC_IFC_REG_CPTRA_WDT_TIMER1_EN (32'he0) +`define CLP_SOC_IFC_REG_CPTRA_WDT_TIMER1_EN (32'h300300e4) +`define SOC_IFC_REG_CPTRA_WDT_TIMER1_EN (32'he4) `define SOC_IFC_REG_CPTRA_WDT_TIMER1_EN_TIMER1_EN_LOW (0) `define SOC_IFC_REG_CPTRA_WDT_TIMER1_EN_TIMER1_EN_MASK (32'h1) -`define CLP_SOC_IFC_REG_CPTRA_WDT_TIMER1_CTRL (32'h300300e4) -`define SOC_IFC_REG_CPTRA_WDT_TIMER1_CTRL (32'he4) +`define CLP_SOC_IFC_REG_CPTRA_WDT_TIMER1_CTRL (32'h300300e8) +`define SOC_IFC_REG_CPTRA_WDT_TIMER1_CTRL (32'he8) `define SOC_IFC_REG_CPTRA_WDT_TIMER1_CTRL_TIMER1_RESTART_LOW (0) `define SOC_IFC_REG_CPTRA_WDT_TIMER1_CTRL_TIMER1_RESTART_MASK (32'h1) -`define CLP_SOC_IFC_REG_CPTRA_WDT_TIMER1_TIMEOUT_PERIOD_0 (32'h300300e8) -`define SOC_IFC_REG_CPTRA_WDT_TIMER1_TIMEOUT_PERIOD_0 (32'he8) -`define CLP_SOC_IFC_REG_CPTRA_WDT_TIMER1_TIMEOUT_PERIOD_1 (32'h300300ec) -`define SOC_IFC_REG_CPTRA_WDT_TIMER1_TIMEOUT_PERIOD_1 (32'hec) -`define CLP_SOC_IFC_REG_CPTRA_WDT_TIMER2_EN (32'h300300f0) -`define SOC_IFC_REG_CPTRA_WDT_TIMER2_EN (32'hf0) +`define CLP_SOC_IFC_REG_CPTRA_WDT_TIMER1_TIMEOUT_PERIOD_0 (32'h300300ec) +`define SOC_IFC_REG_CPTRA_WDT_TIMER1_TIMEOUT_PERIOD_0 (32'hec) +`define CLP_SOC_IFC_REG_CPTRA_WDT_TIMER1_TIMEOUT_PERIOD_1 (32'h300300f0) +`define SOC_IFC_REG_CPTRA_WDT_TIMER1_TIMEOUT_PERIOD_1 (32'hf0) +`define CLP_SOC_IFC_REG_CPTRA_WDT_TIMER2_EN (32'h300300f4) +`define SOC_IFC_REG_CPTRA_WDT_TIMER2_EN (32'hf4) `define SOC_IFC_REG_CPTRA_WDT_TIMER2_EN_TIMER2_EN_LOW (0) `define SOC_IFC_REG_CPTRA_WDT_TIMER2_EN_TIMER2_EN_MASK (32'h1) -`define CLP_SOC_IFC_REG_CPTRA_WDT_TIMER2_CTRL (32'h300300f4) -`define SOC_IFC_REG_CPTRA_WDT_TIMER2_CTRL (32'hf4) +`define CLP_SOC_IFC_REG_CPTRA_WDT_TIMER2_CTRL (32'h300300f8) +`define SOC_IFC_REG_CPTRA_WDT_TIMER2_CTRL (32'hf8) `define SOC_IFC_REG_CPTRA_WDT_TIMER2_CTRL_TIMER2_RESTART_LOW (0) `define SOC_IFC_REG_CPTRA_WDT_TIMER2_CTRL_TIMER2_RESTART_MASK (32'h1) -`define CLP_SOC_IFC_REG_CPTRA_WDT_TIMER2_TIMEOUT_PERIOD_0 (32'h300300f8) -`define SOC_IFC_REG_CPTRA_WDT_TIMER2_TIMEOUT_PERIOD_0 (32'hf8) -`define CLP_SOC_IFC_REG_CPTRA_WDT_TIMER2_TIMEOUT_PERIOD_1 (32'h300300fc) -`define SOC_IFC_REG_CPTRA_WDT_TIMER2_TIMEOUT_PERIOD_1 (32'hfc) -`define CLP_SOC_IFC_REG_CPTRA_WDT_STATUS (32'h30030100) -`define SOC_IFC_REG_CPTRA_WDT_STATUS (32'h100) +`define CLP_SOC_IFC_REG_CPTRA_WDT_TIMER2_TIMEOUT_PERIOD_0 (32'h300300fc) +`define SOC_IFC_REG_CPTRA_WDT_TIMER2_TIMEOUT_PERIOD_0 (32'hfc) +`define CLP_SOC_IFC_REG_CPTRA_WDT_TIMER2_TIMEOUT_PERIOD_1 (32'h30030100) +`define SOC_IFC_REG_CPTRA_WDT_TIMER2_TIMEOUT_PERIOD_1 (32'h100) +`define CLP_SOC_IFC_REG_CPTRA_WDT_STATUS (32'h30030104) +`define SOC_IFC_REG_CPTRA_WDT_STATUS (32'h104) `define SOC_IFC_REG_CPTRA_WDT_STATUS_T1_TIMEOUT_LOW (0) `define SOC_IFC_REG_CPTRA_WDT_STATUS_T1_TIMEOUT_MASK (32'h1) `define SOC_IFC_REG_CPTRA_WDT_STATUS_T2_TIMEOUT_LOW (1) `define SOC_IFC_REG_CPTRA_WDT_STATUS_T2_TIMEOUT_MASK (32'h2) +`define CLP_SOC_IFC_REG_CPTRA_FUSE_VALID_PAUSER (32'h30030108) +`define SOC_IFC_REG_CPTRA_FUSE_VALID_PAUSER (32'h108) +`define CLP_SOC_IFC_REG_CPTRA_FUSE_PAUSER_LOCK (32'h3003010c) +`define SOC_IFC_REG_CPTRA_FUSE_PAUSER_LOCK (32'h10c) +`define SOC_IFC_REG_CPTRA_FUSE_PAUSER_LOCK_LOCK_LOW (0) +`define SOC_IFC_REG_CPTRA_FUSE_PAUSER_LOCK_LOCK_MASK (32'h1) +`define CLP_SOC_IFC_REG_CPTRA_WDT_CFG_0 (32'h30030110) +`define SOC_IFC_REG_CPTRA_WDT_CFG_0 (32'h110) +`define CLP_SOC_IFC_REG_CPTRA_WDT_CFG_1 (32'h30030114) +`define SOC_IFC_REG_CPTRA_WDT_CFG_1 (32'h114) +`define CLP_SOC_IFC_REG_CPTRA_ITRNG_ENTROPY_CONFIG_0 (32'h30030118) +`define SOC_IFC_REG_CPTRA_ITRNG_ENTROPY_CONFIG_0 (32'h118) +`define SOC_IFC_REG_CPTRA_ITRNG_ENTROPY_CONFIG_0_LOW_THRESHOLD_LOW (0) +`define SOC_IFC_REG_CPTRA_ITRNG_ENTROPY_CONFIG_0_LOW_THRESHOLD_MASK (32'hffff) +`define SOC_IFC_REG_CPTRA_ITRNG_ENTROPY_CONFIG_0_HIGH_THRESHOLD_LOW (16) +`define SOC_IFC_REG_CPTRA_ITRNG_ENTROPY_CONFIG_0_HIGH_THRESHOLD_MASK (32'hffff0000) +`define CLP_SOC_IFC_REG_CPTRA_ITRNG_ENTROPY_CONFIG_1 (32'h3003011c) +`define SOC_IFC_REG_CPTRA_ITRNG_ENTROPY_CONFIG_1 (32'h11c) +`define SOC_IFC_REG_CPTRA_ITRNG_ENTROPY_CONFIG_1_REPETITION_COUNT_LOW (0) +`define SOC_IFC_REG_CPTRA_ITRNG_ENTROPY_CONFIG_1_REPETITION_COUNT_MASK (32'hffff) +`define SOC_IFC_REG_CPTRA_ITRNG_ENTROPY_CONFIG_1_RSVD_LOW (16) +`define SOC_IFC_REG_CPTRA_ITRNG_ENTROPY_CONFIG_1_RSVD_MASK (32'hffff0000) +`define CLP_SOC_IFC_REG_CPTRA_RSVD_REG_0 (32'h30030120) +`define SOC_IFC_REG_CPTRA_RSVD_REG_0 (32'h120) +`define CLP_SOC_IFC_REG_CPTRA_RSVD_REG_1 (32'h30030124) +`define SOC_IFC_REG_CPTRA_RSVD_REG_1 (32'h124) `define CLP_SOC_IFC_REG_FUSE_UDS_SEED_0 (32'h30030200) `define SOC_IFC_REG_FUSE_UDS_SEED_0 (32'h200) `define CLP_SOC_IFC_REG_FUSE_UDS_SEED_1 (32'h30030204) @@ -5684,6 +5752,16 @@ `define SOC_IFC_REG_FUSE_LIFE_CYCLE (32'h33c) `define SOC_IFC_REG_FUSE_LIFE_CYCLE_LIFE_CYCLE_LOW (0) `define SOC_IFC_REG_FUSE_LIFE_CYCLE_LIFE_CYCLE_MASK (32'h3) +`define CLP_SOC_IFC_REG_FUSE_LMS_VERIFY (32'h30030340) +`define SOC_IFC_REG_FUSE_LMS_VERIFY (32'h340) +`define SOC_IFC_REG_FUSE_LMS_VERIFY_LMS_VERIFY_LOW (0) +`define SOC_IFC_REG_FUSE_LMS_VERIFY_LMS_VERIFY_MASK (32'h1) +`define CLP_SOC_IFC_REG_FUSE_LMS_REVOCATION (32'h30030344) +`define SOC_IFC_REG_FUSE_LMS_REVOCATION (32'h344) +`define CLP_SOC_IFC_REG_FUSE_SOC_STEPPING_ID (32'h30030348) +`define SOC_IFC_REG_FUSE_SOC_STEPPING_ID (32'h348) +`define SOC_IFC_REG_FUSE_SOC_STEPPING_ID_SOC_STEPPING_ID_LOW (0) +`define SOC_IFC_REG_FUSE_SOC_STEPPING_ID_SOC_STEPPING_ID_MASK (32'hffff) `define CLP_SOC_IFC_REG_INTERNAL_OBF_KEY_0 (32'h30030600) `define SOC_IFC_REG_INTERNAL_OBF_KEY_0 (32'h600) `define CLP_SOC_IFC_REG_INTERNAL_OBF_KEY_1 (32'h30030604) @@ -5714,6 +5792,34 @@ `define SOC_IFC_REG_INTERNAL_FW_UPDATE_RESET_WAIT_CYCLES_WAIT_CYCLES_MASK (32'hff) `define CLP_SOC_IFC_REG_INTERNAL_NMI_VECTOR (32'h3003062c) `define SOC_IFC_REG_INTERNAL_NMI_VECTOR (32'h62c) +`define CLP_SOC_IFC_REG_INTERNAL_HW_ERROR_FATAL_MASK (32'h30030630) +`define SOC_IFC_REG_INTERNAL_HW_ERROR_FATAL_MASK (32'h630) +`define SOC_IFC_REG_INTERNAL_HW_ERROR_FATAL_MASK_MASK_ICCM_ECC_UNC_LOW (0) +`define SOC_IFC_REG_INTERNAL_HW_ERROR_FATAL_MASK_MASK_ICCM_ECC_UNC_MASK (32'h1) +`define SOC_IFC_REG_INTERNAL_HW_ERROR_FATAL_MASK_MASK_DCCM_ECC_UNC_LOW (1) +`define SOC_IFC_REG_INTERNAL_HW_ERROR_FATAL_MASK_MASK_DCCM_ECC_UNC_MASK (32'h2) +`define SOC_IFC_REG_INTERNAL_HW_ERROR_FATAL_MASK_MASK_NMI_PIN_LOW (2) +`define SOC_IFC_REG_INTERNAL_HW_ERROR_FATAL_MASK_MASK_NMI_PIN_MASK (32'h4) +`define CLP_SOC_IFC_REG_INTERNAL_HW_ERROR_NON_FATAL_MASK (32'h30030634) +`define SOC_IFC_REG_INTERNAL_HW_ERROR_NON_FATAL_MASK (32'h634) +`define SOC_IFC_REG_INTERNAL_HW_ERROR_NON_FATAL_MASK_MASK_MBOX_PROT_NO_LOCK_LOW (0) +`define SOC_IFC_REG_INTERNAL_HW_ERROR_NON_FATAL_MASK_MASK_MBOX_PROT_NO_LOCK_MASK (32'h1) +`define SOC_IFC_REG_INTERNAL_HW_ERROR_NON_FATAL_MASK_MASK_MBOX_PROT_OOO_LOW (1) +`define SOC_IFC_REG_INTERNAL_HW_ERROR_NON_FATAL_MASK_MASK_MBOX_PROT_OOO_MASK (32'h2) +`define SOC_IFC_REG_INTERNAL_HW_ERROR_NON_FATAL_MASK_MASK_MBOX_ECC_UNC_LOW (2) +`define SOC_IFC_REG_INTERNAL_HW_ERROR_NON_FATAL_MASK_MASK_MBOX_ECC_UNC_MASK (32'h4) +`define CLP_SOC_IFC_REG_INTERNAL_FW_ERROR_FATAL_MASK (32'h30030638) +`define SOC_IFC_REG_INTERNAL_FW_ERROR_FATAL_MASK (32'h638) +`define CLP_SOC_IFC_REG_INTERNAL_FW_ERROR_NON_FATAL_MASK (32'h3003063c) +`define SOC_IFC_REG_INTERNAL_FW_ERROR_NON_FATAL_MASK (32'h63c) +`define CLP_SOC_IFC_REG_INTERNAL_RV_MTIME_L (32'h30030640) +`define SOC_IFC_REG_INTERNAL_RV_MTIME_L (32'h640) +`define CLP_SOC_IFC_REG_INTERNAL_RV_MTIME_H (32'h30030644) +`define SOC_IFC_REG_INTERNAL_RV_MTIME_H (32'h644) +`define CLP_SOC_IFC_REG_INTERNAL_RV_MTIMECMP_L (32'h30030648) +`define SOC_IFC_REG_INTERNAL_RV_MTIMECMP_L (32'h648) +`define CLP_SOC_IFC_REG_INTERNAL_RV_MTIMECMP_H (32'h3003064c) +`define SOC_IFC_REG_INTERNAL_RV_MTIMECMP_H (32'h64c) `define CLP_SOC_IFC_REG_INTR_BLOCK_RF_START (32'h30030800) `define CLP_SOC_IFC_REG_INTR_BLOCK_RF_GLOBAL_INTR_EN_R (32'h30030800) `define SOC_IFC_REG_INTR_BLOCK_RF_GLOBAL_INTR_EN_R (32'h800) @@ -5747,8 +5853,12 @@ `define SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTR_EN_R_NOTIF_MBOX_ECC_COR_EN_MASK (32'h2) `define SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTR_EN_R_NOTIF_DEBUG_LOCKED_EN_LOW (2) `define SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTR_EN_R_NOTIF_DEBUG_LOCKED_EN_MASK (32'h4) -`define SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTR_EN_R_NOTIF_SOC_REQ_LOCK_EN_LOW (3) -`define SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTR_EN_R_NOTIF_SOC_REQ_LOCK_EN_MASK (32'h8) +`define SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTR_EN_R_NOTIF_SCAN_MODE_EN_LOW (3) +`define SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTR_EN_R_NOTIF_SCAN_MODE_EN_MASK (32'h8) +`define SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTR_EN_R_NOTIF_SOC_REQ_LOCK_EN_LOW (4) +`define SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTR_EN_R_NOTIF_SOC_REQ_LOCK_EN_MASK (32'h10) +`define SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTR_EN_R_NOTIF_GEN_IN_TOGGLE_EN_LOW (5) +`define SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTR_EN_R_NOTIF_GEN_IN_TOGGLE_EN_MASK (32'h20) `define CLP_SOC_IFC_REG_INTR_BLOCK_RF_ERROR_GLOBAL_INTR_R (32'h3003080c) `define SOC_IFC_REG_INTR_BLOCK_RF_ERROR_GLOBAL_INTR_R (32'h80c) `define SOC_IFC_REG_INTR_BLOCK_RF_ERROR_GLOBAL_INTR_R_AGG_STS_LOW (0) @@ -5783,8 +5893,12 @@ `define SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_MBOX_ECC_COR_STS_MASK (32'h2) `define SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_DEBUG_LOCKED_STS_LOW (2) `define SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_DEBUG_LOCKED_STS_MASK (32'h4) -`define SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_SOC_REQ_LOCK_STS_LOW (3) -`define SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_SOC_REQ_LOCK_STS_MASK (32'h8) +`define SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_SCAN_MODE_STS_LOW (3) +`define SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_SCAN_MODE_STS_MASK (32'h8) +`define SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_SOC_REQ_LOCK_STS_LOW (4) +`define SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_SOC_REQ_LOCK_STS_MASK (32'h10) +`define SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_GEN_IN_TOGGLE_STS_LOW (5) +`define SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_GEN_IN_TOGGLE_STS_MASK (32'h20) `define CLP_SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTR_TRIG_R (32'h3003081c) `define SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTR_TRIG_R (32'h81c) `define SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTR_TRIG_R_ERROR_INTERNAL_TRIG_LOW (0) @@ -5811,8 +5925,12 @@ `define SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTR_TRIG_R_NOTIF_MBOX_ECC_COR_TRIG_MASK (32'h2) `define SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTR_TRIG_R_NOTIF_DEBUG_LOCKED_TRIG_LOW (2) `define SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTR_TRIG_R_NOTIF_DEBUG_LOCKED_TRIG_MASK (32'h4) -`define SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTR_TRIG_R_NOTIF_SOC_REQ_LOCK_TRIG_LOW (3) -`define SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTR_TRIG_R_NOTIF_SOC_REQ_LOCK_TRIG_MASK (32'h8) +`define SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTR_TRIG_R_NOTIF_SCAN_MODE_TRIG_LOW (3) +`define SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTR_TRIG_R_NOTIF_SCAN_MODE_TRIG_MASK (32'h8) +`define SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTR_TRIG_R_NOTIF_SOC_REQ_LOCK_TRIG_LOW (4) +`define SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTR_TRIG_R_NOTIF_SOC_REQ_LOCK_TRIG_MASK (32'h10) +`define SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTR_TRIG_R_NOTIF_GEN_IN_TOGGLE_TRIG_LOW (5) +`define SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTR_TRIG_R_NOTIF_GEN_IN_TOGGLE_TRIG_MASK (32'h20) `define CLP_SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_COUNT_R (32'h30030900) `define SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_COUNT_R (32'h900) `define CLP_SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INV_DEV_INTR_COUNT_R (32'h30030904) @@ -5835,8 +5953,12 @@ `define SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_MBOX_ECC_COR_INTR_COUNT_R (32'h984) `define CLP_SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_DEBUG_LOCKED_INTR_COUNT_R (32'h30030988) `define SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_DEBUG_LOCKED_INTR_COUNT_R (32'h988) -`define CLP_SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_SOC_REQ_LOCK_INTR_COUNT_R (32'h3003098c) -`define SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_SOC_REQ_LOCK_INTR_COUNT_R (32'h98c) +`define CLP_SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_SCAN_MODE_INTR_COUNT_R (32'h3003098c) +`define SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_SCAN_MODE_INTR_COUNT_R (32'h98c) +`define CLP_SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_SOC_REQ_LOCK_INTR_COUNT_R (32'h30030990) +`define SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_SOC_REQ_LOCK_INTR_COUNT_R (32'h990) +`define CLP_SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_GEN_IN_TOGGLE_INTR_COUNT_R (32'h30030994) +`define SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_GEN_IN_TOGGLE_INTR_COUNT_R (32'h994) `define CLP_SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_COUNT_INCR_R (32'h30030a00) `define SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_COUNT_INCR_R (32'ha00) `define SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_COUNT_INCR_R_PULSE_LOW (0) @@ -5881,10 +6003,18 @@ `define SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_DEBUG_LOCKED_INTR_COUNT_INCR_R (32'ha28) `define SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_DEBUG_LOCKED_INTR_COUNT_INCR_R_PULSE_LOW (0) `define SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_DEBUG_LOCKED_INTR_COUNT_INCR_R_PULSE_MASK (32'h1) -`define CLP_SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_SOC_REQ_LOCK_INTR_COUNT_INCR_R (32'h30030a2c) -`define SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_SOC_REQ_LOCK_INTR_COUNT_INCR_R (32'ha2c) +`define CLP_SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_SCAN_MODE_INTR_COUNT_INCR_R (32'h30030a2c) +`define SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_SCAN_MODE_INTR_COUNT_INCR_R (32'ha2c) +`define SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_SCAN_MODE_INTR_COUNT_INCR_R_PULSE_LOW (0) +`define SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_SCAN_MODE_INTR_COUNT_INCR_R_PULSE_MASK (32'h1) +`define CLP_SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_SOC_REQ_LOCK_INTR_COUNT_INCR_R (32'h30030a30) +`define SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_SOC_REQ_LOCK_INTR_COUNT_INCR_R (32'ha30) `define SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_SOC_REQ_LOCK_INTR_COUNT_INCR_R_PULSE_LOW (0) `define SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_SOC_REQ_LOCK_INTR_COUNT_INCR_R_PULSE_MASK (32'h1) +`define CLP_SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_GEN_IN_TOGGLE_INTR_COUNT_INCR_R (32'h30030a34) +`define SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_GEN_IN_TOGGLE_INTR_COUNT_INCR_R (32'ha34) +`define SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_GEN_IN_TOGGLE_INTR_COUNT_INCR_R_PULSE_LOW (0) +`define SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_GEN_IN_TOGGLE_INTR_COUNT_INCR_R_PULSE_MASK (32'h1) `endif \ No newline at end of file diff --git a/src/integration/rtl/caliptra_top.sv b/src/integration/rtl/caliptra_top.sv index 1dcd23645..3937626d9 100755 --- a/src/integration/rtl/caliptra_top.sv +++ b/src/integration/rtl/caliptra_top.sv @@ -56,7 +56,9 @@ module caliptra_top //QSPI Interface output logic qspi_clk_o, output logic [`CALIPTRA_QSPI_CS_WIDTH-1:0] qspi_cs_no, - inout wire [`CALIPTRA_QSPI_IO_WIDTH-1:0] qspi_d_io, + input wire [`CALIPTRA_QSPI_IO_WIDTH-1:0] qspi_d_i, + output logic [`CALIPTRA_QSPI_IO_WIDTH-1:0] qspi_d_o, + output logic [`CALIPTRA_QSPI_IO_WIDTH-1:0] qspi_d_en_o, //UART Interface // TODO: Determine if this should be set behind a ifdef @@ -69,7 +71,7 @@ module caliptra_top //TODO update with I3C interface signals // Caliptra Memory Export Interface - el2_mem_if el2_mem_export, + el2_mem_if.veer_sram_src el2_mem_export, //SRAM interface for mbox output logic mbox_sram_cs, @@ -121,8 +123,11 @@ module caliptra_top //clock gating signals logic clk_gating_en ; + logic rdc_clk_dis ; logic clk_cg ; logic soc_ifc_clk_cg ; + logic rdc_clk_cg ; + logic uc_clk_cg ; logic [31:0] ic_haddr ; logic [2:0] ic_hburst ; @@ -184,7 +189,15 @@ module caliptra_top logic [6:0] cptra_uncore_dmi_reg_addr; logic [31:0] cptra_uncore_dmi_reg_wdata; security_state_t cptra_security_state_Latched; + security_state_t cptra_security_state_Latched_d; + security_state_t cptra_security_state_Latched_f; + logic cptra_dmi_reg_en_preQ; + logic fw_update_rst_window; + + // Caliptra ECC status signals + rv_ecc_sts_t rv_ecc_sts; + logic iccm_lock; @@ -233,10 +246,11 @@ module caliptra_top logic clear_obf_secrets; logic clear_secrets; - logic cptra_security_state_captured, scan_mode_f, scan_mode_switch; - logic debugUnlock_or_scan_mode_switch, clear_obf_secrets_debugScanQ, cptra_scan_mode_Latched, debug_lock_to_unlock_switch; - var security_state_t security_state_f; - + logic cptra_security_state_captured; + logic scan_mode_switch; + logic debug_lock_or_scan_mode_switch, clear_obf_secrets_debugScanQ, debug_lock_switch; + logic cptra_scan_mode_Latched, cptra_scan_mode_Latched_d, cptra_scan_mode_Latched_f; + logic [TOTAL_OBF_KEY_BITS-1:0] cptra_obf_key_dbg; logic [`CLP_OBF_FE_DWORDS-1 :0][31:0] obf_field_entropy_dbg; logic [`CLP_OBF_UDS_DWORDS-1:0][31:0] obf_uds_seed_dbg; @@ -276,6 +290,17 @@ end //======================================================================== // AHB Master ports //======================================================================== + CALIPTRA_AHB_LITE_BUS_INF #( + .AHB_LITE_ADDR_WIDTH(`CALIPTRA_AHB_HADDR_SIZE), + .AHB_LITE_DATA_WIDTH(`CALIPTRA_AHB_HDATA_SIZE) + ) + sb_ahb(); + CALIPTRA_AHB_LITE_BUS_INF #( + .AHB_LITE_ADDR_WIDTH(`CALIPTRA_AHB_HADDR_SIZE), + .AHB_LITE_DATA_WIDTH(`CALIPTRA_AHB_HDATA_SIZE) + ) + lsu_ahb(); + CALIPTRA_AHB_LITE_BUS_INF #( .AHB_LITE_ADDR_WIDTH(`CALIPTRA_AHB_HADDR_SIZE), .AHB_LITE_DATA_WIDTH(`CALIPTRA_AHB_HDATA_SIZE) @@ -299,6 +324,7 @@ end ahb_lite_bus_i ( .hclk ( clk_cg ), .hreset_n ( cptra_noncore_rst_b ), + .force_bus_idle ( fw_update_rst_window ), .ahb_lite_responders ( responder_inst ), .ahb_lite_initiator ( initiator_inst ), .ahb_lite_resp_disable_i ( ahb_lite_resp_disable ), @@ -340,7 +366,6 @@ assign jtag_id[27:12] = '0; assign jtag_id[11:1] = 11'h45; assign reset_vector = `RV_RESET_VEC; assign soft_int = 1'b0; -assign timer_int = 1'b0; assign kv_error_intr = 1'b0; // TODO assign kv_notif_intr = 1'b0; // TODO @@ -380,9 +405,13 @@ always_comb begin end el2_veer_wrapper rvtop ( +`ifdef CALIPTRA_FORCE_CPU_RESET + .rst_l ( 1'b0 ), +`else .rst_l ( cptra_uc_rst_b), +`endif .dbg_rst_l ( cptra_pwrgood), - .clk ( clk ), + .clk ( uc_clk_cg ), .rst_vec ( reset_vector[31:1]), .nmi_int ( nmi_int ), .nmi_vec ( nmi_vector[31:1]), @@ -403,34 +432,34 @@ el2_veer_wrapper rvtop ( //--------------------------------------------------------------- // Debug AHB Master //--------------------------------------------------------------- - .sb_haddr (), - .sb_hburst (), - .sb_hmastlock (), - .sb_hprot (), - .sb_hsize (), - .sb_htrans (), - .sb_hwrite (), - .sb_hwdata (), - - .sb_hrdata ('0), - .sb_hready ('0), - .sb_hresp ('0), + .sb_haddr ( sb_ahb.haddr ), + .sb_hburst ( ), + .sb_hmastlock ( ), + .sb_hprot ( ), + .sb_hsize ( sb_ahb.hsize ), + .sb_htrans ( sb_ahb.htrans ), + .sb_hwrite ( sb_ahb.hwrite ), + .sb_hwdata ( sb_ahb.hwdata ), + + .sb_hrdata ( sb_ahb.hrdata ), + .sb_hready ( sb_ahb.hready ), + .sb_hresp ( sb_ahb.hresp ), //--------------------------------------------------------------- // LSU AHB Master //--------------------------------------------------------------- - .lsu_haddr ( initiator_inst.haddr ), - .lsu_hburst ( ), - .lsu_hmastlock ( ), - .lsu_hprot ( ), - .lsu_hsize ( initiator_inst.hsize ), - .lsu_htrans ( initiator_inst.htrans ), - .lsu_hwrite ( initiator_inst.hwrite ), - .lsu_hwdata ( initiator_inst.hwdata ), - - .lsu_hrdata ( initiator_inst.hrdata[63:0]), - .lsu_hready ( initiator_inst.hready ), - .lsu_hresp ( initiator_inst.hresp ), + .lsu_haddr ( lsu_ahb.haddr ), + .lsu_hburst ( ), + .lsu_hmastlock ( ), + .lsu_hprot ( ), + .lsu_hsize ( lsu_ahb.hsize ), + .lsu_htrans ( lsu_ahb.htrans ), + .lsu_hwrite ( lsu_ahb.hwrite ), + .lsu_hwdata ( lsu_ahb.hwdata ), + + .lsu_hrdata ( lsu_ahb.hrdata ), + .lsu_hready ( lsu_ahb.hready ), + .lsu_hresp ( lsu_ahb.hresp ), //--------------------------------------------------------------- // DMA Slave @@ -479,6 +508,7 @@ el2_veer_wrapper rvtop ( .cptra_uncore_dmi_reg_addr ( cptra_uncore_dmi_reg_addr ), .cptra_uncore_dmi_reg_wdata ( cptra_uncore_dmi_reg_wdata ), .cptra_security_state_Latched ( cptra_security_state_Latched), + .cptra_dmi_reg_en_preQ ( cptra_dmi_reg_en_preQ ), .mpc_debug_halt_ack ( mpc_debug_halt_ack), .mpc_debug_halt_req ( 1'b0), @@ -502,6 +532,12 @@ el2_veer_wrapper rvtop ( // Caliptra Memory Export Interface .el2_mem_export (el2_mem_export), + // Caliptra ECC status signals + .cptra_iccm_ecc_single_error(rv_ecc_sts.cptra_iccm_ecc_single_error), + .cptra_iccm_ecc_double_error(rv_ecc_sts.cptra_iccm_ecc_double_error), + .cptra_dccm_ecc_single_error(rv_ecc_sts.cptra_dccm_ecc_single_error), + .cptra_dccm_ecc_double_error(rv_ecc_sts.cptra_dccm_ecc_double_error), + .soft_int (soft_int), .core_id ('0), .scan_mode ( cptra_scan_mode_Latched ), // To enable scan mode @@ -513,38 +549,96 @@ el2_veer_wrapper rvtop ( always_comb responder_inst[`CALIPTRA_SLAVE_SEL_IDMA].hresp = responder_inst[`CALIPTRA_SLAVE_SEL_DDMA].hresp; always_comb responder_inst[`CALIPTRA_SLAVE_SEL_IDMA].hreadyout = responder_inst[`CALIPTRA_SLAVE_SEL_DDMA].hreadyout; + // SB and LSU AHB master mux + ahb_lite_2to1_mux #( + .AHB_LITE_ADDR_WIDTH (`CALIPTRA_AHB_HADDR_SIZE), + .AHB_LITE_DATA_WIDTH (`CALIPTRA_AHB_HDATA_SIZE), + .AHB_NO_OPT(1) //Prevent address and data phase overlap between initiators + ) u_sb_lsu_ahb_mux ( + .hclk (clk_cg), + .hreset_n (cptra_noncore_rst_b), + .force_bus_idle (fw_update_rst_window), + // Initiator 0 + .hsel_i_0 (1'b1 ), + .haddr_i_0 (lsu_ahb.haddr ), + .hwdata_i_0 (lsu_ahb.hwdata), + .hwrite_i_0 (lsu_ahb.hwrite), + .htrans_i_0 (lsu_ahb.htrans), + .hsize_i_0 (lsu_ahb.hsize ), + .hready_i_0 (1'b1 ), + .hresp_o_0 (lsu_ahb.hresp ), + .hready_o_0 (lsu_ahb.hready), + .hrdata_o_0 (lsu_ahb.hrdata), + + // Initiator 1 + .hsel_i_1 (1'b1 ), + .haddr_i_1 (sb_ahb.haddr ), + .hwdata_i_1 (sb_ahb.hwdata ), + .hwrite_i_1 (sb_ahb.hwrite ), + .htrans_i_1 (sb_ahb.htrans ), + .hsize_i_1 (sb_ahb.hsize ), + .hready_i_1 (1'b1 ), + .hresp_o_1 (sb_ahb.hresp ), + .hready_o_1 (sb_ahb.hready ), + .hrdata_o_1 (sb_ahb.hrdata ), + + // Responder + .hsel_o (initiator_inst.hsel ), + .haddr_o (initiator_inst.haddr ), + .hwdata_o (initiator_inst.hwdata), + .hwrite_o (initiator_inst.hwrite), + .htrans_o (initiator_inst.htrans), + .hsize_o (initiator_inst.hsize ), + .hready_o (initiator_inst.hready), + .hresp_i (initiator_inst.hresp ), + .hreadyout_i (initiator_inst.hreadyout), + .hrdata_i (initiator_inst.hrdata) + ); + // Security State value captured on a Caliptra reset deassertion (0->1 signal transition) - always_ff @(posedge clk or negedge cptra_rst_b) begin - if (~cptra_rst_b) begin - cptra_security_state_Latched <= '{device_lifecycle: DEVICE_PRODUCTION, debug_locked: 1'b1}; //Setting the default value to be debug locked and in production mode - security_state_f <= '{device_lifecycle: DEVICE_PRODUCTION, debug_locked: 1'b1}; //Setting the default value to be debug locked and in production mode + always_ff @(posedge clk or negedge cptra_noncore_rst_b) begin + if (~cptra_noncore_rst_b) begin + cptra_security_state_Latched_d <= '{device_lifecycle: DEVICE_PRODUCTION, debug_locked: 1'b1}; //Setting the default value to be debug locked and in production mode + cptra_security_state_Latched_f <= '{device_lifecycle: DEVICE_PRODUCTION, debug_locked: 1'b1}; + cptra_security_state_captured <= 0; - scan_mode_f <= 0; end else if(!cptra_security_state_captured) begin - cptra_security_state_Latched <= security_state; - cptra_scan_mode_Latched <= scan_mode; + cptra_security_state_Latched_d <= security_state; cptra_security_state_captured <= 1; end else begin - // Latched State is different than flopped value of security state - // Latched State is used if we want to open the JTAG and is - // determined to do so only at reset exit time - // Asset flushing happens 'anytime' switch happens for safe side - //security_state_f <= security_state; - security_state_f <= security_state; - scan_mode_f <= scan_mode; + cptra_security_state_Latched_f <= cptra_security_state_Latched_d; + end + end + + always_ff @(posedge clk or negedge cptra_pwrgood) begin + if (~cptra_pwrgood) begin + cptra_scan_mode_Latched_d <= '0; + cptra_scan_mode_Latched_f <= '0; + end + else begin + cptra_scan_mode_Latched_d <= scan_mode; + cptra_scan_mode_Latched_f <= cptra_scan_mode_Latched_d; end end + //Lock debug unless both flops are unlocked + assign cptra_security_state_Latched.debug_locked = cptra_security_state_Latched_d.debug_locked | cptra_security_state_Latched_f.debug_locked; + //Pass on the latched value of device lifecycle + assign cptra_security_state_Latched.device_lifecycle = cptra_security_state_Latched_d.device_lifecycle; + //Only assert scan mode once both flops have set + assign cptra_scan_mode_Latched = cptra_scan_mode_Latched_d & cptra_scan_mode_Latched_f; + // When scan mode goes from 0->1, generate a pulse to clear the assets // Note that when scan goes to '1, Caliptra state as well as SOC state // gets messed up. So switch to scan is destructive (obvious! Duh!) - assign scan_mode_switch = ~scan_mode_f & scan_mode; - // 1->0 transition (Debug locked to unlocked) - assign debug_lock_to_unlock_switch = security_state_f.debug_locked & ~security_state.debug_locked; - assign debugUnlock_or_scan_mode_switch = debug_lock_to_unlock_switch | scan_mode_switch; - assign clear_obf_secrets_debugScanQ = clear_obf_secrets | debugUnlock_or_scan_mode_switch; + assign scan_mode_switch = cptra_scan_mode_Latched_d & ~cptra_scan_mode_Latched_f; + // Detect transition of debug mode + assign debug_lock_switch = cptra_security_state_Latched_d.debug_locked ^ cptra_security_state_Latched_f.debug_locked; + assign debug_lock_or_scan_mode_switch = debug_lock_switch | scan_mode_switch | cptra_error_fatal; + + assign clear_obf_secrets_debugScanQ = clear_obf_secrets | cptra_in_debug_scan_mode | cptra_error_fatal; //=========================================================================- // Clock gating instance @@ -555,9 +649,16 @@ clk_gate cg ( .psel(PSEL), .clk_gate_en(clk_gating_en), .cpu_halt_status(o_cpu_halt_status), + .rdc_clk_dis(rdc_clk_dis), + .rdc_clk_dis_uc (fw_update_rst_window), .clk_cg (clk_cg), .soc_ifc_clk_cg (soc_ifc_clk_cg), - .generic_input_wires(generic_input_wires) + .rdc_clk_cg (rdc_clk_cg), + .uc_clk_cg (uc_clk_cg), + .generic_input_wires(generic_input_wires), + .cptra_error_fatal(cptra_error_fatal), + .cptra_in_debug_scan_mode(cptra_in_debug_scan_mode), + .cptra_dmi_reg_en_preQ(cptra_dmi_reg_en_preQ) ); //=========================================================================- // AHB I$ instance @@ -569,7 +670,8 @@ ahb_lite_2to1_mux #( .AHB_LITE_DATA_WIDTH(`CALIPTRA_IMEM_DATA_WIDTH) ) u_ahb_lite_2to1_mux ( .hclk (clk_cg), - .hreset_n (cptra_noncore_rst_b), + .hreset_n (cptra_uc_rst_b), + .force_bus_idle (fw_update_rst_window), // From Initiator 0 // Inputs .hsel_i_0 (responder_inst[`CALIPTRA_SLAVE_SEL_IMEM].hsel), @@ -619,7 +721,7 @@ caliptra_ahb_srom #( //AMBA AHB Lite INF .hclk (clk_cg), - .hreset_n (cptra_noncore_rst_b), + .hreset_n (cptra_uc_rst_b), .haddr_i (imem_haddr[`CALIPTRA_IMEM_BYTE_ADDR_W-1:0]), .hwdata_i (`CALIPTRA_IMEM_DATA_WIDTH'(0) ), .hsel_i (imem_hsel), @@ -668,7 +770,8 @@ sha512_ctrl #( .pcr_signing_hash(pcr_signing_data.pcr_hash), .error_intr(sha512_error_intr), - .notif_intr(sha512_notif_intr) + .notif_intr(sha512_notif_intr), + .debugUnlock_or_scan_mode_switch(debug_lock_or_scan_mode_switch) ); sha256_ctrl #( @@ -690,11 +793,12 @@ sha256_ctrl #( .hrdata_o (responder_inst[`CALIPTRA_SLAVE_SEL_SHA256].hrdata), .error_intr(sha256_error_intr), - .notif_intr(sha256_notif_intr) + .notif_intr(sha256_notif_intr), + .debugUnlock_or_scan_mode_switch(debug_lock_or_scan_mode_switch) ); //override device secrets with debug values in Debug or Scan Mode -always_comb cptra_in_debug_scan_mode = ~security_state.debug_locked | scan_mode; +always_comb cptra_in_debug_scan_mode = ~cptra_security_state_Latched.debug_locked | cptra_scan_mode_Latched; always_comb cptra_obf_key_dbg = cptra_in_debug_scan_mode ? `CLP_DEBUG_MODE_OBF_KEY : cptra_obf_key_reg; always_comb obf_uds_seed_dbg = cptra_in_debug_scan_mode ? `CLP_DEBUG_MODE_UDS_SEED : obf_uds_seed; always_comb obf_field_entropy_dbg = cptra_in_debug_scan_mode ? `CLP_DEBUG_MODE_FIELD_ENTROPY : obf_field_entropy; @@ -724,8 +828,8 @@ doe_ctrl #( .notif_intr(doe_notif_intr), .clear_obf_secrets(clear_obf_secrets), //Output .kv_write (kv_write[KV_NUM_WRITE-1]), - .kv_wr_resp (kv_wr_resp[KV_NUM_WRITE-1]) - + .kv_wr_resp (kv_wr_resp[KV_NUM_WRITE-1]), + .debugUnlock_or_scan_mode_switch(debug_lock_or_scan_mode_switch) ); @@ -756,7 +860,8 @@ ecc_top1 .pcr_signing_data(pcr_signing_data), .error_intr (ecc_error_intr), - .notif_intr (ecc_notif_intr) + .notif_intr (ecc_notif_intr), + .debugUnlock_or_scan_mode_switch(debug_lock_or_scan_mode_switch) ); hmac_ctrl #( @@ -782,7 +887,8 @@ hmac_ctrl #( .kv_wr_resp (kv_wr_resp[0]), .error_intr(hmac_error_intr), - .notif_intr(hmac_notif_intr) + .notif_intr(hmac_notif_intr), + .debugUnlock_or_scan_mode_switch(debug_lock_or_scan_mode_switch) ); @@ -792,28 +898,30 @@ kv #( ) key_vault1 ( - .clk (clk_cg), - .rst_b (cptra_noncore_rst_b), - .core_only_rst_b (cptra_uc_rst_b), - .cptra_pwrgood (cptra_pwrgood), - .haddr_i (responder_inst[`CALIPTRA_SLAVE_SEL_KV].haddr[`CALIPTRA_SLAVE_ADDR_WIDTH(`CALIPTRA_SLAVE_SEL_KV)-1:0]), - .hwdata_i (responder_inst[`CALIPTRA_SLAVE_SEL_KV].hwdata), - .hsel_i (responder_inst[`CALIPTRA_SLAVE_SEL_KV].hsel), - .hwrite_i (responder_inst[`CALIPTRA_SLAVE_SEL_KV].hwrite), - .hready_i (responder_inst[`CALIPTRA_SLAVE_SEL_KV].hready), - .htrans_i (responder_inst[`CALIPTRA_SLAVE_SEL_KV].htrans), - .hsize_i (responder_inst[`CALIPTRA_SLAVE_SEL_KV].hsize), - .hresp_o (responder_inst[`CALIPTRA_SLAVE_SEL_KV].hresp), - .hreadyout_o (responder_inst[`CALIPTRA_SLAVE_SEL_KV].hreadyout), - .hrdata_o (responder_inst[`CALIPTRA_SLAVE_SEL_KV].hrdata), - - .debugUnlock_or_scan_mode_switch (debugUnlock_or_scan_mode_switch), - - .kv_read (kv_read), - .kv_write (kv_write), - .kv_rd_resp (kv_rd_resp), - .kv_wr_resp (kv_wr_resp), - .pcr_signing_key (pcr_signing_data.pcr_signing_privkey) + .clk (clk_cg), + .rst_b (cptra_noncore_rst_b), + .core_only_rst_b (cptra_uc_rst_b), + .cptra_pwrgood (cptra_pwrgood), + .fw_update_rst_window (fw_update_rst_window), + .haddr_i (responder_inst[`CALIPTRA_SLAVE_SEL_KV].haddr[`CALIPTRA_SLAVE_ADDR_WIDTH(`CALIPTRA_SLAVE_SEL_KV)-1:0]), + .hwdata_i (responder_inst[`CALIPTRA_SLAVE_SEL_KV].hwdata), + .hsel_i (responder_inst[`CALIPTRA_SLAVE_SEL_KV].hsel), + .hwrite_i (responder_inst[`CALIPTRA_SLAVE_SEL_KV].hwrite), + .hready_i (responder_inst[`CALIPTRA_SLAVE_SEL_KV].hready), + .htrans_i (responder_inst[`CALIPTRA_SLAVE_SEL_KV].htrans), + .hsize_i (responder_inst[`CALIPTRA_SLAVE_SEL_KV].hsize), + .hresp_o (responder_inst[`CALIPTRA_SLAVE_SEL_KV].hresp), + .hreadyout_o (responder_inst[`CALIPTRA_SLAVE_SEL_KV].hreadyout), + .hrdata_o (responder_inst[`CALIPTRA_SLAVE_SEL_KV].hrdata), + + .cptra_in_debug_scan_mode(cptra_in_debug_scan_mode), + .debugUnlock_or_scan_mode_switch (debug_lock_or_scan_mode_switch), + + .kv_read (kv_read), + .kv_write (kv_write), + .kv_rd_resp (kv_rd_resp), + .kv_wr_resp (kv_wr_resp), + .pcr_signing_key (pcr_signing_data.pcr_signing_privkey) ); pv #( @@ -822,24 +930,26 @@ pv #( ) pcr_vault1 ( - .clk (clk_cg), - .rst_b (cptra_noncore_rst_b), - .cptra_pwrgood (cptra_pwrgood), - .haddr_i (responder_inst[`CALIPTRA_SLAVE_SEL_PV].haddr[`CALIPTRA_SLAVE_ADDR_WIDTH(`CALIPTRA_SLAVE_SEL_PV)-1:0]), - .hwdata_i (responder_inst[`CALIPTRA_SLAVE_SEL_PV].hwdata), - .hsel_i (responder_inst[`CALIPTRA_SLAVE_SEL_PV].hsel), - .hwrite_i (responder_inst[`CALIPTRA_SLAVE_SEL_PV].hwrite), - .hready_i (responder_inst[`CALIPTRA_SLAVE_SEL_PV].hready), - .htrans_i (responder_inst[`CALIPTRA_SLAVE_SEL_PV].htrans), - .hsize_i (responder_inst[`CALIPTRA_SLAVE_SEL_PV].hsize), - .hresp_o (responder_inst[`CALIPTRA_SLAVE_SEL_PV].hresp), - .hreadyout_o (responder_inst[`CALIPTRA_SLAVE_SEL_PV].hreadyout), - .hrdata_o (responder_inst[`CALIPTRA_SLAVE_SEL_PV].hrdata), - - .pv_read (pv_read), - .pv_write (pv_write), - .pv_rd_resp (pv_rd_resp), - .pv_wr_resp (pv_wr_resp) + .clk (clk_cg), + .rst_b (cptra_noncore_rst_b), + .core_only_rst_b (cptra_uc_rst_b), + .cptra_pwrgood (cptra_pwrgood), + .fw_update_rst_window (fw_update_rst_window), + .haddr_i (responder_inst[`CALIPTRA_SLAVE_SEL_PV].haddr[`CALIPTRA_SLAVE_ADDR_WIDTH(`CALIPTRA_SLAVE_SEL_PV)-1:0]), + .hwdata_i (responder_inst[`CALIPTRA_SLAVE_SEL_PV].hwdata), + .hsel_i (responder_inst[`CALIPTRA_SLAVE_SEL_PV].hsel), + .hwrite_i (responder_inst[`CALIPTRA_SLAVE_SEL_PV].hwrite), + .hready_i (responder_inst[`CALIPTRA_SLAVE_SEL_PV].hready), + .htrans_i (responder_inst[`CALIPTRA_SLAVE_SEL_PV].htrans), + .hsize_i (responder_inst[`CALIPTRA_SLAVE_SEL_PV].hsize), + .hresp_o (responder_inst[`CALIPTRA_SLAVE_SEL_PV].hresp), + .hreadyout_o (responder_inst[`CALIPTRA_SLAVE_SEL_PV].hreadyout), + .hrdata_o (responder_inst[`CALIPTRA_SLAVE_SEL_PV].hrdata), + + .pv_read (pv_read), + .pv_write (pv_write), + .pv_rd_resp (pv_rd_resp), + .pv_wr_resp (pv_wr_resp) ); dv #( @@ -897,7 +1007,7 @@ csrng #( .hreadyout_o (responder_inst[`CALIPTRA_SLAVE_SEL_CSRNG].hreadyout), .hrdata_o (responder_inst[`CALIPTRA_SLAVE_SEL_CSRNG].hrdata), // OTP Interface - .otp_en_csrng_sw_app_read_i(prim_mubi_pkg::MuBi8True), + .otp_en_csrng_sw_app_read_i(caliptra_prim_mubi_pkg::MuBi8True), // Lifecycle broadcast inputs .lc_hw_debug_en_i (lc_ctrl_pkg::On), // Entropy Interface @@ -910,7 +1020,7 @@ csrng #( .csrng_cmd_o (), // Alerts .alert_tx_o (), - .alert_rx_i ({prim_alert_pkg::ALERT_RX_DEFAULT, prim_alert_pkg::ALERT_RX_DEFAULT}), + .alert_rx_i ({caliptra_prim_alert_pkg::ALERT_RX_DEFAULT, caliptra_prim_alert_pkg::ALERT_RX_DEFAULT}), // Interrupt .intr_cs_cmd_req_done_o (), .intr_cs_entropy_req_o (), @@ -936,8 +1046,8 @@ entropy_src #( .hreadyout_o (responder_inst[`CALIPTRA_SLAVE_SEL_ENTROPY_SRC].hreadyout), .hrdata_o (responder_inst[`CALIPTRA_SLAVE_SEL_ENTROPY_SRC].hrdata), // OTP Interface - .otp_en_entropy_src_fw_read_i(prim_mubi_pkg::MuBi8True), - .otp_en_entropy_src_fw_over_i(prim_mubi_pkg::MuBi8True), + .otp_en_entropy_src_fw_read_i(caliptra_prim_mubi_pkg::MuBi8True), + .otp_en_entropy_src_fw_over_i(caliptra_prim_mubi_pkg::MuBi8True), // RNG Interface .rng_fips_o (), // Entropy Interface @@ -953,7 +1063,7 @@ entropy_src #( .entropy_src_xht_o (), .entropy_src_xht_i (entropy_src_xht_rsp_t'('0)), // Alerts - .alert_rx_i ({prim_alert_pkg::ALERT_RX_DEFAULT, prim_alert_pkg::ALERT_RX_DEFAULT}), + .alert_rx_i ({caliptra_prim_alert_pkg::ALERT_RX_DEFAULT, caliptra_prim_alert_pkg::ALERT_RX_DEFAULT}), .alert_tx_o (), // Interrupts .intr_es_entropy_valid_o (), @@ -971,22 +1081,15 @@ entropy_src #( logic cio_sck_en_o; logic [`CALIPTRA_QSPI_CS_WIDTH-1:0] cio_csb_o; logic [`CALIPTRA_QSPI_CS_WIDTH-1:0] cio_csb_en_o; - logic [`CALIPTRA_QSPI_IO_WIDTH-1:0] cio_sd_o; - logic [`CALIPTRA_QSPI_IO_WIDTH-1:0] cio_sd_en_o; - logic [`CALIPTRA_QSPI_IO_WIDTH-1:0] cio_sd_i; assign qspi_clk_o = cio_sck_en_o ? cio_sck_o : 1'b0; for (genvar ii = 0; ii < `CALIPTRA_QSPI_CS_WIDTH; ii += 1) begin : gen_qspi_cs assign qspi_cs_no[ii] = cio_csb_en_o[ii] ? cio_csb_o[ii] : 1'b1; end - for (genvar ii = 0; ii < `CALIPTRA_QSPI_IO_WIDTH; ii += 1) begin : gen_qspi_io - assign qspi_d_io[ii] = cio_sd_en_o[ii] ? cio_sd_o[ii] : 1'bz; - assign cio_sd_i[ii] = cio_sd_en_o[ii] ? 1'bz : qspi_d_io[ii]; - end spi_host #( .AHBDataWidth(`CALIPTRA_AHB_HDATA_SIZE), - .AHBAddrWidth(`CALIPTRA_SLAVE_ADDR_WIDTH(`CALIPTRA_SLAVE_SEL_CSRNG)) + .AHBAddrWidth(`CALIPTRA_SLAVE_ADDR_WIDTH(`CALIPTRA_SLAVE_SEL_QSPI)) ) spi_host ( // Clock and reset connections .clk_i (clk_cg), @@ -1003,16 +1106,16 @@ spi_host #( .hreadyout_o (responder_inst[`CALIPTRA_SLAVE_SEL_QSPI].hreadyout), .hrdata_o (responder_inst[`CALIPTRA_SLAVE_SEL_QSPI].hrdata), // Alerts - .alert_rx_i(prim_alert_pkg::ALERT_RX_DEFAULT), + .alert_rx_i(caliptra_prim_alert_pkg::ALERT_RX_DEFAULT), .alert_tx_o(), // SPI Interface .cio_sck_o (cio_sck_o), .cio_sck_en_o (cio_sck_en_o), .cio_csb_o (cio_csb_o), .cio_csb_en_o (cio_csb_en_o), - .cio_sd_o (cio_sd_o), - .cio_sd_en_o (cio_sd_en_o), - .cio_sd_i (cio_sd_i), + .cio_sd_o (qspi_d_o), + .cio_sd_en_o (qspi_d_en_o), + .cio_sd_i (qspi_d_i), .intr_error_o(), .intr_spi_event_o() ); @@ -1020,7 +1123,8 @@ spi_host #( //QSPI Tie Off assign qspi_clk_o = '0; assign qspi_cs_no = '0; -assign qspi_d_io = '0; +assign qspi_d_o = '0; +assign qspi_d_en_o = '0; `endif `ifdef CALIPTRA_INTERNAL_UART @@ -1072,6 +1176,7 @@ soc_ifc_top1 .clk(clk), .clk_cg(clk_cg), .soc_ifc_clk_cg(soc_ifc_clk_cg), + .rdc_clk_cg(rdc_clk_cg), .cptra_pwrgood(cptra_pwrgood), .cptra_rst_b(cptra_rst_b), .ready_for_fuses(ready_for_fuses), @@ -1080,7 +1185,7 @@ soc_ifc_top1 .mailbox_data_avail(mailbox_data_avail), .mailbox_flow_done(mailbox_flow_done), - .security_state(security_state), + .security_state(cptra_security_state_Latched), .BootFSM_BrkPoint (BootFSM_BrkPoint), @@ -1091,6 +1196,9 @@ soc_ifc_top1 .mbox_sram_req(mbox_sram_req), .mbox_sram_resp(mbox_sram_resp), + // RV ECC Status Interface + .rv_ecc_sts(rv_ecc_sts), + //APB Interface with SoC .paddr_i(PADDR[`CALIPTRA_SLAVE_ADDR_WIDTH(`CALIPTRA_SLAVE_SEL_SOC_IFC)-1:0]), .psel_i(PSEL), @@ -1125,9 +1233,10 @@ soc_ifc_top1 .soc_ifc_notif_intr(soc_ifc_notif_intr), .sha_error_intr(sha_error_intr), .sha_notif_intr(sha_notif_intr), + .timer_intr(timer_int), //Obfuscated UDS and FE .clear_obf_secrets(clear_obf_secrets_debugScanQ), //input - includes debug & scan modes to do the register clearing - .scan_mode_f(scan_mode_f), + .scan_mode_f(cptra_scan_mode_Latched), .cptra_obf_key(cptra_obf_key), .cptra_obf_key_reg(cptra_obf_key_reg), .obf_field_entropy(obf_field_entropy), @@ -1143,6 +1252,8 @@ soc_ifc_top1 .cptra_uc_rst_b (cptra_uc_rst_b), //Clock gating en .clk_gating_en(clk_gating_en), + .rdc_clk_dis(rdc_clk_dis), + .fw_update_rst_window(fw_update_rst_window), //caliptra uncore jtag ports .cptra_uncore_dmi_reg_en ( cptra_uncore_dmi_reg_en ), diff --git a/src/integration/rtl/config_defines.svh b/src/integration/rtl/config_defines.svh index 44d5230b8..1a52b4002 100755 --- a/src/integration/rtl/config_defines.svh +++ b/src/integration/rtl/config_defines.svh @@ -32,7 +32,7 @@ // AHB Address Map `define CALIPTRA_SLAVE_NAMES {"ENTROPY_SRC", "CSRNG" , "IMEM" , "SHA256" , "VEER_ICCM_DMA" , "VEER_DCCM_DMA" , "SOC_IFC" , "I3C" , "UART" , "QSPI" , "SHA512" , "DATAVAULT" , "PCRVAULT" , "KEYVAULT" , "HMAC" , "ECC" , "DOE_CTRL" } /* Array of names for peripherals */ `define CALIPTRA_SLAVE_BASE_ADDR {32'h2000_3000, 32'h2000_2000, 32'h0000_0000, 32'h1002_8000, 32'h4000_0000 , 32'h5000_0000 , 32'h3000_0000, 32'hFFFF_FFFF, 32'h2000_1000, 32'h2000_0000, 32'h1002_0000, 32'h1001_C000, 32'h1001_A000, 32'h1001_8000, 32'h1001_0000, 32'h1000_8000, 32'h1000_0000} /* Array with slave base address */ - `define CALIPTRA_SLAVE_MASK_ADDR {32'h2000_3FFF, 32'h2000_2FFF, 32'h0000_8000, 32'h1002_FFFF, 32'h4001_FFFF , 32'h5001_FFFF , 32'h3003_FFFF, 32'hFFFF_FFFF, 32'h2000_1FFF, 32'h2000_0FFF, 32'h1002_7FFF, 32'h1001_DFFF, 32'h1001_BFFF, 32'h1001_9FFF, 32'h1001_0FFF, 32'h1000_FFFF, 32'h1000_7FFF} /* Array with slave offset address */ + `define CALIPTRA_SLAVE_MASK_ADDR {32'h2000_3FFF, 32'h2000_2FFF, 32'h0000_BFFF, 32'h1002_FFFF, 32'h4001_FFFF , 32'h5001_FFFF , 32'h3003_FFFF, 32'hFFFF_FFFF, 32'h2000_1FFF, 32'h2000_0FFF, 32'h1002_7FFF, 32'h1001_DFFF, 32'h1001_BFFF, 32'h1001_9FFF, 32'h1001_0FFF, 32'h1000_FFFF, 32'h1000_7FFF} /* Array with slave offset address */ `define CALIPTRA_SLAVE_ADDR_MASK (`CALIPTRA_SLAVE_BASE_ADDR ^ `CALIPTRA_SLAVE_MASK_ADDR) /* Array indicating meaningful address bits for each slave */ `define CALIPTRA_SLAVE_ADDR_WIDTH(n) $clog2((`CALIPTRA_SLAVE_ADDR_MASK >> (`CALIPTRA_AHB_HADDR_SIZE*n)) & {`CALIPTRA_AHB_HADDR_SIZE{1'b1}}) /* Decode address width for each slave from assigned BASE/MASK address */ `define CALIPTRA_SLAVE_SEL_DOE 0 @@ -83,7 +83,7 @@ //`define CALIPTRA_KV_NUM_READ 6 //`define CALIPTRA_KV_NUM_WRITE 4 - `define CALIPTRA_IMEM_BYTE_SIZE 32768 + `define CALIPTRA_IMEM_BYTE_SIZE 49152 `define CALIPTRA_IMEM_DATA_WIDTH 64 `define CALIPTRA_IMEM_DEPTH `CALIPTRA_IMEM_BYTE_SIZE / (`CALIPTRA_IMEM_DATA_WIDTH/8) `define CALIPTRA_IMEM_BYTE_ADDR_W $clog2(`CALIPTRA_IMEM_BYTE_SIZE) diff --git a/src/integration/stimulus/L0_regression.yml b/src/integration/stimulus/L0_regression.yml index 91afa9e8d..e979afb51 100644 --- a/src/integration/stimulus/L0_regression.yml +++ b/src/integration/stimulus/L0_regression.yml @@ -9,6 +9,7 @@ contents: #add back for aes #- ../test_suites/smoke_test_aes/smoke_test_aes.yml - ../test_suites/smoke_test_mbox/smoke_test_mbox.yml + #- ../test_suites/smoke_test_mbox_cg/smoke_test_mbox_cg.yml - ../test_suites/smoke_test_sha512/smoke_test_sha512.yml - ../test_suites/smoke_test_sha256/smoke_test_sha256.yml - ../test_suites/smoke_test_sha_accel/smoke_test_sha_accel.yml @@ -21,20 +22,32 @@ contents: - ../test_suites/smoke_test_hmac/smoke_test_hmac.yml - ../test_suites/smoke_test_kv/smoke_test_kv.yml - ../test_suites/smoke_test_sram_ecc/smoke_test_sram_ecc.yml - # smoke_test_trng requires Caliptra to be built using the - # +define+CALIPTRA_INTERNAL_TRNG argument, which is not the - # default build config - # It will simply die without running in this L0 regression + - ../test_suites/smoke_test_ras/smoke_test_ras.yml + # The following tests need defines, which are not in the default build config + # smoke_test_trng : +define+CALIPTRA_INTERNAL_TRNG + # smoke_test_qspi : +define+CALIPTRA_INTERNAL_QSPI + # smoke_test_uart : +define+CALIPTRA_INTERNAL_UART + # They will simply die without running in this L0 regression - ../test_suites/smoke_test_trng/smoke_test_trng.yml + - ../test_suites/smoke_test_qspi/smoke_test_qspi.yml + - ../test_suites/smoke_test_uart/smoke_test_uart.yml - ../test_suites/smoke_test_kv_uds_reset/smoke_test_kv_uds_reset.yml - ../test_suites/smoke_test_kv_securitystate/smoke_test_kv_securitystate.yml - ../test_suites/smoke_test_kv_ecc_flow/smoke_test_kv_ecc_flow.yml - ../test_suites/smoke_test_kv_hmac_flow/smoke_test_kv_hmac_flow.yml - ../test_suites/smoke_test_kv_sha512_flow/smoke_test_kv_sha512_flow.yml - ../test_suites/smoke_test_kv_crypto_flow/smoke_test_kv_crypto_flow.yml + #- ../test_suites/smoke_test_kv_cg/smoke_test_kv_cg.yml - ../test_suites/pv_hash_and_sign/pv_hash_and_sign.yml - ../test_suites/smoke_test_pcr_signing/smoke_test_pcr_signing.yml + - ../test_suites/smoke_test_fw_kv_backtoback_hmac/smoke_test_fw_kv_backtoback_hmac.yml + - ../test_suites/smoke_test_ecc_errortrigger/smoke_test_ecc_errortrigger.yml + - ../test_suites/smoke_test_pcr_zeroize/smoke_test_pcr_zeroize.yml - ../test_suites/smoke_test_ahb_mux/smoke_test_ahb_mux.yml + - ../test_suites/smoke_test_doe_rand/smoke_test_doe_rand.yml + - ../test_suites/smoke_test_doe_scan/smoke_test_doe_scan.yml + - ../test_suites/smoke_test_zeroize_crypto/smoke_test_zeroize_crypto.yml + #- ../test_suites/smoke_test_doe_cg/smoke_test_doe_cg.yml # data vault tests - ../test_suites/smoke_test_datavault_basic/smoke_test_datavault_basic.yml - ../test_suites/smoke_test_datavault_reset/smoke_test_datavault_reset.yml @@ -44,5 +57,9 @@ contents: #smoke test debug state transition #smoke test interrupt handling #smoke test wd timer expiry and nmi generation + - ../test_suites/smoke_test_wdt/smoke_test_wdt.yml + - ../test_suites/smoke_test_cg_wdt/smoke_test_cg_wdt.yml #smoke test jtag #smoke test generic input wire to fw interrupt + - ../test_suites/smoke_test_clk_gating/smoke_test_clk_gating.yml + - ../test_suites/smoke_test_iccm_reset/smoke_test_iccm_reset.yml diff --git a/src/integration/stimulus/L0_trng_regression.yml b/src/integration/stimulus/L0_trng_regression.yml index 0fca213e9..9bf496444 100644 --- a/src/integration/stimulus/L0_trng_regression.yml +++ b/src/integration/stimulus/L0_trng_regression.yml @@ -6,32 +6,15 @@ contents: tags: ["L0_trng", "Lop_trng_regression", "top_trng_regression"] paths: - ../test_suites/smoke_test_veer/smoke_test_veer.yml - #add back for aes - #- ../test_suites/smoke_test_aes/smoke_test_aes.yml - ../test_suites/smoke_test_mbox/smoke_test_mbox.yml - - ../test_suites/smoke_test_sha512/smoke_test_sha512.yml - - ../test_suites/smoke_test_sha256/smoke_test_sha256.yml - ../test_suites/smoke_test_sha_accel/smoke_test_sha_accel.yml - - ../test_suites/memCpy_ROM_to_dccm/memCpy_ROM_to_dccm.yml - ../test_suites/memCpy_dccm_to_iccm/memCpy_dccm_to_iccm.yml - ../test_suites/hello_world_iccm/hello_world_iccm.yml - ../test_suites/iccm_lock/iccm_lock.yml - ../test_suites/c_intr_handler/c_intr_handler.yml - #- ../test_suites/smoke_test_ecc/smoke_test_ecc.yml - - ../test_suites/smoke_test_hmac/smoke_test_hmac.yml - - ../test_suites/smoke_test_kv/smoke_test_kv.yml - ../test_suites/smoke_test_sram_ecc/smoke_test_sram_ecc.yml - ../test_suites/smoke_test_trng/smoke_test_trng.yml - ../test_suites/smoke_test_kv_uds_reset/smoke_test_kv_uds_reset.yml - - ../test_suites/smoke_test_kv_securitystate/smoke_test_kv_securitystate.yml - - ../test_suites/smoke_test_kv_ecc_flow/smoke_test_kv_ecc_flow.yml - - ../test_suites/smoke_test_kv_hmac_flow/smoke_test_kv_hmac_flow.yml - - ../test_suites/smoke_test_kv_sha512_flow/smoke_test_kv_sha512_flow.yml - - ../test_suites/pv_hash_and_sign/pv_hash_and_sign.yml - #smoke test icc locking - #smoke test impactles reset - #smoke test debug state transition - #smoke test interrupt handling - #smoke test wd timer expiry and nmi generation - #smoke test jtag - #smoke test generic input wire to fw interrupt + - ../test_suites/smoke_test_wdt/smoke_test_wdt.yml + - ../test_suites/smoke_test_cg_wdt/smoke_test_cg_wdt.yml + - ../test_suites/smoke_test_clk_gating/smoke_test_clk_gating.yml diff --git a/src/integration/stimulus/testsuites/caliptra_top_nightly_random_regression.yml b/src/integration/stimulus/testsuites/caliptra_top_nightly_random_regression.yml index 116a6c0fd..70c33e93e 100644 --- a/src/integration/stimulus/testsuites/caliptra_top_nightly_random_regression.yml +++ b/src/integration/stimulus/testsuites/caliptra_top_nightly_random_regression.yml @@ -5,10 +5,16 @@ contents: - generator: tags: ["L1", "CALIPTRA_TOP", "random"] path: "" + config: + params: + # 12 hours to accommodate certain longer-running tests + timeout: 720 weight: 100 - generations: 100 + generations: 500 formats: generate: "reseed {template}.yml -seed {seed}" path: "{template_basename}__{seed}.yml" templates: $CALIPTRA_ROOT/src/integration/uvmf_caliptra_top/uvmf_template_output/project_benches/caliptra_top/tb/tests/src/caliptra_top_rand_test : { weight 100 } + $CALIPTRA_ROOT/src/integration/uvmf_caliptra_top/uvmf_template_output/project_benches/caliptra_top/tb/tests/src/caliptra_top_wdt_test : { weight 100 } + $CALIPTRA_ROOT/src/integration/uvmf_caliptra_top/uvmf_template_output/project_benches/caliptra_top/tb/tests/src/caliptra_top_wdt_independent_test : { weight 100 } diff --git a/src/integration/stimulus/testsuites/uvmf_caliptra_top_nightly_directed_regression.yml b/src/integration/stimulus/testsuites/uvmf_caliptra_top_nightly_directed_regression.yml new file mode 100644 index 000000000..5baa312a8 --- /dev/null +++ b/src/integration/stimulus/testsuites/uvmf_caliptra_top_nightly_directed_regression.yml @@ -0,0 +1,18 @@ +document: + schema: 1.0 + +contents: + - generator: + tags: ["L1", "CALIPTRA_TOP", "directed", "ROM"] + path: "" + config: + params: + # 12 hours + timeout: 720 + weight: 100 + generations: 1 + formats: + generate: "reseed {template}.yml -seed {seed}" + path: "{template_basename}__{seed}.yml" + templates: + $CALIPTRA_ROOT/src/integration/uvmf_caliptra_top/uvmf_template_output/project_benches/caliptra_top/tb/tests/src/caliptra_top_rom_test : { weight 100 } diff --git a/src/integration/stimulus/testsuites/uvmf_caliptra_top_promote_regression.yml b/src/integration/stimulus/testsuites/uvmf_caliptra_top_promote_regression.yml new file mode 100644 index 000000000..77fcfc323 --- /dev/null +++ b/src/integration/stimulus/testsuites/uvmf_caliptra_top_promote_regression.yml @@ -0,0 +1,15 @@ +document: + schema: 1.0 + +contents: + - generator: + tags: ["L0", "CALIPTRA_TOP", "directed", "smoke_test"] + path: "" + weight: 100 + generations: 1 + formats: + generate: "reseed {template}.yml -seed 1" + path: "{template_basename}__1.yml" + templates: + $CALIPTRA_ROOT/src/integration/uvmf_caliptra_top/uvmf_template_output/project_benches/caliptra_top/tb/tests/src/caliptra_top_cmdline_test : { weight 100 } + #$CALIPTRA_ROOT/src/integration/uvmf_caliptra_top/uvmf_template_output/project_benches/caliptra_top/tb/tests/src/caliptra_top_rand_test : { weight 500 } diff --git a/src/integration/tb/caliptra_top_tb.sv b/src/integration/tb/caliptra_top_tb.sv index ad0f48c12..ca7f5e21e 100755 --- a/src/integration/tb/caliptra_top_tb.sv +++ b/src/integration/tb/caliptra_top_tb.sv @@ -28,8 +28,8 @@ module caliptra_top_tb ( ); `endif - import caliptra_top_tb_pkg::*; import soc_ifc_pkg::*; + import caliptra_top_tb_pkg::*; `ifndef VERILATOR // Time formatting for %t in display tasks @@ -53,11 +53,19 @@ module caliptra_top_tb ( logic BootFSM_BrkPoint; logic scan_mode; - logic [7:0][31:0] cptra_obf_key; - logic [0:7][31:0] cptra_obf_key_uds, cptra_obf_key_fe; + logic [`CLP_OBF_KEY_DWORDS-1:0][31:0] cptra_obf_key; + logic [0:`CLP_OBF_KEY_DWORDS-1][31:0] cptra_obf_key_uds, cptra_obf_key_fe; - logic [0:11][31:0] cptra_uds_tb; - logic [0:31][31:0] cptra_fe_tb; + // logic [11:0][31:0] cptra_uds_tb; + // logic [7:0][31:0] cptra_fe_tb; + logic [0:`CLP_OBF_UDS_DWORDS-1][31:0] cptra_uds_tb; + logic [0:`CLP_OBF_FE_DWORDS-1][31:0] cptra_fe_tb; + + // logic [11:0][31:0] cptra_uds_rand; + // logic [7:0][31:0] cptra_fe_rand; + logic [0:`CLP_OBF_UDS_DWORDS-1][31:0] cptra_uds_rand; + logic [0:`CLP_OBF_FE_DWORDS-1][31:0] cptra_fe_rand; + logic [0:`CLP_OBF_KEY_DWORDS-1][31:0] cptra_obf_key_tb; logic start_apb_fuse_sequence; @@ -65,9 +73,11 @@ module caliptra_top_tb ( S_APB_IDLE, S_APB_WR_UDS, S_APB_WR_FE, + S_APB_WR_SOC_STEPPING_ID, S_APB_WR_FUSE_DONE, + S_APB_POLL_FLOW_ST, S_APB_WR_BOOT_GO, - S_APB_WAIT_FW_READY, + S_APB_WAIT_FW_TEST, S_APB_POLL_LOCK, S_APB_PRE_WR_CMD, S_APB_WR_CMD, @@ -75,13 +85,25 @@ module caliptra_top_tb ( S_APB_WR_DATAIN, S_APB_WR_STATUS, S_APB_WR_EXEC, + S_APB_WAIT_ERROR_AXS, + S_APB_RD_HW_ERROR_FATAL, + S_APB_WR_HW_ERROR_FATAL, + S_APB_RD_HW_ERROR_NON_FATAL, + S_APB_WR_HW_ERROR_NON_FATAL, S_APB_DONE, + S_APB_RD_DLEN, + S_APB_RD_DATAOUT, + S_APB_RST_EXEC, S_APB_ERROR } n_state_apb, c_state_apb; + parameter FW_NUM_DWORDS = 256; + logic [$clog2(FW_NUM_DWORDS)-1:0] apb_wr_count, apb_wr_count_nxt; + logic [31:0] apb_rd_count, apb_rd_count_nxt, dlen; logic apb_enable_ph; logic apb_xfer_end; + logic execute_mbox_rx_protocol; //jtag interface logic jtag_tck; // JTAG clk @@ -106,6 +128,8 @@ module caliptra_top_tb ( logic qspi_clk; logic [`CALIPTRA_QSPI_CS_WIDTH-1:0] qspi_cs_n; wire [`CALIPTRA_QSPI_IO_WIDTH-1:0] qspi_data; + logic [`CALIPTRA_QSPI_IO_WIDTH-1:0] qspi_data_host_to_device, qspi_data_device_to_host; + logic [`CALIPTRA_QSPI_IO_WIDTH-1:0] qspi_data_host_to_device_en; `ifdef CALIPTRA_INTERNAL_UART logic uart_loopback; @@ -128,11 +152,26 @@ module caliptra_top_tb ( //device lifecycle security_state_t security_state; + ras_test_ctrl_t ras_test_ctrl; logic [63:0] generic_input_wires; logic etrng_req; logic [3:0] itrng_data; logic itrng_valid; + logic cptra_error_fatal; + logic cptra_error_non_fatal; + logic [15:0] cptra_error_fatal_counter; + logic [15:0] cptra_error_non_fatal_counter; + logic cptra_error_fatal_dly_p; + logic cptra_error_non_fatal_dly_p; + + logic mbox_apb_dataout_read_ooo; + logic mbox_ooo_read_done; + logic mbox_apb_dataout_read_no_lock; + logic mbox_no_lock_read_done; + + logic [`CALIPTRA_APB_DATA_WIDTH-1:0] soc_ifc_hw_error_wdata; + //Interrupt flags //logic nmi_int; //logic soft_int; @@ -144,13 +183,16 @@ module caliptra_top_tb ( //Reset flags logic assert_hard_rst_flag; logic deassert_hard_rst_flag; + logic assert_rst_flag_from_service; + logic assert_rst_flag_from_fatal; logic assert_rst_flag; + logic deassert_rst_flag_from_service; + int count_deassert_rst_flag_from_fatal; + logic deassert_rst_flag_from_fatal; logic deassert_rst_flag; el2_mem_if el2_mem_export (); - parameter FW_NUM_DWORDS = 256; - logic [FW_NUM_DWORDS-1:0][31:0] fw_blob; `ifndef VERILATOR @@ -176,31 +218,177 @@ module caliptra_top_tb ( else if((c_state_apb == S_APB_WR_EXEC) && apb_xfer_end && int_flag) begin //Wait for APB flow to be done before toggling generic_input_wires - generic_input_wires <= 'h4001; //Toggle wires + generic_input_wires <= {$urandom, $urandom}; //Toggle wires end else if((cycleCnt == cycleCnt_ff + 15000) && int_flag) begin force caliptra_top_dut.soft_int = 'b1; end - else begin + else if (!ras_test_ctrl.error_injection_seen) begin release caliptra_top_dut.soft_int; release caliptra_top_dut.timer_int; generic_input_wires <= 'h0; end + + else if (ras_test_ctrl.reset_generic_input_wires) begin + generic_input_wires <= {32'h0, ERROR_NONE_SET}; + end + + else if (c_state_apb == S_APB_RD_HW_ERROR_FATAL && apb_xfer_end) begin + if (PRDATA[`SOC_IFC_REG_CPTRA_HW_ERROR_FATAL_ICCM_ECC_UNC_LOW]) begin + generic_input_wires <= {32'h0, ICCM_FATAL_OBSERVED}; + end + else if (PRDATA[`SOC_IFC_REG_CPTRA_HW_ERROR_FATAL_DCCM_ECC_UNC_LOW]) begin + generic_input_wires <= {32'h0, DCCM_FATAL_OBSERVED}; + end + else if (PRDATA[`SOC_IFC_REG_CPTRA_HW_ERROR_FATAL_NMI_PIN_LOW]) begin + generic_input_wires <= {32'h0, NMI_FATAL_OBSERVED}; + end + else begin + generic_input_wires <= {32'h0, ERROR_NONE_SET}; + end + end + + else if (c_state_apb == S_APB_RD_HW_ERROR_NON_FATAL && apb_xfer_end) begin + if (PRDATA[`SOC_IFC_REG_CPTRA_HW_ERROR_NON_FATAL_MBOX_PROT_NO_LOCK_LOW]) begin + generic_input_wires <= {32'h0, PROT_NO_LOCK_NON_FATAL_OBSERVED}; + end + else if (PRDATA[`SOC_IFC_REG_CPTRA_HW_ERROR_NON_FATAL_MBOX_PROT_OOO_LOW]) begin + generic_input_wires <= {32'h0, PROT_OOO_NON_FATAL_OBSERVED}; + end + else if (PRDATA[`SOC_IFC_REG_CPTRA_HW_ERROR_NON_FATAL_MBOX_ECC_UNC_LOW]) begin + generic_input_wires <= {32'h0, MBOX_NON_FATAL_OBSERVED}; + end + else begin + generic_input_wires <= {32'h0, ERROR_NONE_SET}; + end + end + + end + + always@(negedge core_clk or negedge cptra_pwrgood) begin + // This persists across soft reset + if (!cptra_pwrgood) begin + soc_ifc_hw_error_wdata <= '0; + end + else if (c_state_apb inside {S_APB_RD_HW_ERROR_FATAL, S_APB_RD_HW_ERROR_NON_FATAL} && apb_xfer_end) begin + // HW ERROR registers are W1C, capture the set bits + soc_ifc_hw_error_wdata <= PRDATA; + end + else if (c_state_apb inside {S_APB_WR_HW_ERROR_FATAL, S_APB_WR_HW_ERROR_NON_FATAL} && apb_xfer_end) begin + // Clear after completing the write + soc_ifc_hw_error_wdata <= 0; + end + end + + always@(negedge core_clk or negedge cptra_rst_b) begin + if (!cptra_rst_b) begin + cptra_error_fatal_counter <= 16'h0; + cptra_error_non_fatal_counter <= 16'h0; + end + else begin + cptra_error_fatal_counter <= cptra_error_fatal ? (cptra_error_fatal_counter + 16'h1) : 16'h0; + cptra_error_non_fatal_counter <= cptra_error_non_fatal ? (cptra_error_non_fatal_counter + 16'h1) : 16'h0; + end + end + // Pulse fires about 640ns after the original error interrupt occurs + always_comb cptra_error_fatal_dly_p = cptra_error_fatal_counter == 16'h0040; + always_comb cptra_error_non_fatal_dly_p = cptra_error_non_fatal_counter == 16'h0040; + + always_comb assert_rst_flag_from_fatal = c_state_apb == S_APB_ERROR; + always@(negedge core_clk) begin + if (!cptra_pwrgood) begin + count_deassert_rst_flag_from_fatal <= 0; + end + // Start counting after the fatal flag asserts reset, and continue + // counting until the reset is deasserted + else if (assert_rst_flag_from_fatal || (!cptra_rst_b && |count_deassert_rst_flag_from_fatal)) begin + count_deassert_rst_flag_from_fatal <= count_deassert_rst_flag_from_fatal + 1; + end + else begin + count_deassert_rst_flag_from_fatal <= 0; + end end + // Leave reset asserted for 32 clock cycles + always_comb deassert_rst_flag_from_fatal = count_deassert_rst_flag_from_fatal == 31; + assert property (@(posedge core_clk) c_state_apb == S_APB_WR_FUSE_DONE |-> !cptra_error_non_fatal) else begin + $error("cptra_error_non_fatal observed during boot up"); + $finish; + end + assert property (@(posedge core_clk) c_state_apb == S_APB_WR_FUSE_DONE |-> !cptra_error_fatal) else begin + $error("cptra_error_fatal observed during boot up"); + $finish; + end + + always@(negedge core_clk or negedge cptra_rst_b) begin + if(!cptra_rst_b) begin + mbox_apb_dataout_read_ooo <= 1'b0; + end + else if(ras_test_ctrl.do_ooo_access) begin + mbox_apb_dataout_read_ooo <= 1'b1; + end + else if (mbox_apb_dataout_read_ooo && (c_state_apb == S_APB_RD_DATAOUT) && (apb_rd_count == dlen)) begin + mbox_apb_dataout_read_ooo <= 1'b0; + end + end + + always@(negedge core_clk or negedge cptra_rst_b) begin + if(!cptra_rst_b) begin + mbox_apb_dataout_read_no_lock <= 1'b0; + end + else if(ras_test_ctrl.do_no_lock_access) begin + mbox_apb_dataout_read_no_lock <= 1'b1; + end + else if (mbox_apb_dataout_read_no_lock && (c_state_apb == S_APB_RD_DATAOUT) && (apb_rd_count == dlen)) begin + mbox_apb_dataout_read_no_lock <= 1'b0; + end + end + + always@(negedge core_clk or negedge cptra_rst_b) begin + if (!cptra_rst_b) begin + mbox_ooo_read_done <= 1'b0; + end + else if (mbox_apb_dataout_read_ooo && (c_state_apb == S_APB_RD_DATAOUT) && (apb_rd_count == dlen)) begin + mbox_ooo_read_done <= 1'b1; + end + else if (c_state_apb == S_APB_WR_HW_ERROR_NON_FATAL) + mbox_ooo_read_done <= 1'b0; + else if (ras_test_ctrl.reset_ooo_done_flag) + mbox_ooo_read_done <= 1'b0; + end + + always@(negedge core_clk or negedge cptra_rst_b) begin + if (!cptra_rst_b) begin + mbox_no_lock_read_done <= 1'b0; + end + else if (mbox_apb_dataout_read_no_lock && (c_state_apb == S_APB_RD_DATAOUT) && (apb_rd_count == dlen)) begin + mbox_no_lock_read_done <= 1'b1; + end + else if (c_state_apb == S_APB_WR_HW_ERROR_NON_FATAL) + mbox_no_lock_read_done <= 1'b0; + else if (ras_test_ctrl.reset_no_lock_done_flag) + mbox_no_lock_read_done <= 1'b0; + end + + always@(negedge core_clk or negedge cptra_rst_b) begin + if (!cptra_rst_b) begin + execute_mbox_rx_protocol <= 'b0; + end + else if (c_state_apb == S_APB_WR_EXEC) begin + execute_mbox_rx_protocol <= 'b1; + end + else if (execute_mbox_rx_protocol && ((c_state_apb == S_APB_RST_EXEC) && apb_xfer_end)) begin + execute_mbox_rx_protocol <= 'b0; + end + end initial begin cptra_pwrgood = 1'b0; BootFSM_BrkPoint = 1'b1; //Set to 1 even before anything starts cptra_rst_b = 1'b0; start_apb_fuse_sequence = 1'b0; - //tie offs - jtag_tck = 1'b0; // JTAG clk - jtag_tms = 1'b0; // JTAG TMS - jtag_tdi = 1'b0; // JTAG tdi - jtag_trst_n = 1'b0; // JTAG Reset //TIE-OFF PPROT = '0; @@ -208,25 +396,39 @@ module caliptra_top_tb ( if($test$plusargs("dumpon")) $dumpvars; `endif - //Key for UDS - cptra_obf_key_uds = 256'h54682728db5035eb04b79645c64a95606abb6ba392b6633d79173c027c5acf77; - cptra_uds_tb = 384'he4046d05385ab789c6a72866e08350f93f583e2a005ca0faecc32b5cfc323d461c76c107307654db5566a5bd693e227c; - - //Key for FE - cptra_obf_key_fe = 256'h31358e8af34d6ac31c958bbd5c8fb33c334714bffb41700d28b07f11cfe891e7; - cptra_fe_tb = {256'hb32e2b171b63827034ebb0d1909f7ef1d51c5f82c1bb9bc26bc4ac4dccdee835, - 256'h7dca6154c2510ae1c87b1b422b02b621bb06cac280023894fcff3406af08ee9b, - 256'he1dd72419beccddff77c722d992cdcc87e9c7486f56ab406ea608d8c6aeb060c, - 256'h64cf2785ad1a159147567e39e303370da445247526d95942bf4d7e88057178b0}; + if($test$plusargs("RAND_DOE_VALUES")) begin + //cptra_obf_key = cptra_obf_key_tb; + for (int dword = 0; dword < $bits(cptra_obf_key/32); dword++) begin + cptra_obf_key[dword] = cptra_obf_key_tb[dword]; + end - //swizzle the key so it matches the endianness of AES block - //used for visual inspection of uds/fe flow, manually switching keys and checking both - for (int dword = 0; dword < $bits(cptra_obf_key/32); dword++) begin - //cptra_obf_key[dword] = cptra_obf_key_uds[dword]; - cptra_obf_key[dword] = cptra_obf_key_fe[dword]; + cptra_uds_tb = cptra_uds_rand; + cptra_fe_tb = cptra_fe_rand; + end + else begin + //Key for UDS + cptra_obf_key_uds = 256'h54682728db5035eb04b79645c64a95606abb6ba392b6633d79173c027c5acf77; + cptra_uds_tb = 384'he4046d05385ab789c6a72866e08350f93f583e2a005ca0faecc32b5cfc323d461c76c107307654db5566a5bd693e227c; + + //Key for FE + cptra_obf_key_fe = 256'h31358e8af34d6ac31c958bbd5c8fb33c334714bffb41700d28b07f11cfe891e7; + cptra_fe_tb = 256'hb32e2b171b63827034ebb0d1909f7ef1d51c5f82c1bb9bc26bc4ac4dccdee835; + /*256'h7dca6154c2510ae1c87b1b422b02b621bb06cac280023894fcff3406af08ee9b, + 256'he1dd72419beccddff77c722d992cdcc87e9c7486f56ab406ea608d8c6aeb060c, + 256'h64cf2785ad1a159147567e39e303370da445247526d95942bf4d7e88057178b0};*/ + + //swizzle the key so it matches the endianness of AES block + //used for visual inspection of uds/fe flow, manually switching keys and checking both + for (int dword = 0; dword < $bits(cptra_obf_key/32); dword++) begin + //cptra_obf_key[dword] = cptra_obf_key_uds[dword]; + cptra_obf_key[dword] = cptra_obf_key_fe[dword]; + end end + end + assign assert_rst_flag = assert_rst_flag_from_service || assert_rst_flag_from_fatal; + assign deassert_rst_flag = deassert_rst_flag_from_service || deassert_rst_flag_from_fatal; always @(posedge core_clk) begin //Reset/pwrgood assertion during runtime if (cycleCnt == 15 || deassert_hard_rst_flag) begin @@ -244,9 +446,11 @@ module caliptra_top_tb ( else if (assert_hard_rst_flag) begin cptra_pwrgood <= 'b0; cptra_rst_b <= 'b0; + start_apb_fuse_sequence <= 1'b0; end else if (assert_rst_flag) begin cptra_rst_b <= 'b0; + start_apb_fuse_sequence <= 1'b0; end //wait for fuse indication else if (ready_for_fuses == 1'b0) begin @@ -258,15 +462,26 @@ module caliptra_top_tb ( end end + always@(negedge core_clk or negedge cptra_rst_b) begin + if (!cptra_rst_b) begin + dlen <= '0; + end + else if ((c_state_apb == S_APB_RD_DLEN) && apb_xfer_end) begin + dlen <= PRDATA; + end + end + always@(posedge core_clk or negedge cptra_rst_b) begin if (!cptra_rst_b) begin c_state_apb <= S_APB_IDLE; apb_wr_count <= '0; + apb_rd_count <= '0; apb_enable_ph <= 0; end else begin c_state_apb <= n_state_apb; apb_wr_count <= apb_wr_count_nxt; + apb_rd_count <= apb_rd_count_nxt; //next phase is an access phase if this is setup phase OR it's access and responder isn't ready apb_enable_ph <= (PSEL & ~PENABLE) | (PSEL & PENABLE & ~PREADY); end @@ -279,13 +494,19 @@ module caliptra_top_tb ( S_APB_WR_FE: begin $display ("SoC: Writing obfuscated Field Entropy to fuse bank\n"); end + S_APB_WR_SOC_STEPPING_ID: begin + $display ("SoC: Writing SOC Stepping ID to fuse bank\n"); + end S_APB_WR_FUSE_DONE: begin $display ("SoC: Writing fuse done register\n"); end + S_APB_POLL_FLOW_ST: begin + $display ("SoC: Polling Flow Status\n"); + end S_APB_WR_BOOT_GO: begin $display ("SoC: Writing BootGo register\n"); end - S_APB_WAIT_FW_READY: begin + S_APB_WAIT_FW_TEST: begin $display ("CLP: ROM Flow in progress...\n"); end S_APB_POLL_LOCK: begin @@ -310,8 +531,32 @@ module caliptra_top_tb ( S_APB_WR_STATUS: begin $display ("SoC: Writing the Mbox Status Register\n"); end + S_APB_WAIT_ERROR_AXS: begin + $display("SoC: Waiting to see cptra_error_fatal/non_fatal\n"); + end + S_APB_RD_HW_ERROR_FATAL: begin + $display("SoC: Observed cptra_error_fatal; reading Caliptra register\n"); + end + S_APB_WR_HW_ERROR_FATAL: begin + $display("SoC: Observed cptra_error_fatal; writing to clear Caliptra register\n"); + end + S_APB_RD_HW_ERROR_NON_FATAL: begin + $display("SoC: Observed cptra_error_non_fatal; reading Caliptra register\n"); + end + S_APB_WR_HW_ERROR_NON_FATAL: begin + $display("SoC: Observed cptra_error_non_fatal; writing to clear Caliptra register\n"); + end S_APB_DONE: begin end + S_APB_RD_DLEN: begin + $display("SoC: Reading the Data Length Register\n"); + end + S_APB_RD_DATAOUT: begin + $display("SoC: Reading the Data Out Register\n"); + end + S_APB_RST_EXEC: begin + $display("SoC: Resetting the Execute Register\n"); + end default: begin $display("Entering unexpected APB state: %p", n_state_apb); end @@ -321,6 +566,7 @@ module caliptra_top_tb ( always_comb begin apb_wr_count_nxt = 0; + apb_rd_count_nxt = 0; case (c_state_apb) inside S_APB_IDLE: begin if (start_apb_fuse_sequence) @@ -330,7 +576,7 @@ module caliptra_top_tb ( end //load fuses S_APB_WR_UDS: begin - if (apb_xfer_end && apb_wr_count == 11) begin + if (apb_xfer_end && apb_wr_count == (`CLP_OBF_UDS_DWORDS-1)) begin n_state_apb = S_APB_WR_FE; apb_wr_count_nxt = '0; end @@ -344,8 +590,8 @@ module caliptra_top_tb ( end end S_APB_WR_FE: begin - if (apb_xfer_end && apb_wr_count == 31) begin - n_state_apb = S_APB_WR_FUSE_DONE; + if (apb_xfer_end && apb_wr_count == (`CLP_OBF_FE_DWORDS-1)) begin + n_state_apb = S_APB_WR_SOC_STEPPING_ID; apb_wr_count_nxt = '0; end else if (apb_xfer_end) begin @@ -357,24 +603,40 @@ module caliptra_top_tb ( apb_wr_count_nxt = apb_wr_count; end end + S_APB_WR_SOC_STEPPING_ID: begin + if (apb_xfer_end) begin + n_state_apb = S_APB_WR_FUSE_DONE; + end + else begin + n_state_apb = S_APB_WR_SOC_STEPPING_ID; + end + end //set fuse done S_APB_WR_FUSE_DONE: begin if (apb_xfer_end) begin if(BootFSM_BrkPoint) begin - n_state_apb = S_APB_WR_BOOT_GO; + n_state_apb = S_APB_POLL_FLOW_ST; end else begin - n_state_apb = S_APB_WAIT_FW_READY; + n_state_apb = S_APB_WAIT_FW_TEST; end end else begin n_state_apb = S_APB_WR_FUSE_DONE; end end + S_APB_POLL_FLOW_ST: begin + if (apb_xfer_end && (PRDATA[`SOC_IFC_REG_CPTRA_FLOW_STATUS_READY_FOR_FUSES_LOW] == 0)) begin + n_state_apb = S_APB_WR_BOOT_GO; + end + else begin + n_state_apb = S_APB_POLL_FLOW_ST; + end + end //Write BootGo register S_APB_WR_BOOT_GO: begin if(apb_xfer_end) begin - n_state_apb = S_APB_WAIT_FW_READY; + n_state_apb = S_APB_WAIT_FW_TEST; end else begin n_state_apb = S_APB_WR_BOOT_GO; @@ -383,24 +645,27 @@ module caliptra_top_tb ( //This is for Caliptra Demo, smoke tests will stop here since they don't set ready for fw //wait for fw req - S_APB_WAIT_FW_READY: begin + S_APB_WAIT_FW_TEST: begin if (ready_for_fw_push & (apb_wr_count == 5)) begin n_state_apb = S_APB_POLL_LOCK; apb_wr_count_nxt = 0; end else if (ready_for_fw_push) begin - n_state_apb = S_APB_WAIT_FW_READY; + n_state_apb = S_APB_WAIT_FW_TEST; apb_wr_count_nxt = apb_wr_count + 1; end + else if (ras_test_ctrl.error_injection_seen) begin + n_state_apb = S_APB_WAIT_ERROR_AXS; + end else begin - n_state_apb = S_APB_WAIT_FW_READY; + n_state_apb = S_APB_WAIT_FW_TEST; apb_wr_count_nxt = 0; end end // poll for lock register S_APB_POLL_LOCK: begin if (apb_xfer_end && (PRDATA != 0)) begin - n_state_apb = S_APB_WR_CMD; + n_state_apb = mbox_apb_dataout_read_ooo ? S_APB_RD_DLEN : S_APB_WR_CMD; end else begin n_state_apb = S_APB_POLL_LOCK; @@ -459,15 +724,98 @@ module caliptra_top_tb ( else n_state_apb = S_APB_WR_STATUS; end + S_APB_WAIT_ERROR_AXS: begin + if (cptra_error_fatal_dly_p) begin + n_state_apb = S_APB_RD_HW_ERROR_FATAL; + end + else if (cptra_error_non_fatal_dly_p) begin + n_state_apb = S_APB_RD_HW_ERROR_NON_FATAL; + end + else if (soc_ifc_hw_error_wdata) begin + n_state_apb = S_APB_WR_HW_ERROR_FATAL; + end + else if (ras_test_ctrl.do_no_lock_access) begin + n_state_apb = S_APB_RD_DLEN; + end + else if (mbox_apb_dataout_read_ooo && !mbox_ooo_read_done) begin + n_state_apb = S_APB_POLL_LOCK; + end + else begin + n_state_apb = S_APB_WAIT_ERROR_AXS; + end + end + S_APB_RD_HW_ERROR_FATAL: begin + // Go to ERROR state to wait for cptra_rst_b to assert + if (apb_xfer_end) begin + n_state_apb = S_APB_ERROR; + end + else begin + n_state_apb = S_APB_RD_HW_ERROR_FATAL; + end + end + S_APB_WR_HW_ERROR_FATAL: begin + if (apb_xfer_end) begin + n_state_apb = S_APB_WAIT_ERROR_AXS; + end + else begin + n_state_apb = S_APB_WR_HW_ERROR_FATAL; + end + end + S_APB_RD_HW_ERROR_NON_FATAL: begin + if (apb_xfer_end) begin + n_state_apb = S_APB_WR_HW_ERROR_NON_FATAL; + end + else begin + n_state_apb = S_APB_RD_HW_ERROR_NON_FATAL; + end + end + S_APB_WR_HW_ERROR_NON_FATAL: begin + if (apb_xfer_end) begin + n_state_apb = S_APB_WAIT_ERROR_AXS; + end + else begin + n_state_apb = S_APB_WR_HW_ERROR_NON_FATAL; + end + end S_APB_DONE: begin apb_wr_count_nxt = '0; - if (mailbox_data_avail & ~status_set) + apb_rd_count_nxt = '0; + if (mailbox_data_avail && execute_mbox_rx_protocol) + n_state_apb = S_APB_RD_DLEN; + else if (mailbox_data_avail && ~status_set && ~execute_mbox_rx_protocol) n_state_apb = S_APB_WR_STATUS; else - n_state_apb = S_APB_DONE; + n_state_apb = S_APB_DONE; + end + S_APB_RD_DLEN: begin + if (apb_xfer_end) + n_state_apb = S_APB_RD_DATAOUT; + else + n_state_apb = S_APB_RD_DLEN; + end + S_APB_RD_DATAOUT: begin + if (apb_xfer_end && (apb_rd_count == dlen)) begin + n_state_apb = (mbox_no_lock_read_done || mbox_ooo_read_done) ? S_APB_WAIT_ERROR_AXS : S_APB_RST_EXEC; + apb_rd_count_nxt = '0; + end + else if (apb_xfer_end) begin + n_state_apb = S_APB_RD_DATAOUT; + apb_rd_count_nxt = apb_rd_count + 1; + end + else begin + n_state_apb = S_APB_RD_DATAOUT; + apb_rd_count_nxt = apb_rd_count; + end + end + S_APB_RST_EXEC: begin + if (apb_xfer_end) + n_state_apb = S_APB_DONE; + else + n_state_apb = S_APB_RST_EXEC; end default: begin apb_wr_count_nxt = apb_wr_count; + apb_rd_count_nxt = apb_rd_count; n_state_apb = S_APB_ERROR; end endcase @@ -497,10 +845,18 @@ module caliptra_top_tb ( PADDR = `CLP_SOC_IFC_REG_FUSE_FIELD_ENTROPY_0 + 4 * apb_wr_count; PWDATA = cptra_fe_tb[apb_wr_count]; end + S_APB_WR_SOC_STEPPING_ID: begin + PADDR = `CLP_SOC_IFC_REG_FUSE_SOC_STEPPING_ID; + PWDATA = $urandom(); + end S_APB_WR_FUSE_DONE: begin PADDR = `CLP_SOC_IFC_REG_CPTRA_FUSE_WR_DONE; PWDATA = 32'h00000001; end + S_APB_POLL_FLOW_ST: begin + PADDR = `CLP_SOC_IFC_REG_CPTRA_FLOW_STATUS; + PWDATA = '0; + end S_APB_WR_BOOT_GO: begin PADDR = `CLP_SOC_IFC_REG_CPTRA_BOOTFSM_GO; PWDATA = 32'h00000001; @@ -529,10 +885,38 @@ module caliptra_top_tb ( PADDR = `CLP_MBOX_CSR_MBOX_STATUS; PWDATA = 32'h00000001; end + S_APB_RD_HW_ERROR_FATAL: begin + PADDR = `CLP_SOC_IFC_REG_CPTRA_HW_ERROR_FATAL; + PWDATA = soc_ifc_hw_error_wdata; + end + S_APB_WR_HW_ERROR_FATAL: begin + PADDR = `CLP_SOC_IFC_REG_CPTRA_HW_ERROR_FATAL; + PWDATA = soc_ifc_hw_error_wdata; + end + S_APB_RD_HW_ERROR_NON_FATAL: begin + PADDR = `CLP_SOC_IFC_REG_CPTRA_HW_ERROR_NON_FATAL; + PWDATA = soc_ifc_hw_error_wdata; + end + S_APB_WR_HW_ERROR_NON_FATAL: begin + PADDR = `CLP_SOC_IFC_REG_CPTRA_HW_ERROR_NON_FATAL; + PWDATA = soc_ifc_hw_error_wdata; + end S_APB_DONE: begin PADDR = '0; PWDATA = '0; end + S_APB_RD_DLEN: begin + PADDR = `CLP_MBOX_CSR_MBOX_DLEN; + PWDATA = dlen; + end + S_APB_RD_DATAOUT: begin + PADDR = `CLP_MBOX_CSR_MBOX_DATAOUT; + PWDATA = '0; + end + S_APB_RST_EXEC: begin + PADDR = `CLP_MBOX_CSR_MBOX_EXECUTE; + PWDATA = '0; + end default: begin PADDR = '0; PWDATA = '0; @@ -557,11 +941,21 @@ module caliptra_top_tb ( PWRITE = 1; PAUSER = 0; end + S_APB_WR_SOC_STEPPING_ID: begin + PSEL = 1; + PWRITE = 1; + PAUSER = 0; + end S_APB_WR_FUSE_DONE: begin PSEL = 1; PWRITE = 1; PAUSER = 0; end + S_APB_POLL_FLOW_ST: begin + PSEL = 1; + PWRITE = 0; + PAUSER = 0; + end S_APB_WR_BOOT_GO: begin PSEL = 1; PWRITE = 1; @@ -597,11 +991,46 @@ module caliptra_top_tb ( PWRITE = 1; PAUSER = '1; end + S_APB_RD_HW_ERROR_FATAL: begin + PSEL = 1; + PWRITE = 0; + PAUSER = '1; + end + S_APB_WR_HW_ERROR_FATAL: begin + PSEL = 1; + PWRITE = 1; + PAUSER = '1; + end + S_APB_RD_HW_ERROR_NON_FATAL: begin + PSEL = 1; + PWRITE = 0; + PAUSER = '1; + end + S_APB_WR_HW_ERROR_NON_FATAL: begin + PSEL = 1; + PWRITE = 1; + PAUSER = '1; + end S_APB_DONE: begin PSEL = 0; PWRITE = 0; PAUSER = 0; end + S_APB_RD_DLEN: begin + PSEL = 1; + PWRITE = 0; + PAUSER = '1; //TODO - which value? + end + S_APB_RD_DATAOUT: begin + PSEL = 1; + PWRITE = 0; + PAUSER = '1; + end + S_APB_RST_EXEC: begin + PSEL = 1; + PWRITE = 1; + PAUSER = '1; + end default: begin PSEL = 0; PWRITE = 0; @@ -610,6 +1039,20 @@ module caliptra_top_tb ( endcase end +// JTAG DPI +jtagdpi #( + .Name ("jtag0"), + .ListenPort (5000) +) jtagdpi ( + .clk_i (core_clk), + .rst_ni (cptra_rst_b), + .jtag_tck (jtag_tck), + .jtag_tms (jtag_tms), + .jtag_tdi (jtag_tdi), + .jtag_tdo (jtag_tdo), + .jtag_trst_n (jtag_trst_n), + .jtag_srst_n () +); //=========================================================================- // DUT instance @@ -638,16 +1081,18 @@ caliptra_top caliptra_top_dut ( .PWDATA(PWDATA), .PWRITE(PWRITE), - .qspi_clk_o(qspi_clk), - .qspi_cs_no(qspi_cs_n), - .qspi_d_io(qspi_data), + .qspi_clk_o (qspi_clk), + .qspi_cs_no (qspi_cs_n), + .qspi_d_i (qspi_data_device_to_host), + .qspi_d_o (qspi_data_host_to_device), + .qspi_d_en_o(qspi_data_host_to_device_en), `ifdef CALIPTRA_INTERNAL_UART .uart_tx(uart_loopback), .uart_rx(uart_loopback), `endif - .el2_mem_export(el2_mem_export), + .el2_mem_export(el2_mem_export.veer_sram_src), .ready_for_fuses(ready_for_fuses), .ready_for_fw_push(ready_for_fw_push), @@ -668,8 +1113,8 @@ caliptra_top caliptra_top_dut ( .BootFSM_BrkPoint(BootFSM_BrkPoint), //SoC Interrupts - .cptra_error_fatal (), - .cptra_error_non_fatal(), + .cptra_error_fatal (cptra_error_fatal ), + .cptra_error_non_fatal(cptra_error_non_fatal), `ifdef CALIPTRA_INTERNAL_TRNG .etrng_req (etrng_req), @@ -684,8 +1129,8 @@ caliptra_top caliptra_top_dut ( .generic_input_wires(generic_input_wires), .generic_output_wires(), - .security_state(security_state), //FIXME TIE-OFF - .scan_mode (scan_mode) //FIXME TIE-OFF + .security_state(security_state), + .scan_mode (scan_mode) ); @@ -705,6 +1150,15 @@ physical_rng physical_rng ( //=========================================================================- // SPI Flash //=========================================================================- +for (genvar ii = 0; ii < `CALIPTRA_QSPI_IO_WIDTH; ii += 1) begin: gen_qspi_io + assign qspi_data[ii] = qspi_data_host_to_device_en[ii] + ? qspi_data_host_to_device[ii] + : 1'bz; + assign qspi_data_device_to_host[ii] = qspi_data_host_to_device_en[ii] + ? 1'bz + : qspi_data[ii]; +end + localparam logic [15:0] DeviceId0 = 16'hF10A; localparam logic [15:0] DeviceId1 = 16'hF10B; @@ -739,7 +1193,7 @@ caliptra_top_tb_services #( .cptra_rst_b(cptra_rst_b), // Caliptra Memory Export Interface - .el2_mem_export (el2_mem_export), + .el2_mem_export (el2_mem_export.veer_sram_sink), //SRAM interface for mbox .mbox_sram_cs (mbox_sram_cs ), @@ -760,6 +1214,7 @@ caliptra_top_tb_services #( .scan_mode(scan_mode), // TB Controls + .ras_test_ctrl(ras_test_ctrl), .cycleCnt(cycleCnt), //Interrupt flags @@ -769,15 +1224,16 @@ caliptra_top_tb_services #( //Reset flags .assert_hard_rst_flag(assert_hard_rst_flag), .deassert_hard_rst_flag(deassert_hard_rst_flag), - .assert_rst_flag(assert_rst_flag), - .deassert_rst_flag(deassert_rst_flag) + + .assert_rst_flag(assert_rst_flag_from_service), + .deassert_rst_flag(deassert_rst_flag_from_service), + + .cptra_uds_tb(cptra_uds_rand), + .cptra_fe_tb(cptra_fe_rand), + .cptra_obf_key_tb(cptra_obf_key_tb) ); caliptra_top_sva sva(); -`ifndef VERILATOR -soc_ifc_cov_bind i_soc_ifc_cov_bind(); -`endif - endmodule diff --git a/src/integration/tb/caliptra_top_tb_pkg.sv b/src/integration/tb/caliptra_top_tb_pkg.sv index d29a48268..8a14afeb7 100644 --- a/src/integration/tb/caliptra_top_tb_pkg.sv +++ b/src/integration/tb/caliptra_top_tb_pkg.sv @@ -41,9 +41,38 @@ class bitflip_mask_generator #(int MBOX_DATA_AND_ECC_W = 39); endclass `else -function logic [soc_ifc_pkg::MBOX_DATA_AND_ECC_W-1:0] get_bitflip_mask(bit do_double_bit = 1'b0); +function static logic [soc_ifc_pkg::MBOX_DATA_AND_ECC_W-1:0] get_bitflip_mask(bit do_double_bit = 1'b0); return 2<<($urandom%(soc_ifc_pkg::MBOX_DATA_AND_ECC_W-2)) | soc_ifc_pkg::MBOX_DATA_AND_ECC_W'(do_double_bit); endfunction `endif +typedef struct packed { + // [3] - Double bit, DCCM Error Injection + // [2] - Single bit, DCCM Error Injection + // [1] - Double bit, ICCM Error Injection + // [0] - Single bit, ICCM Error Injection + logic dccm_double_bit_error; + logic dccm_single_bit_error; + logic iccm_double_bit_error; + logic iccm_single_bit_error; +} veer_sram_error_injection_mode_t; + +typedef struct packed { + logic error_injection_seen; + logic reset_generic_input_wires; + logic do_no_lock_access; + logic do_ooo_access; + logic reset_ooo_done_flag; + logic reset_no_lock_done_flag; +} ras_test_ctrl_t; + +// Values to drive onto GENERIC INPUT WIRES in response to RAS testing +localparam MBOX_NON_FATAL_OBSERVED = 32'h600dab1e; +localparam PROT_NO_LOCK_NON_FATAL_OBSERVED = 32'h600dbabe; +localparam PROT_OOO_NON_FATAL_OBSERVED = 32'h600dcafe; +localparam ICCM_FATAL_OBSERVED = 32'hdeadaca1; +localparam DCCM_FATAL_OBSERVED = 32'hdeadbeef; +localparam NMI_FATAL_OBSERVED = 32'hdeadc0a7; +localparam ERROR_NONE_SET = 32'hba5eba11; /* default value for a test with no activity observed by TB */ + endpackage diff --git a/src/integration/tb/caliptra_top_tb_services.sv b/src/integration/tb/caliptra_top_tb_services.sv index dcc39632b..e274b6565 100644 --- a/src/integration/tb/caliptra_top_tb_services.sv +++ b/src/integration/tb/caliptra_top_tb_services.sv @@ -36,26 +36,27 @@ module caliptra_top_tb_services import soc_ifc_pkg::*; import kv_defines_pkg::*; + import caliptra_top_tb_pkg::*; #( parameter UVM_TB = 0 ) ( - input logic clk, + input wire logic clk, - input logic cptra_rst_b, + input wire logic cptra_rst_b, // Caliptra Memory Export Interface - el2_mem_if.top el2_mem_export, + el2_mem_if.veer_sram_sink el2_mem_export, //SRAM interface for mbox - input logic mbox_sram_cs, - input logic mbox_sram_we, - input logic [MBOX_ADDR_W-1:0] mbox_sram_addr, - input logic [MBOX_DATA_AND_ECC_W-1:0] mbox_sram_wdata, - output logic [MBOX_DATA_AND_ECC_W-1:0] mbox_sram_rdata, + input wire logic mbox_sram_cs, + input wire logic mbox_sram_we, + input wire logic [MBOX_ADDR_W-1:0] mbox_sram_addr, + input wire logic [MBOX_DATA_AND_ECC_W-1:0] mbox_sram_wdata, + output wire logic [MBOX_DATA_AND_ECC_W-1:0] mbox_sram_rdata, //SRAM interface for imem - input logic imem_cs, - input logic [`CALIPTRA_IMEM_ADDR_WIDTH-1:0] imem_addr, + input wire logic imem_cs, + input wire logic [`CALIPTRA_IMEM_ADDR_WIDTH-1:0] imem_addr, output logic [`CALIPTRA_IMEM_DATA_WIDTH-1:0] imem_rdata, // Security State @@ -65,6 +66,7 @@ module caliptra_top_tb_services output logic scan_mode, // TB Controls + output var ras_test_ctrl_t ras_test_ctrl, output int cycleCnt, //Interrupt flags @@ -75,14 +77,17 @@ module caliptra_top_tb_services output logic assert_hard_rst_flag, output logic assert_rst_flag, output logic deassert_hard_rst_flag, - output logic deassert_rst_flag + output logic deassert_rst_flag, + + output logic [0:`CLP_OBF_UDS_DWORDS-1][31:0] cptra_uds_tb, + output logic [0:`CLP_OBF_FE_DWORDS-1] [31:0] cptra_fe_tb, + output logic [0:`CLP_OBF_KEY_DWORDS-1][31:0] cptra_obf_key_tb ); //=========================================================================- // Imports //=========================================================================- - import caliptra_top_tb_pkg::*; //=========================================================================- // Parameters @@ -107,6 +112,8 @@ module caliptra_top_tb_services parameter MEMTYPE_LMEM = 3'h1; parameter MEMTYPE_DCCM = 3'h2; parameter MEMTYPE_ICCM = 3'h3; + parameter DATA_WIDTH = 32; + localparam IV_NO = 128 / DATA_WIDTH; //=========================================================================- // Signals @@ -128,6 +135,7 @@ module caliptra_top_tb_services logic [MBOX_DATA_AND_ECC_W-1:0] mbox_sram_wdata_bitflip; int cycleCntKillReq; + int cycleCnt_ff; int rst_cyclecnt = 0; int wait_time_to_rst; @@ -144,10 +152,26 @@ module caliptra_top_tb_services logic inject_random_data; logic check_pcr_signing; + // Decode: + // [0] - Single bit, ICCM Error Injection + // [1] - Double bit, ICCM Error Injection + // [2] - Single bit, DCCM Error Injection + // [3] - Double bit, DCCM Error Injection + veer_sram_error_injection_mode_t sram_error_injection_mode; + // Decode: + // [0] - Single bit, Mailbox Error Injection + // [1] - Double bit, Mailbox Error Injection + logic [1:0] inject_mbox_sram_error = 2'b0; + logic set_wdt_timer1_period; logic set_wdt_timer2_period; logic reset_wdt_timer_period; + logic inject_zero_sign_r; + logic inject_zero_sign_r_needs_release; + + logic en_jtag_access; + typedef bit [0:11][31:0] operand_t; typedef struct packed { @@ -174,6 +198,20 @@ module caliptra_top_tb_services test_vector_t test_vector; + typedef struct packed { + logic [0:`CLP_OBF_KEY_DWORDS-1][31:0] obf_key_uds; + logic [0:IV_NO-1][31:0] iv_uds; + logic [0:`CLP_OBF_UDS_DWORDS-1][31:0] uds_plaintext; + logic [0:`CLP_OBF_UDS_DWORDS-1][31:0] uds_ciphertext; + + logic [0:`CLP_OBF_KEY_DWORDS-1][31:0] obf_key_fe; + logic [0:IV_NO-1][31:0] iv_fe; + logic [0:`CLP_OBF_FE_DWORDS-1] [31:0] fe_plaintext; + logic [0:`CLP_OBF_FE_DWORDS-1] [31:0] fe_ciphertext; + } doe_test_vector_t; + + doe_test_vector_t doe_test_vector; + // Upwards name referencing per 23.8 of IEEE 1800-2017 `define DEC caliptra_top_dut.rvtop.veer.dec @@ -195,14 +233,30 @@ module caliptra_top_tb_services // 8'h90 - Issue PCR singing with fixed vector // 8'h91 - Issue PCR singing with randomized vector // 8'h92 - Check PCR singing with randomized vector + // 8'h98 - Inject invalid zero sign_r into ECC + // 8'h99 - Inject zeroize into HMAC // 8'ha0: 8'ha7 - Inject HMAC_KEY to kv_key register // 8'hc0: 8'hc7 - Inject SHA_BLOCK to kv_key register + // 8'he0 - Set random ICCM SRAM single bit error injection + // 8'he1 - Set random ICCM SRAM double bit error injection + // 8'he2 - Set random DCCM SRAM single bit error injection + // 8'he3 - Set random DCCM SRAM double bit error injection + // 8'he4 - Disable all SRAM error injection (Mailbox, ICCM, DCCM) + // 8'he5 - Request TB to initiate Mailbox flow without lock (violation) + // 8'he6 - Request TB to initiate Mailbox flow with out-of-order accesses (violation) + // 8'he7 - Reset mailbox out-of-order flag when non-fatal error is masked (allows the test to continue) + // 8'he8 - Enable scan mode when DOE fsm transitions to done state + // 8'he9 - Force dmi_reg_en input to clk gate to emulate JTAG accesses + // 8'hea - Set random values to WDT timer1 and timer2 + // 8'heb - Inject fatal error + // 8'hec - Inject randomized UDS test vector + // 8'hed - Inject randomized FE test vector // 8'hee - Issue random warm reset // 8'hef - Enable scan mode // 8'hf0 - Disable scan mode // 8'hf1 - Release WDT timer periods so they can be set by the test // 8'hf2 - Force clk_gating_en (to use in smoke_test only) - // 8'hf3 - Make two clients write to KV + // 8'hf3 - Init PCR slot 31 // 8'hf4 - Write random data to KV entry0 // 8'hf5 - Issue cold reset // 8'hf6 - Issue warm reset @@ -212,8 +266,8 @@ module caliptra_top_tb_services // 8'hfa - Unlock debug in security state // 8'hfb - Set the isr_active bit // 8'hfc - Clear the isr_active bit - // 8'hfd - Toggle random SRAM single bit error injection - // 8'hfe - Toggle random SRAM double bit error injection + // 8'hfd - Set random Mailbox SRAM single bit error injection + // 8'hfe - Set random Mailbox SRAM double bit error injection // 8'hff - End the simulation with a Success status assign mailbox_write = caliptra_top_dut.soc_ifc_top1.i_soc_ifc_reg.field_combo.CPTRA_GENERIC_OUTPUT_WIRES[0].generic_wires.load_next; assign WriteData = caliptra_top_dut.soc_ifc_top1.i_soc_ifc_reg.field_combo.CPTRA_GENERIC_OUTPUT_WIRES[0].generic_wires.next; @@ -234,16 +288,67 @@ module caliptra_top_tb_services isr_active++; end end - logic [1:0] inject_rand_sram_error = 2'b0; - always @(negedge clk) begin - if ((WriteData[7:0] == 8'hfd) && mailbox_write) begin - inject_rand_sram_error ^= 2'b01; + always @(negedge clk or negedge cptra_rst_b) begin + if (!cptra_rst_b) inject_mbox_sram_error <= 2'b00; + else if ((WriteData[7:0] == 8'hfd) && mailbox_write) inject_mbox_sram_error <= 2'b01; + else if ((WriteData[7:0] == 8'hfe) && mailbox_write) inject_mbox_sram_error <= 2'b10; + else if ((WriteData[7:0] == 8'he4) && mailbox_write) inject_mbox_sram_error <= 2'b00; + end + always @(negedge clk or negedge cptra_rst_b) begin + if (!cptra_rst_b) sram_error_injection_mode <= '{default: 1'b0}; + else if ((WriteData[7:0] == 8'he0) && mailbox_write) sram_error_injection_mode.iccm_single_bit_error <= 1'b1; + else if ((WriteData[7:0] == 8'he1) && mailbox_write) sram_error_injection_mode.iccm_double_bit_error <= 1'b1; + else if ((WriteData[7:0] == 8'he2) && mailbox_write) sram_error_injection_mode.dccm_single_bit_error <= 1'b1; + else if ((WriteData[7:0] == 8'he3) && mailbox_write) sram_error_injection_mode.dccm_double_bit_error <= 1'b1; + else if ((WriteData[7:0] == 8'he4) && mailbox_write) sram_error_injection_mode <= '{default: 1'b0}; + end + + always @(negedge clk or negedge cptra_rst_b) begin + if (!cptra_rst_b) begin + ras_test_ctrl.do_no_lock_access <= 1'b0; + ras_test_ctrl.do_ooo_access <= 1'b0; + ras_test_ctrl.reset_ooo_done_flag <= 1'b0; + ras_test_ctrl.reset_no_lock_done_flag <= 1'b0; + end + else if((WriteData == 8'he5) && mailbox_write) begin + ras_test_ctrl.do_no_lock_access <= 1'b1; + ras_test_ctrl.do_ooo_access <= 1'b0; + ras_test_ctrl.reset_ooo_done_flag <= 1'b0; + ras_test_ctrl.reset_no_lock_done_flag <= 1'b0; end - else if ((WriteData[7:0] == 8'hfe) && mailbox_write) begin - inject_rand_sram_error ^= 2'b10; + else if((WriteData == 8'he6) && mailbox_write) begin + ras_test_ctrl.do_no_lock_access <= 1'b0; + ras_test_ctrl.do_ooo_access <= 1'b1; + ras_test_ctrl.reset_ooo_done_flag <= 1'b0; + ras_test_ctrl.reset_no_lock_done_flag <= 1'b0; + end + else if ((WriteData == 8'he7) && mailbox_write) begin + ras_test_ctrl.do_no_lock_access <= 1'b0; + ras_test_ctrl.do_ooo_access <= 1'b0; + ras_test_ctrl.reset_ooo_done_flag <= 1'b1; + ras_test_ctrl.reset_no_lock_done_flag <= 1'b1; + end + else begin + ras_test_ctrl.do_no_lock_access <= 1'b0; + ras_test_ctrl.do_ooo_access <= 1'b0; + ras_test_ctrl.reset_ooo_done_flag <= 1'b0; + ras_test_ctrl.reset_no_lock_done_flag <= 1'b0; end end + initial ras_test_ctrl.error_injection_seen = 1'b0; + always @(negedge clk) begin + if (mailbox_write && WriteData[7:0] == 8'hfd) begin + ras_test_ctrl.error_injection_seen <= 1'b1; + end + end + // When starting a new error injection test, reset generic_input wires to the idle value. + // New values will be loaded to reflect the result of the RAS test. + initial ras_test_ctrl.reset_generic_input_wires = 1'b0; + always@(negedge clk) begin + ras_test_ctrl.reset_generic_input_wires <= mailbox_write && (WriteData[7:0] inside {8'he0, 8'he1, 8'he2, 8'he3, 8'hfd, 8'hfe}); + end + //keyvault injection hooks //Inject data to KV key reg logic [0:11][31:0] ecc_seed_tb = 384'h8FA8541C82A392CA74F23ED1DBFD73541C5966391B97EA73D744B0E34B9DF59ED0158063E39C09A5A055371EDF7A5441; @@ -341,8 +446,35 @@ module caliptra_top_tb_services endgenerate + always@(posedge clk or negedge cptra_rst_b) begin + if (~cptra_rst_b) begin + inject_zero_sign_r <= 1'b0; + inject_zero_sign_r_needs_release <= 1'b0; + end + else if((WriteData[7:0] == 8'h98) && mailbox_write) begin + inject_zero_sign_r <= 1'b1; + end + else if(inject_zero_sign_r) begin + if (caliptra_top_dut.ecc_top1.ecc_dsa_ctrl_i.prog_instr.reg_id == 6'd21) begin //R_ID + force caliptra_top_dut.ecc_top1.ecc_dsa_ctrl_i.ecc_arith_unit_i.d_o = '0; + inject_zero_sign_r_needs_release <= 1'b1; + end + else if (inject_zero_sign_r_needs_release) begin + inject_zero_sign_r <= 1'b0; + end + end + else begin + release caliptra_top_dut.ecc_top1.ecc_dsa_ctrl_i.ecc_arith_unit_i.d_o; + end + end + //TIE-OFF device lifecycle - initial security_state = '{device_lifecycle: DEVICE_PRODUCTION, debug_locked: 1'b1}; + logic assert_ss_tran; +`ifdef CALIPTRA_DEBUG_UNLOCKED + initial security_state = '{device_lifecycle: DEVICE_PRODUCTION, debug_locked: 1'b0}; // DebugUnlocked & Production +`else + initial security_state = '{device_lifecycle: DEVICE_PRODUCTION, debug_locked: 1'b1}; // DebugLocked & Production +`endif always @(negedge clk) begin //lock debug mode if ((WriteData[7:0] == 8'hf9) && mailbox_write) begin @@ -351,15 +483,56 @@ module caliptra_top_tb_services end //unlock debug mode else if ((WriteData[7:0] == 8'hfa) && mailbox_write) begin - security_state.debug_locked <= 1'b0; + cycleCnt_ff <= cycleCnt; + assert_ss_tran <= 'b1; + //security_state.debug_locked <= 1'b0; if (UVM_TB) $warning("WARNING! Detected FW write to manually clear security_state.debug_locked, but Firmware can't do this in UVM. Use a sequence in the soc_ifc_ctrl_agent to modify this field."); end + else if(assert_ss_tran && (cycleCnt == cycleCnt_ff + 'd100)) begin + security_state.debug_locked <= 1'b0; + assert_ss_tran <= 'b0; + end end + + generate + for(genvar dword = 0; dword < IV_NO; dword++) begin + always@(negedge clk) begin + if ((WriteData[7:0] == 8'hec) && mailbox_write) begin + force caliptra_top_dut.doe.doe_inst.hwif_out.DOE_IV[dword].IV.swmod = 'b1; + force caliptra_top_dut.doe.doe_inst.i_doe_reg.field_storage.DOE_IV[dword].IV.value = doe_test_vector.iv_uds[dword]; + end + else if ((WriteData[7:0] == 8'hed) && mailbox_write) begin + force caliptra_top_dut.doe.doe_inst.hwif_out.DOE_IV[dword].IV.swmod = 'b1; + force caliptra_top_dut.doe.doe_inst.i_doe_reg.field_storage.DOE_IV[dword].IV.value = doe_test_vector.iv_fe[dword]; + end + else begin + release caliptra_top_dut.doe.doe_inst.hwif_out.DOE_IV[dword].IV.swmod; + release caliptra_top_dut.doe.doe_inst.i_doe_reg.field_storage.DOE_IV[dword].IV.value; + end + end +end //for +endgenerate //IV_NO + logic assert_scan_mode; + logic assert_scan_mode_doe_done; always @(negedge clk) begin //Enable scan mode if ((WriteData[7:0] == 8'hef) && mailbox_write) begin + cycleCnt_ff <= cycleCnt; + assert_scan_mode <= 'b1; + //scan_mode <= 1'b1; + end + else if ((WriteData[7:0] == 8'he8) && mailbox_write) begin + cycleCnt_ff <= cycleCnt; + assert_scan_mode_doe_done <= 'b1; + end + else if(assert_scan_mode && (cycleCnt == cycleCnt_ff + 'd100)) begin scan_mode <= 1'b1; + assert_scan_mode <= 'b0; + end + else if (assert_scan_mode_doe_done && (caliptra_top_dut.doe.doe_inst.doe_fsm1.kv_doe_fsm_ps == 'h5)) begin + scan_mode <= 1'b1; + assert_scan_mode <= 'b0; end //Disable scan mode else if ((WriteData[7:0] == 8'hf0) && mailbox_write) begin @@ -374,6 +547,70 @@ module caliptra_top_tb_services end end + always@(negedge clk) begin + if ((WriteData == 'he9) && mailbox_write) begin + cycleCnt_ff <= cycleCnt; + en_jtag_access <= 'b1; + end + else if(en_jtag_access && (cycleCnt == (cycleCnt_ff + 'd100))) begin + force caliptra_top_dut.cptra_dmi_reg_en_preQ = 1; + end + else if(en_jtag_access && (cycleCnt == (cycleCnt_ff + 'd150))) begin + release caliptra_top_dut.cptra_dmi_reg_en_preQ; + en_jtag_access <= 'b0; + end + end + + logic inject_zeroize_to_hmac; + logic inject_zeroize_to_hmac_cmd; + logic [3 : 0] inject_zeroize_to_hmac_cnt; + always@(posedge clk or negedge cptra_rst_b) begin + if (~cptra_rst_b) begin + inject_zeroize_to_hmac_cmd <= 1'b0; + inject_zeroize_to_hmac <= 1'b0; + inject_zeroize_to_hmac_cnt <= '0; + end + else if((WriteData == 'h99) && mailbox_write) begin + inject_zeroize_to_hmac_cmd <= 1'b1; + end + else if (inject_zeroize_to_hmac_cmd) begin + if (caliptra_top_dut.hmac.hmac_inst.core_tag_we) begin + inject_zeroize_to_hmac <= 1'b1; + end + if (inject_zeroize_to_hmac) begin + if (inject_zeroize_to_hmac_cnt < 4'hf) begin + inject_zeroize_to_hmac_cnt <= inject_zeroize_to_hmac_cnt + 1'b1; + end + end + end + end + always@(negedge clk) begin + if (inject_zeroize_to_hmac) begin + if (inject_zeroize_to_hmac_cnt == 4'h5) begin + force caliptra_top_dut.hmac.hmac_inst.i_hmac_reg.field_storage.HMAC384_CTRL.ZEROIZE.value = 1'b1; + end + else begin + release caliptra_top_dut.hmac.hmac_inst.i_hmac_reg.field_storage.HMAC384_CTRL.ZEROIZE.value; + end + end + end + + //Inject fatal error after a delay + logic inject_fatal_error; + always@(negedge clk) begin + if((WriteData == 'heb) && mailbox_write) begin + cycleCnt_ff <= cycleCnt; + inject_fatal_error <= 'b1; + end + else if(inject_fatal_error && (cycleCnt == cycleCnt_ff + 'd100)) begin + force caliptra_top_dut.cptra_error_fatal = 'b1; + end + else if(inject_fatal_error && (cycleCnt == cycleCnt_ff + 'd200)) begin + release caliptra_top_dut.cptra_error_fatal; + inject_fatal_error <= 'b0; + end + end + logic [0:11][31:0] pv_hash_value = {32'h11143121, 32'hbeb365e6, 32'h3826e7de, @@ -409,6 +646,41 @@ module caliptra_top_tb_services end endgenerate + task doe_testvector_generator(); + string file_name; + int fd_r; + string line_read; + + $system("python doe_test_gen.py"); + file_name = "doe_test_vector.txt"; + if(!UVM_TB) begin + fd_r = $fopen(file_name, "r"); + if(fd_r == 0) $error("Cannot open file %s for reading", file_name); + + //Get values from file + void'($fgets(line_read, fd_r)); + void'($sscanf(line_read, "%h", doe_test_vector.obf_key_uds)); + void'($fgets(line_read, fd_r)); + void'($sscanf(line_read, "%h", doe_test_vector.iv_uds)); + void'($fgets(line_read, fd_r)); + void'($sscanf(line_read, "%h", doe_test_vector.uds_plaintext)); + void'($fgets(line_read, fd_r)); + void'($sscanf(line_read, "%h", doe_test_vector.uds_ciphertext)); + + void'($fgets(line_read, fd_r)); + void'($sscanf(line_read, "%h", doe_test_vector.obf_key_fe)); + void'($fgets(line_read, fd_r)); + void'($sscanf(line_read, "%h", doe_test_vector.iv_fe)); + void'($fgets(line_read, fd_r)); + void'($sscanf(line_read, "%h", doe_test_vector.fe_plaintext)); + void'($fgets(line_read, fd_r)); + void'($sscanf(line_read, "%h", doe_test_vector.fe_ciphertext)); + + $fclose(fd_r); + end + + endtask + task ecc_testvector_generator (); string file_name; begin @@ -420,7 +692,7 @@ module caliptra_top_tb_services end endtask // ecc_test - task ecc_read_test_vectors (input string fname); + task static ecc_read_test_vectors (input string fname); integer values_per_test_vector; int fd_r; string line_read; @@ -501,7 +773,7 @@ module caliptra_top_tb_services timed_warm_rst <= 'b1; end else if((WriteData == 'hee) && mailbox_write) begin - wait_time_to_rst =$urandom_range(5,1000); + wait_time_to_rst = $urandom_range(5,100); prandom_warm_rst <= 'b1; rst_cyclecnt <= cycleCnt; end @@ -596,11 +868,13 @@ module caliptra_top_tb_services set_wdt_timer2_period <= 'b0; end else begin - if(caliptra_top_dut.soc_ifc_top1.i_wdt.wdt_timer1_timeout_serviced) begin - set_wdt_timer1_period <= 'b1; - end - if(caliptra_top_dut.soc_ifc_top1.i_wdt.wdt_timer2_timeout_serviced) begin - set_wdt_timer2_period <= 'b1; + if (!UVM_TB) begin + if(caliptra_top_dut.soc_ifc_top1.i_wdt.wdt_timer1_timeout_serviced) begin + set_wdt_timer1_period <= 'b1; + end + if(caliptra_top_dut.soc_ifc_top1.i_wdt.wdt_timer2_timeout_serviced) begin + set_wdt_timer2_period <= 'b1; + end end if(reset_wdt_timer_period) begin set_wdt_timer1_period <= 'b0; @@ -613,30 +887,40 @@ module caliptra_top_tb_services if(set_wdt_timer1_period) begin force caliptra_top_dut.soc_ifc_top1.timer1_timeout_period = 64'hFFFFFFFF_FFFFFFFF; end - else begin + else if(reset_wdt_timer_period) begin release caliptra_top_dut.soc_ifc_top1.timer1_timeout_period; end + if(set_wdt_timer2_period) begin force caliptra_top_dut.soc_ifc_top1.timer2_timeout_period = 64'hFFFFFFFF_FFFFFFFF; end - else begin + else if(reset_wdt_timer_period) begin release caliptra_top_dut.soc_ifc_top1.timer2_timeout_period; end + + end + + always @(negedge clk) begin + if((WriteData[7:0] == 8'hea) && mailbox_write) begin + force caliptra_top_dut.soc_ifc_top1.timer1_timeout_period = {32'h0000_0000, $urandom_range(32'h0000_0001,32'h0000_0FFF)}; + force caliptra_top_dut.soc_ifc_top1.timer2_timeout_period = {32'h0000_0000, $urandom_range(32'h0000_0001,32'h0000_0FFF)}; + end + //Use 'hF1 code to reset these values in the test end `ifndef VERILATOR initial begin - bitflip_mask_generator #(MBOX_DATA_AND_ECC_W) bitflip_gen = new(); + automatic bitflip_mask_generator #(MBOX_DATA_AND_ECC_W) bitflip_gen = new(); forever begin @(posedge clk) - if (~|inject_rand_sram_error) begin + if (~|inject_mbox_sram_error) begin mbox_sram_wdata_bitflip <= '0; end else if (mbox_sram_cs & mbox_sram_we) begin // Corrupt 10% of the writes flip_bit = $urandom_range(0,99) < 10; - mbox_sram_wdata_bitflip <= flip_bit ? bitflip_gen.get_mask(inject_rand_sram_error[1]) : '0; + mbox_sram_wdata_bitflip <= flip_bit ? bitflip_gen.get_mask(inject_mbox_sram_error[1]) : '0; // if (flip_bit) $display("%t Injecting bit flips", $realtime); // else $display("%t No bit flips injected", $realtime); end @@ -644,13 +928,14 @@ module caliptra_top_tb_services end `else always @(posedge clk) begin - // Corrupt 10% of the writes - flip_bit <= ($urandom % 100) < 10; - if (~|inject_rand_sram_error) begin + if (~|inject_mbox_sram_error) begin + flip_bit <= 0; mbox_sram_wdata_bitflip <= '0; end else if (mbox_sram_cs & mbox_sram_we) begin - mbox_sram_wdata_bitflip <= flip_bit ? get_bitflip_mask(inject_rand_sram_error[1]) : '0; + // Corrupt 10% of the writes + flip_bit <= ($urandom % 100) < 10; + mbox_sram_wdata_bitflip <= flip_bit ? get_bitflip_mask(inject_mbox_sram_error[1]) : '0; end end `endif @@ -683,7 +968,7 @@ module caliptra_top_tb_services // uvm tests/sequences // End Of test monitor if(mailbox_write && WriteData[7:0] == 8'hff) begin - if (UVM_TB) $warning("WARNING! Detected FW write to manually end the test with SUCCESS, but Firmware can't do this in UVM."); + if (UVM_TB) $info("INFO: Detected FW write to manually end the test with SUCCESS; ignoring since the UVM environment will handle this."); else if (|cycleCntKillReq) begin $error("ERROR! FW attempted to end the simulation with SUCCESS after previously requesting to end the sim with FAILURE!"); end @@ -821,7 +1106,7 @@ module caliptra_top_tb_services dummy_dccm_preloader.ram = '{default:8'h0}; `endif hex_file_is_empty = $system("test -s program.hex"); - if (!hex_file_is_empty) $readmemh("program.hex", imem_inst1.ram,0,32'h00007FFF); + if (!hex_file_is_empty) $readmemh("program.hex", imem_inst1.ram,0,`CALIPTRA_IMEM_BYTE_SIZE-1); hex_file_is_empty = $system("test -s mailbox.hex"); if (!hex_file_is_empty) $readmemh("mailbox.hex", dummy_mbox_preloader.ram,0,32'h0001_FFFF); hex_file_is_empty = $system("test -s dccm.hex"); @@ -867,9 +1152,26 @@ module caliptra_top_tb_services wait_time_to_rst = 0; set_wdt_timer1_period = 0; + assert_ss_tran = 0; + en_jtag_access = 0; `ifndef VERILATOR - ecc_testvector_generator(); + if (!UVM_TB) begin + ecc_testvector_generator(); + doe_testvector_generator(); + + //Note: Both obf_key_uds and obf_key_fe are the same + //for(int dword = 0; dword < `CLP_OBF_KEY_DWORDS; dword++) begin + // cptra_obf_key_tb[dword] = doe_test_vector.obf_key_uds[(`CLP_OBF_KEY_DWORDS-1)-dword]; + //end + cptra_obf_key_tb = doe_test_vector.obf_key_uds; + for(int dword = 0; dword < `CLP_OBF_UDS_DWORDS; dword++) begin + cptra_uds_tb[dword] = doe_test_vector.uds_ciphertext[dword]; + end + for(int dword = 0; dword < `CLP_OBF_FE_DWORDS; dword++) begin + cptra_fe_tb[dword] = doe_test_vector.fe_ciphertext[dword]; + end + end `endif end @@ -877,6 +1179,7 @@ module caliptra_top_tb_services // SRAM instances //=========================================================================- caliptra_veer_sram_export veer_sram_export_inst ( + .sram_error_injection_mode(sram_error_injection_mode), .el2_mem_export(el2_mem_export) ); @@ -969,7 +1272,7 @@ caliptra_sram #( //=========================================================================- // SRAM preload services //=========================================================================- -task preload_mbox; +task static preload_mbox; // Variables mbox_sram_data_t ecc_data; bit [MBOX_ADDR_W :0] addr; @@ -996,7 +1299,7 @@ task preload_mbox; $display("MBOX pre-load completed"); endtask -task preload_iccm; +task static preload_iccm; bit[31:0] data; bit[31:0] addr, eaddr, saddr; @@ -1028,7 +1331,7 @@ task preload_iccm; endtask -task preload_dccm; +task static preload_dccm; bit[31:0] data; bit[31:0] addr, saddr, eaddr; @@ -1070,7 +1373,7 @@ endtask `endif -task slam_dccm_ram(input [31:0] addr, input[38:0] data); +task static slam_dccm_ram(input [31:0] addr, input[38:0] data); int bank, indx; bank = get_dccm_bank(addr, indx); `ifdef RV_DCCM_ENABLE @@ -1095,7 +1398,7 @@ task slam_dccm_ram(input [31:0] addr, input[38:0] data); endtask -task slam_iccm_ram( input[31:0] addr, input[38:0] data); +task static slam_iccm_ram( input[31:0] addr, input[38:0] data); int bank, idx; bank = get_iccm_bank(addr, idx); @@ -1136,7 +1439,7 @@ task slam_iccm_ram( input[31:0] addr, input[38:0] data); `endif endtask -task init_iccm; +task static init_iccm; `ifdef RV_ICCM_ENABLE `IRAM(0) = '{default:39'h0}; `IRAM(1) = '{default:39'h0}; @@ -1168,7 +1471,7 @@ task init_iccm; `endif endtask -task init_dccm; +task static init_dccm; `ifdef RV_DCCM_ENABLE `DRAM(0) = '{default:39'h0}; `DRAM(1) = '{default:39'h0}; @@ -1185,7 +1488,7 @@ task init_dccm; `endif endtask -task dump_memory_contents; +task static dump_memory_contents; input [2:0] mem_type; input [31:0] start_addr; input [31:0] end_addr; @@ -1350,6 +1653,15 @@ function int get_iccm_bank(input[31:0] addr, output int bank_idx); `endif endfunction +`ifndef VERILATOR +soc_ifc_cov_bind i_soc_ifc_cov_bind(); +caliptra_top_cov_bind i_caliptra_top_cov_bind(); +sha512_ctrl_cov_bind i_sha512_ctrl_cov_bind(); +sha256_ctrl_cov_bind i_sha256_ctrl_cov_bind(); +hmac_ctrl_cov_bind i_hmac_ctrl_cov_bind(); +ecc_top_cov_bind i_ecc_top_cov_bind(); +`endif + /* verilator lint_off CASEINCOMPLETE */ `include "dasm.svi" /* verilator lint_on CASEINCOMPLETE */ diff --git a/src/integration/tb/caliptra_veer_sram_export.sv b/src/integration/tb/caliptra_veer_sram_export.sv index c1ea5dd4a..04e717840 100644 --- a/src/integration/tb/caliptra_veer_sram_export.sv +++ b/src/integration/tb/caliptra_veer_sram_export.sv @@ -14,12 +14,79 @@ // import el2_pkg::*; -module caliptra_veer_sram_export #( +module caliptra_veer_sram_export import caliptra_top_tb_pkg::*; #( `include "el2_param.vh" ) ( - el2_mem_if.top el2_mem_export + // Decode: + // [0] - Single bit, ICCM Error Injection + // [1] - Double bit, ICCM Error Injection + // [2] - Single bit, DCCM Error Injection + // [3] - Double bit, DCCM Error Injection + input veer_sram_error_injection_mode_t sram_error_injection_mode, + el2_mem_if.veer_sram_sink el2_mem_export ); +////////////////////////////////////////////////////// +// Sim-only Error Injection for ICCM/DCCM +// + bit [pt.ICCM_NUM_BANKS-1:0] iccm_flip_bit; + bit [pt.DCCM_NUM_BANKS-1:0] dccm_flip_bit; + logic [pt.ICCM_NUM_BANKS-1:0] [39-1:0] iccm_sram_wdata_bitflip; + logic [pt.DCCM_NUM_BANKS-1:0] [39-1:0] dccm_sram_wdata_bitflip; + int ii,jj,kk,ll; + + `ifndef VERILATOR + initial begin + bitflip_mask_generator #(39) iccm_bitflip_gen = new(); + bitflip_mask_generator #(39) dccm_bitflip_gen = new(); + forever begin + @(posedge el2_mem_export.clk) + if (~sram_error_injection_mode.iccm_single_bit_error && ~sram_error_injection_mode.iccm_double_bit_error) begin + iccm_sram_wdata_bitflip <= '{default:0}; + end + else if (el2_mem_export.iccm_clken & el2_mem_export.iccm_wren_bank) begin + // Corrupt 50% of the writes + for (ii = 0; ii < pt.ICCM_NUM_BANKS; ii++) begin + iccm_flip_bit[ii] = 1'($urandom_range(0,99) < 50); + iccm_sram_wdata_bitflip[ii] <= iccm_flip_bit[ii] ? iccm_bitflip_gen.get_mask(sram_error_injection_mode.iccm_double_bit_error) : '0; + end + end + if (~sram_error_injection_mode.dccm_single_bit_error && ~sram_error_injection_mode.dccm_double_bit_error) begin + dccm_sram_wdata_bitflip <= '{default:0}; + end + else if (el2_mem_export.dccm_clken & el2_mem_export.dccm_wren_bank) begin + // Corrupt 50% of the writes + for (jj = 0; jj < pt.DCCM_NUM_BANKS; jj++) begin + dccm_flip_bit[jj] = 1'($urandom_range(0,99) < 50); + dccm_sram_wdata_bitflip[jj] <= dccm_flip_bit[jj] ? dccm_bitflip_gen.get_mask(sram_error_injection_mode.dccm_double_bit_error) : '0; + end + end + end + end + `else + always @(posedge el2_mem_export.clk) begin + // Corrupt 50% of the writes + if ((~sram_error_injection_mode.iccm_single_bit_error && ~sram_error_injection_mode.iccm_double_bit_error)) begin + iccm_sram_wdata_bitflip <= '{default:0}; + end + else if (el2_mem_export.iccm_clken & el2_mem_export.iccm_wren_bank) begin + for (kk = 0; kk < pt.ICCM_NUM_BANKS; kk++) begin + iccm_flip_bit[kk] <= ($urandom % 100) < 50; + iccm_sram_wdata_bitflip[kk] <= iccm_flip_bit[kk] ? get_bitflip_mask(sram_error_injection_mode.iccm_double_bit_error) : '0; + end + end + // Corrupt 50% of the writes + if ((~sram_error_injection_mode.dccm_single_bit_error && ~sram_error_injection_mode.dccm_double_bit_error)) begin + dccm_sram_wdata_bitflip <= '{default:0}; + end + else if (el2_mem_export.dccm_clken & el2_mem_export.dccm_wren_bank) begin + for (ll = 0; ll < pt.DCCM_NUM_BANKS; ll++) begin + dccm_flip_bit[ll] <= ($urandom % 100) < 50; + dccm_sram_wdata_bitflip[ll] <= dccm_flip_bit[ll] ? get_bitflip_mask(sram_error_injection_mode.dccm_double_bit_error) : '0; + end + end + end + `endif ////////////////////////////////////////////////////// // DCCM @@ -46,7 +113,7 @@ for (genvar i=0; i #include "Vcaliptra_top_tb.h" #include "verilated.h" +#if VM_TRACE_VCD #include "verilated_vcd_c.h" - +#elif VM_TRACE_FST +#include "verilated_fst_c.h" +#endif vluint64_t main_time = 0; @@ -37,13 +40,17 @@ int main(int argc, char** argv) { Vcaliptra_top_tb* tb = new Vcaliptra_top_tb; // init trace dump - VerilatedVcdC* tfp = NULL; - #if VM_TRACE Verilated::traceEverOn(true); - tfp = new VerilatedVcdC; - tb->trace (tfp, 24); - tfp->open ("sim.vcd"); + #if VM_TRACE_VCD + VerilatedVcdC* tfp = new VerilatedVcdC; + tb->trace (tfp, 24); + tfp->open ("sim.vcd"); + #elif VM_TRACE_FST + VerilatedFstC* tfp = new VerilatedFstC; + tb->trace (tfp, 24); + tfp->open ("sim.fst"); + #endif #endif // Simulate while(!Verilated::gotFinish()){ diff --git a/src/integration/test_suites/c_intr_handler/c_intr_handler.c b/src/integration/test_suites/c_intr_handler/c_intr_handler.c index 6c488b494..01e11447c 100644 --- a/src/integration/test_suites/c_intr_handler/c_intr_handler.c +++ b/src/integration/test_suites/c_intr_handler/c_intr_handler.c @@ -15,6 +15,7 @@ #include "caliptra_defines.h" #include "caliptra_isr.h" #include "riscv-csr.h" +#include "riscv_hw_if.h" #include #include #include "printf.h" @@ -32,6 +33,31 @@ volatile uint32_t intr_count; enum printf_verbosity verbosity_g = LOW; #endif +//TODO: Fix this since ISR is not currently populating these variables. +volatile caliptra_intr_received_s cptra_intr_rcv = { + .doe_error = 0, + .doe_notif = 0, + .ecc_error = 0, + .ecc_notif = 0, + .hmac_error = 0, + .hmac_notif = 0, + .kv_error = 0, + .kv_notif = 0, + .sha512_error = 0, + .sha512_notif = 0, + .sha256_error = 0, + .sha256_notif = 0, + .qspi_error = 0, + .qspi_notif = 0, + .uart_error = 0, + .uart_notif = 0, + .i3c_error = 0, + .i3c_notif = 0, + .soc_ifc_error = 0, + .soc_ifc_notif = 0, + .sha512_acc_error = 0, + .sha512_acc_notif = 0, +}; void main(void) { int argc=0; @@ -60,10 +86,12 @@ void main(void) { volatile uint32_t * soc_ifc_error_mbox_ecc_unc_ctr = (uint32_t *) (CLP_SOC_IFC_REG_INTR_BLOCK_RF_ERROR_MBOX_ECC_UNC_INTR_COUNT_R); volatile uint32_t * soc_ifc_error_wdt_timer1_timeout_ctr = (uint32_t *) (CLP_SOC_IFC_REG_INTR_BLOCK_RF_ERROR_WDT_TIMER1_TIMEOUT_INTR_COUNT_R); volatile uint32_t * soc_ifc_error_wdt_timer2_timeout_ctr = (uint32_t *) (CLP_SOC_IFC_REG_INTR_BLOCK_RF_ERROR_WDT_TIMER2_TIMEOUT_INTR_COUNT_R); - volatile uint32_t * soc_ifc_notif_cmd_avail_ctr = (uint32_t *) (CLP_SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_CMD_AVAIL_INTR_COUNT_R); - volatile uint32_t * soc_ifc_notif_mbox_ecc_cor_ctr = (uint32_t *) (CLP_SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_MBOX_ECC_COR_INTR_COUNT_R); - volatile uint32_t * soc_ifc_notif_debug_locked_ctr = (uint32_t *) (CLP_SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_DEBUG_LOCKED_INTR_COUNT_R); - volatile uint32_t * soc_ifc_notif_soc_req_lock_ctr = (uint32_t *) (CLP_SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_SOC_REQ_LOCK_INTR_COUNT_R); + volatile uint32_t * soc_ifc_notif_cmd_avail_ctr = (uint32_t *) (CLP_SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_CMD_AVAIL_INTR_COUNT_R); + volatile uint32_t * soc_ifc_notif_mbox_ecc_cor_ctr = (uint32_t *) (CLP_SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_MBOX_ECC_COR_INTR_COUNT_R); + volatile uint32_t * soc_ifc_notif_debug_locked_ctr = (uint32_t *) (CLP_SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_DEBUG_LOCKED_INTR_COUNT_R); + volatile uint32_t * soc_ifc_notif_scan_mode_ctr = (uint32_t *) (CLP_SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_SCAN_MODE_INTR_COUNT_R); + volatile uint32_t * soc_ifc_notif_soc_req_lock_ctr = (uint32_t *) (CLP_SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_SOC_REQ_LOCK_INTR_COUNT_R); + volatile uint32_t * soc_ifc_notif_gen_in_toggle_ctr = (uint32_t *) (CLP_SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_GEN_IN_TOGGLE_INTR_COUNT_R); uint32_t sha512_intr_count = 0; uint32_t sha256_intr_count = 0; @@ -75,6 +103,7 @@ void main(void) { uint32_t soc_ifc_notif_intr_count_hw = 0; uint32_t soc_ifc_error_intr_count = 0; uint32_t soc_ifc_error_intr_count_hw = 0; + uint64_t mtime = 0; VPRINTF(LOW,"----------------------------------\nCaliptra: Direct ISR Test!!\n----------------------------------\n"); @@ -87,26 +116,26 @@ void main(void) { // Busy loop while (intr_count < 64) { // Trigger interrupt manually - if ((intr_count % 0x12) >= 0x11) { + if ((intr_count % 0x13) >= 0x12) { *sha512_notif_trig = SHA512_REG_INTR_BLOCK_RF_NOTIF_INTR_TRIG_R_NOTIF_CMD_DONE_TRIG_MASK; sha512_intr_count++; - } else if ((intr_count % 0x12) >= 0x10) { + } else if ((intr_count % 0x13) >= 0x11) { *sha256_notif_trig = SHA256_REG_INTR_BLOCK_RF_NOTIF_INTR_TRIG_R_NOTIF_CMD_DONE_TRIG_MASK; sha256_intr_count++; - } else if ((intr_count % 0x12) >= 0x0F) { + } else if ((intr_count % 0x13) >= 0x10) { *sha512_acc_notif_trig = SHA512_ACC_CSR_INTR_BLOCK_RF_NOTIF_INTR_TRIG_R_NOTIF_CMD_DONE_TRIG_MASK; sha512_acc_intr_count++; - } else if ((intr_count % 0x12) >= 0x0E) { + } else if ((intr_count % 0x13) >= 0x0F) { *hmac_notif_trig = HMAC_REG_INTR_BLOCK_RF_NOTIF_INTR_TRIG_R_NOTIF_CMD_DONE_TRIG_MASK; hmac_intr_count++; - } else if ((intr_count % 0x12) >= 0x0D) { + } else if ((intr_count % 0x13) >= 0x0E) { *ecc_notif_trig = ECC_REG_INTR_BLOCK_RF_NOTIF_INTR_TRIG_R_NOTIF_CMD_DONE_TRIG_MASK; ecc_intr_count++; - } else if ((intr_count % 0x12) >= 0x0C) { + } else if ((intr_count % 0x13) >= 0x0D) { *doe_notif_trig = DOE_REG_INTR_BLOCK_RF_NOTIF_INTR_TRIG_R_NOTIF_CMD_DONE_TRIG_MASK; doe_intr_count++; - } else if ((intr_count % 0x12) >= 0x08) { //8-B - *soc_ifc_notif_trig = 1 << (intr_count % 0x4); + } else if ((intr_count % 0x13) >= 0x08) { //8-C + *soc_ifc_notif_trig = 1 << (intr_count % 0x5); soc_ifc_notif_intr_count++; } else { //0-7 *soc_ifc_error_trig = 1 << (intr_count % 0x8); @@ -192,7 +221,9 @@ void main(void) { soc_ifc_notif_intr_count_hw = *soc_ifc_notif_cmd_avail_ctr + *soc_ifc_notif_mbox_ecc_cor_ctr + *soc_ifc_notif_debug_locked_ctr + - *soc_ifc_notif_soc_req_lock_ctr; + *soc_ifc_notif_scan_mode_ctr + + *soc_ifc_notif_soc_req_lock_ctr + + *soc_ifc_notif_gen_in_toggle_ctr; VPRINTF(MEDIUM, "SOC_IFC Notif hw count: %x\n", soc_ifc_notif_intr_count_hw); if (soc_ifc_notif_intr_count != soc_ifc_notif_intr_count_hw) { VPRINTF(ERROR, "SOC_IFC Notif count mismatch!\n"); @@ -206,6 +237,32 @@ void main(void) { SEND_STDOUT_CTRL(0x1); // Kill sim with ERROR } + // Now test timer interrupts + mtime = (lsu_read_32(CLP_SOC_IFC_REG_INTERNAL_RV_MTIME_H) << 32) | lsu_read_32(CLP_SOC_IFC_REG_INTERNAL_RV_MTIME_L); + // Did we just rollover? Maybe the value read from MTIME_H was stale after reading MTIME_L. + // Reread. + if ((mtime & 0xFFFFFFFF) < 0x40) { + mtime = (lsu_read_32(CLP_SOC_IFC_REG_INTERNAL_RV_MTIME_H) << 32) | lsu_read_32(CLP_SOC_IFC_REG_INTERNAL_RV_MTIME_L); + } + + // Setup a wait time of 1000 clock cycles = 10us + mtime += 1000; + lsu_write_32(CLP_SOC_IFC_REG_INTERNAL_RV_MTIMECMP_L, mtime & 0xFFFFFFFF); + lsu_write_32(CLP_SOC_IFC_REG_INTERNAL_RV_MTIMECMP_H, mtime >> 32 ); + + // Re-enable interrupts (but not external interrupts) + csr_clr_bits_mie(MIE_MEI_BIT_MASK); + csr_set_bits_mstatus(MSTATUS_MIE_BIT_MASK); + + // Poll for Timer Interrupt Handler to complete processing. + // Timer ISR simply sets mtimecmp back to max values, so poll for that. + while (lsu_read_32(CLP_SOC_IFC_REG_INTERNAL_RV_MTIMECMP_H) != 0xFFFFFFFF) { + // Sleep in between triggers to allow ISR to execute and show idle time in sims + for (uint16_t slp = 0; slp < 100; slp++) { + __asm__ volatile ("nop"); // Sleep loop as "nop" + } + } + return; } diff --git a/src/integration/test_suites/c_intr_handler/caliptra_isr.h b/src/integration/test_suites/c_intr_handler/caliptra_isr.h index a57d5f814..517e72b37 100644 --- a/src/integration/test_suites/c_intr_handler/caliptra_isr.h +++ b/src/integration/test_suites/c_intr_handler/caliptra_isr.h @@ -32,6 +32,33 @@ #include #include "printf.h" +/* --------------- symbols/typedefs --------------- */ +typedef struct { + uint32_t doe_error; + uint32_t doe_notif; + uint32_t ecc_error; + uint32_t ecc_notif; + uint32_t hmac_error; + uint32_t hmac_notif; + uint32_t kv_error; + uint32_t kv_notif; + uint32_t sha512_error; + uint32_t sha512_notif; + uint32_t sha256_error; + uint32_t sha256_notif; + uint32_t qspi_error; + uint32_t qspi_notif; + uint32_t uart_error; + uint32_t uart_notif; + uint32_t i3c_error; + uint32_t i3c_notif; + uint32_t soc_ifc_error; + uint32_t soc_ifc_notif; + uint32_t sha512_acc_error; + uint32_t sha512_acc_notif; +} caliptra_intr_received_s; +extern volatile caliptra_intr_received_s cptra_intr_rcv; + ////////////////////////////////////////////////////////////////////////////// // Function Declarations // @@ -166,9 +193,15 @@ inline void service_soc_ifc_notif_intr () { if (sts & SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_DEBUG_LOCKED_STS_MASK) { *reg = SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_DEBUG_LOCKED_STS_MASK; } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_SCAN_MODE_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_SCAN_MODE_STS_MASK; + } if (sts & SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_SOC_REQ_LOCK_STS_MASK) { *reg = SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_SOC_REQ_LOCK_STS_MASK; } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_GEN_IN_TOGGLE_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_GEN_IN_TOGGLE_STS_MASK; + } if (sts == 0) { printf("bad soc_ifc_notif_intr sts:%x\n", sts); printf("%c", 0x1); diff --git a/src/integration/test_suites/caliptra_demo/caliptra_isr.h b/src/integration/test_suites/caliptra_demo/caliptra_isr.h index e6aa9ee48..983bd1b2b 100644 --- a/src/integration/test_suites/caliptra_demo/caliptra_isr.h +++ b/src/integration/test_suites/caliptra_demo/caliptra_isr.h @@ -160,6 +160,9 @@ inline void service_soc_ifc_notif_intr () { if (sts & SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_DEBUG_LOCKED_STS_MASK) { *reg = SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_DEBUG_LOCKED_STS_MASK; } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_SCAN_MODE_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_SCAN_MODE_STS_MASK; + } if (sts == 0) { printf("bad soc_ifc_notif_intr sts:%x\n", sts); printf("%c", 0x1); diff --git a/src/integration/test_suites/caliptra_fmc/caliptra_fmc.c b/src/integration/test_suites/caliptra_fmc/caliptra_fmc.c index 8b2c071c9..cf8bcfbf7 100644 --- a/src/integration/test_suites/caliptra_fmc/caliptra_fmc.c +++ b/src/integration/test_suites/caliptra_fmc/caliptra_fmc.c @@ -29,6 +29,7 @@ #include "sha256.h" #include "sha512.h" #include "soc_ifc.h" +#include "caliptra_isr.h" #include #include #include "printf.h" @@ -37,12 +38,14 @@ extern uintptr_t STACK; /* --------------- Global vars --------------- */ -volatile char* stdout = (char *)STDOUT; +volatile char* stdout = (char *)STDOUT; #ifdef CPT_VERBOSITY - enum printf_verbosity verbosity_g = CPT_VERBOSITY; + enum printf_verbosity verbosity_g = CPT_VERBOSITY; #else - enum printf_verbosity verbosity_g = LOW; + enum printf_verbosity verbosity_g = LOW; #endif +volatile caliptra_intr_received_s cptra_intr_rcv; +volatile uint32_t intr_count = 0; /* --------------- Function Definitions --------------- */ diff --git a/src/integration/test_suites/caliptra_fmc/caliptra_fmc.ld b/src/integration/test_suites/caliptra_fmc/caliptra_fmc.ld index fad2eeedf..7c093ba27 100644 --- a/src/integration/test_suites/caliptra_fmc/caliptra_fmc.ld +++ b/src/integration/test_suites/caliptra_fmc/caliptra_fmc.ld @@ -40,7 +40,7 @@ SECTIONS { . = _text_lma_end + 0x10; /* . (location counter) points to 0x0, force it back to next LMA here */ _data_vma_start = 0x50000000; _data_lma_start = .; /* After this, . (location counter) goes back to holding VMA value */ - .data _data_vma_start : AT(_data_lma_start) { *(.*data) *(.rodata*) ; . = ALIGN(4); } =0x0000, + .data _data_vma_start : AT(_data_lma_start) { *(.*data) *(.sdata*) *(.rodata*) *(.srodata*) ; . = ALIGN(4); } =0x0000, _data_lma_end = _data_lma_start + SIZEOF(.data); _bss_vma_start = .; diff --git a/src/integration/test_suites/caliptra_fmc/caliptra_isr.h b/src/integration/test_suites/caliptra_fmc/caliptra_isr.h new file mode 100644 index 000000000..542d6572b --- /dev/null +++ b/src/integration/test_suites/caliptra_fmc/caliptra_isr.h @@ -0,0 +1,255 @@ +// SPDX-License-Identifier: Apache-2.0 +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// --------------------------------------------------------------------- +// File: caliptra_isr.h +// Description: +// Provides function declarations for use by external test files, so +// that the ISR functionality may behave like a library. +// TODO: +// This header file includes inline function definitions for event and +// test specific interrupt service behavior, so it should be copied and +// modified for each test. +// --------------------------------------------------------------------- + +#ifndef CALIPTRA_ISR_H + #define CALIPTRA_ISR_H + +#define EN_ISR_PRINTS 1 + +#include "caliptra_defines.h" +#include +#include "printf.h" + +/* --------------- symbols/typedefs --------------- */ +typedef struct { + uint32_t doe_error; + uint32_t doe_notif; + uint32_t ecc_error; + uint32_t ecc_notif; + uint32_t hmac_error; + uint32_t hmac_notif; + uint32_t kv_error; + uint32_t kv_notif; + uint32_t sha512_error; + uint32_t sha512_notif; + uint32_t sha256_error; + uint32_t sha256_notif; + uint32_t qspi_error; + uint32_t qspi_notif; + uint32_t uart_error; + uint32_t uart_notif; + uint32_t i3c_error; + uint32_t i3c_notif; + uint32_t soc_ifc_error; + uint32_t soc_ifc_notif; + uint32_t sha512_acc_error; + uint32_t sha512_acc_notif; +} caliptra_intr_received_s; +extern volatile caliptra_intr_received_s cptra_intr_rcv; + +////////////////////////////////////////////////////////////////////////////// +// Function Declarations +// + +// Performs all the CSR setup to configure and enable vectored external interrupts +void init_interrupts(void); + +// These inline functions are used to insert event-specific functionality into the +// otherwise generic ISR that gets laid down by the parameterized macro "nonstd_veer_isr" +inline void service_doe_error_intr() {return;} +inline void service_doe_notif_intr() { + uint32_t * reg = (uint32_t *) (CLP_DOE_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R); + uint32_t sts = *reg; + /* Write 1 to Clear the pending interrupt */ + if (sts & DOE_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK) { + *reg = DOE_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + cptra_intr_rcv.doe_notif |= DOE_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + } + if (sts == 0) { + VPRINTF(ERROR,"bad doe_notif_intr sts:%x\n", sts); + SEND_STDOUT_CTRL(0x1); + while(1); + } +} + +inline void service_ecc_error_intr() {return;} +inline void service_ecc_notif_intr() { + uint32_t * reg = (uint32_t *) (CLP_ECC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R); + uint32_t sts = *reg; + /* Write 1 to Clear the pending interrupt */ + if (sts & ECC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK) { + *reg = ECC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + cptra_intr_rcv.ecc_notif |= ECC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + } + if (sts == 0) { + VPRINTF(ERROR,"bad ecc_notif_intr sts:%x\n", sts); + SEND_STDOUT_CTRL(0x1); + while(1); + } +} + +inline void service_hmac_error_intr() {return;} +inline void service_hmac_notif_intr() { + uint32_t * reg = (uint32_t *) (CLP_HMAC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R); + uint32_t sts = *reg; + /* Write 1 to Clear the pending interrupt */ + if (sts & HMAC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK) { + *reg = HMAC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + cptra_intr_rcv.hmac_notif |= HMAC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + } + if (sts == 0) { + VPRINTF(ERROR,"bad hmac_notif_intr sts:%x\n", sts); + SEND_STDOUT_CTRL(0x1); + while(1); + } +} + +inline void service_kv_error_intr() {return;} +inline void service_kv_notif_intr() {return;} +inline void service_sha512_error_intr() {return;} +inline void service_sha512_notif_intr() { + uint32_t * reg = (uint32_t *) (CLP_SHA512_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R); + uint32_t sts = *reg; + /* Write 1 to Clear the pending interrupt */ + if (sts & SHA512_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK) { + *reg = SHA512_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + cptra_intr_rcv.sha512_notif |= SHA512_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + } + if (sts == 0) { + VPRINTF(ERROR,"bad sha512_notif_intr sts:%x\n", sts); + SEND_STDOUT_CTRL(0x1); + while(1); + } +} + +inline void service_sha256_error_intr() {return;} +inline void service_sha256_notif_intr() { + uint32_t * reg = (uint32_t *) (CLP_SHA256_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R); + uint32_t sts = *reg; + /* Write 1 to Clear the pending interrupt */ + if (sts & SHA256_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK) { + *reg = SHA256_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + cptra_intr_rcv.sha256_notif |= SHA256_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + } + if (sts == 0) { + VPRINTF(ERROR,"bad sha256_notif_intr sts:%x\n", sts); + SEND_STDOUT_CTRL(0x1); + while(1); + } +} + +inline void service_qspi_error_intr() {return;} +inline void service_qspi_notif_intr() {return;} +inline void service_uart_error_intr() {return;} +inline void service_uart_notif_intr() {return;} +inline void service_i3c_error_intr() {return;} +inline void service_i3c_notif_intr() {return;} + +inline void service_soc_ifc_error_intr() { + uint32_t * reg = (uint32_t *) (CLP_SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R); + uint32_t sts = *reg; + /* Write 1 to Clear the pending interrupt */ + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_INTERNAL_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_INTERNAL_STS_MASK; + cptra_intr_rcv.soc_ifc_error |= SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_INTERNAL_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_INV_DEV_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_INV_DEV_STS_MASK; + cptra_intr_rcv.soc_ifc_error |= SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_INV_DEV_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_CMD_FAIL_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_CMD_FAIL_STS_MASK; + cptra_intr_rcv.soc_ifc_error |= SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_CMD_FAIL_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_BAD_FUSE_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_BAD_FUSE_STS_MASK; + cptra_intr_rcv.soc_ifc_error |= SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_BAD_FUSE_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_ICCM_BLOCKED_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_ICCM_BLOCKED_STS_MASK; + cptra_intr_rcv.soc_ifc_error |= SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_ICCM_BLOCKED_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_MBOX_ECC_UNC_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_MBOX_ECC_UNC_STS_MASK; + cptra_intr_rcv.soc_ifc_error |= SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_MBOX_ECC_UNC_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_WDT_TIMER1_TIMEOUT_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_WDT_TIMER1_TIMEOUT_STS_MASK; + cptra_intr_rcv.soc_ifc_error |= SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_WDT_TIMER1_TIMEOUT_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_WDT_TIMER2_TIMEOUT_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_WDT_TIMER2_TIMEOUT_STS_MASK; + cptra_intr_rcv.soc_ifc_error |= SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_WDT_TIMER2_TIMEOUT_STS_MASK; + } + if (sts == 0) { + VPRINTF(ERROR,"bad soc_ifc_error_intr sts:%x\n", sts); + SEND_STDOUT_CTRL(0x1); + while(1); + } +} + +inline void service_soc_ifc_notif_intr () { + uint32_t * reg = (uint32_t *) (CLP_SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R); + uint32_t sts = *reg; + /* Write 1 to Clear the pending interrupt */ + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_AVAIL_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_AVAIL_STS_MASK; + cptra_intr_rcv.soc_ifc_notif |= SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_AVAIL_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_MBOX_ECC_COR_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_MBOX_ECC_COR_STS_MASK; + cptra_intr_rcv.soc_ifc_notif |= SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_MBOX_ECC_COR_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_DEBUG_LOCKED_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_DEBUG_LOCKED_STS_MASK; + cptra_intr_rcv.soc_ifc_notif |= SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_DEBUG_LOCKED_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_SCAN_MODE_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_SCAN_MODE_STS_MASK; + cptra_intr_rcv.soc_ifc_notif |= SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_SCAN_MODE_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_SOC_REQ_LOCK_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_SOC_REQ_LOCK_STS_MASK; + cptra_intr_rcv.soc_ifc_notif |= SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_SOC_REQ_LOCK_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_GEN_IN_TOGGLE_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_GEN_IN_TOGGLE_STS_MASK; + cptra_intr_rcv.soc_ifc_notif |= SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_GEN_IN_TOGGLE_STS_MASK; + } + if (sts == 0) { + VPRINTF(ERROR,"bad soc_ifc_notif_intr sts:%x\n", sts); + SEND_STDOUT_CTRL(0x1); + while(1); + } +} + +inline void service_sha512_acc_error_intr() {return;} +inline void service_sha512_acc_notif_intr() { + uint32_t * reg = (uint32_t *) (CLP_SHA512_ACC_CSR_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R); + uint32_t sts = *reg; + /* Write 1 to Clear the pending interrupt */ + if (sts & SHA512_ACC_CSR_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK) { + *reg = SHA512_ACC_CSR_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + cptra_intr_rcv.sha512_acc_notif |= SHA512_ACC_CSR_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + } + if (sts == 0) { + VPRINTF(ERROR,"bad sha512_acc_notif_intr sts:%x\n", sts); + SEND_STDOUT_CTRL(0x1); + while(1); + } +} + + +#endif //CALIPTRA_ISR_H diff --git a/src/integration/test_suites/caliptra_rt/caliptra_isr.h b/src/integration/test_suites/caliptra_rt/caliptra_isr.h index e7647284a..1f7d023bc 100644 --- a/src/integration/test_suites/caliptra_rt/caliptra_isr.h +++ b/src/integration/test_suites/caliptra_rt/caliptra_isr.h @@ -66,7 +66,7 @@ void init_interrupts(void); // otherwise generic ISR that gets laid down by the parameterized macro "nonstd_veer_isr" inline void service_doe_error_intr() {return;} inline void service_doe_notif_intr() { - uint32_t * reg = (uint32_t *) (CLP_DOE_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R); + volatile uint32_t * reg = (volatile uint32_t *) (CLP_DOE_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R); uint32_t sts = *reg; /* Write 1 to Clear the pending interrupt */ if (sts & DOE_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK) { @@ -82,7 +82,7 @@ inline void service_doe_notif_intr() { inline void service_ecc_error_intr() {return;} inline void service_ecc_notif_intr() { - uint32_t * reg = (uint32_t *) (CLP_ECC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R); + volatile uint32_t * reg = (volatile uint32_t *) (CLP_ECC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R); uint32_t sts = *reg; /* Write 1 to Clear the pending interrupt */ if (sts & ECC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK) { @@ -98,7 +98,7 @@ inline void service_ecc_notif_intr() { inline void service_hmac_error_intr() {return;} inline void service_hmac_notif_intr() { - uint32_t * reg = (uint32_t *) (CLP_HMAC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R); + volatile uint32_t * reg = (volatile uint32_t *) (CLP_HMAC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R); uint32_t sts = *reg; /* Write 1 to Clear the pending interrupt */ if (sts & HMAC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK) { @@ -116,7 +116,7 @@ inline void service_kv_error_intr() {return;} inline void service_kv_notif_intr() {return;} inline void service_sha512_error_intr() {return;} inline void service_sha512_notif_intr() { - uint32_t * reg = (uint32_t *) (CLP_SHA512_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R); + volatile uint32_t * reg = (volatile uint32_t *) (CLP_SHA512_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R); uint32_t sts = *reg; /* Write 1 to Clear the pending interrupt */ if (sts & SHA512_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK) { @@ -132,7 +132,7 @@ inline void service_sha512_notif_intr() { inline void service_sha256_error_intr() {return;} inline void service_sha256_notif_intr() { - uint32_t * reg = (uint32_t *) (CLP_SHA256_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R); + volatile uint32_t * reg = (volatile uint32_t *) (CLP_SHA256_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R); uint32_t sts = *reg; /* Write 1 to Clear the pending interrupt */ if (sts & SHA256_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK) { @@ -154,7 +154,7 @@ inline void service_i3c_error_intr() {return;} inline void service_i3c_notif_intr() {return;} inline void service_soc_ifc_error_intr() { - uint32_t * reg = (uint32_t *) (CLP_SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R); + volatile uint32_t * reg = (volatile uint32_t *) (CLP_SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R); uint32_t sts = *reg; /* Write 1 to Clear the pending interrupt */ if (sts & SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_INTERNAL_STS_MASK) { @@ -181,14 +181,14 @@ inline void service_soc_ifc_error_intr() { *reg = SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_MBOX_ECC_UNC_STS_MASK; cptra_intr_rcv.soc_ifc_error |= SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_MBOX_ECC_UNC_STS_MASK; } - if (sts & SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_WDT_TIMER1_TIMEOUT_STS_MASK) { - *reg = SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_WDT_TIMER1_TIMEOUT_STS_MASK; - cptra_intr_rcv.soc_ifc_error |= SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_WDT_TIMER1_TIMEOUT_STS_MASK; - } - if (sts & SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_WDT_TIMER2_TIMEOUT_STS_MASK) { - *reg = SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_WDT_TIMER2_TIMEOUT_STS_MASK; - cptra_intr_rcv.soc_ifc_error |= SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_WDT_TIMER2_TIMEOUT_STS_MASK; - } + // if (sts & SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_WDT_TIMER1_TIMEOUT_STS_MASK) { + // *reg = SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_WDT_TIMER1_TIMEOUT_STS_MASK; + // cptra_intr_rcv.soc_ifc_error |= SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_WDT_TIMER1_TIMEOUT_STS_MASK; + // } + // if (sts & SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_WDT_TIMER2_TIMEOUT_STS_MASK) { + // *reg = SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_WDT_TIMER2_TIMEOUT_STS_MASK; + // cptra_intr_rcv.soc_ifc_error |= SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_WDT_TIMER2_TIMEOUT_STS_MASK; + // } if (sts == 0) { VPRINTF(ERROR,"bad soc_ifc_error_intr sts:%x\n", sts); SEND_STDOUT_CTRL(0x1); @@ -197,7 +197,7 @@ inline void service_soc_ifc_error_intr() { } inline void service_soc_ifc_notif_intr () { - uint32_t * reg = (uint32_t *) (CLP_SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R); + volatile uint32_t * reg = (volatile uint32_t *) (CLP_SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R); uint32_t sts = *reg; /* Write 1 to Clear the pending interrupt */ if (sts & SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_AVAIL_STS_MASK) { @@ -208,6 +208,22 @@ inline void service_soc_ifc_notif_intr () { *reg = SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_MBOX_ECC_COR_STS_MASK; cptra_intr_rcv.soc_ifc_notif |= SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_MBOX_ECC_COR_STS_MASK; } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_DEBUG_LOCKED_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_DEBUG_LOCKED_STS_MASK; + cptra_intr_rcv.soc_ifc_notif |= SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_DEBUG_LOCKED_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_SCAN_MODE_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_SCAN_MODE_STS_MASK; + cptra_intr_rcv.soc_ifc_notif |= SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_SCAN_MODE_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_SOC_REQ_LOCK_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_SOC_REQ_LOCK_STS_MASK; + cptra_intr_rcv.soc_ifc_notif |= SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_SOC_REQ_LOCK_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_GEN_IN_TOGGLE_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_GEN_IN_TOGGLE_STS_MASK; + cptra_intr_rcv.soc_ifc_notif |= SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_GEN_IN_TOGGLE_STS_MASK; + } if (sts == 0) { VPRINTF(ERROR,"bad soc_ifc_notif_intr sts:%x\n", sts); SEND_STDOUT_CTRL(0x1); @@ -217,7 +233,7 @@ inline void service_soc_ifc_notif_intr () { inline void service_sha512_acc_error_intr() {return;} inline void service_sha512_acc_notif_intr() { - uint32_t * reg = (uint32_t *) (CLP_SHA512_ACC_CSR_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R); + volatile uint32_t * reg = (volatile uint32_t *) (CLP_SHA512_ACC_CSR_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R); uint32_t sts = *reg; /* Write 1 to Clear the pending interrupt */ if (sts & SHA512_ACC_CSR_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK) { diff --git a/src/integration/test_suites/caliptra_rt/caliptra_rt.c b/src/integration/test_suites/caliptra_rt/caliptra_rt.c index 183814882..5474d3032 100644 --- a/src/integration/test_suites/caliptra_rt/caliptra_rt.c +++ b/src/integration/test_suites/caliptra_rt/caliptra_rt.c @@ -72,6 +72,20 @@ volatile caliptra_intr_received_s cptra_intr_rcv = { .sha512_acc_error = 0, .sha512_acc_notif = 0, }; +#define CLEAR_INTR_FLAG_SAFELY(flag, mask) \ + csr_clr_bits_mstatus(MSTATUS_MIE_BIT_MASK); \ + flag &= mask; \ + csr_set_bits_mstatus(MSTATUS_MIE_BIT_MASK); + +#ifndef MY_RANDOM_SEED +#define MY_RANDOM_SEED 17 +#endif // MY_RANDOM_SEED + + +enum gen_in_value { + WDT_CASCADE = 0x0000abab, + WDT_INDEPENDENT = 0x0000efef +}; /* --------------- Function Definitions --------------- */ void nmi_handler() { @@ -92,6 +106,12 @@ void nmi_handler() { SEND_STDOUT_CTRL(0x1); } } + else { + VPRINTF(LOW, "In NMI handler\n"); + if (lsu_read_32(CLP_SOC_IFC_REG_CPTRA_HW_ERROR_FATAL) & SOC_IFC_REG_CPTRA_HW_ERROR_FATAL_NMI_PIN_MASK) + VPRINTF(LOW, "Saw hw_error_fatal.nmi_pin assertion\n"); + while(1); + } } void caliptra_rt() { @@ -105,8 +125,15 @@ void caliptra_rt() { uint32_t reg_addr; uint32_t read_data; uint32_t loop_iter; + uint32_t loop_iter2; uint32_t temp; // multi-purpose variable + //WDT vars + int i; + int wdt_rand_t1_val; + int wdt_rand_t2_val; + int mode = 0; + VPRINTF(MEDIUM, "----------------------------------\n"); VPRINTF(LOW, "- Caliptra Validation RT!!\n" ); VPRINTF(MEDIUM, "----------------------------------\n"); @@ -114,11 +141,89 @@ void caliptra_rt() { //set NMI vector lsu_write_32((uintptr_t) (CLP_SOC_IFC_REG_INTERNAL_NMI_VECTOR), (uint32_t) (nmi_handler)); + // Initialize rand num generator + VPRINTF(LOW,"\nUsing random seed = %d\n\n", MY_RANDOM_SEED); + srand((uint32_t) MY_RANDOM_SEED); + // Runtime flow -- set ready for RT soc_ifc_set_flow_status_field(SOC_IFC_REG_CPTRA_FLOW_STATUS_READY_FOR_RUNTIME_MASK); +#ifdef WDT_TEST + VPRINTF(LOW, "Enabling WDT intr\n"); + lsu_write_32(CLP_SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTR_EN_R, SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTR_EN_R_ERROR_WDT_TIMER1_TIMEOUT_EN_MASK | SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTR_EN_R_ERROR_WDT_TIMER2_TIMEOUT_EN_MASK); + lsu_write_32(CLP_SOC_IFC_REG_INTR_BLOCK_RF_GLOBAL_INTR_EN_R, SOC_IFC_REG_INTR_BLOCK_RF_GLOBAL_INTR_EN_R_ERROR_EN_MASK); + + //Generate constrained random WDT timer periods + wdt_rand_t1_val = rand() % 0xfff; + wdt_rand_t2_val = rand() % 0xfff; + + while (!(lsu_read_32(CLP_SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R) & SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_GEN_IN_TOGGLE_STS_MASK)); + if (lsu_read_32(CLP_SOC_IFC_REG_CPTRA_GENERIC_INPUT_WIRES_0) == WDT_CASCADE) { //rand() % 2; //0 - independent mode, 1 - cascade mode + VPRINTF(LOW, "Restarting WDT in cascade mode\n"); + //Enable timer1 to start cascade mode + lsu_write_32(CLP_SOC_IFC_REG_CPTRA_WDT_TIMER1_EN, SOC_IFC_REG_CPTRA_WDT_TIMER1_EN_TIMER1_EN_MASK); + //Set timer1 period to a small random value, so core can see timer1 timing out + lsu_write_32(CLP_SOC_IFC_REG_CPTRA_WDT_TIMER1_TIMEOUT_PERIOD_0, wdt_rand_t1_val); + lsu_write_32(CLP_SOC_IFC_REG_CPTRA_WDT_TIMER1_TIMEOUT_PERIOD_1, 0x00000000); + //Restart timer1 + lsu_write_32(CLP_SOC_IFC_REG_CPTRA_WDT_TIMER1_CTRL, SOC_IFC_REG_CPTRA_WDT_TIMER1_CTRL_TIMER1_RESTART_MASK); + + while (!(lsu_read_32(CLP_SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R) & SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_WDT_TIMER1_TIMEOUT_STS_MASK)); + //Clear timer1 intr + lsu_write_32(CLP_SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R, SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_WDT_TIMER1_TIMEOUT_STS_MASK); + + //Program timer1 and 2 periods to <= 0x100 to test NMI generation + wdt_rand_t1_val = rand() % 0x100; + wdt_rand_t2_val = rand() % 0x100; + //WDT cascade mode with t2 timeout + lsu_write_32(CLP_SOC_IFC_REG_CPTRA_WDT_TIMER2_EN, !SOC_IFC_REG_CPTRA_WDT_TIMER2_EN_TIMER2_EN_MASK); + lsu_write_32(CLP_SOC_IFC_REG_CPTRA_WDT_TIMER1_TIMEOUT_PERIOD_0, wdt_rand_t1_val); + lsu_write_32(CLP_SOC_IFC_REG_CPTRA_WDT_TIMER1_TIMEOUT_PERIOD_1, 0x00000000); + lsu_write_32(CLP_SOC_IFC_REG_CPTRA_WDT_TIMER2_TIMEOUT_PERIOD_0, wdt_rand_t2_val); + lsu_write_32(CLP_SOC_IFC_REG_CPTRA_WDT_TIMER2_TIMEOUT_PERIOD_1, 0x00000000); + lsu_write_32(CLP_SOC_IFC_REG_CPTRA_WDT_TIMER1_CTRL, SOC_IFC_REG_CPTRA_WDT_TIMER1_CTRL_TIMER1_RESTART_MASK); + // lsu_write_32(CLP_SOC_IFC_REG_CPTRA_WDT_TIMER2_CTRL, SOC_IFC_REG_CPTRA_WDT_TIMER2_CTRL_TIMER2_RESTART_MASK); + + //Don't service interrupts so it can timeout and cause NMI + } + else if (lsu_read_32(CLP_SOC_IFC_REG_CPTRA_GENERIC_INPUT_WIRES_0) == WDT_INDEPENDENT){ + VPRINTF(LOW, "Restarting WDT in independent mode\n"); + lsu_write_32(CLP_SOC_IFC_REG_CPTRA_WDT_TIMER1_EN, SOC_IFC_REG_CPTRA_WDT_TIMER1_EN_TIMER1_EN_MASK); + lsu_write_32(CLP_SOC_IFC_REG_CPTRA_WDT_TIMER1_TIMEOUT_PERIOD_0, wdt_rand_t1_val); + lsu_write_32(CLP_SOC_IFC_REG_CPTRA_WDT_TIMER1_TIMEOUT_PERIOD_1, 0x00000000); + + lsu_write_32(CLP_SOC_IFC_REG_CPTRA_WDT_TIMER2_EN, SOC_IFC_REG_CPTRA_WDT_TIMER2_EN_TIMER2_EN_MASK); + lsu_write_32(CLP_SOC_IFC_REG_CPTRA_WDT_TIMER2_TIMEOUT_PERIOD_0, wdt_rand_t2_val); + lsu_write_32(CLP_SOC_IFC_REG_CPTRA_WDT_TIMER2_TIMEOUT_PERIOD_1, 0x00000000); + + lsu_write_32(CLP_SOC_IFC_REG_CPTRA_WDT_TIMER1_CTRL, SOC_IFC_REG_CPTRA_WDT_TIMER1_CTRL_TIMER1_RESTART_MASK); + lsu_write_32(CLP_SOC_IFC_REG_CPTRA_WDT_TIMER2_CTRL, SOC_IFC_REG_CPTRA_WDT_TIMER2_CTRL_TIMER2_RESTART_MASK); + + while (!(lsu_read_32(CLP_SOC_IFC_REG_CPTRA_WDT_STATUS) & SOC_IFC_REG_CPTRA_WDT_STATUS_T1_TIMEOUT_MASK)); + //Reset timer1 period to avoid hangs in test + lsu_write_32(CLP_SOC_IFC_REG_CPTRA_WDT_TIMER1_TIMEOUT_PERIOD_0, 0xffffffff); + lsu_write_32(CLP_SOC_IFC_REG_CPTRA_WDT_TIMER1_TIMEOUT_PERIOD_1, 0xffffffff); + + while (!(lsu_read_32(CLP_SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R) & SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_WDT_TIMER1_TIMEOUT_STS_MASK)); + //Clear timer1 intr + lsu_write_32(CLP_SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R, SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_WDT_TIMER1_TIMEOUT_STS_MASK); + cptra_intr_rcv.soc_ifc_error |= SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_WDT_TIMER1_TIMEOUT_STS_MASK; + + //Reset timer2 period to avoid hangs in test + while (!(lsu_read_32(CLP_SOC_IFC_REG_CPTRA_WDT_STATUS) & SOC_IFC_REG_CPTRA_WDT_STATUS_T2_TIMEOUT_MASK)); + lsu_write_32(CLP_SOC_IFC_REG_CPTRA_WDT_TIMER2_TIMEOUT_PERIOD_0, 0xffffffff); + lsu_write_32(CLP_SOC_IFC_REG_CPTRA_WDT_TIMER2_TIMEOUT_PERIOD_1, 0xffffffff); + + while (!(lsu_read_32(CLP_SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R) & SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_WDT_TIMER2_TIMEOUT_STS_MASK)); + //Clear timer2 intr + lsu_write_32(CLP_SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R, SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_WDT_TIMER2_TIMEOUT_STS_MASK); + cptra_intr_rcv.soc_ifc_error |= SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_WDT_TIMER2_TIMEOUT_STS_MASK; + + } +#endif // Initialization init_interrupts(); + lsu_write_32(CLP_SHA512_ACC_CSR_INTR_BLOCK_RF_NOTIF_INTR_EN_R, 0); // FIXME tmp workaround to UVM issue with predicting SHA accelerator interrupts while(1) { // Service received interrupts @@ -126,28 +231,38 @@ void caliptra_rt() { if (cptra_intr_rcv.soc_ifc_error ) { VPRINTF(ERROR, "Intr received: soc_ifc_error\n"); if (cptra_intr_rcv.soc_ifc_error & SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_INTERNAL_STS_MASK) { - cptra_intr_rcv.soc_ifc_error &= ~SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_INTERNAL_STS_MASK; + CLEAR_INTR_FLAG_SAFELY(cptra_intr_rcv.soc_ifc_error, ~SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_INTERNAL_STS_MASK) } if (cptra_intr_rcv.soc_ifc_error & SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_INV_DEV_STS_MASK) { - cptra_intr_rcv.soc_ifc_error &= ~SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_INV_DEV_STS_MASK; + CLEAR_INTR_FLAG_SAFELY(cptra_intr_rcv.soc_ifc_error, ~SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_INV_DEV_STS_MASK) } if (cptra_intr_rcv.soc_ifc_error & SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_CMD_FAIL_STS_MASK) { - cptra_intr_rcv.soc_ifc_error &= ~SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_CMD_FAIL_STS_MASK; + enum mbox_fsm_e state; + CLEAR_INTR_FLAG_SAFELY(cptra_intr_rcv.soc_ifc_error, ~SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_CMD_FAIL_STS_MASK) + // If we entered the error state, we must use force-unlock to reset the mailbox state + state = (lsu_read_32(CLP_MBOX_CSR_MBOX_STATUS) & MBOX_CSR_MBOX_STATUS_MBOX_FSM_PS_MASK) >> MBOX_CSR_MBOX_STATUS_MBOX_FSM_PS_LOW; + if (state == MBOX_ERROR) { + // clr command interrupt to avoid attempted re-processing after force-unlock + if (cptra_intr_rcv.soc_ifc_notif & SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_AVAIL_STS_MASK) { + CLEAR_INTR_FLAG_SAFELY(cptra_intr_rcv.soc_ifc_notif, ~SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_AVAIL_STS_MASK) + } + lsu_write_32(CLP_MBOX_CSR_MBOX_UNLOCK, MBOX_CSR_MBOX_UNLOCK_UNLOCK_MASK); + } } if (cptra_intr_rcv.soc_ifc_error & SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_BAD_FUSE_STS_MASK) { - cptra_intr_rcv.soc_ifc_error &= ~SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_BAD_FUSE_STS_MASK; + CLEAR_INTR_FLAG_SAFELY(cptra_intr_rcv.soc_ifc_error, ~SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_BAD_FUSE_STS_MASK) } if (cptra_intr_rcv.soc_ifc_error & SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_ICCM_BLOCKED_STS_MASK) { - cptra_intr_rcv.soc_ifc_error &= ~SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_ICCM_BLOCKED_STS_MASK; + CLEAR_INTR_FLAG_SAFELY(cptra_intr_rcv.soc_ifc_error, ~SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_ICCM_BLOCKED_STS_MASK) } if (cptra_intr_rcv.soc_ifc_error & SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_MBOX_ECC_UNC_STS_MASK) { - cptra_intr_rcv.soc_ifc_error &= ~SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_MBOX_ECC_UNC_STS_MASK; + CLEAR_INTR_FLAG_SAFELY(cptra_intr_rcv.soc_ifc_error, ~SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_MBOX_ECC_UNC_STS_MASK) } if (cptra_intr_rcv.soc_ifc_error & SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_WDT_TIMER1_TIMEOUT_STS_MASK) { - cptra_intr_rcv.soc_ifc_error &= ~SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_WDT_TIMER1_TIMEOUT_STS_MASK; + CLEAR_INTR_FLAG_SAFELY(cptra_intr_rcv.soc_ifc_error, ~SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_WDT_TIMER1_TIMEOUT_STS_MASK) } if (cptra_intr_rcv.soc_ifc_error & SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_WDT_TIMER2_TIMEOUT_STS_MASK) { - cptra_intr_rcv.soc_ifc_error &= ~SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_WDT_TIMER2_TIMEOUT_STS_MASK; + CLEAR_INTR_FLAG_SAFELY(cptra_intr_rcv.soc_ifc_error, ~SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_WDT_TIMER2_TIMEOUT_STS_MASK) } if (cptra_intr_rcv.soc_ifc_error & (~SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_INTERNAL_STS_MASK & ~SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_INV_DEV_STS_MASK & @@ -170,7 +285,7 @@ void caliptra_rt() { if (cptra_intr_rcv.ecc_error ) { VPRINTF(ERROR, "Intr received: ecc_error\n"); if (cptra_intr_rcv.ecc_error & ECC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_INTERNAL_STS_MASK) { - cptra_intr_rcv.ecc_error &= ~ECC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_INTERNAL_STS_MASK; + CLEAR_INTR_FLAG_SAFELY(cptra_intr_rcv.ecc_error, ~ECC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_INTERNAL_STS_MASK) } if (cptra_intr_rcv.ecc_error & ~ECC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_INTERNAL_STS_MASK) { VPRINTF(FATAL, "Intr received: unsupported ecc_error (0x%x)\n", cptra_intr_rcv.ecc_error); @@ -212,9 +327,24 @@ void caliptra_rt() { } if (cptra_intr_rcv.soc_ifc_notif ) { + uint8_t fsm_chk; VPRINTF(LOW, "Intr received: soc_ifc_notif\n"); if (cptra_intr_rcv.soc_ifc_notif & SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_AVAIL_STS_MASK) { - cptra_intr_rcv.soc_ifc_notif &= ~SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_AVAIL_STS_MASK; + CLEAR_INTR_FLAG_SAFELY(cptra_intr_rcv.soc_ifc_notif, ~SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_AVAIL_STS_MASK) + fsm_chk = soc_ifc_chk_execute_uc(); + if (fsm_chk != 0) { + if (fsm_chk == 0xF) { + if (cptra_intr_rcv.soc_ifc_error & SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_CMD_FAIL_STS_MASK) { + CLEAR_INTR_FLAG_SAFELY(cptra_intr_rcv.soc_ifc_error, ~SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_CMD_FAIL_STS_MASK) + VPRINTF(LOW, "Clearing FW soc_ifc_error intr bit (cmd fail) after servicing\n"); + } else { + VPRINTF(ERROR, "After finding an error and resetting the mailbox with force unlock, RT firmware has not received an soc_ifc_err_intr!\n"); + SEND_STDOUT_CTRL(0x1); + while(1); + } + } + continue; + } //read the mbox command op = soc_ifc_read_mbox_cmd(); if (op.cmd & MBOX_CMD_FIELD_FW_MASK) { @@ -224,7 +354,7 @@ void caliptra_rt() { } VPRINTF(MEDIUM, "Triggering FW update reset\n"); //Trigger firmware update reset, new fw will get copied over from ROM - soc_ifc_set_fw_update_reset(); + soc_ifc_set_fw_update_reset((uint8_t) (rand() & 0xFF)); } else if (op.cmd & MBOX_CMD_FIELD_RESP_MASK) { VPRINTF(MEDIUM, "Received mailbox command (expecting RESP) from SOC! Got 0x%x\n", op.cmd); @@ -252,22 +382,26 @@ void caliptra_rt() { mode = (op.cmd == MBOX_CMD_SHA384_REQ) ? SHA_MBOX_384 : SHA_MBOX_512; //First dword contains the start address temp = soc_ifc_mbox_read_dataout_single(); - //dlen in bytes - read_data = lsu_read_32(CLP_MBOX_CSR_MBOX_DLEN); - read_data = read_data - temp; + //ignore the bytes used for start address + op.dlen = op.dlen - 4; + //Copy the KAT to the start address using direct access + for (loop_iter = 0; loop_iter +#include "printf.h" + +/* --------------- symbols/typedefs --------------- */ +typedef struct { + uint32_t doe_error; + uint32_t doe_notif; + uint32_t ecc_error; + uint32_t ecc_notif; + uint32_t hmac_error; + uint32_t hmac_notif; + uint32_t kv_error; + uint32_t kv_notif; + uint32_t sha512_error; + uint32_t sha512_notif; + uint32_t sha256_error; + uint32_t sha256_notif; + uint32_t qspi_error; + uint32_t qspi_notif; + uint32_t uart_error; + uint32_t uart_notif; + uint32_t i3c_error; + uint32_t i3c_notif; + uint32_t soc_ifc_error; + uint32_t soc_ifc_notif; + uint32_t sha512_acc_error; + uint32_t sha512_acc_notif; +} caliptra_intr_received_s; +extern volatile caliptra_intr_received_s cptra_intr_rcv; + +////////////////////////////////////////////////////////////////////////////// +// Function Declarations +// + +// Performs all the CSR setup to configure and enable vectored external interrupts +void init_interrupts(void); + +// These inline functions are used to insert event-specific functionality into the +// otherwise generic ISR that gets laid down by the parameterized macro "nonstd_veer_isr" +inline void service_doe_error_intr() { + volatile uint32_t * reg = (volatile uint32_t *) (CLP_DOE_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R); + uint32_t sts = *reg; + if (sts != 0) { + cptra_intr_rcv.doe_error = 0xFFFFFFFF; + VPRINTF(FATAL,"caliptra_top (ROM) val image does not support interrupts!\n"); + SEND_STDOUT_CTRL(0x1); + while(1); + } +} + +inline void service_doe_notif_intr() { + volatile uint32_t * reg = (volatile uint32_t *) (CLP_DOE_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R); + uint32_t sts = *reg; + if (sts != 0) { + cptra_intr_rcv.doe_notif = 0xFFFFFFFF; + VPRINTF(FATAL,"caliptra_top (ROM) val image does not support interrupts!\n"); + SEND_STDOUT_CTRL(0x1); + while(1); + } +} + +inline void service_ecc_error_intr() { + volatile uint32_t * reg = (volatile uint32_t *) (CLP_ECC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R); + uint32_t sts = *reg; + if (sts != 0) { + cptra_intr_rcv.ecc_error = 0xFFFFFFFF; + VPRINTF(FATAL,"caliptra_top (ROM) val image does not support interrupts!\n"); + SEND_STDOUT_CTRL(0x1); + while(1); + } +} + +inline void service_ecc_notif_intr() { + volatile uint32_t * reg = (volatile uint32_t *) (CLP_ECC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R); + uint32_t sts = *reg; + if (sts != 0) { + cptra_intr_rcv.ecc_notif = 0xFFFFFFFF; + VPRINTF(FATAL,"caliptra_top (ROM) val image does not support interrupts!\n"); + SEND_STDOUT_CTRL(0x1); + while(1); + } +} + +inline void service_hmac_error_intr() { + volatile uint32_t * reg = (volatile uint32_t *) (CLP_HMAC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R); + uint32_t sts = *reg; + if (sts != 0) { + cptra_intr_rcv.hmac_error = 0xFFFFFFFF; + VPRINTF(FATAL,"caliptra_top (ROM) val image does not support interrupts!\n"); + SEND_STDOUT_CTRL(0x1); + while(1); + } +} + +inline void service_hmac_notif_intr() { + volatile uint32_t * reg = (volatile uint32_t *) (CLP_HMAC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R); + uint32_t sts = *reg; + if (sts != 0) { + cptra_intr_rcv.hmac_notif = 0xFFFFFFFF; + VPRINTF(FATAL,"caliptra_top (ROM) val image does not support interrupts!\n"); + SEND_STDOUT_CTRL(0x1); + while(1); + } +} + +inline void service_kv_error_intr() {return;} +inline void service_kv_notif_intr() {return;} +inline void service_sha512_error_intr() { + volatile uint32_t * reg = (volatile uint32_t *) (CLP_SHA512_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R); + uint32_t sts = *reg; + if (sts != 0) { + cptra_intr_rcv.sha512_error = 0xFFFFFFFF; + VPRINTF(FATAL,"caliptra_top (ROM) val image does not support interrupts!\n"); + SEND_STDOUT_CTRL(0x1); + while(1); + } +} + +inline void service_sha512_notif_intr() { + volatile uint32_t * reg = (volatile uint32_t *) (CLP_SHA512_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R); + uint32_t sts = *reg; + if (sts != 0) { + cptra_intr_rcv.sha512_notif = 0xFFFFFFFF; + VPRINTF(FATAL,"caliptra_top (ROM) val image does not support interrupts!\n"); + SEND_STDOUT_CTRL(0x1); + while(1); + } +} + +inline void service_sha256_error_intr() { + volatile uint32_t * reg = (volatile uint32_t *) (CLP_SHA256_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R); + uint32_t sts = *reg; + if (sts != 0) { + cptra_intr_rcv.sha256_error = 0xFFFFFFFF; + VPRINTF(FATAL,"caliptra_top (ROM) val image does not support interrupts!\n"); + SEND_STDOUT_CTRL(0x1); + while(1); + } +} + +inline void service_sha256_notif_intr() { + volatile uint32_t * reg = (volatile uint32_t *) (CLP_SHA256_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R); + uint32_t sts = *reg; + if (sts != 0) { + cptra_intr_rcv.sha256_notif = 0xFFFFFFFF; + VPRINTF(FATAL,"caliptra_top (ROM) val image does not support interrupts!\n"); + SEND_STDOUT_CTRL(0x1); + while(1); + } +} + +inline void service_qspi_error_intr() {return;} +inline void service_qspi_notif_intr() {return;} +inline void service_uart_error_intr() {return;} +inline void service_uart_notif_intr() {return;} +inline void service_i3c_error_intr() {return;} +inline void service_i3c_notif_intr() {return;} + +inline void service_soc_ifc_error_intr() { + volatile uint32_t * reg = (volatile uint32_t *) (CLP_SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R); + uint32_t sts = *reg; + if (sts != 0) { + cptra_intr_rcv.soc_ifc_error = 0xFFFFFFFF; + VPRINTF(FATAL,"caliptra_top (ROM) val image does not support interrupts!\n"); + SEND_STDOUT_CTRL(0x1); + while(1); + } +} + +inline void service_soc_ifc_notif_intr () { + volatile uint32_t * reg = (volatile uint32_t *) (CLP_SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R); + uint32_t sts = *reg; + if (sts != 0) { + cptra_intr_rcv.soc_ifc_notif = 0xFFFFFFFF; + VPRINTF(FATAL,"caliptra_top (ROM) val image does not support interrupts!\n"); + SEND_STDOUT_CTRL(0x1); + while(1); + } +} + +inline void service_sha512_acc_error_intr() { + uint32_t * reg = (uint32_t *) (CLP_SHA512_ACC_CSR_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R); + uint32_t sts = *reg; + if (sts != 0) { + cptra_intr_rcv.sha512_acc_error = 0xFFFFFFFF; + VPRINTF(FATAL,"caliptra_top (ROM) val image does not support interrupts!\n"); + SEND_STDOUT_CTRL(0x1); + while(1); + } +} + +inline void service_sha512_acc_notif_intr() { + uint32_t * reg = (uint32_t *) (CLP_SHA512_ACC_CSR_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R); + uint32_t sts = *reg; + if (sts != 0) { + cptra_intr_rcv.sha512_acc_notif = 0xFFFFFFFF; + VPRINTF(FATAL,"caliptra_top (ROM) val image does not support interrupts!\n"); + SEND_STDOUT_CTRL(0x1); + while(1); + } +} + + +#endif //CALIPTRA_ISR_H diff --git a/src/integration/test_suites/caliptra_top/caliptra_top.c b/src/integration/test_suites/caliptra_top/caliptra_top.c index e2e199fd9..d1ebee1a0 100644 --- a/src/integration/test_suites/caliptra_top/caliptra_top.c +++ b/src/integration/test_suites/caliptra_top/caliptra_top.c @@ -24,6 +24,7 @@ #include "sha256.h" #include "sha512.h" #include "soc_ifc.h" +#include "caliptra_isr.h" #include #include #include "printf.h" @@ -37,6 +38,8 @@ volatile char* stdout = (char *)STDOUT; #else enum printf_verbosity verbosity_g = LOW; #endif +volatile caliptra_intr_received_s cptra_intr_rcv; +volatile uint32_t intr_count = 0; /* --------------- Function Prototypes --------------- */ @@ -66,16 +69,25 @@ void main() { VPRINTF(MEDIUM, "----------------------------------\n"); // TODO other init tasks? (interrupts later) + VPRINTF(LOW, "Starting WDT in cascade mode\n"); + lsu_write_32(CLP_SOC_IFC_REG_CPTRA_WDT_TIMER1_EN, SOC_IFC_REG_CPTRA_WDT_TIMER1_EN_TIMER1_EN_MASK); //Check the reset reason FIXME (as soc_ifc fn) reset_reason = lsu_read_32(CLP_SOC_IFC_REG_CPTRA_RESET_REASON); //Cold Boot, run DOE flows, wait for FW image if (reset_reason == 0x0) { + VPRINTF(LOW, "Beginning Cold Boot flow\n"); doe_init(iv_data_uds, iv_data_fe, 0x6); // TODO replace 0x6 with entry indicators + VPRINTF(LOW, "Setting Flow Status\n"); soc_ifc_set_flow_status_field(SOC_IFC_REG_CPTRA_FLOW_STATUS_READY_FOR_FW_MASK); + VPRINTF(LOW, "Unlocking SHA512-ACC\n"); + // Clear SHA accelerator lock (FIPS requirement) + soc_ifc_w1clr_sha_lock_field(SHA512_ACC_CSR_LOCK_LOCK_MASK); + + VPRINTF(LOW, "Waiting for FMC FW to be loaded\n"); // Wait for FW available (FMC) do { intr_sts = lsu_read_32(CLP_SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R); @@ -114,6 +126,7 @@ void main() { soc_ifc_clr_flow_status_field(SOC_IFC_REG_CPTRA_FLOW_STATUS_READY_FOR_FW_MASK); // Jump to ICCM (this is the FMC image, a.k.a. Section 0) + VPRINTF(LOW, "FMC FW loaded into ICCM - jumping there \n"); iccm_fmc(); } //FW Update Reset @@ -139,13 +152,16 @@ void main() { // Ready for FW (need to reload the FMC) soc_ifc_set_flow_status_field(SOC_IFC_REG_CPTRA_FLOW_STATUS_READY_FOR_FW_MASK); + // Clear SHA accelerator lock (FIPS requirement) + soc_ifc_w1clr_sha_lock_field(SHA512_ACC_CSR_LOCK_LOCK_MASK); + // Wait for FW available (FMC) do { - intr_sts = lsu_read_32( (uint32_t*) CLP_SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R); + intr_sts = lsu_read_32( (uintptr_t) CLP_SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R); intr_sts &= SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_AVAIL_STS_MASK; } while (!intr_sts); //clear the interrupt - lsu_write_32((uint32_t*) CLP_SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R, SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_AVAIL_STS_MASK); + lsu_write_32((uintptr_t) CLP_SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R, SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_AVAIL_STS_MASK); op = soc_ifc_read_mbox_cmd(); if (op.cmd != MBOX_CMD_FMC_UPDATE) { @@ -160,11 +176,11 @@ void main() { // Wait for FW available (RT) do { - intr_sts = lsu_read_32( (uint32_t*) CLP_SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R); + intr_sts = lsu_read_32( (uintptr_t) CLP_SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R); intr_sts &= SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_AVAIL_STS_MASK; } while (!intr_sts); //clear the interrupt - lsu_write_32((uint32_t*) CLP_SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R, SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_AVAIL_STS_MASK); + lsu_write_32((uintptr_t) CLP_SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R, SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_AVAIL_STS_MASK); //read the mbox command op = soc_ifc_read_mbox_cmd(); if (op.cmd != MBOX_CMD_RT_UPDATE) { diff --git a/src/integration/test_suites/fw_test_rom/fw_test_rom b/src/integration/test_suites/fw_test_rom/fw_test_rom new file mode 100644 index 000000000..7bf33b11c Binary files /dev/null and b/src/integration/test_suites/fw_test_rom/fw_test_rom differ diff --git a/src/integration/test_suites/fw_test_rom/fw_test_rom.makefile b/src/integration/test_suites/fw_test_rom/fw_test_rom.makefile new file mode 100644 index 000000000..eabd715f4 --- /dev/null +++ b/src/integration/test_suites/fw_test_rom/fw_test_rom.makefile @@ -0,0 +1,53 @@ +# SPDX-License-Identifier: Apache-2.0 +# Copyright 2020 Western Digital Corporation or its affiliates. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +GCC_PREFIX = riscv64-unknown-elf +BUILD_DIR = $(CURDIR) + +# Define test name +TESTNAME ?= fw_test_rom +TESTNAME_fw = $(TESTNAME)_fw +TEST_DIR = $(CALIPTRA_ROOT)/src/integration/test_suites/$(TESTNAME) + +VPATH = $(TEST_DIR) $(BUILD_DIR) + +# Targets +all: program.hex + +clean: + rm -rf *.log *.s *.hex *.dis *.size *.tbl .map *.map snapshots \ + *.exe obj* *.o csrc *.csv work \ + dataset.asdb library.cfg vsimsa.cfg \ + *.h + +############ TEST build ############################### + +# Build program.hex from RUST executable +program.hex: fw_update.hex + @echo "Building program.hex from $(TESTNAME) using Crypto Test rules for pre-compiled RUST executables" + -$(GCC_PREFIX)-objcopy -O verilog --pad-to 0x8000 --gap-fill 0xFF --no-change-warnings $(TEST_DIR)/$(TESTNAME) program.hex + $(GCC_PREFIX)-objdump -S $(TEST_DIR)/$(TESTNAME) > $(TESTNAME).dis + $(GCC_PREFIX)-size $(TEST_DIR)/$(TESTNAME) | tee $(TESTNAME).size + +fw_update.hex: + @echo "Building fw_update.hex from $(TESTNAME_fw) using simple hexdump on pre-compiled RUST package" + -hexdump -v -e '16/1 "%02x " "\n"' $(TEST_DIR)/$(TESTNAME_fw) > fw_update.hex + + +help: + @echo Make sure the environment variable RV_ROOT is set. + @echo Possible targets: help clean all program.hex + +.PHONY: help clean diff --git a/src/integration/test_suites/fw_test_rom/fw_test_rom_fw b/src/integration/test_suites/fw_test_rom/fw_test_rom_fw new file mode 100644 index 000000000..e59e82bd4 Binary files /dev/null and b/src/integration/test_suites/fw_test_rom/fw_test_rom_fw differ diff --git a/src/integration/test_suites/hello_world_iccm/caliptra_isr.h b/src/integration/test_suites/hello_world_iccm/caliptra_isr.h new file mode 100644 index 000000000..8f5779e04 --- /dev/null +++ b/src/integration/test_suites/hello_world_iccm/caliptra_isr.h @@ -0,0 +1,247 @@ +// SPDX-License-Identifier: Apache-2.0 +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// --------------------------------------------------------------------- +// File: caliptra_isr.h +// Description: +// Provides function declarations for use by external test files, so +// that the ISR functionality may behave like a library. +// TODO: +// This header file includes inline function definitions for event and +// test specific interrupt service behavior, so it should be copied and +// modified for each test. +// --------------------------------------------------------------------- + +#ifndef CALIPTRA_ISR_H + #define CALIPTRA_ISR_H + +#define EN_ISR_PRINTS 1 + +#include "caliptra_defines.h" +#include +#include "printf.h" + +/* --------------- symbols/typedefs --------------- */ +typedef struct { + uint32_t doe_error; + uint32_t doe_notif; + uint32_t ecc_error; + uint32_t ecc_notif; + uint32_t hmac_error; + uint32_t hmac_notif; + uint32_t kv_error; + uint32_t kv_notif; + uint32_t sha512_error; + uint32_t sha512_notif; + uint32_t sha256_error; + uint32_t sha256_notif; + uint32_t qspi_error; + uint32_t qspi_notif; + uint32_t uart_error; + uint32_t uart_notif; + uint32_t i3c_error; + uint32_t i3c_notif; + uint32_t soc_ifc_error; + uint32_t soc_ifc_notif; + uint32_t sha512_acc_error; + uint32_t sha512_acc_notif; +} caliptra_intr_received_s; +extern volatile caliptra_intr_received_s cptra_intr_rcv; + +////////////////////////////////////////////////////////////////////////////// +// Function Declarations +// + +// Performs all the CSR setup to configure and enable vectored external interrupts +void init_interrupts(void); + +// These inline functions are used to insert event-specific functionality into the +// otherwise generic ISR that gets laid down by the parameterized macro "nonstd_veer_isr" +inline void service_doe_error_intr() {return;} +inline void service_doe_notif_intr() { + uint32_t * reg = (uint32_t *) (CLP_DOE_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R); + uint32_t sts = *reg; + /* Write 1 to Clear the pending interrupt */ + if (sts & DOE_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK) { + *reg = DOE_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + cptra_intr_rcv.doe_notif |= DOE_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + } + if (sts == 0) { + VPRINTF(ERROR,"bad doe_notif_intr sts:%x\n", sts); + SEND_STDOUT_CTRL(0x1); + while(1); + } +} + +inline void service_ecc_error_intr() {return;} +inline void service_ecc_notif_intr() { + uint32_t * reg = (uint32_t *) (CLP_ECC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R); + uint32_t sts = *reg; + /* Write 1 to Clear the pending interrupt */ + if (sts & ECC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK) { + *reg = ECC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + cptra_intr_rcv.ecc_notif |= ECC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + } + if (sts == 0) { + VPRINTF(ERROR,"bad ecc_notif_intr sts:%x\n", sts); + SEND_STDOUT_CTRL(0x1); + while(1); + } +} + +inline void service_hmac_error_intr() {return;} +inline void service_hmac_notif_intr() { + uint32_t * reg = (uint32_t *) (CLP_HMAC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R); + uint32_t sts = *reg; + /* Write 1 to Clear the pending interrupt */ + if (sts & HMAC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK) { + *reg = HMAC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + cptra_intr_rcv.hmac_notif |= HMAC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + } + if (sts == 0) { + VPRINTF(ERROR,"bad hmac_notif_intr sts:%x\n", sts); + SEND_STDOUT_CTRL(0x1); + while(1); + } +} + +inline void service_kv_error_intr() {return;} +inline void service_kv_notif_intr() {return;} +inline void service_sha512_error_intr() {return;} +inline void service_sha512_notif_intr() { + uint32_t * reg = (uint32_t *) (CLP_SHA512_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R); + uint32_t sts = *reg; + /* Write 1 to Clear the pending interrupt */ + if (sts & SHA512_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK) { + *reg = SHA512_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + cptra_intr_rcv.sha512_notif |= SHA512_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + } + if (sts == 0) { + VPRINTF(ERROR,"bad sha512_notif_intr sts:%x\n", sts); + SEND_STDOUT_CTRL(0x1); + while(1); + } +} + +inline void service_sha256_error_intr() {return;} +inline void service_sha256_notif_intr() { + uint32_t * reg = (uint32_t *) (CLP_SHA256_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R); + uint32_t sts = *reg; + /* Write 1 to Clear the pending interrupt */ + if (sts & SHA256_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK) { + *reg = SHA256_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + cptra_intr_rcv.sha256_notif |= SHA256_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + } + if (sts == 0) { + VPRINTF(ERROR,"bad sha256_notif_intr sts:%x\n", sts); + SEND_STDOUT_CTRL(0x1); + while(1); + } +} + +inline void service_qspi_error_intr() {return;} +inline void service_qspi_notif_intr() {return;} +inline void service_uart_error_intr() {return;} +inline void service_uart_notif_intr() {return;} +inline void service_i3c_error_intr() {return;} +inline void service_i3c_notif_intr() {return;} + +inline void service_soc_ifc_error_intr() { + uint32_t * reg = (uint32_t *) (CLP_SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R); + uint32_t sts = *reg; + /* Write 1 to Clear the pending interrupt */ + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_INTERNAL_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_INTERNAL_STS_MASK; + cptra_intr_rcv.soc_ifc_error |= SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_INTERNAL_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_INV_DEV_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_INV_DEV_STS_MASK; + cptra_intr_rcv.soc_ifc_error |= SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_INV_DEV_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_CMD_FAIL_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_CMD_FAIL_STS_MASK; + cptra_intr_rcv.soc_ifc_error |= SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_CMD_FAIL_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_BAD_FUSE_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_BAD_FUSE_STS_MASK; + cptra_intr_rcv.soc_ifc_error |= SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_BAD_FUSE_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_ICCM_BLOCKED_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_ICCM_BLOCKED_STS_MASK; + cptra_intr_rcv.soc_ifc_error |= SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_ICCM_BLOCKED_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_MBOX_ECC_UNC_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_MBOX_ECC_UNC_STS_MASK; + cptra_intr_rcv.soc_ifc_error |= SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_MBOX_ECC_UNC_STS_MASK; + } + if (sts == 0) { + VPRINTF(ERROR,"bad soc_ifc_error_intr sts:%x\n", sts); + SEND_STDOUT_CTRL(0x1); + while(1); + } +} + +inline void service_soc_ifc_notif_intr () { + uint32_t * reg = (uint32_t *) (CLP_SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R); + uint32_t sts = *reg; + /* Write 1 to Clear the pending interrupt */ + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_AVAIL_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_AVAIL_STS_MASK; + cptra_intr_rcv.soc_ifc_notif |= SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_AVAIL_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_MBOX_ECC_COR_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_MBOX_ECC_COR_STS_MASK; + cptra_intr_rcv.soc_ifc_notif |= SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_MBOX_ECC_COR_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_DEBUG_LOCKED_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_DEBUG_LOCKED_STS_MASK; + cptra_intr_rcv.soc_ifc_notif |= SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_DEBUG_LOCKED_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_SCAN_MODE_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_SCAN_MODE_STS_MASK; + cptra_intr_rcv.soc_ifc_notif |= SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_SCAN_MODE_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_SOC_REQ_LOCK_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_SOC_REQ_LOCK_STS_MASK; + cptra_intr_rcv.soc_ifc_notif |= SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_SOC_REQ_LOCK_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_GEN_IN_TOGGLE_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_GEN_IN_TOGGLE_STS_MASK; + cptra_intr_rcv.soc_ifc_notif |= SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_GEN_IN_TOGGLE_STS_MASK; + } + if (sts == 0) { + VPRINTF(ERROR,"bad soc_ifc_notif_intr sts:%x\n", sts); + SEND_STDOUT_CTRL(0x1); + while(1); + } +} + +inline void service_sha512_acc_error_intr() {return;} +inline void service_sha512_acc_notif_intr() { + uint32_t * reg = (uint32_t *) (CLP_SHA512_ACC_CSR_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R); + uint32_t sts = *reg; + /* Write 1 to Clear the pending interrupt */ + if (sts & SHA512_ACC_CSR_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK) { + *reg = SHA512_ACC_CSR_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + cptra_intr_rcv.sha512_acc_notif |= SHA512_ACC_CSR_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + } + if (sts == 0) { + VPRINTF(ERROR,"bad sha512_acc_notif_intr sts:%x\n", sts); + SEND_STDOUT_CTRL(0x1); + while(1); + } +} + + +#endif //CALIPTRA_ISR_H diff --git a/src/integration/test_suites/hello_world_iccm/hello_world_iccm.s b/src/integration/test_suites/hello_world_iccm/hello_world_iccm.s index a0d643154..3be592213 100644 --- a/src/integration/test_suites/hello_world_iccm/hello_world_iccm.s +++ b/src/integration/test_suites/hello_world_iccm/hello_world_iccm.s @@ -33,6 +33,9 @@ _start: li x1, 0xaaaaaaaa csrw 0x7c0, x1 + // Call interrupt init + call init_interrupts + li x3, 4 csrw mfdc, x3 // disable store merging li x3, RV_ICCM_SADR // desired destination (ICCM) for printf subroutine (i.e. VMA) @@ -67,6 +70,11 @@ _finish: stdout: .word STDOUT .global verbosity_g verbosity_g: .word 2 +// FW polls this variable for intr +.global intr_count +intr_count: .word 0 +.global cptra_intr_rcv +cptra_intr_rcv: .word 0 hw_data: .ascii "----------------------------------------\n" .ascii "Hello World from VeeR EL2 ICCM !!\n" diff --git a/src/integration/test_suites/iccm_lock/caliptra_isr.h b/src/integration/test_suites/iccm_lock/caliptra_isr.h index 06cfbecad..0bdef173f 100644 --- a/src/integration/test_suites/iccm_lock/caliptra_isr.h +++ b/src/integration/test_suites/iccm_lock/caliptra_isr.h @@ -26,12 +26,37 @@ #ifndef CALIPTRA_ISR_H #define CALIPTRA_ISR_H -#define EN_ISR_PRINTS 0 - -#include "caliptra_reg.h" +#include "caliptra_defines.h" #include #include "printf.h" +/* --------------- symbols/typedefs --------------- */ +typedef struct { + uint32_t doe_error; + uint32_t doe_notif; + uint32_t ecc_error; + uint32_t ecc_notif; + uint32_t hmac_error; + uint32_t hmac_notif; + uint32_t kv_error; + uint32_t kv_notif; + uint32_t sha512_error; + uint32_t sha512_notif; + uint32_t sha256_error; + uint32_t sha256_notif; + uint32_t qspi_error; + uint32_t qspi_notif; + uint32_t uart_error; + uint32_t uart_notif; + uint32_t i3c_error; + uint32_t i3c_notif; + uint32_t soc_ifc_error; + uint32_t soc_ifc_notif; + uint32_t sha512_acc_error; + uint32_t sha512_acc_notif; +} caliptra_intr_received_s; +extern volatile caliptra_intr_received_s cptra_intr_rcv; + ////////////////////////////////////////////////////////////////////////////// // Function Declarations // @@ -48,10 +73,12 @@ inline void service_doe_notif_intr() { /* Write 1 to Clear the pending interrupt */ if (sts & DOE_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK) { *reg = DOE_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + cptra_intr_rcv.doe_notif |= DOE_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; } if (sts == 0) { - printf("bad doe_notif_intr sts:%x\n", sts); - printf("%c", 0x1); + VPRINTF(ERROR,"bad doe_notif_intr sts:%x\n", sts); + SEND_STDOUT_CTRL(0x1); + while(1); } } @@ -62,10 +89,12 @@ inline void service_ecc_notif_intr() { /* Write 1 to Clear the pending interrupt */ if (sts & ECC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK) { *reg = ECC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + cptra_intr_rcv.ecc_notif |= ECC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; } if (sts == 0) { - printf("bad ecc_notif_intr sts:%x\n", sts); - printf("%c", 0x1); + VPRINTF(ERROR,"bad ecc_notif_intr sts:%x\n", sts); + SEND_STDOUT_CTRL(0x1); + while(1); } } @@ -76,10 +105,12 @@ inline void service_hmac_notif_intr() { /* Write 1 to Clear the pending interrupt */ if (sts & HMAC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK) { *reg = HMAC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + cptra_intr_rcv.hmac_notif |= HMAC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; } if (sts == 0) { - printf("bad hmac_notif_intr sts:%x\n", sts); - printf("%c", 0x1); + VPRINTF(ERROR,"bad hmac_notif_intr sts:%x\n", sts); + SEND_STDOUT_CTRL(0x1); + while(1); } } @@ -92,10 +123,12 @@ inline void service_sha512_notif_intr() { /* Write 1 to Clear the pending interrupt */ if (sts & SHA512_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK) { *reg = SHA512_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + cptra_intr_rcv.sha512_notif |= SHA512_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; } if (sts == 0) { - printf("bad sha512_notif_intr sts:%x\n", sts); - printf("%c", 0x1); + VPRINTF(ERROR,"bad sha512_notif_intr sts:%x\n", sts); + SEND_STDOUT_CTRL(0x1); + while(1); } } @@ -106,10 +139,12 @@ inline void service_sha256_notif_intr() { /* Write 1 to Clear the pending interrupt */ if (sts & SHA256_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK) { *reg = SHA256_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + cptra_intr_rcv.sha256_notif |= SHA256_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; } if (sts == 0) { - printf("bad sha256_notif_intr sts:%x\n", sts); - printf("%c", 0x1); + VPRINTF(ERROR,"bad sha256_notif_intr sts:%x\n", sts); + SEND_STDOUT_CTRL(0x1); + while(1); } } @@ -119,31 +154,39 @@ inline void service_uart_error_intr() {return;} inline void service_uart_notif_intr() {return;} inline void service_i3c_error_intr() {return;} inline void service_i3c_notif_intr() {return;} + inline void service_soc_ifc_error_intr() { uint32_t * reg = (uint32_t *) (CLP_SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R); uint32_t sts = *reg; /* Write 1 to Clear the pending interrupt */ if (sts & SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_INTERNAL_STS_MASK) { *reg = SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_INTERNAL_STS_MASK; + cptra_intr_rcv.soc_ifc_error |= SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_INTERNAL_STS_MASK; } if (sts & SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_INV_DEV_STS_MASK) { *reg = SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_INV_DEV_STS_MASK; + cptra_intr_rcv.soc_ifc_error |= SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_INV_DEV_STS_MASK; } if (sts & SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_CMD_FAIL_STS_MASK) { *reg = SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_CMD_FAIL_STS_MASK; + cptra_intr_rcv.soc_ifc_error |= SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_CMD_FAIL_STS_MASK; } if (sts & SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_BAD_FUSE_STS_MASK) { *reg = SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_BAD_FUSE_STS_MASK; + cptra_intr_rcv.soc_ifc_error |= SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_BAD_FUSE_STS_MASK; } if (sts & SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_ICCM_BLOCKED_STS_MASK) { *reg = SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_ICCM_BLOCKED_STS_MASK; + cptra_intr_rcv.soc_ifc_error |= SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_ICCM_BLOCKED_STS_MASK; } if (sts & SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_MBOX_ECC_UNC_STS_MASK) { *reg = SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_MBOX_ECC_UNC_STS_MASK; + cptra_intr_rcv.soc_ifc_error |= SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_MBOX_ECC_UNC_STS_MASK; } if (sts == 0) { - printf("bad soc_ifc_error_intr sts:%x\n", sts); - printf("%c", 0x1); + VPRINTF(ERROR,"bad soc_ifc_error_intr sts:%x\n", sts); + SEND_STDOUT_CTRL(0x1); + while(1); } } @@ -153,31 +196,50 @@ inline void service_soc_ifc_notif_intr () { /* Write 1 to Clear the pending interrupt */ if (sts & SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_AVAIL_STS_MASK) { *reg = SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_AVAIL_STS_MASK; + cptra_intr_rcv.soc_ifc_notif |= SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_AVAIL_STS_MASK; } if (sts & SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_MBOX_ECC_COR_STS_MASK) { *reg = SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_MBOX_ECC_COR_STS_MASK; + cptra_intr_rcv.soc_ifc_notif |= SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_MBOX_ECC_COR_STS_MASK; } if (sts & SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_DEBUG_LOCKED_STS_MASK) { *reg = SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_DEBUG_LOCKED_STS_MASK; + cptra_intr_rcv.soc_ifc_notif |= SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_DEBUG_LOCKED_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_SCAN_MODE_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_SCAN_MODE_STS_MASK; + cptra_intr_rcv.soc_ifc_notif |= SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_SCAN_MODE_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_SOC_REQ_LOCK_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_SOC_REQ_LOCK_STS_MASK; + cptra_intr_rcv.soc_ifc_notif |= SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_SOC_REQ_LOCK_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_GEN_IN_TOGGLE_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_GEN_IN_TOGGLE_STS_MASK; + cptra_intr_rcv.soc_ifc_notif |= SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_GEN_IN_TOGGLE_STS_MASK; } if (sts == 0) { - printf("bad soc_ifc_notif_intr sts:%x\n", sts); - printf("%c", 0x1); + VPRINTF(ERROR,"bad soc_ifc_notif_intr sts:%x\n", sts); + SEND_STDOUT_CTRL(0x1); + while(1); } } -inline void service_sha512_acc_error_intr() {printf("ERROR");} +inline void service_sha512_acc_error_intr() {return;} inline void service_sha512_acc_notif_intr() { uint32_t * reg = (uint32_t *) (CLP_SHA512_ACC_CSR_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R); uint32_t sts = *reg; /* Write 1 to Clear the pending interrupt */ if (sts & SHA512_ACC_CSR_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK) { *reg = SHA512_ACC_CSR_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + cptra_intr_rcv.sha512_acc_notif |= SHA512_ACC_CSR_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; } if (sts == 0) { - printf("bad sha512_acc_notif_intr sts:%x\n", sts); - printf("%c", 0x1); + VPRINTF(ERROR,"bad sha512_acc_notif_intr sts:%x\n", sts); + SEND_STDOUT_CTRL(0x1); + while(1); } } + #endif //CALIPTRA_ISR_H diff --git a/src/integration/test_suites/iccm_lock/dccm.hex b/src/integration/test_suites/iccm_lock/dccm.hex new file mode 100755 index 000000000..5b07d11c4 --- /dev/null +++ b/src/integration/test_suites/iccm_lock/dccm.hex @@ -0,0 +1,3608 @@ +@00011F44 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 C0 0D 00 00 +CE 0C 00 00 0C 19 00 00 DC 0B 00 00 CA 17 00 00 +EA 0A 00 00 88 16 00 00 F8 09 00 00 06 09 00 00 +14 08 00 00 46 15 00 00 22 07 00 00 04 14 00 00 +34 0E 00 00 34 0E 00 00 34 0E 00 00 34 0E 00 00 +34 0E 00 00 34 0E 00 00 DE 11 00 00 DE 0F 00 00 +30 06 00 00 9C 0E 00 00 34 0E 00 00 34 0E 00 00 +34 0E 00 00 34 0E 00 00 34 0E 00 00 34 0E 00 00 +34 0E 00 00 34 0E 00 00 34 0E 00 00 +@00012080 +41 11 06 C6 22 C4 26 C2 F3 27 20 34 37 07 00 F0 +B7 04 01 50 F9 8F 83 A6 C4 07 63 8B E7 02 37 24 +01 50 13 04 44 F4 83 47 14 00 81 CB C9 E2 05 45 +97 20 00 C0 E7 80 A0 37 01 A0 89 47 63 E2 D7 08 +5C 40 B2 40 92 44 85 07 5C C0 22 44 41 01 82 80 +89 47 63 E3 D7 04 37 27 01 50 83 27 C7 E7 37 24 +01 50 13 04 44 F4 03 46 04 00 85 07 23 2E F7 E6 +09 CE 83 47 14 00 23 00 04 00 BD C3 CD E6 05 45 +97 20 00 C0 E7 80 A0 32 01 A0 B5 E6 05 45 97 20 +00 C0 E7 80 C0 31 01 A0 37 15 01 50 13 05 05 82 +97 20 00 C0 E7 80 20 33 83 A6 C4 07 6D B7 37 15 +01 50 13 05 C5 88 97 20 00 C0 E7 80 C0 31 85 BF +37 15 01 50 13 05 05 92 97 20 00 C0 E7 80 A0 30 +5C 40 B2 40 92 44 85 07 5C C0 22 44 41 01 82 80 +89 47 63 EB D7 04 85 47 A3 00 F4 00 37 07 03 30 +23 22 F7 62 01 A0 F3 25 20 34 37 15 01 50 13 05 +05 83 97 20 00 C0 E7 80 80 2F 83 A7 C4 07 BD DF +F3 25 10 34 37 15 01 50 13 05 85 87 97 20 00 C0 +E7 80 E0 2D A5 B7 37 15 01 50 13 05 C5 88 97 20 +00 C0 E7 80 40 2A A1 B7 37 15 01 50 13 05 85 8D +97 20 00 C0 E7 80 20 29 79 BF 00 00 +@000121CC +41 11 06 C6 22 C4 F3 27 20 34 37 07 00 F0 37 04 +01 50 F9 8F 83 26 C4 07 63 84 E7 02 89 47 63 E6 +D7 00 B2 40 22 44 41 01 82 80 22 44 B2 40 37 15 +01 50 13 05 C5 9B 41 01 17 23 00 C0 67 00 A3 39 +89 47 63 E6 D7 04 37 26 01 50 03 27 C6 E7 B7 27 +01 50 93 87 47 F4 83 C5 07 00 05 07 23 2E E6 E6 +85 C1 03 C7 17 00 23 80 07 00 0D CF 89 47 63 ED +D7 04 13 05 F0 0F 97 20 00 C0 E7 80 40 33 01 A0 +8D EA 05 45 97 20 00 C0 E7 80 60 32 01 A0 37 15 +01 50 13 05 05 82 97 20 00 C0 E7 80 C0 33 83 26 +C4 07 55 B7 9D EA 05 45 97 20 00 C0 E7 80 20 30 +01 A0 F3 25 20 34 37 15 01 50 13 05 05 83 97 20 +00 C0 E7 80 C0 33 75 BF 37 15 01 50 13 05 45 94 +97 20 00 C0 E7 80 20 30 69 BF 37 15 01 50 13 05 +85 98 97 20 00 C0 E7 80 00 2F 75 BF 00 00 00 00 +@000122BC +41 11 06 C6 C9 AF 01 00 01 00 01 00 01 00 01 00 +01 00 01 00 01 00 01 00 01 00 01 00 01 00 01 00 +01 00 01 00 01 00 01 00 01 00 01 00 01 00 01 00 +01 00 01 00 01 00 01 00 01 00 01 00 01 00 01 00 +01 00 01 00 01 00 01 00 01 00 01 00 01 00 01 00 +01 00 01 00 01 00 01 00 01 00 01 00 01 00 01 00 +01 00 01 00 01 00 01 00 01 00 01 00 01 00 01 00 +01 00 01 00 01 00 01 00 01 00 01 00 01 00 01 00 +01 00 01 00 01 00 01 00 01 00 01 00 01 00 01 00 +01 00 01 00 01 00 01 00 01 00 01 00 01 00 01 00 +01 00 01 00 01 00 01 00 01 00 01 00 01 00 01 00 +01 00 01 00 01 00 01 00 01 00 01 00 01 00 01 00 +01 00 01 00 01 00 01 00 01 00 01 00 01 00 01 00 +01 00 01 00 01 00 01 00 01 00 01 00 01 00 01 00 +01 00 01 00 01 00 01 00 01 00 01 00 01 00 01 00 +01 00 01 00 01 00 01 00 01 00 01 00 01 00 01 00 +01 00 01 00 01 00 01 00 01 00 01 00 01 00 01 00 +01 00 01 00 01 00 01 00 01 00 01 00 01 00 01 00 +01 00 01 00 01 00 01 00 01 00 01 00 01 00 01 00 +01 00 01 00 01 00 01 00 01 00 01 00 01 00 01 00 +01 00 01 00 01 00 01 00 01 00 01 00 01 00 01 00 +01 00 01 00 01 00 01 00 01 00 01 00 01 00 01 00 +01 00 01 00 01 00 01 00 01 00 01 00 01 00 01 00 +01 00 01 00 01 00 01 00 01 00 01 00 01 00 01 00 +01 00 01 00 01 00 01 00 01 00 01 00 01 00 01 00 +01 00 01 00 01 00 01 00 01 00 01 00 01 00 01 00 +01 00 01 00 01 00 01 00 01 00 01 00 01 00 01 00 +01 00 01 00 01 00 01 00 01 00 01 00 01 00 01 00 +01 00 01 00 01 00 01 00 01 00 01 00 01 00 01 00 +01 00 01 00 01 00 01 00 01 00 01 00 01 00 01 00 +01 00 01 00 01 00 01 00 01 00 01 00 01 00 01 00 +01 00 01 00 01 00 01 00 01 00 01 00 01 00 01 00 +01 00 01 00 01 00 01 00 01 00 01 00 01 00 01 00 +01 00 01 00 01 00 01 00 01 00 01 00 01 00 01 00 +01 00 01 00 01 00 01 00 01 00 01 00 01 00 01 00 +01 00 01 00 01 00 01 00 01 00 01 00 01 00 01 00 +01 00 01 00 01 00 01 00 01 00 01 00 01 00 01 00 +01 00 01 00 01 00 01 00 01 00 01 00 01 00 01 00 +01 00 01 00 01 00 01 00 01 00 01 00 01 00 01 00 +01 00 01 00 01 00 01 00 01 00 01 00 01 00 01 00 +01 00 01 00 01 00 01 00 01 00 01 00 01 00 01 00 +01 00 01 00 01 00 01 00 01 00 01 00 01 00 01 00 +01 00 01 00 01 00 01 00 01 00 01 00 01 00 01 00 +01 00 01 00 01 00 01 00 01 00 01 00 01 00 01 00 +01 00 01 00 01 00 01 00 01 00 01 00 01 00 01 00 +01 00 01 00 01 00 01 00 01 00 01 00 01 00 01 00 +01 00 01 00 01 00 01 00 01 00 01 00 01 00 01 00 +01 00 01 00 01 00 01 00 01 00 01 00 01 00 01 00 +01 00 01 00 01 00 01 00 01 00 01 00 01 00 01 00 +01 00 01 00 01 00 01 00 01 00 01 00 01 00 01 00 +01 00 01 00 01 00 01 00 01 00 01 00 01 00 01 00 +01 00 01 00 01 00 01 00 01 00 01 00 01 00 01 00 +01 00 01 00 01 00 01 00 01 00 01 00 01 00 01 00 +01 00 01 00 01 00 01 00 01 00 01 00 01 00 01 00 +01 00 01 00 01 00 01 00 01 00 01 00 01 00 01 00 +01 00 01 00 01 00 01 00 01 00 01 00 01 00 01 00 +01 00 01 00 01 00 01 00 01 00 01 00 01 00 01 00 +01 00 01 00 01 00 01 00 01 00 01 00 01 00 01 00 +01 00 01 00 01 00 01 00 01 00 01 00 01 00 01 00 +01 00 01 00 01 00 01 00 01 00 01 00 01 00 01 00 +01 00 01 00 01 00 01 00 01 00 01 00 01 00 01 00 +01 00 01 00 01 00 01 00 01 00 01 00 01 00 01 00 +01 00 01 00 01 00 01 00 01 00 01 00 01 00 01 00 +01 00 01 00 01 00 01 00 01 00 01 00 01 00 01 00 +01 00 01 00 01 00 01 00 01 00 01 00 01 00 01 00 +01 00 01 00 01 00 01 00 01 00 01 00 01 00 01 00 +01 00 01 00 01 00 01 00 01 00 01 00 01 00 01 00 +01 00 01 00 01 00 01 00 01 00 01 00 01 00 01 00 +01 00 01 00 01 00 01 00 01 00 01 00 01 00 01 00 +01 00 01 00 01 00 01 00 01 00 01 00 01 00 01 00 +01 00 01 00 01 00 01 00 01 00 01 00 01 00 01 00 +01 00 01 00 01 00 01 00 01 00 01 00 01 00 01 00 +01 00 01 00 01 00 01 00 01 00 01 00 01 00 01 00 +01 00 01 00 01 00 01 00 01 00 01 00 01 00 01 00 +01 00 01 00 01 00 01 00 01 00 01 00 01 00 01 00 +01 00 01 00 01 00 01 00 01 00 01 00 01 00 01 00 +01 00 01 00 01 00 01 00 01 00 01 00 01 00 01 00 +01 00 01 00 01 00 01 00 01 00 01 00 01 00 01 00 +01 00 01 00 01 00 01 00 01 00 01 00 01 00 01 00 +01 00 01 00 01 00 01 00 01 00 01 00 01 00 01 00 +01 00 01 00 01 00 01 00 01 00 01 00 01 00 01 00 +01 00 01 00 01 00 01 00 01 00 01 00 01 00 01 00 +01 00 01 00 01 00 01 00 01 00 01 00 01 00 01 00 +01 00 01 00 01 00 01 00 01 00 01 00 01 00 01 00 +01 00 01 00 01 00 01 00 01 00 01 00 01 00 01 00 +01 00 01 00 01 00 01 00 01 00 01 00 01 00 01 00 +01 00 01 00 01 00 01 00 01 00 01 00 01 00 01 00 +01 00 01 00 01 00 01 00 01 00 01 00 01 00 01 00 +01 00 01 00 01 00 01 00 01 00 01 00 01 00 01 00 +01 00 01 00 01 00 01 00 01 00 01 00 01 00 01 00 +01 00 01 00 01 00 01 00 01 00 01 00 01 00 01 00 +01 00 01 00 01 00 01 00 01 00 01 00 01 00 01 00 +01 00 01 00 01 00 01 00 01 00 01 00 01 00 01 00 +01 00 01 00 01 00 01 00 01 00 01 00 01 00 01 00 +01 00 01 00 01 00 01 00 01 00 01 00 01 00 01 00 +01 00 01 00 01 00 01 00 01 00 01 00 01 00 01 00 +01 00 01 00 01 00 01 00 01 00 01 00 01 00 01 00 +01 00 01 00 01 00 01 00 01 00 01 00 01 00 01 00 +01 00 01 00 01 00 01 00 01 00 01 00 01 00 01 00 +01 00 01 00 01 00 01 00 01 00 01 00 01 00 01 00 +01 00 01 00 01 00 01 00 01 00 01 00 01 00 01 00 +01 00 01 00 01 00 01 00 01 00 01 00 01 00 01 00 +01 00 01 00 01 00 01 00 01 00 01 00 01 00 01 00 +01 00 01 00 01 00 01 00 01 00 01 00 01 00 01 00 +01 00 01 00 01 00 01 00 01 00 01 00 01 00 01 00 +01 00 01 00 01 00 01 00 01 00 01 00 01 00 01 00 +01 00 01 00 01 00 01 00 01 00 01 00 01 00 01 00 +01 00 01 00 01 00 01 00 01 00 01 00 01 00 01 00 +01 00 01 00 01 00 01 00 01 00 01 00 01 00 01 00 +01 00 01 00 01 00 01 00 01 00 01 00 01 00 01 00 +01 00 01 00 01 00 01 00 01 00 01 00 01 00 01 00 +01 00 01 00 01 00 01 00 01 00 01 00 01 00 01 00 +01 00 01 00 01 00 01 00 01 00 01 00 01 00 01 00 +01 00 01 00 01 00 01 00 01 00 01 00 01 00 01 00 +01 00 01 00 01 00 01 00 01 00 01 00 01 00 01 00 +01 00 01 00 01 00 01 00 01 00 01 00 01 00 01 00 +01 00 01 00 01 00 01 00 01 00 01 00 01 00 01 00 +01 00 01 00 01 00 01 00 01 00 01 00 01 00 01 00 +01 00 01 00 01 00 01 00 01 00 01 00 01 00 01 00 +01 00 01 00 01 00 01 00 01 00 01 00 01 00 01 00 +01 00 01 00 01 00 01 00 01 00 01 00 01 00 01 00 +01 00 01 00 01 00 01 00 01 00 01 00 01 00 01 00 +01 00 01 00 01 00 01 00 01 00 01 00 01 00 01 00 +01 00 01 00 01 00 01 00 01 00 01 00 01 00 01 00 +01 00 01 00 01 00 01 00 01 00 01 00 01 00 01 00 +01 00 01 00 01 00 37 15 01 50 13 05 05 9E 97 20 +00 C0 E7 80 40 BF 05 45 97 20 00 C0 E7 80 20 BC +01 A0 00 00 +@00012AB0 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +@00014AB0 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +@00016AB0 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +@00018AB0 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +@0001AAB0 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +@0001CAB0 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +@0001EAB0 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 diff --git a/src/integration/test_suites/iccm_lock/iccm_lock.c b/src/integration/test_suites/iccm_lock/iccm_lock.c index 305c72914..416c449fc 100644 --- a/src/integration/test_suites/iccm_lock/iccm_lock.c +++ b/src/integration/test_suites/iccm_lock/iccm_lock.c @@ -34,9 +34,35 @@ volatile uint32_t intr_count; enum printf_verbosity verbosity_g = LOW; #endif +volatile caliptra_intr_received_s cptra_intr_rcv = { + .doe_error = 0, + .doe_notif = 0, + .ecc_error = 0, + .ecc_notif = 0, + .hmac_error = 0, + .hmac_notif = 0, + .kv_error = 0, + .kv_notif = 0, + .sha512_error = 0, + .sha512_notif = 0, + .sha256_error = 0, + .sha256_notif = 0, + .qspi_error = 0, + .qspi_notif = 0, + .uart_error = 0, + .uart_notif = 0, + .i3c_error = 0, + .i3c_notif = 0, + .soc_ifc_error = 0, + .soc_ifc_notif = 0, + .sha512_acc_error = 0, + .sha512_acc_notif = 0, +}; + extern uintptr_t iccm_code0_start, iccm_code0_end; extern uintptr_t iccm_code1_start, iccm_code1_end; extern uintptr_t iccm_code2_start, iccm_code2_end; +extern uintptr_t STACK; static uint32_t persistent_exec_cnt __attribute__ ((section(".dccm.persistent"))) = 0; // Allocate in .dccm static uint8_t persistent_is_second_pass __attribute__ ((section(".dccm.persistent"))) = 0; // Allocate in .dccm static uint8_t persistent_nmi_expected __attribute__ ((section(".dccm.persistent"))) = 0; // Allocate in .dccm @@ -121,8 +147,33 @@ void main(void) { SEND_STDOUT_CTRL(0x1); } + // Try to unlock ICCM Writes (should fail) + *soc_ifc_iccm_lock = *soc_ifc_iccm_lock & ~SOC_IFC_REG_INTERNAL_ICCM_LOCK_LOCK_MASK; + if (*soc_ifc_iccm_lock & SOC_IFC_REG_INTERNAL_ICCM_LOCK_LOCK_MASK != SOC_IFC_REG_INTERNAL_ICCM_LOCK_LOCK_MASK) { + VPRINTF(ERROR, "ERROR: Attempt to clear ICCM_LOCK via reg write succeeded!\n"); + SEND_STDOUT_CTRL(0x1); + } + + // Check that DCCM can still be written/read + if ((uint32_t)(&STACK) + 4 <= RV_DCCM_EADR) { + uint32_t dccm_test_val = lsu_read_32((uintptr_t)(&STACK)+4); + VPRINTF(LOW, "Test DCCM at addr: 0x%x\n", (uintptr_t)(&STACK)+4); + dccm_test_val ^= 0xAAAAAAAA; + lsu_write_32((uintptr_t)(&STACK)+4, dccm_test_val); + if (lsu_read_32((uintptr_t)(&STACK)+4) != dccm_test_val) { + VPRINTF(ERROR, "ERROR: Rd data (0x%x) after wr to DCCM does not match exp (0x%x)!\n", lsu_read_32((uintptr_t)(&STACK)+4), dccm_test_val); + SEND_STDOUT_CTRL(0x1); + } else { + VPRINTF(LOW, "Rd data (0x%x) after DCCM wr matches exp (0x%x)!\n", lsu_read_32((uintptr_t)(&STACK)+4), dccm_test_val); + } + } else { + VPRINTF(FATAL, "FATAL: Unable to test DCCM access because there is no unused space in DCCM (above STACK)!\n"); + SEND_STDOUT_CTRL(0x1); + } - // Read ICCM here to see if there is any error when its being read while ICCM is being locked and that reads are getting expected data + // Read ICCM here to check that: + // - reads are getting expected data + // - no error occurs when reading while ICCM is locked iccm_dest = ICCM; if (persistent_is_second_pass) { code_word = (uint32_t *) &iccm_code1_start; diff --git a/src/integration/test_suites/iccm_lock/iccm_lock.hex b/src/integration/test_suites/iccm_lock/iccm_lock.hex new file mode 100755 index 000000000..2c5097c3b --- /dev/null +++ b/src/integration/test_suites/iccm_lock/iccm_lock.hex @@ -0,0 +1,2051 @@ +@00000000 +73 10 20 B0 73 10 20 B8 B7 A2 AA AA 93 82 92 0A +73 90 02 7C 91 42 0F 10 00 00 73 90 92 7F 0F 10 +00 00 97 02 00 00 93 82 22 14 73 90 52 30 97 52 +00 00 93 82 A2 FB 17 73 00 00 13 03 E3 E2 97 03 +01 50 93 83 23 FC 03 AE 02 00 23 A0 C3 01 91 02 +91 03 E3 EA 62 FE 97 72 00 00 93 82 E2 E0 17 73 +00 00 13 03 E3 EC 97 23 01 50 93 83 63 E1 03 AE +02 00 23 A0 C3 01 91 02 91 03 E3 EA 62 FE 17 71 +01 50 13 01 21 A3 01 2A B7 02 03 30 93 82 82 0C +13 0F F0 0F 23 80 E2 01 E3 08 00 FE 01 00 01 00 +01 00 01 00 01 00 01 00 01 00 01 00 01 00 01 00 +01 00 01 00 01 00 01 00 01 00 01 00 01 00 01 00 +01 00 01 00 01 00 01 00 01 00 01 00 01 00 01 00 +01 00 01 00 01 00 01 00 01 00 01 00 01 00 01 00 +01 00 01 00 01 00 01 00 01 00 01 00 01 00 01 00 +01 00 01 00 01 00 01 00 01 00 01 00 01 00 01 00 +01 00 01 00 01 00 01 00 01 00 01 00 01 00 01 00 +01 00 01 00 01 00 01 00 01 00 01 00 01 00 01 00 +01 00 01 00 01 00 01 00 01 00 01 00 01 00 01 00 +01 00 01 00 01 00 01 00 01 00 01 00 01 00 01 00 +01 00 01 00 01 00 01 00 01 00 01 00 01 00 01 00 +01 00 01 00 01 00 01 00 01 00 01 00 01 00 01 00 +01 00 01 00 F3 22 20 34 73 23 10 34 F3 23 30 34 +37 0E 03 30 13 0E 8E 0C 97 0E 01 50 93 8E 8E E8 +83 82 0E 00 23 00 5E 00 85 0E E3 9B 02 FE 05 4F +23 00 EE 01 C1 BF 5D 71 A2 C4 37 04 01 50 03 27 +C4 07 86 C6 A6 C2 CA C0 4E DE 52 DC 56 DA 5A D8 +5E D6 62 D4 66 D2 6A D0 6E CE 89 47 63 EE E7 20 +EF 10 F0 08 B7 07 03 30 37 07 00 40 B7 29 01 50 +23 A6 E7 62 B7 2B 01 50 93 89 49 F4 23 AE 0B E6 +23 80 09 00 83 A7 07 62 85 8B 89 CB 83 27 C4 07 +63 9B 07 1E 05 45 EF 20 40 1B 01 A0 03 C7 19 00 +83 27 C4 07 63 05 07 16 09 47 B7 2D 01 50 B7 2C +01 50 63 61 F7 1E B7 17 01 50 3E C6 13 89 CC 1C +93 8A CD 2B 63 7D 59 37 37 0A 00 40 93 84 CC 1C +37 1B 01 50 15 4C 83 27 C4 07 63 6A FC 24 94 40 +93 87 44 00 13 07 4A 00 23 20 DA 00 63 F9 57 01 +94 43 91 07 11 07 23 2E D7 FE E3 EB 57 FF 37 2D +01 50 37 2C 01 50 93 04 0C 08 13 0A CD 1C 83 A7 +CB E7 81 CB 83 27 C4 07 63 9C 07 2E 05 45 EF 20 +C0 12 B7 07 00 40 82 97 03 A7 49 00 85 47 63 F9 +E7 00 83 27 C4 07 63 98 07 28 05 45 EF 20 E0 10 +B7 07 03 30 93 87 07 62 05 47 98 C3 03 C7 19 00 +9C 43 83 27 C4 07 63 01 07 20 09 47 63 6C F7 26 +63 7F 59 2B 83 27 C4 07 B7 04 00 40 B7 1B 01 50 +15 4A 11 09 63 62 FA 18 94 40 03 27 C9 FF 91 04 +63 89 E6 00 63 95 07 1C 05 45 EF 20 00 0C 83 27 +C4 07 E3 60 59 FF 03 27 C4 07 89 47 37 39 01 50 +B7 24 01 50 63 FD E7 00 B2 47 B7 06 00 40 13 06 +09 AB 93 85 C4 2B 13 85 C7 AB EF 20 00 0E 85 47 +23 80 F9 00 13 09 09 AB 93 84 C4 2B 83 27 C4 07 +B7 09 00 40 15 4A 63 F4 24 03 63 6D FA 0E 94 40 +93 87 44 00 13 87 49 00 23 A0 D9 00 63 F9 27 01 +94 43 91 07 11 07 23 2E D7 FE E3 EB 27 FF 83 27 +C4 07 63 9B 07 1A 05 45 EF 20 20 04 01 A0 09 47 +63 60 F7 0A B7 17 01 50 3E C6 37 2D 01 50 37 2C +01 50 93 04 0C 08 13 0A CD 1C 63 FF 44 1F B7 0A +00 40 13 09 0C 08 37 1B 01 50 95 4C 83 27 C4 07 +63 E5 FC 0C 83 26 09 00 93 07 49 00 13 87 4A 00 +23 A0 DA 00 63 F9 47 01 94 43 91 07 11 07 23 2E +D7 FE E3 EB 47 FF B7 2D 01 50 B7 2C 01 50 13 89 +CC 1C 93 8A CD 2B 61 BD 37 15 01 50 13 05 05 A3 +EF 10 30 7F F1 BB 37 15 01 50 13 05 85 A9 EF 10 +50 7E 09 B5 B7 17 01 50 B7 06 00 40 13 86 CD 2B +93 85 CC 1C 13 85 C7 AB 3E C6 EF 10 10 7F 39 B5 +B7 17 01 50 37 2D 01 50 37 2C 01 50 B7 06 00 40 +13 06 CD 1C 93 05 0C 08 13 85 C7 AB 3E C6 EF 10 +D0 7C 81 BF 90 40 A6 85 13 05 8B AE EF 10 F0 7B +98 40 83 27 C4 07 91 04 23 A0 E9 00 93 86 49 00 +E3 F7 24 F1 B6 89 D5 B5 90 40 A6 85 13 05 8B AE +EF 10 B0 79 83 27 C4 07 85 BD 03 26 09 00 CA 85 +13 05 8B AE EF 10 70 78 83 27 09 00 11 09 13 87 +4A 00 23 A0 FA 00 E3 70 49 F5 BA 8A 01 BF 90 40 +A6 85 13 05 8B AE EF 10 50 76 9C 40 91 04 13 07 +4A 00 23 20 FA 00 E3 FC 54 DB 3A 8A 69 B3 13 85 +4B BC EF 10 10 72 0D BD 09 47 63 6C F7 08 63 F0 +44 0D 83 27 C4 07 95 4A 37 09 00 40 B7 1B 01 50 +91 04 63 E4 FA 02 83 26 09 00 03 A7 C4 FF 11 09 +63 88 E6 00 8D E7 05 45 EF 10 30 6C 83 27 C4 07 +E3 F3 44 E1 91 04 E3 F0 FA FE 03 26 09 00 CA 85 +13 05 8B AE EF 10 70 6F 83 27 C4 07 E9 B7 13 85 +0B C3 EF 10 10 6C C1 BF 37 15 01 50 13 05 85 C5 +EF 10 30 6B 89 B5 37 15 01 50 13 05 45 B3 EF 10 +50 6A A5 B3 37 15 01 50 B7 06 00 40 13 86 CD 2B +93 85 CC 1C 13 05 05 B8 EF 10 30 6B E3 6C 59 D7 +5D B3 37 15 01 50 B7 06 00 40 13 06 CD 1C 93 05 +0C 08 13 05 C5 BE EF 10 50 69 E3 EC 44 F5 61 B3 +37 15 01 50 13 05 45 AF EF 10 B0 65 01 B3 37 39 +01 50 B7 24 01 50 61 BB B7 2D 01 50 B7 2C 01 50 +13 89 CC 1C 93 8A CD 2B 37 1B 01 50 C9 B9 37 2D +01 50 37 2C 01 50 37 1B 01 50 93 04 0C 08 13 0A +CD 1C 75 B9 6F 10 00 77 6F 00 D0 07 00 00 00 00 +6F 00 50 07 00 00 00 00 6F 00 D0 06 00 00 00 00 +6F 10 80 66 00 00 00 00 6F 00 D0 05 00 00 00 00 +6F 00 50 05 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 6F 10 00 68 6F 10 40 68 +5D 71 2A DA 13 05 B0 0F 22 DE 36 D4 3E D0 86 C6 +96 C4 9A C2 9E C0 26 DC 2E D8 32 D6 3A D2 42 CE +46 CC 4A CA 4E C8 72 C6 76 C4 7A C2 7E C0 37 04 +01 50 EF 10 90 54 83 26 C4 07 8D 47 63 E9 D7 08 +F3 27 B0 BC F3 29 C0 BC 73 29 10 34 F3 24 00 30 +73 24 40 30 73 90 C7 BC A1 47 73 A0 07 30 37 27 +01 50 83 27 C7 E7 0D 46 85 07 23 2E F7 E6 63 69 +D6 06 A1 47 73 B0 07 30 73 90 C9 BC 73 10 19 34 +89 67 93 87 07 88 FD 8C 73 A0 04 30 85 67 93 87 +87 88 7D 8C 73 20 44 30 13 05 C0 0F EF 10 F0 4D +72 54 B6 40 A6 42 16 43 86 43 E2 54 52 55 C2 55 +32 56 A2 56 12 57 82 57 72 48 E2 48 52 49 C2 49 +32 4E A2 4E 12 4F 82 4F 61 61 73 00 20 30 37 15 +01 50 13 05 C5 C9 EF 10 D0 4C 83 26 C4 07 8D B7 +83 25 C7 E7 37 15 01 50 13 05 05 CB EF 10 F0 4D +49 B7 5D 71 2A DA 13 05 B0 0F 22 DE 36 D4 3E D0 +86 C6 96 C4 9A C2 9E C0 26 DC 2E D8 32 D6 3A D2 +42 CE 46 CC 4A CA 4E C8 72 C6 76 C4 7A C2 7E C0 +37 04 01 50 EF 10 70 45 83 26 C4 07 8D 47 63 E9 +D7 08 F3 27 B0 BC F3 29 C0 BC 73 29 10 34 F3 24 +00 30 73 24 40 30 73 90 C7 BC A1 47 73 A0 07 30 +37 27 01 50 83 27 C7 E7 0D 46 85 07 23 2E F7 E6 +63 69 D6 06 A1 47 73 B0 07 30 73 90 C9 BC 73 10 +19 34 89 67 93 87 07 88 FD 8C 73 A0 04 30 85 67 +93 87 87 88 7D 8C 73 20 44 30 13 05 C0 0F EF 10 +D0 3E 72 54 B6 40 A6 42 16 43 86 43 E2 54 52 55 +C2 55 32 56 A2 56 12 57 82 57 72 48 E2 48 52 49 +C2 49 32 4E A2 4E 12 4F 82 4F 61 61 73 00 20 30 +37 15 01 50 13 05 C5 CC EF 10 B0 3D 83 26 C4 07 +8D B7 83 25 C7 E7 37 15 01 50 13 05 C5 CD EF 10 +D0 3E 49 B7 5D 71 2A DA 13 05 B0 0F 22 DE 36 D4 +3E D0 86 C6 96 C4 9A C2 9E C0 26 DC 2E D8 32 D6 +3A D2 42 CE 46 CC 4A CA 4E C8 72 C6 76 C4 7A C2 +7E C0 37 04 01 50 EF 10 50 36 83 26 C4 07 8D 47 +63 E9 D7 08 F3 27 B0 BC F3 29 C0 BC 73 29 10 34 +F3 24 00 30 73 24 40 30 73 90 C7 BC A1 47 73 A0 +07 30 37 27 01 50 83 27 C7 E7 0D 46 85 07 23 2E +F7 E6 63 69 D6 06 A1 47 73 B0 07 30 73 90 C9 BC +73 10 19 34 89 67 93 87 07 88 FD 8C 73 A0 04 30 +85 67 93 87 87 88 7D 8C 73 20 44 30 13 05 C0 0F +EF 10 B0 2F 72 54 B6 40 A6 42 16 43 86 43 E2 54 +52 55 C2 55 32 56 A2 56 12 57 82 57 72 48 E2 48 +52 49 C2 49 32 4E A2 4E 12 4F 82 4F 61 61 73 00 +20 30 37 15 01 50 13 05 45 CF EF 10 90 2E 83 26 +C4 07 8D B7 83 25 C7 E7 37 15 01 50 13 05 45 D0 +EF 10 B0 2F 49 B7 5D 71 2A DA 13 05 B0 0F 22 DE +36 D4 3E D0 86 C6 96 C4 9A C2 9E C0 26 DC 2E D8 +32 D6 3A D2 42 CE 46 CC 4A CA 4E C8 72 C6 76 C4 +7A C2 7E C0 37 04 01 50 EF 10 30 27 83 26 C4 07 +8D 47 63 E9 D7 08 F3 27 B0 BC F3 29 C0 BC 73 29 +10 34 F3 24 00 30 73 24 40 30 73 90 C7 BC A1 47 +73 A0 07 30 37 27 01 50 83 27 C7 E7 0D 46 85 07 +23 2E F7 E6 63 69 D6 06 A1 47 73 B0 07 30 73 90 +C9 BC 73 10 19 34 89 67 93 87 07 88 FD 8C 73 A0 +04 30 85 67 93 87 87 88 7D 8C 73 20 44 30 13 05 +C0 0F EF 10 90 20 72 54 B6 40 A6 42 16 43 86 43 +E2 54 52 55 C2 55 32 56 A2 56 12 57 82 57 72 48 +E2 48 52 49 C2 49 32 4E A2 4E 12 4F 82 4F 61 61 +73 00 20 30 37 15 01 50 13 05 C5 D1 EF 10 70 1F +83 26 C4 07 8D B7 83 25 C7 E7 37 15 01 50 13 05 +85 D2 EF 10 90 20 49 B7 5D 71 2A DA 13 05 B0 0F +22 DE 36 D4 3E D0 86 C6 96 C4 9A C2 9E C0 26 DC +2E D8 32 D6 3A D2 42 CE 46 CC 4A CA 4E C8 72 C6 +76 C4 7A C2 7E C0 37 04 01 50 EF 10 10 18 83 26 +C4 07 8D 47 63 E9 D7 08 F3 27 B0 BC F3 29 C0 BC +73 29 10 34 F3 24 00 30 73 24 40 30 73 90 C7 BC +A1 47 73 A0 07 30 37 27 01 50 83 27 C7 E7 0D 46 +85 07 23 2E F7 E6 63 69 D6 06 A1 47 73 B0 07 30 +73 90 C9 BC 73 10 19 34 89 67 93 87 07 88 FD 8C +73 A0 04 30 85 67 93 87 87 88 7D 8C 73 20 44 30 +13 05 C0 0F EF 10 70 11 72 54 B6 40 A6 42 16 43 +86 43 E2 54 52 55 C2 55 32 56 A2 56 12 57 82 57 +72 48 E2 48 52 49 C2 49 32 4E A2 4E 12 4F 82 4F +61 61 73 00 20 30 37 15 01 50 13 05 C5 D3 EF 10 +50 10 83 26 C4 07 8D B7 83 25 C7 E7 37 15 01 50 +13 05 85 D4 EF 10 70 11 49 B7 5D 71 2A DA 13 05 +B0 0F 22 DE 36 D4 3E D0 86 C6 96 C4 9A C2 9E C0 +26 DC 2E D8 32 D6 3A D2 42 CE 46 CC 4A CA 4E C8 +72 C6 76 C4 7A C2 7E C0 37 04 01 50 EF 10 F0 08 +83 26 C4 07 8D 47 63 E9 D7 08 F3 27 B0 BC F3 29 +C0 BC 73 29 10 34 F3 24 00 30 73 24 40 30 73 90 +C7 BC A1 47 73 A0 07 30 37 27 01 50 83 27 C7 E7 +0D 46 85 07 23 2E F7 E6 63 69 D6 06 A1 47 73 B0 +07 30 73 90 C9 BC 73 10 19 34 89 67 93 87 07 88 +FD 8C 73 A0 04 30 85 67 93 87 87 88 7D 8C 73 20 +44 30 13 05 C0 0F EF 10 50 02 72 54 B6 40 A6 42 +16 43 86 43 E2 54 52 55 C2 55 32 56 A2 56 12 57 +82 57 72 48 E2 48 52 49 C2 49 32 4E A2 4E 12 4F +82 4F 61 61 73 00 20 30 37 15 01 50 13 05 C5 D5 +EF 10 30 01 83 26 C4 07 8D B7 83 25 C7 E7 37 15 +01 50 13 05 C5 D6 EF 10 50 02 49 B7 5D 71 2A DA +13 05 B0 0F 22 DE 36 D4 3E D0 86 C6 96 C4 9A C2 +9E C0 26 DC 2E D8 32 D6 3A D2 42 CE 46 CC 4A CA +4E C8 72 C6 76 C4 7A C2 7E C0 37 04 01 50 EF 10 +C0 79 83 26 C4 07 8D 47 63 E9 D7 08 F3 27 B0 BC +F3 29 C0 BC 73 29 10 34 F3 24 00 30 73 24 40 30 +73 90 C7 BC A1 47 73 A0 07 30 37 27 01 50 83 27 +C7 E7 0D 46 85 07 23 2E F7 E6 63 69 D6 06 A1 47 +73 B0 07 30 73 90 C9 BC 73 10 19 34 89 67 93 87 +07 88 FD 8C 73 A0 04 30 85 67 93 87 87 88 7D 8C +73 20 44 30 13 05 C0 0F EF 10 20 73 72 54 B6 40 +A6 42 16 43 86 43 E2 54 52 55 C2 55 32 56 A2 56 +12 57 82 57 72 48 E2 48 52 49 C2 49 32 4E A2 4E +12 4F 82 4F 61 61 73 00 20 30 37 15 01 50 13 05 +05 D8 EF 10 00 72 83 26 C4 07 8D B7 83 25 C7 E7 +37 15 01 50 13 05 05 D9 EF 10 20 73 49 B7 5D 71 +2A DA 13 05 B0 0F 22 DE 36 D4 3E D0 86 C6 96 C4 +9A C2 9E C0 26 DC 2E D8 32 D6 3A D2 42 CE 46 CC +4A CA 4E C8 72 C6 76 C4 7A C2 7E C0 37 04 01 50 +EF 10 A0 6A 83 26 C4 07 8D 47 63 E9 D7 08 F3 27 +B0 BC F3 29 C0 BC 73 29 10 34 F3 24 00 30 73 24 +40 30 73 90 C7 BC A1 47 73 A0 07 30 37 27 01 50 +83 27 C7 E7 0D 46 85 07 23 2E F7 E6 63 69 D6 06 +A1 47 73 B0 07 30 73 90 C9 BC 73 10 19 34 89 67 +93 87 07 88 FD 8C 73 A0 04 30 85 67 93 87 87 88 +7D 8C 73 20 44 30 13 05 C0 0F EF 10 00 64 72 54 +B6 40 A6 42 16 43 86 43 E2 54 52 55 C2 55 32 56 +A2 56 12 57 82 57 72 48 E2 48 52 49 C2 49 32 4E +A2 4E 12 4F 82 4F 61 61 73 00 20 30 37 15 01 50 +13 05 45 DA EF 10 E0 62 83 26 C4 07 8D B7 83 25 +C7 E7 37 15 01 50 13 05 45 DB EF 10 00 64 49 B7 +39 71 2A D6 13 05 B0 0F 3A CE 3E CC 06 DE 16 DC +1A DA 1E D8 2E D4 32 D2 36 D0 42 CA 46 C8 72 C6 +76 C4 7A C2 7E C0 EF 10 40 5C B7 07 01 50 03 A7 +C7 07 8D 47 63 E9 E7 02 13 05 C0 0F EF 10 E0 5A +F2 50 E2 52 52 53 C2 53 32 55 A2 55 12 56 82 56 +72 47 E2 47 52 48 C2 48 32 4E A2 4E 12 4F 82 4F +21 61 73 00 20 30 37 15 01 50 13 05 85 DC EF 10 +40 5A D9 B7 39 71 3E CC B7 07 01 50 3A CE 03 A7 +C7 07 06 DE 16 DC 1A DA 1E D8 2A D6 2E D4 32 D2 +36 D0 42 CA 46 C8 72 C6 76 C4 7A C2 7E C0 91 47 +63 E5 E7 02 F2 50 E2 52 52 53 C2 53 32 55 A2 55 +12 56 82 56 72 47 E2 47 52 48 C2 48 32 4E A2 4E +12 4F 82 4F 21 61 73 00 20 30 F3 25 20 34 37 15 +01 50 13 05 05 DD EF 10 40 56 E9 B7 1D 71 AA C2 +13 05 B0 0F A2 C6 36 DC 3E D8 86 CE 96 CC 9A CA +9E C8 A6 C4 AE C0 32 DE 3A DA 42 D6 46 D4 4A D2 +4E D0 52 CE 72 CC 76 CA 7A C8 7E C6 37 04 01 50 +EF 10 A0 4D 83 26 C4 07 8D 47 63 EE D7 0C F3 27 +B0 BC 73 2A C0 BC F3 29 10 34 73 29 00 30 F3 24 +40 30 73 90 C7 BC A1 47 73 A0 07 30 37 27 01 50 +83 27 C7 E7 0D 46 85 07 23 2E F7 E6 63 6C D6 08 +37 27 02 30 83 27 87 81 93 F6 17 00 A5 CE B7 27 +01 50 93 87 07 E8 F4 4B 05 46 23 2C C7 80 13 E7 +16 00 F8 CB A1 47 73 B0 07 30 73 10 CA BC 73 90 +19 34 89 67 93 87 07 88 33 79 F9 00 73 20 09 30 +85 67 93 87 87 88 FD 8C 73 A0 44 30 13 05 C0 0F +EF 10 A0 44 36 44 F6 40 E6 42 56 43 C6 43 A6 44 +16 45 86 45 72 56 E2 56 52 57 C2 57 32 58 A2 58 +12 59 82 59 72 4A 62 4E D2 4E 42 4F B2 4F 25 61 +73 00 20 30 C5 F3 83 27 C4 07 9D E7 05 45 EF 10 +C0 40 01 A0 83 25 C7 E7 37 15 01 50 13 05 05 DF +EF 10 A0 44 B1 BF 37 15 01 50 13 05 C5 DD EF 10 +40 41 83 26 C4 07 21 BF 37 15 01 50 81 45 13 05 +C5 E0 EF 10 80 42 05 45 EF 10 20 3D D9 B7 1D 71 +AA C2 13 05 B0 0F A2 C6 36 DC 3E D8 86 CE 96 CC +9A CA 9E C8 A6 C4 AE C0 32 DE 3A DA 42 D6 46 D4 +4A D2 4E D0 52 CE 72 CC 76 CA 7A C8 7E C6 37 04 +01 50 EF 10 80 39 83 26 C4 07 8D 47 63 E2 D7 18 +F3 27 B0 BC 73 2A C0 BC F3 29 10 34 73 29 00 30 +F3 24 40 30 73 90 C7 BC A1 47 73 A0 07 30 37 27 +01 50 83 27 C7 E7 0D 46 85 07 23 2E F7 E6 63 60 +D6 14 B7 16 03 30 03 A7 86 81 93 77 17 00 81 CF +B7 27 01 50 05 46 23 AC C6 80 93 87 07 E8 F4 47 +93 E6 16 00 F4 C7 93 77 27 00 91 CF B7 16 03 30 +B7 27 01 50 09 46 23 AC C6 80 93 87 07 E8 F4 47 +93 E6 26 00 F4 C7 93 77 47 00 13 76 87 00 93 76 +07 01 D5 C3 37 17 03 30 B7 27 01 50 91 45 23 2C +B7 80 93 87 07 E8 F8 47 13 67 47 00 F8 C7 4D CE +37 17 03 30 21 46 23 2C C7 80 F8 47 13 67 87 00 +F8 C7 91 CA 37 17 03 30 C1 46 23 2C D7 80 F8 47 +13 67 07 01 F8 C7 A1 47 73 B0 07 30 73 10 CA BC +73 90 19 34 89 67 93 87 07 88 33 79 F9 00 73 20 +09 30 85 67 93 87 87 88 FD 8C 73 A0 44 30 13 05 +C0 0F EF 10 80 29 36 44 F6 40 E6 42 56 43 C6 43 +A6 44 16 45 86 45 72 56 E2 56 52 57 C2 57 32 58 +A2 58 12 59 82 59 72 4A 62 4E D2 4E 42 4F B2 4F +25 61 73 00 20 30 05 C2 37 17 03 30 B7 27 01 50 +21 46 93 87 07 E8 23 2C C7 80 F8 47 13 67 87 00 +F8 C7 AD FA 49 B7 B1 E6 3D FF 83 27 C4 07 A5 E3 +05 45 EF 10 80 23 01 A0 BD D6 37 17 03 30 C1 46 +23 2C D7 80 F8 47 13 67 07 01 F8 C7 A9 BF 83 25 +C7 E7 37 15 01 50 13 05 45 E4 EF 10 00 26 55 BD +37 15 01 50 13 05 05 E3 EF 10 A0 22 83 26 C4 07 +85 BD 37 17 03 30 B7 27 01 50 C1 46 93 87 07 E8 +23 2C D7 80 F8 47 13 67 07 01 F8 C7 29 BF 37 15 +01 50 81 45 13 05 C5 E5 EF 10 20 22 51 BF 1D 71 +AA C2 13 05 B0 0F A2 C6 36 DC 3E D8 86 CE 96 CC +9A CA 9E C8 A6 C4 AE C0 32 DE 3A DA 42 D6 46 D4 +4A D2 4E D0 52 CE 72 CC 76 CA 7A C8 7E C6 37 04 +01 50 EF 10 80 19 83 26 C4 07 8D 47 63 E4 D7 1A +F3 27 B0 BC 73 2A C0 BC F3 29 10 34 73 29 00 30 +F3 24 40 30 73 90 C7 BC A1 47 73 A0 07 30 37 27 +01 50 83 27 C7 E7 0D 46 85 07 23 2E F7 E6 63 62 +D6 16 B7 16 03 30 03 A7 46 81 93 77 17 00 81 CF +B7 27 01 50 05 46 23 AA C6 80 93 87 07 E8 B4 47 +93 E6 16 00 B4 C7 93 77 27 00 91 CF B7 16 03 30 +B7 27 01 50 09 46 23 AA C6 80 93 87 07 E8 B4 47 +93 E6 26 00 B4 C7 93 77 47 00 91 CF B7 16 03 30 +B7 27 01 50 11 46 23 AA C6 80 93 87 07 E8 B4 47 +93 E6 46 00 B4 C7 93 77 87 00 13 76 07 01 93 76 +07 02 DD C3 37 17 03 30 B7 27 01 50 A1 45 23 2A +B7 80 93 87 07 E8 B8 47 13 67 87 00 B8 C7 55 CE +37 17 03 30 41 46 23 2A C7 80 B8 47 13 67 07 01 +B8 C7 99 CA 37 17 03 30 93 06 00 02 23 2A D7 80 +B8 47 13 67 07 02 B8 C7 A1 47 73 B0 07 30 73 10 +CA BC 73 90 19 34 89 67 93 87 07 88 33 79 F9 00 +73 20 09 30 85 67 93 87 87 88 FD 8C 73 A0 44 30 +13 05 C0 0F EF 10 60 07 36 44 F6 40 E6 42 56 43 +C6 43 A6 44 16 45 86 45 72 56 E2 56 52 57 C2 57 +32 58 A2 58 12 59 82 59 72 4A 62 4E D2 4E 42 4F +B2 4F 25 61 73 00 20 30 05 C2 37 17 03 30 B7 27 +01 50 41 46 93 87 07 E8 23 2A C7 80 B8 47 13 67 +07 01 B8 C7 A5 FA 49 B7 B9 E6 3D FF 83 27 C4 07 +B5 E3 05 45 EF 10 60 01 01 A0 BD D6 37 17 03 30 +93 06 00 02 23 2A D7 80 B8 47 13 67 07 02 B8 C7 +A1 BF 83 25 C7 E7 37 15 01 50 13 05 05 E9 EF 10 +C0 03 41 BD 37 15 01 50 13 05 C5 E7 EF 10 60 00 +83 26 C4 07 B1 B5 37 17 03 30 B7 27 01 50 93 06 +00 02 93 87 07 E8 23 2A D7 80 B8 47 13 67 07 02 +B8 C7 19 BF 37 15 01 50 81 45 13 05 85 EA EF 00 +D0 7F 41 BF 1D 71 AA C2 13 05 B0 0F A2 C6 36 DC +3E D8 86 CE 96 CC 9A CA 9E C8 A6 C4 AE C0 32 DE +3A DA 42 D6 46 D4 4A D2 4E D0 52 CE 72 CC 76 CA +7A C8 7E C6 37 04 01 50 EF 00 30 77 83 26 C4 07 +8D 47 63 EE D7 0C F3 27 B0 BC 73 2A C0 BC F3 29 +10 34 73 29 00 30 F3 24 40 30 73 90 C7 BC A1 47 +73 A0 07 30 37 27 01 50 83 27 C7 E7 0D 46 85 07 +23 2E F7 E6 63 6C D6 08 37 97 02 10 83 27 87 81 +93 F6 17 00 A5 CE B7 27 01 50 93 87 07 E8 D4 57 +05 46 23 2C C7 80 13 E7 16 00 D8 D7 A1 47 73 B0 +07 30 73 10 CA BC 73 90 19 34 89 67 93 87 07 88 +33 79 F9 00 73 20 09 30 85 67 93 87 87 88 FD 8C +73 A0 44 30 13 05 C0 0F EF 00 30 6E 36 44 F6 40 +E6 42 56 43 C6 43 A6 44 16 45 86 45 72 56 E2 56 +52 57 C2 57 32 58 A2 58 12 59 82 59 72 4A 62 4E +D2 4E 42 4F B2 4F 25 61 73 00 20 30 C5 F3 83 27 +C4 07 9D E7 05 45 EF 00 50 6A 01 A0 83 25 C7 E7 +37 15 01 50 13 05 85 ED EF 00 30 6E B1 BF 37 15 +01 50 13 05 85 EC EF 00 D0 6A 83 26 C4 07 21 BF +37 15 01 50 81 45 13 05 05 EF EF 00 10 6C 05 45 +EF 00 B0 66 D9 B7 1D 71 AA C2 13 05 B0 0F A2 C6 +36 DC 3E D8 86 CE 96 CC 9A CA 9E C8 A6 C4 AE C0 +32 DE 3A DA 42 D6 46 D4 4A D2 4E D0 52 CE 72 CC +76 CA 7A C8 7E C6 37 04 01 50 EF 00 10 63 83 26 +C4 07 8D 47 63 EE D7 0C F3 27 B0 BC 73 2A C0 BC +F3 29 10 34 73 29 00 30 F3 24 40 30 73 90 C7 BC +A1 47 73 A0 07 30 37 27 01 50 83 27 C7 E7 0D 46 +85 07 23 2E F7 E6 63 6C D6 08 37 17 02 10 83 27 +87 81 93 F6 17 00 A5 CE B7 27 01 50 93 87 07 E8 +D4 53 05 46 23 2C C7 80 13 E7 16 00 D8 D3 A1 47 +73 B0 07 30 73 10 CA BC 73 90 19 34 89 67 93 87 +07 88 33 79 F9 00 73 20 09 30 85 67 93 87 87 88 +FD 8C 73 A0 44 30 13 05 C0 0F EF 00 10 5A 36 44 +F6 40 E6 42 56 43 C6 43 A6 44 16 45 86 45 72 56 +E2 56 52 57 C2 57 32 58 A2 58 12 59 82 59 72 4A +62 4E D2 4E 42 4F B2 4F 25 61 73 00 20 30 C5 F3 +83 27 C4 07 9D E7 05 45 EF 00 30 56 01 A0 83 25 +C7 E7 37 15 01 50 13 05 05 F2 EF 00 10 5A B1 BF +37 15 01 50 13 05 05 F1 EF 00 B0 56 83 26 C4 07 +21 BF 37 15 01 50 81 45 13 05 85 F3 EF 00 F0 57 +05 45 EF 00 90 52 D9 B7 1D 71 AA C2 13 05 B0 0F +A2 C6 36 DC 3E D8 86 CE 96 CC 9A CA 9E C8 A6 C4 +AE C0 32 DE 3A DA 42 D6 46 D4 4A D2 4E D0 52 CE +72 CC 76 CA 7A C8 7E C6 37 04 01 50 EF 00 F0 4E +83 26 C4 07 8D 47 63 EE D7 0C F3 27 B0 BC 73 2A +C0 BC F3 29 10 34 73 29 00 30 F3 24 40 30 73 90 +C7 BC A1 47 73 A0 07 30 37 27 01 50 83 27 C7 E7 +0D 46 85 07 23 2E F7 E6 63 6C D6 08 37 17 01 10 +83 27 87 81 93 F6 17 00 A5 CE B7 27 01 50 93 87 +07 E8 D4 4B 05 46 23 2C C7 80 13 E7 16 00 D8 CB +A1 47 73 B0 07 30 73 10 CA BC 73 90 19 34 89 67 +93 87 07 88 33 79 F9 00 73 20 09 30 85 67 93 87 +87 88 FD 8C 73 A0 44 30 13 05 C0 0F EF 00 F0 45 +36 44 F6 40 E6 42 56 43 C6 43 A6 44 16 45 86 45 +72 56 E2 56 52 57 C2 57 32 58 A2 58 12 59 82 59 +72 4A 62 4E D2 4E 42 4F B2 4F 25 61 73 00 20 30 +C5 F3 83 27 C4 07 9D E7 05 45 EF 00 10 42 01 A0 +83 25 C7 E7 37 15 01 50 13 05 85 F6 EF 00 F0 45 +B1 BF 37 15 01 50 13 05 85 F5 EF 00 90 42 83 26 +C4 07 21 BF 37 15 01 50 81 45 13 05 C5 F7 EF 00 +D0 43 05 45 EF 00 70 3E D9 B7 1D 71 AA C2 13 05 +B0 0F A2 C6 36 DC 3E D8 86 CE 96 CC 9A CA 9E C8 +A6 C4 AE C0 32 DE 3A DA 42 D6 46 D4 4A D2 4E D0 +52 CE 72 CC 76 CA 7A C8 7E C6 37 04 01 50 EF 00 +D0 3A 83 26 C4 07 8D 47 63 EE D7 0C F3 27 B0 BC +73 2A C0 BC F3 29 10 34 73 29 00 30 F3 24 40 30 +73 90 C7 BC A1 47 73 A0 07 30 37 27 01 50 83 27 +C7 E7 0D 46 85 07 23 2E F7 E6 63 6C D6 08 37 97 +00 10 83 27 87 81 93 F6 17 00 A5 CE B7 27 01 50 +93 87 07 E8 D4 47 05 46 23 2C C7 80 13 E7 16 00 +D8 C7 A1 47 73 B0 07 30 73 10 CA BC 73 90 19 34 +89 67 93 87 07 88 33 79 F9 00 73 20 09 30 85 67 +93 87 87 88 FD 8C 73 A0 44 30 13 05 C0 0F EF 00 +D0 31 36 44 F6 40 E6 42 56 43 C6 43 A6 44 16 45 +86 45 72 56 E2 56 52 57 C2 57 32 58 A2 58 12 59 +82 59 72 4A 62 4E D2 4E 42 4F B2 4F 25 61 73 00 +20 30 C5 F3 83 27 C4 07 9D E7 05 45 EF 00 F0 2D +01 A0 83 25 C7 E7 37 15 01 50 13 05 85 FA EF 00 +D0 31 B1 BF 37 15 01 50 13 05 85 F9 EF 00 70 2E +83 26 C4 07 21 BF 37 15 01 50 81 45 13 05 C5 FB +EF 00 B0 2F 05 45 EF 00 50 2A D9 B7 1D 71 AA C2 +13 05 B0 0F A2 C6 36 DC 3E D8 86 CE 96 CC 9A CA +9E C8 A6 C4 AE C0 32 DE 3A DA 42 D6 46 D4 4A D2 +4E D0 52 CE 72 CC 76 CA 7A C8 7E C6 37 04 01 50 +EF 00 B0 26 83 26 C4 07 8D 47 63 EE D7 0C F3 27 +B0 BC 73 2A C0 BC F3 29 10 34 73 29 00 30 F3 24 +40 30 73 90 C7 BC A1 47 73 A0 07 30 37 27 01 50 +83 27 C7 E7 0D 46 85 07 23 2E F7 E6 63 6C D6 08 +37 17 00 10 83 27 87 81 93 F6 17 00 A5 CE B7 27 +01 50 93 87 07 E8 D4 43 05 46 23 2C C7 80 13 E7 +16 00 D8 C3 A1 47 73 B0 07 30 73 10 CA BC 73 90 +19 34 89 67 93 87 07 88 33 79 F9 00 73 20 09 30 +85 67 93 87 87 88 FD 8C 73 A0 44 30 13 05 C0 0F +EF 00 B0 1D 36 44 F6 40 E6 42 56 43 C6 43 A6 44 +16 45 86 45 72 56 E2 56 52 57 C2 57 32 58 A2 58 +12 59 82 59 72 4A 62 4E D2 4E 42 4F B2 4F 25 61 +73 00 20 30 C5 F3 83 27 C4 07 9D E7 05 45 EF 00 +D0 19 01 A0 83 25 C7 E7 37 15 01 50 13 05 85 FE +EF 00 B0 1D B1 BF 37 15 01 50 13 05 85 FD EF 00 +50 1A 83 26 C4 07 21 BF 37 15 01 50 81 45 13 05 +C5 FF EF 00 90 1B 05 45 EF 00 30 16 D9 B7 21 47 +73 30 07 30 93 07 40 5B 93 E7 17 00 73 90 57 30 +97 02 01 50 93 82 02 5A 73 90 82 BC B7 37 00 60 +23 A0 07 00 0F 00 F0 0F 73 50 90 BC B7 07 00 60 +D8 C3 0F 00 F0 0F 9D 46 94 C7 0F 00 F0 0F D8 C7 +0F 00 F0 0F 94 CB 0F 00 F0 0F D8 CB 0F 00 F0 0F +94 CF 0F 00 F0 0F D8 CF 0F 00 F0 0F 94 D3 0F 00 +F0 0F D8 D3 0F 00 F0 0F 94 D7 0F 00 F0 0F D8 D7 +0F 00 F0 0F 94 DB 0F 00 F0 0F 91 45 CC DB 0F 00 +F0 0F 0D 46 90 DF 0F 00 F0 0F CC DF 0F 00 F0 0F +B0 C3 0F 00 F0 0F EC C3 0F 00 F0 0F B0 C7 0F 00 +F0 0F F8 C7 0F 00 F0 0F B4 CB 0F 00 F0 0F F8 CB +0F 00 F0 0F B4 CF 0F 00 F0 0F 23 AE 07 04 0F 00 +F0 0F 23 A0 07 06 0F 00 F0 0F 23 A2 07 06 0F 00 +F0 0F 23 A4 07 06 0F 00 F0 0F 23 A6 07 06 0F 00 +F0 0F 23 A8 07 06 0F 00 F0 0F 23 AA 07 06 0F 00 +F0 0F 23 AC 07 06 0F 00 F0 0F 23 AE 07 06 0F 00 +F0 0F 73 50 B0 BC 73 50 C0 BC 37 47 00 60 11 07 +85 47 05 68 79 75 93 05 00 02 23 20 07 00 0F 00 +F0 0F B3 06 07 01 23 A0 06 00 0F 00 F0 0F B3 06 +A7 00 13 B6 77 01 90 C2 0F 00 F0 0F 85 07 93 F7 +F7 0F 11 07 E3 9B B7 FC 05 47 B7 16 00 10 23 A4 +E6 80 8D 47 23 A0 F6 80 B7 96 00 10 23 A4 E6 80 +23 A0 F6 80 B7 16 01 10 23 A4 E6 80 23 A0 F6 80 +B7 16 02 10 23 A4 E6 80 23 A0 F6 80 B7 96 02 10 +23 A4 E6 80 23 A0 F6 80 11 46 B7 16 03 30 23 AC +C6 80 23 A4 06 98 13 06 F0 0F 23 A2 C6 80 7D 46 +23 A4 C6 80 23 A0 F6 80 B7 26 02 30 23 A4 E6 80 +23 A0 F6 80 7D 57 B7 07 03 30 23 A4 E7 64 23 A6 +E7 64 B7 07 00 D0 73 90 07 7F 73 90 17 7F 73 90 +27 7F B7 17 00 40 93 87 07 88 73 A0 47 30 A1 47 +73 A0 07 30 82 80 01 00 39 71 3A CE 3E CC 7D 57 +B7 07 03 30 06 DE 16 DC 1A DA 1E D8 2A D6 2E D4 +32 D2 36 D0 42 CA 46 C8 72 C6 76 C4 7A C2 7E C0 +23 A4 E7 64 23 A6 E7 64 B7 07 01 50 03 A7 C7 07 +8D 47 63 E5 E7 02 F2 50 E2 52 52 53 C2 53 32 55 +A2 55 12 56 82 56 72 47 E2 47 52 48 C2 48 32 4E +A2 4E 12 4F 82 4F 21 61 73 00 20 30 37 15 01 50 +13 05 85 01 3D 27 C1 BF 73 50 40 7D 73 00 20 30 +39 71 3E CC B7 07 01 50 3A CE 03 A7 C7 07 06 DE +16 DC 1A DA 1E D8 2A D6 2E D4 32 D2 36 D0 42 CA +46 C8 72 C6 76 C4 7A C2 7E C0 91 47 63 EE E7 02 +B7 07 00 08 FD 17 73 B0 07 7F 73 B0 17 7F 73 B0 +27 7F F2 50 E2 52 52 53 C2 53 32 55 A2 55 12 56 +82 56 72 47 E2 47 52 48 C2 48 32 4E A2 4E 12 4F +82 4F 21 61 73 00 20 30 37 15 01 50 13 05 45 04 +4D 2D 7D BF 5D 71 2A DA 13 05 B0 0F 86 C6 96 C4 +9A C2 9E C0 22 DE 26 DC 2E D8 32 D6 36 D4 3A D2 +3E D0 42 CE 46 CC 72 CA 76 C8 7A C6 7E C4 B1 2D +F3 24 20 34 37 04 01 50 83 27 C4 07 05 47 63 68 +F7 04 63 C2 04 04 F3 27 F0 7F F3 27 10 34 F3 27 +30 34 05 45 1D 2D 13 05 C0 0F 05 2D 72 54 B6 40 +A6 42 16 43 86 43 E2 54 52 55 C2 55 32 56 A2 56 +12 57 82 57 72 48 E2 48 52 4E C2 4E 32 4F A2 4F +61 61 73 00 20 30 B5 E3 05 45 01 25 D9 B7 37 15 +01 50 A6 85 13 05 85 05 89 25 83 27 C4 07 E3 C4 +04 FE F3 25 F0 7F 89 44 63 FE F4 02 37 15 01 50 +13 05 C5 08 1D 25 F3 25 10 34 83 27 C4 07 E3 F8 +F4 F8 37 15 01 50 13 05 85 09 01 2D F3 25 30 34 +83 27 C4 07 E3 FF F4 F6 37 15 01 50 13 05 45 0A +ED 2B 85 BF F3 27 10 34 9D B7 37 15 01 50 FD 55 +13 05 45 07 DD 23 49 BF 00 00 03 47 05 00 63 03 +07 56 39 71 37 0F 01 50 22 DE AA 87 26 DC 4A DA +4E D8 52 D6 56 D4 5A D2 01 45 13 03 50 02 B7 0E +01 50 13 06 00 03 93 03 D0 02 93 02 A0 02 93 0F +00 02 13 0F 4F 08 25 44 63 04 67 02 83 A6 0E 08 +05 05 23 80 E6 00 03 C7 17 00 85 07 75 F7 72 54 +E2 54 52 59 C2 59 32 5A A2 5A 12 5B 21 61 82 80 +03 C8 17 00 E3 05 08 FE 85 07 63 09 68 04 63 1A +C8 2E 03 C7 17 00 85 07 E3 0D C7 FE 63 05 77 02 +63 08 57 02 13 0E 07 FD 93 76 FE 0F 81 48 63 7C +D4 02 13 07 87 FA 13 77 F7 0F E3 E6 EF FA 0A 07 +7A 97 18 43 02 87 03 C7 17 00 85 07 E3 1C 57 FC +03 C7 17 00 91 05 85 07 81 48 E1 BF 03 A7 0E 08 +23 00 67 00 49 B7 A5 44 03 C7 17 00 93 96 28 00 +C6 96 86 06 B3 08 DE 00 13 0E 07 FD 93 76 FE 0F +85 07 E3 F3 D4 FE 75 B7 98 41 91 05 93 56 C7 01 +63 9C 06 14 93 56 87 01 63 94 06 24 93 58 47 01 +63 8D 08 3A 19 48 B7 04 01 50 9D AA 03 AE 05 00 +13 8A 45 00 81 46 6C 00 A9 44 25 4B 33 77 9E 02 +B6 8A 85 06 B3 89 D5 00 72 89 13 07 07 03 A3 8F +E9 FE 33 5E 9E 02 E3 63 2B FF 33 87 55 01 36 8E +B7 04 01 50 63 D9 16 01 03 A9 04 08 05 0E 23 00 +09 01 E3 9B C8 FF 93 05 B1 00 83 48 07 00 03 A8 +04 08 7D 17 23 00 18 01 E3 19 B7 FE 36 95 D2 85 +D9 BD 83 A8 05 00 91 05 83 C6 08 00 E3 85 06 EC +46 87 B7 04 01 50 03 A8 04 08 05 07 23 00 D8 00 +83 46 07 00 ED FA 2A 97 33 05 17 41 6D B5 98 41 +91 05 93 56 E7 01 63 94 06 1C 93 56 B7 01 63 9B +06 2A 93 56 87 01 63 8B 06 2E A5 48 B7 04 01 50 +E1 AA 83 AA 05 00 13 8B 45 00 63 C5 0A 2C 56 8E +B7 04 01 50 81 46 6C 00 29 49 33 67 2E 03 36 8A +85 06 B3 89 D5 00 33 4E 2E 03 13 07 07 03 A3 8F +E9 FE E3 14 0E FE 33 87 45 01 36 8E 63 D9 16 01 +83 A5 04 08 05 0E 23 80 05 01 E3 1B 1E FF 93 05 +B1 00 83 48 07 00 03 A8 04 08 7D 17 23 00 18 01 +E3 19 B7 FE 63 D4 0A 00 93 06 2A 00 36 95 DA 85 +19 BD B7 04 01 50 83 C6 05 00 03 A7 04 08 05 05 +91 05 23 00 D7 00 01 B5 93 F8 F6 0F 25 4E 13 88 +08 03 63 66 DE 20 B7 04 01 50 83 A8 04 08 93 56 +87 01 BD 8A 23 80 08 01 13 0E 00 03 21 48 E1 EE +83 A6 04 08 93 58 47 01 93 F8 F8 00 23 80 C6 01 +25 4E 93 F6 F8 0F 63 77 1E 1D 93 86 76 03 93 F6 +F6 0F 03 AE 04 08 93 58 07 01 93 F8 F8 00 23 00 +DE 00 25 4E 93 F6 F8 0F 63 67 1E 1D 93 86 06 03 +93 F6 F6 0F 03 AE 04 08 93 58 C7 00 93 F8 F8 00 +23 00 DE 00 25 4E 93 F6 F8 0F 63 60 1E 1D 93 86 +06 03 93 F6 F6 0F 03 AE 04 08 93 58 87 00 93 F8 +F8 00 23 00 DE 00 25 4E 93 F6 F8 0F 63 6A 1E 19 +93 86 06 03 93 F6 F6 0F 03 AE 04 08 93 58 47 00 +93 F8 F8 00 23 00 DE 00 25 4E 93 F6 F8 0F 63 6F +1E 15 93 86 06 03 93 F6 F6 0F 83 A8 04 08 23 80 +D8 00 93 78 F7 00 25 4E 93 86 08 03 63 54 1E 01 +93 86 78 03 03 A7 04 08 42 95 23 00 D7 00 21 B3 +1D 48 B7 04 01 50 13 8E 76 03 A5 48 13 F9 F6 0F +13 7E FE 0F E3 EE D8 F0 13 09 09 03 13 7E F9 0F +01 BF 42 87 13 08 00 02 E3 1C 77 D0 2D BB B7 04 +01 50 83 A8 04 08 13 88 06 03 93 56 B7 01 23 80 +08 01 9D 8A AD 48 03 AE 04 08 13 88 06 03 93 56 +87 01 23 00 0E 01 9D 8A 03 AE 04 08 93 86 06 03 +13 F8 F6 0F 93 56 57 01 23 00 0E 01 9D 8A 03 AE +04 08 93 86 06 03 13 F8 F6 0F 93 56 27 01 23 00 +0E 01 9D 8A 03 AE 04 08 93 86 06 03 13 F8 F6 0F +93 56 F7 00 23 00 0E 01 9D 8A 03 AE 04 08 93 86 +06 03 13 F8 F6 0F 93 56 C7 00 23 00 0E 01 9D 8A +03 AE 04 08 93 86 06 03 13 F8 F6 0F 93 56 97 00 +23 00 0E 01 9D 8A 03 AE 04 08 93 86 06 03 13 F8 +F6 0F 93 56 67 00 23 00 0E 01 9D 8A 03 AE 04 08 +93 86 06 03 13 F8 F6 0F 93 56 37 00 23 00 0E 01 +9D 8A 03 A8 04 08 93 86 06 03 93 F6 F6 0F 23 00 +D8 00 1D 8B 83 A6 04 08 13 07 07 03 46 95 23 80 +E6 00 D5 BE 93 86 06 03 93 F6 F6 0F 1D BD 13 88 +78 03 D5 BB A9 48 B7 04 01 50 31 BF 93 86 76 03 +93 F6 F6 0F 5D B5 93 86 76 03 93 F6 F6 0F 1D BD +93 86 76 03 93 F6 F6 0F 85 BD 93 86 76 03 93 F6 +F6 0F 91 B5 B7 04 01 50 03 A7 04 08 93 06 D0 02 +33 0E 50 41 23 00 D7 00 FD 18 2D B3 93 56 57 01 +89 CE A1 48 B7 04 01 50 DD BD 93 58 07 01 63 8D +08 00 15 48 B7 04 01 50 E9 BB 93 56 27 01 89 CE +9D 48 B7 04 01 50 FD B5 93 58 C7 00 63 8D 08 00 +11 48 B7 04 01 50 F9 BB 93 56 F7 00 89 CE 99 48 +B7 04 01 50 DD B5 93 58 87 00 63 8D 08 00 0D 48 +B7 04 01 50 CD B3 93 56 C7 00 89 CE 95 48 B7 04 +01 50 F9 BD 93 58 47 00 63 82 08 04 09 48 B7 04 +01 50 DD B3 93 56 97 00 89 C6 91 48 B7 04 01 50 +D9 BD 93 56 67 00 89 C6 8D 48 B7 04 01 50 F9 BD +93 56 37 00 89 C6 89 48 B7 04 01 50 DD B5 1D 8B +E3 0B 07 AE 85 48 B7 04 01 50 ED B5 05 48 B7 04 +01 50 C1 B3 01 45 82 80 39 71 13 03 41 02 2E D2 +9A 85 06 CE 32 D4 36 D6 3A D8 3E DA 42 DC 46 DE +1A C6 A5 3C F2 40 21 61 82 80 B7 07 01 50 83 A7 +07 08 13 77 F5 0F 3A 85 23 80 E7 00 82 80 B7 07 +01 50 83 A7 07 08 13 77 F5 0F 3A 85 23 80 E7 00 +82 80 83 47 05 00 B7 06 01 50 89 CB 03 A7 06 08 +05 05 23 00 F7 00 83 47 05 00 ED FB 83 A7 06 08 +29 47 05 45 23 80 E7 00 82 80 39 71 13 03 41 02 +2E D2 9A 85 06 CE 32 D4 36 D6 3A D8 3E DA 42 DC +46 DE 1A C6 19 34 F2 40 21 61 82 80 F3 25 00 B8 +73 25 00 B0 F3 27 00 B8 E3 9A F5 FE 82 80 01 11 +4E C6 B7 09 01 50 83 A6 C9 07 22 CC 26 CA 4A C8 +06 CE 52 C4 89 47 2A 84 2E 89 B2 84 63 E2 D7 08 +10 40 B7 07 00 10 13 87 47 00 90 C3 50 40 D0 C3 +1C 44 5C C3 5C 44 1C C7 B7 07 00 10 05 47 98 CB +37 04 00 10 5C 48 89 8B F5 DF 0D 4A 63 6D DA 0A +03 26 09 00 B7 07 00 10 13 87 47 00 90 C3 03 26 +49 00 D0 C3 83 27 89 00 5C C3 83 27 C9 00 1C C7 +8A 04 93 F4 C4 07 93 E4 24 00 B7 07 00 10 84 CB +37 07 00 10 5C 4B 89 8B F5 DF 8D 47 63 E1 D7 06 +F2 40 62 44 D2 44 42 49 B2 49 22 4A 05 61 82 80 +37 15 01 50 13 05 05 0B ED 3D 83 A6 C9 07 0D 4A +E3 78 DA F6 37 15 01 50 13 05 C5 0B DD 35 18 40 +B7 07 00 10 83 A6 C9 07 98 C3 50 40 13 87 47 00 +D0 C3 1C 44 5C C3 5C 44 1C C7 E3 7F DA F4 37 15 +01 50 13 05 05 0D 75 3D 83 A6 C9 07 B1 B7 62 44 +F2 40 D2 44 42 49 B2 49 22 4A 37 15 01 50 13 05 +05 17 05 61 79 BD 37 15 01 50 13 05 85 0F 51 3D +83 A6 C9 07 E3 7E DA F2 37 15 01 50 13 05 05 12 +49 35 03 27 09 00 83 A6 C9 07 18 C0 03 27 49 00 +58 C0 03 27 89 00 18 C4 03 27 C9 00 58 C4 E3 79 +DA F2 37 15 01 50 13 05 05 14 A1 3D 83 A6 C9 07 +05 B7 B7 07 01 50 03 A7 C7 07 8D 47 63 E7 E7 00 +B7 07 00 10 0D 47 98 CB 82 80 37 15 01 50 41 11 +13 05 05 1A 06 C6 35 35 B2 40 B7 07 00 10 0D 47 +98 CB 41 01 82 80 37 15 01 50 41 11 13 05 45 1B +06 C6 01 3D 37 27 01 50 13 07 07 E8 1C 47 54 47 +D5 8F 91 EF 73 00 50 10 93 07 40 06 01 00 FD 17 +C2 07 C1 83 E5 FF 1C 47 54 47 D5 8F E5 D7 B2 40 +4C 47 37 15 01 50 13 05 C5 1C 41 01 FD BB 37 15 +01 50 41 11 13 05 85 1F 06 C6 E1 33 B2 40 B7 87 +00 10 11 47 98 CB 41 01 82 80 01 11 4A C8 4E C6 +52 C4 06 CE 22 CC 26 CA 83 C4 06 00 36 89 3A 8A +AA 86 BE 89 37 87 00 10 1C 4F 85 8B F5 DF 83 C7 +06 00 63 8D 07 34 83 C7 16 00 B7 86 00 10 86 07 +93 F7 E7 03 93 E7 17 00 23 24 F7 60 83 A7 C6 60 +89 8B ED DF 81 CC 83 47 19 00 37 87 00 10 86 07 +93 F7 E7 03 93 E7 17 20 23 28 F7 60 DC 41 37 84 +00 10 37 15 01 50 23 20 F4 50 9C 45 13 05 C5 20 +23 22 F4 50 DC 45 23 24 F4 50 9C 49 23 26 F4 50 +DC 49 23 28 F4 50 9C 4D 23 2A F4 50 DC 4D 23 2C +F4 50 9C 51 23 2E F4 50 DC 51 23 20 F4 52 9C 55 +23 22 F4 52 DC 55 23 24 F4 52 9C 59 23 26 F4 52 +5C 42 23 20 F4 48 1C 46 23 22 F4 48 5C 46 23 24 +F4 48 1C 4A 23 26 F4 48 5C 4A 23 28 F4 48 1C 4E +23 2A F4 48 5C 4E 23 2C F4 48 1C 52 23 2E F4 48 +5C 52 23 20 F4 4A 1C 56 23 22 F4 4A 5C 56 23 24 +F4 4A 1C 5A 23 26 F4 4A 6D 39 85 47 37 15 01 50 +1C C8 13 05 45 1B 75 31 37 27 01 50 13 07 07 E8 +14 47 5C 47 D5 8F 91 EF 73 00 50 10 93 07 40 06 +01 00 FD 17 C2 07 C1 83 E5 FF 1C 47 54 47 D5 8F +E5 D7 4C 47 37 15 01 50 13 05 C5 1C 79 39 63 87 +04 16 37 15 01 50 13 05 85 21 A5 31 37 87 00 10 +83 27 47 61 89 8B ED DF 37 15 01 50 13 05 45 2A +89 39 B7 87 00 10 83 A4 07 20 03 24 4A 00 63 9C +84 24 83 A4 47 20 03 24 8A 00 63 98 84 2A 83 A4 +87 20 03 24 CA 00 63 96 84 2E 83 A4 C7 20 03 24 +0A 01 63 9E 84 2C 83 A4 07 21 03 24 4A 01 63 92 +84 2E 83 A4 47 21 03 24 8A 01 63 9A 84 2C 83 A4 +87 21 03 24 CA 01 63 92 84 2C 83 A4 C7 21 03 24 +0A 02 63 9A 84 2A 83 A4 07 22 03 24 4A 02 63 9E +84 28 83 A4 47 22 03 24 8A 02 63 98 84 26 37 89 +00 10 83 24 89 22 03 24 CA 02 63 92 84 26 83 24 +C9 22 03 24 0A 03 AD 45 63 98 84 1C 37 15 01 50 +13 05 05 2F 7D 36 83 24 09 28 03 A4 49 00 63 15 +94 1E 83 24 49 28 03 A4 89 00 63 9C 84 22 83 24 +89 28 03 A4 C9 00 63 98 84 22 83 24 C9 28 03 A4 +09 01 63 94 84 22 83 24 09 29 03 A4 49 01 63 90 +84 22 83 24 49 29 03 A4 89 01 63 9C 84 20 83 24 +89 29 03 A4 C9 01 63 92 84 1E 83 24 C9 29 03 A4 +09 02 63 9E 84 1C B7 87 00 10 83 A4 07 2A 03 A4 +49 02 63 98 84 1C 83 A4 47 2A 03 A4 89 02 63 94 +84 1C 83 A4 87 2A 03 A4 C9 02 63 92 84 1A 83 A4 +C7 2A 03 A4 09 03 AD 45 63 91 84 16 F2 40 62 44 +D2 44 42 49 B2 49 22 4A 05 61 82 80 37 15 01 50 +13 05 C5 22 FD 3C B7 87 00 10 83 A4 07 18 03 24 +49 00 63 92 84 1A 83 A4 47 18 03 24 89 00 63 9C +84 1A 83 A4 87 18 03 24 C9 00 63 98 84 1A 83 A4 +C7 18 03 24 09 01 63 94 84 1A 83 A4 07 19 03 24 +49 01 63 90 84 1A 83 A4 47 19 03 24 89 01 63 9C +84 18 83 A4 87 19 03 24 C9 01 63 98 84 18 83 A4 +C7 19 03 24 09 02 63 94 84 18 83 A4 07 1A 03 24 +49 02 63 90 84 18 83 A4 47 1A 03 24 89 02 63 92 +84 10 83 A4 87 1A 03 24 C9 02 63 9E 84 0E 83 A4 +C7 1A 03 24 09 03 AD 45 E3 88 84 E0 37 15 01 50 +13 05 85 24 EF F0 7F A8 37 15 01 50 A6 85 13 05 +45 27 EF F0 9F A7 37 15 01 50 A2 85 13 05 C5 28 +EF F0 BF A6 05 45 EF F0 5F A1 01 A0 DC 42 23 20 +F7 08 9C 46 23 22 F7 08 DC 46 23 24 F7 08 9C 4A +23 26 F7 08 DC 4A 23 28 F7 08 9C 4E 23 2A F7 08 +DC 4E 23 2C F7 08 9C 52 23 2E F7 08 DC 52 23 20 +F7 0A 9C 56 23 22 F7 0A DC 56 23 24 F7 0A 9C 5A +23 26 F7 0A 41 B1 81 45 37 15 01 50 13 05 05 2C +EF F0 BF A0 37 15 01 50 A6 85 13 05 45 27 EF F0 +DF 9F 37 15 01 50 A2 85 13 05 C5 28 EF F0 FF 9E +05 45 EF F0 9F 99 01 A0 81 45 37 15 01 50 13 05 +C5 30 EF F0 9F 9D 37 15 01 50 A6 85 13 05 45 27 +EF F0 BF 9C 37 15 01 50 A2 85 13 05 C5 28 EF F0 +DF 9B 05 45 EF F0 7F 96 01 A0 85 45 71 BF A9 45 +E9 B7 A5 45 21 BF A9 45 11 BF 99 45 7D BF 9D 45 +6D BF A1 45 5D BF A5 45 4D BF A5 45 B5 BF A9 45 +A5 BF 85 45 5D B7 89 45 4D B7 8D 45 79 BF 91 45 +69 BF 95 45 59 BF 81 45 D5 B5 A1 45 B1 BF 8D 45 +A1 BF 89 45 91 BF 9D 45 81 BF 99 45 B1 B7 95 45 +A1 B7 91 45 91 B7 85 45 D1 B5 89 45 C1 B5 8D 45 +75 BD 91 45 65 BD 95 45 55 BD 99 45 45 BD 9D 45 +75 B5 A1 45 65 B5 01 11 22 CC 26 CA 4A C8 4E C6 +52 C4 56 C2 06 CE AA 84 AE 8A 32 8A B6 89 3A 89 +37 84 00 10 1C 4C 85 8B F5 DF 83 C7 04 00 63 98 +07 2E DC 40 23 20 F4 58 9C 44 23 22 F4 58 DC 44 +23 24 F4 58 9C 48 23 26 F4 58 DC 48 23 28 F4 58 +9C 4C 23 2A F4 58 DC 4C 23 2C F4 58 9C 50 23 2E +F4 58 DC 50 23 20 F4 5A 9C 54 23 22 F4 5A DC 54 +23 24 F4 5A 9C 58 23 26 F4 5A 83 A7 4A 00 37 84 +00 10 37 15 01 50 23 20 F4 10 83 A7 8A 00 13 05 +C5 35 23 22 F4 10 83 A7 CA 00 23 24 F4 10 83 A7 +0A 01 23 26 F4 10 83 A7 4A 01 23 28 F4 10 83 A7 +8A 01 23 2A F4 10 83 A7 CA 01 23 2C F4 10 83 A7 +0A 02 23 2E F4 10 83 A7 4A 02 23 20 F4 12 83 A7 +8A 02 23 22 F4 12 83 A7 CA 02 23 24 F4 12 83 A7 +0A 03 23 26 F4 12 83 27 4A 00 23 20 F4 48 83 27 +8A 00 23 22 F4 48 83 27 CA 00 23 24 F4 48 83 27 +0A 01 23 26 F4 48 83 27 4A 01 23 28 F4 48 83 27 +8A 01 23 2A F4 48 83 27 CA 01 23 2C F4 48 83 27 +0A 02 23 2E F4 48 83 27 4A 02 23 20 F4 4A 83 27 +8A 02 23 22 F4 4A 83 27 CA 02 23 24 F4 4A 83 27 +0A 03 23 26 F4 4A EF F0 CF FC 89 47 37 15 01 50 +1C C8 13 05 45 1B EF F0 CF FB 37 27 01 50 13 07 +07 E8 14 47 5C 47 D5 8F 91 EF 73 00 50 10 93 07 +40 06 01 00 FD 17 C2 07 C1 83 E5 FF 1C 47 54 47 +D5 8F E5 D7 4C 47 37 15 01 50 13 05 C5 1C EF F0 +CF FA 37 15 01 50 13 05 C5 36 EF F0 8F F7 B7 87 +00 10 83 A4 07 30 03 A4 49 00 63 91 84 14 83 A4 +47 30 03 A4 89 00 63 93 84 1C 83 A4 87 30 03 A4 +C9 00 63 91 84 1C 83 A4 C7 30 03 A4 09 01 63 99 +84 1A 83 A4 07 31 03 A4 49 01 63 99 84 1A 83 A4 +47 31 03 A4 89 01 63 91 84 1A 83 A4 87 31 03 A4 +C9 01 63 9B 84 1C 83 A4 C7 31 03 A4 09 02 63 99 +84 18 83 A4 07 32 03 A4 49 02 63 97 84 18 83 A4 +47 32 03 A4 89 02 63 97 84 1A 37 8A 00 10 83 24 +8A 32 03 A4 C9 02 63 9D 84 18 83 24 CA 32 03 A4 +09 03 AD 45 63 9D 84 0A 37 15 01 50 13 05 45 3B +EF F0 2F ED 83 24 0A 38 03 24 49 00 63 9F 84 0E +83 24 4A 38 03 24 89 00 63 9C 84 14 83 24 8A 38 +03 24 C9 00 63 98 84 12 83 24 CA 38 03 24 09 01 +63 92 84 14 83 24 0A 39 03 24 49 01 63 9E 84 12 +83 24 4A 39 03 24 89 01 63 9A 84 12 83 24 8A 39 +03 24 C9 01 63 98 84 10 83 24 CA 39 03 24 09 02 +63 94 84 10 B7 87 00 10 83 A4 07 3A 03 24 49 02 +63 9E 84 0E 83 A4 47 3A 03 24 89 02 63 90 84 0E +83 A4 87 3A 03 24 C9 02 63 9C 84 0C 83 A4 C7 3A +03 24 09 03 AD 45 63 9B 84 06 F2 40 62 44 D2 44 +42 49 B2 49 22 4A 92 4A 05 61 82 80 81 45 37 15 +01 50 13 05 85 38 EF F0 4F E4 37 15 01 50 A6 85 +13 05 45 27 EF F0 6F E3 37 15 01 50 A2 85 13 05 +C5 28 EF F0 8F E2 05 45 EF F0 2F DD 01 A0 37 15 +01 50 13 05 C5 33 EF F0 CF DE 83 C7 14 00 37 87 +00 10 86 07 93 F7 E7 03 93 E7 17 00 23 20 F4 60 +83 27 47 60 89 8B ED DF 0D BB 81 45 37 15 01 50 +13 05 05 3D EF F0 6F DE 37 15 01 50 A6 85 13 05 +45 27 EF F0 8F DD 37 15 01 50 A2 85 13 05 C5 28 +EF F0 AF DC 05 45 EF F0 4F D7 01 A0 85 45 85 BF +8D 45 B5 B7 89 45 A5 B7 95 45 95 B7 91 45 85 B7 +9D 45 B1 BF 89 45 5D BF A1 45 91 BF A5 45 7D B7 +A9 45 6D B7 99 45 5D B7 9D 45 4D B7 A1 45 79 BF +85 45 69 BF 8D 45 59 BF 91 45 49 BF 95 45 79 B7 +A9 45 35 B7 A5 45 25 B7 99 45 15 B7 41 11 22 C4 +26 C2 06 C6 4A C0 2A 88 B6 84 37 84 00 10 1C 4C +85 8B F5 DF 83 27 48 00 37 15 01 50 13 05 C5 3F +23 20 F4 10 83 27 88 00 23 22 F4 10 83 27 C8 00 +23 24 F4 10 83 27 08 01 23 26 F4 10 83 27 48 01 +23 28 F4 10 83 27 88 01 23 2A F4 10 83 27 C8 01 +23 2C F4 10 83 27 08 02 23 2E F4 10 83 27 48 02 +23 20 F4 12 83 27 88 02 23 22 F4 12 83 27 C8 02 +23 24 F4 12 83 27 08 03 23 26 F4 12 DC 41 23 20 +F4 20 9C 45 23 22 F4 20 DC 45 23 24 F4 20 9C 49 +23 26 F4 20 DC 49 23 28 F4 20 9C 4D 23 2A F4 20 +DC 4D 23 2C F4 20 9C 51 23 2E F4 20 DC 51 23 20 +F4 22 9C 55 23 22 F4 22 DC 55 23 24 F4 22 9C 59 +23 26 F4 22 5C 42 23 20 F4 28 1C 46 23 22 F4 28 +5C 46 23 24 F4 28 1C 4A 23 26 F4 28 5C 4A 23 28 +F4 28 1C 4E 23 2A F4 28 5C 4E 23 2C F4 28 1C 52 +23 2E F4 28 5C 52 23 20 F4 2A 1C 56 23 22 F4 2A +5C 56 23 24 F4 2A 1C 5A 23 26 F4 2A DC 40 23 20 +F4 30 9C 44 23 22 F4 30 DC 44 23 24 F4 30 9C 48 +23 26 F4 30 DC 48 23 28 F4 30 9C 4C 23 2A F4 30 +DC 4C 23 2C F4 30 9C 50 23 2E F4 30 DC 50 23 20 +F4 32 9C 54 23 22 F4 32 DC 54 23 24 F4 32 9C 58 +23 26 F4 32 5C 43 23 20 F4 38 1C 47 23 22 F4 38 +5C 47 23 24 F4 38 1C 4B 23 26 F4 38 5C 4B 23 28 +F4 38 1C 4F 23 2A F4 38 5C 4F 23 2C F4 38 1C 53 +23 2E F4 38 5C 53 23 20 F4 3A 1C 57 23 22 F4 3A +5C 57 23 24 F4 3A 1C 5B 23 26 F4 3A EF F0 6F BA +8D 47 37 15 01 50 1C C8 13 05 45 1B EF F0 6F B9 +37 27 01 50 13 07 07 E8 1C 47 54 47 D5 8F 91 EF +73 00 50 10 93 07 40 06 01 00 FD 17 C2 07 C1 83 +E5 FF 1C 47 54 47 D5 8F E5 D7 4C 47 37 15 01 50 +13 05 C5 1C EF F0 6F B8 37 15 01 50 13 05 C5 40 +EF F0 2F B5 B7 87 00 10 03 A9 07 40 C0 40 63 10 +24 09 03 A9 47 40 80 44 63 14 89 0A 03 A9 87 40 +C0 44 63 17 89 0A 03 A9 C7 40 80 48 63 10 24 0B +03 A9 07 41 C0 48 63 19 89 08 03 A9 47 41 80 4C +63 12 89 08 03 A9 87 41 C0 4C 63 1D 89 08 03 A9 +C7 41 80 50 63 16 89 08 03 A9 07 42 C0 50 63 1F +89 06 03 A9 47 42 80 54 63 18 89 06 03 A9 87 42 +C0 54 63 11 89 06 03 A9 C7 42 80 58 AD 45 63 19 +89 00 B2 40 22 44 92 44 02 49 41 01 82 80 81 45 +37 15 01 50 13 05 85 42 EF F0 2F AE 37 15 01 50 +CA 85 13 05 45 27 EF F0 4F AD 37 15 01 50 A2 85 +13 05 C5 28 EF F0 6F AC 05 45 EF F0 0F A7 01 A0 +85 45 F9 B7 95 45 E9 B7 91 45 D9 B7 8D 45 C9 B7 +89 45 7D BF A9 45 6D BF A5 45 5D BF A1 45 4D BF +9D 45 7D B7 99 45 6D B7 01 11 22 CC 4A C8 4E C6 +06 CE 26 CA 52 C4 2A 87 AE 89 32 89 37 84 00 10 +1C 4C 85 8B F5 DF 5C 43 37 15 01 50 13 05 85 45 +23 20 F4 48 1C 47 23 22 F4 48 5C 47 23 24 F4 48 +1C 4B 23 26 F4 48 5C 4B 23 28 F4 48 1C 4F 23 2A +F4 48 5C 4F 23 2C F4 48 1C 53 23 2E F4 48 5C 53 +23 20 F4 4A 1C 57 23 22 F4 4A 5C 57 23 24 F4 4A +1C 5B 23 26 F4 4A EF F0 CF 9F A9 47 37 15 01 50 +1C C8 13 05 45 1B EF F0 CF 9E 37 27 01 50 13 07 +07 E8 1C 47 54 47 D5 8F 91 EF 73 00 50 10 93 07 +40 06 01 00 FD 17 C2 07 C1 83 E5 FF 1C 47 54 47 +D5 8F E5 D7 4C 47 37 15 01 50 13 05 C5 1C EF F0 +CF 9D 37 15 01 50 13 05 C5 36 EF F0 8F 9A B7 87 +00 10 83 A4 07 30 03 A4 49 00 63 90 84 14 83 A4 +47 30 03 A4 89 00 63 9C 84 18 83 A4 87 30 03 A4 +C9 00 63 9E 84 18 83 A4 C7 30 03 A4 09 01 63 96 +84 18 83 A4 07 31 03 A4 49 01 63 9E 84 16 83 A4 +47 31 03 A4 89 01 63 96 84 16 83 A4 87 31 03 A4 +C9 01 63 9A 84 18 83 A4 C7 31 03 A4 09 02 63 92 +84 18 83 A4 07 32 03 A4 49 02 63 9A 84 16 83 A4 +47 32 03 A4 89 02 63 96 84 14 37 8A 00 10 83 24 +8A 32 03 A4 C9 02 63 9A 84 16 83 24 CA 32 03 A4 +09 03 AD 45 63 9C 84 0A 37 15 01 50 13 05 45 3B +EF F0 2F 90 83 24 0A 38 03 24 49 00 63 98 84 0C +83 24 4A 38 03 24 89 00 63 17 94 10 83 24 8A 38 +03 24 C9 00 63 99 84 12 83 24 CA 38 03 24 09 01 +63 91 84 12 83 24 0A 39 03 24 49 01 63 97 84 10 +83 24 4A 39 03 24 89 01 63 93 84 10 83 24 8A 39 +03 24 C9 01 63 9F 84 0C 83 24 CA 39 03 24 09 02 +63 9B 84 0C B7 87 00 10 83 A4 07 3A 03 24 49 02 +63 95 84 0C 83 A4 47 3A 03 24 89 02 63 97 84 0A +83 A4 87 3A 03 24 C9 02 63 93 84 0A 83 A4 C7 3A +03 24 09 03 AD 45 63 94 84 04 F2 40 62 44 D2 44 +42 49 B2 49 22 4A 05 61 82 80 81 45 37 15 01 50 +13 05 85 38 EF F0 6F 87 37 15 01 50 A6 85 13 05 +45 27 EF F0 8F 86 37 15 01 50 A2 85 13 05 C5 28 +EF F0 AF 85 05 45 EF F0 4F 80 01 A0 81 45 37 15 +01 50 13 05 05 3D EF F0 4F 84 37 15 01 50 A6 85 +13 05 45 27 EF F0 6F 83 37 15 01 50 A2 85 13 05 +C5 28 EF F0 8F 82 05 45 EF E0 3F FD 01 A0 85 45 +71 BF 95 45 61 BF 91 45 51 BF 8D 45 41 BF 89 45 +71 B7 A5 45 61 B7 85 45 5D BF A5 45 4D BF A9 45 +7D B7 99 45 6D B7 9D 45 5D B7 A1 45 4D B7 A1 45 +B5 B7 9D 45 A5 B7 99 45 95 B7 91 45 49 BF 95 45 +79 B7 8D 45 69 B7 89 45 59 B7 A9 45 81 BF 37 15 +01 50 41 11 13 05 C5 46 06 C6 EF E0 9F F9 37 27 +01 50 13 07 07 E8 1C 4B 54 4B D5 8F 91 EF 73 00 +50 10 93 07 40 06 01 00 FD 17 C2 07 C1 83 E5 FF +1C 4B 54 4B D5 8F E5 D7 B2 40 4C 4B 37 15 01 50 +13 05 85 48 41 01 6F E0 5F F8 37 15 01 50 41 11 +13 05 45 4B 06 C6 EF E0 DF F4 B2 40 B7 07 01 10 +11 47 98 CB 41 01 82 80 01 11 26 CA 4A C8 4E C6 +52 C4 06 CE 22 CC 03 C4 06 00 36 89 AA 89 AE 84 +32 8A 37 07 01 10 1C 4F 85 8B F5 DF 83 C7 09 00 +63 84 07 22 83 C7 19 00 B7 06 01 10 86 07 93 F7 +E7 03 93 E7 17 00 23 20 F7 60 83 A7 46 60 89 8B +ED DF 83 C7 04 00 63 8D 07 1C 83 C7 14 00 B7 06 +01 10 37 07 01 10 86 07 93 F7 E7 03 93 E7 17 00 +23 A4 F6 60 83 27 C7 60 89 8B ED DF 83 26 4A 00 +37 07 01 10 23 28 D7 12 83 26 8A 00 23 2A D7 12 +83 26 CA 00 23 2C D7 12 83 26 0A 01 23 2E D7 12 +83 26 4A 01 23 20 D7 14 41 C4 83 47 19 00 37 15 +01 50 13 05 C5 46 86 07 93 F7 F7 0F 93 E7 17 7C +23 28 F7 60 85 47 1C CB EF E0 BF E7 37 27 01 50 +13 07 07 E8 14 4B 5C 4B D5 8F 63 94 07 1E 73 00 +50 10 93 07 40 06 01 00 FD 17 C2 07 C1 83 E5 FF +1C 4B 54 4B D5 8F E5 D7 4C 4B 37 15 01 50 13 05 +85 48 EF E0 9F E6 21 CC 37 15 01 50 13 05 05 4E +EF E0 3F E3 37 07 01 10 83 27 47 61 89 8B ED DF +F2 40 62 44 D2 44 42 49 B2 49 22 4A 05 61 82 80 +85 47 37 15 01 50 1C CB 13 05 C5 46 EF E0 7F E0 +37 27 01 50 13 07 07 E8 14 4B 5C 4B D5 8F C1 DB +4C 4B 37 15 01 50 13 05 85 48 EF E0 1F E1 37 15 +01 50 13 05 05 50 EF E0 DF DD B7 07 01 10 83 A4 +07 10 03 24 49 00 63 10 94 18 83 A4 47 10 03 24 +89 00 63 1C 94 16 83 A4 87 10 03 24 C9 00 63 94 +84 14 83 A4 C7 10 03 24 09 01 63 90 84 14 83 A4 +07 11 03 24 49 01 63 9C 84 12 83 A4 47 11 03 24 +89 01 63 98 84 12 83 A4 87 11 03 24 C9 01 63 94 +84 12 83 A4 C7 11 03 24 09 02 63 90 84 12 83 A4 +07 12 03 24 49 02 63 9C 84 10 83 A4 47 12 03 24 +89 02 63 98 84 10 83 A4 87 12 03 24 C9 02 63 92 +84 0E 83 A4 C7 12 03 24 09 03 AD 45 E3 82 84 F2 +37 15 01 50 13 05 85 51 EF E0 3F D6 37 15 01 50 +A6 85 13 05 45 27 EF E0 5F D5 37 15 01 50 A2 85 +13 05 C5 28 EF E0 7F D4 05 45 EF E0 1F CF 01 A0 +37 06 01 10 B7 05 FF EF 93 07 06 08 93 85 05 F8 +13 06 06 10 BE 86 91 07 33 87 B7 00 26 97 18 43 +98 C2 E3 99 C7 FE 1D B5 B7 07 01 50 03 A7 C7 07 +89 47 63 E9 E7 04 03 A7 49 00 B7 07 01 10 B8 C3 +03 A7 89 00 F8 C3 03 A7 C9 00 B8 C7 03 A7 09 01 +F8 C7 03 A7 49 01 B8 CB 03 A7 89 01 F8 CB 03 A7 +C9 01 B8 CF 03 A7 09 02 F8 CF 03 A7 49 02 B8 D3 +03 A7 89 02 F8 D3 03 A7 C9 02 B8 D7 03 A7 09 03 +F8 D7 45 B3 37 15 01 50 13 05 85 4C EF E0 7F C8 +5D B7 4C 4B 37 15 01 50 13 05 85 48 EF E0 FF C9 +25 BD A9 45 35 B7 89 45 25 B7 8D 45 15 B7 91 45 +05 B7 95 45 31 BF 99 45 21 BF 9D 45 11 BF A1 45 +01 BF A5 45 31 B7 81 45 21 B7 85 45 11 B7 B7 07 +01 50 03 A7 C7 07 41 11 22 C4 06 C6 8D 47 2A 84 +63 EA E7 00 1C 40 93 F7 C7 3F 99 EF B2 40 22 44 +41 01 82 80 37 15 01 50 13 05 45 54 EF E0 7F C1 +1C 40 93 F7 C7 3F FD D3 37 15 01 50 13 05 C5 55 +EF E0 3F C0 22 44 B2 40 05 45 41 01 6F E0 FF BC +B7 07 01 50 03 A7 C7 07 41 11 22 C4 26 C2 06 C6 +8D 47 AA 84 2E 84 63 ED E7 00 06 04 13 74 E4 03 +13 64 14 00 80 C0 B2 40 22 44 92 44 41 01 82 80 +37 15 01 50 13 05 85 56 EF E0 BF BB F9 BF B7 07 +01 50 03 A7 C7 07 41 11 22 C4 26 C2 4A C0 06 C6 +8D 47 2A 89 AE 84 32 84 63 E7 E7 04 93 77 14 00 +13 17 64 00 13 77 07 08 93 95 14 00 9A 07 D9 8F +93 16 64 00 93 F5 E5 03 13 17 64 00 CD 8F 93 F6 +06 10 D5 8F 13 77 07 20 1A 04 13 74 04 40 D9 8F +B2 40 C1 8F 22 44 93 E7 17 00 23 20 F9 00 92 44 +02 49 41 01 82 80 37 15 01 50 13 05 05 58 EF E0 +5F B4 6D B7 B7 07 01 50 03 A7 C7 07 41 11 22 C4 +06 C6 8D 47 2A 84 63 EF E7 00 06 04 13 74 E4 03 +13 64 14 04 B7 07 02 10 B2 40 23 A0 87 60 22 44 +41 01 82 80 37 15 01 50 13 05 85 59 EF E0 7F B0 +E9 BF 08 41 B7 15 01 50 41 11 93 85 85 5C 06 C6 +EF 10 80 2B B2 40 33 35 A0 00 41 01 82 80 B7 05 +01 50 93 85 85 10 93 87 45 00 13 86 C5 20 01 47 +94 43 63 65 D5 00 D4 4B 63 69 D5 00 D1 07 05 07 +E3 98 C7 FE 13 85 85 20 82 80 93 17 27 00 BA 97 +8A 07 33 85 F5 00 82 80 01 11 22 CC 37 04 01 50 +26 CA 4A C8 4E C6 52 C4 06 CE 13 0A 84 10 2A 89 +13 04 84 10 81 44 ED 49 21 A0 85 04 63 8D 34 01 +08 40 CA 85 51 04 EF 10 20 24 65 D9 13 95 24 00 +26 95 0A 05 52 95 F2 40 62 44 D2 44 42 49 B2 49 +22 4A 05 61 82 80 5C 45 63 C0 07 04 1C 49 63 CF +07 02 5C 49 63 CE 07 02 1C 4D 63 CD 07 02 5C 4D +63 CC 07 02 1C 51 63 CB 07 02 5C 51 63 CA 07 02 +1C 55 63 C9 07 02 5C 55 63 C8 07 02 08 59 13 45 +F5 FF 7D 81 25 05 82 80 01 45 82 80 05 45 82 80 +09 45 82 80 0D 45 82 80 11 45 82 80 15 45 82 80 +19 45 82 80 1D 45 82 80 21 45 82 80 B7 27 01 50 +0A 05 93 87 87 ED AA 97 94 43 05 47 33 17 B7 00 +55 8F 98 C3 82 80 01 11 4E C6 B7 09 01 50 83 A7 +C9 07 06 CE 22 CC 26 CA 4A C8 52 C4 56 C2 5A C0 +09 47 63 6F F7 06 37 09 01 50 B7 24 01 50 13 09 +89 10 93 84 84 ED 01 44 09 4B B7 1A 01 50 6D 4A +63 62 FB 02 69 47 63 05 E4 00 09 47 63 6B F7 02 +F2 40 62 44 D2 44 42 49 B2 49 22 4A 92 4A 02 4B +05 61 82 80 90 40 83 25 09 00 13 85 0A 5F 05 04 +EF E0 BF 99 83 A7 C9 07 E3 09 44 FD 51 09 91 04 +C1 B7 62 44 F2 40 D2 44 42 49 B2 49 22 4A 92 4A +02 4B 37 15 01 50 13 05 05 5D 05 61 6F E0 7F 94 +37 15 01 50 13 05 05 5D EF E0 BF 93 83 A7 C9 07 +9D BF 41 11 06 C6 EF 10 20 0F B2 40 33 35 A0 00 +41 01 82 80 63 52 B0 04 01 11 22 CC 26 CA 4A C8 +4E C6 06 CE 2E 89 AA 89 2A 84 81 44 EF 00 50 55 +B3 67 25 03 18 40 11 04 85 04 8A 07 CE 97 94 43 +23 2E D4 FE 98 C3 E3 13 99 FE F2 40 62 44 D2 44 +42 49 B2 49 05 61 82 80 82 80 37 25 01 50 41 11 +13 05 45 92 06 C6 EF E0 DF 8C 37 27 01 50 13 07 +07 E8 1C 57 54 57 D5 8F 91 EF 73 00 50 10 93 07 +40 06 01 00 FD 17 C2 07 C1 83 E5 FF 1C 57 54 57 +D5 8F E5 D7 B2 40 4C 57 37 25 01 50 13 05 05 94 +41 01 6F E0 9F 8B 37 25 01 50 41 11 13 05 05 97 +06 C6 EF E0 1F 88 B2 40 B7 87 02 10 21 47 98 CB +41 01 82 80 41 11 22 C4 4A C0 06 C6 26 C2 AA 86 +2E 84 32 89 37 87 02 10 1C 4F 85 8B F5 DF D0 42 +89 47 23 20 C7 08 90 46 23 22 C7 08 D0 46 23 24 +C7 08 90 4A 23 26 C7 08 D0 4A 23 28 C7 08 90 4E +23 2A C7 08 D0 4E 23 2C C7 08 90 52 23 2E C7 08 +D0 52 23 20 C7 0A 90 56 23 22 C7 0A D0 56 23 24 +C7 0A 90 5A 23 26 C7 0A D0 5A 23 28 C7 0A 90 5E +23 2A C7 0A D0 5E 23 2C C7 0A B4 42 23 2E D7 0A +37 07 01 50 03 27 C7 07 63 EB E7 0C 93 17 24 00 +91 8B 93 E7 17 00 37 87 02 10 37 25 01 50 1C CB +13 05 45 92 EF E0 EF FC 37 27 01 50 13 07 07 E8 +1C 57 54 57 D5 8F 91 EF 73 00 50 10 93 07 40 06 +01 00 FD 17 C2 07 C1 83 E5 FF 1C 57 54 57 D5 8F +E5 D7 4C 57 37 25 01 50 13 05 05 94 EF E0 EF FB +37 25 01 50 13 05 85 99 EF E0 AF F8 B7 87 02 10 +83 A4 07 10 03 24 49 00 63 1A 94 06 83 A4 47 10 +03 24 89 00 63 1D 94 08 83 A4 87 10 03 24 C9 00 +63 9F 84 08 83 A4 C7 10 03 24 09 01 63 97 84 08 +83 A4 07 11 03 24 49 01 63 9F 84 06 83 A4 47 11 +03 24 89 01 63 97 84 06 83 A4 87 11 03 24 C9 01 +63 99 84 06 83 A4 C7 11 03 24 09 02 9D 45 63 90 +84 02 B2 40 22 44 92 44 02 49 41 01 82 80 37 25 +01 50 13 05 85 98 EF E0 CF F0 0D B7 81 45 37 25 +01 50 13 05 85 9B EF E0 4F F2 37 15 01 50 A6 85 +13 05 45 27 EF E0 6F F1 37 15 01 50 A2 85 13 05 +C5 28 EF E0 8F F0 05 45 EF E0 2F EB 01 A0 85 45 +F9 B7 95 45 E9 B7 91 45 D9 B7 8D 45 C9 B7 89 45 +7D BF 99 45 6D BF 37 25 01 50 41 11 13 05 45 9E +06 C6 EF E0 0F EB 37 27 01 50 13 07 07 E8 1C 53 +54 53 D5 8F 91 EF 73 00 50 10 93 07 40 06 01 00 +FD 17 C2 07 C1 83 E5 FF 1C 53 54 53 D5 8F E5 D7 +B2 40 4C 53 37 25 01 50 13 05 05 A0 41 01 6F E0 +CF E9 B7 07 01 50 03 A7 C7 07 41 11 22 C4 06 C6 +8D 47 2A 84 63 ED E7 00 0A 04 31 88 13 64 14 00 +B7 07 02 10 B2 40 80 CB 22 44 41 01 82 80 AA 85 +37 25 01 50 13 05 05 A3 EF E0 2F E6 F1 BF B7 07 +01 50 03 A7 C7 07 41 11 22 C4 06 C6 8D 47 2A 84 +63 ED E7 00 0A 04 31 88 13 64 24 00 B7 07 02 10 +B2 40 80 CB 22 44 41 01 82 80 AA 85 37 25 01 50 +13 05 45 A5 EF E0 6F E2 F1 BF B7 07 01 50 03 A7 +C7 07 41 11 22 C4 06 C6 8D 47 2A 84 63 ED E7 00 +0A 04 31 88 13 64 14 02 B7 07 02 10 B2 40 80 CB +22 44 41 01 82 80 AA 85 37 25 01 50 13 05 85 A7 +EF E0 AF DE F1 BF B7 07 01 50 03 A7 C7 07 41 11 +22 C4 06 C6 8D 47 2A 84 63 ED E7 00 0A 04 31 88 +13 64 24 02 B7 07 02 10 B2 40 80 CB 22 44 41 01 +82 80 AA 85 37 25 01 50 13 05 45 AA EF E0 EF DA +F1 BF B7 07 01 50 03 A7 C7 07 8D 47 63 E8 E7 00 +B7 07 02 10 05 47 23 AA E7 60 82 80 37 25 01 50 +41 11 13 05 05 AD 06 C6 EF E0 AF D5 B2 40 B7 07 +02 10 05 47 23 AA E7 60 41 01 82 80 01 11 4A C8 +2A 89 1D 89 13 05 05 FC 13 75 F5 0F 22 CC 26 CA +4E C6 06 CE AE 84 B2 89 36 84 EF E0 0F D0 37 07 +02 10 1C 4F 85 8B F5 DF 93 17 19 00 93 F7 E7 03 +93 E7 17 00 23 20 F7 60 37 07 02 10 83 27 47 60 +89 8B ED DF D9 C0 93 97 19 00 93 F7 F7 0F 93 E7 +17 7C 23 24 F7 60 37 25 01 50 93 07 90 02 1C CB +13 05 45 9E EF E0 EF CD 37 27 01 50 13 07 07 E8 +1C 53 54 53 D5 8F 63 99 07 14 73 00 50 10 93 07 +40 06 01 00 FD 17 C2 07 C1 83 E5 FF 1C 53 54 53 +D5 8F E5 D7 4C 53 37 25 01 50 13 05 05 A0 EF E0 +CF CC 37 25 01 50 13 05 45 AF EF E0 8F C9 A1 CC +37 07 02 10 83 27 C7 60 89 8B ED DF F2 40 62 44 +D2 44 42 49 B2 49 05 61 82 80 93 07 90 02 37 25 +01 50 1C CB 13 05 45 9E EF E0 AF C6 37 27 01 50 +13 07 07 E8 14 53 5C 53 D5 8F C1 DB 4C 53 37 25 +01 50 13 05 05 A0 EF E0 4F C7 37 25 01 50 13 05 +45 AF EF E0 0F C4 37 25 01 50 13 05 45 B0 EF E0 +4F C3 B7 07 02 10 83 A4 07 10 18 40 63 94 E4 0E +83 A4 47 10 58 40 63 91 E4 0E 83 A4 87 10 18 44 +63 9E E4 0A 83 A4 C7 10 58 44 63 9C E4 0A 83 A4 +07 11 18 48 63 9A E4 0A 83 A4 47 11 58 48 63 98 +E4 0A 83 A4 87 11 18 4C 63 9B E4 0A 83 A4 C7 11 +58 4C 63 99 E4 0A 83 A4 07 12 18 50 63 97 E4 0A +83 A4 47 12 5C 50 63 97 F4 06 B7 07 02 10 83 A4 +87 12 18 54 63 9F E4 08 83 A4 C7 12 5C 54 AD 45 +13 04 C4 02 E3 84 F4 F2 37 25 01 50 13 05 85 9B +EF E0 AF BC 37 15 01 50 A6 85 13 05 45 27 EF E0 +CF BB 0C 40 37 15 01 50 13 05 C5 28 EF E0 EF BA +05 45 EF E0 8F B5 01 A0 4C 53 37 25 01 50 13 05 +05 A0 EF E0 8F B9 37 25 01 50 13 05 45 AF EF E0 +4F B6 F9 B5 13 04 44 02 A5 45 7D B7 21 04 89 45 +65 B7 31 04 8D 45 4D B7 41 04 91 45 71 BF 51 04 +95 45 59 BF 81 45 49 BF 11 04 85 45 71 B7 61 04 +99 45 59 B7 71 04 9D 45 41 B7 13 04 04 02 A1 45 +A5 BF 13 04 84 02 A9 45 85 BF 37 25 01 50 41 11 +13 05 45 B2 06 C6 EF E0 CF B0 B2 40 B7 07 02 10 +41 47 98 CB 41 01 82 80 41 11 22 C4 4A C0 06 C6 +26 C2 2E 84 32 89 B7 07 02 10 98 4F 05 8B 75 DF +B7 05 FE EF 37 06 02 10 93 87 07 08 93 85 05 F8 +13 06 06 10 BE 86 91 07 33 87 B7 00 2A 97 18 43 +98 C2 E3 99 C7 FE B7 07 01 50 03 A7 C7 07 89 47 +63 E4 E7 16 93 17 24 00 B1 8B 93 E7 17 00 37 07 +02 10 37 25 01 50 1C CB 13 05 45 9E EF E0 6F A9 +37 27 01 50 13 07 07 E8 1C 53 54 53 D5 8F 91 EF +73 00 50 10 93 07 40 06 01 00 FD 17 C2 07 C1 83 +E5 FF 1C 53 54 53 D5 8F E5 D7 4C 53 37 25 01 50 +13 05 05 A0 EF E0 6F A8 37 25 01 50 13 05 C5 B4 +EF E0 2F A5 B7 07 02 10 83 A4 07 10 03 24 49 00 +63 13 94 0C 83 A4 47 10 03 24 89 00 63 1D 94 0E +83 A4 87 10 03 24 C9 00 63 9B 84 0E 83 A4 C7 10 +03 24 09 01 63 93 84 0E 83 A4 07 11 03 24 49 01 +63 93 84 0E 83 A4 47 11 03 24 89 01 63 9B 84 0C +83 A4 87 11 03 24 C9 01 63 99 84 0C 83 A4 C7 11 +03 24 09 02 63 93 84 0E 83 A4 07 12 03 24 49 02 +63 9B 84 0C 83 A4 47 12 03 24 89 02 63 93 84 0C +83 A4 87 12 03 24 C9 02 63 9B 84 0A 83 A4 C7 12 +03 24 09 03 63 9F 84 08 83 A4 07 13 03 24 49 03 +63 97 84 08 83 A4 47 13 03 24 89 03 63 95 84 08 +83 A4 87 13 03 24 C9 03 63 91 84 08 83 A4 C7 13 +03 24 09 04 BD 45 63 99 84 00 B2 40 22 44 92 44 +02 49 41 01 82 80 81 45 37 25 01 50 13 05 85 9B +EF E0 AF 99 37 15 01 50 A6 85 13 05 45 27 EF E0 +CF 98 37 15 01 50 A2 85 13 05 C5 28 EF E0 EF 97 +05 45 EF E0 8F 92 01 A0 37 25 01 50 13 05 C5 B3 +EF E0 2F 94 41 BD 85 45 C1 B7 8D 45 75 BF 89 45 +65 BF 95 45 55 BF 91 45 45 BF 99 45 75 B7 B1 45 +65 B7 AD 45 55 B7 B5 45 45 B7 B9 45 71 BF A9 45 +61 BF A5 45 51 BF A1 45 41 BF 9D 45 71 B7 B7 07 +01 50 03 A7 C7 07 8D 47 63 E8 E7 00 37 07 02 30 +1C 4F F9 9B 1C CF 82 80 37 25 01 50 41 11 13 05 +C5 B6 06 C6 EF E0 6F 90 37 07 02 30 1C 4F B2 40 +F9 9B 1C CF 41 01 82 80 B7 07 01 50 03 A7 C7 07 +41 11 22 C4 06 C6 8D 47 2A 84 63 EC E7 00 37 07 +02 30 5C 4F B2 40 C1 9B C1 8F 22 44 5C CF 41 01 +82 80 AA 85 37 25 01 50 13 05 85 B8 EF E0 EF 8B +F9 BF B7 07 01 50 03 A7 C7 07 41 11 22 C4 06 C6 +8D 47 2A 84 63 E6 E7 02 B7 07 03 30 D8 5F 93 17 +44 00 B3 66 E4 00 91 C7 B7 07 00 F0 7D 8F B3 66 +87 00 B2 40 22 44 B7 07 03 30 D4 DF 41 01 82 80 +AA 85 37 25 01 50 13 05 05 BB EF E0 0F 87 E9 B7 +B7 07 01 50 03 A7 C7 07 41 11 22 C4 06 C6 26 C2 +4A C0 8D 47 2A 84 63 E4 E7 04 B7 17 02 30 03 A9 +07 00 85 47 B3 64 24 01 63 FB 97 00 37 25 01 50 +13 05 45 C1 EF E0 6F 83 05 45 EF D0 1F FE 93 77 +14 00 89 C7 13 79 E9 FF B3 64 89 00 B2 40 22 44 +B7 17 02 30 84 C3 02 49 92 44 41 01 82 80 AA 85 +37 25 01 50 13 05 85 BD EF E0 2F 80 7D B7 B7 07 +01 50 03 A7 C7 07 41 11 22 C4 06 C6 8D 47 2A 84 +63 E0 E7 04 B7 07 03 30 DC 5F 13 17 44 00 19 CF +37 07 00 F0 79 8C 13 44 F4 FF 7D 8C 79 8C B7 07 +03 30 B2 40 C0 DF 22 44 41 01 82 80 13 44 F4 FF +7D 8C B7 07 03 30 B2 40 C0 DF 22 44 41 01 82 80 +AA 85 37 25 01 50 13 05 05 C3 EF D0 1F FA 5D BF +79 71 4E CE B7 09 01 50 22 D4 83 A7 C9 07 37 04 +02 30 26 D2 04 44 4A D0 06 D6 0D 49 63 6C F9 00 +40 44 B2 50 22 85 22 54 02 59 F2 49 A6 85 92 54 +45 61 82 80 37 25 01 50 A6 85 13 05 85 C5 EF D0 +DF F5 83 A7 C9 07 40 44 E3 7D F9 FC 37 25 01 50 +A2 85 13 05 C5 C7 EF D0 5F F4 E1 B7 79 71 4A D0 +37 09 01 50 03 27 C9 07 22 D4 26 D2 06 D6 4E CE +52 CC 2A C4 2E C6 89 47 2A 84 AE 84 63 ED E7 14 +B7 07 02 00 63 EE 87 12 B7 C7 5E BA 93 87 17 A1 +63 83 F4 02 B7 D7 BE BA 93 87 E7 AF 63 84 F4 14 +37 25 01 50 A6 85 13 05 45 CF EF D0 1F EF 05 45 +EF D0 BF E9 01 A0 B7 04 00 50 37 0A 00 40 37 07 +02 30 50 4B 7D C2 13 07 06 02 63 60 E4 0E 13 77 +36 00 11 C3 11 06 37 07 02 30 4C 4B 03 25 C9 07 +89 46 23 20 BA 00 03 28 47 01 93 59 26 00 23 20 +0A 01 58 4B 23 20 EA 00 63 E9 A6 10 93 96 29 00 +D2 87 D2 96 37 05 02 30 63 88 09 00 58 49 91 07 +23 AE E7 FE E3 9C D7 FE B7 07 02 30 D8 4B 61 CB +93 77 C6 FF 93 06 07 02 B6 97 63 62 F4 0C 93 77 +37 00 91 C3 11 07 B7 07 02 30 D0 4B 83 25 C9 07 +13 54 27 00 90 C0 D0 4B 89 46 90 C0 D8 4B 98 C0 +63 E6 B6 0C 63 0E 04 0C 13 17 24 00 A6 87 26 97 +37 06 02 30 54 4A 91 07 23 AE D7 FE E3 1C F7 FE +B7 07 02 30 23 A6 07 00 8D 47 63 F9 B7 00 37 25 +01 50 89 45 13 05 85 B8 EF D0 3F E1 37 07 02 30 +5C 4F B2 50 22 54 C1 9B 93 E7 27 00 5C CF 92 54 +02 59 F2 49 62 4A 45 61 82 80 37 25 01 50 A2 85 +13 05 85 D2 EF D0 7F DE 05 45 EF D0 1F D9 01 A0 +37 25 01 50 A2 85 13 05 05 CC EF D0 1F DD 05 45 +EF D0 BF D7 01 A0 37 25 01 50 13 05 05 CA EF D0 +5F D9 79 BD B7 04 01 50 37 0A 01 40 C9 BD 01 14 +37 25 01 50 3A 86 B3 05 34 41 13 05 85 D9 EF D0 +DF D9 05 45 EF D0 7F D4 01 A0 37 25 01 50 13 05 +45 D8 32 C2 EF D0 FF D5 12 46 CD B5 37 25 01 50 +13 05 45 DF EF D0 FF D4 83 25 C9 07 15 F4 89 B7 +23 A6 07 00 A1 BF 79 71 4E CE B7 09 01 50 03 A7 +C9 07 4A D0 06 D6 22 D4 26 D2 52 CC 56 CA 5A C8 +2A C4 2E C6 8D 47 2A 89 63 E6 E7 04 01 44 B7 04 +00 40 63 77 A4 02 B7 07 02 30 D8 4B 11 04 93 87 +44 00 98 C0 B3 05 F4 40 37 06 02 30 63 7A 24 01 +54 4A 91 07 33 87 B7 00 23 AE D7 FE E3 6A 27 FF +B2 50 22 54 92 54 02 59 F2 49 62 4A D2 4A 42 4B +45 61 82 80 37 25 01 50 01 44 13 05 85 E0 EF D0 +5F CC E3 7F 24 FD B7 04 00 40 0D 4B B7 1A 01 50 +37 0A 02 30 11 A0 BA 84 83 A7 C9 07 A6 85 13 85 +8A AE E3 7A FB F8 90 40 11 04 EF D0 1F CC 83 27 +4A 01 13 87 44 00 9C C0 E3 6F 24 FD 55 B7 B7 07 +01 50 03 A7 C7 07 8D 47 63 EB E7 00 37 07 03 30 +83 27 47 62 93 E7 17 00 23 22 F7 62 82 80 37 25 +01 50 41 11 13 05 C5 E2 06 C6 EF D0 9F C5 37 07 +03 30 83 27 47 62 B2 40 93 E7 17 00 23 22 F7 62 +41 01 82 80 37 17 02 30 1C 43 85 8B F5 FF 82 80 +0D 89 13 65 45 00 B7 17 02 30 88 C7 82 80 37 17 +02 30 5C 4F 85 8B F5 DF 82 80 B7 17 02 30 05 47 +98 C3 82 80 B7 07 01 50 03 A7 C7 07 41 11 22 C4 +26 C2 06 C6 89 47 AA 84 2E 84 63 E3 E7 02 73 50 +20 7D 73 90 34 7D 73 D0 41 7D 73 10 44 30 73 50 +04 30 73 D0 61 7C B2 40 22 44 92 44 41 01 82 80 +37 25 01 50 13 05 C5 E4 EF D0 BF BC C9 BF B7 27 +01 50 83 A7 C7 E7 23 A4 A7 0A 23 A6 07 0A 82 80 +B7 27 01 50 03 A8 C7 E7 B7 85 95 4C 93 85 D5 F2 +83 26 88 0A 03 27 C8 0A B3 87 B6 02 13 86 17 00 +B3 37 F6 00 23 24 C8 0A 37 F6 51 58 13 06 D6 42 +33 86 C6 02 33 07 B7 02 B3 B6 B6 02 32 97 36 97 +BA 97 13 95 17 00 23 26 F8 0A 05 81 82 80 13 01 +01 BC 23 2A 91 42 23 28 21 43 23 20 61 43 23 2C +81 41 23 2E 11 42 23 2C 81 42 23 26 31 43 23 24 +41 43 23 22 51 43 23 2E 71 41 23 2A 91 41 23 28 +A1 41 23 26 B1 41 85 47 36 8B 2A 89 2E 8C B2 84 +63 F1 D7 2E 01 46 85 4C 85 46 FD 5B 09 A8 B3 8C +77 41 3E 86 85 46 B3 07 D6 00 63 F7 67 03 33 87 +74 01 36 97 B3 85 F4 00 83 C5 05 00 03 47 07 00 +E3 EF E5 FC 63 86 E5 14 B2 8B 85 46 05 06 B3 07 +D6 00 85 4C E3 ED 67 FD 81 45 05 48 05 46 7D 55 +05 47 09 A8 33 08 A7 40 BA 85 05 46 33 87 C5 00 +63 77 67 03 B3 87 C4 00 B3 86 E4 00 AA 97 83 C6 +06 00 83 C7 07 00 E3 EF D7 FC 63 87 D7 10 2E 85 +05 46 85 05 33 87 C5 00 05 48 E3 6D 67 FD 05 05 +85 0B 63 64 75 01 C2 8C AA 8B 8A 87 13 07 01 40 +23 A0 67 01 91 07 E3 9D E7 FE 63 05 0B 02 13 06 +FB FF B3 05 9B 00 26 87 26 96 83 47 07 00 B3 06 +E6 40 05 07 8A 07 93 87 07 40 8A 97 23 A0 D7 C0 +E3 95 E5 FE 5E 86 B3 85 94 01 26 85 7D 2E 63 1F +05 10 85 69 93 89 09 80 05 4A 81 4D 01 44 B3 06 +6C 41 B3 69 3B 01 13 0D FB FF 33 0A 7A 41 B3 0A +9B 41 63 E8 86 02 33 06 89 00 B3 07 A6 01 83 C7 +07 00 8A 07 93 87 07 40 8A 97 83 A7 07 C0 AD CB +63 85 0D 00 63 F3 97 01 D6 87 3E 94 81 4D E3 FC +86 FC 33 05 89 01 CE 85 4D 2B 2A 9C B3 06 6C 41 +E3 F3 86 FC 01 45 83 20 C1 43 03 24 81 43 83 24 +41 43 03 29 01 43 83 29 C1 42 03 2A 81 42 83 2A +41 42 03 2B 01 42 83 2B C1 41 03 2C 81 41 83 2C +41 41 03 2D 01 41 83 2D C1 40 13 01 01 44 82 80 +63 8A 96 15 85 06 41 BD 63 03 C8 14 05 06 F9 B5 +6E 87 63 F3 7D 01 5E 87 63 70 A7 03 B3 07 E4 00 +33 88 E4 00 CA 97 03 45 08 00 83 C7 07 00 63 11 +F5 04 05 07 E3 64 A7 FF 13 87 FB FF 63 E6 7D 01 +39 AA 63 81 ED 02 2A 87 B3 07 E4 00 B3 85 E4 00 +CA 97 83 C5 05 00 83 C7 07 00 13 05 F7 FF E3 82 +F5 FE 05 07 85 0D 63 6A B7 0F 66 94 D6 8D 11 BF +E3 74 A7 FD 52 94 3A 94 81 4D 21 B7 33 0A 7B 41 +63 65 7A 0D 05 64 13 04 04 80 85 49 05 0A 81 4A +B3 06 6C 41 33 64 8B 00 93 0C FB FF B3 89 79 41 +7D 5D 63 E2 56 03 33 05 59 01 B3 07 95 01 83 C7 +07 00 8A 07 93 87 07 40 8A 97 83 A7 07 C0 95 CB +BE 9A E3 F2 56 FF 33 05 89 01 A2 85 79 29 2A 9C +B3 06 6C 41 E3 E8 56 EF 33 05 59 01 B3 07 95 01 +83 C7 07 00 8A 07 93 87 07 40 8A 97 83 A7 07 C0 +E1 FB 5E 87 63 E6 9B 01 25 A0 05 07 63 72 97 03 +B3 07 57 01 B3 85 E4 00 CA 97 03 C6 05 00 83 C7 +07 00 E3 04 F6 FE 63 75 97 01 CE 9A BA 9A 51 B7 +93 87 FB FF 63 95 A7 01 79 BD E3 8E A7 E9 33 87 +FA 00 33 86 F4 00 4A 97 03 46 06 00 03 47 07 00 +FD 17 E3 04 E6 FE D2 9A A9 BF 5E 8A 25 BF C2 95 +05 46 69 B3 36 96 85 46 3D BB 32 85 AD B5 5E 87 +11 B7 85 4C 81 4B 55 BB 1D 71 A2 CC A6 CA 86 CE +CA C8 CE C6 D2 C4 AE 84 83 C5 05 00 2A 84 D5 CD +03 C6 14 00 63 0C 06 12 03 C7 24 00 61 C3 03 C5 +34 00 63 00 05 14 83 C7 44 00 F1 CB 26 85 A5 26 +2A 89 93 65 05 20 22 85 C9 26 63 69 25 0F 93 07 +E0 0F 63 E7 27 15 B3 09 25 41 13 06 00 04 93 05 +19 00 0A 85 A2 99 5D 22 63 06 09 02 13 76 F9 0F +26 87 B3 05 99 00 26 96 83 47 07 00 B3 06 E6 40 +05 07 93 F7 F7 03 93 87 07 04 8A 97 23 80 D7 FC +E3 94 E5 FE 7D 14 B3 07 24 01 83 C7 07 00 93 F7 +F7 03 93 87 07 04 8A 97 83 C7 07 FC 3E 94 63 F6 +89 00 79 A0 52 94 63 E5 89 08 B3 07 24 01 83 C7 +07 00 22 85 4A 86 93 F7 F7 03 93 87 07 04 8A 97 +A6 85 03 CA 07 FC D5 20 71 FD F6 40 22 85 66 44 +D6 44 46 49 B6 49 26 4A 25 61 82 80 03 47 05 00 +C2 05 D1 8D 81 47 39 C3 C2 07 A2 86 D9 8F 05 04 +03 47 04 00 E3 99 F5 FE 13 84 F6 FF F9 B7 93 97 +85 01 42 06 83 46 04 00 D1 8F C9 8F 22 07 D9 8F +91 CE 01 47 19 A0 63 83 E7 04 22 86 22 07 05 04 +55 8F 83 46 04 00 E5 FA 63 8A E7 02 01 44 71 BF +33 85 29 01 83 47 05 00 F5 DB 85 65 93 85 05 80 +6D 2C AA 99 E3 F0 89 F4 01 44 41 B7 66 44 F6 40 +D6 44 46 49 B6 49 26 4A 25 61 A9 A2 13 04 D6 FF +AD B7 83 46 04 00 93 97 85 01 42 06 D1 8F 22 07 +D9 8F CD DE 01 47 11 A0 D5 DA 55 8F 22 86 22 07 +05 04 83 46 04 00 E3 19 F7 FE 13 04 E6 FF 35 BF +AA 85 22 85 66 44 F6 40 B6 49 26 4A CA 86 26 86 +46 49 D6 44 25 61 6F F0 9F B2 8D 47 63 F3 C7 02 +B3 67 B5 00 8D 8B 8D 46 89 CB 93 06 F6 FF 29 A8 +71 16 11 05 91 05 63 F6 C6 00 18 41 9C 41 E3 09 +F7 FE 93 06 F6 FF 0D C2 85 06 AE 96 19 A0 63 8D +D5 00 83 47 05 00 03 C7 05 00 05 05 85 05 E3 88 +E7 FE 33 85 E7 40 82 80 01 45 82 80 3D 43 2A 87 +63 73 C3 02 93 77 F7 00 BD EF AD E5 93 76 06 FF +3D 8A BA 96 0C C3 4C C3 0C C7 4C C7 41 07 E3 6B +D7 FE 11 E2 82 80 B3 06 C3 40 8A 06 97 02 00 00 +96 96 67 80 A6 00 23 07 B7 00 A3 06 B7 00 23 06 +B7 00 A3 05 B7 00 23 05 B7 00 A3 04 B7 00 23 04 +B7 00 A3 03 B7 00 23 03 B7 00 A3 02 B7 00 23 02 +B7 00 A3 01 B7 00 23 01 B7 00 A3 00 B7 00 23 00 +B7 00 82 80 93 F5 F5 0F 93 96 85 00 D5 8D 93 96 +05 01 D5 8D 61 B7 93 96 27 00 97 02 00 00 96 96 +86 82 E7 80 86 FA 96 80 C1 17 1D 8F 3E 96 E3 74 +C3 F8 A5 B7 93 F6 F5 0F 93 77 35 00 C1 CE 91 CB +83 47 05 00 D1 C7 63 86 D7 08 05 05 93 77 35 00 +E5 FB 93 F5 F5 0F 93 97 85 00 AE 97 18 41 13 93 +07 01 33 63 F3 00 37 08 FF FE 33 46 E3 00 13 08 +F8 EF B3 07 07 01 B3 05 06 01 13 47 F7 FF 13 46 +F6 FF F9 8F B7 88 80 80 33 F7 C5 00 D9 8F 93 88 +08 08 B3 F7 17 01 85 E7 58 41 11 05 33 46 67 00 +B3 07 07 01 B3 05 06 01 13 47 F7 FF 13 46 F6 FF +F9 8F 33 F7 C5 00 D9 8F B3 F7 17 01 F1 DF 83 47 +05 00 99 C7 63 80 F6 06 83 47 15 00 05 05 FD FB +01 45 82 80 81 CB 83 47 05 00 E5 DF 05 05 93 77 +35 00 F5 FB 18 41 37 06 FF FE 13 06 F6 EF 93 47 +F7 FF B7 86 80 80 32 97 F9 8F 93 86 06 08 F5 8F +91 EB 58 41 11 05 B3 07 C7 00 13 47 F7 FF F9 8F +F5 8F E5 DB 83 47 05 00 CD DF 83 47 15 00 05 05 +ED FF 82 80 82 80 93 77 35 00 2A 87 9D EF B7 86 +7F 7F 93 86 F6 F7 FD 55 10 43 11 07 B3 77 D6 00 +B6 97 D1 8F D5 8F E3 89 B7 FE 83 46 C7 FF B3 07 +A7 40 8D CA 83 46 D7 FF 9D C2 03 45 E7 FF 33 35 +A0 00 3E 95 79 15 82 80 F9 D2 83 47 07 00 05 07 +93 76 37 00 F5 FB 09 8F 13 05 F7 FF 82 80 13 85 +D7 FF 82 80 13 85 C7 FF 82 80 B3 06 B5 00 AA 87 +89 E5 29 A8 85 07 63 88 F6 00 03 C7 07 00 7D FB +33 85 A7 40 82 80 33 85 A6 40 82 80 01 45 82 80 +@00004FE8 +78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 +78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 +78 78 78 78 78 78 78 78 0A 20 20 20 54 52 41 50 +20 56 45 43 54 4F 52 20 45 58 45 43 55 54 49 4E +47 21 20 4B 49 4C 4C 20 53 49 4D 21 21 21 20 20 +20 0A 78 78 78 78 78 78 78 78 78 78 78 78 78 78 +78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 +78 78 78 78 78 78 78 78 78 78 0A 00 03 00 00 00 +C8 00 03 30 08 1F 00 00 66 1E 00 00 66 1E 00 00 +66 1E 00 00 66 1E 00 00 66 1E 00 00 66 1E 00 00 +66 1E 00 00 66 1E 00 00 66 1E 00 00 66 1E 00 00 +52 20 00 00 E2 1F 00 00 66 1E 00 00 66 1E 00 00 +66 1E 00 00 66 1E 00 00 66 1E 00 00 66 1E 00 00 +66 1E 00 00 66 1E 00 00 66 1E 00 00 66 1E 00 00 +BE 1F 00 00 66 1E 00 00 66 1E 00 00 66 1E 00 00 +92 1F 00 00 66 1E 00 00 2C 1F 00 00 66 1E 00 00 +66 1E 00 00 08 1F 00 00 00 16 01 50 00 C0 01 10 +0A 00 00 00 01 00 00 00 00 00 00 00 14 16 01 50 +28 C0 01 10 0C 00 00 00 FF FF FF FF 00 00 00 00 +30 16 01 50 58 C0 01 10 0C 00 00 00 FF FF FF FF +00 00 00 00 4C 16 01 50 88 C0 01 10 0C 00 00 00 +FF FF FF FF 00 00 00 00 68 16 01 50 B8 C0 01 10 +0C 00 00 00 FF FF FF FF 00 00 00 00 84 16 01 50 +E8 C0 01 10 0C 00 00 00 FF FF FF FF 00 00 00 00 +A0 16 01 50 18 C1 01 10 0C 00 00 00 FF FF FF FF +00 00 00 00 BC 16 01 50 48 C1 01 10 0C 00 00 00 +FF FF FF FF 00 00 00 00 D8 16 01 50 78 C1 01 10 +0C 00 00 00 FF FF FF FF 00 00 00 00 F4 16 01 50 +A8 C1 01 10 0C 00 00 00 FF FF FF FF 00 00 00 00 +10 17 01 50 D8 C1 01 10 0C 00 00 00 FF FF FF FF +00 00 00 00 2C 17 01 50 08 C2 01 10 0A 00 00 00 +00 00 00 00 00 00 00 00 44 17 01 50 30 C2 01 10 +0C 00 00 00 00 00 00 00 00 00 00 00 64 17 01 50 +60 C2 01 10 0C 00 00 00 00 00 00 00 00 00 00 00 +84 17 01 50 90 C2 01 10 0C 00 00 00 00 00 00 00 +00 00 00 00 A4 17 01 50 C0 C2 01 10 0C 00 00 00 +00 00 00 00 00 00 00 00 C4 17 01 50 F0 C2 01 10 +0C 00 00 00 00 00 00 00 00 00 00 00 E4 17 01 50 +20 C3 01 10 0C 00 00 00 00 00 00 00 00 00 00 00 +04 18 01 50 50 C3 01 10 0C 00 00 00 00 00 00 00 +00 00 00 00 24 18 01 50 80 C3 01 10 0C 00 00 00 +00 00 00 00 00 00 00 00 44 18 01 50 B0 C3 01 10 +0C 00 00 00 00 00 00 00 00 00 00 00 64 18 01 50 +E0 C3 01 10 0C 00 00 00 00 00 00 00 00 00 00 00 +84 18 01 50 10 C4 01 10 0A 00 00 00 00 00 00 00 +00 00 00 00 A8 18 01 50 38 C4 01 10 0A 00 00 00 +00 00 00 00 00 00 00 00 C8 18 01 50 60 C4 01 10 +08 00 00 00 00 00 00 00 00 00 00 00 E8 18 01 50 +80 C4 01 10 08 00 00 00 01 00 00 00 00 00 00 00 +08 19 01 50 A0 C4 01 10 08 00 00 00 FF FF FF FF +00 00 00 00 00 00 00 00 00 00 00 00 0C 00 00 00 +01 00 00 00 02 00 00 00 03 00 00 00 04 00 00 00 +05 00 00 00 06 00 00 00 07 00 00 00 08 00 00 00 +09 00 00 00 0A 00 00 00 0B 00 00 00 01 00 00 00 +0C 00 00 00 0C 00 00 00 0D 00 00 00 0E 00 00 00 +0F 00 00 00 10 00 00 00 11 00 00 00 12 00 00 00 +13 00 00 00 14 00 00 00 15 00 00 00 16 00 00 00 +03 00 00 00 01 00 00 00 17 00 00 00 17 00 00 00 +17 00 00 00 17 00 00 00 17 00 00 00 17 00 00 00 +17 00 00 00 17 00 00 00 17 00 00 00 17 00 00 00 +19 00 00 00 02 00 00 00 01 00 00 00 1A 00 00 00 +1A 00 00 00 1A 00 00 00 1A 00 00 00 1A 00 00 00 +1A 00 00 00 1A 00 00 00 1A 00 00 00 FF FF FF FF +FF FF FF FF 00 00 00 00 00 00 00 00 E4 06 01 50 +4C 07 01 50 B4 07 01 50 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +01 00 00 00 00 00 00 00 0E 33 CD AB 34 12 6D E6 +EC DE 05 00 0B 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +2A 2A 2A 2A 20 4E 4D 49 20 2A 2A 2A 2A 00 00 00 +45 52 52 4F 52 3A 20 45 6E 74 65 72 65 64 20 4E +4D 49 20 77 69 74 68 20 6D 63 61 75 73 65 20 5B +30 78 25 78 5D 20 77 68 69 6C 65 20 6E 6F 74 20 +65 78 70 65 63 74 69 6E 67 20 61 6E 20 65 72 72 +6F 72 21 0A 00 00 00 00 20 20 20 20 20 20 20 6D +65 70 63 20 5B 30 78 25 78 5D 0A 00 45 52 52 4F +52 3A 20 45 6E 74 65 72 65 64 20 66 69 72 73 74 +20 70 61 73 73 20 73 75 62 72 6F 75 74 69 6E 65 +20 77 68 69 6C 65 20 65 78 70 65 63 74 69 6E 67 +20 74 6F 20 65 6E 74 65 72 20 73 65 63 6F 6E 64 +20 70 61 73 73 21 00 00 41 74 20 74 68 65 20 65 +6E 64 20 6F 66 20 66 69 72 73 74 20 70 61 73 73 +20 74 68 72 6F 75 67 68 20 49 43 43 4D 20 4C 4F +43 4B 20 74 65 73 74 3A 20 72 65 73 65 74 74 69 +6E 67 20 74 68 65 20 63 6F 72 65 21 00 00 00 00 +46 69 72 73 74 20 70 61 73 73 20 74 68 72 6F 75 +67 68 20 49 43 43 4D 20 4C 4F 43 4B 20 74 65 73 +74 21 00 00 53 75 63 63 65 73 73 21 20 52 65 61 +63 68 65 64 20 65 6E 64 20 6F 66 20 49 43 43 4D +20 6C 6F 63 6B 20 66 69 72 6D 77 61 72 65 20 64 +75 72 69 6E 67 20 73 65 63 6F 6E 64 20 69 74 65 +72 61 74 69 6F 6E 00 00 45 52 52 4F 52 3A 20 45 +6E 74 65 72 65 64 20 73 65 63 6F 6E 64 20 70 61 +73 73 20 73 75 62 72 6F 75 74 69 6E 65 20 75 6E +65 78 70 65 63 74 65 64 6C 79 21 00 53 65 63 6F +6E 64 20 70 61 73 73 20 74 68 72 6F 75 67 68 20 +49 43 43 4D 20 4C 4F 43 4B 20 74 65 73 74 21 00 +45 72 72 6F 72 21 20 46 61 74 61 6C 20 73 75 62 +72 6F 75 74 69 6E 65 20 69 73 20 65 78 65 63 75 +74 69 6E 67 20 66 72 6F 6D 20 49 43 43 4D 20 65 +76 65 6E 20 74 68 6F 75 67 68 20 6C 6F 63 6B 65 +64 20 77 68 65 6E 20 77 72 69 74 74 65 6E 21 00 +2D 2D 2D 2D 2D 2D 2D 2D 2D 2D 2D 2D 2D 2D 2D 2D +2D 2D 2D 2D 2D 2D 2D 2D 2D 2D 2D 2D 2D 2D 2D 2D +2D 2D 0A 49 43 43 4D 20 4C 6F 63 6B 20 54 65 73 +74 20 66 72 6F 6D 20 56 65 65 52 20 45 4C 32 20 +20 21 21 0A 2D 2D 2D 2D 2D 2D 2D 2D 2D 2D 2D 2D +2D 2D 2D 2D 2D 2D 2D 2D 2D 2D 2D 2D 2D 2D 2D 2D +2D 2D 2D 2D 2D 2D 00 00 45 52 52 4F 52 3A 20 49 +43 43 4D 5F 4C 4F 43 4B 20 73 65 74 20 75 6E 65 +78 70 65 63 74 65 64 6C 79 21 00 00 43 6F 70 79 +69 6E 67 20 63 6F 64 65 20 66 72 6F 6D 20 25 78 +20 5B 74 68 72 6F 75 67 68 20 25 78 5D 20 74 6F +20 25 78 0A 00 00 00 00 61 74 20 25 78 3A 20 25 +78 0A 00 00 45 52 52 4F 52 3A 20 44 65 74 65 63 +74 65 64 20 69 6E 74 65 72 72 75 70 74 20 77 68 +69 6C 65 20 63 6F 70 79 69 6E 67 20 63 6F 64 65 +20 74 6F 20 75 6E 6C 6F 63 6B 65 64 20 49 43 43 +4D 21 00 00 45 52 52 4F 52 3A 20 46 69 72 73 74 +20 70 61 73 73 20 63 6F 64 65 20 65 78 65 63 75 +74 65 64 20 66 72 6F 6D 20 49 43 43 4D 20 64 75 +72 69 6E 67 20 73 65 63 6F 6E 64 20 70 61 73 73 +20 28 61 66 74 65 72 20 72 65 73 65 74 29 21 00 +43 6F 6D 70 61 72 69 6E 67 20 73 65 63 6F 6E 64 +20 70 61 73 73 20 6F 66 20 74 68 65 20 63 6F 70 +79 20 63 6F 64 65 20 66 72 6F 6D 20 25 78 20 5B +74 68 72 6F 75 67 68 20 25 78 5D 20 74 6F 20 25 +78 0A 00 00 45 52 52 4F 52 3A 20 52 65 61 64 73 +20 6D 69 73 6D 61 74 63 68 65 64 20 6F 6E 20 73 +65 63 6F 6E 64 20 70 61 73 73 00 00 43 6F 6D 70 +61 72 69 6E 67 20 66 69 72 73 74 20 70 61 73 73 +20 6F 66 20 74 68 65 20 63 6F 70 79 20 63 6F 64 +65 20 66 72 6F 6D 20 25 78 20 5B 74 68 72 6F 75 +67 68 20 25 78 5D 20 74 6F 20 25 78 0A 00 00 00 +45 52 52 4F 52 3A 20 52 65 61 64 73 20 6D 69 73 +6D 61 74 63 68 65 64 20 6F 6E 20 66 69 72 73 74 +20 70 61 73 73 00 00 00 45 52 52 4F 52 3A 20 44 +69 64 20 6E 6F 74 20 72 65 63 65 69 76 65 20 65 +78 70 65 63 74 65 64 20 4E 4D 49 20 77 68 69 6C +65 20 77 72 69 74 69 6E 67 20 74 6F 20 4C 6F 63 +6B 65 64 20 49 43 43 4D 21 00 00 00 49 6E 3A 73 +68 61 35 31 32 5F 61 63 63 5F 65 72 72 6F 72 00 +63 6E 74 5F 73 68 61 35 31 32 5F 61 63 63 5F 65 +72 72 6F 72 3A 25 78 0A 00 00 00 00 49 6E 3A 73 +68 61 32 35 36 5F 65 72 72 6F 72 00 63 6E 74 5F +73 68 61 32 35 36 5F 65 72 72 6F 72 3A 25 78 0A +00 00 00 00 49 6E 3A 73 68 61 35 31 32 5F 65 72 +72 6F 72 00 63 6E 74 5F 73 68 61 35 31 32 5F 65 +72 72 6F 72 3A 25 78 0A 00 00 00 00 49 6E 3A 6B +76 5F 6E 6F 74 69 66 00 63 6E 74 5F 6B 76 5F 6E +6F 74 69 66 3A 25 78 0A 00 00 00 00 49 6E 3A 6B +76 5F 65 72 72 6F 72 00 63 6E 74 5F 6B 76 5F 65 +72 72 6F 72 3A 25 78 0A 00 00 00 00 49 6E 3A 68 +6D 61 63 5F 65 72 72 6F 72 00 00 00 63 6E 74 5F +68 6D 61 63 5F 65 72 72 6F 72 3A 25 78 0A 00 00 +49 6E 3A 65 63 63 5F 65 72 72 6F 72 00 00 00 00 +63 6E 74 5F 65 63 63 5F 65 72 72 6F 72 3A 25 78 +0A 00 00 00 49 6E 3A 64 6F 65 5F 65 72 72 6F 72 +00 00 00 00 63 6E 74 5F 64 6F 65 5F 65 72 72 6F +72 3A 25 78 0A 00 00 00 49 6E 3A 30 00 00 00 00 +6D 63 61 75 73 65 3A 25 78 0A 00 00 49 6E 3A 73 +68 61 35 31 32 5F 61 63 63 5F 6E 6F 74 69 66 00 +63 6E 74 5F 73 68 61 35 31 32 5F 61 63 63 5F 6E +6F 74 69 66 3A 25 78 0A 00 00 00 00 62 61 64 20 +73 68 61 35 31 32 5F 61 63 63 5F 6E 6F 74 69 66 +5F 69 6E 74 72 20 73 74 73 3A 25 78 0A 00 00 00 +49 6E 3A 73 6F 63 5F 69 66 63 5F 6E 6F 74 69 66 +00 00 00 00 63 6E 74 5F 73 6F 63 5F 69 66 63 5F +6E 6F 74 69 66 3A 25 78 0A 00 00 00 62 61 64 20 +73 6F 63 5F 69 66 63 5F 6E 6F 74 69 66 5F 69 6E +74 72 20 73 74 73 3A 25 78 0A 00 00 49 6E 3A 73 +6F 63 5F 69 66 63 5F 65 72 72 6F 72 00 00 00 00 +63 6E 74 5F 73 6F 63 5F 69 66 63 5F 65 72 72 6F +72 3A 25 78 0A 00 00 00 62 61 64 20 73 6F 63 5F +69 66 63 5F 65 72 72 6F 72 5F 69 6E 74 72 20 73 +74 73 3A 25 78 0A 00 00 49 6E 3A 73 68 61 32 35 +36 5F 6E 6F 74 69 66 00 63 6E 74 5F 73 68 61 32 +35 36 5F 6E 6F 74 69 66 3A 25 78 0A 00 00 00 00 +62 61 64 20 73 68 61 32 35 36 5F 6E 6F 74 69 66 +5F 69 6E 74 72 20 73 74 73 3A 25 78 0A 00 00 00 +49 6E 3A 73 68 61 35 31 32 5F 6E 6F 74 69 66 00 +63 6E 74 5F 73 68 61 35 31 32 5F 6E 6F 74 69 66 +3A 25 78 0A 00 00 00 00 62 61 64 20 73 68 61 35 +31 32 5F 6E 6F 74 69 66 5F 69 6E 74 72 20 73 74 +73 3A 25 78 0A 00 00 00 49 6E 3A 68 6D 61 63 5F +6E 6F 74 69 66 00 00 00 63 6E 74 5F 68 6D 61 63 +5F 6E 6F 74 69 66 3A 25 78 0A 00 00 62 61 64 20 +68 6D 61 63 5F 6E 6F 74 69 66 5F 69 6E 74 72 20 +73 74 73 3A 25 78 0A 00 49 6E 3A 65 63 63 5F 6E +6F 74 69 66 00 00 00 00 63 6E 74 5F 65 63 63 5F +6E 6F 74 69 66 3A 25 78 0A 00 00 00 62 61 64 20 +65 63 63 5F 6E 6F 74 69 66 5F 69 6E 74 72 20 73 +74 73 3A 25 78 0A 00 00 49 6E 3A 64 6F 65 5F 6E +6F 74 69 66 00 00 00 00 63 6E 74 5F 64 6F 65 5F +6E 6F 74 69 66 3A 25 78 0A 00 00 00 62 61 64 20 +64 6F 65 5F 6E 6F 74 69 66 5F 69 6E 74 72 20 73 +74 73 3A 25 78 0A 00 00 44 6F 6E 65 20 68 61 6E +64 6C 69 6E 67 20 6D 61 63 68 69 6E 65 2D 6D 6F +64 65 20 54 49 4D 45 52 20 69 6E 74 65 72 72 75 +70 74 00 00 43 6F 72 20 45 72 72 6F 72 20 4C 6F +63 61 6C 20 49 53 52 00 49 6E 3A 53 74 64 20 45 +78 63 70 74 6E 0A 6D 63 61 75 73 65 3A 25 78 0A +00 00 00 00 55 6E 65 78 70 65 63 74 65 64 20 49 +6E 74 72 20 62 69 74 3A 25 78 0A 00 6D 73 63 61 +75 73 65 3A 25 78 0A 00 6D 65 70 63 3A 25 78 0A +00 00 00 00 6D 74 76 61 6C 3A 25 78 0A 00 00 00 +44 4F 45 3A 20 49 6E 69 74 00 00 00 44 4F 45 3A +20 57 72 69 74 69 6E 67 20 55 44 53 20 49 56 00 +44 4F 45 3A 20 53 74 61 72 74 69 6E 67 20 55 44 +53 20 44 65 6F 62 66 75 73 63 61 74 69 6F 6E 20 +66 6C 6F 77 00 00 00 00 44 4F 45 3A 20 55 44 53 +20 44 65 6F 62 66 75 73 63 61 74 69 6F 6E 20 66 +6C 6F 77 20 63 6F 6D 70 6C 65 74 65 00 00 00 00 +44 4F 45 3A 20 57 72 69 74 69 6E 67 20 46 69 65 +6C 64 20 45 6E 74 72 6F 70 79 20 49 56 00 00 00 +44 4F 45 3A 20 53 74 61 72 74 69 6E 67 20 46 69 +65 6C 64 20 45 6E 74 72 6F 70 79 20 44 65 6F 62 +66 75 73 63 61 74 69 6F 6E 20 66 6C 6F 77 00 00 +44 4F 45 3A 20 46 69 65 6C 64 20 45 6E 74 72 6F +70 79 20 44 65 6F 62 66 75 73 63 61 74 69 6F 6E +20 66 6C 6F 77 20 63 6F 6D 70 6C 65 74 65 00 00 +44 4F 45 3A 20 43 6C 65 61 72 20 73 65 63 72 65 +74 73 00 00 45 43 43 20 66 6C 6F 77 20 69 6E 20 +70 72 6F 67 72 65 73 73 2E 2E 2E 00 52 65 63 65 +69 76 65 64 20 45 43 43 20 6E 6F 74 69 66 20 69 +6E 74 72 20 77 69 74 68 20 73 74 61 74 75 73 20 +3D 20 25 64 0A 00 00 00 45 43 43 20 7A 65 72 6F +69 7A 65 20 66 6C 6F 77 2E 00 00 00 0A 45 43 43 +20 4B 45 59 47 45 4E 00 57 61 69 74 20 66 6F 72 +20 4B 56 20 77 72 69 74 65 00 00 00 4C 6F 61 64 +20 50 52 49 56 4B 45 59 20 64 61 74 61 20 66 72 +6F 6D 20 45 43 43 00 00 41 74 20 6F 66 66 73 65 +74 20 5B 25 64 5D 2C 20 65 63 63 5F 70 72 69 76 +6B 65 79 20 64 61 74 61 20 6D 69 73 6D 61 74 63 +68 21 0A 00 41 63 74 75 61 6C 20 20 20 64 61 74 +61 3A 20 30 78 25 78 0A 00 00 00 00 45 78 70 65 +63 74 65 64 20 64 61 74 61 3A 20 30 78 25 78 0A +00 00 00 00 4C 6F 61 64 20 50 55 42 4B 45 59 5F +58 20 64 61 74 61 20 66 72 6F 6D 20 45 43 43 00 +41 74 20 6F 66 66 73 65 74 20 5B 25 64 5D 2C 20 +65 63 63 5F 70 75 62 6B 65 79 5F 78 20 64 61 74 +61 20 6D 69 73 6D 61 74 63 68 21 0A 00 00 00 00 +4C 6F 61 64 20 50 55 42 4B 45 59 5F 59 20 64 61 +74 61 20 66 72 6F 6D 20 45 43 43 00 41 74 20 6F +66 66 73 65 74 20 5B 25 64 5D 2C 20 65 63 63 5F +70 75 62 6B 65 79 5F 79 20 64 61 74 61 20 6D 69 +73 6D 61 74 63 68 21 0A 00 00 00 00 49 6E 6A 65 +63 74 20 50 52 49 56 4B 45 59 20 66 72 6F 6D 20 +6B 76 20 74 6F 20 45 43 43 00 00 00 0A 45 43 43 +20 53 49 47 4E 49 4E 47 00 00 00 00 4C 6F 61 64 +20 53 49 47 4E 5F 52 20 64 61 74 61 20 66 72 6F +6D 20 45 43 43 00 00 00 41 74 20 6F 66 66 73 65 +74 20 5B 25 64 5D 2C 20 65 63 63 5F 73 69 67 6E +5F 72 20 64 61 74 61 20 6D 69 73 6D 61 74 63 68 +21 0A 00 00 4C 6F 61 64 20 53 49 47 4E 5F 53 20 +64 61 74 61 20 66 72 6F 6D 20 45 43 43 00 00 00 +41 74 20 6F 66 66 73 65 74 20 5B 25 64 5D 2C 20 +65 63 63 5F 73 69 67 6E 5F 73 20 64 61 74 61 20 +6D 69 73 6D 61 74 63 68 21 0A 00 00 0A 45 43 43 +20 56 45 52 49 46 59 49 4E 47 00 00 4C 6F 61 64 +20 56 45 52 49 46 59 5F 52 20 64 61 74 61 20 66 +72 6F 6D 20 45 43 43 00 41 74 20 6F 66 66 73 65 +74 20 5B 25 64 5D 2C 20 65 63 63 5F 76 65 72 69 +66 79 5F 72 20 64 61 74 61 20 6D 69 73 6D 61 74 +63 68 21 0A 00 00 00 00 0A 45 43 43 20 50 43 52 +20 53 49 47 4E 49 4E 47 00 00 00 00 48 4D 41 43 +20 66 6C 6F 77 20 69 6E 20 70 72 6F 67 72 65 73 +73 2E 2E 2E 00 00 00 00 52 65 63 65 69 76 65 64 +20 48 4D 41 43 20 6E 6F 74 69 66 20 69 6E 74 72 +20 77 69 74 68 20 73 74 61 74 75 73 20 3D 20 25 +64 0A 00 00 48 4D 41 43 20 7A 65 72 6F 69 7A 65 +20 66 6C 6F 77 2E 00 00 4C 6F 61 64 20 4B 65 79 +20 64 61 74 61 20 74 6F 20 48 4D 41 43 00 00 00 +4C 6F 61 64 20 54 41 47 20 64 61 74 61 20 66 72 +6F 6D 20 48 4D 41 43 20 74 6F 20 4B 56 00 00 00 +4C 6F 61 64 20 54 41 47 20 64 61 74 61 20 66 72 +6F 6D 20 48 4D 41 43 00 41 74 20 6F 66 66 73 65 +74 20 5B 25 64 5D 2C 20 68 6D 61 63 5F 74 61 67 +20 64 61 74 61 20 6D 69 73 6D 61 74 63 68 21 0A +00 00 00 00 4B 56 3A 20 63 68 65 63 6B 69 6E 67 +20 66 6F 72 20 65 72 72 6F 72 73 00 4B 56 20 45 +52 52 4F 52 00 00 00 00 4B 56 3A 20 70 72 6F 67 +20 6B 76 20 72 65 61 64 20 63 74 72 6C 00 00 00 +4B 56 3A 20 70 72 6F 67 20 6B 76 20 77 72 69 74 +65 20 63 74 72 6C 00 00 50 56 3A 20 70 72 6F 67 +20 6B 76 20 72 65 61 64 20 63 74 72 6C 20 69 6E +20 53 48 41 20 74 6F 20 64 6F 20 68 61 73 68 20 +65 78 74 65 6E 64 00 00 43 54 52 4C 00 00 00 00 +2D 2D 2D 2D 2D 2D 2D 2D 2D 2D 2D 2D 2D 2D 2D 2D +2D 2D 2D 2D 2D 2D 2D 2D 2D 2D 2D 2D 2D 2D 2D 00 +20 20 25 34 30 73 3A 20 30 78 25 2D 33 78 0A 00 +53 54 49 43 4B 59 44 41 54 41 56 41 55 4C 54 43 +54 52 4C 00 53 54 49 43 4B 59 5F 44 41 54 41 5F +56 41 55 4C 54 5F 45 4E 54 52 59 5F 30 00 00 00 +53 54 49 43 4B 59 5F 44 41 54 41 5F 56 41 55 4C +54 5F 45 4E 54 52 59 5F 31 00 00 00 53 54 49 43 +4B 59 5F 44 41 54 41 5F 56 41 55 4C 54 5F 45 4E +54 52 59 5F 32 00 00 00 53 54 49 43 4B 59 5F 44 +41 54 41 5F 56 41 55 4C 54 5F 45 4E 54 52 59 5F +33 00 00 00 53 54 49 43 4B 59 5F 44 41 54 41 5F +56 41 55 4C 54 5F 45 4E 54 52 59 5F 34 00 00 00 +53 54 49 43 4B 59 5F 44 41 54 41 5F 56 41 55 4C +54 5F 45 4E 54 52 59 5F 35 00 00 00 53 54 49 43 +4B 59 5F 44 41 54 41 5F 56 41 55 4C 54 5F 45 4E +54 52 59 5F 36 00 00 00 53 54 49 43 4B 59 5F 44 +41 54 41 5F 56 41 55 4C 54 5F 45 4E 54 52 59 5F +37 00 00 00 53 54 49 43 4B 59 5F 44 41 54 41 5F +56 41 55 4C 54 5F 45 4E 54 52 59 5F 38 00 00 00 +53 54 49 43 4B 59 5F 44 41 54 41 5F 56 41 55 4C +54 5F 45 4E 54 52 59 5F 39 00 00 00 4E 4F 4E 53 +54 49 43 4B 59 44 41 54 41 56 41 55 4C 54 43 54 +52 4C 00 00 4E 4F 4E 53 54 49 43 4B 59 5F 44 41 +54 41 5F 56 41 55 4C 54 5F 45 4E 54 52 59 5F 30 +00 00 00 00 4E 4F 4E 53 54 49 43 4B 59 5F 44 41 +54 41 5F 56 41 55 4C 54 5F 45 4E 54 52 59 5F 31 +00 00 00 00 4E 4F 4E 53 54 49 43 4B 59 5F 44 41 +54 41 5F 56 41 55 4C 54 5F 45 4E 54 52 59 5F 32 +00 00 00 00 4E 4F 4E 53 54 49 43 4B 59 5F 44 41 +54 41 5F 56 41 55 4C 54 5F 45 4E 54 52 59 5F 33 +00 00 00 00 4E 4F 4E 53 54 49 43 4B 59 5F 44 41 +54 41 5F 56 41 55 4C 54 5F 45 4E 54 52 59 5F 34 +00 00 00 00 4E 4F 4E 53 54 49 43 4B 59 5F 44 41 +54 41 5F 56 41 55 4C 54 5F 45 4E 54 52 59 5F 35 +00 00 00 00 4E 4F 4E 53 54 49 43 4B 59 5F 44 41 +54 41 5F 56 41 55 4C 54 5F 45 4E 54 52 59 5F 36 +00 00 00 00 4E 4F 4E 53 54 49 43 4B 59 5F 44 41 +54 41 5F 56 41 55 4C 54 5F 45 4E 54 52 59 5F 37 +00 00 00 00 4E 4F 4E 53 54 49 43 4B 59 5F 44 41 +54 41 5F 56 41 55 4C 54 5F 45 4E 54 52 59 5F 38 +00 00 00 00 4E 4F 4E 53 54 49 43 4B 59 5F 44 41 +54 41 5F 56 41 55 4C 54 5F 45 4E 54 52 59 5F 39 +00 00 00 00 4E 4F 4E 53 54 49 43 4B 59 5F 4C 4F +43 4B 41 42 4C 45 5F 53 43 52 41 54 43 48 52 45 +47 5F 43 54 52 4C 00 00 4E 4F 4E 53 54 49 43 4B +59 5F 4C 4F 43 4B 41 42 4C 45 5F 53 43 52 41 54 +43 48 52 45 47 00 00 00 4E 4F 4E 53 54 49 43 4B +59 5F 47 45 4E 45 52 49 43 5F 53 43 52 41 54 43 +48 52 45 47 00 00 00 00 53 54 49 43 4B 59 5F 4C +4F 43 4B 41 42 4C 45 5F 53 43 52 41 54 43 48 52 +45 47 5F 43 54 52 4C 00 53 54 49 43 4B 59 5F 4C +4F 43 4B 41 42 4C 45 5F 53 43 52 41 54 43 48 52 +45 47 00 00 53 48 41 32 35 36 20 66 6C 6F 77 20 +69 6E 20 70 72 6F 67 72 65 73 73 2E 2E 2E 00 00 +52 65 63 65 69 76 65 64 20 53 48 41 32 35 36 20 +6E 6F 74 69 66 20 69 6E 74 72 20 77 69 74 68 20 +73 74 61 74 75 73 20 3D 20 25 64 0A 00 00 00 00 +53 48 41 32 35 36 20 7A 65 72 6F 69 7A 65 20 66 +6C 6F 77 2E 00 00 00 00 45 6E 61 62 6C 65 20 53 +48 41 32 35 36 00 00 00 4C 6F 61 64 20 44 49 47 +45 53 54 20 64 61 74 61 20 66 72 6F 6D 20 53 48 +41 32 35 36 00 00 00 00 41 74 20 6F 66 66 73 65 +74 20 5B 25 64 5D 2C 20 73 68 61 5F 64 69 67 65 +73 74 20 64 61 74 61 20 6D 69 73 6D 61 74 63 68 +21 0A 00 00 53 48 41 35 31 32 20 66 6C 6F 77 20 +69 6E 20 70 72 6F 67 72 65 73 73 2E 2E 2E 00 00 +52 65 63 65 69 76 65 64 20 53 48 41 35 31 32 20 +6E 6F 74 69 66 20 69 6E 74 72 20 77 69 74 68 20 +73 74 61 74 75 73 20 3D 20 25 64 0A 00 00 00 00 +53 48 41 35 31 32 3A 20 53 65 74 20 6D 6F 64 65 +3A 20 30 78 25 78 20 61 6E 64 20 69 6E 69 74 0A +00 00 00 00 53 48 41 35 31 32 3A 20 53 65 74 20 +6D 6F 64 65 3A 20 30 78 25 78 20 61 6E 64 20 6E +65 78 74 0A 00 00 00 00 53 48 41 35 31 32 3A 20 +53 65 74 20 6D 6F 64 65 3A 20 30 78 25 78 20 61 +6E 64 20 69 6E 69 74 20 77 69 74 68 20 6C 61 73 +74 0A 00 00 53 48 41 35 31 32 3A 20 53 65 74 20 +6D 6F 64 65 3A 20 30 78 25 78 20 61 6E 64 20 6E +65 78 74 20 77 69 74 68 20 6C 61 73 74 0A 00 00 +53 48 41 35 31 32 3A 20 53 65 74 20 53 54 41 52 +54 20 66 6F 72 20 67 65 6E 20 68 61 73 68 20 66 +75 6E 63 00 63 68 65 63 6B 20 64 69 67 65 73 74 +00 00 00 00 4C 6F 61 64 20 44 49 47 45 53 54 20 +64 61 74 61 20 66 72 6F 6D 20 53 48 41 33 38 34 +00 00 00 00 53 48 41 35 31 32 20 7A 65 72 6F 69 +7A 65 20 66 6C 6F 77 2E 00 00 00 00 45 6E 61 62 +6C 65 20 53 48 41 35 31 32 00 00 00 4C 6F 61 64 +20 44 49 47 45 53 54 20 64 61 74 61 20 66 72 6F +6D 20 53 48 41 35 31 32 00 00 00 00 53 4F 43 5F +49 46 43 3A 20 43 6C 65 61 72 20 65 78 65 63 75 +74 65 20 72 65 67 00 00 53 4F 43 5F 49 46 43 3A +20 53 65 74 20 6D 62 6F 78 5F 73 74 61 74 75 73 +20 66 69 65 6C 64 3A 20 30 78 25 78 0A 00 00 00 +53 4F 43 5F 49 46 43 3A 20 53 65 74 20 66 6C 6F +77 5F 73 74 61 74 75 73 20 66 69 65 6C 64 3A 20 +30 78 25 78 0A 00 00 00 53 4F 43 5F 49 46 43 3A +20 43 6C 65 61 72 20 53 48 41 20 61 63 63 65 6C +65 72 61 74 6F 72 20 6C 6F 63 6B 20 62 79 20 77 +72 69 74 69 6E 67 20 27 31 3A 20 30 78 25 78 0A +00 00 00 00 53 4F 43 5F 49 46 43 3A 20 42 61 64 +20 66 69 65 6C 64 20 76 61 6C 75 65 00 00 00 00 +53 4F 43 5F 49 46 43 3A 20 43 6C 65 61 72 20 66 +6C 6F 77 5F 73 74 61 74 75 73 20 66 69 65 6C 64 +3A 20 30 78 25 78 0A 00 53 4F 43 5F 49 46 43 3A +20 43 4D 44 20 66 72 6F 6D 20 6D 61 69 6C 62 6F +78 3A 20 30 78 25 78 0A 00 00 00 00 53 4F 43 5F +49 46 43 3A 20 44 4C 45 4E 20 66 72 6F 6D 20 6D +61 69 6C 62 6F 78 3A 20 30 78 25 78 0A 00 00 00 +53 4F 43 5F 49 46 43 3A 20 42 65 67 69 6E 6E 69 +6E 67 20 6D 62 6F 78 20 66 77 20 66 6C 6F 77 00 +46 41 54 41 4C 3A 20 49 6E 76 61 6C 69 64 20 64 +6C 65 6E 20 70 61 73 73 65 64 20 74 6F 20 6D 62 +6F 78 20 66 77 20 66 6C 6F 77 3A 20 30 78 25 78 +0A 00 00 00 46 41 54 41 4C 3A 20 49 6E 76 61 6C +69 64 20 63 6D 64 20 70 61 73 73 65 64 20 74 6F +20 6D 62 6F 78 20 66 77 20 66 6C 6F 77 3A 20 30 +78 25 78 0A 00 00 00 00 46 6F 75 6E 64 20 69 6E +76 61 6C 69 64 20 69 63 63 6D 20 73 69 7A 65 20 +69 6E 20 66 69 72 6D 77 61 72 65 20 69 6D 61 67 +65 20 72 65 63 65 69 76 65 64 20 66 72 6F 6D 20 +53 4F 43 21 20 4D 61 78 20 65 78 70 65 63 74 65 +64 20 30 78 25 78 2C 20 67 6F 74 20 30 78 25 78 +0A 00 00 00 53 4F 43 5F 49 46 43 3A 20 43 70 20 +74 6F 20 49 43 43 4D 00 46 6F 75 6E 64 20 69 6E +76 61 6C 69 64 20 64 63 63 6D 20 73 69 7A 65 20 +69 6E 20 66 69 72 6D 77 61 72 65 20 69 6D 61 67 +65 20 72 65 63 65 69 76 65 64 20 66 72 6F 6D 20 +53 4F 43 21 20 4D 61 78 20 65 78 70 65 63 74 65 +64 20 30 78 25 78 2C 20 67 6F 74 20 30 78 25 78 +0A 00 00 00 53 4F 43 5F 49 46 43 3A 20 43 70 20 +74 6F 20 44 43 43 4D 00 43 6F 70 79 69 6E 67 20 +63 6F 64 65 20 66 72 6F 6D 20 6D 61 69 6C 62 6F +78 20 74 6F 20 49 43 43 4D 00 00 00 53 4F 43 5F +49 46 43 3A 20 53 65 74 20 66 77 20 75 70 64 61 +74 65 20 72 65 73 65 74 00 00 00 00 45 6E 61 62 +6C 69 6E 67 20 69 6E 74 65 72 6E 61 6C 20 74 69 +6D 65 72 30 20 61 6E 64 20 68 61 6C 74 69 6E 67 +20 63 6F 72 65 00 00 00 F8 03 01 50 +@00006E64 +F8 03 01 50 +@00006E68 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 diff --git a/src/integration/test_suites/infinite_loop/caliptra_isr.h b/src/integration/test_suites/infinite_loop/caliptra_isr.h new file mode 100644 index 000000000..7bd443326 --- /dev/null +++ b/src/integration/test_suites/infinite_loop/caliptra_isr.h @@ -0,0 +1,90 @@ +// SPDX-License-Identifier: Apache-2.0 +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// --------------------------------------------------------------------- +// File: caliptra_isr.h +// Description: +// Dummy ISRs +// --------------------------------------------------------------------- + +#ifndef CALIPTRA_ISR_H +#define CALIPTRA_ISR_H + +#include "caliptra_defines.h" +#include + +/* --------------- symbols/typedefs --------------- */ + +typedef struct { + uint32_t doe_error; + uint32_t doe_notif; + uint32_t ecc_error; + uint32_t ecc_notif; + uint32_t hmac_error; + uint32_t hmac_notif; + uint32_t kv_error; + uint32_t kv_notif; + uint32_t sha512_error; + uint32_t sha512_notif; + uint32_t sha256_error; + uint32_t sha256_notif; + uint32_t qspi_error; + uint32_t qspi_notif; + uint32_t uart_error; + uint32_t uart_notif; + uint32_t i3c_error; + uint32_t i3c_notif; + uint32_t soc_ifc_error; + uint32_t soc_ifc_notif; + uint32_t sha512_acc_error; + uint32_t sha512_acc_notif; +} caliptra_intr_received_s; + +////////////////////////////////////////////////////////////////////////////// +// Function Declarations + +inline void service_doe_error_intr() {return;} +inline void service_doe_notif_intr() {return;} + +inline void service_ecc_error_intr() {return;} +inline void service_ecc_notif_intr() {return;} + +inline void service_hmac_error_intr() {return;} +inline void service_hmac_notif_intr() {return;} + +inline void service_kv_error_intr() {return;} +inline void service_kv_notif_intr() {return;} + +inline void service_sha512_error_intr() {return;} +inline void service_sha512_notif_intr() {return;} + +inline void service_sha256_error_intr() {return;} +inline void service_sha256_notif_intr() {return;} + +inline void service_qspi_error_intr() {return;} +inline void service_qspi_notif_intr() {return;} + +inline void service_uart_error_intr() {return;} +inline void service_uart_notif_intr() {return;} + +inline void service_i3c_error_intr() {return;} +inline void service_i3c_notif_intr() {return;} + +inline void service_soc_ifc_error_intr() {return;} +inline void service_soc_ifc_notif_intr () {return;} + +inline void service_sha512_acc_error_intr() {return;} +inline void service_sha512_acc_notif_intr() {return;} + +#endif //CALIPTRA_ISR_H diff --git a/src/integration/test_suites/infinite_loop/dump_and_compare.sh b/src/integration/test_suites/infinite_loop/dump_and_compare.sh new file mode 100755 index 000000000..594703ba0 --- /dev/null +++ b/src/integration/test_suites/infinite_loop/dump_and_compare.sh @@ -0,0 +1,26 @@ +#!/bin/bash +# SPDX-License-Identifier: Apache-2.0 +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +set -ex + +# Invoke GDB and dump core registers +riscv64-unknown-elf-gdb -n --batch -x dump_registers.gdb >gdb.log +# Parse the log, extract register values. Skip those which change as the +# program executes since we don't know at which point we tap in. +cat gdb.log | grep -E '^ra |^sp |^gp |^tp |^t[01256] |^s[0-9]+ |^a[0-9]+ |^\$[0-9]+' >regdump.txt + +# Compare the dumps +diff -E -y regdump_golden.txt regdump.txt + diff --git a/src/integration/test_suites/infinite_loop/dump_registers.gdb b/src/integration/test_suites/infinite_loop/dump_registers.gdb new file mode 100644 index 000000000..6e491afd5 --- /dev/null +++ b/src/integration/test_suites/infinite_loop/dump_registers.gdb @@ -0,0 +1,24 @@ +# SPDX-License-Identifier: Apache-2.0 +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +echo Connecting to OpenOCD...\n +set architecture riscv:rv32 +set remotetimeout 30 +target extended-remote :3333 + +echo Connected, waiting...\n +shell sleep 30s + +echo Dumping registers...\n +info registers diff --git a/src/integration/test_suites/infinite_loop/infinite_loop.s b/src/integration/test_suites/infinite_loop/infinite_loop.s new file mode 100644 index 000000000..4a3753157 --- /dev/null +++ b/src/integration/test_suites/infinite_loop/infinite_loop.s @@ -0,0 +1,62 @@ +// SPDX-License-Identifier: Apache-2.0 +// +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +#include "caliptra_defines.h" + +.set mfdc, 0x7f9 + +// Code to execute +.section .text +.global _start +_start: + + // Enable Caches in MRAC + li x1, 0xaaaaaaaa + csrw 0x7c0, x1 + + li x3, 4 + csrw mfdc, x3 // disable store merging + + // Set some register values + li x1, 0x12345678 + li x2, 0xABCDEF00 + li x3, 0xCAFEBABA + li x4, 0xDEADBEEF + li x5, 0x05050505 + li x6, 0xA0A0A0A0 + li x7, 0x00FF00FF + li x8, 0xCC00CC00 + + // Simple infinite loop program with inner and outer loop + li t3, 0 +outer: + addi t3, t3, 1 + li t4, 123 +inner: + addi t4, t4, -1 + bne t4, zero, inner + jal x0, outer + +.section .dccm +.global stdout +stdout: .word STDOUT +.global verbosity_g +verbosity_g: .word 2 + +.global intr_count +intr_count: .word 0 +.global cptra_intr_rcv +cptra_intr_rcv: .word 0 diff --git a/src/integration/test_suites/infinite_loop/infinite_loop.yml b/src/integration/test_suites/infinite_loop/infinite_loop.yml new file mode 100755 index 000000000..89d86fb13 --- /dev/null +++ b/src/integration/test_suites/infinite_loop/infinite_loop.yml @@ -0,0 +1,17 @@ +# SPDX-License-Identifier: Apache-2.0 +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +--- +seed: 1 +testname: infinite_loop diff --git a/src/integration/test_suites/infinite_loop/mem_access.gdb b/src/integration/test_suites/infinite_loop/mem_access.gdb new file mode 100644 index 000000000..9c72da922 --- /dev/null +++ b/src/integration/test_suites/infinite_loop/mem_access.gdb @@ -0,0 +1,38 @@ +# SPDX-License-Identifier: Apache-2.0 +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +echo Connecting to OpenOCD...\n +set architecture riscv:rv32 +set remotetimeout 30 +target extended-remote :3333 + +echo Connected, waiting...\n +shell sleep 5s + +echo Accessing DCCM...\n +set *(0x50000000) = 0xCAFEBABA +set *(0x50000004) = 0xDEADBEEF +set *(0x50000008) = 0xFEEDBACA +set *(0x5000000C) = 0xA5A5A5A5 +print/x *0x50000000@4 + +echo Accessing ICCM...\n +set *(0x40000100) = 0x01234567 +set *(0x40000104) = 0x89ABCDEF +set *(0x40000108) = 0x55555555 +set *(0x4000010C) = 0xAAAAAAAA +print/x *0x40000100@4 + +echo Accessing ROM...\n +print/x *0x00000000@8 diff --git a/src/integration/test_suites/infinite_loop/mem_access.sh b/src/integration/test_suites/infinite_loop/mem_access.sh new file mode 100755 index 000000000..d800cc099 --- /dev/null +++ b/src/integration/test_suites/infinite_loop/mem_access.sh @@ -0,0 +1,25 @@ +#!/bin/bash +# SPDX-License-Identifier: Apache-2.0 +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +set -ex + +# Invoke GDB +riscv64-unknown-elf-gdb -n --batch -x mem_access.gdb >gdb.log +# Parse the log +cat gdb.log | grep -E '^\$[0-9]+' >out.txt + +# Compare the dumps +diff -E -y mem_access_golden.txt out.txt + diff --git a/src/integration/test_suites/infinite_loop/mem_access_golden.txt b/src/integration/test_suites/infinite_loop/mem_access_golden.txt new file mode 100644 index 000000000..1f6b00925 --- /dev/null +++ b/src/integration/test_suites/infinite_loop/mem_access_golden.txt @@ -0,0 +1,3 @@ +$1 = {0xcafebaba, 0xdeadbeef, 0xfeedbaca, 0xa5a5a5a5} +$2 = {0x1234567, 0x89abcdef, 0x55555555, 0xaaaaaaaa} +$3 = {0xaaaab0b7, 0xaaa08093, 0x7c009073, 0x90734191, 0x50b77f91, 0x80931234, 0xf1376780, 0x7111abcd} diff --git a/src/integration/test_suites/infinite_loop/peripheral_access.gdb b/src/integration/test_suites/infinite_loop/peripheral_access.gdb new file mode 100644 index 000000000..473466eeb --- /dev/null +++ b/src/integration/test_suites/infinite_loop/peripheral_access.gdb @@ -0,0 +1,44 @@ +# SPDX-License-Identifier: Apache-2.0 +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +echo Connecting to OpenOCD...\n +set architecture riscv:rv32 +set remotetimeout 30 +target extended-remote :3333 + +echo Connected, waiting...\n +shell sleep 5s + +echo Accessing ECC...\n +print/x *0x10008000@2 +print/x *0x10008008@2 + +echo Accessing HMAC...\n +print/x *0x10010000@2 +print/x *0x10010008@2 + +echo Accessing SHA512...\n +print/x *0x10020000@2 +print/x *0x10020008@2 + +echo Accessing SHA256...\n +print/x *0x10028000@2 +print/x *0x10028008@2 + +echo Writing and reading DOE IV...\n +set *(0x10000000) = 0xCAFEBABA +set *(0x10000004) = 0xDEADBEEF +set *(0x10000008) = 0xD0ED0E00 +print/x *0x10000000@3 + diff --git a/src/integration/test_suites/infinite_loop/peripheral_access.sh b/src/integration/test_suites/infinite_loop/peripheral_access.sh new file mode 100755 index 000000000..1f9d83cf5 --- /dev/null +++ b/src/integration/test_suites/infinite_loop/peripheral_access.sh @@ -0,0 +1,25 @@ +#!/bin/bash +# SPDX-License-Identifier: Apache-2.0 +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +set -ex + +# Invoke GDB +riscv64-unknown-elf-gdb -n --batch -x peripheral_access.gdb >gdb.log +# Parse the log +cat gdb.log | grep -E '^\$[0-9]+' >out.txt + +# Compare the dumps +diff -E -y peripheral_access_golden.txt out.txt + diff --git a/src/integration/test_suites/infinite_loop/peripheral_access.tcl b/src/integration/test_suites/infinite_loop/peripheral_access.tcl new file mode 100644 index 000000000..d6bf70d37 --- /dev/null +++ b/src/integration/test_suites/infinite_loop/peripheral_access.tcl @@ -0,0 +1,83 @@ +# SPDX-License-Identifier: Apache-2.0 +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +init + +proc compare {x y} { + puts "'$x' vs. '$y'" + + if {[llength $y] != [llength $y]} { + puts "length mismatch!" + return -1 + } + + for {set i 0} {$i < [llength $x]} {incr i} { + if {[lindex $x $i] != [lindex $y $i]} { + puts "item $i mismatch!" + return -1 + } + } + + return 0 +} + +# Manually read dmstatus and check if the core is actually held in external +# reset. In the expected state bits anyunavail allrunning anyrunning allhalted +# and anyhalted should be cleared. +set val [riscv dmi_read 0x11] +puts "dmstatus: $val" + +if { ($val & 0x00000F00) != 0 } { + echo "The core is not held in reset!" + shutdown error +} + +echo "Accessing ECC..." +set golden { 0x63707365 0x38342d33 0x3030312e 0x0 } +set actual [ read_memory 0x10008000 32 4 phys ] +if {[compare $actual $golden] != 0} { + shutdown error +} + +echo "Accessing HMAC..." +set golden { 0x6163686d 0x61327368 0x3030312e 0x0 } +set actual [ read_memory 0x10010000 32 4 phys ] +if {[compare $actual $golden] != 0} { + shutdown error +} + +echo "Accessing SHA512..." +set golden { 0x61327368 0x31322d35 0x3830302e 0x0 } +set actual [ read_memory 0x10020000 32 4 phys ] +if {[compare $actual $golden] != 0} { + shutdown error +} + +echo "Accessing SHA256..." +set golden { 0x61327368 0x35362d32 0x3830312e 0x0 } +set actual [ read_memory 0x10028000 32 4 phys ] +if {[compare $actual $golden] != 0} { + shutdown error +} + +echo "Writing and reading DOE IV..." +set golden { 0xCAFEBABA 0xDEADBEEF 0xD0ED0E00 } +write_memory 0x10000000 32 $golden phys +set actual [ read_memory 0x10000000 32 3 phys ] +if {[compare $actual $golden] != 0} { + shutdown error +} + +# Success +shutdown diff --git a/src/integration/test_suites/infinite_loop/peripheral_access_golden.txt b/src/integration/test_suites/infinite_loop/peripheral_access_golden.txt new file mode 100644 index 000000000..2c9759e24 --- /dev/null +++ b/src/integration/test_suites/infinite_loop/peripheral_access_golden.txt @@ -0,0 +1,9 @@ +$1 = {0x63707365, 0x38342d33} +$2 = {0x3030312e, 0x0} +$3 = {0x6163686d, 0x61327368} +$4 = {0x3030312e, 0x0} +$5 = {0x61327368, 0x31322d35} +$6 = {0x3830302e, 0x0} +$7 = {0x61327368, 0x35362d32} +$8 = {0x3830312e, 0x0} +$9 = {0xcafebaba, 0xdeadbeef, 0xd0ed0e00} diff --git a/src/integration/test_suites/infinite_loop/regdump_golden.txt b/src/integration/test_suites/infinite_loop/regdump_golden.txt new file mode 100644 index 000000000..27196e7d5 --- /dev/null +++ b/src/integration/test_suites/infinite_loop/regdump_golden.txt @@ -0,0 +1,28 @@ +ra 0x12345678 0x12345678 +sp 0xabcdef00 0xabcdef00 +gp 0xcafebaba 0xcafebaba +tp 0xdeadbeef 0xdeadbeef +t0 0x5050505 84215045 +t1 0xa0a0a0a0 -1600085856 +t2 0xff00ff 16711935 +s1 0x0 0 +a0 0x0 0 +a1 0x0 0 +a2 0x0 0 +a3 0x0 0 +a4 0x0 0 +a5 0x0 0 +a6 0x0 0 +a7 0x0 0 +s2 0x0 0 +s3 0x0 0 +s4 0x0 0 +s5 0x0 0 +s6 0x0 0 +s7 0x0 0 +s8 0x0 0 +s9 0x0 0 +s10 0x0 0 +s11 0x0 0 +t5 0x0 0 +t6 0x0 0 diff --git a/src/integration/test_suites/libs/caliptra_isr/caliptra_isr.c b/src/integration/test_suites/libs/caliptra_isr/caliptra_isr.c index 9753de607..fe7f4783e 100644 --- a/src/integration/test_suites/libs/caliptra_isr/caliptra_isr.c +++ b/src/integration/test_suites/libs/caliptra_isr/caliptra_isr.c @@ -19,9 +19,13 @@ #include "veer-csr.h" #include "riscv-interrupts.h" #include "printf.h" +#include "riscv_hw_if.h" extern volatile uint32_t intr_count; +#ifdef RV_EXCEPTION_STRUCT +extern volatile rv_exception_struct_s exc_flag; +#endif ////////////////////////////////////////////////////////////////////////////// // Function Declarations @@ -38,14 +42,15 @@ void std_rv_mtvec_exception(void) __attribute__ ((interrupt ("machine"), aligned // "External Interrupts" are also included in this unimplemented list, just because the // std_rv_isr_vector_table should never reroute to External Interrupts -- Fast // Redirect takes care of that separately -void std_rv_nop_machine(void) __attribute__ ((interrupt ("machine"), aligned(4))); -void std_rv_mtvec_mei(void) __attribute__ ((interrupt ("machine") , aligned(4) , weak, alias("std_rv_nop_machine") )); -void std_rv_mtvec_msi(void) __attribute__ ((interrupt ("machine") , aligned(4) , weak, alias("std_rv_nop_machine") )); -void std_rv_mtvec_mti(void) __attribute__ ((interrupt ("machine") , aligned(4) , weak, alias("std_rv_nop_machine") )); -void std_rv_mtvec_miti0(void) __attribute__ ((interrupt ("machine") , aligned(4) )); -void std_rv_mtvec_sei(void) __attribute__ ((interrupt ("machine") , aligned(4) , weak, alias("std_rv_nop_machine") )); -void std_rv_mtvec_ssi(void) __attribute__ ((interrupt ("machine") , aligned(4) , weak, alias("std_rv_nop_machine") )); -void std_rv_mtvec_sti(void) __attribute__ ((interrupt ("machine") , aligned(4) , weak, alias("std_rv_nop_machine") )); +void std_rv_nop_machine(void) __attribute__ ((interrupt ("machine") , aligned(4))); +void std_rv_mtvec_mei(void) __attribute__ ((interrupt ("machine") , aligned(4) , weak, alias("std_rv_nop_machine") )); +void std_rv_mtvec_msi(void) __attribute__ ((interrupt ("machine") , aligned(4) , weak, alias("std_rv_nop_machine") )); +void std_rv_mtvec_mti(void) __attribute__ ((interrupt ("machine") , aligned(4) )); +void std_rv_mtvec_sei(void) __attribute__ ((interrupt ("machine") , aligned(4) , weak, alias("std_rv_nop_machine") )); +void std_rv_mtvec_ssi(void) __attribute__ ((interrupt ("machine") , aligned(4) , weak, alias("std_rv_nop_machine") )); +void std_rv_mtvec_sti(void) __attribute__ ((interrupt ("machine") , aligned(4) , weak, alias("std_rv_nop_machine") )); +void nonstd_veer_mtvec_miti0(void)__attribute__ ((interrupt ("machine") , aligned(4) )); +void nonstd_veer_mtvec_mcei(void) __attribute__ ((interrupt ("machine") , aligned(4) )); // VeeR Per-Source Vectored ISR functions @@ -87,12 +92,12 @@ static void (* const nonstd_veer_isr_9 ) (void) = nonstd_veer_isr_sha512_error; static void (* const nonstd_veer_isr_10) (void) = nonstd_veer_isr_sha512_notif; // from the param'd static void (* const nonstd_veer_isr_11) (void) = nonstd_veer_isr_sha256_error; // macro "nonstd_veer_isr" static void (* const nonstd_veer_isr_12) (void) = nonstd_veer_isr_sha256_notif; // below -static void (* const nonstd_veer_isr_13) (void) = nonstd_veer_isr_qspi_error ; // | -static void (* const nonstd_veer_isr_14) (void) = nonstd_veer_isr_qspi_notif ; // | -static void (* const nonstd_veer_isr_15) (void) = nonstd_veer_isr_uart_error ; // | -static void (* const nonstd_veer_isr_16) (void) = nonstd_veer_isr_uart_notif ; // | -static void (* const nonstd_veer_isr_17) (void) = nonstd_veer_isr_i3c_error ; // | -static void (* const nonstd_veer_isr_18) (void) = nonstd_veer_isr_i3c_notif ; // | +static void (* const nonstd_veer_isr_13) (void) = std_rv_nop_machine ; // | nonstd_veer_isr_qspi_error ---. +static void (* const nonstd_veer_isr_14) (void) = std_rv_nop_machine ; // | nonstd_veer_isr_qspi_notif | +static void (* const nonstd_veer_isr_15) (void) = std_rv_nop_machine ; // | nonstd_veer_isr_uart_error | Unimplemented to +static void (* const nonstd_veer_isr_16) (void) = std_rv_nop_machine ; // | nonstd_veer_isr_uart_notif | save code space +static void (* const nonstd_veer_isr_17) (void) = std_rv_nop_machine ; // | nonstd_veer_isr_i3c_error | +static void (* const nonstd_veer_isr_18) (void) = std_rv_nop_machine ; // | nonstd_veer_isr_i3c_notif ---' static void (* const nonstd_veer_isr_19) (void) = nonstd_veer_isr_soc_ifc_error; // | static void (* const nonstd_veer_isr_20) (void) = nonstd_veer_isr_soc_ifc_notif; // | static void (* const nonstd_veer_isr_21) (void) = nonstd_veer_isr_sha512_acc_error;// | @@ -172,6 +177,10 @@ void init_interrupts(void) { volatile uint32_t * const sha512_reg = (uint32_t*) CLP_SHA512_REG_BASE_ADDR; volatile uint32_t * const sha256_reg = (uint32_t*) CLP_SHA256_REG_BASE_ADDR; volatile uint32_t * const sha512_acc_csr = (uint32_t*) CLP_SHA512_ACC_CSR_BASE_ADDR; + volatile uint32_t * const mtime_l = (uint32_t*) CLP_SOC_IFC_REG_INTERNAL_RV_MTIME_L; + volatile uint32_t * const mtime_h = (uint32_t*) CLP_SOC_IFC_REG_INTERNAL_RV_MTIME_H; + volatile uint32_t * const mtimecmp_l = (uint32_t*) CLP_SOC_IFC_REG_INTERNAL_RV_MTIMECMP_L; + volatile uint32_t * const mtimecmp_h = (uint32_t*) CLP_SOC_IFC_REG_INTERNAL_RV_MTIMECMP_H; char* DCCM = (char *) RV_DCCM_SADR; uint32_t value; @@ -271,7 +280,7 @@ void init_interrupts(void) { DOE_REG_INTR_BLOCK_RF_GLOBAL_INTR_EN_R_NOTIF_EN_MASK; // ECC - // TODO error interrupt enables + ecc_reg[ECC_REG_INTR_BLOCK_RF_ERROR_INTR_EN_R /sizeof(uint32_t)] = ECC_REG_INTR_BLOCK_RF_ERROR_INTR_EN_R_ERROR_INTERNAL_EN_MASK; ecc_reg[ECC_REG_INTR_BLOCK_RF_NOTIF_INTR_EN_R /sizeof(uint32_t)] = ECC_REG_INTR_BLOCK_RF_NOTIF_INTR_EN_R_NOTIF_CMD_DONE_EN_MASK; ecc_reg[ECC_REG_INTR_BLOCK_RF_GLOBAL_INTR_EN_R/sizeof(uint32_t)] = ECC_REG_INTR_BLOCK_RF_GLOBAL_INTR_EN_R_ERROR_EN_MASK | ECC_REG_INTR_BLOCK_RF_GLOBAL_INTR_EN_R_NOTIF_EN_MASK; @@ -297,8 +306,10 @@ void init_interrupts(void) { // Mailbox // Clear DEBUG locked, which is always set on reset deassertion due to rst_val != TB input val soc_ifc_reg[SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R /sizeof(uint32_t)] = SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_DEBUG_LOCKED_STS_MASK; + soc_ifc_reg[SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R /sizeof(uint32_t)] = SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_SCAN_MODE_STS_MASK; // Also clear the statistics counter for DEBUG locked soc_ifc_reg[SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_DEBUG_LOCKED_INTR_COUNT_R /sizeof(uint32_t)] = 0; + soc_ifc_reg[SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_SCAN_MODE_INTR_COUNT_R /sizeof(uint32_t)] = 0; soc_ifc_reg[SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTR_EN_R /sizeof(uint32_t)] = SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTR_EN_R_ERROR_INTERNAL_EN_MASK | SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTR_EN_R_ERROR_INV_DEV_EN_MASK | SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTR_EN_R_ERROR_CMD_FAIL_EN_MASK | @@ -311,7 +322,9 @@ void init_interrupts(void) { soc_ifc_reg[SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTR_EN_R /sizeof(uint32_t)] = SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTR_EN_R_NOTIF_CMD_AVAIL_EN_MASK | SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTR_EN_R_NOTIF_MBOX_ECC_COR_EN_MASK | SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTR_EN_R_NOTIF_DEBUG_LOCKED_EN_MASK | - SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTR_EN_R_NOTIF_SOC_REQ_LOCK_EN_MASK; + SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTR_EN_R_NOTIF_SCAN_MODE_EN_MASK | + SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTR_EN_R_NOTIF_SOC_REQ_LOCK_EN_MASK | + SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTR_EN_R_NOTIF_GEN_IN_TOGGLE_EN_MASK; soc_ifc_reg[SOC_IFC_REG_INTR_BLOCK_RF_GLOBAL_INTR_EN_R/sizeof(uint32_t)] = SOC_IFC_REG_INTR_BLOCK_RF_GLOBAL_INTR_EN_R_ERROR_EN_MASK | SOC_IFC_REG_INTR_BLOCK_RF_GLOBAL_INTR_EN_R_NOTIF_EN_MASK; @@ -321,10 +334,31 @@ void init_interrupts(void) { sha512_acc_csr[SHA512_ACC_CSR_INTR_BLOCK_RF_GLOBAL_INTR_EN_R/sizeof(uint32_t)] = SHA512_ACC_CSR_INTR_BLOCK_RF_GLOBAL_INTR_EN_R_ERROR_EN_MASK | SHA512_ACC_CSR_INTR_BLOCK_RF_GLOBAL_INTR_EN_R_NOTIF_EN_MASK; + // Set mtimecmp to max value to avoid spurious timer interrupts + *mtimecmp_l = 0xFFFFFFFF; + *mtimecmp_h = 0xFFFFFFFF; + + // Set threshold for Correctable Error Local Interrupts + value = 0xd0000000; + __asm__ volatile ("csrw %0, %1" + : /* output: none */ + : "i" (VEER_CSR_MICECT), "r" (value) /* input : immediate, register */ + : /* clobbers: none */); + __asm__ volatile ("csrw %0, %1" + : /* output: none */ + : "i" (VEER_CSR_MICCMECT), "r" (value) /* input : immediate, register */ + : /* clobbers: none */); + __asm__ volatile ("csrw %0, %1" + : /* output: none */ + : "i" (VEER_CSR_MDCCMECT), "r" (value) /* input : immediate, register */ + : /* clobbers: none */); + // MIE // Enable MIE.MEI (External Interrupts) - // Do not enable Timer or SW Interrupts - csr_set_bits_mie(MIE_MEI_BIT_MASK); + // Enable MIE.MTI (Timer Interrupts) + // Enable MIE.MCEI (Correctable Error Interrupt) + // Do not enable SW Interrupts + csr_set_bits_mie(MIE_MEI_BIT_MASK | MIE_MTI_BIT_MASK | MIE_MCEI_BIT_MASK); // Global interrupt enable csr_set_bits_mstatus(MSTATUS_MIE_BIT_MASK); @@ -333,11 +367,22 @@ void init_interrupts(void) { void std_rv_nop_machine(void) { // Nop machine mode interrupt. - VPRINTF(HIGH,"nop\n"); + VPRINTF(HIGH,"mcause:%x\n", csr_read_mcause()); return; } -void std_rv_mtvec_miti0(void) { +void std_rv_mtvec_mti(void) { + volatile uint32_t * const mtimecmp_l = (uint32_t*) CLP_SOC_IFC_REG_INTERNAL_RV_MTIMECMP_L; + volatile uint32_t * const mtimecmp_h = (uint32_t*) CLP_SOC_IFC_REG_INTERNAL_RV_MTIMECMP_H; + + // Set mtimecmp to max value to avoid further timer interrupts + *mtimecmp_l = 0xFFFFFFFF; + *mtimecmp_h = 0xFFFFFFFF; + + VPRINTF(MEDIUM, "Done handling machine-mode TIMER interrupt\n"); +} + +void nonstd_veer_mtvec_miti0(void) { uint_xlen_t value; //Disable internal timer 0 count en to service intr __asm__ volatile ("csrwi %0, %1" \ @@ -347,6 +392,23 @@ void std_rv_mtvec_miti0(void) { } +void nonstd_veer_mtvec_mcei(void) { + uint32_t mask = 0x07FFFFFF; + VPRINTF(HIGH,"Cor Error Local ISR\n"); + __asm__ volatile ("csrc %0, %1" + : /* output: none */ + : "i" (VEER_CSR_MICECT), "r" (mask) /* input : immediate, register */ + : /* clobbers: none */); + __asm__ volatile ("csrc %0, %1" + : /* output: none */ + : "i" (VEER_CSR_MICCMECT), "r" (mask) /* input : immediate, register */ + : /* clobbers: none */); + __asm__ volatile ("csrc %0, %1" + : /* output: none */ + : "i" (VEER_CSR_MDCCMECT), "r" (mask) /* input : immediate, register */ + : /* clobbers: none */); +} + static void std_rv_isr(void) { void (* isr) (void); // Function pointer to source-specific ISR SEND_STDOUT_CTRL(0xfb); //FIXME @@ -381,7 +443,7 @@ static void std_rv_isr(void) { : "i" (VEER_CSR_MEIHAP) /* input : immediate */ : /* clobbers: none */); // Call the ID-specific handler - isr(); // ISR here is a function pointer indexed into the mtvec table + isr(); // ISR here is a function pointer indexed into the meivt table // For Interrupt NESTING support, the handler should: // * Save meicurpl // * Read meicidpl @@ -400,9 +462,9 @@ static void std_rv_isr(void) { switch (this_cause) { case RISCV_EXCP_LOAD_ACCESS_FAULT : // mscause - __asm__ volatile ("csrr %0, 0x7ff" + __asm__ volatile ("csrr %0, %1" : "=r" (this_cause) /* output : register */ - : /* input : none */ + : "i" (VEER_CSR_MSCAUSE) /* input : immediate */ : /* clobbers: none */); VPRINTF(LOW,"mscause:%x\n",this_cause); // mepc @@ -440,7 +502,9 @@ static void std_rv_isr_vector_table(void) { ".org std_rv_isr_vector_table + 11*4;" "jal zero,std_rv_mtvec_mei;" /* 11 */ ".org std_rv_isr_vector_table + 29*4;" - "jal zero,std_rv_mtvec_miti0;" /* 29 */ + "jal zero,nonstd_veer_mtvec_miti0;" /* 29 */ + ".org std_rv_isr_vector_table + 30*4;" + "jal zero,nonstd_veer_mtvec_mcei;" /* 30 */ // #ifndef VECTOR_TABLE_MTVEC_PLATFORM_INTS // ".org std_rv_isr_vector_table + 16*4;" // "jal std_rv_mtvec_platform_irq0;" @@ -473,40 +537,84 @@ void std_rv_mtvec_exception(void) { VPRINTF(WARNING,"In:Std Excptn\nmcause:%x\n", this_cause); if (this_cause & MCAUSE_INTERRUPT_BIT_MASK) { VPRINTF(ERROR,"Unexpected Intr bit:%x\n", 0xFFFFFFFF); + SEND_STDOUT_CTRL(0x1); // KILL THE SIMULATION with "ERROR" } else { + uint_xlen_t tmp_reg; + + // mscause + __asm__ volatile ("csrr %0, %1" + : "=r" (tmp_reg) /* output : register */ + : "i" (VEER_CSR_MSCAUSE) /* input : immediate */ + : /* clobbers: none */); + VPRINTF(LOW,"mscause:%x\n",tmp_reg); + #ifdef RV_EXCEPTION_STRUCT + SEND_STDOUT_CTRL(0xe4); // Disable ECC Error injection, if enabled, to allow exc_flag writes (which may be in DCCM) without corruption + __asm__ volatile ("fence.i"); + exc_flag.exception_hit = 1; + exc_flag.mcause = this_cause; + exc_flag.mscause = tmp_reg; + #endif + // mepc + tmp_reg = csr_read_mepc(); + VPRINTF(LOW,"mepc:%x\n",tmp_reg); + // mtval + tmp_reg = csr_read_mtval(); + VPRINTF(LOW,"mtval:%x\n",tmp_reg); + switch (this_cause) { case RISCV_EXCP_LOAD_ACCESS_FAULT : - // mscause - __asm__ volatile ("csrr %0, 0x7ff" - : "=r" (this_cause) /* output : register */ - : /* input : none */ - : /* clobbers: none */); - VPRINTF(LOW,"mscause:%x\n",this_cause); - // mepc - this_cause = csr_read_mepc(); - VPRINTF(LOW,"mepc:%x\n",this_cause); - // mtval - this_cause = csr_read_mtval(); - VPRINTF(LOW,"mtval:%x\n",this_cause); + #ifdef RV_EXCEPTION_STRUCT + if (exc_flag.mscause == RISC_EXCP_MSCAUSE_DCCM_LOAD_UNC_ECC_ERR) { + // Increment mepc before returning, because repeating the previously + // failing command will cause an infinite loop back to this ISR. + tmp_reg = csr_read_mepc(); + csr_write_mepc(tmp_reg + 4); // FIXME this has no guarantee of working. E.g. Compressed instructions are 2, not 4, bytes... + + // Bail immediately instead of killing the sim. + // Caliptra RESET is expected due to FATAL Error, but if it's + // masked the originating test should decide what to do. + SEND_STDOUT_CTRL(0xfc); //FIXME + return; + } + #endif + break; + case RISCV_EXCP_STORE_AMO_ACCESS_FAULT : + #ifdef RV_EXCEPTION_STRUCT + if (exc_flag.mscause == RISC_EXCP_MSCAUSE_DCCM_STOR_UNC_ECC_ERR) { + // Bail immediately instead of killing the sim. + // Caliptra RESET is expected due to FATAL Error, but if it's + // masked the originating test should decide what to do. + SEND_STDOUT_CTRL(0xfc); //FIXME + return; + } + #endif + break; + case RISCV_EXCP_INSTRUCTION_ACCESS_FAULT : + #ifdef RV_EXCEPTION_STRUCT + if (exc_flag.mscause == RISC_EXCP_MSCAUSE_ICCM_INST_UNC_ECC_ERR) { + SEND_STDOUT_CTRL(0xfc); //FIXME + + // Reset uC instead of killing the sim. + // Caliptra RESET is expected due to FATAL Error, but if it's + // masked the originating test won't be able to make progress + // after this routine returns. + + // If the FATAL Error bit for ICCM ECC Error is masked, manually trigger firmware reset + if (lsu_read_32(CLP_SOC_IFC_REG_INTERNAL_HW_ERROR_FATAL_MASK) & SOC_IFC_REG_INTERNAL_HW_ERROR_FATAL_MASK_MASK_ICCM_ECC_UNC_MASK) { + VPRINTF(LOW, "ICCM ECC FATAL_ERROR bit is masked, no reset expected from TB: resetting the core manually!\n"); + lsu_write_32(CLP_SOC_IFC_REG_INTERNAL_FW_UPDATE_RESET, SOC_IFC_REG_INTERNAL_FW_UPDATE_RESET_CORE_RST_MASK); + // Otherwise, wait for core reset + } else { + VPRINTF(LOW, "ICCM ECC FATAL_ERROR bit is not masked, waiting for reset from TB!\n"); + while(1); + } + + } + #endif break; case RISCV_EXCP_ILLEGAL_INSTRUCTION : - // mscause - __asm__ volatile ("csrr %0, 0x7ff" - : "=r" (this_cause) /* output : register */ - : /* input : none */ - : /* clobbers: none */); - VPRINTF(LOW,"mscause:%x\n",this_cause); - // mepc - this_cause = csr_read_mepc(); - VPRINTF(LOW,"mepc:%x\n",this_cause); - // mtval - this_cause = csr_read_mtval(); - VPRINTF(LOW,"mtval:%x\n",this_cause); break; default : - // mepc - this_cause = csr_read_mepc(); - VPRINTF(LOW,"mepc:%x\n",this_cause); break; } } @@ -642,18 +750,20 @@ nonstd_veer_isr(sha512_notif) nonstd_veer_isr(sha256_error) // Non-Standard Vectored Interrupt Handler (SHA256 Notification = vector 12) nonstd_veer_isr(sha256_notif) -// Non-Standard Vectored Interrupt Handler (QSPI Error = vector 13) -nonstd_veer_isr(qspi_error) -// Non-Standard Vectored Interrupt Handler (QSPI Notification = vector 14) -nonstd_veer_isr(qspi_notif) -// Non-Standard Vectored Interrupt Handler (UART Error = vector 15) -nonstd_veer_isr(uart_error) -// Non-Standard Vectored Interrupt Handler (UART Notification = vector 16) -nonstd_veer_isr(uart_notif) -// Non-Standard Vectored Interrupt Handler (I3C Error = vector 17) -nonstd_veer_isr(i3c_error) -// Non-Standard Vectored Interrupt Handler (I3C Notification = vector 18) -nonstd_veer_isr(i3c_notif) +/********************** Save FW image space by omitting these unused ISR ****** + * // Non-Standard Vectored Interrupt Handler (QSPI Error = vector 13) // + * nonstd_veer_isr(qspi_error) // + * // Non-Standard Vectored Interrupt Handler (QSPI Notification = vector 14) // + * nonstd_veer_isr(qspi_notif) // + * // Non-Standard Vectored Interrupt Handler (UART Error = vector 15) // + * nonstd_veer_isr(uart_error) // + * // Non-Standard Vectored Interrupt Handler (UART Notification = vector 16) // + * nonstd_veer_isr(uart_notif) // + * // Non-Standard Vectored Interrupt Handler (I3C Error = vector 17) // + * nonstd_veer_isr(i3c_error) // + * // Non-Standard Vectored Interrupt Handler (I3C Notification = vector 18) // + * nonstd_veer_isr(i3c_notif) // +******************************************************************************/ // Non-Standard Vectored Interrupt Handler (SOC_IFC Error = vector 19) nonstd_veer_isr(soc_ifc_error) // Non-Standard Vectored Interrupt Handler (SOC_IFC Notification = vector 20) diff --git a/src/integration/test_suites/libs/caliptra_isr/veer-csr.h b/src/integration/test_suites/libs/caliptra_isr/veer-csr.h index a5d5c67f3..553d4b4e1 100644 --- a/src/integration/test_suites/libs/caliptra_isr/veer-csr.h +++ b/src/integration/test_suites/libs/caliptra_isr/veer-csr.h @@ -23,6 +23,10 @@ ////////////////////////////////////////////////////////////////////////////// // Non-Standard VeeR CSR offset macros // +#define VEER_CSR_MICECT 0x7F0 +#define VEER_CSR_MICCMECT 0x7F1 +#define VEER_CSR_MDCCMECT 0x7F2 +#define VEER_CSR_MSCAUSE 0x7FF #define VEER_CSR_MEIVT 0xBC8 #define VEER_CSR_MEIPT 0xBC9 #define VEER_CSR_MEICPCT 0xBCA @@ -31,6 +35,17 @@ #define VEER_CSR_MEIHAP 0xFC8 +////////////////////////////////////////////////////////////////////////////// +// VeeR MSCAUSE encoding +// +// From Table 2-10, VeeR EL2 PRM, Rev 1.4 +enum { + RISC_EXCP_MSCAUSE_ICCM_INST_UNC_ECC_ERR = 0x1, + RISC_EXCP_MSCAUSE_DCCM_LOAD_UNC_ECC_ERR = 0x1, + RISC_EXCP_MSCAUSE_DCCM_STOR_UNC_ECC_ERR = 0x1, +}; + + ////////////////////////////////////////////////////////////////////////////// // VeeR PIC Memory Mapped register offset macros // @@ -100,4 +115,15 @@ static inline uint_xlen_t csr_read_write_mdeau(uint_xlen_t new_value) { } +////////////////////////////////////////////////////////////////////////////// +// VeeR Core-Specific MIE/MIP values +// +#define MIE_MCEI_BIT_OFFSET 30 +#define MIE_MCEI_BIT_WIDTH 1 +#define MIE_MCEI_BIT_MASK 0x40000000 +#define MIP_MCEI_BIT_OFFSET 30 +#define MIP_MCEI_BIT_WIDTH 1 +#define MIP_MCEI_BIT_MASK 0x40000000 + + #endif // #define VEER_CSR_H diff --git a/src/integration/test_suites/libs/clk_gate/clk_gate.c b/src/integration/test_suites/libs/clk_gate/clk_gate.c new file mode 100644 index 000000000..ad724e6e6 --- /dev/null +++ b/src/integration/test_suites/libs/clk_gate/clk_gate.c @@ -0,0 +1,99 @@ +// SPDX-License-Identifier: Apache-2.0 +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +#include "clk_gate.h" +#include "riscv_hw_if.h" +#include "caliptra_defines.h" +#include "printf.h" + +void set_mit0_and_halt_core(uint32_t mitb0, uint32_t mie_en) { + VPRINTF(LOW, "Enabling internal timer0 and halting core\n"); + //Enable internal timer0 + __asm__ volatile ("csrwi %0, %1" \ + : /* output: none */ \ + : "i" (0x7d2), "i" (0x00) /* input : immediate */ \ + : /* clobbers: none */); + + //Set internal timer0 upper bound + __asm__ volatile ("csrw %0, %1" \ + : /* output: none */ \ + : "i" (0x7d3), "r" (mitb0) /* input : immediate */ \ + : /* clobbers: none */); + + //Set internal timer0 control (halt_en = 1, enable = 1) + __asm__ volatile ("csrwi %0, %1" \ + : /* output: none */ \ + : "i" (0x7d4), "i" (0x03) /* input : immediate */ \ + : /* clobbers: none */); + + //Set machine intr enable reg (mie) - enable internal timer0 intr + __asm__ volatile ("csrw %0, %1" \ + : /* output: none */ \ + : "i" (0x304), "r" (mie_en) /* input : immediate */ \ + : /* clobbers: none */); + + //Set mstatus reg - enable mie + __asm__ volatile ("csrwi %0, %1" \ + : /* output: none */ \ + : "i" (0x300), "i" (0x08) /* input : immediate */ \ + : /* clobbers: none */); + + + //Halt the core + __asm__ volatile ("csrwi %0, %1" \ + : /* output: none */ \ + : "i" (0x7c6), "i" (0x03) /* input : immediate */ \ + : /* clobbers: none */); +} + +void set_mit0(uint32_t mitb0, uint32_t mie_en) { + //Enable internal timer0 + __asm__ volatile ("csrwi %0, %1" \ + : /* output: none */ \ + : "i" (0x7d2), "i" (0x00) /* input : immediate */ \ + : /* clobbers: none */); + + //Set internal timer0 upper bound + __asm__ volatile ("csrw %0, %1" \ + : /* output: none */ \ + : "i" (0x7d3), "r" (mitb0) /* input : immediate */ \ + : /* clobbers: none */); + + //Set internal timer0 control (halt_en = 1, enable = 1) + __asm__ volatile ("csrwi %0, %1" \ + : /* output: none */ \ + : "i" (0x7d4), "i" (0x03) /* input : immediate */ \ + : /* clobbers: none */); + + //Set machine intr enable reg (mie) - enable internal timer0 intr + __asm__ volatile ("csrw %0, %1" \ + : /* output: none */ \ + : "i" (0x304), "r" (mie_en) /* input : immediate */ \ + : /* clobbers: none */); + + //Set mstatus reg - enable mie + __asm__ volatile ("csrwi %0, %1" \ + : /* output: none */ \ + : "i" (0x300), "i" (0x08) /* input : immediate */ \ + : /* clobbers: none */); +} + +void halt_core() { + //Halt the core + __asm__ volatile ("csrwi %0, %1" \ + : /* output: none */ \ + : "i" (0x7c6), "i" (0x03) /* input : immediate */ \ + : /* clobbers: none */); +} \ No newline at end of file diff --git a/src/integration/test_suites/libs/clk_gate/clk_gate.h b/src/integration/test_suites/libs/clk_gate/clk_gate.h new file mode 100644 index 000000000..05e45236e --- /dev/null +++ b/src/integration/test_suites/libs/clk_gate/clk_gate.h @@ -0,0 +1,30 @@ +// SPDX-License-Identifier: Apache-2.0 +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +#ifndef CLK_GATE_H + #define CLK_GATE_H + +#include "caliptra_defines.h" +#include "caliptra_reg.h" +#include "riscv_hw_if.h" + +/* --------------- symbols/typedefs --------------- */ + +/* --------------- Function Prototypes --------------- */ +void set_mit0_and_halt_core(uint32_t mitb0, uint32_t mie_en); +void set_mit0(uint32_t mitb0, uint32_t mie_en); +void halt_core(); + +#endif \ No newline at end of file diff --git a/src/integration/test_suites/libs/datavault/datavault.c b/src/integration/test_suites/libs/datavault/datavault.c index 11cc90207..c9646e6ff 100644 --- a/src/integration/test_suites/libs/datavault/datavault.c +++ b/src/integration/test_suites/libs/datavault/datavault.c @@ -22,11 +22,11 @@ widereg_t dv_regs [DV_PFX_COUNT] = { { "STICKYDATAVAULTCTRL", (uint32_t *) CLP_DV_REG_STICKYDATAVAULTCTRL_0, 2, 0x1, 0x0 }, // 0. (0x1001c000) { "STICKY_DATA_VAULT_ENTRY_0", (uint32_t *) CLP_DV_REG_STICKY_DATA_VAULT_ENTRY_0_0, 3, DV_ONES, 0x0 }, // 1. (0x1001c028) { "STICKY_DATA_VAULT_ENTRY_1", (uint32_t *) CLP_DV_REG_STICKY_DATA_VAULT_ENTRY_1_0, 3, DV_ONES, 0x0 }, // 2. (0x1001c058) - { "NONSTICKYDATAVAULTCTRL", (uint32_t *) CLP_DV_REG_NONSTICKYDATAVAULTCTRL_0, 2, 0x0, 0x0 }, // 3. (0x1001c208) - { "NONSTICKY_DATA_VAULT_ENTRY_0", (uint32_t *) CLP_DV_REG_NONSTICKY_DATA_VAULT_ENTRY_0_0, 3, 0x0, 0x0 }, // 4. (0x1001c230) - { "NONSTICKY_DATA_VAULT_ENTRY_1", (uint32_t *) CLP_DV_REG_NONSTICKY_DATA_VAULT_ENTRY_1_0, 3, 0x0, 0x0 }, // 5. (0x1001c260) - { "NONSTICKY_LOCKABLE_SCRATCHREG_CTRL", (uint32_t *) CLP_DV_REG_NONSTICKYLOCKABLESCRATCHREGCTRL_0, 2, 0x0, 0x0 }, // 6. (0x1001c410) - { "NONSTICKY_LOCKABLE_SCRATCHREG", (uint32_t *) CLP_DV_REG_NONSTICKYLOCKABLESCRATCHREG_0, 2, 0x0, 0x0 }, // 7. (0x1001c438) + { "DATAVAULTCTRL", (uint32_t *) CLP_DV_REG_DATAVAULTCTRL_0, 2, 0x0, 0x0 }, // 3. (0x1001c208) + { "DATA_VAULT_ENTRY_0", (uint32_t *) CLP_DV_REG_DATA_VAULT_ENTRY_0_0, 3, DV_ONES, 0x0 }, // 4. (0x1001c230) + { "DATA_VAULT_ENTRY_1", (uint32_t *) CLP_DV_REG_DATA_VAULT_ENTRY_1_0, 3, DV_ONES, 0x0 }, // 5. (0x1001c260) + { "LOCKABLE_SCRATCHREG_CTRL", (uint32_t *) CLP_DV_REG_LOCKABLESCRATCHREGCTRL_0, 2, 0x0, 0x0 }, // 6. (0x1001c410) + { "LOCKABLE_SCRATCHREG", (uint32_t *) CLP_DV_REG_LOCKABLESCRATCHREG_0, 2, DV_ONES, 0x0 }, // 7. (0x1001c438) { "STICKY_LOCKABLE_SCRATCHREGCTRL", (uint32_t *) CLP_DV_REG_STICKYLOCKABLESCRATCHREGCTRL_0, 2, 0x1, 0x0 }, // 8. (0x1001c480) { "STICKY_LOCKABLE_SCRATCHREG", (uint32_t *) CLP_DV_REG_STICKYLOCKABLESCRATCHREG_0, 2, DV_ONES, 0x0 } // 9. (0x1001c4a0) }; @@ -61,21 +61,21 @@ int lock_status_bitmap [DV_PFX_COUNT] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; // ea STICKY_DATA_VAULT_ENTRY_1[1] STICKY_DATA_VAULT_ENTRY_1[2] -------------------------------------------------------------- - NONSTICKYDATAVAULTCTRL[0] locks: - NONSTICKY_DATA_VAULT_ENTRY_0[0] - NONSTICKY_DATA_VAULT_ENTRY_0[1] - NONSTICKY_DATA_VAULT_ENTRY_0[2] - - NONSTICKYDATAVAULTCTRL[1] locks: - NONSTICKY_DATA_VAULT_ENTRY_1[0] - NONSTICKY_DATA_VAULT_ENTRY_1[1] - NONSTICKY_DATA_VAULT_ENTRY_1[2] + DATAVAULTCTRL[0] locks: + DATA_VAULT_ENTRY_0[0] + DATA_VAULT_ENTRY_0[1] + DATA_VAULT_ENTRY_0[2] + + DATAVAULTCTRL[1] locks: + DATA_VAULT_ENTRY_1[0] + DATA_VAULT_ENTRY_1[1] + DATA_VAULT_ENTRY_1[2] -------------------------------------------------------------- - NONSTICKY_LOCKABLE_SCRATCHREG_CTRL[0] locks: - NONSTICKY_LOCKABLE_SCRATCHREG[0] + LOCKABLE_SCRATCHREG_CTRL[0] locks: + LOCKABLE_SCRATCHREG[0] - NONSTICKY_LOCKABLE_SCRATCHREG_CTRL[1] locks: - NONSTICKY_LOCKABLE_SCRATCHREG[1] + LOCKABLE_SCRATCHREG_CTRL[1] locks: + LOCKABLE_SCRATCHREG[1] -------------------------------------------------------------- STICKY_LOCKABLE_SCRATCHREG_CTRL[0] locks: STICKY_LOCKABLE_SCRATCHREG[0] @@ -99,19 +99,19 @@ widereg_t dv_regs [DV_PFX_COUNT] = { { "STICKY_DATA_VAULT_ENTRY_7", (uint32_t *) CLP_DV_REG_STICKY_DATA_VAULT_ENTRY_7_0, 12, DV_ONES, 0x0 }, // 8. (0x1001c178) { "STICKY_DATA_VAULT_ENTRY_8", (uint32_t *) CLP_DV_REG_STICKY_DATA_VAULT_ENTRY_8_0, 12, DV_ONES, 0x0 }, // 9. (0x1001c1a8) { "STICKY_DATA_VAULT_ENTRY_9", (uint32_t *) CLP_DV_REG_STICKY_DATA_VAULT_ENTRY_9_0, 12, DV_ONES, 0x0 }, // 10. (0x1001c1d8) - { "NONSTICKYDATAVAULTCTRL", (uint32_t *) CLP_DV_REG_NONSTICKYDATAVAULTCTRL_0, 10, 0x0, 0x0 }, // 11. (0x1001c208) - { "NONSTICKY_DATA_VAULT_ENTRY_0", (uint32_t *) CLP_DV_REG_NONSTICKY_DATA_VAULT_ENTRY_0_0, 12, 0x0, 0x0 }, // 12. (0x1001c230) - { "NONSTICKY_DATA_VAULT_ENTRY_1", (uint32_t *) CLP_DV_REG_NONSTICKY_DATA_VAULT_ENTRY_1_0, 12, 0x0, 0x0 }, // 13. (0x1001c260) - { "NONSTICKY_DATA_VAULT_ENTRY_2", (uint32_t *) CLP_DV_REG_NONSTICKY_DATA_VAULT_ENTRY_2_0, 12, 0x0, 0x0 }, // 14. (0x1001c290) - { "NONSTICKY_DATA_VAULT_ENTRY_3", (uint32_t *) CLP_DV_REG_NONSTICKY_DATA_VAULT_ENTRY_3_0, 12, 0x0, 0x0 }, // 15. (0x1001c2c0) - { "NONSTICKY_DATA_VAULT_ENTRY_4", (uint32_t *) CLP_DV_REG_NONSTICKY_DATA_VAULT_ENTRY_4_0, 12, 0x0, 0x0 }, // 16. (0x1001c2f0) - { "NONSTICKY_DATA_VAULT_ENTRY_5", (uint32_t *) CLP_DV_REG_NONSTICKY_DATA_VAULT_ENTRY_5_0, 12, 0x0, 0x0 }, // 17. (0x1001c320) - { "NONSTICKY_DATA_VAULT_ENTRY_6", (uint32_t *) CLP_DV_REG_NONSTICKY_DATA_VAULT_ENTRY_6_0, 12, 0x0, 0x0 }, // 18. (0x1001c350) - { "NONSTICKY_DATA_VAULT_ENTRY_7", (uint32_t *) CLP_DV_REG_NONSTICKY_DATA_VAULT_ENTRY_7_0, 12, 0x0, 0x0 }, // 19. (0x1001c380) - { "NONSTICKY_DATA_VAULT_ENTRY_8", (uint32_t *) CLP_DV_REG_NONSTICKY_DATA_VAULT_ENTRY_8_0, 12, 0x0, 0x0 }, // 20. (0x1001c3b0) - { "NONSTICKY_DATA_VAULT_ENTRY_9", (uint32_t *) CLP_DV_REG_NONSTICKY_DATA_VAULT_ENTRY_9_0, 12, 0x0, 0x0 }, // 21. (0x1001c3e0) - { "NONSTICKY_LOCKABLE_SCRATCHREG_CTRL", (uint32_t *) CLP_DV_REG_NONSTICKYLOCKABLESCRATCHREGCTRL_0, 10, 0x0, 0x0 }, // 22. (0x1001c410) - { "NONSTICKY_LOCKABLE_SCRATCHREG", (uint32_t *) CLP_DV_REG_NONSTICKYLOCKABLESCRATCHREG_0, 10, 0x0, 0x0 }, // 23. (0x1001c438) + { "DATAVAULTCTRL", (uint32_t *) CLP_DV_REG_DATAVAULTCTRL_0, 10, 0x0, 0x0 }, // 11. (0x1001c208) + { "DATA_VAULT_ENTRY_0", (uint32_t *) CLP_DV_REG_DATA_VAULT_ENTRY_0_0, 12, DV_ONES, 0x0 }, // 12. (0x1001c230) + { "DATA_VAULT_ENTRY_1", (uint32_t *) CLP_DV_REG_DATA_VAULT_ENTRY_1_0, 12, DV_ONES, 0x0 }, // 13. (0x1001c260) + { "DATA_VAULT_ENTRY_2", (uint32_t *) CLP_DV_REG_DATA_VAULT_ENTRY_2_0, 12, DV_ONES, 0x0 }, // 14. (0x1001c290) + { "DATA_VAULT_ENTRY_3", (uint32_t *) CLP_DV_REG_DATA_VAULT_ENTRY_3_0, 12, DV_ONES, 0x0 }, // 15. (0x1001c2c0) + { "DATA_VAULT_ENTRY_4", (uint32_t *) CLP_DV_REG_DATA_VAULT_ENTRY_4_0, 12, DV_ONES, 0x0 }, // 16. (0x1001c2f0) + { "DATA_VAULT_ENTRY_5", (uint32_t *) CLP_DV_REG_DATA_VAULT_ENTRY_5_0, 12, DV_ONES, 0x0 }, // 17. (0x1001c320) + { "DATA_VAULT_ENTRY_6", (uint32_t *) CLP_DV_REG_DATA_VAULT_ENTRY_6_0, 12, DV_ONES, 0x0 }, // 18. (0x1001c350) + { "DATA_VAULT_ENTRY_7", (uint32_t *) CLP_DV_REG_DATA_VAULT_ENTRY_7_0, 12, DV_ONES, 0x0 }, // 19. (0x1001c380) + { "DATA_VAULT_ENTRY_8", (uint32_t *) CLP_DV_REG_DATA_VAULT_ENTRY_8_0, 12, DV_ONES, 0x0 }, // 20. (0x1001c3b0) + { "DATA_VAULT_ENTRY_9", (uint32_t *) CLP_DV_REG_DATA_VAULT_ENTRY_9_0, 12, DV_ONES, 0x0 }, // 21. (0x1001c3e0) + { "LOCKABLE_SCRATCHREG_CTRL", (uint32_t *) CLP_DV_REG_LOCKABLESCRATCHREGCTRL_0, 10, 0x0, 0x0 }, // 22. (0x1001c410) + { "LOCKABLE_SCRATCHREG", (uint32_t *) CLP_DV_REG_LOCKABLESCRATCHREG_0, 10, DV_ONES, 0x0 }, // 23. (0x1001c438) { "NONSTICKY_GENERIC_SCRATCHREG", (uint32_t *) CLP_DV_REG_NONSTICKYGENERICSCRATCHREG_0, 8 , 0x0, 0x0 }, // 24. (0x1001c460) { "STICKY_LOCKABLE_SCRATCHREG_CTRL", (uint32_t *) CLP_DV_REG_STICKYLOCKABLESCRATCHREGCTRL_0, 8 , 0x1, 0x0 }, // 25. (0x1001c480) { "STICKY_LOCKABLE_SCRATCHREG", (uint32_t *) CLP_DV_REG_STICKYLOCKABLESCRATCHREG_0, 8 , DV_ONES, 0x0 } // 26. (0x1001c4a0) diff --git a/src/integration/test_suites/libs/ecc/ecc.c b/src/integration/test_suites/libs/ecc/ecc.c index 12c1d2c28..5f97375f0 100644 --- a/src/integration/test_suites/libs/ecc/ecc.c +++ b/src/integration/test_suites/libs/ecc/ecc.c @@ -14,35 +14,26 @@ // #include "caliptra_defines.h" -#include "riscv_hw_if.h" -#include -#include +//#include "riscv_hw_if.h" +//#include +//#include #include "printf.h" #include "ecc.h" +#include "caliptra_isr.h" - +extern volatile caliptra_intr_received_s cptra_intr_rcv; void wait_for_ecc_intr(){ printf("ECC flow in progress...\n"); - while((lsu_read_32(CLP_ECC_REG_ECC_STATUS) & ECC_REG_ECC_STATUS_VALID_MASK) == 0){ - __asm__ volatile ("wfi"); // "Wait for interrupt" - // Sleep during ECC operation to allow ISR to execute and show idle time in sims - for (uint16_t slp = 0; slp < 100; slp++) { - __asm__ volatile ("nop"); // Sleep loop as "nop" - } - }; - /* TODO - printf("ECC flow in progress...\n"); - while(ecc_intr_status == 0){ + while((cptra_intr_rcv.ecc_error == 0) & (cptra_intr_rcv.ecc_notif == 0)){ __asm__ volatile ("wfi"); // "Wait for interrupt" // Sleep during ECC operation to allow ISR to execute and show idle time in sims for (uint16_t slp = 0; slp < 100; slp++) { __asm__ volatile ("nop"); // Sleep loop as "nop" } }; - printf("Received ECC intr with status = %x\n", ecc_intr_status); - ecc_intr_status = 0; - */ + //printf("Received ECC error intr with status = %d\n", cptra_intr_rcv.ecc_error); + printf("Received ECC notif/ err intr with status = %d/ %d\n", cptra_intr_rcv.ecc_notif, cptra_intr_rcv.ecc_error); } void ecc_zeroize(){ diff --git a/src/integration/test_suites/libs/ecc/ecc.h b/src/integration/test_suites/libs/ecc/ecc.h index f193e9d57..041ead072 100644 --- a/src/integration/test_suites/libs/ecc/ecc.h +++ b/src/integration/test_suites/libs/ecc/ecc.h @@ -35,5 +35,6 @@ void ecc_signing_flow(ecc_io privkey, ecc_io msg, ecc_io iv, ecc_io sign_r, ecc_ void ecc_verifying_flow(ecc_io msg, ecc_io pubkey_x, ecc_io pubkey_y, ecc_io sign_r, ecc_io sign_s); void ecc_pcr_signing_flow(ecc_io iv, ecc_io sign_r, ecc_io sign_s); void ecc_zeroize(); +void wait_for_ecc_intr(); #endif diff --git a/src/integration/test_suites/libs/hmac/hmac.c b/src/integration/test_suites/libs/hmac/hmac.c index b7810c3e4..7d6f28e46 100644 --- a/src/integration/test_suites/libs/hmac/hmac.c +++ b/src/integration/test_suites/libs/hmac/hmac.c @@ -16,6 +16,22 @@ #include "caliptra_defines.h" #include "printf.h" #include "hmac.h" +#include "caliptra_isr.h" + +extern volatile caliptra_intr_received_s cptra_intr_rcv; + +void wait_for_hmac_intr(){ + printf("HMAC flow in progress...\n"); + while((cptra_intr_rcv.hmac_error == 0) & (cptra_intr_rcv.hmac_notif == 0)){ + __asm__ volatile ("wfi"); // "Wait for interrupt" + // Sleep during HMAC operation to allow ISR to execute and show idle time in sims + for (uint16_t slp = 0; slp < 100; slp++) { + __asm__ volatile ("nop"); // Sleep loop as "nop" + } + }; + //printf("Received HMAC error intr with status = %d\n", cptra_intr_rcv.hmac_error); + printf("Received HMAC notif intr with status = %d\n", cptra_intr_rcv.hmac_notif); +} void hmac_zeroize(){ printf("HMAC zeroize flow.\n"); @@ -92,6 +108,8 @@ void hmac_flow(hmac_io key, hmac_io block, hmac_io lfsr_seed, hmac_io tag){ lsu_write_32(CLP_HMAC_REG_HMAC384_CTRL, HMAC_REG_HMAC384_CTRL_INIT_MASK); // wait for HMAC process to be done + wait_for_hmac_intr(); + if (tag.kv_intf){ // wait for HMAC process - check dest done printf("Load TAG data from HMAC to KV\n"); diff --git a/src/integration/test_suites/libs/jtagdpi/README.md b/src/integration/test_suites/libs/jtagdpi/README.md new file mode 100644 index 000000000..54750ef1f --- /dev/null +++ b/src/integration/test_suites/libs/jtagdpi/README.md @@ -0,0 +1,25 @@ +# SPDX-License-Identifier: Apache-2.0 +# +# # Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# # http://www.apache.org/licenses/LICENSE-2.0 +# # Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +JTAG DPI module for OpenOCD remote_bitbang driver +================================================= + +This DPI module provides a "virtual" JTAG connection between a simulated chip +and [OpenOCD](http://openocd.org/). It makes use of the `remote_bitbang` JTAG +driver shipped with OpenOCD, which forwards JTAG requests over TCP to a remote +server. The `jtagdpi` module is instantiated in the hardware simulation to +receive the JTAG requests from OpenOCD and drive the JTAG pins (TCK, TMS, TDI, +etc.) from it. + +The `remote_bitbang` protocol is documented in the OpenOCD source tree at +`doc/manual/jtag/drivers/remote_bitbang.txt`, or online at +https://repo.or.cz/openocd.git/blob/HEAD:/doc/manual/jtag/drivers/remote_bitbang.txt diff --git a/src/integration/test_suites/libs/jtagdpi/jtagdpi.c b/src/integration/test_suites/libs/jtagdpi/jtagdpi.c new file mode 100644 index 000000000..e0b270874 --- /dev/null +++ b/src/integration/test_suites/libs/jtagdpi/jtagdpi.c @@ -0,0 +1,210 @@ +// Copyright lowRISC contributors. +// Copyright 2023 Antmicro. +// Licensed under the Apache License, Version 2.0, see LICENSE for details. +// SPDX-License-Identifier: Apache-2.0 + +#include "jtagdpi.h" + +#include +#include +#include +#include +#include + +#include "tcp_server.h" + +// Uncomment to enable JTAG DPI debugging. The code will print vertically +// oriented waveform for all JTAG signals. +//#define JTAGDPI_DEBUG + +struct jtagdpi_signals { + uint8_t tck; + uint8_t tms; + uint8_t tdi; + uint8_t tdo; + uint8_t trst_n; + uint8_t srst_n; +}; + +struct jtagdpi_ctx { + // Server context + struct tcp_server_ctx *sock; + // Signals + struct jtagdpi_signals curr; +#ifdef JTAGDPI_DEBUG + struct jtagdpi_signals prev; + uint8_t init; +#endif +}; + +/** + * Reset the JTAG signals to a "dongle unplugged" state + */ +static void reset_jtag_signals(struct jtagdpi_ctx *ctx) { + assert(ctx); + + // Set all to zero + memset(&ctx->curr, 0, sizeof(struct jtagdpi_signals)); +#ifdef JTAGDPI_DEBUG + memset(&ctx->prev, 0, sizeof(struct jtagdpi_signals)); +#endif + + // trst_n is pulled down (reset active) by default + // srst_n is pulled up (reset not active) by default + ctx->curr.srst_n = 1; +#ifdef JTAGDPI_DEBUG + ctx->prev.srst_n = 1; +#endif +} + +/** + * Update the JTAG signals in the context structure + */ +static void update_jtag_signals(struct jtagdpi_ctx *ctx) { + assert(ctx); + + /* + * Documentation pointer: + * The remote_bitbang protocol implemented below is documented in the OpenOCD + * source tree at doc/manual/jtag/drivers/remote_bitbang.txt, or online at + * https://repo.or.cz/openocd.git/blob/HEAD:/doc/manual/jtag/drivers/remote_bitbang.txt + */ + + // read a command byte + char cmd; + if (!tcp_server_read(ctx->sock, &cmd)) { + return; + } + + bool act_send_resp = false; + bool act_quit = false; + + // parse received command byte + if (cmd >= '0' && cmd <= '7') { + // JTAG write + char cmd_bit = cmd - '0'; + ctx->curr.tdi = (cmd_bit >> 0) & 0x1; + ctx->curr.tms = (cmd_bit >> 1) & 0x1; + ctx->curr.tck = (cmd_bit >> 2) & 0x1; + } else if (cmd >= 'r' && cmd <= 'u') { + // JTAG reset (active high from OpenOCD) + char cmd_bit = cmd - 'r'; + ctx->curr.srst_n = !((cmd_bit >> 0) & 0x1); + ctx->curr.trst_n = !((cmd_bit >> 1) & 0x1); + } else if (cmd == 'R') { + // JTAG read + act_send_resp = true; + } else if (cmd == 'B') { + // printf("%s: BLINK ON!\n", ctx->display_name); + } else if (cmd == 'b') { + // printf("%s: BLINK OFF!\n", ctx->display_name); + } else if (cmd == 'Q') { + // quit (client disconnect) + act_quit = true; + } else { + fprintf(stderr, + "JTAG DPI Protocol violation detected: unsupported command %c\n", + cmd); + exit(1); + } + + // send tdo as response + if (act_send_resp) { + char tdo_ascii = ctx->curr.tdo + '0'; + tcp_server_write(ctx->sock, tdo_ascii); + } + + if (act_quit) { + printf("JTAG DPI: Remote disconnected.\n"); + tcp_server_client_close(ctx->sock); + } +} + +void *jtagdpi_create(const char *display_name, int listen_port) { + struct jtagdpi_ctx *ctx = + (struct jtagdpi_ctx *)calloc(1, sizeof(struct jtagdpi_ctx)); + assert(ctx); + + // Create socket + ctx->sock = tcp_server_create(display_name, listen_port); +#ifdef JTAGDPI_DEBUG + ctx->init = 1; +#endif + + reset_jtag_signals(ctx); + + printf( + "\n" + "JTAG: Virtual JTAG interface %s is listening on port %d. Use\n" + "OpenOCD and the following configuration to connect:\n" + " interface remote_bitbang\n" + " remote_bitbang_host localhost\n" + " remote_bitbang_port %d\n", + display_name, listen_port, listen_port); + + return (void *)ctx; +} + +void jtagdpi_close(void *ctx_void) { + struct jtagdpi_ctx *ctx = (struct jtagdpi_ctx *)ctx_void; + if (!ctx) { + return; + } + tcp_server_close(ctx->sock); + free(ctx); +} + +#ifdef JTAGDPI_DEBUG +static void jtagdpi_dbg(struct jtagdpi_ctx *ctx) { + + uint8_t* curr = (uint8_t*)&ctx->curr; + uint8_t* prev = (uint8_t*)&ctx->prev; + + if (ctx->init) { + fprintf(stderr, "tck tms tdi tdo trst srst\n"); + ctx->init = 0; + } + + for (int i=0; i<6; ++i) { + if (!prev[i] && curr[i]) { + fprintf(stderr, "\\ "); + } + if ( prev[i] && curr[i]) { + fprintf(stderr, " | "); + } + if ( prev[i] && !curr[i]) { + fprintf(stderr, "/ "); + } + if (!prev[i] && !curr[i]) { + fprintf(stderr, "| "); + } + } + fprintf(stderr, "\n"); +} +#endif + +void jtagdpi_tick(void *ctx_void, svBit *tck, svBit *tms, svBit *tdi, + svBit *trst_n, svBit *srst_n, const svBit tdo) { + struct jtagdpi_ctx *ctx = (struct jtagdpi_ctx *)ctx_void; + + // Get TDO + ctx->curr.tdo = tdo; + + // TODO: Evaluate moving this functionality into a separate thread + if (ctx) { + update_jtag_signals(ctx); + } + +#ifdef JTAGDPI_DEBUG + if (memcmp(&ctx->curr, &ctx->prev, sizeof(struct jtagdpi_signals))) { + jtagdpi_dbg(ctx); + memcpy(&ctx->prev, &ctx->curr, sizeof(struct jtagdpi_signals)); + } +#endif + + *tdi = ctx->curr.tdi; + *tms = ctx->curr.tms; + *tck = ctx->curr.tck; + *srst_n = ctx->curr.srst_n; + *trst_n = ctx->curr.trst_n; +} diff --git a/src/integration/test_suites/libs/jtagdpi/jtagdpi.h b/src/integration/test_suites/libs/jtagdpi/jtagdpi.h new file mode 100644 index 000000000..9ecb2a104 --- /dev/null +++ b/src/integration/test_suites/libs/jtagdpi/jtagdpi.h @@ -0,0 +1,56 @@ +// Copyright lowRISC contributors. +// Licensed under the Apache License, Version 2.0, see LICENSE for details. +// SPDX-License-Identifier: Apache-2.0 + +#ifndef OPENTITAN_HW_DV_DPI_JTAGDPI_JTAGDPI_H_ +#define OPENTITAN_HW_DV_DPI_JTAGDPI_JTAGDPI_H_ + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +struct jtagdpi_ctx; + +/** + * Constructor: Create and initialize jtagdpi context object + * + * Call from a initial block. + * + * @param display_name Name of the JTAG interface (for display purposes only) + * @param listen_port Port to listen on + * @return an initialized struct jtagdpi_ctx context object + */ +void *jtagdpi_create(const char *display_name, int listen_port); + +/** + * Destructor: Close all connections and free all resources + * + * Call from a finish block. + * + * @param ctx_void a struct jtagdpi_ctx context object + */ +void jtagdpi_close(void *ctx_void); + +/** + * Drive JTAG signals + * + * Call this function from the simulation at every clock tick to read/write + * from/to the JTAG signals. + * + * @param ctx_void a struct jtagdpi_ctx context object + * @param tck JTAG test clock signal + * @param tms JTAG test mode select signal + * @param tdi JTAG test data input signal + * @param trst_n JTAG test reset signal (active low) + * @param srst_n JTAG system reset signal (active low) + * @param tdo JTAG test data out + */ +void jtagdpi_tick(void *ctx_void, svBit *tck, svBit *tms, svBit *tdi, + svBit *trst_n, svBit *srst_n, const svBit tdo); + +#ifdef __cplusplus +} // extern "C" +#endif +#endif // OPENTITAN_HW_DV_DPI_JTAGDPI_JTAGDPI_H_ diff --git a/src/integration/test_suites/libs/jtagdpi/jtagdpi.sv b/src/integration/test_suites/libs/jtagdpi/jtagdpi.sv new file mode 100644 index 000000000..e69d719b5 --- /dev/null +++ b/src/integration/test_suites/libs/jtagdpi/jtagdpi.sv @@ -0,0 +1,47 @@ +// Copyright lowRISC contributors. +// Licensed under the Apache License, Version 2.0, see LICENSE for details. +// SPDX-License-Identifier: Apache-2.0 + +module jtagdpi #( + parameter string Name = "jtag0", // name of the JTAG interface (display only) + parameter int ListenPort = 44853 // TCP port to listen on +)( + input logic clk_i, + input logic rst_ni, + + output logic jtag_tck, + output logic jtag_tms, + output logic jtag_tdi, + input logic jtag_tdo, + output logic jtag_trst_n, + output logic jtag_srst_n +); + + import "DPI-C" + function chandle jtagdpi_create(input string name, input int listen_port); + + import "DPI-C" + function void jtagdpi_tick(input chandle ctx, output bit tck, output bit tms, + output bit tdi, output bit trst_n, + output bit srst_n, input bit tdo); + + import "DPI-C" + function void jtagdpi_close(input chandle ctx); + + chandle ctx; + + initial begin + ctx = jtagdpi_create(Name, ListenPort); + end + + final begin + jtagdpi_close(ctx); + ctx = null; + end + + always_ff @(posedge clk_i, negedge rst_ni) begin + jtagdpi_tick(ctx, jtag_tck, jtag_tms, jtag_tdi, jtag_trst_n, jtag_srst_n, + jtag_tdo); + end + +endmodule diff --git a/src/integration/test_suites/libs/printf/printf.c b/src/integration/test_suites/libs/printf/printf.c index a2c8161de..367fe3a1d 100644 --- a/src/integration/test_suites/libs/printf/printf.c +++ b/src/integration/test_suites/libs/printf/printf.c @@ -164,6 +164,7 @@ whisperPrintfImpl(const char* format, va_list ap) for (const char* fp = format; *fp; fp++) { + char* s; char pad = ' '; int width = 0; // Field width @@ -232,7 +233,12 @@ whisperPrintfImpl(const char* format, va_list ap) break; case 's': - count += whisperPuts(va_arg(ap, char*)); + s = va_arg(ap, char*); + while(*s) { + whisperPutc(*s++); + ++count; + } +// count += whisperPuts(va_arg(ap, char*)); break; /* case 'g': diff --git a/src/integration/test_suites/libs/riscv_hw_if/link.ld b/src/integration/test_suites/libs/riscv_hw_if/link.ld index 9e9fd868b..b4edd0b42 100644 --- a/src/integration/test_suites/libs/riscv_hw_if/link.ld +++ b/src/integration/test_suites/libs/riscv_hw_if/link.ld @@ -39,7 +39,7 @@ SECTIONS { _bss_vma_end = _bss_vma_start + SIZEOF(.bss); _end = _bss_lma_end; - ASSERT( _end < 0x00008000, "ERROR: ROM size exceeds 32KiB") + ASSERT( _end < 0x0000C000, "ERROR: ROM size exceeds 48KiB") /* DCCM as VMA and LMA */ . = _bss_vma_end; diff --git a/src/integration/test_suites/libs/sha256/sha256.c b/src/integration/test_suites/libs/sha256/sha256.c index 71040cf7f..3d3940d72 100644 --- a/src/integration/test_suites/libs/sha256/sha256.c +++ b/src/integration/test_suites/libs/sha256/sha256.c @@ -16,6 +16,22 @@ #include "caliptra_defines.h" #include "printf.h" #include "sha256.h" +#include "caliptra_isr.h" + +extern volatile caliptra_intr_received_s cptra_intr_rcv; + +void wait_for_sha256_intr(){ + printf("SHA256 flow in progress...\n"); + while((cptra_intr_rcv.sha256_error == 0) & (cptra_intr_rcv.sha256_notif == 0)){ + __asm__ volatile ("wfi"); // "Wait for interrupt" + // Sleep during SHA256 operation to allow ISR to execute and show idle time in sims + for (uint16_t slp = 0; slp < 100; slp++) { + __asm__ volatile ("nop"); // Sleep loop as "nop" + } + }; + //printf("Received SHA256 error intr with status = %d\n", cptra_intr_rcv.sha256_error); + printf("Received SHA256 notif intr with status = %d\n", cptra_intr_rcv.sha256_notif); +} void sha256_zeroize(){ printf("SHA256 zeroize flow.\n"); @@ -44,7 +60,7 @@ void sha256_flow(sha256_io block, uint8_t mode, sha256_io digest){ (mode << SHA256_REG_SHA256_CTRL_MODE_LOW) & SHA256_REG_SHA256_CTRL_MODE_MASK); // wait for SHA to be valid - while((lsu_read_32(CLP_SHA256_REG_SHA256_STATUS) & SHA256_REG_SHA256_STATUS_VALID_MASK) == 0); + wait_for_sha256_intr(); reg_ptr = (uint32_t *) CLP_SHA256_REG_SHA256_DIGEST_0; printf("Load DIGEST data from SHA256\n"); diff --git a/src/integration/test_suites/libs/sha512/sha512.c b/src/integration/test_suites/libs/sha512/sha512.c index 3e3a79137..ed6f07dd4 100644 --- a/src/integration/test_suites/libs/sha512/sha512.c +++ b/src/integration/test_suites/libs/sha512/sha512.c @@ -17,6 +17,22 @@ #include "sha512.h" #include "printf.h" #include "riscv_hw_if.h" +#include "caliptra_isr.h" + +extern volatile caliptra_intr_received_s cptra_intr_rcv; + +void wait_for_sha512_intr(){ + printf("SHA512 flow in progress...\n"); + while((cptra_intr_rcv.sha512_error == 0) & (cptra_intr_rcv.sha512_notif == 0)){ + __asm__ volatile ("wfi"); // "Wait for interrupt" + // Sleep during SHA512 operation to allow ISR to execute and show idle time in sims + for (uint16_t slp = 0; slp < 100; slp++) { + __asm__ volatile ("nop"); // Sleep loop as "nop" + } + }; + //printf("Received SHA512 error intr with status = %d\n", cptra_intr_rcv.sha512_error); + printf("Received SHA512 notif intr with status = %d\n", cptra_intr_rcv.sha512_notif); +} void sha_init(enum sha512_mode_e mode) { VPRINTF(MEDIUM,"SHA512: Set mode: 0x%x and init\n", mode); @@ -101,7 +117,7 @@ void sha384_kvflow(uint8_t sha_kv_id, uint8_t store_to_kv, uint8_t digest_kv_id, SHA512_REG_SHA512_CTRL_LAST_MASK); // wait for SHA to be valid - while((lsu_read_32(CLP_SHA512_REG_SHA512_STATUS) & SHA512_REG_SHA512_STATUS_VALID_MASK) == 0); + wait_for_sha512_intr(); // if we want to store the results into kv printf("check digest\n"); @@ -132,4 +148,46 @@ void sha384_kvflow(uint8_t sha_kv_id, uint8_t store_to_kv, uint8_t digest_kv_id, void sha512_zeroize(){ printf("SHA512 zeroize flow.\n"); lsu_write_32(CLP_SHA512_REG_SHA512_CTRL, (1 << SHA512_REG_SHA512_CTRL_ZEROIZE_LOW) & SHA512_REG_SHA512_CTRL_ZEROIZE_MASK); +} + +void sha512_flow(sha512_io block, uint8_t mode, sha512_io digest){ + volatile uint32_t * reg_ptr; + uint8_t offset; + uint8_t fail_cmd = 0x1; + uint32_t sha512_digest [16]; + + // wait for SHA to be ready + while((lsu_read_32(CLP_SHA512_REG_SHA512_STATUS) & SHA512_REG_SHA512_STATUS_READY_MASK) == 0); + + // Write SHA512 block + reg_ptr = (uint32_t*) CLP_SHA512_REG_SHA512_BLOCK_0; + offset = 0; + while (reg_ptr <= (uint32_t*) CLP_SHA512_REG_SHA512_BLOCK_31) { + *reg_ptr++ = block.data[offset++]; + } + + // Enable SHA512 core + VPRINTF(LOW, "Enable SHA512\n"); + lsu_write_32(CLP_SHA512_REG_SHA512_CTRL, SHA512_REG_SHA512_CTRL_INIT_MASK | + (mode << SHA512_REG_SHA512_CTRL_MODE_LOW) & SHA512_REG_SHA512_CTRL_MODE_MASK); + + // wait for SHA to be valid + wait_for_sha512_intr(); + + reg_ptr = (uint32_t *) CLP_SHA512_REG_SHA512_DIGEST_0; + printf("Load DIGEST data from SHA512\n"); + offset = 0; + while (reg_ptr <= (uint32_t*) CLP_SHA512_REG_SHA512_DIGEST_15) { + sha512_digest[offset] = *reg_ptr; + if (sha512_digest[offset] != digest.data[offset]) { + printf("At offset [%d], sha_digest data mismatch!\n", offset); + printf("Actual data: 0x%x\n", sha512_digest[offset]); + printf("Expected data: 0x%x\n", digest.data[offset]); + printf("%c", fail_cmd); + while(1); + } + reg_ptr++; + offset++; + } + } \ No newline at end of file diff --git a/src/integration/test_suites/libs/sha512/sha512.h b/src/integration/test_suites/libs/sha512/sha512.h index 5dd27980f..c485f4222 100644 --- a/src/integration/test_suites/libs/sha512/sha512.h +++ b/src/integration/test_suites/libs/sha512/sha512.h @@ -28,6 +28,11 @@ enum sha512_mode_e { SHA512_512_MODE = 0x3 }; +typedef struct { + uint8_t data_size; + uint32_t data[32]; +}sha512_io; + /* --------------- Function Prototypes --------------- */ void sha_init(enum sha512_mode_e mode); void sha_next(enum sha512_mode_e mode); @@ -36,6 +41,7 @@ void sha_next_last(enum sha512_mode_e mode); void sha384_kvflow(uint8_t sha_kv_id, uint8_t store_to_kv, uint8_t digest_kv_id, uint32_t expected_digest[12]); void sha512_zeroize(); +void sha512_flow(sha512_io block, uint8_t mode, sha512_io digest); //polls until sha512 is ready to be used inline void sha512_poll_ready() { diff --git a/src/integration/test_suites/libs/soc_ifc/soc_ifc.c b/src/integration/test_suites/libs/soc_ifc/soc_ifc.c index 564957843..7d23f2006 100644 --- a/src/integration/test_suites/libs/soc_ifc/soc_ifc.c +++ b/src/integration/test_suites/libs/soc_ifc/soc_ifc.c @@ -25,6 +25,30 @@ void soc_ifc_clear_execute_reg() { lsu_write_32(CLP_MBOX_CSR_MBOX_EXECUTE,reg); } +// Return 0 if the MBOX_FSM_PS field reports MBOX_EXECUTE_UC, as expected +// Return 1 if the MBOX_FSM_PS field reports MBOX_IDLE, indicating mailbox was already force-unlocked (after receiving a cmd_avail interrupt) +// Return F if the MBOX_FSM_PS field reports MBOX_ERROR (to which this routine responds with a force-unlock) +// Return FF if the MBOX_FSM_PS field reports any other state, which should never happen when this is called +uint8_t soc_ifc_chk_execute_uc() { + enum mbox_fsm_e state; + VPRINTF(HIGH,"SOC_IFC: Check mbox_status.mbox_fsm_ps\n"); + state = (lsu_read_32(CLP_MBOX_CSR_MBOX_STATUS) & MBOX_CSR_MBOX_STATUS_MBOX_FSM_PS_MASK) >> MBOX_CSR_MBOX_STATUS_MBOX_FSM_PS_LOW; + if (state == MBOX_EXECUTE_UC) { + VPRINTF(HIGH,"SOC_IFC: Check mbox_status.mbox_fsm_ps found MBOX_EXECUTE_UC\n"); + return 0; + } else if (state == MBOX_IDLE) { + VPRINTF(WARNING,"SOC_IFC: Check mbox_status.mbox_fsm_ps found MBOX_IDLE\n"); + return 1; + } else if (state == MBOX_ERROR) { + VPRINTF(ERROR,"SOC_IFC: Check mbox_status.mbox_fsm_ps found MBOX_ERROR, executing mailbox force-unlock\n"); + lsu_write_32(CLP_MBOX_CSR_MBOX_UNLOCK, MBOX_CSR_MBOX_UNLOCK_UNLOCK_MASK); + return 0xF; + } else { + VPRINTF(FATAL,"SOC_IFC: Check mbox_status.mbox_fsm_ps found unexpected state 0x%x\n", state); + return 0xFF; + } +} + void soc_ifc_set_mbox_status_field(enum mbox_status_e field) { VPRINTF(MEDIUM,"SOC_IFC: Set mbox_status field: 0x%x\n", field); uint32_t reg; @@ -45,6 +69,29 @@ void soc_ifc_set_flow_status_field(uint32_t field) { lsu_write_32(CLP_SOC_IFC_REG_CPTRA_FLOW_STATUS,reg); } +// This function as implemented will clear all the bits in the register on writing '1; +// In future, if this register has additional bits that cannot be cleared on writing '1, +// then this function also needs an update in addition to the RTL itself +void soc_ifc_w1clr_sha_lock_field(uint32_t field) { + VPRINTF(MEDIUM,"SOC_IFC: Clear SHA accelerator lock by writing '1: 0x%x\n", field); + uint32_t reg; + reg = lsu_read_32(CLP_SHA512_ACC_CSR_LOCK); + if (field & ~SHA512_ACC_CSR_LOCK_LOCK_MASK) { + VPRINTF(FATAL, "SOC_IFC: Bad field value"); + SEND_STDOUT_CTRL(0x1); + } + else if (reg & ~SHA512_ACC_CSR_LOCK_LOCK_MASK) { + VPRINTF(FATAL, "SOC_IFC: Bad field value"); + SEND_STDOUT_CTRL(0x1); + } + if (field & SHA512_ACC_CSR_LOCK_LOCK_MASK) { + reg = (reg & ~SHA512_ACC_CSR_LOCK_LOCK_MASK) | field; + } else { + reg |= field; + } + lsu_write_32(CLP_SHA512_ACC_CSR_LOCK,reg); +} + void soc_ifc_clr_flow_status_field(uint32_t field) { VPRINTF(MEDIUM,"SOC_IFC: Clear flow_status field: 0x%x\n", field); uint32_t reg; @@ -180,9 +227,18 @@ void soc_ifc_fw_update(mbox_op_s op) { } } -void soc_ifc_set_fw_update_reset() { - VPRINTF(MEDIUM,"SOC_IFC: Set fw update reset\n"); +void soc_ifc_set_fw_update_reset(uint8_t wait_cycles) { uint32_t reg; + VPRINTF(MEDIUM,"SOC_IFC: Set fw update reset with wait_cycles [%d] (%s)\n", wait_cycles, wait_cycles > 5 ? "will override" : wait_cycles > 0 ? "will use default 5" : "won't override"); + // A 0-value argument means don't override the current value + if (wait_cycles) { + // Enforce minimum wait_cycles of 5 + if (wait_cycles > 5) { + lsu_write_32(CLP_SOC_IFC_REG_INTERNAL_FW_UPDATE_RESET_WAIT_CYCLES, wait_cycles); + } else { + lsu_write_32(CLP_SOC_IFC_REG_INTERNAL_FW_UPDATE_RESET_WAIT_CYCLES, 5); + } + } reg = lsu_read_32(CLP_SOC_IFC_REG_INTERNAL_FW_UPDATE_RESET); reg = (reg | SOC_IFC_REG_INTERNAL_FW_UPDATE_RESET_CORE_RST_MASK); lsu_write_32(CLP_SOC_IFC_REG_INTERNAL_FW_UPDATE_RESET,reg); @@ -207,4 +263,4 @@ void soc_ifc_sha_accel_poll_status() { void soc_ifc_sha_accel_clr_lock() { //Write one to clear lsu_write_32((CLP_SHA512_ACC_CSR_LOCK), SHA512_ACC_CSR_LOCK_LOCK_MASK); -} \ No newline at end of file +} diff --git a/src/integration/test_suites/libs/soc_ifc/soc_ifc.h b/src/integration/test_suites/libs/soc_ifc/soc_ifc.h index f1f235aa9..99fd2a28e 100644 --- a/src/integration/test_suites/libs/soc_ifc/soc_ifc.h +++ b/src/integration/test_suites/libs/soc_ifc/soc_ifc.h @@ -34,26 +34,32 @@ enum mbox_fsm_e { MBOX_RDY_FOR_DATA = 0x2, MBOX_RDY_FOR_DLEN = 0x3, MBOX_EXECUTE_UC = 0x6, - MBOX_EXECUTE_SOC = 0x4 + MBOX_EXECUTE_SOC = 0x4, + MBOX_ERROR = 0x7 }; /** * Decode: * [31]: Firmware command * [30]: Response required (if set) +* [29]: uC to SOC Mailbox command */ enum { - MBOX_CMD_FIELD_FW_LOW = 31, - MBOX_CMD_FIELD_RESP_LOW = 30 + MBOX_CMD_FIELD_FW_LOW = 31, + MBOX_CMD_FIELD_RESP_LOW = 30, + MBOX_CMD_FIELD_UC_TO_SOC_LOW = 29 }; enum { - MBOX_CMD_FIELD_FW_MASK = 1 << MBOX_CMD_FIELD_FW_LOW , - MBOX_CMD_FIELD_RESP_MASK = 1 << MBOX_CMD_FIELD_RESP_LOW + MBOX_CMD_FIELD_FW_MASK = 1 << MBOX_CMD_FIELD_FW_LOW , + MBOX_CMD_FIELD_RESP_MASK = 1 << MBOX_CMD_FIELD_RESP_LOW, + MBOX_CMD_FIELD_UC_TO_SOC_MASK = 1 << MBOX_CMD_FIELD_UC_TO_SOC_LOW }; enum mbox_cmd_e { + MBOX_CMD_DIR_RD = 0x01000000, MBOX_CMD_UC_BASIC = 0x20000000, + MBOX_CMD_UC_OVERRUN = 0x20000001, MBOX_CMD_RESP_BASIC = 0x40000000, MBOX_CMD_REG_ACCESS = 0x40000001, MBOX_CMD_OOB_ACCESS = 0x40000002, @@ -88,11 +94,18 @@ enum sha_accel_mode_e { inline uint32_t soc_ifc_mbox_read_dataout_single() { return lsu_read_32(CLP_MBOX_CSR_MBOX_DATAOUT); } +inline uint32_t soc_ifc_mbox_dir_read_single(uint32_t rdptr) { + return lsu_read_32(0x30000000 + rdptr); +} +inline uint32_t soc_ifc_mbox_dir_write_single(uint32_t wrptr, uint32_t wrdata) { + lsu_write_32(0x30000000 + wrptr, wrdata); +} void soc_ifc_clear_execute_reg(); +uint8_t soc_ifc_chk_execute_uc(); void soc_ifc_set_mbox_status_field(enum mbox_status_e field); void soc_ifc_set_flow_status_field(uint32_t field); void soc_ifc_clr_flow_status_field(uint32_t field); -void soc_ifc_set_fw_update_reset(); +void soc_ifc_set_fw_update_reset(uint8_t wait_cycles); inline void soc_ifc_set_iccm_lock() { lsu_write_32((CLP_SOC_IFC_REG_INTERNAL_ICCM_LOCK), SOC_IFC_REG_INTERNAL_ICCM_LOCK_LOCK_MASK); } @@ -109,5 +122,6 @@ inline void soc_ifc_sha_accel_execute() { } void soc_ifc_sha_accel_poll_status(); void soc_ifc_sha_accel_clr_lock(); +void soc_ifc_w1clr_sha_lock_field(); #endif diff --git a/src/integration/test_suites/libs/tcp_server/tcp_server.c b/src/integration/test_suites/libs/tcp_server/tcp_server.c new file mode 100644 index 000000000..c0abb95c0 --- /dev/null +++ b/src/integration/test_suites/libs/tcp_server/tcp_server.c @@ -0,0 +1,439 @@ +// Copyright lowRISC contributors. +// Licensed under the Apache License, Version 2.0, see LICENSE for details. +// SPDX-License-Identifier: Apache-2.0 + +#include "tcp_server.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +/** + * Simple buffer for passing data between TCP sockets and DPI modules + */ +#define BUFSIZE_BYTE 1024 // FIXME: This must be larger than the remote_bitbang + // buffer in OpenOCD. Otherwise deadlock occurs. + +struct tcp_buf { + unsigned int rptr; + unsigned int wptr; + char buf[BUFSIZE_BYTE]; +}; + +/** + * TCP Server thread context structure + */ +struct tcp_server_ctx { + // Writeable by the host thread + char *display_name; + uint16_t listen_port; + volatile bool socket_run; + // Writeable by the server thread + struct tcp_buf *buf_in; + struct tcp_buf *buf_out; + int sfd; // socket fd + int cfd; // client fd + pthread_t sock_thread; +}; + +static bool tcp_buffer_is_full(struct tcp_buf *buf) { + if (buf->wptr >= buf->rptr) { + return (buf->wptr - buf->rptr) == (BUFSIZE_BYTE - 1); + } else { + return (buf->rptr - buf->wptr) == 1; + } +} + +static bool tcp_buffer_is_empty(struct tcp_buf *buf) { + return (buf->wptr == buf->rptr); +} + +static void tcp_buffer_put_byte(struct tcp_buf *buf, char dat) { + bool done = false; + while (!done) { + if (!tcp_buffer_is_full(buf)) { + buf->buf[buf->wptr++] = dat; + buf->wptr %= BUFSIZE_BYTE; + done = true; + } + } +} + +static bool tcp_buffer_get_byte(struct tcp_buf *buf, char *dat) { + if (tcp_buffer_is_empty(buf)) { + return false; + } + *dat = buf->buf[buf->rptr++]; + buf->rptr %= BUFSIZE_BYTE; + return true; +} + +static struct tcp_buf *tcp_buffer_new(void) { + struct tcp_buf *buf_new; + buf_new = (struct tcp_buf *)malloc(sizeof(struct tcp_buf)); + buf_new->rptr = 0; + buf_new->wptr = 0; + return buf_new; +} + +static void tcp_buffer_free(struct tcp_buf **buf) { + free(*buf); + *buf = NULL; +} + +/** + * Start a TCP server + * + * This function creates attempts to create a new TCP socket instance. The + * socket is a non-blocking stream socket, with buffering disabled. + * + * @param ctx context object + * @return 0 on success, -1 in case of an error + */ +static int start(struct tcp_server_ctx *ctx) { + int rv; + + assert(ctx->sfd == 0 && "Server already started."); + + // create socket + int sfd = socket(AF_INET, SOCK_STREAM, 0); + if (sfd == -1) { + fprintf(stderr, "%s: Unable to create socket: %s (%d)\n", ctx->display_name, + strerror(errno), errno); + return -1; + } + + rv = fcntl(sfd, F_SETFL, O_NONBLOCK); + if (rv != 0) { + fprintf(stderr, "%s: Unable to make socket non-blocking: %s (%d)\n", + ctx->display_name, strerror(errno), errno); + return -1; + } + + // reuse existing socket (if existing) + int reuse_socket = 1; + rv = setsockopt(sfd, SOL_SOCKET, SO_REUSEADDR, &reuse_socket, sizeof(int)); + if (rv != 0) { + fprintf(stderr, "%s: Unable to set socket options: %s (%d)\n", + ctx->display_name, strerror(errno), errno); + return -1; + } + + // stop tcp socket from buffering (buffering prevents timely responses to + // OpenOCD which severly limits debugging performance) + int tcp_nodelay = 1; + rv = setsockopt(sfd, IPPROTO_TCP, TCP_NODELAY, &tcp_nodelay, sizeof(int)); + if (rv != 0) { + fprintf(stderr, "%s: Unable to set socket nodelay: %s (%d)\n", + ctx->display_name, strerror(errno), errno); + return -1; + } + + // bind server + struct sockaddr_in addr; + memset(&addr, 0, sizeof(addr)); + addr.sin_family = AF_INET; + addr.sin_addr.s_addr = htonl(INADDR_ANY); + addr.sin_port = htons(ctx->listen_port); + + rv = bind(sfd, (struct sockaddr *)&addr, sizeof(addr)); + if (rv != 0) { + fprintf(stderr, "%s: Failed to bind socket: %s (%d)\n", ctx->display_name, + strerror(errno), errno); + return -1; + } + + // listen for incoming connections + rv = listen(sfd, 1); + if (rv != 0) { + fprintf(stderr, "%s: Failed to listen on socket: %s (%d)\n", + ctx->display_name, strerror(errno), errno); + return -1; + } + + ctx->sfd = sfd; + assert(ctx->sfd > 0); + + return 0; +} + +/** + * Accept an incoming connection from a client (nonblocking) + * + * The resulting client fd is made non-blocking. + * + * @param ctx context object + * @return 0 on success, any other value indicates an error + */ +static int client_tryaccept(struct tcp_server_ctx *ctx) { + int rv; + + assert(ctx->sfd > 0); + assert(ctx->cfd == 0); + + int cfd = accept(ctx->sfd, NULL, NULL); + + if (cfd == -1 && errno == EAGAIN) { + return -EAGAIN; + } + + if (cfd == -1) { + fprintf(stderr, "%s: Unable to accept incoming connection: %s (%d)\n", + ctx->display_name, strerror(errno), errno); + return -1; + } + + rv = fcntl(cfd, F_SETFL, O_NONBLOCK); + if (rv != 0) { + fprintf(stderr, "%s: Unable to make client socket non-blocking: %s (%d)\n", + ctx->display_name, strerror(errno), errno); + return -1; + } + + ctx->cfd = cfd; + assert(ctx->cfd > 0); + + printf("%s: Accepted client connection\n", ctx->display_name); + + return 0; +} + +/** + * Stop the TCP server + * + * @param ctx context object + */ +static void stop(struct tcp_server_ctx *ctx) { + assert(ctx); + if (!ctx->sfd) { + return; + } + close(ctx->sfd); + ctx->sfd = 0; +} + +/** + * Receive a byte from a connected client + * + * @param ctx context object + * @param cmd byte received + * @return true if a byte was read + */ +static bool get_byte(struct tcp_server_ctx *ctx, char *cmd) { + assert(ctx); + + ssize_t num_read = read(ctx->cfd, cmd, 1); + + if (num_read == 0) { + return false; + } + if (num_read == -1) { + if (errno == EAGAIN || errno == EWOULDBLOCK) { + return false; + } else if (errno == EBADF) { + // Possibly client went away? Accept a new connection. + fprintf(stderr, "%s: Client disappeared.\n", ctx->display_name); + tcp_server_client_close(ctx); + return false; + } else { + fprintf(stderr, "%s: Error while reading from client: %s (%d)\n", + ctx->display_name, strerror(errno), errno); + assert(0 && "Error reading from client"); + } + } + assert(num_read == 1); + return true; +} + +/** + * Send a byte to a connected client + * + * @param ctx context object + * @param cmd byte to send + */ +static void put_byte(struct tcp_server_ctx *ctx, char cmd) { + while (1) { + ssize_t num_written = send(ctx->cfd, &cmd, sizeof(cmd), MSG_NOSIGNAL); + if (num_written == -1) { + if (errno == EAGAIN || errno == EWOULDBLOCK) { + continue; + } else if (errno == EPIPE) { + printf("%s: Remote disconnected.\n", ctx->display_name); + tcp_server_client_close(ctx); + break; + } else { + fprintf(stderr, "%s: Error while writing to client: %s (%d)\n", + ctx->display_name, strerror(errno), errno); + assert(0 && "Error writing to client."); + } + } + if (num_written >= 1) { + break; + } + } +} + +/** + * Cleanup server context + * + * @param ctx context object + */ +static void ctx_free(struct tcp_server_ctx *ctx) { + // Free the buffers + tcp_buffer_free(&ctx->buf_in); + tcp_buffer_free(&ctx->buf_out); + // Free the display name + free(ctx->display_name); + // Free the ctx + free(ctx); + ctx = NULL; +} + +/** + * Thread function to create a new server instance + * + * @param ctx_void context object + * @return Always returns NULL + */ +static void *server_create(void *ctx_void) { + // Cast to a server struct + struct tcp_server_ctx *ctx = (struct tcp_server_ctx *)ctx_void; + struct timeval timeout; + + // Start the server + int rv = start(ctx); + if (rv != 0) { + fprintf(stderr, "%s: Unable to create TCP server on port %d\n", + ctx->display_name, ctx->listen_port); + goto err_cleanup_return; + } + + // Initialise timeout + timeout.tv_sec = 0; + + // Initialise fd_set + + // Start waiting for connection / data + char xfer_data; + while (ctx->socket_run) { + // Initialise structure of fds + fd_set read_fds; + FD_ZERO(&read_fds); + if (ctx->sfd) { + FD_SET(ctx->sfd, &read_fds); + } + if (ctx->cfd) { + FD_SET(ctx->cfd, &read_fds); + } + // max fd num + int mfd = (ctx->cfd > ctx->sfd) ? ctx->cfd : ctx->sfd; + + // Set timeout - 50us gives good performance + timeout.tv_usec = 50; + + // Wait for socket activity or timeout + rv = select(mfd + 1, &read_fds, NULL, NULL, &timeout); + + if (rv < 0) { + printf("%s: Socket read failed, port: %d\n", ctx->display_name, + ctx->listen_port); + tcp_server_client_close(ctx); + } + + // New connection + if (FD_ISSET(ctx->sfd, &read_fds)) { + client_tryaccept(ctx); + } + + // New client data + if (FD_ISSET(ctx->cfd, &read_fds)) { + while (get_byte(ctx, &xfer_data)) { + tcp_buffer_put_byte(ctx->buf_in, xfer_data); + } + } + + if (ctx->cfd != 0) { + while (tcp_buffer_get_byte(ctx->buf_out, &xfer_data)) { + put_byte(ctx, xfer_data); + } + } + } + +err_cleanup_return: + + // Simulation done - clean up + tcp_server_client_close(ctx); + stop(ctx); + + return NULL; +} + +// Abstract interface functions +struct tcp_server_ctx *tcp_server_create(const char *display_name, + int listen_port) { + struct tcp_server_ctx *ctx = + (struct tcp_server_ctx *)calloc(1, sizeof(struct tcp_server_ctx)); + assert(ctx); + + // Create the buffers + struct tcp_buf *buf_in = tcp_buffer_new(); + struct tcp_buf *buf_out = tcp_buffer_new(); + assert(buf_in); + assert(buf_out); + + // Populate the struct with buffer pointers + ctx->buf_in = buf_in; + ctx->buf_out = buf_out; + + // Set up socket details + ctx->socket_run = true; + ctx->listen_port = listen_port; + ctx->display_name = strdup(display_name); + assert(ctx->display_name); + + if (pthread_create(&ctx->sock_thread, NULL, server_create, (void *)ctx) != + 0) { + fprintf(stderr, "%s: Unable to create TCP socket thread\n", + ctx->display_name); + ctx_free(ctx); + free(ctx); + return NULL; + } + return ctx; +} + +bool tcp_server_read(struct tcp_server_ctx *ctx, char *dat) { + return tcp_buffer_get_byte(ctx->buf_in, dat); +} + +void tcp_server_write(struct tcp_server_ctx *ctx, char dat) { + tcp_buffer_put_byte(ctx->buf_out, dat); +} + +void tcp_server_close(struct tcp_server_ctx *ctx) { + // Shut down the socket thread + ctx->socket_run = false; + pthread_join(ctx->sock_thread, NULL); + ctx_free(ctx); +} + +void tcp_server_client_close(struct tcp_server_ctx *ctx) { + assert(ctx); + + if (!ctx->cfd) { + return; + } + + close(ctx->cfd); + ctx->cfd = 0; +} diff --git a/src/integration/test_suites/libs/tcp_server/tcp_server.h b/src/integration/test_suites/libs/tcp_server/tcp_server.h new file mode 100644 index 000000000..5226322f9 --- /dev/null +++ b/src/integration/test_suites/libs/tcp_server/tcp_server.h @@ -0,0 +1,71 @@ +// Copyright lowRISC contributors. +// Licensed under the Apache License, Version 2.0, see LICENSE for details. +// SPDX-License-Identifier: Apache-2.0 + +#ifndef OPENTITAN_HW_DV_DPI_COMMON_TCP_SERVER_TCP_SERVER_H_ +#define OPENTITAN_HW_DV_DPI_COMMON_TCP_SERVER_TCP_SERVER_H_ + +/** + * Functions to create and interact with a threaded TCP server + * + * This is intended to be used by simulation add-on DPI modules to provide + * basic TCP socket communication between a host and simulated peripherals. + */ + +#ifdef __cplusplus +extern "C" { +#endif + +#include +#include + +struct tcp_server_ctx; + +/** + * Non-blocking read of a byte from a connected client + * + * @param ctx tcp server context object + * @param dat byte received + * @return true if a byte was read + */ +bool tcp_server_read(struct tcp_server_ctx *ctx, char *dat); + +/** + * Write a byte to a connected client + * + * The write is internally buffered and so does not block if the client is not + * ready to accept data, but does block if the buffer is full. + * + * @param ctx tcp server context object + * @param dat byte to send + */ +void tcp_server_write(struct tcp_server_ctx *ctx, char dat); + +/** + * Create a new TCP server instance + * + * @param display_name C string description of server + * @param listen_port On which port the server should listen + * @return A pointer to the created context struct + */ +struct tcp_server_ctx *tcp_server_create(const char *display_name, + int listen_port); + +/** + * Shut down the server and free all reserved memory + * + * @param ctx tcp server context object + */ +void tcp_server_close(struct tcp_server_ctx *ctx); + +/** + * Instruct the server to disconnect a client + * + * @param ctx tcp server context object + */ +void tcp_server_client_close(struct tcp_server_ctx *ctx); + +#ifdef __cplusplus +} // extern "C" +#endif +#endif // OPENTITAN_HW_DV_DPI_COMMON_TCP_SERVER_TCP_SERVER_H_ diff --git a/src/integration/test_suites/memCpy_ROM_to_dccm/caliptra_isr.h b/src/integration/test_suites/memCpy_ROM_to_dccm/caliptra_isr.h new file mode 100644 index 000000000..8f5779e04 --- /dev/null +++ b/src/integration/test_suites/memCpy_ROM_to_dccm/caliptra_isr.h @@ -0,0 +1,247 @@ +// SPDX-License-Identifier: Apache-2.0 +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// --------------------------------------------------------------------- +// File: caliptra_isr.h +// Description: +// Provides function declarations for use by external test files, so +// that the ISR functionality may behave like a library. +// TODO: +// This header file includes inline function definitions for event and +// test specific interrupt service behavior, so it should be copied and +// modified for each test. +// --------------------------------------------------------------------- + +#ifndef CALIPTRA_ISR_H + #define CALIPTRA_ISR_H + +#define EN_ISR_PRINTS 1 + +#include "caliptra_defines.h" +#include +#include "printf.h" + +/* --------------- symbols/typedefs --------------- */ +typedef struct { + uint32_t doe_error; + uint32_t doe_notif; + uint32_t ecc_error; + uint32_t ecc_notif; + uint32_t hmac_error; + uint32_t hmac_notif; + uint32_t kv_error; + uint32_t kv_notif; + uint32_t sha512_error; + uint32_t sha512_notif; + uint32_t sha256_error; + uint32_t sha256_notif; + uint32_t qspi_error; + uint32_t qspi_notif; + uint32_t uart_error; + uint32_t uart_notif; + uint32_t i3c_error; + uint32_t i3c_notif; + uint32_t soc_ifc_error; + uint32_t soc_ifc_notif; + uint32_t sha512_acc_error; + uint32_t sha512_acc_notif; +} caliptra_intr_received_s; +extern volatile caliptra_intr_received_s cptra_intr_rcv; + +////////////////////////////////////////////////////////////////////////////// +// Function Declarations +// + +// Performs all the CSR setup to configure and enable vectored external interrupts +void init_interrupts(void); + +// These inline functions are used to insert event-specific functionality into the +// otherwise generic ISR that gets laid down by the parameterized macro "nonstd_veer_isr" +inline void service_doe_error_intr() {return;} +inline void service_doe_notif_intr() { + uint32_t * reg = (uint32_t *) (CLP_DOE_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R); + uint32_t sts = *reg; + /* Write 1 to Clear the pending interrupt */ + if (sts & DOE_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK) { + *reg = DOE_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + cptra_intr_rcv.doe_notif |= DOE_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + } + if (sts == 0) { + VPRINTF(ERROR,"bad doe_notif_intr sts:%x\n", sts); + SEND_STDOUT_CTRL(0x1); + while(1); + } +} + +inline void service_ecc_error_intr() {return;} +inline void service_ecc_notif_intr() { + uint32_t * reg = (uint32_t *) (CLP_ECC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R); + uint32_t sts = *reg; + /* Write 1 to Clear the pending interrupt */ + if (sts & ECC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK) { + *reg = ECC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + cptra_intr_rcv.ecc_notif |= ECC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + } + if (sts == 0) { + VPRINTF(ERROR,"bad ecc_notif_intr sts:%x\n", sts); + SEND_STDOUT_CTRL(0x1); + while(1); + } +} + +inline void service_hmac_error_intr() {return;} +inline void service_hmac_notif_intr() { + uint32_t * reg = (uint32_t *) (CLP_HMAC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R); + uint32_t sts = *reg; + /* Write 1 to Clear the pending interrupt */ + if (sts & HMAC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK) { + *reg = HMAC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + cptra_intr_rcv.hmac_notif |= HMAC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + } + if (sts == 0) { + VPRINTF(ERROR,"bad hmac_notif_intr sts:%x\n", sts); + SEND_STDOUT_CTRL(0x1); + while(1); + } +} + +inline void service_kv_error_intr() {return;} +inline void service_kv_notif_intr() {return;} +inline void service_sha512_error_intr() {return;} +inline void service_sha512_notif_intr() { + uint32_t * reg = (uint32_t *) (CLP_SHA512_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R); + uint32_t sts = *reg; + /* Write 1 to Clear the pending interrupt */ + if (sts & SHA512_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK) { + *reg = SHA512_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + cptra_intr_rcv.sha512_notif |= SHA512_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + } + if (sts == 0) { + VPRINTF(ERROR,"bad sha512_notif_intr sts:%x\n", sts); + SEND_STDOUT_CTRL(0x1); + while(1); + } +} + +inline void service_sha256_error_intr() {return;} +inline void service_sha256_notif_intr() { + uint32_t * reg = (uint32_t *) (CLP_SHA256_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R); + uint32_t sts = *reg; + /* Write 1 to Clear the pending interrupt */ + if (sts & SHA256_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK) { + *reg = SHA256_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + cptra_intr_rcv.sha256_notif |= SHA256_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + } + if (sts == 0) { + VPRINTF(ERROR,"bad sha256_notif_intr sts:%x\n", sts); + SEND_STDOUT_CTRL(0x1); + while(1); + } +} + +inline void service_qspi_error_intr() {return;} +inline void service_qspi_notif_intr() {return;} +inline void service_uart_error_intr() {return;} +inline void service_uart_notif_intr() {return;} +inline void service_i3c_error_intr() {return;} +inline void service_i3c_notif_intr() {return;} + +inline void service_soc_ifc_error_intr() { + uint32_t * reg = (uint32_t *) (CLP_SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R); + uint32_t sts = *reg; + /* Write 1 to Clear the pending interrupt */ + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_INTERNAL_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_INTERNAL_STS_MASK; + cptra_intr_rcv.soc_ifc_error |= SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_INTERNAL_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_INV_DEV_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_INV_DEV_STS_MASK; + cptra_intr_rcv.soc_ifc_error |= SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_INV_DEV_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_CMD_FAIL_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_CMD_FAIL_STS_MASK; + cptra_intr_rcv.soc_ifc_error |= SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_CMD_FAIL_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_BAD_FUSE_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_BAD_FUSE_STS_MASK; + cptra_intr_rcv.soc_ifc_error |= SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_BAD_FUSE_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_ICCM_BLOCKED_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_ICCM_BLOCKED_STS_MASK; + cptra_intr_rcv.soc_ifc_error |= SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_ICCM_BLOCKED_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_MBOX_ECC_UNC_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_MBOX_ECC_UNC_STS_MASK; + cptra_intr_rcv.soc_ifc_error |= SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_MBOX_ECC_UNC_STS_MASK; + } + if (sts == 0) { + VPRINTF(ERROR,"bad soc_ifc_error_intr sts:%x\n", sts); + SEND_STDOUT_CTRL(0x1); + while(1); + } +} + +inline void service_soc_ifc_notif_intr () { + uint32_t * reg = (uint32_t *) (CLP_SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R); + uint32_t sts = *reg; + /* Write 1 to Clear the pending interrupt */ + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_AVAIL_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_AVAIL_STS_MASK; + cptra_intr_rcv.soc_ifc_notif |= SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_AVAIL_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_MBOX_ECC_COR_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_MBOX_ECC_COR_STS_MASK; + cptra_intr_rcv.soc_ifc_notif |= SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_MBOX_ECC_COR_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_DEBUG_LOCKED_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_DEBUG_LOCKED_STS_MASK; + cptra_intr_rcv.soc_ifc_notif |= SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_DEBUG_LOCKED_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_SCAN_MODE_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_SCAN_MODE_STS_MASK; + cptra_intr_rcv.soc_ifc_notif |= SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_SCAN_MODE_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_SOC_REQ_LOCK_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_SOC_REQ_LOCK_STS_MASK; + cptra_intr_rcv.soc_ifc_notif |= SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_SOC_REQ_LOCK_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_GEN_IN_TOGGLE_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_GEN_IN_TOGGLE_STS_MASK; + cptra_intr_rcv.soc_ifc_notif |= SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_GEN_IN_TOGGLE_STS_MASK; + } + if (sts == 0) { + VPRINTF(ERROR,"bad soc_ifc_notif_intr sts:%x\n", sts); + SEND_STDOUT_CTRL(0x1); + while(1); + } +} + +inline void service_sha512_acc_error_intr() {return;} +inline void service_sha512_acc_notif_intr() { + uint32_t * reg = (uint32_t *) (CLP_SHA512_ACC_CSR_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R); + uint32_t sts = *reg; + /* Write 1 to Clear the pending interrupt */ + if (sts & SHA512_ACC_CSR_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK) { + *reg = SHA512_ACC_CSR_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + cptra_intr_rcv.sha512_acc_notif |= SHA512_ACC_CSR_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + } + if (sts == 0) { + VPRINTF(ERROR,"bad sha512_acc_notif_intr sts:%x\n", sts); + SEND_STDOUT_CTRL(0x1); + while(1); + } +} + + +#endif //CALIPTRA_ISR_H diff --git a/src/integration/test_suites/memCpy_ROM_to_dccm/memCpy_ROM_to_dccm.s b/src/integration/test_suites/memCpy_ROM_to_dccm/memCpy_ROM_to_dccm.s index ed6178674..600a467d6 100644 --- a/src/integration/test_suites/memCpy_ROM_to_dccm/memCpy_ROM_to_dccm.s +++ b/src/integration/test_suites/memCpy_ROM_to_dccm/memCpy_ROM_to_dccm.s @@ -39,6 +39,9 @@ _start: li x1, 0xaaaaaaaa csrw 0x7c0, x1 + // Call interrupt init + call init_interrupts + // Load string from hw_data // and write to DCCM @@ -67,6 +70,11 @@ _finish: stdout: .word STDOUT .global verbosity_g verbosity_g: .word 2 +// FW polls this variable for intr +.global intr_count +intr_count: .word 0 +.global cptra_intr_rcv +cptra_intr_rcv: .word 0 hw_data: .ascii "----------------------------------\n" .ascii "Hello World from VeeR EL2 !!\n" diff --git a/src/integration/test_suites/memCpy_dccm_to_iccm/caliptra_isr.h b/src/integration/test_suites/memCpy_dccm_to_iccm/caliptra_isr.h new file mode 100644 index 000000000..8f5779e04 --- /dev/null +++ b/src/integration/test_suites/memCpy_dccm_to_iccm/caliptra_isr.h @@ -0,0 +1,247 @@ +// SPDX-License-Identifier: Apache-2.0 +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// --------------------------------------------------------------------- +// File: caliptra_isr.h +// Description: +// Provides function declarations for use by external test files, so +// that the ISR functionality may behave like a library. +// TODO: +// This header file includes inline function definitions for event and +// test specific interrupt service behavior, so it should be copied and +// modified for each test. +// --------------------------------------------------------------------- + +#ifndef CALIPTRA_ISR_H + #define CALIPTRA_ISR_H + +#define EN_ISR_PRINTS 1 + +#include "caliptra_defines.h" +#include +#include "printf.h" + +/* --------------- symbols/typedefs --------------- */ +typedef struct { + uint32_t doe_error; + uint32_t doe_notif; + uint32_t ecc_error; + uint32_t ecc_notif; + uint32_t hmac_error; + uint32_t hmac_notif; + uint32_t kv_error; + uint32_t kv_notif; + uint32_t sha512_error; + uint32_t sha512_notif; + uint32_t sha256_error; + uint32_t sha256_notif; + uint32_t qspi_error; + uint32_t qspi_notif; + uint32_t uart_error; + uint32_t uart_notif; + uint32_t i3c_error; + uint32_t i3c_notif; + uint32_t soc_ifc_error; + uint32_t soc_ifc_notif; + uint32_t sha512_acc_error; + uint32_t sha512_acc_notif; +} caliptra_intr_received_s; +extern volatile caliptra_intr_received_s cptra_intr_rcv; + +////////////////////////////////////////////////////////////////////////////// +// Function Declarations +// + +// Performs all the CSR setup to configure and enable vectored external interrupts +void init_interrupts(void); + +// These inline functions are used to insert event-specific functionality into the +// otherwise generic ISR that gets laid down by the parameterized macro "nonstd_veer_isr" +inline void service_doe_error_intr() {return;} +inline void service_doe_notif_intr() { + uint32_t * reg = (uint32_t *) (CLP_DOE_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R); + uint32_t sts = *reg; + /* Write 1 to Clear the pending interrupt */ + if (sts & DOE_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK) { + *reg = DOE_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + cptra_intr_rcv.doe_notif |= DOE_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + } + if (sts == 0) { + VPRINTF(ERROR,"bad doe_notif_intr sts:%x\n", sts); + SEND_STDOUT_CTRL(0x1); + while(1); + } +} + +inline void service_ecc_error_intr() {return;} +inline void service_ecc_notif_intr() { + uint32_t * reg = (uint32_t *) (CLP_ECC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R); + uint32_t sts = *reg; + /* Write 1 to Clear the pending interrupt */ + if (sts & ECC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK) { + *reg = ECC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + cptra_intr_rcv.ecc_notif |= ECC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + } + if (sts == 0) { + VPRINTF(ERROR,"bad ecc_notif_intr sts:%x\n", sts); + SEND_STDOUT_CTRL(0x1); + while(1); + } +} + +inline void service_hmac_error_intr() {return;} +inline void service_hmac_notif_intr() { + uint32_t * reg = (uint32_t *) (CLP_HMAC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R); + uint32_t sts = *reg; + /* Write 1 to Clear the pending interrupt */ + if (sts & HMAC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK) { + *reg = HMAC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + cptra_intr_rcv.hmac_notif |= HMAC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + } + if (sts == 0) { + VPRINTF(ERROR,"bad hmac_notif_intr sts:%x\n", sts); + SEND_STDOUT_CTRL(0x1); + while(1); + } +} + +inline void service_kv_error_intr() {return;} +inline void service_kv_notif_intr() {return;} +inline void service_sha512_error_intr() {return;} +inline void service_sha512_notif_intr() { + uint32_t * reg = (uint32_t *) (CLP_SHA512_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R); + uint32_t sts = *reg; + /* Write 1 to Clear the pending interrupt */ + if (sts & SHA512_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK) { + *reg = SHA512_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + cptra_intr_rcv.sha512_notif |= SHA512_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + } + if (sts == 0) { + VPRINTF(ERROR,"bad sha512_notif_intr sts:%x\n", sts); + SEND_STDOUT_CTRL(0x1); + while(1); + } +} + +inline void service_sha256_error_intr() {return;} +inline void service_sha256_notif_intr() { + uint32_t * reg = (uint32_t *) (CLP_SHA256_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R); + uint32_t sts = *reg; + /* Write 1 to Clear the pending interrupt */ + if (sts & SHA256_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK) { + *reg = SHA256_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + cptra_intr_rcv.sha256_notif |= SHA256_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + } + if (sts == 0) { + VPRINTF(ERROR,"bad sha256_notif_intr sts:%x\n", sts); + SEND_STDOUT_CTRL(0x1); + while(1); + } +} + +inline void service_qspi_error_intr() {return;} +inline void service_qspi_notif_intr() {return;} +inline void service_uart_error_intr() {return;} +inline void service_uart_notif_intr() {return;} +inline void service_i3c_error_intr() {return;} +inline void service_i3c_notif_intr() {return;} + +inline void service_soc_ifc_error_intr() { + uint32_t * reg = (uint32_t *) (CLP_SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R); + uint32_t sts = *reg; + /* Write 1 to Clear the pending interrupt */ + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_INTERNAL_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_INTERNAL_STS_MASK; + cptra_intr_rcv.soc_ifc_error |= SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_INTERNAL_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_INV_DEV_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_INV_DEV_STS_MASK; + cptra_intr_rcv.soc_ifc_error |= SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_INV_DEV_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_CMD_FAIL_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_CMD_FAIL_STS_MASK; + cptra_intr_rcv.soc_ifc_error |= SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_CMD_FAIL_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_BAD_FUSE_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_BAD_FUSE_STS_MASK; + cptra_intr_rcv.soc_ifc_error |= SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_BAD_FUSE_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_ICCM_BLOCKED_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_ICCM_BLOCKED_STS_MASK; + cptra_intr_rcv.soc_ifc_error |= SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_ICCM_BLOCKED_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_MBOX_ECC_UNC_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_MBOX_ECC_UNC_STS_MASK; + cptra_intr_rcv.soc_ifc_error |= SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_MBOX_ECC_UNC_STS_MASK; + } + if (sts == 0) { + VPRINTF(ERROR,"bad soc_ifc_error_intr sts:%x\n", sts); + SEND_STDOUT_CTRL(0x1); + while(1); + } +} + +inline void service_soc_ifc_notif_intr () { + uint32_t * reg = (uint32_t *) (CLP_SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R); + uint32_t sts = *reg; + /* Write 1 to Clear the pending interrupt */ + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_AVAIL_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_AVAIL_STS_MASK; + cptra_intr_rcv.soc_ifc_notif |= SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_AVAIL_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_MBOX_ECC_COR_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_MBOX_ECC_COR_STS_MASK; + cptra_intr_rcv.soc_ifc_notif |= SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_MBOX_ECC_COR_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_DEBUG_LOCKED_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_DEBUG_LOCKED_STS_MASK; + cptra_intr_rcv.soc_ifc_notif |= SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_DEBUG_LOCKED_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_SCAN_MODE_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_SCAN_MODE_STS_MASK; + cptra_intr_rcv.soc_ifc_notif |= SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_SCAN_MODE_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_SOC_REQ_LOCK_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_SOC_REQ_LOCK_STS_MASK; + cptra_intr_rcv.soc_ifc_notif |= SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_SOC_REQ_LOCK_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_GEN_IN_TOGGLE_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_GEN_IN_TOGGLE_STS_MASK; + cptra_intr_rcv.soc_ifc_notif |= SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_GEN_IN_TOGGLE_STS_MASK; + } + if (sts == 0) { + VPRINTF(ERROR,"bad soc_ifc_notif_intr sts:%x\n", sts); + SEND_STDOUT_CTRL(0x1); + while(1); + } +} + +inline void service_sha512_acc_error_intr() {return;} +inline void service_sha512_acc_notif_intr() { + uint32_t * reg = (uint32_t *) (CLP_SHA512_ACC_CSR_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R); + uint32_t sts = *reg; + /* Write 1 to Clear the pending interrupt */ + if (sts & SHA512_ACC_CSR_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK) { + *reg = SHA512_ACC_CSR_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + cptra_intr_rcv.sha512_acc_notif |= SHA512_ACC_CSR_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + } + if (sts == 0) { + VPRINTF(ERROR,"bad sha512_acc_notif_intr sts:%x\n", sts); + SEND_STDOUT_CTRL(0x1); + while(1); + } +} + + +#endif //CALIPTRA_ISR_H diff --git a/src/integration/test_suites/memCpy_dccm_to_iccm/memCpy_dccm_to_iccm.s b/src/integration/test_suites/memCpy_dccm_to_iccm/memCpy_dccm_to_iccm.s index fb168535b..75005058b 100644 --- a/src/integration/test_suites/memCpy_dccm_to_iccm/memCpy_dccm_to_iccm.s +++ b/src/integration/test_suites/memCpy_dccm_to_iccm/memCpy_dccm_to_iccm.s @@ -38,6 +38,9 @@ _start: li x1, 0xaaaaaaaa csrw 0x7c0, x1 + // Call interrupt init + call init_interrupts + // Load string from hw_data // and write to ICCM address @@ -66,6 +69,11 @@ _finish: stdout: .word STDOUT .global verbosity_g verbosity_g: .word 2 +// FW polls this variable for intr +.global intr_count +intr_count: .word 0 +.global cptra_intr_rcv +cptra_intr_rcv: .word 0 hw_data: .ascii "----------------------------------\n" .ascii "Hello World from VeeR EL2 !!\n" diff --git a/src/integration/test_suites/pv_hash_and_sign/caliptra_isr.h b/src/integration/test_suites/pv_hash_and_sign/caliptra_isr.h index 23b511c4b..8f5779e04 100644 --- a/src/integration/test_suites/pv_hash_and_sign/caliptra_isr.h +++ b/src/integration/test_suites/pv_hash_and_sign/caliptra_isr.h @@ -32,39 +32,216 @@ #include #include "printf.h" -//extern volatile uint32_t hmac_intr_status; +/* --------------- symbols/typedefs --------------- */ +typedef struct { + uint32_t doe_error; + uint32_t doe_notif; + uint32_t ecc_error; + uint32_t ecc_notif; + uint32_t hmac_error; + uint32_t hmac_notif; + uint32_t kv_error; + uint32_t kv_notif; + uint32_t sha512_error; + uint32_t sha512_notif; + uint32_t sha256_error; + uint32_t sha256_notif; + uint32_t qspi_error; + uint32_t qspi_notif; + uint32_t uart_error; + uint32_t uart_notif; + uint32_t i3c_error; + uint32_t i3c_notif; + uint32_t soc_ifc_error; + uint32_t soc_ifc_notif; + uint32_t sha512_acc_error; + uint32_t sha512_acc_notif; +} caliptra_intr_received_s; +extern volatile caliptra_intr_received_s cptra_intr_rcv; ////////////////////////////////////////////////////////////////////////////// // Function Declarations // + // Performs all the CSR setup to configure and enable vectored external interrupts void init_interrupts(void); // These inline functions are used to insert event-specific functionality into the -// otherwise generic ISR that gets laid down by the parameterized macro "nonstd_swerv_isr" -inline void service_doe_error_intr() {printf("ERROR");} -inline void service_doe_notif_intr() {printf("ERROR");} -inline void service_ecc_error_intr () {printf("ERROR");} -inline void service_ecc_notif_intr () {printf("ERROR");} -inline void service_hmac_error_intr () {printf("ERROR");} -inline void service_hmac_notif_intr () {printf("ERROR");} - -inline void service_kv_error_intr () {printf("ERROR");} -inline void service_kv_notif_intr () {printf("ERROR");} -inline void service_sha512_error_intr() {printf("ERROR");} -inline void service_sha512_notif_intr() {printf("ERROR");} -inline void service_sha256_error_intr() {printf("ERROR");} -inline void service_sha256_notif_intr() {printf("ERROR");} -inline void service_qspi_error_intr () {printf("ERROR");} -inline void service_qspi_notif_intr () {printf("ERROR");} -inline void service_uart_error_intr () {printf("ERROR");} -inline void service_uart_notif_intr () {printf("ERROR");} -inline void service_i3c_error_intr () {printf("ERROR");} -inline void service_i3c_notif_intr () {printf("ERROR");} -inline void service_soc_ifc_error_intr () {printf("ERROR");} -inline void service_soc_ifc_notif_intr () {printf("ERROR");} -inline void service_sha512_acc_error_intr() {printf("ERROR");} -inline void service_sha512_acc_notif_intr() {printf("ERROR");} +// otherwise generic ISR that gets laid down by the parameterized macro "nonstd_veer_isr" +inline void service_doe_error_intr() {return;} +inline void service_doe_notif_intr() { + uint32_t * reg = (uint32_t *) (CLP_DOE_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R); + uint32_t sts = *reg; + /* Write 1 to Clear the pending interrupt */ + if (sts & DOE_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK) { + *reg = DOE_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + cptra_intr_rcv.doe_notif |= DOE_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + } + if (sts == 0) { + VPRINTF(ERROR,"bad doe_notif_intr sts:%x\n", sts); + SEND_STDOUT_CTRL(0x1); + while(1); + } +} + +inline void service_ecc_error_intr() {return;} +inline void service_ecc_notif_intr() { + uint32_t * reg = (uint32_t *) (CLP_ECC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R); + uint32_t sts = *reg; + /* Write 1 to Clear the pending interrupt */ + if (sts & ECC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK) { + *reg = ECC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + cptra_intr_rcv.ecc_notif |= ECC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + } + if (sts == 0) { + VPRINTF(ERROR,"bad ecc_notif_intr sts:%x\n", sts); + SEND_STDOUT_CTRL(0x1); + while(1); + } +} + +inline void service_hmac_error_intr() {return;} +inline void service_hmac_notif_intr() { + uint32_t * reg = (uint32_t *) (CLP_HMAC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R); + uint32_t sts = *reg; + /* Write 1 to Clear the pending interrupt */ + if (sts & HMAC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK) { + *reg = HMAC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + cptra_intr_rcv.hmac_notif |= HMAC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + } + if (sts == 0) { + VPRINTF(ERROR,"bad hmac_notif_intr sts:%x\n", sts); + SEND_STDOUT_CTRL(0x1); + while(1); + } +} + +inline void service_kv_error_intr() {return;} +inline void service_kv_notif_intr() {return;} +inline void service_sha512_error_intr() {return;} +inline void service_sha512_notif_intr() { + uint32_t * reg = (uint32_t *) (CLP_SHA512_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R); + uint32_t sts = *reg; + /* Write 1 to Clear the pending interrupt */ + if (sts & SHA512_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK) { + *reg = SHA512_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + cptra_intr_rcv.sha512_notif |= SHA512_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + } + if (sts == 0) { + VPRINTF(ERROR,"bad sha512_notif_intr sts:%x\n", sts); + SEND_STDOUT_CTRL(0x1); + while(1); + } +} + +inline void service_sha256_error_intr() {return;} +inline void service_sha256_notif_intr() { + uint32_t * reg = (uint32_t *) (CLP_SHA256_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R); + uint32_t sts = *reg; + /* Write 1 to Clear the pending interrupt */ + if (sts & SHA256_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK) { + *reg = SHA256_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + cptra_intr_rcv.sha256_notif |= SHA256_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + } + if (sts == 0) { + VPRINTF(ERROR,"bad sha256_notif_intr sts:%x\n", sts); + SEND_STDOUT_CTRL(0x1); + while(1); + } +} + +inline void service_qspi_error_intr() {return;} +inline void service_qspi_notif_intr() {return;} +inline void service_uart_error_intr() {return;} +inline void service_uart_notif_intr() {return;} +inline void service_i3c_error_intr() {return;} +inline void service_i3c_notif_intr() {return;} + +inline void service_soc_ifc_error_intr() { + uint32_t * reg = (uint32_t *) (CLP_SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R); + uint32_t sts = *reg; + /* Write 1 to Clear the pending interrupt */ + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_INTERNAL_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_INTERNAL_STS_MASK; + cptra_intr_rcv.soc_ifc_error |= SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_INTERNAL_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_INV_DEV_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_INV_DEV_STS_MASK; + cptra_intr_rcv.soc_ifc_error |= SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_INV_DEV_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_CMD_FAIL_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_CMD_FAIL_STS_MASK; + cptra_intr_rcv.soc_ifc_error |= SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_CMD_FAIL_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_BAD_FUSE_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_BAD_FUSE_STS_MASK; + cptra_intr_rcv.soc_ifc_error |= SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_BAD_FUSE_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_ICCM_BLOCKED_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_ICCM_BLOCKED_STS_MASK; + cptra_intr_rcv.soc_ifc_error |= SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_ICCM_BLOCKED_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_MBOX_ECC_UNC_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_MBOX_ECC_UNC_STS_MASK; + cptra_intr_rcv.soc_ifc_error |= SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_MBOX_ECC_UNC_STS_MASK; + } + if (sts == 0) { + VPRINTF(ERROR,"bad soc_ifc_error_intr sts:%x\n", sts); + SEND_STDOUT_CTRL(0x1); + while(1); + } +} + +inline void service_soc_ifc_notif_intr () { + uint32_t * reg = (uint32_t *) (CLP_SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R); + uint32_t sts = *reg; + /* Write 1 to Clear the pending interrupt */ + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_AVAIL_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_AVAIL_STS_MASK; + cptra_intr_rcv.soc_ifc_notif |= SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_AVAIL_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_MBOX_ECC_COR_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_MBOX_ECC_COR_STS_MASK; + cptra_intr_rcv.soc_ifc_notif |= SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_MBOX_ECC_COR_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_DEBUG_LOCKED_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_DEBUG_LOCKED_STS_MASK; + cptra_intr_rcv.soc_ifc_notif |= SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_DEBUG_LOCKED_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_SCAN_MODE_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_SCAN_MODE_STS_MASK; + cptra_intr_rcv.soc_ifc_notif |= SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_SCAN_MODE_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_SOC_REQ_LOCK_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_SOC_REQ_LOCK_STS_MASK; + cptra_intr_rcv.soc_ifc_notif |= SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_SOC_REQ_LOCK_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_GEN_IN_TOGGLE_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_GEN_IN_TOGGLE_STS_MASK; + cptra_intr_rcv.soc_ifc_notif |= SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_GEN_IN_TOGGLE_STS_MASK; + } + if (sts == 0) { + VPRINTF(ERROR,"bad soc_ifc_notif_intr sts:%x\n", sts); + SEND_STDOUT_CTRL(0x1); + while(1); + } +} + +inline void service_sha512_acc_error_intr() {return;} +inline void service_sha512_acc_notif_intr() { + uint32_t * reg = (uint32_t *) (CLP_SHA512_ACC_CSR_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R); + uint32_t sts = *reg; + /* Write 1 to Clear the pending interrupt */ + if (sts & SHA512_ACC_CSR_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK) { + *reg = SHA512_ACC_CSR_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + cptra_intr_rcv.sha512_acc_notif |= SHA512_ACC_CSR_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + } + if (sts == 0) { + VPRINTF(ERROR,"bad sha512_acc_notif_intr sts:%x\n", sts); + SEND_STDOUT_CTRL(0x1); + while(1); + } +} #endif //CALIPTRA_ISR_H diff --git a/src/integration/test_suites/pv_hash_and_sign/pv_hash_and_sign.c b/src/integration/test_suites/pv_hash_and_sign/pv_hash_and_sign.c index a2239924e..f23b86f12 100644 --- a/src/integration/test_suites/pv_hash_and_sign/pv_hash_and_sign.c +++ b/src/integration/test_suites/pv_hash_and_sign/pv_hash_and_sign.c @@ -31,6 +31,31 @@ volatile uint32_t intr_count = 0; enum printf_verbosity verbosity_g = MEDIUM; #endif +volatile caliptra_intr_received_s cptra_intr_rcv = { + .doe_error = 0, + .doe_notif = 0, + .ecc_error = 0, + .ecc_notif = 0, + .hmac_error = 0, + .hmac_notif = 0, + .kv_error = 0, + .kv_notif = 0, + .sha512_error = 0, + .sha512_notif = 0, + .sha256_error = 0, + .sha256_notif = 0, + .qspi_error = 0, + .qspi_notif = 0, + .uart_error = 0, + .uart_notif = 0, + .i3c_error = 0, + .i3c_notif = 0, + .soc_ifc_error = 0, + .soc_ifc_notif = 0, + .sha512_acc_error = 0, + .sha512_acc_notif = 0, +}; + void main() { VPRINTF(LOW,"---------------------------\n"); VPRINTF(LOW," KV PCR Hash Extend Test !!\n"); @@ -75,44 +100,53 @@ void main() { 0xa0b43fbf, 0x49897978}; - uint32_t exp3[] = {0x9bad51d7, - 0x287c2244, - 0x154b6f2d, - 0x77bd52ea, - 0x0213d314, - 0x6f4cb39f, - 0xe27a6d42, - 0x8886bf0e, - 0xaab4310a, - 0x53946e9b, - 0x70cbd1e7, - 0xfb158bab}; - - uint32_t exp_sign_r[] = {0x4783887c, - 0xe3e20caa, - 0x4a10c8ef, - 0x929fdc23, - 0x1c389ab7, - 0x72cf8b35, - 0xfc1647a5, - 0xf1205a1e, - 0x50d92ac9, - 0x1b5a549a, - 0x3944f5aa, - 0x52f32b23}; - - uint32_t exp_sign_s[] = {0x44bd1e3b, - 0x6cb57584, - 0x304f77b9, - 0xee4a6599, - 0x38e3b614, - 0x00db744e, - 0x6227cbb3, - 0x6bbfbbbd, - 0xbe1d0815, - 0x71fba315, - 0xeb049b1e, - 0x437af8aa}; + uint32_t exp3[] = {0x2ab50775, + 0xdab80928, + 0xb8de848c, + 0xabbdfa56, + 0x897ed7b1, + 0x45be930e, + 0x1e340ce0, + 0x8c5bfc73, + 0x1d997144, + 0x0c43f5a5, + 0xaa48ac99, + 0x8dbe6bb9}; + + uint32_t exp_sign_r[] = {0x871e6ea4, + 0xddc5432c, + 0xddaa60fd, + 0x7f055472, + 0xd3c4dd41, + 0xa5bfb267, + 0x09e88c31, + 0x1a970935, + 0x99a7c8f5, + 0x5b3974c1, + 0x9e4f5a7b, + 0xfc1dd2ac}; + + uint32_t exp_sign_s[] = {0x3e5552de, + 0x6403350e, + 0xe70ad74e, + 0x4b854d2d, + 0xc4126bbf, + 0x9c153a5d, + 0x7a07bd4b, + 0x85d06e45, + 0xf850920e, + 0x898fb7d3, + 0x4f80796d, + 0xae29365c}; + + uint32_t nonce[] = {0x01234567, + 0x11111111, + 0x22222222, + 0x33333333, + 0x44444444, + 0x55555555, + 0x66666666, + 0x77777777}; volatile uint32_t* reg_ptr; uint8_t offset; @@ -259,7 +293,11 @@ void main() { } sha_poll_gen_hash_ready(); - lsu_write_32(CLP_SHA512_REG_SHA512_GEN_PCR_HASH_NONCE,0x12345678); + reg_ptr = (uint32_t*) CLP_SHA512_REG_SHA512_GEN_PCR_HASH_NONCE_0; + offset = 0; + while (reg_ptr <= (uint32_t*) CLP_SHA512_REG_SHA512_GEN_PCR_HASH_NONCE_7) { + *reg_ptr++ = nonce[offset++]; + } sha_gen_hash_start(); sha_poll_gen_hash_valid(); @@ -275,6 +313,11 @@ void main() { offset++; } + //inject seed to kv key reg (in RTL) + printf("ECC: Inject PRIVKEY into KV slot 7\n"); + printf("ECC: Inject MSG into msg_reg\n"); + printf("%c", 0x90); + VPRINTF(MEDIUM,"ECC: Running PCR Sign Function\n"); //run ECC signing on PCR reg = ((1 << ECC_REG_ECC_CTRL_PCR_SIGN_LOW) & ECC_REG_ECC_CTRL_PCR_SIGN_MASK) | @@ -284,7 +327,7 @@ void main() { VPRINTF(MEDIUM,"ECC: Polling for PCR Sign to be complete\n"); // wait for ECC SIGNING process to be done - while((lsu_read_32(CLP_ECC_REG_ECC_STATUS) & ECC_REG_ECC_STATUS_VALID_MASK) == 0); + while((lsu_read_32(CLP_ECC_REG_ECC_STATUS) & ECC_REG_ECC_STATUS_READY_MASK) == 0); //check expected output from sign r reg_ptr = (uint32_t*) CLP_ECC_REG_ECC_SIGN_R_0; diff --git a/src/integration/test_suites/randomized_pcr_signing/caliptra_isr.h b/src/integration/test_suites/randomized_pcr_signing/caliptra_isr.h index 6ffd71c0a..8f5779e04 100644 --- a/src/integration/test_suites/randomized_pcr_signing/caliptra_isr.h +++ b/src/integration/test_suites/randomized_pcr_signing/caliptra_isr.h @@ -204,6 +204,22 @@ inline void service_soc_ifc_notif_intr () { *reg = SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_MBOX_ECC_COR_STS_MASK; cptra_intr_rcv.soc_ifc_notif |= SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_MBOX_ECC_COR_STS_MASK; } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_DEBUG_LOCKED_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_DEBUG_LOCKED_STS_MASK; + cptra_intr_rcv.soc_ifc_notif |= SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_DEBUG_LOCKED_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_SCAN_MODE_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_SCAN_MODE_STS_MASK; + cptra_intr_rcv.soc_ifc_notif |= SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_SCAN_MODE_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_SOC_REQ_LOCK_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_SOC_REQ_LOCK_STS_MASK; + cptra_intr_rcv.soc_ifc_notif |= SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_SOC_REQ_LOCK_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_GEN_IN_TOGGLE_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_GEN_IN_TOGGLE_STS_MASK; + cptra_intr_rcv.soc_ifc_notif |= SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_GEN_IN_TOGGLE_STS_MASK; + } if (sts == 0) { VPRINTF(ERROR,"bad soc_ifc_notif_intr sts:%x\n", sts); SEND_STDOUT_CTRL(0x1); diff --git a/src/integration/test_suites/smoke_test_ahb_mux/caliptra_isr.h b/src/integration/test_suites/smoke_test_ahb_mux/caliptra_isr.h new file mode 100644 index 000000000..8f5779e04 --- /dev/null +++ b/src/integration/test_suites/smoke_test_ahb_mux/caliptra_isr.h @@ -0,0 +1,247 @@ +// SPDX-License-Identifier: Apache-2.0 +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// --------------------------------------------------------------------- +// File: caliptra_isr.h +// Description: +// Provides function declarations for use by external test files, so +// that the ISR functionality may behave like a library. +// TODO: +// This header file includes inline function definitions for event and +// test specific interrupt service behavior, so it should be copied and +// modified for each test. +// --------------------------------------------------------------------- + +#ifndef CALIPTRA_ISR_H + #define CALIPTRA_ISR_H + +#define EN_ISR_PRINTS 1 + +#include "caliptra_defines.h" +#include +#include "printf.h" + +/* --------------- symbols/typedefs --------------- */ +typedef struct { + uint32_t doe_error; + uint32_t doe_notif; + uint32_t ecc_error; + uint32_t ecc_notif; + uint32_t hmac_error; + uint32_t hmac_notif; + uint32_t kv_error; + uint32_t kv_notif; + uint32_t sha512_error; + uint32_t sha512_notif; + uint32_t sha256_error; + uint32_t sha256_notif; + uint32_t qspi_error; + uint32_t qspi_notif; + uint32_t uart_error; + uint32_t uart_notif; + uint32_t i3c_error; + uint32_t i3c_notif; + uint32_t soc_ifc_error; + uint32_t soc_ifc_notif; + uint32_t sha512_acc_error; + uint32_t sha512_acc_notif; +} caliptra_intr_received_s; +extern volatile caliptra_intr_received_s cptra_intr_rcv; + +////////////////////////////////////////////////////////////////////////////// +// Function Declarations +// + +// Performs all the CSR setup to configure and enable vectored external interrupts +void init_interrupts(void); + +// These inline functions are used to insert event-specific functionality into the +// otherwise generic ISR that gets laid down by the parameterized macro "nonstd_veer_isr" +inline void service_doe_error_intr() {return;} +inline void service_doe_notif_intr() { + uint32_t * reg = (uint32_t *) (CLP_DOE_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R); + uint32_t sts = *reg; + /* Write 1 to Clear the pending interrupt */ + if (sts & DOE_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK) { + *reg = DOE_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + cptra_intr_rcv.doe_notif |= DOE_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + } + if (sts == 0) { + VPRINTF(ERROR,"bad doe_notif_intr sts:%x\n", sts); + SEND_STDOUT_CTRL(0x1); + while(1); + } +} + +inline void service_ecc_error_intr() {return;} +inline void service_ecc_notif_intr() { + uint32_t * reg = (uint32_t *) (CLP_ECC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R); + uint32_t sts = *reg; + /* Write 1 to Clear the pending interrupt */ + if (sts & ECC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK) { + *reg = ECC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + cptra_intr_rcv.ecc_notif |= ECC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + } + if (sts == 0) { + VPRINTF(ERROR,"bad ecc_notif_intr sts:%x\n", sts); + SEND_STDOUT_CTRL(0x1); + while(1); + } +} + +inline void service_hmac_error_intr() {return;} +inline void service_hmac_notif_intr() { + uint32_t * reg = (uint32_t *) (CLP_HMAC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R); + uint32_t sts = *reg; + /* Write 1 to Clear the pending interrupt */ + if (sts & HMAC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK) { + *reg = HMAC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + cptra_intr_rcv.hmac_notif |= HMAC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + } + if (sts == 0) { + VPRINTF(ERROR,"bad hmac_notif_intr sts:%x\n", sts); + SEND_STDOUT_CTRL(0x1); + while(1); + } +} + +inline void service_kv_error_intr() {return;} +inline void service_kv_notif_intr() {return;} +inline void service_sha512_error_intr() {return;} +inline void service_sha512_notif_intr() { + uint32_t * reg = (uint32_t *) (CLP_SHA512_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R); + uint32_t sts = *reg; + /* Write 1 to Clear the pending interrupt */ + if (sts & SHA512_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK) { + *reg = SHA512_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + cptra_intr_rcv.sha512_notif |= SHA512_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + } + if (sts == 0) { + VPRINTF(ERROR,"bad sha512_notif_intr sts:%x\n", sts); + SEND_STDOUT_CTRL(0x1); + while(1); + } +} + +inline void service_sha256_error_intr() {return;} +inline void service_sha256_notif_intr() { + uint32_t * reg = (uint32_t *) (CLP_SHA256_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R); + uint32_t sts = *reg; + /* Write 1 to Clear the pending interrupt */ + if (sts & SHA256_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK) { + *reg = SHA256_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + cptra_intr_rcv.sha256_notif |= SHA256_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + } + if (sts == 0) { + VPRINTF(ERROR,"bad sha256_notif_intr sts:%x\n", sts); + SEND_STDOUT_CTRL(0x1); + while(1); + } +} + +inline void service_qspi_error_intr() {return;} +inline void service_qspi_notif_intr() {return;} +inline void service_uart_error_intr() {return;} +inline void service_uart_notif_intr() {return;} +inline void service_i3c_error_intr() {return;} +inline void service_i3c_notif_intr() {return;} + +inline void service_soc_ifc_error_intr() { + uint32_t * reg = (uint32_t *) (CLP_SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R); + uint32_t sts = *reg; + /* Write 1 to Clear the pending interrupt */ + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_INTERNAL_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_INTERNAL_STS_MASK; + cptra_intr_rcv.soc_ifc_error |= SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_INTERNAL_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_INV_DEV_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_INV_DEV_STS_MASK; + cptra_intr_rcv.soc_ifc_error |= SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_INV_DEV_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_CMD_FAIL_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_CMD_FAIL_STS_MASK; + cptra_intr_rcv.soc_ifc_error |= SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_CMD_FAIL_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_BAD_FUSE_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_BAD_FUSE_STS_MASK; + cptra_intr_rcv.soc_ifc_error |= SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_BAD_FUSE_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_ICCM_BLOCKED_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_ICCM_BLOCKED_STS_MASK; + cptra_intr_rcv.soc_ifc_error |= SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_ICCM_BLOCKED_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_MBOX_ECC_UNC_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_MBOX_ECC_UNC_STS_MASK; + cptra_intr_rcv.soc_ifc_error |= SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_MBOX_ECC_UNC_STS_MASK; + } + if (sts == 0) { + VPRINTF(ERROR,"bad soc_ifc_error_intr sts:%x\n", sts); + SEND_STDOUT_CTRL(0x1); + while(1); + } +} + +inline void service_soc_ifc_notif_intr () { + uint32_t * reg = (uint32_t *) (CLP_SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R); + uint32_t sts = *reg; + /* Write 1 to Clear the pending interrupt */ + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_AVAIL_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_AVAIL_STS_MASK; + cptra_intr_rcv.soc_ifc_notif |= SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_AVAIL_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_MBOX_ECC_COR_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_MBOX_ECC_COR_STS_MASK; + cptra_intr_rcv.soc_ifc_notif |= SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_MBOX_ECC_COR_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_DEBUG_LOCKED_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_DEBUG_LOCKED_STS_MASK; + cptra_intr_rcv.soc_ifc_notif |= SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_DEBUG_LOCKED_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_SCAN_MODE_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_SCAN_MODE_STS_MASK; + cptra_intr_rcv.soc_ifc_notif |= SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_SCAN_MODE_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_SOC_REQ_LOCK_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_SOC_REQ_LOCK_STS_MASK; + cptra_intr_rcv.soc_ifc_notif |= SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_SOC_REQ_LOCK_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_GEN_IN_TOGGLE_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_GEN_IN_TOGGLE_STS_MASK; + cptra_intr_rcv.soc_ifc_notif |= SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_GEN_IN_TOGGLE_STS_MASK; + } + if (sts == 0) { + VPRINTF(ERROR,"bad soc_ifc_notif_intr sts:%x\n", sts); + SEND_STDOUT_CTRL(0x1); + while(1); + } +} + +inline void service_sha512_acc_error_intr() {return;} +inline void service_sha512_acc_notif_intr() { + uint32_t * reg = (uint32_t *) (CLP_SHA512_ACC_CSR_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R); + uint32_t sts = *reg; + /* Write 1 to Clear the pending interrupt */ + if (sts & SHA512_ACC_CSR_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK) { + *reg = SHA512_ACC_CSR_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + cptra_intr_rcv.sha512_acc_notif |= SHA512_ACC_CSR_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + } + if (sts == 0) { + VPRINTF(ERROR,"bad sha512_acc_notif_intr sts:%x\n", sts); + SEND_STDOUT_CTRL(0x1); + while(1); + } +} + + +#endif //CALIPTRA_ISR_H diff --git a/src/integration/test_suites/smoke_test_ahb_mux/smoke_test_ahb_mux.s b/src/integration/test_suites/smoke_test_ahb_mux/smoke_test_ahb_mux.s index 41b0ecd44..7a19659ba 100644 --- a/src/integration/test_suites/smoke_test_ahb_mux/smoke_test_ahb_mux.s +++ b/src/integration/test_suites/smoke_test_ahb_mux/smoke_test_ahb_mux.s @@ -195,8 +195,11 @@ my_print: .section .dccm .global stdout stdout: .word STDOUT +// FW polls this variable for intr .global intr_count intr_count: .word 0 +.global cptra_intr_rcv +cptra_intr_rcv: .word 0 .global verbosity_g verbosity_g: .word 2 print_data: diff --git a/src/integration/test_suites/smoke_test_cg_wdt/caliptra_isr.h b/src/integration/test_suites/smoke_test_cg_wdt/caliptra_isr.h new file mode 100644 index 000000000..6f27a6427 --- /dev/null +++ b/src/integration/test_suites/smoke_test_cg_wdt/caliptra_isr.h @@ -0,0 +1,132 @@ +// SPDX-License-Identifier: Apache-2.0 +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// --------------------------------------------------------------------- +// File: caliptra_isr.h +// Description: +// Provides function declarations for use by external test files, so +// that the ISR functionality may behave like a library. +// TODO: +// This header file includes inline function definitions for event and +// test specific interrupt service behavior, so it should be copied and +// modified for each test. +// --------------------------------------------------------------------- + +#ifndef CALIPTRA_ISR_H + #define CALIPTRA_ISR_H + +#define EN_ISR_PRINTS 1 + +#include "caliptra_defines.h" +#include +#include "printf.h" + +extern volatile uint32_t hmac_intr_status; + +/* --------------- symbols/typedefs --------------- */ +typedef struct { + uint32_t doe_error; + uint32_t doe_notif; + uint32_t ecc_error; + uint32_t ecc_notif; + uint32_t hmac_error; + uint32_t hmac_notif; + uint32_t kv_error; + uint32_t kv_notif; + uint32_t sha512_error; + uint32_t sha512_notif; + uint32_t sha256_error; + uint32_t sha256_notif; + uint32_t qspi_error; + uint32_t qspi_notif; + uint32_t uart_error; + uint32_t uart_notif; + uint32_t i3c_error; + uint32_t i3c_notif; + uint32_t soc_ifc_error; + uint32_t soc_ifc_notif; + uint32_t sha512_acc_error; + uint32_t sha512_acc_notif; +} caliptra_intr_received_s; +extern volatile caliptra_intr_received_s cptra_intr_rcv; + +////////////////////////////////////////////////////////////////////////////// +// Function Declarations +// +// Performs all the CSR setup to configure and enable vectored external interrupts +void init_interrupts(void); + +// These inline functions are used to insert event-specific functionality into the +// otherwise generic ISR that gets laid down by the parameterized macro "nonstd_veer_isr" +inline void service_doe_error_intr() {printf("ERROR");} +inline void service_doe_notif_intr() {printf("ERROR");} +inline void service_ecc_error_intr () {printf("ERROR");} +inline void service_ecc_notif_intr () {printf("ERROR");} +inline void service_hmac_error_intr () {printf("ERROR");} +inline void service_hmac_notif_intr () { + uint32_t * reg = (uint32_t *) (CLP_HMAC_REG_BASE_ADDR + HMAC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R); + uint32_t sts = *reg; + /* Write 1 to Clear the pending interrupt */ + if (sts & HMAC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK) { + *reg = HMAC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + } + if (sts == 0) { + printf("bad hmac_notif_intr sts:%x\n", sts); + } else { + reg = (uint32_t *) (CLP_HMAC_REG_HMAC384_STATUS); + hmac_intr_status = *reg; + } +} + +inline void service_kv_error_intr () {printf("ERROR");} +inline void service_kv_notif_intr () {printf("ERROR");} +inline void service_sha512_error_intr() {printf("ERROR");} +inline void service_sha512_notif_intr() {printf("ERROR");} +inline void service_sha256_error_intr() {printf("ERROR");} +inline void service_sha256_notif_intr() {printf("ERROR");} +inline void service_qspi_error_intr () {printf("ERROR");} +inline void service_qspi_notif_intr () {printf("ERROR");} +inline void service_uart_error_intr () {printf("ERROR");} +inline void service_uart_notif_intr () {printf("ERROR");} +inline void service_i3c_error_intr () {printf("ERROR");} +inline void service_i3c_notif_intr () {printf("ERROR");} +inline void service_soc_ifc_error_intr () { + uint32_t * reg = (uint32_t *) (CLP_SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R); + uint32_t sts = *reg; + //Write 1 to clear pending interrupt + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_WDT_TIMER1_TIMEOUT_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_WDT_TIMER1_TIMEOUT_STS_MASK; + } + //Write 1 to clear pending interrupt + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_WDT_TIMER2_TIMEOUT_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_WDT_TIMER2_TIMEOUT_STS_MASK; + } +} +inline void service_soc_ifc_notif_intr () { + uint32_t * reg = (uint32_t *) (CLP_SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R); + uint32_t sts = *reg; + + if(sts & SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_DEBUG_LOCKED_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_DEBUG_LOCKED_STS_MASK; + } + + if(sts & SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_SCAN_MODE_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_SCAN_MODE_STS_MASK; + } +} +inline void service_sha512_acc_error_intr() {printf("ERROR");} +inline void service_sha512_acc_notif_intr() {printf("ERROR");} + + +#endif //CALIPTRA_ISR_H diff --git a/src/integration/test_suites/smoke_test_cg_wdt/smoke_test_cg_wdt.c b/src/integration/test_suites/smoke_test_cg_wdt/smoke_test_cg_wdt.c new file mode 100644 index 000000000..ecbc2b28d --- /dev/null +++ b/src/integration/test_suites/smoke_test_cg_wdt/smoke_test_cg_wdt.c @@ -0,0 +1,243 @@ +// SPDX-License-Identifier: Apache-2.0 +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +#include "caliptra_defines.h" +#include "caliptra_isr.h" +#include "riscv-csr.h" +#include +#include +#include "printf.h" +#include "clk_gate.h" + +volatile char* stdout = (char *)STDOUT; +volatile uint32_t intr_count = 0; +volatile uint32_t hmac_intr_status; +volatile uint32_t rst_count __attribute__((section(".dccm.persistent"))) = 0; + +#ifdef CPT_VERBOSITY + enum printf_verbosity verbosity_g = CPT_VERBOSITY; +#else + enum printf_verbosity verbosity_g = LOW; +#endif + +volatile uint32_t * wdt_timer1_en = (uint32_t *) CLP_SOC_IFC_REG_CPTRA_WDT_TIMER1_EN; +volatile uint32_t * wdt_timer1_ctrl = (uint32_t *) CLP_SOC_IFC_REG_CPTRA_WDT_TIMER1_CTRL; +volatile uint32_t * wdt_timer1_period_0 = (uint32_t *) CLP_SOC_IFC_REG_CPTRA_WDT_TIMER1_TIMEOUT_PERIOD_0; +volatile uint32_t * wdt_timer1_period_1 = (uint32_t *) CLP_SOC_IFC_REG_CPTRA_WDT_TIMER1_TIMEOUT_PERIOD_1; +volatile uint32_t * soc_intr_en = (uint32_t *) CLP_SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTR_EN_R; + +volatile uint32_t * wdt_timer2_en = (uint32_t *) CLP_SOC_IFC_REG_CPTRA_WDT_TIMER2_EN; +volatile uint32_t * wdt_timer2_ctrl = (uint32_t *) CLP_SOC_IFC_REG_CPTRA_WDT_TIMER2_CTRL; +volatile uint32_t * wdt_timer2_period_0 = (uint32_t *) CLP_SOC_IFC_REG_CPTRA_WDT_TIMER2_TIMEOUT_PERIOD_0; +volatile uint32_t * wdt_timer2_period_1 = (uint32_t *) CLP_SOC_IFC_REG_CPTRA_WDT_TIMER2_TIMEOUT_PERIOD_1; + +volatile uint32_t * hw_error_fatal = (uint32_t *) CLP_SOC_IFC_REG_CPTRA_HW_ERROR_FATAL; + +volatile uint32_t * soc_ifc_error_status = (uint32_t *) CLP_SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R; +volatile uint32_t soc_error_status_int; + +volatile uint32_t * clear_secrets = (uint32_t *) CLP_KV_REG_CLEAR_SECRETS; + +volatile caliptra_intr_received_s cptra_intr_rcv = { + .doe_error = 0, + .doe_notif = 0, + .ecc_error = 0, + .ecc_notif = 0, + .hmac_error = 0, + .hmac_notif = 0, + .kv_error = 0, + .kv_notif = 0, + .sha512_error = 0, + .sha512_notif = 0, + .sha256_error = 0, + .sha256_notif = 0, + .qspi_error = 0, + .qspi_notif = 0, + .uart_error = 0, + .uart_notif = 0, + .i3c_error = 0, + .i3c_notif = 0, + .soc_ifc_error = 0, + .soc_ifc_notif = 0, + .sha512_acc_error = 0, + .sha512_acc_notif = 0, +}; + +void main() { + + volatile uint32_t * soc_ifc_flow_status = (uint32_t *) CLP_SOC_IFC_REG_CPTRA_FLOW_STATUS; + volatile uint32_t * soc_ifc_clk_gating_en = (uint32_t *) CLP_SOC_IFC_REG_CPTRA_CLK_GATING_EN; + uint32_t mitb0 = 0x00000500; + uint32_t mie_timer0_ext_int_en = 0x20000800; + //uint32_t mie_machinetimer_en = 0x00000080; + //uint32_t mie_external_int_en = 0x00000800; + + printf("----------------------------------\n"); + printf(" CLK GATING + WDT smoke test !!\n" ); + printf("----------------------------------\n"); + + // Call interrupt init + init_interrupts(); + + //---------------------------------------------------- + //Clks shut off, core asleep, WDT running + //1. soc_ifc_error_intr triggered. Core wakes up after internal timer0 expires and services intr + //2. Fatal error is injected - check that clks are enabled again + //3. Core asleep, scan mode enabled - check that KV regs are flushed + //---------------------------------------------------- + + //Enable clk gating + VPRINTF(LOW, "Enabling clk gating\n====================\n"); + SEND_STDOUT_CTRL(0xf2); + + if (rst_count == 0) { + + //Enable SOC notif interrupt + *soc_intr_en = SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTR_EN_R_ERROR_WDT_TIMER1_TIMEOUT_EN_MASK | SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTR_EN_R_ERROR_WDT_TIMER2_TIMEOUT_EN_MASK; + + //Enable WDT timer1 + *wdt_timer1_en = SOC_IFC_REG_CPTRA_WDT_TIMER1_EN_TIMER1_EN_MASK; + *wdt_timer1_period_0 = 0x00000100; + *wdt_timer1_period_1 = 0x00000000; + // *wdt_timer2_period_0 = 0x0000FFFF; + // *wdt_timer2_period_1 = 0x00000000; + + //============= Case 1 ================ + VPRINTF(LOW, "WDT t1 intr\n"); + set_mit0_and_halt_core(mitb0, mie_timer0_ext_int_en); + + //Core wakes up and services timer1 intr + VPRINTF(LOW, "Core is awake\n====================\n"); + + //while ((*soc_ifc_error_status & SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_WDT_TIMER1_TIMEOUT_STS_MASK) == 1); + soc_error_status_int = *soc_ifc_error_status; + while (soc_error_status_int == SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_WDT_TIMER1_TIMEOUT_STS_MASK) { + soc_error_status_int = *soc_ifc_error_status; + } + + //============= Case 2 ================ + //Inject fatal error (after some delay) + VPRINTF(LOW, "Cptra_f_err injection\n====================\n"); + SEND_STDOUT_CTRL(0xeb); + + set_mit0_and_halt_core(mitb0, mie_timer0_ext_int_en); + + //Check that clks wake up and core wakes up later due to internal timer0 + + //============= Case 3 ================ + //Enable scan mode (after some delay) + VPRINTF(LOW, "Scan mode enabled\n====================\n"); + SEND_STDOUT_CTRL(0xef); + + set_mit0_and_halt_core(mitb0, mie_timer0_ext_int_en); + + // //KV regs should be flushed + + //Disable scan mode + VPRINTF(LOW, "Scan mode disabled\n====================\n"); + SEND_STDOUT_CTRL(0xf0); + + //============= Case 4 ================ + //Set debug mode value to 1 + *clear_secrets = 0x00000002; + + //Enable ss tran after some delay + VPRINTF(LOW, "Debug mode unlocked\n====================\n"); + SEND_STDOUT_CTRL(0xfa); + + for (int i = 0; i < 1000; i++); //sleep + + //Issue warm reset to capture debug mode + rst_count++; + SEND_STDOUT_CTRL(0xf6); + } + else if (rst_count == 1) { + + rst_count++; + SEND_STDOUT_CTRL(0xf6); + } + else if (rst_count == 2) { + + set_mit0_and_halt_core(mitb0, mie_timer0_ext_int_en); + + //Disable ss tran + VPRINTF(LOW, "Debug mode locked\n====================\n"); + SEND_STDOUT_CTRL(0xf9); + + //============= Case 5 ================ + //cg enabled, issue warm reset + VPRINTF(LOW, "Issue warm reset\n====================\n"); + rst_count++; + SEND_STDOUT_CTRL(0xf6); + } + else if(rst_count == 3) { + //Enable internal timer0 + __asm__ volatile ("csrwi %0, %1" \ + : /* output: none */ \ + : "i" (0x7d2), "i" (0x00) /* input : immediate */ \ + : /* clobbers: none */); + + //Set internal timer0 upper bound + __asm__ volatile ("csrw %0, %1" \ + : /* output: none */ \ + : "i" (0x7d3), "r" (mitb0) /* input : immediate */ \ + : /* clobbers: none */); + + //Set internal timer0 control (halt_en = 1, enable = 1) + __asm__ volatile ("csrwi %0, %1" \ + : /* output: none */ \ + : "i" (0x7d4), "i" (0x03) /* input : immediate */ \ + : /* clobbers: none */); + + //Set machine intr enable reg (mie) - enable internal timer0 intr + __asm__ volatile ("csrw %0, %1" \ + : /* output: none */ \ + : "i" (0x304), "r" (mie_timer0_ext_int_en) /* input : immediate */ \ + : /* clobbers: none */); + + //Set mstatus reg - enable mie + __asm__ volatile ("csrwi %0, %1" \ + : /* output: none */ \ + : "i" (0x300), "i" (0x08) /* input : immediate */ \ + : /* clobbers: none */); + + VPRINTF(LOW, "Issue random warm reset while core is asleep\n====================\n"); + rst_count++; + SEND_STDOUT_CTRL(0xee); + + //Halt the core + __asm__ volatile ("csrwi %0, %1" \ + : /* output: none */ \ + : "i" (0x7c6), "i" (0x03) /* input : immediate */ \ + : /* clobbers: none */); + + + + } + else { + //WDT independent mode: + //Enable WDT timer1 + *wdt_timer1_en = SOC_IFC_REG_CPTRA_WDT_TIMER1_EN_TIMER1_EN_MASK; + *wdt_timer1_period_0 = 0x00000100; + *wdt_timer1_period_1 = 0x00000000; + //Enable WDT timer2 + *wdt_timer2_en = SOC_IFC_REG_CPTRA_WDT_TIMER2_EN_TIMER2_EN_MASK; + *wdt_timer2_period_0 = 0x00000100; + *wdt_timer2_period_1 = 0x00000000; + + //============= Case 6 ================ + VPRINTF(LOW, "WDT independent mode and core is halted\n====================\n"); + set_mit0_and_halt_core(mitb0, mie_timer0_ext_int_en); + } +} \ No newline at end of file diff --git a/src/integration/test_suites/smoke_test_cg_wdt/smoke_test_cg_wdt.yml b/src/integration/test_suites/smoke_test_cg_wdt/smoke_test_cg_wdt.yml new file mode 100644 index 000000000..fcdaa7754 --- /dev/null +++ b/src/integration/test_suites/smoke_test_cg_wdt/smoke_test_cg_wdt.yml @@ -0,0 +1,17 @@ +# SPDX-License-Identifier: Apache-2.0 +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +--- +seed: 1 +testname: smoke_test_cg_wdt \ No newline at end of file diff --git a/src/integration/test_suites/smoke_test_clk_gating/caliptra_isr.h b/src/integration/test_suites/smoke_test_clk_gating/caliptra_isr.h new file mode 100644 index 000000000..2eb00407e --- /dev/null +++ b/src/integration/test_suites/smoke_test_clk_gating/caliptra_isr.h @@ -0,0 +1,149 @@ +// SPDX-License-Identifier: Apache-2.0 +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// --------------------------------------------------------------------- +// File: caliptra_isr.h +// Description: +// Provides function declarations for use by external test files, so +// that the ISR functionality may behave like a library. +// TODO: +// This header file includes inline function definitions for event and +// test specific interrupt service behavior, so it should be copied and +// modified for each test. +// --------------------------------------------------------------------- + +#ifndef CALIPTRA_ISR_H + #define CALIPTRA_ISR_H + +#define EN_ISR_PRINTS 1 + +#include "caliptra_defines.h" +#include +#include "printf.h" + +extern volatile uint32_t hmac_intr_status; + +/* --------------- symbols/typedefs --------------- */ +typedef struct { + uint32_t doe_error; + uint32_t doe_notif; + uint32_t ecc_error; + uint32_t ecc_notif; + uint32_t hmac_error; + uint32_t hmac_notif; + uint32_t kv_error; + uint32_t kv_notif; + uint32_t sha512_error; + uint32_t sha512_notif; + uint32_t sha256_error; + uint32_t sha256_notif; + uint32_t qspi_error; + uint32_t qspi_notif; + uint32_t uart_error; + uint32_t uart_notif; + uint32_t i3c_error; + uint32_t i3c_notif; + uint32_t soc_ifc_error; + uint32_t soc_ifc_notif; + uint32_t sha512_acc_error; + uint32_t sha512_acc_notif; +} caliptra_intr_received_s; +extern volatile caliptra_intr_received_s cptra_intr_rcv; + +////////////////////////////////////////////////////////////////////////////// +// Function Declarations +// +// Performs all the CSR setup to configure and enable vectored external interrupts +void init_interrupts(void); + +// These inline functions are used to insert event-specific functionality into the +// otherwise generic ISR that gets laid down by the parameterized macro "nonstd_veer_isr" +inline void service_doe_error_intr() {printf("ERROR");} +inline void service_doe_notif_intr() {printf("ERROR");} +inline void service_ecc_error_intr () {printf("ERROR");} +inline void service_ecc_notif_intr () {printf("ERROR");} +inline void service_hmac_error_intr () {printf("ERROR");} +inline void service_hmac_notif_intr () { + uint32_t * reg = (uint32_t *) (CLP_HMAC_REG_BASE_ADDR + HMAC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R); + uint32_t sts = *reg; + /* Write 1 to Clear the pending interrupt */ + if (sts & HMAC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK) { + *reg = HMAC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + } + if (sts == 0) { + printf("bad hmac_notif_intr sts:%x\n", sts); + } else { + reg = (uint32_t *) (CLP_HMAC_REG_HMAC384_STATUS); + hmac_intr_status = *reg; + } +} + +inline void service_kv_error_intr () {printf("ERROR");} +inline void service_kv_notif_intr () {printf("ERROR");} +inline void service_sha512_error_intr() {printf("ERROR");} +inline void service_sha512_notif_intr() {printf("ERROR");} +inline void service_sha256_error_intr() {printf("ERROR");} +inline void service_sha256_notif_intr() {printf("ERROR");} +inline void service_qspi_error_intr () {printf("ERROR");} +inline void service_qspi_notif_intr () {printf("ERROR");} +inline void service_uart_error_intr () {printf("ERROR");} +inline void service_uart_notif_intr () {printf("ERROR");} +inline void service_i3c_error_intr () {printf("ERROR");} +inline void service_i3c_notif_intr () {printf("ERROR");} +inline void service_soc_ifc_error_intr () {printf("ERROR");} +inline void service_soc_ifc_notif_intr () { + uint32_t * reg = (uint32_t *) (CLP_SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R); + uint32_t sts = *reg; + /* Write 1 to Clear the pending interrupt */ + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_AVAIL_STS_MASK) { + VPRINTF(HIGH, "cmd_avail\n"); + *reg = SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_AVAIL_STS_MASK; + cptra_intr_rcv.soc_ifc_notif |= SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_AVAIL_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_MBOX_ECC_COR_STS_MASK) { + VPRINTF(HIGH, "mbox_ecc_cor\n"); + *reg = SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_MBOX_ECC_COR_STS_MASK; + cptra_intr_rcv.soc_ifc_notif |= SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_MBOX_ECC_COR_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_DEBUG_LOCKED_STS_MASK) { + VPRINTF(HIGH, "debug_locked\n"); + *reg = SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_DEBUG_LOCKED_STS_MASK; + cptra_intr_rcv.soc_ifc_notif |= SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_DEBUG_LOCKED_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_SCAN_MODE_STS_MASK) { + VPRINTF(HIGH, "scan mode\n"); + *reg = SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_SCAN_MODE_STS_MASK; + cptra_intr_rcv.soc_ifc_notif |= SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_SCAN_MODE_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_SOC_REQ_LOCK_STS_MASK) { + VPRINTF(HIGH, "soc_req_lock\n"); + *reg = SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_SOC_REQ_LOCK_STS_MASK; + cptra_intr_rcv.soc_ifc_notif |= SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_SOC_REQ_LOCK_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_GEN_IN_TOGGLE_STS_MASK) { + VPRINTF(HIGH, "gen_in_toggle\n"); + *reg = SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_GEN_IN_TOGGLE_STS_MASK; + cptra_intr_rcv.soc_ifc_notif |= SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_GEN_IN_TOGGLE_STS_MASK; + } + if (sts == 0) { + VPRINTF(ERROR,"bad soc_ifc_notif_intr sts:%x\n", sts); + SEND_STDOUT_CTRL(0x1); + while(1); + } +} +inline void service_sha512_acc_error_intr() {printf("ERROR");} +inline void service_sha512_acc_notif_intr() {printf("ERROR");} + + +#endif //CALIPTRA_ISR_H diff --git a/src/integration/test_suites/smoke_test_clk_gating/smoke_test_clk_gating.c b/src/integration/test_suites/smoke_test_clk_gating/smoke_test_clk_gating.c new file mode 100644 index 000000000..114abc7d3 --- /dev/null +++ b/src/integration/test_suites/smoke_test_clk_gating/smoke_test_clk_gating.c @@ -0,0 +1,182 @@ +// SPDX-License-Identifier: Apache-2.0 +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +#include "caliptra_defines.h" +#include "caliptra_isr.h" +#include "riscv-csr.h" +#include +#include +#include "printf.h" +#include "clk_gate.h" + +volatile char* stdout = (char *)STDOUT; +volatile uint32_t intr_count = 0; +volatile uint32_t hmac_intr_status = 0; + +#ifdef CPT_VERBOSITY + enum printf_verbosity verbosity_g = CPT_VERBOSITY; +#else + enum printf_verbosity verbosity_g = LOW; +#endif + +volatile caliptra_intr_received_s cptra_intr_rcv = { + .doe_error = 0, + .doe_notif = 0, + .ecc_error = 0, + .ecc_notif = 0, + .hmac_error = 0, + .hmac_notif = 0, + .kv_error = 0, + .kv_notif = 0, + .sha512_error = 0, + .sha512_notif = 0, + .sha256_error = 0, + .sha256_notif = 0, + .qspi_error = 0, + .qspi_notif = 0, + .uart_error = 0, + .uart_notif = 0, + .i3c_error = 0, + .i3c_notif = 0, + .soc_ifc_error = 0, + .soc_ifc_notif = 0, + .sha512_acc_error = 0, + .sha512_acc_notif = 0, +}; + +void main() { + + volatile uint32_t * soc_ifc_flow_status = (uint32_t *) CLP_SOC_IFC_REG_CPTRA_FLOW_STATUS; + volatile uint32_t * soc_ifc_clk_gating_en = (uint32_t *) CLP_SOC_IFC_REG_CPTRA_CLK_GATING_EN; + uint32_t mitb0 = 0x00000020; + uint32_t mitb0_1 = 0x00000500; + uint32_t mie_timer0_en = 0x20000000; + uint32_t mie_machinetimer_en = 0x00000080; + uint32_t mie_external_int_en = 0x00000800; + uint32_t mie_timer0_ext_int_en = 0x20000800; + + printf("----------------------------------\n"); + printf(" CLK GATING smoke test !!\n" ); + printf("----------------------------------\n"); + + // Call interrupt init + init_interrupts(); + + //---------------------------------------------------- + //Wake up using internal timer0 + //---------------------------------------------------- + SEND_STDOUT_CTRL(0xf2); + //Set internal timer0 counter to 0 + printf("Wake up core using internal timer0\n"); + __asm__ volatile ("csrwi %0, %1" \ + : /* output: none */ \ + : "i" (0x7d2), "i" (0x00) /* input : immediate */ \ + : /* clobbers: none */); + + //Set internal timer0 upper bound + __asm__ volatile ("csrw %0, %1" \ + : /* output: none */ \ + : "i" (0x7d3), "r" (mitb0) /* input : immediate */ \ + : /* clobbers: none */); + + //Set internal timer0 control (halt_en = 1, enable = 1) + __asm__ volatile ("csrwi %0, %1" \ + : /* output: none */ \ + : "i" (0x7d4), "i" (0x03) /* input : immediate */ \ + : /* clobbers: none */); + + //Set machine intr enable reg (mie) - enable internal timer0 intr + __asm__ volatile ("csrw %0, %1" \ + : /* output: none */ \ + : "i" (0x304), "r" (mie_timer0_en) /* input : immediate */ \ + : /* clobbers: none */); + + //Set mstatus reg - enable mie + __asm__ volatile ("csrwi %0, %1" \ + : /* output: none */ \ + : "i" (0x300), "i" (0x08) /* input : immediate */ \ + : /* clobbers: none */); + + //Halt the core + __asm__ volatile ("csrwi %0, %1" \ + : /* output: none */ \ + : "i" (0x7c6), "i" (0x03) /* input : immediate */ \ + : /* clobbers: none */); + + //------------------------------------------------------ + //Set STDOUT to F8 until all cases below finish running. + //This is to assert interrupts to the core for testing + //------------------------------------------------------ + SEND_STDOUT_CTRL(0xf8); + + //------------------------------------------------------ + //Wake up using software int + //------------------------------------------------------ + printf("Wake up core using software interrupt\n"); + //Set machine intr enable reg (mie) - enable soft intr + __asm__ volatile ("csrwi %0, %1" \ + : /* output: none */ \ + : "i" (0x304), "i" (0x08) /* input : immediate */ \ + : /* clobbers: none */); + + //Halt the core + __asm__ volatile ("csrwi %0, %1" \ + : /* output: none */ \ + : "i" (0x7c6), "i" (0x03) /* input : immediate */ \ + : /* clobbers: none */); + + //------------------------------------------------------ + //Wake SOC up for APB tx and core using timer int later + //------------------------------------------------------ + printf("Wake up SOC clk on APB txns and later wake up core using timer interrupt\n"); + //Machine intr enable reg (mie) - enable timer int + __asm__ volatile ("csrw %0, %1" \ + : /* output: none */ \ + : "i" (0x304), "r" (mie_machinetimer_en) /* input : immediate */ \ + : /* clobbers: none */); + + *soc_ifc_flow_status = SOC_IFC_REG_CPTRA_FLOW_STATUS_READY_FOR_FW_MASK; + + //Halt the core + __asm__ volatile ("csrwi %0, %1" \ + : /* output: none */ \ + : "i" (0x7c6), "i" (0x03) /* input : immediate */ \ + : /* clobbers: none */); + + //------------------------------------------------------ + //Wake up using generic input wires and then soft intr + //------------------------------------------------------ + printf("Wake up clks on change in generic_input_wires and later wake up core using software interrupt\n"); + //Set machine intr enable reg (mie) - enable soft intr + __asm__ volatile ("csrwi %0, %1" \ + : /* output: none */ \ + : "i" (0x304), "i" (0x08) /* input : immediate */ \ + : /* clobbers: none */); + + //Halt the core + __asm__ volatile ("csrwi %0, %1" \ + : /* output: none */ \ + : "i" (0x7c6), "i" (0x03) /* input : immediate */ \ + : /* clobbers: none */); + + //------------------------------------------------------ + //Wake up using JTAG accesses and then mit0 timer intr + //------------------------------------------------------ + printf("Wake up clks on JTAG accesses and later wake up core on t0 timer intr\n"); + set_mit0(mitb0_1, mie_timer0_en); + SEND_STDOUT_CTRL(0xe9); //Force dmi_reg_en input to clk_gate after a delay + halt_core(); + +} + diff --git a/src/integration/test_suites/smoke_test_datavault_basic/caliptra_isr.h b/src/integration/test_suites/smoke_test_datavault_basic/caliptra_isr.h index 48879dc68..8f5779e04 100644 --- a/src/integration/test_suites/smoke_test_datavault_basic/caliptra_isr.h +++ b/src/integration/test_suites/smoke_test_datavault_basic/caliptra_isr.h @@ -32,39 +32,216 @@ #include #include "printf.h" -//extern volatile uint32_t hmac_intr_status; +/* --------------- symbols/typedefs --------------- */ +typedef struct { + uint32_t doe_error; + uint32_t doe_notif; + uint32_t ecc_error; + uint32_t ecc_notif; + uint32_t hmac_error; + uint32_t hmac_notif; + uint32_t kv_error; + uint32_t kv_notif; + uint32_t sha512_error; + uint32_t sha512_notif; + uint32_t sha256_error; + uint32_t sha256_notif; + uint32_t qspi_error; + uint32_t qspi_notif; + uint32_t uart_error; + uint32_t uart_notif; + uint32_t i3c_error; + uint32_t i3c_notif; + uint32_t soc_ifc_error; + uint32_t soc_ifc_notif; + uint32_t sha512_acc_error; + uint32_t sha512_acc_notif; +} caliptra_intr_received_s; +extern volatile caliptra_intr_received_s cptra_intr_rcv; ////////////////////////////////////////////////////////////////////////////// // Function Declarations // + // Performs all the CSR setup to configure and enable vectored external interrupts void init_interrupts(void); // These inline functions are used to insert event-specific functionality into the // otherwise generic ISR that gets laid down by the parameterized macro "nonstd_veer_isr" -inline void service_doe_error_intr() {printf("ERROR");} -inline void service_doe_notif_intr() {printf("ERROR");} -inline void service_ecc_error_intr () {printf("ERROR");} -inline void service_ecc_notif_intr () {printf("ERROR");} -inline void service_hmac_error_intr () {printf("ERROR");} -inline void service_hmac_notif_intr () {printf("ERROR");} - -inline void service_kv_error_intr () {printf("ERROR");} -inline void service_kv_notif_intr () {printf("ERROR");} -inline void service_sha512_error_intr() {printf("ERROR");} -inline void service_sha512_notif_intr() {printf("ERROR");} -inline void service_sha256_error_intr() {printf("ERROR");} -inline void service_sha256_notif_intr() {printf("ERROR");} -inline void service_qspi_error_intr () {printf("ERROR");} -inline void service_qspi_notif_intr () {printf("ERROR");} -inline void service_uart_error_intr () {printf("ERROR");} -inline void service_uart_notif_intr () {printf("ERROR");} -inline void service_i3c_error_intr () {printf("ERROR");} -inline void service_i3c_notif_intr () {printf("ERROR");} -inline void service_soc_ifc_error_intr () {printf("ERROR");} -inline void service_soc_ifc_notif_intr () {printf("ERROR");} -inline void service_sha512_acc_error_intr() {printf("ERROR");} -inline void service_sha512_acc_notif_intr() {printf("ERROR");} +inline void service_doe_error_intr() {return;} +inline void service_doe_notif_intr() { + uint32_t * reg = (uint32_t *) (CLP_DOE_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R); + uint32_t sts = *reg; + /* Write 1 to Clear the pending interrupt */ + if (sts & DOE_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK) { + *reg = DOE_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + cptra_intr_rcv.doe_notif |= DOE_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + } + if (sts == 0) { + VPRINTF(ERROR,"bad doe_notif_intr sts:%x\n", sts); + SEND_STDOUT_CTRL(0x1); + while(1); + } +} + +inline void service_ecc_error_intr() {return;} +inline void service_ecc_notif_intr() { + uint32_t * reg = (uint32_t *) (CLP_ECC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R); + uint32_t sts = *reg; + /* Write 1 to Clear the pending interrupt */ + if (sts & ECC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK) { + *reg = ECC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + cptra_intr_rcv.ecc_notif |= ECC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + } + if (sts == 0) { + VPRINTF(ERROR,"bad ecc_notif_intr sts:%x\n", sts); + SEND_STDOUT_CTRL(0x1); + while(1); + } +} + +inline void service_hmac_error_intr() {return;} +inline void service_hmac_notif_intr() { + uint32_t * reg = (uint32_t *) (CLP_HMAC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R); + uint32_t sts = *reg; + /* Write 1 to Clear the pending interrupt */ + if (sts & HMAC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK) { + *reg = HMAC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + cptra_intr_rcv.hmac_notif |= HMAC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + } + if (sts == 0) { + VPRINTF(ERROR,"bad hmac_notif_intr sts:%x\n", sts); + SEND_STDOUT_CTRL(0x1); + while(1); + } +} + +inline void service_kv_error_intr() {return;} +inline void service_kv_notif_intr() {return;} +inline void service_sha512_error_intr() {return;} +inline void service_sha512_notif_intr() { + uint32_t * reg = (uint32_t *) (CLP_SHA512_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R); + uint32_t sts = *reg; + /* Write 1 to Clear the pending interrupt */ + if (sts & SHA512_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK) { + *reg = SHA512_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + cptra_intr_rcv.sha512_notif |= SHA512_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + } + if (sts == 0) { + VPRINTF(ERROR,"bad sha512_notif_intr sts:%x\n", sts); + SEND_STDOUT_CTRL(0x1); + while(1); + } +} + +inline void service_sha256_error_intr() {return;} +inline void service_sha256_notif_intr() { + uint32_t * reg = (uint32_t *) (CLP_SHA256_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R); + uint32_t sts = *reg; + /* Write 1 to Clear the pending interrupt */ + if (sts & SHA256_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK) { + *reg = SHA256_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + cptra_intr_rcv.sha256_notif |= SHA256_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + } + if (sts == 0) { + VPRINTF(ERROR,"bad sha256_notif_intr sts:%x\n", sts); + SEND_STDOUT_CTRL(0x1); + while(1); + } +} + +inline void service_qspi_error_intr() {return;} +inline void service_qspi_notif_intr() {return;} +inline void service_uart_error_intr() {return;} +inline void service_uart_notif_intr() {return;} +inline void service_i3c_error_intr() {return;} +inline void service_i3c_notif_intr() {return;} + +inline void service_soc_ifc_error_intr() { + uint32_t * reg = (uint32_t *) (CLP_SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R); + uint32_t sts = *reg; + /* Write 1 to Clear the pending interrupt */ + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_INTERNAL_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_INTERNAL_STS_MASK; + cptra_intr_rcv.soc_ifc_error |= SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_INTERNAL_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_INV_DEV_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_INV_DEV_STS_MASK; + cptra_intr_rcv.soc_ifc_error |= SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_INV_DEV_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_CMD_FAIL_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_CMD_FAIL_STS_MASK; + cptra_intr_rcv.soc_ifc_error |= SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_CMD_FAIL_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_BAD_FUSE_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_BAD_FUSE_STS_MASK; + cptra_intr_rcv.soc_ifc_error |= SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_BAD_FUSE_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_ICCM_BLOCKED_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_ICCM_BLOCKED_STS_MASK; + cptra_intr_rcv.soc_ifc_error |= SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_ICCM_BLOCKED_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_MBOX_ECC_UNC_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_MBOX_ECC_UNC_STS_MASK; + cptra_intr_rcv.soc_ifc_error |= SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_MBOX_ECC_UNC_STS_MASK; + } + if (sts == 0) { + VPRINTF(ERROR,"bad soc_ifc_error_intr sts:%x\n", sts); + SEND_STDOUT_CTRL(0x1); + while(1); + } +} + +inline void service_soc_ifc_notif_intr () { + uint32_t * reg = (uint32_t *) (CLP_SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R); + uint32_t sts = *reg; + /* Write 1 to Clear the pending interrupt */ + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_AVAIL_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_AVAIL_STS_MASK; + cptra_intr_rcv.soc_ifc_notif |= SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_AVAIL_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_MBOX_ECC_COR_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_MBOX_ECC_COR_STS_MASK; + cptra_intr_rcv.soc_ifc_notif |= SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_MBOX_ECC_COR_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_DEBUG_LOCKED_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_DEBUG_LOCKED_STS_MASK; + cptra_intr_rcv.soc_ifc_notif |= SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_DEBUG_LOCKED_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_SCAN_MODE_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_SCAN_MODE_STS_MASK; + cptra_intr_rcv.soc_ifc_notif |= SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_SCAN_MODE_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_SOC_REQ_LOCK_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_SOC_REQ_LOCK_STS_MASK; + cptra_intr_rcv.soc_ifc_notif |= SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_SOC_REQ_LOCK_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_GEN_IN_TOGGLE_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_GEN_IN_TOGGLE_STS_MASK; + cptra_intr_rcv.soc_ifc_notif |= SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_GEN_IN_TOGGLE_STS_MASK; + } + if (sts == 0) { + VPRINTF(ERROR,"bad soc_ifc_notif_intr sts:%x\n", sts); + SEND_STDOUT_CTRL(0x1); + while(1); + } +} + +inline void service_sha512_acc_error_intr() {return;} +inline void service_sha512_acc_notif_intr() { + uint32_t * reg = (uint32_t *) (CLP_SHA512_ACC_CSR_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R); + uint32_t sts = *reg; + /* Write 1 to Clear the pending interrupt */ + if (sts & SHA512_ACC_CSR_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK) { + *reg = SHA512_ACC_CSR_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + cptra_intr_rcv.sha512_acc_notif |= SHA512_ACC_CSR_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + } + if (sts == 0) { + VPRINTF(ERROR,"bad sha512_acc_notif_intr sts:%x\n", sts); + SEND_STDOUT_CTRL(0x1); + while(1); + } +} #endif //CALIPTRA_ISR_H diff --git a/src/integration/test_suites/smoke_test_datavault_basic/smoke_test_datavault_basic.c b/src/integration/test_suites/smoke_test_datavault_basic/smoke_test_datavault_basic.c index b7d0a5b01..78f5a809f 100644 --- a/src/integration/test_suites/smoke_test_datavault_basic/smoke_test_datavault_basic.c +++ b/src/integration/test_suites/smoke_test_datavault_basic/smoke_test_datavault_basic.c @@ -35,6 +35,30 @@ volatile uint32_t err_count __attribute__((section(".dccm.persistent"))) = 0; enum printf_verbosity verbosity_g = LOW; #endif +volatile caliptra_intr_received_s cptra_intr_rcv = { + .doe_error = 0, + .doe_notif = 0, + .ecc_error = 0, + .ecc_notif = 0, + .hmac_error = 0, + .hmac_notif = 0, + .kv_error = 0, + .kv_notif = 0, + .sha512_error = 0, + .sha512_notif = 0, + .sha256_error = 0, + .sha256_notif = 0, + .qspi_error = 0, + .qspi_notif = 0, + .uart_error = 0, + .uart_notif = 0, + .i3c_error = 0, + .i3c_notif = 0, + .soc_ifc_error = 0, + .soc_ifc_notif = 0, + .sha512_acc_error = 0, + .sha512_acc_notif = 0, +}; #ifndef MY_RANDOM_SEED #define MY_RANDOM_SEED 17 diff --git a/src/integration/test_suites/smoke_test_datavault_lock/caliptra_isr.h b/src/integration/test_suites/smoke_test_datavault_lock/caliptra_isr.h index 48879dc68..8f5779e04 100644 --- a/src/integration/test_suites/smoke_test_datavault_lock/caliptra_isr.h +++ b/src/integration/test_suites/smoke_test_datavault_lock/caliptra_isr.h @@ -32,39 +32,216 @@ #include #include "printf.h" -//extern volatile uint32_t hmac_intr_status; +/* --------------- symbols/typedefs --------------- */ +typedef struct { + uint32_t doe_error; + uint32_t doe_notif; + uint32_t ecc_error; + uint32_t ecc_notif; + uint32_t hmac_error; + uint32_t hmac_notif; + uint32_t kv_error; + uint32_t kv_notif; + uint32_t sha512_error; + uint32_t sha512_notif; + uint32_t sha256_error; + uint32_t sha256_notif; + uint32_t qspi_error; + uint32_t qspi_notif; + uint32_t uart_error; + uint32_t uart_notif; + uint32_t i3c_error; + uint32_t i3c_notif; + uint32_t soc_ifc_error; + uint32_t soc_ifc_notif; + uint32_t sha512_acc_error; + uint32_t sha512_acc_notif; +} caliptra_intr_received_s; +extern volatile caliptra_intr_received_s cptra_intr_rcv; ////////////////////////////////////////////////////////////////////////////// // Function Declarations // + // Performs all the CSR setup to configure and enable vectored external interrupts void init_interrupts(void); // These inline functions are used to insert event-specific functionality into the // otherwise generic ISR that gets laid down by the parameterized macro "nonstd_veer_isr" -inline void service_doe_error_intr() {printf("ERROR");} -inline void service_doe_notif_intr() {printf("ERROR");} -inline void service_ecc_error_intr () {printf("ERROR");} -inline void service_ecc_notif_intr () {printf("ERROR");} -inline void service_hmac_error_intr () {printf("ERROR");} -inline void service_hmac_notif_intr () {printf("ERROR");} - -inline void service_kv_error_intr () {printf("ERROR");} -inline void service_kv_notif_intr () {printf("ERROR");} -inline void service_sha512_error_intr() {printf("ERROR");} -inline void service_sha512_notif_intr() {printf("ERROR");} -inline void service_sha256_error_intr() {printf("ERROR");} -inline void service_sha256_notif_intr() {printf("ERROR");} -inline void service_qspi_error_intr () {printf("ERROR");} -inline void service_qspi_notif_intr () {printf("ERROR");} -inline void service_uart_error_intr () {printf("ERROR");} -inline void service_uart_notif_intr () {printf("ERROR");} -inline void service_i3c_error_intr () {printf("ERROR");} -inline void service_i3c_notif_intr () {printf("ERROR");} -inline void service_soc_ifc_error_intr () {printf("ERROR");} -inline void service_soc_ifc_notif_intr () {printf("ERROR");} -inline void service_sha512_acc_error_intr() {printf("ERROR");} -inline void service_sha512_acc_notif_intr() {printf("ERROR");} +inline void service_doe_error_intr() {return;} +inline void service_doe_notif_intr() { + uint32_t * reg = (uint32_t *) (CLP_DOE_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R); + uint32_t sts = *reg; + /* Write 1 to Clear the pending interrupt */ + if (sts & DOE_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK) { + *reg = DOE_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + cptra_intr_rcv.doe_notif |= DOE_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + } + if (sts == 0) { + VPRINTF(ERROR,"bad doe_notif_intr sts:%x\n", sts); + SEND_STDOUT_CTRL(0x1); + while(1); + } +} + +inline void service_ecc_error_intr() {return;} +inline void service_ecc_notif_intr() { + uint32_t * reg = (uint32_t *) (CLP_ECC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R); + uint32_t sts = *reg; + /* Write 1 to Clear the pending interrupt */ + if (sts & ECC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK) { + *reg = ECC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + cptra_intr_rcv.ecc_notif |= ECC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + } + if (sts == 0) { + VPRINTF(ERROR,"bad ecc_notif_intr sts:%x\n", sts); + SEND_STDOUT_CTRL(0x1); + while(1); + } +} + +inline void service_hmac_error_intr() {return;} +inline void service_hmac_notif_intr() { + uint32_t * reg = (uint32_t *) (CLP_HMAC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R); + uint32_t sts = *reg; + /* Write 1 to Clear the pending interrupt */ + if (sts & HMAC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK) { + *reg = HMAC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + cptra_intr_rcv.hmac_notif |= HMAC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + } + if (sts == 0) { + VPRINTF(ERROR,"bad hmac_notif_intr sts:%x\n", sts); + SEND_STDOUT_CTRL(0x1); + while(1); + } +} + +inline void service_kv_error_intr() {return;} +inline void service_kv_notif_intr() {return;} +inline void service_sha512_error_intr() {return;} +inline void service_sha512_notif_intr() { + uint32_t * reg = (uint32_t *) (CLP_SHA512_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R); + uint32_t sts = *reg; + /* Write 1 to Clear the pending interrupt */ + if (sts & SHA512_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK) { + *reg = SHA512_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + cptra_intr_rcv.sha512_notif |= SHA512_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + } + if (sts == 0) { + VPRINTF(ERROR,"bad sha512_notif_intr sts:%x\n", sts); + SEND_STDOUT_CTRL(0x1); + while(1); + } +} + +inline void service_sha256_error_intr() {return;} +inline void service_sha256_notif_intr() { + uint32_t * reg = (uint32_t *) (CLP_SHA256_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R); + uint32_t sts = *reg; + /* Write 1 to Clear the pending interrupt */ + if (sts & SHA256_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK) { + *reg = SHA256_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + cptra_intr_rcv.sha256_notif |= SHA256_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + } + if (sts == 0) { + VPRINTF(ERROR,"bad sha256_notif_intr sts:%x\n", sts); + SEND_STDOUT_CTRL(0x1); + while(1); + } +} + +inline void service_qspi_error_intr() {return;} +inline void service_qspi_notif_intr() {return;} +inline void service_uart_error_intr() {return;} +inline void service_uart_notif_intr() {return;} +inline void service_i3c_error_intr() {return;} +inline void service_i3c_notif_intr() {return;} + +inline void service_soc_ifc_error_intr() { + uint32_t * reg = (uint32_t *) (CLP_SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R); + uint32_t sts = *reg; + /* Write 1 to Clear the pending interrupt */ + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_INTERNAL_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_INTERNAL_STS_MASK; + cptra_intr_rcv.soc_ifc_error |= SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_INTERNAL_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_INV_DEV_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_INV_DEV_STS_MASK; + cptra_intr_rcv.soc_ifc_error |= SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_INV_DEV_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_CMD_FAIL_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_CMD_FAIL_STS_MASK; + cptra_intr_rcv.soc_ifc_error |= SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_CMD_FAIL_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_BAD_FUSE_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_BAD_FUSE_STS_MASK; + cptra_intr_rcv.soc_ifc_error |= SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_BAD_FUSE_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_ICCM_BLOCKED_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_ICCM_BLOCKED_STS_MASK; + cptra_intr_rcv.soc_ifc_error |= SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_ICCM_BLOCKED_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_MBOX_ECC_UNC_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_MBOX_ECC_UNC_STS_MASK; + cptra_intr_rcv.soc_ifc_error |= SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_MBOX_ECC_UNC_STS_MASK; + } + if (sts == 0) { + VPRINTF(ERROR,"bad soc_ifc_error_intr sts:%x\n", sts); + SEND_STDOUT_CTRL(0x1); + while(1); + } +} + +inline void service_soc_ifc_notif_intr () { + uint32_t * reg = (uint32_t *) (CLP_SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R); + uint32_t sts = *reg; + /* Write 1 to Clear the pending interrupt */ + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_AVAIL_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_AVAIL_STS_MASK; + cptra_intr_rcv.soc_ifc_notif |= SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_AVAIL_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_MBOX_ECC_COR_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_MBOX_ECC_COR_STS_MASK; + cptra_intr_rcv.soc_ifc_notif |= SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_MBOX_ECC_COR_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_DEBUG_LOCKED_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_DEBUG_LOCKED_STS_MASK; + cptra_intr_rcv.soc_ifc_notif |= SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_DEBUG_LOCKED_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_SCAN_MODE_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_SCAN_MODE_STS_MASK; + cptra_intr_rcv.soc_ifc_notif |= SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_SCAN_MODE_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_SOC_REQ_LOCK_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_SOC_REQ_LOCK_STS_MASK; + cptra_intr_rcv.soc_ifc_notif |= SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_SOC_REQ_LOCK_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_GEN_IN_TOGGLE_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_GEN_IN_TOGGLE_STS_MASK; + cptra_intr_rcv.soc_ifc_notif |= SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_GEN_IN_TOGGLE_STS_MASK; + } + if (sts == 0) { + VPRINTF(ERROR,"bad soc_ifc_notif_intr sts:%x\n", sts); + SEND_STDOUT_CTRL(0x1); + while(1); + } +} + +inline void service_sha512_acc_error_intr() {return;} +inline void service_sha512_acc_notif_intr() { + uint32_t * reg = (uint32_t *) (CLP_SHA512_ACC_CSR_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R); + uint32_t sts = *reg; + /* Write 1 to Clear the pending interrupt */ + if (sts & SHA512_ACC_CSR_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK) { + *reg = SHA512_ACC_CSR_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + cptra_intr_rcv.sha512_acc_notif |= SHA512_ACC_CSR_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + } + if (sts == 0) { + VPRINTF(ERROR,"bad sha512_acc_notif_intr sts:%x\n", sts); + SEND_STDOUT_CTRL(0x1); + while(1); + } +} #endif //CALIPTRA_ISR_H diff --git a/src/integration/test_suites/smoke_test_datavault_lock/smoke_test_datavault_lock.c b/src/integration/test_suites/smoke_test_datavault_lock/smoke_test_datavault_lock.c index 1998304fb..1a995fc73 100644 --- a/src/integration/test_suites/smoke_test_datavault_lock/smoke_test_datavault_lock.c +++ b/src/integration/test_suites/smoke_test_datavault_lock/smoke_test_datavault_lock.c @@ -35,6 +35,31 @@ volatile uint32_t err_count __attribute__((section(".dccm.persistent"))) = 0; enum printf_verbosity verbosity_g = LOW; #endif +volatile caliptra_intr_received_s cptra_intr_rcv = { + .doe_error = 0, + .doe_notif = 0, + .ecc_error = 0, + .ecc_notif = 0, + .hmac_error = 0, + .hmac_notif = 0, + .kv_error = 0, + .kv_notif = 0, + .sha512_error = 0, + .sha512_notif = 0, + .sha256_error = 0, + .sha256_notif = 0, + .qspi_error = 0, + .qspi_notif = 0, + .uart_error = 0, + .uart_notif = 0, + .i3c_error = 0, + .i3c_notif = 0, + .soc_ifc_error = 0, + .soc_ifc_notif = 0, + .sha512_acc_error = 0, + .sha512_acc_notif = 0, +}; + #ifndef MY_RANDOM_SEED #define MY_RANDOM_SEED 17 #endif // MY_RANDOM_SEED diff --git a/src/integration/test_suites/smoke_test_datavault_mini/caliptra_isr.h b/src/integration/test_suites/smoke_test_datavault_mini/caliptra_isr.h index 48879dc68..8f5779e04 100644 --- a/src/integration/test_suites/smoke_test_datavault_mini/caliptra_isr.h +++ b/src/integration/test_suites/smoke_test_datavault_mini/caliptra_isr.h @@ -32,39 +32,216 @@ #include #include "printf.h" -//extern volatile uint32_t hmac_intr_status; +/* --------------- symbols/typedefs --------------- */ +typedef struct { + uint32_t doe_error; + uint32_t doe_notif; + uint32_t ecc_error; + uint32_t ecc_notif; + uint32_t hmac_error; + uint32_t hmac_notif; + uint32_t kv_error; + uint32_t kv_notif; + uint32_t sha512_error; + uint32_t sha512_notif; + uint32_t sha256_error; + uint32_t sha256_notif; + uint32_t qspi_error; + uint32_t qspi_notif; + uint32_t uart_error; + uint32_t uart_notif; + uint32_t i3c_error; + uint32_t i3c_notif; + uint32_t soc_ifc_error; + uint32_t soc_ifc_notif; + uint32_t sha512_acc_error; + uint32_t sha512_acc_notif; +} caliptra_intr_received_s; +extern volatile caliptra_intr_received_s cptra_intr_rcv; ////////////////////////////////////////////////////////////////////////////// // Function Declarations // + // Performs all the CSR setup to configure and enable vectored external interrupts void init_interrupts(void); // These inline functions are used to insert event-specific functionality into the // otherwise generic ISR that gets laid down by the parameterized macro "nonstd_veer_isr" -inline void service_doe_error_intr() {printf("ERROR");} -inline void service_doe_notif_intr() {printf("ERROR");} -inline void service_ecc_error_intr () {printf("ERROR");} -inline void service_ecc_notif_intr () {printf("ERROR");} -inline void service_hmac_error_intr () {printf("ERROR");} -inline void service_hmac_notif_intr () {printf("ERROR");} - -inline void service_kv_error_intr () {printf("ERROR");} -inline void service_kv_notif_intr () {printf("ERROR");} -inline void service_sha512_error_intr() {printf("ERROR");} -inline void service_sha512_notif_intr() {printf("ERROR");} -inline void service_sha256_error_intr() {printf("ERROR");} -inline void service_sha256_notif_intr() {printf("ERROR");} -inline void service_qspi_error_intr () {printf("ERROR");} -inline void service_qspi_notif_intr () {printf("ERROR");} -inline void service_uart_error_intr () {printf("ERROR");} -inline void service_uart_notif_intr () {printf("ERROR");} -inline void service_i3c_error_intr () {printf("ERROR");} -inline void service_i3c_notif_intr () {printf("ERROR");} -inline void service_soc_ifc_error_intr () {printf("ERROR");} -inline void service_soc_ifc_notif_intr () {printf("ERROR");} -inline void service_sha512_acc_error_intr() {printf("ERROR");} -inline void service_sha512_acc_notif_intr() {printf("ERROR");} +inline void service_doe_error_intr() {return;} +inline void service_doe_notif_intr() { + uint32_t * reg = (uint32_t *) (CLP_DOE_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R); + uint32_t sts = *reg; + /* Write 1 to Clear the pending interrupt */ + if (sts & DOE_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK) { + *reg = DOE_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + cptra_intr_rcv.doe_notif |= DOE_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + } + if (sts == 0) { + VPRINTF(ERROR,"bad doe_notif_intr sts:%x\n", sts); + SEND_STDOUT_CTRL(0x1); + while(1); + } +} + +inline void service_ecc_error_intr() {return;} +inline void service_ecc_notif_intr() { + uint32_t * reg = (uint32_t *) (CLP_ECC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R); + uint32_t sts = *reg; + /* Write 1 to Clear the pending interrupt */ + if (sts & ECC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK) { + *reg = ECC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + cptra_intr_rcv.ecc_notif |= ECC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + } + if (sts == 0) { + VPRINTF(ERROR,"bad ecc_notif_intr sts:%x\n", sts); + SEND_STDOUT_CTRL(0x1); + while(1); + } +} + +inline void service_hmac_error_intr() {return;} +inline void service_hmac_notif_intr() { + uint32_t * reg = (uint32_t *) (CLP_HMAC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R); + uint32_t sts = *reg; + /* Write 1 to Clear the pending interrupt */ + if (sts & HMAC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK) { + *reg = HMAC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + cptra_intr_rcv.hmac_notif |= HMAC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + } + if (sts == 0) { + VPRINTF(ERROR,"bad hmac_notif_intr sts:%x\n", sts); + SEND_STDOUT_CTRL(0x1); + while(1); + } +} + +inline void service_kv_error_intr() {return;} +inline void service_kv_notif_intr() {return;} +inline void service_sha512_error_intr() {return;} +inline void service_sha512_notif_intr() { + uint32_t * reg = (uint32_t *) (CLP_SHA512_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R); + uint32_t sts = *reg; + /* Write 1 to Clear the pending interrupt */ + if (sts & SHA512_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK) { + *reg = SHA512_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + cptra_intr_rcv.sha512_notif |= SHA512_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + } + if (sts == 0) { + VPRINTF(ERROR,"bad sha512_notif_intr sts:%x\n", sts); + SEND_STDOUT_CTRL(0x1); + while(1); + } +} + +inline void service_sha256_error_intr() {return;} +inline void service_sha256_notif_intr() { + uint32_t * reg = (uint32_t *) (CLP_SHA256_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R); + uint32_t sts = *reg; + /* Write 1 to Clear the pending interrupt */ + if (sts & SHA256_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK) { + *reg = SHA256_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + cptra_intr_rcv.sha256_notif |= SHA256_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + } + if (sts == 0) { + VPRINTF(ERROR,"bad sha256_notif_intr sts:%x\n", sts); + SEND_STDOUT_CTRL(0x1); + while(1); + } +} + +inline void service_qspi_error_intr() {return;} +inline void service_qspi_notif_intr() {return;} +inline void service_uart_error_intr() {return;} +inline void service_uart_notif_intr() {return;} +inline void service_i3c_error_intr() {return;} +inline void service_i3c_notif_intr() {return;} + +inline void service_soc_ifc_error_intr() { + uint32_t * reg = (uint32_t *) (CLP_SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R); + uint32_t sts = *reg; + /* Write 1 to Clear the pending interrupt */ + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_INTERNAL_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_INTERNAL_STS_MASK; + cptra_intr_rcv.soc_ifc_error |= SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_INTERNAL_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_INV_DEV_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_INV_DEV_STS_MASK; + cptra_intr_rcv.soc_ifc_error |= SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_INV_DEV_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_CMD_FAIL_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_CMD_FAIL_STS_MASK; + cptra_intr_rcv.soc_ifc_error |= SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_CMD_FAIL_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_BAD_FUSE_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_BAD_FUSE_STS_MASK; + cptra_intr_rcv.soc_ifc_error |= SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_BAD_FUSE_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_ICCM_BLOCKED_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_ICCM_BLOCKED_STS_MASK; + cptra_intr_rcv.soc_ifc_error |= SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_ICCM_BLOCKED_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_MBOX_ECC_UNC_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_MBOX_ECC_UNC_STS_MASK; + cptra_intr_rcv.soc_ifc_error |= SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_MBOX_ECC_UNC_STS_MASK; + } + if (sts == 0) { + VPRINTF(ERROR,"bad soc_ifc_error_intr sts:%x\n", sts); + SEND_STDOUT_CTRL(0x1); + while(1); + } +} + +inline void service_soc_ifc_notif_intr () { + uint32_t * reg = (uint32_t *) (CLP_SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R); + uint32_t sts = *reg; + /* Write 1 to Clear the pending interrupt */ + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_AVAIL_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_AVAIL_STS_MASK; + cptra_intr_rcv.soc_ifc_notif |= SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_AVAIL_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_MBOX_ECC_COR_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_MBOX_ECC_COR_STS_MASK; + cptra_intr_rcv.soc_ifc_notif |= SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_MBOX_ECC_COR_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_DEBUG_LOCKED_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_DEBUG_LOCKED_STS_MASK; + cptra_intr_rcv.soc_ifc_notif |= SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_DEBUG_LOCKED_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_SCAN_MODE_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_SCAN_MODE_STS_MASK; + cptra_intr_rcv.soc_ifc_notif |= SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_SCAN_MODE_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_SOC_REQ_LOCK_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_SOC_REQ_LOCK_STS_MASK; + cptra_intr_rcv.soc_ifc_notif |= SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_SOC_REQ_LOCK_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_GEN_IN_TOGGLE_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_GEN_IN_TOGGLE_STS_MASK; + cptra_intr_rcv.soc_ifc_notif |= SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_GEN_IN_TOGGLE_STS_MASK; + } + if (sts == 0) { + VPRINTF(ERROR,"bad soc_ifc_notif_intr sts:%x\n", sts); + SEND_STDOUT_CTRL(0x1); + while(1); + } +} + +inline void service_sha512_acc_error_intr() {return;} +inline void service_sha512_acc_notif_intr() { + uint32_t * reg = (uint32_t *) (CLP_SHA512_ACC_CSR_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R); + uint32_t sts = *reg; + /* Write 1 to Clear the pending interrupt */ + if (sts & SHA512_ACC_CSR_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK) { + *reg = SHA512_ACC_CSR_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + cptra_intr_rcv.sha512_acc_notif |= SHA512_ACC_CSR_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + } + if (sts == 0) { + VPRINTF(ERROR,"bad sha512_acc_notif_intr sts:%x\n", sts); + SEND_STDOUT_CTRL(0x1); + while(1); + } +} #endif //CALIPTRA_ISR_H diff --git a/src/integration/test_suites/smoke_test_datavault_mini/smoke_test_datavault_mini.c b/src/integration/test_suites/smoke_test_datavault_mini/smoke_test_datavault_mini.c index 7f7f64f12..b402e7a68 100644 --- a/src/integration/test_suites/smoke_test_datavault_mini/smoke_test_datavault_mini.c +++ b/src/integration/test_suites/smoke_test_datavault_mini/smoke_test_datavault_mini.c @@ -42,6 +42,32 @@ volatile uint32_t err_count __attribute__((section(".dccm.persistent"))) = 0; enum printf_verbosity verbosity_g = LOW; #endif +volatile caliptra_intr_received_s cptra_intr_rcv = { + .doe_error = 0, + .doe_notif = 0, + .ecc_error = 0, + .ecc_notif = 0, + .hmac_error = 0, + .hmac_notif = 0, + .kv_error = 0, + .kv_notif = 0, + .sha512_error = 0, + .sha512_notif = 0, + .sha256_error = 0, + .sha256_notif = 0, + .qspi_error = 0, + .qspi_notif = 0, + .uart_error = 0, + .uart_notif = 0, + .i3c_error = 0, + .i3c_notif = 0, + .soc_ifc_error = 0, + .soc_ifc_notif = 0, + .sha512_acc_error = 0, + .sha512_acc_notif = 0, +}; + + #ifndef MY_RANDOM_SEED #define MY_RANDOM_SEED 17 #endif // MY_RANDOM_SEED @@ -63,11 +89,11 @@ widereg_t sm_dv_regs [SM_DV_PFX_COUNT] = { { "STICKYDATAVAULTCTRL", (uint32_t *) CLP_DV_REG_STICKYDATAVAULTCTRL_0, 2, 0x1, 0x0 }, // 0. (0x1001c000) { "STICKY_DATA_VAULT_ENTRY_0", (uint32_t *) CLP_DV_REG_STICKY_DATA_VAULT_ENTRY_0_0, 3, DV_ONES, 0x0 }, // 1. (0x1001c028) { "STICKY_DATA_VAULT_ENTRY_1", (uint32_t *) CLP_DV_REG_STICKY_DATA_VAULT_ENTRY_1_0, 3, DV_ONES, 0x0 }, // 2. (0x1001c058) - { "NONSTICKYDATAVAULTCTRL", (uint32_t *) CLP_DV_REG_NONSTICKYDATAVAULTCTRL_0, 2, 0x0, 0x0 }, // 3. (0x1001c208) - { "NONSTICKY_DATA_VAULT_ENTRY_0", (uint32_t *) CLP_DV_REG_NONSTICKY_DATA_VAULT_ENTRY_0_0, 3, 0x0, 0x0 }, // 4. (0x1001c230) - { "NONSTICKY_DATA_VAULT_ENTRY_1", (uint32_t *) CLP_DV_REG_NONSTICKY_DATA_VAULT_ENTRY_1_0, 3, 0x0, 0x0 }, // 5. (0x1001c260) - { "NONSTICKY_LOCKABLE_SCRATCHREG_CTRL", (uint32_t *) CLP_DV_REG_NONSTICKYLOCKABLESCRATCHREGCTRL_0, 2, 0x0, 0x0 }, // 6. (0x1001c410) - { "NONSTICKY_LOCKABLE_SCRATCHREG", (uint32_t *) CLP_DV_REG_NONSTICKYLOCKABLESCRATCHREG_0, 2, 0x0, 0x0 }, // 7. (0x1001c438) + { "DATAVAULTCTRL", (uint32_t *) CLP_DV_REG_DATAVAULTCTRL_0, 2, 0x0, 0x0 }, // 3. (0x1001c208) + { "DATA_VAULT_ENTRY_0", (uint32_t *) CLP_DV_REG_DATA_VAULT_ENTRY_0_0, 3, DV_ONES, 0x0 }, // 4. (0x1001c230) + { "DATA_VAULT_ENTRY_1", (uint32_t *) CLP_DV_REG_DATA_VAULT_ENTRY_1_0, 3, DV_ONES, 0x0 }, // 5. (0x1001c260) + { "LOCKABLE_SCRATCHREG_CTRL", (uint32_t *) CLP_DV_REG_LOCKABLESCRATCHREGCTRL_0, 2, 0x0, 0x0 }, // 6. (0x1001c410) + { "LOCKABLE_SCRATCHREG", (uint32_t *) CLP_DV_REG_LOCKABLESCRATCHREG_0, 2, DV_ONES, 0x0 }, // 7. (0x1001c438) { "STICKY_LOCKABLE_SCRATCHREGCTRL", (uint32_t *) CLP_DV_REG_STICKYLOCKABLESCRATCHREGCTRL_0, 2, 0x1, 0x0 }, // 8. (0x1001c480) { "STICKY_LOCKABLE_SCRATCHREG", (uint32_t *) CLP_DV_REG_STICKYLOCKABLESCRATCHREG_0, 2, DV_ONES, 0x0 } // 9. (0x1001c4a0) }; diff --git a/src/integration/test_suites/smoke_test_datavault_reset/caliptra_isr.h b/src/integration/test_suites/smoke_test_datavault_reset/caliptra_isr.h index 48879dc68..8f5779e04 100644 --- a/src/integration/test_suites/smoke_test_datavault_reset/caliptra_isr.h +++ b/src/integration/test_suites/smoke_test_datavault_reset/caliptra_isr.h @@ -32,39 +32,216 @@ #include #include "printf.h" -//extern volatile uint32_t hmac_intr_status; +/* --------------- symbols/typedefs --------------- */ +typedef struct { + uint32_t doe_error; + uint32_t doe_notif; + uint32_t ecc_error; + uint32_t ecc_notif; + uint32_t hmac_error; + uint32_t hmac_notif; + uint32_t kv_error; + uint32_t kv_notif; + uint32_t sha512_error; + uint32_t sha512_notif; + uint32_t sha256_error; + uint32_t sha256_notif; + uint32_t qspi_error; + uint32_t qspi_notif; + uint32_t uart_error; + uint32_t uart_notif; + uint32_t i3c_error; + uint32_t i3c_notif; + uint32_t soc_ifc_error; + uint32_t soc_ifc_notif; + uint32_t sha512_acc_error; + uint32_t sha512_acc_notif; +} caliptra_intr_received_s; +extern volatile caliptra_intr_received_s cptra_intr_rcv; ////////////////////////////////////////////////////////////////////////////// // Function Declarations // + // Performs all the CSR setup to configure and enable vectored external interrupts void init_interrupts(void); // These inline functions are used to insert event-specific functionality into the // otherwise generic ISR that gets laid down by the parameterized macro "nonstd_veer_isr" -inline void service_doe_error_intr() {printf("ERROR");} -inline void service_doe_notif_intr() {printf("ERROR");} -inline void service_ecc_error_intr () {printf("ERROR");} -inline void service_ecc_notif_intr () {printf("ERROR");} -inline void service_hmac_error_intr () {printf("ERROR");} -inline void service_hmac_notif_intr () {printf("ERROR");} - -inline void service_kv_error_intr () {printf("ERROR");} -inline void service_kv_notif_intr () {printf("ERROR");} -inline void service_sha512_error_intr() {printf("ERROR");} -inline void service_sha512_notif_intr() {printf("ERROR");} -inline void service_sha256_error_intr() {printf("ERROR");} -inline void service_sha256_notif_intr() {printf("ERROR");} -inline void service_qspi_error_intr () {printf("ERROR");} -inline void service_qspi_notif_intr () {printf("ERROR");} -inline void service_uart_error_intr () {printf("ERROR");} -inline void service_uart_notif_intr () {printf("ERROR");} -inline void service_i3c_error_intr () {printf("ERROR");} -inline void service_i3c_notif_intr () {printf("ERROR");} -inline void service_soc_ifc_error_intr () {printf("ERROR");} -inline void service_soc_ifc_notif_intr () {printf("ERROR");} -inline void service_sha512_acc_error_intr() {printf("ERROR");} -inline void service_sha512_acc_notif_intr() {printf("ERROR");} +inline void service_doe_error_intr() {return;} +inline void service_doe_notif_intr() { + uint32_t * reg = (uint32_t *) (CLP_DOE_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R); + uint32_t sts = *reg; + /* Write 1 to Clear the pending interrupt */ + if (sts & DOE_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK) { + *reg = DOE_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + cptra_intr_rcv.doe_notif |= DOE_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + } + if (sts == 0) { + VPRINTF(ERROR,"bad doe_notif_intr sts:%x\n", sts); + SEND_STDOUT_CTRL(0x1); + while(1); + } +} + +inline void service_ecc_error_intr() {return;} +inline void service_ecc_notif_intr() { + uint32_t * reg = (uint32_t *) (CLP_ECC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R); + uint32_t sts = *reg; + /* Write 1 to Clear the pending interrupt */ + if (sts & ECC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK) { + *reg = ECC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + cptra_intr_rcv.ecc_notif |= ECC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + } + if (sts == 0) { + VPRINTF(ERROR,"bad ecc_notif_intr sts:%x\n", sts); + SEND_STDOUT_CTRL(0x1); + while(1); + } +} + +inline void service_hmac_error_intr() {return;} +inline void service_hmac_notif_intr() { + uint32_t * reg = (uint32_t *) (CLP_HMAC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R); + uint32_t sts = *reg; + /* Write 1 to Clear the pending interrupt */ + if (sts & HMAC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK) { + *reg = HMAC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + cptra_intr_rcv.hmac_notif |= HMAC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + } + if (sts == 0) { + VPRINTF(ERROR,"bad hmac_notif_intr sts:%x\n", sts); + SEND_STDOUT_CTRL(0x1); + while(1); + } +} + +inline void service_kv_error_intr() {return;} +inline void service_kv_notif_intr() {return;} +inline void service_sha512_error_intr() {return;} +inline void service_sha512_notif_intr() { + uint32_t * reg = (uint32_t *) (CLP_SHA512_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R); + uint32_t sts = *reg; + /* Write 1 to Clear the pending interrupt */ + if (sts & SHA512_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK) { + *reg = SHA512_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + cptra_intr_rcv.sha512_notif |= SHA512_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + } + if (sts == 0) { + VPRINTF(ERROR,"bad sha512_notif_intr sts:%x\n", sts); + SEND_STDOUT_CTRL(0x1); + while(1); + } +} + +inline void service_sha256_error_intr() {return;} +inline void service_sha256_notif_intr() { + uint32_t * reg = (uint32_t *) (CLP_SHA256_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R); + uint32_t sts = *reg; + /* Write 1 to Clear the pending interrupt */ + if (sts & SHA256_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK) { + *reg = SHA256_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + cptra_intr_rcv.sha256_notif |= SHA256_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + } + if (sts == 0) { + VPRINTF(ERROR,"bad sha256_notif_intr sts:%x\n", sts); + SEND_STDOUT_CTRL(0x1); + while(1); + } +} + +inline void service_qspi_error_intr() {return;} +inline void service_qspi_notif_intr() {return;} +inline void service_uart_error_intr() {return;} +inline void service_uart_notif_intr() {return;} +inline void service_i3c_error_intr() {return;} +inline void service_i3c_notif_intr() {return;} + +inline void service_soc_ifc_error_intr() { + uint32_t * reg = (uint32_t *) (CLP_SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R); + uint32_t sts = *reg; + /* Write 1 to Clear the pending interrupt */ + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_INTERNAL_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_INTERNAL_STS_MASK; + cptra_intr_rcv.soc_ifc_error |= SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_INTERNAL_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_INV_DEV_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_INV_DEV_STS_MASK; + cptra_intr_rcv.soc_ifc_error |= SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_INV_DEV_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_CMD_FAIL_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_CMD_FAIL_STS_MASK; + cptra_intr_rcv.soc_ifc_error |= SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_CMD_FAIL_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_BAD_FUSE_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_BAD_FUSE_STS_MASK; + cptra_intr_rcv.soc_ifc_error |= SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_BAD_FUSE_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_ICCM_BLOCKED_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_ICCM_BLOCKED_STS_MASK; + cptra_intr_rcv.soc_ifc_error |= SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_ICCM_BLOCKED_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_MBOX_ECC_UNC_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_MBOX_ECC_UNC_STS_MASK; + cptra_intr_rcv.soc_ifc_error |= SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_MBOX_ECC_UNC_STS_MASK; + } + if (sts == 0) { + VPRINTF(ERROR,"bad soc_ifc_error_intr sts:%x\n", sts); + SEND_STDOUT_CTRL(0x1); + while(1); + } +} + +inline void service_soc_ifc_notif_intr () { + uint32_t * reg = (uint32_t *) (CLP_SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R); + uint32_t sts = *reg; + /* Write 1 to Clear the pending interrupt */ + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_AVAIL_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_AVAIL_STS_MASK; + cptra_intr_rcv.soc_ifc_notif |= SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_AVAIL_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_MBOX_ECC_COR_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_MBOX_ECC_COR_STS_MASK; + cptra_intr_rcv.soc_ifc_notif |= SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_MBOX_ECC_COR_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_DEBUG_LOCKED_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_DEBUG_LOCKED_STS_MASK; + cptra_intr_rcv.soc_ifc_notif |= SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_DEBUG_LOCKED_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_SCAN_MODE_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_SCAN_MODE_STS_MASK; + cptra_intr_rcv.soc_ifc_notif |= SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_SCAN_MODE_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_SOC_REQ_LOCK_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_SOC_REQ_LOCK_STS_MASK; + cptra_intr_rcv.soc_ifc_notif |= SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_SOC_REQ_LOCK_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_GEN_IN_TOGGLE_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_GEN_IN_TOGGLE_STS_MASK; + cptra_intr_rcv.soc_ifc_notif |= SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_GEN_IN_TOGGLE_STS_MASK; + } + if (sts == 0) { + VPRINTF(ERROR,"bad soc_ifc_notif_intr sts:%x\n", sts); + SEND_STDOUT_CTRL(0x1); + while(1); + } +} + +inline void service_sha512_acc_error_intr() {return;} +inline void service_sha512_acc_notif_intr() { + uint32_t * reg = (uint32_t *) (CLP_SHA512_ACC_CSR_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R); + uint32_t sts = *reg; + /* Write 1 to Clear the pending interrupt */ + if (sts & SHA512_ACC_CSR_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK) { + *reg = SHA512_ACC_CSR_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + cptra_intr_rcv.sha512_acc_notif |= SHA512_ACC_CSR_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + } + if (sts == 0) { + VPRINTF(ERROR,"bad sha512_acc_notif_intr sts:%x\n", sts); + SEND_STDOUT_CTRL(0x1); + while(1); + } +} #endif //CALIPTRA_ISR_H diff --git a/src/integration/test_suites/smoke_test_datavault_reset/smoke_test_datavault_reset.c b/src/integration/test_suites/smoke_test_datavault_reset/smoke_test_datavault_reset.c index 68813734f..c0a40a93d 100644 --- a/src/integration/test_suites/smoke_test_datavault_reset/smoke_test_datavault_reset.c +++ b/src/integration/test_suites/smoke_test_datavault_reset/smoke_test_datavault_reset.c @@ -34,6 +34,30 @@ volatile uint32_t err_count __attribute__((section(".dccm.persistent"))) = 0; enum printf_verbosity verbosity_g = LOW; #endif +volatile caliptra_intr_received_s cptra_intr_rcv = { + .doe_error = 0, + .doe_notif = 0, + .ecc_error = 0, + .ecc_notif = 0, + .hmac_error = 0, + .hmac_notif = 0, + .kv_error = 0, + .kv_notif = 0, + .sha512_error = 0, + .sha512_notif = 0, + .sha256_error = 0, + .sha256_notif = 0, + .qspi_error = 0, + .qspi_notif = 0, + .uart_error = 0, + .uart_notif = 0, + .i3c_error = 0, + .i3c_notif = 0, + .soc_ifc_error = 0, + .soc_ifc_notif = 0, + .sha512_acc_error = 0, + .sha512_acc_notif = 0, +}; #ifndef MY_RANDOM_SEED #define MY_RANDOM_SEED 17 diff --git a/src/integration/test_suites/smoke_test_doe_cg/caliptra_isr.h b/src/integration/test_suites/smoke_test_doe_cg/caliptra_isr.h new file mode 100644 index 000000000..8f5779e04 --- /dev/null +++ b/src/integration/test_suites/smoke_test_doe_cg/caliptra_isr.h @@ -0,0 +1,247 @@ +// SPDX-License-Identifier: Apache-2.0 +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// --------------------------------------------------------------------- +// File: caliptra_isr.h +// Description: +// Provides function declarations for use by external test files, so +// that the ISR functionality may behave like a library. +// TODO: +// This header file includes inline function definitions for event and +// test specific interrupt service behavior, so it should be copied and +// modified for each test. +// --------------------------------------------------------------------- + +#ifndef CALIPTRA_ISR_H + #define CALIPTRA_ISR_H + +#define EN_ISR_PRINTS 1 + +#include "caliptra_defines.h" +#include +#include "printf.h" + +/* --------------- symbols/typedefs --------------- */ +typedef struct { + uint32_t doe_error; + uint32_t doe_notif; + uint32_t ecc_error; + uint32_t ecc_notif; + uint32_t hmac_error; + uint32_t hmac_notif; + uint32_t kv_error; + uint32_t kv_notif; + uint32_t sha512_error; + uint32_t sha512_notif; + uint32_t sha256_error; + uint32_t sha256_notif; + uint32_t qspi_error; + uint32_t qspi_notif; + uint32_t uart_error; + uint32_t uart_notif; + uint32_t i3c_error; + uint32_t i3c_notif; + uint32_t soc_ifc_error; + uint32_t soc_ifc_notif; + uint32_t sha512_acc_error; + uint32_t sha512_acc_notif; +} caliptra_intr_received_s; +extern volatile caliptra_intr_received_s cptra_intr_rcv; + +////////////////////////////////////////////////////////////////////////////// +// Function Declarations +// + +// Performs all the CSR setup to configure and enable vectored external interrupts +void init_interrupts(void); + +// These inline functions are used to insert event-specific functionality into the +// otherwise generic ISR that gets laid down by the parameterized macro "nonstd_veer_isr" +inline void service_doe_error_intr() {return;} +inline void service_doe_notif_intr() { + uint32_t * reg = (uint32_t *) (CLP_DOE_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R); + uint32_t sts = *reg; + /* Write 1 to Clear the pending interrupt */ + if (sts & DOE_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK) { + *reg = DOE_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + cptra_intr_rcv.doe_notif |= DOE_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + } + if (sts == 0) { + VPRINTF(ERROR,"bad doe_notif_intr sts:%x\n", sts); + SEND_STDOUT_CTRL(0x1); + while(1); + } +} + +inline void service_ecc_error_intr() {return;} +inline void service_ecc_notif_intr() { + uint32_t * reg = (uint32_t *) (CLP_ECC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R); + uint32_t sts = *reg; + /* Write 1 to Clear the pending interrupt */ + if (sts & ECC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK) { + *reg = ECC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + cptra_intr_rcv.ecc_notif |= ECC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + } + if (sts == 0) { + VPRINTF(ERROR,"bad ecc_notif_intr sts:%x\n", sts); + SEND_STDOUT_CTRL(0x1); + while(1); + } +} + +inline void service_hmac_error_intr() {return;} +inline void service_hmac_notif_intr() { + uint32_t * reg = (uint32_t *) (CLP_HMAC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R); + uint32_t sts = *reg; + /* Write 1 to Clear the pending interrupt */ + if (sts & HMAC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK) { + *reg = HMAC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + cptra_intr_rcv.hmac_notif |= HMAC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + } + if (sts == 0) { + VPRINTF(ERROR,"bad hmac_notif_intr sts:%x\n", sts); + SEND_STDOUT_CTRL(0x1); + while(1); + } +} + +inline void service_kv_error_intr() {return;} +inline void service_kv_notif_intr() {return;} +inline void service_sha512_error_intr() {return;} +inline void service_sha512_notif_intr() { + uint32_t * reg = (uint32_t *) (CLP_SHA512_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R); + uint32_t sts = *reg; + /* Write 1 to Clear the pending interrupt */ + if (sts & SHA512_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK) { + *reg = SHA512_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + cptra_intr_rcv.sha512_notif |= SHA512_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + } + if (sts == 0) { + VPRINTF(ERROR,"bad sha512_notif_intr sts:%x\n", sts); + SEND_STDOUT_CTRL(0x1); + while(1); + } +} + +inline void service_sha256_error_intr() {return;} +inline void service_sha256_notif_intr() { + uint32_t * reg = (uint32_t *) (CLP_SHA256_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R); + uint32_t sts = *reg; + /* Write 1 to Clear the pending interrupt */ + if (sts & SHA256_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK) { + *reg = SHA256_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + cptra_intr_rcv.sha256_notif |= SHA256_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + } + if (sts == 0) { + VPRINTF(ERROR,"bad sha256_notif_intr sts:%x\n", sts); + SEND_STDOUT_CTRL(0x1); + while(1); + } +} + +inline void service_qspi_error_intr() {return;} +inline void service_qspi_notif_intr() {return;} +inline void service_uart_error_intr() {return;} +inline void service_uart_notif_intr() {return;} +inline void service_i3c_error_intr() {return;} +inline void service_i3c_notif_intr() {return;} + +inline void service_soc_ifc_error_intr() { + uint32_t * reg = (uint32_t *) (CLP_SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R); + uint32_t sts = *reg; + /* Write 1 to Clear the pending interrupt */ + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_INTERNAL_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_INTERNAL_STS_MASK; + cptra_intr_rcv.soc_ifc_error |= SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_INTERNAL_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_INV_DEV_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_INV_DEV_STS_MASK; + cptra_intr_rcv.soc_ifc_error |= SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_INV_DEV_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_CMD_FAIL_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_CMD_FAIL_STS_MASK; + cptra_intr_rcv.soc_ifc_error |= SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_CMD_FAIL_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_BAD_FUSE_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_BAD_FUSE_STS_MASK; + cptra_intr_rcv.soc_ifc_error |= SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_BAD_FUSE_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_ICCM_BLOCKED_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_ICCM_BLOCKED_STS_MASK; + cptra_intr_rcv.soc_ifc_error |= SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_ICCM_BLOCKED_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_MBOX_ECC_UNC_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_MBOX_ECC_UNC_STS_MASK; + cptra_intr_rcv.soc_ifc_error |= SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_MBOX_ECC_UNC_STS_MASK; + } + if (sts == 0) { + VPRINTF(ERROR,"bad soc_ifc_error_intr sts:%x\n", sts); + SEND_STDOUT_CTRL(0x1); + while(1); + } +} + +inline void service_soc_ifc_notif_intr () { + uint32_t * reg = (uint32_t *) (CLP_SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R); + uint32_t sts = *reg; + /* Write 1 to Clear the pending interrupt */ + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_AVAIL_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_AVAIL_STS_MASK; + cptra_intr_rcv.soc_ifc_notif |= SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_AVAIL_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_MBOX_ECC_COR_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_MBOX_ECC_COR_STS_MASK; + cptra_intr_rcv.soc_ifc_notif |= SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_MBOX_ECC_COR_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_DEBUG_LOCKED_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_DEBUG_LOCKED_STS_MASK; + cptra_intr_rcv.soc_ifc_notif |= SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_DEBUG_LOCKED_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_SCAN_MODE_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_SCAN_MODE_STS_MASK; + cptra_intr_rcv.soc_ifc_notif |= SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_SCAN_MODE_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_SOC_REQ_LOCK_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_SOC_REQ_LOCK_STS_MASK; + cptra_intr_rcv.soc_ifc_notif |= SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_SOC_REQ_LOCK_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_GEN_IN_TOGGLE_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_GEN_IN_TOGGLE_STS_MASK; + cptra_intr_rcv.soc_ifc_notif |= SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_GEN_IN_TOGGLE_STS_MASK; + } + if (sts == 0) { + VPRINTF(ERROR,"bad soc_ifc_notif_intr sts:%x\n", sts); + SEND_STDOUT_CTRL(0x1); + while(1); + } +} + +inline void service_sha512_acc_error_intr() {return;} +inline void service_sha512_acc_notif_intr() { + uint32_t * reg = (uint32_t *) (CLP_SHA512_ACC_CSR_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R); + uint32_t sts = *reg; + /* Write 1 to Clear the pending interrupt */ + if (sts & SHA512_ACC_CSR_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK) { + *reg = SHA512_ACC_CSR_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + cptra_intr_rcv.sha512_acc_notif |= SHA512_ACC_CSR_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + } + if (sts == 0) { + VPRINTF(ERROR,"bad sha512_acc_notif_intr sts:%x\n", sts); + SEND_STDOUT_CTRL(0x1); + while(1); + } +} + + +#endif //CALIPTRA_ISR_H diff --git a/src/integration/test_suites/smoke_test_doe_cg/smoke_test_doe_cg.c b/src/integration/test_suites/smoke_test_doe_cg/smoke_test_doe_cg.c new file mode 100644 index 000000000..abab48c5c --- /dev/null +++ b/src/integration/test_suites/smoke_test_doe_cg/smoke_test_doe_cg.c @@ -0,0 +1,124 @@ +// SPDX-License-Identifier: Apache-2.0 +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +#include "caliptra_defines.h" +#include "caliptra_isr.h" +#include "riscv-csr.h" +#include +#include +#include "printf.h" +#include "clk_gate.h" + +volatile char* stdout = (char *)STDOUT; +volatile uint32_t intr_count = 0; +volatile uint32_t rst_count __attribute__((section(".dccm.persistent"))) = 0; +#ifdef CPT_VERBOSITY + enum printf_verbosity verbosity_g = CPT_VERBOSITY; +#else + enum printf_verbosity verbosity_g = LOW; +#endif + +uint32_t IV_DATA_UDS0 = 0x2eb94297; +uint32_t IV_DATA_UDS1 = 0x77285196; +uint32_t IV_DATA_UDS2 = 0x3dd39a1e; +uint32_t IV_DATA_UDS3 = 0xb95d438f; + +volatile uint32_t * doe_iv_0 = (uint32_t *) CLP_DOE_REG_DOE_IV_0; +volatile uint32_t * doe_iv_1 = (uint32_t *) CLP_DOE_REG_DOE_IV_1; +volatile uint32_t * doe_iv_2 = (uint32_t *) CLP_DOE_REG_DOE_IV_2; +volatile uint32_t * doe_iv_3 = (uint32_t *) CLP_DOE_REG_DOE_IV_3; + +volatile uint32_t * doe_ctrl = (uint32_t *) CLP_DOE_REG_DOE_CTRL; +volatile uint32_t * doe_status = (uint32_t *) CLP_DOE_REG_DOE_STATUS; + +volatile uint32_t * soc_ifc_fw_update_reset = (uint32_t *) (CLP_SOC_IFC_REG_INTERNAL_FW_UPDATE_RESET); + +volatile uint32_t * pcr_ctrl0 = (uint32_t *) CLP_PV_REG_PCR_CTRL_0; +volatile uint32_t * pcr_ctrl2 = (uint32_t *) CLP_PV_REG_PCR_CTRL_2; +volatile uint32_t * pcr_ctrl5 = (uint32_t *) CLP_PV_REG_PCR_CTRL_5; + +volatile uint32_t * key_ctrl1 = (uint32_t *) CLP_KV_REG_KEY_CTRL_1; +volatile uint32_t * key_ctrl4 = (uint32_t *) CLP_KV_REG_KEY_CTRL_4; +volatile uint32_t * key_ctrl7 = (uint32_t *) CLP_KV_REG_KEY_CTRL_7; + +volatile uint32_t doe_status_int; + +volatile caliptra_intr_received_s cptra_intr_rcv = { + .doe_error = 0, + .doe_notif = 0, + .ecc_error = 0, + .ecc_notif = 0, + .hmac_error = 0, + .hmac_notif = 0, + .kv_error = 0, + .kv_notif = 0, + .sha512_error = 0, + .sha512_notif = 0, + .sha256_error = 0, + .sha256_notif = 0, + .qspi_error = 0, + .qspi_notif = 0, + .uart_error = 0, + .uart_notif = 0, + .i3c_error = 0, + .i3c_notif = 0, + .soc_ifc_error = 0, + .soc_ifc_notif = 0, + .sha512_acc_error = 0, + .sha512_acc_notif = 0, +}; + +void main() { + volatile uint32_t mitb0 = 0x00000400; + volatile uint32_t mitb1 = 0x00000500; + volatile uint32_t mie_timer0_en = 0x20000000; + + rst_count++; + + VPRINTF(LOW,"---------------------------\n"); + VPRINTF(LOW," DOE Smoke Test With Rand UDS/FE !!\n"); + VPRINTF(LOW,"---------------------------\n"); + + //Call interrupt init + init_interrupts(); + + if (rst_count == 1) { + //Enable clk gating and halt core + SEND_STDOUT_CTRL(0xf2); + set_mit0(mitb0, mie_timer0_en); + + //VPRINTF(LOW,"Rand UDS\n"); + printf("Rand UDS\n"); + + //Start UDS and store in KV3 + SEND_STDOUT_CTRL(0xec); + *doe_ctrl = 0x0000000D; + + printf("Dummy\n"); + __asm__ volatile ("csrwi %0, %1" \ + : /* output: none */ \ + : "i" (0x7c6), "i" (0x03) /* input : immediate */ \ + : /* clobbers: none */); + + // //Poll for DOE status + while(doe_status_int != (DOE_REG_DOE_STATUS_VALID_MASK | DOE_REG_DOE_STATUS_READY_MASK)) { + doe_status_int = *doe_status; + doe_status_int = doe_status_int & (DOE_REG_DOE_STATUS_VALID_MASK | DOE_REG_DOE_STATUS_READY_MASK) ; + } + + //Clear doe_status_int + doe_status_int = 0; + +} diff --git a/src/integration/test_suites/smoke_test_doe_cg/smoke_test_doe_cg.yml b/src/integration/test_suites/smoke_test_doe_cg/smoke_test_doe_cg.yml new file mode 100644 index 000000000..1566a41b1 --- /dev/null +++ b/src/integration/test_suites/smoke_test_doe_cg/smoke_test_doe_cg.yml @@ -0,0 +1,19 @@ +# SPDX-License-Identifier: Apache-2.0 +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +--- +plusargs: + - +RAND_DOE_VALUES +seed: 1 +testname: smoke_test_doe_cg \ No newline at end of file diff --git a/src/integration/test_suites/smoke_test_doe_rand/caliptra_isr.h b/src/integration/test_suites/smoke_test_doe_rand/caliptra_isr.h new file mode 100644 index 000000000..8f5779e04 --- /dev/null +++ b/src/integration/test_suites/smoke_test_doe_rand/caliptra_isr.h @@ -0,0 +1,247 @@ +// SPDX-License-Identifier: Apache-2.0 +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// --------------------------------------------------------------------- +// File: caliptra_isr.h +// Description: +// Provides function declarations for use by external test files, so +// that the ISR functionality may behave like a library. +// TODO: +// This header file includes inline function definitions for event and +// test specific interrupt service behavior, so it should be copied and +// modified for each test. +// --------------------------------------------------------------------- + +#ifndef CALIPTRA_ISR_H + #define CALIPTRA_ISR_H + +#define EN_ISR_PRINTS 1 + +#include "caliptra_defines.h" +#include +#include "printf.h" + +/* --------------- symbols/typedefs --------------- */ +typedef struct { + uint32_t doe_error; + uint32_t doe_notif; + uint32_t ecc_error; + uint32_t ecc_notif; + uint32_t hmac_error; + uint32_t hmac_notif; + uint32_t kv_error; + uint32_t kv_notif; + uint32_t sha512_error; + uint32_t sha512_notif; + uint32_t sha256_error; + uint32_t sha256_notif; + uint32_t qspi_error; + uint32_t qspi_notif; + uint32_t uart_error; + uint32_t uart_notif; + uint32_t i3c_error; + uint32_t i3c_notif; + uint32_t soc_ifc_error; + uint32_t soc_ifc_notif; + uint32_t sha512_acc_error; + uint32_t sha512_acc_notif; +} caliptra_intr_received_s; +extern volatile caliptra_intr_received_s cptra_intr_rcv; + +////////////////////////////////////////////////////////////////////////////// +// Function Declarations +// + +// Performs all the CSR setup to configure and enable vectored external interrupts +void init_interrupts(void); + +// These inline functions are used to insert event-specific functionality into the +// otherwise generic ISR that gets laid down by the parameterized macro "nonstd_veer_isr" +inline void service_doe_error_intr() {return;} +inline void service_doe_notif_intr() { + uint32_t * reg = (uint32_t *) (CLP_DOE_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R); + uint32_t sts = *reg; + /* Write 1 to Clear the pending interrupt */ + if (sts & DOE_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK) { + *reg = DOE_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + cptra_intr_rcv.doe_notif |= DOE_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + } + if (sts == 0) { + VPRINTF(ERROR,"bad doe_notif_intr sts:%x\n", sts); + SEND_STDOUT_CTRL(0x1); + while(1); + } +} + +inline void service_ecc_error_intr() {return;} +inline void service_ecc_notif_intr() { + uint32_t * reg = (uint32_t *) (CLP_ECC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R); + uint32_t sts = *reg; + /* Write 1 to Clear the pending interrupt */ + if (sts & ECC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK) { + *reg = ECC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + cptra_intr_rcv.ecc_notif |= ECC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + } + if (sts == 0) { + VPRINTF(ERROR,"bad ecc_notif_intr sts:%x\n", sts); + SEND_STDOUT_CTRL(0x1); + while(1); + } +} + +inline void service_hmac_error_intr() {return;} +inline void service_hmac_notif_intr() { + uint32_t * reg = (uint32_t *) (CLP_HMAC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R); + uint32_t sts = *reg; + /* Write 1 to Clear the pending interrupt */ + if (sts & HMAC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK) { + *reg = HMAC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + cptra_intr_rcv.hmac_notif |= HMAC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + } + if (sts == 0) { + VPRINTF(ERROR,"bad hmac_notif_intr sts:%x\n", sts); + SEND_STDOUT_CTRL(0x1); + while(1); + } +} + +inline void service_kv_error_intr() {return;} +inline void service_kv_notif_intr() {return;} +inline void service_sha512_error_intr() {return;} +inline void service_sha512_notif_intr() { + uint32_t * reg = (uint32_t *) (CLP_SHA512_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R); + uint32_t sts = *reg; + /* Write 1 to Clear the pending interrupt */ + if (sts & SHA512_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK) { + *reg = SHA512_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + cptra_intr_rcv.sha512_notif |= SHA512_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + } + if (sts == 0) { + VPRINTF(ERROR,"bad sha512_notif_intr sts:%x\n", sts); + SEND_STDOUT_CTRL(0x1); + while(1); + } +} + +inline void service_sha256_error_intr() {return;} +inline void service_sha256_notif_intr() { + uint32_t * reg = (uint32_t *) (CLP_SHA256_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R); + uint32_t sts = *reg; + /* Write 1 to Clear the pending interrupt */ + if (sts & SHA256_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK) { + *reg = SHA256_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + cptra_intr_rcv.sha256_notif |= SHA256_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + } + if (sts == 0) { + VPRINTF(ERROR,"bad sha256_notif_intr sts:%x\n", sts); + SEND_STDOUT_CTRL(0x1); + while(1); + } +} + +inline void service_qspi_error_intr() {return;} +inline void service_qspi_notif_intr() {return;} +inline void service_uart_error_intr() {return;} +inline void service_uart_notif_intr() {return;} +inline void service_i3c_error_intr() {return;} +inline void service_i3c_notif_intr() {return;} + +inline void service_soc_ifc_error_intr() { + uint32_t * reg = (uint32_t *) (CLP_SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R); + uint32_t sts = *reg; + /* Write 1 to Clear the pending interrupt */ + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_INTERNAL_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_INTERNAL_STS_MASK; + cptra_intr_rcv.soc_ifc_error |= SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_INTERNAL_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_INV_DEV_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_INV_DEV_STS_MASK; + cptra_intr_rcv.soc_ifc_error |= SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_INV_DEV_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_CMD_FAIL_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_CMD_FAIL_STS_MASK; + cptra_intr_rcv.soc_ifc_error |= SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_CMD_FAIL_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_BAD_FUSE_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_BAD_FUSE_STS_MASK; + cptra_intr_rcv.soc_ifc_error |= SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_BAD_FUSE_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_ICCM_BLOCKED_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_ICCM_BLOCKED_STS_MASK; + cptra_intr_rcv.soc_ifc_error |= SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_ICCM_BLOCKED_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_MBOX_ECC_UNC_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_MBOX_ECC_UNC_STS_MASK; + cptra_intr_rcv.soc_ifc_error |= SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_MBOX_ECC_UNC_STS_MASK; + } + if (sts == 0) { + VPRINTF(ERROR,"bad soc_ifc_error_intr sts:%x\n", sts); + SEND_STDOUT_CTRL(0x1); + while(1); + } +} + +inline void service_soc_ifc_notif_intr () { + uint32_t * reg = (uint32_t *) (CLP_SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R); + uint32_t sts = *reg; + /* Write 1 to Clear the pending interrupt */ + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_AVAIL_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_AVAIL_STS_MASK; + cptra_intr_rcv.soc_ifc_notif |= SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_AVAIL_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_MBOX_ECC_COR_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_MBOX_ECC_COR_STS_MASK; + cptra_intr_rcv.soc_ifc_notif |= SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_MBOX_ECC_COR_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_DEBUG_LOCKED_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_DEBUG_LOCKED_STS_MASK; + cptra_intr_rcv.soc_ifc_notif |= SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_DEBUG_LOCKED_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_SCAN_MODE_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_SCAN_MODE_STS_MASK; + cptra_intr_rcv.soc_ifc_notif |= SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_SCAN_MODE_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_SOC_REQ_LOCK_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_SOC_REQ_LOCK_STS_MASK; + cptra_intr_rcv.soc_ifc_notif |= SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_SOC_REQ_LOCK_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_GEN_IN_TOGGLE_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_GEN_IN_TOGGLE_STS_MASK; + cptra_intr_rcv.soc_ifc_notif |= SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_GEN_IN_TOGGLE_STS_MASK; + } + if (sts == 0) { + VPRINTF(ERROR,"bad soc_ifc_notif_intr sts:%x\n", sts); + SEND_STDOUT_CTRL(0x1); + while(1); + } +} + +inline void service_sha512_acc_error_intr() {return;} +inline void service_sha512_acc_notif_intr() { + uint32_t * reg = (uint32_t *) (CLP_SHA512_ACC_CSR_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R); + uint32_t sts = *reg; + /* Write 1 to Clear the pending interrupt */ + if (sts & SHA512_ACC_CSR_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK) { + *reg = SHA512_ACC_CSR_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + cptra_intr_rcv.sha512_acc_notif |= SHA512_ACC_CSR_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + } + if (sts == 0) { + VPRINTF(ERROR,"bad sha512_acc_notif_intr sts:%x\n", sts); + SEND_STDOUT_CTRL(0x1); + while(1); + } +} + + +#endif //CALIPTRA_ISR_H diff --git a/src/integration/test_suites/smoke_test_doe_rand/smoke_test_doe_rand.c b/src/integration/test_suites/smoke_test_doe_rand/smoke_test_doe_rand.c new file mode 100644 index 000000000..4609650e4 --- /dev/null +++ b/src/integration/test_suites/smoke_test_doe_rand/smoke_test_doe_rand.c @@ -0,0 +1,114 @@ +// SPDX-License-Identifier: Apache-2.0 +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +#include "caliptra_defines.h" +#include "caliptra_isr.h" +#include "riscv-csr.h" +#include +#include +#include "printf.h" + +volatile char* stdout = (char *)STDOUT; +volatile uint32_t intr_count = 0; +volatile uint32_t rst_count __attribute__((section(".dccm.persistent"))) = 0; +#ifdef CPT_VERBOSITY + enum printf_verbosity verbosity_g = CPT_VERBOSITY; +#else + enum printf_verbosity verbosity_g = LOW; +#endif + +uint32_t IV_DATA_UDS0 = 0x2eb94297; +uint32_t IV_DATA_UDS1 = 0x77285196; +uint32_t IV_DATA_UDS2 = 0x3dd39a1e; +uint32_t IV_DATA_UDS3 = 0xb95d438f; + +volatile uint32_t * doe_iv_0 = (uint32_t *) CLP_DOE_REG_DOE_IV_0; +volatile uint32_t * doe_iv_1 = (uint32_t *) CLP_DOE_REG_DOE_IV_1; +volatile uint32_t * doe_iv_2 = (uint32_t *) CLP_DOE_REG_DOE_IV_2; +volatile uint32_t * doe_iv_3 = (uint32_t *) CLP_DOE_REG_DOE_IV_3; + +volatile uint32_t * doe_ctrl = (uint32_t *) CLP_DOE_REG_DOE_CTRL; +volatile uint32_t * doe_status = (uint32_t *) CLP_DOE_REG_DOE_STATUS; + +volatile uint32_t * soc_ifc_fw_update_reset = (uint32_t *) (CLP_SOC_IFC_REG_INTERNAL_FW_UPDATE_RESET); + +volatile uint32_t * pcr_ctrl0 = (uint32_t *) CLP_PV_REG_PCR_CTRL_0; +volatile uint32_t * pcr_ctrl2 = (uint32_t *) CLP_PV_REG_PCR_CTRL_2; +volatile uint32_t * pcr_ctrl5 = (uint32_t *) CLP_PV_REG_PCR_CTRL_5; + +volatile uint32_t * key_ctrl1 = (uint32_t *) CLP_KV_REG_KEY_CTRL_1; +volatile uint32_t * key_ctrl4 = (uint32_t *) CLP_KV_REG_KEY_CTRL_4; +volatile uint32_t * key_ctrl7 = (uint32_t *) CLP_KV_REG_KEY_CTRL_7; + +volatile uint32_t doe_status_int; + +volatile caliptra_intr_received_s cptra_intr_rcv = { + .doe_error = 0, + .doe_notif = 0, + .ecc_error = 0, + .ecc_notif = 0, + .hmac_error = 0, + .hmac_notif = 0, + .kv_error = 0, + .kv_notif = 0, + .sha512_error = 0, + .sha512_notif = 0, + .sha256_error = 0, + .sha256_notif = 0, + .qspi_error = 0, + .qspi_notif = 0, + .uart_error = 0, + .uart_notif = 0, + .i3c_error = 0, + .i3c_notif = 0, + .soc_ifc_error = 0, + .soc_ifc_notif = 0, + .sha512_acc_error = 0, + .sha512_acc_notif = 0, +}; + +void main() { + VPRINTF(LOW,"---------------------------\n"); + VPRINTF(LOW," DOE Smoke Test With Rand UDS/FE !!\n"); + VPRINTF(LOW,"---------------------------\n"); + + //Call interrupt init + //init_interrupts(); + + VPRINTF(LOW,"Rand UDS\n"); + + //Start UDS and store in KV3 + SEND_STDOUT_CTRL(0xec); + *doe_ctrl = 0x0000000D; + + // //Poll for DOE status + while(doe_status_int != (DOE_REG_DOE_STATUS_VALID_MASK | DOE_REG_DOE_STATUS_READY_MASK)) { + doe_status_int = *doe_status; + doe_status_int = doe_status_int & (DOE_REG_DOE_STATUS_VALID_MASK | DOE_REG_DOE_STATUS_READY_MASK) ; + } + + //Clear doe_status_int + doe_status_int = 0; + + //Start FE and store in KV15 + SEND_STDOUT_CTRL(0xed); + *doe_ctrl = 0x00000062; //30; + + // //Poll for DOE status + while(doe_status_int != (DOE_REG_DOE_STATUS_VALID_MASK | DOE_REG_DOE_STATUS_READY_MASK)) { + doe_status_int = *doe_status; + doe_status_int = doe_status_int & (DOE_REG_DOE_STATUS_VALID_MASK | DOE_REG_DOE_STATUS_READY_MASK) ; + } +} diff --git a/src/integration/test_suites/smoke_test_doe_rand/smoke_test_doe_rand.yml b/src/integration/test_suites/smoke_test_doe_rand/smoke_test_doe_rand.yml new file mode 100644 index 000000000..001bbe8a3 --- /dev/null +++ b/src/integration/test_suites/smoke_test_doe_rand/smoke_test_doe_rand.yml @@ -0,0 +1,19 @@ +# SPDX-License-Identifier: Apache-2.0 +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +--- +plusargs: + - +RAND_DOE_VALUES +seed: 1 +testname: smoke_test_doe_rand \ No newline at end of file diff --git a/src/integration/test_suites/smoke_test_doe_scan/caliptra_isr.h b/src/integration/test_suites/smoke_test_doe_scan/caliptra_isr.h new file mode 100644 index 000000000..8f5779e04 --- /dev/null +++ b/src/integration/test_suites/smoke_test_doe_scan/caliptra_isr.h @@ -0,0 +1,247 @@ +// SPDX-License-Identifier: Apache-2.0 +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// --------------------------------------------------------------------- +// File: caliptra_isr.h +// Description: +// Provides function declarations for use by external test files, so +// that the ISR functionality may behave like a library. +// TODO: +// This header file includes inline function definitions for event and +// test specific interrupt service behavior, so it should be copied and +// modified for each test. +// --------------------------------------------------------------------- + +#ifndef CALIPTRA_ISR_H + #define CALIPTRA_ISR_H + +#define EN_ISR_PRINTS 1 + +#include "caliptra_defines.h" +#include +#include "printf.h" + +/* --------------- symbols/typedefs --------------- */ +typedef struct { + uint32_t doe_error; + uint32_t doe_notif; + uint32_t ecc_error; + uint32_t ecc_notif; + uint32_t hmac_error; + uint32_t hmac_notif; + uint32_t kv_error; + uint32_t kv_notif; + uint32_t sha512_error; + uint32_t sha512_notif; + uint32_t sha256_error; + uint32_t sha256_notif; + uint32_t qspi_error; + uint32_t qspi_notif; + uint32_t uart_error; + uint32_t uart_notif; + uint32_t i3c_error; + uint32_t i3c_notif; + uint32_t soc_ifc_error; + uint32_t soc_ifc_notif; + uint32_t sha512_acc_error; + uint32_t sha512_acc_notif; +} caliptra_intr_received_s; +extern volatile caliptra_intr_received_s cptra_intr_rcv; + +////////////////////////////////////////////////////////////////////////////// +// Function Declarations +// + +// Performs all the CSR setup to configure and enable vectored external interrupts +void init_interrupts(void); + +// These inline functions are used to insert event-specific functionality into the +// otherwise generic ISR that gets laid down by the parameterized macro "nonstd_veer_isr" +inline void service_doe_error_intr() {return;} +inline void service_doe_notif_intr() { + uint32_t * reg = (uint32_t *) (CLP_DOE_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R); + uint32_t sts = *reg; + /* Write 1 to Clear the pending interrupt */ + if (sts & DOE_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK) { + *reg = DOE_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + cptra_intr_rcv.doe_notif |= DOE_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + } + if (sts == 0) { + VPRINTF(ERROR,"bad doe_notif_intr sts:%x\n", sts); + SEND_STDOUT_CTRL(0x1); + while(1); + } +} + +inline void service_ecc_error_intr() {return;} +inline void service_ecc_notif_intr() { + uint32_t * reg = (uint32_t *) (CLP_ECC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R); + uint32_t sts = *reg; + /* Write 1 to Clear the pending interrupt */ + if (sts & ECC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK) { + *reg = ECC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + cptra_intr_rcv.ecc_notif |= ECC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + } + if (sts == 0) { + VPRINTF(ERROR,"bad ecc_notif_intr sts:%x\n", sts); + SEND_STDOUT_CTRL(0x1); + while(1); + } +} + +inline void service_hmac_error_intr() {return;} +inline void service_hmac_notif_intr() { + uint32_t * reg = (uint32_t *) (CLP_HMAC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R); + uint32_t sts = *reg; + /* Write 1 to Clear the pending interrupt */ + if (sts & HMAC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK) { + *reg = HMAC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + cptra_intr_rcv.hmac_notif |= HMAC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + } + if (sts == 0) { + VPRINTF(ERROR,"bad hmac_notif_intr sts:%x\n", sts); + SEND_STDOUT_CTRL(0x1); + while(1); + } +} + +inline void service_kv_error_intr() {return;} +inline void service_kv_notif_intr() {return;} +inline void service_sha512_error_intr() {return;} +inline void service_sha512_notif_intr() { + uint32_t * reg = (uint32_t *) (CLP_SHA512_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R); + uint32_t sts = *reg; + /* Write 1 to Clear the pending interrupt */ + if (sts & SHA512_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK) { + *reg = SHA512_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + cptra_intr_rcv.sha512_notif |= SHA512_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + } + if (sts == 0) { + VPRINTF(ERROR,"bad sha512_notif_intr sts:%x\n", sts); + SEND_STDOUT_CTRL(0x1); + while(1); + } +} + +inline void service_sha256_error_intr() {return;} +inline void service_sha256_notif_intr() { + uint32_t * reg = (uint32_t *) (CLP_SHA256_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R); + uint32_t sts = *reg; + /* Write 1 to Clear the pending interrupt */ + if (sts & SHA256_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK) { + *reg = SHA256_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + cptra_intr_rcv.sha256_notif |= SHA256_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + } + if (sts == 0) { + VPRINTF(ERROR,"bad sha256_notif_intr sts:%x\n", sts); + SEND_STDOUT_CTRL(0x1); + while(1); + } +} + +inline void service_qspi_error_intr() {return;} +inline void service_qspi_notif_intr() {return;} +inline void service_uart_error_intr() {return;} +inline void service_uart_notif_intr() {return;} +inline void service_i3c_error_intr() {return;} +inline void service_i3c_notif_intr() {return;} + +inline void service_soc_ifc_error_intr() { + uint32_t * reg = (uint32_t *) (CLP_SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R); + uint32_t sts = *reg; + /* Write 1 to Clear the pending interrupt */ + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_INTERNAL_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_INTERNAL_STS_MASK; + cptra_intr_rcv.soc_ifc_error |= SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_INTERNAL_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_INV_DEV_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_INV_DEV_STS_MASK; + cptra_intr_rcv.soc_ifc_error |= SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_INV_DEV_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_CMD_FAIL_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_CMD_FAIL_STS_MASK; + cptra_intr_rcv.soc_ifc_error |= SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_CMD_FAIL_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_BAD_FUSE_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_BAD_FUSE_STS_MASK; + cptra_intr_rcv.soc_ifc_error |= SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_BAD_FUSE_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_ICCM_BLOCKED_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_ICCM_BLOCKED_STS_MASK; + cptra_intr_rcv.soc_ifc_error |= SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_ICCM_BLOCKED_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_MBOX_ECC_UNC_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_MBOX_ECC_UNC_STS_MASK; + cptra_intr_rcv.soc_ifc_error |= SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_MBOX_ECC_UNC_STS_MASK; + } + if (sts == 0) { + VPRINTF(ERROR,"bad soc_ifc_error_intr sts:%x\n", sts); + SEND_STDOUT_CTRL(0x1); + while(1); + } +} + +inline void service_soc_ifc_notif_intr () { + uint32_t * reg = (uint32_t *) (CLP_SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R); + uint32_t sts = *reg; + /* Write 1 to Clear the pending interrupt */ + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_AVAIL_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_AVAIL_STS_MASK; + cptra_intr_rcv.soc_ifc_notif |= SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_AVAIL_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_MBOX_ECC_COR_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_MBOX_ECC_COR_STS_MASK; + cptra_intr_rcv.soc_ifc_notif |= SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_MBOX_ECC_COR_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_DEBUG_LOCKED_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_DEBUG_LOCKED_STS_MASK; + cptra_intr_rcv.soc_ifc_notif |= SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_DEBUG_LOCKED_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_SCAN_MODE_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_SCAN_MODE_STS_MASK; + cptra_intr_rcv.soc_ifc_notif |= SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_SCAN_MODE_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_SOC_REQ_LOCK_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_SOC_REQ_LOCK_STS_MASK; + cptra_intr_rcv.soc_ifc_notif |= SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_SOC_REQ_LOCK_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_GEN_IN_TOGGLE_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_GEN_IN_TOGGLE_STS_MASK; + cptra_intr_rcv.soc_ifc_notif |= SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_GEN_IN_TOGGLE_STS_MASK; + } + if (sts == 0) { + VPRINTF(ERROR,"bad soc_ifc_notif_intr sts:%x\n", sts); + SEND_STDOUT_CTRL(0x1); + while(1); + } +} + +inline void service_sha512_acc_error_intr() {return;} +inline void service_sha512_acc_notif_intr() { + uint32_t * reg = (uint32_t *) (CLP_SHA512_ACC_CSR_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R); + uint32_t sts = *reg; + /* Write 1 to Clear the pending interrupt */ + if (sts & SHA512_ACC_CSR_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK) { + *reg = SHA512_ACC_CSR_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + cptra_intr_rcv.sha512_acc_notif |= SHA512_ACC_CSR_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + } + if (sts == 0) { + VPRINTF(ERROR,"bad sha512_acc_notif_intr sts:%x\n", sts); + SEND_STDOUT_CTRL(0x1); + while(1); + } +} + + +#endif //CALIPTRA_ISR_H diff --git a/src/integration/test_suites/smoke_test_doe_scan/smoke_test_doe_scan.c b/src/integration/test_suites/smoke_test_doe_scan/smoke_test_doe_scan.c new file mode 100644 index 000000000..d2966ca31 --- /dev/null +++ b/src/integration/test_suites/smoke_test_doe_scan/smoke_test_doe_scan.c @@ -0,0 +1,201 @@ +// SPDX-License-Identifier: Apache-2.0 +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +#include "caliptra_defines.h" +#include "caliptra_isr.h" +#include "riscv-csr.h" +#include +#include +#include "printf.h" +#include "clk_gate.h" + +volatile char* stdout = (char *)STDOUT; +volatile uint32_t intr_count = 0; +volatile uint32_t rst_count __attribute__((section(".dccm.persistent"))) = 0; +#ifdef CPT_VERBOSITY + enum printf_verbosity verbosity_g = CPT_VERBOSITY; +#else + enum printf_verbosity verbosity_g = LOW; +#endif + +uint32_t IV_DATA_UDS0 = 0x2eb94297; +uint32_t IV_DATA_UDS1 = 0x77285196; +uint32_t IV_DATA_UDS2 = 0x3dd39a1e; +uint32_t IV_DATA_UDS3 = 0xb95d438f; + +volatile uint32_t * doe_iv_0 = (uint32_t *) CLP_DOE_REG_DOE_IV_0; +volatile uint32_t * doe_iv_1 = (uint32_t *) CLP_DOE_REG_DOE_IV_1; +volatile uint32_t * doe_iv_2 = (uint32_t *) CLP_DOE_REG_DOE_IV_2; +volatile uint32_t * doe_iv_3 = (uint32_t *) CLP_DOE_REG_DOE_IV_3; + +volatile uint32_t * doe_ctrl = (uint32_t *) CLP_DOE_REG_DOE_CTRL; +volatile uint32_t * doe_status = (uint32_t *) CLP_DOE_REG_DOE_STATUS; + +volatile uint32_t * soc_ifc_fw_update_reset = (uint32_t *) (CLP_SOC_IFC_REG_INTERNAL_FW_UPDATE_RESET); + +volatile uint32_t * pcr_ctrl0 = (uint32_t *) CLP_PV_REG_PCR_CTRL_0; +volatile uint32_t * pcr_ctrl2 = (uint32_t *) CLP_PV_REG_PCR_CTRL_2; +volatile uint32_t * pcr_ctrl5 = (uint32_t *) CLP_PV_REG_PCR_CTRL_5; + +volatile uint32_t * key_ctrl1 = (uint32_t *) CLP_KV_REG_KEY_CTRL_1; +volatile uint32_t * key_ctrl4 = (uint32_t *) CLP_KV_REG_KEY_CTRL_4; +volatile uint32_t * key_ctrl7 = (uint32_t *) CLP_KV_REG_KEY_CTRL_7; + +volatile uint32_t doe_status_int; + +volatile caliptra_intr_received_s cptra_intr_rcv = { + .doe_error = 0, + .doe_notif = 0, + .ecc_error = 0, + .ecc_notif = 0, + .hmac_error = 0, + .hmac_notif = 0, + .kv_error = 0, + .kv_notif = 0, + .sha512_error = 0, + .sha512_notif = 0, + .sha256_error = 0, + .sha256_notif = 0, + .qspi_error = 0, + .qspi_notif = 0, + .uart_error = 0, + .uart_notif = 0, + .i3c_error = 0, + .i3c_notif = 0, + .soc_ifc_error = 0, + .soc_ifc_notif = 0, + .sha512_acc_error = 0, + .sha512_acc_notif = 0, +}; + +void main() { + + rst_count++; + + VPRINTF(LOW,"---------------------------\n"); + VPRINTF(LOW," DOE Smoke Test With Rand UDS/FE !!\n"); + VPRINTF(LOW,"---------------------------\n"); + + //Call interrupt init + init_interrupts(); + + if (rst_count == 1) { + + //VPRINTF(LOW,"Rand UDS\n"); + printf("Rand UDS\n"); + + //Start UDS and store in KV3 + SEND_STDOUT_CTRL(0xec); + *doe_ctrl = 0x0000000D; + + // //Poll for DOE status + while(doe_status_int != (DOE_REG_DOE_STATUS_VALID_MASK | DOE_REG_DOE_STATUS_READY_MASK)) { + doe_status_int = *doe_status; + doe_status_int = doe_status_int & (DOE_REG_DOE_STATUS_VALID_MASK | DOE_REG_DOE_STATUS_READY_MASK) ; + } + + //Clear doe_status_int + doe_status_int = 0; + + //Start FE and store in KV15 + SEND_STDOUT_CTRL(0xed); + *doe_ctrl = 0x00000062; //30; + + // //Poll for DOE status + while(doe_status_int != (DOE_REG_DOE_STATUS_VALID_MASK | DOE_REG_DOE_STATUS_READY_MASK)) { + doe_status_int = *doe_status; + doe_status_int = doe_status_int & (DOE_REG_DOE_STATUS_VALID_MASK | DOE_REG_DOE_STATUS_READY_MASK) ; + } + + //Clear doe_status_int + doe_status_int = 0; + + //Issue cold reset - to clear lock_uds/fe so we can test other things + SEND_STDOUT_CTRL(0xf5); + } + else if (rst_count == 2) { + //----------------------------------- + //UDS flow with scan and debug modes + + SEND_STDOUT_CTRL(0xec); //Generate rand UDS vector + SEND_STDOUT_CTRL(0xef); //Enable scan mode after a delay + *doe_ctrl = 0x0000000D; //Start UDS flow + + // //Poll for DOE status + while(doe_status_int != (DOE_REG_DOE_STATUS_VALID_MASK | DOE_REG_DOE_STATUS_READY_MASK)) { + doe_status_int = *doe_status; + doe_status_int = doe_status_int & (DOE_REG_DOE_STATUS_VALID_MASK | DOE_REG_DOE_STATUS_READY_MASK) ; + } + + //Clear doe_status_int + doe_status_int = 0; + + SEND_STDOUT_CTRL(0xf0); //Disable scan mode + + //Issue cold reset + SEND_STDOUT_CTRL(0xf5); + } + else if (rst_count == 3) { + SEND_STDOUT_CTRL(0xed); //Generate rand FE vector + SEND_STDOUT_CTRL(0xfa); //Debug mode unlocked + *doe_ctrl = 0x00000062; //Start FE flow + + // //Poll for DOE status + while(doe_status_int != (DOE_REG_DOE_STATUS_VALID_MASK | DOE_REG_DOE_STATUS_READY_MASK)) { + doe_status_int = *doe_status; + doe_status_int = doe_status_int & (DOE_REG_DOE_STATUS_VALID_MASK | DOE_REG_DOE_STATUS_READY_MASK) ; + } + + //Clear doe_status_int + doe_status_int = 0; + + SEND_STDOUT_CTRL(0xf9); //Debug mode locked + + //Issue cold reset + SEND_STDOUT_CTRL(0xf5); + } + else if (rst_count == 4) { + SEND_STDOUT_CTRL(0xed); //Generate rand FE vector + *doe_ctrl = 0x00000062; //Start FE flow + + // //Poll for DOE status + while(doe_status_int != (DOE_REG_DOE_STATUS_VALID_MASK | DOE_REG_DOE_STATUS_READY_MASK)) { + doe_status_int = *doe_status; + doe_status_int = doe_status_int & (DOE_REG_DOE_STATUS_VALID_MASK | DOE_REG_DOE_STATUS_READY_MASK) ; + } + + //Clear doe_status_int + doe_status_int = 0; + + //----------------------------------- + //UDS flow with scan and debug modes + + SEND_STDOUT_CTRL(0xec); //Generate rand UDS vector + SEND_STDOUT_CTRL(0xe8); //Enable scan mode when DOE fsm goes to DONE + *doe_ctrl = 0x0000000D; //Start UDS flow + + // //Poll for DOE status + while(doe_status_int != (DOE_REG_DOE_STATUS_VALID_MASK | DOE_REG_DOE_STATUS_READY_MASK)) { + doe_status_int = *doe_status; + doe_status_int = doe_status_int & (DOE_REG_DOE_STATUS_VALID_MASK | DOE_REG_DOE_STATUS_READY_MASK) ; + } + + //Clear doe_status_int + doe_status_int = 0; + + SEND_STDOUT_CTRL(0xf0); //Disable scan mode + + } +} diff --git a/src/integration/test_suites/smoke_test_doe_scan/smoke_test_doe_scan.yml b/src/integration/test_suites/smoke_test_doe_scan/smoke_test_doe_scan.yml new file mode 100644 index 000000000..9dc21a5d7 --- /dev/null +++ b/src/integration/test_suites/smoke_test_doe_scan/smoke_test_doe_scan.yml @@ -0,0 +1,19 @@ +# SPDX-License-Identifier: Apache-2.0 +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +--- +plusargs: + - +RAND_DOE_VALUES +seed: 1 +testname: smoke_test_doe_scan \ No newline at end of file diff --git a/src/integration/test_suites/smoke_test_ecc/caliptra_isr.h b/src/integration/test_suites/smoke_test_ecc/caliptra_isr.h index 6ffd71c0a..8f5779e04 100644 --- a/src/integration/test_suites/smoke_test_ecc/caliptra_isr.h +++ b/src/integration/test_suites/smoke_test_ecc/caliptra_isr.h @@ -204,6 +204,22 @@ inline void service_soc_ifc_notif_intr () { *reg = SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_MBOX_ECC_COR_STS_MASK; cptra_intr_rcv.soc_ifc_notif |= SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_MBOX_ECC_COR_STS_MASK; } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_DEBUG_LOCKED_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_DEBUG_LOCKED_STS_MASK; + cptra_intr_rcv.soc_ifc_notif |= SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_DEBUG_LOCKED_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_SCAN_MODE_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_SCAN_MODE_STS_MASK; + cptra_intr_rcv.soc_ifc_notif |= SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_SCAN_MODE_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_SOC_REQ_LOCK_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_SOC_REQ_LOCK_STS_MASK; + cptra_intr_rcv.soc_ifc_notif |= SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_SOC_REQ_LOCK_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_GEN_IN_TOGGLE_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_GEN_IN_TOGGLE_STS_MASK; + cptra_intr_rcv.soc_ifc_notif |= SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_GEN_IN_TOGGLE_STS_MASK; + } if (sts == 0) { VPRINTF(ERROR,"bad soc_ifc_notif_intr sts:%x\n", sts); SEND_STDOUT_CTRL(0x1); diff --git a/src/integration/test_suites/smoke_test_ecc_errortrigger/caliptra_isr.h b/src/integration/test_suites/smoke_test_ecc_errortrigger/caliptra_isr.h new file mode 100644 index 000000000..d5a7efebb --- /dev/null +++ b/src/integration/test_suites/smoke_test_ecc_errortrigger/caliptra_isr.h @@ -0,0 +1,256 @@ +// SPDX-License-Identifier: Apache-2.0 +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// --------------------------------------------------------------------- +// File: caliptra_isr.h +// Description: +// Provides function declarations for use by external test files, so +// that the ISR functionality may behave like a library. +// TODO: +// This header file includes inline function definitions for event and +// test specific interrupt service behavior, so it should be copied and +// modified for each test. +// --------------------------------------------------------------------- + +#ifndef CALIPTRA_ISR_H + #define CALIPTRA_ISR_H + +#define EN_ISR_PRINTS 1 + +#include "caliptra_defines.h" +#include +#include "printf.h" + +/* --------------- symbols/typedefs --------------- */ +typedef struct { + uint32_t doe_error; + uint32_t doe_notif; + uint32_t ecc_error; + uint32_t ecc_notif; + uint32_t hmac_error; + uint32_t hmac_notif; + uint32_t kv_error; + uint32_t kv_notif; + uint32_t sha512_error; + uint32_t sha512_notif; + uint32_t sha256_error; + uint32_t sha256_notif; + uint32_t qspi_error; + uint32_t qspi_notif; + uint32_t uart_error; + uint32_t uart_notif; + uint32_t i3c_error; + uint32_t i3c_notif; + uint32_t soc_ifc_error; + uint32_t soc_ifc_notif; + uint32_t sha512_acc_error; + uint32_t sha512_acc_notif; +} caliptra_intr_received_s; +extern volatile caliptra_intr_received_s cptra_intr_rcv; + +////////////////////////////////////////////////////////////////////////////// +// Function Declarations +// + +// Performs all the CSR setup to configure and enable vectored external interrupts +void init_interrupts(void); + +// These inline functions are used to insert event-specific functionality into the +// otherwise generic ISR that gets laid down by the parameterized macro "nonstd_veer_isr" +inline void service_doe_error_intr() {return;} +inline void service_doe_notif_intr() { + uint32_t * reg = (uint32_t *) (CLP_DOE_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R); + uint32_t sts = *reg; + /* Write 1 to Clear the pending interrupt */ + if (sts & DOE_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK) { + *reg = DOE_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + cptra_intr_rcv.doe_notif |= DOE_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + } + if (sts == 0) { + VPRINTF(ERROR,"bad doe_notif_intr sts:%x\n", sts); + SEND_STDOUT_CTRL(0x1); + while(1); + } +} + +inline void service_ecc_error_intr() { + uint32_t * reg = (uint32_t *) (CLP_ECC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R); + uint32_t sts = *reg; + /* Write 1 to Clear the pending interrupt */ + if (sts & ECC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_INTERNAL_STS_MASK) { + *reg = ECC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_INTERNAL_STS_MASK; + cptra_intr_rcv.ecc_error |= ECC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_INTERNAL_STS_MASK; + } + if (sts == 0) { + VPRINTF(ERROR,"bad ecc_error_intr sts:%x\n", sts); + SEND_STDOUT_CTRL(0x1); + while(1); + } +} +inline void service_ecc_notif_intr() { + uint32_t * reg = (uint32_t *) (CLP_ECC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R); + uint32_t sts = *reg; + /* Write 1 to Clear the pending interrupt */ + if (sts & ECC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK) { + *reg = ECC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + cptra_intr_rcv.ecc_notif |= ECC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + } + if (sts == 0) { + VPRINTF(ERROR,"bad ecc_notif_intr sts:%x\n", sts); + SEND_STDOUT_CTRL(0x1); + while(1); + } +} + +inline void service_hmac_error_intr() {return;} +inline void service_hmac_notif_intr() { + uint32_t * reg = (uint32_t *) (CLP_HMAC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R); + uint32_t sts = *reg; + /* Write 1 to Clear the pending interrupt */ + if (sts & HMAC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK) { + *reg = HMAC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + cptra_intr_rcv.hmac_notif |= HMAC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + } + if (sts == 0) { + VPRINTF(ERROR,"bad hmac_notif_intr sts:%x\n", sts); + SEND_STDOUT_CTRL(0x1); + while(1); + } +} + +inline void service_kv_error_intr() {return;} +inline void service_kv_notif_intr() {return;} +inline void service_sha512_error_intr() {return;} +inline void service_sha512_notif_intr() { + uint32_t * reg = (uint32_t *) (CLP_SHA512_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R); + uint32_t sts = *reg; + /* Write 1 to Clear the pending interrupt */ + if (sts & SHA512_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK) { + *reg = SHA512_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + cptra_intr_rcv.sha512_notif |= SHA512_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + } + if (sts == 0) { + VPRINTF(ERROR,"bad sha512_notif_intr sts:%x\n", sts); + SEND_STDOUT_CTRL(0x1); + while(1); + } +} + +inline void service_sha256_error_intr() {return;} +inline void service_sha256_notif_intr() { + uint32_t * reg = (uint32_t *) (CLP_SHA256_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R); + uint32_t sts = *reg; + /* Write 1 to Clear the pending interrupt */ + if (sts & SHA256_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK) { + *reg = SHA256_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + cptra_intr_rcv.sha256_notif |= SHA256_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + } + if (sts == 0) { + VPRINTF(ERROR,"bad sha256_notif_intr sts:%x\n", sts); + SEND_STDOUT_CTRL(0x1); + while(1); + } +} + +inline void service_qspi_error_intr() {return;} +inline void service_qspi_notif_intr() {return;} +inline void service_uart_error_intr() {return;} +inline void service_uart_notif_intr() {return;} +inline void service_i3c_error_intr() {return;} +inline void service_i3c_notif_intr() {return;} + +inline void service_soc_ifc_error_intr() { + uint32_t * reg = (uint32_t *) (CLP_SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R); + uint32_t sts = *reg; + /* Write 1 to Clear the pending interrupt */ + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_INTERNAL_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_INTERNAL_STS_MASK; + cptra_intr_rcv.soc_ifc_error |= SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_INTERNAL_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_INV_DEV_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_INV_DEV_STS_MASK; + cptra_intr_rcv.soc_ifc_error |= SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_INV_DEV_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_CMD_FAIL_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_CMD_FAIL_STS_MASK; + cptra_intr_rcv.soc_ifc_error |= SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_CMD_FAIL_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_BAD_FUSE_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_BAD_FUSE_STS_MASK; + cptra_intr_rcv.soc_ifc_error |= SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_BAD_FUSE_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_ICCM_BLOCKED_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_ICCM_BLOCKED_STS_MASK; + cptra_intr_rcv.soc_ifc_error |= SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_ICCM_BLOCKED_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_MBOX_ECC_UNC_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_MBOX_ECC_UNC_STS_MASK; + cptra_intr_rcv.soc_ifc_error |= SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_MBOX_ECC_UNC_STS_MASK; + } + if (sts == 0) { + VPRINTF(ERROR,"bad soc_ifc_error_intr sts:%x\n", sts); + SEND_STDOUT_CTRL(0x1); + while(1); + } +} + +inline void service_soc_ifc_notif_intr () { + uint32_t * reg = (uint32_t *) (CLP_SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R); + uint32_t sts = *reg; + /* Write 1 to Clear the pending interrupt */ + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_AVAIL_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_AVAIL_STS_MASK; + cptra_intr_rcv.soc_ifc_notif |= SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_AVAIL_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_MBOX_ECC_COR_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_MBOX_ECC_COR_STS_MASK; + cptra_intr_rcv.soc_ifc_notif |= SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_MBOX_ECC_COR_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_DEBUG_LOCKED_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_DEBUG_LOCKED_STS_MASK; + cptra_intr_rcv.soc_ifc_notif |= SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_DEBUG_LOCKED_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_SOC_REQ_LOCK_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_SOC_REQ_LOCK_STS_MASK; + cptra_intr_rcv.soc_ifc_notif |= SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_SOC_REQ_LOCK_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_GEN_IN_TOGGLE_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_GEN_IN_TOGGLE_STS_MASK; + cptra_intr_rcv.soc_ifc_notif |= SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_GEN_IN_TOGGLE_STS_MASK; + } + if (sts == 0) { + VPRINTF(ERROR,"bad soc_ifc_notif_intr sts:%x\n", sts); + SEND_STDOUT_CTRL(0x1); + while(1); + } +} + +inline void service_sha512_acc_error_intr() {return;} +inline void service_sha512_acc_notif_intr() { + uint32_t * reg = (uint32_t *) (CLP_SHA512_ACC_CSR_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R); + uint32_t sts = *reg; + /* Write 1 to Clear the pending interrupt */ + if (sts & SHA512_ACC_CSR_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK) { + *reg = SHA512_ACC_CSR_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + cptra_intr_rcv.sha512_acc_notif |= SHA512_ACC_CSR_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + } + if (sts == 0) { + VPRINTF(ERROR,"bad sha512_acc_notif_intr sts:%x\n", sts); + SEND_STDOUT_CTRL(0x1); + while(1); + } +} + + +#endif //CALIPTRA_ISR_H diff --git a/src/integration/test_suites/smoke_test_ecc_errortrigger/smoke_test_ecc_errortrigger.c b/src/integration/test_suites/smoke_test_ecc_errortrigger/smoke_test_ecc_errortrigger.c new file mode 100644 index 000000000..d6d358ca7 --- /dev/null +++ b/src/integration/test_suites/smoke_test_ecc_errortrigger/smoke_test_ecc_errortrigger.c @@ -0,0 +1,572 @@ +// SPDX-License-Identifier: Apache-2.0 +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +#include "caliptra_defines.h" +#include "caliptra_isr.h" +#include "riscv_hw_if.h" +#include "riscv-csr.h" +#include "printf.h" +#include "ecc.h" + +volatile char* stdout = (char *)STDOUT; +volatile uint32_t intr_count = 0; +volatile uint32_t rst_count __attribute__((section(".dccm.persistent"))) = 0; +#ifdef CPT_VERBOSITY + enum printf_verbosity verbosity_g = CPT_VERBOSITY; +#else + enum printf_verbosity verbosity_g = LOW; +#endif + +volatile caliptra_intr_received_s cptra_intr_rcv = { + .doe_error = 0, + .doe_notif = 0, + .ecc_error = 0, + .ecc_notif = 0, + .hmac_error = 0, + .hmac_notif = 0, + .kv_error = 0, + .kv_notif = 0, + .sha512_error = 0, + .sha512_notif = 0, + .sha256_error = 0, + .sha256_notif = 0, + .qspi_error = 0, + .qspi_notif = 0, + .uart_error = 0, + .uart_notif = 0, + .i3c_error = 0, + .i3c_notif = 0, + .soc_ifc_error = 0, + .soc_ifc_notif = 0, + .sha512_acc_error = 0, + .sha512_acc_notif = 0, +}; + +/* ECC test vector: + MSG = C8F518D4F3AA1BD46ED56C1C3C9E16FB800AF504DB98843548C5F623EE115F73D4C62ABC06D303B5D90D9A175087290D + PRIVKEY = F274F69D163B0C9F1FC3EBF4292AD1C4EB3CEC1C5A7DDE6F80C14292934C2055E087748D0A169C772483ADEE5EE70E17 + PUBKEY_X = D79C6D972B34A1DFC916A7B6E0A99B6B5387B34DA2187607C1AD0A4D1A8C2E4172AB5FA5D9AB58FE45E43F56BBB66BA4 + PUBKEY_Y = 5A7363932B06B4F223BEF0B60A6390265112DBBD0AAE67FEF26B465BE935B48E451E68D16F1118F2B32B4C28608749ED + SEED = 8FA8541C82A392CA74F23ED1DBFD73541C5966391B97EA73D744B0E34B9DF59ED0158063E39C09A5A055371EDF7A5441 + NONCE = 1B7EC5E548E8AAA92EC77097CA9551C9783CE682CA18FB1EDBD9F1E50BC382DB8AB39496C8EE423F8CA105CBBA7B6588 + Sign_R = 871E6EA4DDC5432CDDAA60FD7F055472D3C4DD41A5BFB26709E88C311A97093599A7C8F55B3974C19E4F5A7BFC1DD2AC + SIGN_S = 3E5552DE6403350EE70AD74E4B854D2DC4126BBF9C153A5D7A07BD4B85D06E45F850920E898FB7D34F80796DAE29365C + IV = 3401CEFAE20A737649073AC1A351E32926DB9ED0DB6B1CFFAB0493DAAFB93DDDD83EDEA28A803D0D003B2633B9D0F1BF +*/ + +void main() { + printf("----------------------------------------\n"); + printf(" Running ECC Smoke Test error_trigger !!\n"); + printf("----------------------------------------\n"); + + uint32_t ecc_msg[] = {0xC8F518D4, + 0xF3AA1BD4, + 0x6ED56C1C, + 0x3C9E16FB, + 0x800AF504, + 0xDB988435, + 0x48C5F623, + 0xEE115F73, + 0xD4C62ABC, + 0x06D303B5, + 0xD90D9A17, + 0x5087290D}; + + uint32_t ecc_privkey[] = {0xF274F69D, + 0x163B0C9F, + 0x1FC3EBF4, + 0x292AD1C4, + 0xEB3CEC1C, + 0x5A7DDE6F, + 0x80C14292, + 0x934C2055, + 0xE087748D, + 0x0A169C77, + 0x2483ADEE, + 0x5EE70E17}; + + uint32_t ecc_pubkey_x[] = {0xD79C6D97, + 0x2B34A1DF, + 0xC916A7B6, + 0xE0A99B6B, + 0x5387B34D, + 0xA2187607, + 0xC1AD0A4D, + 0x1A8C2E41, + 0x72AB5FA5, + 0xD9AB58FE, + 0x45E43F56, + 0xBBB66BA4}; + + uint32_t ecc_pubkey_y[] = {0x5A736393, + 0x2B06B4F2, + 0x23BEF0B6, + 0x0A639026, + 0x5112DBBD, + 0x0AAE67FE, + 0xF26B465B, + 0xE935B48E, + 0x451E68D1, + 0x6F1118F2, + 0xB32B4C28, + 0x608749ED}; + + uint32_t ecc_seed[] = {0x8FA8541C, + 0x82A392CA, + 0x74F23ED1, + 0xDBFD7354, + 0x1C596639, + 0x1B97EA73, + 0xD744B0E3, + 0x4B9DF59E, + 0xD0158063, + 0xE39C09A5, + 0xA055371E, + 0xDF7A5441}; + + uint32_t ecc_nonce[] = {0x1B7EC5E5, + 0x48E8AAA9, + 0x2EC77097, + 0xCA9551C9, + 0x783CE682, + 0xCA18FB1E, + 0xDBD9F1E5, + 0x0BC382DB, + 0x8AB39496, + 0xC8EE423F, + 0x8CA105CB, + 0xBA7B6588}; + + uint32_t ecc_sign_r[] = {0x871E6EA4, + 0xDDC5432C, + 0xDDAA60FD, + 0x7F055472, + 0xD3C4DD41, + 0xA5BFB267, + 0x09E88C31, + 0x1A970935, + 0x99A7C8F5, + 0x5B3974C1, + 0x9E4F5A7B, + 0xFC1DD2AC}; + + uint32_t ecc_sign_s[] = {0x3E5552DE, + 0x6403350E, + 0xE70AD74E, + 0x4B854D2D, + 0xC4126BBF, + 0x9C153A5D, + 0x7A07BD4B, + 0x85D06E45, + 0xF850920E, + 0x898FB7D3, + 0x4F80796D, + 0xAE29365C}; + + + uint32_t ecc_iv[] = {0x3401CEFA, + 0xE20A7376, + 0x49073AC1, + 0xA351E329, + 0x26DB9ED0, + 0xDB6B1CFF, + 0xAB0493DA, + 0xAFB93DDD, + 0xD83EDEA2, + 0x8A803D0D, + 0x003B2633, + 0xB9D0F1BF}; + + uint32_t value_greater_q[]= {0xffffffff, + 0xffffffff, + 0xffffffff, + 0xffffffff, + 0xffffffff, + 0xffffffff, + 0xc7634d81, + 0xf4372ddf, + 0x5b1a0db2, //0x581a0db2, + 0x48b0a77a, + 0xecec196a, + 0xccc52973}; + + uint32_t value_greater_p[]= {0xffffffff, + 0xffffffff, + 0xffffffff, + 0xffffffff, + 0xffffffff, + 0xffffffff, + 0xffffffff, + 0xfffffffe, + 0xffffffff, + 0x0000c000, //0x00000000 + 0x00000000, + 0xffffffff}; + //Call interrupt init + init_interrupts(); + + uint8_t offset; + volatile uint32_t * reg_ptr; + uint8_t privkey_inject_cmd; + + + if(rst_count == 0) { + // wait for ECC to be ready + while((lsu_read_32(CLP_ECC_REG_ECC_STATUS) & ECC_REG_ECC_STATUS_READY_MASK) == 0); + + printf("\n TEST OUT OF RANGE PRIVEKEY ZERO\n"); + reg_ptr = (uint32_t*) CLP_ECC_REG_ECC_PRIVKEY_IN_0; + while (reg_ptr <= (uint32_t*) CLP_ECC_REG_ECC_PRIVKEY_IN_11) { + *reg_ptr++ = 0; + } + + // Enable ECC SIGNING core + printf("\nECC SIGNING\n"); + lsu_write_32(CLP_ECC_REG_ECC_CTRL, ECC_CMD_SIGNING); + + // wait for ECC SIGNING process to be done + wait_for_ecc_intr(); + if ((cptra_intr_rcv.ecc_error == 0)){ + printf("\nECC privkey_input_outofrange 0 error is not detected.\n"); + printf("%c", 0x1); + while(1); + } + + ecc_zeroize(); + //Issue warm reset + rst_count++; + printf("%c",0xf6); + } + else if(rst_count == 1) { + // wait for ECC to be ready + while((lsu_read_32(CLP_ECC_REG_ECC_STATUS) & ECC_REG_ECC_STATUS_READY_MASK) == 0); + + printf("\n TEST OUT OF RANGE PRIVEKEY GREATER q\n"); + reg_ptr = (uint32_t*) CLP_ECC_REG_ECC_PRIVKEY_IN_0; + offset = 0; + while (reg_ptr <= (uint32_t*) CLP_ECC_REG_ECC_PRIVKEY_IN_11) { + *reg_ptr++ = value_greater_q[offset++];; + } + + // Enable ECC SIGNING core + printf("\nECC SIGNING\n"); + lsu_write_32(CLP_ECC_REG_ECC_CTRL, ECC_CMD_SIGNING); + + // wait for ECC SIGNING process to be done + wait_for_ecc_intr(); + if ((cptra_intr_rcv.ecc_error == 0)){ + printf("\nECC privkey_input_outofrange 1 error is not detected.\n"); + printf("%c", 0x1); + while(1); + } + + ecc_zeroize(); + //Issue warm reset + rst_count++; + printf("%c",0xf6); + } + else if(rst_count == 2) { + // wait for ECC to be ready + while((lsu_read_32(CLP_ECC_REG_ECC_STATUS) & ECC_REG_ECC_STATUS_READY_MASK) == 0); + + printf("\n TEST OUT OF RANGE PUBKEY\n"); + // Program ECC PUBKEY_X + reg_ptr = (uint32_t*) CLP_ECC_REG_ECC_PUBKEY_X_0; + offset = 0; + while (reg_ptr <= (uint32_t*) CLP_ECC_REG_ECC_PUBKEY_X_11) { + *reg_ptr++ = value_greater_p[offset++]; + } + + // Program ECC PUBKEY_Y + reg_ptr = (uint32_t*) CLP_ECC_REG_ECC_PUBKEY_Y_0; + offset = 0; + while (reg_ptr <= (uint32_t*) CLP_ECC_REG_ECC_PUBKEY_Y_11) { + *reg_ptr++ = value_greater_p[offset++]; + } + + // Enable ECC VERIFYING core + printf("\nECC VERIFYING\n"); + lsu_write_32(CLP_ECC_REG_ECC_CTRL, ECC_CMD_VERIFYING); + + // wait for ECC SIGNING process to be done + wait_for_ecc_intr(); + if ((cptra_intr_rcv.ecc_error == 0)){ + printf("\nECC pubkey_input_outofrange error is not detected.\n"); + printf("%c", 0x1); + while(1); + } + + ecc_zeroize(); + //Issue warm reset + rst_count++; + printf("%c",0xf6); + } + else if(rst_count == 3) { + // wait for ECC to be ready + while((lsu_read_32(CLP_ECC_REG_ECC_STATUS) & ECC_REG_ECC_STATUS_READY_MASK) == 0); + + printf("\n TEST INVALID PUBKEY\n"); + // Program ECC PUBKEY_X + reg_ptr = (uint32_t*) CLP_ECC_REG_ECC_PUBKEY_X_0; + offset = 0; + while (reg_ptr <= (uint32_t*) CLP_ECC_REG_ECC_PUBKEY_X_11) { + *reg_ptr++ = ecc_pubkey_y[offset++]; + } + + // Program ECC PUBKEY_Y + reg_ptr = (uint32_t*) CLP_ECC_REG_ECC_PUBKEY_Y_0; + offset = 0; + while (reg_ptr <= (uint32_t*) CLP_ECC_REG_ECC_PUBKEY_Y_11) { + *reg_ptr++ = ecc_pubkey_x[offset++]; + } + + // Program ECC SIGN_R + reg_ptr = (uint32_t*) CLP_ECC_REG_ECC_SIGN_R_0; + offset = 0; + while (reg_ptr <= (uint32_t*) CLP_ECC_REG_ECC_SIGN_R_11) { + *reg_ptr++ = ecc_sign_r[offset++]; + } + + // Program ECC SIGN_S + reg_ptr = (uint32_t*) CLP_ECC_REG_ECC_SIGN_S_0; + offset = 0; + while (reg_ptr <= (uint32_t*) CLP_ECC_REG_ECC_SIGN_S_11) { + *reg_ptr++ = ecc_sign_s[offset++]; + } + + // Enable ECC VERIFYING core + printf("\nECC VERIFYING\n"); + lsu_write_32(CLP_ECC_REG_ECC_CTRL, ECC_CMD_VERIFYING); + + // wait for ECC SIGNING process to be done + wait_for_ecc_intr(); + if ((cptra_intr_rcv.ecc_error == 0)){ + printf("\nECC pubkey_input_invalid error is not detected.\n"); + printf("%c", 0x1); + while(1); + } + + ecc_zeroize(); + //Issue warm reset + rst_count++; + printf("%c",0xf6); + } + else if(rst_count == 4) { + // wait for ECC to be ready + while((lsu_read_32(CLP_ECC_REG_ECC_STATUS) & ECC_REG_ECC_STATUS_READY_MASK) == 0); + + printf("\n TEST INVALID OUTPUT SIGN_R\n"); + // Program ECC PRIVKEY + reg_ptr = (uint32_t*) CLP_ECC_REG_ECC_PRIVKEY_IN_0; + offset = 0; + while (reg_ptr <= (uint32_t*) CLP_ECC_REG_ECC_PRIVKEY_IN_11) { + *reg_ptr++ = ecc_privkey[offset++]; + } + + // Program ECC MSG + reg_ptr = (uint32_t*) CLP_ECC_REG_ECC_MSG_0; + offset = 0; + while (reg_ptr <= (uint32_t*) CLP_ECC_REG_ECC_MSG_11) { + *reg_ptr++ = ecc_msg[offset++]; + } + + // Program ECC IV + reg_ptr = (uint32_t*) CLP_ECC_REG_ECC_IV_0; + offset = 0; + while (reg_ptr <= (uint32_t*) CLP_ECC_REG_ECC_IV_11) { + *reg_ptr++ = ecc_iv[offset++]; + } + + //Inject invalid zero sign_r + printf("%c",0x98); + + // Enable ECC SIGNING core + printf("\nECC SIGNING\n"); + lsu_write_32(CLP_ECC_REG_ECC_CTRL, ECC_CMD_SIGNING); + + // wait for ECC SIGNING process to be done + wait_for_ecc_intr(); + if ((cptra_intr_rcv.ecc_error == 0)){ + printf("\nECC r_output_outofrange error is not detected.\n"); + printf("%c", 0x1); + while(1); + } + + ecc_zeroize(); + //Issue warm reset + rst_count++; + printf("%c",0xf6); + } + else if(rst_count == 5) { + // wait for ECC to be ready + while((lsu_read_32(CLP_ECC_REG_ECC_STATUS) & ECC_REG_ECC_STATUS_READY_MASK) == 0); + + printf("\n TEST OUT OF RANGE INPUT R/S\n"); + // Program ECC SIGN_R + reg_ptr = (uint32_t*) CLP_ECC_REG_ECC_SIGN_R_0; + offset = 0; + while (reg_ptr <= (uint32_t*) CLP_ECC_REG_ECC_SIGN_R_11) { + *reg_ptr++ = value_greater_q[offset++]; + } + + // Program ECC SIGN_S + reg_ptr = (uint32_t*) CLP_ECC_REG_ECC_SIGN_S_0; + while (reg_ptr <= (uint32_t*) CLP_ECC_REG_ECC_SIGN_S_11) { + *reg_ptr++ = 0; + } + + // Enable ECC VERIFYING core + printf("\nECC VERIFYING\n"); + lsu_write_32(CLP_ECC_REG_ECC_CTRL, ECC_CMD_VERIFYING); + + // wait for ECC SIGNING process to be done + wait_for_ecc_intr(); + if ((cptra_intr_rcv.ecc_error == 0)){ + printf("\nECC r/s_input_outofrange error is not detected.\n"); + printf("%c", 0x1); + while(1); + } + + ecc_zeroize(); + //Issue warm reset + rst_count++; + printf("%c",0xf6); + } + else if(rst_count == 6) { + // wait for ECC to be ready + while((lsu_read_32(CLP_ECC_REG_ECC_STATUS) & ECC_REG_ECC_STATUS_READY_MASK) == 0); + + printf("\n TEST PCR WITH INVALID OUTPUT SIGN_R\n"); + + // Program ECC IV + reg_ptr = (uint32_t*) CLP_ECC_REG_ECC_IV_0; + offset = 0; + while (reg_ptr <= (uint32_t*) CLP_ECC_REG_ECC_IV_11) { + *reg_ptr++ = ecc_iv[offset++]; + } + + //Inject invalid zero sign_r + printf("%c",0x98); + + //inject seed to kv key reg (in RTL) + printf("Inject PRIVKEY into KV slot 7\n"); + privkey_inject_cmd = 0x88 + 0x7; + printf("%c", privkey_inject_cmd); + + printf("Inject MSG into SHA512 digest\n"); + printf("%c", 0x90); + + // Enable ECC PCR SIGNING core + printf("\nECC PCR SIGNING\n"); + lsu_write_32(CLP_ECC_REG_ECC_CTRL, ECC_CMD_SIGNING | + ((1 << ECC_REG_ECC_CTRL_PCR_SIGN_LOW) & ECC_REG_ECC_CTRL_PCR_SIGN_MASK)); + + + // wait for ECC PCR SIGNING process to be done + wait_for_ecc_intr(); + if ((cptra_intr_rcv.ecc_error == 0)){ + printf("\nECC PCR r_output_outofrange error is not detected.\n"); + printf("%c", 0x1); + while(1); + } + + ecc_zeroize(); + //Issue warm reset + rst_count++; + printf("%c",0xf6); + } + else if(rst_count == 7) { + // wait for ECC to be ready + while((lsu_read_32(CLP_ECC_REG_ECC_STATUS) & ECC_REG_ECC_STATUS_READY_MASK) == 0); + + printf("\n TEST PCR WITH INVALID INPUT COMMAND\n"); + + // Program ECC IV + reg_ptr = (uint32_t*) CLP_ECC_REG_ECC_IV_0; + offset = 0; + while (reg_ptr <= (uint32_t*) CLP_ECC_REG_ECC_IV_11) { + *reg_ptr++ = ecc_iv[offset++]; + } + + //inject seed to kv key reg (in RTL) + printf("Inject PRIVKEY into KV slot 7\n"); + privkey_inject_cmd = 0x88 + 0x7; + printf("%c", privkey_inject_cmd); + + printf("Inject MSG into SHA512 digest\n"); + printf("%c", 0x90); + + // Enable ECC PCR KEYGEN core + printf("\nECC PCR KEYGEN\n"); + lsu_write_32(CLP_ECC_REG_ECC_CTRL, ECC_CMD_KEYGEN | + ((1 << ECC_REG_ECC_CTRL_PCR_SIGN_LOW) & ECC_REG_ECC_CTRL_PCR_SIGN_MASK)); + + + // wait for ECC KEYGEN process to be done + wait_for_ecc_intr(); + if ((cptra_intr_rcv.ecc_error == 0)){ + printf("\nECC PCR invalid command error is not detected.\n"); + printf("%c", 0x1); + while(1); + } + + ecc_zeroize(); + //Issue warm reset + rst_count++; + printf("%c",0xf6); + } + else if(rst_count == 8) { + // wait for ECC to be ready + while((lsu_read_32(CLP_ECC_REG_ECC_STATUS) & ECC_REG_ECC_STATUS_READY_MASK) == 0); + + printf("\n TEST PCR WITH INVALID INPUT COMMAND\n"); + + // Program ECC IV + reg_ptr = (uint32_t*) CLP_ECC_REG_ECC_IV_0; + offset = 0; + while (reg_ptr <= (uint32_t*) CLP_ECC_REG_ECC_IV_11) { + *reg_ptr++ = ecc_iv[offset++]; + } + + //inject seed to kv key reg (in RTL) + printf("Inject PRIVKEY into KV slot 7\n"); + privkey_inject_cmd = 0x88 + 0x7; + printf("%c", privkey_inject_cmd); + + printf("Inject MSG into SHA512 digest\n"); + printf("%c", 0x90); + + // Enable ECC PCR VERIFYING core + printf("\nECC PCR VERIFYING\n"); + lsu_write_32(CLP_ECC_REG_ECC_CTRL, ECC_CMD_VERIFYING | + ((1 << ECC_REG_ECC_CTRL_PCR_SIGN_LOW) & ECC_REG_ECC_CTRL_PCR_SIGN_MASK)); + + + // wait for ECC VERIFYING process to be done + wait_for_ecc_intr(); + if ((cptra_intr_rcv.ecc_error == 0)){ + printf("\nECC PCR invalid command error is not detected.\n"); + printf("%c", 0x1); + while(1); + } + + ecc_zeroize(); + } + + printf("%c",0xff); //End the test + +} + + diff --git a/src/integration/test_suites/smoke_test_ecc_errortrigger/smoke_test_ecc_errortrigger.yml b/src/integration/test_suites/smoke_test_ecc_errortrigger/smoke_test_ecc_errortrigger.yml new file mode 100644 index 000000000..f3f9a3a52 --- /dev/null +++ b/src/integration/test_suites/smoke_test_ecc_errortrigger/smoke_test_ecc_errortrigger.yml @@ -0,0 +1,3 @@ +--- +seed: 1 +testname: smoke_test_ecc_errortrigger \ No newline at end of file diff --git a/src/integration/test_suites/smoke_test_fw_kv_backtoback_hmac/caliptra_isr.h b/src/integration/test_suites/smoke_test_fw_kv_backtoback_hmac/caliptra_isr.h new file mode 100644 index 000000000..8f5779e04 --- /dev/null +++ b/src/integration/test_suites/smoke_test_fw_kv_backtoback_hmac/caliptra_isr.h @@ -0,0 +1,247 @@ +// SPDX-License-Identifier: Apache-2.0 +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// --------------------------------------------------------------------- +// File: caliptra_isr.h +// Description: +// Provides function declarations for use by external test files, so +// that the ISR functionality may behave like a library. +// TODO: +// This header file includes inline function definitions for event and +// test specific interrupt service behavior, so it should be copied and +// modified for each test. +// --------------------------------------------------------------------- + +#ifndef CALIPTRA_ISR_H + #define CALIPTRA_ISR_H + +#define EN_ISR_PRINTS 1 + +#include "caliptra_defines.h" +#include +#include "printf.h" + +/* --------------- symbols/typedefs --------------- */ +typedef struct { + uint32_t doe_error; + uint32_t doe_notif; + uint32_t ecc_error; + uint32_t ecc_notif; + uint32_t hmac_error; + uint32_t hmac_notif; + uint32_t kv_error; + uint32_t kv_notif; + uint32_t sha512_error; + uint32_t sha512_notif; + uint32_t sha256_error; + uint32_t sha256_notif; + uint32_t qspi_error; + uint32_t qspi_notif; + uint32_t uart_error; + uint32_t uart_notif; + uint32_t i3c_error; + uint32_t i3c_notif; + uint32_t soc_ifc_error; + uint32_t soc_ifc_notif; + uint32_t sha512_acc_error; + uint32_t sha512_acc_notif; +} caliptra_intr_received_s; +extern volatile caliptra_intr_received_s cptra_intr_rcv; + +////////////////////////////////////////////////////////////////////////////// +// Function Declarations +// + +// Performs all the CSR setup to configure and enable vectored external interrupts +void init_interrupts(void); + +// These inline functions are used to insert event-specific functionality into the +// otherwise generic ISR that gets laid down by the parameterized macro "nonstd_veer_isr" +inline void service_doe_error_intr() {return;} +inline void service_doe_notif_intr() { + uint32_t * reg = (uint32_t *) (CLP_DOE_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R); + uint32_t sts = *reg; + /* Write 1 to Clear the pending interrupt */ + if (sts & DOE_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK) { + *reg = DOE_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + cptra_intr_rcv.doe_notif |= DOE_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + } + if (sts == 0) { + VPRINTF(ERROR,"bad doe_notif_intr sts:%x\n", sts); + SEND_STDOUT_CTRL(0x1); + while(1); + } +} + +inline void service_ecc_error_intr() {return;} +inline void service_ecc_notif_intr() { + uint32_t * reg = (uint32_t *) (CLP_ECC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R); + uint32_t sts = *reg; + /* Write 1 to Clear the pending interrupt */ + if (sts & ECC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK) { + *reg = ECC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + cptra_intr_rcv.ecc_notif |= ECC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + } + if (sts == 0) { + VPRINTF(ERROR,"bad ecc_notif_intr sts:%x\n", sts); + SEND_STDOUT_CTRL(0x1); + while(1); + } +} + +inline void service_hmac_error_intr() {return;} +inline void service_hmac_notif_intr() { + uint32_t * reg = (uint32_t *) (CLP_HMAC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R); + uint32_t sts = *reg; + /* Write 1 to Clear the pending interrupt */ + if (sts & HMAC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK) { + *reg = HMAC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + cptra_intr_rcv.hmac_notif |= HMAC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + } + if (sts == 0) { + VPRINTF(ERROR,"bad hmac_notif_intr sts:%x\n", sts); + SEND_STDOUT_CTRL(0x1); + while(1); + } +} + +inline void service_kv_error_intr() {return;} +inline void service_kv_notif_intr() {return;} +inline void service_sha512_error_intr() {return;} +inline void service_sha512_notif_intr() { + uint32_t * reg = (uint32_t *) (CLP_SHA512_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R); + uint32_t sts = *reg; + /* Write 1 to Clear the pending interrupt */ + if (sts & SHA512_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK) { + *reg = SHA512_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + cptra_intr_rcv.sha512_notif |= SHA512_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + } + if (sts == 0) { + VPRINTF(ERROR,"bad sha512_notif_intr sts:%x\n", sts); + SEND_STDOUT_CTRL(0x1); + while(1); + } +} + +inline void service_sha256_error_intr() {return;} +inline void service_sha256_notif_intr() { + uint32_t * reg = (uint32_t *) (CLP_SHA256_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R); + uint32_t sts = *reg; + /* Write 1 to Clear the pending interrupt */ + if (sts & SHA256_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK) { + *reg = SHA256_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + cptra_intr_rcv.sha256_notif |= SHA256_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + } + if (sts == 0) { + VPRINTF(ERROR,"bad sha256_notif_intr sts:%x\n", sts); + SEND_STDOUT_CTRL(0x1); + while(1); + } +} + +inline void service_qspi_error_intr() {return;} +inline void service_qspi_notif_intr() {return;} +inline void service_uart_error_intr() {return;} +inline void service_uart_notif_intr() {return;} +inline void service_i3c_error_intr() {return;} +inline void service_i3c_notif_intr() {return;} + +inline void service_soc_ifc_error_intr() { + uint32_t * reg = (uint32_t *) (CLP_SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R); + uint32_t sts = *reg; + /* Write 1 to Clear the pending interrupt */ + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_INTERNAL_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_INTERNAL_STS_MASK; + cptra_intr_rcv.soc_ifc_error |= SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_INTERNAL_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_INV_DEV_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_INV_DEV_STS_MASK; + cptra_intr_rcv.soc_ifc_error |= SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_INV_DEV_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_CMD_FAIL_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_CMD_FAIL_STS_MASK; + cptra_intr_rcv.soc_ifc_error |= SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_CMD_FAIL_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_BAD_FUSE_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_BAD_FUSE_STS_MASK; + cptra_intr_rcv.soc_ifc_error |= SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_BAD_FUSE_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_ICCM_BLOCKED_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_ICCM_BLOCKED_STS_MASK; + cptra_intr_rcv.soc_ifc_error |= SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_ICCM_BLOCKED_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_MBOX_ECC_UNC_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_MBOX_ECC_UNC_STS_MASK; + cptra_intr_rcv.soc_ifc_error |= SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_MBOX_ECC_UNC_STS_MASK; + } + if (sts == 0) { + VPRINTF(ERROR,"bad soc_ifc_error_intr sts:%x\n", sts); + SEND_STDOUT_CTRL(0x1); + while(1); + } +} + +inline void service_soc_ifc_notif_intr () { + uint32_t * reg = (uint32_t *) (CLP_SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R); + uint32_t sts = *reg; + /* Write 1 to Clear the pending interrupt */ + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_AVAIL_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_AVAIL_STS_MASK; + cptra_intr_rcv.soc_ifc_notif |= SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_AVAIL_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_MBOX_ECC_COR_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_MBOX_ECC_COR_STS_MASK; + cptra_intr_rcv.soc_ifc_notif |= SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_MBOX_ECC_COR_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_DEBUG_LOCKED_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_DEBUG_LOCKED_STS_MASK; + cptra_intr_rcv.soc_ifc_notif |= SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_DEBUG_LOCKED_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_SCAN_MODE_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_SCAN_MODE_STS_MASK; + cptra_intr_rcv.soc_ifc_notif |= SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_SCAN_MODE_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_SOC_REQ_LOCK_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_SOC_REQ_LOCK_STS_MASK; + cptra_intr_rcv.soc_ifc_notif |= SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_SOC_REQ_LOCK_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_GEN_IN_TOGGLE_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_GEN_IN_TOGGLE_STS_MASK; + cptra_intr_rcv.soc_ifc_notif |= SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_GEN_IN_TOGGLE_STS_MASK; + } + if (sts == 0) { + VPRINTF(ERROR,"bad soc_ifc_notif_intr sts:%x\n", sts); + SEND_STDOUT_CTRL(0x1); + while(1); + } +} + +inline void service_sha512_acc_error_intr() {return;} +inline void service_sha512_acc_notif_intr() { + uint32_t * reg = (uint32_t *) (CLP_SHA512_ACC_CSR_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R); + uint32_t sts = *reg; + /* Write 1 to Clear the pending interrupt */ + if (sts & SHA512_ACC_CSR_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK) { + *reg = SHA512_ACC_CSR_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + cptra_intr_rcv.sha512_acc_notif |= SHA512_ACC_CSR_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + } + if (sts == 0) { + VPRINTF(ERROR,"bad sha512_acc_notif_intr sts:%x\n", sts); + SEND_STDOUT_CTRL(0x1); + while(1); + } +} + + +#endif //CALIPTRA_ISR_H diff --git a/src/integration/test_suites/smoke_test_fw_kv_backtoback_hmac/smoke_test_fw_kv_backtoback_hmac.c b/src/integration/test_suites/smoke_test_fw_kv_backtoback_hmac/smoke_test_fw_kv_backtoback_hmac.c new file mode 100644 index 000000000..8b2cc5203 --- /dev/null +++ b/src/integration/test_suites/smoke_test_fw_kv_backtoback_hmac/smoke_test_fw_kv_backtoback_hmac.c @@ -0,0 +1,221 @@ +// SPDX-License-Identifier: Apache-2.0 +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +#include "caliptra_defines.h" +#include "caliptra_isr.h" +#include "riscv_hw_if.h" +#include "riscv-csr.h" +#include +#include +#include +#include "printf.h" +#include "hmac.h" + +volatile char* stdout = (char *)STDOUT; +volatile uint32_t intr_count = 0; + +#ifdef CPT_VERBOSITY + enum printf_verbosity verbosity_g = CPT_VERBOSITY; +#else + enum printf_verbosity verbosity_g = LOW; +#endif + +volatile caliptra_intr_received_s cptra_intr_rcv = { + .doe_error = 0, + .doe_notif = 0, + .ecc_error = 0, + .ecc_notif = 0, + .hmac_error = 0, + .hmac_notif = 0, + .kv_error = 0, + .kv_notif = 0, + .sha512_error = 0, + .sha512_notif = 0, + .sha256_error = 0, + .sha256_notif = 0, + .qspi_error = 0, + .qspi_notif = 0, + .uart_error = 0, + .uart_notif = 0, + .i3c_error = 0, + .i3c_notif = 0, + .soc_ifc_error = 0, + .soc_ifc_notif = 0, + .sha512_acc_error = 0, + .sha512_acc_notif = 0, +}; + + +/* HMAC384 test vector + KEY = 0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b + BLOCK = 4869205468657265800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000440 + LFSR_SEED = C8F518D4F3AA1BD46ED56C1C3C9E16FB800AF504 + TAG = b6a8d5636f5c6a7224f9977dcf7ee6c7fb6d0c48cbdee9737a959796489bddbc4c5df61d5b3297b4fb68dab9f1b582c2 +*/ + + + + +void main() { + printf("----------------------------------\n"); + printf(" Smoke Test With FW HMAC after KV flow !!\n"); + printf("----------------------------------\n"); + + //Call interrupt init + init_interrupts(); + + uint8_t offset; + volatile uint32_t * reg_ptr; + + uint32_t block[32] = {0x48692054, + 0x68657265, + 0x80000000, + 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, + 0x00000440}; + + //this is a random lfsr_seed 160-bit + uint32_t lfsr_seed_data[5] = {0xC8F518D4, + 0xF3AA1BD4, + 0x6ED56C1C, + 0x3C9E16FB, + 0x800AF504}; + + uint32_t expected_tag[12] = {0xb6a8d563, + 0x6f5c6a72, + 0x24f9977d, + 0xcf7ee6c7, + 0xfb6d0c48, + 0xcbdee973, + 0x7a959796, + 0x489bddbc, + 0x4c5df61d, + 0x5b3297b4, + 0xfb68dab9, + 0xf1b582c2}; + + uint32_t tag_zerokey_zeroblock[12] = + {0x6E120BA2, + 0x27BF3557, + 0x676B0256, + 0x136302D7, + 0xD544B868, + 0x080BED15, + 0xF7D59AB1, + 0x1185C79F, + 0x44A39E4F, + 0x440810F9, + 0x7F419C17, + 0xD6DB7E92}; + + uint8_t hmackey_kv_id = 0x2; + uint8_t hmacblock_kv_id = 0x1; + uint8_t store_to_kv = 0x1; + uint8_t tag_kv_id = 0x0; + + hmac_io hmac_key; + hmac_io hmac_block; + hmac_io hmac_lfsr_seed; + hmac_io hmac_tag; + + hmac_key.kv_intf = TRUE; + hmac_key.kv_id = hmackey_kv_id; + + hmac_block.kv_intf = FALSE; + hmac_block.kv_id = hmacblock_kv_id; + hmac_block.data_size = 32; + for (int i = 0; i < hmac_block.data_size; i++) + hmac_block.data[i] = block[i]; + + hmac_lfsr_seed.kv_intf = FALSE; + hmac_lfsr_seed.data_size = 5; + for (int i = 0; i < hmac_lfsr_seed.data_size; i++) + hmac_lfsr_seed.data[i] = lfsr_seed_data[i]; + + hmac_tag.kv_intf = TRUE; + hmac_tag.kv_id = tag_kv_id; + hmac_tag.data_size = 12; + for (int i = 0; i < hmac_tag.data_size; i++) + hmac_tag.data[i] = expected_tag[i]; + + + //inject hmac_key to kv key reg (in RTL) + uint8_t key_inject_cmd = 0xa0 + (hmac_key.kv_id & 0x7); + printf("%c", key_inject_cmd); + + hmac_flow(hmac_key, hmac_block, hmac_lfsr_seed, hmac_tag); + + printf("KV HMAC flow is completed.\n\n"); + + /* + Start FW HMAC without injecting the key/block + + The expected result is doing HMAC with zero key + and zero block since all values should be cleared + after KV flow. + */ + printf("Start FW HMAC\n"); + // Enable HMAC core with next command to avoid changing the key + lsu_write_32(CLP_HMAC_REG_HMAC384_CTRL, HMAC_REG_HMAC384_CTRL_NEXT_MASK); + + // wait for HMAC process to be done + wait_for_hmac_intr(); + + printf("Load TAG from FW HMAC\n"); + reg_ptr = (uint32_t *) CLP_HMAC_REG_HMAC384_TAG_0; + offset = 0; + while (reg_ptr <= (uint32_t*) CLP_HMAC_REG_HMAC384_TAG_11) { + if (tag_zerokey_zeroblock[offset] != *reg_ptr) { + printf("At offset [%d], hmac_tag data mismatch!\n", offset); + printf("Actual data: 0x%x\n", *reg_ptr); + printf("Expected data: 0x%x\n", tag_zerokey_zeroblock[offset]); + printf("%c", 0x1); //fail_cmd + while(1); + } + reg_ptr++; + offset++; + } + + hmac_zeroize(); + + printf("%c",0xff); //End the test + +} diff --git a/src/integration/test_suites/smoke_test_fw_kv_backtoback_hmac/smoke_test_fw_kv_backtoback_hmac.yml b/src/integration/test_suites/smoke_test_fw_kv_backtoback_hmac/smoke_test_fw_kv_backtoback_hmac.yml new file mode 100644 index 000000000..09f5d5322 --- /dev/null +++ b/src/integration/test_suites/smoke_test_fw_kv_backtoback_hmac/smoke_test_fw_kv_backtoback_hmac.yml @@ -0,0 +1,17 @@ +# SPDX-License-Identifier: Apache-2.0 +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +--- +seed: 1 +testname: smoke_test_fw_kv_backtoback_hmac \ No newline at end of file diff --git a/src/integration/test_suites/smoke_test_hmac/caliptra_isr.h b/src/integration/test_suites/smoke_test_hmac/caliptra_isr.h index 6ffd71c0a..8f5779e04 100644 --- a/src/integration/test_suites/smoke_test_hmac/caliptra_isr.h +++ b/src/integration/test_suites/smoke_test_hmac/caliptra_isr.h @@ -204,6 +204,22 @@ inline void service_soc_ifc_notif_intr () { *reg = SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_MBOX_ECC_COR_STS_MASK; cptra_intr_rcv.soc_ifc_notif |= SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_MBOX_ECC_COR_STS_MASK; } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_DEBUG_LOCKED_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_DEBUG_LOCKED_STS_MASK; + cptra_intr_rcv.soc_ifc_notif |= SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_DEBUG_LOCKED_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_SCAN_MODE_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_SCAN_MODE_STS_MASK; + cptra_intr_rcv.soc_ifc_notif |= SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_SCAN_MODE_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_SOC_REQ_LOCK_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_SOC_REQ_LOCK_STS_MASK; + cptra_intr_rcv.soc_ifc_notif |= SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_SOC_REQ_LOCK_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_GEN_IN_TOGGLE_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_GEN_IN_TOGGLE_STS_MASK; + cptra_intr_rcv.soc_ifc_notif |= SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_GEN_IN_TOGGLE_STS_MASK; + } if (sts == 0) { VPRINTF(ERROR,"bad soc_ifc_notif_intr sts:%x\n", sts); SEND_STDOUT_CTRL(0x1); diff --git a/src/integration/test_suites/smoke_test_iccm_reset/caliptra_isr.h b/src/integration/test_suites/smoke_test_iccm_reset/caliptra_isr.h new file mode 100644 index 000000000..8f5779e04 --- /dev/null +++ b/src/integration/test_suites/smoke_test_iccm_reset/caliptra_isr.h @@ -0,0 +1,247 @@ +// SPDX-License-Identifier: Apache-2.0 +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// --------------------------------------------------------------------- +// File: caliptra_isr.h +// Description: +// Provides function declarations for use by external test files, so +// that the ISR functionality may behave like a library. +// TODO: +// This header file includes inline function definitions for event and +// test specific interrupt service behavior, so it should be copied and +// modified for each test. +// --------------------------------------------------------------------- + +#ifndef CALIPTRA_ISR_H + #define CALIPTRA_ISR_H + +#define EN_ISR_PRINTS 1 + +#include "caliptra_defines.h" +#include +#include "printf.h" + +/* --------------- symbols/typedefs --------------- */ +typedef struct { + uint32_t doe_error; + uint32_t doe_notif; + uint32_t ecc_error; + uint32_t ecc_notif; + uint32_t hmac_error; + uint32_t hmac_notif; + uint32_t kv_error; + uint32_t kv_notif; + uint32_t sha512_error; + uint32_t sha512_notif; + uint32_t sha256_error; + uint32_t sha256_notif; + uint32_t qspi_error; + uint32_t qspi_notif; + uint32_t uart_error; + uint32_t uart_notif; + uint32_t i3c_error; + uint32_t i3c_notif; + uint32_t soc_ifc_error; + uint32_t soc_ifc_notif; + uint32_t sha512_acc_error; + uint32_t sha512_acc_notif; +} caliptra_intr_received_s; +extern volatile caliptra_intr_received_s cptra_intr_rcv; + +////////////////////////////////////////////////////////////////////////////// +// Function Declarations +// + +// Performs all the CSR setup to configure and enable vectored external interrupts +void init_interrupts(void); + +// These inline functions are used to insert event-specific functionality into the +// otherwise generic ISR that gets laid down by the parameterized macro "nonstd_veer_isr" +inline void service_doe_error_intr() {return;} +inline void service_doe_notif_intr() { + uint32_t * reg = (uint32_t *) (CLP_DOE_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R); + uint32_t sts = *reg; + /* Write 1 to Clear the pending interrupt */ + if (sts & DOE_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK) { + *reg = DOE_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + cptra_intr_rcv.doe_notif |= DOE_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + } + if (sts == 0) { + VPRINTF(ERROR,"bad doe_notif_intr sts:%x\n", sts); + SEND_STDOUT_CTRL(0x1); + while(1); + } +} + +inline void service_ecc_error_intr() {return;} +inline void service_ecc_notif_intr() { + uint32_t * reg = (uint32_t *) (CLP_ECC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R); + uint32_t sts = *reg; + /* Write 1 to Clear the pending interrupt */ + if (sts & ECC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK) { + *reg = ECC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + cptra_intr_rcv.ecc_notif |= ECC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + } + if (sts == 0) { + VPRINTF(ERROR,"bad ecc_notif_intr sts:%x\n", sts); + SEND_STDOUT_CTRL(0x1); + while(1); + } +} + +inline void service_hmac_error_intr() {return;} +inline void service_hmac_notif_intr() { + uint32_t * reg = (uint32_t *) (CLP_HMAC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R); + uint32_t sts = *reg; + /* Write 1 to Clear the pending interrupt */ + if (sts & HMAC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK) { + *reg = HMAC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + cptra_intr_rcv.hmac_notif |= HMAC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + } + if (sts == 0) { + VPRINTF(ERROR,"bad hmac_notif_intr sts:%x\n", sts); + SEND_STDOUT_CTRL(0x1); + while(1); + } +} + +inline void service_kv_error_intr() {return;} +inline void service_kv_notif_intr() {return;} +inline void service_sha512_error_intr() {return;} +inline void service_sha512_notif_intr() { + uint32_t * reg = (uint32_t *) (CLP_SHA512_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R); + uint32_t sts = *reg; + /* Write 1 to Clear the pending interrupt */ + if (sts & SHA512_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK) { + *reg = SHA512_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + cptra_intr_rcv.sha512_notif |= SHA512_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + } + if (sts == 0) { + VPRINTF(ERROR,"bad sha512_notif_intr sts:%x\n", sts); + SEND_STDOUT_CTRL(0x1); + while(1); + } +} + +inline void service_sha256_error_intr() {return;} +inline void service_sha256_notif_intr() { + uint32_t * reg = (uint32_t *) (CLP_SHA256_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R); + uint32_t sts = *reg; + /* Write 1 to Clear the pending interrupt */ + if (sts & SHA256_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK) { + *reg = SHA256_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + cptra_intr_rcv.sha256_notif |= SHA256_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + } + if (sts == 0) { + VPRINTF(ERROR,"bad sha256_notif_intr sts:%x\n", sts); + SEND_STDOUT_CTRL(0x1); + while(1); + } +} + +inline void service_qspi_error_intr() {return;} +inline void service_qspi_notif_intr() {return;} +inline void service_uart_error_intr() {return;} +inline void service_uart_notif_intr() {return;} +inline void service_i3c_error_intr() {return;} +inline void service_i3c_notif_intr() {return;} + +inline void service_soc_ifc_error_intr() { + uint32_t * reg = (uint32_t *) (CLP_SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R); + uint32_t sts = *reg; + /* Write 1 to Clear the pending interrupt */ + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_INTERNAL_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_INTERNAL_STS_MASK; + cptra_intr_rcv.soc_ifc_error |= SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_INTERNAL_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_INV_DEV_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_INV_DEV_STS_MASK; + cptra_intr_rcv.soc_ifc_error |= SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_INV_DEV_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_CMD_FAIL_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_CMD_FAIL_STS_MASK; + cptra_intr_rcv.soc_ifc_error |= SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_CMD_FAIL_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_BAD_FUSE_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_BAD_FUSE_STS_MASK; + cptra_intr_rcv.soc_ifc_error |= SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_BAD_FUSE_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_ICCM_BLOCKED_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_ICCM_BLOCKED_STS_MASK; + cptra_intr_rcv.soc_ifc_error |= SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_ICCM_BLOCKED_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_MBOX_ECC_UNC_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_MBOX_ECC_UNC_STS_MASK; + cptra_intr_rcv.soc_ifc_error |= SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_MBOX_ECC_UNC_STS_MASK; + } + if (sts == 0) { + VPRINTF(ERROR,"bad soc_ifc_error_intr sts:%x\n", sts); + SEND_STDOUT_CTRL(0x1); + while(1); + } +} + +inline void service_soc_ifc_notif_intr () { + uint32_t * reg = (uint32_t *) (CLP_SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R); + uint32_t sts = *reg; + /* Write 1 to Clear the pending interrupt */ + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_AVAIL_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_AVAIL_STS_MASK; + cptra_intr_rcv.soc_ifc_notif |= SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_AVAIL_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_MBOX_ECC_COR_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_MBOX_ECC_COR_STS_MASK; + cptra_intr_rcv.soc_ifc_notif |= SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_MBOX_ECC_COR_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_DEBUG_LOCKED_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_DEBUG_LOCKED_STS_MASK; + cptra_intr_rcv.soc_ifc_notif |= SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_DEBUG_LOCKED_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_SCAN_MODE_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_SCAN_MODE_STS_MASK; + cptra_intr_rcv.soc_ifc_notif |= SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_SCAN_MODE_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_SOC_REQ_LOCK_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_SOC_REQ_LOCK_STS_MASK; + cptra_intr_rcv.soc_ifc_notif |= SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_SOC_REQ_LOCK_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_GEN_IN_TOGGLE_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_GEN_IN_TOGGLE_STS_MASK; + cptra_intr_rcv.soc_ifc_notif |= SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_GEN_IN_TOGGLE_STS_MASK; + } + if (sts == 0) { + VPRINTF(ERROR,"bad soc_ifc_notif_intr sts:%x\n", sts); + SEND_STDOUT_CTRL(0x1); + while(1); + } +} + +inline void service_sha512_acc_error_intr() {return;} +inline void service_sha512_acc_notif_intr() { + uint32_t * reg = (uint32_t *) (CLP_SHA512_ACC_CSR_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R); + uint32_t sts = *reg; + /* Write 1 to Clear the pending interrupt */ + if (sts & SHA512_ACC_CSR_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK) { + *reg = SHA512_ACC_CSR_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + cptra_intr_rcv.sha512_acc_notif |= SHA512_ACC_CSR_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + } + if (sts == 0) { + VPRINTF(ERROR,"bad sha512_acc_notif_intr sts:%x\n", sts); + SEND_STDOUT_CTRL(0x1); + while(1); + } +} + + +#endif //CALIPTRA_ISR_H diff --git a/src/integration/test_suites/smoke_test_iccm_reset/smoke_test_iccm_reset.c b/src/integration/test_suites/smoke_test_iccm_reset/smoke_test_iccm_reset.c new file mode 100644 index 000000000..c1c3ef473 --- /dev/null +++ b/src/integration/test_suites/smoke_test_iccm_reset/smoke_test_iccm_reset.c @@ -0,0 +1,120 @@ +// SPDX-License-Identifier: Apache-2.0 +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +#include "caliptra_defines.h" +#include "caliptra_isr.h" +#include "riscv-csr.h" +#include +#include +#include "printf.h" + +volatile char* stdout = (char *)STDOUT; +volatile uint32_t intr_count = 0; +volatile uint32_t rst_count __attribute__((section(".dccm.persistent"))) = 0; +volatile uint32_t iter __attribute__((section(".dccm.persistent"))) = 0; +#ifdef CPT_VERBOSITY + enum printf_verbosity verbosity_g = CPT_VERBOSITY; +#else + enum printf_verbosity verbosity_g = LOW; +#endif + +volatile caliptra_intr_received_s cptra_intr_rcv = { + .doe_error = 0, + .doe_notif = 0, + .ecc_error = 0, + .ecc_notif = 0, + .hmac_error = 0, + .hmac_notif = 0, + .kv_error = 0, + .kv_notif = 0, + .sha512_error = 0, + .sha512_notif = 0, + .sha256_error = 0, + .sha256_notif = 0, + .qspi_error = 0, + .qspi_notif = 0, + .uart_error = 0, + .uart_notif = 0, + .i3c_error = 0, + .i3c_notif = 0, + .soc_ifc_error = 0, + .soc_ifc_notif = 0, + .sha512_acc_error = 0, + .sha512_acc_notif = 0, +}; + +extern uintptr_t iccm_code0_start, iccm_code0_end; +volatile uint32_t * soc_ifc_fw_update_reset = (uint32_t *) (CLP_SOC_IFC_REG_INTERNAL_FW_UPDATE_RESET); +void exec_iccm (void) __attribute__ ((aligned(4),section (".data_iccm0"))); + +void main() { + uint32_t * ICCM = (uint32_t *) RV_ICCM_SADR; + uint32_t * code_word = 0; + uint32_t * iccm_dest = ICCM; + void (* iccm_fn) (void) = (void*) ICCM; + VPRINTF(LOW,"---------------------------\n"); + VPRINTF(LOW," Smoke test ICCM/DCCM + reset !!\n"); + VPRINTF(LOW,"---------------------------\n"); + + rst_count++; + + //Call interrupt init + init_interrupts(); + if(rst_count == 1) { + + code_word = (uint32_t *) &iccm_code0_start; + VPRINTF(LOW, "Copying code from %x [through %x] to %x\n", (uintptr_t) code_word, &iccm_code0_end, (uintptr_t) iccm_dest); + while (code_word < (uint32_t *) &iccm_code0_end) { + VPRINTF(ALL, "at %x: %x\n", (uintptr_t) code_word, *code_word); + *iccm_dest++ = *code_word++; + } + + VPRINTF(LOW, "Execute function from ICCM\n"); + iccm_fn(); + + //Issue warm reset + VPRINTF(LOW, "Issue warm reset\n"); + SEND_STDOUT_CTRL(0xf6); + } + else if(rst_count == 2) { + VPRINTF(LOW, "Execute function from ICCM after warm reset\n"); + iccm_fn(); + + //Issue cold reset + VPRINTF(LOW, "Issue cold reset\n"); + SEND_STDOUT_CTRL(0xf5); + + } + else if(rst_count == 3) { + VPRINTF(LOW, "Execute function from ICCM after cold reset\n"); + iccm_fn(); + + //Issue fw update reset + VPRINTF(LOW, "Issue core only reset\n"); + *soc_ifc_fw_update_reset = SOC_IFC_REG_INTERNAL_FW_UPDATE_RESET_CORE_RST_MASK; + } + else if (rst_count == 4) { + VPRINTF(LOW, "Execute function from ICCM after core reset\n"); + iccm_fn(); + } + + return; +} + +void exec_iccm (void) { + VPRINTF (LOW, "In exec_iccm function, before incrementing = %d\n", iter); + iter++; + VPRINTF (LOW, "In exec_iccm function, after incrementing = %d\n", iter); +} diff --git a/src/integration/test_suites/smoke_test_iccm_reset/smoke_test_iccm_reset.yml b/src/integration/test_suites/smoke_test_iccm_reset/smoke_test_iccm_reset.yml new file mode 100644 index 000000000..206f00d19 --- /dev/null +++ b/src/integration/test_suites/smoke_test_iccm_reset/smoke_test_iccm_reset.yml @@ -0,0 +1,17 @@ +# SPDX-License-Identifier: Apache-2.0 +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +--- +seed: 1 +testname: smoke_test_iccm_reset \ No newline at end of file diff --git a/src/integration/test_suites/smoke_test_kv/caliptra_isr.h b/src/integration/test_suites/smoke_test_kv/caliptra_isr.h new file mode 100644 index 000000000..8f5779e04 --- /dev/null +++ b/src/integration/test_suites/smoke_test_kv/caliptra_isr.h @@ -0,0 +1,247 @@ +// SPDX-License-Identifier: Apache-2.0 +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// --------------------------------------------------------------------- +// File: caliptra_isr.h +// Description: +// Provides function declarations for use by external test files, so +// that the ISR functionality may behave like a library. +// TODO: +// This header file includes inline function definitions for event and +// test specific interrupt service behavior, so it should be copied and +// modified for each test. +// --------------------------------------------------------------------- + +#ifndef CALIPTRA_ISR_H + #define CALIPTRA_ISR_H + +#define EN_ISR_PRINTS 1 + +#include "caliptra_defines.h" +#include +#include "printf.h" + +/* --------------- symbols/typedefs --------------- */ +typedef struct { + uint32_t doe_error; + uint32_t doe_notif; + uint32_t ecc_error; + uint32_t ecc_notif; + uint32_t hmac_error; + uint32_t hmac_notif; + uint32_t kv_error; + uint32_t kv_notif; + uint32_t sha512_error; + uint32_t sha512_notif; + uint32_t sha256_error; + uint32_t sha256_notif; + uint32_t qspi_error; + uint32_t qspi_notif; + uint32_t uart_error; + uint32_t uart_notif; + uint32_t i3c_error; + uint32_t i3c_notif; + uint32_t soc_ifc_error; + uint32_t soc_ifc_notif; + uint32_t sha512_acc_error; + uint32_t sha512_acc_notif; +} caliptra_intr_received_s; +extern volatile caliptra_intr_received_s cptra_intr_rcv; + +////////////////////////////////////////////////////////////////////////////// +// Function Declarations +// + +// Performs all the CSR setup to configure and enable vectored external interrupts +void init_interrupts(void); + +// These inline functions are used to insert event-specific functionality into the +// otherwise generic ISR that gets laid down by the parameterized macro "nonstd_veer_isr" +inline void service_doe_error_intr() {return;} +inline void service_doe_notif_intr() { + uint32_t * reg = (uint32_t *) (CLP_DOE_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R); + uint32_t sts = *reg; + /* Write 1 to Clear the pending interrupt */ + if (sts & DOE_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK) { + *reg = DOE_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + cptra_intr_rcv.doe_notif |= DOE_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + } + if (sts == 0) { + VPRINTF(ERROR,"bad doe_notif_intr sts:%x\n", sts); + SEND_STDOUT_CTRL(0x1); + while(1); + } +} + +inline void service_ecc_error_intr() {return;} +inline void service_ecc_notif_intr() { + uint32_t * reg = (uint32_t *) (CLP_ECC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R); + uint32_t sts = *reg; + /* Write 1 to Clear the pending interrupt */ + if (sts & ECC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK) { + *reg = ECC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + cptra_intr_rcv.ecc_notif |= ECC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + } + if (sts == 0) { + VPRINTF(ERROR,"bad ecc_notif_intr sts:%x\n", sts); + SEND_STDOUT_CTRL(0x1); + while(1); + } +} + +inline void service_hmac_error_intr() {return;} +inline void service_hmac_notif_intr() { + uint32_t * reg = (uint32_t *) (CLP_HMAC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R); + uint32_t sts = *reg; + /* Write 1 to Clear the pending interrupt */ + if (sts & HMAC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK) { + *reg = HMAC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + cptra_intr_rcv.hmac_notif |= HMAC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + } + if (sts == 0) { + VPRINTF(ERROR,"bad hmac_notif_intr sts:%x\n", sts); + SEND_STDOUT_CTRL(0x1); + while(1); + } +} + +inline void service_kv_error_intr() {return;} +inline void service_kv_notif_intr() {return;} +inline void service_sha512_error_intr() {return;} +inline void service_sha512_notif_intr() { + uint32_t * reg = (uint32_t *) (CLP_SHA512_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R); + uint32_t sts = *reg; + /* Write 1 to Clear the pending interrupt */ + if (sts & SHA512_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK) { + *reg = SHA512_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + cptra_intr_rcv.sha512_notif |= SHA512_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + } + if (sts == 0) { + VPRINTF(ERROR,"bad sha512_notif_intr sts:%x\n", sts); + SEND_STDOUT_CTRL(0x1); + while(1); + } +} + +inline void service_sha256_error_intr() {return;} +inline void service_sha256_notif_intr() { + uint32_t * reg = (uint32_t *) (CLP_SHA256_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R); + uint32_t sts = *reg; + /* Write 1 to Clear the pending interrupt */ + if (sts & SHA256_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK) { + *reg = SHA256_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + cptra_intr_rcv.sha256_notif |= SHA256_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + } + if (sts == 0) { + VPRINTF(ERROR,"bad sha256_notif_intr sts:%x\n", sts); + SEND_STDOUT_CTRL(0x1); + while(1); + } +} + +inline void service_qspi_error_intr() {return;} +inline void service_qspi_notif_intr() {return;} +inline void service_uart_error_intr() {return;} +inline void service_uart_notif_intr() {return;} +inline void service_i3c_error_intr() {return;} +inline void service_i3c_notif_intr() {return;} + +inline void service_soc_ifc_error_intr() { + uint32_t * reg = (uint32_t *) (CLP_SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R); + uint32_t sts = *reg; + /* Write 1 to Clear the pending interrupt */ + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_INTERNAL_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_INTERNAL_STS_MASK; + cptra_intr_rcv.soc_ifc_error |= SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_INTERNAL_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_INV_DEV_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_INV_DEV_STS_MASK; + cptra_intr_rcv.soc_ifc_error |= SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_INV_DEV_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_CMD_FAIL_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_CMD_FAIL_STS_MASK; + cptra_intr_rcv.soc_ifc_error |= SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_CMD_FAIL_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_BAD_FUSE_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_BAD_FUSE_STS_MASK; + cptra_intr_rcv.soc_ifc_error |= SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_BAD_FUSE_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_ICCM_BLOCKED_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_ICCM_BLOCKED_STS_MASK; + cptra_intr_rcv.soc_ifc_error |= SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_ICCM_BLOCKED_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_MBOX_ECC_UNC_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_MBOX_ECC_UNC_STS_MASK; + cptra_intr_rcv.soc_ifc_error |= SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_MBOX_ECC_UNC_STS_MASK; + } + if (sts == 0) { + VPRINTF(ERROR,"bad soc_ifc_error_intr sts:%x\n", sts); + SEND_STDOUT_CTRL(0x1); + while(1); + } +} + +inline void service_soc_ifc_notif_intr () { + uint32_t * reg = (uint32_t *) (CLP_SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R); + uint32_t sts = *reg; + /* Write 1 to Clear the pending interrupt */ + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_AVAIL_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_AVAIL_STS_MASK; + cptra_intr_rcv.soc_ifc_notif |= SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_AVAIL_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_MBOX_ECC_COR_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_MBOX_ECC_COR_STS_MASK; + cptra_intr_rcv.soc_ifc_notif |= SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_MBOX_ECC_COR_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_DEBUG_LOCKED_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_DEBUG_LOCKED_STS_MASK; + cptra_intr_rcv.soc_ifc_notif |= SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_DEBUG_LOCKED_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_SCAN_MODE_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_SCAN_MODE_STS_MASK; + cptra_intr_rcv.soc_ifc_notif |= SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_SCAN_MODE_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_SOC_REQ_LOCK_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_SOC_REQ_LOCK_STS_MASK; + cptra_intr_rcv.soc_ifc_notif |= SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_SOC_REQ_LOCK_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_GEN_IN_TOGGLE_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_GEN_IN_TOGGLE_STS_MASK; + cptra_intr_rcv.soc_ifc_notif |= SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_GEN_IN_TOGGLE_STS_MASK; + } + if (sts == 0) { + VPRINTF(ERROR,"bad soc_ifc_notif_intr sts:%x\n", sts); + SEND_STDOUT_CTRL(0x1); + while(1); + } +} + +inline void service_sha512_acc_error_intr() {return;} +inline void service_sha512_acc_notif_intr() { + uint32_t * reg = (uint32_t *) (CLP_SHA512_ACC_CSR_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R); + uint32_t sts = *reg; + /* Write 1 to Clear the pending interrupt */ + if (sts & SHA512_ACC_CSR_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK) { + *reg = SHA512_ACC_CSR_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + cptra_intr_rcv.sha512_acc_notif |= SHA512_ACC_CSR_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + } + if (sts == 0) { + VPRINTF(ERROR,"bad sha512_acc_notif_intr sts:%x\n", sts); + SEND_STDOUT_CTRL(0x1); + while(1); + } +} + + +#endif //CALIPTRA_ISR_H diff --git a/src/integration/test_suites/smoke_test_kv/smoke_test_kv.s b/src/integration/test_suites/smoke_test_kv/smoke_test_kv.s index 9f330c06e..d0261b059 100644 --- a/src/integration/test_suites/smoke_test_kv/smoke_test_kv.s +++ b/src/integration/test_suites/smoke_test_kv/smoke_test_kv.s @@ -252,3 +252,8 @@ hello_world: verbosity_g: .word 2 .global stdout stdout: .word STDOUT +// FW polls this variable for intr +.global intr_count +intr_count: .word 0 +.global cptra_intr_rcv +cptra_intr_rcv: .word 0 diff --git a/src/integration/test_suites/smoke_test_kv_cg/caliptra_isr.h b/src/integration/test_suites/smoke_test_kv_cg/caliptra_isr.h new file mode 100644 index 000000000..8f5779e04 --- /dev/null +++ b/src/integration/test_suites/smoke_test_kv_cg/caliptra_isr.h @@ -0,0 +1,247 @@ +// SPDX-License-Identifier: Apache-2.0 +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// --------------------------------------------------------------------- +// File: caliptra_isr.h +// Description: +// Provides function declarations for use by external test files, so +// that the ISR functionality may behave like a library. +// TODO: +// This header file includes inline function definitions for event and +// test specific interrupt service behavior, so it should be copied and +// modified for each test. +// --------------------------------------------------------------------- + +#ifndef CALIPTRA_ISR_H + #define CALIPTRA_ISR_H + +#define EN_ISR_PRINTS 1 + +#include "caliptra_defines.h" +#include +#include "printf.h" + +/* --------------- symbols/typedefs --------------- */ +typedef struct { + uint32_t doe_error; + uint32_t doe_notif; + uint32_t ecc_error; + uint32_t ecc_notif; + uint32_t hmac_error; + uint32_t hmac_notif; + uint32_t kv_error; + uint32_t kv_notif; + uint32_t sha512_error; + uint32_t sha512_notif; + uint32_t sha256_error; + uint32_t sha256_notif; + uint32_t qspi_error; + uint32_t qspi_notif; + uint32_t uart_error; + uint32_t uart_notif; + uint32_t i3c_error; + uint32_t i3c_notif; + uint32_t soc_ifc_error; + uint32_t soc_ifc_notif; + uint32_t sha512_acc_error; + uint32_t sha512_acc_notif; +} caliptra_intr_received_s; +extern volatile caliptra_intr_received_s cptra_intr_rcv; + +////////////////////////////////////////////////////////////////////////////// +// Function Declarations +// + +// Performs all the CSR setup to configure and enable vectored external interrupts +void init_interrupts(void); + +// These inline functions are used to insert event-specific functionality into the +// otherwise generic ISR that gets laid down by the parameterized macro "nonstd_veer_isr" +inline void service_doe_error_intr() {return;} +inline void service_doe_notif_intr() { + uint32_t * reg = (uint32_t *) (CLP_DOE_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R); + uint32_t sts = *reg; + /* Write 1 to Clear the pending interrupt */ + if (sts & DOE_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK) { + *reg = DOE_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + cptra_intr_rcv.doe_notif |= DOE_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + } + if (sts == 0) { + VPRINTF(ERROR,"bad doe_notif_intr sts:%x\n", sts); + SEND_STDOUT_CTRL(0x1); + while(1); + } +} + +inline void service_ecc_error_intr() {return;} +inline void service_ecc_notif_intr() { + uint32_t * reg = (uint32_t *) (CLP_ECC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R); + uint32_t sts = *reg; + /* Write 1 to Clear the pending interrupt */ + if (sts & ECC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK) { + *reg = ECC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + cptra_intr_rcv.ecc_notif |= ECC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + } + if (sts == 0) { + VPRINTF(ERROR,"bad ecc_notif_intr sts:%x\n", sts); + SEND_STDOUT_CTRL(0x1); + while(1); + } +} + +inline void service_hmac_error_intr() {return;} +inline void service_hmac_notif_intr() { + uint32_t * reg = (uint32_t *) (CLP_HMAC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R); + uint32_t sts = *reg; + /* Write 1 to Clear the pending interrupt */ + if (sts & HMAC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK) { + *reg = HMAC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + cptra_intr_rcv.hmac_notif |= HMAC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + } + if (sts == 0) { + VPRINTF(ERROR,"bad hmac_notif_intr sts:%x\n", sts); + SEND_STDOUT_CTRL(0x1); + while(1); + } +} + +inline void service_kv_error_intr() {return;} +inline void service_kv_notif_intr() {return;} +inline void service_sha512_error_intr() {return;} +inline void service_sha512_notif_intr() { + uint32_t * reg = (uint32_t *) (CLP_SHA512_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R); + uint32_t sts = *reg; + /* Write 1 to Clear the pending interrupt */ + if (sts & SHA512_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK) { + *reg = SHA512_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + cptra_intr_rcv.sha512_notif |= SHA512_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + } + if (sts == 0) { + VPRINTF(ERROR,"bad sha512_notif_intr sts:%x\n", sts); + SEND_STDOUT_CTRL(0x1); + while(1); + } +} + +inline void service_sha256_error_intr() {return;} +inline void service_sha256_notif_intr() { + uint32_t * reg = (uint32_t *) (CLP_SHA256_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R); + uint32_t sts = *reg; + /* Write 1 to Clear the pending interrupt */ + if (sts & SHA256_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK) { + *reg = SHA256_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + cptra_intr_rcv.sha256_notif |= SHA256_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + } + if (sts == 0) { + VPRINTF(ERROR,"bad sha256_notif_intr sts:%x\n", sts); + SEND_STDOUT_CTRL(0x1); + while(1); + } +} + +inline void service_qspi_error_intr() {return;} +inline void service_qspi_notif_intr() {return;} +inline void service_uart_error_intr() {return;} +inline void service_uart_notif_intr() {return;} +inline void service_i3c_error_intr() {return;} +inline void service_i3c_notif_intr() {return;} + +inline void service_soc_ifc_error_intr() { + uint32_t * reg = (uint32_t *) (CLP_SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R); + uint32_t sts = *reg; + /* Write 1 to Clear the pending interrupt */ + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_INTERNAL_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_INTERNAL_STS_MASK; + cptra_intr_rcv.soc_ifc_error |= SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_INTERNAL_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_INV_DEV_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_INV_DEV_STS_MASK; + cptra_intr_rcv.soc_ifc_error |= SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_INV_DEV_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_CMD_FAIL_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_CMD_FAIL_STS_MASK; + cptra_intr_rcv.soc_ifc_error |= SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_CMD_FAIL_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_BAD_FUSE_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_BAD_FUSE_STS_MASK; + cptra_intr_rcv.soc_ifc_error |= SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_BAD_FUSE_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_ICCM_BLOCKED_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_ICCM_BLOCKED_STS_MASK; + cptra_intr_rcv.soc_ifc_error |= SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_ICCM_BLOCKED_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_MBOX_ECC_UNC_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_MBOX_ECC_UNC_STS_MASK; + cptra_intr_rcv.soc_ifc_error |= SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_MBOX_ECC_UNC_STS_MASK; + } + if (sts == 0) { + VPRINTF(ERROR,"bad soc_ifc_error_intr sts:%x\n", sts); + SEND_STDOUT_CTRL(0x1); + while(1); + } +} + +inline void service_soc_ifc_notif_intr () { + uint32_t * reg = (uint32_t *) (CLP_SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R); + uint32_t sts = *reg; + /* Write 1 to Clear the pending interrupt */ + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_AVAIL_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_AVAIL_STS_MASK; + cptra_intr_rcv.soc_ifc_notif |= SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_AVAIL_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_MBOX_ECC_COR_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_MBOX_ECC_COR_STS_MASK; + cptra_intr_rcv.soc_ifc_notif |= SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_MBOX_ECC_COR_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_DEBUG_LOCKED_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_DEBUG_LOCKED_STS_MASK; + cptra_intr_rcv.soc_ifc_notif |= SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_DEBUG_LOCKED_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_SCAN_MODE_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_SCAN_MODE_STS_MASK; + cptra_intr_rcv.soc_ifc_notif |= SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_SCAN_MODE_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_SOC_REQ_LOCK_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_SOC_REQ_LOCK_STS_MASK; + cptra_intr_rcv.soc_ifc_notif |= SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_SOC_REQ_LOCK_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_GEN_IN_TOGGLE_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_GEN_IN_TOGGLE_STS_MASK; + cptra_intr_rcv.soc_ifc_notif |= SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_GEN_IN_TOGGLE_STS_MASK; + } + if (sts == 0) { + VPRINTF(ERROR,"bad soc_ifc_notif_intr sts:%x\n", sts); + SEND_STDOUT_CTRL(0x1); + while(1); + } +} + +inline void service_sha512_acc_error_intr() {return;} +inline void service_sha512_acc_notif_intr() { + uint32_t * reg = (uint32_t *) (CLP_SHA512_ACC_CSR_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R); + uint32_t sts = *reg; + /* Write 1 to Clear the pending interrupt */ + if (sts & SHA512_ACC_CSR_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK) { + *reg = SHA512_ACC_CSR_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + cptra_intr_rcv.sha512_acc_notif |= SHA512_ACC_CSR_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + } + if (sts == 0) { + VPRINTF(ERROR,"bad sha512_acc_notif_intr sts:%x\n", sts); + SEND_STDOUT_CTRL(0x1); + while(1); + } +} + + +#endif //CALIPTRA_ISR_H diff --git a/src/integration/test_suites/smoke_test_kv_cg/smoke_test_kv_cg.c b/src/integration/test_suites/smoke_test_kv_cg/smoke_test_kv_cg.c new file mode 100644 index 000000000..c90f3fcf6 --- /dev/null +++ b/src/integration/test_suites/smoke_test_kv_cg/smoke_test_kv_cg.c @@ -0,0 +1,150 @@ +// SPDX-License-Identifier: Apache-2.0 +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +#include "caliptra_defines.h" +#include "caliptra_isr.h" +#include "riscv-csr.h" +#include +#include +#include "printf.h" +#include "clk_gate.h" + +volatile char* stdout = (char *)STDOUT; +volatile uint32_t intr_count = 0; +volatile uint32_t rst_count __attribute__((section(".dccm.persistent"))) = 0; +#ifdef CPT_VERBOSITY + enum printf_verbosity verbosity_g = CPT_VERBOSITY; +#else + enum printf_verbosity verbosity_g = LOW; +#endif + +volatile caliptra_intr_received_s cptra_intr_rcv = { + .doe_error = 0, + .doe_notif = 0, + .ecc_error = 0, + .ecc_notif = 0, + .hmac_error = 0, + .hmac_notif = 0, + .kv_error = 0, + .kv_notif = 0, + .sha512_error = 0, + .sha512_notif = 0, + .sha256_error = 0, + .sha256_notif = 0, + .qspi_error = 0, + .qspi_notif = 0, + .uart_error = 0, + .uart_notif = 0, + .i3c_error = 0, + .i3c_notif = 0, + .soc_ifc_error = 0, + .soc_ifc_notif = 0, + .sha512_acc_error = 0, + .sha512_acc_notif = 0, +}; + +uint32_t IV_DATA_UDS0 = 0x2eb94297; +uint32_t IV_DATA_UDS1 = 0x77285196; +uint32_t IV_DATA_UDS2 = 0x3dd39a1e; +uint32_t IV_DATA_UDS3 = 0xb95d438f; + +volatile uint32_t * doe_iv_0 = (uint32_t *) CLP_DOE_REG_DOE_IV_0; +volatile uint32_t * doe_iv_1 = (uint32_t *) CLP_DOE_REG_DOE_IV_1; +volatile uint32_t * doe_iv_2 = (uint32_t *) CLP_DOE_REG_DOE_IV_2; +volatile uint32_t * doe_iv_3 = (uint32_t *) CLP_DOE_REG_DOE_IV_3; + +volatile uint32_t * doe_ctrl = (uint32_t *) CLP_DOE_REG_DOE_CTRL; +volatile uint32_t * doe_status = (uint32_t *) CLP_DOE_REG_DOE_STATUS; + +volatile uint32_t * soc_ifc_fw_update_reset = (uint32_t *) (CLP_SOC_IFC_REG_INTERNAL_FW_UPDATE_RESET); + +volatile uint32_t * pcr_ctrl0 = (uint32_t *) CLP_PV_REG_PCR_CTRL_0; +volatile uint32_t * pcr_ctrl2 = (uint32_t *) CLP_PV_REG_PCR_CTRL_2; +volatile uint32_t * pcr_ctrl5 = (uint32_t *) CLP_PV_REG_PCR_CTRL_5; + +volatile uint32_t * key_ctrl1 = (uint32_t *) CLP_KV_REG_KEY_CTRL_1; +volatile uint32_t * key_ctrl4 = (uint32_t *) CLP_KV_REG_KEY_CTRL_4; +volatile uint32_t * key_ctrl7 = (uint32_t *) CLP_KV_REG_KEY_CTRL_7; + +volatile uint32_t doe_status_int; + +void main() { + volatile uint32_t mitb0 = 0x00000400; + volatile uint32_t mitb1 = 0x00000500; + volatile uint32_t mie_timer0_en = 0x20000000; + + VPRINTF(LOW,"---------------------------\n"); + VPRINTF(LOW," KV Smoke Test With Warm Reset !!\n"); + VPRINTF(LOW,"---------------------------\n"); + + //Call interrupt init + init_interrupts(); + + //Enable clk gating and halt core + SEND_STDOUT_CTRL(0xf2); + set_mit0(mitb0, mie_timer0_en); + + VPRINTF(LOW,"UDS flow\n"); + //Write UDS IV + *doe_iv_0 = IV_DATA_UDS0; + *doe_iv_1 = IV_DATA_UDS1; + *doe_iv_2 = IV_DATA_UDS2; + *doe_iv_3 = IV_DATA_UDS3; + + //Start UDS and store in KV0 + *doe_ctrl = 0x00000001; + + //Sleep + // for (uint16_t i = 0; i < 2; i++){ + // printf("%d\n", i); + // } + printf("Dummy print\n"); + __asm__ volatile ("csrwi %0, %1" \ + : /* output: none */ \ + : "i" (0x7c6), "i" (0x03) /* input : immediate */ \ + : /* clobbers: none */); + // set_mit0_and_halt_core(mitb0, mie_timer0_en); + //halt_core(); + // set_mit0(mitb1, mie_timer0_en); + // halt_core(); + + // //Poll for DOE status + while(doe_status_int != (DOE_REG_DOE_STATUS_VALID_MASK | DOE_REG_DOE_STATUS_READY_MASK)) { + doe_status_int = *doe_status; + doe_status_int = doe_status_int & (DOE_REG_DOE_STATUS_VALID_MASK | DOE_REG_DOE_STATUS_READY_MASK) ; + } + + + VPRINTF(LOW, "Core back up\n"); + //Restart UDS flow after core wakes up - should not go through + //Write UDS IV + VPRINTF(LOW, "Writing IV a 2nd time\n"); + *doe_iv_0 = IV_DATA_UDS3; + *doe_iv_1 = IV_DATA_UDS2; + *doe_iv_2 = IV_DATA_UDS1; + *doe_iv_3 = IV_DATA_UDS0; + + //Start UDS and store in KV0 + VPRINTF(LOW, "Starting UDS again\n"); + *doe_ctrl = 0x00000001; + + // //Poll for DOE status + doe_status_int = 0x00000000; + while(doe_status_int != (DOE_REG_DOE_STATUS_VALID_MASK | DOE_REG_DOE_STATUS_READY_MASK)) { + doe_status_int = *doe_status; + doe_status_int = doe_status_int & (DOE_REG_DOE_STATUS_VALID_MASK | DOE_REG_DOE_STATUS_READY_MASK) ; + } + +} diff --git a/src/integration/test_suites/smoke_test_kv_cg/smoke_test_kv_cg.yml b/src/integration/test_suites/smoke_test_kv_cg/smoke_test_kv_cg.yml new file mode 100644 index 000000000..41b50850e --- /dev/null +++ b/src/integration/test_suites/smoke_test_kv_cg/smoke_test_kv_cg.yml @@ -0,0 +1,17 @@ +# SPDX-License-Identifier: Apache-2.0 +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +--- +seed: 1 +testname: smoke_test_kv_uds_reset \ No newline at end of file diff --git a/src/integration/test_suites/smoke_test_kv_crypto_flow/caliptra_isr.h b/src/integration/test_suites/smoke_test_kv_crypto_flow/caliptra_isr.h index 6ffd71c0a..8f5779e04 100644 --- a/src/integration/test_suites/smoke_test_kv_crypto_flow/caliptra_isr.h +++ b/src/integration/test_suites/smoke_test_kv_crypto_flow/caliptra_isr.h @@ -204,6 +204,22 @@ inline void service_soc_ifc_notif_intr () { *reg = SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_MBOX_ECC_COR_STS_MASK; cptra_intr_rcv.soc_ifc_notif |= SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_MBOX_ECC_COR_STS_MASK; } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_DEBUG_LOCKED_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_DEBUG_LOCKED_STS_MASK; + cptra_intr_rcv.soc_ifc_notif |= SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_DEBUG_LOCKED_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_SCAN_MODE_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_SCAN_MODE_STS_MASK; + cptra_intr_rcv.soc_ifc_notif |= SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_SCAN_MODE_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_SOC_REQ_LOCK_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_SOC_REQ_LOCK_STS_MASK; + cptra_intr_rcv.soc_ifc_notif |= SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_SOC_REQ_LOCK_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_GEN_IN_TOGGLE_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_GEN_IN_TOGGLE_STS_MASK; + cptra_intr_rcv.soc_ifc_notif |= SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_GEN_IN_TOGGLE_STS_MASK; + } if (sts == 0) { VPRINTF(ERROR,"bad soc_ifc_notif_intr sts:%x\n", sts); SEND_STDOUT_CTRL(0x1); diff --git a/src/integration/test_suites/smoke_test_kv_crypto_flow/smoke_test_kv_crypto_flow.c b/src/integration/test_suites/smoke_test_kv_crypto_flow/smoke_test_kv_crypto_flow.c index 406450b63..12383a871 100644 --- a/src/integration/test_suites/smoke_test_kv_crypto_flow/smoke_test_kv_crypto_flow.c +++ b/src/integration/test_suites/smoke_test_kv_crypto_flow/smoke_test_kv_crypto_flow.c @@ -269,7 +269,7 @@ void main(){ uint8_t cdi_ldevid_id; //Call interrupt init - //init_interrupts(); + init_interrupts(); random_generator(&doe_fe_dest_id, &uds_key_id, &idevid_privkey_id, &cdi_ldevid_id); printf("%x, %x, %x, %x\n",doe_fe_dest_id, uds_key_id, idevid_privkey_id, cdi_ldevid_id); diff --git a/src/integration/test_suites/smoke_test_kv_ecc_flow/caliptra_isr.h b/src/integration/test_suites/smoke_test_kv_ecc_flow/caliptra_isr.h index 6ffd71c0a..8f5779e04 100644 --- a/src/integration/test_suites/smoke_test_kv_ecc_flow/caliptra_isr.h +++ b/src/integration/test_suites/smoke_test_kv_ecc_flow/caliptra_isr.h @@ -204,6 +204,22 @@ inline void service_soc_ifc_notif_intr () { *reg = SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_MBOX_ECC_COR_STS_MASK; cptra_intr_rcv.soc_ifc_notif |= SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_MBOX_ECC_COR_STS_MASK; } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_DEBUG_LOCKED_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_DEBUG_LOCKED_STS_MASK; + cptra_intr_rcv.soc_ifc_notif |= SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_DEBUG_LOCKED_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_SCAN_MODE_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_SCAN_MODE_STS_MASK; + cptra_intr_rcv.soc_ifc_notif |= SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_SCAN_MODE_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_SOC_REQ_LOCK_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_SOC_REQ_LOCK_STS_MASK; + cptra_intr_rcv.soc_ifc_notif |= SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_SOC_REQ_LOCK_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_GEN_IN_TOGGLE_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_GEN_IN_TOGGLE_STS_MASK; + cptra_intr_rcv.soc_ifc_notif |= SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_GEN_IN_TOGGLE_STS_MASK; + } if (sts == 0) { VPRINTF(ERROR,"bad soc_ifc_notif_intr sts:%x\n", sts); SEND_STDOUT_CTRL(0x1); diff --git a/src/integration/test_suites/smoke_test_kv_hmac_flow/caliptra_isr.h b/src/integration/test_suites/smoke_test_kv_hmac_flow/caliptra_isr.h index 6ffd71c0a..8f5779e04 100644 --- a/src/integration/test_suites/smoke_test_kv_hmac_flow/caliptra_isr.h +++ b/src/integration/test_suites/smoke_test_kv_hmac_flow/caliptra_isr.h @@ -204,6 +204,22 @@ inline void service_soc_ifc_notif_intr () { *reg = SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_MBOX_ECC_COR_STS_MASK; cptra_intr_rcv.soc_ifc_notif |= SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_MBOX_ECC_COR_STS_MASK; } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_DEBUG_LOCKED_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_DEBUG_LOCKED_STS_MASK; + cptra_intr_rcv.soc_ifc_notif |= SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_DEBUG_LOCKED_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_SCAN_MODE_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_SCAN_MODE_STS_MASK; + cptra_intr_rcv.soc_ifc_notif |= SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_SCAN_MODE_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_SOC_REQ_LOCK_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_SOC_REQ_LOCK_STS_MASK; + cptra_intr_rcv.soc_ifc_notif |= SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_SOC_REQ_LOCK_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_GEN_IN_TOGGLE_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_GEN_IN_TOGGLE_STS_MASK; + cptra_intr_rcv.soc_ifc_notif |= SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_GEN_IN_TOGGLE_STS_MASK; + } if (sts == 0) { VPRINTF(ERROR,"bad soc_ifc_notif_intr sts:%x\n", sts); SEND_STDOUT_CTRL(0x1); diff --git a/src/integration/test_suites/smoke_test_kv_hmac_flow/smoke_test_kv_hmac_flow.c b/src/integration/test_suites/smoke_test_kv_hmac_flow/smoke_test_kv_hmac_flow.c index 0df1dc454..f43580d77 100644 --- a/src/integration/test_suites/smoke_test_kv_hmac_flow/smoke_test_kv_hmac_flow.c +++ b/src/integration/test_suites/smoke_test_kv_hmac_flow/smoke_test_kv_hmac_flow.c @@ -153,7 +153,7 @@ void main() { for (int i = 0; i < hmac_lfsr_seed.data_size; i++) hmac_lfsr_seed.data[i] = lfsr_seed_data[i]; - hmac_tag.kv_intf = FALSE; + hmac_tag.kv_intf = TRUE; hmac_tag.kv_id = tag_kv_id; hmac_tag.data_size = 12; for (int i = 0; i < hmac_tag.data_size; i++) diff --git a/src/integration/test_suites/smoke_test_kv_securitystate/caliptra_isr.h b/src/integration/test_suites/smoke_test_kv_securitystate/caliptra_isr.h index 48879dc68..8f5779e04 100644 --- a/src/integration/test_suites/smoke_test_kv_securitystate/caliptra_isr.h +++ b/src/integration/test_suites/smoke_test_kv_securitystate/caliptra_isr.h @@ -32,39 +32,216 @@ #include #include "printf.h" -//extern volatile uint32_t hmac_intr_status; +/* --------------- symbols/typedefs --------------- */ +typedef struct { + uint32_t doe_error; + uint32_t doe_notif; + uint32_t ecc_error; + uint32_t ecc_notif; + uint32_t hmac_error; + uint32_t hmac_notif; + uint32_t kv_error; + uint32_t kv_notif; + uint32_t sha512_error; + uint32_t sha512_notif; + uint32_t sha256_error; + uint32_t sha256_notif; + uint32_t qspi_error; + uint32_t qspi_notif; + uint32_t uart_error; + uint32_t uart_notif; + uint32_t i3c_error; + uint32_t i3c_notif; + uint32_t soc_ifc_error; + uint32_t soc_ifc_notif; + uint32_t sha512_acc_error; + uint32_t sha512_acc_notif; +} caliptra_intr_received_s; +extern volatile caliptra_intr_received_s cptra_intr_rcv; ////////////////////////////////////////////////////////////////////////////// // Function Declarations // + // Performs all the CSR setup to configure and enable vectored external interrupts void init_interrupts(void); // These inline functions are used to insert event-specific functionality into the // otherwise generic ISR that gets laid down by the parameterized macro "nonstd_veer_isr" -inline void service_doe_error_intr() {printf("ERROR");} -inline void service_doe_notif_intr() {printf("ERROR");} -inline void service_ecc_error_intr () {printf("ERROR");} -inline void service_ecc_notif_intr () {printf("ERROR");} -inline void service_hmac_error_intr () {printf("ERROR");} -inline void service_hmac_notif_intr () {printf("ERROR");} - -inline void service_kv_error_intr () {printf("ERROR");} -inline void service_kv_notif_intr () {printf("ERROR");} -inline void service_sha512_error_intr() {printf("ERROR");} -inline void service_sha512_notif_intr() {printf("ERROR");} -inline void service_sha256_error_intr() {printf("ERROR");} -inline void service_sha256_notif_intr() {printf("ERROR");} -inline void service_qspi_error_intr () {printf("ERROR");} -inline void service_qspi_notif_intr () {printf("ERROR");} -inline void service_uart_error_intr () {printf("ERROR");} -inline void service_uart_notif_intr () {printf("ERROR");} -inline void service_i3c_error_intr () {printf("ERROR");} -inline void service_i3c_notif_intr () {printf("ERROR");} -inline void service_soc_ifc_error_intr () {printf("ERROR");} -inline void service_soc_ifc_notif_intr () {printf("ERROR");} -inline void service_sha512_acc_error_intr() {printf("ERROR");} -inline void service_sha512_acc_notif_intr() {printf("ERROR");} +inline void service_doe_error_intr() {return;} +inline void service_doe_notif_intr() { + uint32_t * reg = (uint32_t *) (CLP_DOE_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R); + uint32_t sts = *reg; + /* Write 1 to Clear the pending interrupt */ + if (sts & DOE_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK) { + *reg = DOE_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + cptra_intr_rcv.doe_notif |= DOE_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + } + if (sts == 0) { + VPRINTF(ERROR,"bad doe_notif_intr sts:%x\n", sts); + SEND_STDOUT_CTRL(0x1); + while(1); + } +} + +inline void service_ecc_error_intr() {return;} +inline void service_ecc_notif_intr() { + uint32_t * reg = (uint32_t *) (CLP_ECC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R); + uint32_t sts = *reg; + /* Write 1 to Clear the pending interrupt */ + if (sts & ECC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK) { + *reg = ECC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + cptra_intr_rcv.ecc_notif |= ECC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + } + if (sts == 0) { + VPRINTF(ERROR,"bad ecc_notif_intr sts:%x\n", sts); + SEND_STDOUT_CTRL(0x1); + while(1); + } +} + +inline void service_hmac_error_intr() {return;} +inline void service_hmac_notif_intr() { + uint32_t * reg = (uint32_t *) (CLP_HMAC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R); + uint32_t sts = *reg; + /* Write 1 to Clear the pending interrupt */ + if (sts & HMAC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK) { + *reg = HMAC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + cptra_intr_rcv.hmac_notif |= HMAC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + } + if (sts == 0) { + VPRINTF(ERROR,"bad hmac_notif_intr sts:%x\n", sts); + SEND_STDOUT_CTRL(0x1); + while(1); + } +} + +inline void service_kv_error_intr() {return;} +inline void service_kv_notif_intr() {return;} +inline void service_sha512_error_intr() {return;} +inline void service_sha512_notif_intr() { + uint32_t * reg = (uint32_t *) (CLP_SHA512_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R); + uint32_t sts = *reg; + /* Write 1 to Clear the pending interrupt */ + if (sts & SHA512_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK) { + *reg = SHA512_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + cptra_intr_rcv.sha512_notif |= SHA512_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + } + if (sts == 0) { + VPRINTF(ERROR,"bad sha512_notif_intr sts:%x\n", sts); + SEND_STDOUT_CTRL(0x1); + while(1); + } +} + +inline void service_sha256_error_intr() {return;} +inline void service_sha256_notif_intr() { + uint32_t * reg = (uint32_t *) (CLP_SHA256_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R); + uint32_t sts = *reg; + /* Write 1 to Clear the pending interrupt */ + if (sts & SHA256_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK) { + *reg = SHA256_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + cptra_intr_rcv.sha256_notif |= SHA256_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + } + if (sts == 0) { + VPRINTF(ERROR,"bad sha256_notif_intr sts:%x\n", sts); + SEND_STDOUT_CTRL(0x1); + while(1); + } +} + +inline void service_qspi_error_intr() {return;} +inline void service_qspi_notif_intr() {return;} +inline void service_uart_error_intr() {return;} +inline void service_uart_notif_intr() {return;} +inline void service_i3c_error_intr() {return;} +inline void service_i3c_notif_intr() {return;} + +inline void service_soc_ifc_error_intr() { + uint32_t * reg = (uint32_t *) (CLP_SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R); + uint32_t sts = *reg; + /* Write 1 to Clear the pending interrupt */ + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_INTERNAL_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_INTERNAL_STS_MASK; + cptra_intr_rcv.soc_ifc_error |= SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_INTERNAL_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_INV_DEV_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_INV_DEV_STS_MASK; + cptra_intr_rcv.soc_ifc_error |= SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_INV_DEV_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_CMD_FAIL_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_CMD_FAIL_STS_MASK; + cptra_intr_rcv.soc_ifc_error |= SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_CMD_FAIL_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_BAD_FUSE_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_BAD_FUSE_STS_MASK; + cptra_intr_rcv.soc_ifc_error |= SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_BAD_FUSE_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_ICCM_BLOCKED_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_ICCM_BLOCKED_STS_MASK; + cptra_intr_rcv.soc_ifc_error |= SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_ICCM_BLOCKED_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_MBOX_ECC_UNC_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_MBOX_ECC_UNC_STS_MASK; + cptra_intr_rcv.soc_ifc_error |= SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_MBOX_ECC_UNC_STS_MASK; + } + if (sts == 0) { + VPRINTF(ERROR,"bad soc_ifc_error_intr sts:%x\n", sts); + SEND_STDOUT_CTRL(0x1); + while(1); + } +} + +inline void service_soc_ifc_notif_intr () { + uint32_t * reg = (uint32_t *) (CLP_SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R); + uint32_t sts = *reg; + /* Write 1 to Clear the pending interrupt */ + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_AVAIL_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_AVAIL_STS_MASK; + cptra_intr_rcv.soc_ifc_notif |= SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_AVAIL_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_MBOX_ECC_COR_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_MBOX_ECC_COR_STS_MASK; + cptra_intr_rcv.soc_ifc_notif |= SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_MBOX_ECC_COR_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_DEBUG_LOCKED_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_DEBUG_LOCKED_STS_MASK; + cptra_intr_rcv.soc_ifc_notif |= SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_DEBUG_LOCKED_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_SCAN_MODE_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_SCAN_MODE_STS_MASK; + cptra_intr_rcv.soc_ifc_notif |= SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_SCAN_MODE_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_SOC_REQ_LOCK_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_SOC_REQ_LOCK_STS_MASK; + cptra_intr_rcv.soc_ifc_notif |= SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_SOC_REQ_LOCK_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_GEN_IN_TOGGLE_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_GEN_IN_TOGGLE_STS_MASK; + cptra_intr_rcv.soc_ifc_notif |= SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_GEN_IN_TOGGLE_STS_MASK; + } + if (sts == 0) { + VPRINTF(ERROR,"bad soc_ifc_notif_intr sts:%x\n", sts); + SEND_STDOUT_CTRL(0x1); + while(1); + } +} + +inline void service_sha512_acc_error_intr() {return;} +inline void service_sha512_acc_notif_intr() { + uint32_t * reg = (uint32_t *) (CLP_SHA512_ACC_CSR_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R); + uint32_t sts = *reg; + /* Write 1 to Clear the pending interrupt */ + if (sts & SHA512_ACC_CSR_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK) { + *reg = SHA512_ACC_CSR_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + cptra_intr_rcv.sha512_acc_notif |= SHA512_ACC_CSR_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + } + if (sts == 0) { + VPRINTF(ERROR,"bad sha512_acc_notif_intr sts:%x\n", sts); + SEND_STDOUT_CTRL(0x1); + while(1); + } +} #endif //CALIPTRA_ISR_H diff --git a/src/integration/test_suites/smoke_test_kv_securitystate/smoke_test_kv_securitystate.c b/src/integration/test_suites/smoke_test_kv_securitystate/smoke_test_kv_securitystate.c index cee7e0b66..391bc7b62 100644 --- a/src/integration/test_suites/smoke_test_kv_securitystate/smoke_test_kv_securitystate.c +++ b/src/integration/test_suites/smoke_test_kv_securitystate/smoke_test_kv_securitystate.c @@ -30,6 +30,31 @@ volatile uint32_t rst_count __attribute__((section(".dccm.persistent"))) = 0; enum printf_verbosity verbosity_g = LOW; #endif +volatile caliptra_intr_received_s cptra_intr_rcv = { + .doe_error = 0, + .doe_notif = 0, + .ecc_error = 0, + .ecc_notif = 0, + .hmac_error = 0, + .hmac_notif = 0, + .kv_error = 0, + .kv_notif = 0, + .sha512_error = 0, + .sha512_notif = 0, + .sha256_error = 0, + .sha256_notif = 0, + .qspi_error = 0, + .qspi_notif = 0, + .uart_error = 0, + .uart_notif = 0, + .i3c_error = 0, + .i3c_notif = 0, + .soc_ifc_error = 0, + .soc_ifc_notif = 0, + .sha512_acc_error = 0, + .sha512_acc_notif = 0, +}; + volatile uint32_t * clear_secrets = (uint32_t *) CLP_KV_REG_CLEAR_SECRETS; volatile uint32_t * reset_reason = (uint32_t *) CLP_SOC_IFC_REG_CPTRA_RESET_REASON; diff --git a/src/integration/test_suites/smoke_test_kv_sha512_flow/caliptra_isr.h b/src/integration/test_suites/smoke_test_kv_sha512_flow/caliptra_isr.h index 48879dc68..8f5779e04 100644 --- a/src/integration/test_suites/smoke_test_kv_sha512_flow/caliptra_isr.h +++ b/src/integration/test_suites/smoke_test_kv_sha512_flow/caliptra_isr.h @@ -32,39 +32,216 @@ #include #include "printf.h" -//extern volatile uint32_t hmac_intr_status; +/* --------------- symbols/typedefs --------------- */ +typedef struct { + uint32_t doe_error; + uint32_t doe_notif; + uint32_t ecc_error; + uint32_t ecc_notif; + uint32_t hmac_error; + uint32_t hmac_notif; + uint32_t kv_error; + uint32_t kv_notif; + uint32_t sha512_error; + uint32_t sha512_notif; + uint32_t sha256_error; + uint32_t sha256_notif; + uint32_t qspi_error; + uint32_t qspi_notif; + uint32_t uart_error; + uint32_t uart_notif; + uint32_t i3c_error; + uint32_t i3c_notif; + uint32_t soc_ifc_error; + uint32_t soc_ifc_notif; + uint32_t sha512_acc_error; + uint32_t sha512_acc_notif; +} caliptra_intr_received_s; +extern volatile caliptra_intr_received_s cptra_intr_rcv; ////////////////////////////////////////////////////////////////////////////// // Function Declarations // + // Performs all the CSR setup to configure and enable vectored external interrupts void init_interrupts(void); // These inline functions are used to insert event-specific functionality into the // otherwise generic ISR that gets laid down by the parameterized macro "nonstd_veer_isr" -inline void service_doe_error_intr() {printf("ERROR");} -inline void service_doe_notif_intr() {printf("ERROR");} -inline void service_ecc_error_intr () {printf("ERROR");} -inline void service_ecc_notif_intr () {printf("ERROR");} -inline void service_hmac_error_intr () {printf("ERROR");} -inline void service_hmac_notif_intr () {printf("ERROR");} - -inline void service_kv_error_intr () {printf("ERROR");} -inline void service_kv_notif_intr () {printf("ERROR");} -inline void service_sha512_error_intr() {printf("ERROR");} -inline void service_sha512_notif_intr() {printf("ERROR");} -inline void service_sha256_error_intr() {printf("ERROR");} -inline void service_sha256_notif_intr() {printf("ERROR");} -inline void service_qspi_error_intr () {printf("ERROR");} -inline void service_qspi_notif_intr () {printf("ERROR");} -inline void service_uart_error_intr () {printf("ERROR");} -inline void service_uart_notif_intr () {printf("ERROR");} -inline void service_i3c_error_intr () {printf("ERROR");} -inline void service_i3c_notif_intr () {printf("ERROR");} -inline void service_soc_ifc_error_intr () {printf("ERROR");} -inline void service_soc_ifc_notif_intr () {printf("ERROR");} -inline void service_sha512_acc_error_intr() {printf("ERROR");} -inline void service_sha512_acc_notif_intr() {printf("ERROR");} +inline void service_doe_error_intr() {return;} +inline void service_doe_notif_intr() { + uint32_t * reg = (uint32_t *) (CLP_DOE_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R); + uint32_t sts = *reg; + /* Write 1 to Clear the pending interrupt */ + if (sts & DOE_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK) { + *reg = DOE_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + cptra_intr_rcv.doe_notif |= DOE_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + } + if (sts == 0) { + VPRINTF(ERROR,"bad doe_notif_intr sts:%x\n", sts); + SEND_STDOUT_CTRL(0x1); + while(1); + } +} + +inline void service_ecc_error_intr() {return;} +inline void service_ecc_notif_intr() { + uint32_t * reg = (uint32_t *) (CLP_ECC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R); + uint32_t sts = *reg; + /* Write 1 to Clear the pending interrupt */ + if (sts & ECC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK) { + *reg = ECC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + cptra_intr_rcv.ecc_notif |= ECC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + } + if (sts == 0) { + VPRINTF(ERROR,"bad ecc_notif_intr sts:%x\n", sts); + SEND_STDOUT_CTRL(0x1); + while(1); + } +} + +inline void service_hmac_error_intr() {return;} +inline void service_hmac_notif_intr() { + uint32_t * reg = (uint32_t *) (CLP_HMAC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R); + uint32_t sts = *reg; + /* Write 1 to Clear the pending interrupt */ + if (sts & HMAC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK) { + *reg = HMAC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + cptra_intr_rcv.hmac_notif |= HMAC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + } + if (sts == 0) { + VPRINTF(ERROR,"bad hmac_notif_intr sts:%x\n", sts); + SEND_STDOUT_CTRL(0x1); + while(1); + } +} + +inline void service_kv_error_intr() {return;} +inline void service_kv_notif_intr() {return;} +inline void service_sha512_error_intr() {return;} +inline void service_sha512_notif_intr() { + uint32_t * reg = (uint32_t *) (CLP_SHA512_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R); + uint32_t sts = *reg; + /* Write 1 to Clear the pending interrupt */ + if (sts & SHA512_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK) { + *reg = SHA512_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + cptra_intr_rcv.sha512_notif |= SHA512_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + } + if (sts == 0) { + VPRINTF(ERROR,"bad sha512_notif_intr sts:%x\n", sts); + SEND_STDOUT_CTRL(0x1); + while(1); + } +} + +inline void service_sha256_error_intr() {return;} +inline void service_sha256_notif_intr() { + uint32_t * reg = (uint32_t *) (CLP_SHA256_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R); + uint32_t sts = *reg; + /* Write 1 to Clear the pending interrupt */ + if (sts & SHA256_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK) { + *reg = SHA256_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + cptra_intr_rcv.sha256_notif |= SHA256_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + } + if (sts == 0) { + VPRINTF(ERROR,"bad sha256_notif_intr sts:%x\n", sts); + SEND_STDOUT_CTRL(0x1); + while(1); + } +} + +inline void service_qspi_error_intr() {return;} +inline void service_qspi_notif_intr() {return;} +inline void service_uart_error_intr() {return;} +inline void service_uart_notif_intr() {return;} +inline void service_i3c_error_intr() {return;} +inline void service_i3c_notif_intr() {return;} + +inline void service_soc_ifc_error_intr() { + uint32_t * reg = (uint32_t *) (CLP_SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R); + uint32_t sts = *reg; + /* Write 1 to Clear the pending interrupt */ + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_INTERNAL_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_INTERNAL_STS_MASK; + cptra_intr_rcv.soc_ifc_error |= SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_INTERNAL_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_INV_DEV_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_INV_DEV_STS_MASK; + cptra_intr_rcv.soc_ifc_error |= SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_INV_DEV_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_CMD_FAIL_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_CMD_FAIL_STS_MASK; + cptra_intr_rcv.soc_ifc_error |= SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_CMD_FAIL_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_BAD_FUSE_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_BAD_FUSE_STS_MASK; + cptra_intr_rcv.soc_ifc_error |= SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_BAD_FUSE_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_ICCM_BLOCKED_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_ICCM_BLOCKED_STS_MASK; + cptra_intr_rcv.soc_ifc_error |= SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_ICCM_BLOCKED_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_MBOX_ECC_UNC_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_MBOX_ECC_UNC_STS_MASK; + cptra_intr_rcv.soc_ifc_error |= SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_MBOX_ECC_UNC_STS_MASK; + } + if (sts == 0) { + VPRINTF(ERROR,"bad soc_ifc_error_intr sts:%x\n", sts); + SEND_STDOUT_CTRL(0x1); + while(1); + } +} + +inline void service_soc_ifc_notif_intr () { + uint32_t * reg = (uint32_t *) (CLP_SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R); + uint32_t sts = *reg; + /* Write 1 to Clear the pending interrupt */ + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_AVAIL_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_AVAIL_STS_MASK; + cptra_intr_rcv.soc_ifc_notif |= SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_AVAIL_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_MBOX_ECC_COR_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_MBOX_ECC_COR_STS_MASK; + cptra_intr_rcv.soc_ifc_notif |= SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_MBOX_ECC_COR_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_DEBUG_LOCKED_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_DEBUG_LOCKED_STS_MASK; + cptra_intr_rcv.soc_ifc_notif |= SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_DEBUG_LOCKED_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_SCAN_MODE_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_SCAN_MODE_STS_MASK; + cptra_intr_rcv.soc_ifc_notif |= SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_SCAN_MODE_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_SOC_REQ_LOCK_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_SOC_REQ_LOCK_STS_MASK; + cptra_intr_rcv.soc_ifc_notif |= SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_SOC_REQ_LOCK_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_GEN_IN_TOGGLE_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_GEN_IN_TOGGLE_STS_MASK; + cptra_intr_rcv.soc_ifc_notif |= SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_GEN_IN_TOGGLE_STS_MASK; + } + if (sts == 0) { + VPRINTF(ERROR,"bad soc_ifc_notif_intr sts:%x\n", sts); + SEND_STDOUT_CTRL(0x1); + while(1); + } +} + +inline void service_sha512_acc_error_intr() {return;} +inline void service_sha512_acc_notif_intr() { + uint32_t * reg = (uint32_t *) (CLP_SHA512_ACC_CSR_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R); + uint32_t sts = *reg; + /* Write 1 to Clear the pending interrupt */ + if (sts & SHA512_ACC_CSR_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK) { + *reg = SHA512_ACC_CSR_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + cptra_intr_rcv.sha512_acc_notif |= SHA512_ACC_CSR_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + } + if (sts == 0) { + VPRINTF(ERROR,"bad sha512_acc_notif_intr sts:%x\n", sts); + SEND_STDOUT_CTRL(0x1); + while(1); + } +} #endif //CALIPTRA_ISR_H diff --git a/src/integration/test_suites/smoke_test_kv_sha512_flow/smoke_test_kv_sha512_flow.c b/src/integration/test_suites/smoke_test_kv_sha512_flow/smoke_test_kv_sha512_flow.c index a46f5e360..54b2b6060 100644 --- a/src/integration/test_suites/smoke_test_kv_sha512_flow/smoke_test_kv_sha512_flow.c +++ b/src/integration/test_suites/smoke_test_kv_sha512_flow/smoke_test_kv_sha512_flow.c @@ -32,6 +32,30 @@ volatile uint32_t rst_count = 0; enum printf_verbosity verbosity_g = LOW; #endif +volatile caliptra_intr_received_s cptra_intr_rcv = { + .doe_error = 0, + .doe_notif = 0, + .ecc_error = 0, + .ecc_notif = 0, + .hmac_error = 0, + .hmac_notif = 0, + .kv_error = 0, + .kv_notif = 0, + .sha512_error = 0, + .sha512_notif = 0, + .sha256_error = 0, + .sha256_notif = 0, + .qspi_error = 0, + .qspi_notif = 0, + .uart_error = 0, + .uart_notif = 0, + .i3c_error = 0, + .i3c_notif = 0, + .soc_ifc_error = 0, + .soc_ifc_notif = 0, + .sha512_acc_error = 0, + .sha512_acc_notif = 0, +}; /* SHA384 test vector: @@ -45,7 +69,7 @@ void main() { printf("----------------------------------\n"); //Call interrupt init - //init_interrupts(); + init_interrupts(); uint32_t expected_digest[] = {0x38742d18, 0xbfa6e918, diff --git a/src/integration/test_suites/smoke_test_kv_uds_reset/caliptra_isr.h b/src/integration/test_suites/smoke_test_kv_uds_reset/caliptra_isr.h index 48879dc68..8f5779e04 100644 --- a/src/integration/test_suites/smoke_test_kv_uds_reset/caliptra_isr.h +++ b/src/integration/test_suites/smoke_test_kv_uds_reset/caliptra_isr.h @@ -32,39 +32,216 @@ #include #include "printf.h" -//extern volatile uint32_t hmac_intr_status; +/* --------------- symbols/typedefs --------------- */ +typedef struct { + uint32_t doe_error; + uint32_t doe_notif; + uint32_t ecc_error; + uint32_t ecc_notif; + uint32_t hmac_error; + uint32_t hmac_notif; + uint32_t kv_error; + uint32_t kv_notif; + uint32_t sha512_error; + uint32_t sha512_notif; + uint32_t sha256_error; + uint32_t sha256_notif; + uint32_t qspi_error; + uint32_t qspi_notif; + uint32_t uart_error; + uint32_t uart_notif; + uint32_t i3c_error; + uint32_t i3c_notif; + uint32_t soc_ifc_error; + uint32_t soc_ifc_notif; + uint32_t sha512_acc_error; + uint32_t sha512_acc_notif; +} caliptra_intr_received_s; +extern volatile caliptra_intr_received_s cptra_intr_rcv; ////////////////////////////////////////////////////////////////////////////// // Function Declarations // + // Performs all the CSR setup to configure and enable vectored external interrupts void init_interrupts(void); // These inline functions are used to insert event-specific functionality into the // otherwise generic ISR that gets laid down by the parameterized macro "nonstd_veer_isr" -inline void service_doe_error_intr() {printf("ERROR");} -inline void service_doe_notif_intr() {printf("ERROR");} -inline void service_ecc_error_intr () {printf("ERROR");} -inline void service_ecc_notif_intr () {printf("ERROR");} -inline void service_hmac_error_intr () {printf("ERROR");} -inline void service_hmac_notif_intr () {printf("ERROR");} - -inline void service_kv_error_intr () {printf("ERROR");} -inline void service_kv_notif_intr () {printf("ERROR");} -inline void service_sha512_error_intr() {printf("ERROR");} -inline void service_sha512_notif_intr() {printf("ERROR");} -inline void service_sha256_error_intr() {printf("ERROR");} -inline void service_sha256_notif_intr() {printf("ERROR");} -inline void service_qspi_error_intr () {printf("ERROR");} -inline void service_qspi_notif_intr () {printf("ERROR");} -inline void service_uart_error_intr () {printf("ERROR");} -inline void service_uart_notif_intr () {printf("ERROR");} -inline void service_i3c_error_intr () {printf("ERROR");} -inline void service_i3c_notif_intr () {printf("ERROR");} -inline void service_soc_ifc_error_intr () {printf("ERROR");} -inline void service_soc_ifc_notif_intr () {printf("ERROR");} -inline void service_sha512_acc_error_intr() {printf("ERROR");} -inline void service_sha512_acc_notif_intr() {printf("ERROR");} +inline void service_doe_error_intr() {return;} +inline void service_doe_notif_intr() { + uint32_t * reg = (uint32_t *) (CLP_DOE_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R); + uint32_t sts = *reg; + /* Write 1 to Clear the pending interrupt */ + if (sts & DOE_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK) { + *reg = DOE_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + cptra_intr_rcv.doe_notif |= DOE_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + } + if (sts == 0) { + VPRINTF(ERROR,"bad doe_notif_intr sts:%x\n", sts); + SEND_STDOUT_CTRL(0x1); + while(1); + } +} + +inline void service_ecc_error_intr() {return;} +inline void service_ecc_notif_intr() { + uint32_t * reg = (uint32_t *) (CLP_ECC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R); + uint32_t sts = *reg; + /* Write 1 to Clear the pending interrupt */ + if (sts & ECC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK) { + *reg = ECC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + cptra_intr_rcv.ecc_notif |= ECC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + } + if (sts == 0) { + VPRINTF(ERROR,"bad ecc_notif_intr sts:%x\n", sts); + SEND_STDOUT_CTRL(0x1); + while(1); + } +} + +inline void service_hmac_error_intr() {return;} +inline void service_hmac_notif_intr() { + uint32_t * reg = (uint32_t *) (CLP_HMAC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R); + uint32_t sts = *reg; + /* Write 1 to Clear the pending interrupt */ + if (sts & HMAC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK) { + *reg = HMAC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + cptra_intr_rcv.hmac_notif |= HMAC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + } + if (sts == 0) { + VPRINTF(ERROR,"bad hmac_notif_intr sts:%x\n", sts); + SEND_STDOUT_CTRL(0x1); + while(1); + } +} + +inline void service_kv_error_intr() {return;} +inline void service_kv_notif_intr() {return;} +inline void service_sha512_error_intr() {return;} +inline void service_sha512_notif_intr() { + uint32_t * reg = (uint32_t *) (CLP_SHA512_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R); + uint32_t sts = *reg; + /* Write 1 to Clear the pending interrupt */ + if (sts & SHA512_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK) { + *reg = SHA512_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + cptra_intr_rcv.sha512_notif |= SHA512_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + } + if (sts == 0) { + VPRINTF(ERROR,"bad sha512_notif_intr sts:%x\n", sts); + SEND_STDOUT_CTRL(0x1); + while(1); + } +} + +inline void service_sha256_error_intr() {return;} +inline void service_sha256_notif_intr() { + uint32_t * reg = (uint32_t *) (CLP_SHA256_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R); + uint32_t sts = *reg; + /* Write 1 to Clear the pending interrupt */ + if (sts & SHA256_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK) { + *reg = SHA256_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + cptra_intr_rcv.sha256_notif |= SHA256_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + } + if (sts == 0) { + VPRINTF(ERROR,"bad sha256_notif_intr sts:%x\n", sts); + SEND_STDOUT_CTRL(0x1); + while(1); + } +} + +inline void service_qspi_error_intr() {return;} +inline void service_qspi_notif_intr() {return;} +inline void service_uart_error_intr() {return;} +inline void service_uart_notif_intr() {return;} +inline void service_i3c_error_intr() {return;} +inline void service_i3c_notif_intr() {return;} + +inline void service_soc_ifc_error_intr() { + uint32_t * reg = (uint32_t *) (CLP_SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R); + uint32_t sts = *reg; + /* Write 1 to Clear the pending interrupt */ + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_INTERNAL_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_INTERNAL_STS_MASK; + cptra_intr_rcv.soc_ifc_error |= SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_INTERNAL_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_INV_DEV_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_INV_DEV_STS_MASK; + cptra_intr_rcv.soc_ifc_error |= SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_INV_DEV_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_CMD_FAIL_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_CMD_FAIL_STS_MASK; + cptra_intr_rcv.soc_ifc_error |= SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_CMD_FAIL_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_BAD_FUSE_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_BAD_FUSE_STS_MASK; + cptra_intr_rcv.soc_ifc_error |= SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_BAD_FUSE_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_ICCM_BLOCKED_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_ICCM_BLOCKED_STS_MASK; + cptra_intr_rcv.soc_ifc_error |= SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_ICCM_BLOCKED_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_MBOX_ECC_UNC_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_MBOX_ECC_UNC_STS_MASK; + cptra_intr_rcv.soc_ifc_error |= SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_MBOX_ECC_UNC_STS_MASK; + } + if (sts == 0) { + VPRINTF(ERROR,"bad soc_ifc_error_intr sts:%x\n", sts); + SEND_STDOUT_CTRL(0x1); + while(1); + } +} + +inline void service_soc_ifc_notif_intr () { + uint32_t * reg = (uint32_t *) (CLP_SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R); + uint32_t sts = *reg; + /* Write 1 to Clear the pending interrupt */ + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_AVAIL_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_AVAIL_STS_MASK; + cptra_intr_rcv.soc_ifc_notif |= SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_AVAIL_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_MBOX_ECC_COR_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_MBOX_ECC_COR_STS_MASK; + cptra_intr_rcv.soc_ifc_notif |= SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_MBOX_ECC_COR_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_DEBUG_LOCKED_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_DEBUG_LOCKED_STS_MASK; + cptra_intr_rcv.soc_ifc_notif |= SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_DEBUG_LOCKED_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_SCAN_MODE_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_SCAN_MODE_STS_MASK; + cptra_intr_rcv.soc_ifc_notif |= SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_SCAN_MODE_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_SOC_REQ_LOCK_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_SOC_REQ_LOCK_STS_MASK; + cptra_intr_rcv.soc_ifc_notif |= SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_SOC_REQ_LOCK_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_GEN_IN_TOGGLE_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_GEN_IN_TOGGLE_STS_MASK; + cptra_intr_rcv.soc_ifc_notif |= SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_GEN_IN_TOGGLE_STS_MASK; + } + if (sts == 0) { + VPRINTF(ERROR,"bad soc_ifc_notif_intr sts:%x\n", sts); + SEND_STDOUT_CTRL(0x1); + while(1); + } +} + +inline void service_sha512_acc_error_intr() {return;} +inline void service_sha512_acc_notif_intr() { + uint32_t * reg = (uint32_t *) (CLP_SHA512_ACC_CSR_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R); + uint32_t sts = *reg; + /* Write 1 to Clear the pending interrupt */ + if (sts & SHA512_ACC_CSR_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK) { + *reg = SHA512_ACC_CSR_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + cptra_intr_rcv.sha512_acc_notif |= SHA512_ACC_CSR_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + } + if (sts == 0) { + VPRINTF(ERROR,"bad sha512_acc_notif_intr sts:%x\n", sts); + SEND_STDOUT_CTRL(0x1); + while(1); + } +} #endif //CALIPTRA_ISR_H diff --git a/src/integration/test_suites/smoke_test_kv_uds_reset/smoke_test_kv_uds_reset.c b/src/integration/test_suites/smoke_test_kv_uds_reset/smoke_test_kv_uds_reset.c index be5e0646b..829b5a4d0 100644 --- a/src/integration/test_suites/smoke_test_kv_uds_reset/smoke_test_kv_uds_reset.c +++ b/src/integration/test_suites/smoke_test_kv_uds_reset/smoke_test_kv_uds_reset.c @@ -29,6 +29,31 @@ volatile uint32_t rst_count __attribute__((section(".dccm.persistent"))) = 0; enum printf_verbosity verbosity_g = LOW; #endif +volatile caliptra_intr_received_s cptra_intr_rcv = { + .doe_error = 0, + .doe_notif = 0, + .ecc_error = 0, + .ecc_notif = 0, + .hmac_error = 0, + .hmac_notif = 0, + .kv_error = 0, + .kv_notif = 0, + .sha512_error = 0, + .sha512_notif = 0, + .sha256_error = 0, + .sha256_notif = 0, + .qspi_error = 0, + .qspi_notif = 0, + .uart_error = 0, + .uart_notif = 0, + .i3c_error = 0, + .i3c_notif = 0, + .soc_ifc_error = 0, + .soc_ifc_notif = 0, + .sha512_acc_error = 0, + .sha512_acc_notif = 0, +}; + uint32_t IV_DATA_UDS0 = 0x2eb94297; uint32_t IV_DATA_UDS1 = 0x77285196; uint32_t IV_DATA_UDS2 = 0x3dd39a1e; diff --git a/src/integration/test_suites/smoke_test_mbox/caliptra_isr.h b/src/integration/test_suites/smoke_test_mbox/caliptra_isr.h new file mode 100644 index 000000000..8f5779e04 --- /dev/null +++ b/src/integration/test_suites/smoke_test_mbox/caliptra_isr.h @@ -0,0 +1,247 @@ +// SPDX-License-Identifier: Apache-2.0 +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// --------------------------------------------------------------------- +// File: caliptra_isr.h +// Description: +// Provides function declarations for use by external test files, so +// that the ISR functionality may behave like a library. +// TODO: +// This header file includes inline function definitions for event and +// test specific interrupt service behavior, so it should be copied and +// modified for each test. +// --------------------------------------------------------------------- + +#ifndef CALIPTRA_ISR_H + #define CALIPTRA_ISR_H + +#define EN_ISR_PRINTS 1 + +#include "caliptra_defines.h" +#include +#include "printf.h" + +/* --------------- symbols/typedefs --------------- */ +typedef struct { + uint32_t doe_error; + uint32_t doe_notif; + uint32_t ecc_error; + uint32_t ecc_notif; + uint32_t hmac_error; + uint32_t hmac_notif; + uint32_t kv_error; + uint32_t kv_notif; + uint32_t sha512_error; + uint32_t sha512_notif; + uint32_t sha256_error; + uint32_t sha256_notif; + uint32_t qspi_error; + uint32_t qspi_notif; + uint32_t uart_error; + uint32_t uart_notif; + uint32_t i3c_error; + uint32_t i3c_notif; + uint32_t soc_ifc_error; + uint32_t soc_ifc_notif; + uint32_t sha512_acc_error; + uint32_t sha512_acc_notif; +} caliptra_intr_received_s; +extern volatile caliptra_intr_received_s cptra_intr_rcv; + +////////////////////////////////////////////////////////////////////////////// +// Function Declarations +// + +// Performs all the CSR setup to configure and enable vectored external interrupts +void init_interrupts(void); + +// These inline functions are used to insert event-specific functionality into the +// otherwise generic ISR that gets laid down by the parameterized macro "nonstd_veer_isr" +inline void service_doe_error_intr() {return;} +inline void service_doe_notif_intr() { + uint32_t * reg = (uint32_t *) (CLP_DOE_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R); + uint32_t sts = *reg; + /* Write 1 to Clear the pending interrupt */ + if (sts & DOE_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK) { + *reg = DOE_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + cptra_intr_rcv.doe_notif |= DOE_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + } + if (sts == 0) { + VPRINTF(ERROR,"bad doe_notif_intr sts:%x\n", sts); + SEND_STDOUT_CTRL(0x1); + while(1); + } +} + +inline void service_ecc_error_intr() {return;} +inline void service_ecc_notif_intr() { + uint32_t * reg = (uint32_t *) (CLP_ECC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R); + uint32_t sts = *reg; + /* Write 1 to Clear the pending interrupt */ + if (sts & ECC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK) { + *reg = ECC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + cptra_intr_rcv.ecc_notif |= ECC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + } + if (sts == 0) { + VPRINTF(ERROR,"bad ecc_notif_intr sts:%x\n", sts); + SEND_STDOUT_CTRL(0x1); + while(1); + } +} + +inline void service_hmac_error_intr() {return;} +inline void service_hmac_notif_intr() { + uint32_t * reg = (uint32_t *) (CLP_HMAC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R); + uint32_t sts = *reg; + /* Write 1 to Clear the pending interrupt */ + if (sts & HMAC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK) { + *reg = HMAC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + cptra_intr_rcv.hmac_notif |= HMAC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + } + if (sts == 0) { + VPRINTF(ERROR,"bad hmac_notif_intr sts:%x\n", sts); + SEND_STDOUT_CTRL(0x1); + while(1); + } +} + +inline void service_kv_error_intr() {return;} +inline void service_kv_notif_intr() {return;} +inline void service_sha512_error_intr() {return;} +inline void service_sha512_notif_intr() { + uint32_t * reg = (uint32_t *) (CLP_SHA512_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R); + uint32_t sts = *reg; + /* Write 1 to Clear the pending interrupt */ + if (sts & SHA512_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK) { + *reg = SHA512_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + cptra_intr_rcv.sha512_notif |= SHA512_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + } + if (sts == 0) { + VPRINTF(ERROR,"bad sha512_notif_intr sts:%x\n", sts); + SEND_STDOUT_CTRL(0x1); + while(1); + } +} + +inline void service_sha256_error_intr() {return;} +inline void service_sha256_notif_intr() { + uint32_t * reg = (uint32_t *) (CLP_SHA256_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R); + uint32_t sts = *reg; + /* Write 1 to Clear the pending interrupt */ + if (sts & SHA256_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK) { + *reg = SHA256_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + cptra_intr_rcv.sha256_notif |= SHA256_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + } + if (sts == 0) { + VPRINTF(ERROR,"bad sha256_notif_intr sts:%x\n", sts); + SEND_STDOUT_CTRL(0x1); + while(1); + } +} + +inline void service_qspi_error_intr() {return;} +inline void service_qspi_notif_intr() {return;} +inline void service_uart_error_intr() {return;} +inline void service_uart_notif_intr() {return;} +inline void service_i3c_error_intr() {return;} +inline void service_i3c_notif_intr() {return;} + +inline void service_soc_ifc_error_intr() { + uint32_t * reg = (uint32_t *) (CLP_SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R); + uint32_t sts = *reg; + /* Write 1 to Clear the pending interrupt */ + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_INTERNAL_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_INTERNAL_STS_MASK; + cptra_intr_rcv.soc_ifc_error |= SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_INTERNAL_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_INV_DEV_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_INV_DEV_STS_MASK; + cptra_intr_rcv.soc_ifc_error |= SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_INV_DEV_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_CMD_FAIL_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_CMD_FAIL_STS_MASK; + cptra_intr_rcv.soc_ifc_error |= SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_CMD_FAIL_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_BAD_FUSE_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_BAD_FUSE_STS_MASK; + cptra_intr_rcv.soc_ifc_error |= SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_BAD_FUSE_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_ICCM_BLOCKED_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_ICCM_BLOCKED_STS_MASK; + cptra_intr_rcv.soc_ifc_error |= SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_ICCM_BLOCKED_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_MBOX_ECC_UNC_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_MBOX_ECC_UNC_STS_MASK; + cptra_intr_rcv.soc_ifc_error |= SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_MBOX_ECC_UNC_STS_MASK; + } + if (sts == 0) { + VPRINTF(ERROR,"bad soc_ifc_error_intr sts:%x\n", sts); + SEND_STDOUT_CTRL(0x1); + while(1); + } +} + +inline void service_soc_ifc_notif_intr () { + uint32_t * reg = (uint32_t *) (CLP_SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R); + uint32_t sts = *reg; + /* Write 1 to Clear the pending interrupt */ + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_AVAIL_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_AVAIL_STS_MASK; + cptra_intr_rcv.soc_ifc_notif |= SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_AVAIL_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_MBOX_ECC_COR_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_MBOX_ECC_COR_STS_MASK; + cptra_intr_rcv.soc_ifc_notif |= SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_MBOX_ECC_COR_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_DEBUG_LOCKED_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_DEBUG_LOCKED_STS_MASK; + cptra_intr_rcv.soc_ifc_notif |= SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_DEBUG_LOCKED_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_SCAN_MODE_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_SCAN_MODE_STS_MASK; + cptra_intr_rcv.soc_ifc_notif |= SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_SCAN_MODE_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_SOC_REQ_LOCK_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_SOC_REQ_LOCK_STS_MASK; + cptra_intr_rcv.soc_ifc_notif |= SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_SOC_REQ_LOCK_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_GEN_IN_TOGGLE_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_GEN_IN_TOGGLE_STS_MASK; + cptra_intr_rcv.soc_ifc_notif |= SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_GEN_IN_TOGGLE_STS_MASK; + } + if (sts == 0) { + VPRINTF(ERROR,"bad soc_ifc_notif_intr sts:%x\n", sts); + SEND_STDOUT_CTRL(0x1); + while(1); + } +} + +inline void service_sha512_acc_error_intr() {return;} +inline void service_sha512_acc_notif_intr() { + uint32_t * reg = (uint32_t *) (CLP_SHA512_ACC_CSR_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R); + uint32_t sts = *reg; + /* Write 1 to Clear the pending interrupt */ + if (sts & SHA512_ACC_CSR_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK) { + *reg = SHA512_ACC_CSR_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + cptra_intr_rcv.sha512_acc_notif |= SHA512_ACC_CSR_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + } + if (sts == 0) { + VPRINTF(ERROR,"bad sha512_acc_notif_intr sts:%x\n", sts); + SEND_STDOUT_CTRL(0x1); + while(1); + } +} + + +#endif //CALIPTRA_ISR_H diff --git a/src/integration/test_suites/smoke_test_mbox/smoke_test_mbox.c b/src/integration/test_suites/smoke_test_mbox/smoke_test_mbox.c index 5494e5a32..1ad31280c 100644 --- a/src/integration/test_suites/smoke_test_mbox/smoke_test_mbox.c +++ b/src/integration/test_suites/smoke_test_mbox/smoke_test_mbox.c @@ -17,6 +17,7 @@ #include "soc_ifc.h" #include #include "printf.h" +#include "caliptra_isr.h" volatile char* stdout = (char *)STDOUT; volatile uint32_t intr_count = 0; @@ -28,6 +29,31 @@ volatile uint32_t intr_count = 0; #define MBOX_DLEN_VAL 0x00000020 +volatile caliptra_intr_received_s cptra_intr_rcv = { + .doe_error = 0, + .doe_notif = 0, + .ecc_error = 0, + .ecc_notif = 0, + .hmac_error = 0, + .hmac_notif = 0, + .kv_error = 0, + .kv_notif = 0, + .sha512_error = 0, + .sha512_notif = 0, + .sha256_error = 0, + .sha256_notif = 0, + .qspi_error = 0, + .qspi_notif = 0, + .uart_error = 0, + .uart_notif = 0, + .i3c_error = 0, + .i3c_notif = 0, + .soc_ifc_error = 0, + .soc_ifc_notif = 0, + .sha512_acc_error = 0, + .sha512_acc_notif = 0, +}; + void main () { mbox_op_s op; @@ -95,6 +121,10 @@ void main () { VPRINTF(LOW, "FW: Mailbox in expected state, MBOX_EXECUTE_SOC, ending test with success\n"); } + //Wait for SoC to reset execute reg + VPRINTF(LOW, "FW: Wait for SoC to reset execute register\n"); + while((lsu_read_32(CLP_MBOX_CSR_MBOX_EXECUTE) & MBOX_CSR_MBOX_EXECUTE_EXECUTE_MASK) == 1); + //Force unlock lsu_write_32(CLP_MBOX_CSR_MBOX_UNLOCK, MBOX_CSR_MBOX_UNLOCK_UNLOCK_MASK); diff --git a/src/integration/test_suites/smoke_test_mbox_cg/caliptra_isr.h b/src/integration/test_suites/smoke_test_mbox_cg/caliptra_isr.h new file mode 100644 index 000000000..8f5779e04 --- /dev/null +++ b/src/integration/test_suites/smoke_test_mbox_cg/caliptra_isr.h @@ -0,0 +1,247 @@ +// SPDX-License-Identifier: Apache-2.0 +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// --------------------------------------------------------------------- +// File: caliptra_isr.h +// Description: +// Provides function declarations for use by external test files, so +// that the ISR functionality may behave like a library. +// TODO: +// This header file includes inline function definitions for event and +// test specific interrupt service behavior, so it should be copied and +// modified for each test. +// --------------------------------------------------------------------- + +#ifndef CALIPTRA_ISR_H + #define CALIPTRA_ISR_H + +#define EN_ISR_PRINTS 1 + +#include "caliptra_defines.h" +#include +#include "printf.h" + +/* --------------- symbols/typedefs --------------- */ +typedef struct { + uint32_t doe_error; + uint32_t doe_notif; + uint32_t ecc_error; + uint32_t ecc_notif; + uint32_t hmac_error; + uint32_t hmac_notif; + uint32_t kv_error; + uint32_t kv_notif; + uint32_t sha512_error; + uint32_t sha512_notif; + uint32_t sha256_error; + uint32_t sha256_notif; + uint32_t qspi_error; + uint32_t qspi_notif; + uint32_t uart_error; + uint32_t uart_notif; + uint32_t i3c_error; + uint32_t i3c_notif; + uint32_t soc_ifc_error; + uint32_t soc_ifc_notif; + uint32_t sha512_acc_error; + uint32_t sha512_acc_notif; +} caliptra_intr_received_s; +extern volatile caliptra_intr_received_s cptra_intr_rcv; + +////////////////////////////////////////////////////////////////////////////// +// Function Declarations +// + +// Performs all the CSR setup to configure and enable vectored external interrupts +void init_interrupts(void); + +// These inline functions are used to insert event-specific functionality into the +// otherwise generic ISR that gets laid down by the parameterized macro "nonstd_veer_isr" +inline void service_doe_error_intr() {return;} +inline void service_doe_notif_intr() { + uint32_t * reg = (uint32_t *) (CLP_DOE_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R); + uint32_t sts = *reg; + /* Write 1 to Clear the pending interrupt */ + if (sts & DOE_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK) { + *reg = DOE_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + cptra_intr_rcv.doe_notif |= DOE_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + } + if (sts == 0) { + VPRINTF(ERROR,"bad doe_notif_intr sts:%x\n", sts); + SEND_STDOUT_CTRL(0x1); + while(1); + } +} + +inline void service_ecc_error_intr() {return;} +inline void service_ecc_notif_intr() { + uint32_t * reg = (uint32_t *) (CLP_ECC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R); + uint32_t sts = *reg; + /* Write 1 to Clear the pending interrupt */ + if (sts & ECC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK) { + *reg = ECC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + cptra_intr_rcv.ecc_notif |= ECC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + } + if (sts == 0) { + VPRINTF(ERROR,"bad ecc_notif_intr sts:%x\n", sts); + SEND_STDOUT_CTRL(0x1); + while(1); + } +} + +inline void service_hmac_error_intr() {return;} +inline void service_hmac_notif_intr() { + uint32_t * reg = (uint32_t *) (CLP_HMAC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R); + uint32_t sts = *reg; + /* Write 1 to Clear the pending interrupt */ + if (sts & HMAC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK) { + *reg = HMAC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + cptra_intr_rcv.hmac_notif |= HMAC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + } + if (sts == 0) { + VPRINTF(ERROR,"bad hmac_notif_intr sts:%x\n", sts); + SEND_STDOUT_CTRL(0x1); + while(1); + } +} + +inline void service_kv_error_intr() {return;} +inline void service_kv_notif_intr() {return;} +inline void service_sha512_error_intr() {return;} +inline void service_sha512_notif_intr() { + uint32_t * reg = (uint32_t *) (CLP_SHA512_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R); + uint32_t sts = *reg; + /* Write 1 to Clear the pending interrupt */ + if (sts & SHA512_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK) { + *reg = SHA512_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + cptra_intr_rcv.sha512_notif |= SHA512_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + } + if (sts == 0) { + VPRINTF(ERROR,"bad sha512_notif_intr sts:%x\n", sts); + SEND_STDOUT_CTRL(0x1); + while(1); + } +} + +inline void service_sha256_error_intr() {return;} +inline void service_sha256_notif_intr() { + uint32_t * reg = (uint32_t *) (CLP_SHA256_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R); + uint32_t sts = *reg; + /* Write 1 to Clear the pending interrupt */ + if (sts & SHA256_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK) { + *reg = SHA256_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + cptra_intr_rcv.sha256_notif |= SHA256_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + } + if (sts == 0) { + VPRINTF(ERROR,"bad sha256_notif_intr sts:%x\n", sts); + SEND_STDOUT_CTRL(0x1); + while(1); + } +} + +inline void service_qspi_error_intr() {return;} +inline void service_qspi_notif_intr() {return;} +inline void service_uart_error_intr() {return;} +inline void service_uart_notif_intr() {return;} +inline void service_i3c_error_intr() {return;} +inline void service_i3c_notif_intr() {return;} + +inline void service_soc_ifc_error_intr() { + uint32_t * reg = (uint32_t *) (CLP_SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R); + uint32_t sts = *reg; + /* Write 1 to Clear the pending interrupt */ + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_INTERNAL_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_INTERNAL_STS_MASK; + cptra_intr_rcv.soc_ifc_error |= SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_INTERNAL_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_INV_DEV_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_INV_DEV_STS_MASK; + cptra_intr_rcv.soc_ifc_error |= SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_INV_DEV_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_CMD_FAIL_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_CMD_FAIL_STS_MASK; + cptra_intr_rcv.soc_ifc_error |= SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_CMD_FAIL_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_BAD_FUSE_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_BAD_FUSE_STS_MASK; + cptra_intr_rcv.soc_ifc_error |= SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_BAD_FUSE_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_ICCM_BLOCKED_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_ICCM_BLOCKED_STS_MASK; + cptra_intr_rcv.soc_ifc_error |= SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_ICCM_BLOCKED_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_MBOX_ECC_UNC_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_MBOX_ECC_UNC_STS_MASK; + cptra_intr_rcv.soc_ifc_error |= SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_MBOX_ECC_UNC_STS_MASK; + } + if (sts == 0) { + VPRINTF(ERROR,"bad soc_ifc_error_intr sts:%x\n", sts); + SEND_STDOUT_CTRL(0x1); + while(1); + } +} + +inline void service_soc_ifc_notif_intr () { + uint32_t * reg = (uint32_t *) (CLP_SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R); + uint32_t sts = *reg; + /* Write 1 to Clear the pending interrupt */ + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_AVAIL_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_AVAIL_STS_MASK; + cptra_intr_rcv.soc_ifc_notif |= SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_AVAIL_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_MBOX_ECC_COR_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_MBOX_ECC_COR_STS_MASK; + cptra_intr_rcv.soc_ifc_notif |= SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_MBOX_ECC_COR_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_DEBUG_LOCKED_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_DEBUG_LOCKED_STS_MASK; + cptra_intr_rcv.soc_ifc_notif |= SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_DEBUG_LOCKED_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_SCAN_MODE_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_SCAN_MODE_STS_MASK; + cptra_intr_rcv.soc_ifc_notif |= SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_SCAN_MODE_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_SOC_REQ_LOCK_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_SOC_REQ_LOCK_STS_MASK; + cptra_intr_rcv.soc_ifc_notif |= SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_SOC_REQ_LOCK_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_GEN_IN_TOGGLE_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_GEN_IN_TOGGLE_STS_MASK; + cptra_intr_rcv.soc_ifc_notif |= SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_GEN_IN_TOGGLE_STS_MASK; + } + if (sts == 0) { + VPRINTF(ERROR,"bad soc_ifc_notif_intr sts:%x\n", sts); + SEND_STDOUT_CTRL(0x1); + while(1); + } +} + +inline void service_sha512_acc_error_intr() {return;} +inline void service_sha512_acc_notif_intr() { + uint32_t * reg = (uint32_t *) (CLP_SHA512_ACC_CSR_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R); + uint32_t sts = *reg; + /* Write 1 to Clear the pending interrupt */ + if (sts & SHA512_ACC_CSR_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK) { + *reg = SHA512_ACC_CSR_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + cptra_intr_rcv.sha512_acc_notif |= SHA512_ACC_CSR_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + } + if (sts == 0) { + VPRINTF(ERROR,"bad sha512_acc_notif_intr sts:%x\n", sts); + SEND_STDOUT_CTRL(0x1); + while(1); + } +} + + +#endif //CALIPTRA_ISR_H diff --git a/src/integration/test_suites/smoke_test_mbox_cg/smoke_test_mbox_cg.c b/src/integration/test_suites/smoke_test_mbox_cg/smoke_test_mbox_cg.c new file mode 100644 index 000000000..9697d6e71 --- /dev/null +++ b/src/integration/test_suites/smoke_test_mbox_cg/smoke_test_mbox_cg.c @@ -0,0 +1,198 @@ +// SPDX-License-Identifier: Apache-2.0 +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +#include "caliptra_defines.h" +#include "riscv_hw_if.h" +#include "soc_ifc.h" +#include +#include "printf.h" +#include "caliptra_isr.h" +#include "clk_gate.h" + +volatile char* stdout = (char *)STDOUT; +volatile uint32_t intr_count = 0; +#ifdef CPT_VERBOSITY + enum printf_verbosity verbosity_g = CPT_VERBOSITY; +#else + enum printf_verbosity verbosity_g = LOW; +#endif + +#define MBOX_DLEN_VAL 0x00000020 + +volatile caliptra_intr_received_s cptra_intr_rcv = { + .doe_error = 0, + .doe_notif = 0, + .ecc_error = 0, + .ecc_notif = 0, + .hmac_error = 0, + .hmac_notif = 0, + .kv_error = 0, + .kv_notif = 0, + .sha512_error = 0, + .sha512_notif = 0, + .sha256_error = 0, + .sha256_notif = 0, + .qspi_error = 0, + .qspi_notif = 0, + .uart_error = 0, + .uart_notif = 0, + .i3c_error = 0, + .i3c_notif = 0, + .soc_ifc_error = 0, + .soc_ifc_notif = 0, + .sha512_acc_error = 0, + .sha512_acc_notif = 0, +}; + +void main () { + + mbox_op_s op; + uint32_t ii; + uint32_t data; + enum mbox_fsm_e state; + uint32_t mbox_data[] = { 0x00000000, + 0x11111111, + 0x22222222, + 0x33333333, + 0x44444444, + 0x55555555, + 0x66666666, + 0x77777777 }; + uint32_t read_data; + + uint32_t mitb0 = 0x000000F0; + uint32_t mie_timer0_ext_int_en = 0x20000800; + + // Message + VPRINTF(LOW, "----------------------------------\n"); + VPRINTF(LOW, " Caliptra Mailbox Smoke Test!!\n" ); + VPRINTF(LOW, "----------------------------------\n"); + + // Call interrupt init + init_interrupts(); + + //Enable clk gating + SEND_STDOUT_CTRL(0xf2); + + //set ready for FW so tb will push FW + soc_ifc_set_flow_status_field(SOC_IFC_REG_CPTRA_FLOW_STATUS_READY_FOR_FW_MASK); + + set_mit0_and_halt_core(mitb0, mie_timer0_ext_int_en); + + //wait for mailbox data avail + VPRINTF(LOW, "FW: Wait\n"); + while((lsu_read_32(CLP_MBOX_CSR_MBOX_EXECUTE) & MBOX_CSR_MBOX_EXECUTE_EXECUTE_MASK) != MBOX_CSR_MBOX_EXECUTE_EXECUTE_MASK); + + set_mit0_and_halt_core(mitb0, mie_timer0_ext_int_en); + + //read mbox command + op = soc_ifc_read_mbox_cmd(); + + //read from mbox + VPRINTF(LOW, "FW: Reading %d bytes from mailbox\n", op.dlen); + while(op.dlen) { + data = soc_ifc_mbox_read_dataout_single(); + VPRINTF(HIGH, " dataout: 0x%x\n", data); + if (op.dlen < 4) { + op.dlen=0; + } else { + op.dlen-=4;//sizeof(uint32_t); + } + } + + //push new data in like a response + VPRINTF(LOW, "FW: Writing %d bytes to mailbox\n", MBOX_DLEN_VAL); + for (ii = 0; ii < MBOX_DLEN_VAL/4; ii++) { + VPRINTF(HIGH, " datain: 0x%x\n", mbox_data[ii]); + lsu_write_32(CLP_MBOX_CSR_MBOX_DATAIN,mbox_data[ii]); + } + + //set data ready status + VPRINTF(LOW, "FW: Set data ready status\n"); + lsu_write_32(CLP_MBOX_CSR_MBOX_STATUS,DATA_READY); + + //Halt core while SoC is executing mbox flow + set_mit0_and_halt_core(mitb0, mie_timer0_ext_int_en); + + //check FSM state, should be in EXECUTE_SOC + state = (lsu_read_32(CLP_MBOX_CSR_MBOX_STATUS) & MBOX_CSR_MBOX_STATUS_MBOX_FSM_PS_MASK) >> MBOX_CSR_MBOX_STATUS_MBOX_FSM_PS_LOW; + if (state != MBOX_EXECUTE_SOC) { + VPRINTF(ERROR, "ERROR: mailbox in unexpected state (%x) when expecting MBOX_EXECUTE_SOC (0x%x)\n", state, MBOX_EXECUTE_SOC); + SEND_STDOUT_CTRL( 0x1); + while(1); + } else { + VPRINTF(LOW, "FW: Mailbox in expected state, MBOX_EXECUTE_SOC, ending test with success\n"); + } + +//-------------------------------------------------------------------------------------------- + //Wait for SoC to reset execute reg + VPRINTF(LOW, "FW: Wait for SoC to reset execute register\n"); + while((lsu_read_32(CLP_MBOX_CSR_MBOX_EXECUTE) & MBOX_CSR_MBOX_EXECUTE_EXECUTE_MASK) == 1); + + //Force unlock + lsu_write_32(CLP_MBOX_CSR_MBOX_UNLOCK, MBOX_CSR_MBOX_UNLOCK_UNLOCK_MASK); + + set_mit0_and_halt_core(mitb0, mie_timer0_ext_int_en); + + //poll for mbox lock + while((lsu_read_32(CLP_MBOX_CSR_MBOX_LOCK) & MBOX_CSR_MBOX_LOCK_LOCK_MASK) == 1); + + set_mit0_and_halt_core(mitb0, mie_timer0_ext_int_en); + + //write command + lsu_write_32(CLP_MBOX_CSR_MBOX_CMD,0x12345678); + + set_mit0_and_halt_core(mitb0, mie_timer0_ext_int_en); + + //write dlen + lsu_write_32(CLP_MBOX_CSR_MBOX_DLEN,MBOX_DLEN_VAL); + + set_mit0_and_halt_core(mitb0, mie_timer0_ext_int_en); + + //write datain + VPRINTF(LOW, "FW: Writing %d bytes to mailbox\n", MBOX_DLEN_VAL); + for (ii = 0; ii < MBOX_DLEN_VAL/4; ii++) { + VPRINTF(HIGH, " datain: 0x%x\n", mbox_data[ii]); + lsu_write_32(CLP_MBOX_CSR_MBOX_DATAIN,mbox_data[ii]); + } + + set_mit0_and_halt_core(mitb0, mie_timer0_ext_int_en); + + //set execute + lsu_write_32(CLP_MBOX_CSR_MBOX_EXECUTE, MBOX_CSR_MBOX_EXECUTE_EXECUTE_MASK); + + set_mit0_and_halt_core(mitb0, mie_timer0_ext_int_en); + + //Poll status until data ready is set + while((lsu_read_32(CLP_MBOX_CSR_MBOX_STATUS) & MBOX_CSR_MBOX_STATUS_STATUS_MASK) != DATA_READY); + + set_mit0_and_halt_core(mitb0, mie_timer0_ext_int_en); + + //check data + VPRINTF(LOW, "FW: Checking %d bytes from mailbox as if return data\n", MBOX_DLEN_VAL); + for (ii = 0; ii < MBOX_DLEN_VAL/4; ii++) { + if (ii % 4 == 0){ + set_mit0_and_halt_core(mitb0, mie_timer0_ext_int_en); + } + VPRINTF(HIGH, " datain: 0x%x\n", mbox_data[ii]); + read_data = lsu_read_32(CLP_MBOX_CSR_MBOX_DATAOUT); + if (read_data != mbox_data[ii]) { + VPRINTF(ERROR, "ERROR: mailbox data mismatch actual (0x%x) expected (0x%x)\n", read_data, mbox_data[ii]); + SEND_STDOUT_CTRL( 0x1); + while(1); + }; + } + + set_mit0_and_halt_core(mitb0, mie_timer0_ext_int_en); +} diff --git a/src/integration/test_suites/smoke_test_mbox_cg/smoke_test_mbox_cg.yml b/src/integration/test_suites/smoke_test_mbox_cg/smoke_test_mbox_cg.yml new file mode 100755 index 000000000..9d8ef527c --- /dev/null +++ b/src/integration/test_suites/smoke_test_mbox_cg/smoke_test_mbox_cg.yml @@ -0,0 +1,17 @@ +# SPDX-License-Identifier: Apache-2.0 +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +--- +seed: 1 +testname: smoke_test_mbox_cg diff --git a/src/integration/test_suites/smoke_test_pcr_signing/caliptra_isr.h b/src/integration/test_suites/smoke_test_pcr_signing/caliptra_isr.h index 6ffd71c0a..8f5779e04 100644 --- a/src/integration/test_suites/smoke_test_pcr_signing/caliptra_isr.h +++ b/src/integration/test_suites/smoke_test_pcr_signing/caliptra_isr.h @@ -204,6 +204,22 @@ inline void service_soc_ifc_notif_intr () { *reg = SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_MBOX_ECC_COR_STS_MASK; cptra_intr_rcv.soc_ifc_notif |= SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_MBOX_ECC_COR_STS_MASK; } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_DEBUG_LOCKED_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_DEBUG_LOCKED_STS_MASK; + cptra_intr_rcv.soc_ifc_notif |= SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_DEBUG_LOCKED_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_SCAN_MODE_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_SCAN_MODE_STS_MASK; + cptra_intr_rcv.soc_ifc_notif |= SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_SCAN_MODE_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_SOC_REQ_LOCK_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_SOC_REQ_LOCK_STS_MASK; + cptra_intr_rcv.soc_ifc_notif |= SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_SOC_REQ_LOCK_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_GEN_IN_TOGGLE_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_GEN_IN_TOGGLE_STS_MASK; + cptra_intr_rcv.soc_ifc_notif |= SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_GEN_IN_TOGGLE_STS_MASK; + } if (sts == 0) { VPRINTF(ERROR,"bad soc_ifc_notif_intr sts:%x\n", sts); SEND_STDOUT_CTRL(0x1); diff --git a/src/integration/test_suites/smoke_test_pcr_zeroize/caliptra_isr.h b/src/integration/test_suites/smoke_test_pcr_zeroize/caliptra_isr.h new file mode 100644 index 000000000..8f5779e04 --- /dev/null +++ b/src/integration/test_suites/smoke_test_pcr_zeroize/caliptra_isr.h @@ -0,0 +1,247 @@ +// SPDX-License-Identifier: Apache-2.0 +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// --------------------------------------------------------------------- +// File: caliptra_isr.h +// Description: +// Provides function declarations for use by external test files, so +// that the ISR functionality may behave like a library. +// TODO: +// This header file includes inline function definitions for event and +// test specific interrupt service behavior, so it should be copied and +// modified for each test. +// --------------------------------------------------------------------- + +#ifndef CALIPTRA_ISR_H + #define CALIPTRA_ISR_H + +#define EN_ISR_PRINTS 1 + +#include "caliptra_defines.h" +#include +#include "printf.h" + +/* --------------- symbols/typedefs --------------- */ +typedef struct { + uint32_t doe_error; + uint32_t doe_notif; + uint32_t ecc_error; + uint32_t ecc_notif; + uint32_t hmac_error; + uint32_t hmac_notif; + uint32_t kv_error; + uint32_t kv_notif; + uint32_t sha512_error; + uint32_t sha512_notif; + uint32_t sha256_error; + uint32_t sha256_notif; + uint32_t qspi_error; + uint32_t qspi_notif; + uint32_t uart_error; + uint32_t uart_notif; + uint32_t i3c_error; + uint32_t i3c_notif; + uint32_t soc_ifc_error; + uint32_t soc_ifc_notif; + uint32_t sha512_acc_error; + uint32_t sha512_acc_notif; +} caliptra_intr_received_s; +extern volatile caliptra_intr_received_s cptra_intr_rcv; + +////////////////////////////////////////////////////////////////////////////// +// Function Declarations +// + +// Performs all the CSR setup to configure and enable vectored external interrupts +void init_interrupts(void); + +// These inline functions are used to insert event-specific functionality into the +// otherwise generic ISR that gets laid down by the parameterized macro "nonstd_veer_isr" +inline void service_doe_error_intr() {return;} +inline void service_doe_notif_intr() { + uint32_t * reg = (uint32_t *) (CLP_DOE_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R); + uint32_t sts = *reg; + /* Write 1 to Clear the pending interrupt */ + if (sts & DOE_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK) { + *reg = DOE_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + cptra_intr_rcv.doe_notif |= DOE_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + } + if (sts == 0) { + VPRINTF(ERROR,"bad doe_notif_intr sts:%x\n", sts); + SEND_STDOUT_CTRL(0x1); + while(1); + } +} + +inline void service_ecc_error_intr() {return;} +inline void service_ecc_notif_intr() { + uint32_t * reg = (uint32_t *) (CLP_ECC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R); + uint32_t sts = *reg; + /* Write 1 to Clear the pending interrupt */ + if (sts & ECC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK) { + *reg = ECC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + cptra_intr_rcv.ecc_notif |= ECC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + } + if (sts == 0) { + VPRINTF(ERROR,"bad ecc_notif_intr sts:%x\n", sts); + SEND_STDOUT_CTRL(0x1); + while(1); + } +} + +inline void service_hmac_error_intr() {return;} +inline void service_hmac_notif_intr() { + uint32_t * reg = (uint32_t *) (CLP_HMAC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R); + uint32_t sts = *reg; + /* Write 1 to Clear the pending interrupt */ + if (sts & HMAC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK) { + *reg = HMAC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + cptra_intr_rcv.hmac_notif |= HMAC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + } + if (sts == 0) { + VPRINTF(ERROR,"bad hmac_notif_intr sts:%x\n", sts); + SEND_STDOUT_CTRL(0x1); + while(1); + } +} + +inline void service_kv_error_intr() {return;} +inline void service_kv_notif_intr() {return;} +inline void service_sha512_error_intr() {return;} +inline void service_sha512_notif_intr() { + uint32_t * reg = (uint32_t *) (CLP_SHA512_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R); + uint32_t sts = *reg; + /* Write 1 to Clear the pending interrupt */ + if (sts & SHA512_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK) { + *reg = SHA512_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + cptra_intr_rcv.sha512_notif |= SHA512_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + } + if (sts == 0) { + VPRINTF(ERROR,"bad sha512_notif_intr sts:%x\n", sts); + SEND_STDOUT_CTRL(0x1); + while(1); + } +} + +inline void service_sha256_error_intr() {return;} +inline void service_sha256_notif_intr() { + uint32_t * reg = (uint32_t *) (CLP_SHA256_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R); + uint32_t sts = *reg; + /* Write 1 to Clear the pending interrupt */ + if (sts & SHA256_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK) { + *reg = SHA256_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + cptra_intr_rcv.sha256_notif |= SHA256_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + } + if (sts == 0) { + VPRINTF(ERROR,"bad sha256_notif_intr sts:%x\n", sts); + SEND_STDOUT_CTRL(0x1); + while(1); + } +} + +inline void service_qspi_error_intr() {return;} +inline void service_qspi_notif_intr() {return;} +inline void service_uart_error_intr() {return;} +inline void service_uart_notif_intr() {return;} +inline void service_i3c_error_intr() {return;} +inline void service_i3c_notif_intr() {return;} + +inline void service_soc_ifc_error_intr() { + uint32_t * reg = (uint32_t *) (CLP_SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R); + uint32_t sts = *reg; + /* Write 1 to Clear the pending interrupt */ + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_INTERNAL_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_INTERNAL_STS_MASK; + cptra_intr_rcv.soc_ifc_error |= SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_INTERNAL_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_INV_DEV_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_INV_DEV_STS_MASK; + cptra_intr_rcv.soc_ifc_error |= SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_INV_DEV_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_CMD_FAIL_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_CMD_FAIL_STS_MASK; + cptra_intr_rcv.soc_ifc_error |= SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_CMD_FAIL_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_BAD_FUSE_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_BAD_FUSE_STS_MASK; + cptra_intr_rcv.soc_ifc_error |= SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_BAD_FUSE_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_ICCM_BLOCKED_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_ICCM_BLOCKED_STS_MASK; + cptra_intr_rcv.soc_ifc_error |= SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_ICCM_BLOCKED_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_MBOX_ECC_UNC_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_MBOX_ECC_UNC_STS_MASK; + cptra_intr_rcv.soc_ifc_error |= SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_MBOX_ECC_UNC_STS_MASK; + } + if (sts == 0) { + VPRINTF(ERROR,"bad soc_ifc_error_intr sts:%x\n", sts); + SEND_STDOUT_CTRL(0x1); + while(1); + } +} + +inline void service_soc_ifc_notif_intr () { + uint32_t * reg = (uint32_t *) (CLP_SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R); + uint32_t sts = *reg; + /* Write 1 to Clear the pending interrupt */ + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_AVAIL_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_AVAIL_STS_MASK; + cptra_intr_rcv.soc_ifc_notif |= SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_AVAIL_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_MBOX_ECC_COR_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_MBOX_ECC_COR_STS_MASK; + cptra_intr_rcv.soc_ifc_notif |= SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_MBOX_ECC_COR_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_DEBUG_LOCKED_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_DEBUG_LOCKED_STS_MASK; + cptra_intr_rcv.soc_ifc_notif |= SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_DEBUG_LOCKED_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_SCAN_MODE_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_SCAN_MODE_STS_MASK; + cptra_intr_rcv.soc_ifc_notif |= SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_SCAN_MODE_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_SOC_REQ_LOCK_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_SOC_REQ_LOCK_STS_MASK; + cptra_intr_rcv.soc_ifc_notif |= SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_SOC_REQ_LOCK_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_GEN_IN_TOGGLE_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_GEN_IN_TOGGLE_STS_MASK; + cptra_intr_rcv.soc_ifc_notif |= SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_GEN_IN_TOGGLE_STS_MASK; + } + if (sts == 0) { + VPRINTF(ERROR,"bad soc_ifc_notif_intr sts:%x\n", sts); + SEND_STDOUT_CTRL(0x1); + while(1); + } +} + +inline void service_sha512_acc_error_intr() {return;} +inline void service_sha512_acc_notif_intr() { + uint32_t * reg = (uint32_t *) (CLP_SHA512_ACC_CSR_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R); + uint32_t sts = *reg; + /* Write 1 to Clear the pending interrupt */ + if (sts & SHA512_ACC_CSR_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK) { + *reg = SHA512_ACC_CSR_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + cptra_intr_rcv.sha512_acc_notif |= SHA512_ACC_CSR_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + } + if (sts == 0) { + VPRINTF(ERROR,"bad sha512_acc_notif_intr sts:%x\n", sts); + SEND_STDOUT_CTRL(0x1); + while(1); + } +} + + +#endif //CALIPTRA_ISR_H diff --git a/src/integration/test_suites/smoke_test_pcr_zeroize/smoke_test_pcr_zeroize.c b/src/integration/test_suites/smoke_test_pcr_zeroize/smoke_test_pcr_zeroize.c new file mode 100644 index 000000000..2ff485ee4 --- /dev/null +++ b/src/integration/test_suites/smoke_test_pcr_zeroize/smoke_test_pcr_zeroize.c @@ -0,0 +1,276 @@ +// SPDX-License-Identifier: Apache-2.0 +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +#include "caliptra_defines.h" +#include "caliptra_isr.h" +#include "riscv_hw_if.h" +#include "riscv-csr.h" +#include "printf.h" +#include "ecc.h" + +volatile char* stdout = (char *)STDOUT; +volatile uint32_t intr_count = 0; +#ifdef CPT_VERBOSITY + enum printf_verbosity verbosity_g = CPT_VERBOSITY; +#else + enum printf_verbosity verbosity_g = LOW; +#endif + +volatile caliptra_intr_received_s cptra_intr_rcv = { + .doe_error = 0, + .doe_notif = 0, + .ecc_error = 0, + .ecc_notif = 0, + .hmac_error = 0, + .hmac_notif = 0, + .kv_error = 0, + .kv_notif = 0, + .sha512_error = 0, + .sha512_notif = 0, + .sha256_error = 0, + .sha256_notif = 0, + .qspi_error = 0, + .qspi_notif = 0, + .uart_error = 0, + .uart_notif = 0, + .i3c_error = 0, + .i3c_notif = 0, + .soc_ifc_error = 0, + .soc_ifc_notif = 0, + .sha512_acc_error = 0, + .sha512_acc_notif = 0, +}; + +/* ECC test vector: + MSG = C8F518D4F3AA1BD46ED56C1C3C9E16FB800AF504DB98843548C5F623EE115F73D4C62ABC06D303B5D90D9A175087290D + PRIVKEY = F274F69D163B0C9F1FC3EBF4292AD1C4EB3CEC1C5A7DDE6F80C14292934C2055E087748D0A169C772483ADEE5EE70E17 + PUBKEY_X = D79C6D972B34A1DFC916A7B6E0A99B6B5387B34DA2187607C1AD0A4D1A8C2E4172AB5FA5D9AB58FE45E43F56BBB66BA4 + PUBKEY_Y = 5A7363932B06B4F223BEF0B60A6390265112DBBD0AAE67FEF26B465BE935B48E451E68D16F1118F2B32B4C28608749ED + SEED = 8FA8541C82A392CA74F23ED1DBFD73541C5966391B97EA73D744B0E34B9DF59ED0158063E39C09A5A055371EDF7A5441 + NONCE = 1B7EC5E548E8AAA92EC77097CA9551C9783CE682CA18FB1EDBD9F1E50BC382DB8AB39496C8EE423F8CA105CBBA7B6588 + Sign_R = 871E6EA4DDC5432CDDAA60FD7F055472D3C4DD41A5BFB26709E88C311A97093599A7C8F55B3974C19E4F5A7BFC1DD2AC + SIGN_S = 3E5552DE6403350EE70AD74E4B854D2DC4126BBF9C153A5D7A07BD4B85D06E45F850920E898FB7D34F80796DAE29365C + IV = 3401CEFAE20A737649073AC1A351E32926DB9ED0DB6B1CFFAB0493DAAFB93DDDD83EDEA28A803D0D003B2633B9D0F1BF +*/ + +void main(){ + + printf("----------------------------------\n"); + printf(" Smoke Test With PCR Signing flow !!\n"); + printf("----------------------------------\n"); + + uint32_t ecc_msg[] = {0xC8F518D4, + 0xF3AA1BD4, + 0x6ED56C1C, + 0x3C9E16FB, + 0x800AF504, + 0xDB988435, + 0x48C5F623, + 0xEE115F73, + 0xD4C62ABC, + 0x06D303B5, + 0xD90D9A17, + 0x5087290D}; + + uint32_t expected_pubkey_x[] = {0xD79C6D97, + 0x2B34A1DF, + 0xC916A7B6, + 0xE0A99B6B, + 0x5387B34D, + 0xA2187607, + 0xC1AD0A4D, + 0x1A8C2E41, + 0x72AB5FA5, + 0xD9AB58FE, + 0x45E43F56, + 0xBBB66BA4}; + + uint32_t expected_pubkey_y[] = {0x5A736393, + 0x2B06B4F2, + 0x23BEF0B6, + 0x0A639026, + 0x5112DBBD, + 0x0AAE67FE, + 0xF26B465B, + 0xE935B48E, + 0x451E68D1, + 0x6F1118F2, + 0xB32B4C28, + 0x608749ED}; + + uint32_t ecc_nonce[] = {0x1B7EC5E5, + 0x48E8AAA9, + 0x2EC77097, + 0xCA9551C9, + 0x783CE682, + 0xCA18FB1E, + 0xDBD9F1E5, + 0x0BC382DB, + 0x8AB39496, + 0xC8EE423F, + 0x8CA105CB, + 0xBA7B6588}; + + uint32_t expected_sign_r[] = {0x871E6EA4, + 0xDDC5432C, + 0xDDAA60FD, + 0x7F055472, + 0xD3C4DD41, + 0xA5BFB267, + 0x09E88C31, + 0x1A970935, + 0x99A7C8F5, + 0x5B3974C1, + 0x9E4F5A7B, + 0xFC1DD2AC}; + + uint32_t expected_sign_s[] = {0x3E5552DE, + 0x6403350E, + 0xE70AD74E, + 0x4B854D2D, + 0xC4126BBF, + 0x9C153A5D, + 0x7A07BD4B, + 0x85D06E45, + 0xF850920E, + 0x898FB7D3, + 0x4F80796D, + 0xAE29365C}; + + + uint32_t ecc_iv[] = {0x3401CEFA, + 0xE20A7376, + 0x49073AC1, + 0xA351E329, + 0x26DB9ED0, + 0xDB6B1CFF, + 0xAB0493DA, + 0xAFB93DDD, + 0xD83EDEA2, + 0x8A803D0D, + 0x003B2633, + 0xB9D0F1BF}; + //Call interrupt init + init_interrupts(); + + uint8_t offset; + volatile uint32_t * reg_ptr; + uint8_t fail_cmd = 0x1; + + // wait for ECC to be ready + while((lsu_read_32(CLP_ECC_REG_ECC_STATUS) & ECC_REG_ECC_STATUS_READY_MASK) == 0); + + //inject seed to kv key reg (in RTL) + printf("Inject PRIVKEY into KV slot 7\n"); + uint8_t privkey_inject_cmd = 0x88 + 0x7; + printf("%c", privkey_inject_cmd); + + printf("Inject MSG into SHA512 digest\n"); + printf("%c", 0x90); + + // Program ECC IV + reg_ptr = (uint32_t*) CLP_ECC_REG_ECC_IV_0; + offset = 0; + while (reg_ptr <= (uint32_t*) CLP_ECC_REG_ECC_IV_11) { + *reg_ptr++ = ecc_iv[offset++]; + } + + // Enable ECC PCR SIGNING core + printf("\nECC PCR SIGNING\n"); + lsu_write_32(CLP_ECC_REG_ECC_CTRL, ECC_CMD_SIGNING | + ((1 << ECC_REG_ECC_CTRL_PCR_SIGN_LOW) & ECC_REG_ECC_CTRL_PCR_SIGN_MASK) | + ((1 << ECC_REG_ECC_CTRL_ZEROIZE_LOW) & ECC_REG_ECC_CTRL_ZEROIZE_MASK)); + + // wait for ECC to be ready + while((lsu_read_32(CLP_ECC_REG_ECC_STATUS) & ECC_REG_ECC_STATUS_READY_MASK) == 0); + + + printf("Load SIGN_R data from ECC\n"); + reg_ptr = (uint32_t *) CLP_ECC_REG_ECC_SIGN_R_0; + offset = 0; + while (reg_ptr <= (uint32_t*) CLP_ECC_REG_ECC_SIGN_R_11) { + if (*reg_ptr != 0) { + printf("At offset [%d], ecc_sign_r data mismatch!\n", offset); + printf("Actual data: 0x%x\n", *reg_ptr); + printf("%c", fail_cmd); + while(1); + } + reg_ptr++; + offset++; + } + + printf("Load SIGN_S data from ECC\n"); + reg_ptr = (uint32_t*) CLP_ECC_REG_ECC_SIGN_S_0; + offset = 0; + while (reg_ptr <= (uint32_t*) CLP_ECC_REG_ECC_SIGN_S_11) { + if (*reg_ptr != 0) { + printf("At offset [%d], ecc_sign_s data mismatch!\n", offset); + printf("Actual data: 0x%x\n", *reg_ptr); + printf("%c", fail_cmd); + while(1); + } + reg_ptr++; + offset++; + } + + + + // wait for ECC to be ready + while((lsu_read_32(CLP_ECC_REG_ECC_STATUS) & ECC_REG_ECC_STATUS_READY_MASK) == 0); + + //inject seed to kv key reg (in RTL) + printf("Inject PRIVKEY into KV slot 7\n"); + printf("%c", privkey_inject_cmd); + + printf("Inject MSG into SHA512 digest\n"); + printf("%c", 0x90); + + // Program ECC IV + reg_ptr = (uint32_t*) CLP_ECC_REG_ECC_IV_0; + offset = 0; + while (reg_ptr <= (uint32_t*) CLP_ECC_REG_ECC_IV_11) { + *reg_ptr++ = ecc_iv[offset++]; + } + + // Enable ECC PCR SIGNING core + printf("\nECC PCR SIGNING\n"); + lsu_write_32(CLP_ECC_REG_ECC_CTRL, ECC_CMD_SIGNING | + ((1 << ECC_REG_ECC_CTRL_PCR_SIGN_LOW) & ECC_REG_ECC_CTRL_PCR_SIGN_MASK)); + + //delay + for (int delay_cnt=0; delay_cnt<10000; delay_cnt++); + + //zeroize + lsu_write_32(CLP_ECC_REG_ECC_CTRL, ((1 << ECC_REG_ECC_CTRL_ZEROIZE_LOW) & ECC_REG_ECC_CTRL_ZEROIZE_MASK)); + + // wait for ECC to be ready + while((lsu_read_32(CLP_ECC_REG_ECC_STATUS) & ECC_REG_ECC_STATUS_READY_MASK) == 0); + + printf("Load SIGN_R data from ECC\n"); + reg_ptr = (uint32_t *) CLP_ECC_REG_ECC_SIGN_R_0; + offset = 0; + while (reg_ptr <= (uint32_t*) CLP_ECC_REG_ECC_SIGN_R_11) { + if (*reg_ptr != 0) { + printf("At offset [%d], ecc_sign_r data mismatch!\n", offset); + printf("Actual data: 0x%x\n", *reg_ptr); + printf("%c", fail_cmd); + while(1); + } + reg_ptr++; + offset++; + } + + printf("%c",0xff); //End the test +} diff --git a/src/integration/test_suites/smoke_test_pcr_zeroize/smoke_test_pcr_zeroize.yml b/src/integration/test_suites/smoke_test_pcr_zeroize/smoke_test_pcr_zeroize.yml new file mode 100644 index 000000000..553271ac3 --- /dev/null +++ b/src/integration/test_suites/smoke_test_pcr_zeroize/smoke_test_pcr_zeroize.yml @@ -0,0 +1,4 @@ +--- +# Random seed desired... +seed: 1 +testname: smoke_test_pcr_zeroize \ No newline at end of file diff --git a/src/integration/test_suites/smoke_test_qspi/caliptra_isr.h b/src/integration/test_suites/smoke_test_qspi/caliptra_isr.h index 23b511c4b..fca82fef0 100644 --- a/src/integration/test_suites/smoke_test_qspi/caliptra_isr.h +++ b/src/integration/test_suites/smoke_test_qspi/caliptra_isr.h @@ -32,39 +32,212 @@ #include #include "printf.h" -//extern volatile uint32_t hmac_intr_status; +/* --------------- symbols/typedefs --------------- */ +typedef struct { + uint32_t doe_error; + uint32_t doe_notif; + uint32_t ecc_error; + uint32_t ecc_notif; + uint32_t hmac_error; + uint32_t hmac_notif; + uint32_t kv_error; + uint32_t kv_notif; + uint32_t sha512_error; + uint32_t sha512_notif; + uint32_t sha256_error; + uint32_t sha256_notif; + uint32_t qspi_error; + uint32_t qspi_notif; + uint32_t uart_error; + uint32_t uart_notif; + uint32_t i3c_error; + uint32_t i3c_notif; + uint32_t soc_ifc_error; + uint32_t soc_ifc_notif; + uint32_t sha512_acc_error; + uint32_t sha512_acc_notif; +} caliptra_intr_received_s; +extern volatile caliptra_intr_received_s cptra_intr_rcv; ////////////////////////////////////////////////////////////////////////////// // Function Declarations // + // Performs all the CSR setup to configure and enable vectored external interrupts void init_interrupts(void); // These inline functions are used to insert event-specific functionality into the -// otherwise generic ISR that gets laid down by the parameterized macro "nonstd_swerv_isr" -inline void service_doe_error_intr() {printf("ERROR");} -inline void service_doe_notif_intr() {printf("ERROR");} -inline void service_ecc_error_intr () {printf("ERROR");} -inline void service_ecc_notif_intr () {printf("ERROR");} -inline void service_hmac_error_intr () {printf("ERROR");} -inline void service_hmac_notif_intr () {printf("ERROR");} - -inline void service_kv_error_intr () {printf("ERROR");} -inline void service_kv_notif_intr () {printf("ERROR");} -inline void service_sha512_error_intr() {printf("ERROR");} -inline void service_sha512_notif_intr() {printf("ERROR");} -inline void service_sha256_error_intr() {printf("ERROR");} -inline void service_sha256_notif_intr() {printf("ERROR");} -inline void service_qspi_error_intr () {printf("ERROR");} -inline void service_qspi_notif_intr () {printf("ERROR");} -inline void service_uart_error_intr () {printf("ERROR");} -inline void service_uart_notif_intr () {printf("ERROR");} -inline void service_i3c_error_intr () {printf("ERROR");} -inline void service_i3c_notif_intr () {printf("ERROR");} -inline void service_soc_ifc_error_intr () {printf("ERROR");} -inline void service_soc_ifc_notif_intr () {printf("ERROR");} -inline void service_sha512_acc_error_intr() {printf("ERROR");} -inline void service_sha512_acc_notif_intr() {printf("ERROR");} +// otherwise generic ISR that gets laid down by the parameterized macro "nonstd_veer_isr" +inline void service_doe_error_intr() {return;} +inline void service_doe_notif_intr() { + uint32_t * reg = (uint32_t *) (CLP_DOE_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R); + uint32_t sts = *reg; + /* Write 1 to Clear the pending interrupt */ + if (sts & DOE_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK) { + *reg = DOE_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + cptra_intr_rcv.doe_notif |= DOE_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + } + if (sts == 0) { + VPRINTF(ERROR,"bad doe_notif_intr sts:%x\n", sts); + SEND_STDOUT_CTRL(0x1); + while(1); + } +} + +inline void service_ecc_error_intr() {return;} +inline void service_ecc_notif_intr() { + uint32_t * reg = (uint32_t *) (CLP_ECC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R); + uint32_t sts = *reg; + /* Write 1 to Clear the pending interrupt */ + if (sts & ECC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK) { + *reg = ECC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + cptra_intr_rcv.ecc_notif |= ECC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + } + if (sts == 0) { + VPRINTF(ERROR,"bad ecc_notif_intr sts:%x\n", sts); + SEND_STDOUT_CTRL(0x1); + while(1); + } +} + +inline void service_hmac_error_intr() {return;} +inline void service_hmac_notif_intr() { + uint32_t * reg = (uint32_t *) (CLP_HMAC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R); + uint32_t sts = *reg; + /* Write 1 to Clear the pending interrupt */ + if (sts & HMAC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK) { + *reg = HMAC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + cptra_intr_rcv.hmac_notif |= HMAC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + } + if (sts == 0) { + VPRINTF(ERROR,"bad hmac_notif_intr sts:%x\n", sts); + SEND_STDOUT_CTRL(0x1); + while(1); + } +} + +inline void service_kv_error_intr() {return;} +inline void service_kv_notif_intr() {return;} +inline void service_sha512_error_intr() {return;} +inline void service_sha512_notif_intr() { + uint32_t * reg = (uint32_t *) (CLP_SHA512_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R); + uint32_t sts = *reg; + /* Write 1 to Clear the pending interrupt */ + if (sts & SHA512_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK) { + *reg = SHA512_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + cptra_intr_rcv.sha512_notif |= SHA512_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + } + if (sts == 0) { + VPRINTF(ERROR,"bad sha512_notif_intr sts:%x\n", sts); + SEND_STDOUT_CTRL(0x1); + while(1); + } +} + +inline void service_sha256_error_intr() {return;} +inline void service_sha256_notif_intr() { + uint32_t * reg = (uint32_t *) (CLP_SHA256_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R); + uint32_t sts = *reg; + /* Write 1 to Clear the pending interrupt */ + if (sts & SHA256_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK) { + *reg = SHA256_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + cptra_intr_rcv.sha256_notif |= SHA256_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + } + if (sts == 0) { + VPRINTF(ERROR,"bad sha256_notif_intr sts:%x\n", sts); + SEND_STDOUT_CTRL(0x1); + while(1); + } +} + +inline void service_qspi_error_intr() {return;} +inline void service_qspi_notif_intr() {return;} +inline void service_uart_error_intr() {return;} +inline void service_uart_notif_intr() {return;} +inline void service_i3c_error_intr() {return;} +inline void service_i3c_notif_intr() {return;} + +inline void service_soc_ifc_error_intr() { + uint32_t * reg = (uint32_t *) (CLP_SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R); + uint32_t sts = *reg; + /* Write 1 to Clear the pending interrupt */ + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_INTERNAL_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_INTERNAL_STS_MASK; + cptra_intr_rcv.soc_ifc_error |= SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_INTERNAL_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_INV_DEV_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_INV_DEV_STS_MASK; + cptra_intr_rcv.soc_ifc_error |= SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_INV_DEV_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_CMD_FAIL_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_CMD_FAIL_STS_MASK; + cptra_intr_rcv.soc_ifc_error |= SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_CMD_FAIL_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_BAD_FUSE_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_BAD_FUSE_STS_MASK; + cptra_intr_rcv.soc_ifc_error |= SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_BAD_FUSE_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_ICCM_BLOCKED_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_ICCM_BLOCKED_STS_MASK; + cptra_intr_rcv.soc_ifc_error |= SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_ICCM_BLOCKED_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_MBOX_ECC_UNC_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_MBOX_ECC_UNC_STS_MASK; + cptra_intr_rcv.soc_ifc_error |= SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_MBOX_ECC_UNC_STS_MASK; + } + if (sts == 0) { + VPRINTF(ERROR,"bad soc_ifc_error_intr sts:%x\n", sts); + SEND_STDOUT_CTRL(0x1); + while(1); + } +} + +inline void service_soc_ifc_notif_intr () { + uint32_t * reg = (uint32_t *) (CLP_SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R); + uint32_t sts = *reg; + /* Write 1 to Clear the pending interrupt */ + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_AVAIL_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_AVAIL_STS_MASK; + cptra_intr_rcv.soc_ifc_notif |= SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_AVAIL_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_MBOX_ECC_COR_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_MBOX_ECC_COR_STS_MASK; + cptra_intr_rcv.soc_ifc_notif |= SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_MBOX_ECC_COR_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_DEBUG_LOCKED_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_DEBUG_LOCKED_STS_MASK; + cptra_intr_rcv.soc_ifc_notif |= SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_DEBUG_LOCKED_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_SOC_REQ_LOCK_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_SOC_REQ_LOCK_STS_MASK; + cptra_intr_rcv.soc_ifc_notif |= SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_SOC_REQ_LOCK_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_GEN_IN_TOGGLE_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_GEN_IN_TOGGLE_STS_MASK; + cptra_intr_rcv.soc_ifc_notif |= SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_GEN_IN_TOGGLE_STS_MASK; + } + if (sts == 0) { + VPRINTF(ERROR,"bad soc_ifc_notif_intr sts:%x\n", sts); + SEND_STDOUT_CTRL(0x1); + while(1); + } +} + +inline void service_sha512_acc_error_intr() {return;} +inline void service_sha512_acc_notif_intr() { + uint32_t * reg = (uint32_t *) (CLP_SHA512_ACC_CSR_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R); + uint32_t sts = *reg; + /* Write 1 to Clear the pending interrupt */ + if (sts & SHA512_ACC_CSR_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK) { + *reg = SHA512_ACC_CSR_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + cptra_intr_rcv.sha512_acc_notif |= SHA512_ACC_CSR_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + } + if (sts == 0) { + VPRINTF(ERROR,"bad sha512_acc_notif_intr sts:%x\n", sts); + SEND_STDOUT_CTRL(0x1); + while(1); + } +} #endif //CALIPTRA_ISR_H diff --git a/src/integration/test_suites/smoke_test_qspi/smoke_test_qspi.c b/src/integration/test_suites/smoke_test_qspi/smoke_test_qspi.c index 2ddae7c85..babe4f400 100644 --- a/src/integration/test_suites/smoke_test_qspi/smoke_test_qspi.c +++ b/src/integration/test_suites/smoke_test_qspi/smoke_test_qspi.c @@ -31,6 +31,31 @@ enum printf_verbosity verbosity_g = CPT_VERBOSITY; enum printf_verbosity verbosity_g = LOW; #endif +volatile caliptra_intr_received_s cptra_intr_rcv = { + .doe_error = 0, + .doe_notif = 0, + .ecc_error = 0, + .ecc_notif = 0, + .hmac_error = 0, + .hmac_notif = 0, + .kv_error = 0, + .kv_notif = 0, + .sha512_error = 0, + .sha512_notif = 0, + .sha256_error = 0, + .sha256_notif = 0, + .qspi_error = 0, + .qspi_notif = 0, + .uart_error = 0, + .uart_notif = 0, + .i3c_error = 0, + .i3c_notif = 0, + .soc_ifc_error = 0, + .soc_ifc_notif = 0, + .sha512_acc_error = 0, + .sha512_acc_notif = 0, +}; + typedef enum { Dummy = 0, RdOnly = 1, WrOnly = 2, BiDir = 3 } direction_t; typedef enum { Standard = 0, Dual = 1, Quad = 2 } speed_t; typedef enum { CmdJedecId = 0x9f, CmdReadQuad = 0x6b } cmd_spi_t; diff --git a/src/integration/test_suites/smoke_test_ras/caliptra_isr.h b/src/integration/test_suites/smoke_test_ras/caliptra_isr.h new file mode 100644 index 000000000..a245e2994 --- /dev/null +++ b/src/integration/test_suites/smoke_test_ras/caliptra_isr.h @@ -0,0 +1,199 @@ +// SPDX-License-Identifier: Apache-2.0 +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// --------------------------------------------------------------------- +// File: caliptra_isr.h +// Description: +// Provides function declarations for use by external test files, so +// that the ISR functionality may behave like a library. +// TODO: +// This header file includes inline function definitions for event and +// test specific interrupt service behavior, so it should be copied and +// modified for each test. +// --------------------------------------------------------------------- + +#ifndef CALIPTRA_ISR_H + #define CALIPTRA_ISR_H + +#include "caliptra_reg.h" +#include +#include "printf.h" +#include "riscv_hw_if.h" + +/* --------------- symbols/typedefs --------------- */ +typedef struct { + uint32_t doe_error; + uint32_t doe_notif; + uint32_t ecc_error; + uint32_t ecc_notif; + uint32_t hmac_error; + uint32_t hmac_notif; + uint32_t kv_error; + uint32_t kv_notif; + uint32_t sha512_error; + uint32_t sha512_notif; + uint32_t sha256_error; + uint32_t sha256_notif; + uint32_t qspi_error; + uint32_t qspi_notif; + uint32_t uart_error; + uint32_t uart_notif; + uint32_t i3c_error; + uint32_t i3c_notif; + uint32_t soc_ifc_error; + uint32_t soc_ifc_notif; + uint32_t sha512_acc_error; + uint32_t sha512_acc_notif; +} caliptra_intr_received_s; +extern volatile caliptra_intr_received_s cptra_intr_rcv; +#define RV_EXCEPTION_STRUCT 1 +typedef struct { + uint8_t exception_hit; + uint32_t mcause; + uint32_t mscause; +} rv_exception_struct_s; + +/* --------------- Function Declarations --------------- */ + +// Performs all the CSR setup to configure and enable vectored external interrupts +void init_interrupts(void); + +// These inline functions are used to insert event-specific functionality into the +// otherwise generic ISR that gets laid down by the parameterized macro "nonstd_veer_isr" +inline void service_doe_error_intr() {return;} +inline void service_doe_notif_intr() {return;} + +inline void service_ecc_error_intr() {return;} +inline void service_ecc_notif_intr() {return;} + +inline void service_hmac_error_intr() {return;} +inline void service_hmac_notif_intr() {return;} + +inline void service_kv_error_intr() {return;} +inline void service_kv_notif_intr() {return;} +inline void service_sha512_error_intr() {return;} +inline void service_sha512_notif_intr() {return;} + +inline void service_sha256_error_intr() {return;} +inline void service_sha256_notif_intr() {return;} + +inline void service_qspi_error_intr() {return;} +inline void service_qspi_notif_intr() {return;} +inline void service_uart_error_intr() {return;} +inline void service_uart_notif_intr() {return;} +inline void service_i3c_error_intr() {return;} +inline void service_i3c_notif_intr() {return;} + +inline void service_soc_ifc_error_intr() { + uint32_t * reg = (uint32_t *) (CLP_SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R); + uint32_t sts = *reg; + /* Write 1 to Clear the pending interrupt */ + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_INTERNAL_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_INTERNAL_STS_MASK; + cptra_intr_rcv.soc_ifc_error |= SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_INTERNAL_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_INV_DEV_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_INV_DEV_STS_MASK; + cptra_intr_rcv.soc_ifc_error |= SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_INV_DEV_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_CMD_FAIL_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_CMD_FAIL_STS_MASK; + cptra_intr_rcv.soc_ifc_error |= SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_CMD_FAIL_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_BAD_FUSE_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_BAD_FUSE_STS_MASK; + cptra_intr_rcv.soc_ifc_error |= SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_BAD_FUSE_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_ICCM_BLOCKED_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_ICCM_BLOCKED_STS_MASK; + cptra_intr_rcv.soc_ifc_error |= SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_ICCM_BLOCKED_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_MBOX_ECC_UNC_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_MBOX_ECC_UNC_STS_MASK; + cptra_intr_rcv.soc_ifc_error |= SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_MBOX_ECC_UNC_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_WDT_TIMER1_TIMEOUT_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_WDT_TIMER1_TIMEOUT_STS_MASK; + cptra_intr_rcv.soc_ifc_error |= SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_WDT_TIMER1_TIMEOUT_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_WDT_TIMER2_TIMEOUT_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_WDT_TIMER2_TIMEOUT_STS_MASK; + cptra_intr_rcv.soc_ifc_error |= SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_WDT_TIMER2_TIMEOUT_STS_MASK; + } + if (sts == 0) { + VPRINTF(ERROR,"bad soc_ifc_error_intr sts:%x\n", sts); + SEND_STDOUT_CTRL(0x1); + while(1); + } +} + +inline void service_soc_ifc_notif_intr () { + uint32_t * reg = (uint32_t *) (CLP_SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R); + uint32_t sts = *reg; + /* Write 1 to Clear the pending interrupt */ + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_AVAIL_STS_MASK) { + VPRINTF(HIGH, "cmd_avail\n"); + *reg = SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_AVAIL_STS_MASK; + cptra_intr_rcv.soc_ifc_notif |= SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_AVAIL_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_MBOX_ECC_COR_STS_MASK) { + VPRINTF(HIGH, "mbox_ecc_cor\n"); + *reg = SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_MBOX_ECC_COR_STS_MASK; + cptra_intr_rcv.soc_ifc_notif |= SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_MBOX_ECC_COR_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_DEBUG_LOCKED_STS_MASK) { + VPRINTF(HIGH, "debug_locked\n"); + *reg = SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_DEBUG_LOCKED_STS_MASK; + cptra_intr_rcv.soc_ifc_notif |= SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_DEBUG_LOCKED_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_SCAN_MODE_STS_MASK) { + VPRINTF(HIGH, "SCAN_MODE\n"); + *reg = SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_SCAN_MODE_STS_MASK; + cptra_intr_rcv.soc_ifc_notif |= SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_SCAN_MODE_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_SOC_REQ_LOCK_STS_MASK) { + VPRINTF(HIGH, "soc_req_lock\n"); + *reg = SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_SOC_REQ_LOCK_STS_MASK; + cptra_intr_rcv.soc_ifc_notif |= SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_SOC_REQ_LOCK_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_GEN_IN_TOGGLE_STS_MASK) { + VPRINTF(HIGH, "gen_in_toggle\n"); + *reg = SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_GEN_IN_TOGGLE_STS_MASK; + cptra_intr_rcv.soc_ifc_notif |= SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_GEN_IN_TOGGLE_STS_MASK; + } + if (sts == 0) { + VPRINTF(ERROR,"bad soc_ifc_notif_intr sts:%x\n", sts); + SEND_STDOUT_CTRL(0x1); + while(1); + } +} + +inline void service_sha512_acc_error_intr() {return;} +inline void service_sha512_acc_notif_intr() { + uint32_t * reg = (uint32_t *) (CLP_SHA512_ACC_CSR_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R); + uint32_t sts = *reg; + /* Write 1 to Clear the pending interrupt */ + if (sts & SHA512_ACC_CSR_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK) { + *reg = SHA512_ACC_CSR_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + cptra_intr_rcv.sha512_acc_notif |= SHA512_ACC_CSR_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + } + if (sts == 0) { + VPRINTF(ERROR,"bad sha512_acc_notif_intr sts:%x\n", sts); + SEND_STDOUT_CTRL(0x1); + while(1); + } +} + + +#endif //CALIPTRA_ISR_H diff --git a/src/integration/test_suites/smoke_test_ras/smoke_test_ras.c b/src/integration/test_suites/smoke_test_ras/smoke_test_ras.c new file mode 100644 index 000000000..593b92d3e --- /dev/null +++ b/src/integration/test_suites/smoke_test_ras/smoke_test_ras.c @@ -0,0 +1,1093 @@ +// SPDX-License-Identifier: Apache-2.0 +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +// DESCRIPTION: +// Test Reliability, Availability, Servicability (RAS) features in +// Caliptra SOC Interface +// Test objectives: +// 1. Demonstrate all reported events can be properly detected and reported +// to uC +// 2. Demonstrate correct reset behavior for FATAL and NON_FATAL events +// (a) FATAL events must result in a Caliptra system reset (by SOC i.e. +// the testbench) +// (b) Following a reset, no further interrupt observed; SOC manually +// clears ERROR reg +// (c) NON_FATAL events should be observed and cleared by SOC +// 3. Demonstrate correct behavior of the error mask registers, which should +// prevent error assertion +// (a) When masked, ERROR register bits should be set, not generate an +// interrupt, and then the uC should reset them +// +// Several of the above features may only be properly validated in concert +// with Testbench level code that confirms signal behavior and drives resets +// as required. +// That behavior is requested by FW via writes to GENERIC_OUTPUT_WIRES (which +// currently operates as STDOUT in sims) +// The TB may also signal response activity by driving GENERIC_INPUT_WIRES +// (resulting in interrupt to uC) +// + +#include "caliptra_defines.h" +#include "caliptra_isr.h" +#include "riscv_hw_if.h" +#include "riscv-interrupts.h" +#include "riscv-csr.h" +#include "veer-csr.h" +#include +#include +#include "printf.h" + +//////////////////////////////////////////////////////////////////// +// Typedefs +// + +// Matches the STDOUT code value as decoded in caliptra_top_tb_services +enum ecc_error_mode_type { + ERROR_NONE = 0xe4, + ICCM_SINGLE = 0xe0, + ICCM_DOUBLE = 0xe1, + DCCM_SINGLE = 0xe2, + DCCM_DOUBLE = 0xe3, + MBOX_SINGLE = 0xfd, + MBOX_DOUBLE = 0xfe +}; + +// Value driven by TB to GENERIC_INPUT_WIRES +enum tb_resp_value { + MBOX_NON_FATAL_OBSERVED = 0x600dab1e, + PROT_NO_LOCK_NON_FATAL_OBSERVED = 0x600dbabe, + PROT_OOO_NON_FATAL_OBSERVED = 0x600dcafe, + ICCM_FATAL_OBSERVED = 0xdeadaca1, + DCCM_FATAL_OBSERVED = 0xdeadbeef, + NMI_FATAL_OBSERVED = 0xdeadc0a7, + ERROR_NONE_SET = 0xba5eba11, /* default value for a test with no activity observed by TB */ +}; + +enum mask_config { + WITH_MASK, + NO_MASK +}; + +enum recovery_config { + WARM_RESET, + FORCE_UNLOCK +}; + +enum test_status { + SUCCESS = 0, + INTR_COUNT_0 = 1 << 0, + INTR_COR_COUNT_0 = 1 << 1, + INTR_UNC_COUNT_0 = 1 << 2, + BAD_EXCP_CODE = 1 << 3, + UNEXP_ARG = 1 << 4, + BAD_CPTRA_SIG = 1 << 5, + INV_STATE = 1 << 6, +}; + +enum test_progress { + NOT_STARTED, + RUN_NOT_CHECKED, + RUN_AND_FAILED, + RUN_AND_PASSED +}; + +// Used to index into the global array of test progress +// TODO Test the FW FATAL/NON_FATAL regs +enum test_list { + MBOX_SRAM_ECC_SINGLE_UNMASKED, + MBOX_SRAM_ECC_DOUBLE_UNMASKED, + MBOX_SRAM_ECC_SINGLE_MASKED , + MBOX_SRAM_ECC_DOUBLE_MASKED , + ICCM_SRAM_ECC_SINGLE_UNMASKED, + ICCM_SRAM_ECC_DOUBLE_UNMASKED, + ICCM_SRAM_ECC_SINGLE_MASKED , + ICCM_SRAM_ECC_DOUBLE_MASKED , + DCCM_SRAM_ECC_SINGLE_UNMASKED, + DCCM_SRAM_ECC_DOUBLE_UNMASKED, + DCCM_SRAM_ECC_SINGLE_MASKED , + DCCM_SRAM_ECC_DOUBLE_MASKED , + NMI_UNMASKED , + NMI_MASKED , + PROT_NO_LOCK_UNMASKED , + PROT_NO_LOCK_MASKED , + PROT_OOO_UNMASKED , + PROT_OOO_MASKED , + TEST_COUNT , +}; +enum boot_count_list { + BEFORE_FIRST_ICCM_FAILURE = 1, + BEFORE_SECOND_ICCM_FAILURE , + BEFORE_FIRST_DCCM_FAILURE , + BEFORE_FIRST_NMI_FAILURE , + BEFORE_SECOND_NMI_FAILURE , + AFTER_SECOND_NMI_FAILURE , + AFTER_FIRST_MBOX_OOO_FAILURE , + AFTER_SECOND_MBOX_OOO_FAILURE +}; +//enum boot_count_list { +// RUN_MBOX_AND_FIRST_ICCM_SRAM_ECC = 1, +// RUN_AND_CHK_ICCM_SRAM_ECC_MASKED , +// RUN_DCCM_SRAM_ECC_UNMASKED , +// RUN_AND_CHK_DCCM_SRAM_ECC_MASKED , +// RUN_AND_CHK_NMI_MASKED , +// RUN_AND_CHK_MBOX_PROT_ERROR , +//}; + +//////////////////////////////////////////////////////////////////// +// Globals +// +extern uintptr_t iccm_code0_start, iccm_code0_end; +volatile char* stdout = (char *)STDOUT; +#ifdef CPT_VERBOSITY + enum printf_verbosity verbosity_g = CPT_VERBOSITY; +#else + enum printf_verbosity verbosity_g = HIGH; +#endif + +volatile uint32_t intr_count; +volatile caliptra_intr_received_s cptra_intr_rcv = { + .doe_error = 0, + .doe_notif = 0, + .ecc_error = 0, + .ecc_notif = 0, + .hmac_error = 0, + .hmac_notif = 0, + .kv_error = 0, + .kv_notif = 0, + .sha512_error = 0, + .sha512_notif = 0, + .sha256_error = 0, + .sha256_notif = 0, + .qspi_error = 0, + .qspi_notif = 0, + .uart_error = 0, + .uart_notif = 0, + .i3c_error = 0, + .i3c_notif = 0, + .soc_ifc_error = 0, + .soc_ifc_notif = 0, + .sha512_acc_error = 0, + .sha512_acc_notif = 0, +}; +volatile rv_exception_struct_s exc_flag __attribute__((section(".dccm.persistent"))); // WARNING: if DCCM ERROR injection is enabled, writes to this may be corrupted +volatile uint32_t boot_count __attribute__((section(".dccm.persistent"))) = 0; +volatile uint32_t generic_input_wires_0_before_rst __attribute__((section(".dccm.persistent"))); +// Track test progress across resets by allocating the variable in DCCM, which +// is initialized only once at time 0 +enum test_progress test_progress_g[TEST_COUNT] __attribute__((section(".dccm.persistent"))) = { + NOT_STARTED, + NOT_STARTED, + NOT_STARTED, + NOT_STARTED, + NOT_STARTED, + NOT_STARTED, + NOT_STARTED, + NOT_STARTED, + NOT_STARTED, + NOT_STARTED, + NOT_STARTED, + NOT_STARTED, + NOT_STARTED, + NOT_STARTED +}; + + +//////////////////////////////////////////////////////////////////// +// Function Prototypes +// +/* MBOX ECC */ +void run_mbox_sram_ecc (enum ecc_error_mode_type type, enum mask_config test_mask); +uint32_t check_mbox_sram_ecc(enum ecc_error_mode_type type, enum mask_config test_mask); +uint32_t test_mbox_sram_ecc (enum mask_config test_mask); + +/* ICCM ECC */ +uint32_t run_iccm_sram_ecc (enum mask_config test_mask); +uint32_t check_iccm_sram_ecc (enum mask_config test_mask); + +/* DCCM ECC */ +uint32_t run_dccm_sram_ecc (enum mask_config test_mask); +uint32_t check_dccm_sram_ecc (enum mask_config test_mask); + +/* MBOX PROT */ +void run_mbox_no_lock_error (enum mask_config test_mask); +uint32_t check_mbox_no_lock_error(enum mask_config test_mask); +void run_mbox_ooo_error (enum mask_config test_mask); +uint32_t check_mbox_ooo_error (enum mask_config test_mask); + +/* NMI */ +void run_nmi_test (enum mask_config test_mask); +uint32_t check_nmi_test (enum mask_config test_mask); + +/* Supporting code */ +void nmi_handler (void); +void execute_from_iccm (void) __attribute__ ((aligned(4),section (".data_iccm0"))); + + +//////////////////////////////////////////////////////////////////// +// Function Definitions +// +void run_mbox_sram_ecc(enum ecc_error_mode_type type, enum mask_config test_mask) { + enum test_list cur_test; + + VPRINTF(MEDIUM, "\n*** Run Mbox SRAM ECC Err ***\n Type: %s\n Masked: %d\n\n", (type == MBOX_SINGLE) ? "1-bit" : "2-bit", test_mask == WITH_MASK); + + // Grab test enum + if (type == MBOX_SINGLE && test_mask == WITH_MASK) { cur_test = MBOX_SRAM_ECC_SINGLE_MASKED; } + else if (type == MBOX_SINGLE && test_mask == NO_MASK) { cur_test = MBOX_SRAM_ECC_SINGLE_UNMASKED; } + else if (type == MBOX_DOUBLE && test_mask == WITH_MASK) { cur_test = MBOX_SRAM_ECC_DOUBLE_MASKED; } + else if (type == MBOX_DOUBLE && test_mask == NO_MASK) { cur_test = MBOX_SRAM_ECC_DOUBLE_UNMASKED; } + else { cur_test = TEST_COUNT; } + + // Acquire the mailbox lock + while((lsu_read_32(CLP_MBOX_CSR_MBOX_LOCK) & MBOX_CSR_MBOX_LOCK_LOCK_MASK) != 0); + + // Set the Error Injection + SEND_STDOUT_CTRL((uint32_t) type); + + // Set the MASK mode + if (test_mask == WITH_MASK && type == MBOX_DOUBLE) { + lsu_write_32(CLP_SOC_IFC_REG_INTERNAL_HW_ERROR_NON_FATAL_MASK, SOC_IFC_REG_INTERNAL_HW_ERROR_NON_FATAL_MASK_MASK_MBOX_ECC_UNC_MASK); + } else if (test_mask == NO_MASK || type == MBOX_SINGLE) { + uint32_t mask_val = lsu_read_32(CLP_SOC_IFC_REG_INTERNAL_HW_ERROR_NON_FATAL_MASK); + mask_val &= ~SOC_IFC_REG_INTERNAL_HW_ERROR_NON_FATAL_MASK_MASK_MBOX_ECC_UNC_MASK; + lsu_write_32(CLP_SOC_IFC_REG_INTERNAL_HW_ERROR_NON_FATAL_MASK, mask_val); + } + + // Allocate an array in Mailbox SRAM + volatile uint32_t* myarray = (uint32_t*) MBOX_DIR_BASE_ADDR; + for (uint32_t ii; ii < 64; ii++) { + myarray[ii] = 64-ii; + } + + // Read the array from the Mailbox and write to STDOUT + for (uint32_t ii; ii < 64; ii++) { + printf("[%d]:%x\n", ii, myarray[ii]); // no verbosity control -- dereferencing the array IS the test + } + + // Log that the test ran + test_progress_g[cur_test] = RUN_NOT_CHECKED; +} + +uint32_t check_mbox_sram_ecc(enum ecc_error_mode_type type, enum mask_config test_mask) { + uint32_t sts = 0; + uint32_t rsp = 0; + enum test_list cur_test; + + VPRINTF(MEDIUM, "\n*** Check Mbox SRAM ECC Err ***\n Type: %s\n Masked: %d\n\n", (type == MBOX_SINGLE) ? "1-bit" : "2-bit", test_mask == WITH_MASK); + + // Check that the test ran + if (type == MBOX_SINGLE && test_mask == WITH_MASK) { cur_test = MBOX_SRAM_ECC_SINGLE_MASKED; } + else if (type == MBOX_SINGLE && test_mask == NO_MASK) { cur_test = MBOX_SRAM_ECC_SINGLE_UNMASKED; } + else if (type == MBOX_DOUBLE && test_mask == WITH_MASK) { cur_test = MBOX_SRAM_ECC_DOUBLE_MASKED; } + else if (type == MBOX_DOUBLE && test_mask == NO_MASK) { cur_test = MBOX_SRAM_ECC_DOUBLE_UNMASKED; } + else { cur_test = TEST_COUNT; + sts |= UNEXP_ARG; } + + if (test_progress_g[cur_test] != RUN_NOT_CHECKED) { + VPRINTF(ERROR, "Mbox chkr hit unexpected state. Idx: %d Prog: %d", cur_test, test_progress_g[cur_test]); + sts |= INV_STATE; + } + + // Check Interrupt Counts + if (type == MBOX_SINGLE && !(cptra_intr_rcv.soc_ifc_notif & SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_MBOX_ECC_COR_STS_MASK)) { + VPRINTF(ERROR, "ERROR: No notif intr rcv (cor errors) in ECC sram test\n"); + sts |= INTR_COUNT_0; + } else { + cptra_intr_rcv.soc_ifc_notif &= ~SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_MBOX_ECC_COR_STS_MASK; + } + if (type == MBOX_DOUBLE && !(cptra_intr_rcv.soc_ifc_error & SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_MBOX_ECC_UNC_STS_MASK)) { + VPRINTF(ERROR, "ERROR: No err intr rcv for unc err in ECC sram test\n"); + sts |= INTR_COUNT_0; + } else { + cptra_intr_rcv.soc_ifc_error &= ~SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_MBOX_ECC_UNC_STS_MASK; + } + // Sleep in between checking/clearing intr_count to allow any ISR to execute and show idle time in sims + for (uint16_t slp = 0; slp < 100; slp++) { + __asm__ volatile ("nop"); // Sleep loop as "nop" + } + intr_count = 0; + + // Get the interrupt count for the expected type + if (type == MBOX_SINGLE) { + if (lsu_read_32(CLP_SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_MBOX_ECC_COR_INTR_COUNT_R) == 0) { + VPRINTF(ERROR, "ERROR: 0 count value for cor ECC errors\n"); + sts |= INTR_COR_COUNT_0; + } else { + VPRINTF(LOW, "Cor ECC err no.: %x\n", lsu_read_32(CLP_SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_MBOX_ECC_COR_INTR_COUNT_R)); + } + } else if (type == MBOX_DOUBLE) { + if (lsu_read_32(CLP_SOC_IFC_REG_INTR_BLOCK_RF_ERROR_MBOX_ECC_UNC_INTR_COUNT_R) == 0) { + VPRINTF(ERROR, "ERROR: 0 count value for unc ECC errors\n"); + sts |= INTR_UNC_COUNT_0; + } else { + VPRINTF(LOW, "Unc ECC err no.: %x\n", lsu_read_32(CLP_SOC_IFC_REG_INTR_BLOCK_RF_ERROR_MBOX_ECC_UNC_INTR_COUNT_R)); + } + } else { + VPRINTF(ERROR, "ERROR: ecc_error_mode: %x\n", type); + sts |= UNEXP_ARG; + } + + // For Correctable Errors, only expect internal interrupts (no output to SOC) + // For Masked Uncorrectable Errors, interrupt should not go to SOC + if (type == MBOX_DOUBLE) { + uint32_t resp = lsu_read_32(CLP_SOC_IFC_REG_CPTRA_GENERIC_INPUT_WIRES_0); + // Check GENERIC_INPUT_WIRES for detection of cptra_error_non_fatal + if (test_mask == NO_MASK && resp != MBOX_NON_FATAL_OBSERVED) { + VPRINTF(ERROR, "ERROR: Bad resp from TB. Got: 0x%x Exp 0x%x\n", resp, MBOX_NON_FATAL_OBSERVED); + sts |= BAD_CPTRA_SIG; + } + else if (test_mask == WITH_MASK && resp == ERROR_NONE_SET) { + lsu_write_32(CLP_SOC_IFC_REG_CPTRA_HW_ERROR_NON_FATAL, SOC_IFC_REG_CPTRA_HW_ERROR_NON_FATAL_MBOX_ECC_UNC_MASK); + } + else if (test_mask == WITH_MASK) { + VPRINTF(ERROR, "ERROR: Bad resp from TB. Got: 0x%x Exp 0x%x\n", resp, ERROR_NONE_SET); + sts |= BAD_CPTRA_SIG; + } + } + + // Unlock Mailbox + lsu_write_32(CLP_MBOX_CSR_MBOX_UNLOCK, MBOX_CSR_MBOX_UNLOCK_UNLOCK_MASK); + + // Reset the Error Injection Function + SEND_STDOUT_CTRL((uint32_t) ERROR_NONE); + + // Increment test progress + if (sts) { + test_progress_g[cur_test] = RUN_AND_FAILED; + VPRINTF(ERROR, "ERROR: Test fail. Sts: 0x%x\n", sts); + } else { + test_progress_g[cur_test] = RUN_AND_PASSED; + } + + return sts; +} + +uint32_t test_mbox_sram_ecc (enum mask_config test_mask) { + VPRINTF(MEDIUM, "\nEnter Mbox SRAM ECC Err test\n Masked: %d\n", test_mask == WITH_MASK); + + // Single-bit Correctable ECC Error injection + run_mbox_sram_ecc(MBOX_SINGLE, test_mask); + check_mbox_sram_ecc(MBOX_SINGLE, test_mask); + // Double-bit Uncorrectable ECC Error injection + run_mbox_sram_ecc(MBOX_DOUBLE, test_mask); + check_mbox_sram_ecc(MBOX_DOUBLE, test_mask); +} + +uint32_t run_iccm_sram_ecc (enum mask_config test_mask) { + enum test_list cur_test; + + uint32_t * ICCM = (uint32_t *) RV_ICCM_SADR; + uint32_t * code_word = 0; + uint32_t * iccm_dest = ICCM; + void (* iccm_fn) (void) = (void*) ICCM; + + uint32_t resp; + + VPRINTF(MEDIUM, "\n*** Run ICCM SRAM ECC Err ***\n Masked: %d\n\n", test_mask == WITH_MASK); + + // Grab test enum + if (test_mask == WITH_MASK) { cur_test = ICCM_SRAM_ECC_SINGLE_MASKED; } + else if (test_mask == NO_MASK) { cur_test = ICCM_SRAM_ECC_SINGLE_UNMASKED; } + else { cur_test = TEST_COUNT; } + + // Request that TB inject ICCM SRAM single-bit errors + // This should not result in any reset or reporting activity + SEND_STDOUT_CTRL(ICCM_SINGLE); + + // Copy routine to ICCM + code_word = (uint32_t *) &iccm_code0_start; + VPRINTF(LOW, "Copy code from %x [thru %x] to %x\n", (uintptr_t) code_word, &iccm_code0_end, (uintptr_t) iccm_dest); + while (code_word < (uint32_t *) &iccm_code0_end) { + VPRINTF(ALL, "at %x: %x\n", (uintptr_t) code_word, *code_word); + *iccm_dest++ = *code_word++; + } + + // Reset the Error Injection Function + SEND_STDOUT_CTRL((uint32_t) ERROR_NONE); + + // Flag Single-bit test as having run + test_progress_g[cur_test] = RUN_NOT_CHECKED; + + // Run ICCM routine + iccm_fn(); + + // Confirm TB reports no observed activity + resp = lsu_read_32(CLP_SOC_IFC_REG_CPTRA_GENERIC_INPUT_WIRES_0); + if (resp != ERROR_NONE_SET) { + VPRINTF(ERROR, "ERROR: Bad resp from TB. Got: 0x%x Exp 0x%x\n", resp, ERROR_NONE_SET); + test_progress_g[cur_test] = RUN_AND_FAILED; + } else { + __asm__ volatile ("csrr %0, %1" + : "=r" (resp) /* output : register */ + : "i" (VEER_CSR_MICCMECT) /* input : immediate */ + : /* clobbers: none */); + if (resp == 0) { + VPRINTF(ERROR, "ERROR: ICCM Cor error count is 0\n"); + test_progress_g[cur_test] = RUN_AND_FAILED; + } else { + test_progress_g[cur_test] = RUN_AND_PASSED; + } + } + + // Should return here after encountering single-bit (correctable) ECC errors + // while running ICCM routine + // Set new test enum + if (test_mask == WITH_MASK) { cur_test = ICCM_SRAM_ECC_DOUBLE_MASKED; } + else if (test_mask == NO_MASK) { cur_test = ICCM_SRAM_ECC_DOUBLE_UNMASKED; } + else { cur_test = TEST_COUNT; } + + // Now, set the MASK (per arg) + if (test_mask == WITH_MASK) { + lsu_write_32(CLP_SOC_IFC_REG_INTERNAL_HW_ERROR_FATAL_MASK, SOC_IFC_REG_INTERNAL_HW_ERROR_FATAL_MASK_MASK_ICCM_ECC_UNC_MASK); + } else if (test_mask == NO_MASK) { + uint32_t mask_val = lsu_read_32(CLP_SOC_IFC_REG_INTERNAL_HW_ERROR_FATAL_MASK); + mask_val &= ~SOC_IFC_REG_INTERNAL_HW_ERROR_FATAL_MASK_MASK_ICCM_ECC_UNC_MASK; + lsu_write_32(CLP_SOC_IFC_REG_INTERNAL_HW_ERROR_FATAL_MASK, mask_val); + } + + // Request that TB inject ICCM SRAM double-bit errors + // This should result in FATAL error and caliptra reset + SEND_STDOUT_CTRL(ICCM_DOUBLE); + + // Copy routine to ICCM + code_word = (uint32_t *) &iccm_code0_start; + iccm_dest = ICCM; + VPRINTF(LOW, "Copy code from %x [thru %x] to %x\n", (uintptr_t) code_word, &iccm_code0_end, (uintptr_t) iccm_dest); + while (code_word < (uint32_t *) &iccm_code0_end) { + VPRINTF(ALL, "at %x: %x\n", (uintptr_t) code_word, *code_word); + *iccm_dest++ = *code_word++; + } + + // Reset the Error Injection Function + SEND_STDOUT_CTRL((uint32_t) ERROR_NONE); + + // Clear the exception flag so we can properly check that it was set for an unmasked test + exc_flag.exception_hit = 0; + exc_flag.mcause = 0; + exc_flag.mscause = 0; + + // Flag Double-bit test as having run + test_progress_g[cur_test] = RUN_NOT_CHECKED; + + // Run ICCM routine + // If FATAL error unmasked, this will trigger a reset. + // Else, we'll observe a precise exception, which should do a firmware reset + iccm_fn(); + + // Wait for the reset to occur + if (test_mask == NO_MASK) { VPRINTF(HIGH, "...\n"); while(1); } + +} + +uint32_t check_iccm_sram_ecc (enum mask_config test_mask) { + enum test_list cur_test; + uint32_t resp; + uint32_t sts = SUCCESS; + + VPRINTF(MEDIUM, "\n*** Check ICCM SRAM ECC Err ***\n Masked: %d\n\n", test_mask == WITH_MASK); + + // Get test ID + if (test_mask == WITH_MASK) { cur_test = ICCM_SRAM_ECC_DOUBLE_MASKED; } + else { cur_test = ICCM_SRAM_ECC_DOUBLE_UNMASKED; } + + // Verify correct response path was taken + resp = lsu_read_32(CLP_SOC_IFC_REG_CPTRA_GENERIC_INPUT_WIRES_0); + if (test_mask == WITH_MASK) { + // For a MASKED error, we only expect the exception path and no response from TB + if (exc_flag.exception_hit == 0) { + test_progress_g[cur_test] = RUN_AND_FAILED; + sts |= INTR_COUNT_0; + } else if (exc_flag.mcause != RISCV_EXCP_INSTRUCTION_ACCESS_FAULT || + exc_flag.mscause != RISC_EXCP_MSCAUSE_ICCM_INST_UNC_ECC_ERR) { + test_progress_g[cur_test] = RUN_AND_FAILED; + sts |= BAD_EXCP_CODE; + } else if (resp != ERROR_NONE_SET) { + test_progress_g[cur_test] = RUN_AND_FAILED; + sts |= BAD_CPTRA_SIG; + } else { + test_progress_g[cur_test] = RUN_AND_PASSED; + } + lsu_write_32(CLP_SOC_IFC_REG_CPTRA_HW_ERROR_FATAL, SOC_IFC_REG_CPTRA_HW_ERROR_FATAL_ICCM_ECC_UNC_MASK); + } else { + // For an UNMASKED error, we expect ICCM ECC FATAL Error to trigger TB reset and input val + if (resp == ICCM_FATAL_OBSERVED) { + test_progress_g[cur_test] = RUN_AND_PASSED; + } else { + test_progress_g[cur_test] = RUN_AND_FAILED; + sts |= BAD_CPTRA_SIG; + } + } + + return sts; +} + +// TODO should test both DMA slave and internal DCCM accesses? +uint32_t run_dccm_sram_ecc (enum mask_config test_mask) { + enum test_list cur_test; + + uint32_t array_in_dccm [10]; // stack is in DCCM, so this automatically goes there + uint32_t* safe_iter = (uint32_t*) MBOX_DIR_BASE_ADDR; // Pointer to mailbox memory allows us to define an iteration variable that will not be corrupted by DCCM error injection + + uint32_t resp = lsu_read_32(CLP_SOC_IFC_REG_INTERNAL_RV_MTIME_L); + + VPRINTF(MEDIUM, "\n*** Run DCCM SRAM ECC Err ***\n Masked: %d\n\n", test_mask == WITH_MASK); + + // Grab test enum + if (test_mask == WITH_MASK) { cur_test = DCCM_SRAM_ECC_SINGLE_MASKED; } + else if (test_mask == NO_MASK) { cur_test = DCCM_SRAM_ECC_SINGLE_UNMASKED; } + else { cur_test = TEST_COUNT; } + + // Acquire the mailbox lock (to allow direct-mode use of safe_iter) + while((lsu_read_32(CLP_MBOX_CSR_MBOX_LOCK) & MBOX_CSR_MBOX_LOCK_LOCK_MASK) != 0) { + VPRINTF(MEDIUM, "Get mbox lock\n"); + } + + // Request that TB inject DCCM SRAM single-bit errors + // This should not result in any reset or reporting activity + SEND_STDOUT_CTRL(DCCM_SINGLE); + + // Populate array in DCCM (should be corrupted) + *safe_iter = 0; + while(*safe_iter < 10) { + resp = (resp << 1) ^ lsu_read_32(CLP_SOC_IFC_REG_INTERNAL_RV_MTIME_L); + array_in_dccm[*safe_iter] = resp; + *safe_iter = (*safe_iter) + 1; + } + + // Reset the Error Injection Function + SEND_STDOUT_CTRL((uint32_t) ERROR_NONE); + __asm__ volatile ("fence.i"); + + // Flag Single-bit test as having run + test_progress_g[cur_test] = RUN_NOT_CHECKED; + + // Read-back the array in DCCM + *safe_iter = 0; + while(*safe_iter < 10) { + printf("[%d]:%x\n", *safe_iter, array_in_dccm[*safe_iter]); // no verbosity control -- dereferencing the array IS the test + *safe_iter = (*safe_iter) + 1; + } + + // Unlock Mailbox + lsu_write_32(CLP_MBOX_CSR_MBOX_UNLOCK, MBOX_CSR_MBOX_UNLOCK_UNLOCK_MASK); + + // Confirm TB reports no observed activity + resp = lsu_read_32(CLP_SOC_IFC_REG_CPTRA_GENERIC_INPUT_WIRES_0); + if (resp != ERROR_NONE_SET) { + VPRINTF(ERROR, "ERROR: Bad resp from TB. Got: 0x%x Exp 0x%x\n", resp, ERROR_NONE_SET); + test_progress_g[cur_test] = RUN_AND_FAILED; + } else { + __asm__ volatile ("csrr %0, %1" + : "=r" (resp) /* output : register */ + : "i" (VEER_CSR_MDCCMECT) /* input : immediate */ + : /* clobbers: none */); + if (resp == 0) { + VPRINTF(ERROR, "ERROR: DCCM Cor error count is 0\n"); + test_progress_g[cur_test] = RUN_AND_FAILED; + } else { + test_progress_g[cur_test] = RUN_AND_PASSED; + } + } + + // Should return here after encountering single-bit (correctable) ECC errors + // while running DCCM routine + // Set new test enum + if (test_mask == WITH_MASK) { cur_test = DCCM_SRAM_ECC_DOUBLE_MASKED; } + else if (test_mask == NO_MASK) { cur_test = DCCM_SRAM_ECC_DOUBLE_UNMASKED; } + else { cur_test = TEST_COUNT; } + + // Now, set the MASK (per arg) + if (test_mask == WITH_MASK) { + lsu_write_32(CLP_SOC_IFC_REG_INTERNAL_HW_ERROR_FATAL_MASK, SOC_IFC_REG_INTERNAL_HW_ERROR_FATAL_MASK_MASK_DCCM_ECC_UNC_MASK); + } else if (test_mask == NO_MASK) { + uint32_t mask_val = lsu_read_32(CLP_SOC_IFC_REG_INTERNAL_HW_ERROR_FATAL_MASK); + mask_val &= ~SOC_IFC_REG_INTERNAL_HW_ERROR_FATAL_MASK_MASK_DCCM_ECC_UNC_MASK; + lsu_write_32(CLP_SOC_IFC_REG_INTERNAL_HW_ERROR_FATAL_MASK, mask_val); + } + + // Acquire the mailbox lock (to allow direct-mode use of safe_iter) + while((lsu_read_32(CLP_MBOX_CSR_MBOX_LOCK) & MBOX_CSR_MBOX_LOCK_LOCK_MASK) != 0) { + VPRINTF(MEDIUM, "Get mbox lock\n"); + } + + // Request that TB inject DCCM SRAM double-bit errors + // This should result in FATAL error and caliptra reset + // when reading back + SEND_STDOUT_CTRL(DCCM_DOUBLE); + + // Populate array in DCCM (should be corrupted) + *safe_iter = 0; + while(*safe_iter < 10) { + resp = (resp << 1) ^ lsu_read_32(CLP_SOC_IFC_REG_INTERNAL_RV_MTIME_L); + array_in_dccm[*safe_iter] = resp; + *safe_iter = (*safe_iter) + 1; + } + + // Reset the Error Injection Function + SEND_STDOUT_CTRL((uint32_t) ERROR_NONE); + __asm__ volatile ("fence.i"); + + // TODO check for AMO/Store exception here? + + // Clear the exception flag so we can properly check that it was set for an unmasked test + exc_flag.exception_hit = 0; + exc_flag.mcause = 0; + exc_flag.mscause = 0; + + // Flag Double-bit test as having run + test_progress_g[cur_test] = RUN_NOT_CHECKED; + + // Read-back the array in DCCM + // If FATAL error unmasked, this will trigger a reset. + // Else, we'll observe a precise exception + *safe_iter = 0; + while(*safe_iter < 10) { + printf("[%d]:%x\n", *safe_iter, array_in_dccm[*safe_iter]); // no verbosity control -- dereferencing the array IS the test + *safe_iter = (*safe_iter) + 1; + } + + // Unlock Mailbox + lsu_write_32(CLP_MBOX_CSR_MBOX_UNLOCK, MBOX_CSR_MBOX_UNLOCK_UNLOCK_MASK); + + // Wait for the reset to occur + if (test_mask == NO_MASK) { VPRINTF(HIGH, "...\n"); while(1); } + +} + +uint32_t check_dccm_sram_ecc (enum mask_config test_mask) { + enum test_list cur_test; + uint32_t resp; + uint32_t sts = SUCCESS; + + VPRINTF(MEDIUM, "\n*** Check DCCM SRAM ECC Err ***\n Masked: %d\n\n", test_mask == WITH_MASK); + + // Get test ID + if (test_mask == WITH_MASK) { cur_test = DCCM_SRAM_ECC_DOUBLE_MASKED; } + else { cur_test = DCCM_SRAM_ECC_DOUBLE_UNMASKED; } + + // Verify correct response path was taken + resp = lsu_read_32(CLP_SOC_IFC_REG_CPTRA_GENERIC_INPUT_WIRES_0); + if (test_mask == WITH_MASK) { + // For a MASKED error, we only expect the exception path and no response from TB + if (exc_flag.exception_hit == 0) { + test_progress_g[cur_test] = RUN_AND_FAILED; + sts |= INTR_COUNT_0; + VPRINTF(ERROR, "ERROR: No excpn\n"); + } else if (exc_flag.mcause != RISCV_EXCP_LOAD_ACCESS_FAULT || + exc_flag.mscause != RISC_EXCP_MSCAUSE_DCCM_LOAD_UNC_ECC_ERR) { + test_progress_g[cur_test] = RUN_AND_FAILED; + sts |= BAD_EXCP_CODE; + VPRINTF(ERROR, "ERROR: Wrong excpn cause. Got: 0x%x msc 0x%x\n", exc_flag.mcause, exc_flag.mscause); + } else if (resp != ERROR_NONE_SET) { + test_progress_g[cur_test] = RUN_AND_FAILED; + sts |= BAD_CPTRA_SIG; + VPRINTF(ERROR, "ERROR: Wrong TB resp\n"); + } else { + test_progress_g[cur_test] = RUN_AND_PASSED; + } + lsu_write_32(CLP_SOC_IFC_REG_CPTRA_HW_ERROR_FATAL, SOC_IFC_REG_CPTRA_HW_ERROR_FATAL_DCCM_ECC_UNC_MASK); + } else { + // For an UNMASKED error, we expect DCCM ECC FATAL Error to trigger TB reset and input val + if (resp == DCCM_FATAL_OBSERVED) { + test_progress_g[cur_test] = RUN_AND_PASSED; + } else { + test_progress_g[cur_test] = RUN_AND_FAILED; + sts |= BAD_CPTRA_SIG; + VPRINTF(ERROR, "ERROR: Wrong TB resp. Exp 0x%x Got 0x%x\n", DCCM_FATAL_OBSERVED, resp); + } + } + + return sts; +} + +void run_nmi_test (enum mask_config test_mask) { + enum test_list cur_test; + VPRINTF(MEDIUM, "\n*** Run Non-Maskable Intr ***\n Masked: %d\n\n", test_mask == WITH_MASK); + + // Get test ID + if (test_mask == WITH_MASK) { cur_test = NMI_MASKED; } + else { cur_test = NMI_UNMASKED; } + + //Enable WDT so that both timers time out and NMI is issued + lsu_write_32(CLP_SOC_IFC_REG_CPTRA_WDT_TIMER1_TIMEOUT_PERIOD_0, 0x00000040); + lsu_write_32(CLP_SOC_IFC_REG_CPTRA_WDT_TIMER1_TIMEOUT_PERIOD_1, 0x00000000); + lsu_write_32(CLP_SOC_IFC_REG_CPTRA_WDT_TIMER2_TIMEOUT_PERIOD_0, 0x00000040); + lsu_write_32(CLP_SOC_IFC_REG_CPTRA_WDT_TIMER2_TIMEOUT_PERIOD_1, 0x00000000); + lsu_write_32(CLP_SOC_IFC_REG_CPTRA_WDT_TIMER1_EN, SOC_IFC_REG_CPTRA_WDT_TIMER1_EN_TIMER1_EN_MASK); + + //Set mask + if (test_mask == WITH_MASK) { + lsu_write_32(CLP_SOC_IFC_REG_INTERNAL_HW_ERROR_FATAL_MASK, SOC_IFC_REG_INTERNAL_HW_ERROR_FATAL_MASK_MASK_NMI_PIN_MASK); + } + // Wait for interrupt + while(1) { + __asm__ volatile ("wfi"); // "Wait for interrupt" + // Continuously loop to allow the ICCM ECC ERROR to trigger system reset + for (uint16_t slp = 0; slp < 1000; slp++) { + __asm__ volatile ("nop"); // Sleep loop as "nop" + } + putchar('.'); + } + + test_progress_g[cur_test] = RUN_NOT_CHECKED; + + return; +} + +uint32_t check_nmi_test (enum mask_config test_mask) { + uint32_t sts = 0; + enum test_list cur_test; + VPRINTF(MEDIUM, "\n*** Check Non-Maskable Intr ***\n Masked: %d\n\n", test_mask == WITH_MASK); + // Get test ID + if (test_mask == WITH_MASK) { cur_test = NMI_MASKED; } + else { cur_test = NMI_UNMASKED; } + //test_progress_g[cur_test] = RUN_AND_PASSED; + + if (test_mask == WITH_MASK) { + // No generic input toggle expected out of reset + if ((cptra_intr_rcv.soc_ifc_notif & SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTR_EN_R_NOTIF_GEN_IN_TOGGLE_EN_MASK) && (lsu_read_32(CLP_SOC_IFC_REG_CPTRA_GENERIC_INPUT_WIRES_0) != generic_input_wires_0_before_rst)) { + VPRINTF(ERROR, "ERROR: Gen-in tgl with bad val\n"); + sts |= BAD_CPTRA_SIG; + test_progress_g[cur_test] = RUN_AND_FAILED; + } else { + sts |= SUCCESS; + test_progress_g[cur_test] = RUN_AND_PASSED; + } + + lsu_write_32(CLP_SOC_IFC_REG_CPTRA_HW_ERROR_FATAL, SOC_IFC_REG_CPTRA_HW_ERROR_FATAL_NMI_PIN_MASK); + } else { + // Check for generic_input_wires activity + if (!(cptra_intr_rcv.soc_ifc_notif & SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTR_EN_R_NOTIF_GEN_IN_TOGGLE_EN_MASK)) { + VPRINTF(ERROR, "ERROR: Gen-in did not tgl\n"); + sts |= BAD_CPTRA_SIG; + test_progress_g[cur_test] = RUN_AND_FAILED; + } else if (lsu_read_32(CLP_SOC_IFC_REG_CPTRA_GENERIC_INPUT_WIRES_0) != NMI_FATAL_OBSERVED) { + VPRINTF(ERROR, "ERROR: Gen-in bad val\n"); + sts |= BAD_CPTRA_SIG; + test_progress_g[cur_test] = RUN_AND_FAILED; + } else { + sts |= SUCCESS; + test_progress_g[cur_test] = RUN_AND_PASSED; + } + } + + + return sts; +} + +void run_mbox_no_lock_error(enum mask_config test_mask) { + enum test_list cur_test; + VPRINTF(MEDIUM, "\n*** Run Mbox No Lock ***\n Masked: %d\n\n", test_mask == WITH_MASK); + + // Get test ID + if (test_mask == WITH_MASK) { cur_test = PROT_NO_LOCK_MASKED; } + else if (test_mask == NO_MASK) { cur_test = PROT_NO_LOCK_UNMASKED; } + else { cur_test = TEST_COUNT; } + + // Generic input wires should toggle if unmasked, clear the flag so we can see it update + cptra_intr_rcv.soc_ifc_notif = 0; + // Also clear the mbox cmd fail flag + cptra_intr_rcv.soc_ifc_error = 0; + + //Set the mask + if (test_mask == WITH_MASK) + lsu_write_32(CLP_SOC_IFC_REG_INTERNAL_HW_ERROR_NON_FATAL_MASK, SOC_IFC_REG_INTERNAL_HW_ERROR_NON_FATAL_MASK_MASK_MBOX_PROT_NO_LOCK_MASK); + + // run test (try to read dataout without having lock) + lsu_write_32(CLP_MBOX_CSR_MBOX_UNLOCK,MBOX_CSR_MBOX_UNLOCK_UNLOCK_MASK); // Be sure it's unlocked + // Instruct TB to do bad mailbox flow + SEND_STDOUT_CTRL(0xe5); + + // Flag test as having run + test_progress_g[cur_test] = RUN_NOT_CHECKED; + +} + +void run_mbox_ooo_error(enum mask_config test_mask) { + enum test_list cur_test; + VPRINTF(MEDIUM, "\n*** Run Mbox Out-of-order ***\n Masked: %d\n\n", test_mask == WITH_MASK); + + // Get test ID + if (test_mask == WITH_MASK) { cur_test = PROT_OOO_MASKED; } + else if (test_mask == NO_MASK) { cur_test = PROT_OOO_UNMASKED; } + else { cur_test = TEST_COUNT; } + + // Generic input wires should toggle if unmasked, clear the flag so we can see it update + cptra_intr_rcv.soc_ifc_notif = 0; + // Also clear the mbox cmd fail flag + cptra_intr_rcv.soc_ifc_error = 0; + + //Set the mask + if (test_mask == WITH_MASK) + lsu_write_32(CLP_SOC_IFC_REG_INTERNAL_HW_ERROR_NON_FATAL_MASK, SOC_IFC_REG_INTERNAL_HW_ERROR_NON_FATAL_MASK_MASK_MBOX_PROT_OOO_MASK); + + // Flag test as having run + test_progress_g[cur_test] = RUN_NOT_CHECKED; + + // run test (try to read dataout without having lock) + // Instruct TB to do bad mailbox flow + SEND_STDOUT_CTRL(0xe6); //Mailbox unlocked through ISR + + //return; + +} + +uint32_t check_mbox_no_lock_error(enum mask_config test_mask) { + enum test_list cur_test; + uint32_t sts = 0; + VPRINTF(MEDIUM, "\n*** Check Mbox No Lock ***\n Masked: %d\n\n", test_mask == WITH_MASK); + + // Get test ID + if (test_mask == WITH_MASK) { cur_test = PROT_NO_LOCK_MASKED; } + else if (test_mask == NO_MASK) { cur_test = PROT_NO_LOCK_UNMASKED; } + else { cur_test = TEST_COUNT; } + + if (!(cptra_intr_rcv.soc_ifc_error & SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_CMD_FAIL_STS_MASK)) { + VPRINTF(ERROR, "ERROR: No cmd fail intr\n"); + sts |= INTR_COUNT_0; + test_progress_g[cur_test] = RUN_AND_FAILED; + } else if (test_mask == WITH_MASK) { + // Check for generic_input_wires activity + if (cptra_intr_rcv.soc_ifc_notif & SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTR_EN_R_NOTIF_GEN_IN_TOGGLE_EN_MASK) { + VPRINTF(ERROR, "ERROR: Gen-in tgl\n"); + sts |= BAD_CPTRA_SIG; + test_progress_g[cur_test] = RUN_AND_FAILED; + } else { + sts |= SUCCESS; + test_progress_g[cur_test] = RUN_AND_PASSED; + } + lsu_write_32(CLP_SOC_IFC_REG_CPTRA_HW_ERROR_NON_FATAL, SOC_IFC_REG_CPTRA_HW_ERROR_NON_FATAL_MBOX_PROT_NO_LOCK_MASK); + } else { + // Check for generic_input_wires activity + if (!(cptra_intr_rcv.soc_ifc_notif & SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTR_EN_R_NOTIF_GEN_IN_TOGGLE_EN_MASK)) { + VPRINTF(ERROR, "ERROR: Gen-in did not tgl\n"); + sts |= BAD_CPTRA_SIG; + test_progress_g[cur_test] = RUN_AND_FAILED; + } else if (lsu_read_32(CLP_SOC_IFC_REG_CPTRA_GENERIC_INPUT_WIRES_0) != PROT_NO_LOCK_NON_FATAL_OBSERVED) { + VPRINTF(ERROR, "ERROR: Gen-in bad val\n"); + sts |= BAD_CPTRA_SIG; + test_progress_g[cur_test] = RUN_AND_FAILED; + } else { + sts |= SUCCESS; + test_progress_g[cur_test] = RUN_AND_PASSED; + } + } + + //Unlock mailbox + lsu_write_32(CLP_MBOX_CSR_MBOX_UNLOCK,MBOX_CSR_MBOX_UNLOCK_UNLOCK_MASK); + + return sts; +} + +uint32_t check_mbox_ooo_error(enum mask_config test_mask) { + enum test_list cur_test; + uint32_t sts = 0; + VPRINTF(MEDIUM, "\n*** Check Mbox Out-of-order ***\n Masked: %d\n\n", test_mask == WITH_MASK); + + // Get test ID + if (test_mask == WITH_MASK) { cur_test = PROT_OOO_MASKED; } + else if (test_mask == NO_MASK) { cur_test = PROT_OOO_UNMASKED; } + else { cur_test = TEST_COUNT; } + + if (!(cptra_intr_rcv.soc_ifc_error & SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_CMD_FAIL_STS_MASK)) { + VPRINTF(ERROR, "ERROR: No cmd fail intr\n"); + sts |= INTR_COUNT_0; + test_progress_g[cur_test] = RUN_AND_FAILED; + } else if (test_mask == WITH_MASK) { + // Check for generic_input_wires activity + if (cptra_intr_rcv.soc_ifc_notif & SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTR_EN_R_NOTIF_GEN_IN_TOGGLE_EN_MASK) { + VPRINTF(ERROR, "ERROR: Gen-in tgl\n"); + sts |= BAD_CPTRA_SIG; + test_progress_g[cur_test] = RUN_AND_FAILED; + } else { + sts |= SUCCESS; + test_progress_g[cur_test] = RUN_AND_PASSED; + } + lsu_write_32(CLP_SOC_IFC_REG_CPTRA_HW_ERROR_NON_FATAL, SOC_IFC_REG_CPTRA_HW_ERROR_NON_FATAL_MBOX_PROT_OOO_MASK); + + //Reset out-of-order access flag + SEND_STDOUT_CTRL(0xe7); + } else { + // Check for generic_input_wires activity + if (!(cptra_intr_rcv.soc_ifc_notif & SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTR_EN_R_NOTIF_GEN_IN_TOGGLE_EN_MASK)) { + VPRINTF(ERROR, "ERROR: Gen-in did not tgl\n"); + sts |= BAD_CPTRA_SIG; + test_progress_g[cur_test] = RUN_AND_FAILED; + } else if (lsu_read_32(CLP_SOC_IFC_REG_CPTRA_GENERIC_INPUT_WIRES_0) != PROT_OOO_NON_FATAL_OBSERVED) { + VPRINTF(ERROR, "ERROR: Gen-in bad val\n"); + sts |= BAD_CPTRA_SIG; + test_progress_g[cur_test] = RUN_AND_FAILED; + } else { + sts |= SUCCESS; + test_progress_g[cur_test] = RUN_AND_PASSED; + } + } + + return sts; +} + +void execute_from_iccm (void) { + // Do a bunch of nonsense tasks just to populate the code space. + // When running this routine, we expect to encounter ICCM ECC Errors and + // get reset by TB + uint32_t tmp_reg, tmp_reg2; + VPRINTF(LOW, "Exec from ICCM\n"); + tmp_reg = lsu_read_32(CLP_SOC_IFC_REG_CPTRA_HW_CONFIG); + VPRINTF(LOW, "HW_CFG: 0x%x\n", tmp_reg); + tmp_reg = lsu_read_32(CLP_SOC_IFC_REG_INTERNAL_RV_MTIMECMP_L); + tmp_reg2 = lsu_read_32(CLP_SOC_IFC_REG_INTERNAL_RV_MTIMECMP_H); + VPRINTF(LOW, "MTIMECMP: 0x%x %x\n", tmp_reg2, tmp_reg); + tmp_reg = lsu_read_32(CLP_SOC_IFC_REG_INTERNAL_RV_MTIME_L); + tmp_reg2 = lsu_read_32(CLP_SOC_IFC_REG_INTERNAL_RV_MTIME_H); + VPRINTF(LOW, "MTIME: 0x%x %x\n", tmp_reg2, tmp_reg); + // This reg isn't even writable, so nothing should happen... + if (tmp_reg2) { + lsu_write_32(CLP_SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_COUNT_INCR_R, tmp_reg2 ^ tmp_reg); + } else { + lsu_write_32(CLP_SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_COUNT_INCR_R, (tmp_reg2 - 1) ^ tmp_reg); + } + tmp_reg = csr_read_mepc(); + tmp_reg2 = csr_read_mtval(); + tmp_reg ^= csr_read_mtvec(); + tmp_reg2 ^= csr_read_mie(); + tmp_reg ^= csr_read_mip(); + tmp_reg2 ^= csr_read_mvendorid(); + tmp_reg ^= tmp_reg2; + VPRINTF(LOW, "Nonsense result: 0x%x\n", tmp_reg); + // ERROR_FATAL interrupt will only go to TB if running the unmasked + // double-bit error test, so we expect to get here successfully and return + // in other test cases + if (test_progress_g[ICCM_SRAM_ECC_DOUBLE_UNMASKED] == RUN_NOT_CHECKED && + test_progress_g[ICCM_SRAM_ECC_SINGLE_MASKED ] == NOT_STARTED) { + while(1) { + __asm__ volatile ("wfi"); // "Wait for interrupt" + // Continuously loop to allow the ICCM ECC ERROR to trigger system reset + for (uint16_t slp = 0; slp < 1000; slp++) { + __asm__ volatile ("nop"); // Sleep loop as "nop" + } + putchar('.'); + } + } else { + return; + } +} + +// In the ROM .text section +void nmi_handler (void) { + VPRINTF(LOW, "**** NMI ****\n"); + if (boot_count != BEFORE_FIRST_NMI_FAILURE && boot_count != BEFORE_SECOND_NMI_FAILURE) { + VPRINTF(ERROR, "ERROR: NMI unexpected. mcause [0x%x]!\n", csr_read_mcause()); // did not expect NMI + VPRINTF(ERROR, " mepc [0x%x]\n", csr_read_mepc()); + SEND_STDOUT_CTRL(0x1); + while(1); + } + // If we got here via internal NMI, it's an error - kill the sim + if ((csr_read_mcause() & MCAUSE_NMI_BIT_MASK) == MCAUSE_NMI_BIT_MASK) { + VPRINTF(ERROR, "ERROR: NMI w/ mcause [0x%x]!\n", csr_read_mcause()); + VPRINTF(ERROR, " mepc [0x%x]\n", csr_read_mepc()); + SEND_STDOUT_CTRL(0x1); + while(1); + } + // NMI occurred, but was caused by pin-assertion due to Watchdog Timer + else if (lsu_read_32(CLP_SOC_IFC_REG_CPTRA_HW_ERROR_FATAL) & SOC_IFC_REG_CPTRA_HW_ERROR_FATAL_NMI_PIN_MASK) { + //Save generic_input_wires value before reset to compare later. This is to avoid flagging the toggle during reset as an error + generic_input_wires_0_before_rst = lsu_read_32(CLP_SOC_IFC_REG_CPTRA_GENERIC_INPUT_WIRES_0); + VPRINTF(MEDIUM, "NMI w/ mcause [0x%x] during NMI test\n", csr_read_mcause()); + VPRINTF(MEDIUM, "mepc [0x%x]\n", csr_read_mepc()); + // If the FATAL Error bit for NMI is masked, manually trigger firmware reset + if (lsu_read_32(CLP_SOC_IFC_REG_INTERNAL_HW_ERROR_FATAL_MASK) & SOC_IFC_REG_INTERNAL_HW_ERROR_FATAL_MASK_MASK_NMI_PIN_MASK) { + VPRINTF(LOW, "NMI bit masked, no rst exp from TB: rst core manually!\n"); + //lsu_write_32(CLP_SOC_IFC_REG_INTERNAL_FW_UPDATE_RESET, SOC_IFC_REG_INTERNAL_FW_UPDATE_RESET_CORE_RST_MASK); + SEND_STDOUT_CTRL(0xf6); + // Otherwise, wait for core reset + } else { + VPRINTF(LOW, "NMI bit unmasked, wait for TB rst!\n"); + while(1); + } + } +} + +void main(void) { + + uint32_t sts; + uint8_t test_fail = 0; + + VPRINTF(LOW, "\n----------------------------------\nRAS Smoke Test!!\n----------------------------------\n"); + + // Setup the interrupt CSR configuration + init_interrupts(); + + // Initialize the counter + intr_count = 0; + boot_count++; // After first boot should be 1 + + // Setup the NMI Handler + lsu_write_32((uintptr_t) (CLP_SOC_IFC_REG_INTERNAL_NMI_VECTOR), (uint32_t) (nmi_handler)); + + // Test Mailbox SRAM ECC + if (boot_count == BEFORE_FIRST_ICCM_FAILURE) { + test_mbox_sram_ecc(NO_MASK); + test_mbox_sram_ecc(WITH_MASK); + } + // No reset expected following MBOX SRAM ECC Error injection + + // Test ICCM SRAM ECC + if (boot_count == BEFORE_FIRST_ICCM_FAILURE) { run_iccm_sram_ecc(NO_MASK ); } + else if (boot_count == BEFORE_SECOND_ICCM_FAILURE) { check_iccm_sram_ecc(NO_MASK ); + run_iccm_sram_ecc(WITH_MASK); } + else if (boot_count == BEFORE_FIRST_DCCM_FAILURE) { check_iccm_sram_ecc(WITH_MASK); } + + // Test DCCM SRAM ECC + if (boot_count == BEFORE_FIRST_DCCM_FAILURE){ run_dccm_sram_ecc(NO_MASK ); } + else if (boot_count == BEFORE_FIRST_NMI_FAILURE) { check_dccm_sram_ecc(NO_MASK ); + run_dccm_sram_ecc(WITH_MASK); + check_dccm_sram_ecc(WITH_MASK); } + + // Test WDT Expiration + if (boot_count == BEFORE_FIRST_NMI_FAILURE) { run_nmi_test(NO_MASK ); } + else if (boot_count == BEFORE_SECOND_NMI_FAILURE){ check_nmi_test(NO_MASK ); + run_nmi_test(WITH_MASK); } + else if (boot_count == AFTER_SECOND_NMI_FAILURE) { check_nmi_test(WITH_MASK); } + + // Test Mailbox Protocol Violations (no reset expected) + if (boot_count == AFTER_SECOND_NMI_FAILURE) { run_mbox_no_lock_error ( NO_MASK); + check_mbox_no_lock_error ( NO_MASK); + run_mbox_ooo_error ( NO_MASK); + check_mbox_ooo_error ( NO_MASK); + run_mbox_no_lock_error (WITH_MASK); + check_mbox_no_lock_error (WITH_MASK); + run_mbox_ooo_error (WITH_MASK); + check_mbox_ooo_error (WITH_MASK); } + + // Final Report + VPRINTF(MEDIUM, "Eval test progress...\n"); + for (enum test_list tests = 0; tests < TEST_COUNT; tests++) { + if (test_progress_g[tests] != RUN_AND_PASSED) { + VPRINTF(ERROR, "Test [%d] failed! Progress: %d\n", tests, test_progress_g[tests]); + test_fail = 1; + } + } + + if (test_fail) { + VPRINTF(ERROR, "RAS error injection test failed\n"); + SEND_STDOUT_CTRL(0x1); + while(1); + } else { + VPRINTF(LOW, "RAS test pass\n"); + } + + return; + +} diff --git a/src/integration/test_suites/smoke_test_ras/smoke_test_ras.ld b/src/integration/test_suites/smoke_test_ras/smoke_test_ras.ld new file mode 100644 index 000000000..39fa35419 --- /dev/null +++ b/src/integration/test_suites/smoke_test_ras/smoke_test_ras.ld @@ -0,0 +1,69 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +OUTPUT_ARCH( "riscv" ) +ENTRY(_start) + +SECTIONS { + . = 0x0; + .text : { *(.text*) } + + .eh_frame : { *(.eh_frame) } + /* DCCM as VMA */ + /* Data is bundled with ROM image in iMem */ + /* Align data to 4-bytes to allow LSU access to work + * when copying to DCCM */ + /* Only upper half of DCCM is used for ROM image */ + _data_lma_start = ALIGN(4); + _data_vma_start = 0x50010000; + .data _data_vma_start : AT(_data_lma_start) { *(.srodata*) ; . = ALIGN(4);} =0x0000, + _data_lma_end = _data_lma_start + SIZEOF(.data); + _data_vma_end = _data_vma_start + SIZEOF(.data); + + _bss_lma_start = _data_lma_end; + _bss_vma_start = _data_vma_end; + .bss _bss_vma_start : AT(_bss_lma_start) { *(.sbss) *(.bss) ; . = ALIGN(4);} =0x0000, + _bss_lma_end = _bss_lma_start + SIZEOF(.bss); + _bss_vma_end = _bss_vma_start + SIZEOF(.bss); + + _end = _bss_lma_end; + ASSERT( _end < 0x0000C000, "ERROR: ROM size exceeds 48KiB") + + /* DCCM as VMA and LMA */ + . = _bss_vma_end; + _dccm_lma_start = _bss_vma_end; /* ----\___ SAME */ + _dccm_vma_start = _bss_vma_end; /* ----/ */ + .dccm _dccm_vma_start : AT(_dccm_lma_start) { *(.*data) *(.rodata*) *(.dccm*) . = ALIGN(4); } =0x0000, + iccm_code0_start = .; + + /* ICCM as VMA */ + /* All of these sections start at the base address of ICCM, and cannot coexist */ + /* The code in these sections will be loaded to DCCM alongside .data and later + * copied into ICCM for execution. + * NOTE: none of these sections will be used by the val image/FMC/RT flows */ + .data_iccm0 0x40000000 : AT(iccm_code0_start) {*(.data_iccm0) ; . = ALIGN(4); } =0x0000, /* iccm_code0_start, after .data, as LMA */ + iccm_code0_end = iccm_code0_start + SIZEOF(.data_iccm0); + iccm_code1_start = ALIGN(iccm_code0_end,4); + .data_iccm1 0x40000000 : AT(iccm_code1_start) {*(.data_iccm1) ; . = ALIGN(4); } =0x0000, /* iccm_code1_start, after .data, as LMA */ + iccm_code1_end = iccm_code1_start + SIZEOF(.data_iccm1); + iccm_code2_start = ALIGN(iccm_code1_end,4); + .data_iccm2 0x40000000 : AT(iccm_code2_start) {*(.data_iccm2) ; . = ALIGN(4); } =0x0000, /* iccm_code2_start, after .data, as LMA */ + iccm_code2_end = iccm_code2_start + SIZEOF(.data_iccm2); + + /* Stack is at the end of DCCM after .data_iccm2 */ + . = ALIGN(iccm_code2_end,16); + STACK = ALIGN(16) + 0x4000; + ASSERT( (STACK < 0x50020000), "ERROR: Stack overflows the DCCM -- note: lower half of DCCM is allocated in the validation image for remote firmware images") +} diff --git a/src/integration/test_suites/smoke_test_ras/smoke_test_ras.yml b/src/integration/test_suites/smoke_test_ras/smoke_test_ras.yml new file mode 100755 index 000000000..af6e62ff1 --- /dev/null +++ b/src/integration/test_suites/smoke_test_ras/smoke_test_ras.yml @@ -0,0 +1,17 @@ +# SPDX-License-Identifier: Apache-2.0 +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +--- +seed: 1 +testname: smoke_test_ras diff --git a/src/integration/test_suites/smoke_test_sha256/caliptra_isr.h b/src/integration/test_suites/smoke_test_sha256/caliptra_isr.h index 6ffd71c0a..8f5779e04 100644 --- a/src/integration/test_suites/smoke_test_sha256/caliptra_isr.h +++ b/src/integration/test_suites/smoke_test_sha256/caliptra_isr.h @@ -204,6 +204,22 @@ inline void service_soc_ifc_notif_intr () { *reg = SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_MBOX_ECC_COR_STS_MASK; cptra_intr_rcv.soc_ifc_notif |= SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_MBOX_ECC_COR_STS_MASK; } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_DEBUG_LOCKED_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_DEBUG_LOCKED_STS_MASK; + cptra_intr_rcv.soc_ifc_notif |= SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_DEBUG_LOCKED_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_SCAN_MODE_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_SCAN_MODE_STS_MASK; + cptra_intr_rcv.soc_ifc_notif |= SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_SCAN_MODE_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_SOC_REQ_LOCK_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_SOC_REQ_LOCK_STS_MASK; + cptra_intr_rcv.soc_ifc_notif |= SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_SOC_REQ_LOCK_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_GEN_IN_TOGGLE_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_GEN_IN_TOGGLE_STS_MASK; + cptra_intr_rcv.soc_ifc_notif |= SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_GEN_IN_TOGGLE_STS_MASK; + } if (sts == 0) { VPRINTF(ERROR,"bad soc_ifc_notif_intr sts:%x\n", sts); SEND_STDOUT_CTRL(0x1); diff --git a/src/integration/test_suites/smoke_test_sha256/smoke_test_sha256.c b/src/integration/test_suites/smoke_test_sha256/smoke_test_sha256.c index 33a5bce9e..8fff012a9 100644 --- a/src/integration/test_suites/smoke_test_sha256/smoke_test_sha256.c +++ b/src/integration/test_suites/smoke_test_sha256/smoke_test_sha256.c @@ -88,7 +88,7 @@ void main() { VPRINTF(LOW, "----------------------------------\n"); // Call interrupt init - //init_interrupts(); + init_interrupts(); sha256_io sha256_block; sha256_io sha256_digest; diff --git a/src/integration/test_suites/smoke_test_sha512/caliptra_isr.h b/src/integration/test_suites/smoke_test_sha512/caliptra_isr.h index b9a1b0bd5..8f5779e04 100644 --- a/src/integration/test_suites/smoke_test_sha512/caliptra_isr.h +++ b/src/integration/test_suites/smoke_test_sha512/caliptra_isr.h @@ -32,7 +32,32 @@ #include #include "printf.h" -extern volatile uint32_t sha512_intr_status; +/* --------------- symbols/typedefs --------------- */ +typedef struct { + uint32_t doe_error; + uint32_t doe_notif; + uint32_t ecc_error; + uint32_t ecc_notif; + uint32_t hmac_error; + uint32_t hmac_notif; + uint32_t kv_error; + uint32_t kv_notif; + uint32_t sha512_error; + uint32_t sha512_notif; + uint32_t sha256_error; + uint32_t sha256_notif; + uint32_t qspi_error; + uint32_t qspi_notif; + uint32_t uart_error; + uint32_t uart_notif; + uint32_t i3c_error; + uint32_t i3c_notif; + uint32_t soc_ifc_error; + uint32_t soc_ifc_notif; + uint32_t sha512_acc_error; + uint32_t sha512_acc_notif; +} caliptra_intr_received_s; +extern volatile caliptra_intr_received_s cptra_intr_rcv; ////////////////////////////////////////////////////////////////////////////// // Function Declarations @@ -44,41 +69,179 @@ void init_interrupts(void); // These inline functions are used to insert event-specific functionality into the // otherwise generic ISR that gets laid down by the parameterized macro "nonstd_veer_isr" inline void service_doe_error_intr() {return;} -inline void service_doe_notif_intr() {printf("ERROR");} -inline void service_ecc_error_intr () {printf("ERROR");} -inline void service_ecc_notif_intr () {printf("ERROR");} -inline void service_hmac_error_intr () {printf("ERROR");} -inline void service_hmac_notif_intr () {printf("ERROR");} -inline void service_kv_error_intr () {printf("ERROR");} -inline void service_kv_notif_intr () {printf("ERROR");} -inline void service_sha512_error_intr() {printf("ERROR");} +inline void service_doe_notif_intr() { + uint32_t * reg = (uint32_t *) (CLP_DOE_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R); + uint32_t sts = *reg; + /* Write 1 to Clear the pending interrupt */ + if (sts & DOE_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK) { + *reg = DOE_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + cptra_intr_rcv.doe_notif |= DOE_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + } + if (sts == 0) { + VPRINTF(ERROR,"bad doe_notif_intr sts:%x\n", sts); + SEND_STDOUT_CTRL(0x1); + while(1); + } +} + +inline void service_ecc_error_intr() {return;} +inline void service_ecc_notif_intr() { + uint32_t * reg = (uint32_t *) (CLP_ECC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R); + uint32_t sts = *reg; + /* Write 1 to Clear the pending interrupt */ + if (sts & ECC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK) { + *reg = ECC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + cptra_intr_rcv.ecc_notif |= ECC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + } + if (sts == 0) { + VPRINTF(ERROR,"bad ecc_notif_intr sts:%x\n", sts); + SEND_STDOUT_CTRL(0x1); + while(1); + } +} + +inline void service_hmac_error_intr() {return;} +inline void service_hmac_notif_intr() { + uint32_t * reg = (uint32_t *) (CLP_HMAC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R); + uint32_t sts = *reg; + /* Write 1 to Clear the pending interrupt */ + if (sts & HMAC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK) { + *reg = HMAC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + cptra_intr_rcv.hmac_notif |= HMAC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + } + if (sts == 0) { + VPRINTF(ERROR,"bad hmac_notif_intr sts:%x\n", sts); + SEND_STDOUT_CTRL(0x1); + while(1); + } +} + +inline void service_kv_error_intr() {return;} +inline void service_kv_notif_intr() {return;} +inline void service_sha512_error_intr() {return;} inline void service_sha512_notif_intr() { uint32_t * reg = (uint32_t *) (CLP_SHA512_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R); uint32_t sts = *reg; /* Write 1 to Clear the pending interrupt */ if (sts & SHA512_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK) { *reg = SHA512_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + cptra_intr_rcv.sha512_notif |= SHA512_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; } if (sts == 0) { - printf("bad sha512_notif_intr sts:%x\n", sts); - } else { - reg = (uint32_t *) (CLP_SHA512_REG_SHA512_STATUS); - sha512_intr_status = *reg; + VPRINTF(ERROR,"bad sha512_notif_intr sts:%x\n", sts); + SEND_STDOUT_CTRL(0x1); + while(1); } } -inline void service_sha256_error_intr() {printf("ERROR");} -inline void service_sha256_notif_intr() {printf("ERROR");} -inline void service_qspi_error_intr () {printf("ERROR");} -inline void service_qspi_notif_intr () {printf("ERROR");} -inline void service_uart_error_intr () {printf("ERROR");} -inline void service_uart_notif_intr () {printf("ERROR");} -inline void service_i3c_error_intr () {printf("ERROR");} -inline void service_i3c_notif_intr () {printf("ERROR");} -inline void service_soc_ifc_error_intr () {printf("ERROR");} -inline void service_soc_ifc_notif_intr () {printf("ERROR");} -inline void service_sha512_acc_error_intr () {printf("ERROR");} -inline void service_sha512_acc_notif_intr () {printf("ERROR");} +inline void service_sha256_error_intr() {return;} +inline void service_sha256_notif_intr() { + uint32_t * reg = (uint32_t *) (CLP_SHA256_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R); + uint32_t sts = *reg; + /* Write 1 to Clear the pending interrupt */ + if (sts & SHA256_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK) { + *reg = SHA256_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + cptra_intr_rcv.sha256_notif |= SHA256_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + } + if (sts == 0) { + VPRINTF(ERROR,"bad sha256_notif_intr sts:%x\n", sts); + SEND_STDOUT_CTRL(0x1); + while(1); + } +} + +inline void service_qspi_error_intr() {return;} +inline void service_qspi_notif_intr() {return;} +inline void service_uart_error_intr() {return;} +inline void service_uart_notif_intr() {return;} +inline void service_i3c_error_intr() {return;} +inline void service_i3c_notif_intr() {return;} + +inline void service_soc_ifc_error_intr() { + uint32_t * reg = (uint32_t *) (CLP_SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R); + uint32_t sts = *reg; + /* Write 1 to Clear the pending interrupt */ + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_INTERNAL_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_INTERNAL_STS_MASK; + cptra_intr_rcv.soc_ifc_error |= SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_INTERNAL_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_INV_DEV_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_INV_DEV_STS_MASK; + cptra_intr_rcv.soc_ifc_error |= SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_INV_DEV_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_CMD_FAIL_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_CMD_FAIL_STS_MASK; + cptra_intr_rcv.soc_ifc_error |= SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_CMD_FAIL_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_BAD_FUSE_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_BAD_FUSE_STS_MASK; + cptra_intr_rcv.soc_ifc_error |= SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_BAD_FUSE_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_ICCM_BLOCKED_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_ICCM_BLOCKED_STS_MASK; + cptra_intr_rcv.soc_ifc_error |= SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_ICCM_BLOCKED_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_MBOX_ECC_UNC_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_MBOX_ECC_UNC_STS_MASK; + cptra_intr_rcv.soc_ifc_error |= SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_MBOX_ECC_UNC_STS_MASK; + } + if (sts == 0) { + VPRINTF(ERROR,"bad soc_ifc_error_intr sts:%x\n", sts); + SEND_STDOUT_CTRL(0x1); + while(1); + } +} + +inline void service_soc_ifc_notif_intr () { + uint32_t * reg = (uint32_t *) (CLP_SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R); + uint32_t sts = *reg; + /* Write 1 to Clear the pending interrupt */ + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_AVAIL_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_AVAIL_STS_MASK; + cptra_intr_rcv.soc_ifc_notif |= SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_AVAIL_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_MBOX_ECC_COR_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_MBOX_ECC_COR_STS_MASK; + cptra_intr_rcv.soc_ifc_notif |= SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_MBOX_ECC_COR_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_DEBUG_LOCKED_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_DEBUG_LOCKED_STS_MASK; + cptra_intr_rcv.soc_ifc_notif |= SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_DEBUG_LOCKED_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_SCAN_MODE_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_SCAN_MODE_STS_MASK; + cptra_intr_rcv.soc_ifc_notif |= SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_SCAN_MODE_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_SOC_REQ_LOCK_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_SOC_REQ_LOCK_STS_MASK; + cptra_intr_rcv.soc_ifc_notif |= SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_SOC_REQ_LOCK_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_GEN_IN_TOGGLE_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_GEN_IN_TOGGLE_STS_MASK; + cptra_intr_rcv.soc_ifc_notif |= SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_GEN_IN_TOGGLE_STS_MASK; + } + if (sts == 0) { + VPRINTF(ERROR,"bad soc_ifc_notif_intr sts:%x\n", sts); + SEND_STDOUT_CTRL(0x1); + while(1); + } +} + +inline void service_sha512_acc_error_intr() {return;} +inline void service_sha512_acc_notif_intr() { + uint32_t * reg = (uint32_t *) (CLP_SHA512_ACC_CSR_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R); + uint32_t sts = *reg; + /* Write 1 to Clear the pending interrupt */ + if (sts & SHA512_ACC_CSR_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK) { + *reg = SHA512_ACC_CSR_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + cptra_intr_rcv.sha512_acc_notif |= SHA512_ACC_CSR_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + } + if (sts == 0) { + VPRINTF(ERROR,"bad sha512_acc_notif_intr sts:%x\n", sts); + SEND_STDOUT_CTRL(0x1); + while(1); + } +} #endif //CALIPTRA_ISR_H diff --git a/src/integration/test_suites/smoke_test_sha512/smoke_test_sha512.c b/src/integration/test_suites/smoke_test_sha512/smoke_test_sha512.c new file mode 100644 index 000000000..4f31d91fd --- /dev/null +++ b/src/integration/test_suites/smoke_test_sha512/smoke_test_sha512.c @@ -0,0 +1,136 @@ +// SPDX-License-Identifier: Apache-2.0 +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +#include "caliptra_defines.h" +#include "caliptra_isr.h" +#include +#include +#include "printf.h" +#include "sha512.h" + +#ifdef CPT_VERBOSITY + enum printf_verbosity verbosity_g = CPT_VERBOSITY; +#else + enum printf_verbosity verbosity_g = LOW; +#endif +volatile char* stdout = (char *)STDOUT; +volatile uint32_t intr_count = 0; + +volatile caliptra_intr_received_s cptra_intr_rcv = { + .doe_error = 0, + .doe_notif = 0, + .ecc_error = 0, + .ecc_notif = 0, + .hmac_error = 0, + .hmac_notif = 0, + .kv_error = 0, + .kv_notif = 0, + .sha512_error = 0, + .sha512_notif = 0, + .sha512_error = 0, + .sha512_notif = 0, + .qspi_error = 0, + .qspi_notif = 0, + .uart_error = 0, + .uart_notif = 0, + .i3c_error = 0, + .i3c_notif = 0, + .soc_ifc_error = 0, + .soc_ifc_notif = 0, + .sha512_acc_error = 0, + .sha512_acc_notif = 0, +}; + + +void main() { + + uint32_t block_data[] = {0x61626380, + 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, + 0x00000018}; + + uint32_t expected_digest[] = {0xDDAF35A1, + 0x93617ABA, + 0xCC417349, + 0xAE204131, + 0x12E6FA4E, + 0x89A97EA2, + 0x0A9EEEE6, + 0x4B55D39A, + 0x2192992A, + 0x274FC1A8, + 0x36BA3C23, + 0xA3FEEBBD, + 0x454D4423, + 0x643CE80E, + 0x2A9AC94F, + 0xA54CA49F}; + + + + // Entry message + VPRINTF(LOW, "----------------------------------\n"); + VPRINTF(LOW, " SHA512 smoke test !!\n" ); + VPRINTF(LOW, "----------------------------------\n"); + + // Call interrupt init + init_interrupts(); + + sha512_io sha512_block; + sha512_io sha512_digest; + + sha512_block.data_size = 32; + for (int i = 0; i < sha512_block.data_size; i++) + sha512_block.data[i] = block_data[i]; + + sha512_digest.data_size = 16; + for (int i = 0; i < sha512_digest.data_size; i++) + sha512_digest.data[i] = expected_digest[i]; + + sha512_flow(sha512_block, SHA512_512_MODE, sha512_digest); + sha512_zeroize(); + + // Write 0xff to STDOUT for TB to terminate test. + SEND_STDOUT_CTRL( 0xff); + while(1); + +} diff --git a/src/integration/test_suites/smoke_test_sha512/smoke_test_sha512.s b/src/integration/test_suites/smoke_test_sha512/smoke_test_sha512.s deleted file mode 100644 index 3f26cf86d..000000000 --- a/src/integration/test_suites/smoke_test_sha512/smoke_test_sha512.s +++ /dev/null @@ -1,175 +0,0 @@ -// SPDX-License-Identifier: Apache-2.0 -// Copyright 2019 Western Digital Corporation or its affiliates. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// - -// Assembly code for Hello World -// Not using only ALU ops for creating the string - - -#include "../includes/caliptra_defines.h" -#include "./smoke_test_sha512_vectors.s" - -// Code to execute -.section .text -.global _start -_start: - - // Clear minstret - csrw minstret, zero - csrw minstreth, zero - - // Enable Caches in MRAC - li x1, 0xaaaaaaaa - csrw 0x7c0, x1 - - // Initialize MTVEC to point to a dummy interrupt handler prior to entering - // main and subsequent (more complex) initialization procedure - la t0, early_trap_vector - csrw mtvec, t0 - - // Init. the stack - la sp, STACK - - // Entry message - call print_startup - - // Call interrupt init - call init_interrupts - - li t4, 0 - li t5, 1 - - write_msg_loop: - // loop cnt, indicate whether it's the first block - addi t4, t4, 1 - - // Load block from hw_data and write to SHA512 core - li x3, CLP_SHA512_REG_SHA512_BLOCK_0 - li x1, CLP_SHA512_REG_SHA512_BLOCK_31 - // set t3 to constantly tracking current ptr - la t3, SHA512ShortMsg - // set x7 as last word check - lw x7, 0(t3) - addi t3, t3, 4 - write_block_loop: - lw x5, 0(t3) - - sw x5, 0(x3) - addi t3, t3, 4 - addi x3, x3, 4 - ble x3, x1, write_block_loop - - // store the last word for further checking - mv x6, x5 - - // Enable SHA512 core - li x3, CLP_SHA512_REG_SHA512_CTRL - li x4, SHA512_NEXT - bne t4, t5, indicate_next - li x4, SHA512_INIT - indicate_next: - sw x4, 0(x3) - - // wait for SHA512 process - la x3, sha512_intr_status - li x1, SHA512_VALID - ready_loop: - lw x5, 0(x3) - bne x5, x1, ready_loop - sw x0, 0(x3) // clear status variable - - // check if reaches the last block of message - bne x6, x7, write_msg_loop - - // Read the data back from SHA512 register - li x3, CLP_SHA512_REG_SHA512_DIGEST_0 - li x1, CLP_SHA512_REG_SHA512_DIGEST_15 - la x4, SHA512ShortMsg - addi x4, x4, 132 - read_result_loop: - lw x5, 0(x3) - lw t2, 0(x4) - beq x5, t2, equal - li x6, STDOUT - li x7, 0x01 - sb x7, 0(x6) - equal: - addi x3, x3, 4 - addi x4, x4, 4 - ble x3, x1, read_result_loop - - -// Write 0xff to STDOUT for TB to terminate test. -_finish: - li x3, STDOUT - addi x5, x0, 0xff - sb x5, 0(x3) - beq x0, x0, _finish -.rept 100 - nop -.endr - -print_startup: - li x3, STDOUT - la x4, print_data - j loop - -print_loop: - li x3, STDOUT - la x4, loop_data - j loop - -loop: - lb x5, 0(x4) - sb x5, 0(x3) - addi x4, x4, 1 - bnez x5, loop - ret - -// .data is in ROM now, can't write to intr_count there... -.section .dccm -.global stdout -stdout: .word STDOUT -.global intr_count -intr_count: .word 0 -.global verbosity_g -verbosity_g: .word 2 -// FW polls this variable instead of the SHA512 reg.... -.global sha512_intr_status -sha512_intr_status: .word 0 -print_data: -.ascii "----------------------------------------\n" -.ascii "Running SHA512 Smoke Test !!\n" -.ascii "----------------------------------------\n" -.byte 0 -loop_data: -.ascii "End of block loop\n" -.byte 0 - -// From SiFive Interrupt Cookbook: -// https://sifive.cdn.prismic.io/sifive/0d163928-2128-42be-a75a-464df65e04e0_sifive-interrupt-cookbook.pdf -// -/* For sanity's sake we set up an early trap vector that just does nothing. If -* you end up here then there's a bug in the early boot code somewhere. */ -.section .text.metal.init.trapvec -.align 2 /* Aligns to 4-bytes (log2(4) = 2) */ -.global early_trap_vector -early_trap_vector: -.cfi_startproc -csrr t0, mcause -csrr t1, mepc -csrr t2, mtval -j early_trap_vector -.cfi_endproc diff --git a/src/integration/test_suites/smoke_test_sha512/smoke_test_sha512_vectors.s b/src/integration/test_suites/smoke_test_sha512/smoke_test_sha512_vectors.s deleted file mode 100644 index bc3afe356..000000000 --- a/src/integration/test_suites/smoke_test_sha512/smoke_test_sha512_vectors.s +++ /dev/null @@ -1,223401 +0,0 @@ -/* - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -.section .dccm -hw_data: -// start of input message -.word 0x61626380 -.word 0x00000000 -.word 0x00000000 -.word 0x00000000 -.word 0x00000000 -.word 0x00000000 -.word 0x00000000 -.word 0x00000000 -.word 0x00000000 -.word 0x00000000 -.word 0x00000000 -.word 0x00000000 -.word 0x00000000 -.word 0x00000000 -.word 0x00000000 -.word 0x00000000 -.word 0x00000000 -.word 0x00000000 -.word 0x00000000 -.word 0x00000000 -.word 0x00000000 -.word 0x00000000 -.word 0x00000000 -.word 0x00000000 -.word 0x00000000 -.word 0x00000000 -.word 0x00000000 -.word 0x00000000 -.word 0x00000000 -.word 0x00000000 -.word 0x00000000 -.word 0x00000018 -// expected value -.word 0xDDAF35A1 -.word 0x93617ABA -.word 0xCC417349 -.word 0xAE204131 -.word 0x12E6FA4E -.word 0x89A97EA2 -.word 0x0A9EEEE6 -.word 0x4B55D39A -.word 0x2192992A -.word 0x274FC1A8 -.word 0x36BA3C23 -.word 0xA3FEEBBD -.word 0x454D4423 -.word 0x643CE80E -.word 0x2A9AC94F -.word 0xA54CA49F -// .ascii "----------------------------------\n" -// .ascii "SHA512 test !!\n" -// .ascii "----------------------------------\n" -// .byte 0 -SHA512ShortMsg: -// SHA512ShortMsgvector_2 -// vector length -.word 0x00000008 -// input message -.word 0x21800000 -.word 0x00000000 -.word 0x00000000 -.word 0x00000000 -.word 0x00000000 -.word 0x00000000 -.word 0x00000000 -.word 0x00000000 -.word 0x00000000 -.word 0x00000000 -.word 0x00000000 -.word 0x00000000 -.word 0x00000000 -.word 0x00000000 -.word 0x00000000 -.word 0x00000000 -.word 0x00000000 -.word 0x00000000 -.word 0x00000000 -.word 0x00000000 -.word 0x00000000 -.word 0x00000000 -.word 0x00000000 -.word 0x00000000 -.word 0x00000000 -.word 0x00000000 -.word 0x00000000 -.word 0x00000000 -.word 0x00000000 -.word 0x00000000 -.word 0x00000000 -.word 0x00000008 -// expected output -.word 0x3831a6a6 -.word 0x155e509d -.word 0xee59a7f4 -.word 0x51eb3532 -.word 0x4d8f8f2d -.word 0xf6e37088 -.word 0x94740f98 -.word 0xfdee2388 -.word 0x9f4de5ad -.word 0xb0c5010d -.word 0xfb555cda -.word 0x77c8ab5d -.word 0xc902094c -.word 0x52de3278 -.word 0xf35a75eb -.word 0xc25f093a -//// SHA512ShortMsgvector_3 -//// vector length -//.word 0x00000010 -//// input message -//.word 0x90838000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000010 -//// expected output -//.word 0x55586ebb -//.word 0xa48768ae -//.word 0xb323655a -//.word 0xb6f4298f -//.word 0xc9f67096 -//.word 0x4fc2e5f2 -//.word 0x731e34df -//.word 0xa4b0c09e -//.word 0x6e1e12e3 -//.word 0xd7286b31 -//.word 0x45c61c20 -//.word 0x47fb1a2a -//.word 0x1297f36d -//.word 0xa64160b3 -//.word 0x1fa4c8c2 -//.word 0xcddd2fb4 -//// SHA512ShortMsgvector_4 -//// vector length -//.word 0x00000018 -//// input message -//.word 0x0a55db80 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000018 -//// expected output -//.word 0x7952585e -//.word 0x5330cb24 -//.word 0x7d72bae6 -//.word 0x96fc8a6b -//.word 0x0f7d0804 -//.word 0x577e347d -//.word 0x99bc1b11 -//.word 0xe52f3849 -//.word 0x85a42844 -//.word 0x9382306a -//.word 0x89261ae1 -//.word 0x43c2f3fb -//.word 0x613804ab -//.word 0x20b42dc0 -//.word 0x97e5bf4a -//.word 0x96ef919b -//// SHA512ShortMsgvector_5 -//// vector length -//.word 0x00000020 -//// input message -//.word 0x23be86d5 -//.word 0x80000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000020 -//// expected output -//.word 0x76d42c8e -//.word 0xadea35a6 -//.word 0x9990c63a -//.word 0x762f3306 -//.word 0x14a46999 -//.word 0x77f058ad -//.word 0xb988f406 -//.word 0xfb0be8f2 -//.word 0xea3dce3a -//.word 0x2bbd1d82 -//.word 0x7b70b9b2 -//.word 0x99ae6f9e -//.word 0x5058ee97 -//.word 0xb50bd492 -//.word 0x2d6d37dd -//.word 0xc761f8eb -//// SHA512ShortMsgvector_6 -//// vector length -//.word 0x00000028 -//// input message -//.word 0xeb0ca946 -//.word 0xc1800000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000028 -//// expected output -//.word 0xd39ecedf -//.word 0xe6e705a8 -//.word 0x21aee4f5 -//.word 0x8bfc489c -//.word 0x3d9433eb -//.word 0x4ac1b03a -//.word 0x97e321a2 -//.word 0x586b40dd -//.word 0x0522f40f -//.word 0xa5aef36a -//.word 0xfff591a7 -//.word 0x8c916bfc -//.word 0x6d1ca515 -//.word 0xc4983dd8 -//.word 0x695b1ec7 -//.word 0x951d723e -//// SHA512ShortMsgvector_7 -//// vector length -//.word 0x00000030 -//// input message -//.word 0x38667f39 -//.word 0x277b8000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000030 -//// expected output -//.word 0x85708b8f -//.word 0xf05d974d -//.word 0x6af0801c -//.word 0x152b95f5 -//.word 0xfa5c06af -//.word 0x9a35230c -//.word 0x5bea2752 -//.word 0xf031f9bd -//.word 0x84bd8447 -//.word 0x17b3add3 -//.word 0x08a70dc7 -//.word 0x77f90813 -//.word 0xc20b47b1 -//.word 0x6385664e -//.word 0xefc88449 -//.word 0xf04f2131 -//// SHA512ShortMsgvector_8 -//// vector length -//.word 0x00000038 -//// input message -//.word 0xb39f71aa -//.word 0xa8a10880 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000038 -//// expected output -//.word 0x258b8efa -//.word 0x05b4a06b -//.word 0x1e63c7a3 -//.word 0xf925c5ef -//.word 0x11fa03e3 -//.word 0xd47d631b -//.word 0xf4d47498 -//.word 0x3783d8c0 -//.word 0xb0944900 -//.word 0x9e842fc9 -//.word 0xfa15de58 -//.word 0x6c67cf89 -//.word 0x55a17d79 -//.word 0x0b20f41d -//.word 0xadf67ee8 -//.word 0xcdcdfce6 -//// SHA512ShortMsgvector_9 -//// vector length -//.word 0x00000040 -//// input message -//.word 0x6f8d58b7 -//.word 0xcab1888c -//.word 0x80000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000040 -//// expected output -//.word 0xa3941def -//.word 0x2803c8df -//.word 0xc08f20c0 -//.word 0x6ba7e9a3 -//.word 0x32ae0c67 -//.word 0xe47ae573 -//.word 0x65c243ef -//.word 0x40059b11 -//.word 0xbe22c91d -//.word 0xa6a80c2c -//.word 0xff0742a8 -//.word 0xf4bcd941 -//.word 0xbdee0b86 -//.word 0x1ec872b2 -//.word 0x15433ce8 -//.word 0xdcf3c031 -//// SHA512ShortMsgvector_10 -//// vector length -//.word 0x00000048 -//// input message -//.word 0x162b0cf9 -//.word 0xb3750f94 -//.word 0x38800000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000048 -//// expected output -//.word 0xade21730 -//.word 0x5dc34392 -//.word 0xaa4b8e57 -//.word 0xf64f5a3a -//.word 0xfdd27f1f -//.word 0xa969a9a2 -//.word 0x608353f8 -//.word 0x2b95cfb4 -//.word 0xae84598d -//.word 0x01575a57 -//.word 0x8a1068a5 -//.word 0x9b34b504 -//.word 0x5ff6d529 -//.word 0x9c5cb7ee -//.word 0x17180701 -//.word 0xb2d1d695 -//// SHA512ShortMsgvector_11 -//// vector length -//.word 0x00000050 -//// input message -//.word 0xbad7c618 -//.word 0xf45be207 -//.word 0x975e8000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000050 -//// expected output -//.word 0x58868289 -//.word 0x59d1f822 -//.word 0x54068be0 -//.word 0xbd14b6a8 -//.word 0x8f59f534 -//.word 0x061fb203 -//.word 0x76a05410 -//.word 0x52dd3635 -//.word 0xedf3c6f0 -//.word 0xca3d0877 -//.word 0x5e13525d -//.word 0xf9333a21 -//.word 0x13c0b2af -//.word 0x76515887 -//.word 0x529910b6 -//.word 0xc793c8a5 -//// SHA512ShortMsgvector_12 -//// vector length -//.word 0x00000058 -//// input message -//.word 0x6213e10a -//.word 0x4420e0d9 -//.word 0xb7703780 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000058 -//// expected output -//.word 0x9982dc2a -//.word 0x04dff165 -//.word 0x567f276f -//.word 0xd463efef -//.word 0x2b369fa2 -//.word 0xfbca8cee -//.word 0x31ce0de8 -//.word 0xa79a2eb0 -//.word 0xb53e437f -//.word 0x7d9d1f41 -//.word 0xc71d725c -//.word 0xabb949b5 -//.word 0x13075bad -//.word 0x1740c9ee -//.word 0xfbf6a5c6 -//.word 0x633400c7 -//// SHA512ShortMsgvector_13 -//// vector length -//.word 0x00000060 -//// input message -//.word 0x6332c3c2 -//.word 0xa0a625a6 -//.word 0x1df71858 -//.word 0x80000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000060 -//// expected output -//.word 0x9d60375d -//.word 0x9858d9f2 -//.word 0x416fb86f -//.word 0xa0a2189e -//.word 0xe4213e87 -//.word 0x10314fd1 -//.word 0xebed0fd1 -//.word 0x58b043e6 -//.word 0xe7c9a76d -//.word 0x62c6ba1e -//.word 0x1d411a73 -//.word 0x0902309e -//.word 0xc676dd49 -//.word 0x1433c6ef -//.word 0x66c8f116 -//.word 0x233d6ce7 -//// SHA512ShortMsgvector_14 -//// vector length -//.word 0x00000068 -//// input message -//.word 0xf47be3a2 -//.word 0xb019d1be -//.word 0xededf5b8 -//.word 0x0c800000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000068 -//// expected output -//.word 0xb9429262 -//.word 0x5caa28c7 -//.word 0xbe24a099 -//.word 0x7eb73280 -//.word 0x62a76d9b -//.word 0x529c0f1d -//.word 0x568f850d -//.word 0xf6d569b5 -//.word 0xe84df07e -//.word 0x9e246be2 -//.word 0x32033ffa -//.word 0xc3adf2d1 -//.word 0x8f92ab9d -//.word 0xacfc0ecf -//.word 0x08aff714 -//.word 0x5f0b833b -//// SHA512ShortMsgvector_15 -//// vector length -//.word 0x00000070 -//// input message -//.word 0xb1715f78 -//.word 0x2ff02c6b -//.word 0x88937f05 -//.word 0x41168000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000070 -//// expected output -//.word 0xee1a56ee -//.word 0x78182ec4 -//.word 0x1d2c3ab3 -//.word 0x3d4c4187 -//.word 0x1d437c5c -//.word 0x1ca060ee -//.word 0x9e219cb8 -//.word 0x3689b4e5 -//.word 0xa4174dfd -//.word 0xab5d1d10 -//.word 0x96a31a7c -//.word 0x8d3abda7 -//.word 0x5c1b5e6d -//.word 0xa97e1814 -//.word 0x901c505b -//.word 0x0bc07f25 -//// SHA512ShortMsgvector_16 -//// vector length -//.word 0x00000078 -//// input message -//.word 0x9bcd5262 -//.word 0x868cd9c8 -//.word 0xa96c9e82 -//.word 0x987f0380 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000078 -//// expected output -//.word 0x2e07662a -//.word 0x001b9755 -//.word 0xae922c8e -//.word 0x8a95756d -//.word 0xb5341dc0 -//.word 0xf2e62ae1 -//.word 0xcf827038 -//.word 0xf33ce055 -//.word 0xf63ad5c0 -//.word 0x0b653914 -//.word 0x28434ddc -//.word 0x01e5535e -//.word 0x7fecbf53 -//.word 0xdb66d930 -//.word 0x99b8e0b7 -//.word 0xe44e4b25 -//// SHA512ShortMsgvector_17 -//// vector length -//.word 0x00000080 -//// input message -//.word 0xcd67bd40 -//.word 0x54aaa3ba -//.word 0xa0db178c -//.word 0xe232fd5a -//.word 0x80000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000080 -//// expected output -//.word 0x0d8521f8 -//.word 0xf2f39003 -//.word 0x32d1a1a5 -//.word 0x5c60ba81 -//.word 0xd04d28df -//.word 0xe8c504b6 -//.word 0x328ae787 -//.word 0x925fe018 -//.word 0x8f2ba91c -//.word 0x3a9f0c16 -//.word 0x53c4bf0a -//.word 0xda356455 -//.word 0xea36fd31 -//.word 0xf8e73e39 -//.word 0x51cad4eb -//.word 0xba8c6e04 -//// SHA512ShortMsgvector_18 -//// vector length -//.word 0x00000088 -//// input message -//.word 0x6ba004fd -//.word 0x176791ef -//.word 0xb381b862 -//.word 0xe298c67b -//.word 0x08800000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000088 -//// expected output -//.word 0x112e1914 -//.word 0x4a9c51a2 -//.word 0x23a002b9 -//.word 0x77459920 -//.word 0xe38afd4c -//.word 0xa610bd1c -//.word 0x532349e9 -//.word 0xfa7c0d50 -//.word 0x3215c01a -//.word 0xd70e1b2a -//.word 0xc5133cf2 -//.word 0xd10c9e8c -//.word 0x1a4c9405 -//.word 0xf291da2d -//.word 0xc45f7067 -//.word 0x61c5e8fe -//// SHA512ShortMsgvector_19 -//// vector length -//.word 0x00000090 -//// input message -//.word 0xc6a17093 -//.word 0x65686510 -//.word 0x20edfe15 -//.word 0xdf8012ac -//.word 0xda8d8000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000090 -//// expected output -//.word 0xc36c100c -//.word 0xdb6c8c45 -//.word 0xb072f182 -//.word 0x56d63a66 -//.word 0xc9843acb -//.word 0x4d07de62 -//.word 0xe0600711 -//.word 0xd4fbe64c -//.word 0x8cf314ec -//.word 0x3457c903 -//.word 0x08147cb7 -//.word 0xac7e4d07 -//.word 0x3ba10f0c -//.word 0xed78ea72 -//.word 0x4a474b32 -//.word 0xdae71231 -//// SHA512ShortMsgvector_20 -//// vector length -//.word 0x00000098 -//// input message -//.word 0x61be0c9f -//.word 0x5cf62745 -//.word 0xc7da47c1 -//.word 0x04597194 -//.word 0xdb245c80 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000098 -//// expected output -//.word 0xb379249a -//.word 0x3ca5f14c -//.word 0x29456710 -//.word 0x114ba6f6 -//.word 0x136b34c3 -//.word 0xfc9f6fb9 -//.word 0x1b59d491 -//.word 0xaf782d6b -//.word 0x237eb71a -//.word 0xaffdd380 -//.word 0x79461cf6 -//.word 0x90a46d9a -//.word 0x4ddd602d -//.word 0x19808ab6 -//.word 0x235d1d8a -//.word 0xa01e8200 -//// SHA512ShortMsgvector_21 -//// vector length -//.word 0x000000A0 -//// input message -//.word 0xe07056d4 -//.word 0xf7277bc5 -//.word 0x48099577 -//.word 0x720a581e -//.word 0xec94141d -//.word 0x80000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x000000A0 -//// expected output -//.word 0x59f18563 -//.word 0x03ff165e -//.word 0x2ab5683d -//.word 0xddeb6e8a -//.word 0xd81f15bb -//.word 0x578579b9 -//.word 0x99eb5746 -//.word 0x680f22cf -//.word 0xec6dba74 -//.word 0x1e591ca4 -//.word 0xd9e53904 -//.word 0x837701b3 -//.word 0x74be74bb -//.word 0xc0847a92 -//.word 0x179ac2b6 -//.word 0x7496d807 -//// SHA512ShortMsgvector_22 -//// vector length -//.word 0x000000A8 -//// input message -//.word 0x67ebda0a -//.word 0x3573a9a5 -//.word 0x8751d416 -//.word 0x9e10c7e8 -//.word 0x663febb3 -//.word 0xa8800000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x000000A8 -//// expected output -//.word 0x13963f81 -//.word 0xcfabfca7 -//.word 0x1de4739f -//.word 0xd24a10ce -//.word 0x3897bba1 -//.word 0xd716907f -//.word 0xc0a28490 -//.word 0xc192a7fc -//.word 0x3ccb8db1 -//.word 0xf91af7a2 -//.word 0xd250d661 -//.word 0x7f0dfd15 -//.word 0x19d221d6 -//.word 0x18a02e3e -//.word 0x3fa9041c -//.word 0xf35ed1ea -//// SHA512ShortMsgvector_23 -//// vector length -//.word 0x000000B0 -//// input message -//.word 0x63e09db9 -//.word 0x9eb4cd62 -//.word 0x38677859 -//.word 0xa567df31 -//.word 0x3c8520d8 -//.word 0x45b48000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x000000B0 -//// expected output -//.word 0x9083e534 -//.word 0x8b08eb98 -//.word 0x10b2d157 -//.word 0x81d82658 -//.word 0x45410de5 -//.word 0x4fe61750 -//.word 0xd4b93853 -//.word 0x690649ad -//.word 0xc6e72490 -//.word 0xbc2b7c36 -//.word 0x5e239057 -//.word 0x3d9414be -//.word 0xcc093971 -//.word 0x9e0cb78e -//.word 0xca6b2c80 -//.word 0xc2fda920 -//// SHA512ShortMsgvector_24 -//// vector length -//.word 0x000000B8 -//// input message -//.word 0xf3e06b4b -//.word 0xd79e380a -//.word 0x65cb679a -//.word 0x98ccd732 -//.word 0x563cc5eb -//.word 0xe892e280 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x000000B8 -//// expected output -//.word 0x6b315f10 -//.word 0x6b07c59e -//.word 0xedc5ab1d -//.word 0xf813b3c0 -//.word 0xb903060e -//.word 0x7217cc01 -//.word 0x0e907027 -//.word 0x8512a885 -//.word 0x008dac8b -//.word 0x2472a521 -//.word 0xe77835a7 -//.word 0xf4deadc1 -//.word 0xd591aa23 -//.word 0xb624b699 -//.word 0x48a99bb6 -//.word 0x0121c54e -//// SHA512ShortMsgvector_25 -//// vector length -//.word 0x000000C0 -//// input message -//.word 0x16b17074 -//.word 0xd3e3d975 -//.word 0x57f9ed77 -//.word 0xd920b4b1 -//.word 0xbff4e845 -//.word 0xb345a922 -//.word 0x80000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x000000C0 -//// expected output -//.word 0x68841345 -//.word 0x82a76004 -//.word 0x6433abcb -//.word 0xd53db8ff -//.word 0x1a899958 -//.word 0x62f305b8 -//.word 0x87020f6d -//.word 0xa6c7b903 -//.word 0xa314721e -//.word 0x972bf438 -//.word 0x483f452a -//.word 0x8b095962 -//.word 0x98a576c9 -//.word 0x03c91df4 -//.word 0xa414c7bd -//.word 0x20fd1d07 -//// SHA512ShortMsgvector_26 -//// vector length -//.word 0x000000C8 -//// input message -//.word 0x3edf9325 -//.word 0x1349d228 -//.word 0x06bed253 -//.word 0x45fd5c19 -//.word 0x0aac96d6 -//.word 0xcdb2d758 -//.word 0xb8800000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x000000C8 -//// expected output -//.word 0x299e0daf -//.word 0x6605e5b0 -//.word 0xc30e1ec8 -//.word 0xbb98e7a3 -//.word 0xbd7b33b3 -//.word 0x88bdb457 -//.word 0x452dab50 -//.word 0x9594406c -//.word 0x8e7b841e -//.word 0x6f4e75c8 -//.word 0xd6fbd614 -//.word 0xd5eb9e56 -//.word 0xc359bfaf -//.word 0xb4285754 -//.word 0x787ab72b -//.word 0x46dd33f0 -//// SHA512ShortMsgvector_27 -//// vector length -//.word 0x000000D0 -//// input message -//.word 0xb2d5a14f -//.word 0x01e6b778 -//.word 0x888c562a -//.word 0x059ec819 -//.word 0xad89992d -//.word 0x16a09f7a -//.word 0x54b48000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x000000D0 -//// expected output -//.word 0xab2e7d74 -//.word 0x5d8ad393 -//.word 0x439af2a3 -//.word 0xfbc9cdc2 -//.word 0x5510d4a0 -//.word 0x4e78b526 -//.word 0xe12b1c0b -//.word 0xe3b22966 -//.word 0x872ebe65 -//.word 0x2e2f46ed -//.word 0x5c5acecd -//.word 0x2f233a91 -//.word 0x75dd295e -//.word 0xbeb3a070 -//.word 0x6fc66fa1 -//.word 0xb137042b -//// SHA512ShortMsgvector_28 -//// vector length -//.word 0x000000D8 -//// input message -//.word 0x844b66f1 -//.word 0x2ba0c5f9 -//.word 0xe92731f5 -//.word 0x71539d1e -//.word 0xef332e15 -//.word 0x49a49dbf -//.word 0xa4c6de80 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x000000D8 -//// expected output -//.word 0xc3f9c578 -//.word 0x19257747 -//.word 0x83ae9d83 -//.word 0x9772d751 -//.word 0x3dfcea8c -//.word 0x5af8da26 -//.word 0x2c196f9f -//.word 0xe80135b2 -//.word 0xb0c8c6ca -//.word 0x0a1604e0 -//.word 0xa3460247 -//.word 0x620de20b -//.word 0x299f2db7 -//.word 0x871982d2 -//.word 0x7c2176ae -//.word 0x5fa7ad65 -//// SHA512ShortMsgvector_29 -//// vector length -//.word 0x000000E0 -//// input message -//.word 0x6b6cc692 -//.word 0xd39860b1 -//.word 0xf3020365 -//.word 0x3e25d09c -//.word 0x01e6a804 -//.word 0x3c1a9cb8 -//.word 0xb249a41e -//.word 0x80000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x000000E0 -//// expected output -//.word 0x2e5263d9 -//.word 0xa4f21b21 -//.word 0x0e0e161e -//.word 0xd39df441 -//.word 0x02864325 -//.word 0x78864726 -//.word 0x1a6e70ea -//.word 0x4b1ee0ab -//.word 0xb57b5749 -//.word 0x9bc82158 -//.word 0xd82336dd -//.word 0x53f1ef44 -//.word 0x64c6a081 -//.word 0x26e138b2 -//.word 0xcc0892f7 -//.word 0x65f6af85 -//// SHA512ShortMsgvector_30 -//// vector length -//.word 0x000000E8 -//// input message -//.word 0xab1fc9ee -//.word 0x845eeb20 -//.word 0x5ec13725 -//.word 0xdaf1fb1f -//.word 0x5d50629b -//.word 0x14ea9a22 -//.word 0x35a9350a -//.word 0x88800000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x000000E8 -//// expected output -//.word 0x72d188a9 -//.word 0xdf5f3b00 -//.word 0x057bca22 -//.word 0xc92c0f82 -//.word 0x28422d97 -//.word 0x4302d22d -//.word 0x4b322e7a -//.word 0x6c8fc3b2 -//.word 0xb50ec74c -//.word 0x6842781f -//.word 0x29f7075c -//.word 0x3d4bd065 -//.word 0x87864884 -//.word 0x6c39bb3e -//.word 0x4e2692c0 -//.word 0xf053f7ed -//// SHA512ShortMsgvector_31 -//// vector length -//.word 0x000000F0 -//// input message -//.word 0x594ed82a -//.word 0xcfc03c0e -//.word 0x359cc560 -//.word 0xb8e4b85f -//.word 0x6ee77ee5 -//.word 0x9a70023c -//.word 0x2b3d5b32 -//.word 0x85b28000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x000000F0 -//// expected output -//.word 0x5ef322cb -//.word 0x4014ecbb -//.word 0x713a1365 -//.word 0x9612a222 -//.word 0x225984d3 -//.word 0x1c187deb -//.word 0xc4459ba7 -//.word 0x901f03da -//.word 0xc775400a -//.word 0xcfe3510b -//.word 0x306b7989 -//.word 0x4fb0e843 -//.word 0x7b412150 -//.word 0xc9193ee5 -//.word 0xa2164306 -//.word 0xebb78301 -//// SHA512ShortMsgvector_32 -//// vector length -//.word 0x000000F8 -//// input message -//.word 0xf2c66efb -//.word 0xf2a76c5b -//.word 0x041860ea -//.word 0x576103cd -//.word 0x8c6b25e5 -//.word 0x0eca9ff6 -//.word 0xa2fa8808 -//.word 0x3fe9ac80 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x000000F8 -//// expected output -//.word 0x7978f93e -//.word 0xf7ed02c4 -//.word 0xa24abecb -//.word 0xa124d14d -//.word 0xd214e149 -//.word 0x2ff1e168 -//.word 0x304c0eab -//.word 0x89637da0 -//.word 0xf7a569c4 -//.word 0x3dc4562b -//.word 0xdb9404a0 -//.word 0x18b6314f -//.word 0xe0eebacc -//.word 0xfb25ba76 -//.word 0x506aa7e9 -//.word 0xdcd956a7 -//// SHA512ShortMsgvector_33 -//// vector length -//.word 0x00000100 -//// input message -//.word 0x8ccb08d2 -//.word 0xa1a282aa -//.word 0x8cc99902 -//.word 0xecaf0f67 -//.word 0xa9f21cff -//.word 0xe28005cb -//.word 0x27fcf129 -//.word 0xe963f99d -//.word 0x80000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000100 -//// expected output -//.word 0x4551def2 -//.word 0xf9127386 -//.word 0xeea8d4da -//.word 0xe1ea8d8e -//.word 0x49b2add0 -//.word 0x509f27cc -//.word 0xbce7d9e9 -//.word 0x50ac7db0 -//.word 0x1d5bca57 -//.word 0x9c271b9f -//.word 0x2d806730 -//.word 0xd88f5825 -//.word 0x2fd0c258 -//.word 0x7851c3ac -//.word 0x8a0e72b4 -//.word 0xe1dc0da6 -//// SHA512ShortMsgvector_34 -//// vector length -//.word 0x00000108 -//// input message -//.word 0x9f8c4932 -//.word 0x0af9370c -//.word 0xd3db20e9 -//.word 0xb50d3eaa -//.word 0x59a6232d -//.word 0x7a86fb7d -//.word 0x472f1245 -//.word 0x08d7968b -//.word 0x05800000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000108 -//// expected output -//.word 0x81b002f1 -//.word 0x5c4d48be -//.word 0x8517f7ed -//.word 0x89df302f -//.word 0xb1435c94 -//.word 0x35efefed -//.word 0x58f3eb8e -//.word 0xa1191062 -//.word 0x3f1eb902 -//.word 0x8a66e021 -//.word 0x21a7f08a -//.word 0x7c604226 -//.word 0xf2324f48 -//.word 0x3e91548d -//.word 0xbbd2c441 -//.word 0xab704ce5 -//// SHA512ShortMsgvector_35 -//// vector length -//.word 0x00000110 -//// input message -//.word 0x4ab9aa06 -//.word 0x9475e54b -//.word 0x25e5688a -//.word 0x52dd4acd -//.word 0x134169c8 -//.word 0x58105f01 -//.word 0xa0a1b134 -//.word 0xc72d4af5 -//.word 0x1f8e8000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000110 -//// expected output -//.word 0x48ba5a63 -//.word 0xaba7e7bd -//.word 0x8e420475 -//.word 0x331125a9 -//.word 0x47928c67 -//.word 0xfdb00f65 -//.word 0xc4080d9a -//.word 0x0b99c067 -//.word 0x2424e76a -//.word 0x1ba6bd76 -//.word 0xdfe492c7 -//.word 0x30f6f9ad -//.word 0xccaee7bb -//.word 0x11571aad -//.word 0xb31f6bb6 -//.word 0x28cfa933 -//// SHA512ShortMsgvector_36 -//// vector length -//.word 0x00000118 -//// input message -//.word 0xf0c1d340 -//.word 0x7de92ef7 -//.word 0x421e42df -//.word 0x5c9ab31d -//.word 0x2ec0a750 -//.word 0xa9522869 -//.word 0xcbe4cabd -//.word 0x66908d58 -//.word 0x23ec0480 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000118 -//// expected output -//.word 0x9e75c5bc -//.word 0xa2c2af1d -//.word 0x7739787f -//.word 0x46e1d981 -//.word 0xc4f98e49 -//.word 0x3d0724b5 -//.word 0x252c2fba -//.word 0xe3c52671 -//.word 0x9f1d27e6 -//.word 0xccd0d705 -//.word 0x240281e8 -//.word 0xfbf3db75 -//.word 0xb9b3205c -//.word 0x1413436d -//.word 0x3b5d1400 -//.word 0x04b8cca1 -//// SHA512ShortMsgvector_37 -//// vector length -//.word 0x00000120 -//// input message -//.word 0xae8c9f8f -//.word 0xb41b519b -//.word 0x6d943833 -//.word 0xfe1c32d1 -//.word 0xc4292fb1 -//.word 0xddf1dbe2 -//.word 0xeb227d9e -//.word 0x14d31ed7 -//.word 0x4ebaef12 -//.word 0x80000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000120 -//// expected output -//.word 0x042f9fd0 -//.word 0xa4ed3d9f -//.word 0xec3655ae -//.word 0x11011c6f -//.word 0x2bc7e457 -//.word 0xe8812b6d -//.word 0x8be2cd45 -//.word 0xfc6c432a -//.word 0x94558c88 -//.word 0xf22c0143 -//.word 0x9618865e -//.word 0x8e49e509 -//.word 0xc448b342 -//.word 0xca914b12 -//.word 0x0344aaf7 -//.word 0xbcbdca18 -//// SHA512ShortMsgvector_38 -//// vector length -//.word 0x00000128 -//// input message -//.word 0xda39fb86 -//.word 0x237f0030 -//.word 0x3844e61f -//.word 0xc6cfe779 -//.word 0xe42af533 -//.word 0x49839590 -//.word 0xbcd2f0e4 -//.word 0xcbbc279e -//.word 0xc0b7e885 -//.word 0xd1800000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000128 -//// expected output -//.word 0xecb43de8 -//.word 0xc233a731 -//.word 0xb38e30c5 -//.word 0x696f8876 -//.word 0x761b7ea7 -//.word 0x2efe283f -//.word 0xd07bedf2 -//.word 0x0029f47c -//.word 0x6d2a4427 -//.word 0x823e100f -//.word 0xb087abaf -//.word 0x22d7eff4 -//.word 0x2a951c97 -//.word 0xc3dd05f4 -//.word 0x8a20163f -//.word 0xa4367cba -//// SHA512ShortMsgvector_39 -//// vector length -//.word 0x00000130 -//// input message -//.word 0x3e7271d2 -//.word 0x070ef095 -//.word 0x394620c4 -//.word 0xb016576c -//.word 0x150f34be -//.word 0xa6078461 -//.word 0x3a0f660d -//.word 0x7fa5ae56 -//.word 0x872b88c5 -//.word 0x83988000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000130 -//// expected output -//.word 0x8154d0da -//.word 0x634ab226 -//.word 0x6061acc1 -//.word 0x23acb407 -//.word 0x650ffe91 -//.word 0x64a22de3 -//.word 0xfe29bf05 -//.word 0x393b2aec -//.word 0xe92cf4db -//.word 0x00ea5b43 -//.word 0x41c31ddb -//.word 0x7de15168 -//.word 0x3c8a71b5 -//.word 0xa44d5c31 -//.word 0x75790fea -//.word 0xc67d18ee -//// SHA512ShortMsgvector_40 -//// vector length -//.word 0x00000138 -//// input message -//.word 0x311fb67f -//.word 0x6a0784bb -//.word 0x01a2d5a3 -//.word 0xf3092c40 -//.word 0x7a9d3322 -//.word 0x319dff9a -//.word 0x79f89429 -//.word 0x1c5fac37 -//.word 0x319fb408 -//.word 0x402e1880 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000138 -//// expected output -//.word 0x1870fe91 -//.word 0x3abb0a4b -//.word 0x4f53b658 -//.word 0x1ae18322 -//.word 0xcd053285 -//.word 0x14556607 -//.word 0xf3f4d7b6 -//.word 0xa2ac8e91 -//.word 0x85d94d94 -//.word 0x7d8b9c88 -//.word 0xe0efa66d -//.word 0x89b59f74 -//.word 0x39c75fda -//.word 0xdd1816f7 -//.word 0x412306ab -//.word 0x2b59d664 -//// SHA512ShortMsgvector_41 -//// vector length -//.word 0x00000140 -//// input message -//.word 0x7651ab49 -//.word 0x1b8fa86f -//.word 0x969d4297 -//.word 0x7d09df5f -//.word 0x8bee3e58 -//.word 0x99180b52 -//.word 0xc968b0db -//.word 0x057a6f02 -//.word 0xa886ad61 -//.word 0x7a84915a -//.word 0x80000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000140 -//// expected output -//.word 0xf35e50e2 -//.word 0xe02b8781 -//.word 0x345f8ceb -//.word 0x2198f068 -//.word 0xba103476 -//.word 0xf715cfb4 -//.word 0x87a45288 -//.word 0x2c9f0de0 -//.word 0xc720b2a0 -//.word 0x88a39d06 -//.word 0xa8a6b64c -//.word 0xe4d6470d -//.word 0xfeadc4f6 -//.word 0x5ae06672 -//.word 0xc057e29f -//.word 0x14c4daf9 -//// SHA512ShortMsgvector_42 -//// vector length -//.word 0x00000148 -//// input message -//.word 0xdbe5db68 -//.word 0x5ed7cb84 -//.word 0x8c094524 -//.word 0xc1723519 -//.word 0xd49dc66e -//.word 0xf9fe6d57 -//.word 0xe6862a64 -//.word 0x35750bfa -//.word 0x0a70f104 -//.word 0xf5d396e6 -//.word 0x1a800000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000148 -//// expected output -//.word 0x2fa6e5b2 -//.word 0xc443a680 -//.word 0x50f093e7 -//.word 0xfb713bd6 -//.word 0xb18f6274 -//.word 0xc061ed61 -//.word 0xd79bf068 -//.word 0x8a61dba1 -//.word 0x940bcc30 -//.word 0x99827686 -//.word 0x0943ab03 -//.word 0x8902896d -//.word 0x0fbf59b8 -//.word 0x8b07c80d -//.word 0xe9270370 -//.word 0x97150c40 -//// SHA512ShortMsgvector_43 -//// vector length -//.word 0x00000150 -//// input message -//.word 0x9fa83e96 -//.word 0xb2a6df23 -//.word 0xfb372895 -//.word 0x015678e0 -//.word 0xb2c9cd18 -//.word 0xa8542c3e -//.word 0xaa2c435a -//.word 0x76ae4dc9 -//.word 0xbd5136d9 -//.word 0x70daff93 -//.word 0x3acf8000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000150 -//// expected output -//.word 0x3a2c0ec8 -//.word 0x8a3e5347 -//.word 0xcf0ea9c0 -//.word 0x78838300 -//.word 0xef7356f9 -//.word 0xa6c34206 -//.word 0x3277c106 -//.word 0xb880a00e -//.word 0xd2be205c -//.word 0x13064097 -//.word 0xbd372fde -//.word 0x38007bc3 -//.word 0x06561eb4 -//.word 0xe74bba2b -//.word 0xb20bd354 -//.word 0xaa690ca6 -//// SHA512ShortMsgvector_44 -//// vector length -//.word 0x00000158 -//// input message -//.word 0x8a5a45e3 -//.word 0x98bac1d9 -//.word 0xb896b5a2 -//.word 0xb4e3566b -//.word 0x91d80ad2 -//.word 0x0c977ea7 -//.word 0x450ff2ef -//.word 0xb521d82f -//.word 0x65019ee7 -//.word 0x62e0c85c -//.word 0x6cc84180 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000158 -//// expected output -//.word 0x3c704620 -//.word 0xf4066d79 -//.word 0xc1ff6775 -//.word 0x2980f39e -//.word 0xf3d9c102 -//.word 0x3fa5a213 -//.word 0xa5265376 -//.word 0xb14a1516 -//.word 0x6ffe069b -//.word 0x51df7710 -//.word 0xd8907fef -//.word 0x9406bf37 -//.word 0x5d502ce0 -//.word 0x86ac82af -//.word 0xf17229aa -//.word 0xa7a5a334 -//// SHA512ShortMsgvector_45 -//// vector length -//.word 0x00000160 -//// input message -//.word 0x49cfffda -//.word 0xf4d031e3 -//.word 0x3b1d28a4 -//.word 0x47450545 -//.word 0xf6c4293b -//.word 0x38d5afbc -//.word 0xb9883976 -//.word 0xc014f080 -//.word 0x576ec691 -//.word 0xac1bff70 -//.word 0xb742efab -//.word 0x80000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000160 -//// expected output -//.word 0x8bcc4f1e -//.word 0xa2b7862e -//.word 0xf1591bfa -//.word 0x73916665 -//.word 0xde8faf65 -//.word 0x439ddf5c -//.word 0xc1be43ce -//.word 0xbfd5f60f -//.word 0x205e835a -//.word 0x2b186b67 -//.word 0x5b041258 -//.word 0xc5cff426 -//.word 0x69316ce2 -//.word 0x5b46a2f4 -//.word 0xd4218e10 -//.word 0x2f0f5d6f -//// SHA512ShortMsgvector_46 -//// vector length -//.word 0x00000168 -//// input message -//.word 0x2ff845d8 -//.word 0x5efbc4fa -//.word 0x5637e944 -//.word 0x8d950496 -//.word 0xf19d8d57 -//.word 0xda99b7bd -//.word 0x3df74748 -//.word 0x22f0a790 -//.word 0x58673641 -//.word 0x6714e364 -//.word 0xc6e1fae0 -//.word 0x4e800000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000168 -//// expected output -//.word 0x236f6f4e -//.word 0xd6e858c0 -//.word 0x2d51787e -//.word 0x60c578f7 -//.word 0x31f694f8 -//.word 0xe52b5df4 -//.word 0xecd5b04d -//.word 0xff14c78e -//.word 0x56bad102 -//.word 0x8d6f626c -//.word 0x29d85aee -//.word 0xe151a2a2 -//.word 0x846d3eed -//.word 0x5cfafa98 -//.word 0x54a69fea -//.word 0x8af6d04a -//// SHA512ShortMsgvector_47 -//// vector length -//.word 0x00000170 -//// input message -//.word 0xcfca05fd -//.word 0x893c0f00 -//.word 0x5f5ff796 -//.word 0xf4da19ba -//.word 0x27a1e729 -//.word 0x956b8b71 -//.word 0x5e67ce4b -//.word 0x2d2a382a -//.word 0x72ec7814 -//.word 0xf2f507b1 -//.word 0x825209a2 -//.word 0x0fcc8000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000170 -//// expected output -//.word 0xd8096928 -//.word 0x4a4565ad -//.word 0xd4dad6ab -//.word 0x9b3bdf53 -//.word 0x446142f8 -//.word 0x4aaf92d4 -//.word 0xb23dd22e -//.word 0xe7241e6c -//.word 0x81489ac8 -//.word 0xb246edcb -//.word 0x6df9bd7b -//.word 0x23d91a0c -//.word 0x517f546f -//.word 0xeba4ed57 -//.word 0x90a2be6e -//.word 0x165c1709 -//// SHA512ShortMsgvector_48 -//// vector length -//.word 0x00000178 -//// input message -//.word 0xcfc42575 -//.word 0x9a9c36bb -//.word 0x9f4b32ee -//.word 0xd7767af6 -//.word 0x566f68de -//.word 0xd0adeae2 -//.word 0x5c7a70ca -//.word 0x78ec0977 -//.word 0x4d16c8bc -//.word 0x357f6d6f -//.word 0x7bd441bf -//.word 0x62d94280 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000178 -//// expected output -//.word 0xb587a785 -//.word 0xcdf455cc -//.word 0x9c544e75 -//.word 0x6c1e3063 -//.word 0x00aa3c59 -//.word 0xf8725012 -//.word 0xe68ab4d5 -//.word 0x4020b6d2 -//.word 0x27a164d9 -//.word 0xf83c905e -//.word 0x86f8cebe -//.word 0xef708a69 -//.word 0xf976d6e7 -//.word 0xb18b9bf7 -//.word 0x8e9b98cc -//.word 0x4a5cd1b6 -//// SHA512ShortMsgvector_49 -//// vector length -//.word 0x00000180 -//// input message -//.word 0x097c9db9 -//.word 0x19515242 -//.word 0xc99d973a -//.word 0xcb1dc4ed -//.word 0x482768f9 -//.word 0x74eb83b4 -//.word 0x65f9f6c8 -//.word 0x25033720 -//.word 0x06e44908 -//.word 0x35e2ec8f -//.word 0x92301130 -//.word 0xbfb790b2 -//.word 0x80000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000180 -//// expected output -//.word 0xff5a376f -//.word 0x938e7301 -//.word 0x4caef7fe -//.word 0x3962944a -//.word 0x7230d020 -//.word 0xb7087869 -//.word 0xebe7ec70 -//.word 0x302721cd -//.word 0x06fcdc98 -//.word 0x1c893a42 -//.word 0x5d05e2f9 -//.word 0x9fe198e4 -//.word 0xdb50a088 -//.word 0xaee2bf12 -//.word 0x63212110 -//.word 0xefed422c -//// SHA512ShortMsgvector_50 -//// vector length -//.word 0x00000188 -//// input message -//.word 0x77e73d38 -//.word 0x7e7bc804 -//.word 0x19ebf548 -//.word 0x2b61d525 -//.word 0x5caf819f -//.word 0xb59251ff -//.word 0x6a384e75 -//.word 0xf601ea02 -//.word 0x6d83ef95 -//.word 0x0ed0b675 -//.word 0x18fb99de -//.word 0xe0d8aaef -//.word 0x1f800000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000188 -//// expected output -//.word 0xc4c89cd8 -//.word 0x82ec945c -//.word 0xc888fb9a -//.word 0x0127d35e -//.word 0x585ecc14 -//.word 0xa75e4b5b -//.word 0x3d833053 -//.word 0x8d22da28 -//.word 0xcf6af1eb -//.word 0xec96dc24 -//.word 0x7f109cd2 -//.word 0xaaab9756 -//.word 0xe6946a3d -//.word 0x80db8363 -//.word 0xa4da3e6d -//.word 0xdbb510a1 -//// SHA512ShortMsgvector_51 -//// vector length -//.word 0x00000190 -//// input message -//.word 0x317e5d9a -//.word 0xc73ed063 -//.word 0x3fa18ebe -//.word 0xbbca7909 -//.word 0xec3a5ef7 -//.word 0x90478f9c -//.word 0x38cacec4 -//.word 0x4f196d89 -//.word 0x5835b425 -//.word 0x77448304 -//.word 0x3341381e -//.word 0x7af2d383 -//.word 0xe51a8000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000190 -//// expected output -//.word 0xb10bb044 -//.word 0x91b9c0c3 -//.word 0x34709b40 -//.word 0x7cda1d50 -//.word 0x3efb6b63 -//.word 0xee944f2d -//.word 0x366b6855 -//.word 0xe6e63e5b -//.word 0x80115be4 -//.word 0xbe7ff63e -//.word 0xdecdfb59 -//.word 0x23792e68 -//.word 0x123976d7 -//.word 0x9212b388 -//.word 0x4dec2179 -//.word 0xd1fcf382 -//// SHA512ShortMsgvector_52 -//// vector length -//.word 0x00000198 -//// input message -//.word 0x209461f2 -//.word 0x0666a346 -//.word 0xfedf4a53 -//.word 0x0f41a6fa -//.word 0x280c4366 -//.word 0x5767be92 -//.word 0x3bc1d80b -//.word 0xbcb8c9f8 -//.word 0xf93ad757 -//.word 0x82ea2689 -//.word 0xc8c5d211 -//.word 0xd2053b99 -//.word 0x3145a080 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000198 -//// expected output -//.word 0x67b7a328 -//.word 0xd9444056 -//.word 0xa52ca2f6 -//.word 0x95c5d3f3 -//.word 0xbaafb625 -//.word 0xa14fb32e -//.word 0xee8ff26a -//.word 0x40ccb296 -//.word 0xbec1771a -//.word 0x826b55f7 -//.word 0xddb6170d -//.word 0x4caf7795 -//.word 0xb612448e -//.word 0x66a0f193 -//.word 0x56fe5059 -//.word 0x27149b47 -//// SHA512ShortMsgvector_53 -//// vector length -//.word 0x000001A0 -//// input message -//.word 0x5d61aa45 -//.word 0xc446f3bf -//.word 0x93604b05 -//.word 0x11313b4e -//.word 0x2f306d6b -//.word 0x046fbd94 -//.word 0x797b9267 -//.word 0x46836f2e -//.word 0x1dbdc561 -//.word 0x24060c6c -//.word 0xa9c911b1 -//.word 0x122192d1 -//.word 0x12420827 -//.word 0x80000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x000001A0 -//// expected output -//.word 0xd3931bde -//.word 0x2bde8271 -//.word 0xed18ca0b -//.word 0x9148b12f -//.word 0x6f16161e -//.word 0x637e376f -//.word 0xc961f65b -//.word 0xc33bcacf -//.word 0x2f6addf2 -//.word 0x6a3eaa81 -//.word 0xb196653c -//.word 0xc37e8a73 -//.word 0x9ec5b3df -//.word 0x870d8c38 -//.word 0xc8f28691 -//.word 0xc22a39bb -//// SHA512ShortMsgvector_54 -//// vector length -//.word 0x000001A8 -//// input message -//.word 0x9288c795 -//.word 0xbb0b86c0 -//.word 0x419d9c56 -//.word 0x37dcc37b -//.word 0x39bfa18d -//.word 0x441e3fbf -//.word 0xca75bc03 -//.word 0x06e5432e -//.word 0x8e7b3a56 -//.word 0x27b5bc7f -//.word 0xdc424a77 -//.word 0x520abdff -//.word 0x566e7f2b -//.word 0xb8800000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x000001A8 -//// expected output -//.word 0xe363d0e9 -//.word 0x5d8cd18c -//.word 0x384016eb -//.word 0xeed6d99c -//.word 0x4fa2768e -//.word 0x2bd58fca -//.word 0x019c5108 -//.word 0xb9cde1cb -//.word 0x46f3f884 -//.word 0x028a55ce -//.word 0x282ec310 -//.word 0xa10037fa -//.word 0xa1b16b4a -//.word 0x6a669957 -//.word 0xf0b00f35 -//.word 0x0bbd63d0 -//// SHA512ShortMsgvector_55 -//// vector length -//.word 0x000001B0 -//// input message -//.word 0x780427dc -//.word 0x164b2f69 -//.word 0xb8c7d569 -//.word 0x266f461e -//.word 0x2d30c88c -//.word 0x4cd6057f -//.word 0xb030a6cf -//.word 0x636f24e3 -//.word 0xc0d0db74 -//.word 0x2a7b6193 -//.word 0xfdaa15ee -//.word 0xc50dfb4f -//.word 0xae6ec765 -//.word 0x3c918000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x000001B0 -//// expected output -//.word 0x2964b009 -//.word 0xfb1bf996 -//.word 0xde12e030 -//.word 0xb9d6e060 -//.word 0x8ae8b9db -//.word 0xf2acfb9b -//.word 0xeb76fc53 -//.word 0x61cc104e -//.word 0xe85c2a46 -//.word 0xfb7b4cee -//.word 0x90848312 -//.word 0xda302de4 -//.word 0x9afe61c5 -//.word 0x46477e2b -//.word 0x25d223d5 -//.word 0xe3d33560 -//// SHA512ShortMsgvector_56 -//// vector length -//.word 0x000001B8 -//// input message -//.word 0xec2a92e4 -//.word 0x7f692b53 -//.word 0xc1355475 -//.word 0xc71ceff0 -//.word 0xb0952a8b -//.word 0x3541b293 -//.word 0x8270247d -//.word 0x44e7c5cc -//.word 0x04e17236 -//.word 0xb353da02 -//.word 0x8674eab4 -//.word 0x047d89ec -//.word 0x5dad868c -//.word 0xfd91ce80 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x000001B8 -//// expected output -//.word 0xc83aca61 -//.word 0x47bfcbbc -//.word 0x72c377ef -//.word 0xa8d53654 -//.word 0xba0830c5 -//.word 0xa6a89e1d -//.word 0x2a19b713 -//.word 0xe68fb534 -//.word 0x640deb83 -//.word 0x3ca51224 -//.word 0x7166dd27 -//.word 0x3b5897e5 -//.word 0x7d526f88 -//.word 0xeef58f6f -//.word 0xf97baee0 -//.word 0xb4ee5644 -//// SHA512ShortMsgvector_57 -//// vector length -//.word 0x000001C0 -//// input message -//.word 0xc99e31ad -//.word 0x4e23ac68 -//.word 0xe15e605d -//.word 0x0b02437f -//.word 0x8147c44f -//.word 0x5445a55b -//.word 0x68a10905 -//.word 0x276cce86 -//.word 0x76481c33 -//.word 0xe8cd3efe -//.word 0x322bb13f -//.word 0xe0107bb5 -//.word 0x46ccbec7 -//.word 0xb8b38d10 -//.word 0x80000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x000001C0 -//// expected output -//.word 0x52992d45 -//.word 0xa88221d9 -//.word 0x72958e9f -//.word 0x2854adaa -//.word 0x9a21d2bf -//.word 0x7051e1f1 -//.word 0x019ae780 -//.word 0x04da50c5 -//.word 0xb55c144a -//.word 0x02afffe5 -//.word 0x39d75394 -//.word 0x9a2b0565 -//.word 0x34f5b4c2 -//.word 0x1f248a05 -//.word 0xbaa52a6c -//.word 0x38c7f5dd -//// SHA512ShortMsgvector_58 -//// vector length -//.word 0x000001C8 -//// input message -//.word 0x9aa3e8ad -//.word 0x92777dfe -//.word 0xb121a646 -//.word 0xce2e918d -//.word 0x1e12b307 -//.word 0x54bc0947 -//.word 0x0d6da4af -//.word 0x6cc9642b -//.word 0x012f041f -//.word 0xf046569d -//.word 0x4fd8d0dc -//.word 0xcfe448e5 -//.word 0x9feefc90 -//.word 0x8d9ad5af -//.word 0x6f800000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x000001C8 -//// expected output -//.word 0x994d1cda -//.word 0x4de40aff -//.word 0x4713237c -//.word 0xf9f78f70 -//.word 0x33af8336 -//.word 0x9ac9c64e -//.word 0x504091ea -//.word 0x2f1caff6 -//.word 0xc5152d6a -//.word 0x0c5608f8 -//.word 0x2886c009 -//.word 0x3b3d7fba -//.word 0xdd49dfd1 -//.word 0xf9e0f85a -//.word 0xccf23bc7 -//.word 0xdad48904 -//// SHA512ShortMsgvector_59 -//// vector length -//.word 0x000001D0 -//// input message -//.word 0x5842512c -//.word 0x37312511 -//.word 0xa3d8ae41 -//.word 0xf5801df6 -//.word 0x0cd682d5 -//.word 0x8b4a9973 -//.word 0x42b6e717 -//.word 0xe94006c2 -//.word 0x14813e6c -//.word 0x63e75591 -//.word 0xf957a7ec -//.word 0x30177983 -//.word 0x8bec8ae3 -//.word 0xed7febad -//.word 0x08058000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x000001D0 -//// expected output -//.word 0x9763c433 -//.word 0x31ad0eb2 -//.word 0x79d704c5 -//.word 0xf6e97e02 -//.word 0xda872411 -//.word 0x5026827f -//.word 0x889e9fcd -//.word 0xa21f60fd -//.word 0x230894ab -//.word 0x35abb719 -//.word 0x890f3afa -//.word 0x51afd31b -//.word 0xc6852183 -//.word 0xb9c51059 -//.word 0x910af460 -//.word 0xabd2474d -//// SHA512ShortMsgvector_60 -//// vector length -//.word 0x000001D8 -//// input message -//.word 0xca14e2ea -//.word 0x2f37c78f -//.word 0x78ef280f -//.word 0x58707ec5 -//.word 0x49a31a94 -//.word 0x361073e3 -//.word 0x7701bfe5 -//.word 0x03e4c01e -//.word 0xe1f2e123 -//.word 0xe00e81a1 -//.word 0x88f08fa0 -//.word 0x50825709 -//.word 0x128a9b66 -//.word 0xbb8ae6ea -//.word 0x47e41d80 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x000001D8 -//// expected output -//.word 0x4600e022 -//.word 0xa0225873 -//.word 0x9f67fdd3 -//.word 0x67cc1e66 -//.word 0x2631fb08 -//.word 0x79187683 -//.word 0x52062b9b -//.word 0x3c8de8db -//.word 0xca0e9ec7 -//.word 0x51b91f28 -//.word 0x4694fbdd -//.word 0xb8d325c0 -//.word 0x637bccb2 -//.word 0x1dd2efa9 -//.word 0x2e48dbab -//.word 0x2e5e9c26 -//// SHA512ShortMsgvector_61 -//// vector length -//.word 0x000001E0 -//// input message -//.word 0x647629c7 -//.word 0x79b24c1e -//.word 0x76f41744 -//.word 0xaba17159 -//.word 0x487532a0 -//.word 0x156a7d82 -//.word 0x64db50d6 -//.word 0x45e9595f -//.word 0xf81e0c96 -//.word 0xa850f2aa -//.word 0x56c844c6 -//.word 0x13a4b892 -//.word 0x727a9bfc -//.word 0x3d3e2038 -//.word 0x6766f805 -//.word 0x80000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x000001E0 -//// expected output -//.word 0x5bc842fc -//.word 0x2d3b7eb3 -//.word 0x1d2d3044 -//.word 0xdf3ec32a -//.word 0xf114feaa -//.word 0x7cfc27eb -//.word 0xc8630f46 -//.word 0xab6f0c54 -//.word 0x3f59b812 -//.word 0xe776e530 -//.word 0x3861d17d -//.word 0xa3f1f160 -//.word 0x97641f3b -//.word 0x808d4d5c -//.word 0xb3e48394 -//.word 0x6409746c -//// SHA512ShortMsgvector_62 -//// vector length -//.word 0x000001E8 -//// input message -//.word 0x1c5dc0d1 -//.word 0xdd2e4c71 -//.word 0x7635ff3e -//.word 0x9b67caf9 -//.word 0x57aec0f8 -//.word 0xf63c1b1e -//.word 0x221e800a -//.word 0x4c14848f -//.word 0x4ea06e64 -//.word 0x4e5d3e1d -//.word 0xe592ef5a -//.word 0x8007fa3f -//.word 0x07171b24 -//.word 0xbd07578d -//.word 0x68963e5c -//.word 0xb1800000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x000001E8 -//// expected output -//.word 0xcbf1ea86 -//.word 0xfa5b3dbf -//.word 0x67be82fa -//.word 0xc41e84cc -//.word 0xcd0d296c -//.word 0x757169b3 -//.word 0x7837d273 -//.word 0xccc015ee -//.word 0xcd102b9c -//.word 0xe1cff68f -//.word 0xdc7f05d2 -//.word 0x2f2b7747 -//.word 0x34f62ded -//.word 0x54c8ee0b -//.word 0xf57a5a82 -//.word 0x010d74f5 -//// SHA512ShortMsgvector_63 -//// vector length -//.word 0x000001F0 -//// input message -//.word 0x8a555e75 -//.word 0x477d065b -//.word 0x3af7e615 -//.word 0x475f37c0 -//.word 0xa667f73a -//.word 0x4c7af5e4 -//.word 0xa69f28a6 -//.word 0x8d9f4434 -//.word 0x776a8f90 -//.word 0xeab7f1d1 -//.word 0x37eb4b22 -//.word 0x643c0a0d -//.word 0x6a16fcfa -//.word 0xa1bd62f2 -//.word 0x783546a9 -//.word 0x695f8000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x000001F0 -//// expected output -//.word 0xc088e4a3 -//.word 0xd7da2f6f -//.word 0x99a8f3f7 -//.word 0x17361108 -//.word 0x872b8ffe -//.word 0xf921b383 -//.word 0xc24b8061 -//.word 0xd4e7c27f -//.word 0xc56f4f20 -//.word 0xdc8f952a -//.word 0x14043c56 -//.word 0x50b5a9e7 -//.word 0x77c49c41 -//.word 0xcfeb3f2d -//.word 0xe97ee2e1 -//.word 0x6b2c3924 -//// SHA512ShortMsgvector_64 -//// vector length -//.word 0x000001F8 -//// input message -//.word 0xebb3e2ad -//.word 0x7803508b -//.word 0xa46e81e2 -//.word 0x20b1cff3 -//.word 0x3ea83815 -//.word 0x04110e9f -//.word 0x8092ef08 -//.word 0x5afef84d -//.word 0xb0d43693 -//.word 0x1d085d0e -//.word 0x1b06bd21 -//.word 0x8cf571c7 -//.word 0x9338da31 -//.word 0xa83b4cb1 -//.word 0xec6c06d6 -//.word 0xb9876880 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x000001F8 -//// expected output -//.word 0xf33428d8 -//.word 0xfc67aa2c -//.word 0xc1adcb28 -//.word 0x22f37f29 -//.word 0xcbd72abf -//.word 0xf6819048 -//.word 0x3e415824 -//.word 0xf0bcecd4 -//.word 0x47cb4f05 -//.word 0xa9c47031 -//.word 0xb9c50e04 -//.word 0x11c552f3 -//.word 0x1cd04c30 -//.word 0xcea2bc64 -//.word 0xbcf825a5 -//.word 0xf8a66028 -//// SHA512ShortMsgvector_65 -//// vector length -//.word 0x00000200 -//// input message -//.word 0xc1ca70ae -//.word 0x1279ba0b -//.word 0x91815755 -//.word 0x8b4920d6 -//.word 0xb7fba8a0 -//.word 0x6be51517 -//.word 0x0f202faf -//.word 0xd36fb7f7 -//.word 0x9d69fad7 -//.word 0x45dba615 -//.word 0x0568db1e -//.word 0x2b728504 -//.word 0x113eeac3 -//.word 0x4f527fc8 -//.word 0x2f2200b4 -//.word 0x62ecbf5d -//.word 0x80000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000200 -//// expected output -//.word 0x046e4662 -//.word 0x3912b393 -//.word 0x2b8d662a -//.word 0xb4258342 -//.word 0x38432063 -//.word 0x01b58bf2 -//.word 0x0ab6d76f -//.word 0xd47f1cbb -//.word 0xcf421df5 -//.word 0x36ecd7e5 -//.word 0x6db5354e -//.word 0x7e0f9882 -//.word 0x2d2129c1 -//.word 0x97f6f0f2 -//.word 0x22b8ec52 -//.word 0x31f3967d -//// SHA512ShortMsgvector_66 -//// vector length -//.word 0x00000208 -//// input message -//.word 0xd3ddddf8 -//.word 0x05b1678a -//.word 0x02e39200 -//.word 0xf6440047 -//.word 0xacbb062e -//.word 0x4a2f046a -//.word 0x3ca7f1dd -//.word 0x6eb03a18 -//.word 0xbe00cd1e -//.word 0xb158706a -//.word 0x64af5834 -//.word 0xc68cf7f1 -//.word 0x05b41519 -//.word 0x4605222c -//.word 0x99a2cbf7 -//.word 0x2c50cb14 -//.word 0xbf800000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000208 -//// expected output -//.word 0xbae7c5d5 -//.word 0x90bf25a4 -//.word 0x93d8f48b -//.word 0x8b4638cc -//.word 0xb10541c6 -//.word 0x7996e472 -//.word 0x87b98432 -//.word 0x2009d27d -//.word 0x1348f3ef -//.word 0x2999f5ee -//.word 0x0d38e112 -//.word 0xcd5a807a -//.word 0x57830cdc -//.word 0x318a1181 -//.word 0xe6c4653c -//.word 0xdb8cf122 -//// SHA512ShortMsgvector_67 -//// vector length -//.word 0x00000210 -//// input message -//.word 0x8e8ef8aa -//.word 0x336b3b98 -//.word 0x894c3126 -//.word 0xc7187891 -//.word 0x0618838c -//.word 0x00ac8590 -//.word 0x173c9174 -//.word 0x9972ff3d -//.word 0x42a61137 -//.word 0x029ad745 -//.word 0x01684f75 -//.word 0xe1b8d1d7 -//.word 0x4336aa90 -//.word 0x8c44082a -//.word 0xe9eb162e -//.word 0x901867f5 -//.word 0x49058000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000210 -//// expected output -//.word 0x41672931 -//.word 0x558a9376 -//.word 0x2522b1d5 -//.word 0x5389ecf1 -//.word 0xb8c0feb8 -//.word 0xb88f4587 -//.word 0xfbd417ca -//.word 0x809055b0 -//.word 0xcb630d8b -//.word 0xea133ab7 -//.word 0xf6cf1f21 -//.word 0xc6b35e2e -//.word 0x25c0d195 -//.word 0x83258808 -//.word 0xe6c23e1a -//.word 0x75336103 -//// SHA512ShortMsgvector_68 -//// vector length -//.word 0x00000218 -//// input message -//.word 0x52761e1d -//.word 0xac0eaea8 -//.word 0x98e0b07c -//.word 0xd24f4b2e -//.word 0x6bb7bc20 -//.word 0x0ea4b052 -//.word 0x8842f17b -//.word 0x87154559 -//.word 0xa2ea9445 -//.word 0x9a0e480a -//.word 0xe0bdf9f7 -//.word 0x57dd4a33 -//.word 0x5aed0e51 -//.word 0x0138b024 -//.word 0xa04ed1d5 -//.word 0x91b43232 -//.word 0x34dbd580 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000218 -//// expected output -//.word 0xb826fe80 -//.word 0x494e19c5 -//.word 0x1b42f258 -//.word 0x2b2d080b -//.word 0xa6b90512 -//.word 0xf35f2db6 -//.word 0x7dd7fd5e -//.word 0xe532eaa1 -//.word 0x6498afba -//.word 0x08b4996c -//.word 0xbcfdf8d1 -//.word 0xa2df6b1d -//.word 0xa939e826 -//.word 0x5115a48a -//.word 0xefa42f38 -//.word 0x205db436 -//// SHA512ShortMsgvector_69 -//// vector length -//.word 0x00000220 -//// input message -//.word 0x3804ebc4 -//.word 0x3cbea80c -//.word 0x2bd7e4fd -//.word 0xa5c55155 -//.word 0x00cd2d2b -//.word 0x846a1378 -//.word 0xdbf218d5 -//.word 0xc3771386 -//.word 0x06eb3cb8 -//.word 0xac88f907 -//.word 0x6f6ff443 -//.word 0x6f907174 -//.word 0x27c9df1b -//.word 0xa052acbb -//.word 0xe4585e98 -//.word 0xb6e8e0bf -//.word 0x800f1946 -//.word 0x80000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000220 -//// expected output -//.word 0x17dd6d87 -//.word 0xbc677305 -//.word 0x1e52047f -//.word 0xd444996a -//.word 0xfa8124b0 -//.word 0x483fe121 -//.word 0x877f9855 -//.word 0x3448772b -//.word 0xd0e7751f -//.word 0xc655e9cc -//.word 0x2d298302 -//.word 0x11015d31 -//.word 0x0f191474 -//.word 0xca6adc04 -//.word 0x77a187c0 -//.word 0x3b8fe252 -//// SHA512ShortMsgvector_70 -//// vector length -//.word 0x00000228 -//// input message -//.word 0x2249d698 -//.word 0xc4d807a8 -//.word 0xe7b4de21 -//.word 0xc4857389 -//.word 0x59a0d67e -//.word 0x5d2ca6f7 -//.word 0x7983dfcc -//.word 0xb5dbf479 -//.word 0x31261e1f -//.word 0x1537f3cb -//.word 0xca253afb -//.word 0x6bf4fe5e -//.word 0x7672e1dc -//.word 0xc860b3d6 -//.word 0xc8d243af -//.word 0xe2d9758b -//.word 0x375e9556 -//.word 0x92800000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000228 -//// expected output -//.word 0x6af44563 -//.word 0xfc468d51 -//.word 0x182f6c3b -//.word 0xe58d4593 -//.word 0x2af1d985 -//.word 0xc6f28397 -//.word 0x6c91a9ff -//.word 0x421f383f -//.word 0xe21dc732 -//.word 0x2f397cce -//.word 0xad583e26 -//.word 0xb3e3fda0 -//.word 0x67976a7f -//.word 0x34665df2 -//.word 0x5a2ced7b -//.word 0x4b09cdec -//// SHA512ShortMsgvector_71 -//// vector length -//.word 0x00000230 -//// input message -//.word 0x32a9c170 -//.word 0x33658c54 -//.word 0xf22c7135 -//.word 0xddfc879d -//.word 0xe94d7959 -//.word 0x3ef2dc7d -//.word 0x3041bfa8 -//.word 0x72738389 -//.word 0x864eeda2 -//.word 0x7801794c -//.word 0xcc4ff1fc -//.word 0xb5ef3fc4 -//.word 0x8833801d -//.word 0x6fe959e3 -//.word 0x627f8ea1 -//.word 0x536ad00f -//.word 0xa9c7d7d9 -//.word 0xf0438000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000230 -//// expected output -//.word 0x6a47699d -//.word 0xd3ada2f1 -//.word 0x1bc4ea42 -//.word 0x072b06cc -//.word 0x20857bf1 -//.word 0x64497df1 -//.word 0x285400c2 -//.word 0x50f5848b -//.word 0x6f71957d -//.word 0xbdc845f5 -//.word 0xdaeab913 -//.word 0x036661f6 -//.word 0x9387893f -//.word 0xc2d61c25 -//.word 0xfa59b9d8 -//.word 0x5b19f401 -//// SHA512ShortMsgvector_72 -//// vector length -//.word 0x00000238 -//// input message -//.word 0x3d65f69a -//.word 0x590a5baa -//.word 0xabcd274f -//.word 0xe3ef9e88 -//.word 0x920ffc7a -//.word 0xdf05c16d -//.word 0x7b0f4d18 -//.word 0xd72bac1e -//.word 0x94c3b3d8 -//.word 0x3b8f4c55 -//.word 0x2eb80e9f -//.word 0xde391140 -//.word 0x3f8b0005 -//.word 0x79816f02 -//.word 0xe1716fd6 -//.word 0x27946031 -//.word 0xd0af0793 -//.word 0xe7f3e180 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000238 -//// expected output -//.word 0xffb2d945 -//.word 0x0943c24b -//.word 0x5933c248 -//.word 0x12459b75 -//.word 0xd3d9f380 -//.word 0x344c9bc0 -//.word 0x6fa3e17e -//.word 0xe448eca2 -//.word 0xf98ff79f -//.word 0x7e2235cc -//.word 0xd9f9a817 -//.word 0x6f68a225 -//.word 0x4bbc9b83 -//.word 0x4d6ac8d2 -//.word 0xbfdbc159 -//.word 0x7c432c9f -//// SHA512ShortMsgvector_73 -//// vector length -//.word 0x00000240 -//// input message -//.word 0x76ff8b20 -//.word 0xa18cf104 -//.word 0xf6cdb65e -//.word 0x2ba8f66e -//.word 0xcf844af7 -//.word 0xe85e8ef2 -//.word 0xda19e884 -//.word 0x8a16052e -//.word 0xc405a644 -//.word 0xdafb5ca0 -//.word 0x8ec48f97 -//.word 0x327ac52c -//.word 0x0e562184 -//.word 0x02c72a9a -//.word 0x6dc1cf34 -//.word 0x4d58a716 -//.word 0xa78d7d75 -//.word 0x29680bae -//.word 0x80000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000240 -//// expected output -//.word 0xf8858144 -//.word 0xc6d709dd -//.word 0x0689a526 -//.word 0xa548a43f -//.word 0x17494950 -//.word 0xba2ac205 -//.word 0x44799e8e -//.word 0xa27201d7 -//.word 0x8bce5b92 -//.word 0x1e29a7b4 -//.word 0x029278e6 -//.word 0x8341ef2a -//.word 0x0ca4ba38 -//.word 0x94566b3c -//.word 0x8f8950e3 -//.word 0xe545a689 -//// SHA512ShortMsgvector_74 -//// vector length -//.word 0x00000248 -//// input message -//.word 0xca88dddf -//.word 0xc876a12f -//.word 0x45f19562 -//.word 0xbc9ca250 -//.word 0xf43267ab -//.word 0x251a7f34 -//.word 0x5c3c022e -//.word 0x20144e13 -//.word 0x56040787 -//.word 0x62ef5c8a -//.word 0x8f038cf1 -//.word 0xb1d6a917 -//.word 0x09b59dd0 -//.word 0x68396a9e -//.word 0x971ab628 -//.word 0xf74886e7 -//.word 0x65384a23 -//.word 0x607c1a1e -//.word 0x6e800000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000248 -//// expected output -//.word 0x4f3d9eee -//.word 0xf349ca51 -//.word 0xa7e419af -//.word 0x1686f427 -//.word 0x95abde58 -//.word 0xa85335ce -//.word 0x68d496e8 -//.word 0x1e4436a8 -//.word 0x0a61dc14 -//.word 0x3a430000 -//.word 0x8c23a3e7 -//.word 0x1f4ba987 -//.word 0x43195a36 -//.word 0x94a8d02f -//.word 0xee11bd31 -//.word 0x4569abc0 -//// SHA512ShortMsgvector_75 -//// vector length -//.word 0x00000250 -//// input message -//.word 0x0a78b16b -//.word 0x4026f7ec -//.word 0x063db4e7 -//.word 0xb77c42a2 -//.word 0x98e524e2 -//.word 0x68093c50 -//.word 0x38853e21 -//.word 0x7dcd65f6 -//.word 0x64286501 -//.word 0x65fca06a -//.word 0x1b4c9cf1 -//.word 0x537fb5d4 -//.word 0x63630ff3 -//.word 0xbd71cf32 -//.word 0xc3538b1f -//.word 0xdda3fed5 -//.word 0xc9f60120 -//.word 0x3319b7e1 -//.word 0x869a8000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000250 -//// expected output -//.word 0x6095c3df -//.word 0x5b9db7ce -//.word 0x524d7612 -//.word 0x3f77421c -//.word 0xe888b86a -//.word 0x477ae8c6 -//.word 0xdb1d0be8 -//.word 0xd326d22c -//.word 0x852915ab -//.word 0x03c0c81a -//.word 0x5b7ac71e -//.word 0x2c14e74b -//.word 0xda17a78d -//.word 0x2b10585f -//.word 0xa214f654 -//.word 0x6eb710a0 -//// SHA512ShortMsgvector_76 -//// vector length -//.word 0x00000258 -//// input message -//.word 0x20f10ef9 -//.word 0xa0e61286 -//.word 0x75340171 -//.word 0xcd248df3 -//.word 0x0b586557 -//.word 0x620b615c -//.word 0xa39a00db -//.word 0x534315a9 -//.word 0x012dbdbf -//.word 0xd6a99498 -//.word 0x6eb829db -//.word 0xe6cdaf3a -//.word 0x37d4f59a -//.word 0xc2729874 -//.word 0x2c8f777b -//.word 0x6b12677f -//.word 0x21eb2891 -//.word 0x29579868 -//.word 0x705f2780 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000258 -//// expected output -//.word 0xb4ead3f8 -//.word 0x60eabbd3 -//.word 0x6c770d66 -//.word 0xc7356f81 -//.word 0x07acd148 -//.word 0x5c7c9417 -//.word 0x8c2eaabd -//.word 0x50266d76 -//.word 0x45d00997 -//.word 0x2586ef83 -//.word 0xed43ed92 -//.word 0x882137df -//.word 0x5117b88f -//.word 0x35231b89 -//.word 0x4ec1741a -//.word 0xe7501145 -//// SHA512ShortMsgvector_77 -//// vector length -//.word 0x00000260 -//// input message -//.word 0x995c8f74 -//.word 0x7ea418f7 -//.word 0xd63aba22 -//.word 0x60b34ac3 -//.word 0xc7dceebb -//.word 0x78438ca4 -//.word 0xb1f982b7 -//.word 0xdb9798ec -//.word 0x1a7f3262 -//.word 0x2264cb02 -//.word 0x4c0d9e60 -//.word 0xe955a6e1 -//.word 0xd677c923 -//.word 0x51885199 -//.word 0x0a459b76 -//.word 0x7d0f13cd -//.word 0x803460f6 -//.word 0x1870db33 -//.word 0x91b44693 -//.word 0x80000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000260 -//// expected output -//.word 0xa00a601e -//.word 0xdeaca830 -//.word 0x41dc452d -//.word 0x438a8de5 -//.word 0x49594e25 -//.word 0xd843c2cf -//.word 0x60a0e009 -//.word 0xfb92d87a -//.word 0xbe28a726 -//.word 0x90ab657c -//.word 0x8d35b43c -//.word 0xd02d22ec -//.word 0x0755de22 -//.word 0x9d1f922f -//.word 0xa6ca18a6 -//.word 0xd6c2aaae -//// SHA512ShortMsgvector_78 -//// vector length -//.word 0x00000268 -//// input message -//.word 0x0feb23c7 -//.word 0xe4a19bcb -//.word 0xd70bd300 -//.word 0xd76ec904 -//.word 0x5d696f8c -//.word 0x9687f49e -//.word 0xc4154400 -//.word 0xe231d2f0 -//.word 0x86249515 -//.word 0x0cf250b6 -//.word 0xf12f172a -//.word 0x7d130f8f -//.word 0xa5d175bf -//.word 0x2f25e280 -//.word 0x172ccdfb -//.word 0x32795170 -//.word 0x11653027 -//.word 0x28a619aa -//.word 0x2f242631 -//.word 0xc9800000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000268 -//// expected output -//.word 0xeeb6dee3 -//.word 0x0c119fb1 -//.word 0xe1eb5c15 -//.word 0xff2b32d8 -//.word 0xb9c7464a -//.word 0x4e4cc681 -//.word 0x5cd251a6 -//.word 0xbae29b49 -//.word 0x961dd5c2 -//.word 0xfa9c44a9 -//.word 0xb142ca06 -//.word 0x2c7072cb -//.word 0xf3db0429 -//.word 0x9b767789 -//.word 0x040196bf -//.word 0x0c06aa76 -//// SHA512ShortMsgvector_79 -//// vector length -//.word 0x00000270 -//// input message -//.word 0xac59a110 -//.word 0x623f1a64 -//.word 0x666f160e -//.word 0xd3292667 -//.word 0x6cb5be25 -//.word 0xdd9d962f -//.word 0x441951b0 -//.word 0xefcb5d6a -//.word 0x67ac1a4e -//.word 0xae473e49 -//.word 0xc6257860 -//.word 0x728853ff -//.word 0x415c5e8e -//.word 0xc76a8a46 -//.word 0x2ecfd343 -//.word 0xeeac22da -//.word 0xd820722c -//.word 0x597332fb -//.word 0xfd94ebbd -//.word 0x32c68000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000270 -//// expected output -//.word 0xf65ea942 -//.word 0xae0a47e7 -//.word 0x3b02b144 -//.word 0x2e5b2608 -//.word 0x3db79307 -//.word 0xf64dd34a -//.word 0x039c476f -//.word 0xaf18d5c5 -//.word 0x14bb77a2 -//.word 0xc412a607 -//.word 0x4a7afc32 -//.word 0x6ea66c74 -//.word 0xe5705fe2 -//.word 0xabbabf27 -//.word 0x4333325a -//.word 0x15b61fd9 -//// SHA512ShortMsgvector_80 -//// vector length -//.word 0x00000278 -//// input message -//.word 0x9e3e1077 -//.word 0xe1333a1f -//.word 0xb1aa633c -//.word 0xcf2f7465 -//.word 0x88ad4264 -//.word 0x89ea08df -//.word 0xf5511438 -//.word 0xb5f4c0b1 -//.word 0x10d1a4d4 -//.word 0x7b540a12 -//.word 0xb21ea2aa -//.word 0x070578cc -//.word 0xfa5c22fe -//.word 0x0b743ec0 -//.word 0xcc621c6b -//.word 0x3a03b75f -//.word 0x4d3eea5d -//.word 0xce89e032 -//.word 0x69afcd96 -//.word 0x03d0db80 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000278 -//// expected output -//.word 0x4b5c5df8 -//.word 0x0c344c12 -//.word 0x388c7238 -//.word 0x56cd0696 -//.word 0x5b2190af -//.word 0x65248047 -//.word 0x6747dc21 -//.word 0x95ea3716 -//.word 0xf87c1762 -//.word 0x359583a5 -//.word 0xf31522f8 -//.word 0x3f7833be -//.word 0xc30f1f47 -//.word 0xd1454041 -//.word 0x7dd463f5 -//.word 0xd258cd4a -//// SHA512ShortMsgvector_81 -//// vector length -//.word 0x00000280 -//// input message -//.word 0xe881e328 -//.word 0x4c79d8f5 -//.word 0x237e699e -//.word 0x4fbca840 -//.word 0x90c664bb -//.word 0x53229f58 -//.word 0xcb0842b0 -//.word 0x436710c9 -//.word 0xb329d981 -//.word 0x91b8f030 -//.word 0xe9c1df89 -//.word 0xb03858c1 -//.word 0x569c6ff4 -//.word 0x9a7c07c4 -//.word 0xa23a8a43 -//.word 0x4b0fde13 -//.word 0xbe4f94cb -//.word 0x44ee629d -//.word 0x5b44d336 -//.word 0x090d3de6 -//.word 0x80000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000280 -//// expected output -//.word 0x147d8071 -//.word 0xc7871ef9 -//.word 0x256cff32 -//.word 0xaa63ea03 -//.word 0x1404fa5e -//.word 0xe4ec09c5 -//.word 0x6afdd5da -//.word 0x919b0cc8 -//.word 0x4a9d35d1 -//.word 0x42c41771 -//.word 0x52033160 -//.word 0x11cc620c -//.word 0xd6855bb1 -//.word 0x17063a5e -//.word 0x52867fac -//.word 0xc680d5f4 -//// SHA512ShortMsgvector_82 -//// vector length -//.word 0x00000288 -//// input message -//.word 0xe5852109 -//.word 0x8911503d -//.word 0xe8431138 -//.word 0x7d375c25 -//.word 0x929e6e55 -//.word 0x076eb693 -//.word 0x4fd8f2b1 -//.word 0xbb7b9667 -//.word 0xfbd76d5e -//.word 0xe2048287 -//.word 0x69a341b1 -//.word 0xf716da5b -//.word 0xdfece6c6 -//.word 0x2a9f4d4f -//.word 0x988267fc -//.word 0xe1f56155 -//.word 0x40dbe375 -//.word 0x324eef60 -//.word 0x7c910d97 -//.word 0x6b45a5ea -//.word 0x5f800000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000288 -//// expected output -//.word 0xf97ba056 -//.word 0xfa41f43b -//.word 0x8e198707 -//.word 0x2a09e828 -//.word 0xc71c5ff6 -//.word 0xad4e37f9 -//.word 0xab6b89e2 -//.word 0xa078933d -//.word 0xd23052fa -//.word 0x72c6615b -//.word 0x61390425 -//.word 0x9e9ff9b5 -//.word 0x5ef7b923 -//.word 0xb89bc875 -//.word 0x2f6babdd -//.word 0xd256e117 -//// SHA512ShortMsgvector_83 -//// vector length -//.word 0x00000290 -//// input message -//.word 0x3796cf51 -//.word 0xb8726652 -//.word 0xa4204733 -//.word 0xb8fbb047 -//.word 0xcf00fb91 -//.word 0xa9837e22 -//.word 0xec22b1a2 -//.word 0x68f88e2c -//.word 0x9f133e5f -//.word 0x8527f1b1 -//.word 0x84830e07 -//.word 0xc3458c83 -//.word 0xa8ca9f9d -//.word 0x9c699876 -//.word 0x0e610668 -//.word 0xba0f22e2 -//.word 0x2b656a73 -//.word 0x7e978b24 -//.word 0x6a17840b -//.word 0x7dc4091d -//.word 0xa85f8000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000290 -//// expected output -//.word 0xc8a46619 -//.word 0x9acbcbc9 -//.word 0x3f2ce042 -//.word 0x968508c0 -//.word 0x46901631 -//.word 0xe3118a2d -//.word 0x0bf39a9b -//.word 0x42b4197a -//.word 0x379b3a86 -//.word 0xcdeca9df -//.word 0x2de1a3eb -//.word 0x71b79ae9 -//.word 0xbf2d6575 -//.word 0xeadf1878 -//.word 0x029c4093 -//.word 0x133f54d3 -//// SHA512ShortMsgvector_84 -//// vector length -//.word 0x00000298 -//// input message -//.word 0x9af608d0 -//.word 0x31ccf309 -//.word 0xd7273c60 -//.word 0x7a8e5e36 -//.word 0x840d449b -//.word 0x55db5b13 -//.word 0xf03aeb9a -//.word 0xf49fa7e7 -//.word 0xcf1383ee -//.word 0x2ed9c5a8 -//.word 0xb7515f16 -//.word 0xfb1c7c84 -//.word 0xa681590b -//.word 0xf90f5659 -//.word 0x7b844db5 -//.word 0xebee223d -//.word 0x78109b72 -//.word 0x350772f7 -//.word 0xc72ea996 -//.word 0x603e1e84 -//.word 0xf2ba5f80 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000298 -//// expected output -//.word 0xf0ded949 -//.word 0x5b4f64ca -//.word 0xc585be8a -//.word 0x737cfa14 -//.word 0x247a4a81 -//.word 0xcdf7f01e -//.word 0xbcb134ac -//.word 0xe71f5a83 -//.word 0xdf2cd72e -//.word 0x7773fea1 -//.word 0xe82beae1 -//.word 0x7e138573 -//.word 0x72792c82 -//.word 0x31e2ab9f -//.word 0xbeb633e3 -//.word 0x99d5f0ae -//// SHA512ShortMsgvector_85 -//// vector length -//.word 0x000002A0 -//// input message -//.word 0xd0df1bdf -//.word 0x1df62032 -//.word 0x41722fb9 -//.word 0xc9c1cf74 -//.word 0x05017497 -//.word 0xae154538 -//.word 0xccf9224a -//.word 0xd752e6ce -//.word 0x1d4ae948 -//.word 0x639aca70 -//.word 0xcfe86b2b -//.word 0x06543cb9 -//.word 0x914ebd30 -//.word 0x85aa3e29 -//.word 0x63f6e9b9 -//.word 0x3d0b03a3 -//.word 0x1ae26fcb -//.word 0x9ca974ee -//.word 0xe016c091 -//.word 0xa6fcac37 -//.word 0xb21cc1d7 -//.word 0x80000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x000002A0 -//// expected output -//.word 0xc2da3ea3 -//.word 0xc8a3fd88 -//.word 0xa5bc5dea -//.word 0x2bc076f8 -//.word 0x61abedef -//.word 0xae5a5fbd -//.word 0x941ddfd1 -//.word 0xc41cc331 -//.word 0x2eb2dc82 -//.word 0x6c2c0f65 -//.word 0x414fe72e -//.word 0xbee447d2 -//.word 0xf9b1a6a5 -//.word 0x6302660d -//.word 0x1f86632e -//.word 0xe80a175f -//// SHA512ShortMsgvector_86 -//// vector length -//.word 0x000002A8 -//// input message -//.word 0x8cbc9480 -//.word 0x553acef7 -//.word 0xbcdba971 -//.word 0x6ea8d66b -//.word 0x41317809 -//.word 0x17de2b0b -//.word 0x048045fc -//.word 0xb32b5cac -//.word 0x054808e1 -//.word 0xfce6e94a -//.word 0xd851ecb4 -//.word 0x7fe6cb80 -//.word 0x2225d355 -//.word 0x1e08ea12 -//.word 0x2093d007 -//.word 0x8dada564 -//.word 0x212eacf1 -//.word 0xd6394e00 -//.word 0x07cc62a1 -//.word 0xd595ab14 -//.word 0xca08a284 -//.word 0xbc800000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x000002A8 -//// expected output -//.word 0x63b39b88 -//.word 0xceb84818 -//.word 0x8b37316e -//.word 0x04560e75 -//.word 0xa5340ab8 -//.word 0xd417932d -//.word 0x231c997e -//.word 0x892b41da -//.word 0xa69d9fe3 -//.word 0xe9a14dd1 -//.word 0x9ccfbbfa -//.word 0x01488c20 -//.word 0x8e7b946c -//.word 0xfaf16ca2 -//.word 0xb1bf7c8d -//.word 0x8da4e6b2 -//// SHA512ShortMsgvector_87 -//// vector length -//.word 0x000002B0 -//// input message -//.word 0x38f18444 -//.word 0x8f3cf82a -//.word 0x54cafc55 -//.word 0x6aff336f -//.word 0x23f9149e -//.word 0x612134b3 -//.word 0xfc00c8a5 -//.word 0x6455653d -//.word 0x88640b12 -//.word 0xf69062b8 -//.word 0x432c4335 -//.word 0xad8f7ab4 -//.word 0xff66cb7e -//.word 0xb54f3325 -//.word 0x61a36f02 -//.word 0x4d92c3e2 -//.word 0x6276f4fd -//.word 0x48619628 -//.word 0xcff88e4b -//.word 0x8e85cf14 -//.word 0xca4767ed -//.word 0x990d8000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x000002B0 -//// expected output -//.word 0x9a49265f -//.word 0xc641c59f -//.word 0x1a91872c -//.word 0xdae490d3 -//.word 0xda73c0c6 -//.word 0x0fd59648 -//.word 0xe1d17dba -//.word 0x1a647a5b -//.word 0x95629392 -//.word 0xbb4ff516 -//.word 0x3d1a3cb4 -//.word 0x5427c143 -//.word 0x7a3b2e1d -//.word 0x9f030c0a -//.word 0x8bcc5ed2 -//.word 0x2da9e2ed -//// SHA512ShortMsgvector_88 -//// vector length -//.word 0x000002B8 -//// input message -//.word 0x70900618 -//.word 0xb1e9e9db -//.word 0x62296fb6 -//.word 0xc6590c9f -//.word 0x10b0a632 -//.word 0x765c489c -//.word 0x887f1ab7 -//.word 0xc0779176 -//.word 0x5a62e384 -//.word 0x65e1be28 -//.word 0x1b1d396c -//.word 0x6e080b7e -//.word 0xe3e6fa56 -//.word 0xa30b9799 -//.word 0xd0e629be -//.word 0x153ee76f -//.word 0x81bc6a32 -//.word 0x95aa6148 -//.word 0x9bfa87d5 -//.word 0x3a8ad242 -//.word 0x48a6ede0 -//.word 0xdfcfe980 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x000002B8 -//// expected output -//.word 0x1c8c3357 -//.word 0xff1f8d6a -//.word 0xc4defb3a -//.word 0xf462a73e -//.word 0x09159e3a -//.word 0x20c6506e -//.word 0xdd8cd305 -//.word 0x2df941c8 -//.word 0x1f68c5fb -//.word 0xb8939126 -//.word 0x19e28640 -//.word 0x977fe8ea -//.word 0xae8e9d5d -//.word 0x4e7d5f13 -//.word 0x2552cefa -//.word 0xb4540bac -//// SHA512ShortMsgvector_89 -//// vector length -//.word 0x000002C0 -//// input message -//.word 0x4e6ddae0 -//.word 0xd805afcd -//.word 0x10a055bc -//.word 0xe584c848 -//.word 0xd050fb29 -//.word 0xfe8f1c64 -//.word 0xb18e1abf -//.word 0xe46b6578 -//.word 0x2e6ff536 -//.word 0xe89d8d40 -//.word 0x928b41ed -//.word 0x7371365c -//.word 0x8080a964 -//.word 0x7f7532ce -//.word 0x6c6d4ac2 -//.word 0x1cfb0c80 -//.word 0x20783851 -//.word 0xec9a7dbc -//.word 0x3948f8fc -//.word 0xa7adf8b2 -//.word 0xa78c04d8 -//.word 0x98d31ff6 -//.word 0x80000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x000002C0 -//// expected output -//.word 0x5c2f996c -//.word 0x779b91b3 -//.word 0xc4639311 -//.word 0xf54fabbd -//.word 0xde7e2212 -//.word 0xb53dbae4 -//.word 0x828c8399 -//.word 0x588fc00d -//.word 0x3b2ae609 -//.word 0x18aaaf6b -//.word 0xb48bc757 -//.word 0xe52b2bce -//.word 0xa84f5d15 -//.word 0xbf4ec25d -//.word 0x5519fb54 -//.word 0xf6f26e1b -//// SHA512ShortMsgvector_90 -//// vector length -//.word 0x000002C8 -//// input message -//.word 0x696825f6 -//.word 0xd6ea8173 -//.word 0xec47d095 -//.word 0x9a401c4d -//.word 0xdf69f8f0 -//.word 0x8ddd678a -//.word 0x4d2ff976 -//.word 0xe3a4372b -//.word 0xb39f4159 -//.word 0x845cb635 -//.word 0x85e1d410 -//.word 0x8d32e12f -//.word 0xa7c5c9d7 -//.word 0xce3508a7 -//.word 0xf53aca2b -//.word 0x4bd951ad -//.word 0xbcd8984e -//.word 0xbb753656 -//.word 0x3f5884c9 -//.word 0x0bc5023b -//.word 0x3316f7e4 -//.word 0xdc6958f7 -//.word 0x43800000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x000002C8 -//// expected output -//.word 0x3ce940ca -//.word 0x96b00011 -//.word 0x375daa95 -//.word 0xc65f6690 -//.word 0x7d69b3eb -//.word 0x3b8d779e -//.word 0x6fc971af -//.word 0xcc05e990 -//.word 0xbc4c541f -//.word 0x434590f6 -//.word 0xb18b68c0 -//.word 0x80d0f244 -//.word 0x75a3e764 -//.word 0xe9cb8534 -//.word 0x3301314e -//.word 0xe2fb661e -//// SHA512ShortMsgvector_91 -//// vector length -//.word 0x000002D0 -//// input message -//.word 0x79ecdfd4 -//.word 0x7a29a742 -//.word 0x20a52819 -//.word 0xce458974 -//.word 0x7f2b30b3 -//.word 0x64d0852c -//.word 0xce52f91e -//.word 0x4f0f48e6 -//.word 0x1c72fa76 -//.word 0xb60d3002 -//.word 0xcae89dfc -//.word 0x5519d343 -//.word 0x0b95c098 -//.word 0xfa467851 -//.word 0x6b5e3551 -//.word 0x09ea9b37 -//.word 0x45aa41d6 -//.word 0xf8206ee6 -//.word 0x4ae720f8 -//.word 0xd44653b0 -//.word 0x01057f2e -//.word 0xba7f63cd -//.word 0x42f98000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x000002D0 -//// expected output -//.word 0xba3d0fe0 -//.word 0x4470f4cf -//.word 0x8f08c46d -//.word 0x82ae3afd -//.word 0x1caea8c1 -//.word 0x3bebbe02 -//.word 0x6b5c1777 -//.word 0xaa59860a -//.word 0xf2e3da77 -//.word 0x51844e0b -//.word 0xe24072af -//.word 0x48bc8a6f -//.word 0xd77678aa -//.word 0xee04e08f -//.word 0x63395f5c -//.word 0x8a465763 -//// SHA512ShortMsgvector_92 -//// vector length -//.word 0x000002D8 -//// input message -//.word 0x9263fe75 -//.word 0xe8f6c7d5 -//.word 0xd642e2ca -//.word 0x6a6eea4f -//.word 0x44e9a0f2 -//.word 0x49513ed7 -//.word 0x9c9409ff -//.word 0xca5526ca -//.word 0x4491aebb -//.word 0x1382057c -//.word 0xc7c36722 -//.word 0xb0b6c3b1 -//.word 0x5123cde3 -//.word 0x12214f25 -//.word 0x353abfe3 -//.word 0x0bca1705 -//.word 0x68a8e1ba -//.word 0x54089174 -//.word 0x03a01834 -//.word 0x080ab607 -//.word 0xc56a10d0 -//.word 0x26508249 -//.word 0x8fe0b680 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x000002D8 -//// expected output -//.word 0x7736d7a7 -//.word 0xfc1eb058 -//.word 0x57ce7d88 -//.word 0xabfffa87 -//.word 0xf58c670b -//.word 0xfdfc0a80 -//.word 0x31f60f37 -//.word 0x9e4b6ad9 -//.word 0x4ac8f13f -//.word 0xfe28c697 -//.word 0x809b5cfa -//.word 0xc7f13be0 -//.word 0x1e7496a8 -//.word 0x5237c402 -//.word 0x5539051f -//.word 0xb2e32fb6 -//// SHA512ShortMsgvector_93 -//// vector length -//.word 0x000002E0 -//// input message -//.word 0x78c17bfe -//.word 0x0e02eb52 -//.word 0x6d1a44a1 -//.word 0xac127be0 -//.word 0x82181452 -//.word 0xb625394b -//.word 0xd6dc093a -//.word 0x2cb432e6 -//.word 0xee59c2f8 -//.word 0xb5503aba -//.word 0x30dae41e -//.word 0x1a1c6702 -//.word 0x697c99b2 -//.word 0xc94e94af -//.word 0x48b00caf -//.word 0x53b2e0e4 -//.word 0xe1bbee81 -//.word 0xee282c7b -//.word 0x2b35f58c -//.word 0xf421a07e -//.word 0x828d57a6 -//.word 0x622626af -//.word 0x25835399 -//.word 0x80000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x000002E0 -//// expected output -//.word 0xb56b6e34 -//.word 0x31663285 -//.word 0x23e0d169 -//.word 0x3e5174da -//.word 0x643ae83c -//.word 0xf69c85a7 -//.word 0xb3c3bee2 -//.word 0x47b77b84 -//.word 0x702069d9 -//.word 0xe6b4cab0 -//.word 0x3bf17fe6 -//.word 0x12009bf4 -//.word 0x239683ca -//.word 0x78ca7e87 -//.word 0x6aca7d07 -//.word 0x603ba714 -//// SHA512ShortMsgvector_94 -//// vector length -//.word 0x000002E8 -//// input message -//.word 0x298bb304 -//.word 0xa920f960 -//.word 0x447d8fd3 -//.word 0x8b061bf8 -//.word 0xfe4ac1f8 -//.word 0x71d8a0fe -//.word 0xb4549feb -//.word 0x72ca694a -//.word 0x5a41b686 -//.word 0x7d94cd5a -//.word 0xf77d468a -//.word 0xd2f315d1 -//.word 0x27b6c41a -//.word 0x862800f3 -//.word 0x985e573e -//.word 0x03774029 -//.word 0x8e2c5c61 -//.word 0x86a9fb83 -//.word 0x609be2d4 -//.word 0x9f8b4c31 -//.word 0xf96a2e49 -//.word 0xb56dbf09 -//.word 0x571b3858 -//.word 0x7f800000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x000002E8 -//// expected output -//.word 0x34e38786 -//.word 0x27904ffb -//.word 0xbbd85266 -//.word 0xcc973c34 -//.word 0xf931e3ca -//.word 0xb5d4c31f -//.word 0x841c553d -//.word 0xd69f8483 -//.word 0x8206067d -//.word 0xf4f9f3b9 -//.word 0x102001be -//.word 0x19267151 -//.word 0xe673f5c2 -//.word 0xd4c2f843 -//.word 0x8a6999a0 -//.word 0xa325487d -//// SHA512ShortMsgvector_95 -//// vector length -//.word 0x000002F0 -//// input message -//.word 0xa3cf714b -//.word 0xf112647e -//.word 0x727e8cfd -//.word 0x46499acd -//.word 0x35a640dd -//.word 0x393ddd26 -//.word 0x3cd85cf6 -//.word 0x225f5989 -//.word 0x0a0686da -//.word 0xd1c54eb8 -//.word 0xd809b81c -//.word 0x08a98dba -//.word 0x131bbdd6 -//.word 0xfce8ff59 -//.word 0xd95db824 -//.word 0xd8831ea4 -//.word 0x80529da7 -//.word 0x39227a6e -//.word 0x0f62b603 -//.word 0xb38c35cd -//.word 0xc2581f61 -//.word 0x4a31879b -//.word 0x8be54aee -//.word 0xfaa08000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x000002F0 -//// expected output -//.word 0x6f230ae4 -//.word 0x903ddbef -//.word 0x0ba384c2 -//.word 0xe3506eab -//.word 0x318bfd1a -//.word 0x46ea7609 -//.word 0x9f65a3fd -//.word 0x529c91bc -//.word 0x2865b9fd -//.word 0x943e346d -//.word 0xe64626b8 -//.word 0x529f9db1 -//.word 0x377bf2c5 -//.word 0xe0129c66 -//.word 0xb50c6a5c -//.word 0xfb364b3a -//// SHA512ShortMsgvector_96 -//// vector length -//.word 0x000002F8 -//// input message -//.word 0x0a427ae5 -//.word 0x5ef3a7e6 -//.word 0x044a08cf -//.word 0x6128cbaa -//.word 0xabfd776c -//.word 0x4e937470 -//.word 0x8f2ece24 -//.word 0x6fd73603 -//.word 0xd2f54ac3 -//.word 0xe01d16cf -//.word 0xac2bdaf7 -//.word 0x13920d66 -//.word 0xe8f0a3d5 -//.word 0x4ee68cff -//.word 0x64267d55 -//.word 0x28cdf2f2 -//.word 0x95f474d1 -//.word 0x0f81173e -//.word 0x0143488a -//.word 0xc53fc503 -//.word 0xc444ed23 -//.word 0xdec63a08 -//.word 0x0ce90c24 -//.word 0x43dba880 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x000002F8 -//// expected output -//.word 0xf6bbe5d0 -//.word 0xcf13ddf4 -//.word 0x1c143674 -//.word 0x8a5d1cca -//.word 0xe2948547 -//.word 0xb452c217 -//.word 0x1c7c8e8b -//.word 0x66c6ae4d -//.word 0xe3c0e8b2 -//.word 0x962bcb60 -//.word 0xd3de3608 -//.word 0x479f80e4 -//.word 0x55c9024d -//.word 0x9716c38f -//.word 0x6f120686 -//.word 0x1ab1eaac -//// SHA512ShortMsgvector_97 -//// vector length -//.word 0x00000300 -//// input message -//.word 0x2cbbb875 -//.word 0x11f4948e -//.word 0xfec3a61b -//.word 0x511ededb -//.word 0x1dda8b6e -//.word 0xcfc0210c -//.word 0x11e43a77 -//.word 0xee32dc2e -//.word 0x374afae4 -//.word 0x268e3d30 -//.word 0x42780486 -//.word 0x8232a966 -//.word 0xb56006d3 -//.word 0x21403707 -//.word 0x6bf6a265 -//.word 0xb72135af -//.word 0x0fb2ef79 -//.word 0x09fea2de -//.word 0xa412f771 -//.word 0x7446b276 -//.word 0xff153753 -//.word 0x662b4d41 -//.word 0x48c02347 -//.word 0xe3259169 -//.word 0x80000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000300 -//// expected output -//.word 0x76897b87 -//.word 0xa8a1cf83 -//.word 0x5c434f6d -//.word 0x391c9e52 -//.word 0x27351af9 -//.word 0xd3e20a33 -//.word 0x89c796b9 -//.word 0x8b424281 -//.word 0xa59068d9 -//.word 0xc8d567ec -//.word 0x2bebc435 -//.word 0xb0126b05 -//.word 0x9e2d8639 -//.word 0x4a9854d6 -//.word 0x611e1c92 -//.word 0x2f385496 -//// SHA512ShortMsgvector_98 -//// vector length -//.word 0x00000308 -//// input message -//.word 0x2b23324c -//.word 0x9992f60a -//.word 0x7fc01015 -//.word 0x9a03cb9a -//.word 0x2b290df4 -//.word 0xfa6a8235 -//.word 0x9b9af602 -//.word 0xf0a403a5 -//.word 0xef33ed5d -//.word 0xa5b2caf8 -//.word 0x7b77e6a4 -//.word 0xb93b6503 -//.word 0x48ce2a7d -//.word 0xbc08f8da -//.word 0x9203d710 -//.word 0xb587ba59 -//.word 0x47c65e89 -//.word 0x9f4a759f -//.word 0x8e2b049a -//.word 0xe7850a8e -//.word 0x3e2962f6 -//.word 0xef93ea4c -//.word 0x631de5d7 -//.word 0x8e729ec5 -//.word 0xbc800000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000308 -//// expected output -//.word 0x3beea0b3 -//.word 0x73ed09cf -//.word 0x1c919c51 -//.word 0xd86d642c -//.word 0x9125e0ee -//.word 0x81698dc4 -//.word 0xcbadf02e -//.word 0x9e6925ef -//.word 0xb562fd9b -//.word 0x87301a63 -//.word 0x77ca192b -//.word 0xe79c4118 -//.word 0xdeabc450 -//.word 0xb5463900 -//.word 0x0c2e3129 -//.word 0x45451fb5 -//// SHA512ShortMsgvector_99 -//// vector length -//.word 0x00000310 -//// input message -//.word 0x4022f930 -//.word 0xc7033b00 -//.word 0xd986c65f -//.word 0xf6bbbdf9 -//.word 0xebd0e58c -//.word 0x52844ff6 -//.word 0x58df3893 -//.word 0xc3202dc5 -//.word 0x33f873d4 -//.word 0xa7f5a5f9 -//.word 0x44419fb5 -//.word 0x528c9b67 -//.word 0x88479a1e -//.word 0x891306ac -//.word 0xae7995fc -//.word 0x06db70a5 -//.word 0x9baa95be -//.word 0xf7da79f5 -//.word 0xe793f2db -//.word 0x7f2a5582 -//.word 0x5e4fdb4a -//.word 0x34884af8 -//.word 0x81ded108 -//.word 0x9fd53345 -//.word 0x02a28000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000310 -//// expected output -//.word 0x0358775b -//.word 0xbb733ccc -//.word 0x49e78f54 -//.word 0x4aeee512 -//.word 0x370d480d -//.word 0x0e13c7e8 -//.word 0xd5c444c4 -//.word 0x23e59214 -//.word 0x6b45fdb9 -//.word 0x1a1b694d -//.word 0x35e36b60 -//.word 0xe4bc8397 -//.word 0xfca8bb97 -//.word 0x90e61933 -//.word 0x9778b9cd -//.word 0x1abe3fe9 -//// SHA512ShortMsgvector_100 -//// vector length -//.word 0x00000318 -//// input message -//.word 0x1cb77ba4 -//.word 0x3ce77e23 -//.word 0x6b9fc925 -//.word 0xf589b1c0 -//.word 0x70780a84 -//.word 0xf99e8f50 -//.word 0xc1ff846a -//.word 0xc92599cf -//.word 0xe91612c8 -//.word 0x178325be -//.word 0xe642a34f -//.word 0x4dffdba2 -//.word 0xaa2ebcf7 -//.word 0x06433982 -//.word 0x9b26f279 -//.word 0x93e1106c -//.word 0x139c70d5 -//.word 0x78cc05f0 -//.word 0xe1a777cc -//.word 0xeddb10a2 -//.word 0xc67fd967 -//.word 0x5e4a009d -//.word 0xf8037d6e -//.word 0xeb38f5fb -//.word 0xa233df80 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000318 -//// expected output -//.word 0x6502f465 -//.word 0x51a3fab3 -//.word 0xa96428fb -//.word 0x97801d7a -//.word 0x4aa2f17f -//.word 0xef660323 -//.word 0x8df84e17 -//.word 0xc74309ed -//.word 0x3d9489c8 -//.word 0xb16a9384 -//.word 0xee634a3f -//.word 0x86d0b3ba -//.word 0x9a4dbc9c -//.word 0x51ec8bd4 -//.word 0xbf8d61de -//.word 0x6d3d87d7 -//// SHA512ShortMsgvector_101 -//// vector length -//.word 0x00000320 -//// input message -//.word 0x52167de2 -//.word 0xd6c502d9 -//.word 0x9fa10c27 -//.word 0xb2ab6203 -//.word 0xbdebc2ca -//.word 0xfbbfdef1 -//.word 0x5872a43d -//.word 0xd610c236 -//.word 0x2f796ad9 -//.word 0xbcb5528d -//.word 0x95870058 -//.word 0xfa454453 -//.word 0xf1e6065b -//.word 0x315d410a -//.word 0x3f2650e5 -//.word 0xd71e69d7 -//.word 0x8d9767df -//.word 0xb4accc05 -//.word 0x7fd20692 -//.word 0x66b0f180 -//.word 0xcb319e30 -//.word 0xded7535b -//.word 0xbe52d24b -//.word 0xe151de4b -//.word 0xb598fc5c -//.word 0x80000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000320 -//// expected output -//.word 0x25cb3ed3 -//.word 0x983a91b4 -//.word 0xcf37a651 -//.word 0x93916c5e -//.word 0x3e211b63 -//.word 0xe943e2f7 -//.word 0xb50a85d3 -//.word 0x49a463b9 -//.word 0x41aad33e -//.word 0xff16561b -//.word 0xdfdc92fd -//.word 0xa06a4e1d -//.word 0x94b162de -//.word 0x48f06d3c -//.word 0x626940b3 -//.word 0x1020925f -//// SHA512ShortMsgvector_102 -//// vector length -//.word 0x00000328 -//// input message -//.word 0xcede6697 -//.word 0xd422ddaa -//.word 0x78e2d55a -//.word 0xe080b8b9 -//.word 0xe9356c69 -//.word 0xbc558201 -//.word 0xa2d4b0b3 -//.word 0x190a812c -//.word 0x27b34bbc -//.word 0xee3a62b7 -//.word 0x81378b1b -//.word 0xf636b372 -//.word 0xbcbae1fa -//.word 0x2f816a04 -//.word 0x6a0a649a -//.word 0x5c555c64 -//.word 0x1fea4ccd -//.word 0x841cc761 -//.word 0xf38f7779 -//.word 0x72f8c91b -//.word 0x0324e71c -//.word 0x333ce787 -//.word 0xf0474143 -//.word 0x9bf087ef -//.word 0x5e895011 -//.word 0xc0800000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000328 -//// expected output -//.word 0x0be42a25 -//.word 0xd77ac6ad -//.word 0x995c6be4 -//.word 0x8e783380 -//.word 0xbad25a61 -//.word 0x732f87ce -//.word 0xfb0cce1a -//.word 0x769cd690 -//.word 0x81f494a1 -//.word 0xa12d6576 -//.word 0x64ef2b4d -//.word 0x9c41f2ee -//.word 0x83f6e9a8 -//.word 0x4327d875 -//.word 0x6af9f985 -//.word 0x595e7d3b -//// SHA512ShortMsgvector_103 -//// vector length -//.word 0x00000330 -//// input message -//.word 0x56d18d3e -//.word 0x2e496440 -//.word 0xd0a5c9e1 -//.word 0xbcb464fa -//.word 0xf5bc70a8 -//.word 0xb562124f -//.word 0x5fc9e9de -//.word 0xb5fee654 -//.word 0x4b945e83 -//.word 0x3b8b5d13 -//.word 0x1b773ecb -//.word 0x2cdd780c -//.word 0xd4e1bb9e -//.word 0x4f1e3cb0 -//.word 0xa1d64d19 -//.word 0xcf4b30e4 -//.word 0x4e6c2d0c -//.word 0xbcb4e284 -//.word 0xce50db7a -//.word 0x8a8062dd -//.word 0xb63f981d -//.word 0x9026c532 -//.word 0xbf8eeddf -//.word 0x8af5a438 -//.word 0x48a32262 -//.word 0x178c8000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000330 -//// expected output -//.word 0x982dc61c -//.word 0x91a93770 -//.word 0x582eee80 -//.word 0x25aa55da -//.word 0x8e9edb96 -//.word 0x6bf5cf70 -//.word 0xd4a6534c -//.word 0x0d53a278 -//.word 0x9a8c4fb6 -//.word 0x5b7fed47 -//.word 0x8cda02ed -//.word 0x1e0d198d -//.word 0x85c5c735 -//.word 0xb2417c5f -//.word 0xab5d34e9 -//.word 0x69fc8e7e -//// SHA512ShortMsgvector_104 -//// vector length -//.word 0x00000338 -//// input message -//.word 0x25a7320d -//.word 0xfaec5af6 -//.word 0x5da4d0f8 -//.word 0x688e29e8 -//.word 0xe95532ec -//.word 0xc16679ea -//.word 0x8aff0f40 -//.word 0x7d898db6 -//.word 0x922855b0 -//.word 0xe8901aa9 -//.word 0x681aa3dc -//.word 0xa617cb44 -//.word 0x0764cdc7 -//.word 0x293fbeaf -//.word 0x7f585b59 -//.word 0x3c2b0531 -//.word 0x738e0ade -//.word 0x7c8626b9 -//.word 0x995f4a84 -//.word 0xd9fc9b59 -//.word 0x3d6bbee0 -//.word 0x1abc53c5 -//.word 0xbe14bf69 -//.word 0x56fd2fd8 -//.word 0x1000dafc -//.word 0x7c768680 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000338 -//// expected output -//.word 0x749c928c -//.word 0x3d551092 -//.word 0x5bfe9865 -//.word 0x9025b0ed -//.word 0x7c01acd4 -//.word 0xd59a9bf1 -//.word 0xc54863a0 -//.word 0x88091771 -//.word 0xdc9d407b -//.word 0xdbf83b0f -//.word 0x44b0902e -//.word 0x10349ba7 -//.word 0x9c84d098 -//.word 0x1d5e8c4f -//.word 0x5c733a11 -//.word 0x7fed0790 -//// SHA512ShortMsgvector_105 -//// vector length -//.word 0x00000340 -//// input message -//.word 0x3d7177b2 -//.word 0x8ffd916e -//.word 0x7e063489 -//.word 0x5833ba0b -//.word 0xd9e0653d -//.word 0xf2cc4202 -//.word 0xc811536a -//.word 0x005aec85 -//.word 0x3a505e75 -//.word 0xdb55d3c7 -//.word 0x10757904 -//.word 0x1099e382 -//.word 0xa1feac80 -//.word 0xdde65d72 -//.word 0x368e909a -//.word 0xb85f56d8 -//.word 0x8e68d7c3 -//.word 0xc80c38f8 -//.word 0x5bf8c2b3 -//.word 0x6959409c -//.word 0xc34ba8e3 -//.word 0xad94fe8e -//.word 0xe1927612 -//.word 0xd672d921 -//.word 0x41a329c4 -//.word 0xdd8a88a9 -//.word 0x80000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000340 -//// expected output -//.word 0x14a33150 -//.word 0x8cd7d94f -//.word 0xcce56a66 -//.word 0xbf65f208 -//.word 0x70a281c8 -//.word 0x442f8dbd -//.word 0x4c237145 -//.word 0x4a2b66f8 -//.word 0xd0994a0b -//.word 0x67692e77 -//.word 0x1efc6a5e -//.word 0x0b887aca -//.word 0xe7d6f4ec -//.word 0x7338e1aa -//.word 0x89f2abc7 -//.word 0x034c4e4c -//// SHA512ShortMsgvector_106 -//// vector length -//.word 0x00000348 -//// input message -//.word 0xc033e4a5 -//.word 0x12297cae -//.word 0xcdbead89 -//.word 0x2b11a9f7 -//.word 0x007af9a7 -//.word 0x4bcab89e -//.word 0x0bd4ffdd -//.word 0x542ca03e -//.word 0xa12e17a0 -//.word 0x6c42bd43 -//.word 0xfc5f3f75 -//.word 0x7fce4f6f -//.word 0x5831997a -//.word 0xbac3f956 -//.word 0x76e1ebdb -//.word 0x11ca43e1 -//.word 0x1aa31e5e -//.word 0xbabe18ce -//.word 0x8d1bbfd8 -//.word 0xb02f482e -//.word 0x1ce581b5 -//.word 0x32e307e6 -//.word 0x960eb974 -//.word 0x41506c2e -//.word 0xd299e128 -//.word 0x2523f415 -//.word 0x27800000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000348 -//// expected output -//.word 0x95ac9b7d -//.word 0x22aa4589 -//.word 0x21874c4b -//.word 0x4331e7d6 -//.word 0x47618532 -//.word 0x17c3f83c -//.word 0x601abcbc -//.word 0xcd7e2eaa -//.word 0x6ca6ce9a -//.word 0x22ebcfe5 -//.word 0x046d52f8 -//.word 0xa09097f0 -//.word 0x43ab8bc5 -//.word 0x9243fd77 -//.word 0x0090bb43 -//.word 0x2c3155e9 -//// SHA512ShortMsgvector_107 -//// vector length -//.word 0x00000350 -//// input message -//.word 0x69fff0f1 -//.word 0xa3dbfb36 -//.word 0xe32f0258 -//.word 0x19fa99ea -//.word 0x9a0edaef -//.word 0x73145bf7 -//.word 0xfcd05d8b -//.word 0xb0a646cb -//.word 0x3b5d5256 -//.word 0xd524856a -//.word 0xcfd2e44d -//.word 0x6b72e4eb -//.word 0xf1ff23c0 -//.word 0xff6c56f8 -//.word 0x21e782d5 -//.word 0xa15f7052 -//.word 0xa1445b06 -//.word 0x668eeb4a -//.word 0xf700679e -//.word 0xe7ae2649 -//.word 0x6fbd4640 -//.word 0xc06aa149 -//.word 0x964dfd60 -//.word 0x11df835a -//.word 0xc13b73c8 -//.word 0xff21151e -//.word 0x84408000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000350 -//// expected output -//.word 0x45d4daa6 -//.word 0x52558d1c -//.word 0x12beb0f5 -//.word 0x662c712f -//.word 0x325b4c80 -//.word 0x2fc6eb9e -//.word 0xe039c949 -//.word 0xd002bb78 -//.word 0x6f1a7327 -//.word 0x12be941f -//.word 0x9c5c79b3 -//.word 0xe5c43064 -//.word 0xd63a3857 -//.word 0x8e5a54ee -//.word 0x526acb73 -//.word 0x5b9ad45f -//// SHA512ShortMsgvector_108 -//// vector length -//.word 0x00000358 -//// input message -//.word 0xb2c439c9 -//.word 0x7ab7c637 -//.word 0x36b37963 -//.word 0x24d68eeb -//.word 0x7a471ed1 -//.word 0x42bd9622 -//.word 0x684167d6 -//.word 0x1234fff8 -//.word 0x2f93f907 -//.word 0x537a909b -//.word 0xc2e75a4b -//.word 0xcbc133cf -//.word 0x57197662 -//.word 0xc1af746a -//.word 0xe8b81e5b -//.word 0x83de05d9 -//.word 0xb589851d -//.word 0xe25d3c99 -//.word 0xc004c1df -//.word 0xb12d93bf -//.word 0x50d450af -//.word 0x49c42871 -//.word 0x6f5b90ef -//.word 0x088e3b6a -//.word 0x6b2c46d3 -//.word 0xce67b379 -//.word 0x59901880 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000358 -//// expected output -//.word 0xc48ec83b -//.word 0xe5fa669e -//.word 0x6ec8db90 -//.word 0xaca9676c -//.word 0xfe2ec0d5 -//.word 0xe8e7a243 -//.word 0x1687bb95 -//.word 0x3c0a300b -//.word 0xe3db4075 -//.word 0xcca3bac4 -//.word 0xdfa4d971 -//.word 0xbaf0fa1a -//.word 0xff46639d -//.word 0xb4b23885 -//.word 0x6ff36d1d -//.word 0xfcd520f1 -//// SHA512ShortMsgvector_109 -//// vector length -//.word 0x00000360 -//// input message -//.word 0xc016f522 -//.word 0xf26b7470 -//.word 0xe922b9a2 -//.word 0x87e6d45f -//.word 0x6c28813b -//.word 0x68c1457e -//.word 0x36d9ba26 -//.word 0x6708272f -//.word 0x9cbc5411 -//.word 0xf8db9d8b -//.word 0xd5a9449f -//.word 0xb6eb0cde -//.word 0x7d4d03e5 -//.word 0xdf019f28 -//.word 0x14a90cee -//.word 0xd377c59d -//.word 0x7d926238 -//.word 0x99bcb026 -//.word 0x80330735 -//.word 0x59d4d8de -//.word 0x488686cb -//.word 0xe3d67796 -//.word 0xe6df6ad4 -//.word 0x276d0b52 -//.word 0xcc62c49e -//.word 0xbb58d7c9 -//.word 0x5287aa6c -//.word 0x80000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000360 -//// expected output -//.word 0x7402f1a9 -//.word 0x9b47e102 -//.word 0xb3b73140 -//.word 0xc6771b07 -//.word 0xee6c33b3 -//.word 0x715e9c40 -//.word 0x27c441be -//.word 0xe40511b7 -//.word 0x35d95e50 -//.word 0x8baea78d -//.word 0xa26fded9 -//.word 0xb7038e9a -//.word 0x53defa58 -//.word 0x448aba40 -//.word 0xdc1e62d7 -//.word 0xec592107 -//// SHA512ShortMsgvector_110 -//// vector length -//.word 0x00000368 -//// input message -//.word 0xa766b2a7 -//.word 0xef916721 -//.word 0xf4677b67 -//.word 0xdbc65ef9 -//.word 0xb4d1bda1 -//.word 0xad4e53fc -//.word 0x854b0236 -//.word 0x44082215 -//.word 0x2a111939 -//.word 0xe5ab2ba2 -//.word 0x07719472 -//.word 0xb63fd4f4 -//.word 0xa54f4bde -//.word 0x44a205d3 -//.word 0x34a2d72c -//.word 0xfe05abf8 -//.word 0x04f41841 -//.word 0xb86d3692 -//.word 0x0be6b0b5 -//.word 0x29331ac1 -//.word 0x63a98555 -//.word 0x6c84511e -//.word 0xc986439f -//.word 0x83e1d731 -//.word 0x1f57d848 -//.word 0xcfa02df9 -//.word 0xea0cf6b9 -//.word 0x9a800000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000368 -//// expected output -//.word 0xddd60f93 -//.word 0xa3babc78 -//.word 0x299cf763 -//.word 0xe7919d45 -//.word 0xac6f4797 -//.word 0x00e1adb0 -//.word 0x5ab137ac -//.word 0xdf89c152 -//.word 0x1ecb9dfe -//.word 0xacd091e5 -//.word 0x8ca57a1d -//.word 0xb964a9c3 -//.word 0xcd1fa391 -//.word 0x92cc1e9f -//.word 0x734caa1c -//.word 0x5fa62975 -//// SHA512ShortMsgvector_111 -//// vector length -//.word 0x00000370 -//// input message -//.word 0x10f2be77 -//.word 0xa4055771 -//.word 0xa67007cd -//.word 0x8630e323 -//.word 0x0e382884 -//.word 0x99cb1603 -//.word 0x80290174 -//.word 0xd66da574 -//.word 0x55b6baaa -//.word 0x9785c84c -//.word 0x8a663de4 -//.word 0x1ed3bd54 -//.word 0x4055b917 -//.word 0x0cec43cb -//.word 0x3eb120ec -//.word 0xeaba1fe3 -//.word 0x6e3eaa3f -//.word 0xa4f99b42 -//.word 0x5cd2519f -//.word 0x09bc0282 -//.word 0xbada52d1 -//.word 0x4ce625b1 -//.word 0xded3b24d -//.word 0x86b1dad3 -//.word 0x42d2b7be -//.word 0x322b775b -//.word 0x04fc6b86 -//.word 0xafb48000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000370 -//// expected output -//.word 0xa872fa33 -//.word 0xd463b334 -//.word 0x3cec57c2 -//.word 0x0c66979c -//.word 0x33e1ad06 -//.word 0x7bfc7034 -//.word 0x54696aab -//.word 0x5dd0003b -//.word 0xc194318f -//.word 0x4a8ebbc7 -//.word 0x4503feb7 -//.word 0x211a472d -//.word 0xadee991e -//.word 0xfe3e38f2 -//.word 0x1a1310f8 -//.word 0xa76eac80 -//// SHA512ShortMsgvector_112 -//// vector length -//.word 0x00000378 -//// input message -//.word 0x324533e6 -//.word 0x85f1852e -//.word 0x358eea8e -//.word 0xa8b81c28 -//.word 0x8b3f3beb -//.word 0x1f2bc2b8 -//.word 0xd3fdbac3 -//.word 0x18382e3d -//.word 0x7120de30 -//.word 0xc9c237aa -//.word 0x0a34831d -//.word 0xeb1e5e06 -//.word 0x0a7969cd -//.word 0x3a9742ec -//.word 0x1e64b354 -//.word 0xf7eb290c -//.word 0xba1c681c -//.word 0x66cc7ea9 -//.word 0x94fdf561 -//.word 0x4f604d1a -//.word 0x2718aab5 -//.word 0x81c1c949 -//.word 0x31b1387e -//.word 0x4b7dc736 -//.word 0x35bf3a73 -//.word 0x01174075 -//.word 0xfa70a922 -//.word 0x7d85d380 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000378 -//// expected output -//.word 0x3b26c517 -//.word 0x0729d081 -//.word 0x4153becb -//.word 0x95f1b65c -//.word 0xd42f9a6d -//.word 0x0649d914 -//.word 0xe4f69d93 -//.word 0x8b5e9dc0 -//.word 0x41cd0f5c -//.word 0x8da0b484 -//.word 0xd7c7bc7b -//.word 0x1bdefb08 -//.word 0xfe8b1bfe -//.word 0xdc811093 -//.word 0x45bc9e9a -//.word 0x399feedf -//// SHA512ShortMsgvector_113 -//// vector length -//.word 0x00000380 -//// input message -//.word 0x51898597 -//.word 0x7ee21d2b -//.word 0xf622a205 -//.word 0x67124fcb -//.word 0xf11c72df -//.word 0x80536583 -//.word 0x5ab3c041 -//.word 0xf4a9cd8a -//.word 0x0ad63c9d -//.word 0xee1018aa -//.word 0x21a9fa37 -//.word 0x20f47dc4 -//.word 0x8006f1aa -//.word 0x3dba5449 -//.word 0x50f87e62 -//.word 0x7f369bc2 -//.word 0x793ede21 -//.word 0x22327449 -//.word 0x2cceb77b -//.word 0xe7eea50e -//.word 0x5a509059 -//.word 0x929a16d3 -//.word 0x3a9f5479 -//.word 0x6cde5770 -//.word 0xc74bd3ec -//.word 0xc2531850 -//.word 0x3f1a4197 -//.word 0x6407aff2 -//.word 0x80000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000380 -//// expected output -//.word 0xc00926a3 -//.word 0x74cde55b -//.word 0x8fbd77f5 -//.word 0x0da1363d -//.word 0xa19744d3 -//.word 0xf464e07c -//.word 0xe31794c5 -//.word 0xa61b6f9c -//.word 0x85689fa1 -//.word 0xcfe13655 -//.word 0x3527fd87 -//.word 0x6be91673 -//.word 0xc2cac2dd -//.word 0x157b2def -//.word 0xea360851 -//.word 0xb6d92cf4 -//// SHA512ShortMsgvector_114 -//// vector length -//.word 0x00000388 -//// input message -//.word 0x91597672 -//.word 0x75ba6f79 -//.word 0xcbb3d58c -//.word 0x0108339d -//.word 0x8c6a4113 -//.word 0x8991ab7a -//.word 0xa58b1479 -//.word 0x3b545b04 -//.word 0xbda61dd2 -//.word 0x55127b12 -//.word 0xcc501d5a -//.word 0xaad476e0 -//.word 0x9fa14aec -//.word 0x21626e8d -//.word 0x57b7d08c -//.word 0x36cdb79e -//.word 0xea314bdd -//.word 0x77e65779 -//.word 0xa0b54eab -//.word 0x08c48ceb -//.word 0x976adf63 -//.word 0x1f4246a3 -//.word 0x3f7ef896 -//.word 0x887ea8b5 -//.word 0xdfa2087a -//.word 0x225c8c18 -//.word 0x0f897069 -//.word 0x6101fc28 -//.word 0x3b800000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000388 -//// expected output -//.word 0x3cd3380a -//.word 0x90868de1 -//.word 0x7dee4bd4 -//.word 0xd7f90d75 -//.word 0x12696f0a -//.word 0x92b2d089 -//.word 0x240d61a9 -//.word 0xd20cd3af -//.word 0x094c78bf -//.word 0x466c2d40 -//.word 0x4dd2f662 -//.word 0xec5f4a29 -//.word 0x9be2adea -//.word 0xdf627b98 -//.word 0xe50e1c07 -//.word 0x2b769d62 -//// SHA512ShortMsgvector_115 -//// vector length -//.word 0x00000390 -//// input message -//.word 0xfe2d8ae2 -//.word 0x00e6657f -//.word 0xdc7494af -//.word 0x5a12b2ae -//.word 0x940348f1 -//.word 0xf983f0ba -//.word 0x98febbe9 -//.word 0x9c80d115 -//.word 0x126d57db -//.word 0xf3729676 -//.word 0x5ebb5990 -//.word 0x25669658 -//.word 0x8b3851d5 -//.word 0x4c8fbe7a -//.word 0xde98a6fa -//.word 0xf7c20b5e -//.word 0x4f730f54 -//.word 0xa7f912ca -//.word 0x0ac31bbb -//.word 0x53d17949 -//.word 0xef69aa0d -//.word 0xe40c7bab -//.word 0x12a871a9 -//.word 0xb90f6881 -//.word 0x3ca87af4 -//.word 0x256422a2 -//.word 0x68f4a1d8 -//.word 0xec3aa1a9 -//.word 0x47fd8000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000390 -//// expected output -//.word 0x8025a860 -//.word 0x8df0f6a0 -//.word 0x1c34cdec -//.word 0x012d4cb2 -//.word 0x5852e1b1 -//.word 0x00b68172 -//.word 0xfc4e86ac -//.word 0x8b7126b6 -//.word 0x4859cb9e -//.word 0x767a7e59 -//.word 0x060989ce -//.word 0xdbd925af -//.word 0xc475ca73 -//.word 0x69bd43f8 -//.word 0x5ae590e2 -//.word 0x24e036dd -//// SHA512ShortMsgvector_116 -//// vector length -//.word 0x00000398 -//// input message -//.word 0xdc28484e -//.word 0xbfd293d6 -//.word 0x2ac759d5 -//.word 0x754bdf50 -//.word 0x2423e4d4 -//.word 0x19fa7902 -//.word 0x0805134b -//.word 0x2ce3dff7 -//.word 0x38c7556c -//.word 0x91d810ad -//.word 0xbad8dd21 -//.word 0x0f041296 -//.word 0xb73c2185 -//.word 0xd4646c97 -//.word 0xfc0a5b69 -//.word 0xed49ac8c -//.word 0x7ced0bd1 -//.word 0xcfd7e3c3 -//.word 0xcca47374 -//.word 0xd189247d -//.word 0xa6811a40 -//.word 0xb0ab0970 -//.word 0x67ed4ad4 -//.word 0x0ade2e47 -//.word 0x91e39204 -//.word 0xe398b320 -//.word 0x49714458 -//.word 0x22a1be0d -//.word 0xd93af880 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000398 -//// expected output -//.word 0x615115d2 -//.word 0xe8b62e34 -//.word 0x5adaa4bd -//.word 0xb95395a3 -//.word 0xb4fe27d7 -//.word 0x1c4a111b -//.word 0x86c18414 -//.word 0x63c5f03d -//.word 0x6b20d164 -//.word 0xa39948ab -//.word 0x08ae0607 -//.word 0x20d05c10 -//.word 0xf6022e5c -//.word 0x8caf2fa3 -//.word 0xbca2e04d -//.word 0x9c539ded -//// SHA512ShortMsgvector_117 -//// vector length -//.word 0x000003A0 -//// input message -//.word 0x5af8c0f2 -//.word 0x6db4e99b -//.word 0x47ec2e4a -//.word 0x01a786e7 -//.word 0x7899e46d -//.word 0x464ac337 -//.word 0xf175027b -//.word 0x61aef314 -//.word 0x9848af84 -//.word 0x9d76ac39 -//.word 0xb9b0910f -//.word 0xe6594817 -//.word 0x859e5597 -//.word 0x4fa16751 -//.word 0x8ed72d08 -//.word 0x8dae6b41 -//.word 0x4d744d47 -//.word 0x7974fb71 -//.word 0x9c626da7 -//.word 0x92f98123 -//.word 0x3de24b75 -//.word 0x79d8acca -//.word 0x510a266d -//.word 0x73c0ee8e -//.word 0xe1424343 -//.word 0xeaf6ffcc -//.word 0x59c86c1b -//.word 0xecce5894 -//.word 0x072c6c11 -//.word 0x80000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x000003A0 -//// expected output -//.word 0x09da284d -//.word 0x5b655650 -//.word 0x8be54c8a -//.word 0xb6c97bbd -//.word 0x472995c6 -//.word 0xbbd58591 -//.word 0x7ecdb54e -//.word 0xa9167208 -//.word 0xdaaa070a -//.word 0x7b2b7d8e -//.word 0x93ce1315 -//.word 0xf0d1ef8d -//.word 0x69667429 -//.word 0xc44dc5ee -//.word 0x1499de57 -//.word 0xb229a398 -//// SHA512ShortMsgvector_118 -//// vector length -//.word 0x000003A8 -//// input message -//.word 0x49cd0ba0 -//.word 0xdf5bb3f4 -//.word 0x3f68464e -//.word 0x3e83e9cb -//.word 0xd5d5ee07 -//.word 0x7ffa5591 -//.word 0xe30f939c -//.word 0xb30c93f7 -//.word 0xd454fb3f -//.word 0xbf8bb053 -//.word 0x27a89c08 -//.word 0xdc4baf1e -//.word 0xef502373 -//.word 0x17a40577 -//.word 0x5357f1e0 -//.word 0xd1f31d9f -//.word 0x0f0d9812 -//.word 0x4019d47b -//.word 0xf18363b1 -//.word 0xecfbfe15 -//.word 0x5c10cbc8 -//.word 0x3300e01b -//.word 0xc9ce0347 -//.word 0xc596b35f -//.word 0x411e6d82 -//.word 0x29ad2855 -//.word 0xe42022b0 -//.word 0x373ade98 -//.word 0x663c6d6e -//.word 0x9c800000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x000003A8 -//// expected output -//.word 0x30cbf067 -//.word 0x9a97c871 -//.word 0x574d2fc0 -//.word 0x5d7aa760 -//.word 0xc6bc8a86 -//.word 0x4b7d246c -//.word 0x39b9e812 -//.word 0xf9b7ff7b -//.word 0x4ef5197d -//.word 0xd5b69493 -//.word 0x306688b8 -//.word 0x564de1ad -//.word 0x47d75505 -//.word 0xc913ba6a -//.word 0x78788f8c -//.word 0xaf5788bd -//// SHA512ShortMsgvector_119 -//// vector length -//.word 0x000003B0 -//// input message -//.word 0xa8a37dfc -//.word 0x083ad2f4 -//.word 0x7fff4687 -//.word 0x38bf8b72 -//.word 0x8eb7f190 -//.word 0x7e427fa1 -//.word 0x5cb4424b -//.word 0xc685e55e -//.word 0xd7b2825c -//.word 0x9c60b839 -//.word 0xccc2fe5f -//.word 0xb33e36f5 -//.word 0x70cb8661 -//.word 0x609e630b -//.word 0xda05ee64 -//.word 0x1d938428 -//.word 0x867d90e0 -//.word 0x0744a4aa -//.word 0xd494c93c -//.word 0x5f6d1327 -//.word 0x87807859 -//.word 0x0cdce1e6 -//.word 0x47c98208 -//.word 0x18f46764 -//.word 0x1fcd508e -//.word 0x2f2ebfd0 -//.word 0xff3d4f27 -//.word 0x2393478f -//.word 0x3b9e6f80 -//.word 0x6b438000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x000003B0 -//// expected output -//.word 0x8e1c9172 -//.word 0x9be8eb40 -//.word 0x226f6c58 -//.word 0xa029380e -//.word 0xf7edb9dc -//.word 0x166a5c3c -//.word 0xdbcefe90 -//.word 0xbd30d85c -//.word 0xb7c4b248 -//.word 0xe66abf0a -//.word 0x3a4c8422 -//.word 0x81299bef -//.word 0x6db88858 -//.word 0xd9e5ab52 -//.word 0x44f70b79 -//.word 0x69e1c072 -//// SHA512ShortMsgvector_120 -//// vector length -//.word 0x000003B8 -//// input message -//.word 0x36af1759 -//.word 0x5494ef79 -//.word 0x3c42f484 -//.word 0x10246df0 -//.word 0x7d05936a -//.word 0x918afe74 -//.word 0xcd005e53 -//.word 0x7c586b28 -//.word 0x43701f5d -//.word 0xf8952242 -//.word 0xb74586f8 -//.word 0x3339b48f -//.word 0x4ba3a66b -//.word 0xdeb457ec -//.word 0xdf61784e -//.word 0xac6765cd -//.word 0x9b8c570d -//.word 0xd628dbba -//.word 0x6ae5836b -//.word 0x9ac3dbcd -//.word 0x795f9efd -//.word 0xb8742a35 -//.word 0xbca232ab -//.word 0xf36eb3b6 -//.word 0x698b2933 -//.word 0x96580227 -//.word 0x7ba953a6 -//.word 0xedcacaf3 -//.word 0x30c1e4e8 -//.word 0xc7d45f80 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x000003B8 -//// expected output -//.word 0x158bfc34 -//.word 0x8a30b4fa -//.word 0xbbe355a7 -//.word 0xd44bdc21 -//.word 0x22a4c850 -//.word 0x444c03f2 -//.word 0x89003ce0 -//.word 0x1bfc1ebf -//.word 0x3ecc0feb -//.word 0xb6a8ff52 -//.word 0x3d25db76 -//.word 0x81b05bdc -//.word 0xe048d119 -//.word 0x43ab476c -//.word 0x1967cf65 -//.word 0x56c4a120 -//// SHA512ShortMsgvector_121 -//// vector length -//.word 0x000003C0 -//// input message -//.word 0x42d66edc -//.word 0x5f22e0c1 -//.word 0x3c25504c -//.word 0x5101a5d1 -//.word 0x72d2db72 -//.word 0x09e461ef -//.word 0xa323c0bf -//.word 0xaed27e5f -//.word 0x808042ea -//.word 0x9c3838ea -//.word 0x31f9b76d -//.word 0xe465225c -//.word 0xcfbd0c09 -//.word 0xca0d9f07 -//.word 0xe9a43e3e -//.word 0x46c7693e -//.word 0x00a7e1d4 -//.word 0x83900ddb -//.word 0x0a629d55 -//.word 0x63456dbb -//.word 0xf299ac91 -//.word 0xf92c3d3c -//.word 0x17b05d18 -//.word 0x0e6c87c6 -//.word 0xc93194c3 -//.word 0x9d90273f -//.word 0xcf4a482c -//.word 0x56084f95 -//.word 0xe34c0431 -//.word 0x1fa80438 -//.word 0x80000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x000003C0 -//// expected output -//.word 0x061afb11 -//.word 0x9a3c6087 -//.word 0x6e04c10f -//.word 0x12ad0f4b -//.word 0x977593dc -//.word 0x5a2d2109 -//.word 0x6a57e7d3 -//.word 0xf7d4d44f -//.word 0xdef934b2 -//.word 0xc17d7530 -//.word 0x674e4f4a -//.word 0x1c176dbd -//.word 0xcc54811a -//.word 0x22e1b871 -//.word 0x2e4192fc -//.word 0x2d4bf8e8 -//// SHA512ShortMsgvector_122 -//// vector length -//.word 0x000003C8 -//// input message -//.word 0xf91bb2e1 -//.word 0xa9c4cd96 -//.word 0xbf250426 -//.word 0xb3a6afd9 -//.word 0xb87ac51e -//.word 0x93254d2d -//.word 0xae3b16ec -//.word 0x686ba80f -//.word 0xb0bd7a84 -//.word 0xd218660e -//.word 0x90075930 -//.word 0x75bc4f4c -//.word 0x66567f0c -//.word 0x7a5fd201 -//.word 0x0c999a8a -//.word 0x0efa81f8 -//.word 0x9ff5bfef -//.word 0xe0fb910f -//.word 0x0442e6d4 -//.word 0xa7c55bbb -//.word 0x618c69a7 -//.word 0x9a2ddd82 -//.word 0xa0938927 -//.word 0xf6fe3a80 -//.word 0xf04beaeb -//.word 0x7c7636e3 -//.word 0x435d12dc -//.word 0xf1c6bb6e -//.word 0xd0a4edb6 -//.word 0x9c9657fa -//.word 0x93800000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x000003C8 -//// expected output -//.word 0x6e692c8c -//.word 0x694ee0a3 -//.word 0x565f37a2 -//.word 0x99e0006b -//.word 0x85ab4a82 -//.word 0x1b20e767 -//.word 0x98220229 -//.word 0xf656efc6 -//.word 0xa20211a4 -//.word 0xe7e4ed77 -//.word 0xfacde0d7 -//.word 0x0e4d5d95 -//.word 0xbc8ed1d7 -//.word 0xa56d8df1 -//.word 0x446d562f -//.word 0x044b344c -//// SHA512ShortMsgvector_123 -//// vector length -//.word 0x000003D0 -//// input message -//.word 0xd1eb961c -//.word 0xa6a8f67c -//.word 0x49b61e4d -//.word 0x3ceaa2a1 -//.word 0xde6f0ea9 -//.word 0x27b132bf -//.word 0x987abdaa -//.word 0x725b0e1e -//.word 0x274e4683 -//.word 0x0e99a2f7 -//.word 0x5af60896 -//.word 0x4df0dff9 -//.word 0xa99024fc -//.word 0x6839bac5 -//.word 0xacd10202 -//.word 0xf921ac71 -//.word 0xa27fcda6 -//.word 0x81aa3109 -//.word 0xebf5f21e -//.word 0xe3a84909 -//.word 0x8ea3a551 -//.word 0xe844fae4 -//.word 0xb48b5c5b -//.word 0xb97ccc80 -//.word 0x2bc5520d -//.word 0x68a14cb7 -//.word 0xe5fc056b -//.word 0x67d889d8 -//.word 0x76efb82d -//.word 0x0e9a9a24 -//.word 0x99f18000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x000003D0 -//// expected output -//.word 0x39b2c76e -//.word 0xc207120d -//.word 0xe4b320c7 -//.word 0xfe069e60 -//.word 0x2c9c38f2 -//.word 0x57596da7 -//.word 0x369395e8 -//.word 0x7eb64b3a -//.word 0xcff988c1 -//.word 0x839ac269 -//.word 0xd5012c09 -//.word 0x3f9edd4b -//.word 0x7cabf13b -//.word 0xdea7d42e -//.word 0x969ab108 -//.word 0x269c6ab0 -//// SHA512ShortMsgvector_124 -//// vector length -//.word 0x000003D8 -//// input message -//.word 0xadf22632 -//.word 0x00f37688 -//.word 0x6ba7b6f5 -//.word 0xe4411d5f -//.word 0x07f7d9d1 -//.word 0x01590c73 -//.word 0xace114ba -//.word 0xfbcb0fdc -//.word 0x99269e87 -//.word 0xcd2cead2 -//.word 0xa1cfe574 -//.word 0x4394d333 -//.word 0xaba408a0 -//.word 0x7e21f302 -//.word 0x33b65b90 -//.word 0x7472e9e3 -//.word 0xc7d6e7aa -//.word 0x6d2c47a0 -//.word 0x8a1be7bb -//.word 0x877913a6 -//.word 0xb5604c72 -//.word 0x33844789 -//.word 0x11c339e3 -//.word 0xb5fe527c -//.word 0x7e288705 -//.word 0xa89c95d9 -//.word 0x70b44334 -//.word 0x7897e79f -//.word 0x6c522baf -//.word 0xe62b11ef -//.word 0x8f313580 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x000003D8 -//// expected output -//.word 0x3c23d2d8 -//.word 0xcf4db6ac -//.word 0x6a42e272 -//.word 0x08180f37 -//.word 0x668bef5e -//.word 0xe0a3f879 -//.word 0x483c8e60 -//.word 0x4e7f4258 -//.word 0x3f202037 -//.word 0xb8d242c0 -//.word 0x4a87345b -//.word 0x8be6dc8b -//.word 0x121d6484 -//.word 0xb9edad0d -//.word 0x73c894c1 -//.word 0x288f5cae -//// SHA512ShortMsgvector_125 -//// vector length -//.word 0x000003E0 -//// input message -//.word 0x18e75b47 -//.word 0xd898ac62 -//.word 0x9c48e80d -//.word 0xbfb75dae -//.word 0x1e1700b7 -//.word 0x71165ecc -//.word 0xdb18d628 -//.word 0xbfc4063d -//.word 0xd6c3839a -//.word 0x7ec4cd12 -//.word 0x55c4821b -//.word 0x078cd174 -//.word 0x647b320b -//.word 0xb685541d -//.word 0x517c579f -//.word 0x6b8e3cdd -//.word 0x2e109a61 -//.word 0x0c7a9216 -//.word 0x53b204ad -//.word 0x018d0340 -//.word 0xd9938735 -//.word 0xb6026266 -//.word 0x2016767e -//.word 0x1d8824a6 -//.word 0x49540862 -//.word 0x29c0e3b5 -//.word 0xbd9ad88c -//.word 0x54c1dc5a -//.word 0xa4e768ff -//.word 0x1a9470ee -//.word 0x6f6e998f -//.word 0x80000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x000003E0 -//// expected output -//.word 0x01c756b7 -//.word 0xc20b5f95 -//.word 0xfd2b079a -//.word 0xb6a50f28 -//.word 0xb946fb16 -//.word 0x266b07c6 -//.word 0x060945dc -//.word 0x4fe9e0d2 -//.word 0x79c5b150 -//.word 0x5b9ec7d8 -//.word 0xf8f3c9eb -//.word 0xf0c5ee93 -//.word 0x65aec08c -//.word 0xf278d65b -//.word 0x64daeccc -//.word 0x19d3cbf4 -//// SHA512ShortMsgvector_126 -//// vector length -//.word 0x000003E8 -//// input message -//.word 0xc2963342 -//.word 0xcfaa88cc -//.word 0xd102a258 -//.word 0xe6d629f6 -//.word 0xb0d367dd -//.word 0x55116502 -//.word 0xca4451ea -//.word 0x523623bc -//.word 0x4175819a -//.word 0x0648df31 -//.word 0x68e8ea8f -//.word 0x10ed2735 -//.word 0x4807d76e -//.word 0x02ee1fdf -//.word 0x1c9c655e -//.word 0xe2b9fd08 -//.word 0xd557058d -//.word 0xabdf8dcf -//.word 0x964bfcac -//.word 0xc996ae17 -//.word 0x3971e26e -//.word 0xa038d407 -//.word 0xc824260d -//.word 0x06c2848a -//.word 0x04a488c4 -//.word 0xc456dbcd -//.word 0xe2939e56 -//.word 0x1ab908c4 -//.word 0x097b5086 -//.word 0x38d6cda5 -//.word 0x56465c9c -//.word 0xc5800000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x000003E8 -//// expected output -//.word 0xa4d2f593 -//.word 0x93a5fea6 -//.word 0x12c3c745 -//.word 0xf4bb9f41 -//.word 0xaaf3a3ce -//.word 0x1679aa8a -//.word 0xfc1a62ba -//.word 0xa4ed4528 -//.word 0x19418c8a -//.word 0xe1a1e658 -//.word 0x75797669 -//.word 0x2390fc43 -//.word 0xd4decf7d -//.word 0x855cd8b4 -//.word 0x98b6dc60 -//.word 0xcae05a90 -//// SHA512ShortMsgvector_127 -//// vector length -//.word 0x000003F0 -//// input message -//.word 0x85360c3d -//.word 0x4257d987 -//.word 0x8e2f5c16 -//.word 0xd3cd7d07 -//.word 0x47df3d23 -//.word 0x1e1a8f63 -//.word 0xfddc69b3 -//.word 0xb1101af7 -//.word 0x2153de4c -//.word 0x8154b090 -//.word 0xc9815f24 -//.word 0x66e0e4f0 -//.word 0x2f3af3a8 -//.word 0x9a7fd04e -//.word 0x306664f9 -//.word 0x3e5490d4 -//.word 0xce7fc169 -//.word 0xd553c520 -//.word 0xae15dd02 -//.word 0xc7c613c3 -//.word 0x9b4acd00 -//.word 0xe0c9a3c5 -//.word 0x01566e52 -//.word 0xcecea11f -//.word 0x7303dd1d -//.word 0xa61abf3f -//.word 0x2532fd39 -//.word 0x6047b188 -//.word 0x7255f4b2 -//.word 0x56c0afcf -//.word 0x58f3ae48 -//.word 0xc9478000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x000003F0 -//// expected output -//.word 0xe8352ddc -//.word 0xac59e377 -//.word 0xea0f9c32 -//.word 0xbbb43dfd -//.word 0x1b6c829f -//.word 0xad195424 -//.word 0x0c41b7c4 -//.word 0x5b0b09db -//.word 0x11064b64 -//.word 0xe2442a96 -//.word 0xf6530aac -//.word 0x2c4abf3b -//.word 0xeb1eae77 -//.word 0xf2bce4ef -//.word 0xe88fee1a -//.word 0x70cf5423 -//// SHA512ShortMsgvector_128 -//// vector length -//.word 0x000003F8 -//// input message -//.word 0xc13e6ca3 -//.word 0xabb893aa -//.word 0x5f82c4a8 -//.word 0xef754460 -//.word 0x628af6b7 -//.word 0x5af02168 -//.word 0xf45b72f8 -//.word 0xf09e45ed -//.word 0x127c203b -//.word 0xc7bb80ff -//.word 0x0c7bd96f -//.word 0x8cc6d811 -//.word 0x0868eb2c -//.word 0xfc01037d -//.word 0x8058992a -//.word 0x6cf2effc -//.word 0xbfe498c8 -//.word 0x42e53a2e -//.word 0x68a79386 -//.word 0x7968ba18 -//.word 0xefc4a78b -//.word 0x21cdf6a1 -//.word 0x1e5de821 -//.word 0xdcabab14 -//.word 0x921ddb33 -//.word 0x625d48a1 -//.word 0x3baffad6 -//.word 0xfe8272db -//.word 0xdf4433bd -//.word 0x0f7b813c -//.word 0x981269c3 -//.word 0x88f00180 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x000003F8 -//// expected output -//.word 0x6e56f77f -//.word 0x6883d0bd -//.word 0x4face8b8 -//.word 0xd557f144 -//.word 0x661989f6 -//.word 0x6d51b1fe -//.word 0x4b8fc712 -//.word 0x4d66d9d2 -//.word 0x0218616f -//.word 0xea1bcf86 -//.word 0xc08d63bf -//.word 0x8f2f2184 -//.word 0x5a3e5190 -//.word 0x83b937e7 -//.word 0x0aa7c358 -//.word 0x310b5a7c -//// SHA512ShortMsgvector_129 -//// vector length -//.word 0x00000400 -//// input message -//.word 0xfd2203e4 -//.word 0x67574e83 -//.word 0x4ab07c90 -//.word 0x97ae1645 -//.word 0x32f24be1 -//.word 0xeb5d88f1 -//.word 0xaf7748ce -//.word 0xff0d2c67 -//.word 0xa21f4e40 -//.word 0x97f9d3bb -//.word 0x4e9fbf97 -//.word 0x186e0db6 -//.word 0xdb010023 -//.word 0x0a52b453 -//.word 0xd421f8ab -//.word 0x9c9a6043 -//.word 0xaa3295ea -//.word 0x20d2f06a -//.word 0x2f37470d -//.word 0x8a99075f -//.word 0x1b8a8336 -//.word 0xf6228cf0 -//.word 0x8b5942fc -//.word 0x1fb4299c -//.word 0x7d2480e8 -//.word 0xe82bce17 -//.word 0x5540bdfa -//.word 0xd7752bc9 -//.word 0x5b577f22 -//.word 0x9515394f -//.word 0x3ae5cec8 -//.word 0x70a4b2f8 -//.word 0x80000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000400 -//// expected output -//.word 0xa21b1077 -//.word 0xd52b27ac -//.word 0x545af63b -//.word 0x32746c6e -//.word 0x3c51cb0c -//.word 0xb9f281eb -//.word 0x9f3580a6 -//.word 0xd4996d5c -//.word 0x9917d2a6 -//.word 0xe484627a -//.word 0x9d5a06fa -//.word 0x1b25327a -//.word 0x9d710e02 -//.word 0x7387fc3e -//.word 0x07d7c4d1 -//.word 0x4c6086cc -//SHA512LongMsg: -//// SHA512LongMsgvector_1 -//// vector length -//.word 0x00000718 -//// input message -//.word 0x4f056009 -//.word 0x50664d51 -//.word 0x90a2ebc2 -//.word 0x9c9edb89 -//.word 0xc20079a4 -//.word 0xd3e6bc3b -//.word 0x27d75e34 -//.word 0xe2fa3d02 -//.word 0x768502bd -//.word 0x69790078 -//.word 0x598d5fcf -//.word 0x3d6779bf -//.word 0xed1284bb -//.word 0xe5ad72fb -//.word 0x45601518 -//.word 0x1d9587d6 -//.word 0xe864c940 -//.word 0x564eaafb -//.word 0x4f2fead4 -//.word 0x346ea09b -//.word 0x6877d934 -//.word 0x0f6b82eb -//.word 0x15158808 -//.word 0x72213da3 -//.word 0xad88feba -//.word 0x9f4f1381 -//.word 0x7a71d6f9 -//.word 0x0a1a17c4 -//.word 0x3a15c038 -//.word 0xd988b5b2 -//.word 0x9edffe2d -//.word 0x6a062813 -//.word 0xcedbe852 -//.word 0xcde302b3 -//.word 0xe33b6968 -//.word 0x46d2a8e3 -//.word 0x6bd680ef -//.word 0xcc6cd3f9 -//.word 0xe9a4c1ae -//.word 0x8cac10cc -//.word 0x5244d131 -//.word 0x67714039 -//.word 0x9176ed46 -//.word 0x700019a0 -//.word 0x04a16380 -//.word 0x6f7fa467 -//.word 0xfc4e17b4 -//.word 0x617bbd76 -//.word 0x41aaff7f -//.word 0xf56396ba -//.word 0x8c08a8be -//.word 0x100b33a2 -//.word 0x0b5daf13 -//.word 0x4a2aefa5 -//.word 0xe1c34967 -//.word 0x70dcf6ba -//.word 0xa4f7bb80 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000718 -//// expected output -//.word 0xa9db490c -//.word 0x708cc725 -//.word 0x48d78635 -//.word 0xaa7da79b -//.word 0xb253f945 -//.word 0xd710e5cb -//.word 0x677a474e -//.word 0xfc7c65a2 -//.word 0xaab45bc7 -//.word 0xca1113c8 -//.word 0xce0f3c32 -//.word 0xe1399de9 -//.word 0xc459535e -//.word 0x8816521a -//.word 0xb714b2a6 -//.word 0xcd200525 -//// SHA512LongMsgvector_2 -//// vector length -//.word 0x00000A30 -//// input message -//.word 0xd5e378ae -//.word 0x9fc2648f -//.word 0x4a13bbec -//.word 0x4b0935af -//.word 0xb4f822f5 -//.word 0xfe0d5063 -//.word 0x053d2fbd -//.word 0x547b33b4 -//.word 0xa32e7a00 -//.word 0x9ee2afaf -//.word 0xe83d2ebd -//.word 0x603568e4 -//.word 0xa38189b5 -//.word 0xd24d59e8 -//.word 0x953260f1 -//.word 0x5f654ed4 -//.word 0xf42f9a39 -//.word 0x299d68c3 -//.word 0xeb78b09e -//.word 0x83779d57 -//.word 0x18b433f1 -//.word 0x765d3535 -//.word 0x0eac4649 -//.word 0x3d194e84 -//.word 0xd1ce1f81 -//.word 0xc95b5972 -//.word 0x5cab8ab7 -//.word 0x3d369ab0 -//.word 0x1e7967cf -//.word 0x73a3acf1 -//.word 0x789227ee -//.word 0x75fdfb6e -//.word 0x40f353ff -//.word 0x04844865 -//.word 0x42be0531 -//.word 0x15db2896 -//.word 0xbab86c77 -//.word 0x4f8985c4 -//.word 0xdbcc4c07 -//.word 0x8f7b1c3a -//.word 0x4c867cdc -//.word 0x6580fe44 -//.word 0xa5986734 -//.word 0x94cc0fb1 -//.word 0xf6598b12 -//.word 0x95768a58 -//.word 0x4041fdbd -//.word 0x14fa7b90 -//.word 0xfa6fe33f -//.word 0x71b743b6 -//.word 0x8e23f8e7 -//.word 0x407217aa -//.word 0xd9440cc8 -//.word 0xcad28152 -//.word 0xaedb8238 -//.word 0x8be2de16 -//.word 0x5496d051 -//.word 0xb292de63 -//.word 0x03460273 -//.word 0xa4350829 -//.word 0x6b6237c0 -//.word 0x7804335d -//.word 0x2e81229f -//.word 0x7c9a0e77 -//.word 0x61e38a3a -//.word 0xaf7799f4 -//.word 0x0fe9cb00 -//.word 0x457ea9d5 -//.word 0xb5995323 -//.word 0x2676681f -//.word 0xc71b261a -//.word 0x6f8cd359 -//.word 0x293f5b21 -//.word 0xf0cf3a11 -//.word 0xb7f49cb5 -//.word 0xadb3c357 -//.word 0xbed2aa18 -//.word 0x5d8fe840 -//.word 0x8192d6d3 -//.word 0xed1ff465 -//.word 0xb590892e -//.word 0xfe038000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000A30 -//// expected output -//.word 0xa70c75b9 -//.word 0xb1f0ac2e -//.word 0xd2c27977 -//.word 0x63ac9a66 -//.word 0x01d95f46 -//.word 0x889b00fc -//.word 0x3ddae4d0 -//.word 0xac692375 -//.word 0x0a108d79 -//.word 0xeb764e77 -//.word 0xac07b7cb -//.word 0x5c01cb4b -//.word 0x3747dcf6 -//.word 0x9ba3b35c -//.word 0x51fb995d -//.word 0xa2632e70 -//// SHA512LongMsgvector_3 -//// vector length -//.word 0x00000D48 -//// input message -//.word 0x4f7a5618 -//.word 0x870945b8 -//.word 0x9f194e31 -//.word 0xb1aa802c -//.word 0x5350326d -//.word 0xc691df58 -//.word 0x708e34b4 -//.word 0x8ce666b0 -//.word 0x21d7c923 -//.word 0x30a69f18 -//.word 0x32412d8a -//.word 0xc224156c -//.word 0x9679dfed -//.word 0xb383d9f9 -//.word 0xe13c2103 -//.word 0x5d3d0002 -//.word 0xcfdf79b9 -//.word 0x7ba0223c -//.word 0xbbc833b0 -//.word 0xad4cdd52 -//.word 0x29f2ddbb -//.word 0xf6b65062 -//.word 0x3d6cc962 -//.word 0x3da8a17d -//.word 0x41db8e61 -//.word 0xcfbe772b -//.word 0x23f4872a -//.word 0xdceb81e5 -//.word 0xf403535f -//.word 0xf5f2ed99 -//.word 0x6a675359 -//.word 0x94edf12a -//.word 0x5f1230a4 -//.word 0x94c946ed -//.word 0x500e5280 -//.word 0xb5c8a82d -//.word 0xdff36961 -//.word 0x1afe58a8 -//.word 0x5272e870 -//.word 0xcbd59a10 -//.word 0x12ce8509 -//.word 0x338a368b -//.word 0x2c5dbb3b -//.word 0xa2adfb33 -//.word 0xd30c494a -//.word 0xcca43896 -//.word 0xdbd8b030 -//.word 0x48284137 -//.word 0x4055b818 -//.word 0x12c6f00c -//.word 0x9e2bebe2 -//.word 0x096021fe -//.word 0xb69418a2 -//.word 0x72aa356c -//.word 0xefdfd220 -//.word 0x74ae91a8 -//.word 0xd2f1ef59 -//.word 0x9a481c78 -//.word 0x8dbe0afd -//.word 0x54aac396 -//.word 0x72d401ef -//.word 0x76d9f831 -//.word 0x75d177c9 -//.word 0xb72e2f6a -//.word 0xb1e75255 -//.word 0x33d761d8 -//.word 0xe3603f14 -//.word 0xea538904 -//.word 0xed142abb -//.word 0x3ff929ed -//.word 0x55f4c6b1 -//.word 0x7a72c685 -//.word 0xc3820b93 -//.word 0x463a6733 -//.word 0x8756b2b0 -//.word 0x33231a4f -//.word 0x119cbb8d -//.word 0x35d270a9 -//.word 0x7791e862 -//.word 0x2340fc02 -//.word 0xf2093f9b -//.word 0x393ad791 -//.word 0x61eb8c58 -//.word 0x97e21f7f -//.word 0xc4b3ddee -//.word 0xc02b736c -//.word 0xc3ef0464 -//.word 0x1c6179e8 -//.word 0x25c319f6 -//.word 0x769f59fa -//.word 0x5966f595 -//.word 0x7e573f9d -//.word 0xf0a2b765 -//.word 0x48cedd3e -//.word 0x2158433d -//.word 0xcb9de63f -//.word 0x44f9be2b -//.word 0x63319477 -//.word 0x570e14ee -//.word 0x504b23b0 -//.word 0x7cb2737a -//.word 0x35815427 -//.word 0x7912cd77 -//.word 0x9abbeb10 -//.word 0x36f459c2 -//.word 0x6ab7310f -//.word 0x43800000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000D48 -//// expected output -//.word 0x713d5c26 -//.word 0xde17e144 -//.word 0x0a36aab9 -//.word 0x3f7cd811 -//.word 0x1cd62fd8 -//.word 0xbea5099b -//.word 0x2b6bf93e -//.word 0x470e1eae -//.word 0xab8b925c -//.word 0x646e9e67 -//.word 0xce01b03b -//.word 0x33d2b500 -//.word 0xb9400e59 -//.word 0xf0ecdfb0 -//.word 0x0dd7ddcd -//.word 0x230cc837 -//// SHA512LongMsgvector_4 -//// vector length -//.word 0x00001060 -//// input message -//.word 0x5e0e8441 -//.word 0x9c02ddda -//.word 0x289aa126 -//.word 0xbdb40a06 -//.word 0x0464aa58 -//.word 0xb88bad27 -//.word 0x08ab5f1e -//.word 0x3df9ee43 -//.word 0x9cb470e2 -//.word 0x8eb627c6 -//.word 0xfe4904af -//.word 0x033b6b01 -//.word 0xbf3536ba -//.word 0x8748fca6 -//.word 0x43c993d6 -//.word 0x185fd34e -//.word 0x455a9dfe -//.word 0x4b461cf4 -//.word 0x51c04bcf -//.word 0xc689b877 -//.word 0x48d9870b -//.word 0xc5f6b91b -//.word 0xe004af18 -//.word 0x961fe908 -//.word 0x21a7147e -//.word 0x1cdb44ca -//.word 0xe9aa7e6d -//.word 0x50c579d0 -//.word 0x68f9a535 -//.word 0xbbbc6ded -//.word 0xa506b9cb -//.word 0xfd62b8da -//.word 0xf744dc4b -//.word 0x499d26b1 -//.word 0x8dada371 -//.word 0xe7183773 -//.word 0xe73d991e -//.word 0xb1c39f84 -//.word 0x5b74bcd9 -//.word 0x964fc72a -//.word 0x91d8fd4b -//.word 0x1ab34a12 -//.word 0x0771c4c2 -//.word 0xd4aa78ca -//.word 0x8d4c6ab0 -//.word 0xee32d748 -//.word 0xcaf9bd29 -//.word 0xa90f9e61 -//.word 0xb50c8068 -//.word 0xd7463853 -//.word 0x1d9fe84a -//.word 0x5fa2c73c -//.word 0x22cf20d1 -//.word 0xbc329ea1 -//.word 0xb93bc6a3 -//.word 0x7ec9c5e8 -//.word 0x2c886c89 -//.word 0xc77d79de -//.word 0x98df18f0 -//.word 0xcf29a931 -//.word 0x6d6dc46b -//.word 0x61eb7af7 -//.word 0xf1e2de2f -//.word 0x5ca6c525 -//.word 0xbef3c996 -//.word 0x33819419 -//.word 0x3fd85b9c -//.word 0x6e66a811 -//.word 0x37cf5d65 -//.word 0x2684f6b2 -//.word 0x3b970eb5 -//.word 0x8dce2482 -//.word 0x32f6a076 -//.word 0x6379116e -//.word 0xdc33b936 -//.word 0x82824b45 -//.word 0x489cf3a7 -//.word 0x5326973a -//.word 0x5d025d1d -//.word 0x57686d66 -//.word 0x5238f813 -//.word 0x9f8e7944 -//.word 0x35973aa7 -//.word 0x54a41a33 -//.word 0x687d8f19 -//.word 0x30f8e7f7 -//.word 0x1fcad34f -//.word 0x039c2539 -//.word 0xe462d954 -//.word 0x2fe85202 -//.word 0x14ade7d5 -//.word 0x2cf59e44 -//.word 0x5f1a37a3 -//.word 0x05236d52 -//.word 0x4b977834 -//.word 0xd894d662 -//.word 0xb11b4b21 -//.word 0x5aae2712 -//.word 0x3f1dc7a9 -//.word 0x529d5ee0 -//.word 0xf41af62d -//.word 0x19ceb1b1 -//.word 0xa71355b2 -//.word 0x2075074b -//.word 0x810c5762 -//.word 0x6a097ddb -//.word 0x7e8ee20b -//.word 0x0dc3e370 -//.word 0xf126d19f -//.word 0xb5223c7d -//.word 0xfde471b2 -//.word 0x216a415b -//.word 0x1cdc04ff -//.word 0xa520dec5 -//.word 0x9ba941e4 -//.word 0xa68fb35a -//.word 0x1ce5d2e1 -//.word 0x2147951f -//.word 0x13b2d41d -//.word 0x25980bfa -//.word 0x49345be1 -//.word 0x541cd138 -//.word 0x5c15eb1a -//.word 0x652a5808 -//.word 0x3d0000db -//.word 0xa56444fd -//.word 0xb12687d9 -//.word 0x722aed90 -//.word 0xd2bc62ee -//.word 0xbe24df9c -//.word 0x8b7ae897 -//.word 0x80000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00001060 -//// expected output -//.word 0xd4a3b38f -//.word 0x18b048e6 -//.word 0x1686c215 -//.word 0x9c666469 -//.word 0xce9a9400 -//.word 0x632fd40a -//.word 0xc1d6ed33 -//.word 0x162b921b -//.word 0x95ac2623 -//.word 0x8af9fa00 -//.word 0xa4314a60 -//.word 0x46e1733f -//.word 0xd4fadc60 -//.word 0x33f3ac33 -//.word 0xd2b8c202 -//.word 0xafa5f02f -//// SHA512LongMsgvector_5 -//// vector length -//.word 0x00001378 -//// input message -//.word 0xf516561e -//.word 0xdc530bf7 -//.word 0xaa1a6330 -//.word 0x7d62812f -//.word 0xb560dd5d -//.word 0xa6629729 -//.word 0x8ffb0c4f -//.word 0xd060a85a -//.word 0x5712fb67 -//.word 0x5cbd0e2d -//.word 0x4e60f73a -//.word 0x0dafab7f -//.word 0x59b6140f -//.word 0x8bbe6324 -//.word 0x8274a863 -//.word 0xe1489f61 -//.word 0x7814cd65 -//.word 0xfffecc70 -//.word 0x0a9fe47a -//.word 0x3965dbff -//.word 0xaf350dba -//.word 0xc655bfb1 -//.word 0x018ab071 -//.word 0x437df19b -//.word 0x3e63f79f -//.word 0x2dddefc8 -//.word 0xc61d5179 -//.word 0x6a4bb8b6 -//.word 0xa027f1e5 -//.word 0xc1ef51d6 -//.word 0xf5834c02 -//.word 0x5dc74410 -//.word 0x92499f9e -//.word 0x4f241c3d -//.word 0x6a2467bd -//.word 0x092aebac -//.word 0x12d2e719 -//.word 0xe354c49d -//.word 0x44a8a69d -//.word 0x99ee41c9 -//.word 0x5d0ceee8 -//.word 0xcb99fdd8 -//.word 0xdefa4dd0 -//.word 0x7cca1be9 -//.word 0xee8018dd -//.word 0x944bbe0e -//.word 0xd741e3ca -//.word 0x5eb98fcd -//.word 0x85f50b07 -//.word 0x0b053aa0 -//.word 0x0ae72c3a -//.word 0x2df3f176 -//.word 0x1d77abb9 -//.word 0x3c9ee730 -//.word 0x96962e11 -//.word 0x15f1d624 -//.word 0xf44c1e83 -//.word 0x752f7b9e -//.word 0xd7352c81 -//.word 0x826d145a -//.word 0x86ffc935 -//.word 0x4313e90b -//.word 0x69eeadfb -//.word 0x245ec0d7 -//.word 0x905951e2 -//.word 0x73e167d8 -//.word 0x2b2a742f -//.word 0xe5ff2e9d -//.word 0x10629ada -//.word 0x127369a7 -//.word 0x3993880f -//.word 0xf4c8f3ed -//.word 0x4363caae -//.word 0x6ce1a658 -//.word 0xf0102dcb -//.word 0xbd73e448 -//.word 0xa5e6452f -//.word 0x0f85120d -//.word 0xeccbe8d5 -//.word 0xedf7176e -//.word 0xf3b4b16e -//.word 0xc8f8e126 -//.word 0x0c2d7ede -//.word 0x728fe061 -//.word 0x2cd5f3bd -//.word 0xa3138944 -//.word 0x6cdff5d6 -//.word 0x77b3d563 -//.word 0x8a922fab -//.word 0xeeeec048 -//.word 0x69ca90ef -//.word 0x6c1ccaf3 -//.word 0x8c75cb0a -//.word 0x36e37954 -//.word 0x9f17d699 -//.word 0xfbc3d5d3 -//.word 0xef466cec -//.word 0x488beac8 -//.word 0xed2e8b86 -//.word 0x12e14903 -//.word 0xaf0ff6a0 -//.word 0x31bf8846 -//.word 0x6fbab4a7 -//.word 0xdff0bec6 -//.word 0x0a188fb9 -//.word 0x3d9708ad -//.word 0x82a3962c -//.word 0xcea8069b -//.word 0x7cea9b07 -//.word 0xfa6d5e21 -//.word 0xc312b686 -//.word 0x8d023844 -//.word 0xc34fc09a -//.word 0x35d9c100 -//.word 0x0f6fd967 -//.word 0x0737a9c2 -//.word 0xdb50e3c5 -//.word 0xfbb5a4ed -//.word 0x826505c0 -//.word 0x6bc1ed56 -//.word 0x02352918 -//.word 0x981abec8 -//.word 0x7bdb7dc2 -//.word 0x2657d981 -//.word 0xb487f664 -//.word 0x9b6102b2 -//.word 0x96fcc8dd -//.word 0xe3f48203 -//.word 0xaf10efba -//.word 0xcf22a60d -//.word 0xb02faac2 -//.word 0x91d03edf -//.word 0xefd8fb6c -//.word 0x41371f79 -//.word 0xe61f2863 -//.word 0x5c65a254 -//.word 0xb2293d09 -//.word 0x40b922d8 -//.word 0x95b387f1 -//.word 0xb16a81e4 -//.word 0x758b1a63 -//.word 0x5701a449 -//.word 0x5a154ddc -//.word 0x3edaf34f -//.word 0xf3c8398c -//.word 0x54a7da30 -//.word 0x12af3dd6 -//.word 0xeeed4a98 -//.word 0x2ce87dd3 -//.word 0x4485382b -//.word 0xda285ecf -//.word 0xf01c1dfe -//.word 0x5b350bcb -//.word 0x73b3751d -//.word 0x0f6af3f9 -//.word 0xb1204080 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00001378 -//// expected output -//.word 0x1288010a -//.word 0x5092c66d -//.word 0xc8777168 -//.word 0x7ca62271 -//.word 0x39ce5dcb -//.word 0x48a79dbc -//.word 0xacb22bd3 -//.word 0x65f661fb -//.word 0x1229493c -//.word 0x662881b8 -//.word 0x6bf1eca2 -//.word 0x071095bd -//.word 0xe47c96b9 -//.word 0x92ee16d3 -//.word 0xe3277662 -//.word 0xcdbf960c -//// SHA512LongMsgvector_6 -//// vector length -//.word 0x00001690 -//// input message -//.word 0xbc4b7d3a -//.word 0x380be067 -//.word 0xed7a2a02 -//.word 0xf6137cf2 -//.word 0xaaa6f533 -//.word 0x2aa0dd34 -//.word 0x368d237e -//.word 0x45db0a97 -//.word 0xd4e11f26 -//.word 0xfe206e57 -//.word 0x4dc8f581 -//.word 0xd07e5907 -//.word 0x6d5cd87c -//.word 0x79397f0a -//.word 0x862b9d14 -//.word 0x7c4b771a -//.word 0xecb83ddd -//.word 0xa0df3dc4 -//.word 0x77f9577f -//.word 0x70d4b1ea -//.word 0x04d7ac34 -//.word 0xb9411640 -//.word 0xf4b1a14b -//.word 0x0eeb93d0 -//.word 0xabd9c0a8 -//.word 0x47d0b576 -//.word 0x12153742 -//.word 0xfea0ec64 -//.word 0x161f57a4 -//.word 0x113e0a9f -//.word 0x2726166d -//.word 0x2343c780 -//.word 0xba4b8ecf -//.word 0x1b7c3f34 -//.word 0xc7257c13 -//.word 0xa367713d -//.word 0x4b3dc314 -//.word 0xaabac2ef -//.word 0xc892e6c0 -//.word 0xe2dc79f4 -//.word 0xc016919a -//.word 0x436a41c8 -//.word 0x3e2f103a -//.word 0x86b3aa3d -//.word 0x4d38d6cb -//.word 0xab3ca8f8 -//.word 0x7efef88d -//.word 0x743d13f2 -//.word 0x6643af51 -//.word 0xe82225f8 -//.word 0x1e3edaff -//.word 0xd10bfe2b -//.word 0xc1187a13 -//.word 0x3d4d2381 -//.word 0xf271341b -//.word 0x01eefb43 -//.word 0x54d9d23b -//.word 0x312d518d -//.word 0x0f57c2aa -//.word 0xa9f8d5d1 -//.word 0x52e69632 -//.word 0x88749b54 -//.word 0xcbf382b4 -//.word 0xb0789baf -//.word 0x31e0e1a1 -//.word 0x47122f4f -//.word 0xbb84b082 -//.word 0x380198f5 -//.word 0xa6a91171 -//.word 0xb3397837 -//.word 0xb28cca9e -//.word 0xa96259fd -//.word 0xa561c4cb -//.word 0x51592505 -//.word 0xc7cc8cd0 -//.word 0xa6aead60 -//.word 0x6569d518 -//.word 0xe72423f3 -//.word 0x4f45f422 -//.word 0x15349ff7 -//.word 0x5a626301 -//.word 0x788b9d79 -//.word 0xde383edc -//.word 0x1b877dda -//.word 0x382ec96f -//.word 0x4bbe0250 -//.word 0x4925e888 -//.word 0x1c77d463 -//.word 0xf5eea68b -//.word 0xe42ffe71 -//.word 0xa6ceafee -//.word 0xbe15702b -//.word 0xc701d5be -//.word 0x088e7e15 -//.word 0x49348f18 -//.word 0xe5b25f0a -//.word 0x210a75b0 -//.word 0xbccdb0b6 -//.word 0xc798c54e -//.word 0xb7dfef1a -//.word 0xb9e9e14c -//.word 0x451c000c -//.word 0xf67bcf1a -//.word 0x996daab4 -//.word 0x84c0b8ba -//.word 0x29ed1b10 -//.word 0xea9e6944 -//.word 0x2f6d6070 -//.word 0xb6efd562 -//.word 0x2bf1eefb -//.word 0xf90191d5 -//.word 0x5f311c28 -//.word 0xc61757ef -//.word 0x5218a746 -//.word 0xb7e78417 -//.word 0x4e482cf5 -//.word 0x681a9948 -//.word 0xe294b1ab -//.word 0xf9cfbe92 -//.word 0x60841d30 -//.word 0x90183a98 -//.word 0x60d5bc22 -//.word 0xd57bfc10 -//.word 0x3bf7bc71 -//.word 0x74721646 -//.word 0x918db2e4 -//.word 0x9feb3c99 -//.word 0xc3f11592 -//.word 0x8ac949fc -//.word 0x7aadc26a -//.word 0xed62bb77 -//.word 0x1f0277ac -//.word 0x85ff32a4 -//.word 0x6065586d -//.word 0x935ff532 -//.word 0xb1fd6c17 -//.word 0x5b346d65 -//.word 0xc92721e7 -//.word 0xa6a4a794 -//.word 0x21f2c46d -//.word 0x41cad6a9 -//.word 0x78a30a10 -//.word 0x7c33cfa5 -//.word 0x52328b87 -//.word 0xab618c19 -//.word 0x74cb4161 -//.word 0xa94aaaae -//.word 0x6a4e0d7e -//.word 0x50daeb9e -//.word 0x01cf3293 -//.word 0x026db439 -//.word 0xcd17d8aa -//.word 0x24568f61 -//.word 0xa4218aa0 -//.word 0x9d5cab0e -//.word 0x219eb9a5 -//.word 0x5b3757cb -//.word 0x227237bf -//.word 0xce178b37 -//.word 0x4b34bc48 -//.word 0x6c1d5f85 -//.word 0x81b2656b -//.word 0x2be091fd -//.word 0x6f6b30ab -//.word 0x0aea0478 -//.word 0x0413815c -//.word 0x88383ce7 -//.word 0xf312a028 -//.word 0x2bbee2cd -//.word 0x3205388b -//.word 0xfbe046c1 -//.word 0x7c3bd958 -//.word 0x04fad8ed -//.word 0xcf3a7832 -//.word 0xd8d9ae91 -//.word 0xee38ea13 -//.word 0x0a3f0281 -//.word 0xe0a26cc9 -//.word 0xb463b1a2 -//.word 0x6f991e73 -//.word 0xf26f8000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00001690 -//// expected output -//.word 0x34b4cf4e -//.word 0xd7281ecb -//.word 0x07f381e9 -//.word 0xfc380507 -//.word 0x2238e21e -//.word 0xa0d1d2c5 -//.word 0xec0ad3b2 -//.word 0x3ea70024 -//.word 0x7b8e9535 -//.word 0xde9fac67 -//.word 0x83f95516 -//.word 0x6c4ca9a9 -//.word 0x0f4caa47 -//.word 0x056fa9f3 -//.word 0x13be75da -//.word 0xf27ec8d2 -//// SHA512LongMsgvector_7 -//// vector length -//.word 0x000019A8 -//// input message -//.word 0xedba7d63 -//.word 0x12144e90 -//.word 0xec9eaace -//.word 0x7576045a -//.word 0x46e553dc -//.word 0xb8ee5a98 -//.word 0x49272de8 -//.word 0x41c8f1ea -//.word 0x9502e376 -//.word 0x0b929c53 -//.word 0x9f9593aa -//.word 0x259ee3ba -//.word 0x31064ece -//.word 0x3483826c -//.word 0xe7fc9cd0 -//.word 0xed9ceb99 -//.word 0xb426f6c1 -//.word 0x9c88c0d2 -//.word 0x5bb24a57 -//.word 0xa0a85a91 -//.word 0xf6d67b6c -//.word 0xeba545b1 -//.word 0x724bde7d -//.word 0x87e7c1f2 -//.word 0x11cdbe2c -//.word 0x0c1e4277 -//.word 0xe79dd9bf -//.word 0x2bbdf148 -//.word 0x5effe19f -//.word 0x277a2ad0 -//.word 0xb3bbfcd9 -//.word 0x56d0fc5f -//.word 0x76a044a0 -//.word 0xa57eaba9 -//.word 0x0dfd47c8 -//.word 0x11053145 -//.word 0x3126884d -//.word 0x2e2db92f -//.word 0x6ff5fdcb -//.word 0xa4802346 -//.word 0xa9468f03 -//.word 0xadcd83cf -//.word 0x937a9d5c -//.word 0x98a7a1f1 -//.word 0x37f6795f -//.word 0x4ae47a37 -//.word 0x71a1e93a -//.word 0xb71fbe11 -//.word 0x7368a73f -//.word 0x6d365053 -//.word 0x42bde262 -//.word 0x0acccab4 -//.word 0x3714bbbe -//.word 0xc0c7f650 -//.word 0x8066c910 -//.word 0xd9d45527 -//.word 0x9cae953a -//.word 0x2ddf9c9c -//.word 0xe26e1ec2 -//.word 0xad9b32f7 -//.word 0xfb2b5650 -//.word 0xdb00b4e3 -//.word 0x63eca434 -//.word 0x4fc771f0 -//.word 0xecbf60de -//.word 0x35f0ee12 -//.word 0x3b355a64 -//.word 0xca3d6320 -//.word 0x49e153ff -//.word 0xe2b43c56 -//.word 0xe3dc828e -//.word 0x642199d4 -//.word 0x2b441011 -//.word 0xcc92cf1d -//.word 0x14b89d30 -//.word 0xa8d9e599 -//.word 0xeadeb9b2 -//.word 0x1c0e1713 -//.word 0xc8de6b06 -//.word 0x5f0a563b -//.word 0x20e4aebd -//.word 0x3becc625 -//.word 0x37a2ef0e -//.word 0x91983ec8 -//.word 0xa6cb9051 -//.word 0xd233cc80 -//.word 0xda996884 -//.word 0x87a92f8d -//.word 0x944841c9 -//.word 0xcb285b92 -//.word 0x6a9958e6 -//.word 0xcba2f817 -//.word 0x4450e1c3 -//.word 0x4d4ee307 -//.word 0xe0b680f0 -//.word 0x2627ac32 -//.word 0x4f18d11d -//.word 0xc16b16cc -//.word 0x7645e1a0 -//.word 0x9f1e9aed -//.word 0x8e14b3f2 -//.word 0xd285e50f -//.word 0xa4dcbc32 -//.word 0x82ab5593 -//.word 0x19fb67a1 -//.word 0x68e0803b -//.word 0x23509124 -//.word 0x5534adb1 -//.word 0x4ac00ec5 -//.word 0xac0059ff -//.word 0xecb42232 -//.word 0xe35eb316 -//.word 0xba99093d -//.word 0x07ac2048 -//.word 0x385f715a -//.word 0x350eb8cd -//.word 0x41fbfa24 -//.word 0x21e8c741 -//.word 0x81e6bdd9 -//.word 0x93684d24 -//.word 0xf99bc2d9 -//.word 0xe5fa7e59 -//.word 0x7f1d872a -//.word 0x87d143a8 -//.word 0x3b6e80f7 -//.word 0x7b65b73c -//.word 0x2b19920d -//.word 0xd9f0ab26 -//.word 0x9fa9975d -//.word 0x4bf023d8 -//.word 0xbe2fdd7d -//.word 0x92a8d7aa -//.word 0x00c1a726 -//.word 0x009eb258 -//.word 0xb1f5abb7 -//.word 0xfc1e5682 -//.word 0x746a92b1 -//.word 0x81b6962b -//.word 0xbe407b39 -//.word 0x9fb9fb3b -//.word 0x579b789a -//.word 0xf9bc3ffd -//.word 0xdd240fc0 -//.word 0x451bd5a2 -//.word 0x4087babd -//.word 0xcf755fbc -//.word 0x47f66748 -//.word 0xf62c37c3 -//.word 0x09a4f939 -//.word 0xade6e793 -//.word 0x754bc60e -//.word 0xfc0fb0ec -//.word 0xcba7176a -//.word 0x7d5507f1 -//.word 0x21f9ab90 -//.word 0xdf2a13aa -//.word 0xdf8534ec -//.word 0x66453182 -//.word 0x4215d98b -//.word 0x692270ca -//.word 0xdd73b29e -//.word 0xd27d1534 -//.word 0x13f24ffb -//.word 0xa2db1858 -//.word 0x9ee6319c -//.word 0x6a01a533 -//.word 0x0c274f1d -//.word 0xd37a9ca3 -//.word 0x3d939242 -//.word 0x171611ec -//.word 0xe6895970 -//.word 0x8666cd36 -//.word 0x116ef72f -//.word 0x0341cb0c -//.word 0x9b2c30ae -//.word 0x8442bcde -//.word 0xb4aebf3f -//.word 0x95478480 -//.word 0x6265d3d6 -//.word 0xd4f3baaa -//.word 0xffc68e8f -//.word 0x762d2c76 -//.word 0xb6ca8425 -//.word 0xc2a059e5 -//.word 0x0a6c427b -//.word 0x9139f55a -//.word 0x4f2fc417 -//.word 0xd5ac681d -//.word 0x2f96fea2 -//.word 0x0eef4fda -//.word 0x27a9546a -//.word 0xd6bcfa1f -//.word 0x077722e0 -//.word 0x5613ece1 -//.word 0x758e351a -//.word 0xceb75ef8 -//.word 0x6a854f52 -//.word 0x12acbc9e -//.word 0xb472a765 -//.word 0x08bf27f4 -//.word 0x72746755 -//.word 0x2bfef17d -//.word 0x9c2b2dc7 -//.word 0x0a3c24a1 -//.word 0x783b8a85 -//.word 0xc9800000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x000019A8 -//// expected output -//.word 0xffcb3b31 -//.word 0x3e576ea5 -//.word 0xb0a87449 -//.word 0x749b82c1 -//.word 0x523947ad -//.word 0x019c6334 -//.word 0x01a185fb -//.word 0xcb4fd475 -//.word 0xdfe42289 -//.word 0xc5413f44 -//.word 0x0d083f73 -//.word 0xb65abcf2 -//.word 0x386e0eff -//.word 0x39acfafa -//.word 0x398a3d6b -//.word 0x778fde23 -//// SHA512LongMsgvector_8 -//// vector length -//.word 0x00001CC0 -//// input message -//.word 0x89eb3056 -//.word 0x770a6157 -//.word 0xf06921bc -//.word 0x15383444 -//.word 0x7c4b6d86 -//.word 0x2d10d185 -//.word 0xf1c3f984 -//.word 0xcde5b81c -//.word 0xc9eafe8b -//.word 0xf532fc4f -//.word 0xae3a89f4 -//.word 0x1e14c52a -//.word 0x0214fc1a -//.word 0xb0cdcdfa -//.word 0x583b8bdf -//.word 0x8a42e3d3 -//.word 0xf857bf28 -//.word 0x7e7e6b0c -//.word 0x5f74f65d -//.word 0xd22ddcbe -//.word 0xbd81e1ea -//.word 0xc0224048 -//.word 0x75d105c0 -//.word 0xf6d1b8ce -//.word 0xa09c3bd4 -//.word 0x17d6f5b5 -//.word 0x8a7f319f -//.word 0x396cc028 -//.word 0x34f8e69d -//.word 0x65f77496 -//.word 0xd0eb31ce -//.word 0x1a7b7e32 -//.word 0x48203a38 -//.word 0xca22e472 -//.word 0xb8c3ff63 -//.word 0x5bb9bb91 -//.word 0xefe2d1db -//.word 0xa734af0d -//.word 0xf2f3d5b2 -//.word 0xfd267f2a -//.word 0x794b84fc -//.word 0x9e4a7e6d -//.word 0x70a82b51 -//.word 0x41fd1321 -//.word 0x77a86b4e -//.word 0x8fc13ad5 -//.word 0x624fba14 -//.word 0xa7bb01db -//.word 0xba85e0c7 -//.word 0x9c360ccb -//.word 0x3a967b10 -//.word 0xf21e11ff -//.word 0x53b07c9c -//.word 0x24865d15 -//.word 0xa869a89a -//.word 0x21234d70 -//.word 0x93361841 -//.word 0xcaced5b7 -//.word 0x9ef5b949 -//.word 0x7606fd54 -//.word 0x0b64cc6d -//.word 0x6f6b5ff6 -//.word 0x4da767ef -//.word 0x7244ab0f -//.word 0x8cc6f213 -//.word 0x32fb2357 -//.word 0x252daba3 -//.word 0xd69b1f47 -//.word 0x282b226a -//.word 0x76598a9f -//.word 0xd873beb9 -//.word 0xa20862e1 -//.word 0x2e9e37e5 -//.word 0xdca33cd3 -//.word 0x56a61ac7 -//.word 0x19c7be01 -//.word 0x316c483a -//.word 0x43362438 -//.word 0xd13476a1 -//.word 0xba56bc0d -//.word 0x0024af5e -//.word 0xceaf6954 -//.word 0xbac8cd5c -//.word 0x477124a9 -//.word 0xae910486 -//.word 0xdeec76eb -//.word 0xc151574e -//.word 0xc115ffbb -//.word 0x8bc12127 -//.word 0x1208f202 -//.word 0xd7fc8e0b -//.word 0x69819768 -//.word 0x27011ff6 -//.word 0x4d61c8de -//.word 0x2f342969 -//.word 0xbf2f7415 -//.word 0x55dd56e8 -//.word 0xb0941f04 -//.word 0x38a8237c -//.word 0x85de6066 -//.word 0x25246131 -//.word 0x9a7f6239 -//.word 0xa344b499 -//.word 0xbd8b6340 -//.word 0xe8e11748 -//.word 0xae3d3883 -//.word 0x62365556 -//.word 0xa672c7ca -//.word 0x2f6291e0 -//.word 0xcd2c8b25 -//.word 0xa5e9c087 -//.word 0xc1111467 -//.word 0xcc332aef -//.word 0x16ea84a6 -//.word 0xdf0cec41 -//.word 0xd12413bd -//.word 0xce2379aa -//.word 0xec528cca -//.word 0xbe8b14da -//.word 0xd6a9ceb0 -//.word 0x873d5786 -//.word 0xf0834c96 -//.word 0x3594b0e7 -//.word 0x10dc8e66 -//.word 0x89cfdf38 -//.word 0x01d8ad4f -//.word 0x7592793b -//.word 0x013bdb43 -//.word 0xa36668b5 -//.word 0x42efd87a -//.word 0xef3469ed -//.word 0x6a827eee -//.word 0xe8ce8c31 -//.word 0x13a636dc -//.word 0x5367b752 -//.word 0x4caf8149 -//.word 0xa8152323 -//.word 0x1618707b -//.word 0x9256defe -//.word 0xe8ff2c7c -//.word 0x7388483e -//.word 0x2ba46f9b -//.word 0xdf7096c6 -//.word 0xbeed09ea -//.word 0x1cb45279 -//.word 0x73e55cc1 -//.word 0xa861d8c0 -//.word 0x9039e039 -//.word 0xb366da07 -//.word 0x50baa0b2 -//.word 0xa116de40 -//.word 0x5fdebb4d -//.word 0x89aabb5e -//.word 0x623ee373 -//.word 0xb9bd1fdb -//.word 0x6c19e24c -//.word 0x2fce0c33 -//.word 0x8ad01049 -//.word 0x21c15667 -//.word 0x3868de9b -//.word 0x765f277b -//.word 0xe90b4fb9 -//.word 0x4bd17bf8 -//.word 0x848779de -//.word 0x6f29a46b -//.word 0xe1ce0889 -//.word 0xe8dac7e4 -//.word 0x5074bcfb -//.word 0x6c3b5d78 -//.word 0x1334e6bc -//.word 0xe807b4bf -//.word 0xde6cee17 -//.word 0xfce06b56 -//.word 0x5e9cd099 -//.word 0x7dc7f95e -//.word 0xb0eb9b96 -//.word 0xf2a627fc -//.word 0xe5a2f1a4 -//.word 0x17c691d7 -//.word 0x84ae891e -//.word 0x5d59299d -//.word 0x0822b0a2 -//.word 0x68f2b47e -//.word 0x5eb3c494 -//.word 0x90084baf -//.word 0x693bb799 -//.word 0x6177dbe9 -//.word 0x7e37921c -//.word 0x1afea6e7 -//.word 0xe849f0cc -//.word 0x32c1c0ec -//.word 0x64b67f1c -//.word 0xcec9923a -//.word 0xa6e882c2 -//.word 0x4c805a9c -//.word 0xd2ed5138 -//.word 0xbc36a9dd -//.word 0x04f7d73e -//.word 0x629ee44f -//.word 0xcada1356 -//.word 0x3551c445 -//.word 0xa4929847 -//.word 0x624ad699 -//.word 0x8aba0e9b -//.word 0xca68fc27 -//.word 0x6615ae21 -//.word 0x80f0e94f -//.word 0x9609ca6b -//.word 0x4c08a977 -//.word 0x6c1f4251 -//.word 0x2b3d1787 -//.word 0xae85106c -//.word 0xccfe656c -//.word 0x168cbd9c -//.word 0x141f9895 -//.word 0xd22aea83 -//.word 0x9b570879 -//.word 0x0579c808 -//.word 0x2ec1e40f -//.word 0x4436a0d4 -//.word 0x4b5fad54 -//.word 0x1a424cd8 -//.word 0xa793b7c9 -//.word 0x8525bcc5 -//.word 0xaba4abf2 -//.word 0x77867293 -//.word 0xf33f07d9 -//.word 0x56b406fb -//.word 0xcef39c89 -//.word 0x7c21a3fd -//.word 0x80000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00001CC0 -//// expected output -//.word 0x6b8be942 -//.word 0xecd6e850 -//.word 0x9b88c0eb -//.word 0xed80e0e2 -//.word 0x193eccf2 -//.word 0x12430429 -//.word 0xe7d3d097 -//.word 0x285726e8 -//.word 0x5e0d1d22 -//.word 0xd046cfbf -//.word 0x37f80f92 -//.word 0x2e36bb1c -//.word 0x3b9e9d43 -//.word 0xcbbc477d -//.word 0xc80eefc7 -//.word 0x83adc20b -//// SHA512LongMsgvector_9 -//// vector length -//.word 0x00001FD8 -//// input message -//.word 0xafdccc84 -//.word 0xf257cb76 -//.word 0x8b7ad735 -//.word 0xedbd1990 -//.word 0xb6114bad -//.word 0x876928ab -//.word 0x12792085 -//.word 0x74bd513a -//.word 0xc6beb32b -//.word 0xee9192c4 -//.word 0xbba0425e -//.word 0x32ad0e64 -//.word 0x221371b5 -//.word 0xff4f894a -//.word 0xecc0c819 -//.word 0x1aabed39 -//.word 0x51823246 -//.word 0xcc66c707 -//.word 0x4aea804e -//.word 0x621acb20 -//.word 0x17bce416 -//.word 0xacd54c03 -//.word 0xba6f77d7 -//.word 0x7f9ac4c4 -//.word 0x79b1b39f -//.word 0x33de5388 -//.word 0x60e0f9cd -//.word 0x260c370c -//.word 0xbc920c98 -//.word 0x3702591e -//.word 0xa10f9489 -//.word 0x4c92c022 -//.word 0x65d29dfc -//.word 0xcc021c8f -//.word 0x230b15a3 -//.word 0x268c3c70 -//.word 0x3a1f5203 -//.word 0x48df98e3 -//.word 0xcb2789f5 -//.word 0x289cc89d -//.word 0x3f6d5826 -//.word 0x3fd90b64 -//.word 0xbef23d97 -//.word 0x09a1c193 -//.word 0xb8eb1c1e -//.word 0x8672f19a -//.word 0x603fbde4 -//.word 0xbcbec57b -//.word 0x2c0a4ce5 -//.word 0x336b084e -//.word 0x571ed773 -//.word 0x7754afbe -//.word 0x5f7cd3b2 -//.word 0x9ac54d8a -//.word 0x87df981d -//.word 0xb0029d05 -//.word 0x5632e100 -//.word 0x51c1fc96 -//.word 0x17154dfd -//.word 0x1aacec39 -//.word 0x575ce087 -//.word 0x2be092fc -//.word 0x6990826a -//.word 0xab703983 -//.word 0xe56c7f41 -//.word 0x40e2cd85 -//.word 0x256105fe -//.word 0x97b1614c -//.word 0xc713a965 -//.word 0xe2c9aa38 -//.word 0x2ed9e391 -//.word 0x550f813d -//.word 0x01418e6e -//.word 0xa8d66561 -//.word 0xaa89693d -//.word 0x996bf63f -//.word 0xd7279814 -//.word 0x678a7b86 -//.word 0xfd43235b -//.word 0x57e75d7a -//.word 0xd0387650 -//.word 0x33a6aa72 -//.word 0xcd16df84 -//.word 0xc6e39459 -//.word 0xb122145b -//.word 0x612bef2e -//.word 0xfe55aa90 -//.word 0x5900b684 -//.word 0x7dd99faf -//.word 0x87598602 -//.word 0xb78fd199 -//.word 0xc62021e3 -//.word 0x7a8c8404 -//.word 0x79b2ed77 -//.word 0x5b97e1f8 -//.word 0x026372a1 -//.word 0x2eac7153 -//.word 0x4cf7e057 -//.word 0x8f7ca645 -//.word 0x422a8625 -//.word 0x5deb52d5 -//.word 0x56295cab -//.word 0x39912e5a -//.word 0xfb177b1a -//.word 0x0c3a5503 -//.word 0x2b899fba -//.word 0x7e66c650 -//.word 0xe20aac67 -//.word 0x80c9e597 -//.word 0xa1972610 -//.word 0xc3ccfa80 -//.word 0xeb24b737 -//.word 0x3e0ab189 -//.word 0xcb16ad73 -//.word 0xacd49982 -//.word 0x4dc77af1 -//.word 0x0bada511 -//.word 0x010532ee -//.word 0x1ecfae30 -//.word 0x7b93103f -//.word 0xeca4eeab -//.word 0xd6a6f1ca -//.word 0x404e87a3 -//.word 0x2c69d70a -//.word 0x2720fa0d -//.word 0x1f7a688f -//.word 0x7522b033 -//.word 0x536b6d7c -//.word 0x40917532 -//.word 0xf1425307 -//.word 0x625cf87a -//.word 0x26f9adfc -//.word 0xfca94c51 -//.word 0xa2feb03a -//.word 0xee4e6a51 -//.word 0x1ab4b534 -//.word 0x6058ade5 -//.word 0xc6f0bb71 -//.word 0x3c8754d0 -//.word 0xe47de30d -//.word 0xb1d003a7 -//.word 0x3399f236 -//.word 0xb1da4251 -//.word 0x7976d2b0 -//.word 0x7481fd8e -//.word 0xfdba1151 -//.word 0xf356036d -//.word 0x0d006186 -//.word 0x6e1d87d5 -//.word 0x7a5416cc -//.word 0xe74ea2fd -//.word 0x17baab38 -//.word 0xa595cff3 -//.word 0x3ea83def -//.word 0xb2526d19 -//.word 0x4a870faf -//.word 0x5d1941a3 -//.word 0x1e360444 -//.word 0xb833f11b -//.word 0x9d872813 -//.word 0x1a1b8ade -//.word 0x30c12893 -//.word 0x9f01fa9c -//.word 0x431cd5cf -//.word 0xa34b97db -//.word 0xc848a5e6 -//.word 0x4b0f9774 -//.word 0xb2e6318b -//.word 0xfd9b9515 -//.word 0x7b0db885 -//.word 0xe2ed13bd -//.word 0x9fc69b2f -//.word 0x6b3bf243 -//.word 0x1f91dff9 -//.word 0xc96dfcd0 -//.word 0xffdeaee6 -//.word 0x739d5a60 -//.word 0xc894d60c -//.word 0xa49e1e45 -//.word 0x078e4918 -//.word 0xdb72bba5 -//.word 0xcc199bc7 -//.word 0x59d288f7 -//.word 0x2b77876d -//.word 0xa6aa4089 -//.word 0xbf5f6b72 -//.word 0x0d9b85fd -//.word 0x227ac7d0 -//.word 0x1b7758c7 -//.word 0x76e8c296 -//.word 0x24c8a3b0 -//.word 0xdfb9a568 -//.word 0xbe49af56 -//.word 0x07755dfd -//.word 0x446caeaa -//.word 0x9995fd9f -//.word 0x54d23371 -//.word 0xc6073aaf -//.word 0x52d6b5c4 -//.word 0xc3adee1f -//.word 0xe2030f91 -//.word 0x49de96f6 -//.word 0x72990317 -//.word 0x13e4d3cf -//.word 0xae0cb26d -//.word 0x637ded5a -//.word 0x0a8526fc -//.word 0x7e5a4bd9 -//.word 0x3b5fc900 -//.word 0x2ca3fca5 -//.word 0xbeaaea0b -//.word 0x397132a7 -//.word 0x50ac3f82 -//.word 0xf752c1df -//.word 0x745b5e1e -//.word 0xb9c9a4e0 -//.word 0xf1e5436c -//.word 0x59cb7951 -//.word 0x5128cd4d -//.word 0xb343006e -//.word 0x633a4177 -//.word 0x278ea085 -//.word 0xb9e2c5f2 -//.word 0x1b00e27a -//.word 0x2b1de69c -//.word 0x775ef443 -//.word 0x529b13a6 -//.word 0x2862276d -//.word 0x0e3f2015 -//.word 0x9d3a7195 -//.word 0x01a2c342 -//.word 0x4d09ebf0 -//.word 0x11901a5a -//.word 0x2f6554c4 -//.word 0xea8924de -//.word 0x40d78dec -//.word 0x7a424324 -//.word 0x015e1c57 -//.word 0x7322c1d4 -//.word 0xf6eca98a -//.word 0xcdc5486c -//.word 0x29e6831a -//.word 0x417c68bd -//.word 0xa4a91c32 -//.word 0xcecb146c -//.word 0xfa008813 -//.word 0x38ea2571 -//.word 0xbfaf038f -//.word 0x8444d69b -//.word 0x0cec688d -//.word 0x7efb470b -//.word 0xfce0ba89 -//.word 0x3362fab4 -//.word 0x312a9f11 -//.word 0x77825980 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00001FD8 -//// expected output -//.word 0x014fd2fa -//.word 0x6b05c4fc -//.word 0xa1a5c075 -//.word 0x3f15c940 -//.word 0xb5f976b4 -//.word 0x1a40bf6b -//.word 0xb14afe83 -//.word 0x9d83a467 -//.word 0x61739407 -//.word 0x17bb7e74 -//.word 0x6a2ac77f -//.word 0x573e6744 -//.word 0xcf0002b7 -//.word 0x8b5b7f66 -//.word 0x4e22434e -//.word 0x22d0ccd0 -//// SHA512LongMsgvector_10 -//// vector length -//.word 0x000022F0 -//// input message -//.word 0x7a26b7f5 -//.word 0x5809d585 -//.word 0x28540601 -//.word 0xc87db4bb -//.word 0x8e908c3d -//.word 0x2d82823a -//.word 0xddc315c4 -//.word 0xb612d4be -//.word 0x5d952195 -//.word 0xe329352b -//.word 0xeaf76414 -//.word 0x0a48a205 -//.word 0x739a4789 -//.word 0xd3f20ff6 -//.word 0x7a7565a0 -//.word 0xbc32e14c -//.word 0x96430fe8 -//.word 0x95147279 -//.word 0xf402c854 -//.word 0x04289091 -//.word 0xd175cabd -//.word 0x0302fecf -//.word 0x02a37f5d -//.word 0x5ebdf110 -//.word 0x6d570956 -//.word 0x36739456 -//.word 0x8d9ebb29 -//.word 0x80c68547 -//.word 0xf24c9d3f -//.word 0x865a56ac -//.word 0xbf77ec64 -//.word 0x65580df2 -//.word 0x2af99747 -//.word 0x8deda4ac -//.word 0xfff3c4fb -//.word 0x44c9890f -//.word 0x1d454979 -//.word 0x24a11f74 -//.word 0xf717331c -//.word 0x98ad3bda -//.word 0x14534223 -//.word 0x632ba862 -//.word 0x90286b32 -//.word 0x1adaa4d1 -//.word 0x998855d1 -//.word 0xa4806111 -//.word 0xf3abdcec -//.word 0xc16485b0 -//.word 0x748a9152 -//.word 0x80d4ab60 -//.word 0x89653836 -//.word 0xc8a1df75 -//.word 0xaf3e49b1 -//.word 0xd09e256a -//.word 0xfb5c703e -//.word 0xa625f35c -//.word 0x92c90d3c -//.word 0xac91b28e -//.word 0x32d4b470 -//.word 0x16c541e3 -//.word 0xa78fae80 -//.word 0x6ea47267 -//.word 0x56517679 -//.word 0x11978cc7 -//.word 0xb6363c49 -//.word 0xaf0ac7d4 -//.word 0xd29a6646 -//.word 0xceefd304 -//.word 0xc9a20aa6 -//.word 0x473951f0 -//.word 0x4eb47604 -//.word 0xc86258d7 -//.word 0x28f9a8e2 -//.word 0x50e6f11a -//.word 0xb2e2d621 -//.word 0xb6c69cbe -//.word 0x5ca0e88b -//.word 0x2306c9ed -//.word 0x29aaf849 -//.word 0x932f5f75 -//.word 0x2f3bd96d -//.word 0x58ce3948 -//.word 0x1bd28d6a -//.word 0x98f3a4fa -//.word 0xaab0cd97 -//.word 0xcab2e246 -//.word 0x305d85af -//.word 0x3ca6aa8a -//.word 0x15245654 -//.word 0x9069a546 -//.word 0x53921287 -//.word 0x3a1df3a1 -//.word 0xf9fb4332 -//.word 0x03e6a4e4 -//.word 0xabf5a49e -//.word 0x896e40fc -//.word 0x20dba7fd -//.word 0xbd6040fc -//.word 0xa24bede2 -//.word 0x64ed9299 -//.word 0x92a9d1c4 -//.word 0x974a18ad -//.word 0xe299de7e -//.word 0x443029b5 -//.word 0x998954d2 -//.word 0xaa5a0f52 -//.word 0x5225a7e1 -//.word 0xe00a88cc -//.word 0xbde100b5 -//.word 0x4f85458a -//.word 0x1c72bab8 -//.word 0x33936e9b -//.word 0xc855e539 -//.word 0x1e001c31 -//.word 0xaa47c7ee -//.word 0x751edd20 -//.word 0xc2cb566d -//.word 0xf1403463 -//.word 0xa3a8c0b2 -//.word 0x1f401698 -//.word 0xf468e39c -//.word 0xe0fa6e7f -//.word 0xf1dad570 -//.word 0xeace997f -//.word 0xe8905d54 -//.word 0x4522eb21 -//.word 0xbd6278d5 -//.word 0xcfde2993 -//.word 0x66e9d662 -//.word 0xb9ef0d26 -//.word 0x70055acf -//.word 0x08c4c5d0 -//.word 0x78589dd2 -//.word 0x15d474aa -//.word 0xb3c86b89 -//.word 0x0d16b073 -//.word 0x670144f3 -//.word 0x7187020c -//.word 0x6ff1dd72 -//.word 0x97a869fb -//.word 0xba4a9d50 -//.word 0x27fdd7e8 -//.word 0xcd042037 -//.word 0x9f90b122 -//.word 0x3dd8b7b7 -//.word 0xd06b541b -//.word 0x35c5e6c3 -//.word 0x5f218be7 -//.word 0xf68fe534 -//.word 0x44461ac2 -//.word 0x523b1f45 -//.word 0x4ef33787 -//.word 0x3095b616 -//.word 0x9e430b39 -//.word 0x0caafd29 -//.word 0x27d8357e -//.word 0x744efde8 -//.word 0x3457471f -//.word 0x8c98f11d -//.word 0xe2e7478a -//.word 0x8a61ca78 -//.word 0xa2b63050 -//.word 0x3ac8ab0c -//.word 0xb9756ea7 -//.word 0x7bb06ed2 -//.word 0xbfd765e9 -//.word 0xc1401d25 -//.word 0x2316eb13 -//.word 0x91637945 -//.word 0xa56dc947 -//.word 0x084677d4 -//.word 0xdb9f3f4a -//.word 0x55ddbe5c -//.word 0xad6f7d07 -//.word 0x3a5e2bc7 -//.word 0xd9252a0a -//.word 0x8fc44ee5 -//.word 0x6f10e106 -//.word 0xbe4deaea -//.word 0x56feae50 -//.word 0x48fc78ed -//.word 0xc5c69661 -//.word 0x3f18a46a -//.word 0xcbbf0d57 -//.word 0xcaabcec0 -//.word 0xc8467d75 -//.word 0xa4048ab4 -//.word 0xf13bc69f -//.word 0x9d3621ec -//.word 0xd085b8df -//.word 0x17960f75 -//.word 0xc28a9ae3 -//.word 0x8b41833e -//.word 0x78b7a77c -//.word 0x0294e29b -//.word 0x76fe8c20 -//.word 0x9cb243c3 -//.word 0x9753eb69 -//.word 0x0c01f452 -//.word 0x862edb94 -//.word 0x19adf4c8 -//.word 0x460c6603 -//.word 0x1f247708 -//.word 0xabee0abb -//.word 0x8c9965d9 -//.word 0xdfd938e7 -//.word 0x6481db68 -//.word 0xdf54d853 -//.word 0xbe18a9c4 -//.word 0xfbedc3f2 -//.word 0x44ddd361 -//.word 0x5ab44759 -//.word 0xb7121096 -//.word 0x73bea641 -//.word 0x683d4d1f -//.word 0x95a49809 -//.word 0xc0aa2b9c -//.word 0x5f01c431 -//.word 0xb9e77d0f -//.word 0x49f84be0 -//.word 0x6346cb62 -//.word 0x1aab3e5f -//.word 0x605ed1df -//.word 0x6fc5239c -//.word 0x688a01b6 -//.word 0x3af174a8 -//.word 0xc669fd7b -//.word 0x41611f3a -//.word 0xd95c1ea5 -//.word 0x9b480729 -//.word 0x940bf010 -//.word 0x366081f6 -//.word 0xfee1b37c -//.word 0x5464d840 -//.word 0xb38bdc0c -//.word 0x0997ca4d -//.word 0x617d91c7 -//.word 0xbf3c0988 -//.word 0x4b6d311a -//.word 0xb21cbbfd -//.word 0xcad6ca54 -//.word 0x7503fadf -//.word 0xc777a129 -//.word 0x6b435403 -//.word 0x42d1ad30 -//.word 0x4e304c62 -//.word 0xcfac1c66 -//.word 0xaba2d79b -//.word 0x1392cda8 -//.word 0x6476e16e -//.word 0x4b52d43c -//.word 0x2d0dc642 -//.word 0xc67ff949 -//.word 0x10cbd9a1 -//.word 0x66ef395a -//.word 0xe999e0b7 -//.word 0x233d44df -//.word 0xea6495d6 -//.word 0x8747fdac -//.word 0x189c27f4 -//.word 0x33b0fe78 -//.word 0xccb6b72b -//.word 0x595e115f -//.word 0x33aadb38 -//.word 0x40feb761 -//.word 0xcf761ffd -//.word 0xc37ba5e1 -//.word 0xf4997f00 -//.word 0xd28b4226 -//.word 0x4c98eeea -//.word 0xf0232bde -//.word 0x537dd208 -//.word 0xb3fdaf96 -//.word 0xdb5386cd -//.word 0x47195343 -//.word 0x89abd64e -//.word 0xeb394fbc -//.word 0x561a87c4 -//.word 0x72630f3d -//.word 0x0fb98000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x000022F0 -//// expected output -//.word 0x5f1da3c0 -//.word 0x3d633d35 -//.word 0xd6f28c19 -//.word 0x87ad25ae -//.word 0x9e26b6af -//.word 0xdebb2aed -//.word 0x02f1719b -//.word 0x706d20e5 -//.word 0x632b2005 -//.word 0x933db621 -//.word 0x29032fa3 -//.word 0xfd230446 -//.word 0x9928f681 -//.word 0x0af1742c -//.word 0x27731a5b -//.word 0xeffb15bf -//// SHA512LongMsgvector_11 -//// vector length -//.word 0x00002608 -//// input message -//.word 0x8ceddebd -//.word 0x38f00406 -//.word 0x743a6756 -//.word 0x565ce762 -//.word 0xd3464435 -//.word 0xd50bd61b -//.word 0x8de57fbe -//.word 0x0b79df8f -//.word 0x0c5cc667 -//.word 0x13d5ef6e -//.word 0xbbe5eb3d -//.word 0x4b845b3f -//.word 0x8b2e625d -//.word 0xd69e5ada -//.word 0x71dac67b -//.word 0x1b6f88ec -//.word 0xe5fe555f -//.word 0x44f76576 -//.word 0x65a56f63 -//.word 0xc06bd44e -//.word 0xf04d1bf6 -//.word 0xc2b19d9c -//.word 0x8c67811d -//.word 0xc0e8eb5e -//.word 0xc0db71ec -//.word 0xf4decfe4 -//.word 0x1b82db11 -//.word 0xde97bb55 -//.word 0xabab554a -//.word 0xc0cd0728 -//.word 0x869798ea -//.word 0x216b6fac -//.word 0x45fc0358 -//.word 0x4b109381 -//.word 0x8485178f -//.word 0xcd92761d -//.word 0x6350f99f -//.word 0xf9790048 -//.word 0x086ff42b -//.word 0x67807ca0 -//.word 0x1b68f4e9 -//.word 0x70171b15 -//.word 0x49b50b25 -//.word 0xb4e46f6e -//.word 0xc145f03e -//.word 0x953df0c2 -//.word 0xbaf97b27 -//.word 0xb9af7a00 -//.word 0xeb272ae8 -//.word 0x8c7bcd68 -//.word 0x111ba01b -//.word 0xbb130c0f -//.word 0x6d91206f -//.word 0xbba13f5f -//.word 0x433c1628 -//.word 0x4081d195 -//.word 0x5c428f9d -//.word 0xc6c21341 -//.word 0x85bdbcb8 -//.word 0x0ca9b7ca -//.word 0x0e3c737a -//.word 0x932e55e7 -//.word 0x4c40ae74 -//.word 0x237dea27 -//.word 0x17c00a4f -//.word 0x4776546a -//.word 0x4ca54845 -//.word 0xcc2ed765 -//.word 0x4c4fd0a6 -//.word 0x466b9b22 -//.word 0x7c0e2954 -//.word 0x8b2c2b7e -//.word 0xc3a98247 -//.word 0x361ef7a9 -//.word 0x0fdb2d0a -//.word 0x2628d3a9 -//.word 0xd1d11e3c -//.word 0xfce177d8 -//.word 0x7cad7110 -//.word 0xa014fd61 -//.word 0x0906e1ce -//.word 0xbc4366c7 -//.word 0x7665514f -//.word 0x4021155e -//.word 0x42ca4784 -//.word 0xdc1652d0 -//.word 0xf3256cf0 -//.word 0x89bfc999 -//.word 0x91de0e2a -//.word 0x016c088c -//.word 0x284d9e5c -//.word 0x42a0044c -//.word 0x4a4232c6 -//.word 0x0f9495d3 -//.word 0x8a7f043c -//.word 0x6fb5f5ef -//.word 0x0239f1a3 -//.word 0x2c2145bf -//.word 0xce9bfb78 -//.word 0x552e083a -//.word 0x8f42c74a -//.word 0xbde3a6a9 -//.word 0xe9c2203b -//.word 0x797ceb28 -//.word 0x051f7283 -//.word 0x66eb852a -//.word 0x0f554fed -//.word 0xa15289f2 -//.word 0xb9d1ee57 -//.word 0x0c89ef1a -//.word 0xb7f6a736 -//.word 0xd09e110f -//.word 0x41997910 -//.word 0xd6503093 -//.word 0x94858401 -//.word 0x4d94ef3a -//.word 0x71f88f37 -//.word 0x2710d6ee -//.word 0x9c238375 -//.word 0x9ba3d16b -//.word 0x5faeee94 -//.word 0xa5daaec3 -//.word 0x053281fd -//.word 0x817ca3db -//.word 0x5fbe9230 -//.word 0x3400c5ec -//.word 0x42529b40 -//.word 0x03119203 -//.word 0x0667b955 -//.word 0xfa116882 -//.word 0x09652e29 -//.word 0x67930b9d -//.word 0x2a2bdf8b -//.word 0x5cdf23dd -//.word 0x4e8bd7df -//.word 0x3072bba0 -//.word 0xdfcac29c -//.word 0xfe7cc497 -//.word 0x482573cc -//.word 0x24609047 -//.word 0x7a475f90 -//.word 0xc6375889 -//.word 0x6bd41f99 -//.word 0x494db60a -//.word 0x91e2f2b0 -//.word 0xd8a32bcc -//.word 0x6b7a382f -//.word 0xe36b9aa3 -//.word 0xf91bf886 -//.word 0x9b8fccb8 -//.word 0x3f375bb8 -//.word 0x772bea09 -//.word 0xc5b42fdb -//.word 0xb10e06e7 -//.word 0x1a6c659b -//.word 0xca3d9277 -//.word 0x4dae93b7 -//.word 0x0270e732 -//.word 0x72bb7382 -//.word 0xe193bf65 -//.word 0x234a6263 -//.word 0xb146bbb1 -//.word 0xfc04e256 -//.word 0x015dde8c -//.word 0x1e081969 -//.word 0x246111be -//.word 0xad684f40 -//.word 0xb00d9de5 -//.word 0x52ab7491 -//.word 0xffd2b4f2 -//.word 0xba4997a8 -//.word 0xb153e8aa -//.word 0x153270e5 -//.word 0x28eab226 -//.word 0x9847d839 -//.word 0x0b21ec53 -//.word 0xfbdf4bad -//.word 0xc43a5772 -//.word 0xfb446ddb -//.word 0x02a81798 -//.word 0xd9338273 -//.word 0x37933230 -//.word 0xda5ff4b7 -//.word 0x1b581475 -//.word 0xc5efd1ff -//.word 0x27070ef8 -//.word 0x68fb4a36 -//.word 0x1be3d220 -//.word 0x1313355a -//.word 0x79e5f9a5 -//.word 0x1bb98c00 -//.word 0x07397d13 -//.word 0x59e2ecce -//.word 0x51c0404e -//.word 0xa9781800 -//.word 0x258c8308 -//.word 0x6bdb73e4 -//.word 0x15676f4c -//.word 0x055b895d -//.word 0xf84d90f7 -//.word 0x5ec08664 -//.word 0x6aed543a -//.word 0x65c3bd82 -//.word 0x472c9119 -//.word 0x88922357 -//.word 0x34a2fcef -//.word 0x3e4fd116 -//.word 0x161ab3e8 -//.word 0x7d918607 -//.word 0x9916b485 -//.word 0x44e22304 -//.word 0xaa4a641b -//.word 0x13402dfc -//.word 0xfd1c0954 -//.word 0x6e9d4e73 -//.word 0x882a4fad -//.word 0x5e5ed400 -//.word 0x06c4c7f7 -//.word 0xf0df30cd -//.word 0x756e64d6 -//.word 0xb3ed781b -//.word 0x995ffc44 -//.word 0x3e4be6bc -//.word 0x7705cd0f -//.word 0xa82e5897 -//.word 0xda7ef557 -//.word 0x0ec1ce27 -//.word 0xd120f912 -//.word 0x11a2eefc -//.word 0x2ff33f87 -//.word 0x55638338 -//.word 0x0a3193d6 -//.word 0x040afa13 -//.word 0x3dcda66f -//.word 0x4991e458 -//.word 0xe6e98b96 -//.word 0xd56776e6 -//.word 0xe85e38e5 -//.word 0x5dec0c30 -//.word 0x6a380bca -//.word 0x19f9a2be -//.word 0x56384205 -//.word 0x465659a9 -//.word 0xdb50822b -//.word 0xa642f823 -//.word 0xec2a5126 -//.word 0xfbef69ec -//.word 0xbea29cb2 -//.word 0x900338de -//.word 0x4e4731e2 -//.word 0xb0181762 -//.word 0xd9de4699 -//.word 0x2c3d5df9 -//.word 0x62def111 -//.word 0xd97382b4 -//.word 0x2ff5ad58 -//.word 0x1030a4bc -//.word 0x4c82dcce -//.word 0x2de005cb -//.word 0x07193fa8 -//.word 0x105f8bb1 -//.word 0x72037f70 -//.word 0x9f803fd0 -//.word 0xe5bba882 -//.word 0x4289cea0 -//.word 0x7972a990 -//.word 0x65b50b2c -//.word 0x8e8bd51f -//.word 0xfab06b92 -//.word 0x46206509 -//.word 0xf51e8887 -//.word 0x077bf4f9 -//.word 0xcd159ed1 -//.word 0xfd9e01f2 -//.word 0x029f11cc -//.word 0x95bc71c8 -//.word 0x9139e5e6 -//.word 0x03bd0aa4 -//.word 0x81564523 -//.word 0xbebef985 -//.word 0x5bddfd99 -//.word 0xff8e4dba -//.word 0xa9a6fff4 -//.word 0x45337969 -//.word 0x7e01e2f3 -//.word 0xd463d60b -//.word 0xee2f5eea -//.word 0x310b1fed -//.word 0x91e7d13e -//.word 0xa7cbf3b1 -//.word 0x04d3bdec -//.word 0xc67857cb -//.word 0x69104803 -//.word 0xdf983105 -//.word 0xe2b2bb25 -//.word 0x89eacefb -//.word 0x193d0409 -//.word 0x1edc5d9f -//.word 0xbb2d34fc -//.word 0x3f1371b6 -//.word 0xf86f015c -//.word 0x4ce78359 -//.word 0x05e6441b -//.word 0xede36e75 -//.word 0x9b800000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00002608 -//// expected output -//.word 0x1c7665a6 -//.word 0x1930433f -//.word 0xcc7660b3 -//.word 0x6049c016 -//.word 0xa7c646dd -//.word 0x1e841272 -//.word 0x1314f969 -//.word 0xd3661554 -//.word 0xb97b18fd -//.word 0x35945109 -//.word 0xcfbfc783 -//.word 0xbdc424b2 -//.word 0x04ab19af -//.word 0xaac855c2 -//.word 0x84daf7f2 -//.word 0xcb333a65 -//// SHA512LongMsgvector_12 -//// vector length -//.word 0x00002920 -//// input message -//.word 0xeb22f73a -//.word 0x99b3b00d -//.word 0x6c9b15c8 -//.word 0xbe5cf11a -//.word 0x5435d561 -//.word 0xe398bbc1 -//.word 0xd3dee973 -//.word 0x423a1860 -//.word 0x4cebd6ef -//.word 0x8ab6291b -//.word 0xd89475c8 -//.word 0x5ca89f57 -//.word 0xc4737378 -//.word 0xce4b433f -//.word 0x0e09d17b -//.word 0xec037043 -//.word 0xec3a65d1 -//.word 0x32d49394 -//.word 0x45cc5880 -//.word 0x13e8b2a9 -//.word 0x35eba610 -//.word 0x750ce2bc -//.word 0x8da8a10d -//.word 0x3234cf4e -//.word 0x51756d89 -//.word 0x99f3389f -//.word 0x39ab8597 -//.word 0xeb047037 -//.word 0x310435d1 -//.word 0xdec4de60 -//.word 0xd9211fd4 -//.word 0x1eb57ea9 -//.word 0x0506b6be -//.word 0xc7fc5e65 -//.word 0x3e99c6b6 -//.word 0xece4222a -//.word 0x3f26ea65 -//.word 0x13598052 -//.word 0x79de1475 -//.word 0xb76ec57d -//.word 0x90530819 -//.word 0xc5d84e0d -//.word 0xdbfee185 -//.word 0x1f700fa9 -//.word 0xe8b98b71 -//.word 0x1cb510bb -//.word 0xf545479b -//.word 0x0547ebf2 -//.word 0x78c62b42 -//.word 0x9a6d50c0 -//.word 0x99429fab -//.word 0x8b9181dd -//.word 0xb225e1a0 -//.word 0xffbed6c2 -//.word 0xd6c082ec -//.word 0x11293a2f -//.word 0x47c5e6e0 -//.word 0x4ea5aba6 -//.word 0xfecdc8d1 -//.word 0x382dbeed -//.word 0x27d3b497 -//.word 0xc65e1990 -//.word 0xa3b68b10 -//.word 0xe2faf85d -//.word 0x84ba039b -//.word 0xea67a9e6 -//.word 0x9407249e -//.word 0x2f2d0f02 -//.word 0xcf29cc01 -//.word 0x797c234c -//.word 0xe48f2bb0 -//.word 0x80a46ea3 -//.word 0xb80c481d -//.word 0x749a90a9 -//.word 0xe3597abb -//.word 0x777abc44 -//.word 0x3190f084 -//.word 0x1e003a1f -//.word 0x22b22a74 -//.word 0xf40de42a -//.word 0x6a237e0b -//.word 0xf728a916 -//.word 0x722994cf -//.word 0x18fa0dda -//.word 0xd571eac8 -//.word 0xbfd1a731 -//.word 0xe3895003 -//.word 0x451fa119 -//.word 0x22676d10 -//.word 0x78f83c56 -//.word 0xc9e03883 -//.word 0x1b974aed -//.word 0x43328076 -//.word 0x63d9b2a9 -//.word 0xb27b6506 -//.word 0x7bc0ef99 -//.word 0x6940dcd2 -//.word 0x01f29190 -//.word 0x70e72f7f -//.word 0x8738baa4 -//.word 0x043d7b36 -//.word 0x13ffa2b0 -//.word 0x14f03024 -//.word 0x9fda14d2 -//.word 0xc51694f9 -//.word 0x99feefed -//.word 0xf0a4416a -//.word 0x64c5a628 -//.word 0x9ff8a2af -//.word 0xd62bc16d -//.word 0x93507a06 -//.word 0xb85459eb -//.word 0xc1515e2e -//.word 0x4904a095 -//.word 0xcf8135ed -//.word 0xbb2556a0 -//.word 0x9ccdbf8a -//.word 0xb4455509 -//.word 0xb6040b53 -//.word 0xce16060d -//.word 0xe2590019 -//.word 0x18eceaaf -//.word 0x98e5d5af -//.word 0x93421235 -//.word 0x8423986e -//.word 0xb536a7ab -//.word 0x0572abb4 -//.word 0xea08635f -//.word 0xb2964261 -//.word 0x0e9e1663 -//.word 0xd038e759 -//.word 0xf403220f -//.word 0xdd61f704 -//.word 0xe2e4ff7c -//.word 0x090322d1 -//.word 0x1212b80a -//.word 0xb871eeae -//.word 0x33036bdb -//.word 0x01e13492 -//.word 0xe650cd55 -//.word 0x32f1a2f4 -//.word 0x4238a5a4 -//.word 0x491f3751 -//.word 0x511c4c35 -//.word 0x7c50caaa -//.word 0x9001333c -//.word 0xb24a8403 -//.word 0x72115d30 -//.word 0x083a61e5 -//.word 0xdd1ae04a -//.word 0x4e2fb4dd -//.word 0xac0e6809 -//.word 0x879ca0fb -//.word 0x2c81b4b1 -//.word 0x6cda9f53 -//.word 0x9f2e18c7 -//.word 0xe9a4fe80 -//.word 0xbc73f996 -//.word 0x9e995f1c -//.word 0x2dd054ae -//.word 0x60be3649 -//.word 0x0f6c385f -//.word 0xb6f94c2b -//.word 0x76904743 -//.word 0x5c973f6c -//.word 0xe62938b1 -//.word 0xc3c700b7 -//.word 0xdb4a584b -//.word 0x8f1c543d -//.word 0x42a80571 -//.word 0x180f5533 -//.word 0xfd1d31cb -//.word 0xea7bee51 -//.word 0x6326e5c3 -//.word 0x451f6155 -//.word 0xbe65bc08 -//.word 0x9d20c47e -//.word 0xcc1f630d -//.word 0x1a848012 -//.word 0x3ebe2088 -//.word 0x19b8d1d9 -//.word 0x3c5048f3 -//.word 0xaa0b499f -//.word 0xdf07c70e -//.word 0x11314db5 -//.word 0xb5b79c5c -//.word 0x45c19671 -//.word 0x415c5aa1 -//.word 0x74b6b1aa -//.word 0x7891a96a -//.word 0x7cf27f3c -//.word 0x4519c285 -//.word 0x73b6b68a -//.word 0x065af785 -//.word 0x202c5ef7 -//.word 0x0cdd283f -//.word 0x80de556c -//.word 0x1fd04f50 -//.word 0x423cccd5 -//.word 0xf884f595 -//.word 0x4c19c8a4 -//.word 0xc6efbbb0 -//.word 0x342ea24d -//.word 0xa92bd28a -//.word 0xc79687c8 -//.word 0x3af583cc -//.word 0x8550f812 -//.word 0x012ea864 -//.word 0x22c14bac -//.word 0xfd5e3107 -//.word 0x0730281a -//.word 0x202ca0a9 -//.word 0xd0470d65 -//.word 0xd0e78d06 -//.word 0xcc98cb9a -//.word 0x6701231d -//.word 0x80160749 -//.word 0xb38fa1af -//.word 0x2398b907 -//.word 0x77cadac5 -//.word 0x235ab0ed -//.word 0xe990b527 -//.word 0x9f7b0d16 -//.word 0x32e4ade6 -//.word 0xeb80c324 -//.word 0xf16952d3 -//.word 0x10cf1dbc -//.word 0xb8ebc705 -//.word 0x49353805 -//.word 0x8dd74357 -//.word 0x8661852d -//.word 0x6bbe90e7 -//.word 0xed6749e5 -//.word 0xbed68e99 -//.word 0x543e1ce0 -//.word 0xeb79b092 -//.word 0xc9426d57 -//.word 0xc5a47ebd -//.word 0x0ab2fc88 -//.word 0x1979124a -//.word 0x0d335f33 -//.word 0x23be9b29 -//.word 0x794c7e1b -//.word 0x165bdd93 -//.word 0x2be8178b -//.word 0x98dfaf82 -//.word 0xb2d73acf -//.word 0x44fc7c34 -//.word 0xd44cceb6 -//.word 0x2707c2ac -//.word 0x07600a17 -//.word 0x43799631 -//.word 0xf88efd49 -//.word 0x0f711ecd -//.word 0x073607a9 -//.word 0xf42f16cf -//.word 0xc81b5d17 -//.word 0xd29a4b4a -//.word 0x84e48979 -//.word 0x79bb2394 -//.word 0xb79ee838 -//.word 0x314013c7 -//.word 0x90382bbe -//.word 0x32fa2743 -//.word 0x7306d6fe -//.word 0x2c5f7e2a -//.word 0x7a3fc4ec -//.word 0xc109cbe3 -//.word 0xf07fa000 -//.word 0x0635d698 -//.word 0xd5456db7 -//.word 0x0545f9b8 -//.word 0x5d76ff12 -//.word 0x3e3ea375 -//.word 0x70d98016 -//.word 0x224bd847 -//.word 0x2b99ed4a -//.word 0x9638ae67 -//.word 0x5ec6963c -//.word 0x76f8d255 -//.word 0x0cd4a2fc -//.word 0x0f200152 -//.word 0xef1a889f -//.word 0xa46990e7 -//.word 0xf15497be -//.word 0xea32e55c -//.word 0xb4216ef4 -//.word 0x8cfbfb42 -//.word 0x0a868564 -//.word 0xa7ebe1ea -//.word 0x7e6aa330 -//.word 0x4f4b3cec -//.word 0xc9186503 -//.word 0x0909c1a1 -//.word 0x5ec0bd88 -//.word 0x4f36bca8 -//.word 0xdff671f0 -//.word 0x0f898b65 -//.word 0xa5319871 -//.word 0x2cda237d -//.word 0x3c4d20c2 -//.word 0xfba78b5b -//.word 0xe4094b9f -//.word 0xc7925caf -//.word 0x118a2d4b -//.word 0x4ee047ea -//.word 0xecd73009 -//.word 0x42fc8fc3 -//.word 0xd15b90a2 -//.word 0xc9f28ab5 -//.word 0xcf66e0e2 -//.word 0xfdf5257e -//.word 0x2aac831b -//.word 0x6cda5da1 -//.word 0xdcc433a1 -//.word 0x999ac6e5 -//.word 0x10aa7d4c -//.word 0x7ad408d5 -//.word 0xa53e43f9 -//.word 0xf8495d3e -//.word 0xb2c33909 -//.word 0x725e14b3 -//.word 0xfc6069e0 -//.word 0x3a9d110c -//.word 0x81a2af67 -//.word 0x16344be3 -//.word 0xf1f93d8b -//.word 0xc0744d16 -//.word 0x2f3718bc -//.word 0x80000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00002920 -//// expected output -//.word 0x97c433de -//.word 0x3cd8f18b -//.word 0x75e494ba -//.word 0xfc3c813e -//.word 0x112b2261 -//.word 0xf1261ea6 -//.word 0xfab9dce0 -//.word 0xaaee5e53 -//.word 0x59f0e763 -//.word 0xf02154ca -//.word 0xc1589bb7 -//.word 0x0c2cbe9c -//.word 0xd22f9765 -//.word 0x59032923 -//.word 0xc4e2beaf -//.word 0x3f88f196 -//// SHA512LongMsgvector_13 -//// vector length -//.word 0x00002C38 -//// input message -//.word 0xbd361ca6 -//.word 0xc8d3531d -//.word 0x4dc2415d -//.word 0xb16ff93d -//.word 0x3e81d3c2 -//.word 0xb4511138 -//.word 0x00a1c281 -//.word 0x4b8be7ae -//.word 0x36b7d5cc -//.word 0x64d1da00 -//.word 0x3a3a23d7 -//.word 0xe2feddd7 -//.word 0x96079b5a -//.word 0x1b90f89c -//.word 0x8bdc7d12 -//.word 0x5827c5fd -//.word 0x8eddde40 -//.word 0x580af36e -//.word 0xc6112828 -//.word 0xcda2c6a6 -//.word 0x90e69893 -//.word 0xddfc951e -//.word 0xfba9be4e -//.word 0xa34b4a95 -//.word 0x4c0f01a9 -//.word 0xac64e68f -//.word 0x7bb018f8 -//.word 0x7a41fad1 -//.word 0xb4869216 -//.word 0x037f2fe7 -//.word 0xd7724fdd -//.word 0x33e0bf9e -//.word 0xf8b704af -//.word 0x66c9fa8a -//.word 0xe07dbbf1 -//.word 0xefc4c281 -//.word 0x8a4f518a -//.word 0x95000f1e -//.word 0xa79ef668 -//.word 0x10cc6c3f -//.word 0x1b3cb0fb -//.word 0x90207888 -//.word 0x7de1d9b9 -//.word 0x361466de -//.word 0x9baa9c98 -//.word 0x99667eec -//.word 0xf4957c97 -//.word 0x43f999a1 -//.word 0x3c06cd35 -//.word 0x3151a8b0 -//.word 0xdb4539f8 -//.word 0x57172e0f -//.word 0x6efd3ce8 -//.word 0x199bc279 -//.word 0x44bea911 -//.word 0xd34d8eec -//.word 0xe37d2305 -//.word 0x5243d22b -//.word 0x810fa457 -//.word 0x58b7623d -//.word 0x8bb1fa21 -//.word 0x1c8623ec -//.word 0x2283447f -//.word 0xc8b29247 -//.word 0x98097911 -//.word 0xfae03e20 -//.word 0xf7a9e27d -//.word 0x43db498f -//.word 0x7b2f9ceb -//.word 0xab0feb6d -//.word 0x134b1788 -//.word 0x2b0fefda -//.word 0xe4129904 -//.word 0x310f34b8 -//.word 0xc679bb14 -//.word 0x1f6b2c2e -//.word 0xc5deeaf0 -//.word 0xcd1e6026 -//.word 0xa17fe8d5 -//.word 0x034bebce -//.word 0x4e004984 -//.word 0xffb8fb1b -//.word 0x75e9f7c1 -//.word 0xf54e5341 -//.word 0xf125aed5 -//.word 0x8a9bcc3c -//.word 0x5385800d -//.word 0x5850cf4b -//.word 0x5f3b5239 -//.word 0x6dc3dc70 -//.word 0x8c5f5d2e -//.word 0xcc6e06f1 -//.word 0x886eae45 -//.word 0xea6e75da -//.word 0xb1c6a7d9 -//.word 0x3205e378 -//.word 0x9d2b7ccd -//.word 0x82191fdf -//.word 0x9445b603 -//.word 0xacb28d66 -//.word 0x1120b3e6 -//.word 0xf680a426 -//.word 0x44aa24e1 -//.word 0x9a526e7e -//.word 0x92388ee5 -//.word 0x47a00c92 -//.word 0x1402cae7 -//.word 0x9e022fc7 -//.word 0x14a28560 -//.word 0xb5b7a048 -//.word 0x939ac1cc -//.word 0x971fba85 -//.word 0xc6cb522c -//.word 0xc241eaae -//.word 0x94fe6183 -//.word 0xa846363c -//.word 0x195eec5c -//.word 0x30fcb369 -//.word 0x27fc4443 -//.word 0x32540db4 -//.word 0xc04a8e47 -//.word 0xfde5035e -//.word 0x9ca1437f -//.word 0xd566e8ef -//.word 0xa9bbb082 -//.word 0x6d3823b1 -//.word 0x863976ed -//.word 0x72dab033 -//.word 0x081f0be1 -//.word 0x00729dc8 -//.word 0xb5533782 -//.word 0x2a4b8e05 -//.word 0x4b219879 -//.word 0x76513947 -//.word 0x3aba1f73 -//.word 0x5f97eb2b -//.word 0x26b091a0 -//.word 0xd1d20114 -//.word 0x667c0734 -//.word 0xb1db6fa9 -//.word 0x88f86eea -//.word 0x53313d54 -//.word 0xcbe6077c -//.word 0x017405c4 -//.word 0xa267e82c -//.word 0x7aeb776b -//.word 0x3884793f -//.word 0x71ffd501 -//.word 0xe7a9f87c -//.word 0x0abe77ff -//.word 0xbf24f5b1 -//.word 0x61594825 -//.word 0x05abd72e -//.word 0x03a746f5 -//.word 0xb2d35648 -//.word 0x72a00635 -//.word 0xf09affd8 -//.word 0xa5e22e71 -//.word 0xa0deb3b9 -//.word 0x862ffa77 -//.word 0xd7e3274e -//.word 0x72ecb8d9 -//.word 0x5cd165fa -//.word 0xbda44b6e -//.word 0x2b344aa5 -//.word 0x2b83acd1 -//.word 0xf57b073e -//.word 0x78dc64e1 -//.word 0x9e79a033 -//.word 0xd1a41340 -//.word 0xbee770fa -//.word 0x59f5ecd4 -//.word 0x21dfa38c -//.word 0xa58b3748 -//.word 0x4763bae5 -//.word 0x404ace8c -//.word 0xe4d40a86 -//.word 0x27b6a051 -//.word 0x617b3df3 -//.word 0x4e79318e -//.word 0x5904d035 -//.word 0x1ae118fe -//.word 0x1dfd9458 -//.word 0xe55f7f9f -//.word 0x305c2dee -//.word 0x7d0aa735 -//.word 0xccf7968b -//.word 0xa51a62c5 -//.word 0x5b099a47 -//.word 0x926d971a -//.word 0xffb35c3f -//.word 0x6f05c143 -//.word 0x0b79d114 -//.word 0xda887013 -//.word 0x87c1416a -//.word 0x65bec6a0 -//.word 0xb058c96b -//.word 0x1617fbc5 -//.word 0x75ecdc41 -//.word 0xe723daa0 -//.word 0xfc93bd9f -//.word 0x46184214 -//.word 0x1b430639 -//.word 0x964fa648 -//.word 0xdf572548 -//.word 0xacc78e26 -//.word 0x0811da07 -//.word 0x54a113dd -//.word 0x8b12ba38 -//.word 0xcaa26760 -//.word 0x0fe3afa0 -//.word 0x40b44ae4 -//.word 0x70707587 -//.word 0x5f659666 -//.word 0x3f881f39 -//.word 0xbe66b423 -//.word 0x405e9087 -//.word 0x6c0e251e -//.word 0xeb0b0246 -//.word 0x6cd5fa9d -//.word 0xec0a83cf -//.word 0x34d95cac -//.word 0xa3ba737e -//.word 0x2d5c0599 -//.word 0xa4df0733 -//.word 0x3644c576 -//.word 0x3822c9d4 -//.word 0x229afe9b -//.word 0xda8c15c9 -//.word 0x350b2821 -//.word 0xbb0f9d7e -//.word 0xaa6a4e68 -//.word 0x3efee6e5 -//.word 0x302c8e91 -//.word 0x7c90caf1 -//.word 0x68eb9d05 -//.word 0xc260f41c -//.word 0x69e442ec -//.word 0x0ff067e2 -//.word 0x3c78d6b7 -//.word 0x9621f744 -//.word 0x61afca97 -//.word 0x42bcce46 -//.word 0x48b02103 -//.word 0x2cede871 -//.word 0xd84af137 -//.word 0x27c39752 -//.word 0xec6fe6af -//.word 0x35b200f9 -//.word 0xd1b3bfb0 -//.word 0x0f109c7b -//.word 0xc9d1d0bf -//.word 0xa19bb970 -//.word 0x8b267e27 -//.word 0x8cf1f675 -//.word 0xc135c678 -//.word 0xa217caab -//.word 0x8821b702 -//.word 0x6df3fe37 -//.word 0xf336f35e -//.word 0xa8d22ec0 -//.word 0x896131e6 -//.word 0xc5e34cf4 -//.word 0xc3b3be39 -//.word 0x65ba1d03 -//.word 0x8fe2f8b8 -//.word 0xe3cdba22 -//.word 0xcfc8d10b -//.word 0xcafa100a -//.word 0xdae1529c -//.word 0x5a006176 -//.word 0xfad1161a -//.word 0x0701c1a9 -//.word 0xeddccaf8 -//.word 0xfa0799e5 -//.word 0x646db4ec -//.word 0x8e7b27f5 -//.word 0x87902970 -//.word 0xd3affca4 -//.word 0x6f781544 -//.word 0x0f567d44 -//.word 0xaaf977ea -//.word 0x38076328 -//.word 0xbb0ee229 -//.word 0x7cbe3b2a -//.word 0x9755fe8b -//.word 0xb95ae726 -//.word 0x298e04df -//.word 0x05201a7c -//.word 0xcf2046b8 -//.word 0x2836e092 -//.word 0xda94a4eb -//.word 0x1c291450 -//.word 0x12171815 -//.word 0x9468e8a3 -//.word 0x30fc2b12 -//.word 0x72c661fb -//.word 0x62397e87 -//.word 0x4ffcd7cc -//.word 0xcbe5425a -//.word 0xf7257910 -//.word 0x01c0c035 -//.word 0xea41c8c4 -//.word 0x8dabd206 -//.word 0xddb21766 -//.word 0x6e2b6882 -//.word 0x37c2127e -//.word 0x96eb049d -//.word 0x941b3412 -//.word 0x6b373e13 -//.word 0x454d4e30 -//.word 0x478241e3 -//.word 0xce4b0768 -//.word 0xf8e04cce -//.word 0x67ee574f -//.word 0x418c32dd -//.word 0x7b710bfd -//.word 0x5864dad8 -//.word 0x2cf3448f -//.word 0x6668bfd0 -//.word 0xcdf9f8a7 -//.word 0x0a3f7296 -//.word 0x67ea6fe7 -//.word 0xd6b21341 -//.word 0x3591c77a -//.word 0xd02fdcac -//.word 0x289e708b -//.word 0xf34796f5 -//.word 0x6324b1cb -//.word 0xab302100 -//.word 0xc01c22ef -//.word 0x5c44f0f2 -//.word 0x49e13030 -//.word 0xdc808bb6 -//.word 0xc0b39cca -//.word 0xf4060c7b -//.word 0x1734fb7d -//.word 0xe49ba234 -//.word 0xf9ee370f -//.word 0xdc2a1117 -//.word 0x3fcb0dc8 -//.word 0x833f301f -//.word 0x7c9b8ef4 -//.word 0x748d6a8a -//.word 0x72919e65 -//.word 0xbc683e5b -//.word 0x9ac778ee -//.word 0x5d4cbed9 -//.word 0xa0b528e9 -//.word 0xce54130e -//.word 0xe4be0fb2 -//.word 0x78c4f849 -//.word 0xfba4622a -//.word 0x3b803a80 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00002C38 -//// expected output -//.word 0x44a012fc -//.word 0xcd62e69a -//.word 0xe9a2e9e4 -//.word 0x6427fa49 -//.word 0x1b88f665 -//.word 0x22cdc1f4 -//.word 0xab5c5157 -//.word 0x196b15db -//.word 0xa3905b99 -//.word 0xc460bf69 -//.word 0x0711797e -//.word 0xa556fcf4 -//.word 0xb2550539 -//.word 0x151f80ee -//.word 0xb522fbc0 -//.word 0x0450c723 -//// SHA512LongMsgvector_14 -//// vector length -//.word 0x00002F50 -//// input message -//.word 0xcb7e0a28 -//.word 0x78bbccbb -//.word 0x7dbdd8a2 -//.word 0xe2791ea2 -//.word 0xaeee73c9 -//.word 0x09b5d9a1 -//.word 0x9eda01aa -//.word 0x43ea0e07 -//.word 0xdc4d9c78 -//.word 0x7cd60188 -//.word 0xce99d208 -//.word 0xb4fdaabb -//.word 0x2d122653 -//.word 0x7c24349c -//.word 0x87908ef8 -//.word 0x7dd6810b -//.word 0xbbf0f3b7 -//.word 0xf1e2a44b -//.word 0x8093b4f7 -//.word 0x27db6684 -//.word 0xdfdd2341 -//.word 0x0397c241 -//.word 0xb4b706c3 -//.word 0x7cb068f2 -//.word 0x310e17cf -//.word 0x1d063e6b -//.word 0x5b528559 -//.word 0x843cda63 -//.word 0x8cf8717c -//.word 0xe63609f6 -//.word 0xeff872f5 -//.word 0x89a14c24 -//.word 0x064f11a6 -//.word 0x496b5650 -//.word 0x277f4d15 -//.word 0x13478fc1 -//.word 0xfb0a18eb -//.word 0x6d2a9324 -//.word 0xfefbd975 -//.word 0xecd1b409 -//.word 0x025de826 -//.word 0xbc397462 -//.word 0xacc11513 -//.word 0x1c250c07 -//.word 0xf5bc2175 -//.word 0xe09be834 -//.word 0xaa67432b -//.word 0xed672809 -//.word 0xeddda436 -//.word 0xc0972009 -//.word 0xb2c1e43b -//.word 0xe7fdd99b -//.word 0x42b69304 -//.word 0x86b08e8c -//.word 0xbbe4b8ff -//.word 0xd48c308c -//.word 0x8e7a4ebd -//.word 0x9bade3ad -//.word 0x0026c275 -//.word 0xbcf87fe7 -//.word 0xaa9f767f -//.word 0xa8920f96 -//.word 0xf91c41d9 -//.word 0xe86755fa -//.word 0xaedaeda5 -//.word 0x96a444b6 -//.word 0x5f99b7a9 -//.word 0xe23e8551 -//.word 0xf51fd3cd -//.word 0x8e69f3b9 -//.word 0x2cb4e5a1 -//.word 0x72211ebb -//.word 0x15a589d5 -//.word 0xf9a4cc8c -//.word 0x97c2ccbf -//.word 0xa2f67343 -//.word 0xeae0b1d8 -//.word 0x805cc05c -//.word 0x1b57ad3f -//.word 0xbae11437 -//.word 0x8b842b35 -//.word 0x0cd40197 -//.word 0x7048089f -//.word 0x4448d224 -//.word 0x52871887 -//.word 0xc69300e9 -//.word 0x8fab9f9b -//.word 0x08d0bdd6 -//.word 0xd81ed9ad -//.word 0x175d6d3f -//.word 0xb2d47431 -//.word 0x105d285c -//.word 0xf5bf10c2 -//.word 0xa7373ac7 -//.word 0x5058c69e -//.word 0xa416a401 -//.word 0xc31d9d25 -//.word 0x616798ed -//.word 0x240d165e -//.word 0x4d5d0053 -//.word 0x9b2ea271 -//.word 0x6c70f75e -//.word 0x2607272e -//.word 0xd5da4e1e -//.word 0x16267f85 -//.word 0x33190907 -//.word 0x8f9cf80c -//.word 0x4570df70 -//.word 0x0c7cd57d -//.word 0x5e65be16 -//.word 0xd960cc34 -//.word 0xe5444597 -//.word 0x97e486b5 -//.word 0xd59b48f7 -//.word 0xbb282224 -//.word 0x3ebc4f1d -//.word 0x0f52b2cc -//.word 0xc23f1757 -//.word 0x300abc99 -//.word 0x1a7d10d2 -//.word 0x0ffcba9d -//.word 0x8f16dd23 -//.word 0x705a9a8f -//.word 0x816cd7c2 -//.word 0x6e583f47 -//.word 0xe3258a89 -//.word 0xf4aeff43 -//.word 0xbdad3739 -//.word 0x45192326 -//.word 0xa9b251f5 -//.word 0x76da6a33 -//.word 0x56a600c5 -//.word 0xef3586d6 -//.word 0x0840a014 -//.word 0xedf39e1c -//.word 0x15fb4232 -//.word 0x03e1ca36 -//.word 0x6a962ad3 -//.word 0x944f9afa -//.word 0x0492508f -//.word 0x5b918f62 -//.word 0x78b8e060 -//.word 0xe382a00b -//.word 0x6c90ba27 -//.word 0x0ffcb6b6 -//.word 0x1bebf327 -//.word 0x946130cb -//.word 0xd55a5188 -//.word 0x791660d1 -//.word 0x7cb4d3d5 -//.word 0x9e020df7 -//.word 0x0894277f -//.word 0x3213ef8f -//.word 0x04d83158 -//.word 0x3cb9368d -//.word 0x0f238b18 -//.word 0x136a030d -//.word 0x5c5cffdc -//.word 0xe51cedca -//.word 0x322e0fa2 -//.word 0x34ce7ea7 -//.word 0x6d866ece -//.word 0x55ffb32a -//.word 0xfb1885a8 -//.word 0xef3580fc -//.word 0x60d9eedb -//.word 0x8278496b -//.word 0x3286fcf8 -//.word 0xddd46ae8 -//.word 0x9e1c31f1 -//.word 0xa6dbb089 -//.word 0xe15ec79e -//.word 0xd720dd88 -//.word 0xd053283c -//.word 0x3bbd28c2 -//.word 0x50c575e9 -//.word 0xf5cebb39 -//.word 0xdec30329 -//.word 0xf9f33492 -//.word 0x0920d964 -//.word 0x90d22498 -//.word 0xf3f13365 -//.word 0xd99393b7 -//.word 0xd41303dd -//.word 0x43637a81 -//.word 0x77a36bde -//.word 0x14f2472d -//.word 0xba844460 -//.word 0xe5f45d13 -//.word 0x12dc99c0 -//.word 0x24a49132 -//.word 0x05972c3c -//.word 0x903caeaa -//.word 0xafe3f178 -//.word 0xc07ef142 -//.word 0x3eb28ffc -//.word 0x9d2e8ee3 -//.word 0x753ce2b3 -//.word 0xe3952a1b -//.word 0x2d7a7b6e -//.word 0xa4005f9b -//.word 0xcfac1d5f -//.word 0xc53f3bb9 -//.word 0xdbd3429f -//.word 0x7f27c1ef -//.word 0x643894a8 -//.word 0xe011665a -//.word 0x92e375db -//.word 0x4758953c -//.word 0x1e2578fb -//.word 0xebdf2c7a -//.word 0xda0fe5b0 -//.word 0x5588fd1f -//.word 0x27f83906 -//.word 0xe1be4ed7 -//.word 0x7cfba4eb -//.word 0x41ec5975 -//.word 0xe67789b5 -//.word 0xfa03cd6e -//.word 0x838d0199 -//.word 0xe5f84b5b -//.word 0x05a55835 -//.word 0xaf44e97b -//.word 0x35ea8f07 -//.word 0x5963b22e -//.word 0x6dc9d8f3 -//.word 0xb955247b -//.word 0x1d761dc1 -//.word 0xf820b28b -//.word 0x48677a9d -//.word 0x124c402c -//.word 0x04d7be95 -//.word 0x5966a94f -//.word 0xfd44ee1e -//.word 0xf17d3c8a -//.word 0xf2f1c290 -//.word 0x55a83a97 -//.word 0x366526a6 -//.word 0xd17e59d3 -//.word 0x30eabaff -//.word 0x079c45c0 -//.word 0xdc0f529f -//.word 0x6a231a84 -//.word 0x4827776e -//.word 0xc637eb67 -//.word 0x18c8e4b8 -//.word 0xb6813e59 -//.word 0x024d0aab -//.word 0x2bae8e69 -//.word 0x52548cdc -//.word 0xeceec84f -//.word 0x6840c4c3 -//.word 0x1175cee4 -//.word 0x35b73c3b -//.word 0x87fef7a4 -//.word 0xc2253603 -//.word 0x8f438c33 -//.word 0xa938253f -//.word 0x3f864dd5 -//.word 0x9a6331f7 -//.word 0xff0ceaf4 -//.word 0xd75bb797 -//.word 0x0d9c8a9e -//.word 0xb89dc76d -//.word 0xfa044804 -//.word 0x27e5a42f -//.word 0x2a94b1fc -//.word 0x25b84772 -//.word 0x58a14780 -//.word 0x44dcdc34 -//.word 0x1004012e -//.word 0x2bda4453 -//.word 0x3398c9c6 -//.word 0x16839114 -//.word 0x77c0fcae -//.word 0x53688d9d -//.word 0xe4dfee71 -//.word 0xc561347a -//.word 0x58dd633b -//.word 0x6507351c -//.word 0x03a9175f -//.word 0xbc397555 -//.word 0xecb137d2 -//.word 0x6a9b8cde -//.word 0x6a6be6ad -//.word 0xa21246d2 -//.word 0xacd0b9af -//.word 0xac4a2230 -//.word 0x32dc3bb9 -//.word 0x6230d75c -//.word 0x52106a50 -//.word 0xb378ca9e -//.word 0xb4f0371e -//.word 0x23189aa2 -//.word 0xd5850a71 -//.word 0x49cb94f7 -//.word 0x88db3cba -//.word 0x4f903f90 -//.word 0x70849b10 -//.word 0x7628d146 -//.word 0x8814eaab -//.word 0x909bb853 -//.word 0x9ca35e69 -//.word 0x84b313d9 -//.word 0xcd4e224c -//.word 0xcd803559 -//.word 0x10b6d4f9 -//.word 0xfbd3293c -//.word 0xaf7f063b -//.word 0x30c2294e -//.word 0xc7d3be7f -//.word 0xa42a253e -//.word 0xc8dcf656 -//.word 0x2228421f -//.word 0xf84d1cf5 -//.word 0x899f58ea -//.word 0xf1da93b8 -//.word 0x4cb674fa -//.word 0x1ebc309b -//.word 0xf357548e -//.word 0x422ebfbf -//.word 0x97b1ed4a -//.word 0xf1f27cec -//.word 0x69b7e8b6 -//.word 0x15cd9a09 -//.word 0x2c9f21be -//.word 0x6b07bfa5 -//.word 0xb7632731 -//.word 0x03ec8571 -//.word 0x7443bf42 -//.word 0xc34dfac4 -//.word 0xe441610a -//.word 0xe5ff2116 -//.word 0x18a4b804 -//.word 0x745b7085 -//.word 0x3976268f -//.word 0xd3bd5053 -//.word 0x01053f70 -//.word 0x3605a166 -//.word 0x4066494d -//.word 0x271933c7 -//.word 0x58edc233 -//.word 0x02614d23 -//.word 0xc1b6da10 -//.word 0x7a49294d -//.word 0x8620f53a -//.word 0x12c376ba -//.word 0xc54d2ae7 -//.word 0xa4c2d504 -//.word 0x33a3c7b2 -//.word 0xddc05d67 -//.word 0x964eca1d -//.word 0xbf391747 -//.word 0x4abc6909 -//.word 0x1e2e83a8 -//.word 0xbd1f8b40 -//.word 0x24a311b5 -//.word 0xf3ee4deb -//.word 0xcd21a83a -//.word 0x02647f1c -//.word 0x6b352329 -//.word 0x96ff2446 -//.word 0x23efcf19 -//.word 0x6e03f5c0 -//.word 0x6f64eec2 -//.word 0xdef5de45 -//.word 0x9a2c3782 -//.word 0x4b217f77 -//.word 0x46e454db -//.word 0xb214ad57 -//.word 0xe9ad62f3 -//.word 0x2122efcf -//.word 0x4cac7513 -//.word 0x3de10128 -//.word 0x0b881129 -//.word 0xbaac5494 -//.word 0x18efb246 -//.word 0xe6218ca6 -//.word 0x38118000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00002F50 -//// expected output -//.word 0xb4641572 -//.word 0xcf72bed4 -//.word 0x513dfc27 -//.word 0x71dfeafc -//.word 0x1aa6dbf7 -//.word 0xf6b74099 -//.word 0x8c905f2f -//.word 0x48ae471d -//.word 0x00eb0e28 -//.word 0x42912903 -//.word 0x60c97635 -//.word 0x00a584ba -//.word 0xb1a1603a -//.word 0x8017accd -//.word 0x15c3db7f -//.word 0xac25b572 -//// SHA512LongMsgvector_15 -//// vector length -//.word 0x00003268 -//// input message -//.word 0x43331ce3 -//.word 0xfaa34f02 -//.word 0xb379076a -//.word 0x0fe38dca -//.word 0x551dfd63 -//.word 0x148804b9 -//.word 0x0afbe98e -//.word 0x455dca10 -//.word 0x88742952 -//.word 0xf0f8a7f9 -//.word 0xd7ec0e38 -//.word 0xf92e95fe -//.word 0xd54c606d -//.word 0x5799478f -//.word 0xb380d844 -//.word 0x94199f7f -//.word 0x76faa5b2 -//.word 0x50503687 -//.word 0x772ee7d1 -//.word 0xbf24d8c2 -//.word 0xe314375e -//.word 0x2741052f -//.word 0x3ba91d3b -//.word 0x63957233 -//.word 0xd56e98ed -//.word 0x62d28614 -//.word 0x59e79a1f -//.word 0xa9efdd7f -//.word 0x451d891d -//.word 0xcda7c803 -//.word 0x6a1dbf59 -//.word 0xfaf9cb94 -//.word 0x6d770aea -//.word 0x6ea71e09 -//.word 0x46c02d08 -//.word 0xfeb72c9e -//.word 0xc4105e92 -//.word 0x91f51772 -//.word 0x0885c688 -//.word 0xa06e320a -//.word 0x05be0491 -//.word 0xbcf686cc -//.word 0x0660aa76 -//.word 0x08a34e85 -//.word 0x2895bea5 -//.word 0xba507be4 -//.word 0xdc883baf -//.word 0x9e1c30fd -//.word 0x67ea8dca -//.word 0x94e847c7 -//.word 0x61711850 -//.word 0x0ddcca9e -//.word 0x3953b23e -//.word 0x92e27bc1 -//.word 0xafcf25b6 -//.word 0x3c2a4cd5 -//.word 0x59a4ae7d -//.word 0x3da5e861 -//.word 0x1f98807e -//.word 0x568a2850 -//.word 0xbff34145 -//.word 0x5fd39f72 -//.word 0x49018c84 -//.word 0xc2c00ffa -//.word 0xa4946e92 -//.word 0x0054f101 -//.word 0x077fe9e7 -//.word 0x2bd3f102 -//.word 0x811c74a2 -//.word 0x6a4b6f5d -//.word 0x72c77803 -//.word 0x780800d5 -//.word 0x1061d5f1 -//.word 0x251dea11 -//.word 0xe3ce5b75 -//.word 0xd3e2ac1e -//.word 0x4877523d -//.word 0xfb7174eb -//.word 0xf2c9f21a -//.word 0xa627a7cc -//.word 0x64b4eb83 -//.word 0xf4295cf8 -//.word 0x792ddf0f -//.word 0x98dde10b -//.word 0xdcace3fe -//.word 0x596d3584 -//.word 0x90ae01b1 -//.word 0x93488c48 -//.word 0x6a34b92e -//.word 0xb4a0cf1e -//.word 0x91427b9d -//.word 0xc0ed1931 -//.word 0x05622fce -//.word 0xce683a91 -//.word 0x151faeb1 -//.word 0x889138b2 -//.word 0xe88a46db -//.word 0xafaac9eb -//.word 0xf5b83908 -//.word 0x9439daf8 -//.word 0x8b413f93 -//.word 0xa08a0c78 -//.word 0x4ac30000 -//.word 0xcd2a3270 -//.word 0xa75d9a73 -//.word 0x2b6dd4c7 -//.word 0x6c352136 -//.word 0x5ceaafc8 -//.word 0x35f31a37 -//.word 0x18fa32a3 -//.word 0xf443ff87 -//.word 0xaa3c02ec -//.word 0x6f56bedc -//.word 0x7114771a -//.word 0xbd613a10 -//.word 0x60271d09 -//.word 0xcc1dc8a0 -//.word 0x7ee13478 -//.word 0xde46b32e -//.word 0x67ef318c -//.word 0x071db900 -//.word 0xc9c53b4c -//.word 0xb1e68c7e -//.word 0xe719ae23 -//.word 0x196a52b8 -//.word 0x1a669b61 -//.word 0xcf7525de -//.word 0x4b6a46ba -//.word 0x395993c5 -//.word 0x7aa8a6c5 -//.word 0x10691f69 -//.word 0x3be7e97e -//.word 0xe17fbf65 -//.word 0x33b2eec5 -//.word 0x8e785c7d -//.word 0x9fd6c9dd -//.word 0xcbb25515 -//.word 0xcee742ed -//.word 0xa295fcb7 -//.word 0xa2ba5682 -//.word 0xef071791 -//.word 0x13ecb50c -//.word 0xe4f660f4 -//.word 0xab5a425c -//.word 0x86d206d7 -//.word 0x0ba7972d -//.word 0x2e0f2a52 -//.word 0x65ba7e98 -//.word 0x0aa86223 -//.word 0x003d799d -//.word 0x99973a2c -//.word 0xb71f3aa1 -//.word 0x325eaef3 -//.word 0x7a132beb -//.word 0x7e82b120 -//.word 0xcc0ee826 -//.word 0xf90aa903 -//.word 0x43cdc0e2 -//.word 0x7504f10c -//.word 0x0b4d3913 -//.word 0x97015550 -//.word 0x63508990 -//.word 0x58949a0b -//.word 0x1edf1c96 -//.word 0x85d6f419 -//.word 0x24c31542 -//.word 0x40e58d7b -//.word 0xef0bc51a -//.word 0x7c6104d8 -//.word 0x0e893685 -//.word 0x85edecfa -//.word 0xa554a34e -//.word 0x76b4494d -//.word 0xea47fd25 -//.word 0xc1e11763 -//.word 0xaa81681e -//.word 0xab26c372 -//.word 0xc2e4bb31 -//.word 0xcd36afd4 -//.word 0xa79604b8 -//.word 0x944bb287 -//.word 0xdf8302f3 -//.word 0xc1a196ab -//.word 0x85d8a987 -//.word 0xeaf99806 -//.word 0xc989a1fb -//.word 0xf717eb83 -//.word 0x6dccc73a -//.word 0xa64436af -//.word 0x499cab15 -//.word 0x08cd123b -//.word 0xc83810be -//.word 0x02828d7d -//.word 0x69a1704d -//.word 0xcd37a9ee -//.word 0x3f1f753e -//.word 0x7646ddad -//.word 0x71bd80f1 -//.word 0x5e0c93fb -//.word 0xbbc82629 -//.word 0xbb68a9bd -//.word 0xeb54ae8e -//.word 0x153ff1fd -//.word 0x64b7952b -//.word 0xcafab069 -//.word 0x9f0c0af0 -//.word 0x8b0622d3 -//.word 0xa5b17231 -//.word 0xdc53f4af -//.word 0x97c9e525 -//.word 0x98d6c998 -//.word 0x26bbaf69 -//.word 0x6b08b6cb -//.word 0x1bb1d07a -//.word 0x5664c6ab -//.word 0xd01a7d3e -//.word 0x2fed773b -//.word 0xb4299c7c -//.word 0x1ea53ba7 -//.word 0xcb544c60 -//.word 0x2117f8bc -//.word 0x2cd55bf8 -//.word 0x88ce886b -//.word 0x822ccdb9 -//.word 0x7adb394a -//.word 0x8c9b5cfa -//.word 0x6f544e12 -//.word 0x9ca9f378 -//.word 0xb3cf7c22 -//.word 0x1ba031d0 -//.word 0xe9eb6efb -//.word 0x040fec08 -//.word 0x86c842c2 -//.word 0x6548ac07 -//.word 0x528a0ac1 -//.word 0xe1e32c19 -//.word 0xebda4ce7 -//.word 0x3139dc6c -//.word 0x41648343 -//.word 0x9eea6295 -//.word 0x1b5a9b8d -//.word 0x8858140b -//.word 0x90ef789d -//.word 0xe2297fab -//.word 0x8fdd70f1 -//.word 0xb3c9e432 -//.word 0x58e0cc2b -//.word 0x97e5b5c7 -//.word 0x00394b91 -//.word 0x3df21c6e -//.word 0xf12c9f8c -//.word 0xe6a47596 -//.word 0x6883ee2a -//.word 0xec77cf8c -//.word 0xf608539c -//.word 0x392a6f05 -//.word 0xff0e5ab8 -//.word 0xcb3e4d99 -//.word 0x3de98877 -//.word 0x377b9542 -//.word 0x3e71d078 -//.word 0x236c27e1 -//.word 0xe2841f7c -//.word 0xcade17b9 -//.word 0xde81d1e8 -//.word 0x7c652ef2 -//.word 0x3ccd3947 -//.word 0x1bd76717 -//.word 0xd9521ec5 -//.word 0x9fcf7399 -//.word 0xe5fb38b5 -//.word 0x932c364a -//.word 0x6639b70b -//.word 0x968f48e2 -//.word 0xb681bce2 -//.word 0xdbe0747e -//.word 0x00ccdef8 -//.word 0xa9c93c1c -//.word 0xc716a72d -//.word 0xdc3a5320 -//.word 0x5fdf1408 -//.word 0x62e321d2 -//.word 0x72ad1932 -//.word 0xbfbd43dd -//.word 0x7d871af9 -//.word 0x898209d1 -//.word 0x507c73ce -//.word 0xed30f6a3 -//.word 0x911af1c7 -//.word 0x288a4328 -//.word 0x39f8561e -//.word 0x0e975d9d -//.word 0x162cd9b0 -//.word 0x87216222 -//.word 0x47d5a47e -//.word 0x0d37a83b -//.word 0xc4935530 -//.word 0x30ac364e -//.word 0xd30a7d8d -//.word 0x12954827 -//.word 0x94632405 -//.word 0xebcfcf76 -//.word 0x76cb4327 -//.word 0x8577ef50 -//.word 0xbff2482b -//.word 0xc16f80aa -//.word 0x088c9569 -//.word 0x11e08ee2 -//.word 0xbed302e0 -//.word 0xfcb3d936 -//.word 0xa30456b0 -//.word 0x9e17564a -//.word 0x4bded2a0 -//.word 0x24feaba6 -//.word 0xa026a799 -//.word 0x549fb635 -//.word 0x5e257b29 -//.word 0x03f607c8 -//.word 0x9728e801 -//.word 0x9d3f6291 -//.word 0x30fffc77 -//.word 0xa27f3fa8 -//.word 0x627fba05 -//.word 0x23fb498a -//.word 0x3a0197c8 -//.word 0x48bfe295 -//.word 0x1ae0fe02 -//.word 0xcd199d8d -//.word 0x36fecd98 -//.word 0x811bc21a -//.word 0x1740d695 -//.word 0xc61cce48 -//.word 0x1c0d5fa5 -//.word 0x1337f105 -//.word 0xf4d4a29b -//.word 0x75ca8ea6 -//.word 0x24834eeb -//.word 0x09f9be63 -//.word 0x87100331 -//.word 0x8429cdd6 -//.word 0xcaf4daa8 -//.word 0xac85bc81 -//.word 0xecabdbb4 -//.word 0xdc7dbd45 -//.word 0xc4358559 -//.word 0x8442baeb -//.word 0x7a984ac1 -//.word 0xa64bcf9e -//.word 0x0c5c10ba -//.word 0x5ad3cb6f -//.word 0xcb0db235 -//.word 0x4b58b3d0 -//.word 0xdcbd7cc8 -//.word 0x381d3f1a -//.word 0xb880b22d -//.word 0x74a95b07 -//.word 0xacee0ac1 -//.word 0x6746a738 -//.word 0x59a42d06 -//.word 0x0a83f7b1 -//.word 0x35c23b21 -//.word 0x6eb3d458 -//.word 0x086f445d -//.word 0x366cf979 -//.word 0x7051cfa6 -//.word 0x1908d745 -//.word 0x5e15570f -//.word 0x6127114e -//.word 0x97edc84d -//.word 0x6e2b010d -//.word 0x340d0739 -//.word 0x34bb315c -//.word 0x222d6752 -//.word 0xb941e3fd -//.word 0xa20b3539 -//.word 0x986c8a11 -//.word 0xcae62d33 -//.word 0x80ae4ea1 -//.word 0x020303aa -//.word 0xb6bf8c19 -//.word 0x882cdbac -//.word 0x8e1854c7 -//.word 0xec2cd16a -//.word 0xf679e961 -//.word 0x955472ba -//.word 0xec64447c -//.word 0x3bf94096 -//.word 0x039f9116 -//.word 0x6bf4329b -//.word 0xe2b6b00d -//.word 0x0620328b -//.word 0xc477b6a5 -//.word 0xc1e09dcc -//.word 0xf9746a06 -//.word 0xa796c7e7 -//.word 0x6484c9bc -//.word 0x922d7409 -//.word 0xfb438236 -//.word 0xb6906085 -//.word 0x4b8d7a47 -//.word 0x1631b850 -//.word 0xf10748a8 -//.word 0x0d839f83 -//.word 0x21800000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00003268 -//// expected output -//.word 0xa1a60fb8 -//.word 0x9d420fc8 -//.word 0x4c2caab2 -//.word 0x4079d75d -//.word 0xdca9a467 -//.word 0x6eb8677b -//.word 0x3d64038f -//.word 0xba871120 -//.word 0x3a459bc2 -//.word 0x6259112c -//.word 0x64138d4c -//.word 0xd1ebba40 -//.word 0x6720cf29 -//.word 0xcd1e4ac3 -//.word 0x5e35be50 -//.word 0x464ef1df -//// SHA512LongMsgvector_16 -//// vector length -//.word 0x00003580 -//// input message -//.word 0x1cecb230 -//.word 0xf8c80f87 -//.word 0xe65e6a5c -//.word 0xf1de4301 -//.word 0xb2cf1ac7 -//.word 0xc4ae81c4 -//.word 0x78d875d3 -//.word 0xc9aaeedb -//.word 0x92e6b555 -//.word 0xfe587608 -//.word 0x40ba1617 -//.word 0x85d6463e -//.word 0x27ea5959 -//.word 0x24505226 -//.word 0xce5e424b -//.word 0xc48cd19b -//.word 0x20d41a95 -//.word 0xf25fbc2d -//.word 0xee5d2dd0 -//.word 0x613552a2 -//.word 0x6ade4d0a -//.word 0x668c9770 -//.word 0xac904e45 -//.word 0x7b79d044 -//.word 0x308088f8 -//.word 0xbc23087f -//.word 0x560f588d -//.word 0x6d438eb4 -//.word 0xe1739fe2 -//.word 0x72aa752b -//.word 0x793442c8 -//.word 0xd6bb1360 -//.word 0x29b0a887 -//.word 0x45ed8385 -//.word 0xe1983f58 -//.word 0x914a23fc -//.word 0xf570f7e9 -//.word 0x30f216de -//.word 0x9c13c5dd -//.word 0xbd99c376 -//.word 0x732d2249 -//.word 0x730454c7 -//.word 0xf7bf8938 -//.word 0xb5903902 -//.word 0x0e9ffc28 -//.word 0x89aca211 -//.word 0x7ff5808b -//.word 0x185a080f -//.word 0x76bf9d47 -//.word 0x2fb2a5cd -//.word 0x014ddf36 -//.word 0xc15ef64f -//.word 0x95c657a6 -//.word 0x631f404c -//.word 0x89a21ada -//.word 0xcf4709b2 -//.word 0x992dc187 -//.word 0x623d9b20 -//.word 0x650be858 -//.word 0x9dfc856a -//.word 0xf0aeb06b -//.word 0xa8941918 -//.word 0x22e13cd2 -//.word 0xcaa8efe7 -//.word 0x47413713 -//.word 0xf2ee6047 -//.word 0x8dbe4da8 -//.word 0x32b20cdb -//.word 0x891fad80 -//.word 0x3e5355fc -//.word 0xb27b8e7c -//.word 0xf1c5e137 -//.word 0xe5c1a7f3 -//.word 0xc90d1cca -//.word 0xdf31b52e -//.word 0x66c8b42b -//.word 0xc7e1f9ec -//.word 0x0fa41b81 -//.word 0xa139b7df -//.word 0x2de50828 -//.word 0xdc76b82d -//.word 0xcde2f632 -//.word 0xc52bc9f1 -//.word 0x2285a4e1 -//.word 0x11bb3ab7 -//.word 0x01cf932d -//.word 0x58e16003 -//.word 0x64518c44 -//.word 0x942813cb -//.word 0xe8b41705 -//.word 0xa67331f9 -//.word 0x4f330585 -//.word 0xd17619ea -//.word 0xfe1be78b -//.word 0x3d3b30f1 -//.word 0x7f529413 -//.word 0x759f60d4 -//.word 0x01cda7ce -//.word 0xead2944e -//.word 0xd318fe9f -//.word 0x6eda3d8c -//.word 0xedd23c20 -//.word 0xb911d0b0 -//.word 0x672e481c -//.word 0xe8a24651 -//.word 0xff73cd12 -//.word 0xf8109af9 -//.word 0x987cb8b8 -//.word 0x50af4fa5 -//.word 0xb53abd76 -//.word 0x3529e748 -//.word 0x022dd1e7 -//.word 0x53fb6d49 -//.word 0xccefb15b -//.word 0x3af5ec01 -//.word 0x84a95a57 -//.word 0xdfbdf63e -//.word 0x409b8f14 -//.word 0x174c1ec2 -//.word 0x3a9957fc -//.word 0x1f707ec4 -//.word 0x4f897c30 -//.word 0x1748326e -//.word 0x81e60d05 -//.word 0x83ccdb5d -//.word 0x753fdd82 -//.word 0xc8421d25 -//.word 0xf6b801e4 -//.word 0xb5ca21cb -//.word 0x7088561a -//.word 0xf7d31348 -//.word 0x767af949 -//.word 0xa4a3a50d -//.word 0x3c6dcd49 -//.word 0xb1d38b79 -//.word 0x1ed4f826 -//.word 0x7bd0fd64 -//.word 0x173666a0 -//.word 0x425c3898 -//.word 0x4aae45ab -//.word 0xaa0bfd53 -//.word 0x7d6c87f0 -//.word 0x39c711c7 -//.word 0x9933644a -//.word 0xdb4cbb9a -//.word 0x2cd9d54a -//.word 0x61ac4966 -//.word 0xe7ca1ab3 -//.word 0xfdcc8b39 -//.word 0x208534ff -//.word 0xc7e55616 -//.word 0x511d6cd8 -//.word 0x3c040272 -//.word 0x97bacaa0 -//.word 0xba8bedb8 -//.word 0x34169fea -//.word 0x05aef6c6 -//.word 0x0e00fcfe -//.word 0xc5f6036e -//.word 0x2ddc3859 -//.word 0x06c27bf6 -//.word 0x40216e2b -//.word 0xb6c1cc98 -//.word 0x19d9fdd7 -//.word 0x2a79e702 -//.word 0x2d250676 -//.word 0x9ac2bfd7 -//.word 0x15b7f155 -//.word 0xa04cce2d -//.word 0x1055e972 -//.word 0xbd158f0d -//.word 0x7e5d5b03 -//.word 0xd5f405f6 -//.word 0x663b7bef -//.word 0xae11335a -//.word 0xf1f5bf52 -//.word 0x746aa21f -//.word 0xeda062fd -//.word 0x3850de1f -//.word 0x4be8e2f4 -//.word 0x6ce8f9a9 -//.word 0xa28c82ef -//.word 0x69ab06fe -//.word 0xa9dfc9da -//.word 0xe9e69fd5 -//.word 0xc0480155 -//.word 0x8d3a60d7 -//.word 0x68c3b934 -//.word 0x591d6a23 -//.word 0xc75e4400 -//.word 0x3358e1cc -//.word 0x26bd3874 -//.word 0x67876e56 -//.word 0x7296f001 -//.word 0x269bbe3c -//.word 0xbe360a4b -//.word 0x025b016d -//.word 0xbefae9a9 -//.word 0x74df6cca -//.word 0x4ed733a9 -//.word 0x5614b7aa -//.word 0xe9d25489 -//.word 0x693ba057 -//.word 0x3388fabf -//.word 0xd16a668e -//.word 0x70a89873 -//.word 0x94094e02 -//.word 0x0a74e3ff -//.word 0x1f5621da -//.word 0x0f445876 -//.word 0xc0e2ac2e -//.word 0xb003b31a -//.word 0x2c11408e -//.word 0xc4b079e4 -//.word 0xfb9e307c -//.word 0x43dd7000 -//.word 0x281555ed -//.word 0xcb34214f -//.word 0x92578dcc -//.word 0x1eed5de3 -//.word 0x7d193776 -//.word 0xa159b586 -//.word 0x1166b93f -//.word 0xdf5b0134 -//.word 0xda18fbeb -//.word 0x04e9da9c -//.word 0x4763e936 -//.word 0x638f1fa3 -//.word 0x2b4bf44d -//.word 0xf1ec74e1 -//.word 0x3f289253 -//.word 0xc834be22 -//.word 0x9d29badd -//.word 0xa4aca9e6 -//.word 0x47ce6976 -//.word 0x693122e1 -//.word 0x9e6d1f1b -//.word 0x9bb1dd7b -//.word 0xebae62c0 -//.word 0xe4b0d052 -//.word 0xda0e3aca -//.word 0x92c5b6b3 -//.word 0xf960b492 -//.word 0x161b8e25 -//.word 0x3e4760e9 -//.word 0x87f019de -//.word 0x7fbed28e -//.word 0x1d195f4c -//.word 0xf79024ba -//.word 0xb67c2a8e -//.word 0xc7e07395 -//.word 0x54948af8 -//.word 0x73a35dbe -//.word 0x9df14f92 -//.word 0x61218ac6 -//.word 0x59b59299 -//.word 0x5e7720b5 -//.word 0xf8182dfc -//.word 0x18184d84 -//.word 0x0ae53ee0 -//.word 0xa547c1a2 -//.word 0xc5fba81d -//.word 0xfb9f3170 -//.word 0x82ce92c0 -//.word 0x758bd5c4 -//.word 0x40e3e687 -//.word 0x55ceeb69 -//.word 0x2057d367 -//.word 0x3cfc329d -//.word 0xe7584c09 -//.word 0xb3ff6f92 -//.word 0x7faa8749 -//.word 0xa694ecee -//.word 0x76237eb6 -//.word 0xe4cbf44b -//.word 0x7d307115 -//.word 0xa08a58b8 -//.word 0xeb4e62de -//.word 0xf30bee36 -//.word 0x389198bd -//.word 0x58590c3c -//.word 0x82211d11 -//.word 0x2ed71133 -//.word 0x0bb83f71 -//.word 0x39b9ddfa -//.word 0xb9261322 -//.word 0x22895363 -//.word 0x95cdeda2 -//.word 0xf2a3deb4 -//.word 0x4c25e921 -//.word 0x9bb9ea28 -//.word 0xb1396603 -//.word 0x7051666c -//.word 0x3928865f -//.word 0xa7424922 -//.word 0x7ea5af83 -//.word 0xde3a0a61 -//.word 0xbd770d6d -//.word 0x943b2632 -//.word 0x57f90e53 -//.word 0xab199e14 -//.word 0x549be41c -//.word 0xecfe767a -//.word 0xdb6006e5 -//.word 0x83e63748 -//.word 0xbb5eaf7e -//.word 0x7f236d59 -//.word 0xe5415dea -//.word 0x53da2afc -//.word 0xf0c954e2 -//.word 0x58848273 -//.word 0x94471952 -//.word 0x496f0d73 -//.word 0x2f24f8da -//.word 0xc53a69a6 -//.word 0x44597e4f -//.word 0xd15cb52c -//.word 0xf6f8ff38 -//.word 0x539e1615 -//.word 0x91a21151 -//.word 0x989c36e9 -//.word 0x020f0f0b -//.word 0xcf48c020 -//.word 0x5a89970a -//.word 0x8b67e5aa -//.word 0x4f710ca6 -//.word 0x4512da69 -//.word 0xbbb9156b -//.word 0xd83657b2 -//.word 0x1a681c99 -//.word 0x04151ad0 -//.word 0x1019d1a4 -//.word 0xebc36280 -//.word 0xe17ca4b4 -//.word 0x96a97576 -//.word 0xf8d34e26 -//.word 0x71051bd7 -//.word 0x6176490a -//.word 0xcb6820bc -//.word 0x4f5053a4 -//.word 0x5837d5b6 -//.word 0x9660efeb -//.word 0xaf2b9044 -//.word 0x3139e40d -//.word 0xccd1275f -//.word 0xbe83bce8 -//.word 0x8e0b79ee -//.word 0xfd784692 -//.word 0x3a8de652 -//.word 0x556714d2 -//.word 0xf660d2dc -//.word 0x4f34fea5 -//.word 0x4f622652 -//.word 0x18d59dba -//.word 0xb4c4ce6e -//.word 0x03d7d1f7 -//.word 0xf88b3c5e -//.word 0x05d73cf2 -//.word 0xd410e445 -//.word 0x380ac478 -//.word 0x6380beb8 -//.word 0x59b51509 -//.word 0xa55cc742 -//.word 0x4ab51d59 -//.word 0xfcfa80e1 -//.word 0x90f98ed1 -//.word 0xb2026d87 -//.word 0xd6035f0d -//.word 0x71f2979a -//.word 0x686b4c5c -//.word 0xc89b0b74 -//.word 0xb95c5143 -//.word 0xada159e4 -//.word 0xdd1533f9 -//.word 0xf6ff16ab -//.word 0x0f69f7ec -//.word 0xdf815aff -//.word 0x2d3f693b -//.word 0x8748430c -//.word 0x3713963a -//.word 0x734a706e -//.word 0xd47352f2 -//.word 0x0acf87b8 -//.word 0xcd82b39e -//.word 0x16f5aff0 -//.word 0x9079942e -//.word 0x492d1610 -//.word 0xae2114c8 -//.word 0xb6bb6c87 -//.word 0x5d5a1442 -//.word 0x543a67b6 -//.word 0xf798bcaa -//.word 0x7f163d74 -//.word 0x7960f7be -//.word 0x77102d8a -//.word 0x05cff274 -//.word 0xdebdf737 -//.word 0x6014a173 -//.word 0x3e085eae -//.word 0x75f13a98 -//.word 0x81abad93 -//.word 0xd03db772 -//.word 0x77ba2f81 -//.word 0x246559c6 -//.word 0x5318b687 -//.word 0xc5e7200d -//.word 0x2e0016a7 -//.word 0x2fd554f1 -//.word 0x837ea655 -//.word 0x7d58ffd3 -//.word 0xb2f3c5fe -//.word 0xf32b7047 -//.word 0x7e94537e -//.word 0x741cb996 -//.word 0x8eeb34a9 -//.word 0x0c8e323b -//.word 0xef55d1c3 -//.word 0x68f9f568 -//.word 0x90829708 -//.word 0x5968607e -//.word 0xc5f97625 -//.word 0x56fa9698 -//.word 0xc59163bc -//.word 0xf763fd01 -//.word 0x2cf9d6e4 -//.word 0x7a68c1b9 -//.word 0x7a314ca7 -//.word 0x416650f4 -//.word 0x80000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00003580 -//// expected output -//.word 0x3ed79e61 -//.word 0xd5843b36 -//.word 0xb6228023 -//.word 0x670b3332 -//.word 0x08cf9bf5 -//.word 0x56b1d6fc -//.word 0x54e95808 -//.word 0xdfac2402 -//.word 0xae06fb74 -//.word 0x9e45883f -//.word 0x21211ff4 -//.word 0x1b28cced -//.word 0x38d70639 -//.word 0x0a398afa -//.word 0x8f5eee76 -//.word 0x0da041f2 -//// SHA512LongMsgvector_17 -//// vector length -//.word 0x00003898 -//// input message -//.word 0x1297bed1 -//.word 0xf0bd4980 -//.word 0x3921a12a -//.word 0x636f92fe -//.word 0x2d7a7a74 -//.word 0x84884e3b -//.word 0xa8f0dd73 -//.word 0x8be8591d -//.word 0x7a9813d0 -//.word 0xfe7386ad -//.word 0x05c69795 -//.word 0x3d911b99 -//.word 0xc1979ab1 -//.word 0xf7b152b1 -//.word 0xb8677f7a -//.word 0xb2c1da6d -//.word 0x0b5b6026 -//.word 0x47b85466 -//.word 0x6cd88750 -//.word 0x640dd7d9 -//.word 0xa20af67a -//.word 0x093d6d27 -//.word 0x095fe085 -//.word 0x0b499358 -//.word 0x0f092d3a -//.word 0x9335bc93 -//.word 0xb77ffac5 -//.word 0xa08acfa7 -//.word 0x1afc1635 -//.word 0x81d5a486 -//.word 0xe1ff86fe -//.word 0x5c258bc4 -//.word 0xccc90376 -//.word 0xaa91c51c -//.word 0x2fe2775b -//.word 0xb8b009ec -//.word 0x6f95834c -//.word 0x282001b4 -//.word 0x896ffb4b -//.word 0x6e00ca9b -//.word 0x8bc46841 -//.word 0x547578e9 -//.word 0x192a867a -//.word 0x76298f8e -//.word 0xeafcc425 -//.word 0xc6c78b9a -//.word 0x49d8c7d6 -//.word 0x098059c3 -//.word 0x9421e703 -//.word 0x5889dbe3 -//.word 0xc07eaf8a -//.word 0xa09a6977 -//.word 0xd35a612a -//.word 0x23714a20 -//.word 0x68627005 -//.word 0xf44d3f26 -//.word 0x2f090525 -//.word 0x7f74f9f0 -//.word 0x6b077bf3 -//.word 0xffae9d8d -//.word 0x72d6e3c1 -//.word 0x06c7472f -//.word 0x30348042 -//.word 0xf91084aa -//.word 0xa4a44c0d -//.word 0x91dfd7f9 -//.word 0x61ed711e -//.word 0x5b0b35ba -//.word 0x0e99d154 -//.word 0x387089ad -//.word 0xe7777ff4 -//.word 0xde713139 -//.word 0x3a194324 -//.word 0x56717fe7 -//.word 0xeb571a71 -//.word 0x7c5938e4 -//.word 0xf1cab34a -//.word 0x82151884 -//.word 0xd652f382 -//.word 0x6c174dba -//.word 0x3b9172d2 -//.word 0x95d3f8a0 -//.word 0x516dfc55 -//.word 0x2941aff5 -//.word 0x6192120b -//.word 0xaa5efd9a -//.word 0x45ee6656 -//.word 0x6babe014 -//.word 0xed336280 -//.word 0x18ac4a0e -//.word 0xdb59a133 -//.word 0x2c6aa1d4 -//.word 0xa71974ff -//.word 0x78f23fd9 -//.word 0x7c725fd7 -//.word 0xa3d4f331 -//.word 0x99289a94 -//.word 0xa5a57e18 -//.word 0xd1409171 -//.word 0x4b7e1669 -//.word 0x0b86648e -//.word 0xb67ae627 -//.word 0xc207676d -//.word 0xdc3b8cf8 -//.word 0x8697a278 -//.word 0x05669aa5 -//.word 0x7a4d5279 -//.word 0x4f22179c -//.word 0xd4016720 -//.word 0x2a9dfb6e -//.word 0x61d50580 -//.word 0xdd88b651 -//.word 0xfea90392 -//.word 0x0096a99f -//.word 0x1fa56eb1 -//.word 0xff00aa55 -//.word 0x4cb4071d -//.word 0x9d048595 -//.word 0x9f03c178 -//.word 0x6f627624 -//.word 0x4786444c -//.word 0x5dddb0ed -//.word 0x08736d83 -//.word 0x25c0da7c -//.word 0xb9c5cbed -//.word 0xd8578c84 -//.word 0xc5ba23be -//.word 0x5a71d659 -//.word 0xaa55ed0d -//.word 0xe6e5b977 -//.word 0x7dddd556 -//.word 0x870aacf9 -//.word 0x645c3bf8 -//.word 0xa03d1923 -//.word 0x1a21b4b8 -//.word 0x665eddd9 -//.word 0x6f3f873c -//.word 0x6153cb25 -//.word 0xc60b3091 -//.word 0xef842ab4 -//.word 0x95a2e0a6 -//.word 0xc05e325a -//.word 0xe861fbcf -//.word 0x5ad1938a -//.word 0xde6b9943 -//.word 0x97d2efdf -//.word 0x2a26059e -//.word 0x23d95b96 -//.word 0x94be4160 -//.word 0xfe63e211 -//.word 0x75a1806b -//.word 0x00710155 -//.word 0x3f01ab89 -//.word 0x50082c8d -//.word 0xf256dde4 -//.word 0xebaf4785 -//.word 0xa8d9e78c -//.word 0x24f42e30 -//.word 0x0b0accf5 -//.word 0x1ee72e22 -//.word 0xd92b4576 -//.word 0x539d8a17 -//.word 0x67c23fcb -//.word 0x11aff76a -//.word 0x1a1b5894 -//.word 0xf8b8209f -//.word 0xf0c466d3 -//.word 0x7dda23da -//.word 0xf50ff072 -//.word 0x6a3a1165 -//.word 0xce93b3bb -//.word 0x5b80722e -//.word 0x32ab1ede -//.word 0x4358bf46 -//.word 0x6cf6d66f -//.word 0xe5f3e663 -//.word 0xdbd533e5 -//.word 0x5b87ca5f -//.word 0x72f0c11c -//.word 0x93cac0b7 -//.word 0x38b2c1d4 -//.word 0xcc7b130d -//.word 0xc9c8a530 -//.word 0x1eda81a7 -//.word 0xd3a69737 -//.word 0xef2bbcee -//.word 0x9a02f256 -//.word 0x7f37eaef -//.word 0x7457c7dc -//.word 0x5dca25dd -//.word 0x4d635a7d -//.word 0xef36fb8d -//.word 0x25aaa3d0 -//.word 0xeecfeff8 -//.word 0x8df1cdd1 -//.word 0xe86df7bd -//.word 0x2ec3ba60 -//.word 0xbcedfc9c -//.word 0x42ef7dc0 -//.word 0x21b05dfc -//.word 0x1808df19 -//.word 0x201a6c66 -//.word 0x94e4dbf6 -//.word 0x9514ef08 -//.word 0xad1d21c7 -//.word 0xb28ba034 -//.word 0xee939760 -//.word 0x7cefaede -//.word 0xf5e9d378 -//.word 0x4db53a21 -//.word 0xf703a22b -//.word 0x50d5dbba -//.word 0x3a8e8579 -//.word 0x074c1a8b -//.word 0x9a782fc5 -//.word 0xc89cf61a -//.word 0x04740856 -//.word 0x3c476110 -//.word 0xfe77acd9 -//.word 0xdf58c2ba -//.word 0x1d3e6dde -//.word 0x83da718b -//.word 0x8dc6cd57 -//.word 0xcd5e3e98 -//.word 0x8dd2051c -//.word 0xb679ea1a -//.word 0xf1688169 -//.word 0x0b44acf0 -//.word 0x9e54615e -//.word 0xeedaad1b -//.word 0x11a4f97e -//.word 0x53de8d40 -//.word 0xd82a5230 -//.word 0x83f3dc29 -//.word 0x17fda741 -//.word 0x9c41a144 -//.word 0x05f9e961 -//.word 0x0ff7d722 -//.word 0x6c3a3ca2 -//.word 0x21c3ebfa -//.word 0x2da578fc -//.word 0x6b5c3f24 -//.word 0xb95fa8cb -//.word 0x5af9aa9e -//.word 0x99548e4f -//.word 0xafd7f68a -//.word 0xe7b11d2b -//.word 0x00b660ae -//.word 0xd36bfee6 -//.word 0x365c1cf2 -//.word 0x1fb60c6e -//.word 0x0d11cee6 -//.word 0xa38ed790 -//.word 0x9622123a -//.word 0xca312581 -//.word 0xb85ff544 -//.word 0x13a36c58 -//.word 0xab9d7a7d -//.word 0x91295991 -//.word 0x7c341604 -//.word 0x6bce4d8c -//.word 0x8c81341a -//.word 0x5de1da0c -//.word 0x1165b1a4 -//.word 0x35754bb9 -//.word 0x93c461ac -//.word 0x57e0199e -//.word 0x700888e0 -//.word 0x393d76ab -//.word 0x599b6212 -//.word 0xe8eac634 -//.word 0xd3719db6 -//.word 0x810a2171 -//.word 0xb67cd967 -//.word 0xb804d3fc -//.word 0xb1352f63 -//.word 0x5503dd56 -//.word 0xc41aa60a -//.word 0xb2747162 -//.word 0xc52abf63 -//.word 0x3e8a79e8 -//.word 0xdc6beb96 -//.word 0xfdbd1013 -//.word 0x07641073 -//.word 0x064707f3 -//.word 0x97a308ea -//.word 0x04a662fc -//.word 0xb0392191 -//.word 0xb61dd885 -//.word 0xcd399e22 -//.word 0x6f32574b -//.word 0x3a3d35f9 -//.word 0x96317eec -//.word 0x98e18f9a -//.word 0x26a8216c -//.word 0x5c45cb29 -//.word 0x2fe9c8b2 -//.word 0x508ffbf1 -//.word 0x538c300c -//.word 0x1167a5de -//.word 0x4beac9a7 -//.word 0x90794302 -//.word 0x60a33618 -//.word 0x91f7c314 -//.word 0xf219d0d7 -//.word 0x2f1508ec -//.word 0xf4f223be -//.word 0x558b6808 -//.word 0x6e9a708e -//.word 0x46162c0b -//.word 0xfabf2a6a -//.word 0x17f71338 -//.word 0x47d3795a -//.word 0x3072cffb -//.word 0x998db9c9 -//.word 0xce508761 -//.word 0x4668fb07 -//.word 0x845e539b -//.word 0x3b2383c8 -//.word 0xb5ecc37f -//.word 0x753f49a4 -//.word 0x1c4e5807 -//.word 0x89857995 -//.word 0x445f09d0 -//.word 0x1d7df37c -//.word 0x10f9bf9b -//.word 0x6cf8cc9c -//.word 0x357ed9d0 -//.word 0xc687ca1d -//.word 0xba53a9f6 -//.word 0x0d01ec8a -//.word 0x7f5ff63c -//.word 0x3901e054 -//.word 0xb39078f4 -//.word 0xd5658a4d -//.word 0x5d565f12 -//.word 0x80d0842d -//.word 0xd427ccb2 -//.word 0x6d299811 -//.word 0x46f9568f -//.word 0xe31b48f7 -//.word 0x35cb878c -//.word 0xbe934743 -//.word 0xf61c5c2f -//.word 0xec45fe3d -//.word 0x3072c921 -//.word 0xf1260790 -//.word 0x63d532b0 -//.word 0x63f3b5cd -//.word 0x5e51f34d -//.word 0x6fa98ae6 -//.word 0xc778d90e -//.word 0x520bc0b3 -//.word 0x98dda62d -//.word 0xe120c171 -//.word 0x9c9a9187 -//.word 0x01b2ae3e -//.word 0xf6cbc41e -//.word 0x2fd0dc9e -//.word 0x9a10dd97 -//.word 0xfa4d52f9 -//.word 0xd10f6dbd -//.word 0x843e4c1a -//.word 0xbaf07cfc -//.word 0x0580bcb2 -//.word 0xc4e003e6 -//.word 0x4830c4d3 -//.word 0x358f70b2 -//.word 0x2b313d75 -//.word 0xa6b126b8 -//.word 0x23a932f5 -//.word 0x8581faf7 -//.word 0xb6846591 -//.word 0x9139b78f -//.word 0x00f0caed -//.word 0x619b9a47 -//.word 0x2fdf0891 -//.word 0xde6bd708 -//.word 0x0689fb68 -//.word 0xc4f21360 -//.word 0x5ee73443 -//.word 0x257de800 -//.word 0xa0397654 -//.word 0xe6dc643e -//.word 0x4c803bb4 -//.word 0x40e48a94 -//.word 0x75052ddd -//.word 0x41eecf1f -//.word 0x43d0ae30 -//.word 0x48559e21 -//.word 0x6f325170 -//.word 0x8cfcd57f -//.word 0xcb3c5e45 -//.word 0x96c54644 -//.word 0xb84552bb -//.word 0xc21b371c -//.word 0xad685dc0 -//.word 0xc269e2da -//.word 0xb704e2aa -//.word 0x1ba0f6f3 -//.word 0xf43afaae -//.word 0xa6b51400 -//.word 0x1672f16a -//.word 0x10215240 -//.word 0xe6d7c85c -//.word 0x5a60bb13 -//.word 0xbed6b168 -//.word 0x5a72cd80 -//.word 0x0ea39656 -//.word 0x395dfbb0 -//.word 0xd9b49352 -//.word 0xf3a92971 -//.word 0x3544776a -//.word 0xdae332b4 -//.word 0xced14713 -//.word 0x121a650f -//.word 0x639ebba5 -//.word 0x1665033c -//.word 0x4732bfdb -//.word 0x325bc298 -//.word 0xe1d7f354 -//.word 0x08994ea5 -//.word 0x2d1c2b14 -//.word 0x0b40c389 -//.word 0x3954f003 -//.word 0x0774348c -//.word 0xa915fd6d -//.word 0x97de279e -//.word 0x33bac380 -//.word 0xac2b17ce -//.word 0x23e1e5d1 -//.word 0x0d8bf1d4 -//.word 0xd9edbdd8 -//.word 0xd2329789 -//.word 0x4684d570 -//.word 0xe8db6069 -//.word 0x73126f58 -//.word 0x90409518 -//.word 0xfa45feb4 -//.word 0xe0a3f6da -//.word 0x8b90aa8c -//.word 0x40493319 -//.word 0x68a8d04c -//.word 0xeef973e3 -//.word 0xe90a8042 -//.word 0x7b81d169 -//.word 0xf872fd24 -//.word 0x4b31da81 -//.word 0x96654087 -//.word 0x195e1025 -//.word 0x55a97569 -//.word 0x71e16af3 -//.word 0xdcc77d80 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00003898 -//// expected output -//.word 0x838f9763 -//.word 0x08b3e384 -//.word 0x71c3b4d8 -//.word 0xe5422312 -//.word 0xe4f56429 -//.word 0xb381f91b -//.word 0x39bd27aa -//.word 0x471e91a6 -//.word 0xe3ad8e31 -//.word 0x3c64e698 -//.word 0x7792416c -//.word 0x44a2a0e0 -//.word 0x6afdae11 -//.word 0xa946af8b -//.word 0x12c62f57 -//.word 0xaf73cad9 -//// SHA512LongMsgvector_18 -//// vector length -//.word 0x00003BB0 -//// input message -//.word 0xd2860f79 -//.word 0x59d1d18e -//.word 0x4ba3a08b -//.word 0x56c5b713 -//.word 0x9aa16488 -//.word 0x0349012f -//.word 0xd7bb268e -//.word 0x8b641d19 -//.word 0xdbe2960e -//.word 0x1a0e9c9e -//.word 0xc63ac84d -//.word 0x5fb7b59b -//.word 0x799bb3e4 -//.word 0x11c0c085 -//.word 0x1d10b440 -//.word 0x6600bbe2 -//.word 0x9a5b0822 -//.word 0x9d41c8cd -//.word 0x216f5520 -//.word 0x76c1ad75 -//.word 0xa3f42223 -//.word 0xb5b1539f -//.word 0x57c75ae7 -//.word 0xa3b94720 -//.word 0x3878ce7d -//.word 0x8d713c64 -//.word 0x85caafcc -//.word 0x43e987ea -//.word 0x3f37180c -//.word 0x9923a1c5 -//.word 0xae69824a -//.word 0xea94a91c -//.word 0xddc14ee7 -//.word 0x90a7e0aa -//.word 0x19d43f19 -//.word 0x6d392b40 -//.word 0x76e9fd68 -//.word 0x651e943e -//.word 0x4a7d9332 -//.word 0xe19bca1e -//.word 0xafbff128 -//.word 0x4eea9ce9 -//.word 0x06146bcf -//.word 0x9db981bf -//.word 0x6f9438ff -//.word 0xc1ab1354 -//.word 0x528bf567 -//.word 0x33d5906d -//.word 0xd9f91f07 -//.word 0x71425867 -//.word 0x73139cb5 -//.word 0x7a7072b1 -//.word 0x53bf3399 -//.word 0x53d0074d -//.word 0xee1c0fb1 -//.word 0x864ae453 -//.word 0x81f8414e -//.word 0x9eb7fc6e -//.word 0x89573b94 -//.word 0xad66e45c -//.word 0x49f355fe -//.word 0xc6975672 -//.word 0x48b74bd8 -//.word 0x8303af16 -//.word 0xd042bdc3 -//.word 0x7f527044 -//.word 0x6f6aae34 -//.word 0xdda3c00a -//.word 0x7ab706f5 -//.word 0xc008e90b -//.word 0x85e410a3 -//.word 0xd107d7ff -//.word 0xed61fd2f -//.word 0xbc1a9c31 -//.word 0x4ed45f5d -//.word 0xb330ef01 -//.word 0x0d93ae48 -//.word 0xe92aa860 -//.word 0xd02bc7db -//.word 0x185e4656 -//.word 0x00dd6759 -//.word 0xfd18697f -//.word 0x4e1bb4d7 -//.word 0xd6145889 -//.word 0x2b0fb5bd -//.word 0xeb057bb8 -//.word 0x4f15d648 -//.word 0x0211e263 -//.word 0x333c650b -//.word 0xe952bd74 -//.word 0x96c91769 -//.word 0xf057e2ec -//.word 0xfcb4841d -//.word 0x6ba14b5d -//.word 0x2a29a6b2 -//.word 0x3527956d -//.word 0xac085e0b -//.word 0x28d2825a -//.word 0x4f65efdd -//.word 0xa6027770 -//.word 0xa709812f -//.word 0x1407fe95 -//.word 0x8aef9fe1 -//.word 0x59a845be -//.word 0x93c8ba22 -//.word 0x63a09e77 -//.word 0xa078a4f9 -//.word 0xa21bfe5f -//.word 0x559715bd -//.word 0x8b3e7ea9 -//.word 0x97f0299d -//.word 0x179ddc9c -//.word 0x1105e018 -//.word 0x42c2fb14 -//.word 0xb2899e86 -//.word 0x8cad5eff -//.word 0x2de4a88d -//.word 0x7b4eb1e1 -//.word 0x78b3adad -//.word 0x170d4150 -//.word 0x4e463ab5 -//.word 0x6c427f78 -//.word 0xad20444b -//.word 0x0bbd8199 -//.word 0x587aa369 -//.word 0x8a408184 -//.word 0x56c191da -//.word 0x00005c22 -//.word 0x71132fc1 -//.word 0x8a2714ed -//.word 0xb8c60012 -//.word 0xc8554e74 -//.word 0xfde16c17 -//.word 0x601bd5dc -//.word 0x58a03fec -//.word 0x7a7e1559 -//.word 0xa2f42703 -//.word 0x437aa1b9 -//.word 0xfb0139a1 -//.word 0x6b7cadda -//.word 0x459f6d5f -//.word 0xa6e7942f -//.word 0xa7da1dab -//.word 0x2f90543f -//.word 0x0b728a44 -//.word 0x40420d25 -//.word 0x9f5c58c1 -//.word 0x9b3b8611 -//.word 0x583e0d0b -//.word 0x04aca8c6 -//.word 0x6af795de -//.word 0xc43d011a -//.word 0xd114c14c -//.word 0x28874279 -//.word 0xcc5cc33a -//.word 0x0099c162 -//.word 0x5d46b3e1 -//.word 0x2173f8e9 -//.word 0xca7d0e4f -//.word 0xe48e0433 -//.word 0x1f6332e3 -//.word 0xa45227fd -//.word 0xa98be3d4 -//.word 0x439e4715 -//.word 0x7c3dc9ab -//.word 0xa6436cdf -//.word 0xeff6f0c4 -//.word 0x358945d2 -//.word 0x1be646d1 -//.word 0x5caaa4f9 -//.word 0x5f702057 -//.word 0x0c52fe72 -//.word 0xdfadb62f -//.word 0x3a25ecf2 -//.word 0x00e9a206 -//.word 0x5f38ad3f -//.word 0xed2565dd -//.word 0xf797a1b4 -//.word 0x1593e38a -//.word 0x02becfc1 -//.word 0xab1de236 -//.word 0x86206068 -//.word 0x25df8edd -//.word 0x0ba322c1 -//.word 0xbea8f8d1 -//.word 0x1e210677 -//.word 0xf47d9236 -//.word 0xcee9a249 -//.word 0x0b16b587 -//.word 0x323cb08a -//.word 0x885f1b10 -//.word 0xe1d18da1 -//.word 0xb6f86573 -//.word 0x7851bb8a -//.word 0x24b59723 -//.word 0x18db6053 -//.word 0x251f97ec -//.word 0xe581c5a0 -//.word 0x4ef1b169 -//.word 0x88cad728 -//.word 0xfc9c168c -//.word 0xae2ea935 -//.word 0xccc35819 -//.word 0x879def27 -//.word 0x21c0f02b -//.word 0x47f885f2 -//.word 0xa21db8ae -//.word 0xa996e69b -//.word 0xb91c71e3 -//.word 0x67c0b6c0 -//.word 0x15303fe0 -//.word 0xc336390d -//.word 0x2881280d -//.word 0x01a8d9c7 -//.word 0xaa6c98a8 -//.word 0xeb3ea445 -//.word 0x1401e042 -//.word 0x4c10cb72 -//.word 0x2683b23f -//.word 0x75ae254d -//.word 0x62eba75a -//.word 0xbb9aa969 -//.word 0x8e65ba1f -//.word 0xf7c9f86d -//.word 0x36d1ca6f -//.word 0x0425d194 -//.word 0x28441b00 -//.word 0x450e9a2e -//.word 0xf685d5da -//.word 0x1cd4de1e -//.word 0x779184db -//.word 0x743fc95a -//.word 0x46179733 -//.word 0x3808ae6e -//.word 0x42fce1e9 -//.word 0xda5d82f9 -//.word 0x0cd71b54 -//.word 0xcd605e2f -//.word 0x8d765fa3 -//.word 0x0ba80155 -//.word 0x6d58ae56 -//.word 0x90bf4c48 -//.word 0x9d326cc3 -//.word 0xdda3c4f7 -//.word 0xce6adf92 -//.word 0x764613e4 -//.word 0xf79eb440 -//.word 0x640d87a6 -//.word 0xd31e79a0 -//.word 0xb354916a -//.word 0x606e2455 -//.word 0xf5e8486d -//.word 0x62c58a5a -//.word 0xbe8ce484 -//.word 0xde91e97b -//.word 0x26754395 -//.word 0x9ff05fd9 -//.word 0x4ace671b -//.word 0xb4387169 -//.word 0xcb35f6a6 -//.word 0xf0718575 -//.word 0x4d3cb859 -//.word 0x69d5681a -//.word 0xf9e91d6a -//.word 0xfa57c8c8 -//.word 0xfc36b5a5 -//.word 0xc119bbc5 -//.word 0x0691b6e9 -//.word 0xa1f437ab -//.word 0xcc5d79a9 -//.word 0xc1f497e5 -//.word 0x8770fd6c -//.word 0x0bda1c36 -//.word 0x7293634e -//.word 0xae986a32 -//.word 0x4f05707d -//.word 0x9cd807c3 -//.word 0xe3f80ebd -//.word 0x0d76e0a6 -//.word 0x7512cbe4 -//.word 0xfb01c4eb -//.word 0x54ed585f -//.word 0xa43ee678 -//.word 0x4e980cab -//.word 0x0aa45f87 -//.word 0x39145fdd -//.word 0x76e1aa23 -//.word 0x6ed76f1a -//.word 0xf15426af -//.word 0x494d7e1f -//.word 0xca91975f -//.word 0xaa5272bb -//.word 0x13e1a6bd -//.word 0x77b95450 -//.word 0x24bf5c25 -//.word 0x18c8d156 -//.word 0x165cab4a -//.word 0xf9babcd8 -//.word 0x491be6af -//.word 0x0c3b8af5 -//.word 0xde16432e -//.word 0x44efd560 -//.word 0x3e976074 -//.word 0x1becdae0 -//.word 0x91a0bb83 -//.word 0x0d3cfad0 -//.word 0x4864392f -//.word 0x1b5c3da0 -//.word 0x94cba0a2 -//.word 0x49bfca53 -//.word 0xecf21dd8 -//.word 0x204c70ff -//.word 0x8ba8bf23 -//.word 0x2ddb2051 -//.word 0xf0f2f9a8 -//.word 0x80bc7106 -//.word 0x5c8924e1 -//.word 0x2e301b72 -//.word 0x5857fb19 -//.word 0xcfee7cfd -//.word 0x2cfd1df3 -//.word 0x00a017a1 -//.word 0x684f8fe3 -//.word 0xe2630f6d -//.word 0x5fd637b2 -//.word 0x9a4bb005 -//.word 0xa74e62fe -//.word 0xcfdce720 -//.word 0x9b263fb8 -//.word 0x2f92c508 -//.word 0xd90361a5 -//.word 0xea5a001e -//.word 0xc53d41de -//.word 0x35177154 -//.word 0x045fba51 -//.word 0xc91e97b1 -//.word 0x01ab8b3d -//.word 0x61b913d0 -//.word 0x6b94d9b9 -//.word 0x40a82a61 -//.word 0xb543aa2e -//.word 0xa89c47a6 -//.word 0x95136bd8 -//.word 0x64ba76f7 -//.word 0x85156b49 -//.word 0x3f1ee93f -//.word 0x458c5ee6 -//.word 0x8b55777e -//.word 0x5772db67 -//.word 0x9be21845 -//.word 0x82f1dd5c -//.word 0x49ba6b3c -//.word 0x50eb46a3 -//.word 0x71c8309f -//.word 0x907357f3 -//.word 0x736acebc -//.word 0xd4513a54 -//.word 0xb5f2ce77 -//.word 0xf48279a4 -//.word 0x1f255dc6 -//.word 0x89b58414 -//.word 0x9ebfce36 -//.word 0x73cf2ea9 -//.word 0xa2ee1664 -//.word 0x546830bc -//.word 0x9fd34f85 -//.word 0x134ca57a -//.word 0x8f0436df -//.word 0x59fc8c64 -//.word 0x6e0cad4d -//.word 0x172a4ad0 -//.word 0xbde939be -//.word 0xfe402666 -//.word 0x018d85b7 -//.word 0x06d9caa4 -//.word 0x415eddcd -//.word 0xe846c85b -//.word 0x8bb6b32b -//.word 0xa40b1330 -//.word 0x6f641e12 -//.word 0xfb60821b -//.word 0x81295654 -//.word 0xf6b151eb -//.word 0xdc3b3ad8 -//.word 0x5d1e9fc0 -//.word 0x9ac5ca1a -//.word 0x41fbf190 -//.word 0x5d65ada8 -//.word 0x7350ada3 -//.word 0xcaaeaca6 -//.word 0x0a5aa017 -//.word 0x09a4354a -//.word 0xe109795d -//.word 0x4642d960 -//.word 0x16814cb9 -//.word 0x32f7cec7 -//.word 0x8d9910c6 -//.word 0x82246ef3 -//.word 0x6b5e21f0 -//.word 0x6f9fb669 -//.word 0x9b91bef8 -//.word 0x3434c846 -//.word 0x4c258c74 -//.word 0x941f69b9 -//.word 0x71c2124c -//.word 0x52938484 -//.word 0x40453b3d -//.word 0xb737a57f -//.word 0xb43dd75a -//.word 0x0fa37f14 -//.word 0x0b6f1987 -//.word 0x2ce766c4 -//.word 0x48531afc -//.word 0xe104d5a1 -//.word 0xb29555c8 -//.word 0x8871ead2 -//.word 0x53952a4b -//.word 0x7d98e512 -//.word 0x7ae85cba -//.word 0xa156ad31 -//.word 0x3ad5929f -//.word 0xd87e4b91 -//.word 0xe9d8d957 -//.word 0x8b576daa -//.word 0xa1222093 -//.word 0x2619e488 -//.word 0xc217bbd7 -//.word 0x9b742748 -//.word 0x6ecfe1fd -//.word 0xde0acd9e -//.word 0x0c952eb3 -//.word 0x67f01751 -//.word 0xc66b22f9 -//.word 0xb43163bd -//.word 0x0a849fa4 -//.word 0xc44aba50 -//.word 0x0dc96fde -//.word 0x9caf440e -//.word 0x4355bca4 -//.word 0xc544ce0e -//.word 0xe9f99646 -//.word 0xcce54bfa -//.word 0x7bb871eb -//.word 0xc1df4f93 -//.word 0x3e4ba40a -//.word 0xb975962a -//.word 0xb89febf2 -//.word 0x4d5c7b28 -//.word 0x3252e542 -//.word 0x183f8287 -//.word 0x3d3a9772 -//.word 0x3d3ccf57 -//.word 0x2adee848 -//.word 0xde64ac3a -//.word 0x90fb2364 -//.word 0xa63f07e8 -//.word 0xca0078b5 -//.word 0x4046f1ac -//.word 0x77927b02 -//.word 0xde6720e5 -//.word 0xf809a362 -//.word 0xb3856e86 -//.word 0xf6f1ccc3 -//.word 0x79f55896 -//.word 0xd98bb667 -//.word 0xec0280b1 -//.word 0x52498362 -//.word 0x4c6a2c85 -//.word 0xd1553d1e -//.word 0xdfdfc455 -//.word 0x100a4ed7 -//.word 0x6d87587a -//.word 0x86790620 -//.word 0xc37c18dd -//.word 0xf5e6195c -//.word 0x304dd97e -//.word 0xdd491e45 -//.word 0x0b7a8000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00003BB0 -//// expected output -//.word 0xa163a713 -//.word 0x6bcc9258 -//.word 0x9303cb15 -//.word 0xe26bc6ba -//.word 0x7abd91b8 -//.word 0xed194e2a -//.word 0xde3d47f3 -//.word 0x81191dc4 -//.word 0x02e336c4 -//.word 0xc1aa8c0f -//.word 0x9a2ef414 -//.word 0x9b1e3c24 -//.word 0x52d195d3 -//.word 0x6aa3b964 -//.word 0x51e5059f -//.word 0x5985ca19 -//// SHA512LongMsgvector_19 -//// vector length -//.word 0x00003EC8 -//// input message -//.word 0xc7fb2a67 -//.word 0xc42197c1 -//.word 0x1457c8fc -//.word 0x39a2f974 -//.word 0xf2577b44 -//.word 0xbc8e5a5b -//.word 0x97d43ed3 -//.word 0x0d208f7e -//.word 0x7109dcc1 -//.word 0x65357ea5 -//.word 0x9e15782b -//.word 0xeccfa2e0 -//.word 0x747c07b2 -//.word 0x40948b02 -//.word 0xfba6d1fa -//.word 0xf54d5b21 -//.word 0x6e5ff32c -//.word 0x10674a18 -//.word 0xbd56e075 -//.word 0x8b752305 -//.word 0x0d9edb85 -//.word 0xd5acc5cb -//.word 0x36307e11 -//.word 0x4f66a391 -//.word 0x44673752 -//.word 0xcf9f4541 -//.word 0xf882c683 -//.word 0x207bc40a -//.word 0x4425c066 -//.word 0x80be52de -//.word 0xd2d90fc0 -//.word 0x2152aff5 -//.word 0x7e8770d8 -//.word 0xa9c5b549 -//.word 0xd701f3fc -//.word 0xb2c9cd17 -//.word 0xa27a7efd -//.word 0x4bb27864 -//.word 0x57084aae -//.word 0x75fbc776 -//.word 0xa1296569 -//.word 0xa7c2e357 -//.word 0xe23b2f89 -//.word 0x4a478656 -//.word 0xae03ddf1 -//.word 0x3d708085 -//.word 0x4b27f984 -//.word 0x5248333c -//.word 0x37b4dfab -//.word 0xcf7c1794 -//.word 0xa29941d2 -//.word 0xefdd37ed -//.word 0xf029a5eb -//.word 0x5ee1b268 -//.word 0x389de2e9 -//.word 0xc1213a6e -//.word 0xc890a646 -//.word 0x2bdc9927 -//.word 0x9e81f37e -//.word 0xa9732704 -//.word 0xf0549d92 -//.word 0xb7eb5536 -//.word 0xa5d2ce86 -//.word 0xc86e2634 -//.word 0xda2482e3 -//.word 0xc3cab039 -//.word 0x5e5c0b36 -//.word 0x80f19fc4 -//.word 0x37ed8e8f -//.word 0x4f77b316 -//.word 0x1b2e8403 -//.word 0x72173db7 -//.word 0xf7da3b2a -//.word 0x9d2fa5f2 -//.word 0x6b9352a1 -//.word 0x7d3fe754 -//.word 0x4c5a4089 -//.word 0x2f6e1231 -//.word 0x2119ce07 -//.word 0xc405c81f -//.word 0xa61998c2 -//.word 0xc3f1c079 -//.word 0x4c8c9068 -//.word 0xa74547dd -//.word 0xb7057b29 -//.word 0x5db6bbaf -//.word 0x3ffb723a -//.word 0xc81e0e94 -//.word 0x704a6254 -//.word 0x3dfa49f7 -//.word 0x89b18d32 -//.word 0x07ec0787 -//.word 0x01540717 -//.word 0xe339f6b7 -//.word 0xfd3c3945 -//.word 0x854b593d -//.word 0xdbd36187 -//.word 0x11308893 -//.word 0xab6910a8 -//.word 0xa31a6e79 -//.word 0xb1b1abfa -//.word 0xc9dd0a71 -//.word 0xe444ebd0 -//.word 0x0375ef42 -//.word 0x711d5d04 -//.word 0x497dc576 -//.word 0x391be372 -//.word 0x85b8c5dc -//.word 0x4f83307a -//.word 0x158c4106 -//.word 0x7b7b5082 -//.word 0x4b8219cc -//.word 0xba901e72 -//.word 0xedc847c7 -//.word 0xbb31cc37 -//.word 0xb5af54d7 -//.word 0x63325f40 -//.word 0xd12de19e -//.word 0x4a4a2f04 -//.word 0x645c1f03 -//.word 0x3d946b7a -//.word 0x03f957af -//.word 0xba12949f -//.word 0x39e56393 -//.word 0x7626fef4 -//.word 0x04a83360 -//.word 0xda1752fd -//.word 0x56e9490e -//.word 0x82920ec4 -//.word 0x95f73d56 -//.word 0xbd260354 -//.word 0x1b443a38 -//.word 0x0fc6d53e -//.word 0xb7e57f75 -//.word 0xb24b7f16 -//.word 0x2a13df15 -//.word 0x11f0cdf7 -//.word 0xaaac41e3 -//.word 0x4cd5e0fb -//.word 0x63b321ed -//.word 0xb77caec4 -//.word 0xf1cb0d05 -//.word 0x5b4f7ff7 -//.word 0xe7c02842 -//.word 0x731871bb -//.word 0x4bffab7f -//.word 0xef87f53f -//.word 0x17195fda -//.word 0xf5b04f31 -//.word 0xba442437 -//.word 0x5b8a1a47 -//.word 0x95da6dbb -//.word 0x2f70c2ba -//.word 0x7fd8c251 -//.word 0x2fa408c5 -//.word 0x41603d28 -//.word 0x51c8812b -//.word 0x1a380d33 -//.word 0x3c6317af -//.word 0x3d48f6a8 -//.word 0xcd628799 -//.word 0x4e1fcf82 -//.word 0x9394e238 -//.word 0xe86f03ff -//.word 0x532d0c5a -//.word 0x1a8d1122 -//.word 0x854440d6 -//.word 0xe5f20b32 -//.word 0xd5558a03 -//.word 0xc0bc1a39 -//.word 0xa4bf4b3e -//.word 0x152ef986 -//.word 0x8447b868 -//.word 0xc12c762c -//.word 0xbf945b65 -//.word 0x98c0f481 -//.word 0xd0b1919e -//.word 0xde98eb9f -//.word 0xe88e0a7f -//.word 0xcf8566e6 -//.word 0x6b7e4dfa -//.word 0x18fd8478 -//.word 0x71ba3103 -//.word 0x5b9af8bc -//.word 0x46dd6512 -//.word 0xaf998adc -//.word 0xe967e9a5 -//.word 0x1e5c9446 -//.word 0x913b92bb -//.word 0x25e8852f -//.word 0x23208a59 -//.word 0x3868610b -//.word 0xbd43ce08 -//.word 0x3ba83e17 -//.word 0x2fb3ae55 -//.word 0x0a9bc9cf -//.word 0x7ce45050 -//.word 0xf2d6bf78 -//.word 0x5e2d2e0e -//.word 0x36127597 -//.word 0xbf4a9328 -//.word 0x8bae5178 -//.word 0x40db2239 -//.word 0x9c2a4ea9 -//.word 0xb6e34f64 -//.word 0x87ad7b7c -//.word 0xa849e4cb -//.word 0x5d807d88 -//.word 0xd35a7e19 -//.word 0xa6910928 -//.word 0xa6450df9 -//.word 0xdbf16bfb -//.word 0xc79e579d -//.word 0xea570162 -//.word 0x8cdc7538 -//.word 0xb69bc006 -//.word 0x82db5584 -//.word 0x943baf4f -//.word 0xe95b373d -//.word 0xd0d967ed -//.word 0x357f30a3 -//.word 0x25ba9953 -//.word 0x8f4eaafc -//.word 0x48498838 -//.word 0x5235e110 -//.word 0x5e928a14 -//.word 0x8f8467ac -//.word 0x81c88ca9 -//.word 0x8aeca11f -//.word 0x40c08b77 -//.word 0x3b0849c0 -//.word 0x1c731b46 -//.word 0xcdd1ea66 -//.word 0x0b80e4a0 -//.word 0x222767ee -//.word 0xf8a72054 -//.word 0x4d4f74b9 -//.word 0x41501ef5 -//.word 0x17701a2b -//.word 0x3802c259 -//.word 0x7b15382d -//.word 0xa3ec031b -//.word 0x2aaefdac -//.word 0x3d5f6c19 -//.word 0x070f6f18 -//.word 0x32519cf6 -//.word 0xabefe7e6 -//.word 0xa6dcc599 -//.word 0xe36a920e -//.word 0x2fbd30ac -//.word 0x2d80f28e -//.word 0x56d6b81e -//.word 0x3f945be5 -//.word 0x1aad4ba1 -//.word 0x80ee7698 -//.word 0x6eeb6c2d -//.word 0x8d39c1b1 -//.word 0xb6ddb37b -//.word 0xb5050d3b -//.word 0x4df64c8b -//.word 0x7d46ffc7 -//.word 0x024b741f -//.word 0x1dd390ea -//.word 0x9615ff3d -//.word 0x01e88ebd -//.word 0x4033d4b1 -//.word 0x49a5185c -//.word 0x2aa66f89 -//.word 0x4a8d2567 -//.word 0xf1135e97 -//.word 0x0a07fd84 -//.word 0x2844c5f3 -//.word 0xc8e1bedb -//.word 0xd6a7db76 -//.word 0x72c8d998 -//.word 0xf3cd6a40 -//.word 0x2cd1936c -//.word 0xefed5332 -//.word 0xd0f3850d -//.word 0x2b5f0775 -//.word 0x698a1cb2 -//.word 0x7e210ff1 -//.word 0xb6d61a98 -//.word 0xb25585d7 -//.word 0xad7a127f -//.word 0x05c19918 -//.word 0xf6fef02e -//.word 0xa84e0deb -//.word 0x6c4d6feb -//.word 0x4289ba4b -//.word 0xa037a103 -//.word 0x6e250876 -//.word 0x55f06a48 -//.word 0x39777970 -//.word 0x048f058e -//.word 0xa6f91f7e -//.word 0x5a917e2d -//.word 0x2ac722ab -//.word 0xb5533682 -//.word 0x30253b47 -//.word 0xab9b636e -//.word 0x95f73b62 -//.word 0x83108dd6 -//.word 0x2d488555 -//.word 0xb9bd1221 -//.word 0x3dc48f3a -//.word 0x7f93a3bd -//.word 0xff3d666f -//.word 0x37e4c59a -//.word 0x21292718 -//.word 0xfae851ad -//.word 0x4623869a -//.word 0x143bf36e -//.word 0x83664b20 -//.word 0x855daf5b -//.word 0xe355d019 -//.word 0x81315773 -//.word 0xe4f685b7 -//.word 0xf17f16bc -//.word 0xf7726c72 -//.word 0xf072e9bd -//.word 0x04969d84 -//.word 0x4f1a2105 -//.word 0xe455c26b -//.word 0x12ebe2a2 -//.word 0xe6449c6a -//.word 0xf03da7aa -//.word 0x4a1d7d07 -//.word 0xd7cabcb6 -//.word 0xc93dcc8e -//.word 0x6633c262 -//.word 0x0b25848d -//.word 0x717b2ece -//.word 0x2ffdb557 -//.word 0x808acb20 -//.word 0x470c0281 -//.word 0x50ab3300 -//.word 0xd9412168 -//.word 0x510e5a1b -//.word 0x5fae5ea8 -//.word 0x264703a0 -//.word 0xc80718a6 -//.word 0x28ce49c6 -//.word 0xf5274208 -//.word 0xe47d1844 -//.word 0x3c8ce437 -//.word 0x9815b1d7 -//.word 0xe8d698e4 -//.word 0xbab929c0 -//.word 0xb84c0d80 -//.word 0x7171ea43 -//.word 0x5c5787c2 -//.word 0x19a83129 -//.word 0xfb045d26 -//.word 0xc4af8e3f -//.word 0xaf867968 -//.word 0xb43867d5 -//.word 0x07b2dc0d -//.word 0xe2db7640 -//.word 0x848217da -//.word 0x7a944758 -//.word 0x1d93d35a -//.word 0x5c43bafa -//.word 0xbba74a5d -//.word 0x9c2b8787 -//.word 0xbd23cc74 -//.word 0x0374b564 -//.word 0x76913b76 -//.word 0x8caa2178 -//.word 0xaa2090fe -//.word 0xe83bfeb1 -//.word 0x151f54ea -//.word 0xfbfc4f80 -//.word 0xe38626de -//.word 0x5ca56e58 -//.word 0x396d3bbf -//.word 0xd9508932 -//.word 0xab92da38 -//.word 0xf0fe200c -//.word 0xc3d8dc38 -//.word 0x57128865 -//.word 0x81c23372 -//.word 0x76d46bc3 -//.word 0xd5fc5fdc -//.word 0xe8ef452e -//.word 0x27d3fa30 -//.word 0xfdf4e8b2 -//.word 0xcfb82d6f -//.word 0x3bd5fae1 -//.word 0x9dc13859 -//.word 0xd86b724e -//.word 0x5328eff5 -//.word 0x41f01e13 -//.word 0x26ca3810 -//.word 0x9685204c -//.word 0x40a98eb6 -//.word 0x2cad6c9a -//.word 0x416a80ba -//.word 0x0ad04ca1 -//.word 0xbad83234 -//.word 0x6db9dc8a -//.word 0xb05fdbfd -//.word 0x44198e81 -//.word 0x1f924635 -//.word 0xb402a738 -//.word 0x74a552be -//.word 0x956dc163 -//.word 0x12f471bf -//.word 0xf3b4473a -//.word 0xce7a2d21 -//.word 0x8e18fcfa -//.word 0x735a9e15 -//.word 0x5a3c7464 -//.word 0x3f5af58c -//.word 0x00a8983c -//.word 0x6363f4be -//.word 0x5b4826cc -//.word 0x870374a4 -//.word 0xfcea305f -//.word 0x44ebde7e -//.word 0xa6c399c6 -//.word 0xa871b24e -//.word 0xd3eb9bd6 -//.word 0xb60f035a -//.word 0x2edc43e7 -//.word 0xe4e2f9ae -//.word 0x16f7f257 -//.word 0x9b2c4e97 -//.word 0x2100de05 -//.word 0xbad3d129 -//.word 0x979d90d6 -//.word 0x12dfe6ba -//.word 0xf2da6434 -//.word 0xeb000465 -//.word 0x65a80c8a -//.word 0x7f053589 -//.word 0x52590dc9 -//.word 0x7a669a47 -//.word 0xd32540e7 -//.word 0x80bbe408 -//.word 0x32a9525a -//.word 0xa643dcf4 -//.word 0x706344a1 -//.word 0xf85edd7b -//.word 0xc237ecbc -//.word 0xf21354d0 -//.word 0x0fed73af -//.word 0x078b4769 -//.word 0x73b1d502 -//.word 0x1d94cb81 -//.word 0xbf916444 -//.word 0x0e1f8c96 -//.word 0xf7034584 -//.word 0x29c349ec -//.word 0xd35cf0d6 -//.word 0xaf375507 -//.word 0x3f5ab4d4 -//.word 0x57dc1735 -//.word 0xdb9b321a -//.word 0xca318b02 -//.word 0x7b23dec9 -//.word 0x275cbfc1 -//.word 0xa8da8105 -//.word 0x80a8570a -//.word 0x1d0cb977 -//.word 0x5c010937 -//.word 0x4be777cc -//.word 0x337a22e6 -//.word 0xd6017f34 -//.word 0xf5c7ff7a -//.word 0x15cfece4 -//.word 0x83c4949a -//.word 0x962faa94 -//.word 0x34ede9b0 -//.word 0x97dffa01 -//.word 0x51e3986a -//.word 0x8e03f26c -//.word 0x9aed513d -//.word 0xa3a3fa1a -//.word 0xbf7456dd -//.word 0x312b50d2 -//.word 0xe886ffc7 -//.word 0x48ea8562 -//.word 0x2d5437b8 -//.word 0x2d93fe1a -//.word 0x1eb5fc32 -//.word 0xd8bf7350 -//.word 0x3ca1e3fe -//.word 0x766873da -//.word 0x7eb692a5 -//.word 0xe56fde97 -//.word 0xceb645f5 -//.word 0x3b186ae6 -//.word 0x8a064a83 -//.word 0x3f891f2d -//.word 0x03318523 -//.word 0xed4fdb53 -//.word 0x0163ec71 -//.word 0xf6d8ce47 -//.word 0x3def0b4c -//.word 0x3efaff77 -//.word 0xe5ca8155 -//.word 0x5d800000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00003EC8 -//// expected output -//.word 0x0a6bd4a3 -//.word 0xbe10c690 -//.word 0xba358fd4 -//.word 0xabe6bb3b -//.word 0x05c6e747 -//.word 0x62ddb16c -//.word 0x96122156 -//.word 0xc6104102 -//.word 0xa0f4da5d -//.word 0x119eae98 -//.word 0xc369b4a3 -//.word 0x9bc75f86 -//.word 0xf76b829c -//.word 0x7efa5d35 -//.word 0xb8c43dbc -//.word 0xe18a9c45 -//// SHA512LongMsgvector_20 -//// vector length -//.word 0x000041E0 -//// input message -//.word 0x11efc562 -//.word 0xe14f7a08 -//.word 0xdec506d1 -//.word 0x7a527d53 -//.word 0x7fe51ea0 -//.word 0x46c528cb -//.word 0x292ef0a8 -//.word 0x3a3f2fd4 -//.word 0x3614a0f5 -//.word 0xb42fcb43 -//.word 0xa21c1b48 -//.word 0xf25437e3 -//.word 0x91638f93 -//.word 0x994635f2 -//.word 0xc717ef80 -//.word 0x2fec8aa2 -//.word 0x2efc71eb -//.word 0xa1037e99 -//.word 0x54e80f63 -//.word 0xbe9d5d72 -//.word 0xeb4809ad -//.word 0xb9a0f839 -//.word 0x47996140 -//.word 0xab4324f2 -//.word 0xe3ef5eca -//.word 0x0e953a13 -//.word 0xdd720aaa -//.word 0x44f59605 -//.word 0x75dcb374 -//.word 0x0e9b18a7 -//.word 0x91fd6e71 -//.word 0x160da6cb -//.word 0x3c378f1c -//.word 0x65aba8b8 -//.word 0x230233a6 -//.word 0xed248aa6 -//.word 0x1769b672 -//.word 0x01fe3e45 -//.word 0x8e8b3d9a -//.word 0xd712b736 -//.word 0x211b2d68 -//.word 0x0d0e6f90 -//.word 0x0fe0b2de -//.word 0x21f1e25c -//.word 0xb9353a2f -//.word 0xf893111a -//.word 0x248af743 -//.word 0x581a003a -//.word 0x7ae26037 -//.word 0x6e8638a3 -//.word 0x8953b0da -//.word 0x49264630 -//.word 0x43896632 -//.word 0x5c203a2e -//.word 0x3c44c3f5 -//.word 0x00ed29df -//.word 0x2fd54f10 -//.word 0xf0daabfa -//.word 0x7aa45523 -//.word 0xcb895d28 -//.word 0x9dad6203 -//.word 0x966e6089 -//.word 0xbfffca36 -//.word 0x3752d92d -//.word 0x293c237b -//.word 0xfbd46f9c -//.word 0xc81cc840 -//.word 0x11e3d04f -//.word 0xafe9572a -//.word 0x0c452c34 -//.word 0x93043391 -//.word 0x6513b82d -//.word 0x4e5f0300 -//.word 0xf73a2d91 -//.word 0x5d0132b9 -//.word 0x81fb46aa -//.word 0x62856d2f -//.word 0x286c4636 -//.word 0xa29b278b -//.word 0xf2f66fe6 -//.word 0x87851828 -//.word 0x4cd58ce2 -//.word 0x1f9bba17 -//.word 0x859b6843 -//.word 0x9cc8cb9b -//.word 0x51ad5597 -//.word 0xd20bceae -//.word 0x47c4a660 -//.word 0xbdf78a7a -//.word 0x626d3596 -//.word 0xf83489e1 -//.word 0x8489de21 -//.word 0x46fc9af6 -//.word 0xeece015f -//.word 0x0d9e4f81 -//.word 0xca4404a4 -//.word 0xd6fe807f -//.word 0xa2cacfb5 -//.word 0xcf12c69f -//.word 0xe68e4f4c -//.word 0x496701c6 -//.word 0x6998f497 -//.word 0x3a9ad38c -//.word 0xe44032b9 -//.word 0xbce022bd -//.word 0x72b30348 -//.word 0x8b7e9ada -//.word 0x127264cd -//.word 0x8b512995 -//.word 0x29d3d347 -//.word 0x41488158 -//.word 0xfd7ed8a7 -//.word 0x55e599be -//.word 0x3bf17955 -//.word 0x16c02d18 -//.word 0x72fdc4ab -//.word 0xf60439ea -//.word 0x96474975 -//.word 0x0af0826c -//.word 0x7ec89d77 -//.word 0x8b570d0a -//.word 0x664dd8e7 -//.word 0x5720a6e4 -//.word 0x6df717ee -//.word 0x71c75a4e -//.word 0x18bbfc2b -//.word 0x7cdafd50 -//.word 0xcde42930 -//.word 0x447ca527 -//.word 0x598cc903 -//.word 0x36e62dc3 -//.word 0x6b27079f -//.word 0xe3e1b448 -//.word 0x17f99470 -//.word 0x814d1b8d -//.word 0x549a25da -//.word 0x6a9e8a9f -//.word 0x7e79f3b3 -//.word 0x9b59ec3f -//.word 0xd4563ac4 -//.word 0x369b6e60 -//.word 0xfbc7ba4d -//.word 0x009304aa -//.word 0x7ab4397e -//.word 0xe403e4fa -//.word 0x3cdbfffe -//.word 0x6ec208df -//.word 0x114c5868 -//.word 0x513db11e -//.word 0x2cee16c8 -//.word 0xe2f2df2f -//.word 0xa6f80c23 -//.word 0x9af3dabe -//.word 0xfa7994ed -//.word 0x9769ac2b -//.word 0x88d10a90 -//.word 0x1c0fa40b -//.word 0x13364fec -//.word 0x0db3d4a5 -//.word 0x423047d1 -//.word 0x74b89475 -//.word 0x221c5b86 -//.word 0xff96feac -//.word 0xa2adf846 -//.word 0x7f5870ae -//.word 0x16660dbe -//.word 0x6a1d0d93 -//.word 0xb5229190 -//.word 0x5a993ba6 -//.word 0x1b8cfbd3 -//.word 0x8c9126e9 -//.word 0xc7a7c991 -//.word 0x62623c8f -//.word 0x9e48fa48 -//.word 0xe17aaf81 -//.word 0x67979369 -//.word 0x34ddf7da -//.word 0x4d911ddc -//.word 0x27a14d6b -//.word 0x6089257a -//.word 0xad733137 -//.word 0x14a2bc91 -//.word 0x5b10e5f7 -//.word 0xc056f563 -//.word 0xeacdef98 -//.word 0x20f369a8 -//.word 0xb9109bb8 -//.word 0xd319b607 -//.word 0x48d4772d -//.word 0xde3dfba1 -//.word 0xbe29d57e -//.word 0x28295e87 -//.word 0x64b14c68 -//.word 0xfc79863f -//.word 0x2824375a -//.word 0x8a202142 -//.word 0x1bcd35f9 -//.word 0x66e16081 -//.word 0xf40ba79d -//.word 0x07d676dc -//.word 0x8bd135d2 -//.word 0x49ed1da9 -//.word 0x5e264ad9 -//.word 0xeb651133 -//.word 0x0fa59324 -//.word 0x12559238 -//.word 0xe3fe84dd -//.word 0xc526e66a -//.word 0x4574d35f -//.word 0x6f15d5ee -//.word 0x415dfbbb -//.word 0x60b22ce1 -//.word 0x0aa6ba35 -//.word 0x4c633ace -//.word 0x754c94c5 -//.word 0xcae15639 -//.word 0x7be34e96 -//.word 0xd6b95717 -//.word 0xbb13738a -//.word 0x50cd1a54 -//.word 0xf516d2b4 -//.word 0x7bd1004c -//.word 0x903bfedd -//.word 0x7ecf6d52 -//.word 0x1667cd00 -//.word 0xe6a34b2c -//.word 0xb38ed9cd -//.word 0x237f8494 -//.word 0xb93e022a -//.word 0x06688bb9 -//.word 0x1e15ebad -//.word 0x4ab7d4bc -//.word 0xfc467823 -//.word 0x089a5733 -//.word 0x1018560d -//.word 0x409012aa -//.word 0x3c66731e -//.word 0x57f0841d -//.word 0x062082be -//.word 0x9463337f -//.word 0x17c87889 -//.word 0xa2652636 -//.word 0xbcf712d1 -//.word 0x11c86b9d -//.word 0x68d64d18 -//.word 0xd5319280 -//.word 0x30a5ec97 -//.word 0xc59931a4 -//.word 0x4d37f5ba -//.word 0x1ecd5e3c -//.word 0x9e7334a1 -//.word 0xfdef3875 -//.word 0x24d5b7a0 -//.word 0xe8f35eeb -//.word 0x84eb50c0 -//.word 0x46227631 -//.word 0x88d9163d -//.word 0xe29aa84e -//.word 0x9ed6e505 -//.word 0x6ccc203a -//.word 0x57acd93f -//.word 0xf8fd9065 -//.word 0xea3cd7c2 -//.word 0x7ec6ab31 -//.word 0xaff80499 -//.word 0x5894ab73 -//.word 0xa4664c86 -//.word 0xc628ccf5 -//.word 0xeba4dc7c -//.word 0x6d18cff7 -//.word 0x4adea824 -//.word 0xd44c78a9 -//.word 0xaadae759 -//.word 0xe68210b3 -//.word 0x986d92ab -//.word 0x74cbe3ae -//.word 0xc703e8e0 -//.word 0xb00cc3a8 -//.word 0x8c1aed6e -//.word 0xb27e84a3 -//.word 0x61c7e602 -//.word 0xf62e7e16 -//.word 0x6231defd -//.word 0xdc7d0e6b -//.word 0xd31124f2 -//.word 0x27a11580 -//.word 0x9838cb29 -//.word 0x7f227826 -//.word 0xbc09291e -//.word 0xef5e9ea5 -//.word 0xebfb5903 -//.word 0x6706f536 -//.word 0xf718b93a -//.word 0x3b9e6d87 -//.word 0x56806cdc -//.word 0xa201fb3b -//.word 0xa3e7d934 -//.word 0x39db1867 -//.word 0x19122a45 -//.word 0x7d2d3f16 -//.word 0x1b5ecf40 -//.word 0x54cd72c6 -//.word 0xaf3af80f -//.word 0x85e3b6e9 -//.word 0xfea81ecd -//.word 0x3c6d9365 -//.word 0xd5c07b4b -//.word 0x87bb9514 -//.word 0x272c8c8d -//.word 0xdbf4cd44 -//.word 0x89ad964a -//.word 0x8f905038 -//.word 0xb5951f70 -//.word 0x5fdbb7a5 -//.word 0x084b719e -//.word 0xeb799e36 -//.word 0x03ca1ba8 -//.word 0x36dc2609 -//.word 0xce226f16 -//.word 0x28cf7230 -//.word 0xb0f605a5 -//.word 0x0def2d31 -//.word 0x98fc36c5 -//.word 0x132c0386 -//.word 0x9880a219 -//.word 0xcf4d231e -//.word 0x64e1abfa -//.word 0xb869c4da -//.word 0xd713f7f5 -//.word 0xab6f9d11 -//.word 0x6f1bf248 -//.word 0x659f6b0c -//.word 0xcc964a69 -//.word 0x0d0f6f8a -//.word 0x3532717f -//.word 0xa727ed3d -//.word 0x13331ee6 -//.word 0xa224ae4b -//.word 0x73f0ccb0 -//.word 0x4b997fcf -//.word 0x88533a1f -//.word 0x57e9b055 -//.word 0x275de92b -//.word 0x5ecf9661 -//.word 0x4a9fa202 -//.word 0x5ad609e9 -//.word 0x8ec2ed83 -//.word 0x2ce1e7d7 -//.word 0xb5019bc3 -//.word 0x17a48f88 -//.word 0x24a93d89 -//.word 0x4329664f -//.word 0x65a0aad1 -//.word 0x3b4d56f2 -//.word 0xa7db7d4c -//.word 0x70404a2c -//.word 0x39e694dd -//.word 0xb408b32a -//.word 0x1360921e -//.word 0xbfff060e -//.word 0x4d7c5eda -//.word 0xae503c6f -//.word 0xa581a390 -//.word 0x7e7e50d7 -//.word 0xfe4a4ef6 -//.word 0x96ddc543 -//.word 0xdbc81374 -//.word 0x3b171da6 -//.word 0xe87be7a5 -//.word 0x19a96367 -//.word 0x72fd87d9 -//.word 0xc063a2df -//.word 0xea77f095 -//.word 0x25eb6cdc -//.word 0x6629e512 -//.word 0x1d3a5420 -//.word 0x20e76dba -//.word 0xe51e74e2 -//.word 0xf59752ae -//.word 0x9db6e84c -//.word 0xe7b4a343 -//.word 0xc9fa51fb -//.word 0x9bcd3380 -//.word 0xce305383 -//.word 0xdc0617a2 -//.word 0x7b7817e9 -//.word 0x16962c98 -//.word 0x7d41c926 -//.word 0xdc488f87 -//.word 0xead11bab -//.word 0x62fb2347 -//.word 0xb7c1c1d7 -//.word 0x04220ee4 -//.word 0x417ef382 -//.word 0xbd443c1e -//.word 0xc8caee76 -//.word 0xb07cdbe9 -//.word 0xf03973f1 -//.word 0xa3faddee -//.word 0x3fb54725 -//.word 0x7f817a08 -//.word 0xa1fab1b8 -//.word 0xd2e7abc8 -//.word 0xe71aff44 -//.word 0x4d98b0f1 -//.word 0x43fa01d7 -//.word 0x46138afd -//.word 0xcdd38c74 -//.word 0x376b8296 -//.word 0x02b2f890 -//.word 0x3dc8a01e -//.word 0x40f9a396 -//.word 0x9ae43528 -//.word 0x4bdc6c64 -//.word 0x348e52fc -//.word 0xcbe439cc -//.word 0x132a4e17 -//.word 0xcc707114 -//.word 0xe62f44a9 -//.word 0x3c2f8276 -//.word 0x7fa79315 -//.word 0x70a75da0 -//.word 0x53b35c74 -//.word 0xa0b0f535 -//.word 0xfb050713 -//.word 0x66fac44b -//.word 0xb663bff0 -//.word 0x438345eb -//.word 0xe42bf141 -//.word 0x1b227b94 -//.word 0x8cc9d1ed -//.word 0xb4ff69b8 -//.word 0xd743d510 -//.word 0x3a18983d -//.word 0x93ae387b -//.word 0xbebe94fd -//.word 0xb1b67832 -//.word 0xb2166f47 -//.word 0xc81ad8ed -//.word 0x6f993c5c -//.word 0x8f2ddf98 -//.word 0xaf9495f3 -//.word 0x6656d7d3 -//.word 0x13a816b5 -//.word 0xce914f72 -//.word 0x9f4be0c1 -//.word 0xedec9afe -//.word 0x3946172a -//.word 0x0c0b4e32 -//.word 0x2d356474 -//.word 0x18a4c67f -//.word 0xac09741a -//.word 0x2404a089 -//.word 0x4889770b -//.word 0xe4883fa7 -//.word 0x7acda228 -//.word 0x34254967 -//.word 0x1cc2adc8 -//.word 0x8fe02a07 -//.word 0xefa95635 -//.word 0x995690fd -//.word 0x1798dc2c -//.word 0x9636ee71 -//.word 0x9af78460 -//.word 0xf0c2f9bd -//.word 0xe50417f8 -//.word 0xb5522ef4 -//.word 0x4650620c -//.word 0x16d14958 -//.word 0x723fb62c -//.word 0xea3ecfe2 -//.word 0x018c66da -//.word 0x292b86be -//.word 0xeec34b0b -//.word 0x7142f7cd -//.word 0x18c543aa -//.word 0x84bbf321 -//.word 0xc347ad14 -//.word 0xc7e70b84 -//.word 0x1754ef9d -//.word 0xc5a917f2 -//.word 0xa0c6f109 -//.word 0xaaf7b01a -//.word 0xcdd19f14 -//.word 0xc95db5e1 -//.word 0x71796aeb -//.word 0x177acadf -//.word 0x4516c8b1 -//.word 0xae82d4e0 -//.word 0x63d7b0fb -//.word 0x4aba7f64 -//.word 0xcd3c1f54 -//.word 0xcfffb81f -//.word 0xe49b95b9 -//.word 0xc13f3379 -//.word 0xf19c981e -//.word 0xcafee610 -//.word 0xa0bc30e8 -//.word 0x38d38c31 -//.word 0x7fce6a70 -//.word 0x7ce92463 -//.word 0x8475d687 -//.word 0xad7e6fdc -//.word 0x85ac08ec -//.word 0x0367750a -//.word 0xbd3e1ad8 -//.word 0x5c8a000c -//.word 0x4d4e2973 -//.word 0xba622036 -//.word 0xb9d1d35c -//.word 0xc37fa590 -//.word 0x670fc024 -//.word 0x3f03a857 -//.word 0x242516d3 -//.word 0x9e26037a -//.word 0x9e860362 -//.word 0x70b3d41e -//.word 0xeb753740 -//.word 0xeb89fe1b -//.word 0x018d67ce -//.word 0x681ca87e -//.word 0x3b39cbe2 -//.word 0xe6f1bc05 -//.word 0xdb3ca147 -//.word 0x862569a5 -//.word 0x822aa83b -//.word 0x0de6a207 -//.word 0x80000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x000041E0 -//// expected output -//.word 0xca2928c7 -//.word 0x468e8e42 -//.word 0x1b00fb12 -//.word 0x8b1c114a -//.word 0x983745f9 -//.word 0xb20521e8 -//.word 0xc8954a68 -//.word 0x178ccefc -//.word 0x2e81d0f0 -//.word 0xc4925515 -//.word 0x7e9b86cf -//.word 0x09e59e18 -//.word 0x7ad938ff -//.word 0xd35664f9 -//.word 0xa3ddb471 -//.word 0xb85ee250 -//// SHA512LongMsgvector_21 -//// vector length -//.word 0x000044F8 -//// input message -//.word 0xedf5557e -//.word 0x15473b74 -//.word 0x7a819398 -//.word 0xc9ac1459 -//.word 0xffdb4c97 -//.word 0xd0072c12 -//.word 0x4a16c723 -//.word 0xb63d57aa -//.word 0xbf888147 -//.word 0xd6b7dacd -//.word 0xd44ca9f3 -//.word 0xe1e2ef4d -//.word 0x95c0a47b -//.word 0x5eae44a1 -//.word 0x22088a17 -//.word 0x25107b61 -//.word 0x2c88a761 -//.word 0xe381accb -//.word 0x7c6efbda -//.word 0x997cdf41 -//.word 0x6c26bb65 -//.word 0x1c0393c9 -//.word 0x6be3cdc9 -//.word 0x971b398c -//.word 0x7d1d5034 -//.word 0x044cb957 -//.word 0xb90e12b3 -//.word 0xb722ec1d -//.word 0xca3417bb -//.word 0xd4ae2173 -//.word 0x6fd219a3 -//.word 0xd3069813 -//.word 0xfb6e0328 -//.word 0x03c00a5a -//.word 0xd55474e7 -//.word 0x047b1fc9 -//.word 0xf81242e6 -//.word 0x4c57f688 -//.word 0x74fbf50c -//.word 0xa378a1de -//.word 0xeba448a5 -//.word 0xa786a6ba -//.word 0x1669abdf -//.word 0x48307f2e -//.word 0x3ee9c44f -//.word 0x4da51bee -//.word 0xc386e96c -//.word 0xcd195bd5 -//.word 0x98e6a713 -//.word 0xb7469561 -//.word 0xc5753f02 -//.word 0x4be81432 -//.word 0xe3e1235d -//.word 0x9e40978f -//.word 0xa49c7d2c -//.word 0x1a92cee1 -//.word 0x495da9da -//.word 0xfca7e035 -//.word 0x299fb6b7 -//.word 0xd44ce7be -//.word 0x3121e977 -//.word 0x09d17251 -//.word 0x5e653ab2 -//.word 0x528b02e8 -//.word 0x4531d562 -//.word 0x3e528e20 -//.word 0x8c109a68 -//.word 0xad04ffbb -//.word 0x6ed29d07 -//.word 0x5400b41e -//.word 0x3b08a767 -//.word 0x3dab00d3 -//.word 0xd589b313 -//.word 0x44efa709 -//.word 0x34f0727c -//.word 0x9cb7650f -//.word 0xe31bc874 -//.word 0x487466dd -//.word 0x81ad4db3 -//.word 0xa29bcf8b -//.word 0x418dcc56 -//.word 0xd82534d7 -//.word 0x6a66c75b -//.word 0x6a0d1fa4 -//.word 0xd825f126 -//.word 0xadd69076 -//.word 0x797eb2ff -//.word 0x4b0377f7 -//.word 0xd167a791 -//.word 0xc09c3b74 -//.word 0x769a206d -//.word 0xdfb03760 -//.word 0x9517a085 -//.word 0x4bcd38d0 -//.word 0x6ba060b1 -//.word 0xfe8901fe -//.word 0xcd3ccd2e -//.word 0xc5fdc7c7 -//.word 0xa0b50519 -//.word 0xc245b42d -//.word 0x611a5ef9 -//.word 0xe90268d5 -//.word 0x9f3edf33 -//.word 0x84d8748a -//.word 0x7c37c493 -//.word 0xaff0ddb8 -//.word 0x30dffeca -//.word 0xdd779ff2 -//.word 0x8656b1ea -//.word 0x511c276c -//.word 0x5c7eb5eb -//.word 0xa596d882 -//.word 0x277d162a -//.word 0x461c872f -//.word 0x6d3f94e5 -//.word 0xf6ebff97 -//.word 0x4af224c0 -//.word 0x49c47e7d -//.word 0xec886c43 -//.word 0x286c35cd -//.word 0x16394a59 -//.word 0x522acc14 -//.word 0xa1fe4ed3 -//.word 0xd64cdc03 -//.word 0xf6173ce3 -//.word 0x9aa273f1 -//.word 0x95858ca1 -//.word 0xd7019455 -//.word 0x9191e98a -//.word 0x9ac1b54f -//.word 0x1243b5fc -//.word 0x45403f20 -//.word 0xd1ec83bb -//.word 0x0c5d11ae -//.word 0xa09d9b6f -//.word 0x78fefc01 -//.word 0xe0ad7a24 -//.word 0xe78a48c9 -//.word 0x08374fc8 -//.word 0x0a6f2fd5 -//.word 0x259a80b1 -//.word 0x669e5d9d -//.word 0x55f72314 -//.word 0xd40a76b9 -//.word 0x4ab6858f -//.word 0x012d8f68 -//.word 0xcd02a7a0 -//.word 0xef83b40a -//.word 0x3848bb2b -//.word 0x720c61a6 -//.word 0xfbbcabf8 -//.word 0xb3ce0965 -//.word 0x18d49332 -//.word 0xb0519215 -//.word 0xa8cb42ea -//.word 0xba21d6a7 -//.word 0x541fbd92 -//.word 0xf65024b2 -//.word 0xdb13bc83 -//.word 0xddf1bdee -//.word 0x932e2b77 -//.word 0xbc9e58b9 -//.word 0xe0baaa0f -//.word 0x34f39e95 -//.word 0xbf470d4f -//.word 0xbb11aea7 -//.word 0x3e25dd1d -//.word 0x191c9a3a -//.word 0x00edd5c5 -//.word 0xecbee93a -//.word 0xbef96678 -//.word 0x25a113ba -//.word 0xc1e733c8 -//.word 0x89f8086f -//.word 0x6a1a962e -//.word 0x30f7a932 -//.word 0xaa381985 -//.word 0x09564d82 -//.word 0x8aadfe8c -//.word 0x55d33dff -//.word 0xa427b867 -//.word 0x27ad39f0 -//.word 0xa8196f1e -//.word 0xeb29f1be -//.word 0xd838801d -//.word 0xdb118c77 -//.word 0x8c01fab2 -//.word 0x8b30254c -//.word 0xae302393 -//.word 0x5fd74914 -//.word 0x3f4af155 -//.word 0x105b7ac7 -//.word 0xd11591f6 -//.word 0x2a94af03 -//.word 0x0b1be354 -//.word 0x9160d28a -//.word 0x292afcb3 -//.word 0xf71e41c1 -//.word 0x79d6a33c -//.word 0x67344d33 -//.word 0xdef6d578 -//.word 0xbe8abe0d -//.word 0x512341d9 -//.word 0x2d0c4c9f -//.word 0x5b3dcc31 -//.word 0xb82c28e1 -//.word 0x9ce50d39 -//.word 0xba5d71ec -//.word 0x4703d20b -//.word 0x5f99bf7c -//.word 0xa4429aa9 -//.word 0x28dc9c75 -//.word 0x8d8f1974 -//.word 0x6aa6065b -//.word 0xf19eb8b5 -//.word 0xcf7deed8 -//.word 0x54661218 -//.word 0xd469bc3a -//.word 0x4d9f782c -//.word 0x4977c9f3 -//.word 0x064b6ee4 -//.word 0xd537e317 -//.word 0xc02a2b19 -//.word 0x6f3dcde1 -//.word 0x4d441d05 -//.word 0xe6a3bc2e -//.word 0x936462ca -//.word 0x5a86db00 -//.word 0x109750e9 -//.word 0xc085c8fd -//.word 0x51b1eecb -//.word 0x624515ee -//.word 0x79c8793c -//.word 0x5defc840 -//.word 0xc0b6e1eb -//.word 0x21b0db86 -//.word 0xf19b49eb -//.word 0xf538bcf5 -//.word 0xeb5a8a35 -//.word 0x703ccee6 -//.word 0x2117b023 -//.word 0x01f4e758 -//.word 0x1bbf7cf7 -//.word 0x689ed06c -//.word 0xf281e052 -//.word 0x3af9c8e7 -//.word 0xd74d86bd -//.word 0x61cb01b3 -//.word 0x8d5c4a24 -//.word 0x995b215e -//.word 0xeba7bb56 -//.word 0xf5f7c29a -//.word 0x5b6e9e86 -//.word 0x5870f3bb -//.word 0x5eb36acd -//.word 0xfc99b53c -//.word 0x05bdcda6 -//.word 0xefcb7e3a -//.word 0x79962670 -//.word 0x9064baf7 -//.word 0x748c09ef -//.word 0x17444559 -//.word 0xc6b4bfcc -//.word 0x0a4ff269 -//.word 0xd162c311 -//.word 0xc9ed07d5 -//.word 0x0db346ad -//.word 0x038dbe6d -//.word 0x8403abf6 -//.word 0x3e1dc6a9 -//.word 0x57770c22 -//.word 0x5394c022 -//.word 0x3874b3cc -//.word 0xf069c315 -//.word 0xee26a276 -//.word 0x1519d9e3 -//.word 0xd5fb0c01 -//.word 0x97a57f94 -//.word 0x5b25d936 -//.word 0x9f11284f -//.word 0x831b2641 -//.word 0x2ce6bbe3 -//.word 0x6618c231 -//.word 0x8db11042 -//.word 0xad9bb27a -//.word 0xe8817700 -//.word 0x18e5af72 -//.word 0xb66d31d8 -//.word 0xfb7ea3d7 -//.word 0x440cf528 -//.word 0xbbb12f48 -//.word 0x34fc6d70 -//.word 0x550b27c7 -//.word 0xfa5cb6d7 -//.word 0xd7e0143d -//.word 0x6051e4a5 -//.word 0xe5c6b2f6 -//.word 0x02857bca -//.word 0x36187021 -//.word 0xd2a3f756 -//.word 0x1574f352 -//.word 0x95dc45ff -//.word 0xe03d93ff -//.word 0x6465479f -//.word 0x8c1adb06 -//.word 0x2cf655b3 -//.word 0x1f760d26 -//.word 0x2f4db6dc -//.word 0x34fe9c81 -//.word 0x80a92b62 -//.word 0x7b25b121 -//.word 0x8b5065ac -//.word 0x37a3a76f -//.word 0x8b0a89c9 -//.word 0xbef28fbd -//.word 0x12a3b3eb -//.word 0xfcd0acbe -//.word 0x856c70e6 -//.word 0xf0c0f809 -//.word 0x9dbb43b5 -//.word 0x2d899d9a -//.word 0xe76721f6 -//.word 0x5ab57d50 -//.word 0x444cf569 -//.word 0xb313ab70 -//.word 0x6acd1d75 -//.word 0x8635ef20 -//.word 0x624deba3 -//.word 0xb7f346ed -//.word 0x08b52420 -//.word 0x3de65f46 -//.word 0x8ef18440 -//.word 0xa2ee1ffe -//.word 0xf87339f6 -//.word 0x87ad1ece -//.word 0xa1af645c -//.word 0x1d0928d1 -//.word 0xb59d9b31 -//.word 0xadaebe07 -//.word 0xb63a6956 -//.word 0x118a92d2 -//.word 0xf707cc50 -//.word 0x394f0e7c -//.word 0x2488b6ca -//.word 0xa7f5cdaf -//.word 0xb8c68d10 -//.word 0xf33520fb -//.word 0x84ceab95 -//.word 0x480e8b53 -//.word 0x2f30df6d -//.word 0xe5444690 -//.word 0xb181ead4 -//.word 0x9ddcbded -//.word 0xd7da02a5 -//.word 0x57a2108a -//.word 0xc25652e3 -//.word 0x8ea393e9 -//.word 0x68977834 -//.word 0xd2b34e74 -//.word 0x11420661 -//.word 0x46e97ef5 -//.word 0xdb7e03d8 -//.word 0x201d131c -//.word 0x3679672a -//.word 0x2d7131fc -//.word 0x69e4a28d -//.word 0x4ac5af8e -//.word 0x0c72155b -//.word 0xeb419a2d -//.word 0x8b5c9691 -//.word 0x98d0b319 -//.word 0xa9e0f151 -//.word 0x6b9fedf4 -//.word 0xfbbe6260 -//.word 0x93a2f048 -//.word 0x69b91ca9 -//.word 0xd40f99ff -//.word 0xb11cc6b8 -//.word 0x05e177e9 -//.word 0xe433f840 -//.word 0x91564f3a -//.word 0xe6cdc295 -//.word 0xf6719909 -//.word 0xf2c12533 -//.word 0x497901d2 -//.word 0x13669835 -//.word 0xb078e7f4 -//.word 0xac1985df -//.word 0xe6bde034 -//.word 0xf2bac915 -//.word 0xbb5b3338 -//.word 0x6d2f37e1 -//.word 0x92a75c0d -//.word 0x7be016f0 -//.word 0xe1be8ca2 -//.word 0xcc3a9e16 -//.word 0xb4fd274b -//.word 0xe62d7fc6 -//.word 0x2a87453f -//.word 0xa3ae5b9b -//.word 0xf6c2311a -//.word 0xaf3547d2 -//.word 0xe0daed5c -//.word 0x0a3f4ecd -//.word 0x413dace7 -//.word 0x8ccded91 -//.word 0x8b1d5785 -//.word 0x5ce49849 -//.word 0xbef20960 -//.word 0x770b33c1 -//.word 0xf4f59388 -//.word 0x30d09aec -//.word 0xd7a6f871 -//.word 0xaa431a5e -//.word 0x2547f172 -//.word 0x5f79f6d3 -//.word 0x335e6b47 -//.word 0x9d0be3a6 -//.word 0x66370490 -//.word 0x04948c5b -//.word 0xbc60924f -//.word 0x09360f16 -//.word 0x412b9c6e -//.word 0x76167d21 -//.word 0x9a2fdf37 -//.word 0xe7dc5e6a -//.word 0x7ec7cada -//.word 0x4f342b02 -//.word 0x389202eb -//.word 0x714fd29f -//.word 0x27f1dfe1 -//.word 0x6763361b -//.word 0x3e8ced98 -//.word 0x1f26acf3 -//.word 0x84ce6dd0 -//.word 0xd8577fc9 -//.word 0x9564d1ac -//.word 0xaa366de3 -//.word 0x1fc24333 -//.word 0xfb0728aa -//.word 0x669e1ed2 -//.word 0x0b93d62b -//.word 0xc07373d8 -//.word 0x69a69199 -//.word 0x19ff86f9 -//.word 0x7b92e7c9 -//.word 0x71c64fcc -//.word 0xfaab5bb4 -//.word 0x598df94d -//.word 0x74c9e3f9 -//.word 0x7adf665c -//.word 0xc8c96858 -//.word 0x0e8ba93c -//.word 0xad0c4938 -//.word 0x64248b15 -//.word 0x2cf6d822 -//.word 0x60800772 -//.word 0x2170db44 -//.word 0xf939cdc3 -//.word 0xbe670cf0 -//.word 0xba2fc3dc -//.word 0x084b9a1a -//.word 0x41057f74 -//.word 0x5991a6dd -//.word 0xc39fcea7 -//.word 0xdc31c7f6 -//.word 0x86aa3175 -//.word 0x13288647 -//.word 0x66145b41 -//.word 0x54f8e256 -//.word 0x5090b452 -//.word 0x4823cdcc -//.word 0xca13d855 -//.word 0x6bb4aef6 -//.word 0x695a19da -//.word 0x8fb6dd47 -//.word 0x5962f9d3 -//.word 0x59ba2ad4 -//.word 0xd9eeb118 -//.word 0xc25556d6 -//.word 0xbd04ade5 -//.word 0x97a0982c -//.word 0xea700d5a -//.word 0xfab619d7 -//.word 0xdd4025fa -//.word 0xdf3a797c -//.word 0x2446fe2c -//.word 0x8fcf48e5 -//.word 0xe399d3bd -//.word 0x289d8d80 -//.word 0x5115955d -//.word 0x1bd343de -//.word 0x38d6681e -//.word 0xad1fd736 -//.word 0x79c124f8 -//.word 0x7738abe0 -//.word 0x85fbd447 -//.word 0xe65596da -//.word 0xe5703a4b -//.word 0xbbb36246 -//.word 0xb34d49a7 -//.word 0x8c124cea -//.word 0x1f87aae2 -//.word 0x423888ae -//.word 0xeb5238ea -//.word 0x996dba22 -//.word 0xefaa838c -//.word 0xa2fe7ef6 -//.word 0x96cd51fd -//.word 0x44bbe180 -//.word 0x5fbf1854 -//.word 0xb779e639 -//.word 0x5dc5850d -//.word 0x08900240 -//.word 0xb7eaf988 -//.word 0x985da0d6 -//.word 0x297d0688 -//.word 0x9dc19de0 -//.word 0x8191f7b5 -//.word 0x9fa0cd68 -//.word 0x237c451a -//.word 0xfc64741c -//.word 0x855922a7 -//.word 0x6577cece -//.word 0xb486f2b0 -//.word 0x5fcd89f2 -//.word 0xcd26cd6d -//.word 0xc2584523 -//.word 0x84a0ff78 -//.word 0x3d911b9f -//.word 0xa11f8952 -//.word 0xd0f612c6 -//.word 0x7e109dde -//.word 0x5186ab9f -//.word 0x8aa625e4 -//.word 0xe8475752 -//.word 0xc9593c8f -//.word 0x93c0fcaf -//.word 0x5263b3ef -//.word 0xa37f74a6 -//.word 0xd0428e78 -//.word 0x3c950dcd -//.word 0x02398481 -//.word 0xd9150ade -//.word 0x3bce83c7 -//.word 0xc6992135 -//.word 0xe24d2ae8 -//.word 0xa4bdfb56 -//.word 0xf2444de8 -//.word 0xe8a1b765 -//.word 0x7b0574ae -//.word 0x5c6b6780 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x000044F8 -//// expected output -//.word 0xba3ad050 -//.word 0xbcbd2feb -//.word 0xe8989cd0 -//.word 0xade13530 -//.word 0x3de9d9a4 -//.word 0x19daaa64 -//.word 0x7f0c89e2 -//.word 0xd8c78e1a -//.word 0x701a4f9e -//.word 0xa3ade33e -//.word 0xc68b28d4 -//.word 0xa6e7ff15 -//.word 0xd637a1a8 -//.word 0x03d2de1f -//.word 0xf35b0d42 -//.word 0x98519cbc -//// SHA512LongMsgvector_22 -//// vector length -//.word 0x00004810 -//// input message -//.word 0x8714eb9e -//.word 0xcf8bdb13 -//.word 0xe919de40 -//.word 0xf963d711 -//.word 0x8fc580ea -//.word 0xcfe9acdd -//.word 0xcf99cf21 -//.word 0x40d1bfbf -//.word 0x5119bc8f -//.word 0xd011af63 -//.word 0x924eaf82 -//.word 0x1664c958 -//.word 0x6544016b -//.word 0x3cc99491 -//.word 0x6d8d8061 -//.word 0x830146e7 -//.word 0xa5bdef9c -//.word 0xbd144d94 -//.word 0xd9ec83fa -//.word 0xd1ccc8ba -//.word 0x2a37677d -//.word 0x3a390ada -//.word 0x8d3f39ca -//.word 0x882c1e5d -//.word 0x4ca88bac -//.word 0xddbb3e0f -//.word 0x849c6390 -//.word 0x71c35a9f -//.word 0xa545bb07 -//.word 0x0f619720 -//.word 0xf5560146 -//.word 0x9678cd8b -//.word 0x0e8398a9 -//.word 0x792f093b -//.word 0x5b05552c -//.word 0x4070096f -//.word 0x9f1704f0 -//.word 0x046ac2cb -//.word 0x6e7be1bd -//.word 0xf610ddd7 -//.word 0xb2f61f7a -//.word 0xd998367f -//.word 0x28d064b6 -//.word 0x84fc5c92 -//.word 0xe0554a22 -//.word 0x617c1443 -//.word 0xc056df15 -//.word 0xf11ad6ab -//.word 0x02a82607 -//.word 0x451d4d45 -//.word 0xb1a49516 -//.word 0x868fdb70 -//.word 0x30a69584 -//.word 0x6ebe14f1 -//.word 0xb38e0637 -//.word 0xcdbf3e6e -//.word 0xc442b838 -//.word 0x05e6d7f4 -//.word 0xbf2af234 -//.word 0x8e4f0f71 -//.word 0x57b2eefe -//.word 0x73594a3b -//.word 0x0fcc5b0b -//.word 0xd2269f88 -//.word 0xc16bdaf5 -//.word 0x601c5cf3 -//.word 0x1a0982f8 -//.word 0xe3677ffe -//.word 0x1c225c78 -//.word 0xb7753e8a -//.word 0x9bb7e879 -//.word 0x4a788061 -//.word 0xc1cc9626 -//.word 0xa0e762ac -//.word 0x8aea4d4b -//.word 0xcffdb47d -//.word 0x489ee8da -//.word 0x83387947 -//.word 0x20f8b46a -//.word 0x7bdc6a61 -//.word 0x8c0df3b3 -//.word 0x0b6e7386 -//.word 0xd7755c13 -//.word 0x983a3458 -//.word 0xa3cd990c -//.word 0x1fcd82d8 -//.word 0x6636c7c4 -//.word 0xae7be4f0 -//.word 0xe9d5fa84 -//.word 0xeada16e9 -//.word 0xc851b63a -//.word 0x874589f5 -//.word 0xf55877f7 -//.word 0xd35ae1a7 -//.word 0x351a2a71 -//.word 0x2c7c7676 -//.word 0xa1ccb181 -//.word 0x8452d43d -//.word 0x272763a6 -//.word 0xe4473abe -//.word 0x06e68a81 -//.word 0xe7081f1a -//.word 0x554ce457 -//.word 0x3a08a85b -//.word 0x7c9b2293 -//.word 0x23ff33eb -//.word 0xba9e6c41 -//.word 0xf767d019 -//.word 0x9e20db93 -//.word 0xa2fec39b -//.word 0x8d73fd60 -//.word 0x23470307 -//.word 0x42ea55a0 -//.word 0x0d09bd59 -//.word 0x4a5fd8f1 -//.word 0x07ced270 -//.word 0x84ae7116 -//.word 0x4d655591 -//.word 0xa7377e73 -//.word 0x2d600ee2 -//.word 0xbb605091 -//.word 0x8b97faf0 -//.word 0x9e11afa0 -//.word 0x5ea3c82a -//.word 0x813754f0 -//.word 0x30645d64 -//.word 0x69426e77 -//.word 0xa27c5155 -//.word 0xafa61d4f -//.word 0xe5d17118 -//.word 0x805dfa35 -//.word 0x420f3baf -//.word 0x5d638d0b -//.word 0x9324647b -//.word 0x9c39d556 -//.word 0xc8c255c6 -//.word 0xe564c4c1 -//.word 0x63e0aa3a -//.word 0xb6ebc098 -//.word 0xfc3ab267 -//.word 0xe0dc234d -//.word 0xbeccf140 -//.word 0x08c7bbf7 -//.word 0xe85ba19e -//.word 0x26414bce -//.word 0x4dec2dbc -//.word 0x096209b1 -//.word 0xd44bb5ba -//.word 0xd1471ea0 -//.word 0xf8858d1a -//.word 0x74922942 -//.word 0x496ebe46 -//.word 0x3ae5bc60 -//.word 0xea1c8308 -//.word 0x416bdd68 -//.word 0x116acc10 -//.word 0xfa4f87eb -//.word 0x8b77bf71 -//.word 0xa942261f -//.word 0x35243224 -//.word 0xe9f91e5e -//.word 0x83993384 -//.word 0x26ad45a5 -//.word 0xfdc180d1 -//.word 0x219a6516 -//.word 0xbdc90fae -//.word 0x7080bb76 -//.word 0xf2a587a2 -//.word 0xfb257aaf -//.word 0x608bc59a -//.word 0x7fd14850 -//.word 0xde755865 -//.word 0x0fd0c008 -//.word 0xd7a40537 -//.word 0x8ff4ef2f -//.word 0xc9184427 -//.word 0x3710d73d -//.word 0xc919c1b1 -//.word 0x167eef51 -//.word 0xfdb1dd34 -//.word 0x8c9aa0ab -//.word 0x202f2a75 -//.word 0xce45ca32 -//.word 0x02a5f21a -//.word 0x66633def -//.word 0x066bb030 -//.word 0xb15d4190 -//.word 0xa29b95a7 -//.word 0x60a00ee6 -//.word 0xe29305d0 -//.word 0xf71b5467 -//.word 0xe57618e5 -//.word 0x50c5b5ad -//.word 0x5eaa1a81 -//.word 0x191546f5 -//.word 0x155b0a24 -//.word 0x528911a1 -//.word 0x63f71fb1 -//.word 0xd02096b7 -//.word 0xbab03eef -//.word 0xbddf455f -//.word 0x1bfe850b -//.word 0x164f0669 -//.word 0x9d1ac414 -//.word 0x2bfdb2c4 -//.word 0xed84fe7e -//.word 0x23fa9708 -//.word 0xc87eeda0 -//.word 0x7559f8ed -//.word 0x838e7b36 -//.word 0x70b38ad2 -//.word 0x83004ae0 -//.word 0xb3a6f838 -//.word 0xc6612ca1 -//.word 0xb6515f44 -//.word 0x5806ab60 -//.word 0x3fdad340 -//.word 0xdf83836a -//.word 0xeee8d91a -//.word 0x103423ee -//.word 0xb229ebe3 -//.word 0x36b83180 -//.word 0x51cef751 -//.word 0xb2700397 -//.word 0xe50ae03e -//.word 0x7604260f -//.word 0x5997fb27 -//.word 0x89dfdaa8 -//.word 0xf03193ae -//.word 0x87ae9385 -//.word 0xbe186619 -//.word 0x1ee57aad -//.word 0x2d9226d0 -//.word 0x923aea8d -//.word 0x7967f9e3 -//.word 0x3928f475 -//.word 0x3464f981 -//.word 0xff6ddc16 -//.word 0xc4d8b482 -//.word 0xe48d9a0a -//.word 0xe01aaddf -//.word 0x794d5a4d -//.word 0x1601da34 -//.word 0x6738fbbc -//.word 0x486a2445 -//.word 0xe81d939d -//.word 0x2ab6ea76 -//.word 0x4b8fea17 -//.word 0xc6497e51 -//.word 0x7464fbb5 -//.word 0xf80ca604 -//.word 0x5a3677e7 -//.word 0xf2ec1ce0 -//.word 0x88e54181 -//.word 0xb9590fdc -//.word 0x9c13f23a -//.word 0xa6c8a010 -//.word 0xcba7572e -//.word 0xe631653a -//.word 0x5b4bee5d -//.word 0xfb92ea3c -//.word 0x28ee6d2a -//.word 0x396a2b9b -//.word 0x20433bdc -//.word 0x493e1b02 -//.word 0xc63ff521 -//.word 0xaa1820be -//.word 0xb29fea86 -//.word 0x2b039540 -//.word 0x0f609f00 -//.word 0x7290479d -//.word 0x1c454c66 -//.word 0x7854f811 -//.word 0xad545df4 -//.word 0x0a68df78 -//.word 0xa759f2ca -//.word 0x49e825d3 -//.word 0x8762606b -//.word 0x2b7469c9 -//.word 0xdb41ad3e -//.word 0xf9b23e24 -//.word 0xc70d1811 -//.word 0xcfcaa850 -//.word 0x82a28f91 -//.word 0x1fe8a3df -//.word 0xd61c36d3 -//.word 0x2ebe9c07 -//.word 0xa460e7ce -//.word 0x94fff522 -//.word 0x5d93adde -//.word 0xc1e5852e -//.word 0x8aa14743 -//.word 0x73ac164b -//.word 0x45b7aca0 -//.word 0x4115e53f -//.word 0xbec9817d -//.word 0x13e425f5 -//.word 0xb70ea4c5 -//.word 0xa7627dfa -//.word 0x087fa548 -//.word 0x0edb86ff -//.word 0x1c5b473a -//.word 0x2d214e59 -//.word 0x72a603b2 -//.word 0x3c08d784 -//.word 0x1da5862c -//.word 0x4ae8989c -//.word 0x44632e08 -//.word 0xb81efbe2 -//.word 0xa32f9109 -//.word 0xb98bde3e -//.word 0x081cf6d7 -//.word 0xd91413b7 -//.word 0xd780d97d -//.word 0x7320dffc -//.word 0x86766cec -//.word 0x381d7ede -//.word 0x225c1176 -//.word 0xaffb9dd4 -//.word 0xc855e153 -//.word 0xb0afdf76 -//.word 0x2cc8281f -//.word 0xe8b15902 -//.word 0x16dfe65a -//.word 0x587f16da -//.word 0xe0094fe7 -//.word 0xd5189404 -//.word 0xf9794c8e -//.word 0x8a8245a9 -//.word 0x66a5f87a -//.word 0x72450f97 -//.word 0x3bc724bb -//.word 0xdeedccbf -//.word 0x265fd4c5 -//.word 0xf58bcab7 -//.word 0xe5afbff0 -//.word 0x2e344c38 -//.word 0xcb3ed3f6 -//.word 0xd88107a1 -//.word 0x3f56af78 -//.word 0x930ea773 -//.word 0x3c862779 -//.word 0xd5fb47d3 -//.word 0xd220c3e1 -//.word 0x666efc0b -//.word 0xa4bc40fb -//.word 0xe40f4b09 -//.word 0x68b30ef7 -//.word 0x3f8bafdf -//.word 0x6aa5d069 -//.word 0x3e111441 -//.word 0x09f4dfc9 -//.word 0xf8d85e0b -//.word 0x3846c8f1 -//.word 0x5c97e3b8 -//.word 0xff07c9a2 -//.word 0xaa0beceb -//.word 0xf8e558ff -//.word 0xf77538ea -//.word 0xd2529c10 -//.word 0xad19791e -//.word 0xd105f140 -//.word 0x09c0d595 -//.word 0x4b7969e0 -//.word 0x9b376780 -//.word 0x2d6d46a2 -//.word 0xcacebbb5 -//.word 0x7462811e -//.word 0x4dda562d -//.word 0xb5214650 -//.word 0xb3332b87 -//.word 0x96327518 -//.word 0xdcb72784 -//.word 0x526622b9 -//.word 0x7dc5a689 -//.word 0x394e165b -//.word 0xa0c2fb21 -//.word 0x2dc14c8a -//.word 0x2198ed78 -//.word 0x265a75b4 -//.word 0x333234e1 -//.word 0xaff775ae -//.word 0xd9010050 -//.word 0x673be330 -//.word 0x6d7a72e0 -//.word 0x810d8d54 -//.word 0x1d96214f -//.word 0x4518f11b -//.word 0x6950977d -//.word 0x8c49c5e8 -//.word 0xa62bd1f1 -//.word 0x47537103 -//.word 0x7ea9c354 -//.word 0xf92e9017 -//.word 0x6dd5d1f4 -//.word 0x399472b5 -//.word 0x46ba5742 -//.word 0x31839dcf -//.word 0xacea2254 -//.word 0x21be473d -//.word 0x99f8f463 -//.word 0xdd4cdd3c -//.word 0xdafe044e -//.word 0x4af77fea -//.word 0x91187c16 -//.word 0xe5ce82cb -//.word 0xb2e7fa61 -//.word 0x3da4ed47 -//.word 0x870f0ff7 -//.word 0x748efd29 -//.word 0x2cb9c347 -//.word 0xc269a122 -//.word 0x14110fe3 -//.word 0xf252fe44 -//.word 0x82c96100 -//.word 0xe22cec87 -//.word 0x10951bf7 -//.word 0x071d7748 -//.word 0x2bad15c6 -//.word 0xe7115fc5 -//.word 0x954e1690 -//.word 0x9e3698a2 -//.word 0xe2395f19 -//.word 0x5a7ecb67 -//.word 0xfb33214b -//.word 0xde21d300 -//.word 0x9f8302b4 -//.word 0x0318413b -//.word 0xdd779c05 -//.word 0x32a3d94d -//.word 0x9bdffd94 -//.word 0xebc3124e -//.word 0x129028db -//.word 0x41c19ab8 -//.word 0x4fe292f7 -//.word 0x5ca5cfec -//.word 0xb433a62a -//.word 0xf5c047ae -//.word 0x75624259 -//.word 0xde234aa4 -//.word 0x1b55388f -//.word 0x782553da -//.word 0x0473ce78 -//.word 0x3ae19241 -//.word 0xe12a3ee7 -//.word 0x31b66c2b -//.word 0x376b3750 -//.word 0x7bc5fad0 -//.word 0xdf29594f -//.word 0xca7686cd -//.word 0x86debd1f -//.word 0xe7f411a0 -//.word 0x2e056b24 -//.word 0x2cacd02d -//.word 0xaba1e262 -//.word 0x09d2aa3c -//.word 0x26b59403 -//.word 0x81dcbbf9 -//.word 0x9dca67d5 -//.word 0xaa05d472 -//.word 0x616c36c9 -//.word 0x30cbf91d -//.word 0x97ad4d75 -//.word 0xd271e24f -//.word 0xb8a0f093 -//.word 0xe37e7bc6 -//.word 0x11dfd580 -//.word 0xca3c6420 -//.word 0x4306a5be -//.word 0x833a7161 -//.word 0xc4368072 -//.word 0x1ccb2b71 -//.word 0x5c9376e7 -//.word 0x39854d9c -//.word 0xa9c60e09 -//.word 0x90c24810 -//.word 0x9c7cc3eb -//.word 0x6d22c063 -//.word 0xfae58142 -//.word 0x30080c0a -//.word 0xdc362de7 -//.word 0xca18bae3 -//.word 0x2e271a59 -//.word 0x44bf08ac -//.word 0x34759538 -//.word 0x38ab6c89 -//.word 0x00625acb -//.word 0x564f0e82 -//.word 0xfe301d7c -//.word 0xe0604903 -//.word 0x69a90257 -//.word 0x2e5a2d5b -//.word 0xd29a258e -//.word 0x2afcff3d -//.word 0xa05413f7 -//.word 0xd5c8b742 -//.word 0x8b2a4e8c -//.word 0xc1858264 -//.word 0x1ff5cdea -//.word 0x95bc3e84 -//.word 0x40937ad3 -//.word 0x8d3e01e6 -//.word 0xa063b2ad -//.word 0xf79c92b0 -//.word 0x4acbc900 -//.word 0xb6aeed6e -//.word 0x1bb383fc -//.word 0xc30dc391 -//.word 0x44079cf1 -//.word 0xa798f8eb -//.word 0xc93841d5 -//.word 0x02f32435 -//.word 0x05bc95c1 -//.word 0x0703138a -//.word 0x248a2d74 -//.word 0xfe7445e9 -//.word 0xa79f94ce -//.word 0xc1336eb6 -//.word 0xe37bc756 -//.word 0x3ff4f73a -//.word 0x82a4bab6 -//.word 0xfcad7b1e -//.word 0x0122d239 -//.word 0x8f194bf4 -//.word 0x30026954 -//.word 0x2237eaae -//.word 0xb6d44d1a -//.word 0xf6c89225 -//.word 0x8a2c41c6 -//.word 0xddd4ad94 -//.word 0x7b247a35 -//.word 0xbe255d1a -//.word 0xa9d82369 -//.word 0x14cbf53b -//.word 0x09e9da08 -//.word 0x6f967d5f -//.word 0xe5fc31db -//.word 0xf19f3252 -//.word 0x5a382d4f -//.word 0xd2c003c3 -//.word 0xd8cbcbf7 -//.word 0xdd1716c5 -//.word 0xa6657608 -//.word 0xf1874151 -//.word 0x5bbb92dc -//.word 0x813791c2 -//.word 0x6605f46f -//.word 0x1511c657 -//.word 0x878167e5 -//.word 0xc644d5b4 -//.word 0x53ee2902 -//.word 0xc5c36562 -//.word 0xb4116cb0 -//.word 0xd5c4524a -//.word 0x6634d67d -//.word 0xcd412d3e -//.word 0x7ca2021b -//.word 0x177aba71 -//.word 0xd92cfcde -//.word 0x347171f9 -//.word 0xb7a8c841 -//.word 0x356dfe54 -//.word 0x246cdc62 -//.word 0x4377c1e0 -//.word 0x80d7a181 -//.word 0x18e04e62 -//.word 0x00c9f684 -//.word 0x84baed80 -//.word 0x2e25ad76 -//.word 0xe95a1c47 -//.word 0x66560d04 -//.word 0xbfdc08a6 -//.word 0x5ac84eff -//.word 0x119f18f0 -//.word 0x8f6a20dd -//.word 0xfdc5625e -//.word 0xdf338000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00004810 -//// expected output -//.word 0xa86c70c2 -//.word 0x063f12bd -//.word 0xdf997c91 -//.word 0xd1ebb57f -//.word 0x5c55ca67 -//.word 0x614f397c -//.word 0x1c52a87b -//.word 0x0621fc43 -//.word 0x78c2eeb0 -//.word 0x7732e5eb -//.word 0x0fbb4b3c -//.word 0x1fdde87e -//.word 0x9ed71b50 -//.word 0xf83eeb02 -//.word 0xcba03baf -//.word 0xedc84764 -//// SHA512LongMsgvector_23 -//// vector length -//.word 0x00004B28 -//// input message -//.word 0xd99f8229 -//.word 0x6f56251e -//.word 0x365764e1 -//.word 0xacf4d207 -//.word 0x28f89f54 -//.word 0x6cebc621 -//.word 0x7d918700 -//.word 0xb3b418a3 -//.word 0x0c2398fa -//.word 0xc5fb449c -//.word 0x2c25ed68 -//.word 0xb020aa6c -//.word 0x3a01ca06 -//.word 0xc0b80c48 -//.word 0x179413a1 -//.word 0x080a14ba -//.word 0xa7b2d29f -//.word 0xe092cc1f -//.word 0x539fb475 -//.word 0x62812428 -//.word 0x87978d2f -//.word 0xeb3b7059 -//.word 0x3547d0ec -//.word 0xa0d7e78c -//.word 0x5151185f -//.word 0xe7a3256f -//.word 0x53cca250 -//.word 0xea9ea902 -//.word 0xb8c2d018 -//.word 0x18fc581a -//.word 0x82b0a729 -//.word 0xa3a6f8e1 -//.word 0xb30a5284 -//.word 0x03b7b654 -//.word 0xd5b59d40 -//.word 0x71ffa2c3 -//.word 0x758a7b0a -//.word 0x6d842d55 -//.word 0xa3d9809f -//.word 0x39fcb181 -//.word 0x74e46854 -//.word 0x5b55e996 -//.word 0x81608e8e -//.word 0x1f2d7533 -//.word 0x65f8764b -//.word 0x125a58d0 -//.word 0x43ca4497 -//.word 0x88637934 -//.word 0x3de84218 -//.word 0x180525fc -//.word 0xfed75e83 -//.word 0x1baf8c1a -//.word 0x3113a923 -//.word 0x30063f54 -//.word 0x088ad959 -//.word 0xbb62b8c1 -//.word 0xb61cc817 -//.word 0x614fd34f -//.word 0xf522f365 -//.word 0x8e0d4d40 -//.word 0x81e4fcdc -//.word 0xef114ca8 -//.word 0x9a20292d -//.word 0xf882d7f1 -//.word 0x868ae39b -//.word 0x5fbc5957 -//.word 0x0d47377c -//.word 0x9fd0226d -//.word 0xfb7158bd -//.word 0x7602e696 -//.word 0xa2971b5b -//.word 0x67493c8c -//.word 0x563a79ea -//.word 0x39d320dc -//.word 0xef501112 -//.word 0x777f7268 -//.word 0x4ac4a30d -//.word 0xee6174e4 -//.word 0xc8f4962a -//.word 0x3241505a -//.word 0xcd32734d -//.word 0x181c90a6 -//.word 0x4244686d -//.word 0x3da2a4fa -//.word 0x14e5c715 -//.word 0x7eb7605b -//.word 0xb34184e4 -//.word 0x7ef27b22 -//.word 0x947cba0c -//.word 0x2420117c -//.word 0xaf2c26d6 -//.word 0x1ac222eb -//.word 0x02daaa1d -//.word 0x4f8a11c3 -//.word 0x0c86cccf -//.word 0x76e326ae -//.word 0x5220356f -//.word 0x84660c28 -//.word 0xde0f3295 -//.word 0x36665303 -//.word 0xbbad366c -//.word 0x8965efe4 -//.word 0x7ac95633 -//.word 0x3f9cb7c4 -//.word 0xb024cbbe -//.word 0x6177e770 -//.word 0x76f574f2 -//.word 0xb8169f09 -//.word 0xe866514c -//.word 0x53cd6285 -//.word 0xa6140a5a -//.word 0x04a5982d -//.word 0x56926640 -//.word 0xe2d90c1d -//.word 0x20e7d435 -//.word 0xc85a6ec7 -//.word 0x300be503 -//.word 0xd54cd270 -//.word 0x376ed08b -//.word 0xeb872fb1 -//.word 0xeb71ed3e -//.word 0x3016e1f7 -//.word 0x83eb3aa5 -//.word 0x90bb2803 -//.word 0x3ca6d9da -//.word 0x3869a76b -//.word 0xd6e0900d -//.word 0x1cc9e617 -//.word 0x18ca4700 -//.word 0x72b6d0c5 -//.word 0x480c8e8b -//.word 0x35c03586 -//.word 0xb33e1519 -//.word 0xa4ad493f -//.word 0x2b703229 -//.word 0xc0f32429 -//.word 0x84a45ece -//.word 0xd13f4051 -//.word 0x164fb82f -//.word 0xe2f2fe18 -//.word 0x3edc8108 -//.word 0x409e21b4 -//.word 0xdd289e27 -//.word 0xff8d50ad -//.word 0xd70719f0 -//.word 0x753b9961 -//.word 0x96bea0d9 -//.word 0xbdd7e980 -//.word 0x858705ef -//.word 0x35c69591 -//.word 0x9510bc4f -//.word 0x0020d46c -//.word 0xbbfc60ad -//.word 0x853142be -//.word 0x6f602fd1 -//.word 0xeef95f88 -//.word 0x2f478915 -//.word 0xaaad0ea0 -//.word 0xfa2f75e8 -//.word 0xec33172e -//.word 0xd6891b4f -//.word 0x2aaaa530 -//.word 0x4a3d4b5e -//.word 0x9ee0c9f6 -//.word 0xe524f5c3 -//.word 0xc8d9f5a7 -//.word 0xb58daf3c -//.word 0xea4f81ba -//.word 0xd0b9321c -//.word 0x8b2d297e -//.word 0xcf5eddca -//.word 0xf5128d93 -//.word 0x4e273141 -//.word 0xb7d4b06f -//.word 0x6d325391 -//.word 0x23fb7ada -//.word 0x52918e5d -//.word 0xd1423672 -//.word 0xa5cace5b -//.word 0x1a191527 -//.word 0x135725d7 -//.word 0x9e26a9c0 -//.word 0xcb274a30 -//.word 0xbfbf6a54 -//.word 0x041b1559 -//.word 0x237134d2 -//.word 0x7589045a -//.word 0x367dc77a -//.word 0xdbbdbacd -//.word 0xa5554661 -//.word 0x77737a61 -//.word 0xe523b9f1 -//.word 0x8d5eb05a -//.word 0xaa438b67 -//.word 0xe6a4690f -//.word 0x70c40d53 -//.word 0x4f5fd66a -//.word 0xf6ebf11c -//.word 0x181ecd6c -//.word 0xbdb0cf79 -//.word 0x966248a6 -//.word 0x8d3fa4f9 -//.word 0xa122e4c1 -//.word 0xf1784e7c -//.word 0x164762f7 -//.word 0xb67011b7 -//.word 0x56312a98 -//.word 0x70ed15b4 -//.word 0xc630c386 -//.word 0xf5eee550 -//.word 0x4d0b5cb9 -//.word 0xe020f1bb -//.word 0xd97d47bc -//.word 0x106a0dfb -//.word 0xdbb3782e -//.word 0x2663f16a -//.word 0xc6cf0b42 -//.word 0x0ad6b733 -//.word 0x9368bb40 -//.word 0x664560d9 -//.word 0x40076b01 -//.word 0x2a634fb0 -//.word 0x4caca176 -//.word 0x0698cc62 -//.word 0x3d470622 -//.word 0xf381836b -//.word 0x1b40e89c -//.word 0xab6e029e -//.word 0xf2efb80e -//.word 0x2ce23e9e -//.word 0x54248cb8 -//.word 0x39160f65 -//.word 0xd4a19e6e -//.word 0xd977afc1 -//.word 0x8c9bcb15 -//.word 0xd6233fd1 -//.word 0x983d152a -//.word 0x3f70428c -//.word 0x9924213c -//.word 0xe765203b -//.word 0x33e4ba6d -//.word 0xe33ea5fa -//.word 0x8f814cf5 -//.word 0x10ed7f3c -//.word 0xd9f7699f -//.word 0x8b94c344 -//.word 0xc3b34849 -//.word 0x360b69ac -//.word 0x01184168 -//.word 0x3a60cbe1 -//.word 0xcbfb5382 -//.word 0x80522aa5 -//.word 0x5e279eb3 -//.word 0x37d6298c -//.word 0x7bdae929 -//.word 0x51925080 -//.word 0xe6451da7 -//.word 0x05658b3d -//.word 0xe910c806 -//.word 0x4fdca8d5 -//.word 0xcfd49baf -//.word 0x6bbedd2d -//.word 0x69a0ec22 -//.word 0x5e823f7e -//.word 0x8c743572 -//.word 0x6dd34cd5 -//.word 0x90c993c7 -//.word 0xa4136294 -//.word 0xd30748db -//.word 0x51d545ef -//.word 0x340d397d -//.word 0x86619d6f -//.word 0x98ad7111 -//.word 0x9a347572 -//.word 0x692c9c0e -//.word 0xa87ebea9 -//.word 0x12c78d7e -//.word 0x0ea2ca99 -//.word 0x8429b982 -//.word 0xf0b9d21b -//.word 0xb5f6b9cb -//.word 0xb30f70dc -//.word 0x1b44cc22 -//.word 0x82a525de -//.word 0x351c52e1 -//.word 0xcdadd4f5 -//.word 0x03fd5278 -//.word 0xc511464a -//.word 0x8959f5ea -//.word 0xe1eda4db -//.word 0x4f16094d -//.word 0x5b1000f9 -//.word 0xe40e7f4d -//.word 0xb47fccc9 -//.word 0x5790eda9 -//.word 0x2cf261c4 -//.word 0xbcdd0db4 -//.word 0x4b557937 -//.word 0xadac3cd5 -//.word 0x5b48b5c3 -//.word 0xc6a6fc08 -//.word 0xeb9f18de -//.word 0x28ea735b -//.word 0x4ee38b50 -//.word 0xf78ae972 -//.word 0x1acf57b7 -//.word 0xdc0d4e03 -//.word 0xa9d4ae04 -//.word 0x84ebb15a -//.word 0x9b9522fc -//.word 0x1f14cad7 -//.word 0x526c2cb8 -//.word 0xe269726b -//.word 0x75e3a625 -//.word 0x8541251f -//.word 0x6e3c5184 -//.word 0xc5e6878d -//.word 0xecea51ea -//.word 0xe315dc65 -//.word 0x6115acc2 -//.word 0x24818ee9 -//.word 0x851ace47 -//.word 0x4f51ab71 -//.word 0xd109080a -//.word 0x329d64e8 -//.word 0x05250c72 -//.word 0x1df58f4c -//.word 0xa3677337 -//.word 0x65db2632 -//.word 0x71fb37e5 -//.word 0xe344c640 -//.word 0xfbc23a60 -//.word 0x731a32b2 -//.word 0x0fcebd5a -//.word 0x75bdcdd6 -//.word 0x3fe9e9de -//.word 0x4f7d238f -//.word 0x620f4ac9 -//.word 0xe82260d6 -//.word 0x14ef4e4c -//.word 0x2f65d734 -//.word 0x316ecb6b -//.word 0x92747d49 -//.word 0x5e247681 -//.word 0x88716b48 -//.word 0x80dc6dba -//.word 0x07f36079 -//.word 0x4318ae97 -//.word 0x0e843db6 -//.word 0x948c9e6d -//.word 0x1d2287ee -//.word 0x279e83e6 -//.word 0xb8bfe8a5 -//.word 0xf2ec097f -//.word 0xe8c0ae72 -//.word 0xb0c6c109 -//.word 0xba814a7f -//.word 0x5fb09e28 -//.word 0xbdcfd20d -//.word 0xc3e176d6 -//.word 0x886d80ee -//.word 0xe1c787e1 -//.word 0x32903209 -//.word 0x8480ef69 -//.word 0xd863e8d9 -//.word 0xbb623364 -//.word 0x1b8448ee -//.word 0x5975b919 -//.word 0x9f851d6a -//.word 0x74f34da8 -//.word 0x8e6cd485 -//.word 0xe7cfa081 -//.word 0x1333fe0a -//.word 0xd02bc5e8 -//.word 0xdf49d0d8 -//.word 0x12e0b277 -//.word 0xa70ea662 -//.word 0xd4fac59c -//.word 0xa35b7c30 -//.word 0x003a3c17 -//.word 0x10f8735b -//.word 0xc592bc7d -//.word 0xb0245215 -//.word 0x16accbb8 -//.word 0x4511031e -//.word 0x28645684 -//.word 0x1a651250 -//.word 0xf8492bf4 -//.word 0x7aba3114 -//.word 0xc32080eb -//.word 0x361fb7eb -//.word 0x8c606ba3 -//.word 0x23951ce6 -//.word 0x99b7672a -//.word 0x9a927e2e -//.word 0xf684d6e0 -//.word 0xf7821f7d -//.word 0xf15b79fa -//.word 0x1a41e5a3 -//.word 0x9c85f902 -//.word 0xe9a2d902 -//.word 0x4f7d6254 -//.word 0xcceba812 -//.word 0x2374a3a2 -//.word 0x2f5725de -//.word 0x78cd0f71 -//.word 0x0492c584 -//.word 0x70a2df9b -//.word 0x3f4022b9 -//.word 0x713daecb -//.word 0x57777843 -//.word 0xa7a0fb04 -//.word 0xcc412b7e -//.word 0x7ffeab1a -//.word 0x9b1b3fd8 -//.word 0x2d3f8436 -//.word 0xcb78df55 -//.word 0x2880b357 -//.word 0xe53fd70b -//.word 0xa99047cc -//.word 0x734819a6 -//.word 0x2f75b3bb -//.word 0x88e33ce5 -//.word 0xfee5509d -//.word 0x3851f81c -//.word 0x9bcdd9bf -//.word 0x1b49abb0 -//.word 0x51cdedc3 -//.word 0xce75d79e -//.word 0xb0ba911d -//.word 0x73f2a2f5 -//.word 0x091aab97 -//.word 0x2cd45557 -//.word 0xf3ac88cd -//.word 0xa39fde7b -//.word 0xc8de57b1 -//.word 0x85cf4eae -//.word 0x2955ab08 -//.word 0x02515b4e -//.word 0x7669fdeb -//.word 0x4f08de4d -//.word 0x57a52847 -//.word 0x254956b4 -//.word 0x364beb5e -//.word 0x405e641e -//.word 0xc2cf6b44 -//.word 0xe0074d38 -//.word 0x6e57ae62 -//.word 0x4bf57c48 -//.word 0xf04121f6 -//.word 0x484dfda3 -//.word 0xc39d1391 -//.word 0xa62b0235 -//.word 0xa5ae3898 -//.word 0xb31c62fd -//.word 0x196e26c4 -//.word 0xc5a3158e -//.word 0xe507dba2 -//.word 0xb5b5b990 -//.word 0x955b3614 -//.word 0x5f3d113c -//.word 0xf77d79cd -//.word 0x249980e4 -//.word 0x9e35ced9 -//.word 0x681b9268 -//.word 0x5f80bf13 -//.word 0x148974c2 -//.word 0xd70dbbad -//.word 0x149d777b -//.word 0xe3c198ab -//.word 0xda859134 -//.word 0x25340c68 -//.word 0xd964dc1e -//.word 0x86323310 -//.word 0x0ccf1582 -//.word 0xaf3c0c25 -//.word 0x6d511e3a -//.word 0x8e04fcfa -//.word 0x7ee87c36 -//.word 0xd8f4493b -//.word 0xc386d9f8 -//.word 0x81a7a063 -//.word 0x45918418 -//.word 0x456f9043 -//.word 0x1163ecc1 -//.word 0x23cd0d82 -//.word 0xb7cb2932 -//.word 0xddfcee18 -//.word 0xcc8a733e -//.word 0x79676fd2 -//.word 0x68d6a9cc -//.word 0xc22eafd1 -//.word 0xa9dacb57 -//.word 0xc8a5330b -//.word 0x2e35806f -//.word 0x5cd461c8 -//.word 0x9c779137 -//.word 0x95f80626 -//.word 0x1da76ce5 -//.word 0x4e01d195 -//.word 0xdcbfa246 -//.word 0xa513d65c -//.word 0x8a2e6937 -//.word 0x7e050c13 -//.word 0xdc551b2c -//.word 0xfee4cf26 -//.word 0x0b0bb5ad -//.word 0x10715e59 -//.word 0x531958d4 -//.word 0xe49f5e3e -//.word 0x74beccd0 -//.word 0x6a1656c0 -//.word 0x342cf865 -//.word 0xdbb3309c -//.word 0xdb0a6c6a -//.word 0x3105bee3 -//.word 0xb5f0d74a -//.word 0xaad13379 -//.word 0x94ee9183 -//.word 0x498fa699 -//.word 0x4b05122a -//.word 0x55eb934e -//.word 0x34ac7965 -//.word 0xd8465afb -//.word 0xab4d06f0 -//.word 0x2232bdd5 -//.word 0x91c5a098 -//.word 0x43f96664 -//.word 0xcae750c3 -//.word 0x94165f06 -//.word 0xbffac4e6 -//.word 0x2eba986b -//.word 0xdd37cd0d -//.word 0x7149651a -//.word 0x144be157 -//.word 0x7fdbfdea -//.word 0x58db9a77 -//.word 0xbfbbfc8a -//.word 0x24fb3535 -//.word 0x5bebe1fa -//.word 0xf2b614ea -//.word 0xc29e910f -//.word 0xc4893d08 -//.word 0x26bdd3f3 -//.word 0x9ee8d890 -//.word 0xff63d2a2 -//.word 0x0ab7b599 -//.word 0x86619e6f -//.word 0x93d2c3d0 -//.word 0x3bbaaa7d -//.word 0x4a869af2 -//.word 0x5f275047 -//.word 0x4416f254 -//.word 0x7b954918 -//.word 0x19372a5c -//.word 0xd8a23593 -//.word 0x6794c305 -//.word 0x0424192c -//.word 0x4d4be25e -//.word 0x53a2dcad -//.word 0xf16dd10c -//.word 0x5cd9c9b3 -//.word 0xfa827ec4 -//.word 0x7838102e -//.word 0x1703fad1 -//.word 0x466445e4 -//.word 0x76defb94 -//.word 0x2ab5dfee -//.word 0x4df65bff -//.word 0xc9b7ba3a -//.word 0x55a0971a -//.word 0x8eab9508 -//.word 0x4a27517e -//.word 0x2903956d -//.word 0x6d49cfdc -//.word 0x0be9c1d2 -//.word 0x01b87977 -//.word 0xebb88476 -//.word 0xd19a5fa5 -//.word 0x44812ee8 -//.word 0xa909b053 -//.word 0xd488738e -//.word 0xd994447e -//.word 0x1ec5ea21 -//.word 0xb5bb14ba -//.word 0xe9638f2f -//.word 0x1777bcaf -//.word 0xc0444297 -//.word 0xdbb00097 -//.word 0x707b4611 -//.word 0x62c544c1 -//.word 0x8dd1c2a3 -//.word 0x10081211 -//.word 0xec41432c -//.word 0xcf3f987e -//.word 0x2a7b38de -//.word 0x89242793 -//.word 0x246575bc -//.word 0xb1e6b6ef -//.word 0x7d95b220 -//.word 0xbba65dc4 -//.word 0x1c800000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00004B28 -//// expected output -//.word 0xdb7e2ece -//.word 0x42b5186f -//.word 0x84e6c140 -//.word 0x7593a9b9 -//.word 0xe2971aba -//.word 0x7122b816 -//.word 0x7b21b31e -//.word 0xa5f0bd21 -//.word 0xff754e4f -//.word 0xefba71c9 -//.word 0x327eeb19 -//.word 0x625702b6 -//.word 0x4426acce -//.word 0x7fd88467 -//.word 0xadc3d2b3 -//.word 0x8a861abd -//// SHA512LongMsgvector_24 -//// vector length -//.word 0x00004E40 -//// input message -//.word 0x1dc9e32a -//.word 0xc4176f64 -//.word 0xbd78a6ed -//.word 0xd651ebee -//.word 0xa3ba85df -//.word 0xcd8298a8 -//.word 0xad725406 -//.word 0x19d66d31 -//.word 0x7e3acbbc -//.word 0x2f7282bc -//.word 0xfddd042c -//.word 0x08ea9690 -//.word 0xd5da00d9 -//.word 0xa0c88989 -//.word 0xf3e72217 -//.word 0x770ce295 -//.word 0x0b6cb290 -//.word 0x13a64a38 -//.word 0x12045cc0 -//.word 0x7cfd0e08 -//.word 0xc5ffae7a -//.word 0xbe6ca132 -//.word 0x21e39d61 -//.word 0x6ac019f3 -//.word 0xe9e6016f -//.word 0x16bcad1f -//.word 0x24751472 -//.word 0xd9953d9e -//.word 0x9cb0f789 -//.word 0xd075caea -//.word 0x60ec2dab -//.word 0x9bfcf993 -//.word 0x43301e21 -//.word 0xe0bb95bb -//.word 0x5ab99608 -//.word 0xc7b70a9a -//.word 0x827643d0 -//.word 0x7decebfa -//.word 0xd88c3abf -//.word 0xb2c76cbc -//.word 0x3fd3736e -//.word 0x1aabe952 -//.word 0xdd57484a -//.word 0xf06d5d43 -//.word 0x9ed8fa15 -//.word 0x6ed8ecaa -//.word 0xb04a2c63 -//.word 0x562a5ab7 -//.word 0x0556661e -//.word 0x6c94912d -//.word 0xd5d79402 -//.word 0xf9be1ee2 -//.word 0x195e8421 -//.word 0x4a41b442 -//.word 0x11ae6c60 -//.word 0x2f2ba9cd -//.word 0xbe4161f8 -//.word 0x7d7f7494 -//.word 0x69c2e1f6 -//.word 0x8db335bf -//.word 0x1a904abc -//.word 0xba302d0a -//.word 0x2241607e -//.word 0xe6d54243 -//.word 0x921dcbc5 -//.word 0xf6737cce -//.word 0xc19e96ef -//.word 0x52528b22 -//.word 0xcaf7b2ad -//.word 0x66ab3e4a -//.word 0x0c8a7184 -//.word 0x232d0d64 -//.word 0xa8700c4d -//.word 0x7e799025 -//.word 0x06f61db5 -//.word 0xf0a50653 -//.word 0x511a25be -//.word 0xf5bdcf49 -//.word 0xf612073c -//.word 0x8d3df277 -//.word 0x29c58c58 -//.word 0xbe9898df -//.word 0x604fdd10 -//.word 0x10b48f99 -//.word 0xd6810cb5 -//.word 0x106bc950 -//.word 0x095f8b6c -//.word 0xcd0cdac3 -//.word 0x3ca1b2ae -//.word 0x5ed87d45 -//.word 0xf6333ec8 -//.word 0x5a850f3e -//.word 0x81b5cd5b -//.word 0x5ebf12a7 -//.word 0x6cfb63dd -//.word 0x8ba2ab91 -//.word 0x0a8ee816 -//.word 0x0541259f -//.word 0xf129a8a4 -//.word 0x75236c88 -//.word 0x7b3dd278 -//.word 0x88c09396 -//.word 0x486ef957 -//.word 0x6e084f29 -//.word 0xbb13965a -//.word 0x5bdc7935 -//.word 0x78ba836e -//.word 0x0a9390c0 -//.word 0xeca181d4 -//.word 0x35763465 -//.word 0xc53eb4a2 -//.word 0x1e45acd3 -//.word 0x76b92240 -//.word 0x0ab0614e -//.word 0xb46c37ec -//.word 0xc0de612d -//.word 0xfc6a4436 -//.word 0x0eeade5b -//.word 0x0af5fb85 -//.word 0x4461acd7 -//.word 0x6306f591 -//.word 0xb7c5c634 -//.word 0xcdca2ce7 -//.word 0x400dc919 -//.word 0xd11f8268 -//.word 0xba2377c1 -//.word 0x401a38c9 -//.word 0x8865367c -//.word 0xab847714 -//.word 0x0c248e2d -//.word 0xea59cb26 -//.word 0x3128afca -//.word 0x9648a230 -//.word 0xe229e8df -//.word 0x8e36d236 -//.word 0x9158310c -//.word 0x76bb1093 -//.word 0xb1d4a382 -//.word 0x33a37a73 -//.word 0x3c35fa89 -//.word 0x716e0e57 -//.word 0x2e051afd -//.word 0x1dd03194 -//.word 0x084287cd -//.word 0xeb3229d4 -//.word 0x4eddeb7b -//.word 0xd12fa294 -//.word 0x093e949e -//.word 0x8a182da5 -//.word 0x45bef463 -//.word 0x1570bdab -//.word 0x942b1f08 -//.word 0x337128a1 -//.word 0x8a48505f -//.word 0xec85ac52 -//.word 0x3f4a6451 -//.word 0x0ace67e1 -//.word 0xd05c5d59 -//.word 0x9d9fde43 -//.word 0xde1ce104 -//.word 0x750077c0 -//.word 0x0d1cb978 -//.word 0xab2efe75 -//.word 0x866252ea -//.word 0x191824d5 -//.word 0x76e83f26 -//.word 0xdde3fc23 -//.word 0x8d1cb50b -//.word 0xda687cf9 -//.word 0x80610d0c -//.word 0x37b102c5 -//.word 0x888d46b0 -//.word 0xde7fcc47 -//.word 0xe0698113 -//.word 0xfec77f14 -//.word 0x4a348363 -//.word 0x8a30a116 -//.word 0x8b203664 -//.word 0xb8961f0a -//.word 0xead328ec -//.word 0x828ac700 -//.word 0xb6e70b68 -//.word 0x28d0cfde -//.word 0xbd6b3355 -//.word 0xace04ddd -//.word 0xd5601bc8 -//.word 0x5566bc0b -//.word 0x573ce0e7 -//.word 0x2cc27ec8 -//.word 0x9f6bc56d -//.word 0x82885449 -//.word 0x8dc9ad29 -//.word 0x6900e718 -//.word 0x0729a47f -//.word 0x36a84391 -//.word 0x75d157e6 -//.word 0x05ad5766 -//.word 0x43fb9769 -//.word 0x3576761d -//.word 0x6356d927 -//.word 0xe819d98d -//.word 0xc883b9d3 -//.word 0x84e41b64 -//.word 0xec997334 -//.word 0x35d5bba4 -//.word 0x4ba269a6 -//.word 0x68229e21 -//.word 0xe61ba097 -//.word 0x52b28a05 -//.word 0xc177420a -//.word 0x67a2ac4c -//.word 0x659c1d18 -//.word 0xe3c21348 -//.word 0x5f65236a -//.word 0x4415321e -//.word 0xbf1fe8c0 -//.word 0xce546247 -//.word 0x9a0c276d -//.word 0x066b5e11 -//.word 0x88e33ed9 -//.word 0x38fac51b -//.word 0x264eadfe -//.word 0xf1d69cdc -//.word 0x956a9beb -//.word 0x8586c91d -//.word 0xfa4b5044 -//.word 0x8ac6997a -//.word 0xfc75bcc0 -//.word 0x5b073be5 -//.word 0x4964efaa -//.word 0x96ed4223 -//.word 0x11059f60 -//.word 0x9ed0274d -//.word 0x893aa6d7 -//.word 0x1a3cc550 -//.word 0x6a5b8115 -//.word 0x7471db6e -//.word 0x6fafd1b5 -//.word 0x5ce38ebb -//.word 0xdbf7de67 -//.word 0x42bae4a0 -//.word 0xf0e40f6d -//.word 0xdf544a5b -//.word 0x799b7320 -//.word 0xadbe0f7d -//.word 0x41383c69 -//.word 0x6a3fe66b -//.word 0x9a483e48 -//.word 0x99cd68de -//.word 0xd74e7450 -//.word 0x01969063 -//.word 0xd23f7c28 -//.word 0x2c783edc -//.word 0x6706160c -//.word 0xe989b4fc -//.word 0xf601a94a -//.word 0xca901ccf -//.word 0xe582bec6 -//.word 0xa78a0030 -//.word 0x1c4e8377 -//.word 0x1926cf51 -//.word 0x882149e7 -//.word 0x004a5f37 -//.word 0x992906b6 -//.word 0xfe8c663a -//.word 0xc387d318 -//.word 0xf9b90089 -//.word 0x00d16f53 -//.word 0x9d512ca5 -//.word 0x4c92bb42 -//.word 0xd8084fe1 -//.word 0x28c83dd4 -//.word 0x5c47afe9 -//.word 0x19659d8e -//.word 0x20aaf938 -//.word 0x26cf2a05 -//.word 0xe080bca0 -//.word 0x5d605665 -//.word 0x984eecc5 -//.word 0x4ee735ec -//.word 0x0d4b60a2 -//.word 0x8e24036f -//.word 0x44e55403 -//.word 0x35509bd4 -//.word 0x093be709 -//.word 0x60930097 -//.word 0x69a19eaa -//.word 0xb18cd846 -//.word 0x3820df2e -//.word 0xcacdec05 -//.word 0x8cf377b3 -//.word 0xd65daa0a -//.word 0x400b15aa -//.word 0x0034a321 -//.word 0x738bcd57 -//.word 0xf9c20d2a -//.word 0x064c9655 -//.word 0x76684296 -//.word 0x215bcc10 -//.word 0xb0fc3fee -//.word 0xaf76ae49 -//.word 0xe34a264b -//.word 0xdd93e195 -//.word 0xcf8ebcdf -//.word 0x9f59ebde -//.word 0x3afbec6b -//.word 0x2ba5b9e1 -//.word 0x6c3842c7 -//.word 0x7b061aaf -//.word 0xb1dd715d -//.word 0xd042422c -//.word 0xdbfacdae -//.word 0x2acf4893 -//.word 0xbd90d2cc -//.word 0xd15aa8f0 -//.word 0xb1169bde -//.word 0xcf43c2a4 -//.word 0x13f66c9f -//.word 0x731e58e4 -//.word 0xc40d29df -//.word 0xcf34143a -//.word 0xa82edc00 -//.word 0x3b010003 -//.word 0x28a0337b -//.word 0xd1b40cef -//.word 0xb09bff59 -//.word 0xefb18c85 -//.word 0x32cfb6ba -//.word 0xb812b79c -//.word 0xa2def251 -//.word 0x922229e3 -//.word 0x78ddf0e5 -//.word 0xa9e1615a -//.word 0x32d712d2 -//.word 0x6b8344d6 -//.word 0xcf495d86 -//.word 0x0af09981 -//.word 0x54a7fc05 -//.word 0xfe458b58 -//.word 0x4ad5bb66 -//.word 0x80522aab -//.word 0x3eaf8d53 -//.word 0x101ae9a0 -//.word 0x4082078d -//.word 0xf05722b1 -//.word 0x6591e265 -//.word 0xa6f38e29 -//.word 0x46917d44 -//.word 0x7e90cdab -//.word 0x7f2d5824 -//.word 0x0500e4ab -//.word 0x30829a15 -//.word 0x90cebaf3 -//.word 0x7ea48cb9 -//.word 0xb3b39a20 -//.word 0x13181cc8 -//.word 0xca22b422 -//.word 0x9a585b8d -//.word 0x73bd9bbf -//.word 0x45520067 -//.word 0x12ddc910 -//.word 0x47e9e249 -//.word 0x4c0e1703 -//.word 0x5a72823a -//.word 0x8d9045d8 -//.word 0x3a387fd6 -//.word 0x82d778a4 -//.word 0x27f91fcb -//.word 0x9f0cb7d1 -//.word 0x6767cd5c -//.word 0x9a8b6d9b -//.word 0xc2a895e2 -//.word 0xee63ea94 -//.word 0x05d6aa46 -//.word 0x59d8e221 -//.word 0x7f7fe188 -//.word 0x5fe4ecfb -//.word 0x8726333c -//.word 0xc5b204b0 -//.word 0xf4c13f07 -//.word 0x16220a20 -//.word 0xa339c526 -//.word 0x21484100 -//.word 0xf5ed2ce8 -//.word 0x79ecd059 -//.word 0x4e2ffe2f -//.word 0xf40b440a -//.word 0x97c566f3 -//.word 0x2c550c42 -//.word 0xbd69b9be -//.word 0x01adfc07 -//.word 0x304aea31 -//.word 0x15accbb2 -//.word 0x6589147e -//.word 0x4f1f9670 -//.word 0x54bdf4ec -//.word 0x59845ac3 -//.word 0xfb6f6c56 -//.word 0x22917dff -//.word 0xd99e02ac -//.word 0x5dad46cd -//.word 0x733c5f71 -//.word 0xff7560ab -//.word 0xd3b0d03b -//.word 0xc5385b6a -//.word 0x0452c836 -//.word 0xac7b2baf -//.word 0x97f25ca1 -//.word 0x7776a773 -//.word 0x2151c54f -//.word 0x2c950b84 -//.word 0xbba6e228 -//.word 0x97f87701 -//.word 0x811ab4a6 -//.word 0xc6f46ee1 -//.word 0x134de058 -//.word 0x8b90586c -//.word 0x17cf3062 -//.word 0xfd0800c0 -//.word 0xb5a712fa -//.word 0xf84d164e -//.word 0x19d017ed -//.word 0x9883ae5b -//.word 0xf5b77618 -//.word 0xc281bf80 -//.word 0xfcbe87f0 -//.word 0x9b55a62a -//.word 0x68bc48fb -//.word 0x0fbea01b -//.word 0x757bdb54 -//.word 0x4bb053e6 -//.word 0xe438062b -//.word 0x43d34677 -//.word 0x7927b242 -//.word 0x2e046489 -//.word 0x7dec6c71 -//.word 0x05d37d2e -//.word 0x3c23e723 -//.word 0x0703c54a -//.word 0x88d978d7 -//.word 0x370d5418 -//.word 0x351198a0 -//.word 0xdd9ea4a4 -//.word 0x9b4066a5 -//.word 0x0114164f -//.word 0x17d023a2 -//.word 0xf3056d4f -//.word 0x8aa1b465 -//.word 0xc6b8502c -//.word 0xd9842351 -//.word 0xd0aacd44 -//.word 0x6bbe1edf -//.word 0x2c0ad148 -//.word 0xae8b7718 -//.word 0x383db1bd -//.word 0x9299a21d -//.word 0x175ba47b -//.word 0x0c883a9f -//.word 0x30b04731 -//.word 0x94707d67 -//.word 0xad3c17e0 -//.word 0xa85bcbcf -//.word 0xfd33fa5b -//.word 0x47c72b46 -//.word 0x537eb7cd -//.word 0x7726c5d0 -//.word 0x25387933 -//.word 0xbf5e6984 -//.word 0xad3251de -//.word 0xae49070d -//.word 0x6b70b1f2 -//.word 0x52353529 -//.word 0xa1aaf1ea -//.word 0xc165ad2d -//.word 0xd6cbcd12 -//.word 0x948fcb7f -//.word 0x5475e50b -//.word 0x675c131b -//.word 0xaa7b3c4a -//.word 0x5aeba90f -//.word 0x2a65ba9a -//.word 0x934ed8fe -//.word 0x6cf0aa95 -//.word 0xba0b8ca0 -//.word 0xc98c3d2f -//.word 0x7c9cd741 -//.word 0xe1dc052b -//.word 0x08ef703e -//.word 0x163a7aa4 -//.word 0x95e72f8b -//.word 0x0e307886 -//.word 0xdada922f -//.word 0x35ffbf12 -//.word 0x94113cc6 -//.word 0x391c725d -//.word 0x044b70ff -//.word 0x8cae99d1 -//.word 0x6e3a9a1b -//.word 0xe512a0ab -//.word 0x9b05c774 -//.word 0xbf57d57b -//.word 0x58c428f4 -//.word 0xd9c2eda7 -//.word 0xf5079399 -//.word 0xb44b7fe9 -//.word 0xc74f02f8 -//.word 0x191e88cc -//.word 0xa69212b7 -//.word 0x901be633 -//.word 0x6fbc8411 -//.word 0xe956ddd3 -//.word 0x8429c056 -//.word 0xb79895b4 -//.word 0x472c4d68 -//.word 0xd1dc99b3 -//.word 0xa28c5a3f -//.word 0xcfd35903 -//.word 0x83013966 -//.word 0x9361aaa7 -//.word 0x58bbdf7c -//.word 0xbd1d41f9 -//.word 0x97db65b4 -//.word 0x35d53b27 -//.word 0x38f88955 -//.word 0xa50898b1 -//.word 0x399c2e3b -//.word 0xfd6abbec -//.word 0x1ac4d754 -//.word 0xed63ec82 -//.word 0x5e643024 -//.word 0x6e90d7ef -//.word 0x10e08641 -//.word 0x3a400a05 -//.word 0x3b944ad8 -//.word 0x4ff97a69 -//.word 0x714d9226 -//.word 0x70f1ff15 -//.word 0x45cd98ff -//.word 0xa495d3d4 -//.word 0xd14b394b -//.word 0xb50617c9 -//.word 0x31f17784 -//.word 0xb2964ee8 -//.word 0x065df73a -//.word 0x6e4fe07b -//.word 0xf420848f -//.word 0xfe6d999e -//.word 0x24428abb -//.word 0x3fdf27c3 -//.word 0xc2bc9c88 -//.word 0x4eca9f2f -//.word 0x80fceed7 -//.word 0x0e06f97c -//.word 0x1265db1a -//.word 0xa59f8f15 -//.word 0xb0cc61d8 -//.word 0xff55a2bc -//.word 0x97fca02c -//.word 0x4a1cd608 -//.word 0x88325f46 -//.word 0x789db1df -//.word 0x47a287e9 -//.word 0xc1b31f00 -//.word 0x1ef1a6eb -//.word 0x1eeff17d -//.word 0x58b96db8 -//.word 0xce155939 -//.word 0xc60832d0 -//.word 0xd59c6f6e -//.word 0x3de16f44 -//.word 0x7932b029 -//.word 0x15b9413c -//.word 0xc3367acb -//.word 0xacfbea74 -//.word 0x043b918a -//.word 0xe1854fbb -//.word 0x4d8c9def -//.word 0x99297b72 -//.word 0xf5a3a956 -//.word 0x3e2d1a13 -//.word 0x17b0a671 -//.word 0x3bcbffa8 -//.word 0x1219e6c5 -//.word 0x82b29f4f -//.word 0x07f4a22b -//.word 0x068393bd -//.word 0x5e8e7450 -//.word 0x41541ab8 -//.word 0x42e7dd35 -//.word 0xae30949b -//.word 0x2034c1b0 -//.word 0x509508d6 -//.word 0x2c5ce6ea -//.word 0x2af59f6b -//.word 0xdc7b78df -//.word 0xc5372772 -//.word 0x6b6388e1 -//.word 0xad339196 -//.word 0x57168815 -//.word 0xf4397396 -//.word 0xe34cd1f3 -//.word 0xad8a87c5 -//.word 0x96f31dca -//.word 0x72dc2a8b -//.word 0xbaaa0d3b -//.word 0xdfdbdee1 -//.word 0xde46a5ba -//.word 0x15a3c9d8 -//.word 0x554dcb10 -//.word 0x38473313 -//.word 0xb57dcbdb -//.word 0xf14d0c49 -//.word 0x5846d60c -//.word 0xed3064c4 -//.word 0xde4c7e67 -//.word 0x5cddf0e4 -//.word 0xa9e63c07 -//.word 0x73368c9d -//.word 0x60a2ead8 -//.word 0xea92b3f5 -//.word 0x6dbf491b -//.word 0x7e3a0987 -//.word 0x7fb17de6 -//.word 0x70eed202 -//.word 0x08a08ca1 -//.word 0x055e78aa -//.word 0x80000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00004E40 -//// expected output -//.word 0x99820341 -//.word 0x517e3140 -//.word 0x475fc1a9 -//.word 0xe57a7f8b -//.word 0x8bb85293 -//.word 0xff7ccee2 -//.word 0x37542e72 -//.word 0x9531fe9d -//.word 0xaeeed96c -//.word 0x3f41d87f -//.word 0xaaae3a7c -//.word 0x6ecf3088 -//.word 0x42b2e08a -//.word 0xeb17e77a -//.word 0x64484f41 -//.word 0xc60cd93d -//// SHA512LongMsgvector_25 -//// vector length -//.word 0x00005158 -//// input message -//.word 0xf72b6620 -//.word 0xe71f7b50 -//.word 0x486d868e -//.word 0xaa2cd34b -//.word 0xcfef394b -//.word 0x7447944f -//.word 0x6f8a75f1 -//.word 0xfad317cf -//.word 0x4f4a95eb -//.word 0x75a65b52 -//.word 0x59f0dafc -//.word 0x208981f4 -//.word 0xbc6ee8b8 -//.word 0xbdbb4ee3 -//.word 0x6a6e4509 -//.word 0x116eace3 -//.word 0x9bccdeac -//.word 0x634829ca -//.word 0x491782b1 -//.word 0x02e37605 -//.word 0xb21464fe -//.word 0xbc4eea11 -//.word 0xd83a9dcd -//.word 0x678afd03 -//.word 0x0437a829 -//.word 0x5c0dcd00 -//.word 0x3f6ae475 -//.word 0xf7439cc5 -//.word 0xd86715e5 -//.word 0x18085021 -//.word 0xe177e403 -//.word 0xa52ff276 -//.word 0xb2155a2b -//.word 0x06fe2f3c -//.word 0x64726910 -//.word 0xa7b0da7e -//.word 0x57f16435 -//.word 0x7af1685b -//.word 0xacac8174 -//.word 0x72657386 -//.word 0xcced5e7a -//.word 0x092238c6 -//.word 0xdfb67949 -//.word 0xbb321876 -//.word 0x563ab7b5 -//.word 0x89121b06 -//.word 0x6261dee8 -//.word 0x77356879 -//.word 0x7a481bde -//.word 0x0e82cee5 -//.word 0xd9be7de9 -//.word 0xdbd13ef7 -//.word 0xfec8772e -//.word 0xee724f6c -//.word 0x2a1f6227 -//.word 0x5ca6b998 -//.word 0xe6adf91f -//.word 0xbd24dae3 -//.word 0x7a13dbb9 -//.word 0xae963547 -//.word 0x76250d69 -//.word 0x5019edd3 -//.word 0x2d6c75f8 -//.word 0xc8c14e2b -//.word 0x35a46004 -//.word 0xbd124506 -//.word 0xe93cfd7e -//.word 0xdd88e3ae -//.word 0xe7d9df2b -//.word 0x5810de84 -//.word 0x93d37f24 -//.word 0x638d0f7a -//.word 0x92b5b857 -//.word 0xb754f597 -//.word 0x4fc14903 -//.word 0x0faf3176 -//.word 0x796a573f -//.word 0xae5e08c7 -//.word 0x83d9e874 -//.word 0xd612e5cc -//.word 0x236969de -//.word 0x52f0d4dd -//.word 0xd32b290f -//.word 0xed1407e5 -//.word 0x5362dc6c -//.word 0xf90b55e4 -//.word 0x250819ad -//.word 0xc958b66b -//.word 0x1047db62 -//.word 0x37f0c922 -//.word 0x9e010469 -//.word 0x1fbe4e45 -//.word 0x9e49d579 -//.word 0xe120ac22 -//.word 0xa2e7789a -//.word 0xe3686c9d -//.word 0x82d877aa -//.word 0x0d5bbbac -//.word 0xd7cb42da -//.word 0x4cb5ecdc -//.word 0x81a5ac2f -//.word 0x10a4f4ca -//.word 0x22fe6e02 -//.word 0xcd49edab -//.word 0xa1a2a380 -//.word 0x7d3a94c5 -//.word 0xa7124a2a -//.word 0x1c02cbf3 -//.word 0x2500c856 -//.word 0x2b9f1724 -//.word 0xccd664ac -//.word 0x2f0323dd -//.word 0x942fc8aa -//.word 0x2f943bb3 -//.word 0x365c8621 -//.word 0x39acd1d1 -//.word 0xb2e191b6 -//.word 0xdd1afc78 -//.word 0xc9f6c061 -//.word 0xaf9ff47a -//.word 0x84074ff1 -//.word 0xca7198be -//.word 0xab345d86 -//.word 0x48bbe8c0 -//.word 0x4fd16f16 -//.word 0xcb1b8b0e -//.word 0x41e6ebe9 -//.word 0xf8244acc -//.word 0x98b09e1d -//.word 0xf7da9330 -//.word 0x2f1f3723 -//.word 0xf438f706 -//.word 0x2457ca3f -//.word 0xa0adac2d -//.word 0x5b2f4e0c -//.word 0xb09a0c19 -//.word 0xf9b41ff6 -//.word 0x5dd5144f -//.word 0xe9a77cbe -//.word 0xe22ae6ec -//.word 0x5afb0afa -//.word 0x02d5471f -//.word 0x3f585092 -//.word 0x800922aa -//.word 0xce9b3943 -//.word 0xa56d0365 -//.word 0x02539520 -//.word 0xbd999dba -//.word 0x1945970d -//.word 0x9a9d442a -//.word 0x16e95842 -//.word 0x0f7a73c7 -//.word 0x40eb53ce -//.word 0x76a748b8 -//.word 0xa1abe811 -//.word 0x2b8e03b8 -//.word 0x88beda40 -//.word 0x0f0c8b97 -//.word 0x086bd0e5 -//.word 0x06f4e9b7 -//.word 0x772ed75d -//.word 0x798dcb90 -//.word 0xef38de59 -//.word 0xd40f022e -//.word 0xd0ed395d -//.word 0x092a05ae -//.word 0x3c651f43 -//.word 0x0c806bc4 -//.word 0x9aeb2cb9 -//.word 0x55267537 -//.word 0x1481e0bf -//.word 0x62278163 -//.word 0x185a1d2a -//.word 0x320098b6 -//.word 0xdb5fad24 -//.word 0xca25e234 -//.word 0xd1abbaaa -//.word 0xb37a2cf4 -//.word 0x370f540c -//.word 0x7adb69a0 -//.word 0x898eef71 -//.word 0x2f952df9 -//.word 0x0ce1e250 -//.word 0xe7eb3450 -//.word 0x46f5e9f8 -//.word 0x3b92d90e -//.word 0x8068a308 -//.word 0xc635a02d -//.word 0x4b1015f8 -//.word 0xabf2adbd -//.word 0xf874268e -//.word 0x0cda4a60 -//.word 0x1e51216a -//.word 0x947565ce -//.word 0x1816367b -//.word 0xee3c0f52 -//.word 0x8568f988 -//.word 0x4c1dfe4b -//.word 0xc69fe1a8 -//.word 0xe1fb0cac -//.word 0x8447cac9 -//.word 0x672bb67c -//.word 0x27a1742d -//.word 0x9af89e57 -//.word 0x601f01e8 -//.word 0xba200aeb -//.word 0x9feb7b64 -//.word 0x0d55627b -//.word 0x9e604cdd -//.word 0x5bbdb660 -//.word 0xd48fc4e6 -//.word 0x71723683 -//.word 0x03bc97e2 -//.word 0x9e03b7e4 -//.word 0xabdf5c8b -//.word 0x39f03517 -//.word 0x94230f6e -//.word 0x19324bc1 -//.word 0x486a906d -//.word 0x1bb1bd1f -//.word 0x96c7223c -//.word 0xa0ccef80 -//.word 0x1103ece5 -//.word 0x0cd56bc6 -//.word 0x8f197c44 -//.word 0x48925fe9 -//.word 0xabb93f8b -//.word 0x41bd1d73 -//.word 0x43c90abf -//.word 0x67859905 -//.word 0xfadf9439 -//.word 0x2f0beed1 -//.word 0xb7c8f926 -//.word 0x91e6d91e -//.word 0x24053908 -//.word 0x8b9f3cc7 -//.word 0x3049b633 -//.word 0x9c359dbc -//.word 0x8dfcba51 -//.word 0x499aa480 -//.word 0x33baefde -//.word 0x9c35a1a9 -//.word 0xdbd5e5ac -//.word 0xa05e0463 -//.word 0x85cf9060 -//.word 0xe6e5e3ed -//.word 0xf3e1c8f3 -//.word 0x038b771a -//.word 0x2c77c732 -//.word 0x10879fd2 -//.word 0xf9b1ad3e -//.word 0x29025b8e -//.word 0x6be3ff0d -//.word 0xee9c52e0 -//.word 0x531624e8 -//.word 0x05e54ee9 -//.word 0xc985e7eb -//.word 0x96e4bbe0 -//.word 0xa621f888 -//.word 0xcd942b92 -//.word 0x0a0e6b04 -//.word 0x5c62d4dc -//.word 0xd62438f7 -//.word 0xf6b01033 -//.word 0x336eb9d1 -//.word 0xd555dd1d -//.word 0x09ae2f50 -//.word 0x351b5bb5 -//.word 0x89d73c0b -//.word 0xd73f502b -//.word 0xa4926aea -//.word 0x7ff5a741 -//.word 0x91baa3ab -//.word 0x76e1edcf -//.word 0x4bdfb85f -//.word 0x089fd340 -//.word 0x10c7dbeb -//.word 0x073caf13 -//.word 0xe4e82488 -//.word 0x47bbfa5b -//.word 0x0cef0f43 -//.word 0x2091d33f -//.word 0x933dfc7d -//.word 0xef297b7b -//.word 0xc964ae6c -//.word 0x9560d7dd -//.word 0xbfafcd98 -//.word 0xf70af1c8 -//.word 0xcc97645f -//.word 0x7c6c77b5 -//.word 0x0a4f6371 -//.word 0x92bf3bad -//.word 0xda391e55 -//.word 0x29b4b1d0 -//.word 0x5c6ecce3 -//.word 0x36ea74d2 -//.word 0xf8390ac8 -//.word 0x317ac178 -//.word 0xd89d5605 -//.word 0x986cfb1f -//.word 0x6bcb9470 -//.word 0x6a3e2536 -//.word 0xe4ad8b31 -//.word 0xad646bbf -//.word 0xb85e6946 -//.word 0xe8c39ad2 -//.word 0x24af3bff -//.word 0xaa35a31a -//.word 0xa5a47683 -//.word 0x01081c55 -//.word 0x7ef47149 -//.word 0x037fbed8 -//.word 0x368de9a0 -//.word 0x4950e809 -//.word 0x160e7b28 -//.word 0x6f241be4 -//.word 0xaf4b2d57 -//.word 0x951a7c77 -//.word 0x53cce6f5 -//.word 0xe1445665 -//.word 0x974ef2a0 -//.word 0xfb289566 -//.word 0xd8417f48 -//.word 0x90404bc5 -//.word 0xb24822b4 -//.word 0xcf7a2fe2 -//.word 0x8abc52fb -//.word 0xefb919ae -//.word 0x0629ec0c -//.word 0xa7538731 -//.word 0x8fd0ae27 -//.word 0xb4911b07 -//.word 0xd624bc61 -//.word 0x57321bde -//.word 0x4c4d1e24 -//.word 0xd4e8f0fa -//.word 0xa9a73fad -//.word 0xf4daa8b2 -//.word 0x66446f8c -//.word 0x842074f1 -//.word 0x42666228 -//.word 0xd44a2ab5 -//.word 0xc105b038 -//.word 0x39d9c393 -//.word 0xa84f534b -//.word 0x8bc4de31 -//.word 0x83232c41 -//.word 0xa7f43cca -//.word 0x1f967ecf -//.word 0xefc843ad -//.word 0x106f71ff -//.word 0xc5937bbf -//.word 0x2caa90ae -//.word 0x131913f5 -//.word 0x0ef84c0c -//.word 0xc6155ddb -//.word 0x943c771f -//.word 0x4fb64d10 -//.word 0x6210c941 -//.word 0x211efec7 -//.word 0x5d3e5f9d -//.word 0x35e12e47 -//.word 0x304837b6 -//.word 0x898cbd6c -//.word 0xcae1b5e0 -//.word 0x9c1b3224 -//.word 0xde7221c5 -//.word 0xf48236f3 -//.word 0x629626e1 -//.word 0x9925176f -//.word 0x109d5407 -//.word 0x976046c4 -//.word 0xe90ca0da -//.word 0x8000d932 -//.word 0xad1cdf54 -//.word 0xe7c70a8a -//.word 0x64374e42 -//.word 0xe6edb6b5 -//.word 0xd87e0dc6 -//.word 0x9999de2d -//.word 0x1846a0d4 -//.word 0xa16c2a81 -//.word 0xf6966db6 -//.word 0xa2f661d6 -//.word 0x8aab4088 -//.word 0xc53ff360 -//.word 0xad74c9bd -//.word 0x36406fed -//.word 0x7f161d98 -//.word 0xa7670d5b -//.word 0xe26931b3 -//.word 0xcc17251d -//.word 0xfd79637b -//.word 0xdd25b6ba -//.word 0xb906f1b2 -//.word 0x175ce04d -//.word 0x47047fec -//.word 0x3bfa6a06 -//.word 0x991c9512 -//.word 0x0d303da8 -//.word 0xe4291ee3 -//.word 0xd7a6e709 -//.word 0x24bceb6e -//.word 0xe4f51995 -//.word 0x98982e99 -//.word 0x052b29cb -//.word 0x4237ff9d -//.word 0x0f4b91bf -//.word 0x6843db87 -//.word 0x5aca6e96 -//.word 0x161e20b9 -//.word 0x4414020d -//.word 0x995b9267 -//.word 0xac0432f2 -//.word 0x0542d91a -//.word 0x776f09a9 -//.word 0xb1500130 -//.word 0x0f9a33a9 -//.word 0xb6b5f85a -//.word 0xdfbf83fd -//.word 0x73d4131d -//.word 0xd98d6dc3 -//.word 0x0bc68a52 -//.word 0xf0a58db0 -//.word 0xe6d8f8a6 -//.word 0x9d1d1e8a -//.word 0x2c08dc1b -//.word 0x5e0184ac -//.word 0x4d8c1a85 -//.word 0x33cdc386 -//.word 0x7c4b7a0d -//.word 0x20f4051a -//.word 0x2f6127b1 -//.word 0xae5c1880 -//.word 0xa19f32c2 -//.word 0x69dfed63 -//.word 0x50090d65 -//.word 0x63cc1a82 -//.word 0x80571113 -//.word 0xaf645930 -//.word 0xb575f819 -//.word 0xe75d07d4 -//.word 0x3d036318 -//.word 0xa763a66a -//.word 0xa4d55686 -//.word 0x10925c00 -//.word 0x3d74b72b -//.word 0x46fd713a -//.word 0xa09bd2a5 -//.word 0xf22ad5cf -//.word 0x27bbd8e5 -//.word 0xc1949709 -//.word 0x70785bb0 -//.word 0xe3286f48 -//.word 0xde29d41f -//.word 0x8dc83580 -//.word 0x185c1d1f -//.word 0x77cb68b6 -//.word 0x884ff8f1 -//.word 0x5e7aa988 -//.word 0xdc7886aa -//.word 0x83953da2 -//.word 0x89fed0b5 -//.word 0x2bcc8e49 -//.word 0x443e424d -//.word 0x1d46aad4 -//.word 0x87482a03 -//.word 0x271ec22e -//.word 0x125f3e3e -//.word 0x9ae1ac56 -//.word 0x677c13b6 -//.word 0xc91162df -//.word 0x4ccba7f7 -//.word 0x8da58170 -//.word 0x4d2dd8e5 -//.word 0xc487cb44 -//.word 0x37b4ea32 -//.word 0xcd15a6ab -//.word 0x9f2a05e9 -//.word 0x0ea09b88 -//.word 0x598bb5e7 -//.word 0x6ff0d7d1 -//.word 0x0186695d -//.word 0xdcbdad12 -//.word 0x7600f44f -//.word 0xc63712ea -//.word 0x59910f18 -//.word 0xa3801f8d -//.word 0x9305d4e4 -//.word 0x6a2d9340 -//.word 0xccdc4534 -//.word 0x17c94ee0 -//.word 0xf5cac35d -//.word 0x2d52d75c -//.word 0xbf379709 -//.word 0x2fb9d836 -//.word 0x21c16db5 -//.word 0x26669d05 -//.word 0xd6b5d432 -//.word 0x1fb298f6 -//.word 0xdc9abf24 -//.word 0xa96bdf46 -//.word 0xf6a60785 -//.word 0x5b54acca -//.word 0x2b47e623 -//.word 0x4ca2dd68 -//.word 0x469c7d1e -//.word 0x9980729b -//.word 0x54f8506b -//.word 0xe38c11f3 -//.word 0x2966c554 -//.word 0xcf588593 -//.word 0xdb20a9f6 -//.word 0x84ea3bb1 -//.word 0x4416abc1 -//.word 0x303cc319 -//.word 0x856ddefc -//.word 0x83bc55aa -//.word 0x7efd3b3e -//.word 0x32cd4ad7 -//.word 0x57d31cf6 -//.word 0x75459f27 -//.word 0xfaadc3e4 -//.word 0x8aed75b6 -//.word 0x9680d19d -//.word 0x300493b2 -//.word 0x1df5cf0b -//.word 0x2cbce3df -//.word 0xc7e8a9ea -//.word 0xc8bbf113 -//.word 0x8ee82e4d -//.word 0x4f9b6fbb -//.word 0xafba9117 -//.word 0x926ab354 -//.word 0x2fd6eb82 -//.word 0x672c37f3 -//.word 0x54e7b79c -//.word 0x245419bd -//.word 0x284f54c5 -//.word 0x284e9970 -//.word 0xfaa28632 -//.word 0x52f99ed8 -//.word 0xdc26f66d -//.word 0x8825305a -//.word 0x2659add2 -//.word 0x3219ff6d -//.word 0xf16b9d13 -//.word 0xbd0fdb1c -//.word 0x9cc019b5 -//.word 0x18b63a86 -//.word 0x4b6f5892 -//.word 0x3aafb55e -//.word 0x64c6f555 -//.word 0x9a118b6b -//.word 0x10c37201 -//.word 0xb5e51d08 -//.word 0xc09cb06a -//.word 0x8bab70a5 -//.word 0xa53878b9 -//.word 0x23d3af45 -//.word 0x36b4f6ed -//.word 0x0344a6fe -//.word 0xaee03955 -//.word 0xb8d9477d -//.word 0x8cbfb517 -//.word 0x54df297f -//.word 0x110ac0ac -//.word 0xeb980458 -//.word 0xc5ad1861 -//.word 0x15bb3670 -//.word 0xf3485cd8 -//.word 0x70f241c1 -//.word 0x28b08e85 -//.word 0x1b5a4b5a -//.word 0xb86c9732 -//.word 0x3b079ddf -//.word 0x3938c37b -//.word 0x797d2407 -//.word 0x06854152 -//.word 0x8238f31c -//.word 0xbdf7a57c -//.word 0x8725bf7f -//.word 0xc2e66512 -//.word 0xbb266222 -//.word 0xbade5f01 -//.word 0xd792590c -//.word 0x101f528b -//.word 0x99b346d8 -//.word 0x731d60c4 -//.word 0x40476e36 -//.word 0x56009315 -//.word 0x12ff3b68 -//.word 0x6e2554bc -//.word 0xd603bcc6 -//.word 0x389cf54a -//.word 0x5b6c203c -//.word 0x71a92924 -//.word 0xefc83fc7 -//.word 0x9c438703 -//.word 0xe89a11fb -//.word 0x80980b74 -//.word 0x1fd7347f -//.word 0xa7869459 -//.word 0x706a6b8f -//.word 0xe0236765 -//.word 0x3cb11979 -//.word 0xbd36aaa4 -//.word 0xe7fdca21 -//.word 0x16bceaf1 -//.word 0x5a16ab7d -//.word 0x8464967e -//.word 0x81b50d1a -//.word 0xe713814f -//.word 0xce09e695 -//.word 0xe16264bf -//.word 0xb5325023 -//.word 0x591b5afa -//.word 0x2ec9080a -//.word 0xf8bf6382 -//.word 0x3656f025 -//.word 0xaf02e1aa -//.word 0x4ed88d63 -//.word 0x2f4d1e1e -//.word 0xfa418949 -//.word 0x703cc459 -//.word 0x43f7336c -//.word 0x2b1e632c -//.word 0x3654faf7 -//.word 0x6078ee3e -//.word 0x6326f62b -//.word 0xd0813e87 -//.word 0x5f305fda -//.word 0x83a78ed4 -//.word 0x42a813eb -//.word 0x4409fe46 -//.word 0x2ab715da -//.word 0x21fb10d3 -//.word 0xb6fc0935 -//.word 0xec862ec3 -//.word 0x8b09b920 -//.word 0xbce52234 -//.word 0xd3e492d1 -//.word 0x6c089c96 -//.word 0xb9882814 -//.word 0x1a15af30 -//.word 0xee61aec8 -//.word 0xaae2549a -//.word 0x28d47e61 -//.word 0x417de640 -//.word 0x9db49764 -//.word 0xcaa4a580 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00005158 -//// expected output -//.word 0xc1d54f9d -//.word 0x273a339c -//.word 0xd1750ffe -//.word 0x36b10b1b -//.word 0x9a60c9be -//.word 0x1f2f36d2 -//.word 0x38674e89 -//.word 0x4d19b992 -//.word 0x9ef7be13 -//.word 0x043028a8 -//.word 0x62c528e7 -//.word 0x9026504c -//.word 0x4a8b04a3 -//.word 0x75a66d9d -//.word 0x84efc1ee -//.word 0x24325539 -//// SHA512LongMsgvector_26 -//// vector length -//.word 0x00005470 -//// input message -//.word 0x38469d81 -//.word 0xccf58dfc -//.word 0xbb44898b -//.word 0xc73f8031 -//.word 0x6fb511e4 -//.word 0x66e19e4c -//.word 0x4349a2c8 -//.word 0x7ae744b2 -//.word 0x8b872ce4 -//.word 0x7970957a -//.word 0x7e46a3da -//.word 0xfd2ff7f2 -//.word 0xb83582c1 -//.word 0x43ec9619 -//.word 0xb95443a3 -//.word 0xad00e023 -//.word 0x6378e8fd -//.word 0x40dd08f9 -//.word 0x80cb7543 -//.word 0x278383b6 -//.word 0x3a4a7459 -//.word 0x2e0c8d2a -//.word 0xa145701b -//.word 0x4822a55b -//.word 0x29e37ad6 -//.word 0x0a830dff -//.word 0x299ba7cd -//.word 0x2d844b03 -//.word 0x5dbb8fb5 -//.word 0x108aab08 -//.word 0x64e5d039 -//.word 0x3393bbe1 -//.word 0x438e8977 -//.word 0xbdabcd16 -//.word 0xe17de080 -//.word 0xf7777864 -//.word 0x89527cdc -//.word 0xcfae173a -//.word 0x6bfc0c04 -//.word 0x579b493d -//.word 0x1b41bee6 -//.word 0x439d6fc5 -//.word 0x103bc865 -//.word 0x6ea7315e -//.word 0x26d5e3d6 -//.word 0x55c0fa48 -//.word 0x1d52cb85 -//.word 0x9a8477f8 -//.word 0x17c6c12d -//.word 0x82a11c95 -//.word 0x1e9b0883 -//.word 0x785b9f7b -//.word 0x9c0d6bac -//.word 0x88087bbb -//.word 0xe1aeb6c2 -//.word 0xe5946f99 -//.word 0xa1e43954 -//.word 0x64fffc0c -//.word 0x736648e3 -//.word 0xfedaea42 -//.word 0x53c2bd65 -//.word 0x52cec31a -//.word 0x21da74c5 -//.word 0x211556a8 -//.word 0x2062ce61 -//.word 0xd0fe36b4 -//.word 0x77632f8b -//.word 0xe96d393b -//.word 0xb4bc8109 -//.word 0x9a59f9ed -//.word 0x449cae96 -//.word 0x344d57ad -//.word 0xfc09295e -//.word 0xade7f315 -//.word 0x935c6685 -//.word 0x1f5cb4ef -//.word 0x25c25ea1 -//.word 0x48f246bd -//.word 0xb2bd0c3b -//.word 0x08859731 -//.word 0x9ca1f252 -//.word 0xe5025ab5 -//.word 0x2d1795d9 -//.word 0x8aef85e5 -//.word 0x0f9efc34 -//.word 0x43e1d210 -//.word 0xd20535be -//.word 0x830441bc -//.word 0x6af2d046 -//.word 0x5f97941e -//.word 0xaf5e638d -//.word 0x116ed1a5 -//.word 0xdb1604ca -//.word 0x756ec471 -//.word 0x0e3bd226 -//.word 0x8f147bd4 -//.word 0xcdc36c41 -//.word 0x03eec8d8 -//.word 0x7ff778ab -//.word 0x9b20c3b8 -//.word 0xeff31e6b -//.word 0xc5e14565 -//.word 0xcd298a7c -//.word 0x13fb6d03 -//.word 0x2ddd6e4b -//.word 0xb94f1f69 -//.word 0x07aa7d3a -//.word 0x124e80a5 -//.word 0xb5fcf120 -//.word 0x1b817c76 -//.word 0x789506c7 -//.word 0xf60241d0 -//.word 0xf3097d6c -//.word 0x6901c15b -//.word 0xad411a43 -//.word 0x5d4033f4 -//.word 0x93fb26f0 -//.word 0x5f97922b -//.word 0x7548ee0f -//.word 0x22711cc3 -//.word 0x850d41ad -//.word 0xfb4dd536 -//.word 0xdb82f6cd -//.word 0x643e022e -//.word 0xf3b664e4 -//.word 0x796bae0c -//.word 0x2d0ae95d -//.word 0x7e902865 -//.word 0x4cb16415 -//.word 0x577b8380 -//.word 0xf837bae0 -//.word 0x0f9015da -//.word 0x3cf75403 -//.word 0x5245f9a2 -//.word 0x08a29fb8 -//.word 0xf2a68d3d -//.word 0xb0bf8bad -//.word 0x66d3f5c3 -//.word 0x6c260d84 -//.word 0x467d9580 -//.word 0xd6849e55 -//.word 0xd06d9b74 -//.word 0x6fdab928 -//.word 0x66fd73d4 -//.word 0x1afd607c -//.word 0x0e9c5086 -//.word 0x9e1898c2 -//.word 0xf14eaaa9 -//.word 0x2925e9e2 -//.word 0xdc2abb0b -//.word 0xc878dfb5 -//.word 0xc2db01b0 -//.word 0xf0358b8a -//.word 0x3820bf52 -//.word 0xf8d403a1 -//.word 0xf84c7bdc -//.word 0x9da4ddb3 -//.word 0x5fc681ed -//.word 0x7c45b868 -//.word 0xee895f5b -//.word 0x9b2db4df -//.word 0xcda568ae -//.word 0xe124f52a -//.word 0x43bc31a1 -//.word 0x9ac823cf -//.word 0x3f8716a4 -//.word 0xf409ed48 -//.word 0xd34fb65d -//.word 0x84ae8284 -//.word 0xb3747322 -//.word 0xc1ce1664 -//.word 0xbae9f380 -//.word 0x8858633e -//.word 0x66b6a2b8 -//.word 0x978c255d -//.word 0x57742e3c -//.word 0x127f9d80 -//.word 0xd4d50936 -//.word 0x019b0f57 -//.word 0x461aea02 -//.word 0xcf1d4409 -//.word 0xba9a4caf -//.word 0xcc9509b0 -//.word 0x6342ee82 -//.word 0xac6aaedb -//.word 0x160f5273 -//.word 0x0753880b -//.word 0xcd963eae -//.word 0xd7df6f37 -//.word 0x257d3d13 -//.word 0xfdee4148 -//.word 0xe0ff1fb6 -//.word 0xbc355d9d -//.word 0x636c7560 -//.word 0x3cbe2889 -//.word 0x38a6160c -//.word 0x08658cd0 -//.word 0x8ea59d6b -//.word 0x915d742e -//.word 0xb4f4e861 -//.word 0xa9a951cf -//.word 0xa2329a86 -//.word 0x08a398d8 -//.word 0x70929aa5 -//.word 0xcb7942dd -//.word 0xdc5b9340 -//.word 0xf0ab4a68 -//.word 0xc969720a -//.word 0xdb8e3379 -//.word 0xbbaaeb6b -//.word 0xd4cc8000 -//.word 0x5ca2f400 -//.word 0x86e13964 -//.word 0xf9e74719 -//.word 0x82a06d00 -//.word 0x05a6e439 -//.word 0xbaacaaa1 -//.word 0x951c8d99 -//.word 0x06ff860a -//.word 0xe31e49a6 -//.word 0xa3661a70 -//.word 0xcc91e27e -//.word 0xae0382fd -//.word 0x52f26777 -//.word 0xaeca5f51 -//.word 0x1ad0ab98 -//.word 0x080555fd -//.word 0xef4dc41d -//.word 0x88d08d06 -//.word 0x3da18cf7 -//.word 0xdf9e3468 -//.word 0x9797234a -//.word 0x1fb2f990 -//.word 0x310d6bee -//.word 0x40a693e1 -//.word 0x67788aef -//.word 0x9fe73930 -//.word 0x345e6c0d -//.word 0x7a372848 -//.word 0xbcdb3f3d -//.word 0x752a2167 -//.word 0xc21df525 -//.word 0x18a9e9be -//.word 0x32e7c6a3 -//.word 0x4e73c7f5 -//.word 0x9912ab47 -//.word 0xe89709a5 -//.word 0xa807e4d5 -//.word 0x18fb7fdc -//.word 0xb64672c5 -//.word 0xf6d8fe9d -//.word 0x3ae29ec2 -//.word 0xff3bde5e -//.word 0x5403702e -//.word 0x91867d88 -//.word 0x4562399c -//.word 0x70edbafa -//.word 0xf3d10a54 -//.word 0x44f97b85 -//.word 0x66b13ad3 -//.word 0x19082771 -//.word 0x4e79e448 -//.word 0xddcb2cf8 -//.word 0x7a366719 -//.word 0xe6c77bc6 -//.word 0x6206e45c -//.word 0x69d5077f -//.word 0x9e9bc35e -//.word 0x04a24a38 -//.word 0x6dbe2f20 -//.word 0x3530c0fd -//.word 0x2fc995d4 -//.word 0xe053694a -//.word 0xeb2c2964 -//.word 0xcd344b92 -//.word 0xcae961ec -//.word 0x27d1eebb -//.word 0x9a19783b -//.word 0xff7bde9f -//.word 0x4c65ec56 -//.word 0xc7572d8d -//.word 0x778c00f5 -//.word 0xd8deeec6 -//.word 0xd3e43b04 -//.word 0xec5dbb01 -//.word 0xbed1e723 -//.word 0xa47530e7 -//.word 0xba509426 -//.word 0x049c6e97 -//.word 0xec6f9296 -//.word 0xf29a9923 -//.word 0x9fd17a2e -//.word 0xba0d5b12 -//.word 0xbf2fa65f -//.word 0x8de65edc -//.word 0x5fd2b4cc -//.word 0xfdead571 -//.word 0x341b07cf -//.word 0x8331f4b2 -//.word 0x17fb45f2 -//.word 0xfaaa73f6 -//.word 0x877bda77 -//.word 0x21961086 -//.word 0x243574d1 -//.word 0x1c080a22 -//.word 0x35d98628 -//.word 0xf36ca67a -//.word 0x23a9c5d9 -//.word 0x12fcaeb5 -//.word 0xfcfdaef3 -//.word 0xc74cedee -//.word 0xf1bffdbc -//.word 0xc8c0b4b2 -//.word 0xd9f0372a -//.word 0xaa115883 -//.word 0xac22226a -//.word 0x6bcbb158 -//.word 0x08fc485c -//.word 0xe9d29d1b -//.word 0xafba7715 -//.word 0x68d87b2a -//.word 0x06aa435c -//.word 0x11e8b1d6 -//.word 0x98af832e -//.word 0x6ddf27e7 -//.word 0x92c2d03a -//.word 0xeeeec915 -//.word 0x446c0a65 -//.word 0x66190991 -//.word 0xa64dd246 -//.word 0x8ebb5a7a -//.word 0xd19810ab -//.word 0x8000b668 -//.word 0x81956f13 -//.word 0x3e6919e5 -//.word 0x9a1edc32 -//.word 0x294b03ef -//.word 0xa0220b71 -//.word 0x8a50fa77 -//.word 0x3d25f36b -//.word 0x0df506e5 -//.word 0xbfbe4c71 -//.word 0x410a3492 -//.word 0x98171807 -//.word 0x1936144c -//.word 0xdc711764 -//.word 0x6e703ad6 -//.word 0xc69e51f6 -//.word 0x7a87c065 -//.word 0x338491db -//.word 0x5f9bc324 -//.word 0x25a1e469 -//.word 0x9ea1e2b1 -//.word 0x42821ea7 -//.word 0xa0e3c29e -//.word 0x534a55d2 -//.word 0x317e8cf1 -//.word 0xc53163da -//.word 0x00e26da4 -//.word 0x2b0268e2 -//.word 0x20561525 -//.word 0xba9c47c3 -//.word 0x8a7139d7 -//.word 0xcb722489 -//.word 0x98a21190 -//.word 0x5d0cecf5 -//.word 0x8ca9db19 -//.word 0x9183cef9 -//.word 0x071b56b1 -//.word 0x2c08ba3f -//.word 0x92e2488a -//.word 0x185ee9a3 -//.word 0x19baf84a -//.word 0xe35c54b4 -//.word 0x6bb6b48b -//.word 0x3f6c3b37 -//.word 0xbbb94d5c -//.word 0x800fa0a3 -//.word 0x22fd96be -//.word 0x2156caa6 -//.word 0x1b90e827 -//.word 0x3f6ac39f -//.word 0x05d1a103 -//.word 0x1c05d922 -//.word 0xa4f8a12e -//.word 0x9ef72178 -//.word 0xa18bcc7b -//.word 0xcea2ef1c -//.word 0x06ea8a30 -//.word 0x5a7e603f -//.word 0xc2c44a87 -//.word 0x1295d044 -//.word 0x2b9ffa2f -//.word 0x6e086445 -//.word 0x775491c9 -//.word 0x0789818c -//.word 0x4191866c -//.word 0x1adf531b -//.word 0x0b565622 -//.word 0x08664825 -//.word 0xb6780268 -//.word 0xd98c9292 -//.word 0x0b208eb1 -//.word 0xb454a87f -//.word 0x364d83e4 -//.word 0x68d7c5bb -//.word 0x464e6ed9 -//.word 0xe7be684b -//.word 0xaf495ee0 -//.word 0xc5c9d2e8 -//.word 0xc7b76a3a -//.word 0xbd4c8b7c -//.word 0x4ce5299e -//.word 0x2dacdea8 -//.word 0xdd7539b6 -//.word 0x95e65840 -//.word 0x7cdbb99f -//.word 0x1c084dcd -//.word 0x12e1ce6d -//.word 0x0ab6530b -//.word 0xeb2322a4 -//.word 0x4fa7c569 -//.word 0x369360c0 -//.word 0xfb26418c -//.word 0x87f6b9ae -//.word 0xc4912acc -//.word 0x54656250 -//.word 0x84dd27b4 -//.word 0x7bcd13fe -//.word 0xb810a386 -//.word 0xbb708aff -//.word 0x01c54bb5 -//.word 0x36610614 -//.word 0xa7ac926a -//.word 0xf60ccdee -//.word 0x11083000 -//.word 0x64aca7b2 -//.word 0x4e2f9f88 -//.word 0xd2d3607c -//.word 0x900d9d45 -//.word 0xf3e649d9 -//.word 0xaba1ad31 -//.word 0x5e9eb84c -//.word 0x9a7e9676 -//.word 0x0f8884ca -//.word 0xfb4be2f6 -//.word 0xe585893e -//.word 0x8e4460c4 -//.word 0x254b2a06 -//.word 0xbab7a2a8 -//.word 0xf5e3ca74 -//.word 0x0888809f -//.word 0xe229524d -//.word 0xa5ae9358 -//.word 0x5b4fae4d -//.word 0xe5b3bbb8 -//.word 0x335950a2 -//.word 0xbb389a57 -//.word 0x23a2ac6d -//.word 0x416e1601 -//.word 0x4656ba44 -//.word 0x369edb37 -//.word 0x9cf777b2 -//.word 0x7ba2d7ab -//.word 0x87d864b5 -//.word 0x956abcc7 -//.word 0x51a5053f -//.word 0x2f788226 -//.word 0xa4d963b6 -//.word 0x9564e219 -//.word 0x10458b74 -//.word 0x3a59db24 -//.word 0x88900d48 -//.word 0x3296317f -//.word 0xe5b27ef3 -//.word 0xb9eee996 -//.word 0x6278f7ab -//.word 0xaa48cf89 -//.word 0x1f03939b -//.word 0x081ff0ac -//.word 0x9e49f461 -//.word 0x79032007 -//.word 0x4992bf8f -//.word 0xc61776d7 -//.word 0xeafc1b2c -//.word 0x5d91ca0c -//.word 0x31f73630 -//.word 0xcf3e3eca -//.word 0x31cac10b -//.word 0x52fbb2e8 -//.word 0xe30d6f1e -//.word 0x403c4e73 -//.word 0xa22c793f -//.word 0x9689fd2c -//.word 0xaeea1d3a -//.word 0x76fcec06 -//.word 0xa9dc1b4b -//.word 0xa5c40fa9 -//.word 0x1dea36a5 -//.word 0x0ea59cf2 -//.word 0xf4d2b9ef -//.word 0x3d768e70 -//.word 0xfea5f0c1 -//.word 0xe5a223e8 -//.word 0x6f47aa2b -//.word 0x5aa75ed2 -//.word 0x5ef3be2e -//.word 0x189a86da -//.word 0x47b48341 -//.word 0x3aa1a560 -//.word 0x89ed56ce -//.word 0x04770af9 -//.word 0xe9d317b2 -//.word 0x5aecc8ec -//.word 0x0deeacc0 -//.word 0x466334b5 -//.word 0x029c7d3f -//.word 0x75526b85 -//.word 0xb78df767 -//.word 0xbbc5cac0 -//.word 0x80470ae8 -//.word 0x8bdb747e -//.word 0x94a4ab64 -//.word 0x8047cf0a -//.word 0x8f5052f0 -//.word 0xd7d10766 -//.word 0xf14b7c97 -//.word 0xf2d28ac5 -//.word 0x9c6d2ad6 -//.word 0xd6bc8a10 -//.word 0x5add6121 -//.word 0xae8f7f62 -//.word 0x5598a85c -//.word 0x4665a28c -//.word 0x9df18d63 -//.word 0x91e87391 -//.word 0xa60b2083 -//.word 0x23d6342a -//.word 0xc76076ff -//.word 0xb8846b44 -//.word 0xbc3e288c -//.word 0xab57647d -//.word 0x2545d1d5 -//.word 0x804dadab -//.word 0x04ea93f8 -//.word 0x5b729855 -//.word 0x43f79306 -//.word 0x866bbc38 -//.word 0x2c087987 -//.word 0xefef74c3 -//.word 0xef10f1f4 -//.word 0xa7495f9b -//.word 0x20d22c3b -//.word 0x64d8de18 -//.word 0x3668603f -//.word 0x008f99c6 -//.word 0x0dc04355 -//.word 0xf875fbe6 -//.word 0x651994c8 -//.word 0xee26b1ea -//.word 0x618b9356 -//.word 0x28502ffc -//.word 0x087c84b1 -//.word 0x0f372b77 -//.word 0xc72c30ff -//.word 0xb031206c -//.word 0xed2a635a -//.word 0x3e2acc1f -//.word 0x2edc6f50 -//.word 0x8e22b388 -//.word 0x21fba864 -//.word 0x99aa9ad2 -//.word 0xc215e68c -//.word 0xfe6b0cdf -//.word 0xf10906b1 -//.word 0x7d9fd8c2 -//.word 0xf18e6932 -//.word 0x7d959144 -//.word 0xeaad7361 -//.word 0x87310d60 -//.word 0x67420d04 -//.word 0xc96ae6c6 -//.word 0xd87f24d5 -//.word 0x95cbfc5c -//.word 0x11692803 -//.word 0xdff2f2b8 -//.word 0xc95a8eaf -//.word 0xc214aca7 -//.word 0x1c7d4e70 -//.word 0xfb77d7aa -//.word 0x0a5465cf -//.word 0x6cf76174 -//.word 0xf63555cb -//.word 0x9b81fd6d -//.word 0x27c9a056 -//.word 0x319ba031 -//.word 0x4a8c51d7 -//.word 0x7bda0712 -//.word 0xef5073a6 -//.word 0xec6a2f92 -//.word 0x08ba9793 -//.word 0x998adbea -//.word 0x6dc3525f -//.word 0xbb0e1186 -//.word 0x5a38bd41 -//.word 0x31db9d86 -//.word 0xef3bf362 -//.word 0xfc6e8d3e -//.word 0xafc09762 -//.word 0xc155b3b7 -//.word 0x01104cd1 -//.word 0x4ab4262c -//.word 0xb2493ab6 -//.word 0x05c2c28e -//.word 0x72dc900c -//.word 0x8349a301 -//.word 0x530efc40 -//.word 0xfb2aae5d -//.word 0x4d7835b4 -//.word 0xc5d608ad -//.word 0xbc87723f -//.word 0xdfd69db3 -//.word 0xe0fcf0ab -//.word 0x6b449a62 -//.word 0x5c6d6f35 -//.word 0x2f50f463 -//.word 0xb7c3b511 -//.word 0x13bcdf91 -//.word 0xdfba0ae3 -//.word 0xa760577c -//.word 0xa163bb47 -//.word 0x9ba79aea -//.word 0x32a5984a -//.word 0x4510ac51 -//.word 0xa9b876ef -//.word 0x1eaed25e -//.word 0x82a9adab -//.word 0x45a81772 -//.word 0x1dd99ae9 -//.word 0xfbbaca1f -//.word 0x3d7e1e86 -//.word 0x25b2feb0 -//.word 0x8a201d56 -//.word 0xcdf4099e -//.word 0x0f1d019d -//.word 0xa1f6061b -//.word 0xbc263497 -//.word 0x73c5538b -//.word 0xe5c0aaf2 -//.word 0xb77e1306 -//.word 0xc2c3554e -//.word 0x08d5add8 -//.word 0xeddeaec4 -//.word 0xa4924c02 -//.word 0xe711335b -//.word 0xeb0f5db6 -//.word 0x9332e394 -//.word 0xe4bb13de -//.word 0xb969c4e0 -//.word 0xb79ae695 -//.word 0x84b45d25 -//.word 0x34c310ac -//.word 0x04643c3d -//.word 0x4be10f27 -//.word 0xad9d7276 -//.word 0x92b326bd -//.word 0xd6da1213 -//.word 0xc38cdb5c -//.word 0x3c67b6ca -//.word 0x3ad37aa3 -//.word 0x7de5fa44 -//.word 0x7b839166 -//.word 0x9dc9fea0 -//.word 0xaaac722d -//.word 0x83dde8f0 -//.word 0x12f08000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00005470 -//// expected output -//.word 0xbc393bc5 -//.word 0x50a3705f -//.word 0xcd5828ea -//.word 0x43b536f6 -//.word 0xb2de8426 -//.word 0xbb7d0857 -//.word 0xdbccde4c -//.word 0xf0ca37bc -//.word 0x8a3c27a9 -//.word 0x3096b4eb -//.word 0xf7861843 -//.word 0xda5e4c31 -//.word 0xa43fd715 -//.word 0x5ce8c986 -//.word 0xecbb0397 -//.word 0x39ceeb04 -//// SHA512LongMsgvector_27 -//// vector length -//.word 0x00005788 -//// input message -//.word 0x02b74a2c -//.word 0xa22173be -//.word 0x04ee6afd -//.word 0x204d76a1 -//.word 0x21cabfc1 -//.word 0x0b68108e -//.word 0xa1f0dc41 -//.word 0x86887f52 -//.word 0xa287c7eb -//.word 0xc788b39c -//.word 0x95be7a50 -//.word 0x9b87cf80 -//.word 0xbe4364a6 -//.word 0xdf66adf5 -//.word 0xb8cce647 -//.word 0x074d5757 -//.word 0xef92d730 -//.word 0x9b268fe5 -//.word 0x24d00083 -//.word 0xb5214844 -//.word 0xed49a005 -//.word 0x842f2afa -//.word 0x32c0eaa1 -//.word 0xcc8611f4 -//.word 0xb17d82e3 -//.word 0x64238f01 -//.word 0x7acf037e -//.word 0xb7436655 -//.word 0x74847cc6 -//.word 0x43ea0f07 -//.word 0xd673ee37 -//.word 0x1d5c3693 -//.word 0xaff3d0ec -//.word 0x6ba73b59 -//.word 0x5f618c29 -//.word 0xe917b31b -//.word 0x1b9effd2 -//.word 0x64bfe583 -//.word 0x6d8efdf1 -//.word 0x42f74d9b -//.word 0xb29aca33 -//.word 0xf8d91c53 -//.word 0x9b2ea26c -//.word 0x92c2b6ff -//.word 0xac3c320f -//.word 0x2fd732d6 -//.word 0xbfb81cb7 -//.word 0x827ede74 -//.word 0x821a77a1 -//.word 0x53e1b958 -//.word 0xf5df4d2f -//.word 0xfb6ff767 -//.word 0xed091b66 -//.word 0xec5a8167 -//.word 0x949a5571 -//.word 0x271a7285 -//.word 0xe71ce01c -//.word 0xc3e89ad1 -//.word 0x361c955a -//.word 0x6d44ffbc -//.word 0xa8aac4bf -//.word 0xe27057a0 -//.word 0xb4dbaf07 -//.word 0x77f29038 -//.word 0xa9480b8d -//.word 0x91164824 -//.word 0x268c83d5 -//.word 0x2e695567 -//.word 0xa3ca3503 -//.word 0x5a3f3ee8 -//.word 0xe7243361 -//.word 0xbb2fc0f4 -//.word 0x8f4502dd -//.word 0x06924abb -//.word 0x8dd81e88 -//.word 0x860781ce -//.word 0xa70f7518 -//.word 0x9cf2bda7 -//.word 0xf41de767 -//.word 0x3af88a22 -//.word 0x62bccdf2 -//.word 0x688528fc -//.word 0x33a86f5b -//.word 0xbf460c5b -//.word 0x7b218be8 -//.word 0xf0af5d46 -//.word 0xa46dd502 -//.word 0x3e767728 -//.word 0xea5472b6 -//.word 0xff166b51 -//.word 0xe0a27c37 -//.word 0x204d7d75 -//.word 0xe9a9825a -//.word 0x9e9ea42b -//.word 0xbfbd0518 -//.word 0x0dd00e6f -//.word 0xefb6fb10 -//.word 0x156e9a21 -//.word 0x5b714f02 -//.word 0xf0455c83 -//.word 0xb74f5f55 -//.word 0xede91cbf -//.word 0x0db47d92 -//.word 0xf02fd75f -//.word 0x39896fe7 -//.word 0xf0b43dd3 -//.word 0x6dbbf0a6 -//.word 0x785532ef -//.word 0xaeba2cc3 -//.word 0x27b54d6a -//.word 0x55fb4759 -//.word 0x2fbb5b60 -//.word 0x8f76d725 -//.word 0xd911ddd1 -//.word 0xde296509 -//.word 0x00a68520 -//.word 0x9693f18b -//.word 0x922dbe95 -//.word 0x61396b54 -//.word 0x129b21db -//.word 0xbb253ab1 -//.word 0x18ad0182 -//.word 0x7662b815 -//.word 0xcf60e07e -//.word 0x3781b495 -//.word 0x7676f7a6 -//.word 0xf717ef6a -//.word 0xe1f8b236 -//.word 0x833da073 -//.word 0xf5af314e -//.word 0xfc0ff1b0 -//.word 0x2faac871 -//.word 0x582d7fc9 -//.word 0x1dbb8007 -//.word 0xe03ddd85 -//.word 0xe3f994db -//.word 0xb0671253 -//.word 0xb83ff59d -//.word 0x3ad716c4 -//.word 0x66acc761 -//.word 0xc33e590f -//.word 0xce22e21e -//.word 0xe4523c8c -//.word 0x61c75130 -//.word 0x0a4a9639 -//.word 0xa887d6d7 -//.word 0xf6633138 -//.word 0xbd8f64b6 -//.word 0x3e5d4b4f -//.word 0xd0d3a455 -//.word 0xcaff1566 -//.word 0xa389719f -//.word 0x588f370d -//.word 0x0eac5b64 -//.word 0xf95a49f4 -//.word 0x7c7b28d8 -//.word 0x92325b71 -//.word 0x6cf74e13 -//.word 0x5ceb6ffd -//.word 0xf1687a8f -//.word 0x64ddfab7 -//.word 0x32d90dad -//.word 0x0b6567e0 -//.word 0xeb979930 -//.word 0x8764935d -//.word 0xeab668bf -//.word 0x60be5238 -//.word 0x938cf668 -//.word 0xf4dde91f -//.word 0x5c347218 -//.word 0xf32c92e4 -//.word 0x520c4124 -//.word 0xe49cfbfb -//.word 0x92377bc3 -//.word 0x9f22c7ff -//.word 0xd01c6c91 -//.word 0xd1360b2e -//.word 0xd4e5140e -//.word 0x7b56d2e8 -//.word 0xf801a81d -//.word 0x73819a34 -//.word 0xaba30e86 -//.word 0xe1bdd43a -//.word 0xf2416574 -//.word 0xc39168ca -//.word 0xe1157bf8 -//.word 0x698c2fd4 -//.word 0x269f5484 -//.word 0xfabc78ee -//.word 0x7f21aa70 -//.word 0xed3784d1 -//.word 0x3f226878 -//.word 0x919609dc -//.word 0xcdec2d3c -//.word 0x8675b290 -//.word 0x240ecfbf -//.word 0x42f49d12 -//.word 0x54dad6e9 -//.word 0x8d39dcad -//.word 0x00e8fd05 -//.word 0x05ecf54d -//.word 0xde91b444 -//.word 0x9aba6204 -//.word 0x3a75a138 -//.word 0x13d21289 -//.word 0x73f61a59 -//.word 0x876be6b4 -//.word 0x7cbaac83 -//.word 0xe53c3403 -//.word 0x5d2d9876 -//.word 0x6d024819 -//.word 0xb0fc5055 -//.word 0x34fede39 -//.word 0x249cfe28 -//.word 0xa474a9cf -//.word 0xfdc1fe5a -//.word 0xfa2dcfe8 -//.word 0x92e75f3c -//.word 0xc6f66ab5 -//.word 0xcdcd6680 -//.word 0x6f1f090c -//.word 0xaff40bbe -//.word 0xacfd2de7 -//.word 0xc9247af3 -//.word 0x0c68cde3 -//.word 0xc4e893fd -//.word 0x6f3dd2c1 -//.word 0xda0d6b20 -//.word 0x8add9ce9 -//.word 0x5b27c884 -//.word 0x67ad7be2 -//.word 0x290ca9b4 -//.word 0xe39436db -//.word 0x3c57bb20 -//.word 0x2e808826 -//.word 0x1fe7e59c -//.word 0x4ee29eb7 -//.word 0x715dbee0 -//.word 0x9d2d9aaa -//.word 0x65a11106 -//.word 0x465a13ba -//.word 0x435d600f -//.word 0xcc6792ca -//.word 0xe4815e5e -//.word 0x83d31760 -//.word 0x39bd733b -//.word 0x15249225 -//.word 0xc50a3c52 -//.word 0xfe626b67 -//.word 0x1f220931 -//.word 0x1199fa97 -//.word 0x71035dcd -//.word 0xf15b0fcb -//.word 0xfb7071fe -//.word 0x983b6c3d -//.word 0x9170b2fe -//.word 0xd45346ca -//.word 0x18cd3eee -//.word 0xc4bfc874 -//.word 0x0d966b51 -//.word 0x5f208fe0 -//.word 0xff9e408f -//.word 0xee1a2fd9 -//.word 0x10faf974 -//.word 0x8dd6accb -//.word 0x788788ae -//.word 0xaf800248 -//.word 0x02620f52 -//.word 0x97ca9e87 -//.word 0x8c6d6658 -//.word 0xdf68e3e0 -//.word 0x8bd19b1a -//.word 0xf492a652 -//.word 0x85776dd9 -//.word 0x9885b2fd -//.word 0x968ed138 -//.word 0x5f0245a8 -//.word 0xec086dbf -//.word 0x33cd903c -//.word 0x4a1c205a -//.word 0xd0303b47 -//.word 0x89c677d7 -//.word 0x4876df7a -//.word 0x1242396c -//.word 0x80708b2b -//.word 0x6595dd2e -//.word 0xb1f33fd4 -//.word 0x95040e9b -//.word 0xe8577492 -//.word 0xca9b2e11 -//.word 0x87fa92a7 -//.word 0xbea8d054 -//.word 0xc2bb78f8 -//.word 0x403d3c0c -//.word 0x227ff890 -//.word 0xb4b1ef44 -//.word 0x05b0571b -//.word 0x911f19ed -//.word 0x1cb9d26c -//.word 0xe1e51d59 -//.word 0xec8b14f8 -//.word 0xc52714c1 -//.word 0x4e1cc158 -//.word 0xee4a4abf -//.word 0xefe2efcb -//.word 0x2579c0d4 -//.word 0xd15ca7b1 -//.word 0xc424a8e3 -//.word 0xc88a6811 -//.word 0x3b7cecb5 -//.word 0xfd70a414 -//.word 0x8df8a873 -//.word 0x6e964188 -//.word 0xd0d2ab2f -//.word 0x6c8b195e -//.word 0xb08bfa5b -//.word 0x1c5e7b2c -//.word 0xec634d50 -//.word 0xf723a8ac -//.word 0xd7e290c8 -//.word 0x4a74573b -//.word 0xd8526364 -//.word 0xb6ed315b -//.word 0xeb429a27 -//.word 0xb1af5532 -//.word 0x1e05befa -//.word 0x03ded508 -//.word 0x15318a26 -//.word 0x4a2338cd -//.word 0x86206fdd -//.word 0x772bf690 -//.word 0xbd7210b1 -//.word 0x4f26ff09 -//.word 0x1a89c71b -//.word 0xeb493411 -//.word 0x8e0c1ef5 -//.word 0x384cec24 -//.word 0x22655700 -//.word 0x77ec71e6 -//.word 0x7043e560 -//.word 0xbd6a809b -//.word 0x2818f01b -//.word 0x750bccad -//.word 0x8c9cd59d -//.word 0xda967c2a -//.word 0xf448a437 -//.word 0x7dd9a843 -//.word 0x4bdca09b -//.word 0xc524e0ce -//.word 0x8fdac262 -//.word 0x6acca6c5 -//.word 0x55083686 -//.word 0xf8aaefc5 -//.word 0x43f2dde9 -//.word 0x539aa591 -//.word 0x9566c9cc -//.word 0x2dfc288c -//.word 0x99f6c458 -//.word 0x9136c842 -//.word 0x3279ca19 -//.word 0x5c2f4ddf -//.word 0x598b8a7d -//.word 0xbfd670b6 -//.word 0x9708e95a -//.word 0xbe995fbc -//.word 0x8c957f65 -//.word 0xb4ef3c0a -//.word 0x6b1717bc -//.word 0xcdce9e5f -//.word 0x7c3a335d -//.word 0x8a350f9c -//.word 0x99eb87ad -//.word 0x40a48d46 -//.word 0xb1de79f2 -//.word 0x999f0a07 -//.word 0x4809a7d8 -//.word 0x122feb2d -//.word 0xf52761f0 -//.word 0x7c618c29 -//.word 0xe2362b2d -//.word 0x7bc4ba11 -//.word 0x50fa3c65 -//.word 0x09ef381f -//.word 0x117802d6 -//.word 0xf4f93b31 -//.word 0x0c7b9b9e -//.word 0x5cffee47 -//.word 0xbc125d42 -//.word 0x37a2ef07 -//.word 0xb1105028 -//.word 0xcc86d03c -//.word 0x0d8bae1c -//.word 0x3bd59753 -//.word 0x085e6acf -//.word 0xf4ba3edd -//.word 0x6da7a654 -//.word 0x3be6340f -//.word 0x1b493ba1 -//.word 0xaa0ed945 -//.word 0x856b3514 -//.word 0xaf6a067b -//.word 0x33f755eb -//.word 0x0a3783d2 -//.word 0x3e1c8dcb -//.word 0x50378f11 -//.word 0xd8cd873a -//.word 0x6b2c5c22 -//.word 0xc13f1f25 -//.word 0x17619091 -//.word 0xd36fe45a -//.word 0x6721c510 -//.word 0x779a9b0f -//.word 0x3e3d0af6 -//.word 0x2ec3bb5a -//.word 0xd68a60bb -//.word 0x0930f2b6 -//.word 0x3d613d7d -//.word 0x31ed9f85 -//.word 0xd31e0d7e -//.word 0x60485688 -//.word 0xcda1aca4 -//.word 0x66536068 -//.word 0xb5d0edf8 -//.word 0xa5663831 -//.word 0xe7131627 -//.word 0x959a0fd2 -//.word 0x15d66204 -//.word 0x414f489e -//.word 0xc40b7d04 -//.word 0xc7a7fdce -//.word 0xcea60bc1 -//.word 0xdc0878fd -//.word 0xde1e2277 -//.word 0x469ebbaa -//.word 0xf7f3cc8a -//.word 0x61d6f9ba -//.word 0xed2286fe -//.word 0x9be41af3 -//.word 0xe9b2c3fe -//.word 0xf83f3b82 -//.word 0xea2c6a56 -//.word 0x8e202b76 -//.word 0x3f1a53f8 -//.word 0x0906f042 -//.word 0x0e8fce7b -//.word 0x2835403f -//.word 0xd09f1c97 -//.word 0x3f320828 -//.word 0xd2e2f4aa -//.word 0xb348e89c -//.word 0xb6f50036 -//.word 0x8107b5a0 -//.word 0xf0fa5d61 -//.word 0xb8c0f51a -//.word 0x4a131f74 -//.word 0xfa0a6757 -//.word 0x60eaca5d -//.word 0xfe3f7986 -//.word 0x242cda2d -//.word 0x1100d03a -//.word 0x5b093c9a -//.word 0x91adc4ec -//.word 0x1eb6d37d -//.word 0x70eee077 -//.word 0x5aecf455 -//.word 0xb72d669a -//.word 0x5167e9c3 -//.word 0x0119ca7a -//.word 0x1767720c -//.word 0xfb25321d -//.word 0x1532409b -//.word 0xeb07fcf0 -//.word 0x898f787c -//.word 0x263a3842 -//.word 0x044d36e1 -//.word 0x987c29c7 -//.word 0xebba07a1 -//.word 0x4050c915 -//.word 0xf72c6eb4 -//.word 0xb17c422a -//.word 0xb57c60b8 -//.word 0x938c76e5 -//.word 0x0786c870 -//.word 0x1f4e7888 -//.word 0xa0ab043f -//.word 0xa755103d -//.word 0x8c4f66b1 -//.word 0x0b763b8e -//.word 0xa65bb4f3 -//.word 0x454ea8ea -//.word 0x20bba856 -//.word 0xdeba3c27 -//.word 0xfee170d0 -//.word 0x775c8ffb -//.word 0x9b402f7b -//.word 0x411d6d82 -//.word 0x23d37a14 -//.word 0x85a657bb -//.word 0x1894dc7d -//.word 0x1de5ff0b -//.word 0xcd05533b -//.word 0xf98fcfb8 -//.word 0xeeaad1f8 -//.word 0x9b98626f -//.word 0xf68cbc03 -//.word 0x9bbc0abf -//.word 0xb6b86ecb -//.word 0x24fa489c -//.word 0xd5beb668 -//.word 0x751457dd -//.word 0x4b335512 -//.word 0x6110a2be -//.word 0xe52f81a8 -//.word 0xcfb9495e -//.word 0xc4d0652a -//.word 0x3a1fa042 -//.word 0xdeb5a03f -//.word 0x3213afd0 -//.word 0x7b83c2b0 -//.word 0xdaacb3d5 -//.word 0xb964d2eb -//.word 0x68c59c00 -//.word 0x0883ca81 -//.word 0xa97c8e65 -//.word 0xaf9119a8 -//.word 0x7ab560fb -//.word 0x464320ba -//.word 0x4f951f1e -//.word 0x39d2b6b4 -//.word 0xb0078c0d -//.word 0x4c7aa4b7 -//.word 0xb73b9a6d -//.word 0x11fb298b -//.word 0x9321f1c5 -//.word 0x731b7717 -//.word 0x08f26eff -//.word 0x2f2235eb -//.word 0xeda8a0ed -//.word 0x565cfbb6 -//.word 0xad814cc2 -//.word 0xcc9bd9d0 -//.word 0xc680ea95 -//.word 0xccb2d0b1 -//.word 0x4dec26e2 -//.word 0x61fb5778 -//.word 0x68cf6109 -//.word 0xeed2d865 -//.word 0xd3792dcc -//.word 0xa818305f -//.word 0x5bfad4d5 -//.word 0x17b1326f -//.word 0x66abd12e -//.word 0x99062543 -//.word 0x69a555c7 -//.word 0xde8442ac -//.word 0x7048c4f4 -//.word 0x6d1b3620 -//.word 0x9ab636ec -//.word 0x1dbfa639 -//.word 0x9a56f64b -//.word 0x9deba634 -//.word 0x38520690 -//.word 0xed194173 -//.word 0xcd1999a0 -//.word 0xe24bf4fc -//.word 0xcbdd9842 -//.word 0xa68533f7 -//.word 0x33161ea1 -//.word 0x3551e234 -//.word 0x1cfdfccd -//.word 0xe23adda2 -//.word 0x33123539 -//.word 0xd05171d9 -//.word 0x3596823f -//.word 0x7aabe191 -//.word 0x7712d098 -//.word 0x2be0e229 -//.word 0x5fcfbde4 -//.word 0x868e1f22 -//.word 0xe85b1f28 -//.word 0xffd4b6a1 -//.word 0x210a7d4b -//.word 0x60d8b8f0 -//.word 0xaf739498 -//.word 0x4641adfd -//.word 0x47efd33f -//.word 0xa1be0ed9 -//.word 0x341ddfd4 -//.word 0x377dc93a -//.word 0xd76110ce -//.word 0x21b4c1fa -//.word 0x2260f209 -//.word 0x4d1c4b96 -//.word 0x1d85c644 -//.word 0xfb71b2b0 -//.word 0x6180fea4 -//.word 0x40f4b48e -//.word 0x9fc2c430 -//.word 0x85e80398 -//.word 0x1a027353 -//.word 0x0918c5de -//.word 0x28bb1c5d -//.word 0x5b50148f -//.word 0xb6ab0302 -//.word 0xe1e07f83 -//.word 0xc15520d9 -//.word 0x541c86b3 -//.word 0xdd809ede -//.word 0x42de22bb -//.word 0xb2b75ff1 -//.word 0x8a023b5f -//.word 0x7ac77655 -//.word 0xe4e93003 -//.word 0x8444ac31 -//.word 0x56f75331 -//.word 0xb403fc12 -//.word 0xbf166a17 -//.word 0x01a11667 -//.word 0x51302f06 -//.word 0xf6fbe004 -//.word 0x0fb8d1f5 -//.word 0x32b4f0a1 -//.word 0x532271fc -//.word 0xe7b31358 -//.word 0x4a67a6d9 -//.word 0x5ea2ca29 -//.word 0x7682f96e -//.word 0x7270c879 -//.word 0x2bf56940 -//.word 0x11cf758f -//.word 0x1245e8fa -//.word 0xbeb76e16 -//.word 0xa979dde9 -//.word 0x11e2029e -//.word 0xc19fa07d -//.word 0x354db61b -//.word 0xff4801ce -//.word 0x6abdc264 -//.word 0x5c07c115 -//.word 0x813892b5 -//.word 0xa5f5172f -//.word 0x6288462e -//.word 0xfc302c1d -//.word 0x89bb3252 -//.word 0x5557a086 -//.word 0x84a65f89 -//.word 0xf9100333 -//.word 0x775d099e -//.word 0x06835c92 -//.word 0x99bc1e41 -//.word 0xeddca635 -//.word 0xb4e2c586 -//.word 0xf3cd4e50 -//.word 0xa9b1d564 -//.word 0xb109b63e -//.word 0xe94f5a38 -//.word 0x94cab5fd -//.word 0xfda8133f -//.word 0x5e4c15ad -//.word 0xffe9f61f -//.word 0xa2501314 -//.word 0x1f06ab5f -//.word 0x4c9ae31d -//.word 0x1f350dea -//.word 0x17732955 -//.word 0xd771ac91 -//.word 0x1528816d -//.word 0xb2f94e85 -//.word 0x2a88f8ba -//.word 0x2fce69e1 -//.word 0x916a91b8 -//.word 0x6138aa1e -//.word 0x5625c183 -//.word 0x6f42729d -//.word 0xda17f35c -//.word 0x15395421 -//.word 0x531f042b -//.word 0x21319851 -//.word 0x4922c8f7 -//.word 0xf780ba3b -//.word 0x1a89846f -//.word 0x0d41eccc -//.word 0x77c17164 -//.word 0x70d29059 -//.word 0xe5ba404d -//.word 0x3d56bf19 -//.word 0x3c6990c2 -//.word 0x2834c5a9 -//.word 0x2b477a01 -//.word 0xf996a286 -//.word 0xb2cf066c -//.word 0x0aeb8a96 -//.word 0xa704b209 -//.word 0xcb6666a0 -//.word 0x32e8f201 -//.word 0x3e7d51cf -//.word 0x5106ab22 -//.word 0x7a6a1c34 -//.word 0x55e9b75d -//.word 0x2cadcb41 -//.word 0x62800000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00005788 -//// expected output -//.word 0x6b543633 -//.word 0xeaad9b4a -//.word 0xcbdd1895 -//.word 0x8c2f76d2 -//.word 0x55fc3243 -//.word 0x9ebf5b71 -//.word 0x25e6826d -//.word 0xa4c2165e -//.word 0x4fb7295d -//.word 0x2804e627 -//.word 0xa072d238 -//.word 0x2ab10d43 -//.word 0xbdf0c0e5 -//.word 0xe7ed45f3 -//.word 0x543c7cef -//.word 0x42761f1d -//// SHA512LongMsgvector_28 -//// vector length -//.word 0x00005AA0 -//// input message -//.word 0x126a5b07 -//.word 0x39f20f4e -//.word 0x7a2ca8f1 -//.word 0x8d41bbfc -//.word 0xdc4324af -//.word 0x38125682 -//.word 0xca7def66 -//.word 0x4caa904e -//.word 0x79b8ebee -//.word 0xc1a21dc2 -//.word 0x42673f53 -//.word 0xf46837b6 -//.word 0x2311d455 -//.word 0x23bb1bf2 -//.word 0x3fd1dbe8 -//.word 0xf23288b4 -//.word 0x5ad745b5 -//.word 0xe9b64330 -//.word 0x5ee64a97 -//.word 0xf303950b -//.word 0xd8d4e31f -//.word 0xe12bcbdf -//.word 0x7c0d5011 -//.word 0xe513b5ba -//.word 0x9d1093e4 -//.word 0x18f4289f -//.word 0xb5f1f246 -//.word 0xf4dc7c03 -//.word 0xe4d57995 -//.word 0xda2a0f51 -//.word 0x68797567 -//.word 0x8d15c067 -//.word 0x2aabfa04 -//.word 0xb5267517 -//.word 0x31cf5ee7 -//.word 0x5eb995a7 -//.word 0x2d5cbc40 -//.word 0x76808f51 -//.word 0xed5d7374 -//.word 0x530051c4 -//.word 0xe9f0a49c -//.word 0x2a12d1a1 -//.word 0xb9cab802 -//.word 0x996388fe -//.word 0x9cb1d7a7 -//.word 0x1ef4f2e6 -//.word 0xf20071c0 -//.word 0x9d9b0fd7 -//.word 0xc227b934 -//.word 0xde81e543 -//.word 0x3628251f -//.word 0x0da2fc10 -//.word 0x191bf053 -//.word 0x3850e019 -//.word 0x60ab98d1 -//.word 0xd4afa3aa -//.word 0x9e976054 -//.word 0x393a5907 -//.word 0x8e32cfc7 -//.word 0x223d9ae6 -//.word 0x8de330ca -//.word 0x2e5a03f1 -//.word 0x1da61031 -//.word 0x6104b445 -//.word 0x6389c285 -//.word 0xa307d4f5 -//.word 0xaa30de81 -//.word 0x40fe0987 -//.word 0xde52be96 -//.word 0x66db0076 -//.word 0x12390068 -//.word 0xaa62ebae -//.word 0xfb45074e -//.word 0x84aefe14 -//.word 0x726a7ad6 -//.word 0xcfabf1fb -//.word 0xf6aec33e -//.word 0x4a9a82b0 -//.word 0x27ac90fc -//.word 0x1991f0ef -//.word 0x4c135638 -//.word 0x44f8806c -//.word 0xce27c94d -//.word 0x370dfc4b -//.word 0xbb3f664b -//.word 0x40612fa8 -//.word 0x4546ea77 -//.word 0x15586a10 -//.word 0x403bd7ca -//.word 0x4bad0205 -//.word 0xa7b1f66e -//.word 0xe0ecd07e -//.word 0x174fd044 -//.word 0xb2f6af65 -//.word 0x52503361 -//.word 0x05810217 -//.word 0xbe04b48c -//.word 0x02952be8 -//.word 0xe34e27c1 -//.word 0x3210159c -//.word 0xf12428b1 -//.word 0x0722abef -//.word 0x37129640 -//.word 0x53d25f0e -//.word 0xadb81206 -//.word 0xcf77a41c -//.word 0x6c4785cf -//.word 0x964074ae -//.word 0x3007971b -//.word 0xa7adcb4f -//.word 0xddd4399e -//.word 0x66142afc -//.word 0xf79d1cc1 -//.word 0x1b1d14a9 -//.word 0x28e4371f -//.word 0x724694bb -//.word 0xbe404509 -//.word 0xfa5fb68c -//.word 0x2bde4402 -//.word 0xa60e0aea -//.word 0x83fbf744 -//.word 0x4f4d2498 -//.word 0x016c6539 -//.word 0x2fe81fcb -//.word 0x82175903 -//.word 0x680015ae -//.word 0x0877e0f5 -//.word 0x7b8aa8df -//.word 0x391cce17 -//.word 0xd1d07cf0 -//.word 0xde2939a6 -//.word 0x36efbae7 -//.word 0x64d4fb91 -//.word 0x59578fbe -//.word 0x5ee935fe -//.word 0x4d4eabe3 -//.word 0x0147c7c3 -//.word 0x0b6ec3b9 -//.word 0xa661d9ed -//.word 0xee220f15 -//.word 0x4cbe553c -//.word 0x352dcdc2 -//.word 0x147a6aa5 -//.word 0x8424bcfe -//.word 0xc3c30acf -//.word 0x63eea2fb -//.word 0x435d6d96 -//.word 0xbe4bc65f -//.word 0x221e8c8b -//.word 0x644a76c5 -//.word 0x1273a772 -//.word 0x88d28339 -//.word 0x67d9c0c3 -//.word 0x431ac0bf -//.word 0x9c651e2a -//.word 0x103087cd -//.word 0xce3ccb07 -//.word 0x4e7633cc -//.word 0x401c16ee -//.word 0xc220a79b -//.word 0xd5d11128 -//.word 0x12b8c60c -//.word 0x99c01330 -//.word 0x4b9bf966 -//.word 0x39603836 -//.word 0x5b79ace1 -//.word 0x86bcdca0 -//.word 0x98d8d12d -//.word 0xf6f32484 -//.word 0x38915beb -//.word 0x22b87630 -//.word 0xd652c432 -//.word 0x49d2fba2 -//.word 0xf41a880b -//.word 0xcc9c2410 -//.word 0x73c0a8f6 -//.word 0xb0862262 -//.word 0x1d6d2863 -//.word 0x1f936cb2 -//.word 0x1b1d9139 -//.word 0xe7d93dd3 -//.word 0x7f227053 -//.word 0xfa0514c7 -//.word 0xbca2d5fe -//.word 0xecd43247 -//.word 0x2914d47c -//.word 0x789a1f3f -//.word 0x81c60884 -//.word 0xfcbf2650 -//.word 0x665a0bbf -//.word 0xf83dd44c -//.word 0xd944ff4d -//.word 0x93237dbd -//.word 0xc44d083e -//.word 0x1615b75e -//.word 0x7013d01a -//.word 0x6ecadda1 -//.word 0x0f87025a -//.word 0xae8c8d27 -//.word 0x346ecfec -//.word 0x8bbc2b4b -//.word 0x56e16cb2 -//.word 0xdf4c5b98 -//.word 0x50ce9203 -//.word 0x27438b4e -//.word 0xe474fc29 -//.word 0x043c67e1 -//.word 0x33eaece2 -//.word 0xbee7637a -//.word 0x4799a7df -//.word 0xbc863474 -//.word 0x8abdf548 -//.word 0x0d7257df -//.word 0x4be8a236 -//.word 0xe3948901 -//.word 0x407f0037 -//.word 0x12ec4dd0 -//.word 0xff3b62ce -//.word 0x950d6a7a -//.word 0x84a9a2f0 -//.word 0x0a9e6add -//.word 0xaeaa9c88 -//.word 0x31db1c0f -//.word 0xc2f4b0f3 -//.word 0x711212d7 -//.word 0xe68f4485 -//.word 0x53272432 -//.word 0xa7594003 -//.word 0x0510ebd0 -//.word 0x74839127 -//.word 0xd85a4794 -//.word 0x2112a61f -//.word 0xc2a2da17 -//.word 0x645ff60e -//.word 0xdc1d8a25 -//.word 0x5b97788a -//.word 0xe511033e -//.word 0x053b291c -//.word 0xbe593317 -//.word 0xc4a18ac3 -//.word 0xede4cc17 -//.word 0xe2711f71 -//.word 0x1a37c6da -//.word 0x0929f28b -//.word 0x94e7dab1 -//.word 0xc99a0d6e -//.word 0xcd1f0720 -//.word 0x156903e5 -//.word 0xd920115f -//.word 0xc68e68b4 -//.word 0xf4bcfdd9 -//.word 0x17d85511 -//.word 0xf9da97b0 -//.word 0x2868e525 -//.word 0xebf6ec37 -//.word 0x7b31ba8f -//.word 0x709ed077 -//.word 0x7a7e79e1 -//.word 0x51f65aab -//.word 0xef6c4921 -//.word 0xfc3463c4 -//.word 0x8a6c584a -//.word 0x02240ae5 -//.word 0x5ec357c8 -//.word 0x99a532e8 -//.word 0x6409f9ff -//.word 0x1b2b02d7 -//.word 0xf7ad78c5 -//.word 0x853b6573 -//.word 0x576f0fe3 -//.word 0xf9f288b1 -//.word 0x26e58199 -//.word 0x3c7f5f38 -//.word 0xeef79117 -//.word 0x39a420e5 -//.word 0x99638704 -//.word 0x7c39c648 -//.word 0xf739b2fb -//.word 0xb8a88f24 -//.word 0x3c60e008 -//.word 0x42727ef2 -//.word 0x7f0fe830 -//.word 0x93a9da5e -//.word 0x3c5521e7 -//.word 0xc974adc8 -//.word 0xd292e897 -//.word 0x278e46c4 -//.word 0x06fb1d20 -//.word 0x91c7b89b -//.word 0x7e1aa752 -//.word 0x118158c9 -//.word 0x474cec74 -//.word 0x5535437d -//.word 0x504259c1 -//.word 0x2eecd61c -//.word 0xed80e0e6 -//.word 0x12c634bd -//.word 0x55e17585 -//.word 0x9b76c3ae -//.word 0x241090b5 -//.word 0x06c3afee -//.word 0xda10ae80 -//.word 0xb50966b1 -//.word 0x5ab5d064 -//.word 0xadb61bdf -//.word 0x6b29fbd2 -//.word 0x19ce4395 -//.word 0x3a69b6b2 -//.word 0xc5681aa3 -//.word 0xd6c58fdd -//.word 0xa42e1f0d -//.word 0xb36496a1 -//.word 0x4be1948a -//.word 0x28bde040 -//.word 0x73d2ff07 -//.word 0xf11f0672 -//.word 0x7b6aac25 -//.word 0xae29a3de -//.word 0xe3a329b7 -//.word 0x6153daa5 -//.word 0xd28dc845 -//.word 0xf464cdd8 -//.word 0x91ca208b -//.word 0xb1f927fd -//.word 0x0e128cfb -//.word 0xc804938e -//.word 0x5ab0ab37 -//.word 0xcd4b4379 -//.word 0x2c03de98 -//.word 0x37e56aa1 -//.word 0x5bfecdaa -//.word 0xe2c0c25b -//.word 0x68a8e3ad -//.word 0x8e1e06f2 -//.word 0xf29dcd16 -//.word 0x5e137924 -//.word 0x3f8bff0b -//.word 0x59095ea3 -//.word 0xbab52feb -//.word 0xec3c7e95 -//.word 0x6f74d8c4 -//.word 0x663fa514 -//.word 0x91b1b9db -//.word 0x7b7525ae -//.word 0xf56c5327 -//.word 0xc29852e6 -//.word 0x94396ed6 -//.word 0x383504b1 -//.word 0x0dbd94c7 -//.word 0xba2e18fb -//.word 0x2035940e -//.word 0x8e37ef20 -//.word 0x34f00173 -//.word 0xdb5aed73 -//.word 0xd3d0b1f3 -//.word 0x2c73fbba -//.word 0x29cd3f3e -//.word 0xf1b406af -//.word 0x88718937 -//.word 0xfe227e81 -//.word 0xe65d3278 -//.word 0x0a16d851 -//.word 0x5dc320cb -//.word 0x31bd0cb5 -//.word 0xaaea00b1 -//.word 0x73991839 -//.word 0xafadbddf -//.word 0x33fe7bd9 -//.word 0xf2fc0dbc -//.word 0xb896ba88 -//.word 0x1c5ae5e5 -//.word 0xb0dddfac -//.word 0x7a5dffa9 -//.word 0xa8a5f5a0 -//.word 0x7f315b8d -//.word 0x95938d30 -//.word 0x4015bbc9 -//.word 0x4ea03c21 -//.word 0xf6dc25c9 -//.word 0x0f991ba6 -//.word 0x806e65ae -//.word 0xf89f45ec -//.word 0xdf4489ca -//.word 0x8ca85d8f -//.word 0xb8f06327 -//.word 0x32fd0623 -//.word 0xd5930b00 -//.word 0xb8ba68ac -//.word 0xa4645a46 -//.word 0xcb51b225 -//.word 0xb6306f1d -//.word 0x800792fd -//.word 0x42d42e5c -//.word 0xce75bf96 -//.word 0xa0c5bc11 -//.word 0x110870c5 -//.word 0xce8905fb -//.word 0x8981e254 -//.word 0xee3b370e -//.word 0xd976d583 -//.word 0xc60b44f2 -//.word 0x89cf0f82 -//.word 0x3fbb6384 -//.word 0x844ad8f9 -//.word 0xe6238f54 -//.word 0x9af87d81 -//.word 0x6eae0625 -//.word 0xffbece28 -//.word 0x2cdbcc71 -//.word 0xcad5a0f0 -//.word 0x99bd26e2 -//.word 0x774a4b50 -//.word 0xd47b1fd9 -//.word 0x667e2cb2 -//.word 0x1ed107eb -//.word 0x5aa724f4 -//.word 0x5c8dee5f -//.word 0xfb4d17e7 -//.word 0x98122db2 -//.word 0x54ce6fd3 -//.word 0x80d9de13 -//.word 0x56db97f1 -//.word 0xe6eb5fe7 -//.word 0x52f880ef -//.word 0x3e68d446 -//.word 0x83001f70 -//.word 0x2304a17c -//.word 0x829fec89 -//.word 0xd384f489 -//.word 0xd0d66545 -//.word 0xae4639a2 -//.word 0x507b8922 -//.word 0xbbb6a3ad -//.word 0xcab65e92 -//.word 0x22d9aac9 -//.word 0x69856b7b -//.word 0xb3c688c3 -//.word 0x3d383eb7 -//.word 0x5e28bba2 -//.word 0xbaf6e894 -//.word 0xb9bd861d -//.word 0x38367c55 -//.word 0x7eda6f1f -//.word 0x714794af -//.word 0x09e5c24a -//.word 0x06c9cc4d -//.word 0xdeda0d71 -//.word 0xfa32444d -//.word 0x21c7a31d -//.word 0x354a22c1 -//.word 0x1d4f1909 -//.word 0x02af0e2f -//.word 0xbe2acba5 -//.word 0x9151b411 -//.word 0x16a45897 -//.word 0x76f74656 -//.word 0xdc1a2235 -//.word 0x29b8f8df -//.word 0xe880cf0c -//.word 0x84838203 -//.word 0xb8ddcb5c -//.word 0x4898a10b -//.word 0xefcdc49a -//.word 0x980c96b6 -//.word 0xd1fe2ced -//.word 0x7c49a5b6 -//.word 0xc7b4bab2 -//.word 0x5f8c9731 -//.word 0xe146e9f8 -//.word 0x92653942 -//.word 0x4f9f7804 -//.word 0xc73bdb75 -//.word 0xe7bde9ce -//.word 0x96c5d24e -//.word 0xa3350282 -//.word 0xfb92f6c3 -//.word 0x20ad4e00 -//.word 0xd68224be -//.word 0x20609d5c -//.word 0x6a4abd9c -//.word 0x089e805f -//.word 0xdff426b0 -//.word 0x6249ce04 -//.word 0xc15d46c0 -//.word 0x5c5922fc -//.word 0x7eb50b87 -//.word 0x48595a2b -//.word 0xeb02e632 -//.word 0x1be81928 -//.word 0xc09e4ae3 -//.word 0xee3946c1 -//.word 0x17b43031 -//.word 0x7f938c75 -//.word 0xf1c796a6 -//.word 0xb1d2d8f8 -//.word 0xb12bfb3f -//.word 0x07e4deb2 -//.word 0x9f8ae5ef -//.word 0x2d4d9440 -//.word 0x66605c1d -//.word 0x70a3b4f2 -//.word 0x97806c22 -//.word 0x41123e4b -//.word 0x248da7cc -//.word 0xb6daf584 -//.word 0xe581a0dd -//.word 0x09ccdd09 -//.word 0x172a718c -//.word 0x17d1c3fb -//.word 0xd8a73603 -//.word 0xe263b5ac -//.word 0xacef90df -//.word 0x0f118627 -//.word 0xfb4b23b4 -//.word 0x69004ca5 -//.word 0x90d71887 -//.word 0x5c65e118 -//.word 0x1c069b51 -//.word 0x7b0b65a4 -//.word 0xb11b5e83 -//.word 0xfad3ba21 -//.word 0x47b0157c -//.word 0x342f069b -//.word 0x3b32f814 -//.word 0x27a635d2 -//.word 0xcb634415 -//.word 0xf35375ba -//.word 0x9bd7babd -//.word 0x5f66b8fc -//.word 0x33781e3e -//.word 0x54a23673 -//.word 0x7f02ba3e -//.word 0x60dde8b0 -//.word 0x4d87d857 -//.word 0x34830e77 -//.word 0xd2ec4c97 -//.word 0x2613a93f -//.word 0x266ae701 -//.word 0xb0a102b6 -//.word 0xc30e050a -//.word 0xef52213b -//.word 0x0a3a001d -//.word 0x25e35762 -//.word 0xbe22bb18 -//.word 0x3822b573 -//.word 0x884f18cd -//.word 0x307392eb -//.word 0x711f8282 -//.word 0xbc4d09f9 -//.word 0x6b436471 -//.word 0xaebb7903 -//.word 0xc840af48 -//.word 0x7bdb031f -//.word 0xc0ef59aa -//.word 0xbc620f9a -//.word 0xf0fdd8ad -//.word 0xb016c874 -//.word 0xd66cab5a -//.word 0xb7529be2 -//.word 0x5610d230 -//.word 0xd886bccb -//.word 0x381250a1 -//.word 0x3cb4a14c -//.word 0xa870b093 -//.word 0xb1f48534 -//.word 0xb47b7ee1 -//.word 0x28f1e688 -//.word 0xd258c9d7 -//.word 0x376a0700 -//.word 0x5780a8b9 -//.word 0x98b26f87 -//.word 0x0140b23d -//.word 0xa83169bf -//.word 0x6e39840c -//.word 0xe9e0827c -//.word 0xa2e13f46 -//.word 0x81d00d44 -//.word 0x850007fb -//.word 0xb8a4a2d6 -//.word 0x633485b2 -//.word 0x7e139b9f -//.word 0x6a6e66e5 -//.word 0xe3679646 -//.word 0x3073da83 -//.word 0x9c00f622 -//.word 0x2a5c166d -//.word 0x85d261be -//.word 0x3616d2fa -//.word 0x19e3435c -//.word 0x12e2cb74 -//.word 0xfcce4a6f -//.word 0xe2d64298 -//.word 0x7242e91f -//.word 0xae5a7c19 -//.word 0xe583d5c9 -//.word 0xe2ac401e -//.word 0x63e88b7c -//.word 0xcd5c5cc0 -//.word 0x1d5cc77e -//.word 0x22d1208c -//.word 0xeade0ec5 -//.word 0x7ac3e107 -//.word 0xc101267e -//.word 0xcfbf7825 -//.word 0x436c9989 -//.word 0x02a6c1d1 -//.word 0x2f5a35fb -//.word 0x572d1c68 -//.word 0xeb1b8e9b -//.word 0xf45eef3e -//.word 0x02927b65 -//.word 0x65162117 -//.word 0xa0b5950b -//.word 0x1b86a1af -//.word 0x1810bc6e -//.word 0xe8b2dd33 -//.word 0x5f439129 -//.word 0x85f54cc6 -//.word 0x8e7ffc07 -//.word 0x0d7be4fd -//.word 0x640ca888 -//.word 0x7fc5a463 -//.word 0xc2c68260 -//.word 0x3f280cf5 -//.word 0x2d9c3ef8 -//.word 0x954ea0a7 -//.word 0x4f10d3eb -//.word 0x2db469de -//.word 0x76b9fa8a -//.word 0x962b73f4 -//.word 0x13c4b259 -//.word 0xc35750b7 -//.word 0x3d6fbe8f -//.word 0x8d3394e9 -//.word 0x2c8c259a -//.word 0x2f8a57c2 -//.word 0xbe04b298 -//.word 0xc87fb66a -//.word 0xf55172df -//.word 0xdc075280 -//.word 0x77033976 -//.word 0xd36acf95 -//.word 0x0c3d1d9a -//.word 0x79c557b1 -//.word 0x2435f83b -//.word 0x7d8b14cd -//.word 0x4fb7ea7c -//.word 0xf2ffba58 -//.word 0xc3a2d636 -//.word 0xd1bbfab3 -//.word 0xd969e075 -//.word 0x752d10b4 -//.word 0x9093f6f9 -//.word 0x1d153626 -//.word 0x083c44b7 -//.word 0x6d082f47 -//.word 0x0992bd56 -//.word 0xeef0bd49 -//.word 0x7a5999b2 -//.word 0x89892bd2 -//.word 0xea67d15d -//.word 0x10e6c47c -//.word 0x0a29a518 -//.word 0xb6ea5956 -//.word 0x311c175e -//.word 0x91cfbf61 -//.word 0xd7556eda -//.word 0x1fa34f14 -//.word 0x1af9b4ec -//.word 0xbec665d8 -//.word 0x3cc63728 -//.word 0x336de18c -//.word 0x23880cd7 -//.word 0x2422a902 -//.word 0xd8a48774 -//.word 0x9e412580 -//.word 0x0891c530 -//.word 0x907cc141 -//.word 0x865a226e -//.word 0x4d586ff2 -//.word 0xc71ec348 -//.word 0x0eaf2235 -//.word 0x65900d08 -//.word 0x6e2c5421 -//.word 0x9d772cb0 -//.word 0xecd281bf -//.word 0xd02f8e73 -//.word 0x6c75aa8e -//.word 0x05266539 -//.word 0xb73fd301 -//.word 0x665f281f -//.word 0xf72c85fc -//.word 0xbff212f4 -//.word 0x3b8e4d5a -//.word 0x028ba2bd -//.word 0xf98a3b6a -//.word 0xc6e71932 -//.word 0x8799646e -//.word 0xc35aff40 -//.word 0xa009601b -//.word 0x574c9f85 -//.word 0xe679cc1b -//.word 0x05b786d6 -//.word 0x5a60c98e -//.word 0xf0aa08bc -//.word 0xe6877c84 -//.word 0x64c9bbf3 -//.word 0xd38a8c85 -//.word 0x4ecbfaea -//.word 0x535ba709 -//.word 0xbffb6346 -//.word 0xf9bffd00 -//.word 0x6db7595e -//.word 0x3ccfc34c -//.word 0x31f483c0 -//.word 0xf878b242 -//.word 0x8ab84cab -//.word 0xecfc862d -//.word 0x199e6193 -//.word 0x3d6f7fca -//.word 0x235635a1 -//.word 0xf13ae3cd -//.word 0x13228030 -//.word 0x759b795b -//.word 0xf55bbc51 -//.word 0x80000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00005AA0 -//// expected output -//.word 0xdc046569 -//.word 0x0127cf6b -//.word 0xb6a066a8 -//.word 0xf400e645 -//.word 0x82e2540f -//.word 0xb2794332 -//.word 0x533d3787 -//.word 0x3f08dfe7 -//.word 0x408b2cba -//.word 0x3b539138 -//.word 0x486fb75a -//.word 0xeaf08122 -//.word 0x9c525963 -//.word 0xc0d86efb -//.word 0xd4c744f7 -//.word 0x5496cef7 -//// SHA512LongMsgvector_29 -//// vector length -//.word 0x00005DB8 -//// input message -//.word 0x5b5180ac -//.word 0x2e0afd84 -//.word 0xfbe10116 -//.word 0xaae8ec95 -//.word 0xaba3c147 -//.word 0x450c1f9d -//.word 0x2bda74a4 -//.word 0x51036d9c -//.word 0xfd80b1e5 -//.word 0x2150ce23 -//.word 0xe8bf739a -//.word 0x8fe8e1da -//.word 0x76799ca1 -//.word 0x77b666fd -//.word 0x76c16db1 -//.word 0x3918c4da -//.word 0x7a5f10d2 -//.word 0x3b608455 -//.word 0x5a500fe2 -//.word 0x6553d364 -//.word 0xaf43da12 -//.word 0xa4ad0494 -//.word 0x591d4467 -//.word 0x689c0c82 -//.word 0xfa76063a -//.word 0x25410563 -//.word 0x791a3bb8 -//.word 0xd532ac7d -//.word 0x7f8ae262 -//.word 0x74fae3ab -//.word 0xfd78608e -//.word 0x83972fdc -//.word 0xa44efce4 -//.word 0x87fb3b95 -//.word 0x6ca760e2 -//.word 0x878c536b -//.word 0x0ed41e59 -//.word 0x91a4e989 -//.word 0x8a5929ee -//.word 0x35121430 -//.word 0xa16e5899 -//.word 0x07970c32 -//.word 0x5c7fe729 -//.word 0x2269b076 -//.word 0x83acf5be -//.word 0xa0b30078 -//.word 0x2749074e -//.word 0x2313a3c6 -//.word 0x195e8321 -//.word 0x501c6284 -//.word 0x70283655 -//.word 0x4fd2abe8 -//.word 0x0797cf5b -//.word 0x4c300fbe -//.word 0xfccf6277 -//.word 0xf8a5c4e5 -//.word 0x33a7e644 -//.word 0x089224d1 -//.word 0xd12cb72e -//.word 0xb5cd2c07 -//.word 0xc11f14f6 -//.word 0x3a22fea4 -//.word 0x3273a232 -//.word 0x5acd5fd7 -//.word 0x17d0e8ca -//.word 0xd8013a62 -//.word 0xa613d17b -//.word 0xfd651b1d -//.word 0xdacb2d58 -//.word 0x1591b572 -//.word 0xf1bd2f45 -//.word 0xf2955ce2 -//.word 0xee61f07a -//.word 0x67728b7f -//.word 0x1863eb06 -//.word 0xce9f6070 -//.word 0x79238049 -//.word 0x83861b70 -//.word 0x60367278 -//.word 0x6704a34f -//.word 0xe0e3681d -//.word 0x5eec016f -//.word 0x4fa66f95 -//.word 0xd185e348 -//.word 0xc7b07691 -//.word 0x2c071ae6 -//.word 0xa865d195 -//.word 0x61221d66 -//.word 0x14ddb77b -//.word 0x6478837c -//.word 0x7263c4f1 -//.word 0xad1e8def -//.word 0xecf978f7 -//.word 0xba1f991b -//.word 0xf0d2b562 -//.word 0x8af8b06e -//.word 0xb3d7455c -//.word 0x221dfaec -//.word 0xa92352e2 -//.word 0x0b7244ac -//.word 0x0f87ec44 -//.word 0xd2d38158 -//.word 0x610687a9 -//.word 0x878d45b1 -//.word 0xe4597a88 -//.word 0x3fe34c08 -//.word 0x1e6d8130 -//.word 0x938af1c6 -//.word 0x58e03b40 -//.word 0x1e2db8e5 -//.word 0x2388ad30 -//.word 0x03eac575 -//.word 0xd0ecbec6 -//.word 0x64d26218 -//.word 0xf6c9b9a2 -//.word 0xec6d7d86 -//.word 0xf08eceb3 -//.word 0x4634270a -//.word 0x5de091c0 -//.word 0xa4151603 -//.word 0x9e1779e0 -//.word 0x39f32464 -//.word 0x5cbf6201 -//.word 0xbf23ce34 -//.word 0xff190c65 -//.word 0xf2f0b60f -//.word 0x38979920 -//.word 0x121822a3 -//.word 0x7763139c -//.word 0x654d7a33 -//.word 0x76d8e415 -//.word 0xb3b5ce18 -//.word 0xac075c1e -//.word 0xc96a4e3b -//.word 0xdb342f1a -//.word 0xf6fbcf9c -//.word 0x8357f4c3 -//.word 0x91e84dcf -//.word 0x6c9ba7a6 -//.word 0x712a6379 -//.word 0x20e228a5 -//.word 0x73a9d5d7 -//.word 0x6e3fba74 -//.word 0xf8c40738 -//.word 0xe97b841d -//.word 0x64cd837e -//.word 0x6791147c -//.word 0xa08a77a1 -//.word 0x8331d7c3 -//.word 0x99b5352b -//.word 0x1b41a2f7 -//.word 0xbf7db1bd -//.word 0xd2572c71 -//.word 0x87030689 -//.word 0x8f40915e -//.word 0xe9def1d6 -//.word 0xfc7dd140 -//.word 0xe397547f -//.word 0x08c14e6b -//.word 0xf42db574 -//.word 0x65745289 -//.word 0xa192bc38 -//.word 0x0b328716 -//.word 0xf42db961 -//.word 0xb34d7de4 -//.word 0xf8561c1b -//.word 0x5d472898 -//.word 0x3eddfba5 -//.word 0xcb59602b -//.word 0x5b838fd2 -//.word 0x04ef5f6a -//.word 0x687fb78a -//.word 0xd1294576 -//.word 0x81fa7346 -//.word 0x435b9745 -//.word 0x46946a98 -//.word 0x2b8ebc20 -//.word 0x5ddd66a1 -//.word 0xa1fd7f23 -//.word 0xeedcd398 -//.word 0x7e9990c0 -//.word 0x258c434a -//.word 0xe286033c -//.word 0xb45aec94 -//.word 0xae9cd02f -//.word 0x4ea828eb -//.word 0x0be65109 -//.word 0x2d4df5d5 -//.word 0xe126c788 -//.word 0x8d13736d -//.word 0x614fd443 -//.word 0x2f3768e3 -//.word 0x7c0a0222 -//.word 0xd7edbff9 -//.word 0x69323be3 -//.word 0xced90587 -//.word 0x23575097 -//.word 0x6097ebf8 -//.word 0xe83f7323 -//.word 0x5f34c7cb -//.word 0xbc60bcc0 -//.word 0x9fb31213 -//.word 0xe467a77b -//.word 0x7889ebf7 -//.word 0x6bb594b5 -//.word 0x47219333 -//.word 0xa1dc46a4 -//.word 0xed58ef95 -//.word 0x972765d0 -//.word 0x4f020980 -//.word 0xa40ffc97 -//.word 0xd4648f6d -//.word 0xe2c7fba9 -//.word 0xeab75365 -//.word 0xb2b1b68d -//.word 0x81acc988 -//.word 0x34e6641b -//.word 0x8ee28c8a -//.word 0xd0b1a200 -//.word 0x8972d930 -//.word 0xb015ee3d -//.word 0xf06413d7 -//.word 0x43432ca8 -//.word 0xc2363dee -//.word 0xbc252369 -//.word 0x055c8377 -//.word 0x90d6017e -//.word 0x40bbb28a -//.word 0xfc27d337 -//.word 0x022dbbd2 -//.word 0x7d1c0ebb -//.word 0x5900340d -//.word 0x566c0981 -//.word 0x5b77d690 -//.word 0x0e0581d8 -//.word 0xa14800c1 -//.word 0xee861360 -//.word 0xc71c339c -//.word 0x87c3c58f -//.word 0xed12942f -//.word 0x2b447e2d -//.word 0x393c6e1d -//.word 0x6fc68ad8 -//.word 0x5320ad1e -//.word 0xb0b91780 -//.word 0xe838637d -//.word 0x8ac0baec -//.word 0x2772479a -//.word 0x6234ea33 -//.word 0x47b13166 -//.word 0xdea18444 -//.word 0xff4b9fe9 -//.word 0x6748465f -//.word 0x0c8933bf -//.word 0xae9c5499 -//.word 0xaf2a3396 -//.word 0x24c5b65c -//.word 0x2ce008b2 -//.word 0x811fd7e5 -//.word 0x4cd2c06a -//.word 0x3ebc07c4 -//.word 0xdc188ca9 -//.word 0x1adefa60 -//.word 0x2c42426d -//.word 0x997d4870 -//.word 0x91d1db4b -//.word 0x80c7eb83 -//.word 0xe3bcf6e9 -//.word 0x5b9bc479 -//.word 0xffec5482 -//.word 0xf70e1607 -//.word 0x47c05b65 -//.word 0xe8e70937 -//.word 0x1d8b9377 -//.word 0x042228e6 -//.word 0x6b112bad -//.word 0xe670e444 -//.word 0x1e0d7593 -//.word 0x6cb40f57 -//.word 0xa7ae65c8 -//.word 0x3a886179 -//.word 0x7916167f -//.word 0x35b6f7d5 -//.word 0x8dd946ff -//.word 0x08c0cfee -//.word 0xe184d524 -//.word 0xa2594d18 -//.word 0xf4134adc -//.word 0xb6eab9fd -//.word 0x4c7a4eab -//.word 0x3a0ebe19 -//.word 0xf11d2f27 -//.word 0xe815ec3f -//.word 0xef585e7c -//.word 0xc1843812 -//.word 0xd8f8f1ea -//.word 0x8594778c -//.word 0x3fbf2242 -//.word 0x3cafe67a -//.word 0x3ee5ce6d -//.word 0xb0f6a5fe -//.word 0xf191f6e5 -//.word 0xf0be380c -//.word 0xf9644239 -//.word 0xce0e05ee -//.word 0xfaee798e -//.word 0x6223d8c0 -//.word 0x1d370b18 -//.word 0x85ec61f5 -//.word 0x8e3887a5 -//.word 0x578eb5d0 -//.word 0xff5f2513 -//.word 0xbae1c9eb -//.word 0x240f3dd5 -//.word 0xd5f1fbb3 -//.word 0x351dce72 -//.word 0x917e89ea -//.word 0x6f54f805 -//.word 0x1f7c1724 -//.word 0x93f282be -//.word 0x71942d4a -//.word 0x65285560 -//.word 0xbca1b61b -//.word 0x2f9effc1 -//.word 0xfc3483a6 -//.word 0x3ced314d -//.word 0x7010c6d1 -//.word 0x5d234183 -//.word 0x1aaf97d5 -//.word 0x6743a977 -//.word 0x40bb73bf -//.word 0xb2c2864e -//.word 0xee96b8f1 -//.word 0x9c0c1ac5 -//.word 0x71d32a9f -//.word 0x04fc4aaa -//.word 0xddba7152 -//.word 0xcf672161 -//.word 0x89c89968 -//.word 0x67924b61 -//.word 0x8e2d9092 -//.word 0x37b79bb5 -//.word 0x4b4cab55 -//.word 0x3185857b -//.word 0xe33e228a -//.word 0x489da568 -//.word 0xbe5090de -//.word 0xf5153642 -//.word 0x04807453 -//.word 0xb6f99c64 -//.word 0x2504b2bd -//.word 0x8bc5db3e -//.word 0x54c31245 -//.word 0x78ec1dd2 -//.word 0x07d9bfe9 -//.word 0x06543038 -//.word 0x7917cafa -//.word 0xc1d7051b -//.word 0x2881a59d -//.word 0xbbc4323a -//.word 0x58cfa94b -//.word 0x075c71e8 -//.word 0x8ded9051 -//.word 0x3f551f8c -//.word 0x157bfb50 -//.word 0xff5bbe22 -//.word 0x7c4deebe -//.word 0x688a74b8 -//.word 0x15ec4f63 -//.word 0x9ef589f2 -//.word 0x78136add -//.word 0x4a22ed87 -//.word 0xff33701d -//.word 0x198cafc1 -//.word 0x48f0f3e8 -//.word 0x3b208700 -//.word 0xb6a16c57 -//.word 0xe5c04d38 -//.word 0xf0d4b557 -//.word 0xcfc3806e -//.word 0x60c79029 -//.word 0xb672c140 -//.word 0xb4f01ee2 -//.word 0xdb8d555a -//.word 0x617668ed -//.word 0x83c4a601 -//.word 0x1cb6da85 -//.word 0x753ec28c -//.word 0x5fc0c23b -//.word 0x7f16dae6 -//.word 0xead7d676 -//.word 0xf2d9c40e -//.word 0x3ff4abee -//.word 0x21097a97 -//.word 0x24433f2f -//.word 0xe59d9928 -//.word 0x25a5701d -//.word 0x1c7fe3fc -//.word 0x0f2c826a -//.word 0x250dbe63 -//.word 0x77a29d21 -//.word 0x6698b340 -//.word 0x31034d1f -//.word 0xc7e8ef89 -//.word 0xd9fe0195 -//.word 0x34b5c5ca -//.word 0x4e788c87 -//.word 0x1e2f2aa2 -//.word 0x3109a750 -//.word 0xfb783745 -//.word 0x6b7d6c1c -//.word 0xc225abf8 -//.word 0xa454dd6c -//.word 0x6fc16698 -//.word 0xcd425b95 -//.word 0x854aef14 -//.word 0x97af2f41 -//.word 0x87b1f0ee -//.word 0xf93905ed -//.word 0x7e5eb5bd -//.word 0xae2d6c6a -//.word 0x77aab0ae -//.word 0xb412575c -//.word 0x0163f7fe -//.word 0xce1e9fbd -//.word 0xb34cc482 -//.word 0x03bf7e5b -//.word 0xa49af520 -//.word 0x1e141556 -//.word 0xf1788a53 -//.word 0x2c70e8a3 -//.word 0x3b8429ab -//.word 0x01de5d8c -//.word 0x27509d4b -//.word 0xb398412e -//.word 0xdce25369 -//.word 0x1c8e43f9 -//.word 0x8834dbd1 -//.word 0x5de57634 -//.word 0xdbb46d62 -//.word 0x5675d376 -//.word 0x8ac5628f -//.word 0x2f4bb42e -//.word 0xcd3db7df -//.word 0xd2255b1c -//.word 0xe2e58d6e -//.word 0x6ef869d5 -//.word 0x88fcab6a -//.word 0xf56d6743 -//.word 0x84b4fb97 -//.word 0x9f604122 -//.word 0x20b309cb -//.word 0x6660c685 -//.word 0xa7938773 -//.word 0x8732294f -//.word 0xea62cb0c -//.word 0x074e83ba -//.word 0xbf244fab -//.word 0x2c5f4fd4 -//.word 0x7c4c3175 -//.word 0x00c7ecfd -//.word 0x8046b128 -//.word 0xd21a1e6a -//.word 0xaaf1b690 -//.word 0xb49e8ea5 -//.word 0xe01d4812 -//.word 0xfed1450a -//.word 0x8a111725 -//.word 0xc9e3354b -//.word 0x1507f3d4 -//.word 0x7438b1ed -//.word 0x70ae523e -//.word 0x23e7f0ca -//.word 0x92a7cd16 -//.word 0x3c3e8d8d -//.word 0xf209a323 -//.word 0xe83b0a39 -//.word 0x0ddd35c0 -//.word 0x981448a2 -//.word 0xe3a3885d -//.word 0x7db010f1 -//.word 0x7bcbc7fd -//.word 0x0e2c8e25 -//.word 0x5b3cbeb6 -//.word 0x8658d18d -//.word 0x10d15f35 -//.word 0x64374d4f -//.word 0xacd74137 -//.word 0xe98258e4 -//.word 0x43901c10 -//.word 0x9d25b099 -//.word 0x6db34e28 -//.word 0xcbc0f410 -//.word 0xc8ea5979 -//.word 0x002826bd -//.word 0x73526312 -//.word 0x90e42f6a -//.word 0x93ffb597 -//.word 0x11b05bb3 -//.word 0xd1753cbf -//.word 0xdefdd98a -//.word 0xda300bd4 -//.word 0x956f3db4 -//.word 0xdf1dd737 -//.word 0x9a5efd4a -//.word 0x131e7ada -//.word 0x9256f739 -//.word 0x2f8a71c4 -//.word 0xe897eac3 -//.word 0xf1ab5e90 -//.word 0x4b95f8fc -//.word 0x983f86ee -//.word 0x2e782b4d -//.word 0x6af75320 -//.word 0x469decf4 -//.word 0x2efbd47e -//.word 0x10148d82 -//.word 0xb36438f4 -//.word 0x4921c15c -//.word 0x47c0577f -//.word 0x74bb1f3b -//.word 0x409229b3 -//.word 0x5810a3ac -//.word 0x77cf4c37 -//.word 0x7ffe2c91 -//.word 0xc8628347 -//.word 0xb89bff9d -//.word 0x94a93131 -//.word 0x95ae42dc -//.word 0x3ff5e2d9 -//.word 0xee348229 -//.word 0xb20ec335 -//.word 0x5cdc2eb6 -//.word 0xd9ad25d2 -//.word 0xbf8b1987 -//.word 0x2601fe4d -//.word 0xb9dafcf7 -//.word 0x0d2a68db -//.word 0x3193f232 -//.word 0x86c120c2 -//.word 0xd037fbba -//.word 0x8e4e08dd -//.word 0x877a79e2 -//.word 0xa6d0a51b -//.word 0x07c5b656 -//.word 0x5239a101 -//.word 0x48b45c91 -//.word 0x9bef4b24 -//.word 0x0396fb64 -//.word 0x8e4c12af -//.word 0x38f08676 -//.word 0xbb1e0ee3 -//.word 0xa8f9d6bf -//.word 0xb7287792 -//.word 0x5b1f260c -//.word 0x9aa02ba3 -//.word 0x1c81967e -//.word 0x82af2d92 -//.word 0xf973a80b -//.word 0x0ef421ed -//.word 0xc4fec6fb -//.word 0xe301d1d8 -//.word 0x945dba6c -//.word 0x2bdcaa89 -//.word 0x448034ce -//.word 0x118040cc -//.word 0xf28d4768 -//.word 0x4659c680 -//.word 0x825aecd2 -//.word 0x80cc9619 -//.word 0x19f57e78 -//.word 0xf5acaf1c -//.word 0xa21c3d1e -//.word 0xe4c632a6 -//.word 0x4cc5cb56 -//.word 0x0c56e5e6 -//.word 0x0a97b20b -//.word 0x338fb09e -//.word 0x126fdcfa -//.word 0xa11723a6 -//.word 0x5fdc1934 -//.word 0xa289ed68 -//.word 0x2fa39d9d -//.word 0x08f26665 -//.word 0x853c7f70 -//.word 0xa65406af -//.word 0xa8543bb8 -//.word 0xd626ec6d -//.word 0xa24930d8 -//.word 0xf4d1585a -//.word 0xc2b02305 -//.word 0xe1353146 -//.word 0x1bd2bac7 -//.word 0x81228093 -//.word 0x022a027c -//.word 0x3de0f3ba -//.word 0x94e9ead4 -//.word 0x82a75bc4 -//.word 0x2e73c656 -//.word 0x40272ed1 -//.word 0xf3e0cdd9 -//.word 0x6b020694 -//.word 0x4a7c9b0c -//.word 0x7e4d20d4 -//.word 0x5c47b0ef -//.word 0xf312deed -//.word 0x9a75ee57 -//.word 0xccd1464d -//.word 0x36ee1f6e -//.word 0x0dfa80f8 -//.word 0xa5cf6d30 -//.word 0x40755c05 -//.word 0x24e8e8f0 -//.word 0xf01bc91e -//.word 0x2f3c04d1 -//.word 0x2e3a5f04 -//.word 0x0b85184e -//.word 0x0f15d608 -//.word 0x3dade0b2 -//.word 0x2b618d93 -//.word 0x1156fca0 -//.word 0x20c9049f -//.word 0x15526e8c -//.word 0x0d6a623c -//.word 0x9b2c2040 -//.word 0x1858f10c -//.word 0x3a9d5c59 -//.word 0xe8189cc7 -//.word 0x4d1852c7 -//.word 0x2c2478b8 -//.word 0x733f9650 -//.word 0x126a383e -//.word 0x0d6b9f0d -//.word 0xd0cdb74c -//.word 0xc42849ec -//.word 0x1fa272e9 -//.word 0x00b6542d -//.word 0xbb340bb1 -//.word 0x7189e2e5 -//.word 0xe541c752 -//.word 0x8acafd7d -//.word 0xe17b110f -//.word 0x01d40f34 -//.word 0x7708f541 -//.word 0x51b86899 -//.word 0x7602a6d1 -//.word 0x39babc12 -//.word 0x2df7f9bf -//.word 0x3ad2a258 -//.word 0xf06ae79f -//.word 0x1c2c16f9 -//.word 0x99510f16 -//.word 0x69a7f8d4 -//.word 0x04953261 -//.word 0xf0598ba0 -//.word 0x9295b5cf -//.word 0x440af766 -//.word 0xa8a32242 -//.word 0x3bb5c702 -//.word 0x2d85a7b2 -//.word 0x700b6ba7 -//.word 0x0ff595a9 -//.word 0xc1efb758 -//.word 0xbe22e2c8 -//.word 0xd1fa626f -//.word 0xae2da841 -//.word 0x87f98819 -//.word 0xdaada55b -//.word 0x8d6a29d7 -//.word 0x3c2bb9f1 -//.word 0xd203a8ff -//.word 0x56a66af3 -//.word 0x082b4c3a -//.word 0xad1063e4 -//.word 0x277fc204 -//.word 0x48cff05a -//.word 0xe84e9a2f -//.word 0x353e8481 -//.word 0x4b1dc560 -//.word 0x052a3498 -//.word 0x12241e90 -//.word 0x4b553a72 -//.word 0x43cfde8c -//.word 0x20f672f7 -//.word 0xaa3e2676 -//.word 0xa236e0a0 -//.word 0x55c67842 -//.word 0x71b428ff -//.word 0x166d3e39 -//.word 0x30031435 -//.word 0x05724279 -//.word 0x0a271279 -//.word 0xfbc33573 -//.word 0x2a1cb498 -//.word 0x1884296c -//.word 0x424f2e6f -//.word 0x3d8f16fd -//.word 0x0522db73 -//.word 0x93ef5893 -//.word 0xad6cb82a -//.word 0x02642fef -//.word 0x76f7e8af -//.word 0xbbe23ea7 -//.word 0x21002e32 -//.word 0xaf110ca4 -//.word 0x72bb7675 -//.word 0x15ce87a2 -//.word 0xb2cc4c50 -//.word 0xe8a97cb2 -//.word 0x2ecf632e -//.word 0x666520bb -//.word 0xb6d1108e -//.word 0x937b8af5 -//.word 0x1ed4cd83 -//.word 0xb498366d -//.word 0xc050b734 -//.word 0xd41a8484 -//.word 0xf9ac0f5d -//.word 0x43973770 -//.word 0xa8c9bccc -//.word 0x1156f7b9 -//.word 0xb278c8e4 -//.word 0x97d4cfbd -//.word 0x80fedf1e -//.word 0xef40af2d -//.word 0x7f97d383 -//.word 0x77ffeb8e -//.word 0x9ff01b33 -//.word 0x5329bbb8 -//.word 0xd5ac4fe2 -//.word 0xe80ab95a -//.word 0x9ae0ad55 -//.word 0x61a26674 -//.word 0x699797e9 -//.word 0x2d25a5dc -//.word 0x454f130d -//.word 0x7e7c3eba -//.word 0x307a4ac3 -//.word 0xccc25c0c -//.word 0xb5fe0923 -//.word 0x51c80f23 -//.word 0x5fb543d8 -//.word 0x8b92cb23 -//.word 0x3fed8da0 -//.word 0xbdd8e787 -//.word 0x6be9a1d0 -//.word 0x6d85209b -//.word 0x795edcce -//.word 0xe73b1400 -//.word 0x08f8c080 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00005DB8 -//// expected output -//.word 0x950233b2 -//.word 0xee76ce19 -//.word 0x43d2c6ba -//.word 0xc53bb945 -//.word 0xb5e9793a -//.word 0x41270cfd -//.word 0x8607028d -//.word 0xf5c09be1 -//.word 0xeb311ece -//.word 0x3fc5f58b -//.word 0xe0c5e233 -//.word 0xf42ddfa1 -//.word 0xb63c6132 -//.word 0x6244a57c -//.word 0x40a7e4df -//.word 0x6a7e7f18 -//// SHA512LongMsgvector_30 -//// vector length -//.word 0x000060D0 -//// input message -//.word 0x2b8e5b85 -//.word 0x086abad6 -//.word 0x0ac3cb88 -//.word 0x7d0b4f2e -//.word 0x3a06045a -//.word 0x1c75bd60 -//.word 0xb4f2b75c -//.word 0x3e1b2b76 -//.word 0xd3f22064 -//.word 0xe0848331 -//.word 0xd6c9793d -//.word 0x23ccf486 -//.word 0x620b8525 -//.word 0xce21711c -//.word 0xfda2064e -//.word 0xcb472fcf -//.word 0x944b475e -//.word 0xa6142b30 -//.word 0xf51693f0 -//.word 0x11f5a203 -//.word 0x56e9bb10 -//.word 0x626797c0 -//.word 0xcdfe94c2 -//.word 0x147f5013 -//.word 0xd560777c -//.word 0x4262d95c -//.word 0xd072c0a7 -//.word 0x2fcd802f -//.word 0x7f684f22 -//.word 0xc18f57d4 -//.word 0x8bcc0abf -//.word 0x000ab6c9 -//.word 0x00fa59c5 -//.word 0x9cb6b63b -//.word 0xcda5a86c -//.word 0x659eb791 -//.word 0x4550e964 -//.word 0xd1e1dae1 -//.word 0xa1d50f4e -//.word 0x79328879 -//.word 0x7ce19441 -//.word 0x9c58ea57 -//.word 0x5576f446 -//.word 0x9bae6eb1 -//.word 0x116830dc -//.word 0x7ba4486f -//.word 0x76e14c76 -//.word 0x673defab -//.word 0xb1ddd1f8 -//.word 0x2b8f9c38 -//.word 0xd1ae4c3e -//.word 0xb947ce18 -//.word 0x4979cd94 -//.word 0xa822c904 -//.word 0x72b8693f -//.word 0xb07412e8 -//.word 0x07b6b8f3 -//.word 0x2fa5f464 -//.word 0xa715575a -//.word 0xa7afff4d -//.word 0x574b6794 -//.word 0x3ea1832a -//.word 0xfd210db1 -//.word 0x3d1f1ab7 -//.word 0xe633f039 -//.word 0x91e01b65 -//.word 0x4173bea4 -//.word 0x4d2e28d8 -//.word 0xa1a6a7e2 -//.word 0x276aa168 -//.word 0x7fe5e0d5 -//.word 0xf6862ea1 -//.word 0xb61e22d2 -//.word 0x3a8939c3 -//.word 0x05902824 -//.word 0x940e7142 -//.word 0x91523588 -//.word 0x49c54946 -//.word 0x60cc8cb2 -//.word 0xc3f0772d -//.word 0xdf3df5c7 -//.word 0x11e77504 -//.word 0x5d343ee1 -//.word 0x62950312 -//.word 0x8d16b88e -//.word 0x8ef9a44d -//.word 0x089eb650 -//.word 0x8da71ce3 -//.word 0xc959121f -//.word 0xfd44f8b2 -//.word 0xb026a8e3 -//.word 0xa10d06d0 -//.word 0xffbcd9fa -//.word 0xdc50d904 -//.word 0xe02308b8 -//.word 0x3af1464b -//.word 0xdc3920e2 -//.word 0xe8e6ea54 -//.word 0x652f0d32 -//.word 0x37bca105 -//.word 0x4e0a3fd6 -//.word 0x1d1010f4 -//.word 0x4e232af1 -//.word 0xb4171dee -//.word 0x81a7c818 -//.word 0xb9167273 -//.word 0xe61716d7 -//.word 0x0eebfd38 -//.word 0xe2c9922a -//.word 0x388273a3 -//.word 0xbb65c403 -//.word 0xe160c853 -//.word 0x1e69b2ca -//.word 0x581cb896 -//.word 0x9aa66ad9 -//.word 0x0ce142f1 -//.word 0x23c07cfc -//.word 0x15ee279b -//.word 0x90b27df7 -//.word 0xab167002 -//.word 0x1d488500 -//.word 0xac40e545 -//.word 0xe9a3b240 -//.word 0x1be897b8 -//.word 0x79b9a356 -//.word 0x9c9c5764 -//.word 0x33d2fdd4 -//.word 0xf97f3c84 -//.word 0xe40ceac0 -//.word 0x9fca2109 -//.word 0x3bd89514 -//.word 0x22462416 -//.word 0x4c7aaf3f -//.word 0xb5d32984 -//.word 0x0e8deda2 -//.word 0xb2e55560 -//.word 0xdd7d8814 -//.word 0x18019368 -//.word 0xf80bbc5e -//.word 0x08441292 -//.word 0x04cd49c0 -//.word 0x48ddc585 -//.word 0x87abf56a -//.word 0xc08ee21e -//.word 0x6e620803 -//.word 0x002f64ec -//.word 0x8805ce26 -//.word 0xb72a89b5 -//.word 0x097819df -//.word 0x3d0054ef -//.word 0x08f3bc33 -//.word 0x0ac30c47 -//.word 0x01851195 -//.word 0x3d9abb1d -//.word 0x548e7472 -//.word 0x1640b005 -//.word 0xc343c6a6 -//.word 0x7c85fe48 -//.word 0xf82eeb05 -//.word 0x78cbfb62 -//.word 0xfdac4cd3 -//.word 0xb88ac182 -//.word 0xc26e564c -//.word 0x0dcdb00c -//.word 0x9bf8f91d -//.word 0xedb4ea1a -//.word 0xbf2429e8 -//.word 0xf2f0d6f7 -//.word 0xcaa060c4 -//.word 0x59499ea3 -//.word 0x3b6c1bbb -//.word 0x841bb152 -//.word 0xf75d594b -//.word 0x79d441ec -//.word 0xc59d1fe5 -//.word 0x6078c68e -//.word 0xd029f671 -//.word 0x091e7908 -//.word 0x28516bc8 -//.word 0x6370da5e -//.word 0x403c8f38 -//.word 0x062f2a47 -//.word 0x71617503 -//.word 0xaaacf2b0 -//.word 0x760eb6e0 -//.word 0xae507a3a -//.word 0xefe5f079 -//.word 0x921553b8 -//.word 0xdf5b42ec -//.word 0x7d0bceb2 -//.word 0x2d37d24b -//.word 0xb9d483e4 -//.word 0x2619471b -//.word 0x3128cbc0 -//.word 0xfaf04fd8 -//.word 0xfa5245e8 -//.word 0x3a821b70 -//.word 0xc7b155b5 -//.word 0x61e9dec3 -//.word 0x7338a0b3 -//.word 0x4810522a -//.word 0x7bee9122 -//.word 0xaf3a33ed -//.word 0x816ed876 -//.word 0xbb7bc1cb -//.word 0xca69e6d8 -//.word 0x733d4275 -//.word 0xc11f72a4 -//.word 0x42bc7e13 -//.word 0x73eaf7e9 -//.word 0x788a42bf -//.word 0x10b333eb -//.word 0xc90dde05 -//.word 0x707aa9a4 -//.word 0xccfca669 -//.word 0x8cd3203f -//.word 0x7de574e0 -//.word 0x0063229c -//.word 0xbcaa2456 -//.word 0x90677fcf -//.word 0xcbff1727 -//.word 0xa02ec7a0 -//.word 0xd4eeb1a6 -//.word 0xba9ad30c -//.word 0x6153dc99 -//.word 0x0ca33dc3 -//.word 0xe26082ba -//.word 0xe7d3e3a8 -//.word 0x2b1a1637 -//.word 0x42cb6855 -//.word 0xf3da0c34 -//.word 0x34bdb394 -//.word 0x57cd5d44 -//.word 0x7ef06ee6 -//.word 0x547504f4 -//.word 0xff3f8800 -//.word 0x50268340 -//.word 0x3d9ab349 -//.word 0x92895f1b -//.word 0xe383e75e -//.word 0xc51d9feb -//.word 0x3e93dd8e -//.word 0x79b1510a -//.word 0xbef3955e -//.word 0xa2eb0547 -//.word 0x7be3d106 -//.word 0x17c45163 -//.word 0xae3698f2 -//.word 0x14094b95 -//.word 0x33d4b442 -//.word 0xb9db1207 -//.word 0x0e36334b -//.word 0x89304556 -//.word 0xe3eeea14 -//.word 0xec518a15 -//.word 0x7c1cedd9 -//.word 0xad5a094b -//.word 0x47fa188b -//.word 0x7cbdeef0 -//.word 0xd6528a4e -//.word 0x6dbfeb74 -//.word 0x5d0225f9 -//.word 0x77f8b339 -//.word 0x377f0f9a -//.word 0xf6d78014 -//.word 0x614f33f0 -//.word 0x2a1d8ecf -//.word 0xfe8dc1ef -//.word 0xb65e9eaa -//.word 0xd168aa3f -//.word 0x228374d5 -//.word 0xc6a525bd -//.word 0x594a59f8 -//.word 0x69192df9 -//.word 0x2bc499ab -//.word 0x6d3001b6 -//.word 0xccd606ff -//.word 0x2769a26d -//.word 0x54b874f3 -//.word 0x11d758cb -//.word 0x3d793bff -//.word 0x48a12e2e -//.word 0xe87ab88d -//.word 0x0d82712c -//.word 0x18eecc7b -//.word 0x474b350c -//.word 0x74615c9a -//.word 0x005cd04b -//.word 0x0a2ecf32 -//.word 0xe42f5d18 -//.word 0xc706937c -//.word 0xc5cd3ad8 -//.word 0x00709826 -//.word 0x1a568aa3 -//.word 0xec44d3d3 -//.word 0x7b7eb4c5 -//.word 0x272fbd98 -//.word 0x260ae23e -//.word 0x3132d180 -//.word 0x7d578342 -//.word 0xed221109 -//.word 0x86d4caba -//.word 0x232a82a5 -//.word 0x6a832cc1 -//.word 0xfe44ac39 -//.word 0xf67ce628 -//.word 0x8fc41ba1 -//.word 0x1d6a75f3 -//.word 0x48cee02b -//.word 0x740b1cda -//.word 0x81da1018 -//.word 0xb5b462c8 -//.word 0xf637441e -//.word 0x3dcb915f -//.word 0x478518e8 -//.word 0x8e4c3872 -//.word 0x773aad94 -//.word 0xcd44a989 -//.word 0x6e1e2634 -//.word 0x44597b61 -//.word 0x77cf2e4e -//.word 0xe1400a6a -//.word 0xc33d715c -//.word 0xb645f347 -//.word 0xe42f1f4d -//.word 0x77c79852 -//.word 0x52bc6c02 -//.word 0xffbaa215 -//.word 0xe9d312d1 -//.word 0xcc237ad1 -//.word 0x69b4cd06 -//.word 0x7e9fcefb -//.word 0xf574de5d -//.word 0x5cdc12ba -//.word 0x957d8989 -//.word 0xcf1efd6b -//.word 0xb50c97b0 -//.word 0xe4bc081d -//.word 0xa3b1d5ec -//.word 0xcea0f215 -//.word 0x14d393cc -//.word 0x63cb3f4b -//.word 0x9f2926d1 -//.word 0x9acfb4eb -//.word 0x414266f2 -//.word 0x1352ddd5 -//.word 0xd8fe3118 -//.word 0x8f92871d -//.word 0xa812e6a3 -//.word 0x73db468c -//.word 0xd988eae3 -//.word 0x4a13f01d -//.word 0xf63c279f -//.word 0x402f2081 -//.word 0x6f618892 -//.word 0xa7bbb49c -//.word 0x19fa7ee9 -//.word 0x76565005 -//.word 0xa9617ec6 -//.word 0xc533d98a -//.word 0x3cc481c0 -//.word 0x5399faaa -//.word 0xd2a38260 -//.word 0x0064a219 -//.word 0xce5304a6 -//.word 0x5382843f -//.word 0x787e8982 -//.word 0xf57696b9 -//.word 0x7ca01c5c -//.word 0x33d993d7 -//.word 0x688cc88c -//.word 0x81d4791c -//.word 0x31e51fe2 -//.word 0xf2a80bc1 -//.word 0xafa5b420 -//.word 0xc0265032 -//.word 0x1c99a17b -//.word 0xca371290 -//.word 0x99e3021e -//.word 0x1155602d -//.word 0xa97778a6 -//.word 0x3b0f0c13 -//.word 0xb49fa7a7 -//.word 0x10892e7e -//.word 0x8677b825 -//.word 0xfffa9f5d -//.word 0xcd72d81c -//.word 0x9a2d7fd5 -//.word 0x9ed3b6f9 -//.word 0x1601b0be -//.word 0xf134091f -//.word 0xcce95924 -//.word 0x20020863 -//.word 0xba6c64c7 -//.word 0x6cfff090 -//.word 0x03a5ff9b -//.word 0x78bf82e4 -//.word 0x6bc41f49 -//.word 0xcc2b8391 -//.word 0xdc8cf8ac -//.word 0x54023a3c -//.word 0xe3d38655 -//.word 0xde53f581 -//.word 0x34050808 -//.word 0xa004846e -//.word 0x22a1803c -//.word 0xaf4ebc04 -//.word 0x28bb349f -//.word 0x893ef5b9 -//.word 0x63783090 -//.word 0x8c368df8 -//.word 0x1495c1a3 -//.word 0x7c6a639f -//.word 0x23e0fb20 -//.word 0x01635d80 -//.word 0x97bd3584 -//.word 0x267fe2e1 -//.word 0x20a388fe -//.word 0xdc6f60fc -//.word 0x8d9d53f4 -//.word 0x75b8c87f -//.word 0x56c9ba7c -//.word 0x2a330d0d -//.word 0x13dc22e3 -//.word 0x958da9bc -//.word 0x039cb629 -//.word 0x37c81795 -//.word 0x8664e683 -//.word 0xf4b85a17 -//.word 0xa3a4e2d8 -//.word 0x928675b4 -//.word 0x845e2345 -//.word 0x3d30f152 -//.word 0xf4aae399 -//.word 0x06075acb -//.word 0xe833a0d9 -//.word 0x5f30c26e -//.word 0xf3b89ebc -//.word 0xa1243c7c -//.word 0xd08c6230 -//.word 0x863062ac -//.word 0xdc1637d4 -//.word 0xaff5d0a7 -//.word 0x9952ac7d -//.word 0x1fe9a78c -//.word 0x2c4e14b1 -//.word 0xbfd40b6e -//.word 0xe0ae042f -//.word 0xd854a5d1 -//.word 0xa129d964 -//.word 0x9c5a2230 -//.word 0x820930f7 -//.word 0x9dabb27a -//.word 0x38ae6c3e -//.word 0x545f8a90 -//.word 0x9c0c34c7 -//.word 0x9b6562c9 -//.word 0x2d28f2d1 -//.word 0x33fef86f -//.word 0x8ba055d0 -//.word 0x403d8b3f -//.word 0xfd20cfec -//.word 0xc88e60ec -//.word 0xeced1882 -//.word 0x372c409d -//.word 0x665ea9a1 -//.word 0xdea8f86a -//.word 0x9d5e428f -//.word 0x6f69d9e3 -//.word 0x65ec6542 -//.word 0x8327368a -//.word 0xb99bd8e7 -//.word 0x156ee854 -//.word 0x3612275e -//.word 0x0422cd2b -//.word 0x9e8c20bc -//.word 0x94f5446f -//.word 0x575955c8 -//.word 0xedf2b370 -//.word 0xe95c9d7e -//.word 0x9bf602f6 -//.word 0x848b938f -//.word 0x0c321dba -//.word 0x787216df -//.word 0x16aa76ea -//.word 0xbab0c806 -//.word 0x6eb980a8 -//.word 0x66798fd0 -//.word 0x328b358c -//.word 0x371216bd -//.word 0x60a1911d -//.word 0x11584d81 -//.word 0x5d50145c -//.word 0x783ae585 -//.word 0x6f42443a -//.word 0x163ad564 -//.word 0x42f4291c -//.word 0x39efd86f -//.word 0x6736d05e -//.word 0x5386ec29 -//.word 0xd1afc9ce -//.word 0x783cd5cc -//.word 0x5656a82c -//.word 0xe3e698c2 -//.word 0x34fa87b1 -//.word 0x716a002d -//.word 0x89bb8385 -//.word 0x24431c60 -//.word 0xda8e3a46 -//.word 0xa201bf63 -//.word 0x8dbd5488 -//.word 0xb4c7ff73 -//.word 0x6e65f750 -//.word 0xc7cbb780 -//.word 0x2ef65198 -//.word 0x6ed905ad -//.word 0xe0b712cf -//.word 0xded0ccd3 -//.word 0x7a3fef56 -//.word 0x702333fe -//.word 0x5afd2003 -//.word 0x235924ee -//.word 0xbeb1e3a1 -//.word 0x188ece98 -//.word 0x4bf0f76e -//.word 0x14f023a3 -//.word 0x87a4219c -//.word 0x01435beb -//.word 0x5f89abd1 -//.word 0x6d5d7001 -//.word 0xa1b2e0a7 -//.word 0x0aaba0a9 -//.word 0x8302922d -//.word 0x2caaee5b -//.word 0x1bb39464 -//.word 0x4e6fa0c3 -//.word 0xe4d33fc3 -//.word 0x8d1fc241 -//.word 0x40c2f1b3 -//.word 0x2c77a269 -//.word 0xf0b58a13 -//.word 0x0e465284 -//.word 0x9d35edb5 -//.word 0x3fee2a0d -//.word 0x53a185df -//.word 0x6ce74335 -//.word 0x01a8becc -//.word 0x663cfd5f -//.word 0xfad08728 -//.word 0xa30c79a5 -//.word 0x77f3d798 -//.word 0xbc0a2051 -//.word 0x13bc252f -//.word 0xf0fd1a65 -//.word 0x4d2eeefa -//.word 0xa040d814 -//.word 0x0a1d3375 -//.word 0xd1438b46 -//.word 0x10b2f813 -//.word 0xad09aa18 -//.word 0x8cecc6bb -//.word 0x02a87159 -//.word 0x8d1a2945 -//.word 0xc2cd5c0e -//.word 0x86623301 -//.word 0x8135afef -//.word 0xd03df831 -//.word 0xfa34f2e8 -//.word 0x26f81089 -//.word 0x8b326d9a -//.word 0x273519b6 -//.word 0xb429b0d7 -//.word 0xd86832d5 -//.word 0x9c280e29 -//.word 0x1f5b80f7 -//.word 0x8cd31d4c -//.word 0x49aaada4 -//.word 0x71e138af -//.word 0x85476454 -//.word 0x5e9cfef7 -//.word 0x66f7d6f7 -//.word 0x0865d07b -//.word 0x65d3386f -//.word 0x492e56c9 -//.word 0x5dc84211 -//.word 0x9efefa20 -//.word 0x0d18b228 -//.word 0xa8706bf4 -//.word 0x9ad7c771 -//.word 0xaf341c6e -//.word 0x0a6ec7a0 -//.word 0x1a8cc3e9 -//.word 0xca1b7ad9 -//.word 0xf8d0da76 -//.word 0x296fac38 -//.word 0x7beb2158 -//.word 0xdbcfae4b -//.word 0x77dc1a89 -//.word 0x76f4d692 -//.word 0xe7378c33 -//.word 0xf86bfa05 -//.word 0x69a10138 -//.word 0x4015f98e -//.word 0xbd5748aa -//.word 0x90a8338b -//.word 0x4aa7f454 -//.word 0x122d0c4e -//.word 0x9975da2f -//.word 0x50806d9d -//.word 0xd8b797ee -//.word 0xb9d34232 -//.word 0x58fa0773 -//.word 0x232afd3b -//.word 0x0fdbcf57 -//.word 0x44e012db -//.word 0x168fd566 -//.word 0x382179a7 -//.word 0x2c5cc320 -//.word 0xfe6f2f2a -//.word 0x321d873a -//.word 0xfb1db562 -//.word 0xaec1d61b -//.word 0x75d78f41 -//.word 0x48cda45f -//.word 0x1918c62d -//.word 0x4fd5ad57 -//.word 0x76b16780 -//.word 0x3507f087 -//.word 0x80490209 -//.word 0x0ea12e27 -//.word 0x0ed82c89 -//.word 0x167670a2 -//.word 0x5c2bfd36 -//.word 0x286d7e1a -//.word 0x8963933c -//.word 0x480269e3 -//.word 0x1a768d37 -//.word 0x19c30203 -//.word 0x75ac91ba -//.word 0x67d460b8 -//.word 0x6723c6cb -//.word 0x9f6b5ef2 -//.word 0x9f4b5a64 -//.word 0x52541ad4 -//.word 0x316bfef4 -//.word 0xb66e7838 -//.word 0x141b65dc -//.word 0x252d9d28 -//.word 0xa4c7c8f3 -//.word 0x9c167466 -//.word 0x20336502 -//.word 0x3d462ce4 -//.word 0x2df1fc48 -//.word 0xcdecb84d -//.word 0x52ec50f8 -//.word 0x37ca4e7a -//.word 0x79e1acb6 -//.word 0x07b8e9fe -//.word 0x74e15c1d -//.word 0xf020c79b -//.word 0x76d02f3c -//.word 0x4783ebca -//.word 0x96e9fc14 -//.word 0x85f39c37 -//.word 0x5037191c -//.word 0xc897e442 -//.word 0x041de5be -//.word 0x532a1280 -//.word 0x74d040d7 -//.word 0x0a7c3938 -//.word 0x4ad80e3b -//.word 0xf7efafe6 -//.word 0x9093b82e -//.word 0xc8fb8ebb -//.word 0x36b1abec -//.word 0x4eac361b -//.word 0x90b8d722 -//.word 0xff1fc91d -//.word 0xd5823172 -//.word 0x7508ae0f -//.word 0xa1bb31f3 -//.word 0xed2e0ff0 -//.word 0x736354af -//.word 0xc9ed5bf4 -//.word 0x30529b23 -//.word 0x0eb3c404 -//.word 0x9faf0bc3 -//.word 0xe784c13b -//.word 0xeb772b73 -//.word 0x20778e69 -//.word 0x24fd890f -//.word 0xac36a794 -//.word 0xbe6435e4 -//.word 0x20825172 -//.word 0x10264435 -//.word 0x35ac12f0 -//.word 0xd6914fb7 -//.word 0x4a1d33af -//.word 0xaf45f115 -//.word 0xdfcf4582 -//.word 0xa0b74c6d -//.word 0x1bd299f1 -//.word 0x90b185d0 -//.word 0x47c8c6b9 -//.word 0xcacf44c6 -//.word 0x51692849 -//.word 0x7e0435c8 -//.word 0x4a005b46 -//.word 0x401389c4 -//.word 0xe9ecc408 -//.word 0x8716769d -//.word 0x0520081b -//.word 0x2ffbb2a9 -//.word 0x1fa392bf -//.word 0xf701fc31 -//.word 0xd6111269 -//.word 0x044094f3 -//.word 0x7018f940 -//.word 0x5d1ebea3 -//.word 0x58fbfea0 -//.word 0x6ddb4366 -//.word 0x9a139c9a -//.word 0x8406ef56 -//.word 0x69499172 -//.word 0x56051402 -//.word 0x9a9d601f -//.word 0x7a9105eb -//.word 0x26a3d0cf -//.word 0xec389d07 -//.word 0xac006b61 -//.word 0x8cd9b641 -//.word 0xecf101e9 -//.word 0x9d2bb2f7 -//.word 0x4dc5222f -//.word 0x4637f57b -//.word 0x595ea730 -//.word 0x14d96893 -//.word 0x3cb42a9c -//.word 0x7743f8fa -//.word 0x48518956 -//.word 0x407b15dc -//.word 0x73d667f8 -//.word 0x2ad8345d -//.word 0xd775ab4c -//.word 0x4e884d13 -//.word 0x3175ffd4 -//.word 0xac0c5d87 -//.word 0x63b15242 -//.word 0xa9bae5b8 -//.word 0xf3195601 -//.word 0x8c3b6a99 -//.word 0x8a3003aa -//.word 0x000bf38e -//.word 0x758c128f -//.word 0x95fc8ff2 -//.word 0x27598335 -//.word 0x3fb3cc94 -//.word 0xb5d618d2 -//.word 0xd5294035 -//.word 0x58d6d8d3 -//.word 0x942b040c -//.word 0xef418c58 -//.word 0x99db3343 -//.word 0x7b9045b5 -//.word 0x6a2d7077 -//.word 0xa155d4f3 -//.word 0x6e6a5d3b -//.word 0x2bb1514d -//.word 0x70b02596 -//.word 0x87db95b4 -//.word 0x2070f480 -//.word 0x46a0c04c -//.word 0x92ef7969 -//.word 0x9fddb3ed -//.word 0xbdc68000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x000060D0 -//// expected output -//.word 0x9b73214f -//.word 0x933db062 -//.word 0xdb8f1b46 -//.word 0xc60c2669 -//.word 0x62c8071b -//.word 0xdedf569c -//.word 0x0e870c54 -//.word 0x730a0f97 -//.word 0xe200d199 -//.word 0x260a2988 -//.word 0xa651524a -//.word 0x2abf9ecd -//.word 0x8dbc8317 -//.word 0x62f0a784 -//.word 0xf8304625 -//.word 0x39ac24a1 -//// SHA512LongMsgvector_31 -//// vector length -//.word 0x000063E8 -//// input message -//.word 0xbbfe3d99 -//.word 0xada80242 -//.word 0x0cbe6471 -//.word 0xc21633c5 -//.word 0xbf6e801d -//.word 0x3da50263 -//.word 0x492bb8a8 -//.word 0x7fb6d076 -//.word 0x1536c861 -//.word 0x1b0cd3e0 -//.word 0x00767e5b -//.word 0x594e9385 -//.word 0xdef53dec -//.word 0xb58a6ecf -//.word 0xf45f7e2f -//.word 0x61ad1528 -//.word 0x7c864a82 -//.word 0xbf0c0c84 -//.word 0x24e1c108 -//.word 0xe8de2ed5 -//.word 0x8e089728 -//.word 0x28bf2794 -//.word 0xd239920c -//.word 0x7f2ff83f -//.word 0xf8d60d24 -//.word 0x211177d5 -//.word 0x7ee577a0 -//.word 0xf72dcc5b -//.word 0xd88fd4f9 -//.word 0x1caef55b -//.word 0xeba13b68 -//.word 0x61a54260 -//.word 0x910e576d -//.word 0xca84da7c -//.word 0x196be64a -//.word 0x0ea335c2 -//.word 0xc3723d86 -//.word 0x1bbe9fcc -//.word 0x4880c26b -//.word 0x9075bb35 -//.word 0x50177188 -//.word 0x41cbfe20 -//.word 0xfa5c582f -//.word 0xb6a830b0 -//.word 0x58991af8 -//.word 0xac57ef8e -//.word 0xf0bc6f3c -//.word 0x93092b66 -//.word 0x3cd7a39b -//.word 0x0e50ab6a -//.word 0x2b9e1377 -//.word 0x76a486ce -//.word 0x9eecb376 -//.word 0x58e1ab4a -//.word 0xeb3f8a04 -//.word 0xf2c75a9b -//.word 0x5d3734cf -//.word 0xba79a801 -//.word 0xb31b6049 -//.word 0xd7ffffc3 -//.word 0x9d544f29 -//.word 0xa5c49ca7 -//.word 0x42ef5bea -//.word 0x3619107b -//.word 0xbc1f6e4b -//.word 0xccb0bf8f -//.word 0x9ab986cd -//.word 0x60216337 -//.word 0x5db73839 -//.word 0x1d698a4e -//.word 0xfcb62a17 -//.word 0xe66614ae -//.word 0x60789738 -//.word 0xcc5cb6b9 -//.word 0xe862cf2d -//.word 0x99737ad4 -//.word 0xe7ffb4cd -//.word 0x48363de6 -//.word 0x217b3eb3 -//.word 0x8a152fdd -//.word 0x5228f8bd -//.word 0x42e45629 -//.word 0xa6fd818e -//.word 0x0a5b0c3f -//.word 0x42120c0d -//.word 0xad947c18 -//.word 0xba26e0e5 -//.word 0xaa9029b0 -//.word 0x9819d903 -//.word 0xb7b26787 -//.word 0xdc72e51b -//.word 0x3c42e023 -//.word 0x76da8822 -//.word 0xd4ec108c -//.word 0xcd9e58d5 -//.word 0xcf3ecace -//.word 0x3c318231 -//.word 0xb32db17a -//.word 0x90a943f9 -//.word 0xb691bf26 -//.word 0x8c3d6f34 -//.word 0x45a4c2e9 -//.word 0x65cdeeac -//.word 0x8087d9e0 -//.word 0x455a3a70 -//.word 0xbcbdfbab -//.word 0xcc89e353 -//.word 0x00ae71f0 -//.word 0x8b250b6a -//.word 0x892658d7 -//.word 0x879aea92 -//.word 0x46d3208d -//.word 0xbc7b4ae8 -//.word 0x5cca0fc2 -//.word 0x97fc0c4f -//.word 0xa303be2a -//.word 0x7b79a2ed -//.word 0x27d89a00 -//.word 0x3ded93ae -//.word 0xa88a657e -//.word 0xa87cfac0 -//.word 0x1abcb366 -//.word 0xfaea0715 -//.word 0x26f66e7c -//.word 0x64217de5 -//.word 0xa7245209 -//.word 0x8eae3229 -//.word 0x2e14715a -//.word 0x11449221 -//.word 0x7efcb03f -//.word 0xfb391dce -//.word 0x11f1488d -//.word 0x4f04e479 -//.word 0x9271469d -//.word 0x83c50f2a -//.word 0x60da0cca -//.word 0x00bd5a32 -//.word 0x11f0cef6 -//.word 0xa5d293a2 -//.word 0xed5b1506 -//.word 0x430c1ed1 -//.word 0x6e263f62 -//.word 0x221b72da -//.word 0xc742fd76 -//.word 0x7bce9a1c -//.word 0x5a01d433 -//.word 0xfd9db4b8 -//.word 0x409c9d8e -//.word 0x49207516 -//.word 0xc6ad0500 -//.word 0x7596a361 -//.word 0xeab50e05 -//.word 0x8d5f9906 -//.word 0xe2978c9d -//.word 0x0d82c739 -//.word 0x951ca8ce -//.word 0x68282f70 -//.word 0x1f6d6020 -//.word 0x841fe9e6 -//.word 0x519c0520 -//.word 0x3b59a019 -//.word 0x2f1bbcdd -//.word 0xdc6a134c -//.word 0x7142fe6e -//.word 0xa80d9506 -//.word 0x03ce186a -//.word 0x559f8e91 -//.word 0x855dab6e -//.word 0x8fa2f77c -//.word 0xcbf32d9b -//.word 0x723be11a -//.word 0x5e786615 -//.word 0x11b5ef01 -//.word 0xf938f485 -//.word 0xf3fcd88b -//.word 0x0d62c898 -//.word 0x9023e658 -//.word 0x3e89a77e -//.word 0xd8df79cb -//.word 0xe326aa6b -//.word 0xac098588 -//.word 0x8a13be1a -//.word 0x632010fc -//.word 0x71112445 -//.word 0x46c4b5d5 -//.word 0x0e44f22e -//.word 0x153c2386 -//.word 0x89b2901a -//.word 0x80f19ec4 -//.word 0x3cc73cd0 -//.word 0xaef17d0c -//.word 0x3ad4861e -//.word 0xba6eab1a -//.word 0xc58bd554 -//.word 0x313c2773 -//.word 0xd685e1c7 -//.word 0x955684dd -//.word 0x9abc3750 -//.word 0xdd5969e1 -//.word 0xef12b8ca -//.word 0xf3071150 -//.word 0xeac81998 -//.word 0x35c6ccbb -//.word 0x5407641c -//.word 0xf41e7dfa -//.word 0x295b7641 -//.word 0xf83f1aa6 -//.word 0x183280f2 -//.word 0xf9782f9e -//.word 0x066286a1 -//.word 0x28c15c86 -//.word 0x8ba0e3c1 -//.word 0xa433d243 -//.word 0x730ac34c -//.word 0x058ad981 -//.word 0x3e9ea73e -//.word 0xd5aa4d2d -//.word 0xa0c1e418 -//.word 0x12171dfb -//.word 0x02b9245e -//.word 0xad7bcbe1 -//.word 0xff32e419 -//.word 0x0e24ee9a -//.word 0xe8bdf555 -//.word 0x8e84b325 -//.word 0x404dfba4 -//.word 0xfbaf5843 -//.word 0x41b8f19a -//.word 0x18e0affc -//.word 0x553ca24f -//.word 0x1af4a11a -//.word 0x9ef731e0 -//.word 0x2ceda9ad -//.word 0x6f6e93ee -//.word 0xec715485 -//.word 0xd007101d -//.word 0xec49c8bb -//.word 0xfe8ec596 -//.word 0x32e23a29 -//.word 0xe8b42586 -//.word 0xb8cf76ed -//.word 0xb38c739d -//.word 0xec455bea -//.word 0x380c4990 -//.word 0x319d5c47 -//.word 0x81921598 -//.word 0x5dd600ee -//.word 0x4f5c97f0 -//.word 0x3911630e -//.word 0x970f645a -//.word 0x0413b39a -//.word 0x0031669b -//.word 0xf0c6b4c8 -//.word 0x66af5afa -//.word 0xa3b83c92 -//.word 0x5a5750c6 -//.word 0xb79bb838 -//.word 0xa05f2ecd -//.word 0x3bc3a5bc -//.word 0xb0dd2de5 -//.word 0x30ab1865 -//.word 0x364c5b67 -//.word 0x0c70373c -//.word 0x920e18af -//.word 0x3b55bd92 -//.word 0x58e4999d -//.word 0x993d7979 -//.word 0xd0776817 -//.word 0xf934cf46 -//.word 0x78d3e185 -//.word 0xa1e73615 -//.word 0x7de7b653 -//.word 0xcb27b945 -//.word 0x46066d73 -//.word 0x266977f8 -//.word 0xe969ddd8 -//.word 0x53492394 -//.word 0xb4abb4fc -//.word 0x69038445 -//.word 0xa54bf45b -//.word 0x72f9f678 -//.word 0xf22e71f6 -//.word 0xeb30e762 -//.word 0x821a55d1 -//.word 0x47d25a77 -//.word 0x723c9c75 -//.word 0x6cad68f3 -//.word 0x92a3986f -//.word 0x35b3ba54 -//.word 0xe5c26ecf -//.word 0xef7810de -//.word 0x24f297aa -//.word 0xdcb7bd16 -//.word 0x3bee6198 -//.word 0xb3ce2948 -//.word 0xca556b36 -//.word 0x1e3d4e01 -//.word 0xa62c2ca5 -//.word 0x3a2b3b95 -//.word 0x56596d0a -//.word 0x1be0949a -//.word 0x9629ca0c -//.word 0x454c106b -//.word 0xd7cb3559 -//.word 0x347ffaa6 -//.word 0xbdd27321 -//.word 0xd52fb0ae -//.word 0xa0b79d99 -//.word 0x0a36272a -//.word 0x0c55a07a -//.word 0x2b116584 -//.word 0x416bbe7f -//.word 0x7f61056c -//.word 0xb31e0beb -//.word 0xc76eb752 -//.word 0x8a74f000 -//.word 0xb49fbdef -//.word 0x24daab89 -//.word 0x6b0370bd -//.word 0x8e9fcd51 -//.word 0x08ccb97a -//.word 0x0f76bbaa -//.word 0x18ce98a9 -//.word 0x9df82ee7 -//.word 0x1e04a011 -//.word 0x6620b3e2 -//.word 0x0f0c783c -//.word 0x48ce2c77 -//.word 0xd6a65cf9 -//.word 0x59444c06 -//.word 0xd1399ada -//.word 0x60ac1ff5 -//.word 0x524e16b7 -//.word 0x5a90802c -//.word 0x1e13c729 -//.word 0xf65fa198 -//.word 0xf1d93710 -//.word 0x1aef87a9 -//.word 0xf996060e -//.word 0x5cf68ad3 -//.word 0x57636809 -//.word 0x8990d910 -//.word 0xa1ffa3ad -//.word 0x21bcf55c -//.word 0x624b92e8 -//.word 0xd8df3138 -//.word 0x98cd246c -//.word 0x173f3929 -//.word 0x352dde30 -//.word 0x7a898836 -//.word 0x9fba55f0 -//.word 0x504cf06d -//.word 0x30e6b5a8 -//.word 0x1e7c155e -//.word 0xb7c53c1d -//.word 0x1bf0f29e -//.word 0xf493bf54 -//.word 0xb5e45345 -//.word 0x202b2419 -//.word 0x0b775970 -//.word 0x6390e779 -//.word 0x712efac1 -//.word 0x5c689648 -//.word 0xf06f7eda -//.word 0x9d7c559c -//.word 0xc30703e6 -//.word 0x2d3a5a50 -//.word 0xdba5fa10 -//.word 0x04337183 -//.word 0x5b5da709 -//.word 0x929d7a16 -//.word 0x1c26a586 -//.word 0x38d2e631 -//.word 0x2b5c60c0 -//.word 0xcccf3ebf -//.word 0x463e99f3 -//.word 0x1ab69bed -//.word 0x6371e5df -//.word 0x5e4c2faf -//.word 0x297b2e4a -//.word 0xcb7cbb3b -//.word 0x7549317c -//.word 0x08d2178b -//.word 0xd6aaffc1 -//.word 0xad01ade0 -//.word 0x12d27ceb -//.word 0xca5dfe3a -//.word 0x9fd8e3cd -//.word 0x60621ce1 -//.word 0x2a3840c1 -//.word 0xe62b2edf -//.word 0x1352f423 -//.word 0xc6fcef83 -//.word 0xeee834d4 -//.word 0xddb92fdf -//.word 0x04a48ab8 -//.word 0xfe6c504b -//.word 0xd1905338 -//.word 0x70c3cbe1 -//.word 0x849c3fc0 -//.word 0x6b8fa9ff -//.word 0x811cd542 -//.word 0x9f460ac8 -//.word 0xe247ecb2 -//.word 0xae82a1a2 -//.word 0xf2b93388 -//.word 0xad8035b9 -//.word 0xb1f1aa42 -//.word 0xa7a2227b -//.word 0x53d426df -//.word 0x19edd61a -//.word 0xc029d164 -//.word 0x778c550e -//.word 0x151ba85a -//.word 0xa54bb690 -//.word 0x22bafb4e -//.word 0x7f1da320 -//.word 0xea79f050 -//.word 0x5297dd00 -//.word 0x27b20175 -//.word 0x6172b5b6 -//.word 0xc31e7956 -//.word 0x610d948e -//.word 0x605dfb8f -//.word 0xfde87415 -//.word 0xd074fb40 -//.word 0x522a65a0 -//.word 0x9e4a438e -//.word 0x741c09c3 -//.word 0x832a7023 -//.word 0xe8ac18da -//.word 0xf24472aa -//.word 0x28ebdd83 -//.word 0x8d2b0f55 -//.word 0x2290b722 -//.word 0xad596057 -//.word 0xb972995c -//.word 0xdea7536a -//.word 0x42128a9d -//.word 0x60d5284a -//.word 0x080f2692 -//.word 0xa708f437 -//.word 0xc9af1baf -//.word 0xdc472177 -//.word 0x375dacaa -//.word 0x5bfdebd2 -//.word 0x782532fe -//.word 0x337ae415 -//.word 0xa63a9669 -//.word 0xa872718f -//.word 0x4f71d86f -//.word 0xb47c4b97 -//.word 0xf6c38cd5 -//.word 0x82940004 -//.word 0x91cf5726 -//.word 0xf29a70b3 -//.word 0x09557631 -//.word 0x18d15005 -//.word 0xbdbc3889 -//.word 0xbc60a95e -//.word 0xff8e7f04 -//.word 0xdbd45aa7 -//.word 0x95f6433c -//.word 0x259c92cd -//.word 0x39490e11 -//.word 0x7d8c5740 -//.word 0x1a7a8125 -//.word 0x7c5b0275 -//.word 0x59a4ce5f -//.word 0xef26c064 -//.word 0x8d843c69 -//.word 0x54ea130b -//.word 0x3ffca632 -//.word 0x610d4fe9 -//.word 0x6e92fc6d -//.word 0x7dd61d83 -//.word 0x0cefc10f -//.word 0x45f0fbe3 -//.word 0x80608bd5 -//.word 0x08ebba14 -//.word 0x225886bc -//.word 0x4bbbffa7 -//.word 0xc2ecf187 -//.word 0x4637c331 -//.word 0x21559f3c -//.word 0x659bd4cb -//.word 0x767278a7 -//.word 0xc8075191 -//.word 0xea44f6d6 -//.word 0xc4fe3123 -//.word 0x1d70a89b -//.word 0x60e8bc27 -//.word 0x9fc0b20d -//.word 0xd89010c5 -//.word 0x77a24a08 -//.word 0x1da69e29 -//.word 0xa0a73da8 -//.word 0x533eab05 -//.word 0x870668d2 -//.word 0x514fd00c -//.word 0x8e1740ab -//.word 0x25367a78 -//.word 0x8cd84b1f -//.word 0x8e306b85 -//.word 0x4b6ba45b -//.word 0x80e336f4 -//.word 0x08967b53 -//.word 0xa3d6c789 -//.word 0xf742923e -//.word 0xd4f4d98d -//.word 0xbcfcc115 -//.word 0xa30d7e4c -//.word 0xf3777317 -//.word 0xd3559a98 -//.word 0xa9082747 -//.word 0xdde46845 -//.word 0xe128f0ed -//.word 0x6e34f4ab -//.word 0x10f6f511 -//.word 0xe4a69f27 -//.word 0xa0b3f203 -//.word 0xd5fd9f9a -//.word 0x7144b5d6 -//.word 0x88e07ce9 -//.word 0x54b3a1e0 -//.word 0x7a5d947b -//.word 0x8eae2f3c -//.word 0xda6198be -//.word 0x5b076848 -//.word 0x0d410da2 -//.word 0x69326d27 -//.word 0x2b34cb1c -//.word 0x58caef40 -//.word 0x80d781a4 -//.word 0x400db7bd -//.word 0x0ca730b8 -//.word 0x2b5b1f0d -//.word 0x038aab57 -//.word 0x97bb9663 -//.word 0x4e471d87 -//.word 0xf6552035 -//.word 0x080983cf -//.word 0x2ef9d4bd -//.word 0x02e12ebe -//.word 0x19975d7b -//.word 0x40414262 -//.word 0x05c579b1 -//.word 0x7a813ad1 -//.word 0x353d7de6 -//.word 0x9b5d62a4 -//.word 0x5f5bcf64 -//.word 0x45755b77 -//.word 0x2ca36bba -//.word 0x4bcc9a6a -//.word 0xbb395f3a -//.word 0x354aeaa3 -//.word 0x1e684e7c -//.word 0xc03ae5ca -//.word 0xdb1cf0d9 -//.word 0x5ccd7f8c -//.word 0x6c6791f1 -//.word 0xac957b18 -//.word 0xbf008e26 -//.word 0x0a0af4a5 -//.word 0xb7bfdb1e -//.word 0x0008d6ea -//.word 0xaa227f45 -//.word 0xcf4f62a4 -//.word 0xe1cc1649 -//.word 0xec02ad14 -//.word 0x1b004f9c -//.word 0x7e29217e -//.word 0x0a2a6bf5 -//.word 0xe230fbab -//.word 0xd557c4cf -//.word 0x2765cb68 -//.word 0x94b844e9 -//.word 0x927df705 -//.word 0xd723e9c4 -//.word 0x1b0f39d7 -//.word 0x1f924829 -//.word 0xee181cb6 -//.word 0x62a207a0 -//.word 0xeb76837f -//.word 0x8c1461f9 -//.word 0x266d2394 -//.word 0xf950a6c7 -//.word 0x68250457 -//.word 0xfcddb8e1 -//.word 0xac2903b2 -//.word 0x5cea8fdf -//.word 0xa3e95393 -//.word 0xd1c9b6a3 -//.word 0x313af768 -//.word 0x8b6fcccd -//.word 0xedd149a7 -//.word 0xabf50445 -//.word 0xa5cb7748 -//.word 0xc819a5b5 -//.word 0xd8280149 -//.word 0x6cbe8b0d -//.word 0x3a4b3c2a -//.word 0x9467a4fd -//.word 0x337cd26e -//.word 0x34c0747e -//.word 0x60673f20 -//.word 0xb016914a -//.word 0x109a554b -//.word 0x64da285f -//.word 0xc90ab981 -//.word 0x1d227680 -//.word 0xc18f6555 -//.word 0x9d284fb4 -//.word 0x656324e1 -//.word 0x1bc99bc5 -//.word 0xd6a71941 -//.word 0xc107d4c2 -//.word 0x66de3816 -//.word 0x2d878a7e -//.word 0x1f70cb04 -//.word 0xf014df0e -//.word 0x3d29ee34 -//.word 0x121a0b4f -//.word 0xafb713d2 -//.word 0x8c2cd85e -//.word 0x9a2f7f90 -//.word 0xcc7e271e -//.word 0xd689cc22 -//.word 0x356b6ab5 -//.word 0x6f1f65c0 -//.word 0x9cf1280f -//.word 0x25320ca7 -//.word 0xcc307c5a -//.word 0xec665898 -//.word 0x02ef9688 -//.word 0x6d412f57 -//.word 0x721739d1 -//.word 0x83af502e -//.word 0xc1363b2e -//.word 0xbf81cd68 -//.word 0x89fd08de -//.word 0xe5e989d6 -//.word 0xd8c220e5 -//.word 0x6cffbe4d -//.word 0xb1ff9489 -//.word 0x02407925 -//.word 0x89d18cd3 -//.word 0x060a1bbc -//.word 0xcb7ac414 -//.word 0x0b21daf1 -//.word 0x55df0b5d -//.word 0x5c2d3fa9 -//.word 0xf90bc205 -//.word 0x7339a64e -//.word 0xfdaa6327 -//.word 0x8036c14b -//.word 0x9b8ff822 -//.word 0xe9761592 -//.word 0x822f9f17 -//.word 0xc4327b16 -//.word 0x53230d6e -//.word 0x5e04a051 -//.word 0x24aa0852 -//.word 0xb76d85be -//.word 0x0024eb30 -//.word 0x04510060 -//.word 0x6598263c -//.word 0x2c763a3a -//.word 0xc52fbbec -//.word 0x4b082fd5 -//.word 0x07b7c27b -//.word 0x331831bd -//.word 0x0321e667 -//.word 0xe6186504 -//.word 0x0903e6f3 -//.word 0x1c6143bd -//.word 0x5a1715a6 -//.word 0xc3ad1a82 -//.word 0xacbadbca -//.word 0x7a9d8bef -//.word 0xab6e31ee -//.word 0x16350a25 -//.word 0x73592865 -//.word 0x1d5b6048 -//.word 0x17c363c5 -//.word 0x4d5b2b01 -//.word 0x1d9c9968 -//.word 0x16665cfd -//.word 0x00f414ee -//.word 0x1c0eb76c -//.word 0xad8034b9 -//.word 0xb6cc5783 -//.word 0x061ced70 -//.word 0x727a28fa -//.word 0x6243457d -//.word 0x8fd96b8e -//.word 0x0a99d78f -//.word 0x810d3680 -//.word 0xbe625218 -//.word 0x701cf115 -//.word 0x2e08fad0 -//.word 0xb972da14 -//.word 0x81992630 -//.word 0x6b60824b -//.word 0xd246c1f8 -//.word 0xcc984e0b -//.word 0xaee6caaa -//.word 0xd2b3f6a7 -//.word 0x9770d40d -//.word 0xaaac09f8 -//.word 0x848586aa -//.word 0x346267dc -//.word 0x5fe41b52 -//.word 0x8519c6b2 -//.word 0x85f3e396 -//.word 0x64f92ee0 -//.word 0x4a3dc14e -//.word 0xcd8e7d4e -//.word 0x72eeab13 -//.word 0x7147e3e8 -//.word 0xb9592dc4 -//.word 0x34f7671f -//.word 0x4c73e705 -//.word 0xae576169 -//.word 0x4e550abb -//.word 0xab81fdbd -//.word 0x54bede92 -//.word 0xab76be17 -//.word 0xe98f3f77 -//.word 0x629af9fa -//.word 0x0b4d1c1e -//.word 0x393356e9 -//.word 0xaba2f77d -//.word 0xcbee53ed -//.word 0x31dc674f -//.word 0x6959c013 -//.word 0xf66c9993 -//.word 0x966a44ea -//.word 0xc869cb0a -//.word 0x8cf6d609 -//.word 0x6a0bcfbc -//.word 0xb53b4587 -//.word 0x11308e73 -//.word 0x3357b181 -//.word 0xe8da833f -//.word 0x59cf0f98 -//.word 0x8daf3bf0 -//.word 0x2f09a971 -//.word 0x9277dc9f -//.word 0xf2d29c33 -//.word 0xfda29b26 -//.word 0x91d8580c -//.word 0xc8c044a3 -//.word 0x323124ac -//.word 0x6107b6f9 -//.word 0xabd297c8 -//.word 0x2bd0644f -//.word 0x09191f98 -//.word 0xfb1ad58f -//.word 0x0c447e5a -//.word 0x9d0525e8 -//.word 0xa9f849cd -//.word 0x4d59824d -//.word 0x87bb68b6 -//.word 0x3efdb0f4 -//.word 0x827a985f -//.word 0x168086d7 -//.word 0x2b04eb13 -//.word 0x6f936e36 -//.word 0x468c47a3 -//.word 0x578de813 -//.word 0x4b2be3e5 -//.word 0xd1e608b5 -//.word 0xe65bcd2f -//.word 0x53bcf425 -//.word 0x777e67e0 -//.word 0x465167b4 -//.word 0x9255e5d7 -//.word 0x8a8b3074 -//.word 0x808ad1fa -//.word 0xef73b3ba -//.word 0xbc2688b1 -//.word 0xbcb667a2 -//.word 0x771bba69 -//.word 0x2b27578b -//.word 0x14bced11 -//.word 0xeb3ba297 -//.word 0xad3ffaa0 -//.word 0x9d8cfb2c -//.word 0x8c428f8d -//.word 0x58572976 -//.word 0xb343ab55 -//.word 0x25fd88e2 -//.word 0x542725f8 -//.word 0x848586a5 -//.word 0x5ab4267d -//.word 0xe5192633 -//.word 0xdf17aa6a -//.word 0x2f8581c8 -//.word 0xb3800000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x000063E8 -//// expected output -//.word 0x096a0d12 -//.word 0x871ba1ec -//.word 0x81261a8e -//.word 0x8b5ab587 -//.word 0xaba950b9 -//.word 0x1580286a -//.word 0xab075958 -//.word 0x6e04630b -//.word 0x8a9e6a05 -//.word 0xa2422768 -//.word 0xcdf77645 -//.word 0xd2d144a7 -//.word 0xf7a3b848 -//.word 0x0968a809 -//.word 0xe7fd3f83 -//.word 0x2fbd2424 -//// SHA512LongMsgvector_32 -//// vector length -//.word 0x00006700 -//// input message -//.word 0xa5422e53 -//.word 0x975e4316 -//.word 0x87266779 -//.word 0x30f6d3e1 -//.word 0x3281bdbd -//.word 0x13c67c16 -//.word 0x8340ed67 -//.word 0xe45d15b0 -//.word 0x093208c6 -//.word 0x3e6d09ed -//.word 0x898bf2a8 -//.word 0x304bd7d0 -//.word 0x7b62e6e4 -//.word 0xbb7091a0 -//.word 0x8b33f0d1 -//.word 0x56fa6067 -//.word 0x1a5d71cc -//.word 0x6b2cff74 -//.word 0xbaa59eb6 -//.word 0xd7ea3cda -//.word 0xb5b20173 -//.word 0x6e3e7aef -//.word 0x868ff76c -//.word 0x74d631cd -//.word 0x5e2c300d -//.word 0x25836cd4 -//.word 0xa1dc3348 -//.word 0x2ebb4a26 -//.word 0x67d8d711 -//.word 0x31187e2a -//.word 0xfcbbcbe0 -//.word 0x45d7d00a -//.word 0x5f050f33 -//.word 0x745a9a34 -//.word 0xc7997809 -//.word 0x3ba64bdd -//.word 0x193e3067 -//.word 0x0ee6e779 -//.word 0x732134d6 -//.word 0xd1e68445 -//.word 0xa551d4e3 -//.word 0x6099cfbd -//.word 0xb242369e -//.word 0x08948526 -//.word 0x544bd41c -//.word 0x0c90fb05 -//.word 0x7528f9f6 -//.word 0x21ec97a6 -//.word 0xb67948c7 -//.word 0xf2285497 -//.word 0xec4135b2 -//.word 0x9d6b412a -//.word 0x9e678ad9 -//.word 0x33fe03f6 -//.word 0x8938e4e7 -//.word 0x3ccf4f56 -//.word 0x1ce33387 -//.word 0x31ef71e9 -//.word 0xfdfc3deb -//.word 0x0015c710 -//.word 0x82fa1b46 -//.word 0x8c194674 -//.word 0x38b9bb52 -//.word 0x2a79f57d -//.word 0x5ff95dcb -//.word 0x26d76ddb -//.word 0x6bdd16f1 -//.word 0x3b785f01 -//.word 0x856c500a -//.word 0x1ec70ea6 -//.word 0x081347de -//.word 0xf4d0d042 -//.word 0x05228d3a -//.word 0xd7c69297 -//.word 0xc04a876d -//.word 0x567e5125 -//.word 0x3126efce -//.word 0xf2f1a1b4 -//.word 0x83af5034 -//.word 0xa1be2ace -//.word 0x98c58d7c -//.word 0x4ea52642 -//.word 0x83ad5a07 -//.word 0x570ee4a3 -//.word 0x0d8ec039 -//.word 0x0e8048c7 -//.word 0x31f39efb -//.word 0x392a4949 -//.word 0xa04c233a -//.word 0x935d7207 -//.word 0x3d6d5566 -//.word 0x480f62a4 -//.word 0xa10d8df4 -//.word 0x7c5a4b07 -//.word 0x9948f8dc -//.word 0xc5fb76da -//.word 0xa31e181c -//.word 0xacd4be0c -//.word 0x75f24133 -//.word 0x306b114f -//.word 0x760c1ca6 -//.word 0x4469f29b -//.word 0x4317277f -//.word 0x4c1bf9a9 -//.word 0x2ba333c9 -//.word 0xa3f45279 -//.word 0xb3a4e515 -//.word 0x18093acd -//.word 0x13f136f8 -//.word 0x6c9385ab -//.word 0xb7c6f48b -//.word 0xd6711adf -//.word 0xbf433eea -//.word 0x80a47577 -//.word 0x80eb0bb5 -//.word 0x07d12445 -//.word 0x0025a392 -//.word 0xfec24b61 -//.word 0x7ebf24a9 -//.word 0x6ce521a4 -//.word 0xe866ff26 -//.word 0x49cb702e -//.word 0x622f79ba -//.word 0x05ab19e0 -//.word 0xc6112b1b -//.word 0x01dd8de3 -//.word 0x1f688280 -//.word 0x145f551f -//.word 0x2c744026 -//.word 0x08538bc5 -//.word 0xe3d8f8cd -//.word 0x1b7f5fc6 -//.word 0xec1c963c -//.word 0x7ecc9359 -//.word 0x222bd5b9 -//.word 0xd8c70079 -//.word 0x16d5c791 -//.word 0xc4230e64 -//.word 0x8b4e5096 -//.word 0x4f353f1e -//.word 0xfaadab9c -//.word 0x7c77a5ec -//.word 0x106fe4fb -//.word 0xc00568d9 -//.word 0x2bf15c10 -//.word 0x86234135 -//.word 0xe1f949bc -//.word 0xabb50110 -//.word 0x792e33e4 -//.word 0x03c60bc3 -//.word 0x6f9b78ef -//.word 0xd302d568 -//.word 0xf531c94b -//.word 0x553b6c5d -//.word 0x6d42abe8 -//.word 0x37e7edc6 -//.word 0xf006f7bb -//.word 0x1ca10c08 -//.word 0xca19593c -//.word 0x19a4914e -//.word 0xfbfbd5e9 -//.word 0x3953d607 -//.word 0xb78f3dc1 -//.word 0xfab44b65 -//.word 0xe79dbcca -//.word 0xcdf0f2e0 -//.word 0xa6504f8b -//.word 0x9ad4e3b2 -//.word 0xc5b84793 -//.word 0x3a53c859 -//.word 0x4849c8f0 -//.word 0xfc026218 -//.word 0xe65b4db8 -//.word 0x209b0375 -//.word 0x8da82284 -//.word 0x5f7b12bc -//.word 0xdcd1e8f0 -//.word 0x61238a7b -//.word 0xa7d9141c -//.word 0x45bb7b05 -//.word 0x76a8712e -//.word 0x1d8a88ef -//.word 0x068999ce -//.word 0x6f7f6796 -//.word 0xc7ac80a9 -//.word 0xb5ac6496 -//.word 0x5ca5e9ee -//.word 0xdec5de54 -//.word 0x1eecefd4 -//.word 0xcba5c876 -//.word 0x9a5b7e12 -//.word 0xd2ca2a65 -//.word 0x0eb3d765 -//.word 0x3ed49ed2 -//.word 0xf0170f0e -//.word 0xce0ad32e -//.word 0x678f9051 -//.word 0x32d50d30 -//.word 0xcf8697f7 -//.word 0x9142a354 -//.word 0x3a4db4cd -//.word 0x05847f56 -//.word 0xea964d23 -//.word 0x1d70a2bb -//.word 0xd8f91c4e -//.word 0x5a009d48 -//.word 0x3072ad26 -//.word 0xb3d11988 -//.word 0xd2e1e088 -//.word 0x11a5504b -//.word 0xd2896dd5 -//.word 0xd3e19222 -//.word 0xf9925b72 -//.word 0x4c0fc1e4 -//.word 0x42888746 -//.word 0x405ed62c -//.word 0x5ed9243f -//.word 0x6b1d5ad8 -//.word 0x315a35ce -//.word 0xf944ec8c -//.word 0x52c31466 -//.word 0x0febc12d -//.word 0x8f2eef00 -//.word 0x41d02066 -//.word 0x669c469a -//.word 0x19d6e226 -//.word 0x8d706eb3 -//.word 0x9780f920 -//.word 0x6cf211d1 -//.word 0xab7ae54a -//.word 0x9ecdabfc -//.word 0xbd11405e -//.word 0x73920e40 -//.word 0x25b6335d -//.word 0x7133e02f -//.word 0xb37ffe07 -//.word 0xce89185c -//.word 0x29a67563 -//.word 0xf7ce84e1 -//.word 0xbc087e3e -//.word 0x0c2346da -//.word 0x96a794a4 -//.word 0x620b52e8 -//.word 0x57284668 -//.word 0x00eef2af -//.word 0x9056b8a2 -//.word 0x23974258 -//.word 0x469d212b -//.word 0xbab7b40f -//.word 0x75904c23 -//.word 0xea608d86 -//.word 0x8a63186c -//.word 0x8b8b6771 -//.word 0xe872f72d -//.word 0xa992ad08 -//.word 0x64b8734f -//.word 0x04b62288 -//.word 0xc958a403 -//.word 0x909a5ab2 -//.word 0x5518bb3a -//.word 0xf6c63e4a -//.word 0x39e17a2c -//.word 0x11268c9a -//.word 0x1d41bad2 -//.word 0x728856ed -//.word 0x9ae9e46c -//.word 0xdc217f14 -//.word 0xbe2f78fc -//.word 0xc90941e4 -//.word 0x8c8d89c8 -//.word 0xe4baa9b5 -//.word 0x7a203fdc -//.word 0x8c9518e5 -//.word 0xf12a5485 -//.word 0x575ec453 -//.word 0xd09197d7 -//.word 0x8dbb36e4 -//.word 0xe85d6c28 -//.word 0xa8b8ca02 -//.word 0x813e4a93 -//.word 0xdb463218 -//.word 0xd5033b77 -//.word 0x88b7f317 -//.word 0x902460f5 -//.word 0xc943e6f5 -//.word 0x56396a76 -//.word 0xe887b828 -//.word 0x3c812222 -//.word 0xe6016a2f -//.word 0x4e5ce369 -//.word 0xf895d20a -//.word 0x08d11a7e -//.word 0x050b19bd -//.word 0xdd09cdd7 -//.word 0x298f3bd0 -//.word 0xb3d211af -//.word 0x352f8ad2 -//.word 0x641d9284 -//.word 0x2d612bd2 -//.word 0x3f810f9a -//.word 0xc97a96e4 -//.word 0x85b5db75 -//.word 0xf5381aa2 -//.word 0xed1a5d63 -//.word 0x513958a8 -//.word 0x202f91f0 -//.word 0xb181c417 -//.word 0x3d1a856f -//.word 0x9ef82713 -//.word 0x5626dd78 -//.word 0xd3ea1f45 -//.word 0xf23f4f65 -//.word 0xc1859d5a -//.word 0x897828d4 -//.word 0x0c5f6582 -//.word 0x0b85c528 -//.word 0x0bed92f2 -//.word 0x59421a08 -//.word 0x4c0d1062 -//.word 0xca2b2fde -//.word 0x0d7d208f -//.word 0xa7e19e58 -//.word 0xc461d8ba -//.word 0xb0ab17eb -//.word 0x99c1a028 -//.word 0x95f2dc4b -//.word 0xe709b6a0 -//.word 0x7ec445f5 -//.word 0xbe88abf0 -//.word 0x83523da6 -//.word 0x63f1e468 -//.word 0x3473c2e0 -//.word 0xcedd195e -//.word 0x121f696c -//.word 0x2c46d9a8 -//.word 0x14f4d8d3 -//.word 0x5b0d0425 -//.word 0x24b44be3 -//.word 0x71765034 -//.word 0xa0c41031 -//.word 0x35a7c53b -//.word 0xd9af0b91 -//.word 0xa32d4121 -//.word 0x97a1329f -//.word 0x6c76f4d5 -//.word 0x93ed113a -//.word 0x7458e5c5 -//.word 0xfb884703 -//.word 0x53886c68 -//.word 0xf18c07e3 -//.word 0xd524b5b4 -//.word 0x0cb59982 -//.word 0x7a2a43a8 -//.word 0xd6e7d7d1 -//.word 0xf6fe6bc4 -//.word 0x4da6b081 -//.word 0xb2e9d58c -//.word 0x629ca889 -//.word 0x4994ff09 -//.word 0x7d1756a4 -//.word 0x0c91b948 -//.word 0xf788e5d0 -//.word 0x7ed2aad8 -//.word 0x9e0693d0 -//.word 0xd930c950 -//.word 0x35c935ab -//.word 0x87e6e5c7 -//.word 0xf1afb12c -//.word 0xaa131e5a -//.word 0xfdba8260 -//.word 0x953b69aa -//.word 0xf790381b -//.word 0x50c7105c -//.word 0x71f9f573 -//.word 0x18803097 -//.word 0x7165f142 -//.word 0xdc183989 -//.word 0xf164f7a9 -//.word 0xc1a172e2 -//.word 0x5f2ce688 -//.word 0xa0147257 -//.word 0x1e163107 -//.word 0x83cca820 -//.word 0x04216010 -//.word 0x2b08d37a -//.word 0xda6e8dd2 -//.word 0x8d6c8b27 -//.word 0xdfc2e73f -//.word 0x5081b7e9 -//.word 0x4507328f -//.word 0x5030140b -//.word 0xb2cb44bb -//.word 0x1e4bb4d8 -//.word 0xc0bf8903 -//.word 0x7e057d21 -//.word 0x7e3a8169 -//.word 0xe874a6bb -//.word 0xedb43d34 -//.word 0x08163dff -//.word 0x834be66e -//.word 0x3e49a449 -//.word 0xac413666 -//.word 0x1ed20f79 -//.word 0x447cfd2e -//.word 0xf0570875 -//.word 0x1e059d1d -//.word 0x32e5eca5 -//.word 0x80898e4f -//.word 0x116b6b75 -//.word 0xa4dbdb20 -//.word 0xf43c0bd7 -//.word 0x3970a3b5 -//.word 0xf191a5bf -//.word 0xe0e29874 -//.word 0x5605e7a5 -//.word 0xb06e8486 -//.word 0x2117d006 -//.word 0xb375bf5c -//.word 0x88ac37e2 -//.word 0x66ffba27 -//.word 0x738a453f -//.word 0x3c33785e -//.word 0xfcdef6a6 -//.word 0x1ce00f3c -//.word 0xf6b69da1 -//.word 0xdef82b40 -//.word 0x63885d43 -//.word 0xd20f8cab -//.word 0xfcaab0a0 -//.word 0x39e08305 -//.word 0xadd8e350 -//.word 0xcac87899 -//.word 0x16b198f0 -//.word 0x2f4a67f4 -//.word 0x0c3943a2 -//.word 0x85895f6a -//.word 0x1659ad88 -//.word 0xe0d10291 -//.word 0xf05b754c -//.word 0xc40f08c4 -//.word 0x0b6e8a9b -//.word 0xad54bba1 -//.word 0x0b28b2a5 -//.word 0x88567c8c -//.word 0x48ff06a0 -//.word 0x38ef3c2a -//.word 0x4ecf7342 -//.word 0x129b04e6 -//.word 0x5d573a4a -//.word 0x60fe6f6f -//.word 0xe9bc71f7 -//.word 0xe25c2b38 -//.word 0x1a04818f -//.word 0x49207bf6 -//.word 0x4e9ca6d9 -//.word 0xba56b726 -//.word 0x92d372a4 -//.word 0x5131ca85 -//.word 0x2d5c4a3e -//.word 0x9b85b396 -//.word 0x15d0e7fd -//.word 0x1b4d0520 -//.word 0x782ad6ba -//.word 0xc62768ad -//.word 0x3449f851 -//.word 0x87d3150c -//.word 0x5f720323 -//.word 0xbcb85ecf -//.word 0xc0cbff94 -//.word 0xb75f24ce -//.word 0x54e1ca8d -//.word 0x3df55ea2 -//.word 0xcb2395fa -//.word 0x0acd992b -//.word 0x0865654d -//.word 0x4cdd720b -//.word 0xa45e93f9 -//.word 0x243c1d29 -//.word 0x6b2a4cf9 -//.word 0x28aae22e -//.word 0xddc81147 -//.word 0xe3089b0b -//.word 0xaf9d3865 -//.word 0x53db3871 -//.word 0x47ef69d7 -//.word 0x6ace3b58 -//.word 0x446b22a6 -//.word 0x8e2d3c79 -//.word 0xf4a034df -//.word 0x196b66d3 -//.word 0xdc824412 -//.word 0xda9cf82a -//.word 0x33e84bd4 -//.word 0x92fbc583 -//.word 0x670d153d -//.word 0x7766b4aa -//.word 0x9713c66b -//.word 0xb4dd41ac -//.word 0x177c50fd -//.word 0xe707fa5d -//.word 0xf0afff98 -//.word 0xa2ad02d4 -//.word 0x5d79ed66 -//.word 0xec3d92ea -//.word 0x4f898e92 -//.word 0xbd4873be -//.word 0xe9f326cd -//.word 0x85048533 -//.word 0x04ae4dcc -//.word 0xa5cb3b71 -//.word 0xad1672c8 -//.word 0xf39a1d60 -//.word 0xa26a55fd -//.word 0x3b934530 -//.word 0xd94f8c2b -//.word 0xb97be2d4 -//.word 0xf94bff18 -//.word 0xa03db982 -//.word 0xdf4b6c0c -//.word 0x97659e35 -//.word 0x1a1ee353 -//.word 0x36a6ff2b -//.word 0x70f84bbf -//.word 0x8d545a67 -//.word 0x57f0db23 -//.word 0x9debc130 -//.word 0x7c82a2d9 -//.word 0xdd865d90 -//.word 0x3f0d003d -//.word 0xb769e9d6 -//.word 0x34562b30 -//.word 0x08773315 -//.word 0xa404ab96 -//.word 0xa3bd9ea2 -//.word 0x0b22ddd8 -//.word 0xcfe5a29a -//.word 0x98a07463 -//.word 0xc4c44a5a -//.word 0xafd1f327 -//.word 0x32cdb505 -//.word 0x6aef3518 -//.word 0xbb9b9602 -//.word 0x1493e5b1 -//.word 0x746bb57a -//.word 0xad3d066c -//.word 0x689f6cde -//.word 0x69d26d4b -//.word 0x143c2a60 -//.word 0x30184252 -//.word 0xec6df375 -//.word 0x1f3c820b -//.word 0xd4fedd59 -//.word 0x064e8001 -//.word 0xa8e2958b -//.word 0xe9bf5f45 -//.word 0xb5add84d -//.word 0x7fe999ec -//.word 0x3e1bfb25 -//.word 0xb5877c8e -//.word 0xf887645f -//.word 0x2c39a8c9 -//.word 0x8e750e89 -//.word 0xb70292bc -//.word 0x1e0908f5 -//.word 0xdec9048d -//.word 0xb98df73a -//.word 0x5ddb9ae3 -//.word 0xe7ef90b3 -//.word 0xa668476d -//.word 0x21401fff -//.word 0x5b01ce59 -//.word 0x5536037f -//.word 0xd52049dd -//.word 0x66ab2edc -//.word 0xa0a0a5b2 -//.word 0xa91caa7e -//.word 0xfc412494 -//.word 0x692b0f15 -//.word 0x5d26dac4 -//.word 0x641e0e14 -//.word 0xec573186 -//.word 0x4c5eea31 -//.word 0x053f66a2 -//.word 0x47f8f9e7 -//.word 0xb72e09e7 -//.word 0x6f1f28f5 -//.word 0x46d880a4 -//.word 0x52a774dc -//.word 0xacd4842d -//.word 0x738c7164 -//.word 0x141ea25c -//.word 0xc86ac717 -//.word 0x5e95bc0d -//.word 0x3a02b0c4 -//.word 0x9e7e86a1 -//.word 0x28bb7bfe -//.word 0x9c000a7d -//.word 0xe41e0d9b -//.word 0x55a62488 -//.word 0x34595a36 -//.word 0x79e006af -//.word 0xd2bef0ad -//.word 0xeb82b564 -//.word 0xed416da3 -//.word 0x45438a1b -//.word 0xa6fd03fe -//.word 0x513fb3cd -//.word 0x94affc6b -//.word 0x9076af75 -//.word 0x403930d6 -//.word 0xb74bd595 -//.word 0xa92190f2 -//.word 0x2d06ceb2 -//.word 0xc10f9eb7 -//.word 0x8f5216d3 -//.word 0xef53f2de -//.word 0x2cbf7f06 -//.word 0x8b5db867 -//.word 0x8941aedc -//.word 0x65432d14 -//.word 0xdeaf9ce8 -//.word 0x3e3e25eb -//.word 0x97451643 -//.word 0x4d2d87b8 -//.word 0xd4233e0b -//.word 0xbb10cf89 -//.word 0xeacc07df -//.word 0x288f8b30 -//.word 0xe0a8bd65 -//.word 0x2471dfc5 -//.word 0xf2827bc5 -//.word 0xb6250221 -//.word 0x110ab32b -//.word 0xd93cbe63 -//.word 0x6154aa49 -//.word 0xfaedf46f -//.word 0xb957f9d2 -//.word 0x7b90156a -//.word 0x276f0d00 -//.word 0x3323aa40 -//.word 0x6adca70f -//.word 0xecc8ce1f -//.word 0x76415dc0 -//.word 0xe345aef9 -//.word 0xf32617d7 -//.word 0x4c821005 -//.word 0xbe76939d -//.word 0xcb0fc93e -//.word 0x6701e25f -//.word 0xfc9c44e2 -//.word 0xb1fbe9ec -//.word 0xec7f02f5 -//.word 0x157ce11b -//.word 0x9e3115bc -//.word 0x40fed743 -//.word 0x87d1a542 -//.word 0x90e22cc2 -//.word 0x12a06bd7 -//.word 0x9bea1677 -//.word 0x1c83388b -//.word 0xa8c01d47 -//.word 0x79846fb7 -//.word 0x346e9f9b -//.word 0x6d518675 -//.word 0x6ee54de0 -//.word 0x34bc8a23 -//.word 0xbb77ab06 -//.word 0x7c3998e5 -//.word 0x335c9402 -//.word 0xe563641f -//.word 0x2230b44d -//.word 0x8878b6ff -//.word 0x88730c62 -//.word 0x6dd8e8f1 -//.word 0x99087244 -//.word 0x12896a28 -//.word 0x3eb70ef5 -//.word 0xebb63e1c -//.word 0x92abde00 -//.word 0xdd2c7c07 -//.word 0x66f532f0 -//.word 0xc2dcce67 -//.word 0xbe0731d6 -//.word 0xe85cf57f -//.word 0x523953c8 -//.word 0x926543d5 -//.word 0x0d47e45c -//.word 0x76561fb5 -//.word 0x91d18731 -//.word 0x3db084ad -//.word 0xb1dab167 -//.word 0x06988210 -//.word 0xf64a2a22 -//.word 0xe359bc73 -//.word 0x1a6c900b -//.word 0x5adfe832 -//.word 0x9071d3ce -//.word 0xe53c52ec -//.word 0xfaebba9d -//.word 0x72275903 -//.word 0xb2525cab -//.word 0xe478f01d -//.word 0x4282a8b2 -//.word 0x91ad1fa6 -//.word 0xeb3bde6e -//.word 0xc269804c -//.word 0x22a01420 -//.word 0x36efc281 -//.word 0x0eb9b20c -//.word 0x9fab29fc -//.word 0x0cf1f5fc -//.word 0x24aa0c39 -//.word 0x2b9970ba -//.word 0xdd1d55f4 -//.word 0xb0638699 -//.word 0x5ada05b2 -//.word 0x93e7f1ed -//.word 0x1cdbad38 -//.word 0x00223f8e -//.word 0x1abcf611 -//.word 0xd7f2505a -//.word 0x3d411a0d -//.word 0x2c9bd9b0 -//.word 0xe4cf69bd -//.word 0xc845e4f5 -//.word 0x62eec6f8 -//.word 0xa67b4e13 -//.word 0x7bcd2759 -//.word 0x77ad47f5 -//.word 0xeabe18be -//.word 0x1fafd50c -//.word 0xdeb537ca -//.word 0x353952cd -//.word 0x79ceb964 -//.word 0x8765e931 -//.word 0x4fc4e537 -//.word 0x94341d33 -//.word 0xed7a9430 -//.word 0x10094256 -//.word 0x4f76b803 -//.word 0x632c021d -//.word 0x6961d1a6 -//.word 0x2a49da90 -//.word 0x9f8979d3 -//.word 0xb5ee9abe -//.word 0x4d5fd98a -//.word 0x8710e835 -//.word 0x40f9318e -//.word 0xd987bd8c -//.word 0x3a9155e3 -//.word 0x178de7d9 -//.word 0x72042b56 -//.word 0x6243853b -//.word 0x12542ef5 -//.word 0x0c2c8f52 -//.word 0xb826ed93 -//.word 0x1fb04bc2 -//.word 0xf5448c46 -//.word 0xd79bd9b4 -//.word 0xd11d42e8 -//.word 0x239ba855 -//.word 0x4540da99 -//.word 0x28c5fe54 -//.word 0xbfe5333b -//.word 0xbe117468 -//.word 0xa264bff4 -//.word 0xf1d977c8 -//.word 0xc3bc08b0 -//.word 0x815ec9b2 -//.word 0xed0d269d -//.word 0x6243fee4 -//.word 0x5d1e4aad -//.word 0x3d100026 -//.word 0x47d83718 -//.word 0xedb18bbe -//.word 0x50c9c3d7 -//.word 0x03f4b1fa -//.word 0x12a25a2a -//.word 0x430f57aa -//.word 0x9bb97b12 -//.word 0x2417b6a3 -//.word 0xee8839d8 -//.word 0x548adb3d -//.word 0x802cbc84 -//.word 0x32c628d6 -//.word 0xbce7be67 -//.word 0x528fd14d -//.word 0x809e0e92 -//.word 0xfc8d5f88 -//.word 0x9e5c105c -//.word 0xadcb31ee -//.word 0x5ccd3be0 -//.word 0x943af6ee -//.word 0xf4c4997d -//.word 0x172c3376 -//.word 0x15b64b54 -//.word 0x4cdac37c -//.word 0x603c03cd -//.word 0x80de5379 -//.word 0xeb948713 -//.word 0xb3b9e2e9 -//.word 0xc1213593 -//.word 0x1a4e47cc -//.word 0x61e77981 -//.word 0x9c65aa28 -//.word 0x3b105953 -//.word 0x562a0985 -//.word 0x366aea44 -//.word 0x17acb56f -//.word 0x2ce6d8d2 -//.word 0xe45ed3f8 -//.word 0x6c1ae240 -//.word 0x7598dc33 -//.word 0x37c05b15 -//.word 0xb5171dba -//.word 0x4335aa9c -//.word 0x4679372a -//.word 0x3cfbcb62 -//.word 0xfcc2a0a1 -//.word 0x3e38ccba -//.word 0x5dda2046 -//.word 0x5c34513c -//.word 0x280d55c2 -//.word 0x1cdf1042 -//.word 0x80000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00006700 -//// expected output -//.word 0x4cb6d5a4 -//.word 0x382d4ab1 -//.word 0xedbff2c1 -//.word 0xfd938c98 -//.word 0x2fd4270d -//.word 0x33c42baf -//.word 0xdb00496d -//.word 0x860643e5 -//.word 0x54a9039d -//.word 0xc1d8ad1a -//.word 0x6004f558 -//.word 0x74aecd7a -//.word 0x73830123 -//.word 0xdedb3b42 -//.word 0xaa6547d6 -//.word 0xf4179ef1 -//// SHA512LongMsgvector_33 -//// vector length -//.word 0x00006A18 -//// input message -//.word 0x4a96d520 -//.word 0xd8d5a54e -//.word 0xb73f8f55 -//.word 0x8e328d1b -//.word 0x3e5ba360 -//.word 0x161fb844 -//.word 0x4739a40a -//.word 0x97a58a1b -//.word 0x59bd684e -//.word 0x9ca3ec66 -//.word 0xa3de8add -//.word 0x9548cbe0 -//.word 0x7627e89a -//.word 0x569a97b5 -//.word 0xc837251e -//.word 0x96f2c509 -//.word 0xb3402836 -//.word 0x717d4d72 -//.word 0xf48b9b60 -//.word 0xe7bd2d79 -//.word 0x6df36d52 -//.word 0x5b06e41d -//.word 0xa4665073 -//.word 0x1501f751 -//.word 0x42673c60 -//.word 0xc02c7079 -//.word 0x948eea68 -//.word 0xec585af0 -//.word 0x0d075a10 -//.word 0x8d2a4685 -//.word 0xc20f4e90 -//.word 0x7a9bc9f9 -//.word 0xec7acc54 -//.word 0xef79fc83 -//.word 0x6a2fa07c -//.word 0x0ce3fb4d -//.word 0x3daad85d -//.word 0x54d066f4 -//.word 0x0a7946fd -//.word 0x2e88e30b -//.word 0x9bc0029b -//.word 0x68299a99 -//.word 0x5eb6e525 -//.word 0xaf24b796 -//.word 0xe4250fbf -//.word 0x18beeb72 -//.word 0x64ee6143 -//.word 0x9a90ec8e -//.word 0x368204bc -//.word 0x9107f1c1 -//.word 0x586ae0e9 -//.word 0x3de537d5 -//.word 0xecc026c0 -//.word 0x41bd7e08 -//.word 0xb8b4c7e9 -//.word 0x257b8d8b -//.word 0xa508fa3f -//.word 0xd4daaa05 -//.word 0x4095ba53 -//.word 0x1eec2211 -//.word 0x3cc345e8 -//.word 0x3795c7bc -//.word 0xee149f77 -//.word 0x36106d09 -//.word 0xd09a0dad -//.word 0x98696c6d -//.word 0xfe7d9ae8 -//.word 0xba012153 -//.word 0xbc7696be -//.word 0x620e6d98 -//.word 0xee561176 -//.word 0x37183510 -//.word 0x9f80648c -//.word 0x447de000 -//.word 0x7b6aa932 -//.word 0x7aeedca2 -//.word 0x54213eca -//.word 0x2bf019a4 -//.word 0xa0c2476d -//.word 0x8f5c8ca9 -//.word 0xfa012967 -//.word 0x42deadc6 -//.word 0x9da60fb8 -//.word 0xc47afa06 -//.word 0xec0b6894 -//.word 0xf80272e7 -//.word 0xeda066e4 -//.word 0xa6a11bda -//.word 0xc96781c3 -//.word 0xf9547cc7 -//.word 0x4d78f302 -//.word 0x016c2487 -//.word 0x6c7d3aa5 -//.word 0x320d2169 -//.word 0xbb379963 -//.word 0xe4b289ad -//.word 0xf4f8962a -//.word 0xd1a7f50c -//.word 0x74277d99 -//.word 0x9a8d012e -//.word 0xbcbfdc84 -//.word 0x42d9cd32 -//.word 0xf4d00673 -//.word 0xb1567f2a -//.word 0x63fd9023 -//.word 0x329ebf9c -//.word 0xf8fcd704 -//.word 0xf5a53a02 -//.word 0xc51977b9 -//.word 0x8e2e1f4b -//.word 0x7eb3d59b -//.word 0x7554a558 -//.word 0xfebd9737 -//.word 0x8403837f -//.word 0xc33f26cb -//.word 0x7c7c760b -//.word 0x6dd333cd -//.word 0x80d4bfbb -//.word 0x43282f64 -//.word 0x9875a23f -//.word 0xae82d1ec -//.word 0x2f9ce8be -//.word 0xbb389577 -//.word 0x96d95e52 -//.word 0x9d343747 -//.word 0x7f92548a -//.word 0x29773c55 -//.word 0x82811fe7 -//.word 0x599269cd -//.word 0x9b329760 -//.word 0xca2e498f -//.word 0xaa8599de -//.word 0x3e85acaf -//.word 0xf23286c0 -//.word 0x1ae723f6 -//.word 0x9b40c359 -//.word 0xe836855f -//.word 0x318c376d -//.word 0xd76b6d9b -//.word 0x2249d0b8 -//.word 0x360fb98e -//.word 0x437aff66 -//.word 0xfdc10dcf -//.word 0x4c79379c -//.word 0x44b64e2c -//.word 0x577471ee -//.word 0xc9352723 -//.word 0x65ebabe6 -//.word 0x6f17876a -//.word 0xd9336484 -//.word 0xb94e2169 -//.word 0xfbf622b8 -//.word 0x535aebbb -//.word 0x76b0edea -//.word 0x8ad59fb0 -//.word 0xdb33d172 -//.word 0xcfe83ece -//.word 0x1c256020 -//.word 0x38d3884b -//.word 0x127d2db6 -//.word 0xff6a8494 -//.word 0xf7095269 -//.word 0x0193ffc9 -//.word 0xecebeb63 -//.word 0x40c9053f -//.word 0x74179944 -//.word 0x619b69fd -//.word 0xf7d7009d -//.word 0x2f2d4340 -//.word 0x40474973 -//.word 0x16b66cf7 -//.word 0x00d9a0c2 -//.word 0xa9010447 -//.word 0x49d2b7f7 -//.word 0x1ceded08 -//.word 0x14cc4275 -//.word 0xcbec4e46 -//.word 0xbb327911 -//.word 0xb18810c1 -//.word 0x7fc79996 -//.word 0xf1d9646d -//.word 0x031f6342 -//.word 0x51103bf3 -//.word 0xcf239b46 -//.word 0xbaefcd2e -//.word 0xcf918b4a -//.word 0xba4f13af -//.word 0xd17b7ee7 -//.word 0x02994d39 -//.word 0x0ac4452b -//.word 0xe84d7d46 -//.word 0x92a6b519 -//.word 0xe67ee981 -//.word 0xe32e2627 -//.word 0x19549d49 -//.word 0x5ebdf6be -//.word 0xc389e634 -//.word 0xc78904bd -//.word 0xcaecd88a -//.word 0xc41b35f5 -//.word 0x36e1c9c5 -//.word 0x61cff3ae -//.word 0xb7dfd418 -//.word 0x8f57a922 -//.word 0x1cf058e5 -//.word 0xa03848fd -//.word 0xdd357646 -//.word 0xcc4bc6e3 -//.word 0x925f9785 -//.word 0xb03d99e9 -//.word 0x7a37e3a3 -//.word 0xca0f401b -//.word 0xf518cad5 -//.word 0xfe97bbf5 -//.word 0x0a6f7f02 -//.word 0x14fe0eea -//.word 0xe2427846 -//.word 0x3840c1e0 -//.word 0x4ba6f072 -//.word 0x78af63b1 -//.word 0x3647658a -//.word 0x4a7003ac -//.word 0x3ae41b46 -//.word 0x03fbb512 -//.word 0x0ed09692 -//.word 0x619f139a -//.word 0x1372240e -//.word 0x02fdb9ed -//.word 0xc8c6518e -//.word 0xea89c82a -//.word 0x53da709b -//.word 0x010c6463 -//.word 0xff5219f0 -//.word 0x9324361f -//.word 0xb8e4a6fe -//.word 0xcec2ebd6 -//.word 0x91ddb569 -//.word 0x48aab378 -//.word 0x3e9aa988 -//.word 0x76f7c3e6 -//.word 0x9b0f29e9 -//.word 0x3695d377 -//.word 0x24449fca -//.word 0x46c5a074 -//.word 0x7ad3b9a1 -//.word 0xca9d6b9d -//.word 0xe46cec96 -//.word 0xca8579a2 -//.word 0xcb51ec04 -//.word 0xb2bb91ab -//.word 0x3dda36fb -//.word 0xd1d081d0 -//.word 0x6bf287c0 -//.word 0xda2999a1 -//.word 0x2c97614b -//.word 0x667e2f9f -//.word 0x785e8dc9 -//.word 0x6f5e19c1 -//.word 0xeded9418 -//.word 0xd6a936f1 -//.word 0x4d80444e -//.word 0xdf15e58d -//.word 0xfd653232 -//.word 0xb0aa8ce6 -//.word 0x888032c0 -//.word 0xd64612c4 -//.word 0x1ac7e0a9 -//.word 0xbf1966e0 -//.word 0x06c61bd1 -//.word 0x412af668 -//.word 0x411c84d0 -//.word 0x11d1397e -//.word 0xe5fc0472 -//.word 0x4d3a25b9 -//.word 0xaeae4337 -//.word 0xf3e8b9a3 -//.word 0x800c32d3 -//.word 0x6730753a -//.word 0xdf0582af -//.word 0xf2badd6f -//.word 0x751d2a66 -//.word 0x3d04faaa -//.word 0x90ebe549 -//.word 0xdaded944 -//.word 0xa19ab1db -//.word 0xbbef090b -//.word 0xbf685156 -//.word 0xb92e21c2 -//.word 0x222acc24 -//.word 0x0f6a389e -//.word 0xa8c6ed67 -//.word 0xdcc36bca -//.word 0x53b7c172 -//.word 0xa42e5be4 -//.word 0xc98d1c4d -//.word 0xd0f5ad7e -//.word 0xd26a1435 -//.word 0x2935889e -//.word 0xde868319 -//.word 0x615e1a3e -//.word 0x7dac8a1e -//.word 0x8ab713cc -//.word 0xe5bb091d -//.word 0x9dd728ab -//.word 0x6f262820 -//.word 0xf52d91b1 -//.word 0x1a75d1e8 -//.word 0xd1788ba7 -//.word 0x07c2336a -//.word 0xd550d8cc -//.word 0xfb3c404d -//.word 0x8a9c3a52 -//.word 0xe0a7306d -//.word 0xd919fcdf -//.word 0x44d9fc5b -//.word 0x94d9690d -//.word 0xd83ee4db -//.word 0xeec252eb -//.word 0xf356ea65 -//.word 0xfd0b8c7a -//.word 0x0d3255a5 -//.word 0x3fc27030 -//.word 0x44fb2ffb -//.word 0x12495a79 -//.word 0xda6bc7fb -//.word 0x3bd42a31 -//.word 0xb5522fed -//.word 0x60edc62b -//.word 0xde12be4f -//.word 0x8ef196ad -//.word 0x0223904e -//.word 0xb49006f1 -//.word 0xf4900151 -//.word 0x255008a6 -//.word 0x2978366e -//.word 0x1a0a906d -//.word 0x3b8d95f3 -//.word 0x2e6c165d -//.word 0x679947de -//.word 0xe0751780 -//.word 0x0ef4bd65 -//.word 0x15fc9353 -//.word 0x380f2870 -//.word 0x932a9049 -//.word 0x0cedff19 -//.word 0x87fb9749 -//.word 0x59a47d33 -//.word 0xffc2322b -//.word 0x11e021c0 -//.word 0x71a2743f -//.word 0xc8612c79 -//.word 0x331571c6 -//.word 0x3978264a -//.word 0x0168c177 -//.word 0xc18d5ad3 -//.word 0x7a3d01fc -//.word 0xe39c55e9 -//.word 0xa2085372 -//.word 0xc2b46b13 -//.word 0x6292d9ed -//.word 0xaa77320d -//.word 0x047a3df1 -//.word 0x889d0548 -//.word 0xb7af2cfa -//.word 0x6d708268 -//.word 0x11f7d6f5 -//.word 0x0f510dc5 -//.word 0x886b71c5 -//.word 0x48314beb -//.word 0xf8f8b3bf -//.word 0x9419a71a -//.word 0x20df5b2d -//.word 0x97a4d0c6 -//.word 0x2536a8cf -//.word 0x95803917 -//.word 0x0d66e056 -//.word 0xf9f0976b -//.word 0x45abcae7 -//.word 0xcf4c67cf -//.word 0x1c97359e -//.word 0x4a7f668a -//.word 0x458f6f08 -//.word 0x3e881792 -//.word 0x594ccea8 -//.word 0xa6fa4115 -//.word 0x535b2b73 -//.word 0x207d6ef1 -//.word 0x129d6254 -//.word 0x6c4a6d3c -//.word 0xdbc8d4a9 -//.word 0xf1b3d0bd -//.word 0xd4e4e5c4 -//.word 0x38996f71 -//.word 0x8acf7e6a -//.word 0x6ef3e308 -//.word 0x6cba8b57 -//.word 0xe64e0c65 -//.word 0x4eaa7eb9 -//.word 0x96478c21 -//.word 0xe7f8cab1 -//.word 0x95124a08 -//.word 0x53d16ad5 -//.word 0xa3f7ef9a -//.word 0x91b658b0 -//.word 0xa1d06c8c -//.word 0x06fd1640 -//.word 0x148d7244 -//.word 0xf84e2877 -//.word 0xa7b0f961 -//.word 0x142797bb -//.word 0xa6d1ba31 -//.word 0xe9597066 -//.word 0x841bb439 -//.word 0x6b894347 -//.word 0x55cdabb0 -//.word 0x71b0a51f -//.word 0x54baa404 -//.word 0x369aae24 -//.word 0x5fc96b54 -//.word 0xdc6b7c81 -//.word 0x76760df4 -//.word 0xe515aed4 -//.word 0x404f5eed -//.word 0xb8e4e9af -//.word 0x8677757a -//.word 0x22f25719 -//.word 0xb6272b8c -//.word 0xd2b3230a -//.word 0x61289f46 -//.word 0xdc6bfef2 -//.word 0xbd5ab481 -//.word 0x37b29d32 -//.word 0x2430924a -//.word 0x3ff739a0 -//.word 0x9332215f -//.word 0x33fa0e08 -//.word 0x2c7a91b6 -//.word 0xb851dca6 -//.word 0xb437d5f6 -//.word 0x54e469ad -//.word 0x162e23fc -//.word 0xf471fdc4 -//.word 0xde337657 -//.word 0x6708e483 -//.word 0xbfb40ccd -//.word 0xe190f0fa -//.word 0x0d2fe8d4 -//.word 0x7940f42a -//.word 0x44b65119 -//.word 0xab274a8a -//.word 0x7f7251fc -//.word 0xd6a54e84 -//.word 0x021e3711 -//.word 0xbff0e1f5 -//.word 0xb08816a1 -//.word 0x0d90e7b0 -//.word 0x96134328 -//.word 0xcbe2c9fc -//.word 0x5e37dbd5 -//.word 0xe999f411 -//.word 0xddff3b0c -//.word 0xba38589f -//.word 0x868a86e7 -//.word 0x789ae948 -//.word 0xf48b23b1 -//.word 0xbc6a2221 -//.word 0x64ca3b6a -//.word 0x06ab7d35 -//.word 0x38a13f46 -//.word 0x3b32fc01 -//.word 0x757f612d -//.word 0x2127a3f9 -//.word 0x4668163c -//.word 0xe587fc01 -//.word 0x77729a43 -//.word 0x97a592f5 -//.word 0xfb4a6c46 -//.word 0xa8a47622 -//.word 0x66adcefc -//.word 0x72febdcb -//.word 0x74f04652 -//.word 0xb001ffa5 -//.word 0x807920e9 -//.word 0x024dda5b -//.word 0x0e43ea94 -//.word 0x6b576d0b -//.word 0x425df6db -//.word 0xd2e9dec6 -//.word 0x666cdb7a -//.word 0x849fd414 -//.word 0x6825f4e3 -//.word 0xb16cfe6e -//.word 0x59d4e0b8 -//.word 0xea138ac2 -//.word 0xefd80052 -//.word 0xa9aeaef3 -//.word 0x0423fd3d -//.word 0xc92a2356 -//.word 0x15bf3fb9 -//.word 0x0ac9a536 -//.word 0xc444763a -//.word 0x8f9f7551 -//.word 0x576315e9 -//.word 0x6016d759 -//.word 0x375fd222 -//.word 0xe86b9374 -//.word 0x718e28f4 -//.word 0x772e78bc -//.word 0x38ddd6a3 -//.word 0xc1c5d5bf -//.word 0x60495d29 -//.word 0x5de9fe00 -//.word 0xe56685b1 -//.word 0x4727cd75 -//.word 0x63dcd81b -//.word 0x5e611e07 -//.word 0x9be5257b -//.word 0xe74b5215 -//.word 0xf4d0ff99 -//.word 0x09efcef1 -//.word 0xf7823c72 -//.word 0x4f297961 -//.word 0xd2ef77b6 -//.word 0x292b401f -//.word 0xd7a58e48 -//.word 0x6bfa955a -//.word 0xfa4224c2 -//.word 0xccefec33 -//.word 0x56f81fee -//.word 0x68383e41 -//.word 0xa8112c4d -//.word 0x3f54860d -//.word 0xd2653794 -//.word 0xb49a4696 -//.word 0x5ae5f32a -//.word 0x0fb303ce -//.word 0xe81358ac -//.word 0xfb1bc41c -//.word 0xcc871f69 -//.word 0x08a497d8 -//.word 0x766d48e6 -//.word 0x2af30dd2 -//.word 0xfc02955b -//.word 0x3801b9cb -//.word 0x971a0c34 -//.word 0x6e9bb4fa -//.word 0x269c7991 -//.word 0xece31c88 -//.word 0xa904eac7 -//.word 0x35cc9015 -//.word 0xc8e031dd -//.word 0xb1a2b631 -//.word 0x4a54660f -//.word 0x2b80b6e3 -//.word 0x9e97624e -//.word 0x53d8bc26 -//.word 0x557344be -//.word 0x3def7a67 -//.word 0xa6c9f036 -//.word 0xe05ea308 -//.word 0xe90a8bc4 -//.word 0x989271e0 -//.word 0x1cbf0127 -//.word 0xa54c20b9 -//.word 0x61038053 -//.word 0xaa2271d0 -//.word 0x7e03faf0 -//.word 0x2ffc2859 -//.word 0x5b85a6db -//.word 0x1f988ef8 -//.word 0x885e7fa4 -//.word 0x4a07f049 -//.word 0xb5f9c30e -//.word 0xe42e1d59 -//.word 0x38d77692 -//.word 0x0546ec2b -//.word 0x8a0adddd -//.word 0x275cb434 -//.word 0xcaba034d -//.word 0xabd1d3df -//.word 0x39a03878 -//.word 0x53db2809 -//.word 0xbc8d8ca5 -//.word 0xc9029886 -//.word 0x5de45851 -//.word 0x17a48c9a -//.word 0xca1bb6ab -//.word 0x2e727181 -//.word 0xd53f0418 -//.word 0x60f037e9 -//.word 0xf26d66b0 -//.word 0xe5f9d372 -//.word 0xbc5940bf -//.word 0x5939be35 -//.word 0x71cbc045 -//.word 0x3cb1733a -//.word 0x711d5276 -//.word 0x7137f5ff -//.word 0xc2bf293b -//.word 0xc0f346f8 -//.word 0x8fb3bdaf -//.word 0x54e3f10a -//.word 0xa51148a3 -//.word 0x3e57810f -//.word 0xf583481b -//.word 0xf0760755 -//.word 0x15ca00cf -//.word 0xc2b8991f -//.word 0xbe38f6aa -//.word 0x7069cd23 -//.word 0x4f34764e -//.word 0x9a2c420a -//.word 0x49b90e8e -//.word 0x437618f3 -//.word 0xd1d711f3 -//.word 0x530f73f0 -//.word 0x32311437 -//.word 0x1595fc87 -//.word 0x587d73cd -//.word 0xbaf85f32 -//.word 0x5507cd57 -//.word 0xd4ffcedf -//.word 0xe02e842f -//.word 0xdbc17c71 -//.word 0xd1e53edf -//.word 0xab2d233e -//.word 0xa63467a8 -//.word 0x04837f8f -//.word 0x02b5adff -//.word 0x09d9d123 -//.word 0x2817820b -//.word 0xc2975dac -//.word 0x849e9d29 -//.word 0x9afaed51 -//.word 0x23a17a68 -//.word 0xe2954b2a -//.word 0x360ad50d -//.word 0x4ccbcac7 -//.word 0x93da3310 -//.word 0x7056bea9 -//.word 0x34a2599d -//.word 0x4bc4ffc7 -//.word 0xb50bd294 -//.word 0xbbf56b0a -//.word 0xda4f6e09 -//.word 0x049e61d1 -//.word 0x08bebec5 -//.word 0x4ec9466f -//.word 0xc73b99c3 -//.word 0x245304a8 -//.word 0x46bc9ab4 -//.word 0xf66c8637 -//.word 0xd7cd9f7c -//.word 0x981a3d4b -//.word 0x6e0c4bb2 -//.word 0xc2b79e06 -//.word 0x27ae8524 -//.word 0x8e6ea2fc -//.word 0xbdfaf851 -//.word 0xfdc244ba -//.word 0x13c991ed -//.word 0x7207073c -//.word 0xaf0d0460 -//.word 0x35e76e76 -//.word 0x3a464747 -//.word 0xf2df81cc -//.word 0x020e14f2 -//.word 0x37bf4f9a -//.word 0x788e6be4 -//.word 0xf92d66ad -//.word 0xb2060f56 -//.word 0x10225dc7 -//.word 0xea4a04b4 -//.word 0xb66c4a1f -//.word 0xfd40171f -//.word 0x0c2a4cdf -//.word 0xed6356e9 -//.word 0x955403a5 -//.word 0x5f42941c -//.word 0xb9301302 -//.word 0x1d01e7f4 -//.word 0x44dea5fe -//.word 0x96d72960 -//.word 0xe4cde692 -//.word 0x598f7a85 -//.word 0xae43852c -//.word 0x9e08bc3b -//.word 0x9ad9392f -//.word 0xbdb4158e -//.word 0x02fc3970 -//.word 0xb51d713e -//.word 0x276ec3ba -//.word 0xa65bfe3f -//.word 0xacc3954a -//.word 0x579fae3a -//.word 0x19e57754 -//.word 0xb1acb90a -//.word 0x5a90af7d -//.word 0x42581840 -//.word 0x3dd68b5f -//.word 0xbb0f0ba0 -//.word 0xf89cdb08 -//.word 0x725093a1 -//.word 0xa01b747b -//.word 0xe12ef9f1 -//.word 0xb360ae2d -//.word 0x25d145ef -//.word 0x8fcde789 -//.word 0x80f3c82f -//.word 0xf896fe6d -//.word 0xd76393f9 -//.word 0x9644d9ab -//.word 0x3585fdca -//.word 0x7436df89 -//.word 0x46d021d1 -//.word 0x831b7f41 -//.word 0xdd4e5e74 -//.word 0x1578a782 -//.word 0x6f20d5c9 -//.word 0x63284ded -//.word 0x95f8ee1d -//.word 0x07d8ea98 -//.word 0x8d9cd470 -//.word 0x8287fa8e -//.word 0xba6af4f7 -//.word 0xb70c7d4e -//.word 0x20ce8299 -//.word 0x6e8f7948 -//.word 0xe9cef473 -//.word 0xd30e7663 -//.word 0xe37f8554 -//.word 0xf5da0079 -//.word 0xff8db341 -//.word 0x471829d9 -//.word 0xd3b7c1f2 -//.word 0x214104c4 -//.word 0x19503652 -//.word 0x40a22bf0 -//.word 0x2ebf5d03 -//.word 0x42dc3b09 -//.word 0x9400c3d9 -//.word 0x2b65522b -//.word 0x7121bb5a -//.word 0xe3059769 -//.word 0x0dc6dd45 -//.word 0xb65ab349 -//.word 0x58a58307 -//.word 0xd3555046 -//.word 0x610b4b47 -//.word 0xcdbba14d -//.word 0xe055985b -//.word 0x1da5da40 -//.word 0xae7810d1 -//.word 0x9d00b376 -//.word 0x47791fe8 -//.word 0x0e0dea38 -//.word 0x4ff57314 -//.word 0x94e2be46 -//.word 0x0a9b7f7d -//.word 0x35e77450 -//.word 0xe2adf880 -//.word 0x5d5ad67d -//.word 0xe5835b2c -//.word 0x5dccafe8 -//.word 0x440865c7 -//.word 0xe7a1501e -//.word 0xd53a9847 -//.word 0x94940ea1 -//.word 0x92aebdd9 -//.word 0x5e31c168 -//.word 0x180a5d5d -//.word 0x2759475d -//.word 0x298a46e8 -//.word 0x30c1ffdd -//.word 0x2b7c0c41 -//.word 0xa2744f3c -//.word 0xa7c48664 -//.word 0x094c1f3f -//.word 0xca584d02 -//.word 0xd37d5b9f -//.word 0xe7c441ff -//.word 0xd60b758c -//.word 0xf3a703f3 -//.word 0xc74ee028 -//.word 0x07357baa -//.word 0xc4759608 -//.word 0xe2b354a4 -//.word 0xcb0093b7 -//.word 0x64fe7b95 -//.word 0x41445733 -//.word 0x1504a4e6 -//.word 0x6ceb686d -//.word 0x9c49c632 -//.word 0xf872cecd -//.word 0x48649aca -//.word 0x76aa96ac -//.word 0x8a801f31 -//.word 0xd83750d8 -//.word 0x78db18a1 -//.word 0xf7149014 -//.word 0x4c4a8c84 -//.word 0x0e0c7195 -//.word 0xe4b346fc -//.word 0x3c420d86 -//.word 0x4091535c -//.word 0x05ab0685 -//.word 0x067487ac -//.word 0xd28f0024 -//.word 0x017ef829 -//.word 0x6c0b2469 -//.word 0x9ee780c3 -//.word 0x85929f4e -//.word 0x6d7a3f9d -//.word 0x30672141 -//.word 0xa6161890 -//.word 0x63245fa5 -//.word 0xa22f2fa8 -//.word 0x7c379150 -//.word 0x5e4a72a5 -//.word 0xb960f50b -//.word 0xfb840d7c -//.word 0xbf344a15 -//.word 0x400bf3d4 -//.word 0x149d56a0 -//.word 0x17a35c89 -//.word 0xa5586052 -//.word 0x0c22412c -//.word 0x4075b6c5 -//.word 0xd1f4e281 -//.word 0x1bda2907 -//.word 0xbd994100 -//.word 0x4cc18c1b -//.word 0x4822a555 -//.word 0x4e353977 -//.word 0x90b818e0 -//.word 0x83998b84 -//.word 0xd715e935 -//.word 0xac216522 -//.word 0x03092a9d -//.word 0x7257aa21 -//.word 0x1df63293 -//.word 0xe197c2c8 -//.word 0xd2541d48 -//.word 0xe8931c51 -//.word 0xf52e471f -//.word 0xdad1a66b -//.word 0xfba3d532 -//.word 0xf02857b7 -//.word 0x7e662c80 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00006A18 -//// expected output -//.word 0x40180974 -//.word 0x93d3386e -//.word 0x4adafea2 -//.word 0x0ca962c9 -//.word 0x925bd5dd -//.word 0x9c61c1a2 -//.word 0x9198b064 -//.word 0xfdc313b5 -//.word 0x99e9615b -//.word 0xec715f9d -//.word 0x3a2db986 -//.word 0xe64cbac0 -//.word 0x4cb253e8 -//.word 0xec977ea4 -//.word 0x5ca8f1c9 -//.word 0xf802d965 -//// SHA512LongMsgvector_34 -//// vector length -//.word 0x00006D30 -//// input message -//.word 0x825b192f -//.word 0x69fb73b2 -//.word 0x716fb35e -//.word 0x69d9c090 -//.word 0x06a8a242 -//.word 0x2ac7e4e0 -//.word 0x65143c58 -//.word 0xbd146e71 -//.word 0xaae56d5d -//.word 0x6574c391 -//.word 0x62f034d4 -//.word 0x1b7e9e96 -//.word 0x102e2484 -//.word 0x0c2d8b59 -//.word 0xa93de4f7 -//.word 0x16636cb6 -//.word 0x18dfb0fc -//.word 0x4f61f50e -//.word 0xbb7ad625 -//.word 0x7f512fc5 -//.word 0xe4973a4a -//.word 0xa0bdf8c4 -//.word 0x5964d304 -//.word 0x651581f7 -//.word 0xd4322b33 -//.word 0xb02ccfd0 -//.word 0x83f7e379 -//.word 0x1abb3bc2 -//.word 0x89cd2cbc -//.word 0x6fddf2c8 -//.word 0x7b714fa8 -//.word 0x2f9275dc -//.word 0xe4c4262b -//.word 0x0f3c1a80 -//.word 0xc24ea1f7 -//.word 0x76258938 -//.word 0x07b64204 -//.word 0x00f6400d -//.word 0x194ba10b -//.word 0xfe41100c -//.word 0x527fe90b -//.word 0xf4f99dc5 -//.word 0x816759c8 -//.word 0x1af5e2cd -//.word 0x673cc447 -//.word 0xdb71ab3c -//.word 0x3adc1154 -//.word 0x598c1930 -//.word 0x264abbfc -//.word 0xe7cb2248 -//.word 0xc72a5213 -//.word 0x8e950e29 -//.word 0xb046f9b0 -//.word 0x89b4fbfd -//.word 0xe70be6ac -//.word 0xc9da5aef -//.word 0x660ce626 -//.word 0x711a6fb0 -//.word 0x9c7fd601 -//.word 0x5b6bd5f5 -//.word 0xeabb2a64 -//.word 0x9129f8f7 -//.word 0x27c06a3a -//.word 0xd59499f2 -//.word 0x1cafb0b0 -//.word 0x194e4ea6 -//.word 0x084e2bba -//.word 0x08e1ffd9 -//.word 0x1d859f8e -//.word 0x7b3769d3 -//.word 0x02e3e327 -//.word 0x05209fe0 -//.word 0x4f1a62c3 -//.word 0x68cf84d2 -//.word 0x147f9a65 -//.word 0x1d5d537c -//.word 0x528ba054 -//.word 0xd0451838 -//.word 0x805d9a9a -//.word 0xe1e73462 -//.word 0x08354386 -//.word 0xe506dcdb -//.word 0xc7fa6b2b -//.word 0x22499a87 -//.word 0x91b575de -//.word 0x17bdcbcf -//.word 0xaa14d7bc -//.word 0xf2511f20 -//.word 0x4ee89d22 -//.word 0x18591d6a -//.word 0x2aa7e633 -//.word 0xa00c9ca1 -//.word 0xe0eb6555 -//.word 0xd8064b40 -//.word 0x87f1e2b4 -//.word 0xbfc72ac1 -//.word 0x291bb6be -//.word 0x89310e26 -//.word 0x436e53a6 -//.word 0x1f0e2173 -//.word 0x4915b9e1 -//.word 0x9c886032 -//.word 0x1fdc02ab -//.word 0xd0af1bee -//.word 0xa1b6d883 -//.word 0xc1f779b8 -//.word 0x1c38f9ab -//.word 0x25b7f1a5 -//.word 0xd31bbaa9 -//.word 0xe9abd14d -//.word 0x7bbe80c9 -//.word 0xae72bb4e -//.word 0xbfa14999 -//.word 0x471124c7 -//.word 0xbdeb216b -//.word 0x3c6fd3de -//.word 0x86e5add6 -//.word 0x4ad7683a -//.word 0xa27da435 -//.word 0xe079d28a -//.word 0x8ac55127 -//.word 0xa3e9d7fc -//.word 0x2c71130d -//.word 0xeb9e91c6 -//.word 0x6b5cdd8f -//.word 0x4474eba1 -//.word 0x9c03b618 -//.word 0xee2b2849 -//.word 0x0b083a55 -//.word 0x5ee55cff -//.word 0x73b017ba -//.word 0xbbacf106 -//.word 0x896691fd -//.word 0x61ea2329 -//.word 0x7236fe99 -//.word 0x61ef8434 -//.word 0x48534a4d -//.word 0xff6f7a77 -//.word 0x9a92759a -//.word 0x3201bc46 -//.word 0xe9ec1048 -//.word 0x28a1d87b -//.word 0x2b00c4e1 -//.word 0xc02fb0f2 -//.word 0x4b8fcb34 -//.word 0x0eeef80c -//.word 0xa7fe74d4 -//.word 0xda05b92d -//.word 0x91d7a397 -//.word 0x2102d23f -//.word 0xcf484f17 -//.word 0x9352722c -//.word 0x1ca20335 -//.word 0x13ca9f67 -//.word 0xa4db5d91 -//.word 0x3b21b264 -//.word 0x8b0d9212 -//.word 0xd573d81c -//.word 0x67f6e864 -//.word 0x63c0938a -//.word 0xc1763b75 -//.word 0x976a3730 -//.word 0x981378f8 -//.word 0xdbbb6d93 -//.word 0xdf7825e3 -//.word 0xcb5db4ba -//.word 0xfaf1d7f0 -//.word 0xb6e0dbb3 -//.word 0x44f1ba1f -//.word 0x2238880e -//.word 0x8c8d0d32 -//.word 0x443db461 -//.word 0x93ffa42f -//.word 0x8b292cc2 -//.word 0x902364e2 -//.word 0x171c1150 -//.word 0xacfdca59 -//.word 0x3a9b59aa -//.word 0x87316466 -//.word 0xfe0d4d76 -//.word 0xb1895621 -//.word 0x9e3d09dc -//.word 0x3173d763 -//.word 0x0bdbff08 -//.word 0x0281b14b -//.word 0x69fb73ac -//.word 0x91e7c5bd -//.word 0x8f95007b -//.word 0x400084de -//.word 0x8b0312af -//.word 0xe6c9779a -//.word 0x1c866b84 -//.word 0x4d64b81f -//.word 0x36c19fbb -//.word 0xb297775f -//.word 0x813b9718 -//.word 0x494b7691 -//.word 0xdae111e4 -//.word 0xb60d8db0 -//.word 0xd1831e6c -//.word 0x959027fa -//.word 0x2953a37f -//.word 0xf329c373 -//.word 0x5c69d8f4 -//.word 0xd3527460 -//.word 0x1441cc22 -//.word 0xaa2761cc -//.word 0xb23be067 -//.word 0xe3ec4606 -//.word 0xcb1a47a2 -//.word 0x5b85f121 -//.word 0xa6868db8 -//.word 0xe6fdc673 -//.word 0xc08a0d12 -//.word 0xc9003b17 -//.word 0x4816781d -//.word 0x3e605c6b -//.word 0xa37e55c9 -//.word 0xf3944993 -//.word 0xe9fa7c0b -//.word 0x8a34b3f3 -//.word 0x66249a5c -//.word 0x1b7e63b9 -//.word 0x1a7db037 -//.word 0xaed4b351 -//.word 0x3ae8939e -//.word 0xc23c12ee -//.word 0xac2c6e96 -//.word 0xc8df8408 -//.word 0x8f773ba7 -//.word 0xa88a20d9 -//.word 0xb1d64e5d -//.word 0x3b3091df -//.word 0x16becbc9 -//.word 0xd066965d -//.word 0x78862a01 -//.word 0xa7e682d9 -//.word 0xc2ebba9b -//.word 0x790dbc9f -//.word 0x938a1b36 -//.word 0xee5c3f3d -//.word 0xc169c3f2 -//.word 0x25fb1b06 -//.word 0xd46f7af3 -//.word 0x3031f28f -//.word 0x87e8dee1 -//.word 0x95ed7d34 -//.word 0x4a02df6b -//.word 0xce410594 -//.word 0xc35244c0 -//.word 0xcae1ea11 -//.word 0x484f2414 -//.word 0x6aa81f51 -//.word 0x66d66e21 -//.word 0x0414acc0 -//.word 0x5ea562a3 -//.word 0xe3c52a0c -//.word 0xa2e015db -//.word 0xc6024ba7 -//.word 0x5c8ff10d -//.word 0x5d345048 -//.word 0xe81d3302 -//.word 0xcf68906a -//.word 0x55da6b87 -//.word 0x36d1f8cc -//.word 0xe87a00ec -//.word 0x214485f0 -//.word 0x9995a986 -//.word 0x11bbcc9c -//.word 0x9425f52d -//.word 0xfdd3735b -//.word 0xb90bc4bf -//.word 0xce4eb5fd -//.word 0x1c8acb9b -//.word 0xe391e213 -//.word 0x86ca1426 -//.word 0x8f26dc74 -//.word 0xf2567b4a -//.word 0x963c9bbb -//.word 0x119f33f2 -//.word 0xb422aac6 -//.word 0xc7773f8f -//.word 0x15d0a838 -//.word 0xac96f996 -//.word 0xde5ec8f8 -//.word 0x8b198f00 -//.word 0xa38a51b1 -//.word 0xe6fe81c8 -//.word 0xee371f50 -//.word 0x70a92471 -//.word 0xbfe92089 -//.word 0x9162227e -//.word 0x064ad852 -//.word 0xe6d4f7f7 -//.word 0x2aa7dd65 -//.word 0xbf9076eb -//.word 0x86735cc2 -//.word 0x9f8842e8 -//.word 0xe7c3922b -//.word 0xbf945584 -//.word 0x10d154a7 -//.word 0x8cf17cd8 -//.word 0x367a8700 -//.word 0x24bcd900 -//.word 0x83c0a845 -//.word 0xdd7c609d -//.word 0x97484649 -//.word 0xbe965b53 -//.word 0x03dd8322 -//.word 0x03d6e64b -//.word 0xcceb97aa -//.word 0x9ded74b2 -//.word 0xee054d01 -//.word 0xb0ed4837 -//.word 0xd65f8309 -//.word 0x14cefc91 -//.word 0xe755aee8 -//.word 0xd5edfdf7 -//.word 0xf6e2548a -//.word 0xb3880da6 -//.word 0xce2a911d -//.word 0xa343c05f -//.word 0xadf09393 -//.word 0x4ba6ffe7 -//.word 0xc4201d24 -//.word 0x899c8985 -//.word 0xbb4708c9 -//.word 0xedf66d87 -//.word 0x2b16bdc2 -//.word 0x3be691bd -//.word 0x22e4bc10 -//.word 0xeb842efc -//.word 0xa32818fc -//.word 0xa84d519c -//.word 0x2402f98e -//.word 0xd49f5cfb -//.word 0x0eb31817 -//.word 0x023e83f8 -//.word 0x402147a8 -//.word 0x7ad24f79 -//.word 0x8b54e798 -//.word 0xb9671ee5 -//.word 0x37fc6f02 -//.word 0xeeeba1aa -//.word 0x7ee8ec45 -//.word 0x7fb45db9 -//.word 0x0c907c82 -//.word 0x82f72b05 -//.word 0x858cd121 -//.word 0x4452b808 -//.word 0xfe1bb44d -//.word 0xc643063e -//.word 0x839d7f73 -//.word 0x3aaee9a7 -//.word 0x9019a2c7 -//.word 0x8a5b8a49 -//.word 0x98b81fbf -//.word 0xd275e7ac -//.word 0x81480f96 -//.word 0xe10d515c -//.word 0x25ba1bca -//.word 0xbc95ed6b -//.word 0xd3a5029e -//.word 0x1b6634ec -//.word 0xccc11a99 -//.word 0xea3a7379 -//.word 0xc76cc705 -//.word 0xc9b24bae -//.word 0x6d280672 -//.word 0x8cd232ac -//.word 0xdd1ae530 -//.word 0xbc80f097 -//.word 0x298d07d8 -//.word 0x14082319 -//.word 0xd86d25c4 -//.word 0x059bbcdc -//.word 0x62cd8892 -//.word 0x32cb8013 -//.word 0xb76291a5 -//.word 0xf51187f2 -//.word 0xb80531a3 -//.word 0xd848c031 -//.word 0xbc3571f8 -//.word 0x1d2f6c8e -//.word 0x0c92eb52 -//.word 0x37ea9e48 -//.word 0x68634f24 -//.word 0x4e81c2a4 -//.word 0x8011df23 -//.word 0xbf60126c -//.word 0x7baaf3cc -//.word 0x99d5226b -//.word 0x745f75db -//.word 0x229656f2 -//.word 0xf80766d5 -//.word 0x50386756 -//.word 0x899a5880 -//.word 0x50b9e16f -//.word 0x1eb6f266 -//.word 0x02f7a81b -//.word 0xa11d7055 -//.word 0x7b366eb9 -//.word 0x703420e1 -//.word 0x829f3eaf -//.word 0xdc86e5e1 -//.word 0x14bbf5e5 -//.word 0xad40b8ee -//.word 0xe0fcc447 -//.word 0x9bb222e8 -//.word 0xcb34af47 -//.word 0xd7d4c370 -//.word 0x6c1c1158 -//.word 0x80bfce6e -//.word 0x91ce1674 -//.word 0x2e2f8b8d -//.word 0xb94c3f97 -//.word 0x6b08d4ba -//.word 0x98f7e141 -//.word 0x35ce98a9 -//.word 0x9718a6f8 -//.word 0x7d2b5b51 -//.word 0x515b0bc4 -//.word 0xab6db46a -//.word 0x174fe0b2 -//.word 0x1806cdf6 -//.word 0x6de7cc52 -//.word 0x920ae7b5 -//.word 0x8afcc638 -//.word 0xdcb4d4af -//.word 0xdcc89d7e -//.word 0x2be17aaf -//.word 0x816d7141 -//.word 0xaa9357c2 -//.word 0xcf6c3720 -//.word 0xf770f8bc -//.word 0xcd2e39c0 -//.word 0xa44180b3 -//.word 0xb87f944a -//.word 0xb7732781 -//.word 0x800eb8eb -//.word 0x2a99b846 -//.word 0x48eeec53 -//.word 0x6be812e5 -//.word 0xe918c737 -//.word 0xddb9a882 -//.word 0x6fe6b8cf -//.word 0x560b020a -//.word 0x9b9a7f59 -//.word 0x9fff39ac -//.word 0x5fd5b194 -//.word 0xf75a7e58 -//.word 0x65203846 -//.word 0x90069447 -//.word 0x8967d0b6 -//.word 0x10915272 -//.word 0x5a798c32 -//.word 0x11ad2219 -//.word 0x9d894f8b -//.word 0xa2ae853e -//.word 0xc9b05394 -//.word 0xc40f8c28 -//.word 0x8c69a6a6 -//.word 0xeded60e1 -//.word 0x4513a71f -//.word 0x898abbb7 -//.word 0x88728edf -//.word 0x74cc6dbf -//.word 0x9e2fe1ca -//.word 0x81bcd84d -//.word 0x02540048 -//.word 0xf608747e -//.word 0xe5d09ac8 -//.word 0x0d804bae -//.word 0xaaf93538 -//.word 0x759c7e02 -//.word 0x6b05aa8f -//.word 0xcff5bfdf -//.word 0x728fa744 -//.word 0x32c8d571 -//.word 0xc1192cd4 -//.word 0xa8761c26 -//.word 0x8b840e40 -//.word 0xae070230 -//.word 0xb899768c -//.word 0xb7a28a06 -//.word 0x65846341 -//.word 0xaa16cde3 -//.word 0x615424ec -//.word 0x5f557446 -//.word 0xb17ddf9c -//.word 0x26f33f70 -//.word 0x0e550d68 -//.word 0x40ab82e9 -//.word 0x629afbe7 -//.word 0x64dba2fc -//.word 0x4eeb4bb7 -//.word 0x3c039c36 -//.word 0xa64a71f7 -//.word 0xe54a7eeb -//.word 0xf3a037cc -//.word 0x73f8ecb1 -//.word 0xf13939e0 -//.word 0x6afd9de3 -//.word 0x0f4469de -//.word 0x4669dc1f -//.word 0xf2558cf7 -//.word 0xf4f207c8 -//.word 0xf2e2bb60 -//.word 0x56721385 -//.word 0x9ac9e3d1 -//.word 0xc46606c1 -//.word 0x2cc94608 -//.word 0x856f7b29 -//.word 0x1b04f744 -//.word 0x5ad52230 -//.word 0x908462cb -//.word 0xf4ff3e8e -//.word 0xe6b2c265 -//.word 0x78fc25bd -//.word 0x2ee0a9de -//.word 0x02fec37b -//.word 0xabc17c87 -//.word 0x1fd9174b -//.word 0x57ecf4b6 -//.word 0x5288b4f4 -//.word 0x5c5d9e42 -//.word 0x90a94100 -//.word 0x9cf35b07 -//.word 0xc4fcfa3e -//.word 0x2af3e168 -//.word 0x4ce82d40 -//.word 0xce8339c8 -//.word 0x7af6bede -//.word 0x85303f10 -//.word 0x1353a4b1 -//.word 0xfe69252c -//.word 0xd3536999 -//.word 0x1e01ef8e -//.word 0xe8e9ae38 -//.word 0x7db1f8aa -//.word 0x732fa474 -//.word 0xe7946c78 -//.word 0x0ae494f9 -//.word 0xddaacdf5 -//.word 0x38e958b5 -//.word 0x11556ea2 -//.word 0xfbc3e05a -//.word 0xeddffb03 -//.word 0x451daee0 -//.word 0x0cf2ef21 -//.word 0x7c435a00 -//.word 0xbf1e1b09 -//.word 0xfaa80fb9 -//.word 0x8a56264b -//.word 0x8e600ccf -//.word 0xa573087c -//.word 0xf9a72447 -//.word 0x7cb08eb5 -//.word 0x71583eed -//.word 0x2f2dd911 -//.word 0x2176d5ce -//.word 0x126cdf32 -//.word 0xa7a779be -//.word 0x2dd7e8bd -//.word 0x95b44dd4 -//.word 0xbd3812d9 -//.word 0xf20b87e8 -//.word 0xb23fcdb4 -//.word 0xb63df41c -//.word 0x30ff60ff -//.word 0x51807150 -//.word 0x0e71636d -//.word 0x242e72ac -//.word 0x59f04237 -//.word 0x05447f1b -//.word 0xd2bcc09b -//.word 0xc0e4b2ca -//.word 0x6c777259 -//.word 0x91d33aad -//.word 0xcfab4034 -//.word 0xabfcdbfa -//.word 0xd842e877 -//.word 0xb5eb6cac -//.word 0x160c7b6e -//.word 0x47535801 -//.word 0x4e3ddde8 -//.word 0x71881dfc -//.word 0xf8ec49bc -//.word 0x3406d0e4 -//.word 0xc095ca41 -//.word 0x07e897c3 -//.word 0x0697c3d4 -//.word 0x54722de8 -//.word 0x5fb76955 -//.word 0xf8886266 -//.word 0x129b44aa -//.word 0xc6349992 -//.word 0x9b50b23b -//.word 0x05234889 -//.word 0x2bc56375 -//.word 0xed297ba8 -//.word 0x264edd48 -//.word 0x2eb95112 -//.word 0xa422faa9 -//.word 0x6a6e7d2d -//.word 0xf0dd6610 -//.word 0xb685c725 -//.word 0x0cff21fa -//.word 0x1d608868 -//.word 0x2b6a0368 -//.word 0x1c043228 -//.word 0x36e8335f -//.word 0x279cc5dd -//.word 0x48a3ae66 -//.word 0x22f45bc0 -//.word 0x32abc70b -//.word 0xe9ff9e51 -//.word 0xf774a15e -//.word 0xc9514cd2 -//.word 0x5055b674 -//.word 0x05a6bac9 -//.word 0x2a0a54e6 -//.word 0x52594d82 -//.word 0x23331b4f -//.word 0x5bee038b -//.word 0x11d280d1 -//.word 0x3e89e836 -//.word 0x7bd14d91 -//.word 0x0c74a11a -//.word 0x1e7a1e37 -//.word 0x4d9de592 -//.word 0x69fde66f -//.word 0x7a15ff3d -//.word 0x01ee686a -//.word 0x81924e7c -//.word 0x3ec4be5e -//.word 0x45eec5f7 -//.word 0xac5bd601 -//.word 0x1ba66b19 -//.word 0x8c73ef12 -//.word 0x4e5cdc8f -//.word 0x502f21d1 -//.word 0x9c56c6cd -//.word 0x2296d282 -//.word 0xb7fd6d89 -//.word 0x5d1542ee -//.word 0xc55e273e -//.word 0x12fb00e1 -//.word 0xe0ace0aa -//.word 0x85fc72ad -//.word 0x96bc9851 -//.word 0xaeaf51a6 -//.word 0x6a87e0f8 -//.word 0xb8102ba4 -//.word 0x52ac612a -//.word 0x85ffdf84 -//.word 0x37eb55b6 -//.word 0x28bf24a7 -//.word 0x78ab0b2f -//.word 0x6a780371 -//.word 0x6775676b -//.word 0x46b558cb -//.word 0xca776004 -//.word 0x6ce655a2 -//.word 0x5b0381da -//.word 0xc2dfff66 -//.word 0x490d6890 -//.word 0xde57b08c -//.word 0xb5b04a0a -//.word 0x8d6a930c -//.word 0x36a96df5 -//.word 0x50182ae3 -//.word 0x55daad3f -//.word 0xdac4cb93 -//.word 0x11c9f79b -//.word 0x93b51f9e -//.word 0x5c1fd1fe -//.word 0x1798a20f -//.word 0x9d29d025 -//.word 0xb8fd26f1 -//.word 0x2c5a200d -//.word 0xf8d650d5 -//.word 0xd9c70079 -//.word 0x10fb1950 -//.word 0x65a9446f -//.word 0x6ca84e7b -//.word 0x07dfd1bb -//.word 0x2cfd1171 -//.word 0xe86a246b -//.word 0xa47d56d5 -//.word 0xa8efcb51 -//.word 0xdd8f664a -//.word 0xd738ea84 -//.word 0x12005ff8 -//.word 0x7cb3b8e0 -//.word 0x3480b20e -//.word 0x92f1ff81 -//.word 0x6721a43a -//.word 0x8629a04c -//.word 0x83dbce33 -//.word 0xbab30c66 -//.word 0x930a9d30 -//.word 0x058dccbb -//.word 0x59eed26e -//.word 0x31d9fa78 -//.word 0xc82a03ad -//.word 0x7b5dc692 -//.word 0x894519b3 -//.word 0x1701f23d -//.word 0x772dd0c8 -//.word 0xa9555675 -//.word 0x22af3939 -//.word 0xcd095d78 -//.word 0x50003bd6 -//.word 0x9073864a -//.word 0x77370e74 -//.word 0xf50ce430 -//.word 0x44d0bf6b -//.word 0x71f39e35 -//.word 0x182baf18 -//.word 0x6f6970a8 -//.word 0x850b145c -//.word 0xcc53289c -//.word 0xd618761b -//.word 0x5cbb2a67 -//.word 0x845d33bf -//.word 0x634fec24 -//.word 0xc1cafcb2 -//.word 0x1de17b31 -//.word 0xf1b356e8 -//.word 0x38e5f4b1 -//.word 0x2c501953 -//.word 0x54f60b0b -//.word 0xbe3bf46c -//.word 0x8a52886a -//.word 0xa8f5e7b1 -//.word 0xe159c53b -//.word 0x1c61c821 -//.word 0xda1231b1 -//.word 0x0447bfc2 -//.word 0xe6a5d044 -//.word 0x7bd2ca1b -//.word 0xebe2b92e -//.word 0x52123aba -//.word 0xc3b997ed -//.word 0x8d7b33b0 -//.word 0xbcc029c4 -//.word 0xe3643010 -//.word 0x19b1c239 -//.word 0x428a7d74 -//.word 0x90e8c998 -//.word 0x498bbb78 -//.word 0xcae9396f -//.word 0xcc6b5f3c -//.word 0xe6d82210 -//.word 0x531133e6 -//.word 0xf6002613 -//.word 0x9bcbd41e -//.word 0x804dfed1 -//.word 0x14c63390 -//.word 0xfed1f3ea -//.word 0x6197146e -//.word 0x5e4365c0 -//.word 0xdbb692ec -//.word 0x837b47f9 -//.word 0x0efd98c2 -//.word 0xc3f7a101 -//.word 0x3b2d69ad -//.word 0x675a0d86 -//.word 0xd5691aee -//.word 0x2ee73afa -//.word 0x04b913c9 -//.word 0xca0a6c14 -//.word 0x24889107 -//.word 0x62d0f94f -//.word 0x46262775 -//.word 0x0e6ace6a -//.word 0xae473863 -//.word 0x5eaee8e6 -//.word 0x54837f25 -//.word 0xd396dc8c -//.word 0x64d48796 -//.word 0x64bf50e4 -//.word 0xbe1b3390 -//.word 0xfaea7fbf -//.word 0x779b3875 -//.word 0xf47fb9ae -//.word 0x557c9daa -//.word 0xa405e088 -//.word 0x57494216 -//.word 0xd1abece8 -//.word 0x2b7356a7 -//.word 0x33c368ac -//.word 0xb5cce0cd -//.word 0xfa41f377 -//.word 0x8f0c37fe -//.word 0x4741c030 -//.word 0x83508930 -//.word 0xb17e1682 -//.word 0x13965862 -//.word 0xc2dbd15a -//.word 0xf242f913 -//.word 0x77dedf6c -//.word 0x899c13c9 -//.word 0xc430c4ad -//.word 0x724f268c -//.word 0x0d1f16da -//.word 0x00ec0168 -//.word 0xae1c02f0 -//.word 0xb5654aef -//.word 0x743dc5b2 -//.word 0xcb92fbb4 -//.word 0x21bc3427 -//.word 0xacb0dfd1 -//.word 0xec763419 -//.word 0x79dd1962 -//.word 0xff6d4297 -//.word 0x879d9d07 -//.word 0xf846ed74 -//.word 0xdd58b466 -//.word 0x68cc57c5 -//.word 0xb7d97da7 -//.word 0x576bb867 -//.word 0x07d167f7 -//.word 0xbeb5db77 -//.word 0xef52b806 -//.word 0x0be19ed8 -//.word 0x48540988 -//.word 0xa14776b0 -//.word 0x1d34c8b8 -//.word 0x55e6e9eb -//.word 0x3030b4d0 -//.word 0xf2de13b7 -//.word 0x75ec6492 -//.word 0xb5f62206 -//.word 0x93f0c1c2 -//.word 0xd217d910 -//.word 0x662787a9 -//.word 0xeecf11ce -//.word 0x7f62c894 -//.word 0xa3cf3380 -//.word 0xa1d36953 -//.word 0xff6dbf27 -//.word 0x4693a3bb -//.word 0x0523c80c -//.word 0x181c8425 -//.word 0x2a0e7637 -//.word 0x79cf6bec -//.word 0xd97082f9 -//.word 0xfc6f8ff3 -//.word 0xf02ebe63 -//.word 0xe9a4791c -//.word 0x41538bcc -//.word 0xbd7a85d2 -//.word 0x128b604f -//.word 0xa8df6580 -//.word 0x9da94a4b -//.word 0x0d299e17 -//.word 0x912267e1 -//.word 0x058d098c -//.word 0x8f8f6979 -//.word 0xdca95358 -//.word 0xad2f193e -//.word 0x93fb7df7 -//.word 0xf662d19d -//.word 0x5c675d69 -//.word 0xe82f01ca -//.word 0x21b51cb4 -//.word 0xf6bfac3b -//.word 0xfe11b660 -//.word 0x04e0e82b -//.word 0xc2897dfa -//.word 0xed836118 -//.word 0x72928000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00006D30 -//// expected output -//.word 0xc5ad53c4 -//.word 0x5a03b0e1 -//.word 0xc8dc5a70 -//.word 0x031ed1ea -//.word 0x16bd09be -//.word 0x869d4505 -//.word 0xea811ac6 -//.word 0xea8fe988 -//.word 0xd264df3b -//.word 0x698e0811 -//.word 0x3cad1908 -//.word 0xb8710494 -//.word 0xe31f6b94 -//.word 0x275544ea -//.word 0xa8dca047 -//.word 0x147f48ac -//// SHA512LongMsgvector_35 -//// vector length -//.word 0x00007048 -//// input message -//.word 0xdd946aa6 -//.word 0xa6bab6c9 -//.word 0x70090084 -//.word 0xb034ff45 -//.word 0x6f2fa9bc -//.word 0xf040f78c -//.word 0x9359e847 -//.word 0xf9a5c899 -//.word 0x6961b2c3 -//.word 0x72ed544b -//.word 0xd223f2f2 -//.word 0x97e7ade7 -//.word 0x84ff063a -//.word 0xb6269e93 -//.word 0x885b3f24 -//.word 0xb37f20dc -//.word 0xba1f65de -//.word 0x858fe631 -//.word 0x4b3831b9 -//.word 0xb632d266 -//.word 0x4216d2ab -//.word 0xe70d7d32 -//.word 0xf72d68ce -//.word 0x4906b3b1 -//.word 0x97778cdf -//.word 0x25c7f4e2 -//.word 0xa3f0c6bf -//.word 0x553ef52a -//.word 0x711915f6 -//.word 0xc91f1dcf -//.word 0xa9776b2b -//.word 0x0361087e -//.word 0xc9112ead -//.word 0x9bbd07c6 -//.word 0xa2f5b8ee -//.word 0xbc339e9b -//.word 0xd9b3d703 -//.word 0xa58405d4 -//.word 0x67e04e25 -//.word 0x28b9a8ac -//.word 0x19945332 -//.word 0x2f9aa645 -//.word 0x10ec0f2d -//.word 0x32385621 -//.word 0x418a21ba -//.word 0xc264bda7 -//.word 0xf7101ba3 -//.word 0x023519a4 -//.word 0x4ca90355 -//.word 0x28865ac7 -//.word 0xb480d463 -//.word 0x0075a324 -//.word 0x7346fa03 -//.word 0x6ae6ceb2 -//.word 0x21b0da8c -//.word 0xd7fee5cd -//.word 0x2df747fe -//.word 0xd0a8aab4 -//.word 0x57570e7a -//.word 0x6f13100c -//.word 0x35906bc6 -//.word 0xe332bf5b -//.word 0xaf6891ca -//.word 0xf03b938e -//.word 0x83272615 -//.word 0x6d291e74 -//.word 0xc119c559 -//.word 0xc53a2241 -//.word 0x50107beb -//.word 0x7671180c -//.word 0x67df4a44 -//.word 0x9515ac51 -//.word 0x15e0a983 -//.word 0x48303e6f -//.word 0xba6f01e8 -//.word 0x4a11632b -//.word 0x8c6d325a -//.word 0x6bcb622c -//.word 0x13be0ce2 -//.word 0x0eb4b77d -//.word 0xaccbd72e -//.word 0xa9e6930e -//.word 0x0a01cb0f -//.word 0x48c15a32 -//.word 0xb04f98fb -//.word 0x0a672323 -//.word 0x79ace08c -//.word 0xa23f3c7a -//.word 0x108fb8ff -//.word 0xd773a4b7 -//.word 0x78762ab6 -//.word 0x05718fbf -//.word 0x8660b6b6 -//.word 0x9a6ee658 -//.word 0x6252cc2a -//.word 0x9adec4af -//.word 0x09d554de -//.word 0x1cfef9d3 -//.word 0xce7627c5 -//.word 0xca4a8b38 -//.word 0xd4459374 -//.word 0x65073035 -//.word 0x9557dba4 -//.word 0x3ebbd686 -//.word 0x5f45b4b4 -//.word 0xbeaf1bcb -//.word 0xd2abc924 -//.word 0xdf74d507 -//.word 0x63a9371b -//.word 0xb15b8b21 -//.word 0xdc6512e2 -//.word 0xd6fbfa66 -//.word 0xd986df67 -//.word 0x06af9105 -//.word 0x4dba18bc -//.word 0x8c16f592 -//.word 0xfb32ab95 -//.word 0xc7927e84 -//.word 0xfd217bcd -//.word 0xaac9b8b7 -//.word 0x4141dde1 -//.word 0x3c26e3eb -//.word 0x064e1c73 -//.word 0x19597443 -//.word 0x6388f6c8 -//.word 0xefd392c7 -//.word 0xc1351d4b -//.word 0x024b99e2 -//.word 0x5d1db708 -//.word 0xa83c9ae4 -//.word 0xc70dde32 -//.word 0xcd64d981 -//.word 0x6554209e -//.word 0x71464d50 -//.word 0xf0490045 -//.word 0x25a9244d -//.word 0xf6c374c6 -//.word 0x92173d57 -//.word 0x569f65e2 -//.word 0xf260acb3 -//.word 0xc73e32fe -//.word 0x94143a88 -//.word 0x52042da4 -//.word 0x5c0ce261 -//.word 0xd3da1c02 -//.word 0x41e254ae -//.word 0x7cadb969 -//.word 0xce747643 -//.word 0x52ed33cf -//.word 0xa165ded7 -//.word 0xae0fab4e -//.word 0xef9c5986 -//.word 0xbe0bb8a4 -//.word 0xfec36850 -//.word 0x01dfe3b1 -//.word 0xa9c9bd98 -//.word 0xce0a2bfb -//.word 0xe060c3a6 -//.word 0xce11822d -//.word 0x26801325 -//.word 0x7dfe4e93 -//.word 0x11e200a5 -//.word 0xaddceaa0 -//.word 0xcd860c1a -//.word 0x033c2369 -//.word 0x992e705b -//.word 0x78b3bb28 -//.word 0x48e198a4 -//.word 0xd95ae9b9 -//.word 0xc268a415 -//.word 0x484dd620 -//.word 0x81d4e831 -//.word 0xb92c2101 -//.word 0x14f66d60 -//.word 0x759d5d26 -//.word 0x9fe66e6d -//.word 0x9ac88efd -//.word 0x597ddc08 -//.word 0x99d9b018 -//.word 0x0cdbdb45 -//.word 0xb78230ab -//.word 0x98e1431b -//.word 0x8d767011 -//.word 0x71b81fe6 -//.word 0x88ef4747 -//.word 0x1d4831e6 -//.word 0x69297f6f -//.word 0xb7c26cbe -//.word 0xc6e5554f -//.word 0x6f1779f6 -//.word 0x87e7fdd0 -//.word 0x077e3379 -//.word 0x6a781b7f -//.word 0x57f22a17 -//.word 0x80e44b0f -//.word 0xcab22404 -//.word 0xaefd9ad5 -//.word 0xdfbf9757 -//.word 0x2d970a4b -//.word 0xa961308d -//.word 0x0a0a138e -//.word 0x4fa25003 -//.word 0xa6b31cdf -//.word 0x8dd2897f -//.word 0x37730625 -//.word 0x310225a8 -//.word 0x452fa26a -//.word 0x9f89a089 -//.word 0x2e4e355a -//.word 0x4d812913 -//.word 0xa33efbc7 -//.word 0x474b2598 -//.word 0x28efa128 -//.word 0xad07ac50 -//.word 0x9856ca15 -//.word 0x301d0ad7 -//.word 0x9feb8bcc -//.word 0x99b73fad -//.word 0x3e2cefaf -//.word 0x424480b5 -//.word 0x4b1874c4 -//.word 0x9af7b4b7 -//.word 0xeeb58c34 -//.word 0xa545f7de -//.word 0x258a1dcc -//.word 0x7a6b1a3b -//.word 0x4026017f -//.word 0xc4e62040 -//.word 0x669786e2 -//.word 0x42f9c345 -//.word 0x0ff3efaf -//.word 0x462bee06 -//.word 0x87d3f143 -//.word 0x3ac64023 -//.word 0x72d3381f -//.word 0x16588f9f -//.word 0x4213e06b -//.word 0xeb366362 -//.word 0xc2b9fb6e -//.word 0x5bf477b7 -//.word 0x8f6d1117 -//.word 0x1fef3bcf -//.word 0x99dc9c78 -//.word 0x80c3553c -//.word 0xa7358845 -//.word 0xded51b76 -//.word 0xd0afb959 -//.word 0x2ccb1a59 -//.word 0x03018532 -//.word 0x720e93a5 -//.word 0x80e83570 -//.word 0x494ff87d -//.word 0x5da5885a -//.word 0x63ff73e9 -//.word 0x027c3059 -//.word 0x01d66054 -//.word 0xac36537a -//.word 0x7a4dce0f -//.word 0xeea00cf0 -//.word 0xbb2302cc -//.word 0x2b0ae890 -//.word 0xc1dcf423 -//.word 0x1ec96954 -//.word 0x213dd011 -//.word 0x52b585d9 -//.word 0x81d27673 -//.word 0xaaab28e1 -//.word 0x1c68fb90 -//.word 0xda0daed1 -//.word 0x4293258d -//.word 0xec3d6a33 -//.word 0xd529f3f6 -//.word 0xbd262336 -//.word 0xcdc5123b -//.word 0x7db39129 -//.word 0xb5456930 -//.word 0x3255e404 -//.word 0x2c4d8f8d -//.word 0x36813ddf -//.word 0x65c24f6c -//.word 0xb42f3378 -//.word 0xa74f2bce -//.word 0x2f5d50b2 -//.word 0xcee3d616 -//.word 0xfb8b9111 -//.word 0xc831b88c -//.word 0xc23cea3f -//.word 0x192f6edc -//.word 0x017bbf89 -//.word 0x57984894 -//.word 0x88536c62 -//.word 0xaf6ac9a9 -//.word 0xfd56bedf -//.word 0x5e682af3 -//.word 0x5917773a -//.word 0x3899d8ac -//.word 0x6ab0ce50 -//.word 0x25c7f1f5 -//.word 0x503ded23 -//.word 0x9f01cb51 -//.word 0x005f7258 -//.word 0x36196d28 -//.word 0xc3baeeba -//.word 0x0c271346 -//.word 0xb87769b5 -//.word 0x5904af59 -//.word 0x4ec2dcdc -//.word 0xe8d06376 -//.word 0xcb4db563 -//.word 0x976d0795 -//.word 0xc8cc56a6 -//.word 0xdb02a910 -//.word 0xb37797a0 -//.word 0x3a790828 -//.word 0x4b8b4075 -//.word 0xd0001980 -//.word 0x27c98fe8 -//.word 0xcb8c82a0 -//.word 0x30f6b8e5 -//.word 0xee512274 -//.word 0x225960f9 -//.word 0x114b86ca -//.word 0x0f4021d5 -//.word 0xa0b975d8 -//.word 0xdc7b09d0 -//.word 0x189d66b3 -//.word 0xc2df1b61 -//.word 0x8d3d04d8 -//.word 0xcec4cca8 -//.word 0x26a5b1a8 -//.word 0x628887e6 -//.word 0x9f2200e4 -//.word 0xb20a2a01 -//.word 0xc7c83935 -//.word 0x472f8701 -//.word 0x00eed9a6 -//.word 0x8061e496 -//.word 0xc1ad1028 -//.word 0x0c0b7b8f -//.word 0x1764410d -//.word 0x711ffb64 -//.word 0x1f37858e -//.word 0x889005ad -//.word 0x8e8b2845 -//.word 0xfed8afa9 -//.word 0x2a8b2bb3 -//.word 0xd47204b8 -//.word 0x4ea6c0bb -//.word 0xe06182e1 -//.word 0x6a0fd125 -//.word 0x4aa89b4d -//.word 0x803c7a1d -//.word 0x10d035ca -//.word 0xa8688ab2 -//.word 0x83652b49 -//.word 0x8d110657 -//.word 0xc879c961 -//.word 0xee7ba664 -//.word 0x581f54ca -//.word 0x1e2b5696 -//.word 0x80f17fe2 -//.word 0x856cb68b -//.word 0xe18bf72b -//.word 0x1ccd9a47 -//.word 0xf10ed8ca -//.word 0xf5a18bb2 -//.word 0x799e350a -//.word 0xb07d4418 -//.word 0x15e494d7 -//.word 0x07be36a8 -//.word 0xb68d7044 -//.word 0x430104f5 -//.word 0x23c9b506 -//.word 0xc5a90877 -//.word 0x74cd48f6 -//.word 0x7e5dcc0b -//.word 0x96517d93 -//.word 0x7787926f -//.word 0xca129e7d -//.word 0x4ad6cdc7 -//.word 0x26526afb -//.word 0xa6bca51c -//.word 0x12539476 -//.word 0xd0f177d7 -//.word 0xccdf40fc -//.word 0x1dee534a -//.word 0xe5c38abf -//.word 0x78737c27 -//.word 0xc150ff93 -//.word 0xe202eb07 -//.word 0x1bd92173 -//.word 0xed61cce4 -//.word 0x7f37e7fc -//.word 0x401c00a0 -//.word 0xce483bf0 -//.word 0x1700997c -//.word 0xbe6b7ab4 -//.word 0xc0a261a1 -//.word 0x5706f8d3 -//.word 0x1ed6549b -//.word 0x7601797a -//.word 0x293821d8 -//.word 0x4e48b9f9 -//.word 0x6da7ad2e -//.word 0xe34ce548 -//.word 0x87c49052 -//.word 0x8d832080 -//.word 0xab789562 -//.word 0x7be4ff5d -//.word 0x216b3e5c -//.word 0x2d6c0dc3 -//.word 0xc38e3fa5 -//.word 0xf99b4736 -//.word 0x8092fe83 -//.word 0x87f7a160 -//.word 0xdc6e19a2 -//.word 0x5488808f -//.word 0x6edde093 -//.word 0x335b3e35 -//.word 0x60ddd748 -//.word 0xc7ffa966 -//.word 0xf331359a -//.word 0x0b0b845d -//.word 0xf8e168c4 -//.word 0xca9604f7 -//.word 0x58b58ee5 -//.word 0x27bd5436 -//.word 0x8ebdfd81 -//.word 0x172112c0 -//.word 0x27ccbd01 -//.word 0xe267d05e -//.word 0x49f8082e -//.word 0xa5b6947d -//.word 0x291cd1ba -//.word 0xd33c58b0 -//.word 0x93563ab8 -//.word 0xafa98a2c -//.word 0x66891c1e -//.word 0xd4b28d4a -//.word 0x15dc834a -//.word 0xad8f3609 -//.word 0x2739307a -//.word 0xfd7e518a -//.word 0xb8cf1553 -//.word 0x583e1a92 -//.word 0xf690dc5b -//.word 0xa894c30b -//.word 0xa5b4617f -//.word 0xaacaf483 -//.word 0x9c35338d -//.word 0x6e2b47ac -//.word 0x455017bb -//.word 0xda88c8da -//.word 0x200a841f -//.word 0x28b77b88 -//.word 0x41a92834 -//.word 0x630ed6d3 -//.word 0xce37625c -//.word 0xeeec42fe -//.word 0x8203c658 -//.word 0xfd319eec -//.word 0x2c1f9dd1 -//.word 0x1ac0bda9 -//.word 0x31e362d3 -//.word 0xa104e3e2 -//.word 0x0668464d -//.word 0x45694b67 -//.word 0xb60ead92 -//.word 0x89dea4b0 -//.word 0x62f6aedb -//.word 0x475a8f56 -//.word 0xbc8996c3 -//.word 0x2c542396 -//.word 0x8bef66c9 -//.word 0x3a4969d2 -//.word 0x2b9951d2 -//.word 0x4539e10f -//.word 0x0ab83fa4 -//.word 0x772bfb77 -//.word 0x2bc34d6c -//.word 0xcca59ed8 -//.word 0xa7f54a39 -//.word 0x9634a524 -//.word 0x27cd3c7e -//.word 0xfaea5def -//.word 0x6b8cd994 -//.word 0x71db08f4 -//.word 0xc6bb0e36 -//.word 0x499f5d91 -//.word 0xa0a27b03 -//.word 0x21d40646 -//.word 0xf3d1f500 -//.word 0x7099203a -//.word 0xce9b0313 -//.word 0xff13beb5 -//.word 0xd5966189 -//.word 0x6aeb67a7 -//.word 0xbf1d8091 -//.word 0xa3ce9420 -//.word 0xd7ce04be -//.word 0x6fed33d6 -//.word 0x7b0d4589 -//.word 0xe77b26a3 -//.word 0xa07fcecd -//.word 0xf831c404 -//.word 0x4c8fe149 -//.word 0xe4cd579a -//.word 0x1aecf222 -//.word 0xbf8e9dad -//.word 0xba09275e -//.word 0xf2ba47a4 -//.word 0x6f9cde6a -//.word 0xbc187d8e -//.word 0x8f1f2795 -//.word 0xab77589d -//.word 0x06524592 -//.word 0x272566a5 -//.word 0xd3b732fa -//.word 0xe8792aa1 -//.word 0x891518c8 -//.word 0x7b49992f -//.word 0xcff6d9dc -//.word 0xc2749e0f -//.word 0xe1298878 -//.word 0x715a97a8 -//.word 0x0d40edc6 -//.word 0x915fd583 -//.word 0x3713054f -//.word 0x006c20ce -//.word 0x563b7f85 -//.word 0xef6d31da -//.word 0xf498403b -//.word 0x63d4369d -//.word 0xb2cce028 -//.word 0xb5155230 -//.word 0xc1be2b68 -//.word 0x12281b52 -//.word 0x6a17a2fa -//.word 0xfb0a1ae4 -//.word 0x87c8f743 -//.word 0xc63c4e6b -//.word 0x08829489 -//.word 0x1b42a992 -//.word 0x6f3d1479 -//.word 0x782591a5 -//.word 0x54b2c9a2 -//.word 0xaef26017 -//.word 0xe2e134f8 -//.word 0x6139e4fc -//.word 0x588b9052 -//.word 0x8c8fe090 -//.word 0x88b948ec -//.word 0xfb0c8aae -//.word 0x5c337ce5 -//.word 0xcfce0b59 -//.word 0x4c0a80c2 -//.word 0xfe740237 -//.word 0xe90f5ce9 -//.word 0xd0a30111 -//.word 0x56594d27 -//.word 0x63850e55 -//.word 0xc9c3432b -//.word 0x28452494 -//.word 0x0f6b6209 -//.word 0x6394af04 -//.word 0x053581b8 -//.word 0xaf2813ff -//.word 0x1f46ad94 -//.word 0x78372682 -//.word 0xe589a7dc -//.word 0x7f00b1af -//.word 0x712d6235 -//.word 0x5942f44b -//.word 0xf2258625 -//.word 0xf1c31f41 -//.word 0x2ca7f099 -//.word 0x01cbd91d -//.word 0xf6ae2f60 -//.word 0x9da6bd92 -//.word 0xbb7808ae -//.word 0xa826d8f4 -//.word 0xf908f39a -//.word 0x5d1e2cbf -//.word 0xc5a59ca0 -//.word 0xc8e8300e -//.word 0x45596420 -//.word 0x4ae04d25 -//.word 0x3473dddc -//.word 0x18e763e8 -//.word 0x6206517e -//.word 0xbce14261 -//.word 0x32683b10 -//.word 0x9337313d -//.word 0x1ab3cc82 -//.word 0x4d566b50 -//.word 0x26476828 -//.word 0x712e9d0d -//.word 0x75462739 -//.word 0xd6b4690f -//.word 0xba175451 -//.word 0x2b60e693 -//.word 0xbde4f1ef -//.word 0x70af1efb -//.word 0xd71b31f8 -//.word 0x7aa28f4c -//.word 0x7af1fd33 -//.word 0x733daab1 -//.word 0xa6da70cb -//.word 0x580a57f6 -//.word 0x75135bd0 -//.word 0x79946f0e -//.word 0x9018c1b5 -//.word 0xfcec408e -//.word 0xb82e5cd3 -//.word 0x5b270c2f -//.word 0x3edb16e6 -//.word 0xe1dd8b4f -//.word 0x8b68908b -//.word 0x31ac6471 -//.word 0x99669fc8 -//.word 0xc0b3b8b9 -//.word 0x7826ca83 -//.word 0x55189871 -//.word 0xca3fce0a -//.word 0x90838a87 -//.word 0x470c1a8a -//.word 0x60a0080c -//.word 0x3a2c5397 -//.word 0x8ba000b6 -//.word 0x0200d1ab -//.word 0x2bb8555f -//.word 0x9231219f -//.word 0x2ba15c84 -//.word 0xf1278133 -//.word 0xce1760c7 -//.word 0xbb93668c -//.word 0x285b1f6e -//.word 0x9ee5f9b1 -//.word 0xa3b14be2 -//.word 0xded7950d -//.word 0x7be20a30 -//.word 0xd1e04bf0 -//.word 0x42ba768b -//.word 0x63c25f0e -//.word 0x5d8b1dc8 -//.word 0x94fdc9fe -//.word 0x86a882e0 -//.word 0xf559b4bc -//.word 0x48eb9a72 -//.word 0x2f600228 -//.word 0x8631513e -//.word 0x7ce1c684 -//.word 0xf4d803ab -//.word 0x2b6fc9fa -//.word 0x9b480342 -//.word 0x20e00614 -//.word 0x5a671731 -//.word 0x52cf2d42 -//.word 0x6023f9ca -//.word 0x4c1a2458 -//.word 0xb3ecd801 -//.word 0xac64810d -//.word 0xac36d5f1 -//.word 0xa794127e -//.word 0x78fc8657 -//.word 0x835455a8 -//.word 0x99387715 -//.word 0x1c9300f1 -//.word 0x636ca4b1 -//.word 0x5f037aa0 -//.word 0x7f1d00d4 -//.word 0xd29c6060 -//.word 0x6c52f1cb -//.word 0x0a1701c1 -//.word 0xf919d209 -//.word 0x3374e2b7 -//.word 0xcc036fa3 -//.word 0x8c753b19 -//.word 0xdea38dd2 -//.word 0xe8207823 -//.word 0xfc125f75 -//.word 0x2f41b9f5 -//.word 0x476e128d -//.word 0xdbe65212 -//.word 0xb55742bf -//.word 0x7be14ce2 -//.word 0x8f7083d5 -//.word 0x334ae330 -//.word 0xf1e4d93d -//.word 0x3afa06ac -//.word 0x4dde4088 -//.word 0x5a11d96a -//.word 0xe71024ed -//.word 0x74703661 -//.word 0x5a2deac4 -//.word 0xf94028ee -//.word 0x126f660b -//.word 0x72696e4e -//.word 0xd11262e4 -//.word 0xf91cfe27 -//.word 0x2bd71e15 -//.word 0xbe4a8000 -//.word 0x0982ca86 -//.word 0x832acfc4 -//.word 0x295c0ec7 -//.word 0x20b77b43 -//.word 0x9cb28388 -//.word 0x002f4ab1 -//.word 0x4754371f -//.word 0xa296b226 -//.word 0x62162c05 -//.word 0x1931601c -//.word 0xfc52d959 -//.word 0x8c0bb5f4 -//.word 0x7665a85c -//.word 0xb7744471 -//.word 0x032e77f3 -//.word 0x687d553a -//.word 0x2f921728 -//.word 0x037d645d -//.word 0x55fad0a9 -//.word 0xfe8ea3c7 -//.word 0x26d3db48 -//.word 0x651074cd -//.word 0x290de679 -//.word 0x5826f0a6 -//.word 0x369d94d7 -//.word 0x883563ee -//.word 0xfafcfaa0 -//.word 0xbe68cd25 -//.word 0x76a52334 -//.word 0x542e622e -//.word 0x7f9b8d9a -//.word 0xb9b90bd1 -//.word 0x40e0aafa -//.word 0xf181e339 -//.word 0xb3ff6024 -//.word 0x13c0bb77 -//.word 0x2c838908 -//.word 0xcaf497fd -//.word 0xcf7d733c -//.word 0xd5602e23 -//.word 0x1403617a -//.word 0x868a6ea5 -//.word 0x4aab081e -//.word 0x47bef623 -//.word 0x111413ac -//.word 0x108a9aa0 -//.word 0xdf5ea048 -//.word 0xf241e204 -//.word 0x7cadc13d -//.word 0x8f788b9a -//.word 0x85aafc77 -//.word 0xa08c0593 -//.word 0xed01cb08 -//.word 0x6e19f381 -//.word 0x77e41da7 -//.word 0x5984aedc -//.word 0x3e86d32c -//.word 0x5473c380 -//.word 0x2ea14415 -//.word 0x674f702d -//.word 0x88f1b905 -//.word 0x2bc92b06 -//.word 0x61b7f13f -//.word 0x52521b13 -//.word 0x23379e2f -//.word 0x1da29cc0 -//.word 0x0b3be6e2 -//.word 0xe332c05b -//.word 0xa98de489 -//.word 0x91c1c999 -//.word 0x648024fa -//.word 0x24d3b011 -//.word 0xf3682a2f -//.word 0x312da0c0 -//.word 0xe51eecc5 -//.word 0x5e5a7c84 -//.word 0x1a7d547d -//.word 0xe62a55a1 -//.word 0x47e7bfbf -//.word 0x192ef53f -//.word 0x76c08012 -//.word 0xd93d57e9 -//.word 0x83f25da5 -//.word 0x1ef22c0f -//.word 0xa16811ca -//.word 0x732b5786 -//.word 0xd393c975 -//.word 0x778c7203 -//.word 0x73e8a7c2 -//.word 0x5dfa48a3 -//.word 0xaf60426c -//.word 0x6c205866 -//.word 0x07f72456 -//.word 0x80ed58af -//.word 0xd02d4a06 -//.word 0x8714b0c6 -//.word 0xb488a725 -//.word 0x058bfb57 -//.word 0x2f0fa201 -//.word 0x900c89f0 -//.word 0x13d1940b -//.word 0x5598e086 -//.word 0x065c4b59 -//.word 0x91ef36f1 -//.word 0xff478925 -//.word 0x1818f86b -//.word 0xcca9854c -//.word 0xd2e04615 -//.word 0x8f9e69d0 -//.word 0x39537572 -//.word 0x3cc9d256 -//.word 0xdd448cea -//.word 0x1dcd54a9 -//.word 0xe0cbc849 -//.word 0x4ed3f435 -//.word 0x7ac1183d -//.word 0x4108ab8c -//.word 0x7646a1db -//.word 0x3c1ceae5 -//.word 0xb23c3b1b -//.word 0xd6c31098 -//.word 0xa3caf257 -//.word 0x7d37f5a4 -//.word 0xcfd986d0 -//.word 0xf3b56329 -//.word 0x529aeb29 -//.word 0xccfc98ee -//.word 0x5affcaea -//.word 0xf1d1c6dc -//.word 0xaa3dfeff -//.word 0x217d9381 -//.word 0x1a501836 -//.word 0x6b4d998e -//.word 0x1677dbc5 -//.word 0xb511e659 -//.word 0x1bb4c1c1 -//.word 0x389e7d5c -//.word 0x3d4d74a8 -//.word 0x014dd3b4 -//.word 0xa34e56d8 -//.word 0x727953a3 -//.word 0x0904fa15 -//.word 0xbe04db0e -//.word 0x3e83a907 -//.word 0x71d33d00 -//.word 0xa421ddb9 -//.word 0xe64dbf25 -//.word 0xb2fac91c -//.word 0xcfe19b50 -//.word 0x756acf82 -//.word 0xb17d7ff6 -//.word 0x0a950824 -//.word 0x65170eb0 -//.word 0x26e3c19c -//.word 0x98285ebd -//.word 0x8f7cf86b -//.word 0x4c2c787d -//.word 0xa0d0e375 -//.word 0x5523dbf7 -//.word 0xc9126980 -//.word 0xdc13f954 -//.word 0x0cb8a6b8 -//.word 0xdf84b862 -//.word 0x82fd6b2e -//.word 0xaf02f312 -//.word 0xd35fbc54 -//.word 0x719ff6fa -//.word 0xc1225183 -//.word 0x9e6f05d4 -//.word 0x9fca1675 -//.word 0x830ad6fd -//.word 0xd2a5abcb -//.word 0xc10d12f7 -//.word 0x563fe488 -//.word 0xce98d9e8 -//.word 0x3ceb4a95 -//.word 0x72d23b18 -//.word 0x2441983b -//.word 0x4b61bf77 -//.word 0xc89b3fac -//.word 0x4af2df15 -//.word 0x7197e37a -//.word 0x34b78aa7 -//.word 0x8098db1e -//.word 0x21e4a109 -//.word 0xe645b572 -//.word 0x00317bb6 -//.word 0xac08af37 -//.word 0x125c6252 -//.word 0x6c8f3f91 -//.word 0x6aa41321 -//.word 0xd54f8d86 -//.word 0x744e428d -//.word 0x2cfcf382 -//.word 0x6a2413a4 -//.word 0xc61384d6 -//.word 0xe0800000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00007048 -//// expected output -//.word 0x858deb41 -//.word 0xf50d96ce -//.word 0xc9a0850e -//.word 0xd70b0d96 -//.word 0x207e6d5d -//.word 0x8b3641fd -//.word 0x09af5084 -//.word 0xd65a7c7b -//.word 0x71fbb6fe -//.word 0x04876ac7 -//.word 0x28750a54 -//.word 0x3ee31e94 -//.word 0xe388d42c -//.word 0xa5aa2197 -//.word 0xfb006379 -//.word 0xdc67b423 -//// SHA512LongMsgvector_36 -//// vector length -//.word 0x00007360 -//// input message -//.word 0x2522cf92 -//.word 0xda7d8f15 -//.word 0x3dca86dd -//.word 0x249aca30 -//.word 0x0b85697a -//.word 0xfe796441 -//.word 0xba51fb5b -//.word 0x0fa92b5f -//.word 0x88f17659 -//.word 0x4ec1e2c2 -//.word 0x4a6c44af -//.word 0x8ad8be48 -//.word 0xe68d877c -//.word 0xe30beaf3 -//.word 0xd7619244 -//.word 0x4efb0469 -//.word 0xadbc6d70 -//.word 0x154d9e72 -//.word 0x8ab455c9 -//.word 0x5528be7e -//.word 0xa6233901 -//.word 0x7eba5e1d -//.word 0xcc2a3e2a -//.word 0xd7b3ec85 -//.word 0xdba93d3d -//.word 0xf7c8cb0f -//.word 0x46c84095 -//.word 0x4d31d1ba -//.word 0x95710871 -//.word 0x982bc7a7 -//.word 0xe2d38a75 -//.word 0x7078ec9b -//.word 0x5ce06d2a -//.word 0xbcda7280 -//.word 0xc7d08d79 -//.word 0x399cffe4 -//.word 0xf99c7b34 -//.word 0xf9092d78 -//.word 0x5e84fb8e -//.word 0xe2f20b93 -//.word 0x768a859d -//.word 0x2b2c9aad -//.word 0x52f5c5df -//.word 0xe21050e4 -//.word 0x1bcf1bb2 -//.word 0x69fa997a -//.word 0x8b671bdb -//.word 0xf4ca5155 -//.word 0x72cf0d00 -//.word 0x0d664b7e -//.word 0x325e6f2e -//.word 0x1136cda2 -//.word 0x43306e54 -//.word 0xb0a61194 -//.word 0xb0a171c5 -//.word 0x70a8c6c9 -//.word 0x98d68eba -//.word 0x2a308ddb -//.word 0xad3513ce -//.word 0x8cb67d07 -//.word 0xb9e7fe80 -//.word 0x95b7a0ae -//.word 0x145d85b5 -//.word 0x1c3373d8 -//.word 0x2fc89033 -//.word 0x4a3069ac -//.word 0x0d9f3927 -//.word 0x1b3769f9 -//.word 0xc41d539f -//.word 0xe2d24bb1 -//.word 0x00c1e011 -//.word 0xc2145f68 -//.word 0x81cc99d3 -//.word 0x3511e6d9 -//.word 0x98c66aa1 -//.word 0x88619761 -//.word 0xadfaf31a -//.word 0x5da11c83 -//.word 0xbcf50942 -//.word 0x28f39262 -//.word 0xd40b3302 -//.word 0xb2790d4a -//.word 0x97d22da4 -//.word 0x9add1128 -//.word 0xbda56857 -//.word 0xcfcc1a0d -//.word 0x902288b1 -//.word 0x177615af -//.word 0x71ade528 -//.word 0x8b11e5e8 -//.word 0x51eb0b98 -//.word 0x1853df34 -//.word 0x39473ac0 -//.word 0xfffb4d37 -//.word 0xc470e6c5 -//.word 0x5648ef35 -//.word 0xa0d937ad -//.word 0x86807699 -//.word 0x10378be5 -//.word 0xcb6a076f -//.word 0x6c07efbc -//.word 0xb7d5beea -//.word 0x9f06aae5 -//.word 0xaf0f28de -//.word 0xa8b7b2f9 -//.word 0x6c6ec846 -//.word 0x1ae135f3 -//.word 0x7bcb93c0 -//.word 0x9d0e11b2 -//.word 0xbd02740c -//.word 0x6a0d5c7b -//.word 0xe874c991 -//.word 0xd370dd74 -//.word 0x0485e4d8 -//.word 0xb90f912a -//.word 0xef1e8a0e -//.word 0x1383280c -//.word 0xda2b7786 -//.word 0x6eac85ee -//.word 0xca1ed936 -//.word 0x672c4187 -//.word 0x186ad135 -//.word 0x32ea28f3 -//.word 0xf10af543 -//.word 0x178fba31 -//.word 0xd6f8d041 -//.word 0xf00caca6 -//.word 0x1db660b4 -//.word 0xad126498 -//.word 0x6ec89747 -//.word 0xd09981b4 -//.word 0x4737db46 -//.word 0xf15a5189 -//.word 0x79108624 -//.word 0x3b54590b -//.word 0xa9e367f5 -//.word 0xed4bd011 -//.word 0xd0453ff4 -//.word 0xda4424d6 -//.word 0xba4e44ff -//.word 0xe90b747c -//.word 0x8b1ca116 -//.word 0x96ad1485 -//.word 0x354ef4e0 -//.word 0x6ffe0d58 -//.word 0x0489cf26 -//.word 0x97159ac2 -//.word 0x12f73956 -//.word 0x47cbac72 -//.word 0xd3c32a01 -//.word 0x483f667c -//.word 0x8b9e125d -//.word 0x7a54a1d7 -//.word 0xd23d52c4 -//.word 0x50326adf -//.word 0x17d9c033 -//.word 0x52c17fd3 -//.word 0x1aae28cc -//.word 0x9a31d658 -//.word 0x717cc654 -//.word 0x577516f4 -//.word 0x0409cdb6 -//.word 0x4ec31c94 -//.word 0x919de47e -//.word 0x53167707 -//.word 0x2884a35f -//.word 0xd4aced81 -//.word 0xb0901aad -//.word 0x4f88f419 -//.word 0x60944ae4 -//.word 0xd6f1394b -//.word 0x47eaaa1f -//.word 0x92f11c76 -//.word 0xc5eea4a2 -//.word 0x3ed7315f -//.word 0x10811550 -//.word 0xa8b6c1ad -//.word 0xb087d036 -//.word 0x33e3486b -//.word 0x02691cfe -//.word 0x577bf589 -//.word 0xb994317d -//.word 0x1fdb2c5a -//.word 0x58f8bf26 -//.word 0xaa260718 -//.word 0xba896894 -//.word 0xabc3d15c -//.word 0x8ac24104 -//.word 0xeadb8aa6 -//.word 0xcb1d55d8 -//.word 0xc1df66db -//.word 0x529c2115 -//.word 0x9f014dc1 -//.word 0x474319e6 -//.word 0x88b65c85 -//.word 0xa79c2117 -//.word 0x923a6337 -//.word 0xc532159b -//.word 0x6a0c6648 -//.word 0xc4164206 -//.word 0xcd6e1c12 -//.word 0x1e5deb14 -//.word 0x10e67250 -//.word 0x219fc520 -//.word 0x99c009a2 -//.word 0x6d7a7bae -//.word 0x638ab40b -//.word 0x770d2be2 -//.word 0x7d96fb72 -//.word 0x097ee606 -//.word 0x8c7b9a24 -//.word 0xbf743408 -//.word 0x45940351 -//.word 0x8c9e8ef9 -//.word 0xf480d88a -//.word 0x332ae28f -//.word 0xf8a07249 -//.word 0xce4e13a4 -//.word 0x439d5d69 -//.word 0x4ac376b5 -//.word 0xdfdfd9aa -//.word 0xe9455664 -//.word 0x64165a2f -//.word 0xbf1571f7 -//.word 0x83b50900 -//.word 0x367779d7 -//.word 0x7f724288 -//.word 0x8b339411 -//.word 0xaec81417 -//.word 0x4e18dcd8 -//.word 0xfd76c361 -//.word 0xe575df00 -//.word 0x69fd49fd -//.word 0x099e2085 -//.word 0x8625d1e7 -//.word 0x476d9503 -//.word 0xfc783bfe -//.word 0x81be273b -//.word 0x05c59b87 -//.word 0x6bf23594 -//.word 0xf09fb9a9 -//.word 0x0f6e1197 -//.word 0xa2dc92ef -//.word 0x49198172 -//.word 0x0f17d6c9 -//.word 0x4be03f77 -//.word 0xc52e680b -//.word 0x1a357a9a -//.word 0x62c4e26c -//.word 0x0f8c53f6 -//.word 0x18bf0e08 -//.word 0x58de6148 -//.word 0x31cc6ddf -//.word 0x74262d72 -//.word 0x85d7b454 -//.word 0xbae6b6fa -//.word 0x05934aaf -//.word 0xd3a3ee88 -//.word 0x33f8cc9b -//.word 0x3b643c6c -//.word 0xa7bf89a8 -//.word 0xc437f816 -//.word 0x8de806ca -//.word 0x13adf29c -//.word 0x22357bd8 -//.word 0x2159eb37 -//.word 0x3aac540e -//.word 0xbb541ac6 -//.word 0xbc19b18c -//.word 0x03bca849 -//.word 0x248ae7d5 -//.word 0xec303568 -//.word 0x00d1fd51 -//.word 0xc25651ea -//.word 0x74062fcb -//.word 0xa056033e -//.word 0xb7026ef3 -//.word 0xf85c46f5 -//.word 0x93e4dedd -//.word 0x0f1a8746 -//.word 0xe9905680 -//.word 0x7e432889 -//.word 0x2a2be438 -//.word 0xb21100bc -//.word 0xdfa14745 -//.word 0x6cc0d901 -//.word 0x2320734a -//.word 0x4211f01e -//.word 0x239a10cf -//.word 0x1cc879fb -//.word 0xa546fbbf -//.word 0xb82e1828 -//.word 0x7e1fc4ea -//.word 0x27906955 -//.word 0x19632e84 -//.word 0x4ebd79d8 -//.word 0xf716b2a5 -//.word 0x668c4b2a -//.word 0x2a7dfdc7 -//.word 0x7c54546a -//.word 0xdaa36d4b -//.word 0xf173ffd9 -//.word 0xc0d898f3 -//.word 0xfbc8295c -//.word 0xad2cc569 -//.word 0x2238a6fd -//.word 0x04f871b7 -//.word 0xc42cba6a -//.word 0x3b56cbce -//.word 0x9211a175 -//.word 0x5fa43800 -//.word 0x10d70992 -//.word 0x8d06d085 -//.word 0x1973925c -//.word 0x79e0dff9 -//.word 0x595e5511 -//.word 0xeb6065dc -//.word 0xd1135a11 -//.word 0x3df29611 -//.word 0x57951f62 -//.word 0xdfc95b60 -//.word 0x13e6182f -//.word 0xd35dcff4 -//.word 0x03912a45 -//.word 0x31e8c3de -//.word 0x77212f95 -//.word 0xa3e83b90 -//.word 0x96a775b5 -//.word 0xeaa0ef62 -//.word 0xd8393f5e -//.word 0x5896ca10 -//.word 0x896d43ef -//.word 0x54166e3a -//.word 0x4ce22ae9 -//.word 0xd9aeaee3 -//.word 0x96b81371 -//.word 0xf7b113f3 -//.word 0x2f1310d2 -//.word 0x51b457b5 -//.word 0xb59ca7f8 -//.word 0x9d13ed5a -//.word 0x18ff52f5 -//.word 0x276d7774 -//.word 0x1f6eff80 -//.word 0x4e244f7b -//.word 0xe11c9171 -//.word 0x05deff4b -//.word 0x4dc35e46 -//.word 0x5407c8a4 -//.word 0xa31fafa2 -//.word 0xd54d1fa9 -//.word 0xf97143c8 -//.word 0x37222b62 -//.word 0xb7fdcc24 -//.word 0xbe3d493a -//.word 0x1a8d71c3 -//.word 0xc11a8882 -//.word 0xb5eb4ad6 -//.word 0x2a752dec -//.word 0xeb6ae733 -//.word 0xfad33010 -//.word 0x765ec9d4 -//.word 0xc2f9bdeb -//.word 0xe49fe755 -//.word 0x2b72b45b -//.word 0x150b2a7a -//.word 0x6f0e29a4 -//.word 0xbe01f1a8 -//.word 0xde5ee5ee -//.word 0xe9e68f67 -//.word 0x5b39e3c4 -//.word 0x73a4c8e6 -//.word 0xdc3ad496 -//.word 0x8c265777 -//.word 0xed3f9c38 -//.word 0x3add6b0e -//.word 0x2cebd262 -//.word 0xd73e26c7 -//.word 0xce25442e -//.word 0x8e421c5d -//.word 0x1a98719d -//.word 0xe2e4dab3 -//.word 0xe9310d12 -//.word 0x27a75c4f -//.word 0x2da480d5 -//.word 0x070e96da -//.word 0x66e76792 -//.word 0xff21eca2 -//.word 0x2eb412d7 -//.word 0xdfefba18 -//.word 0xae0b0499 -//.word 0x4d06cd52 -//.word 0x26af76b0 -//.word 0x42fde78a -//.word 0x6aa4d456 -//.word 0x8cea3f9d -//.word 0x60b73fac -//.word 0x4aecff8d -//.word 0x83f60935 -//.word 0x74a3c5ff -//.word 0x62343c59 -//.word 0x50b322bd -//.word 0x218714e4 -//.word 0xfe451e36 -//.word 0xf7c98084 -//.word 0xed86b2f9 -//.word 0xaf1aa54e -//.word 0x63254c3e -//.word 0x285c5b3a -//.word 0xf9d94f5d -//.word 0xd4b5aea2 -//.word 0x1cd99055 -//.word 0x3d115ec7 -//.word 0x8e63da46 -//.word 0x7b9e5f4c -//.word 0xe3356af7 -//.word 0xbf4e5ab9 -//.word 0x05177451 -//.word 0xcc592afa -//.word 0xb04f9de2 -//.word 0x78b860dd -//.word 0xf62b7f5b -//.word 0x2fabc098 -//.word 0xbc7b2812 -//.word 0x7033c140 -//.word 0x3b149b81 -//.word 0x4e991153 -//.word 0x804e4dc5 -//.word 0xf1e50f2f -//.word 0xed87a920 -//.word 0x13684f98 -//.word 0xb69e8d77 -//.word 0x83331936 -//.word 0x6479cbd5 -//.word 0xa59dea14 -//.word 0x567fa9e6 -//.word 0xf0c1f123 -//.word 0x3b1f617d -//.word 0x6efe94b5 -//.word 0x9847a20f -//.word 0x4075e903 -//.word 0x48ed0d35 -//.word 0x188e3da7 -//.word 0xf88ab82d -//.word 0xbc749022 -//.word 0xa79aae5a -//.word 0x8a941757 -//.word 0x2c1d6ec0 -//.word 0xee22b90e -//.word 0xaf196889 -//.word 0xee949373 -//.word 0x2e168383 -//.word 0x9f257495 -//.word 0xfaa0999f -//.word 0xad5361e7 -//.word 0x38c9f973 -//.word 0xd76112c1 -//.word 0x61a4e4b9 -//.word 0x70d672e0 -//.word 0xc2cb10ce -//.word 0xdffd23e2 -//.word 0xfcdb2934 -//.word 0x2063f9cb -//.word 0x85f24b11 -//.word 0x415b7a83 -//.word 0x253789ad -//.word 0xe67d6556 -//.word 0x7a5369f8 -//.word 0xc5232773 -//.word 0x75f06601 -//.word 0x2beb676d -//.word 0xdb416d80 -//.word 0x75387bbd -//.word 0xc57a604e -//.word 0x98b0f13d -//.word 0x205396e7 -//.word 0x99bf08ae -//.word 0x2d8a58ef -//.word 0x15133434 -//.word 0x025e66aa -//.word 0xbb1f9dd5 -//.word 0x07147082 -//.word 0xcd98a0fd -//.word 0x7a769d85 -//.word 0xa3fb4cfd -//.word 0xec4f08e4 -//.word 0x2805e787 -//.word 0xc1f03e75 -//.word 0x5a386734 -//.word 0xb4aec132 -//.word 0xce5df9fe -//.word 0x516188b8 -//.word 0x2afd7dc7 -//.word 0x79e77dc9 -//.word 0xaae608d0 -//.word 0xe19ffdcb -//.word 0x9cac6142 -//.word 0x94ef5c47 -//.word 0xe42684a9 -//.word 0x6cbf5f6a -//.word 0x78ed2273 -//.word 0x9dfbbf87 -//.word 0xe4e11f76 -//.word 0x2b15ac93 -//.word 0xc7a31367 -//.word 0x6e8048a7 -//.word 0x551bca64 -//.word 0x95362882 -//.word 0xd3f4c46b -//.word 0x2033d704 -//.word 0x1e1bb5e1 -//.word 0x64f753b5 -//.word 0x2444060c -//.word 0x0b088d3c -//.word 0x69665298 -//.word 0x926eede8 -//.word 0x843aea16 -//.word 0xca36cc2a -//.word 0xa0bf5178 -//.word 0x57f0f818 -//.word 0xfbb8c197 -//.word 0x343034ec -//.word 0x6a2ca4ae -//.word 0x2c11b584 -//.word 0xd3e61cdc -//.word 0x62ada6e0 -//.word 0xb1f37ca5 -//.word 0xcba6a5a6 -//.word 0x9427cc72 -//.word 0xafa044a1 -//.word 0x9e98490c -//.word 0x2bc4893e -//.word 0x0720e325 -//.word 0xb23f6e0d -//.word 0x9adfbdd0 -//.word 0x87c16146 -//.word 0x36b8b003 -//.word 0x44ffc542 -//.word 0x4fcfc81c -//.word 0x573170fe -//.word 0x6a12c559 -//.word 0x80952b9b -//.word 0xa4ad9c5f -//.word 0x54ea35e0 -//.word 0x2b93f4b4 -//.word 0xbdf6c0b7 -//.word 0xc3fca945 -//.word 0x780072ac -//.word 0x42e14ce0 -//.word 0x9556e571 -//.word 0x1482a1bb -//.word 0xfac9275d -//.word 0xb9e120ec -//.word 0xe12c3be8 -//.word 0x424575ee -//.word 0x55d99730 -//.word 0xd8b80023 -//.word 0xb92ba477 -//.word 0x3589554c -//.word 0x410542a3 -//.word 0x29cabd12 -//.word 0x774a41bd -//.word 0x16d2b381 -//.word 0xb762e872 -//.word 0x74bd6888 -//.word 0xb3bc7195 -//.word 0x4ee73f7a -//.word 0xf1468b9b -//.word 0xc3755290 -//.word 0x48f7d71e -//.word 0x86cceb65 -//.word 0x66466c5a -//.word 0x5e180c78 -//.word 0x4db053b3 -//.word 0xa6c7e8ae -//.word 0xd1360c2d -//.word 0xce0b67cd -//.word 0x1cdc07f3 -//.word 0xd95ba602 -//.word 0x2a2b2bd1 -//.word 0xddf2745c -//.word 0x4db053b9 -//.word 0x864fd64e -//.word 0xaa7bcc42 -//.word 0x94b38431 -//.word 0xbaa0d824 -//.word 0x58a66ac0 -//.word 0xcbba2ebd -//.word 0x3a73299a -//.word 0x7c63788f -//.word 0x36a793c4 -//.word 0x44bdd3c0 -//.word 0x5b963224 -//.word 0xecec5399 -//.word 0x4bd6c207 -//.word 0x109a7c08 -//.word 0xbec2b29c -//.word 0xa272ca1e -//.word 0xfef8a776 -//.word 0x67a52a91 -//.word 0x6cdbf80e -//.word 0x78687e3a -//.word 0xfa12333f -//.word 0xc2731d98 -//.word 0xae0897c8 -//.word 0x8784514c -//.word 0x266a98ce -//.word 0xdbdad89b -//.word 0x0fab5f57 -//.word 0x27bb63f0 -//.word 0xac8347d0 -//.word 0xa9ef1a57 -//.word 0x556c6188 -//.word 0xf2421602 -//.word 0xf524f032 -//.word 0x6705e5c8 -//.word 0x8b2eee67 -//.word 0xc18e0aa1 -//.word 0xaa518522 -//.word 0x8db47a2b -//.word 0xfa179743 -//.word 0xad532029 -//.word 0xb44f360c -//.word 0xd5ce5afe -//.word 0x2a8b2da7 -//.word 0x0e887936 -//.word 0x3da3759d -//.word 0x366a45fe -//.word 0xe430c160 -//.word 0x7e6177a7 -//.word 0xac12f3c3 -//.word 0xebdc3e27 -//.word 0x32eba47d -//.word 0xd652ba98 -//.word 0xaba1a0aa -//.word 0x6cba84b7 -//.word 0x5ce06749 -//.word 0x2e112466 -//.word 0x2296aebf -//.word 0x72d8992a -//.word 0xec75dc52 -//.word 0xe093d5ad -//.word 0x3c758daf -//.word 0xf64c3e3e -//.word 0xaa4f1265 -//.word 0x850d2e4c -//.word 0x6102ef68 -//.word 0x316973ef -//.word 0xa0525c8f -//.word 0xf5f4d05f -//.word 0x3a44c416 -//.word 0x9dc77b7b -//.word 0x16a4491c -//.word 0x4afd9d43 -//.word 0xb07f3f26 -//.word 0xf238d55e -//.word 0x96a9ac9a -//.word 0xdd1db595 -//.word 0xeb39ce45 -//.word 0x29d34356 -//.word 0xe80895d6 -//.word 0x47887a32 -//.word 0x56352461 -//.word 0x7bedc65f -//.word 0x15a355dd -//.word 0x60b58c37 -//.word 0x997932a6 -//.word 0x62199fb7 -//.word 0x67a27dfb -//.word 0x4257cc00 -//.word 0x9c4b2881 -//.word 0x952f4fda -//.word 0x6668debe -//.word 0x45655b2c -//.word 0x8a2f789f -//.word 0x0f419686 -//.word 0xdc9b89f3 -//.word 0x04129b97 -//.word 0xcaead3ee -//.word 0x08a677b7 -//.word 0xd21fcfa7 -//.word 0x56d42c5e -//.word 0x0681299a -//.word 0xfaf331ab -//.word 0x8f1a4127 -//.word 0x5560efde -//.word 0x2839ac10 -//.word 0x9cfb46de -//.word 0x9ff1b1ff -//.word 0x59aa06b4 -//.word 0x5797ccfe -//.word 0xe9d6770e -//.word 0xc8482efd -//.word 0xfce9d1bd -//.word 0xfd613b50 -//.word 0x19d6c437 -//.word 0x15050a2e -//.word 0x1791f216 -//.word 0xc49ae933 -//.word 0xa5927097 -//.word 0xcf4cd7de -//.word 0xc356481c -//.word 0x93890814 -//.word 0x46defaab -//.word 0x7e84659c -//.word 0x582ff66c -//.word 0x94b209a1 -//.word 0xf6d0242f -//.word 0xeb4fc433 -//.word 0x704f5de3 -//.word 0x30da9cc5 -//.word 0xecbcef20 -//.word 0x209547b1 -//.word 0xe42c1d9e -//.word 0x1006b3b0 -//.word 0xa3389cbc -//.word 0x66797e62 -//.word 0xcc7b17fa -//.word 0x1d7c7ecc -//.word 0xd318ab7f -//.word 0x45613ad5 -//.word 0x82316c95 -//.word 0x80bf6fc8 -//.word 0x7671df27 -//.word 0x86f18cd5 -//.word 0x9f837e4a -//.word 0xa296368f -//.word 0xc39837b1 -//.word 0x330fc570 -//.word 0xfce6ed37 -//.word 0x2c04c551 -//.word 0x3524f559 -//.word 0x94e076f2 -//.word 0xb10e9ab9 -//.word 0x06504d78 -//.word 0x84e79a9d -//.word 0x32c871ea -//.word 0x18f2a76d -//.word 0x5bfe3eb3 -//.word 0xa9f8e739 -//.word 0xd76dc523 -//.word 0xc9c57430 -//.word 0x93d34aee -//.word 0xddabdc2a -//.word 0x8cb4c4ab -//.word 0x9ffea220 -//.word 0x56d56156 -//.word 0x9a96bcae -//.word 0x99c100cf -//.word 0xb1501398 -//.word 0x8f47b558 -//.word 0x988d0642 -//.word 0x87fa481b -//.word 0x58b1e736 -//.word 0x66b0b6a2 -//.word 0xd0a57ca2 -//.word 0x2003af5d -//.word 0x2f567fd7 -//.word 0x43d41720 -//.word 0x7b341fcc -//.word 0x6dc385a2 -//.word 0x0db47d99 -//.word 0xd1b7c600 -//.word 0x12ce2ffc -//.word 0xb65c5b37 -//.word 0x0c7fc1d7 -//.word 0xf7a0f6ad -//.word 0x4f492faf -//.word 0x843602a9 -//.word 0x84ae6c2f -//.word 0xdf1418d6 -//.word 0x29b9dea4 -//.word 0xa1f48bc4 -//.word 0x0f75e07e -//.word 0xf3d6dd67 -//.word 0xdb733fd5 -//.word 0x157c4796 -//.word 0x8648bde2 -//.word 0xdaec358d -//.word 0xde0d9181 -//.word 0x29f2c76c -//.word 0x02dde4b6 -//.word 0x7e9c51b6 -//.word 0xe95b5525 -//.word 0x67bcdcd3 -//.word 0xdb2a7798 -//.word 0x086aa38e -//.word 0xf7724e7d -//.word 0x987f9797 -//.word 0xab62d666 -//.word 0xe11adc02 -//.word 0x3fa87c87 -//.word 0xc41f4ac6 -//.word 0x4bfba23b -//.word 0xb3b3ec40 -//.word 0x3c921f7f -//.word 0x34c284ad -//.word 0xd4aabd76 -//.word 0x657a05b3 -//.word 0xa603b9e3 -//.word 0x72cd18d9 -//.word 0x9e6347b2 -//.word 0x21f2970a -//.word 0x77120b70 -//.word 0x47e41516 -//.word 0x435da1cd -//.word 0x4fe15431 -//.word 0xe6141621 -//.word 0xbaedce73 -//.word 0x9b0c6ce5 -//.word 0x9a4d2d56 -//.word 0x6e9d1a36 -//.word 0x170cd33b -//.word 0xc1248a55 -//.word 0xea7952e5 -//.word 0xc7829a2a -//.word 0xe4a7f4fb -//.word 0x0c9b1cbc -//.word 0x68ec358b -//.word 0xead955ba -//.word 0xed634482 -//.word 0x15a781f5 -//.word 0x7d6a8635 -//.word 0x11f64de4 -//.word 0x382513db -//.word 0xb7bb5c1f -//.word 0xd2f83710 -//.word 0xb36ec3e4 -//.word 0x1011f254 -//.word 0x098d8d95 -//.word 0x4fdc798a -//.word 0x8b173838 -//.word 0xfe8cb27a -//.word 0x641236f6 -//.word 0x1f99bc4f -//.word 0x91056d9d -//.word 0xca3d651a -//.word 0x637eb71d -//.word 0xa9f6b14d -//.word 0xff8e620e -//.word 0x7d075a40 -//.word 0xdd48b129 -//.word 0x98f64baf -//.word 0x4c4659cb -//.word 0x610f233a -//.word 0xec240676 -//.word 0xd3e0b8e4 -//.word 0x3302d44f -//.word 0xfebb9295 -//.word 0xe906d5a0 -//.word 0x85386c98 -//.word 0xabd89157 -//.word 0x1eb0b61e -//.word 0x6c248286 -//.word 0x15c316b9 -//.word 0xef1c94e1 -//.word 0xc9d3e2e1 -//.word 0x4ff4ab44 -//.word 0x2e86a772 -//.word 0x78641d2a -//.word 0x4948a62c -//.word 0xab293336 -//.word 0xb7c75132 -//.word 0xfd84acae -//.word 0x2675d28c -//.word 0xd8b93afb -//.word 0xda0985a6 -//.word 0x7991032b -//.word 0x2afe79ce -//.word 0x70d9226f -//.word 0x0013f3b9 -//.word 0x24e1239d -//.word 0x5dcaebfe -//.word 0x4cfd8bae -//.word 0xd2e98d9a -//.word 0x77084d41 -//.word 0x08fbb96b -//.word 0x84dc5617 -//.word 0x3ad084b5 -//.word 0x2bdb0295 -//.word 0xb5f9b4a0 -//.word 0x736aa446 -//.word 0x5f4d48b7 -//.word 0x39700356 -//.word 0x2d67ed6a -//.word 0xb0dbd717 -//.word 0xab258a8e -//.word 0xdb1b5080 -//.word 0x772ab6d8 -//.word 0x14a68fa9 -//.word 0xc75d3c65 -//.word 0x89722b51 -//.word 0xdf699e35 -//.word 0xba7eae58 -//.word 0x9b3b8fab -//.word 0xfc491545 -//.word 0xec87770f -//.word 0xf95954c1 -//.word 0x5243f30d -//.word 0x2db6cf19 -//.word 0x67295333 -//.word 0x6a6ce2c1 -//.word 0x54391a76 -//.word 0x560d5acc -//.word 0x593581ae -//.word 0xe82cf974 -//.word 0x4a24f515 -//.word 0xeee3f698 -//.word 0x0dd094cc -//.word 0x8a4e7b39 -//.word 0x1d48b456 -//.word 0xb00d26fd -//.word 0x095f5c1b -//.word 0xaac688ac -//.word 0xf52bc8e7 -//.word 0x94a1a9b5 -//.word 0x1886ea68 -//.word 0xe0cb82aa -//.word 0x3d90e3b3 -//.word 0xd3f481c0 -//.word 0x432b8ec0 -//.word 0x07d10850 -//.word 0x9d7df6e9 -//.word 0x80000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00007360 -//// expected output -//.word 0x52e4c7a5 -//.word 0x283c2c14 -//.word 0x7f07e595 -//.word 0xe81832f5 -//.word 0xf31f29ec -//.word 0x02b4fd68 -//.word 0xea956d54 -//.word 0xa1f6c6bc -//.word 0x953fc268 -//.word 0xdf43ce47 -//.word 0x405362d3 -//.word 0x773f8f89 -//.word 0xfa024d92 -//.word 0xb54a1203 -//.word 0xf6d390bb -//.word 0x88a73227 -//// SHA512LongMsgvector_37 -//// vector length -//.word 0x00007678 -//// input message -//.word 0x8e4d3a26 -//.word 0xb9a8d496 -//.word 0xf6946eef -//.word 0xae61662f -//.word 0xb81fda07 -//.word 0xd71154e7 -//.word 0x845ead5c -//.word 0xee0a2b9b -//.word 0x4025ed5e -//.word 0x224289ee -//.word 0x822bf381 -//.word 0x94d3a1c7 -//.word 0x178cecc0 -//.word 0xdb7abad0 -//.word 0x80485a15 -//.word 0x8019aff8 -//.word 0x70c29102 -//.word 0x823670f2 -//.word 0x4f413a0c -//.word 0xd37a7fb3 -//.word 0xb973d43a -//.word 0xd93275f8 -//.word 0x00e52e9a -//.word 0xefd17bbd -//.word 0xa68ceebd -//.word 0xe26cd1c7 -//.word 0xe43f0d36 -//.word 0x743c4a1c -//.word 0x263a581e -//.word 0xdc20cd86 -//.word 0x8c9df093 -//.word 0x4319d613 -//.word 0x6aebcb34 -//.word 0x49ccf498 -//.word 0xc98b32a7 -//.word 0x7e034829 -//.word 0xe44b4114 -//.word 0xe92c0ca2 -//.word 0xacd86aa7 -//.word 0x85d80a22 -//.word 0x4547f112 -//.word 0xbf3e208b -//.word 0x878f7108 -//.word 0xf9b6c303 -//.word 0x7d0c56c3 -//.word 0x0a3e7876 -//.word 0xe9fe627f -//.word 0xbcf85d11 -//.word 0xbe0829fd -//.word 0x4caa9ec8 -//.word 0xa5b29401 -//.word 0xee3d01d1 -//.word 0x79e761d4 -//.word 0x463e5b27 -//.word 0xca77a1c3 -//.word 0xf0601809 -//.word 0x5e96399d -//.word 0xf9f8b778 -//.word 0xab5b6139 -//.word 0x64804bbc -//.word 0x5e4328ee -//.word 0xa614fbe0 -//.word 0xd8abef1a -//.word 0x29f88231 -//.word 0xab59e99c -//.word 0xcd10b0c3 -//.word 0x21f4a259 -//.word 0x6366e8ec -//.word 0xb68775ba -//.word 0x30a9a1c7 -//.word 0x9903132c -//.word 0x70a8e5b2 -//.word 0x2fba039f -//.word 0xd1dad4d0 -//.word 0x90e41d08 -//.word 0xf3d92288 -//.word 0x081d0ee0 -//.word 0xeee39404 -//.word 0x97e5d7a2 -//.word 0xcc5887b3 -//.word 0x721f4d51 -//.word 0x0b3f6ac8 -//.word 0x80939bef -//.word 0x1dc13fb9 -//.word 0xdd6cbb07 -//.word 0xe8ab1ec0 -//.word 0x5aba0124 -//.word 0x46f0b25d -//.word 0xfbf19157 -//.word 0x8525b9d2 -//.word 0x7769e3b6 -//.word 0xe80488a6 -//.word 0xbcdc46d7 -//.word 0x25ea8523 -//.word 0x68eb5a59 -//.word 0xe558acd8 -//.word 0x5299955c -//.word 0x47760a17 -//.word 0xffcebf04 -//.word 0x5d8b4578 -//.word 0x2dd575fa -//.word 0xad861254 -//.word 0x4bdeaaea -//.word 0xb179bd4b -//.word 0xff7d2206 -//.word 0x5718a5bf -//.word 0x9f2af581 -//.word 0x823ebe56 -//.word 0xb8bf1215 -//.word 0x88690d7c -//.word 0x8bfdb97e -//.word 0xb2392fde -//.word 0x8a07fffd -//.word 0xbff5d2f1 -//.word 0xe0e54ed6 -//.word 0x61053a69 -//.word 0xe602e3d3 -//.word 0xbf79bec2 -//.word 0xaeaf4ebe -//.word 0xf18148bb -//.word 0x7c9ef6ea -//.word 0x87f3d9d5 -//.word 0x486792ab -//.word 0x02c903d8 -//.word 0x3e06b1d9 -//.word 0x58a06c4f -//.word 0x3e5b3352 -//.word 0x753a5207 -//.word 0x5da9cd75 -//.word 0xb5fc0194 -//.word 0x611889a7 -//.word 0x6b705fcc -//.word 0x493443d2 -//.word 0x5ec4614a -//.word 0xc36b2ee1 -//.word 0x464a93ed -//.word 0xb3924d45 -//.word 0x53f79456 -//.word 0xb361fa73 -//.word 0xa6e4976d -//.word 0x8df26364 -//.word 0xd6cfe3dc -//.word 0xc3460813 -//.word 0x6d9b5493 -//.word 0x08c03e03 -//.word 0x68cbd842 -//.word 0xc4a8afb7 -//.word 0xbb0bf2e2 -//.word 0x94a9d737 -//.word 0xcaa83b2d -//.word 0xc8548992 -//.word 0xf113dc21 -//.word 0xe39b6856 -//.word 0xfd621681 -//.word 0x1f566e1a -//.word 0xb0cfba54 -//.word 0xe6c268f4 -//.word 0x4137b164 -//.word 0x59fd7803 -//.word 0xda9c75c0 -//.word 0xcd8b92e7 -//.word 0x19a3953a -//.word 0x49d40044 -//.word 0x8f1735ea -//.word 0x09a3de43 -//.word 0x44648caa -//.word 0xffa99e11 -//.word 0x311d6598 -//.word 0x4df8865e -//.word 0xc4769f96 -//.word 0xcb892dde -//.word 0x60caadcd -//.word 0x87b601cb -//.word 0xda171626 -//.word 0x40c0c462 -//.word 0xfd7df5d0 -//.word 0xeb4a0a62 -//.word 0x06c37abd -//.word 0x2edcbc90 -//.word 0x29d26824 -//.word 0xe8629935 -//.word 0x0b389501 -//.word 0xa7aab09e -//.word 0x46a66d90 -//.word 0x2fe9e79b -//.word 0xe8726fd6 -//.word 0xfa377701 -//.word 0xf416af18 -//.word 0xb20e6d28 -//.word 0xdfaf5262 -//.word 0xb9cf2b6e -//.word 0x147f1502 -//.word 0xa23ee5b2 -//.word 0x716cc60a -//.word 0xb50124da -//.word 0xc87ec9d1 -//.word 0x6f24464d -//.word 0x5f649572 -//.word 0x0098fc7a -//.word 0x70f0344b -//.word 0xcbafcb4f -//.word 0xaa97c780 -//.word 0xe9a18cc2 -//.word 0xaef20076 -//.word 0xa60bec4c -//.word 0x9240a658 -//.word 0x036bed69 -//.word 0x61e11496 -//.word 0x32a56319 -//.word 0x99dcba61 -//.word 0x1d817762 -//.word 0xac5a9a30 -//.word 0xe02b27cc -//.word 0x8129cc3d -//.word 0x4ab1c4e3 -//.word 0xf03afb09 -//.word 0x608973b9 -//.word 0x4824e6d4 -//.word 0xda08ad62 -//.word 0xcd9ee026 -//.word 0xa4ecbf75 -//.word 0x32085049 -//.word 0x5ed34a92 -//.word 0x24e332cc -//.word 0xdcc1c4d6 -//.word 0xbf559402 -//.word 0xa79ef569 -//.word 0x16a71a81 -//.word 0x7ab67bf1 -//.word 0xafc67aa3 -//.word 0xc637471b -//.word 0x05c50108 -//.word 0x2eb71e19 -//.word 0x05580c12 -//.word 0x0cab181f -//.word 0x915b9068 -//.word 0xeaf124e5 -//.word 0x00499274 -//.word 0x0a478329 -//.word 0x9bc6afe5 -//.word 0xdfd1482a -//.word 0x2116962d -//.word 0x9197df2d -//.word 0x45a38904 -//.word 0x7d0582fc -//.word 0x2b7be0e3 -//.word 0xb36ac562 -//.word 0xefcf868a -//.word 0x76790cb0 -//.word 0x1e767a7b -//.word 0xbfcb0f3b -//.word 0x3a684f7c -//.word 0xba5a5ddc -//.word 0x3a43ac19 -//.word 0x4807d66e -//.word 0x08c9cc20 -//.word 0x7b163054 -//.word 0x015fff23 -//.word 0x1dad73f0 -//.word 0x799028f9 -//.word 0x2a587d2d -//.word 0x34883d3e -//.word 0x51887ff6 -//.word 0xee9acace -//.word 0x770f7dbd -//.word 0xd4bb6e4e -//.word 0x34a6d2f5 -//.word 0x09045da3 -//.word 0x5368aa98 -//.word 0x2234dc79 -//.word 0x565486a2 -//.word 0xaa2cc8bd -//.word 0xf1cebb93 -//.word 0x9f710f23 -//.word 0x8a1ff3f1 -//.word 0xf2ad35a1 -//.word 0xbff0abc4 -//.word 0x0b2ed1f2 -//.word 0xe0d3b319 -//.word 0x43650e14 -//.word 0x71bab280 -//.word 0x68692acb -//.word 0xa97e9f8d -//.word 0x3d72fa1c -//.word 0xf65a495b -//.word 0xf75e64d2 -//.word 0x766dd004 -//.word 0xc12fe3fc -//.word 0x7f3b292a -//.word 0x398b076d -//.word 0x192c9e71 -//.word 0xf13af23b -//.word 0x7e0c4c02 -//.word 0xefacdd41 -//.word 0xa18aa30a -//.word 0x2d71919d -//.word 0xa4b9ea39 -//.word 0x19bfee32 -//.word 0x6092b844 -//.word 0x16ef6727 -//.word 0xe1707c63 -//.word 0xf9008366 -//.word 0xe892f6d4 -//.word 0x8e135e1e -//.word 0x679cbb56 -//.word 0x11ed2642 -//.word 0x0817b5af -//.word 0xb5789f07 -//.word 0xa7eca026 -//.word 0x20429f6a -//.word 0xd3ed8f09 -//.word 0xecfc93a8 -//.word 0x514d6529 -//.word 0x27fdf8c4 -//.word 0x99225c59 -//.word 0xd4bde304 -//.word 0x56ea82f3 -//.word 0x695a7974 -//.word 0xea033652 -//.word 0x4f167762 -//.word 0xe932b059 -//.word 0x65d7ace0 -//.word 0x991d76eb -//.word 0x7ea67a46 -//.word 0x78d1e870 -//.word 0xde3059ad -//.word 0xb63db557 -//.word 0xc0485475 -//.word 0xb7b4638f -//.word 0xd3638ac0 -//.word 0x926fcb0c -//.word 0xb81baef4 -//.word 0x94099b48 -//.word 0x86ad873d -//.word 0xbe01d3bf -//.word 0x467a7008 -//.word 0x433b4872 -//.word 0x788ad989 -//.word 0x0b802365 -//.word 0x8c04c537 -//.word 0x33fa6321 -//.word 0x69b74a4b -//.word 0x8ab85733 -//.word 0xea941544 -//.word 0x163025ab -//.word 0x5c32e366 -//.word 0x8db8469d -//.word 0x01490836 -//.word 0xdc0c07a4 -//.word 0x9037ecff -//.word 0xa3cb0a5a -//.word 0xb37f8951 -//.word 0xb7f9c3e1 -//.word 0x8744ee7d -//.word 0x9f7ffc5d -//.word 0x1fd2bf1a -//.word 0x17a75178 -//.word 0x0216b382 -//.word 0x90a0b4dd -//.word 0xa9211456 -//.word 0xae00eabd -//.word 0x02a943f6 -//.word 0xc93d0c4d -//.word 0xef87320a -//.word 0x6c330745 -//.word 0xc73ae8fc -//.word 0xd9a11d63 -//.word 0xd463007b -//.word 0x84ac61e6 -//.word 0xd4472afa -//.word 0x935a3f14 -//.word 0x7851a82f -//.word 0x6418f2b5 -//.word 0xe88dd294 -//.word 0x07350c95 -//.word 0x3d2d93ea -//.word 0xc064f205 -//.word 0x0508eab1 -//.word 0x863e5d5b -//.word 0xc3166bb0 -//.word 0x86beda6e -//.word 0x6cf6bb73 -//.word 0xa1c34a1b -//.word 0xeb6817c8 -//.word 0xea9263c2 -//.word 0x9ed3cd42 -//.word 0x29512ec9 -//.word 0xd6c0c1b6 -//.word 0x5b8d8718 -//.word 0x5b5ce9c1 -//.word 0x2fb5a09c -//.word 0xe6fad240 -//.word 0x8a9d7dc4 -//.word 0xa58f19d5 -//.word 0x04fc7907 -//.word 0xbb35f369 -//.word 0x6aeec05c -//.word 0xbea9a5a5 -//.word 0x3a72d3c0 -//.word 0x37cd0d77 -//.word 0x29ed08b4 -//.word 0x25261794 -//.word 0xa0a508bc -//.word 0x7a5f48f0 -//.word 0x3b474ee2 -//.word 0x9cc43747 -//.word 0x4962ae30 -//.word 0xe5c80f98 -//.word 0x4eeacc39 -//.word 0x237f0fa5 -//.word 0x84b6a191 -//.word 0x19240a74 -//.word 0x5601fa51 -//.word 0xfd95e7d0 -//.word 0xe4edf894 -//.word 0xf8d222c9 -//.word 0x82fc91fc -//.word 0xa9824930 -//.word 0x38950d2e -//.word 0xa26e7f1c -//.word 0x44858a51 -//.word 0xe904fd68 -//.word 0x937b7893 -//.word 0x79d58c32 -//.word 0x4c8b1ea5 -//.word 0xbe170c5e -//.word 0x45ac143a -//.word 0x1c24f111 -//.word 0x8c3ac68c -//.word 0x69f9c036 -//.word 0xdf74f7d6 -//.word 0x6fb896fd -//.word 0x34ff3cdb -//.word 0x6b26a256 -//.word 0x32617d5e -//.word 0x902ea67a -//.word 0xb68778a7 -//.word 0x845c7963 -//.word 0x4f403d05 -//.word 0xe263884f -//.word 0xc2c0b346 -//.word 0xb7975141 -//.word 0x871e1241 -//.word 0x0574e780 -//.word 0x4ad6664d -//.word 0x43157116 -//.word 0x6c4712c7 -//.word 0xdabdaa53 -//.word 0x7f364b8f -//.word 0xaa526247 -//.word 0xcd4a998c -//.word 0x83ddfb4b -//.word 0xd18e5924 -//.word 0xac0ced78 -//.word 0xbcf23ec4 -//.word 0x60b0432e -//.word 0xf2c9cb5e -//.word 0x4c401d8f -//.word 0x8b4cdbe6 -//.word 0x13532c02 -//.word 0xd31619d4 -//.word 0xca2a38b1 -//.word 0xc9a788a5 -//.word 0x7b249d0b -//.word 0xa4e2fd5a -//.word 0xa647c942 -//.word 0x498ea0f8 -//.word 0xbbbec0ce -//.word 0xd6d86e06 -//.word 0xa25599e8 -//.word 0x1bcfba12 -//.word 0x34fffe10 -//.word 0x1be7a72c -//.word 0xbf50af87 -//.word 0x9077af69 -//.word 0x850400d6 -//.word 0x643b2062 -//.word 0x3e765746 -//.word 0x38d39ab2 -//.word 0x922aaf65 -//.word 0xe142927c -//.word 0x9f441887 -//.word 0xe66fd2e2 -//.word 0x790e3443 -//.word 0x04a7f68f -//.word 0xa576bbf2 -//.word 0xaa19f12e -//.word 0x9d8df833 -//.word 0x7e5986f1 -//.word 0x4f094a6a -//.word 0xd6decf0b -//.word 0x9ec4a43c -//.word 0x3f84ba36 -//.word 0xdf3b0d14 -//.word 0xf90b862d -//.word 0x5d1020a2 -//.word 0x78964b33 -//.word 0xd6898e57 -//.word 0xe52c6f8b -//.word 0xfc0e97ea -//.word 0x9b3b32fe -//.word 0xf5af95d6 -//.word 0xab102358 -//.word 0xdb9c71d9 -//.word 0x5960a8eb -//.word 0x3caa2b76 -//.word 0x9dc27a0b -//.word 0x9bd55774 -//.word 0xa2322790 -//.word 0xeeb99a5e -//.word 0x4a8f8e57 -//.word 0x1e173101 -//.word 0xa81e66c1 -//.word 0x8a566bf0 -//.word 0x8506b832 -//.word 0x84ff2a03 -//.word 0xdcd26093 -//.word 0xd24066d4 -//.word 0x5ef290d1 -//.word 0x2e6ba941 -//.word 0xee3a4d5c -//.word 0xc77494ed -//.word 0x2561f1a9 -//.word 0xbe7659bf -//.word 0xd083a7b0 -//.word 0xa92e3f61 -//.word 0x6da0f16f -//.word 0x147e21c2 -//.word 0xb21b2565 -//.word 0xfbecef94 -//.word 0x063cec17 -//.word 0x51202bcf -//.word 0x06aec28f -//.word 0x7c6a6e2d -//.word 0x010179d8 -//.word 0xd73ae1ab -//.word 0x7c29b683 -//.word 0x2ea6c40e -//.word 0xaffd7225 -//.word 0x46e7ea5c -//.word 0x06b97ad7 -//.word 0x52dc3a5f -//.word 0xa17df0b4 -//.word 0x7f853025 -//.word 0xd5ccc85f -//.word 0x69895b83 -//.word 0xa80e4b7b -//.word 0xa4b2dc8d -//.word 0x590e9730 -//.word 0x346ced1f -//.word 0xd67c1dad -//.word 0x15495858 -//.word 0x436c22a0 -//.word 0xb37ffb1a -//.word 0x7ad53fc0 -//.word 0x73684b8b -//.word 0x8613e144 -//.word 0x2902ce97 -//.word 0x2666c969 -//.word 0x9f6d9f6b -//.word 0x50718def -//.word 0x1570edfb -//.word 0xacbc169c -//.word 0xbbf37d7d -//.word 0x153220b8 -//.word 0x398624ec -//.word 0x1ca3bc90 -//.word 0x28d94e87 -//.word 0x8443d1f4 -//.word 0x96427a4f -//.word 0xc62997b9 -//.word 0x853abb8c -//.word 0x8ed21b37 -//.word 0x6ce03849 -//.word 0x3d9bbecb -//.word 0xb575acd3 -//.word 0x664ab656 -//.word 0x3edee83e -//.word 0x51868bbc -//.word 0xd8254ce0 -//.word 0x7a5a9b67 -//.word 0xcbf852d4 -//.word 0x13b797c2 -//.word 0x50290378 -//.word 0x7eef04be -//.word 0x152c7fef -//.word 0xd43aba50 -//.word 0xbd9c7aa0 -//.word 0x613468f0 -//.word 0x5db6b9b5 -//.word 0x255d0e1c -//.word 0x00dd999d -//.word 0x549882d3 -//.word 0x2414898b -//.word 0xd7adec1b -//.word 0x3b878bf5 -//.word 0xc9c74a7b -//.word 0x2b03b715 -//.word 0xfbf6ed81 -//.word 0xce79b86b -//.word 0x71aff93e -//.word 0x727f4c39 -//.word 0xe247e9c5 -//.word 0x5acec806 -//.word 0x3c7b09b0 -//.word 0x3bc5921c -//.word 0x1eebfa9b -//.word 0xc0e5a60a -//.word 0x5c9a31a6 -//.word 0x07531122 -//.word 0x7e7078f7 -//.word 0x225a79fc -//.word 0x41b86c36 -//.word 0x97e693f1 -//.word 0x15a2fe0f -//.word 0xe109aba1 -//.word 0x9dc3f2b4 -//.word 0xec7a206d -//.word 0x32906359 -//.word 0x9c11e6fe -//.word 0x61e63cb6 -//.word 0x474c02bd -//.word 0x6885c088 -//.word 0x36cd1158 -//.word 0xbd900410 -//.word 0x28dac143 -//.word 0x870f7092 -//.word 0xcfdc5635 -//.word 0x226d41d7 -//.word 0x51e127a7 -//.word 0xa0fb0aac -//.word 0xc91a1e58 -//.word 0x436b2e61 -//.word 0xc35d3ccc -//.word 0x0455684b -//.word 0xc4a413c8 -//.word 0x0fb64342 -//.word 0xbf8b49d8 -//.word 0x446ba223 -//.word 0xa1d61cc9 -//.word 0xb7bb394f -//.word 0xc6ead82f -//.word 0x31ca122b -//.word 0x814f63e0 -//.word 0xad270a9e -//.word 0x9934b277 -//.word 0xdc3f5196 -//.word 0xc6eb51d3 -//.word 0xa2e7ee84 -//.word 0x3868df95 -//.word 0x96d738db -//.word 0x10c68fa5 -//.word 0x86295d94 -//.word 0xe5c3a8ad -//.word 0xf0dedfad -//.word 0x413f069c -//.word 0x8a5912a5 -//.word 0x21c19725 -//.word 0xbce2a002 -//.word 0x79f2de3e -//.word 0x212506cc -//.word 0xad2074a2 -//.word 0x09b0140f -//.word 0x19bc824f -//.word 0xfa78705d -//.word 0x8adc4908 -//.word 0x2a551349 -//.word 0xc2ba9ad4 -//.word 0x0681cbed -//.word 0xf8335e7d -//.word 0xae1db865 -//.word 0x56490f12 -//.word 0x77accf51 -//.word 0x7aa13c65 -//.word 0x68965958 -//.word 0xf505098e -//.word 0xbea775a0 -//.word 0xcfe4ad67 -//.word 0x688d9256 -//.word 0x01cdf30d -//.word 0x8b5df62c -//.word 0xf9f8ba65 -//.word 0xff0f3ad6 -//.word 0x19bd7595 -//.word 0xd0fdcc8c -//.word 0x391bab87 -//.word 0xbe686b8b -//.word 0x2032776a -//.word 0xbdf3ae94 -//.word 0x0fc90930 -//.word 0x76267e6b -//.word 0x37c92410 -//.word 0xc4ed975a -//.word 0x3ec09e06 -//.word 0x38160bab -//.word 0xbe5fe34e -//.word 0x95d6bf31 -//.word 0xc5fc72ed -//.word 0x5545ecc0 -//.word 0x56115f28 -//.word 0x23dda0b1 -//.word 0xe6bbcf0b -//.word 0x5eff3a5f -//.word 0xe03c7fe3 -//.word 0x9c6ff1ad -//.word 0x22793dc5 -//.word 0x25d34e7d -//.word 0x7e7d6d05 -//.word 0x7337ad3a -//.word 0x3af486bf -//.word 0xb98cc04f -//.word 0x90b19251 -//.word 0x59240cad -//.word 0x2e28b2df -//.word 0x6c386a4a -//.word 0xb7f598ce -//.word 0x3f62879c -//.word 0x41530b49 -//.word 0xd0236422 -//.word 0xd5a666c0 -//.word 0x555ed7dc -//.word 0xf2f21964 -//.word 0xb5db08cd -//.word 0x0a6126ac -//.word 0x0cc6f680 -//.word 0x03c1a5d2 -//.word 0x2b2eef81 -//.word 0xb8034157 -//.word 0x16861bdf -//.word 0x75bdb97b -//.word 0x8526f2b1 -//.word 0x7ea960c6 -//.word 0x64cbc18e -//.word 0x89249d82 -//.word 0x53132a13 -//.word 0x3fb06c3e -//.word 0x2602a061 -//.word 0xc073db4d -//.word 0x6680ef9c -//.word 0x1cb58e45 -//.word 0xced9b26d -//.word 0xda663b80 -//.word 0xcf3cda81 -//.word 0x74952f9e -//.word 0x0d3c2e08 -//.word 0xd9fac701 -//.word 0xdf51c637 -//.word 0xeb6df850 -//.word 0xd3588fc6 -//.word 0xfe6dc7f5 -//.word 0x270fca72 -//.word 0x5f9bd19f -//.word 0x519a8d7c -//.word 0xca3cc5c0 -//.word 0x79024029 -//.word 0xf3bae510 -//.word 0xf9b02140 -//.word 0xfe238908 -//.word 0xe4f6c18f -//.word 0x07a89c68 -//.word 0x7c868466 -//.word 0x9b1f1db2 -//.word 0xbaf9251a -//.word 0x3c829fac -//.word 0xcb493084 -//.word 0xe16ec9e2 -//.word 0x8d588680 -//.word 0x74a5d622 -//.word 0x1667dd6e -//.word 0x528d16fe -//.word 0x2c9f3db4 -//.word 0xcfaf6c4d -//.word 0xce8c8439 -//.word 0xaf38ceaa -//.word 0xaa9ce2ec -//.word 0xae7bc8f4 -//.word 0xa5a55e3b -//.word 0xf96df9cd -//.word 0x575c4f9c -//.word 0xb327951b -//.word 0x8cdfe408 -//.word 0x7168e189 -//.word 0xc42c9d7b -//.word 0xbe10ba07 -//.word 0xb3a8d076 -//.word 0x97a60e46 -//.word 0xc299257d -//.word 0xf0d4613d -//.word 0x8cab1999 -//.word 0x2ee64aa7 -//.word 0x626f7fd6 -//.word 0xab4ef482 -//.word 0xc7d7fac6 -//.word 0x35229d92 -//.word 0xf5bc85fd -//.word 0x8f9c1adc -//.word 0x5659ec93 -//.word 0xee9a512b -//.word 0x0ccd50a5 -//.word 0x7d1cbd8e -//.word 0x6a9ca6d4 -//.word 0xdac8eed8 -//.word 0x782f38c4 -//.word 0x9769061f -//.word 0x734f229f -//.word 0xb96c3e3e -//.word 0x4aaed78f -//.word 0x3c615f53 -//.word 0x225e9a48 -//.word 0x8e804941 -//.word 0xd458067b -//.word 0x10226f2f -//.word 0x6af78664 -//.word 0x98445807 -//.word 0xa57add3d -//.word 0xf10720f8 -//.word 0x7a869fc9 -//.word 0x5932f5f5 -//.word 0x90a1b6ca -//.word 0x02af9b33 -//.word 0xc3b8df8b -//.word 0x920ae8af -//.word 0xa4992a57 -//.word 0xa4f549a6 -//.word 0xf77a7dff -//.word 0x44c63b1b -//.word 0x34711258 -//.word 0x76f8d354 -//.word 0x07f9f4bb -//.word 0xb0a6365d -//.word 0xd0748684 -//.word 0x5b132184 -//.word 0x23a3fc93 -//.word 0x562563db -//.word 0x482fe0ce -//.word 0x73e45eba -//.word 0xbd248e9d -//.word 0xf9008a3a -//.word 0xaf71b96c -//.word 0x2049f2bb -//.word 0x8569e42d -//.word 0x9835b55e -//.word 0x5545e9d3 -//.word 0x025d868c -//.word 0x6da075d8 -//.word 0x75002c6e -//.word 0xcbf98ab8 -//.word 0xfa7f0272 -//.word 0xa535fc74 -//.word 0x10df78cc -//.word 0xe31af510 -//.word 0x2a4b91f3 -//.word 0x9fd57115 -//.word 0x2c8f6320 -//.word 0xac75c210 -//.word 0xf29d9bd2 -//.word 0x0c6d0d11 -//.word 0xc80cf64d -//.word 0x7816cc2d -//.word 0xf394c816 -//.word 0xdc2b4afc -//.word 0x27937978 -//.word 0xd84b291b -//.word 0x0e8b0303 -//.word 0x417bdfab -//.word 0xc8a27507 -//.word 0x9ea135d1 -//.word 0x6521731e -//.word 0xab0ac734 -//.word 0x6df5b49f -//.word 0xd9e58782 -//.word 0x5831822c -//.word 0xccc53aeb -//.word 0x168b3e25 -//.word 0xdc23f9a4 -//.word 0x89dada32 -//.word 0x95dab266 -//.word 0x069e5dbd -//.word 0x37a9a4ec -//.word 0xd8786275 -//.word 0x36b5e679 -//.word 0xbcad99cd -//.word 0xba04e050 -//.word 0x66a7447b -//.word 0x2103d139 -//.word 0xfb75bbf9 -//.word 0x78014802 -//.word 0x9546e907 -//.word 0x06b1aafc -//.word 0xc2f2cd28 -//.word 0xc1acb27a -//.word 0x0471fb20 -//.word 0xd7eded56 -//.word 0x5361187c -//.word 0x26543a6c -//.word 0x9785610a -//.word 0xc423501d -//.word 0x2e40245d -//.word 0x788437cc -//.word 0x6c1e454a -//.word 0x3f00cd64 -//.word 0x164cba6e -//.word 0xc80943d1 -//.word 0xe61b10a5 -//.word 0xf9729e83 -//.word 0x0a81e494 -//.word 0x68f237ee -//.word 0xa5986b21 -//.word 0xe2a53b0c -//.word 0x4c1deaf6 -//.word 0xe78a2bda -//.word 0x8bf23f01 -//.word 0x2c065dd6 -//.word 0x5e9c56f7 -//.word 0x175f7988 -//.word 0xb7c5b4cc -//.word 0x4742fdf6 -//.word 0xfebcf03c -//.word 0x0a3eba2e -//.word 0x8df03546 -//.word 0xe54754c0 -//.word 0x3079c2ab -//.word 0x0f34c641 -//.word 0xab8f6a74 -//.word 0xf641dcc9 -//.word 0x34101469 -//.word 0xb98db776 -//.word 0xf4ff3c9b -//.word 0xac9d4de7 -//.word 0x8a0070db -//.word 0xd8d7e6c1 -//.word 0x88ddd340 -//.word 0x7808a02e -//.word 0xf4039ea5 -//.word 0x7ddfec59 -//.word 0xc8069a28 -//.word 0x0a700ef3 -//.word 0x7319a7ad -//.word 0xf8b2a1b1 -//.word 0x56963959 -//.word 0x540111cc -//.word 0x487cd517 -//.word 0xdc9c1f80 -//.word 0x12ec9816 -//.word 0x8628618d -//.word 0xf4acb149 -//.word 0xf92bbfb9 -//.word 0x1ea4e280 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00007678 -//// expected output -//.word 0xbd8fbb9b -//.word 0xc746521c -//.word 0xba862867 -//.word 0x0493cd85 -//.word 0x1f43b6f0 -//.word 0x263f49d3 -//.word 0xb6259519 -//.word 0xfbbcd93c -//.word 0xac1c7d21 -//.word 0x5425a26a -//.word 0x73a3c0f2 -//.word 0x8aa18833 -//.word 0xa4811e3e -//.word 0xcabeeac0 -//.word 0x917f2e18 -//.word 0xf7718c8a -//// SHA512LongMsgvector_38 -//// vector length -//.word 0x00007990 -//// input message -//.word 0x73dfee3b -//.word 0x9a968877 -//.word 0x082b72fd -//.word 0xec5a8902 -//.word 0x39a55eab -//.word 0x0ef441cf -//.word 0x757f9eff -//.word 0x51ed8dc3 -//.word 0x92bda427 -//.word 0xabe60f76 -//.word 0x46bae346 -//.word 0x3610b0b4 -//.word 0xada256f1 -//.word 0xafb419fe -//.word 0xc6f7f7b3 -//.word 0xf8ac3806 -//.word 0xf60c488a -//.word 0x96e8c236 -//.word 0x838dcd68 -//.word 0x33eaab29 -//.word 0x1af58fb3 -//.word 0x1e4aaf31 -//.word 0x4a159bc5 -//.word 0xc633cdcf -//.word 0x0794816d -//.word 0x43e4c73e -//.word 0x286ad66c -//.word 0xcd30a3e9 -//.word 0xe964b2f8 -//.word 0x43fe2cf0 -//.word 0x69a3333c -//.word 0xa5c972a7 -//.word 0x2d1df8d7 -//.word 0x9a214616 -//.word 0x9b1aa659 -//.word 0xeb29bf7a -//.word 0x80b867c9 -//.word 0x0617b8c3 -//.word 0x8b676621 -//.word 0x7cb84f15 -//.word 0xd06e54d0 -//.word 0x83e96847 -//.word 0x4665e637 -//.word 0x751e2866 -//.word 0x49b8552d -//.word 0x4fdf7a33 -//.word 0x182bdd7b -//.word 0x32468ea1 -//.word 0x58503e60 -//.word 0xe6825458 -//.word 0x90123e0e -//.word 0x52570535 -//.word 0xaa2e252c -//.word 0x069c9bc7 -//.word 0x78b53f52 -//.word 0xb1bc54d3 -//.word 0x2d8b5e90 -//.word 0xab3533d1 -//.word 0xe0eb55e7 -//.word 0x6c1c7f6d -//.word 0x0de07ece -//.word 0x13974208 -//.word 0x14cd35af -//.word 0xe062cc34 -//.word 0xb7e75b67 -//.word 0xba4a2d3b -//.word 0xa0b6d4c9 -//.word 0xaab5be98 -//.word 0xd998091c -//.word 0x5e18987c -//.word 0x523d6799 -//.word 0xa77f1b4b -//.word 0x5f2cdeed -//.word 0xfb09691d -//.word 0x373c62bd -//.word 0xf469e93d -//.word 0x761c6e1d -//.word 0xcf67c5ad -//.word 0x9bcc7c18 -//.word 0xee5c6ca0 -//.word 0x8b218e2b -//.word 0x57ba10ff -//.word 0x0d45a8ca -//.word 0x328229e5 -//.word 0x4c3454d9 -//.word 0x4fcbf023 -//.word 0x58411d34 -//.word 0x9d42e5bc -//.word 0xa48f1428 -//.word 0xb4a44969 -//.word 0x8a994ef8 -//.word 0x4c46a517 -//.word 0xc3aa6359 -//.word 0xc48e4264 -//.word 0xef65f1f6 -//.word 0x9d77ae26 -//.word 0x133e17ed -//.word 0xfc103de4 -//.word 0x16fffb4f -//.word 0x2bfe865b -//.word 0x434544a4 -//.word 0x18f6e2fa -//.word 0xca00a165 -//.word 0xd443f066 -//.word 0x3ff64080 -//.word 0x154614f7 -//.word 0x194057d8 -//.word 0xb5f1f339 -//.word 0x34cc9fc2 -//.word 0x314cf86d -//.word 0x4fdad489 -//.word 0x2bf0d305 -//.word 0x8f7f37eb -//.word 0xe98ef52b -//.word 0xfb240b9a -//.word 0xd369153a -//.word 0xfe081bbc -//.word 0xf9d7ae43 -//.word 0xe8ba336b -//.word 0x8ac57e8a -//.word 0x6da0a336 -//.word 0x5e300807 -//.word 0x2473bf9d -//.word 0x6eac13e5 -//.word 0x09c16199 -//.word 0x56e12a06 -//.word 0xfc696512 -//.word 0xda091a7d -//.word 0x40232c67 -//.word 0x5e737713 -//.word 0xfcf51aea -//.word 0x6c0316c3 -//.word 0xbdbe1961 -//.word 0x32b0943d -//.word 0xf2b01386 -//.word 0x0105ce67 -//.word 0x6fce7b88 -//.word 0xd0a167d7 -//.word 0xec72c588 -//.word 0xb7b6465a -//.word 0x83c9ea1d -//.word 0x748d1571 -//.word 0x3455e5d0 -//.word 0xe901c3cf -//.word 0x646a38a0 -//.word 0x9b0002dc -//.word 0x5ab1687f -//.word 0x350dca35 -//.word 0xc1a87cd4 -//.word 0x04c0d529 -//.word 0x292082f7 -//.word 0x7844203d -//.word 0x86be0bb8 -//.word 0xa9d970a9 -//.word 0xaf7baad8 -//.word 0xd050cbd9 -//.word 0xe024788e -//.word 0xca91fbed -//.word 0x39db9303 -//.word 0x98180e39 -//.word 0x3d949ad7 -//.word 0xe173d9c6 -//.word 0x5498339a -//.word 0x6ec670d0 -//.word 0x49058653 -//.word 0xad48af45 -//.word 0xcc4cbffd -//.word 0x30c3b54c -//.word 0xf1b29005 -//.word 0x2b1864bc -//.word 0xafd0accd -//.word 0xf9b8e2a1 -//.word 0x63134d2c -//.word 0x982c1bba -//.word 0x4a3dafec -//.word 0x288e3cfd -//.word 0x0ae1934a -//.word 0x6f0e3912 -//.word 0x2aebbd7a -//.word 0x586e48d4 -//.word 0x95167620 -//.word 0x708664d3 -//.word 0x1c740bd8 -//.word 0x68c1ccd5 -//.word 0xf0e94baf -//.word 0x959e8150 -//.word 0x2cb00da8 -//.word 0x7330cbf1 -//.word 0x49d5a838 -//.word 0x1e9eb519 -//.word 0xa8b97aca -//.word 0xd7a48c5b -//.word 0x0c92623b -//.word 0x861064ff -//.word 0x1ce8455f -//.word 0x32469381 -//.word 0xe6198c7b -//.word 0x8abc3413 -//.word 0x57d6a4c8 -//.word 0x5f7fa517 -//.word 0xc4a47df7 -//.word 0x28ac09a6 -//.word 0x645b0ca7 -//.word 0x7df7c70c -//.word 0xd4aacaf1 -//.word 0x9c280949 -//.word 0x919132dd -//.word 0xe7993e91 -//.word 0x81e647e9 -//.word 0x64ba99cd -//.word 0x6bd10b89 -//.word 0x3c8d9018 -//.word 0x7a5009a2 -//.word 0x3d295d43 -//.word 0xbfb4cc0e -//.word 0x583b8052 -//.word 0xac21651b -//.word 0x23813bfc -//.word 0x9912ea0c -//.word 0x574e152f -//.word 0x42d3f197 -//.word 0x5309588a -//.word 0x47051965 -//.word 0x98ad93e1 -//.word 0xab1d8295 -//.word 0x4b4a18bc -//.word 0x56e55039 -//.word 0xb6837fd8 -//.word 0x93fa2bd7 -//.word 0xc70e21a5 -//.word 0x934dc2e9 -//.word 0x90379ec6 -//.word 0xe8a2445d -//.word 0xc55d5794 -//.word 0x0a14e516 -//.word 0x4273f59c -//.word 0xd58e5f6a -//.word 0x8281e11c -//.word 0x09536ea2 -//.word 0x2821c98a -//.word 0xc978537d -//.word 0x7a02220d -//.word 0x1d6552ae -//.word 0xe168a001 -//.word 0x71583459 -//.word 0x6baabf78 -//.word 0x13e1c699 -//.word 0x49b23eb4 -//.word 0xb86658fd -//.word 0x51819ead -//.word 0xf8a13f06 -//.word 0x7ca8a791 -//.word 0xcd1d53ab -//.word 0x69d0e43f -//.word 0x18bd72d5 -//.word 0xd93322cc -//.word 0x1c36fbe3 -//.word 0x3121f5ff -//.word 0x01905328 -//.word 0xfc7c33d4 -//.word 0x52a86468 -//.word 0x663c77fc -//.word 0x80b0195e -//.word 0xc1eca05a -//.word 0x5daee339 -//.word 0x042b4f88 -//.word 0xa1f9371b -//.word 0x472c6c51 -//.word 0x68c00e98 -//.word 0x4937a134 -//.word 0xb282633d -//.word 0xea25dde7 -//.word 0xe397b907 -//.word 0xb1e7d3d2 -//.word 0x40a593e7 -//.word 0x47007990 -//.word 0x782cf944 -//.word 0xfa078a71 -//.word 0x18fbfa79 -//.word 0x3b2604fa -//.word 0x15b82453 -//.word 0x209daa64 -//.word 0x475d0e95 -//.word 0xe2408319 -//.word 0xe8b5ce74 -//.word 0x60f4593a -//.word 0x19e3831a -//.word 0x9b363b1c -//.word 0x5ddbcd27 -//.word 0x3995fbc6 -//.word 0x1ce7502b -//.word 0x0233b175 -//.word 0x2223352e -//.word 0x65483718 -//.word 0x1d01a929 -//.word 0xf49faad4 -//.word 0x22c65b8a -//.word 0xe416ef81 -//.word 0x290b02b4 -//.word 0x8e222c2b -//.word 0x8c3ed57c -//.word 0xf0494b92 -//.word 0x8c1e11ad -//.word 0x2da77baa -//.word 0xcd427785 -//.word 0x096aae1c -//.word 0xd593cc35 -//.word 0x6e551bc3 -//.word 0x90cd5765 -//.word 0xea41be30 -//.word 0xcf0266ae -//.word 0x2e97d326 -//.word 0xc417c91e -//.word 0x90d75f1f -//.word 0x874555b8 -//.word 0x8a14a7c5 -//.word 0x959a62f2 -//.word 0x3976b77a -//.word 0x4c754e35 -//.word 0xdfb7ddd1 -//.word 0x700df85f -//.word 0x61a62b12 -//.word 0xa9eb4644 -//.word 0xcaa7f8ba -//.word 0x036b9f29 -//.word 0xc6315ff9 -//.word 0x6c3f7148 -//.word 0x284ebe32 -//.word 0x39ecad50 -//.word 0x641f397e -//.word 0xa24b46e2 -//.word 0x1655352a -//.word 0x4109b614 -//.word 0x79b9dd34 -//.word 0x972779f2 -//.word 0xf1a6a1d2 -//.word 0x887b8ff8 -//.word 0x8289b2eb -//.word 0xda2efe99 -//.word 0x5668879b -//.word 0xb93c4ebb -//.word 0x3a585ab3 -//.word 0x36f70b38 -//.word 0x2205ac37 -//.word 0xc383475f -//.word 0xa12ebddf -//.word 0xb95b1571 -//.word 0x72261597 -//.word 0xd2cb0f24 -//.word 0xf254feff -//.word 0xaf75d224 -//.word 0xa3b407eb -//.word 0x54cc7c8d -//.word 0xaa5483e4 -//.word 0xa79c3472 -//.word 0x52d808a5 -//.word 0xf480a359 -//.word 0x87f6f09f -//.word 0x6c6a73bd -//.word 0x5cfbdb76 -//.word 0xa11ed78b -//.word 0x86442b81 -//.word 0x0cb703a5 -//.word 0xdec5874e -//.word 0x8721af62 -//.word 0xe386591b -//.word 0xd39d990b -//.word 0x3521505e -//.word 0x14410060 -//.word 0x1b46de3f -//.word 0x50752911 -//.word 0xff37bb18 -//.word 0xf377de45 -//.word 0xec4c60fc -//.word 0x4ed8ea17 -//.word 0x17708d2d -//.word 0x13fc9e14 -//.word 0x53a1c4a4 -//.word 0xdb9e4fbe -//.word 0x9b74cb8d -//.word 0xa14ad50c -//.word 0x8c8f2ec9 -//.word 0x44e10ee8 -//.word 0xe82ebb6a -//.word 0x081959b0 -//.word 0x159f043a -//.word 0x15fa1cb5 -//.word 0x9bc5e035 -//.word 0xf7623fbf -//.word 0xaa99ea0a -//.word 0x1d81ae86 -//.word 0x92a4019e -//.word 0x5a5edb3a -//.word 0x4886c789 -//.word 0x675039fd -//.word 0xe8722297 -//.word 0x5e86c264 -//.word 0x2eb0bd48 -//.word 0x408072fa -//.word 0xfb1a8850 -//.word 0x7194c9bd -//.word 0xd69f3418 -//.word 0x376a4d9e -//.word 0x68c3b83b -//.word 0x3f800605 -//.word 0xff1dcf09 -//.word 0x17a6014b -//.word 0x0dd77708 -//.word 0xb583ce3e -//.word 0xa632746f -//.word 0xee0e01a1 -//.word 0x0500cba9 -//.word 0x0016b4a9 -//.word 0x072847d8 -//.word 0x09bb0481 -//.word 0xae25f74f -//.word 0x8ef290c7 -//.word 0xa087ae16 -//.word 0xf505fd0d -//.word 0xa670826a -//.word 0x0b117459 -//.word 0x2d184e3a -//.word 0x7e8622a5 -//.word 0xc84a30ab -//.word 0x64aab75f -//.word 0xace50b96 -//.word 0xb217e8ea -//.word 0x335c0605 -//.word 0xc638ed1c -//.word 0x59370bb9 -//.word 0xded004be -//.word 0x428f49a7 -//.word 0x9f74ec0f -//.word 0xb296b375 -//.word 0x8f0b6b41 -//.word 0x930c7e02 -//.word 0x9b55c8fa -//.word 0x73cba7dc -//.word 0x926151d4 -//.word 0x043c6bc8 -//.word 0xa716d7de -//.word 0x9ae0cd3e -//.word 0xf3ab2d19 -//.word 0xb0c813ea -//.word 0xf12eacfb -//.word 0x641d492b -//.word 0x0001b2f0 -//.word 0xf699bd98 -//.word 0xe4581fd4 -//.word 0x4c0c8176 -//.word 0x46bdd77a -//.word 0x71d8ed43 -//.word 0x2f8d4228 -//.word 0x12751a2f -//.word 0x9178cf18 -//.word 0x00ee689e -//.word 0xbf046cf9 -//.word 0xb161f9a7 -//.word 0xef0a106c -//.word 0xbe833398 -//.word 0xbf383288 -//.word 0x661b426f -//.word 0xad8d4f57 -//.word 0x0a829362 -//.word 0x9ee06856 -//.word 0xaf295a58 -//.word 0x585a81f8 -//.word 0x7f130e6e -//.word 0x08f72323 -//.word 0x4856e874 -//.word 0xbd0adbb2 -//.word 0xfc9e676d -//.word 0xeab6b9f2 -//.word 0x2faacf12 -//.word 0xe875d125 -//.word 0x9ccea54f -//.word 0x7294be02 -//.word 0xa16f34c4 -//.word 0x27b51a33 -//.word 0xbe8a0c46 -//.word 0x0c4c07d5 -//.word 0x1a2e7d5c -//.word 0x0722a9fc -//.word 0xfefd21c2 -//.word 0x65d5aa2c -//.word 0x57ae4fe9 -//.word 0x5556b5e1 -//.word 0x388ea975 -//.word 0x6a6afb08 -//.word 0x56fb8fbe -//.word 0x1d2bb183 -//.word 0x8be7a950 -//.word 0x49848fa9 -//.word 0x545b616b -//.word 0xadb753c4 -//.word 0x53f26683 -//.word 0x6eda3c92 -//.word 0xcd592bc0 -//.word 0x925690c4 -//.word 0x2cd6667f -//.word 0x86671782 -//.word 0x7ebe91d0 -//.word 0x999f9de5 -//.word 0xf5fd6cf7 -//.word 0x7f63737b -//.word 0x65927aeb -//.word 0xcf6cefc7 -//.word 0xca107fda -//.word 0x8447e8be -//.word 0xbf1f08a2 -//.word 0x80d53a4b -//.word 0x07f8e359 -//.word 0x04cc48cc -//.word 0x08eda3c6 -//.word 0x3a347592 -//.word 0x4bde1de6 -//.word 0xacebaa65 -//.word 0xfec5ee68 -//.word 0xca22d3fe -//.word 0x722bf332 -//.word 0x67de628c -//.word 0x9db1ceda -//.word 0x3c78cb2f -//.word 0x9988682d -//.word 0x641d0680 -//.word 0x23f96aab -//.word 0xde4e1007 -//.word 0x1cdec208 -//.word 0x0f616ac3 -//.word 0x0c2725ad -//.word 0x3efe98a6 -//.word 0x9a568736 -//.word 0x15a3a316 -//.word 0x1503a4f2 -//.word 0x2621986d -//.word 0xef597b66 -//.word 0x641d0779 -//.word 0x3d97cdc9 -//.word 0xa68f85fd -//.word 0x3890a389 -//.word 0x28462b2f -//.word 0xbe2bc5c5 -//.word 0x09631438 -//.word 0xd2e344d1 -//.word 0xced9e2b7 -//.word 0x1748f1b6 -//.word 0xddf33a3e -//.word 0x597de3af -//.word 0x03ce43d3 -//.word 0x05b9f5ac -//.word 0xefdb2b71 -//.word 0xacc645d3 -//.word 0xb55fa384 -//.word 0x8484b7fa -//.word 0x4cf25e71 -//.word 0xe766702f -//.word 0x1003950b -//.word 0xd2f45b30 -//.word 0x4052861f -//.word 0x6748a8f3 -//.word 0x8175f1e9 -//.word 0x6c91471f -//.word 0x5a54999c -//.word 0xc9937191 -//.word 0xb6adc9de -//.word 0x0d2520d8 -//.word 0x6590cd4a -//.word 0xeab292ba -//.word 0x9ae474ed -//.word 0xb5b8caad -//.word 0x6ee095c9 -//.word 0xe74c0f5e -//.word 0x5c938755 -//.word 0x9f946b2d -//.word 0xc45da7fa -//.word 0x1d4c2dae -//.word 0x6973d598 -//.word 0x4841682a -//.word 0xf25ff7ff -//.word 0x29d9721d -//.word 0x6c7e7677 -//.word 0x6e8965b6 -//.word 0xc681bc38 -//.word 0xe85da159 -//.word 0x54ecbcf2 -//.word 0x0d744820 -//.word 0x4d9a6a47 -//.word 0x7781c156 -//.word 0x4d363e4c -//.word 0x634c36fb -//.word 0xd3c3b50b -//.word 0x332f1643 -//.word 0xc415d004 -//.word 0xec999316 -//.word 0xe75694a8 -//.word 0xb98e2591 -//.word 0x678388dc -//.word 0x66240584 -//.word 0x54ec3a7c -//.word 0xe608b3f2 -//.word 0x22b8bad5 -//.word 0xcef77095 -//.word 0x285e1d2a -//.word 0xd746c557 -//.word 0x222dfc30 -//.word 0x605bfada -//.word 0xafc4f292 -//.word 0xe931a0f0 -//.word 0xd49b226d -//.word 0x99d70824 -//.word 0x7879aed5 -//.word 0xb9f2ca2f -//.word 0xe6fb414f -//.word 0x37373f84 -//.word 0x4e138655 -//.word 0x24f206c5 -//.word 0x4487aed5 -//.word 0x3781834b -//.word 0x3f6eefb2 -//.word 0x48d95ba2 -//.word 0x1bb60041 -//.word 0xd501f90a -//.word 0x97a19dcd -//.word 0x80920df7 -//.word 0xd8430914 -//.word 0x8e3d0892 -//.word 0xe50687c8 -//.word 0x6a45a137 -//.word 0x2926e00f -//.word 0x200053f5 -//.word 0xf436e003 -//.word 0xe35bdc10 -//.word 0xfa99d932 -//.word 0x8853bf82 -//.word 0xd2091f1f -//.word 0x087cc376 -//.word 0x78138ac0 -//.word 0x027e73cb -//.word 0xcc99f7fe -//.word 0x37939c98 -//.word 0x114fc738 -//.word 0x0c0ad1a2 -//.word 0x6e3f5ec0 -//.word 0x0bc7eae7 -//.word 0x7045a55c -//.word 0x62c18117 -//.word 0x879389c6 -//.word 0x62837415 -//.word 0x852e7a2d -//.word 0x01ac667a -//.word 0x226fedb2 -//.word 0x596e3e13 -//.word 0x7a83daec -//.word 0x2712a65e -//.word 0x8cec3e64 -//.word 0x4e738d11 -//.word 0xbdfe9b19 -//.word 0x517fa593 -//.word 0x546373fd -//.word 0xdcb9e681 -//.word 0xfc97d176 -//.word 0x3bb9092a -//.word 0x456cc0df -//.word 0xe1aa0e13 -//.word 0x2387d105 -//.word 0xe3ccb774 -//.word 0x6ee199aa -//.word 0x7af00bb9 -//.word 0x60473105 -//.word 0x85fed402 -//.word 0x19dab43f -//.word 0x057220a4 -//.word 0x1e90c5f8 -//.word 0x9fdac4a5 -//.word 0xd6b207c0 -//.word 0x1d5ad444 -//.word 0x0c5ca29e -//.word 0xed292c6f -//.word 0x7000c58d -//.word 0xa111eb4b -//.word 0x16e31efa -//.word 0x6df3f3af -//.word 0xf69e6447 -//.word 0xac406aa9 -//.word 0x6a9ece4b -//.word 0x5b813bf8 -//.word 0xb3a499d0 -//.word 0x9cd09690 -//.word 0x73468513 -//.word 0x355d6c19 -//.word 0x346c5848 -//.word 0x0feaf470 -//.word 0xe0d45a13 -//.word 0xb74f2925 -//.word 0x488fd810 -//.word 0xe0f74afb -//.word 0x9e82a24c -//.word 0xdf61586b -//.word 0xfae68dc9 -//.word 0x2ea09b22 -//.word 0xd8c8f1ff -//.word 0xe9db1e7e -//.word 0x98892b55 -//.word 0x54ce2e15 -//.word 0xfd5f1cac -//.word 0x5347df2e -//.word 0xafd2a8d5 -//.word 0xf1aa8746 -//.word 0xb9403915 -//.word 0xda6d418c -//.word 0x0b5a3aa8 -//.word 0xe09d6b65 -//.word 0xf9a49c3b -//.word 0x7a5728e9 -//.word 0xbaf95471 -//.word 0x404fdf64 -//.word 0xeb05da5f -//.word 0x704dbad6 -//.word 0x0ac9ac10 -//.word 0x6cab2873 -//.word 0xfb1bc902 -//.word 0x3ad95c24 -//.word 0x852337a7 -//.word 0x03d9cc04 -//.word 0xd6df7de5 -//.word 0x94c3b2e4 -//.word 0xfb9f2996 -//.word 0xe0418ec8 -//.word 0x698a4c08 -//.word 0x7c14a268 -//.word 0x7717f97e -//.word 0x228e75af -//.word 0xe295caae -//.word 0x2f16513f -//.word 0x47a45b41 -//.word 0x24a7c5eb -//.word 0xacbacc56 -//.word 0x2951233b -//.word 0xf89f43ff -//.word 0x85b703ec -//.word 0x77f168c2 -//.word 0x278fbe6e -//.word 0x57a0e719 -//.word 0x2125f464 -//.word 0x2d73f2f2 -//.word 0x27d80628 -//.word 0x7081bd30 -//.word 0x149b9d44 -//.word 0xfdb90029 -//.word 0x667622f9 -//.word 0x925b7826 -//.word 0xbd0343bc -//.word 0x537c66e6 -//.word 0x60f174b4 -//.word 0x47860e1b -//.word 0xb8846c3e -//.word 0xdcb639eb -//.word 0xd213a469 -//.word 0x5f9cb471 -//.word 0xe188db7a -//.word 0x859fcf3a -//.word 0xbae49569 -//.word 0xe676dec8 -//.word 0x57b89762 -//.word 0x7cb0bc11 -//.word 0x55ad6d45 -//.word 0x282d4301 -//.word 0x76fde426 -//.word 0x2da2d5f4 -//.word 0x1ff890ce -//.word 0xb319d73d -//.word 0xda804738 -//.word 0x456f30a3 -//.word 0xd68da415 -//.word 0x54d4cede -//.word 0x62aa8549 -//.word 0xb24e211e -//.word 0x76768e6b -//.word 0x17379f84 -//.word 0x2a24a449 -//.word 0xa0ba3ea7 -//.word 0x3cfc7262 -//.word 0x4b5afd11 -//.word 0x8fd7e76a -//.word 0x7c6b5bbf -//.word 0xa7a6b6c9 -//.word 0x7b97dea5 -//.word 0x2decd51c -//.word 0xf35a8e27 -//.word 0x7140ffb2 -//.word 0x748777a1 -//.word 0xe3cc3211 -//.word 0xf3c12be0 -//.word 0x99d0316f -//.word 0x45023da6 -//.word 0xcd200339 -//.word 0xa718c72a -//.word 0x5ca17290 -//.word 0x3922e596 -//.word 0x48d08dc6 -//.word 0x7f173788 -//.word 0x363c26e5 -//.word 0xdf406391 -//.word 0xf1075529 -//.word 0x25ba91b9 -//.word 0xe569f381 -//.word 0x01f5eef9 -//.word 0xa52d2012 -//.word 0x88372abf -//.word 0x6532beb4 -//.word 0xaf19fa6d -//.word 0x81eaf473 -//.word 0xd40896db -//.word 0xf4deac0f -//.word 0x35c63bd1 -//.word 0xe129147c -//.word 0x76e7aa8d -//.word 0x0ef92163 -//.word 0x1f55a743 -//.word 0x6411079f -//.word 0x1bcc7b98 -//.word 0x714ac2c1 -//.word 0x3b5e7326 -//.word 0xe60d918d -//.word 0xb1f05ffb -//.word 0x19da767a -//.word 0x95bb141a -//.word 0x84c4b736 -//.word 0x64ccebf8 -//.word 0x44f3601f -//.word 0x7c853f00 -//.word 0x9b21becb -//.word 0xa11af310 -//.word 0x6f1de582 -//.word 0x7b14e9fa -//.word 0xc84b2cbf -//.word 0x16d18c04 -//.word 0x5622acb2 -//.word 0x60024768 -//.word 0xe8acc4c0 -//.word 0xae2c0bd5 -//.word 0xf60a9802 -//.word 0x3828cdec -//.word 0x18ed8dc2 -//.word 0x98a306c3 -//.word 0x8d1ece01 -//.word 0x509f3265 -//.word 0xb5f8cbf4 -//.word 0x41f05250 -//.word 0x97e8b482 -//.word 0x34bf69f6 -//.word 0x5cf402c7 -//.word 0x540a023e -//.word 0xd231ef95 -//.word 0xb222a900 -//.word 0xea4bfaee -//.word 0xc02c6d8b -//.word 0x3b01648a -//.word 0xd7a16523 -//.word 0x7ca6b557 -//.word 0xb1ce287b -//.word 0x0ea137f4 -//.word 0xef545340 -//.word 0x70ee7936 -//.word 0x95a9078e -//.word 0xc89bcea3 -//.word 0x89956878 -//.word 0x614ccbf9 -//.word 0x17b61f84 -//.word 0x27b7cda8 -//.word 0x70fdd92d -//.word 0x2d297154 -//.word 0x262fc65f -//.word 0x28ff1a54 -//.word 0xb2651aff -//.word 0xf12d6f36 -//.word 0xee8c9061 -//.word 0x07bbda39 -//.word 0x9ce5e2cf -//.word 0x0a430ad0 -//.word 0xdd865208 -//.word 0x41757126 -//.word 0xbad725bf -//.word 0x1593c795 -//.word 0x9f162218 -//.word 0x94f5852d -//.word 0xdad3172f -//.word 0xef866b33 -//.word 0x21755491 -//.word 0xfd44fba0 -//.word 0x09b42ec0 -//.word 0xb6c4fb9e -//.word 0x901d7eb3 -//.word 0xb8acf70e -//.word 0x94911f54 -//.word 0xc538bd05 -//.word 0x59c57400 -//.word 0x42b6df4a -//.word 0x07c3e00b -//.word 0xba0934d9 -//.word 0x2a684b39 -//.word 0x592a5763 -//.word 0x31e5a446 -//.word 0x72a227cc -//.word 0xef3e595f -//.word 0xfa1146ac -//.word 0x1dcee0a7 -//.word 0x0baa9acf -//.word 0xd5c132b3 -//.word 0x61b5ceb5 -//.word 0x19984b0e -//.word 0xe00cd212 -//.word 0x4aa8acb5 -//.word 0x0c9e574f -//.word 0xb19bd99c -//.word 0x8fef5407 -//.word 0xfaeedb28 -//.word 0xb796848b -//.word 0xb372beb3 -//.word 0xf5bde55e -//.word 0xd2cb140b -//.word 0x60a53bba -//.word 0x2df471f3 -//.word 0x30208b09 -//.word 0xffb8eda0 -//.word 0x4315a06d -//.word 0x693aa53d -//.word 0x9bff8939 -//.word 0xef6f3a68 -//.word 0xde6e1975 -//.word 0xf79f50b3 -//.word 0xd484665e -//.word 0x4ee71124 -//.word 0xed794be3 -//.word 0xa2baa7b5 -//.word 0xb918e62a -//.word 0x095bc5d4 -//.word 0x6e401a09 -//.word 0x79641fe4 -//.word 0x65640e8d -//.word 0x4d43eeba -//.word 0x9d0cac76 -//.word 0xc7b86d22 -//.word 0x375123b9 -//.word 0x88585e58 -//.word 0xf86566fd -//.word 0x190d868e -//.word 0xca08aa1e -//.word 0x66932d6d -//.word 0x3b14ecad -//.word 0x3efd9f8c -//.word 0xfcf2696e -//.word 0xd42eadfa -//.word 0x642324d9 -//.word 0x41602cba -//.word 0xebb8639a -//.word 0x00a17542 -//.word 0xafda3211 -//.word 0x7051e4fb -//.word 0xf243dfd2 -//.word 0x55a559c4 -//.word 0x9ac37c26 -//.word 0x5827ba70 -//.word 0xb0bc6188 -//.word 0x82336f43 -//.word 0xe1a6a729 -//.word 0xc57be478 -//.word 0x008cae6c -//.word 0x74840bbe -//.word 0x828c976a -//.word 0xc628d7b6 -//.word 0x015bcb70 -//.word 0x56128000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00007990 -//// expected output -//.word 0xc1644263 -//.word 0xab1ff816 -//.word 0xfb177436 -//.word 0x9156e8e7 -//.word 0x001e1a16 -//.word 0x4abc73f1 -//.word 0xbb4caede -//.word 0x515eb2cf -//.word 0x5708b216 -//.word 0x12f1ac47 -//.word 0x5e00483f -//.word 0x05528696 -//.word 0x03a7120c -//.word 0x0d3e5a4d -//.word 0x15380bb6 -//.word 0xd9aa9e82 -//// SHA512LongMsgvector_39 -//// vector length -//.word 0x00007CA8 -//// input message -//.word 0x349b0171 -//.word 0xe52c9de8 -//.word 0xe064c642 -//.word 0x953b9cee -//.word 0x4936a32e -//.word 0xc7461a1a -//.word 0x52ed88e9 -//.word 0xdfa2976c -//.word 0x817725db -//.word 0x25f999d4 -//.word 0x7f5773a1 -//.word 0x44c728ba -//.word 0x9a262c8a -//.word 0xcdde5076 -//.word 0x430d4e1c -//.word 0xb2e4a2d8 -//.word 0x904d9c8d -//.word 0xcbd0b4a2 -//.word 0xbbb71d4a -//.word 0x55709d09 -//.word 0xa1349b74 -//.word 0x6ee67a38 -//.word 0x443e255d -//.word 0x9a26ebcc -//.word 0x49648e0f -//.word 0x417a9659 -//.word 0x7acaebc6 -//.word 0x2efea3e3 -//.word 0x46a71971 -//.word 0x12243f66 -//.word 0x3cc63535 -//.word 0xff321a4f -//.word 0x940622ea -//.word 0xedbfe801 -//.word 0xa6da069c -//.word 0x3939e451 -//.word 0x71c9cd0b -//.word 0x2162480a -//.word 0x15eea52b -//.word 0x49ced66a -//.word 0x597980a5 -//.word 0x396652a3 -//.word 0x262d9654 -//.word 0xdce9055a -//.word 0x0ae0e0c9 -//.word 0x03663c2b -//.word 0xb6fe9ec8 -//.word 0xe0c3c724 -//.word 0x8006d1c8 -//.word 0x8c397b45 -//.word 0xe20bc277 -//.word 0x81d5b107 -//.word 0xf9357933 -//.word 0x20f8c4d2 -//.word 0x073e4792 -//.word 0x2cd89685 -//.word 0xf1f53ddc -//.word 0x4dfe0cf2 -//.word 0xc2beb28c -//.word 0x8fc68e5f -//.word 0x2610c1d2 -//.word 0xe0e28806 -//.word 0xf0f5c913 -//.word 0x96d7eb95 -//.word 0x958eeb68 -//.word 0xe67eacaf -//.word 0xae8d8f1b -//.word 0x6e84446a -//.word 0x79b8e02d -//.word 0xaceb2fcf -//.word 0x596d4bd3 -//.word 0x84866d5d -//.word 0x521904f4 -//.word 0xbe810486 -//.word 0x8ebf81ac -//.word 0x85d77c30 -//.word 0xdb77fdcd -//.word 0xeada6235 -//.word 0x2aecf659 -//.word 0x5fafc5e4 -//.word 0x11ddaf08 -//.word 0x3dcfbc7e -//.word 0x4a9dafc8 -//.word 0x3e87deba -//.word 0x32934038 -//.word 0x0478c841 -//.word 0x4bbbf12d -//.word 0x90189b32 -//.word 0xbb23152d -//.word 0xcb2f7b9f -//.word 0xca6f42f6 -//.word 0x005b110f -//.word 0x6855d2f8 -//.word 0x608d0afa -//.word 0xa42265d7 -//.word 0x7d8a9650 -//.word 0x36335dea -//.word 0xd06ae9f2 -//.word 0xf77d61bf -//.word 0x341cbe37 -//.word 0x6305db95 -//.word 0x68e1cf69 -//.word 0x1e687adf -//.word 0x90cc5e45 -//.word 0x6c55b0c8 -//.word 0xb448af7e -//.word 0xb70e35aa -//.word 0x40928c3b -//.word 0x0deb8295 -//.word 0x823bc094 -//.word 0x9fd757ce -//.word 0x30a89c19 -//.word 0x43d1364e -//.word 0xdf91754c -//.word 0xf36be63f -//.word 0x8d852422 -//.word 0x4c4ff082 -//.word 0x18648485 -//.word 0x10b5252c -//.word 0xc4e4f8d5 -//.word 0xa5ee1604 -//.word 0xba0de262 -//.word 0x94dd9b06 -//.word 0x83bd2df4 -//.word 0x0a784de3 -//.word 0x9125c444 -//.word 0x5a4b0b7f -//.word 0xb6491980 -//.word 0x79f57972 -//.word 0xab849fca -//.word 0x80aa7c88 -//.word 0x8a0150b9 -//.word 0x2eafc041 -//.word 0x554428d7 -//.word 0x63e13251 -//.word 0x6d9fa822 -//.word 0xa72e8621 -//.word 0x1bbd548c -//.word 0xa11ab24c -//.word 0x0b1b357a -//.word 0xa03c7123 -//.word 0xcc895748 -//.word 0x15bfc229 -//.word 0x51ae4cc4 -//.word 0x16e16698 -//.word 0x7381a8ae -//.word 0xdd7765da -//.word 0x6cd1833f -//.word 0x48678911 -//.word 0x5ebefa9f -//.word 0x572ce290 -//.word 0xca3dae6c -//.word 0xb056405f -//.word 0x1998433a -//.word 0x1e07bcbb -//.word 0x17ece20e -//.word 0x0e783093 -//.word 0x73a9b8e2 -//.word 0x1072ba0d -//.word 0x40167525 -//.word 0x5cd53dff -//.word 0x77cace37 -//.word 0x4b14e076 -//.word 0x7234fcf1 -//.word 0xdab68d32 -//.word 0x73143a1b -//.word 0x2ad77328 -//.word 0x1bff4af4 -//.word 0x02a585ff -//.word 0xf3dff1ae -//.word 0x4ce4f993 -//.word 0xe77076ef -//.word 0x946ac975 -//.word 0xc6c52851 -//.word 0x8ca43569 -//.word 0xc3c1d5e3 -//.word 0x8b0f3fe7 -//.word 0xf79e53a6 -//.word 0x09bf2e9b -//.word 0xdd6afb10 -//.word 0x24dc0be5 -//.word 0xd484298d -//.word 0x1e202759 -//.word 0xa124bdf9 -//.word 0xdd5b9440 -//.word 0xead09d27 -//.word 0x69efa715 -//.word 0xbce8315d -//.word 0x72547c08 -//.word 0x051be5d6 -//.word 0xc895727f -//.word 0x1befab3e -//.word 0xe1d1ab90 -//.word 0x343d763a -//.word 0x57bb8d89 -//.word 0xebb3c0dd -//.word 0x661a4469 -//.word 0xc2500534 -//.word 0x72493d63 -//.word 0x9aec46bb -//.word 0x7fb8ad62 -//.word 0x3dad87e5 -//.word 0xb86a087f -//.word 0xd4935199 -//.word 0xe9758a8d -//.word 0x71ed31af -//.word 0x0485b18e -//.word 0x87e13777 -//.word 0xa05ac13b -//.word 0x6ce87832 -//.word 0x75453f80 -//.word 0xde4f8c97 -//.word 0xe1af76fe -//.word 0x7cb81050 -//.word 0x6691f687 -//.word 0x4897257a -//.word 0x2afd10a5 -//.word 0x2bb5f029 -//.word 0x76945b13 -//.word 0x71b118e1 -//.word 0x380e3243 -//.word 0x497a4b1e -//.word 0x81b533d6 -//.word 0x47d6b9cd -//.word 0x07eac127 -//.word 0xe2de97d1 -//.word 0xa39f83c1 -//.word 0xf57f9e7f -//.word 0xd4dbe3e4 -//.word 0x42fa8921 -//.word 0x3b399104 -//.word 0xea659b77 -//.word 0x1d69fd4a -//.word 0xf7291632 -//.word 0xe4ade011 -//.word 0xd282c577 -//.word 0x9f5db469 -//.word 0xcd027362 -//.word 0x7d643798 -//.word 0x9b0e7280 -//.word 0x56c1ec94 -//.word 0xd35f1554 -//.word 0x22079a8b -//.word 0x718236d3 -//.word 0x7fdecb5b -//.word 0x5458b1e8 -//.word 0x30804d1a -//.word 0xc197e6f1 -//.word 0x983cb58f -//.word 0xde483b40 -//.word 0x43f6d8b7 -//.word 0x3847989b -//.word 0x5ea45042 -//.word 0x3ec5eabc -//.word 0x3ad3fd13 -//.word 0xc3c9a1d1 -//.word 0xcd2081c3 -//.word 0x80ab31fd -//.word 0x31c0c21e -//.word 0x909894d5 -//.word 0x23f86ca4 -//.word 0xf311c6e4 -//.word 0x85a66d0a -//.word 0x0b6c4828 -//.word 0xdcb677b7 -//.word 0x22519f93 -//.word 0xd2ad8147 -//.word 0xe23ed28b -//.word 0xb622460b -//.word 0xdb04ef6a -//.word 0xf740c587 -//.word 0x004886ff -//.word 0xad46c0f3 -//.word 0x2a032b0b -//.word 0x10073dba -//.word 0x9402f9c4 -//.word 0xff6a08fe -//.word 0x5e660a55 -//.word 0x7aeb2e12 -//.word 0x0a24005d -//.word 0x281883ff -//.word 0x0287806c -//.word 0xd2141d00 -//.word 0x10aab189 -//.word 0xe518d706 -//.word 0xe4fec2ae -//.word 0xf5edd034 -//.word 0x91ca614a -//.word 0x3573e964 -//.word 0x10a544be -//.word 0xff1e4aa0 -//.word 0xbcfea4e1 -//.word 0x5373deaa -//.word 0xd595bc7c -//.word 0x4f8fd274 -//.word 0xfd004fce -//.word 0xbca11aa9 -//.word 0xbe272009 -//.word 0x816bec22 -//.word 0x02c878d4 -//.word 0x2ec44272 -//.word 0x99f3a3c7 -//.word 0x72195c5b -//.word 0xb78f72f2 -//.word 0xa5e83d56 -//.word 0x73d3bb56 -//.word 0x3f432a0f -//.word 0x49ced56a -//.word 0x5f532ee6 -//.word 0x98e01d98 -//.word 0x45d39870 -//.word 0x253f74bd -//.word 0xd8917af3 -//.word 0x9673beac -//.word 0x21f02cee -//.word 0xf8d964ac -//.word 0xce68c88f -//.word 0x3a24d2f6 -//.word 0xb004ac3b -//.word 0xb0d7fa38 -//.word 0x3de3fa09 -//.word 0x91cdd014 -//.word 0x0fb91b47 -//.word 0x79b1cca1 -//.word 0x634b38f4 -//.word 0xe8866ce9 -//.word 0x9bf6c044 -//.word 0xc021af69 -//.word 0xbd28e51f -//.word 0xcbaa9a95 -//.word 0xf1e51fa3 -//.word 0x331eb651 -//.word 0x0743a79d -//.word 0x08d09079 -//.word 0xeeeffd14 -//.word 0xbee3385a -//.word 0x3ea663be -//.word 0xacd1c337 -//.word 0xafbd5f88 -//.word 0x8ee8cac5 -//.word 0xa09a3d13 -//.word 0x04c8e8af -//.word 0x91388a32 -//.word 0x10e64013 -//.word 0xa9a79a6d -//.word 0x9c0cf402 -//.word 0x32890481 -//.word 0xf2d6af04 -//.word 0x179621dd -//.word 0x42371c92 -//.word 0x6d199026 -//.word 0x20f26d9a -//.word 0xe771b5b4 -//.word 0x0321d5ff -//.word 0x60913513 -//.word 0xc7b20e16 -//.word 0x55807c83 -//.word 0x2ce4d42a -//.word 0x68d93779 -//.word 0x55cf67f9 -//.word 0xdf4cda1b -//.word 0x49d90d35 -//.word 0x221c1bc8 -//.word 0x75428e04 -//.word 0x41a0758e -//.word 0x2899b780 -//.word 0x6bc2a6b2 -//.word 0x1644d738 -//.word 0x7882322b -//.word 0xd6fc45ad -//.word 0x6173dd27 -//.word 0x644fd8d5 -//.word 0xc23d3585 -//.word 0xa01c6d9b -//.word 0x5f1a0659 -//.word 0xcd1a655d -//.word 0x9c5ae46b -//.word 0x1352246d -//.word 0x03dfa5b8 -//.word 0xfda09391 -//.word 0xc2a0e3f0 -//.word 0xfb369f84 -//.word 0x2a2a7ef6 -//.word 0xe119b872 -//.word 0x321b1864 -//.word 0x66a2537f -//.word 0xf1a69804 -//.word 0xa6ff6841 -//.word 0x2812a858 -//.word 0xa1aff541 -//.word 0xb63a3712 -//.word 0xba09797e -//.word 0x210ef89c -//.word 0x38b679ea -//.word 0x1410e092 -//.word 0xc832ffec -//.word 0xdcd9ac43 -//.word 0xfa4f16dc -//.word 0xe9925934 -//.word 0xc0b24f8a -//.word 0x537ba99d -//.word 0xf2543fb7 -//.word 0x5367a5ea -//.word 0xcc02ff9a -//.word 0xc53d163c -//.word 0x6edeab5c -//.word 0xad790be5 -//.word 0x5bdce39d -//.word 0xafaa56ef -//.word 0xfa454ded -//.word 0x95f10e95 -//.word 0x18371153 -//.word 0xcd880ec8 -//.word 0x65235bca -//.word 0xe93975ac -//.word 0xf34eddbf -//.word 0x1de22518 -//.word 0xba514a94 -//.word 0xc4f8441a -//.word 0x1699dc20 -//.word 0xdb00be71 -//.word 0x47e7cf2d -//.word 0x8518c011 -//.word 0xf0d1e4f8 -//.word 0x856c3ea2 -//.word 0x983fdfb5 -//.word 0xc7c26f01 -//.word 0x2def0908 -//.word 0xd8ef4cbe -//.word 0x7cf2ae8d -//.word 0x685f149c -//.word 0xba2da051 -//.word 0xcf90ca15 -//.word 0xfed9b357 -//.word 0x8697b5d3 -//.word 0xc4033f14 -//.word 0xaa9be037 -//.word 0x6c0ca1f3 -//.word 0x7c5598d6 -//.word 0xb92abad1 -//.word 0xe496f1f7 -//.word 0x53e56f82 -//.word 0xe9c14117 -//.word 0x459b274b -//.word 0x3a4da365 -//.word 0x7ffd5065 -//.word 0xa8447546 -//.word 0x558fda81 -//.word 0xaac6dad2 -//.word 0xff2cba3e -//.word 0xd8873955 -//.word 0x178068b5 -//.word 0x704cbccf -//.word 0x1e8c62ee -//.word 0xd472d275 -//.word 0xf726a767 -//.word 0x0a68ae2d -//.word 0x6a763d94 -//.word 0x3b30c616 -//.word 0xa27aab5a -//.word 0x34e254fe -//.word 0xaf838093 -//.word 0xe828d8e9 -//.word 0x05b5ca8d -//.word 0xecc39491 -//.word 0xfc8b9f8b -//.word 0xfa050fe0 -//.word 0x4e519843 -//.word 0x6f559378 -//.word 0x9ca8515e -//.word 0xcdaeaf2c -//.word 0xe905eafb -//.word 0x3920b585 -//.word 0x1d32892c -//.word 0xfd4e3d3e -//.word 0x83ccd677 -//.word 0x07eea0c7 -//.word 0x4bc47e56 -//.word 0x694c7ec6 -//.word 0x09deb0b8 -//.word 0xd7c73991 -//.word 0x3535a37e -//.word 0x2c5377b5 -//.word 0xa9b40efe -//.word 0xe6f5a472 -//.word 0x269eae83 -//.word 0xa54a6d3d -//.word 0xcf08c4cc -//.word 0xb000473d -//.word 0xac5a9489 -//.word 0x705be6cf -//.word 0x28d1e7e1 -//.word 0xf2b2c602 -//.word 0x93008aee -//.word 0x6aefa61b -//.word 0xa24acd3f -//.word 0xab130712 -//.word 0xea6a0555 -//.word 0xafafb113 -//.word 0x68eb0a27 -//.word 0x156c2ffe -//.word 0xfcb0b99e -//.word 0x9e854ee7 -//.word 0xe96d7419 -//.word 0xaf47a297 -//.word 0x572c9deb -//.word 0xd3980209 -//.word 0xd2ca1ed8 -//.word 0x366d06ee -//.word 0xc877e49b -//.word 0x2a52902a -//.word 0x0e3a6063 -//.word 0xa6e64055 -//.word 0x5b6a0552 -//.word 0xc25cfe3a -//.word 0xcc35ccfd -//.word 0x3dfb745b -//.word 0x5f1db3ee -//.word 0xf79f926b -//.word 0x78763925 -//.word 0x773608d2 -//.word 0x5feae492 -//.word 0x6643cf2d -//.word 0xbff6bc9c -//.word 0x115fa1cc -//.word 0x296acd9e -//.word 0xecb37c32 -//.word 0x8feca965 -//.word 0x0a802398 -//.word 0xc975e3b4 -//.word 0xa5979d6a -//.word 0x14d395c0 -//.word 0x9ce1b4c9 -//.word 0x8e26dbb3 -//.word 0xf0d87708 -//.word 0xbb63562d -//.word 0x470bb92f -//.word 0x03d3aabe -//.word 0x699e8f7a -//.word 0x3195006e -//.word 0xc5c8d6da -//.word 0xf6188436 -//.word 0xed54ab73 -//.word 0x64a2e884 -//.word 0x1621f11d -//.word 0x73cce0bb -//.word 0x99a2cee4 -//.word 0x8004a4b0 -//.word 0x745e2e88 -//.word 0xc909712e -//.word 0xca703ffd -//.word 0xf2720873 -//.word 0x5f08f3ec -//.word 0x83282db0 -//.word 0x1de98130 -//.word 0x67e72a8d -//.word 0x91e9e55a -//.word 0x6fc14aa3 -//.word 0x6f745b2e -//.word 0xcd9b5e00 -//.word 0x0a09e823 -//.word 0x9aae3ba7 -//.word 0xddbbd1e7 -//.word 0x5007390e -//.word 0x05b222d9 -//.word 0x5008b69e -//.word 0xc4a8298d -//.word 0x5de59136 -//.word 0xff6cf84b -//.word 0x1f27afa7 -//.word 0xc062e690 -//.word 0xa22d7a39 -//.word 0xb6010e8b -//.word 0xd4a65d25 -//.word 0xb053cea2 -//.word 0x0b184a1a -//.word 0x26794aeb -//.word 0x7c5c34b9 -//.word 0xb025e7b3 -//.word 0xc51f9418 -//.word 0x8d1ed1fa -//.word 0x6462e843 -//.word 0x1ebf75f5 -//.word 0x3dfb30b6 -//.word 0x6778078b -//.word 0x181270e4 -//.word 0x954bfdd9 -//.word 0x21a630b3 -//.word 0x725092ae -//.word 0x6605fffd -//.word 0xf332440f -//.word 0x5c57ec11 -//.word 0xabb056b4 -//.word 0x5b140b30 -//.word 0x551d4f89 -//.word 0x1e89f610 -//.word 0x4ee0792e -//.word 0x4457495d -//.word 0x18f56377 -//.word 0xd1f42533 -//.word 0xd86a60ec -//.word 0xad29aea5 -//.word 0xd9e3064b -//.word 0x24928d39 -//.word 0x0716af02 -//.word 0x64206f6a -//.word 0x7550fbb5 -//.word 0x039a8425 -//.word 0xd8ee4cbe -//.word 0x7618014c -//.word 0x09e549a7 -//.word 0x9b879e36 -//.word 0x873a5cb2 -//.word 0x3028182c -//.word 0xf28a3452 -//.word 0x5911b0ee -//.word 0x918443af -//.word 0x1eaaab2c -//.word 0xcd6a4126 -//.word 0xeb31d00d -//.word 0xb494a7c6 -//.word 0x0e37edac -//.word 0x78ed35d5 -//.word 0x3d205296 -//.word 0xed746d49 -//.word 0x0da7554d -//.word 0x0ebc154f -//.word 0x7c58ccc8 -//.word 0x786cb9c7 -//.word 0x681496f1 -//.word 0xedbf27c6 -//.word 0x16911226 -//.word 0xd305f113 -//.word 0xacd7a6b8 -//.word 0xb221eeaa -//.word 0xb6c43a6f -//.word 0xba09ba3d -//.word 0xa588ba03 -//.word 0x3b4931ae -//.word 0x4b2a97a5 -//.word 0x2a80f895 -//.word 0x61014774 -//.word 0xa3e2f4c0 -//.word 0x023cc008 -//.word 0x62b4d1ae -//.word 0x2d5b01eb -//.word 0x48d37c13 -//.word 0x46b48a1b -//.word 0xdc2da958 -//.word 0x95efdf89 -//.word 0xc7464e18 -//.word 0xc689099d -//.word 0x57b526a4 -//.word 0x685515b0 -//.word 0xfea53080 -//.word 0x6ef69290 -//.word 0xd0542de3 -//.word 0xb1671700 -//.word 0x0897253b -//.word 0x6b73bb35 -//.word 0x8354e2a6 -//.word 0xbe3d9b5a -//.word 0x4306747a -//.word 0x2bba580d -//.word 0xee3dabbe -//.word 0x1b3297e0 -//.word 0x4d1ba0af -//.word 0x5ac27fd9 -//.word 0xcdd92d3d -//.word 0x97dd3ef2 -//.word 0x0140708b -//.word 0xe5c68499 -//.word 0x1e304c72 -//.word 0x3d180631 -//.word 0x7d1ce8fe -//.word 0xfa3efc90 -//.word 0x1d8b2eef -//.word 0x5bfba47f -//.word 0x1f994d3a -//.word 0x04e3bd3d -//.word 0x48743886 -//.word 0x7ee00cfc -//.word 0x82e024af -//.word 0xb2afdb62 -//.word 0x5bb30e47 -//.word 0x72607509 -//.word 0x855a330f -//.word 0xf0d9ab00 -//.word 0x54529682 -//.word 0x45545248 -//.word 0x43b07d4b -//.word 0xecdcc357 -//.word 0x6f99f4ca -//.word 0x44d45a99 -//.word 0x1bca4993 -//.word 0x1270f7ea -//.word 0x2a128eef -//.word 0xfc3a801d -//.word 0xa8d31b59 -//.word 0x0f8e5d78 -//.word 0x42850902 -//.word 0x391ffa35 -//.word 0xc933b84d -//.word 0xd0704903 -//.word 0xb3fc4a54 -//.word 0x0a5b3e83 -//.word 0x99932561 -//.word 0x838d51cc -//.word 0xbabf7576 -//.word 0xba08ffe8 -//.word 0x77dba7c6 -//.word 0x93a04854 -//.word 0xd557ef39 -//.word 0xd77f3283 -//.word 0xfe36c4ec -//.word 0xafa1465b -//.word 0xc08e5fae -//.word 0x2d580eb7 -//.word 0x0d0b3f84 -//.word 0xc4c99de4 -//.word 0x796da826 -//.word 0xcb6d0724 -//.word 0xbf051f81 -//.word 0xfd92e42e -//.word 0x3d3cef33 -//.word 0xfcd7d2ac -//.word 0x730ba811 -//.word 0xc9b3f0bb -//.word 0x88849ba4 -//.word 0x4eef636f -//.word 0xc5485fa8 -//.word 0xd427d44c -//.word 0x170f4f8c -//.word 0x8d4df0ce -//.word 0x912309f5 -//.word 0x0c26e8e2 -//.word 0xe8e5f03a -//.word 0xc8cbef6a -//.word 0xf647abe9 -//.word 0x9c29bebd -//.word 0x3850a441 -//.word 0x4a821325 -//.word 0x4f9b8ab6 -//.word 0xf3ea2d60 -//.word 0x83d8d071 -//.word 0xa1ca521f -//.word 0x3b492ccd -//.word 0xbe61498a -//.word 0x864619db -//.word 0x9a3ee1ba -//.word 0x96ba55de -//.word 0xe8c6683d -//.word 0x3fa463d0 -//.word 0x41b43496 -//.word 0x7d9809db -//.word 0xa0941eba -//.word 0xeb3bd3e1 -//.word 0xe4480294 -//.word 0x4cca8ff5 -//.word 0x52844182 -//.word 0x0693d0df -//.word 0x10513fd6 -//.word 0xa27a6b9c -//.word 0xab8de555 -//.word 0x4e75fddb -//.word 0x92691fbb -//.word 0x5b116381 -//.word 0x99ea5f36 -//.word 0xbfeb4026 -//.word 0x776919e7 -//.word 0x93387a96 -//.word 0x47134564 -//.word 0x963dbd51 -//.word 0x0b69e038 -//.word 0xa9d8f70c -//.word 0x24c16b61 -//.word 0x52f5da2e -//.word 0xdcc36ad1 -//.word 0x39195d53 -//.word 0xddede6ee -//.word 0xaddb3bcc -//.word 0xb710ec12 -//.word 0x2066731d -//.word 0x5dd00c0b -//.word 0xa6f9c77e -//.word 0xa828db9c -//.word 0x7b673d5b -//.word 0xd3e471fb -//.word 0x7a97a1d4 -//.word 0xfe25ec51 -//.word 0xa705003d -//.word 0xabe1eb3d -//.word 0xa53f2e9e -//.word 0x44601351 -//.word 0x40684134 -//.word 0x93c08e94 -//.word 0xe5b914ef -//.word 0x487287fe -//.word 0x25fbc6f2 -//.word 0x76baafff -//.word 0x360e3817 -//.word 0x1633bbf8 -//.word 0x72669268 -//.word 0x8349e4bf -//.word 0xd688bea7 -//.word 0xfdbd6620 -//.word 0x8491ecc7 -//.word 0x27240157 -//.word 0x41b00c70 -//.word 0x88697b97 -//.word 0xf8a7577f -//.word 0x0d461c86 -//.word 0x354dc783 -//.word 0x85cf30bf -//.word 0xab0f9a41 -//.word 0x24e7894f -//.word 0xaf6bd431 -//.word 0x01c9fa38 -//.word 0xba74b9ff -//.word 0x9881ddf1 -//.word 0xea51570b -//.word 0x48708ee3 -//.word 0x82bdfaea -//.word 0xd6cbeeee -//.word 0x6688b5e3 -//.word 0xe91ce1e2 -//.word 0xa014e072 -//.word 0x8bc0d007 -//.word 0xded994c8 -//.word 0xaf672895 -//.word 0xf1e23149 -//.word 0xa598d93c -//.word 0x4f4ed90d -//.word 0xa72ad79e -//.word 0x92d1f35f -//.word 0x50cc9dd0 -//.word 0xf730a941 -//.word 0x207ea5dc -//.word 0xe0c86ae6 -//.word 0xfa15f142 -//.word 0x52076837 -//.word 0xa5bb8573 -//.word 0x78f11b4f -//.word 0x4e6deb54 -//.word 0x1e9dbcfe -//.word 0x047baec1 -//.word 0x37b5cb4a -//.word 0x3b0bdf07 -//.word 0x58f989e9 -//.word 0x4a979369 -//.word 0x3abd7fc9 -//.word 0xed6a629c -//.word 0x3c67f688 -//.word 0xc427ea4b -//.word 0xdef27cfc -//.word 0xd2434a93 -//.word 0x476e65ac -//.word 0xfe85a888 -//.word 0xc07d4855 -//.word 0x958dabaf -//.word 0x37d77e66 -//.word 0xc64a0282 -//.word 0xbdc7a684 -//.word 0x2582dbef -//.word 0x09ac2407 -//.word 0x294f6cd9 -//.word 0xf2799d7b -//.word 0xae9c6e95 -//.word 0xf9357d20 -//.word 0x74ac9d6e -//.word 0xbd7b716b -//.word 0x9e933a22 -//.word 0x84fbed83 -//.word 0x33bb8963 -//.word 0xb9f8a7c4 -//.word 0xa0605257 -//.word 0x68c91a3f -//.word 0x35146418 -//.word 0xc4580438 -//.word 0xa33d0e34 -//.word 0xa2a5e8a6 -//.word 0x8592a42e -//.word 0xfb448db7 -//.word 0xd4a100fc -//.word 0x6eda7e4a -//.word 0x704cfe87 -//.word 0xbba48873 -//.word 0x9e47ff2e -//.word 0x49f13ffb -//.word 0x859b6843 -//.word 0xa2a378dd -//.word 0xb027208c -//.word 0xf2b1d0c9 -//.word 0x8f1a15c3 -//.word 0x8ba824a5 -//.word 0xf67ab717 -//.word 0x63261707 -//.word 0x9ca07aa9 -//.word 0x945e90bc -//.word 0x9db95910 -//.word 0xdb973945 -//.word 0xf9474ed5 -//.word 0x1aac0155 -//.word 0x139edbf7 -//.word 0xd78d9b54 -//.word 0x32678568 -//.word 0xbbbcfcde -//.word 0x0421538e -//.word 0x13d2e145 -//.word 0x169b53c4 -//.word 0x52f8460b -//.word 0x5d7b16d7 -//.word 0x8d6ef069 -//.word 0xb0ba2f89 -//.word 0xfd07e5cb -//.word 0x4b25b711 -//.word 0x81aaef51 -//.word 0x4eddcc98 -//.word 0x1ad31c4f -//.word 0x3cd80dbe -//.word 0x6d1141ce -//.word 0x7c5f2013 -//.word 0x44857209 -//.word 0xdc8e2d9e -//.word 0x0d698bf1 -//.word 0x09d7605a -//.word 0x5987abaa -//.word 0x187e6bb4 -//.word 0x5fbdb40c -//.word 0x001e010e -//.word 0x7780cc22 -//.word 0x1d235c3f -//.word 0x9f55dfae -//.word 0xaf4fb811 -//.word 0xf95a1aa3 -//.word 0x5936d6c1 -//.word 0x4bbb71aa -//.word 0xa3c17a83 -//.word 0x7e3e1a9e -//.word 0x78aeedfb -//.word 0x1fb8100f -//.word 0xa80e7cc5 -//.word 0xe19592c3 -//.word 0x67c6f6ee -//.word 0x1954a130 -//.word 0xcc0e3279 -//.word 0x41088503 -//.word 0x54f587db -//.word 0x75d8499d -//.word 0x5cdc537e -//.word 0xf97f3a90 -//.word 0xaaf67542 -//.word 0xb1cd6c26 -//.word 0xe5cfd2f8 -//.word 0xa72535db -//.word 0x18c2d3e5 -//.word 0x8afeb0de -//.word 0x3480e545 -//.word 0x29623b94 -//.word 0x8b90f8c6 -//.word 0xfb71f915 -//.word 0x55ca0108 -//.word 0x9adf51ad -//.word 0x2edb7923 -//.word 0x44716d5c -//.word 0x96c4db21 -//.word 0x5984bc57 -//.word 0x705a2a80 -//.word 0xe0877185 -//.word 0x84c868b2 -//.word 0x027c0202 -//.word 0xfd08209d -//.word 0x8c7ba99f -//.word 0xeb6edd1b -//.word 0x712fe660 -//.word 0xc21eb07a -//.word 0x4656fbfc -//.word 0xda90affd -//.word 0xc5456f61 -//.word 0xed13705a -//.word 0x4b628c2d -//.word 0x9c47923a -//.word 0x59a9e137 -//.word 0xeaa235bc -//.word 0x1727c004 -//.word 0xbfec7df2 -//.word 0xcc82c152 -//.word 0x66c21362 -//.word 0x676f3d90 -//.word 0x0f17a386 -//.word 0xfa3ad464 -//.word 0x4eaf5f4c -//.word 0x3942e824 -//.word 0x9ba27a97 -//.word 0xff7b1f5d -//.word 0xd0dfaebd -//.word 0xcaeae550 -//.word 0xae800000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00007CA8 -//// expected output -//.word 0x27aa551d -//.word 0xfa2fb1c0 -//.word 0xf4504f9b -//.word 0xdfa68e50 -//.word 0xb4693d93 -//.word 0x27612a3f -//.word 0xe8984c00 -//.word 0xd05d9cf6 -//.word 0xd3a0a8d0 -//.word 0x223ee595 -//.word 0x7504ea56 -//.word 0xa228e98a -//.word 0xcc6954fe -//.word 0x35c7a577 -//.word 0xba6be19a -//.word 0xbddc5dd0 -//// SHA512LongMsgvector_40 -//// vector length -//.word 0x00007FC0 -//// input message -//.word 0xc8e2e364 -//.word 0x03ad4ff9 -//.word 0xf60010cb -//.word 0x877a5713 -//.word 0x9ac1463a -//.word 0x8522059c -//.word 0xc377128d -//.word 0xec4ed899 -//.word 0xe4478410 -//.word 0x53be14c3 -//.word 0x56aab008 -//.word 0x75c53e04 -//.word 0xd4ee3129 -//.word 0xadcba1fd -//.word 0xfdb2a11d -//.word 0x7ecacd82 -//.word 0xd66d2204 -//.word 0x0ed1131c -//.word 0x45e8d8ee -//.word 0xa6840a87 -//.word 0x97bf6d63 -//.word 0x339a0d32 -//.word 0xfbe48cdb -//.word 0xc85ebac2 -//.word 0x051c6647 -//.word 0x1a2e748f -//.word 0x2b803086 -//.word 0x03ffe224 -//.word 0x4bfda3f0 -//.word 0x00d76ec3 -//.word 0x24d57acf -//.word 0xb351c7df -//.word 0xd81cf7e0 -//.word 0x611d60a1 -//.word 0x713b5fd7 -//.word 0x747eef64 -//.word 0x58707ad9 -//.word 0xfbcaef39 -//.word 0xdf4c1400 -//.word 0x25ed1e63 -//.word 0xb9347fda -//.word 0xcae6ffdc -//.word 0x7de10ee9 -//.word 0xe24858ce -//.word 0x27e09b25 -//.word 0x0bbab51b -//.word 0x96130276 -//.word 0x0778e4d6 -//.word 0x0f2ea33a -//.word 0x3cd078c7 -//.word 0xb83ae4c5 -//.word 0x33a646eb -//.word 0x1e15addc -//.word 0x1af1ebf1 -//.word 0xb0f0eb39 -//.word 0x423b44be -//.word 0x41d00d0a -//.word 0xa124f4ea -//.word 0x8a0d8a72 -//.word 0x51e0e141 -//.word 0xa6d65907 -//.word 0x0fb5b744 -//.word 0x95ac7752 -//.word 0xbc7e64a5 -//.word 0xb9e36552 -//.word 0xe02b9ace -//.word 0x5c24a7f8 -//.word 0x223e505a -//.word 0x28ed47ac -//.word 0xd14f419a -//.word 0xac0f4fc8 -//.word 0x5f896c12 -//.word 0xde2e5218 -//.word 0xe12a93fa -//.word 0x9445e460 -//.word 0x9007bcbe -//.word 0x0a201ed6 -//.word 0x4a07b27e -//.word 0x5fe01ba3 -//.word 0x12a3858e -//.word 0x187b7d66 -//.word 0x8c6c06f6 -//.word 0x9c39e9b1 -//.word 0x82854cf3 -//.word 0xb638868a -//.word 0x61243275 -//.word 0x15e982eb -//.word 0xbc15d7a0 -//.word 0xcf908e43 -//.word 0xc9381c4b -//.word 0xdac85df3 -//.word 0xdffe2983 -//.word 0x92fd29d2 -//.word 0xfef0e809 -//.word 0x37f02da9 -//.word 0x472889d0 -//.word 0x6b362cb8 -//.word 0x80d5fc80 -//.word 0xb8b9e92f -//.word 0x91bb7af6 -//.word 0x0836acb5 -//.word 0x09b1fdc1 -//.word 0x2bbec4e5 -//.word 0x9a21c3a6 -//.word 0x5435ffcb -//.word 0x998cd01d -//.word 0x9cd6346c -//.word 0x7f0468d2 -//.word 0x7eadba3c -//.word 0x6bb09925 -//.word 0x5a1beea5 -//.word 0x9d4bafab -//.word 0xf355b086 -//.word 0xfca5bdab -//.word 0xf0e5e7b2 -//.word 0x91211ba1 -//.word 0x5e28f96d -//.word 0x0a35e2be -//.word 0x2cce53f3 -//.word 0x38ed7266 -//.word 0xae5ee7f1 -//.word 0x9168edb1 -//.word 0x1bafa909 -//.word 0xaf59baea -//.word 0x0f701152 -//.word 0xcf870313 -//.word 0x0aa19cd6 -//.word 0x534e375f -//.word 0xee174b13 -//.word 0x411c88b7 -//.word 0x85fc237a -//.word 0xc1f56e36 -//.word 0xf94dabf3 -//.word 0xa2f022ad -//.word 0x5a5a7157 -//.word 0xd6b7241f -//.word 0x1c4985f4 -//.word 0xf20bb545 -//.word 0x9694fc0c -//.word 0xaf3d5e0c -//.word 0x84866f56 -//.word 0x6cb66812 -//.word 0x85c2797c -//.word 0xa970612d -//.word 0x9ebc3d9c -//.word 0x8d7b9de4 -//.word 0xb63eddc8 -//.word 0x6179b3f4 -//.word 0x18e50485 -//.word 0x1322fccc -//.word 0xf4a15d4f -//.word 0xb5c11711 -//.word 0xde381a14 -//.word 0xfbb5681b -//.word 0x4dc46eb4 -//.word 0xc0f19476 -//.word 0x1d301388 -//.word 0x817c0663 -//.word 0x0ebfc5d8 -//.word 0xe0f26e54 -//.word 0x4285c463 -//.word 0x22013d73 -//.word 0xc3ec56db -//.word 0xb2ed2a1b -//.word 0xfb304365 -//.word 0x9c0cb05d -//.word 0x3ae3571e -//.word 0x134a8d7d -//.word 0x346ae491 -//.word 0xeca64473 -//.word 0x807f3e42 -//.word 0x20b49c6a -//.word 0x1aad3d26 -//.word 0x4e192044 -//.word 0xe2d7be29 -//.word 0x37129d14 -//.word 0x1bb122a7 -//.word 0x40eea7a3 -//.word 0xec44cdf3 -//.word 0xf38f13ec -//.word 0xe36fa8d3 -//.word 0x7eed7e9f -//.word 0x6d61a001 -//.word 0x3293c5a2 -//.word 0x5f2025ac -//.word 0x051f8b8b -//.word 0x7005acf5 -//.word 0x11c6b727 -//.word 0xbc3d2d72 -//.word 0x14cef3f7 -//.word 0x434aa6af -//.word 0xee122eae -//.word 0x678096a8 -//.word 0x25821ab4 -//.word 0x72888250 -//.word 0x64a1afa5 -//.word 0x0ee0740d -//.word 0xf705a7d3 -//.word 0xcc59773a -//.word 0x51daffc0 -//.word 0x9d981ca3 -//.word 0x875f7ca5 -//.word 0x5c96f80c -//.word 0xd36724ee -//.word 0x422124ab -//.word 0x11dac1bb -//.word 0x6f58bcaa -//.word 0x45326160 -//.word 0x683260a6 -//.word 0x13fed9e6 -//.word 0x94f7b632 -//.word 0x45623d88 -//.word 0xbec6e555 -//.word 0x49946937 -//.word 0x970d1c07 -//.word 0xb1617c17 -//.word 0x301409b8 -//.word 0xb1a65800 -//.word 0x847363ca -//.word 0xa4d823fd -//.word 0xec976112 -//.word 0x877dc9d0 -//.word 0xa942405a -//.word 0x7cb0776c -//.word 0x5e07c0e2 -//.word 0x49a1217a -//.word 0x92d2a7da -//.word 0xd712fdd5 -//.word 0x335e3dea -//.word 0xb3db060d -//.word 0x0ebdcfab -//.word 0x90677be8 -//.word 0x58d32d2b -//.word 0xc3355ddc -//.word 0x28db2c6c -//.word 0xc658f496 -//.word 0xfae124e5 -//.word 0xb6f74b77 -//.word 0x2e477200 -//.word 0xd4ceaf11 -//.word 0x8740f79b -//.word 0x07ab34af -//.word 0xad579787 -//.word 0x59f230ca -//.word 0xabe9bc0c -//.word 0x7619be94 -//.word 0x71a7d163 -//.word 0x302c3c72 -//.word 0x5316c73a -//.word 0xfe4bcd79 -//.word 0x890f9334 -//.word 0x7827d8f8 -//.word 0xad3ead66 -//.word 0xdc8987ef -//.word 0x40a793db -//.word 0x8ccb4990 -//.word 0x251c4411 -//.word 0x8e5c51c5 -//.word 0x23c8c67a -//.word 0x0b4015a9 -//.word 0x68a8a0fb -//.word 0xd08ecf0d -//.word 0x010d6070 -//.word 0xd0f1fff5 -//.word 0x631b1727 -//.word 0xa028e718 -//.word 0xe54dd861 -//.word 0xfa850e64 -//.word 0x44ef3dd4 -//.word 0x3b71be78 -//.word 0x1ea2e22b -//.word 0xe5e78628 -//.word 0x77dce784 -//.word 0x1df5b8fc -//.word 0x366572f1 -//.word 0x2d3eecb1 -//.word 0xa9da2bf8 -//.word 0x037b7bb7 -//.word 0xfd2ebe13 -//.word 0xb1f505b1 -//.word 0xc7245d31 -//.word 0xeb0cecf8 -//.word 0x7ed73c33 -//.word 0x8cb3d618 -//.word 0xff33136f -//.word 0x12f12f52 -//.word 0x08799f31 -//.word 0x1d62a419 -//.word 0xbdbe2135 -//.word 0xf4b5aa95 -//.word 0x266cdd2e -//.word 0x002cf522 -//.word 0xaec09c42 -//.word 0x4e1e01d1 -//.word 0xa54a2b8b -//.word 0x11788de6 -//.word 0xbf71da98 -//.word 0x1e371a59 -//.word 0x94ecfeea -//.word 0x6ff07056 -//.word 0x1e4a6f78 -//.word 0xa1491abd -//.word 0x3e6a0a2c -//.word 0x767de5a3 -//.word 0x37043063 -//.word 0x53dc65ce -//.word 0x311f4670 -//.word 0xc348703d -//.word 0xb7983319 -//.word 0xf2b9a19e -//.word 0x3aa2e519 -//.word 0x32bad7d5 -//.word 0x8c40cd9d -//.word 0x7aeab37c -//.word 0x65cc5ec7 -//.word 0xe27c1d5d -//.word 0xe274912e -//.word 0x28b7bffa -//.word 0x01b8645b -//.word 0x2f778806 -//.word 0x26ed564e -//.word 0x7baa2bea -//.word 0x99bdedf7 -//.word 0xb6d49e41 -//.word 0x05a431be -//.word 0x2d8b9c5b -//.word 0xfb742efb -//.word 0x53fc23bd -//.word 0x6dd3767e -//.word 0x3e64f6a0 -//.word 0x33b89c09 -//.word 0x25971c6e -//.word 0x8af1bad1 -//.word 0xe87d5f48 -//.word 0x90a0ec01 -//.word 0x8890ce83 -//.word 0xc9b9d336 -//.word 0xaa603b26 -//.word 0x9d861304 -//.word 0x190fbe6e -//.word 0xd723d56f -//.word 0x41d5314a -//.word 0x28024573 -//.word 0xb57cb1df -//.word 0xa268157d -//.word 0xa9e52305 -//.word 0x3deff9f0 -//.word 0x7982adc7 -//.word 0x560229a1 -//.word 0x20da39e8 -//.word 0x2b64e25b -//.word 0xc209f659 -//.word 0x60a9e55c -//.word 0x233cd6c4 -//.word 0x7dbaf6d6 -//.word 0x2d391004 -//.word 0x6d555f6e -//.word 0x6dd5a0aa -//.word 0x018c6ac0 -//.word 0x967cc279 -//.word 0x6b42ebda -//.word 0xfeae7beb -//.word 0xc4b1b4bd -//.word 0x1c7c10aa -//.word 0x86e61edf -//.word 0x100e8d18 -//.word 0x124286ab -//.word 0x1b2040c8 -//.word 0x2bfbceff -//.word 0x23813b02 -//.word 0x799ad8ad -//.word 0x3093d543 -//.word 0x087b0ffb -//.word 0xf2cd29bb -//.word 0xc650de23 -//.word 0x383c95cd -//.word 0x099e36d3 -//.word 0x7afd3d92 -//.word 0x063e0dae -//.word 0x50c58657 -//.word 0x5bddd9ca -//.word 0xf95a9b1a -//.word 0x867d1930 -//.word 0xd517ec10 -//.word 0x6bf1cd5f -//.word 0xeb6caa22 -//.word 0xd265f9c9 -//.word 0x645b4c6c -//.word 0xe7d42554 -//.word 0x0efc0cbd -//.word 0xb890e0da -//.word 0xdbfa6b1a -//.word 0xbabe38aa -//.word 0x5f14a93b -//.word 0x45d64405 -//.word 0x559d4e0c -//.word 0x13289ba2 -//.word 0x1afda42d -//.word 0xc652da2a -//.word 0x302d3a72 -//.word 0x5fcb22bc -//.word 0xbc3f6364 -//.word 0xc75b976b -//.word 0x09d3b5be -//.word 0x49a0e2bb -//.word 0x03a38af1 -//.word 0x168bb027 -//.word 0xbdf882a0 -//.word 0xc0e0319e -//.word 0xec33ff25 -//.word 0xc0ba9a01 -//.word 0x6945a80b -//.word 0xf105a3a7 -//.word 0xb337e791 -//.word 0x120209da -//.word 0x6aa36b2d -//.word 0x47c70d57 -//.word 0xd538a606 -//.word 0x98bcf4d1 -//.word 0x5d3b5079 -//.word 0x711f856f -//.word 0x1000e296 -//.word 0x20818e49 -//.word 0x20751ca0 -//.word 0x5b475fef -//.word 0x61988090 -//.word 0xb7294de3 -//.word 0xcefcd492 -//.word 0x32b6311a -//.word 0x0448a487 -//.word 0xaacee77e -//.word 0xc5b7be81 -//.word 0x6327cf6f -//.word 0x7799b44a -//.word 0x86c94f3d -//.word 0xa2d15dde -//.word 0x9c924eb0 -//.word 0x765555ec -//.word 0x17b2bb81 -//.word 0x42b27859 -//.word 0xc93004de -//.word 0xfe856bbd -//.word 0x6b64a0e9 -//.word 0xc30213e4 -//.word 0x187a853a -//.word 0x4d711b4e -//.word 0xcff5b258 -//.word 0x80ab73af -//.word 0xf42aa744 -//.word 0xe0a2cc6f -//.word 0xcfc1e8ef -//.word 0x17d71d2c -//.word 0x0c387ebe -//.word 0x73e22133 -//.word 0x3a5f750d -//.word 0x66edd60b -//.word 0x4cdd5faa -//.word 0x043900ea -//.word 0x1ba9d055 -//.word 0x8897a43e -//.word 0xe192e047 -//.word 0xcff08d26 -//.word 0xc0b8aca8 -//.word 0xdbbfcaf5 -//.word 0x3910d517 -//.word 0x52912eb6 -//.word 0xb5e4ff25 -//.word 0xfd8ccfa3 -//.word 0x005154da -//.word 0x49e588ac -//.word 0xc9c7ff2f -//.word 0xc96877f6 -//.word 0x238db193 -//.word 0xb2f47f59 -//.word 0x073a1f67 -//.word 0x5dfcc7e2 -//.word 0xcf3d8181 -//.word 0xc907394f -//.word 0xbd5514ac -//.word 0x17310495 -//.word 0x721a9a26 -//.word 0x0ca81b5d -//.word 0x7773d521 -//.word 0x9230b383 -//.word 0xb81d1043 -//.word 0x37a0c996 -//.word 0x042a9626 -//.word 0xad629a5b -//.word 0x8e8038d9 -//.word 0x48f6294a -//.word 0x6f56cb5d -//.word 0x8370bc0e -//.word 0x22baa829 -//.word 0x7bf65f09 -//.word 0x060e2ba6 -//.word 0x734360cf -//.word 0xe08634b3 -//.word 0x4e26d1a6 -//.word 0x56aca922 -//.word 0x18040a0c -//.word 0x75ddf239 -//.word 0x7e512431 -//.word 0x2bc97b33 -//.word 0x511b7f79 -//.word 0xcef636bc -//.word 0x06803dfb -//.word 0x943d1679 -//.word 0x3933c405 -//.word 0x184c957d -//.word 0x26fb4095 -//.word 0xdc222fd5 -//.word 0x2f341ee1 -//.word 0xc197e5fd -//.word 0x594c92d0 -//.word 0x91d1bb68 -//.word 0xce46137f -//.word 0x75d03afd -//.word 0x5c3bdabe -//.word 0x7fe3ef94 -//.word 0xf5d46690 -//.word 0x2230ea7d -//.word 0x2dd1fbae -//.word 0xb43040fa -//.word 0xbf851e04 -//.word 0xf33089c0 -//.word 0x09581a32 -//.word 0x7ed26279 -//.word 0x8b447f0d -//.word 0x578aec45 -//.word 0x6c589e1c -//.word 0x67214c34 -//.word 0xf4380e1b -//.word 0xfa3629ce -//.word 0x139b297b -//.word 0x3fb8318b -//.word 0xd9cc90e0 -//.word 0xca6d945b -//.word 0xfc29a3a2 -//.word 0x126e8720 -//.word 0x56a70a4d -//.word 0xf2a8c32f -//.word 0x644c2f21 -//.word 0x2c5c04d3 -//.word 0xc7b3c192 -//.word 0xe1a08ac9 -//.word 0xc78c33c8 -//.word 0x1bdd9bc5 -//.word 0xcb1a3b20 -//.word 0x434ffeec -//.word 0xe2b353aa -//.word 0xab888157 -//.word 0x3e433caa -//.word 0x06ed7597 -//.word 0xb3c97617 -//.word 0xeb372d2b -//.word 0x3cd8c81e -//.word 0x56f3830b -//.word 0x7717bea0 -//.word 0x26025321 -//.word 0x24c226b0 -//.word 0xa01afecb -//.word 0xaa279316 -//.word 0xea43e85b -//.word 0x922adacf -//.word 0x915cf997 -//.word 0x0ac2988a -//.word 0x04932039 -//.word 0x6379aa2c -//.word 0x17f0cc6f -//.word 0x93efb24e -//.word 0x80cb715c -//.word 0xb35899ba -//.word 0x5d510995 -//.word 0x82fa08f1 -//.word 0xad0391a5 -//.word 0xe1b0eda7 -//.word 0xd237888a -//.word 0x556afd45 -//.word 0x16957336 -//.word 0x89aa2c67 -//.word 0x239b5b0f -//.word 0xc908365c -//.word 0x891a4d6f -//.word 0x88af1aa9 -//.word 0x3bb7d925 -//.word 0xdadd9a85 -//.word 0x126b94f2 -//.word 0xfb67bc5e -//.word 0x4902960c -//.word 0xc6344b53 -//.word 0x00a0fd9f -//.word 0x3ebd57b8 -//.word 0xb9376847 -//.word 0x0993b196 -//.word 0xde137c97 -//.word 0xf0d97028 -//.word 0x394e6395 -//.word 0x61c56f5e -//.word 0x7a5c483b -//.word 0xed23cc5e -//.word 0xb481dcf8 -//.word 0xcad36bfe -//.word 0xe055d42d -//.word 0x5246714c -//.word 0x594769b1 -//.word 0x8205c906 -//.word 0x5f17d74d -//.word 0x7c2aa322 -//.word 0x945bde40 -//.word 0x05e4ef47 -//.word 0x82fb44bd -//.word 0x08f7e652 -//.word 0x13b55168 -//.word 0x113a82d2 -//.word 0x179951dc -//.word 0xd317018c -//.word 0xc28e1628 -//.word 0xa20f66f8 -//.word 0x2bcb734d -//.word 0xfa34f8c3 -//.word 0xce5fc2c2 -//.word 0xf6adc14b -//.word 0x0aaa5ff1 -//.word 0xda351025 -//.word 0xa4e22bb7 -//.word 0x8a9cf89a -//.word 0x428f0ae8 -//.word 0x1045cf25 -//.word 0xf10e65c8 -//.word 0x19a6aff7 -//.word 0xa012a993 -//.word 0x79cbf874 -//.word 0xa31ec6f6 -//.word 0xa3d3ccb4 -//.word 0x310db093 -//.word 0x32719203 -//.word 0xe68ae281 -//.word 0x636c7460 -//.word 0x4298d6ca -//.word 0x9820e102 -//.word 0x280c8eeb -//.word 0xd6fb0bce -//.word 0x5f0e0e58 -//.word 0x48016ae2 -//.word 0x149be0f6 -//.word 0xba49370e -//.word 0x56068e9e -//.word 0x1f7df255 -//.word 0x99722ca0 -//.word 0x0c5edc71 -//.word 0x3459cc3e -//.word 0x3a3d7e4c -//.word 0xe309072d -//.word 0x08832088 -//.word 0x46227b18 -//.word 0xf62a53f7 -//.word 0x5f19471d -//.word 0x2b426823 -//.word 0x18b8914d -//.word 0xf06df7c8 -//.word 0xbb9b0030 -//.word 0x33635956 -//.word 0x78b5433f -//.word 0x056f2d70 -//.word 0xe3c98868 -//.word 0x1cf0d76f -//.word 0x73f1058e -//.word 0x52d9fcdf -//.word 0x041a7307 -//.word 0x24310700 -//.word 0x56868e1c -//.word 0x3594a846 -//.word 0x8c49968b -//.word 0xc8b050da -//.word 0xadcdd108 -//.word 0x49c9b617 -//.word 0x264f07b8 -//.word 0xc435550e -//.word 0x465f05b5 -//.word 0x6ce0eb03 -//.word 0xc1631b8e -//.word 0x16cafbee -//.word 0x2e149dc4 -//.word 0xbb844cfb -//.word 0x89ff654d -//.word 0xfab76909 -//.word 0xb2064f14 -//.word 0x939c1f2e -//.word 0xecddbc77 -//.word 0xed850132 -//.word 0x5f8e10c8 -//.word 0x9253e710 -//.word 0x96f535cd -//.word 0xadfe6b79 -//.word 0x01441541 -//.word 0x93116b50 -//.word 0x74802350 -//.word 0x372a8a2e -//.word 0xa602d31e -//.word 0xb47eafe0 -//.word 0xb3f81e41 -//.word 0xc75384e4 -//.word 0x9be1ff42 -//.word 0x5284f8f0 -//.word 0xc114f821 -//.word 0xdb01bd6b -//.word 0x6c3a8ece -//.word 0x0b4dcbf2 -//.word 0x49cfc8b0 -//.word 0x2ffedbd4 -//.word 0xe8a5b421 -//.word 0xba40ed96 -//.word 0x3b61e2f0 -//.word 0xc152c370 -//.word 0x1afce8de -//.word 0x7d0764ce -//.word 0xc143dc22 -//.word 0xcd479ad0 -//.word 0x5058dde6 -//.word 0xb28c73cb -//.word 0x4a2e8ac7 -//.word 0xd165c4c5 -//.word 0x16118958 -//.word 0xf4f6a1fd -//.word 0x811c02a0 -//.word 0x8975e661 -//.word 0x3bc12197 -//.word 0x21afb215 -//.word 0x564598ad -//.word 0xf381e7f3 -//.word 0xca411a43 -//.word 0x5760ab06 -//.word 0xf322e130 -//.word 0x4bd2ea0d -//.word 0x11a9293e -//.word 0xf1f2d1ff -//.word 0xc76cb3ab -//.word 0x0ff05481 -//.word 0x9c5343a8 -//.word 0x8e8ea971 -//.word 0x7e1c22dd -//.word 0xfba4cb5f -//.word 0x3ad89de2 -//.word 0x099df90e -//.word 0x056c83c7 -//.word 0x0df834f7 -//.word 0xf611ab8e -//.word 0x80c8c4c7 -//.word 0x89d46cac -//.word 0x8134b4dc -//.word 0x1e16248c -//.word 0x51f851cc -//.word 0x780db10b -//.word 0xd5e2afde -//.word 0x3f41fbfd -//.word 0x1756248e -//.word 0x7e1068a7 -//.word 0xc5cacb0e -//.word 0x252b6643 -//.word 0xb14a02c0 -//.word 0x8816e57f -//.word 0x4ff6ecbd -//.word 0xdfacdafe -//.word 0x3a7ff051 -//.word 0xc499bed5 -//.word 0xb0ae387c -//.word 0xb8de0c0f -//.word 0x11dd3372 -//.word 0x9e51c62a -//.word 0x647b141c -//.word 0x3e1af197 -//.word 0xd18c5195 -//.word 0xc337153e -//.word 0x282724ae -//.word 0x3df8bef8 -//.word 0x59f70d6b -//.word 0x2084fd14 -//.word 0xfabb4e83 -//.word 0xc453e8d2 -//.word 0xc5c56ee4 -//.word 0xe3b115eb -//.word 0x167eb72d -//.word 0x1e422307 -//.word 0x71e1b832 -//.word 0x78783245 -//.word 0xfafcc37b -//.word 0xd91e66b7 -//.word 0xfc7270c5 -//.word 0x8cd167e3 -//.word 0x63fc1880 -//.word 0xc181e443 -//.word 0x41e35b4f -//.word 0x0cf50cc6 -//.word 0x4d879a8b -//.word 0xe544134d -//.word 0x5fdb7ec1 -//.word 0x265db32e -//.word 0xf5e6702f -//.word 0x9080a8b5 -//.word 0xb2441e4b -//.word 0x46c3339e -//.word 0xd9a4fc3c -//.word 0x508e989c -//.word 0xd648c15f -//.word 0x191ea0d5 -//.word 0xb687e6c3 -//.word 0xf1061863 -//.word 0xaa4e2aad -//.word 0x8da950d5 -//.word 0x889a1115 -//.word 0x82c19dac -//.word 0x4a006027 -//.word 0xcddcd7df -//.word 0x8d26a3c3 -//.word 0x4edadc57 -//.word 0x1247a7fd -//.word 0x48700b74 -//.word 0x41b3009e -//.word 0xe3a8c986 -//.word 0xa14c84a1 -//.word 0xab5f0054 -//.word 0x610aceb7 -//.word 0x0ec59b99 -//.word 0xd378bdc4 -//.word 0xe1e00b81 -//.word 0xeb35f25f -//.word 0xdc0ac531 -//.word 0xc5745556 -//.word 0x196ec23d -//.word 0x1c7c9027 -//.word 0x998ffd2f -//.word 0xd3299288 -//.word 0xbfc1f907 -//.word 0x70690ee1 -//.word 0xd3ae38b5 -//.word 0x9cc0facd -//.word 0x80d3c5a1 -//.word 0xa5c4119c -//.word 0x5700ac23 -//.word 0xfca251d4 -//.word 0x4adb7c0b -//.word 0xb7977dab -//.word 0x315dcb1b -//.word 0x10779c8e -//.word 0x4954b288 -//.word 0xe42a789e -//.word 0xb0df4d7d -//.word 0x352a202d -//.word 0xeaf63d97 -//.word 0xa8076645 -//.word 0x5fdf266a -//.word 0x08e36222 -//.word 0xdaba31fa -//.word 0xc1f6eeb3 -//.word 0x0cf68b43 -//.word 0x650a271d -//.word 0x07d9e3b2 -//.word 0x2b00f238 -//.word 0xc3fcf0aa -//.word 0x6b4a7510 -//.word 0x9dcce900 -//.word 0x246f9a65 -//.word 0xd30b0b7f -//.word 0x768b902b -//.word 0x094d1765 -//.word 0x28cc490b -//.word 0xc77cd2e3 -//.word 0x23f5fce0 -//.word 0xf85483a1 -//.word 0xf5dea53b -//.word 0x6de77838 -//.word 0x4ff380e0 -//.word 0x581a81b7 -//.word 0x87b19246 -//.word 0xd226731e -//.word 0x172c201b -//.word 0x5518a6e6 -//.word 0x1c8b36bd -//.word 0x42527877 -//.word 0xd88a21c2 -//.word 0x5c08c8b0 -//.word 0x30f8f672 -//.word 0x4bc37c63 -//.word 0x2f370948 -//.word 0x1be2fbd5 -//.word 0x81be7674 -//.word 0xba14b343 -//.word 0xf99a9b5b -//.word 0x7ede9558 -//.word 0x0ce89c16 -//.word 0x9c1b94b8 -//.word 0x535ddeef -//.word 0xb2782a79 -//.word 0x0dbf8ce7 -//.word 0x3ef4d3a4 -//.word 0x9a691633 -//.word 0x24668fb8 -//.word 0x01cbacba -//.word 0x2cf66427 -//.word 0x6be7c898 -//.word 0x82a2dad7 -//.word 0xa6d5a19f -//.word 0x34bb7da2 -//.word 0xa340b9d0 -//.word 0xb8665fd7 -//.word 0xf8e750e6 -//.word 0x631c93b7 -//.word 0x5f1deecc -//.word 0xf32ab3f9 -//.word 0x354add22 -//.word 0x06315b46 -//.word 0xfc67acbc -//.word 0xa0a7acbd -//.word 0xda86ae23 -//.word 0xa955ca70 -//.word 0x17477912 -//.word 0x6dd75fe6 -//.word 0xa36467fa -//.word 0x1a1e1597 -//.word 0x8e26187f -//.word 0x46f11f73 -//.word 0x8deeeef8 -//.word 0x6668b15b -//.word 0x7cad90f3 -//.word 0x587083a6 -//.word 0xd66c68ae -//.word 0xda4a539d -//.word 0x3fc5259f -//.word 0x100c6000 -//.word 0xfb6739ee -//.word 0x021eef7f -//.word 0x74975cf6 -//.word 0x1cbeca42 -//.word 0xb8a907c7 -//.word 0xad7dbc61 -//.word 0xf88bfaa6 -//.word 0x68bf166c -//.word 0x0a3bb78c -//.word 0xe53f2de5 -//.word 0xe84c04a3 -//.word 0x2189d9c1 -//.word 0x30656dcc -//.word 0xfa7ef8ea -//.word 0xa2c2c01c -//.word 0xb5d3e9c0 -//.word 0xa4b08f5a -//.word 0x78931293 -//.word 0xc115b182 -//.word 0xcf985b2b -//.word 0x25e6c145 -//.word 0x2b16b041 -//.word 0x23b09e87 -//.word 0x5e118303 -//.word 0xb010eae0 -//.word 0x21e14793 -//.word 0xe53a8b1c -//.word 0x8fb5f688 -//.word 0x81762cbb -//.word 0xa70d8c6c -//.word 0x659dbd71 -//.word 0xcd3e893d -//.word 0x16a1efa7 -//.word 0x49f373ed -//.word 0x3e03b9f8 -//.word 0xc7a652e1 -//.word 0x2b5bd6b5 -//.word 0xd62b3375 -//.word 0x4ed34461 -//.word 0x6925a676 -//.word 0xbeacc736 -//.word 0x598f3fa7 -//.word 0xb3b7649e -//.word 0xe134183d -//.word 0x0bdde6bb -//.word 0x20374e63 -//.word 0xc8995ce0 -//.word 0x9a8d80b7 -//.word 0x90789915 -//.word 0xb77e53cb -//.word 0x2ba0b397 -//.word 0x4327f0a5 -//.word 0x09468555 -//.word 0xedfb843f -//.word 0xba362d75 -//.word 0xc83dbf07 -//.word 0x744f8ecd -//.word 0xcd875660 -//.word 0x9004cf6a -//.word 0x57478120 -//.word 0x0ddcda0c -//.word 0xa53d7e10 -//.word 0x0bf3dea8 -//.word 0x5bfe0c6f -//.word 0x5277cee5 -//.word 0x0274f16f -//.word 0xc92cdf9f -//.word 0x835c74b6 -//.word 0xffe90e67 -//.word 0xb0c6e3de -//.word 0xa5189801 -//.word 0xbb980ff6 -//.word 0x123980e5 -//.word 0xbd0ccbff -//.word 0xbe600cbf -//.word 0x312d706f -//.word 0xc7b348ef -//.word 0x765e5cb2 -//.word 0x6fed8209 -//.word 0x51d36fa4 -//.word 0x9cddcc55 -//.word 0x68168d18 -//.word 0x57e87e51 -//.word 0xc8831e54 -//.word 0x4d83b12a -//.word 0x60cc9193 -//.word 0x51b9c547 -//.word 0x8377d481 -//.word 0xd8abdbbe -//.word 0x6a5bdec2 -//.word 0x7c0b5cdd -//.word 0xb026266c -//.word 0x7aa071a2 -//.word 0x80000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00007FC0 -//// expected output -//.word 0xe8e09fc5 -//.word 0x7bd3b8e1 -//.word 0x8b272641 -//.word 0x8836852c -//.word 0xf1544eb2 -//.word 0xcf28c18f -//.word 0x5b984363 -//.word 0x82d0b621 -//.word 0x953d2faa -//.word 0x60d155dd -//.word 0x28c2cb76 -//.word 0xc00ee93d -//.word 0x3de56289 -//.word 0xb399c22a -//.word 0x4fd82f00 -//.word 0xdd35ef27 -//// SHA512LongMsgvector_41 -//// vector length -//.word 0x000082D8 -//// input message -//.word 0x9c06316a -//.word 0xc709e944 -//.word 0x70a68650 -//.word 0xe1d6aeee -//.word 0x089aefbf -//.word 0x133df90a -//.word 0x3eda0a5e -//.word 0xe91fa979 -//.word 0xee509769 -//.word 0x318f03f1 -//.word 0x795afd2e -//.word 0x7e552d7a -//.word 0x434ac591 -//.word 0xa56eb4f3 -//.word 0x34e61d89 -//.word 0x4389078a -//.word 0x3be856a0 -//.word 0x358bfa47 -//.word 0xc77e6676 -//.word 0x1d0d4382 -//.word 0x4ccb663f -//.word 0xe4d90068 -//.word 0xc4641541 -//.word 0x3370307a -//.word 0x2cd45457 -//.word 0xf886350e -//.word 0x0319a871 -//.word 0xe88459cc -//.word 0xce25bc11 -//.word 0xf7064632 -//.word 0x965edccf -//.word 0xe15b8c11 -//.word 0x681e7bd6 -//.word 0xa5081e0e -//.word 0xd434ad64 -//.word 0x0544d522 -//.word 0x6f61ae4e -//.word 0x077dec19 -//.word 0x51db597b -//.word 0x76d28317 -//.word 0x98ceb164 -//.word 0x62971c0e -//.word 0xe3d65c9a -//.word 0x9cd5214a -//.word 0xd7862340 -//.word 0x3bc75ce5 -//.word 0x9ee4748c -//.word 0x1a5d7d53 -//.word 0x63eae04a -//.word 0x57bd97d8 -//.word 0xd7079d5a -//.word 0xd6bda30c -//.word 0xaf9c052d -//.word 0xbc6bfc5e -//.word 0x2480154c -//.word 0xf485e28e -//.word 0x727cefd1 -//.word 0xae01f732 -//.word 0x59cf58eb -//.word 0xda86c532 -//.word 0x9fac3b5e -//.word 0xb1f1364c -//.word 0x8cb72401 -//.word 0x2dd11a90 -//.word 0x6c8bc63e -//.word 0x8ceba5e5 -//.word 0x11377596 -//.word 0xd1b7ee82 -//.word 0x4ebcad1b -//.word 0x43e27176 -//.word 0x7d9189f4 -//.word 0xecca8d21 -//.word 0xfa204ddc -//.word 0x1b0407b9 -//.word 0xa646dda3 -//.word 0xe3d985c6 -//.word 0x65d743ac -//.word 0x9ac414a5 -//.word 0xa0172c6d -//.word 0x5af6a309 -//.word 0xc4426cf2 -//.word 0x83d38675 -//.word 0xc105765a -//.word 0x3773f4c4 -//.word 0x8b02e558 -//.word 0xdd2289a1 -//.word 0x9d50f6b3 -//.word 0x9fdfc50f -//.word 0x71f90bc7 -//.word 0xece18be3 -//.word 0x097a2902 -//.word 0xf60da245 -//.word 0x69477b68 -//.word 0x35813732 -//.word 0x1b45cd10 -//.word 0xe20d59fd -//.word 0xa94d12a4 -//.word 0x7db47cc9 -//.word 0x27afdfe5 -//.word 0x4730f710 -//.word 0xa7aded24 -//.word 0xc96b8620 -//.word 0xc2fc9bca -//.word 0x4b07c999 -//.word 0x164769d1 -//.word 0x5ed6c2f0 -//.word 0xc2ac7e49 -//.word 0x53625bef -//.word 0xec3c23d4 -//.word 0xc267de32 -//.word 0x3b7f462a -//.word 0x04557bac -//.word 0x5eeef896 -//.word 0xb8cfc620 -//.word 0x8377ef77 -//.word 0x422e36a8 -//.word 0xe0fd05c0 -//.word 0x47fea731 -//.word 0x2ed6b778 -//.word 0x327fd9fd -//.word 0x294ba83b -//.word 0xb325ef20 -//.word 0x111a1bb7 -//.word 0x3b19f004 -//.word 0x2cf77c30 -//.word 0x81b649e6 -//.word 0x4207d7fc -//.word 0x000d4956 -//.word 0x20645f07 -//.word 0x7662a4ba -//.word 0x169de951 -//.word 0x66adf1cb -//.word 0x78336e6b -//.word 0x971a2c16 -//.word 0x201c8dfe -//.word 0x9488357d -//.word 0xea430643 -//.word 0x2a0d4fb4 -//.word 0x3706408c -//.word 0xec71a2c5 -//.word 0x6bb7c5ba -//.word 0xb2afb98c -//.word 0x701cc0c5 -//.word 0x1678043b -//.word 0x30f08638 -//.word 0xf6af57d7 -//.word 0x1e5f0ab1 -//.word 0xf5ed69b9 -//.word 0xae8d6765 -//.word 0xfaff560f -//.word 0xd9105a9a -//.word 0xaf631e58 -//.word 0x9a71c52b -//.word 0x03cf24eb -//.word 0x73b02e08 -//.word 0xa8aaaf71 -//.word 0xe9bd3eb4 -//.word 0x96916c66 -//.word 0x03ff42c5 -//.word 0x86d3eb9c -//.word 0xcfd0ad67 -//.word 0x78f51eb8 -//.word 0xddff94d9 -//.word 0x2e2fddb3 -//.word 0xc34d30ee -//.word 0xafed645a -//.word 0x97f1608e -//.word 0xc54fd3cf -//.word 0x78152533 -//.word 0x7eaaad05 -//.word 0x0556246c -//.word 0xaf045948 -//.word 0xe447275d -//.word 0x6c9ca4b3 -//.word 0x3def9c3c -//.word 0x91603eb8 -//.word 0x3c4614d6 -//.word 0x3d74399c -//.word 0x93bcc608 -//.word 0x52b28df8 -//.word 0xf5b20a47 -//.word 0xf6259639 -//.word 0x9cffde19 -//.word 0x158c9420 -//.word 0xc46d6499 -//.word 0xdcde2a43 -//.word 0x2e3a62f7 -//.word 0x3fc0df8a -//.word 0x9e97c1f5 -//.word 0x7410a1b3 -//.word 0x5d2c0e6b -//.word 0x765e3dcf -//.word 0xb891fcc4 -//.word 0x846de8c3 -//.word 0x7ed6e07f -//.word 0x9fb6b9c8 -//.word 0x86fd33af -//.word 0x0fe62ceb -//.word 0x277b147b -//.word 0xdf5ba18d -//.word 0xbfbbc49f -//.word 0x5cabdbe4 -//.word 0x2c9a28e9 -//.word 0x9a1d8278 -//.word 0x56ec4abd -//.word 0xef2da1a7 -//.word 0xa3f6d891 -//.word 0x760d2822 -//.word 0x81f2a471 -//.word 0x8d1f6b6d -//.word 0xe08e227d -//.word 0x577ca263 -//.word 0xb56ded66 -//.word 0x3b7067b0 -//.word 0x79a443f5 -//.word 0x63fb3b55 -//.word 0xa73e8484 -//.word 0x3e510128 -//.word 0x41b9b782 -//.word 0xff5b8151 -//.word 0x4c8604f3 -//.word 0x1c34e6ce -//.word 0x508d3bee -//.word 0xcfad40ef -//.word 0xd9a74c1e -//.word 0x98ca03db -//.word 0xf823cd42 -//.word 0xb942870a -//.word 0xc34178ac -//.word 0xb90386c8 -//.word 0xd0baa9c5 -//.word 0xe2aca1b9 -//.word 0xbe36e488 -//.word 0xc311db4f -//.word 0xadd44d03 -//.word 0xaeba1c55 -//.word 0xc1a62fd9 -//.word 0x3b64af68 -//.word 0xa23276c3 -//.word 0xc37fc478 -//.word 0xfff2340a -//.word 0xe6aeef4c -//.word 0x07d5200e -//.word 0x054aa8fb -//.word 0xeebc12c2 -//.word 0xc9e0c974 -//.word 0x6efd882d -//.word 0x9bae13f7 -//.word 0x43e425eb -//.word 0x292aa99a -//.word 0xae2d2cab -//.word 0xe77b93c5 -//.word 0xf38b09af -//.word 0x8cfe3cb5 -//.word 0xdb24c94e -//.word 0x91c2f4fd -//.word 0x33129d75 -//.word 0xb50c7000 -//.word 0x4be45b21 -//.word 0x7cd44578 -//.word 0x781bfde7 -//.word 0xab4670f3 -//.word 0x92ae206d -//.word 0xce42d151 -//.word 0x778685ee -//.word 0xb2dcab47 -//.word 0x860394ba -//.word 0xebdd26df -//.word 0x2475d4b3 -//.word 0x4f40cef6 -//.word 0x3ba374d1 -//.word 0x79b611bc -//.word 0xb648c69f -//.word 0x4823c437 -//.word 0x0690bebc -//.word 0x5d1e9fc1 -//.word 0xa0a0785b -//.word 0xa075bc85 -//.word 0x7d0cafc3 -//.word 0xbba61c06 -//.word 0x985e46d0 -//.word 0x9d672298 -//.word 0x7496c370 -//.word 0xf92016e5 -//.word 0x93a4cf27 -//.word 0xc56ca36a -//.word 0x00f0b88b -//.word 0xbc9b5af7 -//.word 0xc7d2efc9 -//.word 0xdc332d32 -//.word 0x771a8a1e -//.word 0xe86af414 -//.word 0xa68ac35e -//.word 0xe7adec6b -//.word 0x6d577771 -//.word 0xa31d3356 -//.word 0xe8aca8d1 -//.word 0x2b0c4dcd -//.word 0xb826fb0e -//.word 0x5184a216 -//.word 0x81593b4a -//.word 0x2dc1fd51 -//.word 0x6c49d4bd -//.word 0x99b20fed -//.word 0xa6f25831 -//.word 0xb27cea30 -//.word 0xdec1fe87 -//.word 0x5df786b3 -//.word 0xcb191e31 -//.word 0xc02f40e3 -//.word 0xa4cfb7b6 -//.word 0xc5e45682 -//.word 0xa6aee932 -//.word 0x9b0a6c24 -//.word 0x92f47bd3 -//.word 0x344a0ab3 -//.word 0x2dd2565c -//.word 0xc77f1beb -//.word 0xbef008a5 -//.word 0x503a70de -//.word 0x93e7421a -//.word 0x0b3f3b71 -//.word 0x7cc65a38 -//.word 0xfd0595dd -//.word 0x4e8dca13 -//.word 0x6b3af82f -//.word 0x61b5afd2 -//.word 0x613cc5c9 -//.word 0x13a64b31 -//.word 0x2ca1bfdf -//.word 0x433f83ff -//.word 0xe1b18efa -//.word 0xd752629e -//.word 0xd4e73e79 -//.word 0x36249485 -//.word 0x2173bd0b -//.word 0xcef2ecc1 -//.word 0x26ba6135 -//.word 0x9067df6f -//.word 0x07d55fd2 -//.word 0x6f270644 -//.word 0x290e558f -//.word 0xe548a006 -//.word 0xb766c16b -//.word 0x6ed30d10 -//.word 0x2112873d -//.word 0x0a4754d2 -//.word 0x97f96f2d -//.word 0xbf169e4e -//.word 0x9337a539 -//.word 0x1526b99c -//.word 0x4c9e37b2 -//.word 0x98519667 -//.word 0x442f9bbd -//.word 0x5ae6cb6e -//.word 0xbba526d3 -//.word 0x6e261204 -//.word 0x39eb9641 -//.word 0x6ec8c891 -//.word 0x08a189a8 -//.word 0xf6756f0e -//.word 0xb79b037e -//.word 0x274c2d8d -//.word 0x9962ec8c -//.word 0x255f4aae -//.word 0x44b1906e -//.word 0x9a35b62b -//.word 0x12f91d15 -//.word 0x3046814d -//.word 0xa3de2948 -//.word 0x1a826075 -//.word 0x59b7291f -//.word 0x8cca2f94 -//.word 0xdb12fb87 -//.word 0x3e7569b3 -//.word 0x932d5dc1 -//.word 0xeeccb26c -//.word 0x307e73e3 -//.word 0xdb8f4e6e -//.word 0x242d4555 -//.word 0x4a6ea7fe -//.word 0x27953f55 -//.word 0x0591cb70 -//.word 0xb2c6b074 -//.word 0xd710ebb2 -//.word 0x85054b16 -//.word 0x117bddc2 -//.word 0x224ba8f6 -//.word 0x08549b33 -//.word 0x4fc2c4a0 -//.word 0x9490c3ac -//.word 0x984b7df5 -//.word 0x93191569 -//.word 0xcbfb18aa -//.word 0x644ff7b7 -//.word 0x7a99bbca -//.word 0x6d82f47c -//.word 0x7c21f22f -//.word 0x967a38ad -//.word 0x6c442e0d -//.word 0xcbf016d7 -//.word 0x29e64168 -//.word 0x7e128397 -//.word 0x559fe498 -//.word 0x22029821 -//.word 0xd63b32cc -//.word 0xb15714bd -//.word 0x573a2a84 -//.word 0x279bd844 -//.word 0xc8503015 -//.word 0x04cc69a8 -//.word 0xdae68c2a -//.word 0xcedc716a -//.word 0x8497ea3d -//.word 0x8d303e22 -//.word 0x81b4d922 -//.word 0x4e2441fa -//.word 0xcfc04c7c -//.word 0xa1859133 -//.word 0x32f51c46 -//.word 0x1a16669e -//.word 0xafbd844b -//.word 0xd30c9e24 -//.word 0x113aa3ae -//.word 0xe9923b40 -//.word 0x67bffd64 -//.word 0xfb46e37f -//.word 0x8454fab5 -//.word 0xaeba5e07 -//.word 0x7e3666be -//.word 0x2bf41c0d -//.word 0x3054f0f2 -//.word 0x9feead5d -//.word 0xb8d4ab94 -//.word 0xba1647d6 -//.word 0xf98c903e -//.word 0x31cf43eb -//.word 0x1a89fa5e -//.word 0x3cefa023 -//.word 0x058b28b4 -//.word 0x193f7e9a -//.word 0xe987bed5 -//.word 0x87fea57e -//.word 0xb92445ab -//.word 0x4c5efc93 -//.word 0xaa3ea6f3 -//.word 0xaf0512b0 -//.word 0xb966b3bd -//.word 0xfe8d983f -//.word 0x23609eef -//.word 0x0a05e5c0 -//.word 0xeba480c3 -//.word 0xa66e7147 -//.word 0x57ded444 -//.word 0x2b3e5afa -//.word 0x736ef9d5 -//.word 0xf7e1e294 -//.word 0x8de8b4aa -//.word 0xea33efe4 -//.word 0xb794ab4d -//.word 0xe8078a4f -//.word 0x49f0eb1a -//.word 0x59a3604a -//.word 0x5c2963c3 -//.word 0xac4244e0 -//.word 0x50a666ce -//.word 0xcf90ab32 -//.word 0x467d2d12 -//.word 0xb9312ff2 -//.word 0xa7fc533d -//.word 0xe13b0de7 -//.word 0x9c215751 -//.word 0xc4b8a66d -//.word 0x93221d22 -//.word 0x632501f2 -//.word 0xc0e76eda -//.word 0xc2f54879 -//.word 0x998a7375 -//.word 0x6a0f471b -//.word 0x5ade3e45 -//.word 0xe84bf081 -//.word 0x7fe5426f -//.word 0x4bf9da6b -//.word 0x4d58d66c -//.word 0xaa5abd2c -//.word 0x4923b58a -//.word 0x9c25f72c -//.word 0xbee68168 -//.word 0xbf040a65 -//.word 0x3c763b7d -//.word 0x32141ce6 -//.word 0x135acd92 -//.word 0x1a697653 -//.word 0xdc4e8043 -//.word 0x21870663 -//.word 0xf1c38682 -//.word 0xf2eadd61 -//.word 0xf15d7214 -//.word 0xbe7fb1ab -//.word 0x3d74bb12 -//.word 0xba295b36 -//.word 0x7d943d69 -//.word 0x9e3d5a08 -//.word 0x1bfdb75b -//.word 0x28054fbc -//.word 0xc6234dfc -//.word 0x97417f02 -//.word 0xf12f08b5 -//.word 0x31a2551d -//.word 0x527c52c4 -//.word 0xbe4ddd63 -//.word 0x631a7bba -//.word 0x0a5e49c0 -//.word 0xe44f36fc -//.word 0x66627033 -//.word 0x57111c43 -//.word 0x28dc4a4f -//.word 0x838e281c -//.word 0x26c175bb -//.word 0xf2a43969 -//.word 0x3ffcb4b3 -//.word 0x736994de -//.word 0xd3eb6b85 -//.word 0x99a45f84 -//.word 0x46e02415 -//.word 0x39522739 -//.word 0x81a00c5a -//.word 0xf0235b2e -//.word 0x70e876de -//.word 0x9afacf68 -//.word 0x85e35742 -//.word 0xdc703a40 -//.word 0x34b5c9b7 -//.word 0x9c51b7e3 -//.word 0x75f38986 -//.word 0x841d48d2 -//.word 0x45287989 -//.word 0x82894f63 -//.word 0x25521eb0 -//.word 0x4bfc133e -//.word 0x9963237d -//.word 0xd31241e1 -//.word 0xaac1d488 -//.word 0xd61c681d -//.word 0x65c6a3fc -//.word 0x539e7b96 -//.word 0x5a41a717 -//.word 0x0bd05347 -//.word 0x1ef318ae -//.word 0x071d2bfc -//.word 0xca12d5a8 -//.word 0x0fa723d6 -//.word 0x79c9de7e -//.word 0x34c1bdcb -//.word 0xcdb6dac1 -//.word 0x47746323 -//.word 0x6b6c9294 -//.word 0x5ffbdffc -//.word 0x7aef742d -//.word 0x5747e1c7 -//.word 0x283a1158 -//.word 0x4d7b7cc8 -//.word 0x26bc9ff5 -//.word 0x2571a99a -//.word 0x27d67875 -//.word 0x0433c3a9 -//.word 0x645e9961 -//.word 0xd5820ab6 -//.word 0x1b2024d3 -//.word 0xc7532156 -//.word 0x0c58defa -//.word 0xcd4d8f73 -//.word 0xfa39b29a -//.word 0x1d4d41ca -//.word 0x306a2c8a -//.word 0xb2e3066c -//.word 0xfa83fe35 -//.word 0xcad2123d -//.word 0x27947f19 -//.word 0x68937c78 -//.word 0x8e9e274b -//.word 0xd3d2c029 -//.word 0x861815f1 -//.word 0x15ef3db1 -//.word 0x6c6c89c6 -//.word 0x7d7eb845 -//.word 0x20776a9a -//.word 0x1ec8d86f -//.word 0x880cc1d0 -//.word 0x4e49a88c -//.word 0x0c723cde -//.word 0x2730184c -//.word 0x19e1acd0 -//.word 0x09e27b36 -//.word 0x9f0988c5 -//.word 0x16760a21 -//.word 0x938c6770 -//.word 0xb53a60bc -//.word 0x6d7f8998 -//.word 0x102dfd07 -//.word 0xaaed4f99 -//.word 0x9683c4d7 -//.word 0x4b53bfe1 -//.word 0x79247c56 -//.word 0x55250174 -//.word 0x302d5281 -//.word 0x4f47e569 -//.word 0xf76e55a8 -//.word 0xc7955a6a -//.word 0x4bebf9f1 -//.word 0xcd5cf838 -//.word 0x6e5b95d6 -//.word 0x76df7824 -//.word 0xe9abe5a2 -//.word 0x5bd33697 -//.word 0x047c89f8 -//.word 0x17e3b68b -//.word 0x50a1844c -//.word 0xcc2d1c10 -//.word 0x1ea2bd68 -//.word 0x9fc2b2c8 -//.word 0x053b81e9 -//.word 0x382a666b -//.word 0x61deffbf -//.word 0x43de4944 -//.word 0xce2dcbb0 -//.word 0xf1cc11b2 -//.word 0xb1815cd6 -//.word 0x78d798a8 -//.word 0xaf668e1c -//.word 0x8e545b2d -//.word 0x331c21c5 -//.word 0xf28efcdd -//.word 0xed1838e5 -//.word 0xe443c166 -//.word 0x4e80dae6 -//.word 0xa825120c -//.word 0x0db37404 -//.word 0x075aff25 -//.word 0xa5bf56d1 -//.word 0xcdfcb89d -//.word 0xd4e831b2 -//.word 0x4c9a1274 -//.word 0x1d28a061 -//.word 0xd8b4093b -//.word 0x47aa9c69 -//.word 0x4943389b -//.word 0xdc4e05ad -//.word 0x7c2f63ce -//.word 0xac2820e1 -//.word 0xd2d7ee23 -//.word 0x4700140e -//.word 0xaf8d637e -//.word 0x86d36c13 -//.word 0xfc17f0d6 -//.word 0x0351981f -//.word 0xa62fe6b6 -//.word 0x9c5d6c38 -//.word 0x1d043cbc -//.word 0xf4919fb7 -//.word 0xd6b70a1d -//.word 0xf2b74dc9 -//.word 0xc9df0e1f -//.word 0x405076f0 -//.word 0xf3052a9d -//.word 0xcd117d80 -//.word 0xd628e487 -//.word 0x4b61aa22 -//.word 0xf43ae460 -//.word 0xb2dda855 -//.word 0x58a27abe -//.word 0xbbd407e8 -//.word 0x0db816cd -//.word 0x66cbbb80 -//.word 0xa44ccdcc -//.word 0x75fa9b18 -//.word 0xb21fdb8e -//.word 0xefcde37d -//.word 0x50681cfb -//.word 0x9e64b3ce -//.word 0x9950918d -//.word 0x90148e02 -//.word 0x3077e1d3 -//.word 0x9ae4db61 -//.word 0xb86dd6f1 -//.word 0xd010680a -//.word 0x5939dc1d -//.word 0x0e89e26c -//.word 0x42d68524 -//.word 0x73735ecc -//.word 0x21b107e3 -//.word 0xe0a5d3c5 -//.word 0xad2cbccf -//.word 0x7e2d9dc3 -//.word 0x1d1ea26e -//.word 0x35cafc88 -//.word 0xad51d9db -//.word 0x367093a8 -//.word 0x20022746 -//.word 0x72c7ea0c -//.word 0x39657771 -//.word 0x20acec72 -//.word 0x411e5634 -//.word 0x3baf69eb -//.word 0x85c975fa -//.word 0x0293955c -//.word 0xd5732a42 -//.word 0x76d287fd -//.word 0x051fee1f -//.word 0xdf16bcdd -//.word 0x7042e0b8 -//.word 0x48c0915d -//.word 0x704741c9 -//.word 0xfe65ccb0 -//.word 0xe70bf620 -//.word 0x154c1462 -//.word 0xb9620921 -//.word 0xe3f274cd -//.word 0x50912842 -//.word 0x8286dda5 -//.word 0x16d1258f -//.word 0x536da16e -//.word 0xffd37428 -//.word 0x76bff801 -//.word 0xfd36b0be -//.word 0x53c87e0a -//.word 0x8913161a -//.word 0x1488b38d -//.word 0x21720996 -//.word 0x28337a5c -//.word 0xc4d18ca1 -//.word 0xc2b29ba2 -//.word 0x77a4cb3f -//.word 0x5721415c -//.word 0xc4d09387 -//.word 0x244e7cdb -//.word 0x362fd524 -//.word 0xa640c044 -//.word 0xdf0f27d5 -//.word 0x20ae650f -//.word 0xd2b342ec -//.word 0x1983258b -//.word 0xa9d185d2 -//.word 0xdb61a158 -//.word 0xff127182 -//.word 0xf41bdcec -//.word 0xf7952b0a -//.word 0xb93abe0f -//.word 0xb46cfd0d -//.word 0xbe79925e -//.word 0xdf1dd644 -//.word 0x604888cc -//.word 0x2422c5f8 -//.word 0x3c4c341c -//.word 0xb5698289 -//.word 0xb4de0e69 -//.word 0xc6d5e5ea -//.word 0x7188f09f -//.word 0x0fbc6c23 -//.word 0xdc8b9bff -//.word 0x4d67b9cd -//.word 0xa35c329e -//.word 0xc195129a -//.word 0x3a22bde6 -//.word 0xaff9e0cb -//.word 0x583aa714 -//.word 0xe0b731b7 -//.word 0x76b341b8 -//.word 0x21ea364b -//.word 0x53d23d39 -//.word 0xc221c584 -//.word 0x738f334e -//.word 0x17ddd7f7 -//.word 0x9b161f86 -//.word 0xfb150b4a -//.word 0x5747e1c1 -//.word 0x48b222b8 -//.word 0x7436bcb4 -//.word 0x60138191 -//.word 0x86acd869 -//.word 0xa88bb3b7 -//.word 0x63a4c1bc -//.word 0x07dee422 -//.word 0xa6cfe5e0 -//.word 0x6bc7675d -//.word 0x2d1119d8 -//.word 0x44753007 -//.word 0x9c0115fe -//.word 0x080a5a53 -//.word 0xd86df380 -//.word 0xad1aa388 -//.word 0x8cd4b4de -//.word 0x3232eb82 -//.word 0xa7eabb6d -//.word 0x164eb92f -//.word 0xdc1750d7 -//.word 0xdf62b613 -//.word 0x21f81e98 -//.word 0x95d230c4 -//.word 0x31ddb682 -//.word 0x44fa986f -//.word 0x0a490a3b -//.word 0x7da70451 -//.word 0x6f75f2ba -//.word 0xd69cae3e -//.word 0x67cdabcd -//.word 0x660e731e -//.word 0xbc725396 -//.word 0x4a27546b -//.word 0x7db66e09 -//.word 0x2287f9b5 -//.word 0x7ca46470 -//.word 0x94be291e -//.word 0xd17500e7 -//.word 0xc8d454de -//.word 0x551bf3e0 -//.word 0xebc209bf -//.word 0x28ba4fa0 -//.word 0xadf680a2 -//.word 0x2c2a0dc1 -//.word 0xc2d311f9 -//.word 0x887787ae -//.word 0x652ebb4b -//.word 0x2661fe2a -//.word 0xd0d29eb4 -//.word 0x34dc15c9 -//.word 0xc5fd8162 -//.word 0xa7915474 -//.word 0x08e04d18 -//.word 0xb35ba7ea -//.word 0xe22390ae -//.word 0x54cbdc3a -//.word 0xa05ffb90 -//.word 0xc9a5284a -//.word 0x12a2e43b -//.word 0x1460a353 -//.word 0x0defc5c3 -//.word 0x7baac762 -//.word 0xeabbbb4f -//.word 0x0ae2f5d8 -//.word 0x0472089b -//.word 0x0e9cf1eb -//.word 0x3eef9176 -//.word 0x9b206124 -//.word 0x7a076142 -//.word 0x08eb51df -//.word 0x23ff2476 -//.word 0x6e2cb2ce -//.word 0xa411ad1f -//.word 0x2c49d676 -//.word 0xeeec705a -//.word 0x6658f5b0 -//.word 0xf63109dc -//.word 0x81a6ac29 -//.word 0x35f6b36b -//.word 0xa83379e3 -//.word 0x2747d262 -//.word 0x4b3440b1 -//.word 0xcca06a31 -//.word 0x9a90c9bf -//.word 0x2a74a5da -//.word 0x0e644008 -//.word 0xc9a95175 -//.word 0xe17fb3de -//.word 0x36195fad -//.word 0x91e69866 -//.word 0x80136541 -//.word 0x62514419 -//.word 0xbed81d84 -//.word 0xd9ab7544 -//.word 0x871ee4de -//.word 0x4196c988 -//.word 0x78913c48 -//.word 0x29e6445b -//.word 0xb24d4ad4 -//.word 0xe421ce85 -//.word 0x59655922 -//.word 0x0706b3a4 -//.word 0x165f55ec -//.word 0xef0221a9 -//.word 0x96b6517b -//.word 0x39bcae59 -//.word 0x09570230 -//.word 0x488bcfcc -//.word 0xa32441fc -//.word 0xc3fa62f1 -//.word 0x1f748de8 -//.word 0x144b2509 -//.word 0x3790868e -//.word 0xeaf13c27 -//.word 0x2d38749d -//.word 0xb714afb6 -//.word 0x461cbe5a -//.word 0x3311eaf3 -//.word 0x4963731a -//.word 0xd7f73c6f -//.word 0x0428c4c8 -//.word 0x630c588f -//.word 0xc7f88765 -//.word 0x5946d70b -//.word 0xe755b683 -//.word 0x7fd2b372 -//.word 0x3d36eec9 -//.word 0x6190cda4 -//.word 0xa485f173 -//.word 0xcd956957 -//.word 0x7fa025cf -//.word 0x55a8ad93 -//.word 0x31d813c0 -//.word 0xd0c52536 -//.word 0xa2f5e83e -//.word 0xd99e4271 -//.word 0xc0aff7d5 -//.word 0x4f14d748 -//.word 0xfc363522 -//.word 0xd3c29a16 -//.word 0xc9acbb59 -//.word 0x4e73a906 -//.word 0x21a648c2 -//.word 0x68a7029c -//.word 0x00afbc36 -//.word 0x1212092a -//.word 0xe7c59ea7 -//.word 0xfd1d075b -//.word 0x5ad99896 -//.word 0x2063a5ac -//.word 0x6253f69b -//.word 0x363575ed -//.word 0x0b8c2ae0 -//.word 0x3d1769c5 -//.word 0xe7524aa6 -//.word 0xf9405a2b -//.word 0x8a6890be -//.word 0x6f1d83ee -//.word 0x0c03d911 -//.word 0x6acf032e -//.word 0x8a4e281a -//.word 0xf9a95ee0 -//.word 0xa5e72066 -//.word 0xefb3fd4e -//.word 0x01608d1b -//.word 0x622aa995 -//.word 0xc7bfdb6e -//.word 0x2dfe1425 -//.word 0x24fe9d2b -//.word 0x6e525045 -//.word 0xc88b0831 -//.word 0x08ff568c -//.word 0x68c976f3 -//.word 0x22118169 -//.word 0x3d8ee3f8 -//.word 0xa648109b -//.word 0x82a3735c -//.word 0xc399a7ba -//.word 0xf947ea4d -//.word 0x6babcfad -//.word 0x67ac338f -//.word 0xd65a7131 -//.word 0x1378daf9 -//.word 0xfe385f59 -//.word 0x4c4591f5 -//.word 0x2106cc08 -//.word 0xe022ae03 -//.word 0x423fce78 -//.word 0xa510ab37 -//.word 0xa78ee3b7 -//.word 0xf485a6b7 -//.word 0x5c536924 -//.word 0x29ecdf3e -//.word 0xaf2225f7 -//.word 0x24243d9b -//.word 0xb244bdb6 -//.word 0xcbfdc833 -//.word 0xbd343ec1 -//.word 0x86be307b -//.word 0xe92397c7 -//.word 0xc1a1457e -//.word 0x96741b4e -//.word 0x6e557d5d -//.word 0xe541032f -//.word 0x807b71ca -//.word 0x3fd4ea18 -//.word 0x712a608c -//.word 0xcc2f4f08 -//.word 0xbd6babff -//.word 0xfd8517d7 -//.word 0x65be5791 -//.word 0x03be08ab -//.word 0x6d938e45 -//.word 0x55f74f84 -//.word 0x5ed11f34 -//.word 0x2efffab1 -//.word 0xc553f907 -//.word 0x0ddb7f58 -//.word 0xb266b37e -//.word 0x334334f2 -//.word 0x3a4c08ec -//.word 0x2924d5cc -//.word 0xf5bc53b9 -//.word 0x371c0188 -//.word 0x806017df -//.word 0xed00bc9a -//.word 0xfc557a6d -//.word 0x9e59efcb -//.word 0x8eafc507 -//.word 0xe0e3e4ba -//.word 0xddf2e564 -//.word 0x0e0dca56 -//.word 0x979aedcf -//.word 0xc77c3765 -//.word 0xec9492a6 -//.word 0x6c87a100 -//.word 0x11c2aede -//.word 0xa5bce414 -//.word 0xbf7bbe7d -//.word 0xdc5abfe2 -//.word 0xb109641e -//.word 0xc0d55780 -//.word 0x2a2ae571 -//.word 0xc456b257 -//.word 0x6c8fabb9 -//.word 0x9e383da3 -//.word 0x4260c44c -//.word 0xc88c47f6 -//.word 0x77b66216 -//.word 0x029583b5 -//.word 0x5d1f5a16 -//.word 0xce4d8a99 -//.word 0x471ea5df -//.word 0xf3de572f -//.word 0x0fa8e118 -//.word 0xfb2ac958 -//.word 0x91a8d0fd -//.word 0xb54325ca -//.word 0x2d7cd8dc -//.word 0xb4f4918e -//.word 0x49758299 -//.word 0xcd369a80 -//.word 0xcd5bfc2b -//.word 0x9dbcafd1 -//.word 0xa6e7971c -//.word 0x0068a488 -//.word 0x4448490d -//.word 0x9bd330fd -//.word 0x1b9e2c2f -//.word 0x54c96f5d -//.word 0x2582fd80 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x000082D8 -//// expected output -//.word 0x6c66192d -//.word 0x7e119cfb -//.word 0x52e82221 -//.word 0x75919960 -//.word 0x77095c73 -//.word 0xa7b957a0 -//.word 0x610ee815 -//.word 0xf9000fcd -//.word 0xc7756c08 -//.word 0xcc622779 -//.word 0x8ec73b65 -//.word 0x16660093 -//.word 0x78c879e4 -//.word 0x7a2402e8 -//.word 0x861fd1cb -//.word 0x80ec0369 -//// SHA512LongMsgvector_42 -//// vector length -//.word 0x000085F0 -//// input message -//.word 0xfe722fd9 -//.word 0xa593c85e -//.word 0x68961b93 -//.word 0x864efe04 -//.word 0x24da67de -//.word 0x94d6d5b9 -//.word 0xd6ceebb6 -//.word 0x5ff85eca -//.word 0x1a221259 -//.word 0xade98007 -//.word 0xfd2c5bcb -//.word 0xf4c07345 -//.word 0x8265d951 -//.word 0xe1f944dc -//.word 0x1eecb3f6 -//.word 0xd5f45429 -//.word 0x3c02a509 -//.word 0x6274d90d -//.word 0xb98c7d9d -//.word 0xd3215b6c -//.word 0x69949f08 -//.word 0xa10638b0 -//.word 0x90c88165 -//.word 0xfe132143 -//.word 0x6afa3012 -//.word 0x4e9c9b19 -//.word 0xa59ec932 -//.word 0xa9d97e24 -//.word 0xe14f002c -//.word 0x5b6479dd -//.word 0x374b9d2b -//.word 0x65be8cc2 -//.word 0xaef2fa9c -//.word 0xf9ca8dd2 -//.word 0xc74b86b2 -//.word 0x0150a413 -//.word 0xf37e45e5 -//.word 0x987bcf0c -//.word 0x185b4e6f -//.word 0x8f5b5f4b -//.word 0x10d24cce -//.word 0xea6478e1 -//.word 0x2979fe45 -//.word 0x60ed95e1 -//.word 0xa60ab75a -//.word 0xdfb302e5 -//.word 0x3de1de59 -//.word 0x06546089 -//.word 0x97826ed0 -//.word 0xa9d424ed -//.word 0xd3117711 -//.word 0x501a1837 -//.word 0x03d99bb4 -//.word 0xb874d90f -//.word 0xadc69312 -//.word 0x510f5821 -//.word 0x4beaa8cb -//.word 0xbe80599f -//.word 0xcbfc3a41 -//.word 0x583ff7bd -//.word 0x10d43c1a -//.word 0xab261d33 -//.word 0x70f0b6c2 -//.word 0xf8f60ebe -//.word 0x34f342e7 -//.word 0xb2d2df9f -//.word 0x1b208ffb -//.word 0x01c2f81a -//.word 0xd7e3e1b5 -//.word 0x413196f8 -//.word 0x8f498e90 -//.word 0x836f4c06 -//.word 0x5b83834b -//.word 0x0b307d94 -//.word 0xcb67bd67 -//.word 0xd10ce4f6 -//.word 0x60efd1ad -//.word 0x01fd0c07 -//.word 0x11b865a5 -//.word 0x7be4d8a1 -//.word 0xc783b420 -//.word 0x5404fd26 -//.word 0xe1b80eaf -//.word 0x528582fb -//.word 0xb1de5529 -//.word 0x74f24707 -//.word 0xfe248129 -//.word 0x68bc7b38 -//.word 0x80dc1d8d -//.word 0x12b525fe -//.word 0x67fac8f8 -//.word 0x0c959ccf -//.word 0xd49ab551 -//.word 0x20790ea1 -//.word 0x5e772b43 -//.word 0xd05ffd73 -//.word 0x8f7406bb -//.word 0xcfabbec4 -//.word 0x6417346d -//.word 0x86a5f81a -//.word 0xd109394e -//.word 0x8ff82b7d -//.word 0x3a98ab1b -//.word 0x3d3526f9 -//.word 0xfb35b7d1 -//.word 0x124e8f20 -//.word 0xe1f69a33 -//.word 0x481b6085 -//.word 0xae152948 -//.word 0x49d96442 -//.word 0x996f49da -//.word 0x36a6be73 -//.word 0xcc0677f8 -//.word 0x640662b8 -//.word 0xe57f4275 -//.word 0xda6199b7 -//.word 0x75a5cc66 -//.word 0xd4828298 -//.word 0x84e44da8 -//.word 0x441a8c88 -//.word 0x0bce9058 -//.word 0x4c3bfd37 -//.word 0x789a7359 -//.word 0xc5dd6e59 -//.word 0x2ea06bd1 -//.word 0xba5d4d29 -//.word 0x02dffeac -//.word 0xedf959e1 -//.word 0xbf774818 -//.word 0x52552943 -//.word 0xa22f7707 -//.word 0x90f9a613 -//.word 0xdff04eb1 -//.word 0x83d08c9a -//.word 0x1b48a60f -//.word 0xbcabed25 -//.word 0xf0e8e861 -//.word 0xfebcae84 -//.word 0x6c2694a8 -//.word 0xc31c088c -//.word 0x927cbd2d -//.word 0xb5450996 -//.word 0xd7078bf8 -//.word 0x369810fd -//.word 0xa609b75a -//.word 0xd9d854a4 -//.word 0xdd671364 -//.word 0xe6ad5e6d -//.word 0x4e2c006d -//.word 0xda238ac3 -//.word 0x3f04f590 -//.word 0xe5288a11 -//.word 0xeac2ff2c -//.word 0x6a12e348 -//.word 0xfedb3c62 -//.word 0x82166e5d -//.word 0x1ce85e9a -//.word 0x79d2d8c9 -//.word 0x5a282eff -//.word 0x50c42208 -//.word 0xc3fb06fe -//.word 0x39d0221a -//.word 0xd56856cb -//.word 0x1ebe0105 -//.word 0x039821dc -//.word 0x1bbabb51 -//.word 0x31597d6c -//.word 0xffd2a28b -//.word 0x3a9c16f9 -//.word 0xcf7bdac2 -//.word 0x6df7abc6 -//.word 0x430dde0d -//.word 0x0b248f5a -//.word 0x4743fa03 -//.word 0xca8029ff -//.word 0x7bbcd041 -//.word 0x568d7544 -//.word 0xb37cd3e8 -//.word 0xcb71817c -//.word 0x786bcf1c -//.word 0x3c74f13d -//.word 0x85d55f86 -//.word 0x2f867be2 -//.word 0x4be874d3 -//.word 0x1fb66b09 -//.word 0x6d39d533 -//.word 0xf9bc2115 -//.word 0x45409ada -//.word 0x9f718eac -//.word 0x5dd8b083 -//.word 0x6851bb3a -//.word 0xf7c058e8 -//.word 0x9d00426d -//.word 0x861ca84b -//.word 0xfec2d3b8 -//.word 0x32f408f1 -//.word 0x3b01b0d0 -//.word 0x58b4b6a1 -//.word 0x7bcb3132 -//.word 0x08aa4329 -//.word 0xd951409a -//.word 0x858c13d9 -//.word 0xe269de8d -//.word 0xc8efe106 -//.word 0x180d9dd1 -//.word 0xfdd13989 -//.word 0x72db24ef -//.word 0x0510fc3d -//.word 0xda93afb8 -//.word 0xf2f1e085 -//.word 0xad9b8cbd -//.word 0x8e9aedc4 -//.word 0x3f7e9ed6 -//.word 0xd59701e2 -//.word 0x5468de9c -//.word 0x76594cce -//.word 0xa8acd5ee -//.word 0x56b2d5f6 -//.word 0x683f2370 -//.word 0x0d5bf3d0 -//.word 0xb73afb07 -//.word 0x676fd555 -//.word 0x2a5ca55f -//.word 0xe3edfb81 -//.word 0x4c86fb65 -//.word 0x3839bbd5 -//.word 0x1b3deccd -//.word 0xcb9bbdd5 -//.word 0x882bfc8d -//.word 0x3bbf7e8a -//.word 0xfb9ec260 -//.word 0xd534d100 -//.word 0xcd076845 -//.word 0x20ed59c9 -//.word 0xcc7d2ffd -//.word 0x52c31179 -//.word 0xbb38e990 -//.word 0xd9f0c528 -//.word 0xcf167dc8 -//.word 0xd49696f3 -//.word 0x331966b5 -//.word 0x9636797b -//.word 0x85e63428 -//.word 0x2a39b864 -//.word 0x57480937 -//.word 0xca6b70d8 -//.word 0xafac1dbf -//.word 0x667b1101 -//.word 0x87a33bdd -//.word 0x237ce192 -//.word 0x4d624274 -//.word 0xd9677a3f -//.word 0x6445a5ab -//.word 0x95974741 -//.word 0xa148ec6c -//.word 0x154b0bd3 -//.word 0xd08c30e6 -//.word 0x4e275ab7 -//.word 0x2dd9a20c -//.word 0xe9b31eb2 -//.word 0xeb160514 -//.word 0xc2db140c -//.word 0xb0d230f8 -//.word 0x686e4c11 -//.word 0x16be8df8 -//.word 0xa09fac92 -//.word 0x2b319d16 -//.word 0xe2876e64 -//.word 0xf2a37199 -//.word 0xd9a19de0 -//.word 0xe132328b -//.word 0xe74c9c62 -//.word 0x61209a3a -//.word 0xa04d9fca -//.word 0x525379bb -//.word 0x4a4a30fe -//.word 0x84d43162 -//.word 0x6350ab66 -//.word 0x3e503a4b -//.word 0x1b4dc36e -//.word 0xba9a9fd5 -//.word 0xd697fb08 -//.word 0xa7277e22 -//.word 0xab642d27 -//.word 0xa6918c98 -//.word 0xe84f0645 -//.word 0xce148f63 -//.word 0x8bda88de -//.word 0x2814e3f1 -//.word 0xcae687f3 -//.word 0x3495f674 -//.word 0x8c3d2d88 -//.word 0x62c2cc63 -//.word 0xee087626 -//.word 0x99677bf9 -//.word 0xc059b45a -//.word 0xb476afb4 -//.word 0x05a30c34 -//.word 0x008627d8 -//.word 0x763df8c9 -//.word 0xbf4f37ea -//.word 0xffe2c3b1 -//.word 0xa82f4436 -//.word 0x40340f89 -//.word 0x65a84b49 -//.word 0x0e345272 -//.word 0x13e05a77 -//.word 0xf0cc5591 -//.word 0xc6201656 -//.word 0xa245b48d -//.word 0x02563341 -//.word 0x95d16114 -//.word 0x4393ffd6 -//.word 0x6d032156 -//.word 0x768dd878 -//.word 0x82520d88 -//.word 0x7d1db0ce -//.word 0x60991363 -//.word 0xafc29043 -//.word 0x469a72a2 -//.word 0x561d1384 -//.word 0xab764188 -//.word 0x3073e604 -//.word 0xb437e857 -//.word 0xee2f4f7b -//.word 0xbf47a6da -//.word 0xb85da363 -//.word 0xdcf50adc -//.word 0xa72fce7a -//.word 0x4ff779af -//.word 0x497ccf43 -//.word 0x0fe3aea6 -//.word 0x213c3985 -//.word 0x49b5369b -//.word 0x240db3ca -//.word 0xde4cf06a -//.word 0x3db279e1 -//.word 0xe1ed9373 -//.word 0xca8fd95c -//.word 0x1abe271c -//.word 0x1c2db713 -//.word 0x864c8a4d -//.word 0xfbbc0a9f -//.word 0xd406edf3 -//.word 0x208c5ce0 -//.word 0xe9c0557e -//.word 0xba934e78 -//.word 0x5d311b62 -//.word 0xe9eb114d -//.word 0xfd746c99 -//.word 0x4651ee0b -//.word 0x478bc91f -//.word 0x59a7bfa0 -//.word 0xf0d78875 -//.word 0x217274be -//.word 0x61a25120 -//.word 0x905d8f5c -//.word 0x3696a227 -//.word 0x0cb4a836 -//.word 0xbe434c98 -//.word 0xefe9ea48 -//.word 0x7d9cf403 -//.word 0x07139457 -//.word 0xad7a92fd -//.word 0x176a7968 -//.word 0xb918f59e -//.word 0x55cd8047 -//.word 0xc1963d03 -//.word 0xea3c2401 -//.word 0x197660ce -//.word 0x755ef56a -//.word 0xca22a6a1 -//.word 0x88fc1698 -//.word 0x0f642da7 -//.word 0x2984bd66 -//.word 0xd8ec660b -//.word 0x5387b7f3 -//.word 0x4bcd957e -//.word 0x723be120 -//.word 0x3e0055b5 -//.word 0xeafaaf15 -//.word 0xbfe012e9 -//.word 0x91c1a9bd -//.word 0x8cad8d56 -//.word 0x31b2e945 -//.word 0x9b0a5cbc -//.word 0x07929ea1 -//.word 0x937e67e1 -//.word 0x464b8c07 -//.word 0x51f66b0d -//.word 0x946c8a71 -//.word 0x64417b8c -//.word 0x8ca40320 -//.word 0x91937b30 -//.word 0x3b4b7514 -//.word 0x5003a3cc -//.word 0xa3d9f595 -//.word 0x4d0d02ba -//.word 0x3b6da9ad -//.word 0xe910f856 -//.word 0x6c474cab -//.word 0xb6d1ba81 -//.word 0x164eaea1 -//.word 0xfef6d21f -//.word 0x098b32e7 -//.word 0x3c8c9d99 -//.word 0x8dac4e97 -//.word 0xa183cc5c -//.word 0xda820e0f -//.word 0x912ce357 -//.word 0xa0839172 -//.word 0x24c1bc81 -//.word 0x81498a26 -//.word 0xa6dd0551 -//.word 0x9211c157 -//.word 0x1600be45 -//.word 0xdd3d8f73 -//.word 0xab0dbc5c -//.word 0xe2d366ac -//.word 0x4acb299b -//.word 0x11fb477a -//.word 0x1167028b -//.word 0x52854916 -//.word 0xd0f097b9 -//.word 0x7e601900 -//.word 0x8ada0f36 -//.word 0xe324747a -//.word 0xf97ce115 -//.word 0xc489af0a -//.word 0x07925cef -//.word 0xd6ee2ffc -//.word 0x56bc1f62 -//.word 0xc4d4f2dd -//.word 0xb8fda28d -//.word 0xab600402 -//.word 0xb73cab96 -//.word 0x9fdc0bff -//.word 0x0fc6da24 -//.word 0x2536bc30 -//.word 0x2fca1ee5 -//.word 0xb77f6234 -//.word 0xbddc3d0a -//.word 0x436d5e6c -//.word 0x0f7351c6 -//.word 0xacdaa280 -//.word 0xb26b45d3 -//.word 0x474335db -//.word 0xe6845ced -//.word 0x5f4ab32a -//.word 0x1fe1aa54 -//.word 0xb235cae1 -//.word 0x8689994e -//.word 0xf26cbeb6 -//.word 0x76e965a3 -//.word 0x45ffe524 -//.word 0x0051a020 -//.word 0xc51d2be9 -//.word 0x6872b014 -//.word 0x009e9089 -//.word 0xa6e64cd6 -//.word 0x797ba5c9 -//.word 0xe6a9023d -//.word 0x26501334 -//.word 0x0798b426 -//.word 0xf0e11499 -//.word 0x1ff916f2 -//.word 0x3692f78b -//.word 0xf6f33205 -//.word 0x4aeda0e0 -//.word 0x8711e448 -//.word 0xf2200632 -//.word 0x83c35ea8 -//.word 0xe87cb461 -//.word 0xcddda595 -//.word 0x5bf8480f -//.word 0xfe161284 -//.word 0x6cacf723 -//.word 0xe38ad26d -//.word 0xb1560747 -//.word 0xfa39674e -//.word 0xb6d8546a -//.word 0xf98625a6 -//.word 0x77b7cc3f -//.word 0x47b8b5fa -//.word 0xe79ef2bb -//.word 0x817d9654 -//.word 0x6cda5e9b -//.word 0xf66297bf -//.word 0x61dc3bdc -//.word 0x2b5c5ecc -//.word 0x93b9c841 -//.word 0x5842e410 -//.word 0xc4add9d0 -//.word 0xe950f6a4 -//.word 0x2b945355 -//.word 0xfea6b5a4 -//.word 0xf16fb3de -//.word 0xecc717b0 -//.word 0xb5e5873d -//.word 0xb91a656e -//.word 0x0ac0f389 -//.word 0xa46dbb06 -//.word 0xf46c2e9e -//.word 0x9b6d8ba4 -//.word 0x6f7b0298 -//.word 0xc22f1afa -//.word 0xe823505c -//.word 0xf3aa00bb -//.word 0xc1be890f -//.word 0x393aad21 -//.word 0xd14a369d -//.word 0x531fdf68 -//.word 0xe2e77133 -//.word 0x38fc2d51 -//.word 0x315b6ac5 -//.word 0x8d597fa0 -//.word 0xf191e38a -//.word 0x3021939e -//.word 0xc916b47b -//.word 0xb1247a97 -//.word 0x529b48d7 -//.word 0xd396195d -//.word 0x9a751ea2 -//.word 0x0f8ea8c4 -//.word 0xa3204921 -//.word 0x12883624 -//.word 0xe4b8f05f -//.word 0x3ae424da -//.word 0xc77ecfab -//.word 0x1d65a5c7 -//.word 0x2a5ab418 -//.word 0x02b345d0 -//.word 0xdf5303fc -//.word 0x65d95f5c -//.word 0x2b183272 -//.word 0x78c8a4d9 -//.word 0x4a7a4ed8 -//.word 0x9dd29b37 -//.word 0xe9f07451 -//.word 0xed2f1c6b -//.word 0xab125844 -//.word 0xb47bd4ed -//.word 0xa51ec2db -//.word 0xf236c43b -//.word 0xe2760c85 -//.word 0xdb43c154 -//.word 0xe020a575 -//.word 0x586af63e -//.word 0x11459221 -//.word 0x84d65e81 -//.word 0x5bb3e7c3 -//.word 0x30974aa9 -//.word 0x985b52db -//.word 0x6021e1c7 -//.word 0x16d391ab -//.word 0xcbcc9af0 -//.word 0x18d4f7ba -//.word 0x5f52c4bd -//.word 0x53bdeb52 -//.word 0xbb54ffca -//.word 0x730f6802 -//.word 0xb3d5c137 -//.word 0x93ef7e1c -//.word 0xcfbdd22a -//.word 0xc8a7d038 -//.word 0xcc57d04b -//.word 0x972514af -//.word 0x1ad3ab47 -//.word 0x7b7b9621 -//.word 0x5cc52a4d -//.word 0x605db5f0 -//.word 0xeba56494 -//.word 0x2aa764c2 -//.word 0x544d48d3 -//.word 0x2fd4ab03 -//.word 0xd57e16c7 -//.word 0xb8872461 -//.word 0xe45be3b1 -//.word 0x84067e4e -//.word 0xa8ec19d5 -//.word 0x45bafd81 -//.word 0x7d9cf5fc -//.word 0x21b1f775 -//.word 0x75bc07f3 -//.word 0x331c59e9 -//.word 0xd2feb60a -//.word 0x07d1205e -//.word 0x8dfab996 -//.word 0x22c9e19d -//.word 0xd2ac9f6f -//.word 0x77a3422e -//.word 0x81f44873 -//.word 0xf3207ee2 -//.word 0xae156901 -//.word 0xf2a5e54a -//.word 0x22370c7e -//.word 0xc7bd593d -//.word 0xd8e60dd4 -//.word 0x3994d256 -//.word 0x81909fee -//.word 0x007ddb73 -//.word 0x010ac53d -//.word 0x4c6c1337 -//.word 0xef0cd936 -//.word 0x3e7cad89 -//.word 0x19b009d2 -//.word 0x6d6bf114 -//.word 0xfdf7d50c -//.word 0x6319b8c5 -//.word 0x51449267 -//.word 0x1d0df34f -//.word 0x7ddfea65 -//.word 0x8ff025aa -//.word 0x1c735911 -//.word 0x1d10e590 -//.word 0x7e91b276 -//.word 0x23de5dff -//.word 0x292b9826 -//.word 0x6e70cdba -//.word 0x531905b4 -//.word 0xc0ff09c8 -//.word 0x6998c63a -//.word 0x506af6f3 -//.word 0x8bc6fdd4 -//.word 0x48b2114a -//.word 0x0e279e23 -//.word 0x467de9a0 -//.word 0xf923f3cb -//.word 0xdb93a00a -//.word 0x898518f5 -//.word 0x0f636e65 -//.word 0xadfe80cd -//.word 0xdb7f1ece -//.word 0x8aa06e05 -//.word 0xad1c8e28 -//.word 0xf8637c51 -//.word 0xe7933399 -//.word 0x03a417e9 -//.word 0x61e2930d -//.word 0x6ba1010a -//.word 0xe22ccab2 -//.word 0x24fece75 -//.word 0xab35067a -//.word 0xd74367ef -//.word 0xede70a9d -//.word 0x5f5c8bbf -//.word 0x4ed0af14 -//.word 0x4d174933 -//.word 0x68a15e1f -//.word 0x65a9871b -//.word 0x49b097bf -//.word 0x1e2a7e4c -//.word 0xf4776d3d -//.word 0x26143b1e -//.word 0xde1308a1 -//.word 0xdbc820ef -//.word 0x72c6213c -//.word 0xd30a619e -//.word 0x8e758a1f -//.word 0x56808711 -//.word 0x042ba4a1 -//.word 0xdf36f0af -//.word 0x1a94e6dd -//.word 0x9e1d4de6 -//.word 0x0a835d32 -//.word 0xf88723a7 -//.word 0x836c27c1 -//.word 0x06ac4be5 -//.word 0x25ebf6f2 -//.word 0x1229721a -//.word 0x093b93f0 -//.word 0x1d7c9ac1 -//.word 0x37c05828 -//.word 0x5c8997dd -//.word 0x2e7eb5ce -//.word 0xb6189271 -//.word 0x609fad58 -//.word 0x47558906 -//.word 0xb3f15601 -//.word 0xe04ecd28 -//.word 0x02655c47 -//.word 0x857983e9 -//.word 0x99917e6d -//.word 0xee2b245c -//.word 0xbc2f0ffa -//.word 0x0722fd1b -//.word 0x219c7638 -//.word 0x70fcafc2 -//.word 0x715aafb6 -//.word 0xfdbdb072 -//.word 0xcc8ec8c7 -//.word 0x374dc84f -//.word 0x42836501 -//.word 0xd9f89502 -//.word 0x5a253cbe -//.word 0x54ec0838 -//.word 0x8f87999e -//.word 0x4cbfe621 -//.word 0xcd5edc04 -//.word 0x18e648f2 -//.word 0xf983f694 -//.word 0x463f1a63 -//.word 0x6675f0bb -//.word 0x1488a031 -//.word 0x61d46427 -//.word 0xf8e5ec9e -//.word 0xa6e7024b -//.word 0x1a5e6aec -//.word 0xe9180cdc -//.word 0xd55f55e5 -//.word 0x4e73da56 -//.word 0x39373e56 -//.word 0xf12a5678 -//.word 0x8b998c90 -//.word 0x5f1381c4 -//.word 0xc31ef7e6 -//.word 0x1a28ed01 -//.word 0x0ec00b31 -//.word 0x190641b8 -//.word 0x4a60ac4f -//.word 0x466fb9ba -//.word 0x8d428c9f -//.word 0xfec9a398 -//.word 0x9e8cb687 -//.word 0x959ce22a -//.word 0x79ca07ef -//.word 0xcf186f09 -//.word 0xcf6db0c3 -//.word 0x688dd314 -//.word 0x8447b574 -//.word 0x8df1aeef -//.word 0x30117178 -//.word 0x615d337f -//.word 0x9fe610c6 -//.word 0x7990aa70 -//.word 0x51c5135b -//.word 0x606aedaf -//.word 0xfa12cfb7 -//.word 0x1372ebf0 -//.word 0x0316ee60 -//.word 0x86522829 -//.word 0x077aed5e -//.word 0x1e553b15 -//.word 0x57d09cbe -//.word 0x35f04eb3 -//.word 0x760aa210 -//.word 0x9936a2c4 -//.word 0x9e01f6e8 -//.word 0x0d620950 -//.word 0x39f06760 -//.word 0xc6516a21 -//.word 0x69f61594 -//.word 0xef054047 -//.word 0x8197f525 -//.word 0x26241b92 -//.word 0x893b51b8 -//.word 0xfd771d1b -//.word 0xbeae4674 -//.word 0x796b7ebc -//.word 0x0f9f4487 -//.word 0x97930993 -//.word 0xa22192a1 -//.word 0xc2249d83 -//.word 0x4d2dc777 -//.word 0x5e78adb3 -//.word 0x1d1e5241 -//.word 0x408bc10d -//.word 0xd233f33d -//.word 0x3381f2c0 -//.word 0x61103f2a -//.word 0x751e71bf -//.word 0x713e20cd -//.word 0x384c0140 -//.word 0xdea65270 -//.word 0x2299793d -//.word 0x391ae85e -//.word 0xceb743f6 -//.word 0x46cdc568 -//.word 0x48fae06d -//.word 0x7dd52364 -//.word 0x94dd61e9 -//.word 0x8ab010a8 -//.word 0x287eef73 -//.word 0xcdbcec93 -//.word 0x6d1d445c -//.word 0xdabeec05 -//.word 0x42a030b6 -//.word 0xf95c9ae1 -//.word 0x791215d6 -//.word 0xa8a35292 -//.word 0x59206bd8 -//.word 0x1482c684 -//.word 0x1a9b3d1b -//.word 0xa44c7ba6 -//.word 0x6cf9a9c1 -//.word 0x6e3a4bef -//.word 0xf0d36430 -//.word 0xc0e7e1d6 -//.word 0xbd683494 -//.word 0x98d240d8 -//.word 0xdc19755a -//.word 0x2cdf3cf5 -//.word 0xcceb95b7 -//.word 0x64d7fe34 -//.word 0x0008981f -//.word 0x5ae4851b -//.word 0x5c3e94ce -//.word 0xe1152037 -//.word 0xbc7f3542 -//.word 0xfbe0f59a -//.word 0x6d5f3abf -//.word 0x619b7d58 -//.word 0xb199f7ca -//.word 0xff020509 -//.word 0x3f8bd1af -//.word 0x75b42f4b -//.word 0xc0b5c5fb -//.word 0x98b56f3d -//.word 0x543ee202 -//.word 0xefee8f04 -//.word 0x0b6fca5a -//.word 0x36a92b49 -//.word 0x6d35345e -//.word 0xde1535b9 -//.word 0xf2a36dac -//.word 0x8bc87285 -//.word 0x8b6ed3a7 -//.word 0x9538fbe0 -//.word 0x177058f6 -//.word 0x8841bd83 -//.word 0xee260503 -//.word 0xa4a2fa2c -//.word 0x5a32757e -//.word 0x5d80c61a -//.word 0x19d955d7 -//.word 0xdce18a93 -//.word 0xdc85ebc7 -//.word 0x7c32845e -//.word 0xcb448cc8 -//.word 0x4dc2454a -//.word 0xff482498 -//.word 0x954432a5 -//.word 0x0665b2ba -//.word 0x4a5104c6 -//.word 0x6297c9f5 -//.word 0x9ae44883 -//.word 0x0b7911d3 -//.word 0x63dcdfbb -//.word 0xe9cec322 -//.word 0xbb7e7fce -//.word 0x5afc3077 -//.word 0x69f03120 -//.word 0xb28c3ba7 -//.word 0x6abfd19a -//.word 0xb6acdb4c -//.word 0x6e5a9128 -//.word 0x20ad9a46 -//.word 0x5895753c -//.word 0x1e851937 -//.word 0xc127d84a -//.word 0xd34e8905 -//.word 0x752ce64a -//.word 0xd5c5335c -//.word 0xf4a32139 -//.word 0xadcbf12a -//.word 0xf3f1dc98 -//.word 0x5ae8b321 -//.word 0xd85cc3eb -//.word 0xcdc3fb38 -//.word 0x4291513b -//.word 0x6eab612b -//.word 0x7f1f5795 -//.word 0x971210f6 -//.word 0x14fa7c89 -//.word 0x140d475e -//.word 0x38f8b8ac -//.word 0xa9d5d968 -//.word 0x5957d816 -//.word 0x8c48ade0 -//.word 0x9636fde5 -//.word 0xe6693ed3 -//.word 0x43181db8 -//.word 0x56dc1c15 -//.word 0x69648035 -//.word 0x6e6b6abc -//.word 0x43e74483 -//.word 0x34835ea3 -//.word 0xc250d9d0 -//.word 0xa2b7c5e9 -//.word 0x09b386cc -//.word 0x273d7c6f -//.word 0xf107e32d -//.word 0x246cf75d -//.word 0x87a75c29 -//.word 0x7044be9e -//.word 0x89d5b5ff -//.word 0xd4e6eb5f -//.word 0xed33806e -//.word 0x9018ad94 -//.word 0x5a48a83c -//.word 0xd4c2c873 -//.word 0xad01eab1 -//.word 0x477313f6 -//.word 0x762d5719 -//.word 0x84ddf95d -//.word 0x7800d346 -//.word 0x9755f8ab -//.word 0x2c91990b -//.word 0x85542525 -//.word 0x3e5cb4c2 -//.word 0xc2f9a6d6 -//.word 0x0ec087c7 -//.word 0xb884360d -//.word 0x308247fb -//.word 0x47dca5dc -//.word 0xed497c42 -//.word 0x3f0a569b -//.word 0xc1208405 -//.word 0xe7bcbf64 -//.word 0xdbf70fb1 -//.word 0x7ac3ec95 -//.word 0x9f21a336 -//.word 0xa595fc51 -//.word 0x27d71a89 -//.word 0x0acca2fe -//.word 0xbeb42022 -//.word 0xc0a5a6c8 -//.word 0x6438b67e -//.word 0xd182611d -//.word 0x4d46b19e -//.word 0xbb68452f -//.word 0x61a53b86 -//.word 0xef825376 -//.word 0xbd8250c0 -//.word 0x559ca22b -//.word 0x31ec43d7 -//.word 0xc6a9dfce -//.word 0xc15737dc -//.word 0x903ec7a1 -//.word 0x241aa6e4 -//.word 0xf514af2a -//.word 0x47f1de87 -//.word 0xac8afcb5 -//.word 0xcb7c7f63 -//.word 0x5f20accf -//.word 0x83befe97 -//.word 0x2cfdcbcd -//.word 0xf79e2549 -//.word 0x256aff43 -//.word 0xe3699021 -//.word 0xcf55fd8d -//.word 0xb94e32cb -//.word 0xa6cf1049 -//.word 0x1be1ce78 -//.word 0x988f99db -//.word 0x62997e5e -//.word 0x856d8ae8 -//.word 0x1a523033 -//.word 0xc6e7eadc -//.word 0x83cc23b6 -//.word 0xa39f5564 -//.word 0x122a6f27 -//.word 0xdbda79f4 -//.word 0xed737aca -//.word 0x20039a42 -//.word 0x73158468 -//.word 0x97260ec9 -//.word 0xb25d1ccd -//.word 0x5d76c147 -//.word 0xee00a84b -//.word 0xfdc8b340 -//.word 0x2195e135 -//.word 0xfb157579 -//.word 0x76185565 -//.word 0x4cfcb07d -//.word 0xcd68e3b8 -//.word 0xdc3e9e1b -//.word 0x3aca428c -//.word 0x07408ee6 -//.word 0x85657b49 -//.word 0x208c64b4 -//.word 0xabc46ad5 -//.word 0xed50171f -//.word 0x5c57421e -//.word 0x28dd3207 -//.word 0x7bf20694 -//.word 0x0029530e -//.word 0xa24c10ab -//.word 0x964eaf1b -//.word 0x9b818d5e -//.word 0x80098cd8 -//.word 0xe791fea7 -//.word 0x4a3dc634 -//.word 0x3bdfb908 -//.word 0xf06d4be2 -//.word 0xfeb36706 -//.word 0x65459ed7 -//.word 0xcdb884a8 -//.word 0x0f1157d0 -//.word 0xf77ee2fc -//.word 0x4944a1ca -//.word 0x01f92693 -//.word 0xdff3bb87 -//.word 0x23004900 -//.word 0x96577910 -//.word 0xc9cf185c -//.word 0xa14fc02e -//.word 0x1386b5c5 -//.word 0x2ddc0df0 -//.word 0x56a814db -//.word 0xd6a3ee28 -//.word 0x999d7e41 -//.word 0x2f6e87ed -//.word 0x18301122 -//.word 0x3fab0f1b -//.word 0xc4113ea9 -//.word 0xfeec50ce -//.word 0xc1544a88 -//.word 0xdc652beb -//.word 0xe6f0ce72 -//.word 0x3b711197 -//.word 0x414137a1 -//.word 0xf00d8bbe -//.word 0x91874651 -//.word 0xc55bb38d -//.word 0xca659143 -//.word 0xfa21b9f8 -//.word 0x9463013b -//.word 0xbf485f36 -//.word 0xcc6c5282 -//.word 0xbc5d7d40 -//.word 0x02509565 -//.word 0x8a137e55 -//.word 0xf943b1b4 -//.word 0x37bfe178 -//.word 0x2b5cde43 -//.word 0xc5dbb9f1 -//.word 0x4218296c -//.word 0xab832dc8 -//.word 0x9fd4f38c -//.word 0x53fbf94d -//.word 0xd7567282 -//.word 0x9b27eb93 -//.word 0x31452e33 -//.word 0x541267f0 -//.word 0x2aac8508 -//.word 0xc668e37f -//.word 0xf17c286e -//.word 0x2afb6c9e -//.word 0xeb079c55 -//.word 0x2e421f70 -//.word 0x3085b9b2 -//.word 0x75d5b05c -//.word 0x0c922efe -//.word 0x14f2e78c -//.word 0x7faefbb4 -//.word 0x16fb1e6f -//.word 0xbdbcf6d7 -//.word 0xf9f6c438 -//.word 0xaf844769 -//.word 0x2f0cde5d -//.word 0x7031ecf5 -//.word 0x9d0a8018 -//.word 0xd1d33606 -//.word 0x20e358e9 -//.word 0xd6de49ae -//.word 0x032c2412 -//.word 0x37aaa000 -//.word 0x8a9f371a -//.word 0xdff18796 -//.word 0x6a99f84b -//.word 0x70548000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x000085F0 -//// expected output -//.word 0x2711cb98 -//.word 0x0cb4fd62 -//.word 0xdf854469 -//.word 0x40d9c5d0 -//.word 0xe382912c -//.word 0x96e80ecf -//.word 0xdcdaf719 -//.word 0x5f377130 -//.word 0xd01f1530 -//.word 0xb429e365 -//.word 0x8c371e7a -//.word 0x91e3a738 -//.word 0x814ca8c7 -//.word 0xb1139d98 -//.word 0x47756f24 -//.word 0xe9d247fe -//// SHA512LongMsgvector_43 -//// vector length -//.word 0x00008908 -//// input message -//.word 0x61ddef57 -//.word 0xb77c6c12 -//.word 0x2d6128de -//.word 0x0b45475d -//.word 0x3af8acf7 -//.word 0x4e521a74 -//.word 0xc46d99ca -//.word 0x87111c33 -//.word 0xb9706083 -//.word 0xb11417b9 -//.word 0x401546d4 -//.word 0x398fece8 -//.word 0x3053e470 -//.word 0x81dd0ce6 -//.word 0x9587a791 -//.word 0x60fc009f -//.word 0x2eee5173 -//.word 0xa00ce240 -//.word 0xf12e75d7 -//.word 0x7ed3e2bd -//.word 0x86ceff81 -//.word 0x2e3cc24c -//.word 0xc8b9aaba -//.word 0x54d45ae8 -//.word 0x47c088cf -//.word 0x8c4c15d0 -//.word 0xc9147d8f -//.word 0xe3f97205 -//.word 0xc4d0c4d1 -//.word 0x5c5784cf -//.word 0xe56d69ec -//.word 0x6c827239 -//.word 0x8d4ccd3e -//.word 0x7ebbf890 -//.word 0x4f3026a6 -//.word 0x6feae4e8 -//.word 0x73c0fc09 -//.word 0x13169a97 -//.word 0x750aadd0 -//.word 0xafee90b8 -//.word 0x87fbea68 -//.word 0x7c43d3a9 -//.word 0x0be838c1 -//.word 0x2b8c808d -//.word 0x1a086fd0 -//.word 0x5b614bcb -//.word 0x00f83e0e -//.word 0x2500fc8d -//.word 0xbd35a5f6 -//.word 0x91cbed42 -//.word 0x85a57a8b -//.word 0x1dc88e1d -//.word 0x410fe5cf -//.word 0x3d20e194 -//.word 0x0c9ee44d -//.word 0xd6a1fde1 -//.word 0xb763c890 -//.word 0xc23c8f84 -//.word 0x46d0b5a9 -//.word 0x4f8755bf -//.word 0x703d26ae -//.word 0xc03ba219 -//.word 0x23666735 -//.word 0xcbb7dddc -//.word 0xfeeb19dd -//.word 0x197c0197 -//.word 0xd5cfb1c6 -//.word 0xc9af1e9c -//.word 0x30faf914 -//.word 0xed9ad783 -//.word 0xccb78e6f -//.word 0x0b2be2a5 -//.word 0x19376186 -//.word 0x9d748ba2 -//.word 0xba0c3688 -//.word 0x912931db -//.word 0x08ae28a9 -//.word 0xca26c7f9 -//.word 0x90f922a3 -//.word 0x9ee65565 -//.word 0x90ad6732 -//.word 0x560c75cd -//.word 0x7eed0c97 -//.word 0xb1ded6a6 -//.word 0x81c17916 -//.word 0x62c5bca4 -//.word 0xf595ec78 -//.word 0x8dcf7e43 -//.word 0xecb7f58a -//.word 0x4d2d0642 -//.word 0xa8dcfa9c -//.word 0x31b55522 -//.word 0x219cb503 -//.word 0xba60fcab -//.word 0x85f1b197 -//.word 0xdfcda468 -//.word 0xb3bcd136 -//.word 0x89bd8726 -//.word 0xc040ca3f -//.word 0x1795f579 -//.word 0x73a5a417 -//.word 0xdce0d037 -//.word 0xc8763ca8 -//.word 0x9cca10fb -//.word 0x7024c4dd -//.word 0x12a540a4 -//.word 0x4e814227 -//.word 0x6d68ffd3 -//.word 0xfc450dfb -//.word 0xcf2b8070 -//.word 0x458c5452 -//.word 0xccad0b25 -//.word 0xa8569627 -//.word 0xf1ce79e1 -//.word 0xdb072bfd -//.word 0x3b15bb57 -//.word 0x46e4b957 -//.word 0x9b2b547d -//.word 0x849cc03d -//.word 0x785edb0e -//.word 0xe5bc0fbe -//.word 0x2d1f7a08 -//.word 0xee394c68 -//.word 0x8784712e -//.word 0xd8eb71d2 -//.word 0x49c69487 -//.word 0x0d0c4912 -//.word 0xa8c4c8dd -//.word 0xaebdf747 -//.word 0xce7f8a3f -//.word 0x10816f11 -//.word 0x5b9d697f -//.word 0x3ac0fb14 -//.word 0xdfe687b5 -//.word 0x6946b779 -//.word 0x62c91cbb -//.word 0x8cc1156d -//.word 0xddd8f3ae -//.word 0xc8465a9f -//.word 0xbe48ea73 -//.word 0xf5cd1fc6 -//.word 0x68727630 -//.word 0x1fb0d219 -//.word 0xb0541dcf -//.word 0x063032d5 -//.word 0x6111fb7f -//.word 0x9ef1d6bb -//.word 0xb96d3e32 -//.word 0x9079a790 -//.word 0xe952a91f -//.word 0xb7b4619b -//.word 0x994e1542 -//.word 0xa473162a -//.word 0x6212ebd7 -//.word 0x1ae8ab0d -//.word 0x52f4abe3 -//.word 0x932b5919 -//.word 0x6c6e68ab -//.word 0xb9b92ea6 -//.word 0x269d4a3b -//.word 0xeef08912 -//.word 0xe9c30be1 -//.word 0xc594a13c -//.word 0x93c57aaf -//.word 0x864dff0a -//.word 0xf8aefbfc -//.word 0xae27ffe3 -//.word 0x5d2a05e3 -//.word 0x6d105335 -//.word 0xfc0ca2c2 -//.word 0x265d80f1 -//.word 0x84c8f3bd -//.word 0xf2465f0a -//.word 0x96faa939 -//.word 0x1e659dfa -//.word 0x48dd8d61 -//.word 0xa83b3b3d -//.word 0xa6d5faa5 -//.word 0xc6ac0fd3 -//.word 0x2ce65d36 -//.word 0x5f7e42c2 -//.word 0x4d3abc8b -//.word 0x8fddd092 -//.word 0xef9e2cde -//.word 0x27da0bcf -//.word 0xec0659b0 -//.word 0x2be7178b -//.word 0x93050241 -//.word 0x535d6fd9 -//.word 0x25567a19 -//.word 0x8bf65f53 -//.word 0x58562882 -//.word 0x73538996 -//.word 0xd887080b -//.word 0xdf7860c0 -//.word 0xc10e2807 -//.word 0x584bb0f8 -//.word 0x26362c0c -//.word 0x991814e7 -//.word 0x8debca74 -//.word 0x13107e37 -//.word 0x71404fdf -//.word 0x6ac5b21b -//.word 0xbfea18af -//.word 0xf5b0cbc7 -//.word 0x59c2198b -//.word 0x42abb5f3 -//.word 0x96475add -//.word 0x8f77b15d -//.word 0xbf197554 -//.word 0x5238d544 -//.word 0x947f1a62 -//.word 0xb3f489ed -//.word 0xc5e38bbf -//.word 0x0c170b22 -//.word 0x795020e4 -//.word 0x70f2ecae -//.word 0xcbfbc491 -//.word 0x213790e2 -//.word 0x48b77548 -//.word 0x187fb213 -//.word 0x727fc8cf -//.word 0x81c5de19 -//.word 0x40f063b2 -//.word 0x3de8f5d2 -//.word 0x9ccc82bf -//.word 0x5e2cad9d -//.word 0xe4797388 -//.word 0xaeb90ee0 -//.word 0x697f19e4 -//.word 0x291bf683 -//.word 0xf30e6d6e -//.word 0x7ec19572 -//.word 0x3a76f805 -//.word 0x927ef21f -//.word 0x6eac5a4b -//.word 0xfd0b64fd -//.word 0xb1ccc626 -//.word 0x8b821a06 -//.word 0x98928441 -//.word 0xbce49436 -//.word 0xaedf6e8c -//.word 0x4495280d -//.word 0xf13a73b8 -//.word 0x8cdb7e11 -//.word 0x524c17bc -//.word 0x2f63144a -//.word 0x3963f153 -//.word 0x7dbbbac5 -//.word 0xfff12b7b -//.word 0xfcd91712 -//.word 0x720a06f8 -//.word 0xe39222c5 -//.word 0x55e954cf -//.word 0x9d24aaf8 -//.word 0xdd6bfccb -//.word 0x4cadcfc8 -//.word 0x359279fb -//.word 0x43b286d4 -//.word 0xfb045b32 -//.word 0x8a9919c1 -//.word 0xc18ac486 -//.word 0x5e2fa5b8 -//.word 0x8d91ecd2 -//.word 0xae229ae6 -//.word 0x59ac9e34 -//.word 0x9f883efb -//.word 0x9310b98f -//.word 0x0a562bac -//.word 0x9e17b00a -//.word 0xf9eacc31 -//.word 0x50bd0b8f -//.word 0x2d82e4c8 -//.word 0x7226e34d -//.word 0x9bc30830 -//.word 0x43166a37 -//.word 0xe9331f2f -//.word 0xf5776082 -//.word 0xf6bfe90c -//.word 0x2ed79f2b -//.word 0x50367515 -//.word 0x88e8906f -//.word 0xbccbaa1b -//.word 0x12feb451 -//.word 0xb297bff1 -//.word 0xcd941c17 -//.word 0xde15c2f0 -//.word 0x2fc8f1cd -//.word 0x9fa41576 -//.word 0xa4daedc1 -//.word 0x8c08ec63 -//.word 0x08b0e005 -//.word 0xeaead19b -//.word 0x2e552cf1 -//.word 0x37532186 -//.word 0x5c76499e -//.word 0xa3358c93 -//.word 0xcce4426c -//.word 0x92e398b0 -//.word 0x2d15357d -//.word 0x1b931ed4 -//.word 0x20a2d737 -//.word 0x8ce3cc76 -//.word 0xbccaefc6 -//.word 0xe351a113 -//.word 0x0beed697 -//.word 0x56c274ac -//.word 0x8a13fdde -//.word 0xccfc6e45 -//.word 0xac636712 -//.word 0x622c8b67 -//.word 0x57ac2a6c -//.word 0xe8611e9f -//.word 0x66e0f26b -//.word 0x610e4afd -//.word 0x26937e53 -//.word 0x868c8995 -//.word 0xd98022a9 -//.word 0x43962802 -//.word 0x360543b8 -//.word 0x38cbc9de -//.word 0xe7a2de10 -//.word 0x3a30e04b -//.word 0x097e0201 -//.word 0xd0ab366d -//.word 0xb0e25125 -//.word 0xb68969ee -//.word 0x60bb82d3 -//.word 0x5df96a79 -//.word 0x951ce2ad -//.word 0x698efe3f -//.word 0x3cbacf13 -//.word 0x32c13f75 -//.word 0x376f3bad -//.word 0x446d18d3 -//.word 0xddb82fe5 -//.word 0xdf51cb17 -//.word 0x7837466a -//.word 0x77926e80 -//.word 0xc6312daf -//.word 0x34366a54 -//.word 0x78102a6a -//.word 0x73aafb5b -//.word 0xb6e29215 -//.word 0x443db361 -//.word 0x99d95170 -//.word 0xeba3f7b7 -//.word 0xafc966fe -//.word 0x5f7380b3 -//.word 0x7bae6483 -//.word 0xcea8db2c -//.word 0xf223f38c -//.word 0x1624e9fe -//.word 0xffeb4ce7 -//.word 0x4d28608c -//.word 0x006cc127 -//.word 0x3ade4839 -//.word 0x462f3221 -//.word 0xdad07fee -//.word 0x99629972 -//.word 0xdc6e3697 -//.word 0xb2567ff7 -//.word 0x268b72a6 -//.word 0xc0018552 -//.word 0x4ee08c8f -//.word 0xe37ddc6c -//.word 0x2188b14a -//.word 0xb487cdee -//.word 0x1f8262d4 -//.word 0xbb0032c6 -//.word 0xfc33f5ae -//.word 0xf770fba9 -//.word 0x21e2125c -//.word 0x5a7eaa8b -//.word 0x2a3937e7 -//.word 0x4a79d728 -//.word 0x66ca355c -//.word 0x21d3ad7f -//.word 0x5a88b14b -//.word 0xada16b51 -//.word 0x3d4aa349 -//.word 0xb11ce4a7 -//.word 0x7d4cda6f -//.word 0x6322ff49 -//.word 0x39ad77d8 -//.word 0xecb63748 -//.word 0xc5f26d26 -//.word 0xeb7b1c75 -//.word 0x2a8107fe -//.word 0xf23dd1e7 -//.word 0xa3276287 -//.word 0x07698d79 -//.word 0x2093efef -//.word 0x25901a49 -//.word 0xc7d9f3e7 -//.word 0xb8e8583b -//.word 0x6ef00622 -//.word 0x25cbba74 -//.word 0x233497d9 -//.word 0x3f36c8df -//.word 0xa4e4664a -//.word 0xd34b9cac -//.word 0xe7a50935 -//.word 0x1dd065cb -//.word 0x93fe685d -//.word 0x50ade775 -//.word 0x85da410d -//.word 0x1271f9a4 -//.word 0x4c09a491 -//.word 0xfece0696 -//.word 0xaebe78b8 -//.word 0x21198c4e -//.word 0x2112f459 -//.word 0x7dcba013 -//.word 0x528027cb -//.word 0x890368ef -//.word 0xa168716b -//.word 0xae01a031 -//.word 0xa28d0719 -//.word 0xccac15ec -//.word 0x9e9673bb -//.word 0xb30d2d76 -//.word 0x119012ba -//.word 0xabd25de9 -//.word 0x2a6a9580 -//.word 0xecccb1a5 -//.word 0x4d788000 -//.word 0x267148cc -//.word 0x94f1ae2e -//.word 0xfb5bd5c5 -//.word 0x4a71ca82 -//.word 0x80c720ba -//.word 0x6f77d779 -//.word 0xbf17831a -//.word 0x37e8a914 -//.word 0x38506d17 -//.word 0x8a8b6a58 -//.word 0x5c9de229 -//.word 0x858b17cc -//.word 0x10caf889 -//.word 0xf8f800fe -//.word 0x30ca5cb7 -//.word 0xe6464cfe -//.word 0x0932cbf4 -//.word 0x09cc72e1 -//.word 0xdebb9ac9 -//.word 0x4b46c140 -//.word 0x64c42f7e -//.word 0x4e53d8b6 -//.word 0x46cd85a4 -//.word 0xe4f82f66 -//.word 0xa1fdab8c -//.word 0x981c8d72 -//.word 0x899d46ce -//.word 0x230a8f85 -//.word 0x839b0bc3 -//.word 0xf8f2274a -//.word 0x0908460a -//.word 0xb9681bf2 -//.word 0x099b5507 -//.word 0xbfe382b3 -//.word 0x662c2d5f -//.word 0x963f4a44 -//.word 0x7539d57d -//.word 0x7e3bb561 -//.word 0x8164e611 -//.word 0xebfcd74d -//.word 0x48f2118c -//.word 0x06891a4b -//.word 0x7c4e99a5 -//.word 0x2b4dba24 -//.word 0x4384d4d7 -//.word 0x69984aa4 -//.word 0xb7c7afe0 -//.word 0x041e2d1d -//.word 0x66ec2743 -//.word 0xf6761de3 -//.word 0xd3ecd0c7 -//.word 0x6a9ca7ce -//.word 0xf46652f7 -//.word 0x3f70adbb -//.word 0xb21be7a0 -//.word 0x8c35e30b -//.word 0x6c70de55 -//.word 0x16125322 -//.word 0x74ef1bee -//.word 0xdb94d9e9 -//.word 0x90c69505 -//.word 0x8b2ba74d -//.word 0x7a46d778 -//.word 0x09a9c2be -//.word 0x616580ea -//.word 0xeec683b1 -//.word 0x663dc242 -//.word 0x079e171e -//.word 0x208be62a -//.word 0xd2300002 -//.word 0x1832c791 -//.word 0x05e192df -//.word 0x4db55329 -//.word 0x07f87737 -//.word 0xb1c00dea -//.word 0x75202b15 -//.word 0xaa9f8d8d -//.word 0x9ee98084 -//.word 0x93c5fe12 -//.word 0x07471b15 -//.word 0x3947a03b -//.word 0xe812f55d -//.word 0x5e5e440f -//.word 0xad84db75 -//.word 0x39e9d258 -//.word 0x76bdee78 -//.word 0xf3e9c624 -//.word 0x98422409 -//.word 0x2c03ae48 -//.word 0x197ac6cb -//.word 0x7401aed8 -//.word 0x3830f0e6 -//.word 0xd251fdb0 -//.word 0xe3141489 -//.word 0x418565ef -//.word 0x3f3a7762 -//.word 0x2ed1c777 -//.word 0x239ab228 -//.word 0xfb90946e -//.word 0x9d8e3212 -//.word 0x7fbf55bf -//.word 0x6c57b85d -//.word 0x8480249a -//.word 0x8497dac9 -//.word 0x479931f0 -//.word 0x8dd8801c -//.word 0xfcf33ef8 -//.word 0x6404689e -//.word 0x471b23ad -//.word 0x99eca39c -//.word 0xc4c44b4e -//.word 0xefc216e6 -//.word 0x804335dc -//.word 0xdf9efa51 -//.word 0x7d12f49f -//.word 0x16fc5c35 -//.word 0x334dafa2 -//.word 0xf23c9def -//.word 0x09382232 -//.word 0x0921f360 -//.word 0xe0b71b63 -//.word 0xa253e66c -//.word 0x89d5fe8b -//.word 0x3addd47d -//.word 0x493e41c5 -//.word 0x00af6efe -//.word 0x5cc4f16f -//.word 0x591d38e0 -//.word 0x6fde2bac -//.word 0x5d5e0d18 -//.word 0x2524a3e3 -//.word 0x580f991e -//.word 0x93d4213e -//.word 0x4aaedd70 -//.word 0xc450ff2c -//.word 0x671faf0d -//.word 0x369eade0 -//.word 0x982937fb -//.word 0x5be72dd0 -//.word 0xf8fa73c1 -//.word 0x19f89736 -//.word 0x589fb3ed -//.word 0x4ac49592 -//.word 0xbc8d1e90 -//.word 0x3ce0e826 -//.word 0xdc1b2bbd -//.word 0x3206e279 -//.word 0xa306290e -//.word 0xe293ead5 -//.word 0xb3ebb81f -//.word 0xf508fbc9 -//.word 0xdfd04e10 -//.word 0x8a8d25a7 -//.word 0xaf9cb307 -//.word 0xb3690b07 -//.word 0xe09b85ac -//.word 0xf68b6342 -//.word 0xe2fbb4ab -//.word 0xcd0579f8 -//.word 0x58510736 -//.word 0x268bac8a -//.word 0x9c149581 -//.word 0xe4f8efa1 -//.word 0x38214d44 -//.word 0x5dca4aa6 -//.word 0x6d366f3c -//.word 0xdaa15747 -//.word 0xb07710aa -//.word 0x1ac4c5f8 -//.word 0x28eb9ad2 -//.word 0xcf9cd870 -//.word 0x32004a7d -//.word 0x1f36e728 -//.word 0xdd03b078 -//.word 0x25c5dcdf -//.word 0x6ea93313 -//.word 0x6e1eb819 -//.word 0xdd8a8aa2 -//.word 0x7c3b0c9b -//.word 0x56a04400 -//.word 0x45b981f1 -//.word 0xb9cc4107 -//.word 0xb55a51e8 -//.word 0x1a513619 -//.word 0x2883cc14 -//.word 0x42572d9b -//.word 0xf1bed44b -//.word 0x2c690374 -//.word 0xd73a6128 -//.word 0x89f8e892 -//.word 0x9246fe89 -//.word 0x3dd6e265 -//.word 0x52da4a12 -//.word 0xdfbb4b63 -//.word 0x380e78a8 -//.word 0x3dc44e82 -//.word 0xdba0d0f6 -//.word 0xd6ef6ec1 -//.word 0xc5732beb -//.word 0x5ea0ff9f -//.word 0xf30b7a3a -//.word 0x3d1faba2 -//.word 0x591140d9 -//.word 0x1017eed2 -//.word 0x5bd51483 -//.word 0x26189b3b -//.word 0x55c72036 -//.word 0x0517556f -//.word 0x14fda4b5 -//.word 0xe3e91601 -//.word 0x5ab17407 -//.word 0x2dcbac0b -//.word 0x5ec075f6 -//.word 0x04dd36a9 -//.word 0x4a2c2491 -//.word 0xbaa3ab7b -//.word 0xbc9a10aa -//.word 0x59835427 -//.word 0x45d55b59 -//.word 0x1d494ed5 -//.word 0xed493d77 -//.word 0xf5a509b2 -//.word 0xad898124 -//.word 0x06accb6e -//.word 0xf3c90642 -//.word 0x28532dbe -//.word 0x21653ef8 -//.word 0x67f89cda -//.word 0x0f58b230 -//.word 0x83d9daff -//.word 0x85c57d18 -//.word 0x709a7bee -//.word 0xc172cda5 -//.word 0xd7c3696b -//.word 0xf748650b -//.word 0x933f60bf -//.word 0xccd51e46 -//.word 0x35df7237 -//.word 0xdaca6195 -//.word 0x81d584a3 -//.word 0x2f7daefa -//.word 0xee39cfd8 -//.word 0xce6818bb -//.word 0x2a88602f -//.word 0x2ca8c7e4 -//.word 0x93209903 -//.word 0xb47f75c2 -//.word 0xbfc5ae37 -//.word 0x44d3f169 -//.word 0xf61f28ad -//.word 0xaeac9f30 -//.word 0xb33a65d0 -//.word 0x38baf630 -//.word 0x2604160b -//.word 0x1ccc00c8 -//.word 0xb4d2c04f -//.word 0x095ade1c -//.word 0x76dc3c91 -//.word 0xa0fc4191 -//.word 0xb6bc374a -//.word 0xf7f1f252 -//.word 0x75f4b3f6 -//.word 0x19994ccf -//.word 0xe8658496 -//.word 0x84fbbc38 -//.word 0xf6d8d32d -//.word 0xaa404806 -//.word 0xbb789e46 -//.word 0x72360573 -//.word 0x0956366d -//.word 0xb4ce9ffe -//.word 0xe2e4c0b1 -//.word 0xbf9fd5e8 -//.word 0xfe7bb529 -//.word 0xd760fab9 -//.word 0x4bd5626c -//.word 0xaf7275bb -//.word 0x68936817 -//.word 0xf454427d -//.word 0x2ab93d4b -//.word 0xc22c6f52 -//.word 0x172da92c -//.word 0x2c45a0cf -//.word 0xed3b4a63 -//.word 0xb88b8b51 -//.word 0x1c14119d -//.word 0xe1117d75 -//.word 0x484ac30a -//.word 0x938cd39e -//.word 0xc85679de -//.word 0xb3d58173 -//.word 0x2a1220d4 -//.word 0x956b8f5e -//.word 0xad40f9a6 -//.word 0x83ee970e -//.word 0xc4011a96 -//.word 0x3ca549f5 -//.word 0x9a5eebe9 -//.word 0x73f9e7cb -//.word 0x89c3aa66 -//.word 0x4cf8c909 -//.word 0xa17ee7db -//.word 0xe3d3da6f -//.word 0x27450998 -//.word 0xc561187f -//.word 0x14adc8f2 -//.word 0x749a18ff -//.word 0x92b4b1c2 -//.word 0xe71c807b -//.word 0x8238a5e3 -//.word 0x08a98cc1 -//.word 0xf97d59b8 -//.word 0x34a68a63 -//.word 0xbeabd7a4 -//.word 0xbf9e5d38 -//.word 0xcd4efc8f -//.word 0x6dbdfedb -//.word 0xd7d5f968 -//.word 0xfa56f62b -//.word 0xc013d29d -//.word 0x935ee5ca -//.word 0x20c1e2a4 -//.word 0x5beffe9e -//.word 0xc3f95576 -//.word 0xe7c58952 -//.word 0x29bdac0f -//.word 0xc2c460d6 -//.word 0x066e3cf0 -//.word 0xe97072db -//.word 0xc355af9d -//.word 0x50734358 -//.word 0xfb1e821f -//.word 0x5c1b6a08 -//.word 0xff578682 -//.word 0x67d911e9 -//.word 0x52f65f58 -//.word 0x3fc479bf -//.word 0x2ed10835 -//.word 0xa714748f -//.word 0xfd234c31 -//.word 0xd4a7e924 -//.word 0xe10d4e69 -//.word 0xf17f538d -//.word 0x2d13037e -//.word 0x9c42429d -//.word 0xe99bb314 -//.word 0x67b8d86a -//.word 0x52727b55 -//.word 0x58514dcf -//.word 0x5746ce6b -//.word 0x699d6cea -//.word 0x1e2def09 -//.word 0x08d2149e -//.word 0x7d1d78e3 -//.word 0x9849b812 -//.word 0x8171d732 -//.word 0xee01e030 -//.word 0xea6bcc31 -//.word 0xd61ba527 -//.word 0xadaceca2 -//.word 0x8c5c39ea -//.word 0x71bd214a -//.word 0x42ae5cae -//.word 0x128a2771 -//.word 0xa19fe870 -//.word 0x21e21163 -//.word 0x40e0466d -//.word 0x62f8c2f1 -//.word 0x2ec8f7a8 -//.word 0x4de574f0 -//.word 0x6ecf0c67 -//.word 0x8e2435b9 -//.word 0x7613aeb6 -//.word 0x851465a8 -//.word 0xafd697e3 -//.word 0xc679399d -//.word 0xf8fe9700 -//.word 0x9afc3b7e -//.word 0x24941065 -//.word 0x7ca6c7b3 -//.word 0x77457a2b -//.word 0x9d698fa8 -//.word 0x2ce4e0b2 -//.word 0x6098184f -//.word 0xf2e6601b -//.word 0xde6a3c9b -//.word 0x6ae5afcf -//.word 0x647aa606 -//.word 0xab1e94f6 -//.word 0xf14a590c -//.word 0xbef26801 -//.word 0xb8bb29ae -//.word 0x23699c21 -//.word 0xa49640f0 -//.word 0x4aaa33cd -//.word 0xce079a5b -//.word 0x1a844341 -//.word 0x091d897c -//.word 0x6ee978f9 -//.word 0x574c3263 -//.word 0x936d913a -//.word 0x71ea0e25 -//.word 0xcbcbe289 -//.word 0x43b56b5a -//.word 0xcd60d031 -//.word 0x6e4be89f -//.word 0x43af58c2 -//.word 0xc4b1fc15 -//.word 0x4adb898c -//.word 0xcfcd70e1 -//.word 0xf5300528 -//.word 0x4aece0aa -//.word 0xcb9b83f0 -//.word 0xa73d3e1e -//.word 0x452d5083 -//.word 0x87544f6d -//.word 0x519cca42 -//.word 0x45a72ccc -//.word 0xd1c2e3d5 -//.word 0x6c14c2f4 -//.word 0x1c1ba4a6 -//.word 0x3c5a53a0 -//.word 0x7c4ba864 -//.word 0x299bf313 -//.word 0xaf969c82 -//.word 0x5ce10b8f -//.word 0x6667c6b6 -//.word 0x3095d9df -//.word 0xc9ca7b7a -//.word 0xb509eece -//.word 0xf1f2a78e -//.word 0x31f0afae -//.word 0x6cb34974 -//.word 0x9ae1d5d2 -//.word 0xbd08f4f3 -//.word 0x1ed8ed14 -//.word 0xd98f5095 -//.word 0x9bb4d950 -//.word 0xab089629 -//.word 0x27ba4ce6 -//.word 0x91da1842 -//.word 0x8a10523c -//.word 0xdc8eb6b5 -//.word 0xbe43c63a -//.word 0x54516a1f -//.word 0x76c2dacd -//.word 0xb276bd5c -//.word 0x94609365 -//.word 0x24f35011 -//.word 0xb1d64976 -//.word 0xcddf5424 -//.word 0x993f2bfa -//.word 0x43fa123f -//.word 0xcc9bbaee -//.word 0x0f256450 -//.word 0xff4c49d0 -//.word 0x30e53a0c -//.word 0x999c8428 -//.word 0x98e51667 -//.word 0x3635e6fc -//.word 0xad71901d -//.word 0x27a7405a -//.word 0xc9fcd32d -//.word 0xf0e539d2 -//.word 0xba9a1e58 -//.word 0xc9c8c9f9 -//.word 0x438644a7 -//.word 0x1d8bbde7 -//.word 0x9a9e2ce2 -//.word 0x0e4d36b9 -//.word 0xe8e2511a -//.word 0xef932a11 -//.word 0xccf94420 -//.word 0xc9c4e191 -//.word 0xd8ac250b -//.word 0xd7ab7964 -//.word 0x12692eb6 -//.word 0x0af862b5 -//.word 0x75c1283f -//.word 0x85bee335 -//.word 0x6deaf38a -//.word 0x22f69499 -//.word 0x5e3e02bc -//.word 0xebfbe21a -//.word 0x1ebaddc0 -//.word 0xa20d8ef4 -//.word 0x76809ec5 -//.word 0x39ce2de7 -//.word 0xa65574be -//.word 0x5bc8a9b9 -//.word 0xde2423e1 -//.word 0xe1e5bfb2 -//.word 0xc5798229 -//.word 0x5ef5801e -//.word 0xf607fcd4 -//.word 0x942bd0cf -//.word 0x7e2210e5 -//.word 0xfca1ea98 -//.word 0x5f46d0a3 -//.word 0x42cfdad3 -//.word 0x108e6518 -//.word 0xc61801dc -//.word 0xfa3e8a93 -//.word 0x1d3e9494 -//.word 0xfd3a0c27 -//.word 0x8de81ddf -//.word 0xe98c512a -//.word 0x9523f926 -//.word 0x05e1ceb6 -//.word 0x63ded8d6 -//.word 0x8c0d8f2b -//.word 0x5c6d41de -//.word 0x2b83b3ab -//.word 0x97070b35 -//.word 0x84deed9d -//.word 0x6248e552 -//.word 0xaf5b052b -//.word 0xbcb0cfb3 -//.word 0xb35c55c4 -//.word 0xd9219e57 -//.word 0x11e64c9a -//.word 0xa2657c43 -//.word 0x3924ee24 -//.word 0x32a66600 -//.word 0x13e2519e -//.word 0x59f4ac1b -//.word 0x78132284 -//.word 0x1dc374a5 -//.word 0xb64b1e1b -//.word 0x346a38b1 -//.word 0x0f469ae9 -//.word 0x8ba543d8 -//.word 0x3b5ffc37 -//.word 0xc31438b8 -//.word 0xe11a3f96 -//.word 0xafb98b70 -//.word 0x229b7257 -//.word 0xd77e0626 -//.word 0x0f2c3a11 -//.word 0xf8ad4681 -//.word 0x2ebb4c20 -//.word 0x81763b2f -//.word 0xf959f420 -//.word 0x176dab61 -//.word 0x5ebc9076 -//.word 0x1209af4a -//.word 0x40be15c7 -//.word 0xfe2635a4 -//.word 0xf4dc8a7e -//.word 0x1b847d2b -//.word 0xc5b8884b -//.word 0xde459c1f -//.word 0x7198c09f -//.word 0x6d73fcc6 -//.word 0xaae57531 -//.word 0x2778d9e8 -//.word 0x96acfd7c -//.word 0x1aa4c552 -//.word 0x4f20453e -//.word 0x8bab2553 -//.word 0x63164afa -//.word 0x7124b242 -//.word 0x5587a077 -//.word 0xfa0bfaf6 -//.word 0x1b12ef3f -//.word 0x0540dc4c -//.word 0x9e777122 -//.word 0xa60610a5 -//.word 0x3d1d75b0 -//.word 0xa5859c65 -//.word 0x4a8ddfc2 -//.word 0xff486075 -//.word 0x8bf5a6f2 -//.word 0x64bf8bc2 -//.word 0xbaa7551e -//.word 0xb7be23bc -//.word 0x06978be9 -//.word 0x92fc81d8 -//.word 0x90e07a3a -//.word 0xbf95d20e -//.word 0xee3f6bbb -//.word 0xc089985c -//.word 0xac96395b -//.word 0x473b2741 -//.word 0xc66bd2cc -//.word 0xbef22843 -//.word 0x2f66b906 -//.word 0xc15b1969 -//.word 0x4dd786c2 -//.word 0x9f06cbc1 -//.word 0x7b2e6400 -//.word 0xdde4e3db -//.word 0x85819382 -//.word 0xb3d05a4c -//.word 0x3009e44f -//.word 0x8d03fd2d -//.word 0xafa53f30 -//.word 0x8c9eee9a -//.word 0x2f552036 -//.word 0x02232133 -//.word 0x4cc11532 -//.word 0xf9fcdf9e -//.word 0x9ab0423c -//.word 0xacf34603 -//.word 0x1d91de2d -//.word 0x0cb9c78e -//.word 0xd1f5b325 -//.word 0x3d5fa7f1 -//.word 0x2213a205 -//.word 0x16e07fdf -//.word 0x75431cf6 -//.word 0xa595bc92 -//.word 0x9e83aae0 -//.word 0xa9bf2046 -//.word 0x67f566f4 -//.word 0x16013ebc -//.word 0x105f8023 -//.word 0x94e202b8 -//.word 0xc9a9baa4 -//.word 0x00502783 -//.word 0x3a63ec72 -//.word 0xea18bf69 -//.word 0xfc3d81cc -//.word 0x156fae3c -//.word 0x1d8df8b3 -//.word 0xfb6c2fd0 -//.word 0x9fcc646f -//.word 0x468b4e7d -//.word 0xf919ed0b -//.word 0x572c6ca0 -//.word 0x95b54cd4 -//.word 0xc312bf1a -//.word 0x518552de -//.word 0xd1e5cfd0 -//.word 0xfe93627f -//.word 0xfeb0fa29 -//.word 0xe48df2d1 -//.word 0x7963f193 -//.word 0x3c450f35 -//.word 0xa75239fe -//.word 0xb42fd6cb -//.word 0xa0b5aa5f -//.word 0xefe6fbfb -//.word 0xb026f32e -//.word 0x02a846ef -//.word 0xd72615e9 -//.word 0xf8d51116 -//.word 0x4a98e38f -//.word 0x4f73cca3 -//.word 0xef438826 -//.word 0x79ad790b -//.word 0xe5550136 -//.word 0x5c50308b -//.word 0xfadb9f4b -//.word 0xd24d9ba0 -//.word 0x324a8676 -//.word 0x293a7b8d -//.word 0x47f931cc -//.word 0xa4d022d9 -//.word 0x23a5ece6 -//.word 0xf86ef7ce -//.word 0x68ec5860 -//.word 0xd095f5fa -//.word 0xe9d2ea5b -//.word 0x4a6a2cb2 -//.word 0x2f3e6cfa -//.word 0x78383f8a -//.word 0xf57e7be8 -//.word 0xe0ebe4df -//.word 0xab800000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00008908 -//// expected output -//.word 0x73e3a0b5 -//.word 0x52605e08 -//.word 0xc1ca390e -//.word 0x9b8d498f -//.word 0xa2679a4f -//.word 0x2f29bd80 -//.word 0xca7e40a8 -//.word 0x6e20a5ed -//.word 0x4a9b8707 -//.word 0xdb0aeb79 -//.word 0xe251c8c0 -//.word 0xf4259ecd -//.word 0x25dbb9c8 -//.word 0x2de838ae -//.word 0x953e712d -//.word 0x36991546 -//// SHA512LongMsgvector_44 -//// vector length -//.word 0x00008C20 -//// input message -//.word 0xd5233637 -//.word 0xf4320cf1 -//.word 0x57967343 -//.word 0x0ac26259 -//.word 0x595f2e48 -//.word 0xd742aba0 -//.word 0xa59c9440 -//.word 0xf0712d6f -//.word 0xbc4c2628 -//.word 0xe030c3b4 -//.word 0x52d13a7f -//.word 0xa5045d24 -//.word 0xd07578ca -//.word 0x31987db3 -//.word 0xd2e25e12 -//.word 0xea38bb1d -//.word 0xa7a8bd64 -//.word 0x2a574261 -//.word 0xd4ba3a50 -//.word 0xc0095041 -//.word 0x90f1ce6b -//.word 0x6d8abac3 -//.word 0x498845cd -//.word 0x67b567b2 -//.word 0x1e9fc394 -//.word 0xda8dd01e -//.word 0x63b83a5f -//.word 0x62b886d8 -//.word 0x213df6d3 -//.word 0x92ffacf7 -//.word 0x93f8111a -//.word 0x70d07856 -//.word 0xa999ff5f -//.word 0xf6bcb613 -//.word 0x89330453 -//.word 0x93f94612 -//.word 0x09bfb8ab -//.word 0xa8e19978 -//.word 0x37988aa0 -//.word 0x0c713830 -//.word 0xd1fe3a6e -//.word 0x88cb3d6a -//.word 0xcd935ed5 -//.word 0x5bb4d716 -//.word 0xd2e1de9b -//.word 0xb817ca6d -//.word 0xbdd27808 -//.word 0x4380ed69 -//.word 0x1d363c68 -//.word 0x97a2aa48 -//.word 0xb741118d -//.word 0xc3d1820d -//.word 0x030a2e4a -//.word 0xc88987ff -//.word 0xae0da2f9 -//.word 0x1de5e028 -//.word 0x16a9cdf6 -//.word 0x2c2948d7 -//.word 0xd0a3e522 -//.word 0xd2398f1f -//.word 0x25a17261 -//.word 0xe31f1856 -//.word 0x90b0d11c -//.word 0xa3885996 -//.word 0x42bfb5c0 -//.word 0x4e485e3f -//.word 0x9f22a13d -//.word 0x91d24673 -//.word 0xbf107087 -//.word 0x0ec1c499 -//.word 0xee25cd19 -//.word 0xdc529fdb -//.word 0x2be1bb6d -//.word 0x05e733a8 -//.word 0xad270f85 -//.word 0x0685ee32 -//.word 0x59bef165 -//.word 0x5357d4f1 -//.word 0x4dd35e97 -//.word 0xd129fc1e -//.word 0x5975a9a5 -//.word 0x59ee1039 -//.word 0x8018f5a3 -//.word 0x3b3bd183 -//.word 0x7c13bca3 -//.word 0xb9c99085 -//.word 0x37224c3e -//.word 0x88f7b687 -//.word 0x53e54512 -//.word 0x53453d1a -//.word 0xa25e1c3e -//.word 0x38da358f -//.word 0xae779be8 -//.word 0x48ff407e -//.word 0x337a5eb7 -//.word 0x0ba21640 -//.word 0xa197585a -//.word 0xfad40274 -//.word 0x9b624cff -//.word 0x034b637e -//.word 0x7a5254dc -//.word 0x09e12c03 -//.word 0xca435daa -//.word 0x6213646e -//.word 0xcbf5a925 -//.word 0x5784a76f -//.word 0xf18b4c8d -//.word 0xa677a377 -//.word 0x650cb028 -//.word 0x03589c3d -//.word 0x82e512be -//.word 0x9333e83c -//.word 0x5965021c -//.word 0x703b7332 -//.word 0x2e40e692 -//.word 0x29453da2 -//.word 0xf90d7774 -//.word 0x3f4ad753 -//.word 0xe6c8429c -//.word 0xa8e9ead0 -//.word 0xd45129e6 -//.word 0x4fe2afe6 -//.word 0xd9ebe0b3 -//.word 0x929c7828 -//.word 0xbdbe7167 -//.word 0xc3a1266e -//.word 0x7b55b8ec -//.word 0xa81cb152 -//.word 0xc420e72c -//.word 0xfc62a4b2 -//.word 0x7bf3039a -//.word 0xeb669d31 -//.word 0x398565aa -//.word 0x9943d1b6 -//.word 0xcbf23b55 -//.word 0x9cb686eb -//.word 0xaf3a0496 -//.word 0x7da197bf -//.word 0x9bc017ef -//.word 0x3c8af4e4 -//.word 0xf6cb1de5 -//.word 0xc91a2052 -//.word 0x5d08927f -//.word 0x8b9eb1c2 -//.word 0x1f0748cb -//.word 0xdc89d334 -//.word 0xc1bae459 -//.word 0x8bf0c56a -//.word 0x7bf95fbf -//.word 0x590c5a6b -//.word 0xb9008613 -//.word 0x7dbc7a01 -//.word 0x9bef7b74 -//.word 0x21019f3a -//.word 0x76493181 -//.word 0xe28058eb -//.word 0x5075f4e0 -//.word 0x5303c928 -//.word 0x6840dfb9 -//.word 0x7bf828cd -//.word 0xac5a6438 -//.word 0x52f042f9 -//.word 0x40d5c80f -//.word 0x4822f48e -//.word 0xfea9a4f1 -//.word 0xbee6b3b2 -//.word 0xf1326518 -//.word 0x8b3a0551 -//.word 0xd8b0ccc0 -//.word 0x79400598 -//.word 0xaac66faa -//.word 0xc6bee37b -//.word 0x0cfb369a -//.word 0xa39d6130 -//.word 0xdc3ddfd9 -//.word 0xb86a57b2 -//.word 0xaa597bb4 -//.word 0x9dd83040 -//.word 0x3984effa -//.word 0x623c6bdb -//.word 0x02d57482 -//.word 0x090f1bcb -//.word 0xb2c817a3 -//.word 0x0770671b -//.word 0xa7bd39bb -//.word 0xc7a00b18 -//.word 0x777710a8 -//.word 0x2684d5d6 -//.word 0x699e2452 -//.word 0xf82629ab -//.word 0xf93dd31f -//.word 0x82347db2 -//.word 0x5944ce7d -//.word 0xfe80dd49 -//.word 0xeb07995c -//.word 0x1a7e6993 -//.word 0xc8be0fb1 -//.word 0x79c9d2f7 -//.word 0x3c03dcf5 -//.word 0x309fe19f -//.word 0x475701a3 -//.word 0x4a60f0fa -//.word 0x1d9d54bd -//.word 0x45136e3b -//.word 0xa79dfd48 -//.word 0x92e05fd8 -//.word 0x0082facc -//.word 0x1997da0b -//.word 0xf95c9bd5 -//.word 0xb3288a54 -//.word 0x969f0774 -//.word 0xaf292ef5 -//.word 0x8ea3b6bf -//.word 0x4d541875 -//.word 0xcf22f44c -//.word 0x4605b11e -//.word 0xf8bd65ba -//.word 0x42c0f47f -//.word 0xdd777b29 -//.word 0x60a9efea -//.word 0x063801bd -//.word 0xb20b45f7 -//.word 0x304b941e -//.word 0xbed2afff -//.word 0xcbe024fb -//.word 0xfe1076a2 -//.word 0x7a8b7883 -//.word 0x617cfa41 -//.word 0x96c4a7ea -//.word 0xc8ee2e85 -//.word 0xac65a0ea -//.word 0x89e419d7 -//.word 0xfa2fa33f -//.word 0xf00157e5 -//.word 0xf645c62a -//.word 0xb9889723 -//.word 0xc7af71ef -//.word 0x97e51b48 -//.word 0xcad8e157 -//.word 0xb0253acd -//.word 0x0e10a92f -//.word 0x1e79e171 -//.word 0xd80c2cc7 -//.word 0x70b70db8 -//.word 0x20612474 -//.word 0x27d95367 -//.word 0x120c1f0e -//.word 0x3a7c590a -//.word 0x8eedfd73 -//.word 0x92615a6e -//.word 0xa8477302 -//.word 0x8ff0a627 -//.word 0x29428b20 -//.word 0x81b01f0b -//.word 0x0c6a22b7 -//.word 0x2fd0bdb5 -//.word 0x022d68b2 -//.word 0x54a20b04 -//.word 0xef606382 -//.word 0x1c1aa899 -//.word 0x6abb6d9c -//.word 0xac54c75c -//.word 0x4158b1f9 -//.word 0x980baff7 -//.word 0xf238b294 -//.word 0x6a223c59 -//.word 0x33bec4f0 -//.word 0x221f5c35 -//.word 0x6c32918f -//.word 0xb0ab9381 -//.word 0x383f967c -//.word 0x7c1477f8 -//.word 0xe776a3c3 -//.word 0xdecb3598 -//.word 0xffc95ef3 -//.word 0xa6e60a24 -//.word 0xb610c0a2 -//.word 0x969fcaa3 -//.word 0x798897e9 -//.word 0xe3d35ddf -//.word 0x694f02e4 -//.word 0xb8843de7 -//.word 0xd8e9f934 -//.word 0xb257fa8d -//.word 0xd0bec27d -//.word 0x6517b6e9 -//.word 0x8d997de8 -//.word 0xd530a9d5 -//.word 0xfe2b99a2 -//.word 0xfe349d6e -//.word 0x48865c5a -//.word 0x4d5a7399 -//.word 0x43a25fc7 -//.word 0x25fa9d7c -//.word 0xfbdc0f20 -//.word 0x5b13a201 -//.word 0x30722ea2 -//.word 0xbac59e57 -//.word 0xd608500e -//.word 0x80d7bf70 -//.word 0x96265f29 -//.word 0xde32c883 -//.word 0x4bb7173a -//.word 0x7c64918c -//.word 0x868c8a8f -//.word 0xf31e86c7 -//.word 0x0bd79df8 -//.word 0x52b62439 -//.word 0x51b1894a -//.word 0x99a67f27 -//.word 0x06945bdd -//.word 0x410bbe9d -//.word 0x88e1750f -//.word 0xb2279de8 -//.word 0x6d5b0bbf -//.word 0xcbdfeb1d -//.word 0xfdaaa6d3 -//.word 0x5e3e0a90 -//.word 0xb3daa5b2 -//.word 0xb0f0715d -//.word 0xbfd9b7ca -//.word 0xfec82de2 -//.word 0x86fd610c -//.word 0xf33b5b43 -//.word 0x217b7e6b -//.word 0x33e2b0e5 -//.word 0xdaf1bb61 -//.word 0xd4fcf2f3 -//.word 0xb2dd176a -//.word 0xdfe97cdd -//.word 0xde236986 -//.word 0xd3b0bed3 -//.word 0x458bd9bb -//.word 0x227aba4f -//.word 0x03416591 -//.word 0xb2158888 -//.word 0xea535e94 -//.word 0x5d72d300 -//.word 0xfb37e9d6 -//.word 0x72275af7 -//.word 0xf1427f6a -//.word 0x32ee70f5 -//.word 0xb7326dea -//.word 0x54247d44 -//.word 0xeda554f2 -//.word 0x814b7a73 -//.word 0x679faaa3 -//.word 0xd88979d5 -//.word 0xae083821 -//.word 0x6b261a00 -//.word 0x7d2c9a16 -//.word 0xc112174e -//.word 0x4539c12c -//.word 0x525db95f -//.word 0xaac57496 -//.word 0x0ebc6195 -//.word 0x0345cb88 -//.word 0xd60b0097 -//.word 0xde97b3ba -//.word 0x01c59fcf -//.word 0x79796dea -//.word 0xd88ed8ec -//.word 0x4a0f0f57 -//.word 0x1baa5a60 -//.word 0x79610146 -//.word 0x7a836ae3 -//.word 0x61db8181 -//.word 0x1d275cee -//.word 0x12cc20d3 -//.word 0x1cc71e41 -//.word 0xd1e7428d -//.word 0x0739ae5e -//.word 0x97c4a204 -//.word 0x60779f0b -//.word 0x8e60cc10 -//.word 0x1c1f98d4 -//.word 0x9799a18f -//.word 0x25f1d587 -//.word 0xc7b4d6e0 -//.word 0xdb53a3b6 -//.word 0xe5d77669 -//.word 0x8ed0e838 -//.word 0xed8e5b12 -//.word 0x069499a8 -//.word 0x904ab9c7 -//.word 0xfcf243e5 -//.word 0xb2dd94fa -//.word 0x9edf8391 -//.word 0xeb00441e -//.word 0x0e748d92 -//.word 0x07cef82d -//.word 0xe370a993 -//.word 0x86463023 -//.word 0xa7b4b084 -//.word 0x1ccc4180 -//.word 0x58c59416 -//.word 0x32a8d6ca -//.word 0xe84dd640 -//.word 0x63866909 -//.word 0xbc9a0ebd -//.word 0x00f5ce4a -//.word 0x301d668b -//.word 0x8ce8a81d -//.word 0x11ed1f6e -//.word 0x4138f216 -//.word 0x22420a6b -//.word 0x8920774f -//.word 0x98fa104d -//.word 0x86bf5ae5 -//.word 0x9e17ac23 -//.word 0x8b999077 -//.word 0xd23f6bc0 -//.word 0xa01661aa -//.word 0xc63a733a -//.word 0x0202eaa7 -//.word 0x8078f96c -//.word 0xa00c9e9b -//.word 0xfa89c974 -//.word 0xa047c036 -//.word 0xa2a3c235 -//.word 0xd8acea2d -//.word 0xdb1f57d6 -//.word 0x55968ab8 -//.word 0x7bfc0f41 -//.word 0xd7446015 -//.word 0x4b5a06a5 -//.word 0x535a0103 -//.word 0x8a016af5 -//.word 0x70615748 -//.word 0x6ad8ff66 -//.word 0x0a421f2b -//.word 0x916e9cf5 -//.word 0xb2cf69fa -//.word 0x9974abdf -//.word 0x2c3a1b86 -//.word 0x9141ac27 -//.word 0xf09c6fa2 -//.word 0x7a4db313 -//.word 0xaa7070a7 -//.word 0xcab6e6af -//.word 0xba1581f3 -//.word 0xedbe0049 -//.word 0xb450d666 -//.word 0xbf4bd0f3 -//.word 0xe0c7f9e4 -//.word 0x1366bb05 -//.word 0xbc8746d5 -//.word 0x2fbc3698 -//.word 0x757f6fa8 -//.word 0x4e204c0c -//.word 0x7202fa4b -//.word 0x1c071e82 -//.word 0xc949beb5 -//.word 0x3d0b5e63 -//.word 0xc8ef695d -//.word 0xc769d3d8 -//.word 0x6d73fdc0 -//.word 0xc482d94f -//.word 0xeeb94edf -//.word 0xb15ddefc -//.word 0x338a86be -//.word 0x0124e555 -//.word 0x560fa1e6 -//.word 0x9ba30796 -//.word 0x2a5af1e4 -//.word 0x57cced3b -//.word 0xb1de9bc7 -//.word 0x85365789 -//.word 0xa4f218a6 -//.word 0x66999805 -//.word 0xef51b618 -//.word 0xb15318fa -//.word 0x329d14bb -//.word 0x10e6d1f8 -//.word 0x42d7a9ae -//.word 0xa078d24f -//.word 0xa6e93e16 -//.word 0x7552bf98 -//.word 0x1a1c6f9d -//.word 0x13624f2d -//.word 0x0fa22eee -//.word 0xf6b9cdad -//.word 0x290e403a -//.word 0x0b0d9779 -//.word 0xc0d7beb6 -//.word 0x3537a239 -//.word 0x60d9951a -//.word 0xc9b6f457 -//.word 0x49d30724 -//.word 0x112b2882 -//.word 0xefe92813 -//.word 0xcddbee2d -//.word 0x7b24612d -//.word 0xae31890e -//.word 0x48eef03a -//.word 0xd9394f9f -//.word 0x66976606 -//.word 0x6a252ca0 -//.word 0x1bd228e2 -//.word 0xeecc1f93 -//.word 0x5d38ef24 -//.word 0xe826bb3f -//.word 0x5ac448a2 -//.word 0x4dd1a72e -//.word 0xf055153b -//.word 0x08901f2f -//.word 0x35300a4f -//.word 0x77c771d5 -//.word 0xf07b3042 -//.word 0xec0081f5 -//.word 0x1ec365fd -//.word 0x2c68462c -//.word 0x6f77da6c -//.word 0xf4524a56 -//.word 0xc66b9401 -//.word 0x6fb32e18 -//.word 0xbc56ec30 -//.word 0xc1a52358 -//.word 0x1d530ff1 -//.word 0x7fe572c0 -//.word 0x69647e41 -//.word 0x3455f53e -//.word 0x55eb8fa1 -//.word 0xde7a9c87 -//.word 0x482fea95 -//.word 0x6fffe98f -//.word 0xdedd0d26 -//.word 0x4d307412 -//.word 0x6884c961 -//.word 0xd27f680f -//.word 0x6a17c2d6 -//.word 0xcd030347 -//.word 0x1c6ff31a -//.word 0xfff41ac3 -//.word 0xe9c72846 -//.word 0x9e31944b -//.word 0xf33f8275 -//.word 0xd5baeaf0 -//.word 0x8d59f749 -//.word 0x4236ad83 -//.word 0xc07fcf67 -//.word 0x786e001b -//.word 0xc77b28f6 -//.word 0x7bd01993 -//.word 0x93fd7324 -//.word 0x46edc409 -//.word 0x4718f4a2 -//.word 0x48fbe161 -//.word 0xbdc54623 -//.word 0xe254e1c0 -//.word 0xff5fd5e0 -//.word 0xeaf54d11 -//.word 0xce266217 -//.word 0x2c003f83 -//.word 0x1fbd8288 -//.word 0xe43ae609 -//.word 0x99ab1ff6 -//.word 0x458e06d9 -//.word 0x19ddf6ac -//.word 0xf68876ee -//.word 0x2f2218f6 -//.word 0x8fdaa186 -//.word 0x9eae69a3 -//.word 0x20db05a4 -//.word 0xdf98248a -//.word 0xaa03b78f -//.word 0x9e5c5502 -//.word 0xa471dd51 -//.word 0x3b595d68 -//.word 0x78653239 -//.word 0x4a54719c -//.word 0x03c6865a -//.word 0x14f41b84 -//.word 0x189d3c0a -//.word 0x1544b888 -//.word 0xfe98ca63 -//.word 0x7c34f815 -//.word 0xed883cc5 -//.word 0xae17621b -//.word 0x95e4b152 -//.word 0xc226cd8f -//.word 0x9843dc71 -//.word 0x06fce8e9 -//.word 0x0be5844c -//.word 0x7919b3a6 -//.word 0xf92b0552 -//.word 0x4f6003c7 -//.word 0xdf1bcdb5 -//.word 0x70980251 -//.word 0x31dde0ec -//.word 0xf9eeadcb -//.word 0xd3415533 -//.word 0xba7154c3 -//.word 0xa136d607 -//.word 0xb7951d49 -//.word 0xe85424aa -//.word 0xa7b18272 -//.word 0xeb5490a5 -//.word 0x7781ced7 -//.word 0x5f928340 -//.word 0xc8a5a413 -//.word 0xef92f70c -//.word 0x6d207848 -//.word 0xb978fc5a -//.word 0xeed9149b -//.word 0xce8e34c1 -//.word 0x071d15b4 -//.word 0xb6c2579d -//.word 0x2a1b6b3f -//.word 0xea25b08a -//.word 0xf967dc6d -//.word 0x586d9eed -//.word 0xcd788274 -//.word 0xe374146b -//.word 0x322a480a -//.word 0xe0b7196f -//.word 0x683d71ee -//.word 0x9ad849a9 -//.word 0xe4d41160 -//.word 0xcf1d528a -//.word 0xccf692a4 -//.word 0x31ee78c9 -//.word 0x7f103083 -//.word 0xe65b11e1 -//.word 0x0b727dc9 -//.word 0x08940990 -//.word 0xb4cddec8 -//.word 0x266e6059 -//.word 0x74bc0dd4 -//.word 0xc0e5a703 -//.word 0x763895c5 -//.word 0xcf948718 -//.word 0x9a215978 -//.word 0x3b3f3a68 -//.word 0xf4bc0d4e -//.word 0x634a0f83 -//.word 0x4c30baab -//.word 0x993fea42 -//.word 0x9f083f78 -//.word 0xa34cc23f -//.word 0x9db4cba2 -//.word 0x3bc22258 -//.word 0x29086499 -//.word 0x9098a830 -//.word 0xddbb63d2 -//.word 0xc3e689ae -//.word 0x83e9f545 -//.word 0x6b6a0b7c -//.word 0x9c929cef -//.word 0x11060989 -//.word 0xdd19ac52 -//.word 0xb4407387 -//.word 0xadc6cef0 -//.word 0x46c0cc6e -//.word 0xa94481d4 -//.word 0x2ed6aaf7 -//.word 0x20239409 -//.word 0xc4f23922 -//.word 0x9757ac20 -//.word 0xd829b8b1 -//.word 0x46b7c4ae -//.word 0x2bb7faab -//.word 0x997fa9cc -//.word 0xf478e7da -//.word 0xb0cf7a95 -//.word 0x5c6df94c -//.word 0xe02a2eac -//.word 0x033dbfd6 -//.word 0x30f70db4 -//.word 0x79b25d8c -//.word 0xdc0436d5 -//.word 0xc538094a -//.word 0xd5fe183e -//.word 0xe261902f -//.word 0x3ffaf89d -//.word 0x3d63cf1c -//.word 0xf1ef71a9 -//.word 0x38983b3a -//.word 0xf939ef99 -//.word 0xaafe5a71 -//.word 0x161834a9 -//.word 0x5db547f2 -//.word 0x3c2fd49c -//.word 0x8e8332ae -//.word 0x1306b835 -//.word 0x7153dddc -//.word 0x78889ebd -//.word 0xaab22077 -//.word 0xfb859781 -//.word 0xd55166be -//.word 0x5f318851 -//.word 0xff862eb2 -//.word 0x1ea3a901 -//.word 0x2bca8b9b -//.word 0xe25809ec -//.word 0xce3ca484 -//.word 0x0cad096c -//.word 0x531d35ba -//.word 0x3168dc63 -//.word 0x97520c51 -//.word 0x98300eb5 -//.word 0x6ee58d9f -//.word 0xbe10f9cc -//.word 0x1d842ebe -//.word 0xd2f95112 -//.word 0xdd01fb0f -//.word 0x393d9a7b -//.word 0x5fd014b2 -//.word 0x0b14adf9 -//.word 0x428c2a0f -//.word 0x941a3605 -//.word 0x9f720650 -//.word 0xd4cf391d -//.word 0x7ee502e4 -//.word 0xff168840 -//.word 0x5de88dfe -//.word 0xfeb74e73 -//.word 0xb0a7ab13 -//.word 0xeddd8840 -//.word 0x5cef7360 -//.word 0x9a988732 -//.word 0x3bb19062 -//.word 0x0c5c705b -//.word 0x9b83c15c -//.word 0xfa81bbce -//.word 0xbf1e58d5 -//.word 0x4fc1b725 -//.word 0x5de1be17 -//.word 0xadbd04fb -//.word 0x1e4deeb0 -//.word 0xe7781873 -//.word 0x2187f6f5 -//.word 0x86dabbb0 -//.word 0x78d9797a -//.word 0x452e8a5b -//.word 0xa932309c -//.word 0x94a47820 -//.word 0x2ea164f8 -//.word 0x18d04831 -//.word 0xf5de75f0 -//.word 0x2a2a15c2 -//.word 0xe1c1562d -//.word 0x548ccb8b -//.word 0x48c80f18 -//.word 0xd7b7ab49 -//.word 0x7395395f -//.word 0x28ceca3d -//.word 0x216e8676 -//.word 0x6ed992ab -//.word 0x05bc3714 -//.word 0x0643405c -//.word 0x438da3b2 -//.word 0xff5d641d -//.word 0xf612b70f -//.word 0x9ed9653e -//.word 0xad2170af -//.word 0xdb4ffa13 -//.word 0xe9b36357 -//.word 0xe2bbb277 -//.word 0xa1673693 -//.word 0x93fd6d44 -//.word 0xbefe2430 -//.word 0x0258e0dc -//.word 0x9fdd7dc2 -//.word 0xf8f415a4 -//.word 0x978f231f -//.word 0x705de883 -//.word 0x6a400ee2 -//.word 0x1b018c67 -//.word 0xd343c9e9 -//.word 0xddb504c0 -//.word 0x018cf3d8 -//.word 0x4d31aa04 -//.word 0x1636bf94 -//.word 0x398fac29 -//.word 0xa6ff74c8 -//.word 0x20d08a2e -//.word 0x3ec7ee63 -//.word 0xb6579992 -//.word 0xda151b18 -//.word 0x636c83db -//.word 0x6e927fdd -//.word 0xc4bac411 -//.word 0x5e8cb06d -//.word 0x29d22e40 -//.word 0x0674dbc6 -//.word 0x15a667f9 -//.word 0x33603dab -//.word 0xc10e66d2 -//.word 0xa88aaa23 -//.word 0x9947f9e2 -//.word 0x9acf0af8 -//.word 0xbe6f4246 -//.word 0x3330d739 -//.word 0x820a359e -//.word 0x1355a1b8 -//.word 0xf0801c90 -//.word 0xca058a8d -//.word 0x419c1344 -//.word 0x60b0ca91 -//.word 0x670f8ce7 -//.word 0xcee52be4 -//.word 0x86ebcc29 -//.word 0x82dc8e68 -//.word 0x76296dbe -//.word 0xdfed6544 -//.word 0x4323dae1 -//.word 0xba173762 -//.word 0xad1ad6cc -//.word 0xde7a20f0 -//.word 0xa8b1f541 -//.word 0x89dd4ee3 -//.word 0xdd702004 -//.word 0xec29846f -//.word 0x2743165e -//.word 0xafec9a90 -//.word 0x17f8e69c -//.word 0x6bd7fc85 -//.word 0x71c4768e -//.word 0x2e402750 -//.word 0xacbfff09 -//.word 0xfba12f37 -//.word 0x76638e66 -//.word 0x47173b46 -//.word 0x2e118400 -//.word 0x7ee407ca -//.word 0x688d17ba -//.word 0x7bed62d7 -//.word 0x6c7dd076 -//.word 0x133daec4 -//.word 0xb7ed0b9f -//.word 0x8b8062aa -//.word 0x78ce7aa0 -//.word 0x1d898be8 -//.word 0x1572a26a -//.word 0x78cc46a2 -//.word 0xa4115cf2 -//.word 0x3de5483d -//.word 0x724855b1 -//.word 0x820f57e4 -//.word 0x7f958f23 -//.word 0x53aece07 -//.word 0x00dcdd48 -//.word 0x2cc61dd6 -//.word 0xdce56b26 -//.word 0x808146ca -//.word 0x30dc3445 -//.word 0x35ad611d -//.word 0xcbcf8a32 -//.word 0x253b194d -//.word 0xb23492fc -//.word 0x9fc12d9e -//.word 0x9d60c5ba -//.word 0xe4f9f095 -//.word 0x77117003 -//.word 0xaa40ca7d -//.word 0xe2e53474 -//.word 0x9d18b4e5 -//.word 0xb2e0872e -//.word 0xd9a6c020 -//.word 0x6dea3155 -//.word 0x71358ec3 -//.word 0xd24fd092 -//.word 0xebb1d82b -//.word 0x4e3d5592 -//.word 0xc22de7f5 -//.word 0x884a8585 -//.word 0xe35e1c84 -//.word 0xd7eb789f -//.word 0x301d687f -//.word 0xc6fe1d9b -//.word 0x00e9d450 -//.word 0x9741b533 -//.word 0x9c62faa6 -//.word 0xbdd853a9 -//.word 0xc4d089f3 -//.word 0x60cb6242 -//.word 0x289ac6ef -//.word 0xdd861fc5 -//.word 0xefcf0613 -//.word 0x43581b00 -//.word 0x34a0341f -//.word 0xd8f4bb43 -//.word 0x84e35195 -//.word 0x92f3b7e3 -//.word 0x6192ef3b -//.word 0x9e4f9eb9 -//.word 0xc24ab59d -//.word 0xdce950a0 -//.word 0x91cddf89 -//.word 0x610583fb -//.word 0x2c81bb91 -//.word 0xf4c93f2d -//.word 0xe4ef2c8c -//.word 0x91c1621e -//.word 0x81442a15 -//.word 0xea5e1dbc -//.word 0xbbd3410b -//.word 0xe0737478 -//.word 0xc2910e0f -//.word 0x0eb6c2c5 -//.word 0xb897c50a -//.word 0x3f45329d -//.word 0x32a4aea4 -//.word 0xf31e48fc -//.word 0xbb98a2ce -//.word 0xdea55663 -//.word 0x51fa9339 -//.word 0x69230756 -//.word 0xe57402dc -//.word 0x2f41d8de -//.word 0xdf528772 -//.word 0x81919907 -//.word 0x98064cf9 -//.word 0xe305f163 -//.word 0xdea69235 -//.word 0x8c76d786 -//.word 0x746c2a2b -//.word 0xe91f1a88 -//.word 0x8f35fda6 -//.word 0x1b1fda86 -//.word 0x5a0486b5 -//.word 0x75fa0c21 -//.word 0x737c522b -//.word 0xff19fafd -//.word 0x6c69871e -//.word 0xf645c143 -//.word 0x4b375a69 -//.word 0x4a30d120 -//.word 0x0a79972a -//.word 0x1eec7144 -//.word 0x17641d44 -//.word 0x4b723864 -//.word 0xd5525fde -//.word 0xdd1d95b9 -//.word 0x1a3fe4e2 -//.word 0x942c477e -//.word 0xaf4fc87f -//.word 0x6543e675 -//.word 0xd34639a7 -//.word 0xf7eb5963 -//.word 0xb80ffb92 -//.word 0x260d5d8f -//.word 0x0436e53a -//.word 0x847b0548 -//.word 0x516d61dd -//.word 0xd268345c -//.word 0xae0aef7e -//.word 0x8bea24a1 -//.word 0x1c87a363 -//.word 0x5a7fe370 -//.word 0x1102a398 -//.word 0x9f85d025 -//.word 0xf8bbaa6b -//.word 0xeec123a0 -//.word 0xb09987ee -//.word 0x90d962c7 -//.word 0x09a49f79 -//.word 0x00daed02 -//.word 0x4a8c6725 -//.word 0x6fb373bd -//.word 0xad21ea52 -//.word 0x40b77aea -//.word 0xe1d94921 -//.word 0x8d1fdb7c -//.word 0x874d36fb -//.word 0xa08644ed -//.word 0xb6bc7808 -//.word 0x7b6bb4b9 -//.word 0x77876bb9 -//.word 0x51b303e1 -//.word 0x4ab37d3f -//.word 0x0a245769 -//.word 0x9f6ab111 -//.word 0xc3ebb0da -//.word 0x5d7b206a -//.word 0x4b165dc1 -//.word 0x5fd573c9 -//.word 0xa71b842e -//.word 0xf20f6a6f -//.word 0x8f509e36 -//.word 0x58e458e5 -//.word 0xf071f871 -//.word 0x48afa573 -//.word 0x681d347c -//.word 0x6cf34ba9 -//.word 0xcc58c678 -//.word 0xe1d659da -//.word 0xa50b778a -//.word 0xbba1739c -//.word 0xaf80e659 -//.word 0x7e41504a -//.word 0x59e60293 -//.word 0xa6c93b83 -//.word 0x48d39168 -//.word 0x20ee92a8 -//.word 0xd3bdac0d -//.word 0xce8a4a61 -//.word 0x8880403b -//.word 0x071a6918 -//.word 0xa6db8ead -//.word 0x15408a7c -//.word 0xa1f3aca6 -//.word 0xb6415d00 -//.word 0xa2ce0368 -//.word 0x9b87255a -//.word 0x04d9cfbe -//.word 0xec203804 -//.word 0xd863a273 -//.word 0xc23e82be -//.word 0x611fe1d9 -//.word 0xabb6020a -//.word 0x99a64543 -//.word 0x2a814baf -//.word 0xaaf35b8b -//.word 0x343d0437 -//.word 0x76e5048d -//.word 0xb4ac6971 -//.word 0x0fc1f6a9 -//.word 0x0834c8f0 -//.word 0x40ad3a45 -//.word 0x815e0589 -//.word 0x0236ac49 -//.word 0xe75817d9 -//.word 0x08cb7da2 -//.word 0xf37388bc -//.word 0x3440b4c0 -//.word 0xd4a5f9d7 -//.word 0x1f4ca917 -//.word 0xaa089b10 -//.word 0x950b89a1 -//.word 0x0e59b711 -//.word 0x167cd55a -//.word 0x887927c8 -//.word 0x5704e3c3 -//.word 0x17f0dbe9 -//.word 0xbfe95b61 -//.word 0xad65556b -//.word 0xead8bb3b -//.word 0xb0272d07 -//.word 0x2960d45f -//.word 0x7aa88ebd -//.word 0x00754b5d -//.word 0xd9fdb74e -//.word 0xa7ee19ca -//.word 0x905f7ac3 -//.word 0x8a060bbe -//.word 0xd5acc1e4 -//.word 0xc8df4256 -//.word 0xd1e704c2 -//.word 0xb8fbb334 -//.word 0x23b4d42e -//.word 0x5fc1a9fa -//.word 0x5ddd543f -//.word 0xfbfe3ed3 -//.word 0x85cfbad0 -//.word 0x7c61e6ea -//.word 0x961dd2ff -//.word 0x05fee5f0 -//.word 0xfcfd7cb0 -//.word 0x70ccd39a -//.word 0x1cc62908 -//.word 0xc7271f21 -//.word 0xc97862f2 -//.word 0xcc4e89c1 -//.word 0xd034419d -//.word 0x72e6a73a -//.word 0x6dc0f5fc -//.word 0x61756152 -//.word 0xd3044245 -//.word 0x75e87551 -//.word 0xa88fff73 -//.word 0x400ef383 -//.word 0x871397c4 -//.word 0x841bc2ba -//.word 0x7de5883b -//.word 0xba2619c9 -//.word 0x8c7ee71f -//.word 0x8eab070a -//.word 0x2bfdda7a -//.word 0x6009ecd9 -//.word 0xc3a21c9b -//.word 0xc505fe17 -//.word 0x34547d95 -//.word 0x0446c5a8 -//.word 0x4e1c60be -//.word 0x99d79ef5 -//.word 0x59a83b30 -//.word 0xb5a83c6b -//.word 0x8dc91a4b -//.word 0xbc0c22f9 -//.word 0x9af51c31 -//.word 0xc53d2b96 -//.word 0x22c6f449 -//.word 0x1ed402b9 -//.word 0x3a7969bd -//.word 0xc651aae0 -//.word 0xec70d7fb -//.word 0xf199f80a -//.word 0xb8b0ac38 -//.word 0x8872143c -//.word 0x0e64ece8 -//.word 0xa609fbff -//.word 0xd658ae48 -//.word 0x1b6d00e0 -//.word 0xe97f9cd4 -//.word 0xed1246ef -//.word 0x956e77d1 -//.word 0xd24f4741 -//.word 0x1dde90c5 -//.word 0xb8e0516f -//.word 0x362e50f9 -//.word 0x3d650415 -//.word 0x8bdeb1fe -//.word 0x37e1d553 -//.word 0x3915c325 -//.word 0x2d3b8e4f -//.word 0x541c2805 -//.word 0xdcc0cbb0 -//.word 0x61e198f9 -//.word 0xb39f7f24 -//.word 0x80000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00008C20 -//// expected output -//.word 0xf0549331 -//.word 0x42774856 -//.word 0xdac63b63 -//.word 0xf1755442 -//.word 0x98a3d368 -//.word 0x74bc3765 -//.word 0x0a268220 -//.word 0x1f8336b6 -//.word 0x21cbf9d9 -//.word 0x5c87a983 -//.word 0x8181c1b5 -//.word 0xc015dd0c -//.word 0x08723beb -//.word 0x82830326 -//.word 0x382b5db5 -//.word 0x1ea9283c -//// SHA512LongMsgvector_45 -//// vector length -//.word 0x00008F38 -//// input message -//.word 0xa2871817 -//.word 0xb7ec41d5 -//.word 0x116195f9 -//.word 0x7ecf6e4c -//.word 0x35dfde5f -//.word 0x0d5e8a17 -//.word 0xede6bc69 -//.word 0x84bbb363 -//.word 0x3af33e6c -//.word 0x66da89cc -//.word 0xc194366f -//.word 0x1b04afe5 -//.word 0x4cedbbae -//.word 0x6e5750b5 -//.word 0x4935a91a -//.word 0x0f449734 -//.word 0x4a361cd7 -//.word 0x121036d2 -//.word 0x83d1f9bc -//.word 0x6e54e0f1 -//.word 0x4f7765d7 -//.word 0x7f7dcf66 -//.word 0xabb14ce7 -//.word 0x854c3ffb -//.word 0xb999dbe0 -//.word 0x2357f1f0 -//.word 0x3f5f066a -//.word 0xe187a975 -//.word 0x26c50462 -//.word 0xaa98b032 -//.word 0xfba3ce58 -//.word 0x4e9b53c0 -//.word 0x7164a30f -//.word 0x0177622d -//.word 0xdd878601 -//.word 0xda64b17b -//.word 0xb91fbfd8 -//.word 0x566f9a21 -//.word 0x215356f5 -//.word 0xd2f97a89 -//.word 0x59df9bed -//.word 0x14383091 -//.word 0x4591a107 -//.word 0xc3b4a10a -//.word 0xf0cdbec0 -//.word 0xeacb363c -//.word 0x06090d47 -//.word 0x7a2e5c60 -//.word 0x5952ec01 -//.word 0xc5620324 -//.word 0x60c57e06 -//.word 0x033f202b -//.word 0xb3162aa2 -//.word 0xd0742c8a -//.word 0x900d1ad5 -//.word 0xac01a24c -//.word 0x5904bdd3 -//.word 0x7abc85ef -//.word 0x146a4685 -//.word 0x02cdd7e5 -//.word 0xea442b06 -//.word 0x6f322313 -//.word 0xa8a6a627 -//.word 0xd13cf456 -//.word 0x413e37ec -//.word 0x9c0f5cf9 -//.word 0x4aca200d -//.word 0x28266e40 -//.word 0x7d9de875 -//.word 0x2fcdc4e0 -//.word 0x371ed9c6 -//.word 0x52a5f984 -//.word 0xf94882d3 -//.word 0x9423304a -//.word 0xeb2b3525 -//.word 0xdd118c44 -//.word 0x546a8a77 -//.word 0x780cb6f8 -//.word 0x23bbda39 -//.word 0x95055ae0 -//.word 0x6a6ac510 -//.word 0xc9c0aaeb -//.word 0xddd6ad55 -//.word 0x8958d9fa -//.word 0x57f23892 -//.word 0xb2b8a164 -//.word 0x56c6d208 -//.word 0x0423bf72 -//.word 0x7aec292c -//.word 0xa2ae71e3 -//.word 0x0a13af25 -//.word 0x94c1ff69 -//.word 0x6f7f1b50 -//.word 0x45992f2a -//.word 0xb686e8bc -//.word 0x06c9ce41 -//.word 0x1215d5ae -//.word 0x89b42e3a -//.word 0x582a631e -//.word 0x6615a399 -//.word 0x82575b38 -//.word 0x9a770654 -//.word 0x2d4545dc -//.word 0x02bd3255 -//.word 0x1b2ef11e -//.word 0xe59c89f9 -//.word 0xb162f2c7 -//.word 0x671b7093 -//.word 0x79c31fd2 -//.word 0x171acee9 -//.word 0xa24910f0 -//.word 0x62c891b6 -//.word 0x7b7fa705 -//.word 0x1d2c2927 -//.word 0xfc0484a8 -//.word 0x009d0b5e -//.word 0x3d0b8fa7 -//.word 0x254a30f2 -//.word 0xfcdc7281 -//.word 0x8db2946d -//.word 0x1c501dea -//.word 0x9b2db7cc -//.word 0x2158404a -//.word 0x97611f02 -//.word 0xb577d43e -//.word 0x2dced376 -//.word 0x25449316 -//.word 0xeb43e280 -//.word 0xe4e97b55 -//.word 0xc666daf1 -//.word 0x07a64f34 -//.word 0x96315288 -//.word 0xc84f161f -//.word 0x956f617d -//.word 0x04c99a37 -//.word 0xe44324fa -//.word 0xbd91eace -//.word 0x06a13b9c -//.word 0x9836d9ee -//.word 0x63d34cf7 -//.word 0x60da7cd3 -//.word 0xc6f57f10 -//.word 0x81b5b06c -//.word 0xe07901e0 -//.word 0x8e9292de -//.word 0xc3a482d8 -//.word 0xbb4f0501 -//.word 0x680fb657 -//.word 0x64612fe1 -//.word 0x2928d735 -//.word 0x844efc3e -//.word 0x47ae223c -//.word 0x3f329a0c -//.word 0x653856aa -//.word 0x583bfbf4 -//.word 0x0baf38b1 -//.word 0xbb2c57d1 -//.word 0x25cf11f6 -//.word 0xf5dea734 -//.word 0x81aa2e15 -//.word 0xb7ba2ae1 -//.word 0x54255f1c -//.word 0x5840e44f -//.word 0xb679790c -//.word 0x4f831a2c -//.word 0x21b4d55b -//.word 0xbcabd8d7 -//.word 0xf635ce74 -//.word 0xe0726ce4 -//.word 0xf9334635 -//.word 0xa1a7e89b -//.word 0xd0372270 -//.word 0x07aea379 -//.word 0x879dc96b -//.word 0xc2feb8ad -//.word 0x0f17aa60 -//.word 0xa1a1869d -//.word 0xba2ab3fd -//.word 0x1cb82e5f -//.word 0xc1afdae5 -//.word 0xcbf41840 -//.word 0xbe53982e -//.word 0xed1e6f40 -//.word 0x321769e1 -//.word 0xe290a094 -//.word 0x00d14d7d -//.word 0xb1badf23 -//.word 0xf0aa4a74 -//.word 0x839fa20a -//.word 0x2e9ee8ac -//.word 0x26552418 -//.word 0xc8ffb3ff -//.word 0x8b88e352 -//.word 0x34f1bdbc -//.word 0x49f72270 -//.word 0xc7ef1a24 -//.word 0x17f5685d -//.word 0x3f4562ee -//.word 0x56e9ffbb -//.word 0x3a9532c3 -//.word 0x85cf765e -//.word 0xbc52aac2 -//.word 0xcab520cc -//.word 0xad48f1fe -//.word 0x703f93c4 -//.word 0x5912adfb -//.word 0x632329b3 -//.word 0xeea28b34 -//.word 0xb6ad8240 -//.word 0x02bcbd98 -//.word 0x1e3d00c2 -//.word 0x0a7b7708 -//.word 0x74c44ac4 -//.word 0xe4cb71db -//.word 0x374bca88 -//.word 0x4eed695b -//.word 0x076c2f81 -//.word 0x6cf79e45 -//.word 0x2bd7ebd7 -//.word 0x4751554c -//.word 0x0cceb6e7 -//.word 0x48395897 -//.word 0xb8a909c0 -//.word 0xc140723e -//.word 0x6053a4a8 -//.word 0x64caf4d1 -//.word 0xdbca0995 -//.word 0xca9233d2 -//.word 0x21a3feb4 -//.word 0xed240836 -//.word 0xd0840fe5 -//.word 0xae614ee7 -//.word 0xaaa90a3d -//.word 0x51ff6845 -//.word 0x14608183 -//.word 0xfc06b8a0 -//.word 0x998c4cb3 -//.word 0x3c5429c0 -//.word 0x6626047e -//.word 0x7f19a65e -//.word 0xcbb788c8 -//.word 0x9b5ca1a8 -//.word 0xc0df7c29 -//.word 0x45748dc0 -//.word 0x5ed1c56d -//.word 0x9b90643e -//.word 0x61d50f14 -//.word 0x9b3022a9 -//.word 0xadc547d2 -//.word 0xa9aa4802 -//.word 0xc6902110 -//.word 0x0ea65a3a -//.word 0x56ba9369 -//.word 0x73a161b7 -//.word 0xabda582e -//.word 0x6a6e69d2 -//.word 0x361a6fe2 -//.word 0xe5b0045c -//.word 0x0ebb99bf -//.word 0xbd62c614 -//.word 0x6b8fde2f -//.word 0x2d50c733 -//.word 0x2b7d0854 -//.word 0x549b24e1 -//.word 0x50002781 -//.word 0xb6387ebd -//.word 0x80a80bbe -//.word 0xbc717958 -//.word 0x8497cd48 -//.word 0x2f633eba -//.word 0xc905470f -//.word 0xc17efadc -//.word 0xe2bd9736 -//.word 0x84085d2d -//.word 0x049ea096 -//.word 0x719b1c0e -//.word 0x881b893b -//.word 0xe3a27055 -//.word 0x6dbc3ce5 -//.word 0x19e094cd -//.word 0xd49ae889 -//.word 0xb8ea4ab4 -//.word 0x82e780ce -//.word 0x46a7573c -//.word 0x61633a90 -//.word 0xb0d7020b -//.word 0xffe81060 -//.word 0xc48999bb -//.word 0x0edf4202 -//.word 0xb8a3ed5b -//.word 0xe2c9d2ee -//.word 0xa15fd1ec -//.word 0xf6b706d0 -//.word 0xfdc89fe5 -//.word 0x67d2ea08 -//.word 0x2a41b2af -//.word 0x77d4cc2a -//.word 0xedfeed29 -//.word 0x0c8dbf7f -//.word 0xec893325 -//.word 0x2f5f1882 -//.word 0x343eede9 -//.word 0x8dc2f364 -//.word 0xb4d087b0 -//.word 0xf9c1af88 -//.word 0xbfc2f327 -//.word 0xe87a6e08 -//.word 0x8eee24f0 -//.word 0xf4a2962e -//.word 0xbc019421 -//.word 0x5aff53fc -//.word 0xc8fdbfc6 -//.word 0x7bed12a5 -//.word 0x97b6a65b -//.word 0x5fda0711 -//.word 0xef564d54 -//.word 0x2dcaa95d -//.word 0xfdd93d95 -//.word 0xb4d33158 -//.word 0xd09103f9 -//.word 0xe6a11e07 -//.word 0xdba4afcf -//.word 0x57f3b422 -//.word 0x77895559 -//.word 0xc21d7895 -//.word 0x5f8e904c -//.word 0x8584b501 -//.word 0x3255fa52 -//.word 0x2025fb38 -//.word 0xf552b58b -//.word 0xb90f9bc4 -//.word 0x8e4ee607 -//.word 0x9be42c61 -//.word 0x4ae7344e -//.word 0xb35b097e -//.word 0x580e4dd8 -//.word 0x12c1d0c0 -//.word 0x4b886195 -//.word 0x6e74e47e -//.word 0x9c6ea567 -//.word 0xa166ec46 -//.word 0x26aed2a3 -//.word 0x27a05257 -//.word 0xa887a394 -//.word 0xa4bdc525 -//.word 0x47105bf7 -//.word 0x5d6ab8d9 -//.word 0x09b23c80 -//.word 0xbaede1ce -//.word 0x5ba91154 -//.word 0xca9bbb15 -//.word 0x8c87a58c -//.word 0xbf6004f1 -//.word 0x4fb14ab9 -//.word 0x6d3b3f5c -//.word 0x3ddf535a -//.word 0xcfbf3280 -//.word 0x51a19a67 -//.word 0x8394693f -//.word 0x6bd5fbca -//.word 0x49f3b2ab -//.word 0xcd32d6e1 -//.word 0x882da08f -//.word 0xa1c091fe -//.word 0xc92508e4 -//.word 0x705d14e7 -//.word 0x39d2875d -//.word 0xac3a4c56 -//.word 0x2cbefadc -//.word 0x285ca879 -//.word 0x958a04fa -//.word 0x9b1c9f73 -//.word 0x8e678b83 -//.word 0x21a728d9 -//.word 0xd69e3bf7 -//.word 0xb97e4036 -//.word 0x4e09020b -//.word 0xc8f76888 -//.word 0x7b989226 -//.word 0x94ba24c1 -//.word 0x08cde2e4 -//.word 0xca457e47 -//.word 0x4140ad96 -//.word 0xf9698074 -//.word 0x991cf2c0 -//.word 0x15cbbe17 -//.word 0x24a0739a -//.word 0xf563c9f1 -//.word 0x1d9f3690 -//.word 0xd500bd38 -//.word 0x620007c1 -//.word 0xd4c2b418 -//.word 0xf33ef384 -//.word 0x779f502d -//.word 0x77e9cede -//.word 0x24df360a -//.word 0xb724ae0d -//.word 0xa8a08db5 -//.word 0x21256e01 -//.word 0xb2538428 -//.word 0x46b92ddd -//.word 0x563cc9d2 -//.word 0x5cbdcc7b -//.word 0x8bf61214 -//.word 0xbda573e5 -//.word 0xaded98c5 -//.word 0x66f90cdd -//.word 0xfbe296ae -//.word 0x79d3c756 -//.word 0x1a6bcf0e -//.word 0xbb6295f8 -//.word 0x90700618 -//.word 0x176aac9f -//.word 0x4aaf8370 -//.word 0x19c209dd -//.word 0x173895b1 -//.word 0x74d5e974 -//.word 0x2bf20aea -//.word 0x7c2150dd -//.word 0x9d14b91c -//.word 0xadbb82c4 -//.word 0xe9adf9be -//.word 0x22c98d89 -//.word 0x6f1d273a -//.word 0x1f07bdc1 -//.word 0xf199246d -//.word 0x884225b3 -//.word 0x19abd42b -//.word 0x67e01ddb -//.word 0xf1b0a0b8 -//.word 0x6956bf6a -//.word 0x6959f450 -//.word 0x62b068c4 -//.word 0xd52ac2a0 -//.word 0xc50d3d00 -//.word 0x6cfdfe4a -//.word 0x2d20a46c -//.word 0xca802065 -//.word 0xd7b1c707 -//.word 0x6eb3a5fb -//.word 0x25191505 -//.word 0x3d6b8f89 -//.word 0x1ccac04f -//.word 0xfdd2e083 -//.word 0xe7c54000 -//.word 0xdbe522ce -//.word 0x5221cee8 -//.word 0xe7f4e243 -//.word 0x508bea0d -//.word 0x92263032 -//.word 0x75c0d625 -//.word 0x36f221dd -//.word 0x7d15181e -//.word 0x8ea74ef9 -//.word 0xc3effc96 -//.word 0x3ae45231 -//.word 0xcb4c0f63 -//.word 0x3d2150a3 -//.word 0xb938a50c -//.word 0x7e256a61 -//.word 0xd759554e -//.word 0x4a8d4bf0 -//.word 0x13647898 -//.word 0xd14b9ecc -//.word 0x7ea4ad8f -//.word 0xa42595e3 -//.word 0xce7a588b -//.word 0x3d326315 -//.word 0xddd81e18 -//.word 0x7860c2bb -//.word 0x28c66b76 -//.word 0x12f16e1d -//.word 0x51ddec1a -//.word 0x31f9a7f9 -//.word 0x9ece152b -//.word 0xdce2b303 -//.word 0x78dc9c05 -//.word 0x7ee85a60 -//.word 0xec5dfcb9 -//.word 0x679e682a -//.word 0x2d3ef38b -//.word 0x4b672ff0 -//.word 0x107c0472 -//.word 0xc1fd0333 -//.word 0x8eabf69c -//.word 0xc5edbce9 -//.word 0x467354e8 -//.word 0x371937fd -//.word 0xf80eeb6a -//.word 0x5935d5cd -//.word 0x0bcb4fea -//.word 0x554bfaab -//.word 0x088e5565 -//.word 0xb5378f5d -//.word 0x1d4e9a8b -//.word 0xe92b819e -//.word 0x9c96fb40 -//.word 0xc52c409a -//.word 0x79051b1b -//.word 0x00934175 -//.word 0xcfcde1e9 -//.word 0xb68d7cc5 -//.word 0x5b37f72b -//.word 0xe79cef13 -//.word 0xff1e4c93 -//.word 0xf614195f -//.word 0x4170938c -//.word 0x2b9f7f99 -//.word 0xcab0c1af -//.word 0x31b92b28 -//.word 0xe776934f -//.word 0x98342866 -//.word 0x0bed06ee -//.word 0x54b50722 -//.word 0x4b54dcc5 -//.word 0x3c355d1d -//.word 0xe07f1e40 -//.word 0x8c81438e -//.word 0xa953957f -//.word 0x64bad59f -//.word 0xa64d50d6 -//.word 0x47d6b3ed -//.word 0x7ffb214e -//.word 0x9d1e830b -//.word 0xfb811f22 -//.word 0x31ae6d00 -//.word 0x89162543 -//.word 0xb3f89dc4 -//.word 0xba8452d5 -//.word 0x3741c4c7 -//.word 0xc5ac88b0 -//.word 0xb422986a -//.word 0x02ffeddf -//.word 0x86085084 -//.word 0x6f066d24 -//.word 0xedb429df -//.word 0x2edb3572 -//.word 0x8cbce3b9 -//.word 0x05ae3972 -//.word 0xeb084543 -//.word 0xdc41afff -//.word 0xf5569525 -//.word 0x436c92a9 -//.word 0x7ab720f7 -//.word 0xea9a2136 -//.word 0xae10b8c9 -//.word 0x274a5d1c -//.word 0xa99a319d -//.word 0x738f8e08 -//.word 0xe562e3e8 -//.word 0xed90bf5b -//.word 0xc3c92b15 -//.word 0xd6093da7 -//.word 0x0605ea01 -//.word 0x13c81c36 -//.word 0x559e0480 -//.word 0xae31b284 -//.word 0xbef2e3d7 -//.word 0x55ba1ac0 -//.word 0x2eb1f240 -//.word 0xda70b24f -//.word 0xfa622269 -//.word 0xb1709d49 -//.word 0x59dd68f5 -//.word 0x756e42fa -//.word 0xe7cf3cf9 -//.word 0x6432cb62 -//.word 0x24391c80 -//.word 0xde16a7b6 -//.word 0xf3f10708 -//.word 0xea8909dc -//.word 0x1c1f0302 -//.word 0xb09067f3 -//.word 0xcac19756 -//.word 0x003ffbc9 -//.word 0x0e2752dd -//.word 0xca444562 -//.word 0x5a7842e6 -//.word 0xa45d8778 -//.word 0x062b7db2 -//.word 0x47dd48f6 -//.word 0xce8f9cf7 -//.word 0x122bd27b -//.word 0x52443b60 -//.word 0x8642b4dd -//.word 0x95c07a0b -//.word 0xc83240a4 -//.word 0x7fcb7f0a -//.word 0x239e0e8b -//.word 0x5b03f2e3 -//.word 0x833c7702 -//.word 0x5a588010 -//.word 0xfa581baf -//.word 0x0e915880 -//.word 0x3f515ce8 -//.word 0xefc5b114 -//.word 0x2a1ae03a -//.word 0xd9e34222 -//.word 0x39bb13e6 -//.word 0x8c2bc8f6 -//.word 0x0fcea25e -//.word 0x2bb2844c -//.word 0xef0202cc -//.word 0xbee2bad7 -//.word 0x459be78c -//.word 0xb0f833bd -//.word 0x1ef0cdad -//.word 0x5284bc18 -//.word 0xabeb7374 -//.word 0x56eda577 -//.word 0xc28d5ad9 -//.word 0x54ea435b -//.word 0x5d674a08 -//.word 0x490a6ebb -//.word 0x1922cee1 -//.word 0x132d0380 -//.word 0xb7f8b379 -//.word 0xf608630a -//.word 0x9f398d96 -//.word 0x1aa5f3a9 -//.word 0x58c73237 -//.word 0x0ae19a24 -//.word 0x119a3d09 -//.word 0x36ec4636 -//.word 0x1c3d8df3 -//.word 0x72cc680c -//.word 0x6d4fc38c -//.word 0x76db73c8 -//.word 0x2003c79f -//.word 0x5c446001 -//.word 0xf0a143ae -//.word 0x258a2d40 -//.word 0xc002276c -//.word 0x34015985 -//.word 0x16172341 -//.word 0xd1536ac0 -//.word 0x9b6330ca -//.word 0xa8fc6859 -//.word 0x9d7d0857 -//.word 0x47cf5fa8 -//.word 0x8d8fa96b -//.word 0xa36fe17d -//.word 0x81d9d63f -//.word 0x94d6819a -//.word 0xb32f9640 -//.word 0x54d25934 -//.word 0x0076b38c -//.word 0x04828576 -//.word 0x6a2b3c79 -//.word 0x27dda6fd -//.word 0x96dd040e -//.word 0x252c605d -//.word 0x4fae2087 -//.word 0xca8bdc9a -//.word 0x01d66dd6 -//.word 0xc46d46b0 -//.word 0x3e20081d -//.word 0x2815500c -//.word 0x3d6ad334 -//.word 0xee1dae11 -//.word 0x5629f729 -//.word 0x70f29894 -//.word 0x88e35dbb -//.word 0xef564b60 -//.word 0xf3b434df -//.word 0x0edd88b3 -//.word 0x5eca6e3b -//.word 0x557113be -//.word 0xb2e842ae -//.word 0xb0ce3629 -//.word 0x7de7acc5 -//.word 0xed063c8d -//.word 0x7030e847 -//.word 0x42fef6f9 -//.word 0xe143fbab -//.word 0xc4ef396d -//.word 0x4a332a9c -//.word 0xf1e65d62 -//.word 0xc828817c -//.word 0x2745c040 -//.word 0x9ddc4ede -//.word 0x2a4041e6 -//.word 0xae1ea30a -//.word 0xa260c526 -//.word 0x0652d77d -//.word 0x9a03b645 -//.word 0x51ef0567 -//.word 0x03da7f80 -//.word 0x62ff8b2b -//.word 0x2f6a1182 -//.word 0xaea38de2 -//.word 0x578c62ef -//.word 0xce8c70d8 -//.word 0x15ede8dd -//.word 0x01835f0e -//.word 0xea8f2255 -//.word 0xa7e2cab6 -//.word 0xb94610d6 -//.word 0xc719e2ba -//.word 0x4b3bb6d2 -//.word 0x8a2b1e36 -//.word 0xc96c9c2f -//.word 0xbe2eb8f9 -//.word 0x452a51c7 -//.word 0x54ce3108 -//.word 0x319ae4e9 -//.word 0xe2cac91b -//.word 0xe63569d6 -//.word 0x2275081e -//.word 0x1e487a45 -//.word 0x713638b1 -//.word 0x7a74b3df -//.word 0x5109e8a8 -//.word 0xfd2f35c3 -//.word 0xe8fc6b8c -//.word 0x90412403 -//.word 0x7eb35718 -//.word 0x7c482926 -//.word 0x03e406bd -//.word 0xf335f1a4 -//.word 0x86db181e -//.word 0x87cdac6d -//.word 0xbff8ef95 -//.word 0xb1298f62 -//.word 0x872c32ac -//.word 0x4b3652da -//.word 0x5a804ba5 -//.word 0x1635b21f -//.word 0xdc8ee9f3 -//.word 0x363bf0ee -//.word 0x51067ebe -//.word 0xb1b351fa -//.word 0x232ac263 -//.word 0xf3d89c6a -//.word 0x60522ef2 -//.word 0x4d3b9f56 -//.word 0x396982ae -//.word 0x7143aa4e -//.word 0x846d4090 -//.word 0xf8a812d4 -//.word 0x3bf32ec4 -//.word 0xdcf6b0dd -//.word 0xfba1d82b -//.word 0xff116053 -//.word 0x87b30cd7 -//.word 0xa2ab8296 -//.word 0x42775c92 -//.word 0xeecf7cf6 -//.word 0xb8d09f58 -//.word 0x6f5a353b -//.word 0x15b771d8 -//.word 0x937d9c1e -//.word 0xacb5aef7 -//.word 0x303c1fcd -//.word 0x726afb4d -//.word 0xfbf2356a -//.word 0x80093da5 -//.word 0x12cbd48c -//.word 0x95da2081 -//.word 0x7348fbbd -//.word 0x92b79195 -//.word 0x83be2afb -//.word 0xfc8f4447 -//.word 0x88d7e538 -//.word 0x7de62f35 -//.word 0x2e1035d9 -//.word 0x63530daf -//.word 0x063a273a -//.word 0x1f00dc39 -//.word 0x03f94a28 -//.word 0xc72e600a -//.word 0xfb473566 -//.word 0x95af9e90 -//.word 0x2cf2ff29 -//.word 0x676a61e9 -//.word 0xb41ac59c -//.word 0x3ddab86b -//.word 0x18b5285d -//.word 0xbd8f761e -//.word 0xbe0accfe -//.word 0xb2abb13c -//.word 0x7239db85 -//.word 0x896644b8 -//.word 0xe5b280ec -//.word 0xd38b4db4 -//.word 0x2ab96ca2 -//.word 0xc5f9af09 -//.word 0x37e85407 -//.word 0xbb2391c3 -//.word 0x6aad70f4 -//.word 0xb191dda3 -//.word 0x01c8fd31 -//.word 0xc85cc29b -//.word 0xa1cebdfd -//.word 0xc7b63355 -//.word 0xd0a9728a -//.word 0x985f65ad -//.word 0x7b15677e -//.word 0xc7315532 -//.word 0x7025e773 -//.word 0x069540a9 -//.word 0xe5bcc378 -//.word 0xac0c2989 -//.word 0xf014d08e -//.word 0x31a75680 -//.word 0x0c3b672b -//.word 0xb38fd3ed -//.word 0x9b91e4bb -//.word 0x747eee64 -//.word 0x5e4b271a -//.word 0x5a44b92e -//.word 0xfef3161b -//.word 0x6e438cc6 -//.word 0x87e51904 -//.word 0x5df3805d -//.word 0xe8d39c10 -//.word 0xfa5ff556 -//.word 0x744291eb -//.word 0xbaa50dcb -//.word 0x640cec39 -//.word 0x377a2e06 -//.word 0x53dc2410 -//.word 0xada48409 -//.word 0xc0b5b97a -//.word 0x807f7c07 -//.word 0x906ba8f4 -//.word 0xb4794ae8 -//.word 0x8927f8f1 -//.word 0x749665c9 -//.word 0xd8e83258 -//.word 0x8cec0679 -//.word 0x8cfde001 -//.word 0xee27acfe -//.word 0x188c153c -//.word 0x31069b0e -//.word 0xd50ee54a -//.word 0x0ddd5896 -//.word 0x7ed0e8e2 -//.word 0xe0112e36 -//.word 0xb274bbae -//.word 0x2c9fadc3 -//.word 0x766e80cb -//.word 0x179626c3 -//.word 0xb088594d -//.word 0xea9830f5 -//.word 0xad5ef0b8 -//.word 0x935c25c7 -//.word 0x9ce2f288 -//.word 0x232fa6de -//.word 0x10d98faa -//.word 0x506f1392 -//.word 0x825cfc01 -//.word 0xf30e146e -//.word 0xcd58f2e2 -//.word 0x8b1513b4 -//.word 0xb00f2d97 -//.word 0xb91fbfd8 -//.word 0x5095ede0 -//.word 0xc2d98b00 -//.word 0xb353786e -//.word 0x11892d8a -//.word 0x46879566 -//.word 0xb2842086 -//.word 0x58c213e4 -//.word 0xd7b62237 -//.word 0x9d694075 -//.word 0x571eb697 -//.word 0xab35729c -//.word 0x2a4fa2d0 -//.word 0x80b3824e -//.word 0xeef172c4 -//.word 0xfbc54c76 -//.word 0x663df486 -//.word 0x5e1e3172 -//.word 0xf585bbde -//.word 0xd3ca9594 -//.word 0x27a99cc9 -//.word 0xe4a461a2 -//.word 0x29a334f6 -//.word 0x00de8156 -//.word 0x4cfc604a -//.word 0xfd7c67de -//.word 0x8655c25d -//.word 0x91d9865d -//.word 0xf1df43fb -//.word 0xd821d968 -//.word 0x4ae38ca5 -//.word 0xd1d65a8a -//.word 0x733b8b0d -//.word 0xe14b8bc1 -//.word 0xf1d7f59d -//.word 0x4e2cf0ff -//.word 0x6e39bef0 -//.word 0xc5f492aa -//.word 0x39f9a258 -//.word 0xd5747e1c -//.word 0xc142a056 -//.word 0x72534424 -//.word 0x1e537a25 -//.word 0x73897983 -//.word 0x88ff3630 -//.word 0x14e3356f -//.word 0xde2d9f97 -//.word 0x74829613 -//.word 0x2058c5ae -//.word 0x185c3b0e -//.word 0xf510797d -//.word 0x66b9c9f0 -//.word 0x2678d241 -//.word 0x2bb76ac0 -//.word 0x21c6abea -//.word 0x16c64978 -//.word 0x77c7229c -//.word 0x3b2d1787 -//.word 0x5e581b2e -//.word 0x9184894e -//.word 0x30edbbad -//.word 0x7437d8a4 -//.word 0xea0eedda -//.word 0x230a4052 -//.word 0xadd5e1a8 -//.word 0x438f8197 -//.word 0x417187bf -//.word 0x5bb161a5 -//.word 0x8da618fc -//.word 0x552d2823 -//.word 0x214b8eee -//.word 0x031422a9 -//.word 0xaccb275a -//.word 0x984a2147 -//.word 0x86a4e6b8 -//.word 0x2b0af8fe -//.word 0x27eb12b4 -//.word 0x385f0145 -//.word 0xaec6b5af -//.word 0x1fac9886 -//.word 0x5bf11f3b -//.word 0xa2269e9e -//.word 0x153960a2 -//.word 0x6b55f760 -//.word 0xe504d15f -//.word 0x84970c13 -//.word 0x79c78ba3 -//.word 0xdd9c4af0 -//.word 0xa28eeed2 -//.word 0xcaeba1a4 -//.word 0xd6781c04 -//.word 0x825b05d4 -//.word 0xaf387c84 -//.word 0xa19bf194 -//.word 0x6a963854 -//.word 0xa6abdfef -//.word 0x69ebbfa7 -//.word 0x7660d162 -//.word 0xb2a94366 -//.word 0xd8e4cb61 -//.word 0x6dd13cac -//.word 0xf73357d0 -//.word 0x6a7ae34a -//.word 0xe3a0008b -//.word 0x9851b843 -//.word 0x0f4ed7df -//.word 0x8f13fc50 -//.word 0xd5b8f10f -//.word 0x0715385e -//.word 0xee29e6d0 -//.word 0x5fbdb50b -//.word 0xfa4454cd -//.word 0x1806012d -//.word 0xfe7d5a24 -//.word 0x57ff704b -//.word 0xe19e1ee6 -//.word 0x664d9922 -//.word 0xee44479b -//.word 0x33a5d521 -//.word 0x555f84bc -//.word 0xcf52c3ed -//.word 0xaab50337 -//.word 0xf0b5c7de -//.word 0x645ffaef -//.word 0x70c08680 -//.word 0x5f4b2239 -//.word 0xcc7b6b14 -//.word 0x5ab93760 -//.word 0xa67f260c -//.word 0x7abe7a22 -//.word 0x447d2892 -//.word 0xc6c32e31 -//.word 0x0eb82801 -//.word 0xa9071eb3 -//.word 0x1486a16a -//.word 0x731916c2 -//.word 0x85d45111 -//.word 0xd85f66ed -//.word 0x399fbbee -//.word 0x6f9262b4 -//.word 0x297ba62c -//.word 0x3440e410 -//.word 0xf1109dad -//.word 0x0748c8e9 -//.word 0x55986d84 -//.word 0x2b626f9e -//.word 0xb962aa7a -//.word 0xc7943d81 -//.word 0xa752298a -//.word 0x68bd1c58 -//.word 0x4d5f8764 -//.word 0x7d0ff6dd -//.word 0xfc14a1ee -//.word 0xda8d3e3f -//.word 0xab101abe -//.word 0x3791689f -//.word 0x7285d9a1 -//.word 0xae486d94 -//.word 0x0fbc8818 -//.word 0x3f3448a7 -//.word 0x649016d6 -//.word 0x4fa97bd7 -//.word 0xf6ef3543 -//.word 0x25508b16 -//.word 0x705cddfc -//.word 0x6ca77fcb -//.word 0x1f6fc850 -//.word 0xb47f654e -//.word 0x7353f3c4 -//.word 0xf17dce6f -//.word 0x84482390 -//.word 0xfa9a4def -//.word 0x8b1f5e20 -//.word 0x0ba3fb05 -//.word 0x65c06e94 -//.word 0x44baf6da -//.word 0x13a76140 -//.word 0x28d3dd0e -//.word 0x3c620c2d -//.word 0x1f375631 -//.word 0xa9158397 -//.word 0xf404894a -//.word 0xc8f7a26c -//.word 0x57aba254 -//.word 0x2bd288d3 -//.word 0x5c7153bc -//.word 0x068717a3 -//.word 0xfaef4fe4 -//.word 0xb48775e8 -//.word 0x8e92d0a3 -//.word 0x335b8e61 -//.word 0x551c12c3 -//.word 0xa31d8f04 -//.word 0xf520d681 -//.word 0xcafd6c79 -//.word 0xf58ae011 -//.word 0x93bd5b9b -//.word 0x40157917 -//.word 0x8b3557fa -//.word 0xa7d3ee2f -//.word 0x63d09f5c -//.word 0x5ba80e66 -//.word 0x700d3437 -//.word 0x77cfb0bf -//.word 0x2eff5e38 -//.word 0x74542baf -//.word 0xb9cd28c0 -//.word 0xb398dda1 -//.word 0x5233df62 -//.word 0xf7d1a572 -//.word 0xe1ff9766 -//.word 0xe78768f6 -//.word 0x6d95a648 -//.word 0x91188f72 -//.word 0xa56b273a -//.word 0xe235871f -//.word 0x5a8e789e -//.word 0x2f6340ae -//.word 0x031bbc8d -//.word 0xaf7aafbe -//.word 0x38c65a53 -//.word 0xff294d68 -//.word 0x37577cf0 -//.word 0x9c7095b4 -//.word 0x62289198 -//.word 0x6c258a20 -//.word 0xbfa9cc34 -//.word 0x36702e20 -//.word 0x77dca3df -//.word 0x254f0c99 -//.word 0x58d8506a -//.word 0x4a13af65 -//.word 0x534a53d9 -//.word 0x17e028d2 -//.word 0xfef0eee3 -//.word 0xe4318d23 -//.word 0x121da876 -//.word 0x6d52740e -//.word 0xee38cb31 -//.word 0x52e47c3c -//.word 0x133ce6e8 -//.word 0x965cc5cc -//.word 0xa6394b23 -//.word 0x218473d0 -//.word 0xf1d2929f -//.word 0x3ef92ece -//.word 0xe2bd14cc -//.word 0x1eaca540 -//.word 0x8b46714d -//.word 0x53610714 -//.word 0xa0cc0a7b -//.word 0x5533882d -//.word 0xfd4288e3 -//.word 0x000de2e1 -//.word 0x1db054c3 -//.word 0x1432d179 -//.word 0xa3b01c91 -//.word 0xb4b796b4 -//.word 0xd5f15574 -//.word 0xe8047545 -//.word 0x1cb7b3c8 -//.word 0x1c573750 -//.word 0x8659b29f -//.word 0x9e40a9f0 -//.word 0x44c1113b -//.word 0x23251bb4 -//.word 0x2cf05194 -//.word 0x43c0e21d -//.word 0x37773ad8 -//.word 0xf89cd622 -//.word 0x04ff57e6 -//.word 0x239cd5ac -//.word 0x54c275d3 -//.word 0x07753e1a -//.word 0x8c102866 -//.word 0xcc2f76bf -//.word 0x37cb469b -//.word 0xfda7675f -//.word 0x81eb6a23 -//.word 0x0b0ffcb5 -//.word 0xbcfb73e1 -//.word 0xc86da6f0 -//.word 0xdf9a026f -//.word 0xec18da32 -//.word 0x02fbff98 -//.word 0x933f910f -//.word 0xe46614db -//.word 0xbd61c614 -//.word 0x65b430ee -//.word 0xced6fc80 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00008F38 -//// expected output -//.word 0x221ca8cb -//.word 0x81dae786 -//.word 0x12b8a7c2 -//.word 0xced624bc -//.word 0xf7dcba00 -//.word 0x5250e194 -//.word 0x818805ac -//.word 0xbc64a41f -//.word 0xfee44036 -//.word 0x72405ce5 -//.word 0xe7e81751 -//.word 0x736ef1e7 -//.word 0xaddcfad8 -//.word 0x2509ac4f -//.word 0x0f5ec610 -//.word 0x0eea39f8 -//// SHA512LongMsgvector_46 -//// vector length -//.word 0x00009250 -//// input message -//.word 0x1f55a263 -//.word 0xd748b985 -//.word 0x77929cdd -//.word 0xaa865c07 -//.word 0x2e37d444 -//.word 0xcd9739c2 -//.word 0x8fe0f21d -//.word 0x2e33a925 -//.word 0xca7fa2e2 -//.word 0xdea54bd5 -//.word 0x73da1581 -//.word 0x934c832a -//.word 0x010880dd -//.word 0x271bf6b0 -//.word 0x50f79c4b -//.word 0x171910a7 -//.word 0x1fe92516 -//.word 0x05e27e84 -//.word 0x93f25cfc -//.word 0x3724b46e -//.word 0xb37c85af -//.word 0x152268c1 -//.word 0xeac46955 -//.word 0xaf35158e -//.word 0x885ad408 -//.word 0x35467919 -//.word 0x41a41856 -//.word 0x7c551759 -//.word 0xac5b88c2 -//.word 0x80f6b67c -//.word 0xc50cfe42 -//.word 0xdccee161 -//.word 0x6c9957bf -//.word 0x541a651c -//.word 0xe4b6f198 -//.word 0x4c29d675 -//.word 0x546d341f -//.word 0x4edd0969 -//.word 0x499a061a -//.word 0x882e9ba8 -//.word 0x336f5543 -//.word 0x4ba66915 -//.word 0xe3f191c9 -//.word 0x8ee6164a -//.word 0x14792ecd -//.word 0x69208911 -//.word 0xdf3527e5 -//.word 0x9a9b6cec -//.word 0x44a4769d -//.word 0x0332ae8d -//.word 0xa81d9df1 -//.word 0x2ad5025e -//.word 0x524921d4 -//.word 0xb7075dfb -//.word 0xeda409ac -//.word 0xfa5e7cb3 -//.word 0x090063d4 -//.word 0x63065c0c -//.word 0x9a02c018 -//.word 0x073ebf3c -//.word 0x77a3b33d -//.word 0x22d9aeaf -//.word 0xddb05577 -//.word 0x90bff288 -//.word 0xe94bc4f0 -//.word 0x526a9a18 -//.word 0x2167a047 -//.word 0x0f697869 -//.word 0xec508c0f -//.word 0x91e0a3b6 -//.word 0x1521b34c -//.word 0x4405f6f0 -//.word 0x4c4c40fa -//.word 0xbaa5903b -//.word 0xa516e586 -//.word 0x299d536e -//.word 0x18185552 -//.word 0xeb626597 -//.word 0xffbfca35 -//.word 0xfe7ab275 -//.word 0x9acc80f9 -//.word 0x820067fc -//.word 0x8ed538db -//.word 0x3d2478d4 -//.word 0x62c2b60e -//.word 0x1aa81bda -//.word 0x01514339 -//.word 0xa6644b9e -//.word 0x3c932cf5 -//.word 0x92c347e3 -//.word 0x456d4150 -//.word 0x34441023 -//.word 0x3418564c -//.word 0x05faee08 -//.word 0x85a1c560 -//.word 0x240cecf3 -//.word 0x9869ebf6 -//.word 0xd2365779 -//.word 0x30a6a7ec -//.word 0xf44643e1 -//.word 0xf5e0de14 -//.word 0x949f06a8 -//.word 0xf275f9b3 -//.word 0x60babbfd -//.word 0x17166505 -//.word 0x2aa0c045 -//.word 0xb84712b7 -//.word 0x66723898 -//.word 0x0ce3f56c -//.word 0xafe18a42 -//.word 0xb0968739 -//.word 0x42b6e043 -//.word 0x21614329 -//.word 0x824ba9d0 -//.word 0x451a2cba -//.word 0x720f18cf -//.word 0xe3e9445e -//.word 0x3e06a35f -//.word 0x27cc16fb -//.word 0xb347844e -//.word 0x1f132d6b -//.word 0xc27d3ba0 -//.word 0x40e59afc -//.word 0x01670a0f -//.word 0xe1ba73f1 -//.word 0x29577886 -//.word 0xbfde4eff -//.word 0x99b6cfa4 -//.word 0x77f4cad1 -//.word 0xd27f9e3f -//.word 0x0f710785 -//.word 0xf9c037df -//.word 0x6e1d292d -//.word 0x581c323f -//.word 0xe096d94f -//.word 0xde4ce8cf -//.word 0x93ccc366 -//.word 0x9a99f935 -//.word 0x1c86195e -//.word 0x4463c7c7 -//.word 0xf2db0e1b -//.word 0xb49df812 -//.word 0xf2ba5cf3 -//.word 0x684ef857 -//.word 0xd963bf2f -//.word 0x02127408 -//.word 0xceeb788e -//.word 0xc898e14f -//.word 0xd5bccbc2 -//.word 0x2321f388 -//.word 0x5d1382f1 -//.word 0x210726c2 -//.word 0xb3816736 -//.word 0xf3343942 -//.word 0x8c6acd1d -//.word 0x6fa6ad00 -//.word 0x8088082b -//.word 0x8ef24a28 -//.word 0x8969f053 -//.word 0xefbe9b9a -//.word 0x88ed6382 -//.word 0x53456d6a -//.word 0xc0c9c014 -//.word 0x1fd75461 -//.word 0x59076c5c -//.word 0xde56267a -//.word 0xde845121 -//.word 0xbcba7e66 -//.word 0xc0705a1b -//.word 0x0c8e3b09 -//.word 0xd1d1f87a -//.word 0xc271fefb -//.word 0xc901a05f -//.word 0xf996af07 -//.word 0xc52b4b61 -//.word 0x6f44f8af -//.word 0xc3d2f50a -//.word 0x0457c9a6 -//.word 0x274a1e57 -//.word 0x3fbdd254 -//.word 0x393d4c3c -//.word 0xc9fa0c56 -//.word 0xa428861d -//.word 0xf0a431fc -//.word 0xf8dbdb56 -//.word 0x25e83fc9 -//.word 0x2afcd9b4 -//.word 0x7e03f9f6 -//.word 0x0f8417f9 -//.word 0x35c966f0 -//.word 0xe441ab5c -//.word 0x272250d5 -//.word 0xc952b407 -//.word 0x5588c6fb -//.word 0x42afd298 -//.word 0x678b9b69 -//.word 0xb59ea9a0 -//.word 0x244de45b -//.word 0xee3f6227 -//.word 0xfc067ec2 -//.word 0x9d012a26 -//.word 0x7e8086c2 -//.word 0xd72ab10b -//.word 0xe29cde33 -//.word 0x9153ab38 -//.word 0x80ccaf21 -//.word 0x29e95285 -//.word 0x5797e24c -//.word 0xddaee3b9 -//.word 0x8719a6a9 -//.word 0x51361d15 -//.word 0xd77fedde -//.word 0x0d6bc5ca -//.word 0x308feec9 -//.word 0xfc09247e -//.word 0x201ea5fa -//.word 0xef2287cb -//.word 0x58984e35 -//.word 0x189bbebf -//.word 0x2e7deef2 -//.word 0x8fad9e5d -//.word 0x1cdecadc -//.word 0xd165801a -//.word 0x3fe3ee55 -//.word 0x3c25bf61 -//.word 0xd948a8f0 -//.word 0x94213d10 -//.word 0xcfdc0af5 -//.word 0x81e2dff9 -//.word 0x2c016be1 -//.word 0x0fc70c62 -//.word 0x9c2ee6e4 -//.word 0x2c7f3385 -//.word 0xf270d961 -//.word 0x2d8f4211 -//.word 0xa2e46871 -//.word 0x4ad22fa6 -//.word 0x483ff860 -//.word 0x1df5735d -//.word 0x1f47b42f -//.word 0x28f78a3e -//.word 0x8b570c10 -//.word 0x4caf74c8 -//.word 0x90df31ed -//.word 0x5245376d -//.word 0x58e19ae2 -//.word 0x65b75b13 -//.word 0xb17582be -//.word 0x96566c95 -//.word 0x8c466786 -//.word 0x57477c3f -//.word 0x7f138cf2 -//.word 0x01039f55 -//.word 0x442f78ee -//.word 0x4ed76d8d -//.word 0x3802751a -//.word 0xdf648390 -//.word 0xdd85124a -//.word 0xb820017e -//.word 0x58c9a207 -//.word 0xbfd30e67 -//.word 0xf471bb0c -//.word 0x401b50d2 -//.word 0x9d34b7ca -//.word 0x6ce9743a -//.word 0x665c36e4 -//.word 0xd502ac8b -//.word 0x04499ab4 -//.word 0xf47f2caa -//.word 0x50ef8ac4 -//.word 0xa34dacea -//.word 0xc9547056 -//.word 0xa4adea98 -//.word 0x1013fbdd -//.word 0x18b52570 -//.word 0x6adb9d81 -//.word 0x08cda226 -//.word 0x41f10e9f -//.word 0xe0332bde -//.word 0xa3a9c747 -//.word 0xee778bb4 -//.word 0xc1f188bc -//.word 0xe8001335 -//.word 0x71c7d3f7 -//.word 0x638618e3 -//.word 0xadbe6e24 -//.word 0x5d9673b5 -//.word 0x127de523 -//.word 0xb411ff95 -//.word 0x623f0609 -//.word 0xacac1fe0 -//.word 0x0354639d -//.word 0x6d7235ea -//.word 0x7e9fd3dc -//.word 0x833d2c77 -//.word 0x0016f275 -//.word 0x5d41ef43 -//.word 0xdc469c4d -//.word 0xce81f07b -//.word 0x07cc76fb -//.word 0x8f58a242 -//.word 0x9adc654d -//.word 0xbaf2ff2d -//.word 0x54bd15c2 -//.word 0x51d003c7 -//.word 0x154b730e -//.word 0xb5472f0d -//.word 0x6475339a -//.word 0x2f0107f3 -//.word 0xebbd4b01 -//.word 0x6b7b93de -//.word 0xf6ba7694 -//.word 0xf786e228 -//.word 0xf799b2d7 -//.word 0xc9c6839f -//.word 0x0498c301 -//.word 0xb7360a06 -//.word 0x5789ae80 -//.word 0xfca19292 -//.word 0xcd553e72 -//.word 0xb92a356e -//.word 0x6977822d -//.word 0x72c69538 -//.word 0xce7c4db8 -//.word 0x8dbd5682 -//.word 0xc88ab550 -//.word 0xd72ca151 -//.word 0xc3d695e5 -//.word 0xfe86a3a1 -//.word 0x522c0b9a -//.word 0x180e0ce0 -//.word 0xaa6bfa48 -//.word 0x1b5e916f -//.word 0x250689fb -//.word 0x62e46a24 -//.word 0xbf84a274 -//.word 0x2f60d5ca -//.word 0x9c0174a5 -//.word 0x2367919f -//.word 0x80abf238 -//.word 0xc7e364d5 -//.word 0x56465109 -//.word 0x07919512 -//.word 0xaaa98ea7 -//.word 0xb28172f1 -//.word 0x2e3ee6d7 -//.word 0xfb99cc7e -//.word 0x38855c10 -//.word 0xfb1276bd -//.word 0x42923600 -//.word 0x2dfaca24 -//.word 0x6a8b8006 -//.word 0xf0b1231c -//.word 0xf02b88b6 -//.word 0x086c6484 -//.word 0xbb416059 -//.word 0x1eb5702e -//.word 0xd332606a -//.word 0x3be8b061 -//.word 0xe872a11a -//.word 0x51b79055 -//.word 0xca0f83cc -//.word 0xb3a802ba -//.word 0xef27289a -//.word 0x9892f931 -//.word 0xf06df6ce -//.word 0x9b23efd1 -//.word 0x0ca8196a -//.word 0x3e5d60a3 -//.word 0xa434fea1 -//.word 0x62144d26 -//.word 0xbd7fd95b -//.word 0xd072bacd -//.word 0x818c21b5 -//.word 0xb473307c -//.word 0xbf740f7e -//.word 0x1d693c0f -//.word 0x66e022bb -//.word 0x7e79eed2 -//.word 0x0d909e25 -//.word 0x301c5a0a -//.word 0x6fd708a6 -//.word 0xeea01b6b -//.word 0xe71dabdf -//.word 0x57a4cb9f -//.word 0xf85c17a4 -//.word 0x709f8cc6 -//.word 0xc8a39d7e -//.word 0x1f5a82f0 -//.word 0xa096d429 -//.word 0xb17157a5 -//.word 0x6dec1714 -//.word 0x55d6b65d -//.word 0x42f004e4 -//.word 0x9f4ed009 -//.word 0xd400fef1 -//.word 0x05f2da88 -//.word 0xfd11acc6 -//.word 0x65af8d32 -//.word 0x3a2978a5 -//.word 0x7ec7a451 -//.word 0x2de31101 -//.word 0x724e61a2 -//.word 0x1befea03 -//.word 0x4bad09d9 -//.word 0x6e90b906 -//.word 0x7222641b -//.word 0x351cf91b -//.word 0x393e3e82 -//.word 0x9f7f6885 -//.word 0x5366e99c -//.word 0x84b8893e -//.word 0x5753b8eb -//.word 0xdc5a2270 -//.word 0x41928567 -//.word 0x450cbffd -//.word 0xf0052cf8 -//.word 0x810a2ef8 -//.word 0xa9600dfc -//.word 0xf6a20229 -//.word 0x92ac8ec7 -//.word 0x2db8108d -//.word 0x38c7971e -//.word 0x5443f5d3 -//.word 0x0ae215bb -//.word 0xbccd8ee0 -//.word 0xdb0277cc -//.word 0x5bf67e4c -//.word 0x647f3474 -//.word 0x4bf2abe3 -//.word 0xc0884349 -//.word 0x4907c126 -//.word 0xef9ea1d4 -//.word 0x3610aec7 -//.word 0x5315cf14 -//.word 0x9afd2430 -//.word 0x369651fa -//.word 0x1c501afc -//.word 0x429f31ee -//.word 0x0ba14b7c -//.word 0x0601794a -//.word 0xd91bb634 -//.word 0x7860bcda -//.word 0x9bfc1d5c -//.word 0x6eb78e62 -//.word 0x8a198660 -//.word 0x24d20818 -//.word 0x8459bc60 -//.word 0xb9d24525 -//.word 0x8c35cfb0 -//.word 0xb2ade728 -//.word 0x463e9058 -//.word 0x76ab93b3 -//.word 0x7c971695 -//.word 0xd0ea70cc -//.word 0x9b763c57 -//.word 0x6fdbac6d -//.word 0x36a721c2 -//.word 0x69c2f805 -//.word 0x830aa6ad -//.word 0xb43a07f5 -//.word 0xd910f325 -//.word 0xacaf1314 -//.word 0x3842f2eb -//.word 0x91e2572b -//.word 0xc1bad3f2 -//.word 0x0568967a -//.word 0x3aa786e2 -//.word 0x922b9331 -//.word 0x8bcd4498 -//.word 0x22e896f7 -//.word 0x430307a3 -//.word 0x85b0ee67 -//.word 0x14b30dc8 -//.word 0xee67698d -//.word 0x535e5a7f -//.word 0x7648de6e -//.word 0x79163274 -//.word 0x985fa47e -//.word 0xa502a307 -//.word 0xb40d1827 -//.word 0x17ddf9cd -//.word 0x8d871a48 -//.word 0xb677470d -//.word 0xca5791b4 -//.word 0x8b33e543 -//.word 0x78dae3af -//.word 0x4487eca0 -//.word 0x86c07d75 -//.word 0xb27fbc88 -//.word 0x489051b3 -//.word 0x4b3a7713 -//.word 0xf521530b -//.word 0xa96b848c -//.word 0x2922fb94 -//.word 0x09d90df5 -//.word 0x6493c658 -//.word 0xcde08181 -//.word 0x8849b5d5 -//.word 0xfbee1219 -//.word 0x5f6ecd7c -//.word 0xbb0738d8 -//.word 0x13ff9535 -//.word 0xdc422c8f -//.word 0xb44c9bd9 -//.word 0x50496e41 -//.word 0xb67befb6 -//.word 0xacdd3fa7 -//.word 0x7006a60e -//.word 0xa94f28ae -//.word 0x9e385998 -//.word 0xa60872f4 -//.word 0xdfb4a3fe -//.word 0x2302ab4f -//.word 0x38eea75e -//.word 0x474d2746 -//.word 0x90b087ca -//.word 0x5b8b7d96 -//.word 0x3297eec7 -//.word 0x4d7406ae -//.word 0x4e9387d1 -//.word 0x2f536133 -//.word 0x786a84d6 -//.word 0xb587f27d -//.word 0x273618b6 -//.word 0xba035e18 -//.word 0x37e2fdca -//.word 0xbbce1045 -//.word 0x68b1ef5a -//.word 0x5a84b876 -//.word 0xdcb72e25 -//.word 0xdcd3c7d5 -//.word 0x9d5e00dd -//.word 0xacfff4bd -//.word 0x15e22da7 -//.word 0xd65eba3f -//.word 0x94d581a0 -//.word 0x8ddcd79f -//.word 0xce9c4e53 -//.word 0xa678ced5 -//.word 0x5af1e844 -//.word 0x1ac6660c -//.word 0x345f2768 -//.word 0x886b2a26 -//.word 0x3cc9e8ab -//.word 0xb1a4e736 -//.word 0xb5e38c69 -//.word 0xfac03105 -//.word 0xc6b677f5 -//.word 0xeda1dd8e -//.word 0xfd219215 -//.word 0xb83f8881 -//.word 0xc753ca83 -//.word 0xac250fc4 -//.word 0xf9528f6e -//.word 0xbff115ed -//.word 0x4a7756f7 -//.word 0x0bd881c9 -//.word 0xd6ef17b4 -//.word 0x4e20fdd9 -//.word 0x9d3cd031 -//.word 0x68a478d0 -//.word 0x01b2006a -//.word 0xdf54a416 -//.word 0x4cfa2c52 -//.word 0x5eb37947 -//.word 0x28925e4f -//.word 0x3157b1b5 -//.word 0x264ba1bc -//.word 0xcb6c49e2 -//.word 0x37ca8665 -//.word 0x41310607 -//.word 0x3608a20e -//.word 0xcd79ee90 -//.word 0x5cd30eed -//.word 0x4b2ccb9d -//.word 0xc94ae62c -//.word 0xbfc4ab82 -//.word 0x0264ca68 -//.word 0xcdd06348 -//.word 0x6e696034 -//.word 0x3f74072a -//.word 0xd878cf97 -//.word 0x83e67319 -//.word 0xf1ff4689 -//.word 0x2bf3c639 -//.word 0xca46737a -//.word 0x6b78e262 -//.word 0x5ee50dcc -//.word 0x9eeaed9f -//.word 0x06494b54 -//.word 0xc1cfd3b2 -//.word 0x03346adc -//.word 0xf642c18e -//.word 0xf8392aa4 -//.word 0x0373abdc -//.word 0x6c4451dc -//.word 0xd124c777 -//.word 0x4d10272c -//.word 0xed2d10ef -//.word 0x68aff92d -//.word 0x0af9c50a -//.word 0xf20597ed -//.word 0x7d07e73e -//.word 0x024dd66e -//.word 0xc06abe38 -//.word 0x14930e27 -//.word 0xf0495559 -//.word 0x88399c82 -//.word 0x4e60f933 -//.word 0x2172615d -//.word 0xc17dbe11 -//.word 0x87c94189 -//.word 0x5304fa6c -//.word 0xc59ba64e -//.word 0xb06bc876 -//.word 0xcb99fbe5 -//.word 0xaabe8694 -//.word 0xed4831fc -//.word 0xb81d57db -//.word 0x63813d36 -//.word 0x7239a29a -//.word 0xc7f097a8 -//.word 0x16db91d1 -//.word 0x9a99bd5d -//.word 0x065d93b2 -//.word 0xbf4eaed3 -//.word 0x482edb27 -//.word 0xfd3a707c -//.word 0x0552df4b -//.word 0x825a8a3d -//.word 0x0ae0d9ef -//.word 0x5bff8af2 -//.word 0x4a834917 -//.word 0xfd4d81e9 -//.word 0x5afa717a -//.word 0xbfbf8263 -//.word 0xf497d806 -//.word 0x5ea12716 -//.word 0x75c3c85a -//.word 0x78940cad -//.word 0x5f79d04a -//.word 0x110e5146 -//.word 0xd7c7425e -//.word 0x10d71cf3 -//.word 0x2750b653 -//.word 0xc38c153a -//.word 0x3dcd8599 -//.word 0x5720e895 -//.word 0x2b874fd3 -//.word 0x6156c7f3 -//.word 0xa5de765a -//.word 0x5849e635 -//.word 0x86c5a0ba -//.word 0x19e5fdb1 -//.word 0x4c433934 -//.word 0x626bc9b3 -//.word 0x97f4ee3b -//.word 0x57f08bf7 -//.word 0xae8734f7 -//.word 0x00de8730 -//.word 0xfa3ebfc4 -//.word 0xc8728684 -//.word 0x88700bb3 -//.word 0xff3c550d -//.word 0x8b0ad708 -//.word 0x59a3445a -//.word 0xd809a4bb -//.word 0x6e5ea8ec -//.word 0x69023af8 -//.word 0x38fc59ba -//.word 0xdb9b249f -//.word 0x985c34ae -//.word 0xf00f2fc5 -//.word 0xd1369a25 -//.word 0x0daeef30 -//.word 0x0b91f072 -//.word 0xbd5a3adf -//.word 0xd14a1d5b -//.word 0x2c0bab80 -//.word 0x94940f9b -//.word 0xac4c21f7 -//.word 0x2672375f -//.word 0x34bc3dde -//.word 0x3f3e08c9 -//.word 0xdc8ee7ff -//.word 0xfc267b70 -//.word 0x6209c9dc -//.word 0x5baa8edd -//.word 0xa909d228 -//.word 0xc01fc010 -//.word 0x357cb54c -//.word 0x732f97f9 -//.word 0xb0e668e3 -//.word 0x1f561b00 -//.word 0x67dda63d -//.word 0x5566587d -//.word 0xcd8e6ddf -//.word 0x0705e040 -//.word 0xf8368002 -//.word 0x0d2a460b -//.word 0x1fa9e610 -//.word 0xa4a3a413 -//.word 0x22cf692a -//.word 0xea921683 -//.word 0x022218a5 -//.word 0x63eb3df8 -//.word 0x6432c588 -//.word 0x77f8bd06 -//.word 0x13218810 -//.word 0xf1d5bfb1 -//.word 0x7b273b2c -//.word 0x82f46ff5 -//.word 0x2f0efb01 -//.word 0x3c9a7f3f -//.word 0x63b7ad67 -//.word 0x1761a3f2 -//.word 0x73947769 -//.word 0x70b413e3 -//.word 0x5a2c43ca -//.word 0x85560cdd -//.word 0x3c9b407b -//.word 0xfadb4f1e -//.word 0xdd0e6026 -//.word 0x572ca0d8 -//.word 0x274bdaa6 -//.word 0x870749b0 -//.word 0xa727aa8c -//.word 0x5b7e9442 -//.word 0x100e0c9b -//.word 0x0574559c -//.word 0xb880054d -//.word 0x9e235ebf -//.word 0x168eda4c -//.word 0xa0980821 -//.word 0x4a6097fa -//.word 0x6c34b02d -//.word 0x95b28aea -//.word 0xc52d38c1 -//.word 0xdd53c564 -//.word 0x530c82af -//.word 0x2aa59fe5 -//.word 0x222df93d -//.word 0x2c1f339d -//.word 0x204208a5 -//.word 0xb2cedfef -//.word 0xa3d0a095 -//.word 0x34cfc7f4 -//.word 0xe0b0b7b0 -//.word 0x4ad750f9 -//.word 0x758fc30c -//.word 0x33aca5fc -//.word 0xe06f43b2 -//.word 0x4fa93632 -//.word 0x05233721 -//.word 0xa53e3484 -//.word 0xacd7a3cb -//.word 0x5e6d160e -//.word 0x01860f96 -//.word 0x484e169f -//.word 0x12820a5c -//.word 0x558cb53c -//.word 0x54f0a26c -//.word 0x19e6339d -//.word 0x1f48ee07 -//.word 0x4faf18ae -//.word 0x2dda85e4 -//.word 0x544fae0f -//.word 0x204404ac -//.word 0xaabf8494 -//.word 0xf9fd8c7e -//.word 0x7611edc6 -//.word 0xa1cd416d -//.word 0x03e57f60 -//.word 0x6352ccfd -//.word 0x3df594d3 -//.word 0x707ddaa9 -//.word 0x378accc2 -//.word 0x5a129b60 -//.word 0xa6058987 -//.word 0x9a2c4403 -//.word 0x635772ad -//.word 0x0bb78de9 -//.word 0xed89f173 -//.word 0x6cf4335c -//.word 0xe435b54f -//.word 0xe1f97719 -//.word 0x8f0a3068 -//.word 0x722e9ed3 -//.word 0x574d1a1b -//.word 0x8bd16fb1 -//.word 0x4a52ec78 -//.word 0x7a73b8cb -//.word 0x9a0766c2 -//.word 0xf579c9b1 -//.word 0x1b6a0af2 -//.word 0x919bf7e5 -//.word 0xc80e9e34 -//.word 0x4c681b5c -//.word 0x3e9aae69 -//.word 0x04c01100 -//.word 0x3f4908a3 -//.word 0xfd593931 -//.word 0x316b3eac -//.word 0x603bf93f -//.word 0x9ce32780 -//.word 0xb64438f2 -//.word 0xb0a75fce -//.word 0x71a4e503 -//.word 0xbc44c27b -//.word 0x63626ea0 -//.word 0xb857f51f -//.word 0x45d64aeb -//.word 0xbd14dd86 -//.word 0x322c6f7c -//.word 0x87c32530 -//.word 0x29e7dcda -//.word 0xfa3dbdd1 -//.word 0x8e5c1106 -//.word 0x9a7456d1 -//.word 0xa93392f1 -//.word 0x11e9e7ce -//.word 0x26ea6800 -//.word 0xad342b15 -//.word 0x94519f8f -//.word 0xe07f202d -//.word 0xe60fc96c -//.word 0xbe0b8a4c -//.word 0xf51b7a57 -//.word 0x82a96ee0 -//.word 0xfb44ca89 -//.word 0x09429708 -//.word 0x1aaad62a -//.word 0x55511417 -//.word 0xd3423fd9 -//.word 0x0c63b818 -//.word 0x8f56a927 -//.word 0xf79e9945 -//.word 0x1a033e1c -//.word 0x8337928e -//.word 0x23b929b1 -//.word 0x43fac118 -//.word 0xbdbf1b55 -//.word 0x6cc609bb -//.word 0xe1acc969 -//.word 0x570e9184 -//.word 0xe9ef6bc3 -//.word 0x03594331 -//.word 0x17473e2e -//.word 0x91c34eb7 -//.word 0x0c4c04e8 -//.word 0xc67aa5bf -//.word 0x51e57f23 -//.word 0x8c427d25 -//.word 0xd2cffa85 -//.word 0x71f2d378 -//.word 0x5e1cc0a8 -//.word 0x27f4e47d -//.word 0x28b2a29b -//.word 0x02c8b3ac -//.word 0x49c8755f -//.word 0x7d8286b0 -//.word 0x3c6c926b -//.word 0xb54869eb -//.word 0x60005528 -//.word 0xedd5aaf1 -//.word 0x7ab89e75 -//.word 0x08f85b08 -//.word 0x301e5324 -//.word 0x1216d4ae -//.word 0x8f8fdc7b -//.word 0xb8a32e13 -//.word 0x85bba5b5 -//.word 0xcbadc99b -//.word 0x6828a07e -//.word 0xc052c75d -//.word 0x6eafc07b -//.word 0x33458ea7 -//.word 0x32fe7fbf -//.word 0x604d4a77 -//.word 0x36145957 -//.word 0xa9c66803 -//.word 0x5bc94fbf -//.word 0x131e1c32 -//.word 0x6b43656a -//.word 0xc858dd21 -//.word 0x8f82243f -//.word 0x968de4a0 -//.word 0xd9d51916 -//.word 0x6f66b0b2 -//.word 0xbc62543f -//.word 0xe7a38510 -//.word 0x8ea2eafc -//.word 0xb997e8a6 -//.word 0x0de27302 -//.word 0x43aa2414 -//.word 0xd8c48cfb -//.word 0x05d6c92f -//.word 0xf1bc5607 -//.word 0x262a287e -//.word 0x4193f636 -//.word 0xee4ad8bd -//.word 0x14e81310 -//.word 0x4ded335d -//.word 0x99aa5b0d -//.word 0x535eda02 -//.word 0x649ffe1d -//.word 0xb6fb2d04 -//.word 0xece03122 -//.word 0x50b9d4ef -//.word 0x0c5aad71 -//.word 0x9e9e3903 -//.word 0x864e2e55 -//.word 0x41450bb4 -//.word 0x7bd2f48b -//.word 0x815ebd2a -//.word 0xf54f45c7 -//.word 0xc52c05c2 -//.word 0x5d01e82e -//.word 0x1c055d8c -//.word 0x057aabd9 -//.word 0xb8d586cc -//.word 0xa01fdf59 -//.word 0x6d9b0079 -//.word 0xc5a9d72d -//.word 0x36ea92c0 -//.word 0x70a56d4d -//.word 0xb169c882 -//.word 0x80f47da3 -//.word 0x9e5470d2 -//.word 0x3a4c688d -//.word 0x64f91d78 -//.word 0xc4b5925d -//.word 0x8c3ca471 -//.word 0xab0ee3d9 -//.word 0x4414a26c -//.word 0x5e854abb -//.word 0xdd0bf44e -//.word 0xb1223631 -//.word 0x4dc13cb0 -//.word 0x5a3d1b5e -//.word 0xad6a635c -//.word 0x7703f3d7 -//.word 0xbc4c12d3 -//.word 0x07f5bb27 -//.word 0x5b4237c9 -//.word 0x6c69f24c -//.word 0x0f3c87a7 -//.word 0xf0071d38 -//.word 0x83bcf609 -//.word 0x3d4d4551 -//.word 0x035a403e -//.word 0xe30c77f1 -//.word 0x024164cb -//.word 0xd5e943e7 -//.word 0x94af24e7 -//.word 0xecdd3ef4 -//.word 0xf5798600 -//.word 0x63b4804e -//.word 0x00865535 -//.word 0x5a922721 -//.word 0xb84fa1da -//.word 0x5369d209 -//.word 0xc3653bf8 -//.word 0xb8852699 -//.word 0xeaeb3aca -//.word 0x53004dd7 -//.word 0x9b177940 -//.word 0xd44e72bd -//.word 0x67b51680 -//.word 0x4eb346ba -//.word 0x84a5f560 -//.word 0xbac77e2f -//.word 0x4c583bee -//.word 0x73f953f3 -//.word 0xbc57d3e8 -//.word 0xb90901cf -//.word 0xf6bced44 -//.word 0x2e8d4802 -//.word 0xbfb679a9 -//.word 0x5c6deebf -//.word 0x0209b0f4 -//.word 0x2d673baa -//.word 0x4b8c8cb4 -//.word 0x718b7b5e -//.word 0x4da94bae -//.word 0x5cc080ea -//.word 0x5ce1f05a -//.word 0x053d1d4f -//.word 0xf446c265 -//.word 0xe811ac04 -//.word 0x30ffcb2d -//.word 0x649c8973 -//.word 0x54c75a47 -//.word 0x3e149579 -//.word 0x446e82fc -//.word 0x1c01b4ea -//.word 0x0a5799c7 -//.word 0x0bc04f0a -//.word 0x53f8b9d9 -//.word 0xfa04d315 -//.word 0xf35d4296 -//.word 0x3d5030b8 -//.word 0x5da55616 -//.word 0x0b7f5a95 -//.word 0x2c835ca5 -//.word 0x003cccc3 -//.word 0x9dbe7e42 -//.word 0x9c8a004c -//.word 0x12b22b24 -//.word 0xc23ef8ad -//.word 0x90cd9530 -//.word 0x3980b85a -//.word 0x42133484 -//.word 0x2e4dca38 -//.word 0xf49b41f0 -//.word 0xb0f8b820 -//.word 0x990f3c77 -//.word 0x33a49662 -//.word 0xc63066d3 -//.word 0x0ecb7640 -//.word 0x344f48ee -//.word 0xfdbbf16f -//.word 0x42d52a6a -//.word 0xa014a59a -//.word 0x70bc9d19 -//.word 0xf94bb1df -//.word 0xe514f285 -//.word 0xf22a3b4f -//.word 0xea7fc16a -//.word 0xd54dea72 -//.word 0x6db56338 -//.word 0xd2a76dc1 -//.word 0x7f017792 -//.word 0x7dfbf22a -//.word 0xd6c261d1 -//.word 0x4d63af90 -//.word 0x4cebc681 -//.word 0x1ecc5d49 -//.word 0x5e8311e2 -//.word 0xb078b89e -//.word 0xaf26f268 -//.word 0x267b004d -//.word 0x8282da3c -//.word 0x873f7b0a -//.word 0x43db80b9 -//.word 0x4001f1fa -//.word 0xfe875ff0 -//.word 0xa0512f37 -//.word 0xe6723525 -//.word 0x5b958550 -//.word 0xd09c8550 -//.word 0x088647c6 -//.word 0xb596169d -//.word 0xa3b14f8f -//.word 0x340973eb -//.word 0x0cf87996 -//.word 0x0d2e6950 -//.word 0x860f2639 -//.word 0xa7578b94 -//.word 0x3900baca -//.word 0x8c65b1b2 -//.word 0xb0a71f0f -//.word 0xe750755b -//.word 0x5b363fc3 -//.word 0x0da3b572 -//.word 0x0eb28d12 -//.word 0xf1fc1490 -//.word 0x80747d20 -//.word 0xae907982 -//.word 0xcdaa0883 -//.word 0x01a58ec6 -//.word 0xf5d329c4 -//.word 0xcc164212 -//.word 0x5b4662e3 -//.word 0x95d347cd -//.word 0x46ac38d0 -//.word 0x055f9594 -//.word 0x6381b2f2 -//.word 0x6950e5b6 -//.word 0x4297dea3 -//.word 0x34d237b8 -//.word 0xd5934cb2 -//.word 0x7b244dd2 -//.word 0xf46e92e0 -//.word 0x77192e70 -//.word 0xdbf5c664 -//.word 0x0799a4b2 -//.word 0xaa4a0768 -//.word 0x2c1ebded -//.word 0xe460f489 -//.word 0x8b374e27 -//.word 0xf083335a -//.word 0xee086b9f -//.word 0x9bceece2 -//.word 0xc3c7f043 -//.word 0x95b34b19 -//.word 0x9b41fc37 -//.word 0xf077026f -//.word 0xad537155 -//.word 0xa4b3c445 -//.word 0x517275a8 -//.word 0x0dd4cb72 -//.word 0x8524f4ef -//.word 0x6b9b53c0 -//.word 0x6b841b21 -//.word 0x619e1d6d -//.word 0xc9c2dee3 -//.word 0x76c5edaa -//.word 0x88a07313 -//.word 0x98ce0c1f -//.word 0x35f6d541 -//.word 0x94cac764 -//.word 0x832f4330 -//.word 0x9f9eed89 -//.word 0xc7cabe59 -//.word 0xd0835590 -//.word 0x7ada8e69 -//.word 0xa38656ee -//.word 0xbb86bebe -//.word 0x78084e0e -//.word 0xcb8a9bee -//.word 0x123f1bcd -//.word 0x8fb43940 -//.word 0x19b3a5ff -//.word 0x1168ee30 -//.word 0x98c252e9 -//.word 0xff1cd5f0 -//.word 0x7f1d90c5 -//.word 0x2bdc4ce2 -//.word 0x22484f41 -//.word 0x09c8761f -//.word 0xb91e8400 -//.word 0x3491baf3 -//.word 0xde4ba817 -//.word 0xea00425e -//.word 0x12d03691 -//.word 0x8b6f7d94 -//.word 0x388330ec -//.word 0x1e4d9e7e -//.word 0x188c9b99 -//.word 0xcb9e1b37 -//.word 0xdde9ff80 -//.word 0x62792e90 -//.word 0x97eae87a -//.word 0xd389578d -//.word 0xbab667d6 -//.word 0xb48dd8e5 -//.word 0x9ec592d4 -//.word 0xbfd73886 -//.word 0xfd63ff2d -//.word 0x50d0c10f -//.word 0x78344d89 -//.word 0xeb730254 -//.word 0x12aa9c07 -//.word 0xb4ce4ddd -//.word 0xb39010b9 -//.word 0xf6843a67 -//.word 0xa6835125 -//.word 0x9d4e2262 -//.word 0x1b730ec5 -//.word 0xbb75a571 -//.word 0xa6277688 -//.word 0x075924ed -//.word 0xbfb6bd4f -//.word 0x59ed4863 -//.word 0x400f9d70 -//.word 0x2f387a11 -//.word 0xea72d237 -//.word 0x2cd6686d -//.word 0xe0f58000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00009250 -//// expected output -//.word 0x9ecb4411 -//.word 0x4c5cec8a -//.word 0xf0b3a104 -//.word 0x98d7cc4e -//.word 0x0e60fcc3 -//.word 0xb5bed7d5 -//.word 0xf7df23ca -//.word 0x7269ea00 -//.word 0x2235f970 -//.word 0x62a6ddf3 -//.word 0xd8a42e37 -//.word 0xe48122a8 -//.word 0xf869007d -//.word 0xa8855da0 -//.word 0xbc62468b -//.word 0x53b8fddf -//// SHA512LongMsgvector_47 -//// vector length -//.word 0x00009568 -//// input message -//.word 0x5f07a4bf -//.word 0x880f45f5 -//.word 0xe251d19d -//.word 0x4652878a -//.word 0x89a18edc -//.word 0xa467372c -//.word 0x12408309 -//.word 0x7a49e5a8 -//.word 0x8e7b48d7 -//.word 0x33375433 -//.word 0xe221ed9b -//.word 0x4e32fde4 -//.word 0x470974ce -//.word 0xde828d37 -//.word 0xca8a528f -//.word 0x0a32628c -//.word 0xcc02f21f -//.word 0x8e8f12a6 -//.word 0x834f3163 -//.word 0x38ade42d -//.word 0x7759e365 -//.word 0x6ce2542c -//.word 0x06864dd3 -//.word 0xa0499493 -//.word 0xe144a97f -//.word 0xe04006b6 -//.word 0x8c83a5dd -//.word 0x4ceac3cd -//.word 0xe238e488 -//.word 0x95ae1772 -//.word 0x8fdc7bbe -//.word 0x84b60226 -//.word 0x94ea75df -//.word 0x7371b8cc -//.word 0xc76450f2 -//.word 0xd112222c -//.word 0x504f7d1f -//.word 0xa20f5b71 -//.word 0x2d33e436 -//.word 0xfda234ab -//.word 0xae9c5e27 -//.word 0x8d4bb14e -//.word 0xfa9b3a88 -//.word 0x114c89b2 -//.word 0x8946b813 -//.word 0xdb2caa91 -//.word 0xa7339124 -//.word 0x5435b38c -//.word 0xf8016d3f -//.word 0x77f678a6 -//.word 0xeed06b88 -//.word 0x52c181c7 -//.word 0x54c49d4a -//.word 0x882e8b3a -//.word 0xc7858971 -//.word 0xd296062f -//.word 0x37c2a90f -//.word 0x7999953a -//.word 0x6baaecdb -//.word 0xdd9891d3 -//.word 0x7a7133ad -//.word 0xf13c87d4 -//.word 0x53d1d403 -//.word 0xbceeb5fe -//.word 0x36861b80 -//.word 0xda5c9174 -//.word 0x39d1c467 -//.word 0xfafa423e -//.word 0xc4f68224 -//.word 0x5e7f25c7 -//.word 0x14be7bc4 -//.word 0x5d64495f -//.word 0xbcf6c978 -//.word 0xe468f3bb -//.word 0x1feefb16 -//.word 0xf00f1b70 -//.word 0xf7fb9298 -//.word 0x161eed7b -//.word 0xd2f5859b -//.word 0xfc2149bc -//.word 0x90babde0 -//.word 0xdde54376 -//.word 0xe6a99acf -//.word 0x09fea4d1 -//.word 0xde276cef -//.word 0x62426759 -//.word 0x551efa6f -//.word 0xe04c3d7c -//.word 0x7b79ffa1 -//.word 0x0efb0a0f -//.word 0x56a9a779 -//.word 0x8bf065ca -//.word 0x40231713 -//.word 0x8a131cc7 -//.word 0x64e0e32a -//.word 0x520ead07 -//.word 0x45db95a1 -//.word 0xbfd0ceed -//.word 0x37972dfe -//.word 0xbf0ce7c1 -//.word 0xe4969bea -//.word 0xd6b8932e -//.word 0xc9e347b3 -//.word 0x9a8f22c5 -//.word 0xb68a89ca -//.word 0x388f1a78 -//.word 0x511a3145 -//.word 0xed7bb11f -//.word 0x9329015e -//.word 0x8d5a54f7 -//.word 0x4ad02ef2 -//.word 0x00f6241e -//.word 0x952be303 -//.word 0xc05e7318 -//.word 0x6cdbbd36 -//.word 0x5d644b4d -//.word 0x15845056 -//.word 0xf920e888 -//.word 0xb04fa0cf -//.word 0xcc6c397a -//.word 0xac69a933 -//.word 0xa0656335 -//.word 0x4f81d8b9 -//.word 0x56f03eb1 -//.word 0x324e90b9 -//.word 0x6033d64b -//.word 0xc207a632 -//.word 0x4518eb41 -//.word 0xc1e9e544 -//.word 0x21ce7137 -//.word 0xc3b58bb6 -//.word 0x224711b5 -//.word 0xb230c971 -//.word 0x0bbaa6a6 -//.word 0x4aa14703 -//.word 0xb423c1db -//.word 0x9d569e1d -//.word 0x89be2686 -//.word 0x901fdd15 -//.word 0x07904cc0 -//.word 0x5cd10465 -//.word 0x42dee103 -//.word 0x0ec48c2a -//.word 0x61b443b0 -//.word 0x0856dda6 -//.word 0x205f088a -//.word 0x7e66d6be -//.word 0x4ef47839 -//.word 0xf9da497d -//.word 0x4dc70ec9 -//.word 0xd8197b8f -//.word 0x94f4fa28 -//.word 0xca91a9c7 -//.word 0x30d9a1ac -//.word 0x54337e9a -//.word 0x3e9a1c8a -//.word 0x51f29ea1 -//.word 0x739cb560 -//.word 0x6e481f1b -//.word 0x950a6dac -//.word 0xaab10a68 -//.word 0xff547952 -//.word 0xdc2dde8f -//.word 0x21aac01a -//.word 0x2cc20db9 -//.word 0xfd865e30 -//.word 0x98f87db4 -//.word 0xab1f25a2 -//.word 0x715b0871 -//.word 0xd6f716e6 -//.word 0xdcfdfd86 -//.word 0x3d4eec51 -//.word 0x52f19dad -//.word 0x33ac92a1 -//.word 0x20d19f43 -//.word 0x205ba874 -//.word 0xe739acca -//.word 0xfdea02ce -//.word 0x1d4ae368 -//.word 0xdcac2997 -//.word 0x8b285665 -//.word 0x5d37d81b -//.word 0xcd7d8cb1 -//.word 0x3ae58088 -//.word 0xd4f3fd5c -//.word 0xbc56c574 -//.word 0x67bd991b -//.word 0x44ecfe54 -//.word 0x9e0f41ca -//.word 0xc34eb906 -//.word 0x66a14ce4 -//.word 0x42e63448 -//.word 0x0031030d -//.word 0x5b63e53e -//.word 0x82fe2689 -//.word 0xbd37f4f0 -//.word 0x544d65c2 -//.word 0xad1abcca -//.word 0xb4e8e8c6 -//.word 0x7f854d1b -//.word 0x339ac7c6 -//.word 0x2138ec96 -//.word 0x35b49298 -//.word 0x91b592d3 -//.word 0x758bcb36 -//.word 0x62c269cf -//.word 0x7ff7673e -//.word 0x3beb5268 -//.word 0x34d65070 -//.word 0x58fe62e3 -//.word 0x4987e632 -//.word 0x068d6066 -//.word 0xc970790f -//.word 0x2b6f487d -//.word 0x8e79d133 -//.word 0xbc3fcb99 -//.word 0xcc8ea7f1 -//.word 0x46dccd8c -//.word 0x8721293e -//.word 0x66e8e60f -//.word 0x17a57933 -//.word 0x5049e23d -//.word 0xab142e8f -//.word 0x4caa4115 -//.word 0xc36ad233 -//.word 0x33fbb7fb -//.word 0xb42763a4 -//.word 0xf7edad37 -//.word 0x29d1d38c -//.word 0x1977be75 -//.word 0x9c708739 -//.word 0x31543b44 -//.word 0xe111db1c -//.word 0x6982a797 -//.word 0x9b449c4c -//.word 0x02c53c47 -//.word 0xc59d8d01 -//.word 0xcd22648f -//.word 0x2a36e319 -//.word 0xb364418e -//.word 0xed2cc996 -//.word 0x2f9a26c8 -//.word 0x031edd1e -//.word 0xce971ba5 -//.word 0xb4b1b179 -//.word 0xb6715df1 -//.word 0x1d0e4b17 -//.word 0x1c03db5b -//.word 0xb162a588 -//.word 0xcc6bbbf6 -//.word 0xb35d2d02 -//.word 0xa58cd3bb -//.word 0xbdb446de -//.word 0x1a8d3005 -//.word 0x3d9fc61b -//.word 0xb2589213 -//.word 0xf35c76d9 -//.word 0x891cee89 -//.word 0x74aa95e0 -//.word 0xcdccebf0 -//.word 0xaa4f5517 -//.word 0x429d6531 -//.word 0x52925c0d -//.word 0xbf8ced1e -//.word 0x7cc14473 -//.word 0xaed647e9 -//.word 0x0ead1ca0 -//.word 0x8f7eebab -//.word 0x4229e50c -//.word 0x76ca85df -//.word 0x238e15d5 -//.word 0x89c675e4 -//.word 0x143a183d -//.word 0x83c04f7f -//.word 0x490dca2a -//.word 0x33ca5b56 -//.word 0x4cebfea5 -//.word 0xfe3c1776 -//.word 0x793cfa5b -//.word 0x592fb0ce -//.word 0x826ff91f -//.word 0x4f038db1 -//.word 0xed72a766 -//.word 0x01d9c458 -//.word 0x913ca8ca -//.word 0x211aa35e -//.word 0x1c441288 -//.word 0x76ef2842 -//.word 0x9007ef01 -//.word 0x5cc689e8 -//.word 0xc186bc3c -//.word 0x41d3ae19 -//.word 0xd9c5ec63 -//.word 0x288cb1fe -//.word 0xd44d6642 -//.word 0x2a2d65a9 -//.word 0x04ab02cb -//.word 0xf032cc8d -//.word 0x8eee1095 -//.word 0x3ae09f01 -//.word 0xeb2dd158 -//.word 0x5bbccac0 -//.word 0x69fffc72 -//.word 0xbb11ed6c -//.word 0xa7023b65 -//.word 0x546fdd06 -//.word 0x1c55ab57 -//.word 0x35262178 -//.word 0x911d6091 -//.word 0x02cf750b -//.word 0xa204de01 -//.word 0x72c44af1 -//.word 0x41b5a1b8 -//.word 0xd0a444bd -//.word 0x3361966c -//.word 0x7ad0bbe6 -//.word 0x913da0f6 -//.word 0x65f03b48 -//.word 0x480114d5 -//.word 0x976e04a2 -//.word 0x9a6b3caa -//.word 0xabf98a18 -//.word 0x9bbad8ba -//.word 0x5104f6b3 -//.word 0xb4349970 -//.word 0xcc45a3dd -//.word 0x23a1a4d8 -//.word 0x7236a1e6 -//.word 0x79cd1524 -//.word 0x2f973681 -//.word 0x1b09792b -//.word 0x02ea5847 -//.word 0xc2ab53e5 -//.word 0x7ef63533 -//.word 0xfb8998f0 -//.word 0x4a45ab24 -//.word 0xa882330f -//.word 0xa2a6d05f -//.word 0x7df682a6 -//.word 0xd4ac6b0a -//.word 0x8349d73f -//.word 0xc42c79b2 -//.word 0x9864f707 -//.word 0x69c3aac6 -//.word 0xed339f51 -//.word 0x4d4de11a -//.word 0x8728fa12 -//.word 0x116fb765 -//.word 0xbfb72c64 -//.word 0xe60ff8c2 -//.word 0xc2d8ca04 -//.word 0x15d72433 -//.word 0x11885fd4 -//.word 0x78b5f01a -//.word 0x0248e959 -//.word 0xff5ec3be -//.word 0x3d9c5a3e -//.word 0x2cc639cc -//.word 0x408d18cf -//.word 0x97a9a3d3 -//.word 0xdc287d7e -//.word 0x6b0685c6 -//.word 0xb5fd5862 -//.word 0xe69e177e -//.word 0xc6a16ab3 -//.word 0xdd7ac436 -//.word 0xdb2de950 -//.word 0x3762ae0e -//.word 0x15bc0039 -//.word 0x6d672888 -//.word 0x6af04d15 -//.word 0x105a3b0e -//.word 0x226e63ad -//.word 0x4352226a -//.word 0x5b5d466f -//.word 0x3c2ace4c -//.word 0x86ebf1ec -//.word 0xc70062c7 -//.word 0xe7c9d35a -//.word 0xc4b8b8d4 -//.word 0x19aa4d13 -//.word 0xa477dace -//.word 0x88c73514 -//.word 0xf02889f5 -//.word 0xf55e577f -//.word 0xc2fabaec -//.word 0xf52fef19 -//.word 0x49e0143a -//.word 0x72fd30cd -//.word 0x491074cc -//.word 0x2913c127 -//.word 0x99856a71 -//.word 0x2bbd3ad9 -//.word 0xa47db95d -//.word 0x5ccaab3a -//.word 0xe8fbdaa7 -//.word 0xf71115c2 -//.word 0x7a4679cb -//.word 0x08e9ef90 -//.word 0x8068f628 -//.word 0xf0afa3e4 -//.word 0xb5b0e583 -//.word 0xe4430ea5 -//.word 0xe9318f83 -//.word 0x6e8b03dc -//.word 0x7f417033 -//.word 0xebefc937 -//.word 0xedfab783 -//.word 0x0bdc9887 -//.word 0x3fbcc9c6 -//.word 0x55422043 -//.word 0x94a9bd35 -//.word 0xa0160302 -//.word 0x9f28e16b -//.word 0x9bd05604 -//.word 0x276334e8 -//.word 0x46ed24aa -//.word 0x88c9ea8f -//.word 0x766eeafa -//.word 0x308ceb27 -//.word 0x55581c1c -//.word 0x232354dd -//.word 0xe0329ee0 -//.word 0x78caf5c0 -//.word 0x678a4c35 -//.word 0xd9fed244 -//.word 0x107073b3 -//.word 0x0701a2c0 -//.word 0x55f95613 -//.word 0x535c52f0 -//.word 0x81beaab1 -//.word 0x26578374 -//.word 0x375a1a11 -//.word 0x7a83084f -//.word 0xebefc457 -//.word 0x5f316968 -//.word 0x67a2b9cd -//.word 0x77f8620c -//.word 0x481b8161 -//.word 0x7a34656a -//.word 0x7e069524 -//.word 0xb3811416 -//.word 0xcf94e3cc -//.word 0x8144c887 -//.word 0x55fb4e33 -//.word 0xd7220d99 -//.word 0xfbf12bd6 -//.word 0xbc86230c -//.word 0x0435c557 -//.word 0xcc207f03 -//.word 0x8407dafc -//.word 0xb5614785 -//.word 0xe5ab1c2d -//.word 0xbb00daff -//.word 0x63eab1fa -//.word 0x347846c1 -//.word 0x9090b393 -//.word 0x0c87cf7c -//.word 0xd1efb1cd -//.word 0x43b06fcb -//.word 0xe05b2ba4 -//.word 0x6aba51a7 -//.word 0x48ac1ab3 -//.word 0x2a2f55f0 -//.word 0xecbf66be -//.word 0xbddf8feb -//.word 0x80f56e29 -//.word 0x725ac7bf -//.word 0x0db2847e -//.word 0x2d79faf7 -//.word 0x72df6eeb -//.word 0xe5d6d803 -//.word 0xde69e6c1 -//.word 0x254f44b7 -//.word 0x57c01bf7 -//.word 0x8b87d8ca -//.word 0x36592ea5 -//.word 0x4c655e58 -//.word 0xa82cb689 -//.word 0xae935761 -//.word 0x2f363c85 -//.word 0x8c007848 -//.word 0x1ff9bf1f -//.word 0xd65e2855 -//.word 0x21f731ff -//.word 0x0fa50433 -//.word 0xb43bf975 -//.word 0xcd8e5b72 -//.word 0xa7d06ff1 -//.word 0x3c19b206 -//.word 0x9f476388 -//.word 0x9b0841c6 -//.word 0x97359676 -//.word 0xbd6274ee -//.word 0x5cb33f97 -//.word 0x8af16b9e -//.word 0x0ddc87ec -//.word 0x7cc37b59 -//.word 0xa1530e1c -//.word 0x22adab86 -//.word 0x60bb64f1 -//.word 0xa0c337f3 -//.word 0x693c90d7 -//.word 0x2ce1104d -//.word 0x2b058d60 -//.word 0x93265aa9 -//.word 0xebc4c8c2 -//.word 0xb273ecfe -//.word 0x4430a357 -//.word 0xfef1d4a8 -//.word 0xa280f51d -//.word 0xfd88d1e7 -//.word 0xc7f08834 -//.word 0xca69d75e -//.word 0x47439962 -//.word 0x95858e95 -//.word 0x0b3c5c92 -//.word 0x2013d377 -//.word 0xd1247551 -//.word 0x430e36d4 -//.word 0xaa488050 -//.word 0x69b57ae0 -//.word 0x7b788ae5 -//.word 0x110919b2 -//.word 0x7c889689 -//.word 0x4e52bdc7 -//.word 0xbcd3195b -//.word 0x479bc77c -//.word 0x9cb37e9c -//.word 0xb831cc97 -//.word 0x4f0aa231 -//.word 0x6f2813bf -//.word 0x61bc5924 -//.word 0xd0d619ff -//.word 0x2c33e823 -//.word 0x51550d48 -//.word 0x64d98800 -//.word 0xfe0654ec -//.word 0x8da2ea2f -//.word 0xf7090623 -//.word 0x8080ad4b -//.word 0xedc66f89 -//.word 0xe9ecea91 -//.word 0xa9678f9e -//.word 0xcc64a964 -//.word 0x855b9a45 -//.word 0xfbe768c7 -//.word 0xf0d57946 -//.word 0xa17a9be6 -//.word 0xee4a48cc -//.word 0xbba7278e -//.word 0x96f7d5e7 -//.word 0x9af9e6b0 -//.word 0x9359270b -//.word 0x638226e2 -//.word 0xa4b3f590 -//.word 0x8e552add -//.word 0x1b8c2a30 -//.word 0x6a0ca800 -//.word 0x612e688c -//.word 0x974249cc -//.word 0x712782a7 -//.word 0x8b1a2c66 -//.word 0x59cc0169 -//.word 0x0eb76318 -//.word 0xbcb1a01d -//.word 0xbdc274d1 -//.word 0x5333cff3 -//.word 0x8be7d9a0 -//.word 0x67ef337f -//.word 0x3b58803d -//.word 0x58472539 -//.word 0xe8494c80 -//.word 0x19e42ffb -//.word 0x7e7293e7 -//.word 0xb22f9286 -//.word 0x3e909e14 -//.word 0xbcd6c3fd -//.word 0x3de42c4d -//.word 0xe94de968 -//.word 0xe5b2f0fb -//.word 0x7a4b6132 -//.word 0x73c30e2c -//.word 0xc6493aac -//.word 0x77e4a111 -//.word 0xba06b988 -//.word 0x58653880 -//.word 0x5306d65e -//.word 0xcd9a5472 -//.word 0x260ebd2a -//.word 0x655eec86 -//.word 0xd9aa4ecc -//.word 0x008be97d -//.word 0xa7a79d87 -//.word 0x5383aabc -//.word 0xe0997383 -//.word 0x68ab82ce -//.word 0x6656cb4c -//.word 0x1bea35df -//.word 0x31795650 -//.word 0x9f2e7e42 -//.word 0xcce0f864 -//.word 0xf7e78ceb -//.word 0xd62f4840 -//.word 0x7d8b81f5 -//.word 0x824b14fe -//.word 0x5f10f11e -//.word 0x17dfdb9f -//.word 0x1d756946 -//.word 0x71da5186 -//.word 0x0c39e5f4 -//.word 0x7eefdefb -//.word 0xd6e259d1 -//.word 0xc2141fa9 -//.word 0xf778292b -//.word 0xd3046421 -//.word 0x4107b173 -//.word 0xdebd3055 -//.word 0x5a20bebf -//.word 0x2002bc1d -//.word 0x39591349 -//.word 0x6dda74b6 -//.word 0xacc9e5ee -//.word 0xad0f793e -//.word 0xd58d5eaf -//.word 0x5ab01d39 -//.word 0xa8451e34 -//.word 0x048f6b0f -//.word 0x6f97b544 -//.word 0xcdc49c8b -//.word 0x46ab2b4f -//.word 0xed28a25e -//.word 0x9fae79e4 -//.word 0x2edba19a -//.word 0xbf500d3b -//.word 0x71bf7138 -//.word 0x40454aac -//.word 0x28fb1e92 -//.word 0x8dc80536 -//.word 0xda7968e9 -//.word 0x691309f9 -//.word 0xa36743e0 -//.word 0x68e894bc -//.word 0xb1ba58ff -//.word 0x730bd768 -//.word 0xc7a68232 -//.word 0x49c57a8b -//.word 0xbd275247 -//.word 0xf96316d6 -//.word 0xff7c8c73 -//.word 0x69b5b99f -//.word 0x0aa7a7ce -//.word 0xd2906660 -//.word 0xf2ee51d2 -//.word 0x414d9236 -//.word 0xde5de9e0 -//.word 0x1747a963 -//.word 0x8a4103bc -//.word 0x8a6186cc -//.word 0xc5aee70c -//.word 0x237dfe7c -//.word 0xf1fb12dc -//.word 0x3e06561f -//.word 0x8541b31d -//.word 0x8d67c888 -//.word 0x8edf3021 -//.word 0x9591032b -//.word 0x29f99f20 -//.word 0x2f79a8a4 -//.word 0x0bf44db7 -//.word 0x0898cd2e -//.word 0xfafb3a64 -//.word 0x226a7e2d -//.word 0x517e9b0b -//.word 0x50ef37a5 -//.word 0x80ad5774 -//.word 0xbe2d6bc0 -//.word 0x89018bcb -//.word 0x67ac004c -//.word 0x84b4061e -//.word 0x9df9d03a -//.word 0x1c44cde3 -//.word 0x85232a20 -//.word 0x10f5986f -//.word 0x98414fb8 -//.word 0xb34c5280 -//.word 0x23eaf55f -//.word 0x6d949db4 -//.word 0xc7bbc897 -//.word 0x375c4d0f -//.word 0xfad5e485 -//.word 0x23f7e879 -//.word 0x845c5c74 -//.word 0xd1fa2d3e -//.word 0x03f9b650 -//.word 0xfbc2898c -//.word 0x68596d2c -//.word 0xeaeca3f9 -//.word 0x78ac6ebd -//.word 0xffdbd2fa -//.word 0x4b269bdc -//.word 0x2b36a16d -//.word 0xd0824b08 -//.word 0x77675210 -//.word 0x487ac7e1 -//.word 0x7d1d5807 -//.word 0xc650cfaf -//.word 0xeccadb5a -//.word 0xb54913d9 -//.word 0x09263875 -//.word 0x522cba6e -//.word 0x29aa7ea7 -//.word 0x2ec7df9f -//.word 0x3716f3a3 -//.word 0xae6a0f42 -//.word 0x34ec8d02 -//.word 0x8a6acc51 -//.word 0xb2f279be -//.word 0x51a00d69 -//.word 0x58b497b8 -//.word 0xe3e7bc4c -//.word 0x6200fc34 -//.word 0xf6a23760 -//.word 0x1e686f58 -//.word 0x9234cf2e -//.word 0x6fc3ecb0 -//.word 0x95854ce3 -//.word 0x4dac25ad -//.word 0x308366d2 -//.word 0x4402fb22 -//.word 0x679f4df0 -//.word 0xf16609c5 -//.word 0x954c2356 -//.word 0x88c11ab4 -//.word 0xe5847dc3 -//.word 0x51bbaeed -//.word 0xdb43e617 -//.word 0x254579d4 -//.word 0xc90a5cd9 -//.word 0xf610e4b2 -//.word 0x5a5dd0b3 -//.word 0x45138a30 -//.word 0x0b45aaf1 -//.word 0xaa09bce0 -//.word 0xacce4305 -//.word 0x4ff0feb4 -//.word 0xe48a6905 -//.word 0x758c8785 -//.word 0xaa0ddf2b -//.word 0xede2c48e -//.word 0xcd6fda54 -//.word 0xa0bdd6ee -//.word 0x6dcd8583 -//.word 0x092c1029 -//.word 0x7fc87e5b -//.word 0xb5027aa8 -//.word 0x4d0457a8 -//.word 0xca555134 -//.word 0xf4aa16d6 -//.word 0x7d00857f -//.word 0xe4e7b578 -//.word 0x9a21399b -//.word 0x646ba2c3 -//.word 0x009b4681 -//.word 0x0beb4011 -//.word 0x2295b88c -//.word 0x48a0655e -//.word 0x87f94ffb -//.word 0xdac5dace -//.word 0x4bf60072 -//.word 0x591cde25 -//.word 0x9c7e727a -//.word 0xac6aa34e -//.word 0x3ec981fc -//.word 0x90f6cfd5 -//.word 0x08d1bfca -//.word 0x180ffc6c -//.word 0x64d4ed17 -//.word 0x27833969 -//.word 0xd2d586f9 -//.word 0xf7288746 -//.word 0x661a35ee -//.word 0x96575c21 -//.word 0x46af5a54 -//.word 0x636c233a -//.word 0x2de289f0 -//.word 0x9647bb78 -//.word 0xeac50b68 -//.word 0xb5cef4e3 -//.word 0xe2b05bc9 -//.word 0x2069152b -//.word 0x8abcaa02 -//.word 0x86845820 -//.word 0xed495b66 -//.word 0x6d116c38 -//.word 0x2c78882e -//.word 0xae03f20c -//.word 0xf9b27bf5 -//.word 0xf7d401db -//.word 0x1b1f363a -//.word 0x4700a206 -//.word 0xee30ece2 -//.word 0x76885592 -//.word 0xe01685b3 -//.word 0xaa708aa9 -//.word 0xf4481eda -//.word 0xe341281a -//.word 0x43018665 -//.word 0x70880ad4 -//.word 0x76c0c2ca -//.word 0x77557d6e -//.word 0x4dc68a5f -//.word 0x71bdc3a3 -//.word 0x1b9ccbe0 -//.word 0xab5893ce -//.word 0x488a23ec -//.word 0xc7c39772 -//.word 0xce206787 -//.word 0x391fecb5 -//.word 0xbcb1209a -//.word 0xca91a6e0 -//.word 0xb6d30a6f -//.word 0x19c049e0 -//.word 0x73e19435 -//.word 0x155a51c8 -//.word 0x3e7a6382 -//.word 0x848fab4d -//.word 0x75ffcecc -//.word 0x7f943949 -//.word 0x0d1863ef -//.word 0xf3225239 -//.word 0x0c2f61aa -//.word 0x21f440bf -//.word 0x0df33c22 -//.word 0x1f4dc120 -//.word 0xc0d71d5d -//.word 0x566f86c6 -//.word 0x68915fc8 -//.word 0x0225b7bf -//.word 0x5b9b13b2 -//.word 0xb53a6d3d -//.word 0x85b57cce -//.word 0xd4003615 -//.word 0xe56194b5 -//.word 0x18ca9540 -//.word 0x0e668562 -//.word 0x0e727f5c -//.word 0xa74e31b4 -//.word 0x97d4df2b -//.word 0xece8aaf0 -//.word 0x69501313 -//.word 0x2bc7bb3c -//.word 0x8d4c6c9d -//.word 0x48c05d25 -//.word 0xdfb0b2f7 -//.word 0x3a70431a -//.word 0x90699e72 -//.word 0x8bb34fef -//.word 0xa7e75f04 -//.word 0xdc2e1a5b -//.word 0x7c9e15c7 -//.word 0x5ec7707a -//.word 0x3c885978 -//.word 0x5a28d14b -//.word 0x68a1b3f8 -//.word 0xaa3ff233 -//.word 0x566a22cf -//.word 0x3ec03a78 -//.word 0xae6898a4 -//.word 0x98a245c7 -//.word 0xeea27bc6 -//.word 0x509e64af -//.word 0xe72625a7 -//.word 0x91b41b24 -//.word 0x3e84645c -//.word 0x9aa5a2fd -//.word 0xec51fb1e -//.word 0x3d7a6575 -//.word 0xbea520cb -//.word 0x64fb83ae -//.word 0xd59dfc66 -//.word 0x8739532a -//.word 0x26db2e93 -//.word 0x3705da50 -//.word 0xfc01481c -//.word 0x977656ed -//.word 0x713a506e -//.word 0xdd67b7b0 -//.word 0xf9b1411c -//.word 0xd5f620ad -//.word 0xd817875c -//.word 0x5f076bdb -//.word 0xa6218785 -//.word 0xecbfa296 -//.word 0xd2081497 -//.word 0x0509871d -//.word 0x1c08fbb3 -//.word 0xc4140d15 -//.word 0x1ae1789f -//.word 0x58d3dc04 -//.word 0xb459be43 -//.word 0x857cd0d7 -//.word 0xa8b8732e -//.word 0x220a7b5d -//.word 0x064a3212 -//.word 0x9abb9fca -//.word 0xb5e10844 -//.word 0x6b92b535 -//.word 0xec50f73d -//.word 0xaad6691a -//.word 0xbaf1761c -//.word 0x7d911bd8 -//.word 0x7f20ee21 -//.word 0x9f126034 -//.word 0x71be3f33 -//.word 0xe06c7fd5 -//.word 0x18af395b -//.word 0xa3f5f4c6 -//.word 0xd15c2447 -//.word 0x5ec7f0f7 -//.word 0x4f3238c8 -//.word 0x1d42d7bb -//.word 0x15202554 -//.word 0xff88c04c -//.word 0xfe1d8d85 -//.word 0xb700f943 -//.word 0xb5a08598 -//.word 0x0cd48120 -//.word 0x3d2717ef -//.word 0x5a728cc8 -//.word 0x6bb1c38f -//.word 0x0f0f0301 -//.word 0x6743f9a3 -//.word 0x2f1f01f8 -//.word 0x2e66a1f7 -//.word 0xd1df56bc -//.word 0x13a7947e -//.word 0x9fcb08c1 -//.word 0x391620cd -//.word 0x5a28cd5e -//.word 0x1ac8889d -//.word 0x537c934f -//.word 0x0456814d -//.word 0xf310f834 -//.word 0x975cb65d -//.word 0x3475d210 -//.word 0x48fa44f4 -//.word 0x26fca8ca -//.word 0xe1563f5b -//.word 0x6b3c37af -//.word 0xfe172c80 -//.word 0xbb90eeee -//.word 0x92eb8575 -//.word 0x6197721b -//.word 0x600338ee -//.word 0xbcb31bad -//.word 0x829228c6 -//.word 0xbf8a7580 -//.word 0xe652aa7a -//.word 0x7187c054 -//.word 0xcbff09ac -//.word 0x6e5a714c -//.word 0x48d903a1 -//.word 0x6474af70 -//.word 0xc6264ac4 -//.word 0x978cd62b -//.word 0x82ae0421 -//.word 0x5d1df7cd -//.word 0x0c3e4beb -//.word 0xa2e5560a -//.word 0xca25adf7 -//.word 0x6667ea79 -//.word 0x75baad3e -//.word 0x3a6ae116 -//.word 0x9bd4415f -//.word 0xc7781ac0 -//.word 0x1b50521b -//.word 0x4761a9bc -//.word 0xac8f3fd7 -//.word 0x09b55731 -//.word 0x57f55a1d -//.word 0xf14d1faa -//.word 0xf86b691b -//.word 0xf6c3b197 -//.word 0xc1de2622 -//.word 0xa3f5f3cc -//.word 0xb7bec028 -//.word 0x96867b00 -//.word 0x33805847 -//.word 0x045d164f -//.word 0x631c853d -//.word 0x332445b9 -//.word 0xc690d0ea -//.word 0xfecabaa1 -//.word 0xb35b38d4 -//.word 0x5501e04f -//.word 0xd302afa6 -//.word 0xbbc1506e -//.word 0xa28f9bac -//.word 0xc6c35d8e -//.word 0xf20d5759 -//.word 0xa20789a3 -//.word 0x680db0c2 -//.word 0x8e4f0d84 -//.word 0xfd246821 -//.word 0x5da2556d -//.word 0x7e6bb652 -//.word 0xf7c9817e -//.word 0x0dfec359 -//.word 0xd6d5e53a -//.word 0x9e7d2eda -//.word 0x89978a09 -//.word 0x7a8e8a9f -//.word 0x3427abb6 -//.word 0xbf59db16 -//.word 0x0e5e39f1 -//.word 0xde0a1dd1 -//.word 0xe15c58ce -//.word 0x1c53bd04 -//.word 0x8d02e044 -//.word 0x12e71d0a -//.word 0x8679dcaf -//.word 0x2d0014e0 -//.word 0x52a90e4f -//.word 0x2eda6ca8 -//.word 0x0cc369c7 -//.word 0xab366228 -//.word 0xe4b8969f -//.word 0x8cd82a49 -//.word 0x9cbf70c2 -//.word 0x8f096898 -//.word 0x0cd38700 -//.word 0xc515b8c8 -//.word 0x9f33a18d -//.word 0x13ce272e -//.word 0xd4e03480 -//.word 0xb208b744 -//.word 0xbe22ed56 -//.word 0xaf1be027 -//.word 0x84032d6c -//.word 0x6b640918 -//.word 0xe2d38688 -//.word 0x1cc413fe -//.word 0xa6a34251 -//.word 0x4a20cfe3 -//.word 0x34caddd2 -//.word 0x53df8273 -//.word 0x026286fc -//.word 0xe86f6880 -//.word 0x1ccca221 -//.word 0x8dc02e81 -//.word 0xa2284979 -//.word 0x1dc7770e -//.word 0x45dec7a0 -//.word 0x44fc5865 -//.word 0xce181c16 -//.word 0x03dddce8 -//.word 0x97457dbe -//.word 0x3069819d -//.word 0x0f98d160 -//.word 0xf3a6b9ad -//.word 0x3a863427 -//.word 0x4a1b6ae5 -//.word 0x2f4c7724 -//.word 0x85576e38 -//.word 0x99679dc9 -//.word 0xcb68133b -//.word 0x371a606e -//.word 0x94649ca8 -//.word 0x5becabcf -//.word 0x2ce4bedc -//.word 0x6f271d8c -//.word 0x37842558 -//.word 0x6b598ca8 -//.word 0x2764ed44 -//.word 0x60d7800b -//.word 0xc7aa28e7 -//.word 0xf035b400 -//.word 0xb4fe5e30 -//.word 0xd4d098b8 -//.word 0xde0d0931 -//.word 0x5544d2c5 -//.word 0x0c06159e -//.word 0xd3f6b89f -//.word 0x55206652 -//.word 0x418cd722 -//.word 0xa81252cb -//.word 0xa76f700e -//.word 0x459922a9 -//.word 0x9e50f586 -//.word 0x42f69533 -//.word 0xd8a09092 -//.word 0x076d5dd2 -//.word 0x96179d9d -//.word 0xd1c7a093 -//.word 0x2f2e2bf8 -//.word 0x33d179a9 -//.word 0x90a47f55 -//.word 0x90db75e9 -//.word 0xb6fd914c -//.word 0xa33a164d -//.word 0x36fe8dda -//.word 0xf7c65272 -//.word 0xb63353dc -//.word 0x6f5c151a -//.word 0x7169f899 -//.word 0xbf5ebbaa -//.word 0xb7344236 -//.word 0xf12e97ac -//.word 0x6a6a303f -//.word 0xe2b7704f -//.word 0x82a66f24 -//.word 0xc2e4fee2 -//.word 0x8ac6e6b9 -//.word 0x9726715d -//.word 0x216e2cb6 -//.word 0xbbf2ead8 -//.word 0x7a830c35 -//.word 0x59400011 -//.word 0xdcb00837 -//.word 0xf40e3deb -//.word 0x23e4d31f -//.word 0xe0dc9eea -//.word 0x3dd2d535 -//.word 0xc72d17b8 -//.word 0xae70ab25 -//.word 0x260c0ca2 -//.word 0x0c79a57d -//.word 0xcd84d91b -//.word 0x84eb4632 -//.word 0x62274b38 -//.word 0x5389c71c -//.word 0xde882433 -//.word 0x4d5a9575 -//.word 0x0fc19be9 -//.word 0x5a28ce5e -//.word 0x15eeda5c -//.word 0xf402c85a -//.word 0xe5b07f31 -//.word 0xabba8ad1 -//.word 0xc8ab1b33 -//.word 0xa168508f -//.word 0xdd08b6ce -//.word 0x0ee50c42 -//.word 0x93f34995 -//.word 0xbd51e0ff -//.word 0x301e42bc -//.word 0x8c8ea4be -//.word 0x4d3d039f -//.word 0xf0c366d9 -//.word 0x58886439 -//.word 0x6fdae591 -//.word 0x103c2dae -//.word 0x25011689 -//.word 0x0c1a9cc1 -//.word 0x402d9f49 -//.word 0x35e7e55e -//.word 0x83925fbd -//.word 0x47eaad12 -//.word 0xc62ce3b3 -//.word 0x54718e8e -//.word 0x753af261 -//.word 0x414c9629 -//.word 0x0dbe03dc -//.word 0x4750c85a -//.word 0xa2fec1a1 -//.word 0x73d59941 -//.word 0x5b068e11 -//.word 0x2739741f -//.word 0xf423fded -//.word 0x975b37da -//.word 0x3c6956de -//.word 0x4c20b47a -//.word 0x952f16ef -//.word 0xa5f231af -//.word 0x768e6d11 -//.word 0x513ce848 -//.word 0xece5be96 -//.word 0xd6f088bd -//.word 0x145822b7 -//.word 0x0d01b2a6 -//.word 0xa34ce50e -//.word 0xa3e97c42 -//.word 0x5fec081c -//.word 0x9923f1f1 -//.word 0xa3a7bdc4 -//.word 0xc5b28fba -//.word 0xdfb0eece -//.word 0x4f99c8c6 -//.word 0x157db766 -//.word 0x356182e3 -//.word 0x5d49e79b -//.word 0xc8969802 -//.word 0x629283e0 -//.word 0x2d4a56ba -//.word 0xe3800000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00009568 -//// expected output -//.word 0xbda8abf3 -//.word 0xe35a759b -//.word 0x9444370c -//.word 0xa91c0b84 -//.word 0x5a93de37 -//.word 0xd4bf5b81 -//.word 0x4bad94c6 -//.word 0x733fae35 -//.word 0x6a3d90c7 -//.word 0x79a4cc9d -//.word 0xecd5722a -//.word 0x07373b8e -//.word 0xdbc42159 -//.word 0x562a5eb7 -//.word 0x64962b95 -//.word 0x41ce784c -//// SHA512LongMsgvector_48 -//// vector length -//.word 0x00009880 -//// input message -//.word 0x9c8b9ac5 -//.word 0x6e6653fe -//.word 0xd43fe530 -//.word 0xcee77044 -//.word 0xab3ceab0 -//.word 0x21f0cb53 -//.word 0x9d8c0aa0 -//.word 0xd8b449ff -//.word 0xabac4d70 -//.word 0x241bb072 -//.word 0xd90fda23 -//.word 0x7c422da8 -//.word 0xb09c80cf -//.word 0x1bf8cff3 -//.word 0xbd2b3021 -//.word 0x80420978 -//.word 0x100c81d6 -//.word 0xecd934b1 -//.word 0xbe802b42 -//.word 0xe8a70be9 -//.word 0x5f3e8ccd -//.word 0xbc4d2dc3 -//.word 0x90f02771 -//.word 0xf89f9fb3 -//.word 0x72b31f3d -//.word 0xef264782 -//.word 0x2a9bc0d5 -//.word 0x379e72ce -//.word 0x5f2cf7f0 -//.word 0x2b764f88 -//.word 0xbfe2d5d8 -//.word 0x69537175 -//.word 0x7aaa10ee -//.word 0x558d51ae -//.word 0xc5678124 -//.word 0x94afca21 -//.word 0x596ea781 -//.word 0x91fb9b0d -//.word 0xf10923a0 -//.word 0xfbe4e989 -//.word 0xd0f83a31 -//.word 0x4593bafe -//.word 0x38ec5776 -//.word 0x25637ba8 -//.word 0xf40a86c7 -//.word 0x15657b19 -//.word 0xcf6ef90f -//.word 0xd5dc6eb6 -//.word 0x1ba5874e -//.word 0xe7c2eb37 -//.word 0x2b322815 -//.word 0x1241ed2c -//.word 0xd90a7b0c -//.word 0xe03b5673 -//.word 0x0118406f -//.word 0x20c367c3 -//.word 0x03bade8c -//.word 0x64a14a24 -//.word 0x4542de47 -//.word 0x84d28974 -//.word 0xaf756d96 -//.word 0x190594e4 -//.word 0x2e0fde06 -//.word 0x031f3e79 -//.word 0x323e2634 -//.word 0xe4b8408c -//.word 0x2f235f55 -//.word 0xa39cb54a -//.word 0x1f5446af -//.word 0xe94c9c34 -//.word 0xfe5cbd1d -//.word 0xa77a5aa0 -//.word 0x4d39498e -//.word 0x8e903636 -//.word 0x91dd9587 -//.word 0x9629da74 -//.word 0xd1aeed9d -//.word 0x7896d82b -//.word 0x1b06c3fb -//.word 0x345b2300 -//.word 0xffb42ee2 -//.word 0x8bb092eb -//.word 0x11796624 -//.word 0x860161bb -//.word 0x6c8b4aa8 -//.word 0xed6eaf90 -//.word 0x2a15daea -//.word 0xd14b0160 -//.word 0xedb5bd78 -//.word 0x03a0bd73 -//.word 0x5afebc76 -//.word 0x9aaab0e7 -//.word 0x99f4451a -//.word 0x7159892d -//.word 0xd692e930 -//.word 0xa6d15c89 -//.word 0xc247de97 -//.word 0x1de92096 -//.word 0x12747ec3 -//.word 0xfbae31c0 -//.word 0xffefc639 -//.word 0x2be1cec8 -//.word 0xc484d816 -//.word 0xdc759c44 -//.word 0x246f7989 -//.word 0x0112221c -//.word 0xe2e39454 -//.word 0xd0954b0d -//.word 0x4787b54f -//.word 0x448de72a -//.word 0x9ff38fe4 -//.word 0x9bbf2957 -//.word 0xbc377694 -//.word 0xd8a32acc -//.word 0x7154e571 -//.word 0x42e56598 -//.word 0x18c1faa2 -//.word 0xe3e53a1b -//.word 0x0de8f5e2 -//.word 0x0a386c8a -//.word 0x31a6bd01 -//.word 0xca25a26f -//.word 0x68ce5b61 -//.word 0x7928e927 -//.word 0x1ba77d7a -//.word 0x31723063 -//.word 0xb669f458 -//.word 0x5267cba7 -//.word 0x2bc43718 -//.word 0xfe1ff1cd -//.word 0x6e5add6e -//.word 0x9ce53e83 -//.word 0xf7402721 -//.word 0x56bb32c9 -//.word 0x4481738d -//.word 0x9ad4af74 -//.word 0x549aca20 -//.word 0x9d197fae -//.word 0x2cff54de -//.word 0xd3a5cc74 -//.word 0x5594dede -//.word 0x7949a616 -//.word 0x5c355bca -//.word 0x0b0881bb -//.word 0x512f5f63 -//.word 0xce9bb4da -//.word 0x49c5a6fa -//.word 0x48effbc2 -//.word 0xddac8bf8 -//.word 0xc2a2f512 -//.word 0xa88f9257 -//.word 0xcd8aa742 -//.word 0xcd8cdf27 -//.word 0xba2ef818 -//.word 0x6eb4bc0a -//.word 0x204b3334 -//.word 0x368f17b8 -//.word 0x5a508885 -//.word 0xd096017c -//.word 0x07e28bd2 -//.word 0x6eb730b5 -//.word 0x8859b332 -//.word 0x43d57e56 -//.word 0x8641dc93 -//.word 0x09456866 -//.word 0x69dbc637 -//.word 0x7c529081 -//.word 0xe2999332 -//.word 0xdcba3c55 -//.word 0x61a54dee -//.word 0x6f2fd425 -//.word 0xa05a5ea7 -//.word 0xfdd7684a -//.word 0x16c916f0 -//.word 0x53cc28ad -//.word 0x8536292c -//.word 0xc09de94e -//.word 0x6d992e15 -//.word 0x9bcaa7c1 -//.word 0x961d2138 -//.word 0xbb4cfdab -//.word 0x8aa4e277 -//.word 0xfd0baf49 -//.word 0x1841b486 -//.word 0xc26621ea -//.word 0xd3bdbe6f -//.word 0x6eafdd70 -//.word 0x91138e0e -//.word 0xeaac11d3 -//.word 0xedf39195 -//.word 0x23170f9d -//.word 0xc5439c09 -//.word 0x891fcb6f -//.word 0xbc9966c3 -//.word 0x91e5607b -//.word 0xb9c20bf0 -//.word 0x33008b08 -//.word 0x663f8b12 -//.word 0x6df92ef1 -//.word 0xb2c3487d -//.word 0xbecfcf26 -//.word 0x4fb68cdb -//.word 0xab74162a -//.word 0x35b401a8 -//.word 0x3e4f5393 -//.word 0x1d0f37b6 -//.word 0x82b8f68d -//.word 0x074922aa -//.word 0x087f1557 -//.word 0xb59b9a7d -//.word 0x6565e9c4 -//.word 0x2e71d9fc -//.word 0xb2a151bc -//.word 0x3bebff48 -//.word 0x0b5c4db8 -//.word 0xed5d9157 -//.word 0x1036844a -//.word 0x15d0f672 -//.word 0x67bfc093 -//.word 0xcb7ff9b5 -//.word 0x38fe6dca -//.word 0xe85b4a92 -//.word 0xafee1dbc -//.word 0x8c88fd4e -//.word 0x7efc0646 -//.word 0x98de0a81 -//.word 0x588a82dd -//.word 0x3568cb9b -//.word 0x776f8f07 -//.word 0x4be8815a -//.word 0x17754ddf -//.word 0x0b51ce55 -//.word 0xf9d98295 -//.word 0x664c3c74 -//.word 0xe1cf19eb -//.word 0x93b4b575 -//.word 0x18fb9fb9 -//.word 0x8d190a69 -//.word 0xeaf9c56a -//.word 0x92416d35 -//.word 0x29d6e17d -//.word 0xa6a2f612 -//.word 0xa9956c05 -//.word 0x0ee9210d -//.word 0xc2ab8529 -//.word 0xd5774e87 -//.word 0xd1836da5 -//.word 0x4bde40b6 -//.word 0xb7fa0947 -//.word 0x81699f22 -//.word 0x59e46372 -//.word 0xce917629 -//.word 0x1e86299f -//.word 0x4c89b57b -//.word 0x74192dd7 -//.word 0x5cb3b09f -//.word 0x4b4ee33a -//.word 0x1e289e6d -//.word 0x98c4e67c -//.word 0xfa331c92 -//.word 0xd3947362 -//.word 0x1ad7a80f -//.word 0x7ac6ed49 -//.word 0xed4526ba -//.word 0x8cd857a0 -//.word 0xa6675dbb -//.word 0x0f3edd69 -//.word 0xba587b10 -//.word 0x8add4cbc -//.word 0x66e98d09 -//.word 0x8c8f9544 -//.word 0x271e08cd -//.word 0x23a24ebf -//.word 0x40ae43d3 -//.word 0x65593082 -//.word 0x3887fb6a -//.word 0xeb6a9af3 -//.word 0x5848cd32 -//.word 0x517e0d0e -//.word 0x31c5bfa1 -//.word 0xb7b4aee1 -//.word 0x1586b87f -//.word 0x431ec80f -//.word 0x9948046a -//.word 0x9d424750 -//.word 0x1a7bd152 -//.word 0x729a3def -//.word 0x34c2b4fe -//.word 0xf114614c -//.word 0x4c762485 -//.word 0x51938b58 -//.word 0x0823fed6 -//.word 0x496d391b -//.word 0xd10a0031 -//.word 0x96eb0d31 -//.word 0x589e4eab -//.word 0x79cc4d48 -//.word 0x0e07f0ae -//.word 0x36c262a4 -//.word 0xaba15177 -//.word 0x96f45a9c -//.word 0xa87ec196 -//.word 0x667a661b -//.word 0xc4e0f472 -//.word 0xf6e45c1f -//.word 0x83bf82c2 -//.word 0x9bb3353d -//.word 0xaa496515 -//.word 0x2dde901b -//.word 0xc55d7e4b -//.word 0x894e2ef4 -//.word 0xa1101019 -//.word 0x11627517 -//.word 0xd2294389 -//.word 0x276ded69 -//.word 0x2ea4a278 -//.word 0xb533c5df -//.word 0x50329e16 -//.word 0xa86f4f05 -//.word 0x16b60969 -//.word 0x71507f7a -//.word 0x24ca9bcb -//.word 0x83f87071 -//.word 0x5f387167 -//.word 0xd7fbe031 -//.word 0x728289c0 -//.word 0x6be6af96 -//.word 0x4c5b472a -//.word 0xbeb5648e -//.word 0xa02cf34f -//.word 0x565ca89d -//.word 0x649038ab -//.word 0x3b3fc959 -//.word 0x52d7a611 -//.word 0x79ba38ee -//.word 0x6b863224 -//.word 0xa29a0b9c -//.word 0x6fd6b1de -//.word 0x49a17c34 -//.word 0x6631600c -//.word 0x8807689f -//.word 0x1ab85fd0 -//.word 0x7bf3d057 -//.word 0x9ac0321e -//.word 0xc3065ceb -//.word 0xb8503f40 -//.word 0x04d0d380 -//.word 0x8ca55252 -//.word 0x6759a54a -//.word 0xefae1bc7 -//.word 0x189a6117 -//.word 0x0190afe2 -//.word 0xc9013fc5 -//.word 0xa423033d -//.word 0x2ef197c7 -//.word 0xff737545 -//.word 0x7f3f68a4 -//.word 0xfb4043bc -//.word 0xf9b6d277 -//.word 0xc97e1136 -//.word 0x5d949c70 -//.word 0x5bd6679c -//.word 0x6f0aaf52 -//.word 0xe62330ad -//.word 0x79c099f3 -//.word 0x66f63d78 -//.word 0xc64f0bbf -//.word 0x1a12c0e3 -//.word 0x27c55b35 -//.word 0x04f1d127 -//.word 0x71250369 -//.word 0x6a3ded51 -//.word 0xfce42080 -//.word 0x585872c3 -//.word 0x266ef437 -//.word 0x1bd524b1 -//.word 0xce9e645c -//.word 0xc7fcaba4 -//.word 0xd9497b53 -//.word 0xb34a13fa -//.word 0xb1b4e593 -//.word 0xf8ef4a64 -//.word 0xc1197527 -//.word 0xf54ea567 -//.word 0xfb279f2d -//.word 0xcd805cdc -//.word 0x527fff5a -//.word 0xe8d20a70 -//.word 0x3f37d074 -//.word 0x6e422e25 -//.word 0x405b76d6 -//.word 0xcf06accf -//.word 0x5567f5f0 -//.word 0x3e054c97 -//.word 0x82ce77c4 -//.word 0x315b397b -//.word 0x5076ca6a -//.word 0xe3d984cc -//.word 0x4b39df8d -//.word 0xd2839faf -//.word 0x85664cec -//.word 0x4211e39d -//.word 0x113ecbda -//.word 0xb76f0ae3 -//.word 0x8977b9be -//.word 0x7f3db522 -//.word 0x89bd9894 -//.word 0x264fe8d0 -//.word 0x322c8e6a -//.word 0xff2e89b5 -//.word 0xa8d7e3e4 -//.word 0xa295e46f -//.word 0x944487b9 -//.word 0x69f52aef -//.word 0xa3ee8933 -//.word 0xf2f2edfa -//.word 0x05c2a1b2 -//.word 0xa0e3a6a9 -//.word 0xefa2a72a -//.word 0x1a562fe9 -//.word 0x19e51aa0 -//.word 0xca894afb -//.word 0x40d49bb2 -//.word 0x5ef218f4 -//.word 0xa52f6f0c -//.word 0x4bb8a23f -//.word 0x8da600f3 -//.word 0x46385417 -//.word 0xbf605cbe -//.word 0xc9827c0d -//.word 0x0978b458 -//.word 0x94d9d088 -//.word 0xbc7bdec0 -//.word 0x2936e540 -//.word 0x2bebd489 -//.word 0x4ec5b9c1 -//.word 0x2fbf335a -//.word 0x8f672aef -//.word 0xa6e1bd6e -//.word 0xb92e7c7c -//.word 0xefafd815 -//.word 0x61e4d773 -//.word 0x707a0d32 -//.word 0x5b85c7b1 -//.word 0x110a89bb -//.word 0x43c0bb67 -//.word 0xbe179f3c -//.word 0xf87a8699 -//.word 0xe8d14454 -//.word 0x1b4be1a2 -//.word 0x055a9137 -//.word 0x95ffe6ae -//.word 0x0c47452a -//.word 0x0e16973e -//.word 0xf923400a -//.word 0x774455a7 -//.word 0x4fec09c6 -//.word 0x81f16993 -//.word 0x91934ae0 -//.word 0x23bb7f7f -//.word 0xc8804fef -//.word 0x18ef263c -//.word 0x010c8a20 -//.word 0x5e14516e -//.word 0xcb0511b0 -//.word 0xb860d90f -//.word 0xbd2e1e74 -//.word 0x2d41f8ed -//.word 0xeebc8f52 -//.word 0x88d6cf28 -//.word 0x7bda64c5 -//.word 0xd672e2b5 -//.word 0x0526435d -//.word 0xeb2097de -//.word 0x3132f73d -//.word 0xdd1abbc0 -//.word 0x2604ed9b -//.word 0x8650fdcb -//.word 0x1296b543 -//.word 0x07e77046 -//.word 0xa5568714 -//.word 0x40b70dc8 -//.word 0x94a7bc81 -//.word 0x59cd2ec0 -//.word 0x175f5111 -//.word 0x3ce715ee -//.word 0x6c4767e0 -//.word 0x18fa63e7 -//.word 0x529ec51c -//.word 0xdfafa195 -//.word 0x8e965589 -//.word 0xc9e2bbb4 -//.word 0x6ad5a3fd -//.word 0xd0228057 -//.word 0x31f561e5 -//.word 0x31342361 -//.word 0xb404e5be -//.word 0xf190bd0c -//.word 0xc906a99d -//.word 0x56e1c966 -//.word 0xc66ecba7 -//.word 0x6a89a6cf -//.word 0x0aa88b9a -//.word 0x7c1c187c -//.word 0x7493d042 -//.word 0x9ee0c8f7 -//.word 0xeaffa204 -//.word 0x2853bf9c -//.word 0xd433b157 -//.word 0x33a5ef1d -//.word 0x9f69cd46 -//.word 0x1e3aabff -//.word 0x3a506cf0 -//.word 0x0d292a1c -//.word 0x9c892708 -//.word 0x66c0071f -//.word 0x3c2b3d55 -//.word 0x52fdc40b -//.word 0x973f0f32 -//.word 0x421642b4 -//.word 0xad45a20f -//.word 0x67f24a43 -//.word 0x85ad21ef -//.word 0x38ae08b7 -//.word 0xa55e58e8 -//.word 0xf01a8b5f -//.word 0x9a3339a7 -//.word 0x0e394761 -//.word 0x76795be9 -//.word 0xd3c49236 -//.word 0x4d727602 -//.word 0xc7a72a2b -//.word 0xb7d5e85a -//.word 0x3582aee2 -//.word 0x524c33eb -//.word 0xaa2a20cf -//.word 0x3df47dc4 -//.word 0x7a2669bc -//.word 0x9de10f89 -//.word 0x3b32d545 -//.word 0x1b97d6f1 -//.word 0x48bf935c -//.word 0x6492e546 -//.word 0x3f7137c6 -//.word 0xa9bff1e9 -//.word 0x84a0379c -//.word 0x1d00d4cc -//.word 0xbcd871cb -//.word 0x79ac0bf6 -//.word 0x5259a495 -//.word 0x7b0d3802 -//.word 0xf597f20e -//.word 0x62e1a0a0 -//.word 0x18ba659f -//.word 0x74d9ad12 -//.word 0x701f6686 -//.word 0x781d6eb0 -//.word 0x7ad64754 -//.word 0x3dc61266 -//.word 0xf323bb6e -//.word 0x11627131 -//.word 0x5efd598d -//.word 0x4a7483a5 -//.word 0x82921d3e -//.word 0xc1f1e669 -//.word 0xe9c0e663 -//.word 0x52c45db9 -//.word 0x629df9af -//.word 0x5e4b4be3 -//.word 0x7ff07c2e -//.word 0x49d73ccb -//.word 0x18b6fcbb -//.word 0xfc305d67 -//.word 0xc69ee888 -//.word 0x630fff44 -//.word 0x698d1399 -//.word 0xf0a318ff -//.word 0xa31c3649 -//.word 0x170cc2cd -//.word 0x5b156cc4 -//.word 0xd0e3baf4 -//.word 0x3af9b58c -//.word 0x18b0e24f -//.word 0x317c73f4 -//.word 0x7072bfcd -//.word 0xf107f0a8 -//.word 0x5c1bfbf3 -//.word 0x7236d623 -//.word 0xe511e556 -//.word 0x6d58b536 -//.word 0x18aeec21 -//.word 0xe2f28088 -//.word 0x85c02895 -//.word 0x923b1011 -//.word 0xc10ad184 -//.word 0x85a1a09e -//.word 0xe4c2c5d5 -//.word 0x86435050 -//.word 0x0c110704 -//.word 0xa375a21d -//.word 0xd8963b9f -//.word 0xae40004d -//.word 0xede32bca -//.word 0xbedf34fe -//.word 0x75fe44bb -//.word 0xae42eea0 -//.word 0x9be21a3e -//.word 0x9c8f417a -//.word 0x10fbe032 -//.word 0x6c9c2624 -//.word 0x8aaef00b -//.word 0x4377f80a -//.word 0x3fce494e -//.word 0x0cdef7f0 -//.word 0x6e280c18 -//.word 0xf6c7c568 -//.word 0xd6f8ff98 -//.word 0xf4d9ec5d -//.word 0x3d710a90 -//.word 0x3cf1568c -//.word 0xeb39bdd8 -//.word 0xc99ed306 -//.word 0x2cebc7da -//.word 0xd9a597af -//.word 0xd2948017 -//.word 0x6f7eb9c2 -//.word 0xb03660a1 -//.word 0xd2d6b54a -//.word 0x2048869f -//.word 0x0c0beaaa -//.word 0x7e3332cc -//.word 0x6cb21d17 -//.word 0xabd74bf8 -//.word 0x0514f419 -//.word 0x8b04da85 -//.word 0x2cac7c0e -//.word 0x87028dec -//.word 0xfeaba4a6 -//.word 0x0c093536 -//.word 0xd875c068 -//.word 0x0ac94883 -//.word 0xdd22072b -//.word 0x75e46086 -//.word 0x74fe159e -//.word 0xc86fba06 -//.word 0xc6096ac1 -//.word 0x7d74b85f -//.word 0x4477e869 -//.word 0x967360ff -//.word 0x203059c0 -//.word 0x17dcdaea -//.word 0xcf51e7c2 -//.word 0x8a97f637 -//.word 0x8eaaa2c2 -//.word 0x7a7da390 -//.word 0xd93efee3 -//.word 0xf8dc79b6 -//.word 0xf5c752a0 -//.word 0x19f730fa -//.word 0x672f5a44 -//.word 0x758327c5 -//.word 0x7b18b672 -//.word 0xaa2bde11 -//.word 0xbf54689e -//.word 0xd70c7cee -//.word 0x856e5a92 -//.word 0x223a4bfe -//.word 0x641fd6eb -//.word 0x323a36f9 -//.word 0xb7da0c99 -//.word 0xb686522a -//.word 0x1d419062 -//.word 0xdc0c52f0 -//.word 0xf7add95f -//.word 0xdaaf113e -//.word 0xeeaac37e -//.word 0x69c40c1b -//.word 0x6a780eff -//.word 0x4596e523 -//.word 0x1b8bdcf7 -//.word 0xafe3e104 -//.word 0x740c37cf -//.word 0xeb5d6b01 -//.word 0x2b5689c6 -//.word 0xc12a8f73 -//.word 0xbb7a226b -//.word 0x00648043 -//.word 0xe3bcb624 -//.word 0xf7991371 -//.word 0x2414dcaa -//.word 0xfa4c4191 -//.word 0x46ae908b -//.word 0xe373a948 -//.word 0xd369b2a6 -//.word 0x8ef70cd3 -//.word 0x9a5b85b2 -//.word 0x5c37cf81 -//.word 0x2e4c31b8 -//.word 0xb2857c34 -//.word 0x65374194 -//.word 0x77a741e4 -//.word 0xdacd2579 -//.word 0x99576f1b -//.word 0x6bf1b16a -//.word 0x88c4fc7a -//.word 0xbb3c9cc1 -//.word 0xb80f0233 -//.word 0xb17b02ab -//.word 0x24cf3f8d -//.word 0xf72ce3a9 -//.word 0xc68d9363 -//.word 0x7c05a211 -//.word 0x204884a5 -//.word 0xf26d868c -//.word 0xb7f2bdd6 -//.word 0x51013c96 -//.word 0x92f18a8c -//.word 0x52105401 -//.word 0xbfa05ef3 -//.word 0xf51fbf72 -//.word 0xcfcc4e4a -//.word 0xfc6658e2 -//.word 0x55379464 -//.word 0x6d51581e -//.word 0x6a180c29 -//.word 0x1400e048 -//.word 0x2c98ba12 -//.word 0xffc87254 -//.word 0x3b5642b1 -//.word 0x00af788b -//.word 0x3ae56e27 -//.word 0x2ff4bc0b -//.word 0x5449acab -//.word 0x6585ef45 -//.word 0xb47e8e0a -//.word 0xc286237e -//.word 0x0cf14821 -//.word 0x27d1504f -//.word 0x0f043565 -//.word 0xbd71d225 -//.word 0xf78e525c -//.word 0x6c26e9c1 -//.word 0x0059c221 -//.word 0x65e438b9 -//.word 0xeba248e4 -//.word 0x995346f6 -//.word 0x7c9dd067 -//.word 0x3f500134 -//.word 0xfceee682 -//.word 0x526b3684 -//.word 0xb8313da0 -//.word 0x10671acd -//.word 0x80732a40 -//.word 0x7dbdc447 -//.word 0x28b62775 -//.word 0xde1ab0ff -//.word 0x0a725166 -//.word 0x3edc3e56 -//.word 0x830ee9cf -//.word 0xed993182 -//.word 0x726bd67e -//.word 0xfb98310b -//.word 0xbc5a22d6 -//.word 0xc156494f -//.word 0xca207950 -//.word 0x590269ff -//.word 0x09f9adf5 -//.word 0x2101e5a0 -//.word 0x699235e5 -//.word 0x3d6bf50a -//.word 0xdf8ea9d4 -//.word 0x128c33ec -//.word 0xe4024787 -//.word 0xcb642046 -//.word 0xf3f9715b -//.word 0xd7279fee -//.word 0x0ff12dbf -//.word 0x68be780c -//.word 0x3a5ca4b5 -//.word 0xf644d69e -//.word 0xff20a355 -//.word 0xbb8ac9f5 -//.word 0xe9171d4a -//.word 0x3594c535 -//.word 0x098fa752 -//.word 0xa71a21d9 -//.word 0x75cbfbc2 -//.word 0x97079a2d -//.word 0xc3807600 -//.word 0x51fdced2 -//.word 0x925a9a08 -//.word 0x63cfc13d -//.word 0x02758ce8 -//.word 0x20055a38 -//.word 0x37e39643 -//.word 0x1d5ce760 -//.word 0xda2ca6d1 -//.word 0xb74495a6 -//.word 0x97cacedd -//.word 0x8a60f9ce -//.word 0xa0a9c2c7 -//.word 0xfb098bf3 -//.word 0x28ad5d80 -//.word 0xb0cc2500 -//.word 0xe92c1d10 -//.word 0x12e78838 -//.word 0x9f6fa213 -//.word 0xd2d0d7b0 -//.word 0x8b353337 -//.word 0x61ae1ad0 -//.word 0xf13039c0 -//.word 0x76debcd5 -//.word 0x9b86c105 -//.word 0x8d6f0d52 -//.word 0x5352fef1 -//.word 0x62a6c1aa -//.word 0x6c20c582 -//.word 0x7a7b7098 -//.word 0x3a75104d -//.word 0x9a1a14a7 -//.word 0x95447cf8 -//.word 0x4d638eba -//.word 0x5b7acbbe -//.word 0x636a2186 -//.word 0xeb7362ef -//.word 0x6df8f512 -//.word 0xaa82cc6d -//.word 0x4208953e -//.word 0x826e3530 -//.word 0x7d4b7239 -//.word 0x5eefefc3 -//.word 0xfca55e0a -//.word 0xaf35f1c5 -//.word 0x63ad1108 -//.word 0xea615369 -//.word 0x9731a862 -//.word 0x080ad4f6 -//.word 0x43b02197 -//.word 0x05ba5448 -//.word 0x56dee0ff -//.word 0x616e5a4d -//.word 0x83232d40 -//.word 0xa21a8f89 -//.word 0xc01cb3da -//.word 0xcf224092 -//.word 0xc718039c -//.word 0xf7e2e094 -//.word 0x989d0f2c -//.word 0xa82785cf -//.word 0xf6e1af84 -//.word 0x79b36614 -//.word 0xe551206f -//.word 0x80bd634c -//.word 0x320e8010 -//.word 0xdc6f7df1 -//.word 0xeb6a535b -//.word 0x2d675a92 -//.word 0xe36f019a -//.word 0x1736c254 -//.word 0x305955e9 -//.word 0xc3e4246b -//.word 0xac1700ba -//.word 0x5e6a12a5 -//.word 0x77ce1452 -//.word 0x9836c1e0 -//.word 0x7356894a -//.word 0x25aa8a8f -//.word 0xc7bbbc10 -//.word 0x3f9e6b39 -//.word 0x5cbdeb63 -//.word 0x23da87f9 -//.word 0x6350bada -//.word 0x909ca2ff -//.word 0xcd1db15e -//.word 0x4b18a60e -//.word 0xd2ffbbab -//.word 0x9df320fc -//.word 0x6b87a9d3 -//.word 0xd3c7c435 -//.word 0xd879adbb -//.word 0xbda2e538 -//.word 0x1b4ce09c -//.word 0x3087fd19 -//.word 0x7aaebc84 -//.word 0x84eb2cfd -//.word 0x01fda2d2 -//.word 0x1739b0a1 -//.word 0xfdcf55bd -//.word 0xc84f72d3 -//.word 0x826c7dce -//.word 0x7dff79f7 -//.word 0xe64f2661 -//.word 0x9d8f7584 -//.word 0x44a83e28 -//.word 0x97393585 -//.word 0xfbdc1ba8 -//.word 0x59ac3118 -//.word 0x2c04f2ba -//.word 0xd98901f2 -//.word 0x406a610b -//.word 0x90e6e4d9 -//.word 0x5f0fe69c -//.word 0xface3a28 -//.word 0xf9286543 -//.word 0x17bf0a4f -//.word 0x419ca629 -//.word 0xed2b7e50 -//.word 0xad87d54a -//.word 0x04f86143 -//.word 0x78bb00f8 -//.word 0xe801a8d3 -//.word 0x20399c57 -//.word 0xab92e6bf -//.word 0xe8bc01e2 -//.word 0x61efd65a -//.word 0x572feae5 -//.word 0xa2ced50b -//.word 0xb832f602 -//.word 0x0bd965ce -//.word 0x989929ac -//.word 0xbc2dabb1 -//.word 0x4aed6baf -//.word 0xdcddf258 -//.word 0x66e908a6 -//.word 0x116f267a -//.word 0x46fe2e83 -//.word 0x085e5a61 -//.word 0x88d0720a -//.word 0xf396436d -//.word 0x8fb64c56 -//.word 0x06fcba92 -//.word 0x023e9753 -//.word 0xf9e33ed6 -//.word 0x4ba61242 -//.word 0x8a986fd4 -//.word 0x1864e139 -//.word 0xf8d7943b -//.word 0xdea00ca0 -//.word 0x8854164f -//.word 0x51b5ffb5 -//.word 0x04330367 -//.word 0xeeb30809 -//.word 0x37908d6e -//.word 0x72dfdd00 -//.word 0x72f88863 -//.word 0x5f321355 -//.word 0x0aedefd9 -//.word 0x7ed6a894 -//.word 0xd8665f77 -//.word 0x58ac7a9e -//.word 0xb74d9a78 -//.word 0xbbc9cd29 -//.word 0x0aff062c -//.word 0x3cf4ca3d -//.word 0x33d02b76 -//.word 0xaf29fab8 -//.word 0x1d84394c -//.word 0xb019cfca -//.word 0xb3d77f3a -//.word 0x1ea81b7a -//.word 0x67f6f5e0 -//.word 0x9a6e971f -//.word 0xac04b46f -//.word 0x0d375ee8 -//.word 0x7c96782f -//.word 0x1f836f55 -//.word 0xd33725fc -//.word 0xc1062ebc -//.word 0x32e43fc5 -//.word 0xa429e3c5 -//.word 0x1c91700c -//.word 0xbf873aee -//.word 0x9ca30668 -//.word 0xcd71c207 -//.word 0xbe747306 -//.word 0xcc6a6eb6 -//.word 0x12d2cb23 -//.word 0x7fac17f5 -//.word 0x2c804994 -//.word 0xeda1f790 -//.word 0x27b3ca3f -//.word 0xe16b30a8 -//.word 0x1d96509f -//.word 0x685d4332 -//.word 0xb0c78144 -//.word 0x567f9978 -//.word 0x84d82651 -//.word 0xc10efe97 -//.word 0xc2cfacfc -//.word 0x83f921ff -//.word 0x97a6a611 -//.word 0xbd6615f6 -//.word 0xb3cb496f -//.word 0x4f2bd316 -//.word 0xcba1ee89 -//.word 0x6155b6ca -//.word 0x17fd94e6 -//.word 0xdda4fdd5 -//.word 0xd5aa5ca2 -//.word 0xf20d4ccc -//.word 0xc4e60beb -//.word 0x92372b96 -//.word 0xaae38b85 -//.word 0xf5fe86f3 -//.word 0xce476a46 -//.word 0x14f32cf2 -//.word 0x7ead5a9b -//.word 0x2fda507a -//.word 0x8b21af01 -//.word 0x482b0bc2 -//.word 0xc8a7e48d -//.word 0xa692d8d8 -//.word 0x8fb51664 -//.word 0x536f161e -//.word 0x3bb48844 -//.word 0x9e568ac8 -//.word 0xaf831df9 -//.word 0x9990da60 -//.word 0xcef4e1e8 -//.word 0x9b981343 -//.word 0x014e8188 -//.word 0xc09e2321 -//.word 0xb4c9cee4 -//.word 0x64086080 -//.word 0xd9153e1b -//.word 0xacec0039 -//.word 0x63d36ae0 -//.word 0xfe989efa -//.word 0xcc1a91fa -//.word 0x830abcc2 -//.word 0x90f314c4 -//.word 0xac783b68 -//.word 0xb0def8ae -//.word 0xaacae515 -//.word 0x304b67bb -//.word 0xf41ae3c5 -//.word 0x99212f01 -//.word 0xc53b47ca -//.word 0x783b422d -//.word 0x9c2f844a -//.word 0xdde634fc -//.word 0xbaaff1bc -//.word 0xdc64c0c2 -//.word 0xa7a7496e -//.word 0x106c44e7 -//.word 0xaeb82e02 -//.word 0x13a74065 -//.word 0x5cb4a1ec -//.word 0x0735db4b -//.word 0x05258cf5 -//.word 0x10265e3d -//.word 0x3fc638bb -//.word 0xd802b6f2 -//.word 0x6509d72f -//.word 0x0a42f6b4 -//.word 0x158ffc16 -//.word 0xd7d4d3e4 -//.word 0xb3b31e89 -//.word 0x749a2774 -//.word 0xe3001876 -//.word 0x9aeb6f6b -//.word 0x13b6ac1c -//.word 0x04114c64 -//.word 0xef49fb92 -//.word 0xf4ca060f -//.word 0xebe20f41 -//.word 0xafc704ae -//.word 0xbcdc5265 -//.word 0xfd30559a -//.word 0xdf471390 -//.word 0xaa1e2bbc -//.word 0x11690827 -//.word 0x081f5a14 -//.word 0xd538c7e3 -//.word 0x6ab6dd35 -//.word 0xf2e24c51 -//.word 0xaad852c6 -//.word 0xf2457652 -//.word 0xa4707903 -//.word 0xa4778a9c -//.word 0xb8dbb93a -//.word 0x9a3fae37 -//.word 0x4c6d9b4f -//.word 0xac9a6f01 -//.word 0x48eb4d38 -//.word 0x73383c2b -//.word 0x990f2082 -//.word 0xcffce9ba -//.word 0xae070aca -//.word 0x627f2c07 -//.word 0xfef62445 -//.word 0x128d233f -//.word 0x80722d39 -//.word 0x8ba6cde3 -//.word 0x31040681 -//.word 0xbb7f8c49 -//.word 0x92ab350c -//.word 0x547faa19 -//.word 0x2759625f -//.word 0x4e42d1d1 -//.word 0xfa73dc0f -//.word 0x62199142 -//.word 0x15561547 -//.word 0x8f88dd11 -//.word 0x0bcd2148 -//.word 0x99c78e36 -//.word 0x709c3ce4 -//.word 0x8541df80 -//.word 0x5df94102 -//.word 0x1f18f010 -//.word 0xed0d331e -//.word 0x749f43d9 -//.word 0xc277b8c6 -//.word 0x58df4226 -//.word 0x81c9991e -//.word 0xe213b714 -//.word 0x5109445c -//.word 0xeb2c5214 -//.word 0x60324a4c -//.word 0x924d266b -//.word 0x5fb0e1cd -//.word 0xba502cb1 -//.word 0x01e76353 -//.word 0x8a3fbf55 -//.word 0x80adcd63 -//.word 0xeddb1f17 -//.word 0x17cb411a -//.word 0x1019ee8d -//.word 0x898184a7 -//.word 0xe7a0b69f -//.word 0x99ff81cc -//.word 0xa84d610b -//.word 0x8fecc461 -//.word 0x4eb0bfe1 -//.word 0xbae300d0 -//.word 0x178c0408 -//.word 0xe8f08a9a -//.word 0x065a47b7 -//.word 0xf018dbd1 -//.word 0x62c604fd -//.word 0x29cf119c -//.word 0x35309a3a -//.word 0xf07f6fb6 -//.word 0xce2ccea3 -//.word 0x2508d9ef -//.word 0x400346c2 -//.word 0xaf3a59a9 -//.word 0xe0310ff4 -//.word 0xf45c9d5d -//.word 0xcbe518ea -//.word 0x61a97614 -//.word 0x5e84b528 -//.word 0xe8ce5aee -//.word 0xbc251d89 -//.word 0x7d6de39e -//.word 0x4b16ecb8 -//.word 0x989d4eeb -//.word 0x3756a2b8 -//.word 0xb668fd31 -//.word 0xee19225d -//.word 0xd84cf5de -//.word 0xa34733d1 -//.word 0x03ba61f6 -//.word 0xcbfd0211 -//.word 0xbe9a0d90 -//.word 0xa20b9e6d -//.word 0x97c5ec56 -//.word 0xa7757b0c -//.word 0x9e899309 -//.word 0x1cf2f065 -//.word 0xe828bbfa -//.word 0x876fb9c7 -//.word 0x0e5ac392 -//.word 0x348d76d1 -//.word 0xabc62bcb -//.word 0xb11f29fb -//.word 0xe28d1ab5 -//.word 0x50adbc0c -//.word 0xd5c0d9f2 -//.word 0xa8f379a1 -//.word 0x2fe5563a -//.word 0x146390ac -//.word 0x9b76a2d8 -//.word 0x339f95f3 -//.word 0x4b61742b -//.word 0x6600ff8d -//.word 0x7289a326 -//.word 0x5512aa68 -//.word 0xca43b0d0 -//.word 0x6b1556c6 -//.word 0x0eda3ac5 -//.word 0x557e26bb -//.word 0x810c87b3 -//.word 0x877321b1 -//.word 0x668b02dd -//.word 0xb753b4e4 -//.word 0x867db79c -//.word 0x602c2ee7 -//.word 0xadfcd9d9 -//.word 0x4143431d -//.word 0x2d963d94 -//.word 0xdb8f8a40 -//.word 0x5acedc61 -//.word 0xf63e00dd -//.word 0x0c9955e5 -//.word 0x1c2f82d6 -//.word 0x20e3685d -//.word 0x1c7656df -//.word 0xf7087c18 -//.word 0x89dba302 -//.word 0xf55b1bf8 -//.word 0x395bf41b -//.word 0x03a271f5 -//.word 0xc7a6b95c -//.word 0x0e97d099 -//.word 0x119fc6ca -//.word 0x86692e85 -//.word 0xbae0d2be -//.word 0xe039a5eb -//.word 0xa833f965 -//.word 0x80000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00009880 -//// expected output -//.word 0x64fe3513 -//.word 0xe438e5e0 -//.word 0xa977586a -//.word 0x1780d307 -//.word 0x95367d6b -//.word 0xd622386b -//.word 0x4fa8cc9a -//.word 0x91a88bfd -//.word 0xd5666a5a -//.word 0x39ae2a9f -//.word 0x7f2ec679 -//.word 0x43edfddb -//.word 0x42e96e5a -//.word 0xb81aa0cd -//.word 0xca312f9d -//.word 0x60f8c9dc -//// SHA512LongMsgvector_49 -//// vector length -//.word 0x00009B98 -//// input message -//.word 0xeb2d8518 -//.word 0xba3168e2 -//.word 0x431f40ac -//.word 0x2addf022 -//.word 0x7b1603f1 -//.word 0x3d82e12b -//.word 0x4b6849ec -//.word 0x5f61fb3e -//.word 0x705eb53a -//.word 0x3eec6170 -//.word 0x2bb78d89 -//.word 0x4c4d1b2b -//.word 0xc0253a1d -//.word 0x40e095ac -//.word 0xf8ceca4d -//.word 0x95b41d83 -//.word 0xa0cd6e03 -//.word 0x0a0e6817 -//.word 0x08aefc40 -//.word 0x21e60d1f -//.word 0x84f66d95 -//.word 0xa068092a -//.word 0xef9860ab -//.word 0x12743a17 -//.word 0x238196bd -//.word 0x471fe49e -//.word 0x820d7418 -//.word 0xd02f2fc6 -//.word 0x718f85a2 -//.word 0x84a3a66c -//.word 0xd7cef550 -//.word 0xfe28b9c3 -//.word 0xa28216ae -//.word 0x1ca53dce -//.word 0x42dbdf5a -//.word 0x81b1e7e7 -//.word 0x2dfa688a -//.word 0x1417d43c -//.word 0x59767082 -//.word 0x8059044d -//.word 0xc5d9d71e -//.word 0xb22ada6f -//.word 0xf020244f -//.word 0x5ef29e4c -//.word 0x603f0095 -//.word 0x7a4efc60 -//.word 0x1d9ab88a -//.word 0xc08e827d -//.word 0x338dc057 -//.word 0x30352549 -//.word 0x34e52b3c -//.word 0x8c7cbdbb -//.word 0xb364330d -//.word 0xdbd084a1 -//.word 0xca41b7b0 -//.word 0xe74f9b1d -//.word 0x95a6b8a0 -//.word 0xbf4f8523 -//.word 0xb431dc6c -//.word 0x36d7aafd -//.word 0xcd73eb38 -//.word 0x6223d6c7 -//.word 0x0874543b -//.word 0x1d25b7f3 -//.word 0x922da940 -//.word 0x87fe62c6 -//.word 0x1b0c1f26 -//.word 0x8289cfda -//.word 0x58730f60 -//.word 0x34d1589a -//.word 0x813a7775 -//.word 0x89963ec9 -//.word 0xd3297a80 -//.word 0xafcd25fb -//.word 0x0f7edcb1 -//.word 0x981c9319 -//.word 0xf96d87cb -//.word 0x7c6274e2 -//.word 0xda9b08a4 -//.word 0x542c9865 -//.word 0xffa213a8 -//.word 0x60413488 -//.word 0x3890fb56 -//.word 0xa1185d84 -//.word 0x5a683bc1 -//.word 0x605c9166 -//.word 0xbe9ff011 -//.word 0xa56f2e8f -//.word 0xbfa05c00 -//.word 0xc1e4f835 -//.word 0x4049645d -//.word 0xc50397e1 -//.word 0x236c138c -//.word 0x084916ef -//.word 0xd34f1504 -//.word 0xa5e66611 -//.word 0xbb2c3dcf -//.word 0xfb3dd9cc -//.word 0xccb2ff0e -//.word 0x2b67a8f9 -//.word 0xfc82f773 -//.word 0x9db06d45 -//.word 0xc1b260c4 -//.word 0x7c19a9b2 -//.word 0x9a4d9e5f -//.word 0x35d44013 -//.word 0x87d1b5b0 -//.word 0xfccbf894 -//.word 0x8bb0cfbd -//.word 0x471afd30 -//.word 0x31d0b99b -//.word 0x51906039 -//.word 0x050c67f6 -//.word 0x983293d4 -//.word 0x16b06c8d -//.word 0x5fb8ef7a -//.word 0x7b0083b3 -//.word 0x2d0e2e78 -//.word 0xcbb209cf -//.word 0x4cd4f16f -//.word 0xa36f80dd -//.word 0x4cde3bd5 -//.word 0x24570deb -//.word 0x7db5f572 -//.word 0x727afb9d -//.word 0x781468e4 -//.word 0x365f36a9 -//.word 0x976cc61c -//.word 0x1d81d15c -//.word 0x7860a1df -//.word 0x57cc8113 -//.word 0x7e4a7245 -//.word 0x18251fc3 -//.word 0x4fb4133d -//.word 0x1bdf2a71 -//.word 0x57e04508 -//.word 0x1a4742ba -//.word 0x44412cb9 -//.word 0x5719ae4d -//.word 0x89ffcebb -//.word 0x1709d86c -//.word 0xdb77974b -//.word 0x213bcb6f -//.word 0xb7b9d8fa -//.word 0x43cbbc41 -//.word 0xd908432d -//.word 0xcd467ee1 -//.word 0xc65d719c -//.word 0x142e0ce1 -//.word 0x44e45dd6 -//.word 0xf17a03eb -//.word 0xdd7ee6bb -//.word 0x40142537 -//.word 0x5f3d5001 -//.word 0x6159d816 -//.word 0x5eebc3b0 -//.word 0xba9da46b -//.word 0xb184cba6 -//.word 0x32a4b92c -//.word 0xf1b7d714 -//.word 0xb82a67e5 -//.word 0xfd69bafe -//.word 0xba5ca335 -//.word 0x79312dbf -//.word 0xae5d8950 -//.word 0x4add4a82 -//.word 0x8dc2d57b -//.word 0x1cec12ca -//.word 0x53166893 -//.word 0xdc13e9ec -//.word 0x8156c986 -//.word 0x3eb81590 -//.word 0x9b76a1d8 -//.word 0x39794334 -//.word 0xaadb3e20 -//.word 0x85a601a8 -//.word 0xbadf1289 -//.word 0x24c34593 -//.word 0x5d503151 -//.word 0xd607e4ec -//.word 0x27f1d64d -//.word 0xa3e01c82 -//.word 0x30f7de63 -//.word 0x566c0b75 -//.word 0x958d4b0e -//.word 0xfc0136ba -//.word 0xf751c3de -//.word 0x69a7039b -//.word 0xfad50ff5 -//.word 0xb3983f35 -//.word 0xc81e9c8b -//.word 0xb4c798f8 -//.word 0x8b29fd6b -//.word 0x8c56242b -//.word 0xf6616774 -//.word 0x1e1ed865 -//.word 0xbd2a341a -//.word 0x8e2b1215 -//.word 0x195960e2 -//.word 0xc93e10fa -//.word 0x45b90fe9 -//.word 0xfd4977ac -//.word 0x0388055d -//.word 0x1df6cd12 -//.word 0x18f82c02 -//.word 0x5f21ffe9 -//.word 0xccaf12ae -//.word 0xbd59dc43 -//.word 0x6b4869ce -//.word 0x77639706 -//.word 0xc6cf85df -//.word 0x8fb64969 -//.word 0xb248e1f5 -//.word 0x4c006c7b -//.word 0x88299b38 -//.word 0xb8a0629b -//.word 0xa4dbf362 -//.word 0x212aec01 -//.word 0xe63dcf43 -//.word 0x9ce7b433 -//.word 0x34213a3d -//.word 0x7d52c391 -//.word 0xf6cee1c8 -//.word 0xe19c0bca -//.word 0x987c95ef -//.word 0x2428df64 -//.word 0x0cdbccd1 -//.word 0x6b107538 -//.word 0x458c1f21 -//.word 0x1b9e6bf4 -//.word 0xbda6cda6 -//.word 0x60d43f97 -//.word 0xf03237bb -//.word 0xa8e5d6f9 -//.word 0xdfb062d0 -//.word 0x25b9f640 -//.word 0x8e9078e8 -//.word 0x4e6dcc6c -//.word 0x86b94719 -//.word 0x5ed067cc -//.word 0x5406c10f -//.word 0xd4e83a86 -//.word 0x08c47a8a -//.word 0xf16b9e13 -//.word 0xb7352ddb -//.word 0x3d464ec0 -//.word 0xf910386a -//.word 0x0319e92f -//.word 0x6bfe1b33 -//.word 0xd0b974d4 -//.word 0x2e1ffd45 -//.word 0xf8acd578 -//.word 0x67832742 -//.word 0x11b159ba -//.word 0xbdb286e2 -//.word 0x76362f89 -//.word 0xde252d6f -//.word 0xc5e0eaab -//.word 0xfacad14a -//.word 0x61070339 -//.word 0x46834c65 -//.word 0xf1365520 -//.word 0x7ba71bc7 -//.word 0xe0af9fa1 -//.word 0x5480e00b -//.word 0xdbe506d2 -//.word 0x14cce0e1 -//.word 0x5501901c -//.word 0xfd3c858b -//.word 0x065eaabb -//.word 0xdaf8dd61 -//.word 0x680da341 -//.word 0x76191a4e -//.word 0x39512f13 -//.word 0x232d1051 -//.word 0xfc24e5ea -//.word 0x34b6bbfd -//.word 0x78b0c053 -//.word 0x83acb6fa -//.word 0x37d7a22f -//.word 0xecf7c482 -//.word 0x08accc34 -//.word 0xcff54be4 -//.word 0x7df7686a -//.word 0x92fad404 -//.word 0x6eb500b0 -//.word 0x1dcb8dd8 -//.word 0x74950434 -//.word 0x5d22c7ed -//.word 0x6f7c47fe -//.word 0xc22d78e0 -//.word 0x01028266 -//.word 0xc00fbae6 -//.word 0x10f3d099 -//.word 0x515e4944 -//.word 0x48d03018 -//.word 0x72a309d7 -//.word 0x974b0739 -//.word 0xa1dd7f8e -//.word 0xafce9ba4 -//.word 0x66fd53eb -//.word 0x87f499d7 -//.word 0xc76bd486 -//.word 0xdb0e90a3 -//.word 0xd281748a -//.word 0xa7a074ad -//.word 0x170b4836 -//.word 0xb0e21cee -//.word 0x2bcd895d -//.word 0xfb40c433 -//.word 0x26fd15e6 -//.word 0x54da8b9d -//.word 0x25c4ef4d -//.word 0xc804f621 -//.word 0xcac1ba20 -//.word 0x2bc66b0a -//.word 0xb7864282 -//.word 0x935db772 -//.word 0x1719f4ac -//.word 0xdbb989cd -//.word 0x15756167 -//.word 0x22fef55f -//.word 0x6206bf93 -//.word 0x4903f2c0 -//.word 0xb33068a4 -//.word 0x78d5dc5f -//.word 0x41c9591f -//.word 0x9a35f2fc -//.word 0x489ab421 -//.word 0xdc16d92d -//.word 0x88e33ed9 -//.word 0x322018da -//.word 0xc7d4e209 -//.word 0xd2309ac1 -//.word 0x4d142c88 -//.word 0xb6d52ff2 -//.word 0x663ecfc3 -//.word 0x1fd40a54 -//.word 0xe45e2038 -//.word 0x0da5441e -//.word 0x9a7998f9 -//.word 0xc8f4585f -//.word 0xe203552f -//.word 0x5a21a677 -//.word 0x18669a95 -//.word 0x12c1f19c -//.word 0x1d824bf9 -//.word 0x021be056 -//.word 0xd52772be -//.word 0x82ab8002 -//.word 0xa99cbd5c -//.word 0xaca2c053 -//.word 0x061cfdde -//.word 0xde64f4cc -//.word 0xdb54a863 -//.word 0x3b095348 -//.word 0x1fe6589f -//.word 0x29dc7972 -//.word 0x49e94a57 -//.word 0xd4dfe54d -//.word 0xd767e0e8 -//.word 0xaa457cae -//.word 0xc8de1fc0 -//.word 0xddf705bd -//.word 0x21bf32e3 -//.word 0xe510ab77 -//.word 0x6bf2e567 -//.word 0xfb617e2f -//.word 0x33502bf9 -//.word 0x9fedf208 -//.word 0x8a279956 -//.word 0x136d5e7c -//.word 0x83b9e8d3 -//.word 0xddce7ed9 -//.word 0xb7be77d6 -//.word 0x49aef1bf -//.word 0xc4ddc65a -//.word 0xe5e3bca3 -//.word 0xc937fc6f -//.word 0x03f4c64f -//.word 0xecdd62b7 -//.word 0x3a9e5a5f -//.word 0xd455e6ea -//.word 0xe550a8c6 -//.word 0x2f189953 -//.word 0xa3af4447 -//.word 0x2e173251 -//.word 0xd513a5fc -//.word 0x043289d7 -//.word 0x2308a7d3 -//.word 0x6bbf1cec -//.word 0xf8cf090b -//.word 0x1f098d2b -//.word 0x01daf0bb -//.word 0x60ce2144 -//.word 0xb253634c -//.word 0x74c0437a -//.word 0xc195cdfb -//.word 0x2304ff23 -//.word 0xa9b17e58 -//.word 0x3ab7882c -//.word 0x28eb2ac9 -//.word 0x0864b392 -//.word 0xc23b6807 -//.word 0xe48f79e9 -//.word 0x3ccc349f -//.word 0xa52d79d9 -//.word 0x21806e73 -//.word 0x282a739c -//.word 0x406a5937 -//.word 0xcee2ce81 -//.word 0x2c531cf5 -//.word 0xfba8146d -//.word 0xbb364489 -//.word 0x99427154 -//.word 0x87c34125 -//.word 0x926a37c4 -//.word 0x70e0e4ce -//.word 0x594f5c5b -//.word 0x1923e8dd -//.word 0x6212fa4c -//.word 0x66596680 -//.word 0xa549cede -//.word 0x04035e36 -//.word 0x2080baec -//.word 0xe1d43556 -//.word 0x52b34466 -//.word 0xb0343289 -//.word 0xc1d515ce -//.word 0x66bf004b -//.word 0x744c7abd -//.word 0xc0c72f6e -//.word 0x7973e65c -//.word 0xbbceb397 -//.word 0x60166eeb -//.word 0x1a0d63bf -//.word 0xbffa4b3d -//.word 0xe3f07cb3 -//.word 0xac525c39 -//.word 0xe2971b95 -//.word 0x464ba25b -//.word 0x2556c659 -//.word 0x2c81c231 -//.word 0x7e36e448 -//.word 0x048786df -//.word 0x04734080 -//.word 0xf6645c9c -//.word 0x93fb8a72 -//.word 0x2e10d532 -//.word 0x47f5d663 -//.word 0x5efb2882 -//.word 0x05381cec -//.word 0x3987adfe -//.word 0xf2cfb67a -//.word 0xf989622c -//.word 0xfa7ce4ce -//.word 0xdacb692a -//.word 0x4a324b7e -//.word 0x9d8d8824 -//.word 0xd69a7272 -//.word 0x06ffa8e0 -//.word 0xd58f4468 -//.word 0x5ec95633 -//.word 0x40a19271 -//.word 0xf1844589 -//.word 0x56968e72 -//.word 0x913eca60 -//.word 0x1be450a4 -//.word 0x12f95fcd -//.word 0xd4385414 -//.word 0xcc2c20f7 -//.word 0x8cf3fa23 -//.word 0x1c415197 -//.word 0x92a80507 -//.word 0xe316d67e -//.word 0xf99f1d48 -//.word 0x067cba0f -//.word 0x17544d44 -//.word 0xecbba9c1 -//.word 0x07f985ac -//.word 0x030c759e -//.word 0x27f01904 -//.word 0x3b1d94c6 -//.word 0x9a524027 -//.word 0x8991a1ed -//.word 0xc76a97c1 -//.word 0x667dd7d8 -//.word 0xd83b9bd3 -//.word 0x4dec99e4 -//.word 0x3df63233 -//.word 0x405ced80 -//.word 0x26852309 -//.word 0x443ffcae -//.word 0x0c039a53 -//.word 0xe17b9386 -//.word 0x2941a561 -//.word 0xa3eaa5b2 -//.word 0xfa43b95a -//.word 0x9bdac7f3 -//.word 0xc4c02db6 -//.word 0xde8eb39b -//.word 0x0da6bdc1 -//.word 0x05bbc611 -//.word 0x1f94091f -//.word 0xac0c8150 -//.word 0x895e1442 -//.word 0xf49f0c68 -//.word 0x9d8cc6f5 -//.word 0x0086aefc -//.word 0xf3db6bd5 -//.word 0x7b4756c2 -//.word 0xe4bb31d2 -//.word 0x115c1606 -//.word 0x10cfadb3 -//.word 0xf1b4a227 -//.word 0xd970568f -//.word 0x5230d519 -//.word 0xe52b0955 -//.word 0xeb272de1 -//.word 0xa03e8345 -//.word 0x79e24a1c -//.word 0xb81feb75 -//.word 0x3d207378 -//.word 0x9ff5454d -//.word 0x7b931139 -//.word 0x0c1c000a -//.word 0xfc6131b6 -//.word 0x7aa6693f -//.word 0x8da506d9 -//.word 0xa8d5354f -//.word 0x7eeb65a3 -//.word 0x17a1fcf5 -//.word 0x24b748a5 -//.word 0x9038b8bc -//.word 0x57ff4c88 -//.word 0x9b794a87 -//.word 0xf5ad3387 -//.word 0x0979f50a -//.word 0x5d1e62ef -//.word 0x6bffe14f -//.word 0xf4a563a6 -//.word 0x98079933 -//.word 0xa40865a1 -//.word 0x2b428ee6 -//.word 0x5802b76c -//.word 0x0293926e -//.word 0x81c051a6 -//.word 0xc0945d25 -//.word 0x94644b82 -//.word 0x4c100c36 -//.word 0x8a856347 -//.word 0x51869c24 -//.word 0x5ead7cd0 -//.word 0xbcac7443 -//.word 0x93d9190e -//.word 0x41ead93d -//.word 0xabfce681 -//.word 0xd5db778f -//.word 0xb17d30c3 -//.word 0x35cfde09 -//.word 0xb0b568fd -//.word 0x5e4b0351 -//.word 0x3a72a46f -//.word 0x1388bb60 -//.word 0xe2761eed -//.word 0x5bf04304 -//.word 0xc2f8b35d -//.word 0x00a4bb5c -//.word 0xf622653a -//.word 0x11f9a760 -//.word 0x1f91d913 -//.word 0x61f66c56 -//.word 0xe1d9da0c -//.word 0x05d8d95e -//.word 0x65ffd45c -//.word 0xda8e9be7 -//.word 0xd7fc5ace -//.word 0xfd3dc837 -//.word 0xe941a041 -//.word 0x51bd55e7 -//.word 0x4f2d0228 -//.word 0xfc1a9f64 -//.word 0x41987b0a -//.word 0xea14e670 -//.word 0xfc4c2e02 -//.word 0x499fce9f -//.word 0x4187e140 -//.word 0x0b64dddb -//.word 0xd57b7d87 -//.word 0x683effe0 -//.word 0xffce90ad -//.word 0x59be05c0 -//.word 0x0d1acb1e -//.word 0x1ea72160 -//.word 0xcf6d8459 -//.word 0xb8736bf9 -//.word 0x1aca3571 -//.word 0x70cc6098 -//.word 0x46a6fb8e -//.word 0x4e145e9f -//.word 0xb16c186a -//.word 0xa3de2942 -//.word 0x3afa72d4 -//.word 0x8072690a -//.word 0xc7221130 -//.word 0x3c4d2a56 -//.word 0xbf2aa4f5 -//.word 0xf29f5ad5 -//.word 0x904cfd2d -//.word 0x01cb4e0d -//.word 0x2b3691f9 -//.word 0x8aea3ed6 -//.word 0x838bf90b -//.word 0xf549c4e0 -//.word 0x12617429 -//.word 0x6de66129 -//.word 0x53c162b1 -//.word 0x5ff7f988 -//.word 0x492aca0f -//.word 0xff635225 -//.word 0xf70ed549 -//.word 0xc34698fe -//.word 0xe6535174 -//.word 0xe671dc64 -//.word 0xa2d32f3c -//.word 0xe6e8907c -//.word 0x3ddd0660 -//.word 0x06630dbf -//.word 0xcab28d33 -//.word 0xcdce0d7a -//.word 0xe309241c -//.word 0x85c9314e -//.word 0x248b4c17 -//.word 0xbd287db1 -//.word 0xae572b32 -//.word 0xc874d76c -//.word 0xa5800a11 -//.word 0x3c688b1b -//.word 0xb28ad66a -//.word 0x7475caaf -//.word 0x82f0a28a -//.word 0x0e3f26ef -//.word 0x45a122ce -//.word 0x6d1d18f3 -//.word 0x307e322b -//.word 0x379d7aa8 -//.word 0xfbde4da6 -//.word 0xd8fd0d4f -//.word 0x640b17dc -//.word 0xfeb3f5fe -//.word 0xaac2d47c -//.word 0x1ce7381d -//.word 0x12b6eec8 -//.word 0xe7f343ea -//.word 0x650e7318 -//.word 0xdcea64f6 -//.word 0x70e29457 -//.word 0xb70e50a5 -//.word 0x84c22884 -//.word 0xfd589fb2 -//.word 0xf4302731 -//.word 0x74f44ca9 -//.word 0x99212f08 -//.word 0xa5c3366b -//.word 0x51800241 -//.word 0x61d7a1ad -//.word 0x7baa052d -//.word 0x39fab57a -//.word 0x7df3c3af -//.word 0x0528feac -//.word 0x3f1f68bd -//.word 0x5e10eb77 -//.word 0xadea47e3 -//.word 0x23974fdf -//.word 0x388155c0 -//.word 0xf855e33c -//.word 0x5607ac88 -//.word 0xc216c1bd -//.word 0xfe110880 -//.word 0x2d5aebe2 -//.word 0x2d2a4d85 -//.word 0x26d5c201 -//.word 0x634fff85 -//.word 0x61ef8fc2 -//.word 0x2674c804 -//.word 0xd446fea2 -//.word 0x7efef699 -//.word 0x3a279d74 -//.word 0x7846fa6f -//.word 0x921962db -//.word 0xa41debc4 -//.word 0x9d5223d2 -//.word 0x9642016d -//.word 0x63401b24 -//.word 0x68ee1a50 -//.word 0xae026bf4 -//.word 0x374938e8 -//.word 0x8eec9737 -//.word 0xa1f201c5 -//.word 0xd3060535 -//.word 0x4e7a3d09 -//.word 0x968d820b -//.word 0x64e95cec -//.word 0xb170bc2c -//.word 0x1138ee39 -//.word 0x42d4c9db -//.word 0x05d629cf -//.word 0x2c919fb3 -//.word 0xf5246622 -//.word 0x96b4991f -//.word 0x19f8a4b7 -//.word 0x6afbf9e2 -//.word 0xaf1d04ab -//.word 0xd75b6090 -//.word 0x76d14b2c -//.word 0xd07d5713 -//.word 0x334663fe -//.word 0x8b3dca28 -//.word 0x3022daf7 -//.word 0x022a88df -//.word 0xb8ff6184 -//.word 0x7509c41e -//.word 0x9cec4f22 -//.word 0xe652971f -//.word 0xb2ea1ce5 -//.word 0x9cb17ced -//.word 0x5070e6f5 -//.word 0xa185d2eb -//.word 0xd5e7ef0c -//.word 0x43655d4d -//.word 0x212e1dfa -//.word 0x9796c69d -//.word 0x17177921 -//.word 0xf1961637 -//.word 0x22e8b0f9 -//.word 0x6d953fcd -//.word 0xaedc958d -//.word 0x6af794e5 -//.word 0xaaa09dfc -//.word 0x0ad34b56 -//.word 0x0dd662f9 -//.word 0xb37702ce -//.word 0x4e95214b -//.word 0x91e1384f -//.word 0xeae63b4d -//.word 0x1247cfad -//.word 0xe248b86f -//.word 0x68909012 -//.word 0x3a2ebfb4 -//.word 0x0ad9a77a -//.word 0x7b7c1f32 -//.word 0x33f22337 -//.word 0x310dc995 -//.word 0x61de776e -//.word 0x6e30549d -//.word 0xd856fc98 -//.word 0x4627789b -//.word 0x1d466d03 -//.word 0x51a793f8 -//.word 0x7c4e694e -//.word 0x2d5a28ad -//.word 0x8243f5f0 -//.word 0xf9605acc -//.word 0x83acf7b2 -//.word 0xdac975f6 -//.word 0x1545bc30 -//.word 0x7a1d66e3 -//.word 0x937f735c -//.word 0x84d43edd -//.word 0x9bfeaffb -//.word 0x29deb345 -//.word 0x901ae926 -//.word 0x9e1d9f0d -//.word 0x195ffcca -//.word 0x9be67e3c -//.word 0xa00da829 -//.word 0xde84f46d -//.word 0xd5980f57 -//.word 0xa6b44550 -//.word 0x28283abd -//.word 0x392adc27 -//.word 0x521a9599 -//.word 0x5f0bc54a -//.word 0xcd7e6f7c -//.word 0xe47033a4 -//.word 0x57987ccb -//.word 0x19eafa34 -//.word 0x735f533f -//.word 0x54f8158d -//.word 0xe801f065 -//.word 0x6b932257 -//.word 0x405c321f -//.word 0x3da2e1cc -//.word 0x4a865e21 -//.word 0x2a86b93b -//.word 0x98469a74 -//.word 0x96903388 -//.word 0x029973f6 -//.word 0x6a867ca9 -//.word 0x212e58d8 -//.word 0x9222e72b -//.word 0xd5eb1c1f -//.word 0x809269ab -//.word 0xc0667824 -//.word 0xa8f91c5e -//.word 0xc86c8714 -//.word 0x02ecbd89 -//.word 0x997d4970 -//.word 0x8bf62e09 -//.word 0x214d208e -//.word 0xc415f4cd -//.word 0x12455616 -//.word 0x313bba57 -//.word 0x63019586 -//.word 0xdbcecc3f -//.word 0xd0d06caf -//.word 0xcf289db0 -//.word 0x5537d135 -//.word 0x9d1841e9 -//.word 0xb76d9a13 -//.word 0xda5ff3bd -//.word 0xfbe00315 -//.word 0x9e339113 -//.word 0xedaf2b5c -//.word 0x07c01b67 -//.word 0x9a2e97de -//.word 0xb4a23847 -//.word 0xd666aee3 -//.word 0x4b6cb1d6 -//.word 0xb7923a89 -//.word 0xf324f44d -//.word 0x18a2ed41 -//.word 0xdac49275 -//.word 0x18bcda4f -//.word 0xb0bbc12e -//.word 0x98b6f84e -//.word 0x2b6adbec -//.word 0xc09ea3aa -//.word 0x81a8dd34 -//.word 0x7b321b24 -//.word 0xf13ee923 -//.word 0xf6680251 -//.word 0x3b6bc4e8 -//.word 0x25e7e21c -//.word 0x22625945 -//.word 0x3e8ca53f -//.word 0xf1c73411 -//.word 0x3be61bce -//.word 0xf33508b9 -//.word 0x5dba77ac -//.word 0xfabb29bb -//.word 0xa481d214 -//.word 0xda5b1329 -//.word 0x58e5a712 -//.word 0xea89e12c -//.word 0x83475607 -//.word 0x89b2d77f -//.word 0x743ba228 -//.word 0x97b2d8f0 -//.word 0x3d0a32ff -//.word 0xf85df0e2 -//.word 0x362f13e9 -//.word 0x15f7cccd -//.word 0x79dc3496 -//.word 0x5bbc3dbc -//.word 0x6472e98d -//.word 0xba59bace -//.word 0x1a0c69a5 -//.word 0x2770dbb7 -//.word 0x01f5508d -//.word 0x1a18de3c -//.word 0x452d1e45 -//.word 0x105b25ba -//.word 0x54e8b5a2 -//.word 0x0ab6b59f -//.word 0x600edfce -//.word 0x0d9db9ef -//.word 0xe1bcc6c6 -//.word 0xa0f5fdc0 -//.word 0x10c27ada -//.word 0x519774bf -//.word 0x6d236f30 -//.word 0x30d4b2a9 -//.word 0x3a99fc42 -//.word 0x52eb73d3 -//.word 0xfd0edd5b -//.word 0x4f9412a3 -//.word 0x0224b11e -//.word 0xc5791314 -//.word 0xd6ad7dff -//.word 0xd3b89a36 -//.word 0xce3428c8 -//.word 0x9f63f1ab -//.word 0x7e72fd16 -//.word 0xd1ff062b -//.word 0x42da2cd9 -//.word 0x1508ea01 -//.word 0xb80e49d7 -//.word 0x9c6c538c -//.word 0x4467cb2a -//.word 0x9c0b1bbf -//.word 0x8b718ebd -//.word 0xcb3ebfa1 -//.word 0xf96c52d3 -//.word 0xe84de1cd -//.word 0x3bcc3980 -//.word 0x33f7c7f3 -//.word 0xc5ba4d2e -//.word 0xf0edd956 -//.word 0x4d92f819 -//.word 0xe857274d -//.word 0x4e638ad3 -//.word 0xe74ee1c2 -//.word 0x8671b7c1 -//.word 0x3f61dcb5 -//.word 0x79b6169d -//.word 0x431114b9 -//.word 0xec5da3f2 -//.word 0xcd542576 -//.word 0x6a453ea3 -//.word 0xba15d026 -//.word 0xc2852a64 -//.word 0x69b27c19 -//.word 0x87e28e3e -//.word 0x3f7db231 -//.word 0x8f5af810 -//.word 0x253ca065 -//.word 0x749dd509 -//.word 0x08aa9842 -//.word 0x168efa2f -//.word 0x58f38e66 -//.word 0x17c61edb -//.word 0x8a3b9d04 -//.word 0x5e125d3a -//.word 0x96188263 -//.word 0x95f0b7ce -//.word 0x79131f5e -//.word 0xab168eeb -//.word 0xb42cfae5 -//.word 0x53eb2c3a -//.word 0xcc53bb7a -//.word 0x820c3b3a -//.word 0xc8efb2b6 -//.word 0xf5c84bba -//.word 0xb65a4fc2 -//.word 0xa9a45060 -//.word 0x2763a8de -//.word 0x61d82224 -//.word 0xaecbf6dd -//.word 0x23d0fbd6 -//.word 0x65c918a6 -//.word 0xbbacfb94 -//.word 0x67870eb5 -//.word 0x37c1a755 -//.word 0x57a28098 -//.word 0x69156661 -//.word 0xd7ad3573 -//.word 0x68e703d7 -//.word 0x12af9c7d -//.word 0x10252f26 -//.word 0x34a04680 -//.word 0x7df3fb93 -//.word 0xecf0695d -//.word 0x942b62b9 -//.word 0xf1016086 -//.word 0x7ad8bd04 -//.word 0x79a72681 -//.word 0x1bba4d36 -//.word 0xc3afde6c -//.word 0xa4c5b5e3 -//.word 0x8f564e73 -//.word 0x09a17cf4 -//.word 0xa1cd5e5c -//.word 0x812b8f27 -//.word 0x42bc9efc -//.word 0x05f3be8d -//.word 0xbfbbbebf -//.word 0xd4bc3b0b -//.word 0xe8da1423 -//.word 0xf1ff1ed9 -//.word 0x911b193d -//.word 0xa469e306 -//.word 0x15f3ec34 -//.word 0xf558eaf3 -//.word 0xcecdcec1 -//.word 0x3462f6d3 -//.word 0x9e87a4b5 -//.word 0x74ceaf32 -//.word 0x69f27873 -//.word 0x0b19206b -//.word 0x9856f872 -//.word 0x1472392f -//.word 0x98ecf6bc -//.word 0xed3e4e05 -//.word 0x5a62e671 -//.word 0xb99597c5 -//.word 0xd05b6345 -//.word 0xdfc3ae1c -//.word 0x76ecaafd -//.word 0x89c8140b -//.word 0xc6201ef6 -//.word 0x26d8ac67 -//.word 0xc375c29f -//.word 0xe9dc3d5b -//.word 0x6f5cc2fa -//.word 0x48eff5e1 -//.word 0x55bdeb1f -//.word 0x7de2e14d -//.word 0x00712eb8 -//.word 0x08b976c3 -//.word 0x82c72186 -//.word 0x2b2c0bbb -//.word 0xee007ddb -//.word 0x6d265d84 -//.word 0xded2a11e -//.word 0x184909be -//.word 0xede80e4a -//.word 0xbb6816df -//.word 0x3e60e96f -//.word 0xa80b68af -//.word 0xf44c7d30 -//.word 0x77ef4ecb -//.word 0xb832b643 -//.word 0x8184f526 -//.word 0x368ca6f4 -//.word 0x666df283 -//.word 0xa04904a2 -//.word 0x8804bcfd -//.word 0x294aa841 -//.word 0x8dd33080 -//.word 0x8be510d6 -//.word 0xe11b0c4d -//.word 0x8366defe -//.word 0x32517479 -//.word 0x4f895867 -//.word 0xf29c706e -//.word 0x3701e755 -//.word 0xd8596b69 -//.word 0x01f4991f -//.word 0x5f97b5fa -//.word 0x7b7c9faf -//.word 0x469b0288 -//.word 0xf428cf06 -//.word 0x0e5deaca -//.word 0xc37923b5 -//.word 0x8009674f -//.word 0xc0663765 -//.word 0x247f5af7 -//.word 0xc6d8cf51 -//.word 0xcbd30677 -//.word 0x372f50c6 -//.word 0x05ce93d9 -//.word 0x78bb42aa -//.word 0xac6b8cf9 -//.word 0x7043d4f2 -//.word 0x585b620a -//.word 0x0d82582a -//.word 0xe882e70f -//.word 0xbfa5c2f1 -//.word 0xff77d362 -//.word 0xfbce2e7a -//.word 0x84084331 -//.word 0xba94570c -//.word 0x21b435fc -//.word 0xf8802083 -//.word 0xc62f0d18 -//.word 0x35920fcd -//.word 0x23e1132f -//.word 0xf7bacd6d -//.word 0x3167f2bd -//.word 0x4660a8fc -//.word 0xaa103b94 -//.word 0x2edc11a3 -//.word 0x8c62e05a -//.word 0x40fe1ea3 -//.word 0x9a93b906 -//.word 0x128809cd -//.word 0xdb100366 -//.word 0xbbafaf0a -//.word 0x19fadc9c -//.word 0x589e12d4 -//.word 0x63a3c89c -//.word 0x89f2d7ba -//.word 0x8c152fb0 -//.word 0xf43fc8e0 -//.word 0xa98cdcf4 -//.word 0xc189547d -//.word 0x97f780da -//.word 0x1dcc0a5c -//.word 0x737b2da8 -//.word 0xb875225c -//.word 0x20f0dbf5 -//.word 0x46e7f4f0 -//.word 0xc462e72f -//.word 0x02f77f9f -//.word 0x4b918f18 -//.word 0x2670e384 -//.word 0xe3717744 -//.word 0x7490e7cf -//.word 0x7eab279c -//.word 0xb0897443 -//.word 0x541a8adf -//.word 0x230018b6 -//.word 0x5e4f711c -//.word 0x1a918494 -//.word 0xdc0e0e39 -//.word 0x654a0e5c -//.word 0xcfce7a6f -//.word 0xd92b3021 -//.word 0x803d2fcb -//.word 0xcfad070b -//.word 0xf7b98eae -//.word 0xa238d5d4 -//.word 0x85d85a4e -//.word 0x34ab7f4b -//.word 0x3be23b34 -//.word 0x6ad810d4 -//.word 0x70523dbc -//.word 0xac0534e6 -//.word 0x3f584e98 -//.word 0x666cbe8b -//.word 0x0759c44d -//.word 0x89bb23e4 -//.word 0xe96ed4b4 -//.word 0x0a95fca3 -//.word 0x4de11c7a -//.word 0x6210878e -//.word 0x5eb31aa1 -//.word 0x0d352703 -//.word 0x8919b2fc -//.word 0x0b83e06f -//.word 0x02faacb7 -//.word 0x626cdcd5 -//.word 0x3f7233cd -//.word 0x9ad6e94d -//.word 0x7b535890 -//.word 0x409bf882 -//.word 0x349f8d25 -//.word 0x630a9f33 -//.word 0xad0e2b05 -//.word 0x1a6498b3 -//.word 0x6d8eec7d -//.word 0xfc604069 -//.word 0xbebe722e -//.word 0xa6a71951 -//.word 0x2f73be8e -//.word 0x39584979 -//.word 0x1333b965 -//.word 0xd9851885 -//.word 0x00bcae51 -//.word 0x2fb5762b -//.word 0x507ece43 -//.word 0xe86072b8 -//.word 0xa31dab00 -//.word 0x3476c489 -//.word 0x5bf0bea0 -//.word 0x47d84593 -//.word 0x1f85e212 -//.word 0xdcdd71db -//.word 0x591bd697 -//.word 0xadcfecfe -//.word 0xb825be42 -//.word 0xfc6bfaab -//.word 0xaecea27e -//.word 0x0d640524 -//.word 0xf370ee88 -//.word 0xaae11bc1 -//.word 0x001bf0f1 -//.word 0x9efa6d6d -//.word 0x95145e1e -//.word 0x3a3fd127 -//.word 0x3454cdc7 -//.word 0xd3324181 -//.word 0xa4053b7b -//.word 0x42c85a25 -//.word 0x6e08861a -//.word 0x62ebde4b -//.word 0x6372f25a -//.word 0x96fb3344 -//.word 0x140aa843 -//.word 0x4048e2f3 -//.word 0x59cc31b3 -//.word 0x4b9a184e -//.word 0xcb69ffdb -//.word 0xa2aa28e1 -//.word 0x49c5e4bf -//.word 0xb7a6074b -//.word 0x777899ba -//.word 0xfdb0cec0 -//.word 0x3a4e38f7 -//.word 0x6e5f3c85 -//.word 0x3ec7c3fa -//.word 0x063d3177 -//.word 0x70979b15 -//.word 0x46483584 -//.word 0x842709f3 -//.word 0xb272ef30 -//.word 0x7012b911 -//.word 0x5320ae12 -//.word 0xefa93a3f -//.word 0x35aee355 -//.word 0x006f7f24 -//.word 0xeaeaa437 -//.word 0x649e61b7 -//.word 0x06942b8d -//.word 0x23a01ac7 -//.word 0xa1e5563d -//.word 0x0797cc74 -//.word 0xd80525c2 -//.word 0x20d6f8b3 -//.word 0x4c923eac -//.word 0x3e6507ce -//.word 0xa1206c1d -//.word 0x7a81c5e2 -//.word 0x00b41c4e -//.word 0xae19e15f -//.word 0x9648de08 -//.word 0xf8536e8c -//.word 0x134bea2b -//.word 0x3b056500 -//.word 0x2c1d992a -//.word 0x9e3c202a -//.word 0x1a97e88c -//.word 0x0bb8e1ca -//.word 0x1881f86d -//.word 0xb16e4975 -//.word 0xe81a90fb -//.word 0x8305e115 -//.word 0x4f949afa -//.word 0xb7599566 -//.word 0x9495a240 -//.word 0x47fb347b -//.word 0x06b75a3a -//.word 0x73aff137 -//.word 0x73091965 -//.word 0x3dede5d4 -//.word 0xb18c57d5 -//.word 0xec618b60 -//.word 0x19b632b2 -//.word 0x896b423a -//.word 0x07f3ecb6 -//.word 0x659fcf9a -//.word 0x5b1f6bb1 -//.word 0x9246d806 -//.word 0xfb0db780 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00009B98 -//// expected output -//.word 0xa3481b7a -//.word 0x56b6ac36 -//.word 0x1213e5a6 -//.word 0x9c0e9959 -//.word 0x4c332567 -//.word 0xa0cd5181 -//.word 0x992dac5a -//.word 0xc6ff2367 -//.word 0x66768e75 -//.word 0x968685cd -//.word 0x44ae68ba -//.word 0x7a03c1d1 -//.word 0x471bdae0 -//.word 0x70deb899 -//.word 0xcbfc1690 -//.word 0xd4a69b47 -//// SHA512LongMsgvector_50 -//// vector length -//.word 0x00009EB0 -//// input message -//.word 0x4bff0a26 -//.word 0x0be42b8b -//.word 0xc0585e92 -//.word 0x0f78107e -//.word 0x83b7c261 -//.word 0x30e8c4d7 -//.word 0x979940f4 -//.word 0xcaa37b7b -//.word 0xd1ff5851 -//.word 0x4bdb1e31 -//.word 0x58ed7aa0 -//.word 0xb708c824 -//.word 0x2ced8eb1 -//.word 0x25634964 -//.word 0x9c8a6d74 -//.word 0x3f6ca765 -//.word 0xcfd5657e -//.word 0xc665987e -//.word 0x3ce3b88b -//.word 0x0bd4096b -//.word 0x324c1ef6 -//.word 0x77059bcb -//.word 0x51ae3f43 -//.word 0x048521a3 -//.word 0x0e283996 -//.word 0xc2a823da -//.word 0x33e02039 -//.word 0x53055ebb -//.word 0x5c7e791a -//.word 0x6ff54176 -//.word 0x7baebe4a -//.word 0x6117719f -//.word 0x56a1dd7f -//.word 0x88cf46ad -//.word 0x048cb993 -//.word 0xd7c24c7c -//.word 0x7328a703 -//.word 0x555cc3cb -//.word 0xe531f271 -//.word 0x9e4a20bf -//.word 0x6ee85823 -//.word 0x60008a5f -//.word 0x78918b81 -//.word 0xde345d16 -//.word 0x40f5b19b -//.word 0x7161aa34 -//.word 0x56e0e4a1 -//.word 0x0245b56d -//.word 0x20a4b268 -//.word 0x91637558 -//.word 0x57949eec -//.word 0xb28218f1 -//.word 0x888a9ec8 -//.word 0x0a2d7d18 -//.word 0x95639bc0 -//.word 0xd631b810 -//.word 0x327df438 -//.word 0x65229100 -//.word 0x6940fbba -//.word 0x99d50575 -//.word 0x16927674 -//.word 0x6ae7c4df -//.word 0x6b611fb7 -//.word 0x6235b10f -//.word 0x6d1d257a -//.word 0x226266c0 -//.word 0x753aa9d5 -//.word 0xdc55ad0b -//.word 0xb1b34186 -//.word 0xd7b808f0 -//.word 0xa082796f -//.word 0xee7a29d4 -//.word 0x99294d16 -//.word 0x114e7afe -//.word 0x452db023 -//.word 0xc3299719 -//.word 0x209508e6 -//.word 0x9ac8cfb5 -//.word 0xfc6fb0cf -//.word 0xc228a8c6 -//.word 0x7e4c74f3 -//.word 0x7a0b5823 -//.word 0x9fbf198e -//.word 0x957a4b09 -//.word 0x2ce1d37c -//.word 0xfb3ea495 -//.word 0x47d0ccbe -//.word 0x2666b44d -//.word 0xe32ca3fb -//.word 0xa5c48598 -//.word 0x4c98ebfd -//.word 0x9c6f5241 -//.word 0x9d3fa830 -//.word 0x41420cf8 -//.word 0x484cd626 -//.word 0x615cd7d1 -//.word 0x9271e215 -//.word 0xd99f8ac4 -//.word 0x14612e57 -//.word 0x1e31332b -//.word 0x3b5691ea -//.word 0xb6fe9146 -//.word 0xc88cd5ee -//.word 0xbc3398ba -//.word 0x51c43729 -//.word 0x60c4f00e -//.word 0xbec2ea86 -//.word 0x64e7762d -//.word 0xcdcf9592 -//.word 0xa097bae8 -//.word 0x8f38d1fe -//.word 0x7f137f71 -//.word 0xe9cdac20 -//.word 0x805c3fe0 -//.word 0x14622871 -//.word 0xb6baa4b1 -//.word 0x1d51bc10 -//.word 0x48380f44 -//.word 0x65f7d23e -//.word 0xf223155c -//.word 0x223348e0 -//.word 0x828ffda1 -//.word 0xdceaf000 -//.word 0x5bd2441e -//.word 0xf1850f4c -//.word 0xf60719c3 -//.word 0x1271e196 -//.word 0x5c8ce1e4 -//.word 0xc39e1352 -//.word 0xae84b4b8 -//.word 0xdf01481b -//.word 0x9d56dedc -//.word 0x1213952e -//.word 0xf22c5fcd -//.word 0x5d4f05ee -//.word 0x07756c71 -//.word 0x96b8165e -//.word 0x4b64eb8f -//.word 0xe5503aaa -//.word 0xc26ffb53 -//.word 0x48a2579f -//.word 0x83d06acb -//.word 0x0f39472e -//.word 0x39073c6c -//.word 0x612658ed -//.word 0xa3562b8d -//.word 0xb67fcd95 -//.word 0x134422eb -//.word 0x5ada5b85 -//.word 0xf21bc023 -//.word 0xf0d6ad3e -//.word 0x3b6adb3b -//.word 0xed93e1e5 -//.word 0xfc83fb1a -//.word 0x193509c4 -//.word 0xd8fedb0c -//.word 0x1265abca -//.word 0x8834eb3f -//.word 0xc8cf4206 -//.word 0x55c5d148 -//.word 0x02a5ba30 -//.word 0x9f13e39e -//.word 0xd71af720 -//.word 0x59c4ae1e -//.word 0x36e84f54 -//.word 0x8a447385 -//.word 0x5fcb0b6e -//.word 0xce40a4fa -//.word 0x6704eab4 -//.word 0xd42d6b81 -//.word 0xb8d79e8f -//.word 0xddbf2489 -//.word 0x8f0e4d0d -//.word 0x4372de5f -//.word 0x7d73125f -//.word 0xf005deb8 -//.word 0xe659795b -//.word 0xe2f91c2c -//.word 0x841407fa -//.word 0xae16c4b5 -//.word 0xe57cafdb -//.word 0xfae7b634 -//.word 0xe96f5ebf -//.word 0x013906ec -//.word 0x454c700b -//.word 0x13a07d05 -//.word 0x0378384a -//.word 0x12f2160a -//.word 0x00dd7da8 -//.word 0xf6ca826c -//.word 0x6c66f778 -//.word 0x4a07a5fd -//.word 0x4d84d6ae -//.word 0xad4a1775 -//.word 0xfdac3b65 -//.word 0x527ba3f1 -//.word 0xa7d7bd5b -//.word 0x8044cb6f -//.word 0xce01e670 -//.word 0x13954253 -//.word 0xc6aab32b -//.word 0xf91e70e5 -//.word 0x39581835 -//.word 0xb6d8f2d0 -//.word 0xa41279dc -//.word 0xe07d18a4 -//.word 0xd7e73291 -//.word 0xa40b6556 -//.word 0x7865106a -//.word 0x3f4512bb -//.word 0x8023d5a1 -//.word 0x85328c10 -//.word 0xbd37b813 -//.word 0x5e9cf175 -//.word 0x4ec0e3c1 -//.word 0x4492976e -//.word 0x2b5ef453 -//.word 0xc7e78561 -//.word 0x9ab57c90 -//.word 0x09b0f71a -//.word 0xbbee83e8 -//.word 0x42cade49 -//.word 0xfd3602ea -//.word 0x3c525e03 -//.word 0xa63d67ce -//.word 0xd82a4f3d -//.word 0x4fb714ec -//.word 0x887bbd55 -//.word 0x65dee143 -//.word 0xd32e6889 -//.word 0xaaef95f3 -//.word 0xd572457d -//.word 0xb2a971c3 -//.word 0xbb39fab9 -//.word 0x67d1a69c -//.word 0x4bba6528 -//.word 0x85b0da0c -//.word 0x5af1169b -//.word 0x1e93a7c4 -//.word 0x541ad144 -//.word 0x174a1b1a -//.word 0xb93a0e3b -//.word 0xa9aa3988 -//.word 0x9a9678fd -//.word 0xe10c762b -//.word 0x1f3a71e8 -//.word 0x21cb3d45 -//.word 0x04748cc0 -//.word 0x9dc96cbb -//.word 0x1856112d -//.word 0xdeebd598 -//.word 0xbd377d3b -//.word 0x4398be88 -//.word 0x6a3200d8 -//.word 0x7b3f615e -//.word 0x2ca5fd59 -//.word 0x0bce6d8e -//.word 0x20b48df6 -//.word 0xce3b82b4 -//.word 0xfbc4fc49 -//.word 0x71ffb90b -//.word 0x83004bd4 -//.word 0xf3961af7 -//.word 0x13d8ac78 -//.word 0x2b00247c -//.word 0x1b7d09fe -//.word 0x414349c4 -//.word 0x9d667e91 -//.word 0x33e76f9d -//.word 0xb1ceda42 -//.word 0x527871f8 -//.word 0x02332283 -//.word 0xc3089b6b -//.word 0x4fd80ead -//.word 0xffab31b0 -//.word 0xeb448a7a -//.word 0x53f9e924 -//.word 0x3ec1368b -//.word 0x608f6c49 -//.word 0x41dee6e4 -//.word 0x9c8dda44 -//.word 0x05ee236b -//.word 0xcf1a4360 -//.word 0x2d87a86c -//.word 0x97dc2e89 -//.word 0x7003e618 -//.word 0xe58016d2 -//.word 0x18028001 -//.word 0x7e38e7f0 -//.word 0x85e6d0a0 -//.word 0x7b3886bc -//.word 0xab5660cf -//.word 0xc93846b5 -//.word 0x90bc7250 -//.word 0xa9f6747c -//.word 0xcfc77944 -//.word 0x31b1cc56 -//.word 0x17e99db4 -//.word 0xc9ae02ad -//.word 0xadda3b0c -//.word 0xafb73a8f -//.word 0xe513639a -//.word 0x7397902d -//.word 0xad545814 -//.word 0x7c9f915d -//.word 0x031f130f -//.word 0x8224bf19 -//.word 0x7a3ac089 -//.word 0x12ff11fe -//.word 0xb9313f60 -//.word 0x0d0b71ce -//.word 0xfbd2a5d8 -//.word 0x28ab3cef -//.word 0x90afb919 -//.word 0x6e41c6ea -//.word 0x5b9f78af -//.word 0xb9b8d3ec -//.word 0x523e9109 -//.word 0x3dfb1f48 -//.word 0x0268e9fa -//.word 0xfd7cd7f3 -//.word 0x08c2173b -//.word 0x54ae1e06 -//.word 0x9831e9e6 -//.word 0x6e8b8940 -//.word 0xf961defd -//.word 0xcc0fa381 -//.word 0x073faae1 -//.word 0xc3bb6950 -//.word 0xb17fb6db -//.word 0xfd13cf57 -//.word 0x79179d97 -//.word 0xf71f3ae2 -//.word 0xf6c2b0a3 -//.word 0x82ee0463 -//.word 0x557e73f5 -//.word 0x420ffbf0 -//.word 0xd40f1d63 -//.word 0x3216e2c3 -//.word 0x457a1c28 -//.word 0x1d1eeeb9 -//.word 0x918a8e65 -//.word 0x26414ad5 -//.word 0x334ec99e -//.word 0x422194ba -//.word 0xb899d439 -//.word 0xb9625e34 -//.word 0x4681ec03 -//.word 0xa82dadaf -//.word 0x12e101aa -//.word 0x82af7dbe -//.word 0xe8d73644 -//.word 0x8a983c96 -//.word 0xa74664c7 -//.word 0x5a9d4b91 -//.word 0xc255978e -//.word 0x60f680ab -//.word 0xc0ee90db -//.word 0x5ce1a608 -//.word 0xbd40414f -//.word 0xe31dfb6c -//.word 0xe73e5473 -//.word 0xdf70b1c2 -//.word 0x021da533 -//.word 0x0d216e96 -//.word 0xe5dac35e -//.word 0x7d7ecd9a -//.word 0xfab27327 -//.word 0x1558da24 -//.word 0xc1a82ca7 -//.word 0x0e8299ae -//.word 0x4e029c59 -//.word 0x76568056 -//.word 0xc7cc229c -//.word 0xad2ff85c -//.word 0xe7545234 -//.word 0xe8f0e0a7 -//.word 0x7dac75ca -//.word 0xb17c0a3f -//.word 0xee2c0667 -//.word 0x643cbdd4 -//.word 0xaeed36fd -//.word 0xb39c3136 -//.word 0xcb4f68df -//.word 0x248e16db -//.word 0x6374b644 -//.word 0x8e050d5c -//.word 0x29c26ac7 -//.word 0x9f7b2df8 -//.word 0xe46586ea -//.word 0x596c7f10 -//.word 0xf0ca3d8e -//.word 0x90d982a9 -//.word 0xbb25777c -//.word 0x6ec6a9ed -//.word 0x48ed51e0 -//.word 0xefbcd8ab -//.word 0xb05b9ac9 -//.word 0x6548ebd2 -//.word 0x9cee57aa -//.word 0xf57a2ef9 -//.word 0xccea41dc -//.word 0x1866e6db -//.word 0x93d4421a -//.word 0x1ca7c7d3 -//.word 0x59f7fb03 -//.word 0xa0d77b64 -//.word 0x18e3409c -//.word 0x1b1822b4 -//.word 0xdfe99acb -//.word 0x568ecc0c -//.word 0x52a0c5dd -//.word 0xede30159 -//.word 0x28633001 -//.word 0xd2c239ae -//.word 0xacd080cb -//.word 0xca5c65c0 -//.word 0x3c4a0db1 -//.word 0xeee66469 -//.word 0xcd786291 -//.word 0x2b198e26 -//.word 0x65c4c12a -//.word 0xc3b02d99 -//.word 0x9fdd9d9e -//.word 0xcaedfe07 -//.word 0x2b361ff7 -//.word 0xa915b5da -//.word 0x4c85a29e -//.word 0x9ef07721 -//.word 0x584537e5 -//.word 0x3a4a5e0b -//.word 0x3b34217f -//.word 0xe275f870 -//.word 0xf4d55a03 -//.word 0x4fc4c748 -//.word 0x16ee0c6d -//.word 0x0e11c331 -//.word 0x480b199c -//.word 0x0138d4ed -//.word 0xc6fa94d5 -//.word 0xdc9958e2 -//.word 0xde4e453e -//.word 0xa89aa399 -//.word 0x74dc2964 -//.word 0x43237a40 -//.word 0x7f41efb6 -//.word 0xde219728 -//.word 0x895a7c07 -//.word 0x7e032847 -//.word 0x32ca6810 -//.word 0x7b4050b7 -//.word 0xae777fec -//.word 0x04cfa535 -//.word 0x430d429b -//.word 0x9aadb0a2 -//.word 0xcc7a637f -//.word 0x915b7086 -//.word 0x39704ce2 -//.word 0x925dd688 -//.word 0x0ce6986e -//.word 0x1bbd4af7 -//.word 0xdd9798b2 -//.word 0xfd852645 -//.word 0xd782d0a4 -//.word 0xdc483687 -//.word 0x3869781a -//.word 0xb39a3ef6 -//.word 0xd552fc50 -//.word 0x4e947470 -//.word 0x95087c65 -//.word 0xce5101f8 -//.word 0xf19b4cde -//.word 0x29738432 -//.word 0x7adc7422 -//.word 0xa79f8fe8 -//.word 0x53e231fc -//.word 0x66fc2887 -//.word 0xb288731b -//.word 0xd7b849a2 -//.word 0x63ed5e95 -//.word 0x3e84616f -//.word 0x46f2c960 -//.word 0x3613d145 -//.word 0xccbfc1d8 -//.word 0x2b9f7024 -//.word 0x7e3e073d -//.word 0xde63072d -//.word 0x769f8e31 -//.word 0xe422d626 -//.word 0xe3d2fe3e -//.word 0x279f0df7 -//.word 0x8910344e -//.word 0x6422532f -//.word 0x3f53bf31 -//.word 0xacfa4380 -//.word 0x6fd9641a -//.word 0xe3f5e93f -//.word 0x9aa69b22 -//.word 0x44ea4ae5 -//.word 0xd2fe10c4 -//.word 0xdb30da91 -//.word 0x3eef2360 -//.word 0x09240383 -//.word 0x99c569b9 -//.word 0x03a6a4a2 -//.word 0xb3932976 -//.word 0x539d90f7 -//.word 0xefb1dfa4 -//.word 0x566f0b30 -//.word 0xc338bc32 -//.word 0xbc89511e -//.word 0x3b882474 -//.word 0x0cdd0f37 -//.word 0x76c32fa1 -//.word 0x1d5fe715 -//.word 0x27502855 -//.word 0x9e87f0f5 -//.word 0x15591110 -//.word 0x8fd23439 -//.word 0x9c4d1db4 -//.word 0xc54131e7 -//.word 0x2a5e350b -//.word 0x6ad95827 -//.word 0xc304743f -//.word 0x7b2191c8 -//.word 0x7e78ab60 -//.word 0x48a7b5bc -//.word 0x053adde2 -//.word 0xf77b1298 -//.word 0x198bc31c -//.word 0x02b2ea15 -//.word 0x0bf44aca -//.word 0xb4e5f492 -//.word 0x44be108b -//.word 0xb0afda8f -//.word 0xbe77eb64 -//.word 0x6a33ba33 -//.word 0x8973623c -//.word 0xac93a6c7 -//.word 0x4749325e -//.word 0x137a2339 -//.word 0xb052cafa -//.word 0x8f93ad9b -//.word 0x0f2dcfa4 -//.word 0xe61032a1 -//.word 0xc33e99d3 -//.word 0x32249226 -//.word 0xbf2ab463 -//.word 0x5e8926a7 -//.word 0x0a5c6114 -//.word 0xadfb36c6 -//.word 0x40841208 -//.word 0x33ba81c8 -//.word 0x0f13f149 -//.word 0x5a0cb918 -//.word 0xbbc05941 -//.word 0x5eb903c2 -//.word 0x9a065b40 -//.word 0xd18d7cf9 -//.word 0x98a33bfa -//.word 0x18daaf92 -//.word 0xb41af106 -//.word 0xedf42086 -//.word 0x8232a860 -//.word 0xdbb3c474 -//.word 0xa77642e8 -//.word 0xc5f4871d -//.word 0x60b3d2e1 -//.word 0x5f18c5e6 -//.word 0xfc7d2172 -//.word 0xb283d159 -//.word 0x5da92a29 -//.word 0x9d1e71a4 -//.word 0x7bd49d73 -//.word 0x4fd65f18 -//.word 0xe1db6025 -//.word 0xce1bcaab -//.word 0x2d6109f6 -//.word 0x7362d377 -//.word 0x944d6502 -//.word 0x6ba3103a -//.word 0x5c49f549 -//.word 0x38dc0dd4 -//.word 0x60446c2d -//.word 0x2e8cc6cb -//.word 0x90f032f8 -//.word 0xf6382eca -//.word 0x6f45e354 -//.word 0x0eeaab1d -//.word 0x93fdd1d2 -//.word 0x47ad9837 -//.word 0x28157e63 -//.word 0x4612c12d -//.word 0x6d5223e2 -//.word 0x04aeea39 -//.word 0x35ba2c88 -//.word 0x4f9a4937 -//.word 0x6817b975 -//.word 0x46f2082b -//.word 0x80771e2e -//.word 0xe056c4b9 -//.word 0x0caf641a -//.word 0x656c10ab -//.word 0x30d3c604 -//.word 0xf45bf36f -//.word 0x22bf359d -//.word 0xfb526597 -//.word 0xaf92d5f6 -//.word 0xc2ffd657 -//.word 0xb42e7e0a -//.word 0xe119a80a -//.word 0xa6b93b32 -//.word 0xc5d7b0ad -//.word 0x0b1fceaf -//.word 0x3076b862 -//.word 0xfe8d2a24 -//.word 0xb5b600ef -//.word 0xaff7f818 -//.word 0x405db83d -//.word 0xe0931379 -//.word 0x8cb388d9 -//.word 0x695c0b14 -//.word 0xab050976 -//.word 0xb591a61e -//.word 0x81234969 -//.word 0x43335aae -//.word 0x49e24a2c -//.word 0x268ad440 -//.word 0x0f9a83dc -//.word 0x85a17534 -//.word 0x35a85eba -//.word 0x1cc5cf4d -//.word 0xeeedb9ad -//.word 0xb90a2d33 -//.word 0xc54d65bf -//.word 0xc0c608f1 -//.word 0x1732aa9c -//.word 0xa7149277 -//.word 0x9507c116 -//.word 0x7a523019 -//.word 0xc4bd58a4 -//.word 0x59a3f70f -//.word 0x7d4912de -//.word 0xf56e36f3 -//.word 0x6c230402 -//.word 0x17dded46 -//.word 0x95c93972 -//.word 0x195f4eeb -//.word 0xca3a2f34 -//.word 0x6a2743a9 -//.word 0x367c5871 -//.word 0x0eabe7ae -//.word 0xd61699f6 -//.word 0x1c250b07 -//.word 0xfb96ceb6 -//.word 0x3f15b329 -//.word 0xc90d4546 -//.word 0x36bd966b -//.word 0xbb8e3f60 -//.word 0x53a4a28a -//.word 0x1db37261 -//.word 0xff147624 -//.word 0x901889cb -//.word 0x359ce63d -//.word 0x8adda2c3 -//.word 0x038e7abc -//.word 0xd328cf93 -//.word 0x0c82efef -//.word 0x08a19629 -//.word 0x09d1b503 -//.word 0x1cf47197 -//.word 0x431b6f8d -//.word 0xd2534f91 -//.word 0x1ac27604 -//.word 0x45f211f2 -//.word 0x816c5645 -//.word 0x61890d38 -//.word 0x7f85500e -//.word 0x67d58f03 -//.word 0xb0bad783 -//.word 0x6c17539a -//.word 0xc38013ac -//.word 0xda930c66 -//.word 0xfa8b60f4 -//.word 0xee12e074 -//.word 0xac57cfab -//.word 0x3861e9f7 -//.word 0xc6a3a485 -//.word 0x1fd0b6c4 -//.word 0x45f0d71a -//.word 0x5ab4c8d5 -//.word 0xbe069464 -//.word 0x78e516c7 -//.word 0xd770bb44 -//.word 0x58408a5c -//.word 0xcbfb61fd -//.word 0xb22681f9 -//.word 0xea3b4cb7 -//.word 0x8dfc4e29 -//.word 0x16067bfd -//.word 0xc6a9b718 -//.word 0x47f79c40 -//.word 0x901b7718 -//.word 0x08ed9352 -//.word 0xeec3bb20 -//.word 0xf889faeb -//.word 0x3a14a548 -//.word 0x4ab39b28 -//.word 0xa207cc4e -//.word 0x4515f807 -//.word 0xa69ab915 -//.word 0xc59ec4ec -//.word 0x9b4c6c21 -//.word 0xb801681f -//.word 0x2ba3d51c -//.word 0xa2347f4b -//.word 0xd2a75c53 -//.word 0x19f25901 -//.word 0x62645939 -//.word 0x4a397b33 -//.word 0x816c9ce4 -//.word 0x72cc1eb9 -//.word 0x2652e78b -//.word 0x65b2acd0 -//.word 0x1f306f0e -//.word 0x0bb54696 -//.word 0x8e225f6e -//.word 0xdee4418f -//.word 0x67c95450 -//.word 0x6e11a423 -//.word 0xf4c9e27f -//.word 0xdd54ac1d -//.word 0x514b0d67 -//.word 0x6387482e -//.word 0xf07bd19b -//.word 0xcac79d68 -//.word 0x160b9b4f -//.word 0xf3f983c3 -//.word 0x5dafcedf -//.word 0x5043059c -//.word 0x309f3f46 -//.word 0x688fe631 -//.word 0x5218b9a8 -//.word 0x570c1726 -//.word 0x57db7ac9 -//.word 0x4aac4203 -//.word 0x28acb493 -//.word 0x07a642b3 -//.word 0x83d50c93 -//.word 0x63f6a807 -//.word 0x7aa01e7c -//.word 0xcad83731 -//.word 0xf0e1f8a4 -//.word 0xbc51694a -//.word 0x1f6a9b82 -//.word 0x4aa6e8cc -//.word 0x14947d36 -//.word 0x9ce31618 -//.word 0x30bc0901 -//.word 0x6e5686f1 -//.word 0xa9c41dc9 -//.word 0x8f1180ff -//.word 0x088e8b96 -//.word 0x616b814e -//.word 0xa9859918 -//.word 0x5b7fb9cc -//.word 0x3e14811e -//.word 0x8aab8bcf -//.word 0x4c2cf120 -//.word 0x0b13108c -//.word 0xacc38cb6 -//.word 0x931c95a1 -//.word 0x0b4f681f -//.word 0xe8f1188c -//.word 0x6b4f8ebb -//.word 0x6502ce31 -//.word 0x9fc37d91 -//.word 0x7a80a058 -//.word 0xd3afa7ca -//.word 0x29e2aa2d -//.word 0x029bf234 -//.word 0x8a62bbbe -//.word 0x7e1638c1 -//.word 0x4881d880 -//.word 0x6c2ec805 -//.word 0x227fb9cb -//.word 0x44fae3bb -//.word 0x6be44a59 -//.word 0x56114040 -//.word 0x8bfa2bcc -//.word 0x40108816 -//.word 0x7b503025 -//.word 0x7918da62 -//.word 0x4d39e24d -//.word 0xc94d496f -//.word 0xa14bfc8f -//.word 0xce585929 -//.word 0x31e0ef1c -//.word 0x79e685a3 -//.word 0x46985e86 -//.word 0x8e27bc92 -//.word 0x41d5a346 -//.word 0x2850dfcf -//.word 0x133e4937 -//.word 0x331945d9 -//.word 0xc53d8f18 -//.word 0xf03f3850 -//.word 0xf181eb0d -//.word 0x7503757b -//.word 0x467c841e -//.word 0x2aaaafc3 -//.word 0x09e6b7b7 -//.word 0x4dfb0d36 -//.word 0x8e389426 -//.word 0x6fc4a706 -//.word 0xc3325e21 -//.word 0xf5550d07 -//.word 0xa6560e3d -//.word 0x9703c134 -//.word 0xca6ad078 -//.word 0xe4a7b82a -//.word 0xd6fa85b0 -//.word 0xbc1ddcab -//.word 0x05d43f29 -//.word 0xd5c58d1d -//.word 0xa78ac80c -//.word 0x37051b08 -//.word 0x9ff31ce2 -//.word 0xc0c44e9c -//.word 0xe3abea1d -//.word 0xa0f1df28 -//.word 0x008e178f -//.word 0xdefafca4 -//.word 0x93413bf1 -//.word 0xd256c729 -//.word 0xd0a9225e -//.word 0xa8fbd873 -//.word 0xff714cd5 -//.word 0xe3e8b666 -//.word 0xf9896dba -//.word 0xd89d6286 -//.word 0xb0a2ed55 -//.word 0x2f9ecd7d -//.word 0xa5b36a52 -//.word 0x66f45c99 -//.word 0x70773140 -//.word 0x4dab6b4c -//.word 0x3becc912 -//.word 0x8b55c8aa -//.word 0x47d668a1 -//.word 0x178633ee -//.word 0x653a7c27 -//.word 0xc056e5f5 -//.word 0x7ee324c6 -//.word 0xa6e206c1 -//.word 0x0de0b3ff -//.word 0xbecb35f8 -//.word 0x9f04343b -//.word 0x52b50363 -//.word 0x5a65e146 -//.word 0x7fca786f -//.word 0x73deaacf -//.word 0xb5358daf -//.word 0xb68db4e9 -//.word 0x3ba7b158 -//.word 0x0255d78d -//.word 0xa8d545c3 -//.word 0xca5d2015 -//.word 0x6bf71fef -//.word 0x958f4dc3 -//.word 0x434a0afd -//.word 0x7f1a5338 -//.word 0xc89044b2 -//.word 0xb6f1dbfd -//.word 0xe18bfff8 -//.word 0xfe49c1fe -//.word 0x4b86e15d -//.word 0x2e1f940a -//.word 0x18cc8493 -//.word 0xb0b01954 -//.word 0x2e2ef7ee -//.word 0x04ffc8f5 -//.word 0xc4813be9 -//.word 0x3e524c68 -//.word 0xe81ec7a1 -//.word 0x84b5070c -//.word 0xfc610459 -//.word 0x91768da6 -//.word 0x342ad1f4 -//.word 0x34a724dc -//.word 0x1a5f007e -//.word 0xd2a04abb -//.word 0x0b68d7a4 -//.word 0xdf7a2f31 -//.word 0xb7b19137 -//.word 0x69953794 -//.word 0xa42cdaac -//.word 0x8e13791a -//.word 0xabcc579f -//.word 0x015a435e -//.word 0x7a0b1b4c -//.word 0x899693e2 -//.word 0x10653315 -//.word 0x82349f87 -//.word 0x45db1bff -//.word 0x5a684e17 -//.word 0x3f714634 -//.word 0x14a9bdbb -//.word 0xfeb09b82 -//.word 0xc930bc85 -//.word 0xd125f2db -//.word 0x227c4ee8 -//.word 0xdee09bd3 -//.word 0xdfd12c3a -//.word 0x9ef6d825 -//.word 0x53b44239 -//.word 0x5eff5e2f -//.word 0xe6703084 -//.word 0xc098d771 -//.word 0x9295cb1d -//.word 0x38e26312 -//.word 0x66749aed -//.word 0x8f02125a -//.word 0x06a45940 -//.word 0x649f6c39 -//.word 0x297f7945 -//.word 0xa667e9bf -//.word 0x1aa69e90 -//.word 0x1b8a79a2 -//.word 0x37792098 -//.word 0xdc3dfebc -//.word 0x75a08b38 -//.word 0xd639cd8a -//.word 0xda851f32 -//.word 0x4a3a31ad -//.word 0x01d750a7 -//.word 0x4e80e76d -//.word 0x9a0946a1 -//.word 0x4b51a331 -//.word 0xe8d15e89 -//.word 0x7d748a08 -//.word 0x41a9a8b1 -//.word 0x76b7b524 -//.word 0x915268cc -//.word 0x9b6bb559 -//.word 0xd74c9571 -//.word 0xa5e309a2 -//.word 0xa65e5c9c -//.word 0x21f9a99d -//.word 0xa5149e2c -//.word 0xf0897f0a -//.word 0x103c6e66 -//.word 0xc8f4e950 -//.word 0x35699470 -//.word 0xb19e39f8 -//.word 0xf8700dd7 -//.word 0x8a6f3530 -//.word 0x50ee880a -//.word 0x81569749 -//.word 0xc7c0eadd -//.word 0x9ec28d39 -//.word 0xfd88cc06 -//.word 0x39273a19 -//.word 0x262ff8a3 -//.word 0x7f7f33a8 -//.word 0x885eefb3 -//.word 0xf1c703c7 -//.word 0xfe036598 -//.word 0xe57ea8fb -//.word 0x78d3c39c -//.word 0x032914ef -//.word 0x78c2a569 -//.word 0xc9d1adef -//.word 0x968c5a8f -//.word 0x0883cd6e -//.word 0xfd306701 -//.word 0x65cf4380 -//.word 0xeb700398 -//.word 0xd94ad061 -//.word 0x35529c8f -//.word 0x300caaec -//.word 0xc2a15106 -//.word 0x8e33fd24 -//.word 0x0b6d767f -//.word 0xe55e65af -//.word 0xa1871464 -//.word 0x81327556 -//.word 0xa706667f -//.word 0x7cd93387 -//.word 0x53c55c80 -//.word 0x4a7e99d3 -//.word 0x71e21c7a -//.word 0x2fd21670 -//.word 0xe1417c66 -//.word 0xc38a0bb8 -//.word 0x14078a9f -//.word 0x75df4fa8 -//.word 0x931f0465 -//.word 0x050dab62 -//.word 0x78b9e05a -//.word 0x09d45eab -//.word 0xf2c5c508 -//.word 0x69fa9b6e -//.word 0xc57c9059 -//.word 0xe3c70637 -//.word 0xc8d8d01d -//.word 0x87873ab9 -//.word 0x65174a88 -//.word 0x3c0c4648 -//.word 0x1d3c76b1 -//.word 0x39292b60 -//.word 0x028e0114 -//.word 0x8d38601c -//.word 0x3b174910 -//.word 0x98954fc0 -//.word 0x8326e36a -//.word 0x9021d530 -//.word 0xaace18c8 -//.word 0xfdc0c676 -//.word 0x13656337 -//.word 0x3cdb663f -//.word 0x3405f5a6 -//.word 0x00dff15f -//.word 0x190e3269 -//.word 0xccbc1449 -//.word 0xe1a232b7 -//.word 0x7b667198 -//.word 0x3f28412c -//.word 0xb8581f89 -//.word 0xfaca5e48 -//.word 0x860c287e -//.word 0x6ef7c0ee -//.word 0xba84097c -//.word 0x09e14ce5 -//.word 0x7cc436ae -//.word 0xcf00205a -//.word 0xc95694e0 -//.word 0xd78d0c5c -//.word 0xf4c4fc05 -//.word 0xcb08135f -//.word 0x2022beb2 -//.word 0x6cb2efba -//.word 0xc7821ca0 -//.word 0x0b148a29 -//.word 0x377dcb2e -//.word 0x1176864c -//.word 0x10b176dc -//.word 0x7869b525 -//.word 0xc73d3bd1 -//.word 0x503ea19e -//.word 0x26472b56 -//.word 0x3b8d0601 -//.word 0xc976ce59 -//.word 0xf1af547e -//.word 0xa3799deb -//.word 0xbd432ea9 -//.word 0x777e86c2 -//.word 0xfeadedf9 -//.word 0x5fbb6cb8 -//.word 0xa7921d4a -//.word 0x48e9a54a -//.word 0xbf5dfe5c -//.word 0x74c47a1b -//.word 0xe2be0452 -//.word 0xf78ca96e -//.word 0xbe265833 -//.word 0x3b87e6af -//.word 0x974c556c -//.word 0x7d7d56ea -//.word 0xc3ab0c4c -//.word 0x4d3b1352 -//.word 0x2e01c187 -//.word 0x1111acbc -//.word 0xd8d16cb4 -//.word 0x8253a221 -//.word 0x52e239cf -//.word 0x2ddbeb20 -//.word 0x45bf07b8 -//.word 0xf4857279 -//.word 0xea35ecb2 -//.word 0x8bb29593 -//.word 0x93d7b0e5 -//.word 0xfcc6a6f8 -//.word 0x217d4edc -//.word 0x23ab6bd3 -//.word 0x8cc17707 -//.word 0x324b9f79 -//.word 0x5f810e3a -//.word 0x2e196edd -//.word 0x3860ac2c -//.word 0x7089fc1a -//.word 0x4c451ef9 -//.word 0x2694dfed -//.word 0xe1dae2a1 -//.word 0xcf35a038 -//.word 0xd20eae87 -//.word 0xc2ee3f81 -//.word 0x0f93e9f2 -//.word 0xa844ac71 -//.word 0x1b61308f -//.word 0xfd3e4e55 -//.word 0x8c31d2ee -//.word 0x93ea7fa0 -//.word 0x8e035401 -//.word 0x0fd80e67 -//.word 0x6099eea0 -//.word 0x6a9ebce3 -//.word 0xd5fa0c07 -//.word 0x7152c0f3 -//.word 0xd5f0ce56 -//.word 0x46134498 -//.word 0xda898910 -//.word 0xdc80e577 -//.word 0x739a439c -//.word 0x7f3f365a -//.word 0xc4373bc7 -//.word 0x4a783eaf -//.word 0x033c5f41 -//.word 0xaf57f507 -//.word 0xfdc8d31c -//.word 0xf38ecb99 -//.word 0x8fbd7150 -//.word 0xafd021bd -//.word 0x2e414439 -//.word 0x5057ce71 -//.word 0x60400b17 -//.word 0x975f9cd7 -//.word 0x40e7bd8d -//.word 0x1aa9c9b5 -//.word 0xfe2aff22 -//.word 0xc1f986f4 -//.word 0x5c3fafc4 -//.word 0x4a987b21 -//.word 0x32215d40 -//.word 0xc6d340ef -//.word 0xeb0fcccb -//.word 0x1a79e5b3 -//.word 0x060a757c -//.word 0x7f616ce6 -//.word 0x965a05cf -//.word 0x02e24aa7 -//.word 0xc20ada24 -//.word 0x045aea37 -//.word 0x46678a3e -//.word 0xbba7297b -//.word 0xf0855cc5 -//.word 0xafb1db7d -//.word 0x24baccc4 -//.word 0x3ede45eb -//.word 0x58210c2b -//.word 0x199ca197 -//.word 0x98187e4e -//.word 0xc4db9df5 -//.word 0x04c23b65 -//.word 0x1a90dca0 -//.word 0x4d868f0a -//.word 0xc73473d6 -//.word 0x3c8e7abe -//.word 0xcc426df7 -//.word 0x2b493064 -//.word 0xffbc480a -//.word 0x89ea9ac4 -//.word 0x88a77537 -//.word 0x5ae7d309 -//.word 0x658bdc4e -//.word 0xb57aac43 -//.word 0xe6f4563f -//.word 0x452329e6 -//.word 0x32f332a0 -//.word 0xc924014a -//.word 0xc19eb02b -//.word 0x93042229 -//.word 0xdf8b893c -//.word 0x0c0d2b24 -//.word 0x30596557 -//.word 0x2fcef03e -//.word 0x262863a0 -//.word 0x0a99f95f -//.word 0x8c1c9562 -//.word 0x400603d2 -//.word 0xffdd8189 -//.word 0x8a6e7ec7 -//.word 0x6f1aa127 -//.word 0x31710dd2 -//.word 0xa302e4f3 -//.word 0x9570096b -//.word 0xb2c92bc5 -//.word 0xa914ff6c -//.word 0x8b29cc1b -//.word 0x74c62d96 -//.word 0x6ede1398 -//.word 0x9234090c -//.word 0x7129bc7f -//.word 0xb2d2bad6 -//.word 0xfc4e7a3c -//.word 0x16579d5f -//.word 0x4c1673dc -//.word 0x153cc1f7 -//.word 0xf44ec190 -//.word 0x9c406b53 -//.word 0x5746f32e -//.word 0xa8e79308 -//.word 0x2f538ab0 -//.word 0xcef66513 -//.word 0x0a4d7db3 -//.word 0xb4f9c154 -//.word 0xc812b5f8 -//.word 0x95bdbb0e -//.word 0x1e0192e7 -//.word 0xc1d61c69 -//.word 0x167f6407 -//.word 0x1a1adff1 -//.word 0x8d76f287 -//.word 0x9824b514 -//.word 0xb3d1f7b9 -//.word 0xc6d382a7 -//.word 0x8e019f91 -//.word 0x43c8dd62 -//.word 0x787b0f2b -//.word 0x42eb945f -//.word 0x9c38db42 -//.word 0x0ae6259f -//.word 0x7d338db9 -//.word 0x77a84685 -//.word 0x6fef2516 -//.word 0x77e45f59 -//.word 0x1cee9302 -//.word 0x8e900bc6 -//.word 0x013b3fcb -//.word 0x52679a5d -//.word 0xeee281e2 -//.word 0xf0679210 -//.word 0x8972295d -//.word 0xa55329b7 -//.word 0xcb81f976 -//.word 0x4532cc8f -//.word 0x8228260a -//.word 0xb8ce9cb6 -//.word 0xcd83db1b -//.word 0x7836ebb0 -//.word 0xa433b54e -//.word 0x153cc3e5 -//.word 0x4ddc486e -//.word 0xb1f86020 -//.word 0xe8a798e7 -//.word 0x8444b112 -//.word 0xe4c1a14b -//.word 0x583ddbcd -//.word 0x87d9d0d1 -//.word 0x0ec8b649 -//.word 0x6aa688d1 -//.word 0x180b4ee3 -//.word 0xfa5f9e4a -//.word 0xfdf063d9 -//.word 0xf941dd5c -//.word 0xd9a6e9cf -//.word 0xfb0d83ce -//.word 0xda1f894d -//.word 0xea88c189 -//.word 0xc3921e3e -//.word 0x82f93f1b -//.word 0x6cfb3973 -//.word 0xd5ae9635 -//.word 0x41969e1e -//.word 0xc877d52d -//.word 0xbf68c458 -//.word 0x9429fc7d -//.word 0xfab6599b -//.word 0x461c8442 -//.word 0x198c8000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00009EB0 -//// expected output -//.word 0x08b3276c -//.word 0xdb68adb6 -//.word 0x4cfdfb6d -//.word 0x54002354 -//.word 0x108ff18c -//.word 0x3f901c1f -//.word 0xedc48b5a -//.word 0x44c81bbc -//.word 0xe19e2a23 -//.word 0x1a319191 -//.word 0xfb5b9652 -//.word 0xbc43c20d -//.word 0x80ef6d43 -//.word 0x8f7227e7 -//.word 0x2ed57c7f -//.word 0xbd9c79d1 -//// SHA512LongMsgvector_51 -//// vector length -//.word 0x0000A1C8 -//// input message -//.word 0x0a268b62 -//.word 0x3e349fa8 -//.word 0x21ad14e9 -//.word 0xbdfdf612 -//.word 0x17aaff01 -//.word 0x6c8a024f -//.word 0xba348a6d -//.word 0x82b4bef3 -//.word 0xcc838734 -//.word 0x6db6f516 -//.word 0x8575df21 -//.word 0x4bafcad5 -//.word 0x0d0c0c41 -//.word 0x722332d1 -//.word 0x03ee9e68 -//.word 0xe97a75ae -//.word 0xf8e3b8ac -//.word 0xed80b096 -//.word 0xf45b90e7 -//.word 0x6ee456b3 -//.word 0xf0e6f239 -//.word 0x8fb9aab9 -//.word 0x5bbabd85 -//.word 0x29f84659 -//.word 0x963064ef -//.word 0x48fc98cf -//.word 0x77476e65 -//.word 0xac046055 -//.word 0xc91ff713 -//.word 0x4ab433ae -//.word 0xca802dec -//.word 0xc995fb9c -//.word 0xac51d428 -//.word 0x0590746a -//.word 0x1521c2c0 -//.word 0x9077b163 -//.word 0x9fa164f4 -//.word 0x2b7d9558 -//.word 0x592837c6 -//.word 0x51b85a1e -//.word 0x442e507d -//.word 0xada60e0e -//.word 0xd7d1d423 -//.word 0x9fa51184 -//.word 0x7b538106 -//.word 0xbb7a9860 -//.word 0x0f9a233b -//.word 0x4acb2d88 -//.word 0x65af1f16 -//.word 0xc7a52c64 -//.word 0xc33fecb4 -//.word 0x63f74760 -//.word 0x641d9571 -//.word 0x8114036e -//.word 0xf5be3972 -//.word 0x3b353a81 -//.word 0x18bc8b1c -//.word 0xdbf59713 -//.word 0xe454529b -//.word 0x63d31da0 -//.word 0x62e7ea5d -//.word 0x06b3a029 -//.word 0x117cc194 -//.word 0xac5e4ab2 -//.word 0x643ddab7 -//.word 0x72fe17c4 -//.word 0x3ff64d01 -//.word 0x27a259ec -//.word 0x7d99c6f1 -//.word 0xd0c0353a -//.word 0x6dbd02c8 -//.word 0x25ae24c3 -//.word 0x511a550e -//.word 0x1327741f -//.word 0xde0e270e -//.word 0x38cdc4eb -//.word 0xbe1c7255 -//.word 0x69a18b48 -//.word 0x11674537 -//.word 0x2f8d925b -//.word 0xe73b444a -//.word 0x46da75cb -//.word 0xc88526e9 -//.word 0x1dba2646 -//.word 0x2c5636b2 -//.word 0x59c06afc -//.word 0x0364d208 -//.word 0x51635a22 -//.word 0x2f88ef92 -//.word 0x937fe371 -//.word 0x054193bb -//.word 0x5ed347a5 -//.word 0xd0305930 -//.word 0x26849afe -//.word 0x4d9af164 -//.word 0x149845c2 -//.word 0x30ea9d0f -//.word 0x837c86b8 -//.word 0x9e2cb6ab -//.word 0x847feeae -//.word 0xb09225f6 -//.word 0x5a54e2f5 -//.word 0xf7f3ea73 -//.word 0xff941be0 -//.word 0xf24798e9 -//.word 0x9d3a2649 -//.word 0x9a2dd6e2 -//.word 0x1625e50c -//.word 0xd665e02d -//.word 0x7c9a0b8a -//.word 0x0756045c -//.word 0x9abfa427 -//.word 0x7e892647 -//.word 0x69218bcb -//.word 0x012b3c87 -//.word 0x9c2ff265 -//.word 0x4a8fd3fc -//.word 0x15bdde64 -//.word 0x87aa8848 -//.word 0x6d82a73c -//.word 0xdb969051 -//.word 0x709a7ce7 -//.word 0xdb1031c3 -//.word 0x9e04de62 -//.word 0x12fa468c -//.word 0xac25202c -//.word 0x7ed9be5e -//.word 0x0143eeca -//.word 0x11581e31 -//.word 0x390bc345 -//.word 0x31c3fbbe -//.word 0xa50c70aa -//.word 0x388c8004 -//.word 0xc93a9c89 -//.word 0xf5caeec7 -//.word 0xdd6b3f77 -//.word 0x29b5170c -//.word 0x4ddd268c -//.word 0x0a2ce29f -//.word 0x38af72e6 -//.word 0xc42fcb8d -//.word 0xf5631924 -//.word 0xf36560aa -//.word 0x896363eb -//.word 0x2a97c50d -//.word 0x32796e65 -//.word 0x6f33308f -//.word 0xe055aabd -//.word 0xbcca6d4f -//.word 0xb60b5ea4 -//.word 0x80925c30 -//.word 0x8e9222cf -//.word 0x1ce56e59 -//.word 0x72456377 -//.word 0x67c02bb5 -//.word 0x2466e2d8 -//.word 0x2a45af71 -//.word 0x979734b2 -//.word 0xa4392981 -//.word 0x735f43cb -//.word 0x08875b1b -//.word 0x95abcc6b -//.word 0xfabb1d3a -//.word 0x8c4ae0de -//.word 0x1588d91c -//.word 0x1d7063f6 -//.word 0x684210c4 -//.word 0xc0349086 -//.word 0xf564d479 -//.word 0x211272e8 -//.word 0x300c4c45 -//.word 0xa0696d78 -//.word 0x867a3377 -//.word 0xd2feb317 -//.word 0xd3955922 -//.word 0xfe78cfa9 -//.word 0xeb66209b -//.word 0xa0e21e97 -//.word 0x129b01ff -//.word 0xe92c504e -//.word 0x840505ab -//.word 0x3da9ecbe -//.word 0xee1b4cc2 -//.word 0xb492c9db -//.word 0xf27489aa -//.word 0x9982961f -//.word 0xa750838f -//.word 0xeef95307 -//.word 0x171096df -//.word 0xe6dad592 -//.word 0xc0ba30cd -//.word 0x6aec46c5 -//.word 0x137655ce -//.word 0x955ca22a -//.word 0xf8141c1e -//.word 0x37393c4b -//.word 0x47842f3c -//.word 0x56f7373c -//.word 0x515b4f6a -//.word 0xa8ed0e0f -//.word 0x5555cd2e -//.word 0x1bd70c5d -//.word 0x0bcd12d4 -//.word 0x4d55d4c4 -//.word 0x1d4718ea -//.word 0x146ada63 -//.word 0xa9e7efc2 -//.word 0xf7fde860 -//.word 0xc1f739f3 -//.word 0xb35b9b62 -//.word 0xea65aed8 -//.word 0xb7b3e318 -//.word 0xa0429910 -//.word 0xa89986b0 -//.word 0xd14459fc -//.word 0xde849d60 -//.word 0x5d45e144 -//.word 0xe55016e1 -//.word 0x9dc23853 -//.word 0xfdbd31ef -//.word 0xd95dfad6 -//.word 0x9bee03ca -//.word 0xd05cd541 -//.word 0xe6eaf6b8 -//.word 0x33270c4a -//.word 0x3a1f4681 -//.word 0x2acef86c -//.word 0xa8da85f2 -//.word 0xce818265 -//.word 0x74cf185b -//.word 0xae15aab9 -//.word 0x9598b810 -//.word 0x4b86042d -//.word 0x392ef3eb -//.word 0x9b6f354c -//.word 0x3f71a8c8 -//.word 0x89947ae5 -//.word 0xbba68f08 -//.word 0x7359228b -//.word 0x76f4ae0f -//.word 0xab480f14 -//.word 0x6be6e4c7 -//.word 0xf88f391a -//.word 0x4aec631a -//.word 0x127f2a7e -//.word 0xf9da2e7b -//.word 0x280f83e0 -//.word 0x0e679f5e -//.word 0x5d577627 -//.word 0x56afe3bc -//.word 0x47154aff -//.word 0x52b27c90 -//.word 0x6f2bda56 -//.word 0xb4d3be5c -//.word 0xd51f16df -//.word 0xe75a52a5 -//.word 0x69998190 -//.word 0x84f2b672 -//.word 0x92e9b123 -//.word 0xde2bbbd1 -//.word 0xaa7fd298 -//.word 0x77f90652 -//.word 0x807023b1 -//.word 0x8833908b -//.word 0xd5f87774 -//.word 0x7d152692 -//.word 0xe0f3b6ad -//.word 0x76bfea86 -//.word 0xcb62596a -//.word 0xc7b4d006 -//.word 0x33ecf27d -//.word 0x795c21b8 -//.word 0xab5ba2fe -//.word 0xc782fbc4 -//.word 0x3a1ba0c6 -//.word 0xa2d6cf56 -//.word 0xd8beb9f4 -//.word 0x2e6ce220 -//.word 0xf57aca6c -//.word 0x433bcdd5 -//.word 0xf3a94853 -//.word 0xec9ffdaf -//.word 0xa749b995 -//.word 0xebd834ea -//.word 0xdb7a385f -//.word 0x33890547 -//.word 0xcf02f5a6 -//.word 0x6d3a5c8a -//.word 0xb3ccb29e -//.word 0x74d6f4fc -//.word 0x2f654743 -//.word 0xd82ddfe9 -//.word 0xdb7e1fd3 -//.word 0x5f730123 -//.word 0xc76db952 -//.word 0x7fbf957e -//.word 0xf5ab2805 -//.word 0xe58ea752 -//.word 0xda5793f7 -//.word 0xf23d98fc -//.word 0xe1b2b677 -//.word 0x38929e5d -//.word 0xe8a15f98 -//.word 0x0134415a -//.word 0xc02ef1b0 -//.word 0xc92edf5a -//.word 0xb107e5da -//.word 0xbf7129cb -//.word 0xf4fe4474 -//.word 0x484fa49d -//.word 0x37872ea1 -//.word 0x7c0028c5 -//.word 0x1d3d57c8 -//.word 0xa72064bc -//.word 0xbb5d8514 -//.word 0xc92f59fd -//.word 0x1c4a13f2 -//.word 0x1710da8a -//.word 0xbe077095 -//.word 0x788b1268 -//.word 0x12c0a075 -//.word 0x08cbfe1f -//.word 0x0042bacc -//.word 0x98e0ef3b -//.word 0x617e6918 -//.word 0x2b3e09cd -//.word 0x840a6b9c -//.word 0x7b3dc7ea -//.word 0xaa9f15de -//.word 0x7397752b -//.word 0x899ccd2a -//.word 0xb2edb42c -//.word 0xcc828f0e -//.word 0x0e42f90e -//.word 0x917669dc -//.word 0x0f7e0ef5 -//.word 0xeac2fe2c -//.word 0x70ec9089 -//.word 0x5d550657 -//.word 0xa1bc7079 -//.word 0x643ecdfd -//.word 0x488272f4 -//.word 0xee35b080 -//.word 0xbbb6b12e -//.word 0xdc12a386 -//.word 0x873218e1 -//.word 0x8453ad7b -//.word 0xedb7eac9 -//.word 0x329a6a0d -//.word 0x5f683c27 -//.word 0xa22d88ae -//.word 0x084d763f -//.word 0x87754b15 -//.word 0x41d1d6da -//.word 0x07800abd -//.word 0x1c45ecc5 -//.word 0x3c7fb065 -//.word 0xdd5b1e50 -//.word 0xb5483b8e -//.word 0x7cab26d0 -//.word 0xf3d44001 -//.word 0x25318f1d -//.word 0xedc26546 -//.word 0xb8cd3c15 -//.word 0x8cd3e52e -//.word 0x4ac2e217 -//.word 0x306c104a -//.word 0xa1388988 -//.word 0x2918c871 -//.word 0xbcbb0e52 -//.word 0x3e03053e -//.word 0x49b9a360 -//.word 0x2a80528f -//.word 0x2c074e23 -//.word 0x1a834e07 -//.word 0xff5d6610 -//.word 0x30272c8d -//.word 0x8cd51a20 -//.word 0x032a33cc -//.word 0x5570e94e -//.word 0x1c6c3fb1 -//.word 0x0d912b1d -//.word 0x7b743ef0 -//.word 0x1c80860f -//.word 0x10ebb47f -//.word 0x1fe87a2f -//.word 0x431f3718 -//.word 0x665ad688 -//.word 0x6c81f3bb -//.word 0x74c840ac -//.word 0x5b27282a -//.word 0x820bb22e -//.word 0xd24ba76c -//.word 0xfd5df728 -//.word 0x06ca594b -//.word 0x03df32b6 -//.word 0x22a5b8d6 -//.word 0xea145779 -//.word 0xc38454e0 -//.word 0xb964b015 -//.word 0x7d2e4f7f -//.word 0xac9a59b3 -//.word 0x5413e18d -//.word 0xb567c480 -//.word 0x44c2d42a -//.word 0xf6dd362b -//.word 0xba730938 -//.word 0x47f5486b -//.word 0x197ef2dd -//.word 0xb6096877 -//.word 0x36e21605 -//.word 0x025a558c -//.word 0xdcbf90de -//.word 0x208ba66b -//.word 0x49dc905a -//.word 0xb62444d9 -//.word 0xaf22d9b1 -//.word 0xa311eb1d -//.word 0xb31f41dc -//.word 0x7520ad85 -//.word 0xf184341b -//.word 0xf0866fe1 -//.word 0x77a7316f -//.word 0x8e5b6b06 -//.word 0x45024c21 -//.word 0xf919ac4c -//.word 0xd4b2aa39 -//.word 0x93219411 -//.word 0x8cf90808 -//.word 0xef375934 -//.word 0x4cbc349f -//.word 0x5501849b -//.word 0xe6069255 -//.word 0x428b71ad -//.word 0xa0839945 -//.word 0xe6c6d2d8 -//.word 0xb40654ce -//.word 0xa4042c0d -//.word 0xd003e111 -//.word 0x957d583f -//.word 0x9716f576 -//.word 0x05ce03e8 -//.word 0x1f7a5628 -//.word 0xf5752e83 -//.word 0x71935f94 -//.word 0x9756af13 -//.word 0x0c6580ee -//.word 0xd539af9b -//.word 0x621abbac -//.word 0xcb4a2aa4 -//.word 0x59802809 -//.word 0x489772ba -//.word 0xcb887283 -//.word 0x5196abef -//.word 0x07c8585d -//.word 0x9e9c5056 -//.word 0x4efa2d1e -//.word 0x1b67ad89 -//.word 0x577b5910 -//.word 0x68956424 -//.word 0xcbcdd5c3 -//.word 0x592ae948 -//.word 0xc916b287 -//.word 0x770e0519 -//.word 0x639e93f5 -//.word 0x7d8d5640 -//.word 0x20552f67 -//.word 0xdcd5cd6a -//.word 0x784ad07b -//.word 0x377c2ec7 -//.word 0x5b35d694 -//.word 0xe8f7948c -//.word 0xaaee3558 -//.word 0x7924eb71 -//.word 0xbcf4f333 -//.word 0x2cc17434 -//.word 0xdbe8abd3 -//.word 0x74f24514 -//.word 0xc40f0cab -//.word 0x79c0c656 -//.word 0x2ad35a70 -//.word 0x989435c4 -//.word 0x3442ec9f -//.word 0xe1c02329 -//.word 0xfa8dadf4 -//.word 0x97f6f5d6 -//.word 0x0c8a9cf4 -//.word 0xb3cf6320 -//.word 0xec334c65 -//.word 0x6145fcdf -//.word 0x8f2564d0 -//.word 0x8239a0f1 -//.word 0xdf221f06 -//.word 0x28ef05b5 -//.word 0x3c90cd98 -//.word 0x1d8d3391 -//.word 0xf6f8515e -//.word 0x5da0086d -//.word 0xd587a1f1 -//.word 0x9796b435 -//.word 0x92904930 -//.word 0xb0453e5b -//.word 0x5b08e9bf -//.word 0x4062fd52 -//.word 0x5208b283 -//.word 0x120b2014 -//.word 0x0e4fec28 -//.word 0xa83e279d -//.word 0x19bd739b -//.word 0xb65f686d -//.word 0x71d93690 -//.word 0xa2b78b0a -//.word 0x084db7fd -//.word 0x0aef0e7c -//.word 0x43658d9d -//.word 0x3e99c1d0 -//.word 0x7e93e56f -//.word 0xc2a74b96 -//.word 0x87edfd34 -//.word 0xcdf2a362 -//.word 0x1eada7f4 -//.word 0xcdb5984e -//.word 0x7cb1cc7a -//.word 0xe00f4a77 -//.word 0xc9f9e6d3 -//.word 0x5c84ae7c -//.word 0xa32b85d3 -//.word 0x497d0e02 -//.word 0x9e12cc8f -//.word 0xe1c38732 -//.word 0xbf1af1e4 -//.word 0x17088939 -//.word 0x00d6c0ef -//.word 0x0d5e5ac7 -//.word 0xd07b1893 -//.word 0x9cbe9491 -//.word 0x8f636cf7 -//.word 0xd083a2cf -//.word 0x168b4305 -//.word 0x6aec47bf -//.word 0x2d14b9ec -//.word 0x5c9e1820 -//.word 0x13c5fc9f -//.word 0x501ffcb8 -//.word 0xfa88d054 -//.word 0x225bb3ce -//.word 0x88e90b05 -//.word 0x61234cb0 -//.word 0x579a1af2 -//.word 0xd2aaae2f -//.word 0x76f17a1d -//.word 0xed06101e -//.word 0xe66840cd -//.word 0x5db580d6 -//.word 0x1d1d920c -//.word 0x841560b5 -//.word 0x87502b28 -//.word 0xf5ebe49b -//.word 0x00e8da36 -//.word 0xf9dd966c -//.word 0x5bed038a -//.word 0x0bf8d390 -//.word 0xde0f1d41 -//.word 0x5c2b4b76 -//.word 0xc41e33b7 -//.word 0x50c9840c -//.word 0xb9906411 -//.word 0xfe0b5749 -//.word 0x62fe63b4 -//.word 0xb38c72a4 -//.word 0xd2a7f7cc -//.word 0x70cbd49a -//.word 0x16ec7cc7 -//.word 0x68ad542c -//.word 0xaad260d7 -//.word 0x83f81b5e -//.word 0x0183a673 -//.word 0xded925b9 -//.word 0x02ce67d6 -//.word 0x485ec5ca -//.word 0x85a24c7f -//.word 0xc7fd1ea0 -//.word 0xda9715af -//.word 0x110caa52 -//.word 0x426515ee -//.word 0x1347b677 -//.word 0x746ab487 -//.word 0x6d4de4ad -//.word 0x1a28ec07 -//.word 0xf423a813 -//.word 0x51c5ccc2 -//.word 0x2fafcbce -//.word 0x2d8af84e -//.word 0xda3eeb88 -//.word 0x32642706 -//.word 0x66fffaec -//.word 0xdc66a488 -//.word 0x7785bb2b -//.word 0x1845cd37 -//.word 0x6549487a -//.word 0xc9db97ba -//.word 0xbb268e91 -//.word 0x44a5087c -//.word 0xbbdbce2e -//.word 0xd445bb2a -//.word 0xd98d1e90 -//.word 0x36006037 -//.word 0x3b42e7fd -//.word 0x1e40395b -//.word 0x3f67653d -//.word 0xb0149f10 -//.word 0xf54b2a1c -//.word 0x08ab7b14 -//.word 0xa1a19beb -//.word 0xb3ddcdea -//.word 0x3a027100 -//.word 0x34a22859 -//.word 0xed693931 -//.word 0x809833eb -//.word 0x9bb5d45d -//.word 0x82812a6f -//.word 0x572bf8e4 -//.word 0x98c35b77 -//.word 0xe9f1ad2a -//.word 0x14e7aadb -//.word 0x4e94d118 -//.word 0xbc1b0d34 -//.word 0x3583959a -//.word 0x4ab01162 -//.word 0x8392fe22 -//.word 0xec9c5307 -//.word 0xd0786524 -//.word 0xc5f90809 -//.word 0xe851f798 -//.word 0x6a847614 -//.word 0x4c1c357b -//.word 0x661f7816 -//.word 0xae3e754e -//.word 0xb74ffdc1 -//.word 0x78fd5f95 -//.word 0x4fbe8a0c -//.word 0x46067159 -//.word 0x94bbb4b3 -//.word 0x67e87ca7 -//.word 0xe0b5a6b2 -//.word 0x5f97250f -//.word 0x02c4a1ce -//.word 0x68ea6426 -//.word 0xbb20770c -//.word 0xed1d0804 -//.word 0x41a70f38 -//.word 0x0e4f32c7 -//.word 0xc05ce55f -//.word 0x1f05d50e -//.word 0xd4e38755 -//.word 0x28a53c7f -//.word 0x10061930 -//.word 0x67fc8441 -//.word 0x7a32d1cb -//.word 0xc9b91e82 -//.word 0x0cfb7b45 -//.word 0x75f04ff3 -//.word 0x3594f77f -//.word 0x4198af47 -//.word 0x5657b6a1 -//.word 0x3a0dadb7 -//.word 0x46434096 -//.word 0x218e0981 -//.word 0xce79b18b -//.word 0xe9c05965 -//.word 0x2dbf3874 -//.word 0x3a298526 -//.word 0x95fd9787 -//.word 0xf1b64b0f -//.word 0xadc3a6be -//.word 0x9d36bb6c -//.word 0x0dc0cf5a -//.word 0x03ddbc0c -//.word 0xc54c935b -//.word 0x9bc285c6 -//.word 0xd6df0409 -//.word 0x116125f1 -//.word 0xb798496e -//.word 0xc61afcea -//.word 0xd2b71dd9 -//.word 0x4caf4091 -//.word 0x0423505c -//.word 0xedca79cc -//.word 0x20e5444f -//.word 0x24750403 -//.word 0x6dab72cc -//.word 0x22a094a3 -//.word 0x2446e331 -//.word 0x4b9fac9c -//.word 0xf32cb7a1 -//.word 0xb7a927e3 -//.word 0x7cf7a182 -//.word 0xb25ab0f0 -//.word 0xd6e46800 -//.word 0x3b314a40 -//.word 0x0b556889 -//.word 0x8813cad4 -//.word 0x98500f4f -//.word 0x81c657b1 -//.word 0xf1fd61ca -//.word 0x4177f15e -//.word 0xfa2b7533 -//.word 0x9936e769 -//.word 0x8fccf50a -//.word 0x8c7460e2 -//.word 0xfd75a291 -//.word 0xd48bd3de -//.word 0x87dfcd4e -//.word 0x5b368ff6 -//.word 0xe269df8d -//.word 0xc21534c5 -//.word 0xb993d2db -//.word 0xde2b376d -//.word 0x2a84b68d -//.word 0x365f6213 -//.word 0x46852d37 -//.word 0x87fe515f -//.word 0x9584ef35 -//.word 0x4038f6fd -//.word 0x90934726 -//.word 0x079e171e -//.word 0x2566946b -//.word 0x32aacbf8 -//.word 0x37d8c9ac -//.word 0x4e380041 -//.word 0x1b66ed54 -//.word 0x9b05f8b8 -//.word 0x1cb29c10 -//.word 0x8d37c79d -//.word 0xf8018454 -//.word 0x4dd5d734 -//.word 0x61bee8d6 -//.word 0x364a6446 -//.word 0x7df52111 -//.word 0x59e6019f -//.word 0x66d918c3 -//.word 0xfa5d1191 -//.word 0xab3fcd70 -//.word 0x11464e70 -//.word 0xcd20d4dd -//.word 0xc99d4514 -//.word 0xc21bd295 -//.word 0x0442d85a -//.word 0x75f10467 -//.word 0xd577bba3 -//.word 0x4407b9e6 -//.word 0x0566f853 -//.word 0x81e7d3e8 -//.word 0x8f996b53 -//.word 0xf2bf4a07 -//.word 0x23804690 -//.word 0x52e0a823 -//.word 0xa7ef8e7a -//.word 0xcd408edf -//.word 0xb19d9c86 -//.word 0x87f92e1f -//.word 0x0fa69eac -//.word 0x16c9cf90 -//.word 0x3f0a13e9 -//.word 0x03904c20 -//.word 0xf72c52bf -//.word 0x4dd49582 -//.word 0x9e5404b0 -//.word 0xe7402dab -//.word 0xd12da5c6 -//.word 0x3520aa58 -//.word 0xdf47070f -//.word 0x92e73886 -//.word 0x4d96cf19 -//.word 0xcdaa16f8 -//.word 0x53f1f67a -//.word 0xa7a317b4 -//.word 0x5d94494b -//.word 0x57ae2386 -//.word 0x8b9fe9a7 -//.word 0x06cfb37c -//.word 0x3195cc31 -//.word 0x54aa5968 -//.word 0x58de3b8b -//.word 0xd1093661 -//.word 0x3c4552e0 -//.word 0x845a8143 -//.word 0xcc7a835c -//.word 0x682f072a -//.word 0x2c9113ae -//.word 0xeabca5fb -//.word 0x36819b8d -//.word 0x6c5cd0db -//.word 0xf5a6882f -//.word 0xc50c0eb6 -//.word 0x28409bd3 -//.word 0xbfee7ab9 -//.word 0xc5f26a39 -//.word 0x97c844d8 -//.word 0x7444dd25 -//.word 0x81832e4a -//.word 0x1021b2e0 -//.word 0x21ac1008 -//.word 0x2959fab7 -//.word 0x13f65551 -//.word 0x85209a7a -//.word 0x64b67c29 -//.word 0x9a8ecbfd -//.word 0x176698d5 -//.word 0x151d9a9b -//.word 0xa123d060 -//.word 0x572e68ae -//.word 0x6d2ee019 -//.word 0xf3846b18 -//.word 0x586e9613 -//.word 0x31c62bbd -//.word 0x36ed55a4 -//.word 0x8d020607 -//.word 0x4c5796e7 -//.word 0x3925ad60 -//.word 0xd47e623a -//.word 0x9784a4bc -//.word 0x7cd9d9c0 -//.word 0xc056c60d -//.word 0xe600afe0 -//.word 0x0037bfcc -//.word 0x2a31aac4 -//.word 0x57a79077 -//.word 0x50ce25dc -//.word 0xf9890f0d -//.word 0xd6dd8f58 -//.word 0xcfa56493 -//.word 0x3087ecb1 -//.word 0xf4268d93 -//.word 0x43995320 -//.word 0x391dda98 -//.word 0xe9066f25 -//.word 0xa2fc72b4 -//.word 0x7163fe02 -//.word 0xe61bcdfa -//.word 0x1b6a553e -//.word 0xf3363704 -//.word 0xa078da23 -//.word 0x68ed536d -//.word 0xa80f8940 -//.word 0x19439658 -//.word 0x525470e7 -//.word 0x8e20c8e8 -//.word 0xb09132b0 -//.word 0x84cf87c6 -//.word 0x48b487f4 -//.word 0x6b81c39e -//.word 0x94cfbb53 -//.word 0xe6c843a2 -//.word 0x83962b2f -//.word 0x4e1c1e06 -//.word 0xf6e4cb2e -//.word 0x30594382 -//.word 0x4337a2bc -//.word 0xca3ff2d3 -//.word 0xb52f4c87 -//.word 0x92f14039 -//.word 0x0b137801 -//.word 0xaf7797fb -//.word 0xf54c67e1 -//.word 0x7d3c34df -//.word 0x9ae773a2 -//.word 0x0e91a8b3 -//.word 0x14178603 -//.word 0xa42857c7 -//.word 0xf2b19e85 -//.word 0x3899fb6f -//.word 0xb5af50f1 -//.word 0xf5e12286 -//.word 0x54ae42cf -//.word 0xbedeace6 -//.word 0xb870aff0 -//.word 0xa4d44ef1 -//.word 0x405ae7e5 -//.word 0x71eb120c -//.word 0x3ff7cc85 -//.word 0x20aed51e -//.word 0x7973566b -//.word 0x628dc715 -//.word 0xaa201075 -//.word 0x1a5cee61 -//.word 0xfef59946 -//.word 0xe2d3a477 -//.word 0x9a0a24c5 -//.word 0x850c1450 -//.word 0x121ef89d -//.word 0x8208c1e8 -//.word 0xf011f1bb -//.word 0x8f2affbf -//.word 0x346afdd3 -//.word 0x14ba785b -//.word 0xced2a0da -//.word 0xac64a8c4 -//.word 0x2596708d -//.word 0xa7b66206 -//.word 0x94299ae9 -//.word 0x8ba549b2 -//.word 0xe8a15bb1 -//.word 0x8e09575e -//.word 0xe43587ec -//.word 0x1d1c5a21 -//.word 0xbdc50664 -//.word 0x58ff7118 -//.word 0x9d525228 -//.word 0x943593e3 -//.word 0x2481fb0b -//.word 0xd8260928 -//.word 0xe31d2322 -//.word 0x619ef00f -//.word 0xdf92024a -//.word 0x1e4bb8c5 -//.word 0x147362a0 -//.word 0x3442a7fa -//.word 0xeff42407 -//.word 0x7b7b5662 -//.word 0xd371baa5 -//.word 0xff503238 -//.word 0x95e5ab66 -//.word 0x8002fdb6 -//.word 0x00741278 -//.word 0xf2344b9e -//.word 0x52e21fcd -//.word 0xfe6e06b4 -//.word 0xbc19959d -//.word 0x7f9cea41 -//.word 0xe6a64ae1 -//.word 0x068c0992 -//.word 0x693caad9 -//.word 0x56744877 -//.word 0x53313586 -//.word 0xe969e0c5 -//.word 0xa7fcfc31 -//.word 0x6ae9ded5 -//.word 0xdbbd27e2 -//.word 0x3852a402 -//.word 0x58b572ea -//.word 0xe968662e -//.word 0xfdcaab5a -//.word 0xc5d3ad3e -//.word 0x9b043689 -//.word 0x469ed79a -//.word 0x7a138a92 -//.word 0x9fba95ae -//.word 0xd3c6b2d4 -//.word 0x32796c6b -//.word 0x5595cc70 -//.word 0x181435c6 -//.word 0xa1188dce -//.word 0x9e259d38 -//.word 0xcd8ebb19 -//.word 0xc22da63d -//.word 0xe557b1be -//.word 0xba0f24d5 -//.word 0x657adff1 -//.word 0x6d944006 -//.word 0xc0204728 -//.word 0xf7e5f858 -//.word 0xdc17019e -//.word 0x29149d58 -//.word 0x9351b8d1 -//.word 0x07935415 -//.word 0x34622b04 -//.word 0x49ba96a6 -//.word 0x0005adbe -//.word 0xdb46b0a2 -//.word 0xad97a649 -//.word 0x5dd543a6 -//.word 0xe79a0f34 -//.word 0xa36bc5d3 -//.word 0xca33f9d2 -//.word 0x36f0fe4d -//.word 0x69ad07b9 -//.word 0xd1b08cbd -//.word 0x4bf4f043 -//.word 0xe5da60d0 -//.word 0xe81bfe10 -//.word 0x16013fb6 -//.word 0x30d79183 -//.word 0xbb9e42a3 -//.word 0x04019d40 -//.word 0x628b5652 -//.word 0xbb1828b4 -//.word 0x4989bc7d -//.word 0x9ebccd8d -//.word 0xe6bc8a66 -//.word 0x6d343b3e -//.word 0x612a2852 -//.word 0xd8e9b67c -//.word 0x143fd408 -//.word 0x06e995c4 -//.word 0x124c1e56 -//.word 0x1266c3d2 -//.word 0x9d036d8c -//.word 0x89343f2b -//.word 0xaefd79ff -//.word 0xed4e9c95 -//.word 0x7234cf88 -//.word 0x35518199 -//.word 0xc78a5002 -//.word 0x4bff2908 -//.word 0xc240b1d0 -//.word 0x8dbee473 -//.word 0x2c7ffc54 -//.word 0x4c1695b2 -//.word 0x01d30e79 -//.word 0x5037325e -//.word 0xf0aa182a -//.word 0x51704756 -//.word 0xdeda1ed9 -//.word 0x80b9743e -//.word 0x63187bf9 -//.word 0xfc2beafb -//.word 0x4b825b84 -//.word 0x5d82f139 -//.word 0x16163f76 -//.word 0x2da265e5 -//.word 0x78397c50 -//.word 0x6a0f35b3 -//.word 0xda31bc96 -//.word 0x0573e399 -//.word 0xd7aa7c51 -//.word 0x661c0652 -//.word 0xc0358d8d -//.word 0xe67ccbdd -//.word 0x18c593dc -//.word 0x53a770fb -//.word 0x193089d2 -//.word 0x70d8c7b4 -//.word 0x2db43a87 -//.word 0x72ecb9d2 -//.word 0x766fc918 -//.word 0x84e5c165 -//.word 0x47e62b26 -//.word 0x44696c3d -//.word 0xa87fa855 -//.word 0x4441e073 -//.word 0xd6065dce -//.word 0x8ada52e1 -//.word 0xc02cbdbe -//.word 0x10c78ea5 -//.word 0x8b040bd5 -//.word 0x443d73a2 -//.word 0x1084e1c8 -//.word 0x899574ff -//.word 0x590aadd0 -//.word 0xb5ce18a6 -//.word 0x27d42f28 -//.word 0x91097bc6 -//.word 0x6f87fc92 -//.word 0x5c0bcb52 -//.word 0xd8a9fed3 -//.word 0x48becc80 -//.word 0x3e27f232 -//.word 0xfbb0544a -//.word 0x32cfe8fe -//.word 0x0f93d0f0 -//.word 0x78d7c605 -//.word 0x93bbbd74 -//.word 0x8855c51d -//.word 0x88a3301d -//.word 0x0ec4f39f -//.word 0x64684ff4 -//.word 0x6a86b0e7 -//.word 0x934dd54a -//.word 0x305c31d5 -//.word 0xf1359131 -//.word 0xa8ef004f -//.word 0x512ce7fe -//.word 0x504b79bd -//.word 0xf9df4ecd -//.word 0x555f4e8b -//.word 0x231fd1fd -//.word 0x1e7e05ab -//.word 0x7e618fb0 -//.word 0xc1e17510 -//.word 0xab413b4c -//.word 0x8c234c34 -//.word 0xc1fb9cfd -//.word 0x7dc38c93 -//.word 0xcaf10e30 -//.word 0xcaa6092e -//.word 0x4328ff1a -//.word 0x5a92ed09 -//.word 0x9fca722f -//.word 0x4ab434ad -//.word 0xc4a580ab -//.word 0x6a1b30a7 -//.word 0x8dabd20c -//.word 0xbd3a0607 -//.word 0x47702896 -//.word 0xfc6a2fe2 -//.word 0x34afd5ce -//.word 0x1366f9d0 -//.word 0x0bc64100 -//.word 0xa2cd036e -//.word 0x763566b9 -//.word 0x7ea4c4dd -//.word 0x9223534d -//.word 0x2ed10542 -//.word 0x73d8ac52 -//.word 0x6ea16244 -//.word 0x9d442823 -//.word 0xaf43cd91 -//.word 0x8c77125e -//.word 0x954a0b59 -//.word 0x2d27c866 -//.word 0x782f35d1 -//.word 0x622e3fe2 -//.word 0xe4cd38b2 -//.word 0x83097d3c -//.word 0x19e356b7 -//.word 0xd7591d24 -//.word 0x8b96a323 -//.word 0x1f66cf0a -//.word 0x62ec8838 -//.word 0x0c97d5a7 -//.word 0xfc5243c1 -//.word 0xc3fb8875 -//.word 0x66176589 -//.word 0x60c4d132 -//.word 0xe7ee53e2 -//.word 0x70c6b061 -//.word 0x7570c61f -//.word 0x76fcb8c9 -//.word 0x3e984b1a -//.word 0x670490f4 -//.word 0x2046c4af -//.word 0x2e9e74b1 -//.word 0x31bce43e -//.word 0x2931b292 -//.word 0x3824b72d -//.word 0xaa462e6f -//.word 0x32081864 -//.word 0x760bdfe1 -//.word 0xced739d0 -//.word 0x49d14fc8 -//.word 0xf2671fe1 -//.word 0x518e1ec6 -//.word 0x346e220b -//.word 0xaf5b80c1 -//.word 0x61087148 -//.word 0xf9f7bb65 -//.word 0xf9348d94 -//.word 0xba43aaa0 -//.word 0xb057c970 -//.word 0xf0c53c24 -//.word 0xefb7d161 -//.word 0x8d25f6e8 -//.word 0x5201206e -//.word 0xf7b26da8 -//.word 0x28c488a5 -//.word 0x88decd60 -//.word 0xf6f4ad96 -//.word 0x0fbd54d5 -//.word 0xf3688ad6 -//.word 0x4c8bd70c -//.word 0x8d5ceb7d -//.word 0x78233cd1 -//.word 0xe3eff1a8 -//.word 0xbb88ff31 -//.word 0x49a692f9 -//.word 0xb460ae00 -//.word 0xc8e71612 -//.word 0xf5746d54 -//.word 0x9b7f9b1e -//.word 0x85327208 -//.word 0xb31d9248 -//.word 0x5c2b893b -//.word 0x33d53f41 -//.word 0xea9592ce -//.word 0xf49e3dbe -//.word 0x90cafee9 -//.word 0x03d4f8f8 -//.word 0x24c75677 -//.word 0x1eb6312b -//.word 0x72aeb3a5 -//.word 0x3be97d17 -//.word 0xb6444767 -//.word 0x01f3c682 -//.word 0x2374d3f3 -//.word 0x4dc1c9b4 -//.word 0x60ca2f43 -//.word 0xae2297f9 -//.word 0x05f9c598 -//.word 0xea4a1423 -//.word 0x225516f2 -//.word 0x77507b05 -//.word 0xb85a3499 -//.word 0x02b0d8f9 -//.word 0x3e234697 -//.word 0xebca8c5b -//.word 0x1ef4073b -//.word 0xc660cc0c -//.word 0x35b14797 -//.word 0xdc1c22f0 -//.word 0x56646803 -//.word 0xa908eb70 -//.word 0xc8bbe399 -//.word 0x5c14d7f8 -//.word 0xc387c1b7 -//.word 0x59946d7a -//.word 0xf73e2280 -//.word 0xbabf84ea -//.word 0x067ab95a -//.word 0xca31cbc0 -//.word 0x05784d71 -//.word 0x8969427a -//.word 0xff9a3a33 -//.word 0x2b4cbe17 -//.word 0x71e5eed2 -//.word 0x98a1699c -//.word 0xcf846dc6 -//.word 0xed934092 -//.word 0xfd43ce48 -//.word 0xfa329386 -//.word 0xd715bbd8 -//.word 0xc2f18888 -//.word 0xaa8ff5b8 -//.word 0xff2a99ad -//.word 0xb96acd6e -//.word 0x9b96118e -//.word 0xb905ac46 -//.word 0x38d593c7 -//.word 0x55e08ccd -//.word 0xa8ec9378 -//.word 0xaa227d58 -//.word 0x76c2dbc6 -//.word 0xcc14217b -//.word 0x5ba2085b -//.word 0x40a43092 -//.word 0xcabc0ae2 -//.word 0x80e3f53b -//.word 0x65a3a78d -//.word 0x7a88cfda -//.word 0x85d1f88f -//.word 0x116ab114 -//.word 0xb61feba2 -//.word 0x9a0aa255 -//.word 0x384dc082 -//.word 0x60073e4a -//.word 0x7f808c6f -//.word 0x21a73367 -//.word 0xb4bfb9af -//.word 0x8f55c462 -//.word 0x3375830a -//.word 0xd01d4ab6 -//.word 0x0bf27c4d -//.word 0xfe32ae21 -//.word 0x80ea09c7 -//.word 0xa769f027 -//.word 0x8cf4e3cf -//.word 0x4ebba48d -//.word 0x5a0c983c -//.word 0xe9c76fde -//.word 0xca1208eb -//.word 0x614d8ee9 -//.word 0xf049e83d -//.word 0x15b45041 -//.word 0x94d84196 -//.word 0x578697bc -//.word 0xb34cf2df -//.word 0xedee5bf4 -//.word 0xfd142a05 -//.word 0x914126c9 -//.word 0x5504ef78 -//.word 0x727299dd -//.word 0x54d39aad -//.word 0xb19ce617 -//.word 0xc79e589c -//.word 0xe57c5421 -//.word 0x2c62ab43 -//.word 0x97f4beea -//.word 0x3985e721 -//.word 0xc68a1425 -//.word 0x554eb5bb -//.word 0x64e7d9c7 -//.word 0x1d68931b -//.word 0xd858a38d -//.word 0xe063524c -//.word 0x7a509e74 -//.word 0x233397df -//.word 0x1ae4093f -//.word 0x1eaf5b69 -//.word 0x794db7f4 -//.word 0x3d136c03 -//.word 0xce6a905f -//.word 0xa07fe9c9 -//.word 0x423c0e8e -//.word 0x9c76c95b -//.word 0x75800000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x0000A1C8 -//// expected output -//.word 0xe0c80702 -//.word 0x526891b3 -//.word 0x335d5a0b -//.word 0x3180d470 -//.word 0x25a76469 -//.word 0xa296e823 -//.word 0xfa7d7228 -//.word 0xb9872897 -//.word 0x799dbc0a -//.word 0x1252c7b7 -//.word 0xe89043ef -//.word 0xf1bf3092 -//.word 0xffe7b678 -//.word 0x70327324 -//.word 0xcf95742f -//.word 0xdf0e4122 -//// SHA512LongMsgvector_52 -//// vector length -//.word 0x0000A4E0 -//// input message -//.word 0x50973fbb -//.word 0x1fd9ac1d -//.word 0x3df52e52 -//.word 0xadb8f124 -//.word 0x23d17959 -//.word 0x5dd593d8 -//.word 0xb6868c0e -//.word 0xf954a090 -//.word 0x7324b502 -//.word 0x4c514a37 -//.word 0x17f0aa99 -//.word 0xa75965cc -//.word 0x24e3008e -//.word 0x5feeece2 -//.word 0x6327b56d -//.word 0x4d077c20 -//.word 0x5d9da717 -//.word 0x4c8ed7c1 -//.word 0xe05a1a42 -//.word 0xbfe06315 -//.word 0x812537f6 -//.word 0x0851a8ff -//.word 0x14fa8711 -//.word 0x12a5d675 -//.word 0x358a7cc3 -//.word 0xc8983c03 -//.word 0xc3b9e813 -//.word 0x9c57d249 -//.word 0x5f1f8458 -//.word 0x0105b178 -//.word 0xf2886bc1 -//.word 0xf13795d8 -//.word 0x24749cce -//.word 0x68786245 -//.word 0xe6977bd5 -//.word 0xe7c59cae -//.word 0xe95a507e -//.word 0xf112ed95 -//.word 0x2458c747 -//.word 0x91c4a391 -//.word 0x52e26f00 -//.word 0xd33530cf -//.word 0x717b3b4f -//.word 0x4733a88c -//.word 0x445d042e -//.word 0x8181469d -//.word 0xd2f20469 -//.word 0x9c54e7e8 -//.word 0xe65c5d21 -//.word 0xb2d78de8 -//.word 0x8dee904b -//.word 0x65a8de2d -//.word 0x9bb00631 -//.word 0x5959a3da -//.word 0x26df8bf0 -//.word 0xb7f04925 -//.word 0x086acef8 -//.word 0xac6763da -//.word 0x6277e28f -//.word 0xe82c26d8 -//.word 0x14dcc04f -//.word 0x20a2eb92 -//.word 0x46a6c3a3 -//.word 0x8c9eb18f -//.word 0xe2952a4e -//.word 0x6aeb99eb -//.word 0x179e99e5 -//.word 0x79c768d4 -//.word 0xd768984f -//.word 0x7f64080e -//.word 0x5acf134c -//.word 0xc368076f -//.word 0x9964d9eb -//.word 0x936e1764 -//.word 0xd4eb1d13 -//.word 0xc0828c6a -//.word 0x0ddcf8fb -//.word 0x1da8e196 -//.word 0x8be3e5b1 -//.word 0x0456330d -//.word 0x58604397 -//.word 0xd0f5c58d -//.word 0xc3e7d7e1 -//.word 0x64647ae2 -//.word 0xdec14719 -//.word 0xa3755e71 -//.word 0x0069a09c -//.word 0xf66f1eb1 -//.word 0x450fd01a -//.word 0xc98a8bad -//.word 0x09192d19 -//.word 0x0e761b84 -//.word 0x719ded72 -//.word 0xb8d467e9 -//.word 0xe3e9abd3 -//.word 0x41bbaea3 -//.word 0x88fbe93b -//.word 0x2534510d -//.word 0xd1098881 -//.word 0x65bf5597 -//.word 0xeffb52ce -//.word 0x05cce444 -//.word 0x59eb701e -//.word 0x8e42cc2a -//.word 0x4aacf4c3 -//.word 0x8dfcfff6 -//.word 0x414051e3 -//.word 0x12471165 -//.word 0x7f60def5 -//.word 0x3165bdcb -//.word 0x8cf85647 -//.word 0x850d6190 -//.word 0xb3a95b7b -//.word 0xa8e87dae -//.word 0x8145ee05 -//.word 0xbc163834 -//.word 0x4a56f9ae -//.word 0xe5a7dbc6 -//.word 0xa497c514 -//.word 0xcd23531b -//.word 0xea7a8428 -//.word 0x1f03b37d -//.word 0xbaa0c9af -//.word 0x0c35b04d -//.word 0x78640bc2 -//.word 0xc99b247d -//.word 0xc851254f -//.word 0x0f8c8c14 -//.word 0x18a7d995 -//.word 0x995289ad -//.word 0x14da48ab -//.word 0xa9ab63f8 -//.word 0x30137cfa -//.word 0x84488137 -//.word 0x21addfbe -//.word 0xf251f2c3 -//.word 0x64b8c089 -//.word 0xbfdfe885 -//.word 0xb67ad5c0 -//.word 0x3d80377d -//.word 0x9ae9b41c -//.word 0xbfb7da3e -//.word 0xd733592a -//.word 0x1f796f6f -//.word 0xf736a3cb -//.word 0x39b1b64c -//.word 0xc908d7b5 -//.word 0x6dbc1623 -//.word 0xdf701bf0 -//.word 0x21ee18d8 -//.word 0x116bfc5a -//.word 0x3d0cea61 -//.word 0xf8a9e924 -//.word 0xaed0dd4b -//.word 0x740db653 -//.word 0xe368e733 -//.word 0x27301940 -//.word 0x53f7214e -//.word 0xf7de3018 -//.word 0xf5134ae2 -//.word 0x9097fa5c -//.word 0xc64543ca -//.word 0xe010d962 -//.word 0x478c92f5 -//.word 0x99b017d2 -//.word 0xfcdadfe8 -//.word 0xb3135e2a -//.word 0xef947938 -//.word 0xe78a3e3b -//.word 0x2a17d210 -//.word 0x3499aaaa -//.word 0x402efeb1 -//.word 0x5e787b6f -//.word 0xc59d39ed -//.word 0x6a92ec59 -//.word 0xd29a5eab -//.word 0x24091d89 -//.word 0x824e7067 -//.word 0x993090f2 -//.word 0x775815af -//.word 0x9d10afdf -//.word 0x564a16a7 -//.word 0x47e4446d -//.word 0x462ae185 -//.word 0x709dff0d -//.word 0x75f30715 -//.word 0x375ef304 -//.word 0x9411be36 -//.word 0x7f0119ea -//.word 0x56e8605c -//.word 0x6f90cc2e -//.word 0xf54eea0c -//.word 0xf2cc4c90 -//.word 0xac0c7e63 -//.word 0x35aa3ba6 -//.word 0x3e62e190 -//.word 0x2cd12358 -//.word 0x6e80fe55 -//.word 0x0d1eee64 -//.word 0x840d618a -//.word 0xd3216cda -//.word 0xcfa4bd99 -//.word 0xbc9dd1a1 -//.word 0x1d516703 -//.word 0xcb0b34f0 -//.word 0x4519d8da -//.word 0x471711d6 -//.word 0x9e702e45 -//.word 0x3a21c7b3 -//.word 0x85c0acff -//.word 0xf3bd1bbc -//.word 0xdae936d8 -//.word 0x8534b37b -//.word 0x84bbd632 -//.word 0x45029c4d -//.word 0xe97d3a86 -//.word 0x5056c5e3 -//.word 0x766a33dd -//.word 0x039582c1 -//.word 0x1d2f3757 -//.word 0x81d60ac2 -//.word 0xd26ee0a7 -//.word 0x3067f991 -//.word 0x0d3e6b94 -//.word 0x3c47cf31 -//.word 0x4ba93a7a -//.word 0x13aa6f76 -//.word 0x8d2d52c7 -//.word 0xe878a08a -//.word 0xd83bde7f -//.word 0x30ce8f6a -//.word 0xb3bbaab9 -//.word 0x277c4b66 -//.word 0xac86a91f -//.word 0x4c8648a5 -//.word 0xd3ea7072 -//.word 0xe1a3dd9e -//.word 0x3d29b803 -//.word 0x6cc0c6a0 -//.word 0x83fbe03b -//.word 0x397ea34a -//.word 0x40076814 -//.word 0xd6b07614 -//.word 0x976e779e -//.word 0x95de29c5 -//.word 0xaa41567b -//.word 0x0dc406fa -//.word 0x2406f363 -//.word 0x99d43da5 -//.word 0xb0375fa1 -//.word 0xd8b0628c -//.word 0x80c25194 -//.word 0x2bb1ecc6 -//.word 0xc78aa02f -//.word 0x3a63b741 -//.word 0x3fe4cd79 -//.word 0x7006833f -//.word 0xa31b770e -//.word 0x7a0f73d4 -//.word 0x36ede49c -//.word 0xcca48e6a -//.word 0x3b0c7f66 -//.word 0x1c24413d -//.word 0x7b9e54c5 -//.word 0xe59ddbe0 -//.word 0xc2bd96a2 -//.word 0xe65410b6 -//.word 0x62f71afd -//.word 0xa0407779 -//.word 0xafcfd96a -//.word 0xdb8f0db6 -//.word 0x813a728e -//.word 0x2120af4f -//.word 0xb524a5a6 -//.word 0x4107a3f8 -//.word 0xace9d901 -//.word 0xce0c10bb -//.word 0xcadc9881 -//.word 0x9e2c8174 -//.word 0xf8c30e1e -//.word 0x4c176655 -//.word 0x23588d62 -//.word 0xb6b09363 -//.word 0xbbca0bee -//.word 0x7f91bff7 -//.word 0x353aa2f4 -//.word 0x8d84063e -//.word 0x893e0fbb -//.word 0x8d0a68ba -//.word 0xb562341e -//.word 0x6ad848bf -//.word 0x38a2970d -//.word 0xda55edf7 -//.word 0x97f1e10b -//.word 0xd21e05de -//.word 0xdcb55fae -//.word 0x0c821d46 -//.word 0x12498422 -//.word 0x88062ad4 -//.word 0xca7965a6 -//.word 0x08e20381 -//.word 0x990a3b0d -//.word 0x9282e41a -//.word 0x982fe53f -//.word 0xf207edc0 -//.word 0xe21564b5 -//.word 0x36c3a169 -//.word 0x1a585d01 -//.word 0x30c0675e -//.word 0xe38c9a44 -//.word 0xf8390dbb -//.word 0x65b589b5 -//.word 0x671f40f2 -//.word 0xcfcebb21 -//.word 0x9c961548 -//.word 0xcf466765 -//.word 0x7b758356 -//.word 0x1c7fe5f6 -//.word 0x29cae689 -//.word 0xed4e335a -//.word 0x92547ea2 -//.word 0x7f7d73ac -//.word 0xe407ee37 -//.word 0x924c6b1c -//.word 0x118bbe30 -//.word 0xeceb046c -//.word 0x50bdd94b -//.word 0xd502cb74 -//.word 0x9c2d0f99 -//.word 0x9a2a739f -//.word 0x339e94ff -//.word 0x0b71516c -//.word 0x198a7fb6 -//.word 0xfdd9deee -//.word 0x939b4ccb -//.word 0xc8d9394c -//.word 0xac325b9f -//.word 0xc9dba342 -//.word 0xb4e46f68 -//.word 0xe1bd019e -//.word 0xbbf830ae -//.word 0xf4505dc3 -//.word 0x1aeba9cf -//.word 0x6cdc652a -//.word 0xebeccb7c -//.word 0xb49aebdc -//.word 0x8c60e739 -//.word 0xbd3863f9 -//.word 0x215f38e1 -//.word 0x7c596835 -//.word 0x0e355720 -//.word 0x69123855 -//.word 0x81e2c5f7 -//.word 0x026e33b7 -//.word 0xe69b653c -//.word 0x46eb60c7 -//.word 0x7046ff17 -//.word 0x3bfbe78a -//.word 0x9702be86 -//.word 0x68849817 -//.word 0x959cb2d9 -//.word 0x5b606319 -//.word 0xe81b4f37 -//.word 0x25ddde4e -//.word 0xd336ed17 -//.word 0xd93ec30b -//.word 0xdcd846c8 -//.word 0x11386eb6 -//.word 0x4fa3fbea -//.word 0x6976634b -//.word 0xba6a0ff3 -//.word 0x0116c6d8 -//.word 0x70b66aab -//.word 0xff2ae200 -//.word 0x064257b0 -//.word 0x0b38a37b -//.word 0xd87e06f2 -//.word 0xd1ba1b95 -//.word 0x85100b38 -//.word 0x839f01ab -//.word 0x6f4ede99 -//.word 0x55c82db1 -//.word 0x3cc55904 -//.word 0xff8c1dae -//.word 0x58b53db9 -//.word 0x3e34743e -//.word 0x7193adcd -//.word 0x537f760f -//.word 0xf986b1aa -//.word 0x821f8c65 -//.word 0xa7ebb48d -//.word 0x943ac697 -//.word 0xf6d10706 -//.word 0x56eb5490 -//.word 0xa57d5c7c -//.word 0x18be0c4e -//.word 0x36e74ba6 -//.word 0x2f37e866 -//.word 0x6f3bd013 -//.word 0x734c857e -//.word 0xdb59cba3 -//.word 0xc1e7a5d1 -//.word 0x4a557f0b -//.word 0x7a65adaf -//.word 0x4df81455 -//.word 0x031927fa -//.word 0xbb3d165e -//.word 0x43c941aa -//.word 0x2fd5f356 -//.word 0x28304d4a -//.word 0x87a48043 -//.word 0x237b4079 -//.word 0x6641757f -//.word 0xa7cc336a -//.word 0xb37aec35 -//.word 0xadbae464 -//.word 0x19cee6e8 -//.word 0x33cf3643 -//.word 0x85f1c6ec -//.word 0xb808acf5 -//.word 0xab4bd4eb -//.word 0xc258f2fe -//.word 0x8179bb61 -//.word 0x592655f4 -//.word 0xc1cb0c21 -//.word 0x89cb4603 -//.word 0x6bc4b9ce -//.word 0xe415db6b -//.word 0x429d9a62 -//.word 0xfdc64efd -//.word 0x4ac2ecab -//.word 0xee157ca2 -//.word 0x5054cdc8 -//.word 0xd32c67d4 -//.word 0x62a5c1b0 -//.word 0x4da8b422 -//.word 0x53c030ac -//.word 0x001d2eb1 -//.word 0x39dee5d8 -//.word 0x159041b6 -//.word 0xeef191a7 -//.word 0xb8fa80fc -//.word 0x921d465c -//.word 0x9bcc1f64 -//.word 0x073afc91 -//.word 0x72657960 -//.word 0x735410b3 -//.word 0x759d8c77 -//.word 0xc22bc084 -//.word 0xe13e78c4 -//.word 0x22b3b098 -//.word 0x77860477 -//.word 0x859568d9 -//.word 0xfba71953 -//.word 0x23acd403 -//.word 0xb747452e -//.word 0xf589c228 -//.word 0xf5003974 -//.word 0x3bf0672d -//.word 0x89e04ba4 -//.word 0xf658db4b -//.word 0x44eaf5d2 -//.word 0x6f6f988f -//.word 0x82935423 -//.word 0xae94ff5b -//.word 0x9d46aa54 -//.word 0x045bd3e3 -//.word 0x78e1dd33 -//.word 0x820cbdb0 -//.word 0xf536f524 -//.word 0x7f24c620 -//.word 0x7f8ba19e -//.word 0x16d2e0e4 -//.word 0x811ab3ac -//.word 0xa67c5d81 -//.word 0xec91a06c -//.word 0x503875d0 -//.word 0xb6930193 -//.word 0x7c53c57e -//.word 0x553615e7 -//.word 0x55cdcb8d -//.word 0x48833cc3 -//.word 0x48db6bd1 -//.word 0x8ff97d97 -//.word 0x89646d73 -//.word 0x2d0a0165 -//.word 0x8e85fd71 -//.word 0xad9c9645 -//.word 0x920d291c -//.word 0x9b8a2de2 -//.word 0x13016799 -//.word 0x06205cfb -//.word 0x54190c61 -//.word 0x05a2dde3 -//.word 0xdc40d6c1 -//.word 0x2fc60d02 -//.word 0xf618635a -//.word 0x21356e51 -//.word 0x2f75b7a2 -//.word 0xfc0f26e1 -//.word 0xdaddba61 -//.word 0xe4647d55 -//.word 0x8f0fb835 -//.word 0x82bb6364 -//.word 0xa878df0f -//.word 0x838ee858 -//.word 0xc3bfc5b4 -//.word 0x17ccc191 -//.word 0x433bdf3d -//.word 0x7356ca03 -//.word 0xce770b97 -//.word 0x4f837eb4 -//.word 0xd0b50703 -//.word 0x689d813f -//.word 0xf768f797 -//.word 0xff611753 -//.word 0xb6b8e3bb -//.word 0x5982aa34 -//.word 0xc20237ad -//.word 0x3d274839 -//.word 0x985542fd -//.word 0x7969224d -//.word 0xf4f7b712 -//.word 0x5dd50f6f -//.word 0x5bde2fa4 -//.word 0x3ef00632 -//.word 0x9337a440 -//.word 0xf5aea83d -//.word 0x26e2f7c7 -//.word 0x5efab4cb -//.word 0xe2f46cee -//.word 0xd931902c -//.word 0x5b3429bf -//.word 0xcca7c743 -//.word 0x689eba17 -//.word 0x1e208506 -//.word 0xa2e49027 -//.word 0xbe581d01 -//.word 0xe9e77df3 -//.word 0x1a7c84d4 -//.word 0xde423ad6 -//.word 0xa9afd3b0 -//.word 0x69c0e2fc -//.word 0x6186c9dd -//.word 0x35e174e6 -//.word 0x418c4737 -//.word 0x2f5954e9 -//.word 0xc9bed2ad -//.word 0x0b91caaf -//.word 0x7d1014c1 -//.word 0xc02482b5 -//.word 0x66e75b0a -//.word 0x07630bcc -//.word 0x909d18b5 -//.word 0xdfd25898 -//.word 0x8d006200 -//.word 0x0ba84214 -//.word 0xf1d271bd -//.word 0x9253040b -//.word 0xd44b23d5 -//.word 0x3ff1bda0 -//.word 0x53937ac2 -//.word 0x1fd8f1c8 -//.word 0x0f491c14 -//.word 0x060f08cb -//.word 0xacfed1ee -//.word 0x0ad3cec6 -//.word 0x54ba0986 -//.word 0x0514f22c -//.word 0x317654a8 -//.word 0x17f58740 -//.word 0xf7a1e833 -//.word 0x234f869c -//.word 0x579c1e9a -//.word 0x4d2e4aae -//.word 0x8d3df564 -//.word 0x83521236 -//.word 0xd34f8dad -//.word 0xf1b082c9 -//.word 0xec10aea3 -//.word 0x8aef2351 -//.word 0x9ab23f0a -//.word 0x86ebde8a -//.word 0x28dbcfb8 -//.word 0xde368587 -//.word 0xe1250f1a -//.word 0xd2914b2b -//.word 0x969f56ad -//.word 0x647746b0 -//.word 0x1c4a1c86 -//.word 0xdb93f424 -//.word 0xcc9d7fca -//.word 0x4145b3e7 -//.word 0x0201c137 -//.word 0xe421482e -//.word 0x9e55c899 -//.word 0xd9705983 -//.word 0x866b9d55 -//.word 0x74adf342 -//.word 0x2289ede2 -//.word 0xd209051d -//.word 0xdeea8b4b -//.word 0x4fe7e299 -//.word 0xac3becaf -//.word 0x1061c390 -//.word 0x7f1eaac1 -//.word 0x7ac143ad -//.word 0xd1aa0248 -//.word 0xb909e1f3 -//.word 0x1ee855a0 -//.word 0x3b6c8136 -//.word 0x6757aa37 -//.word 0x32d2eca0 -//.word 0xb06a2b10 -//.word 0x15584c2d -//.word 0x8205a443 -//.word 0x1fcdb02f -//.word 0x6a03077c -//.word 0xcf368ecb -//.word 0x78b3eb78 -//.word 0x664b3c7a -//.word 0xc157088b -//.word 0x6cf9758a -//.word 0xdda4bc1d -//.word 0x2cdedb9a -//.word 0x69448a28 -//.word 0x33cf6f21 -//.word 0x865795bb -//.word 0xd5551be8 -//.word 0x59ed297a -//.word 0xa82c288b -//.word 0x898e331c -//.word 0x07c3c8fc -//.word 0xc4b2c4ec -//.word 0x90bf8e00 -//.word 0x3a499248 -//.word 0xa677f1b0 -//.word 0x20357625 -//.word 0xf079cdf9 -//.word 0x2fcbef89 -//.word 0xd904e11d -//.word 0x23569e0f -//.word 0x0e8c5230 -//.word 0x3c93c867 -//.word 0x023a269b -//.word 0xc036d8d3 -//.word 0x6d69ca9c -//.word 0x7664daac -//.word 0xc92a8dc4 -//.word 0x2c3600db -//.word 0xd4c02278 -//.word 0x333d2160 -//.word 0x11252271 -//.word 0xdef835ce -//.word 0x4783883c -//.word 0x0760dbcc -//.word 0x00bc33bb -//.word 0x8a5cd396 -//.word 0x0be268a1 -//.word 0xc84d847a -//.word 0xfac04dfa -//.word 0x2584775c -//.word 0xa54f6fa1 -//.word 0x89c7d932 -//.word 0xa5423dc8 -//.word 0xe3d0fd89 -//.word 0xda7b8b74 -//.word 0xa2cdd8fe -//.word 0xe69310fd -//.word 0x3ae184c6 -//.word 0xaf56e892 -//.word 0xa5a1be27 -//.word 0xe14412b4 -//.word 0xe09868fc -//.word 0x6a12f3b6 -//.word 0x6ac40734 -//.word 0xfc27d144 -//.word 0xc8174654 -//.word 0x8f1f59d9 -//.word 0x03f771f1 -//.word 0xdc4b1a46 -//.word 0x28befa36 -//.word 0xe22f0832 -//.word 0xc73bf864 -//.word 0x6503f995 -//.word 0x752fa34d -//.word 0x6a332b3c -//.word 0x4ad0dad8 -//.word 0xbddebd48 -//.word 0x644a9d81 -//.word 0x6b5b31af -//.word 0x623993d6 -//.word 0x48aff1b9 -//.word 0xe93085fb -//.word 0x6b18c784 -//.word 0x2335e126 -//.word 0xad866380 -//.word 0x3b423823 -//.word 0x2d1cd9f4 -//.word 0xe2c6c0d2 -//.word 0xceb42078 -//.word 0xcd22d3a4 -//.word 0xb7589379 -//.word 0x352d6e21 -//.word 0xd3ca74b8 -//.word 0x56b0b365 -//.word 0x4ffd65ca -//.word 0xf0ea679f -//.word 0x1f99ed99 -//.word 0xc90e7591 -//.word 0x797bf9e2 -//.word 0x29c06913 -//.word 0x583258b6 -//.word 0x5c9bf68f -//.word 0xfa833ef9 -//.word 0x34ae7086 -//.word 0x62e6c2e6 -//.word 0x84fb520a -//.word 0xd7076088 -//.word 0xa6f6ba42 -//.word 0x63467743 -//.word 0xf60ce8e9 -//.word 0x5538cc49 -//.word 0x5519c3cf -//.word 0xc0240625 -//.word 0xa7f15456 -//.word 0xf9863034 -//.word 0x55d849f7 -//.word 0x1d8f3a26 -//.word 0xcc0a73bb -//.word 0x89a37782 -//.word 0xfc3449c2 -//.word 0x60da201f -//.word 0xd9f862bf -//.word 0x087fd0ac -//.word 0xdd6dfe79 -//.word 0xad940729 -//.word 0x859d7e4c -//.word 0xbd4ca86b -//.word 0xd006e8a6 -//.word 0x6b907a9c -//.word 0xc319648b -//.word 0x2c7baab8 -//.word 0xe8bec212 -//.word 0x3cdd4712 -//.word 0xc9cdf2e5 -//.word 0x1abcc5cd -//.word 0x7a9789c5 -//.word 0x08ce7b64 -//.word 0x0d5b4303 -//.word 0x8c012522 -//.word 0x1bd17b08 -//.word 0xf2f363aa -//.word 0x42a3b5ce -//.word 0xc87a3870 -//.word 0xa1ef1565 -//.word 0x601d8b3e -//.word 0x5ec7e56f -//.word 0x5199a9b1 -//.word 0x20b013a4 -//.word 0xf65dc1b9 -//.word 0x9626b04f -//.word 0xee0e671c -//.word 0xee1772cf -//.word 0x9a0412f3 -//.word 0x5e633317 -//.word 0xa2cb9e2c -//.word 0x9f63702e -//.word 0x71a3cb07 -//.word 0x6d5fcbb0 -//.word 0xb401bc99 -//.word 0x08168a4b -//.word 0xdf0c784c -//.word 0xb6391542 -//.word 0xa8206d5c -//.word 0x3ff07cee -//.word 0x8a4ee85b -//.word 0x7054ef38 -//.word 0x43da9dae -//.word 0x99f44320 -//.word 0x57bb260e -//.word 0x0e51743a -//.word 0x8b1f7c09 -//.word 0xa9611d2b -//.word 0x6ae57f7e -//.word 0x460f0230 -//.word 0xc3217425 -//.word 0x46b98798 -//.word 0x299c8204 -//.word 0x0db13645 -//.word 0x725134fa -//.word 0x85be3d2f -//.word 0x38f0fa39 -//.word 0x9898ede0 -//.word 0x5c5fa8c4 -//.word 0xb96e3df9 -//.word 0x7e34f5f5 -//.word 0x5c6345ac -//.word 0x853cfdf9 -//.word 0x7a0dc340 -//.word 0x1df8c052 -//.word 0x0ef59990 -//.word 0x341aa154 -//.word 0x9a1b4d8c -//.word 0x7d0de8a8 -//.word 0xa36f87b7 -//.word 0xee6a40cc -//.word 0x305897a7 -//.word 0x41843991 -//.word 0x4f30ed88 -//.word 0x76ddc79c -//.word 0x90c69e99 -//.word 0x4faec1e6 -//.word 0x89dbe6ad -//.word 0xd263633c -//.word 0x50a6a1ac -//.word 0xcb1ccdc0 -//.word 0x0451d00f -//.word 0x482d8266 -//.word 0x44791a68 -//.word 0x1b9fea77 -//.word 0xb6b149d8 -//.word 0x5cadd011 -//.word 0x8200c996 -//.word 0xe448e4a5 -//.word 0xd45e2c6f -//.word 0xd2943a78 -//.word 0x5e3ba840 -//.word 0x0a69c923 -//.word 0xd3f9977e -//.word 0xb1d2ed13 -//.word 0x6d6df7af -//.word 0xb391e60a -//.word 0x6861e8ee -//.word 0x3d99579b -//.word 0x8515306b -//.word 0x4493c8b2 -//.word 0x88b9bae8 -//.word 0xfc5a240a -//.word 0xbaf5133d -//.word 0x617e3bb5 -//.word 0x6761ecd5 -//.word 0xb1c54197 -//.word 0x610d9b2f -//.word 0xf0a54deb -//.word 0x7cfb995e -//.word 0x63cbdcbd -//.word 0x10a00589 -//.word 0x15984b6e -//.word 0x7a67206c -//.word 0x559e6034 -//.word 0x9b2ecfd5 -//.word 0x3627c297 -//.word 0x58c61c27 -//.word 0x0eaf7cf5 -//.word 0x1877b5db -//.word 0xf8657fff -//.word 0x497a6cfa -//.word 0x52ae1d3a -//.word 0xdb7db5a4 -//.word 0x3fa28e7e -//.word 0xc3232b8d -//.word 0x268d6e7a -//.word 0x7a810b7b -//.word 0x326f3d2f -//.word 0x7ba2b8c9 -//.word 0xd07dde70 -//.word 0xc80435e6 -//.word 0x339e1968 -//.word 0x6618aed6 -//.word 0xd3ee1914 -//.word 0xddc6f0b0 -//.word 0xea3eeec5 -//.word 0xb9e7ec1f -//.word 0xf6910c9f -//.word 0x0bca38e1 -//.word 0x3aa1cb1d -//.word 0xe8b08d4b -//.word 0x3c59e58b -//.word 0xe94f4ac3 -//.word 0x4858fb8a -//.word 0xaa52f045 -//.word 0xec74108f -//.word 0x4cd7a4df -//.word 0x7a350c64 -//.word 0xf3f0b034 -//.word 0x8a563aa6 -//.word 0x472303fc -//.word 0x7547ca46 -//.word 0xf7eaac83 -//.word 0xdbae5008 -//.word 0x32346326 -//.word 0x1ee14407 -//.word 0x2ce200d9 -//.word 0xe46d802e -//.word 0x9f4a01a3 -//.word 0x9993c5c0 -//.word 0x47b80820 -//.word 0xebc536d2 -//.word 0x65e85bfe -//.word 0x4c2edbcc -//.word 0x3d8d6381 -//.word 0x73271fec -//.word 0x98cd2e00 -//.word 0xdbc253c2 -//.word 0x43c2ed66 -//.word 0x434329b4 -//.word 0x8efb76b1 -//.word 0x2ca2397c -//.word 0xcef9c276 -//.word 0x5f0b7fa5 -//.word 0xdbb3705b -//.word 0x645edb12 -//.word 0x9312419b -//.word 0x0cb09078 -//.word 0x55769a86 -//.word 0xe8c7c6df -//.word 0x862f06fe -//.word 0xcfa20924 -//.word 0x1004b1fb -//.word 0x5cefc779 -//.word 0xdeb0ee08 -//.word 0x6d92d5e4 -//.word 0x6160b1c4 -//.word 0xa525ebbc -//.word 0x0e361562 -//.word 0xeb722330 -//.word 0xdec9d829 -//.word 0xeafb7ebf -//.word 0xcca2daf5 -//.word 0x8f735fc1 -//.word 0x5bc1a2b4 -//.word 0x8e420edc -//.word 0x0d16d9ea -//.word 0xdd053690 -//.word 0xed09cd2d -//.word 0x360c68ac -//.word 0x06f2efa9 -//.word 0x99da96d6 -//.word 0xeaa1559e -//.word 0xc8a89908 -//.word 0x2cd839dd -//.word 0xcae3ab0d -//.word 0xe6cc784f -//.word 0x69a9ed08 -//.word 0x34a8136e -//.word 0xb450e2ed -//.word 0xb709b2ca -//.word 0x7edff206 -//.word 0x13831c85 -//.word 0xdd92e86f -//.word 0x711ac1d7 -//.word 0xab5b759a -//.word 0xfeca308a -//.word 0x085cabcc -//.word 0x6900a17f -//.word 0xd66d839e -//.word 0x691f6c28 -//.word 0x3b9c577e -//.word 0x35fc900c -//.word 0x23a8682b -//.word 0x0a622d46 -//.word 0xbc86593c -//.word 0xa98f0a06 -//.word 0xf8dcb29a -//.word 0xd7b5100f -//.word 0x0f895f01 -//.word 0xdb79cd37 -//.word 0xfa1b2e83 -//.word 0x0377f2ea -//.word 0xf9565405 -//.word 0x1fbdd5a7 -//.word 0x0db4e9c1 -//.word 0x044bf082 -//.word 0x7fdf67c2 -//.word 0x0a9a60a0 -//.word 0x57392f6a -//.word 0x8f1267be -//.word 0xe65505ef -//.word 0x7292eaaa -//.word 0x3d7b8fda -//.word 0x99ecf4c8 -//.word 0xb328d987 -//.word 0x6b66318f -//.word 0x638cd4a8 -//.word 0x563a740a -//.word 0xac0ad2c2 -//.word 0x4b163157 -//.word 0xafbb0bae -//.word 0x3d9d042b -//.word 0xd4eb1c19 -//.word 0xa6e5284c -//.word 0x469b8304 -//.word 0x01f70115 -//.word 0x72fd2445 -//.word 0x515293f6 -//.word 0x8cfbc705 -//.word 0x996808f1 -//.word 0x0ab19840 -//.word 0x621f2e1e -//.word 0x27eea548 -//.word 0x3851f628 -//.word 0x61b76441 -//.word 0x2d4df6ce -//.word 0xfbc42aa6 -//.word 0x5454e863 -//.word 0x7c01b5c3 -//.word 0x471d294f -//.word 0x2e0ea33a -//.word 0xa2513b8b -//.word 0xa1bff87f -//.word 0x860f4428 -//.word 0x259d9c5b -//.word 0x17698cc9 -//.word 0x5363db6c -//.word 0xfee60325 -//.word 0x8582e3a3 -//.word 0xe8feb886 -//.word 0x599d4ac4 -//.word 0x05a1634c -//.word 0x320e85ea -//.word 0x8ab0dc6b -//.word 0xb65f7201 -//.word 0x2f82a2e9 -//.word 0x51d2cf4a -//.word 0xb2615661 -//.word 0xb1dac0db -//.word 0x520a3d82 -//.word 0x499f4e1c -//.word 0x5430c190 -//.word 0xce7ee24b -//.word 0x82faf0e2 -//.word 0xbd87cef9 -//.word 0xa780fb63 -//.word 0xd2fdc48b -//.word 0x1452b812 -//.word 0x92d95db9 -//.word 0x1ef22182 -//.word 0xc3479312 -//.word 0x9d55d35a -//.word 0xee284776 -//.word 0x6f6590d5 -//.word 0xe48ebd9b -//.word 0xf382be43 -//.word 0x36431b89 -//.word 0x8ffce687 -//.word 0xbc43ee1e -//.word 0x2b9b3597 -//.word 0x0f3da48a -//.word 0xb318feff -//.word 0x0e1613d4 -//.word 0x99a1365f -//.word 0x5d66f053 -//.word 0x5058f6e8 -//.word 0xe1f85936 -//.word 0xd2d4fde2 -//.word 0x464e4cfd -//.word 0x1b9f2b29 -//.word 0x791c2dfe -//.word 0xabb707ac -//.word 0x2ec845e1 -//.word 0x080e3bed -//.word 0x5bf03d24 -//.word 0x3a091383 -//.word 0xbbe4a797 -//.word 0x4e04019b -//.word 0x4d2875e1 -//.word 0xd4cd1b73 -//.word 0xd2f380f9 -//.word 0x60249bdd -//.word 0x52b303ae -//.word 0x0c425fc2 -//.word 0x98861d20 -//.word 0xf54f679c -//.word 0xb1c25244 -//.word 0xbae959fb -//.word 0x716f0b64 -//.word 0x00a40002 -//.word 0xedc7119d -//.word 0xf085c8e7 -//.word 0x02bd165f -//.word 0xb7864476 -//.word 0xcd732cf0 -//.word 0x0516a98e -//.word 0x31c24cea -//.word 0x8f9551a2 -//.word 0x55b6d1b8 -//.word 0x8ddc3939 -//.word 0x2310fa1d -//.word 0x3db3826f -//.word 0xcac26cae -//.word 0x5e59f372 -//.word 0x3d76ad52 -//.word 0xb6007606 -//.word 0xb208a9c9 -//.word 0x8c4e9701 -//.word 0x23073122 -//.word 0x2edd08d0 -//.word 0xd0387844 -//.word 0x6dbc1ff0 -//.word 0xbb139466 -//.word 0x1cec5676 -//.word 0x2b430396 -//.word 0x94e3cb88 -//.word 0x2a2a2336 -//.word 0x330dbee1 -//.word 0x065bb97a -//.word 0xd9461650 -//.word 0xd41f6bec -//.word 0x6a61db39 -//.word 0xe8f146e9 -//.word 0x4ea4bd13 -//.word 0x5f023921 -//.word 0xf44a8ce9 -//.word 0x95b6971a -//.word 0x4affbeda -//.word 0xaf2499ad -//.word 0x4768ec99 -//.word 0x1299da88 -//.word 0x629855ed -//.word 0xea16d9aa -//.word 0x189c5a32 -//.word 0xa5ce7bea -//.word 0x6af000d6 -//.word 0x75a98671 -//.word 0x5c0771dc -//.word 0xd1c4273b -//.word 0x77c87c5d -//.word 0xf4ee6c9b -//.word 0x480b1002 -//.word 0x5d2dcbb4 -//.word 0xde20c58b -//.word 0x4d379a00 -//.word 0x5048534b -//.word 0x4cf995cc -//.word 0x353a18aa -//.word 0xa5135bba -//.word 0x2ba096a2 -//.word 0xe55af13e -//.word 0x5197f342 -//.word 0x60553d21 -//.word 0xcc33782e -//.word 0xacc08c01 -//.word 0x46f8121d -//.word 0x240c0dd0 -//.word 0x6a62d45a -//.word 0x66dd5351 -//.word 0x695e7343 -//.word 0xd58bd79e -//.word 0x78cfc9cd -//.word 0x18a174a4 -//.word 0x4f0a53fe -//.word 0x9a61e9a4 -//.word 0xac5ab371 -//.word 0x083f5bb4 -//.word 0xce7c2ed6 -//.word 0xd561d03d -//.word 0xfb242e6f -//.word 0xb925b57b -//.word 0xfb76c295 -//.word 0x2e9b5900 -//.word 0x9a8e1931 -//.word 0xf2076f31 -//.word 0x29f90b43 -//.word 0x886090c7 -//.word 0xfe3a905e -//.word 0xb7d3b74f -//.word 0xef464629 -//.word 0x0941c3aa -//.word 0xdb08efe0 -//.word 0x4dbdf98e -//.word 0x22def1d1 -//.word 0x150f7f03 -//.word 0x281ad5e0 -//.word 0x3934e2e7 -//.word 0xd682c903 -//.word 0x52db916b -//.word 0x18d01ec7 -//.word 0x40e96094 -//.word 0x6032cac9 -//.word 0xa5f606bb -//.word 0x22cbe73e -//.word 0x67ce9f0d -//.word 0x5630326c -//.word 0x32f22a0b -//.word 0xf9ec8d2e -//.word 0xf4140c0b -//.word 0x8cfd7d73 -//.word 0x5f9e8bb5 -//.word 0x9355acc0 -//.word 0x6a2c5487 -//.word 0x175a69aa -//.word 0xd10df652 -//.word 0x2566235c -//.word 0x90c565bb -//.word 0x4d48f217 -//.word 0x6c8e78ba -//.word 0x24c10ead -//.word 0x6ad36b1e -//.word 0xc2075505 -//.word 0x56b45d08 -//.word 0x4546ca9b -//.word 0x3d85d36b -//.word 0x4c1a11fd -//.word 0xf34e3392 -//.word 0x7d16f44f -//.word 0x8e4d4a9a -//.word 0xff40e0c7 -//.word 0xe96fc7f4 -//.word 0x00926931 -//.word 0x23dbbee5 -//.word 0x317bc26d -//.word 0x1d672605 -//.word 0x455c45ec -//.word 0xff205bc3 -//.word 0x750cf136 -//.word 0xb4c79cdf -//.word 0xff54e767 -//.word 0x694f8eef -//.word 0xa373edae -//.word 0x1260b7db -//.word 0x249bebcd -//.word 0xe5d70461 -//.word 0xcd73719c -//.word 0xdc434491 -//.word 0xea932e85 -//.word 0x3869ab52 -//.word 0x4a0b7a09 -//.word 0xf9c150db -//.word 0xc4dccd3a -//.word 0x67f7af3b -//.word 0xaf7d463f -//.word 0x8c6c28d2 -//.word 0x685825d3 -//.word 0xb7b27dd6 -//.word 0xcf4a51c6 -//.word 0xfa1358cf -//.word 0xca26d37a -//.word 0xad0ac31a -//.word 0xc1335968 -//.word 0xeac8ae6a -//.word 0x21aab499 -//.word 0x0fb16d42 -//.word 0xda395a2d -//.word 0x3fdd377d -//.word 0xe182e5d7 -//.word 0xe098a8c6 -//.word 0xae9c925e -//.word 0x1ee13f20 -//.word 0xbe91c31e -//.word 0x67eee160 -//.word 0x12de7e85 -//.word 0xeda754ad -//.word 0xaff7eb97 -//.word 0x2827c507 -//.word 0x1cc0d96b -//.word 0x513f44bd -//.word 0xe7153aab -//.word 0xe8f242f6 -//.word 0x2043a318 -//.word 0x2ffa1929 -//.word 0xdc8dcd03 -//.word 0xac4184a5 -//.word 0xb4a817d5 -//.word 0xab68230a -//.word 0x433f0188 -//.word 0xb944f9cd -//.word 0xab70b22c -//.word 0x2b5cedb8 -//.word 0x114c7363 -//.word 0x956d4c67 -//.word 0x1d5b32e5 -//.word 0x53e646cc -//.word 0x7b1601fd -//.word 0x046d6cad -//.word 0x5c6b940a -//.word 0x09583821 -//.word 0xf63dc6ff -//.word 0x0a348616 -//.word 0xffe114e3 -//.word 0x724113ce -//.word 0x36a22052 -//.word 0xeef3055d -//.word 0xdb3e2ffa -//.word 0xf273632d -//.word 0x3267ac1e -//.word 0x341c987a -//.word 0x0443a317 -//.word 0x2ffff4d7 -//.word 0x1dec47ce -//.word 0xa1602ba7 -//.word 0xcff16d43 -//.word 0x0e37d4a4 -//.word 0x6ed30e0a -//.word 0x3bafeb5b -//.word 0xd288c9c8 -//.word 0xb3aa50ae -//.word 0xd8fb5fba -//.word 0x453b4551 -//.word 0xe18a352f -//.word 0x842bf44e -//.word 0x5187d509 -//.word 0x4675e781 -//.word 0x11b86d40 -//.word 0x25c98e1c -//.word 0x0ed84e5e -//.word 0x010dbd24 -//.word 0xb8136e04 -//.word 0x7dd72bf2 -//.word 0x848de764 -//.word 0x7df5f4b4 -//.word 0x6adc77c5 -//.word 0xaee518e9 -//.word 0x6789fe02 -//.word 0xfe5dfae8 -//.word 0xfd93020b -//.word 0x20c4e25a -//.word 0xaeed2e63 -//.word 0x09b77bbb -//.word 0x80000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x0000A4E0 -//// expected output -//.word 0x8ecdb553 -//.word 0xcfbe2451 -//.word 0xfeb4b644 -//.word 0x0056099d -//.word 0xd6511fae -//.word 0xf2ac7ba9 -//.word 0x2b646c06 -//.word 0x1be2857c -//.word 0x5bd09710 -//.word 0xaa56658d -//.word 0x4e3f5668 -//.word 0x50b680b2 -//.word 0x3f2e0134 -//.word 0x4902fe0c -//.word 0x83e8d3c8 -//.word 0x714c8fac -//// SHA512LongMsgvector_53 -//// vector length -//.word 0x0000A7F8 -//// input message -//.word 0x5e7d99ce -//.word 0xbeb23c5c -//.word 0xf1c7340b -//.word 0x5b5e2c2d -//.word 0x1af148a5 -//.word 0x97125a48 -//.word 0x5bf7588a -//.word 0x25350e56 -//.word 0x39cc103d -//.word 0xfa64f3d3 -//.word 0xbbd6bc56 -//.word 0xd3ee9991 -//.word 0xef70cf00 -//.word 0xad58f435 -//.word 0x66665e7a -//.word 0x4adadbb8 -//.word 0xb37da298 -//.word 0xb3e08ae7 -//.word 0xefe87a3f -//.word 0xb18a21e4 -//.word 0x38d4e7ec -//.word 0x532d23a3 -//.word 0x2edd8e2d -//.word 0x6bd0f86d -//.word 0x74963926 -//.word 0x10af6b60 -//.word 0x3506560e -//.word 0x1ebb2ced -//.word 0x9c2577af -//.word 0xb1184f59 -//.word 0x5b63d0ea -//.word 0xae9dcb3d -//.word 0x2522bc30 -//.word 0x3a58fc06 -//.word 0x3437380a -//.word 0x41082275 -//.word 0xc46c6692 -//.word 0xf0a1e020 -//.word 0x96010cf8 -//.word 0x3bcbbef0 -//.word 0x6e2613fe -//.word 0x5963a7a1 -//.word 0x9583087c -//.word 0x43f96b44 -//.word 0x58b19edd -//.word 0x38503ec0 -//.word 0x87be2aa0 -//.word 0x3be2374d -//.word 0xf6ac26d8 -//.word 0x9459d3f8 -//.word 0xfff2aeac -//.word 0x4b166f22 -//.word 0xfffa06d8 -//.word 0xb0aed101 -//.word 0xd5a2122a -//.word 0xd668a01d -//.word 0x66bbdd06 -//.word 0x13c1e7d4 -//.word 0x1b8d13e2 -//.word 0x82e897d7 -//.word 0x615186cb -//.word 0x814202ab -//.word 0x28b5adde -//.word 0x33e76028 -//.word 0x655c20cf -//.word 0xff234dfd -//.word 0x915b1d66 -//.word 0x0ff6492a -//.word 0x27bd06fd -//.word 0xd2943785 -//.word 0x2a00e103 -//.word 0x7be6df36 -//.word 0x9c96d77d -//.word 0x80076c3b -//.word 0x0864b57f -//.word 0x1bc8eee5 -//.word 0xf9476eb7 -//.word 0xcc2dd958 -//.word 0x818a97e3 -//.word 0xd5ee850f -//.word 0xb371ea56 -//.word 0xbdf6ac56 -//.word 0x29b1c477 -//.word 0xcee7efce -//.word 0x7ef5a641 -//.word 0x979451ec -//.word 0xd55bb8c4 -//.word 0x6a86ba7a -//.word 0x51f541a3 -//.word 0xdf787515 -//.word 0x9b493094 -//.word 0x4fdab2ae -//.word 0x5fd197e3 -//.word 0x5a510609 -//.word 0xcf7c2aef -//.word 0x6236e641 -//.word 0x1e2bc4ab -//.word 0x0d132f41 -//.word 0x0635e31f -//.word 0xc729a14c -//.word 0x44e327e5 -//.word 0x3eed5f77 -//.word 0x16f4d7ac -//.word 0xe486712a -//.word 0xc41a5cb8 -//.word 0x705142a2 -//.word 0x147bc35f -//.word 0x5d5d2372 -//.word 0xd3323f8e -//.word 0x6aefc6fd -//.word 0x53cba543 -//.word 0x18ffc3fe -//.word 0xe8caef10 -//.word 0x30b91700 -//.word 0x6b25ba9e -//.word 0x3afd9fe6 -//.word 0xb7c6c827 -//.word 0x06dfa265 -//.word 0x2e0a7efb -//.word 0x27284484 -//.word 0x354466fc -//.word 0x74d31423 -//.word 0xb33aaf22 -//.word 0x85917f71 -//.word 0x96a7a8f8 -//.word 0x3c465a75 -//.word 0x4eb8491d -//.word 0x39895d86 -//.word 0x508faac4 -//.word 0x6428a2d3 -//.word 0x95c38935 -//.word 0x67a22adb -//.word 0x19dec949 -//.word 0x32ab58f6 -//.word 0x5cddeef1 -//.word 0x75ab74ca -//.word 0xe4b3a2b0 -//.word 0x293f2ad7 -//.word 0xb8c7321d -//.word 0x08b708ec -//.word 0xe7711162 -//.word 0x109603af -//.word 0xff8254bf -//.word 0x0415f31a -//.word 0x97b93508 -//.word 0xeba012f8 -//.word 0xc64e9122 -//.word 0x8f58816c -//.word 0xa96b6a8a -//.word 0xff8fc36a -//.word 0xe0ad65cf -//.word 0x0e4f403c -//.word 0x11a84d13 -//.word 0xd1d4c3fe -//.word 0x64618e8e -//.word 0x250dfd22 -//.word 0x06d1bb0b -//.word 0x271f00ed -//.word 0xa7690868 -//.word 0xbae2c5f8 -//.word 0xfb88d11a -//.word 0x0462a6b1 -//.word 0x3c0611a7 -//.word 0xf15fe4d7 -//.word 0xa7adec2b -//.word 0xafcd2201 -//.word 0xfbbb25d4 -//.word 0x3055e818 -//.word 0xfd62a865 -//.word 0xacd222d8 -//.word 0xf64702b7 -//.word 0x1cd59e53 -//.word 0x3306e433 -//.word 0xbf22916e -//.word 0x84ada559 -//.word 0x99301362 -//.word 0xbe3dbc3c -//.word 0xefad9e3d -//.word 0x3a2c4904 -//.word 0xcdf8935e -//.word 0x53e58d6b -//.word 0x81a5b6fc -//.word 0xeb466e40 -//.word 0x1dfcada0 -//.word 0xe721f4e7 -//.word 0xf87a84a6 -//.word 0xaebccfd7 -//.word 0x2d4e2cc0 -//.word 0xaf51ce1a -//.word 0x1bdef773 -//.word 0xd88e69d1 -//.word 0xe3401e98 -//.word 0x1f1638ad -//.word 0xedc13bdc -//.word 0xfdff7a77 -//.word 0x6461cf40 -//.word 0xee528f89 -//.word 0xb555bd9a -//.word 0xf28e7e53 -//.word 0x1484cd13 -//.word 0x0f2570d8 -//.word 0xf70b2ba7 -//.word 0xcdfd332e -//.word 0x99b9e5a8 -//.word 0xb8f0b801 -//.word 0x7893713a -//.word 0xe24d9610 -//.word 0xd75124d8 -//.word 0x5f5584ae -//.word 0x3ddebcce -//.word 0xc7bfe342 -//.word 0xf4dcd7be -//.word 0xb73432c8 -//.word 0x8b1f791b -//.word 0x4fd3974e -//.word 0x552d8ab1 -//.word 0xb6af5d78 -//.word 0xe8c5561b -//.word 0x924c70fc -//.word 0x9e540b4b -//.word 0x9025e326 -//.word 0x17813f05 -//.word 0xe2296b56 -//.word 0xb5a36764 -//.word 0xbc39e17d -//.word 0x1f456154 -//.word 0xd6acc4a4 -//.word 0xbfa9eb16 -//.word 0xeeccb465 -//.word 0x444229c0 -//.word 0x4356f870 -//.word 0x203824ba -//.word 0x1afdf907 -//.word 0x0be84542 -//.word 0x3de8c582 -//.word 0x7e61dee9 -//.word 0x772f8dcc -//.word 0x39e9a113 -//.word 0x196228e3 -//.word 0xbe76277b -//.word 0x78038e5c -//.word 0xd3356aad -//.word 0x6d075ddd -//.word 0x04064b8a -//.word 0xd35857a2 -//.word 0x1ffe0ec8 -//.word 0x0d56e1f9 -//.word 0xb6e4d96f -//.word 0x7d5186c5 -//.word 0xa1b4395d -//.word 0x0e1173ff -//.word 0x791f9cc2 -//.word 0xab4ff830 -//.word 0x1d09d8a5 -//.word 0xc6390df8 -//.word 0x310aa25d -//.word 0xd2f1cb8a -//.word 0x9aee1819 -//.word 0xc90fee2e -//.word 0x04353859 -//.word 0xa71a5abe -//.word 0x5c936673 -//.word 0xed139329 -//.word 0x5671eb0f -//.word 0x1feb43f3 -//.word 0xe86a70aa -//.word 0x4608b8b3 -//.word 0xcdcf8717 -//.word 0x6ec36393 -//.word 0x042322f9 -//.word 0x29ed5bd4 -//.word 0x4ea01a4b -//.word 0x0b45d848 -//.word 0xb3b0aad9 -//.word 0x2c04b8d6 -//.word 0xfd75f1c4 -//.word 0xa952fdf9 -//.word 0x3c427301 -//.word 0x23ce4d41 -//.word 0x401f99da -//.word 0x3e0971d0 -//.word 0x22492c6c -//.word 0x230bd6de -//.word 0xbcb0de27 -//.word 0xffcd0f36 -//.word 0x2c77c151 -//.word 0x82be51b7 -//.word 0x5577ce84 -//.word 0x613ff5d4 -//.word 0x5ebc602b -//.word 0xd526fa15 -//.word 0x3106b609 -//.word 0x193e8193 -//.word 0xfd4a75b3 -//.word 0xefc54f80 -//.word 0xb52f2310 -//.word 0x1ced4e9c -//.word 0x8f91ade0 -//.word 0xe75c0cc1 -//.word 0x8501e132 -//.word 0x9eac3b58 -//.word 0xd743f5ec -//.word 0x12ec2fe2 -//.word 0x87cffe48 -//.word 0x161d6370 -//.word 0xdb517a51 -//.word 0x04b6f42b -//.word 0xdf29c76a -//.word 0x372024cd -//.word 0xe1ebaac7 -//.word 0x923ad926 -//.word 0xf4e0c9f2 -//.word 0xf8d61c98 -//.word 0x6d833147 -//.word 0xd23a9a9b -//.word 0x6805d179 -//.word 0x8ca1263a -//.word 0x44c9fc0b -//.word 0x18b83593 -//.word 0x23e9ebd7 -//.word 0x6921615b -//.word 0x6baf398a -//.word 0xf9f2e758 -//.word 0x481d6526 -//.word 0x443728e6 -//.word 0x2766547f -//.word 0x4b6c2c73 -//.word 0x3c72ccbf -//.word 0x12051a03 -//.word 0xfe5efae2 -//.word 0x22e6c1ac -//.word 0xa6f9ed3a -//.word 0x08ea131a -//.word 0xb34818ed -//.word 0xd460a40c -//.word 0x6903d472 -//.word 0x9a8a2fd6 -//.word 0x4d16dc17 -//.word 0xf51d12dd -//.word 0xaa22cf7e -//.word 0x7fc3cd1e -//.word 0x10f9b21b -//.word 0x5a9c86a8 -//.word 0xd0256bb7 -//.word 0xabb8881d -//.word 0x816247f0 -//.word 0x199fc034 -//.word 0x7e1f75b7 -//.word 0x52c93f3a -//.word 0x650188d1 -//.word 0x8626bb8d -//.word 0x995ff957 -//.word 0xea980e1f -//.word 0xc1c7a337 -//.word 0x3774b4f9 -//.word 0x477845b0 -//.word 0x280551b6 -//.word 0xdae604d9 -//.word 0x00082a03 -//.word 0xed3ae61b -//.word 0x0131a726 -//.word 0x36cf58b2 -//.word 0xf6a5d774 -//.word 0x30b6a930 -//.word 0xaa7decd9 -//.word 0x99328cfa -//.word 0x6f4aba54 -//.word 0xf43d9ac8 -//.word 0x988b3c78 -//.word 0x0701ce2a -//.word 0xff3810ed -//.word 0x5e6008fe -//.word 0x803bf6ec -//.word 0xc76c8afb -//.word 0x7bf255c6 -//.word 0xd5f07e29 -//.word 0x56afb65e -//.word 0x5de56d66 -//.word 0xf93846ab -//.word 0xfcfec9e3 -//.word 0x51475937 -//.word 0x8f1d65a5 -//.word 0xcd0ae2a3 -//.word 0xb9dbf805 -//.word 0xe4a4fb20 -//.word 0x60049e30 -//.word 0x8daa63f7 -//.word 0x301856a7 -//.word 0xc5a7fb02 -//.word 0x17cc85c0 -//.word 0x0d994831 -//.word 0xc7877123 -//.word 0xe972f506 -//.word 0x37e5c74e -//.word 0x63984e19 -//.word 0x22371612 -//.word 0x8565c695 -//.word 0x87015214 -//.word 0xe3a871b9 -//.word 0x287b524c -//.word 0x0e228a58 -//.word 0x0b115289 -//.word 0x2209ef59 -//.word 0xfce271eb -//.word 0x3989a037 -//.word 0x08453468 -//.word 0xf53e4482 -//.word 0x033f0148 -//.word 0xfbbba45d -//.word 0x030ea5a9 -//.word 0x72062efe -//.word 0xe3a2cffc -//.word 0x89197332 -//.word 0xc21e9385 -//.word 0xee63a9d6 -//.word 0x815ce8df -//.word 0x57452a5e -//.word 0x48662a76 -//.word 0xfd96f352 -//.word 0x01fe980b -//.word 0x1b1f26cc -//.word 0xdc17d734 -//.word 0x741f88fb -//.word 0xca596dd9 -//.word 0xcbc904a3 -//.word 0x01a047b8 -//.word 0x68c1269b -//.word 0x7e7e34e1 -//.word 0x9aa2a14e -//.word 0x7eb5683b -//.word 0x2f7bc93a -//.word 0x05befafd -//.word 0xfe4d1a74 -//.word 0x57456636 -//.word 0x5e8faf22 -//.word 0x82aa0c46 -//.word 0xacabcc00 -//.word 0xd282ae62 -//.word 0xc97e55db -//.word 0x5a14f614 -//.word 0x99dc5419 -//.word 0x72dceeb9 -//.word 0x8509762f -//.word 0x340b8602 -//.word 0xf9418f29 -//.word 0xfd051273 -//.word 0xe7311226 -//.word 0xf2e1c9e6 -//.word 0x437b9ad9 -//.word 0x79ed4709 -//.word 0x8536640a -//.word 0xbc280bdc -//.word 0x2a6cd212 -//.word 0x2ac6fa34 -//.word 0x349ae963 -//.word 0xf5b0da3b -//.word 0xa534d4fe -//.word 0x9501d8ee -//.word 0x071f5ffa -//.word 0x4389049d -//.word 0xe7347d04 -//.word 0x7f4ecf6f -//.word 0x55c3c2d9 -//.word 0x8b0693db -//.word 0x660eeace -//.word 0xed9f0b30 -//.word 0xb3ca5048 -//.word 0xf1b7d70d -//.word 0xd7a27845 -//.word 0x2424faea -//.word 0xf5b486d1 -//.word 0xda6d5b8e -//.word 0x2f12c492 -//.word 0xaa4f4796 -//.word 0x3041203d -//.word 0xed39eef4 -//.word 0xa3bdab1d -//.word 0x42d0e16e -//.word 0xba741b93 -//.word 0x0d6c9a1b -//.word 0xa8464a91 -//.word 0xf399f5e9 -//.word 0x278cb51f -//.word 0x6097af1a -//.word 0xf38efed6 -//.word 0x01dbeec2 -//.word 0x4c0a6b67 -//.word 0x4a8cb94b -//.word 0x78b46515 -//.word 0xf1067bf1 -//.word 0x3fb1f936 -//.word 0x715a8447 -//.word 0x6d1b5ab7 -//.word 0x88cc88b0 -//.word 0x54815d95 -//.word 0xb9531ee6 -//.word 0x4864fb64 -//.word 0xcb1d4276 -//.word 0x21bad3cc -//.word 0x4909d442 -//.word 0xbc6ea507 -//.word 0x002b16fe -//.word 0x7aded864 -//.word 0x844b32b4 -//.word 0xbf5cf5c7 -//.word 0xaa66b240 -//.word 0x74ae2a27 -//.word 0x0f2c06d4 -//.word 0x868fc90f -//.word 0x90810275 -//.word 0x652bc61e -//.word 0xd0fc5d7c -//.word 0x86a63c86 -//.word 0xb66a3316 -//.word 0xe196e890 -//.word 0xec4c84c5 -//.word 0x7484ac17 -//.word 0x6154b3dd -//.word 0xbe700e09 -//.word 0xc8ed0808 -//.word 0x444ab7e9 -//.word 0x16b02ec2 -//.word 0x1079f44f -//.word 0x08f0b5dd -//.word 0x2d573866 -//.word 0x9b2f91fe -//.word 0x2cb3986d -//.word 0x91a6991e -//.word 0xa24e4d38 -//.word 0xf3c1090a -//.word 0xa85f36ac -//.word 0x8aa001e3 -//.word 0x5a105346 -//.word 0x6597049f -//.word 0x58fe4c94 -//.word 0x56af7a87 -//.word 0x48bce8ba -//.word 0x74232eb7 -//.word 0x525196ef -//.word 0x9ae4d0a1 -//.word 0xa2b5e7fd -//.word 0xe716748a -//.word 0xe95812c5 -//.word 0x3d91110b -//.word 0xdd9b6fb8 -//.word 0xc2600391 -//.word 0xb555fc5f -//.word 0x62458add -//.word 0xae50dbd4 -//.word 0x4a334985 -//.word 0x88cad247 -//.word 0x6ed3c871 -//.word 0x0af4c97a -//.word 0x0400f25f -//.word 0x7a765045 -//.word 0x074a9760 -//.word 0x25e81713 -//.word 0xb677eb59 -//.word 0xdd5a7463 -//.word 0x12fd0683 -//.word 0x76cee048 -//.word 0x638962eb -//.word 0x48b97ae9 -//.word 0xb47c60f2 -//.word 0xb0868302 -//.word 0x5268c3ce -//.word 0x8f12e061 -//.word 0x51973207 -//.word 0xc9319b6a -//.word 0x0785bbfb -//.word 0xc8286293 -//.word 0x8f614b5a -//.word 0xf73107e9 -//.word 0x479037ab -//.word 0x47fafe89 -//.word 0x522ab6c6 -//.word 0xad26e227 -//.word 0x177b6458 -//.word 0xa1caf18b -//.word 0xc083c162 -//.word 0xa1f18b0f -//.word 0xbc77b0ba -//.word 0xac19b722 -//.word 0x3e3df988 -//.word 0xc8b39dc9 -//.word 0xbcf4c7ca -//.word 0x7ca70d18 -//.word 0x706a2bd0 -//.word 0x57cef7bd -//.word 0xdaa397c1 -//.word 0x6777f176 -//.word 0x3c596314 -//.word 0xc2e3b496 -//.word 0x1d774b18 -//.word 0x01c89f84 -//.word 0xc79cef6d -//.word 0xc0d1333b -//.word 0xc99e5289 -//.word 0x1f1c95cb -//.word 0x75055c34 -//.word 0x44bb10d7 -//.word 0x638c580c -//.word 0xd7349015 -//.word 0xeca37701 -//.word 0x850127d1 -//.word 0xb0f04bda -//.word 0x7d118c6a -//.word 0x11c94cae -//.word 0xf64597d3 -//.word 0xb5bb566c -//.word 0xa7f3c614 -//.word 0x08072954 -//.word 0x4d67bcc7 -//.word 0xb71fe87b -//.word 0x295dbc9b -//.word 0x372d9b4b -//.word 0x7f8832d4 -//.word 0x3c8dad01 -//.word 0x180e2bc9 -//.word 0x424e6f2d -//.word 0xc109d864 -//.word 0x08b59336 -//.word 0xca080fa6 -//.word 0x0fbab1d3 -//.word 0x888cca20 -//.word 0x1f89c693 -//.word 0xd38ca67b -//.word 0xc302b056 -//.word 0x88f164f1 -//.word 0xc83ab3d1 -//.word 0x081b6cd2 -//.word 0xc2f7f70e -//.word 0xb85a4500 -//.word 0x873807ea -//.word 0x7f751e73 -//.word 0xb2aa5395 -//.word 0x4b2749b6 -//.word 0x2234af15 -//.word 0x8d9dba68 -//.word 0x786dd3c4 -//.word 0xb8f98dbc -//.word 0x9c20d9cd -//.word 0xc5d27dfa -//.word 0x38cfc2b3 -//.word 0xb2b16dfb -//.word 0x3c2df1ca -//.word 0xfe96e3b0 -//.word 0x58a2aebc -//.word 0x2f71889c -//.word 0x85cba505 -//.word 0x4daaaa56 -//.word 0x7df86478 -//.word 0x6499ba08 -//.word 0x3eace0b8 -//.word 0x060ecef2 -//.word 0x8b20f1bf -//.word 0xc6cb20e8 -//.word 0x6bc1d15b -//.word 0xbe058dcf -//.word 0xa8ada1ab -//.word 0x0ae71724 -//.word 0x513ae4a6 -//.word 0x4b0e6376 -//.word 0x396f0295 -//.word 0x250e3ce7 -//.word 0x7588c794 -//.word 0xc1eb0eaf -//.word 0xe277e116 -//.word 0x4ba16b99 -//.word 0x9d5e655e -//.word 0x759d8a83 -//.word 0x88154b06 -//.word 0xf342c3e2 -//.word 0xccaaed7b -//.word 0xfd65153c -//.word 0x52dc8c7f -//.word 0xd0d1a0ad -//.word 0x49a0cba6 -//.word 0x2dc42b63 -//.word 0xa39c32da -//.word 0xd86f9f21 -//.word 0x97afadd7 -//.word 0x1b7a8ac0 -//.word 0x21660aaf -//.word 0x417e9da9 -//.word 0x7d887f47 -//.word 0x1b8a2e5c -//.word 0xb08c21d8 -//.word 0x7e9eb7ec -//.word 0xff1d6e6f -//.word 0xc2335581 -//.word 0x769dc46e -//.word 0x45b14ad5 -//.word 0x639fe709 -//.word 0xe6f77bb7 -//.word 0xd86b7fc9 -//.word 0x8ad7f38b -//.word 0x2c7e970c -//.word 0x9b965ec8 -//.word 0x7a082083 -//.word 0x84718f78 -//.word 0x206c6cb3 -//.word 0x3613fbbc -//.word 0x42c3b475 -//.word 0xa7203b45 -//.word 0x45599276 -//.word 0x4dae8edc -//.word 0x542f87b8 -//.word 0xa7c654db -//.word 0xdf77760f -//.word 0xb5e794b2 -//.word 0x171b28a4 -//.word 0x7b837764 -//.word 0x7337c675 -//.word 0x8180cb07 -//.word 0x2d9a62d3 -//.word 0x56b88147 -//.word 0xc6496ee3 -//.word 0x097a2fe3 -//.word 0x7efc431e -//.word 0xae078f2e -//.word 0xdd9f9bd1 -//.word 0xdf16fe8f -//.word 0x2dd2179d -//.word 0x3850fe02 -//.word 0xfd69baf8 -//.word 0xdad4b595 -//.word 0xa0ed6daa -//.word 0xe9b46bec -//.word 0xac197951 -//.word 0x0e7710bd -//.word 0x7b5e10de -//.word 0xf695b354 -//.word 0xad5fc416 -//.word 0xd1fe0c11 -//.word 0xa4760e12 -//.word 0xd493f4e5 -//.word 0x072dc8bf -//.word 0xb7abe7d9 -//.word 0x40c6b35e -//.word 0x37908987 -//.word 0xfeb4f304 -//.word 0x95ff1e9f -//.word 0xb31f8e1c -//.word 0x16ab1063 -//.word 0x1764f0e1 -//.word 0x81bb6d2b -//.word 0xa3936ae4 -//.word 0xa44766e2 -//.word 0x17efae8c -//.word 0xcfdfd186 -//.word 0xf5715591 -//.word 0x5705a8ac -//.word 0x0345597f -//.word 0x15ae88fa -//.word 0xcd4c9c3a -//.word 0xe5c434ac -//.word 0x21985f74 -//.word 0x27a70f10 -//.word 0x91f3cb38 -//.word 0x41a7a509 -//.word 0xf4596c63 -//.word 0x1a8c2290 -//.word 0xe679b026 -//.word 0xa10fd92e -//.word 0x43386d85 -//.word 0x445ebf83 -//.word 0xb02e58db -//.word 0x7a9bedc2 -//.word 0x12268f54 -//.word 0x395d2233 -//.word 0x15a21071 -//.word 0x802e3fb0 -//.word 0xa6564087 -//.word 0xcf0cc928 -//.word 0x79a86540 -//.word 0xaae96a1f -//.word 0x84362b19 -//.word 0x1a2a702c -//.word 0x825023e3 -//.word 0x2c2b4c79 -//.word 0x717a4042 -//.word 0x6fb91447 -//.word 0x15eb5830 -//.word 0x7a970268 -//.word 0x7311a97b -//.word 0x64faf4c3 -//.word 0x560a5143 -//.word 0x4a0dead3 -//.word 0xcd2cd57e -//.word 0xcd6e8a28 -//.word 0xab7f9b73 -//.word 0x91af9fe4 -//.word 0x063d6f42 -//.word 0xc0d6963f -//.word 0xb959025b -//.word 0x85dd0004 -//.word 0xe2f56702 -//.word 0x91331212 -//.word 0x64ea94d1 -//.word 0x993828dc -//.word 0x6644e736 -//.word 0xd5c53eea -//.word 0xd2c49ef1 -//.word 0x82a27555 -//.word 0xd75c5e97 -//.word 0x620e944f -//.word 0x68b6ad12 -//.word 0x373b8598 -//.word 0xbaae781e -//.word 0x4ccfd40a -//.word 0xcad38dce -//.word 0xec64330e -//.word 0xd5ea2205 -//.word 0xe809f925 -//.word 0xde6a4dfd -//.word 0x15bf9e60 -//.word 0x2b0189c4 -//.word 0xccfc40e8 -//.word 0xc80e38ba -//.word 0x692c2177 -//.word 0x03251b14 -//.word 0xcc2b27dd -//.word 0xee8fdb5c -//.word 0xdbcc5b7c -//.word 0xe1c784ee -//.word 0xfe556acc -//.word 0xf5fe057c -//.word 0xa10127d8 -//.word 0x8a97b18b -//.word 0xb67c07be -//.word 0xc2acc1f5 -//.word 0x316aa433 -//.word 0x0387d065 -//.word 0x89e13afd -//.word 0x792a5dde -//.word 0x3eeb2d78 -//.word 0x91c84d34 -//.word 0x4d058112 -//.word 0x7f496690 -//.word 0xbda261cf -//.word 0xbacad5f1 -//.word 0x17a999c5 -//.word 0x7b1aa9a6 -//.word 0xe5f21ba0 -//.word 0x413f55d5 -//.word 0x3acd7e1f -//.word 0x50ef32f7 -//.word 0x2a7b7a96 -//.word 0x2d17fb59 -//.word 0x4db36d6a -//.word 0x23574f9d -//.word 0x401fd998 -//.word 0xc2843337 -//.word 0x25dce42f -//.word 0x5b248df1 -//.word 0x1efed7d1 -//.word 0x85f6aa67 -//.word 0xd509a035 -//.word 0x9a68b98b -//.word 0xf77950a8 -//.word 0x3b1f4d22 -//.word 0xb43b9d88 -//.word 0xc873df45 -//.word 0x413260c7 -//.word 0xe9ef4ae1 -//.word 0x57b3186e -//.word 0x08d54d38 -//.word 0xb2086618 -//.word 0xd4990d5e -//.word 0x92f18f72 -//.word 0xc06190bc -//.word 0x3d1ffec2 -//.word 0x828b4390 -//.word 0x7ab7bf5d -//.word 0x9527756b -//.word 0x18d5042f -//.word 0xb778dab2 -//.word 0x6506a437 -//.word 0x6b78081e -//.word 0xb7cd9708 -//.word 0x7751fd3c -//.word 0xe71f7b4a -//.word 0x67e598ee -//.word 0xd1e71336 -//.word 0x09471be7 -//.word 0xd683c21e -//.word 0xf03fb033 -//.word 0x5a4514e2 -//.word 0xf1cae1ad -//.word 0x46f3367c -//.word 0xa9971d87 -//.word 0x86477975 -//.word 0xf58b3ac5 -//.word 0x8c6fd36e -//.word 0x773eeec2 -//.word 0xcb8e5e98 -//.word 0x187c55aa -//.word 0x3e39d73c -//.word 0x81c66eff -//.word 0xdffb2034 -//.word 0xa0ce9e14 -//.word 0x30d2be70 -//.word 0x2afe2b95 -//.word 0xb5b05b72 -//.word 0x13f1c2fd -//.word 0x77fb46d2 -//.word 0x17f9f21d -//.word 0x830deebb -//.word 0x3597af9c -//.word 0x69b56b6c -//.word 0x2f06d072 -//.word 0xbeb4f5b8 -//.word 0x0bb1916c -//.word 0x9a406b86 -//.word 0x94b811ab -//.word 0x1b84cd51 -//.word 0xda6fd525 -//.word 0xe01fc2a9 -//.word 0xaede4322 -//.word 0x8ea113b1 -//.word 0x274228c0 -//.word 0x4f112e9f -//.word 0x208b336f -//.word 0x4e69a440 -//.word 0xb7dd7876 -//.word 0x3c18ab71 -//.word 0xd00fee6d -//.word 0xce7f9da6 -//.word 0x902ef1c0 -//.word 0x3d757767 -//.word 0xe2fbc033 -//.word 0xc5c35ace -//.word 0xf6690058 -//.word 0x26a80e0a -//.word 0xbc20381a -//.word 0x26567adf -//.word 0x6dfd5236 -//.word 0x0d742e24 -//.word 0x038f20bd -//.word 0x279ad944 -//.word 0xbc9bd593 -//.word 0x46d8d3bd -//.word 0x9b9988f3 -//.word 0x3d2f94a4 -//.word 0xe735b5e8 -//.word 0x66163b1f -//.word 0xaad0bcd5 -//.word 0x1df708ea -//.word 0x34fc5fef -//.word 0x43afe2d2 -//.word 0x950348be -//.word 0xbc11d23d -//.word 0x266081a0 -//.word 0xf16486a0 -//.word 0x0044fa45 -//.word 0x4fe1cf07 -//.word 0x83130734 -//.word 0xc6352391 -//.word 0xd1e5df44 -//.word 0x4a051cf1 -//.word 0x51051e24 -//.word 0x5665f7ef -//.word 0x2d7543d4 -//.word 0x646016e4 -//.word 0xd4683329 -//.word 0x76737f42 -//.word 0x78c7b54d -//.word 0x90125a0a -//.word 0x91adf43c -//.word 0x3c217753 -//.word 0x58eb0049 -//.word 0x057cc5ca -//.word 0x4d844c97 -//.word 0xfc70dc2c -//.word 0xb13132a1 -//.word 0x364074ce -//.word 0x0ddf6bb2 -//.word 0x4ba1ec16 -//.word 0xaa2c976d -//.word 0xd93ec5ff -//.word 0x16eebb46 -//.word 0xff352498 -//.word 0xa5acbe07 -//.word 0xe3975386 -//.word 0xee23eb4d -//.word 0x2cec407e -//.word 0x4ac27208 -//.word 0x89adfccb -//.word 0x582ee7fe -//.word 0x28c83dce -//.word 0x7cbfc148 -//.word 0x3f20dd79 -//.word 0x5b01dcd4 -//.word 0x870a59d4 -//.word 0x6035f7e2 -//.word 0xbcd15378 -//.word 0x3bcd3787 -//.word 0x1f331116 -//.word 0x5df3a32c -//.word 0xf3e2fbf1 -//.word 0x7d02a610 -//.word 0x0304215f -//.word 0x160b90c2 -//.word 0x1bb3b24d -//.word 0xe65215a8 -//.word 0x8b7e86b8 -//.word 0x70cfcc7b -//.word 0xa7e59634 -//.word 0x7badb1c9 -//.word 0x49e17e69 -//.word 0x92cea471 -//.word 0x4d5a0291 -//.word 0x8245e82b -//.word 0x14af86fb -//.word 0xdfdba4fd -//.word 0x0232948b -//.word 0x7e8b65c6 -//.word 0x01a95a38 -//.word 0xfc059ab8 -//.word 0xfbce298d -//.word 0x362f17d6 -//.word 0x63d0f829 -//.word 0xcf9f947a -//.word 0xadd0df3e -//.word 0xae222bd1 -//.word 0xd2659c15 -//.word 0x7d39dc5d -//.word 0xcd181189 -//.word 0x2b970c72 -//.word 0x20e8c388 -//.word 0x6aa402b9 -//.word 0x50c75d95 -//.word 0x32fd69b0 -//.word 0x641c2c48 -//.word 0x3df1d128 -//.word 0x6a3fa0cc -//.word 0x88052ec6 -//.word 0xf300d161 -//.word 0xd8715783 -//.word 0x9220f8d8 -//.word 0x33a1882c -//.word 0x60d6f219 -//.word 0x63b5e1e3 -//.word 0x7b4bc0a0 -//.word 0x7601e59c -//.word 0x821f09fb -//.word 0x418efca0 -//.word 0x1be2964e -//.word 0xd898f10d -//.word 0x6e9bd5d0 -//.word 0x170d7454 -//.word 0xa745584b -//.word 0x1d1499ba -//.word 0x784d53a0 -//.word 0xcc8457d8 -//.word 0x94152140 -//.word 0x4a690b1b -//.word 0x3574c0b4 -//.word 0x8382f245 -//.word 0x97345016 -//.word 0xa4c5b2e9 -//.word 0x7b929796 -//.word 0xa1dad2f3 -//.word 0xa5c280f6 -//.word 0xb09c3d1e -//.word 0x5e68980e -//.word 0xcc9bc47c -//.word 0xf3209049 -//.word 0x349d98f1 -//.word 0x33f7bd26 -//.word 0xe918d4b8 -//.word 0xf5f09bb8 -//.word 0x33b9f1dd -//.word 0x90804626 -//.word 0x1de150c1 -//.word 0x6212ff2c -//.word 0xf423b49a -//.word 0x4a83ae98 -//.word 0xccc7c4f0 -//.word 0x2da75ace -//.word 0xfb498e21 -//.word 0x74c3b244 -//.word 0x9cdbffde -//.word 0x8c108707 -//.word 0x0ddf6cac -//.word 0x653f5034 -//.word 0x716e0c63 -//.word 0xf4efa57f -//.word 0x2fd47cb2 -//.word 0xb239c4b0 -//.word 0x71113999 -//.word 0x1a250f21 -//.word 0xa65929ee -//.word 0x2f318c42 -//.word 0x019513d9 -//.word 0xf3d16415 -//.word 0xf8e02258 -//.word 0xf1ea65b1 -//.word 0xc50b67bc -//.word 0xb45680c3 -//.word 0xe81a5429 -//.word 0x4d634b09 -//.word 0xa3c4411a -//.word 0xd2547fd6 -//.word 0x7df7eadb -//.word 0xd9df7b91 -//.word 0xc052ef0d -//.word 0x01adc035 -//.word 0xfba95325 -//.word 0x6add73d2 -//.word 0x8084feed -//.word 0x3881de0b -//.word 0xe7a03b02 -//.word 0x131fef96 -//.word 0x896d3b55 -//.word 0xaa31b8bf -//.word 0x068e90aa -//.word 0x2ca5ede5 -//.word 0xbf5cb21c -//.word 0xcd5e6afb -//.word 0x5d647d96 -//.word 0x47b2aa09 -//.word 0x49e4b15b -//.word 0x56ea50a9 -//.word 0x31527180 -//.word 0x3bc5a28a -//.word 0x8ad5c56d -//.word 0x3af609f0 -//.word 0x08c91960 -//.word 0x1ca19332 -//.word 0x2740bbe9 -//.word 0xaee1713a -//.word 0xa67c606e -//.word 0x40457909 -//.word 0x0675a0a9 -//.word 0x274ea430 -//.word 0x0f597525 -//.word 0x3bf39158 -//.word 0x4c07c0c5 -//.word 0x5a1d01bb -//.word 0x8a94c43e -//.word 0xe32b59a9 -//.word 0x5dc7a998 -//.word 0x3b702404 -//.word 0x9b9cfab0 -//.word 0x4cb08ec4 -//.word 0xdfc428b8 -//.word 0x01a6e974 -//.word 0x082205b6 -//.word 0xcb812cb3 -//.word 0xb7504901 -//.word 0x1f636fb4 -//.word 0xd41910c8 -//.word 0xf6e071bf -//.word 0x09fc5a8a -//.word 0x4b8512ad -//.word 0x45af8b9f -//.word 0xa14fd96f -//.word 0x3b9ae8ad -//.word 0x7b2f6f88 -//.word 0xe1582034 -//.word 0xe18c228f -//.word 0xf239c003 -//.word 0xe2c163ae -//.word 0x6cc2bdc0 -//.word 0x0c9b4825 -//.word 0x122cef65 -//.word 0xf6dd0ac8 -//.word 0xebe190bd -//.word 0xb6bc887c -//.word 0xc102c1eb -//.word 0x6b62c3be -//.word 0xa3e405e3 -//.word 0xb56f611d -//.word 0x638ec4ef -//.word 0x38732abb -//.word 0x193dca2b -//.word 0x1d768dd0 -//.word 0x9fe0c509 -//.word 0x91711c27 -//.word 0x129ccace -//.word 0x43d20c9e -//.word 0x5749d113 -//.word 0xeafcb6aa -//.word 0x94f33446 -//.word 0xbdc418d1 -//.word 0xb35a3426 -//.word 0xf9f5552f -//.word 0xe372754a -//.word 0x5fcd31f2 -//.word 0x16e47d9b -//.word 0xb47d96dd -//.word 0x838b38d5 -//.word 0x3fad12c9 -//.word 0x26f8770a -//.word 0x4ef6561f -//.word 0x3bee6c1f -//.word 0xb166b85f -//.word 0xc7e72f4d -//.word 0x3d00b29c -//.word 0x0f8d3da2 -//.word 0x4a3a61fe -//.word 0x1f42f47d -//.word 0x367d073f -//.word 0x45991815 -//.word 0xe0a7892e -//.word 0x93da51f3 -//.word 0x2e8cf22f -//.word 0x6082ab73 -//.word 0x8771eeb9 -//.word 0xc7c11447 -//.word 0x599050d6 -//.word 0x26fae1f4 -//.word 0x95988ca7 -//.word 0xa1464a53 -//.word 0x2e2a3edd -//.word 0x9df2e911 -//.word 0x9e5ca141 -//.word 0x45fc3f2f -//.word 0x613a192e -//.word 0x099a3083 -//.word 0x7740aa11 -//.word 0x1ab38236 -//.word 0xe6e17ef0 -//.word 0xef636144 -//.word 0x360362e0 -//.word 0xc27bdeff -//.word 0xf3804a8d -//.word 0x14ff6b8b -//.word 0x2fa7c9b6 -//.word 0x25a76163 -//.word 0xfdb99aae -//.word 0x7d5f7ad3 -//.word 0xf76c1adc -//.word 0x66c7577d -//.word 0xba6ccb3c -//.word 0x6fb3fcd4 -//.word 0x64d5d2dc -//.word 0xebac4fa4 -//.word 0x1cba7a60 -//.word 0x706d9c88 -//.word 0x8ba1af7e -//.word 0x58671472 -//.word 0x5b058483 -//.word 0x433e4926 -//.word 0xbfd3aecc -//.word 0x9349b4bf -//.word 0xebed064d -//.word 0xef162f29 -//.word 0x97aa0b0e -//.word 0xc1e37ba5 -//.word 0x81535da9 -//.word 0xb826bc49 -//.word 0xe8a843ce -//.word 0x4607f87d -//.word 0x115927bf -//.word 0x23e09b7f -//.word 0xc68d14d4 -//.word 0xc8c4f6e0 -//.word 0xd25f3ff8 -//.word 0xf5f5bb04 -//.word 0x865c7b29 -//.word 0x2c6c83a6 -//.word 0x3706c3fc -//.word 0x33554952 -//.word 0xbd54b417 -//.word 0x9691ece9 -//.word 0xf63010b6 -//.word 0x2332b021 -//.word 0x41f83d27 -//.word 0x6c02bd02 -//.word 0x04fdc34d -//.word 0x48fd9f6a -//.word 0x2707d221 -//.word 0x52d2c589 -//.word 0x96ceba2c -//.word 0x69660266 -//.word 0xc382700e -//.word 0x2f510f58 -//.word 0x214510fa -//.word 0x8a5f068e -//.word 0xaaac5638 -//.word 0x2510e888 -//.word 0x5a4223a2 -//.word 0xf018199c -//.word 0xb105fe27 -//.word 0x9ce0df72 -//.word 0x35e6904b -//.word 0x2003e788 -//.word 0xee4d27a5 -//.word 0x37d1bfae -//.word 0xe993355f -//.word 0xdfd05d8b -//.word 0xb686ceba -//.word 0xdc379616 -//.word 0xe9e92d88 -//.word 0x3371a81e -//.word 0x9cf12fb0 -//.word 0xafa0b1c3 -//.word 0xecc9d6ad -//.word 0x5f1736fa -//.word 0x780fc80f -//.word 0x16de9d0d -//.word 0xe555cef8 -//.word 0xea32b319 -//.word 0x5ca155a0 -//.word 0xb602268e -//.word 0x0aedf0d2 -//.word 0x98730cb2 -//.word 0x9fa7d46d -//.word 0x735e5a1f -//.word 0xd0325be4 -//.word 0x6ecd6e40 -//.word 0xd56481bf -//.word 0x738186d8 -//.word 0xec066a17 -//.word 0xb16f477c -//.word 0xd457da1e -//.word 0x1b3d3713 -//.word 0x5389bb94 -//.word 0xe6ca435d -//.word 0xb0429b53 -//.word 0x0fa43a69 -//.word 0x391c2cc4 -//.word 0xd3904f1e -//.word 0xbf26c268 -//.word 0x35069bb3 -//.word 0x1561d850 -//.word 0x7bb29936 -//.word 0x94438ca5 -//.word 0xb1f3a809 -//.word 0x9a381e21 -//.word 0x25608c60 -//.word 0x071c7494 -//.word 0xe93eeec5 -//.word 0xbfc29960 -//.word 0x550bd795 -//.word 0x2a703afd -//.word 0x82f73980 -//.word 0xb7602876 -//.word 0xd066670c -//.word 0x5441d9e9 -//.word 0x616f9780 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x0000A7F8 -//// expected output -//.word 0x49e91bdb -//.word 0x49492471 -//.word 0xe1474a39 -//.word 0x34cb235d -//.word 0x877451e4 -//.word 0xeb447faf -//.word 0xe3a01f69 -//.word 0x48e06fe7 -//.word 0x1575eeec -//.word 0xe2e41d96 -//.word 0x34110be5 -//.word 0x36919945 -//.word 0x8c4f2f68 -//.word 0xca380079 -//.word 0x845138ca -//.word 0x5c4913e8 -//// SHA512LongMsgvector_54 -//// vector length -//.word 0x0000AB10 -//// input message -//.word 0x0e7c0e3a -//.word 0xc2f13b49 -//.word 0x0fde401b -//.word 0x38c3a8dd -//.word 0x47dcd240 -//.word 0xb700477c -//.word 0x71c94b95 -//.word 0xfaf5b2dc -//.word 0xea0cf5ba -//.word 0xa04385a9 -//.word 0x34a15f83 -//.word 0xad60e1ff -//.word 0x7496dc78 -//.word 0x0915eaf1 -//.word 0xf58f0257 -//.word 0x00fe4905 -//.word 0xa3422b8e -//.word 0xc00cabb6 -//.word 0x91fcf7c1 -//.word 0xdf0640f1 -//.word 0x741ac84a -//.word 0xd2043d98 -//.word 0x259145b3 -//.word 0x77f35a02 -//.word 0x2366d83e -//.word 0x8c145478 -//.word 0x0e36305e -//.word 0x357d6cba -//.word 0x2db0bf3b -//.word 0x7a96e778 -//.word 0xe9163d32 -//.word 0xc79d8cd9 -//.word 0x50c02352 -//.word 0x6a2329f8 -//.word 0x949931e1 -//.word 0x198c0e62 -//.word 0x89a0e9d5 -//.word 0x69939199 -//.word 0x2a68115b -//.word 0x58c48894 -//.word 0x14983553 -//.word 0xc400d23d -//.word 0x096b23d2 -//.word 0xf2fdcef2 -//.word 0x6f316d9f -//.word 0x08c3e204 -//.word 0xcecdeab6 -//.word 0x9230f63b -//.word 0x563536c9 -//.word 0x0174f64f -//.word 0x57f52dba -//.word 0x27965371 -//.word 0xc6ac7421 -//.word 0xbded83c0 -//.word 0xbf8ef0cc -//.word 0xdea87cd4 -//.word 0xfee04d3a -//.word 0x89473d37 -//.word 0x647f781f -//.word 0x222046e7 -//.word 0x785925e4 -//.word 0xf1db1bd5 -//.word 0xe3f24a24 -//.word 0xa2f5c569 -//.word 0xf3e1a230 -//.word 0xc44151fc -//.word 0x1a512c8c -//.word 0x4a624e5c -//.word 0x6c80a96f -//.word 0x0d53534c -//.word 0x24432147 -//.word 0x47df7701 -//.word 0x1f805e32 -//.word 0x1a29d7a6 -//.word 0x5fb27086 -//.word 0x072614d9 -//.word 0x8a69274a -//.word 0x771ed32c -//.word 0x69c79cbb -//.word 0x362e3ba5 -//.word 0x6905a9c9 -//.word 0xf3c97a3e -//.word 0x1dec6c97 -//.word 0xc1324065 -//.word 0xba5cc8fe -//.word 0x9904427d -//.word 0x99c8e40a -//.word 0xd6aab85c -//.word 0xb9b7aa7b -//.word 0xb7e7e0cb -//.word 0x3b454946 -//.word 0xe04f7909 -//.word 0xe4a0b412 -//.word 0xdacc4848 -//.word 0x9e8c20bb -//.word 0x8e1b972e -//.word 0xf7df8ad3 -//.word 0xce4cb155 -//.word 0xa1062f1b -//.word 0xcc4567cc -//.word 0xf07e120e -//.word 0xa1408e94 -//.word 0x5f5c7957 -//.word 0xc8487f23 -//.word 0x0bc57056 -//.word 0xa0c096e5 -//.word 0x3776459f -//.word 0xeedcb3b6 -//.word 0xc63e0a7b -//.word 0x5826bc69 -//.word 0xc47f1765 -//.word 0xebfa1944 -//.word 0xdeb1858e -//.word 0x950b3681 -//.word 0xe5dfb459 -//.word 0xacdc05cf -//.word 0x4f28c6e0 -//.word 0x66477acf -//.word 0xb53f216d -//.word 0x5ff90d98 -//.word 0x56ebf102 -//.word 0x16f43b34 -//.word 0x9387a3d2 -//.word 0x6f0c0420 -//.word 0x71836bc5 -//.word 0x336b6ecf -//.word 0x1ae2c0f8 -//.word 0x8b0d0227 -//.word 0x5cbadb3a -//.word 0x89444a03 -//.word 0x29b73b90 -//.word 0xa03559b0 -//.word 0x159924b2 -//.word 0x27594370 -//.word 0xdbb11b8d -//.word 0xd9fea0fa -//.word 0xd9686bbf -//.word 0x58c30ef8 -//.word 0x8fb7a41d -//.word 0xa51fac87 -//.word 0x24b01730 -//.word 0xaadb9fbb -//.word 0xe1f45bb4 -//.word 0xb0939018 -//.word 0xb33bcb18 -//.word 0xe9392c1a -//.word 0xadcf0501 -//.word 0xe892a4ae -//.word 0x84116cc6 -//.word 0x24b72bb6 -//.word 0x12f3a7f5 -//.word 0x78957a89 -//.word 0xd47c20cd -//.word 0xa66e4f71 -//.word 0x6b4786c2 -//.word 0xcf56e92c -//.word 0x1f044cfd -//.word 0xfdb68e6b -//.word 0x57f528d9 -//.word 0x9acd0556 -//.word 0x22729567 -//.word 0xf62a1d06 -//.word 0xb26651ea -//.word 0xc4322409 -//.word 0xdbd0df5c -//.word 0x9da070e2 -//.word 0x994405e7 -//.word 0x7c00da86 -//.word 0x87674f6d -//.word 0x40343ee0 -//.word 0x68768b01 -//.word 0x2ef0fd4e -//.word 0xa2bf4c6b -//.word 0x6c3d7b22 -//.word 0xbe2667a8 -//.word 0x87f9a121 -//.word 0xeaa17967 -//.word 0xee555b07 -//.word 0x77bd5f8d -//.word 0x75561b02 -//.word 0x5b17bcb2 -//.word 0xd3555533 -//.word 0xafe476a2 -//.word 0x237f0130 -//.word 0x326939dd -//.word 0x67551c84 -//.word 0xc584f318 -//.word 0x002d272d -//.word 0xee2156ba -//.word 0x38afa61d -//.word 0x55c5595f -//.word 0xb959a2ba -//.word 0x4907b758 -//.word 0x13fc285e -//.word 0x3c126f29 -//.word 0x393cc8d7 -//.word 0x4225430a -//.word 0x041417e8 -//.word 0x97133967 -//.word 0xaf502dc7 -//.word 0x16c31d60 -//.word 0x5a11289d -//.word 0xc3b1fc49 -//.word 0x874da709 -//.word 0x416baa2a -//.word 0xa04c4f9d -//.word 0x5c143d40 -//.word 0x6f2c4a60 -//.word 0x81e5907b -//.word 0xa45ec34a -//.word 0x41a7c2fe -//.word 0x52266bcb -//.word 0xd23ab4a3 -//.word 0x721ff744 -//.word 0x8e128e74 -//.word 0x5fb5a08b -//.word 0x72b43a33 -//.word 0x59a9a26c -//.word 0xa03de8d3 -//.word 0x0390bd23 -//.word 0xdddc88fc -//.word 0xe455b7e3 -//.word 0x1453538b -//.word 0xe9b2d852 -//.word 0xd179430f -//.word 0xe1bb6c0b -//.word 0xc7bb964d -//.word 0x0053451b -//.word 0x4b9750bd -//.word 0x5db53684 -//.word 0xd620b50b -//.word 0x74ed99bd -//.word 0x867dd397 -//.word 0xa45cca2f -//.word 0x9e69f6f6 -//.word 0xb237aaba -//.word 0x02b4316f -//.word 0x45081d2e -//.word 0xbcc0dc7e -//.word 0x672c8cd3 -//.word 0x7a051054 -//.word 0x0b5364e1 -//.word 0x0d8e2d55 -//.word 0x81049508 -//.word 0xeb7a5599 -//.word 0x031613ea -//.word 0xae7def6b -//.word 0x2c38599c -//.word 0x935c25cd -//.word 0x7c6ae128 -//.word 0xfc7466f2 -//.word 0xd681ad0e -//.word 0xee33e4c3 -//.word 0x01a7c1bf -//.word 0x949d175b -//.word 0x2ad9a720 -//.word 0xbac9388a -//.word 0x6067ea0d -//.word 0x5361c756 -//.word 0x17779bd3 -//.word 0xf4250575 -//.word 0xa683cfb5 -//.word 0x56697bd5 -//.word 0xc9d61e68 -//.word 0xd8937214 -//.word 0x20132697 -//.word 0xfa9e7808 -//.word 0xaeaf065f -//.word 0xe39ae138 -//.word 0x5a71e4d4 -//.word 0xdc294461 -//.word 0x71f9677b -//.word 0xd303faf2 -//.word 0x22363ece -//.word 0xd973a290 -//.word 0x01ee97bb -//.word 0xa5d8a093 -//.word 0x853ba825 -//.word 0x0e259987 -//.word 0x8a082a61 -//.word 0x9561f9ac -//.word 0xd098d9ba -//.word 0xd9276d77 -//.word 0x7afff6ee -//.word 0x2027690f -//.word 0x8fa7c5af -//.word 0xd5a4a3d0 -//.word 0x7ccc0e23 -//.word 0x04f596cb -//.word 0x9100a064 -//.word 0xe0040044 -//.word 0x7fa9ca00 -//.word 0x3ed16432 -//.word 0xe17ee07a -//.word 0x17f089c3 -//.word 0xb00dbcc8 -//.word 0x0a06fad6 -//.word 0xcc383ad3 -//.word 0xd750847f -//.word 0x7ab3bbfa -//.word 0xe51dbb87 -//.word 0xe187a48f -//.word 0xbe4f74e9 -//.word 0x8c93dc58 -//.word 0x8edd4c55 -//.word 0xeb06510f -//.word 0xa75420b1 -//.word 0xd2e673e3 -//.word 0xff529393 -//.word 0xf88cb6f5 -//.word 0xb00a8cc8 -//.word 0x792515dc -//.word 0x77c3b5d1 -//.word 0x55338a21 -//.word 0x3658fd61 -//.word 0xef0a97c3 -//.word 0x73b917e0 -//.word 0x8e53c1b4 -//.word 0xd768f8ea -//.word 0xe08d0f5a -//.word 0xaffe5dd1 -//.word 0x72878f10 -//.word 0x6ea44217 -//.word 0x39e7d2a3 -//.word 0x299a6cf5 -//.word 0x0ca66bd5 -//.word 0x19b3e1d7 -//.word 0x279173dd -//.word 0x1dd66bdd -//.word 0xaac908e4 -//.word 0x367f185b -//.word 0x1844c98a -//.word 0x093dbd5a -//.word 0xd84b5c5f -//.word 0x60316e15 -//.word 0xb8fae96a -//.word 0xa995077d -//.word 0x65c39ca6 -//.word 0x7533a7b6 -//.word 0xf4ea2780 -//.word 0xfbe93098 -//.word 0x5c0a3d5a -//.word 0x932cc82e -//.word 0xf98f180b -//.word 0x3b815b3a -//.word 0x0b3bf45d -//.word 0x150616af -//.word 0x35a2928d -//.word 0xe7e7ed36 -//.word 0xffadb6cf -//.word 0x9aea16aa -//.word 0x541aa9c7 -//.word 0xbbe48c9b -//.word 0x04fab811 -//.word 0xfd418ecf -//.word 0x4332b2ba -//.word 0xb5801dbc -//.word 0x28fa6ec5 -//.word 0x5db4810f -//.word 0x306143a7 -//.word 0x1104c529 -//.word 0xb8c88fca -//.word 0x152b369c -//.word 0x8662310e -//.word 0x4df9e8b2 -//.word 0x41bb0e44 -//.word 0xc3d131e7 -//.word 0xf42e8fb1 -//.word 0x262a2c6a -//.word 0x906c2191 -//.word 0x450e37a0 -//.word 0x67fcb492 -//.word 0x979d75a1 -//.word 0xb1b63d54 -//.word 0xb68b4db9 -//.word 0x0a4735ef -//.word 0xe09de9e8 -//.word 0xf2b0176d -//.word 0x7530b863 -//.word 0x4cc6e64c -//.word 0x7cb3ed11 -//.word 0xe0b4a4fe -//.word 0x1e28fe0e -//.word 0xd974dc69 -//.word 0x28a7252b -//.word 0x475a1967 -//.word 0x8ddbe26c -//.word 0x9e8a6c46 -//.word 0xe2827788 -//.word 0x367ceb49 -//.word 0xe1f16b6d -//.word 0xc97f2c26 -//.word 0xe78e08b9 -//.word 0xf833ce86 -//.word 0x7555dd43 -//.word 0xc60ef188 -//.word 0xb3533c90 -//.word 0x1bd8b93e -//.word 0xe82ebd5e -//.word 0x422ecf2e -//.word 0x039bb91c -//.word 0x6b03dfd2 -//.word 0x16e6d070 -//.word 0x2a1b1b18 -//.word 0xd56e64b0 -//.word 0xf78eb6e3 -//.word 0x1b271b69 -//.word 0xac4b6a89 -//.word 0x661661dc -//.word 0x0a92f353 -//.word 0x56d8e37b -//.word 0x34789200 -//.word 0x321b1671 -//.word 0x32678b42 -//.word 0x6223ae17 -//.word 0x6f9ca840 -//.word 0xf647277f -//.word 0x3ca7b312 -//.word 0x1e7140ed -//.word 0x4befff48 -//.word 0xb0a27a59 -//.word 0x342be063 -//.word 0xa66c9def -//.word 0xf3ea2e59 -//.word 0x9d75348f -//.word 0x680cc716 -//.word 0x57fb0c4e -//.word 0xd6460af6 -//.word 0x394ab9f2 -//.word 0x65a25c4c -//.word 0xcd48117a -//.word 0xa1fca7df -//.word 0x41eaaf94 -//.word 0xf887d667 -//.word 0xe7bc7224 -//.word 0x3f465a14 -//.word 0xb45dfbc4 -//.word 0x2e93a807 -//.word 0xc100323e -//.word 0xdf9cb9d7 -//.word 0xccecc114 -//.word 0x53e1880e -//.word 0xb8fd98f9 -//.word 0xedb798a9 -//.word 0x08216755 -//.word 0xf5c86c9c -//.word 0x68db27c5 -//.word 0x16900c4b -//.word 0x25c49299 -//.word 0xe1e28712 -//.word 0xb005a654 -//.word 0x48616bbe -//.word 0x1fdf2630 -//.word 0x23074f11 -//.word 0xac231997 -//.word 0xafa14942 -//.word 0x34ba49aa -//.word 0x0a51787b -//.word 0xb91ec5be -//.word 0xb80b7c5a -//.word 0xe0de5fda -//.word 0x2119f970 -//.word 0x741e2f3a -//.word 0x109718c5 -//.word 0xe1150fd0 -//.word 0x36f70652 -//.word 0xba8e1dbe -//.word 0xa57f7385 -//.word 0x33683bdc -//.word 0x56c613c1 -//.word 0xa7169238 -//.word 0xa33a20db -//.word 0x141f0b91 -//.word 0xcd9dd79e -//.word 0x9a9ed5dc -//.word 0x7783f747 -//.word 0x00c3e2bf -//.word 0x29d5450a -//.word 0x2f516919 -//.word 0xcf520a8c -//.word 0xb51e6678 -//.word 0x37099367 -//.word 0x439615a0 -//.word 0x96e0b0a9 -//.word 0x2f387b0b -//.word 0x04103655 -//.word 0xf318dd63 -//.word 0xfba67de0 -//.word 0xac5b470a -//.word 0xdc04e3b5 -//.word 0x9cbe0793 -//.word 0x6b5e47b2 -//.word 0xa90f2f46 -//.word 0x4e3d8fa9 -//.word 0xdbb216a0 -//.word 0x91ff22e0 -//.word 0xe11ed7d1 -//.word 0x25556f91 -//.word 0x8d5dd03c -//.word 0x5cc4646b -//.word 0x549025fa -//.word 0x6e25f70f -//.word 0xcf693b57 -//.word 0xf825a193 -//.word 0x3daf3d54 -//.word 0x78c6de02 -//.word 0xfebd9b23 -//.word 0xd2dcaeda -//.word 0x190386ae -//.word 0xce90178d -//.word 0xb7837511 -//.word 0x98e0a102 -//.word 0xa655a21b -//.word 0x3e1dd811 -//.word 0xd7248ed1 -//.word 0x366cce09 -//.word 0xe1af79eb -//.word 0xd546972e -//.word 0x7b49eb55 -//.word 0xd9f8ca33 -//.word 0x05592eaf -//.word 0xe02307c5 -//.word 0x00dbd1cd -//.word 0xee3d6b00 -//.word 0x92dd2738 -//.word 0xeb0e1ef7 -//.word 0x0403c6ab -//.word 0x2334c630 -//.word 0x43030897 -//.word 0xc4a01026 -//.word 0x622a8d9f -//.word 0x64172ec6 -//.word 0x15d5b71d -//.word 0x78b154f2 -//.word 0x38f92d9b -//.word 0xde5d3a01 -//.word 0x469b595b -//.word 0x545c9e3c -//.word 0xe358ead0 -//.word 0xfec1bf62 -//.word 0x53df5222 -//.word 0xe4f8e226 -//.word 0x007249ae -//.word 0x723bd1ac -//.word 0xf8694884 -//.word 0xf71e5710 -//.word 0x6caf0fe7 -//.word 0x2605c5df -//.word 0x334320d0 -//.word 0x98a8709b -//.word 0x45b8416b -//.word 0x4796313b -//.word 0x40b5fe99 -//.word 0x14afe3a9 -//.word 0xe675256c -//.word 0x43a9e942 -//.word 0x9c4848ae -//.word 0xfa8ca55a -//.word 0xed113e5b -//.word 0xc53602b5 -//.word 0x05c6a322 -//.word 0x15d8eb0f -//.word 0x37f353e8 -//.word 0xbc76d295 -//.word 0x7837f345 -//.word 0x736b2a6a -//.word 0xe1c66804 -//.word 0x55e3ed23 -//.word 0x31e55ea7 -//.word 0x615f174b -//.word 0x4971c2e2 -//.word 0xfb3428e0 -//.word 0xae58481b -//.word 0x6c0ca6d3 -//.word 0x0a1ee6f0 -//.word 0x5d64998c -//.word 0xab5a57b1 -//.word 0x600c0e64 -//.word 0x023799e2 -//.word 0x67ab9529 -//.word 0x26f370ba -//.word 0x4b38c29e -//.word 0x4f63e1a7 -//.word 0x4782b0f8 -//.word 0x5b6db7c7 -//.word 0x7aa97962 -//.word 0x4c8c0170 -//.word 0x68a2bf7a -//.word 0xc85092aa -//.word 0x79b726d2 -//.word 0x97db80af -//.word 0x7905d770 -//.word 0x2966a672 -//.word 0x17fcff4e -//.word 0x0eba2215 -//.word 0x66e34eda -//.word 0x7cb7d771 -//.word 0x5f517977 -//.word 0xccd0ec92 -//.word 0x5db5b8fa -//.word 0xfd8c4b39 -//.word 0x9fcf492f -//.word 0x30072358 -//.word 0xc934eb52 -//.word 0x2a6f6799 -//.word 0x64ce6496 -//.word 0xd5884cd8 -//.word 0x5959fba1 -//.word 0xbf28cfa4 -//.word 0x7ae8fe0d -//.word 0x99bc2dc2 -//.word 0xfa5e3ee8 -//.word 0xbac169aa -//.word 0xeff58e35 -//.word 0x9a4cc907 -//.word 0xd7bb486a -//.word 0x5782593b -//.word 0x100fc7f0 -//.word 0x332067da -//.word 0x5f29eea6 -//.word 0x14f5052a -//.word 0x6a8fa05f -//.word 0x03638ba9 -//.word 0x3ea1455f -//.word 0xade21287 -//.word 0xca0e4ce1 -//.word 0xe57dfa28 -//.word 0x615ca494 -//.word 0x205365a3 -//.word 0x3c644119 -//.word 0xf817b945 -//.word 0xf6d49d87 -//.word 0xaa90220f -//.word 0x0eac34e7 -//.word 0x97190d34 -//.word 0x68c107b9 -//.word 0xc722ae9c -//.word 0xcd3c1a6d -//.word 0x61ae7c64 -//.word 0x671cf6ea -//.word 0x34d3b05b -//.word 0x45b0280b -//.word 0x313ec987 -//.word 0xdd1ec01d -//.word 0xefac0b9e -//.word 0x85dfd262 -//.word 0x2671fb8d -//.word 0xf940f991 -//.word 0x34f5e4f4 -//.word 0xd8e3cf54 -//.word 0x9c3256a8 -//.word 0x263c76c8 -//.word 0x8137a230 -//.word 0xcc151200 -//.word 0x2fa85f48 -//.word 0x140a4d83 -//.word 0x933ce761 -//.word 0x2d0dd2ca -//.word 0xbe3ddb1f -//.word 0xade3d2c3 -//.word 0x660c9bda -//.word 0x0aa58250 -//.word 0x649bcf1d -//.word 0x20409ac8 -//.word 0x37f1e12a -//.word 0xaef6d875 -//.word 0x80a98075 -//.word 0xd9da7b15 -//.word 0x84731f24 -//.word 0xa758c959 -//.word 0xae917495 -//.word 0x85ab8a69 -//.word 0x0a5bf9d8 -//.word 0xc2658a5e -//.word 0xcabc6f31 -//.word 0x11eb1ac6 -//.word 0xc5b35697 -//.word 0x0bf69024 -//.word 0xf3d47537 -//.word 0xab13c36d -//.word 0xf3c458f2 -//.word 0xd023908c -//.word 0x85c0cddb -//.word 0xbfdc57df -//.word 0x101667ba -//.word 0x9e477eb7 -//.word 0x1daafb8c -//.word 0xfa40eddc -//.word 0xd9722600 -//.word 0x42f99107 -//.word 0x97fbc5fb -//.word 0x4a76d966 -//.word 0x4ce27a15 -//.word 0xc9123c1c -//.word 0x125c2e1b -//.word 0xdbf9b1bf -//.word 0xa6ae8a8b -//.word 0x7fac35d8 -//.word 0xeab67c1a -//.word 0x1a814966 -//.word 0x6360b931 -//.word 0xf221715b -//.word 0xbc31356c -//.word 0xb407b71d -//.word 0x41c0ac1a -//.word 0xef072506 -//.word 0x65381dbf -//.word 0x97c54ee4 -//.word 0x3cd84a95 -//.word 0x833ac67a -//.word 0x01733907 -//.word 0xee33a6fe -//.word 0x92f0b535 -//.word 0xfad10999 -//.word 0xefcbce73 -//.word 0x290a91ea -//.word 0xbf9255c9 -//.word 0xe226e383 -//.word 0xcb686175 -//.word 0xf243266a -//.word 0x8186cd64 -//.word 0x08d1889a -//.word 0x72b5b7bd -//.word 0x3817ba7f -//.word 0xd4d50356 -//.word 0x79ad6f7d -//.word 0x015ad63d -//.word 0x27ffe16a -//.word 0xf6c91b30 -//.word 0x81d04b10 -//.word 0xd53f0225 -//.word 0x2cb570ac -//.word 0x63eb7bc3 -//.word 0xae961371 -//.word 0x8b8fbfe7 -//.word 0xf4317c05 -//.word 0xd902c820 -//.word 0xcd96fa03 -//.word 0x00b1d433 -//.word 0x6dac5b78 -//.word 0x541ae698 -//.word 0xebab7666 -//.word 0x515045fb -//.word 0xc39fa244 -//.word 0x127afbbd -//.word 0x54eb3c7b -//.word 0xda535870 -//.word 0x63c424eb -//.word 0x8fab6c5e -//.word 0x97b24164 -//.word 0x3ae49002 -//.word 0xfb12f92d -//.word 0x8976dd8d -//.word 0x7f97b981 -//.word 0x4d6cb363 -//.word 0x76c4730d -//.word 0xfde6349c -//.word 0x19741b74 -//.word 0x3095c784 -//.word 0x035229cb -//.word 0x2741961a -//.word 0xb4611a1c -//.word 0x41461095 -//.word 0x0f76efe7 -//.word 0x841267da -//.word 0xdbb9ad9c -//.word 0x1ba91307 -//.word 0x4527db23 -//.word 0xd2224dec -//.word 0x5c130755 -//.word 0x9c27958c -//.word 0x94a04180 -//.word 0x0d782ca1 -//.word 0x44489ee6 -//.word 0xe1699b15 -//.word 0x2859b73f -//.word 0x73602b89 -//.word 0xe0732733 -//.word 0x47586ad2 -//.word 0x6f0b11e0 -//.word 0x8161ac77 -//.word 0xbceb975a -//.word 0x6b1d8835 -//.word 0x14af6426 -//.word 0xf344577b -//.word 0xa64a23be -//.word 0x2a21b8ef -//.word 0x067f0610 -//.word 0xc6130fe7 -//.word 0xab6840ff -//.word 0xa10d01f0 -//.word 0x71f38be0 -//.word 0x3816f94a -//.word 0x185fa2fe -//.word 0x2dc9a769 -//.word 0xc3c4c817 -//.word 0xc6d77c76 -//.word 0x798840dd -//.word 0x6b802fcc -//.word 0xa8ebd376 -//.word 0x2c1e3b7c -//.word 0x9d7c4dfc -//.word 0x399a5eca -//.word 0x0da100fd -//.word 0x67f41bae -//.word 0x8f1340fc -//.word 0xb2c03953 -//.word 0x1f60e5ef -//.word 0xb6a3439b -//.word 0x9c67ccbf -//.word 0x34da0699 -//.word 0x4bdf56cb -//.word 0x93b41516 -//.word 0x53d1e765 -//.word 0x5c13480d -//.word 0x3f196853 -//.word 0xbdef392f -//.word 0x7fe9c64f -//.word 0x08d2c65f -//.word 0xe7467188 -//.word 0x315d9236 -//.word 0x2e8ade1f -//.word 0x53c28481 -//.word 0x70e005aa -//.word 0x2b4846be -//.word 0xadcae4b5 -//.word 0x9bcac7a3 -//.word 0x489efa3c -//.word 0x2938b997 -//.word 0x8905cc32 -//.word 0x7d141437 -//.word 0x1b7b64fd -//.word 0xe7f792d2 -//.word 0x8ed2cdf8 -//.word 0xd70a30ed -//.word 0xd6af98ef -//.word 0x638db3c0 -//.word 0xca0b5aa7 -//.word 0xc45321b7 -//.word 0xa6b32c53 -//.word 0xd94344f2 -//.word 0x8ac92920 -//.word 0xa2d92ac6 -//.word 0xf941f4aa -//.word 0xc6a4a839 -//.word 0x5b643085 -//.word 0x0fc5d28a -//.word 0x7b5005b5 -//.word 0xe97684a7 -//.word 0x0976a236 -//.word 0xe681ddb4 -//.word 0x191bb574 -//.word 0x3cc4bf8b -//.word 0xa2d8f5d4 -//.word 0x45b45037 -//.word 0x001a992a -//.word 0xffd77c77 -//.word 0x73a2de40 -//.word 0x8a487041 -//.word 0x9e068456 -//.word 0xad36203d -//.word 0x092f519c -//.word 0x5066c246 -//.word 0x9fd98dba -//.word 0x03ad51ed -//.word 0x30158549 -//.word 0x76770cf5 -//.word 0xf0ca0957 -//.word 0xff43f4d7 -//.word 0xf630eee6 -//.word 0x1724513f -//.word 0xbf548c6d -//.word 0xdd412e8e -//.word 0xa8974056 -//.word 0x9255d857 -//.word 0x772feb7f -//.word 0x1b3163e2 -//.word 0xd3a471b9 -//.word 0x823525ab -//.word 0xc7543c4c -//.word 0x75db39e4 -//.word 0x44f0b771 -//.word 0xc62cfdef -//.word 0x9cfdd3d6 -//.word 0xe94894e5 -//.word 0x0753851e -//.word 0x79e36512 -//.word 0x21a1455e -//.word 0xb3c29a76 -//.word 0x6ae791a1 -//.word 0xfa42a245 -//.word 0xc5fb6865 -//.word 0x51d2b068 -//.word 0xfa05d01c -//.word 0xe4743afa -//.word 0x340350ac -//.word 0x80407acc -//.word 0x834676ef -//.word 0x16e1f0e2 -//.word 0x5cf25333 -//.word 0x3c15def3 -//.word 0x1482fabb -//.word 0xab31cbed -//.word 0x6842053c -//.word 0xc29b016f -//.word 0xf8d31061 -//.word 0x024f0f4d -//.word 0xc7aa3b48 -//.word 0x905a470f -//.word 0xbd91ac03 -//.word 0xb7624172 -//.word 0x25250b18 -//.word 0x631c56e6 -//.word 0x2f570402 -//.word 0xa6d4260e -//.word 0x70ebc9ad -//.word 0x37e91243 -//.word 0x5dfc8efd -//.word 0xee4fc312 -//.word 0xd3750b48 -//.word 0x490ba2b9 -//.word 0x9299fdd7 -//.word 0xeaba5dae -//.word 0xbd7da569 -//.word 0x170a6818 -//.word 0x5c8947b0 -//.word 0x393f7a53 -//.word 0xdafaacd2 -//.word 0x5eb00c71 -//.word 0x8863a1ea -//.word 0xb747ddb4 -//.word 0x18277684 -//.word 0x1a057115 -//.word 0x22018025 -//.word 0x817c8dc0 -//.word 0xa37c97c0 -//.word 0x8852bd95 -//.word 0x787b9842 -//.word 0xf3c5cea8 -//.word 0xe8b2e407 -//.word 0x272154c2 -//.word 0x172be062 -//.word 0xac4c25de -//.word 0x94c3731a -//.word 0xb13bdcad -//.word 0xccaa8be7 -//.word 0x887a5813 -//.word 0x94e799f9 -//.word 0x25a83aa7 -//.word 0xa4d11071 -//.word 0xa3f86a37 -//.word 0x1696e9e6 -//.word 0xc0b19241 -//.word 0xebb822e2 -//.word 0x5cafa17b -//.word 0x868b3a62 -//.word 0xfee04a4d -//.word 0x2fb9b75a -//.word 0x4fc78352 -//.word 0x92bfa12e -//.word 0x9dfd07da -//.word 0x3d6d043a -//.word 0x59abd46b -//.word 0x2569724b -//.word 0x9912ad3b -//.word 0x22ac7e23 -//.word 0x970399b7 -//.word 0x6e0442f9 -//.word 0x306762ff -//.word 0x2a91daf7 -//.word 0x66b81768 -//.word 0xd948e6bb -//.word 0xde858af9 -//.word 0xe3720dd6 -//.word 0x62f2d3ef -//.word 0x142e7550 -//.word 0x6136cc39 -//.word 0x1aeb4b22 -//.word 0x6a1c92fc -//.word 0x0aef41ba -//.word 0xb5830a10 -//.word 0xdcd30b7a -//.word 0x9ade5a81 -//.word 0xea05e13a -//.word 0x18b46c0f -//.word 0x754400c1 -//.word 0x4f206fae -//.word 0x20272950 -//.word 0x06525507 -//.word 0x73972018 -//.word 0x260d55f5 -//.word 0x5a502fbf -//.word 0x3d276b09 -//.word 0xa364a0df -//.word 0xfc0cd306 -//.word 0x83b84686 -//.word 0xb93b9266 -//.word 0x1285f5b7 -//.word 0xeec8edd4 -//.word 0xcad906e7 -//.word 0xb8d8f0af -//.word 0x0c13d481 -//.word 0x5928e88d -//.word 0x9c6a4263 -//.word 0xb686eab6 -//.word 0x2067325f -//.word 0xda564aa4 -//.word 0xa4660fbb -//.word 0x710f248a -//.word 0x191944b1 -//.word 0x4ebbd6ca -//.word 0xd105c2ef -//.word 0xe57b847d -//.word 0x05037f18 -//.word 0xd20193f0 -//.word 0x4fc0f142 -//.word 0x50142e21 -//.word 0x303d9776 -//.word 0xc30fc546 -//.word 0x8b507133 -//.word 0x2f628946 -//.word 0x282182eb -//.word 0xbe0ff13d -//.word 0x33af5584 -//.word 0x3e2e37fc -//.word 0xbb4876d9 -//.word 0xa06adc87 -//.word 0x3314f436 -//.word 0x7a822096 -//.word 0xf38be6df -//.word 0x86c98b15 -//.word 0xb8fae38a -//.word 0x21a667a4 -//.word 0x200388e0 -//.word 0xcd154317 -//.word 0x2f19f601 -//.word 0xb02472f7 -//.word 0xcd0851fd -//.word 0x12778aff -//.word 0x466b425b -//.word 0xe3c4e5a0 -//.word 0xc9337695 -//.word 0x3258237e -//.word 0xe9271d9a -//.word 0xb790a6f0 -//.word 0x1e5f6c4c -//.word 0x4a611584 -//.word 0x45c81bff -//.word 0x6ad0da78 -//.word 0x1ca3e700 -//.word 0xb87aa442 -//.word 0xc706110b -//.word 0x790ee50a -//.word 0x4f59ded4 -//.word 0x17ce552a -//.word 0x1dda157f -//.word 0xa0126db5 -//.word 0x831a8428 -//.word 0x45c5eded -//.word 0x337d7b5c -//.word 0xdce657cb -//.word 0xc6be4f9d -//.word 0x5f08717c -//.word 0x3669d9e2 -//.word 0x6bd2c7de -//.word 0x655ff515 -//.word 0xc27f2707 -//.word 0x94560393 -//.word 0xca5f23bd -//.word 0xec5669b0 -//.word 0x0c5592ff -//.word 0xf93d0e30 -//.word 0xb5570f7b -//.word 0x293be1cf -//.word 0x18f17916 -//.word 0x525750ba -//.word 0x2ac27268 -//.word 0x29e8d114 -//.word 0x04fee03d -//.word 0xcc1d5d72 -//.word 0x65ea6e15 -//.word 0x3976f05f -//.word 0x2d630ca4 -//.word 0xd5490bd8 -//.word 0xe3576b53 -//.word 0xe63e32d1 -//.word 0x314a82bd -//.word 0x18d26eaf -//.word 0x63d30c33 -//.word 0xfcd8cbcc -//.word 0xeb1d0738 -//.word 0x84f3dbf6 -//.word 0xdf663706 -//.word 0x891e32f0 -//.word 0x7983a107 -//.word 0x4625e8ef -//.word 0x975a105d -//.word 0xda291a1e -//.word 0x3966935b -//.word 0xc91f691b -//.word 0x0537fd09 -//.word 0x7c517978 -//.word 0xc6ef64a4 -//.word 0xbcdb743a -//.word 0xe9c7a31b -//.word 0x3b30845d -//.word 0xfe88d893 -//.word 0x0b935d4f -//.word 0x3d12e6e5 -//.word 0x259fb071 -//.word 0xffd8f41b -//.word 0xe4bfb999 -//.word 0x4161ecf6 -//.word 0x87b6b292 -//.word 0x24c9fd6b -//.word 0xb3185e9a -//.word 0x6f3e1a21 -//.word 0xeecf7fe3 -//.word 0x0c8478f4 -//.word 0x25986013 -//.word 0x87711475 -//.word 0x26834cc5 -//.word 0x92722b68 -//.word 0x27761405 -//.word 0x8304c045 -//.word 0x3eab8dd7 -//.word 0xd53c19b8 -//.word 0xe62d10b1 -//.word 0xa33f4221 -//.word 0x815ff9fc -//.word 0x30ca8914 -//.word 0xd0752897 -//.word 0x62ac00d9 -//.word 0x7cf98354 -//.word 0x4147ffee -//.word 0x9147727a -//.word 0x7d139f80 -//.word 0xfe126141 -//.word 0xe61b40f6 -//.word 0x16dd4259 -//.word 0xf27e0366 -//.word 0x12820863 -//.word 0x3aef511e -//.word 0x8dae2d76 -//.word 0xfd35531c -//.word 0x06632d9b -//.word 0x9cab7796 -//.word 0x62750951 -//.word 0x1cc1f174 -//.word 0x670ec50b -//.word 0xa87a38d0 -//.word 0x422aeaad -//.word 0x0cec857d -//.word 0x021b0513 -//.word 0x3ac4577d -//.word 0x1a062689 -//.word 0xc9bff289 -//.word 0xe3656254 -//.word 0x7131db8d -//.word 0x18835128 -//.word 0x90825d29 -//.word 0x580290af -//.word 0xa8ac0832 -//.word 0xa8584009 -//.word 0xdfbe2c2f -//.word 0xee4e8646 -//.word 0x7e5c63dc -//.word 0x778009ee -//.word 0x723d04aa -//.word 0x72e07779 -//.word 0xceabb13d -//.word 0x723300d7 -//.word 0x4807caed -//.word 0xf092d9ea -//.word 0xb743f746 -//.word 0xc7ebbb07 -//.word 0x9b66a288 -//.word 0xb67d6179 -//.word 0x950b7a27 -//.word 0xe25f0efd -//.word 0xeae2f24b -//.word 0x51f90547 -//.word 0x042dc052 -//.word 0x708a0e7c -//.word 0xf2445e49 -//.word 0x8ea1f7b6 -//.word 0xe3128c77 -//.word 0x5ea31183 -//.word 0xaf96cdd2 -//.word 0x794baf65 -//.word 0x4e64e588 -//.word 0xda26ab54 -//.word 0x5e216177 -//.word 0x6113e138 -//.word 0xa20a0fb5 -//.word 0x50c9b26f -//.word 0x7d6d8209 -//.word 0xd150814d -//.word 0x7b2e8f70 -//.word 0x6d863997 -//.word 0xc943d399 -//.word 0x969cc607 -//.word 0xb8392a6a -//.word 0x1f9798cb -//.word 0x3ead3979 -//.word 0xbfd02306 -//.word 0x75d4e693 -//.word 0x9274614d -//.word 0x1af3db38 -//.word 0x97044f2c -//.word 0x0fe8061d -//.word 0x33d66b9f -//.word 0xd99f1ca8 -//.word 0xac923d98 -//.word 0x229d1178 -//.word 0xafb6cb7f -//.word 0x3979a1db -//.word 0xcb1323ae -//.word 0x8d5ecb56 -//.word 0xf44dd5f1 -//.word 0x368b5020 -//.word 0x015f760c -//.word 0x6cd339a7 -//.word 0x2e151e35 -//.word 0x0d1d4e0a -//.word 0x9a90eb95 -//.word 0x1ce5a09d -//.word 0xcac67ccb -//.word 0x3db90069 -//.word 0x24ff7669 -//.word 0x3abc85a9 -//.word 0x75590375 -//.word 0x80270a4e -//.word 0x6c454ee9 -//.word 0xa3c3ad7b -//.word 0x1d070834 -//.word 0xd6705209 -//.word 0x7f3ae6b7 -//.word 0x73a21e05 -//.word 0xee4a2149 -//.word 0x79defc2d -//.word 0xa9f8f5b3 -//.word 0x09411b77 -//.word 0x55da2235 -//.word 0xe9fa6e8a -//.word 0x78d86eff -//.word 0x01cb2b43 -//.word 0xffaf21b8 -//.word 0xe18c4d31 -//.word 0xb97287fb -//.word 0x38a7121a -//.word 0xda0572d4 -//.word 0x5e9d7d74 -//.word 0x79a0b548 -//.word 0xcb80d5ec -//.word 0x1252aaca -//.word 0x9e7724e2 -//.word 0x057badc7 -//.word 0x173db9ea -//.word 0x14509f1b -//.word 0x1da2a74d -//.word 0xe95b649a -//.word 0xb9084487 -//.word 0x8ef96588 -//.word 0x99e7aac7 -//.word 0xf3db0f21 -//.word 0x8e4a3971 -//.word 0x6c855212 -//.word 0x0e51139f -//.word 0x30d122fd -//.word 0xb3ad9f9c -//.word 0xdb6df9f9 -//.word 0xba260768 -//.word 0xec595410 -//.word 0x8518ba37 -//.word 0x486a32c0 -//.word 0x1af1eaf1 -//.word 0xb6ca987a -//.word 0xa1b50fb3 -//.word 0x61760f26 -//.word 0xea7b624d -//.word 0x59be249d -//.word 0xe4ed63c3 -//.word 0x11c9e82d -//.word 0x27cc53cc -//.word 0xe20e6e18 -//.word 0x6b69bb55 -//.word 0x87db4f15 -//.word 0x0f2de3ff -//.word 0xa0d229ce -//.word 0x93125c9d -//.word 0x30681b61 -//.word 0x1e2877b7 -//.word 0x1e644be0 -//.word 0xfa11cc09 -//.word 0xb76660d0 -//.word 0x1285b405 -//.word 0x2b5d08ad -//.word 0x7bcfce4d -//.word 0x0b0f7465 -//.word 0xe84e7e3a -//.word 0xd296d7d8 -//.word 0x34f56958 -//.word 0x59ddeb5f -//.word 0xdccbfae7 -//.word 0x60276c42 -//.word 0x826be15b -//.word 0x0c889a40 -//.word 0x6b868fdd -//.word 0x646abb0a -//.word 0x025cbbc9 -//.word 0xd30997c8 -//.word 0x5447e02e -//.word 0xa9f7fb94 -//.word 0x9130bc50 -//.word 0x9a9a37fa -//.word 0x9117d229 -//.word 0x3da99f7e -//.word 0x4d90e9e4 -//.word 0x8eb20d15 -//.word 0x61408b61 -//.word 0x6d975dab -//.word 0x916488b4 -//.word 0x1c0cf09c -//.word 0x414b70a5 -//.word 0xc51b2a3b -//.word 0xfbd71c31 -//.word 0xf2a0f54e -//.word 0xed002608 -//.word 0x13cd3b8f -//.word 0x68506c0d -//.word 0xfca76f2c -//.word 0x636891da -//.word 0x64870549 -//.word 0xf57a7c39 -//.word 0x689af679 -//.word 0xdfcdd7ab -//.word 0x05623d49 -//.word 0x003c91e5 -//.word 0xa1335cb5 -//.word 0xdeb75c4e -//.word 0x83b6d8b0 -//.word 0x24c03083 -//.word 0x566ab8a0 -//.word 0x1ff0c6d3 -//.word 0xaa1e0adf -//.word 0x3f701ec3 -//.word 0x73785e3c -//.word 0x9c80fa8b -//.word 0x88714a78 -//.word 0x6ff36197 -//.word 0x25d6e4ca -//.word 0x94b11d07 -//.word 0x6ac84b5c -//.word 0x0f333c30 -//.word 0xda3d1ecb -//.word 0x840b9319 -//.word 0xdd7e03aa -//.word 0xbd5936fe -//.word 0x3ea72200 -//.word 0x285701d0 -//.word 0xad2aa7c5 -//.word 0x57cf13b3 -//.word 0x3e4c4469 -//.word 0x7e9f4e7e -//.word 0xe8a5ac4e -//.word 0xf83cd83f -//.word 0x07a41949 -//.word 0xc22c8000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x0000AB10 -//// expected output -//.word 0xb1b2dab9 -//.word 0x4b3db9ee -//.word 0xb1d579e6 -//.word 0x5f06f070 -//.word 0x04b98f21 -//.word 0x4026e4d5 -//.word 0x3b369178 -//.word 0x08cce2f3 -//.word 0x38b6d195 -//.word 0x287cbf24 -//.word 0x30f3867b -//.word 0xc1fd5c1a -//.word 0x38a4cb3e -//.word 0xc741521d -//.word 0xa718e2ca -//.word 0x33c9359f -//// SHA512LongMsgvector_55 -//// vector length -//.word 0x0000AE28 -//// input message -//.word 0xe0f3c615 -//.word 0x0121c7b8 -//.word 0x6b2efd3c -//.word 0xae3b9a5c -//.word 0xa975a25b -//.word 0xa3e09fec -//.word 0x97549750 -//.word 0xcec53bbe -//.word 0xb3c76107 -//.word 0xe450b47a -//.word 0x85c0aa05 -//.word 0xd920b79e -//.word 0x13a7c1e1 -//.word 0x6983d3fb -//.word 0x6bd615c6 -//.word 0x93fefc35 -//.word 0x1d19bef3 -//.word 0x18c80947 -//.word 0xbe34f43b -//.word 0x014f36fd -//.word 0x665d9585 -//.word 0x16b2a278 -//.word 0x33bda44d -//.word 0x6845d2ae -//.word 0xc4f3c521 -//.word 0xc8112ce7 -//.word 0xbe91c224 -//.word 0x4d517d41 -//.word 0x4b9d088f -//.word 0xd2f6742d -//.word 0x96112b2b -//.word 0x752325ef -//.word 0x505c5ed8 -//.word 0x1ab18722 -//.word 0x2edffb0a -//.word 0xe6adf632 -//.word 0x69710146 -//.word 0xc4d5b1e0 -//.word 0x3ddb91a9 -//.word 0xe31f5dc2 -//.word 0x6a5d7162 -//.word 0x363280c0 -//.word 0xb6278933 -//.word 0xf3eb0797 -//.word 0x69e069f4 -//.word 0x15d9c15a -//.word 0xcf23c00f -//.word 0xdac2e2ed -//.word 0xbafce605 -//.word 0x451c8188 -//.word 0xfd7053e8 -//.word 0x9d941a3a -//.word 0xf2f226df -//.word 0xec8a0d63 -//.word 0xf5ef9fa5 -//.word 0x81921c38 -//.word 0xe743a50a -//.word 0x6ff5f143 -//.word 0xacc24170 -//.word 0x0c2f96e1 -//.word 0xadb0214f -//.word 0x726ffbc3 -//.word 0x574916b2 -//.word 0x0119746d -//.word 0x9a3a96b9 -//.word 0xdb4738b9 -//.word 0x6a253b15 -//.word 0x6744e355 -//.word 0x4121428e -//.word 0xcf10f441 -//.word 0x9c380d80 -//.word 0x82df5052 -//.word 0x7ae8a259 -//.word 0xb299beb2 -//.word 0xe0a2291d -//.word 0xd75b695e -//.word 0x574e72e3 -//.word 0x2af561a6 -//.word 0x6cc56c55 -//.word 0x2b6b19b1 -//.word 0x3055af34 -//.word 0x1b74eaf6 -//.word 0xb640f3d1 -//.word 0x83fd8fc3 -//.word 0x973d9795 -//.word 0xaba7a8ba -//.word 0x71f61b7a -//.word 0x24453850 -//.word 0x6389a690 -//.word 0x3f5f264c -//.word 0x93088279 -//.word 0x94b1bf4e -//.word 0xa8f89aed -//.word 0x7cad3345 -//.word 0x50d50337 -//.word 0x96f513f7 -//.word 0xbc8d70b6 -//.word 0x46e2da7e -//.word 0x1f00bc5d -//.word 0x310061c5 -//.word 0x33876433 -//.word 0xc28f680f -//.word 0xb46a0ad3 -//.word 0xa9031470 -//.word 0xe268f3ee -//.word 0x57856c52 -//.word 0x03328ac4 -//.word 0x8371dbf1 -//.word 0xdff0dcaf -//.word 0xa8d6b1df -//.word 0x43bc1998 -//.word 0x84f8a282 -//.word 0x7f22197f -//.word 0x9ad14591 -//.word 0xe7a6d5f8 -//.word 0xb18c969a -//.word 0x553de9a8 -//.word 0x5309757f -//.word 0xa5d319cc -//.word 0x505c24f4 -//.word 0x38c4c9b3 -//.word 0x384dcd03 -//.word 0x7263833f -//.word 0xe4d9fa88 -//.word 0x3d767568 -//.word 0xeeb01bb5 -//.word 0x83b7f0b8 -//.word 0x34b5048f -//.word 0xb754ebd0 -//.word 0x59826c6f -//.word 0x4d717de2 -//.word 0x44e17082 -//.word 0x3ea16735 -//.word 0x9f530d4a -//.word 0x857188a4 -//.word 0x598da91b -//.word 0xa4dd661f -//.word 0x24f68b9e -//.word 0x20d8ac28 -//.word 0xf82b5e52 -//.word 0x00c8a758 -//.word 0x8e7bb206 -//.word 0x5207c7d8 -//.word 0xe66b7b60 -//.word 0xa66424e8 -//.word 0xc2339059 -//.word 0x92a0f75b -//.word 0x293f2dbe -//.word 0x2cf21c19 -//.word 0xe5af72b0 -//.word 0x9384979b -//.word 0x04d8e225 -//.word 0x66f30c73 -//.word 0x5bc1e566 -//.word 0x4bd245c1 -//.word 0xfea6468f -//.word 0x6a28b0bf -//.word 0xc978b512 -//.word 0xefeddf37 -//.word 0xdb5b4634 -//.word 0x8c910607 -//.word 0x1626f08d -//.word 0xf47680a4 -//.word 0xa0e70f8c -//.word 0x61714a94 -//.word 0x645de3f2 -//.word 0x0f4c87f2 -//.word 0x927c0f53 -//.word 0xbf47faed -//.word 0x1bec1b98 -//.word 0x35928f4a -//.word 0x368af27f -//.word 0xbad5d2de -//.word 0xdee66419 -//.word 0x9aa87615 -//.word 0x52c3a54b -//.word 0xa71cd06e -//.word 0x939acd4d -//.word 0xb5305afc -//.word 0xe918562e -//.word 0x1c5c31e6 -//.word 0x5f9ba14f -//.word 0x390a96e7 -//.word 0x42b971e3 -//.word 0xed1870d0 -//.word 0xa6b96d76 -//.word 0x1d57c901 -//.word 0xe118a363 -//.word 0x300f4df4 -//.word 0x0e05005b -//.word 0x9479ceb2 -//.word 0x8be5d9e5 -//.word 0x3943c35b -//.word 0x7bd065d9 -//.word 0x1410c4a3 -//.word 0x451240e4 -//.word 0x9ef50f4f -//.word 0x13abea07 -//.word 0x52fd06bc -//.word 0x54cf4617 -//.word 0x32a6af59 -//.word 0x3b671c3f -//.word 0x43623328 -//.word 0x3d8e9779 -//.word 0x0d165f41 -//.word 0x9715c819 -//.word 0x1c9e264f -//.word 0xc6002143 -//.word 0x81481d10 -//.word 0x0d07fa6f -//.word 0x5155fed9 -//.word 0xf3150fec -//.word 0x257b2610 -//.word 0xc2cc005a -//.word 0x996517b1 -//.word 0x09ffd02f -//.word 0xce31f6c9 -//.word 0x1a366733 -//.word 0xe7f10dfe -//.word 0x8c2e1004 -//.word 0x8f2b4a05 -//.word 0xbb57fc92 -//.word 0x7259bf2a -//.word 0x4454bda4 -//.word 0xc06a20cc -//.word 0x897fcb51 -//.word 0xad3f48df -//.word 0x33620288 -//.word 0xf32eb568 -//.word 0xab3e2289 -//.word 0x4e830704 -//.word 0x9f884e69 -//.word 0xfffa8561 -//.word 0x83678e92 -//.word 0x4a4698c3 -//.word 0x0e384e41 -//.word 0xf88d4d81 -//.word 0xb90adc06 -//.word 0xd6e9d785 -//.word 0x4322ed48 -//.word 0x34e90cd0 -//.word 0x307818be -//.word 0x670ee3f4 -//.word 0x45385af7 -//.word 0x474ffc97 -//.word 0x0e4291d3 -//.word 0xb29518f7 -//.word 0x58aa0107 -//.word 0x07409c60 -//.word 0xb739d29d -//.word 0xaba013b8 -//.word 0x01ea8f71 -//.word 0x887ca9f4 -//.word 0xd16ea8b6 -//.word 0x898fb0a0 -//.word 0x05a9f26f -//.word 0x1f061f5b -//.word 0x413222f6 -//.word 0xbf030e58 -//.word 0x6ad75579 -//.word 0x621d3cde -//.word 0x2b178b78 -//.word 0x03dd89c9 -//.word 0x73a62748 -//.word 0x25437c07 -//.word 0xf5ec7193 -//.word 0x4a3fbe1b -//.word 0xa78615d5 -//.word 0x7d399c9e -//.word 0x44c4a1e1 -//.word 0xc9898ab9 -//.word 0xca290a5a -//.word 0xc0ff9bad -//.word 0xfcee283a -//.word 0xf55d094b -//.word 0xe17f354e -//.word 0x82d8b37c -//.word 0x43fd52b8 -//.word 0x839b9aba -//.word 0x31ba026c -//.word 0x99436494 -//.word 0x7dc0adb4 -//.word 0x6864d92e -//.word 0x3f4b1fac -//.word 0x190268bf -//.word 0x504a06c7 -//.word 0xd919a312 -//.word 0xd0e27748 -//.word 0x5716bf06 -//.word 0xa1eb6ac9 -//.word 0x4a5c150e -//.word 0xea7139b7 -//.word 0xe9c0a3b1 -//.word 0x953425d4 -//.word 0x710d8c0a -//.word 0xd028d1b4 -//.word 0xa3819449 -//.word 0x90f6c540 -//.word 0x444ea531 -//.word 0x0979ed37 -//.word 0x9b194c98 -//.word 0x374217a8 -//.word 0xf67e3dea -//.word 0x59157979 -//.word 0x258bcba6 -//.word 0x716928e3 -//.word 0xfd4171e0 -//.word 0xc5eca2f3 -//.word 0xd6164cbd -//.word 0x61fd450b -//.word 0x0e759dfa -//.word 0x9230d55f -//.word 0x843c4c65 -//.word 0x6ccdfa78 -//.word 0x1e3d6062 -//.word 0x4651bfb4 -//.word 0x43be8968 -//.word 0x39eb15c4 -//.word 0x61f99682 -//.word 0xa4014e2d -//.word 0x699cffce -//.word 0xaba9a3c8 -//.word 0x4e4a5c01 -//.word 0xb330ae42 -//.word 0x8a19ece1 -//.word 0xe796f09d -//.word 0x98120fc9 -//.word 0xb7104dad -//.word 0x7bb4cc29 -//.word 0x53858b9b -//.word 0x36714d03 -//.word 0x3412d665 -//.word 0x522f5d6f -//.word 0x94863f5c -//.word 0x5bc8f118 -//.word 0xf1e638a5 -//.word 0x638b9cbd -//.word 0x8fe91ab9 -//.word 0x7db919b1 -//.word 0xf37d9fe5 -//.word 0x4309c55b -//.word 0x684168ca -//.word 0x512422b7 -//.word 0x7d0a78de -//.word 0xc82955d3 -//.word 0x855eb8e9 -//.word 0xcc2ba953 -//.word 0x15fc7189 -//.word 0x06ae0aee -//.word 0x8a51d5af -//.word 0x232d8bee -//.word 0x81047620 -//.word 0x5397e1b3 -//.word 0x5d6bcdf4 -//.word 0xcbcde531 -//.word 0xc514b41a -//.word 0x4326166d -//.word 0x233eecd3 -//.word 0x79ec1405 -//.word 0x265d9932 -//.word 0xacdc26a5 -//.word 0x4099c1a3 -//.word 0x21a9b592 -//.word 0x294fd061 -//.word 0xa17acf23 -//.word 0x5a8e17fd -//.word 0xf967a643 -//.word 0x939c48de -//.word 0x7a000ef1 -//.word 0x566ffcbc -//.word 0x77c702c0 -//.word 0x69342e23 -//.word 0xc9b11f57 -//.word 0x58cbbdf7 -//.word 0x4ea827f1 -//.word 0xf149edea -//.word 0x650c80de -//.word 0xc675e607 -//.word 0x742db201 -//.word 0xae4b342b -//.word 0x63d3ed50 -//.word 0x447c4587 -//.word 0x1eb78157 -//.word 0x67ecef1f -//.word 0x170763b5 -//.word 0xb933e74e -//.word 0xc1e5af9e -//.word 0x201d4b40 -//.word 0x16e92057 -//.word 0x472a1976 -//.word 0x129a9abd -//.word 0x1e0eb645 -//.word 0x35f9a1bf -//.word 0x56326857 -//.word 0x05f7dfdf -//.word 0xe631db29 -//.word 0x8af9a2b4 -//.word 0x895ca08b -//.word 0xd15b5c6b -//.word 0x3d36aa24 -//.word 0x6aeb2141 -//.word 0xc6f9cfeb -//.word 0xe9692c0b -//.word 0x290f4daf -//.word 0x680e5aaf -//.word 0x319a4290 -//.word 0x0402ada8 -//.word 0xeded3383 -//.word 0x5be3cb86 -//.word 0x301086d2 -//.word 0x15457d6c -//.word 0x1040079a -//.word 0x582d3090 -//.word 0x686d674b -//.word 0x529577be -//.word 0x56bab92c -//.word 0xb3ec87d5 -//.word 0xbd00f3d4 -//.word 0x3093b948 -//.word 0xc44b73b2 -//.word 0x01600c9e -//.word 0x555b7786 -//.word 0x641ea1f3 -//.word 0x9f25a4e5 -//.word 0x180b3d75 -//.word 0x945080b9 -//.word 0xe259cae8 -//.word 0x6cb8f8be -//.word 0x0caed622 -//.word 0x21eeda07 -//.word 0xe1a41390 -//.word 0xf1b65c77 -//.word 0x334ad5af -//.word 0xdf889448 -//.word 0xd5a19794 -//.word 0x3110fd88 -//.word 0x20207664 -//.word 0xf3aef997 -//.word 0x7230b5dc -//.word 0x73f649aa -//.word 0xabb037cb -//.word 0xc331964a -//.word 0xae720893 -//.word 0x3bdaecd6 -//.word 0xe6bcd5ac -//.word 0xf4223afd -//.word 0xbfc96f21 -//.word 0x4e6cd345 -//.word 0x28454c11 -//.word 0x6ad2f088 -//.word 0x18d5052f -//.word 0xb19e2c71 -//.word 0x068cd942 -//.word 0x4bd20603 -//.word 0x6f7729a5 -//.word 0xa9a16312 -//.word 0x5412fac8 -//.word 0xfcf309c7 -//.word 0xb9d076ae -//.word 0xbbe52521 -//.word 0x27986b6d -//.word 0x2246c66f -//.word 0x2a42cbb2 -//.word 0xad1b5fd7 -//.word 0xd41e2a3a -//.word 0xa01c49d2 -//.word 0x396e4359 -//.word 0x83353fad -//.word 0xf1e67477 -//.word 0x9e07e00a -//.word 0x9a333d8e -//.word 0x8164315d -//.word 0x5372c5ad -//.word 0x7fd61870 -//.word 0x41b45578 -//.word 0x2e19e2df -//.word 0x0e81daa6 -//.word 0xe99cbe9c -//.word 0x65516781 -//.word 0x4f043f6c -//.word 0x7714b16a -//.word 0xc1a8de68 -//.word 0x79ac9253 -//.word 0xe716767d -//.word 0x236e8743 -//.word 0x2b8dc6ed -//.word 0x33a531d5 -//.word 0x3c81f3cc -//.word 0xe80ed8b9 -//.word 0x8d1b0383 -//.word 0x885de331 -//.word 0xd4b66350 -//.word 0xdbb66195 -//.word 0x8b6362c4 -//.word 0xad3584d0 -//.word 0x7265b444 -//.word 0x4f6820e1 -//.word 0x0bb6ef89 -//.word 0x17cf305c -//.word 0x1d801120 -//.word 0xdb6252e6 -//.word 0x32a5f9ea -//.word 0x7a0b46bc -//.word 0x1937e99d -//.word 0x5428732c -//.word 0x65010b42 -//.word 0xcd0b621a -//.word 0xebfce9b5 -//.word 0xce7a417c -//.word 0x48dbf228 -//.word 0x432f61df -//.word 0x5880fc9f -//.word 0x9e58b8e0 -//.word 0xc084bd75 -//.word 0x53185fb4 -//.word 0x66b351d6 -//.word 0x5a0415a1 -//.word 0xf48db744 -//.word 0xb0a7bb82 -//.word 0x58c75412 -//.word 0xd6ffd746 -//.word 0x47c86eec -//.word 0x50fe1172 -//.word 0xb52cb24d -//.word 0x270ab89a -//.word 0x5e44af06 -//.word 0x687d3eec -//.word 0x419459be -//.word 0xa326b7a6 -//.word 0x1f54876d -//.word 0x6dc65f9b -//.word 0x01ef75e0 -//.word 0xde9311b2 -//.word 0xaf874238 -//.word 0x14b9d167 -//.word 0x3a70736b -//.word 0xaed44248 -//.word 0x73b06ec1 -//.word 0x52773079 -//.word 0x71850058 -//.word 0x27a80830 -//.word 0x0fdfd8a0 -//.word 0x5b615b39 -//.word 0x6be10ae0 -//.word 0x9f115f73 -//.word 0x69658db0 -//.word 0xa6196e52 -//.word 0x2e75bd7c -//.word 0xa950855b -//.word 0xa5d3d908 -//.word 0xe67fc6ab -//.word 0xfd7186e6 -//.word 0x1de5f671 -//.word 0x29fa4b01 -//.word 0x11b5006f -//.word 0x5f471216 -//.word 0x0d93707d -//.word 0x9aebad36 -//.word 0x5d1af905 -//.word 0x18a84f45 -//.word 0xd059f088 -//.word 0xdcf70f7e -//.word 0x3d51ce18 -//.word 0x2d8469ec -//.word 0xfa79b1dc -//.word 0x15afbdf2 -//.word 0x663bdc8f -//.word 0xe30dcdc5 -//.word 0x61743301 -//.word 0xaae543ed -//.word 0xcff8c094 -//.word 0xc0b329c8 -//.word 0x190b31c0 -//.word 0x3fa86f06 -//.word 0xace95791 -//.word 0x8728692d -//.word 0x783fa824 -//.word 0xba4a4e17 -//.word 0x72afbe2d -//.word 0x3f5cba70 -//.word 0x1250d673 -//.word 0x405d2c38 -//.word 0xd52c5252 -//.word 0x2c818947 -//.word 0xbcc03738 -//.word 0x35b198c4 -//.word 0xcc80b029 -//.word 0xd20884ac -//.word 0x8c50893c -//.word 0x3f565d52 -//.word 0x8a0cb51b -//.word 0xf8a197d9 -//.word 0xd601c987 -//.word 0x429f89bb -//.word 0x85727ed1 -//.word 0xa33def46 -//.word 0x30143362 -//.word 0x641c681a -//.word 0x72926834 -//.word 0x160ff9ac -//.word 0x6d0a4457 -//.word 0x0a9e89c6 -//.word 0x468d106d -//.word 0xd7866304 -//.word 0xa5a3ba2e -//.word 0xd936b759 -//.word 0x36c553e5 -//.word 0xac531988 -//.word 0x2ae192f1 -//.word 0xb53500ab -//.word 0xb7da4e45 -//.word 0x996848b0 -//.word 0x930608e8 -//.word 0xc32cb0d6 -//.word 0x7dae5f76 -//.word 0xe3f65d35 -//.word 0xb590999d -//.word 0x6aed5633 -//.word 0x7f6021a0 -//.word 0x0f6d0610 -//.word 0xa44303d8 -//.word 0x4d87bd5b -//.word 0xf053722e -//.word 0xe27f2f7a -//.word 0xb51f43a2 -//.word 0x514cf326 -//.word 0x46286fc8 -//.word 0x611c05ed -//.word 0x7e649545 -//.word 0x9cce45ae -//.word 0x37be7556 -//.word 0xd276f620 -//.word 0xd394764a -//.word 0x93dc3f4c -//.word 0xb6382203 -//.word 0xb8fdad0e -//.word 0xc970a579 -//.word 0xdb89b098 -//.word 0xf9f75136 -//.word 0xda6319f0 -//.word 0xb6f91cdb -//.word 0x5825a36d -//.word 0x759a209a -//.word 0x3c99673d -//.word 0x2e701aba -//.word 0x304165e1 -//.word 0xde04ec16 -//.word 0x23cf02af -//.word 0x06551c9e -//.word 0xc7ae8550 -//.word 0x2b5653d5 -//.word 0x14779940 -//.word 0x546bde51 -//.word 0xc37cce51 -//.word 0x90ef303e -//.word 0xd4421828 -//.word 0x6db15edb -//.word 0x09ff4ebe -//.word 0x8172a1fb -//.word 0x6920ade0 -//.word 0xe569d886 -//.word 0xbdc552b0 -//.word 0xb4c004f5 -//.word 0x1642c322 -//.word 0x9114cada -//.word 0x45a0677f -//.word 0x1ef8f456 -//.word 0x621a09e5 -//.word 0x8673f0a0 -//.word 0x46a159c5 -//.word 0xf57d4f85 -//.word 0x11596b64 -//.word 0x1a8648e2 -//.word 0xa41a365b -//.word 0xacef332c -//.word 0x28ef1717 -//.word 0xe18f0ee9 -//.word 0x859a4b59 -//.word 0xf830fb34 -//.word 0xec0e78b7 -//.word 0xb110c03c -//.word 0x4ef3251a -//.word 0xd06046c6 -//.word 0xe2263d3e -//.word 0x9ec81aa7 -//.word 0xa3379134 -//.word 0x68e0ef4b -//.word 0xd0e952e3 -//.word 0xfeb81a31 -//.word 0x6ab69b83 -//.word 0x3452146c -//.word 0xb948e521 -//.word 0x6523fc23 -//.word 0xc800911e -//.word 0xeb961311 -//.word 0xe47362b0 -//.word 0xa8883e07 -//.word 0x21e8005f -//.word 0x80cd8765 -//.word 0xd5dc7689 -//.word 0xdcaa9da5 -//.word 0x1a7eb4df -//.word 0x29594fd0 -//.word 0x51330ee6 -//.word 0x58881406 -//.word 0x9a13bb76 -//.word 0x5cda86fb -//.word 0x5d6a583e -//.word 0xae64e374 -//.word 0xc438623e -//.word 0xcc318bce -//.word 0x3eb2bf4c -//.word 0xb5bf8578 -//.word 0xfebe3690 -//.word 0x6e7ffa74 -//.word 0x797bf208 -//.word 0x8159b7da -//.word 0xecb70405 -//.word 0x7926af55 -//.word 0xd476deab -//.word 0x683577a3 -//.word 0x7472d875 -//.word 0x61c6c919 -//.word 0x5396aeaf -//.word 0xfe92021d -//.word 0xbb8100fa -//.word 0xda41a3ab -//.word 0x3a09d1cb -//.word 0x18f2d3d1 -//.word 0x25b609ec -//.word 0xdbb7dc32 -//.word 0x1043f3fa -//.word 0xcc16aa86 -//.word 0x5820c0e6 -//.word 0x97894f18 -//.word 0x99f30274 -//.word 0x6eff8248 -//.word 0x381231bf -//.word 0x84591b07 -//.word 0xdb0a2ab2 -//.word 0x93ed995d -//.word 0xeb1caa90 -//.word 0x58079ce6 -//.word 0x19bad76e -//.word 0x11636b50 -//.word 0xd60eb8b4 -//.word 0x06b46edf -//.word 0xda74b99f -//.word 0xfd20b5ea -//.word 0x9efb28c2 -//.word 0xc4c1705b -//.word 0xe1e8ba80 -//.word 0xab267533 -//.word 0x27330794 -//.word 0x06d0be04 -//.word 0x35080989 -//.word 0xb0b6e874 -//.word 0x9747a142 -//.word 0x83c1b5c1 -//.word 0x1a041274 -//.word 0xe1518a37 -//.word 0x52088426 -//.word 0x2fb6f1bc -//.word 0x154e8238 -//.word 0x54b71845 -//.word 0xfe877dd9 -//.word 0x3e0f515e -//.word 0xeb974710 -//.word 0x5dea91a6 -//.word 0x80169834 -//.word 0x266df150 -//.word 0xa2cf8c74 -//.word 0x922c2fa3 -//.word 0xfc44234f -//.word 0x9db12e7b -//.word 0x7d28c11d -//.word 0xc7fc71c6 -//.word 0xd8e3ab84 -//.word 0x96fda408 -//.word 0x03129004 -//.word 0x121c14d7 -//.word 0xb905fd6c -//.word 0x47b1325f -//.word 0xf83fe762 -//.word 0xc68c14e0 -//.word 0x83f926e0 -//.word 0x256ff42b -//.word 0x61a0f4b1 -//.word 0x7b8faf29 -//.word 0x5c5272f8 -//.word 0xe5164754 -//.word 0x836523a9 -//.word 0x03a4613b -//.word 0xa8e06f0e -//.word 0x7bcac803 -//.word 0xe3ff2243 -//.word 0x758de8e0 -//.word 0x0db3eaba -//.word 0x1ee954a0 -//.word 0x4620dcb8 -//.word 0x264b4021 -//.word 0x701ef0d6 -//.word 0x411607d6 -//.word 0xb2b98082 -//.word 0xaa1fa746 -//.word 0xf6b1cd7b -//.word 0x9b31408c -//.word 0x6afb7b58 -//.word 0xd68a99d8 -//.word 0x033d1002 -//.word 0x1f5b9bed -//.word 0xf5567835 -//.word 0xbf4cd4a1 -//.word 0x3cd38403 -//.word 0x03f6f560 -//.word 0x177b6651 -//.word 0xbb6854a9 -//.word 0x88c53658 -//.word 0xbca26b90 -//.word 0xd55c7126 -//.word 0x5f1d573a -//.word 0x0aa2751a -//.word 0xff415a64 -//.word 0x742a066b -//.word 0x7eed5adc -//.word 0x273ccca2 -//.word 0xc1f25f06 -//.word 0x7a55d31b -//.word 0x30981859 -//.word 0x86a50988 -//.word 0x371957e0 -//.word 0xaa8fc36e -//.word 0xc72191b9 -//.word 0x0a2c39a6 -//.word 0xd5545f99 -//.word 0x0bc805dd -//.word 0xdac70046 -//.word 0xd864a814 -//.word 0x5286d41b -//.word 0xe0320621 -//.word 0x3d0de288 -//.word 0x561ce52d -//.word 0xa1cf538f -//.word 0xb03e7134 -//.word 0x06b2f548 -//.word 0x2967bb88 -//.word 0xf990b95e -//.word 0x3f9c354d -//.word 0x89b83590 -//.word 0x369538fe -//.word 0xcd6b2331 -//.word 0x933e7ee7 -//.word 0x5c60e0a8 -//.word 0xa137a8aa -//.word 0xd340eef1 -//.word 0xef54baba -//.word 0x532a731a -//.word 0xd01e9ae3 -//.word 0x0030b8c7 -//.word 0xd95094c0 -//.word 0x83d9aaaf -//.word 0x675bd943 -//.word 0x899d5c1c -//.word 0x17e2fb30 -//.word 0x426c826e -//.word 0x4c3f73a2 -//.word 0xe227f899 -//.word 0xadfc1b85 -//.word 0x242539a2 -//.word 0xa45bb41a -//.word 0xc2afe927 -//.word 0xe0cf6277 -//.word 0xfe854cd4 -//.word 0xd3802b04 -//.word 0x1c57ccee -//.word 0x35cb7bff -//.word 0xe64d77cc -//.word 0x7fc0a3f9 -//.word 0x277f7e59 -//.word 0x71a25556 -//.word 0x307db894 -//.word 0x8d6a2ad1 -//.word 0x56c91c10 -//.word 0x99441df6 -//.word 0x72584b74 -//.word 0x21100da6 -//.word 0x5f1404fb -//.word 0xf3e33e97 -//.word 0x805dadf5 -//.word 0xa184d8d1 -//.word 0x3783d145 -//.word 0x02f06732 -//.word 0x6f4e9ce1 -//.word 0xb1d65aea -//.word 0x13776155 -//.word 0x8d1b8400 -//.word 0x952c1540 -//.word 0x37569ecb -//.word 0x688fd1d6 -//.word 0x9855c27a -//.word 0x8637545c -//.word 0x5897f18d -//.word 0xebae7faf -//.word 0x68d18f5a -//.word 0x18f2d7be -//.word 0x7969e289 -//.word 0x91f5060b -//.word 0x82fd9797 -//.word 0x5f1c5a2d -//.word 0x3edd3c57 -//.word 0x8ec34451 -//.word 0xab8dc76c -//.word 0xb0b7dbb4 -//.word 0x8d440dd1 -//.word 0x59bb572b -//.word 0xe9704c52 -//.word 0xa104969c -//.word 0x8a2fa210 -//.word 0xa5bd9a82 -//.word 0x7fd79400 -//.word 0x0684096d -//.word 0x9b70886c -//.word 0x68ebab80 -//.word 0xf4344b71 -//.word 0xf4f8f0f1 -//.word 0x65168b7f -//.word 0xd7a5688c -//.word 0x0c385edc -//.word 0xc1604930 -//.word 0xcc73ba22 -//.word 0x678cec50 -//.word 0xccd3fabc -//.word 0x02ff5073 -//.word 0xf6195f6d -//.word 0xcd8296b5 -//.word 0x79378dc9 -//.word 0x8a548344 -//.word 0x47d70aba -//.word 0xfea701e4 -//.word 0x98d5c3fd -//.word 0x70219e6b -//.word 0x66c087a2 -//.word 0x2f5c0b46 -//.word 0xef5d898f -//.word 0x09679ff2 -//.word 0x3523e2fe -//.word 0xd443d284 -//.word 0x81c00dfa -//.word 0xe966c221 -//.word 0xdc9369e6 -//.word 0xa43cb186 -//.word 0x9530baf6 -//.word 0xe5a18582 -//.word 0xbee0a9b4 -//.word 0x92684777 -//.word 0xaf1e3f7c -//.word 0x13d7a4dd -//.word 0x811b6e01 -//.word 0xd4296fbf -//.word 0x943a89c6 -//.word 0xc70a1d3c -//.word 0x0995c6a5 -//.word 0xdf1e4807 -//.word 0x4976c34b -//.word 0x967b2de7 -//.word 0x7cdffeba -//.word 0x682b2d37 -//.word 0x13035cc6 -//.word 0x56ab5067 -//.word 0x3fcaa399 -//.word 0x646ebd7a -//.word 0x7751002f -//.word 0x1b5b4386 -//.word 0xf66782da -//.word 0x084ad338 -//.word 0x3b119cbf -//.word 0x3b8b044d -//.word 0x8708a758 -//.word 0xc95f8e19 -//.word 0x63365ef0 -//.word 0x4a7dcf04 -//.word 0x173c602a -//.word 0x5b8f4a08 -//.word 0x33eeb27a -//.word 0x1db22234 -//.word 0x0ad53aa9 -//.word 0xb5faa32c -//.word 0x32ad4555 -//.word 0xcaebbaa7 -//.word 0x06e5026f -//.word 0x0a0178ef -//.word 0x242204bc -//.word 0xa5299365 -//.word 0xf0bcc455 -//.word 0xd046e4fb -//.word 0x0f3e1d28 -//.word 0x44adeab8 -//.word 0xeceace74 -//.word 0xbca84637 -//.word 0x3633fc50 -//.word 0x7bf73d28 -//.word 0x6042ad25 -//.word 0xc34b3acd -//.word 0x20724e2f -//.word 0x5fc9497e -//.word 0xf0d42e00 -//.word 0x1a8d9c26 -//.word 0x90ab01fd -//.word 0x46240ac5 -//.word 0x82f15ede -//.word 0x36118bec -//.word 0x8dd04033 -//.word 0xc449be43 -//.word 0x3b2a89da -//.word 0xccb76306 -//.word 0x5b127a8a -//.word 0xaeb9e183 -//.word 0x7f503d4b -//.word 0xd0a1c19e -//.word 0x7fe15cfb -//.word 0x1a34304d -//.word 0xf47447cb -//.word 0x792e811d -//.word 0xbeeed1c0 -//.word 0x5dbda9ab -//.word 0x7fe7b333 -//.word 0x3a02c22c -//.word 0x1e2b0851 -//.word 0x0a9389e6 -//.word 0x443bcf9b -//.word 0xc9fbe0b4 -//.word 0xe2c96d67 -//.word 0xf8384c85 -//.word 0xa93f295d -//.word 0x1c3c78de -//.word 0x9138adfb -//.word 0x3c6db054 -//.word 0x53058b12 -//.word 0x66256612 -//.word 0xef2ab647 -//.word 0x2a33b159 -//.word 0x26df0592 -//.word 0x1c58c9fb -//.word 0x0190b4c2 -//.word 0x57ca8ddf -//.word 0x485de2f7 -//.word 0xf5b4fd81 -//.word 0x0c9a1427 -//.word 0x98b4c06f -//.word 0x1e4fb09a -//.word 0xe55d9fcd -//.word 0x95b9836e -//.word 0x04b308d1 -//.word 0x4cc83c14 -//.word 0x21b18c47 -//.word 0x61a0efd0 -//.word 0xedc6610e -//.word 0xb818933d -//.word 0x1d53e19a -//.word 0x763d84c7 -//.word 0xea2e0970 -//.word 0x86d0012f -//.word 0x8f23fbad -//.word 0x17c4af0b -//.word 0xcf6e7c80 -//.word 0x1cc11543 -//.word 0x6d4277ab -//.word 0xcba41e94 -//.word 0xb2467806 -//.word 0x1ffc9a11 -//.word 0xea1232fb -//.word 0x568ebc9e -//.word 0xe7b6f90b -//.word 0x73d29d73 -//.word 0x7c334848 -//.word 0xbd74b89f -//.word 0x03003dd9 -//.word 0x3ed46d82 -//.word 0xd8871879 -//.word 0x45877f51 -//.word 0xdca5c0f8 -//.word 0xe5d49596 -//.word 0xf32d3eb8 -//.word 0x7437bcae -//.word 0x86664031 -//.word 0x0ce1e34a -//.word 0x0188976f -//.word 0x0d365eee -//.word 0x5643ba8f -//.word 0x994e6474 -//.word 0x79394045 -//.word 0x1774918a -//.word 0xe27f6a58 -//.word 0xb1aa6530 -//.word 0x0f209624 -//.word 0xd523c23b -//.word 0xff99cd17 -//.word 0xb8c872d5 -//.word 0xb75e3735 -//.word 0xceb49ffb -//.word 0xc053a195 -//.word 0x54b859fd -//.word 0xa754fee1 -//.word 0xc6d71402 -//.word 0x7caee2da -//.word 0x69ca2781 -//.word 0x54a409d1 -//.word 0xc37e4ec9 -//.word 0xc8ebce2f -//.word 0x1d912879 -//.word 0x732eb5ee -//.word 0x08d9ba09 -//.word 0x788be21e -//.word 0xd5ddeb3f -//.word 0xf9139f61 -//.word 0x1b5a06bb -//.word 0xa14eda6f -//.word 0x35bf3b6c -//.word 0x1bb5a493 -//.word 0xc2b11e19 -//.word 0x9936b32c -//.word 0x238826d9 -//.word 0x4eb4e12d -//.word 0x01d02f9a -//.word 0xf484ab9d -//.word 0xc4caf99e -//.word 0x47f1b318 -//.word 0x1de8a6f9 -//.word 0x87b93f4c -//.word 0x7c544015 -//.word 0xfa8eb77c -//.word 0x9b69312e -//.word 0x68962b01 -//.word 0xf138c9d7 -//.word 0x9eebcbc4 -//.word 0x4005bc73 -//.word 0xeb1c6cc5 -//.word 0x08c8a1bc -//.word 0xa6a90a98 -//.word 0x11ac743f -//.word 0xa68b40e2 -//.word 0xe59315de -//.word 0xc8aad2e0 -//.word 0x5390c74d -//.word 0x6d6524e1 -//.word 0xee6cb196 -//.word 0xf90ec0c7 -//.word 0x8c226195 -//.word 0x556bd48a -//.word 0xc862447c -//.word 0x6e36b2b4 -//.word 0x80122f50 -//.word 0xb49e4ee6 -//.word 0x57c8d96a -//.word 0x9cc4c352 -//.word 0x34515ef7 -//.word 0x1e3fce3f -//.word 0xc12ebe79 -//.word 0x38985188 -//.word 0xed125b44 -//.word 0x69ced21d -//.word 0x6a657f02 -//.word 0x36d3f981 -//.word 0x30c3d42f -//.word 0xa90e164a -//.word 0xf87eea9d -//.word 0xcdd799a4 -//.word 0xc218b5f1 -//.word 0x33fe98ce -//.word 0x50ca0d24 -//.word 0x70444c9b -//.word 0xa9002c03 -//.word 0x9de094f3 -//.word 0x96da32af -//.word 0xd6fb704f -//.word 0x28aca41e -//.word 0xbb358741 -//.word 0x307fe999 -//.word 0xf21ea3ea -//.word 0xc68ecc3c -//.word 0xa3bd3081 -//.word 0xc3cafd79 -//.word 0xfa0dc0d3 -//.word 0x47579095 -//.word 0xa97b89bd -//.word 0x330d7d28 -//.word 0x6369e5b4 -//.word 0xb0f71ea2 -//.word 0x62aed23e -//.word 0xa6d7b4c1 -//.word 0xe2147076 -//.word 0x46a0e11c -//.word 0xa4d8858c -//.word 0x81fb2f9b -//.word 0x6c2efc42 -//.word 0x8ec388fc -//.word 0x83ba6270 -//.word 0x6888bd50 -//.word 0x35186881 -//.word 0x4d10007c -//.word 0x545564f4 -//.word 0x41d169b9 -//.word 0xb474cfdc -//.word 0x89787414 -//.word 0xadeac860 -//.word 0x306681ee -//.word 0x9c22903c -//.word 0x862d537d -//.word 0x62f90c3e -//.word 0x9c189249 -//.word 0xe44346c9 -//.word 0xc9a049b0 -//.word 0x8945ec56 -//.word 0x27f86862 -//.word 0xbf38d0ee -//.word 0x178243e6 -//.word 0x76cd66b1 -//.word 0xb9571114 -//.word 0xa3a34953 -//.word 0x75c26f99 -//.word 0xbed3b699 -//.word 0x75c6db76 -//.word 0x456510e0 -//.word 0x28943981 -//.word 0x37d75a97 -//.word 0xc11650e2 -//.word 0x9a9dc0c0 -//.word 0xb5674e97 -//.word 0xf59c0f73 -//.word 0x415840f0 -//.word 0xd7ae385b -//.word 0xe2ed9b14 -//.word 0x4e21d136 -//.word 0xdbddb67a -//.word 0x70389359 -//.word 0xb3164e71 -//.word 0xd6a9dd2a -//.word 0xb3370099 -//.word 0x1c1d30a5 -//.word 0x6c14d268 -//.word 0x62b3b1d8 -//.word 0x3035aba6 -//.word 0xce7dab66 -//.word 0x9457d7f1 -//.word 0x08010a07 -//.word 0xf5ea8439 -//.word 0xbdb9e006 -//.word 0xef914745 -//.word 0x1c93e4c3 -//.word 0xe7a5972c -//.word 0x5c72ee2f -//.word 0x83b251dd -//.word 0x34ac7c52 -//.word 0x2cf93398 -//.word 0x618a30c8 -//.word 0x93ed6172 -//.word 0x24cb503f -//.word 0x29b6e3d5 -//.word 0xc12145fb -//.word 0xa6b024fe -//.word 0x01b31d53 -//.word 0x83ed747d -//.word 0xb1990932 -//.word 0x7faf87b9 -//.word 0x2163df96 -//.word 0x1eeef569 -//.word 0xa6929814 -//.word 0x25d8b81c -//.word 0x181dd352 -//.word 0x204cb1b2 -//.word 0x54ed518b -//.word 0xdc5f23e0 -//.word 0xbc61780e -//.word 0xedd836b0 -//.word 0xb2ccd0c0 -//.word 0x29b375ff -//.word 0x20f28896 -//.word 0x2ba151fd -//.word 0xf38ef21c -//.word 0xd1859cb0 -//.word 0x9ccf02f1 -//.word 0xbff90e72 -//.word 0x8ed7d348 -//.word 0xdac7c46e -//.word 0xc23a2368 -//.word 0xcd71bc27 -//.word 0x3685d22d -//.word 0x87aa5af1 -//.word 0x69b46785 -//.word 0xbbdbe676 -//.word 0xe1bb8bf4 -//.word 0x5f9f0b32 -//.word 0xa6fe8c10 -//.word 0x2d4659f8 -//.word 0xc4d9db05 -//.word 0x2655c56b -//.word 0xcd198e13 -//.word 0x0a052485 -//.word 0x5480df0b -//.word 0xe1c0b313 -//.word 0x7346abd6 -//.word 0x75a79237 -//.word 0x4692f3ee -//.word 0xd50f45e5 -//.word 0x6e055fe2 -//.word 0xd3ff3267 -//.word 0x8f2fb6d7 -//.word 0x87b425d9 -//.word 0xd2186801 -//.word 0xca1dceae -//.word 0x63b9042e -//.word 0xbc5f4229 -//.word 0xf480c23c -//.word 0x3f5276e4 -//.word 0x39d0fa9e -//.word 0x7a02c84c -//.word 0x6a7eabdb -//.word 0x562f7623 -//.word 0xc455f50e -//.word 0x04cd24fd -//.word 0x08939f67 -//.word 0x76855ac3 -//.word 0xfa6992a9 -//.word 0xe1320334 -//.word 0xe47f5caa -//.word 0x4165f05f -//.word 0x116eaed6 -//.word 0xd5e1532a -//.word 0x5244deac -//.word 0x9f2044ce -//.word 0x7c046640 -//.word 0xe5cc4058 -//.word 0xe72363b7 -//.word 0xb347a52a -//.word 0xf10d17ce -//.word 0x56243778 -//.word 0x799d6753 -//.word 0xe2ab9ecb -//.word 0x64a85eaa -//.word 0xae59e681 -//.word 0x1c73a84a -//.word 0xd35efd4b -//.word 0x0c38183e -//.word 0xb01d38ae -//.word 0x26a622a4 -//.word 0x68afcf83 -//.word 0x5d5e6231 -//.word 0x63615d77 -//.word 0x2a7613ab -//.word 0xc931618c -//.word 0x0bfa996d -//.word 0x0a55bf96 -//.word 0x0066f8e7 -//.word 0x59b43fbe -//.word 0x0d2d5a1b -//.word 0x2c6a0c02 -//.word 0xbb358d21 -//.word 0xbe4837b3 -//.word 0x965882a4 -//.word 0x8d5232f6 -//.word 0xb0e5cf63 -//.word 0xdd405644 -//.word 0x1c1d2eb1 -//.word 0x32fe5dea -//.word 0x74b6fcf5 -//.word 0xda2ce889 -//.word 0x545cbb2b -//.word 0x619efb97 -//.word 0xdd2b9161 -//.word 0x1add7cdc -//.word 0x3336c63b -//.word 0x9da4b7f6 -//.word 0xff034a70 -//.word 0x4464ddd6 -//.word 0xee0d2c4a -//.word 0xadc18041 -//.word 0x30412429 -//.word 0x3b121950 -//.word 0xfa810a01 -//.word 0x95e582f0 -//.word 0x04245dd7 -//.word 0x25787d62 -//.word 0x0b73be49 -//.word 0x99412bbb -//.word 0x502e7203 -//.word 0x66679566 -//.word 0x1805e34a -//.word 0x4147279e -//.word 0x2a1f1f75 -//.word 0xa4f12ff4 -//.word 0x5497576f -//.word 0x4fa863cf -//.word 0xe7fa6137 -//.word 0xc4800000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x0000AE28 -//// expected output -//.word 0xb4e49d08 -//.word 0xbe92b078 -//.word 0x80b5f949 -//.word 0x6ef0974a -//.word 0x09f44d57 -//.word 0xae3dd5ba -//.word 0x0dde1b49 -//.word 0x8f09eb21 -//.word 0x9bbf3019 -//.word 0xdfb28e5a -//.word 0x4d79d12c -//.word 0x299462ce -//.word 0xfa246cf4 -//.word 0xa13fbdc8 -//.word 0x1f719972 -//.word 0x065d3ac1 -//// SHA512LongMsgvector_56 -//// vector length -//.word 0x0000B140 -//// input message -//.word 0x3778e7b9 -//.word 0xd4fd81ac -//.word 0xf9d95150 -//.word 0x09f176df -//.word 0xab5c7a42 -//.word 0x73741fc8 -//.word 0xc02d5b1e -//.word 0xe0a6a17c -//.word 0x7bfe621c -//.word 0x2e69d4f0 -//.word 0x7683f294 -//.word 0xd0e4c482 -//.word 0x1ef4e085 -//.word 0x4d003170 -//.word 0x358ef70f -//.word 0xc0ee0f5e -//.word 0x4f1275f9 -//.word 0x59a007d4 -//.word 0x55448b2c -//.word 0xdb4bf4bd -//.word 0x066ee136 -//.word 0x1ceb67ea -//.word 0x71db10c8 -//.word 0x88bf238d -//.word 0x7c5c2638 -//.word 0x9ec9a2be -//.word 0x60c62600 -//.word 0x724f8efa -//.word 0x2a71853d -//.word 0x295d499f -//.word 0x3cbbaf31 -//.word 0x80406671 -//.word 0xca837fc1 -//.word 0x450c2d18 -//.word 0x5daecaf8 -//.word 0xdc181ba0 -//.word 0x53a6d582 -//.word 0xbc7d60f7 -//.word 0x5dd6da32 -//.word 0xf09a5f72 -//.word 0x0030887c -//.word 0x96923149 -//.word 0x15a780fc -//.word 0x63cd2317 -//.word 0x49b4d8ed -//.word 0x1d73335b -//.word 0x9ed59cb3 -//.word 0x1ff497f9 -//.word 0xe80a4852 -//.word 0xd98336b9 -//.word 0x50574ff4 -//.word 0x4d962cc6 -//.word 0xd4459767 -//.word 0x93684a31 -//.word 0xc560fa9c -//.word 0x5677946c -//.word 0x48bac729 -//.word 0x5507c2d0 -//.word 0xd6663fc8 -//.word 0xe39cc017 -//.word 0xbcfe18d6 -//.word 0x67842ee2 -//.word 0x9b1efed5 -//.word 0xdd4be035 -//.word 0xe9e70deb -//.word 0x53445ff6 -//.word 0x6e7d5860 -//.word 0x6d076671 -//.word 0xc8896524 -//.word 0xe2ee66d7 -//.word 0xe8b8af46 -//.word 0xfc9703ba -//.word 0x933a237e -//.word 0x1b659493 -//.word 0xe244a3a4 -//.word 0x33ffa73c -//.word 0xc28e8637 -//.word 0x49cf7a77 -//.word 0x74d515d8 -//.word 0xfb838365 -//.word 0x0d5a10cc -//.word 0xf590e90f -//.word 0xf862277d -//.word 0x7cab09e1 -//.word 0x70b481f9 -//.word 0xe74ef329 -//.word 0x061e3971 -//.word 0x2139ea9d -//.word 0x21f1dcbb -//.word 0x29eee7d2 -//.word 0x7980ecd1 -//.word 0x923316c6 -//.word 0x9aa46050 -//.word 0x03945857 -//.word 0x683b22fa -//.word 0xb7debfc9 -//.word 0x95a49035 -//.word 0xfea61544 -//.word 0x2c45fb8a -//.word 0xbbc05654 -//.word 0x0a062b26 -//.word 0xe4c83168 -//.word 0x60d3d85c -//.word 0x059d8b53 -//.word 0x321d3221 -//.word 0xbde0fcce -//.word 0xdb5a5b8e -//.word 0x407a50f3 -//.word 0x8781e862 -//.word 0xd31307c4 -//.word 0xb78e647d -//.word 0x539cd5a2 -//.word 0xc004cd66 -//.word 0xafc622d6 -//.word 0x4c6614c7 -//.word 0x69888c0c -//.word 0xd8bda1ec -//.word 0x189d60d3 -//.word 0x3516cd47 -//.word 0xe903251e -//.word 0x070066ee -//.word 0x197d11c6 -//.word 0x48122f1b -//.word 0x7d129205 -//.word 0xc6635dac -//.word 0xfb8dc7fc -//.word 0xa1101ba1 -//.word 0x0efb032f -//.word 0xceba07a0 -//.word 0x46305104 -//.word 0x9706b374 -//.word 0xc642eb48 -//.word 0x191b258a -//.word 0xc40bc1aa -//.word 0xc4275772 -//.word 0x0cacf83d -//.word 0xdfdab764 -//.word 0x7d0568fa -//.word 0x01e9a8b9 -//.word 0x8a3e1e3b -//.word 0x998c006e -//.word 0xba41d842 -//.word 0x670188a4 -//.word 0x293d8bb0 -//.word 0x00077f22 -//.word 0x0524e00e -//.word 0x4e6317d2 -//.word 0x122eb348 -//.word 0x0d5ff640 -//.word 0x2655932d -//.word 0x5046b61e -//.word 0xaed645f0 -//.word 0xfae965c2 -//.word 0x27b641aa -//.word 0x451e07a6 -//.word 0xa63b32d6 -//.word 0x3f3b0fe8 -//.word 0x506f7ad3 -//.word 0x489fe9c8 -//.word 0xe3a1ad65 -//.word 0x9529742d -//.word 0x2be31135 -//.word 0xb0bf801f -//.word 0x8d8d244c -//.word 0xf5c9544e -//.word 0x80b8169c -//.word 0x16b42a8a -//.word 0x0fc34b78 -//.word 0x986fb149 -//.word 0x59d2da17 -//.word 0x55f18a24 -//.word 0x114b1114 -//.word 0xf8b1cc5a -//.word 0xfe57eef1 -//.word 0x842c804c -//.word 0x7b67a78f -//.word 0xcd6226ff -//.word 0xf8ac23b7 -//.word 0xfc5a2e9e -//.word 0x789d7f95 -//.word 0x109a7ff5 -//.word 0x11758b38 -//.word 0x58aff4f6 -//.word 0x70b34a14 -//.word 0xfaabda38 -//.word 0x5298757f -//.word 0x6fa27373 -//.word 0x0bacf837 -//.word 0x042c7605 -//.word 0x033a73db -//.word 0x5be78d70 -//.word 0x34cfbb6d -//.word 0xe8f2d5da -//.word 0xadbf57d6 -//.word 0x7572628c -//.word 0x12a00362 -//.word 0x9e10b873 -//.word 0x1acd3040 -//.word 0x557953a2 -//.word 0x0fe48204 -//.word 0x5fde20ce -//.word 0x52495124 -//.word 0xd57201d1 -//.word 0xd5a1297e -//.word 0xa4ee4d28 -//.word 0x9f574ad1 -//.word 0x0e104e75 -//.word 0x4b1a283f -//.word 0x2717c2fd -//.word 0x895debd2 -//.word 0x58495a2a -//.word 0x9bd5f0f3 -//.word 0xdf6d3e0b -//.word 0xd9ff47f4 -//.word 0x4d5287cf -//.word 0x2f983488 -//.word 0x0746c34e -//.word 0x9a23ae46 -//.word 0xc69f7580 -//.word 0xae67e32a -//.word 0x17369203 -//.word 0x12eeb113 -//.word 0xdce7059a -//.word 0x02872e46 -//.word 0xc8132ca8 -//.word 0xccc421e9 -//.word 0xe71e58b9 -//.word 0x547d8789 -//.word 0x14f151fa -//.word 0x904b0f95 -//.word 0x8178d0bc -//.word 0x0d0e9ee0 -//.word 0x322504f5 -//.word 0x6868cd23 -//.word 0x826c0dbf -//.word 0xd6406679 -//.word 0x9d4584d7 -//.word 0x9d3feae2 -//.word 0x05adf11f -//.word 0x98560dc0 -//.word 0x0d25531c -//.word 0xb636385d -//.word 0x61319c78 -//.word 0x7cd70763 -//.word 0x7cda3282 -//.word 0x7ff2c962 -//.word 0x2f2d6fa9 -//.word 0xea87034d -//.word 0x21ba2105 -//.word 0xfe57ecfd -//.word 0x4a160bce -//.word 0x8d6af2ad -//.word 0x775963e2 -//.word 0x7e8b347d -//.word 0xc9a15244 -//.word 0x4dc806ef -//.word 0x368d7798 -//.word 0x88f3716d -//.word 0x06c264a8 -//.word 0x5323b0c1 -//.word 0x576a1fe1 -//.word 0xe433b39b -//.word 0x99b0a3d7 -//.word 0x0741a00e -//.word 0x13455cbd -//.word 0x9b314d13 -//.word 0x5ddfafed -//.word 0x1428c805 -//.word 0xe3b46f66 -//.word 0xf711cf24 -//.word 0x69036949 -//.word 0x611b5812 -//.word 0x818bd95c -//.word 0x81390a59 -//.word 0x1612f287 -//.word 0x19a1c2e3 -//.word 0xe5e05a5a -//.word 0x014e0f80 -//.word 0xff41ac84 -//.word 0xa37eb664 -//.word 0x4807f55d -//.word 0x80342fa6 -//.word 0xfb05375d -//.word 0xaab727c2 -//.word 0x2395e9a3 -//.word 0x4811fc17 -//.word 0x2313746f -//.word 0x1591436a -//.word 0x3060b8a8 -//.word 0xe14a4561 -//.word 0xd2608557 -//.word 0x0e917d09 -//.word 0x677c232a -//.word 0x15831c51 -//.word 0x9f21caf2 -//.word 0xff7d868d -//.word 0x013f2a25 -//.word 0xeca2d3f4 -//.word 0x64cae55d -//.word 0x8f594f22 -//.word 0x773d10d7 -//.word 0xafcbfa97 -//.word 0x3a12b5f5 -//.word 0xa8690835 -//.word 0x824b54bd -//.word 0xe86561c6 -//.word 0x79ec5d57 -//.word 0x73342274 -//.word 0x1b7fb893 -//.word 0x60131b4f -//.word 0xbb8f3e60 -//.word 0x597e4fcb -//.word 0x7c2d3d56 -//.word 0x1fba783f -//.word 0xd96ef82d -//.word 0x034c8067 -//.word 0x1dea2444 -//.word 0x6e8009e3 -//.word 0xeb3f6c1b -//.word 0x5ae4e5b5 -//.word 0xb78cedd9 -//.word 0xd7ca9fc7 -//.word 0x4bf7bbc8 -//.word 0x87c9f063 -//.word 0x44275bd3 -//.word 0x223c4bb9 -//.word 0x92cb470f -//.word 0xf3c2525d -//.word 0xfb116d2f -//.word 0x59bc5ec6 -//.word 0x982fb00e -//.word 0x47d3fbd0 -//.word 0x57de6529 -//.word 0xc46f693b -//.word 0x78dad722 -//.word 0x6c401c29 -//.word 0x1064c43e -//.word 0xedb93da4 -//.word 0x88c0dee8 -//.word 0x8a902716 -//.word 0x1fb64b2c -//.word 0x9c40ebcf -//.word 0x6415253d -//.word 0x0c88cd83 -//.word 0xbd2cfaf0 -//.word 0xdae9c5c9 -//.word 0xe34f4d3e -//.word 0x9a2bff9d -//.word 0x645814c6 -//.word 0xf1d85adf -//.word 0x1f233849 -//.word 0x1cbfecd2 -//.word 0xcb11182c -//.word 0x6a737d9e -//.word 0x718706f9 -//.word 0xbdca08ce -//.word 0xed6cc8de -//.word 0x0d5f3ed2 -//.word 0x72ae182c -//.word 0xe410027e -//.word 0x03bd25d9 -//.word 0xe380ed89 -//.word 0xfa0d10ff -//.word 0x3c96cc0f -//.word 0x8499705c -//.word 0x36fc1d10 -//.word 0x225bced0 -//.word 0xaca196ef -//.word 0x2ad529e1 -//.word 0x8e379ef3 -//.word 0x458c733a -//.word 0x5fb6d2c9 -//.word 0xef871227 -//.word 0xb5d78101 -//.word 0xfad4611b -//.word 0xbc9a308c -//.word 0x0b042d2b -//.word 0xb3c11745 -//.word 0x1baa3891 -//.word 0x6d52a265 -//.word 0xf7dfb929 -//.word 0xd219f10d -//.word 0xc1c1d9f7 -//.word 0x5b2459bf -//.word 0x6df0379f -//.word 0x9a45e0e5 -//.word 0x440f66eb -//.word 0xb094c549 -//.word 0x64496a49 -//.word 0xd4eaf69c -//.word 0x3ec93f4b -//.word 0xd36797f0 -//.word 0x17415225 -//.word 0x8aec823d -//.word 0x88640532 -//.word 0x6ea2c2df -//.word 0xfe6c2f6f -//.word 0x05711716 -//.word 0x3a959aff -//.word 0x6a8a7585 -//.word 0xd2a083a5 -//.word 0xcdde84b3 -//.word 0xaf511e4d -//.word 0xf0a4218e -//.word 0x8df10f83 -//.word 0xabd7dce3 -//.word 0x7dcdf2fa -//.word 0x69b578e7 -//.word 0x66b5d407 -//.word 0xa9426eb1 -//.word 0x807db724 -//.word 0x7ec36bbd -//.word 0xd87f136e -//.word 0x0f43cd6b -//.word 0xcf184f26 -//.word 0x18122a7e -//.word 0x9b274c33 -//.word 0x6740c99e -//.word 0xc491db9f -//.word 0x5f2627d6 -//.word 0xa8bf4116 -//.word 0x79de7316 -//.word 0xf81eba6a -//.word 0xbec612b2 -//.word 0x399ef312 -//.word 0x4e021ce2 -//.word 0x43348fa6 -//.word 0xddf7dd40 -//.word 0xc559a364 -//.word 0x30d0554d -//.word 0xbf883aae -//.word 0xa4fcb8ec -//.word 0x07c4d28a -//.word 0xa8adefe5 -//.word 0xc50fdd21 -//.word 0x3e5b1563 -//.word 0xf7f44140 -//.word 0x7e40fb76 -//.word 0xeefed8da -//.word 0x13daa592 -//.word 0xce3ef084 -//.word 0xbb6ccb0e -//.word 0x12caccf8 -//.word 0xcb7c58a7 -//.word 0x06382193 -//.word 0xa956eefb -//.word 0x4b279bd7 -//.word 0x5188600e -//.word 0x56b756e9 -//.word 0xd16536c7 -//.word 0xf10c6413 -//.word 0xcc822d74 -//.word 0xb9cf4d43 -//.word 0xfa3cb542 -//.word 0x9fac8b8b -//.word 0xa62f71c6 -//.word 0x67d50a9f -//.word 0x30c0ba78 -//.word 0x2c7dae5a -//.word 0x89951d32 -//.word 0xd95ecd3a -//.word 0xb917d8b5 -//.word 0xb134b0df -//.word 0x5cf76124 -//.word 0xc9401690 -//.word 0x20a6df87 -//.word 0x89c6b1b6 -//.word 0x49dbaf49 -//.word 0x2e90a75e -//.word 0x2e12e0ba -//.word 0x4b6813bb -//.word 0xba07b78e -//.word 0x43a181a2 -//.word 0xeb3f2c5d -//.word 0xd18f760d -//.word 0x567f6b21 -//.word 0x800ae599 -//.word 0xa15254bb -//.word 0x33f0bb08 -//.word 0x0788fb6e -//.word 0x9fa054bf -//.word 0xd8b22962 -//.word 0xcb7f0349 -//.word 0xf6a7d922 -//.word 0x97778fd2 -//.word 0x5902bc1f -//.word 0x3273b0ac -//.word 0x8ca1b62b -//.word 0xa3e496ce -//.word 0x2e285efe -//.word 0x413f6250 -//.word 0x727c82b5 -//.word 0x3b7dabf1 -//.word 0x9f48a14e -//.word 0x109afb91 -//.word 0x917b6f2d -//.word 0x18164fb7 -//.word 0x36c8549a -//.word 0xf9779b0c -//.word 0x1225ed40 -//.word 0x33c443dd -//.word 0xbb4c89b0 -//.word 0x950ca39d -//.word 0x5d3daedc -//.word 0xc5dd8862 -//.word 0x38bb929c -//.word 0xbdceb463 -//.word 0x1dcaa22d -//.word 0x48f55e80 -//.word 0xf537ffad -//.word 0x8971b0ba -//.word 0x3a10fba0 -//.word 0x74e248b7 -//.word 0x7b28a06e -//.word 0x53ecb73f -//.word 0xdd952ae2 -//.word 0x42b805c1 -//.word 0x943188ad -//.word 0xb3732bcf -//.word 0x6e1cdfe1 -//.word 0xebcd979e -//.word 0x49380776 -//.word 0x837aab87 -//.word 0x98ac0cc9 -//.word 0xe9b43f88 -//.word 0xe261ae18 -//.word 0xdcb81bc4 -//.word 0x4288e107 -//.word 0xf3457dff -//.word 0xe8124e1e -//.word 0x17209923 -//.word 0x9737d048 -//.word 0x049214bd -//.word 0x25f0f856 -//.word 0xcce88881 -//.word 0xfe7d8a7a -//.word 0x54f203c2 -//.word 0xa1e0fdcd -//.word 0xd58588fa -//.word 0x225fffc9 -//.word 0x5df98c49 -//.word 0xa606eecf -//.word 0x4bac7aed -//.word 0xea2260a2 -//.word 0xd67d30cf -//.word 0xbcc79dea -//.word 0x875280f6 -//.word 0x804b20b3 -//.word 0xba92b012 -//.word 0xadc919eb -//.word 0x21acfaf2 -//.word 0x4ea0ede8 -//.word 0x418e0d0e -//.word 0x81f1b5df -//.word 0xf32e8afe -//.word 0xfb25bb6e -//.word 0xe4058701 -//.word 0x82640013 -//.word 0x158f0f77 -//.word 0x711eb9b2 -//.word 0x5ccca067 -//.word 0x3886cd13 -//.word 0xe2c2acfb -//.word 0xd9125862 -//.word 0xa3f919fe -//.word 0x6cfd2cad -//.word 0xf1fdc265 -//.word 0x9cc54a69 -//.word 0xf0e0f3c3 -//.word 0x28ad6dee -//.word 0x1bb6f0d3 -//.word 0x633c80f7 -//.word 0xbe176ff2 -//.word 0xb4bd2323 -//.word 0x7ba01aa2 -//.word 0x17bd2a76 -//.word 0xc5710e08 -//.word 0x9a8f1ed8 -//.word 0x68b15e6f -//.word 0xe1cbba95 -//.word 0xff0690c3 -//.word 0xa3cb6fdb -//.word 0x7c1d1f17 -//.word 0x2a2de13f -//.word 0xa328f720 -//.word 0xd6546739 -//.word 0x8f5bfdb7 -//.word 0x9be78fa4 -//.word 0x2c6e845b -//.word 0x7f50973f -//.word 0xbb1fd9ac -//.word 0x1d3df52e -//.word 0x52adb8f1 -//.word 0x2423d179 -//.word 0x595dd593 -//.word 0xd8b6868c -//.word 0x0ef954a0 -//.word 0x907324b5 -//.word 0x024c514a -//.word 0x3717f0aa -//.word 0x99a75965 -//.word 0xcc24e300 -//.word 0x8e5feeec -//.word 0xe26327b5 -//.word 0x6d4d077c -//.word 0x205d9da7 -//.word 0x174c8ed7 -//.word 0xc1e05a1a -//.word 0x42bfe063 -//.word 0x15812537 -//.word 0xf60851a8 -//.word 0xff14fa87 -//.word 0x1112a5d6 -//.word 0x75358a7c -//.word 0xc3c8983c -//.word 0x03c3b9e8 -//.word 0x139c57d2 -//.word 0x495f1f84 -//.word 0x580105b1 -//.word 0x78f2886b -//.word 0xc1f13795 -//.word 0xd824749c -//.word 0xce687862 -//.word 0x45e6977b -//.word 0xd5e7c59c -//.word 0xaee95a50 -//.word 0x7ef112ed -//.word 0x952458c7 -//.word 0x4791c4a3 -//.word 0x9152e26f -//.word 0x00d33530 -//.word 0xcf717b3b -//.word 0x4f4733a8 -//.word 0x8c445d04 -//.word 0x2e818146 -//.word 0x9dd2f204 -//.word 0x699c54e7 -//.word 0xe8e65c5d -//.word 0x21b2d78d -//.word 0xe88dee90 -//.word 0x4b65a8de -//.word 0x2d9bb006 -//.word 0x315959a3 -//.word 0xda26df8b -//.word 0xf0b7f049 -//.word 0x25086ace -//.word 0xf8ac6763 -//.word 0xda6277e2 -//.word 0x8fe82c26 -//.word 0xd814dcc0 -//.word 0x4f20a2eb -//.word 0x9246a6c3 -//.word 0xa38c9eb1 -//.word 0x8fe2952a -//.word 0x4e6aeb99 -//.word 0xeb179e99 -//.word 0xe579c768 -//.word 0xd4d76898 -//.word 0x4f7f6408 -//.word 0x0e5acf13 -//.word 0x4cc36807 -//.word 0x6f9964d9 -//.word 0xeb936e17 -//.word 0x64d4eb1d -//.word 0x13c0828c -//.word 0x6a0ddcf8 -//.word 0xfb1da8e1 -//.word 0x968be3e5 -//.word 0xb1045633 -//.word 0x0d586043 -//.word 0x97d0f5c5 -//.word 0x8dc3e7d7 -//.word 0xe164647a -//.word 0xe2dec147 -//.word 0x19a3755e -//.word 0x710069a0 -//.word 0x9cf66f1e -//.word 0xb1450fd0 -//.word 0x1ac98a8b -//.word 0xad09192d -//.word 0x190e761b -//.word 0x84719ded -//.word 0x72b8d467 -//.word 0xe9e3e9ab -//.word 0xd341bbae -//.word 0xa388fbe9 -//.word 0x3b253451 -//.word 0x0dd10988 -//.word 0x8165bf55 -//.word 0x97effb52 -//.word 0xce05cce4 -//.word 0x4459eb70 -//.word 0x1e8e42cc -//.word 0x2a4aacf4 -//.word 0xc38dfcff -//.word 0xf6414051 -//.word 0xe3124711 -//.word 0x657f60de -//.word 0xf53165bd -//.word 0xcb8cf856 -//.word 0x47850d61 -//.word 0x90b3a95b -//.word 0x7ba8e87d -//.word 0xae8145ee -//.word 0x05bc1638 -//.word 0x344a56f9 -//.word 0xaee5a7db -//.word 0xc6a497c5 -//.word 0x14cd2353 -//.word 0x1bea7a84 -//.word 0x281f03b3 -//.word 0x7dbaa0c9 -//.word 0xaf0c35b0 -//.word 0x4d78640b -//.word 0xc2c99b24 -//.word 0x7dc85125 -//.word 0x4f0f8c8c -//.word 0x1418a7d9 -//.word 0x95995289 -//.word 0xad14da48 -//.word 0xaba9ab63 -//.word 0xf830137c -//.word 0xfa844881 -//.word 0x3721addf -//.word 0xbef251f2 -//.word 0xc364b8c0 -//.word 0x89bfdfe8 -//.word 0x85b67ad5 -//.word 0xc03d8037 -//.word 0x7d9ae9b4 -//.word 0x1cbfb7da -//.word 0x3ed73359 -//.word 0x2a1f796f -//.word 0x6ff736a3 -//.word 0xcb39b1b6 -//.word 0x4cc908d7 -//.word 0xb56dbc16 -//.word 0x23df701b -//.word 0xf021ee18 -//.word 0xd8116bfc -//.word 0x5a3d0cea -//.word 0x61f8a9e9 -//.word 0x24aed0dd -//.word 0x4b740db6 -//.word 0x53e368e7 -//.word 0x33273019 -//.word 0x4053f721 -//.word 0x4ef7de30 -//.word 0x18f5134a -//.word 0xe29097fa -//.word 0x5cc64543 -//.word 0xcae010d9 -//.word 0x62478c92 -//.word 0xf599b017 -//.word 0xd2fcdadf -//.word 0xe8b3135e -//.word 0x2aef9479 -//.word 0x38e78a3e -//.word 0x3b2a17d2 -//.word 0x103499aa -//.word 0xaa402efe -//.word 0xb15e787b -//.word 0x6fc59d39 -//.word 0xed6a92ec -//.word 0x59d29a5e -//.word 0xab24091d -//.word 0x89824e70 -//.word 0x67993090 -//.word 0xf2775815 -//.word 0xaf9d10af -//.word 0xdf564a16 -//.word 0xa747e444 -//.word 0x6d462ae1 -//.word 0x85709dff -//.word 0x0d75f307 -//.word 0x15375ef3 -//.word 0x049411be -//.word 0x367f0119 -//.word 0xea56e860 -//.word 0x5c6f90cc -//.word 0x2ef54eea -//.word 0x0cf2cc4c -//.word 0x90ac0c7e -//.word 0x6335aa3b -//.word 0xa63e62e1 -//.word 0x902cd123 -//.word 0x586e80fe -//.word 0x550d1eee -//.word 0x64840d61 -//.word 0x8ad3216c -//.word 0xdacfa4bd -//.word 0x99bc9dd1 -//.word 0xa11d5167 -//.word 0x03cb0b34 -//.word 0xf04519d8 -//.word 0xda471711 -//.word 0xd69e702e -//.word 0x453a21c7 -//.word 0xb385c0ac -//.word 0xfff3bd1b -//.word 0xbcdae936 -//.word 0xd88534b3 -//.word 0x7b84bbd6 -//.word 0x3245029c -//.word 0x4de97d3a -//.word 0x865056c5 -//.word 0xe3766a33 -//.word 0xdd039582 -//.word 0xc11d2f37 -//.word 0x5781d60a -//.word 0xc2d26ee0 -//.word 0xa73067f9 -//.word 0x910d3e6b -//.word 0x943c47cf -//.word 0x314ba93a -//.word 0x7a13aa6f -//.word 0x768d2d52 -//.word 0xc7e878a0 -//.word 0x8ad83bde -//.word 0x7f30ce8f -//.word 0x6ab3bbaa -//.word 0xb9277c4b -//.word 0x66ac86a9 -//.word 0x1f4c8648 -//.word 0xa5d3ea70 -//.word 0x72e1a3dd -//.word 0x9e3d29b8 -//.word 0x036cc0c6 -//.word 0xa083fbe0 -//.word 0x3b397ea3 -//.word 0x4a400768 -//.word 0x14d6b076 -//.word 0x14976e77 -//.word 0x9e95de29 -//.word 0xc5aa4156 -//.word 0x7b0dc406 -//.word 0xfa2406f3 -//.word 0x6399d43d -//.word 0xa5b0375f -//.word 0xa1d8b062 -//.word 0x8c80c251 -//.word 0x942bb1ec -//.word 0xc6c78aa0 -//.word 0x2f3a63b7 -//.word 0x413fe4cd -//.word 0x79700683 -//.word 0x3fa31b77 -//.word 0x0e7a0f73 -//.word 0xd436ede4 -//.word 0x9ccca48e -//.word 0x6a3b0c7f -//.word 0x661c2441 -//.word 0x3d7b9e54 -//.word 0xc5e59ddb -//.word 0xe0c2bd96 -//.word 0xa2e65410 -//.word 0xb662f71a -//.word 0xfda04077 -//.word 0x79afcfd9 -//.word 0x6adb8f0d -//.word 0xb6813a72 -//.word 0x8e2120af -//.word 0x4fb524a5 -//.word 0xa64107a3 -//.word 0xf8ace9d9 -//.word 0x01ce0c10 -//.word 0xbbcadc98 -//.word 0x819e2c81 -//.word 0x74f8c30e -//.word 0x1e4c1766 -//.word 0x5523588d -//.word 0x62b6b093 -//.word 0x63bbca0b -//.word 0xee7f91bf -//.word 0xf7353aa2 -//.word 0xf48d8406 -//.word 0x3e893e0f -//.word 0xbb8d0a68 -//.word 0xbab56234 -//.word 0x1e6ad848 -//.word 0xbf38a297 -//.word 0x0dda55ed -//.word 0xf797f1e1 -//.word 0x0bd21e05 -//.word 0xdedcb55f -//.word 0xae0c821d -//.word 0x46124984 -//.word 0x2288062a -//.word 0xd4ca7965 -//.word 0xa608e203 -//.word 0x81990a3b -//.word 0x0d9282e4 -//.word 0x1a982fe5 -//.word 0x3ff207ed -//.word 0xc0e21564 -//.word 0xb536c3a1 -//.word 0x691a585d -//.word 0x0130c067 -//.word 0x5ee38c9a -//.word 0x44f8390d -//.word 0xbb65b589 -//.word 0xb5671f40 -//.word 0xf2cfcebb -//.word 0x219c9615 -//.word 0x48cf4667 -//.word 0x657b7583 -//.word 0x561c7fe5 -//.word 0xf629cae6 -//.word 0x89ed4e33 -//.word 0x5a92547e -//.word 0xa27f7d73 -//.word 0xace407ee -//.word 0x37924c6b -//.word 0x1c118bbe -//.word 0x30eceb04 -//.word 0x6c50bdd9 -//.word 0x4bd502cb -//.word 0x749c2d0f -//.word 0x999a2a73 -//.word 0x9f339e94 -//.word 0xff0b7151 -//.word 0x6c198a7f -//.word 0xb6fdd9de -//.word 0xee939b4c -//.word 0xcbc8d939 -//.word 0x4cac325b -//.word 0x9fc9dba3 -//.word 0x42b4e46f -//.word 0x68e1bd01 -//.word 0x9ebbf830 -//.word 0xaef4505d -//.word 0xc31aeba9 -//.word 0xcf6cdc65 -//.word 0x2aebeccb -//.word 0x7cb49aeb -//.word 0xdc8c60e7 -//.word 0x39bd3863 -//.word 0xf9215f38 -//.word 0xe17c5968 -//.word 0x350e3557 -//.word 0x20691238 -//.word 0x5581e2c5 -//.word 0xf7026e33 -//.word 0xb7e69b65 -//.word 0x3c46eb60 -//.word 0xc77046ff -//.word 0x173bfbe7 -//.word 0x8a9702be -//.word 0x86688498 -//.word 0x17959cb2 -//.word 0xd95b6063 -//.word 0x19e81b4f -//.word 0x3725ddde -//.word 0x4ed336ed -//.word 0x17d93ec3 -//.word 0x0bdcd846 -//.word 0xc811386e -//.word 0xb64fa3fb -//.word 0xea697663 -//.word 0x4bba6a0f -//.word 0xf30116c6 -//.word 0xd870b66a -//.word 0xabff2ae2 -//.word 0x00064257 -//.word 0xb00b38a3 -//.word 0x7bd87e06 -//.word 0xf2d1ba1b -//.word 0x9585100b -//.word 0x38839f01 -//.word 0xab6f4ede -//.word 0x9955c82d -//.word 0xb13cc559 -//.word 0x04ff8c1d -//.word 0xae58b53d -//.word 0xb93e3474 -//.word 0x3e7193ad -//.word 0xcd537f76 -//.word 0x0ff986b1 -//.word 0xaa821f8c -//.word 0x65a7ebb4 -//.word 0x8d943ac6 -//.word 0x97f6d107 -//.word 0x0656eb54 -//.word 0x90a57d5c -//.word 0x7c18be0c -//.word 0x4e36e74b -//.word 0xa62f37e8 -//.word 0x666f3bd0 -//.word 0x13734c85 -//.word 0x7edb59cb -//.word 0xa3c1e7a5 -//.word 0xd14a557f -//.word 0x0b7a65ad -//.word 0xaf4df814 -//.word 0x55031927 -//.word 0xfabb3d16 -//.word 0x5e43c941 -//.word 0xaa2fd5f3 -//.word 0x5628304d -//.word 0x4a87a480 -//.word 0x43237b40 -//.word 0x79664175 -//.word 0x7fa7cc33 -//.word 0x6ab37aec -//.word 0x35adbae4 -//.word 0x6419cee6 -//.word 0xe833cf36 -//.word 0x4385f1c6 -//.word 0xecb808ac -//.word 0xf5ab4bd4 -//.word 0xebc258f2 -//.word 0xfe8179bb -//.word 0x61592655 -//.word 0xf4c1cb0c -//.word 0x2189cb46 -//.word 0x036bc4b9 -//.word 0xcee415db -//.word 0x6b429d9a -//.word 0x62fdc64e -//.word 0xfd4ac2ec -//.word 0xabee157c -//.word 0xa25054cd -//.word 0xc8d32c67 -//.word 0xd462a5c1 -//.word 0xb04da8b4 -//.word 0x2253c030 -//.word 0xac001d2e -//.word 0xb139dee5 -//.word 0xd8159041 -//.word 0xb6eef191 -//.word 0xa7b8fa80 -//.word 0xfc921d46 -//.word 0x5c9bcc1f -//.word 0x64073afc -//.word 0x91726579 -//.word 0x60735410 -//.word 0xb3759d8c -//.word 0x77c22bc0 -//.word 0x84e13e78 -//.word 0xc422b3b0 -//.word 0x98778604 -//.word 0x77859568 -//.word 0xd9fba719 -//.word 0x5323acd4 -//.word 0x03b74745 -//.word 0x2ef589c2 -//.word 0x28f50039 -//.word 0x743bf067 -//.word 0x2d89e04b -//.word 0xa4f658db -//.word 0x4b44eaf5 -//.word 0xd26f6f98 -//.word 0x8f829354 -//.word 0x23ae94ff -//.word 0x5b9d46aa -//.word 0x54045bd3 -//.word 0xe378e1dd -//.word 0x33820cbd -//.word 0xb0f536f5 -//.word 0x247f24c6 -//.word 0x207f8ba1 -//.word 0x9e16d2e0 -//.word 0xe4811ab3 -//.word 0xaca67c5d -//.word 0x81ec91a0 -//.word 0x6c503875 -//.word 0xd0b69301 -//.word 0x937c53c5 -//.word 0x7e553615 -//.word 0xe755cdcb -//.word 0x8d48833c -//.word 0xc348db6b -//.word 0xd18ff97d -//.word 0x9789646d -//.word 0x732d0a01 -//.word 0x658e85fd -//.word 0x71ad9c96 -//.word 0x45920d29 -//.word 0x1c9b8a2d -//.word 0xe2130167 -//.word 0x9906205c -//.word 0xfb54190c -//.word 0x6105a2dd -//.word 0xe3dc40d6 -//.word 0xc12fc60d -//.word 0x02f61863 -//.word 0x5a21356e -//.word 0x512f75b7 -//.word 0xa2fc0f26 -//.word 0xe1daddba -//.word 0x61e4647d -//.word 0x558f0fb8 -//.word 0x3582bb63 -//.word 0x64a878df -//.word 0x0f838ee8 -//.word 0x58c3bfc5 -//.word 0xb417ccc1 -//.word 0x91433bdf -//.word 0x3d7356ca -//.word 0x03ce770b -//.word 0x974f837e -//.word 0xb4d0b507 -//.word 0x03689d81 -//.word 0x3ff768f7 -//.word 0x97ff6117 -//.word 0x53b6b8e3 -//.word 0xbb5982aa -//.word 0x34c20237 -//.word 0xad3d2748 -//.word 0x39985542 -//.word 0xfd796922 -//.word 0x4df4f7b7 -//.word 0x125dd50f -//.word 0x6f5bde2f -//.word 0xa43ef006 -//.word 0x329337a4 -//.word 0x40f5aea8 -//.word 0x3d26e2f7 -//.word 0xc75efab4 -//.word 0xcbe2f46c -//.word 0xeed93190 -//.word 0x2c5b3429 -//.word 0xbfcca7c7 -//.word 0x43689eba -//.word 0x171e2085 -//.word 0x06a2e490 -//.word 0x27be581d -//.word 0x01e9e77d -//.word 0xf31a7c84 -//.word 0xd4de423a -//.word 0xd6a9afd3 -//.word 0xb069c0e2 -//.word 0xfc6186c9 -//.word 0xdd35e174 -//.word 0xe6418c47 -//.word 0x372f5954 -//.word 0xe9c9bed2 -//.word 0xad0b91ca -//.word 0xaf7d1014 -//.word 0xc1c02482 -//.word 0xb566e75b -//.word 0x0a07630b -//.word 0xcc909d18 -//.word 0xb5dfd258 -//.word 0x988d0062 -//.word 0x000ba842 -//.word 0x14f1d271 -//.word 0xbd925304 -//.word 0x0bd44b23 -//.word 0xd53ff1bd -//.word 0xa053937a -//.word 0xc21fd8f1 -//.word 0xc80f491c -//.word 0x14060f08 -//.word 0xcbacfed1 -//.word 0xee0ad3ce -//.word 0xc654ba09 -//.word 0x860514f2 -//.word 0x2c317654 -//.word 0xa817f587 -//.word 0x40f7a1e8 -//.word 0x33234f86 -//.word 0x9c579c1e -//.word 0x9a4d2e4a -//.word 0xae8d3df5 -//.word 0x64835212 -//.word 0x36d34f8d -//.word 0xadf1b082 -//.word 0xc9ec10ae -//.word 0xa38aef23 -//.word 0x519ab23f -//.word 0x0a86ebde -//.word 0x8a28dbcf -//.word 0xb8de3685 -//.word 0x87e1250f -//.word 0x1ad2914b -//.word 0x2b969f56 -//.word 0xad647746 -//.word 0xb01c4a1c -//.word 0x86db93f4 -//.word 0x24cc9d7f -//.word 0xca4145b3 -//.word 0xe70201c1 -//.word 0x37e42148 -//.word 0x2e9e55c8 -//.word 0x99d97059 -//.word 0x83866b9d -//.word 0x5574adf3 -//.word 0x422289ed -//.word 0xe2d20905 -//.word 0x1ddeea8b -//.word 0x4b4fe7e2 -//.word 0x99ac3bec -//.word 0xaf1061c3 -//.word 0x907f1eaa -//.word 0xc17ac143 -//.word 0xadd1aa02 -//.word 0x48b909e1 -//.word 0xf31ee855 -//.word 0xa03b6c81 -//.word 0x366757aa -//.word 0x3732d2ec -//.word 0xa0b06a2b -//.word 0x1015584c -//.word 0x2d8205a4 -//.word 0x431fcdb0 -//.word 0x2f6a0307 -//.word 0x7ccf368e -//.word 0xcb78b3eb -//.word 0x78664b3c -//.word 0x7ac15708 -//.word 0x8b6cf975 -//.word 0x8adda4bc -//.word 0x1d2cdedb -//.word 0x9a69448a -//.word 0x2833cf6f -//.word 0x21865795 -//.word 0xbbd5551b -//.word 0xe859ed29 -//.word 0x7aa82c28 -//.word 0x8b898e33 -//.word 0x1c07c3c8 -//.word 0xfcc4b2c4 -//.word 0xec90bf8e -//.word 0x003a4992 -//.word 0x48a677f1 -//.word 0xb0203576 -//.word 0x25f079cd -//.word 0xf92fcbef -//.word 0x89d904e1 -//.word 0x1d23569e -//.word 0x0f0e8c52 -//.word 0x303c93c8 -//.word 0x67023a26 -//.word 0x9bc036d8 -//.word 0xd36d69ca -//.word 0x9c7664da -//.word 0xacc92a8d -//.word 0xc42c3600 -//.word 0xdbd4c022 -//.word 0x78333d21 -//.word 0x60112522 -//.word 0x71def835 -//.word 0xce478388 -//.word 0x3c0760db -//.word 0xcc00bc33 -//.word 0xbb8a5cd3 -//.word 0x960be268 -//.word 0xa1c84d84 -//.word 0x7afac04d -//.word 0xfa258477 -//.word 0x5ca54f6f -//.word 0xa189c7d9 -//.word 0x32a5423d -//.word 0xc8e3d0fd -//.word 0x89da7b8b -//.word 0x74a2cdd8 -//.word 0xfee69310 -//.word 0xfd3ae184 -//.word 0xc6af56e8 -//.word 0x92a5a1be -//.word 0x27e14412 -//.word 0xb4e09868 -//.word 0xfc6a12f3 -//.word 0xb66ac407 -//.word 0x34fc27d1 -//.word 0x44c81746 -//.word 0x548f1f59 -//.word 0xd903f771 -//.word 0xf1dc4b1a -//.word 0x4628befa -//.word 0x36e22f08 -//.word 0x32c73bf8 -//.word 0x646503f9 -//.word 0x95752fa3 -//.word 0x4d6a332b -//.word 0x3c4ad0da -//.word 0xd8bddebd -//.word 0x48644a9d -//.word 0x816b5b31 -//.word 0xaf623993 -//.word 0xd648aff1 -//.word 0xb9e93085 -//.word 0xfb6b18c7 -//.word 0x842335e1 -//.word 0x26ad8663 -//.word 0x803b4238 -//.word 0x232d1cd9 -//.word 0xf4e2c6c0 -//.word 0xd2ceb420 -//.word 0x78cd22d3 -//.word 0xa4b75893 -//.word 0x79352d6e -//.word 0x21d3ca74 -//.word 0xb856b0b3 -//.word 0x654ffd65 -//.word 0xcaf0ea67 -//.word 0x9f1f99ed -//.word 0x99c90e75 -//.word 0x91797bf9 -//.word 0xe229c069 -//.word 0x13583258 -//.word 0xb65c9bf6 -//.word 0x8ffa833e -//.word 0xf934ae70 -//.word 0x8662e6c2 -//.word 0xe684fb52 -//.word 0x0ad70760 -//.word 0x88a6f6ba -//.word 0x42634677 -//.word 0x43f60ce8 -//.word 0xe95538cc -//.word 0x495519c3 -//.word 0xcfc02406 -//.word 0x25a7f154 -//.word 0x56f98630 -//.word 0x3455d849 -//.word 0xf71d8f3a -//.word 0x26cc0a73 -//.word 0xbb89a377 -//.word 0x82fc3449 -//.word 0xc260da20 -//.word 0x1fd9f862 -//.word 0xbf087fd0 -//.word 0xacdd6dfe -//.word 0x79ad9407 -//.word 0x29859d7e -//.word 0x4cbd4ca8 -//.word 0x6bd006e8 -//.word 0xa66b907a -//.word 0x9cc31964 -//.word 0x8b2c7baa -//.word 0xb8e8bec2 -//.word 0x123cdd47 -//.word 0x12c9cdf2 -//.word 0xe51abcc5 -//.word 0xcd7a9789 -//.word 0xc508ce7b -//.word 0x640d5b43 -//.word 0x038c0125 -//.word 0x221bd17b -//.word 0x08f2f363 -//.word 0xaa42a3b5 -//.word 0xcec87a38 -//.word 0x70a1ef15 -//.word 0x65601d8b -//.word 0x3e5ec7e5 -//.word 0x6f5199a9 -//.word 0xb120b013 -//.word 0xa4f65dc1 -//.word 0xb99626b0 -//.word 0x4fee0e67 -//.word 0x1cee1772 -//.word 0xcf9a0412 -//.word 0xf35e6333 -//.word 0x17a2cb9e -//.word 0x2c9f6370 -//.word 0x2e71a3cb -//.word 0x076d5fcb -//.word 0xb0b401bc -//.word 0x9908168a -//.word 0x4bdf0c78 -//.word 0x4cb63915 -//.word 0x42a8206d -//.word 0x5c3ff07c -//.word 0xee8a4ee8 -//.word 0x5b7054ef -//.word 0x3843da9d -//.word 0xae99f443 -//.word 0x2057bb26 -//.word 0x0e0e5174 -//.word 0x3a8b1f7c -//.word 0x09a9611d -//.word 0x2b6ae57f -//.word 0x7e460f02 -//.word 0x30c32174 -//.word 0x2546b987 -//.word 0x98299c82 -//.word 0x040db136 -//.word 0x45725134 -//.word 0xfa85be3d -//.word 0x2f38f0fa -//.word 0x399898ed -//.word 0xe05c5fa8 -//.word 0xc4b96e3d -//.word 0xf97e34f5 -//.word 0xf55c6345 -//.word 0xac853cfd -//.word 0xf97a0dc3 -//.word 0x401df8c0 -//.word 0x520ef599 -//.word 0x90341aa1 -//.word 0x549a1b4d -//.word 0x8c7d0de8 -//.word 0xa8a36f87 -//.word 0xb7ee6a40 -//.word 0xcc305897 -//.word 0xa7418439 -//.word 0x914f30ed -//.word 0x8876ddc7 -//.word 0x9c90c69e -//.word 0x994faec1 -//.word 0xe689dbe6 -//.word 0xadd26363 -//.word 0x3c50a6a1 -//.word 0xaccb1ccd -//.word 0xc00451d0 -//.word 0x0f482d82 -//.word 0x6644791a -//.word 0x681b9fea -//.word 0x77b6b149 -//.word 0xd85cadd0 -//.word 0x118200c9 -//.word 0x96e448e4 -//.word 0xa5d45e2c -//.word 0x6fd2943a -//.word 0x785e3ba8 -//.word 0x400a69c9 -//.word 0x80000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x0000B140 -//// expected output -//.word 0x19cf6c6d -//.word 0xc28eb06c -//.word 0xd9fc0a58 -//.word 0xc87c8af1 -//.word 0xaa605ae7 -//.word 0xfda192ec -//.word 0x6ea3c12e -//.word 0xc3b6dd52 -//.word 0x9d22c45e -//.word 0xe32a0059 -//.word 0x7ef615af -//.word 0x5a8e790d -//.word 0x3902818d -//.word 0x1bc3d333 -//.word 0x41e648b3 -//.word 0x49c5377e -//// SHA512LongMsgvector_57 -//// vector length -//.word 0x0000B458 -//// input message -//.word 0x2214992c -//.word 0x8008d66a -//.word 0x27352924 -//.word 0x20127ca9 -//.word 0x527995bb -//.word 0x4857f6e2 -//.word 0x34a80107 -//.word 0x34a3603d -//.word 0xd531a4e2 -//.word 0xd6a42ce7 -//.word 0x2ea6496c -//.word 0x4f6f9f90 -//.word 0xad3ccf87 -//.word 0x7afc53ed -//.word 0xb44ca959 -//.word 0x62a5b336 -//.word 0x1bd45ece -//.word 0xc7ab82a8 -//.word 0xaaf70914 -//.word 0x9eb25404 -//.word 0x9f79da1d -//.word 0x8d40120e -//.word 0x2e449421 -//.word 0x73417b0f -//.word 0xfce50d19 -//.word 0xdd859e54 -//.word 0xa310b145 -//.word 0x924161ad -//.word 0x3118ffa6 -//.word 0x098afdef -//.word 0xa9780a85 -//.word 0xedde7f73 -//.word 0x804dfaea -//.word 0xa09b4894 -//.word 0x21d98926 -//.word 0xb5858e35 -//.word 0x6a01864a -//.word 0x7444da38 -//.word 0x2dd055ad -//.word 0x5ae38808 -//.word 0xb0f26d6a -//.word 0x97534a10 -//.word 0x2d3ad8e0 -//.word 0x8ee6a541 -//.word 0x531cb730 -//.word 0x58d57291 -//.word 0xc334bcc2 -//.word 0x41ba5e76 -//.word 0x93bdadc1 -//.word 0x4a166b6f -//.word 0xce1be89a -//.word 0xa5cd6c7c -//.word 0xf252d981 -//.word 0x3ca58da0 -//.word 0x718c86ec -//.word 0x2bcac966 -//.word 0x31960416 -//.word 0x414d725a -//.word 0x0d64ff7d -//.word 0x83a0ad8b -//.word 0x51893664 -//.word 0xa91cf310 -//.word 0x41c0fc52 -//.word 0x9f7b9180 -//.word 0x9366b891 -//.word 0x055e2878 -//.word 0xf0fd66b1 -//.word 0xafc82e19 -//.word 0x78aa1402 -//.word 0x26a26b87 -//.word 0x3bb8661d -//.word 0x25357d6b -//.word 0xc013125c -//.word 0x1db35572 -//.word 0x82ce655d -//.word 0xb1aeb8cc -//.word 0x6d9ebc83 -//.word 0x3b9fbead -//.word 0x665c0c74 -//.word 0x456056d0 -//.word 0xc0875a9c -//.word 0x11b2c1ef -//.word 0xc8bf43a9 -//.word 0x12b9124c -//.word 0x3a4b760e -//.word 0x707bb42c -//.word 0xca953580 -//.word 0x8864e456 -//.word 0x9ca8d87c -//.word 0x6ac53398 -//.word 0xccb94abe -//.word 0x59500642 -//.word 0xe79b8acb -//.word 0x4e9e15a9 -//.word 0x6f492a69 -//.word 0x75aaefa6 -//.word 0x5b60d422 -//.word 0xaf537415 -//.word 0x95a2c0c4 -//.word 0x0edd5a56 -//.word 0x7a753fe3 -//.word 0x5c70a9cf -//.word 0x5e613456 -//.word 0x95983f67 -//.word 0x059695b6 -//.word 0x68c44d0d -//.word 0x2b64eee2 -//.word 0xbac7d72f -//.word 0xfdc0de7e -//.word 0x225a3843 -//.word 0x9ec6996f -//.word 0x6e979b42 -//.word 0xa3326461 -//.word 0x1d7f8328 -//.word 0x97e51c41 -//.word 0xe4764576 -//.word 0x7766afc3 -//.word 0x29c289b0 -//.word 0x375ea1de -//.word 0x8a10cddf -//.word 0x3c1b894a -//.word 0x57eee10f -//.word 0xe00f9209 -//.word 0x14526cd2 -//.word 0xf14efadb -//.word 0xf81165bc -//.word 0x321396c8 -//.word 0x71699be5 -//.word 0xd83b4c9b -//.word 0x9d782e6a -//.word 0x0ec89761 -//.word 0xd2c313ec -//.word 0x726007ee -//.word 0x18b0940f -//.word 0x96ccbe58 -//.word 0xa90ccefd -//.word 0x7f79f479 -//.word 0x788531e0 -//.word 0x2afa7471 -//.word 0xa731046b -//.word 0x02841d23 -//.word 0x0f05de52 -//.word 0x6b7163b3 -//.word 0xbc5f2ece -//.word 0x3abdcb0e -//.word 0x6f7db31a -//.word 0x3a8c7262 -//.word 0x1a0405f8 -//.word 0xa9a286a2 -//.word 0x677a0b2d -//.word 0xb9e9cb04 -//.word 0x32cc8201 -//.word 0x10ef1782 -//.word 0x0ac97cc0 -//.word 0x4966d75c -//.word 0xb4a4df3b -//.word 0x70a28894 -//.word 0xa776e247 -//.word 0x891e3e71 -//.word 0x91b9943d -//.word 0x0af821fd -//.word 0xd1cf5479 -//.word 0x5c70eb86 -//.word 0xfb795adb -//.word 0x5e6c6c21 -//.word 0x58612c49 -//.word 0xe2f70622 -//.word 0x63902a2b -//.word 0x2fbe31a6 -//.word 0x4df803ed -//.word 0x7d92f809 -//.word 0x79ec3d81 -//.word 0x7ce97a70 -//.word 0x01a2b1da -//.word 0xcd5c6a40 -//.word 0x2fb80d72 -//.word 0x872a8fa5 -//.word 0x05ac50c5 -//.word 0xb3b4440d -//.word 0xb66352d4 -//.word 0xd1fff9aa -//.word 0x2aa339a3 -//.word 0x5135b1f3 -//.word 0x7e9905bb -//.word 0x1a248223 -//.word 0x815405a9 -//.word 0x07be18b9 -//.word 0x39475f7d -//.word 0x659733f6 -//.word 0x5ccb8c4c -//.word 0x766a2462 -//.word 0xd79bd9ae -//.word 0xf1955348 -//.word 0x4a56e840 -//.word 0x7f98bc35 -//.word 0x8a012d23 -//.word 0x409a6e7d -//.word 0x1d82717c -//.word 0x44e40bb6 -//.word 0xc22653f2 -//.word 0x13634b3b -//.word 0xe71cc233 -//.word 0x262a78aa -//.word 0x31f7846f -//.word 0x6beef366 -//.word 0xf830b2db -//.word 0xc489ae16 -//.word 0xc7a23930 -//.word 0x8878b025 -//.word 0xe00c5a29 -//.word 0x015d9440 -//.word 0xb6932b09 -//.word 0xed7d0ada -//.word 0x723d1512 -//.word 0xfd4254ab -//.word 0x6f77540f -//.word 0x59baca2d -//.word 0xbe907acb -//.word 0x1a17571e -//.word 0xa23cec98 -//.word 0xce2dfa01 -//.word 0x151263c9 -//.word 0xf7f8469d -//.word 0x410d6c38 -//.word 0x8d13e37c -//.word 0x080fe8c1 -//.word 0x78410b6d -//.word 0x7d598dc4 -//.word 0x16e80d02 -//.word 0x681563a7 -//.word 0xbb91cd13 -//.word 0xc6cd4952 -//.word 0x2c6a4139 -//.word 0x46f16db2 -//.word 0x23c4f654 -//.word 0xcd54d737 -//.word 0xce958906 -//.word 0xf3afdf55 -//.word 0x50f72f35 -//.word 0x841db206 -//.word 0x3fa62d8d -//.word 0x019dd147 -//.word 0x248660fc -//.word 0x1c949296 -//.word 0xfe1cb734 -//.word 0x3f489d7b -//.word 0xbe10b42c -//.word 0x056670fc -//.word 0xccb1efa0 -//.word 0xbf7ddc27 -//.word 0x8271938c -//.word 0xf181868c -//.word 0xac65dfb5 -//.word 0xd34967c0 -//.word 0x0ec6a620 -//.word 0xd1114cdb -//.word 0xde72cf99 -//.word 0x0bf856fa -//.word 0x456cd62d -//.word 0xd5837abf -//.word 0xe25749b0 -//.word 0x371803cc -//.word 0x47ff4b38 -//.word 0x6e840b4c -//.word 0x7ad115a0 -//.word 0x6a76066a -//.word 0x765e7007 -//.word 0x4f0238d7 -//.word 0xa7dc3c4e -//.word 0xf41f3948 -//.word 0x71a5ed9d -//.word 0x662978f6 -//.word 0xaab608df -//.word 0x665fb51d -//.word 0x1b31aa41 -//.word 0xe766867d -//.word 0x04db02b7 -//.word 0x91c5d3dc -//.word 0x959fd277 -//.word 0x41675a82 -//.word 0x7509f17b -//.word 0x861c2bbb -//.word 0x3fcccc04 -//.word 0x25172d59 -//.word 0xff3de112 -//.word 0x9671972f -//.word 0xbad542ed -//.word 0x85a57897 -//.word 0xe4b2189f -//.word 0x521330ed -//.word 0xe7171e77 -//.word 0x927ef512 -//.word 0xa3e82287 -//.word 0x8c8d4fea -//.word 0xe82f8727 -//.word 0xbc4d9bde -//.word 0xfd9ac571 -//.word 0x53ad8c5b -//.word 0x1dfae7c3 -//.word 0xb501a550 -//.word 0xf5c50c40 -//.word 0xfa80c1b4 -//.word 0x2795e84e -//.word 0x6dc68bfe -//.word 0xcaa74019 -//.word 0x105206ac -//.word 0xe85d710f -//.word 0x160907bd -//.word 0xffbce962 -//.word 0x68b2b636 -//.word 0x80efac8a -//.word 0x217810a0 -//.word 0x53c2d0c0 -//.word 0x126b6888 -//.word 0x51280284 -//.word 0x3effe1ff -//.word 0xc8b6ff18 -//.word 0x5e8bf518 -//.word 0xfa251c02 -//.word 0x5fcbf26c -//.word 0x9fd4bf8e -//.word 0xdf5e7899 -//.word 0x5e43e34a -//.word 0xb449fcbe -//.word 0x58999888 -//.word 0x65734801 -//.word 0x9e1f80df -//.word 0xaf27f809 -//.word 0xb6c353aa -//.word 0x0195ff84 -//.word 0x19965c88 -//.word 0x005120a3 -//.word 0xb84ffada -//.word 0x04d27599 -//.word 0x73c62048 -//.word 0x99f4ec20 -//.word 0xa079d53d -//.word 0x0076c4f4 -//.word 0x8a0ab466 -//.word 0xab7d1455 -//.word 0xefbe6d37 -//.word 0xc4104589 -//.word 0x81004366 -//.word 0xa69a9458 -//.word 0x65dc8c6e -//.word 0x626b918f -//.word 0xb885350d -//.word 0x3c37a27d -//.word 0x05d03bc7 -//.word 0x2c958079 -//.word 0xd0b63261 -//.word 0x5d81b85a -//.word 0x0ed6c266 -//.word 0xb1db2cfd -//.word 0xabf025a5 -//.word 0x3be690c3 -//.word 0x036baab1 -//.word 0xc4c9ee10 -//.word 0x69d13660 -//.word 0x471122ce -//.word 0xa34ebd4c -//.word 0x742e5ee7 -//.word 0x6b34cd55 -//.word 0x31f1a7ce -//.word 0xf079041e -//.word 0x141556f7 -//.word 0x5337958b -//.word 0xeab3995a -//.word 0x2a2bc749 -//.word 0x34cbeff5 -//.word 0x01377546 -//.word 0xa5c2af47 -//.word 0xd4e18f35 -//.word 0xa5df82d6 -//.word 0x96d2970b -//.word 0xd0cde4a9 -//.word 0xad572685 -//.word 0x781ca7ce -//.word 0x74e365a0 -//.word 0x1fc070d5 -//.word 0xb78b941f -//.word 0xfe903854 -//.word 0x3b888608 -//.word 0x81c9cc61 -//.word 0x33b92227 -//.word 0xc8884e1b -//.word 0xcc1fe48a -//.word 0x2753b221 -//.word 0xa25f5a03 -//.word 0xa7914119 -//.word 0x4843a8a9 -//.word 0x840d192b -//.word 0xc5390558 -//.word 0xac77ab83 -//.word 0x11d23b2c -//.word 0x46e33cd3 -//.word 0x9c452b0a -//.word 0x294965ce -//.word 0xc8ea4717 -//.word 0x600393ae -//.word 0x6abf153f -//.word 0xad5187af -//.word 0x4ce6b3af -//.word 0x03d8d792 -//.word 0xae254d5b -//.word 0x0b1f6b1b -//.word 0xc065a97a -//.word 0xa0110193 -//.word 0x2a339c05 -//.word 0x527faa46 -//.word 0x8542923b -//.word 0xe79b4b06 -//.word 0xdfe70920 -//.word 0xd57d1da7 -//.word 0x3a9c16f9 -//.word 0xc9a12d81 -//.word 0x0d7de0d1 -//.word 0x2467dcf1 -//.word 0xc2ce20f7 -//.word 0x799260d8 -//.word 0x3773a77e -//.word 0x10ca411b -//.word 0x3d77d8bc -//.word 0x651add21 -//.word 0x1c862acc -//.word 0xaa72e558 -//.word 0x0d72a70c -//.word 0x4126ddb0 -//.word 0xbeb16f9f -//.word 0x436da01e -//.word 0xd2de36ec -//.word 0xfbe4da1b -//.word 0x5e34c11d -//.word 0x6c088c22 -//.word 0x6d166da2 -//.word 0xc7bf8c35 -//.word 0x7d8aa9ab -//.word 0xf6d00259 -//.word 0x00b977b1 -//.word 0x1467ec16 -//.word 0xdc70efee -//.word 0xf2929af8 -//.word 0xeba2bbdf -//.word 0x94c63310 -//.word 0x7be49cc9 -//.word 0xb15a2f73 -//.word 0xcff0e432 -//.word 0x370adaba -//.word 0x9c23fa64 -//.word 0xc576d881 -//.word 0x8dfed9ee -//.word 0x2fa19be9 -//.word 0xc0a99122 -//.word 0xfd73ee15 -//.word 0x476bc598 -//.word 0xec386eb0 -//.word 0xa8332ba9 -//.word 0x6c1e0b66 -//.word 0x5d130ff5 -//.word 0x20ba8c66 -//.word 0x55bfd0de -//.word 0x618308e7 -//.word 0x7112620a -//.word 0xbc566ea0 -//.word 0x088acae5 -//.word 0x6ff0fe4e -//.word 0x63c7a51d -//.word 0xf078ce32 -//.word 0x4110a124 -//.word 0x66f24690 -//.word 0x54ce02b1 -//.word 0x2dcda331 -//.word 0xc20e1f3f -//.word 0x575678e2 -//.word 0xa603e28d -//.word 0x264228f3 -//.word 0x8c824c1c -//.word 0x92296eb9 -//.word 0xf885eeb5 -//.word 0xc905d50c -//.word 0xe0a971e0 -//.word 0xaab740ca -//.word 0x2eb0106e -//.word 0x4a826352 -//.word 0x3fff18f0 -//.word 0x708e4809 -//.word 0x66206f3d -//.word 0x1866ccd9 -//.word 0x69420af0 -//.word 0xf37b1fad -//.word 0x03b475e7 -//.word 0xe49f47f6 -//.word 0x616e4fc5 -//.word 0x858a9e29 -//.word 0xa588cb71 -//.word 0xa1594f3f -//.word 0x66c03096 -//.word 0xb709dd33 -//.word 0x2ef95921 -//.word 0x7d019c88 -//.word 0xfab637c6 -//.word 0x5b8636c0 -//.word 0xbda34a7a -//.word 0xec4428e6 -//.word 0xde0d2cfa -//.word 0x80cb4205 -//.word 0xb6650643 -//.word 0x9c102aaf -//.word 0x13c11818 -//.word 0x79e8d977 -//.word 0xb75b3680 -//.word 0x81901d77 -//.word 0xd9104645 -//.word 0xd52815cb -//.word 0xa3e2c376 -//.word 0xca34b914 -//.word 0xb2763ce6 -//.word 0x67194ff6 -//.word 0x9a97d5aa -//.word 0xe9a6f79a -//.word 0x60b1c59f -//.word 0x3f88202c -//.word 0xfd57d7e2 -//.word 0x8ed5105e -//.word 0xe2bdea56 -//.word 0xae8260e4 -//.word 0x6e3f7121 -//.word 0xabec7df6 -//.word 0x79d8f32f -//.word 0x455329d1 -//.word 0xcdab8bae -//.word 0x705bf836 -//.word 0xa87e6990 -//.word 0xd58ad4ea -//.word 0x3c3a500d -//.word 0x4fcc7934 -//.word 0x2f6d161e -//.word 0x6ff2f962 -//.word 0x1bc82703 -//.word 0xf82e3944 -//.word 0x0ea102bd -//.word 0x649872af -//.word 0x0b72ba95 -//.word 0x5dadb1fb -//.word 0x87587793 -//.word 0x45cb5886 -//.word 0xed95f308 -//.word 0xafb69b2f -//.word 0x1b0ffd05 -//.word 0xe31603dc -//.word 0xe3cef9e1 -//.word 0x5ef7eff4 -//.word 0x8b815eb7 -//.word 0x50470ee5 -//.word 0x4dfa36e6 -//.word 0x1c5be6a0 -//.word 0xd7aea28f -//.word 0xdb6b4f18 -//.word 0xcc36541a -//.word 0xda11f9c7 -//.word 0x42d112b2 -//.word 0x17cee228 -//.word 0x42df3ac4 -//.word 0xc886e13e -//.word 0x4b673884 -//.word 0xd4ff1e0c -//.word 0xcf921268 -//.word 0x5765971b -//.word 0xb42eddab -//.word 0x22c99df7 -//.word 0xd42c45cb -//.word 0x399d55b2 -//.word 0x7e23090b -//.word 0x543a385f -//.word 0xf3ca7cf2 -//.word 0x5f5a9398 -//.word 0xea8105ca -//.word 0xfa9e07f9 -//.word 0x0cc9a022 -//.word 0xf90a0aa3 -//.word 0x78c85b4d -//.word 0xe58465ba -//.word 0x41c7dae1 -//.word 0x7958b4e7 -//.word 0xebb3d339 -//.word 0x26b7e8d7 -//.word 0xf19f93f3 -//.word 0x9033c8ba -//.word 0x423f7772 -//.word 0x0e456cc5 -//.word 0xbf6f745c -//.word 0x2ec7c1b0 -//.word 0xbfaa8f1d -//.word 0x2e7a0839 -//.word 0x8c946563 -//.word 0x8482579f -//.word 0xe371a5a1 -//.word 0x58e51627 -//.word 0x77ab918c -//.word 0x0410839a -//.word 0x6f5081a1 -//.word 0x9b512fc5 -//.word 0xe391609c -//.word 0x5f5d7ef9 -//.word 0x63452d02 -//.word 0x49cc2b89 -//.word 0x71647a99 -//.word 0x8599c24e -//.word 0x028cf1ea -//.word 0xf4a32426 -//.word 0x017fcac6 -//.word 0xa82e0670 -//.word 0xcba256be -//.word 0x6b627392 -//.word 0xb48078aa -//.word 0x39cb4574 -//.word 0x80452623 -//.word 0xc1d8b002 -//.word 0xeb44ec08 -//.word 0xe85cb8ad -//.word 0x227269fd -//.word 0x4610b5eb -//.word 0x48e9d1e7 -//.word 0xa70ed6b3 -//.word 0xf2656972 -//.word 0x8b589b02 -//.word 0xabca0e8b -//.word 0xa64f5a58 -//.word 0x709caee6 -//.word 0x603cbb3b -//.word 0x3585cd79 -//.word 0x57cb3bb3 -//.word 0x5fd302ff -//.word 0xd88aadcd -//.word 0x47f77877 -//.word 0x6a6fb419 -//.word 0xbe086da2 -//.word 0x43504b2b -//.word 0x833eb688 -//.word 0xd1683d1d -//.word 0xcf7739f3 -//.word 0x33d8ad0c -//.word 0xcab571f3 -//.word 0xbd249096 -//.word 0x139eee58 -//.word 0x77b22e63 -//.word 0x3bfad23b -//.word 0x9e4fa499 -//.word 0x4a395576 -//.word 0x21a96566 -//.word 0x39eb4227 -//.word 0x25d6b47a -//.word 0x77467831 -//.word 0x82cc2c8a -//.word 0x65a36bbb -//.word 0x45e638ce -//.word 0xd901a0af -//.word 0x2c669b84 -//.word 0x9e81343c -//.word 0x2cede96b -//.word 0xf2e85555 -//.word 0xee040c48 -//.word 0x0720c730 -//.word 0x4e97c165 -//.word 0x83b760c7 -//.word 0xdb75180d -//.word 0x005e8d5a -//.word 0x5ad1f711 -//.word 0x8d6ccbeb -//.word 0x43c49847 -//.word 0x2b592ec1 -//.word 0x42c90605 -//.word 0x5143dee6 -//.word 0xb63fa4aa -//.word 0x686c95a8 -//.word 0x36eaa616 -//.word 0x4fba231c -//.word 0x0773962c -//.word 0xd836ea96 -//.word 0xa7e3d057 -//.word 0x498d6232 -//.word 0x462c0603 -//.word 0xdd92964f -//.word 0x48a1be1f -//.word 0x41baa50f -//.word 0xc478cfa2 -//.word 0x179f42d8 -//.word 0x084fe703 -//.word 0x767e34d6 -//.word 0x12a508bf -//.word 0x67b8d677 -//.word 0x185c06d7 -//.word 0x695598ed -//.word 0x013d0b4f -//.word 0xef7c7daf -//.word 0xea7413b0 -//.word 0xddfc9bf8 -//.word 0xa3107086 -//.word 0x0ec69e46 -//.word 0x2f8447e3 -//.word 0xd17146dd -//.word 0x472911db -//.word 0x68b5e442 -//.word 0xd7ba1c06 -//.word 0x88f0e1c1 -//.word 0x7fd60702 -//.word 0xdba536e7 -//.word 0x148249ee -//.word 0x81f7f508 -//.word 0x1da4abef -//.word 0x8a32bfba -//.word 0x5689c9af -//.word 0x7e434c58 -//.word 0x306095d9 -//.word 0xd53be680 -//.word 0x4fbcd49e -//.word 0x7fd0ee95 -//.word 0x0b169f33 -//.word 0x5edc563e -//.word 0xf049e350 -//.word 0xc7db25e5 -//.word 0x3e15e2b3 -//.word 0x0571f63a -//.word 0x699cb09b -//.word 0xd5e279ad -//.word 0x99e7b64e -//.word 0xeb99f0f7 -//.word 0x2b623294 -//.word 0x6ca2b392 -//.word 0x2f5cb539 -//.word 0x7130ad3c -//.word 0xe989a48e -//.word 0x8b17dd78 -//.word 0x5080b8e9 -//.word 0x3952d60d -//.word 0x923d7e20 -//.word 0x747f4085 -//.word 0x8d9fd812 -//.word 0x235e55af -//.word 0x57eb7a1f -//.word 0xa756641d -//.word 0xb7476dab -//.word 0x51f051a7 -//.word 0xaa408f9f -//.word 0xe75912e6 -//.word 0xdf4511e7 -//.word 0x23e434ba -//.word 0x3c29f8f5 -//.word 0x338654c5 -//.word 0x57a59d3d -//.word 0x3a59a7ed -//.word 0xfdd42db7 -//.word 0xcd1a72de -//.word 0xaeb62960 -//.word 0x77ab9286 -//.word 0x1eade7b9 -//.word 0x3691f697 -//.word 0xb6030f46 -//.word 0xfc772008 -//.word 0x12621f10 -//.word 0x2fa9a895 -//.word 0x8159e824 -//.word 0x299ab93a -//.word 0x88de0e12 -//.word 0xb95e92bc -//.word 0x5ec78c6f -//.word 0xa0300620 -//.word 0x71502e53 -//.word 0x14eefc32 -//.word 0xe09815dc -//.word 0x4198f0ff -//.word 0xff2437a9 -//.word 0xc3d5705b -//.word 0xd75bdc60 -//.word 0x2d6e9f5c -//.word 0xa3072228 -//.word 0x85d1b6dd -//.word 0x53da7a2f -//.word 0xc58f7efd -//.word 0x0de72825 -//.word 0x5cded79d -//.word 0xa725c7c0 -//.word 0xab1835e5 -//.word 0x2ff0c336 -//.word 0x893a1dc0 -//.word 0x6388ddc6 -//.word 0xbf66ac5b -//.word 0x398faa30 -//.word 0x8c6111aa -//.word 0x588f1537 -//.word 0x23160ee3 -//.word 0x9d72d826 -//.word 0x28117a00 -//.word 0x97080748 -//.word 0x3605c242 -//.word 0x0b84856f -//.word 0x5c4664a9 -//.word 0x72ff8d6f -//.word 0x9c50727d -//.word 0x76f42b9f -//.word 0x6a3e15c8 -//.word 0x78c3c05e -//.word 0x335408d9 -//.word 0x0c2f818c -//.word 0xd37519c2 -//.word 0x7bdff80d -//.word 0x1eadabdb -//.word 0x40e0824a -//.word 0x58a9363e -//.word 0x8d21cfb0 -//.word 0xbd3ac549 -//.word 0xc3f6662f -//.word 0xfad7771f -//.word 0xfd961ebc -//.word 0xb1180026 -//.word 0x869da6cf -//.word 0xf93b258a -//.word 0x5e8bfee5 -//.word 0xdca243b9 -//.word 0xb942fbff -//.word 0xd752c8e5 -//.word 0x7f8cc722 -//.word 0x5e76b886 -//.word 0xcd935fd5 -//.word 0x56da29d5 -//.word 0x736713a6 -//.word 0x9871c852 -//.word 0x747c09a5 -//.word 0x75cf523f -//.word 0x8a29bbe7 -//.word 0x2cb01c22 -//.word 0x9f2a7404 -//.word 0x756f8c47 -//.word 0x551ed79a -//.word 0xfa909d3b -//.word 0x7e0a58c8 -//.word 0xd9375f53 -//.word 0xa5d5c1b4 -//.word 0x24ae7423 -//.word 0x83caaf06 -//.word 0x60e39407 -//.word 0x8b19126a -//.word 0x09e70a9d -//.word 0x5f56b011 -//.word 0x0d703549 -//.word 0x58f8a331 -//.word 0x4c5808b0 -//.word 0x02dbd680 -//.word 0x1f1c8a3e -//.word 0x9dbf8cbd -//.word 0xce5e56a0 -//.word 0x9dc6d928 -//.word 0x18641c4a -//.word 0x2bfa2705 -//.word 0xae961ff2 -//.word 0xa3c5b21d -//.word 0xb804b613 -//.word 0x14770c3c -//.word 0x4fdecb6b -//.word 0xc2c49ab4 -//.word 0x02f95e7e -//.word 0xa74316d8 -//.word 0x52510211 -//.word 0xeef00b82 -//.word 0x35825faf -//.word 0x76ab5c8f -//.word 0x964daf27 -//.word 0x56b7bd5e -//.word 0xd319420c -//.word 0x533b3754 -//.word 0x3e6ffa34 -//.word 0x6bc5a95a -//.word 0x9d7dce39 -//.word 0x4ec2425d -//.word 0xab954bfb -//.word 0xdf0708cd -//.word 0x94ab0f1c -//.word 0xb74b541f -//.word 0x7cda4d83 -//.word 0xa3aa534b -//.word 0xf9df4cda -//.word 0x2124874e -//.word 0x949ce710 -//.word 0xe71b44a9 -//.word 0x4d970ed8 -//.word 0x5cd933e1 -//.word 0x14784327 -//.word 0x1d08d3fd -//.word 0x508f1fba -//.word 0x7938f30b -//.word 0x5b4ccb8e -//.word 0xf55d399c -//.word 0x04c58766 -//.word 0xc94f9d43 -//.word 0x0c332648 -//.word 0x6148ef1a -//.word 0xaa758f00 -//.word 0xdd684d3c -//.word 0x088b3e9c -//.word 0x9234ae4c -//.word 0xc31dc1ee -//.word 0x86135aec -//.word 0x6ef23c0d -//.word 0xf8d07047 -//.word 0x1079e6d5 -//.word 0xd61c5f89 -//.word 0xa1438962 -//.word 0x44086c61 -//.word 0x91860699 -//.word 0x1c8f3286 -//.word 0x429dcf9f -//.word 0x690a1d2e -//.word 0x88836a60 -//.word 0xebbaef98 -//.word 0x305bf509 -//.word 0x96423c84 -//.word 0x77eb9c8e -//.word 0x1229edb6 -//.word 0x8e1b2526 -//.word 0x3c5cc077 -//.word 0x1d7b65ca -//.word 0xa4abc614 -//.word 0xbcbbc8b9 -//.word 0x0d48e45d -//.word 0x7b31ccf6 -//.word 0xf04b5226 -//.word 0x5c5686c9 -//.word 0xfa301fca -//.word 0xd4491d3a -//.word 0x8957aca3 -//.word 0x4e4b4a99 -//.word 0x33832c93 -//.word 0xa841def9 -//.word 0x3f5c2b7e -//.word 0xb3353cb0 -//.word 0x2aed04cd -//.word 0xb7d5dbd9 -//.word 0x232668ed -//.word 0xedf3c5d2 -//.word 0x8f5bdecf -//.word 0x03031abe -//.word 0x86c43e65 -//.word 0x9ca08e04 -//.word 0x54fb352b -//.word 0xcd07e6ce -//.word 0xf981c49b -//.word 0xa19b7f8b -//.word 0xa939c0b8 -//.word 0x965fc86e -//.word 0x4dea5484 -//.word 0x1d7fc3ed -//.word 0x00c27a8a -//.word 0x1ec88842 -//.word 0x93ce8655 -//.word 0x722bc1ed -//.word 0x0a839cf7 -//.word 0x683e2f30 -//.word 0x1d383483 -//.word 0x41ba2492 -//.word 0xb7aa9d93 -//.word 0xb3fe075d -//.word 0x7a7677c2 -//.word 0x698bd320 -//.word 0x39a33833 -//.word 0x8186982d -//.word 0x7c15a809 -//.word 0x0d3af91c -//.word 0x001b64ed -//.word 0x9393ac46 -//.word 0x35e25f8b -//.word 0x8da3fd4b -//.word 0xbeff5c15 -//.word 0xea214b8d -//.word 0xf5e976be -//.word 0x8be58ab2 -//.word 0x647d9940 -//.word 0xc66dbf26 -//.word 0x4c790658 -//.word 0xe75b8797 -//.word 0x2201d244 -//.word 0xaaf59077 -//.word 0x0d1d674c -//.word 0xc2a41e7d -//.word 0x6a380236 -//.word 0x55768824 -//.word 0x48a233d0 -//.word 0x7d9cb82b -//.word 0xec0f6169 -//.word 0xc9ecaf13 -//.word 0x4e174358 -//.word 0xba60fea5 -//.word 0x9ab46875 -//.word 0x47944e69 -//.word 0xb0c7b09b -//.word 0x594cda30 -//.word 0xa493d02c -//.word 0x50edef8a -//.word 0x3f40d28d -//.word 0x7cff7351 -//.word 0x7c5992a5 -//.word 0xa4b15b1d -//.word 0x0c4f4362 -//.word 0x835533cd -//.word 0xd3f4e834 -//.word 0x46df9a04 -//.word 0x6800db90 -//.word 0x0f6bc3a9 -//.word 0x99904a6f -//.word 0x75b4f566 -//.word 0xe5a2b5cd -//.word 0x019d0c2b -//.word 0x009a712a -//.word 0xb3acf6a8 -//.word 0x52c0280c -//.word 0x7b8a36d6 -//.word 0x78bf567b -//.word 0xc185656f -//.word 0xc128cd83 -//.word 0xdd0eac71 -//.word 0xb3ed33b5 -//.word 0x9f3b4c9f -//.word 0x84e67fa7 -//.word 0xc9461600 -//.word 0xa1507f70 -//.word 0x900cf35e -//.word 0x2b49552d -//.word 0x1f8f5dc8 -//.word 0x7455f57e -//.word 0x1374e311 -//.word 0x86dca909 -//.word 0x0085a94e -//.word 0x9da98df6 -//.word 0xea31e65c -//.word 0xa86d1372 -//.word 0xcd076558 -//.word 0xcc3a812d -//.word 0x163f0525 -//.word 0xe1086edb -//.word 0x283139e9 -//.word 0xf33448b7 -//.word 0xd8dc8890 -//.word 0xc2fcd1fb -//.word 0xf1600d48 -//.word 0x42049d69 -//.word 0xb184f803 -//.word 0x1cd495c5 -//.word 0x4a310cf9 -//.word 0x2b577858 -//.word 0x61f51f23 -//.word 0x005e556f -//.word 0x92819dc1 -//.word 0x5f1b12da -//.word 0xeb2b05d4 -//.word 0xbfa7e86e -//.word 0x6c6d6aa5 -//.word 0xce7ce484 -//.word 0x8e64f43c -//.word 0xeafb6777 -//.word 0xb9525dea -//.word 0xa9e7a729 -//.word 0xcc1c74c0 -//.word 0x53e82d7f -//.word 0x99cd9d15 -//.word 0x630a55e1 -//.word 0x66114f04 -//.word 0x093bd1bb -//.word 0x6dbb94ec -//.word 0xaad126fe -//.word 0x5c408dee -//.word 0x5f012d9f -//.word 0xd639ec72 -//.word 0x72699317 -//.word 0xf1e477a3 -//.word 0xe4875ae2 -//.word 0xb6a48cee -//.word 0xea3f5500 -//.word 0xa47d9887 -//.word 0x6b59b077 -//.word 0x2d999ee4 -//.word 0x830066cf -//.word 0x37c6b640 -//.word 0x0445c995 -//.word 0x9cf58b19 -//.word 0xf09afed8 -//.word 0xabbcdcb2 -//.word 0xff587eaf -//.word 0xa5d5fc92 -//.word 0x1f3996b1 -//.word 0x419d5203 -//.word 0xefdfe77b -//.word 0x2896da94 -//.word 0x444be72e -//.word 0x79e6a298 -//.word 0xa4665eee -//.word 0x46d54ea5 -//.word 0xcd7bea64 -//.word 0x16539415 -//.word 0x2fbb7c3d -//.word 0x616fc188 -//.word 0x6eb8d9a9 -//.word 0x17e13260 -//.word 0xe1eb19dc -//.word 0x1982dc44 -//.word 0x162f2b91 -//.word 0xbecec49e -//.word 0x4c435082 -//.word 0x5069871d -//.word 0xf64b9bf1 -//.word 0x8c97d433 -//.word 0x3f4f7722 -//.word 0x25c2ed98 -//.word 0x81bb21df -//.word 0x42f82ac5 -//.word 0xccdd2af3 -//.word 0xfb6a767a -//.word 0x656bf7af -//.word 0xe0eed039 -//.word 0x45fa4068 -//.word 0x737ecac9 -//.word 0x968894f7 -//.word 0xa9b70eb3 -//.word 0x39f3d337 -//.word 0x6c5bd4c8 -//.word 0x437fb38b -//.word 0x1cd06d99 -//.word 0x7b553c55 -//.word 0x099fbcfe -//.word 0xddfe4c80 -//.word 0xfbf5b790 -//.word 0x1aec14f7 -//.word 0xab25ea2e -//.word 0x16f1982c -//.word 0x4724f47c -//.word 0x69c63392 -//.word 0xf10b095f -//.word 0xdf851023 -//.word 0x40996e83 -//.word 0xf830b3db -//.word 0xbeae00d5 -//.word 0x68286e3b -//.word 0x69d2ad09 -//.word 0x98b6ecc7 -//.word 0x33acf915 -//.word 0x2386aa88 -//.word 0x818b7bb4 -//.word 0x5a27788a -//.word 0xafe05ee5 -//.word 0xc08cfd5f -//.word 0x8bc1e069 -//.word 0x8f8e309b -//.word 0xd568d648 -//.word 0x3167e056 -//.word 0xc6b3264c -//.word 0xc8392dad -//.word 0x86a24b85 -//.word 0xa7850c41 -//.word 0xb3dbd5c3 -//.word 0xd6b4c7b6 -//.word 0xe129e61f -//.word 0x92927b35 -//.word 0x15f9b773 -//.word 0xcace98eb -//.word 0x49db11dd -//.word 0xa47b6588 -//.word 0xec07d440 -//.word 0xf69279c1 -//.word 0x5ed673c3 -//.word 0xcd6d43cf -//.word 0x78457550 -//.word 0xe94e83ed -//.word 0x0275f616 -//.word 0x3fd6cedd -//.word 0x3b2d2408 -//.word 0x768e0e64 -//.word 0x5557c35c -//.word 0x6a62ffc9 -//.word 0xf67fa90c -//.word 0xac21b45b -//.word 0xb8574358 -//.word 0x00fe10e8 -//.word 0xaa360e42 -//.word 0xde124d46 -//.word 0xcd941e11 -//.word 0xf2d879ce -//.word 0x978f9bce -//.word 0x9caff3dc -//.word 0x74693fca -//.word 0x705cf350 -//.word 0x4008da17 -//.word 0xb785ff10 -//.word 0xce74ce0a -//.word 0xec377784 -//.word 0x645d93bf -//.word 0x3f600a18 -//.word 0x3d933495 -//.word 0x16563ebe -//.word 0x058cd0ae -//.word 0x874fec69 -//.word 0x61e21a70 -//.word 0xe0e6c293 -//.word 0x64d1d907 -//.word 0x209dbfb8 -//.word 0x1bbd68e0 -//.word 0x7a55bbd9 -//.word 0x02aa3730 -//.word 0xd9d8dcfa -//.word 0x8cc3496b -//.word 0x564f22a4 -//.word 0xa0d4b4cd -//.word 0xc4ccdc64 -//.word 0x16cf24d4 -//.word 0x25c2304a -//.word 0x3e4b59c4 -//.word 0x3287976b -//.word 0x5900a422 -//.word 0xd7d95e5f -//.word 0x1e4c6e39 -//.word 0xb55727c3 -//.word 0x37b1b099 -//.word 0x9e0366b8 -//.word 0xc1557c93 -//.word 0x1cc6e463 -//.word 0xd08173be -//.word 0xeaec406b -//.word 0xe8234d75 -//.word 0x7aa4697e -//.word 0x854c5456 -//.word 0x6d8225cc -//.word 0x94b2e9c4 -//.word 0x1efd8d8a -//.word 0xf82efe66 -//.word 0x18f08e71 -//.word 0x063f9aa6 -//.word 0x9b1d693c -//.word 0x08865834 -//.word 0x1ba5342e -//.word 0xbe48e880 -//.word 0xc1925889 -//.word 0xd9ef8c43 -//.word 0xe84d1118 -//.word 0x7e8a9cf7 -//.word 0xa028f1a6 -//.word 0xc948035a -//.word 0x2fd65d85 -//.word 0x4701c0ef -//.word 0x8bee0e08 -//.word 0x7bad667d -//.word 0xe26c9109 -//.word 0x5aea9d8e -//.word 0x122fc764 -//.word 0xcf7b9ff0 -//.word 0x317c6679 -//.word 0x38c3bb38 -//.word 0x067977ae -//.word 0xe74ed53b -//.word 0x8eb3d6eb -//.word 0xa249e393 -//.word 0x7999b41d -//.word 0x23057220 -//.word 0xaafe18b4 -//.word 0x98781f84 -//.word 0xba9b5a24 -//.word 0x24bc1fa5 -//.word 0x758ba767 -//.word 0x5c8eb72f -//.word 0x5bce8079 -//.word 0xcbd0c510 -//.word 0x21c63bdb -//.word 0x6f0735fa -//.word 0x2ebd8012 -//.word 0x3add8ce4 -//.word 0x1e5dcd25 -//.word 0x92a16189 -//.word 0x4236f322 -//.word 0xd1c2dfe8 -//.word 0x1e3b9799 -//.word 0xc65845c3 -//.word 0xea45b21e -//.word 0x329b6620 -//.word 0x118f11cc -//.word 0x4b6a29cb -//.word 0xb539d5bd -//.word 0x3cc50ad1 -//.word 0x29c5f393 -//.word 0xa4539706 -//.word 0x769db6f3 -//.word 0x13ddf380 -//.word 0xd78b3904 -//.word 0x90d0571a -//.word 0x3d3fedf5 -//.word 0x15c08cf3 -//.word 0xcbcc1974 -//.word 0x11e072ec -//.word 0x5b2b5437 -//.word 0xe58a7d2d -//.word 0xf7b70d77 -//.word 0x68be32a1 -//.word 0x61b0046f -//.word 0x639aae75 -//.word 0x8bb8cfe2 -//.word 0x15e7209d -//.word 0x20595693 -//.word 0xb08c4a4f -//.word 0xf97d57cb -//.word 0xdb190385 -//.word 0xa9f4e2d6 -//.word 0x2e3db87f -//.word 0xf2f2de85 -//.word 0xb950e740 -//.word 0x4d8e82ae -//.word 0x7dcaa20d -//.word 0x6644dda8 -//.word 0xf1ca12f1 -//.word 0x9d734fd0 -//.word 0x7f90f23b -//.word 0x87e00e07 -//.word 0x040310fd -//.word 0x6a31a231 -//.word 0x532ccf8f -//.word 0xc57368b7 -//.word 0xb3b9a70b -//.word 0xc6951305 -//.word 0x5d7ba3cf -//.word 0xd2eb260d -//.word 0xffe8e2fd -//.word 0x00ac7cc3 -//.word 0x3b9a18fe -//.word 0x9e74c09f -//.word 0x28ce0afb -//.word 0xabc3f51f -//.word 0xd0e61563 -//.word 0x5b7bf042 -//.word 0xb0e8a768 -//.word 0x9666d90d -//.word 0x3cfcc482 -//.word 0x7aaead09 -//.word 0x58f282ea -//.word 0xd463bfc3 -//.word 0xe0b98e20 -//.word 0xabf9324b -//.word 0x21e9a566 -//.word 0xb5c780b6 -//.word 0x5e3a1c42 -//.word 0xdf89f79d -//.word 0x4c0b5900 -//.word 0xcadf379b -//.word 0x96dc572d -//.word 0x49cbb5d3 -//.word 0x5ad4261d -//.word 0xe4373b67 -//.word 0xa93d6867 -//.word 0x586d6502 -//.word 0x0b02d564 -//.word 0x149d264f -//.word 0xf938b8b3 -//.word 0xbd5b4180 -//.word 0x619270b8 -//.word 0xab1ed0c8 -//.word 0x26ebf018 -//.word 0x6ac2c1e1 -//.word 0x9dc03f3f -//.word 0x3a075387 -//.word 0x11b3f8da -//.word 0x90109efa -//.word 0x400acb5d -//.word 0x92e40880 -//.word 0xdc2dfb7e -//.word 0x9ff0d1e1 -//.word 0x0b2cdfb8 -//.word 0xc58388ea -//.word 0xe73661c9 -//.word 0x495193ea -//.word 0xff238135 -//.word 0x22f1ab38 -//.word 0xd4ecd2c0 -//.word 0x7e5f5eab -//.word 0x5c2dfcf8 -//.word 0x3c7b8b20 -//.word 0x82aa39a9 -//.word 0x7088e9f8 -//.word 0xa4c7d967 -//.word 0xe2ae8197 -//.word 0x140ebe08 -//.word 0x8f782fe6 -//.word 0x98addf26 -//.word 0x275625d2 -//.word 0xebf5c9a1 -//.word 0x8d1c68cb -//.word 0x39dd1a1b -//.word 0x5b815146 -//.word 0xa67c057b -//.word 0x5ba10e3b -//.word 0xc893d16b -//.word 0x0f7c1ea8 -//.word 0x280159da -//.word 0x2975d80c -//.word 0xc54c8d7b -//.word 0x13d3e5ec -//.word 0x911fef43 -//.word 0x6943c152 -//.word 0xf3c718ef -//.word 0x7a553e49 -//.word 0x43b4317c -//.word 0xcbfb0162 -//.word 0x51fe7aac -//.word 0x940d0332 -//.word 0xdedec688 -//.word 0x41c711d2 -//.word 0x2130fcd9 -//.word 0xf3494d5e -//.word 0x43f898ae -//.word 0xfc16ab76 -//.word 0xe4da29d9 -//.word 0x669574c0 -//.word 0x94a0d071 -//.word 0x6c93c664 -//.word 0x5ab8c751 -//.word 0xffc0128e -//.word 0x31b4d898 -//.word 0x432e9df0 -//.word 0x86c8e128 -//.word 0x0fd5003d -//.word 0xbb4f5727 -//.word 0x7111a8af -//.word 0xa746bf81 -//.word 0x28225682 -//.word 0x14d03763 -//.word 0x28aba077 -//.word 0x3fb0ebc1 -//.word 0x19336e52 -//.word 0x5cd2a1d2 -//.word 0xd8a87e5c -//.word 0x0fc32e8f -//.word 0xf5d7e1e1 -//.word 0xf433fe37 -//.word 0x33f57cb3 -//.word 0x187a8fcd -//.word 0x0c1988a6 -//.word 0x7e11f698 -//.word 0x2abf1212 -//.word 0x9b155aa3 -//.word 0xee477b54 -//.word 0xdac77480 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x0000B458 -//// expected output -//.word 0xcd200254 -//.word 0xe5a8cf6e -//.word 0x0923e70f -//.word 0xc2cf3ce2 -//.word 0x6ccfe073 -//.word 0x66a1c5e1 -//.word 0x49449590 -//.word 0x78dfb803 -//.word 0xcd0d0289 -//.word 0x132a45bc -//.word 0xad2bc290 -//.word 0x605f33e9 -//.word 0x0184d306 -//.word 0xf35f0522 -//.word 0xe3d1a315 -//.word 0xda594bbd -//// SHA512LongMsgvector_58 -//// vector length -//.word 0x0000B770 -//// input message -//.word 0xa19f65ff -//.word 0xdafd6ad5 -//.word 0xee43570f -//.word 0x7e168f94 -//.word 0xa8b4a7b7 -//.word 0x402ac80b -//.word 0x5dc75578 -//.word 0x18d0ce8e -//.word 0x9075f51a -//.word 0x32042ff7 -//.word 0x375d2c27 -//.word 0x6da6ca22 -//.word 0x3b40376e -//.word 0xdff95670 -//.word 0xfb836582 -//.word 0x5025dc46 -//.word 0xc9b09839 -//.word 0xbbb5388b -//.word 0x6bf5c82e -//.word 0xd1199d2d -//.word 0x9ba37f3f -//.word 0x75250e9c -//.word 0x88b05e0f -//.word 0x4090e54c -//.word 0x53369785 -//.word 0xff764f38 -//.word 0x93f3714b -//.word 0x30d7cd5a -//.word 0xd1c7c750 -//.word 0x8916b534 -//.word 0x0c388946 -//.word 0x717ab04b -//.word 0x36f13a25 -//.word 0x85b03aa6 -//.word 0xb53e70a6 -//.word 0x14482553 -//.word 0xe49257c9 -//.word 0xa33316e3 -//.word 0x90022e50 -//.word 0x6a4c06e9 -//.word 0x7bc8c841 -//.word 0xd5ccc27e -//.word 0xdcc00d68 -//.word 0x04d46cc0 -//.word 0xdcee76d3 -//.word 0x4ce6f84f -//.word 0x1af69554 -//.word 0xb36cafce -//.word 0x29a28b03 -//.word 0x7830af68 -//.word 0x0d608fb9 -//.word 0x89e36948 -//.word 0xc2c26e96 -//.word 0x0a972220 -//.word 0xb5fc057b -//.word 0xd54473a3 -//.word 0x4869c991 -//.word 0xf546c90b -//.word 0x520640c0 -//.word 0x2adde594 -//.word 0x9df68539 -//.word 0x68ac5dff -//.word 0x66fcc8ed -//.word 0x573a1a10 -//.word 0xe104cb13 -//.word 0xd475d810 -//.word 0xb29a66a6 -//.word 0x6f2aa84c -//.word 0x757104e4 -//.word 0xeb8e7194 -//.word 0x37de24d1 -//.word 0xc1b86bbc -//.word 0xfa5bd9b2 -//.word 0x9e24a31e -//.word 0x36054a92 -//.word 0xe0327a17 -//.word 0x521d33c1 -//.word 0x1da52686 -//.word 0x2f8a624f -//.word 0x9c252f50 -//.word 0x9e563a95 -//.word 0xdabdf3de -//.word 0xe42d34ad -//.word 0x065d239d -//.word 0x3de159f5 -//.word 0x8559447d -//.word 0x56e9c991 -//.word 0x6fe92e73 -//.word 0xd2dd38e6 -//.word 0x10a790f8 -//.word 0xc6fb6b1f -//.word 0x68146a87 -//.word 0x3da5bfab -//.word 0xab139223 -//.word 0xb5e1a3bc -//.word 0xc26c30ce -//.word 0xa0d819ca -//.word 0xc84a4213 -//.word 0xe457390f -//.word 0x8ebd197d -//.word 0x5b51ae09 -//.word 0x1839d91d -//.word 0x535b36fb -//.word 0x1e15fd09 -//.word 0x0f2f266b -//.word 0x8b0ed1d7 -//.word 0x442ae4a5 -//.word 0x01c2f626 -//.word 0x9ece6c37 -//.word 0x5335e116 -//.word 0x3940cc74 -//.word 0x094e5ccb -//.word 0x27caa7f1 -//.word 0xe05b04ee -//.word 0xf05ab50b -//.word 0x4889ca2b -//.word 0x0e02415e -//.word 0xe46d72b4 -//.word 0x6d76ab4f -//.word 0x0d7f17bc -//.word 0xf191e484 -//.word 0x5099a4fd -//.word 0xf0d1f466 -//.word 0xeb7c5c33 -//.word 0xb3d677a6 -//.word 0x544b549f -//.word 0xf9e71bb5 -//.word 0xb20ef485 -//.word 0x746d244a -//.word 0x623079af -//.word 0x4a75e9e1 -//.word 0x730176e7 -//.word 0x96325536 -//.word 0x2a354e80 -//.word 0xe47966ce -//.word 0x7f64bcce -//.word 0xb944b16e -//.word 0x9e884ba9 -//.word 0x0830dca1 -//.word 0x6782deef -//.word 0xbeff2237 -//.word 0xee952aff -//.word 0x3716d3c1 -//.word 0xfce9363e -//.word 0xc600d116 -//.word 0x8c09e296 -//.word 0x32e914d1 -//.word 0x4f665df2 -//.word 0x332327d0 -//.word 0x29d2aec3 -//.word 0xf9a5a9b7 -//.word 0xb1052c7e -//.word 0xa587cd6b -//.word 0xb51c061c -//.word 0xce88da97 -//.word 0xb415bb99 -//.word 0xfe88ac2a -//.word 0x6254a375 -//.word 0x320e31d7 -//.word 0x27216436 -//.word 0x5ec3ed94 -//.word 0xa0277ee3 -//.word 0xe6f4761b -//.word 0x1cf7c08b -//.word 0x2614f86c -//.word 0x2183d0bc -//.word 0xeb39b34a -//.word 0xe5a3a80d -//.word 0xf79a78b9 -//.word 0xd5941394 -//.word 0x81173086 -//.word 0x12743470 -//.word 0xb3b155bf -//.word 0xeec7ff41 -//.word 0x2b0e7637 -//.word 0x73f5beab -//.word 0x7af6b804 -//.word 0xddc98dd7 -//.word 0xa8d84f00 -//.word 0x1bf4def2 -//.word 0xae46094b -//.word 0x5288f6ac -//.word 0xfa75c4c7 -//.word 0x5a7d6eb9 -//.word 0xeebef39b -//.word 0x3f30b453 -//.word 0x621f1db0 -//.word 0xc1df87b7 -//.word 0x1ebb5d37 -//.word 0xd42e7ea4 -//.word 0x6056e321 -//.word 0x21a582df -//.word 0x5cda72a6 -//.word 0x832f4fb1 -//.word 0xb7d4e0bf -//.word 0x8b9df767 -//.word 0x0bf899ac -//.word 0xfd215fd1 -//.word 0x66991c6f -//.word 0x50d4c0c4 -//.word 0xcb317d4e -//.word 0x32302898 -//.word 0xafe0e155 -//.word 0x0196f6ab -//.word 0x7de405d1 -//.word 0x53c961dc -//.word 0x1326b7d6 -//.word 0x7071f211 -//.word 0x43ad5bba -//.word 0xd39a05b1 -//.word 0x53296898 -//.word 0xac324c2b -//.word 0x7d69e9cf -//.word 0x608f4c6d -//.word 0x70e5fc80 -//.word 0x08e6de6d -//.word 0xcd355614 -//.word 0xeed5afa4 -//.word 0xaa98bdb3 -//.word 0x13dac08e -//.word 0x126e8ccd -//.word 0xacd9e72b -//.word 0x83be3395 -//.word 0xa09a4d81 -//.word 0x6fb2b481 -//.word 0x0b49ee18 -//.word 0xbc1527cc -//.word 0xbff41c7c -//.word 0x45dc37f4 -//.word 0xbd10fbbf -//.word 0x569aa33c -//.word 0xc0f506f5 -//.word 0x330abe2b -//.word 0xb35e89b6 -//.word 0x9289ef0c -//.word 0x36ea269f -//.word 0x1d99326c -//.word 0x1d9d50d0 -//.word 0xf15f959e -//.word 0xf15fd370 -//.word 0x2126bc3a -//.word 0x6d7c4a25 -//.word 0x33da5e9a -//.word 0x0222a79c -//.word 0xa28ec55c -//.word 0x54e6ae07 -//.word 0x5af751e3 -//.word 0xba407a9a -//.word 0x40eef6d6 -//.word 0xc20bf70d -//.word 0xa7f2ba9f -//.word 0xaa06661e -//.word 0xdca338ec -//.word 0xe855dd0c -//.word 0x9b481f32 -//.word 0xa400c41c -//.word 0x984ab325 -//.word 0x39735918 -//.word 0xf7b74b42 -//.word 0xb7fc2dcb -//.word 0xd4c1d246 -//.word 0x6351a486 -//.word 0xbc3c47b3 -//.word 0x3607799e -//.word 0x31233d52 -//.word 0x5a1c38ec -//.word 0x2a135bac -//.word 0xb06ec24b -//.word 0x91cedc8f -//.word 0x4d41cd1e -//.word 0xc3ba1090 -//.word 0xf8be61c7 -//.word 0x145fda83 -//.word 0xad6e5c31 -//.word 0x48ed3004 -//.word 0x1dc3ee47 -//.word 0x1bb39ef2 -//.word 0x2c8f1e7b -//.word 0xbaa9c4ee -//.word 0x728b4340 -//.word 0x48e8d3e1 -//.word 0xbbd28c90 -//.word 0x5a2c1373 -//.word 0x87637967 -//.word 0x7b596095 -//.word 0x8aa26046 -//.word 0xa8f3a9f8 -//.word 0x2dd7e9b0 -//.word 0xd5a47093 -//.word 0x0bae92b0 -//.word 0x67ba4c21 -//.word 0x75b62b52 -//.word 0xb8a76aa0 -//.word 0xeee25a26 -//.word 0x967f07d3 -//.word 0xb00b19c0 -//.word 0xc47df8c1 -//.word 0x256b343b -//.word 0x777e2335 -//.word 0x6f24ccb1 -//.word 0xda84033c -//.word 0xe1b7d6c4 -//.word 0x8b3528aa -//.word 0x838d9c18 -//.word 0x1c5ab595 -//.word 0x92723bd6 -//.word 0x9360e0d7 -//.word 0xfd15232b -//.word 0xeada7591 -//.word 0xea899ac7 -//.word 0x8ffd53a3 -//.word 0x2fc73a5f -//.word 0xe522ed35 -//.word 0xd92a6e2b -//.word 0xc148ca31 -//.word 0xa8f1f969 -//.word 0xee9006c6 -//.word 0x91c070d8 -//.word 0xaabfcfe6 -//.word 0x3b1fba3e -//.word 0x27bfe9c9 -//.word 0x82fa97e2 -//.word 0x0b1e2a68 -//.word 0xf7201612 -//.word 0xf18eff03 -//.word 0x5ec41e9f -//.word 0xe563e59c -//.word 0x2fffe65c -//.word 0xeb18f17a -//.word 0x164c7ca3 -//.word 0x79ca48a7 -//.word 0x730a42cf -//.word 0xf8bca872 -//.word 0xdafe6cc3 -//.word 0x47d1dded -//.word 0x94ce8462 -//.word 0x38154c6f -//.word 0x1c87e715 -//.word 0x12356c14 -//.word 0xa2174548 -//.word 0x0d024838 -//.word 0x8cd424ed -//.word 0xd9f2ff00 -//.word 0xf0f45df7 -//.word 0x179e44d2 -//.word 0x1c129ee0 -//.word 0xde45ded7 -//.word 0x0eb0e624 -//.word 0x37482880 -//.word 0xfcaf0cc4 -//.word 0xa2ac92fe -//.word 0xced939c4 -//.word 0x8f9b1fc8 -//.word 0x9e5769ad -//.word 0xe5e3e519 -//.word 0x3f3bee0c -//.word 0x7f769170 -//.word 0xb3f8eef1 -//.word 0xaae8e00e -//.word 0xb3e5e070 -//.word 0xa8f4267b -//.word 0x2bbd1224 -//.word 0x30f8cb02 -//.word 0xbc2226a7 -//.word 0xeb74c930 -//.word 0x3815901b -//.word 0xf98f2f59 -//.word 0x298019a4 -//.word 0x6a92a113 -//.word 0x4aac5fec -//.word 0xc66ad6b9 -//.word 0x0dcb539e -//.word 0x862a18e9 -//.word 0x1370baeb -//.word 0x9887c807 -//.word 0xb712ad08 -//.word 0xde5bd8b7 -//.word 0x848c1aae -//.word 0xaf234f67 -//.word 0xbaa04098 -//.word 0x5580c8c3 -//.word 0xcd6f3608 -//.word 0x8ebaf33f -//.word 0xe6036543 -//.word 0x0b381290 -//.word 0x60c60911 -//.word 0xf4097e33 -//.word 0x4b07b43e -//.word 0x625f20e5 -//.word 0xed7ccb1c -//.word 0xe30ef829 -//.word 0x3cbb07fe -//.word 0xfa1199c6 -//.word 0x66c0f5be -//.word 0x9c06aa46 -//.word 0x496a7638 -//.word 0xb4ad6778 -//.word 0xfbfe40cc -//.word 0x9f6d1eee -//.word 0x43a25be0 -//.word 0xb1cfb380 -//.word 0x1ee3a55c -//.word 0xaf011cc7 -//.word 0x3c304f2d -//.word 0x5354e6a3 -//.word 0x805d5ec2 -//.word 0xcbbeaeb6 -//.word 0x83202b92 -//.word 0x3a58a9e6 -//.word 0x1197e394 -//.word 0x36e11ddf -//.word 0xaac107c5 -//.word 0x483ae58f -//.word 0x0300eda6 -//.word 0x6fe9f0a8 -//.word 0x839e3dbb -//.word 0x9d96c322 -//.word 0xc645750e -//.word 0x3790f3b6 -//.word 0x1d8566a9 -//.word 0x9a49ab63 -//.word 0x0c51b51f -//.word 0x91d52ced -//.word 0xcb825a04 -//.word 0xe0704859 -//.word 0xc5532471 -//.word 0xbdf5e673 -//.word 0x1ce43481 -//.word 0x51678248 -//.word 0x23b77dd6 -//.word 0x3b6caaac -//.word 0xe3364a15 -//.word 0x0dcd82b6 -//.word 0x972bb865 -//.word 0xcdf8403f -//.word 0x304638f4 -//.word 0x767eb066 -//.word 0xd19a0f73 -//.word 0x7495b10e -//.word 0x5420d595 -//.word 0x2b97b75e -//.word 0xc333f994 -//.word 0x71814741 -//.word 0xdf133bab -//.word 0x0f757ee4 -//.word 0x9d62319d -//.word 0x45388b3b -//.word 0xa4aac32d -//.word 0x43b5307c -//.word 0xd1d5afa3 -//.word 0xb07845a2 -//.word 0xb4b3054e -//.word 0x273434eb -//.word 0x1078acfc -//.word 0xb43e7e5a -//.word 0x5e3bdb84 -//.word 0x5c0f3536 -//.word 0x4a78a13d -//.word 0x93c58089 -//.word 0x348e5e84 -//.word 0xc3a31aa2 -//.word 0xb0424739 -//.word 0xcc8dd394 -//.word 0x073ae643 -//.word 0x7e8d0db4 -//.word 0xb5839808 -//.word 0x2051411f -//.word 0xe90c0ef5 -//.word 0xedaa7832 -//.word 0x0829ccfc -//.word 0x920ed210 -//.word 0x2911ad11 -//.word 0xb117021f -//.word 0x9a605cac -//.word 0x6102cf8b -//.word 0x5a96dc4a -//.word 0xac3195c2 -//.word 0x9d9601ec -//.word 0x10a9c2f7 -//.word 0x4b27f597 -//.word 0xfe955a9f -//.word 0x8176b5d2 -//.word 0x5ec174f6 -//.word 0x0f92912b -//.word 0x0920ba7b -//.word 0xf9efb0b2 -//.word 0x4d47ed70 -//.word 0xf6e4897c -//.word 0x6cef5e5b -//.word 0xf32d6b22 -//.word 0x1e777688 -//.word 0x916af53f -//.word 0x0a5f2f85 -//.word 0xa39d9ff6 -//.word 0x51ce99a4 -//.word 0xb1b03069 -//.word 0x040d567c -//.word 0x77ed4543 -//.word 0xa90a1e68 -//.word 0x6784d02f -//.word 0xbad63c07 -//.word 0x2309975f -//.word 0x25280fba -//.word 0x04f3b106 -//.word 0xcdd78a29 -//.word 0x961e0cde -//.word 0x0764b4bf -//.word 0x194aeaa2 -//.word 0x1e6e2929 -//.word 0x029a5f95 -//.word 0xd03b97db -//.word 0x7715d5fa -//.word 0xcf36418b -//.word 0xd728889a -//.word 0x416b80b4 -//.word 0x30220b41 -//.word 0x400d3d15 -//.word 0xc7b7c141 -//.word 0x5af1782f -//.word 0x937e64ee -//.word 0x1210c5ca -//.word 0xc2748120 -//.word 0x5d09c970 -//.word 0x3376fab4 -//.word 0x279cc1f0 -//.word 0xfaca830b -//.word 0xcc30fcdd -//.word 0xdf972689 -//.word 0x9f4f5c0d -//.word 0xdf68bf17 -//.word 0x6625d91b -//.word 0xaaad80a2 -//.word 0xdb04fde5 -//.word 0x233a6e9a -//.word 0x2de2690e -//.word 0xe4c6e274 -//.word 0x7dd94f7c -//.word 0xb76d0928 -//.word 0x61a6f6dc -//.word 0x1d2f65b4 -//.word 0x652b3919 -//.word 0xcb6f4a97 -//.word 0x85ee08e9 -//.word 0x28746256 -//.word 0xb498e641 -//.word 0xd1ec29fb -//.word 0x587669db -//.word 0x15647191 -//.word 0xccfbbdb7 -//.word 0x79d1dfa9 -//.word 0xdc3c2197 -//.word 0x350a6cd8 -//.word 0x4d726881 -//.word 0xb54be537 -//.word 0x527c7a41 -//.word 0x1ab46be1 -//.word 0x185bd0e5 -//.word 0xb6c8f479 -//.word 0x3bb4fc3f -//.word 0x93eec9a2 -//.word 0x4f511f67 -//.word 0xecf40684 -//.word 0x58a07036 -//.word 0xb2871d4e -//.word 0x5132bccb -//.word 0x09bc53ae -//.word 0xa93ee00a -//.word 0xc88a415b -//.word 0xc21c5118 -//.word 0xfd4d548c -//.word 0x71ca95e1 -//.word 0x67454d7e -//.word 0x806ac793 -//.word 0xfa15c2f1 -//.word 0x2fc21720 -//.word 0x5e459bab -//.word 0xaebb47bf -//.word 0x70c096f4 -//.word 0xa5e22f6b -//.word 0xc056c419 -//.word 0xadea3a62 -//.word 0x113b0aea -//.word 0xd428e7a8 -//.word 0xdd86a13c -//.word 0x1c154982 -//.word 0xceb39667 -//.word 0xfcd087fb -//.word 0x45224ac8 -//.word 0xde9a5d63 -//.word 0xd796f340 -//.word 0xa05899ca -//.word 0xcbb719b3 -//.word 0x13149e89 -//.word 0x9e901a8b -//.word 0x7f7ce5ba -//.word 0x7f12a733 -//.word 0x1d6277bb -//.word 0xd38e449c -//.word 0x9b3a74b0 -//.word 0xb23fccbb -//.word 0x9c9f90fd -//.word 0x68beeb08 -//.word 0x35cf90d0 -//.word 0xf58ca201 -//.word 0x712ad295 -//.word 0x8e8cc7a5 -//.word 0xceb7c27f -//.word 0x198682fa -//.word 0xbe9e6506 -//.word 0xb5a5d187 -//.word 0x27afd264 -//.word 0x2ff904da -//.word 0xe3dab417 -//.word 0x8ef64204 -//.word 0x40b5c962 -//.word 0x89f40218 -//.word 0x81fa66cb -//.word 0x0bad93b0 -//.word 0x5b05f19e -//.word 0xb6c29568 -//.word 0x795a6669 -//.word 0x5d367e60 -//.word 0xf91dd37f -//.word 0x89f116be -//.word 0xed99db75 -//.word 0xf53efb2a -//.word 0xdbba36a7 -//.word 0x114d1d50 -//.word 0x3d9230b4 -//.word 0x83b24362 -//.word 0x02d826fe -//.word 0xa1e58494 -//.word 0x0b640c2b -//.word 0xf8c0cf9e -//.word 0xafb4e9a7 -//.word 0xc804643d -//.word 0x376b5920 -//.word 0x86d458b2 -//.word 0x62cd0a08 -//.word 0x59381541 -//.word 0xe2434016 -//.word 0x9e9bd8b3 -//.word 0xdddd52c5 -//.word 0x644e31d5 -//.word 0x6ecb2bd4 -//.word 0xf00387f7 -//.word 0x21e3c9c5 -//.word 0x3a52916e -//.word 0x7a1fc15e -//.word 0x6e37de12 -//.word 0x6f1cb92a -//.word 0x6c924ec0 -//.word 0xea9cecf9 -//.word 0x48a696d9 -//.word 0x4804aa5c -//.word 0xcb9bc0c2 -//.word 0xdcded52a -//.word 0xf0fda962 -//.word 0x6c5865fe -//.word 0x683a81a7 -//.word 0xb3c4e5b6 -//.word 0x17274e02 -//.word 0xde17f4f5 -//.word 0x947c6ae6 -//.word 0x0f6ac5a2 -//.word 0xad53004c -//.word 0xdd7b9f68 -//.word 0xe1ad9332 -//.word 0xd22d5e34 -//.word 0xe4ed7717 -//.word 0xeb03f0ba -//.word 0x1e5b5681 -//.word 0x1ba9d9f0 -//.word 0x2ca2ac78 -//.word 0xc96caf90 -//.word 0x5e534c08 -//.word 0x4ebd9e9a -//.word 0x3760d9c3 -//.word 0x78b2e6d1 -//.word 0xf0a14d3c -//.word 0x09855839 -//.word 0xf553768d -//.word 0x3813dd9f -//.word 0x679473d2 -//.word 0x2f5eef11 -//.word 0x98e83bac -//.word 0x8b0b1d62 -//.word 0x93b717bf -//.word 0xe0e58ca8 -//.word 0x91cc2334 -//.word 0x335871bd -//.word 0x84d8d237 -//.word 0x7df797c1 -//.word 0x90ed677a -//.word 0x2ff6df96 -//.word 0x8d037cb1 -//.word 0xa8b0bb62 -//.word 0x87777e14 -//.word 0xc023b211 -//.word 0x3e872fe0 -//.word 0x416fdfd1 -//.word 0xa6d723d6 -//.word 0x695b7294 -//.word 0x68ef44ba -//.word 0x6ad02e92 -//.word 0x5fbb4ed6 -//.word 0xea5ce9c4 -//.word 0x1c095374 -//.word 0x83b00f6a -//.word 0x630e3868 -//.word 0x43221f85 -//.word 0xabe23683 -//.word 0x2d2c2d5e -//.word 0xa2ff5a21 -//.word 0xb6eb5efd -//.word 0xa7c6069c -//.word 0x49a16fb3 -//.word 0x4efa6ed7 -//.word 0xc4342e91 -//.word 0xdf441bb4 -//.word 0xf9acffee -//.word 0xd7ad6b9e -//.word 0x2eb859e5 -//.word 0x65270f00 -//.word 0x9d2a47d5 -//.word 0xef048ccb -//.word 0xf477e7df -//.word 0x8b7cbbf5 -//.word 0xd638ee6b -//.word 0x862c49f4 -//.word 0x59ac22a4 -//.word 0xe0923847 -//.word 0x8633def7 -//.word 0xce925cee -//.word 0xdcd49298 -//.word 0x37f4deec -//.word 0xcdb840fd -//.word 0x38e4bccc -//.word 0x3fad0061 -//.word 0xa070471a -//.word 0x0da47d42 -//.word 0x740ea4e5 -//.word 0x833376e3 -//.word 0x6c134c44 -//.word 0xe5143ecb -//.word 0x733d8cce -//.word 0xe9a43d45 -//.word 0x2b2a0520 -//.word 0x38656cde -//.word 0x68de2d5b -//.word 0xf27ddce9 -//.word 0xb041cca3 -//.word 0x273430fe -//.word 0xc29f80a1 -//.word 0x5e7a1f77 -//.word 0x0b263a02 -//.word 0x115ff3f2 -//.word 0x326cbff6 -//.word 0x2f980cd2 -//.word 0x8ee628b2 -//.word 0x99015ebd -//.word 0xaa7262ee -//.word 0xa615ef1f -//.word 0xc8ceae67 -//.word 0xa0785aa6 -//.word 0x5b1e225e -//.word 0x446e4ec5 -//.word 0x8b6a2618 -//.word 0x45610f31 -//.word 0xb51ef85c -//.word 0xca5ff467 -//.word 0xe88928f8 -//.word 0xec99e823 -//.word 0x6a5e1d3c -//.word 0x38e6eaea -//.word 0x31368f7d -//.word 0x333d8d82 -//.word 0x6a0b0b94 -//.word 0xd13f7875 -//.word 0xf5be725d -//.word 0xfdabe691 -//.word 0xe7937938 -//.word 0x14e7276a -//.word 0x07b02a8b -//.word 0x6a7e1ed7 -//.word 0x51a1623d -//.word 0xc39cc171 -//.word 0x77d7523d -//.word 0xdb949c18 -//.word 0x5a24fef9 -//.word 0xdf5b4f6d -//.word 0x9541c1e8 -//.word 0xf20a0b58 -//.word 0xf349c700 -//.word 0xa9601884 -//.word 0xf43b9140 -//.word 0x8f3e52de -//.word 0x4c7b7428 -//.word 0xa129a81a -//.word 0x64511a3c -//.word 0xd3cb9c2f -//.word 0xd7690085 -//.word 0x8a72c5d6 -//.word 0xf652f70f -//.word 0x208f500e -//.word 0x45ffa36c -//.word 0x63397b9a -//.word 0xfb49ff30 -//.word 0x15a81881 -//.word 0x866bd673 -//.word 0x6eba108e -//.word 0x04844b52 -//.word 0x9671ddce -//.word 0xcb18536e -//.word 0x2c730f15 -//.word 0xe28f366b -//.word 0xc188c979 -//.word 0x86b51173 -//.word 0x5d2041d4 -//.word 0xa73957b0 -//.word 0xf9cb4346 -//.word 0x682e4bd6 -//.word 0x04bfaeb2 -//.word 0xa28d8796 -//.word 0xdf55f53c -//.word 0x61b1792c -//.word 0x608c9fd2 -//.word 0x65d9e1d2 -//.word 0x5284c8a0 -//.word 0xa3a9544b -//.word 0xf3059e99 -//.word 0xc2aabc59 -//.word 0x75f6e5f5 -//.word 0x9ec5d547 -//.word 0x7ee673ad -//.word 0xc9ccb260 -//.word 0xa886b501 -//.word 0x04f23675 -//.word 0x022d28f3 -//.word 0xca4d9b5b -//.word 0x8d53e1ca -//.word 0xc65bef6b -//.word 0xc0160590 -//.word 0x587a9201 -//.word 0x04b85293 -//.word 0x146fb9fd -//.word 0x381f94e8 -//.word 0x43e0ee45 -//.word 0x2e5430e3 -//.word 0x60da8d41 -//.word 0x2c049da1 -//.word 0x9c4c485d -//.word 0x6d02e67e -//.word 0x5a89a48b -//.word 0x9ec32a9f -//.word 0xb4ca7bbe -//.word 0x61e11c69 -//.word 0xf4aa7870 -//.word 0xcd998308 -//.word 0x1ca89e1d -//.word 0xeb4cbbea -//.word 0x5fa8c1c6 -//.word 0x3a013241 -//.word 0xa5730b6f -//.word 0x2de2eb84 -//.word 0x0b3378a1 -//.word 0xa8bbfeee -//.word 0x60f75ae9 -//.word 0x867e17fe -//.word 0xa935d657 -//.word 0x16c2f3f5 -//.word 0x9e436500 -//.word 0x9a3fe65b -//.word 0x2cdc557c -//.word 0xc753587b -//.word 0xf1a24568 -//.word 0x478143e2 -//.word 0xc296ace5 -//.word 0x3aecb6e4 -//.word 0x28a25318 -//.word 0xb0e05517 -//.word 0xdf0fd6a8 -//.word 0x314ad7d6 -//.word 0x560f2743 -//.word 0x353b87bf -//.word 0x32350b19 -//.word 0xac69c335 -//.word 0xcaf89b5f -//.word 0x78ad80df -//.word 0xac34c4ce -//.word 0xee86c428 -//.word 0x17a8c822 -//.word 0x59952abd -//.word 0x7f79bb9b -//.word 0x761f6211 -//.word 0x0dad067f -//.word 0xf98faedc -//.word 0x1cb1e795 -//.word 0x07f16798 -//.word 0xbdd4efab -//.word 0xb9777603 -//.word 0x33c98312 -//.word 0xa0f8dba0 -//.word 0x78295c1d -//.word 0x3b6c2936 -//.word 0xb6ef07a6 -//.word 0x8372074f -//.word 0xcffa6689 -//.word 0x5fcab1ba -//.word 0xd58f2c27 -//.word 0x30db7509 -//.word 0x93d465e4 -//.word 0x472e3714 -//.word 0x0256eca8 -//.word 0x6af0ed74 -//.word 0xd584f362 -//.word 0x53742409 -//.word 0xee327f81 -//.word 0x30af7975 -//.word 0xe617e879 -//.word 0x24bb219e -//.word 0x894f5d44 -//.word 0xc4556230 -//.word 0x57d95fdf -//.word 0x9b5f1719 -//.word 0x051a41c9 -//.word 0xa75e2f0b -//.word 0xfa58af87 -//.word 0xdafd2ffe -//.word 0xd2402422 -//.word 0x9a88acab -//.word 0xde6171a7 -//.word 0x4171d111 -//.word 0xa2af3da6 -//.word 0x9ecfdff4 -//.word 0x560080b4 -//.word 0x72daa859 -//.word 0x669207e9 -//.word 0xf371130c -//.word 0xf184f363 -//.word 0x4d949c1a -//.word 0x4e583ac1 -//.word 0x1cead157 -//.word 0x827824a8 -//.word 0xf33cd6da -//.word 0xcbaecf42 -//.word 0xd8f8e17c -//.word 0x19aaabba -//.word 0xc5afbe5c -//.word 0x8f80ffc1 -//.word 0x29974d5d -//.word 0x0727630c -//.word 0x650affa6 -//.word 0x8bfa44d4 -//.word 0x50055c22 -//.word 0xdd3b6355 -//.word 0xb3aa80fe -//.word 0xf08c554f -//.word 0xcdbe9a2e -//.word 0x6c740488 -//.word 0xd12c6ce8 -//.word 0x2ee02d48 -//.word 0x6380ce27 -//.word 0xc59fe1db -//.word 0x1e6d2a29 -//.word 0xf6e50413 -//.word 0x114701f1 -//.word 0x39c9d1c3 -//.word 0x3e8965c6 -//.word 0x3ac75345 -//.word 0x19517db2 -//.word 0x593eeef5 -//.word 0x0fdf0404 -//.word 0x2bf3d4b4 -//.word 0xfc1acacf -//.word 0xf78d9066 -//.word 0xb40b3168 -//.word 0x39177f74 -//.word 0x7b60b2ec -//.word 0x2281514b -//.word 0x8dea56b8 -//.word 0x161e8ddb -//.word 0x97203def -//.word 0x2d270a18 -//.word 0x3b991af7 -//.word 0xb237777c -//.word 0x9095b4fc -//.word 0xa7ced484 -//.word 0xa075676c -//.word 0x3fcff62f -//.word 0xe93fa17a -//.word 0x63010782 -//.word 0xdc1b669b -//.word 0x2e910307 -//.word 0x61d9cd0b -//.word 0x708e3d48 -//.word 0x50698049 -//.word 0x2f6cd859 -//.word 0xfa604097 -//.word 0x21824f4c -//.word 0x9e7a5e7b -//.word 0x348cedba -//.word 0xf4124341 -//.word 0x062a5541 -//.word 0xa6ace977 -//.word 0x6d5ffb00 -//.word 0xd26c606f -//.word 0xf012a91d -//.word 0x8a9c4ac0 -//.word 0x4c90fc3f -//.word 0x532a5fc5 -//.word 0xf008e415 -//.word 0xa927ea1d -//.word 0x810e27cd -//.word 0x7a494a29 -//.word 0x5719de9d -//.word 0xa66a7291 -//.word 0xfe05f73e -//.word 0x860769c0 -//.word 0xb692b26c -//.word 0x62c2cb63 -//.word 0xf4e32467 -//.word 0xf9e146ee -//.word 0xdfffb775 -//.word 0xfccc1d17 -//.word 0xd354a75e -//.word 0x9393a959 -//.word 0xe12f86ef -//.word 0xd766d372 -//.word 0x4d44b978 -//.word 0x571a9be6 -//.word 0x0e2df94d -//.word 0x94ab957a -//.word 0x52e3d448 -//.word 0x84b466b9 -//.word 0xf8462945 -//.word 0x12f94b72 -//.word 0x149bb0a5 -//.word 0x9cde9338 -//.word 0x6f096fcc -//.word 0x74ed20e1 -//.word 0x041b45a4 -//.word 0x6154ea07 -//.word 0x83416417 -//.word 0x1b647b8b -//.word 0xd24fcf98 -//.word 0xd114740d -//.word 0x87fce09b -//.word 0xa67c0774 -//.word 0x6f64c419 -//.word 0x305a7b6c -//.word 0x0b87fd0d -//.word 0xf890abe3 -//.word 0x0dc8dff9 -//.word 0xfea4878c -//.word 0xe06f1362 -//.word 0x323e925d -//.word 0x1d27174f -//.word 0xfbae6210 -//.word 0x1780bcce -//.word 0xb36423a5 -//.word 0x506ea76f -//.word 0x297514de -//.word 0x01c8d1c8 -//.word 0x1e1d08c1 -//.word 0x96ca07ef -//.word 0xc938e71a -//.word 0x2f946b03 -//.word 0x54c72af7 -//.word 0x20a9f1a3 -//.word 0x5c71632a -//.word 0x7271e275 -//.word 0x7400b3cb -//.word 0x60b75ca1 -//.word 0xa3e051b3 -//.word 0xdb2bd053 -//.word 0xe1a30a01 -//.word 0x07e1833d -//.word 0x9e7fbb99 -//.word 0xbcd00e12 -//.word 0x3cced9a0 -//.word 0x0554de0c -//.word 0x908eea02 -//.word 0xa4adb567 -//.word 0x64df09ec -//.word 0x8c7e26e4 -//.word 0xf8876653 -//.word 0x664f1d47 -//.word 0x7c71c36b -//.word 0x0d0b55d9 -//.word 0x982af830 -//.word 0x1182e0e6 -//.word 0xe46370e0 -//.word 0x38e8a240 -//.word 0x7072aa7f -//.word 0xf854d6bb -//.word 0x3ed0b952 -//.word 0xfe4388af -//.word 0xc39cc464 -//.word 0xab121979 -//.word 0x6a178704 -//.word 0x9187bffa -//.word 0x1126d045 -//.word 0xfa490217 -//.word 0x89d3027d -//.word 0x62634037 -//.word 0x1acc96c7 -//.word 0xf8c62ac8 -//.word 0xfde39581 -//.word 0x21c445ba -//.word 0xe08c1fce -//.word 0xf5956902 -//.word 0x6662e815 -//.word 0xc0d54519 -//.word 0xa4a2b681 -//.word 0x8204da7a -//.word 0xa5afe47f -//.word 0x7005fb27 -//.word 0xe78ce142 -//.word 0x71a0d325 -//.word 0xdb65b142 -//.word 0xa1005ffc -//.word 0x69076bb9 -//.word 0xd135f038 -//.word 0x6a63ba25 -//.word 0x04b3aaea -//.word 0x2d0f5cc9 -//.word 0xf4d20827 -//.word 0xf3c4a62b -//.word 0x8c4c5688 -//.word 0x72e1fe97 -//.word 0x6bc235a9 -//.word 0x55e7609b -//.word 0x67371aab -//.word 0xbafbda89 -//.word 0x0893cfb2 -//.word 0xb3670ff9 -//.word 0x0921f166 -//.word 0xc61ab744 -//.word 0xda117176 -//.word 0x6d231e0a -//.word 0x21f71311 -//.word 0x973aa1ad -//.word 0x344bf26b -//.word 0x253734d3 -//.word 0xa0e7f93e -//.word 0x6d98dee8 -//.word 0xa68c6b46 -//.word 0xbbff3b9a -//.word 0xb85d5dc4 -//.word 0xcbb2f95b -//.word 0x016237fc -//.word 0x501a5ce2 -//.word 0xda0637b7 -//.word 0x7045bbaa -//.word 0x559aedc2 -//.word 0x45640172 -//.word 0xb6d0bf6d -//.word 0x5e4d2cbb -//.word 0xf540670d -//.word 0x3cf9d14e -//.word 0x3ee6707a -//.word 0xd60796b3 -//.word 0x71a2bd92 -//.word 0x1538b6bb -//.word 0xa3b703b4 -//.word 0x59f181f7 -//.word 0x9a4d4a45 -//.word 0xf2bdd93e -//.word 0x55f06f2f -//.word 0xa7c8b62b -//.word 0x820ea45d -//.word 0x3365a39c -//.word 0x057cef40 -//.word 0xc3883f34 -//.word 0x78f2a74d -//.word 0x794cbdda -//.word 0xa58afb7d -//.word 0xec6f6439 -//.word 0x0e456acb -//.word 0xa5d1103e -//.word 0x66864cba -//.word 0xa4f9af9d -//.word 0x159547cc -//.word 0xd990c54c -//.word 0xb81ddb0c -//.word 0xace4e805 -//.word 0x9fafd785 -//.word 0x756644c8 -//.word 0x4d3de1c9 -//.word 0x042c1957 -//.word 0xfba0f36b -//.word 0x1b7038b9 -//.word 0x1612d885 -//.word 0xef0f8ab8 -//.word 0xbcb4b333 -//.word 0xab0a8963 -//.word 0x43097816 -//.word 0xec09c58d -//.word 0xb27971d2 -//.word 0x46d3604c -//.word 0x45cfba90 -//.word 0xbdd8927a -//.word 0xeebcc57d -//.word 0x4da72537 -//.word 0xcf52d748 -//.word 0x6378fa65 -//.word 0xc08a89a8 -//.word 0x62a3832a -//.word 0xcfbe49d4 -//.word 0x1f274772 -//.word 0xbb2fd609 -//.word 0x6524616b -//.word 0x7980c708 -//.word 0x72610107 -//.word 0xaf390596 -//.word 0x78c7ea7e -//.word 0x3c464cfa -//.word 0x1ce4f2c9 -//.word 0xae75ae82 -//.word 0xfa698528 -//.word 0xc9fb10fe -//.word 0x20ac229c -//.word 0x07f0ac43 -//.word 0x8e27dd6e -//.word 0x12ce8da9 -//.word 0xbdf7dba6 -//.word 0x4cf6158e -//.word 0x155ed995 -//.word 0x482c7ad1 -//.word 0x7541a54c -//.word 0x4e164558 -//.word 0xafaba322 -//.word 0xdbc0d28a -//.word 0x09484a32 -//.word 0x1f1bd3d5 -//.word 0xbdeba5db -//.word 0x7d79cd2a -//.word 0x7908d23e -//.word 0x0e12997c -//.word 0xe03b86c3 -//.word 0x1e83e445 -//.word 0x08bf8795 -//.word 0xae4aaf00 -//.word 0xfaf83021 -//.word 0xf04bd0b0 -//.word 0x35eaf19b -//.word 0xce4e7058 -//.word 0x2bbfcc79 -//.word 0x647f8b81 -//.word 0xc245d9f6 -//.word 0x81ec73b7 -//.word 0xd46dc390 -//.word 0x2a0b4c0c -//.word 0xb0cd498a -//.word 0x17319193 -//.word 0x971fbe6b -//.word 0x341c8ee6 -//.word 0x40c08a7d -//.word 0x216ae5a1 -//.word 0x5432a650 -//.word 0xb21f0ae5 -//.word 0xf29b2334 -//.word 0x7023c6d6 -//.word 0x2c43a4c2 -//.word 0x16c2b71d -//.word 0x891ae054 -//.word 0x152ace67 -//.word 0x812f2188 -//.word 0x10f1cfe4 -//.word 0x043ac7c1 -//.word 0x618cd5c9 -//.word 0xf313c6a5 -//.word 0x92d9ccce -//.word 0xa53924a0 -//.word 0xe596f5b1 -//.word 0x644d7c60 -//.word 0xcde766b1 -//.word 0xed947d58 -//.word 0x72d58713 -//.word 0xf3786b3d -//.word 0x31c996a1 -//.word 0x9d079d8c -//.word 0x1a152426 -//.word 0x0372fe01 -//.word 0x706b96f3 -//.word 0xb58f8d21 -//.word 0x2c64a45d -//.word 0x3558ddb2 -//.word 0x7afadd3c -//.word 0x786a953d -//.word 0x3b0e216e -//.word 0x6887f093 -//.word 0x81e42652 -//.word 0x65153e45 -//.word 0x16a2f44e -//.word 0xbf9d622b -//.word 0xf6d5694a -//.word 0x3e4c52de -//.word 0xd0ebb532 -//.word 0x9b759a3d -//.word 0x89badf78 -//.word 0x040ddaec -//.word 0xb9f73e8f -//.word 0x9b2d43d0 -//.word 0x2bc00171 -//.word 0xf7941d95 -//.word 0x6113a81a -//.word 0xa2224428 -//.word 0x0f54890a -//.word 0x9a5ea73d -//.word 0x9bcc4cc7 -//.word 0xd1f2c8ca -//.word 0xa3246f59 -//.word 0xac2a3e8a -//.word 0x77eec2cd -//.word 0x8778367c -//.word 0x9b1cecb3 -//.word 0x30f2ee61 -//.word 0x4687e49f -//.word 0x67d23841 -//.word 0xe66a79ab -//.word 0x65f6fde7 -//.word 0x99e4cbf4 -//.word 0x525eb760 -//.word 0xb579cf19 -//.word 0xccb0f680 -//.word 0x4292cfbf -//.word 0x67b7dd5c -//.word 0x7af8e80f -//.word 0x28dfa2d1 -//.word 0x505d8a36 -//.word 0x09bb11fc -//.word 0xe6d3fbe4 -//.word 0x798009c0 -//.word 0x1553d5ce -//.word 0xd888fd44 -//.word 0xe938832c -//.word 0xffd07472 -//.word 0x23c1c83c -//.word 0xb6798a79 -//.word 0xb59339bd -//.word 0x3c4a6d4c -//.word 0x4934bd75 -//.word 0xc32de121 -//.word 0xbb9014ab -//.word 0xf1aebcf2 -//.word 0x9a784dad -//.word 0x607f6bff -//.word 0xab1f4f4c -//.word 0x1ff66b4a -//.word 0x669b515b -//.word 0x2f8dd11a -//.word 0x766a6133 -//.word 0x0662c379 -//.word 0x3deae132 -//.word 0x10b5fcb5 -//.word 0x4ee00538 -//.word 0x296d4be3 -//.word 0xf2f25729 -//.word 0x24921457 -//.word 0xa42d346d -//.word 0x47d4ce2e -//.word 0x95804c73 -//.word 0xcd0384c4 -//.word 0x293e2529 -//.word 0x6295553e -//.word 0x77a09886 -//.word 0xab23f401 -//.word 0xcc415301 -//.word 0xbbec2839 -//.word 0x29a05517 -//.word 0x9f514d54 -//.word 0xc1a275c9 -//.word 0xd357d184 -//.word 0x7c0ddc1b -//.word 0xca28b740 -//.word 0x770e8696 -//.word 0x6b9318c3 -//.word 0x81b3c6c7 -//.word 0x8e879d8c -//.word 0xa072bfbd -//.word 0x839c06dc -//.word 0x8aa1eb8f -//.word 0x8b8aa63b -//.word 0x2cfc97d4 -//.word 0x5dafe5f4 -//.word 0x2622652a -//.word 0xa38dbd94 -//.word 0x4d18c9b0 -//.word 0x7a4a3d6f -//.word 0x28c48c8b -//.word 0xf62f091b -//.word 0x73734c65 -//.word 0x9b29d8f3 -//.word 0x9f54fbe9 -//.word 0xe54bf595 -//.word 0x50fa5c48 -//.word 0xc14abe64 -//.word 0xdede89b7 -//.word 0x12002807 -//.word 0xd4db6fee -//.word 0x2dea39e9 -//.word 0x74b04fab -//.word 0x5daa8cb7 -//.word 0x32823f2d -//.word 0x5f85d1e4 -//.word 0x3457a8ba -//.word 0xe7e54a28 -//.word 0xd89cc61a -//.word 0x19d950fd -//.word 0x2ea02b19 -//.word 0x1190cc21 -//.word 0x7a163c08 -//.word 0x5ce2be17 -//.word 0xb397b23d -//.word 0x7dc7b9a6 -//.word 0x061e1a8e -//.word 0x69dd6458 -//.word 0x548a55da -//.word 0x0be6fbfc -//.word 0xb0201981 -//.word 0xc148cc24 -//.word 0xe2066ee7 -//.word 0xdd8cbba8 -//.word 0xe7c932f5 -//.word 0x25e0be21 -//.word 0x6ed89697 -//.word 0x5395626f -//.word 0x5c079f3f -//.word 0x95a14434 -//.word 0x490da661 -//.word 0x0e1e9956 -//.word 0x0106d8f5 -//.word 0x53c9a781 -//.word 0x05f1b6f8 -//.word 0xef8449a3 -//.word 0x073396eb -//.word 0xe0d46e6e -//.word 0x71122052 -//.word 0x18639bd9 -//.word 0xdf3bd236 -//.word 0xfd8065a0 -//.word 0xa03d7da4 -//.word 0xe99af7bf -//.word 0x380cc62c -//.word 0xabc992fb -//.word 0xe17fa563 -//.word 0x04450859 -//.word 0x06d2e961 -//.word 0x2aec40a5 -//.word 0xc724b344 -//.word 0x49c1b6ec -//.word 0x78faf6ab -//.word 0xfd68f802 -//.word 0x21bafd3c -//.word 0xd9ab2afd -//.word 0x0031e51e -//.word 0xe3f782b8 -//.word 0x020e1f7f -//.word 0x15e0cc52 -//.word 0x4e65f010 -//.word 0xde99e8ac -//.word 0xba2df084 -//.word 0x9f7c47ee -//.word 0x53c28e14 -//.word 0x2f887103 -//.word 0xda638000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x0000B770 -//// expected output -//.word 0x52ef6d43 -//.word 0x536b1fbf -//.word 0x828b21b6 -//.word 0x69fd459a -//.word 0xcd71e0ed -//.word 0x8c67b97e -//.word 0x9a7a79f1 -//.word 0x45cb3a52 -//.word 0x10143d69 -//.word 0x2ee36db3 -//.word 0xa09ddbd1 -//.word 0x8bb26f8c -//.word 0x50f47391 -//.word 0x9e38e076 -//.word 0x14b8a0cf -//.word 0xf6e11012 -//// SHA512LongMsgvector_59 -//// vector length -//.word 0x0000BA88 -//// input message -//.word 0x4b91efb8 -//.word 0x61462b30 -//.word 0xb26bb5e8 -//.word 0xc8b08ab8 -//.word 0xa959f396 -//.word 0x069c5915 -//.word 0xb54a5a2c -//.word 0x62b21d39 -//.word 0x81c3e245 -//.word 0x8670dd8a -//.word 0x59594432 -//.word 0x04a7a762 -//.word 0xaf378077 -//.word 0xcffc0b90 -//.word 0x9a9e574c -//.word 0xbe679dd5 -//.word 0x5260d21d -//.word 0x0db77867 -//.word 0xb664b90a -//.word 0xdb0cb671 -//.word 0xc6261d67 -//.word 0xad5cf991 -//.word 0x2934cf3c -//.word 0xe9efe65a -//.word 0xa8b2e6c6 -//.word 0x5ce3a5d0 -//.word 0xb1d63df5 -//.word 0xb5a962ee -//.word 0xd56cf2ed -//.word 0x0885ce23 -//.word 0x4a53e985 -//.word 0x4c129ed0 -//.word 0x6aff47ca -//.word 0xddbc0bcb -//.word 0x32f5f77d -//.word 0xfa4450e0 -//.word 0xc4522891 -//.word 0x4840304b -//.word 0xe545cdae -//.word 0x4e986e3f -//.word 0x80901cb1 -//.word 0xf7095363 -//.word 0x210b1029 -//.word 0x13a62b4f -//.word 0x7b20e7db -//.word 0xd553c813 -//.word 0xe250a43f -//.word 0x5648fdb0 -//.word 0xd1ad8e01 -//.word 0x1194249d -//.word 0x665eaf81 -//.word 0x66979944 -//.word 0xe11e5654 -//.word 0x18863d82 -//.word 0x29bd96c1 -//.word 0xceebf42a -//.word 0x479dc544 -//.word 0x95232783 -//.word 0xe936fd0e -//.word 0x5cdf42c5 -//.word 0xe0949e83 -//.word 0x77a337a0 -//.word 0xa3d4cabb -//.word 0x1d49fab6 -//.word 0xc9aae801 -//.word 0xea7f031c -//.word 0x93dd2257 -//.word 0x5e45d0dd -//.word 0x5fc9e6f0 -//.word 0x5b706076 -//.word 0x36dc69b5 -//.word 0xab2ab85b -//.word 0x401a1fc1 -//.word 0x78706170 -//.word 0x4a9a45e5 -//.word 0xd292e891 -//.word 0x47065724 -//.word 0x2db75d0b -//.word 0xcb1f9a37 -//.word 0xe056d521 -//.word 0x9236940b -//.word 0xa7bee988 -//.word 0xf7b48e3e -//.word 0x218e34eb -//.word 0x7e9319a6 -//.word 0x533ed968 -//.word 0x4be386ca -//.word 0x2494fa10 -//.word 0xa8466c67 -//.word 0xdf30426b -//.word 0x837426ec -//.word 0xb4015cf2 -//.word 0xedb853fe -//.word 0x37ce7a93 -//.word 0x9c7154f5 -//.word 0xdfaecf31 -//.word 0x6a92d25d -//.word 0x888f1521 -//.word 0xd4223577 -//.word 0xf2b308ae -//.word 0x7cbd2eb5 -//.word 0x3f2ee896 -//.word 0xa8112d41 -//.word 0x796afb8b -//.word 0xc061ec76 -//.word 0x0aa309b3 -//.word 0xd406e265 -//.word 0x426cdf28 -//.word 0x14e9d152 -//.word 0xd528cc79 -//.word 0x550a3935 -//.word 0x5a912726 -//.word 0x93fde239 -//.word 0xcd34c728 -//.word 0x69675640 -//.word 0x0ef38967 -//.word 0x9b85645d -//.word 0x6082ce42 -//.word 0x8da69f59 -//.word 0xeaebfa0b -//.word 0xc9acdd2f -//.word 0x3a0af688 -//.word 0x7d8fb98f -//.word 0xbd11af73 -//.word 0xfbd9115f -//.word 0x480595fb -//.word 0x372b8835 -//.word 0x923f1d41 -//.word 0x4cb705de -//.word 0xb7ec3fdc -//.word 0xf7c432db -//.word 0xb78ef955 -//.word 0x1a2dfedf -//.word 0xf479caab -//.word 0x3be21b52 -//.word 0xb85737d0 -//.word 0x026681d0 -//.word 0xada44a2b -//.word 0xbf4fe9ab -//.word 0x63320e14 -//.word 0xe2c95365 -//.word 0xcea6145b -//.word 0x81138137 -//.word 0xc6f9f1c1 -//.word 0xd5007a8d -//.word 0x85f8be7d -//.word 0xbd780787 -//.word 0x2bc497b8 -//.word 0x39f43979 -//.word 0x3d531c12 -//.word 0xf006e16c -//.word 0x22eef31b -//.word 0xaccf179b -//.word 0xa5b144da -//.word 0xd986b4f7 -//.word 0x760e3b4a -//.word 0x09f8d8a4 -//.word 0xa94a8ad8 -//.word 0x7202647a -//.word 0x36fde4e6 -//.word 0x6e198184 -//.word 0x7797834b -//.word 0xfbc31784 -//.word 0xadd6a3d1 -//.word 0x391b576d -//.word 0x7a5105b5 -//.word 0xee5132e8 -//.word 0x68f06d2b -//.word 0x0527dfd0 -//.word 0x617124d7 -//.word 0x0b7559b5 -//.word 0x36e57655 -//.word 0xb1a6de5d -//.word 0x193135b2 -//.word 0x4d39723e -//.word 0x228e35f1 -//.word 0x58415a05 -//.word 0xcd09ce87 -//.word 0xf1e5a113 -//.word 0x7a035ddf -//.word 0x59e197fa -//.word 0xecb2c3d6 -//.word 0x75034d05 -//.word 0xcb9ee540 -//.word 0x4fae1aad -//.word 0x22252a62 -//.word 0x955b1825 -//.word 0xe1f70075 -//.word 0x1913a8cf -//.word 0x5c9b572a -//.word 0x4ff6eac4 -//.word 0xcae92420 -//.word 0xd2b8464f -//.word 0xc88edf70 -//.word 0xdf1ee673 -//.word 0xd48b0622 -//.word 0xd9853961 -//.word 0xd2b698b4 -//.word 0xc35c7203 -//.word 0x89379b9a -//.word 0xc9a50674 -//.word 0x270c96b9 -//.word 0xb8783285 -//.word 0xb98518eb -//.word 0x8180733a -//.word 0xb4c92f7e -//.word 0xba7b0c4a -//.word 0x6f4ff1b5 -//.word 0x1cbe84a3 -//.word 0xa766f746 -//.word 0x06af24e4 -//.word 0xf9aeddda -//.word 0xf94a7de1 -//.word 0x6b9dc390 -//.word 0x1a9de122 -//.word 0xe4fbcf7a -//.word 0xb44be564 -//.word 0xb066a91e -//.word 0xb30ce617 -//.word 0xfdcefef6 -//.word 0x292b80de -//.word 0x60fafdf0 -//.word 0xcd081812 -//.word 0x5001ddef -//.word 0x7794543f -//.word 0xaad25549 -//.word 0xa5d79da6 -//.word 0x2cad2247 -//.word 0xf96da4ba -//.word 0xfaa785a8 -//.word 0xb904daa3 -//.word 0x1c2ac21e -//.word 0x4ee0f7bd -//.word 0xfd73a2d0 -//.word 0xc658741a -//.word 0xed12f2d6 -//.word 0x525710fc -//.word 0xa06e02c0 -//.word 0xc8db4f5b -//.word 0xae3e270f -//.word 0x2179f665 -//.word 0x111139ba -//.word 0xfcd791f9 -//.word 0xaac715aa -//.word 0x1a30ed2c -//.word 0xbc151d3e -//.word 0xe1d39ec5 -//.word 0x6f05b3c9 -//.word 0xd9a57ac0 -//.word 0x4e74c10f -//.word 0x319b1cce -//.word 0xca9234cb -//.word 0x3b4162d2 -//.word 0xb5657d2c -//.word 0xeb36f066 -//.word 0xc7470f54 -//.word 0x5cadab54 -//.word 0x1d63e3d7 -//.word 0x4ced3e1e -//.word 0xb53cf742 -//.word 0x9bd29877 -//.word 0xf326ca91 -//.word 0xd04a6cc8 -//.word 0x1fcbe2b8 -//.word 0x94d9b0ac -//.word 0xe4a7471b -//.word 0x35151e73 -//.word 0xd28d0516 -//.word 0x242ab7a2 -//.word 0xde20ae76 -//.word 0x77583b72 -//.word 0xdd5ad5fd -//.word 0x6870b24d -//.word 0x0c0894e3 -//.word 0xd45be654 -//.word 0x8b4c074f -//.word 0xbc93e6dc -//.word 0xde1acfe2 -//.word 0xc8a784ec -//.word 0x6bbc902c -//.word 0xbfbcd8c1 -//.word 0xfe4e7335 -//.word 0x1106bb4a -//.word 0x4743a4f6 -//.word 0x4d534dac -//.word 0x5bded5dd -//.word 0xab8170bf -//.word 0x2fb9ba4d -//.word 0x83034b8f -//.word 0x21418b1b -//.word 0xd460c7dc -//.word 0x6f388512 -//.word 0xbeb3159a -//.word 0xbd326970 -//.word 0x082c2772 -//.word 0x9318fb66 -//.word 0x9b8e323f -//.word 0xdca9859c -//.word 0x05af3292 -//.word 0x69f452ab -//.word 0xf7fb662e -//.word 0x6cdf33a1 -//.word 0xc7f1d08d -//.word 0xfda3fd81 -//.word 0xefa5b659 -//.word 0x994d08c0 -//.word 0x8c3c24f4 -//.word 0x9e3fb2ca -//.word 0xe07367f1 -//.word 0xd0adda7a -//.word 0xd0189398 -//.word 0xd72065a5 -//.word 0x678fff66 -//.word 0xbff6bd90 -//.word 0x514fc48b -//.word 0x76e04d75 -//.word 0x6163416a -//.word 0x51630703 -//.word 0x0be9991c -//.word 0x8858dedb -//.word 0xeb9634ee -//.word 0xb66c4b13 -//.word 0x3c303ade -//.word 0x5aa1ccb7 -//.word 0x62121b22 -//.word 0x58cb6143 -//.word 0x61ac0aa1 -//.word 0x78130e2a -//.word 0x63007d77 -//.word 0xe5775c52 -//.word 0x3626af75 -//.word 0xb048d795 -//.word 0xcbc91e9f -//.word 0x4bab9142 -//.word 0xb8a80ead -//.word 0x0f199d9a -//.word 0xb716038b -//.word 0xb6df9553 -//.word 0x257a4bd9 -//.word 0xe19e1519 -//.word 0x84d0726b -//.word 0x94cc3e08 -//.word 0xfa26cbca -//.word 0xb5313433 -//.word 0xcf20eeb1 -//.word 0x906ba020 -//.word 0xf3753591 -//.word 0x566b2f4a -//.word 0x756f3e0e -//.word 0x99f6119e -//.word 0x0d6e6c7f -//.word 0xd2257bfe -//.word 0x93666672 -//.word 0xdbe525c1 -//.word 0x865c9625 -//.word 0x7677cc30 -//.word 0x87eeaa0e -//.word 0xc4f0b10b -//.word 0xdbc81754 -//.word 0xcebb1902 -//.word 0xec2f9254 -//.word 0x0013cb3c -//.word 0xc87a951e -//.word 0xa88995d4 -//.word 0xa094e0f5 -//.word 0x7c84c857 -//.word 0x4a7cf5d2 -//.word 0x11bcb747 -//.word 0xc0c59ae1 -//.word 0x65bd3b9b -//.word 0x9f165b03 -//.word 0x566b323d -//.word 0xa9aa054a -//.word 0x2878fb8b -//.word 0x44d12d80 -//.word 0x03effcd6 -//.word 0xf96ea7a1 -//.word 0x73ad1de6 -//.word 0xf5770f5c -//.word 0xe7e34a73 -//.word 0x8b784496 -//.word 0x3295f4ad -//.word 0xb010e7e7 -//.word 0x0d1e91b6 -//.word 0x7d73e11b -//.word 0x92aa1823 -//.word 0xb1e6dab2 -//.word 0xc3ba857f -//.word 0x2c46c360 -//.word 0x01a35bc8 -//.word 0x75824d8d -//.word 0x950f1def -//.word 0x361c6fd7 -//.word 0x2b7bd45c -//.word 0xbbabe48b -//.word 0x52b88d68 -//.word 0x765caa30 -//.word 0xfd6ad7e1 -//.word 0x7d6c84fc -//.word 0x058b498a -//.word 0x0ab0795d -//.word 0xa4e9fa98 -//.word 0xfb0e5472 -//.word 0xfba40736 -//.word 0x5001228e -//.word 0x8eb11102 -//.word 0xaf19b7bc -//.word 0xc35abd8e -//.word 0xe3792936 -//.word 0x67bc32e0 -//.word 0x595752ec -//.word 0x29479ef2 -//.word 0xa17f5303 -//.word 0x1c42b132 -//.word 0xf3d00c53 -//.word 0x39442003 -//.word 0xa8bda5e9 -//.word 0xdabc233b -//.word 0xbdcd0883 -//.word 0x416af8a3 -//.word 0x531c6416 -//.word 0x0fe35e7a -//.word 0x31d8ab4b -//.word 0xcd111af2 -//.word 0x41c515fe -//.word 0x67b076b1 -//.word 0x0fb99cbe -//.word 0xacd3bd51 -//.word 0x4d217d50 -//.word 0xcf5dc0e0 -//.word 0x517abd2c -//.word 0xe9885562 -//.word 0x95d9a2fd -//.word 0x7562d24a -//.word 0x37633625 -//.word 0xd24b9604 -//.word 0x77d6c838 -//.word 0xc478806f -//.word 0x3cfe6a7c -//.word 0xf473765b -//.word 0x8e40746f -//.word 0x6b98e00f -//.word 0x1d13ff41 -//.word 0x1b992bc5 -//.word 0xb9826a56 -//.word 0x57fb462c -//.word 0xd8acd9c5 -//.word 0x569828e5 -//.word 0x1344b2dc -//.word 0xb31b4807 -//.word 0xa9111e99 -//.word 0xf087239b -//.word 0xfb6e8e32 -//.word 0xeeb0b921 -//.word 0x0ecb338e -//.word 0x76bf1109 -//.word 0x0d2b84ca -//.word 0xb4b3b13a -//.word 0xc4a4bcb6 -//.word 0xb7db268f -//.word 0x25e35a55 -//.word 0xf35d8255 -//.word 0xc7a59f60 -//.word 0xbeb2d9ce -//.word 0x623e13c3 -//.word 0xd627c3b1 -//.word 0x5416011e -//.word 0xda5edea8 -//.word 0x1f27f646 -//.word 0xcccb49d0 -//.word 0xe98046c2 -//.word 0x9538293d -//.word 0xfbc5874e -//.word 0x81412773 -//.word 0x42ad145b -//.word 0xbfd8f0ee -//.word 0xd1828b8d -//.word 0xe3c2b59b -//.word 0x5da5503c -//.word 0x6318a95c -//.word 0xc00808f4 -//.word 0x1dc78588 -//.word 0x77b21ef5 -//.word 0xd0110769 -//.word 0x243e41b3 -//.word 0x9e0a6ebd -//.word 0x0c5ce456 -//.word 0x911b0035 -//.word 0x994ebc3b -//.word 0x128284f9 -//.word 0xda6c4672 -//.word 0x73d0c922 -//.word 0xfea23f3f -//.word 0x676a1d3e -//.word 0xdded2a99 -//.word 0x8509d6d0 -//.word 0x6fe1ceae -//.word 0xc93acdcd -//.word 0x5225b55c -//.word 0x12dfde20 -//.word 0x49f5aeb9 -//.word 0xa5ab6a27 -//.word 0xb79f4b8c -//.word 0xa8aad533 -//.word 0x280764d2 -//.word 0xa8b7080c -//.word 0xc923923a -//.word 0x1404ef6b -//.word 0xeb80b5a9 -//.word 0xbf95fc7f -//.word 0x84bb6fb8 -//.word 0x62c5a368 -//.word 0xae09a731 -//.word 0x18c0dcbf -//.word 0x26b00695 -//.word 0xe108a40c -//.word 0xce8b7d98 -//.word 0x1ff07c4e -//.word 0x2b89bda3 -//.word 0x1c24e877 -//.word 0xe72fbe52 -//.word 0x821ff1ed -//.word 0x511239f4 -//.word 0xe1b2a40a -//.word 0xd85d2e0e -//.word 0x2c84919c -//.word 0x94515ed7 -//.word 0x3c8d4d66 -//.word 0xbdc0d1bd -//.word 0x4c9af09e -//.word 0x319152df -//.word 0x7ccc986d -//.word 0xf340ef91 -//.word 0x4e19e472 -//.word 0xa75b7adc -//.word 0x2cc9793f -//.word 0x17060afb -//.word 0xe0fa81da -//.word 0xb0777ade -//.word 0x1a1c273e -//.word 0x067ae8ab -//.word 0xed761cd7 -//.word 0x4cee3838 -//.word 0x52a0160a -//.word 0xdc478f93 -//.word 0xa4064baa -//.word 0xb50ad87a -//.word 0x236cfa84 -//.word 0xf85442e3 -//.word 0x7164e2d4 -//.word 0x6b54c075 -//.word 0x18d9c9cd -//.word 0xf6cc880d -//.word 0x0288f715 -//.word 0x2994953a -//.word 0xff82b847 -//.word 0xb31625c1 -//.word 0x43abde70 -//.word 0xecd33b1a -//.word 0xe53e3c92 -//.word 0x4cdd1ef2 -//.word 0x61462c24 -//.word 0xf25bd8a7 -//.word 0x16260a8f -//.word 0x1e08b8ce -//.word 0xc913b7b3 -//.word 0xb7b4d1b0 -//.word 0x20951760 -//.word 0xc6c178c8 -//.word 0x280a93de -//.word 0xf9a8ca47 -//.word 0xd0229865 -//.word 0x21722491 -//.word 0x6c6416a5 -//.word 0xb43fa9be -//.word 0x33a70140 -//.word 0x4cc2c01a -//.word 0xc19ad44b -//.word 0x26c292a5 -//.word 0x963d09d0 -//.word 0xa49b9093 -//.word 0x9465a24f -//.word 0xccbbeccc -//.word 0x853ca338 -//.word 0xc6261b6d -//.word 0x93be9673 -//.word 0x62f35a46 -//.word 0xce3e06d9 -//.word 0x8fcc255a -//.word 0xaadf04b8 -//.word 0xe572c163 -//.word 0x7e1ca553 -//.word 0x1c36b34b -//.word 0x0640815f -//.word 0x938147b4 -//.word 0xe2ee3687 -//.word 0xca4d0b70 -//.word 0x149ae3e8 -//.word 0xe8aa510a -//.word 0x860eae96 -//.word 0x373ab03b -//.word 0x82e73e16 -//.word 0xa2b58376 -//.word 0x381542e2 -//.word 0x3e66695d -//.word 0x3c5ee8e8 -//.word 0xbeacc349 -//.word 0x05db660b -//.word 0xfd7a3ac6 -//.word 0x6f7a75a0 -//.word 0x78d73614 -//.word 0x3a7bd1f2 -//.word 0xd15f67a7 -//.word 0x88f3bbbf -//.word 0x4dc040a8 -//.word 0x634b77b9 -//.word 0x573d7772 -//.word 0x35c2cd06 -//.word 0xfb2f8716 -//.word 0x4ee78cc0 -//.word 0x6c7f2fd8 -//.word 0x62200375 -//.word 0x7f2df0b0 -//.word 0x082686a8 -//.word 0x2dcd92ca -//.word 0x3c87ef4f -//.word 0x15049f05 -//.word 0xde221a53 -//.word 0xf80fe677 -//.word 0x31ae6813 -//.word 0x3b3dfae8 -//.word 0x5d343ee1 -//.word 0x6870b153 -//.word 0xed908383 -//.word 0xada0a669 -//.word 0x51f525b3 -//.word 0x5b57b70d -//.word 0x5d6694a0 -//.word 0x683687d8 -//.word 0xc83d446b -//.word 0xee6ffd97 -//.word 0xaea730ab -//.word 0xab49c3c8 -//.word 0x0f2552e9 -//.word 0x7f9fc821 -//.word 0x4e0d2c24 -//.word 0xf061be09 -//.word 0xb208434e -//.word 0xa9129d1d -//.word 0xe8929ecd -//.word 0xf6481eac -//.word 0x807d4bfc -//.word 0x4a2f413b -//.word 0x6b6edba8 -//.word 0xba06c802 -//.word 0x845ee193 -//.word 0x80a0b96d -//.word 0x041a76f4 -//.word 0x78e5e09c -//.word 0x0cc4b8f4 -//.word 0xa64e4be4 -//.word 0x1e504732 -//.word 0xae6dcc4b -//.word 0xa407c641 -//.word 0x5a637b10 -//.word 0x68076025 -//.word 0x18673121 -//.word 0x1bc140da -//.word 0x7a460ea2 -//.word 0xcf7a18cd -//.word 0xb4ddf36d -//.word 0x7ccb9b60 -//.word 0x21a1098d -//.word 0x7e21036a -//.word 0xbe1838c2 -//.word 0x153d8cb5 -//.word 0xae5db100 -//.word 0xe4b5f77e -//.word 0xb4a065ef -//.word 0x727208f9 -//.word 0xbca38b6c -//.word 0xad3008ca -//.word 0x523e1e07 -//.word 0x6200448d -//.word 0x29dc5c83 -//.word 0xc6c98c4f -//.word 0x96fc4959 -//.word 0xf0c3b412 -//.word 0x13b12a36 -//.word 0x5cfb164e -//.word 0xbd220a78 -//.word 0x6ad20f6a -//.word 0xd50b39b5 -//.word 0xdd7e7e47 -//.word 0x423ac734 -//.word 0x5d8748b6 -//.word 0x0e120d72 -//.word 0xf54bd6fc -//.word 0xe50c259e -//.word 0x957b9555 -//.word 0x99316d1d -//.word 0x919c756e -//.word 0xa1a10907 -//.word 0x21866bea -//.word 0x95105ea8 -//.word 0xdfe8f0de -//.word 0xb3439700 -//.word 0x4cc27f55 -//.word 0x5d972343 -//.word 0x4bea1bcd -//.word 0x997b345a -//.word 0xa488c6b8 -//.word 0x90f14260 -//.word 0x829a0bfc -//.word 0x0f118726 -//.word 0xf5717573 -//.word 0x098681b0 -//.word 0x7131156b -//.word 0x130e73b6 -//.word 0x4d550127 -//.word 0xe7fee323 -//.word 0x4629cf5c -//.word 0xe2bc1d99 -//.word 0xfa4e1eb6 -//.word 0x8644afeb -//.word 0x6d390e51 -//.word 0xf8a4eca1 -//.word 0x86b4c33f -//.word 0x827f6978 -//.word 0x935ce608 -//.word 0x128d83e0 -//.word 0xc1222326 -//.word 0xba19d67c -//.word 0xa5caac85 -//.word 0x2e83c7a5 -//.word 0xb76fb409 -//.word 0x49bcfce8 -//.word 0xd1fcf508 -//.word 0x89ccde83 -//.word 0xb4b42bcb -//.word 0x8e4f1eec -//.word 0x83ac9711 -//.word 0x9ff32d4a -//.word 0x464c7d8c -//.word 0x25fcc2fa -//.word 0x68d1a762 -//.word 0x2dc1590b -//.word 0x39cedfae -//.word 0xea2daec2 -//.word 0x6da678fc -//.word 0x313e4617 -//.word 0x9c14c6d1 -//.word 0xfc89e636 -//.word 0xc0a3a120 -//.word 0xe8b419ff -//.word 0xba36e7d6 -//.word 0xb7faaf86 -//.word 0xcd82f74f -//.word 0xceab3994 -//.word 0x218e36de -//.word 0xb8a98e24 -//.word 0x413a8e4a -//.word 0xa1ec49e7 -//.word 0x9eb5ea4b -//.word 0xdbff48c1 -//.word 0x0a06bb11 -//.word 0x5d812f49 -//.word 0x3d8476bd -//.word 0x3fa5e34d -//.word 0x545e14e6 -//.word 0x40b20f4c -//.word 0x4d139116 -//.word 0x4084a2fa -//.word 0x8cfb6d4a -//.word 0xc6094fbf -//.word 0x59bc2e76 -//.word 0x7bc50c38 -//.word 0x5fd6dbfe -//.word 0xac4e93b4 -//.word 0x2f18833e -//.word 0xccd0e4b9 -//.word 0xbb28b403 -//.word 0xf18bc27d -//.word 0xdb00050f -//.word 0x5250316d -//.word 0xcc6b8c99 -//.word 0xcf08feaa -//.word 0xac8c68cb -//.word 0x692d3786 -//.word 0xff573943 -//.word 0xc64eaf0b -//.word 0x2d16a392 -//.word 0xae907c75 -//.word 0x01e5cfc0 -//.word 0x902778b3 -//.word 0x2c36eac6 -//.word 0xfee1c3ea -//.word 0xc04ea412 -//.word 0x2d9c3ff2 -//.word 0xb5c6b106 -//.word 0x76cb13d7 -//.word 0x680c4b7a -//.word 0xd7f52859 -//.word 0x17dfaf36 -//.word 0x7335af6c -//.word 0x66d69c78 -//.word 0x0ebb99b9 -//.word 0xdddad774 -//.word 0x924a1e1b -//.word 0x67a7a9cf -//.word 0x8cb83723 -//.word 0xd54f5f23 -//.word 0xb0712495 -//.word 0x59b7c97e -//.word 0x51f4e7e8 -//.word 0x0c18bce3 -//.word 0xe955c6ca -//.word 0x688090c7 -//.word 0x98b9cd99 -//.word 0xce4ea395 -//.word 0x9cdd49eb -//.word 0x01b9d42b -//.word 0xde8f4e08 -//.word 0xa94a095b -//.word 0x6533326b -//.word 0xd25da96b -//.word 0xe1401044 -//.word 0x6aa42395 -//.word 0x21c147f8 -//.word 0xc7a46588 -//.word 0x9dd4f8a0 -//.word 0x1e3665e5 -//.word 0xed2e8c86 -//.word 0x0d079cc2 -//.word 0x50952bab -//.word 0x1218862a -//.word 0x26644544 -//.word 0x113f239b -//.word 0x760b0d38 -//.word 0xd2a57987 -//.word 0x6a8cf9a3 -//.word 0x814610d4 -//.word 0xcdff4457 -//.word 0x2c74745d -//.word 0x940f6c55 -//.word 0x4853b76e -//.word 0x527bb458 -//.word 0x2d5eed4b -//.word 0xc296a34b -//.word 0x96e1aeaa -//.word 0x41c784ce -//.word 0x227e9735 -//.word 0x510ae4b5 -//.word 0xd5a8c809 -//.word 0x176d1689 -//.word 0x972b6839 -//.word 0xde94b205 -//.word 0xb4a21d4b -//.word 0x9236129a -//.word 0x5aff94ba -//.word 0x469dd4ec -//.word 0x1e06ff72 -//.word 0xaf295b52 -//.word 0x78d29258 -//.word 0xa6ce4e5a -//.word 0x434f05bf -//.word 0xaa921742 -//.word 0x3ebe16f4 -//.word 0x5b106480 -//.word 0x8d3504b3 -//.word 0x00f7aa3c -//.word 0x381c14b0 -//.word 0x028b9dd1 -//.word 0xabb1100f -//.word 0x6f23ba4f -//.word 0x3485c3ec -//.word 0x79aabefb -//.word 0x89fc7ed4 -//.word 0xf41f2bce -//.word 0x3fd19649 -//.word 0xdb15caf2 -//.word 0x5490e442 -//.word 0xcb332448 -//.word 0xa61a43a9 -//.word 0x86b407e5 -//.word 0x792516db -//.word 0x72e80890 -//.word 0xf6b9bf2c -//.word 0x17b2fb45 -//.word 0xa6b42960 -//.word 0xa5087cb5 -//.word 0xfb463f33 -//.word 0x6b766ac4 -//.word 0xc77673d2 -//.word 0x619c660a -//.word 0xc39b3860 -//.word 0xa0ab5953 -//.word 0x0ae48872 -//.word 0xe4ebeb1f -//.word 0x9bd15f93 -//.word 0x11380d22 -//.word 0xdab83ec0 -//.word 0xab8170c5 -//.word 0x0f41a8ed -//.word 0x5c480ba3 -//.word 0xe6eaa87f -//.word 0x7224990d -//.word 0xee834ad0 -//.word 0x5f421886 -//.word 0x1ab21eae -//.word 0x37df4b48 -//.word 0x4371b8dc -//.word 0x35d039bd -//.word 0xa38c338f -//.word 0x36fbad07 -//.word 0x5c24a9f2 -//.word 0x3cdbb479 -//.word 0xef2ebca3 -//.word 0xed00221b -//.word 0xc5f41034 -//.word 0x128d0d2a -//.word 0xaa93ceab -//.word 0x18b84f95 -//.word 0x4d7b2302 -//.word 0x924d0982 -//.word 0xc1f2bfa7 -//.word 0xb52b1bc7 -//.word 0xff9257fd -//.word 0xdac5ad71 -//.word 0x62c623d9 -//.word 0x00a2a940 -//.word 0x29516106 -//.word 0x48de3e29 -//.word 0xf8c8d0c2 -//.word 0x77a75ed3 -//.word 0x5712363f -//.word 0x77c1411a -//.word 0x32efda23 -//.word 0xd602e08f -//.word 0x586e0a09 -//.word 0x46d77bf6 -//.word 0xfc7697fd -//.word 0x1bbd14c7 -//.word 0x373e5403 -//.word 0xd0c9f2ae -//.word 0x84d49b91 -//.word 0x82201f0b -//.word 0x429ac710 -//.word 0x7480ea72 -//.word 0x36c4bb5f -//.word 0x89b5652c -//.word 0x06dc5a50 -//.word 0xcd24e7b4 -//.word 0xbf3f0d2a -//.word 0xed448c3a -//.word 0x4f9d4025 -//.word 0xba20b024 -//.word 0x0c7ce5f1 -//.word 0xaad77888 -//.word 0x2cb5ef2f -//.word 0x561c4ab4 -//.word 0x4af6d8f6 -//.word 0xfdb64fa6 -//.word 0xe83e1c4f -//.word 0x0000f894 -//.word 0xe764bcba -//.word 0x646a7666 -//.word 0x1191bca7 -//.word 0x53f74036 -//.word 0x8fc1a5fd -//.word 0x9bbd91d7 -//.word 0x73460497 -//.word 0x2e69e84b -//.word 0x3046e9c2 -//.word 0xa0b8864b -//.word 0x1d3868c0 -//.word 0xacfef3c3 -//.word 0xf56a1c48 -//.word 0xb0a37a54 -//.word 0x5a7e9f03 -//.word 0x2ca1a8d0 -//.word 0x4de81311 -//.word 0x4707d1c1 -//.word 0xb8719c82 -//.word 0x4a798be2 -//.word 0xe4b7e4de -//.word 0x22ae31a5 -//.word 0x03ab969e -//.word 0xe2f061ab -//.word 0xa812e3b0 -//.word 0x3fa07f4f -//.word 0x4a0500f6 -//.word 0x13b02f1c -//.word 0xc472a6c7 -//.word 0xdb27df52 -//.word 0xd898906d -//.word 0x38a03b65 -//.word 0xa78e00a6 -//.word 0x72cbb77e -//.word 0x3bbd3b23 -//.word 0xf0ea08f8 -//.word 0xfe61090c -//.word 0xc156abe3 -//.word 0x3f0c367a -//.word 0x17f85d85 -//.word 0xb42314fb -//.word 0xc6d0a1d4 -//.word 0xf35ff612 -//.word 0xc9713efe -//.word 0xf84db6b4 -//.word 0xbe82bee1 -//.word 0xa2ce30cc -//.word 0x653ff093 -//.word 0x3698c4b7 -//.word 0x25f666db -//.word 0xdab3d8c9 -//.word 0x878bf8b6 -//.word 0x1bfd54c7 -//.word 0xb9f43fd4 -//.word 0x68a7256b -//.word 0x0cbe1b18 -//.word 0x95b6bae3 -//.word 0x76862e1b -//.word 0x58838a52 -//.word 0x10815ea9 -//.word 0xcf3b8c4e -//.word 0x99f55742 -//.word 0xf95fbd60 -//.word 0xf2bd079b -//.word 0x38459e87 -//.word 0xa1c8201b -//.word 0xd695b3b5 -//.word 0x4e9b9a5e -//.word 0x7dcd064f -//.word 0x48cb2eb5 -//.word 0xbdbea1b2 -//.word 0x0183dba4 -//.word 0x890d17a9 -//.word 0x8d046563 -//.word 0xbab2fcf8 -//.word 0x2820d15d -//.word 0x8b7c69d5 -//.word 0xadbeebb4 -//.word 0x1c8c7969 -//.word 0x1f5ac0bb -//.word 0xefd5ce53 -//.word 0x2482247b -//.word 0x6ea20d25 -//.word 0x855a2e2f -//.word 0x63105de5 -//.word 0xb018b7c8 -//.word 0x7e90ec8e -//.word 0x3688de69 -//.word 0xd2676b8c -//.word 0x4d8986ec -//.word 0x582d8d43 -//.word 0x4f8fd65b -//.word 0x6b518c89 -//.word 0x391fb977 -//.word 0x4b93a327 -//.word 0x2d565c35 -//.word 0x9a89955d -//.word 0xf063b33c -//.word 0xe21b255b -//.word 0x6d08f469 -//.word 0x0d079bc8 -//.word 0x301d1a4c -//.word 0xeb5d463f -//.word 0xec0c63a8 -//.word 0xb004f4cc -//.word 0xf656d2f6 -//.word 0x73337c74 -//.word 0xc70daee2 -//.word 0xb0f935ab -//.word 0x7d5801cc -//.word 0xc6b67cdb -//.word 0x5bf21a48 -//.word 0x7a9f31e4 -//.word 0x45ab0c9f -//.word 0x723e3b96 -//.word 0x45e52c4d -//.word 0xbbf00038 -//.word 0x09199781 -//.word 0x4466ed05 -//.word 0x6250aaa0 -//.word 0x6124f4aa -//.word 0xc6aa88c1 -//.word 0x490509c9 -//.word 0xcfda9732 -//.word 0x98b4a479 -//.word 0xbaa703f2 -//.word 0xce3442c4 -//.word 0xe96d3a35 -//.word 0xce59e428 -//.word 0x619a6fe3 -//.word 0x5f4d8f16 -//.word 0x4d321719 -//.word 0xae0dca76 -//.word 0x794c6ea7 -//.word 0xcae92321 -//.word 0xd892f391 -//.word 0x2708aa65 -//.word 0xffc5e88e -//.word 0x1ce17484 -//.word 0xa736d38b -//.word 0x65c31a36 -//.word 0x2f4e0029 -//.word 0xa24d3722 -//.word 0x1707fd3b -//.word 0xd5f7ee69 -//.word 0x86711c49 -//.word 0xe888611c -//.word 0xc52ef40f -//.word 0x259d3bc1 -//.word 0xc2f6e0ff -//.word 0xbc2827d2 -//.word 0x8e147fbb -//.word 0x41ef573d -//.word 0xe0e7329c -//.word 0x2b09fee5 -//.word 0x8f62a12e -//.word 0x5664d61f -//.word 0x1c8c37b1 -//.word 0x82429a36 -//.word 0x2601a19a -//.word 0xd2b78de8 -//.word 0xf36f530f -//.word 0x4d2df2e7 -//.word 0xee19036f -//.word 0x60e09259 -//.word 0x23582cc8 -//.word 0x5a633958 -//.word 0xc5158d5f -//.word 0xef193972 -//.word 0xa950a72b -//.word 0xb6bce62a -//.word 0xc89d425a -//.word 0xacd91875 -//.word 0xc1a1e8cb -//.word 0xae52ac3f -//.word 0x54996892 -//.word 0x02db03e4 -//.word 0xe8d45577 -//.word 0xcf7e81b7 -//.word 0x07348577 -//.word 0xa0170f7e -//.word 0xddb19342 -//.word 0xe5d89af3 -//.word 0xbcd55dbb -//.word 0x72c69245 -//.word 0x9a41867c -//.word 0xfe3a6c95 -//.word 0x9127f44f -//.word 0xa5612079 -//.word 0x5ece54b5 -//.word 0x67bdac7d -//.word 0xe3119163 -//.word 0xa7a28f9d -//.word 0xa6e061c0 -//.word 0xacba4ecc -//.word 0x50beb969 -//.word 0x2481f370 -//.word 0x2e4153ad -//.word 0x9cc989e4 -//.word 0xb3952f11 -//.word 0x0937a1f4 -//.word 0xf4f90fcd -//.word 0x42c4d065 -//.word 0x2a40f94d -//.word 0x833d2f6a -//.word 0x3452b9b2 -//.word 0xecc3d930 -//.word 0x13a85d4e -//.word 0x004c7153 -//.word 0x6cd4b72b -//.word 0x26219a67 -//.word 0x09f7df84 -//.word 0x2c5e7c70 -//.word 0x5848ae4a -//.word 0xbf754669 -//.word 0xea9443a1 -//.word 0xf4aba6c1 -//.word 0xf6b88260 -//.word 0xc29953da -//.word 0xd4299095 -//.word 0x85ac8489 -//.word 0x826d59ff -//.word 0x7da57698 -//.word 0x229f0b92 -//.word 0x4d1ae947 -//.word 0x7aef98f6 -//.word 0x7df3a3c6 -//.word 0x731f3708 -//.word 0xf8eeecbd -//.word 0x9a07e358 -//.word 0x8e1c11c5 -//.word 0xa212daa9 -//.word 0x7362e2ec -//.word 0xe0bf2075 -//.word 0xbef93434 -//.word 0xcd21fa66 -//.word 0xebee5f14 -//.word 0x885f73dd -//.word 0x5aa2c0f6 -//.word 0x5235db6f -//.word 0xce4b38b8 -//.word 0x10714263 -//.word 0xef71ab2b -//.word 0xcc760136 -//.word 0xc8728397 -//.word 0x34bd3217 -//.word 0x4aff2b35 -//.word 0x1a4f336b -//.word 0xc69c94b3 -//.word 0xf24c284a -//.word 0x7724b3b4 -//.word 0x57687500 -//.word 0xf643004d -//.word 0x8768488d -//.word 0xc4faf989 -//.word 0xe2aa0d26 -//.word 0xc41f9de6 -//.word 0x6f9af7b1 -//.word 0xbedaf2d6 -//.word 0x563d7e4d -//.word 0xdd297f3f -//.word 0x67aadcc7 -//.word 0x315cd2fb -//.word 0x928c8f26 -//.word 0x2e9afc58 -//.word 0x6da1da21 -//.word 0x2c5a1099 -//.word 0xb23e43a3 -//.word 0xe5eba873 -//.word 0xbdc9164e -//.word 0xfaed6091 -//.word 0x123ee1f5 -//.word 0x6ed65811 -//.word 0xd5abf721 -//.word 0x296eb605 -//.word 0x51b3ed8d -//.word 0x765322f3 -//.word 0x720e1fa9 -//.word 0x85754855 -//.word 0x4a082c1b -//.word 0xea9b5a1a -//.word 0x90fe7639 -//.word 0x1ddc8c23 -//.word 0x1ce4a390 -//.word 0xf82796c7 -//.word 0x6cc11f60 -//.word 0x3cbc354f -//.word 0x2331981e -//.word 0x0cb0aa7a -//.word 0x85e280f1 -//.word 0x706d39fa -//.word 0xfb188e36 -//.word 0xd330abf5 -//.word 0x952a3dfc -//.word 0x8689cd86 -//.word 0x83034c88 -//.word 0x3bdfef39 -//.word 0x9ba13dd2 -//.word 0x8ae96692 -//.word 0xd799d606 -//.word 0x6f360a87 -//.word 0xd491a204 -//.word 0xcaa6b802 -//.word 0x54c471e0 -//.word 0xdeeed160 -//.word 0xbc82d463 -//.word 0xd318baf4 -//.word 0x96ada288 -//.word 0x35015a84 -//.word 0x103d7600 -//.word 0x72d99fcb -//.word 0x7cbd2eaf -//.word 0x5fa6faf6 -//.word 0xcfcc6d2c -//.word 0xb4c2de27 -//.word 0x229d1a45 -//.word 0x8b5844f5 -//.word 0x3377e079 -//.word 0xe5eb2aea -//.word 0xe536ac7c -//.word 0x25cf0f03 -//.word 0xbbc832b6 -//.word 0x93ae7933 -//.word 0x61b168c4 -//.word 0xda0470e1 -//.word 0x248708f6 -//.word 0x8ba40066 -//.word 0x757612cf -//.word 0x9831bb90 -//.word 0x6abe4988 -//.word 0xd9a53421 -//.word 0x3d30b18d -//.word 0x8bce8550 -//.word 0xcbb517ff -//.word 0xcccbca47 -//.word 0x16c78930 -//.word 0x2093a4a3 -//.word 0xc3f5da2b -//.word 0xef6fb7f8 -//.word 0x9d642029 -//.word 0x047b2c4b -//.word 0x1049351c -//.word 0x102a2f95 -//.word 0xaf6f3928 -//.word 0x25bf7247 -//.word 0xaeb70e25 -//.word 0x3bd4a9c0 -//.word 0x6893da1f -//.word 0xafd60cd8 -//.word 0xdb8a89d6 -//.word 0xbf87d859 -//.word 0x27b7493e -//.word 0x0f7bce81 -//.word 0x134a0c00 -//.word 0x279cb282 -//.word 0x88060af7 -//.word 0xf3a6ce02 -//.word 0x14c13cb4 -//.word 0x41ab6c9b -//.word 0x68e7e2fb -//.word 0x4690605b -//.word 0xdaf7fd43 -//.word 0x1a8e7b45 -//.word 0xe405d63a -//.word 0x37b219ce -//.word 0xa336753f -//.word 0xfe5e9461 -//.word 0x59472be6 -//.word 0x32c6cfdc -//.word 0xec060977 -//.word 0x7c73ac11 -//.word 0x64d7666f -//.word 0xe5c39646 -//.word 0x70315dfd -//.word 0x5f67f8b5 -//.word 0xe21f4d87 -//.word 0x3ce4c30c -//.word 0x2fbf5723 -//.word 0xb413edee -//.word 0xf0c6e31e -//.word 0x64a1ec71 -//.word 0x64fa1c78 -//.word 0xca903f9e -//.word 0xebb66f66 -//.word 0xcab4e6f4 -//.word 0x8c6a10cf -//.word 0x2c36e4e5 -//.word 0x701875d0 -//.word 0x1c14c457 -//.word 0x65d8d938 -//.word 0xa89f1225 -//.word 0x5c55ba0c -//.word 0x46fcdd9b -//.word 0xeb4e5b04 -//.word 0x4ba43cfd -//.word 0xcc16430b -//.word 0x75e4c601 -//.word 0x5c15bdc3 -//.word 0x625d1850 -//.word 0x1d445600 -//.word 0x1685530a -//.word 0x35b46148 -//.word 0x79249b3f -//.word 0xec08765a -//.word 0xd7d89976 -//.word 0x32f7efa3 -//.word 0x5e92fa29 -//.word 0x17cb6aca -//.word 0xa417ee47 -//.word 0x50e44a26 -//.word 0x1e80aab1 -//.word 0xb9363542 -//.word 0xaabae6be -//.word 0xcdc79760 -//.word 0x06065fb8 -//.word 0x30321ef3 -//.word 0x567a565c -//.word 0x26263d23 -//.word 0xa27e105d -//.word 0x19e7a94d -//.word 0x565054e2 -//.word 0x17ccdf80 -//.word 0xc180f004 -//.word 0x51c09b02 -//.word 0x96753450 -//.word 0x9ec262c9 -//.word 0x6ee7754b -//.word 0xf565fa02 -//.word 0x43638ce9 -//.word 0xf750ed8d -//.word 0xf6ca5515 -//.word 0x63be097f -//.word 0xcbd1302c -//.word 0x9fffe29f -//.word 0xe8828382 -//.word 0x36f64fe9 -//.word 0xd9ba35db -//.word 0x5499e90f -//.word 0x0faa35f3 -//.word 0x4c7490f2 -//.word 0x5c56f1f7 -//.word 0x1327e52d -//.word 0x7919e00a -//.word 0xc2e3d08b -//.word 0x811ff8c1 -//.word 0x18f0fc8c -//.word 0x73e938a7 -//.word 0xf62a56e4 -//.word 0xb3cc20b9 -//.word 0xe18092fc -//.word 0x897234eb -//.word 0x8374a76f -//.word 0xa1587da2 -//.word 0x2a9d4e8e -//.word 0x8a4f0738 -//.word 0x472886dd -//.word 0x37fb647b -//.word 0xf1531293 -//.word 0x8157282d -//.word 0x60f0f91e -//.word 0xa32e6b86 -//.word 0x72e8069c -//.word 0xbca34aae -//.word 0x29b54663 -//.word 0x50ab6644 -//.word 0x2be78d7a -//.word 0xc78e63d9 -//.word 0x40a1f11e -//.word 0xed696b75 -//.word 0xd8194c3f -//.word 0x71afa811 -//.word 0x831bbe00 -//.word 0x66a3ce1c -//.word 0x77862a3a -//.word 0xc5df8ef7 -//.word 0x0dcdb4f9 -//.word 0xe9d12478 -//.word 0x44774afd -//.word 0x1139ca6a -//.word 0x3ca0183b -//.word 0xe1ac430b -//.word 0xbd76115a -//.word 0xe214518d -//.word 0xaebd6d36 -//.word 0xfd2d3f96 -//.word 0x9e4b2561 -//.word 0x040a58c0 -//.word 0x3e8d799c -//.word 0x2a8e6d1a -//.word 0xe5006b62 -//.word 0x85f353a5 -//.word 0x0bb9425e -//.word 0x934763d8 -//.word 0xcedd08f0 -//.word 0xb2eaf91c -//.word 0x702a0bac -//.word 0xa711f550 -//.word 0xd76c60db -//.word 0x18463d46 -//.word 0x0c085bf8 -//.word 0x12e53944 -//.word 0xbc751934 -//.word 0x84a05585 -//.word 0xbabef6f2 -//.word 0xc1fc83b6 -//.word 0x7b02174c -//.word 0x02d3b679 -//.word 0x99f4e18c -//.word 0xe2d068e5 -//.word 0x515b80b4 -//.word 0xe0f61503 -//.word 0x049362f7 -//.word 0xe019be52 -//.word 0xb90ab93d -//.word 0xab636745 -//.word 0x9ac3fca3 -//.word 0x6bd099c0 -//.word 0x73d666f8 -//.word 0x2fb2e19e -//.word 0x36ef7641 -//.word 0x6d2e4f2e -//.word 0x7acb6d36 -//.word 0x7bbdf8b2 -//.word 0xf7bed3c4 -//.word 0x14ad74df -//.word 0x0b30f389 -//.word 0xda9d605f -//.word 0x39800000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x0000BA88 -//// expected output -//.word 0x398b4e5c -//.word 0x2570d043 -//.word 0xe9a4a037 -//.word 0xb0a01be4 -//.word 0x1ce56d58 -//.word 0xa26a6014 -//.word 0xad7dc5bb -//.word 0x435c86b4 -//.word 0xf8e1f8d9 -//.word 0x673b0e4a -//.word 0x50e1e548 -//.word 0x352475af -//.word 0x8b1081f3 -//.word 0xb618274a -//.word 0x77182a49 -//.word 0xa1d9e877 -//// SHA512LongMsgvector_60 -//// vector length -//.word 0x0000BDA0 -//// input message -//.word 0xe9f1f2cf -//.word 0x0b8d563e -//.word 0x2d20f39f -//.word 0x9f464a80 -//.word 0x8b136dba -//.word 0x364a6446 -//.word 0x83d0ce52 -//.word 0xb960cb94 -//.word 0x857f1adf -//.word 0x43b37ff4 -//.word 0x79f0689a -//.word 0xa453cff1 -//.word 0x38136203 -//.word 0xe2b4e29c -//.word 0x107dc95c -//.word 0xb32d2f0a -//.word 0x43eaee2b -//.word 0x047a05d3 -//.word 0x89b53abc -//.word 0x763a0495 -//.word 0x8a62a79c -//.word 0xdc72a16f -//.word 0x6415451f -//.word 0xbe09a687 -//.word 0x2b18b6dc -//.word 0xd94aaf85 -//.word 0x6459b22c -//.word 0x9c65ae15 -//.word 0x89e984ae -//.word 0xacee6968 -//.word 0x887e8bc6 -//.word 0x615cf7b3 -//.word 0x44f2ba19 -//.word 0x478b46af -//.word 0x12c21813 -//.word 0x9e3a9818 -//.word 0x3d904161 -//.word 0xdb8e012f -//.word 0x83a2e377 -//.word 0x258eeb38 -//.word 0x9660410b -//.word 0xd8a593fc -//.word 0x9cdab498 -//.word 0x05238947 -//.word 0xaf4025dc -//.word 0xf0bc336b -//.word 0x5d67945a -//.word 0x90074abb -//.word 0x294b95d9 -//.word 0x13005b11 -//.word 0x0987cde4 -//.word 0x5887484a -//.word 0xe6df7948 -//.word 0x73dfc5c4 -//.word 0x1fb7e899 -//.word 0x2c2fdce7 -//.word 0x0699fcac -//.word 0x80046999 -//.word 0x61b3ad1e -//.word 0x1fce9ec8 -//.word 0xea5685cc -//.word 0xec5e80e4 -//.word 0xd0792559 -//.word 0x816f6861 -//.word 0x3434bfac -//.word 0xa81a843a -//.word 0xac459a6f -//.word 0xe35f5369 -//.word 0xc48e9191 -//.word 0xe4a32c70 -//.word 0x789594c5 -//.word 0x152db8d4 -//.word 0xbb022600 -//.word 0x12a8739c -//.word 0xf325ddff -//.word 0x2aa42fd6 -//.word 0x7b6ee5bf -//.word 0xe3159113 -//.word 0x1ff27d02 -//.word 0x73d292e6 -//.word 0xa4ed78d1 -//.word 0x4618ff68 -//.word 0x3e3bbef5 -//.word 0x7f04fab7 -//.word 0x17ddc97d -//.word 0x6f1c7673 -//.word 0xce7a283b -//.word 0x20c7bf3f -//.word 0xf6dcff46 -//.word 0xcdd0f046 -//.word 0x936f8479 -//.word 0x67e77bb3 -//.word 0xa1c584f3 -//.word 0x1220a538 -//.word 0x8d14dc96 -//.word 0xa5730788 -//.word 0xb9b60188 -//.word 0x2e3a0edd -//.word 0xfca979b5 -//.word 0x6cb57b73 -//.word 0x200d5f4a -//.word 0x5389e40b -//.word 0x62a8e33b -//.word 0x8b3d3169 -//.word 0xf565c7be -//.word 0xf1bc20d6 -//.word 0x80d1e3ce -//.word 0x15d7c29f -//.word 0x9c9da2aa -//.word 0xbac0fc94 -//.word 0x571f8353 -//.word 0x5a8f0789 -//.word 0xb3d09911 -//.word 0x9fc0f0d8 -//.word 0x27cf0bef -//.word 0xeab318de -//.word 0x1d5d953a -//.word 0xd02bb57a -//.word 0x735f0506 -//.word 0x98d04f91 -//.word 0xfbdfbea9 -//.word 0xbfad448c -//.word 0xfa8b393e -//.word 0x74b245d8 -//.word 0xac357f23 -//.word 0x1c33d665 -//.word 0xbe51b17b -//.word 0xcf67d228 -//.word 0xd37a80ad -//.word 0xd9ebe59a -//.word 0x00edb5e3 -//.word 0x3a3c1036 -//.word 0x500daa8c -//.word 0x274029ff -//.word 0x41ddcedb -//.word 0x86be58f7 -//.word 0x45892546 -//.word 0x76e29ba9 -//.word 0x42dec607 -//.word 0xc5ba42a0 -//.word 0x12cd5c9e -//.word 0x77bb74ed -//.word 0x03eca64d -//.word 0x463ca9a6 -//.word 0x58f4f69b -//.word 0x1dfa2d61 -//.word 0xc644b5d2 -//.word 0x9b92a3bd -//.word 0xf85dde81 -//.word 0x960a80da -//.word 0x0c647ffa -//.word 0x96498cdc -//.word 0x14a33bd5 -//.word 0x569b656c -//.word 0x9609cb6b -//.word 0x462efb36 -//.word 0x0da5785c -//.word 0x0c97156c -//.word 0x652fa20a -//.word 0xfe4dca41 -//.word 0x827f3c1b -//.word 0xa92d096f -//.word 0xba134dfb -//.word 0x4ef412b2 -//.word 0x568d7157 -//.word 0x5fc9fa4b -//.word 0x153357a4 -//.word 0x06b02b7e -//.word 0xa96e4096 -//.word 0x9f18e215 -//.word 0x384c86a9 -//.word 0x394eb0da -//.word 0xddfe139c -//.word 0x1907f920 -//.word 0x245ae5f0 -//.word 0x37db773b -//.word 0x9259916d -//.word 0xbfc4b803 -//.word 0x1a9abd9e -//.word 0x91a39c56 -//.word 0xa9dea450 -//.word 0xc1bbd893 -//.word 0x9b8a9617 -//.word 0x1834761f -//.word 0x432975c9 -//.word 0x919953e4 -//.word 0x68e73901 -//.word 0xdd5b9fcd -//.word 0xc2176d9e -//.word 0xe04c604b -//.word 0x81adb041 -//.word 0x3224f0d3 -//.word 0xc6c435d2 -//.word 0x9e007a5e -//.word 0x281a43fb -//.word 0xa6de81e8 -//.word 0x318fb6ac -//.word 0xfd2259f1 -//.word 0xdeaa7c95 -//.word 0x0b14acff -//.word 0x231419af -//.word 0x6d5ff719 -//.word 0x641b23b4 -//.word 0x73930a4e -//.word 0xfd30c7a2 -//.word 0xa0a58b2c -//.word 0xbb69423c -//.word 0x2d6a734a -//.word 0x60006889 -//.word 0x871f90be -//.word 0x23d22153 -//.word 0xcce401a7 -//.word 0x2ee0e7a9 -//.word 0x523dbea5 -//.word 0x1fd24a5e -//.word 0x20900d5c -//.word 0x876f6c87 -//.word 0x72a90ef5 -//.word 0x6e278501 -//.word 0x3938309d -//.word 0xcd895fe9 -//.word 0x9952b904 -//.word 0x12cddb21 -//.word 0x6aec42de -//.word 0x9f4b6bd2 -//.word 0xb8643865 -//.word 0x4c0296e5 -//.word 0x43f85dd6 -//.word 0xe0127889 -//.word 0x004c45f0 -//.word 0x9c423eb0 -//.word 0x95e8da78 -//.word 0xb17bae91 -//.word 0xe0b7d8b7 -//.word 0xc54b9d28 -//.word 0x718a51fa -//.word 0x726377b1 -//.word 0x0c932a11 -//.word 0xc619bc31 -//.word 0x29ea9cd1 -//.word 0xc4e77ded -//.word 0x730cb493 -//.word 0xe1eae2f1 -//.word 0x4c57d4b2 -//.word 0x8864a78b -//.word 0x478f3010 -//.word 0x973a9bcd -//.word 0xac5c5192 -//.word 0xe077200e -//.word 0xf8ca969f -//.word 0xa9c7ad69 -//.word 0x5bc7aea6 -//.word 0x2cfd4f3c -//.word 0x38a81e95 -//.word 0x188d23ab -//.word 0xa8a5c162 -//.word 0x0d13de1b -//.word 0xf7584486 -//.word 0x24ca46b7 -//.word 0x2643a67d -//.word 0x6516b6ef -//.word 0x6747be47 -//.word 0x4ffb9ef4 -//.word 0xa42db4ea -//.word 0x54a3003d -//.word 0xf92086ee -//.word 0x5adcf405 -//.word 0x353185df -//.word 0x3c9725ca -//.word 0x5dd2d6cf -//.word 0x466a52cf -//.word 0x295cf2d2 -//.word 0xbc0fce9b -//.word 0x85892680 -//.word 0x54e30178 -//.word 0x11fa1376 -//.word 0xb768e4f5 -//.word 0xa1b32fd4 -//.word 0x05c38865 -//.word 0xbe9a42c1 -//.word 0x4e3f905e -//.word 0x23fbeae3 -//.word 0x19c8b33a -//.word 0x410718e7 -//.word 0xe1713b99 -//.word 0xbb5091ff -//.word 0x92ef88dd -//.word 0xeb4f6e5f -//.word 0x111b8ead -//.word 0x5bde9cbf -//.word 0xb1745373 -//.word 0x4dbf5cdd -//.word 0xbf9b72de -//.word 0x3413c4f8 -//.word 0xf7d59a60 -//.word 0x38e33c55 -//.word 0x0d8c10b1 -//.word 0xb69b02be -//.word 0x25ce284a -//.word 0xbe89a6fe -//.word 0x5bccd0eb -//.word 0x93638f66 -//.word 0x3c5c0616 -//.word 0x2ebe754b -//.word 0x4a785d91 -//.word 0xbb98e586 -//.word 0x7cbd7ce8 -//.word 0x1acfc0f2 -//.word 0xbced9ee9 -//.word 0x60a7bbf2 -//.word 0x676e1326 -//.word 0x5448e1e8 -//.word 0xd1c9be76 -//.word 0xf33e0cbf -//.word 0xbe2b9575 -//.word 0xecf87062 -//.word 0xeae725ff -//.word 0x24491043 -//.word 0x82f20bb9 -//.word 0x32ea47d5 -//.word 0xa9657b88 -//.word 0xe4f54112 -//.word 0xf4ffbc18 -//.word 0xb96c7ff6 -//.word 0xeea0aa56 -//.word 0x65b05602 -//.word 0x94cf34f6 -//.word 0x510a70ba -//.word 0xda36dcee -//.word 0x18264a26 -//.word 0x252139f9 -//.word 0x0b92b555 -//.word 0xcf027815 -//.word 0xae4455d6 -//.word 0xa6efd706 -//.word 0x3812253d -//.word 0x6d2228d1 -//.word 0x1737f0a5 -//.word 0x59785441 -//.word 0x69d4d928 -//.word 0x95f4d665 -//.word 0x846dd568 -//.word 0xbf393b10 -//.word 0x6f682c09 -//.word 0x6913a958 -//.word 0x6792fb34 -//.word 0x98ee5518 -//.word 0x5c99b516 -//.word 0x485d0b6e -//.word 0x71939d5f -//.word 0xe795aa3d -//.word 0x7f764dc4 -//.word 0xd6f0a5ac -//.word 0x929d337d -//.word 0xeb6a83a5 -//.word 0x6b4a0fc8 -//.word 0xf1276057 -//.word 0xfc1e7664 -//.word 0x26eb6ab5 -//.word 0xefa25217 -//.word 0xbca165f4 -//.word 0x20c26028 -//.word 0x59d52811 -//.word 0x1e4db0e5 -//.word 0x98391d49 -//.word 0xae76281f -//.word 0x8523c49f -//.word 0x475601a9 -//.word 0x240d3159 -//.word 0x976849dd -//.word 0xeb158a83 -//.word 0xfd0b6016 -//.word 0x437b8a6b -//.word 0x0d037b37 -//.word 0x0b260023 -//.word 0x10f92423 -//.word 0x151e5103 -//.word 0x81f6b743 -//.word 0xa813f124 -//.word 0x91ece603 -//.word 0xfcd5eee6 -//.word 0xa32e3755 -//.word 0xc1da666b -//.word 0xd1f3812c -//.word 0x98bb0c19 -//.word 0x65d67202 -//.word 0x98b7a71c -//.word 0x61590c53 -//.word 0xca2f93e1 -//.word 0xf85d2320 -//.word 0xad283e9c -//.word 0x12abe16d -//.word 0xb4ccabc4 -//.word 0xcc6f42c3 -//.word 0xc3eaf392 -//.word 0xf5b898af -//.word 0xb671bf85 -//.word 0x92f90841 -//.word 0xd9f8cfe1 -//.word 0x5c8b0b8d -//.word 0x713a762b -//.word 0x3d29ef2e -//.word 0x32921cae -//.word 0xd67253be -//.word 0xc683bbfa -//.word 0xfb6bae5f -//.word 0x4d336260 -//.word 0x35fac935 -//.word 0xd7ebb577 -//.word 0x406c40ea -//.word 0xec986b9a -//.word 0x8bf00529 -//.word 0x044dcf67 -//.word 0xbb1add23 -//.word 0x10bf3f41 -//.word 0x2860e10d -//.word 0xefc8b0cf -//.word 0x5da0fea0 -//.word 0xf9e5287b -//.word 0x9c997697 -//.word 0x78b842f4 -//.word 0x586d5d34 -//.word 0x2986aead -//.word 0xba261cbc -//.word 0xc0b9af5c -//.word 0x1d2df1f7 -//.word 0x62609b7c -//.word 0x92d46db1 -//.word 0x29aa5ecb -//.word 0x5ccef53c -//.word 0xa36ff7cc -//.word 0x75b242eb -//.word 0x52a7f945 -//.word 0x077ce198 -//.word 0x2ef00bc2 -//.word 0xf40bb41f -//.word 0x1f0c6911 -//.word 0x4fa46fe0 -//.word 0x836161c5 -//.word 0xe06d1b41 -//.word 0xae78d7b3 -//.word 0xa4f3962a -//.word 0x657fc278 -//.word 0x4aa51188 -//.word 0x62c7acf1 -//.word 0xb75691ca -//.word 0xd34635c1 -//.word 0x83bf6e67 -//.word 0xdb1691ce -//.word 0x7afbd756 -//.word 0x10f406c4 -//.word 0x1d0a4d94 -//.word 0xfbc16f91 -//.word 0x1e4e24a2 -//.word 0x9b05bce7 -//.word 0xe7110504 -//.word 0xe1676fbd -//.word 0x13fd6ec4 -//.word 0x353620ce -//.word 0xf3a130ec -//.word 0xf1e4fa19 -//.word 0x0bf3ef0f -//.word 0xe1863b60 -//.word 0x93c9a6c1 -//.word 0xc955b8a9 -//.word 0xf75f211b -//.word 0xdf2f58bf -//.word 0x57d48138 -//.word 0x4c1794b2 -//.word 0x07adbcba -//.word 0xafb1fd53 -//.word 0x0f511a46 -//.word 0x9ac7b6b9 -//.word 0xac8bb903 -//.word 0x13c6f5bf -//.word 0xce0a0a1f -//.word 0x14418684 -//.word 0x99e4514b -//.word 0x0c6e49e9 -//.word 0xe40f293a -//.word 0x5ca4af16 -//.word 0xbce7fe26 -//.word 0xdbe341f5 -//.word 0xe2ac914a -//.word 0x524c19b6 -//.word 0x49007769 -//.word 0x01a56649 -//.word 0x996d9a46 -//.word 0x18d6ece7 -//.word 0xafddb729 -//.word 0x3e6e828a -//.word 0x1a20df61 -//.word 0x0e1f9270 -//.word 0x9f69f6bc -//.word 0x943e9d9d -//.word 0xb6d13711 -//.word 0xd544b555 -//.word 0x0bd3aeb7 -//.word 0x455001a6 -//.word 0xfecfbc0b -//.word 0x4ea23cdc -//.word 0x248896ed -//.word 0xcf21360a -//.word 0xc4a5c644 -//.word 0x9bd65288 -//.word 0x5a33a976 -//.word 0xf66f066f -//.word 0x1721eff0 -//.word 0x1cbd5e1f -//.word 0x5fc31fa4 -//.word 0xba3679ba -//.word 0x4a501086 -//.word 0x72740aa7 -//.word 0x2364710e -//.word 0x5bb4d810 -//.word 0xec7f42b9 -//.word 0x7f583f64 -//.word 0xd8835888 -//.word 0x5c66add5 -//.word 0xd03add80 -//.word 0x630626db -//.word 0xefcece28 -//.word 0x7c07c1af -//.word 0x064f7b0e -//.word 0x805b28d1 -//.word 0x18310a42 -//.word 0xbd971c82 -//.word 0xdecbf5d9 -//.word 0x7574ee4b -//.word 0x45d9876c -//.word 0x5f510775 -//.word 0xebfa6396 -//.word 0x25ae618e -//.word 0xa633fd7a -//.word 0xe5b20cea -//.word 0xfd6b1f3a -//.word 0xb1a6aa20 -//.word 0xaded6681 -//.word 0x0e78f389 -//.word 0x25e9c2fa -//.word 0x783a32c4 -//.word 0x0af3f9d7 -//.word 0xdda0c635 -//.word 0xb482254b -//.word 0x1d85a281 -//.word 0xaf723110 -//.word 0x9166cd13 -//.word 0x3c8360e2 -//.word 0x81e5e39b -//.word 0xcdd7c601 -//.word 0xac47928a -//.word 0x8c78cdb3 -//.word 0xc4f71e97 -//.word 0xd4d0b1c0 -//.word 0xee01dd3d -//.word 0xb62f04f4 -//.word 0x4798bb3a -//.word 0x76492ba1 -//.word 0x5a91b711 -//.word 0x0cb5e01b -//.word 0xabe56589 -//.word 0xa36fae3a -//.word 0x2f336a2d -//.word 0x1d5778db -//.word 0xd23c03ca -//.word 0x8db0f25f -//.word 0xf0657ff4 -//.word 0xbca1252a -//.word 0xdc38c080 -//.word 0xa5b8f025 -//.word 0x5ce3be0b -//.word 0xf862823d -//.word 0x2ab70472 -//.word 0x9b74e1e2 -//.word 0x75aa3058 -//.word 0x24a56689 -//.word 0x5ed677a4 -//.word 0x60113e2a -//.word 0x7bf91f00 -//.word 0xd0b8ebc3 -//.word 0x58f3035b -//.word 0x27fcc1d3 -//.word 0xf14a1367 -//.word 0xcd2769df -//.word 0x39a9d21c -//.word 0x5ee361f1 -//.word 0x965cd634 -//.word 0x2cc17a14 -//.word 0x63d64bac -//.word 0xb9b259d9 -//.word 0x6c2c7049 -//.word 0x3e91f7d5 -//.word 0x75981811 -//.word 0x27972221 -//.word 0xb4f62bce -//.word 0x94e4f9d9 -//.word 0x534a238e -//.word 0xd9fd739d -//.word 0xef388f26 -//.word 0xff49d813 -//.word 0x1b8a93aa -//.word 0x41934762 -//.word 0xdeae65f6 -//.word 0x908c2eb9 -//.word 0x3036d229 -//.word 0x1045d5c6 -//.word 0x8156b725 -//.word 0x99b9d440 -//.word 0x33698910 -//.word 0x3641985e -//.word 0x1b6cced6 -//.word 0xa91ee35d -//.word 0x0381a1a4 -//.word 0xe5f348fd -//.word 0x2b6e326e -//.word 0x9347b304 -//.word 0xc31c436a -//.word 0x8e08dfba -//.word 0x7318ac93 -//.word 0x6603de6c -//.word 0xd415d828 -//.word 0xe16d94ea -//.word 0xf468462a -//.word 0x755d3c09 -//.word 0xd58b09e1 -//.word 0xcf4fe221 -//.word 0xee9b4858 -//.word 0x50a3e88f -//.word 0xa9d9bfdc -//.word 0x8a1c8134 -//.word 0xe42c3c81 -//.word 0xc86238f4 -//.word 0x709e239d -//.word 0x83806a39 -//.word 0x95dbea4b -//.word 0xed66c86e -//.word 0x8cb59de9 -//.word 0x6b68d784 -//.word 0x03a35c9a -//.word 0x12be7070 -//.word 0x9d3dd8c5 -//.word 0x31023faa -//.word 0x6fc1da94 -//.word 0xc8b548b0 -//.word 0x8491bc76 -//.word 0x09ba5d81 -//.word 0x5ab3ed9e -//.word 0xded8a923 -//.word 0x63507182 -//.word 0x623d291d -//.word 0x84355f5c -//.word 0x66f62efd -//.word 0x995562ac -//.word 0xee78dcd4 -//.word 0xf04539b4 -//.word 0xb11aaeb5 -//.word 0xcabf36fb -//.word 0x9d99f03a -//.word 0xdd20c2cb -//.word 0x519343ff -//.word 0xd4ead8b3 -//.word 0xa10c1d24 -//.word 0xcd428605 -//.word 0x15eb46cf -//.word 0xda726f59 -//.word 0x6a7e5ba8 -//.word 0x81684c08 -//.word 0x10f24f5b -//.word 0x3c3666b2 -//.word 0xaadce51a -//.word 0xfa901db9 -//.word 0x91b33819 -//.word 0x9c5164c3 -//.word 0x51543410 -//.word 0x78f7423c -//.word 0x2b7d1abc -//.word 0xda2253d1 -//.word 0x9252ff5e -//.word 0x7e1946f7 -//.word 0xaedb4d3a -//.word 0x17455d62 -//.word 0xdb834119 -//.word 0xcbb3ef8e -//.word 0x2a9a6bc8 -//.word 0xb496e93a -//.word 0xdfd43297 -//.word 0x61c348e7 -//.word 0xf2c94ddb -//.word 0x5334a15d -//.word 0x8f734b6c -//.word 0x81869a27 -//.word 0x96b30b27 -//.word 0xd57b6e12 -//.word 0x1ccc456d -//.word 0xac786db2 -//.word 0xe7e600a3 -//.word 0x590879dd -//.word 0xf68c19b0 -//.word 0xa2578a2e -//.word 0xf72fc382 -//.word 0x42b72b84 -//.word 0xcea1018a -//.word 0x661ffb80 -//.word 0x159a2d3b -//.word 0x30a72d0a -//.word 0x9637758e -//.word 0x370d08cc -//.word 0xd3765981 -//.word 0x043468b5 -//.word 0x7fbb2e93 -//.word 0x97a03b78 -//.word 0x034e9e4a -//.word 0xe0fb050b -//.word 0xfada25ae -//.word 0x47925c29 -//.word 0xb4f095cb -//.word 0x24d86dd0 -//.word 0xb6829433 -//.word 0x47e375c3 -//.word 0x39681979 -//.word 0x72ea4809 -//.word 0xa7dff2b7 -//.word 0xdacdce6c -//.word 0x21054109 -//.word 0xaa8d81fb -//.word 0xfc5efa10 -//.word 0x7fcff188 -//.word 0x3f526770 -//.word 0xed5e402b -//.word 0x27aca452 -//.word 0xf8a6a6be -//.word 0xa31d23e2 -//.word 0x9c3aed5e -//.word 0xd8b729d2 -//.word 0x464ef6f0 -//.word 0x9e7250d6 -//.word 0x593e339a -//.word 0x00ab0326 -//.word 0xaa052b46 -//.word 0xc1a005ff -//.word 0x04c7fa23 -//.word 0xd2f5ea22 -//.word 0xa548cd23 -//.word 0xdd329b53 -//.word 0xbf726a7d -//.word 0xbd42d6dc -//.word 0xf7d2a62d -//.word 0x03f6ad07 -//.word 0xe91bed6f -//.word 0x728003a8 -//.word 0xa3a3bf48 -//.word 0x84f91291 -//.word 0x26e12dfd -//.word 0xe3dbe71b -//.word 0xe8f55f9a -//.word 0xf187e3a3 -//.word 0x5420116d -//.word 0x41c03c0b -//.word 0x48481288 -//.word 0x1b2e7b35 -//.word 0x9675c442 -//.word 0xfcddfc8c -//.word 0x84579eb6 -//.word 0x14bb717b -//.word 0x4cbdad42 -//.word 0xc61e5ff3 -//.word 0x9c1f0e0a -//.word 0x2b3b9fea -//.word 0x17157673 -//.word 0x90b0ded6 -//.word 0xd3deaba8 -//.word 0xf3fb1e36 -//.word 0xd9da0819 -//.word 0x8900320a -//.word 0xa810fdf7 -//.word 0x3b874656 -//.word 0xb2a98cb9 -//.word 0x25bc55a2 -//.word 0xdd73cd99 -//.word 0x16adb17d -//.word 0x03606b18 -//.word 0x13cf7ff5 -//.word 0x73042576 -//.word 0xd47a3721 -//.word 0x6e1a4e3b -//.word 0x45682998 -//.word 0xabff4eb1 -//.word 0x063bf3f7 -//.word 0xd3351e67 -//.word 0xebf40c5f -//.word 0x05e1d0b0 -//.word 0x7d7c3cf4 -//.word 0x544e0422 -//.word 0x771e215f -//.word 0x44687417 -//.word 0x4a0bac4d -//.word 0x5042692f -//.word 0x99d5a1ee -//.word 0x679144cc -//.word 0xbef51b77 -//.word 0x6a2ef695 -//.word 0x444606a0 -//.word 0xb09888f4 -//.word 0x6a87a326 -//.word 0x836f9498 -//.word 0xa6dc084a -//.word 0xa0fac9f3 -//.word 0x1f4d9d51 -//.word 0xbaa26cbd -//.word 0x3246a002 -//.word 0xf875d16f -//.word 0xef15a22b -//.word 0x72a5e6c9 -//.word 0x9970081c -//.word 0xb806a94d -//.word 0x29ec8a2a -//.word 0x4c93adc1 -//.word 0xcb87b72e -//.word 0x23e999b1 -//.word 0x601f6f04 -//.word 0x27caa8eb -//.word 0xfaf8680c -//.word 0xb89c2a01 -//.word 0x633baaac -//.word 0x26e702ca -//.word 0x977113cb -//.word 0x39db26e2 -//.word 0x450cd358 -//.word 0xaac72325 -//.word 0x52def1c1 -//.word 0xa7a39638 -//.word 0x56a0c57d -//.word 0x5288b300 -//.word 0x1d6d7b82 -//.word 0x4332c228 -//.word 0x274496cf -//.word 0x01859ca0 -//.word 0x28896be4 -//.word 0x8d053319 -//.word 0x8884a245 -//.word 0xd85c088a -//.word 0xe5e1b9fb -//.word 0x47d8b3ae -//.word 0x8c2f8012 -//.word 0x36eb5e83 -//.word 0x04619e1c -//.word 0x73a94acd -//.word 0x83500aad -//.word 0xbe4d4891 -//.word 0x773693dd -//.word 0x50b4419a -//.word 0xff3559c9 -//.word 0x51e0b0f7 -//.word 0x6ece5112 -//.word 0x6077227b -//.word 0xcf6ac55c -//.word 0x0e42bd3c -//.word 0x5cd5d2d1 -//.word 0x63aeb615 -//.word 0x05bee89c -//.word 0x584ed924 -//.word 0xef384e6e -//.word 0x5c57054c -//.word 0xf23c9bfc -//.word 0xd022adb4 -//.word 0x1b243e7e -//.word 0x8aae5846 -//.word 0x2832f631 -//.word 0x551c2231 -//.word 0x0e075bd7 -//.word 0x6f313968 -//.word 0x762c5432 -//.word 0x0ad76120 -//.word 0x3c8d9e8d -//.word 0xcc9c7156 -//.word 0xeff94b33 -//.word 0x4f32d347 -//.word 0x54a341f5 -//.word 0xa2ed07f6 -//.word 0xe3a4b7a8 -//.word 0xc64821a9 -//.word 0x4777bba5 -//.word 0x3260476c -//.word 0xe27baf48 -//.word 0x4f78348d -//.word 0x4875c771 -//.word 0xfc73b71e -//.word 0xbf0b8d06 -//.word 0x0b5d3577 -//.word 0xc54a5e6f -//.word 0xc2e322b1 -//.word 0x8a20ea18 -//.word 0x5cd68c2c -//.word 0x72e3b7f3 -//.word 0x85ab910a -//.word 0x94c99ef3 -//.word 0xe2fee4b1 -//.word 0x3e6d4d92 -//.word 0x860b4c4d -//.word 0x6e51c34c -//.word 0x7e34254b -//.word 0x5a56d822 -//.word 0x467edddf -//.word 0xe946b218 -//.word 0x51137780 -//.word 0x384a51b7 -//.word 0x86c10c67 -//.word 0x1774048c -//.word 0xbd7a4513 -//.word 0x8937f1a7 -//.word 0x46d2e2c8 -//.word 0x47e9911d -//.word 0x6384360b -//.word 0x3d483186 -//.word 0xc9eea927 -//.word 0x0bf3737f -//.word 0x229035ac -//.word 0x86eccb29 -//.word 0x8e91e9eb -//.word 0x351c02a9 -//.word 0x1d39697b -//.word 0xd4cfb7a6 -//.word 0x57786cb6 -//.word 0xd434d9ce -//.word 0xb45e3d3d -//.word 0xd9df2e51 -//.word 0x24a13a70 -//.word 0x3b47cf64 -//.word 0x891b58f7 -//.word 0x8647a9c0 -//.word 0x38499d3c -//.word 0xfaa1fd21 -//.word 0x7ccca4ee -//.word 0x0b76e1c7 -//.word 0x12ec1d80 -//.word 0xe1d0bef8 -//.word 0xae104ba8 -//.word 0xd918d07b -//.word 0x754784e0 -//.word 0x03a0a91e -//.word 0x80c3b4e9 -//.word 0xa31bae32 -//.word 0x6058da43 -//.word 0xb020980a -//.word 0x940189b5 -//.word 0x57abf480 -//.word 0x145c68cb -//.word 0x799ba370 -//.word 0xca29b353 -//.word 0x29355b3b -//.word 0x14cfb8e0 -//.word 0x2f9f2445 -//.word 0x44d75b47 -//.word 0x8866dd76 -//.word 0x206f9325 -//.word 0xe3f9b4bd -//.word 0x62e8ea57 -//.word 0x252cb189 -//.word 0x3838007f -//.word 0xe7b52c4e -//.word 0xc5780986 -//.word 0xf3b25206 -//.word 0x9e674b15 -//.word 0xca22a4ae -//.word 0x4ee6a11a -//.word 0x206778c5 -//.word 0xd37afb4a -//.word 0x5ecb76d0 -//.word 0x1fcedb99 -//.word 0x20f81cd8 -//.word 0x982ed9c3 -//.word 0xb57e3bea -//.word 0x980d20c7 -//.word 0xa2507896 -//.word 0xee7fee67 -//.word 0x1e47cc71 -//.word 0x5bc018a9 -//.word 0x979e0393 -//.word 0x15ab8558 -//.word 0x2c75411a -//.word 0x4843ae84 -//.word 0x314e78a5 -//.word 0x902e24fe -//.word 0xaf93f4d9 -//.word 0x80350add -//.word 0xe10ecfe0 -//.word 0x1ec696fc -//.word 0xb76f7de5 -//.word 0x64729479 -//.word 0x57c94299 -//.word 0xc16fe438 -//.word 0x9715b6b1 -//.word 0x9617f75e -//.word 0x85ae4866 -//.word 0xba6756d6 -//.word 0xdfd4b8f4 -//.word 0xf6811bd0 -//.word 0x9b299c1b -//.word 0x892a753c -//.word 0x6037dca1 -//.word 0xa64d2853 -//.word 0x0be836ce -//.word 0xf1760b0f -//.word 0x2b0cbaee -//.word 0x055888ae -//.word 0x85d74fd3 -//.word 0xf1472033 -//.word 0x91602c50 -//.word 0xb6bfe5e5 -//.word 0xfc2360bf -//.word 0xcbdbfece -//.word 0x247f4b7c -//.word 0x9adf263d -//.word 0x9e392368 -//.word 0x00af2d45 -//.word 0xb3f77067 -//.word 0xd155763c -//.word 0xdec68fe2 -//.word 0x517e773c -//.word 0x50953346 -//.word 0xbcfe3ca5 -//.word 0x6db8df83 -//.word 0xbf48e499 -//.word 0x4d666e8d -//.word 0xfcf7227f -//.word 0x3c3b8bdf -//.word 0x8a48bd81 -//.word 0x39b739f3 -//.word 0x739d110e -//.word 0x7bbd4dcb -//.word 0x34fb8c58 -//.word 0xe714ef6b -//.word 0x418d32d7 -//.word 0x9be91c5d -//.word 0x7f1f1ac4 -//.word 0x674b272b -//.word 0xc7a4ee9f -//.word 0x4eae33e9 -//.word 0x69b16fa9 -//.word 0x0a69baa9 -//.word 0xa7ffee6b -//.word 0x85380a04 -//.word 0x36edd42d -//.word 0x61bbc398 -//.word 0xc1fb1b80 -//.word 0x70f45a84 -//.word 0x6650d3b5 -//.word 0x3ccd99ee -//.word 0x36359e64 -//.word 0x81901c7d -//.word 0xb99834e6 -//.word 0xaf6dd6e0 -//.word 0x688ae0da -//.word 0x69f88a45 -//.word 0x31c101a4 -//.word 0x08a852e2 -//.word 0xf7178ae9 -//.word 0x18591b70 -//.word 0x10098214 -//.word 0xd9cb27ab -//.word 0xc53a85d5 -//.word 0xbf218ad3 -//.word 0xd4ed419d -//.word 0xf362ae2e -//.word 0xf18efa23 -//.word 0xd0fbd084 -//.word 0x412906e2 -//.word 0x673b80a2 -//.word 0xdef15198 -//.word 0xfcd624d8 -//.word 0x57bbdbc8 -//.word 0x8763757a -//.word 0x2d803539 -//.word 0x34de0062 -//.word 0x56df0876 -//.word 0xe227a76c -//.word 0xbd988d4c -//.word 0xa7811ef9 -//.word 0xc012164e -//.word 0x4b146f6d -//.word 0xb1d78454 -//.word 0xc96b76b2 -//.word 0x5612cff8 -//.word 0xd2f665b2 -//.word 0x6a188218 -//.word 0x498941e0 -//.word 0x19dc3b57 -//.word 0xc7db63b0 -//.word 0x87792f9c -//.word 0x1908f91b -//.word 0x4aaca491 -//.word 0xbd10821c -//.word 0xeb577525 -//.word 0x69565535 -//.word 0x6a00920a -//.word 0x84211beb -//.word 0xb7507e38 -//.word 0xab1e5045 -//.word 0x3994cf68 -//.word 0x2dddc651 -//.word 0x4a3fb19a -//.word 0x8f50229f -//.word 0xb9666390 -//.word 0x094f5dc5 -//.word 0x4742b851 -//.word 0x071644d9 -//.word 0x2bb298a7 -//.word 0xa9c5f9fa -//.word 0x8fb77da0 -//.word 0x44df6fc7 -//.word 0x10f6f611 -//.word 0xdecbf2e6 -//.word 0x4139270e -//.word 0xb6569d7f -//.word 0x29ee4673 -//.word 0xba30e2be -//.word 0xc0a6205f -//.word 0x0e6b0655 -//.word 0x769892b4 -//.word 0x8cffa2f7 -//.word 0xac1c1198 -//.word 0x3f4823de -//.word 0x393023f7 -//.word 0xe6864a46 -//.word 0xe7f6e3fe -//.word 0x785cadf0 -//.word 0xf43481a1 -//.word 0x9a5134a0 -//.word 0x91d3bf16 -//.word 0x2a539d9f -//.word 0x66607558 -//.word 0xb82ff93a -//.word 0x0b8e0ea6 -//.word 0x071a2d40 -//.word 0x90b20901 -//.word 0x902b7288 -//.word 0xf74579b1 -//.word 0x00ded569 -//.word 0xb56685c1 -//.word 0xb593b741 -//.word 0x3556e97e -//.word 0x450d4eee -//.word 0x54fa73fc -//.word 0xf7f42258 -//.word 0xe65c8791 -//.word 0x475391e5 -//.word 0x302a9b58 -//.word 0x671a4c03 -//.word 0x6c36bbaf -//.word 0xb99dd7a2 -//.word 0x48f407b9 -//.word 0x56140db7 -//.word 0x67ff30dd -//.word 0x8a199abb -//.word 0xde95ff45 -//.word 0x552d7f29 -//.word 0xb816ce60 -//.word 0xeb339203 -//.word 0x73890c61 -//.word 0x35f3fb4e -//.word 0x8016bdbe -//.word 0x4e98b892 -//.word 0xc78df8b1 -//.word 0x0732195b -//.word 0x21de68ba -//.word 0x643545ba -//.word 0xdd9fcc1b -//.word 0x1cf9b4c5 -//.word 0x3b8a765b -//.word 0x1d38b212 -//.word 0xf4fbcfc4 -//.word 0x0693e340 -//.word 0xb076d2e5 -//.word 0xab0db96f -//.word 0x8e1f8d10 -//.word 0x948effc3 -//.word 0xa041a3dd -//.word 0x7e6152e4 -//.word 0x6cc8cda5 -//.word 0xd9b6a281 -//.word 0x6cc65408 -//.word 0x4821b6c9 -//.word 0x8ff29867 -//.word 0x241aa5f0 -//.word 0xb6248c6b -//.word 0xfa7b5eb0 -//.word 0x37da377d -//.word 0x080521c5 -//.word 0x5eb7354b -//.word 0xc4db0470 -//.word 0xe7fe3549 -//.word 0x55056ff5 -//.word 0x851b792e -//.word 0x18ee9f1d -//.word 0x5e1b5873 -//.word 0x1ce627b5 -//.word 0x8c2fbfd7 -//.word 0xa6a26a0d -//.word 0x9e2dabde -//.word 0xaeb7227a -//.word 0x150fb14d -//.word 0x6022ddd4 -//.word 0xe87277b0 -//.word 0x9cc37bf9 -//.word 0x001738d4 -//.word 0x76ddb148 -//.word 0xbd66444d -//.word 0xb7988926 -//.word 0x6fe67df1 -//.word 0x5a80e07d -//.word 0xddc6db5b -//.word 0x1003e638 -//.word 0xc258e96a -//.word 0xbdf6a1c8 -//.word 0x4a9046bf -//.word 0xf8116ba2 -//.word 0x9a8a2542 -//.word 0x8f6e6fbf -//.word 0x4601cd9d -//.word 0x000e301a -//.word 0xd8d81abf -//.word 0x01540236 -//.word 0x5095fa5b -//.word 0xfa888f95 -//.word 0x9ee1f167 -//.word 0x86555442 -//.word 0x2a0a959e -//.word 0xf54c2149 -//.word 0x4c8113fe -//.word 0xcd5f9c39 -//.word 0xd45ca84a -//.word 0x4466bea8 -//.word 0x84d52889 -//.word 0xc79e55af -//.word 0x91c97b85 -//.word 0x7725806a -//.word 0x263a1b4d -//.word 0xa67f377a -//.word 0xe0cd98b3 -//.word 0x5e14c083 -//.word 0x534d14cf -//.word 0xdbaf3bae -//.word 0x8326c77b -//.word 0x0c011728 -//.word 0x6cea7bd4 -//.word 0x161c9aa0 -//.word 0x7bd011bf -//.word 0xd1f85dcd -//.word 0x1330fb62 -//.word 0x49f2cde6 -//.word 0x0909c0a7 -//.word 0x3e48ac28 -//.word 0x287b7cbd -//.word 0xa49e8e54 -//.word 0xae4d5d96 -//.word 0x247c5d2f -//.word 0xcc682669 -//.word 0x99cdd500 -//.word 0x2a5aaf32 -//.word 0x94620815 -//.word 0x61d4642d -//.word 0xd96ddb3e -//.word 0x802cc25f -//.word 0xdf078750 -//.word 0x87dcdd0d -//.word 0x54aa19a3 -//.word 0xef01dc43 -//.word 0x96b7f395 -//.word 0x20dd7b4e -//.word 0x3bf14905 -//.word 0xf9558943 -//.word 0x8b00a4d9 -//.word 0x4c746876 -//.word 0x01f06378 -//.word 0x5ee68f03 -//.word 0xcdaf3550 -//.word 0x6c7e0b48 -//.word 0x54939f52 -//.word 0x21b1f969 -//.word 0xafd17c71 -//.word 0x21180ecb -//.word 0x28077927 -//.word 0x82f21099 -//.word 0xc0b395f0 -//.word 0x4d9f5a43 -//.word 0xacb9a7cc -//.word 0x01265cf9 -//.word 0xd3e1d7c1 -//.word 0x10b01835 -//.word 0x51572357 -//.word 0x600ba62e -//.word 0xf829dc1a -//.word 0xcb28b166 -//.word 0xc9cd271c -//.word 0xa09df81d -//.word 0x7f987d70 -//.word 0x2024cedb -//.word 0x05482bb0 -//.word 0x021a9bea -//.word 0xfb7bd278 -//.word 0xef0158d9 -//.word 0x3535e8e9 -//.word 0x06ff17fb -//.word 0x3c5e3627 -//.word 0x595c78e6 -//.word 0xcb4258dc -//.word 0x6f0835f4 -//.word 0x530f3fb2 -//.word 0xc01397c5 -//.word 0x785bb2dc -//.word 0x3c32ffbb -//.word 0x919bc98e -//.word 0xc4415e7d -//.word 0x2cad7180 -//.word 0xafbbbd75 -//.word 0x874feb70 -//.word 0x4644b652 -//.word 0x18a54d9d -//.word 0x4920f886 -//.word 0x07b7ff4c -//.word 0x68b9c8c9 -//.word 0xaff13f47 -//.word 0xcb1d7a94 -//.word 0x20a29e59 -//.word 0x8a7dfca7 -//.word 0x9f7d80d3 -//.word 0x35af4c84 -//.word 0x251aa00a -//.word 0x4eadfdf1 -//.word 0xdc768ad6 -//.word 0xca15b67a -//.word 0xa56f1f15 -//.word 0x93a7b3ed -//.word 0x954a1426 -//.word 0x09c941dc -//.word 0x732d746f -//.word 0x7c06461e -//.word 0x3ba419d8 -//.word 0xb48ab74e -//.word 0x9e20374d -//.word 0x6aa8214b -//.word 0x8073d240 -//.word 0xcc5521b7 -//.word 0x79564224 -//.word 0xfcaaeb78 -//.word 0x55e4b6f3 -//.word 0x9166c739 -//.word 0x941caea9 -//.word 0x156a8eea -//.word 0xea627fc6 -//.word 0x863b323c -//.word 0xc0fed4d0 -//.word 0xd6833426 -//.word 0xb19c27cf -//.word 0x6a902c63 -//.word 0x0ecb4cd0 -//.word 0x9ed344f1 -//.word 0x5a7ee663 -//.word 0x3f63bd94 -//.word 0xcf8ef01c -//.word 0x10786851 -//.word 0xd7363515 -//.word 0x46f02ef3 -//.word 0x9495d86b -//.word 0x0ccd8a89 -//.word 0x592fcebd -//.word 0x00b509e6 -//.word 0x2e6c5fb0 -//.word 0xb470d120 -//.word 0x5018a86d -//.word 0x2e6e1712 -//.word 0xaee21c21 -//.word 0x683fa7da -//.word 0x6eddfe7c -//.word 0xd019605b -//.word 0x6602e833 -//.word 0xc955b5bc -//.word 0xa3ac487e -//.word 0x29f22de7 -//.word 0xe51ade9b -//.word 0xb910e40b -//.word 0x21f03f49 -//.word 0xb877081b -//.word 0xfeb7554e -//.word 0x580e5d4c -//.word 0x5858ddf1 -//.word 0x3f64ba9b -//.word 0xc0a5e780 -//.word 0x072a8945 -//.word 0xfad059cc -//.word 0xbfb74a4d -//.word 0x7ef26da8 -//.word 0x688311f9 -//.word 0xf8862e6d -//.word 0x78ac0455 -//.word 0xc8ebff79 -//.word 0x5b74deaf -//.word 0x82e614ac -//.word 0xedc16e19 -//.word 0x6e1df7ea -//.word 0x019c19eb -//.word 0x0a9d049b -//.word 0xddb2543e -//.word 0x8355ed2e -//.word 0xbcd62a72 -//.word 0x40983891 -//.word 0x4a7dbca8 -//.word 0x579fbcbb -//.word 0x2b41bc49 -//.word 0x16052723 -//.word 0x755ff17e -//.word 0x7b497b46 -//.word 0x3238b7b5 -//.word 0xbc4f8c25 -//.word 0xdfd37c22 -//.word 0xc1e084c4 -//.word 0xef5a433b -//.word 0xa4255fac -//.word 0x4999253c -//.word 0x38306f6a -//.word 0xc582cba1 -//.word 0x7f74d90d -//.word 0xb3acf5af -//.word 0x324816ac -//.word 0x54cff6eb -//.word 0x3d6774de -//.word 0x5f4936a0 -//.word 0x40739241 -//.word 0x7e9caf5e -//.word 0x106de7f4 -//.word 0xceee7075 -//.word 0x343f3c1c -//.word 0x63881d7e -//.word 0x68322d63 -//.word 0xc1586dd3 -//.word 0x1d78ac74 -//.word 0x646fab13 -//.word 0xf7a47e80 -//.word 0x3983359f -//.word 0x4e2dbcbc -//.word 0x236d001f -//.word 0xaeef53e0 -//.word 0x77ac12fd -//.word 0x57a985aa -//.word 0x7fe106e8 -//.word 0xbd7f6659 -//.word 0xfb518c53 -//.word 0x097a5f33 -//.word 0x9c67e7f4 -//.word 0x9604ae00 -//.word 0x872f6d45 -//.word 0x746de48c -//.word 0xd8db0a06 -//.word 0xe9686628 -//.word 0x1c42bdb9 -//.word 0xeb8eed2a -//.word 0xd65c1925 -//.word 0xa8da0668 -//.word 0xfbc7c5d4 -//.word 0xfe2b93c1 -//.word 0x7646fd95 -//.word 0x03c64895 -//.word 0xa53d0ffb -//.word 0x7ed12e48 -//.word 0xda36dfdb -//.word 0x6cd923c3 -//.word 0xda5e64d2 -//.word 0x7d4d58f2 -//.word 0x620828bc -//.word 0x9401d247 -//.word 0x9d29cc3e -//.word 0x4aacea36 -//.word 0xafdb813e -//.word 0x6b69cdb7 -//.word 0x2ddb9066 -//.word 0x773afcc7 -//.word 0xa20bd3a4 -//.word 0x2381cde7 -//.word 0x0cf03aad -//.word 0xd685e89b -//.word 0x5d354775 -//.word 0x2cf3cbec -//.word 0xfb2692b8 -//.word 0x765a47e7 -//.word 0x40354675 -//.word 0x38ad001c -//.word 0xfb79a16d -//.word 0xaac5f120 -//.word 0xed2a78a9 -//.word 0x37dde60c -//.word 0x4c27b2f1 -//.word 0x011500fb -//.word 0x4370c856 -//.word 0x5bef358f -//.word 0x70ac4ba9 -//.word 0x4ed5cd6d -//.word 0x66a45e01 -//.word 0x1591e6bc -//.word 0x29c63739 -//.word 0xa1d3f1aa -//.word 0xb4a3a26f -//.word 0x15ae32e8 -//.word 0x76717f87 -//.word 0x4b1b4429 -//.word 0xd08a3fa6 -//.word 0x4d7593a6 -//.word 0x98eb6bb7 -//.word 0xdcfce09d -//.word 0x9ab61de9 -//.word 0xed53c0ce -//.word 0x12b0842f -//.word 0x27011dfc -//.word 0x33c464bf -//.word 0x67f3b472 -//.word 0xa47e9494 -//.word 0x3df8967c -//.word 0xfd907fec -//.word 0x80000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x0000BDA0 -//// expected output -//.word 0xf52e1999 -//.word 0x9a5773b2 -//.word 0x70b3ac58 -//.word 0xb152965e -//.word 0x6c5b37eb -//.word 0xb082d1f7 -//.word 0xa6d723ca -//.word 0x9cca7e2f -//.word 0xaf4bbcd9 -//.word 0x4ec326f1 -//.word 0x6d350592 -//.word 0xca7c3210 -//.word 0x675ed12a -//.word 0x03b559ba -//.word 0x66f9e681 -//.word 0xdff9ae71 -//// SHA512LongMsgvector_61 -//// vector length -//.word 0x0000C0B8 -//// input message -//.word 0xfe3ef26e -//.word 0x61c39720 -//.word 0xa8176696 -//.word 0xe1dc0725 -//.word 0x1db3261b -//.word 0x7e0124a5 -//.word 0x91f30df0 -//.word 0xdebfcb8f -//.word 0xbe2d991d -//.word 0x6d57ba23 -//.word 0x60ac6a3b -//.word 0xd93b1576 -//.word 0xb82fc7fc -//.word 0x9495e4f2 -//.word 0x0a6619a1 -//.word 0x55c192d4 -//.word 0x1f786d81 -//.word 0x97ce6fac -//.word 0xc47ff689 -//.word 0x19012fe1 -//.word 0x490a89b6 -//.word 0x5d526a2a -//.word 0x039a209d -//.word 0x29ed1a16 -//.word 0xca2658e4 -//.word 0x08b22085 -//.word 0x7c97f3c6 -//.word 0xcab5bf2c -//.word 0x784c5693 -//.word 0x00bf1f15 -//.word 0x23980b2d -//.word 0x81cbcb1c -//.word 0x673f418c -//.word 0xe88a3474 -//.word 0x2ffd473b -//.word 0x13e02c20 -//.word 0xecfe15d9 -//.word 0xa5656b7a -//.word 0x1367c399 -//.word 0x85e40eb0 -//.word 0x9dcc0fc2 -//.word 0x5edf1342 -//.word 0x85b7dc30 -//.word 0x1d09de85 -//.word 0x4e28aed1 -//.word 0x76cab723 -//.word 0x7b0f2f29 -//.word 0x5fbf4998 -//.word 0x14d3acce -//.word 0x923825b7 -//.word 0x28cf98ed -//.word 0x0fb83d23 -//.word 0x45d008c3 -//.word 0x987869d6 -//.word 0x01993625 -//.word 0x34e5e69d -//.word 0x755ffff8 -//.word 0xad1dd19a -//.word 0xbd4c65b9 -//.word 0x1276b1c1 -//.word 0x7a000df7 -//.word 0x36f7eb5c -//.word 0x500cc2d4 -//.word 0x2fdc4b87 -//.word 0x6875f088 -//.word 0xd71682b5 -//.word 0xef372ade -//.word 0x4ec9a229 -//.word 0x94bfa4b4 -//.word 0x76cda37d -//.word 0x0e70ba7f -//.word 0x752ee21e -//.word 0x941f67c5 -//.word 0x37ac9dce -//.word 0x6397cfa2 -//.word 0xea3c7821 -//.word 0x3c16b544 -//.word 0x8084fb00 -//.word 0xe4cd056e -//.word 0x3162112a -//.word 0xa2644cf9 -//.word 0xf6668bae -//.word 0xc4743b4e -//.word 0x0f549b72 -//.word 0x1a0b29ed -//.word 0x7da459af -//.word 0x792c8de9 -//.word 0x89014272 -//.word 0x394d876a -//.word 0x3bcdb41d -//.word 0xb8d75829 -//.word 0xe49b73e4 -//.word 0xd5a9e6f8 -//.word 0x95b32750 -//.word 0x76943938 -//.word 0xa592dcbf -//.word 0x02e00160 -//.word 0x2f6780e2 -//.word 0xe7c70d7d -//.word 0x9298693e -//.word 0x16f5d5ad -//.word 0xef3bccac -//.word 0x820ef1a2 -//.word 0xae9d47d9 -//.word 0xa527a025 -//.word 0xfabf58c7 -//.word 0xfb4c4290 -//.word 0x40d3e34a -//.word 0x84f9de53 -//.word 0xb4c3b08b -//.word 0x46a19d70 -//.word 0xccabea88 -//.word 0xc92a4d00 -//.word 0xc35aa292 -//.word 0x996edfac -//.word 0x17d54ace -//.word 0xc8bcea33 -//.word 0x0bd43bb5 -//.word 0x695526eb -//.word 0x26432f94 -//.word 0x16f0f138 -//.word 0xb2c2c70c -//.word 0x6b36cd17 -//.word 0x3f250793 -//.word 0x8946df96 -//.word 0x1df5d5f1 -//.word 0x94327258 -//.word 0xe5ed7dc4 -//.word 0x36817216 -//.word 0xf17e30fd -//.word 0x19abf219 -//.word 0xdf4b8061 -//.word 0x70a0a7c2 -//.word 0x12aee608 -//.word 0x6f416a02 -//.word 0x30313de1 -//.word 0xcee5bae2 -//.word 0xa516442d -//.word 0x4bd537fc -//.word 0x1fd01fff -//.word 0x25d12800 -//.word 0x1187d6c3 -//.word 0xa189f630 -//.word 0x3098d5b3 -//.word 0x8924afe4 -//.word 0xf9126a63 -//.word 0xa8bd8406 -//.word 0x283b4b37 -//.word 0x4fe14c97 -//.word 0x42090de8 -//.word 0xd312ff29 -//.word 0x0da9ae02 -//.word 0x0c473b63 -//.word 0x13fb0c69 -//.word 0xd86ac281 -//.word 0x22146bcf -//.word 0x96d9f9d1 -//.word 0xcebbf43f -//.word 0xace56b36 -//.word 0xeeed3096 -//.word 0x025645a9 -//.word 0x1b599105 -//.word 0x84e4d7b3 -//.word 0x35e4e990 -//.word 0xa4c019f4 -//.word 0xdd25f192 -//.word 0xd509249f -//.word 0xfbeac337 -//.word 0x1157b4fc -//.word 0x3ab26100 -//.word 0x5434ade5 -//.word 0x87312c42 -//.word 0x1e9e9349 -//.word 0x96d06da7 -//.word 0xf58610ac -//.word 0x5e2ad0ac -//.word 0xe15472a5 -//.word 0x9790e421 -//.word 0xef612b5e -//.word 0x43869cad -//.word 0xaf7b4f18 -//.word 0x2243d147 -//.word 0xb56519a5 -//.word 0x3c35bdbe -//.word 0x1b5466eb -//.word 0x5c7a8232 -//.word 0xfe733868 -//.word 0x8f68a198 -//.word 0xfd6035a9 -//.word 0xa906833a -//.word 0xbdad26d1 -//.word 0xc091f435 -//.word 0x67607818 -//.word 0xaef9a3f9 -//.word 0x2873be49 -//.word 0x9361a3cd -//.word 0xb0542d43 -//.word 0x52a2ed48 -//.word 0xb4661e79 -//.word 0x0fc8dbd9 -//.word 0x6c7f9073 -//.word 0xb794af40 -//.word 0x1668a44a -//.word 0x79f80a12 -//.word 0x71601f2f -//.word 0x459e7539 -//.word 0x4399ebe5 -//.word 0x5462dc71 -//.word 0xd3b99643 -//.word 0x9fd30ecd -//.word 0x6f5ad2b3 -//.word 0x66b63e30 -//.word 0xe88bf3b6 -//.word 0xab8285d4 -//.word 0x114d745d -//.word 0xb5e55ec7 -//.word 0x431672d1 -//.word 0x8e3e2868 -//.word 0xdc522fcc -//.word 0x8421a7ef -//.word 0xbcdd911e -//.word 0xacd784e2 -//.word 0xc78aa129 -//.word 0x5adbc9a1 -//.word 0x659f0d65 -//.word 0xab5e65db -//.word 0x0556a5dc -//.word 0xfbc3ae16 -//.word 0x955ee1af -//.word 0x6f24da2b -//.word 0x0c585a90 -//.word 0x6ccb84c8 -//.word 0xe15b4d46 -//.word 0x1eba2eed -//.word 0x91711b2d -//.word 0xf324b96f -//.word 0x1d17ccb3 -//.word 0x1df1ee77 -//.word 0x89c087db -//.word 0x133ef904 -//.word 0x5e531bbe -//.word 0x10dae965 -//.word 0x29a87a05 -//.word 0x93ca32c0 -//.word 0xf90f3870 -//.word 0xddc72a8e -//.word 0xe5c91053 -//.word 0x76bb8f1c -//.word 0x848d6013 -//.word 0xa947000c -//.word 0x7405a8ad -//.word 0x033f7fd2 -//.word 0xd44e0f2f -//.word 0xd82cf538 -//.word 0xc97cdd3d -//.word 0xbecaaeda -//.word 0xfd13028e -//.word 0x1088d9aa -//.word 0x1b8f8e6d -//.word 0x6c0b0a6d -//.word 0x54dd3738 -//.word 0x35abb73c -//.word 0xdddfd7e4 -//.word 0x12f3be04 -//.word 0x6eedeb77 -//.word 0x6e25de07 -//.word 0xc54e148c -//.word 0xf6b43958 -//.word 0x21c39ad3 -//.word 0x1dc9d963 -//.word 0xc8fde48f -//.word 0x9bbf2763 -//.word 0x82210116 -//.word 0xeaa775ea -//.word 0x1b4b2354 -//.word 0xc8c4765d -//.word 0xe4081e48 -//.word 0xb810c175 -//.word 0x33dbed85 -//.word 0x81b552bf -//.word 0xdfb92eb2 -//.word 0xad95081c -//.word 0xc48da10b -//.word 0x0bc32842 -//.word 0x45b5adde -//.word 0x2d07d83a -//.word 0xc583db0f -//.word 0xeb5ea5e0 -//.word 0x2dbc5895 -//.word 0xde77fe66 -//.word 0x691c78fa -//.word 0xe637b6d0 -//.word 0xebd12edf -//.word 0xa5368679 -//.word 0x27fc9475 -//.word 0x0140898d -//.word 0x15336905 -//.word 0xa6d6bf8e -//.word 0xb2018e69 -//.word 0x82aa8acf -//.word 0x7f648891 -//.word 0x472634fc -//.word 0x004e02ff -//.word 0xede56790 -//.word 0x3e25484b -//.word 0x2d38b35c -//.word 0x4643cda0 -//.word 0x06a30b07 -//.word 0xa877a53d -//.word 0x3c5e4889 -//.word 0xf9820cf5 -//.word 0xd4d5a5af -//.word 0x529addaf -//.word 0x9a28429a -//.word 0xceea1be6 -//.word 0x9baba140 -//.word 0x0f106c2a -//.word 0xab662ce9 -//.word 0xba9e999e -//.word 0xe196adb3 -//.word 0xf69b1078 -//.word 0x152bd40e -//.word 0xf1ff6285 -//.word 0x6949b441 -//.word 0x5c3ac5a2 -//.word 0xbdc746e4 -//.word 0xeaad9343 -//.word 0x39b2e563 -//.word 0xd42ec9f0 -//.word 0xc8cbd181 -//.word 0x588989c3 -//.word 0x9705acd3 -//.word 0x36fa98eb -//.word 0x9a080041 -//.word 0x31b4e12c -//.word 0x07b1b789 -//.word 0x945ef05d -//.word 0xd98fa1bc -//.word 0xab9078e9 -//.word 0x4e67f2be -//.word 0x455acd4e -//.word 0x69b1c1ca -//.word 0x39bd6ba1 -//.word 0x71198aeb -//.word 0xde306d08 -//.word 0x70ffac84 -//.word 0x911d173e -//.word 0xb5f8ecca -//.word 0x32614d13 -//.word 0x534bf045 -//.word 0xa7cf19ea -//.word 0x9f74c553 -//.word 0x58ae2839 -//.word 0xb6a45aa4 -//.word 0xb2364e0c -//.word 0xf53f03be -//.word 0xa517fe82 -//.word 0x7f5df77b -//.word 0x26f3d34e -//.word 0xba49d287 -//.word 0xaddf0a38 -//.word 0xd20514e2 -//.word 0xb7e60599 -//.word 0x35c49f64 -//.word 0x4585c9e3 -//.word 0x156f3d34 -//.word 0x5c308116 -//.word 0xea21184f -//.word 0x83cbf94c -//.word 0xedab4008 -//.word 0x4832242f -//.word 0x9e102982 -//.word 0xbbb2967d -//.word 0x3f092a37 -//.word 0xf18e0b8b -//.word 0x5683ff75 -//.word 0x837bdebe -//.word 0x2f1c48dc -//.word 0x0c249314 -//.word 0x58aa07e1 -//.word 0xaea74e99 -//.word 0x23b4264e -//.word 0x8e1559f2 -//.word 0x27f7efbf -//.word 0x54f6a2d6 -//.word 0xbfe29227 -//.word 0xacc33a90 -//.word 0x8a1aa349 -//.word 0xc76ad77f -//.word 0xe9f7993f -//.word 0xdbce5396 -//.word 0x840550f7 -//.word 0x9e442bdc -//.word 0xc68588b0 -//.word 0xcf1701ed -//.word 0x5ce96482 -//.word 0xae051b77 -//.word 0xba5bebd3 -//.word 0x7fc0e2be -//.word 0x96368ae3 -//.word 0x0b6e6318 -//.word 0x6b8b9041 -//.word 0x1e29d171 -//.word 0xf79eb153 -//.word 0x0a7f01c9 -//.word 0xbe6784d2 -//.word 0x23f3ecb1 -//.word 0x8511054c -//.word 0x417b31d2 -//.word 0xd77e14a0 -//.word 0x41009066 -//.word 0x83c1f485 -//.word 0x84e170bc -//.word 0x1ca3cd04 -//.word 0x6e705ab8 -//.word 0x781f2af9 -//.word 0xe8737c51 -//.word 0x31e57b96 -//.word 0xdfa42812 -//.word 0x27db94e0 -//.word 0xc3325299 -//.word 0xfd972c31 -//.word 0x093e151b -//.word 0x97e65fb4 -//.word 0xa95f2ede -//.word 0xa2492deb -//.word 0xa01e7fbe -//.word 0x0c73f92c -//.word 0x707a8ea8 -//.word 0x88cc0a20 -//.word 0x9b650422 -//.word 0x0bf00d43 -//.word 0x2c462ec1 -//.word 0x52319267 -//.word 0x2e757fb1 -//.word 0x5a118b31 -//.word 0x32c20c31 -//.word 0xe6c9d09a -//.word 0xcdee0e15 -//.word 0xfcc59d6f -//.word 0x18306442 -//.word 0x682512d2 -//.word 0x2eb10f35 -//.word 0x383db2b7 -//.word 0xb211b47c -//.word 0x3e16e467 -//.word 0x47e01d3b -//.word 0x91eb7500 -//.word 0x1525b8a9 -//.word 0x0dad15f3 -//.word 0x4bdb1690 -//.word 0xce80d685 -//.word 0x976f6ed1 -//.word 0xb93cb04f -//.word 0xb04318dd -//.word 0xf3ecffbe -//.word 0xcd2e123d -//.word 0x68520393 -//.word 0x2bfa7e0b -//.word 0x45615f64 -//.word 0x8ae42277 -//.word 0x7fc29a1a -//.word 0xb020e643 -//.word 0x4a50a271 -//.word 0xe5525a47 -//.word 0xa29b447a -//.word 0x76162eee -//.word 0xc569b51c -//.word 0x3379b8b7 -//.word 0xb7300c8f -//.word 0xf17e71b5 -//.word 0xbd9dc5e0 -//.word 0x089a780f -//.word 0xe2114070 -//.word 0xd5380e81 -//.word 0x751e4075 -//.word 0x393518d9 -//.word 0x890f6d77 -//.word 0x1865a07b -//.word 0x745dd2d4 -//.word 0xdc0c54dd -//.word 0x513a5f3d -//.word 0xef66060c -//.word 0x7e0a6837 -//.word 0x45212a25 -//.word 0x1ee5259a -//.word 0xd0dd5bdc -//.word 0x98173015 -//.word 0x09b3d7f9 -//.word 0x17a10aa8 -//.word 0x6eaafed6 -//.word 0x08b59629 -//.word 0xfe43d7e2 -//.word 0x9e3d9cc0 -//.word 0xbfef8a21 -//.word 0x5154476b -//.word 0x3894e7aa -//.word 0x5bcba77b -//.word 0xf70cde28 -//.word 0x3aa63014 -//.word 0x0da5055a -//.word 0x319c39b1 -//.word 0x8da21693 -//.word 0xc69b7f9e -//.word 0x11b96d3a -//.word 0x4542a07c -//.word 0x35938e4a -//.word 0x3c65a0c0 -//.word 0x194f9dd3 -//.word 0xfd8c6634 -//.word 0xe3ffe577 -//.word 0x20744075 -//.word 0x3b2952ef -//.word 0xfe8d5b74 -//.word 0xcd47f684 -//.word 0x377a4cf5 -//.word 0xcb478896 -//.word 0x2d948b13 -//.word 0x690ce018 -//.word 0x8667f2b9 -//.word 0x5fec7c12 -//.word 0xae34422a -//.word 0x6a30ff1e -//.word 0x536e9e7b -//.word 0xcb97aceb -//.word 0xe73d0e14 -//.word 0xc6d3efbd -//.word 0x21fdfd32 -//.word 0x240bd5ea -//.word 0x7cbfbb68 -//.word 0xb2578f5f -//.word 0xb7c7fc19 -//.word 0xc047f319 -//.word 0x530d5800 -//.word 0xa25cfbad -//.word 0x19bdc9a8 -//.word 0x338d44c1 -//.word 0x91b730f4 -//.word 0x4dc38f90 -//.word 0x8c10d099 -//.word 0x525d446a -//.word 0x9b8ed19e -//.word 0xa7adea31 -//.word 0x9530bee3 -//.word 0x337ab0dd -//.word 0x15a40897 -//.word 0xe47ce8f9 -//.word 0xf9ce81c1 -//.word 0x2ae38624 -//.word 0xe448e1b8 -//.word 0x7bd0a691 -//.word 0xbddc45aa -//.word 0xcdda0387 -//.word 0x2f0cab19 -//.word 0x1f8b80e2 -//.word 0x278b775a -//.word 0xf0e0a390 -//.word 0x59c2f114 -//.word 0xc6cd1515 -//.word 0xba4bc4c7 -//.word 0xa9b62407 -//.word 0x07798142 -//.word 0xa5f74193 -//.word 0x3dce1a2b -//.word 0x4c5d82f6 -//.word 0x1f84677c -//.word 0x31aa2105 -//.word 0xb405a500 -//.word 0x6e15fba5 -//.word 0xc672f2da -//.word 0x1fc81253 -//.word 0x6420d2fe -//.word 0xe4610b9e -//.word 0x6116adb5 -//.word 0x6371b1a8 -//.word 0xd2904e1e -//.word 0xc40070a9 -//.word 0x948066a8 -//.word 0x3407da6c -//.word 0xc4080799 -//.word 0x63f426cf -//.word 0x4501298a -//.word 0x052aac47 -//.word 0x3d7629e9 -//.word 0x557e6b5a -//.word 0x98294575 -//.word 0x8dbb8324 -//.word 0x840e21c5 -//.word 0x6f1ebbd3 -//.word 0xf3cc45c2 -//.word 0xbfdbfc2a -//.word 0x1d3f9c28 -//.word 0xc697d402 -//.word 0xfbf8f709 -//.word 0xd1ecf4c4 -//.word 0xcdba884a -//.word 0xb0e8b2f0 -//.word 0x94ff6824 -//.word 0x388e8899 -//.word 0x997111a5 -//.word 0xc25393e7 -//.word 0xe472e42c -//.word 0xa9a21593 -//.word 0xc695a4f0 -//.word 0xd059f36f -//.word 0x5022f97a -//.word 0x194a38dc -//.word 0xd996ef26 -//.word 0xefbb9051 -//.word 0x7c2174a6 -//.word 0xbde6cedb -//.word 0x9826de7f -//.word 0x747a6798 -//.word 0x4ebe628a -//.word 0x0918f43a -//.word 0x06359e74 -//.word 0xf5d6b48a -//.word 0xeb8c103e -//.word 0xb4bf07e2 -//.word 0x6af59cbe -//.word 0x4651f4b2 -//.word 0xb75a0a1d -//.word 0xb1ffa4fd -//.word 0x48d78657 -//.word 0x7dade5d9 -//.word 0x583b1ebe -//.word 0x3736a8f2 -//.word 0x658b4776 -//.word 0xeee98307 -//.word 0xb27f59fa -//.word 0xb907306b -//.word 0xc6030f96 -//.word 0x2f460c85 -//.word 0xebb708ec -//.word 0xed529951 -//.word 0xb06f486f -//.word 0x1447fddd -//.word 0x68b4b7eb -//.word 0xc83880cd -//.word 0xa941a1fb -//.word 0xb2ab12d7 -//.word 0xce873490 -//.word 0x7f1bc247 -//.word 0x75290571 -//.word 0x5f75487d -//.word 0x01818cb6 -//.word 0x869b7d6a -//.word 0x1819a44c -//.word 0xafe4dd17 -//.word 0x26330c74 -//.word 0x94990c1e -//.word 0xd942e844 -//.word 0x777a4e2f -//.word 0xa46e4024 -//.word 0x9d370d8c -//.word 0x3c148052 -//.word 0xcdf7578d -//.word 0x1e44f65f -//.word 0xd5d55d1c -//.word 0x064158af -//.word 0x055ef53a -//.word 0x79043bfd -//.word 0xb2141979 -//.word 0x3db99dd5 -//.word 0xb5ee6780 -//.word 0xdb415c18 -//.word 0xe9d69f8b -//.word 0x24aebd7c -//.word 0xb12927e8 -//.word 0xa9cae609 -//.word 0x703b8a7a -//.word 0x4291639d -//.word 0x0ed0f43a -//.word 0x88b2a568 -//.word 0x7aa4b8b1 -//.word 0x5a127e71 -//.word 0x22e4cb7f -//.word 0x5c49a70f -//.word 0x7cb346d7 -//.word 0x73233b71 -//.word 0x81a6e801 -//.word 0x4b1f3917 -//.word 0x2d4892d7 -//.word 0xd1f40557 -//.word 0x0197c948 -//.word 0xb907e7d9 -//.word 0x818437d8 -//.word 0xf9f78b1a -//.word 0xb6772a1e -//.word 0x4c1180ed -//.word 0xacc91344 -//.word 0xb1dcb9f5 -//.word 0xf548098b -//.word 0xe98e0f2d -//.word 0x25b744c5 -//.word 0xfc95bc61 -//.word 0x544ba2d9 -//.word 0xb410e2b2 -//.word 0x9f2f2542 -//.word 0x21520215 -//.word 0xa7017290 -//.word 0x146685d4 -//.word 0x105354e5 -//.word 0xa386370c -//.word 0x042b3879 -//.word 0xaba2c72d -//.word 0xad83af17 -//.word 0x49df487d -//.word 0xbec9ee9e -//.word 0x6015b396 -//.word 0xeb605181 -//.word 0x175163e3 -//.word 0x6d1dd448 -//.word 0x58519727 -//.word 0x7fcc980c -//.word 0x520af3f6 -//.word 0xe3a965fe -//.word 0xf825ff3a -//.word 0x5ee722e1 -//.word 0x807ea7b0 -//.word 0x382c5e8c -//.word 0xe4a4ba68 -//.word 0xbd12ca69 -//.word 0x645c6b48 -//.word 0xbea7bdf9 -//.word 0x021ed38a -//.word 0x10eeaf4d -//.word 0x05956d39 -//.word 0x0c5dbe8e -//.word 0x772398b8 -//.word 0x0e5d2c76 -//.word 0xa65c193b -//.word 0xf6cedfd5 -//.word 0xa786964c -//.word 0xaa80e00d -//.word 0xce1f1c47 -//.word 0x92badc96 -//.word 0x375799df -//.word 0x1ab6a67b -//.word 0x41926397 -//.word 0x3423b3da -//.word 0x0ee7b049 -//.word 0xd3a29d68 -//.word 0x04a41ba2 -//.word 0x714aa0eb -//.word 0x4fc726a4 -//.word 0x8a2420bf -//.word 0x5d86b223 -//.word 0x1fb02152 -//.word 0x60c88949 -//.word 0x345ecea8 -//.word 0xcfaad412 -//.word 0x5215f3d7 -//.word 0xe5fca5d0 -//.word 0x06b0828b -//.word 0x20c16fa8 -//.word 0x607c1283 -//.word 0xc4b28914 -//.word 0x75bb5b13 -//.word 0x56bbae5f -//.word 0xdd24bba0 -//.word 0x227c802b -//.word 0x3561b427 -//.word 0xb5ca00ee -//.word 0x9e8f6cb6 -//.word 0x632c1871 -//.word 0x3dc22cf2 -//.word 0xc25e1150 -//.word 0xb97ee28f -//.word 0x2dd11d7d -//.word 0xc03f9fdb -//.word 0x4229cfbd -//.word 0x82f21934 -//.word 0x64be9e29 -//.word 0x3479298c -//.word 0x3a1c65af -//.word 0x8f2b4eec -//.word 0x2f82e68e -//.word 0x4e5229ef -//.word 0xf06742dd -//.word 0xb4acff42 -//.word 0xf0f08304 -//.word 0x03ea3b2b -//.word 0xe77b1342 -//.word 0x0634e9ff -//.word 0x4f184126 -//.word 0x88a33baa -//.word 0xe60bc315 -//.word 0xdbc5082b -//.word 0x2f4b2fca -//.word 0x521d4815 -//.word 0xf10581d2 -//.word 0xc7a0990f -//.word 0xb61a980c -//.word 0x1639be55 -//.word 0x4d9db92f -//.word 0x9f461b35 -//.word 0x48560a43 -//.word 0xc8183993 -//.word 0x7f421826 -//.word 0x79774866 -//.word 0x8b105209 -//.word 0x9f1c9838 -//.word 0x4ca58cf1 -//.word 0xaa361faa -//.word 0x64997d37 -//.word 0x0ee5f7ed -//.word 0xb9b94008 -//.word 0xc5c2dd4a -//.word 0xf783d7e5 -//.word 0xcb55b39b -//.word 0x0caca324 -//.word 0xa19dfed0 -//.word 0xaa9dee6d -//.word 0xcc8c696b -//.word 0xc8f2623e -//.word 0x53884004 -//.word 0x22fa8f68 -//.word 0x44ebf5c6 -//.word 0xb4396890 -//.word 0x2f839ff0 -//.word 0x43e9c6ae -//.word 0xa9137655 -//.word 0xd475e491 -//.word 0xcad159dc -//.word 0x33fde259 -//.word 0xafe64800 -//.word 0x6dd542fc -//.word 0xfaf1ea51 -//.word 0x56066ec2 -//.word 0x4d8408f2 -//.word 0x04cb30c9 -//.word 0xd3a51019 -//.word 0x52143882 -//.word 0xb74f9393 -//.word 0x5f079931 -//.word 0xaaeec73d -//.word 0x0c7a4c71 -//.word 0x61e6068b -//.word 0x817bacae -//.word 0x150d4d05 -//.word 0xa9c8f9a9 -//.word 0x022dbec5 -//.word 0xb157d6f8 -//.word 0xe8831efa -//.word 0x8dcfca83 -//.word 0x8d425768 -//.word 0x730dc207 -//.word 0x3910f8e6 -//.word 0x5da08d97 -//.word 0x3888b0df -//.word 0x8c4d5f17 -//.word 0x5cb7d7d1 -//.word 0x008c4fbf -//.word 0x789fe5d1 -//.word 0x0109d99e -//.word 0xe6b7f905 -//.word 0x99255c14 -//.word 0x02685328 -//.word 0x17729d56 -//.word 0xad92da0a -//.word 0x8d3a42ee -//.word 0xcb05970e -//.word 0x53f85839 -//.word 0xc50938aa -//.word 0x83ddcfe8 -//.word 0x08d68eea -//.word 0x7b4df87f -//.word 0x831c0fed -//.word 0x5e600dd8 -//.word 0x2d7d5566 -//.word 0x9262a9a1 -//.word 0x7d0e9d1d -//.word 0x43524cda -//.word 0xf1d9496b -//.word 0xdf67d958 -//.word 0x885e5fc2 -//.word 0x98861745 -//.word 0x470d0723 -//.word 0xe6cd339e -//.word 0xb7ce11a5 -//.word 0x020c3cb3 -//.word 0x657a6cf5 -//.word 0x6c46a6ab -//.word 0x625fb0d0 -//.word 0x6635c8fd -//.word 0xc1c0958b -//.word 0x76c35ef8 -//.word 0x1b527a8b -//.word 0xe892083b -//.word 0x0ec0e0ce -//.word 0x4974c93e -//.word 0xb927ec60 -//.word 0xeef388c7 -//.word 0x429be8e7 -//.word 0x6bcb9276 -//.word 0x50a1c218 -//.word 0x1c6b163a -//.word 0x91b38b3e -//.word 0xa079a8d9 -//.word 0x36bff9ba -//.word 0x584bbf6d -//.word 0x72a8e67e -//.word 0xec6e37e1 -//.word 0xffc3cf91 -//.word 0xc722d078 -//.word 0x995b568f -//.word 0x96dbad46 -//.word 0x802ec126 -//.word 0xcdc2d5b5 -//.word 0xfaee789a -//.word 0x2232b501 -//.word 0xcfc18b41 -//.word 0x103c9dbc -//.word 0xccc12907 -//.word 0x55243e4c -//.word 0x407c2aec -//.word 0x75e23268 -//.word 0x82758781 -//.word 0x35a2759e -//.word 0x69a2dc6f -//.word 0x2043e4d0 -//.word 0xd2ecedf0 -//.word 0x05dbc5b2 -//.word 0x1eb21e53 -//.word 0x77323f4e -//.word 0xb146f97c -//.word 0x4c43dd80 -//.word 0x746eac62 -//.word 0x1ebf0f7a -//.word 0x54e48890 -//.word 0xcd89a941 -//.word 0xc1d784a4 -//.word 0xfb3a622e -//.word 0x3068b8d3 -//.word 0x8f9f566e -//.word 0x992de263 -//.word 0x33368583 -//.word 0xfab2e430 -//.word 0xd6b552c1 -//.word 0xd2f34328 -//.word 0x2b8304d1 -//.word 0xa6e3aace -//.word 0x273d4932 -//.word 0x80e866ba -//.word 0x8732aeb3 -//.word 0x6b5de817 -//.word 0x48e728fa -//.word 0xf80f4524 -//.word 0x2d948e00 -//.word 0xbcc0b9b5 -//.word 0x3ca51c92 -//.word 0xd0a720af -//.word 0x413af2d1 -//.word 0x50ed7b8f -//.word 0x4aa893b3 -//.word 0xdc3171e3 -//.word 0x29f56681 -//.word 0x1a06cccf -//.word 0xf5603957 -//.word 0x3270f88a -//.word 0x8ad7b9a7 -//.word 0x506b87de -//.word 0x047efbb6 -//.word 0x2664afac -//.word 0x482ff61c -//.word 0x67bdca65 -//.word 0x7bf50649 -//.word 0x4d4dd692 -//.word 0x898f6bfb -//.word 0x14def34d -//.word 0x9ff4c8c9 -//.word 0x7dade7c6 -//.word 0xb1c9a59b -//.word 0x4ced9dbf -//.word 0xf6eced2f -//.word 0xca45a210 -//.word 0x67ed7096 -//.word 0x434ea724 -//.word 0x438f62b5 -//.word 0x8916017a -//.word 0x8e4bdac4 -//.word 0x709f2c25 -//.word 0x8dce54d2 -//.word 0x5060444c -//.word 0x4b763040 -//.word 0x86c38aab -//.word 0x17d93141 -//.word 0xf3a6e610 -//.word 0x043eff61 -//.word 0x7cdb5fdf -//.word 0x6821a5fb -//.word 0x88a7a48e -//.word 0x5eb414c0 -//.word 0x8546862a -//.word 0x44599e37 -//.word 0x63657cd0 -//.word 0x3d297b38 -//.word 0x17a71e34 -//.word 0xb0704770 -//.word 0x1921aa1e -//.word 0xc72e82e0 -//.word 0xe7de82e8 -//.word 0xf1970f5d -//.word 0x805cac01 -//.word 0x6194b612 -//.word 0xea0d516e -//.word 0x8d40a2fa -//.word 0xadd73f43 -//.word 0xaf6ce366 -//.word 0x5594672e -//.word 0x471ced7d -//.word 0xf3925fed -//.word 0x970718b6 -//.word 0x9c14e0d3 -//.word 0x261b1e60 -//.word 0xe9cf4947 -//.word 0x3ef7a01b -//.word 0x766f1b44 -//.word 0x6e6fa15d -//.word 0x630f7bda -//.word 0x080b09ee -//.word 0xd6c4b3ac -//.word 0xa488236c -//.word 0x7713b170 -//.word 0x9b561fc7 -//.word 0xf3778772 -//.word 0x8d1891c6 -//.word 0x79dce911 -//.word 0xdc27f180 -//.word 0x4026b340 -//.word 0x2e1019e4 -//.word 0xffab6007 -//.word 0xef11ca32 -//.word 0x73b49300 -//.word 0xcda0277f -//.word 0xdd0092da -//.word 0x3ae43835 -//.word 0x8141c6d9 -//.word 0xed396891 -//.word 0x289d3d53 -//.word 0x61b10823 -//.word 0x9f2f2835 -//.word 0x558eca52 -//.word 0x36835d7c -//.word 0x4ac946d5 -//.word 0x421ed5bd -//.word 0x098e783b -//.word 0x9bf32f9e -//.word 0x1abd4064 -//.word 0x1fef2c5a -//.word 0x4e6ae105 -//.word 0x2d6e3141 -//.word 0x365e8328 -//.word 0x2ac3c935 -//.word 0xa994b2a9 -//.word 0x00b5202e -//.word 0x42bddcbb -//.word 0x9afc89b7 -//.word 0xdfbdd661 -//.word 0x69c8f86f -//.word 0x232b58f5 -//.word 0xe23a8889 -//.word 0xf5d57ca5 -//.word 0xfee9f74d -//.word 0x003943f1 -//.word 0xb85f2594 -//.word 0x310d102e -//.word 0x9399994f -//.word 0x3bb92b06 -//.word 0x118bfc01 -//.word 0x16d83ff5 -//.word 0x3d999c41 -//.word 0x7cbaddce -//.word 0x221fea39 -//.word 0x6be5f734 -//.word 0x52eafc29 -//.word 0xa68f6521 -//.word 0x60bc0be5 -//.word 0x34256462 -//.word 0x66ccf652 -//.word 0xdfc71219 -//.word 0x8044beed -//.word 0xb6caf33a -//.word 0x4fc20945 -//.word 0x8c356f0f -//.word 0x77d79f7c -//.word 0x764551b4 -//.word 0x218befca -//.word 0x51e94a9c -//.word 0x79d78bfa -//.word 0x3a466c0a -//.word 0x3129a8ea -//.word 0x1434af98 -//.word 0xfde39f0f -//.word 0x05bf70b3 -//.word 0x15dd6eef -//.word 0xf9a7ed1d -//.word 0xb6de38a6 -//.word 0x1ee0ca6a -//.word 0xa127c162 -//.word 0x66138f83 -//.word 0x9be9f3e6 -//.word 0x091b2827 -//.word 0xebca5c0b -//.word 0x00896365 -//.word 0xdf64ad3a -//.word 0x8b217523 -//.word 0x47c53cf3 -//.word 0xab5a769a -//.word 0xf8f08349 -//.word 0xa9e2e0d7 -//.word 0x4a5a9f64 -//.word 0x8d17143c -//.word 0x9b6ed2fd -//.word 0xa88fd6fd -//.word 0xca0a01e6 -//.word 0x0b92cca3 -//.word 0xbd003780 -//.word 0x0d9b028c -//.word 0xdb962042 -//.word 0xc9da6969 -//.word 0x92068f39 -//.word 0x9eb453bf -//.word 0xd3fff883 -//.word 0xad42f867 -//.word 0x9121f7d2 -//.word 0x5ecef50e -//.word 0x4685c7ef -//.word 0xdc59c8b6 -//.word 0x6d33cc34 -//.word 0x94185533 -//.word 0x09aa0a11 -//.word 0xbaf264ae -//.word 0x1d5cab89 -//.word 0xc4032125 -//.word 0x322f7db2 -//.word 0xed1c9ae9 -//.word 0xd4fe7138 -//.word 0xb341451f -//.word 0x15151dda -//.word 0x592a7740 -//.word 0x08b83beb -//.word 0x66c3ee99 -//.word 0x479d28d2 -//.word 0x24ac48cb -//.word 0x6e6d668b -//.word 0x22b9894c -//.word 0x9e481a24 -//.word 0xb37399e4 -//.word 0xfb3e8f41 -//.word 0x6d95c431 -//.word 0x2ed6b198 -//.word 0xaa903824 -//.word 0xe48b9375 -//.word 0x0a088b82 -//.word 0x4d49ea38 -//.word 0xf0543264 -//.word 0x9ef58fd2 -//.word 0x00020bb6 -//.word 0x8fe2014c -//.word 0xa750d4bc -//.word 0xdd5de040 -//.word 0x93b4b188 -//.word 0xca22735e -//.word 0x3756aa86 -//.word 0x98e524e8 -//.word 0x48912bf1 -//.word 0x11caff36 -//.word 0x4275835a -//.word 0x02ed3632 -//.word 0xe4476528 -//.word 0xbcdb9fdd -//.word 0xb0ff6a13 -//.word 0x921634c9 -//.word 0x6dca8ca7 -//.word 0x5d95929d -//.word 0xa486acc8 -//.word 0xfb427b95 -//.word 0x26490e28 -//.word 0xcb7a55ff -//.word 0x84dad8d2 -//.word 0x3391a8be -//.word 0x963596a3 -//.word 0x1b4ba4cb -//.word 0xf50bb9cc -//.word 0x6f6499af -//.word 0x80401351 -//.word 0xa0097d0a -//.word 0xdb6c5d8d -//.word 0x245d690f -//.word 0xeb5bb2ac -//.word 0xf2f51c06 -//.word 0x5c8d112f -//.word 0x075c76c9 -//.word 0x1bb6de6b -//.word 0xe38ffe47 -//.word 0xdc3f620a -//.word 0x0c825e04 -//.word 0x95c34689 -//.word 0x8a9ae197 -//.word 0x01931cb8 -//.word 0x6a31fc2a -//.word 0x1f32d63e -//.word 0x3c15c2fe -//.word 0xb0da4d12 -//.word 0x94096ee5 -//.word 0xbcf5bc03 -//.word 0x8c42ddc6 -//.word 0x0da54231 -//.word 0x40eb111c -//.word 0xb33d6391 -//.word 0x51a2b077 -//.word 0x7ec5876d -//.word 0x64f983f9 -//.word 0x877a7ae2 -//.word 0xa0f5f7da -//.word 0xa84beb60 -//.word 0x33939fe5 -//.word 0xff5eed2e -//.word 0xcd3eb0f9 -//.word 0x6f8979e3 -//.word 0x235a8489 -//.word 0x1fd9eaee -//.word 0x6dbc171d -//.word 0xf90e7f0f -//.word 0xe92f8dce -//.word 0x2c1ddcdb -//.word 0x56f1aacd -//.word 0xabad8a3c -//.word 0x793458dd -//.word 0xac9a72ee -//.word 0x9c9e25d5 -//.word 0x29756604 -//.word 0x0acac31f -//.word 0x62029961 -//.word 0x94c4863c -//.word 0x59b9213f -//.word 0x1090e93d -//.word 0x55467cac -//.word 0xd4a40a4b -//.word 0x5f090808 -//.word 0x3f692920 -//.word 0xc8968a88 -//.word 0x31be2c8c -//.word 0xa235a8b6 -//.word 0x8d751ef1 -//.word 0x42646fee -//.word 0xbed5acc7 -//.word 0xc450cee2 -//.word 0x3016a719 -//.word 0x87601817 -//.word 0xd2e88505 -//.word 0xadaa8667 -//.word 0x9becdf40 -//.word 0x9c7cb37d -//.word 0x0239f490 -//.word 0x80d41e5c -//.word 0x84d82551 -//.word 0xc6e8abd8 -//.word 0x214877f1 -//.word 0xa3a0231a -//.word 0xe0fc1474 -//.word 0x8b16b021 -//.word 0x47d8caf0 -//.word 0xba1d613c -//.word 0xe3b88b11 -//.word 0xaeb7ac91 -//.word 0xc6e9eb96 -//.word 0xab9de799 -//.word 0x04ada5d3 -//.word 0x36bbcea1 -//.word 0x35bb172d -//.word 0x9bb1004b -//.word 0xf7bcc1a1 -//.word 0x6754810b -//.word 0x69d0ca3e -//.word 0xee2b3aab -//.word 0xb0077ba6 -//.word 0xc6f275c7 -//.word 0x75e9c190 -//.word 0x4a1a6151 -//.word 0x65eeaf49 -//.word 0x1847940e -//.word 0xb107fa2f -//.word 0x93d18417 -//.word 0x8c137c34 -//.word 0x62440d59 -//.word 0xaf6ab261 -//.word 0xefe0ee16 -//.word 0xd8563e51 -//.word 0xea194c62 -//.word 0x469565b1 -//.word 0xc3182da6 -//.word 0x3fd891c7 -//.word 0x3338fe20 -//.word 0x8a47d0e8 -//.word 0xb4890e61 -//.word 0xf6fb5400 -//.word 0x045110ce -//.word 0xd182f10e -//.word 0xa6869d20 -//.word 0x725ea3a5 -//.word 0x6156b0e4 -//.word 0xaf87056d -//.word 0xbf9f28fb -//.word 0x67e5da9f -//.word 0x8e774a1b -//.word 0xfad6888c -//.word 0x63a53c4d -//.word 0xccae9817 -//.word 0x13268b6d -//.word 0xc6323837 -//.word 0x38aaa6ad -//.word 0xd41cb976 -//.word 0xb2146111 -//.word 0x689a1175 -//.word 0x23fd73f4 -//.word 0xf6cf5a65 -//.word 0x7131f882 -//.word 0x7651518f -//.word 0x4830ef3d -//.word 0xe5a9d7cd -//.word 0x96afbd78 -//.word 0xc4d6740f -//.word 0x0d14a8df -//.word 0x97c9cfd7 -//.word 0xa4fe5ded -//.word 0x67ea37bd -//.word 0x17bb6b73 -//.word 0x41931eec -//.word 0x62d0c618 -//.word 0xb59099a3 -//.word 0x4a7444d4 -//.word 0x58a5e1b5 -//.word 0xd4152374 -//.word 0x4208d409 -//.word 0xccd28219 -//.word 0x91e2751a -//.word 0x3fffe4b9 -//.word 0xe4d26878 -//.word 0x01a5b09c -//.word 0xe16a7746 -//.word 0x28ffb3e0 -//.word 0xafb00fba -//.word 0x8ffe9cf5 -//.word 0x7c9ec3a1 -//.word 0x55c57f22 -//.word 0xf8a3c9d8 -//.word 0x5b2d53ff -//.word 0xd92078d3 -//.word 0xc94373f8 -//.word 0x55ecd01a -//.word 0x8ac521d1 -//.word 0xabd0f2c7 -//.word 0xcba9ff1c -//.word 0x9a0ca409 -//.word 0x809694c4 -//.word 0xe8d0cea4 -//.word 0xdf69cd86 -//.word 0xddc3ff6f -//.word 0xe2b27973 -//.word 0xc580e9d5 -//.word 0xc934cc6f -//.word 0x7213e154 -//.word 0x9768ddb5 -//.word 0xb7816001 -//.word 0x91fa2850 -//.word 0xee3e8502 -//.word 0xc24a0ca3 -//.word 0x73b49012 -//.word 0x79ec4ee3 -//.word 0x27c36801 -//.word 0xc8299598 -//.word 0xee3b1632 -//.word 0x077dec20 -//.word 0x3163481b -//.word 0x5017432b -//.word 0x5d76cfc8 -//.word 0x015bed3f -//.word 0x62212158 -//.word 0x3d632336 -//.word 0x3506d87e -//.word 0x6a7a80bc -//.word 0x4e3c3102 -//.word 0xb4a084d2 -//.word 0x2acd8e3d -//.word 0x8909124d -//.word 0xca37f4a1 -//.word 0x1b9df157 -//.word 0x32eb8e2f -//.word 0xe2794eec -//.word 0xecd128fe -//.word 0x176d385f -//.word 0x83c2b5bb -//.word 0x3a7d23d3 -//.word 0x080cca23 -//.word 0x8d6066c2 -//.word 0x90f1208b -//.word 0x9603bd7a -//.word 0xb3281658 -//.word 0xa107c89b -//.word 0x0f5b2c88 -//.word 0x3b3f8a9a -//.word 0xc3a88927 -//.word 0xb933ea41 -//.word 0xf52176db -//.word 0xaf9f352c -//.word 0x4d4be159 -//.word 0x79f59a4e -//.word 0x77a2dbec -//.word 0xb5d7ad6a -//.word 0xa4141bf5 -//.word 0xc79ee59a -//.word 0x0a817966 -//.word 0x54d61ecc -//.word 0x5f427346 -//.word 0xc8bf183f -//.word 0x629fab31 -//.word 0xd0cef60b -//.word 0x535766d5 -//.word 0xe029bf96 -//.word 0x761c0f76 -//.word 0xae2fe120 -//.word 0x9413b26a -//.word 0xb5eea938 -//.word 0x7959829d -//.word 0xb3aacc44 -//.word 0x7779540f -//.word 0x2c5de1fd -//.word 0xe1f72151 -//.word 0xe532e4f1 -//.word 0x91c8880c -//.word 0x6909b4ff -//.word 0x64d84a7a -//.word 0x87f696de -//.word 0xb883ccea -//.word 0xd2c1b197 -//.word 0xf51c9840 -//.word 0x20679006 -//.word 0x0169dc73 -//.word 0x0b98a35e -//.word 0xca24e90e -//.word 0x7337bea2 -//.word 0xc07cb5af -//.word 0xfade982c -//.word 0x57925a8b -//.word 0x87574d29 -//.word 0x8afc95e8 -//.word 0xc423dd1a -//.word 0x534649a2 -//.word 0xa0f7ab55 -//.word 0x346cf9a7 -//.word 0xce3aff83 -//.word 0xb261517a -//.word 0x43898420 -//.word 0xd48b9db3 -//.word 0xbc33cafe -//.word 0xa845507d -//.word 0x36bdc5c2 -//.word 0xbf5b7f17 -//.word 0x735f4c65 -//.word 0xac926355 -//.word 0x7c859bb4 -//.word 0x881ddb1c -//.word 0x1a4fd2d1 -//.word 0x7129e8e9 -//.word 0x5c1274b0 -//.word 0x07522f4a -//.word 0x14d5e99a -//.word 0xed2b7a63 -//.word 0x59d4fcad -//.word 0x4ebb376b -//.word 0x07005d5a -//.word 0x55faf82c -//.word 0x3a7d20e6 -//.word 0xb458f187 -//.word 0xd7223cea -//.word 0x1e377ded -//.word 0x03fd0dd3 -//.word 0xcd6c99e7 -//.word 0xaacdd362 -//.word 0xfdc1678f -//.word 0xf986312d -//.word 0x6f76ad15 -//.word 0xe4d0af1d -//.word 0xe7bb543b -//.word 0xa28838ee -//.word 0xae38e9d9 -//.word 0x2c3e9cb1 -//.word 0x11861f5a -//.word 0xc1b50f4d -//.word 0xe0b34b3d -//.word 0x6467a8fa -//.word 0xefc1e795 -//.word 0x5dfee4c5 -//.word 0x98270f89 -//.word 0xb4db200f -//.word 0x384f07d5 -//.word 0xb993220e -//.word 0xae17b347 -//.word 0x7f6d914a -//.word 0xdf501e43 -//.word 0x5ce67821 -//.word 0x3442f43f -//.word 0x6b2dc844 -//.word 0x1a260748 -//.word 0x0aa7d338 -//.word 0x81aace7b -//.word 0x5c6cd1d5 -//.word 0x5e71e18c -//.word 0xc8c85eca -//.word 0x2a907e43 -//.word 0x78bbfa17 -//.word 0x601207fa -//.word 0xdb798892 -//.word 0x03758220 -//.word 0x24ebd063 -//.word 0x152b18ba -//.word 0xc92cfd88 -//.word 0x211996dc -//.word 0x040d1f52 -//.word 0xb21cef34 -//.word 0x5592aae5 -//.word 0xda7fb880 -//.word 0xfe73f6bc -//.word 0xac86ab13 -//.word 0x869bbd23 -//.word 0xc2e62554 -//.word 0x37aca0bb -//.word 0xb74aa73e -//.word 0xa079a2f9 -//.word 0xaed059e1 -//.word 0x138baba7 -//.word 0xca8a82e0 -//.word 0x289d0662 -//.word 0xb4fe11f1 -//.word 0x381fe31b -//.word 0x18a61860 -//.word 0xe3b6d796 -//.word 0x28714b8c -//.word 0x8bbb5780 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x0000C0B8 -//// expected output -//.word 0x00c0541a -//.word 0xf4657e42 -//.word 0x96c95c07 -//.word 0x6cc0b875 -//.word 0x04e771ae -//.word 0xcc78e225 -//.word 0x9b3dee92 -//.word 0xb0ef30f5 -//.word 0x9025653b -//.word 0x8119436a -//.word 0x86aba5e7 -//.word 0xb2155ba2 -//.word 0xd112532d -//.word 0x3542f5a9 -//.word 0x684a6277 -//.word 0x131ab387 -//// SHA512LongMsgvector_62 -//// vector length -//.word 0x0000C3D0 -//// input message -//.word 0x793d0bbd -//.word 0x04099f5f -//.word 0x4af6dcdd -//.word 0x71e139a2 -//.word 0xc4378613 -//.word 0xac137dce -//.word 0xdba69b2f -//.word 0xcbdc2e19 -//.word 0x673caef3 -//.word 0x081150f0 -//.word 0xa2c7d994 -//.word 0x4097b074 -//.word 0xad67383d -//.word 0x74eb5cf7 -//.word 0x0b116c8b -//.word 0x4c9c2783 -//.word 0x240e1912 -//.word 0x8fcc2754 -//.word 0xc47d68d6 -//.word 0xacb33659 -//.word 0x99cd85d3 -//.word 0x351c74b7 -//.word 0xb9442276 -//.word 0x5fe5c346 -//.word 0x197bf322 -//.word 0x83834912 -//.word 0x16e030ac -//.word 0x9f7cf2db -//.word 0xf03216df -//.word 0xd6ecec95 -//.word 0x4b0866f9 -//.word 0xec0129e9 -//.word 0xad4be42c -//.word 0xcb7ee1b2 -//.word 0x02b7da1d -//.word 0x013b0d81 -//.word 0x1b5e9268 -//.word 0x3fa4ed1a -//.word 0x2a25e01b -//.word 0xdb3683f4 -//.word 0x47459636 -//.word 0x4f0515bd -//.word 0xefcc0d32 -//.word 0xb839afd3 -//.word 0x8019a277 -//.word 0x588b9ecc -//.word 0xbe6337e4 -//.word 0x14cdf6f0 -//.word 0x5133ae4b -//.word 0xf7600dba -//.word 0x45e572f2 -//.word 0xadbbfe5a -//.word 0x882bee13 -//.word 0x09eb2836 -//.word 0x6f8a135c -//.word 0x7f0dac64 -//.word 0x32dbd770 -//.word 0xabd6f231 -//.word 0x6bcbb065 -//.word 0xc80c259d -//.word 0x9b5b1d44 -//.word 0x3a0ab2dd -//.word 0xa6611e8c -//.word 0x0540cdd8 -//.word 0x5205b7af -//.word 0x53b0ecaa -//.word 0xcb467093 -//.word 0xf2734a25 -//.word 0x2272d812 -//.word 0xd332654b -//.word 0xc9b1fd7b -//.word 0x8cac80d4 -//.word 0x197bf60f -//.word 0xd73722ae -//.word 0xcc1d5a85 -//.word 0x11379678 -//.word 0x8339c686 -//.word 0xbca96907 -//.word 0x42425b31 -//.word 0xfd9beee1 -//.word 0xef043d99 -//.word 0x1fb0bdc4 -//.word 0xd61a1542 -//.word 0x0ea13020 -//.word 0x287590a7 -//.word 0xddb7e599 -//.word 0x77dcdeb7 -//.word 0x41533f86 -//.word 0x3c673453 -//.word 0x1366e475 -//.word 0x51034ad2 -//.word 0xd2f940a5 -//.word 0x77f1dd7e -//.word 0x1ea6018a -//.word 0xd2472e14 -//.word 0x3e1d9a4c -//.word 0x686d8247 -//.word 0x9ca0c048 -//.word 0xa5a1a03e -//.word 0x4487f08d -//.word 0xda745611 -//.word 0x68bce760 -//.word 0xb94af450 -//.word 0xde4027ba -//.word 0xdbdecf7d -//.word 0xa0a579c5 -//.word 0x3bbcc08d -//.word 0x4b926662 -//.word 0xb8c5a36a -//.word 0xa143bca6 -//.word 0x96afd874 -//.word 0x08061058 -//.word 0xfd82c5fb -//.word 0x08be3674 -//.word 0x791c51c7 -//.word 0xd164caab -//.word 0x79ad6b91 -//.word 0xb381abe1 -//.word 0xd03c8187 -//.word 0xa4b57aae -//.word 0x37200acb -//.word 0xbd331fde -//.word 0xc888fcf5 -//.word 0xbd4345f1 -//.word 0x84f4568c -//.word 0x84bfd99b -//.word 0xcfba9891 -//.word 0x99968f45 -//.word 0xef8246f5 -//.word 0xa64c5e8a -//.word 0x91c9691d -//.word 0xf778ffbb -//.word 0x43620e65 -//.word 0xfe44715b -//.word 0xfbf0c49b -//.word 0xd1f177a4 -//.word 0x8e6e227f -//.word 0xaa511800 -//.word 0x3aa73f4a -//.word 0x664a1f91 -//.word 0x1dbe3824 -//.word 0x085a99aa -//.word 0xbca8aeab -//.word 0x330e5a53 -//.word 0x7dad4573 -//.word 0xb38978c9 -//.word 0x2dea2781 -//.word 0xf403cdfb -//.word 0x7ad27fcf -//.word 0x8947790f -//.word 0x7aa8fecc -//.word 0xa7345fdb -//.word 0x230759d8 -//.word 0xa83da36c -//.word 0xd05ac8cc -//.word 0x88ea3382 -//.word 0xc2648870 -//.word 0x6b543b12 -//.word 0x9db95b03 -//.word 0x15acaec3 -//.word 0xe74303b7 -//.word 0x70b5c471 -//.word 0x8dbfcb32 -//.word 0x0a4676ad -//.word 0x5e3dfe0e -//.word 0x95c9043b -//.word 0x8da36d5a -//.word 0x65bf7093 -//.word 0x332bed17 -//.word 0xf5390161 -//.word 0xcbe0d7bc -//.word 0x6360c105 -//.word 0xb42587b2 -//.word 0xefeeff13 -//.word 0xb22eddd8 -//.word 0x7fb2cdd4 -//.word 0x6e85bf00 -//.word 0x1e1182c3 -//.word 0xf1869570 -//.word 0x79803a11 -//.word 0x2de4cb63 -//.word 0x610a5121 -//.word 0x75225385 -//.word 0x4cd0ec0d -//.word 0xff1a207b -//.word 0xd384701f -//.word 0x6979ac58 -//.word 0x35ed0959 -//.word 0x31417429 -//.word 0xd36725ed -//.word 0x3c46766a -//.word 0xb260f6c6 -//.word 0x50b2b98e -//.word 0xfcdbf3fe -//.word 0x9a81c57c -//.word 0x7ff15765 -//.word 0x2905270c -//.word 0x2d4ba100 -//.word 0x7063ef8e -//.word 0x9aa91287 -//.word 0xc8153244 -//.word 0x825f32e6 -//.word 0xec6688e2 -//.word 0x40d24cbe -//.word 0x7bf88e15 -//.word 0x57ffede1 -//.word 0x7a4165fa -//.word 0xedf469d9 -//.word 0xcf0a32a2 -//.word 0x4b555662 -//.word 0xc7ef9c94 -//.word 0x5ed90feb -//.word 0x91e2514b -//.word 0x39cb3218 -//.word 0xc0a881b4 -//.word 0x91892343 -//.word 0xcd5a61b2 -//.word 0x400886f7 -//.word 0x93e6aa9a -//.word 0xc34ec974 -//.word 0xd28b18b7 -//.word 0xbcf6982e -//.word 0xac60ebc6 -//.word 0x70b0674e -//.word 0x2acd697b -//.word 0x49bfeb2f -//.word 0xb81159fa -//.word 0x5579a1e2 -//.word 0xa5bb8a5f -//.word 0xc6ca46aa -//.word 0xa5304a37 -//.word 0x71b15d80 -//.word 0x4f2bef05 -//.word 0x4fc1ad91 -//.word 0x9e3852be -//.word 0xfea1c0bb -//.word 0x74394f4d -//.word 0x408d6514 -//.word 0x12e24710 -//.word 0x7bd32e64 -//.word 0xa23c9e59 -//.word 0x3857f3a5 -//.word 0xae253dee -//.word 0xa5104d8a -//.word 0xa6ce1089 -//.word 0x13881cf5 -//.word 0x5d3c8958 -//.word 0x7860027f -//.word 0x8cc81b7e -//.word 0xeec9e5f4 -//.word 0x4e9fc190 -//.word 0x320c71d4 -//.word 0xa3427519 -//.word 0x250394d4 -//.word 0xed07b917 -//.word 0x4f9e005b -//.word 0x7696117c -//.word 0x575fad05 -//.word 0xe76d86ae -//.word 0x8cde5423 -//.word 0xd25d2507 -//.word 0x6046f439 -//.word 0x2a0a7e56 -//.word 0xe8d6517f -//.word 0xc66f265c -//.word 0x5d617060 -//.word 0xe258354f -//.word 0x9dce1dfe -//.word 0x9de6c95b -//.word 0xab9865ac -//.word 0x7c0f811c -//.word 0x2b4f1c73 -//.word 0xe61b0225 -//.word 0xe716598e -//.word 0xa528767c -//.word 0x4c23f5ee -//.word 0x6ba7081b -//.word 0xed430fb6 -//.word 0x4bdc6971 -//.word 0x00538ac0 -//.word 0x3c624edf -//.word 0xdcc78d16 -//.word 0x9aa5f03c -//.word 0x8127037a -//.word 0xa5668b51 -//.word 0x108d19de -//.word 0xff3bdf5d -//.word 0x4f28c3ed -//.word 0x320cb292 -//.word 0x26bc3780 -//.word 0x28964c97 -//.word 0x2420702a -//.word 0xb1ecf904 -//.word 0xfbbfacad -//.word 0x00f18be9 -//.word 0x0017ee82 -//.word 0x2ee0d547 -//.word 0xac3d7d55 -//.word 0xb6c53195 -//.word 0x1e576386 -//.word 0xf801fb3d -//.word 0x9620efaa -//.word 0xb7c9141c -//.word 0xfb683407 -//.word 0x9aa76006 -//.word 0x5692871c -//.word 0xaef8483f -//.word 0x55140517 -//.word 0xe26c3903 -//.word 0xc9fa0b5d -//.word 0x8a8a23ff -//.word 0x2863bc05 -//.word 0xdd29fad5 -//.word 0x0c027e5d -//.word 0x77f8399c -//.word 0xb29f7d64 -//.word 0xd8f75a5e -//.word 0x7c93274e -//.word 0xe2fb5f98 -//.word 0x6f50af04 -//.word 0x5f2e4cbe -//.word 0xb6d68aa1 -//.word 0x798dabb4 -//.word 0x1d3ff4f5 -//.word 0x40680756 -//.word 0x97356c06 -//.word 0x28e671f1 -//.word 0xb976348a -//.word 0x887efec8 -//.word 0x3c57d26e -//.word 0x1c7e4690 -//.word 0x7f3d9253 -//.word 0x8388e7f4 -//.word 0x0226020c -//.word 0xc2110012 -//.word 0xec1e7421 -//.word 0xc0e0b7fb -//.word 0x86ca7f4f -//.word 0xc895b337 -//.word 0xbee17e05 -//.word 0x0a1fa33f -//.word 0xa6ae10e8 -//.word 0x1a44b501 -//.word 0xf2909650 -//.word 0x6f1e1f60 -//.word 0x7d7ab8c9 -//.word 0xe5989ab1 -//.word 0xc473e193 -//.word 0x3cf5e240 -//.word 0x6917be23 -//.word 0x964938c8 -//.word 0xb114c3a0 -//.word 0xfdfedffe -//.word 0x07aea666 -//.word 0xdb50a207 -//.word 0x773be286 -//.word 0x80d14dfd -//.word 0x34a73644 -//.word 0xa0e7306f -//.word 0x13f22397 -//.word 0xd2499fde -//.word 0x0dad71ad -//.word 0x12857440 -//.word 0xc181aa65 -//.word 0x407d8b80 -//.word 0xf0a89dd3 -//.word 0x9fe545fc -//.word 0xff71ddbf -//.word 0x56c60606 -//.word 0x78c04026 -//.word 0xf3ffb864 -//.word 0x898c60b8 -//.word 0xe3bf45d1 -//.word 0x83601e58 -//.word 0xfb0c2079 -//.word 0x5cda1aa0 -//.word 0xf23fbd80 -//.word 0x2e2f3b5a -//.word 0xe485157c -//.word 0xb7a52d08 -//.word 0xd16023f6 -//.word 0xd718de5c -//.word 0x1b2469ed -//.word 0x147501c0 -//.word 0x0c7a6c54 -//.word 0x19428cd0 -//.word 0x4ee1338f -//.word 0x321439db -//.word 0x7128ccf9 -//.word 0xd2170867 -//.word 0x69f5c761 -//.word 0x0e8abba9 -//.word 0x0e41ba88 -//.word 0x20415810 -//.word 0x9ad9bba5 -//.word 0xe421abbc -//.word 0x2ddee9e1 -//.word 0x5ea7c2ff -//.word 0x4c46e3dc -//.word 0x32616fe3 -//.word 0x5e5a4f26 -//.word 0x2a73caa3 -//.word 0x2e3655c6 -//.word 0xb414ac30 -//.word 0x6c4c21b7 -//.word 0x620e34ae -//.word 0x2ce06566 -//.word 0x684246f4 -//.word 0x668dd435 -//.word 0x21210710 -//.word 0x74bfa8fb -//.word 0x8a3463c1 -//.word 0x97381d82 -//.word 0xc59588fb -//.word 0x728cf407 -//.word 0x98746866 -//.word 0x8ca4f1be -//.word 0xec933adf -//.word 0xd23e5d4b -//.word 0x4ecaf9f6 -//.word 0x146b854a -//.word 0x7184e36e -//.word 0x841038c8 -//.word 0xaa40fcc1 -//.word 0x3a654dc8 -//.word 0x73118999 -//.word 0xb2791bbf -//.word 0xe81e9557 -//.word 0x4cad0018 -//.word 0x4d236f90 -//.word 0xcb34dbb0 -//.word 0x86ee2a8b -//.word 0xd79a915b -//.word 0x9ee31cc5 -//.word 0x7b3a8b5e -//.word 0x4178606d -//.word 0xa7c536f3 -//.word 0x41b954e8 -//.word 0xafc282c8 -//.word 0x15c61c4e -//.word 0xcb09647f -//.word 0x55501ceb -//.word 0x95475530 -//.word 0x3f2082bf -//.word 0x8e7dd0e3 -//.word 0x3590baff -//.word 0x9980d717 -//.word 0x3d0ff791 -//.word 0x7d7b6f3d -//.word 0x80a1b194 -//.word 0x6868203d -//.word 0xcb5d22d6 -//.word 0x679b76f0 -//.word 0x11eec85b -//.word 0xef3882a5 -//.word 0xe713e6dd -//.word 0x57b75a9c -//.word 0x071f0247 -//.word 0x5c67948e -//.word 0xce796838 -//.word 0x9be8cf23 -//.word 0xbd1ca686 -//.word 0x1ab02b7a -//.word 0xfc180fb9 -//.word 0xc087cca5 -//.word 0xd20f388c -//.word 0xd90b5a2a -//.word 0x2eba7d6f -//.word 0x932c8483 -//.word 0x22627d08 -//.word 0x83b1799f -//.word 0x62679aad -//.word 0x20b16d5f -//.word 0xc9bc7aeb -//.word 0x471b1a19 -//.word 0xd5698903 -//.word 0xb62f3c18 -//.word 0x26077567 -//.word 0x9102141b -//.word 0x0348b041 -//.word 0xe0fee6d2 -//.word 0xd56df1ed -//.word 0x0e607b64 -//.word 0xa9cdb37a -//.word 0x6bb8a0eb -//.word 0xb255b52d -//.word 0xab6da5f6 -//.word 0xc50279fe -//.word 0x6636df06 -//.word 0xdc69c519 -//.word 0x96a22612 -//.word 0x9430245e -//.word 0x1c915803 -//.word 0xaf9266e1 -//.word 0x3bb8d438 -//.word 0x92df1c6b -//.word 0x1b21ff04 -//.word 0xc7f91df7 -//.word 0x47a8c32b -//.word 0x7dd80436 -//.word 0x30800b69 -//.word 0x0307af0c -//.word 0xa8ac48ea -//.word 0x5125c111 -//.word 0x6786efd3 -//.word 0x7f652110 -//.word 0x8a3cf9b8 -//.word 0x4b0e7a8b -//.word 0x0f4e6123 -//.word 0x98fcb935 -//.word 0x5a11aa14 -//.word 0xea1d9276 -//.word 0xb32f577b -//.word 0xebf5fbeb -//.word 0xc52470bf -//.word 0xe81aaee4 -//.word 0x21c3043b -//.word 0x54b9abe4 -//.word 0xb9afa1bc -//.word 0x440fb424 -//.word 0x65e2dd05 -//.word 0xf2f1d011 -//.word 0x6229d14b -//.word 0x3b44c9c9 -//.word 0xcda699b8 -//.word 0x2185aea2 -//.word 0x2d4dd6ec -//.word 0x494352a3 -//.word 0xe7682c78 -//.word 0x7ea0cb08 -//.word 0xc713c461 -//.word 0x2cd4f3c2 -//.word 0x7ec1cba3 -//.word 0xe6aaeaf5 -//.word 0x1eb5f0ab -//.word 0xe0009279 -//.word 0x9f89eadc -//.word 0x764b115a -//.word 0x5eaaf00b -//.word 0xa3115358 -//.word 0x99da3f03 -//.word 0x8b6e8668 -//.word 0xf4ad9802 -//.word 0xf1909c30 -//.word 0xf70cc039 -//.word 0xc13acd8e -//.word 0x8db6fe50 -//.word 0x88451212 -//.word 0x87baa0e0 -//.word 0xf71aab80 -//.word 0x17fe76f7 -//.word 0x65399950 -//.word 0x55bb5598 -//.word 0x49b5252d -//.word 0xbefe9539 -//.word 0xc3b65779 -//.word 0xb0299443 -//.word 0x14f580c7 -//.word 0xef703195 -//.word 0x2244b15f -//.word 0x235c5200 -//.word 0xf50441be -//.word 0x584b5ecc -//.word 0x3dac4b13 -//.word 0x7ceec333 -//.word 0xc9492ec4 -//.word 0xe5ca72e1 -//.word 0x11f90be7 -//.word 0xc8b85e7a -//.word 0xad6e4ac9 -//.word 0xc3650113 -//.word 0xdc71166b -//.word 0x54d3d7b8 -//.word 0xfe5cdcff -//.word 0x5fd6e0e5 -//.word 0x1a9fd06f -//.word 0xac97220d -//.word 0x593c68d7 -//.word 0x66142516 -//.word 0x894cdf06 -//.word 0x9e9e75da -//.word 0x9b78b301 -//.word 0xc65a24a8 -//.word 0x267f2780 -//.word 0x37c145c1 -//.word 0xe2b7c26f -//.word 0xab2072dc -//.word 0x2d84ce6e -//.word 0xc31847a2 -//.word 0x89e3db51 -//.word 0x831fe532 -//.word 0x1be239a1 -//.word 0xd1fd709e -//.word 0x2e248119 -//.word 0xf950926d -//.word 0xae620d2a -//.word 0x2c09f517 -//.word 0xaee57b77 -//.word 0xfcedcc8c -//.word 0xe30e2e5a -//.word 0xe2144bad -//.word 0x26cecc5d -//.word 0xb96d2ad1 -//.word 0xf62ec1c2 -//.word 0x40392741 -//.word 0xf3c8bbfc -//.word 0x9b8b81bd -//.word 0x644c2d33 -//.word 0xd2cf7df5 -//.word 0xb2fcccc4 -//.word 0x513fe510 -//.word 0xeb3015be -//.word 0x666f8429 -//.word 0x40d2c467 -//.word 0xc7c3abcd -//.word 0x88e35eb5 -//.word 0x09f4af7e -//.word 0xbbf5a9d5 -//.word 0x2a8e6833 -//.word 0x77af2fa7 -//.word 0x0875b4d6 -//.word 0x7e4dbe40 -//.word 0xe75bf2c5 -//.word 0x351dea67 -//.word 0xf04b8851 -//.word 0x27028a19 -//.word 0xac225e42 -//.word 0x81f53705 -//.word 0x8d116050 -//.word 0x937fd110 -//.word 0x651c00ac -//.word 0x5540f9d1 -//.word 0xed9eb175 -//.word 0xe06b9716 -//.word 0x3fc36d43 -//.word 0xf048565e -//.word 0x5d0c30a0 -//.word 0x69b1235d -//.word 0xa8ce7a8a -//.word 0xcf95b27c -//.word 0x69b3d1f2 -//.word 0xcc78fa56 -//.word 0x4c383d40 -//.word 0xaef1b33c -//.word 0xe02dcbcd -//.word 0xe72adfb2 -//.word 0x18390b67 -//.word 0x8b643eef -//.word 0xcd5391d1 -//.word 0xd571d861 -//.word 0x394a7740 -//.word 0xa2377826 -//.word 0x7e3edadf -//.word 0xf4342b94 -//.word 0x1d24594c -//.word 0x71f5c5b2 -//.word 0x7f469919 -//.word 0xe29d5cbd -//.word 0x70c1c34c -//.word 0xb464caa5 -//.word 0x9f0504df -//.word 0x7a152f8d -//.word 0x1f590c40 -//.word 0x698f6e4e -//.word 0xe95490d2 -//.word 0xda45abf4 -//.word 0x5765c86b -//.word 0xccbfd340 -//.word 0xab4cf2d4 -//.word 0x60161524 -//.word 0x869ecd4c -//.word 0x5b7b614a -//.word 0x71451f05 -//.word 0xa7b1f08e -//.word 0x58fd2fa5 -//.word 0xd28fbb7f -//.word 0x0ad94bc6 -//.word 0x8e7f02e2 -//.word 0xbabc4477 -//.word 0x2f02c72e -//.word 0x81e0edb9 -//.word 0x30295111 -//.word 0xda539f02 -//.word 0xae1daaea -//.word 0x2474b8be -//.word 0xeb98204d -//.word 0x237b18c9 -//.word 0xcd6ac883 -//.word 0x80eea3f6 -//.word 0x5df5f607 -//.word 0x452dc18b -//.word 0x49b1c70a -//.word 0x61e7e1c2 -//.word 0x61a897ef -//.word 0x2aa2f14a -//.word 0x1dfb8bd0 -//.word 0xd637e8c4 -//.word 0x165c08f7 -//.word 0x00543d47 -//.word 0x89923a66 -//.word 0x2af96ddd -//.word 0xd7f98f50 -//.word 0x35fb7903 -//.word 0x08ff399d -//.word 0xea83652c -//.word 0x43a7af6a -//.word 0x7590ba3f -//.word 0x570a2c86 -//.word 0xe5710514 -//.word 0x36d12ff6 -//.word 0xae4c55fb -//.word 0x74bcf973 -//.word 0x269ac135 -//.word 0xcc1f12e7 -//.word 0x0ba8e079 -//.word 0x9c5fc5f3 -//.word 0xfc185071 -//.word 0x64799f6b -//.word 0xfb5e303a -//.word 0x4b7bf4d8 -//.word 0xf144a5e8 -//.word 0x99095af6 -//.word 0x2a6659ff -//.word 0x3eda2c34 -//.word 0xd5b6f7fb -//.word 0x4a390837 -//.word 0x86f9b0c9 -//.word 0x73845157 -//.word 0xb348b94b -//.word 0x93b0ae1f -//.word 0x3a90cad9 -//.word 0x27c38ad1 -//.word 0xda13a1ba -//.word 0xd05892e0 -//.word 0xb5e47daf -//.word 0xd61f3975 -//.word 0xd56fa469 -//.word 0xa05b37eb -//.word 0xa3efde0d -//.word 0x3d620653 -//.word 0x71f6f7b7 -//.word 0xdf2064f0 -//.word 0xf2e940f4 -//.word 0x5a94d4bc -//.word 0xbd810f47 -//.word 0xa9511de1 -//.word 0xce4b3ba5 -//.word 0x6afec941 -//.word 0x0428a0f9 -//.word 0x5dd7a7ef -//.word 0xa4cea1a1 -//.word 0xe92a49b3 -//.word 0xd446a1ef -//.word 0x97db878a -//.word 0x216c89a8 -//.word 0x94e1fa23 -//.word 0xfa724588 -//.word 0x34c68263 -//.word 0x325c47bd -//.word 0x6a2bc1e2 -//.word 0x82850368 -//.word 0x50419d6c -//.word 0x0519711f -//.word 0xa551c282 -//.word 0xbb9a8e6d -//.word 0x4a351ed6 -//.word 0x065bdb50 -//.word 0xc4dd63d2 -//.word 0x3008dcba -//.word 0xbecb8911 -//.word 0xe31c9a11 -//.word 0x849749e4 -//.word 0xaf6822af -//.word 0x896ca2cf -//.word 0x87930463 -//.word 0xe189580a -//.word 0x4495d5ee -//.word 0xc8c17001 -//.word 0x213bae86 -//.word 0x19fbb6d4 -//.word 0x3ea6aa56 -//.word 0xd7b237d7 -//.word 0x1dcc6bfc -//.word 0xa876c712 -//.word 0x28f5960a -//.word 0x556a7dc2 -//.word 0x293f5287 -//.word 0x4cc431d7 -//.word 0xd01acd6b -//.word 0x1e510575 -//.word 0x30cdb826 -//.word 0x01eed973 -//.word 0x42f0c619 -//.word 0x4f0fd5de -//.word 0x61ef301a -//.word 0x053ce477 -//.word 0xcd8d34f5 -//.word 0x458f3331 -//.word 0x285f92e6 -//.word 0xd437b6b4 -//.word 0xfc4d0d20 -//.word 0x9df8a3dd -//.word 0x3315f04a -//.word 0x2ca9f53b -//.word 0x9dc887fc -//.word 0x34b5ea93 -//.word 0x6e4aa146 -//.word 0x099a855d -//.word 0xbdd61529 -//.word 0x276d0d45 -//.word 0x06773a1c -//.word 0xa9548cab -//.word 0xa8906d89 -//.word 0xd30a5124 -//.word 0x68568e4d -//.word 0x895f6ff7 -//.word 0xec51833b -//.word 0xd5b63ba0 -//.word 0x41dfb49a -//.word 0x6485d250 -//.word 0x56b08ea2 -//.word 0x0ad8916b -//.word 0x7f4a0103 -//.word 0x3ace9b09 -//.word 0xf387025f -//.word 0x8f1a5675 -//.word 0x4e1309cb -//.word 0x4684eeb1 -//.word 0x10ee9352 -//.word 0xc165d1f0 -//.word 0x1bf0a171 -//.word 0x052f311b -//.word 0x3940389c -//.word 0x3de2864d -//.word 0x94dbdfb7 -//.word 0x35980957 -//.word 0x3c14249e -//.word 0xe0fb3a3c -//.word 0xa50e179e -//.word 0xd2c95bb5 -//.word 0x2643cdfa -//.word 0xc757f2af -//.word 0x7b01df67 -//.word 0x1a0a4bc8 -//.word 0x44e8e890 -//.word 0x4fe0f4d6 -//.word 0x836d0a93 -//.word 0x8ae53f60 -//.word 0x225a6a81 -//.word 0x15bec323 -//.word 0x6b4bb0e2 -//.word 0xde22db8e -//.word 0x8e33882f -//.word 0xf65c2646 -//.word 0x1fd52356 -//.word 0x13cb05a3 -//.word 0x954bb73a -//.word 0x0f622031 -//.word 0xcc83fa30 -//.word 0x6728e231 -//.word 0x84bcab83 -//.word 0xbdb9f815 -//.word 0xe00e0af1 -//.word 0x57c3d607 -//.word 0xe7df5b2c -//.word 0x9e8a3262 -//.word 0x066f675a -//.word 0x9f648737 -//.word 0x8c4dfa95 -//.word 0x8d3d93ca -//.word 0x2ddf666b -//.word 0x3d15da13 -//.word 0x80deff5f -//.word 0xa87d213d -//.word 0x81d89d67 -//.word 0x6d1ef32a -//.word 0x10ac1d6c -//.word 0x4c321fed -//.word 0x7011e0cd -//.word 0xac08384f -//.word 0xc9104adc -//.word 0x1684144b -//.word 0xa685445f -//.word 0xb89d4d91 -//.word 0x77a2bb10 -//.word 0xe4dec307 -//.word 0x106c1f1e -//.word 0x8ee51943 -//.word 0x283de5aa -//.word 0xd1e73312 -//.word 0xdb40054b -//.word 0x6a2abef5 -//.word 0x29f77c8a -//.word 0x3b8aa89f -//.word 0x75b8cc66 -//.word 0xcaf4a478 -//.word 0x062c77d1 -//.word 0xc0eea71c -//.word 0x89cf8832 -//.word 0x6a0d6edd -//.word 0x8e730ae1 -//.word 0x3b7df63d -//.word 0x07bd8eae -//.word 0x487d0275 -//.word 0xcca6a95a -//.word 0xcae198f1 -//.word 0x19fb741c -//.word 0xa08e84d1 -//.word 0x0ede0a1d -//.word 0xcb01d469 -//.word 0x2e430efd -//.word 0xf0c85ac2 -//.word 0xe073234c -//.word 0xd9072d17 -//.word 0xf18c7111 -//.word 0xf4f52959 -//.word 0x11ff2747 -//.word 0xd25c6aac -//.word 0x5211f35b -//.word 0xaa1dd5e8 -//.word 0xac5b8caf -//.word 0xd4a98f18 -//.word 0x7b4a291a -//.word 0x4e8984fe -//.word 0xff9f0766 -//.word 0x3ad7e18d -//.word 0xdbf0e6d0 -//.word 0x5ec39b6e -//.word 0x96268c8c -//.word 0xa20fe67c -//.word 0x1efd413e -//.word 0x9693be47 -//.word 0x40865282 -//.word 0xeaba6195 -//.word 0x31a88f65 -//.word 0xf403d3dc -//.word 0x089bcdea -//.word 0x2d8159c9 -//.word 0x416c6486 -//.word 0xb45bfebd -//.word 0x3c7cb1a4 -//.word 0xca4d114a -//.word 0xbc019521 -//.word 0x5425a5bb -//.word 0x6983f4d1 -//.word 0x5c471089 -//.word 0x4e6038f8 -//.word 0x90296de6 -//.word 0x5b49cbd2 -//.word 0xc2d81a36 -//.word 0xe4c3a10d -//.word 0x66713a91 -//.word 0x21a6ac49 -//.word 0x17a83443 -//.word 0xaca1659f -//.word 0x1345334d -//.word 0x06b44a16 -//.word 0xbaa2a4e1 -//.word 0x12b55a2f -//.word 0x132ebae9 -//.word 0x98cc9b5b -//.word 0x46eded80 -//.word 0xc3f79480 -//.word 0x23f67777 -//.word 0xa387d378 -//.word 0x9af4d6d2 -//.word 0xaca06991 -//.word 0x41a64d48 -//.word 0x35bd690e -//.word 0xd25f62c7 -//.word 0xfb2a6da5 -//.word 0xa98661ee -//.word 0x9c8811ff -//.word 0x4a16d891 -//.word 0x1c4c753b -//.word 0xd91f1938 -//.word 0x6240bf6b -//.word 0xa143bca0 -//.word 0xbc019715 -//.word 0x8e3b1a39 -//.word 0x5780a9b3 -//.word 0xb250d3a6 -//.word 0xc8812733 -//.word 0xc4e24940 -//.word 0x871f4578 -//.word 0x9ce42293 -//.word 0x6e45bbd8 -//.word 0xb85ecae0 -//.word 0x3e36469c -//.word 0xbbeaef9a -//.word 0x1a072783 -//.word 0xe83703e9 -//.word 0x0a20a23f -//.word 0xab89bd29 -//.word 0x79be80f7 -//.word 0x1136986b -//.word 0xb7748ec3 -//.word 0x4b2b53f3 -//.word 0x78a51c33 -//.word 0x2f656fb9 -//.word 0x540c7ec8 -//.word 0xb779b5e9 -//.word 0x45348f79 -//.word 0x800dad63 -//.word 0x2c00292f -//.word 0x4b5c283c -//.word 0x4c25ae49 -//.word 0x80b6b73a -//.word 0xcdaa8319 -//.word 0xa6fd315c -//.word 0x3a6f8f66 -//.word 0xec293150 -//.word 0x04a3c0e8 -//.word 0xa4c595fa -//.word 0xfd4d86cf -//.word 0xc27000f4 -//.word 0xddc4573c -//.word 0x625d5908 -//.word 0xc13629c6 -//.word 0x3fd34bb8 -//.word 0xa725fbf7 -//.word 0x3caec3b7 -//.word 0xf3e64ccc -//.word 0xdfdc756e -//.word 0xed20a239 -//.word 0xd1e15677 -//.word 0x405305a2 -//.word 0x60532325 -//.word 0x7d4e8163 -//.word 0xfd5fd9fa -//.word 0x96b7a849 -//.word 0xbe423b30 -//.word 0x63880d16 -//.word 0xddd15031 -//.word 0x218cca01 -//.word 0x37f1e21e -//.word 0xeee6fb34 -//.word 0xce1f004c -//.word 0x4e8a404d -//.word 0x47ea7dc2 -//.word 0xa9c13fdd -//.word 0x6d746ebc -//.word 0xcaaa20ec -//.word 0xacf5b02c -//.word 0x62b41073 -//.word 0x96386034 -//.word 0x8325bfe0 -//.word 0x621b61ad -//.word 0x2596e196 -//.word 0x6813d9a2 -//.word 0xa575b16a -//.word 0xa7a6b4d5 -//.word 0x41816927 -//.word 0x3ff0203a -//.word 0x9d51cb0a -//.word 0xf71f0f78 -//.word 0x41ce9b47 -//.word 0xb8f6b96b -//.word 0x18b42283 -//.word 0x104e17a4 -//.word 0xf315ad58 -//.word 0xb09069e6 -//.word 0x04d60cd4 -//.word 0xee3cb0ab -//.word 0x643014fa -//.word 0x4465359d -//.word 0x8d311e3f -//.word 0xcf33001e -//.word 0xe038850e -//.word 0xd15f62c1 -//.word 0x207c2c45 -//.word 0x2fbb6cce -//.word 0xf586f5b6 -//.word 0xf4a875c2 -//.word 0x6bb24ba7 -//.word 0xcc9d98cd -//.word 0x70b29952 -//.word 0x8aa73452 -//.word 0x5a0bd066 -//.word 0xa3e46a6a -//.word 0x5e96e584 -//.word 0xb006a261 -//.word 0x1a0051c2 -//.word 0xf0d60738 -//.word 0x0c4a902b -//.word 0xc3ae0621 -//.word 0x184aa23d -//.word 0x30fed306 -//.word 0x06298d6b -//.word 0x60c9e403 -//.word 0x02e3d999 -//.word 0x212574e7 -//.word 0x1aca13a2 -//.word 0x64be01b7 -//.word 0xc3024ad5 -//.word 0xbf53ce2b -//.word 0x55069573 -//.word 0xec37622f -//.word 0x8b228b32 -//.word 0x48d10763 -//.word 0x04f8c9be -//.word 0x551d4c9b -//.word 0xc4fb7033 -//.word 0x39298460 -//.word 0xb3f7a4a4 -//.word 0x3c99456d -//.word 0x1d870e97 -//.word 0x4e23ea33 -//.word 0x309c5b87 -//.word 0x7e131155 -//.word 0x81fdbb61 -//.word 0x84c91d2d -//.word 0x88c26207 -//.word 0x3936b445 -//.word 0x20d80bd0 -//.word 0x196342df -//.word 0x08807005 -//.word 0xc8ea756e -//.word 0x64d0d366 -//.word 0x8a7bc01a -//.word 0x3c3079a3 -//.word 0xc958d840 -//.word 0xfcde29e3 -//.word 0x93d93af0 -//.word 0xf26bb141 -//.word 0x19e8a26d -//.word 0xd43b614a -//.word 0x318695b0 -//.word 0x37098e80 -//.word 0xd545d9e5 -//.word 0x196111da -//.word 0xa3ccf7ed -//.word 0x5824c542 -//.word 0x5b57c0da -//.word 0x39080d15 -//.word 0x6334c576 -//.word 0xe2154ca7 -//.word 0x4646debd -//.word 0xdf296abc -//.word 0x3086a45e -//.word 0xa1745610 -//.word 0x747df63e -//.word 0xfafd7ed0 -//.word 0x07cb78f5 -//.word 0xa31b581f -//.word 0x02a30f4f -//.word 0xb7fddd92 -//.word 0x244d67cb -//.word 0x352309b4 -//.word 0x4ea36d20 -//.word 0x81e35d83 -//.word 0x0594d5b3 -//.word 0xe3e55df0 -//.word 0xf3a49523 -//.word 0x07a61263 -//.word 0x666a68bd -//.word 0x7cf98835 -//.word 0xcf104d08 -//.word 0x35815134 -//.word 0x45d7053a -//.word 0x0b390123 -//.word 0x009198c1 -//.word 0x38edb037 -//.word 0xde25d0bc -//.word 0xdebe7b9b -//.word 0xe10ebd7e -//.word 0x7ea103ed -//.word 0xaedc3012 -//.word 0x81e0ecbf -//.word 0x10b13fb2 -//.word 0xb3986017 -//.word 0x74c5c74e -//.word 0xc33989ef -//.word 0x6be3e50b -//.word 0xc4091ab5 -//.word 0x2aea7cc1 -//.word 0xafa2c7cc -//.word 0x0d4db37d -//.word 0xdf6fc909 -//.word 0x109474fd -//.word 0x93335b38 -//.word 0x54d8ee36 -//.word 0x6f823f95 -//.word 0xa14a14d1 -//.word 0xfb463a53 -//.word 0xdead1caa -//.word 0x233c9418 -//.word 0x9ad80050 -//.word 0xb674997e -//.word 0x86350088 -//.word 0xe7d41a93 -//.word 0xf9451eca -//.word 0xcf96ec5a -//.word 0x6b19a1c1 -//.word 0xe9c56849 -//.word 0xfada93cf -//.word 0x94c4eac9 -//.word 0xe8424288 -//.word 0x95c752ba -//.word 0x1b21c332 -//.word 0x925886ec -//.word 0x9cd96a4b -//.word 0x98d3eea6 -//.word 0x18e25303 -//.word 0x95ebf622 -//.word 0x6247ddbe -//.word 0xdf23900f -//.word 0xef262a93 -//.word 0xac55af0e -//.word 0x5934a0d0 -//.word 0x972ecd36 -//.word 0xdc376b73 -//.word 0x22b06690 -//.word 0xdc8bf9b2 -//.word 0x2eaf7b9c -//.word 0x5d9e7c74 -//.word 0x855510ca -//.word 0x8a746bd6 -//.word 0x509eae01 -//.word 0x2f2301a8 -//.word 0xa1dce21c -//.word 0x3e57bced -//.word 0xeb34bc68 -//.word 0x4ecfe05e -//.word 0x85205127 -//.word 0x17dff2e7 -//.word 0x2aeb3910 -//.word 0xf7ec3e28 -//.word 0x7c3711cd -//.word 0x70f351f6 -//.word 0x7c7afa7b -//.word 0xa8027fd8 -//.word 0x147d192e -//.word 0xe8be5e8a -//.word 0x8ddc156a -//.word 0x1edb497d -//.word 0x19899cab -//.word 0x5ba7de55 -//.word 0x4b49dede -//.word 0x5580806a -//.word 0x9a3510e5 -//.word 0xe558d648 -//.word 0xe13beb17 -//.word 0x8a384b2e -//.word 0xe29a2abe -//.word 0xe5bb8c93 -//.word 0xbe691098 -//.word 0x3b8e0c9c -//.word 0x7f10df56 -//.word 0xf7f783a7 -//.word 0x8fce6220 -//.word 0x254b6bc4 -//.word 0x3d32640f -//.word 0xf7768237 -//.word 0x3fa137b1 -//.word 0x44774bf7 -//.word 0x2bd62e89 -//.word 0x04e18d31 -//.word 0xfd5e238c -//.word 0xd55bd2c6 -//.word 0x9418f2a5 -//.word 0x7a21e9c9 -//.word 0x35bbfb32 -//.word 0x57816402 -//.word 0x064fa484 -//.word 0xf55f1b6e -//.word 0x94b2d563 -//.word 0x84b2a7bc -//.word 0x4e157b88 -//.word 0x5404e8d1 -//.word 0x087d0622 -//.word 0x5bf68045 -//.word 0x7943ea51 -//.word 0xb3b955e5 -//.word 0xbc9421ae -//.word 0x1996132f -//.word 0xd3f1a7c1 -//.word 0x6f67a8d8 -//.word 0x1fb0fd89 -//.word 0x3a1cc649 -//.word 0xea79a8f8 -//.word 0x2537641e -//.word 0xdecaaf74 -//.word 0x7c503ea6 -//.word 0x8b742057 -//.word 0xb1925065 -//.word 0xe41c8b6f -//.word 0xdb3c5f95 -//.word 0xc2ba857f -//.word 0x322170a1 -//.word 0x601d26bd -//.word 0x95284fa9 -//.word 0xde658b52 -//.word 0x04cc0901 -//.word 0xbe8856dd -//.word 0x269d72b2 -//.word 0x6ace29f0 -//.word 0xc4bea0f7 -//.word 0xac552f91 -//.word 0x4c656ec0 -//.word 0x348e93bb -//.word 0x4f5ffb33 -//.word 0x15bd06da -//.word 0x03892826 -//.word 0x487d3d52 -//.word 0xc2571da7 -//.word 0x283a71f9 -//.word 0x8951c574 -//.word 0xf5b5de99 -//.word 0x7a914d83 -//.word 0x5284446f -//.word 0x5a46a97b -//.word 0xc68f69ae -//.word 0x13340f39 -//.word 0x3e9395fc -//.word 0x3432794c -//.word 0x89a314f4 -//.word 0x6cab2879 -//.word 0xdba3b8a3 -//.word 0x131d1c38 -//.word 0x4bcb540b -//.word 0xa19d9d35 -//.word 0x552a42a3 -//.word 0x3551b5d1 -//.word 0x5820ded4 -//.word 0x0ff4b39e -//.word 0x19e2097e -//.word 0x1656a9e6 -//.word 0x3efaa771 -//.word 0x53daef24 -//.word 0xd4c521f5 -//.word 0x74f69f89 -//.word 0xcbf4e442 -//.word 0x4ab61779 -//.word 0x740bdf08 -//.word 0x4b397a0c -//.word 0x09e409e9 -//.word 0x11322e8e -//.word 0x252dd9fa -//.word 0xd9695ffe -//.word 0x48e6cd45 -//.word 0x05377b93 -//.word 0x55e4e44a -//.word 0x9b0eb432 -//.word 0x13512379 -//.word 0xc3ef82f9 -//.word 0xaf2a13ba -//.word 0x4df11eb8 -//.word 0x38bf41e6 -//.word 0x28c10872 -//.word 0x2237be4b -//.word 0xec1c82e1 -//.word 0xc4099d2c -//.word 0x515712ef -//.word 0xda84773e -//.word 0xb6d7043e -//.word 0x0447ea2c -//.word 0x9c9ae5a0 -//.word 0x45ca1513 -//.word 0x28ac0a9f -//.word 0x84d31e07 -//.word 0xa4b307f7 -//.word 0x0e02ac8d -//.word 0xfe643817 -//.word 0x12466d1f -//.word 0x470a3ca5 -//.word 0x246592ab -//.word 0x350674f7 -//.word 0xbb794e14 -//.word 0xa24a889a -//.word 0xb36d5baf -//.word 0x0bdde3ce -//.word 0xcc8475c7 -//.word 0x125b3207 -//.word 0x29d2dc1a -//.word 0xfd72e96e -//.word 0xd1c1d65a -//.word 0x3466be5e -//.word 0x318d2bad -//.word 0xc78d2ce8 -//.word 0x99c8a82d -//.word 0xe5d3f150 -//.word 0xbad89c68 -//.word 0x6638918e -//.word 0x2e745ee1 -//.word 0x434dd1ce -//.word 0xf12ac58e -//.word 0x18bb3cef -//.word 0xe0dcae58 -//.word 0xa9bca107 -//.word 0x413e7a9e -//.word 0x5a9f93de -//.word 0x3b5a8db2 -//.word 0xb548e86f -//.word 0x590cd05a -//.word 0xe8ae3a6b -//.word 0x0b863050 -//.word 0x445c69b5 -//.word 0x25cd1dc3 -//.word 0xc0f017e6 -//.word 0x5e3a0cd4 -//.word 0x749f2bcb -//.word 0xd2faf519 -//.word 0x1eaf4fe2 -//.word 0x818fd61e -//.word 0xa0fc72e1 -//.word 0xce4d2edf -//.word 0x7f74472f -//.word 0x00dd824f -//.word 0x669ac369 -//.word 0xc5bedcd4 -//.word 0xa206a3de -//.word 0xaabf47c9 -//.word 0xa4e3e413 -//.word 0xa48654fb -//.word 0x81704940 -//.word 0x8a0c982c -//.word 0x7581d8d1 -//.word 0x981e2c93 -//.word 0x5cfb5de6 -//.word 0xeedd2c59 -//.word 0x375be6d4 -//.word 0x0f3f381d -//.word 0xad2f45a1 -//.word 0x628df672 -//.word 0x889b918c -//.word 0xb5e38e5c -//.word 0x34d6a683 -//.word 0xb5b32cd7 -//.word 0x43aaa0aa -//.word 0x77428250 -//.word 0xebf864db -//.word 0xf2284329 -//.word 0x86311721 -//.word 0x82d5a939 -//.word 0x12dea53b -//.word 0x6707f04a -//.word 0xaf193b20 -//.word 0x4455d999 -//.word 0x2312cd75 -//.word 0xa1a72859 -//.word 0x598b9218 -//.word 0x69bb2631 -//.word 0xde5c8399 -//.word 0x6ca21fba -//.word 0x63f0dfbb -//.word 0xde41e502 -//.word 0x3dc6aaf7 -//.word 0xd6d04c0b -//.word 0xe8f129fa -//.word 0xd05eac4c -//.word 0x80986722 -//.word 0x2c4c622f -//.word 0x4677b305 -//.word 0xadcd4f92 -//.word 0x225c20ea -//.word 0xfb6d5847 -//.word 0x1bab044d -//.word 0x2187e493 -//.word 0xe0da7a60 -//.word 0x10cc61b2 -//.word 0x42f6e085 -//.word 0x1ac3bf51 -//.word 0xb81c59d5 -//.word 0x7744f313 -//.word 0xda004c9c -//.word 0xc3fc750d -//.word 0xe66ae3da -//.word 0x7eecc34a -//.word 0x3eb48dc3 -//.word 0x8be9dc48 -//.word 0xe84d7d40 -//.word 0xb21ec679 -//.word 0x0d3a296c -//.word 0x1e8609c3 -//.word 0x7b8fcb18 -//.word 0xdf723100 -//.word 0x23fae348 -//.word 0x69094f7e -//.word 0x9b39b3b3 -//.word 0x14c27880 -//.word 0x9c9fc247 -//.word 0x9aec45bb -//.word 0x85935aa3 -//.word 0x9c2752db -//.word 0xd7100a9b -//.word 0x1de9bffb -//.word 0xb72624b7 -//.word 0x05fab230 -//.word 0x6f7840b4 -//.word 0x9ff8d3ff -//.word 0xedbcb702 -//.word 0x1bd3cfe3 -//.word 0x433e2944 -//.word 0x0d52d5c8 -//.word 0x255df8d3 -//.word 0xed8c1c92 -//.word 0x6f0cca3c -//.word 0x95705b97 -//.word 0x9c530bbd -//.word 0xc63e4f20 -//.word 0x4fcc69cc -//.word 0xa30b39ec -//.word 0xce265690 -//.word 0x34415dad -//.word 0x82a58965 -//.word 0xe41d8489 -//.word 0x799f7d5d -//.word 0x042f7b9b -//.word 0xe401f1ba -//.word 0x46de926f -//.word 0x99c86675 -//.word 0x42e11e8a -//.word 0x9189a5ba -//.word 0xf4c7f7df -//.word 0x6bea3669 -//.word 0x3c70fb5b -//.word 0xe826ea96 -//.word 0x5d91895a -//.word 0x6d8d520a -//.word 0x7f34062f -//.word 0x850145c0 -//.word 0x2e355ca1 -//.word 0x5c7a5e69 -//.word 0xd8c77668 -//.word 0x45837be9 -//.word 0x52edc5b4 -//.word 0x34bb3fd7 -//.word 0x5401bea6 -//.word 0x44559101 -//.word 0xf8315ad5 -//.word 0x33991ce5 -//.word 0x3ffd94cb -//.word 0xe160cd39 -//.word 0x8cbaef85 -//.word 0xd59b5765 -//.word 0x2712edf7 -//.word 0xb8cdb204 -//.word 0xbb819985 -//.word 0xd88d9866 -//.word 0xd9dafe8b -//.word 0xa6050711 -//.word 0x73c0aed6 -//.word 0x3875c23b -//.word 0x612d3c28 -//.word 0xc7b1d051 -//.word 0xe0eec2b8 -//.word 0x329efb73 -//.word 0x0e255cb0 -//.word 0x7ab952f6 -//.word 0x6fc6abae -//.word 0x4591a8e1 -//.word 0x6b1b5343 -//.word 0x5b481271 -//.word 0xcd407d77 -//.word 0x2b166d95 -//.word 0x46a85543 -//.word 0x47c6d672 -//.word 0xe8968d15 -//.word 0xe43630e0 -//.word 0xaba4d94f -//.word 0x5bdba1eb -//.word 0xec3f71c9 -//.word 0xaa3b1553 -//.word 0xe929924a -//.word 0xf472ba0c -//.word 0x46f68000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x0000C3D0 -//// expected output -//.word 0xda9436bd -//.word 0xc81dc6aa -//.word 0x3be90737 -//.word 0x75190493 -//.word 0x71e61a40 -//.word 0x9f850375 -//.word 0xd3a50306 -//.word 0x0112f0ea -//.word 0xcf8539c1 -//.word 0xd98cb3a3 -//.word 0x02f9c125 -//.word 0xc78ab6e3 -//.word 0xa3e69557 -//.word 0x5fed3eed -//.word 0x2214a0b9 -//.word 0xe3fc6b51 -//// SHA512LongMsgvector_63 -//// vector length -//.word 0x0000C6E8 -//// input message -//.word 0x96bb7a62 -//.word 0x306a40df -//.word 0x8c1d0ef9 -//.word 0xf11301ea -//.word 0x036d7d15 -//.word 0xe8cd713c -//.word 0xaa23dcf3 -//.word 0xdcc49054 -//.word 0x81bd36f5 -//.word 0x29669217 -//.word 0x5d3a0820 -//.word 0x3de55f4c -//.word 0x689fc69f -//.word 0x1cb9141e -//.word 0x9f75543e -//.word 0xdd1b819d -//.word 0x52498ef0 -//.word 0x2a8ba93c -//.word 0xa72bc14a -//.word 0xc44b4655 -//.word 0x18303005 -//.word 0xfce142a1 -//.word 0xf0f19080 -//.word 0x3b993fc0 -//.word 0xd20a8c3b -//.word 0x7b000fb7 -//.word 0x329b415d -//.word 0xcc6b3d6d -//.word 0xdac9c32f -//.word 0xd06e822d -//.word 0x673e979f -//.word 0x3f655127 -//.word 0xc9a537be -//.word 0x64ee4cee -//.word 0xc6309143 -//.word 0x9e6dccfc -//.word 0x77128805 -//.word 0xe0875d2a -//.word 0xca057185 -//.word 0x31a83f38 -//.word 0xffc59762 -//.word 0x2d7de64b -//.word 0x2b92b8e2 -//.word 0x827a7b6a -//.word 0xb8b28670 -//.word 0x73555a00 -//.word 0xe2ed2718 -//.word 0x5989925d -//.word 0x3b10b50d -//.word 0x1dd46735 -//.word 0x286abe24 -//.word 0xbfbad31f -//.word 0x6252c556 -//.word 0xd3000117 -//.word 0x779fc042 -//.word 0xfe31d1fd -//.word 0x472e98a8 -//.word 0x7d1c5714 -//.word 0x8760acef -//.word 0x9f545b83 -//.word 0x40994ea1 -//.word 0x46afdad7 -//.word 0x51c244e9 -//.word 0x6ac7847f -//.word 0xe9c8481c -//.word 0x957c3c4f -//.word 0x0e1b892d -//.word 0x68709bfe -//.word 0x19302837 -//.word 0x158a6ea9 -//.word 0x37ffbcf7 -//.word 0xe374334d -//.word 0xea86ce4f -//.word 0xad1da050 -//.word 0x86445dc5 -//.word 0x63381cf9 -//.word 0xb4be5b02 -//.word 0x88ba44f3 -//.word 0xf2fe2f53 -//.word 0xb26067ce -//.word 0x110f312b -//.word 0x0d270a7e -//.word 0xb682319f -//.word 0xd8d265da -//.word 0xdaecf0e8 -//.word 0xe667e41e -//.word 0x4b66a5e5 -//.word 0x1fb2a76a -//.word 0x280c7997 -//.word 0xfdc10341 -//.word 0x687e0ca3 -//.word 0x0f66ff0b -//.word 0x5362eed3 -//.word 0x79b8d793 -//.word 0x07e02695 -//.word 0x71937c89 -//.word 0xf524af7a -//.word 0xc4131201 -//.word 0x62e0f6b9 -//.word 0x4f1d70f2 -//.word 0xe7c75daa -//.word 0x87d6a4b9 -//.word 0xf113bb4b -//.word 0xf22a6d93 -//.word 0x4200dabe -//.word 0xab46bf26 -//.word 0x6d4ff7c9 -//.word 0xe21e42f9 -//.word 0x5ec44655 -//.word 0x59e9d3f7 -//.word 0xd0a86bef -//.word 0xe8a002f0 -//.word 0xd547024a -//.word 0xfa829218 -//.word 0x517318bb -//.word 0x0e92fc87 -//.word 0x7f00b0bb -//.word 0x3718edb7 -//.word 0x6b463f69 -//.word 0x9c1cc309 -//.word 0x76a22f06 -//.word 0xf9ee1440 -//.word 0xd6f56077 -//.word 0x1ca12703 -//.word 0x1324a3c6 -//.word 0x688b7960 -//.word 0x8b963da1 -//.word 0x56c73944 -//.word 0xefb96ada -//.word 0xefb3cc04 -//.word 0xc47dd8e5 -//.word 0x54724ad7 -//.word 0xe2d7275d -//.word 0x366bff5a -//.word 0xf83f6f80 -//.word 0x5ec8eb0a -//.word 0x0733baae -//.word 0x26f842cd -//.word 0xe2b286ee -//.word 0xfd2eed6a -//.word 0xb4c24568 -//.word 0xe7e0070c -//.word 0x7aeaddec -//.word 0xfb4861c4 -//.word 0x85b9286a -//.word 0xe4e6ff04 -//.word 0xf93d7478 -//.word 0x60fc9924 -//.word 0x518c04d0 -//.word 0xc4111ae0 -//.word 0xd93f8ece -//.word 0x766f24d8 -//.word 0x32f2bbf6 -//.word 0x72a58a0f -//.word 0xd1c5aa6c -//.word 0xc605d46d -//.word 0x81de6d7b -//.word 0x1527bf3d -//.word 0xdce58a0f -//.word 0x1764bbb0 -//.word 0xd6877b3a -//.word 0x185c6b58 -//.word 0x32f32eb3 -//.word 0x757129ad -//.word 0x0b608652 -//.word 0x22497f8b -//.word 0x4d85d995 -//.word 0x2650aeb2 -//.word 0x391f701f -//.word 0x1d342b45 -//.word 0xe46f0a33 -//.word 0xb6671d4c -//.word 0xb8b9593d -//.word 0x32a0e133 -//.word 0xf2c6844a -//.word 0xeb5a8648 -//.word 0x2263a38b -//.word 0xcb545140 -//.word 0xaee046d6 -//.word 0xd00f3ab2 -//.word 0x5092ee25 -//.word 0x8f546d9b -//.word 0x93519115 -//.word 0xaeabcad9 -//.word 0x5afa1b67 -//.word 0x68e465b0 -//.word 0x5aefe883 -//.word 0x0d920748 -//.word 0x9b924bf0 -//.word 0x7f8cab2c -//.word 0xfacd0bdd -//.word 0xb66a02cc -//.word 0xaa8ee09c -//.word 0x3d0ef0fd -//.word 0xae43fa22 -//.word 0xb3180c74 -//.word 0x60627a88 -//.word 0x4b70244e -//.word 0xeee3f78c -//.word 0x4cc0b78b -//.word 0xd8c4fb11 -//.word 0x92f8798e -//.word 0x7385839a -//.word 0x0bc8d29f -//.word 0x69a983d3 -//.word 0x3b295f6a -//.word 0x363b5f09 -//.word 0xb8d56f7d -//.word 0xac4673ad -//.word 0xafca88cd -//.word 0x705c8cd5 -//.word 0x5dcbe032 -//.word 0x7c106cbb -//.word 0x96dfe4e6 -//.word 0x9b7c4a3c -//.word 0x42d0b50a -//.word 0xf0bc505a -//.word 0xdbada521 -//.word 0x6f711cba -//.word 0xf149be93 -//.word 0x623f3f27 -//.word 0xa6b93c2c -//.word 0xe54fc10d -//.word 0x32da0e9a -//.word 0x6acd9bff -//.word 0x5fc959f2 -//.word 0x366b3b31 -//.word 0x0e69f52c -//.word 0xe3dd04fe -//.word 0xb1e0eea2 -//.word 0xdc5bcb64 -//.word 0xcf1a0495 -//.word 0xe3225b83 -//.word 0x83452ba9 -//.word 0x8ff3f122 -//.word 0xfd530c64 -//.word 0xc692c12a -//.word 0x007c82b2 -//.word 0x47497029 -//.word 0x62b91e64 -//.word 0x246398d0 -//.word 0x8f49a4ac -//.word 0x40b14775 -//.word 0x07308ba2 -//.word 0xd5088092 -//.word 0xdbb481c3 -//.word 0xf0c0b844 -//.word 0x33dee56d -//.word 0xf2375acd -//.word 0xcbff4a64 -//.word 0x114c4412 -//.word 0x7228fb50 -//.word 0xd6e4481e -//.word 0x89b0723c -//.word 0x9d69ac9d -//.word 0x8ab2df19 -//.word 0x1846aa62 -//.word 0x7f8da839 -//.word 0xcc6df1e2 -//.word 0x8662e3d5 -//.word 0x92d122b6 -//.word 0x5499dd87 -//.word 0x17ec531d -//.word 0xaf5d96d0 -//.word 0x5c398f77 -//.word 0xf21b4394 -//.word 0x37bb54cb -//.word 0x8d07cb99 -//.word 0xd1751442 -//.word 0x82974a0b -//.word 0x26f0b6aa -//.word 0xe90692fb -//.word 0x88b812f4 -//.word 0x6dd2a5db -//.word 0x1cdf78b6 -//.word 0xcd3e3b04 -//.word 0x5a7829aa -//.word 0x5cd14230 -//.word 0x911ddb2d -//.word 0x82d55900 -//.word 0x626a3ac1 -//.word 0x38d95578 -//.word 0x4180628c -//.word 0x8f30bc7e -//.word 0xf78366d6 -//.word 0x2a704c5e -//.word 0x221ccc8f -//.word 0xc0f37549 -//.word 0xb3f80fc7 -//.word 0x9b59dbd1 -//.word 0x6e471c33 -//.word 0x1b04d56f -//.word 0x6e3ed5af -//.word 0x349bf1fd -//.word 0x9f9591b6 -//.word 0xec886e3c -//.word 0x420999ec -//.word 0xde7ac050 -//.word 0x6ddbad95 -//.word 0xb9e30f3f -//.word 0x88507d1b -//.word 0xc17bb875 -//.word 0xd12f308c -//.word 0x4dbbca43 -//.word 0xd946e119 -//.word 0x48638b5b -//.word 0x05e61d99 -//.word 0xb1f5f156 -//.word 0x0d626603 -//.word 0x1b38292f -//.word 0x8093b3f8 -//.word 0x2db513c5 -//.word 0x3e57ee37 -//.word 0x223dc45c -//.word 0xfd0d7426 -//.word 0x4a61031c -//.word 0xc51b9950 -//.word 0x88f9cc91 -//.word 0x746921e1 -//.word 0xd29ed02a -//.word 0x3ae3c82c -//.word 0xb42ff3ba -//.word 0x1efabb26 -//.word 0xce50cdfa -//.word 0x78241de8 -//.word 0x51e62a04 -//.word 0x74588331 -//.word 0x859d8ad9 -//.word 0x959278e2 -//.word 0x4662a1dd -//.word 0x3055fa80 -//.word 0x83e9d856 -//.word 0xed24fab5 -//.word 0xbe28caf1 -//.word 0x4a08e0cf -//.word 0x8edac83c -//.word 0x170e053f -//.word 0x20fe552d -//.word 0xfbc5371c -//.word 0xb255ab99 -//.word 0xedc4399e -//.word 0x16e734be -//.word 0xbc2240a3 -//.word 0x357e12ba -//.word 0x88fc772d -//.word 0x8a2a9812 -//.word 0x46f37ce2 -//.word 0xa2bbce2c -//.word 0x40ace18a -//.word 0xa34af1d5 -//.word 0x934eac95 -//.word 0xc2b1f0bb -//.word 0xaf07d793 -//.word 0xcb0ef1f4 -//.word 0xdb87d0ba -//.word 0x9d44ca75 -//.word 0xae83fa63 -//.word 0xab7a889c -//.word 0x96332a8d -//.word 0x7c9aeba7 -//.word 0x55d52c58 -//.word 0x2cd3e83b -//.word 0x80283c8c -//.word 0xe91826de -//.word 0xfff18d10 -//.word 0x779f817d -//.word 0x8f7ac573 -//.word 0xad628ae7 -//.word 0x420e7e66 -//.word 0xf5a1054f -//.word 0xfe7ec640 -//.word 0xcf5e6ace -//.word 0xfaa0a079 -//.word 0x4fe065de -//.word 0x44ca822f -//.word 0x9b3056e1 -//.word 0x3e5bd5a4 -//.word 0x6e9fd198 -//.word 0x1c3279be -//.word 0x973f1fad -//.word 0x68353e86 -//.word 0x7a65bb29 -//.word 0x7fcc6ba9 -//.word 0x8e2dd6fe -//.word 0x11643afa -//.word 0xdef6d37f -//.word 0xa4ec5aee -//.word 0x89e2cce2 -//.word 0x115b6c1f -//.word 0x42570bc5 -//.word 0x062887ca -//.word 0xd08192a6 -//.word 0x82d0b450 -//.word 0x8fcd936a -//.word 0x5c5373b8 -//.word 0xed70f9d7 -//.word 0xbdb8342c -//.word 0xeddede1a -//.word 0xa185de78 -//.word 0xa8531242 -//.word 0x5b474c8e -//.word 0xc74d9ac2 -//.word 0x0e10cb05 -//.word 0x0a102ef3 -//.word 0x34f49d95 -//.word 0xc421ba90 -//.word 0x1a8b799c -//.word 0x5dcbdf38 -//.word 0x6273099d -//.word 0xcf9e6ff0 -//.word 0x80cb6abb -//.word 0x29ebf49e -//.word 0x3db8af42 -//.word 0x0f492a8f -//.word 0x38e35f1f -//.word 0x381380f2 -//.word 0x60f9f363 -//.word 0xefe79b5a -//.word 0x7b2b59c4 -//.word 0x9228d240 -//.word 0xa2ac731b -//.word 0x167db37f -//.word 0xc23598e7 -//.word 0x81507dd6 -//.word 0x1c8412c9 -//.word 0x6e51a46a -//.word 0xc6d89f06 -//.word 0x8df05141 -//.word 0x2977f009 -//.word 0x20e6dfc8 -//.word 0x81282dde -//.word 0x80ad5f4e -//.word 0x60ba6fb7 -//.word 0x96031487 -//.word 0x2b7b446b -//.word 0x626bf70a -//.word 0x9bc12ff2 -//.word 0x77ab35d2 -//.word 0x3d6525eb -//.word 0x7c50acc1 -//.word 0xf2431116 -//.word 0xad257218 -//.word 0x70bc51da -//.word 0x58c04f01 -//.word 0xbf3436c0 -//.word 0x61f63d06 -//.word 0xbd9488f5 -//.word 0xbf61ef97 -//.word 0x9bc800cc -//.word 0xfce14787 -//.word 0x5e42cd3a -//.word 0xb818de8f -//.word 0x5f760f59 -//.word 0x27ec80ca -//.word 0xcb5c5fe6 -//.word 0x8f09ad37 -//.word 0x23f145c3 -//.word 0xcb5d1a3b -//.word 0xbdb6c075 -//.word 0xca9a2e1c -//.word 0x412fc2a7 -//.word 0x11b78587 -//.word 0x2d65b1a5 -//.word 0x356f700b -//.word 0x5265e7e1 -//.word 0x62c1739c -//.word 0x55bf3272 -//.word 0xd66fc611 -//.word 0x2e085590 -//.word 0x667fd4a6 -//.word 0xac58861a -//.word 0xf9bdbf7a -//.word 0xf0cdee10 -//.word 0x0836da12 -//.word 0xed062c19 -//.word 0x24be2ed4 -//.word 0xeea8d2fe -//.word 0x706bf68d -//.word 0x10dde62d -//.word 0x221823ec -//.word 0xc4d06337 -//.word 0x06e4d805 -//.word 0x4f32b552 -//.word 0xfcb0efcf -//.word 0x49b940d8 -//.word 0x75a472a6 -//.word 0x219bdac6 -//.word 0xfaaa23c9 -//.word 0x97174d3e -//.word 0xa4f2f4dd -//.word 0x41ecd605 -//.word 0xa56d9069 -//.word 0x07e0a806 -//.word 0xbe52d058 -//.word 0xa73b69cd -//.word 0xc79b477a -//.word 0x3149b40c -//.word 0x2a88b702 -//.word 0x8cdc961a -//.word 0x681c9909 -//.word 0xefc7116f -//.word 0x939b990a -//.word 0x69649c2a -//.word 0xd2131765 -//.word 0x5a0fa08b -//.word 0xe0d0a8dd -//.word 0xf8a9fd79 -//.word 0x8de59219 -//.word 0xcb1683fd -//.word 0x3baa5426 -//.word 0x30bf7ac5 -//.word 0x63391cf3 -//.word 0xda111aa2 -//.word 0x0eef4fd4 -//.word 0x4cfc130b -//.word 0x5cf10400 -//.word 0x61750797 -//.word 0x00a58913 -//.word 0xc4f40b86 -//.word 0xc135dd8c -//.word 0x78f62939 -//.word 0xfb103450 -//.word 0x527ce1b6 -//.word 0x1c687726 -//.word 0x798aa325 -//.word 0x28b5c139 -//.word 0xedaa5756 -//.word 0x3630e299 -//.word 0xfd67d639 -//.word 0xf059e0ba -//.word 0xd0d26e63 -//.word 0x177271f3 -//.word 0xdd006190 -//.word 0xfc018200 -//.word 0x7389671b -//.word 0x0852b480 -//.word 0x320b2888 -//.word 0x35f2da78 -//.word 0x8fa5c2fb -//.word 0x93357ccf -//.word 0x547d49be -//.word 0xc4b257d0 -//.word 0x1d3b42bf -//.word 0x80c2daab -//.word 0xdc8b270f -//.word 0x1204aaf4 -//.word 0x579ee664 -//.word 0xd9dc1f22 -//.word 0xa5a96298 -//.word 0xc8efc511 -//.word 0xb465f028 -//.word 0xe6a9dc80 -//.word 0xc68edbb6 -//.word 0xcfb7d994 -//.word 0xef65e188 -//.word 0x318de354 -//.word 0x992eb406 -//.word 0x4fe1562b -//.word 0x01b27a40 -//.word 0x822e4369 -//.word 0xb7bd4d66 -//.word 0xb332eec2 -//.word 0x21a1bb4d -//.word 0xe2704ecd -//.word 0xf8b147f1 -//.word 0xa3af9186 -//.word 0xc9c7e7ed -//.word 0x9b7a96cd -//.word 0x76c08405 -//.word 0x079e71e5 -//.word 0xb3fa7d9d -//.word 0x36afeaf5 -//.word 0x8add243f -//.word 0x0a82fe8a -//.word 0xd74f3f19 -//.word 0x7bb45d14 -//.word 0xcc3e887c -//.word 0x1322ea64 -//.word 0x6e1a2e5f -//.word 0x736f3f35 -//.word 0x165752da -//.word 0xcd8226a0 -//.word 0xf2f08aab -//.word 0x680521a5 -//.word 0x81df62b4 -//.word 0x1fe7e2a9 -//.word 0x1aa6d67b -//.word 0xe2dbd3f3 -//.word 0x66cad9a8 -//.word 0x34d6902e -//.word 0xe152d18b -//.word 0xab9568ea -//.word 0x5d4c1994 -//.word 0x7315e11b -//.word 0x7f497dd8 -//.word 0xcb183198 -//.word 0x40dcc293 -//.word 0x86a7c49e -//.word 0x6d1e1ca1 -//.word 0x8c8bbd4a -//.word 0x282db503 -//.word 0x57d36d22 -//.word 0x64a92c60 -//.word 0x7651de8d -//.word 0x6d351482 -//.word 0x0d1c4b56 -//.word 0x5efc71d5 -//.word 0x520fa52d -//.word 0xa9293feb -//.word 0x12491026 -//.word 0x936eebfa -//.word 0x2aac6339 -//.word 0xb57ed75c -//.word 0x0f5eacc0 -//.word 0x7c93da0f -//.word 0x474baafb -//.word 0xa9e9be33 -//.word 0xeda0518f -//.word 0xd241c08e -//.word 0x31514903 -//.word 0xdf5f130b -//.word 0xd5946f42 -//.word 0x8e8c5e37 -//.word 0xb164531d -//.word 0xf0153ac3 -//.word 0x3000b8c6 -//.word 0xeacab505 -//.word 0xd1691855 -//.word 0xb57fd176 -//.word 0xa7e71d46 -//.word 0x5e8e0535 -//.word 0xd98528f9 -//.word 0x4654bb83 -//.word 0x2390ce31 -//.word 0xa3b0d145 -//.word 0x531c5696 -//.word 0xfd871985 -//.word 0xcc7f3d33 -//.word 0xb242d8f1 -//.word 0x07d4b2f8 -//.word 0x734e4a5b -//.word 0x0d791a39 -//.word 0xc49b1c37 -//.word 0xff918d2d -//.word 0x801ef120 -//.word 0x8e835771 -//.word 0x5350de53 -//.word 0x83797882 -//.word 0x3eacee33 -//.word 0x38e22546 -//.word 0x17359fc3 -//.word 0x1cf14484 -//.word 0x06ed632f -//.word 0x331cf468 -//.word 0x095f2044 -//.word 0x949d0300 -//.word 0x7016b0f3 -//.word 0xeaf475c1 -//.word 0x622361d2 -//.word 0xf4630402 -//.word 0x579c769a -//.word 0x04719b80 -//.word 0x9b17a4aa -//.word 0x8368d9d8 -//.word 0xd1339683 -//.word 0x6cd79410 -//.word 0x6e106a4a -//.word 0xcd10540f -//.word 0x3ad23249 -//.word 0x49abd421 -//.word 0xd322746f -//.word 0x99018474 -//.word 0x29acabcb -//.word 0x06b20a9d -//.word 0x03a2c315 -//.word 0xf020bc13 -//.word 0x7837a025 -//.word 0x4af127b3 -//.word 0x77259879 -//.word 0x1b918c3a -//.word 0x4028f4b3 -//.word 0xffad5dcf -//.word 0xe8817319 -//.word 0xa5bac476 -//.word 0xd974c714 -//.word 0x4e6c1d9e -//.word 0x50cb16b2 -//.word 0x543f7794 -//.word 0xde507b24 -//.word 0xa1f2170d -//.word 0xe7568240 -//.word 0x3306f5a1 -//.word 0x2531b0ff -//.word 0x9f433d4a -//.word 0x26b9f800 -//.word 0x8b34cfe9 -//.word 0xcacc4704 -//.word 0x32a6bfc1 -//.word 0xc6c9f970 -//.word 0xe42dd6fa -//.word 0x241561cf -//.word 0x839f0f1f -//.word 0xc19a464d -//.word 0x07971ba1 -//.word 0xcd43603d -//.word 0xfbf4de52 -//.word 0x4e81df93 -//.word 0xfe57f0ea -//.word 0x9ec9e46a -//.word 0x43a81c86 -//.word 0xe8140680 -//.word 0x1191e424 -//.word 0xaf5ecfb5 -//.word 0x4402fb28 -//.word 0x47273c90 -//.word 0xcaabc9da -//.word 0x5af541ba -//.word 0x2785ebe5 -//.word 0x65cf4281 -//.word 0xf14ab1d9 -//.word 0x38c49b56 -//.word 0x55f89eab -//.word 0x7962194f -//.word 0x9052eb30 -//.word 0x21407ea6 -//.word 0x765f05a5 -//.word 0xfe740138 -//.word 0xefe90a2a -//.word 0x2f1dcc06 -//.word 0x75ff5043 -//.word 0xacdb7db8 -//.word 0x9874de56 -//.word 0xbb52a515 -//.word 0x7a5df02f -//.word 0x7cab4c8d -//.word 0x5397777e -//.word 0x5e136baf -//.word 0xed3f9758 -//.word 0xa73a70b3 -//.word 0x293728b2 -//.word 0xf0d4bdf1 -//.word 0x79a836ea -//.word 0xa61b2a68 -//.word 0x647b813e -//.word 0x8b4c7e38 -//.word 0x06dffe52 -//.word 0x3326fa28 -//.word 0x8cc653ae -//.word 0x886ecf21 -//.word 0xbc675e3d -//.word 0x466da3b1 -//.word 0x6bbeafd0 -//.word 0x7f701089 -//.word 0x05070a99 -//.word 0x184724ff -//.word 0x0a47e7b0 -//.word 0x4ac7e28d -//.word 0x8bc3f192 -//.word 0x2249bf50 -//.word 0xb0878a9d -//.word 0x0228268a -//.word 0x35e14595 -//.word 0x1e46f520 -//.word 0xe9e36a22 -//.word 0xff88fe1d -//.word 0x2ee47650 -//.word 0x0455872d -//.word 0x7bff990d -//.word 0xdc1cca23 -//.word 0xdd9236ae -//.word 0x0ccb7673 -//.word 0x71c1666b -//.word 0x6f582bb9 -//.word 0xecf175de -//.word 0xb23c0230 -//.word 0x144d6489 -//.word 0xd4f3033c -//.word 0x4445654d -//.word 0xac7dade1 -//.word 0xec0a62f3 -//.word 0x62e07249 -//.word 0x0e1377a6 -//.word 0xf4a43842 -//.word 0xc29b7377 -//.word 0xb355dabd -//.word 0xb3205bd8 -//.word 0xc405a450 -//.word 0xa0e5e722 -//.word 0xa0c8dab5 -//.word 0xdc71030f -//.word 0x94363249 -//.word 0xcf0e4f40 -//.word 0x41ec558e -//.word 0x724b9fb9 -//.word 0x1d0a63a9 -//.word 0xd67b7c60 -//.word 0xf0b76ce5 -//.word 0x9e34a181 -//.word 0x5899f72e -//.word 0x81d07f4d -//.word 0x465d7f97 -//.word 0xc9efb956 -//.word 0x7f35f0d5 -//.word 0xd6f3a915 -//.word 0x1c552fc1 -//.word 0x9c83d964 -//.word 0x0a758fda -//.word 0x21098b05 -//.word 0x8a535dc1 -//.word 0x00343219 -//.word 0xb22e55bb -//.word 0xe876f6a9 -//.word 0xea4b2b32 -//.word 0x1e873421 -//.word 0x70740334 -//.word 0xf6e0fccf -//.word 0xd474f9f2 -//.word 0x5e419169 -//.word 0x7d9c9a42 -//.word 0x542cec84 -//.word 0x2341681e -//.word 0x6b67391e -//.word 0x533c5a23 -//.word 0x4a7e5815 -//.word 0xee685a13 -//.word 0x2c3f5ead -//.word 0xa928c554 -//.word 0x613c120e -//.word 0x8fdeef6f -//.word 0xcc4c71c4 -//.word 0x7a759c91 -//.word 0x630b2a3e -//.word 0x9ed8880d -//.word 0xb355224f -//.word 0xfe79e0d8 -//.word 0x59cff0b0 -//.word 0xf5cbc70b -//.word 0x895e627b -//.word 0xafc8d265 -//.word 0x8aaef7b2 -//.word 0xad6c8cc6 -//.word 0x38ac63b6 -//.word 0x4438f2b5 -//.word 0x820c0fd0 -//.word 0x1eb0f8dc -//.word 0xeac496ac -//.word 0xb8dc0387 -//.word 0x078f49d8 -//.word 0xe3cb6d28 -//.word 0x066bac4a -//.word 0x430c04d5 -//.word 0x251cf6d8 -//.word 0xd3338bc8 -//.word 0x36a795bd -//.word 0x5e5b37de -//.word 0x22d7a71a -//.word 0x079e331a -//.word 0x64bb8273 -//.word 0xc39e1d1f -//.word 0x89262d2e -//.word 0xdaff87b9 -//.word 0xb72ee518 -//.word 0x69ea7654 -//.word 0x23ae9adf -//.word 0xe38ce683 -//.word 0x99c46f99 -//.word 0x8b95457b -//.word 0xf8533d3c -//.word 0xfbbaf496 -//.word 0xb3821023 -//.word 0xa133c9d0 -//.word 0x513ba990 -//.word 0x3d3e8f4d -//.word 0xeeadfa24 -//.word 0x649a84d1 -//.word 0xb8cbad68 -//.word 0x000dda47 -//.word 0x73ca9e48 -//.word 0xcede373b -//.word 0xf6a75c93 -//.word 0xde5b365f -//.word 0xab9fac7c -//.word 0x1655e309 -//.word 0x12b5051c -//.word 0xaf9f42b3 -//.word 0x3f2f15ee -//.word 0xb793c97b -//.word 0x58193b51 -//.word 0x8e8ce1a1 -//.word 0x18c10b09 -//.word 0x696d690c -//.word 0x4e39cebf -//.word 0xd21933c4 -//.word 0x5fd9ff7c -//.word 0x25f98679 -//.word 0xbfbacf32 -//.word 0x14799afb -//.word 0x7c3ca134 -//.word 0x258b1fc0 -//.word 0xb4818fb9 -//.word 0x2f22b661 -//.word 0x1aefe35c -//.word 0xe0b8761d -//.word 0x75b29f9f -//.word 0x3ac96855 -//.word 0x2137f663 -//.word 0x11560b0e -//.word 0x8cb2d071 -//.word 0x8f63d272 -//.word 0xb99a4af5 -//.word 0xb079a150 -//.word 0xc12833fe -//.word 0xc6255497 -//.word 0x4ddb90ff -//.word 0xf67737de -//.word 0x1df71a51 -//.word 0xb9838fe0 -//.word 0x8401bbaf -//.word 0x5de410f8 -//.word 0xea4414b8 -//.word 0x813464a9 -//.word 0x4950f971 -//.word 0x9c95ab19 -//.word 0xb076f3c0 -//.word 0x772bf591 -//.word 0xc34dbef2 -//.word 0xaea0cafe -//.word 0x3930c936 -//.word 0x339fa273 -//.word 0x5dbdb920 -//.word 0xcb596ea5 -//.word 0x8d57e626 -//.word 0x8f030d6e -//.word 0xbea5db26 -//.word 0x6c56d74b -//.word 0xf611dadf -//.word 0xa40d16de -//.word 0xd04a5673 -//.word 0x4b6a876c -//.word 0xfcc378ec -//.word 0xcab2de5f -//.word 0xbd329bb3 -//.word 0x5fad40c6 -//.word 0x6912d01a -//.word 0x9b27c7d0 -//.word 0xec215ad4 -//.word 0xe3720155 -//.word 0x45e23378 -//.word 0xf0e1704d -//.word 0x071b8502 -//.word 0x4f4e0c56 -//.word 0xd9583251 -//.word 0xe295bd32 -//.word 0xf7674daa -//.word 0x5d16e147 -//.word 0xafdb9e33 -//.word 0xc937cc1e -//.word 0xe5892279 -//.word 0x04e043e5 -//.word 0x900e88eb -//.word 0x3ffe00ed -//.word 0x3a47b55c -//.word 0x7f00312c -//.word 0x83d74185 -//.word 0x1c5df9bc -//.word 0x9fa4f881 -//.word 0x450cee5a -//.word 0xd45a5b50 -//.word 0x7b0a99e7 -//.word 0xfde71c54 -//.word 0x12d8f9eb -//.word 0x0afda5d7 -//.word 0xb3faff0d -//.word 0x7d939183 -//.word 0xdc7a139c -//.word 0xee6431e7 -//.word 0x5e628f0a -//.word 0x886f09f9 -//.word 0xdd453f6c -//.word 0x8976518f -//.word 0x54b7e7fb -//.word 0xc67f75e5 -//.word 0x8fd1bd95 -//.word 0x2655951a -//.word 0xafaeea3d -//.word 0x220805b3 -//.word 0xaaf00d97 -//.word 0x4b69cd17 -//.word 0xc83cb86d -//.word 0xc48f2a11 -//.word 0x27b9f12c -//.word 0xc3550c50 -//.word 0x3895b267 -//.word 0x14da97ea -//.word 0x3f816a54 -//.word 0x97ffa2d5 -//.word 0xd7307a4a -//.word 0xbdec3a6d -//.word 0x6cdcb949 -//.word 0x0f8b20f2 -//.word 0xbfc0f072 -//.word 0xa70c4706 -//.word 0x659f5f8b -//.word 0xb45f5733 -//.word 0x483c367c -//.word 0xfabd2d63 -//.word 0x25df1cd4 -//.word 0x50205866 -//.word 0x0dd7ac45 -//.word 0x20c69d6f -//.word 0xe4f2f224 -//.word 0xebb37497 -//.word 0xe507f3ea -//.word 0xc32b8959 -//.word 0x1c6d23b6 -//.word 0xcf3c3c15 -//.word 0xea81ecc8 -//.word 0xca32228e -//.word 0x84232d07 -//.word 0x8420826b -//.word 0x743ab97c -//.word 0x605ed8b9 -//.word 0x172cd4d5 -//.word 0xd4055567 -//.word 0x1d66bae3 -//.word 0xec755dc9 -//.word 0x0dda181c -//.word 0xc7d00816 -//.word 0xbe7c901a -//.word 0x187da1ea -//.word 0xdfc4391a -//.word 0xa6a62ac5 -//.word 0x702f1d7e -//.word 0xcdbad689 -//.word 0x46beba4c -//.word 0xfbeb8e00 -//.word 0x8b7681ac -//.word 0x34b16d54 -//.word 0x3cde5a6d -//.word 0x8f454495 -//.word 0xa9841e81 -//.word 0xb6271637 -//.word 0xf8781b7d -//.word 0x6a989c91 -//.word 0xa3cf931a -//.word 0xfc21c35f -//.word 0xf5223db7 -//.word 0xd50b2940 -//.word 0x910cc3d4 -//.word 0xefe4a439 -//.word 0xebb04398 -//.word 0x5a00bb31 -//.word 0xcd30cf4c -//.word 0xb8f62b73 -//.word 0xd437ecde -//.word 0xc11f632f -//.word 0xf0701660 -//.word 0xc01a08f9 -//.word 0xe70d3b86 -//.word 0x144b7248 -//.word 0xd3413b2b -//.word 0xb0572df8 -//.word 0x9fc66fcc -//.word 0x9ba97ac9 -//.word 0x8e581f0b -//.word 0x71f1cbdd -//.word 0xb4370a2d -//.word 0xe0a04a3e -//.word 0x7ba9e29d -//.word 0x2c6d5256 -//.word 0x1f76cc67 -//.word 0xabd3f475 -//.word 0x326ae5be -//.word 0x4990744f -//.word 0x19d7b877 -//.word 0x0527ca7b -//.word 0x8e11c98b -//.word 0x735f21f5 -//.word 0x1cf00d99 -//.word 0x38c35b9d -//.word 0xa6517062 -//.word 0x91208bb6 -//.word 0xe0954e4b -//.word 0xcd0a7a67 -//.word 0xd320fade -//.word 0xce56233e -//.word 0x5edb3a49 -//.word 0x8ca136a8 -//.word 0xb0b3c8dd -//.word 0x92c8997a -//.word 0xcf18d390 -//.word 0x7e6ee26b -//.word 0x147f7c7c -//.word 0x857ade97 -//.word 0xace0595f -//.word 0xed960efe -//.word 0x1939f619 -//.word 0x91b12502 -//.word 0xaf094f30 -//.word 0x617d8bed -//.word 0x17d5574f -//.word 0xe0f2dc69 -//.word 0xcfa774c2 -//.word 0xa4ca6a07 -//.word 0xa88a01fc -//.word 0xd902b7b8 -//.word 0x470fca12 -//.word 0xbe5ffc57 -//.word 0xa5cb933e -//.word 0x26e7a51d -//.word 0x90d7925c -//.word 0xf964d22a -//.word 0x274ff170 -//.word 0xb1e4d703 -//.word 0x61d34d1e -//.word 0xdd3cbd0f -//.word 0x86093930 -//.word 0xa180bf19 -//.word 0xb518bc14 -//.word 0x338cced2 -//.word 0x5c2fce5c -//.word 0x607f0e4b -//.word 0xc3fcdf3c -//.word 0x053b577f -//.word 0x8236510f -//.word 0x97e6b4c7 -//.word 0x0614f9d2 -//.word 0x9c6ce764 -//.word 0x11d3a1a7 -//.word 0x2ffae3f9 -//.word 0x36338954 -//.word 0x8084510d -//.word 0x61fae1c2 -//.word 0x51400c8e -//.word 0x4d70517e -//.word 0x7a29a449 -//.word 0x0ce2723b -//.word 0x667edf73 -//.word 0x8220524e -//.word 0x94403323 -//.word 0xeafff331 -//.word 0x17b74dd5 -//.word 0x50d7cc01 -//.word 0x16ee8ee9 -//.word 0x160547ff -//.word 0x4d328822 -//.word 0x6f6a4212 -//.word 0x8a978628 -//.word 0xe6ea8e44 -//.word 0x31730106 -//.word 0xd8ef7341 -//.word 0xb8e12bac -//.word 0xf6e42adb -//.word 0x2b3f696e -//.word 0xc5ba6189 -//.word 0xaab0d084 -//.word 0x1e66bbe3 -//.word 0xe69baf88 -//.word 0xad604d27 -//.word 0xa82a06fb -//.word 0x762622b7 -//.word 0x4acc07c0 -//.word 0x4bb7b899 -//.word 0x3bb49c9e -//.word 0x571981f6 -//.word 0x7f58e0c3 -//.word 0x97d3629b -//.word 0x2df2a43c -//.word 0x5c73377b -//.word 0xf002ec7e -//.word 0xca0a4e2b -//.word 0x87ca6fe0 -//.word 0x5cabe865 -//.word 0x44d11b1f -//.word 0x5ef0bb86 -//.word 0x90618fd9 -//.word 0x71757210 -//.word 0x66099f12 -//.word 0x0b5a2b28 -//.word 0xd41bd3b1 -//.word 0xf4c5f818 -//.word 0x7d2fe804 -//.word 0xc95e5fce -//.word 0x1a9e4e38 -//.word 0x7dd1da5c -//.word 0xf408a8e2 -//.word 0xd3505876 -//.word 0x6bcf4f79 -//.word 0xe60fbaf7 -//.word 0x7299cfda -//.word 0xa2c6565d -//.word 0x10d269c3 -//.word 0x48327848 -//.word 0xe1279058 -//.word 0xed94dcff -//.word 0x940d6ca1 -//.word 0xfb3035eb -//.word 0x6b385909 -//.word 0xafcfa919 -//.word 0xbd2468e0 -//.word 0x993e52bc -//.word 0x7790ddda -//.word 0x20cdbfa9 -//.word 0x96fdb08f -//.word 0xfbd171da -//.word 0xaf330df9 -//.word 0xb9225fec -//.word 0x68bdd4f9 -//.word 0x399d73a1 -//.word 0xfc681ad2 -//.word 0x33a30a5e -//.word 0xbbc8a5ac -//.word 0xae9977ae -//.word 0x87b37412 -//.word 0x876680bd -//.word 0x58c43575 -//.word 0xf1f8e0dd -//.word 0xb9dacca7 -//.word 0xefc0c405 -//.word 0x4996d360 -//.word 0xdb314e4d -//.word 0x3be014bd -//.word 0xe3441573 -//.word 0xd66211bc -//.word 0x87f7a25a -//.word 0xf60b7dc1 -//.word 0x1cc9f586 -//.word 0x898ec114 -//.word 0x4c40fea1 -//.word 0x13e17860 -//.word 0x936425f8 -//.word 0x2abff236 -//.word 0xc341c2fe -//.word 0xfb26b488 -//.word 0x8269a5c9 -//.word 0xc3d9f72e -//.word 0xc76f9090 -//.word 0x56df2565 -//.word 0x606db833 -//.word 0x9c025f4b -//.word 0x6f7f48b3 -//.word 0x0f51fa64 -//.word 0xe846ddb5 -//.word 0x3f9efd18 -//.word 0x15660b04 -//.word 0x4e01a532 -//.word 0x1208d60c -//.word 0x7454e163 -//.word 0x51583a60 -//.word 0x7bb4d6bd -//.word 0x1708a434 -//.word 0x44065c38 -//.word 0xfecc77e4 -//.word 0x41707e31 -//.word 0x71dc886b -//.word 0xf9dcffe6 -//.word 0x3375a2ed -//.word 0x8879d0fb -//.word 0xd858032e -//.word 0x1b399bf8 -//.word 0x4949dd18 -//.word 0x78533bc8 -//.word 0x4492d538 -//.word 0x74c3413c -//.word 0xdb7d8741 -//.word 0x7bc57086 -//.word 0xf1de0189 -//.word 0x0d5e42bf -//.word 0xc0874487 -//.word 0x3bd36161 -//.word 0x55d1c65b -//.word 0x2d302fcd -//.word 0x1119f246 -//.word 0x9fc33fc6 -//.word 0x2a41a62e -//.word 0x609ed9f4 -//.word 0x292bb41b -//.word 0xd2187a63 -//.word 0x6a4262bd -//.word 0x6c4c5201 -//.word 0x9ff1eae3 -//.word 0x3b98c424 -//.word 0x4d29fa05 -//.word 0x5c20e901 -//.word 0x4de035bb -//.word 0x84490e36 -//.word 0x4c8cb144 -//.word 0x793e3141 -//.word 0x4cac7700 -//.word 0x966f8706 -//.word 0x204006f6 -//.word 0x4b0df94d -//.word 0xf44cd04f -//.word 0x9a8fa342 -//.word 0xc358bbd9 -//.word 0x9b2f54f3 -//.word 0xdff3a186 -//.word 0xf96e11d5 -//.word 0x6d2bd1ea -//.word 0x738c9240 -//.word 0xe5178cc0 -//.word 0x5c11c3ee -//.word 0x974e8965 -//.word 0x1c474481 -//.word 0x216d715b -//.word 0xacbde9fa -//.word 0xfa9563c7 -//.word 0x1ec63b42 -//.word 0xeaea72f4 -//.word 0x12f8f5a4 -//.word 0x8f1522ce -//.word 0x42ad8851 -//.word 0xdac3ee68 -//.word 0xf78597db -//.word 0x8f24c577 -//.word 0x92e27cbb -//.word 0xc96d88d4 -//.word 0x046bc2cc -//.word 0x74568efe -//.word 0x568aa8cd -//.word 0xd19c2195 -//.word 0x22eea4e2 -//.word 0xf680fee0 -//.word 0x1709dd13 -//.word 0x4b47d848 -//.word 0x7a93b0cc -//.word 0x0eb8d6db -//.word 0x9f052d5b -//.word 0xd0a110cb -//.word 0x741f9776 -//.word 0xf65216ec -//.word 0xf763e7b2 -//.word 0x38206a39 -//.word 0xbb97490d -//.word 0x25e4014f -//.word 0x67479e65 -//.word 0x9d7ac5f0 -//.word 0x3641f8fe -//.word 0x56421682 -//.word 0x78172101 -//.word 0x58a2448d -//.word 0x10a015f7 -//.word 0x81811741 -//.word 0xf4788352 -//.word 0x01ce48ed -//.word 0xb17b50e4 -//.word 0xdff70589 -//.word 0xe44e1466 -//.word 0x7373702e -//.word 0xc1d69bf3 -//.word 0xe9382198 -//.word 0x90be658a -//.word 0xc4459fab -//.word 0x2af6268f -//.word 0x591aebeb -//.word 0x812f464a -//.word 0x503bf602 -//.word 0x16606367 -//.word 0x27b1253e -//.word 0x8144ca75 -//.word 0xae88d411 -//.word 0xecd90267 -//.word 0x8c52d18f -//.word 0x98e34116 -//.word 0xb8a3dcf3 -//.word 0x5667f5bc -//.word 0x01932e1a -//.word 0x0f303d7b -//.word 0x873fef06 -//.word 0x3e4d6cd4 -//.word 0x3f48be5d -//.word 0x70918d30 -//.word 0x73522ce8 -//.word 0xcb12da5b -//.word 0x40874114 -//.word 0x84ab4304 -//.word 0x1612f674 -//.word 0x677aed3e -//.word 0x3ca4ba3d -//.word 0x5362b002 -//.word 0x49f2eec8 -//.word 0xbb8a99aa -//.word 0xac346814 -//.word 0x26dc6678 -//.word 0x24a7f342 -//.word 0xb0870c0d -//.word 0x490dcd17 -//.word 0x877e34f2 -//.word 0x0228287d -//.word 0x6ff6ba13 -//.word 0x0c43aa02 -//.word 0x3fec2d3f -//.word 0x79a9ed58 -//.word 0x619d52a9 -//.word 0x2f2b00d3 -//.word 0x550ca16a -//.word 0x659ee4ee -//.word 0x2f7fc5fd -//.word 0x295b10c6 -//.word 0x150220c1 -//.word 0xddbeed9e -//.word 0xc2e3467b -//.word 0xb5a75a59 -//.word 0x05347dd1 -//.word 0x3bfc2903 -//.word 0x434d43d0 -//.word 0xcc25a049 -//.word 0xf047c866 -//.word 0x188efafc -//.word 0x1a8270e9 -//.word 0xa529e391 -//.word 0xdf20528f -//.word 0x4ce900a4 -//.word 0xf287bcf3 -//.word 0xbb486471 -//.word 0x1ae3ac97 -//.word 0xf1c21c5a -//.word 0xb3a1585c -//.word 0xc658a464 -//.word 0x2bf5a70c -//.word 0x600e6fb9 -//.word 0x8556b6d0 -//.word 0xbf6d6427 -//.word 0xdafd55ba -//.word 0x32025ba0 -//.word 0xd369873d -//.word 0xdfdda4b8 -//.word 0x30de05af -//.word 0x3f13812a -//.word 0x44e1bbce -//.word 0x9f3ca754 -//.word 0x77bd4939 -//.word 0xa1f5c0b6 -//.word 0xc30284f2 -//.word 0xb95fec77 -//.word 0x3701f3e2 -//.word 0xb09f3bdf -//.word 0x77515255 -//.word 0x255c35de -//.word 0x3a4c127a -//.word 0x07445284 -//.word 0xcb93d7e5 -//.word 0x1c878287 -//.word 0x8886f90d -//.word 0x7d5aa7c1 -//.word 0x66cd04cd -//.word 0x177616af -//.word 0x6bd238e7 -//.word 0x2b971af2 -//.word 0x3244097c -//.word 0xcffd70d2 -//.word 0x6b969f96 -//.word 0x6ceeccb6 -//.word 0x597e579e -//.word 0x3e3153ad -//.word 0x527641e6 -//.word 0xd7941ee9 -//.word 0x423fa121 -//.word 0x9c68be3e -//.word 0x28596ee6 -//.word 0x4600b2a7 -//.word 0x978bd531 -//.word 0x6236f2c2 -//.word 0x3661b7e1 -//.word 0xd1e6684f -//.word 0x41a9273b -//.word 0x497172b5 -//.word 0x06f6ed65 -//.word 0xd23b627d -//.word 0x691d06ec -//.word 0x4b2cfed5 -//.word 0x61bb213f -//.word 0xe233000e -//.word 0x78ad2332 -//.word 0x9fbf961e -//.word 0x4e95a57b -//.word 0xda44e31e -//.word 0x175c7138 -//.word 0xc0bc7ccd -//.word 0x19ab0868 -//.word 0xd224ec0c -//.word 0x2f701e6d -//.word 0x66fb3160 -//.word 0x49601c91 -//.word 0x24c63d74 -//.word 0xe96f9e7e -//.word 0x8a8e7694 -//.word 0xa759f3c4 -//.word 0x69603633 -//.word 0xae1da056 -//.word 0x66cc4c65 -//.word 0x3c7ddc0d -//.word 0x7a677966 -//.word 0x267f1524 -//.word 0x7149f311 -//.word 0x53ee6abb -//.word 0x6f90e669 -//.word 0x3cda2f54 -//.word 0x66dbee14 -//.word 0x72146d59 -//.word 0xa2cf9edb -//.word 0x18b35f94 -//.word 0x3d96fc2c -//.word 0x6492f5b5 -//.word 0xab5b0298 -//.word 0x22cf55cf -//.word 0x30cf1f55 -//.word 0x324e55db -//.word 0x64a7b4bd -//.word 0x05340334 -//.word 0xb61c98cd -//.word 0x246c1d1a -//.word 0xe66a94a7 -//.word 0xa926992f -//.word 0x8a51e710 -//.word 0xc3521efd -//.word 0x8a97c4f3 -//.word 0x3629896e -//.word 0xa484cfdc -//.word 0xd9a56952 -//.word 0xe864a37e -//.word 0x160483dd -//.word 0x3d094f2d -//.word 0x6e494f26 -//.word 0xda46d465 -//.word 0xf3bb7aa9 -//.word 0xce75a941 -//.word 0xcc6462c5 -//.word 0x79f23805 -//.word 0xb4939c3f -//.word 0x119e5e95 -//.word 0x7b5b71bd -//.word 0x1e5deffb -//.word 0x84125c4c -//.word 0xfd982fe4 -//.word 0x45d28edb -//.word 0x61bc5a24 -//.word 0xcafb6bbe -//.word 0xcdb91d2e -//.word 0x32af0b2c -//.word 0x1c831a9d -//.word 0x3055bac1 -//.word 0xf99568ae -//.word 0x8b1777fd -//.word 0x676911c3 -//.word 0x9f6479c3 -//.word 0x3b0192e1 -//.word 0xda6ea5da -//.word 0x9d615f33 -//.word 0x40ad196f -//.word 0x8a135d85 -//.word 0xe85aa591 -//.word 0x55a165ca -//.word 0x7cf54cb4 -//.word 0x211fc797 -//.word 0xbdbfc82f -//.word 0x689fc5a5 -//.word 0xfc4103be -//.word 0x78ba1453 -//.word 0xa2c39f01 -//.word 0xf10e5f21 -//.word 0xa9d66efa -//.word 0x48bac436 -//.word 0x21cbfa93 -//.word 0x47e454db -//.word 0xac3aff16 -//.word 0x8a3397fe -//.word 0x027cedb3 -//.word 0x045606b0 -//.word 0x6e3067fe -//.word 0x787b8fa7 -//.word 0x4fbac66e -//.word 0x00d815bd -//.word 0x98bf96df -//.word 0x8926ee6f -//.word 0x50aa1711 -//.word 0x55216360 -//.word 0x132bbd27 -//.word 0x780932d3 -//.word 0x8fb3b128 -//.word 0x5c240f34 -//.word 0x08f94e81 -//.word 0x3e3a1f8f -//.word 0xd478a581 -//.word 0xae187c17 -//.word 0xdfeefadc -//.word 0x120eb5a1 -//.word 0x29de4529 -//.word 0x23704b26 -//.word 0x430fb264 -//.word 0x6e183445 -//.word 0xd6800000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x0000C6E8 -//// expected output -//.word 0x3fb5d3d8 -//.word 0xd7154294 -//.word 0x799650b1 -//.word 0x2df25c71 -//.word 0xf508c4b0 -//.word 0xbcd4da2a -//.word 0xd6e57bab -//.word 0xc98439a1 -//.word 0xfe21d4ef -//.word 0x57c7c0be -//.word 0xfedca85d -//.word 0x517fb9c5 -//.word 0xd5a705ff -//.word 0xd90b1a5b -//.word 0x9f171700 -//.word 0x1c8ef547 -//// SHA512LongMsgvector_64 -//// vector length -//.word 0x0000CA00 -//// input message -//.word 0xf287b06c -//.word 0xc38a839b -//.word 0x7dcbb375 -//.word 0xf1a5bada -//.word 0x9296b6c3 -//.word 0x84fa1925 -//.word 0xf519a219 -//.word 0xb0648c3b -//.word 0xeffc054f -//.word 0x7174e12b -//.word 0xcdd890d1 -//.word 0x06ee4ddb -//.word 0x5fbb991c -//.word 0x7149e884 -//.word 0x7aa89a44 -//.word 0xf8332c33 -//.word 0x7714b070 -//.word 0xa70b7a49 -//.word 0xb16b1d5c -//.word 0xcb6596fc -//.word 0x0b88c6d7 -//.word 0x788926d5 -//.word 0x6740b643 -//.word 0x05f43630 -//.word 0x30d89917 -//.word 0x8bd5b7bf -//.word 0xd18a4260 -//.word 0x6992fb07 -//.word 0x3b05253b -//.word 0xc3413ae1 -//.word 0x63eade5d -//.word 0xfe2f11fa -//.word 0xc24fa88c -//.word 0x455cfe54 -//.word 0xd440e723 -//.word 0x08fde5c2 -//.word 0x99399f92 -//.word 0x77f98e70 -//.word 0x17adfadb -//.word 0x0b6d2559 -//.word 0xd682c616 -//.word 0xfe28b8cf -//.word 0x6392f4ee -//.word 0xce2fbdf7 -//.word 0xcd2c1a22 -//.word 0xbf3a894a -//.word 0x2b91f205 -//.word 0x5634da15 -//.word 0x1477d9ff -//.word 0xdebf4ef9 -//.word 0x258a5109 -//.word 0xe6afe96c -//.word 0x7fe67f35 -//.word 0xc18a9336 -//.word 0x469eae23 -//.word 0x040f98f5 -//.word 0x2338ca8d -//.word 0x0cab269a -//.word 0xc32fe6bc -//.word 0x7605d3ea -//.word 0x5670b711 -//.word 0xa57414fd -//.word 0x10dd167d -//.word 0x4083c7c2 -//.word 0xaccd8209 -//.word 0xb174aa7a -//.word 0xe4899b4f -//.word 0xa7bae138 -//.word 0xfad1a9fe -//.word 0x947d7467 -//.word 0x3355135b -//.word 0x301acf44 -//.word 0x563ce8bb -//.word 0xf4a04160 -//.word 0x31a15909 -//.word 0xa0557d20 -//.word 0x14113c46 -//.word 0xb62f1c3c -//.word 0x540e8b04 -//.word 0xfc5b1843 -//.word 0xca8fe3ea -//.word 0xfeb95215 -//.word 0x517e0634 -//.word 0x8a5e0e68 -//.word 0x4c395a30 -//.word 0x32117244 -//.word 0x1e1168c1 -//.word 0xcdce0a87 -//.word 0xafce5ddf -//.word 0xf6474762 -//.word 0xed288c16 -//.word 0x8c5dfcd9 -//.word 0x494fea03 -//.word 0x30abdf47 -//.word 0x366590da -//.word 0xcbfc0ed7 -//.word 0xaeff3de3 -//.word 0x05d0870d -//.word 0xada8d1f7 -//.word 0xcfdbae3b -//.word 0xb45ed308 -//.word 0xda86cc0c -//.word 0x4712ed97 -//.word 0x1d6c8afd -//.word 0x6f2c6b3c -//.word 0x53de7ade -//.word 0x3805bf21 -//.word 0x7a608e56 -//.word 0x346bff87 -//.word 0x56299f5c -//.word 0xf721653f -//.word 0xeca6e8bf -//.word 0x995cce32 -//.word 0x07f8889f -//.word 0x37473ddb -//.word 0xb67203f1 -//.word 0x728055c7 -//.word 0xcc1cc2ff -//.word 0xee99e21c -//.word 0x5f338ee6 -//.word 0xd498500f -//.word 0x4aa71916 -//.word 0x5177326c -//.word 0xab9b75d6 -//.word 0x15a4bd12 -//.word 0x65e89bbd -//.word 0xd5824b74 -//.word 0x9f9ae63a -//.word 0xcae7d819 -//.word 0x4371950c -//.word 0x2f9c881d -//.word 0x80624ccb -//.word 0xc6e01fae -//.word 0x4814945e -//.word 0x54e58890 -//.word 0xd3635682 -//.word 0x20514f9a -//.word 0x1be1644a -//.word 0x79be2636 -//.word 0x5e4ff199 -//.word 0x2d3b63e4 -//.word 0x9f2813a9 -//.word 0x12c980b8 -//.word 0x24174888 -//.word 0x81de9bd8 -//.word 0xf97cee95 -//.word 0xd6e5f4ff -//.word 0x6cebca08 -//.word 0xf1bd72fc -//.word 0x8fad8267 -//.word 0xb8361d34 -//.word 0xba3d2312 -//.word 0x9397a51c -//.word 0x06cc9cb8 -//.word 0xee1adabf -//.word 0xd3bd40df -//.word 0xbb6e323e -//.word 0x422a4860 -//.word 0xed34464b -//.word 0xbc5d4fe9 -//.word 0xfe8355ad -//.word 0x6958d479 -//.word 0x6a64c0c0 -//.word 0xba4ebce8 -//.word 0x32578cf2 -//.word 0xe027cd5c -//.word 0x5acce346 -//.word 0x520034d5 -//.word 0x6baa94d5 -//.word 0x4ba8ffa2 -//.word 0xf2cc8e48 -//.word 0x4a24a4e9 -//.word 0xff7f685f -//.word 0x902c7923 -//.word 0xa705dd6d -//.word 0xa6ad3a9d -//.word 0x821548da -//.word 0xd44586f9 -//.word 0x2d592ca0 -//.word 0xaac961ab -//.word 0xc9eeafce -//.word 0x7bc2b47c -//.word 0x7be81a08 -//.word 0xddecc90b -//.word 0xeacb5a05 -//.word 0x2bb6cf47 -//.word 0xc4138210 -//.word 0x04c55cf6 -//.word 0x39ad4787 -//.word 0xc970e631 -//.word 0x7e7b835f -//.word 0x224549e5 -//.word 0x4cd4b39e -//.word 0x79834453 -//.word 0x5e0279df -//.word 0x7d9efc91 -//.word 0xf7c31ad2 -//.word 0xa1bf7708 -//.word 0x59c800ba -//.word 0x9b4122f4 -//.word 0x4f3939ed -//.word 0xe5354ce7 -//.word 0xa42ff757 -//.word 0x3fdea846 -//.word 0xaa380ff7 -//.word 0x2b36cfca -//.word 0xb4d77a60 -//.word 0x7067bc00 -//.word 0x9c01d639 -//.word 0x98534ec9 -//.word 0x3ea1e5be -//.word 0x720ccadb -//.word 0xfa150d3d -//.word 0x915d563f -//.word 0x36aed79a -//.word 0xca3f7fd1 -//.word 0xda3471cc -//.word 0xba65b4c2 -//.word 0xd3602c5d -//.word 0x3db1c919 -//.word 0x9161feee -//.word 0xf8bc752e -//.word 0x885701b0 -//.word 0xd152d42e -//.word 0xb2dbf2ec -//.word 0x72f3e59a -//.word 0x0b75b27c -//.word 0xc9540dc8 -//.word 0x1424c950 -//.word 0x8adc9260 -//.word 0x52dadeea -//.word 0xac2721e0 -//.word 0xccfd40e2 -//.word 0xe8864919 -//.word 0x90e76163 -//.word 0x3e7dfeb0 -//.word 0x2e6656ac -//.word 0x6f44179e -//.word 0x3b3d588f -//.word 0x8447cfb0 -//.word 0xcfa245f6 -//.word 0x45a54807 -//.word 0x07be2059 -//.word 0xc3b50498 -//.word 0x85308d49 -//.word 0xcf7c6aae -//.word 0xeb8a56e9 -//.word 0x80384763 -//.word 0x64d2e86f -//.word 0xb1d94a2b -//.word 0x1b03d6a7 -//.word 0x8082874a -//.word 0xc1895671 -//.word 0xd10df558 -//.word 0x0bc9bf3e -//.word 0xc984f0c4 -//.word 0x32961197 -//.word 0x53a9b74e -//.word 0x72bd6d96 -//.word 0x9e6fef8c -//.word 0x8b7a996a -//.word 0x9d7e1e66 -//.word 0x43007dd7 -//.word 0x86b2319a -//.word 0xe2f5a8b4 -//.word 0x549df738 -//.word 0xb4f4cc6c -//.word 0x4501a427 -//.word 0x8b0a3e7d -//.word 0x5c574f9e -//.word 0x3a3977fc -//.word 0xe04b74ac -//.word 0x1bf8960f -//.word 0xdb3d72b1 -//.word 0x8ab0db71 -//.word 0x9cc20ee3 -//.word 0x68412df2 -//.word 0x3621efca -//.word 0x997b95f5 -//.word 0xffd620c3 -//.word 0x86a6c1f0 -//.word 0x11129181 -//.word 0x9cfa82ef -//.word 0xcc399587 -//.word 0xca274e11 -//.word 0x526266b0 -//.word 0x07cfbf09 -//.word 0x0adb9da7 -//.word 0xca07129e -//.word 0x1ea3ba6f -//.word 0x91d9a92c -//.word 0xfceea2dd -//.word 0x5bc58921 -//.word 0xd9a51b19 -//.word 0x2d3bdd81 -//.word 0x29e35220 -//.word 0x90237163 -//.word 0x29785645 -//.word 0x11563871 -//.word 0x556a9bab -//.word 0xc022c76c -//.word 0xf26f78cc -//.word 0xb2cad7a5 -//.word 0x8675a9f6 -//.word 0x8003c785 -//.word 0x5a1acec9 -//.word 0xc6781706 -//.word 0xff34eaba -//.word 0xa446ee38 -//.word 0xc64ae493 -//.word 0x408195bd -//.word 0x461909f0 -//.word 0x41aefa4d -//.word 0xda1088c4 -//.word 0x55472f33 -//.word 0x21d4f5d2 -//.word 0xad3ae8ce -//.word 0x7dbdc734 -//.word 0x7c6a0011 -//.word 0x9457dad8 -//.word 0x7c2cf403 -//.word 0xd1e2eefd -//.word 0x69cb6640 -//.word 0xe4d326ba -//.word 0x83059b76 -//.word 0x3e518a78 -//.word 0x108cfee9 -//.word 0x96b88574 -//.word 0xd8869bef -//.word 0x6719673e -//.word 0xa80da574 -//.word 0x6fb8e43c -//.word 0xcfaff178 -//.word 0x318c9327 -//.word 0xa4ef788c -//.word 0x74c3708d -//.word 0xfec3d959 -//.word 0xc23c5a4d -//.word 0xba14d519 -//.word 0xeb0b961e -//.word 0x3941d11b -//.word 0x7ff94b09 -//.word 0xdf9c5743 -//.word 0x570104ea -//.word 0x95eb9588 -//.word 0x0dd331f3 -//.word 0x48e8dc75 -//.word 0x7f55a629 -//.word 0x68c222a8 -//.word 0x501d1ae5 -//.word 0x6a9a8156 -//.word 0x67f8a955 -//.word 0x4607b7c5 -//.word 0x6e6753f8 -//.word 0xfa92a4d0 -//.word 0x541c7b25 -//.word 0x053ace67 -//.word 0xcb826985 -//.word 0xecf1e00d -//.word 0xcb32c894 -//.word 0xb91d2658 -//.word 0x0d7f2824 -//.word 0x77191374 -//.word 0x91eb7dda -//.word 0xb7b2bca0 -//.word 0x19af9eaf -//.word 0x0eaa5baf -//.word 0xac37c770 -//.word 0x9538cc89 -//.word 0x13a3183f -//.word 0x688513a8 -//.word 0x5f471410 -//.word 0x2730d49b -//.word 0x612c232c -//.word 0x78ccd986 -//.word 0x318d10b1 -//.word 0x835d90a0 -//.word 0xa85b8b10 -//.word 0x74df8bb3 -//.word 0xe6baa88e -//.word 0xfdbffe9f -//.word 0xcc825ec4 -//.word 0xd15f44d8 -//.word 0x83be091f -//.word 0x2a965ae4 -//.word 0xf330e960 -//.word 0x442e62de -//.word 0x4dcba11d -//.word 0xe06422f6 -//.word 0x8238b93e -//.word 0xc26c83ee -//.word 0xc9521c81 -//.word 0x33ea129e -//.word 0x1da99af7 -//.word 0x7f7a8271 -//.word 0xbd036785 -//.word 0x782928e6 -//.word 0xaad69a64 -//.word 0xf2f97e10 -//.word 0x2ccfb0a1 -//.word 0x4562a116 -//.word 0x4d4f069d -//.word 0xcecbd2b4 -//.word 0x5de8628e -//.word 0x6e15f8b8 -//.word 0x6de46bfc -//.word 0x0a111d86 -//.word 0xd4bf2c45 -//.word 0x0904ed94 -//.word 0xaca8961a -//.word 0xd92a3aee -//.word 0x5604fbff -//.word 0x6a307bb4 -//.word 0xf2eb93cf -//.word 0xb1b94897 -//.word 0xe8a9fa36 -//.word 0x26dadf60 -//.word 0x623eb035 -//.word 0x479ea269 -//.word 0xcfdf98a2 -//.word 0x13839721 -//.word 0x62737aa5 -//.word 0x90fbe78c -//.word 0x9016813c -//.word 0x45ec5fc1 -//.word 0x9699beb7 -//.word 0xc130f26b -//.word 0xf1ffa33d -//.word 0x12153549 -//.word 0xe4028846 -//.word 0x4edee2ad -//.word 0xf68d291e -//.word 0x0e405601 -//.word 0x713f2669 -//.word 0xeee7123d -//.word 0xe3ee8299 -//.word 0x0eef3e72 -//.word 0xa1222579 -//.word 0x946a2142 -//.word 0x3f965aa6 -//.word 0x28e0aa66 -//.word 0x1aba5210 -//.word 0x77cbeb27 -//.word 0xce349f7e -//.word 0xb01798e5 -//.word 0xc05ab907 -//.word 0x0aa88c93 -//.word 0x96b97c9a -//.word 0x3cd44539 -//.word 0xb992a877 -//.word 0x03e46370 -//.word 0xda5760b4 -//.word 0xa0972dea -//.word 0x6a32acb9 -//.word 0x579f0ce8 -//.word 0x217ff7c3 -//.word 0xf1220dc1 -//.word 0x784d9265 -//.word 0x3b3b6362 -//.word 0x2ee12f02 -//.word 0x8577e3c8 -//.word 0xc7336655 -//.word 0x24588788 -//.word 0x086f34e9 -//.word 0xf0d4ec48 -//.word 0x7d7576a1 -//.word 0xc6d7d443 -//.word 0xf35a7331 -//.word 0x08bda4c9 -//.word 0xfee450a3 -//.word 0x18d9e6bc -//.word 0x741299d4 -//.word 0xe1f2c914 -//.word 0xf091bef4 -//.word 0x4ec09c5c -//.word 0x50489309 -//.word 0xd0735733 -//.word 0x38ced06d -//.word 0xdc2c12cc -//.word 0x8dee8f4b -//.word 0x6a828b6e -//.word 0xfa2ad126 -//.word 0x78ffa5f5 -//.word 0x6e35f952 -//.word 0x86a0e44f -//.word 0x9c774f79 -//.word 0x1759f200 -//.word 0x7a8d7f18 -//.word 0x368e1c9e -//.word 0xc3c717ff -//.word 0xee9bd556 -//.word 0x75a80cd4 -//.word 0xd14d3265 -//.word 0x53693690 -//.word 0x72666d9f -//.word 0x6477cf01 -//.word 0xeb1d63ec -//.word 0x72f0f847 -//.word 0x589c16c6 -//.word 0x8c2a3457 -//.word 0x5a812bbd -//.word 0x842ceb7a -//.word 0x955d6df3 -//.word 0x7232e9cf -//.word 0x323848a0 -//.word 0x2f2edcc5 -//.word 0x5d0b4f8f -//.word 0xdb42d9a2 -//.word 0xc844b69e -//.word 0x5846d8ff -//.word 0x2745d942 -//.word 0xcd48334a -//.word 0xb2e6b301 -//.word 0x24072b42 -//.word 0xa6ef68f7 -//.word 0x8b78637e -//.word 0xc49ebb52 -//.word 0xf74163e7 -//.word 0xd12798d5 -//.word 0x9c411739 -//.word 0x142f8c58 -//.word 0x76054d86 -//.word 0xdb504847 -//.word 0xc4543bb3 -//.word 0xf698231f -//.word 0x88a5f6f9 -//.word 0x3a0a94f4 -//.word 0x08a3fb65 -//.word 0xff1bbbed -//.word 0x50b0ab59 -//.word 0xa336d9c6 -//.word 0xad5fc709 -//.word 0x0539d44e -//.word 0x33f8f8fe -//.word 0x0af6b4e7 -//.word 0x39f84997 -//.word 0x1cb32908 -//.word 0xd88fab83 -//.word 0xa6aa02be -//.word 0x6f207048 -//.word 0x9a8ab726 -//.word 0x22c4d1bf -//.word 0xebf4e0f5 -//.word 0x56c76895 -//.word 0x13febcf1 -//.word 0x362ab6cb -//.word 0x8db3ab75 -//.word 0x311f9e37 -//.word 0x5c91b4f1 -//.word 0x7a90e801 -//.word 0x830a0067 -//.word 0x8799c027 -//.word 0x8b045def -//.word 0x930935fa -//.word 0x005abc34 -//.word 0x1ce5ba9f -//.word 0xf458b4f5 -//.word 0x66e5a78f -//.word 0x7a43fd85 -//.word 0xf6f5b917 -//.word 0x2ccef54c -//.word 0x17b58ed8 -//.word 0xa6a61e43 -//.word 0x58f92a48 -//.word 0x09e79d7c -//.word 0x0c4a7530 -//.word 0x79a4bd97 -//.word 0xc863bb2c -//.word 0x9f636a4e -//.word 0xe9b52b2d -//.word 0x289fb7ea -//.word 0x0ce358fa -//.word 0x444459cc -//.word 0x9447baab -//.word 0x283729e5 -//.word 0x286b2e2d -//.word 0x8ccca63e -//.word 0x329172c1 -//.word 0x2d4d7071 -//.word 0x612caa7d -//.word 0x4d79ce2d -//.word 0x2764dfc9 -//.word 0x2e0329b7 -//.word 0x3c967ae3 -//.word 0x9a0f8f64 -//.word 0x19d2cd5c -//.word 0x5eb9321f -//.word 0x7e5b8a98 -//.word 0xcb8ee6e9 -//.word 0xed2a4a52 -//.word 0x3410a654 -//.word 0x2c6b0716 -//.word 0x72360f07 -//.word 0xc7ffa3c5 -//.word 0x63eae33e -//.word 0x8bf85f15 -//.word 0x66898747 -//.word 0x0d20640e -//.word 0xe1678605 -//.word 0x21733e8d -//.word 0xbc480d70 -//.word 0x63a05bc5 -//.word 0xe3e86c14 -//.word 0xb28c91ba -//.word 0xc7749b8e -//.word 0xafcf95c4 -//.word 0xde0fb312 -//.word 0x43348512 -//.word 0x1f4e70e8 -//.word 0x163d5f24 -//.word 0x87bcb6ea -//.word 0x199e8850 -//.word 0x96560907 -//.word 0xfdbd463e -//.word 0xd21013c3 -//.word 0xb938456b -//.word 0x434f22b5 -//.word 0x085f16aa -//.word 0xf66da807 -//.word 0xe8b6ab9e -//.word 0x7a38b9fa -//.word 0x1c74dd42 -//.word 0x6673905f -//.word 0xac07e761 -//.word 0xd1530a1f -//.word 0x608de81e -//.word 0xd80329b5 -//.word 0x485c646e -//.word 0x1c2193ae -//.word 0x377cc499 -//.word 0x423f1130 -//.word 0x4327d1bc -//.word 0x71631070 -//.word 0x47503d4a -//.word 0xd787233a -//.word 0x61191b86 -//.word 0x24197f6d -//.word 0x745b610b -//.word 0x0d7c7d7c -//.word 0xa7226d44 -//.word 0xca851cee -//.word 0xe42f7df4 -//.word 0x99007ddf -//.word 0x5a7436af -//.word 0x3929657d -//.word 0xfb9b1e5f -//.word 0x6f32be8c -//.word 0xff8022c1 -//.word 0x85c316e3 -//.word 0x60b210e5 -//.word 0xc6761fec -//.word 0x5bf61eb1 -//.word 0x03572d27 -//.word 0xf5c3625f -//.word 0x126abba8 -//.word 0x74c757fa -//.word 0x4925e695 -//.word 0xe2615fe5 -//.word 0x07f1f1a9 -//.word 0x8e253b54 -//.word 0x2cadbfb3 -//.word 0x8a5c94d1 -//.word 0x9b2c5c18 -//.word 0x2e8176b8 -//.word 0xbfb2754d -//.word 0x93c5d0bc -//.word 0x047ada5d -//.word 0x198cf560 -//.word 0x59330369 -//.word 0xe1ed1e7e -//.word 0xb57e8923 -//.word 0x5435e6c3 -//.word 0x8f72a952 -//.word 0x9a65cc31 -//.word 0x6418c552 -//.word 0x24b0b59c -//.word 0x34f0e291 -//.word 0x23fe672e -//.word 0x066a2a12 -//.word 0x0e6c0fe3 -//.word 0x606d6bee -//.word 0x20c9bc0d -//.word 0xcfd497ce -//.word 0xd81be1d1 -//.word 0x65ec4272 -//.word 0x7718d7a8 -//.word 0x36f7272d -//.word 0x86ad59e0 -//.word 0xdaaca467 -//.word 0x4d7a0618 -//.word 0xefb5391a -//.word 0x5c54e3c7 -//.word 0x942f0d55 -//.word 0x06c2d6b6 -//.word 0xee2d68bc -//.word 0xe1802c81 -//.word 0xa6363a06 -//.word 0x48ff141a -//.word 0x69c3937e -//.word 0xd9e32146 -//.word 0x68c22982 -//.word 0xf884cc1e -//.word 0xd615d607 -//.word 0x4a6df08f -//.word 0x6c131713 -//.word 0x3ae04cdb -//.word 0xe8068d41 -//.word 0x77510516 -//.word 0x89ac8041 -//.word 0x74e621a9 -//.word 0x95b65756 -//.word 0xe7fd0dd3 -//.word 0xd34c21d6 -//.word 0x4aa61822 -//.word 0x128710ad -//.word 0x5d24f5fe -//.word 0xa0f5f8da -//.word 0xa2713d1f -//.word 0xd419d4f0 -//.word 0xe0b7eb12 -//.word 0x84e84296 -//.word 0xa1d8dfb9 -//.word 0x8f4d0208 -//.word 0xb4e75bc8 -//.word 0x55a67b94 -//.word 0xabac8948 -//.word 0x3a44361e -//.word 0x5e24f217 -//.word 0x27ef619d -//.word 0x66fe0866 -//.word 0x08604d9b -//.word 0xa31f9e3a -//.word 0x4fc5f0b9 -//.word 0xb71f6bec -//.word 0x70416328 -//.word 0x89ca8ba9 -//.word 0x636a6531 -//.word 0xc2a1fdf2 -//.word 0x25c9d7ae -//.word 0x5356261d -//.word 0x375d3e8f -//.word 0xed534cd2 -//.word 0x1d184556 -//.word 0x88331c8f -//.word 0xe060389b -//.word 0xdd482525 -//.word 0x8d8f8a89 -//.word 0xec135b38 -//.word 0xb4734f5f -//.word 0x76cf95c3 -//.word 0xeacfc3ef -//.word 0x84e70f92 -//.word 0x47d9c123 -//.word 0xde7be8c6 -//.word 0xe9ba4c73 -//.word 0x95dfa555 -//.word 0x6f110a70 -//.word 0x7a1bac87 -//.word 0x7e70c43d -//.word 0xa46cca7a -//.word 0x40dde810 -//.word 0xeec2ae9f -//.word 0xe05307b6 -//.word 0x76416c3a -//.word 0x0f3e570c -//.word 0x20c0fbe6 -//.word 0x83023286 -//.word 0x114cb70f -//.word 0x727595ac -//.word 0x34a6df76 -//.word 0x1b60a298 -//.word 0xb8c118b0 -//.word 0x3d031e79 -//.word 0x9045e8a8 -//.word 0x9e8ef413 -//.word 0xf20f3c18 -//.word 0x86a8b03d -//.word 0xd9aee314 -//.word 0x41ec0562 -//.word 0x83e7117f -//.word 0xa1674700 -//.word 0xf332dd94 -//.word 0x791bf22c -//.word 0x703bc35f -//.word 0x237f210c -//.word 0x04632341 -//.word 0xfbfc185b -//.word 0xfe3cbf6f -//.word 0xe272bbe9 -//.word 0x71104173 -//.word 0xbcb11419 -//.word 0xb35ab3aa -//.word 0xf200d061 -//.word 0xde4b05c4 -//.word 0xf19ac3cd -//.word 0x52478b48 -//.word 0xa92c607c -//.word 0x31667c0d -//.word 0x0f584221 -//.word 0xe2f374c2 -//.word 0x9b35a684 -//.word 0x8ff0f267 -//.word 0xcacdeefe -//.word 0xa690dbd1 -//.word 0x9d9e1f01 -//.word 0x5cbcf62a -//.word 0x1819648d -//.word 0x258f6e6f -//.word 0xc52689bc -//.word 0x3eda53f0 -//.word 0x2f9e8137 -//.word 0x23a018d3 -//.word 0x67cfe1bf -//.word 0x199b1692 -//.word 0x82fb62a5 -//.word 0xa6b50978 -//.word 0x18da6252 -//.word 0x138f8e28 -//.word 0xc71364c0 -//.word 0xf1feab17 -//.word 0xaec78cff -//.word 0x9189460c -//.word 0xf30724b1 -//.word 0x8aedada7 -//.word 0x3e591a8e -//.word 0x37990dd7 -//.word 0x3b377fe1 -//.word 0x3732fa62 -//.word 0x1b8f0909 -//.word 0xeb10ee62 -//.word 0x134492f9 -//.word 0xfcc0c2c2 -//.word 0xdcab97b8 -//.word 0xd28036c5 -//.word 0x320fbae2 -//.word 0x1ec56f7f -//.word 0x562e4125 -//.word 0x50b8745a -//.word 0x8cba95c5 -//.word 0x22b4b092 -//.word 0x9dd9c318 -//.word 0x0bca73b9 -//.word 0x55a5fe0a -//.word 0xcd3e7134 -//.word 0x06ac1b9b -//.word 0xe80841bd -//.word 0x0371135c -//.word 0x2453dfdf -//.word 0x26e985f6 -//.word 0x0b012b7d -//.word 0x4c0031a3 -//.word 0x6c25674b -//.word 0xd3127eb2 -//.word 0xda88bd52 -//.word 0x2372f507 -//.word 0x2b25b771 -//.word 0x22e6c499 -//.word 0xfaacc5d7 -//.word 0xbe283df3 -//.word 0x2503bb8a -//.word 0x676754b3 -//.word 0x4fc050e3 -//.word 0x91c4240e -//.word 0x5fb1a10f -//.word 0x37d56a4a -//.word 0xff54ab90 -//.word 0x53260843 -//.word 0x1e5fd4ba -//.word 0x67b384e6 -//.word 0x6e396336 -//.word 0xf86f87b9 -//.word 0xe77f0383 -//.word 0x0dc05e51 -//.word 0x42804470 -//.word 0xb4017cda -//.word 0x7fc11aa3 -//.word 0x7efef693 -//.word 0x607a5c15 -//.word 0xfe7c054f -//.word 0xeb174693 -//.word 0x4dae88f6 -//.word 0xecb8f83e -//.word 0x89c18002 -//.word 0x71b1f50c -//.word 0x52519202 -//.word 0x4c0ba546 -//.word 0x4bf2881a -//.word 0x9502d308 -//.word 0x9fa8d081 -//.word 0x25852fc4 -//.word 0x796ffb01 -//.word 0x1cb8cdbe -//.word 0x8bb3407b -//.word 0x5b75a491 -//.word 0x88d9f760 -//.word 0x0bc711a9 -//.word 0xaab51e39 -//.word 0x146d51c8 -//.word 0x2d11d720 -//.word 0xa75d0a82 -//.word 0xd22de845 -//.word 0xb53fc3c0 -//.word 0x5d39396a -//.word 0x75ee6740 -//.word 0x17dd5a67 -//.word 0xe2fac613 -//.word 0x4db2fba7 -//.word 0x3a29141e -//.word 0xcfc672a9 -//.word 0x81f16999 -//.word 0x711b3880 -//.word 0xfcff3f93 -//.word 0x8d286c53 -//.word 0xb6b4f76d -//.word 0x80574fde -//.word 0xffa3545a -//.word 0x2986c6ef -//.word 0xe814fde6 -//.word 0x6d86dbea -//.word 0xc883006c -//.word 0xb59f3c45 -//.word 0xb9224a9d -//.word 0x6e0abb0c -//.word 0x1b533000 -//.word 0x8875cc5f -//.word 0x112fe96d -//.word 0xf8830aef -//.word 0x00021191 -//.word 0x3749b385 -//.word 0x13cc286d -//.word 0xc0d2277b -//.word 0xb9c111d6 -//.word 0x969c6d40 -//.word 0x24ca94f7 -//.word 0xbb19add8 -//.word 0xcc02dcca -//.word 0xba2fb75a -//.word 0xeb3afaa3 -//.word 0x1eb87b71 -//.word 0xff7660a6 -//.word 0xf8028fdc -//.word 0x4b6d664b -//.word 0x5e50aded -//.word 0x550dc8e1 -//.word 0xe657310e -//.word 0x69f52608 -//.word 0x2fc29f37 -//.word 0x15f98336 -//.word 0x59af1b79 -//.word 0xaca1c733 -//.word 0x8830f076 -//.word 0xc3aa3d9c -//.word 0x65cb0ae7 -//.word 0xb7841664 -//.word 0x9cfa7b15 -//.word 0x24d2e44e -//.word 0x5facfa60 -//.word 0x6fed1f75 -//.word 0xe1c25fbb -//.word 0x3e62a3c5 -//.word 0xdc93282e -//.word 0xfa6f307f -//.word 0x0c68f852 -//.word 0x548ae9b8 -//.word 0xb20012d9 -//.word 0xbddad6da -//.word 0x120de204 -//.word 0xedbb6322 -//.word 0xf6b5752a -//.word 0x5d3fde20 -//.word 0x2813fc38 -//.word 0xcca8fc3b -//.word 0xfbb34d2b -//.word 0xbeef542a -//.word 0xc3196298 -//.word 0xf83fe37c -//.word 0x593bd825 -//.word 0x057b8711 -//.word 0x9803700d -//.word 0xb5b4849e -//.word 0xe2ce92a0 -//.word 0x99b4022d -//.word 0x9befc5c0 -//.word 0x88768c9a -//.word 0xad2c3865 -//.word 0x1dab9218 -//.word 0x03403d1a -//.word 0x3636e9aa -//.word 0x0e58c87e -//.word 0x77b146aa -//.word 0x4396f5c4 -//.word 0xc5e7c646 -//.word 0x9b917f33 -//.word 0xcb5769fe -//.word 0x12d349a7 -//.word 0x78b79227 -//.word 0x2859d90e -//.word 0x7f6f896b -//.word 0x6316d8ec -//.word 0xd61afa46 -//.word 0xca7194d7 -//.word 0x3708738a -//.word 0x6cc37efc -//.word 0xa3bfe9dd -//.word 0xd7daac98 -//.word 0xda753436 -//.word 0xa278587f -//.word 0xe3978e63 -//.word 0xe4d45f99 -//.word 0x8b451886 -//.word 0xb918c360 -//.word 0xded45593 -//.word 0xc4e12964 -//.word 0xaf4badd4 -//.word 0xa8c35cc7 -//.word 0x16e7ec65 -//.word 0x8ec3c8c1 -//.word 0xec97c0b8 -//.word 0xa3daff1d -//.word 0x51803e13 -//.word 0x977938b9 -//.word 0x277a5e0d -//.word 0x1effcb0a -//.word 0x95917a14 -//.word 0x7244b796 -//.word 0x8485d3ea -//.word 0xd0121c79 -//.word 0x254a0c23 -//.word 0xf7a7c1e1 -//.word 0x6a89ada8 -//.word 0xac358f91 -//.word 0x881da238 -//.word 0x38621461 -//.word 0x7b97b9e2 -//.word 0xe8c801bd -//.word 0x82ba288c -//.word 0x8c75ac22 -//.word 0x9f00046f -//.word 0xf96c8fa4 -//.word 0x1813cb98 -//.word 0x8822c76a -//.word 0xf955db69 -//.word 0x94029630 -//.word 0x8f59f815 -//.word 0xffeae1c5 -//.word 0xee68ca28 -//.word 0xaeacb38b -//.word 0x6cfc5cfd -//.word 0x088eb8f9 -//.word 0x25489f46 -//.word 0x7ccac31c -//.word 0x75aee588 -//.word 0xf80e4911 -//.word 0x8047679c -//.word 0x72fde38d -//.word 0xae60bf2f -//.word 0x63add056 -//.word 0x27f76e43 -//.word 0x472770c7 -//.word 0x5b4258ac -//.word 0x1eeaca50 -//.word 0x7d284393 -//.word 0xee6807f3 -//.word 0x03c55bf6 -//.word 0x3f87f5c9 -//.word 0x28eab126 -//.word 0x9d22857a -//.word 0x6a9bb748 -//.word 0x1a854dc8 -//.word 0x0d90c6d5 -//.word 0xcaf40706 -//.word 0x95b5981a -//.word 0x45251099 -//.word 0x50aaceb8 -//.word 0x28c1ea7d -//.word 0xca436b25 -//.word 0x93e8bbc3 -//.word 0x56095829 -//.word 0xadaacb0b -//.word 0x8cb7de62 -//.word 0x1c8e0a0f -//.word 0xc6be2fc1 -//.word 0x8d0e8818 -//.word 0xa2c2dd0b -//.word 0x3219fa87 -//.word 0x831a6158 -//.word 0x3f903c4d -//.word 0x10549597 -//.word 0x6ccac973 -//.word 0xb3ae3a09 -//.word 0x77114593 -//.word 0x1a9e74c1 -//.word 0x9f22f45c -//.word 0xba4c492b -//.word 0x29b14013 -//.word 0x47122581 -//.word 0xdfe2370d -//.word 0x3e035957 -//.word 0x8cd10a35 -//.word 0x5c619711 -//.word 0x810a8f8c -//.word 0x23257867 -//.word 0x1312c0a4 -//.word 0x5c7cf7e8 -//.word 0x1bdd3b24 -//.word 0x9044f374 -//.word 0x7456c048 -//.word 0x8d92b0c1 -//.word 0x81dab55e -//.word 0xe82f56d7 -//.word 0xa4bda549 -//.word 0x75177194 -//.word 0xc8c3bc01 -//.word 0xd0f96f29 -//.word 0xd8a84d12 -//.word 0xd8ba269a -//.word 0x46994d19 -//.word 0x2ef24c42 -//.word 0x85b9d54a -//.word 0xbb6dfc4d -//.word 0x8f9da4ed -//.word 0x27ab373c -//.word 0x60d09bdc -//.word 0x63606164 -//.word 0x794f3f06 -//.word 0x20f5c06f -//.word 0x5e0e3aef -//.word 0x550501da -//.word 0x1872da2e -//.word 0xbde1b275 -//.word 0xb3d590ed -//.word 0x560cc9e7 -//.word 0xc105736d -//.word 0xe3c01b27 -//.word 0xd6c5bb80 -//.word 0x6b67e604 -//.word 0x0a4a460c -//.word 0xb923489e -//.word 0x7abf168f -//.word 0xda47c6ea -//.word 0xc7c2d096 -//.word 0xa2dbc632 -//.word 0x95e43f44 -//.word 0x271c1593 -//.word 0x0d2dd0d1 -//.word 0x43f9617d -//.word 0x5c961408 -//.word 0x1797c037 -//.word 0x328e40c8 -//.word 0x83cf2758 -//.word 0x4476b084 -//.word 0xafabf44f -//.word 0xcb2460c3 -//.word 0x85ec65dc -//.word 0x026371a1 -//.word 0x34871f94 -//.word 0xab71ab4c -//.word 0xae22a861 -//.word 0x8b80f588 -//.word 0x2b9cedff -//.word 0xe936de2c -//.word 0xa483bc81 -//.word 0x132e17a2 -//.word 0x599c4bca -//.word 0xda74f76b -//.word 0x4c5fb014 -//.word 0x110cf698 -//.word 0xc478666d -//.word 0x126c3252 -//.word 0xcb47cf34 -//.word 0x38fded53 -//.word 0xb060aca1 -//.word 0x669e0d6a -//.word 0x850ba63a -//.word 0x7f219bfc -//.word 0xa1c5c95f -//.word 0xeccc447e -//.word 0x20be04bf -//.word 0x19dadbfb -//.word 0x5e5aaae0 -//.word 0xf8f8d594 -//.word 0x80b0f49b -//.word 0x7cc8ccfb -//.word 0xec0e7d9e -//.word 0x1f61fcf7 -//.word 0xcb72c4e9 -//.word 0x5dccc9e4 -//.word 0x8e12ae51 -//.word 0x37883730 -//.word 0x66d501ff -//.word 0xb10871de -//.word 0xcad8eaf2 -//.word 0x54304307 -//.word 0xf5eb7879 -//.word 0xaddc9f54 -//.word 0x66111eba -//.word 0xcc581c85 -//.word 0x5e03352e -//.word 0xc5e972ee -//.word 0x65ad7822 -//.word 0x3343fff4 -//.word 0xc6af8638 -//.word 0xb0104594 -//.word 0x0ede64e4 -//.word 0x5e706adc -//.word 0x91c1f8ef -//.word 0x6173b770 -//.word 0xe5148ff8 -//.word 0x63a11a07 -//.word 0x654858ee -//.word 0x0f72a4ec -//.word 0xaf01e697 -//.word 0x96d60b7d -//.word 0x2797b20c -//.word 0x2daf28af -//.word 0x7296973a -//.word 0x8d527a88 -//.word 0xfb3e5462 -//.word 0x710aa2a3 -//.word 0x71030e9a -//.word 0x1c94e5b0 -//.word 0x470dcb4b -//.word 0xd0a4aef2 -//.word 0x32baf8b1 -//.word 0x585f09bf -//.word 0xaf17e45e -//.word 0x7fde2803 -//.word 0x7b6b43b7 -//.word 0x97b2e2bd -//.word 0x19acab75 -//.word 0xf35a2f80 -//.word 0x50081a25 -//.word 0x6dcfadf3 -//.word 0xaa5d6fa8 -//.word 0xe1f91f52 -//.word 0xf6c1ecb4 -//.word 0xaf36e9eb -//.word 0xc6fbbb52 -//.word 0x3dda94a2 -//.word 0xf208665e -//.word 0x73aa506e -//.word 0x13975d09 -//.word 0x3e606dd9 -//.word 0x098e735a -//.word 0x0d2ae184 -//.word 0x768361a9 -//.word 0x572bc6a0 -//.word 0x41434223 -//.word 0x13f8d976 -//.word 0x134e1549 -//.word 0x3e1dfce0 -//.word 0xdd583f71 -//.word 0x5995b4ce -//.word 0x50ca0643 -//.word 0xe855acc2 -//.word 0x6440173d -//.word 0xf5c23054 -//.word 0xd2090130 -//.word 0x8a36b2af -//.word 0x99aab8c1 -//.word 0x3a804912 -//.word 0x7d5a13e9 -//.word 0x99612d50 -//.word 0x83874e75 -//.word 0xc0103d50 -//.word 0x77508886 -//.word 0xcab6798d -//.word 0x66094611 -//.word 0x59f28897 -//.word 0x25bbee61 -//.word 0x12563391 -//.word 0xc8a14d91 -//.word 0x1ce8e8b1 -//.word 0x2bab1212 -//.word 0xa5a238c4 -//.word 0x6cff512b -//.word 0x5ef359a7 -//.word 0x6e730173 -//.word 0xfa3ca5ce -//.word 0x59157e59 -//.word 0xb35419c1 -//.word 0x15a3079d -//.word 0xc404d79a -//.word 0xd21341d5 -//.word 0xf08ba488 -//.word 0x830cb3e9 -//.word 0xfa1c6a4f -//.word 0x5e6b4897 -//.word 0x2a5bb8c6 -//.word 0x5ebfd0ef -//.word 0xcfe33d58 -//.word 0xc1ce7ed8 -//.word 0xb7c35183 -//.word 0x8a0e6b8a -//.word 0xb9fd6c5c -//.word 0x002c1211 -//.word 0x2c05ad09 -//.word 0x2d88d3d0 -//.word 0x6d485445 -//.word 0x60b670fc -//.word 0x5da248e0 -//.word 0xacff931d -//.word 0xe0e7923d -//.word 0x66df4690 -//.word 0x5f5be0d2 -//.word 0xab857908 -//.word 0x463a03ab -//.word 0xd8558008 -//.word 0x873172e7 -//.word 0x1069926b -//.word 0x16e2c439 -//.word 0xba0c4bdc -//.word 0x6b643969 -//.word 0xff3e2a5e -//.word 0x03c132d0 -//.word 0x503314c6 -//.word 0xdf77b5e0 -//.word 0xdfd3d03c -//.word 0x04f7ea99 -//.word 0x213b89bd -//.word 0xf929a115 -//.word 0x533b4f9c -//.word 0x4ce5c9fd -//.word 0xf1d696fc -//.word 0x0d7cfa12 -//.word 0x40c6b557 -//.word 0x512deda6 -//.word 0xc5f568fb -//.word 0xb1b0fe1f -//.word 0xcc054e88 -//.word 0xc8afb17a -//.word 0xe3c86c73 -//.word 0xb9482ac6 -//.word 0x5cc9a986 -//.word 0xa68db3a5 -//.word 0xcec1505d -//.word 0x3a033acf -//.word 0x942391eb -//.word 0x2026d08f -//.word 0x4d9100f3 -//.word 0x8ae42b44 -//.word 0x5a64148f -//.word 0xab1d25e1 -//.word 0x6428a9ad -//.word 0x3d2a3b6d -//.word 0xd31d7e8c -//.word 0xfc530f84 -//.word 0x57b7b844 -//.word 0x2857e7d4 -//.word 0x631f5e3b -//.word 0x07e72ba1 -//.word 0xadb1dbb1 -//.word 0x612beb41 -//.word 0xb07c7f35 -//.word 0x023c56a0 -//.word 0x2bc4fe2d -//.word 0x3ca944be -//.word 0x9f83ef52 -//.word 0x63f3ae2c -//.word 0xd4e44e32 -//.word 0x4f103093 -//.word 0x54c6fbac -//.word 0xddeb8e2d -//.word 0xee403977 -//.word 0x6ee22c49 -//.word 0x35172f9c -//.word 0x664794cb -//.word 0xff496af7 -//.word 0xaee1f4aa -//.word 0xe7865aba -//.word 0x33689d71 -//.word 0xcbb1d0ea -//.word 0x650b86be -//.word 0x4e6387e1 -//.word 0xb9edc7c6 -//.word 0x576998ca -//.word 0x27a41ecf -//.word 0x90410327 -//.word 0xadb96db5 -//.word 0xe8a12d4e -//.word 0xca2c3a65 -//.word 0x11f05de8 -//.word 0x03ed2d65 -//.word 0x03cb3e71 -//.word 0x6263964a -//.word 0x778160bb -//.word 0xf2e8e540 -//.word 0x6d97b76b -//.word 0x444b2f86 -//.word 0xa7451a7a -//.word 0xed4db0f0 -//.word 0x2bf7c6b5 -//.word 0x06254463 -//.word 0xc5cdd83e -//.word 0xabfdec5c -//.word 0x831cd609 -//.word 0x7c724f69 -//.word 0x37eb275f -//.word 0x1f1737ae -//.word 0xf976965e -//.word 0xbbf31062 -//.word 0xa2aed377 -//.word 0x7ffe6c4f -//.word 0x52b7f2ef -//.word 0x19a88156 -//.word 0xea68ea5f -//.word 0x4053a9e8 -//.word 0x93cf1834 -//.word 0x2bd4e28e -//.word 0x35abb92f -//.word 0x17f54c62 -//.word 0x01f073e6 -//.word 0xc4f6ad94 -//.word 0xe846cd41 -//.word 0xf807f0e6 -//.word 0x218ab2ff -//.word 0xfcd0a230 -//.word 0xa74cf32e -//.word 0x1ae974dd -//.word 0xb84fc2b6 -//.word 0x2562bb6c -//.word 0x580c37cf -//.word 0xf13df3f0 -//.word 0xcc30ce86 -//.word 0xd6ef3890 -//.word 0x1f19e73c -//.word 0x31e3cb08 -//.word 0xa15d4527 -//.word 0xe3f79426 -//.word 0x624390cf -//.word 0xd0fc9a4e -//.word 0xbb48d392 -//.word 0x623a8cf6 -//.word 0xc69bfe21 -//.word 0x04ea3b2a -//.word 0xe1a16500 -//.word 0xa7ba1e0a -//.word 0x30723f0a -//.word 0x404dcd47 -//.word 0x185a29eb -//.word 0x47b886aa -//.word 0xc459a0a4 -//.word 0x3a06ac8d -//.word 0xa3a38a0b -//.word 0x18b5425f -//.word 0xe721ae48 -//.word 0xe7367424 -//.word 0x08ee3859 -//.word 0x2e710ff3 -//.word 0x40db368f -//.word 0x7b3f0477 -//.word 0x0dec1d0e -//.word 0xdfefe96f -//.word 0xb2d94451 -//.word 0x6dc2772e -//.word 0xb58d67a4 -//.word 0xbf6e0d1b -//.word 0x62aa26a8 -//.word 0x719e2c31 -//.word 0x470384d2 -//.word 0xa370f980 -//.word 0xb72069ec -//.word 0x7bf6beaa -//.word 0x47be2093 -//.word 0xa1b66a68 -//.word 0x544ddab8 -//.word 0xc22a0c03 -//.word 0x7a70291f -//.word 0x0d415cdb -//.word 0x1e8185e3 -//.word 0xb9dc32e3 -//.word 0xe60acbef -//.word 0x7d510c23 -//.word 0x3b4cb886 -//.word 0x16ec8c34 -//.word 0xcebc72bd -//.word 0xc569f8c8 -//.word 0x108100fc -//.word 0xce7bb920 -//.word 0xb8f8ce80 -//.word 0xfa48dd93 -//.word 0x42302adc -//.word 0x16ea950e -//.word 0x6a6ec973 -//.word 0x72f0b78e -//.word 0xb5aa4300 -//.word 0x63db3ca8 -//.word 0xe810920e -//.word 0xc1a2c302 -//.word 0x8e809780 -//.word 0x692e0dd7 -//.word 0x770e950a -//.word 0xbcdf7f77 -//.word 0x3483b4b6 -//.word 0x1f05a4c4 -//.word 0x9cda7f61 -//.word 0x7967a8b6 -//.word 0x4ac4673b -//.word 0xb8c0ded8 -//.word 0x1c253e4b -//.word 0x4d3d3ac9 -//.word 0xb594bce8 -//.word 0xab00d7bc -//.word 0xfddffe40 -//.word 0xcba073f8 -//.word 0x9c8501d5 -//.word 0xaba6ee59 -//.word 0x823a2cfb -//.word 0xca12cfcd -//.word 0x6266c45c -//.word 0xaed4bfd8 -//.word 0x32a67575 -//.word 0x5f540c10 -//.word 0xac49cf16 -//.word 0xe9ea27a2 -//.word 0xd0d5c6e5 -//.word 0xde6626cb -//.word 0x618032db -//.word 0xd18a4360 -//.word 0x63b74dc6 -//.word 0xdc8b5b46 -//.word 0xa39b38c6 -//.word 0x1b946ffa -//.word 0x2f7e76d0 -//.word 0x2f42270b -//.word 0xda6a6f2d -//.word 0xbc294a9b -//.word 0xba9beffc -//.word 0xeb4d47e2 -//.word 0xa900a4ac -//.word 0xe8aab0ab -//.word 0xc7bea483 -//.word 0x65adbad4 -//.word 0xf6ade41a -//.word 0x16b9bed2 -//.word 0x5cd9c1df -//.word 0x33a3ba2b -//.word 0xe5027b91 -//.word 0xf936d1fb -//.word 0xbf1cb6c7 -//.word 0x29b0c770 -//.word 0xdcd0f86a -//.word 0x8743864d -//.word 0x74f92d36 -//.word 0x5d949c6a -//.word 0x8028263d -//.word 0xf53fba33 -//.word 0x40211564 -//.word 0x23523625 -//.word 0xb65b12e4 -//.word 0xb9cd8a54 -//.word 0x28849acb -//.word 0x1029d3e8 -//.word 0xa2fa0b78 -//.word 0x85ce539a -//.word 0x71532922 -//.word 0xfa9bef3c -//.word 0xa9d79c52 -//.word 0x5162b22f -//.word 0xa0017064 -//.word 0xf56948ea -//.word 0x7101930a -//.word 0x51ea847a -//.word 0x7b3d5ac9 -//.word 0x5693dafc -//.word 0xdfcbfd7a -//.word 0xfa07e625 -//.word 0x05f816ca -//.word 0xb35ce3bb -//.word 0x18c426ba -//.word 0x009b3519 -//.word 0x85641120 -//.word 0xe143e0af -//.word 0x80bf9d24 -//.word 0x5ac60e7f -//.word 0x7ff1f6c5 -//.word 0xf30a8da2 -//.word 0xbdcc2d51 -//.word 0x3be94ec1 -//.word 0xb852b4f0 -//.word 0x40b2e79b -//.word 0xb33be41a -//.word 0x19a61286 -//.word 0x3575771c -//.word 0x5d7c2ce6 -//.word 0x899f0e98 -//.word 0xa9ddb7b8 -//.word 0x3c8ead01 -//.word 0x1ee8d80a -//.word 0xa1c83a23 -//.word 0xe0b0da7f -//.word 0x500b0199 -//.word 0x98b9a9d0 -//.word 0xa3c73354 -//.word 0xf37e5846 -//.word 0x38a0621b -//.word 0x21ee9c42 -//.word 0x72ed0706 -//.word 0x57ea4eb5 -//.word 0xf73cfc02 -//.word 0x4dc9eda8 -//.word 0x33cc0250 -//.word 0xc0d519b5 -//.word 0xd4113d06 -//.word 0xf1cb198c -//.word 0x4d33b38c -//.word 0x255e576f -//.word 0x538fd020 -//.word 0x23b5dfb6 -//.word 0x6334e553 -//.word 0xb9e8e34b -//.word 0x3a67a489 -//.word 0x3787392f -//.word 0x5a21a67d -//.word 0xf214dbf4 -//.word 0x8c8ce6bb -//.word 0x80000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x0000CA00 -//// expected output -//.word 0x1333d76d -//.word 0x9642fff2 -//.word 0x5a78e1df -//.word 0x287d433b -//.word 0xf30c61c2 -//.word 0x157870e1 -//.word 0x9abec865 -//.word 0x24bc248c -//.word 0x974a61a1 -//.word 0x4546cd6e -//.word 0xdd382910 -//.word 0xb9f269a9 -//.word 0x13b09f72 -//.word 0xf4453479 -//.word 0x7662d3c4 -//.word 0x409e5701 -//// SHA512LongMsgvector_65 -//// vector length -//.word 0x0000CD18 -//// input message -//.word 0x4b21e011 -//.word 0xa232ade7 -//.word 0xa8c92be7 -//.word 0x7925e878 -//.word 0xae0bea97 -//.word 0x23749528 -//.word 0xfe83cf89 -//.word 0xecb9616d -//.word 0xae6ca0e8 -//.word 0xd5754ec6 -//.word 0xc92abb21 -//.word 0x108c2f33 -//.word 0xcdc18c68 -//.word 0x87c430b7 -//.word 0x2c5b1933 -//.word 0x56494cdd -//.word 0xccc577bd -//.word 0x4c2cd531 -//.word 0x88f35284 -//.word 0x6edff0c2 -//.word 0xac7869cb -//.word 0x74bb16a7 -//.word 0x7c0f0f19 -//.word 0x4a7a9477 -//.word 0xae15abb8 -//.word 0x90bd0bcf -//.word 0xeb0c3938 -//.word 0x1a87f1d0 -//.word 0x5319c7e9 -//.word 0x71c10e9e -//.word 0xf687f964 -//.word 0x50b400e2 -//.word 0x5b428503 -//.word 0x2892b849 -//.word 0xfd5db864 -//.word 0x9cedfb03 -//.word 0xc88defea -//.word 0x063ee144 -//.word 0xa1ab1f3b -//.word 0xf05f59c7 -//.word 0xdb364dc3 -//.word 0x9c11a446 -//.word 0xc3ce1630 -//.word 0x7d78d503 -//.word 0x15ba29f5 -//.word 0xbb9a5743 -//.word 0x8564c8c7 -//.word 0xb3e367cd -//.word 0x37d74b23 -//.word 0x75a4966f -//.word 0x47489dc5 -//.word 0x448f4979 -//.word 0x428abd32 -//.word 0x193d3840 -//.word 0xaa983d30 -//.word 0x20a9f29d -//.word 0x760fc749 -//.word 0x3ab2576c -//.word 0x90b1934b -//.word 0x799c1d0d -//.word 0x55e4f2ca -//.word 0xa78f4ce6 -//.word 0x1930c79d -//.word 0xc017c2de -//.word 0xa0c5085d -//.word 0x73a3b0e4 -//.word 0xa6f341e9 -//.word 0xa5061a66 -//.word 0x58af11e5 -//.word 0xedf95bda -//.word 0xd915ac36 -//.word 0x19969e39 -//.word 0xbee15788 -//.word 0xa8de667f -//.word 0x92f4efc8 -//.word 0x4f35082d -//.word 0x52d562aa -//.word 0x74e12cc7 -//.word 0xf22d3425 -//.word 0xb58f5056 -//.word 0xd74afcf1 -//.word 0x62cd44e6 -//.word 0x5b9ee510 -//.word 0xff91af09 -//.word 0x4c3d2d42 -//.word 0xc3b08853 -//.word 0x6d62a98f -//.word 0x1c689edc -//.word 0xf3ea3fc2 -//.word 0x28d711c1 -//.word 0x09d76ae8 -//.word 0x3d82d6a3 -//.word 0x4dcfbad5 -//.word 0x63cf3726 -//.word 0x519b519f -//.word 0xd48b5174 -//.word 0x1aa86720 -//.word 0x836494b7 -//.word 0xa589c778 -//.word 0x927047a2 -//.word 0x5d73508a -//.word 0xdaa401e9 -//.word 0xa6c0767a -//.word 0x675e31c5 -//.word 0x556cbe35 -//.word 0xfadc9671 -//.word 0x359b45e9 -//.word 0x85c3c8af -//.word 0x84113989 -//.word 0xb299ae44 -//.word 0x74b85e4b -//.word 0x5d4b0578 -//.word 0xab1e8a29 -//.word 0x15a8df97 -//.word 0xc4f52a63 -//.word 0x9fe32272 -//.word 0xcb91bbfb -//.word 0x721505de -//.word 0xc46d5138 -//.word 0x3cb89734 -//.word 0x25a71424 -//.word 0x5c2e37d0 -//.word 0x577fbe0d -//.word 0x66381d92 -//.word 0x39db1f08 -//.word 0xa380cf60 -//.word 0x9dc69969 -//.word 0x8e0fada2 -//.word 0xcaeda44d -//.word 0x58d766c4 -//.word 0xf8214b10 -//.word 0x642b80b8 -//.word 0xd7d8add7 -//.word 0xcc41d471 -//.word 0x08ab7d07 -//.word 0xdab71069 -//.word 0xa2d982cc -//.word 0x900b331c -//.word 0xaec31794 -//.word 0x2122158b -//.word 0xac6eac91 -//.word 0x75c2dcba -//.word 0x0c04443a -//.word 0xa9188832 -//.word 0xb553f5ca -//.word 0x8c336880 -//.word 0x824d6bc0 -//.word 0x2486a2b4 -//.word 0xc086665d -//.word 0x276aafe3 -//.word 0xb1b93729 -//.word 0x829adca5 -//.word 0x0c44466f -//.word 0xd5b5cb97 -//.word 0x7aa78fbc -//.word 0xf5c0f0da -//.word 0x1b092164 -//.word 0x68a11493 -//.word 0xffb39efd -//.word 0xeda5d669 -//.word 0xae92bee2 -//.word 0xf2fb250a -//.word 0xa1b9cbb1 -//.word 0x1c36c7a6 -//.word 0xc6dd26cd -//.word 0xc3cfd572 -//.word 0xffd8c1dd -//.word 0x72a13c27 -//.word 0xa327a34c -//.word 0x6b6b3d80 -//.word 0xfc6c67c7 -//.word 0x2152eec0 -//.word 0xc8ecbdc1 -//.word 0xbd5cb829 -//.word 0xb811e7f2 -//.word 0x9af6d786 -//.word 0xf4e93dd4 -//.word 0xc96fdda2 -//.word 0x95a6aa25 -//.word 0x8d7b2fcf -//.word 0x291c2d68 -//.word 0xe0b18660 -//.word 0x32475964 -//.word 0xec0c6f2f -//.word 0xa8c2d6a3 -//.word 0x936ecb18 -//.word 0x7350def4 -//.word 0xe818507b -//.word 0xf157c0e9 -//.word 0xb33406be -//.word 0x7660605a -//.word 0xf14cccc9 -//.word 0xc799b4e0 -//.word 0x51d0d089 -//.word 0x9e53495b -//.word 0xb8931a6e -//.word 0x2984bc6d -//.word 0xbe4e02ec -//.word 0x8b4642fc -//.word 0x2f1cb5fd -//.word 0x5a5520b4 -//.word 0x8cfcb49e -//.word 0x1f953383 -//.word 0x8753554d -//.word 0xd98b6a1b -//.word 0x8a674092 -//.word 0x79df4773 -//.word 0x30e5f373 -//.word 0x67e06247 -//.word 0xca5c3ffe -//.word 0xfd00e693 -//.word 0xdcc0c9c3 -//.word 0x0754121c -//.word 0x9ee88a57 -//.word 0x4915b9e7 -//.word 0x7c104fd2 -//.word 0xf921c2c0 -//.word 0x96573951 -//.word 0x407ba9b4 -//.word 0x40423d76 -//.word 0xbdc6fc97 -//.word 0x8237a6e3 -//.word 0x02cede7f -//.word 0x99038ec3 -//.word 0x15008847 -//.word 0x75556941 -//.word 0xf1edc30e -//.word 0x3a417b0e -//.word 0x02cb6fb5 -//.word 0xbfbe5cdf -//.word 0xacf40064 -//.word 0x11287bed -//.word 0xc565fb06 -//.word 0xf1be9874 -//.word 0x16407dc8 -//.word 0x52254934 -//.word 0xdf4ab59e -//.word 0xdce476f3 -//.word 0x506e65be -//.word 0x6ce6ddf9 -//.word 0x10386422 -//.word 0x91fb8e92 -//.word 0xba5b1f0b -//.word 0x10567090 -//.word 0x5a2c1479 -//.word 0x6110bac6 -//.word 0xf52455b4 -//.word 0x30a47b8e -//.word 0xff610bc6 -//.word 0xdd721344 -//.word 0xe226f1fe -//.word 0xfd3db8c9 -//.word 0x7e57d56e -//.word 0xd7acf201 -//.word 0xa3fe1a6e -//.word 0xe7cc1e55 -//.word 0x98c93818 -//.word 0x5e8cef32 -//.word 0x98893aca -//.word 0xa040e887 -//.word 0x50b43fa7 -//.word 0xc51fe44b -//.word 0x62e4fb15 -//.word 0x18c58ef5 -//.word 0xe5563340 -//.word 0x9bb1e903 -//.word 0xe36c4496 -//.word 0x81c8ca74 -//.word 0xda2b9c49 -//.word 0xb3d1594d -//.word 0x3bbe3fd1 -//.word 0x4cf79317 -//.word 0xeef14367 -//.word 0x1d4acb5f -//.word 0xccb7558b -//.word 0x293e2436 -//.word 0x23a5327f -//.word 0x292a18af -//.word 0x35742fc9 -//.word 0x0acaf563 -//.word 0xba83b2b5 -//.word 0x6abd5bf0 -//.word 0x5952b6d1 -//.word 0x1f08bf75 -//.word 0x33084b6f -//.word 0xb092eb18 -//.word 0x59ee1326 -//.word 0xdaa67b80 -//.word 0x51f2c651 -//.word 0x0c74625b -//.word 0x9425af8f -//.word 0xeb9063da -//.word 0x133e2d41 -//.word 0xcf719830 -//.word 0xae15330f -//.word 0x44f3ef17 -//.word 0xbb28c864 -//.word 0x8bd5a74b -//.word 0x851987ed -//.word 0x163cd70c -//.word 0xca2d201e -//.word 0x0f2fe8a0 -//.word 0x3ccfd6ad -//.word 0xd11917cf -//.word 0x000bff15 -//.word 0x6d4af466 -//.word 0x33148814 -//.word 0x2776e5b4 -//.word 0x60bf6e2e -//.word 0xf734a310 -//.word 0x0b054528 -//.word 0x0880bb51 -//.word 0x2985b58d -//.word 0x3c3a0f54 -//.word 0xa6fff82c -//.word 0xa6a5537a -//.word 0xdeda5d98 -//.word 0x0fe89127 -//.word 0x24a0c9a7 -//.word 0x7290a545 -//.word 0x3e7d30f3 -//.word 0x7f0dc1be -//.word 0xe6c3205c -//.word 0x1c30ea05 -//.word 0x4b683785 -//.word 0xdfb4798e -//.word 0x8e86a852 -//.word 0x95b29c51 -//.word 0x45daba70 -//.word 0xbf2ad24c -//.word 0xfc4648cd -//.word 0x108172fe -//.word 0xaf50421c -//.word 0xf0fe25ed -//.word 0x51a12a52 -//.word 0xfb4c6720 -//.word 0x4886992c -//.word 0x83fb0aa5 -//.word 0xef72b8a7 -//.word 0x0affb30c -//.word 0x127ac786 -//.word 0xc92f5beb -//.word 0x76d799cf -//.word 0x2cc8cf58 -//.word 0x4e68154e -//.word 0x53e73172 -//.word 0xc72eb711 -//.word 0x921275d8 -//.word 0x7dce0dea -//.word 0xf2b0e430 -//.word 0x03123bf0 -//.word 0xaf8c9ca2 -//.word 0x606878ff -//.word 0xb7560e5a -//.word 0x8c618e33 -//.word 0x31227f0a -//.word 0xf7345e71 -//.word 0xf4e88865 -//.word 0x03395ade -//.word 0x0b0296a5 -//.word 0x856e0866 -//.word 0x38b06a06 -//.word 0x47f58636 -//.word 0x6e979a49 -//.word 0x89940042 -//.word 0x563e0e32 -//.word 0x7b343cc1 -//.word 0xcb90840a -//.word 0xc5620fac -//.word 0x5d5e0d1d -//.word 0x00d1e542 -//.word 0xd2da8e3d -//.word 0x3ad63c87 -//.word 0xa01c403e -//.word 0x75eb29c0 -//.word 0x74a03078 -//.word 0x282cd3f8 -//.word 0xafc6bf48 -//.word 0xbdddf37e -//.word 0xe451238f -//.word 0x12e25a65 -//.word 0x5be9e432 -//.word 0xf8466b03 -//.word 0x90996098 -//.word 0xb7b59d73 -//.word 0xb551482f -//.word 0x8801fa13 -//.word 0x2c6520e7 -//.word 0x19a0a206 -//.word 0x0e0cc3b5 -//.word 0x0d2d49b3 -//.word 0xa6e3dd12 -//.word 0x79e3b444 -//.word 0xf7676f79 -//.word 0x68254029 -//.word 0x327e4fec -//.word 0x58f95c92 -//.word 0x41efa570 -//.word 0xbb880af8 -//.word 0x3fe66f8d -//.word 0x779f6295 -//.word 0xfd71fdcf -//.word 0x66310ee6 -//.word 0x7f057647 -//.word 0xd6d3cf30 -//.word 0x7cf9520a -//.word 0x0a3ff7f9 -//.word 0xe209ddb1 -//.word 0xb7d2ed8b -//.word 0x50d5bbd8 -//.word 0x880dac75 -//.word 0x9a605ea0 -//.word 0x9b184409 -//.word 0x4892912c -//.word 0x023a58df -//.word 0x17b7f127 -//.word 0x43629e50 -//.word 0x77fd6e3d -//.word 0xd8a262fc -//.word 0x0bf9cf9d -//.word 0xb0ae0345 -//.word 0x2c222b7e -//.word 0xac6175d1 -//.word 0x67557197 -//.word 0x2339bd0c -//.word 0xfa4fe1a5 -//.word 0x5ed678a4 -//.word 0x5b3791e9 -//.word 0x1c7f540b -//.word 0xb111e9a7 -//.word 0x0f9d95f8 -//.word 0x584c26a8 -//.word 0x5d3d92e6 -//.word 0x6235dbb9 -//.word 0x21923594 -//.word 0x11816b2a -//.word 0xe7717f83 -//.word 0x5dc89150 -//.word 0x33d4017c -//.word 0x7404d803 -//.word 0xfb586407 -//.word 0x35162321 -//.word 0x29bfe3f5 -//.word 0xb5412609 -//.word 0x1a6ecbd7 -//.word 0xbbadeb20 -//.word 0x21ef0284 -//.word 0x43e54f50 -//.word 0x04717d97 -//.word 0xfe5a8284 -//.word 0x7e43c8ee -//.word 0xcfde8a2d -//.word 0xbc5d822c -//.word 0x5029c1c0 -//.word 0xe0d7de38 -//.word 0x4c585236 -//.word 0x816f23bd -//.word 0x4268c08a -//.word 0x29082ca8 -//.word 0xe8c05f3f -//.word 0xd525eaad -//.word 0xa6a5d9d7 -//.word 0x7872ddc1 -//.word 0x17c3ab5d -//.word 0x793c9fa1 -//.word 0x8baaa5dc -//.word 0x31f4594a -//.word 0x874f6de6 -//.word 0x6eb04b7f -//.word 0x4487fc0e -//.word 0xf2aa4947 -//.word 0x2c8f206e -//.word 0xf4bf396c -//.word 0x6087f822 -//.word 0x9ef196fd -//.word 0x35f37ccb -//.word 0x8de5efcd -//.word 0xb238f20d -//.word 0x556668f1 -//.word 0x14257a11 -//.word 0xfbe03846 -//.word 0x4a678303 -//.word 0x78e62ae9 -//.word 0x79145395 -//.word 0x3dac1dbd -//.word 0x7921837b -//.word 0xa98e84e8 -//.word 0x56eb80ed -//.word 0x9487e656 -//.word 0xd0b20c28 -//.word 0xc8ba5e35 -//.word 0xdb1abbed -//.word 0x83ed1c77 -//.word 0x20a97701 -//.word 0xf709e354 -//.word 0x7a4bfcab -//.word 0xca9c89c5 -//.word 0x7ad15c39 -//.word 0x96577a0a -//.word 0xe36d7c7b -//.word 0x69903524 -//.word 0x2f379546 -//.word 0x46c1cd5c -//.word 0x08acb4f2 -//.word 0xa2076aba -//.word 0xd02a3bdd -//.word 0xe8a4c68f -//.word 0x1a755ee6 -//.word 0xf67eb0ec -//.word 0x2e35a6f3 -//.word 0x9e9d8c28 -//.word 0x8976726b -//.word 0x26b0d15e -//.word 0x5b2671bc -//.word 0xc88989ed -//.word 0x079a29d7 -//.word 0x329dd5f6 -//.word 0xa60a72af -//.word 0x078567e1 -//.word 0x8510fcbe -//.word 0x5d8005d9 -//.word 0xa22dc57f -//.word 0x3dee0d4b -//.word 0x3345a4f5 -//.word 0x26d6eb6b -//.word 0x1f1ec123 -//.word 0x8a61a5af -//.word 0x82e41a92 -//.word 0x4f5d5052 -//.word 0x2da800ce -//.word 0x4fbb98d2 -//.word 0x24dc98e9 -//.word 0xd9123c72 -//.word 0x1fd95bf6 -//.word 0x2e198fb9 -//.word 0x0a59968f -//.word 0x0530f8f1 -//.word 0x85fdea50 -//.word 0x07d873a9 -//.word 0x64c9cd5a -//.word 0x53370e34 -//.word 0x30a308d1 -//.word 0xfc966d28 -//.word 0xa4d7375e -//.word 0x86e246e0 -//.word 0x31964bae -//.word 0x6c2ee6fa -//.word 0x7b720bf1 -//.word 0x9d2eaad9 -//.word 0xd9e48f5c -//.word 0xfabe8723 -//.word 0xd9c6c4a7 -//.word 0xda598244 -//.word 0xb9d9eb90 -//.word 0x87a338ea -//.word 0xef411a56 -//.word 0xbee05888 -//.word 0xa304b93e -//.word 0x327a24d3 -//.word 0x2f8f0611 -//.word 0x0a7ff448 -//.word 0xa630929c -//.word 0x5e20b3a3 -//.word 0x4a9cc130 -//.word 0xbe346069 -//.word 0x146b4e20 -//.word 0xacb38d60 -//.word 0x3098c545 -//.word 0x1d3be411 -//.word 0x7f02077d -//.word 0xfc8e9d4d -//.word 0x13edc927 -//.word 0xa61109a5 -//.word 0xb68116a9 -//.word 0x6f4f0bf1 -//.word 0x644ac8eb -//.word 0x1b7499ca -//.word 0xccb713d9 -//.word 0x66d33f0f -//.word 0xd39bfbe4 -//.word 0x7d619c64 -//.word 0x11afd882 -//.word 0x8338e4ae -//.word 0x520dd9aa -//.word 0x0d145c99 -//.word 0x16b77e59 -//.word 0xa6d9e112 -//.word 0x110e1d0f -//.word 0x4b0b61cd -//.word 0xab5b5e52 -//.word 0xf05460c0 -//.word 0x824abe2a -//.word 0xfa0275a6 -//.word 0xe36910a4 -//.word 0xc286cb7e -//.word 0x55aef750 -//.word 0x19f7a009 -//.word 0x0eef6ec2 -//.word 0xbe8dc94f -//.word 0x7c674014 -//.word 0xea262c1a -//.word 0xbe379063 -//.word 0xc5c4447a -//.word 0x28e3534d -//.word 0xee0da13f -//.word 0xc2d1d17a -//.word 0xf6c96582 -//.word 0xc9ce2710 -//.word 0xe568c81d -//.word 0x2c88c83d -//.word 0xb47a952e -//.word 0x1015f7b1 -//.word 0xd235ab98 -//.word 0x4d6b4f21 -//.word 0xa0f27e82 -//.word 0xf0e53bc5 -//.word 0xf4b093d6 -//.word 0xb7c57edb -//.word 0x999007c3 -//.word 0x97acac22 -//.word 0xcd57083c -//.word 0x3923af5f -//.word 0xc2ef5a77 -//.word 0x791644dc -//.word 0x1ee6d36e -//.word 0xe6547be4 -//.word 0x7bede061 -//.word 0x45103a48 -//.word 0xe85bfe52 -//.word 0x0e63bbde -//.word 0x66a84188 -//.word 0xedc809fc -//.word 0x6cf2d10d -//.word 0x419e8701 -//.word 0x637b682f -//.word 0xa1a969cd -//.word 0x2a29d603 -//.word 0x52923943 -//.word 0x93057ddd -//.word 0xd26253ce -//.word 0xe4bcd5d9 -//.word 0x510b69da -//.word 0x5821e956 -//.word 0x33e00156 -//.word 0x9ca9d876 -//.word 0x8f17f239 -//.word 0x52ee559f -//.word 0xb34eeafa -//.word 0x912d27fd -//.word 0x9d04eb16 -//.word 0x62c7a9fe -//.word 0x831bc98e -//.word 0x44c44bd4 -//.word 0x4c5cae66 -//.word 0xaa4b10f6 -//.word 0x15f39627 -//.word 0x782b0e9f -//.word 0xaeefd35d -//.word 0x8955f14d -//.word 0x1ac38a1a -//.word 0x2c607944 -//.word 0x12c83472 -//.word 0xa304f709 -//.word 0x82b91ffd -//.word 0xa39fd4e8 -//.word 0x0a35ea59 -//.word 0xd6b4096e -//.word 0x7f410ca5 -//.word 0x5c66a8ef -//.word 0x68c34e06 -//.word 0x45015201 -//.word 0x81084c26 -//.word 0x1972bfff -//.word 0x3b3ff8b0 -//.word 0x50ca3987 -//.word 0x3afb17d5 -//.word 0xdabf21fc -//.word 0xd6b5c2ca -//.word 0x992b6905 -//.word 0x9b48e647 -//.word 0xe28a180c -//.word 0xc974c50a -//.word 0x0080c9c1 -//.word 0xd45b7352 -//.word 0xb0512c94 -//.word 0xe4065965 -//.word 0xa668833e -//.word 0x56e1b50b -//.word 0x07d12639 -//.word 0x3a3b1810 -//.word 0xecbf0043 -//.word 0xd4c8e7c5 -//.word 0xe60610df -//.word 0x1b1fdb80 -//.word 0x74a1e9d4 -//.word 0x3d3c8117 -//.word 0x8f2e33ac -//.word 0x18febb69 -//.word 0x1e6d2836 -//.word 0xc2aa3dd6 -//.word 0x82c51704 -//.word 0x026610c2 -//.word 0x0cbfe4ee -//.word 0xd5bf1216 -//.word 0x8288858d -//.word 0xea2474be -//.word 0x9e7387c1 -//.word 0x27683b2c -//.word 0x8e75872c -//.word 0x2244c0d4 -//.word 0x75a8bab4 -//.word 0xa8d330ae -//.word 0xe8c96505 -//.word 0x39150cb7 -//.word 0x72ba650d -//.word 0x896caa70 -//.word 0x1100a97e -//.word 0x0122b25d -//.word 0xb746b34f -//.word 0x3de1a287 -//.word 0xcad81b3c -//.word 0x8c384bfb -//.word 0xa4290c41 -//.word 0x731d5149 -//.word 0x144dc523 -//.word 0x2966af06 -//.word 0xdb7f19e7 -//.word 0x1c4f314a -//.word 0x2f9def59 -//.word 0x6bf7f833 -//.word 0x3ca7c386 -//.word 0x6ae3fa60 -//.word 0x9e442342 -//.word 0x227a7f77 -//.word 0xe83d32a3 -//.word 0xce86a59f -//.word 0x20002984 -//.word 0x5eb9dd06 -//.word 0x401ed104 -//.word 0xf8266b5c -//.word 0xb7cd0a04 -//.word 0x72c4ea57 -//.word 0xe66748ac -//.word 0xdaefc62d -//.word 0xa4e910e7 -//.word 0xeee7c01d -//.word 0xba757fe2 -//.word 0xa44e6de7 -//.word 0x67d0c491 -//.word 0xa3aeb84e -//.word 0xdee5a12a -//.word 0xc8f15b9d -//.word 0xc340eda7 -//.word 0xa2e76a1f -//.word 0xb1941549 -//.word 0xf6c3c8a6 -//.word 0xb7359710 -//.word 0x3d9eb006 -//.word 0xd79f8544 -//.word 0x21f32e96 -//.word 0x85ed08ef -//.word 0x0322a3b5 -//.word 0x2e63db60 -//.word 0x77ee4443 -//.word 0xaee4cca9 -//.word 0xc6fe9b24 -//.word 0xd97c3e22 -//.word 0x6b5f05c1 -//.word 0xf3d8a9e5 -//.word 0x98003287 -//.word 0x38c91850 -//.word 0xae35a966 -//.word 0x55c6aa86 -//.word 0xc8354153 -//.word 0xec6713ed -//.word 0x319ca9c6 -//.word 0x14ea18b1 -//.word 0xe9eae13c -//.word 0xd7b11640 -//.word 0x2401beb6 -//.word 0xb2c17bcc -//.word 0xcaab6a39 -//.word 0x19454bcd -//.word 0xf812e24c -//.word 0xf1099c7c -//.word 0x7e46767d -//.word 0x13001b59 -//.word 0x5fbb4cdc -//.word 0xd0be85a6 -//.word 0x55c8de7e -//.word 0x67ff2fe9 -//.word 0x4a2977fb -//.word 0x901e7f6e -//.word 0xe07dbaf1 -//.word 0xf59f70c2 -//.word 0xe9c91b7f -//.word 0xb4a6123a -//.word 0xf0f464cb -//.word 0xdf7d076a -//.word 0xae49327d -//.word 0xfb1207ae -//.word 0x96f87541 -//.word 0x84765da4 -//.word 0x4a95f348 -//.word 0x685f68b0 -//.word 0x2397c6c8 -//.word 0x87a71b77 -//.word 0xaddad977 -//.word 0x3acb7d65 -//.word 0x281e6f14 -//.word 0xc96d2927 -//.word 0x08859cdf -//.word 0xf3d3cf31 -//.word 0x7619ca1c -//.word 0x6965b239 -//.word 0xce443594 -//.word 0x533329ba -//.word 0x1f566f13 -//.word 0xca6d1e72 -//.word 0xad03ddeb -//.word 0x5de891e5 -//.word 0x72e2396f -//.word 0x8da015d8 -//.word 0x99ef0e79 -//.word 0x503152d6 -//.word 0x010a3fe6 -//.word 0x915c82ae -//.word 0xc1768015 -//.word 0xae88f5f3 -//.word 0x9e5ada6b -//.word 0xf93e8d7b -//.word 0x96442cd1 -//.word 0x38ac41e0 -//.word 0x59a1a534 -//.word 0x26249e02 -//.word 0xca464b04 -//.word 0xef9a4283 -//.word 0x82ea77b6 -//.word 0xb729604a -//.word 0x4ea95642 -//.word 0x148e3f01 -//.word 0xac836aa5 -//.word 0x8fabba97 -//.word 0x52da0760 -//.word 0x2806c1bf -//.word 0xa7f8d6f8 -//.word 0xcf47d66e -//.word 0x48875674 -//.word 0xebbe9261 -//.word 0x841756e2 -//.word 0xd6db1e95 -//.word 0xe09c7cd3 -//.word 0x5fb4bacd -//.word 0x94eec0da -//.word 0x4782390f -//.word 0x0c47f211 -//.word 0xc5248227 -//.word 0x68c73093 -//.word 0x039a1123 -//.word 0xfdf37103 -//.word 0x9e8c74d5 -//.word 0xd132fd03 -//.word 0x29c1cf54 -//.word 0x234ff3be -//.word 0xaba8597c -//.word 0xe1fbc260 -//.word 0x1cd2dc69 -//.word 0x2f47af98 -//.word 0xec753900 -//.word 0xe72e551d -//.word 0x7dece266 -//.word 0x14092025 -//.word 0xa3325d87 -//.word 0x7619d2ef -//.word 0x2b6ac890 -//.word 0x0101ff3b -//.word 0x525a4f75 -//.word 0x5d4890cd -//.word 0x49eab86d -//.word 0x67db43ee -//.word 0xb8aad871 -//.word 0xaf8a29eb -//.word 0x374a1bc0 -//.word 0xf8872794 -//.word 0xd620ff5d -//.word 0xbbea75bd -//.word 0x97a59990 -//.word 0xa52f22c1 -//.word 0xeff81061 -//.word 0x14b68ffa -//.word 0x495a1d20 -//.word 0x9e42ef4a -//.word 0x83b091e0 -//.word 0x8a7bce95 -//.word 0x6e04cff7 -//.word 0x556c8744 -//.word 0x52044e80 -//.word 0x2e05cbc4 -//.word 0x688218d9 -//.word 0x7a9a2106 -//.word 0x5ef24d25 -//.word 0x516361fc -//.word 0xd7efa1cb -//.word 0xfffa3822 -//.word 0xe8b6d9f5 -//.word 0x84e0a7f2 -//.word 0x9caa5212 -//.word 0x14f8836f -//.word 0x71ce7b55 -//.word 0x9809f79b -//.word 0xd84e5634 -//.word 0x2b41fd01 -//.word 0xb9f7fbe9 -//.word 0x9eade92c -//.word 0xedba14f4 -//.word 0xf5c2df2e -//.word 0xc32d6297 -//.word 0xe8d7571a -//.word 0x7c093759 -//.word 0x62a9a08a -//.word 0xceadfa84 -//.word 0x05d55a19 -//.word 0x649aa6a7 -//.word 0xa462fbea -//.word 0x5cf54b14 -//.word 0xc7344b20 -//.word 0xc8098c63 -//.word 0x2b9ae764 -//.word 0x2ec21fed -//.word 0x40c1c262 -//.word 0x08325052 -//.word 0xa93e9f4c -//.word 0x45107ef4 -//.word 0xc0889955 -//.word 0xc6349d79 -//.word 0x0f7c9c37 -//.word 0xe11cb24d -//.word 0xd7d8e9af -//.word 0xe26a5a1e -//.word 0x8dc095fb -//.word 0x8564435e -//.word 0x583c0a63 -//.word 0x7d73b1c4 -//.word 0x95b785ad -//.word 0xf0a5fbcb -//.word 0x538196a7 -//.word 0xf82b0b32 -//.word 0xd74ea4a0 -//.word 0x24dbe27a -//.word 0x19b666ef -//.word 0xf5af116c -//.word 0x45b36b6c -//.word 0x62434190 -//.word 0x3b2693f2 -//.word 0x545badb7 -//.word 0x0f5293e3 -//.word 0x2b5ca271 -//.word 0x8a5f75a4 -//.word 0x37ce0698 -//.word 0xa7d8151c -//.word 0x3fe0cec4 -//.word 0x172ea639 -//.word 0xfee486d4 -//.word 0xbe332b6b -//.word 0xa1cecd6b -//.word 0x339ffe27 -//.word 0x4abad670 -//.word 0x448f4d66 -//.word 0x9063e88d -//.word 0x70019824 -//.word 0xfcacdfb2 -//.word 0x6b5934e1 -//.word 0x8e1ba98f -//.word 0x9ddfcb23 -//.word 0x3659c91d -//.word 0xa33ed9f2 -//.word 0x5cb4d816 -//.word 0xcc07305a -//.word 0x589dff78 -//.word 0x9e2c76ec -//.word 0xfa2a7f06 -//.word 0x4f85a23e -//.word 0x049529c7 -//.word 0x4c4f8267 -//.word 0xabbbe685 -//.word 0xb6a83884 -//.word 0x1a9e304f -//.word 0xdf14b835 -//.word 0xeee396f8 -//.word 0xd1fb4c20 -//.word 0xbb543c95 -//.word 0xc828106d -//.word 0x85605903 -//.word 0xb34c7649 -//.word 0x4896b85f -//.word 0xb779c464 -//.word 0x712e388c -//.word 0xaca79172 -//.word 0x63804cb0 -//.word 0x9e334bae -//.word 0xf38b7bb7 -//.word 0x4d5bb452 -//.word 0xec6fe0cf -//.word 0xadc36020 -//.word 0x8cf3abea -//.word 0x67f338dc -//.word 0x05009f40 -//.word 0x56d6fbcf -//.word 0xfc2492ca -//.word 0x0b3db846 -//.word 0x0d10f0c8 -//.word 0x4a5a5511 -//.word 0x461a383b -//.word 0x8a460b05 -//.word 0xa7bc7d6c -//.word 0x797be77b -//.word 0xa913e763 -//.word 0x755a4ace -//.word 0xb4613071 -//.word 0x14a66ae0 -//.word 0xa78b27a7 -//.word 0x9e07d096 -//.word 0x549c305c -//.word 0x8e89d858 -//.word 0x0140c2ab -//.word 0x141a3492 -//.word 0xe84ae7f3 -//.word 0x95106935 -//.word 0xb72fc055 -//.word 0x2aa05036 -//.word 0x1188ff39 -//.word 0x1d68960e -//.word 0x0c936aca -//.word 0x6fe63d39 -//.word 0xb1b35f75 -//.word 0x55fe18b7 -//.word 0x7fec4b6e -//.word 0xb678538e -//.word 0xe868312b -//.word 0xae7fe946 -//.word 0xd2f529e7 -//.word 0x0f242c6c -//.word 0x1784de20 -//.word 0xdbd9410f -//.word 0x06ab0f19 -//.word 0xcaf7a146 -//.word 0xe0240f59 -//.word 0xca3899a8 -//.word 0x5c4c452a -//.word 0x7a3ecad2 -//.word 0x23a5ad1b -//.word 0xaf0aaae5 -//.word 0x5455557f -//.word 0xef850105 -//.word 0x01a4e1ec -//.word 0xf8fa6ddb -//.word 0xb18207bc -//.word 0x3a9adf14 -//.word 0xdcfe148f -//.word 0x59f71ce0 -//.word 0x72d065c7 -//.word 0xac8a3c73 -//.word 0x54d1ef0b -//.word 0xc12e2e88 -//.word 0xd97db7c5 -//.word 0xd7a233d9 -//.word 0x4b785aa4 -//.word 0x610a5ea8 -//.word 0x6706871a -//.word 0x8a6e1a39 -//.word 0xe09180df -//.word 0xac3aa456 -//.word 0xdd279d6c -//.word 0xd7bc8dca -//.word 0x76f9c981 -//.word 0x50aa3ae6 -//.word 0x3bdd03a0 -//.word 0x109963ff -//.word 0xaecddd90 -//.word 0x418797ee -//.word 0xc46601da -//.word 0xc452b68e -//.word 0x676aa74f -//.word 0xae3e7642 -//.word 0xf73f2080 -//.word 0xc674df6c -//.word 0xc46e4f45 -//.word 0x087dcff7 -//.word 0x96242a37 -//.word 0x25cb77ce -//.word 0x26b43d35 -//.word 0x0130db63 -//.word 0xa21327e3 -//.word 0x34655629 -//.word 0x2c5a1c26 -//.word 0x8a84131a -//.word 0x5b4861aa -//.word 0x838f9632 -//.word 0xb9bdd35c -//.word 0xd3e731f2 -//.word 0x444160f0 -//.word 0xe3d58fde -//.word 0xee7b8c5c -//.word 0x4e052dff -//.word 0x1cbaee5b -//.word 0x6506db61 -//.word 0x2a6fb1ec -//.word 0xabcb4096 -//.word 0xe6b013d0 -//.word 0x5a2d5332 -//.word 0x10b7e90f -//.word 0xdc66e34d -//.word 0xe1621973 -//.word 0x53981004 -//.word 0x81b11e0c -//.word 0x1244cff8 -//.word 0x8e4a88aa -//.word 0x21d36acd -//.word 0x9cf87966 -//.word 0xbd11feac -//.word 0xb0282a1a -//.word 0xd5adfbc2 -//.word 0xc46a64e4 -//.word 0x8fbaa8bf -//.word 0x47f607a7 -//.word 0xc1319c58 -//.word 0x9925868a -//.word 0x786c46c6 -//.word 0x93f46877 -//.word 0x74ad6644 -//.word 0xfd84c99d -//.word 0xaa959194 -//.word 0x169cd7ef -//.word 0xc1adb17b -//.word 0x102656a3 -//.word 0x95e18240 -//.word 0x91ae1cb3 -//.word 0xb7001732 -//.word 0x33e6965f -//.word 0xeb3d531f -//.word 0x052541a9 -//.word 0xa9b170dd -//.word 0x08e331d8 -//.word 0x9dd77cc5 -//.word 0xb23e8ef5 -//.word 0x270ed633 -//.word 0x6f781251 -//.word 0xdb1bb607 -//.word 0x1b778dfe -//.word 0x02a4a227 -//.word 0x89436151 -//.word 0x17b6fafb -//.word 0xff8c0666 -//.word 0x4a3f6def -//.word 0xb822879c -//.word 0x019581f5 -//.word 0x607b0315 -//.word 0x52ee0f00 -//.word 0x9c312d37 -//.word 0x8be5c58a -//.word 0x7f80cc2e -//.word 0xabfca20f -//.word 0x16cc3b67 -//.word 0xe5147e90 -//.word 0xdd19ea17 -//.word 0x24f77f11 -//.word 0x4792dcb2 -//.word 0x81cea51b -//.word 0x3b032774 -//.word 0xcfab3f3b -//.word 0x915e77db -//.word 0x10017381 -//.word 0x993a8c2b -//.word 0xfd26ba02 -//.word 0x944fb7e9 -//.word 0x82d86156 -//.word 0x39fb6160 -//.word 0x40b60a1a -//.word 0x32c08320 -//.word 0x09c2296f -//.word 0x9cc42f7a -//.word 0x67e5877a -//.word 0x8b500605 -//.word 0x156bc3e2 -//.word 0x8352c01c -//.word 0x8583cc55 -//.word 0x00dba75d -//.word 0x58c16803 -//.word 0xefa11c2b -//.word 0xe99cb021 -//.word 0x337d112d -//.word 0xc3ef9168 -//.word 0x21ee8dcd -//.word 0x267c4c93 -//.word 0x03952bbb -//.word 0x8664f7e5 -//.word 0x99b79b67 -//.word 0x0cb1fba0 -//.word 0x94be1f8a -//.word 0x13cc948f -//.word 0x19b90f9e -//.word 0xab07547d -//.word 0x44d75661 -//.word 0x1a15a0bc -//.word 0xa2f0f356 -//.word 0x568d319f -//.word 0xb6fc7944 -//.word 0x8d6b9400 -//.word 0x759990b5 -//.word 0x9d8eaabb -//.word 0xca8a7277 -//.word 0x9c3b2930 -//.word 0x13326e1f -//.word 0x51981ac5 -//.word 0xa21d6882 -//.word 0xb9325962 -//.word 0x3d78563a -//.word 0x847817f4 -//.word 0x9e94c527 -//.word 0x953d5beb -//.word 0xf36752eb -//.word 0x853a7dbb -//.word 0x5f0b326c -//.word 0x208aaa5e -//.word 0x773daa56 -//.word 0xe62d63d0 -//.word 0xc6df9897 -//.word 0x8c85fe92 -//.word 0x4a76e8e1 -//.word 0x79dc2329 -//.word 0xf5ac1f2b -//.word 0x49dc509c -//.word 0x2dd0d430 -//.word 0x4d1556f9 -//.word 0x4c5132ef -//.word 0x097adad0 -//.word 0x2147782a -//.word 0xb5e4d5b5 -//.word 0x6dea79e7 -//.word 0xbc8e14c3 -//.word 0x66191cf2 -//.word 0x4098b814 -//.word 0x37d4dd58 -//.word 0x9484b64a -//.word 0x7fc24aed -//.word 0xc1bc590a -//.word 0xceac86c7 -//.word 0x020abc7b -//.word 0x2bffcac1 -//.word 0x481e50cc -//.word 0x904fdffa -//.word 0xb60b5cab -//.word 0x6ccfa553 -//.word 0x26ca77ce -//.word 0x20d990f4 -//.word 0xa2b6106e -//.word 0x836d25c8 -//.word 0xec0fe7c6 -//.word 0x5ea981fc -//.word 0xf6779299 -//.word 0xf056d384 -//.word 0x6b78f9aa -//.word 0x6b5bdd96 -//.word 0x24fcda42 -//.word 0x7648762c -//.word 0xb4d345ad -//.word 0xa9cc0b86 -//.word 0xdd3121bc -//.word 0x143f1aa7 -//.word 0x182da545 -//.word 0xb819b5d4 -//.word 0x1143e09f -//.word 0x0c790518 -//.word 0x28d23227 -//.word 0x7a9fc5c2 -//.word 0xf29fd1be -//.word 0xdf72c3e4 -//.word 0xb5504548 -//.word 0x0efb62d6 -//.word 0xf0f2eb2e -//.word 0x4ee81ab2 -//.word 0xd17476dc -//.word 0xd80af6d6 -//.word 0xbd2a6944 -//.word 0x5ad71564 -//.word 0xcb4b9f5a -//.word 0x76e92bc5 -//.word 0x4973c396 -//.word 0x437dfd22 -//.word 0x3622d876 -//.word 0xcbf5e8ea -//.word 0xc63ab3f9 -//.word 0x8b575a4f -//.word 0xe1857c24 -//.word 0xf7cb57c9 -//.word 0xa52d3080 -//.word 0xf321f591 -//.word 0xdf42229a -//.word 0x5b48e127 -//.word 0x96387582 -//.word 0x7cd8d8cd -//.word 0x8066a34d -//.word 0x99892f09 -//.word 0x8a88fa94 -//.word 0x67ba4c27 -//.word 0x553e1af2 -//.word 0x91eb2ab4 -//.word 0xb48a788a -//.word 0x3543d904 -//.word 0x2f56de7e -//.word 0x640cfbae -//.word 0x83ece879 -//.word 0xa631480b -//.word 0x1f7c8926 -//.word 0x74c70bba -//.word 0xa89a84b7 -//.word 0xbc81a31f -//.word 0x76bdf35f -//.word 0x613a03df -//.word 0x15c1c4d8 -//.word 0xb86f3266 -//.word 0xc56636de -//.word 0x0cc2cb61 -//.word 0xfbcf61b1 -//.word 0x1b797e44 -//.word 0xdd03ab97 -//.word 0x97fc8ec5 -//.word 0xca6f5458 -//.word 0xa65b525f -//.word 0xd062ebc1 -//.word 0x62c5b4d0 -//.word 0x3490d621 -//.word 0x5a12b49c -//.word 0xed90cecf -//.word 0x0f3be587 -//.word 0x295e61a2 -//.word 0x77dcef1f -//.word 0xc7da6e77 -//.word 0x7db90c30 -//.word 0xdb47acaf -//.word 0x7f368c4e -//.word 0x2dcd24ae -//.word 0xcfdd514f -//.word 0xbaf7b25d -//.word 0x33dc52cd -//.word 0x323588a9 -//.word 0x66841ca8 -//.word 0x785bab02 -//.word 0x94cc4d82 -//.word 0x262074dd -//.word 0xe1cb1842 -//.word 0x06a01132 -//.word 0xe342c492 -//.word 0x9adb01ff -//.word 0x23102c61 -//.word 0x94349bc3 -//.word 0xa0bb4062 -//.word 0x5ef28803 -//.word 0x4cee828a -//.word 0x94c244c9 -//.word 0x8ef68b96 -//.word 0x8534a120 -//.word 0xbe438483 -//.word 0xb63a4499 -//.word 0xacedad13 -//.word 0x5fac26c9 -//.word 0x192dd94f -//.word 0xecc614c9 -//.word 0x3cdfef00 -//.word 0x7ea830b5 -//.word 0x3e076b35 -//.word 0x67d56e2d -//.word 0xbf49dcc0 -//.word 0xb1b417d7 -//.word 0x4f6f63b8 -//.word 0x971249db -//.word 0xf5e73af8 -//.word 0x0a9f7565 -//.word 0xac432b9f -//.word 0x2e6de027 -//.word 0xe1b7148f -//.word 0xda7423d4 -//.word 0xf69e6aee -//.word 0x1c10aba6 -//.word 0xc2f5b2a8 -//.word 0xb38139d9 -//.word 0x0fdf0aea -//.word 0x936a632e -//.word 0x1a1f9ea8 -//.word 0x64521169 -//.word 0x17a13419 -//.word 0x032701d3 -//.word 0xaaf2a136 -//.word 0x00b644b8 -//.word 0x6fc2513e -//.word 0x1e34bfea -//.word 0x7369c234 -//.word 0xd7b8ab3d -//.word 0xb960095f -//.word 0xd5be1509 -//.word 0xb6c44dca -//.word 0x79a65eab -//.word 0xd5d647c2 -//.word 0x5833bc04 -//.word 0xf37ec85b -//.word 0xb90db7f9 -//.word 0xe4c333eb -//.word 0x193fadf1 -//.word 0xed54ff8d -//.word 0xa7b94f5a -//.word 0x4702369f -//.word 0xc8cf2124 -//.word 0xa344f844 -//.word 0x94b9fe44 -//.word 0xa0b2f9e3 -//.word 0x57119232 -//.word 0x578afea6 -//.word 0x1158de6c -//.word 0xd02e64fc -//.word 0xf771b8f1 -//.word 0x89a49a18 -//.word 0xef2448c7 -//.word 0xf615a270 -//.word 0x189c8c75 -//.word 0xfc4e943e -//.word 0x40e9d58a -//.word 0x75421a02 -//.word 0x6b7f4714 -//.word 0xaf86f5fe -//.word 0x53b65d29 -//.word 0xedd477b9 -//.word 0xe2486362 -//.word 0xe589077d -//.word 0xbad6fa5b -//.word 0x4027a0d9 -//.word 0xae639734 -//.word 0x1dd3521f -//.word 0x47d70413 -//.word 0x8ed7c0e7 -//.word 0x407ddea0 -//.word 0x1921a08a -//.word 0x09851688 -//.word 0x38c33ea8 -//.word 0x488370fa -//.word 0xda71f9a3 -//.word 0x53ef072d -//.word 0xe006c521 -//.word 0xb7a3c6d8 -//.word 0xa000a78e -//.word 0xb460f0b8 -//.word 0x65ff3c97 -//.word 0xbf499a0e -//.word 0xee4a32b1 -//.word 0xff662c1e -//.word 0xeb4acd90 -//.word 0xd122e3b1 -//.word 0x830c64b0 -//.word 0x44cd5294 -//.word 0xd0c4e1d0 -//.word 0x9d1cdc17 -//.word 0x61454571 -//.word 0xd4a43c8f -//.word 0xb789215b -//.word 0x1562fdd4 -//.word 0xc92f1e19 -//.word 0x403602c3 -//.word 0x80f87778 -//.word 0x6963ffbe -//.word 0x3b49790c -//.word 0x5911fe27 -//.word 0x4dad0aac -//.word 0x0bccdce8 -//.word 0x7a501ff0 -//.word 0x3002c9ee -//.word 0x7d8444ba -//.word 0xac88ccaa -//.word 0x854018aa -//.word 0x17153c8f -//.word 0xb49ccea8 -//.word 0x3cc64796 -//.word 0x9f57ad5e -//.word 0x9d996fbd -//.word 0xd05191bc -//.word 0xedf20883 -//.word 0x47116872 -//.word 0x9419bc6e -//.word 0xf440b579 -//.word 0x2fb90886 -//.word 0x3e2b118b -//.word 0x0e63bcd7 -//.word 0x8046a5a6 -//.word 0xb4097ef3 -//.word 0x87a4b28d -//.word 0x5a83476d -//.word 0x167f0947 -//.word 0x6c0ee55f -//.word 0x62b6939e -//.word 0x0bc878e5 -//.word 0x954acaa1 -//.word 0x8a35f5a0 -//.word 0x4fe13d23 -//.word 0xf1bda534 -//.word 0x20431039 -//.word 0x7c2ba7ca -//.word 0x10df7ac0 -//.word 0x1c306a8e -//.word 0x184746d5 -//.word 0xf5de3432 -//.word 0xa6b0535b -//.word 0xdf2d9e6a -//.word 0x1d731478 -//.word 0xe67a166e -//.word 0x528e1018 -//.word 0xca035b7b -//.word 0x10246269 -//.word 0x7f6c0452 -//.word 0x95f93a5d -//.word 0xae3dfab7 -//.word 0x12f75b2b -//.word 0x3261f9f4 -//.word 0x2fab9bcf -//.word 0x9ca91354 -//.word 0x85c96685 -//.word 0xb0472da8 -//.word 0x22a43b52 -//.word 0xe55480c5 -//.word 0x09b72d7b -//.word 0xe94a1903 -//.word 0xb01f640c -//.word 0x1b8a5ac0 -//.word 0x801e9a53 -//.word 0x0fd777db -//.word 0x58999e62 -//.word 0x0dd9f939 -//.word 0x099ad490 -//.word 0x929c3f44 -//.word 0xdbd0b3f8 -//.word 0xcd0ef867 -//.word 0x070a45f8 -//.word 0x2485aa94 -//.word 0x3cc0abb4 -//.word 0xad362ebe -//.word 0x1b8a9791 -//.word 0xb5bf315e -//.word 0xbaa7d0bb -//.word 0x3c9eb4f2 -//.word 0x2578b19f -//.word 0x77b78d7a -//.word 0xd801aa71 -//.word 0x4dd2e4fa -//.word 0x466fbda7 -//.word 0xdb1bb8fa -//.word 0x558c027c -//.word 0xf0a05709 -//.word 0xdf4d246e -//.word 0x91d6e936 -//.word 0x3345e2c0 -//.word 0x7615e695 -//.word 0x922f8ff9 -//.word 0x8b189bc0 -//.word 0xb2689263 -//.word 0x707ea953 -//.word 0x3f72e78d -//.word 0xf94b866f -//.word 0x55729cca -//.word 0xae67fb38 -//.word 0x07b355b0 -//.word 0x4d1ea457 -//.word 0xdb21c899 -//.word 0x449e7279 -//.word 0x4ccf4225 -//.word 0x377d2cce -//.word 0x477220b6 -//.word 0x8030ea8b -//.word 0xaee357f3 -//.word 0xa9959968 -//.word 0xd8a1ec46 -//.word 0xf46a7a22 -//.word 0x0e4c7c5e -//.word 0xd4d3a3fa -//.word 0x102bb6ad -//.word 0x71d87c35 -//.word 0x8ea7dceb -//.word 0x28e5439a -//.word 0xafce4691 -//.word 0x084889f7 -//.word 0x8ed2df5f -//.word 0x57b7b29c -//.word 0xb887a6d7 -//.word 0x0bc779df -//.word 0xafe82ebf -//.word 0x51766a96 -//.word 0x6a921ea3 -//.word 0x09a266a0 -//.word 0xd347b151 -//.word 0x4890235c -//.word 0x486d375b -//.word 0xd566a930 -//.word 0x1a8c9398 -//.word 0xacb0d604 -//.word 0x11d4bba4 -//.word 0x7fdfdac4 -//.word 0xe5953b5b -//.word 0x30c5bce1 -//.word 0xc7c4b262 -//.word 0x571bd3d1 -//.word 0xd67d549e -//.word 0xc2fc4e8a -//.word 0xaa7c66bb -//.word 0xf067ad0b -//.word 0xcda2c5a6 -//.word 0x95c046d4 -//.word 0x3d765f13 -//.word 0x1a4fc169 -//.word 0xeba1b8f8 -//.word 0x1ac09bd3 -//.word 0x3f716710 -//.word 0xe6a2a71f -//.word 0x9258975a -//.word 0x02e888dc -//.word 0xb26a8697 -//.word 0xa56b39a1 -//.word 0x62e209cf -//.word 0x3d658585 -//.word 0xd79d06cc -//.word 0xe8f88fa5 -//.word 0x3c9df89e -//.word 0xfca54ca2 -//.word 0x2f886f15 -//.word 0x80d50421 -//.word 0x42278d4a -//.word 0xb154d449 -//.word 0x7be78b17 -//.word 0x7fd12f48 -//.word 0xd45b329a -//.word 0x0d5f58ce -//.word 0xbbb862b6 -//.word 0x34f7ea90 -//.word 0x93578e92 -//.word 0x00f450c6 -//.word 0x32373d80 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x0000CD18 -//// expected output -//.word 0x4bccd0e1 -//.word 0x58f345b3 -//.word 0x4d583f92 -//.word 0x9c0a74d2 -//.word 0xb502d3a8 -//.word 0xf4112aeb -//.word 0x8a3e0e25 -//.word 0x3a817c52 -//.word 0xcaa947a6 -//.word 0x2a4bf857 -//.word 0xd1e37b3f -//.word 0xc9a5dead -//.word 0x09fc2266 -//.word 0x319733ca -//.word 0x2371051a -//.word 0x4e358e0e -//// SHA512LongMsgvector_66 -//// vector length -//.word 0x0000D030 -//// input message -//.word 0xefd8212e -//.word 0x7ba79856 -//.word 0x99cbf814 -//.word 0x02e3f0ae -//.word 0xf704d375 -//.word 0x8db890f0 -//.word 0x4946e436 -//.word 0xec34ce9c -//.word 0x900b4490 -//.word 0xf45a24c5 -//.word 0x15fd6d91 -//.word 0xfe9faf93 -//.word 0xe07ec098 -//.word 0x656eb1bf -//.word 0x422100dc -//.word 0x0ca50f1b -//.word 0x4c2ed5e6 -//.word 0xd516d408 -//.word 0x55224b12 -//.word 0x2b07acfd -//.word 0x782d5012 -//.word 0x79b26a07 -//.word 0x14b23a6b -//.word 0xb0c68344 -//.word 0x4aca3ef6 -//.word 0xc5e49066 -//.word 0x82c1fa60 -//.word 0x3122d036 -//.word 0xe798ecaa -//.word 0x708ba30e -//.word 0xe681f8aa -//.word 0x829d105e -//.word 0xb366e689 -//.word 0x6dcb4029 -//.word 0xc463e243 -//.word 0xb9f90185 -//.word 0x5447fa2a -//.word 0xf302441e -//.word 0xe117a362 -//.word 0x2a359fb3 -//.word 0xae8b3566 -//.word 0x75d3cc97 -//.word 0x428f6b82 -//.word 0x6b922831 -//.word 0xe7c3e458 -//.word 0xa91e357d -//.word 0x2cfba45b -//.word 0x50931989 -//.word 0x64c09357 -//.word 0x84041cf9 -//.word 0x25cdfde7 -//.word 0xeef72e83 -//.word 0xca9310fc -//.word 0x3be75e73 -//.word 0xf1b5615d -//.word 0x9bc16429 -//.word 0xfd8d6822 -//.word 0x42671996 -//.word 0x94a50038 -//.word 0xeb30f9c3 -//.word 0x223fe8e0 -//.word 0x5065a84a -//.word 0x55ce4430 -//.word 0xb3c66adb -//.word 0xa07a1c90 -//.word 0x5903a9b8 -//.word 0xb8a0dc3e -//.word 0x09437339 -//.word 0x1a50d2cb -//.word 0x91a1f948 -//.word 0x82cdb49b -//.word 0x41aa11e6 -//.word 0x75101769 -//.word 0x6ee0b5a5 -//.word 0xb945f9c1 -//.word 0xf13a832c -//.word 0xd74d3884 -//.word 0xa5a23bb7 -//.word 0xa03a1968 -//.word 0xed754394 -//.word 0xa5d6c275 -//.word 0x2c0726a6 -//.word 0xbe1dbf89 -//.word 0x4a1c10e6 -//.word 0x84be81d4 -//.word 0x367054dd -//.word 0xd69eda5d -//.word 0x5e30e72b -//.word 0x5855837b -//.word 0x387fe203 -//.word 0xefaf975d -//.word 0xbdf204ad -//.word 0x472b1583 -//.word 0xe9142e03 -//.word 0x4d806143 -//.word 0x3de3e5f4 -//.word 0xb513c345 -//.word 0x3d50d304 -//.word 0x7583e706 -//.word 0xf2c346ca -//.word 0x481d5c59 -//.word 0x6895af70 -//.word 0x2d6815e1 -//.word 0x31942537 -//.word 0xe59aeb99 -//.word 0xe183e0f1 -//.word 0x7821184d -//.word 0x9097be85 -//.word 0xb01cbe1e -//.word 0x5bfbc16e -//.word 0x9dde5e01 -//.word 0xe34d8e3c -//.word 0x10726140 -//.word 0xcc1ff011 -//.word 0x1f1293f8 -//.word 0x40775425 -//.word 0xa7aea399 -//.word 0x694f4b43 -//.word 0xc56ba469 -//.word 0xfa150a4a -//.word 0x5c218f02 -//.word 0xa72cedad -//.word 0x93ddbfcf -//.word 0xa969f0f4 -//.word 0x545d7393 -//.word 0x3b983438 -//.word 0xce964fe2 -//.word 0x1ff581aa -//.word 0xf431dba6 -//.word 0x1ab3be0d -//.word 0xfc0a039c -//.word 0x74787a38 -//.word 0xe0b096d4 -//.word 0x79de6695 -//.word 0xe0e8c734 -//.word 0xfaf3d9a5 -//.word 0xfe2aaff6 -//.word 0xccba4b79 -//.word 0x8121c925 -//.word 0x48a9da3a -//.word 0x732f7424 -//.word 0xca29c8a2 -//.word 0x22e87527 -//.word 0x321afb81 -//.word 0xa39272b8 -//.word 0x664c7c39 -//.word 0x4aab7833 -//.word 0xce06f842 -//.word 0x3363754b -//.word 0xd68242a7 -//.word 0xbd1ebf83 -//.word 0x706fcf86 -//.word 0x0af38cb5 -//.word 0x8f6e3994 -//.word 0x8030778e -//.word 0xad96bc97 -//.word 0x4bd30210 -//.word 0x46f0bceb -//.word 0xd9120e0f -//.word 0x5bfc3dfe -//.word 0x5cd465b5 -//.word 0xf02a6ad4 -//.word 0x4b3630fe -//.word 0x8e610f83 -//.word 0xe108813c -//.word 0xc27c1eb7 -//.word 0x9c4dcb94 -//.word 0x9cc82e2f -//.word 0xc0be6580 -//.word 0x3187f73f -//.word 0xd2470a4b -//.word 0x1970d74c -//.word 0x1e885c97 -//.word 0xf12d5053 -//.word 0x31565cda -//.word 0xdadb8862 -//.word 0x5f38f4dd -//.word 0xf98ec81e -//.word 0x3eea6d3c -//.word 0xf5cafe3b -//.word 0x29ddf9e9 -//.word 0x7c0b3b07 -//.word 0xbeb52ba9 -//.word 0xbe3e35e0 -//.word 0x60ca7a95 -//.word 0xf045c5b8 -//.word 0xb6a8c19b -//.word 0xcb776a98 -//.word 0x2b8ec2fa -//.word 0x0a1ec51b -//.word 0x6cf39ec9 -//.word 0xf0f81bee -//.word 0xecfc5f70 -//.word 0xbfb6d757 -//.word 0x63076f2e -//.word 0x428005ab -//.word 0x4b241d92 -//.word 0x446fd7d6 -//.word 0x62971f01 -//.word 0x171124d7 -//.word 0x2b570b36 -//.word 0x0ee9e441 -//.word 0x6d91ddbe -//.word 0x03ecb5bb -//.word 0xb2267478 -//.word 0xd2055a81 -//.word 0xc929151b -//.word 0xdb9237e1 -//.word 0x4462e6af -//.word 0x84e4d5bf -//.word 0xfbce7412 -//.word 0xb5c36412 -//.word 0x871c2e75 -//.word 0x5be83464 -//.word 0xc831e8dd -//.word 0xe6823b56 -//.word 0x60a559a3 -//.word 0xcab19319 -//.word 0x35459cf4 -//.word 0x010ef9f6 -//.word 0xf38fb351 -//.word 0x87214fc7 -//.word 0x8838ff10 -//.word 0xdde91a7c -//.word 0xa6a9cad9 -//.word 0x88580597 -//.word 0x447ebe2a -//.word 0x8fd45cb0 -//.word 0x1e066bd4 -//.word 0x00b791f2 -//.word 0x30c5c47c -//.word 0x6bcfbb9c -//.word 0x3ff5a21a -//.word 0x65df1281 -//.word 0x5001407d -//.word 0x061d7588 -//.word 0x2f09bec5 -//.word 0x6bb2e42c -//.word 0xe9619ee8 -//.word 0x363d06fd -//.word 0x52124a2e -//.word 0x0950a41e -//.word 0x80578cb5 -//.word 0x0ff12cc5 -//.word 0x4e2014ee -//.word 0x731b2fbf -//.word 0xdb93f51d -//.word 0xe63ae3e9 -//.word 0x088628dd -//.word 0x1db2a2b7 -//.word 0xfd07089a -//.word 0x515969b1 -//.word 0xa5d4d515 -//.word 0xbef95af1 -//.word 0x2de332e4 -//.word 0x24cf3aa6 -//.word 0x89dba6ef -//.word 0x490ef394 -//.word 0xef991ef3 -//.word 0x755c1492 -//.word 0x59ac6903 -//.word 0xf4544c0b -//.word 0x08d9bb03 -//.word 0x9803f37d -//.word 0xfc982b2b -//.word 0x346b81fd -//.word 0x7d95358a -//.word 0x220315b1 -//.word 0x95313880 -//.word 0xbe34ef54 -//.word 0x93fef942 -//.word 0xe9def6b6 -//.word 0x89461e5a -//.word 0x87d1333a -//.word 0xcf84b425 -//.word 0x01555456 -//.word 0x7fe9ab54 -//.word 0xc4a22a16 -//.word 0xf7d9546b -//.word 0xbf682b99 -//.word 0x5a6ce944 -//.word 0xe949f192 -//.word 0x0eee058d -//.word 0xb95ab9c9 -//.word 0x3f5e2846 -//.word 0xada5e597 -//.word 0x5bf33544 -//.word 0xc4aa7b6e -//.word 0x9492f3b1 -//.word 0x03d9a34f -//.word 0x62598f8a -//.word 0xf31a2d51 -//.word 0xfe18181f -//.word 0x21460821 -//.word 0xe8d20297 -//.word 0x9eabcc7c -//.word 0x6241a469 -//.word 0x7d8c31b7 -//.word 0xf24fbae4 -//.word 0x579e9637 -//.word 0xe49ee4a7 -//.word 0xca8c7cfa -//.word 0xc500252a -//.word 0xf573080c -//.word 0xeaff6433 -//.word 0xfe678413 -//.word 0xe757ee62 -//.word 0x8ceddec4 -//.word 0x1877f2a6 -//.word 0x4d7f276a -//.word 0x1c0504c5 -//.word 0x720b1566 -//.word 0x54579bd9 -//.word 0x2e7482aa -//.word 0x68fa93cd -//.word 0x3b0feb3d -//.word 0xc32eace4 -//.word 0x5527f2bb -//.word 0x12670932 -//.word 0xbc7addd2 -//.word 0xc9ceb121 -//.word 0xb6ba14c6 -//.word 0x9ebe11ed -//.word 0x0b0da7ed -//.word 0x0c487928 -//.word 0x888dc533 -//.word 0xd1b09a38 -//.word 0x7cc84698 -//.word 0x71ee0ed4 -//.word 0x3e4123ad -//.word 0xb12ed18a -//.word 0xa5eef81b -//.word 0x1c4fc03c -//.word 0x8eb8891c -//.word 0x8167219e -//.word 0x5afe3aff -//.word 0x733e1bba -//.word 0x6d1295a8 -//.word 0xc8cf396c -//.word 0xb0bac80e -//.word 0x1acbebe6 -//.word 0x10b024bc -//.word 0x4915052d -//.word 0xfd23a050 -//.word 0xf7463e9a -//.word 0xec3454ff -//.word 0x0b2bb25a -//.word 0xd579fe0f -//.word 0x2f4261ef -//.word 0xb67e805c -//.word 0x5241aead -//.word 0x0e3f5fd4 -//.word 0x278fe03d -//.word 0x62af46fa -//.word 0xa3c9a51e -//.word 0xbc348266 -//.word 0x833e8a1f -//.word 0x27298443 -//.word 0xc47384e6 -//.word 0x345b61d0 -//.word 0x29a06a6c -//.word 0x788c55e1 -//.word 0xb831787e -//.word 0x0cf33c5b -//.word 0x3d46ce3d -//.word 0x0cb917bb -//.word 0xc634ef9f -//.word 0x187d8d8f -//.word 0x250142ed -//.word 0xd6d268fb -//.word 0x71ec9543 -//.word 0x6ebc1436 -//.word 0x86e39513 -//.word 0x0c37230a -//.word 0x800a57a2 -//.word 0x62b0cb58 -//.word 0x443bd288 -//.word 0x23896691 -//.word 0xf7816235 -//.word 0x8999f23e -//.word 0x859b4767 -//.word 0xd0aa8f79 -//.word 0x1b8024b5 -//.word 0xb9f90372 -//.word 0xadd58107 -//.word 0x08b939eb -//.word 0x7278491b -//.word 0x0691bebc -//.word 0x63f94c02 -//.word 0xff1a4350 -//.word 0xbf1bbea1 -//.word 0xc5621d26 -//.word 0x8a57b630 -//.word 0x2c6bc851 -//.word 0x095ab0be -//.word 0x8cac60f8 -//.word 0x47820cac -//.word 0x428f26d7 -//.word 0x93658d2d -//.word 0x2ff202bc -//.word 0x004adbcd -//.word 0x38a7fb0b -//.word 0xe4ad01e7 -//.word 0xc4f3c03a -//.word 0x5ac0f02c -//.word 0x41122256 -//.word 0xc0e5fa23 -//.word 0x9fb1987c -//.word 0x393557a4 -//.word 0xd373ba60 -//.word 0x2cfca35c -//.word 0x556dc6ca -//.word 0xc33a5e4c -//.word 0xa3aa1e14 -//.word 0x6d236b49 -//.word 0xbca8c8ad -//.word 0x5da0927e -//.word 0xa6d9ed9a -//.word 0x09ccfee6 -//.word 0xe9235bef -//.word 0xab78bfd2 -//.word 0x1160035a -//.word 0xc3a84969 -//.word 0x2fde7b99 -//.word 0x9313f422 -//.word 0x58e07cff -//.word 0xa2a77a4c -//.word 0x251b65f3 -//.word 0x3a037c87 -//.word 0x323bb770 -//.word 0xeafbfd49 -//.word 0x9f5b9786 -//.word 0x0417e55a -//.word 0x92904fd8 -//.word 0x20147f58 -//.word 0xb35fcd1c -//.word 0x9762fb33 -//.word 0xaf43239e -//.word 0x09a4edb2 -//.word 0xb52805bd -//.word 0xd833cdec -//.word 0xfcf24f6c -//.word 0xaa9c75d0 -//.word 0x3bf77cb3 -//.word 0xeb1da69e -//.word 0x2f802f2c -//.word 0x492c836b -//.word 0x194cae86 -//.word 0x36f014a1 -//.word 0x3d0d6205 -//.word 0x69c5c47d -//.word 0x64e959ff -//.word 0x5dbde48f -//.word 0x5bfbc461 -//.word 0xd11a263e -//.word 0x72cf7928 -//.word 0x46d52241 -//.word 0xfeea71e9 -//.word 0x851ad427 -//.word 0xd73f4b4a -//.word 0x16c91cd0 -//.word 0xdbbbc886 -//.word 0xcaf63df1 -//.word 0x69ba4ded -//.word 0x326a5f94 -//.word 0xe68f6561 -//.word 0x25200e95 -//.word 0x3c013cda -//.word 0x3ec9b827 -//.word 0x56c825e3 -//.word 0x5b49324d -//.word 0xa514141b -//.word 0x1f373461 -//.word 0x9e0624b5 -//.word 0x7161d891 -//.word 0x3a3513f9 -//.word 0xfc451f5d -//.word 0x742bc1c0 -//.word 0xad996c1a -//.word 0xcfe5b5fb -//.word 0x37c50772 -//.word 0xcd57982d -//.word 0x92649be1 -//.word 0x79e5b8ed -//.word 0x78c6b93a -//.word 0xdeeb8665 -//.word 0xe7715320 -//.word 0x8e3618d5 -//.word 0xa29b418d -//.word 0x1c88a711 -//.word 0xb0b1c04e -//.word 0xa21812fe -//.word 0xdbd3ee85 -//.word 0x3c105a19 -//.word 0x32564f26 -//.word 0x8b0e25f1 -//.word 0x88414b7b -//.word 0x33a33ba8 -//.word 0xf2d1ada0 -//.word 0x5dd70b76 -//.word 0x4df52608 -//.word 0x35a32726 -//.word 0xb6d2c8f6 -//.word 0x6d75c496 -//.word 0x10408b04 -//.word 0xb9af3b3b -//.word 0x814bcc9f -//.word 0x51298a9b -//.word 0xf5b3c989 -//.word 0x72aad4d2 -//.word 0x9a6c2656 -//.word 0xdd73dd0e -//.word 0x621f6bef -//.word 0x57b58f12 -//.word 0x85a78413 -//.word 0x271678b7 -//.word 0xfc953fd1 -//.word 0x9b304966 -//.word 0x07add10f -//.word 0x8311589f -//.word 0xa7665206 -//.word 0xb4bc1f75 -//.word 0x256e3cc3 -//.word 0x86a6bb10 -//.word 0x8923f0a8 -//.word 0x573a6e29 -//.word 0x241b32e9 -//.word 0x06561d92 -//.word 0x079ea80f -//.word 0x79ccd3ac -//.word 0x89275e78 -//.word 0x17e23cee -//.word 0xc5e645d5 -//.word 0x4ed22b65 -//.word 0x1a40afab -//.word 0x0f4b142f -//.word 0xa94ed4d3 -//.word 0x4ded93fe -//.word 0xda5a51fa -//.word 0x82d1e39b -//.word 0xd865a422 -//.word 0x29ff6860 -//.word 0x10a4b11f -//.word 0x45f626bd -//.word 0xb6fe401a -//.word 0xd92847b5 -//.word 0x408f7d11 -//.word 0x6e7b995e -//.word 0xe9287655 -//.word 0x90ca0d64 -//.word 0x2fcda10b -//.word 0x51613986 -//.word 0x553653ac -//.word 0xc484d717 -//.word 0xe24f4a85 -//.word 0x83e9447e -//.word 0x20b82437 -//.word 0x2a3902b7 -//.word 0x9e45e538 -//.word 0xda9436d0 -//.word 0xaf7f7550 -//.word 0xb70a2b6d -//.word 0xe921201d -//.word 0x6a22cd44 -//.word 0xa69c1490 -//.word 0xa0572fa1 -//.word 0x8694e76e -//.word 0x899506e4 -//.word 0xec600ed0 -//.word 0x5ac12bfe -//.word 0x7c8e67a2 -//.word 0xcb2e1df8 -//.word 0xa35cb028 -//.word 0x99297c6c -//.word 0x0f400d74 -//.word 0x066e8f0a -//.word 0x336286f2 -//.word 0x54b1c014 -//.word 0xc41d87dd -//.word 0x4d161be2 -//.word 0x3e815fc6 -//.word 0xbeb9d25e -//.word 0x60d3c114 -//.word 0xf827bb89 -//.word 0xac0b467f -//.word 0x4ee2d0f5 -//.word 0xe956e893 -//.word 0x99e1ae49 -//.word 0xa0928834 -//.word 0xb70e17c1 -//.word 0xa2d56a14 -//.word 0x07c671ab -//.word 0x80e6b43e -//.word 0xef5d44ea -//.word 0x12c1f28f -//.word 0x5797c077 -//.word 0xf1179538 -//.word 0x2b3035db -//.word 0xfccc6f3d -//.word 0xdc5599b6 -//.word 0xd77839f9 -//.word 0xe029053b -//.word 0x67e70e98 -//.word 0x2e4138b2 -//.word 0x5899ed9b -//.word 0xc32812f5 -//.word 0x97423a57 -//.word 0x1fdb1af3 -//.word 0xd84b3e76 -//.word 0xc84efa30 -//.word 0x114fa275 -//.word 0xc6e6fd43 -//.word 0xfd9ff824 -//.word 0x26fd9856 -//.word 0x9bbe322a -//.word 0x7861deaa -//.word 0xace6297e -//.word 0x50d50a11 -//.word 0x388118ef -//.word 0xc88ef972 -//.word 0x09b11e9d -//.word 0xfcb7ad48 -//.word 0x2fc9bf7d -//.word 0x8deecc23 -//.word 0x7ad163d9 -//.word 0x20c51f25 -//.word 0x0306d6ce -//.word 0xdc411386 -//.word 0xa457c7cc -//.word 0xef5f3b11 -//.word 0x7bea491a -//.word 0x098acca5 -//.word 0x6b95554f -//.word 0xdf2620b5 -//.word 0x9b6546da -//.word 0xa90833c9 -//.word 0xf51a5b7b -//.word 0xa5fb29fa -//.word 0xa8a938c7 -//.word 0x923dc679 -//.word 0xa7b966a8 -//.word 0x3500f409 -//.word 0x2826ceda -//.word 0xd8ea4181 -//.word 0x25814270 -//.word 0xc6965f4b -//.word 0xde8ef54d -//.word 0xd010a2e8 -//.word 0x55c5fdab -//.word 0xcc5c8569 -//.word 0xd1d2d898 -//.word 0x10f026f7 -//.word 0x5b15e474 -//.word 0xfb35c54c -//.word 0x4422e674 -//.word 0x6d0a4838 -//.word 0x9e418422 -//.word 0x4941ba1d -//.word 0xbef0cbda -//.word 0xfa21c873 -//.word 0xc05caa4e -//.word 0xece24345 -//.word 0x03ec7403 -//.word 0x0e34a1b1 -//.word 0xa9b662d3 -//.word 0x57b87b6c -//.word 0x18080f69 -//.word 0x3e85103c -//.word 0x7ce0fac8 -//.word 0x40a4c17d -//.word 0x427407c4 -//.word 0x5d94939d -//.word 0x9facff86 -//.word 0x9cc8b0a0 -//.word 0x07a20c0d -//.word 0x8324e69c -//.word 0xb6293da8 -//.word 0x9f84273d -//.word 0x2a43087d -//.word 0x02350742 -//.word 0xa7a9c305 -//.word 0xc07941ff -//.word 0xb2472a8d -//.word 0x710733d9 -//.word 0x97bddcb7 -//.word 0xb3885dcd -//.word 0xe3e0ddf7 -//.word 0xa51ce6ea -//.word 0xea371617 -//.word 0x6cd317d2 -//.word 0x427ed1b3 -//.word 0xb135dd3c -//.word 0x46263dbd -//.word 0x21ba4b75 -//.word 0x94d3f0fa -//.word 0xed5316db -//.word 0x8fdd6083 -//.word 0x48df1860 -//.word 0xded06945 -//.word 0xebb6ce0d -//.word 0xebecca82 -//.word 0x9422da7d -//.word 0x66a5a84e -//.word 0x82e1815d -//.word 0xbf240912 -//.word 0xfba42df3 -//.word 0xafc45a0c -//.word 0xc693ec94 -//.word 0xb095eacd -//.word 0xb2c7f02c -//.word 0x80dd6cba -//.word 0x0dce0dba -//.word 0xa292798c -//.word 0x2e2a3fd1 -//.word 0xdde20cd0 -//.word 0xebd32119 -//.word 0xbbab0467 -//.word 0x23b176cb -//.word 0x0a03a607 -//.word 0x3622a438 -//.word 0x5fb118b9 -//.word 0x887a3443 -//.word 0x8fb2e759 -//.word 0x027e54e3 -//.word 0x34b68219 -//.word 0x90e855a2 -//.word 0x2ea0bdfd -//.word 0xa4e62d21 -//.word 0x1f094f60 -//.word 0xb29bf691 -//.word 0xedbd546e -//.word 0xb29d6d3b -//.word 0x443ccba9 -//.word 0xa17573f9 -//.word 0x123b1964 -//.word 0x002290bb -//.word 0x0920844b -//.word 0x53956b03 -//.word 0x208ab9d9 -//.word 0xa3365369 -//.word 0x13c747df -//.word 0xfd5fba18 -//.word 0xde5c2204 -//.word 0xf1dcb54f -//.word 0x46802040 -//.word 0x14717de1 -//.word 0x50a17f60 -//.word 0x7e54f0b5 -//.word 0xc8de5e85 -//.word 0x4dae1146 -//.word 0xbb8b40a5 -//.word 0x201e8424 -//.word 0xfdb18c08 -//.word 0x9d361372 -//.word 0xa48b0fcc -//.word 0xebfc2b66 -//.word 0x8b0a7861 -//.word 0x386a5fcd -//.word 0xd151db0e -//.word 0x34efe584 -//.word 0x57392f6b -//.word 0x95ec14ff -//.word 0x45cfcfe4 -//.word 0x9138ecc6 -//.word 0x86d1fd3d -//.word 0x679c8ef3 -//.word 0x47355b08 -//.word 0xd658c0b5 -//.word 0x7ca27030 -//.word 0xa49c6ad0 -//.word 0x5bf52972 -//.word 0x190f1b1b -//.word 0xdebe55df -//.word 0x814c8501 -//.word 0x45c0285b -//.word 0xae5ffd00 -//.word 0x9374b921 -//.word 0x734dfc2d -//.word 0x0d86843c -//.word 0x2a8aa1ae -//.word 0xbe56e80f -//.word 0x2f802c3e -//.word 0xf578aacf -//.word 0x630f84ad -//.word 0xc4357104 -//.word 0xaa07b25e -//.word 0x8309480c -//.word 0x6daf64c7 -//.word 0x4c231f97 -//.word 0x19426bf4 -//.word 0x7de7492b -//.word 0x9e6d3d04 -//.word 0x396fffa2 -//.word 0xf1d274aa -//.word 0xe606dca8 -//.word 0x8a884dae -//.word 0xb0ac603e -//.word 0xe6992a69 -//.word 0x05956e39 -//.word 0x0683104d -//.word 0x17a9cdc3 -//.word 0xeeb72a5b -//.word 0x5e05aad8 -//.word 0x281d44aa -//.word 0x137914cb -//.word 0x3f8e51e7 -//.word 0xb6097fbf -//.word 0x4458e6cf -//.word 0x896c422e -//.word 0x4cbdbcb7 -//.word 0x128f1966 -//.word 0xef743204 -//.word 0x9d13a407 -//.word 0xcb27c8b4 -//.word 0xb7cbe686 -//.word 0xfff4a5d3 -//.word 0xb53fc6ad -//.word 0xb1ed1207 -//.word 0x2b2b9118 -//.word 0x8997fd05 -//.word 0x750176ba -//.word 0x336e7718 -//.word 0x31630956 -//.word 0xe06037a1 -//.word 0xc3aac106 -//.word 0xc64d1592 -//.word 0xd0627ab8 -//.word 0x9b8e8ff2 -//.word 0xc4cbf4ab -//.word 0x1e6b475d -//.word 0x4c5a52f7 -//.word 0x8fa38281 -//.word 0xdc359b02 -//.word 0x32e8aba2 -//.word 0x2abb3d0c -//.word 0xd05fce16 -//.word 0xb1fa85a4 -//.word 0x35251ec9 -//.word 0x2f362830 -//.word 0xb3c570bb -//.word 0x2869bd69 -//.word 0x9dc3bd7d -//.word 0x61be40dd -//.word 0xcd14a4b8 -//.word 0x6515906b -//.word 0x20a4e6a6 -//.word 0x0382f2ca -//.word 0xf4cfe896 -//.word 0xcecd8d03 -//.word 0xb1e8346c -//.word 0x9cf3ecf2 -//.word 0x3db5f81f -//.word 0x07a47fca -//.word 0x86f0853a -//.word 0xefc31a8e -//.word 0xfcc8d15b -//.word 0xf6ea7498 -//.word 0x135ef6b7 -//.word 0x03e3a915 -//.word 0xc648b194 -//.word 0xc02fb986 -//.word 0x0f12e5ce -//.word 0x1c830741 -//.word 0x70b81553 -//.word 0xca46dbef -//.word 0x6e2deda6 -//.word 0xbf15e00c -//.word 0x10d7b95f -//.word 0xb83fa66a -//.word 0x6411eca9 -//.word 0xb24921ae -//.word 0xfba79bc3 -//.word 0x6f6b28d1 -//.word 0x685eff81 -//.word 0xf811f7a0 -//.word 0xc469f7c8 -//.word 0x165bae3d -//.word 0x2df58415 -//.word 0xd89ed09c -//.word 0x439e4bf6 -//.word 0x10e1c506 -//.word 0xa9f7168f -//.word 0xd5605899 -//.word 0x8a075317 -//.word 0x030c39c6 -//.word 0x11c69458 -//.word 0xb6097cd2 -//.word 0xf0a40d33 -//.word 0xd32e1856 -//.word 0xda031919 -//.word 0x7f8969bf -//.word 0x09b8b593 -//.word 0xa6d9afce -//.word 0xb98d03bb -//.word 0x75128d19 -//.word 0xabc2c9c1 -//.word 0xe0dc8b89 -//.word 0xa387f067 -//.word 0x1e1494da -//.word 0xea840585 -//.word 0x284a781d -//.word 0xcd52bb86 -//.word 0x3d416b39 -//.word 0x1cff67e9 -//.word 0x60738466 -//.word 0xab8d83c1 -//.word 0xd98a40b1 -//.word 0xd4732b35 -//.word 0xb0e7fc7b -//.word 0xf41ba301 -//.word 0x351f7efa -//.word 0xea63cff3 -//.word 0x7b796db6 -//.word 0x9b1cba6f -//.word 0xd872d40d -//.word 0x708e10eb -//.word 0x6739a4b0 -//.word 0xd6f2a374 -//.word 0x86332f24 -//.word 0xbdf6ea27 -//.word 0x5878ad41 -//.word 0x1a3d7db8 -//.word 0x4454bab6 -//.word 0x66dc9aef -//.word 0x74c7d683 -//.word 0x1cdea326 -//.word 0x5705e47e -//.word 0x3fc19ecc -//.word 0x20f7accf -//.word 0xd1f7b4e6 -//.word 0x45b85974 -//.word 0x5d65b288 -//.word 0x0019fbbe -//.word 0x6ee88b60 -//.word 0xd11e06d1 -//.word 0x16cbd42c -//.word 0xfa7fd228 -//.word 0x6852473f -//.word 0x0227190f -//.word 0xfe324100 -//.word 0x33b87c27 -//.word 0x7316436a -//.word 0x1c05fee5 -//.word 0xea1c758d -//.word 0x0f978713 -//.word 0x86561e0c -//.word 0xa429624e -//.word 0xf04a2d9d -//.word 0x342bbf87 -//.word 0xd472b48c -//.word 0x5f423382 -//.word 0x64bd6738 -//.word 0x87c7335a -//.word 0xd30c2194 -//.word 0x52449cfa -//.word 0xdbb660a8 -//.word 0x2cfa2ea5 -//.word 0x3904c40e -//.word 0xc35e0c70 -//.word 0x2bb59475 -//.word 0x89973ec3 -//.word 0xf97b3921 -//.word 0x35022fdb -//.word 0x697cc068 -//.word 0x42ae304b -//.word 0x48d35c37 -//.word 0x6fe0f376 -//.word 0xe80ce28c -//.word 0x3d901017 -//.word 0x9dab4cf9 -//.word 0x75ea84b9 -//.word 0x40a63727 -//.word 0x9fce2c3f -//.word 0xace76550 -//.word 0x8b504f5e -//.word 0x43cb3bc4 -//.word 0xcc39111d -//.word 0x6aa54365 -//.word 0x3984015c -//.word 0x083bac2b -//.word 0x6ae28c4a -//.word 0x0b48c5a1 -//.word 0x413787ee -//.word 0xe3f98666 -//.word 0x5e1aaa9f -//.word 0x057007ad -//.word 0xa9590f8c -//.word 0x6a4406be -//.word 0xcc73b734 -//.word 0x0eff6672 -//.word 0xb71c05ef -//.word 0x719eabba -//.word 0x1abc4163 -//.word 0x19147f19 -//.word 0xeef01710 -//.word 0x0dc82f26 -//.word 0xed0815c5 -//.word 0x5c122e0b -//.word 0x15873028 -//.word 0x94c39108 -//.word 0x29a64033 -//.word 0x4c9a92f1 -//.word 0x30d17fb1 -//.word 0x9bcf0eab -//.word 0xf4290ec5 -//.word 0x9e8c07b3 -//.word 0x84007063 -//.word 0xf56e2298 -//.word 0xb3600dd5 -//.word 0x46092a7c -//.word 0x9685b037 -//.word 0xb9628b97 -//.word 0x0a5e0afb -//.word 0x7b72d8b4 -//.word 0x2c102d66 -//.word 0x3caa45b1 -//.word 0xdf731211 -//.word 0xb0692e03 -//.word 0x4993136a -//.word 0x11878e30 -//.word 0x56307130 -//.word 0x9cce8954 -//.word 0x343ecffa -//.word 0x107ce29d -//.word 0xd566b5b1 -//.word 0x32c385ce -//.word 0x71830f11 -//.word 0x4b48ffc0 -//.word 0x0126ab2c -//.word 0xa8a701dc -//.word 0xc413bee7 -//.word 0x19eee2a2 -//.word 0xbec1607b -//.word 0x731e1925 -//.word 0x34de0bf6 -//.word 0x0fadc68d -//.word 0x32c920b7 -//.word 0x48062a94 -//.word 0x061663f5 -//.word 0x00072b09 -//.word 0xc20d7a39 -//.word 0x1c82d150 -//.word 0xbd2b71df -//.word 0x03bdcce0 -//.word 0x129f3999 -//.word 0x24f2ebc3 -//.word 0x20cf24ec -//.word 0x6dcfa61a -//.word 0x08d16bb1 -//.word 0xd4f79596 -//.word 0x32f2a895 -//.word 0xd280f700 -//.word 0xc9325c99 -//.word 0xe3732cb2 -//.word 0x3ac66a93 -//.word 0x074f3b1c -//.word 0xb9959aac -//.word 0x44864d41 -//.word 0xbcbc18e0 -//.word 0x22fe3037 -//.word 0x7e0af281 -//.word 0x2d91d5aa -//.word 0x7d849eb3 -//.word 0x778ed359 -//.word 0xfce271f1 -//.word 0x1436e197 -//.word 0x820f2987 -//.word 0x9c4060cb -//.word 0x59ad6417 -//.word 0xac55cff1 -//.word 0x10902614 -//.word 0x64945417 -//.word 0xfa3e574a -//.word 0xeb103ae1 -//.word 0xad764354 -//.word 0xe74d6d05 -//.word 0x83a51824 -//.word 0x05c600cf -//.word 0x1c726c7e -//.word 0x776aa89f -//.word 0xda34b47d -//.word 0x711a3e66 -//.word 0x6476ce0d -//.word 0xab2d412d -//.word 0x247a786f -//.word 0xe3ed518e -//.word 0xc9b3d6b9 -//.word 0x5817b539 -//.word 0xc549f153 -//.word 0x4f5ed670 -//.word 0xd099327b -//.word 0x92e9c28b -//.word 0x63b2ebc2 -//.word 0xecd0aa75 -//.word 0x3edace8c -//.word 0xaea3652c -//.word 0xe3077494 -//.word 0x2de4eb45 -//.word 0x1866d766 -//.word 0x4288da66 -//.word 0x69d7d8e3 -//.word 0xc879f4cb -//.word 0xa46fbbc1 -//.word 0x22179ec2 -//.word 0x5bf5a608 -//.word 0xb2b2632e -//.word 0x66652696 -//.word 0x63127008 -//.word 0x5e70a99b -//.word 0x20f015d9 -//.word 0x22fa051e -//.word 0x5b7a4a41 -//.word 0x569bef76 -//.word 0x87d22873 -//.word 0xdf1f85d2 -//.word 0x9e906bb7 -//.word 0x6906c5b2 -//.word 0x9c3bf7e7 -//.word 0xe104136c -//.word 0x02d450f2 -//.word 0xfb82b8a8 -//.word 0x544c205c -//.word 0xad1b5de3 -//.word 0x9b09b5bc -//.word 0xb22094f0 -//.word 0xe364803c -//.word 0x09144f72 -//.word 0xbe2e981d -//.word 0x73316764 -//.word 0xc0263531 -//.word 0xf8e11792 -//.word 0x0185355f -//.word 0x62467e1d -//.word 0x9e739a22 -//.word 0xc1b320fa -//.word 0x388f0a0a -//.word 0xe5306673 -//.word 0x736a4e39 -//.word 0xe7fa19a5 -//.word 0x780cd3e7 -//.word 0xa101eb00 -//.word 0x746e2cdf -//.word 0x3168eeca -//.word 0x17ff8e00 -//.word 0x7a081b9d -//.word 0x162052bd -//.word 0xa3edcde4 -//.word 0xaaa7779e -//.word 0x96d74362 -//.word 0x0e5f1ebc -//.word 0x82bb22ac -//.word 0x04860c49 -//.word 0x5a40f0a9 -//.word 0x514e2b05 -//.word 0x54429a19 -//.word 0x3c5d09ca -//.word 0x6a52ee0b -//.word 0x134d5801 -//.word 0xdc342265 -//.word 0xa72d6c2b -//.word 0xac604b61 -//.word 0xcbfec059 -//.word 0x2082e70a -//.word 0xd93771b4 -//.word 0x44fa54c3 -//.word 0x2c41c1f6 -//.word 0x665c57c0 -//.word 0xa7fb96ef -//.word 0x99f1968b -//.word 0x2d37f901 -//.word 0x32341e80 -//.word 0x273b97a4 -//.word 0x4d56de52 -//.word 0x014243e3 -//.word 0x49ba2984 -//.word 0xadf972dc -//.word 0x487a38f0 -//.word 0x1e02be44 -//.word 0xb0e0a643 -//.word 0xce7364e1 -//.word 0xadeef27f -//.word 0x3958c50f -//.word 0xacd70178 -//.word 0x602de93c -//.word 0xe1839958 -//.word 0x4766f76c -//.word 0xc30fe71b -//.word 0x77e7beb5 -//.word 0x8b4afa13 -//.word 0x7d8b30c3 -//.word 0xb8394566 -//.word 0x69a1e155 -//.word 0x8e94218b -//.word 0x4f6b8cbf -//.word 0x924749d0 -//.word 0xca9e8f66 -//.word 0x0ff35cd7 -//.word 0x74e46a47 -//.word 0x956a5f14 -//.word 0x6f5d4371 -//.word 0x75363850 -//.word 0xe0196586 -//.word 0x46133429 -//.word 0x6ea0bd3d -//.word 0x63708290 -//.word 0xc76a5ce3 -//.word 0x6af2b54a -//.word 0x1b67f8d6 -//.word 0xbef04670 -//.word 0x9f796b08 -//.word 0x06f810f0 -//.word 0x0cf53182 -//.word 0xac49d209 -//.word 0x1d26eedf -//.word 0x5f57b1d2 -//.word 0x15c9e7cc -//.word 0x924bb3b4 -//.word 0x3692848f -//.word 0xfb8045eb -//.word 0x4ba6d47d -//.word 0x1507b609 -//.word 0x1f1e0982 -//.word 0x9e23b973 -//.word 0x048bf79d -//.word 0x19cee7e1 -//.word 0x4d6c9961 -//.word 0x4c323be3 -//.word 0xd4b98d76 -//.word 0xc3319557 -//.word 0x755c9315 -//.word 0x4cdd37f4 -//.word 0x90b3128f -//.word 0x7a014bc2 -//.word 0x8b1093c7 -//.word 0x22965a9f -//.word 0x4e3943b4 -//.word 0xe14fd6bc -//.word 0xc6e876e0 -//.word 0x940e921e -//.word 0x624b1fec -//.word 0xde6c451e -//.word 0x99855809 -//.word 0xa5350be9 -//.word 0x622be080 -//.word 0x95e9e300 -//.word 0xbac8982b -//.word 0x9c3d32b9 -//.word 0x225a05fa -//.word 0x6c983ebc -//.word 0x1ed3d26f -//.word 0xfc96b487 -//.word 0xb8994b22 -//.word 0x078823eb -//.word 0xfa06e33e -//.word 0x8cf27f8d -//.word 0x78e9ae02 -//.word 0x4d0c9f65 -//.word 0xc303e741 -//.word 0x5042bf42 -//.word 0xf78a6ce2 -//.word 0x61b3fe44 -//.word 0x2eaa3d60 -//.word 0x8db6e161 -//.word 0x0aff014b -//.word 0xa850cee1 -//.word 0x301c81c6 -//.word 0xc8bf92e2 -//.word 0xc7072b07 -//.word 0xc8f3dcd5 -//.word 0xfeba90db -//.word 0xc70fc0fe -//.word 0x83a4e61f -//.word 0xa6ed35f8 -//.word 0x0c268747 -//.word 0x8d97972f -//.word 0xd21770db -//.word 0x66cf2564 -//.word 0x1040c3f5 -//.word 0x6188842d -//.word 0x89e045c4 -//.word 0x6f6a3a72 -//.word 0x002ae10c -//.word 0xc65134f1 -//.word 0xbdc223a4 -//.word 0x63cf41ba -//.word 0x0f43bef7 -//.word 0x83a695b4 -//.word 0xc4bc0683 -//.word 0x2a4f4716 -//.word 0xb32e775d -//.word 0x9c76d3ef -//.word 0x33102cab -//.word 0xe77b999f -//.word 0xa1cc6929 -//.word 0x57f35b5b -//.word 0xde3f12a4 -//.word 0xff25c3ad -//.word 0xce3d3182 -//.word 0x378ddbf2 -//.word 0xda0a7338 -//.word 0x195c93db -//.word 0x6ee2acd2 -//.word 0x02f63fec -//.word 0x7c724f6f -//.word 0x177216ff -//.word 0xf85cf7c2 -//.word 0xbe1eb4c2 -//.word 0x5ab7e193 -//.word 0x21f99835 -//.word 0x1f8d6f3b -//.word 0xaf37a72d -//.word 0x495ba62c -//.word 0x9ac1a7d4 -//.word 0xda95b167 -//.word 0x5ab2c527 -//.word 0x5c205c03 -//.word 0x28da1176 -//.word 0x5cd59aad -//.word 0x843ffce8 -//.word 0xea04ff22 -//.word 0xb097e0f4 -//.word 0x1bef47b7 -//.word 0x32d078e9 -//.word 0x884bcdd1 -//.word 0x56886466 -//.word 0xccc3156e -//.word 0xa995a7e3 -//.word 0x0a75439a -//.word 0x7f7e2827 -//.word 0x6473a1fb -//.word 0x6f0034cf -//.word 0x85421d46 -//.word 0xd28afbcd -//.word 0x185ec8c6 -//.word 0x47c10ee7 -//.word 0x4fb558dc -//.word 0x32fde734 -//.word 0x5d27a77a -//.word 0x38ca62a2 -//.word 0xfc0d32a8 -//.word 0xc5683c73 -//.word 0xe8af9bff -//.word 0x864c9bbb -//.word 0x61cb2830 -//.word 0xef9d86e4 -//.word 0xad15427e -//.word 0xb6b7682a -//.word 0x94b2f63f -//.word 0x56ab9120 -//.word 0xe2bc7760 -//.word 0x8dbdb529 -//.word 0xe9c29ade -//.word 0xdee46bff -//.word 0xfd45584d -//.word 0x104eaf2f -//.word 0xf63b5055 -//.word 0xaeda619b -//.word 0xb18f4230 -//.word 0x859cc3f7 -//.word 0x8f9f952d -//.word 0x295cff4d -//.word 0xf4bdd230 -//.word 0x6f179f79 -//.word 0xc9af2730 -//.word 0xf47d13ad -//.word 0xfb30e6b8 -//.word 0x95722fee -//.word 0xfa6c0367 -//.word 0xf58daa95 -//.word 0x3b87996f -//.word 0xfb9ba0cf -//.word 0xb6176519 -//.word 0x511d111e -//.word 0x69a54940 -//.word 0xe6c560d6 -//.word 0xd331cbd2 -//.word 0x6dfed5a1 -//.word 0x79ab9452 -//.word 0xdb611bfb -//.word 0x657af158 -//.word 0xed41c2b6 -//.word 0xa2f8550f -//.word 0xa020be77 -//.word 0xc1f4d5b6 -//.word 0xb637e637 -//.word 0x572faa21 -//.word 0x38f276c3 -//.word 0x7de0b335 -//.word 0xef718e3c -//.word 0x4f31f06f -//.word 0xea08b198 -//.word 0x6dbf095d -//.word 0xfbc04720 -//.word 0x7d1dc523 -//.word 0x39d41bf0 -//.word 0xa75293f8 -//.word 0x7f35dd7a -//.word 0x175604a6 -//.word 0xec07a103 -//.word 0x7e994f0e -//.word 0x62225e24 -//.word 0x927ccca1 -//.word 0x0791704a -//.word 0x8ad679e8 -//.word 0xc7161736 -//.word 0xa37178fd -//.word 0xcfa4f67e -//.word 0x9d8b8f10 -//.word 0x13e4950a -//.word 0x3f55a6e3 -//.word 0xc9b1df98 -//.word 0xcf774d4e -//.word 0xec9ba439 -//.word 0x9a8934bc -//.word 0xbb6818d2 -//.word 0x729bb1ac -//.word 0x378e539c -//.word 0x2baf3d31 -//.word 0xa8bacfa4 -//.word 0x1d3af772 -//.word 0x194ded4b -//.word 0xa5a7202b -//.word 0xd7d970c7 -//.word 0xa4d39d2a -//.word 0xf6a8ffa0 -//.word 0xfe9278d3 -//.word 0xcc36a834 -//.word 0x1d295f9c -//.word 0x74b25833 -//.word 0x6cd22492 -//.word 0x4c816424 -//.word 0xdc3b3bd2 -//.word 0x77bb03df -//.word 0x62073f10 -//.word 0x5cacd111 -//.word 0x764b6e14 -//.word 0x25544ebb -//.word 0x96122838 -//.word 0x41e85db3 -//.word 0xc1da74eb -//.word 0xe34ec621 -//.word 0xfd147a32 -//.word 0x81a5b403 -//.word 0xd1a80a21 -//.word 0x55bb38a9 -//.word 0xcc6f1466 -//.word 0xdf94c43a -//.word 0xfcb82ebf -//.word 0x61eab02d -//.word 0x77c4117f -//.word 0x62a8b8d1 -//.word 0xd6491c0d -//.word 0x2c6d7cc6 -//.word 0xb5f2d064 -//.word 0x4e0fff82 -//.word 0x34dd5294 -//.word 0x1a1629cd -//.word 0x791ced40 -//.word 0x283d4545 -//.word 0x2c358d1e -//.word 0xd1f484da -//.word 0xfaa2447a -//.word 0xb5e17853 -//.word 0x1252c9b3 -//.word 0x365a99c7 -//.word 0xab26f4bc -//.word 0xfaecc325 -//.word 0x7c74439d -//.word 0x6dd8b6ad -//.word 0x428859f0 -//.word 0x3c909574 -//.word 0x3e1e7964 -//.word 0xdc3e68e4 -//.word 0xb4e90f3d -//.word 0x013e9a3a -//.word 0x6d0f28d2 -//.word 0x279f7c06 -//.word 0x36aaf50d -//.word 0x0da6c0af -//.word 0x5f494cef -//.word 0x344bfeec -//.word 0x3d6d2709 -//.word 0x64ba334c -//.word 0xa80d2304 -//.word 0x28d33daf -//.word 0x7d12011a -//.word 0x4dab60ca -//.word 0x1ddc299b -//.word 0x6708c4a7 -//.word 0xedbb2269 -//.word 0x4ce9f423 -//.word 0xd4761b7c -//.word 0x97fb606e -//.word 0xc0c8665f -//.word 0x2725dc8e -//.word 0x22def7b1 -//.word 0x9dfe20dd -//.word 0x6ddaeaa5 -//.word 0xe1514686 -//.word 0x9a53fa83 -//.word 0x9da04f0c -//.word 0xa7d20a24 -//.word 0xc19e9ec3 -//.word 0x1357a079 -//.word 0xfdb37b55 -//.word 0x64d26505 -//.word 0x4a7c923e -//.word 0xa2aba75f -//.word 0x62497151 -//.word 0xd93ad7b1 -//.word 0x439d0d31 -//.word 0x9b4f0b3b -//.word 0xb0b13ed8 -//.word 0x7bac7dd1 -//.word 0xb0f23e14 -//.word 0x93860a58 -//.word 0x0d7e2e04 -//.word 0xff08b44d -//.word 0xd6ab919f -//.word 0x60cf203f -//.word 0xde80cf2e -//.word 0x5a6f1950 -//.word 0x3a39b4cd -//.word 0x16ec0bb8 -//.word 0xc7c8eeef -//.word 0xc0428842 -//.word 0xa24f92d7 -//.word 0x0adec7cc -//.word 0xada6981f -//.word 0xa82320cb -//.word 0x11db5a34 -//.word 0xd2e692c5 -//.word 0xb7ad19d8 -//.word 0xc5f23dd6 -//.word 0xce11789f -//.word 0x4285e82c -//.word 0x48adff73 -//.word 0x0dd07c8a -//.word 0x5c609a10 -//.word 0x707b87c9 -//.word 0x06b71788 -//.word 0xb61fba52 -//.word 0x8279acc0 -//.word 0xb0cb6ba5 -//.word 0xd51d6ef1 -//.word 0x337f14d5 -//.word 0x444edb28 -//.word 0x97b4d20a -//.word 0xdb6e51c7 -//.word 0x3ad2e7fe -//.word 0xe8109402 -//.word 0xfbb83880 -//.word 0x7d7c4c62 -//.word 0xbf38d0f4 -//.word 0xf12f8445 -//.word 0xf0975bd1 -//.word 0x5f592d5c -//.word 0xf912ac21 -//.word 0x255d992c -//.word 0xcb543805 -//.word 0x6754018e -//.word 0x5c01982e -//.word 0x8a8aff2f -//.word 0x222f0b65 -//.word 0xb9001411 -//.word 0x9ce7f104 -//.word 0x64e82308 -//.word 0xcaa8517b -//.word 0xbc2cf53d -//.word 0xb0e454cd -//.word 0x38e8b3ae -//.word 0xd681c810 -//.word 0x12eb6fac -//.word 0xcb599ef0 -//.word 0xcb3a9b5c -//.word 0x9ebb6c2c -//.word 0xa38d9037 -//.word 0x63e8ec17 -//.word 0x22d0088a -//.word 0xb4977b18 -//.word 0x92a3a4f6 -//.word 0x2d719b2b -//.word 0x82da67f1 -//.word 0xef95725e -//.word 0x45fe3a43 -//.word 0x1e154855 -//.word 0x71ca668a -//.word 0x63780dc6 -//.word 0x60af1db7 -//.word 0x6b36d0fd -//.word 0xb250f18f -//.word 0x663f495a -//.word 0xc9075b2b -//.word 0x897451ce -//.word 0x4c5e3578 -//.word 0x8c2c6462 -//.word 0xa59740b7 -//.word 0x2cb126b0 -//.word 0x8325a0fd -//.word 0xaac0db68 -//.word 0x58305bb5 -//.word 0x4b0cedcc -//.word 0xdc15dd1a -//.word 0xd6bc6a34 -//.word 0x88e477bd -//.word 0x19e8838b -//.word 0x1ce0db05 -//.word 0x64200ecf -//.word 0x1a02a2aa -//.word 0x0ce60595 -//.word 0x4876c638 -//.word 0xea2f0583 -//.word 0x321d2993 -//.word 0xdae5d1d5 -//.word 0xa6090c6d -//.word 0x3c68ccd9 -//.word 0x360498d1 -//.word 0x76088272 -//.word 0xb90a599c -//.word 0x6f8d1f99 -//.word 0xcbcabdff -//.word 0x16b0f6d7 -//.word 0x48299afe -//.word 0xd99ffccc -//.word 0xd5bfa5f4 -//.word 0x2f7c4aab -//.word 0x5757fc0d -//.word 0x0ede9fbc -//.word 0x7a739dca -//.word 0x754fdcd9 -//.word 0x2bc7ed80 -//.word 0xe4cd86f1 -//.word 0x1eb932d9 -//.word 0xdf4a4788 -//.word 0x49e71852 -//.word 0x6f2b6d35 -//.word 0x67a130bc -//.word 0xa1cc6922 -//.word 0x766b6dbb -//.word 0x04fa5190 -//.word 0x3a7ca549 -//.word 0x2f785f51 -//.word 0xb8421634 -//.word 0x397b714c -//.word 0xbbdbde9c -//.word 0x3f2e87fc -//.word 0x529d8277 -//.word 0xe22f47f1 -//.word 0x5090680c -//.word 0xc6107c4d -//.word 0xcbee5c7b -//.word 0x15d79348 -//.word 0x9eaa0f34 -//.word 0xfa7e1dad -//.word 0xe7e6947b -//.word 0x26744f5b -//.word 0x897be1ea -//.word 0x4e1985c5 -//.word 0xab7554ef -//.word 0xaa46bb73 -//.word 0x37952b4a -//.word 0x77c3127e -//.word 0x5ccd0b90 -//.word 0x77cf5118 -//.word 0x0dc77aab -//.word 0x6c9c8000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x0000D030 -//// expected output -//.word 0x2d97d18d -//.word 0x0b70ab23 -//.word 0x1a0ecebe -//.word 0xd1a686c7 -//.word 0x39914673 -//.word 0x521ed64e -//.word 0xc6e27c1c -//.word 0x78e20009 -//.word 0x81df9324 -//.word 0x39a69774 -//.word 0x3cded208 -//.word 0xf7361644 -//.word 0x68a1a53c -//.word 0xabe2b65b -//.word 0x9a0ef10a -//.word 0xd42f0372 -//// SHA512LongMsgvector_67 -//// vector length -//.word 0x0000D348 -//// input message -//.word 0xf60e7c7c -//.word 0x4f4f13eb -//.word 0xa990a76d -//.word 0xaf1e6152 -//.word 0xfe6ef25f -//.word 0xdd03dfce -//.word 0x28921c97 -//.word 0x8e65ddee -//.word 0xfdfda90d -//.word 0x59fbb033 -//.word 0x74415eed -//.word 0x3b543094 -//.word 0x2d04c717 -//.word 0x12503bfa -//.word 0xe984b19f -//.word 0x22a430c5 -//.word 0x0d0db04e -//.word 0x935a7445 -//.word 0x24859a1f -//.word 0xf04ef141 -//.word 0x5ae10ac3 -//.word 0xa9b39274 -//.word 0x01adde1e -//.word 0x938cc80b -//.word 0x1088bac7 -//.word 0x63330828 -//.word 0x9fa5838c -//.word 0x36d64b62 -//.word 0x6d4be4ec -//.word 0x0cf58c42 -//.word 0x5a56cc9b -//.word 0x48e54ec8 -//.word 0xedb4ee01 -//.word 0x325013e4 -//.word 0xcfe840bb -//.word 0x76b2e6fe -//.word 0x4d8b7d19 -//.word 0xa2ded26e -//.word 0xdbc6a39e -//.word 0xab776904 -//.word 0x8cda7583 -//.word 0x69773e82 -//.word 0x9a98fa34 -//.word 0x16ab6b1d -//.word 0xe4e9fcd2 -//.word 0xd3350c00 -//.word 0x6b478aaf -//.word 0x2309c2c8 -//.word 0xd54176d5 -//.word 0x6e713109 -//.word 0xeafbd880 -//.word 0x808982c7 -//.word 0x19ac899f -//.word 0x07c4e2fe -//.word 0xf41fa957 -//.word 0x1865001b -//.word 0xb0331a80 -//.word 0xab069381 -//.word 0xa65b0326 -//.word 0x1a14d205 -//.word 0xd41e4e09 -//.word 0xa651fa72 -//.word 0x5d97291d -//.word 0xf251cc06 -//.word 0x05f6890b -//.word 0x86fd0df3 -//.word 0xb6fea2ae -//.word 0x4e1404de -//.word 0xfd857097 -//.word 0x18a5ff63 -//.word 0x8ef7328a -//.word 0x1a96ce90 -//.word 0xbcd3eafe -//.word 0x69204666 -//.word 0x022ddea1 -//.word 0x8350bf5b -//.word 0x7d2a1ad2 -//.word 0xc68897da -//.word 0x6e87eb25 -//.word 0xf6fcadc1 -//.word 0xbd1265e2 -//.word 0xbb35e7e2 -//.word 0x712fdf86 -//.word 0x2091ac83 -//.word 0x3a557240 -//.word 0x16c16ade -//.word 0xe78f7d76 -//.word 0xef4a12a1 -//.word 0xf0fb243e -//.word 0xe405976f -//.word 0xed4ecce5 -//.word 0x8f9f735e -//.word 0x1d4ea06b -//.word 0x711a2177 -//.word 0xe0561005 -//.word 0x6e4aa439 -//.word 0x3dd64c9a -//.word 0x4c58ff16 -//.word 0x5ed0cd47 -//.word 0x3742bbf4 -//.word 0x0e5ccddb -//.word 0x405964ad -//.word 0x4225ca5b -//.word 0xd9c20c90 -//.word 0x8dea087e -//.word 0x5bf6c6de -//.word 0xaafe0c32 -//.word 0x80422c4e -//.word 0xf6c82116 -//.word 0xe947da89 -//.word 0xf344d6ff -//.word 0x997bf1ae -//.word 0xc6807e73 -//.word 0x79a695d0 -//.word 0xba20ae31 -//.word 0xd2666f73 -//.word 0xbbdbc3a6 -//.word 0xd6ac2c12 -//.word 0xdcfb5a79 -//.word 0x173dfc9c -//.word 0xd2e0d600 -//.word 0x0e3114f2 -//.word 0x767edec9 -//.word 0x95772c6b -//.word 0x47dadc13 -//.word 0x6d500251 -//.word 0xe5927f52 -//.word 0xbacfd561 -//.word 0x975239ae -//.word 0x8260ea4e -//.word 0xc65fc284 -//.word 0x313e0a3f -//.word 0x801093e3 -//.word 0x18fa024c -//.word 0xf7506c11 -//.word 0xe9fb2305 -//.word 0xff1ecf04 -//.word 0x3df9c0ec -//.word 0x930d82e9 -//.word 0x0f80b2f6 -//.word 0x50c411a0 -//.word 0x3e74d70d -//.word 0xf87e4a3e -//.word 0x0e878e91 -//.word 0xf18bbf8a -//.word 0xa7c43dd2 -//.word 0xc3ce4780 -//.word 0x9508cc98 -//.word 0x9e3d7dd1 -//.word 0x4684279c -//.word 0xd2644061 -//.word 0x903cc00c -//.word 0x54e232c8 -//.word 0x288b0a0a -//.word 0x40eb39d2 -//.word 0x2c9dff2e -//.word 0x51c400ff -//.word 0x9af39bff -//.word 0x6b4a7703 -//.word 0xd7e25e7e -//.word 0x126c4f47 -//.word 0x2914ce9c -//.word 0xf0ac7f66 -//.word 0x3c06f3be -//.word 0x53a1c2b1 -//.word 0xa188da40 -//.word 0xad7816ab -//.word 0x4b4113f0 -//.word 0x126e3f8e -//.word 0x1028328e -//.word 0xbd5842c4 -//.word 0x2e0c5153 -//.word 0x8b1cea6f -//.word 0xc30d8d67 -//.word 0x7e3546e2 -//.word 0x54208468 -//.word 0x3c332925 -//.word 0x478fdeea -//.word 0x8e39a975 -//.word 0x6877c1f2 -//.word 0xe17da1c2 -//.word 0x68485b7a -//.word 0xc8cb2f2f -//.word 0x5a495cf1 -//.word 0x78023695 -//.word 0x341179b8 -//.word 0x4a95dd00 -//.word 0x540feaa5 -//.word 0x3d0b0e30 -//.word 0xf803ed83 -//.word 0x7280f81a -//.word 0xc5824190 -//.word 0xae228d65 -//.word 0x4176abfe -//.word 0xdbb505ed -//.word 0x599b7573 -//.word 0x870f5a43 -//.word 0xdb04ea89 -//.word 0x649dca2b -//.word 0xfd94dc4f -//.word 0xc6dc581d -//.word 0xd5851ec6 -//.word 0x28e14ac5 -//.word 0xdee50965 -//.word 0xa7d1ac83 -//.word 0x7a14fb95 -//.word 0x8669cceb -//.word 0x6a47d435 -//.word 0xa878bc46 -//.word 0x57077717 -//.word 0x1960d40f -//.word 0x4db34f81 -//.word 0x86992d77 -//.word 0x3bfac8ae -//.word 0xc02e27e1 -//.word 0x7462d14a -//.word 0x3d3ee367 -//.word 0x31c561fa -//.word 0x967cca53 -//.word 0x0dceefd1 -//.word 0x0aaf04a7 -//.word 0x8780f8dc -//.word 0xfa320296 -//.word 0x84af7d97 -//.word 0x6b75f508 -//.word 0xca848275 -//.word 0x877b541a -//.word 0x86fe905d -//.word 0x1c5a5b9b -//.word 0xc76c3327 -//.word 0x1cbf8690 -//.word 0x00f47d23 -//.word 0x1b6719b1 -//.word 0x8a0f8293 -//.word 0xd4a69cea -//.word 0x200ada2b -//.word 0xa5e457dc -//.word 0x61872398 -//.word 0x0e1bda59 -//.word 0x52fa7cf7 -//.word 0x365a78eb -//.word 0xd92d0a59 -//.word 0x6645c74e -//.word 0x43bc7746 -//.word 0x8b9322f1 -//.word 0xbf996e36 -//.word 0xb88e2879 -//.word 0xe0892019 -//.word 0xa2973a3d -//.word 0x1fa5c2d1 -//.word 0x23a000cb -//.word 0x57da0cb3 -//.word 0xb8b0e462 -//.word 0x476abc0a -//.word 0x02629576 -//.word 0x14691193 -//.word 0x49668630 -//.word 0xc4405102 -//.word 0xf4fe6deb -//.word 0xc42d447b -//.word 0x1282c4b8 -//.word 0x63c1b61a -//.word 0xd5dd4bda -//.word 0x5561f86d -//.word 0x110e844b -//.word 0x30c660f4 -//.word 0xc1a93635 -//.word 0xf27dc4a7 -//.word 0x8353eb7a -//.word 0x7a670370 -//.word 0x1749722c -//.word 0x0a3a7dad -//.word 0xe4d95e16 -//.word 0xccff96b0 -//.word 0x73e78431 -//.word 0x4a92373f -//.word 0xf2698130 -//.word 0xf3254c14 -//.word 0xb2ec31f5 -//.word 0x9dbc475d -//.word 0xa90d3919 -//.word 0xfeb29c3d -//.word 0xf0017f68 -//.word 0x32334349 -//.word 0x460ead62 -//.word 0x38c1390c -//.word 0x8c0fb1bc -//.word 0x75afff84 -//.word 0x48f340dd -//.word 0x2fa919a3 -//.word 0x223f4e61 -//.word 0x132a90cf -//.word 0x69879799 -//.word 0xb0037162 -//.word 0x8ff91a09 -//.word 0xfadb4c2b -//.word 0xa8d398e9 -//.word 0xc8aab6eb -//.word 0xf0e81aa4 -//.word 0x563dc7d8 -//.word 0x421f685c -//.word 0xc3b59d1e -//.word 0xa2f49365 -//.word 0x9408d759 -//.word 0xb3f56cc5 -//.word 0x2f7e1b1c -//.word 0x41460aba -//.word 0x6135906d -//.word 0xb91d4834 -//.word 0xd99d6446 -//.word 0xac464456 -//.word 0xabfd4816 -//.word 0x50a0e2fa -//.word 0xceedef3e -//.word 0xff9f472a -//.word 0x9ed99295 -//.word 0xb6c85ea8 -//.word 0x5a856fe4 -//.word 0x97385666 -//.word 0xa783466a -//.word 0x671e220f -//.word 0x0cbeda5a -//.word 0x113cf87c -//.word 0x73f37658 -//.word 0x216ad340 -//.word 0xae3366ff -//.word 0x4a12f11d -//.word 0xf062795e -//.word 0xe1b5558c -//.word 0x50bb8676 -//.word 0x5f654639 -//.word 0x4a49e3be -//.word 0xe249ce84 -//.word 0x3e6fefa0 -//.word 0xad1c3c02 -//.word 0xee628af9 -//.word 0xa4aea3fa -//.word 0x04aa989d -//.word 0xd16159e8 -//.word 0x8aa582d0 -//.word 0xe2ad78fd -//.word 0x7003b5ce -//.word 0xa89e609d -//.word 0x0a4a2144 -//.word 0x995133df -//.word 0x8f54bbd4 -//.word 0x4f7a5811 -//.word 0x9bcdfb95 -//.word 0x07e0f932 -//.word 0xadb55e91 -//.word 0x23df8576 -//.word 0xaae4e545 -//.word 0xa8e52ec6 -//.word 0x59819525 -//.word 0xc1f66b3d -//.word 0xe589f515 -//.word 0x3a2978ab -//.word 0x5e4f93f1 -//.word 0x0628d116 -//.word 0x38f67f06 -//.word 0xbab4bb34 -//.word 0xcaf8ce97 -//.word 0x0f1ebcf2 -//.word 0xd0a31959 -//.word 0x64cf1df1 -//.word 0xe997fbf7 -//.word 0x39c16f04 -//.word 0x1a49968f -//.word 0xb50403b3 -//.word 0x4a830f32 -//.word 0x213a70bb -//.word 0xc4e10e68 -//.word 0x6b1b128b -//.word 0xb8563faa -//.word 0xa4f285c8 -//.word 0xbaa5d3e6 -//.word 0x831e2eca -//.word 0x41e800ff -//.word 0xdf92b21d -//.word 0x290d7c4b -//.word 0x39557c01 -//.word 0x31530613 -//.word 0x30033ceb -//.word 0x7ed2de15 -//.word 0x0a4a6302 -//.word 0x17f04805 -//.word 0x326da8a2 -//.word 0x67ed0d08 -//.word 0xb4c586dc -//.word 0xbe58f938 -//.word 0xc33bbbf4 -//.word 0xd0975e24 -//.word 0x34cfcae1 -//.word 0x34638f4d -//.word 0x00157ad1 -//.word 0xe64a67a9 -//.word 0xc6b255a3 -//.word 0xc62bc023 -//.word 0x46e32b6b -//.word 0x17bdfc19 -//.word 0xe7f78cf1 -//.word 0x00097fdd -//.word 0x33d05132 -//.word 0x0eeb3235 -//.word 0x566614de -//.word 0xb19502dc -//.word 0xa243b3d8 -//.word 0xba0d5ffe -//.word 0x0d08d1ba -//.word 0xe4aabebf -//.word 0xb1e7554e -//.word 0x489a17b5 -//.word 0x4b27e916 -//.word 0xe65e6769 -//.word 0xbda37cc4 -//.word 0x234c2fda -//.word 0x8d4bc0c3 -//.word 0x460df4fb -//.word 0x64a2adac -//.word 0xfa1dbd30 -//.word 0x8f3efcd1 -//.word 0xcf4e99d4 -//.word 0x814badb7 -//.word 0xb94516b6 -//.word 0x4f088294 -//.word 0x8ffbca97 -//.word 0x324882d5 -//.word 0x8e3dceae -//.word 0x09f3769a -//.word 0xd32d3d25 -//.word 0xd5826f37 -//.word 0xe4bfba99 -//.word 0x3b873eb5 -//.word 0x283ce79d -//.word 0x0523fb4f -//.word 0x6ac2ef38 -//.word 0xa18d7ff6 -//.word 0x5ac2fe62 -//.word 0xa092eace -//.word 0x0c81c38b -//.word 0x390f1daf -//.word 0x7798f514 -//.word 0xc47941a4 -//.word 0xf874cad4 -//.word 0x3f563e6f -//.word 0xccd68195 -//.word 0xccc14503 -//.word 0x9954da95 -//.word 0x31e94708 -//.word 0xe6d79905 -//.word 0x57937b5b -//.word 0x9e1b078d -//.word 0xcb94dc8c -//.word 0x923171c5 -//.word 0x4058a95e -//.word 0xf300a7bd -//.word 0x0b5ee34b -//.word 0xdcc07d77 -//.word 0xa5b9d2fd -//.word 0xc67e4e68 -//.word 0x2d9081d5 -//.word 0x129b74fb -//.word 0xe49e3d68 -//.word 0x834dd10d -//.word 0xafb41afd -//.word 0xc11c4972 -//.word 0x98326e11 -//.word 0xd766456f -//.word 0x4e9253d3 -//.word 0xb5dc323e -//.word 0xa0dd2aa8 -//.word 0xaf03018d -//.word 0x053313a8 -//.word 0xfcb3a5ff -//.word 0x1748761f -//.word 0x399b97a9 -//.word 0x14e17d0d -//.word 0xe3bb5596 -//.word 0x5c5b97a7 -//.word 0xe0e9de44 -//.word 0xf625f7d3 -//.word 0xf74d3724 -//.word 0x0b4112b0 -//.word 0x53e5ea1e -//.word 0x68c7250c -//.word 0x0502820b -//.word 0x0062adeb -//.word 0x7fc8113a -//.word 0x68d0ed07 -//.word 0x19b2aaeb -//.word 0x5a666c4b -//.word 0x8f0ce7d7 -//.word 0x338a7456 -//.word 0x817763a6 -//.word 0x743893fe -//.word 0xf2684177 -//.word 0x447e1ecb -//.word 0xcaa9a45c -//.word 0xedffa978 -//.word 0x54d735db -//.word 0x5b739175 -//.word 0xc1e3a06e -//.word 0xa0257268 -//.word 0xa3911704 -//.word 0x7375b1a7 -//.word 0x72fccd7e -//.word 0xac54f4bf -//.word 0x0b0f7c32 -//.word 0xcacaa4f1 -//.word 0x2b0de16c -//.word 0x6d7372af -//.word 0xf80b3ae8 -//.word 0xdcfdcf23 -//.word 0x7971cf59 -//.word 0x7fac73a9 -//.word 0x1a7c66e5 -//.word 0x66d7d750 -//.word 0x29bfcda6 -//.word 0xc168ba5d -//.word 0x5b9d542b -//.word 0x6660a0c8 -//.word 0x48d14ff5 -//.word 0x4f514ebd -//.word 0xeae699fb -//.word 0x19e1501c -//.word 0x22bf0c26 -//.word 0x864e73f9 -//.word 0x33110ad6 -//.word 0xfbe44b1d -//.word 0x45e3f85b -//.word 0x0289ae83 -//.word 0xe315bd7c -//.word 0xc93237dc -//.word 0x7ed647f4 -//.word 0xa26bc40c -//.word 0xe82d06ef -//.word 0x82d3f9ab -//.word 0xd9716f92 -//.word 0x829dbb84 -//.word 0x6dd17b71 -//.word 0x6010b519 -//.word 0xa4cc2616 -//.word 0xff08d61d -//.word 0xe2baf081 -//.word 0xe273d1f8 -//.word 0x6c415fa2 -//.word 0xb5d59c47 -//.word 0xf1e17be1 -//.word 0xc5c4f25a -//.word 0xfe695096 -//.word 0x836cd1b4 -//.word 0x887f6f91 -//.word 0x050dfc8e -//.word 0x671d6e94 -//.word 0x85787a55 -//.word 0xd50e64d4 -//.word 0xe0961527 -//.word 0xf3756e7b -//.word 0x18e1dc5a -//.word 0x44462c29 -//.word 0xd2e8a1f5 -//.word 0x30cb446f -//.word 0xd9d07c34 -//.word 0x8320de52 -//.word 0x99cd4608 -//.word 0xebb727ce -//.word 0xa5ad1f95 -//.word 0x7dd5cf50 -//.word 0x314ee9b3 -//.word 0x31138a3b -//.word 0x9823cb6e -//.word 0x61df9364 -//.word 0xd8b3af86 -//.word 0x4ef82496 -//.word 0x1119c3f0 -//.word 0x9cf5ff0f -//.word 0x0a85fc52 -//.word 0xd1bfe800 -//.word 0xacba8e8b -//.word 0xd9122811 -//.word 0x858e7528 -//.word 0x85000cdb -//.word 0x466df0f0 -//.word 0x076e646d -//.word 0x45d6015a -//.word 0x779505c7 -//.word 0xfcddee11 -//.word 0x52834862 -//.word 0x88a7c377 -//.word 0xf69788a6 -//.word 0x2bf1cd1f -//.word 0x2708a772 -//.word 0xcb892051 -//.word 0x8d5f8a97 -//.word 0x70d3138a -//.word 0x34f8995d -//.word 0xc946bffa -//.word 0x0a8540fe -//.word 0xa8ed8304 -//.word 0x648b7026 -//.word 0x82e683c1 -//.word 0x7ae31e79 -//.word 0xf0e6247d -//.word 0xe63ac30c -//.word 0x31b39139 -//.word 0x2991dbeb -//.word 0xa5a83927 -//.word 0x27be6692 -//.word 0x53354f31 -//.word 0xa6ea6a74 -//.word 0x645c4973 -//.word 0xd2116f77 -//.word 0xa63562bc -//.word 0xbc850275 -//.word 0x0a6b1811 -//.word 0xd66a32bd -//.word 0x26bdaf2a -//.word 0x793b1690 -//.word 0xb47eacf3 -//.word 0x5f4445a5 -//.word 0x11155a0c -//.word 0x29275ca5 -//.word 0xbf7e4849 -//.word 0xdb577caf -//.word 0xe4c7c933 -//.word 0x5ba0c9d5 -//.word 0xc9947285 -//.word 0xf59dec9e -//.word 0x5b9ca0b0 -//.word 0xda409282 -//.word 0xad29f057 -//.word 0x9c4deb71 -//.word 0x739bc5d4 -//.word 0xb4df2b4c -//.word 0x89e6c6b1 -//.word 0xfce20d6a -//.word 0x6a0f5d30 -//.word 0x35974b14 -//.word 0xbab439c4 -//.word 0x8314270a -//.word 0xbd81cc95 -//.word 0xecc1e5fc -//.word 0xddbbce00 -//.word 0xdcdc4f12 -//.word 0x28b9b815 -//.word 0xa4f63064 -//.word 0xcf664a17 -//.word 0xf673d982 -//.word 0xa9c106ff -//.word 0x6b0e9fee -//.word 0xad5db2f9 -//.word 0xfe535b9d -//.word 0x7ce1dae5 -//.word 0x8e23e879 -//.word 0xd5884cd8 -//.word 0x5f34a9e2 -//.word 0x1ea29a99 -//.word 0x998e0028 -//.word 0xe2129b25 -//.word 0xc80fd813 -//.word 0x4dceea2b -//.word 0x5be71c5c -//.word 0xb2626690 -//.word 0x251d3e31 -//.word 0x066db0eb -//.word 0xdf08b1b4 -//.word 0x6223b10a -//.word 0xa3d76f7c -//.word 0x85c9116c -//.word 0x720a7413 -//.word 0x503cc1c6 -//.word 0xb0f74177 -//.word 0x486b727e -//.word 0xa3465a9a -//.word 0x17d81b32 -//.word 0xf874c8e1 -//.word 0x0b1a7732 -//.word 0x3d5497a8 -//.word 0x955e8402 -//.word 0x688959bc -//.word 0xcce106d9 -//.word 0x4e0ea2e0 -//.word 0xe8780225 -//.word 0x2daf8a49 -//.word 0xc7094304 -//.word 0x238d2e22 -//.word 0x6b0fd8cc -//.word 0xb59d2f09 -//.word 0x7a1a9485 -//.word 0x49293190 -//.word 0xbc4d8d69 -//.word 0xac4e5dbd -//.word 0xa1de9e6b -//.word 0x8c7ce08a -//.word 0xb999e5ad -//.word 0xfff96a65 -//.word 0x3a5d4508 -//.word 0xfb5fb0b1 -//.word 0x7d9de588 -//.word 0xdb19eb44 -//.word 0x81e0afee -//.word 0xe0ea56e7 -//.word 0x6742d22c -//.word 0xae66b3d9 -//.word 0xf4f140ec -//.word 0xcb77c74c -//.word 0x12b1310a -//.word 0x24dad9e6 -//.word 0x4f589f15 -//.word 0x889f3841 -//.word 0x5c53c8d2 -//.word 0x2aacb26c -//.word 0x901faeb8 -//.word 0x233b1d68 -//.word 0x63d19a75 -//.word 0xee57d2ab -//.word 0xf38e9568 -//.word 0xea632da1 -//.word 0x8213ee25 -//.word 0xdb930e26 -//.word 0xf62fb7f5 -//.word 0x6a715b0d -//.word 0x58444853 -//.word 0xa0597c9c -//.word 0x55caba70 -//.word 0x6ffedd0e -//.word 0xc0cc6daf -//.word 0x2ae3700f -//.word 0x0e69822a -//.word 0x07e22843 -//.word 0xd954622b -//.word 0xa4a87fc0 -//.word 0x5e5435b4 -//.word 0x7f37f190 -//.word 0xfec46cf8 -//.word 0x7d637f30 -//.word 0xc11438df -//.word 0x64562d13 -//.word 0xce471086 -//.word 0x610c8420 -//.word 0xf4732fbc -//.word 0x83d7112f -//.word 0x24451486 -//.word 0x3ddce490 -//.word 0xf57a009d -//.word 0xe8951284 -//.word 0x1f667ceb -//.word 0x3f4d33c2 -//.word 0x0071d011 -//.word 0xe1a7e4f4 -//.word 0x1b958ce3 -//.word 0xd3174637 -//.word 0x93e103ea -//.word 0xfb667e9f -//.word 0xb4f9cbe2 -//.word 0xa63233b0 -//.word 0x6b943f3a -//.word 0x036c13e6 -//.word 0xc9fcfd97 -//.word 0xa5d94e2e -//.word 0x84926951 -//.word 0x0592196b -//.word 0x754828f3 -//.word 0xfe852df2 -//.word 0x1b25a5bf -//.word 0x4ff1450d -//.word 0x17c48f28 -//.word 0x1deda47c -//.word 0xaed55957 -//.word 0x6ee28cf0 -//.word 0x4b9ab9a7 -//.word 0xaf0cc88e -//.word 0xfa6b2929 -//.word 0x2ffd2372 -//.word 0xed336920 -//.word 0xa21aef29 -//.word 0xfbf2fb86 -//.word 0x9f1b7f36 -//.word 0x1c39a685 -//.word 0x2190ad8e -//.word 0xefb0f4ff -//.word 0x0a57551c -//.word 0x3493b407 -//.word 0x9b27d73e -//.word 0x52307865 -//.word 0xfe089946 -//.word 0xd26b1816 -//.word 0xbdd883f9 -//.word 0xe13a2dc9 -//.word 0x48c88213 -//.word 0xd22a9763 -//.word 0x72dd06c2 -//.word 0x9ad8f87c -//.word 0xf4708327 -//.word 0x537937e0 -//.word 0xe9aef3d8 -//.word 0xba53fd10 -//.word 0x50185260 -//.word 0xb1413bbe -//.word 0x8e0421bd -//.word 0xbd32a254 -//.word 0xea1ae5e1 -//.word 0x89ab2a6d -//.word 0x0ed8a532 -//.word 0x61418c5a -//.word 0x8c0f6f0a -//.word 0xb71fc89f -//.word 0x5764d338 -//.word 0xa2869f74 -//.word 0x46cf657d -//.word 0x5a481a45 -//.word 0x951f400f -//.word 0xbe4c0132 -//.word 0x63747e19 -//.word 0xce0e658f -//.word 0x35c4c139 -//.word 0x311c1764 -//.word 0x7157ae02 -//.word 0xb09a2eee -//.word 0xe44b6d78 -//.word 0xb9be851d -//.word 0x3d112a96 -//.word 0xdd543a15 -//.word 0x90ed96cb -//.word 0x523b31ad -//.word 0xd47a6678 -//.word 0x72e78ff2 -//.word 0x6524d373 -//.word 0x3add3fa5 -//.word 0x82ac1888 -//.word 0xcc3a70b9 -//.word 0xd0a8f8f3 -//.word 0xed2d15d6 -//.word 0xd60036e7 -//.word 0x887864d9 -//.word 0x7f711b0b -//.word 0x29f35851 -//.word 0x9b0ef3f7 -//.word 0x83082f03 -//.word 0x5dbb90bb -//.word 0xea38ec67 -//.word 0xdeb0c558 -//.word 0xd995d629 -//.word 0x99fcec45 -//.word 0x6e46f7a9 -//.word 0xeeff61ec -//.word 0xe9069e7c -//.word 0xa0ee052a -//.word 0x31a5dee9 -//.word 0x5653bcd2 -//.word 0x4f850d6c -//.word 0x1d8bef2b -//.word 0xf11e4536 -//.word 0xe4470a6d -//.word 0xe87ce6ab -//.word 0xff0bff48 -//.word 0xabbc12e3 -//.word 0xa5b1c25e -//.word 0xd1923029 -//.word 0x72e7cbc4 -//.word 0x9bc56a7f -//.word 0xe6ad9885 -//.word 0x67b12e18 -//.word 0xe3d8281e -//.word 0x3ec4b1dd -//.word 0x33928003 -//.word 0x480267e9 -//.word 0x00d82918 -//.word 0x52828d0d -//.word 0x5afab039 -//.word 0x4fee9f4c -//.word 0xb51f25b3 -//.word 0xd307e25f -//.word 0x68be9dc9 -//.word 0x9a1edc33 -//.word 0x2f26b130 -//.word 0xff9cd666 -//.word 0xa9f6fc93 -//.word 0x867b61ce -//.word 0xdba6a110 -//.word 0x53cbcef2 -//.word 0xacfcc2b8 -//.word 0xb02eb48f -//.word 0x67980a13 -//.word 0x8b5c6e14 -//.word 0x3c69249a -//.word 0xf5a09b26 -//.word 0xbf36423b -//.word 0xa4599c1d -//.word 0x671697d9 -//.word 0x727a1a85 -//.word 0x10f7ddc9 -//.word 0xdc0a7d9f -//.word 0x7a1bd056 -//.word 0x84a576dd -//.word 0xc796b03e -//.word 0xb0f97569 -//.word 0x01d2c333 -//.word 0xc849349e -//.word 0x920bd15b -//.word 0xdcee2a8d -//.word 0xcad4a7d0 -//.word 0x1cd1197a -//.word 0x5d909421 -//.word 0x5df2815d -//.word 0xe2f9efce -//.word 0x9be52a61 -//.word 0x559c8fd0 -//.word 0x714f9e68 -//.word 0x965b510f -//.word 0xa36dac85 -//.word 0xe8ea96ea -//.word 0x958ee781 -//.word 0x7253c2b3 -//.word 0xd1942557 -//.word 0xc272be30 -//.word 0x857701b7 -//.word 0x4579771b -//.word 0x03c15987 -//.word 0xd06d5da3 -//.word 0x3f13d05d -//.word 0x1aa7e5e9 -//.word 0x549f4d06 -//.word 0x3f540784 -//.word 0xffac7a03 -//.word 0x3ff6c1fd -//.word 0x22154607 -//.word 0x7ce19253 -//.word 0x43ca637a -//.word 0x40bfff78 -//.word 0x0a4ec9f8 -//.word 0x350c12d3 -//.word 0xc73731d3 -//.word 0xeb9ad6bc -//.word 0xeab19b8d -//.word 0x560edc03 -//.word 0x89fbc95f -//.word 0x4e61b969 -//.word 0xdde8c2b5 -//.word 0x0d608625 -//.word 0xc5604faf -//.word 0xb32c5f60 -//.word 0x41dc81a1 -//.word 0xc5bbe4ba -//.word 0xf8ee2994 -//.word 0xaa56bbc3 -//.word 0xb4b75fc3 -//.word 0x2d190c82 -//.word 0xe16efc1f -//.word 0xfe7603f2 -//.word 0x11e020cc -//.word 0x31b25280 -//.word 0x7aeaaca2 -//.word 0xbe65ac8e -//.word 0x7601c9ac -//.word 0xffff4bf3 -//.word 0x03ab5fac -//.word 0x353e6b79 -//.word 0x41039f95 -//.word 0x02b9cd5d -//.word 0xf6397a10 -//.word 0xf05835d3 -//.word 0x0d0f27f8 -//.word 0xe9d9ec7f -//.word 0x135da1dd -//.word 0xbe4d3efd -//.word 0xb98e2685 -//.word 0xa199fd5a -//.word 0x5521ba66 -//.word 0xaaf6fd99 -//.word 0x6029a22d -//.word 0x5571962f -//.word 0xf9cde93b -//.word 0x026b2587 -//.word 0x61c9df22 -//.word 0x741a8b7e -//.word 0x7deb952d -//.word 0x5306ade8 -//.word 0x579662d5 -//.word 0xaa8df20a -//.word 0x9d43604d -//.word 0x695fc81d -//.word 0x21fbf0f7 -//.word 0xe4031fd2 -//.word 0x57de32ec -//.word 0x5251ecc8 -//.word 0xdaa08e77 -//.word 0x50f6a718 -//.word 0xe7062e9b -//.word 0x5cf3ceca -//.word 0xe16d8189 -//.word 0x5a1e605c -//.word 0xcb44ba2b -//.word 0x119f6342 -//.word 0xd18d4e9c -//.word 0xaf745e61 -//.word 0xc0607aad -//.word 0x41ede093 -//.word 0x8968bb62 -//.word 0x3c31f726 -//.word 0xc2635472 -//.word 0xf7b7b95d -//.word 0x24a6cccb -//.word 0x2fcebfee -//.word 0x0e976c0c -//.word 0x8116a582 -//.word 0x0132c509 -//.word 0xf3058b38 -//.word 0x2285294a -//.word 0x6c639722 -//.word 0xbc332d8c -//.word 0x38ce71c6 -//.word 0xbbf42e3f -//.word 0x8536c69e -//.word 0x3113c806 -//.word 0xe862c598 -//.word 0xd5f0603a -//.word 0xd869a597 -//.word 0x7f7c9c67 -//.word 0x323a1df1 -//.word 0xadbfe5ce -//.word 0xb415eaef -//.word 0x0155ece2 -//.word 0x820f4d50 -//.word 0xc1ec22cb -//.word 0xa4928ac6 -//.word 0x56c83fe5 -//.word 0x85db6a78 -//.word 0xce40bc42 -//.word 0x757aba7e -//.word 0x5a3f5824 -//.word 0x28d6ca68 -//.word 0xd0c39783 -//.word 0x36a6efb7 -//.word 0x29613e8d -//.word 0x99790162 -//.word 0x04bfd921 -//.word 0x322fdd52 -//.word 0x22183554 -//.word 0x447de5e6 -//.word 0xe9bbe6ed -//.word 0xf76d7b71 -//.word 0xe18dc2e8 -//.word 0xd6dc89b7 -//.word 0x398364f6 -//.word 0x52fafc73 -//.word 0x4329aafa -//.word 0x3dcd45d4 -//.word 0xf31e388e -//.word 0x4fafd7fc -//.word 0x6495f37c -//.word 0xa5cbab7f -//.word 0x54d58646 -//.word 0x3da4bfea -//.word 0xa3bae09f -//.word 0x7b8e9239 -//.word 0xd832b4f0 -//.word 0xa733aa60 -//.word 0x9cc1f8d4 -//.word 0x6c0f0fc3 -//.word 0x3dfd669b -//.word 0x5af5cdbe -//.word 0x2c12ffca -//.word 0x6688761e -//.word 0x7f40839a -//.word 0x65c29da5 -//.word 0x7058fa75 -//.word 0x94705c8b -//.word 0xdc432e7c -//.word 0x13b4cff7 -//.word 0xc47b2e04 -//.word 0x6682978a -//.word 0xd08fcc14 -//.word 0xf32458d4 -//.word 0xc7a420e9 -//.word 0x86b63bdd -//.word 0x19ee0372 -//.word 0xcfab6c9e -//.word 0x553b95d4 -//.word 0xe3469d85 -//.word 0xb369b8e7 -//.word 0xb72182f5 -//.word 0x8beb93b7 -//.word 0xa9a953c3 -//.word 0xdc480f04 -//.word 0xf7a04dba -//.word 0xc69b5dc2 -//.word 0x459a3118 -//.word 0x10146f9a -//.word 0x1b80c30e -//.word 0xa3767a67 -//.word 0x64114d44 -//.word 0x0d977aba -//.word 0xf15c1a53 -//.word 0xffe3ae56 -//.word 0xf447fb49 -//.word 0xcfd918b5 -//.word 0x850bc529 -//.word 0xf78dfe81 -//.word 0x21b5d068 -//.word 0x94246c1c -//.word 0x26a77a72 -//.word 0xe85baf19 -//.word 0x5815a222 -//.word 0xd800dbc0 -//.word 0x5f882d4d -//.word 0x6f77478e -//.word 0x475e8538 -//.word 0x59370cb3 -//.word 0xfe48151d -//.word 0x694b8992 -//.word 0xd9cbcfab -//.word 0x13d1e144 -//.word 0x10c0a683 -//.word 0xf37e7c16 -//.word 0x3ed413bb -//.word 0x44188206 -//.word 0xe209945f -//.word 0x6afa634a -//.word 0xe03329eb -//.word 0x699452c9 -//.word 0x007bd6d2 -//.word 0x6be8c59f -//.word 0x6ddf24fa -//.word 0x3e0ef79d -//.word 0x38b09f3d -//.word 0xd3b166c7 -//.word 0xd31359ea -//.word 0xc09056d5 -//.word 0x97816542 -//.word 0xbffe4bb3 -//.word 0x3e475dfb -//.word 0x2d629301 -//.word 0x6906ddc1 -//.word 0x8cb8ba93 -//.word 0x1c3406b0 -//.word 0x020e13f2 -//.word 0x3d99fcdb -//.word 0xd70836d9 -//.word 0x18d368c8 -//.word 0xfb5d7db9 -//.word 0xded3f7f2 -//.word 0x7d578636 -//.word 0x215ed946 -//.word 0x1556b4a7 -//.word 0x5a8d43a6 -//.word 0x9b4eae9a -//.word 0x634ded69 -//.word 0x8e44de4d -//.word 0xfedf94d8 -//.word 0x8fd6f236 -//.word 0x4c5879b3 -//.word 0xe3b05f7c -//.word 0x5623e1aa -//.word 0xf417da7c -//.word 0x887b93e4 -//.word 0xd062dd46 -//.word 0x30f15d7c -//.word 0xa87c281d -//.word 0x04ec90ff -//.word 0x52643dfa -//.word 0x99247fef -//.word 0xc8ade209 -//.word 0xed250343 -//.word 0xa7fea32b -//.word 0xded3fae5 -//.word 0xb1924d72 -//.word 0xb0e0c333 -//.word 0x4cb975a8 -//.word 0x8b57c47e -//.word 0x0156efc9 -//.word 0xfb15e58e -//.word 0xfd5f5784 -//.word 0x6f4b121b -//.word 0x93608cbe -//.word 0xbafdbc55 -//.word 0xb8f82f0f -//.word 0x9586595e -//.word 0x855b2943 -//.word 0x1a12e0cb -//.word 0xb9ce22da -//.word 0x4b224d27 -//.word 0x342e0b88 -//.word 0x890b2370 -//.word 0x7d6a95b5 -//.word 0x1d77e597 -//.word 0x3e04b7ff -//.word 0xb3e39c04 -//.word 0xc3932cb3 -//.word 0xda205510 -//.word 0x7e44f258 -//.word 0x85d29f89 -//.word 0x8554cc24 -//.word 0x8df31132 -//.word 0x1298c185 -//.word 0x2c51c240 -//.word 0x03f69c9a -//.word 0x830ccfde -//.word 0x58e96ab6 -//.word 0x1619d9aa -//.word 0xb701ffe4 -//.word 0x4bc28536 -//.word 0xeb61715e -//.word 0xef24fa88 -//.word 0x613f9a14 -//.word 0xb1af669a -//.word 0xa9679b2b -//.word 0xa4aa79da -//.word 0xfbb8547b -//.word 0xc1ace8ab -//.word 0xb0a5ed11 -//.word 0x6224ebe3 -//.word 0xc5b550ab -//.word 0xc9d2c04b -//.word 0x5b04ac3e -//.word 0x974b2622 -//.word 0x39c0f373 -//.word 0x5579e29a -//.word 0x49ad5d26 -//.word 0xef183e59 -//.word 0x17a1e4e6 -//.word 0x343b85f9 -//.word 0x5509c578 -//.word 0x57c58888 -//.word 0x59620554 -//.word 0x71f01d0a -//.word 0x9dc1ea25 -//.word 0xfdca9af2 -//.word 0x3f4b7e4d -//.word 0x5ab35eac -//.word 0x7fbe1060 -//.word 0x4ce04817 -//.word 0x44e6b2a4 -//.word 0x7cdb3e03 -//.word 0x9628bc97 -//.word 0xf300a8b7 -//.word 0x25fb4769 -//.word 0xa301f36d -//.word 0xc16ab27e -//.word 0xdf630ed4 -//.word 0xe09421ed -//.word 0xde00f08d -//.word 0x1b2cfa04 -//.word 0x3b8310af -//.word 0xb1f966c1 -//.word 0x78efeb43 -//.word 0x0356d65a -//.word 0x761881c9 -//.word 0x16b37bb6 -//.word 0xfe27d9b1 -//.word 0x1513ccf2 -//.word 0x3c1b79e2 -//.word 0xcc8c04de -//.word 0x3f43ee37 -//.word 0x2dcba27d -//.word 0x7bc54afd -//.word 0xcf8de788 -//.word 0x461aa176 -//.word 0x6a265beb -//.word 0x5e8f8b59 -//.word 0x5cfe4946 -//.word 0x62c6a650 -//.word 0x270f3e6e -//.word 0x54331178 -//.word 0xf1688eea -//.word 0x1da0f1e5 -//.word 0x03adcf76 -//.word 0x09a9ef1b -//.word 0x4a955c83 -//.word 0x4740b896 -//.word 0xd96ad3b5 -//.word 0x6b2a7d43 -//.word 0x658d9864 -//.word 0xeb807104 -//.word 0xc8f0501c -//.word 0xa52f4d30 -//.word 0x7f9a661d -//.word 0x5879cf11 -//.word 0x2c2689db -//.word 0x26723665 -//.word 0x14442c7e -//.word 0x1983c8dd -//.word 0xa1360463 -//.word 0x9aea4ca1 -//.word 0xe2548e9a -//.word 0xfb3891ca -//.word 0x068a8767 -//.word 0xefd2e5e6 -//.word 0xe5d572c1 -//.word 0x0d719e78 -//.word 0x77c916d6 -//.word 0x51a29575 -//.word 0x5a0dfd84 -//.word 0x9a47a6c8 -//.word 0x51ddf6e1 -//.word 0x2d1332cf -//.word 0xbf8793b4 -//.word 0x30129ddb -//.word 0x30efacfa -//.word 0x301fd0b4 -//.word 0xd10bda62 -//.word 0x9c6cb713 -//.word 0xf368fdd1 -//.word 0x47fdc427 -//.word 0x8ca3b7e0 -//.word 0xea2d6b10 -//.word 0xb6f1ef59 -//.word 0xa028a467 -//.word 0x2e984ebd -//.word 0x69706cb4 -//.word 0xd673c5c0 -//.word 0xa75844f6 -//.word 0x337105cb -//.word 0xa48cb01f -//.word 0xef17067a -//.word 0x0a87b995 -//.word 0x59fa811c -//.word 0x691a6cb2 -//.word 0xe0457636 -//.word 0xb4ec5944 -//.word 0x9c39a6ff -//.word 0xc4f5150e -//.word 0xc5a819e5 -//.word 0xd402b846 -//.word 0x39799a07 -//.word 0x04346015 -//.word 0xfb2837b9 -//.word 0xd681ac1a -//.word 0xaf43c204 -//.word 0xb43141e7 -//.word 0x1fee5223 -//.word 0x68624982 -//.word 0xb85fc206 -//.word 0xa284efe6 -//.word 0x0e6230d3 -//.word 0x75dee47f -//.word 0x54d68060 -//.word 0xda08deb2 -//.word 0xe42fd7bb -//.word 0x2c6e1352 -//.word 0xbdf220a2 -//.word 0xabd4c22c -//.word 0x003c8a0b -//.word 0xf9ccaa7c -//.word 0x733c089d -//.word 0xa0419175 -//.word 0xfeb4d035 -//.word 0x8af0bfbd -//.word 0x317cdd62 -//.word 0x87ea80ef -//.word 0xbbfe6de9 -//.word 0xcb13a618 -//.word 0xf4bb8342 -//.word 0x6da6043a -//.word 0x54c5661a -//.word 0xe9aef4cc -//.word 0xfa4320cf -//.word 0x9e8ed237 -//.word 0x26f000f6 -//.word 0x517b7f5b -//.word 0xbf9c19d8 -//.word 0xa8fddf08 -//.word 0xcea9c0f0 -//.word 0xb0725b86 -//.word 0x0190126f -//.word 0x588a600d -//.word 0x295a6cb9 -//.word 0xf4ccde4d -//.word 0xbc27f1e6 -//.word 0xbb0fc9e8 -//.word 0x54aa0842 -//.word 0x49029cf3 -//.word 0x2eaadacd -//.word 0x1ea5d178 -//.word 0xac83d8bb -//.word 0x1ccd6af7 -//.word 0xd4a334f4 -//.word 0x0da46be0 -//.word 0xce0e6395 -//.word 0x1b265e1b -//.word 0x6adba26e -//.word 0x56a6ce81 -//.word 0x97b46d82 -//.word 0x3247cc60 -//.word 0xed5a098b -//.word 0x06846dfb -//.word 0x241efb73 -//.word 0x8ea84907 -//.word 0x9b698fdc -//.word 0x6a56fe2f -//.word 0xd2355398 -//.word 0x9c02ab90 -//.word 0xf0929932 -//.word 0x0e76763e -//.word 0x3f22f863 -//.word 0x0a4f06be -//.word 0xaa9dcb9e -//.word 0xc07d0a8a -//.word 0x464eb185 -//.word 0xc4c6b090 -//.word 0xc6940b71 -//.word 0x8d432eb3 -//.word 0x056282ee -//.word 0xf7e23d48 -//.word 0x80bf7e3c -//.word 0xc2e3999a -//.word 0xd947afcf -//.word 0x105b8367 -//.word 0x55a888d0 -//.word 0xebb33f61 -//.word 0x5f25bf9a -//.word 0xbd2a95ae -//.word 0x0317cf3e -//.word 0xd64f5468 -//.word 0x74677700 -//.word 0xea88cb1d -//.word 0x871538d8 -//.word 0x908e4e50 -//.word 0x35b5daf2 -//.word 0xc4efb7f7 -//.word 0x1dece72d -//.word 0x668ae2fb -//.word 0x00f72e9f -//.word 0xb91630bb -//.word 0x43254210 -//.word 0xe59c0689 -//.word 0x7058f97b -//.word 0x75f84b2b -//.word 0xb588ee91 -//.word 0xd95ded5b -//.word 0x633fff35 -//.word 0xe5ce5c48 -//.word 0x701ecf00 -//.word 0x50a50c13 -//.word 0xf65745bf -//.word 0x360ff853 -//.word 0xb3310bf0 -//.word 0x978d1a91 -//.word 0x87871049 -//.word 0xd675f4cc -//.word 0xf8490631 -//.word 0x3a700bf6 -//.word 0xb1fae545 -//.word 0x70fa6675 -//.word 0xfe3066d4 -//.word 0x08e513a4 -//.word 0x52178963 -//.word 0xf3d6a350 -//.word 0xc2ee102a -//.word 0x0cc6a93b -//.word 0x88880195 -//.word 0x8c823e9c -//.word 0x80cd28c4 -//.word 0x942c809c -//.word 0xae36930c -//.word 0xa6b80fda -//.word 0xb6551473 -//.word 0x2c6f8ee9 -//.word 0x624bc338 -//.word 0xf06f28cd -//.word 0x204f7949 -//.word 0xa3290882 -//.word 0x822e56ca -//.word 0x57e2e075 -//.word 0xbcc53b95 -//.word 0x04336308 -//.word 0x298951b5 -//.word 0x0689cb12 -//.word 0xc60080ea -//.word 0x9da5545d -//.word 0xb645f928 -//.word 0x6c1dbf26 -//.word 0xbc88ad17 -//.word 0xfadad0a1 -//.word 0xc48bd394 -//.word 0x3598d072 -//.word 0x5a26662f -//.word 0xea680c35 -//.word 0x31c4a4ab -//.word 0x4e3154f7 -//.word 0x9ee49181 -//.word 0x782b7cba -//.word 0x1b99725e -//.word 0xe463def6 -//.word 0xc50a52a0 -//.word 0xf23ad712 -//.word 0xddf381dd -//.word 0x65e646ef -//.word 0x4a220f5c -//.word 0xe5ef105e -//.word 0x16fa559a -//.word 0x7db39ea4 -//.word 0xedf46dc6 -//.word 0x1de35dfd -//.word 0xa119b545 -//.word 0x19043d16 -//.word 0xa989512f -//.word 0xa9ee3392 -//.word 0x9df8a6d0 -//.word 0x6750b886 -//.word 0xbb2bdf28 -//.word 0xd42a47fd -//.word 0x657f6b6b -//.word 0xd352e375 -//.word 0xa1637c82 -//.word 0x2cf08e60 -//.word 0x98d98a88 -//.word 0x0a02d3a4 -//.word 0x17f9cf4e -//.word 0x7dd93d1b -//.word 0x116ec9d8 -//.word 0xf999dd13 -//.word 0x1bf6bbde -//.word 0xd5bdc9cf -//.word 0xefe62b4b -//.word 0xce919704 -//.word 0xeaa465c1 -//.word 0x82b6e65e -//.word 0x8e2cf713 -//.word 0xf5a1d6f9 -//.word 0x008c34c9 -//.word 0x0e1c8be7 -//.word 0x8a67b1a0 -//.word 0x1bc4aeb0 -//.word 0x1a75cb08 -//.word 0x498aebce -//.word 0xc2011ea4 -//.word 0x2d32742d -//.word 0x366b0fcd -//.word 0x3fd77cb1 -//.word 0x51a44410 -//.word 0x5964bdb0 -//.word 0x91b426ab -//.word 0x3c1cf373 -//.word 0x96376614 -//.word 0x0b145fb9 -//.word 0xa7db7572 -//.word 0xceb44534 -//.word 0x2de40a22 -//.word 0xf0396f0a -//.word 0x35a9a133 -//.word 0xc136a756 -//.word 0xf215f6ea -//.word 0xf50e40a4 -//.word 0x39268e3f -//.word 0x247c8e79 -//.word 0x04712e5e -//.word 0x480b69c8 -//.word 0xf09c6127 -//.word 0x429eaf7e -//.word 0xbfe2f7ae -//.word 0x55eabff7 -//.word 0xd69381bc -//.word 0xa9f6fe86 -//.word 0xc091d64c -//.word 0xc9a256f2 -//.word 0xa9d4910f -//.word 0x261db2f3 -//.word 0xe3e790e9 -//.word 0x926e83b9 -//.word 0x65697771 -//.word 0xc5ec3e65 -//.word 0x478d2b75 -//.word 0xdcc6dc8e -//.word 0x489a5774 -//.word 0xd57b59be -//.word 0x486cea22 -//.word 0x146335f2 -//.word 0xcef197e7 -//.word 0xe124f61e -//.word 0x83ad5460 -//.word 0xe73ea3a6 -//.word 0xb436dbdc -//.word 0xb7804be6 -//.word 0xd4b82ce1 -//.word 0x43907cab -//.word 0xf9730aa5 -//.word 0x6368cdb7 -//.word 0x5a387995 -//.word 0x54d35441 -//.word 0xd7f046d2 -//.word 0x34f43073 -//.word 0x71157fae -//.word 0x87bf01eb -//.word 0xce36f733 -//.word 0xb57e6b3a -//.word 0xb678c49d -//.word 0x894d9768 -//.word 0x980fc0db -//.word 0xb49eb26e -//.word 0x06c90b12 -//.word 0x48b66cba -//.word 0x3584871a -//.word 0x3d2e79ae -//.word 0x7eb35bff -//.word 0xf0741322 -//.word 0xdfdd7081 -//.word 0x9f4777de -//.word 0x7b1df794 -//.word 0xee3e6420 -//.word 0x16a3e1e1 -//.word 0x65429f1c -//.word 0x9a326643 -//.word 0xef0f7177 -//.word 0x94a07f4b -//.word 0x5db727cb -//.word 0xb8596cbd -//.word 0xe11f9126 -//.word 0x59dc2f10 -//.word 0x9480848b -//.word 0xf13d0ef2 -//.word 0xf0e8586f -//.word 0xa0a115c1 -//.word 0x56b66b3d -//.word 0xa4c59113 -//.word 0x89219cd3 -//.word 0xe6779630 -//.word 0x31b2d103 -//.word 0x6d1b7a93 -//.word 0x5ac57113 -//.word 0xe928586c -//.word 0xf20ceb3d -//.word 0x29a98f20 -//.word 0x4f0c2d30 -//.word 0xa5bc40c8 -//.word 0xa69e2d8d -//.word 0xf516d4ae -//.word 0x956f646a -//.word 0x587d73d3 -//.word 0x9a804ed2 -//.word 0x2e4c8d6c -//.word 0x99a7eb43 -//.word 0x7ef35560 -//.word 0x5a0d412f -//.word 0x727441cb -//.word 0x09aed87c -//.word 0xd5e78c7f -//.word 0xb4dc3c05 -//.word 0x9cf7b47d -//.word 0xd0bb7f16 -//.word 0x5a63fc80 -//.word 0xb5c6b5f3 -//.word 0xca7eeb73 -//.word 0x1e497652 -//.word 0x49afccf6 -//.word 0xaae65fdd -//.word 0x59f22cdd -//.word 0x5d1090b1 -//.word 0x1f555eb1 -//.word 0x1f9330e1 -//.word 0xe67cfa2d -//.word 0x3c0ae5f3 -//.word 0x9a1e5ac2 -//.word 0xe2675c62 -//.word 0x4e851c14 -//.word 0xa66ec71a -//.word 0xb711a37a -//.word 0x003a5a00 -//.word 0xaeb69682 -//.word 0xcbb7cd67 -//.word 0xb27a5f6a -//.word 0xc626de9c -//.word 0x63f8aca8 -//.word 0x159dcc5b -//.word 0x08dff264 -//.word 0xc084dc58 -//.word 0x0a73e5f9 -//.word 0x3319d8b7 -//.word 0x770b0277 -//.word 0xbced8b94 -//.word 0x81920623 -//.word 0x1164467c -//.word 0xfc0773f6 -//.word 0xc7395ef1 -//.word 0xe3fd121a -//.word 0xdcf8acea -//.word 0xd31b6c70 -//.word 0x2e820b51 -//.word 0x8e9c4f0d -//.word 0x018dde83 -//.word 0x7ad050b8 -//.word 0x7e2187d4 -//.word 0x1f9a436d -//.word 0x2e1cf108 -//.word 0xadf0c4dd -//.word 0x83ae07db -//.word 0x735eb2ec -//.word 0x4fde3b7a -//.word 0x6984ae32 -//.word 0x4b030008 -//.word 0xa8800000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x0000D348 -//// expected output -//.word 0x0c25d4a3 -//.word 0x5196e377 -//.word 0x1cff30a7 -//.word 0x452ab30e -//.word 0x68d71726 -//.word 0xcf0ab02a -//.word 0xa016432b -//.word 0x1d643dd9 -//.word 0x75e0702f -//.word 0x458086d8 -//.word 0xef7a35b9 -//.word 0x1d9faa6d -//.word 0x29e74588 -//.word 0x40e1acb0 -//.word 0x2e208b3d -//.word 0x79ece077 -//// SHA512LongMsgvector_68 -//// vector length -//.word 0x0000D660 -//// input message -//.word 0x4064b1cd -//.word 0xdf29c0c9 -//.word 0xadb380b2 -//.word 0xc1525074 -//.word 0x1f89fbc4 -//.word 0x7ec0986b -//.word 0x4f39aee2 -//.word 0xfa459c20 -//.word 0x6bb838b0 -//.word 0xcd9ab706 -//.word 0x951fcd13 -//.word 0xc3d91417 -//.word 0x642db2b7 -//.word 0x5c04374f -//.word 0x62c2c489 -//.word 0x4c7c722f -//.word 0x8d66f13d -//.word 0xfc8a703b -//.word 0xd7c0bdc9 -//.word 0x07daae7c -//.word 0xa51fbfe8 -//.word 0xbefbfcfe -//.word 0x53f42299 -//.word 0xa4e00153 -//.word 0xaf55249d -//.word 0xf362b40f -//.word 0x797c9afc -//.word 0x15bbe44a -//.word 0xea476a80 -//.word 0x2c0db121 -//.word 0x2ab60f39 -//.word 0x8bd91035 -//.word 0xd76f19f7 -//.word 0x3a884b2a -//.word 0x853daad3 -//.word 0x76e67f29 -//.word 0x398dfba7 -//.word 0x2ea21c5f -//.word 0xedefd591 -//.word 0x88cf697c -//.word 0x109b1874 -//.word 0x5a66fd35 -//.word 0x02ea3777 -//.word 0xb1c147c3 -//.word 0x9cd9b984 -//.word 0x4d220761 -//.word 0xa689baca -//.word 0x232ad2d1 -//.word 0x5fc1683c -//.word 0xda6292d8 -//.word 0xf96b8710 -//.word 0x4eb603bd -//.word 0x1a13ed40 -//.word 0x10f538cf -//.word 0x5c6b070c -//.word 0xe45214dc -//.word 0xceca5276 -//.word 0x42e6d1ba -//.word 0x71a8e2c5 -//.word 0xd62c7dc2 -//.word 0xbb23df02 -//.word 0x00837750 -//.word 0x187d037e -//.word 0x54b0f744 -//.word 0x649c1e4b -//.word 0x1b598384 -//.word 0x728892be -//.word 0xd08b7b78 -//.word 0x88f1d7f3 -//.word 0xa3348e8c -//.word 0xe1a7f849 -//.word 0xfaaa42b2 -//.word 0x292014e2 -//.word 0xeb2370dd -//.word 0x05f6de24 -//.word 0xc43ac687 -//.word 0x88651d3b -//.word 0x8471432c -//.word 0xbfd12c94 -//.word 0x5ea9bfcd -//.word 0x263e7b64 -//.word 0x3dac606e -//.word 0x30d70d1f -//.word 0x3aa32698 -//.word 0xc468f801 -//.word 0x28a060d8 -//.word 0xbae3e888 -//.word 0x0916343e -//.word 0x62df9df8 -//.word 0x965b1bdf -//.word 0xfd1468d6 -//.word 0xbb2d6253 -//.word 0x42e0b26d -//.word 0x192bab37 -//.word 0xdbc5744d -//.word 0x82576aac -//.word 0xe5e9c0c7 -//.word 0x809a68d7 -//.word 0x74953772 -//.word 0xce40445f -//.word 0x0cb791a9 -//.word 0xde78edf2 -//.word 0x2960180a -//.word 0x51d629c0 -//.word 0xb8462df8 -//.word 0x82d111fe -//.word 0x9c42c21a -//.word 0xfc449265 -//.word 0x2ad3deda -//.word 0xfff1edb0 -//.word 0xac9a1ce8 -//.word 0xfff93822 -//.word 0xe2dc2cb4 -//.word 0x2566dcfd -//.word 0x7d0350f7 -//.word 0xcca1150c -//.word 0xa21ee02b -//.word 0x04fc751a -//.word 0x6d5cc70e -//.word 0x132a6179 -//.word 0x6b950423 -//.word 0xefc2927c -//.word 0x1fc12a31 -//.word 0xc6c095fd -//.word 0x7e7ee1c2 -//.word 0x76034bd8 -//.word 0x738f63a4 -//.word 0x15d06a6d -//.word 0x5c57ff6c -//.word 0x6a4dfb22 -//.word 0x8b6299ef -//.word 0x7207dadf -//.word 0xc6dd27c7 -//.word 0xdd6d3891 -//.word 0xc71936d4 -//.word 0x8e521ca8 -//.word 0xbc0c63b8 -//.word 0x1e6fde98 -//.word 0xc8d0e359 -//.word 0x59dfab5b -//.word 0x8022fb63 -//.word 0xbfa204ed -//.word 0x6fe489c4 -//.word 0x051a3fcf -//.word 0x939b792e -//.word 0x92910486 -//.word 0xdef15098 -//.word 0x02b1d119 -//.word 0xb635a5bd -//.word 0xa60a7796 -//.word 0x75d6a39c -//.word 0x028f9b8d -//.word 0xeaec89f7 -//.word 0x4e193692 -//.word 0xd6af2ad4 -//.word 0xf5e315c0 -//.word 0x6ffe6dff -//.word 0x190d5931 -//.word 0xe0d9ce85 -//.word 0x0d19f787 -//.word 0xc8e7db3a -//.word 0xda713a67 -//.word 0xb7f1b734 -//.word 0xbbdf3df8 -//.word 0xb4649b4e -//.word 0xa1137169 -//.word 0xb9d450a7 -//.word 0xaf201d68 -//.word 0x3574b620 -//.word 0xbfffd8ab -//.word 0x899e41e1 -//.word 0xdb0b116b -//.word 0x8c5276d5 -//.word 0xc58488e3 -//.word 0x07ae7229 -//.word 0x6f0cd3d6 -//.word 0x397b64d1 -//.word 0x842dda07 -//.word 0x54a00e03 -//.word 0xddd15bbf -//.word 0xffad47b9 -//.word 0x0dc8664a -//.word 0xd2517c33 -//.word 0xd646e279 -//.word 0xdde42b74 -//.word 0xb1620622 -//.word 0x21de66c1 -//.word 0x4a98e19c -//.word 0x155e5625 -//.word 0x0147d344 -//.word 0x23a4b6ef -//.word 0x6b3412fb -//.word 0x28975431 -//.word 0xce0526a5 -//.word 0xf7409343 -//.word 0xa9c76cab -//.word 0xd74deb3f -//.word 0x2a699779 -//.word 0x018f6783 -//.word 0xb63f2a01 -//.word 0x237c2631 -//.word 0x64800037 -//.word 0xdfaedcb2 -//.word 0x82c8c493 -//.word 0x4c624e2f -//.word 0x0f977993 -//.word 0x74fad917 -//.word 0x3fcff436 -//.word 0xd47ceb9c -//.word 0xfa3a5d81 -//.word 0xe0108836 -//.word 0x5e02b1fd -//.word 0x7c86c61e -//.word 0x38374337 -//.word 0x84cd52d4 -//.word 0x8f4d363f -//.word 0x457de99a -//.word 0x199b042a -//.word 0x024ee0f6 -//.word 0xc3ddfb91 -//.word 0x709f9d34 -//.word 0x2eb3bb0f -//.word 0x3af01be1 -//.word 0x2d1fb9c7 -//.word 0x7e686a51 -//.word 0x480bbfdb -//.word 0x4d512c1b -//.word 0x3cc169f6 -//.word 0x2f961998 -//.word 0x7871aac3 -//.word 0x9d4c7c67 -//.word 0xa1af4574 -//.word 0x8526b4ec -//.word 0x0ff2543c -//.word 0xcaffb4cc -//.word 0x4e16c5d5 -//.word 0xc1548373 -//.word 0x9edbd7fb -//.word 0xb5c7bc8e -//.word 0x7464a2ee -//.word 0x649e0f91 -//.word 0xf6b88cf4 -//.word 0x8041bf32 -//.word 0x8344d5d5 -//.word 0x2fc023ec -//.word 0x29570c5e -//.word 0x8b4a257d -//.word 0x2da597de -//.word 0x23b7c569 -//.word 0x86c52fac -//.word 0x78009674 -//.word 0x62b3629f -//.word 0x80c1402c -//.word 0xa04f0f94 -//.word 0x26befd5d -//.word 0x54dcedec -//.word 0xc85b1d9b -//.word 0x4682050b -//.word 0xb82282bc -//.word 0x73cc33da -//.word 0xbc41235a -//.word 0x8b2aa946 -//.word 0x8f098d55 -//.word 0x71706cbf -//.word 0x5d715e4f -//.word 0xbf55d5ba -//.word 0x4a90c92f -//.word 0x3ff5122f -//.word 0xec27159f -//.word 0x7350a21c -//.word 0xcc151d8e -//.word 0x0dc9dc00 -//.word 0xe9e0d1af -//.word 0x77a76960 -//.word 0x3533b3f7 -//.word 0x4d97c546 -//.word 0x175b5c23 -//.word 0xde29c2bd -//.word 0xe7c8f530 -//.word 0xaf4f0556 -//.word 0x7592bee0 -//.word 0xf8e187a6 -//.word 0x82f28a3c -//.word 0x251b15c6 -//.word 0x45c4400d -//.word 0x571dd1d2 -//.word 0xe70c5c62 -//.word 0xe06aaf6a -//.word 0x086e6d0d -//.word 0xca69f834 -//.word 0x38b49425 -//.word 0x50e7ca58 -//.word 0x7e4c0b85 -//.word 0x63949602 -//.word 0xd5c89c4c -//.word 0x2782a1e4 -//.word 0xaa5c255c -//.word 0x73a984b1 -//.word 0x5f631bdb -//.word 0x5565aca3 -//.word 0xcbda03b5 -//.word 0x8cf6daf6 -//.word 0xb8e4fb17 -//.word 0x0cffa46b -//.word 0x63442ff5 -//.word 0x7d07f2c6 -//.word 0x00e66586 -//.word 0xbcfc8250 -//.word 0x335772c3 -//.word 0x59ab6555 -//.word 0x9847c2eb -//.word 0x174980a7 -//.word 0x3c0ed301 -//.word 0x70ed0c1a -//.word 0x2225ba4c -//.word 0x0e131606 -//.word 0xbfa99ed7 -//.word 0x521bffc8 -//.word 0x7edb38ef -//.word 0xd1c8fd41 -//.word 0x3ca359a8 -//.word 0xd2c29856 -//.word 0xcd086458 -//.word 0xd2142e6e -//.word 0x76b9d01a -//.word 0x00ae70f7 -//.word 0x7087a74c -//.word 0xc1e4e2e1 -//.word 0x6ce90911 -//.word 0x2dee5f21 -//.word 0x0977aad0 -//.word 0x9066932f -//.word 0x606f4fb3 -//.word 0xeacd7f89 -//.word 0x79335529 -//.word 0x7006f92e -//.word 0xd2c92b65 -//.word 0x08d92924 -//.word 0xdf5ad3dd -//.word 0xd1710df2 -//.word 0x85b365cb -//.word 0x99def627 -//.word 0x9ec78baf -//.word 0x649408d1 -//.word 0x782b06cb -//.word 0xecebbe06 -//.word 0x569928a6 -//.word 0x1b9d645f -//.word 0xee6e588a -//.word 0x934b9b78 -//.word 0xe92c9106 -//.word 0x27f8d871 -//.word 0x66f8e36c -//.word 0x608ce570 -//.word 0x771cf154 -//.word 0xf9525f1d -//.word 0xa2867117 -//.word 0x627a3725 -//.word 0x6148af55 -//.word 0x419831b7 -//.word 0xa3160a70 -//.word 0xec24680a -//.word 0x49cb760e -//.word 0xf0f8c7d5 -//.word 0xa9e5f89b -//.word 0x8dd591d5 -//.word 0x0e042dc4 -//.word 0x38dedb4b -//.word 0x376fc3fe -//.word 0x181b0d7b -//.word 0xd48ffefd -//.word 0x8af7642e -//.word 0x0c71353d -//.word 0x9dc27331 -//.word 0xf949527d -//.word 0x96319dd4 -//.word 0x2aea563e -//.word 0x6dd99d6c -//.word 0x204ed248 -//.word 0x4eb7fed1 -//.word 0xd2146f26 -//.word 0x19aba3e0 -//.word 0x29fd68a5 -//.word 0xe2f840fb -//.word 0x846e0a59 -//.word 0x72c6df84 -//.word 0x36f23b19 -//.word 0xc4a15d65 -//.word 0x03b5f07d -//.word 0x89f7ea8b -//.word 0xa609b567 -//.word 0xa59d8d67 -//.word 0x4ee52977 -//.word 0xb04a9d6c -//.word 0x1d617f95 -//.word 0x751b4893 -//.word 0xa83cfe6b -//.word 0x760e10da -//.word 0x795682e9 -//.word 0x668749c0 -//.word 0x9036f9bf -//.word 0xadce9dcb -//.word 0xdd85e6e6 -//.word 0xe88e8903 -//.word 0xc790e218 -//.word 0x6758dd74 -//.word 0xa9cb1653 -//.word 0xad1e3fb0 -//.word 0x5049c35a -//.word 0xf3b8a84a -//.word 0x7f44ba34 -//.word 0xa563e65c -//.word 0x6b9be4ab -//.word 0xe43d1902 -//.word 0x3e4fbbce -//.word 0x03ca36dd -//.word 0x9806ce70 -//.word 0x0a728691 -//.word 0x098841a6 -//.word 0x35002847 -//.word 0x99444b4d -//.word 0x75258b2b -//.word 0x41ccb782 -//.word 0xeef3f5ef -//.word 0x6f556428 -//.word 0x7862ff47 -//.word 0x8638c565 -//.word 0x1fcf176b -//.word 0x5b736125 -//.word 0xa378fc98 -//.word 0xb9295396 -//.word 0xf801458f -//.word 0xde1ecbaa -//.word 0xc7f2db14 -//.word 0xfb3c8c98 -//.word 0xeb367a71 -//.word 0xb8106c5c -//.word 0xf59e34f1 -//.word 0xae4ed732 -//.word 0xa95cee65 -//.word 0xeb494c1f -//.word 0x7e89e1a2 -//.word 0x727cde68 -//.word 0x229f1a00 -//.word 0xb904b519 -//.word 0xf4fffbdd -//.word 0x29238b80 -//.word 0x886cb818 -//.word 0xa1be2faf -//.word 0x268eda96 -//.word 0xf2df05fd -//.word 0x4b71c0c1 -//.word 0x64358485 -//.word 0x26031904 -//.word 0x308fb6a5 -//.word 0x1d9a6b51 -//.word 0x0565bc81 -//.word 0x466b8f9b -//.word 0x844f487e -//.word 0xee14325b -//.word 0xc38c21c8 -//.word 0x1513550f -//.word 0xce7da2cc -//.word 0xf04cceb7 -//.word 0x21263bbe -//.word 0x6687c557 -//.word 0x2fb4ee14 -//.word 0x94f03977 -//.word 0xdef1d309 -//.word 0x499578a6 -//.word 0x08d2951b -//.word 0x8aebaaf3 -//.word 0xfceaf38d -//.word 0x0f4a4772 -//.word 0xfbf440e6 -//.word 0xc46d9cbd -//.word 0xbb4de370 -//.word 0x49f34a70 -//.word 0xe877d8ba -//.word 0x72e0c7ac -//.word 0x9e972d17 -//.word 0xc71cdc95 -//.word 0xf0f8861d -//.word 0x06f325d4 -//.word 0x64869926 -//.word 0x9d939316 -//.word 0x7554b3d2 -//.word 0x3092ed8b -//.word 0x10173183 -//.word 0x19654b68 -//.word 0x17a808e0 -//.word 0xe2ea9a65 -//.word 0xe1863d53 -//.word 0xcddf1b3f -//.word 0xb7516d8b -//.word 0x4d68e437 -//.word 0x595047fa -//.word 0x8a8d5d92 -//.word 0x77ec0d58 -//.word 0xe1bac417 -//.word 0x3833171e -//.word 0x613daa94 -//.word 0xb757500c -//.word 0x50cc7359 -//.word 0x812cb7a4 -//.word 0xa4fcdabc -//.word 0x18addfac -//.word 0x8acb6b93 -//.word 0x73776fb0 -//.word 0xe21707bd -//.word 0x7c4ca27e -//.word 0xc1256499 -//.word 0x9192c8a8 -//.word 0xee1b8a8d -//.word 0x03d1c405 -//.word 0x65855781 -//.word 0x9a398c31 -//.word 0xd8d4fb61 -//.word 0x0e1aac08 -//.word 0x29da7d9e -//.word 0x9069c32f -//.word 0xf05034ae -//.word 0x3f42058b -//.word 0xfb514f87 -//.word 0xb361b7c8 -//.word 0xc9dc4e28 -//.word 0x76a7b6d3 -//.word 0x0e558711 -//.word 0x869bf060 -//.word 0x3304a2c6 -//.word 0xd4e6e965 -//.word 0xd3951c50 -//.word 0xc8d6389d -//.word 0x3f97c8bc -//.word 0xbbdd0807 -//.word 0xfbfd4999 -//.word 0x7b0f9764 -//.word 0x3ea09a7e -//.word 0xcba7babc -//.word 0x76ba8682 -//.word 0xe08257d9 -//.word 0xc16d30c2 -//.word 0xe5a2e9cb -//.word 0x753a8ddf -//.word 0x78ad0062 -//.word 0x998ae57e -//.word 0x2b6cbeb7 -//.word 0x6a2955c6 -//.word 0x044c5ca4 -//.word 0xd8c650e5 -//.word 0xfde0a347 -//.word 0x0674198b -//.word 0x845d7383 -//.word 0xcd2c4b6d -//.word 0xfc1c3f7f -//.word 0x394951c3 -//.word 0x3b1c8e25 -//.word 0x0a0aeecb -//.word 0x0a7e7ca4 -//.word 0x3513b644 -//.word 0xa80737ef -//.word 0x61ed93f3 -//.word 0x47a1833b -//.word 0x6a814222 -//.word 0x8dda3685 -//.word 0xe2a1d31c -//.word 0x1464bd0a -//.word 0x8a7f2cb2 -//.word 0xeb9395cd -//.word 0xdd3487b9 -//.word 0x13e2d314 -//.word 0x863bef8a -//.word 0x026e9ceb -//.word 0xe5f3c781 -//.word 0x247aada0 -//.word 0x8e21437e -//.word 0x55e9d545 -//.word 0xca6bed67 -//.word 0x68c77632 -//.word 0x14de21a4 -//.word 0xa3c10880 -//.word 0x9d6892a1 -//.word 0x40a8968f -//.word 0xc85fc350 -//.word 0xeef23f81 -//.word 0xaff98ea5 -//.word 0x4e38b6bc -//.word 0x9cd2a018 -//.word 0x77b9c26c -//.word 0x9169fb26 -//.word 0x73d6befe -//.word 0xc1a273cf -//.word 0xbf941aa6 -//.word 0x14463219 -//.word 0xce1dd9db -//.word 0xa77e348d -//.word 0x863f11d6 -//.word 0x495ccbb5 -//.word 0xc2ec6e16 -//.word 0xff531ca4 -//.word 0xcfb8b0df -//.word 0x81baa06e -//.word 0xef5e28b6 -//.word 0xbc4ca5ab -//.word 0xd93c3fe6 -//.word 0x4eabcaf9 -//.word 0x37d2eeff -//.word 0x0cd88677 -//.word 0x26474752 -//.word 0x7fbda24a -//.word 0xbae4eb76 -//.word 0x63a3ba1b -//.word 0x779692c6 -//.word 0x27bcc097 -//.word 0xd97086e0 -//.word 0x709b79ef -//.word 0xcd272827 -//.word 0x95b7fe56 -//.word 0x35956a42 -//.word 0x24eb3c85 -//.word 0x6837539b -//.word 0x5cf9753a -//.word 0xb0ae7ee1 -//.word 0xb102bdb4 -//.word 0xcb429b87 -//.word 0x4c107d39 -//.word 0x6a5aec43 -//.word 0x888df490 -//.word 0xb505c990 -//.word 0x76c9b188 -//.word 0xc5751d2c -//.word 0x5977196f -//.word 0x287ee79a -//.word 0x2b30e79b -//.word 0x611cbba0 -//.word 0x16efa7e5 -//.word 0x65ea3eca -//.word 0xfc933b29 -//.word 0x1fabade6 -//.word 0xf06157c8 -//.word 0xedc55687 -//.word 0xba7f0426 -//.word 0x21c11d82 -//.word 0x577a202c -//.word 0x80cdf874 -//.word 0x76c1dcc6 -//.word 0xc63a743a -//.word 0xfc283d66 -//.word 0x21fe2e77 -//.word 0x81669c80 -//.word 0xb2325b11 -//.word 0xd196260c -//.word 0x0f9540b4 -//.word 0x6cba5c07 -//.word 0xc308bb4e -//.word 0x073394f2 -//.word 0xcc11b891 -//.word 0x094b7651 -//.word 0x1c58bc74 -//.word 0x0eac802d -//.word 0x192c5eb2 -//.word 0x67e68393 -//.word 0x1dffc94a -//.word 0x98ec2313 -//.word 0xf6e53cfe -//.word 0xd9975b42 -//.word 0x671a8ad4 -//.word 0x9622f738 -//.word 0xa6799a98 -//.word 0xefad1813 -//.word 0xdc06e857 -//.word 0x38bab472 -//.word 0xa86402e5 -//.word 0x79b313fa -//.word 0x9c5f0b58 -//.word 0xef6253d5 -//.word 0xbf643c8b -//.word 0x8a77e52e -//.word 0x09045e9d -//.word 0x6d050db6 -//.word 0xea75516f -//.word 0x72056622 -//.word 0xc3118929 -//.word 0xa3d25cab -//.word 0x6ad58bb5 -//.word 0xc2acb08d -//.word 0xabe37443 -//.word 0xc236f788 -//.word 0xc20073c3 -//.word 0x4bf71c62 -//.word 0xe2174a6e -//.word 0x3adcd963 -//.word 0xb1b4d03e -//.word 0x1eb442d7 -//.word 0xca8a7271 -//.word 0xbcb33a90 -//.word 0x3aeeae0b -//.word 0x8cf0fc61 -//.word 0x03599750 -//.word 0x3ae794a4 -//.word 0x9ce9544e -//.word 0x26f763b5 -//.word 0x6ee1a051 -//.word 0xe5e59e75 -//.word 0x59254b6c -//.word 0xbe58cfc8 -//.word 0x2dbfb7f7 -//.word 0x2d5a5317 -//.word 0x325d5c0b -//.word 0x63dedacf -//.word 0xa0d04508 -//.word 0xc434ebe0 -//.word 0x278e9110 -//.word 0x68965d3e -//.word 0x6931f48a -//.word 0x9a9fdf64 -//.word 0x7bf633a0 -//.word 0x5ccf71cc -//.word 0x673fabc1 -//.word 0xe109e878 -//.word 0xad11ca1f -//.word 0x12146e6c -//.word 0xbe979432 -//.word 0x0a1d0032 -//.word 0x7f9d2033 -//.word 0x9933ee55 -//.word 0xcc1618a2 -//.word 0xc5ca5ee6 -//.word 0xf2973cc0 -//.word 0x4439cafa -//.word 0x34d9e016 -//.word 0x043c7d29 -//.word 0x473b6aed -//.word 0xa3731a11 -//.word 0xd63dd5d3 -//.word 0xf7e116d1 -//.word 0xfe06311c -//.word 0x876d388f -//.word 0xd3df205f -//.word 0x106420f2 -//.word 0xdab65af5 -//.word 0x01f5bda9 -//.word 0x8d9c2a7d -//.word 0xffb4d5e2 -//.word 0xda48ef5b -//.word 0x621882d3 -//.word 0xa4919c34 -//.word 0xb6fdaf35 -//.word 0x40f83874 -//.word 0x3b239fc4 -//.word 0xf91c5ec8 -//.word 0x66ad66c1 -//.word 0x8d43bea4 -//.word 0x5ea26e70 -//.word 0xaed89bbe -//.word 0x7f6ff399 -//.word 0x82e74c91 -//.word 0xda64870b -//.word 0x23a3bbdb -//.word 0xb3329015 -//.word 0x1fe1e81f -//.word 0x0174c50b -//.word 0xf99a6724 -//.word 0xf223b4c7 -//.word 0xa76ddd75 -//.word 0x651f3f25 -//.word 0x121a87df -//.word 0x6ead1a86 -//.word 0x9908b4f6 -//.word 0xd6f44e4f -//.word 0x8ec1468f -//.word 0x987fba67 -//.word 0xb7713447 -//.word 0x64be8dbc -//.word 0xce6a0bfb -//.word 0x2085cdbe -//.word 0x02a2694e -//.word 0x628bd3e1 -//.word 0x74338127 -//.word 0xf7eccc20 -//.word 0xbbda9a30 -//.word 0x60a83a75 -//.word 0x60798f58 -//.word 0x50227162 -//.word 0x62965052 -//.word 0x2fa11a6c -//.word 0xb3da5f13 -//.word 0x99d3b49a -//.word 0xb9925558 -//.word 0xe0450efa -//.word 0xcf315b1d -//.word 0x86ecce1d -//.word 0xc2ccb127 -//.word 0xc49fed96 -//.word 0x549c2a7c -//.word 0x069a387e -//.word 0xbc80ade6 -//.word 0x6cfdd0f3 -//.word 0x2379b673 -//.word 0x4a4bab94 -//.word 0x292cd4f8 -//.word 0xa9eb1207 -//.word 0x5e632889 -//.word 0xc4ab2174 -//.word 0xc98cec02 -//.word 0x8c384a07 -//.word 0x6538ea82 -//.word 0x25a7d172 -//.word 0x9f9e00eb -//.word 0x67ef5168 -//.word 0xd916a363 -//.word 0x5d6c3623 -//.word 0xea9e58d6 -//.word 0xc95e42df -//.word 0x9c583d71 -//.word 0x9e68095d -//.word 0x2c0a7e28 -//.word 0x85127461 -//.word 0xce9de131 -//.word 0x59474134 -//.word 0x269e3b87 -//.word 0xaad78123 -//.word 0xd0c0f869 -//.word 0x3ef619fd -//.word 0xd95897d8 -//.word 0x8bbb4199 -//.word 0x44e02b1c -//.word 0x3ea3084e -//.word 0x8674db40 -//.word 0xb80bcf7a -//.word 0x09586291 -//.word 0x8bb9c9fc -//.word 0xad709023 -//.word 0x015482b9 -//.word 0x43c6c84c -//.word 0x96e7551a -//.word 0x10098127 -//.word 0x7963f38c -//.word 0x5008c512 -//.word 0x0f1ae3ff -//.word 0xb13ab430 -//.word 0x7044fd68 -//.word 0xd33902e8 -//.word 0xe87dee40 -//.word 0xce437464 -//.word 0x7745b702 -//.word 0xacb86713 -//.word 0x527f2db1 -//.word 0xeb9f4a28 -//.word 0x60f37b4f -//.word 0xfd211f19 -//.word 0xbdcc9b67 -//.word 0xc80bfe20 -//.word 0x3a1ae184 -//.word 0x265092bd -//.word 0xdb5171b7 -//.word 0x65859932 -//.word 0x57c9c316 -//.word 0xc8646806 -//.word 0x9c3c2637 -//.word 0x054a6583 -//.word 0x484b3ab9 -//.word 0xc5b88c38 -//.word 0x32f975bc -//.word 0x27d6ea77 -//.word 0xdf2e9f64 -//.word 0x3deb25d8 -//.word 0x0d35555a -//.word 0x8de6f2b4 -//.word 0x2b3e8a4a -//.word 0x91d99dab -//.word 0xdfdd0266 -//.word 0x3778851f -//.word 0x7f8ad5e1 -//.word 0x629e9eb6 -//.word 0x981ff275 -//.word 0x68c9eddc -//.word 0x6b5d99de -//.word 0x92990f3e -//.word 0x6a67df5d -//.word 0x9f55b251 -//.word 0xc0452e36 -//.word 0x41651ac9 -//.word 0xc662c333 -//.word 0x9fd99e22 -//.word 0x8e0f2e1e -//.word 0xd1e1281b -//.word 0x5cfed64a -//.word 0x6753b935 -//.word 0x28c7720b -//.word 0xe229e338 -//.word 0x1e669139 -//.word 0x38004caf -//.word 0x1ebb13b2 -//.word 0x559a3267 -//.word 0x3d09add5 -//.word 0x955ce1f4 -//.word 0x41786907 -//.word 0x4bd03f2c -//.word 0x29942332 -//.word 0x3e2441aa -//.word 0xa3cb0e41 -//.word 0x26aa734d -//.word 0x93f22da5 -//.word 0x335774b6 -//.word 0x93c1dad3 -//.word 0x864477cd -//.word 0x6d5243c4 -//.word 0xb62fc33c -//.word 0xa3a6e873 -//.word 0x4dfb34f3 -//.word 0xe8201e63 -//.word 0x482bb8a2 -//.word 0xa4088f17 -//.word 0x9b6bd242 -//.word 0x7409b797 -//.word 0xaa081b8d -//.word 0xa8b469f2 -//.word 0xd173bc81 -//.word 0xc3fb48b6 -//.word 0xddc2f6e1 -//.word 0xffb64e7a -//.word 0x902f9ab4 -//.word 0xc6224854 -//.word 0x219791c4 -//.word 0x395d5863 -//.word 0xbafc5520 -//.word 0xadeb7247 -//.word 0xf903759a -//.word 0x2934e0a4 -//.word 0x6f77154a -//.word 0xe903bea3 -//.word 0x24c46c0a -//.word 0xdf097e71 -//.word 0x117d45f8 -//.word 0x2d5866be -//.word 0xa4d67ff6 -//.word 0xabe90d3e -//.word 0x402a8d2d -//.word 0x6716e12b -//.word 0xba77f686 -//.word 0x2020a4c2 -//.word 0xddddd530 -//.word 0xcbaaeac2 -//.word 0xe6235a1d -//.word 0x0e3c9cf0 -//.word 0x09324884 -//.word 0xc8c27995 -//.word 0xeb987561 -//.word 0x870a90fe -//.word 0x26064df0 -//.word 0x0f49c7fb -//.word 0xc8d24f36 -//.word 0xda975761 -//.word 0xd4768f78 -//.word 0x926e4d88 -//.word 0xbf0f32c2 -//.word 0x992f0bce -//.word 0xf4dff562 -//.word 0x829ec512 -//.word 0x51cca66a -//.word 0x9561043a -//.word 0xa8dea931 -//.word 0x4f8426ad -//.word 0x3fc475d2 -//.word 0xe0f8dcda -//.word 0x505014ab -//.word 0xab0fabaf -//.word 0x8af7a7e0 -//.word 0xc9016c22 -//.word 0x8e52e0d6 -//.word 0x866bccac -//.word 0x72a086b8 -//.word 0xe3cbcdc9 -//.word 0x4141f4f6 -//.word 0x12054379 -//.word 0x793c9ac1 -//.word 0xfde157c2 -//.word 0x8cba7a90 -//.word 0xc08b072c -//.word 0x6189ac9d -//.word 0x2a11a443 -//.word 0xd09adb69 -//.word 0x40e95319 -//.word 0x2884c634 -//.word 0xba688dc2 -//.word 0xadfec086 -//.word 0x844c9fd5 -//.word 0x126830a9 -//.word 0x3e332af2 -//.word 0x0443122c -//.word 0xbc21a436 -//.word 0x9fb57462 -//.word 0x87fed5c9 -//.word 0xf607fae1 -//.word 0x5a165b51 -//.word 0x8f265a03 -//.word 0xa697277b -//.word 0xe525e168 -//.word 0x0e17fe79 -//.word 0xe5b8ec72 -//.word 0xec0bf87f -//.word 0x71bb70c8 -//.word 0xca510445 -//.word 0xe0a972d4 -//.word 0xeaa76389 -//.word 0x7b268f45 -//.word 0xbf31288a -//.word 0x0176768d -//.word 0x71f7bf8d -//.word 0x25036964 -//.word 0x5d65625c -//.word 0x0bdbc043 -//.word 0x93caa5c2 -//.word 0xcf2f66ea -//.word 0x56d9ec10 -//.word 0xfed65adb -//.word 0x9f2bef9b -//.word 0x1ac82fdc -//.word 0x9aba3d3c -//.word 0x1aa38c79 -//.word 0x2867b6ce -//.word 0xe829ac80 -//.word 0x5b7610b4 -//.word 0xe1bfdf83 -//.word 0xfd0d5350 -//.word 0x59f00859 -//.word 0x0ab85d8d -//.word 0x14e81d9e -//.word 0x31e85f56 -//.word 0xcefaaa2e -//.word 0x576f5d1d -//.word 0xb41b4eae -//.word 0x1406b255 -//.word 0xe9643d03 -//.word 0x33c88af8 -//.word 0x0294bcd9 -//.word 0x36b46602 -//.word 0x8a8ca81d -//.word 0xd12e9bf3 -//.word 0x7fd1ef83 -//.word 0x6a7fd351 -//.word 0xd20d1501 -//.word 0x9f508b24 -//.word 0xeb8eb152 -//.word 0xc0339379 -//.word 0x23c5ee74 -//.word 0x511a92e0 -//.word 0x48c90a2b -//.word 0x89de7fed -//.word 0x1dd2da7c -//.word 0xd6ba29bb -//.word 0xd7be4432 -//.word 0x56cdb064 -//.word 0xa18fc35c -//.word 0x5f9b098a -//.word 0x19ebe7cd -//.word 0xf98c7ed1 -//.word 0xd19ad29b -//.word 0x5e6c2c62 -//.word 0xcf0cbda1 -//.word 0x81ea836a -//.word 0x0dd171fd -//.word 0x8419ca99 -//.word 0xf91fce92 -//.word 0x40f298a4 -//.word 0xf64f4787 -//.word 0xc1d05cc3 -//.word 0xd96063c6 -//.word 0xc8f2d634 -//.word 0x6e733e7e -//.word 0x47fc9bb6 -//.word 0xf14d06a2 -//.word 0xe877950f -//.word 0x95d87f67 -//.word 0x874c8086 -//.word 0x00a27fca -//.word 0xb34d6f69 -//.word 0xcc5c7308 -//.word 0x31ad4589 -//.word 0x075dd824 -//.word 0x79823cb9 -//.word 0xb41dc364 -//.word 0x364a6253 -//.word 0x49ba59d4 -//.word 0xca6316b2 -//.word 0x2f7657c2 -//.word 0xc99290b9 -//.word 0x45378c40 -//.word 0x797d564b -//.word 0x5e065aa6 -//.word 0x5831c8d0 -//.word 0xbe90390d -//.word 0x969d95b7 -//.word 0xa0a834d5 -//.word 0x971443ef -//.word 0xb3c36a20 -//.word 0x72cfab6c -//.word 0x987b8e54 -//.word 0x74697ba8 -//.word 0x660d679d -//.word 0x9e61b31f -//.word 0x26da5068 -//.word 0x239b28d2 -//.word 0x58eab9e9 -//.word 0xebe003c5 -//.word 0x6c64a597 -//.word 0x135a4381 -//.word 0x49172aab -//.word 0x6a183793 -//.word 0xcaf4f5a4 -//.word 0xf690050b -//.word 0x3c92c3c6 -//.word 0x6d1826fd -//.word 0xe1a9e896 -//.word 0xbc6ce704 -//.word 0x7097cc5f -//.word 0x832beaba -//.word 0x93df69b1 -//.word 0x9759a341 -//.word 0x67a4cedd -//.word 0x7fdfdcbd -//.word 0xff329f7a -//.word 0xf70731d8 -//.word 0xe27693e2 -//.word 0x7000943d -//.word 0x8981f4b6 -//.word 0x8e60ca1d -//.word 0xe2092356 -//.word 0xa99decad -//.word 0xcfe7126a -//.word 0x4c93e7a5 -//.word 0xa79ac85c -//.word 0xb901fdc3 -//.word 0xb4c3e0db -//.word 0x640c4146 -//.word 0xb4a70a5a -//.word 0x73ba1f74 -//.word 0x58b1888f -//.word 0x4478d215 -//.word 0xc8edb2f4 -//.word 0xe795ecf5 -//.word 0x1d8d734a -//.word 0xa0c4d265 -//.word 0xe568ca11 -//.word 0x669e3dbb -//.word 0xa3764b10 -//.word 0x661ebace -//.word 0x4c569bd3 -//.word 0x81232a7b -//.word 0xcbc8f728 -//.word 0xcaf24322 -//.word 0x7e33ada2 -//.word 0x09b10e29 -//.word 0xb620a116 -//.word 0x3bed6778 -//.word 0x3bbcc921 -//.word 0x0f1580fc -//.word 0xc65ab2a0 -//.word 0x6afd5d24 -//.word 0x85eff935 -//.word 0xe45c5967 -//.word 0x9b95d3c9 -//.word 0x4a4ea0bc -//.word 0x9e098505 -//.word 0x1ad2b320 -//.word 0x172dedd7 -//.word 0x094de814 -//.word 0x0586f7f4 -//.word 0x8005e81c -//.word 0x5abf2850 -//.word 0x1ba72e42 -//.word 0x7c2417a7 -//.word 0x29c28e90 -//.word 0xc528eff8 -//.word 0x2e4aac99 -//.word 0x03dfef05 -//.word 0x641681f1 -//.word 0xf984ead4 -//.word 0x3661dab1 -//.word 0xddf5c730 -//.word 0xc44dd8f4 -//.word 0xd8320229 -//.word 0x625c715c -//.word 0x89e22990 -//.word 0x18f5ed8e -//.word 0x82ce5f7c -//.word 0x24e56ab1 -//.word 0xc964ddc8 -//.word 0x73db58f3 -//.word 0x59356c92 -//.word 0x2cebfe05 -//.word 0x9e77ecbe -//.word 0x250cf49a -//.word 0xfc84d171 -//.word 0x6c9aa6ec -//.word 0x4959a096 -//.word 0xbfd4d736 -//.word 0x4f18765d -//.word 0x145f1c3b -//.word 0x4b8682b6 -//.word 0x12c15dbe -//.word 0x708e86da -//.word 0x96e75807 -//.word 0x64bc59c3 -//.word 0x2fa01d65 -//.word 0xc2c368af -//.word 0xa22093a6 -//.word 0x97f731a1 -//.word 0x677ef2a1 -//.word 0xe5d4c7e0 -//.word 0x2a3646ad -//.word 0x23755176 -//.word 0x4ca7f227 -//.word 0xba1d8ab3 -//.word 0x5f962bef -//.word 0x8ab242a7 -//.word 0xadaa79ec -//.word 0x633ddbab -//.word 0xb1ee3984 -//.word 0x8c6ccdd8 -//.word 0x9c521e24 -//.word 0x4010238e -//.word 0xd229abbe -//.word 0x2ca0fdef -//.word 0x6bacbb46 -//.word 0xf3b30c62 -//.word 0xb376f934 -//.word 0xaa8a1811 -//.word 0xa9076805 -//.word 0x5b847d6b -//.word 0x8442ddba -//.word 0x86a7a9a2 -//.word 0x29ee8058 -//.word 0x9b1ea02e -//.word 0xb6384e66 -//.word 0x82b57948 -//.word 0xfb2f9a72 -//.word 0x145fde70 -//.word 0xfb47878c -//.word 0x9fb08fe7 -//.word 0x70d78fc9 -//.word 0x6564e036 -//.word 0x449b00c2 -//.word 0x1ed637a6 -//.word 0x18337a12 -//.word 0x728a8fc5 -//.word 0xc1a272dc -//.word 0x7fa4f8e7 -//.word 0xc6cfb242 -//.word 0x596e14a3 -//.word 0xe407d6ef -//.word 0x85d69b52 -//.word 0x8a79d18e -//.word 0x7dedd893 -//.word 0x5eb96651 -//.word 0x2f692aca -//.word 0xb63eaf6b -//.word 0x7e24849c -//.word 0x1fe49a96 -//.word 0xbf9bed74 -//.word 0xd96b668d -//.word 0x3d700002 -//.word 0x58f62b93 -//.word 0xb6e96eb7 -//.word 0xc58c4feb -//.word 0xdc6e774a -//.word 0x7b9b125e -//.word 0xd50f7536 -//.word 0x8b7003b8 -//.word 0xbbfc5139 -//.word 0x39c0884b -//.word 0x1c0a0bd6 -//.word 0x7d225a6b -//.word 0x7b3537d4 -//.word 0x829207f0 -//.word 0xce197abe -//.word 0x2aef6eb7 -//.word 0xfe771161 -//.word 0x887e4621 -//.word 0x6ab64b50 -//.word 0x65669892 -//.word 0x645f0a63 -//.word 0xbc3240f3 -//.word 0xb2a04634 -//.word 0x3e527031 -//.word 0x0ecb89a1 -//.word 0xce9a2dbc -//.word 0xa7d4744d -//.word 0x05c1d109 -//.word 0x9ed6391f -//.word 0xb0e38710 -//.word 0x898e1fc1 -//.word 0x4d00d1cf -//.word 0xf4de0122 -//.word 0x927b05c5 -//.word 0xdb4ccff4 -//.word 0xe69ccc77 -//.word 0x31800b2f -//.word 0xe60ea2ef -//.word 0x5cca4e8d -//.word 0xe1615938 -//.word 0xb79ac10b -//.word 0x5c8996e3 -//.word 0x0e06a46e -//.word 0x8f5d5285 -//.word 0x2647cabc -//.word 0xe6195a37 -//.word 0x323c1abf -//.word 0x81ddd014 -//.word 0x5fe51085 -//.word 0xb52ca8bf -//.word 0x49e93be3 -//.word 0x886e2bdb -//.word 0x8412bced -//.word 0x396e7790 -//.word 0x14cccd7f -//.word 0xb6dcfd0d -//.word 0xf5a938b8 -//.word 0x23cc0200 -//.word 0x93dfdb7a -//.word 0x5a351f20 -//.word 0x53c82beb -//.word 0x6673c1a4 -//.word 0x0962aef7 -//.word 0x06c6a9c9 -//.word 0x7fcd7fcb -//.word 0x30d16d4f -//.word 0xf5d0cd5b -//.word 0x8c1cf6fc -//.word 0x9b535ddd -//.word 0xf5920018 -//.word 0x19e6044c -//.word 0xfc039cf0 -//.word 0x08392ee7 -//.word 0x64a3b154 -//.word 0x76a25aaf -//.word 0xa6897719 -//.word 0x659a9bec -//.word 0x6e32fb97 -//.word 0x4c4018a9 -//.word 0x1dfb9e2b -//.word 0x95d58c33 -//.word 0x46aa96b6 -//.word 0x1e3ec89e -//.word 0x31e66b1c -//.word 0xb8852c40 -//.word 0x5aba7bc7 -//.word 0xab583234 -//.word 0xf3177722 -//.word 0x3089e3d8 -//.word 0x5e4fe41e -//.word 0xf58c5f4f -//.word 0xb49a9ab0 -//.word 0x9dfc5a00 -//.word 0x41944850 -//.word 0x3d169915 -//.word 0x05bdee7c -//.word 0xe03d79fd -//.word 0x34f86233 -//.word 0x047469eb -//.word 0xb70dcc7b -//.word 0x1be76b55 -//.word 0xa9272adb -//.word 0x0b639775 -//.word 0xdb56cde1 -//.word 0xaed998cb -//.word 0x510fd99e -//.word 0x52df2c99 -//.word 0xc2a7c925 -//.word 0x3a2ea866 -//.word 0x1cdbe910 -//.word 0x1b25727c -//.word 0xfe4bdafb -//.word 0xa045866a -//.word 0x3cfa1106 -//.word 0xe7b3f182 -//.word 0x5ed05857 -//.word 0x02ba595c -//.word 0x21184c96 -//.word 0x77467351 -//.word 0xf502de6f -//.word 0xc1698b01 -//.word 0x7d23d214 -//.word 0xccda00cd -//.word 0x12f043b9 -//.word 0x7c71c65e -//.word 0x41461c16 -//.word 0x27ace21d -//.word 0x48e5a0e8 -//.word 0x162df1b8 -//.word 0x9df0e470 -//.word 0x083aa1a3 -//.word 0x676f50f2 -//.word 0xaf3c3695 -//.word 0x02cd2137 -//.word 0x31410707 -//.word 0x805bea0c -//.word 0xa97afeb8 -//.word 0x23cb0ec1 -//.word 0xa3bd1c2c -//.word 0xe4b548ab -//.word 0xa404f328 -//.word 0xef1623a2 -//.word 0x9feb2938 -//.word 0x24cb8283 -//.word 0x8136fc29 -//.word 0x971b19af -//.word 0xa64ab88f -//.word 0x112af28b -//.word 0x61af4340 -//.word 0x8d87eafe -//.word 0x799492d7 -//.word 0xbc9f31f6 -//.word 0xa64b3133 -//.word 0x8247cee4 -//.word 0x18c8bff5 -//.word 0x7637183b -//.word 0xf0266f05 -//.word 0x66893df4 -//.word 0xc523880d -//.word 0xd03ebf0d -//.word 0x219fe6fc -//.word 0x6ab9f205 -//.word 0x01217785 -//.word 0x9c428062 -//.word 0x5952be9e -//.word 0x0185e62c -//.word 0x8d805402 -//.word 0xe910f46f -//.word 0xf91c62af -//.word 0xdad850bd -//.word 0x6a3c2968 -//.word 0x0ab5f3a9 -//.word 0xa21a7a34 -//.word 0xe6e1ab4d -//.word 0xd8933edd -//.word 0x8e7d98c5 -//.word 0x36a9ef72 -//.word 0x570cafb1 -//.word 0x5a011cc5 -//.word 0x48f639b8 -//.word 0xd565e9ee -//.word 0x9e075500 -//.word 0xaf448dc7 -//.word 0x48ed72b6 -//.word 0xe12dd36d -//.word 0x6bbdd68c -//.word 0xd9589ac5 -//.word 0xdf6f1a36 -//.word 0xf91d55f5 -//.word 0xb05dacec -//.word 0x197b8be7 -//.word 0x9ec84beb -//.word 0x009257ca -//.word 0x9d538ef4 -//.word 0xef29e990 -//.word 0x56865ecb -//.word 0x17290470 -//.word 0xa44d77ba -//.word 0x1e207e66 -//.word 0x1876eb0b -//.word 0x9ebfc3ae -//.word 0x75369f91 -//.word 0xa55c524d -//.word 0x35a5cc20 -//.word 0x36713f88 -//.word 0x033d8011 -//.word 0xc61baf6b -//.word 0x3e5f1abf -//.word 0xc09c5f43 -//.word 0x7ccfd10d -//.word 0x02d91d25 -//.word 0x05332edd -//.word 0x5edd4d65 -//.word 0x53978d9a -//.word 0x1a54661f -//.word 0x99eca0af -//.word 0x701172b1 -//.word 0x3984ec0d -//.word 0x0e88923f -//.word 0x4c984aaa -//.word 0x9755782e -//.word 0x1fc267fc -//.word 0x21b3eba9 -//.word 0xb0834482 -//.word 0xb5064620 -//.word 0x35beb73c -//.word 0xd252f9c4 -//.word 0x953be82d -//.word 0xeac1060c -//.word 0xec26d6e0 -//.word 0xe3218532 -//.word 0x0b8ecfe1 -//.word 0x986321b7 -//.word 0xf6e6fb3f -//.word 0x551d99db -//.word 0x6586d211 -//.word 0x5e094026 -//.word 0x442ba1ee -//.word 0x69847de2 -//.word 0x33730a73 -//.word 0x1f104c9e -//.word 0x066280c1 -//.word 0xa0d3bbad -//.word 0x46e0cffc -//.word 0xfc156ea5 -//.word 0xae3992cd -//.word 0xbac61be0 -//.word 0xaf9cbae1 -//.word 0x54f50ffe -//.word 0xed9c0e68 -//.word 0xb95aa761 -//.word 0xbfb1a697 -//.word 0xcbcdd8b0 -//.word 0xb3b86f26 -//.word 0xdecda755 -//.word 0x076faad2 -//.word 0x3ffbb1ff -//.word 0x31fa6ddc -//.word 0xaa9ca520 -//.word 0x59622089 -//.word 0xd31ac570 -//.word 0xd91001a0 -//.word 0xde836968 -//.word 0xc456a1ef -//.word 0xe7087cc8 -//.word 0x5ce664c6 -//.word 0x7b7ffd12 -//.word 0x9a59057a -//.word 0x1ce27f0c -//.word 0xaba910e4 -//.word 0xc1cea942 -//.word 0x6db866e0 -//.word 0x5405b682 -//.word 0xf6c7bdce -//.word 0x32edf65e -//.word 0x0cff1d14 -//.word 0xaf0f4cad -//.word 0xaeec6499 -//.word 0x8f98ae0a -//.word 0x8afcc24c -//.word 0x8edba854 -//.word 0x85053e9b -//.word 0xd9cdd92d -//.word 0x37bc2ffc -//.word 0x9387757b -//.word 0x6c3fc468 -//.word 0x51c8c1e9 -//.word 0xa48c7ddb -//.word 0x9e709a67 -//.word 0x9308b0d6 -//.word 0x7706eea6 -//.word 0xa2f905dd -//.word 0xd034419d -//.word 0x6c0bf9f9 -//.word 0x0e462a07 -//.word 0x42cf5f36 -//.word 0x8baed4e2 -//.word 0xa737da26 -//.word 0x15827df2 -//.word 0xd51c655d -//.word 0x6ffcfa3c -//.word 0x36b9ccf3 -//.word 0xcefa318b -//.word 0xec2d3005 -//.word 0x5d7c9dee -//.word 0x4afc8634 -//.word 0xba28ce38 -//.word 0x588f1824 -//.word 0x77c9e67f -//.word 0x53af02ff -//.word 0x99cc1e9e -//.word 0x2a0eb7ef -//.word 0x1cc13fb3 -//.word 0x02be7aa8 -//.word 0x6ee029a1 -//.word 0xb4b8e6db -//.word 0xf0824f8f -//.word 0x4a5766c4 -//.word 0x78a43867 -//.word 0x85dabd9d -//.word 0xd1670058 -//.word 0x5ae67f29 -//.word 0x3992d555 -//.word 0x7001962a -//.word 0xe20f7b93 -//.word 0xa318bfeb -//.word 0x726ac80f -//.word 0x84f90ab7 -//.word 0x84552906 -//.word 0xd7da5d5f -//.word 0x24261b7b -//.word 0x14d1f2b8 -//.word 0x5658b3b4 -//.word 0xe759d41b -//.word 0x900616bd -//.word 0xb0d466e4 -//.word 0x3b7301e4 -//.word 0x0303dcf3 -//.word 0x3685433b -//.word 0x288fc02e -//.word 0x53443e1a -//.word 0x9d846efd -//.word 0xd9606a9a -//.word 0x8fd199cc -//.word 0x00a9d21b -//.word 0x65c9c48d -//.word 0x789595be -//.word 0x35a5c933 -//.word 0xe2bd66ec -//.word 0x4d005538 -//.word 0x55600cce -//.word 0xab596a18 -//.word 0xdadfe2d2 -//.word 0x8595dcd4 -//.word 0xf03f582c -//.word 0xc37ad570 -//.word 0x0aab7153 -//.word 0x7f355175 -//.word 0x0cef4380 -//.word 0x8cd5a270 -//.word 0xd2fd7b32 -//.word 0xeccded71 -//.word 0xa86cd6ad -//.word 0x5876ac8d -//.word 0xd3f4a876 -//.word 0xbc8b2a5c -//.word 0x07f359d8 -//.word 0xb8ab097b -//.word 0xeeebe363 -//.word 0x21dbbf0b -//.word 0xa8025567 -//.word 0x7e011531 -//.word 0x4581537e -//.word 0x8b6aa794 -//.word 0x4d5594ff -//.word 0xb94567e2 -//.word 0x3891628c -//.word 0xac251a4b -//.word 0xf6eb1e85 -//.word 0xbc83d904 -//.word 0x693aba92 -//.word 0x753a92c6 -//.word 0xe6fe3d1d -//.word 0x1709844c -//.word 0xb8d842d5 -//.word 0x1615c6d9 -//.word 0x9c0d792d -//.word 0x9a64c0b0 -//.word 0x460724db -//.word 0x0163b199 -//.word 0xdbd59b59 -//.word 0x58612862 -//.word 0x75a6c967 -//.word 0xe6118a5c -//.word 0xa252ad88 -//.word 0xa10c92da -//.word 0xe4d1db80 -//.word 0xb74dcdb6 -//.word 0x33c1f8dc -//.word 0x06b41acc -//.word 0x77e5416a -//.word 0xa483307d -//.word 0x0ea004bd -//.word 0x58e4172c -//.word 0x4c7e25aa -//.word 0x1f60adc4 -//.word 0xf6ac9ace -//.word 0xa8692331 -//.word 0xc67bf005 -//.word 0xd9d27ee3 -//.word 0xeae1c4f4 -//.word 0x4852174e -//.word 0x85f84b81 -//.word 0xc2051b6c -//.word 0x2c7dca56 -//.word 0xc7ea0b3a -//.word 0x6b521f61 -//.word 0x0c663d36 -//.word 0x3efc3657 -//.word 0xf7bf59e8 -//.word 0x9725942c -//.word 0x27a2dd56 -//.word 0xde1cd09c -//.word 0xea9e9a8e -//.word 0x6d5015a6 -//.word 0xc5a73420 -//.word 0x10d9a20b -//.word 0xef94a6a1 -//.word 0x8bef4ad4 -//.word 0xd6a1bc29 -//.word 0x1470f4c9 -//.word 0x99ed97d6 -//.word 0xd45f1cfb -//.word 0x8cfd2d47 -//.word 0x6a60503b -//.word 0xb837c621 -//.word 0x683db3a0 -//.word 0x5868808e -//.word 0xd4637e05 -//.word 0x5d3fccb9 -//.word 0xa8667a88 -//.word 0xead0ee53 -//.word 0x5379870d -//.word 0xd8128111 -//.word 0x36f619b9 -//.word 0x3461f12c -//.word 0x28dcb577 -//.word 0xbcfcffe0 -//.word 0xf24c7876 -//.word 0x668841ed -//.word 0xd40c91a9 -//.word 0xd98b9f19 -//.word 0xfe04c246 -//.word 0x80000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x0000D660 -//// expected output -//.word 0x7b87a9fb -//.word 0x861a84ba -//.word 0xfcc14683 -//.word 0x1ed9a54f -//.word 0xe3512dad -//.word 0x25668512 -//.word 0xb1733917 -//.word 0x5b0c9523 -//.word 0x59620933 -//.word 0x6b0ed0cd -//.word 0xe5648faf -//.word 0x6c101043 -//.word 0xba3a653b -//.word 0xde0ab8a8 -//.word 0xc3959b33 -//.word 0xaa9f8624 -//// SHA512LongMsgvector_69 -//// vector length -//.word 0x0000D978 -//// input message -//.word 0x05b9f993 -//.word 0x6306166d -//.word 0x89bfb097 -//.word 0x617128be -//.word 0x79c69670 -//.word 0xb3641624 -//.word 0x3e12627b -//.word 0xc41ca6c5 -//.word 0xe5f98fc7 -//.word 0xe52ca5bc -//.word 0xa168dc99 -//.word 0xc8f76595 -//.word 0x475dcae9 -//.word 0x05383ad4 -//.word 0xd16a22e3 -//.word 0x997afd6f -//.word 0xdc386c67 -//.word 0x61a08950 -//.word 0x2a017889 -//.word 0xa45f40d4 -//.word 0x2015d912 -//.word 0x86be874e -//.word 0x485666fd -//.word 0x969d4584 -//.word 0xd1bcb7fb -//.word 0x412b6831 -//.word 0x0ad2aef0 -//.word 0x5c6f6082 -//.word 0xeb37eb73 -//.word 0x9fc0a299 -//.word 0x8c1e5652 -//.word 0x244d270d -//.word 0xabcf990c -//.word 0xec95eb68 -//.word 0x2b23a455 -//.word 0x5af06ea7 -//.word 0x900b2795 -//.word 0xb60436bd -//.word 0x840a1b69 -//.word 0xac514a11 -//.word 0x54b73a21 -//.word 0xcaa6b9fb -//.word 0x733c8240 -//.word 0x05a9114c -//.word 0xf6d9b6ff -//.word 0x3554e9c3 -//.word 0x1762ddca -//.word 0x94725898 -//.word 0xb3bcc1c2 -//.word 0x43267bf5 -//.word 0xcc647139 -//.word 0xc564f277 -//.word 0x07e9c039 -//.word 0x827663b2 -//.word 0x2f6dc3fe -//.word 0x4578f6ab -//.word 0xb0285777 -//.word 0xbfdcd85b -//.word 0x1de599c9 -//.word 0x02e7b933 -//.word 0xaa826ccc -//.word 0x07324d92 -//.word 0xb374f68c -//.word 0x282bce50 -//.word 0x334123c9 -//.word 0xa6917937 -//.word 0x4e052177 -//.word 0x24fb0d85 -//.word 0xc7eee23f -//.word 0x2a524f6c -//.word 0x8abf9efc -//.word 0xa4528891 -//.word 0x24514e3f -//.word 0x600d0590 -//.word 0x460d31cc -//.word 0x93689677 -//.word 0x47734b1a -//.word 0x559c1047 -//.word 0x9e96e1d7 -//.word 0x20b7cc76 -//.word 0x6b9eff62 -//.word 0x5518256f -//.word 0xef45f34f -//.word 0xb8f6fd10 -//.word 0x105acfe6 -//.word 0xefda392b -//.word 0xd641eaa4 -//.word 0x06204006 -//.word 0xf1715fb8 -//.word 0xee7a81db -//.word 0x30f48d88 -//.word 0xf96dea58 -//.word 0x0beb952a -//.word 0x60d27120 -//.word 0x1a07dfeb -//.word 0xbd568f49 -//.word 0x9c1196cb -//.word 0x91fac0dc -//.word 0xf16327ff -//.word 0xbf940458 -//.word 0x206dc66e -//.word 0x0f4d612f -//.word 0x5232e935 -//.word 0xad215f47 -//.word 0x55c8cb23 -//.word 0xa7628a7a -//.word 0x1adbea3d -//.word 0x7334f417 -//.word 0x382a893b -//.word 0x6612b15f -//.word 0x66082f08 -//.word 0x3e485909 -//.word 0x05dc2646 -//.word 0x997889be -//.word 0x94a2fdc9 -//.word 0x7b15619d -//.word 0x39680717 -//.word 0xcceb08b9 -//.word 0x3fd2daef -//.word 0xd8952496 -//.word 0x9296d0be -//.word 0xcd0562af -//.word 0x4500892b -//.word 0x41fff4f3 -//.word 0x0d70678d -//.word 0xa99e0e43 -//.word 0xc3d7116f -//.word 0xe3ce68f6 -//.word 0xe63ef113 -//.word 0xadd0c056 -//.word 0x163fb6ec -//.word 0x2bba5520 -//.word 0x9a8ad222 -//.word 0x66f46c07 -//.word 0xdb61fd12 -//.word 0xc7bccf32 -//.word 0xe71cb0cb -//.word 0xa0a349b9 -//.word 0xefa6ab93 -//.word 0xa30d2b2c -//.word 0xcafd7060 -//.word 0x69b5ca0d -//.word 0x70b6c55f -//.word 0xec27ff51 -//.word 0x7f773670 -//.word 0x0d44a5e2 -//.word 0xb97c91a8 -//.word 0x10c21f20 -//.word 0x831368ce -//.word 0x1ba9cf5b -//.word 0x681f93de -//.word 0xbbd7a05b -//.word 0x9599ab89 -//.word 0x5e7c7dd9 -//.word 0x5a0a8fb3 -//.word 0xda9fd803 -//.word 0xaf12e3f4 -//.word 0xe49724fb -//.word 0xade48c18 -//.word 0x9a935b59 -//.word 0x10c8369f -//.word 0xfa1379a4 -//.word 0xbc98ce3d -//.word 0x686dffdd -//.word 0x3543085b -//.word 0x2d4971f5 -//.word 0x254dda94 -//.word 0xf224d852 -//.word 0xda4dff39 -//.word 0x49d1404d -//.word 0xc56d76cd -//.word 0x24f33bb7 -//.word 0xfdee008a -//.word 0x5c855d4f -//.word 0xbaa2a5da -//.word 0x2c53be4e -//.word 0xda702fdf -//.word 0xb37e7bdc -//.word 0x5fd3aeec -//.word 0x75fb3598 -//.word 0xef5bf209 -//.word 0xdb149013 -//.word 0x532a1473 -//.word 0xaee6b555 -//.word 0xf878ee1a -//.word 0xa0e1d157 -//.word 0x71109e21 -//.word 0xc34b9488 -//.word 0xf3d10761 -//.word 0x10beb349 -//.word 0xd72e50e6 -//.word 0xe2a56770 -//.word 0x1caf6370 -//.word 0x78c3ebc8 -//.word 0xe36d6ff4 -//.word 0x77ad018f -//.word 0xf19a6719 -//.word 0x654a6ef7 -//.word 0x30f681bb -//.word 0x2f5a79a6 -//.word 0x2e5bb76b -//.word 0xa3ec7036 -//.word 0x9d3249ed -//.word 0xf7e624b6 -//.word 0xd1fc39b9 -//.word 0x40826827 -//.word 0x45cacd7b -//.word 0xfccb9600 -//.word 0x16c51193 -//.word 0x892409aa -//.word 0x86a75395 -//.word 0xacc1a404 -//.word 0x7b40a6ca -//.word 0x0b2c4ae0 -//.word 0xfef25fad -//.word 0xb3c16484 -//.word 0xbc359a6f -//.word 0x93335e2b -//.word 0x8814b673 -//.word 0xfe052a82 -//.word 0xd7add5d3 -//.word 0x2d11bb2b -//.word 0x43b55dd9 -//.word 0xbb048b3c -//.word 0x09f27a87 -//.word 0x27e016c1 -//.word 0x8ac09910 -//.word 0x56795d36 -//.word 0xce8dee5c -//.word 0x0ef9640f -//.word 0xfc5df088 -//.word 0x7c5cb430 -//.word 0xe346d863 -//.word 0xaff4da74 -//.word 0x75f425f2 -//.word 0x1ae7e62a -//.word 0x46261bed -//.word 0x16acec94 -//.word 0x11303f40 -//.word 0x5e918767 -//.word 0x3477dc8c -//.word 0x9138514d -//.word 0x2ff882a3 -//.word 0xb4156c66 -//.word 0x28c2820f -//.word 0xadf1fdc2 -//.word 0x6a77738c -//.word 0xc96aabe9 -//.word 0xe2ceb089 -//.word 0x37712453 -//.word 0xa114d7ab -//.word 0x8acb98f0 -//.word 0x5da74b49 -//.word 0x3b913ca2 -//.word 0xf079b3f1 -//.word 0x25b1c9be -//.word 0xd69379e2 -//.word 0x076afa8f -//.word 0xb3904c90 -//.word 0x06d312d2 -//.word 0xcc1d9f24 -//.word 0x2855533b -//.word 0x898028f9 -//.word 0xda2c88ef -//.word 0xf90e6220 -//.word 0x6bea7c07 -//.word 0x4eb30bdc -//.word 0x8ef48114 -//.word 0x5c6ea627 -//.word 0xdc02ea95 -//.word 0x1ed2f92b -//.word 0x50a49182 -//.word 0x328790ca -//.word 0xcab852c5 -//.word 0x58c63916 -//.word 0x8cf58dbc -//.word 0xf7e087da -//.word 0xc063a8b9 -//.word 0x98b84f0f -//.word 0xefe08b82 -//.word 0x68452e68 -//.word 0x8b9d23d1 -//.word 0xbb1101c7 -//.word 0x679fdfd4 -//.word 0x84bd6bc5 -//.word 0x3a3f36ae -//.word 0xdd7a522e -//.word 0x20aa1ff4 -//.word 0x85916282 -//.word 0x18619731 -//.word 0x5ddc8976 -//.word 0x87ba1f63 -//.word 0xea4b7971 -//.word 0xb35d3b7c -//.word 0xd760290f -//.word 0x49c8f5e2 -//.word 0x70b354a1 -//.word 0xd8cc57ef -//.word 0x286ff9ab -//.word 0x540ef572 -//.word 0x13d3da65 -//.word 0x9486602c -//.word 0x6cb2fd3b -//.word 0xd403b453 -//.word 0x11f32e4c -//.word 0x33a50b13 -//.word 0x02117aef -//.word 0x36620708 -//.word 0xe69cb529 -//.word 0x43824dc5 -//.word 0x86b7f538 -//.word 0x27230450 -//.word 0x5098150c -//.word 0x91b65ba3 -//.word 0xd50c34c8 -//.word 0x957f002d -//.word 0x4bf03346 -//.word 0x2a19a94f -//.word 0x0cb83a90 -//.word 0xacf08fe0 -//.word 0x15ec3368 -//.word 0x5ac5eda9 -//.word 0x88a64ec1 -//.word 0xd92e86e9 -//.word 0x2a157c43 -//.word 0xaf131dd3 -//.word 0xe6fdf3ca -//.word 0xc932fa0b -//.word 0x4835b0e8 -//.word 0xf69b6c2c -//.word 0x0328f05f -//.word 0x6a354145 -//.word 0x6b54b7a8 -//.word 0x3c375057 -//.word 0xfcce496f -//.word 0xe8b0f0d9 -//.word 0xd1bcb414 -//.word 0xce007e35 -//.word 0x2eda442c -//.word 0xb05cdb48 -//.word 0xf7f50cfe -//.word 0x384eebe6 -//.word 0x36736406 -//.word 0x70331753 -//.word 0x98c96675 -//.word 0x48bccbcb -//.word 0xf1036faf -//.word 0x146df9fb -//.word 0xb440a4cb -//.word 0x0b209585 -//.word 0x7c336b17 -//.word 0xc9831780 -//.word 0x86a4ee92 -//.word 0xcd96fcf6 -//.word 0x34ec9c70 -//.word 0xfc2e4664 -//.word 0x8b7da79a -//.word 0x1c75f73e -//.word 0xb658872b -//.word 0x5a689969 -//.word 0x819475f3 -//.word 0xc657b9be -//.word 0xdfdef1f8 -//.word 0xd169678d -//.word 0x64f33df0 -//.word 0xd515b818 -//.word 0xcc28dfc9 -//.word 0x8daa4514 -//.word 0x72e22321 -//.word 0x99c7a92c -//.word 0xda1f96ce -//.word 0xfce4077e -//.word 0x28eb8c57 -//.word 0x9dc8811c -//.word 0xa6ec9c79 -//.word 0xc910c28b -//.word 0x42d71fa3 -//.word 0xb0ae7547 -//.word 0x0df7b47a -//.word 0xe368cc3e -//.word 0xbdadbf56 -//.word 0xdc55fa50 -//.word 0x2cebe5c3 -//.word 0x7763b9d6 -//.word 0xd7b99201 -//.word 0x71d4c518 -//.word 0x60b07385 -//.word 0xf0bc5ed4 -//.word 0x0d81fc76 -//.word 0xfb85cabe -//.word 0x476fe330 -//.word 0xfd6bd1fb -//.word 0x1bd0a3c4 -//.word 0x46013fa5 -//.word 0xbc91fa76 -//.word 0x8aaa664b -//.word 0xffaf6b3d -//.word 0x60209a6e -//.word 0xddbebd47 -//.word 0xc4f0b304 -//.word 0xf5667b73 -//.word 0x96fc8ef8 -//.word 0x07e172d5 -//.word 0x18f88ca8 -//.word 0x7a7e3635 -//.word 0x74ee1166 -//.word 0xd7219c90 -//.word 0x34ba06f8 -//.word 0x4cc14196 -//.word 0xc88e5819 -//.word 0x2be9022b -//.word 0x046f77f5 -//.word 0x683882e6 -//.word 0x9fb6d8b0 -//.word 0x1ee0a894 -//.word 0xb59073e0 -//.word 0x0a2a1eb6 -//.word 0x467f460e -//.word 0x0ef1d3fe -//.word 0xb5d7d03a -//.word 0xb0237ad7 -//.word 0x4a429654 -//.word 0x994308da -//.word 0xb03ca2c3 -//.word 0x16e93a5a -//.word 0x7797ffe1 -//.word 0x9a400dd9 -//.word 0x93f83e7d -//.word 0x3a874390 -//.word 0xdb58f458 -//.word 0x2f92e5eb -//.word 0x8b843aa9 -//.word 0x5846bc0a -//.word 0xc39d2c9a -//.word 0xb520d741 -//.word 0x06996ac8 -//.word 0xeeae0899 -//.word 0xbcc19ac6 -//.word 0xca14664d -//.word 0xb031e49b -//.word 0xb889cc4e -//.word 0x925b743f -//.word 0x49d759c0 -//.word 0x7684fb22 -//.word 0xb4dfef7b -//.word 0x53452fa5 -//.word 0x5112b48a -//.word 0x850b479f -//.word 0x1ef994af -//.word 0x4c9780da -//.word 0x3daebcdd -//.word 0x4b7f9a94 -//.word 0x746120bd -//.word 0x0aab5cfe -//.word 0xabd4f62a -//.word 0x74d90cc0 -//.word 0x72df39b4 -//.word 0x591af772 -//.word 0x79ed2821 -//.word 0xed53ef24 -//.word 0x167dc4e7 -//.word 0x48bdc8d8 -//.word 0xc2a255b3 -//.word 0xe465da03 -//.word 0x9c83e6e6 -//.word 0x22ac8210 -//.word 0xe5dcc412 -//.word 0xc5c8a1dc -//.word 0x827b0381 -//.word 0x74411b3b -//.word 0x7dc4f9af -//.word 0x3d755a72 -//.word 0x842dc1cb -//.word 0x0d14c9bb -//.word 0x69c3b93a -//.word 0x39a559c4 -//.word 0xa0a30414 -//.word 0xf800ff30 -//.word 0xc48109a5 -//.word 0xe6d23314 -//.word 0x1325f2ed -//.word 0x831c737b -//.word 0xede92e21 -//.word 0xb2b4bee3 -//.word 0x593cf027 -//.word 0x3bc21abd -//.word 0x7f23ae1e -//.word 0x49440ef1 -//.word 0x2fb2a2d4 -//.word 0xed8a2958 -//.word 0x59974c4d -//.word 0x99bb7941 -//.word 0x9390ee43 -//.word 0xa54e14ed -//.word 0x96f00fa1 -//.word 0xcd929312 -//.word 0xc11ef906 -//.word 0xb127925b -//.word 0x95153b48 -//.word 0x548331e6 -//.word 0x37e527ef -//.word 0x9e6e96c5 -//.word 0xf23155b6 -//.word 0xda86697e -//.word 0xb2af1e0d -//.word 0x39bb578b -//.word 0x89ab229a -//.word 0x4dd48fdb -//.word 0x2e84c3b3 -//.word 0x8ee8484f -//.word 0x792da7e5 -//.word 0xd8e6393d -//.word 0xe8ae3a71 -//.word 0xeb0e1ff1 -//.word 0x1ea129c9 -//.word 0xea753b27 -//.word 0x5eb5e917 -//.word 0xdd85d192 -//.word 0x142e2eb7 -//.word 0x2f7baa58 -//.word 0x4d6374b8 -//.word 0x31e79393 -//.word 0x3a3e7a5f -//.word 0x9530dcd2 -//.word 0xb1c0c1a4 -//.word 0xf30dda96 -//.word 0xac7a11b3 -//.word 0x480d65d6 -//.word 0xc815f56c -//.word 0x72105a7b -//.word 0xc6cb3ae4 -//.word 0xb5cb1ae5 -//.word 0x0eec74e1 -//.word 0x39480a64 -//.word 0x275a7962 -//.word 0x896411bf -//.word 0x400de414 -//.word 0x154f1db1 -//.word 0xab9094de -//.word 0xb10f9f67 -//.word 0x5c822a57 -//.word 0x15fe0a03 -//.word 0x6f168e4a -//.word 0x5b47571c -//.word 0x9f946a39 -//.word 0x846d843b -//.word 0xcfd5aed7 -//.word 0xf3c41060 -//.word 0x85ca0a8c -//.word 0xf0f6817b -//.word 0x6af677f5 -//.word 0x277fdff4 -//.word 0xccf0af62 -//.word 0x26323623 -//.word 0x1ce2b056 -//.word 0xe2b218d8 -//.word 0x700c3d0a -//.word 0x33f918d5 -//.word 0x02425deb -//.word 0x53d5504f -//.word 0xaf69da17 -//.word 0x6365dc71 -//.word 0x79fec3e4 -//.word 0xe6a05dd8 -//.word 0x0590eb59 -//.word 0x44cf7718 -//.word 0x1e4167b2 -//.word 0x490e5335 -//.word 0x304914e1 -//.word 0xa3d01d2b -//.word 0xcd730f08 -//.word 0x67588767 -//.word 0x2c9d3aff -//.word 0x8d40454c -//.word 0xa53cbed4 -//.word 0x6ff58faf -//.word 0x37d68446 -//.word 0x4e39a25b -//.word 0x0287bb4a -//.word 0xcda03f8e -//.word 0xcd7d5586 -//.word 0x74142a79 -//.word 0x817b89d9 -//.word 0x2f51adc4 -//.word 0xac5a53d0 -//.word 0xcc691308 -//.word 0xff83ef32 -//.word 0x81412d54 -//.word 0xd0766276 -//.word 0x6312d0a8 -//.word 0x9946f147 -//.word 0xf0e9547d -//.word 0x771ba807 -//.word 0x8628173b -//.word 0xacafd549 -//.word 0xe903f8c1 -//.word 0x1dd18a55 -//.word 0xc103dce1 -//.word 0xd5e51ea8 -//.word 0x19862de0 -//.word 0x8062ac72 -//.word 0xe23d56fb -//.word 0xf1529216 -//.word 0x6ead48dd -//.word 0x9dd6f4ad -//.word 0xf6aff92a -//.word 0x1d9f3783 -//.word 0x14f0dff8 -//.word 0xb0768699 -//.word 0x49727950 -//.word 0xb6b55121 -//.word 0x7809c7b1 -//.word 0x36ccc905 -//.word 0x6adecd8d -//.word 0x59be6561 -//.word 0x48ef13ca -//.word 0xeda15f04 -//.word 0x248d2842 -//.word 0xe32138f3 -//.word 0x70dd1b44 -//.word 0xd1fd30e6 -//.word 0x85580011 -//.word 0x7188cfc9 -//.word 0x1d4b7160 -//.word 0x20295f3c -//.word 0xd9570ada -//.word 0x60dc6f13 -//.word 0xbcf2ec9e -//.word 0x57af52d7 -//.word 0xafe43bbe -//.word 0x4d469e43 -//.word 0xfbcba0c1 -//.word 0x3257adc8 -//.word 0xd298c81f -//.word 0x152e1f09 -//.word 0xc610e3c8 -//.word 0xae2b5660 -//.word 0x504c269d -//.word 0xd63ff957 -//.word 0x4a3949f5 -//.word 0x09737230 -//.word 0x7518091a -//.word 0xeb61705e -//.word 0xf5fea7c9 -//.word 0xc0b96509 -//.word 0xd05668b5 -//.word 0xf2bd098e -//.word 0x725b1305 -//.word 0x8fc5d5fd -//.word 0x2c9e76d1 -//.word 0xc8bc8999 -//.word 0xb086e1a9 -//.word 0x73a0a75b -//.word 0x97cba90f -//.word 0x8a06f56f -//.word 0xdbf9a7f8 -//.word 0xaa94ffb6 -//.word 0x5ef4b74e -//.word 0x96869342 -//.word 0x616e3971 -//.word 0xb12a43dd -//.word 0x0d7293b1 -//.word 0x8763e683 -//.word 0xeeddacd6 -//.word 0x442a18e3 -//.word 0x72e07399 -//.word 0x3b08b5e2 -//.word 0x6f7f5628 -//.word 0x619d6218 -//.word 0x9a15cca5 -//.word 0xcf1c0450 -//.word 0x11cecba7 -//.word 0x44cd470c -//.word 0xd22b52b8 -//.word 0xa18a1800 -//.word 0x4281e1d6 -//.word 0x6b422b92 -//.word 0xa77afcf3 -//.word 0x4c797660 -//.word 0xad93ac74 -//.word 0x92c6b4ba -//.word 0xe59dfeb5 -//.word 0xae53e324 -//.word 0x423c8183 -//.word 0xb661c7d5 -//.word 0x9a6acca1 -//.word 0xe4c2653b -//.word 0x2bf5f644 -//.word 0x165d8874 -//.word 0x13fd1c97 -//.word 0x4cad3fd6 -//.word 0xd778df38 -//.word 0x2c425d69 -//.word 0xddade3b9 -//.word 0x813ef867 -//.word 0xf1bc5220 -//.word 0xb8d9ebc3 -//.word 0xc4155767 -//.word 0x62de549f -//.word 0x69fca3fd -//.word 0xb42c16d4 -//.word 0xd60beb42 -//.word 0x0a36586e -//.word 0x69b0670f -//.word 0x6084042e -//.word 0x60ab542c -//.word 0xd72f4906 -//.word 0x609174d8 -//.word 0x36691aa0 -//.word 0xef4c8945 -//.word 0x67f2acd8 -//.word 0xfa98de19 -//.word 0xf6a4fc3d -//.word 0x4f88beee -//.word 0x95e84794 -//.word 0x24fffad3 -//.word 0x9b3f9054 -//.word 0x8f3767c9 -//.word 0x80ba1d2b -//.word 0x0b3e5e46 -//.word 0x6282fa78 -//.word 0xfa743bb6 -//.word 0x835175cf -//.word 0x1d0edef5 -//.word 0xc9f7a079 -//.word 0x1d962dd6 -//.word 0x3dd6d3f1 -//.word 0x0668909f -//.word 0x8c662768 -//.word 0xc736738b -//.word 0x89b2fc41 -//.word 0xb385c846 -//.word 0xa9d87496 -//.word 0x032f8374 -//.word 0x868df5b1 -//.word 0x52df1b2b -//.word 0x5c97ab94 -//.word 0x1f981075 -//.word 0x8f520372 -//.word 0x4f2e5fcf -//.word 0x232c3133 -//.word 0xa8ca0fac -//.word 0x4329acf4 -//.word 0x576ba9f3 -//.word 0xbb5fad84 -//.word 0x6b60b77c -//.word 0x7d7ab3e9 -//.word 0x57cf4c97 -//.word 0x203902d9 -//.word 0x74317c85 -//.word 0x5cf01f41 -//.word 0x7dd3dffd -//.word 0x8f0455c1 -//.word 0x115712a9 -//.word 0x3b72342e -//.word 0x353137a6 -//.word 0x86490d0e -//.word 0xcf2b7008 -//.word 0xb92b7720 -//.word 0x2ce16753 -//.word 0xc2cfccd2 -//.word 0x7b45c903 -//.word 0xb282adc9 -//.word 0x4f1cc605 -//.word 0x3fa27a5d -//.word 0x217f933c -//.word 0x4221db19 -//.word 0xcc5be9fd -//.word 0x3a083a3f -//.word 0x0ff28492 -//.word 0xc8f24643 -//.word 0x0f58a4bb -//.word 0x318c724b -//.word 0xd2f68f29 -//.word 0xe01c74b5 -//.word 0xc50a0c01 -//.word 0xe1f7c791 -//.word 0x3725ea5f -//.word 0x66092922 -//.word 0xdcac77d0 -//.word 0x46511d62 -//.word 0x4a5809d7 -//.word 0x7962697b -//.word 0x7fb67969 -//.word 0x9de4994f -//.word 0x5aa8a371 -//.word 0x75107bf1 -//.word 0x1de1e84d -//.word 0x6438a229 -//.word 0xf26dac4f -//.word 0xf63ce3f4 -//.word 0x6327d83d -//.word 0x5816db01 -//.word 0xdf4158d1 -//.word 0xdb4f6735 -//.word 0x3cbf9e39 -//.word 0x75882928 -//.word 0x30fc1d98 -//.word 0x40f20aa6 -//.word 0xd724d083 -//.word 0xf9d6b330 -//.word 0x30b9b185 -//.word 0x820e1278 -//.word 0xa00e429c -//.word 0x608adce8 -//.word 0x6dcf07ba -//.word 0x3dcc051b -//.word 0x44770945 -//.word 0x686c4963 -//.word 0xb4d75597 -//.word 0x5095a741 -//.word 0xb1967b7f -//.word 0x0d86e1f0 -//.word 0x12ac10be -//.word 0xd712fddb -//.word 0x13e62c8a -//.word 0x8d20c622 -//.word 0xd365ed0e -//.word 0x2f2b4c19 -//.word 0xd71ff2e9 -//.word 0x64c360c8 -//.word 0x855ce0ab -//.word 0xf50b196c -//.word 0xaa3ae15b -//.word 0x503952f5 -//.word 0xf52920f3 -//.word 0x061a2987 -//.word 0x7a704ee2 -//.word 0x4d8b82f9 -//.word 0x30a72089 -//.word 0x7f008258 -//.word 0x733acfbf -//.word 0x99011465 -//.word 0x82ed974d -//.word 0xbca86813 -//.word 0x02523872 -//.word 0xb0246e0a -//.word 0x7a547860 -//.word 0x5c395f27 -//.word 0xd4b09fbe -//.word 0x50be35f9 -//.word 0xe277f924 -//.word 0x3b1e2e45 -//.word 0xd78d58a2 -//.word 0x75d74d83 -//.word 0xca2d8f39 -//.word 0x76fed95f -//.word 0x3762f860 -//.word 0x5db9dc3a -//.word 0x7e8fef81 -//.word 0x6ac4a6a6 -//.word 0x61e95579 -//.word 0x84ec47ed -//.word 0x8af80e1b -//.word 0xb497188a -//.word 0x031a83ae -//.word 0xa83a32ae -//.word 0xbcff216b -//.word 0x31e1f5bd -//.word 0x092ed8ff -//.word 0xc5ab83cf -//.word 0x217e9c0f -//.word 0xfe4b432f -//.word 0xa09ee8af -//.word 0x19895fdf -//.word 0x058e36ea -//.word 0x78be4612 -//.word 0x3523883d -//.word 0x215c2ab1 -//.word 0xf787e21c -//.word 0x3c6483d7 -//.word 0x76b6ce6b -//.word 0x99ed8a55 -//.word 0xc203d706 -//.word 0x27a4bf2e -//.word 0x4e910e3a -//.word 0x7e46631b -//.word 0x74db884a -//.word 0x5628ff09 -//.word 0xed2cddeb -//.word 0x0eb0dc96 -//.word 0x5927abc8 -//.word 0x27d98898 -//.word 0xbd4011ff -//.word 0xc6b25796 -//.word 0x004135a1 -//.word 0x35e0e04d -//.word 0x6dc7be36 -//.word 0x62187c2c -//.word 0x34c25b37 -//.word 0x5ea5cad8 -//.word 0xe9f83a92 -//.word 0xdfe82ea9 -//.word 0x0382912a -//.word 0xbfd34d2b -//.word 0x5e4e1954 -//.word 0x7b6e929f -//.word 0xb99c8e5b -//.word 0xb552ad77 -//.word 0x398131fd -//.word 0xb3300fdd -//.word 0xe56645ec -//.word 0xdd4b6f2c -//.word 0x288a954e -//.word 0x43f94875 -//.word 0x527ced3d -//.word 0x142758fc -//.word 0x17a29d48 -//.word 0x28d222b9 -//.word 0x0eb5f9ef -//.word 0x788e6dd7 -//.word 0x3343db2b -//.word 0xa003c438 -//.word 0x662b1fe4 -//.word 0x646bf4ef -//.word 0xea252679 -//.word 0x281591c5 -//.word 0xe637543c -//.word 0x76e570b5 -//.word 0xe74093f3 -//.word 0x7cd22e6f -//.word 0x5c72cd58 -//.word 0x8b67a8d9 -//.word 0x19d0759a -//.word 0x9a438189 -//.word 0xd6b4ffda -//.word 0xc198a04c -//.word 0xad4b64af -//.word 0xbeafafa3 -//.word 0x9e179fa2 -//.word 0x73639d41 -//.word 0x0e6c32b2 -//.word 0x65a21c8e -//.word 0x44f3a2d1 -//.word 0x3fef2427 -//.word 0xeb2af666 -//.word 0x4ee26f5b -//.word 0x93e23cc9 -//.word 0x02a6faaf -//.word 0x30c005ca -//.word 0x737b8a5b -//.word 0x99bde42a -//.word 0xda3225cb -//.word 0x0aa6f220 -//.word 0x14b3951f -//.word 0xa39d4dd5 -//.word 0x227ae8ab -//.word 0xe79694e9 -//.word 0xab15f378 -//.word 0x3eda6dec -//.word 0x78a8cac2 -//.word 0x738700e5 -//.word 0xf76a4977 -//.word 0x360e79cf -//.word 0xba258fbe -//.word 0x9bb48a17 -//.word 0xf5ba7e6e -//.word 0x9912e61f -//.word 0x039a3c93 -//.word 0x8d95c7be -//.word 0xe24eb5ec -//.word 0xb4ff69be -//.word 0xb2f0166f -//.word 0xb4e38d5c -//.word 0x39b053c4 -//.word 0x142df7cc -//.word 0x6250a2c6 -//.word 0xbf98f0b2 -//.word 0xbaa8fe05 -//.word 0x8636c5aa -//.word 0xf223a647 -//.word 0x9aeb45c1 -//.word 0x5f409b02 -//.word 0x16f247fa -//.word 0x7d1225e3 -//.word 0x735722ca -//.word 0x68c04f4b -//.word 0x127b349c -//.word 0x610666cd -//.word 0xb6945c4d -//.word 0x50b27eb1 -//.word 0x062a7fb1 -//.word 0x3c28ed73 -//.word 0x109b060d -//.word 0xd4dece45 -//.word 0xc1985e9a -//.word 0xe9e17f89 -//.word 0x6ea67709 -//.word 0xf24e2358 -//.word 0x4e9d46f9 -//.word 0x87d921fe -//.word 0xfe2c4483 -//.word 0xe64aa37b -//.word 0xfb53ecaf -//.word 0x71fb1803 -//.word 0x2be841fb -//.word 0x2e5cb37f -//.word 0x551345db -//.word 0x466fea0a -//.word 0xa4d28334 -//.word 0x874bf775 -//.word 0x297686e0 -//.word 0xe29d5ac4 -//.word 0x56235f2d -//.word 0xed2355ae -//.word 0x8354245e -//.word 0x61306f21 -//.word 0x6c556b29 -//.word 0x9d2bf2bc -//.word 0xb1c7d337 -//.word 0x220f6d53 -//.word 0x551f7ca7 -//.word 0x15ec326e -//.word 0x40278a8b -//.word 0xc065d9ca -//.word 0xbd7ca569 -//.word 0x1130bbd7 -//.word 0xfd0f7cbb -//.word 0x1a997838 -//.word 0x92a43e6f -//.word 0x8fff7146 -//.word 0xf4561f68 -//.word 0x4c554f8e -//.word 0xff10d9fc -//.word 0xcca37b4e -//.word 0x73152874 -//.word 0xb283a3fc -//.word 0x737a4d8f -//.word 0x44a43cbf -//.word 0x07a78c00 -//.word 0xeb4afaf3 -//.word 0x9bdaaeeb -//.word 0xb5cc59aa -//.word 0x7da3806b -//.word 0xd3141826 -//.word 0x6268520f -//.word 0x1b23b85f -//.word 0xe2e37958 -//.word 0x868a0183 -//.word 0xf79fcd3d -//.word 0xb3f27e71 -//.word 0x827f2ca7 -//.word 0x6395fc3e -//.word 0xc638f5f5 -//.word 0xfbc30fb1 -//.word 0xebd28d7a -//.word 0x065e8dc6 -//.word 0x7c2adefa -//.word 0xb05e112e -//.word 0xea72d330 -//.word 0x4b4e7acc -//.word 0x07b0dd4b -//.word 0xcecd693a -//.word 0x8b3b716d -//.word 0x510ec643 -//.word 0x9242882a -//.word 0x93593b66 -//.word 0x1c441d0f -//.word 0x7487b759 -//.word 0x8d99b319 -//.word 0x7b89ed84 -//.word 0x2ae7cd39 -//.word 0x51e2d382 -//.word 0xa2ae73d6 -//.word 0x442924a3 -//.word 0x82bdb44b -//.word 0xc588de6c -//.word 0xbfba1e65 -//.word 0xea3fc416 -//.word 0x319f48e7 -//.word 0xec22dd0b -//.word 0x12374806 -//.word 0xaa16f36c -//.word 0x83a53dec -//.word 0x2598158e -//.word 0x07ddc739 -//.word 0x03371578 -//.word 0x06298a7d -//.word 0x0c150b67 -//.word 0x4ca5afc0 -//.word 0xaf6ad14a -//.word 0x87c363fb -//.word 0x7e018446 -//.word 0xccc8559c -//.word 0xaeb80933 -//.word 0x134d3c06 -//.word 0x9804861d -//.word 0xb6c04f0e -//.word 0x3a6be5c4 -//.word 0xf6e0cb7f -//.word 0xb709551c -//.word 0x77447197 -//.word 0xd30cc8ce -//.word 0xbfd50687 -//.word 0x783775b5 -//.word 0xba4fd1f7 -//.word 0x34635862 -//.word 0x39c42080 -//.word 0xb8f9ad98 -//.word 0x6e19c330 -//.word 0x5a7979d1 -//.word 0x71878f0a -//.word 0x94f601b7 -//.word 0xbf1cdc84 -//.word 0x839851ac -//.word 0xb6370807 -//.word 0x6919b743 -//.word 0x1a0ff271 -//.word 0x2b4845c4 -//.word 0x932d8096 -//.word 0xd48952ac -//.word 0x2ded19bb -//.word 0x1053f92b -//.word 0xd6012b1a -//.word 0xb2b098a4 -//.word 0xe3eea762 -//.word 0x2ec15330 -//.word 0x8c8d8034 -//.word 0x20378f1c -//.word 0x6b8b30a6 -//.word 0xc3db7766 -//.word 0x01e933c4 -//.word 0x7b087b44 -//.word 0x327d890a -//.word 0x4c2bcc9d -//.word 0xc47038eb -//.word 0x604ae18d -//.word 0xe3bec84d -//.word 0x847af4e5 -//.word 0xa0b9c50a -//.word 0xac6786a9 -//.word 0x6d854171 -//.word 0x6bd0d791 -//.word 0xa39d4fc3 -//.word 0x7c086f89 -//.word 0xfc4d89b6 -//.word 0x3c769831 -//.word 0x19378cf6 -//.word 0x2d16e15d -//.word 0xfece769f -//.word 0x74f69d96 -//.word 0x91de6ec4 -//.word 0x5cba6297 -//.word 0x1e021deb -//.word 0xd1188ad1 -//.word 0xd62c2d8f -//.word 0xe65db5e8 -//.word 0x4b20d19d -//.word 0x50e64533 -//.word 0xf6f93df7 -//.word 0xe8a7e140 -//.word 0xb1a329f4 -//.word 0x2da8f34d -//.word 0x3d5f53dd -//.word 0xbf832ad0 -//.word 0xbe43fa72 -//.word 0xe5e8f8f1 -//.word 0x3ab76363 -//.word 0x0919150a -//.word 0x1df958d7 -//.word 0x366efa2e -//.word 0xb89aa4e9 -//.word 0xa1d2679f -//.word 0xbdfe9826 -//.word 0x1d43de56 -//.word 0xc5e08910 -//.word 0xa556257f -//.word 0xcbcc4f9e -//.word 0xd6b1c8fb -//.word 0xaea3c8ba -//.word 0x729095dc -//.word 0xb21b53c2 -//.word 0xdf411eec -//.word 0xff3c5607 -//.word 0xa5a73a27 -//.word 0x21e4b951 -//.word 0xf4bb843c -//.word 0x87436858 -//.word 0x1c06db10 -//.word 0x0460d54c -//.word 0x1228e13b -//.word 0x5192734f -//.word 0xf2547c89 -//.word 0x88083cf6 -//.word 0x78d2577a -//.word 0xaa422ccc -//.word 0x857c62c2 -//.word 0x1b96c3cf -//.word 0xa0414eca -//.word 0x21ac87f0 -//.word 0x72a5122d -//.word 0x69028097 -//.word 0x493f693b -//.word 0x8168bb1d -//.word 0x9739517a -//.word 0x5f85c850 -//.word 0x70d48e21 -//.word 0xd8503bf3 -//.word 0x0fe2259b -//.word 0x2a982e3b -//.word 0x514ae10a -//.word 0x737dbe53 -//.word 0x3887d1c1 -//.word 0x38f48ad9 -//.word 0x6a29c8c8 -//.word 0xdf47375f -//.word 0xb052dc5c -//.word 0x3593eeeb -//.word 0x773ae86c -//.word 0xe848dc77 -//.word 0x52ac0a1d -//.word 0x0eacb171 -//.word 0x76872548 -//.word 0x9c59223c -//.word 0x3d3e60f7 -//.word 0xf0ba67ae -//.word 0xa359a5eb -//.word 0x4892be90 -//.word 0xccf12319 -//.word 0x4976e621 -//.word 0x7c38cd27 -//.word 0x794da593 -//.word 0x9deed8f4 -//.word 0xc5d7428c -//.word 0xbded410e -//.word 0xfc230ba6 -//.word 0x8e9e453a -//.word 0x5118d1f0 -//.word 0x6482e7f0 -//.word 0xdded676b -//.word 0xbaaa6ddc -//.word 0x1bb0268d -//.word 0xae3fe35d -//.word 0x6ac36cc2 -//.word 0x80fb970a -//.word 0x8e5a19e6 -//.word 0x16ae9b28 -//.word 0x30ff11cc -//.word 0x7bba4735 -//.word 0x590fbcba -//.word 0x5c97b461 -//.word 0xfb3a89ea -//.word 0x8a504210 -//.word 0x6906660b -//.word 0x7b031359 -//.word 0xd94c4abe -//.word 0xc8658d8a -//.word 0xe9baac1a -//.word 0xb03ddca1 -//.word 0x174f0929 -//.word 0x94e46dd4 -//.word 0x48e26268 -//.word 0x79cb740a -//.word 0x429cbb4a -//.word 0x89f56860 -//.word 0x32799db5 -//.word 0x927882a6 -//.word 0x27cc9584 -//.word 0x860041df -//.word 0x94b8b304 -//.word 0xf94ce9c4 -//.word 0xd2b70b77 -//.word 0xa6b0ff41 -//.word 0x9c163894 -//.word 0xeb91cef6 -//.word 0x9177d405 -//.word 0x48ece6b8 -//.word 0xb64e01e7 -//.word 0xe4d0970e -//.word 0xf164e34e -//.word 0x08df7bb4 -//.word 0x8f5724be -//.word 0xa1d0e91b -//.word 0xbf186fb3 -//.word 0xc2f083e7 -//.word 0x146cf51a -//.word 0x209da970 -//.word 0x076debd5 -//.word 0x95c90342 -//.word 0x7306093b -//.word 0x9e7dfb9d -//.word 0x17790d96 -//.word 0xdd5440f5 -//.word 0x18dc36a4 -//.word 0x97fb4572 -//.word 0x7c98ca16 -//.word 0x36b8c071 -//.word 0xb0e99114 -//.word 0xc8e02b02 -//.word 0x036157b7 -//.word 0x7f5f4669 -//.word 0x29656d8d -//.word 0x2f34949d -//.word 0xb9ae2919 -//.word 0xd4f2d9cc -//.word 0xaec96250 -//.word 0x0941a2d4 -//.word 0xea97f41d -//.word 0x915abdcb -//.word 0xaece42de -//.word 0xd28fbd78 -//.word 0x2476afe4 -//.word 0x55c077d8 -//.word 0xd66d24f7 -//.word 0x48e7889a -//.word 0x34e48dd0 -//.word 0xfc8dcda4 -//.word 0x11e05c9e -//.word 0x6753e88c -//.word 0x26ba0581 -//.word 0xa36ac21f -//.word 0x8e9f8012 -//.word 0x6d1b04dd -//.word 0x4810cad9 -//.word 0xa6409c7a -//.word 0xb96364d5 -//.word 0xd6c93f5f -//.word 0x2840d2f8 -//.word 0xa438e128 -//.word 0x3f251da8 -//.word 0x5f253e24 -//.word 0x90e3523f -//.word 0x79bb55d8 -//.word 0x0e1f018b -//.word 0x0739e77b -//.word 0x90d1bf4f -//.word 0x4272fd7b -//.word 0x52c8a5c1 -//.word 0x084d5ff7 -//.word 0x7325ce0a -//.word 0x5c451e43 -//.word 0x78dbdcc9 -//.word 0xe1ea0b68 -//.word 0xc7357490 -//.word 0x635f3da1 -//.word 0x2d50bd65 -//.word 0x4fdb8fde -//.word 0x599de543 -//.word 0x36281f45 -//.word 0x5f619d96 -//.word 0x4e26d1ac -//.word 0x363498c3 -//.word 0xf148ca21 -//.word 0x3a850f9d -//.word 0x1c16f562 -//.word 0xaa1440f1 -//.word 0xf1aa8265 -//.word 0x2b77ebfb -//.word 0x363361d1 -//.word 0x4496d3ee -//.word 0xd375cb83 -//.word 0xe02f4370 -//.word 0x5747ba0a -//.word 0xcf52871c -//.word 0x74146c2c -//.word 0x44e66eff -//.word 0x7f5ae45f -//.word 0x5822cf1b -//.word 0xf12e6950 -//.word 0x861501e7 -//.word 0xe9b6055f -//.word 0x2e1f61cc -//.word 0xa7ae0720 -//.word 0x1375cfaa -//.word 0x12e382dc -//.word 0xdca13151 -//.word 0x33bbcc0f -//.word 0x9600f009 -//.word 0xb8abffe8 -//.word 0x3043760a -//.word 0x72bf7bcb -//.word 0xfeeeb604 -//.word 0xd71662d2 -//.word 0x37dca499 -//.word 0x81631b48 -//.word 0x77b8b8de -//.word 0xad6ed02d -//.word 0x3d856fdd -//.word 0xbd91f0b5 -//.word 0x6e17ca16 -//.word 0xb63badc8 -//.word 0xd198cefa -//.word 0xc3707f83 -//.word 0x9105026e -//.word 0xb0469fb6 -//.word 0xbeaef44e -//.word 0x706a8d64 -//.word 0xccbab4e7 -//.word 0x98998a47 -//.word 0x12a0577c -//.word 0xe1281f49 -//.word 0x4caf76c2 -//.word 0xaa7d940c -//.word 0x1986ac64 -//.word 0x73937a62 -//.word 0x7e9d1c7f -//.word 0x637922d6 -//.word 0x62bbe827 -//.word 0xc3d42421 -//.word 0x107dbbe1 -//.word 0x8159d9b6 -//.word 0xb8d54027 -//.word 0xae54e037 -//.word 0xee89a8e7 -//.word 0x01239dfd -//.word 0x29b02904 -//.word 0x52bbb594 -//.word 0x45387ad3 -//.word 0x1f23933c -//.word 0x0163579f -//.word 0x0af4e769 -//.word 0x82450326 -//.word 0x58df2244 -//.word 0xcf48c11a -//.word 0x7427fb29 -//.word 0x53a85aa1 -//.word 0x6a22ed27 -//.word 0x5ef89ad5 -//.word 0x6dbdb682 -//.word 0xa49bd344 -//.word 0x52f5d934 -//.word 0xbc4b5971 -//.word 0x125e1d68 -//.word 0xa2950452 -//.word 0x4ca00dfd -//.word 0x365bb1d0 -//.word 0xc1f5760a -//.word 0xbb51c14a -//.word 0xd6aceb54 -//.word 0x58819812 -//.word 0x15a944d9 -//.word 0x9ac71fee -//.word 0xace31b49 -//.word 0xf1554398 -//.word 0xece54e87 -//.word 0x2f30743f -//.word 0xcb4e802c -//.word 0x0cb12704 -//.word 0x63509805 -//.word 0xa405547e -//.word 0x71344090 -//.word 0xf6aef836 -//.word 0xd8d56783 -//.word 0x6700952b -//.word 0x1b21bf45 -//.word 0x3ea5ad4f -//.word 0xe69b4073 -//.word 0x26194b08 -//.word 0x85dba35c -//.word 0xaf2e7ab1 -//.word 0x6b0ce885 -//.word 0xcd89cb17 -//.word 0xad6ed126 -//.word 0x5823d3fc -//.word 0x84d265ab -//.word 0x8ac9ab97 -//.word 0xcf206e34 -//.word 0x839c6e11 -//.word 0x8fd4fa16 -//.word 0xc892bf0a -//.word 0x697cde57 -//.word 0xc0f44112 -//.word 0x273c2e36 -//.word 0x36de1c30 -//.word 0x374bc6a1 -//.word 0xdac27f5f -//.word 0x2b73c5bd -//.word 0xc0e5180c -//.word 0x37950d61 -//.word 0xe0e09e99 -//.word 0xb622c49b -//.word 0x942048dd -//.word 0xa5a3d52a -//.word 0x1d6653a2 -//.word 0x26327002 -//.word 0x1d487f25 -//.word 0xffff86cb -//.word 0x1eae929a -//.word 0x19cc4e62 -//.word 0x0a56d4a5 -//.word 0x0171c357 -//.word 0xb25192e2 -//.word 0x6a59246d -//.word 0x48849c5e -//.word 0xa903721d -//.word 0xe428c71b -//.word 0x3882f514 -//.word 0x024a6b91 -//.word 0x33fdb8b0 -//.word 0x024be527 -//.word 0xde300887 -//.word 0xa76116be -//.word 0x1de9f9e0 -//.word 0x9914e227 -//.word 0xfb8ce138 -//.word 0xe3c2b3a7 -//.word 0x248fdbbe -//.word 0x751cf47a -//.word 0x6aff45d7 -//.word 0xa3a6964d -//.word 0x44f9429b -//.word 0xa43b8ec3 -//.word 0x4a313956 -//.word 0x158754f1 -//.word 0xba6f5408 -//.word 0x748b66e2 -//.word 0xf60d02e5 -//.word 0xa51dc314 -//.word 0x047b76d6 -//.word 0x6f6571f9 -//.word 0x0dbb26f6 -//.word 0x0061f777 -//.word 0xdee54c16 -//.word 0x6561e368 -//.word 0x6aa3683a -//.word 0x138c461a -//.word 0x46b6bc1a -//.word 0x615933d0 -//.word 0x2c70cfa1 -//.word 0x0c174440 -//.word 0x7938eb71 -//.word 0xb1661513 -//.word 0xae099f5d -//.word 0x56bcc668 -//.word 0xf3f33ded -//.word 0xe2e17d51 -//.word 0x8f995dde -//.word 0xa173e254 -//.word 0x71b158a0 -//.word 0xc162a1eb -//.word 0xab87ced6 -//.word 0xd775ec04 -//.word 0xf17a20da -//.word 0x5ac3f782 -//.word 0x1e7df736 -//.word 0x273b7abb -//.word 0xb098bc2b -//.word 0xfc1d32f8 -//.word 0x47651d2e -//.word 0xfd7e60f8 -//.word 0x2a938e66 -//.word 0x31c8486d -//.word 0xc266c630 -//.word 0x0638b37d -//.word 0x1c353e9b -//.word 0xc95e6e43 -//.word 0x6beab5ec -//.word 0x2fa1c94c -//.word 0x8486af1b -//.word 0xd0b8181a -//.word 0x619af154 -//.word 0xa63236a3 -//.word 0x9fcf0777 -//.word 0x92effdd3 -//.word 0x005fbe98 -//.word 0xd7a4cf06 -//.word 0xe99aaa80 -//.word 0x9d5b118f -//.word 0xe462a12a -//.word 0x6ff1aa35 -//.word 0x20af3e47 -//.word 0xbe9688b0 -//.word 0xec0c5fbb -//.word 0x5c501b30 -//.word 0x4018a81d -//.word 0x0179d9d6 -//.word 0x3406fe3b -//.word 0xca3cb839 -//.word 0x861e0c94 -//.word 0xb51cb7e3 -//.word 0x1939c1dc -//.word 0x266d55d1 -//.word 0x7148d07b -//.word 0x65d918f7 -//.word 0x37ce2f0e -//.word 0x1ddc08b9 -//.word 0xbb6299e4 -//.word 0xde493173 -//.word 0x6d2e0c83 -//.word 0x9dc325f2 -//.word 0x63724b21 -//.word 0x2f4477f8 -//.word 0xd7025d2b -//.word 0xd19a41bc -//.word 0xa6c30cc2 -//.word 0xa3e49f68 -//.word 0xd2326738 -//.word 0x2919319a -//.word 0x00de4097 -//.word 0xc9829de3 -//.word 0xfbe9af1b -//.word 0x4f3c0b4b -//.word 0x2f8b8db3 -//.word 0x6bb7a8cb -//.word 0x2f8ffa84 -//.word 0x323924d1 -//.word 0x2fd4d866 -//.word 0x995b34bf -//.word 0x8bcc4e65 -//.word 0xfe8a106d -//.word 0x3e004641 -//.word 0x9f88f5a3 -//.word 0x6b8beeee -//.word 0x20e9a49f -//.word 0xd89b3b15 -//.word 0x0997e195 -//.word 0x6ef36191 -//.word 0x454ef52a -//.word 0xbb6c5cf3 -//.word 0xa5202df8 -//.word 0x706f6bff -//.word 0x5bf2590d -//.word 0xe37c902c -//.word 0x7ffd4e6c -//.word 0x8ea61128 -//.word 0x8e4e658a -//.word 0x8e15fa51 -//.word 0xe647f9d2 -//.word 0x2583983d -//.word 0x4b1ced22 -//.word 0x39bfff34 -//.word 0x6556234c -//.word 0xd22d86b1 -//.word 0x40530696 -//.word 0xa04446e4 -//.word 0xcac4013a -//.word 0x720e9e32 -//.word 0x582e05e7 -//.word 0xc0acb2b4 -//.word 0x226a073e -//.word 0x22cfe7b4 -//.word 0xc2258055 -//.word 0xd7406833 -//.word 0xba61ec37 -//.word 0x3f5aa566 -//.word 0xebf24c62 -//.word 0x618ace34 -//.word 0x1e01a348 -//.word 0x66d65cb9 -//.word 0x7e8c7cd0 -//.word 0x1c5389c7 -//.word 0x1ce463d2 -//.word 0x74add460 -//.word 0x6a2e679d -//.word 0x05a37e3c -//.word 0xc1e39f75 -//.word 0x86880f49 -//.word 0xdb50a20d -//.word 0x58c3d126 -//.word 0x59160d12 -//.word 0xfa5053a8 -//.word 0x3fab01a0 -//.word 0x923de855 -//.word 0x73d7a2ca -//.word 0x6b2e25eb -//.word 0x41389916 -//.word 0x71d967da -//.word 0xdabf93ff -//.word 0xb78b4bc6 -//.word 0xd031c071 -//.word 0xf2a13406 -//.word 0x9ca75451 -//.word 0xfb0fc928 -//.word 0x180e0af3 -//.word 0x51dd746b -//.word 0x06a79ca1 -//.word 0x94a5e442 -//.word 0x87884c1a -//.word 0x0b178bd8 -//.word 0xa4195f11 -//.word 0x1f752187 -//.word 0xc9989caa -//.word 0xde171f5f -//.word 0x4495d101 -//.word 0x79e845a5 -//.word 0xcb774ea3 -//.word 0xc7e61552 -//.word 0xf3f66812 -//.word 0xc0a65590 -//.word 0xba9ff845 -//.word 0x02ce9140 -//.word 0xfe53d926 -//.word 0x4f9a9777 -//.word 0x03c76e12 -//.word 0x0c58f9fc -//.word 0xf1051a5d -//.word 0xc4eb8ecb -//.word 0x54eac5cb -//.word 0xa34cf195 -//.word 0x9ba75e18 -//.word 0xfc04013e -//.word 0x99405371 -//.word 0xc4b3605e -//.word 0x07101af9 -//.word 0x158cf4c1 -//.word 0xff43ac45 -//.word 0xabd768e7 -//.word 0x835a05e0 -//.word 0x6a6eac84 -//.word 0xf4aaa6c7 -//.word 0xd6407101 -//.word 0x9bdd13ee -//.word 0x99d1aef9 -//.word 0x247055ba -//.word 0x01b81ebd -//.word 0x1d347885 -//.word 0x7f1fbfd0 -//.word 0x7ccd0e1d -//.word 0x2a47556c -//.word 0x1736ab45 -//.word 0x3a02e5fb -//.word 0x293a6732 -//.word 0x8d373a9f -//.word 0xd3fc5f0f -//.word 0x256163ab -//.word 0x9971347a -//.word 0xa8103327 -//.word 0xe1e18a05 -//.word 0xde66c050 -//.word 0x78698bb6 -//.word 0x379be515 -//.word 0x0c7c6187 -//.word 0x437ac09c -//.word 0xb35dbfe6 -//.word 0x38e234bb -//.word 0x63a65936 -//.word 0x6f46687f -//.word 0x77c5684c -//.word 0xe72e46a8 -//.word 0x317a27f4 -//.word 0xc1b3fd2b -//.word 0x325a586a -//.word 0xc20780af -//.word 0x034fc0e0 -//.word 0xd4ea0410 -//.word 0x9015a7ff -//.word 0x853686df -//.word 0xa8bf595e -//.word 0x865443e0 -//.word 0x7e30a780 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x0000D978 -//// expected output -//.word 0xafbe6328 -//.word 0x20e278b6 -//.word 0x33260ee8 -//.word 0x6ea0c2a8 -//.word 0x8735afec -//.word 0xe12932ef -//.word 0x44d5e762 -//.word 0x168bc285 -//.word 0x30a88bf4 -//.word 0x9bd80ba3 -//.word 0x6ceabafb -//.word 0xeba7fea0 -//.word 0xba783398 -//.word 0x109b10bf -//.word 0x1373a331 -//.word 0x6e72ad68 -//// SHA512LongMsgvector_70 -//// vector length -//.word 0x0000DC90 -//// input message -//.word 0x7a57070d -//.word 0xe9006a0e -//.word 0xaba8e38c -//.word 0xb24c0d08 -//.word 0x8e08261a -//.word 0x86dac157 -//.word 0xe8a9ba77 -//.word 0x9d866fb8 -//.word 0x00312d7d -//.word 0xf1dfe93b -//.word 0x243a3195 -//.word 0xbfaa62c6 -//.word 0x25d31a40 -//.word 0x0c5ff092 -//.word 0xd6fd638f -//.word 0x1ea911ad -//.word 0x912f2aab -//.word 0xffea2377 -//.word 0xb1d2af4e -//.word 0xfeb6eb25 -//.word 0x19c5d848 -//.word 0x2d530f41 -//.word 0xacdab0fb -//.word 0xe43f9c27 -//.word 0xd357e4df -//.word 0x3caa8189 -//.word 0xfa7745ff -//.word 0x95f811ed -//.word 0x13e6497a -//.word 0x1040852a -//.word 0x11498902 -//.word 0x16d078ee -//.word 0x6eb34461 -//.word 0xcfa6693b -//.word 0xa631dbef -//.word 0xacf83ce5 -//.word 0xba3f531d -//.word 0xdeadba16 -//.word 0xae50d6ee -//.word 0xdce20cca -//.word 0x0b4b3278 -//.word 0xe1664453 -//.word 0x5e085967 -//.word 0x6c3fd5d6 -//.word 0xb7d7df7b -//.word 0xbe2316cc -//.word 0x2bfa7f05 -//.word 0x5fffc283 -//.word 0x5225976d -//.word 0x9a737b9a -//.word 0xc905a7af -//.word 0xfc544288 -//.word 0xb1b7d6da -//.word 0xd9290116 -//.word 0x2f4c6d90 -//.word 0xc7ae01e0 -//.word 0xea4b5988 -//.word 0x215474d8 -//.word 0x902fad0f -//.word 0x85bfedc3 -//.word 0x51e51e83 -//.word 0x5747e3ba -//.word 0x625086d6 -//.word 0x3c7832aa -//.word 0x7cc56211 -//.word 0x9f9199d5 -//.word 0x5a8f54cf -//.word 0x2f093c4f -//.word 0x3f6ba1be -//.word 0x5f052481 -//.word 0x6d0db321 -//.word 0xe5e3bba9 -//.word 0xaf999850 -//.word 0x3bb35158 -//.word 0xd02b8236 -//.word 0x21b999f3 -//.word 0x225145d2 -//.word 0x19ec2c33 -//.word 0xf88bddb7 -//.word 0xea7905a5 -//.word 0x2cd1e58d -//.word 0x1e41032b -//.word 0x9a0d208d -//.word 0x84576b78 -//.word 0xa29df409 -//.word 0xae836398 -//.word 0xaad3eae1 -//.word 0x74c27866 -//.word 0x9a75300f -//.word 0x6fc31914 -//.word 0x5f3d171c -//.word 0x7f6b1aa7 -//.word 0x685995a9 -//.word 0x46523277 -//.word 0x2cecc4e7 -//.word 0xab457cb3 -//.word 0xa28b611f -//.word 0x57c2fadc -//.word 0xc7c14d2b -//.word 0x3b7e0e46 -//.word 0x1c8c10fb -//.word 0x08e2ff9a -//.word 0x25de5111 -//.word 0xb68a7a56 -//.word 0xec1d5f05 -//.word 0xfec50e4b -//.word 0x7ca3ac02 -//.word 0xe017ae1d -//.word 0x663f4d47 -//.word 0x1dba33c7 -//.word 0x3eb27ba7 -//.word 0xbd19d815 -//.word 0x1f321409 -//.word 0x8b54bd28 -//.word 0x23eb1be9 -//.word 0x95bf64f6 -//.word 0xec7933d5 -//.word 0xad6337c7 -//.word 0x1f6f28f0 -//.word 0xea7b00b9 -//.word 0xe3d36773 -//.word 0x27f76f3d -//.word 0x679f8127 -//.word 0x82fd9897 -//.word 0x5942acec -//.word 0xdf637262 -//.word 0x6f1d4235 -//.word 0x6337580a -//.word 0xe207408a -//.word 0xf9378c50 -//.word 0xedc9c805 -//.word 0xd059b0c9 -//.word 0x53a2a0d5 -//.word 0xdb444b5f -//.word 0xd7c5b0be -//.word 0x50d54acf -//.word 0xc1d68797 -//.word 0x2a9b7c2a -//.word 0x6070d7cb -//.word 0xa75b1554 -//.word 0x82a2f5d9 -//.word 0xca8d2c88 -//.word 0xfe6d5ad3 -//.word 0xdadd3dd2 -//.word 0x2b4824e2 -//.word 0xe1aca793 -//.word 0x669d96c1 -//.word 0x2e8c2f00 -//.word 0x9049943e -//.word 0xd4c77ca3 -//.word 0x8d2028bc -//.word 0x29d899d9 -//.word 0xc66600b3 -//.word 0x47f07652 -//.word 0xa757ed2e -//.word 0x8e736695 -//.word 0x22a0654c -//.word 0x2079a279 -//.word 0x2be302c0 -//.word 0x644ec5ad -//.word 0x3a370152 -//.word 0x84f14f31 -//.word 0xcda6c45c -//.word 0xee9923da -//.word 0xe3ad504d -//.word 0xd72b08d2 -//.word 0x81c0d029 -//.word 0xb3c52b16 -//.word 0x30c31006 -//.word 0xbf379bf6 -//.word 0x7d920391 -//.word 0x7784cc98 -//.word 0x787a3e87 -//.word 0x20661576 -//.word 0x36be7a3d -//.word 0x3fc732db -//.word 0x50131619 -//.word 0x2048c36a -//.word 0x61249216 -//.word 0x51becb97 -//.word 0x8c0f1543 -//.word 0x24b0312c -//.word 0xf3e5e845 -//.word 0x30db42c6 -//.word 0x412ef9d1 -//.word 0xd0ae2d55 -//.word 0x21635933 -//.word 0xa3cf869f -//.word 0xc572bfc9 -//.word 0x0a94c4bd -//.word 0x603e0388 -//.word 0xae8ac39d -//.word 0xac1ca377 -//.word 0xf7f1437f -//.word 0x6558412f -//.word 0x953d6778 -//.word 0xcbad2261 -//.word 0xfb9736f2 -//.word 0x24d0b150 -//.word 0xe05a1d29 -//.word 0x38e6fa52 -//.word 0xbc976caf -//.word 0xd4093054 -//.word 0x5192d4e9 -//.word 0x47c82853 -//.word 0x1f43f091 -//.word 0xe8a4dbe3 -//.word 0xeed5b932 -//.word 0x8e93e8ac -//.word 0x482a0faf -//.word 0x16800fe8 -//.word 0xfc5537bc -//.word 0xe1c9b8e6 -//.word 0x9d1f5862 -//.word 0x53c06a8a -//.word 0x0183fd80 -//.word 0x552b54cb -//.word 0xc3329645 -//.word 0xd4c5c734 -//.word 0xc10ff7b7 -//.word 0x40bab964 -//.word 0x9eb3d72f -//.word 0x0e2e448d -//.word 0x41eb52da -//.word 0x36b725f8 -//.word 0x5435683a -//.word 0xb6de3e80 -//.word 0xc6477ca3 -//.word 0x0da21513 -//.word 0x4988d6be -//.word 0xc0f65334 -//.word 0xd5952109 -//.word 0xd93e457b -//.word 0x23bded55 -//.word 0x63d55e14 -//.word 0x33852e47 -//.word 0xef8ab33c -//.word 0xc725bbd8 -//.word 0x121e7dc7 -//.word 0xe509d0d6 -//.word 0xe5c89b9c -//.word 0x59518d60 -//.word 0x84b20e37 -//.word 0x3152756d -//.word 0x8f797b26 -//.word 0x3f12ef45 -//.word 0xacb0ac8d -//.word 0x9bd0c906 -//.word 0x035e0fa3 -//.word 0x1e7ab021 -//.word 0xc07b3532 -//.word 0xe834b9db -//.word 0x9477551b -//.word 0xdad8dbcd -//.word 0x35b3c7cf -//.word 0x1d717264 -//.word 0xda0689d7 -//.word 0x99bebe62 -//.word 0xc03abd4d -//.word 0x7fb5625a -//.word 0xa78d2961 -//.word 0xc0fee638 -//.word 0x5630b6d5 -//.word 0x937435b7 -//.word 0x13caf182 -//.word 0xf3a81fe9 -//.word 0x2bf68dd0 -//.word 0x1e5dd8b2 -//.word 0x70c1df41 -//.word 0x180c774d -//.word 0xb62e61e7 -//.word 0x266279c6 -//.word 0x55b22fea -//.word 0x53bd3b7e -//.word 0xaab88d03 -//.word 0xefb383ab -//.word 0x961d5f03 -//.word 0x0a8bf8d5 -//.word 0xfeb5b04d -//.word 0xfdc1a55a -//.word 0x49c52c57 -//.word 0xe2877beb -//.word 0xe587a52e -//.word 0x173fcc0d -//.word 0xc2a991ef -//.word 0xc002d099 -//.word 0xd5ce8b4e -//.word 0x421c233b -//.word 0x960bce13 -//.word 0xc88d45f7 -//.word 0x836bbd98 -//.word 0xc189199f -//.word 0x9b6c5e4d -//.word 0x5ff9675e -//.word 0xe47fda34 -//.word 0x1af85a31 -//.word 0xe58cfe65 -//.word 0x2c570269 -//.word 0x2d6cbd8a -//.word 0x131ad32a -//.word 0xca6eac64 -//.word 0x12f825ef -//.word 0xd2d28545 -//.word 0xafdfb204 -//.word 0xde51a594 -//.word 0x366e1b0a -//.word 0x8a938d4c -//.word 0x35796376 -//.word 0xf6b7657d -//.word 0xff887213 -//.word 0x48cf74ca -//.word 0x2958937b -//.word 0x2861a9e9 -//.word 0x1059f6a2 -//.word 0x43e71626 -//.word 0x502e2f4b -//.word 0xc8506fe0 -//.word 0x4e30b691 -//.word 0xee7d8f0a -//.word 0xb0ec6560 -//.word 0x6cc4f4ac -//.word 0xdfa0fdf9 -//.word 0xff703e60 -//.word 0x8cc2a171 -//.word 0xe840b4d5 -//.word 0x28795932 -//.word 0x6be4bf4f -//.word 0x6a219079 -//.word 0x51836c25 -//.word 0xcecc97d6 -//.word 0x6737ee41 -//.word 0x10bc20af -//.word 0xfd8f1aa4 -//.word 0xb5eac3be -//.word 0x680ceadf -//.word 0x82827c8f -//.word 0x80a5fb9b -//.word 0x02642b02 -//.word 0x22430f12 -//.word 0x05a413cf -//.word 0xaf458b94 -//.word 0x1c0b5cfd -//.word 0x8cfef903 -//.word 0x1e949269 -//.word 0xa0328858 -//.word 0xa6f02346 -//.word 0xd99d871c -//.word 0x9203e497 -//.word 0xa86beeee -//.word 0x86648db6 -//.word 0x80c1d503 -//.word 0x67e138d1 -//.word 0x5a33faa2 -//.word 0xe0f8e668 -//.word 0x344b40a4 -//.word 0xe05ffad0 -//.word 0x8d092afb -//.word 0x1a7ebcb3 -//.word 0xeb5d6427 -//.word 0x84f0d78d -//.word 0x56af3bc2 -//.word 0xd805dc30 -//.word 0xda5720f5 -//.word 0x1743bd42 -//.word 0x09252900 -//.word 0x01e053ba -//.word 0x76db90b7 -//.word 0x9d49d866 -//.word 0x3bae3200 -//.word 0xb89e6d68 -//.word 0x74c81156 -//.word 0x5e3495b4 -//.word 0xc2c9d248 -//.word 0x6212b894 -//.word 0xc94240fa -//.word 0xdc75a124 -//.word 0xb238c7a3 -//.word 0xa54c01d6 -//.word 0xa9a7fa0e -//.word 0xddbceaef -//.word 0x60fc0d1a -//.word 0x669d5509 -//.word 0x8b9a5c39 -//.word 0x67fb9c8f -//.word 0x6256e2f5 -//.word 0xc9960044 -//.word 0x22fbc266 -//.word 0xbd6224bc -//.word 0x8cc7c2bd -//.word 0x340890e0 -//.word 0x64ebcbbc -//.word 0x6663306e -//.word 0xf40f6b3c -//.word 0x4c04d278 -//.word 0x87cc53a6 -//.word 0x26aeabe1 -//.word 0xee30d97a -//.word 0xf6dbd3e3 -//.word 0xfe3e77cb -//.word 0x0236c48b -//.word 0x0f6c4ac1 -//.word 0x561edf3a -//.word 0x7f239416 -//.word 0x3f29e826 -//.word 0x2d423b99 -//.word 0xd19f85d8 -//.word 0xfe9a47ae -//.word 0x62fac2ac -//.word 0x5c7368cc -//.word 0x0d6d9054 -//.word 0xb2076dfd -//.word 0x315a4155 -//.word 0xf102ce62 -//.word 0xefdb0d88 -//.word 0x0f0823ac -//.word 0xb03a919a -//.word 0x822eaba4 -//.word 0x9c784b8c -//.word 0xc980c6a5 -//.word 0x23ca1f34 -//.word 0xe47a7b1c -//.word 0x7817d5bb -//.word 0xd78ff30f -//.word 0x117b991d -//.word 0x2aa5fc93 -//.word 0x29c779ac -//.word 0x6c968754 -//.word 0x3effeb8d -//.word 0xacb12b11 -//.word 0x94db4438 -//.word 0xfe379f1d -//.word 0xaf4742fc -//.word 0xfcdf44df -//.word 0xdde3837a -//.word 0x42529953 -//.word 0xaa830b26 -//.word 0xf1afc487 -//.word 0x69b0c2c9 -//.word 0x2d08101f -//.word 0xb225f401 -//.word 0x9fe469d1 -//.word 0xdf53cfbf -//.word 0xf4bbe2ea -//.word 0x8edee9c7 -//.word 0x5c7d2fc7 -//.word 0x221db734 -//.word 0x0c0b2c5c -//.word 0x429e17f2 -//.word 0xbcbc55b1 -//.word 0x589fc742 -//.word 0x29d94b60 -//.word 0x1296eb3a -//.word 0x94225519 -//.word 0xe5ab8b42 -//.word 0x4247dc1e -//.word 0x85391398 -//.word 0xfa70eec7 -//.word 0x6f50d2cd -//.word 0x8ab5bcff -//.word 0x60357b46 -//.word 0x42a61dc4 -//.word 0xdae0a7bb -//.word 0x78c409ab -//.word 0xa67e50bb -//.word 0x02061e5a -//.word 0x4ded5726 -//.word 0xbf561e0d -//.word 0x9d4300b2 -//.word 0x0e126e12 -//.word 0x2b477167 -//.word 0x558b994d -//.word 0xcbf53723 -//.word 0x7b89cbb4 -//.word 0x19fec016 -//.word 0x6fc557d3 -//.word 0xf446e247 -//.word 0x9f6d3249 -//.word 0xfd65520e -//.word 0x82a37649 -//.word 0x1d272e97 -//.word 0x0efedf1b -//.word 0xfc0c7465 -//.word 0x42085199 -//.word 0x8bc888cd -//.word 0x9ebf50b2 -//.word 0x7bc4b377 -//.word 0xa61486ea -//.word 0xc39b9ee1 -//.word 0x636f41d8 -//.word 0x1e9edbdb -//.word 0xe229f2a7 -//.word 0x8a505c0c -//.word 0xb210b095 -//.word 0xcaebfa6b -//.word 0x6ae7b377 -//.word 0xe5d9f0c7 -//.word 0x21e3d933 -//.word 0xa63c5d40 -//.word 0xf42f2444 -//.word 0x1a67c5cb -//.word 0x84693a3a -//.word 0x156291b2 -//.word 0x7623e337 -//.word 0xad6a8a12 -//.word 0xf1638f73 -//.word 0xbc6e625b -//.word 0x2323ceb9 -//.word 0x63932bd4 -//.word 0xbcd1d6e8 -//.word 0x82b2de14 -//.word 0x71d00073 -//.word 0x41d5d68a -//.word 0x7af64be2 -//.word 0x8abd52f5 -//.word 0x140cd84f -//.word 0x8c5ff6ed -//.word 0x01516ce9 -//.word 0x39624b59 -//.word 0x03f7f174 -//.word 0xc9a23af6 -//.word 0x65a4f5c6 -//.word 0x35b095d6 -//.word 0x72f2294b -//.word 0xbd508fdf -//.word 0xfbf0e483 -//.word 0x63fa3e48 -//.word 0xd59f9e7f -//.word 0x6e5a201f -//.word 0x59757568 -//.word 0xe8d093c6 -//.word 0xe3deabf8 -//.word 0x20f05c71 -//.word 0x53b626ff -//.word 0x280221aa -//.word 0x8fd0efdf -//.word 0x5784efce -//.word 0xff72b310 -//.word 0xc9a3b58d -//.word 0x0fd6459d -//.word 0xdac6c66d -//.word 0xb1ab1aa5 -//.word 0xaf035b47 -//.word 0xd992ccda -//.word 0xaea80fc9 -//.word 0xffa29806 -//.word 0x00b361f2 -//.word 0xa0e5df81 -//.word 0x165a3699 -//.word 0xbcd8a9bc -//.word 0x218554e7 -//.word 0x59ee1dba -//.word 0x984ee8d8 -//.word 0x000e0a91 -//.word 0xb68800bf -//.word 0x3b1062ed -//.word 0xfa3512bf -//.word 0x1d44b98e -//.word 0xa50e7452 -//.word 0xbaebcac5 -//.word 0x3fffe2c5 -//.word 0xaabcf2fa -//.word 0x13a8fbba -//.word 0x8a61b429 -//.word 0xaedec3a5 -//.word 0x7cf73361 -//.word 0x6428234f -//.word 0xa292bb44 -//.word 0xcb426557 -//.word 0xa6b6398a -//.word 0x3e9db8ac -//.word 0x35dfbe7d -//.word 0x5bddb214 -//.word 0x7ffa007e -//.word 0x865ac9a8 -//.word 0xbaead97e -//.word 0x64a0d955 -//.word 0x9c04c586 -//.word 0x60efa15c -//.word 0xe4926831 -//.word 0x29bb46d3 -//.word 0xd154062d -//.word 0x322cce23 -//.word 0xa9fb0abd -//.word 0x30a0a688 -//.word 0x33ac8039 -//.word 0xa0241d94 -//.word 0x3e839b8c -//.word 0x3fffe6ac -//.word 0x180d2fb5 -//.word 0x90279a89 -//.word 0x17cd3747 -//.word 0x5aca34b8 -//.word 0x14b851ea -//.word 0x27c6931a -//.word 0xebb93dd7 -//.word 0xc631fc65 -//.word 0xfd2e6260 -//.word 0xc9d295a1 -//.word 0xae694966 -//.word 0x08a6ebac -//.word 0xe72f1fe0 -//.word 0x1c5d6db7 -//.word 0x943c375b -//.word 0xe5daefc7 -//.word 0x27be8774 -//.word 0x05b62835 -//.word 0x13d6265f -//.word 0x63bd342e -//.word 0x531ad464 -//.word 0xa86f1233 -//.word 0xe115725d -//.word 0xc581279a -//.word 0x3fc5853a -//.word 0x6b59b90b -//.word 0xf11cb87d -//.word 0x92967504 -//.word 0x008057be -//.word 0xf386ea56 -//.word 0x794bd528 -//.word 0x8dae0ca6 -//.word 0xec4c46fa -//.word 0x2445b2ed -//.word 0xee44e507 -//.word 0xbdb917f7 -//.word 0x97699036 -//.word 0x24295de8 -//.word 0x05e64703 -//.word 0x66e906b2 -//.word 0xd759b1fc -//.word 0x570279a1 -//.word 0xb2549744 -//.word 0x0eaf83cf -//.word 0xc0de6714 -//.word 0x64e1d3b0 -//.word 0x2cefb235 -//.word 0x78bb7d88 -//.word 0xa7f7ae87 -//.word 0x2d1678ef -//.word 0xe657b57d -//.word 0xabff2054 -//.word 0x22e5c49f -//.word 0xda34b477 -//.word 0x976dfd07 -//.word 0xeaabd9ee -//.word 0x052b25e4 -//.word 0xce0b15a1 -//.word 0x325227fb -//.word 0xbc31554e -//.word 0x66898f20 -//.word 0xafac6805 -//.word 0xed6810c1 -//.word 0xe54282ad -//.word 0x99fffe5c -//.word 0x6169ba7d -//.word 0x3d4fd503 -//.word 0x6ace8c84 -//.word 0x33cfb0df -//.word 0x0ad15722 -//.word 0xd7e9d3ab -//.word 0x9006e08d -//.word 0x0a7a2135 -//.word 0x0fb6ce4d -//.word 0xb055a7e0 -//.word 0xdc5d2cbf -//.word 0x32c10f24 -//.word 0x142aea96 -//.word 0xfdf62e0c -//.word 0x14815b55 -//.word 0x01a477b7 -//.word 0xff7cb9d7 -//.word 0x326d85d8 -//.word 0x3c669dc7 -//.word 0x0b669537 -//.word 0xf43f8728 -//.word 0x069a092e -//.word 0x983b5ccf -//.word 0x2586e62c -//.word 0x5a42e2e4 -//.word 0x6c9e5735 -//.word 0xaf714664 -//.word 0x65c6285f -//.word 0xd39898a2 -//.word 0x9bda4c57 -//.word 0x45bb49c1 -//.word 0x1f2757da -//.word 0x4791b33b -//.word 0x06f0053d -//.word 0x5f07915e -//.word 0xe8eab1e6 -//.word 0xd9be83ca -//.word 0x63c0dfd0 -//.word 0x43898cf4 -//.word 0x9690b30a -//.word 0xeff093a6 -//.word 0xa76b7739 -//.word 0x74afe57c -//.word 0x3dd91912 -//.word 0x2d38b269 -//.word 0x0753aae1 -//.word 0xb92d8b30 -//.word 0x33c7e005 -//.word 0x79e7eaeb -//.word 0xf7189570 -//.word 0x16f2aa87 -//.word 0x0c9b462c -//.word 0xf88e8b46 -//.word 0x2e9b95d1 -//.word 0xcf2fb03c -//.word 0x9ed6c810 -//.word 0x0efe21d3 -//.word 0xa0fe482c -//.word 0x6b574948 -//.word 0xfc39227b -//.word 0x6149782b -//.word 0x81a189ea -//.word 0xaf1862e2 -//.word 0x7ec45176 -//.word 0xd6be9e26 -//.word 0x472576b3 -//.word 0x9e662884 -//.word 0xb6ba9449 -//.word 0x91f0dfde -//.word 0xa76c6c72 -//.word 0x7e7008e8 -//.word 0x7b9a657d -//.word 0xf8aecaac -//.word 0x9796084f -//.word 0xd5a7b006 -//.word 0xe22683dc -//.word 0xb00b2a28 -//.word 0x490428b2 -//.word 0x67bd0c17 -//.word 0x3e5feb6f -//.word 0x9d570d2c -//.word 0x3558e745 -//.word 0x38a34995 -//.word 0x2786d97e -//.word 0xe522c0d1 -//.word 0x0f72a3f2 -//.word 0x9089d537 -//.word 0x6f1bcb92 -//.word 0xec3fd070 -//.word 0xcc73f9e0 -//.word 0xf1e15cf8 -//.word 0x2de17d74 -//.word 0x58be09a1 -//.word 0xa0bdc77a -//.word 0x215bcb10 -//.word 0xb6d7ed2f -//.word 0x0ef0793e -//.word 0x02f02867 -//.word 0x25e94ff8 -//.word 0x9d3f5709 -//.word 0x32666d60 -//.word 0xa5ed7a91 -//.word 0x43bc5669 -//.word 0xb99a398d -//.word 0x2af2725f -//.word 0x7fd65b21 -//.word 0xff448c5d -//.word 0x1fa84f84 -//.word 0x9ba354d5 -//.word 0xc50ba680 -//.word 0x1d33de0c -//.word 0x236c97f6 -//.word 0x69cb219b -//.word 0xec2d7a57 -//.word 0xa47979ef -//.word 0x5a254d2c -//.word 0xbafc26c9 -//.word 0xa91e3290 -//.word 0xd948cbbf -//.word 0x9a55efb0 -//.word 0xf305f0b9 -//.word 0xf1fe6c52 -//.word 0x3f108075 -//.word 0xf7bd394b -//.word 0xb8f94b04 -//.word 0xf92e0606 -//.word 0x9c83854b -//.word 0xc65e2904 -//.word 0xef274683 -//.word 0x35501b57 -//.word 0xf69208b9 -//.word 0x9d79fb27 -//.word 0xbc222c4e -//.word 0x5c440a2d -//.word 0x916d7478 -//.word 0x518e2d3a -//.word 0x85ba8abf -//.word 0x612b6eb1 -//.word 0xf1867881 -//.word 0xf55f7b08 -//.word 0xef002f6f -//.word 0x7a66264c -//.word 0xdd8d010d -//.word 0xe0eee39a -//.word 0xdf452636 -//.word 0x1c974da6 -//.word 0x59743a96 -//.word 0xa77aa238 -//.word 0x791abd2e -//.word 0xfc9f42aa -//.word 0xab6b92d4 -//.word 0x1e84336c -//.word 0x225081b0 -//.word 0x0f9da080 -//.word 0x56e4b5c0 -//.word 0x5acf56fe -//.word 0x81f83f54 -//.word 0x8af44690 -//.word 0x21909193 -//.word 0xb05a06f7 -//.word 0x796403f5 -//.word 0xe2444f85 -//.word 0x0f5f51c6 -//.word 0xb66880a1 -//.word 0x2f231ba9 -//.word 0xcb6f1a46 -//.word 0x67836413 -//.word 0x41784284 -//.word 0x0a0814cc -//.word 0x3c9543fe -//.word 0xad6c7672 -//.word 0x654c096a -//.word 0xac22bbf5 -//.word 0x6817a614 -//.word 0xa6cc751c -//.word 0x77e4d15b -//.word 0xfdc41cfe -//.word 0xc5966232 -//.word 0x57948c8a -//.word 0x0c83d7a1 -//.word 0x207d8500 -//.word 0x08f4d342 -//.word 0x06f42a76 -//.word 0xfaa899c4 -//.word 0x7b208354 -//.word 0x2651956b -//.word 0x365efbd7 -//.word 0x5616d48e -//.word 0xb3bde392 -//.word 0x540f8717 -//.word 0xae82ede8 -//.word 0x73cc8407 -//.word 0xaca5b193 -//.word 0x07cec5ef -//.word 0x72522c21 -//.word 0xe80ce678 -//.word 0x8b693c72 -//.word 0xf46fabdc -//.word 0xc7fe253b -//.word 0x8a56796b -//.word 0xb7da0f86 -//.word 0x0f14d808 -//.word 0x32f88530 -//.word 0x6d6df7a9 -//.word 0xd309f769 -//.word 0x8f1c28da -//.word 0x78f13937 -//.word 0xe6505f39 -//.word 0xc44703f4 -//.word 0xe72bb8fb -//.word 0x9ed96fcb -//.word 0x8b41ee67 -//.word 0xb1267e3f -//.word 0xcd1fe456 -//.word 0xeae293a4 -//.word 0x30c120ba -//.word 0xfd75f6a4 -//.word 0x371b4b13 -//.word 0xe07c53bc -//.word 0xea91b3fb -//.word 0x4d4738bc -//.word 0x587fc99b -//.word 0x44599a4a -//.word 0x0fb2a333 -//.word 0x88eb515f -//.word 0xa6ec7b97 -//.word 0x1d6997c9 -//.word 0x33642ead -//.word 0xd0f48da7 -//.word 0xd544bef0 -//.word 0xafdeb6f1 -//.word 0x2c2ad0ef -//.word 0x8d317aed -//.word 0xdca72ece -//.word 0x8029a5bb -//.word 0x0ec347c4 -//.word 0x62b5e5ca -//.word 0xef77aa9c -//.word 0x53fa4f60 -//.word 0x2e318f35 -//.word 0x35d0db16 -//.word 0x82544e01 -//.word 0x2e43e359 -//.word 0x22b5e68a -//.word 0x2a13a8eb -//.word 0x4c1f77e8 -//.word 0x5734cd60 -//.word 0xbecfc84c -//.word 0xa74fdaa2 -//.word 0x40f9c279 -//.word 0x523fbb6d -//.word 0x1842f345 -//.word 0x51953ed3 -//.word 0x94440c1c -//.word 0xe41599b9 -//.word 0x840d637d -//.word 0x0c36e158 -//.word 0xbda0727b -//.word 0x12a694bd -//.word 0x9772563e -//.word 0xfec4104a -//.word 0x70ee5180 -//.word 0x21241933 -//.word 0x27f24810 -//.word 0x8c0e5701 -//.word 0xa2504652 -//.word 0x96ffd513 -//.word 0x484ef7bd -//.word 0x5a268418 -//.word 0x88262e5b -//.word 0x37e9b695 -//.word 0x5087604d -//.word 0x4e5ea465 -//.word 0x96122645 -//.word 0x07d2e835 -//.word 0xd3ddbe09 -//.word 0x8d450304 -//.word 0x83f38bf7 -//.word 0x4decd8a9 -//.word 0xa6d3917b -//.word 0x7bae2f4c -//.word 0x42edfa9b -//.word 0x8da834eb -//.word 0xdf28946c -//.word 0xbea9f6d7 -//.word 0x095e509a -//.word 0x8cb6e835 -//.word 0xd2dec4e4 -//.word 0x3a87627e -//.word 0x4de9aa9d -//.word 0x4f0721ff -//.word 0x14355f2c -//.word 0x16d8c359 -//.word 0xc46e658d -//.word 0x1cce4c02 -//.word 0x7bb0e2ce -//.word 0xb46fa4c2 -//.word 0x600e1e93 -//.word 0x767a1737 -//.word 0x1c0e0992 -//.word 0xbc5cd452 -//.word 0x592bb218 -//.word 0x24bc6ed8 -//.word 0x4a52d182 -//.word 0x11f05ee2 -//.word 0x23653fc5 -//.word 0x29867e5d -//.word 0x9cbb78e6 -//.word 0xd8bd8f8a -//.word 0x739d2082 -//.word 0xcc09b57f -//.word 0xe7cb7b48 -//.word 0x7892f6a4 -//.word 0x3df5f37a -//.word 0x91b5be37 -//.word 0x3f429670 -//.word 0x94815ec9 -//.word 0xb8cd9515 -//.word 0x3e3c88be -//.word 0xf923c667 -//.word 0x11dcd5d1 -//.word 0x57c623fb -//.word 0xd68e3f8e -//.word 0xaaad4977 -//.word 0x1632a8d6 -//.word 0xd0c2fa17 -//.word 0x9fdd515e -//.word 0x28629c29 -//.word 0x05566331 -//.word 0x18e1b891 -//.word 0x1f996a29 -//.word 0x88047b45 -//.word 0x8657d47a -//.word 0x648438d1 -//.word 0x1a747728 -//.word 0x1e91e4d4 -//.word 0x7c88088b -//.word 0x294d9882 -//.word 0x945fa5d2 -//.word 0x7f4d1320 -//.word 0x0d794c7d -//.word 0x1c1c358b -//.word 0xd48a62e1 -//.word 0x80b886b1 -//.word 0x9dfb2da8 -//.word 0x3112ad16 -//.word 0x5f67594f -//.word 0x3792f951 -//.word 0xd31f77a7 -//.word 0x9f91db8d -//.word 0xf8a67954 -//.word 0xf9dd6908 -//.word 0x91363851 -//.word 0xd939dd97 -//.word 0xa539ef69 -//.word 0x5ada1520 -//.word 0xffd1bdbf -//.word 0x96eb111e -//.word 0xac512648 -//.word 0x2f0a7721 -//.word 0x80c1934c -//.word 0xc9c9124b -//.word 0x915ecde8 -//.word 0x8d2e4fd4 -//.word 0xb918868f -//.word 0xa833be87 -//.word 0x1812d184 -//.word 0xca469743 -//.word 0x9125a461 -//.word 0xa8ca337c -//.word 0x485d5d94 -//.word 0x7a958fb7 -//.word 0x2b7a3add -//.word 0x7e70cc11 -//.word 0x6671e0d1 -//.word 0x739ab1b8 -//.word 0xece9d55a -//.word 0x1f452870 -//.word 0xf5be0635 -//.word 0xc917bd0f -//.word 0x7a814172 -//.word 0xbfaa2201 -//.word 0xbbf6bcf7 -//.word 0xd20caec6 -//.word 0xba958dfe -//.word 0xd540d96f -//.word 0xbe0a2f92 -//.word 0x22bcc125 -//.word 0xd1b50416 -//.word 0x14e9a8a2 -//.word 0x422acdbe -//.word 0x8ea774b6 -//.word 0x23b23314 -//.word 0x73c62ec3 -//.word 0xcbc84274 -//.word 0x2b8d8341 -//.word 0x569de990 -//.word 0x2536463b -//.word 0x20947bee -//.word 0x4f70ecd0 -//.word 0x4ec73165 -//.word 0xa0dc0fb3 -//.word 0x4580a6a3 -//.word 0x8f91ebab -//.word 0x31c159aa -//.word 0x9998e413 -//.word 0x80bd2f4e -//.word 0xbf71fe5b -//.word 0x645ceeb9 -//.word 0x058c6486 -//.word 0x54bbc3e7 -//.word 0xf4d0e2aa -//.word 0x8ba9bd2a -//.word 0x19186a73 -//.word 0x882b4fa7 -//.word 0x84b193a1 -//.word 0x8cf9d2d7 -//.word 0x49dd1585 -//.word 0x1fff0108 -//.word 0x03534e87 -//.word 0x8cde7bd9 -//.word 0x4cbdc0a3 -//.word 0x606845c1 -//.word 0x463891e8 -//.word 0xef274589 -//.word 0x15d80af8 -//.word 0xcfd7c8cd -//.word 0x6321198b -//.word 0x5be7fd7f -//.word 0xdb8fcfeb -//.word 0x31fc7764 -//.word 0xae0fe279 -//.word 0xb46daf95 -//.word 0x11832b27 -//.word 0x8bc880ff -//.word 0xbc4229fb -//.word 0x214ca9e4 -//.word 0x6d967d93 -//.word 0x236d4f58 -//.word 0x633d6c9c -//.word 0x045478c4 -//.word 0xe4e86159 -//.word 0x7c5c9166 -//.word 0xb8bf6822 -//.word 0x0596e9cf -//.word 0xabdbb3e2 -//.word 0x5d453364 -//.word 0x0eca1998 -//.word 0x076308de -//.word 0x370f92d7 -//.word 0xca1a63ca -//.word 0xfd9fbc47 -//.word 0x304c240a -//.word 0x3c655a21 -//.word 0x080b8d52 -//.word 0x57bfcfb7 -//.word 0xe422c8ab -//.word 0xb1fea7ea -//.word 0x9c8a5ef3 -//.word 0x33ea0fb1 -//.word 0xc9f6c15b -//.word 0xca3c5899 -//.word 0x4b48c4e8 -//.word 0xe523783f -//.word 0xc4191ef3 -//.word 0xfbbf89d8 -//.word 0x1a35eba9 -//.word 0x03a948a9 -//.word 0xf91c2a8b -//.word 0xfa69978f -//.word 0x4f8340ef -//.word 0x61fefb79 -//.word 0xced1737d -//.word 0xbc5a1ee9 -//.word 0x6ea270b3 -//.word 0x15e34f77 -//.word 0xe847c662 -//.word 0x76f3fd4e -//.word 0x3b44692e -//.word 0x725840ad -//.word 0x2bd13012 -//.word 0x9dd55067 -//.word 0xbd5957da -//.word 0x10a00c63 -//.word 0xbdfefda7 -//.word 0xe6e2741d -//.word 0x3814a76f -//.word 0xc13a2f23 -//.word 0x02a1bb7a -//.word 0x463a0698 -//.word 0x32e306e6 -//.word 0x9ce867b5 -//.word 0xa1ca3724 -//.word 0xf13fe343 -//.word 0x6e796278 -//.word 0xf6abb022 -//.word 0x7cca7e7d -//.word 0x5e9128c6 -//.word 0xf2c7e79f -//.word 0x62c448b4 -//.word 0xbb32dc9f -//.word 0x40113109 -//.word 0x04fd0212 -//.word 0xb8b4abf3 -//.word 0xc1d3dfe2 -//.word 0x8ee09d37 -//.word 0x288d60cc -//.word 0x0a3b97a9 -//.word 0x34be54e1 -//.word 0x7b6048b7 -//.word 0x2328ef05 -//.word 0xaf5c08df -//.word 0xf8444873 -//.word 0x7d314f33 -//.word 0xfabedb37 -//.word 0x3c563cdc -//.word 0x33f608b2 -//.word 0x49340f95 -//.word 0xf2819119 -//.word 0x84abaf2c -//.word 0x4aa620f6 -//.word 0xd38b2504 -//.word 0x90e1bfa6 -//.word 0x9f1c1f95 -//.word 0xe1635ed9 -//.word 0x52966eea -//.word 0x9a905116 -//.word 0xdfa98822 -//.word 0xde7fcf34 -//.word 0x3af707f1 -//.word 0x137e74e2 -//.word 0xdb95281c -//.word 0x658cbf20 -//.word 0x3f8d4d00 -//.word 0x42dd95c3 -//.word 0x675f7c0b -//.word 0xdd5abdf5 -//.word 0x587bdd41 -//.word 0xab1e62b3 -//.word 0x99c940b8 -//.word 0xe8f9944d -//.word 0xb822941d -//.word 0x13f1c6e9 -//.word 0xc5d4712d -//.word 0x6ebc5201 -//.word 0xd5228f3d -//.word 0x7f48f1e0 -//.word 0x81c14db3 -//.word 0x92334329 -//.word 0x645c2b8a -//.word 0x35534d50 -//.word 0xa11050d2 -//.word 0xba2ff61f -//.word 0x5af1062d -//.word 0xb8848933 -//.word 0x3a843853 -//.word 0x8ac1367c -//.word 0xec43fb8f -//.word 0xcf8b90c0 -//.word 0xa11c0240 -//.word 0xe83a1119 -//.word 0x8ff22859 -//.word 0x7d5a9272 -//.word 0x6d1aeae1 -//.word 0xf92bd30e -//.word 0xf7dfea73 -//.word 0x0922f901 -//.word 0x70ff6ebf -//.word 0x21660bb5 -//.word 0x1b2cde08 -//.word 0xf7537466 -//.word 0xc18c4aa4 -//.word 0x06fa84a6 -//.word 0x2e39e180 -//.word 0x0c9fefda -//.word 0xb4c17b99 -//.word 0x8d394cbc -//.word 0xa7a71183 -//.word 0x4ef697d7 -//.word 0xdfe13fe6 -//.word 0xdab5b00e -//.word 0x3958c9fc -//.word 0x008ad915 -//.word 0x166b1314 -//.word 0x533d3cf5 -//.word 0xda6ca713 -//.word 0xa9cb638d -//.word 0x6e21b3ed -//.word 0x9ce4be0c -//.word 0xbf448830 -//.word 0x0d6c2178 -//.word 0x3d041d7a -//.word 0x9cfa432a -//.word 0x5d828afe -//.word 0x305b414f -//.word 0x17548d03 -//.word 0x75101869 -//.word 0x68060864 -//.word 0x59cb2ecc -//.word 0xd2948011 -//.word 0x8ff7ca21 -//.word 0xd7f1a08c -//.word 0x0d2d97e6 -//.word 0x8283b56e -//.word 0x8dc025ec -//.word 0xdea52fe0 -//.word 0x0f3268d8 -//.word 0x7c242622 -//.word 0x55bc37a3 -//.word 0xf1c2d307 -//.word 0x65cace1b -//.word 0x56b61276 -//.word 0x0b7c4d5f -//.word 0xc629e7eb -//.word 0x55263766 -//.word 0xe4baf6f4 -//.word 0x15d1f478 -//.word 0x53fc09b5 -//.word 0x63b84fb4 -//.word 0x3bf38e65 -//.word 0x18ccf888 -//.word 0xcb9b17ce -//.word 0x5331033c -//.word 0xb161d8d1 -//.word 0xf8bf6768 -//.word 0xa4a72ce0 -//.word 0x2c818179 -//.word 0xdb441081 -//.word 0xdb398e31 -//.word 0x9302a7d2 -//.word 0x33da3423 -//.word 0x8c1eb4ff -//.word 0x260dfa3b -//.word 0x8ccc23ce -//.word 0xebaccb34 -//.word 0xdbb08114 -//.word 0x7d4a7720 -//.word 0xc6667e3c -//.word 0x1aa932e3 -//.word 0x1dfb72c7 -//.word 0xc64314b8 -//.word 0xb571d6c7 -//.word 0xc6c297ab -//.word 0xe63fc764 -//.word 0x25881c1e -//.word 0x0dcf8657 -//.word 0x32276644 -//.word 0x0bfffb71 -//.word 0x00e91ca9 -//.word 0xc4a12d15 -//.word 0xe54a4ca7 -//.word 0xa2facbba -//.word 0xfc79e3f2 -//.word 0x1046a66a -//.word 0xa3db360e -//.word 0xff323545 -//.word 0xfe887cd4 -//.word 0x646110ff -//.word 0x71cc51f0 -//.word 0xb7e8755d -//.word 0x2aa73566 -//.word 0x76d2c6bc -//.word 0x954e0b08 -//.word 0xa09d098b -//.word 0xe5a79b01 -//.word 0x3bbb67cc -//.word 0x92d1104e -//.word 0xce12ae97 -//.word 0xd69a7b40 -//.word 0xe77cce96 -//.word 0x2f064efc -//.word 0x97475f8a -//.word 0xe0cfe1fa -//.word 0xf1b61ac5 -//.word 0x6fe0f089 -//.word 0x8f7e5cae -//.word 0x28d81b49 -//.word 0x0d4ba740 -//.word 0x998d65b0 -//.word 0x8b39208b -//.word 0x1487b686 -//.word 0x2f5a1132 -//.word 0x31815968 -//.word 0xa13668eb -//.word 0x49eb7f49 -//.word 0x8d473702 -//.word 0xfc6bbaec -//.word 0x257932d6 -//.word 0xac57826c -//.word 0x9db0355b -//.word 0xff3cb3b5 -//.word 0xad42bb96 -//.word 0x615b0d08 -//.word 0x12786724 -//.word 0x8026b37a -//.word 0x0d117fb3 -//.word 0xcec7ad75 -//.word 0xe2bf6c87 -//.word 0x029a6736 -//.word 0x5aa83cf7 -//.word 0x97ae2f4d -//.word 0x42e720ed -//.word 0x4c48ba21 -//.word 0xea08ee6a -//.word 0xa3609f69 -//.word 0xa6909fff -//.word 0x6222dbb4 -//.word 0x5172d255 -//.word 0x146e4ce1 -//.word 0xc59b48a7 -//.word 0x895936a8 -//.word 0x64676642 -//.word 0x52a9c110 -//.word 0x9329b70c -//.word 0x465d78f6 -//.word 0x39a867fa -//.word 0x0022cb8d -//.word 0x449cc898 -//.word 0x5edf8fd8 -//.word 0x2435d184 -//.word 0x032b7931 -//.word 0x4f949af4 -//.word 0xd6d1a6c6 -//.word 0xbb50e22c -//.word 0x82531617 -//.word 0x67f38908 -//.word 0xf4642c79 -//.word 0xd27a1679 -//.word 0xe06c3096 -//.word 0x82d932ff -//.word 0x3c08ceea -//.word 0x7f742a34 -//.word 0xc2889447 -//.word 0xd5a77241 -//.word 0x726f7753 -//.word 0x163f1d66 -//.word 0x0ef64f05 -//.word 0xd5fe6577 -//.word 0x9d8a562b -//.word 0x2c1b295a -//.word 0xe949ade7 -//.word 0x37c06a8a -//.word 0x0189d72d -//.word 0x968bce96 -//.word 0xb8513c47 -//.word 0xef0d1da2 -//.word 0x24dda851 -//.word 0x6a4ec6e5 -//.word 0x1f1fc9bd -//.word 0x34475b2a -//.word 0xc938b4d0 -//.word 0xfd661150 -//.word 0x04036124 -//.word 0x7a0d41ca -//.word 0xf68b2a24 -//.word 0xe314e91f -//.word 0x8b905093 -//.word 0x75432c6a -//.word 0xf1077705 -//.word 0xf1d8cedb -//.word 0x1a962563 -//.word 0x1b07b935 -//.word 0x3e1c466c -//.word 0x3c757a4e -//.word 0x5626aa2f -//.word 0xa1bcc592 -//.word 0xa27b8692 -//.word 0x1aeaed80 -//.word 0x2392efce -//.word 0x7c026d2b -//.word 0x221663f0 -//.word 0x207962bb -//.word 0xa7694059 -//.word 0x61ba0eea -//.word 0x031e4a3f -//.word 0x22a35687 -//.word 0x477d292b -//.word 0x450645f6 -//.word 0xca03e879 -//.word 0x352987ae -//.word 0xa7e078db -//.word 0x5d46efb9 -//.word 0x3d772bd6 -//.word 0xae0cf138 -//.word 0xade13a43 -//.word 0x1e1c29dd -//.word 0x5f6a3fcf -//.word 0x238cd26e -//.word 0x7e13bb7c -//.word 0x3c675049 -//.word 0x770e921d -//.word 0x692ba7da -//.word 0x7e458ade -//.word 0xad4a0127 -//.word 0x09d4cfba -//.word 0x93aa2b45 -//.word 0x538a7203 -//.word 0xa72619e0 -//.word 0xda6ce5de -//.word 0xf80a5eb7 -//.word 0xe13281c4 -//.word 0x9d9ab51d -//.word 0xefc80002 -//.word 0x2d8c7b79 -//.word 0x4ece0339 -//.word 0x458932c7 -//.word 0x8e188ddf -//.word 0x06b1ff15 -//.word 0xff2f87bc -//.word 0x94142d07 -//.word 0x3ace3a6e -//.word 0x9839a853 -//.word 0x9966d8e6 -//.word 0xbf9b8346 -//.word 0xba9af3e9 -//.word 0x3926733d -//.word 0x00c4048f -//.word 0x3abf512d -//.word 0x116ee5c7 -//.word 0x7db99c1b -//.word 0x59da57d2 -//.word 0xbc61f4a4 -//.word 0x867b7ec3 -//.word 0x3973a077 -//.word 0x0b796005 -//.word 0x39a30ad6 -//.word 0x9d3169d5 -//.word 0x83153d19 -//.word 0xb9b3eac4 -//.word 0xe5e56e2b -//.word 0x1b429537 -//.word 0xafa0700b -//.word 0x48d703e6 -//.word 0x36c83e4b -//.word 0x069e2f60 -//.word 0x53547595 -//.word 0xdf78f885 -//.word 0xe22ed721 -//.word 0xa177a20b -//.word 0x43b3ca40 -//.word 0xe06555fa -//.word 0xdc37d6d5 -//.word 0x733e9d30 -//.word 0x947e2bd6 -//.word 0xf3b1e9de -//.word 0x5a4419cf -//.word 0x3fa30c08 -//.word 0x9cb6955f -//.word 0xfbabbf09 -//.word 0xd0f7bbba -//.word 0x0c971c0c -//.word 0xef9c4725 -//.word 0x1ee62494 -//.word 0xf5301a7d -//.word 0x1e4d3bf6 -//.word 0x63b0bbb0 -//.word 0xc032a7da -//.word 0xbd10d342 -//.word 0xfb3315be -//.word 0x0cb5b0ca -//.word 0x87a01372 -//.word 0x5cf9c473 -//.word 0x66fd979d -//.word 0x3faa237b -//.word 0x58817636 -//.word 0x498b08b7 -//.word 0x659aee0c -//.word 0x92d1500d -//.word 0x58661d3f -//.word 0x37a7fdf8 -//.word 0x3e3b88c4 -//.word 0xd9abb508 -//.word 0xeb2195e5 -//.word 0x1c6f415f -//.word 0x755211bf -//.word 0x2af80e35 -//.word 0xb6c1aac2 -//.word 0x2d43af55 -//.word 0xce907635 -//.word 0xd8bb599e -//.word 0xa0986aaf -//.word 0xdfc46684 -//.word 0x50e5e49f -//.word 0x7b33d28c -//.word 0xcb3822c4 -//.word 0xe7d3c1d3 -//.word 0x3f83c9b6 -//.word 0xe5e2f787 -//.word 0x9f705f5c -//.word 0x3a925e6c -//.word 0x21dbd173 -//.word 0x2e898458 -//.word 0xbf53ee0d -//.word 0x0d621bb8 -//.word 0xb99de910 -//.word 0xa8297709 -//.word 0x1130dbb3 -//.word 0xd4e2135f -//.word 0x0eba3e05 -//.word 0xea030de2 -//.word 0xba9a7465 -//.word 0x46f5a54c -//.word 0x63643e0b -//.word 0xc897c16d -//.word 0x1e61467d -//.word 0x56bb6ca7 -//.word 0x3f0c951b -//.word 0x58a85372 -//.word 0xe3961d94 -//.word 0x3a9647d9 -//.word 0x6662316e -//.word 0xee35befb -//.word 0xed8a0782 -//.word 0x6726518b -//.word 0xdd583d7e -//.word 0x1f803f50 -//.word 0x62ce5161 -//.word 0x924ce9a5 -//.word 0xea1f2803 -//.word 0xc10a54fa -//.word 0xa733888a -//.word 0xb02aaa52 -//.word 0x10279ef6 -//.word 0xe893b9c3 -//.word 0x60ca7996 -//.word 0xf62073f9 -//.word 0x16228c90 -//.word 0xea1e6cb4 -//.word 0x73e5305d -//.word 0xd9cf5f45 -//.word 0xff00204a -//.word 0x5beaaa14 -//.word 0x0513fbf9 -//.word 0x0d18cd1d -//.word 0x12f3c6de -//.word 0x1079ef6f -//.word 0x7a2667c2 -//.word 0x891d59ac -//.word 0xd36b2b44 -//.word 0x1f8cf88c -//.word 0x78304153 -//.word 0x803fdf59 -//.word 0x071a3cb5 -//.word 0xdc24c374 -//.word 0xe3819583 -//.word 0x681d7ecf -//.word 0xb3f027aa -//.word 0xdd818d71 -//.word 0xe2a9b16b -//.word 0xf69a92f5 -//.word 0x1d1f58dc -//.word 0xf626d20b -//.word 0xd77b2266 -//.word 0x1fd6b7f5 -//.word 0xc8187c45 -//.word 0x3cd24f0b -//.word 0x6a07b50b -//.word 0x1833cc38 -//.word 0x7b8b811d -//.word 0x0587027b -//.word 0x7e9e7734 -//.word 0x5650ed67 -//.word 0x3a6a92dd -//.word 0xe58628a4 -//.word 0x39d1b4f9 -//.word 0x8e11766c -//.word 0x4ae61e3e -//.word 0xb14f3d0e -//.word 0xff71fab4 -//.word 0xb494066e -//.word 0x306fd23a -//.word 0x7fa5ff82 -//.word 0x768f16fe -//.word 0xff3c79d7 -//.word 0xb1b69908 -//.word 0xa4876a0a -//.word 0x837c14b0 -//.word 0xe2a9ec50 -//.word 0xd2ada223 -//.word 0xb338bbee -//.word 0x4aca42e2 -//.word 0x14bdbbc1 -//.word 0xd9855943 -//.word 0x833771b8 -//.word 0x31482dee -//.word 0x88978555 -//.word 0x49ae6b61 -//.word 0x29454630 -//.word 0xdd08a26d -//.word 0x749b2674 -//.word 0xe9dac6b7 -//.word 0xf9653a60 -//.word 0x325cae38 -//.word 0x4d67bbc7 -//.word 0xbdfa96bd -//.word 0x88d78790 -//.word 0x56d49d67 -//.word 0xc7dea137 -//.word 0x0a3e482b -//.word 0xac1bac4a -//.word 0xad40fd54 -//.word 0xd92074ec -//.word 0x551789fc -//.word 0x79f36656 -//.word 0xddb39b97 -//.word 0xb78f1351 -//.word 0x64384769 -//.word 0x4460b1bd -//.word 0xcb7d840a -//.word 0xd5ca9a0e -//.word 0x3a8faee9 -//.word 0xa3a3cbc9 -//.word 0x9c2f04c6 -//.word 0xeab4660b -//.word 0x1e502b37 -//.word 0x6a3d3003 -//.word 0xb49aaa24 -//.word 0xe96e1473 -//.word 0x94ea6c4b -//.word 0xafee9e32 -//.word 0xb8cf41bc -//.word 0x085881ad -//.word 0x610e5c5e -//.word 0xc6b81262 -//.word 0x8f1fd668 -//.word 0xbc13ca63 -//.word 0x8aae2ae9 -//.word 0x44ddc7d9 -//.word 0x5c1bb841 -//.word 0xba804c7f -//.word 0x54fb43a6 -//.word 0xffdc3d23 -//.word 0x849572a0 -//.word 0xf7c1a428 -//.word 0x4465528c -//.word 0x0b762f06 -//.word 0xae9cd21d -//.word 0xa836afc8 -//.word 0x209e46d6 -//.word 0xbdae9a8d -//.word 0xbd83e592 -//.word 0x41808a09 -//.word 0xeb964bfc -//.word 0xabc3bc01 -//.word 0xd6d9f717 -//.word 0x798192d2 -//.word 0xec7fceb8 -//.word 0xaa3811ea -//.word 0x5f719707 -//.word 0x4359644d -//.word 0xa7ca7d01 -//.word 0xcdcc5711 -//.word 0xfd5b90f9 -//.word 0xd56adde3 -//.word 0xe1274412 -//.word 0x6c818b80 -//.word 0x95e7f0c6 -//.word 0xa5531a3d -//.word 0x9f885063 -//.word 0x1998e980 -//.word 0x4ba80389 -//.word 0x66f77844 -//.word 0x271d0ead -//.word 0xab91ee99 -//.word 0x856e5899 -//.word 0x0e779421 -//.word 0xfc582ce9 -//.word 0x362f5894 -//.word 0xe74aba90 -//.word 0xd1324b3d -//.word 0xe5e99651 -//.word 0x1071247b -//.word 0x578d3746 -//.word 0x26ccbb41 -//.word 0xe5c2795d -//.word 0xcd998e96 -//.word 0xfac91bd5 -//.word 0xc1233f15 -//.word 0x431442c5 -//.word 0x4228136e -//.word 0x34cdf596 -//.word 0x965a75e4 -//.word 0x834f9f85 -//.word 0x85de71cd -//.word 0xabab9022 -//.word 0xdcd13a16 -//.word 0x6a257cd3 -//.word 0xeabea5bc -//.word 0x44b5fa51 -//.word 0x0629ab53 -//.word 0xfe860629 -//.word 0x0707eb83 -//.word 0x237a803d -//.word 0xca442586 -//.word 0x82a4ab41 -//.word 0xb03cc0ab -//.word 0xaecdae3f -//.word 0x1d4246d7 -//.word 0x7df01613 -//.word 0xfb1ce3fe -//.word 0x89bd53ef -//.word 0x3484e9ae -//.word 0xb21a36d8 -//.word 0x3ba94e85 -//.word 0x9b9d7a27 -//.word 0x84ac2cb6 -//.word 0x2813380a -//.word 0x07234088 -//.word 0x06fd7000 -//.word 0xc29a6cd6 -//.word 0x230e8760 -//.word 0x340d8000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x0000DC90 -//// expected output -//.word 0x6be720da -//.word 0x8b47b9ff -//.word 0x169100d5 -//.word 0x1bc971bc -//.word 0x9cf9968c -//.word 0xfd305c6b -//.word 0xc4b34f9f -//.word 0xb233b3df -//.word 0xd4dd0eb5 -//.word 0x9def8f32 -//.word 0x9fb60a32 -//.word 0xbe902dc8 -//.word 0xaa3aeeb8 -//.word 0xdd7c1896 -//.word 0xd0e0bc30 -//.word 0xac1a007e -//// SHA512LongMsgvector_71 -//// vector length -//.word 0x0000DFA8 -//// input message -//.word 0x3a37e463 -//.word 0x06ac3e6a -//.word 0xee3cf25d -//.word 0x279bf920 -//.word 0x946f6c38 -//.word 0x3af99a8a -//.word 0xf4f85765 -//.word 0x67ca97c3 -//.word 0x39d53bcc -//.word 0x7e252a9c -//.word 0x7356a446 -//.word 0x6fb5d319 -//.word 0x16a2a322 -//.word 0xd039d4f1 -//.word 0x7a314ea0 -//.word 0x5b03b412 -//.word 0x594f3b79 -//.word 0x6c7cbd1b -//.word 0x54a00955 -//.word 0x879f7ee0 -//.word 0x6e96d853 -//.word 0xd07a49e9 -//.word 0x8ffccc85 -//.word 0x92b0b6f3 -//.word 0x026f8d71 -//.word 0xb9fa1e6e -//.word 0xf7dfca91 -//.word 0x57a121fd -//.word 0x0213b2d4 -//.word 0x230520f9 -//.word 0x9b22791b -//.word 0xf519c4ef -//.word 0x9cfbd9bc -//.word 0x4be4761d -//.word 0xc6de8e03 -//.word 0xc802e4f9 -//.word 0x3ce1d9ac -//.word 0xaf2282aa -//.word 0x066cfe6a -//.word 0x6c86078d -//.word 0x8fbcc663 -//.word 0x0c85ecb1 -//.word 0x2764feb1 -//.word 0xc00cf05b -//.word 0x83c7f6e3 -//.word 0x5e189783 -//.word 0x389f037a -//.word 0xe03ea655 -//.word 0x437afd6d -//.word 0xe324a9b1 -//.word 0x8438c2a5 -//.word 0x28056dab -//.word 0x3e8eb182 -//.word 0x1731860c -//.word 0x99862f54 -//.word 0x378acacf -//.word 0x21fd26e2 -//.word 0xb708d4a5 -//.word 0x442381e7 -//.word 0xe9368372 -//.word 0xd7feb18f -//.word 0xc1b378cd -//.word 0x92e82bff -//.word 0x5bb29b84 -//.word 0x8f0ce8cb -//.word 0x727a9615 -//.word 0xcfede37d -//.word 0xe9e75836 -//.word 0xb5df9f15 -//.word 0x46e7944f -//.word 0x898c9e83 -//.word 0x32fe40fb -//.word 0xf671eb2f -//.word 0xfbc2178a -//.word 0x8d5e9271 -//.word 0x12601782 -//.word 0x40f92219 -//.word 0x8d150319 -//.word 0xe73b31e9 -//.word 0xa6b5e2bc -//.word 0xbff2d816 -//.word 0x3a287e8c -//.word 0xe63d33cb -//.word 0x4be8e6db -//.word 0xe014e3a5 -//.word 0x7e85ecb3 -//.word 0x15bd8c38 -//.word 0x9e21a850 -//.word 0x50585788 -//.word 0x17f4f4a1 -//.word 0x42547191 -//.word 0x7bc8edcb -//.word 0xfdf789c0 -//.word 0x017e78a6 -//.word 0x79da5678 -//.word 0x0188bb3e -//.word 0x136a0f8e -//.word 0x7a6da053 -//.word 0x0969f1cd -//.word 0x8c4956d9 -//.word 0xff6bbd73 -//.word 0xfe4acf79 -//.word 0x7d5a38b1 -//.word 0xb933420e -//.word 0x6ef2a92f -//.word 0x4bdcab29 -//.word 0xa3455e86 -//.word 0x65b1468e -//.word 0x4e3827c5 -//.word 0x5d2f18b4 -//.word 0x8804d9ec -//.word 0xad6a6649 -//.word 0xcbb6cc74 -//.word 0x72893cab -//.word 0x78b05ec5 -//.word 0xee48e770 -//.word 0x52266ebe -//.word 0x06767ce0 -//.word 0x01a1e231 -//.word 0xc5754f76 -//.word 0x91802163 -//.word 0xd7bc7c62 -//.word 0xf0729991 -//.word 0x0f586109 -//.word 0x74fc3b66 -//.word 0xe2662284 -//.word 0x52f9fa86 -//.word 0xe99b241d -//.word 0x28165007 -//.word 0x63bd92d5 -//.word 0x7452b9f2 -//.word 0xb027dce1 -//.word 0x1a8435c6 -//.word 0xd7493228 -//.word 0xe2d4caf5 -//.word 0x01250ec6 -//.word 0xf8400065 -//.word 0xfcd3a78d -//.word 0x6a1963f0 -//.word 0xb9fe7f7e -//.word 0xae8405e5 -//.word 0xce65d654 -//.word 0x19faf985 -//.word 0xf55b34fa -//.word 0x69c8d987 -//.word 0x8b48e310 -//.word 0x3c8f4194 -//.word 0x1225726a -//.word 0x96c552cb -//.word 0xb0043491 -//.word 0x5f33303e -//.word 0xad85bf40 -//.word 0xe3758574 -//.word 0xf9626de8 -//.word 0x507cfbe5 -//.word 0xa4e4de2d -//.word 0x3c0fc581 -//.word 0x636c7466 -//.word 0x1c461729 -//.word 0x12ebd621 -//.word 0xce0ea934 -//.word 0x2c6a6e9c -//.word 0x10a839eb -//.word 0x5583eb4d -//.word 0x062a060e -//.word 0xd1e5bf5c -//.word 0xb8fc554d -//.word 0x0ad5a224 -//.word 0x925cf0d0 -//.word 0x0ea70db5 -//.word 0xe3dba2af -//.word 0x0e49c054 -//.word 0x5eddbc7a -//.word 0xe0b93dfa -//.word 0x9b1d93b3 -//.word 0x7e8a4ad1 -//.word 0x9727ff4f -//.word 0x866373ba -//.word 0x30dcde38 -//.word 0xb88086ca -//.word 0xabf18fce -//.word 0x7a2e15c8 -//.word 0x2e717861 -//.word 0x5753f7b0 -//.word 0x453681b9 -//.word 0x7be4c733 -//.word 0x6174968f -//.word 0x396e6435 -//.word 0x542f2911 -//.word 0x868e704e -//.word 0xd7bfad61 -//.word 0x7b78d14a -//.word 0x05531c16 -//.word 0xd77432a9 -//.word 0xdd6b72ba -//.word 0x7b5b831f -//.word 0xc35c2f4b -//.word 0xec1f7515 -//.word 0xffd1d9bb -//.word 0xd441ff26 -//.word 0x3d44786f -//.word 0x8159dca3 -//.word 0x0c8919c3 -//.word 0x64910a0f -//.word 0x5f434c84 -//.word 0x942a4da4 -//.word 0x0f6da575 -//.word 0x49f5aacc -//.word 0x57d23ecb -//.word 0x61dbeca9 -//.word 0x569534b1 -//.word 0xde57228e -//.word 0x90ab26c5 -//.word 0x66f61f83 -//.word 0x6d5cb999 -//.word 0xc1def9c5 -//.word 0xb9c51633 -//.word 0x5f448b43 -//.word 0x23596a8d -//.word 0xd0f4f323 -//.word 0xbe5b6515 -//.word 0x4acd143b -//.word 0x8365bc2e -//.word 0x26421598 -//.word 0xcde5a7ae -//.word 0x63dae0fa -//.word 0xdb9b645e -//.word 0x21b1a456 -//.word 0x511cb27d -//.word 0x28f55453 -//.word 0xb852573d -//.word 0x5f6a25cd -//.word 0xf9fa9a44 -//.word 0x55e71455 -//.word 0xe624c92c -//.word 0xbbd65eaf -//.word 0xb1b6b504 -//.word 0xe8b70653 -//.word 0x73ea31cd -//.word 0x549e52ed -//.word 0xa7cb96fd -//.word 0x1db14edd -//.word 0xacbc4200 -//.word 0x85ab48b7 -//.word 0x47f115b2 -//.word 0x725b52c3 -//.word 0x1ef4f3e6 -//.word 0xed26c47f -//.word 0x3e2144e2 -//.word 0xa381b718 -//.word 0x962a77e1 -//.word 0x67778bf5 -//.word 0x79957a8f -//.word 0xae29612c -//.word 0x20394490 -//.word 0x1249a20b -//.word 0x26c44cfa -//.word 0xd09e7790 -//.word 0x0a380fd7 -//.word 0x49844ef1 -//.word 0xb0698ea4 -//.word 0x84695b16 -//.word 0xe181cdd4 -//.word 0xab501419 -//.word 0xc67c554e -//.word 0x8a52b5cd -//.word 0x71acb3ea -//.word 0x1318ba34 -//.word 0x5536f6f8 -//.word 0xdd626807 -//.word 0xc99335b9 -//.word 0xa0834432 -//.word 0x881107e4 -//.word 0xbae39955 -//.word 0x344f0a23 -//.word 0xad7cf745 -//.word 0xcec45d93 -//.word 0x9f5dae89 -//.word 0x40392548 -//.word 0xd92a57dd -//.word 0xd34a0cc6 -//.word 0x499a4cb2 -//.word 0xb9e9bd89 -//.word 0x00f82cac -//.word 0x85db697e -//.word 0xb4a25823 -//.word 0xae394588 -//.word 0x3e8d78a3 -//.word 0x10f009fc -//.word 0x1dbff66c -//.word 0x6a427324 -//.word 0xf2d381f2 -//.word 0xe043c2c0 -//.word 0x02798c5e -//.word 0x7b5c3c81 -//.word 0xb8f4cd0b -//.word 0xa5cba98c -//.word 0x209abe09 -//.word 0xae21d5fd -//.word 0x6c571f9e -//.word 0x49c31161 -//.word 0x732a72c0 -//.word 0x0f6ab33b -//.word 0x2da67e9d -//.word 0xfba39180 -//.word 0x3872cd13 -//.word 0xec508a1b -//.word 0x57ca2e38 -//.word 0x2725fe6a -//.word 0xeefc34d3 -//.word 0xd22b51bf -//.word 0x87ecb4e1 -//.word 0x7a406cdf -//.word 0x4f914b12 -//.word 0x8e953b87 -//.word 0x9975d549 -//.word 0xe22f30e2 -//.word 0x5a39f71f -//.word 0x2d67bf14 -//.word 0xac0e9760 -//.word 0x8a6ae0b2 -//.word 0x4c3d5f8c -//.word 0xfbb99047 -//.word 0x1ca03d58 -//.word 0xe2aa50d1 -//.word 0xa127e62b -//.word 0x86e5a442 -//.word 0x86544ea1 -//.word 0x94e89500 -//.word 0x17bf310b -//.word 0x9b843065 -//.word 0xc6938eed -//.word 0x8e5d0540 -//.word 0xaa0e267f -//.word 0x466ea952 -//.word 0xfb05022c -//.word 0xfe8335d1 -//.word 0x985fea16 -//.word 0xd6bdc4e8 -//.word 0x8195ef90 -//.word 0x5012f835 -//.word 0x5d38e2a3 -//.word 0xd6ca764b -//.word 0xf56bda8a -//.word 0x3203652e -//.word 0xb764b236 -//.word 0x142ef3d9 -//.word 0x34ef88ca -//.word 0x8f8fd1bb -//.word 0xa2ec4020 -//.word 0x9cc1b235 -//.word 0x5bccff42 -//.word 0x9630cf1d -//.word 0x5c18b0f1 -//.word 0xbd9d663f -//.word 0xc7ea8222 -//.word 0xb49d37d7 -//.word 0x6171687c -//.word 0x021a0518 -//.word 0x157198dc -//.word 0x94d11ba9 -//.word 0x6fc10dd2 -//.word 0x39d3c522 -//.word 0x21cc0521 -//.word 0x2504d293 -//.word 0x82108342 -//.word 0x6f9f19fd -//.word 0x0aa2cee1 -//.word 0x93b0f1d7 -//.word 0xd8a8f05e -//.word 0xf098b78b -//.word 0x2cdd384d -//.word 0x4b8c4bf6 -//.word 0xed11b9f7 -//.word 0x4b1693eb -//.word 0x24a7c9d8 -//.word 0xfb93f7b1 -//.word 0x7f15821f -//.word 0x4bb3e480 -//.word 0xcf674431 -//.word 0x8efd4a08 -//.word 0x8bbc3125 -//.word 0xfd481eeb -//.word 0x4ac7b049 -//.word 0x3343d83e -//.word 0x4c4feb9c -//.word 0xb0eef50c -//.word 0xf2b05152 -//.word 0x571e76d2 -//.word 0x42581453 -//.word 0xeffd6004 -//.word 0x644babbc -//.word 0xa5883a86 -//.word 0x28a0525d -//.word 0x880f9234 -//.word 0x7d01863a -//.word 0x0cb8785b -//.word 0xfb2f890a -//.word 0x88fd013e -//.word 0x5b7be4ba -//.word 0xb829c692 -//.word 0xf94edfeb -//.word 0x3cdf6202 -//.word 0x59a20b70 -//.word 0x1793f7ac -//.word 0x9f87b9d1 -//.word 0x300faaa1 -//.word 0x159f80ca -//.word 0xd4f02369 -//.word 0xa9a2bccd -//.word 0x32260e7d -//.word 0x6cdb097c -//.word 0xde779ccb -//.word 0x14a9cc30 -//.word 0x4ffd0336 -//.word 0x7bffaa75 -//.word 0x61a3f913 -//.word 0x1ee40e8b -//.word 0xd4ac3dad -//.word 0x9ff4a8e7 -//.word 0xcb2c0fc2 -//.word 0x44dde9af -//.word 0x4d8db304 -//.word 0x75e38842 -//.word 0xc70bf299 -//.word 0x425c00ae -//.word 0x8938989b -//.word 0xdb340f37 -//.word 0x4479f799 -//.word 0x156b38d7 -//.word 0x93886313 -//.word 0xec9242b9 -//.word 0x6ff0b402 -//.word 0xfb52b7bd -//.word 0xb894c74e -//.word 0x06e567f7 -//.word 0xb328fd56 -//.word 0x719ae22f -//.word 0x87b5ba6c -//.word 0xc6550162 -//.word 0xbf1ae756 -//.word 0x330d5e40 -//.word 0xcb8671ce -//.word 0x094dd7ac -//.word 0x7fffc803 -//.word 0x3fb30f40 -//.word 0x92de6116 -//.word 0xed74edc6 -//.word 0x2050349e -//.word 0xd1d61bbf -//.word 0x29d73e24 -//.word 0xcdb488e0 -//.word 0x10c701a7 -//.word 0x67fee690 -//.word 0x1dc9ff19 -//.word 0x47372d6c -//.word 0xfb5c43e1 -//.word 0xbdf516c3 -//.word 0x3a4fd857 -//.word 0x3964a11a -//.word 0xce474f4b -//.word 0xd0c390a9 -//.word 0x8e3f3d7e -//.word 0xbee5eadc -//.word 0xb604bb27 -//.word 0xdfb279d3 -//.word 0x66b5e46f -//.word 0x34a44be3 -//.word 0x21495bf6 -//.word 0x644a3513 -//.word 0x4e08c34c -//.word 0x39c84b9f -//.word 0xbb114478 -//.word 0x1f546978 -//.word 0x15d30d75 -//.word 0xa8bbaec2 -//.word 0x7193ccb0 -//.word 0x0adafb54 -//.word 0xc6ec388b -//.word 0x9f26793c -//.word 0x704a88dd -//.word 0x65251039 -//.word 0xaf6ff870 -//.word 0x7cf2f13f -//.word 0x26ef4b81 -//.word 0xaabd0df6 -//.word 0x5db34444 -//.word 0xda489b3b -//.word 0x3f792c5d -//.word 0x996b969e -//.word 0x9c525068 -//.word 0x98913de2 -//.word 0xa8238072 -//.word 0x2d399181 -//.word 0x7a24907e -//.word 0xd176da25 -//.word 0x8f64db01 -//.word 0xa36f232f -//.word 0x4444bb66 -//.word 0xe4e0b934 -//.word 0x5ff7128a -//.word 0x7997b07b -//.word 0x8709c441 -//.word 0x6cf85e81 -//.word 0xc7d43bd0 -//.word 0x6b79dd75 -//.word 0x100ce170 -//.word 0x48268ebc -//.word 0xb435aad2 -//.word 0x771f916e -//.word 0xeb288895 -//.word 0x93154ed7 -//.word 0x5191f4d2 -//.word 0xd9d1eff7 -//.word 0x66746c91 -//.word 0xacade302 -//.word 0x0da3ef50 -//.word 0x0f185de1 -//.word 0x0e498283 -//.word 0x2e16d2b0 -//.word 0x9463af0f -//.word 0xd6be7f3d -//.word 0xaf4201ce -//.word 0xf8bbe18f -//.word 0xd30b8a0e -//.word 0x2acc3b5d -//.word 0x58365d12 -//.word 0x25431492 -//.word 0xf8121490 -//.word 0x4889b6d0 -//.word 0x543f4a31 -//.word 0x1499afea -//.word 0x6f332214 -//.word 0xae815469 -//.word 0x31b6bf4b -//.word 0x60e43908 -//.word 0xe565ca5c -//.word 0x197bbb37 -//.word 0xbb33efc1 -//.word 0xe88f779b -//.word 0x47e36068 -//.word 0x8580cf8d -//.word 0x01905134 -//.word 0xc8416c97 -//.word 0xc3267a7b -//.word 0x2fdab7fa -//.word 0x4ee69886 -//.word 0x5ce45e2b -//.word 0xc5e5ec14 -//.word 0x9511d551 -//.word 0x308dbad8 -//.word 0x43a2d3c9 -//.word 0xfa1bcbf6 -//.word 0x74eed1a2 -//.word 0x741fec89 -//.word 0x59e28e21 -//.word 0x50006d20 -//.word 0xc87b8e3e -//.word 0x2675a23c -//.word 0xba4e9625 -//.word 0xf20d66d4 -//.word 0xce0132b6 -//.word 0x94a893d1 -//.word 0xc5cf2f05 -//.word 0x4ffb8b92 -//.word 0x040821db -//.word 0x4b10b36a -//.word 0x168ede33 -//.word 0x14c3f21d -//.word 0x275901be -//.word 0x18473666 -//.word 0x8af46860 -//.word 0x2c9fef74 -//.word 0x33feb7b0 -//.word 0x08259369 -//.word 0x3daad37c -//.word 0xc60718d9 -//.word 0x663f6743 -//.word 0x67c57d51 -//.word 0x8e9962b9 -//.word 0x4eb441cd -//.word 0x3ca67746 -//.word 0xc37eea41 -//.word 0x19ea9c87 -//.word 0x719f8011 -//.word 0x73fb8ccc -//.word 0xe9e90f99 -//.word 0xbb064598 -//.word 0x1d0228a6 -//.word 0x07488a24 -//.word 0xe5e161fb -//.word 0x919562dc -//.word 0x7e54d1cd -//.word 0x36d597e1 -//.word 0x067d9546 -//.word 0xf7823885 -//.word 0x01504d06 -//.word 0x7c2c17d3 -//.word 0xd7179f9d -//.word 0x8cf54c04 -//.word 0x53eeb313 -//.word 0x9715b00a -//.word 0x2647b661 -//.word 0x2c566309 -//.word 0x626758f5 -//.word 0x839947d9 -//.word 0x00e84d32 -//.word 0xf4508386 -//.word 0x5a35d0ed -//.word 0x7e0201d0 -//.word 0xb1111bf1 -//.word 0x41cbefab -//.word 0xa810f07c -//.word 0x04d942c0 -//.word 0xc71b13bf -//.word 0xb0ef2eea -//.word 0xfaf1cd62 -//.word 0xd3e5afba -//.word 0x0fa16bfe -//.word 0x1e2704f4 -//.word 0x3b11bda1 -//.word 0xe7322f0f -//.word 0x967a984e -//.word 0xa81a76b9 -//.word 0x9ae9557a -//.word 0x7e06e551 -//.word 0xa8bf4f91 -//.word 0xabb2c96b -//.word 0x8432696e -//.word 0x14ed364f -//.word 0xd4cb85e6 -//.word 0xc419837a -//.word 0xa4e60e3e -//.word 0x67adc91b -//.word 0xe5356fb0 -//.word 0xd0b66798 -//.word 0xe93d99eb -//.word 0x73518107 -//.word 0xe8d78190 -//.word 0xec337cb5 -//.word 0x7fb0a0b5 -//.word 0x762283a2 -//.word 0x2cca7266 -//.word 0x75790603 -//.word 0xd3f8f71f -//.word 0xeda835bf -//.word 0x3c663553 -//.word 0x08b189f3 -//.word 0x930fb4e8 -//.word 0x94ac3c6e -//.word 0xe64501b8 -//.word 0x8244cc35 -//.word 0xab2d2b12 -//.word 0x68387d00 -//.word 0x37404937 -//.word 0x00dbd4ba -//.word 0x48cbf2dd -//.word 0xa7951c05 -//.word 0x7c6fc3b0 -//.word 0xdf5fe4b5 -//.word 0xd7a2ddcc -//.word 0xcd4b7f50 -//.word 0x412c6444 -//.word 0xbcf98295 -//.word 0x06ab019e -//.word 0x98234af1 -//.word 0x54106155 -//.word 0x7412740b -//.word 0xc120b456 -//.word 0x0527633a -//.word 0xc2f32e83 -//.word 0x2453be09 -//.word 0x35788a33 -//.word 0x509fefba -//.word 0xd8f082af -//.word 0x29a5a5c0 -//.word 0xcf6e58b7 -//.word 0xf7145243 -//.word 0x225d51fb -//.word 0x2131aea0 -//.word 0x3dfa34a2 -//.word 0xb65132e6 -//.word 0x6fd6cfc7 -//.word 0xe75f9e5b -//.word 0x6b5672f7 -//.word 0x8a5c74f5 -//.word 0xca3272b4 -//.word 0x99da7ae1 -//.word 0x86f9a8f5 -//.word 0xb1803cff -//.word 0x808befa4 -//.word 0x948a8864 -//.word 0xfc9eaa1f -//.word 0xa846f0d7 -//.word 0x203a3cb7 -//.word 0x76974b54 -//.word 0x783d8d34 -//.word 0x2b75348d -//.word 0x75d88b4e -//.word 0x1a6c8a63 -//.word 0xea0fa735 -//.word 0x3819ee71 -//.word 0x8d3d540b -//.word 0x9eb04982 -//.word 0x7c8d8c65 -//.word 0x0b794316 -//.word 0xb5834bce -//.word 0x5f4dcde1 -//.word 0x9c711244 -//.word 0x211e984c -//.word 0x7a0265b8 -//.word 0xfb6d9bf2 -//.word 0xf8b34d92 -//.word 0x39d29124 -//.word 0xa854d62b -//.word 0x4d777866 -//.word 0x7c8c9251 -//.word 0x4d9d14ef -//.word 0x4d5215c7 -//.word 0x73156a2c -//.word 0x567577c2 -//.word 0x9cc8453e -//.word 0xb615d56d -//.word 0xcb31b478 -//.word 0xf127d066 -//.word 0xa3dd8ae2 -//.word 0x70f50c3f -//.word 0xf0f2ddb9 -//.word 0xfc9cb2fe -//.word 0x1ea588ed -//.word 0x478cef9d -//.word 0xc0c2a9a1 -//.word 0x630c738a -//.word 0x0b2823ae -//.word 0x49b3f328 -//.word 0x594a1d20 -//.word 0x54f0a84d -//.word 0xa6af81b7 -//.word 0xc382cdc2 -//.word 0x16737e68 -//.word 0x3a0124c6 -//.word 0x6dc406da -//.word 0x4254728b -//.word 0x966651e9 -//.word 0xc438feb7 -//.word 0x1d305927 -//.word 0x92c017e4 -//.word 0xb48c5c55 -//.word 0xdfcf8b21 -//.word 0xb1fa5dee -//.word 0xc19f306f -//.word 0x8e8ea29d -//.word 0xb63e5f44 -//.word 0x696e37c2 -//.word 0x1c0b740b -//.word 0x82556af1 -//.word 0xb83e4fa3 -//.word 0xc0124d73 -//.word 0x305dd6dc -//.word 0x2b0a38c3 -//.word 0x91c871fd -//.word 0x73b24412 -//.word 0xca2e8c40 -//.word 0x6815d1c3 -//.word 0x2e151954 -//.word 0x805400f0 -//.word 0xf6560bda -//.word 0x54213ae3 -//.word 0xbd9fdce9 -//.word 0x2343a79e -//.word 0x02ef088a -//.word 0x4e16b854 -//.word 0xaa1e903d -//.word 0xda089eed -//.word 0x7b527872 -//.word 0xf11cd086 -//.word 0xa28b4910 -//.word 0x626b89ee -//.word 0x2d1890f2 -//.word 0x1c9e482a -//.word 0x921f5d65 -//.word 0xb6754ef2 -//.word 0x2719c5ab -//.word 0xeb432433 -//.word 0xa853607b -//.word 0x1670128b -//.word 0xb46fcb7f -//.word 0xbaf6a8cf -//.word 0x4fe127d4 -//.word 0xfde43988 -//.word 0x6272998e -//.word 0x28de5b72 -//.word 0x37c1c831 -//.word 0x289b69fc -//.word 0xfdbd6239 -//.word 0x106602cb -//.word 0x4a2c9793 -//.word 0x959d8736 -//.word 0x94279c21 -//.word 0x9135a0cb -//.word 0xb79b2a3a -//.word 0x8134b7c9 -//.word 0x72c9fc28 -//.word 0x07357ba4 -//.word 0xeac755a9 -//.word 0x68e85f85 -//.word 0x25fe776e -//.word 0x0e9019c7 -//.word 0x90aa2d9f -//.word 0x0783237b -//.word 0x7a5d4255 -//.word 0x85ad3de4 -//.word 0x967c081e -//.word 0x5d0de9fc -//.word 0x7dc0d27d -//.word 0x8836eeed -//.word 0x2ab67a67 -//.word 0xa4cfd699 -//.word 0x7c3fdcc7 -//.word 0x73147012 -//.word 0xb81158fb -//.word 0x5b534f23 -//.word 0x04355454 -//.word 0xe57048c5 -//.word 0xed87b89a -//.word 0x3f62f8ab -//.word 0xe2387186 -//.word 0xbab33bb7 -//.word 0xb74fef47 -//.word 0x4c04b682 -//.word 0x2324a6fd -//.word 0x0f864fd8 -//.word 0x42e49041 -//.word 0xc082b039 -//.word 0x1310a99b -//.word 0x40d2c75a -//.word 0xfbfe720a -//.word 0x176648a2 -//.word 0x40567080 -//.word 0xecc02aad -//.word 0x8f96aa63 -//.word 0x0e7826cc -//.word 0x778f2e0d -//.word 0xefb93c83 -//.word 0xece68c4c -//.word 0xa4c22d0a -//.word 0xc59459e3 -//.word 0x666502cd -//.word 0x3d66ad08 -//.word 0x138c83eb -//.word 0x767da5e4 -//.word 0xaeafc1bb -//.word 0xf2cee316 -//.word 0xdb5f8d42 -//.word 0x18a40930 -//.word 0x64bffebe -//.word 0xb5194238 -//.word 0xb605ef1f -//.word 0x78a1b929 -//.word 0x64fd7e88 -//.word 0x75801f6f -//.word 0xa4878fd3 -//.word 0xa34e296f -//.word 0xcd14470a -//.word 0x5e7a10fc -//.word 0xdf2d91ef -//.word 0xe5c410e3 -//.word 0xfbec9c75 -//.word 0xddc2e960 -//.word 0xe7805b44 -//.word 0xcc5c61a6 -//.word 0x8bad0438 -//.word 0x9f50c05b -//.word 0x764a92e3 -//.word 0x25ae521a -//.word 0x5ac24307 -//.word 0x925de9f0 -//.word 0x8c931a1d -//.word 0xfd9458df -//.word 0x85d25ed1 -//.word 0xe262f95e -//.word 0x64a51983 -//.word 0xa02728d6 -//.word 0x69c79ac8 -//.word 0xfc19c627 -//.word 0x7b08f4e7 -//.word 0x9dc0b721 -//.word 0xa3cb7d5c -//.word 0x8e79640c -//.word 0x8f864f58 -//.word 0xbff73a20 -//.word 0x1045ca3f -//.word 0x83bd280d -//.word 0x9c271028 -//.word 0x14a62575 -//.word 0xcddf8861 -//.word 0x0b5da86d -//.word 0xe0345ce9 -//.word 0xe8e52fff -//.word 0x3782faf4 -//.word 0x9013b9ab -//.word 0xd737976b -//.word 0xc90f4be1 -//.word 0xeb57a769 -//.word 0xc0d66e89 -//.word 0x3ff967be -//.word 0x84bbaf7c -//.word 0xc6c75370 -//.word 0x89e11e08 -//.word 0x1582b035 -//.word 0x26c2d070 -//.word 0xe57b04fb -//.word 0x17ac5e69 -//.word 0x951b9860 -//.word 0xfc3f649e -//.word 0xa55cfd3a -//.word 0xd8f0022c -//.word 0x3c4e8410 -//.word 0x92895e27 -//.word 0xa393c49f -//.word 0x77a61f14 -//.word 0xc8e31856 -//.word 0xb63af36d -//.word 0xbd891fda -//.word 0xe3080b20 -//.word 0x36e43b83 -//.word 0x752a9a10 -//.word 0x0ee712dd -//.word 0x488e5a92 -//.word 0xc2990f28 -//.word 0x1c7307f1 -//.word 0xf496e2d9 -//.word 0x14f0e1eb -//.word 0xe98cfc17 -//.word 0x386e2e32 -//.word 0x0cbf143e -//.word 0xf32ab6ec -//.word 0x6985a55f -//.word 0x95b44633 -//.word 0x33ca6dbe -//.word 0xd2722d95 -//.word 0x3f8eef52 -//.word 0x411dc295 -//.word 0x8662f249 -//.word 0xde43dc29 -//.word 0xa7ef0082 -//.word 0x88c3583a -//.word 0x636fe911 -//.word 0x84549727 -//.word 0x1f313dbf -//.word 0xf9fffd42 -//.word 0x6519d587 -//.word 0x72a07351 -//.word 0x631e4b19 -//.word 0x5f69e60e -//.word 0x6acb7d5b -//.word 0x945fc6a8 -//.word 0x70be0ee3 -//.word 0xc8db8840 -//.word 0x8f2ce57e -//.word 0x170b246d -//.word 0x855bacad -//.word 0x816e98b8 -//.word 0x32265222 -//.word 0x695b6320 -//.word 0x1c7d8948 -//.word 0x177b0a97 -//.word 0xeee349b8 -//.word 0x364a9783 -//.word 0xf4ee4bc5 -//.word 0x569a153f -//.word 0xa1ca8ff1 -//.word 0x6b101598 -//.word 0x0ab6d775 -//.word 0x4ca52c50 -//.word 0x69852abd -//.word 0x3526739e -//.word 0x9a1f51e9 -//.word 0x46b506ab -//.word 0xa1fe5d4d -//.word 0x02468516 -//.word 0x22b11ff2 -//.word 0xd1229672 -//.word 0xe75caf13 -//.word 0x7e6761c3 -//.word 0x5e36e6a1 -//.word 0xb9861205 -//.word 0x1909e4c0 -//.word 0x96c45ba5 -//.word 0x4cb58a48 -//.word 0x0cbaef05 -//.word 0x52ae0144 -//.word 0x77d508fc -//.word 0x287a3176 -//.word 0x17d6e254 -//.word 0xf0344bd1 -//.word 0x8f533e4a -//.word 0x700c40fe -//.word 0x6734e012 -//.word 0x91c447d8 -//.word 0x8a371150 -//.word 0xe0345bef -//.word 0xc86d1da0 -//.word 0x10c7bb09 -//.word 0x55bbd60f -//.word 0x76fc689c -//.word 0x485a109f -//.word 0x8ce6aa55 -//.word 0x1e5723c8 -//.word 0x6fac8b95 -//.word 0x34136cf1 -//.word 0x600a5bee -//.word 0x50c4ccfb -//.word 0x46ce2baa -//.word 0x19f228b7 -//.word 0x2b5c5245 -//.word 0x9afbe76a -//.word 0xbb2aeaee -//.word 0xc4907750 -//.word 0xc844540a -//.word 0xe935c816 -//.word 0xc9cab0b1 -//.word 0x41c5cf5f -//.word 0x566d662f -//.word 0x68ec0440 -//.word 0xadf6a084 -//.word 0xdeabe5c4 -//.word 0x30bfcde5 -//.word 0x86d87169 -//.word 0xe5372039 -//.word 0x289baea1 -//.word 0xf5620e9c -//.word 0xeff22352 -//.word 0x2d57d4df -//.word 0xec2d5f56 -//.word 0x80c1ef05 -//.word 0x917370fb -//.word 0x835fa2c8 -//.word 0x363c6c84 -//.word 0xf0837413 -//.word 0x97d4eca6 -//.word 0x2497af85 -//.word 0x54df8c0d -//.word 0xa093e1f4 -//.word 0x70cf6cd5 -//.word 0x8c885fe8 -//.word 0xd36fb210 -//.word 0x2f18bd1c -//.word 0xc85c0646 -//.word 0x78fc5800 -//.word 0x808615f1 -//.word 0x797dcc3a -//.word 0x8db40efd -//.word 0xe6fb7e20 -//.word 0x67fd284e -//.word 0x9a69143f -//.word 0xea501a3a -//.word 0x13cff7d8 -//.word 0xd6eda10a -//.word 0xf1c6d85d -//.word 0x4eeafe7d -//.word 0x7b0028f8 -//.word 0x5aaf7545 -//.word 0x1abe9f05 -//.word 0x6579cf88 -//.word 0xdb57b693 -//.word 0xc0dbd961 -//.word 0xf1b82ce7 -//.word 0x1d38e35d -//.word 0x31de85f9 -//.word 0x144b42fe -//.word 0x955e86f5 -//.word 0xa29fce3a -//.word 0xbadebbbb -//.word 0xa41764fd -//.word 0x6299f160 -//.word 0x616766a3 -//.word 0xf2dfbcaa -//.word 0xfe99367f -//.word 0xf492f298 -//.word 0x078abf58 -//.word 0x97aa2ed7 -//.word 0xec6aece6 -//.word 0x2ab24e4e -//.word 0x813f2e59 -//.word 0xa549f694 -//.word 0x7e63fad2 -//.word 0x20a20b74 -//.word 0xfd0148e8 -//.word 0x59043870 -//.word 0xff9c1625 -//.word 0x334b6c3b -//.word 0xe788e486 -//.word 0x32655a3d -//.word 0xfd6f35ff -//.word 0x00d6f813 -//.word 0xedce14f4 -//.word 0xea34010d -//.word 0x45758cc1 -//.word 0x63ac73ae -//.word 0xfa0a2f33 -//.word 0x807b112f -//.word 0xe486900c -//.word 0x7b75e2fd -//.word 0x3db7c983 -//.word 0x3182b036 -//.word 0x26bdf6c2 -//.word 0xa41c8a30 -//.word 0x228db867 -//.word 0x79d342f2 -//.word 0x9970b303 -//.word 0x7bc9f0b8 -//.word 0x5785109e -//.word 0x16366d74 -//.word 0x0a3bfb31 -//.word 0xdde5d948 -//.word 0xc7d8262a -//.word 0x04b4160c -//.word 0x86f545eb -//.word 0xe7184bce -//.word 0xa100904c -//.word 0x8197624d -//.word 0x59b84415 -//.word 0xf64d897e -//.word 0x51b42284 -//.word 0x0968b507 -//.word 0x11ddefcd -//.word 0xa6ab1ac7 -//.word 0x85eff295 -//.word 0x5aeeb44b -//.word 0x7bfc7976 -//.word 0xd69dc25a -//.word 0x29e9547e -//.word 0x7135466b -//.word 0xa4ef58b0 -//.word 0xa2ca8629 -//.word 0x691bdd81 -//.word 0x89838ef6 -//.word 0xd9cf415c -//.word 0x671cab65 -//.word 0xb53f631f -//.word 0x2264f1be -//.word 0xa6f4289c -//.word 0xc2bdb77e -//.word 0xb74dfa19 -//.word 0xf79e16d5 -//.word 0xd9f944d0 -//.word 0x90146d26 -//.word 0x5e7ef870 -//.word 0x053ce08a -//.word 0x7fb5099a -//.word 0xeecbd44d -//.word 0xd64bf164 -//.word 0x8a877470 -//.word 0xe4412bd9 -//.word 0x39cb2f25 -//.word 0x8c6dba77 -//.word 0x02073856 -//.word 0x96f7a1b0 -//.word 0x0e3d051f -//.word 0x2edd696a -//.word 0x2b85d14f -//.word 0x63709e80 -//.word 0x4a8a1aeb -//.word 0xa8d5523e -//.word 0x020b24ab -//.word 0x558598e9 -//.word 0x0b5b747b -//.word 0x27cd0a34 -//.word 0xc3e255fb -//.word 0xbc4e44cc -//.word 0xac9956ff -//.word 0x187e67cd -//.word 0xeb92ca10 -//.word 0x2326974a -//.word 0xcb6d46e9 -//.word 0x29e27dc9 -//.word 0x38e427fb -//.word 0x59a3c6c5 -//.word 0x45400ae9 -//.word 0x4630a22a -//.word 0xa7e2520d -//.word 0x68a146dd -//.word 0x37bba6f1 -//.word 0x9ce36a32 -//.word 0x74d470d7 -//.word 0xa037cb73 -//.word 0xfec75f32 -//.word 0x98b3ab5f -//.word 0x1c43e52a -//.word 0x8dbf4ca9 -//.word 0x378dba1c -//.word 0xe8997875 -//.word 0x5dfa5718 -//.word 0xfbd2fcdf -//.word 0xc0757c61 -//.word 0x78ce2974 -//.word 0x34ffabf0 -//.word 0xf84852b6 -//.word 0xb42aaaf1 -//.word 0x75cc509c -//.word 0xdd9d0545 -//.word 0xd13b0110 -//.word 0x719489fe -//.word 0x4d4bc46f -//.word 0xd55dcbe6 -//.word 0x1204ff0d -//.word 0x94db9ff9 -//.word 0xac439aae -//.word 0xdb06a1e6 -//.word 0x893b810e -//.word 0xfa6ab092 -//.word 0x7ff0255a -//.word 0xe9a46d95 -//.word 0x43bafcb5 -//.word 0xc1e8c1ba -//.word 0xf3c8fdb4 -//.word 0x3e7e5483 -//.word 0x8d9a25e2 -//.word 0x444017a4 -//.word 0x7686f43c -//.word 0x571dbb83 -//.word 0xf434f0b6 -//.word 0x219937be -//.word 0xb32121b5 -//.word 0xf04b46a5 -//.word 0x44209493 -//.word 0x365de6bc -//.word 0x99d4d81e -//.word 0x0710da3a -//.word 0x8b388419 -//.word 0x9e352a8d -//.word 0x5517afb9 -//.word 0xd8b59ed3 -//.word 0x16947629 -//.word 0xb70b4662 -//.word 0x52a47a07 -//.word 0xe1c4f542 -//.word 0x728f60e5 -//.word 0x1f06c1ad -//.word 0x3f724fc9 -//.word 0xde068596 -//.word 0x6bc075ad -//.word 0xb1905f1f -//.word 0x09bc82ff -//.word 0xcd833221 -//.word 0x0f012b22 -//.word 0x8b5225a8 -//.word 0xdbfaa8eb -//.word 0xea842275 -//.word 0xab6a3726 -//.word 0x0b35587a -//.word 0x24e5970f -//.word 0xb393b961 -//.word 0xcc558dd8 -//.word 0xcc627d06 -//.word 0x90776329 -//.word 0xe4799ef8 -//.word 0x3e5b649c -//.word 0xad4259fc -//.word 0x0ce7613d -//.word 0x7b3db389 -//.word 0x10553010 -//.word 0xc97ef24d -//.word 0xc5b0278b -//.word 0xb42b20a7 -//.word 0x8d5ba517 -//.word 0x7fff8c2b -//.word 0x298a8a93 -//.word 0x0dc94822 -//.word 0x42c7b9d2 -//.word 0x6aeeac07 -//.word 0xe46e9d18 -//.word 0x43e3d10b -//.word 0xfe32a2a0 -//.word 0x68b31792 -//.word 0xe396b719 -//.word 0x517f9fb3 -//.word 0xcc74d324 -//.word 0x97f9d2bb -//.word 0x54796dd8 -//.word 0x77e8d8ab -//.word 0xfaa7023e -//.word 0x53a822b6 -//.word 0xa3d292d6 -//.word 0x30a7e1c4 -//.word 0x15242410 -//.word 0x38e88cf2 -//.word 0x7d993ed3 -//.word 0x39845e0f -//.word 0xea836dfa -//.word 0x2524d621 -//.word 0xcf07c3d2 -//.word 0x908835de -//.word 0x859e549d -//.word 0x35030433 -//.word 0xc796b812 -//.word 0x72fd8bc0 -//.word 0x348e8ddb -//.word 0xc7705a5a -//.word 0xd1fdf215 -//.word 0x5b6bc488 -//.word 0x84ac0cd3 -//.word 0x76925f06 -//.word 0x9a37849c -//.word 0x089c8645 -//.word 0x429007e9 -//.word 0x21d4d7e9 -//.word 0x0f7cc6a8 -//.word 0x7798b64a -//.word 0x7a14f4bb -//.word 0xe4ddc8f3 -//.word 0x5e454a79 -//.word 0xe5a97826 -//.word 0x7a51862c -//.word 0x1b977557 -//.word 0xf34ce792 -//.word 0xce5732ac -//.word 0xcf9fb35c -//.word 0x652c6583 -//.word 0x7b89b1b2 -//.word 0xef6c88ec -//.word 0x4698b0ad -//.word 0x9e035b2a -//.word 0xe334fedb -//.word 0x46f06037 -//.word 0xeb15f2bf -//.word 0xe2c65e3d -//.word 0x59c8624e -//.word 0x102cdf1e -//.word 0x0d2f2d73 -//.word 0x905eb2ed -//.word 0x49feb38c -//.word 0xc9aa6972 -//.word 0x373e58ea -//.word 0x44f4dcaa -//.word 0x60cd0555 -//.word 0x2f33a444 -//.word 0x36dca686 -//.word 0xdbf1a125 -//.word 0x8c70adab -//.word 0x3ecf75e5 -//.word 0x19e28ee7 -//.word 0x71fe0750 -//.word 0xf95f41d0 -//.word 0x33c700e7 -//.word 0x2b68c3ef -//.word 0x6504515c -//.word 0x14539543 -//.word 0x8ca5ab19 -//.word 0xfac83bbe -//.word 0x532c06b9 -//.word 0x8a45bec6 -//.word 0x06311b8e -//.word 0x539b2bb5 -//.word 0x18dfea19 -//.word 0x496e1259 -//.word 0x9d753495 -//.word 0x43b90875 -//.word 0xd1c5026d -//.word 0x7d48253f -//.word 0x8fb91cc1 -//.word 0x163c87e0 -//.word 0xdac993e5 -//.word 0x938bcdf7 -//.word 0x588638e1 -//.word 0x5a7d9c16 -//.word 0xd21322f2 -//.word 0x38301e43 -//.word 0xb6a62c08 -//.word 0xdc157e79 -//.word 0x950c7447 -//.word 0x5a706d24 -//.word 0xa522de86 -//.word 0xa9dca1a8 -//.word 0x405c8fd2 -//.word 0x25c550db -//.word 0x634272ec -//.word 0x0decb986 -//.word 0x30eeb6c7 -//.word 0x06e69be9 -//.word 0x6c8f4e0b -//.word 0x969ebc34 -//.word 0x02e97095 -//.word 0xaace640e -//.word 0x7ed317f4 -//.word 0x118adf12 -//.word 0x93b881ed -//.word 0xffb5ff4d -//.word 0x9516b1f8 -//.word 0x8b8a97c1 -//.word 0x0002eec1 -//.word 0x311501e5 -//.word 0xefa242a9 -//.word 0x51b79922 -//.word 0xa6b1fc42 -//.word 0xada54058 -//.word 0x09ff2fd6 -//.word 0xef69da57 -//.word 0x22ef31e0 -//.word 0x2160d066 -//.word 0x9ef71c91 -//.word 0x333a8fc0 -//.word 0x5123504d -//.word 0x797e0712 -//.word 0xae92ef2c -//.word 0x2a032dfe -//.word 0x50f76079 -//.word 0xe278799b -//.word 0x741acd36 -//.word 0x20dd68f3 -//.word 0x7c54a496 -//.word 0xc907fb84 -//.word 0x6d171a82 -//.word 0xa42036bf -//.word 0x7263a315 -//.word 0xdc25a38c -//.word 0x57527c20 -//.word 0x8166cdc4 -//.word 0x0f8d21a6 -//.word 0x0609c5b5 -//.word 0x2fd5d761 -//.word 0xc488a0a1 -//.word 0x707b243b -//.word 0x772ef640 -//.word 0x30e851d5 -//.word 0xbc9e6539 -//.word 0xf216ef04 -//.word 0x994d0cad -//.word 0xda154f4f -//.word 0xf40211ad -//.word 0x32870873 -//.word 0x1b5d1cbf -//.word 0xe82475df -//.word 0x3b4dd95d -//.word 0x0d373538 -//.word 0xe8987975 -//.word 0x571fa9d6 -//.word 0x9c5831ea -//.word 0xa0cf7a46 -//.word 0x3078ba11 -//.word 0x654e10c6 -//.word 0x643bd035 -//.word 0x48381ccb -//.word 0x5db5b414 -//.word 0x8f3b0e7e -//.word 0x2250aa60 -//.word 0xa39ba03a -//.word 0x1e487b3f -//.word 0x91ae4910 -//.word 0xa12ff3cb -//.word 0x8c60cb44 -//.word 0x5f6a6492 -//.word 0x69b1a6ce -//.word 0xefb32117 -//.word 0x2132a2d9 -//.word 0x4d95044f -//.word 0x538c4947 -//.word 0x59f3ea26 -//.word 0xbff96a2b -//.word 0x558131f8 -//.word 0xccc8984e -//.word 0x6b484118 -//.word 0x03dda9ab -//.word 0x2527004c -//.word 0x922f38f2 -//.word 0xf34d5c4e -//.word 0xcb492309 -//.word 0xa9c0c54d -//.word 0xa2c90d86 -//.word 0xfed9af6a -//.word 0x32e4dd37 -//.word 0x0fc5153b -//.word 0x38e03d9a -//.word 0xd906f14c -//.word 0x96991c65 -//.word 0xc2f0c599 -//.word 0xd2fc2cff -//.word 0x112c1615 -//.word 0x958f6505 -//.word 0x7139eb26 -//.word 0x2ce780c6 -//.word 0x72e65227 -//.word 0x0a307dc7 -//.word 0x08d9dce4 -//.word 0x44a91e40 -//.word 0x0a0b1c22 -//.word 0x1325699d -//.word 0xb4492b14 -//.word 0x568c2afe -//.word 0x26b427e7 -//.word 0x0e586fb7 -//.word 0xe342b037 -//.word 0xe0180ad1 -//.word 0x533c6998 -//.word 0x96f01388 -//.word 0x41be7d0e -//.word 0x9e1763cb -//.word 0x5d3a1795 -//.word 0x89571abe -//.word 0xbbf4e999 -//.word 0x8e91193b -//.word 0x5287a67f -//.word 0x0536894d -//.word 0x7f5f881b -//.word 0xeccf52b3 -//.word 0x7f3ecb37 -//.word 0x6576a563 -//.word 0xf8b83013 -//.word 0x365b7305 -//.word 0x71b67bdf -//.word 0x4740f374 -//.word 0xd5f6f543 -//.word 0x28fd2040 -//.word 0xf489ebd8 -//.word 0x89fd382f -//.word 0x02542dac -//.word 0xc0bf3fb7 -//.word 0x178f8fc1 -//.word 0x46567a85 -//.word 0xad496b8e -//.word 0x3ae9f4fa -//.word 0x25e31e7d -//.word 0xdd34fda9 -//.word 0x4290876c -//.word 0x1405a6da -//.word 0xabdc8b2c -//.word 0xe9c04609 -//.word 0x6e229305 -//.word 0x0adbf768 -//.word 0x78130c30 -//.word 0x49621959 -//.word 0x1e36e65b -//.word 0x1a75cff5 -//.word 0x97631629 -//.word 0x18c57e88 -//.word 0x7f4715af -//.word 0x811b5112 -//.word 0x56e35ef8 -//.word 0xb5d1b7c7 -//.word 0xff0cf482 -//.word 0xbb56e290 -//.word 0x42edd9bf -//.word 0xbbae4a88 -//.word 0x4a809895 -//.word 0x85f02980 -//.word 0x2819bcde -//.word 0x09c7fd7c -//.word 0x4edc56e8 -//.word 0xddf20933 -//.word 0x14417cf6 -//.word 0xbbc3d393 -//.word 0x3697c4bd -//.word 0xffa4a73b -//.word 0x547ecde8 -//.word 0x2d8d13ff -//.word 0x716cb795 -//.word 0x698f6a67 -//.word 0x7529a6d6 -//.word 0xfe4c4130 -//.word 0xab524331 -//.word 0xd87df5ca -//.word 0x44da3a20 -//.word 0x096b22d8 -//.word 0xd284bd92 -//.word 0x48762db3 -//.word 0xcd6bff68 -//.word 0x6d91bce8 -//.word 0x117bbaf9 -//.word 0xf6c438b5 -//.word 0x5ef5aa8e -//.word 0x86a85290 -//.word 0xd7ee10e6 -//.word 0x60ef7ba0 -//.word 0x84d030b3 -//.word 0xf0da6b41 -//.word 0xd1d8d41b -//.word 0x43c09b85 -//.word 0x0c96c639 -//.word 0x8a8ecaae -//.word 0xea715999 -//.word 0x9b417cb5 -//.word 0x0220e1bf -//.word 0x706e76c5 -//.word 0x513237a1 -//.word 0xa6bb43c1 -//.word 0xb5873629 -//.word 0xfe63b3ba -//.word 0x72d440b4 -//.word 0xe0b6577a -//.word 0xb023b995 -//.word 0xd39606fc -//.word 0xfa508b92 -//.word 0x06fb5bf1 -//.word 0xc08ea166 -//.word 0xcb70343c -//.word 0xd7e06c3e -//.word 0x16943577 -//.word 0xf4a0613c -//.word 0x039a436d -//.word 0x34fc79f7 -//.word 0x4dc9099d -//.word 0x9774b0f9 -//.word 0xd7fd76bd -//.word 0x805d863f -//.word 0x27243d35 -//.word 0x376181bc -//.word 0xe6c254a0 -//.word 0x68fca8d7 -//.word 0x626d754e -//.word 0xa1000ae9 -//.word 0x0c52a1c5 -//.word 0xd71335c0 -//.word 0xfaae983b -//.word 0xe22cc01e -//.word 0x6655611d -//.word 0xfc19c23a -//.word 0x2d2fc98b -//.word 0x46fc573e -//.word 0x51b6dcda -//.word 0x43c922c7 -//.word 0x777a6d11 -//.word 0x5bcac669 -//.word 0x6a9d946d -//.word 0x5a1b6c29 -//.word 0x96572add -//.word 0xee2e4100 -//.word 0x8d734f86 -//.word 0x2c49f55f -//.word 0x86cfe540 -//.word 0x0c033ca5 -//.word 0xd9e01317 -//.word 0xe8ca50aa -//.word 0x852cc2cb -//.word 0x01606e38 -//.word 0xaacf2350 -//.word 0xfa59558d -//.word 0x0ff7284f -//.word 0x5b9ecadb -//.word 0x9d6706a3 -//.word 0x10ee16c8 -//.word 0xe2f7b9dd -//.word 0xe75886ee -//.word 0x8f1380c0 -//.word 0x16c2ea5b -//.word 0xfa385dc6 -//.word 0xb2651712 -//.word 0x9d7a9699 -//.word 0x394e6688 -//.word 0x9500379b -//.word 0x09df3228 -//.word 0x24868d5f -//.word 0xe64b5dd0 -//.word 0x2fdbac2e -//.word 0x781ecc52 -//.word 0xc161ea82 -//.word 0xcab3e6f4 -//.word 0x868f638e -//.word 0xcdbc1af0 -//.word 0x517273b4 -//.word 0xd3be56f4 -//.word 0x97273e0d -//.word 0x159290a3 -//.word 0xf1632ce6 -//.word 0x2de54113 -//.word 0x9eec653d -//.word 0x9cb9e54d -//.word 0xfe1d5948 -//.word 0x46e27cd0 -//.word 0x18663bee -//.word 0xf1890c0e -//.word 0x15c9814b -//.word 0xc9ac1ded -//.word 0xc35f6630 -//.word 0xdf9c3b48 -//.word 0x13d068a1 -//.word 0xa57e786b -//.word 0x9bdecb56 -//.word 0x74cbe89a -//.word 0x15dc133b -//.word 0x06d0238b -//.word 0xde2f8ef0 -//.word 0xfc2ec6e7 -//.word 0x78d3c849 -//.word 0x595bf1ce -//.word 0x09d914cf -//.word 0x061fcb50 -//.word 0xd9e10a3d -//.word 0x4c18faf4 -//.word 0xd8a50404 -//.word 0x5d372b34 -//.word 0x166ea0c8 -//.word 0xcb4190ff -//.word 0x489d41e0 -//.word 0x0f4e5d36 -//.word 0x4a238eda -//.word 0x034d4a30 -//.word 0x9709f1f4 -//.word 0x687f1537 -//.word 0xd3e918a4 -//.word 0x62f7fd08 -//.word 0x42727812 -//.word 0xf7214757 -//.word 0x4ee9c598 -//.word 0x9337bd48 -//.word 0x05a37c49 -//.word 0x87cd2af7 -//.word 0x988b5a67 -//.word 0x8547dff0 -//.word 0xdda2e1eb -//.word 0x265d31b8 -//.word 0xce7ada02 -//.word 0x659ef943 -//.word 0x09bace8a -//.word 0x21ea127c -//.word 0x4e9e8b98 -//.word 0x9ef7dfc0 -//.word 0x0374a6f5 -//.word 0x04cdc263 -//.word 0xb31ff39d -//.word 0xdf4aa629 -//.word 0x8a970e3f -//.word 0x9d9f76ce -//.word 0xdb68d6c0 -//.word 0x14d0a47f -//.word 0x9b2fecb8 -//.word 0xfa38a35f -//.word 0xe32039f3 -//.word 0x6a036d03 -//.word 0x728365f1 -//.word 0x65b2fef6 -//.word 0x29326166 -//.word 0x4f9ad735 -//.word 0x8d1cdebb -//.word 0x6e657cb4 -//.word 0x48c5d38b -//.word 0x6f90f6d8 -//.word 0xa8c4fb27 -//.word 0xe0eb51fb -//.word 0x1e435412 -//.word 0xb71d1feb -//.word 0xc183a186 -//.word 0xc91df46b -//.word 0xc956e9ed -//.word 0x54bae8b0 -//.word 0x14a2f769 -//.word 0x761418e5 -//.word 0xa4e5d84d -//.word 0xb42025a8 -//.word 0x1eac60a1 -//.word 0x7428b38a -//.word 0x4d1aa5a2 -//.word 0x8349eb93 -//.word 0x9e67813f -//.word 0x8ff3fabc -//.word 0xa25e159d -//.word 0xae6d9074 -//.word 0x8ede4195 -//.word 0xd54e621c -//.word 0xbe5a2d31 -//.word 0x6205a98a -//.word 0x2e59c332 -//.word 0x9352a089 -//.word 0xfff7328d -//.word 0x0dca0957 -//.word 0xf9626ce8 -//.word 0x5657a926 -//.word 0x035ea922 -//.word 0x5bb5c79c -//.word 0xacc2e2c9 -//.word 0xeaf7b154 -//.word 0xa5f857a2 -//.word 0x3900385a -//.word 0x45810a25 -//.word 0x5e0a2fb2 -//.word 0x046e42fe -//.word 0xd423f0d2 -//.word 0x00e8098d -//.word 0xfdaad623 -//.word 0x7ba9ae66 -//.word 0x9ad7c484 -//.word 0x5b8043d1 -//.word 0x54309dc7 -//.word 0xa9d21f4b -//.word 0x3715ca32 -//.word 0x12145e04 -//.word 0x3235b700 -//.word 0x69515c60 -//.word 0x981656de -//.word 0x23800000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x0000DFA8 -//// expected output -//.word 0x2e232557 -//.word 0x233b61c0 -//.word 0xaba3bf10 -//.word 0xb0cbbfb9 -//.word 0x53974c89 -//.word 0x31e639b6 -//.word 0xefafbac7 -//.word 0x6320ddd4 -//.word 0x7100ab40 -//.word 0x6ce17e21 -//.word 0x6463658e -//.word 0xc43bf0ec -//.word 0x8acc2bc3 -//.word 0xd076ce08 -//.word 0x283477c5 -//.word 0xf6149ff2 -//// SHA512LongMsgvector_72 -//// vector length -//.word 0x0000E2C0 -//// input message -//.word 0x0728c948 -//.word 0x567a5850 -//.word 0x603cb2a1 -//.word 0x917ac540 -//.word 0x6ff16c6a -//.word 0xd071441d -//.word 0x4a85bbda -//.word 0xec5669aa -//.word 0x2bcda45f -//.word 0x1ff84e1c -//.word 0xf0aff217 -//.word 0x8b770f9e -//.word 0x99a6b458 -//.word 0xb1c84dce -//.word 0xcc42bd29 -//.word 0xfa35ad3d -//.word 0x54a523c7 -//.word 0x32db56f3 -//.word 0x9e07c122 -//.word 0x082a76e9 -//.word 0x3b33b55d -//.word 0x8f68bd8e -//.word 0x6008e251 -//.word 0xc02fe043 -//.word 0x69f96f0a -//.word 0xf5ea17de -//.word 0x528e4649 -//.word 0x705ca02a -//.word 0x3ce09600 -//.word 0xd21a3a65 -//.word 0xee2151d9 -//.word 0xa40baac1 -//.word 0x5211afaf -//.word 0xd2ef3ae4 -//.word 0xf48aaa14 -//.word 0x2bd53569 -//.word 0x86f580ca -//.word 0xe2a46c5c -//.word 0x5fd33349 -//.word 0x1093b5c1 -//.word 0xf7350c3f -//.word 0x30b0660e -//.word 0x6c44140b -//.word 0xa15ddeac -//.word 0x00ba9a41 -//.word 0x28cefd7a -//.word 0x9967b02a -//.word 0x6b8da64a -//.word 0x40adae41 -//.word 0x77f74463 -//.word 0xa204adb7 -//.word 0x3abc43fd -//.word 0x92770def -//.word 0x0a6292c8 -//.word 0x8525ef03 -//.word 0x1dc22865 -//.word 0x15c0bc3d -//.word 0x0e8a7ceb -//.word 0x7e129c9f -//.word 0x5fb90b63 -//.word 0x2473005c -//.word 0xf126d64c -//.word 0x0b54195c -//.word 0x8efae119 -//.word 0x5eb85ebc -//.word 0x5f31b5ae -//.word 0xe9b50a4b -//.word 0x761edee7 -//.word 0x9ef79c0e -//.word 0x46e46e10 -//.word 0x143d55bd -//.word 0x26fd796e -//.word 0x03dbbe45 -//.word 0xd1b697b5 -//.word 0xc9361f44 -//.word 0xe9b1668f -//.word 0xe84b088f -//.word 0x6f62051c -//.word 0x8629ccaf -//.word 0x4d92996c -//.word 0xec720160 -//.word 0xcce0cc07 -//.word 0x08dd0211 -//.word 0x1e3b4865 -//.word 0xebb76d67 -//.word 0xd6694176 -//.word 0x4b5ea6b9 -//.word 0x6b83e91c -//.word 0x01c45295 -//.word 0xb876f9ac -//.word 0x8cf2dc3a -//.word 0x7f832f71 -//.word 0x8d83f31c -//.word 0xe1c0ca28 -//.word 0x49250a64 -//.word 0xe8961085 -//.word 0x2b1bd76d -//.word 0xfe41c9ad -//.word 0x3fbdd448 -//.word 0x7253c1ba -//.word 0xb7f6c138 -//.word 0xfa31493a -//.word 0x6ac52037 -//.word 0x2c94b7af -//.word 0x50bdb86f -//.word 0x0409e111 -//.word 0x078613c2 -//.word 0x6171a648 -//.word 0x52590043 -//.word 0x888266b2 -//.word 0x948811ba -//.word 0x9f4485a3 -//.word 0x59f31e24 -//.word 0x3395ece0 -//.word 0xce94c130 -//.word 0xb3a68723 -//.word 0x44f4d7c3 -//.word 0xf37cc89a -//.word 0xb1b40575 -//.word 0xa9702368 -//.word 0x2f053112 -//.word 0xf3af9022 -//.word 0x7b30051a -//.word 0xd0ba0c54 -//.word 0x770f6f42 -//.word 0xa2e718f9 -//.word 0xa89223f1 -//.word 0xb3de3806 -//.word 0xb83b18c3 -//.word 0xad1d75e0 -//.word 0xf6a20709 -//.word 0x2075dce2 -//.word 0xd1f2f047 -//.word 0xff8bfdd8 -//.word 0x616a94b5 -//.word 0x23576d86 -//.word 0xdeddfcbf -//.word 0xc7a84422 -//.word 0x2732f085 -//.word 0x0b9fa0d5 -//.word 0x3ce5815b -//.word 0x712f203e -//.word 0xc4848049 -//.word 0x63a36aef -//.word 0x8832048c -//.word 0xab18a5ee -//.word 0xf628e814 -//.word 0xf9ffff35 -//.word 0x9f2f4a05 -//.word 0x609d2833 -//.word 0xb9270e36 -//.word 0xd98ad649 -//.word 0x9e8359b4 -//.word 0xbf353f4e -//.word 0x4bcb1640 -//.word 0x525ea20b -//.word 0xe11974cd -//.word 0x349bbec0 -//.word 0x289c6603 -//.word 0xefd4599d -//.word 0x071822bf -//.word 0x6dc7bb49 -//.word 0x0e64a390 -//.word 0x7e84305e -//.word 0xeceb273b -//.word 0x56f28aeb -//.word 0xf92cb138 -//.word 0x0c489cf2 -//.word 0xad398833 -//.word 0x1c95c0e7 -//.word 0x273bb68c -//.word 0xe5395237 -//.word 0xa7ed8ad8 -//.word 0x2c6a33be -//.word 0x141c175e -//.word 0x97b04750 -//.word 0x772eb39a -//.word 0x3368f731 -//.word 0x7e9878bd -//.word 0xef45b09d -//.word 0xfa66c62b -//.word 0x1fca6241 -//.word 0x61b7bffc -//.word 0xfad202bf -//.word 0x4d3eca7b -//.word 0x1c08082e -//.word 0xfbc311aa -//.word 0x056ff198 -//.word 0xcda002bc -//.word 0x98dcbe7b -//.word 0xc944d29a -//.word 0x9c767348 -//.word 0x17b3f55f -//.word 0x3e3d9ae7 -//.word 0x8703a8dc -//.word 0x8d80be30 -//.word 0x08e16714 -//.word 0xfd66f074 -//.word 0x320a77c0 -//.word 0xe56645f2 -//.word 0xbdd35ecd -//.word 0x01cf5562 -//.word 0x08a265d9 -//.word 0xf141be6e -//.word 0x94721dba -//.word 0xb7319f34 -//.word 0x8652d7f7 -//.word 0x3d691ec6 -//.word 0x28e72a4d -//.word 0xcd85e3a9 -//.word 0x68e6712b -//.word 0x97779a59 -//.word 0x579b4b36 -//.word 0x2f0574c4 -//.word 0xab6419c6 -//.word 0x0c46a7ca -//.word 0x3e368467 -//.word 0x0a28e9c4 -//.word 0x8d18f459 -//.word 0xe9edf9fa -//.word 0x3aa31a11 -//.word 0xcca9172b -//.word 0x8b8867b6 -//.word 0xbac68708 -//.word 0xe80a92a4 -//.word 0x208012b9 -//.word 0x617f15ec -//.word 0x4d6a8457 -//.word 0x25d4b1d2 -//.word 0xf5e72f71 -//.word 0x0c06e64e -//.word 0xafb16688 -//.word 0x0fa97c8b -//.word 0x78550392 -//.word 0xca65fd6b -//.word 0x2db5e37a -//.word 0x01743901 -//.word 0x1485649f -//.word 0x1825c016 -//.word 0x54cfee51 -//.word 0x995c6ba5 -//.word 0x786f6757 -//.word 0xb210d45e -//.word 0xf097bd6b -//.word 0xb4ccd927 -//.word 0x904c60bb -//.word 0x962f1d96 -//.word 0x0fe7c56a -//.word 0x706b8778 -//.word 0x8996e40e -//.word 0x00c9c14e -//.word 0xfed8ba30 -//.word 0x2824bacb -//.word 0xd104c8d0 -//.word 0x6d6a2457 -//.word 0x49c393de -//.word 0x7a1ef78e -//.word 0x149122c1 -//.word 0x9cd8ecc2 -//.word 0xbf4083d3 -//.word 0x43c40375 -//.word 0x3f7547e3 -//.word 0x871ffee0 -//.word 0x6b2901b2 -//.word 0xa1bde46f -//.word 0x7f29ca77 -//.word 0x6d857e42 -//.word 0x9b96c05c -//.word 0xeff3ddad -//.word 0x426683fe -//.word 0xcb95d2b9 -//.word 0xdbe2b6f0 -//.word 0xcb8f75a1 -//.word 0x33268439 -//.word 0x5d189f56 -//.word 0xfaa418d1 -//.word 0x13fa70fc -//.word 0x42a12428 -//.word 0x2116c96b -//.word 0x03b65ba0 -//.word 0xe2ddd3ae -//.word 0x9950f70e -//.word 0x53d87687 -//.word 0x4430343c -//.word 0x9721e3e9 -//.word 0xa7ecd36a -//.word 0x71e80b7d -//.word 0x4a6c98c8 -//.word 0xcdef251e -//.word 0x186eccfe -//.word 0x380f2c5c -//.word 0xe103bca4 -//.word 0x62b05efd -//.word 0xd91038cb -//.word 0xa354bf77 -//.word 0x17ce1472 -//.word 0x740d9477 -//.word 0x174aab11 -//.word 0xf203e85e -//.word 0x39e55712 -//.word 0x5eef0bbe -//.word 0x40d5fa53 -//.word 0xa0a20ee2 -//.word 0xd4a278a5 -//.word 0xbf7f4843 -//.word 0x00aa3a50 -//.word 0x6afcd313 -//.word 0xb49ead8d -//.word 0x722610b6 -//.word 0x4402c10a -//.word 0x4e1a1f44 -//.word 0xe8b16b6a -//.word 0x968c6809 -//.word 0x3a5724c2 -//.word 0x88441505 -//.word 0xbbf5671d -//.word 0x869c956d -//.word 0x4e6137f9 -//.word 0x96041b28 -//.word 0xbbc396c8 -//.word 0xe17e1c52 -//.word 0x2d190f6f -//.word 0x3522d5bc -//.word 0xb4b32dca -//.word 0x839ac36a -//.word 0xc4b80227 -//.word 0x60a72913 -//.word 0xb5a0a1c7 -//.word 0x889b8ea5 -//.word 0x41b7a460 -//.word 0x57dd3bbf -//.word 0x09a0a69d -//.word 0x4f68c135 -//.word 0x10d0ca9c -//.word 0x954c728f -//.word 0x3e0f336f -//.word 0x732ce38a -//.word 0xdefb8a9c -//.word 0xd7be7196 -//.word 0x20847b9d -//.word 0xd34eb856 -//.word 0x98713861 -//.word 0x1b3b1d23 -//.word 0xbed9f4c9 -//.word 0x8b784689 -//.word 0x6cab692b -//.word 0x9e0d9cc9 -//.word 0x632754d3 -//.word 0xf794d055 -//.word 0xc662f37d -//.word 0xdcbc5358 -//.word 0x9dc68edc -//.word 0xb6c9dd2b -//.word 0x5390eb16 -//.word 0x9312e7e0 -//.word 0x3851d745 -//.word 0xa48130bb -//.word 0x016da4f8 -//.word 0xbf173cb4 -//.word 0x439ea6b0 -//.word 0xdd65d0f7 -//.word 0xfb72b664 -//.word 0x9d147864 -//.word 0x09c9affd -//.word 0xc05e0110 -//.word 0xb058f3db -//.word 0xab93ffc1 -//.word 0x1829e74e -//.word 0xe9954876 -//.word 0xcd19721d -//.word 0xa65d77dd -//.word 0x3d588203 -//.word 0x34736ada -//.word 0x3dec872d -//.word 0x8a79c507 -//.word 0x852ff6bd -//.word 0xc0a16d2e -//.word 0x2f4cc84a -//.word 0x95330dd1 -//.word 0x3cc6f95d -//.word 0xe90894a3 -//.word 0x0ff109f6 -//.word 0x4311b50d -//.word 0xf0777e05 -//.word 0x4cd166a9 -//.word 0x8ad55ff2 -//.word 0x52df62ca -//.word 0x6edbbb15 -//.word 0xc665a7f2 -//.word 0x8e2f203e -//.word 0xbea3f85b -//.word 0xc2ca252f -//.word 0x736d5c6f -//.word 0x477ae11d -//.word 0xc4a89d4f -//.word 0x3b5e7133 -//.word 0xb2d2ca50 -//.word 0x226e750e -//.word 0xe377b579 -//.word 0x64f09342 -//.word 0x1fbc7606 -//.word 0xcc04f3d3 -//.word 0xd5d8e6e9 -//.word 0x0b19c2bd -//.word 0x97962544 -//.word 0x3375b06d -//.word 0x9ad515f0 -//.word 0x3cb17146 -//.word 0x3707ddf8 -//.word 0x833a3f1d -//.word 0x6cb6671e -//.word 0x46d257bd -//.word 0x5cfae156 -//.word 0x290d7864 -//.word 0xcb044046 -//.word 0xb4d56744 -//.word 0xa396b8cd -//.word 0xd2e66d02 -//.word 0x71894579 -//.word 0x5452d73a -//.word 0xe946260e -//.word 0x6cfe75fa -//.word 0x5e4d5d06 -//.word 0x33231c42 -//.word 0x4bb1300b -//.word 0x23ce258b -//.word 0xcd9aab7f -//.word 0x9d61eb3d -//.word 0x26c21bf5 -//.word 0x64105037 -//.word 0x3bf894b5 -//.word 0x2064394b -//.word 0x17a06d3c -//.word 0xddbb0ebf -//.word 0x6631bfba -//.word 0x8ac63bcd -//.word 0xfbb5e992 -//.word 0x7a0ab123 -//.word 0x4a4d0fdd -//.word 0xe5606564 -//.word 0xefaa96e7 -//.word 0x6876d0a6 -//.word 0x2595a9b1 -//.word 0x814b6ef2 -//.word 0x5069b76d -//.word 0x14b63fc7 -//.word 0x7493f305 -//.word 0xe9df4997 -//.word 0xbb19d395 -//.word 0x2cc41448 -//.word 0xf21092ec -//.word 0xebb62cb4 -//.word 0x0d24ae0f -//.word 0x9cdaa32a -//.word 0x9f146bb6 -//.word 0x94a98deb -//.word 0x63334ecd -//.word 0x917082ae -//.word 0xb6e8a2f4 -//.word 0x31d01f1c -//.word 0x1a2ff6ff -//.word 0x783f8554 -//.word 0xb4169c77 -//.word 0x4e85d869 -//.word 0xcf412c17 -//.word 0xff40c1df -//.word 0x57660050 -//.word 0xb961ed31 -//.word 0x5fd2b6c5 -//.word 0x12ad8b4e -//.word 0x9ce2b1d0 -//.word 0x7f3dd217 -//.word 0xe78a98fb -//.word 0xdefe7ae3 -//.word 0xbfd2d588 -//.word 0xed313efc -//.word 0xc45417ea -//.word 0xd0ec601f -//.word 0x3dc0d049 -//.word 0x8f9724ff -//.word 0x9458b802 -//.word 0x967054c3 -//.word 0xd4744825 -//.word 0x3407bb83 -//.word 0x32ff40f5 -//.word 0x1cc3aacf -//.word 0x81f7226b -//.word 0xe75c7629 -//.word 0xbcf1b4b3 -//.word 0x8f5ff886 -//.word 0x809382ae -//.word 0xf5ad0bd0 -//.word 0x8f19596e -//.word 0x5dfb1267 -//.word 0x4fd1cebd -//.word 0xed546f9b -//.word 0x489eb597 -//.word 0x31920d34 -//.word 0xaa79aaab -//.word 0x9ae9d7eb -//.word 0xc5eb8cde -//.word 0xfa5c3fee -//.word 0x8e94fcc8 -//.word 0x0a46b85f -//.word 0x21a7e334 -//.word 0xe5d33cd6 -//.word 0x3a6ce9a4 -//.word 0x8a84c7da -//.word 0xbabdffcc -//.word 0x5daeda6c -//.word 0x2889d612 -//.word 0xa6fbf97d -//.word 0x2d546515 -//.word 0x11e82d72 -//.word 0x17b56722 -//.word 0x2d4682a7 -//.word 0x58d7dac0 -//.word 0xedb98aea -//.word 0x04f88125 -//.word 0x2a3cd9fb -//.word 0x56ed64bf -//.word 0x1f9a8713 -//.word 0x2b9c4bac -//.word 0xebf6b15a -//.word 0x85804642 -//.word 0x1245f86e -//.word 0x0a292889 -//.word 0xfccf00e3 -//.word 0x83b907bc -//.word 0x75b1f2be -//.word 0x5d68becb -//.word 0x2c5efbf9 -//.word 0x2b016bdb -//.word 0x3419cb03 -//.word 0x2263f1c4 -//.word 0x867c173d -//.word 0x9c017792 -//.word 0x7df5187d -//.word 0x9563e706 -//.word 0x5844098e -//.word 0x31a27012 -//.word 0xbbfeacae -//.word 0x34f00460 -//.word 0x2f0dc60f -//.word 0x880ddbcc -//.word 0x9d2e9e57 -//.word 0xbbd3efe5 -//.word 0xd7718220 -//.word 0x7fab7d70 -//.word 0x10bc4379 -//.word 0x28168ae5 -//.word 0x5e48b463 -//.word 0x31255cef -//.word 0x3f232f55 -//.word 0xb801fdf0 -//.word 0x11ad0fb8 -//.word 0xfd64bc7c -//.word 0x991b376b -//.word 0xe61eabd9 -//.word 0x7df78a40 -//.word 0x7e912285 -//.word 0xca9d717d -//.word 0x72353ab0 -//.word 0x6fbf585d -//.word 0x931553be -//.word 0xbfe3318c -//.word 0x57508ec6 -//.word 0xf3e0efaf -//.word 0x57985416 -//.word 0xa6640cd9 -//.word 0xd2b7cdac -//.word 0x57710417 -//.word 0x29056abe -//.word 0xeadbd8e5 -//.word 0x61f35c33 -//.word 0x28cc8cb6 -//.word 0xa4841a28 -//.word 0x3a40a971 -//.word 0xc0cedf6c -//.word 0x3289bcee -//.word 0xa77d2a05 -//.word 0x83ccd57d -//.word 0xed513ca9 -//.word 0x84820960 -//.word 0x4d9b9d45 -//.word 0xf0f9f04b -//.word 0x25c39879 -//.word 0x69d027eb -//.word 0xf5c5ba1a -//.word 0xf07ecf5d -//.word 0xe4b057af -//.word 0x6fcc0db2 -//.word 0x3b2605f4 -//.word 0x2f568871 -//.word 0xe7de1f5a -//.word 0x620eee15 -//.word 0xfb254385 -//.word 0x9bb96f8b -//.word 0x2c59d5cd -//.word 0x517040b6 -//.word 0x546c7abe -//.word 0x60201aeb -//.word 0xf0679d97 -//.word 0x870bb875 -//.word 0xa2e5edcf -//.word 0xea455d11 -//.word 0xaf94dd8b -//.word 0x92374b73 -//.word 0x81b72329 -//.word 0xe91f4dbf -//.word 0x26a639b9 -//.word 0x3f8e2e11 -//.word 0xd04cdf7f -//.word 0x47e940f7 -//.word 0x53a89772 -//.word 0x9ae9d6f1 -//.word 0xab4d28bf -//.word 0x331bcaf7 -//.word 0x73e31c47 -//.word 0xf161f8f3 -//.word 0x6ea3421d -//.word 0x196ec043 -//.word 0x02df2c09 -//.word 0xd14e8839 -//.word 0xb877b208 -//.word 0xa6dc389b -//.word 0xbe656dc9 -//.word 0x074abd23 -//.word 0x65323d31 -//.word 0xc89d86ff -//.word 0xa37fc4d8 -//.word 0xa02d0a52 -//.word 0x927de98b -//.word 0xaa2940b1 -//.word 0xef7555c8 -//.word 0xe81225a7 -//.word 0x9b41f944 -//.word 0xbc3c3a32 -//.word 0x1ed18668 -//.word 0x6d500344 -//.word 0x1fa7f4d0 -//.word 0xa8cc8a43 -//.word 0xed5bfccb -//.word 0xfc81da89 -//.word 0xfa189edd -//.word 0x5c1384e5 -//.word 0x5b1d9b40 -//.word 0xa17d1c18 -//.word 0x493dfb5f -//.word 0x068bbd58 -//.word 0xa25f895a -//.word 0xab5e81d1 -//.word 0x69ff5385 -//.word 0x12ec0a1f -//.word 0x41ab2be9 -//.word 0xa57dfdd5 -//.word 0xf68628c1 -//.word 0x2e2f81f9 -//.word 0xf5c925fd -//.word 0x5d73c585 -//.word 0xcf3d40c3 -//.word 0x468d77e8 -//.word 0xbac25de9 -//.word 0xe0184d83 -//.word 0x10cba17d -//.word 0x8680802d -//.word 0xcee0f73d -//.word 0x7a864baf -//.word 0x161b8e1f -//.word 0x5ebf7148 -//.word 0xaeab59ca -//.word 0xb915b52b -//.word 0x7e548e1b -//.word 0x78455ffc -//.word 0x15ed28a1 -//.word 0x6a60be56 -//.word 0x25e16521 -//.word 0xc34aa048 -//.word 0x03af4813 -//.word 0x9a3edcd3 -//.word 0x28691823 -//.word 0x6b48c96e -//.word 0xb238dfb2 -//.word 0x95c9c483 -//.word 0xe4d7ec52 -//.word 0xddf6aeef -//.word 0xa214524d -//.word 0xea596b86 -//.word 0xf652671e -//.word 0xc74f648c -//.word 0x8e0945f6 -//.word 0x6488053d -//.word 0x3b444c39 -//.word 0x148b4046 -//.word 0x73229eff -//.word 0x102f0949 -//.word 0xd056a294 -//.word 0xf323d85d -//.word 0x8fa882f7 -//.word 0x3d672b8c -//.word 0x1272ac5f -//.word 0xd1d00153 -//.word 0x5e2355b1 -//.word 0x76885f26 -//.word 0x9ebff10b -//.word 0x598ccee9 -//.word 0x9e5cbd3d -//.word 0x892cdb78 -//.word 0x51a7354a -//.word 0x7a8e9620 -//.word 0x4c5d9eec -//.word 0x832c1424 -//.word 0x48d37d0d -//.word 0x6051ee39 -//.word 0xa46f1e4e -//.word 0xb1a0bf0a -//.word 0xe02c0f84 -//.word 0x798daab5 -//.word 0x2319a236 -//.word 0x9fe2d14b -//.word 0xb6db6e21 -//.word 0x703cdf54 -//.word 0x8727ceb4 -//.word 0x1b8b7f49 -//.word 0xa7496195 -//.word 0x3495e318 -//.word 0xcd9f881a -//.word 0x32733ea4 -//.word 0xd11eecd0 -//.word 0xf1134a42 -//.word 0x31cdf5f7 -//.word 0x31b5c33e -//.word 0x8f455303 -//.word 0x156ee953 -//.word 0x3037791d -//.word 0xa4a80236 -//.word 0x7fe61ea0 -//.word 0x4b9fd60c -//.word 0x88a8ba9d -//.word 0x5ae532ef -//.word 0x7e6a0f58 -//.word 0x82df656e -//.word 0x36299dc9 -//.word 0x5e47c60a -//.word 0xa9792c1b -//.word 0xe7a82cb9 -//.word 0x76024630 -//.word 0xfde57466 -//.word 0x5dfeba1b -//.word 0xe5b2ff6f -//.word 0xc6bc1ba5 -//.word 0xc6183126 -//.word 0x38203fc9 -//.word 0x2bf6f351 -//.word 0xe221c138 -//.word 0x847b32ab -//.word 0x154a7fd5 -//.word 0xa5ad5e60 -//.word 0xc73a1c39 -//.word 0x45e5ec94 -//.word 0x12237f31 -//.word 0x8050d4dd -//.word 0xb34e523b -//.word 0x567014c4 -//.word 0x8c96840d -//.word 0x2a992b48 -//.word 0x23e9c70e -//.word 0x44749e5c -//.word 0x21ca13db -//.word 0x4f7f7764 -//.word 0xd3d121c3 -//.word 0xdb8bc1bb -//.word 0xac2af14b -//.word 0xdc3d0d30 -//.word 0xc11245ab -//.word 0x298ef084 -//.word 0x4b5d234f -//.word 0xfe4c83ee -//.word 0x29f25757 -//.word 0x7b96e298 -//.word 0x5c4def18 -//.word 0x2363ad1f -//.word 0x89fcbd98 -//.word 0x5dfb8a16 -//.word 0x7a23d916 -//.word 0xf77ca184 -//.word 0x9df91c80 -//.word 0x9e571e61 -//.word 0x8348a6fa -//.word 0x67d1b21d -//.word 0x63f1585e -//.word 0x49831319 -//.word 0x95655bb7 -//.word 0xa0da782c -//.word 0x172d97c4 -//.word 0xac981e20 -//.word 0x0b633d7b -//.word 0x1050c533 -//.word 0x37373e84 -//.word 0x54ee3496 -//.word 0x846bd1ba -//.word 0x632db1f0 -//.word 0x7fd8f1ae -//.word 0x0d1f89dc -//.word 0xdbe6dc23 -//.word 0x86a88e67 -//.word 0xed179692 -//.word 0xe5039494 -//.word 0x2f7d64a8 -//.word 0xa73cf3d8 -//.word 0xbd4051c3 -//.word 0x29b4089e -//.word 0xdb19ad79 -//.word 0x31a1b4c3 -//.word 0x6dd98811 -//.word 0x668bdc1b -//.word 0x7ee33b07 -//.word 0xd3d0e7eb -//.word 0xbaade08d -//.word 0x6921436d -//.word 0xf344d505 -//.word 0x7a03e04f -//.word 0x9fc53e88 -//.word 0x3e4fb334 -//.word 0x59e48062 -//.word 0x51b13431 -//.word 0x5c69c693 -//.word 0x332de151 -//.word 0x0bae7f4f -//.word 0xc795b912 -//.word 0x6c23dd7f -//.word 0xd514c2e5 -//.word 0xa8ca583e -//.word 0x88a783b2 -//.word 0x8cbb2a5d -//.word 0xf09f8b52 -//.word 0x0ba0d1e0 -//.word 0x8120e814 -//.word 0xba3a907e -//.word 0x93a5b038 -//.word 0x53dbed25 -//.word 0xe07a7c77 -//.word 0x33ea3474 -//.word 0x0940e879 -//.word 0xdb62f33f -//.word 0x116c145d -//.word 0x73537d0e -//.word 0xe0c92635 -//.word 0x4260679e -//.word 0xc1f1c687 -//.word 0x373f0e5f -//.word 0xe4d8a1cd -//.word 0x643c0ef4 -//.word 0xdd41e6f6 -//.word 0x7db6ccb6 -//.word 0x2447cce3 -//.word 0x5da0ee32 -//.word 0x93d60aea -//.word 0x8202dda6 -//.word 0xeb2f5d56 -//.word 0x8c764a88 -//.word 0x4f6706e6 -//.word 0xc2aba6ff -//.word 0xc7e8494a -//.word 0x8de5a867 -//.word 0xbeefefa9 -//.word 0xfa7bccd2 -//.word 0x850cc51d -//.word 0x3c57ce82 -//.word 0xcea51b35 -//.word 0x287a3370 -//.word 0x31744672 -//.word 0xb875c0c8 -//.word 0xaa051ecb -//.word 0x89f1006a -//.word 0x19388029 -//.word 0x5d28c36a -//.word 0xc1c5cdeb -//.word 0x996a9a91 -//.word 0xcab36a64 -//.word 0xc7995cda -//.word 0xc0df3e58 -//.word 0x16aea4f6 -//.word 0x117c3783 -//.word 0xd53250c9 -//.word 0x928dc611 -//.word 0xfcc404ea -//.word 0xfb6c5e27 -//.word 0xa399a527 -//.word 0x6647f859 -//.word 0x88f8defe -//.word 0xd49e9231 -//.word 0x8eba9e25 -//.word 0xa8c6abaf -//.word 0x38d19804 -//.word 0x2a69c9c3 -//.word 0x32bdc236 -//.word 0x0503f4d5 -//.word 0xc918d60b -//.word 0xca66383d -//.word 0x6e0bd509 -//.word 0x6b3827cb -//.word 0x37d67f66 -//.word 0xc1705441 -//.word 0x5e4ddb8f -//.word 0x06dcd9d4 -//.word 0xc056b6a4 -//.word 0x5b9ed2ae -//.word 0x5f6c1cfa -//.word 0x43aae06f -//.word 0xe01ee098 -//.word 0x264aa7a8 -//.word 0x0e901abb -//.word 0xcf9a505e -//.word 0x55f9a352 -//.word 0xef0c078d -//.word 0x48249b82 -//.word 0x98e57ea2 -//.word 0x1bf0e423 -//.word 0xc3bf6900 -//.word 0x2acfa541 -//.word 0xca05007c -//.word 0x704bc79c -//.word 0xee7a80e1 -//.word 0x107c7b28 -//.word 0xd2b2aa6d -//.word 0xd093b28e -//.word 0xfe964251 -//.word 0x9952a4a9 -//.word 0x5ee49235 -//.word 0xf9924a0a -//.word 0xc0aee5b2 -//.word 0xa1bce474 -//.word 0x59d70cd6 -//.word 0xe7507461 -//.word 0x4199dca4 -//.word 0x4561407c -//.word 0xf201ad92 -//.word 0xd8175424 -//.word 0xcd70dd09 -//.word 0xe22cfdef -//.word 0x961c4be8 -//.word 0x496f4f25 -//.word 0xf38edc00 -//.word 0x1544a040 -//.word 0xf022fa99 -//.word 0xf6220b73 -//.word 0x7e8a10ed -//.word 0xbb13ef20 -//.word 0xef4b0fa8 -//.word 0xdc386d61 -//.word 0x7b3eed6e -//.word 0xf142ee80 -//.word 0xbf102054 -//.word 0x39fa9a7e -//.word 0x39c22766 -//.word 0x14bbe190 -//.word 0xcd2a0220 -//.word 0x89f2f69d -//.word 0x4371b5f5 -//.word 0xc1a54fc1 -//.word 0xc793c8cb -//.word 0x8ae927cd -//.word 0x67e2ca7c -//.word 0xd56afcc5 -//.word 0x9983ca57 -//.word 0x39e71261 -//.word 0xb2eedc9d -//.word 0x6db3ed8d -//.word 0x70729a05 -//.word 0xd235dbe9 -//.word 0x71b0a038 -//.word 0xe7696849 -//.word 0xb91c0f55 -//.word 0xd25de736 -//.word 0x307f0b6e -//.word 0xdeb5f06b -//.word 0x22773d0a -//.word 0xf727dd59 -//.word 0xbdf552a1 -//.word 0x30004ca4 -//.word 0x97bd7a23 -//.word 0x3d9da0a3 -//.word 0x25eaea71 -//.word 0xfaf280e4 -//.word 0x45685ae2 -//.word 0xe30756a5 -//.word 0xb57887bf -//.word 0x9976d05c -//.word 0x9930b2c8 -//.word 0x63ef6331 -//.word 0xf9f820ad -//.word 0xaab4c37f -//.word 0x410e9896 -//.word 0x7c1d6d56 -//.word 0xc003e89b -//.word 0x0a151efb -//.word 0x293c604c -//.word 0x2b9a5866 -//.word 0x1571562a -//.word 0xd741e4c4 -//.word 0x7e31a02c -//.word 0xacb04bf3 -//.word 0x455c1d3c -//.word 0x6c235b09 -//.word 0xaea82cb8 -//.word 0x7ce8a9cd -//.word 0xdf1d33f1 -//.word 0x67e3093b -//.word 0x659919af -//.word 0x590a1704 -//.word 0xae4ccdab -//.word 0xa5e9b20c -//.word 0x903dbd13 -//.word 0x401f7beb -//.word 0xc0c46009 -//.word 0x44df5b6d -//.word 0x5c0dac24 -//.word 0x6d71fa12 -//.word 0x629ba0ee -//.word 0x9faf498e -//.word 0x36c3bc65 -//.word 0x5e88f94a -//.word 0x212d847a -//.word 0x548001e1 -//.word 0xcc570195 -//.word 0xcf2e1ca4 -//.word 0xc911400f -//.word 0x40bd4816 -//.word 0x0a02d0b6 -//.word 0xbe6b4871 -//.word 0x6821484d -//.word 0x810d231f -//.word 0x1e3dbf09 -//.word 0x6789a442 -//.word 0x4b765215 -//.word 0x725ad82d -//.word 0x73c1a20f -//.word 0x481093e8 -//.word 0xff685489 -//.word 0xb1cdebb0 -//.word 0xb8888f89 -//.word 0x1dc9ba74 -//.word 0x50918109 -//.word 0x1ccf2159 -//.word 0xd9cada77 -//.word 0xe4be0038 -//.word 0x4cca4f36 -//.word 0xce097f1b -//.word 0x0400181c -//.word 0xd93888c3 -//.word 0x402b72f2 -//.word 0x26654a25 -//.word 0xa4e31ff7 -//.word 0x7abfb7e8 -//.word 0xb90fe15d -//.word 0xbf0a07e8 -//.word 0x686c03ca -//.word 0x831c33b6 -//.word 0x830cd0d8 -//.word 0x77617b16 -//.word 0x3dd51996 -//.word 0xf259e180 -//.word 0xacfeb305 -//.word 0x6c15aca0 -//.word 0x4e95f79b -//.word 0x03bee6d6 -//.word 0x81fc41c4 -//.word 0xf90edeb6 -//.word 0x0a67715c -//.word 0x34d5a688 -//.word 0x8f606d36 -//.word 0xbd7595ca -//.word 0x1d449d98 -//.word 0x4166c7a9 -//.word 0xa3c36dbc -//.word 0x93b3988c -//.word 0x7463cf51 -//.word 0x287b2d89 -//.word 0xc9fdb7f8 -//.word 0x9a70ecee -//.word 0x3d3f9dc8 -//.word 0x265cfeb9 -//.word 0x4f28fecb -//.word 0x2d97d420 -//.word 0xe48fda7e -//.word 0xb7929f0b -//.word 0xc29d3754 -//.word 0xeb50d694 -//.word 0x164e9e34 -//.word 0x98e7b48e -//.word 0xeef599f6 -//.word 0xb003b8fb -//.word 0xc0b53bea -//.word 0xc7642394 -//.word 0xe2089851 -//.word 0x985b7d45 -//.word 0x103b48e2 -//.word 0x805011ae -//.word 0xe9f0e847 -//.word 0x023f6ca4 -//.word 0x719b9a9d -//.word 0x4137e2ae -//.word 0x910580f8 -//.word 0x89da0988 -//.word 0x93cd44dc -//.word 0xc7e03ca3 -//.word 0xa6e293c5 -//.word 0x0c9319a3 -//.word 0x600a9da0 -//.word 0x0e5404e0 -//.word 0x375e9850 -//.word 0xa714a2e6 -//.word 0x07cb3a2a -//.word 0x53dc5ef5 -//.word 0x8f924278 -//.word 0xb647e781 -//.word 0xf4c9effa -//.word 0x1403b0b2 -//.word 0x3cd98761 -//.word 0xd8536ee6 -//.word 0xd4fed1d2 -//.word 0x0e8f9e2a -//.word 0x0bca9c69 -//.word 0xe9a2fdc5 -//.word 0x94a236b3 -//.word 0x3d8b0ead -//.word 0x083ff533 -//.word 0x05dd9810 -//.word 0x622eb2de -//.word 0xdf4025cc -//.word 0x8150499f -//.word 0x8bed84f7 -//.word 0xaa5b1bd4 -//.word 0x70364758 -//.word 0x03578ccf -//.word 0x17fc46ec -//.word 0x19228555 -//.word 0xad361a63 -//.word 0x5bedf222 -//.word 0x8571a3a0 -//.word 0x9dbd4564 -//.word 0x954a833c -//.word 0x96ebf13c -//.word 0xf4f5a103 -//.word 0x62a4f140 -//.word 0x62baa675 -//.word 0x00693ffb -//.word 0xc0738347 -//.word 0xd5905d6b -//.word 0x9310e9df -//.word 0x27c1cf82 -//.word 0x8613d0dc -//.word 0xa37a9ea6 -//.word 0xe514f18c -//.word 0xd88cd731 -//.word 0x233e4b74 -//.word 0xba9c0af2 -//.word 0x54d0a2cb -//.word 0x20a3ccaa -//.word 0xb39dfbff -//.word 0x456d358f -//.word 0x1e8c222f -//.word 0x4b1e63cc -//.word 0x951924af -//.word 0xb4a8f5ff -//.word 0xbfd2d588 -//.word 0xe75790ba -//.word 0x65da4cf5 -//.word 0xb1455e04 -//.word 0xf56a62e7 -//.word 0xc1e68ad5 -//.word 0x004b3681 -//.word 0x2b7ec59d -//.word 0xbc5dab9c -//.word 0xe6a5c4bd -//.word 0x8313e945 -//.word 0x4ecac00b -//.word 0x52f5d83a -//.word 0xa2adf553 -//.word 0x4b1da871 -//.word 0x87e423d1 -//.word 0x33ba4c91 -//.word 0x835710b8 -//.word 0xf591fa77 -//.word 0x83c404af -//.word 0x1d76adb2 -//.word 0x563b4b4e -//.word 0x5ed7a308 -//.word 0x30a3b7a5 -//.word 0x0c32dfef -//.word 0x28331bb5 -//.word 0xa399a814 -//.word 0xbafad1f5 -//.word 0x3e3508d7 -//.word 0x455835cf -//.word 0x21c14ecc -//.word 0x8e832820 -//.word 0x2f0b8d3c -//.word 0x3c038ebb -//.word 0x75761aa3 -//.word 0x5a35d0e7 -//.word 0x9d7a1230 -//.word 0xd8cc5bdc -//.word 0x7c22d247 -//.word 0x094b1f4a -//.word 0x858d7d02 -//.word 0x278d10d3 -//.word 0x536e7aac -//.word 0xcb3da98c -//.word 0x238df245 -//.word 0x755e6480 -//.word 0x57445601 -//.word 0x0ac5432c -//.word 0xf402d8c8 -//.word 0x509a4a04 -//.word 0x25cbedb7 -//.word 0x74da03ec -//.word 0xb6b5d19e -//.word 0x86d8f9c0 -//.word 0x9a6d0381 -//.word 0xf7b73dcd -//.word 0x65b0c517 -//.word 0x21f1e456 -//.word 0xd3d39d4d -//.word 0xbfd48610 -//.word 0x3f3cd7c4 -//.word 0x7100c1a6 -//.word 0x2de6014f -//.word 0x3aeab436 -//.word 0xc1e06d76 -//.word 0x015c85d1 -//.word 0x45cfb2f5 -//.word 0x13f2dbff -//.word 0xa7682b3e -//.word 0xa09f6539 -//.word 0xf8f777f3 -//.word 0x3926516d -//.word 0xeedbf76d -//.word 0x58a1d57e -//.word 0x63065438 -//.word 0xd8fdaac1 -//.word 0xd482f694 -//.word 0x797c8c81 -//.word 0xe3e78df5 -//.word 0x5e32bc7c -//.word 0xd6e68c84 -//.word 0x8f897e64 -//.word 0x16c2a99d -//.word 0x77be9a5f -//.word 0xb0d15f4f -//.word 0x6661df87 -//.word 0xd7006dde -//.word 0x10d89c6a -//.word 0x5f4c5444 -//.word 0x0cdc258b -//.word 0x4449dcac -//.word 0x56fa54e0 -//.word 0x229f8ff6 -//.word 0xcd140552 -//.word 0xba883c36 -//.word 0xb6de9940 -//.word 0x73537634 -//.word 0x386275fc -//.word 0xd6e513ed -//.word 0xde7c804c -//.word 0x1132ae11 -//.word 0x185ea7ea -//.word 0x76c82583 -//.word 0xba0d5c05 -//.word 0xf9451bdd -//.word 0x7be213be -//.word 0xb5db76e9 -//.word 0x770bc5ac -//.word 0x67d4e328 -//.word 0xae076d58 -//.word 0xf1084e4f -//.word 0x832d8dc1 -//.word 0xd9686ac5 -//.word 0x3e26aad9 -//.word 0xc7762f27 -//.word 0x8a6ecb07 -//.word 0x0bca56c4 -//.word 0xf7d7fea3 -//.word 0x1590df21 -//.word 0x7906d47d -//.word 0xfb058c76 -//.word 0xe7f4e056 -//.word 0xf6fd632f -//.word 0x7d6e3b65 -//.word 0xe55f306c -//.word 0x5b9603d3 -//.word 0xc8a70182 -//.word 0x045fd740 -//.word 0x4763a878 -//.word 0xe0155d3c -//.word 0x29b73d8a -//.word 0xbad3bdce -//.word 0xddda99a9 -//.word 0x420b23f1 -//.word 0xf496dbf9 -//.word 0x8c024112 -//.word 0xa5cce751 -//.word 0x8f51ca93 -//.word 0x48ede2bf -//.word 0xa765f84b -//.word 0xdb82b802 -//.word 0x14ff0704 -//.word 0x80a6970e -//.word 0x79b5b8fb -//.word 0xfd86718b -//.word 0x5e6fcf64 -//.word 0x3ae87d56 -//.word 0xaeeb95e3 -//.word 0xc7a1b6ff -//.word 0x393a5714 -//.word 0x541c5a49 -//.word 0x3341e404 -//.word 0x37da6dad -//.word 0xb43913b6 -//.word 0xe9ed34d8 -//.word 0x362f3b9f -//.word 0x897dba28 -//.word 0x1a84ba2a -//.word 0x58434f33 -//.word 0x226e6f34 -//.word 0x3b100340 -//.word 0xf8753f91 -//.word 0x3c472fcc -//.word 0xa6f79385 -//.word 0x095eed06 -//.word 0x1da5d84c -//.word 0x74629b53 -//.word 0xaf03fe94 -//.word 0xf1705dcb -//.word 0x94ecfafd -//.word 0x1b3c97ba -//.word 0x680c45a0 -//.word 0x308e7720 -//.word 0xab645a85 -//.word 0x90c06931 -//.word 0x40ca3c2a -//.word 0x4142a0d6 -//.word 0xef66ed03 -//.word 0x6e16942a -//.word 0xe336f8f5 -//.word 0xe4547ffe -//.word 0x2d8ae8da -//.word 0x94a6df56 -//.word 0x3f89ce00 -//.word 0x14cdf7ea -//.word 0x71abc0aa -//.word 0x1d1b4da5 -//.word 0x7f3c548e -//.word 0x0ef72d29 -//.word 0x09df2955 -//.word 0x685c2549 -//.word 0x12095f1e -//.word 0x505a888e -//.word 0x82821afb -//.word 0x1194ebb2 -//.word 0xa4e80372 -//.word 0x97c0aa28 -//.word 0xa92bc6fd -//.word 0xf42a6492 -//.word 0x2312958a -//.word 0xdf317b4a -//.word 0x8ab4a3fc -//.word 0x30c895da -//.word 0xba00aaa9 -//.word 0x65f71e83 -//.word 0x733666da -//.word 0x2158c4ba -//.word 0xd86c184e -//.word 0xa79af9a6 -//.word 0xf10a04b7 -//.word 0x630174a4 -//.word 0x294df43c -//.word 0x62e4b1c3 -//.word 0xd1c8b2f5 -//.word 0xd52d6c48 -//.word 0x9bde9172 -//.word 0x92dd2a2b -//.word 0x1f49e534 -//.word 0x9385b098 -//.word 0x5a978632 -//.word 0x74ce896f -//.word 0x2aa85255 -//.word 0xf9f285c4 -//.word 0xd331a8fc -//.word 0x87413560 -//.word 0x7d3ced7a -//.word 0xa69e703e -//.word 0xb3a60b93 -//.word 0x85ffd10f -//.word 0xe59fed02 -//.word 0x76f036b7 -//.word 0xe72d04f6 -//.word 0x6d0f42cd -//.word 0x71aac591 -//.word 0x8691dc1f -//.word 0x9d412967 -//.word 0x7cbdaf2c -//.word 0x6c752b05 -//.word 0x326ca8a8 -//.word 0x419a4e67 -//.word 0x2e907bfb -//.word 0x645a1581 -//.word 0x19a91ec2 -//.word 0x813288b7 -//.word 0x41514b4d -//.word 0x26f2b665 -//.word 0x17b1021f -//.word 0x48402d58 -//.word 0xb1090671 -//.word 0xbf158452 -//.word 0x492d5baf -//.word 0xc53fd18a -//.word 0xbc03cefa -//.word 0x7bdd332a -//.word 0x0c066da4 -//.word 0x64e74ad0 -//.word 0xdec50bb7 -//.word 0xe8a3ba0d -//.word 0xfc64be6f -//.word 0xd331ace9 -//.word 0xd51a60bb -//.word 0xd3004d5d -//.word 0xf8b211c0 -//.word 0xfd564cd7 -//.word 0x9d0bb356 -//.word 0x49cc60ba -//.word 0x1c976c89 -//.word 0x11cfc0db -//.word 0x74e02819 -//.word 0x9621aa05 -//.word 0xc5fe15fa -//.word 0x7b56dc75 -//.word 0xd62225d5 -//.word 0x48581e5f -//.word 0x900f9085 -//.word 0xe9e3b668 -//.word 0x819b4f9b -//.word 0x2c09f22a -//.word 0x5a32a2db -//.word 0x47afa2b3 -//.word 0x71538abc -//.word 0x4f0e9b06 -//.word 0x401150ec -//.word 0xc2333598 -//.word 0xe494fcca -//.word 0xfe80ced4 -//.word 0x9f96dfea -//.word 0xc7294598 -//.word 0x56e60a94 -//.word 0xc5b780b6 -//.word 0x14e8d445 -//.word 0x0389e674 -//.word 0x8513582c -//.word 0x724ee60c -//.word 0x7c71f5af -//.word 0x648b6e2d -//.word 0x6e23cce4 -//.word 0x121b7478 -//.word 0xf4db4518 -//.word 0x16ab7103 -//.word 0x4c5f8b4b -//.word 0xf13ae1d9 -//.word 0xd90d0bb2 -//.word 0x869fc479 -//.word 0x9f51f934 -//.word 0x9d022053 -//.word 0xc831cbee -//.word 0x62617d4e -//.word 0x22c2bcaf -//.word 0xe40d6744 -//.word 0x9eb04a7c -//.word 0x962bf084 -//.word 0xd2bab80d -//.word 0xd0342b4f -//.word 0x78338d4d -//.word 0x4f75b25b -//.word 0xed8214de -//.word 0xb18f2254 -//.word 0xb3a3da94 -//.word 0xfaf89956 -//.word 0xf0a432f5 -//.word 0x12783e74 -//.word 0xec29b4c0 -//.word 0x45adba34 -//.word 0x97e8ba62 -//.word 0xc288b711 -//.word 0x002ee282 -//.word 0x1cce68f8 -//.word 0xdf588f76 -//.word 0xcc9801cb -//.word 0x0d5b67cc -//.word 0xacd33ae1 -//.word 0x063cd6c3 -//.word 0x7dc0d183 -//.word 0x6e988acf -//.word 0x63750571 -//.word 0x891ef618 -//.word 0x645a1b5b -//.word 0xc110cffb -//.word 0xecaddd68 -//.word 0x24c69287 -//.word 0x4cff16b3 -//.word 0xe32bfc02 -//.word 0x36b417c9 -//.word 0xd43d8f62 -//.word 0x4387352c -//.word 0xf19114d4 -//.word 0x6d0448d3 -//.word 0xd7cd1438 -//.word 0x960c2ea8 -//.word 0x482d5da3 -//.word 0xff544608 -//.word 0xaaff83dc -//.word 0xd1e7f647 -//.word 0x86275ddf -//.word 0x989f262a -//.word 0x099b845d -//.word 0xc2b0c26a -//.word 0x86e7d83a -//.word 0x251e3c37 -//.word 0xf2aafa0e -//.word 0x764107b3 -//.word 0x6618d2a5 -//.word 0xd3481d73 -//.word 0xa1760b7f -//.word 0x3ab37a02 -//.word 0x83a19250 -//.word 0x10d79e5e -//.word 0x94871b81 -//.word 0x9b5e0f78 -//.word 0x7bac9dad -//.word 0x87c5d5b8 -//.word 0x87a7d125 -//.word 0x65ddfd77 -//.word 0x29a3b66c -//.word 0x274a1783 -//.word 0x77de0fbc -//.word 0xa607b79f -//.word 0xab2de37f -//.word 0x1ddff800 -//.word 0xa376fdd7 -//.word 0xabf5f4d1 -//.word 0x5f346a17 -//.word 0xd43e4db0 -//.word 0x85f7fe47 -//.word 0x0102a72f -//.word 0xe0e1cfa4 -//.word 0xfb5e2b54 -//.word 0xdd2ab71e -//.word 0x74c50619 -//.word 0x0c9dd6d8 -//.word 0x7f7ae8ec -//.word 0xa5190fab -//.word 0x12178630 -//.word 0x011286a3 -//.word 0x8b0a18bb -//.word 0x1d0d2980 -//.word 0x2813dc56 -//.word 0x1a272437 -//.word 0x8ec79140 -//.word 0xbf8e6a6f -//.word 0x4310fdab -//.word 0xf6063304 -//.word 0x34ab673d -//.word 0x4b657887 -//.word 0x2fa81d90 -//.word 0x701779bc -//.word 0x6aedf0b2 -//.word 0xbc9c381b -//.word 0xfbb4b3a6 -//.word 0xa705fc50 -//.word 0x5d08c0e2 -//.word 0x4f7bcfbb -//.word 0xf24c72cf -//.word 0xf6b800f0 -//.word 0x7bb4ac4d -//.word 0x828ca138 -//.word 0xa1ca512c -//.word 0xfc59090e -//.word 0x70eac9b3 -//.word 0x119754a3 -//.word 0xd7c6831c -//.word 0x9451de5a -//.word 0x29e46d16 -//.word 0xfaa6cc4d -//.word 0x9f1b7e42 -//.word 0xdd4983c6 -//.word 0xd4192db7 -//.word 0x79012fc7 -//.word 0x47e0f77e -//.word 0x32293e83 -//.word 0xdd44dd17 -//.word 0x0c31e2e2 -//.word 0x5c6fe3f2 -//.word 0x321c9201 -//.word 0xf15d92f6 -//.word 0x700089af -//.word 0xab6077fe -//.word 0xb88946f1 -//.word 0xfd9da257 -//.word 0xa1770a7f -//.word 0x408d2743 -//.word 0xe31b5d45 -//.word 0x2f7ea179 -//.word 0xdcdd8ae4 -//.word 0x690faaa3 -//.word 0x0eb91e2e -//.word 0xf3b764de -//.word 0x9fbe6dad -//.word 0xb33ff33e -//.word 0xd88e0d1d -//.word 0xf6430147 -//.word 0xa7e159ed -//.word 0xebb53975 -//.word 0x1d01efc2 -//.word 0x255accb5 -//.word 0xf04f32f3 -//.word 0x1d4befe9 -//.word 0xf9bdc90e -//.word 0xae755a68 -//.word 0xb7511f52 -//.word 0x971acb7c -//.word 0xcba9e133 -//.word 0xfd4e81e3 -//.word 0x7a7282da -//.word 0xe67ac24e -//.word 0x2fefbaa2 -//.word 0xbfdc56e5 -//.word 0xf678039c -//.word 0xd70509c1 -//.word 0x01f81b0b -//.word 0xe15a2c70 -//.word 0x276e85e9 -//.word 0x76941575 -//.word 0x606d0860 -//.word 0x91409bc5 -//.word 0x4a9d2e52 -//.word 0x12409a4b -//.word 0xa837c6d1 -//.word 0x3b487565 -//.word 0xdd8d62a8 -//.word 0x36618f64 -//.word 0x7580dad0 -//.word 0x8c69d110 -//.word 0x9d07c7fc -//.word 0xaf912822 -//.word 0xa6af090e -//.word 0x72de03c9 -//.word 0x8615429f -//.word 0x8ca9d925 -//.word 0x576e587b -//.word 0x191fa1cf -//.word 0xd6fff722 -//.word 0x18c1584f -//.word 0xe5a50d49 -//.word 0xeee57fa4 -//.word 0x094f4c57 -//.word 0xe1339ac0 -//.word 0xec7face8 -//.word 0x9e29b309 -//.word 0xddcde64d -//.word 0xb498d4d9 -//.word 0x4b64f90a -//.word 0x172490fe -//.word 0x4e83a957 -//.word 0x9ec87b3b -//.word 0x1efdfb9f -//.word 0x8550aec6 -//.word 0x9ab9bb04 -//.word 0xebdd44c8 -//.word 0xc233f6da -//.word 0x5565dfe0 -//.word 0x3df98027 -//.word 0x293024a0 -//.word 0xd42e7029 -//.word 0x345c3a0e -//.word 0xf50b9fd0 -//.word 0x255a4f25 -//.word 0x31592c3f -//.word 0x106e1451 -//.word 0xbef8fa50 -//.word 0xec333cf7 -//.word 0xf65c300d -//.word 0x151500ea -//.word 0xd60ab938 -//.word 0xcad59ef7 -//.word 0x7f1fc2c3 -//.word 0xb008d65a -//.word 0xb9c93f59 -//.word 0x4d986c46 -//.word 0x6bcd66d3 -//.word 0x8e42a861 -//.word 0x25ff32c4 -//.word 0x4217d946 -//.word 0x96cde1ee -//.word 0x9dfbcd02 -//.word 0x16b576ca -//.word 0xb6295b97 -//.word 0x1dc93804 -//.word 0x09adda7c -//.word 0xca3231fc -//.word 0xf6e8a71a -//.word 0x5dabb047 -//.word 0x3f0fa251 -//.word 0xbd02c82c -//.word 0x8eacb1f1 -//.word 0xf39ace27 -//.word 0xed1c3d42 -//.word 0xadebdf69 -//.word 0x4c0fb07c -//.word 0xbc005856 -//.word 0xff0cfd4f -//.word 0x96f85c05 -//.word 0x3dea185d -//.word 0xd58751c4 -//.word 0xa25879bb -//.word 0xb6726392 -//.word 0xad569d73 -//.word 0x9b1600a3 -//.word 0x43b98505 -//.word 0x8ae15be0 -//.word 0x2bab36e1 -//.word 0xabd7e964 -//.word 0x902937ef -//.word 0xce0ee6ff -//.word 0x82831608 -//.word 0xe233d1b7 -//.word 0x74dfe37a -//.word 0x7f03ec42 -//.word 0xc0b7b388 -//.word 0x5dd3bd8e -//.word 0x1f561fe7 -//.word 0xdb099039 -//.word 0x315fc242 -//.word 0x79a0f319 -//.word 0xfb46bfb6 -//.word 0x5ea838b5 -//.word 0x64d53857 -//.word 0xd4c3f6ca -//.word 0xb7a9d8aa -//.word 0xc6a988c7 -//.word 0x24b24a29 -//.word 0x49a58d51 -//.word 0x3eb6bfc2 -//.word 0x101666c0 -//.word 0x7fcf6d58 -//.word 0xf6efbba0 -//.word 0xc0e80b40 -//.word 0x7837f731 -//.word 0xc14455c5 -//.word 0x3889c7e8 -//.word 0xa7f78ea5 -//.word 0x7c959fec -//.word 0x796bf992 -//.word 0xac9e3599 -//.word 0xa2dc5fb2 -//.word 0xd8fa0400 -//.word 0x72dc8c1f -//.word 0x2f96ca65 -//.word 0x9dd0d267 -//.word 0x896f0bbf -//.word 0xba72850d -//.word 0xdf198c3c -//.word 0xc54d7d07 -//.word 0xcd3cd8bb -//.word 0x9e44973e -//.word 0x1712be50 -//.word 0x870b3411 -//.word 0x21ead1c3 -//.word 0xaaabb8d2 -//.word 0x75a9e711 -//.word 0x91030c47 -//.word 0x41439aea -//.word 0xac421d2a -//.word 0xd646cb32 -//.word 0xcf6e5baa -//.word 0x2b501a80 -//.word 0xb1e03be8 -//.word 0x58946ea1 -//.word 0x6fc5b57a -//.word 0x1b597316 -//.word 0x069fc6ec -//.word 0x567a1791 -//.word 0xdcc2f03a -//.word 0x8ee70d7d -//.word 0x38d7b557 -//.word 0x6e224b73 -//.word 0xc55c20a9 -//.word 0x43c48bc6 -//.word 0x13223c8b -//.word 0x7df6cdf8 -//.word 0x16ce9aca -//.word 0x34f8d342 -//.word 0xa559cf28 -//.word 0xa19da310 -//.word 0xfc91f4dc -//.word 0xa0cc0982 -//.word 0x3b95240f -//.word 0x350113ec -//.word 0xe55c0260 -//.word 0x04ca9357 -//.word 0x622e3162 -//.word 0xd74ba1fe -//.word 0x7d2ad919 -//.word 0x1cbb16d2 -//.word 0xe6be2981 -//.word 0x65e411f7 -//.word 0xb132cf07 -//.word 0x80000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x0000E2C0 -//// expected output -//.word 0x3844eff6 -//.word 0xb7cc4eb3 -//.word 0xdaab9018 -//.word 0x1ccb8947 -//.word 0x842e8c70 -//.word 0x2858e590 -//.word 0x89f96dd9 -//.word 0x5600b866 -//.word 0xae647f9c -//.word 0xd9213d72 -//.word 0x6b4fca63 -//.word 0x6e6166a2 -//.word 0x088e2be0 -//.word 0xc27154c2 -//.word 0x8732faf3 -//.word 0x60e30e8a -//// SHA512LongMsgvector_73 -//// vector length -//.word 0x0000E5D8 -//// input message -//.word 0x7caec9d1 -//.word 0x5fb000b6 -//.word 0x5233a196 -//.word 0xa792aa48 -//.word 0x6deec990 -//.word 0xe7d172e5 -//.word 0x3d112e77 -//.word 0x70f83670 -//.word 0x93a1407a -//.word 0x39a59982 -//.word 0x2af874bc -//.word 0x5a0d82e8 -//.word 0x1b41c2d3 -//.word 0x91769b20 -//.word 0x66fe2848 -//.word 0xc0bcd3e0 -//.word 0x7085251b -//.word 0x6dccdc8f -//.word 0x807f3e3c -//.word 0x402caeca -//.word 0x41687d12 -//.word 0x897102e0 -//.word 0x4312edf7 -//.word 0xb8c7d856 -//.word 0x7a221fba -//.word 0xe26df264 -//.word 0xbd91a81c -//.word 0x43375676 -//.word 0x492ca154 -//.word 0xb70ad0ac -//.word 0x3b15268c -//.word 0x3f636e5b -//.word 0x1940d761 -//.word 0x82d0028a -//.word 0x4af65a66 -//.word 0x4a75a475 -//.word 0x9955d6a2 -//.word 0x03892d0d -//.word 0xb6ce7a0d -//.word 0x3fd6bd76 -//.word 0xb5a6f417 -//.word 0x343d3587 -//.word 0x8d76fb22 -//.word 0x3c2fbe4e -//.word 0x9babc603 -//.word 0x5535408a -//.word 0x1c069284 -//.word 0x9f69ec2f -//.word 0xb61d1fe5 -//.word 0xe0fbb3e5 -//.word 0xf0d83356 -//.word 0x03adcc89 -//.word 0xb5f6177f -//.word 0x955732ab -//.word 0xd68515f8 -//.word 0x4764230e -//.word 0x856d00d1 -//.word 0x6e53a32b -//.word 0xdae6ac0c -//.word 0x8637f7af -//.word 0x51fd711e -//.word 0xab372af8 -//.word 0x4a13ac72 -//.word 0x1e0f8c9c -//.word 0x885e3ee6 -//.word 0xc78d2de2 -//.word 0xb3660b4b -//.word 0xad156647 -//.word 0xd6897de9 -//.word 0x7f1d51fa -//.word 0xe178fff9 -//.word 0x0eb14c60 -//.word 0x28b78229 -//.word 0xd1f17b91 -//.word 0xe221fb1c -//.word 0x608e43d9 -//.word 0xac62e2e7 -//.word 0xf951cf38 -//.word 0x037bb595 -//.word 0xff948ee2 -//.word 0xcd4273a4 -//.word 0x75c6b2c0 -//.word 0xd1df2285 -//.word 0x87ebb3ed -//.word 0x3b504920 -//.word 0x021acb3a -//.word 0x19e6764e -//.word 0xd7fe78ab -//.word 0xe0c5ba5e -//.word 0x9c56fdf8 -//.word 0xe7682891 -//.word 0x0a75e00c -//.word 0xea1b5a9d -//.word 0x80c26d89 -//.word 0x897fec2d -//.word 0x7f383242 -//.word 0xc709fe5f -//.word 0x2ce782bf -//.word 0x8c83b645 -//.word 0xd171f2bd -//.word 0x238abc65 -//.word 0x5d8fdfac -//.word 0xbd0fbd39 -//.word 0xdf8ae52f -//.word 0xecd6e8b0 -//.word 0x0fc269a0 -//.word 0x28fa74ab -//.word 0xc52a1189 -//.word 0x4e661880 -//.word 0x7fca462b -//.word 0x1b5d917b -//.word 0xdf3bb9fb -//.word 0xb5f42058 -//.word 0x2b2fdb20 -//.word 0x239309ca -//.word 0xcce763f7 -//.word 0xd17715f7 -//.word 0xd0bacd8f -//.word 0x0d3311f9 -//.word 0x6895d52d -//.word 0x8c2a4d5f -//.word 0x6a7500c9 -//.word 0xe6171eaa -//.word 0xcfef138f -//.word 0x15855cd1 -//.word 0x36a9995f -//.word 0xfa57e4bd -//.word 0x60de624d -//.word 0xd84117ce -//.word 0xb2deff22 -//.word 0xd74d5a54 -//.word 0xb78b47d9 -//.word 0x82589416 -//.word 0x9bddd523 -//.word 0x4a92b3cf -//.word 0xb15f87e4 -//.word 0x010228ac -//.word 0xedb000b3 -//.word 0x5fff66cf -//.word 0x6a03285e -//.word 0x81b766cf -//.word 0xe69fa764 -//.word 0x64ac2635 -//.word 0x41606d79 -//.word 0x6f322501 -//.word 0x02342d05 -//.word 0xe7f3e923 -//.word 0xd29fdda5 -//.word 0x786c7a03 -//.word 0xff3737a8 -//.word 0xb26de4f9 -//.word 0xfa293b94 -//.word 0x899cb9d5 -//.word 0xd9b2ac9f -//.word 0xd5f28c59 -//.word 0xd6a78e36 -//.word 0xd03d77ba -//.word 0xceedae7a -//.word 0x9b9d9623 -//.word 0xc2011abd -//.word 0xb9078a31 -//.word 0x5a72a509 -//.word 0x92c4f778 -//.word 0x5d62659a -//.word 0xf2f306fc -//.word 0x3a09345f -//.word 0x8703e3b9 -//.word 0x8332327d -//.word 0x673a401c -//.word 0x6dbb41cc -//.word 0x8731d188 -//.word 0x51198758 -//.word 0x4456ced2 -//.word 0x2dd2f0e1 -//.word 0xde6874c5 -//.word 0x2402aa5b -//.word 0xf9fe849f -//.word 0xfad7a76f -//.word 0x1b01c292 -//.word 0x99141ff8 -//.word 0x302d7843 -//.word 0x8f910b87 -//.word 0x0994f04e -//.word 0x8dbaabe0 -//.word 0xd81bfec1 -//.word 0xe90c017a -//.word 0xb5fb749c -//.word 0x1d9b5303 -//.word 0x1d42ab58 -//.word 0x468fadd9 -//.word 0x6e4f005d -//.word 0xa6a15c92 -//.word 0x6c59558a -//.word 0x22a37476 -//.word 0xbfe98cb1 -//.word 0xc5f64b00 -//.word 0x735b1018 -//.word 0x3b11fc60 -//.word 0x76614cf9 -//.word 0x5701e6fc -//.word 0x1d803102 -//.word 0x8de32aea -//.word 0xa091b5d6 -//.word 0x796c3077 -//.word 0x99414e8b -//.word 0x566223a3 -//.word 0x89917b2a -//.word 0x882070a3 -//.word 0x54573c32 -//.word 0x13164b5e -//.word 0xc0bb9515 -//.word 0x21462af0 -//.word 0xf9bc0eb9 -//.word 0x80c9482b -//.word 0x10a836f8 -//.word 0x21482311 -//.word 0x77a71b21 -//.word 0x9a82fe5a -//.word 0x8731d475 -//.word 0xa5cd60f4 -//.word 0xfa93f8ab -//.word 0x9f8d947e -//.word 0x716f246c -//.word 0x0abf27cd -//.word 0xf03879d7 -//.word 0x0b716c67 -//.word 0x5dba1bff -//.word 0xed46fb0a -//.word 0x0490b368 -//.word 0x9cf72e26 -//.word 0x16abee8d -//.word 0x2bcda35f -//.word 0x25d2fc5d -//.word 0x4f29bd0c -//.word 0xaa1d12b9 -//.word 0xe1fc22bb -//.word 0x7f79e8f8 -//.word 0x604f3eab -//.word 0x65273b64 -//.word 0x6cbcbf50 -//.word 0x803d4cba -//.word 0x4cf318d2 -//.word 0xd62360ad -//.word 0x6a36fe8e -//.word 0xd3173e64 -//.word 0xd2ddee93 -//.word 0xc8aab4f7 -//.word 0xb6d2a526 -//.word 0x674012f6 -//.word 0xec16a540 -//.word 0x4994ade3 -//.word 0x6e3bb70b -//.word 0x69325eb3 -//.word 0xd9e86468 -//.word 0xa6fb0150 -//.word 0xef597a6c -//.word 0x44a5f61a -//.word 0x16dc8ede -//.word 0x6b38a361 -//.word 0xd65474ba -//.word 0xa792efed -//.word 0x5fbac8b1 -//.word 0x67e3c977 -//.word 0x019769a7 -//.word 0x7e329f2d -//.word 0xb28bf834 -//.word 0xa5d6e831 -//.word 0x8bc95d24 -//.word 0xf6fe9a1b -//.word 0x4b9943f7 -//.word 0x722ab472 -//.word 0xd2d59761 -//.word 0x7db0b637 -//.word 0xa76c0dcb -//.word 0x5d38245b -//.word 0x74e29cd0 -//.word 0xbf3f0743 -//.word 0x85cefdc1 -//.word 0x31986c4b -//.word 0x4c5a2f21 -//.word 0xa9e6e241 -//.word 0xdfc7f52a -//.word 0xfc2400e5 -//.word 0x78e75646 -//.word 0x681ddd70 -//.word 0xf4a01d97 -//.word 0x0bf4960a -//.word 0x56705770 -//.word 0x6a9ecc51 -//.word 0x41e4d8d9 -//.word 0xeb6323d9 -//.word 0x811fb60f -//.word 0x5b60c5a7 -//.word 0x8259cb01 -//.word 0x6808ddb5 -//.word 0xd75d37d5 -//.word 0x289e1c72 -//.word 0xb50add61 -//.word 0x91bd373e -//.word 0x76d3e1b2 -//.word 0xfed066f2 -//.word 0x16403188 -//.word 0xb09ae656 -//.word 0xb96af9d8 -//.word 0x4baf79a9 -//.word 0x23822c49 -//.word 0x55f9e11d -//.word 0x3e4b02b7 -//.word 0xbb356958 -//.word 0x989c74b3 -//.word 0x4c735cf4 -//.word 0xe3dfc201 -//.word 0x3b998b00 -//.word 0x7395ee19 -//.word 0xa1e1cb7d -//.word 0xc3cf3fa7 -//.word 0xf95675e2 -//.word 0xf1b6bf0b -//.word 0xa25be598 -//.word 0x3d04bdd9 -//.word 0x6024fb7e -//.word 0x8d884b5a -//.word 0xdc3b9d66 -//.word 0xeca7c009 -//.word 0x1ffc3396 -//.word 0x07d63817 -//.word 0x1b1a2949 -//.word 0xaf200fe7 -//.word 0x2318712b -//.word 0x5aa66a93 -//.word 0x6dd0fee1 -//.word 0xa11aae65 -//.word 0x97ef4a7e -//.word 0xc343075f -//.word 0x1f77d20f -//.word 0x217de3b3 -//.word 0xea3c9410 -//.word 0xc036744c -//.word 0xbe6897f4 -//.word 0xca713144 -//.word 0xc8f763a2 -//.word 0x0d47556b -//.word 0x173b85f2 -//.word 0x7b615fc6 -//.word 0x1e590d34 -//.word 0xa87f900d -//.word 0x36cb10aa -//.word 0x50f5702c -//.word 0x1adc2608 -//.word 0xce284ac4 -//.word 0x692eecfb -//.word 0xa515aba7 -//.word 0x283783a0 -//.word 0xfbcae75f -//.word 0x3dc01008 -//.word 0x19eb94a8 -//.word 0xf5653aba -//.word 0xec2f0df1 -//.word 0x7f18af31 -//.word 0x87e1f0de -//.word 0x6e9e9f5a -//.word 0x9f5fa1c9 -//.word 0x3b103f18 -//.word 0x0e9ec43d -//.word 0xc15c48c0 -//.word 0x51a4c77a -//.word 0xc0c1769d -//.word 0x0a0c56f4 -//.word 0x5a56096c -//.word 0x7e86e5d4 -//.word 0x988347e1 -//.word 0x17552975 -//.word 0xe687f720 -//.word 0xe3cf9fe8 -//.word 0x93f1e845 -//.word 0x14e00470 -//.word 0x532668dd -//.word 0x7f87db06 -//.word 0xbde1cd6b -//.word 0x1d57ebd7 -//.word 0xccaef0e4 -//.word 0x8cf7bec1 -//.word 0x626fad33 -//.word 0x8ea323da -//.word 0xc0d865b6 -//.word 0x89a9acea -//.word 0x10f27cbf -//.word 0x06ed31eb -//.word 0xdc9bdb14 -//.word 0x33664b90 -//.word 0x94046e6f -//.word 0x619edabb -//.word 0x0b32a7fe -//.word 0x86368005 -//.word 0xfa7ef9e4 -//.word 0xbc5f233a -//.word 0x7c155fb6 -//.word 0xc0626fda -//.word 0x9178d3ff -//.word 0x7319529a -//.word 0x9bfdd7bd -//.word 0x5d747ee1 -//.word 0xe44cefe2 -//.word 0x25f5eb4b -//.word 0x15e324d4 -//.word 0x1a345229 -//.word 0xc09383ed -//.word 0xae5cb2ff -//.word 0xd8009cfc -//.word 0xf6accf05 -//.word 0x342504c2 -//.word 0x2bf7aea6 -//.word 0x10ced375 -//.word 0x2b241b04 -//.word 0x8b1c2741 -//.word 0xf9ae2372 -//.word 0x2a059fc2 -//.word 0x39259af9 -//.word 0x54d1e08b -//.word 0xb5ac97d4 -//.word 0xd39e14a2 -//.word 0xda79f3f4 -//.word 0x59dd6601 -//.word 0x3b59cd7c -//.word 0xf9d28717 -//.word 0x0e290846 -//.word 0xaa182c45 -//.word 0xaa5dcb5c -//.word 0xc81b8e62 -//.word 0x0f7d0180 -//.word 0x939ce937 -//.word 0x5ea3d7a4 -//.word 0xad31fd03 -//.word 0x5dfe4173 -//.word 0xa0c290f8 -//.word 0xf45275c6 -//.word 0x560ceabd -//.word 0xb2766e30 -//.word 0x9f2257ea -//.word 0x49d56a73 -//.word 0xaee7a98f -//.word 0x0eed6c08 -//.word 0x9c96b3ad -//.word 0x7ad3bb9b -//.word 0xe43bcfbb -//.word 0xacad618c -//.word 0xe6375923 -//.word 0xe436ad70 -//.word 0x65bf32c2 -//.word 0x093eb28d -//.word 0x085d3e6c -//.word 0x2428c562 -//.word 0xdc6ee665 -//.word 0xe36a031d -//.word 0xd0a297e9 -//.word 0x1710c923 -//.word 0x388041a5 -//.word 0x36393a8b -//.word 0x4bdfd83b -//.word 0xda98bca3 -//.word 0xa56ed7c2 -//.word 0x40f57b6a -//.word 0xc62db844 -//.word 0xcaa9e514 -//.word 0x90f17d3e -//.word 0x7d262d8a -//.word 0xcde42a24 -//.word 0x846cc8e7 -//.word 0xa70349da -//.word 0xab95f2fb -//.word 0x2e9e653c -//.word 0xe54b2acc -//.word 0xd6dc8f97 -//.word 0xc74cb210 -//.word 0xf634dc2e -//.word 0x0aed10b4 -//.word 0x4af4e4b6 -//.word 0x0d939059 -//.word 0x71be45da -//.word 0x503cc0d2 -//.word 0x70071eb8 -//.word 0xfaf4f2a7 -//.word 0x2e969561 -//.word 0x5460bd95 -//.word 0xf60b515d -//.word 0x4c377c0b -//.word 0xf8550125 -//.word 0xf4c4ceae -//.word 0xc83ad3a7 -//.word 0x006614d6 -//.word 0xddd4fdc6 -//.word 0x4b10f60f -//.word 0x130e38d7 -//.word 0x52c9df99 -//.word 0x2a2b4026 -//.word 0xb72d7ce9 -//.word 0x443f566e -//.word 0xbfea4126 -//.word 0x6bb4bd64 -//.word 0xd544e4ac -//.word 0x09c6402d -//.word 0x0591e08c -//.word 0x6e07abe3 -//.word 0x82bdf40a -//.word 0x4edd4e15 -//.word 0x21c8a11d -//.word 0x40ff7d44 -//.word 0xdb43aff3 -//.word 0x40fb1266 -//.word 0x4fd7a86b -//.word 0x2eb3e966 -//.word 0x3ebe5b99 -//.word 0x4ddb63a2 -//.word 0x0d475b45 -//.word 0xc47ce46c -//.word 0x46567e6c -//.word 0x2175568a -//.word 0x17e25ebe -//.word 0xd1f5a3b7 -//.word 0xd176dc1e -//.word 0xa9023e1f -//.word 0x6ab09826 -//.word 0x60f59be6 -//.word 0xfcc579a0 -//.word 0x12fbb3a2 -//.word 0x45fb2b0e -//.word 0xbf9681dc -//.word 0x252e9c22 -//.word 0xc91a8793 -//.word 0x224b7f46 -//.word 0x7a304aba -//.word 0xe7d8ca16 -//.word 0x7c57d1b5 -//.word 0xc06a37e1 -//.word 0x5f5e2adf -//.word 0x202dc62d -//.word 0x17ebe507 -//.word 0x1c60392f -//.word 0x7cf798ee -//.word 0xeed79656 -//.word 0xc84f59cb -//.word 0x7277a9c2 -//.word 0x1b1447c7 -//.word 0xacbd80c5 -//.word 0xfa3c0182 -//.word 0x4037ed69 -//.word 0xcc102d8c -//.word 0xf80908e9 -//.word 0x5cacf3ec -//.word 0x426aaa36 -//.word 0x5a827f9d -//.word 0xb024f274 -//.word 0xdad6830c -//.word 0x7618c47a -//.word 0xd443b29b -//.word 0xefb74556 -//.word 0xa2354621 -//.word 0x188a61c7 -//.word 0x856e7b68 -//.word 0x13ab46c1 -//.word 0x208212ad -//.word 0xa64ae6ec -//.word 0xfa5acf24 -//.word 0xba297825 -//.word 0x00b4fb71 -//.word 0xdc20f7fc -//.word 0x02a1e330 -//.word 0xbf9aa134 -//.word 0x3206566e -//.word 0xb8167a47 -//.word 0xa81b2b2e -//.word 0x41a7c7df -//.word 0xe0efb9e5 -//.word 0x7674935d -//.word 0x3ae35efe -//.word 0x9b392d56 -//.word 0x792af956 -//.word 0x94c4a811 -//.word 0x45506fc1 -//.word 0x6c795a0b -//.word 0xa9b02984 -//.word 0xcfce5e73 -//.word 0x95fb94d9 -//.word 0x8fcf12ae -//.word 0x5db8a06e -//.word 0x239c9ad4 -//.word 0x39bf42e5 -//.word 0x23e65a31 -//.word 0xc3bdf356 -//.word 0xcd7680c5 -//.word 0x7cb32ec9 -//.word 0x83a678c5 -//.word 0x4776f5bd -//.word 0x4be57517 -//.word 0xeb314da3 -//.word 0x4e37efda -//.word 0x96debe63 -//.word 0x59b320dc -//.word 0x55d1d4d6 -//.word 0x5f048621 -//.word 0x9d2ea04b -//.word 0xf5e96463 -//.word 0xc56d3802 -//.word 0xd5b5408d -//.word 0x8add32b4 -//.word 0x5ccf663e -//.word 0x891e2d09 -//.word 0x0b32644c -//.word 0xc8a64920 -//.word 0x0aee8d3f -//.word 0x2e3daa0b -//.word 0xa0a576d2 -//.word 0x0781f850 -//.word 0xbc107b75 -//.word 0x8162e269 -//.word 0x70783bce -//.word 0x31a79745 -//.word 0x703d1833 -//.word 0x8e674bc5 -//.word 0x9752b831 -//.word 0x7591b83f -//.word 0x63bf8709 -//.word 0xa4659afe -//.word 0x741d332d -//.word 0x3ff832c1 -//.word 0x111e2ec7 -//.word 0x4eb4c438 -//.word 0xa3032f33 -//.word 0x3cd6198a -//.word 0x3723b180 -//.word 0x59eefed1 -//.word 0x006b73f3 -//.word 0x5963c39c -//.word 0xd3d8f784 -//.word 0xd4ecbd6c -//.word 0xaaff035f -//.word 0xc418c438 -//.word 0x22862264 -//.word 0x0ac7b6e9 -//.word 0xfda824a7 -//.word 0xe9aef2de -//.word 0xa0b59af1 -//.word 0x89d7dd6a -//.word 0x958f5b3d -//.word 0x751e6151 -//.word 0x0b2e023c -//.word 0x1eb6694f -//.word 0x511d6dd2 -//.word 0x56a26690 -//.word 0x5ffb3f97 -//.word 0xd53ccd39 -//.word 0x4dfb5f56 -//.word 0xb8b297de -//.word 0xd9647891 -//.word 0xfd84bf09 -//.word 0xe61277fb -//.word 0x0807c8ba -//.word 0xf8f310fc -//.word 0x21e535e1 -//.word 0xb98b3931 -//.word 0xf39a0ee5 -//.word 0x7670acea -//.word 0x0ff96221 -//.word 0xa2cf69aa -//.word 0x67a5bf62 -//.word 0x52e532aa -//.word 0xd398bb6b -//.word 0xc0870e57 -//.word 0x909f6f71 -//.word 0xc99ac7cf -//.word 0xbbdcf79e -//.word 0x6f9b6c68 -//.word 0xdb43f492 -//.word 0x5719d029 -//.word 0x551e0ade -//.word 0x4c36094e -//.word 0xf5896287 -//.word 0xba2af1c8 -//.word 0x6cf72989 -//.word 0x34c0a8bb -//.word 0xccab0e51 -//.word 0xeed610ff -//.word 0x0d3fc842 -//.word 0x44e14fa0 -//.word 0x8c208e31 -//.word 0x3167515e -//.word 0x87109de9 -//.word 0xd984442e -//.word 0xa2a3b6a8 -//.word 0xff661ab6 -//.word 0x65c29e9f -//.word 0x8fd00bd4 -//.word 0xbb2c9c76 -//.word 0x169b1018 -//.word 0x75f0fec6 -//.word 0x45306946 -//.word 0xc5f4949d -//.word 0x730f17d6 -//.word 0xc37133fe -//.word 0x174b6373 -//.word 0xec74335f -//.word 0x510c557f -//.word 0x9e5ff229 -//.word 0x620b3e8d -//.word 0x9d664f3b -//.word 0x301a2fe5 -//.word 0x91123066 -//.word 0xc39a7f04 -//.word 0x86c1fcf2 -//.word 0xcb024919 -//.word 0x6a242119 -//.word 0x175fec8a -//.word 0x93c09087 -//.word 0x1fcf896d -//.word 0x366e3ce0 -//.word 0x7b04880f -//.word 0xf1db9f39 -//.word 0x6ac71471 -//.word 0x4209359e -//.word 0x4c729ac5 -//.word 0x0dccfe8b -//.word 0x28754ef5 -//.word 0x1a4d0073 -//.word 0x27d2a61d -//.word 0x948ac33c -//.word 0x17a2dd0c -//.word 0x8cd4d3c0 -//.word 0xe98e71c7 -//.word 0x7450424e -//.word 0x3455a506 -//.word 0xa5772327 -//.word 0xb04d00b5 -//.word 0xd9961002 -//.word 0xbbdacc74 -//.word 0xb14ea588 -//.word 0xd7f99917 -//.word 0x311503d8 -//.word 0x29b8b727 -//.word 0x3fb34e04 -//.word 0xfcbabf5f -//.word 0x27c63093 -//.word 0x3cb80b30 -//.word 0x1a3f53fd -//.word 0xfcfb393d -//.word 0xaae3ea32 -//.word 0xf1e4ace0 -//.word 0x50ca2913 -//.word 0xf4640aa3 -//.word 0xe7e3c8f7 -//.word 0x8484bfc8 -//.word 0x2e6f8527 -//.word 0x41de79c2 -//.word 0x49819f63 -//.word 0x7222abb9 -//.word 0x40855b5b -//.word 0x80920a0a -//.word 0x7fb58336 -//.word 0x798613c4 -//.word 0x54a5e20f -//.word 0x8ee8822d -//.word 0x75b9c973 -//.word 0x96b9dc3b -//.word 0x77aa8de4 -//.word 0x898be71b -//.word 0x58040659 -//.word 0x05052dad -//.word 0xf6ab12bc -//.word 0xcc637c06 -//.word 0x9551106b -//.word 0x43f368ed -//.word 0x5e0166b7 -//.word 0xf598c85f -//.word 0xda98fc68 -//.word 0x0f4b350b -//.word 0x7b47be36 -//.word 0xe1958fd6 -//.word 0x13121e52 -//.word 0x63167757 -//.word 0x5b548fdb -//.word 0xae01d55c -//.word 0x6d390b69 -//.word 0x7e9e5464 -//.word 0x4b428e86 -//.word 0xb7c7e123 -//.word 0x56c49830 -//.word 0xdd6b3002 -//.word 0xd769af58 -//.word 0x9a0e389c -//.word 0x7aaedb66 -//.word 0x3c47b142 -//.word 0xce6329b3 -//.word 0x35409d78 -//.word 0xc62f290d -//.word 0x993abc75 -//.word 0x3b096f37 -//.word 0xa30716a7 -//.word 0x67c01566 -//.word 0x308d762c -//.word 0x6c7438c5 -//.word 0x424ae95a -//.word 0xcb1a77f2 -//.word 0x7fcb4338 -//.word 0xedfc777f -//.word 0xb0339a03 -//.word 0x9e376172 -//.word 0x42bac8ab -//.word 0x8d3b62c5 -//.word 0xc82bed53 -//.word 0xcd4f2ae6 -//.word 0x7765ecd4 -//.word 0x570a6e38 -//.word 0xa8dbe93a -//.word 0x85db6691 -//.word 0x5a15d146 -//.word 0x998250ba -//.word 0xae2cd3ea -//.word 0x3494ebf2 -//.word 0x6951dfd0 -//.word 0xdffbfd6b -//.word 0x75472ed4 -//.word 0x8673cdcb -//.word 0x60e5b985 -//.word 0xf80fa9ac -//.word 0xdc95c0a8 -//.word 0x68b2621d -//.word 0x3dd845b4 -//.word 0xef96cb1f -//.word 0xfebf8f57 -//.word 0x08c93d28 -//.word 0x3c73a8f0 -//.word 0x12aa16a4 -//.word 0x39aede13 -//.word 0xd171366f -//.word 0xdb404609 -//.word 0xeea4815c -//.word 0x2b8b344d -//.word 0x73a35fb1 -//.word 0xd707c510 -//.word 0x4f1d3fa8 -//.word 0xafbe55b5 -//.word 0xd8980ff0 -//.word 0x2bd10956 -//.word 0x44edc62a -//.word 0xe4f2463d -//.word 0x2ecadb6d -//.word 0x17e8386c -//.word 0x182fcbc3 -//.word 0x250f4d16 -//.word 0xe3f197a9 -//.word 0x16d5b723 -//.word 0x58394392 -//.word 0x113dedb0 -//.word 0xa3065865 -//.word 0xe5602a8c -//.word 0xd3a763fa -//.word 0x84e7edbc -//.word 0x5c4273a1 -//.word 0x829277f9 -//.word 0x94509f9b -//.word 0x9ab5502d -//.word 0x391e7e9f -//.word 0x2ab5c3f9 -//.word 0xea4eae57 -//.word 0xb28f5d31 -//.word 0xa9544ee0 -//.word 0x5951725e -//.word 0x5ffa834e -//.word 0x679f983c -//.word 0x58dcf725 -//.word 0xcc302a3a -//.word 0xc3ec55e1 -//.word 0x984fc6fd -//.word 0x34efce6f -//.word 0x815acfdd -//.word 0x21fe97b1 -//.word 0x6146ec65 -//.word 0x680668ff -//.word 0xb51988d7 -//.word 0xc849ffa0 -//.word 0x1e6e50a6 -//.word 0x63da9b55 -//.word 0xe4f5b7fb -//.word 0x432582cf -//.word 0x6ef17531 -//.word 0xd1657c33 -//.word 0xcbb80459 -//.word 0x5f2c559d -//.word 0x2d3622b6 -//.word 0xa0df5e9a -//.word 0x686a5242 -//.word 0x2b37edad -//.word 0x77e75b27 -//.word 0xfcc1d9cb -//.word 0xf854c747 -//.word 0xf25efedf -//.word 0xabed65b5 -//.word 0x52c4bf47 -//.word 0xf700c739 -//.word 0x42fc7f55 -//.word 0x6571c5d0 -//.word 0x4fe227ce -//.word 0x2237f829 -//.word 0xe8a8a36e -//.word 0x82dc4029 -//.word 0xe0526563 -//.word 0x78013f68 -//.word 0xf03be1ce -//.word 0x1ed7dbb2 -//.word 0x338f0f45 -//.word 0x33a7c088 -//.word 0xa9d0ec53 -//.word 0x984bdc9c -//.word 0xb451f9f6 -//.word 0xd2b3e158 -//.word 0x9ebeba20 -//.word 0x8c61c757 -//.word 0x11923837 -//.word 0x12ed47ea -//.word 0x9d9e8095 -//.word 0xd7826095 -//.word 0x35892209 -//.word 0xef5fd690 -//.word 0xb24bb354 -//.word 0x9657ae47 -//.word 0x4fb14cac -//.word 0xa751b4da -//.word 0x2cdc083c -//.word 0x25c8f59d -//.word 0xcbc289a2 -//.word 0xb64c4598 -//.word 0x96ab7470 -//.word 0x2300bb08 -//.word 0x57b5f0ad -//.word 0xda1a2fdd -//.word 0xbe502b51 -//.word 0x6c67c33b -//.word 0xdec3d6cc -//.word 0x0fc457f9 -//.word 0xb0a6a47f -//.word 0x1da51324 -//.word 0x8f65ce40 -//.word 0x9392e27d -//.word 0xbbc392db -//.word 0x93a5f1f7 -//.word 0xd655b08c -//.word 0xe20d343a -//.word 0x6a03eb86 -//.word 0x6b8ee123 -//.word 0x618b8e70 -//.word 0xbafff341 -//.word 0x8bfee5e2 -//.word 0x82cba859 -//.word 0x1c40bfec -//.word 0x177003e3 -//.word 0x2b8cf38f -//.word 0xf5034b8b -//.word 0x34edd842 -//.word 0x37aa8ab1 -//.word 0x96c6cb6f -//.word 0x21200fea -//.word 0x164cacf3 -//.word 0x9735ed7d -//.word 0x5a0761a1 -//.word 0xa34c79e6 -//.word 0x6f5552c0 -//.word 0xf2dbd056 -//.word 0x44e6ec88 -//.word 0x58ee4f31 -//.word 0x2d401fa9 -//.word 0x48a4198f -//.word 0x613de0c5 -//.word 0x5db094bb -//.word 0x7c89a7f1 -//.word 0xd4daecb7 -//.word 0xfe24f138 -//.word 0x0f7b8fb6 -//.word 0xc9e6bf17 -//.word 0x1305afa1 -//.word 0xa7f61602 -//.word 0x0b78c493 -//.word 0xc2517ddd -//.word 0xc3ee075d -//.word 0x2a4a8284 -//.word 0x2e11f802 -//.word 0x53043544 -//.word 0xe09fd93b -//.word 0x94f9ab60 -//.word 0x95ed30f5 -//.word 0xa9777d8d -//.word 0xa86049ce -//.word 0x321e4676 -//.word 0x9df6b29c -//.word 0x31632839 -//.word 0x98bbbde6 -//.word 0x901048e7 -//.word 0xe3540169 -//.word 0x99c14e08 -//.word 0x6c78d994 -//.word 0x7c69e615 -//.word 0x4472e40c -//.word 0xcdcb41fc -//.word 0x21a18329 -//.word 0x030195a0 -//.word 0xddf85e77 -//.word 0xfaf99856 -//.word 0xf57ee037 -//.word 0x72f20969 -//.word 0x0bcfb6db -//.word 0x8e042897 -//.word 0x6599548d -//.word 0x55953992 -//.word 0x6c2070a8 -//.word 0x34e50580 -//.word 0x2dba853d -//.word 0x7a83587b -//.word 0xdb535190 -//.word 0xdbd58411 -//.word 0x4beb5899 -//.word 0xee94ddc5 -//.word 0x76135f83 -//.word 0xaf4e3b8d -//.word 0xfb74f130 -//.word 0xfee27b52 -//.word 0x9a48ddb3 -//.word 0x1e07fe73 -//.word 0xbadeb6d5 -//.word 0x37c62842 -//.word 0xe41a5291 -//.word 0xd4fbe285 -//.word 0x46f34b97 -//.word 0x65d819f6 -//.word 0x32f481cd -//.word 0xbe623dc4 -//.word 0x9cbb97c9 -//.word 0x96f3c310 -//.word 0x9f7d7158 -//.word 0x09b6a371 -//.word 0xf880bcfb -//.word 0x172dda70 -//.word 0x89a06665 -//.word 0x23aeea0c -//.word 0xd8ca22fe -//.word 0x74e25537 -//.word 0x8e84e562 -//.word 0xb7452658 -//.word 0xf8636ce3 -//.word 0x7ca968c7 -//.word 0x8993b403 -//.word 0xb5b3ac54 -//.word 0x565380fb -//.word 0x3a5c87c0 -//.word 0x9877d637 -//.word 0x47711242 -//.word 0x2ee482d7 -//.word 0xfc146803 -//.word 0x1917922f -//.word 0xdc392ca3 -//.word 0xfe9ed848 -//.word 0x4e2901b2 -//.word 0xa79d6b5d -//.word 0x1f020f37 -//.word 0x824b275f -//.word 0xff35852d -//.word 0x20722872 -//.word 0x00071101 -//.word 0xb8f3536e -//.word 0x1a116a15 -//.word 0xa23fcd5e -//.word 0xa9c0c740 -//.word 0xdcdf8204 -//.word 0xedd5654c -//.word 0x88ed9f53 -//.word 0x89e60476 -//.word 0x6c9919f4 -//.word 0x04dc6af2 -//.word 0x70a524c2 -//.word 0x4c73df64 -//.word 0x24e9bc4d -//.word 0x2ebcb068 -//.word 0x38d01f5b -//.word 0xdf9ead0b -//.word 0x02d95162 -//.word 0x7651ab50 -//.word 0xfb17970f -//.word 0x6fe202ac -//.word 0x42b1fcc3 -//.word 0x2ab20f8a -//.word 0x1863cf10 -//.word 0x6af7b3c7 -//.word 0x62fb2341 -//.word 0xd739d237 -//.word 0x2add4ecf -//.word 0x7cd6d61e -//.word 0x1e7f6bec -//.word 0x497f29b8 -//.word 0x10eed8fc -//.word 0x92b9bfb3 -//.word 0x7447b817 -//.word 0x8f5c8aaf -//.word 0xe53e7289 -//.word 0xda1703c5 -//.word 0xa19b3153 -//.word 0xf4eaa8fc -//.word 0x08b862a7 -//.word 0xc0ab78d5 -//.word 0x2104386f -//.word 0x068279c1 -//.word 0x14832bc6 -//.word 0xf16d32a6 -//.word 0xb14c757d -//.word 0x91bd315e -//.word 0xe80a9498 -//.word 0x5a968737 -//.word 0x4f7ccbce -//.word 0xa3734774 -//.word 0xa0f5a00d -//.word 0x29a00bcb -//.word 0x37dc5ff4 -//.word 0x8abe6fe5 -//.word 0x982c9657 -//.word 0xca4293e1 -//.word 0xe7f597be -//.word 0xd0f69dd1 -//.word 0x6fd9fae6 -//.word 0xea77353b -//.word 0x1c91183f -//.word 0x45b60799 -//.word 0x0066916c -//.word 0x767745d9 -//.word 0xd2b8c7c6 -//.word 0xf5d523de -//.word 0x6a7a60d9 -//.word 0x9cbb59fe -//.word 0x46b4c8e6 -//.word 0x2c6ca482 -//.word 0x0900ad60 -//.word 0xc8fd4529 -//.word 0xf60d816f -//.word 0x78d680a5 -//.word 0x791ffb6f -//.word 0xa7341e1d -//.word 0x9f8c9671 -//.word 0xa5aaeca9 -//.word 0x994111b9 -//.word 0x269b3ad9 -//.word 0x3d3bed3f -//.word 0xc2c25c2e -//.word 0x850ff32f -//.word 0x73aa2d9f -//.word 0x0e63ab69 -//.word 0x1a368715 -//.word 0x9972e602 -//.word 0xfa1bccef -//.word 0x8e8c35c0 -//.word 0x3b60617f -//.word 0x74936fa2 -//.word 0x68e52d8c -//.word 0x7a7f2f56 -//.word 0xf2d91ece -//.word 0xf2db53c0 -//.word 0xab43a475 -//.word 0xd0467e7a -//.word 0x4b7a35a2 -//.word 0x30f3974e -//.word 0xefacc7ec -//.word 0xcd2949be -//.word 0x955b59dd -//.word 0x8ac4817d -//.word 0xa1dc6a72 -//.word 0xedb2f3f4 -//.word 0x5bd6809f -//.word 0x9f7794bd -//.word 0x6ec9a3c8 -//.word 0xeea9212b -//.word 0x6b84df49 -//.word 0x4b7597c0 -//.word 0x44adc6ef -//.word 0xcc18b9b6 -//.word 0xd13eeb7c -//.word 0xab678e77 -//.word 0x4f026827 -//.word 0xc547e024 -//.word 0xdc1c591a -//.word 0x1c35be12 -//.word 0xfc805ef3 -//.word 0x55c0fb48 -//.word 0x17771d43 -//.word 0x3b0aac02 -//.word 0xf820be12 -//.word 0x3a4bae32 -//.word 0x50ea6e59 -//.word 0xe44e1efa -//.word 0x311bdd86 -//.word 0x70f1df33 -//.word 0x934cbffc -//.word 0x36a917e8 -//.word 0xd3eb4f90 -//.word 0x35fcb2db -//.word 0x2fb7c70d -//.word 0x8d06de00 -//.word 0x4b47e9b0 -//.word 0x05f58dfe -//.word 0xaf8479ad -//.word 0x868cf7b1 -//.word 0x462ac0a9 -//.word 0x9ea415aa -//.word 0xe14b0b3e -//.word 0xfea627ac -//.word 0xb2cc2a7a -//.word 0xfc122e31 -//.word 0xd2e6f260 -//.word 0x12fb73e3 -//.word 0xbba7bc65 -//.word 0x5d89fe24 -//.word 0xce6ee3f4 -//.word 0x1f752087 -//.word 0xce724aeb -//.word 0x3d91ea54 -//.word 0x633cd31c -//.word 0xc23eb308 -//.word 0x9928e9cd -//.word 0x5af396d3 -//.word 0x5ee8f738 -//.word 0xd8bdf218 -//.word 0x0801ee0c -//.word 0xb1bae8f0 -//.word 0xcc4cc3ea -//.word 0x7e9ce0a7 -//.word 0x4876efe8 -//.word 0x7e2c053e -//.word 0xfa80ee11 -//.word 0x11c4c4e7 -//.word 0xc640c0e3 -//.word 0x3ed4518c -//.word 0x74df6bd1 -//.word 0x2e5f2249 -//.word 0x305977bf -//.word 0xaf7b72ed -//.word 0x08007188 -//.word 0xb2d4bf7d -//.word 0x71f8687b -//.word 0xcd294cb1 -//.word 0xc3bc73d9 -//.word 0xbacda075 -//.word 0xb9982958 -//.word 0xd6270569 -//.word 0xf22e27a4 -//.word 0xa3330a61 -//.word 0x72f18ed9 -//.word 0x47ff02e6 -//.word 0x21ad820a -//.word 0x0a2f83b3 -//.word 0x4bfdacbd -//.word 0xdc79e839 -//.word 0x1ed2b96d -//.word 0xcc29cf1b -//.word 0x2ff3d907 -//.word 0x929f9bb3 -//.word 0xf678406d -//.word 0x07ccf28b -//.word 0x4e4ea9f6 -//.word 0xa7b940e5 -//.word 0xf6b6ceeb -//.word 0x16003334 -//.word 0x12c6f10c -//.word 0x98513ea0 -//.word 0xaae65709 -//.word 0x97ee1686 -//.word 0x2a54c709 -//.word 0x212f38f6 -//.word 0xe0a10f27 -//.word 0x67fe6033 -//.word 0x82317ff0 -//.word 0x3f5c1336 -//.word 0xa5bf6ce6 -//.word 0xa3db172b -//.word 0x47d7af00 -//.word 0x3122f5f3 -//.word 0x465a2328 -//.word 0xa96d7ea0 -//.word 0xe7fe2bbb -//.word 0x710a43fc -//.word 0x50cb2a0d -//.word 0x14dc1c03 -//.word 0x0d9f08e2 -//.word 0xbedca264 -//.word 0x8faab4f6 -//.word 0xc293b404 -//.word 0xa8f39c76 -//.word 0x15a1f67b -//.word 0x11d13685 -//.word 0xd0394d95 -//.word 0xe5737bb8 -//.word 0xb2a365d1 -//.word 0x2359679a -//.word 0x9cb92be6 -//.word 0x2fd97b29 -//.word 0x136a5339 -//.word 0x519b3b56 -//.word 0xc13ad369 -//.word 0x351cb089 -//.word 0xf4c066c3 -//.word 0x6a2fe61b -//.word 0x1d260bce -//.word 0xe3776fda -//.word 0x53ad83c0 -//.word 0x79efdf89 -//.word 0xce27d607 -//.word 0x66634e5d -//.word 0x6c7bcec2 -//.word 0xccf4d981 -//.word 0x2f247b44 -//.word 0x2c972193 -//.word 0xbcb2ae98 -//.word 0xef96ca25 -//.word 0xde477df8 -//.word 0xe10efe3d -//.word 0x021bc554 -//.word 0xb16fe7d5 -//.word 0xb9f9a3d1 -//.word 0x72ff385b -//.word 0x38c0fa47 -//.word 0x1d58a532 -//.word 0xdbe3f1c3 -//.word 0x0de5672f -//.word 0x9eea7203 -//.word 0x8169b91e -//.word 0xa2eeacfc -//.word 0x1d785d3b -//.word 0xaf209257 -//.word 0x69fc18b9 -//.word 0xac435af0 -//.word 0x51b2323e -//.word 0x282efe56 -//.word 0xa4aaf764 -//.word 0xd44bbe4e -//.word 0x95ca3839 -//.word 0x071b9c50 -//.word 0x3d4ccac0 -//.word 0x39afdf07 -//.word 0x173b066f -//.word 0x883091d5 -//.word 0x82fa48af -//.word 0x3658004e -//.word 0x43bd7060 -//.word 0x29f741b8 -//.word 0x000e6452 -//.word 0x6a6fa891 -//.word 0xc6498ccc -//.word 0xa6385109 -//.word 0x83215408 -//.word 0xb05d9b84 -//.word 0x8d19aeb5 -//.word 0xfdfca819 -//.word 0x1a0b8d74 -//.word 0x27cade16 -//.word 0xc5a46b5c -//.word 0x6a8d6979 -//.word 0x10e6c476 -//.word 0x2aa1b778 -//.word 0xdca59942 -//.word 0x6b74fafa -//.word 0xf30bee30 -//.word 0x580aa91c -//.word 0x7e144c27 -//.word 0xbd79ffae -//.word 0x8f124002 -//.word 0x8c6d7ab3 -//.word 0x992ada0e -//.word 0x5ca55ee4 -//.word 0xf3d62f8d -//.word 0xe575302d -//.word 0x5861d736 -//.word 0x85423c2e -//.word 0x6a6d6fb3 -//.word 0xbe090fbc -//.word 0x2a701821 -//.word 0xb6d8fd5e -//.word 0x8233f794 -//.word 0xb6549cd0 -//.word 0xbb52b390 -//.word 0xac314783 -//.word 0x07bffa91 -//.word 0xa9bd9c1b -//.word 0xf93ffc84 -//.word 0x6356fef0 -//.word 0x08ebee4b -//.word 0xb3ee148e -//.word 0x0fb1893d -//.word 0x188e4934 -//.word 0xd0d088a4 -//.word 0x33d14a59 -//.word 0x6c5f2e3e -//.word 0x49648a22 -//.word 0xedc6bdbc -//.word 0xc58dc1ed -//.word 0xbd440046 -//.word 0xb3a169ca -//.word 0x2b68c2f5 -//.word 0x458c40fd -//.word 0xed975557 -//.word 0x524dc97d -//.word 0x998c0cef -//.word 0xd277cb77 -//.word 0x2bd4c1b2 -//.word 0x63b1d0cc -//.word 0x824e508b -//.word 0xc837a78f -//.word 0xe3b119d8 -//.word 0x6557e288 -//.word 0x740582ea -//.word 0xc3f559b4 -//.word 0xc2287389 -//.word 0x1208a5c2 -//.word 0x3c4bd96e -//.word 0xa21aa697 -//.word 0xb67324c8 -//.word 0x69ccfecb -//.word 0xe7f9c8b7 -//.word 0x814f932b -//.word 0xea0abfd4 -//.word 0xa7ec1135 -//.word 0xc12705a7 -//.word 0xbd7d669e -//.word 0xcda61b2f -//.word 0x48f244cf -//.word 0x582f865e -//.word 0xf3cda264 -//.word 0x0c404d9a -//.word 0x0aa63cac -//.word 0x79aa7e3d -//.word 0xffa80e2b -//.word 0x9212a915 -//.word 0xe912dd1b -//.word 0x307063e5 -//.word 0x00b7aee7 -//.word 0x8e93c4e3 -//.word 0x237e4daf -//.word 0xcc9be938 -//.word 0x52e2c7c7 -//.word 0x6c7e7483 -//.word 0x3473f038 -//.word 0xd8840756 -//.word 0x9254de3d -//.word 0xdacbcdb7 -//.word 0xdabb6cc6 -//.word 0x22c4f1a1 -//.word 0x9d75b9f9 -//.word 0xc3b32480 -//.word 0x115fa6ac -//.word 0xb6331bb8 -//.word 0x90ed5bed -//.word 0x56b00f1f -//.word 0x17a7c37a -//.word 0xe3eb3c7f -//.word 0xc8a70b49 -//.word 0x007a6215 -//.word 0x681c2701 -//.word 0x34454714 -//.word 0xe1ca4d7f -//.word 0x6c093322 -//.word 0xc2887752 -//.word 0x77d972da -//.word 0xbac1e63f -//.word 0x8999d649 -//.word 0x21f39abe -//.word 0xb9813271 -//.word 0x6f33db7b -//.word 0x83a0e0c9 -//.word 0xc3a7b3d7 -//.word 0x46563cba -//.word 0x5d0a7164 -//.word 0xc7d82724 -//.word 0x242c276c -//.word 0xacb085d7 -//.word 0x21702d6a -//.word 0x023bbf1b -//.word 0x024c9d8f -//.word 0xb92a4228 -//.word 0x98ccd53f -//.word 0x2201fdae -//.word 0x590ff892 -//.word 0x779ae74f -//.word 0xdfc86cd4 -//.word 0x53a37720 -//.word 0x67bf5d04 -//.word 0x361c2b2b -//.word 0x534d3959 -//.word 0x03da02f0 -//.word 0xa9e432b8 -//.word 0x810701df -//.word 0x9185c03f -//.word 0xdda0b1e0 -//.word 0xdb471cbe -//.word 0x26f59fcc -//.word 0x76d7c638 -//.word 0xd02ddcf1 -//.word 0xfaf20067 -//.word 0x32bf7b92 -//.word 0x1fed5035 -//.word 0x08fa1564 -//.word 0x442d0244 -//.word 0xf27d4812 -//.word 0xeab0a366 -//.word 0xf3c033b9 -//.word 0x36828825 -//.word 0xf289fc6d -//.word 0x7249453d -//.word 0x3c784ab3 -//.word 0x8cba361d -//.word 0x007ccb05 -//.word 0x9520fa6b -//.word 0xd25bb051 -//.word 0x43dcf27d -//.word 0x292f2c7a -//.word 0x70e0c6e0 -//.word 0xe1e3f9d5 -//.word 0x9933e1d4 -//.word 0xbabad3ad -//.word 0x6071f0cd -//.word 0xd7c8fac0 -//.word 0x0b4867f4 -//.word 0x3f77b4c0 -//.word 0x02fcfca4 -//.word 0x5f03c9d3 -//.word 0x55e32aee -//.word 0x87fe0613 -//.word 0x33e9af16 -//.word 0x68ceba0e -//.word 0x740e0f14 -//.word 0x9c2a3c47 -//.word 0x11e30f14 -//.word 0x1fa063b4 -//.word 0xa6113af5 -//.word 0xce120c3e -//.word 0xf7d25fcd -//.word 0xef349844 -//.word 0x68751164 -//.word 0xa9106b18 -//.word 0x83de26b5 -//.word 0x87826e80 -//.word 0x76043871 -//.word 0xf9bc8e36 -//.word 0x9272277b -//.word 0xd3c33b69 -//.word 0xcec6956c -//.word 0xccf0ea3a -//.word 0x42356911 -//.word 0x0070933f -//.word 0xac054de8 -//.word 0x6fc53404 -//.word 0xee1230a7 -//.word 0x7c434c85 -//.word 0x8d4ac5b5 -//.word 0x6e9360b5 -//.word 0x343001af -//.word 0xf3347afa -//.word 0x305ca1e4 -//.word 0x98f5a5af -//.word 0xf2f9a2d9 -//.word 0x527c72a1 -//.word 0x8f46c7c6 -//.word 0xf8c27692 -//.word 0x43171617 -//.word 0xc694cab9 -//.word 0xea515bec -//.word 0xdc138a3f -//.word 0x8571a49a -//.word 0xbd3556c3 -//.word 0xbb05c327 -//.word 0xd043d4d8 -//.word 0x5631cfd2 -//.word 0xe3592c82 -//.word 0xc22ca489 -//.word 0xa3e98abd -//.word 0x91c05e70 -//.word 0x2538a0f6 -//.word 0xf9cee261 -//.word 0x60de218f -//.word 0x54c75567 -//.word 0xb04b475f -//.word 0xa034a341 -//.word 0x553d4e30 -//.word 0xfd2ff9e6 -//.word 0xf24bf73f -//.word 0x31e84bfb -//.word 0x0f5d06bf -//.word 0x2721d05e -//.word 0x9731c457 -//.word 0x6cb2819f -//.word 0x5ad87da0 -//.word 0xb1069d81 -//.word 0x8c3703a8 -//.word 0x4b9c287d -//.word 0x44862a71 -//.word 0xb6876740 -//.word 0xfed44a72 -//.word 0x0eee6528 -//.word 0x1a82c015 -//.word 0x948d71cb -//.word 0x5bc36d38 -//.word 0x30329e70 -//.word 0x692336ad -//.word 0xe9414293 -//.word 0x4ffd82b9 -//.word 0x6e307866 -//.word 0xfe02bf98 -//.word 0x900c9e4b -//.word 0xc8b9ddf7 -//.word 0xc6f2d75b -//.word 0xe5fad179 -//.word 0xa8968ae2 -//.word 0xf1721333 -//.word 0x74c0e1e0 -//.word 0x6c222130 -//.word 0x8cca4b89 -//.word 0x39dffaee -//.word 0xf623fbc6 -//.word 0x20d4a4df -//.word 0xdbd067b2 -//.word 0x4cfca7e9 -//.word 0x09e5c91e -//.word 0xcda88fe6 -//.word 0x7110a10e -//.word 0x17ff6d24 -//.word 0xa90f3139 -//.word 0x827856e6 -//.word 0x6a35008d -//.word 0xc862e3e1 -//.word 0x13e958a9 -//.word 0x8a5db0c1 -//.word 0x2526c861 -//.word 0xcbdfdda1 -//.word 0xc5fca23d -//.word 0x73b09096 -//.word 0x3d0e7efa -//.word 0xcd6e7125 -//.word 0x7b12b508 -//.word 0x09092dc9 -//.word 0x9154e70a -//.word 0xbb48f36e -//.word 0x33337659 -//.word 0x5b42faf8 -//.word 0x3da20882 -//.word 0xc3e6f9bd -//.word 0x2aa909c3 -//.word 0xb474ad06 -//.word 0x9de22792 -//.word 0x51015792 -//.word 0xdcfcd416 -//.word 0xa2f73b13 -//.word 0x503bc7ab -//.word 0x129322af -//.word 0x07f57b63 -//.word 0xf265d981 -//.word 0x3217af80 -//.word 0xf4d4b015 -//.word 0xa79ee4fb -//.word 0xb097fcf0 -//.word 0x5f1fe300 -//.word 0x223d9505 -//.word 0xf940346f -//.word 0x2aa65941 -//.word 0x363ca85c -//.word 0x0b87a700 -//.word 0x7b63d090 -//.word 0xedeae495 -//.word 0x53978306 -//.word 0x5cabfac7 -//.word 0xead05c6f -//.word 0xc6fdd44e -//.word 0x939939af -//.word 0x00e3e35a -//.word 0x4291bd5d -//.word 0xc2b79c0c -//.word 0x12ebcf47 -//.word 0x26a7f8fb -//.word 0xc1ef1aeb -//.word 0x2d33f2b1 -//.word 0x2f768bff -//.word 0x3ab00d2b -//.word 0xe371d5eb -//.word 0x95c8cb5d -//.word 0x8663f04a -//.word 0xe9f737ab -//.word 0x66e3966c -//.word 0xc7105c71 -//.word 0xf41bc5d7 -//.word 0x21b6cc7c -//.word 0x464b40c1 -//.word 0xcfe31a8e -//.word 0x95470e97 -//.word 0x0e6460de -//.word 0xc0f4f979 -//.word 0xfc5bba96 -//.word 0xc8cf10bc -//.word 0x1dbcc954 -//.word 0x53672667 -//.word 0xd9d131a9 -//.word 0x29de50b7 -//.word 0xfbb61b9d -//.word 0xb96c6b9b -//.word 0x34deb329 -//.word 0x95dc9438 -//.word 0x968cabbb -//.word 0xf20cae66 -//.word 0x195ab7b5 -//.word 0x2971df31 -//.word 0x1ab50fef -//.word 0x38911359 -//.word 0xd75ff030 -//.word 0x428878d2 -//.word 0xf4ec1bb9 -//.word 0x0b840045 -//.word 0xf94555bb -//.word 0x7d48e38d -//.word 0xd229e5dc -//.word 0x26ad1a3b -//.word 0x4da719b6 -//.word 0xb71ce513 -//.word 0x9fa5c157 -//.word 0x8615458c -//.word 0xe05cb2c2 -//.word 0x0dab8354 -//.word 0x8ad9446c -//.word 0x6906a7c9 -//.word 0xfe7ed5c0 -//.word 0xdcdf0281 -//.word 0x007f449c -//.word 0x4b08a5c4 -//.word 0x366577d2 -//.word 0xc1e2e70d -//.word 0xac8ed5a8 -//.word 0xeae4e38c -//.word 0x53abcc58 -//.word 0x991bf8a6 -//.word 0x7d414d91 -//.word 0x42a54774 -//.word 0x62294bf3 -//.word 0x81343840 -//.word 0x9f104097 -//.word 0x9191f60b -//.word 0xb2f8a785 -//.word 0xd616ee0a -//.word 0x7fb5833c -//.word 0x54335424 -//.word 0xce70d72e -//.word 0x35eb9e75 -//.word 0xcb272c41 -//.word 0x475407ce -//.word 0x842b0e50 -//.word 0x7b1a0d33 -//.word 0x6fa18fa7 -//.word 0x67fcf35c -//.word 0xe102c28a -//.word 0xc54d4035 -//.word 0x989b41af -//.word 0xf2743e5e -//.word 0x320da8bf -//.word 0x706d7cab -//.word 0xb3ce18da -//.word 0x64464da5 -//.word 0x03a6b510 -//.word 0x19a34707 -//.word 0x6e3328e8 -//.word 0x7b3ac442 -//.word 0x22661edd -//.word 0x9d5764fa -//.word 0xb504c7db -//.word 0x345a8a86 -//.word 0x9c2658c7 -//.word 0x1934da74 -//.word 0xb5b889f4 -//.word 0xcbeec102 -//.word 0xbefe17af -//.word 0xea22eda6 -//.word 0xdb0a44b4 -//.word 0xbd80d188 -//.word 0x144852b7 -//.word 0xae4a2203 -//.word 0xd5f30bdc -//.word 0xc9d85c27 -//.word 0x6d9c3c3f -//.word 0x40143e39 -//.word 0x8faa366d -//.word 0xe9ff4a31 -//.word 0xd4d54ce8 -//.word 0xbe2b473c -//.word 0x36a957a7 -//.word 0x5c3fbe38 -//.word 0x960a3594 -//.word 0x8577803b -//.word 0x38aa450c -//.word 0x9f211e0c -//.word 0x4294ed63 -//.word 0x322070a7 -//.word 0x40a5155d -//.word 0x6e6d0fbd -//.word 0xa30ea9b6 -//.word 0xa391da32 -//.word 0x3dd31a9b -//.word 0xc72c759e -//.word 0xc74fde2f -//.word 0xf371c5cd -//.word 0x5caeec07 -//.word 0xe6a8763f -//.word 0xfb7141ae -//.word 0x80ab75a8 -//.word 0x08ed5d21 -//.word 0x48697671 -//.word 0xccccc654 -//.word 0xe8666f35 -//.word 0xf08b84ac -//.word 0xab391b45 -//.word 0x06faa483 -//.word 0x060c7924 -//.word 0x00c0b6a7 -//.word 0x0c204a0c -//.word 0xb7d44edb -//.word 0xf8479667 -//.word 0x66058654 -//.word 0xa7682757 -//.word 0x2c737a3d -//.word 0x1bfe0d2f -//.word 0x8d13cb34 -//.word 0xfa9918f7 -//.word 0xf12f1ecb -//.word 0x0d5b61ec -//.word 0x24e49a07 -//.word 0xc17cc2fd -//.word 0xd5a26de5 -//.word 0xa9c75950 -//.word 0x17b047d0 -//.word 0xfa1b09bb -//.word 0xe3a5dd2c -//.word 0x0eebf94b -//.word 0x94f067ce -//.word 0xe1bf13c0 -//.word 0x69512380 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x0000E5D8 -//// expected output -//.word 0x6064b250 -//.word 0x61c48d40 -//.word 0x1846b922 -//.word 0xa6f28cf0 -//.word 0x6001e0e9 -//.word 0x210a759b -//.word 0x66b4cc63 -//.word 0x15b18a0b -//.word 0xac5667e3 -//.word 0xedd91563 -//.word 0xea3dc002 -//.word 0xc732d1b9 -//.word 0x3857ffbe -//.word 0xe08e1293 -//.word 0x99717043 -//.word 0x48edad9e -//// SHA512LongMsgvector_74 -//// vector length -//.word 0x0000E8F0 -//// input message -//.word 0x929548ad -//.word 0xf1febc84 -//.word 0x14d7aa90 -//.word 0xac20dffd -//.word 0x8090094f -//.word 0x57e4bf54 -//.word 0x1878c256 -//.word 0x30148394 -//.word 0x3408e5f4 -//.word 0xc77b43f2 -//.word 0xbf00b5dc -//.word 0x836a8f41 -//.word 0xb7e22ba7 -//.word 0x1c36e97c -//.word 0xb174734f -//.word 0x1fb84640 -//.word 0x53426eb5 -//.word 0x6dcb904f -//.word 0xd9192e1d -//.word 0xbbd2270f -//.word 0x918e7dad -//.word 0x142f5b08 -//.word 0x5e7557f1 -//.word 0x52cdf46a -//.word 0x396a6b5a -//.word 0xa997ab85 -//.word 0xab4c9eba -//.word 0x1cffae4e -//.word 0x54bc88ca -//.word 0x06781fe1 -//.word 0x67a3f4a5 -//.word 0x93fc96fa -//.word 0x2ca9644a -//.word 0x44879a7a -//.word 0x7dbf8c1d -//.word 0x6e9a2ce8 -//.word 0x4996d266 -//.word 0xbbb93ded -//.word 0x1425d5d1 -//.word 0xa8ed32d7 -//.word 0x7527e2ed -//.word 0x06426718 -//.word 0x979a80ad -//.word 0x794aaac4 -//.word 0xb841e5ea -//.word 0xfc99bb16 -//.word 0xad247fdf -//.word 0x5a47d3eb -//.word 0x5c0b6cab -//.word 0xb6711a45 -//.word 0x400602d2 -//.word 0x05b82eca -//.word 0xe9e849bc -//.word 0x8fc0a343 -//.word 0x79c77c35 -//.word 0x71b27e1d -//.word 0x287e8bec -//.word 0x1ebbb9eb -//.word 0xc12b9bf4 -//.word 0xd98bc3e2 -//.word 0x23b18446 -//.word 0x3cd7fd5c -//.word 0xc137523d -//.word 0xb5d83d55 -//.word 0x23a7c618 -//.word 0x04c94ef1 -//.word 0x6230d27b -//.word 0xbe6c6ef4 -//.word 0xb0c420ef -//.word 0xcd86cf48 -//.word 0xcd9b8c5d -//.word 0xee5e177b -//.word 0x93afa597 -//.word 0x3142e03f -//.word 0x6b3d30d0 -//.word 0x7c0339e8 -//.word 0xd64aa51e -//.word 0x087423f1 -//.word 0xe51cafff -//.word 0xe3ef1578 -//.word 0xc1bdb0d1 -//.word 0x6dcf78bd -//.word 0x247c3c59 -//.word 0xdbf72ba6 -//.word 0xde6b993d -//.word 0xb74a003e -//.word 0x51e2458a -//.word 0x5d313d32 -//.word 0xf5fa702f -//.word 0x7f181d53 -//.word 0xd5137e7f -//.word 0xa3f14c17 -//.word 0x104e86b3 -//.word 0xa0af6f17 -//.word 0x5814d666 -//.word 0x24cc9992 -//.word 0x778d6c17 -//.word 0x31c4d7e9 -//.word 0xc52a7eaa -//.word 0x9b98a521 -//.word 0xb31cf3e8 -//.word 0x8c4c7664 -//.word 0x44dae8fa -//.word 0x00693180 -//.word 0x8e9f2cf2 -//.word 0x497cae67 -//.word 0x3deac543 -//.word 0x8c953dad -//.word 0x11fc6944 -//.word 0x42c9200d -//.word 0x5b5d05b0 -//.word 0xb9b00be5 -//.word 0x83583929 -//.word 0x90e7abb5 -//.word 0x857adab0 -//.word 0x3e8f1da4 -//.word 0x70176f2f -//.word 0x8ccd72fb -//.word 0xe6c5b4ef -//.word 0x164831a7 -//.word 0x9edf1a22 -//.word 0xceaed5bb -//.word 0xe503455b -//.word 0x792f4bec -//.word 0x19958d11 -//.word 0x30007614 -//.word 0x2c3a7e20 -//.word 0xe0daabb0 -//.word 0x275d5747 -//.word 0xcb783562 -//.word 0xa5ad8faa -//.word 0x051dd16f -//.word 0x549d4b52 -//.word 0xf70b3341 -//.word 0x77e3e9a9 -//.word 0xdf0d7fe6 -//.word 0x66f979ff -//.word 0x4eeed190 -//.word 0x0c9f3f07 -//.word 0xa900b713 -//.word 0x6857325a -//.word 0xa996b16b -//.word 0x0de87ff3 -//.word 0xdb8ab733 -//.word 0xa3dc07b1 -//.word 0x21b8b32e -//.word 0x6302ddd9 -//.word 0x2e8003c2 -//.word 0x9fecc991 -//.word 0x0e48f978 -//.word 0x3772c866 -//.word 0x9cf85b7e -//.word 0x252d89c7 -//.word 0x0a7de325 -//.word 0xf2fdf188 -//.word 0x5d46bf63 -//.word 0x3f849860 -//.word 0xedca1252 -//.word 0x3da94b6a -//.word 0xe90071af -//.word 0x351588a8 -//.word 0xd2e5675b -//.word 0x01b9047c -//.word 0xfcfaf2de -//.word 0x9146282d -//.word 0x10c304df -//.word 0x67b49068 -//.word 0x8c4a03ad -//.word 0x1bbc8bbc -//.word 0x419a49ba -//.word 0xd85e9d1c -//.word 0xd344a51b -//.word 0xdd5b0061 -//.word 0x3ddcd809 -//.word 0xfdbb1fc6 -//.word 0x4b7d1862 -//.word 0x1f491a6b -//.word 0x1e419129 -//.word 0xbf1345d2 -//.word 0xaccadf01 -//.word 0x6beba965 -//.word 0x3dbd95b6 -//.word 0x46e881ee -//.word 0xef41b9b5 -//.word 0x89e5bd1d -//.word 0x3385458f -//.word 0xfd008306 -//.word 0x4d37a87a -//.word 0x821da9a0 -//.word 0xd80d43d0 -//.word 0x8b613d46 -//.word 0x4040ed8e -//.word 0xa0b7fd3a -//.word 0x460b6fd6 -//.word 0xdb4edf1e -//.word 0x7f31086e -//.word 0x6b198a79 -//.word 0xd575eb3e -//.word 0x144edb38 -//.word 0x051fbcd5 -//.word 0xade8612a -//.word 0x207e16e5 -//.word 0xa125e183 -//.word 0x0a6008c3 -//.word 0x6f08d35a -//.word 0xfe9c93e8 -//.word 0x29d8e32b -//.word 0x08892e72 -//.word 0xf89f7255 -//.word 0x898443a4 -//.word 0x97ac129d -//.word 0xb66eaf62 -//.word 0xd4120daa -//.word 0x192b46b6 -//.word 0x1227de87 -//.word 0x0f244c4e -//.word 0xc905b624 -//.word 0x48c5fdfb -//.word 0x040cf9d4 -//.word 0x4b000633 -//.word 0xe25ebfd0 -//.word 0xefc90990 -//.word 0x166254b3 -//.word 0xe3981d4f -//.word 0x6842b7fd -//.word 0x27eb4cd2 -//.word 0x326c1f91 -//.word 0x90c1131e -//.word 0xe3157136 -//.word 0x481fe65e -//.word 0x7fb1cb19 -//.word 0x4c8ea95e -//.word 0x1c7dfd49 -//.word 0xec9b3811 -//.word 0x67f50a3a -//.word 0x4e56e00c -//.word 0x1d5eac43 -//.word 0xecd4e408 -//.word 0x933dcd20 -//.word 0x11aef964 -//.word 0x2fde0e71 -//.word 0x607fcaa0 -//.word 0xeccf4439 -//.word 0x4d6a75e3 -//.word 0xd962f65f -//.word 0xa2910b76 -//.word 0x9b2ee130 -//.word 0xfc9f1447 -//.word 0xe78e74db -//.word 0x4b3f0967 -//.word 0x092155f4 -//.word 0x55a3d88d -//.word 0x5f48daf2 -//.word 0x33fe6491 -//.word 0xdeac90b1 -//.word 0xd30a02f1 -//.word 0x8db5b7f1 -//.word 0x7583fe4f -//.word 0x0513c3d5 -//.word 0x2ea913f0 -//.word 0xf739dd64 -//.word 0x68c2f63f -//.word 0xa6de600b -//.word 0x5f96cc48 -//.word 0x687a5d1a -//.word 0xa5f2af3e -//.word 0x2acf1842 -//.word 0x9f252ef6 -//.word 0xe95d891e -//.word 0x0786ca69 -//.word 0x39ecdba7 -//.word 0x68ec7936 -//.word 0xc206f0bd -//.word 0xa534261d -//.word 0xbe7adba5 -//.word 0x72bf2f86 -//.word 0x7cdb6586 -//.word 0xd8f1e6f8 -//.word 0xe0ff89eb -//.word 0xb6b311a2 -//.word 0xe181f844 -//.word 0x3bf26bd5 -//.word 0x0a3f9565 -//.word 0x6d1e2087 -//.word 0xfadcf905 -//.word 0xa5ac54d2 -//.word 0xe33ff140 -//.word 0x10949d73 -//.word 0x0e12fb16 -//.word 0x30d4844c -//.word 0x5644cdea -//.word 0x59eb08e3 -//.word 0xa987ce04 -//.word 0x345e1ce1 -//.word 0x8ad39b0f -//.word 0x3f372493 -//.word 0x91e1839b -//.word 0x4b817b6c -//.word 0xeab10b9c -//.word 0xfdcdf081 -//.word 0xd2056be9 -//.word 0x4eb0440b -//.word 0x1de30fbe -//.word 0x0c43aee9 -//.word 0xb217173b -//.word 0x56a2581c -//.word 0x0dafd8e3 -//.word 0x236ddf49 -//.word 0xbc7d581d -//.word 0xbb4ad63a -//.word 0xe399d6b7 -//.word 0x3c61445d -//.word 0xb9dc405e -//.word 0x17de2143 -//.word 0x0866ba27 -//.word 0x9172dd23 -//.word 0xb1181e09 -//.word 0x43d3d955 -//.word 0x251b7760 -//.word 0x9a38ecd7 -//.word 0xed57846c -//.word 0x58dee0cb -//.word 0x23fd3bd0 -//.word 0x1085f3f7 -//.word 0xf7fe4414 -//.word 0xaef45644 -//.word 0x2b917a23 -//.word 0xed71b03f -//.word 0x98b16ecd -//.word 0xdf499c9b -//.word 0xa69ce346 -//.word 0x684e27ad -//.word 0xd75652a5 -//.word 0xc35454ef -//.word 0x3d246867 -//.word 0xfcb3987d -//.word 0x001183e9 -//.word 0x74c85e9b -//.word 0xd96d39f1 -//.word 0x6174832d -//.word 0x9948d126 -//.word 0x4b9cdb3e -//.word 0xa3fbc793 -//.word 0x90a7ab7a -//.word 0x6da04d29 -//.word 0xe1032db3 -//.word 0x0495c53a -//.word 0xc3a00f5f -//.word 0x85fe48fe -//.word 0x0f73f419 -//.word 0xa4402211 -//.word 0x71f4f11c -//.word 0x298653f3 -//.word 0xeda111cb -//.word 0x6e3f0f87 -//.word 0x5579d22c -//.word 0xe39d3f95 -//.word 0xd482a568 -//.word 0x8a18fe48 -//.word 0x6743724c -//.word 0x7bea1db0 -//.word 0x5f4b12cb -//.word 0x6091a041 -//.word 0xe0a8d47a -//.word 0xfa503e53 -//.word 0x6570f813 -//.word 0x9bade5a0 -//.word 0x3a3c37f3 -//.word 0xaaf434c9 -//.word 0x00a8399b -//.word 0x22b3ffd1 -//.word 0x2cd41d33 -//.word 0x133dcea0 -//.word 0x89e6f502 -//.word 0x20275e81 -//.word 0xb18647f7 -//.word 0xffce1fa4 -//.word 0x98618d24 -//.word 0xfcceb49d -//.word 0x01a6b63d -//.word 0x768c76e4 -//.word 0x078ca31d -//.word 0x60aef253 -//.word 0x96caaa42 -//.word 0xc29d66ab -//.word 0xef1d164c -//.word 0x360a480f -//.word 0x27c6a682 -//.word 0x6b66bf87 -//.word 0xa8090a4d -//.word 0xa568277e -//.word 0xafaf69ba -//.word 0x3b8c9245 -//.word 0xcc85ddfc -//.word 0x178e428e -//.word 0x65dbf5e8 -//.word 0x3af330f1 -//.word 0x34063278 -//.word 0x3580886a -//.word 0xc5de8b49 -//.word 0xb1c02ad9 -//.word 0xf840e91d -//.word 0xe8832a81 -//.word 0x858dab59 -//.word 0x2a5a518a -//.word 0x732a2487 -//.word 0x591c9a80 -//.word 0x9ffe18d6 -//.word 0x6e64b6d1 -//.word 0x3cf74395 -//.word 0xf2108952 -//.word 0x4d86d1bc -//.word 0x84c4aabb -//.word 0x2c1ee763 -//.word 0x5965e726 -//.word 0x07b81948 -//.word 0xb89ebe94 -//.word 0x5e52f14e -//.word 0x7a5ee568 -//.word 0x866b6ff8 -//.word 0x9158c4ea -//.word 0x298983f2 -//.word 0x7d82f6c5 -//.word 0xc3b49589 -//.word 0xd896cb8a -//.word 0x26f8fd2e -//.word 0xcb95c92b -//.word 0xf8e78bf7 -//.word 0x963f2681 -//.word 0x3014011e -//.word 0x0d9b4fc6 -//.word 0x9c999480 -//.word 0x1676641b -//.word 0x5e926e1f -//.word 0x2cdcba03 -//.word 0x6aa02fa0 -//.word 0xdea058e6 -//.word 0x0a6768ce -//.word 0x50da7b8f -//.word 0x5a101e15 -//.word 0xb96312af -//.word 0xccc74d08 -//.word 0xe45b4258 -//.word 0xa53e62db -//.word 0xb0a4e383 -//.word 0x7f29c0ea -//.word 0x8f65018a -//.word 0xc5c03c30 -//.word 0x0b875cae -//.word 0x3a40a1d0 -//.word 0x3c3be892 -//.word 0x726a2d90 -//.word 0x53724ebe -//.word 0x56021159 -//.word 0x1264691e -//.word 0xa452f5b9 -//.word 0x520aca80 -//.word 0x6ea57261 -//.word 0x7ca43419 -//.word 0x97cc96a7 -//.word 0x10342101 -//.word 0x599c6405 -//.word 0x21003cb2 -//.word 0xc16d5298 -//.word 0xd714e48d -//.word 0x309dc9a2 -//.word 0xecbdaf56 -//.word 0xdc0ba809 -//.word 0x2f0fe5b3 -//.word 0x4e9cc0d5 -//.word 0x046000b0 -//.word 0xe2ba59b6 -//.word 0xe2cb333e -//.word 0x4ad0ad7b -//.word 0xd3afe0af -//.word 0x0bcf689c -//.word 0xf82d213b -//.word 0xfead2eb1 -//.word 0x02ae407f -//.word 0xd0e014f9 -//.word 0xba5a3ef9 -//.word 0x82e726d4 -//.word 0x7ba1508d -//.word 0xeac2e049 -//.word 0xb2b65d03 -//.word 0x3175b581 -//.word 0x650f8187 -//.word 0x53888b4a -//.word 0xa9e78d27 -//.word 0xa28a3c95 -//.word 0x2abc8559 -//.word 0x438a17f9 -//.word 0xa7d22172 -//.word 0xae9c5d2d -//.word 0x73ad4d30 -//.word 0x325ac592 -//.word 0xf59ba931 -//.word 0x7060f8a7 -//.word 0x29280979 -//.word 0xdccf1592 -//.word 0x1da7f6f0 -//.word 0x3fcb2e9e -//.word 0x75b02be2 -//.word 0x37fdcab7 -//.word 0xe79d197d -//.word 0xb51261f0 -//.word 0xc00c6457 -//.word 0x7d3ae3fd -//.word 0x5d6063e5 -//.word 0xaaaa31ba -//.word 0xb240a405 -//.word 0x281aa2a3 -//.word 0xc7166575 -//.word 0x38477f59 -//.word 0x36901c59 -//.word 0xf0728823 -//.word 0xaf23f1b9 -//.word 0xb8e06d6a -//.word 0x74833f01 -//.word 0xce58563c -//.word 0xdd2d1680 -//.word 0xc3a85bca -//.word 0xd5debbe9 -//.word 0xfc200ceb -//.word 0x5a1826d5 -//.word 0x3116ea97 -//.word 0x01a4843e -//.word 0xf160ec6c -//.word 0x700bb305 -//.word 0x1cddfc2c -//.word 0xe31bc96e -//.word 0x68ec783c -//.word 0xa8698d9f -//.word 0xddf3b127 -//.word 0xa3c9fb25 -//.word 0x59d96f19 -//.word 0xcad7c46e -//.word 0x0c8d6b65 -//.word 0xa972cc50 -//.word 0xfd7dd300 -//.word 0xdf3bab80 -//.word 0x8420c904 -//.word 0x9f1b2d1c -//.word 0xcd6ce42d -//.word 0x31bad222 -//.word 0x5b60ae5f -//.word 0x6f094ef6 -//.word 0x837c251e -//.word 0x48b90ae1 -//.word 0xed443a14 -//.word 0x40c1a18c -//.word 0x17c1558f -//.word 0xeedc6489 -//.word 0xd100cf00 -//.word 0x7d08d6ca -//.word 0xc290767e -//.word 0x2b083128 -//.word 0xe1080d41 -//.word 0xcde3dfde -//.word 0xfd7fc927 -//.word 0x4964020b -//.word 0x3612d532 -//.word 0x1a98ed33 -//.word 0x8162cf08 -//.word 0xd053a8bf -//.word 0x28144971 -//.word 0x8dab7078 -//.word 0x484f49dd -//.word 0x897a3410 -//.word 0x5141c9dc -//.word 0x8fe11999 -//.word 0x8a9a37a4 -//.word 0x7ec0f80c -//.word 0x8a0ff68e -//.word 0xc93fdbc4 -//.word 0xc0d8dc99 -//.word 0xf8488300 -//.word 0xeb32b2e6 -//.word 0x250ae564 -//.word 0xa3dfb73a -//.word 0x7f77a879 -//.word 0xcfa11d7f -//.word 0xcac7a828 -//.word 0x2cc38a43 -//.word 0xdcf37643 -//.word 0xcc909837 -//.word 0x213bd6fd -//.word 0x95d956b2 -//.word 0x19a1406c -//.word 0xbe73c52c -//.word 0xd56c600e -//.word 0x55b75bc3 -//.word 0x7ea69641 -//.word 0xbc0184b9 -//.word 0xce9e76ca -//.word 0x27311cf4 -//.word 0x9566484f -//.word 0x202df67d -//.word 0x35558add -//.word 0x045d5801 -//.word 0x26876963 -//.word 0x832d7c53 -//.word 0x73584c34 -//.word 0x238f11e8 -//.word 0x3bed4989 -//.word 0xbd77b85a -//.word 0x30acaefd -//.word 0xff5d88e6 -//.word 0x1cbe790f -//.word 0xe8be8bed -//.word 0x5794e0a4 -//.word 0x4f9a3e77 -//.word 0x525fcb82 -//.word 0x5df714ab -//.word 0x109654d6 -//.word 0x0e5ef458 -//.word 0xa7744eae -//.word 0xb559b670 -//.word 0xc378bb80 -//.word 0x75fbaa87 -//.word 0x24e354a2 -//.word 0xc8581158 -//.word 0x1b3d05d0 -//.word 0xfb08a240 -//.word 0x10d16ea9 -//.word 0xb0a807c2 -//.word 0xff2c6431 -//.word 0x5b5a5d01 -//.word 0xf7a26e51 -//.word 0xc540b849 -//.word 0x9ac94853 -//.word 0x8d049c87 -//.word 0xa0fc6366 -//.word 0xa25385cc -//.word 0x53d96320 -//.word 0xca5d60ce -//.word 0x14c4a0f7 -//.word 0x1e581067 -//.word 0xd462a6c7 -//.word 0x8bfaea13 -//.word 0x9c1eb54f -//.word 0x52023876 -//.word 0x07a741b4 -//.word 0x89afbad4 -//.word 0xc37072fc -//.word 0x99472198 -//.word 0x132ea694 -//.word 0xbe9192ce -//.word 0x4f5eeacb -//.word 0x8a5c29a9 -//.word 0x62bd8554 -//.word 0x62f673fd -//.word 0x4bce6dc8 -//.word 0xffb5f3c5 -//.word 0x9d58d022 -//.word 0xee729e9f -//.word 0x00e58c41 -//.word 0x10095f4b -//.word 0xad44b76a -//.word 0x1bdb9430 -//.word 0xf60718c3 -//.word 0x174c8fd7 -//.word 0xbc06acd9 -//.word 0xe245156d -//.word 0xf6da231b -//.word 0xadb2e245 -//.word 0x3163605d -//.word 0x7d052455 -//.word 0x0a43fc56 -//.word 0xabb1fcb4 -//.word 0xb561c322 -//.word 0x64b10022 -//.word 0x7a6635c0 -//.word 0x29ffbb80 -//.word 0x33430795 -//.word 0x501d2b53 -//.word 0xd0a99fe7 -//.word 0x818f4246 -//.word 0xd3909c63 -//.word 0x3a5e66a5 -//.word 0xd4b14c98 -//.word 0x4c97f1e3 -//.word 0xfe0b347a -//.word 0x5ccab214 -//.word 0x90628be0 -//.word 0x638c6a73 -//.word 0x5dbbbf05 -//.word 0x2df54fde -//.word 0x4ce2ef0b -//.word 0xde238c55 -//.word 0xd9e46f74 -//.word 0x68b5bf7f -//.word 0x929548a7 -//.word 0x17507a25 -//.word 0x9a0cb571 -//.word 0x051ec4b5 -//.word 0x2a22a781 -//.word 0xa64a95c0 -//.word 0x0bf641eb -//.word 0x3e855d7c -//.word 0x1d6b5ca6 -//.word 0x65847d43 -//.word 0xd3a9050e -//.word 0x8a80cb12 -//.word 0xb598fa62 -//.word 0x6db5130b -//.word 0xdd683147 -//.word 0xa4e391f3 -//.word 0x7a0c5143 -//.word 0x17d078b5 -//.word 0x51ba3743 -//.word 0x84c46fdd -//.word 0x366d7216 -//.word 0xfb0b0e1e -//.word 0x9763c8f0 -//.word 0x637765cc -//.word 0xf29fafe8 -//.word 0xf3db7563 -//.word 0x5968d47a -//.word 0xba91b5fe -//.word 0xf5c89705 -//.word 0x18f58fe1 -//.word 0x810e8c4e -//.word 0x43e8e0ef -//.word 0xcb4dfcfc -//.word 0xc34e7b35 -//.word 0x36da631a -//.word 0xf590a75d -//.word 0x3ad2f098 -//.word 0x8c1b9c3c -//.word 0xe29207c9 -//.word 0x0bdf0a45 -//.word 0x4d3dc2e7 -//.word 0x4dd09313 -//.word 0x2e3a6c8b -//.word 0xfd694ce3 -//.word 0x4db20535 -//.word 0x1e244017 -//.word 0x0416c1ca -//.word 0x8503ecb4 -//.word 0xc2988810 -//.word 0x5a0ac4e5 -//.word 0x8bad7734 -//.word 0x9ac3ac76 -//.word 0x75915e46 -//.word 0x98b9805a -//.word 0x2dc341b7 -//.word 0x77fd8d25 -//.word 0x7085d7e1 -//.word 0xb1a41693 -//.word 0x935d0d7f -//.word 0x9446d0ff -//.word 0xfc978431 -//.word 0xc08166ed -//.word 0xa6c10ffa -//.word 0xaa74f681 -//.word 0xa02d36c1 -//.word 0x1c459105 -//.word 0x8f72b5d3 -//.word 0xb29bbf67 -//.word 0x28ebfe60 -//.word 0x5f25f9b8 -//.word 0xb737b3f9 -//.word 0xe6112dae -//.word 0x9bb72d18 -//.word 0x61953e23 -//.word 0xc614f898 -//.word 0xbd6a8194 -//.word 0x42b65439 -//.word 0x3c4c41a3 -//.word 0xa74db51e -//.word 0xf27c3c96 -//.word 0xa64c444f -//.word 0x493e24d6 -//.word 0x82695d37 -//.word 0x7e5a1f70 -//.word 0x911f0f26 -//.word 0x219f4797 -//.word 0xc02d9ed0 -//.word 0x985c2a1f -//.word 0x0c1404cc -//.word 0x9ce54b04 -//.word 0x099c6c16 -//.word 0xba14a0e2 -//.word 0x5f4fb68d -//.word 0xd4c5127a -//.word 0x48fcf676 -//.word 0x9e590033 -//.word 0x1336f4f8 -//.word 0x2235bc96 -//.word 0xa5d3ad9e -//.word 0x3c400cd1 -//.word 0xf26ed1d8 -//.word 0x1e67aa36 -//.word 0x88e5437a -//.word 0xcd1cc5b9 -//.word 0x05db9d3b -//.word 0xa2d37e75 -//.word 0x9b36a937 -//.word 0xcb856c27 -//.word 0x94a3e86e -//.word 0xc72d18b1 -//.word 0xc80e0f43 -//.word 0xed4d8199 -//.word 0x282a85fe -//.word 0xe66a9987 -//.word 0x36efe74a -//.word 0x2e8bc7cb -//.word 0x8a1684b7 -//.word 0x97be63d5 -//.word 0x509fe139 -//.word 0xc6943dbb -//.word 0xc54c36a7 -//.word 0xb4a016b6 -//.word 0xbd23ef3d -//.word 0x2efb25a5 -//.word 0x1ff02c1b -//.word 0x56c39388 -//.word 0x67c142c4 -//.word 0x1f970007 -//.word 0x236838a0 -//.word 0xd51dfce9 -//.word 0x77fd4a7a -//.word 0x937d8e9d -//.word 0x9a596902 -//.word 0xcbe3b1b4 -//.word 0x569bb94c -//.word 0xc201d265 -//.word 0x8ca7114f -//.word 0x118a5308 -//.word 0xada27f67 -//.word 0x25b80b9b -//.word 0x4278c2d4 -//.word 0xbfc7c440 -//.word 0x6657ce39 -//.word 0x7578bbbd -//.word 0x46314b1e -//.word 0x2f8f24fa -//.word 0xa83d166e -//.word 0xab55a387 -//.word 0x6176bff9 -//.word 0xfa17d414 -//.word 0xdc1a09f3 -//.word 0x01a4c4f7 -//.word 0x9a2d6d74 -//.word 0xf9d376a9 -//.word 0xadf498f6 -//.word 0xeffb5f49 -//.word 0x3d7ae8da -//.word 0x447aea18 -//.word 0x030ff3e2 -//.word 0x2e2ff4fb -//.word 0xd0c300b8 -//.word 0x35ff51fc -//.word 0x07ef8c66 -//.word 0xb75345c9 -//.word 0x1eadc6dd -//.word 0x65980c34 -//.word 0x225b136f -//.word 0xc3be54b1 -//.word 0x301d8b54 -//.word 0xacbabddb -//.word 0xfc577a28 -//.word 0xcc0560f0 -//.word 0x4e37e06b -//.word 0x241a4550 -//.word 0x8029f100 -//.word 0x8afcea01 -//.word 0x026096af -//.word 0x26adc32e -//.word 0xd654eaa3 -//.word 0xf6b8b5a4 -//.word 0x143fbeed -//.word 0x4aa89a54 -//.word 0x669f16ff -//.word 0x498ec0d4 -//.word 0x8db7aa31 -//.word 0x6b806add -//.word 0xdb0d653f -//.word 0xfc144ece -//.word 0xb7ede9c9 -//.word 0x9fe91528 -//.word 0x1ce509d2 -//.word 0xc91fde10 -//.word 0x1a484e42 -//.word 0x42dabbd1 -//.word 0x54ab7264 -//.word 0xa8c33257 -//.word 0x806ae869 -//.word 0xeb86bdb4 -//.word 0xea2452e3 -//.word 0xd2554a9f -//.word 0xf13b0a4a -//.word 0x7463bcf0 -//.word 0x88559a7a -//.word 0xc06a6925 -//.word 0xb7de4333 -//.word 0xf6269ae1 -//.word 0x18847a98 -//.word 0x2cd80e67 -//.word 0x5ab966b1 -//.word 0xcac47723 -//.word 0xc13464e9 -//.word 0x0db4fc22 -//.word 0xa4718391 -//.word 0x8872b595 -//.word 0xed2c085b -//.word 0x9e513252 -//.word 0x9deaebdf -//.word 0x09a5f453 -//.word 0x4570581a -//.word 0x5746f234 -//.word 0x8e492fea -//.word 0x681215b9 -//.word 0xb2458493 -//.word 0xf168bc47 -//.word 0x01f5203d -//.word 0xfcad3a66 -//.word 0x5e30fe73 -//.word 0x66cb5345 -//.word 0xbf91cfa5 -//.word 0x5fadc236 -//.word 0xb0f677a7 -//.word 0xedc4b62d -//.word 0xcf028d31 -//.word 0x6a855146 -//.word 0x519cdf5d -//.word 0x01e9273c -//.word 0x7d6fec2c -//.word 0x35ebc5f2 -//.word 0x2c686801 -//.word 0x5a0e27ee -//.word 0x503bbb24 -//.word 0x1ad541d9 -//.word 0x69de8241 -//.word 0xf2487701 -//.word 0x110b0de6 -//.word 0xb27625d7 -//.word 0x71c2df08 -//.word 0x00ed1871 -//.word 0xc9c6317f -//.word 0xd5441209 -//.word 0xed1b6f85 -//.word 0xff914a7c -//.word 0xc38eba3b -//.word 0x9df3eacc -//.word 0xc62d6424 -//.word 0xa70a909e -//.word 0x85cb77a8 -//.word 0x637acdbc -//.word 0x247e2f93 -//.word 0xf16ca995 -//.word 0xda207b93 -//.word 0xc00d1db8 -//.word 0x72d180bd -//.word 0x160c975d -//.word 0xcb731609 -//.word 0x8c207adc -//.word 0x572c49d1 -//.word 0x8f809b34 -//.word 0xa0e8d956 -//.word 0xe16ac585 -//.word 0xbed5ba3b -//.word 0x169c3596 -//.word 0xe2e59508 -//.word 0x18de1f50 -//.word 0xcf5045a9 -//.word 0xa3762841 -//.word 0x5b0f5bec -//.word 0xc9b2ea1a -//.word 0xf2629b07 -//.word 0x6f627331 -//.word 0x134a7c0f -//.word 0xce5bc600 -//.word 0xd110ac82 -//.word 0xf3f558a4 -//.word 0x54bc8abe -//.word 0x408e945f -//.word 0x569faa87 -//.word 0xe9055816 -//.word 0xa6ca5485 -//.word 0x774076d4 -//.word 0xa89405c3 -//.word 0x49a63445 -//.word 0xd318ec32 -//.word 0x0ea6cc3c -//.word 0x31b56f24 -//.word 0x4b2eed2e -//.word 0xe38ca4d2 -//.word 0xdb3438b4 -//.word 0x9b05d8d6 -//.word 0x6b31c30c -//.word 0x1f4b0bb1 -//.word 0xfaa19999 -//.word 0xcdcb7246 -//.word 0x5f84395f -//.word 0x11b9f45d -//.word 0xc2e01388 -//.word 0xf18bae22 -//.word 0x213d0ee2 -//.word 0x827c6fa4 -//.word 0xcd27045e -//.word 0x700a3c56 -//.word 0xebb04492 -//.word 0x7a78cd90 -//.word 0xf4eb0f38 -//.word 0xf34d0d0f -//.word 0x35721bad -//.word 0x42d49e71 -//.word 0x4fe21473 -//.word 0x639a54ba -//.word 0xb85916b0 -//.word 0x64f2b5d2 -//.word 0x38fe34ac -//.word 0xe9748005 -//.word 0x6d7af457 -//.word 0xa87a2282 -//.word 0x4877d1c0 -//.word 0xeea242dc -//.word 0x8e28b89f -//.word 0x184f368c -//.word 0x58c18bcd -//.word 0x1b278c6c -//.word 0x93faa1c6 -//.word 0xfc96833d -//.word 0x8091432e -//.word 0x584a8f23 -//.word 0x35c53149 -//.word 0xdeb6d824 -//.word 0x1adb1b81 -//.word 0xd08fbbac -//.word 0x6d9d28e4 -//.word 0x8652470c -//.word 0xbfd673a3 -//.word 0xebbcc2f6 -//.word 0x74d78994 -//.word 0xfd4f2203 -//.word 0x47f5ecb1 -//.word 0x51d4942d -//.word 0xc4089397 -//.word 0x8dd4f856 -//.word 0xccee6808 -//.word 0xed1d63bf -//.word 0x1406c86a -//.word 0xbf439c91 -//.word 0xa7b60746 -//.word 0xe71d9f58 -//.word 0x5fe6eac9 -//.word 0x5b441d82 -//.word 0x70822a46 -//.word 0xa798fae5 -//.word 0xdefcf7b2 -//.word 0x6abace36 -//.word 0x01c77326 -//.word 0xd8926593 -//.word 0x08dd3361 -//.word 0x36cb3ffa -//.word 0x733ac243 -//.word 0x615210d0 -//.word 0x975e1e54 -//.word 0x47db415b -//.word 0x1ecf383b -//.word 0x6c5d6d47 -//.word 0x85957847 -//.word 0x6791e525 -//.word 0x9dbd37e9 -//.word 0x63762ce7 -//.word 0x0ad74337 -//.word 0x9ecf7c66 -//.word 0xc7775f6b -//.word 0xeda33fdd -//.word 0x9fb8c063 -//.word 0x36bd976b -//.word 0xb5b4911f -//.word 0xf42ad794 -//.word 0xfe0d7045 -//.word 0xb7be07c1 -//.word 0xc267efa0 -//.word 0xa18f64bb -//.word 0x1eeb149d -//.word 0xea77de34 -//.word 0x85c6d9cc -//.word 0x5d96983f -//.word 0x3aa8ac65 -//.word 0xd9cf6bd2 -//.word 0xd746f0c1 -//.word 0xd246634b -//.word 0xcad87bdd -//.word 0xcde940e8 -//.word 0xd39c16da -//.word 0xe7e4f74e -//.word 0x8751007f -//.word 0x4e2a2f03 -//.word 0xd0bd6bb6 -//.word 0xc6f3c4f4 -//.word 0x6b27fd0b -//.word 0x253847ef -//.word 0x68dd5030 -//.word 0xd7397c2a -//.word 0xadb0727c -//.word 0x5cf8dbbb -//.word 0x74736667 -//.word 0xc5bc101d -//.word 0xc880a20f -//.word 0x3b8f7bb2 -//.word 0x0c328fb6 -//.word 0x78c0b03b -//.word 0x746c0d42 -//.word 0x4c61f861 -//.word 0x8a11ecbc -//.word 0x19c9ce30 -//.word 0xaa8973d1 -//.word 0x57146397 -//.word 0x8643dc54 -//.word 0x119e1ae9 -//.word 0xa42dd6ba -//.word 0x668c0d5f -//.word 0xdb3e029d -//.word 0x09438694 -//.word 0xd9ed7739 -//.word 0xc1ef8707 -//.word 0xa0b73ef2 -//.word 0xe9fe439d -//.word 0x049dd7cc -//.word 0xf1a2a21c -//.word 0x2fa3b2f2 -//.word 0xdc52c1b1 -//.word 0x1d52b630 -//.word 0xc0496f6b -//.word 0x2037be78 -//.word 0x4906b1bd -//.word 0x5d621761 -//.word 0x37ca3f00 -//.word 0x4de703a3 -//.word 0xdb1d05ef -//.word 0x3e61399c -//.word 0x9d4aa429 -//.word 0xcf6a63ce -//.word 0x79deeeb3 -//.word 0x77249e5f -//.word 0x7e2d6d73 -//.word 0xffb3fe98 -//.word 0x4ecdddb6 -//.word 0x03c10767 -//.word 0xa119adab -//.word 0x75f935dd -//.word 0xc1af82e5 -//.word 0x1a8c75b0 -//.word 0x0ff2b3dd -//.word 0x0bafa9b9 -//.word 0x7d89ce6e -//.word 0x351a2877 -//.word 0x11df1257 -//.word 0xda8b3c8b -//.word 0x69a1f3bd -//.word 0x0e41a33a -//.word 0x32429aa6 -//.word 0x3a820eef -//.word 0xaf7a627f -//.word 0x9c16a5b6 -//.word 0x38c35c97 -//.word 0xc5c981c1 -//.word 0xb8dbcba1 -//.word 0x1aec30e7 -//.word 0x2e45a936 -//.word 0x54d53520 -//.word 0x2dc82051 -//.word 0x005b850a -//.word 0x5dee12d2 -//.word 0x005a0b68 -//.word 0xf78691fb -//.word 0x0835259d -//.word 0x4d2268f6 -//.word 0x214f2435 -//.word 0x409a904c -//.word 0x2991d05d -//.word 0xc787bc6f -//.word 0x51e8e266 -//.word 0x6fc9ce32 -//.word 0x9ec38946 -//.word 0xd5025f4c -//.word 0x6999e517 -//.word 0x2e183bd9 -//.word 0xdf618f96 -//.word 0xbfb7e2d8 -//.word 0x81180fa5 -//.word 0x65cd09ae -//.word 0xa53f64c9 -//.word 0x0f0c17a1 -//.word 0xf35a80ac -//.word 0x3f6ca85e -//.word 0xe973c99d -//.word 0x8da60d74 -//.word 0x5894990b -//.word 0x24b9cad7 -//.word 0xe450be0e -//.word 0x4369175e -//.word 0x883bfbde -//.word 0xbdbb5f45 -//.word 0x106e865a -//.word 0x797bc4ab -//.word 0x9d048882 -//.word 0xf3b69a15 -//.word 0x259fa0fd -//.word 0xb940e7e9 -//.word 0xf0e46094 -//.word 0xee30e9f4 -//.word 0x1cfaceb5 -//.word 0xcb5f90e5 -//.word 0x1a0fe5f1 -//.word 0x19ecffd0 -//.word 0x2ed4117e -//.word 0xb8ba10ac -//.word 0xf3fcb7b6 -//.word 0x1cf0cdd5 -//.word 0xd5c0aa96 -//.word 0xca79f88a -//.word 0x955eb73f -//.word 0xdf828370 -//.word 0xc8961a79 -//.word 0x89ff190d -//.word 0x582c062b -//.word 0x8d26934e -//.word 0x026821e5 -//.word 0xbff28402 -//.word 0xd7990656 -//.word 0x8da1ae5d -//.word 0xbb8dc2d6 -//.word 0x75368a76 -//.word 0xe91b57dd -//.word 0x89f8c4c9 -//.word 0x6d9a3c8a -//.word 0xf2f1bcb6 -//.word 0xa867da1d -//.word 0x6b7007ff -//.word 0xcf62117d -//.word 0xc288ec4e -//.word 0x6c71b1b3 -//.word 0x5a8ee7ad -//.word 0xdcfd026d -//.word 0xab9f290c -//.word 0xcf703c7c -//.word 0xc01816bf -//.word 0xccbd0f56 -//.word 0xb81cc5fd -//.word 0xaad81d95 -//.word 0x47118462 -//.word 0x18397b76 -//.word 0x3223526d -//.word 0x165d335b -//.word 0xd6c06303 -//.word 0x7945c54a -//.word 0xa11ba0eb -//.word 0x6bf6a16b -//.word 0x97a92450 -//.word 0xe9f7af8e -//.word 0xcea6bf42 -//.word 0x43d6c8a2 -//.word 0xf3917734 -//.word 0x9fa33a3f -//.word 0xc3ac0280 -//.word 0x7773481d -//.word 0x937d4edf -//.word 0x16dfa79b -//.word 0xc950f9f1 -//.word 0x1f820239 -//.word 0x60b3d9bb -//.word 0x067f761e -//.word 0x68f87524 -//.word 0x95f81794 -//.word 0x83b68a77 -//.word 0x69986a86 -//.word 0x694887e4 -//.word 0x720ae909 -//.word 0x654d11fe -//.word 0x767f82d0 -//.word 0xd626803f -//.word 0x8f2d18b6 -//.word 0xaf7b6080 -//.word 0xa8cb0038 -//.word 0xf7b7f181 -//.word 0x041585f8 -//.word 0x4987a867 -//.word 0xb74e653c -//.word 0x555fac39 -//.word 0x2bb9526c -//.word 0x5ef55962 -//.word 0x9c1f7298 -//.word 0xbac4c032 -//.word 0x9c4cdfef -//.word 0x568a255d -//.word 0x90922749 -//.word 0x2fcb7f7a -//.word 0x3245cd9f -//.word 0xd94cfc85 -//.word 0x0d3dc78d -//.word 0xfc987b5e -//.word 0x0457fed7 -//.word 0xd27e1047 -//.word 0xcbf4d1e1 -//.word 0xaa91836a -//.word 0x6b789235 -//.word 0x69a7d151 -//.word 0xc3cc0701 -//.word 0x035aaa6c -//.word 0x02ddea96 -//.word 0x068bf28f -//.word 0x2e1b6aeb -//.word 0x10da4071 -//.word 0xa0fba818 -//.word 0x542e612f -//.word 0x85753adb -//.word 0x1933d6c6 -//.word 0x5f86ac16 -//.word 0x3ad7519c -//.word 0x82b0fa4e -//.word 0xa7cd3df8 -//.word 0x9775172e -//.word 0xe20b3385 -//.word 0x1ce06903 -//.word 0x844b86d3 -//.word 0xe2fc4b3d -//.word 0xb68db8d6 -//.word 0x8e5a8af4 -//.word 0xb8930265 -//.word 0x198fe861 -//.word 0x5d63d0bc -//.word 0x51b49c60 -//.word 0x8cc942fb -//.word 0x55e4cff5 -//.word 0xc1d3aca5 -//.word 0x1cc220c4 -//.word 0x8a531722 -//.word 0xeef12297 -//.word 0x0b61be3d -//.word 0xea99d9dc -//.word 0x7bd692a6 -//.word 0x7ee94125 -//.word 0xa4d1b771 -//.word 0xf28fc7a6 -//.word 0x67360595 -//.word 0xde42cdba -//.word 0x362a876f -//.word 0xaf392a5e -//.word 0x9799ff3c -//.word 0x27b1a8b5 -//.word 0xa8b160a2 -//.word 0xd96a8482 -//.word 0x95645328 -//.word 0xb12af2b1 -//.word 0x24e9b2b9 -//.word 0x6a3996cf -//.word 0x2a3b1025 -//.word 0x16e40c8c -//.word 0x12982fa0 -//.word 0x99fb6140 -//.word 0x5d048942 -//.word 0x2e539764 -//.word 0x1dc4c885 -//.word 0xe1442515 -//.word 0x7ae34eca -//.word 0x142b7594 -//.word 0x2db0add4 -//.word 0xfae965c9 -//.word 0x073e2f4a -//.word 0x1f62c7bb -//.word 0x6be3503a -//.word 0xdd00e019 -//.word 0xd0ba3f91 -//.word 0xe82eecb4 -//.word 0x402161a4 -//.word 0xc4dd9803 -//.word 0xdb3cceaa -//.word 0x4a02879e -//.word 0x556fd23f -//.word 0x2615cec3 -//.word 0x73e86de3 -//.word 0x5c9478d4 -//.word 0x9213d479 -//.word 0xbe7e03d7 -//.word 0x2123edc9 -//.word 0x77d9e1f5 -//.word 0x2290d7fe -//.word 0x842cf8fc -//.word 0xad946029 -//.word 0x360522dc -//.word 0x6cad8cbc -//.word 0xb275ad2d -//.word 0x201e150f -//.word 0x708fdca8 -//.word 0x1b6de6de -//.word 0xbfed64aa -//.word 0xc4e69ec9 -//.word 0x3f2bf1b5 -//.word 0x161713d3 -//.word 0x66699fee -//.word 0x2152cde4 -//.word 0xfccd809f -//.word 0x882f8747 -//.word 0x9eff1cb6 -//.word 0x0107b12d -//.word 0x3fabed45 -//.word 0xd87af128 -//.word 0xa203df00 -//.word 0x6cea9db0 -//.word 0xe23bd6c3 -//.word 0xb1fd42a1 -//.word 0xeb0b2809 -//.word 0xac1f21bb -//.word 0xfe301e75 -//.word 0xfafeac21 -//.word 0x30eb774d -//.word 0x490c0ddb -//.word 0xeb80e5fa -//.word 0xdd00a055 -//.word 0x6cb88e8a -//.word 0x0d5574dd -//.word 0x43608d2e -//.word 0xc3cace28 -//.word 0xd7c86ebc -//.word 0x00e1a6cd -//.word 0xdf44b62d -//.word 0x556028c9 -//.word 0xeaaf5820 -//.word 0x6bd234fa -//.word 0xd7e34156 -//.word 0x7d07dfa4 -//.word 0x5e42cd34 -//.word 0xd890efef -//.word 0x86314f45 -//.word 0x62446366 -//.word 0x2c978eb5 -//.word 0x10bee879 -//.word 0x836242d6 -//.word 0x6edc65fd -//.word 0x8e029b9f -//.word 0x1a4171a7 -//.word 0xa7edba28 -//.word 0x4ad4d794 -//.word 0xfc193630 -//.word 0x424019c4 -//.word 0x0d859997 -//.word 0xde72ea9a -//.word 0x2fb0e0e4 -//.word 0x0f1eb25e -//.word 0x0c20ffc0 -//.word 0x553a0ebc -//.word 0x20dd5a78 -//.word 0x4a804e42 -//.word 0x3df34d80 -//.word 0x17f0f5e5 -//.word 0x09f4a5eb -//.word 0xfc4c3c7d -//.word 0x7b7324f3 -//.word 0xcd9b9044 -//.word 0x618a0177 -//.word 0x70a70f5b -//.word 0xdd556678 -//.word 0x607f0f45 -//.word 0xe374f19c -//.word 0x2cf6976a -//.word 0xbd8d33ab -//.word 0xf822e396 -//.word 0x87c83414 -//.word 0xfbdde577 -//.word 0xb352ed69 -//.word 0x0047be22 -//.word 0x86dbccdf -//.word 0xe642498f -//.word 0x9a1833cf -//.word 0x20f49118 -//.word 0x5a41fa37 -//.word 0x354956fe -//.word 0x8993e93a -//.word 0x406f8de5 -//.word 0xbbcf3e9c -//.word 0x7158dc53 -//.word 0xd9b92d47 -//.word 0x8b3c2234 -//.word 0xa29a5bc8 -//.word 0x6414ec58 -//.word 0x25bf62d3 -//.word 0x682001f4 -//.word 0x48f850bb -//.word 0x1661d81d -//.word 0x441a28fb -//.word 0x81201c51 -//.word 0x267e5fb0 -//.word 0xd1652fee -//.word 0x4f7f601c -//.word 0xc081a4b8 -//.word 0xf5000924 -//.word 0x1d85c357 -//.word 0xa1e32cd3 -//.word 0x4cc809d6 -//.word 0xaf930fd5 -//.word 0xc465a626 -//.word 0xd17becfd -//.word 0x8fbbfd99 -//.word 0x8c8c72bf -//.word 0xceeb2768 -//.word 0xb9bc42b7 -//.word 0x335d702d -//.word 0x05817220 -//.word 0x843cd969 -//.word 0x725a0d5e -//.word 0x1ff59400 -//.word 0xd3479175 -//.word 0x70bc8bb8 -//.word 0x544b708f -//.word 0x7d07dabd -//.word 0xf0f19079 -//.word 0x5b115020 -//.word 0xf9c5cc27 -//.word 0xb658f253 -//.word 0x94d6702c -//.word 0x4d1f78af -//.word 0x3a3bc043 -//.word 0x73edceee -//.word 0x388b72c9 -//.word 0x8f0c94b1 -//.word 0x2f632f40 -//.word 0x9d0c9efb -//.word 0x95e417cd -//.word 0xab3d75b5 -//.word 0x32323abb -//.word 0x5d38d428 -//.word 0xa4f61ff6 -//.word 0x69572c86 -//.word 0xdcdd4191 -//.word 0x1c382061 -//.word 0x9f178c41 -//.word 0xd33e0a32 -//.word 0x05d8e5df -//.word 0x830f74d3 -//.word 0xfddb9fea -//.word 0x3117a005 -//.word 0xc8da0702 -//.word 0x7a0401ec -//.word 0x7917d96e -//.word 0x0d49bf8e -//.word 0x7bd7c998 -//.word 0x2c9b3757 -//.word 0x0be1fb8b -//.word 0x2f777998 -//.word 0xba038b7c -//.word 0x0199c803 -//.word 0xed8d063e -//.word 0xa1861d31 -//.word 0x5cd4eecc -//.word 0xa104a41d -//.word 0x96b13ac3 -//.word 0xab9d3ea6 -//.word 0x7b00d4e5 -//.word 0xf71ffd10 -//.word 0xc1211998 -//.word 0xd61eab83 -//.word 0x707a5d64 -//.word 0x2b71448b -//.word 0x66f26479 -//.word 0xecb17797 -//.word 0xd478ea27 -//.word 0xa5bd297a -//.word 0xbe7a1c63 -//.word 0xf539f1ed -//.word 0x7f6e1d49 -//.word 0x100a9d0a -//.word 0x424d8295 -//.word 0x3bdcacd2 -//.word 0x8a13d628 -//.word 0x539cd3a9 -//.word 0xac411689 -//.word 0x46fe78d5 -//.word 0x505b3661 -//.word 0x98f93903 -//.word 0xf46a9bfe -//.word 0xe04566c1 -//.word 0x687a9fd2 -//.word 0x49e48305 -//.word 0x531d10f1 -//.word 0x1196c7a4 -//.word 0xace7b196 -//.word 0x0d63a0dc -//.word 0x42f0b79e -//.word 0x23162ccb -//.word 0x35554d0b -//.word 0xcebcc1f6 -//.word 0x7ab71183 -//.word 0x9e2967c3 -//.word 0x5bba95cf -//.word 0xb57358ff -//.word 0xf588de5c -//.word 0x4b748758 -//.word 0xb84be9bd -//.word 0x2b4c16e4 -//.word 0xebb62127 -//.word 0x34dede98 -//.word 0x257deaf4 -//.word 0xda4eebd2 -//.word 0xd5d91920 -//.word 0xa289fed0 -//.word 0xba0579cf -//.word 0xa9bd0937 -//.word 0x6cc348c5 -//.word 0x1dddb68d -//.word 0xd2d8b8ec -//.word 0xc21fe1bf -//.word 0xa98c6fd2 -//.word 0x6e7d199c -//.word 0x032b0829 -//.word 0x8e372357 -//.word 0xc6868f45 -//.word 0x9f4f7609 -//.word 0x297208a1 -//.word 0xb50cc02c -//.word 0x3b48e95b -//.word 0xf8786022 -//.word 0x5b649bb3 -//.word 0x22e1eaac -//.word 0xc1a6fd8f -//.word 0x035ca774 -//.word 0xf3f4e1fa -//.word 0xfd3d1283 -//.word 0x51b68ea1 -//.word 0x88a15ccb -//.word 0x8a583c55 -//.word 0xafe4e89f -//.word 0x24cc9b8c -//.word 0x912bd035 -//.word 0xf8054cdf -//.word 0xe1db5e2b -//.word 0xb47d668d -//.word 0x662094ff -//.word 0x57b0f2f7 -//.word 0x7b68a596 -//.word 0xb99f7022 -//.word 0x90e579b6 -//.word 0x004e5038 -//.word 0xa80e2d8c -//.word 0x2c467907 -//.word 0xd91e9027 -//.word 0x8c14c681 -//.word 0xcf94a8fa -//.word 0x46c8843a -//.word 0x4ab12b5e -//.word 0xd377f5ed -//.word 0x9bfd060e -//.word 0x80b9d0f8 -//.word 0x2ac3d9a9 -//.word 0xef2bbedb -//.word 0xf3907934 -//.word 0x94eedfbd -//.word 0x05b86c95 -//.word 0x382743e7 -//.word 0x02d17119 -//.word 0x7a7d7246 -//.word 0xa236f6ef -//.word 0x499ee5ed -//.word 0x2f85a0aa -//.word 0x6bba8a91 -//.word 0x0a21c7c3 -//.word 0xf906430c -//.word 0x25b1f615 -//.word 0xe03b67db -//.word 0x87a06f5f -//.word 0x611440a0 -//.word 0xcb9ba5c6 -//.word 0x92d48ca0 -//.word 0xa115c150 -//.word 0xdcbdfc45 -//.word 0x4bc61e6a -//.word 0x7b9ab89d -//.word 0x2128cd63 -//.word 0x0136d9da -//.word 0x0ef911ef -//.word 0xd3e3edd0 -//.word 0x11bce4a5 -//.word 0xaaf4767b -//.word 0xbd387080 -//.word 0x13436c76 -//.word 0xbaf79762 -//.word 0xefacb784 -//.word 0x42c86c8c -//.word 0xf48fb50b -//.word 0xa43db728 -//.word 0x2a52ba94 -//.word 0xc42e75c0 -//.word 0x70dd8b4d -//.word 0x983455c4 -//.word 0xf41de287 -//.word 0xad2f3c07 -//.word 0xbe82ed38 -//.word 0xa0c1c242 -//.word 0x2680cf7a -//.word 0xa6d0b390 -//.word 0x59111e09 -//.word 0x040890f0 -//.word 0xd83263c9 -//.word 0x97570bc7 -//.word 0xf9619d3f -//.word 0x4e6f8e5b -//.word 0x6426bd13 -//.word 0xab47b459 -//.word 0x97872b94 -//.word 0x469bce50 -//.word 0x63924134 -//.word 0x4a676034 -//.word 0x6dd7cb08 -//.word 0xf670a2dc -//.word 0xaeeb8d49 -//.word 0x1dbb0084 -//.word 0xf3e6bdd5 -//.word 0xa6149a4b -//.word 0x5de584af -//.word 0x0d88c4b6 -//.word 0xe18a817a -//.word 0xe0eb862b -//.word 0xca774602 -//.word 0x42531d77 -//.word 0x32d7d9b4 -//.word 0x6c9b7949 -//.word 0x8dd53521 -//.word 0x27e2beb5 -//.word 0x1f22c67f -//.word 0x5309c3b2 -//.word 0x8073f028 -//.word 0x6438959c -//.word 0x1f018919 -//.word 0xdf5af5b2 -//.word 0xbc085a74 -//.word 0xe19cd699 -//.word 0xed48a3fe -//.word 0x99f2e0d8 -//.word 0x9a8794a2 -//.word 0xc992f05a -//.word 0x810dd4ec -//.word 0x487695ef -//.word 0xb226fe8f -//.word 0x83df94ca -//.word 0x14a41ee0 -//.word 0xf8cd6504 -//.word 0xde5a3958 -//.word 0xb988b418 -//.word 0x1fa2c315 -//.word 0xef1ae166 -//.word 0x37d8265a -//.word 0x55d281b1 -//.word 0x5cdd420b -//.word 0xb9c2dba0 -//.word 0x1695e732 -//.word 0x7e426b40 -//.word 0xc2695c7d -//.word 0x1c6c6280 -//.word 0x13c6dcbd -//.word 0x9e9e24b4 -//.word 0x8c9b1468 -//.word 0x23fbc913 -//.word 0x08dfa618 -//.word 0x5fe99c39 -//.word 0x3209a90a -//.word 0x17949fa5 -//.word 0x0d9727a0 -//.word 0xa86a053c -//.word 0x6e889edf -//.word 0x809db7c5 -//.word 0x7de17ff2 -//.word 0xa3a5d06b -//.word 0x372bb2a5 -//.word 0x27bb213e -//.word 0xeff310eb -//.word 0xb95fadb2 -//.word 0xc84ae759 -//.word 0x16d32d1e -//.word 0x3c4379a8 -//.word 0x939d8e3e -//.word 0x99777e37 -//.word 0x96096eb1 -//.word 0x7f849d86 -//.word 0x1aa5a37c -//.word 0x6389f7bc -//.word 0x2fc3b486 -//.word 0x0fac9d22 -//.word 0x77fa5e1a -//.word 0x1f9415a6 -//.word 0xaaa51068 -//.word 0x86efd859 -//.word 0x13636f04 -//.word 0x07eed7f2 -//.word 0x1195d365 -//.word 0xbcc4f249 -//.word 0x97e3c867 -//.word 0x932b7fdc -//.word 0xacb88fc9 -//.word 0xcbdfc94d -//.word 0xebc19ab0 -//.word 0x7b208ee1 -//.word 0x04721323 -//.word 0x0c348003 -//.word 0x3a81558d -//.word 0xbbe3c4bf -//.word 0xe369713e -//.word 0x18fa7748 -//.word 0xece8abea -//.word 0x89c82473 -//.word 0x5282fb28 -//.word 0xc7a44f39 -//.word 0xa9fc8cf4 -//.word 0x5f65ed39 -//.word 0x99e1402e -//.word 0x33e8ea33 -//.word 0x5c002a19 -//.word 0xf78ea28e -//.word 0x41ec13dc -//.word 0xb5bb68d4 -//.word 0x2d7bf604 -//.word 0x49590231 -//.word 0x14478301 -//.word 0xe5522af7 -//.word 0x8430a0a4 -//.word 0x8e190f1c -//.word 0x1bd9e3a8 -//.word 0x9d22d2ba -//.word 0x0c261926 -//.word 0x4065098e -//.word 0x9ec4c31e -//.word 0xf6e0407a -//.word 0xaca194f5 -//.word 0x16127304 -//.word 0x2670f4f2 -//.word 0x498195d5 -//.word 0x8e267fc0 -//.word 0x0b340c3a -//.word 0x7d8087ef -//.word 0x2e3933a6 -//.word 0x1c7b8e73 -//.word 0x5720d62e -//.word 0xabdacd23 -//.word 0x7f7fba0b -//.word 0xfda3b03c -//.word 0x736c121c -//.word 0xf9a257db -//.word 0x55060b62 -//.word 0x1be51686 -//.word 0x19ec4182 -//.word 0xf13ef6a4 -//.word 0x08c44746 -//.word 0x9fc43300 -//.word 0x40b6241c -//.word 0x5c53bb4a -//.word 0x32eed095 -//.word 0xf207b596 -//.word 0x231ebbe8 -//.word 0x42c5f8dc -//.word 0xacf9476d -//.word 0xbeb28f76 -//.word 0x3ab94922 -//.word 0xecba3ca4 -//.word 0x8e9a8b29 -//.word 0xea0af20b -//.word 0x3e5d4d48 -//.word 0xe4965a32 -//.word 0x32c6bf68 -//.word 0xa0954f04 -//.word 0x281e8000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x0000E8F0 -//// expected output -//.word 0x338a39c7 -//.word 0x89636826 -//.word 0xa3962145 -//.word 0x78166eb9 -//.word 0x87b5f0b9 -//.word 0x1ccdccf3 -//.word 0x63ec13ad -//.word 0x2262ce86 -//.word 0x9fad36cd -//.word 0x3eb7f89f -//.word 0xea6b8135 -//.word 0xe2b2b24b -//.word 0x9b0a2be7 -//.word 0xe57db132 -//.word 0x6c370dd7 -//.word 0x424e2a85 -//// SHA512LongMsgvector_75 -//// vector length -//.word 0x0000EC08 -//// input message -//.word 0x0468d384 -//.word 0x87677dca -//.word 0x2a631b79 -//.word 0xc1f0c0e6 -//.word 0xa11d0ec1 -//.word 0x064bb190 -//.word 0xb23f2c5b -//.word 0xd775d8a9 -//.word 0x37b729ac -//.word 0x8aef34b9 -//.word 0x203a6efb -//.word 0xc73db767 -//.word 0xefbc97f2 -//.word 0x0c68c702 -//.word 0x3cf9f323 -//.word 0x2a7dbefc -//.word 0x32f00781 -//.word 0xc60c6a6a -//.word 0x10620ae3 -//.word 0xd8aa8e85 -//.word 0xa9586a85 -//.word 0x2f70602b -//.word 0xe49a4686 -//.word 0xec79095f -//.word 0x3c39f26b -//.word 0x026728c4 -//.word 0x4106779a -//.word 0xbcdf4f26 -//.word 0x161810e0 -//.word 0x370884f2 -//.word 0xf24aadec -//.word 0xe410c2b9 -//.word 0x9fba74d2 -//.word 0x08a875b1 -//.word 0xfd4c3b89 -//.word 0x3b830234 -//.word 0x7f25106d -//.word 0xecda3c3f -//.word 0xad30b1bd -//.word 0xdbebf0f4 -//.word 0xa19d141e -//.word 0x9e765a19 -//.word 0x8a5ce017 -//.word 0x1d3ead96 -//.word 0x2ca6f293 -//.word 0x168e8ffa -//.word 0x5e75d962 -//.word 0x99b29bf7 -//.word 0x8b075bb7 -//.word 0x8d79dee2 -//.word 0x315feeab -//.word 0x29ba5a34 -//.word 0x65c43fb9 -//.word 0x7ccc860c -//.word 0x4d40ae41 -//.word 0xe60ccbaa -//.word 0xa522cf06 -//.word 0x9c5a09f5 -//.word 0x3a7debaf -//.word 0x289c10f6 -//.word 0x72a77e49 -//.word 0xe73b285b -//.word 0xc2bab7c3 -//.word 0x8aa189f5 -//.word 0x3616fa71 -//.word 0x95c1e33a -//.word 0xeddd618a -//.word 0xe38fd8c4 -//.word 0x9a7637aa -//.word 0x1f837dd0 -//.word 0x050b7c50 -//.word 0x4c1adcc0 -//.word 0x880b6461 -//.word 0x3e557599 -//.word 0x92a8d7a4 -//.word 0x1f39b986 -//.word 0x275af244 -//.word 0xec4d8d53 -//.word 0x5d5a8551 -//.word 0xf51fcdf3 -//.word 0xe128933f -//.word 0x61bfc6fb -//.word 0x7005d665 -//.word 0xa742bb24 -//.word 0x5f7a387f -//.word 0x164161cd -//.word 0x14cf5b2c -//.word 0x4d576376 -//.word 0x8a951171 -//.word 0xc4a7de46 -//.word 0xd01de535 -//.word 0x4253e686 -//.word 0x8bff90c3 -//.word 0x64060024 -//.word 0x7094854b -//.word 0x1c6ba631 -//.word 0xcb7b6661 -//.word 0x30b3c664 -//.word 0xfa188c7c -//.word 0xb7144395 -//.word 0xf2108378 -//.word 0x9f457242 -//.word 0xbace8b14 -//.word 0x2a029e0d -//.word 0xeb021875 -//.word 0x6c8e853b -//.word 0x361d53a2 -//.word 0xcf2cd937 -//.word 0xded69806 -//.word 0x8fa5c00d -//.word 0x39a8f6f1 -//.word 0x3fc554f0 -//.word 0x3451b117 -//.word 0x42de23b5 -//.word 0xcc54c30f -//.word 0x5244b055 -//.word 0x957857d5 -//.word 0xfccff16f -//.word 0x37484c49 -//.word 0x225ccfc4 -//.word 0xec91b9ae -//.word 0x784ca9b9 -//.word 0x03e6632b -//.word 0x0803d1d8 -//.word 0x601f484d -//.word 0xae6a0d4f -//.word 0xfad61884 -//.word 0x9c6e176f -//.word 0x5ce9b6a2 -//.word 0xd77f1e2e -//.word 0x25fbbb5f -//.word 0xb81243a6 -//.word 0x87f3f4d7 -//.word 0x6c1f1d94 -//.word 0xcb7bdf09 -//.word 0x75a335db -//.word 0xcc82325a -//.word 0x27208afe -//.word 0x78ba5411 -//.word 0x2c180ea9 -//.word 0x521be2d9 -//.word 0x00962728 -//.word 0xf25e2b42 -//.word 0x75a530ee -//.word 0x8383b440 -//.word 0x30d6f610 -//.word 0x454cb5ab -//.word 0x2abe3bc7 -//.word 0x09c09abd -//.word 0x307636f2 -//.word 0xb7a98396 -//.word 0x63191092 -//.word 0xcb15c5bb -//.word 0xb94a694c -//.word 0xd3d96693 -//.word 0x7bacd1ea -//.word 0xf309a5e9 -//.word 0xc5674fda -//.word 0x6281706d -//.word 0x09aadeae -//.word 0xea60ec33 -//.word 0x8c23eb9a -//.word 0x6c88f033 -//.word 0xe789d8f9 -//.word 0x591f8ac7 -//.word 0x87137cc8 -//.word 0x3a107930 -//.word 0x2dfea129 -//.word 0x298bb110 -//.word 0x6f0a84e2 -//.word 0x5681daf1 -//.word 0x35fd59dc -//.word 0x8329d1bd -//.word 0x3d1fc4a4 -//.word 0x887e2645 -//.word 0x98bd61ed -//.word 0xd0bf9cbb -//.word 0x2ba73d0c -//.word 0xdaedac37 -//.word 0x2fb25a7b -//.word 0xb9500335 -//.word 0xb1363056 -//.word 0x94f3ff15 -//.word 0x129026e1 -//.word 0x2723369a -//.word 0x88a11d00 -//.word 0x40f4ef6c -//.word 0x9b4de6be -//.word 0x43bca796 -//.word 0xa9fec6c7 -//.word 0xa6968d08 -//.word 0x631ff9ed -//.word 0x76e00616 -//.word 0x4da12ca7 -//.word 0xd0bd2af7 -//.word 0x4279028d -//.word 0x68944548 -//.word 0xee1f90dd -//.word 0x068f5787 -//.word 0x5211e1f9 -//.word 0x041d9498 -//.word 0x444e73e7 -//.word 0xd271e542 -//.word 0xecdcb8d0 -//.word 0x720165b3 -//.word 0x48429681 -//.word 0xfc07e5f8 -//.word 0xa80ee7ed -//.word 0x1a036986 -//.word 0x3351f9a9 -//.word 0x8d37a9b4 -//.word 0x601e0f6f -//.word 0xa72a903f -//.word 0x7e0fdf9c -//.word 0xcf26c0c4 -//.word 0x2dc012b1 -//.word 0x00ba0c49 -//.word 0xe351c7d6 -//.word 0x4a38fcb5 -//.word 0x68e81052 -//.word 0x50384d54 -//.word 0x5a2d7314 -//.word 0xc8136f54 -//.word 0xa9cc6a2e -//.word 0xfe69054a -//.word 0x1cf7e354 -//.word 0x519b69ad -//.word 0xcae2c161 -//.word 0xb452255a -//.word 0xa2455ad3 -//.word 0x2ff77a0f -//.word 0xe4ddf74a -//.word 0x5c38ddf0 -//.word 0xa5eb570d -//.word 0xea897504 -//.word 0x4fb32c85 -//.word 0x1da19fb9 -//.word 0x1ffe9cbf -//.word 0x4cf96a5c -//.word 0xa599c2ee -//.word 0x61501ba2 -//.word 0x48d42be7 -//.word 0x5d2aaa23 -//.word 0xbf0359a4 -//.word 0xd14c43d9 -//.word 0x990142c2 -//.word 0x6642c6a5 -//.word 0xb6a8d203 -//.word 0x56d947ca -//.word 0xcb5a65cc -//.word 0xf1a58f70 -//.word 0xe27c4ea7 -//.word 0x197c9922 -//.word 0xd8f554c3 -//.word 0xc6f91651 -//.word 0xddb32f6f -//.word 0x83faeacf -//.word 0xf7260fa3 -//.word 0xef23ac54 -//.word 0x80c41577 -//.word 0x3d592afd -//.word 0xa383d8a9 -//.word 0xb547e3c8 -//.word 0xe362e21c -//.word 0x30dc8b19 -//.word 0x94e03054 -//.word 0x9fcb8a38 -//.word 0x6083b6fa -//.word 0x850a7dd0 -//.word 0xc353d85e -//.word 0x7954b371 -//.word 0x905cf2f0 -//.word 0xa5a7b210 -//.word 0x6a30d1c6 -//.word 0x49c6b082 -//.word 0x4b62371a -//.word 0x39b81a04 -//.word 0x010c5bc9 -//.word 0x5a4711b6 -//.word 0xab4a67d5 -//.word 0x2982e71c -//.word 0x40bcf9e3 -//.word 0x353ba69c -//.word 0x0908a2be -//.word 0xa08a8a02 -//.word 0x23566ad2 -//.word 0xa24882fe -//.word 0xfed34ab2 -//.word 0x0695b3a5 -//.word 0xe02fb092 -//.word 0xab53f5ec -//.word 0x621ffece -//.word 0x03a95431 -//.word 0xf1db0c61 -//.word 0x978190b2 -//.word 0x4fa0a26e -//.word 0x82099d13 -//.word 0x102ffebb -//.word 0xf23624dc -//.word 0x1e4c5431 -//.word 0xaa3c00f8 -//.word 0x3540495e -//.word 0x8317c238 -//.word 0x675877f3 -//.word 0xe6062ece -//.word 0x9964ec46 -//.word 0x530bbbd2 -//.word 0x0439abd1 -//.word 0xdd6c17c1 -//.word 0xb53029b1 -//.word 0xac35a0f9 -//.word 0x0ea4d128 -//.word 0x7ab3ec3e -//.word 0x4378811c -//.word 0x16fa4338 -//.word 0xdd8e0b95 -//.word 0xe46120f3 -//.word 0x3a51b543 -//.word 0x5b01b35d -//.word 0x0b2cb9f5 -//.word 0x853961cb -//.word 0xd510c623 -//.word 0x832d4375 -//.word 0x71f27d65 -//.word 0x0642a3f5 -//.word 0x8c4bf4fa -//.word 0xd7a382cd -//.word 0x28973642 -//.word 0x51c015de -//.word 0x19d7c144 -//.word 0xe1c943f1 -//.word 0x880e0729 -//.word 0x8d372831 -//.word 0x73c7efbf -//.word 0x6a4496af -//.word 0x2b8e51f7 -//.word 0x246f8fdd -//.word 0xd5727c68 -//.word 0x7af9cb14 -//.word 0xea8ab4c9 -//.word 0xbf6a380e -//.word 0xb76dac7b -//.word 0x5a0c756c -//.word 0xddb811fd -//.word 0x476e5732 -//.word 0xd28cff75 -//.word 0x94e36446 -//.word 0x5e0d892e -//.word 0xe5005af4 -//.word 0x1fe43514 -//.word 0xf022a96d -//.word 0x06be7e3a -//.word 0x02e6f543 -//.word 0xd8cb5055 -//.word 0x78af95ef -//.word 0xae3f903e -//.word 0x4624174b -//.word 0x75d59274 -//.word 0x74afba19 -//.word 0x6e47a097 -//.word 0x9cfff17a -//.word 0xafd779ee -//.word 0x6e86e777 -//.word 0xa0cad0e2 -//.word 0x2cfcf67c -//.word 0x7fe7c981 -//.word 0x2eda2ed7 -//.word 0xdcfc80fc -//.word 0x5fe0d43e -//.word 0x1e59822a -//.word 0xbd90e146 -//.word 0xfd535103 -//.word 0xddb07fed -//.word 0x06c3e425 -//.word 0x65cc8f11 -//.word 0x1a842552 -//.word 0x91b226f6 -//.word 0xeef971ef -//.word 0xaff40bc4 -//.word 0x8c851c87 -//.word 0xa2693a07 -//.word 0xd110ea46 -//.word 0x63ac642e -//.word 0xee89977f -//.word 0x7b9c6d0c -//.word 0xe75e5027 -//.word 0x8adbed5a -//.word 0x17053858 -//.word 0xc34fb032 -//.word 0xaa77e4ce -//.word 0x6ea33696 -//.word 0x21b0df6d -//.word 0x65c733e7 -//.word 0xd13126b9 -//.word 0x976c106e -//.word 0x647ead5c -//.word 0x888968d7 -//.word 0x57a0d9a4 -//.word 0xcfd98cb0 -//.word 0x7ba30402 -//.word 0x965affef -//.word 0x7419fc8d -//.word 0x1ed0fb6a -//.word 0x3d96847d -//.word 0x3940ea5c -//.word 0xa132d1b0 -//.word 0xce75eee6 -//.word 0xc30a0e28 -//.word 0x587e5a8c -//.word 0x98bfd98b -//.word 0x672e36b4 -//.word 0x68f5c4a1 -//.word 0x1d9bbf2b -//.word 0x50d6d5da -//.word 0xb2a0e49f -//.word 0xc38c06c6 -//.word 0xf15bcb26 -//.word 0x04cac59b -//.word 0xb9af4ab6 -//.word 0xad4475b2 -//.word 0x7dc36eaa -//.word 0x2c33eb0a -//.word 0xc581f744 -//.word 0x41d2f3c4 -//.word 0xaa18da25 -//.word 0x81e3c9a5 -//.word 0x5e7bbed6 -//.word 0xd62b9f97 -//.word 0xa1df7f43 -//.word 0xfcf21e28 -//.word 0x4d41ae3b -//.word 0x0684dd09 -//.word 0xcbde0ff1 -//.word 0xd7b2eb91 -//.word 0x9cb91a7e -//.word 0xa9514b38 -//.word 0xd1187b5d -//.word 0x8aba731c -//.word 0x930792ed -//.word 0xda49cc7f -//.word 0x9cd4f3f2 -//.word 0xcede3547 -//.word 0xbc91e715 -//.word 0xf05f817d -//.word 0x5596e95f -//.word 0x9c34f4ce -//.word 0xdffc2ac2 -//.word 0x84c9c90d -//.word 0x65230d91 -//.word 0x2d10afaf -//.word 0x052cab03 -//.word 0x71fc474e -//.word 0x748051b3 -//.word 0xfb07a827 -//.word 0x7947fe23 -//.word 0xceaddb9b -//.word 0x6df2e534 -//.word 0xbeef60b2 -//.word 0xc1b2f1af -//.word 0xf5d1a793 -//.word 0x78fe3bc0 -//.word 0x6fdc970d -//.word 0xa8129676 -//.word 0x7e9d0b12 -//.word 0xfd6a0445 -//.word 0x47245036 -//.word 0x364b3e83 -//.word 0x4386a834 -//.word 0xa73a30ee -//.word 0xc05bca69 -//.word 0xb5827b24 -//.word 0x5d406058 -//.word 0x5db3f12a -//.word 0x91568724 -//.word 0xae1d1ce6 -//.word 0x25c25219 -//.word 0x4a59b7a5 -//.word 0xb52b4824 -//.word 0xe8c13496 -//.word 0x333fe256 -//.word 0xd5f4344d -//.word 0x642e0e65 -//.word 0x6f531240 -//.word 0x612dae2b -//.word 0xa886594d -//.word 0x17f51924 -//.word 0x89f74933 -//.word 0xc84199f4 -//.word 0xad555614 -//.word 0x8854ecdf -//.word 0xc113a9fa -//.word 0xc070c350 -//.word 0x0be79d4e -//.word 0xae604653 -//.word 0xe04b4262 -//.word 0xe3ef8e1b -//.word 0x2cffdee9 -//.word 0xc46f297c -//.word 0xee85677a -//.word 0x0a339a71 -//.word 0xb9a40b11 -//.word 0x4215d698 -//.word 0x35e6a88d -//.word 0x4ef1c8b1 -//.word 0x9b1a5433 -//.word 0xe127ce23 -//.word 0x3dd3d729 -//.word 0x071d3977 -//.word 0xfbe62bfc -//.word 0x9bbbd1da -//.word 0xcff0031b -//.word 0xcfee4f9f -//.word 0x42cd4159 -//.word 0xa826e1bc -//.word 0xf5227e6f -//.word 0x7ed7aa48 -//.word 0x19d58678 -//.word 0x80fb4003 -//.word 0xf790d974 -//.word 0x2f8f2cce -//.word 0x69412cc5 -//.word 0xde116d2e -//.word 0x5f9de6b5 -//.word 0x3909f5ce -//.word 0x5b98a3ee -//.word 0xbb7d2afa -//.word 0xf5eeb400 -//.word 0x357b6625 -//.word 0x589e9dde -//.word 0x4e937763 -//.word 0xc3699661 -//.word 0xfe5a20ef -//.word 0x09580ac4 -//.word 0x12e897a7 -//.word 0x11331b26 -//.word 0xab5a058b -//.word 0x560b1c0c -//.word 0xbf520942 -//.word 0x69b116dd -//.word 0x96723595 -//.word 0x6a3c4464 -//.word 0x4ee58ff2 -//.word 0x93879751 -//.word 0x57d612ea -//.word 0xadb032b7 -//.word 0xf8f62ab3 -//.word 0x989bef8f -//.word 0xc9fa3ba7 -//.word 0xc76dd834 -//.word 0x371b1bc3 -//.word 0xc211afe6 -//.word 0x03959329 -//.word 0xa3b66647 -//.word 0xc228e39e -//.word 0x994fa8e1 -//.word 0x5e9a3b0d -//.word 0x68124e9e -//.word 0x94334202 -//.word 0xe7faeb4e -//.word 0x753f9330 -//.word 0x81454124 -//.word 0xe5903beb -//.word 0xb5f6c93a -//.word 0x1ff93caf -//.word 0x95542f08 -//.word 0x2fd40d97 -//.word 0x4a69d3f1 -//.word 0x767d17e7 -//.word 0x8f844ab7 -//.word 0x29d53a83 -//.word 0x31b8da01 -//.word 0xd2c04675 -//.word 0x965b02dc -//.word 0xcea7826a -//.word 0x3387f037 -//.word 0xcdf72936 -//.word 0x149c0966 -//.word 0x569fe84c -//.word 0x58bc64a0 -//.word 0x40966147 -//.word 0xb24e4f81 -//.word 0x3a53ac64 -//.word 0xea7cc989 -//.word 0x4454d005 -//.word 0x5ab5069a -//.word 0x33984e2f -//.word 0x712bef7e -//.word 0x3124960d -//.word 0x33559f5f -//.word 0x3b81906b -//.word 0xb66fe64d -//.word 0xa13c153c -//.word 0xa7f5cabc -//.word 0x89667314 -//.word 0xc32c0103 -//.word 0x6d12ecaf -//.word 0x5f9a78de -//.word 0x98d93868 -//.word 0xe188d0ed -//.word 0xad59fec3 -//.word 0x4487dc32 -//.word 0x20b15fe4 -//.word 0x97e82497 -//.word 0xbb076c15 -//.word 0x7f426566 -//.word 0x1b02ab44 -//.word 0xb1f10ecf -//.word 0x30509682 -//.word 0x7991c466 -//.word 0xc0221b85 -//.word 0x3587dfa2 -//.word 0xe4ab1d27 -//.word 0xda78eb5f -//.word 0x8aa5f1e5 -//.word 0x6fcf285d -//.word 0xf2cce261 -//.word 0x8d3c0bbe -//.word 0x3160aee1 -//.word 0xe530ba8c -//.word 0xb1a707ce -//.word 0xba629431 -//.word 0xae691335 -//.word 0x624da7fd -//.word 0xba73ec49 -//.word 0xcaaf38a4 -//.word 0x3a1420df -//.word 0xef0b3ebd -//.word 0xe7a332f0 -//.word 0x6528e744 -//.word 0x4ff7181b -//.word 0xd4901219 -//.word 0x51edbb20 -//.word 0x7613d37f -//.word 0xa5e67a66 -//.word 0x9a41f29e -//.word 0x5146a776 -//.word 0x24f36c01 -//.word 0x35f6087e -//.word 0x0bc3f118 -//.word 0x80e357d0 -//.word 0xda8f64b7 -//.word 0x387dc360 -//.word 0x30fa5f95 -//.word 0xb6396d49 -//.word 0x3febacce -//.word 0x270feb48 -//.word 0x500ccd62 -//.word 0x0dfdc93f -//.word 0x3e4c74b4 -//.word 0xbc8203b4 -//.word 0xf75d0b0b -//.word 0xdd248c4f -//.word 0xfe372e14 -//.word 0xeeeaca60 -//.word 0xeb932c5f -//.word 0xc0e21857 -//.word 0xe9718add -//.word 0xf89c424a -//.word 0x38938069 -//.word 0x8fad0d72 -//.word 0xa9007a3c -//.word 0x522eacae -//.word 0x24819977 -//.word 0x633b4cfe -//.word 0x25272f9c -//.word 0xb674890a -//.word 0x3ac34615 -//.word 0x947ff799 -//.word 0x876d19ac -//.word 0x1b849a1a -//.word 0x43fe9912 -//.word 0xbcaf6e1e -//.word 0x3896ea58 -//.word 0xbcb2dfdc -//.word 0x4716e379 -//.word 0xb44052ac -//.word 0xe1a792ce -//.word 0x11939b8c -//.word 0x8f31b698 -//.word 0x95e7849e -//.word 0x6be5437a -//.word 0xd3fd4da8 -//.word 0xa5b4e1fb -//.word 0xb7992692 -//.word 0xffd56d09 -//.word 0xfc04b7ec -//.word 0x51437771 -//.word 0xb48a9966 -//.word 0x063dc268 -//.word 0xc3fdda56 -//.word 0x9dc4c805 -//.word 0x64317c35 -//.word 0x292033c4 -//.word 0xa37ef622 -//.word 0xd25c6405 -//.word 0xe141b25e -//.word 0x51c5f08b -//.word 0x545b8ece -//.word 0x776f1efe -//.word 0x84b15b7c -//.word 0xa7b06b69 -//.word 0xcfaa6116 -//.word 0x57a206bc -//.word 0xe6b4d96e -//.word 0x94a6544b -//.word 0x4ebf71f8 -//.word 0x7bdc6d4e -//.word 0xdfc0cc4f -//.word 0xc0ac9d5f -//.word 0x482fffb1 -//.word 0x2b40e4ff -//.word 0x8a8a157e -//.word 0x16077711 -//.word 0x78d08cbc -//.word 0xf1343c5c -//.word 0x3d07d696 -//.word 0xbe3c520e -//.word 0xd6b7d9d9 -//.word 0x955c8734 -//.word 0x946c6f76 -//.word 0x2011df43 -//.word 0x9b37e603 -//.word 0x209e1492 -//.word 0x662d8139 -//.word 0xe78a10de -//.word 0x41e7f577 -//.word 0xdc1f75c5 -//.word 0xcd01ed3e -//.word 0xfaeb164b -//.word 0x7f9c87b3 -//.word 0x51437c57 -//.word 0x21dbd521 -//.word 0x84bb6237 -//.word 0x50695d74 -//.word 0x49b03818 -//.word 0xfdf29abe -//.word 0xecbfa48f -//.word 0xeca578b6 -//.word 0xcc4afc13 -//.word 0x38b9db34 -//.word 0xdcfacd81 -//.word 0xcde519b6 -//.word 0x24375897 -//.word 0xece67bdf -//.word 0x3eb20f79 -//.word 0xaafdc0f2 -//.word 0xd9dc1c2f -//.word 0x716e9a5b -//.word 0x396ddb24 -//.word 0x7e022f27 -//.word 0xb5de5ba8 -//.word 0x61869a87 -//.word 0x37eee16f -//.word 0x804a6751 -//.word 0xc0216511 -//.word 0x95a31a7f -//.word 0xe13c1388 -//.word 0x2b69a9ae -//.word 0x43cbcbb5 -//.word 0x257afe9f -//.word 0x209ba1db -//.word 0x383576ba -//.word 0xc8405e22 -//.word 0x6cff6486 -//.word 0x1d90fd15 -//.word 0x9ec28e32 -//.word 0x18262f25 -//.word 0x0169af10 -//.word 0x41e0d824 -//.word 0x9865f414 -//.word 0x3a6290ca -//.word 0xbd2b7f5a -//.word 0x35912234 -//.word 0x9eb4e79d -//.word 0x7a181060 -//.word 0xbafbb6c0 -//.word 0xe2e60db2 -//.word 0x6983e949 -//.word 0x5eae8172 -//.word 0x52ce73e1 -//.word 0x7166094b -//.word 0xf2e7bbd6 -//.word 0xb2c9f5ce -//.word 0x1bd91a99 -//.word 0x4bd5c8ed -//.word 0x72365e40 -//.word 0x7c4dbb80 -//.word 0xf1914905 -//.word 0x19383bc4 -//.word 0x630412c5 -//.word 0x076066d7 -//.word 0xebabe382 -//.word 0xc4d4923d -//.word 0x7d2759e1 -//.word 0xdc66c65e -//.word 0x631c08ac -//.word 0x742e3e05 -//.word 0xb9b3f552 -//.word 0xc305ebe3 -//.word 0xf1181962 -//.word 0x940bf10a -//.word 0x50fde514 -//.word 0xc6222872 -//.word 0x6f16b8c0 -//.word 0xcb719c78 -//.word 0xbc9b6a65 -//.word 0x2ce20d5a -//.word 0xf6c9c523 -//.word 0x04a36fbc -//.word 0xb56107c1 -//.word 0x81a96b26 -//.word 0xdf286228 -//.word 0x6628dc83 -//.word 0x33657ce6 -//.word 0x8c1c53a4 -//.word 0xc266efac -//.word 0x5cc494bb -//.word 0x71fbc9d0 -//.word 0x562216e1 -//.word 0x7af90dcc -//.word 0x8d7c8790 -//.word 0xe8b830bd -//.word 0x29de4629 -//.word 0x1d969de5 -//.word 0xe495e76f -//.word 0x4f723229 -//.word 0x8db5b20a -//.word 0x0732c194 -//.word 0x88952406 -//.word 0xa13d90d2 -//.word 0x4c4e6c51 -//.word 0xcf01d9b6 -//.word 0xe33ff041 -//.word 0x166f4ab5 -//.word 0x6e8cc60b -//.word 0x4f7a8668 -//.word 0x9e9a3b4d -//.word 0x279ca30d -//.word 0x3c945085 -//.word 0x9f50aa07 -//.word 0xa3e93797 -//.word 0x8d991a5a -//.word 0x40ccda4b -//.word 0x1a7a6530 -//.word 0x19b355cd -//.word 0x427c7157 -//.word 0x43d9772b -//.word 0x572b19c0 -//.word 0x6abc45da -//.word 0x7e99a901 -//.word 0x4da07732 -//.word 0x2fd965d4 -//.word 0x3f0af9ed -//.word 0xb9850396 -//.word 0xa7456bad -//.word 0xbd392cc9 -//.word 0x81e0a173 -//.word 0xaf160093 -//.word 0xdb2e2428 -//.word 0x58408f3c -//.word 0x59c4af18 -//.word 0x566060b4 -//.word 0xb1ffb371 -//.word 0x9a23ed0a -//.word 0x307cd3c8 -//.word 0xe8b925f6 -//.word 0x339e6995 -//.word 0x5b57e951 -//.word 0xae0cffb3 -//.word 0xdfb59097 -//.word 0xa930d7e1 -//.word 0xb590646c -//.word 0xbeb96443 -//.word 0xf32a2214 -//.word 0x9d19cee1 -//.word 0x01c57ef9 -//.word 0x88087227 -//.word 0x1d2b9c29 -//.word 0xd7ff5f63 -//.word 0xd82998d5 -//.word 0x75bedb4b -//.word 0x9710ffd3 -//.word 0x60c7dc74 -//.word 0x1233531d -//.word 0x2de08fdc -//.word 0xd86b8b50 -//.word 0x8295d461 -//.word 0xc996912e -//.word 0x9bb4c047 -//.word 0x9b13c21d -//.word 0xc6cf1ab7 -//.word 0x564872a6 -//.word 0xe6bdde3a -//.word 0xd81d65f6 -//.word 0xf419be42 -//.word 0x517e5760 -//.word 0x79c29ca1 -//.word 0xc8dc75d9 -//.word 0x15591010 -//.word 0x95ade27a -//.word 0xfbc7e8aa -//.word 0xe4e83302 -//.word 0x73b4a36e -//.word 0x388af352 -//.word 0x5711f5c0 -//.word 0xe6131fef -//.word 0x968f47e8 -//.word 0x9609ab83 -//.word 0xb4253492 -//.word 0xc674fc5c -//.word 0x488e0d4d -//.word 0x46616ceb -//.word 0x7dc8560c -//.word 0xbd60c946 -//.word 0x919746a8 -//.word 0x2205d6a7 -//.word 0x59004b5b -//.word 0x446ac8ec -//.word 0xbbce8347 -//.word 0x43abca15 -//.word 0x321044ed -//.word 0x14697ac8 -//.word 0x4e9995b6 -//.word 0x014969d0 -//.word 0x317fb36e -//.word 0x27729f9a -//.word 0x139d8ec4 -//.word 0xf61215b7 -//.word 0xbf1149cb -//.word 0xb4d93a5c -//.word 0x14bebd7c -//.word 0xfb7c6fe5 -//.word 0x85cbf631 -//.word 0x36338a4e -//.word 0x9a22b52c -//.word 0x283c56b8 -//.word 0x6cf2ec0e -//.word 0x665611ea -//.word 0x2d2d4560 -//.word 0xd746edce -//.word 0x9d0b9b0e -//.word 0x3b5690f0 -//.word 0x968680e7 -//.word 0xa1d19502 -//.word 0x81dcb61e -//.word 0xf088085b -//.word 0xdf0fb5cc -//.word 0x5f51ed73 -//.word 0xc1682b6c -//.word 0xfc82ba68 -//.word 0x50f0775d -//.word 0x297ad87c -//.word 0x46f62d64 -//.word 0x1a192695 -//.word 0x738c9627 -//.word 0x594276bc -//.word 0x390a2db3 -//.word 0x43600f9e -//.word 0x108923f6 -//.word 0x88df290e -//.word 0x0369db46 -//.word 0xaeae7481 -//.word 0x31cb6fd9 -//.word 0x8ec49191 -//.word 0x4c18294a -//.word 0xd698977a -//.word 0x1e780b1b -//.word 0x85a78fa0 -//.word 0xff5c482d -//.word 0x72f2f807 -//.word 0x60f5c84a -//.word 0xc67d45da -//.word 0x44baa89b -//.word 0x7dd15ae5 -//.word 0xc1e6b732 -//.word 0xea7a131a -//.word 0x83f8fa82 -//.word 0x308abc10 -//.word 0x493129e2 -//.word 0xc9159a7f -//.word 0x671a310d -//.word 0x02b361c5 -//.word 0x42fbb0a5 -//.word 0x7d02bb64 -//.word 0xd7647bab -//.word 0xae21c882 -//.word 0x35a81b09 -//.word 0x5e359868 -//.word 0xfe5d4c08 -//.word 0x2ce8b304 -//.word 0xe9de7dda -//.word 0x07e49167 -//.word 0x43c95312 -//.word 0xb55d2247 -//.word 0x6a822527 -//.word 0x4f85487d -//.word 0x50ae81f4 -//.word 0xc2155888 -//.word 0xfeb8a63b -//.word 0x4fcb9d09 -//.word 0x0f4f081d -//.word 0x0ce6d445 -//.word 0x31e6d0a4 -//.word 0x62acb1a7 -//.word 0xa733593a -//.word 0x8de5593b -//.word 0xc9b0b42e -//.word 0x1f5de633 -//.word 0x821d2436 -//.word 0x7d65e666 -//.word 0xd1fca3e8 -//.word 0x6053dbcc -//.word 0x49145b40 -//.word 0x55fdbd03 -//.word 0x92ef2e1d -//.word 0x3d4274ce -//.word 0xe55c2fc4 -//.word 0xce825e90 -//.word 0x94ed265b -//.word 0x1021cfd5 -//.word 0x7f7a106f -//.word 0xe1088cca -//.word 0xa09d9c6f -//.word 0x72234fc0 -//.word 0x8033af2f -//.word 0xc8e446ad -//.word 0xc0e1e165 -//.word 0x3cbf94ab -//.word 0x918dfe2f -//.word 0xfbacce77 -//.word 0x3ce1868c -//.word 0x86a880f3 -//.word 0x9bcb2ede -//.word 0x3334a5a4 -//.word 0x9eff5d6f -//.word 0xaad43234 -//.word 0xc774afe9 -//.word 0x69918cf2 -//.word 0xaee375dc -//.word 0x41780e4d -//.word 0x7e4c333b -//.word 0xd719845d -//.word 0x767021df -//.word 0x2309b25a -//.word 0x6958ab03 -//.word 0xf460ce23 -//.word 0x3eccf1c7 -//.word 0x6b3c01b8 -//.word 0x71dd47ad -//.word 0x7b3ceac0 -//.word 0x905cb51f -//.word 0x6f061b04 -//.word 0xbe6078e7 -//.word 0x64c19af2 -//.word 0x34c480b5 -//.word 0xcb9b611b -//.word 0xbba6f19c -//.word 0xe944dfb5 -//.word 0x33eaa295 -//.word 0x5672751a -//.word 0x0fb5a0fb -//.word 0x815bfa47 -//.word 0xd7f2ac0e -//.word 0x2a3e375d -//.word 0xa5d0b970 -//.word 0xe7da6c24 -//.word 0xa8426fab -//.word 0xa0f5c983 -//.word 0xa47eaba9 -//.word 0x13d7f50a -//.word 0x707ffc3a -//.word 0x50cc8a68 -//.word 0x77832792 -//.word 0x3ea697f5 -//.word 0x388da4c8 -//.word 0x14381e29 -//.word 0xc5e41f58 -//.word 0xe1dc9323 -//.word 0x4792f8a1 -//.word 0x05ee6323 -//.word 0x79e6c468 -//.word 0xb64f6a10 -//.word 0x28f3ca53 -//.word 0x7ce37cf3 -//.word 0xba0f866f -//.word 0xb413dd7a -//.word 0xa45429ab -//.word 0x114cc976 -//.word 0xf222175b -//.word 0x167eed5d -//.word 0xc39b68b6 -//.word 0x9e9eebc9 -//.word 0xca266758 -//.word 0x5424daf7 -//.word 0xcfed16c1 -//.word 0x3b8dc449 -//.word 0x2c5ea8d4 -//.word 0x28da27c5 -//.word 0x50ae0658 -//.word 0x420f7493 -//.word 0x3f514b7a -//.word 0x89b69383 -//.word 0x0f844849 -//.word 0x4c5a5c84 -//.word 0x6dc30039 -//.word 0xb20c202e -//.word 0x16532ca1 -//.word 0x32e11e39 -//.word 0x5fbab93d -//.word 0x1b710e04 -//.word 0xae4145ad -//.word 0x0d5a9a10 -//.word 0xfe79a6f3 -//.word 0x7dbbe082 -//.word 0x5eb363f9 -//.word 0x35baf2a4 -//.word 0x73863909 -//.word 0xd1ff5564 -//.word 0xf24d9753 -//.word 0x433685d3 -//.word 0x27a7226b -//.word 0x519070a7 -//.word 0x70f532c8 -//.word 0x1243f6ba -//.word 0xc2e05346 -//.word 0x74057089 -//.word 0x24d0c5a5 -//.word 0xb99526b6 -//.word 0x2f76fd08 -//.word 0xf533d787 -//.word 0x94432276 -//.word 0x92233464 -//.word 0x96ee905c -//.word 0xcc2e655d -//.word 0x8bf15809 -//.word 0x362083a1 -//.word 0x600dbe31 -//.word 0x334b1d08 -//.word 0x12c2ba6b -//.word 0x7d02b48b -//.word 0x35d877b4 -//.word 0xa11f3ec6 -//.word 0x71d9d7e9 -//.word 0x817fa67d -//.word 0x0095ed50 -//.word 0xd1804b14 -//.word 0x319c8210 -//.word 0x9b8a7d15 -//.word 0xe8c791b4 -//.word 0xbb8303ae -//.word 0x1cb0caac -//.word 0x63599730 -//.word 0x583513cc -//.word 0x987c6792 -//.word 0x3bf902cb -//.word 0xb36196ec -//.word 0xf7e364c5 -//.word 0xe200bafc -//.word 0xd59dbaba -//.word 0xa4565ca4 -//.word 0xb016b70d -//.word 0x50e47c69 -//.word 0x7600c305 -//.word 0x8f2f0af6 -//.word 0xaa537a50 -//.word 0xdd3e6d98 -//.word 0xe4c82e7b -//.word 0x0c1fffbf -//.word 0x505f617b -//.word 0xc1638f83 -//.word 0x2bda4c27 -//.word 0xf59dde1d -//.word 0x49405bbb -//.word 0x75e62369 -//.word 0x915aae57 -//.word 0x625c886b -//.word 0x7f39997e -//.word 0xb29faac7 -//.word 0xa1ae2597 -//.word 0xae521c47 -//.word 0x1bd18d6f -//.word 0x72a0e559 -//.word 0x247bc2b6 -//.word 0x70b4fd8f -//.word 0x86cce87e -//.word 0xed40d41d -//.word 0x22a5d7bf -//.word 0x82f7cc5e -//.word 0x692f9ad5 -//.word 0x9c13ba4f -//.word 0xe452f300 -//.word 0xfcd06813 -//.word 0xad3fd5e3 -//.word 0x38ef166d -//.word 0xf4e7e906 -//.word 0x3834f449 -//.word 0x7b810a54 -//.word 0xbae8aa34 -//.word 0x1b08c89d -//.word 0xcf58d0de -//.word 0x3cbae915 -//.word 0x5c54779f -//.word 0x609be3d3 -//.word 0x9ab09ef0 -//.word 0x99f06353 -//.word 0x96c7bdee -//.word 0x0fc4caf5 -//.word 0xb1f33eda -//.word 0x7b67aa7c -//.word 0x2116ff9c -//.word 0xaeea4e90 -//.word 0x6e14d13b -//.word 0x0ba42f3c -//.word 0xf656fc66 -//.word 0x08af7f70 -//.word 0x6a49b9ee -//.word 0xb26ca280 -//.word 0x4eddb64a -//.word 0x26fbb0a4 -//.word 0x7d079612 -//.word 0x18c4f576 -//.word 0xa3406e84 -//.word 0x50f17177 -//.word 0xc1034902 -//.word 0x28f1598a -//.word 0xad53a592 -//.word 0x10f79477 -//.word 0x8f32f45d -//.word 0x0a783e69 -//.word 0x652b1b31 -//.word 0x2eb12870 -//.word 0x7fc9f6ff -//.word 0x261f5600 -//.word 0x041ed35c -//.word 0xb3057f71 -//.word 0x6c3df304 -//.word 0x27ea917d -//.word 0x03c00c53 -//.word 0xe9172bc5 -//.word 0x6c42c9cb -//.word 0xf41d214c -//.word 0x1ce64891 -//.word 0x584efbfa -//.word 0xdbcf9bef -//.word 0xb83f761a -//.word 0x47a648d3 -//.word 0xca4d02dc -//.word 0x5017c94f -//.word 0xda1442d4 -//.word 0xbd540d17 -//.word 0x47f98f7a -//.word 0xa590f507 -//.word 0x04a275a8 -//.word 0xf785d79a -//.word 0x1978351f -//.word 0xf3f0ff73 -//.word 0x202c4102 -//.word 0xae0f29d8 -//.word 0xc82fc459 -//.word 0x922a0832 -//.word 0x5539178f -//.word 0xdc07c28f -//.word 0x1ec34cf4 -//.word 0x1d737120 -//.word 0x0d8ca73d -//.word 0xb9c0a4bb -//.word 0x231820ff -//.word 0x6a42dc59 -//.word 0xf12ce337 -//.word 0xbed21099 -//.word 0x2054d0c5 -//.word 0x954b293c -//.word 0xea5dfcec -//.word 0xa40f87a7 -//.word 0x9fdb2dd4 -//.word 0xf5837a65 -//.word 0x21a46209 -//.word 0x658ec9a2 -//.word 0x695349f9 -//.word 0x241e2fb0 -//.word 0xffc6c679 -//.word 0x38a3d986 -//.word 0x85a17341 -//.word 0xfb92e93c -//.word 0x2dc91a6b -//.word 0x98e4f691 -//.word 0x3fe93df8 -//.word 0x92958965 -//.word 0x94f08f4b -//.word 0x3d25a23f -//.word 0x1d9179ac -//.word 0x431a31c8 -//.word 0x5dc295c6 -//.word 0x217b9e4e -//.word 0xeb3e362a -//.word 0xa7574142 -//.word 0xf103deca -//.word 0x7b3ceaba -//.word 0xafd4c77e -//.word 0x96c15bef -//.word 0xf9b85b83 -//.word 0xc6fdc9c0 -//.word 0xb479bbf7 -//.word 0x2a0d5f2e -//.word 0x5e263c5e -//.word 0xba91badf -//.word 0x8391e520 -//.word 0xbc2f6e9b -//.word 0x48d2f208 -//.word 0x500f7fd1 -//.word 0xe4c255c7 -//.word 0xe55ee913 -//.word 0x2281306f -//.word 0xc1cc1996 -//.word 0xe1f15cf8 -//.word 0x7d0d72b3 -//.word 0x9339e4bf -//.word 0x865bc968 -//.word 0xc2438a02 -//.word 0x9ef3e9d8 -//.word 0x863d4265 -//.word 0x599410c7 -//.word 0x101cb270 -//.word 0xa103701f -//.word 0x2214b90e -//.word 0x3289ae6d -//.word 0x9521e510 -//.word 0x1e736665 -//.word 0xd282faa8 -//.word 0x4a91a65a -//.word 0x593972ef -//.word 0xefb86ec7 -//.word 0x3d8cf75f -//.word 0x1a4137c9 -//.word 0xa687eb59 -//.word 0x2d8769a2 -//.word 0x4e77e1a0 -//.word 0x5c6ce337 -//.word 0x047021dc -//.word 0x30d57793 -//.word 0x2cc92819 -//.word 0x072a6b62 -//.word 0x3d9b2646 -//.word 0x92d7f977 -//.word 0x41457eb6 -//.word 0x56cdcf46 -//.word 0x59eb49a1 -//.word 0x2c01906b -//.word 0x36f2d3a4 -//.word 0xc2ec5221 -//.word 0xa1851d3d -//.word 0x170a1ecc -//.word 0xf5135950 -//.word 0x025b7370 -//.word 0x9fcf71a5 -//.word 0xabe5c337 -//.word 0xa52f8168 -//.word 0x1030f4ee -//.word 0x1c6e58a7 -//.word 0x82c8e089 -//.word 0xb00afbd8 -//.word 0x26bfd69b -//.word 0x20472250 -//.word 0x752917df -//.word 0xbfaab9cd -//.word 0xbc9e5ab2 -//.word 0xf47e60ed -//.word 0x9cbb4896 -//.word 0xbb52ebb4 -//.word 0x8ba100b0 -//.word 0x2278e30a -//.word 0x5174954b -//.word 0xcd88033b -//.word 0x8cdd8b53 -//.word 0x72dcbc75 -//.word 0x2d895ddb -//.word 0x5e12b14e -//.word 0xf9a7fa98 -//.word 0xee8d3c3b -//.word 0x096e4363 -//.word 0x16f4e71a -//.word 0x4a968fbb -//.word 0xdeb1f4a9 -//.word 0xfdda2840 -//.word 0xe073d60c -//.word 0x387ccb39 -//.word 0xccacb54b -//.word 0x63c02b10 -//.word 0xe414eed2 -//.word 0xbc706fd0 -//.word 0x802491f0 -//.word 0xd357afae -//.word 0x8b9ce158 -//.word 0x0fc67b7d -//.word 0x03fed7a3 -//.word 0x28125538 -//.word 0x7d109fcb -//.word 0xab14327c -//.word 0x9f5e1ab1 -//.word 0x79a7fc0b -//.word 0xa5b55a99 -//.word 0x472e134b -//.word 0xddaa29a9 -//.word 0x200bc7c4 -//.word 0x2a11836d -//.word 0xde29e0a6 -//.word 0x85861756 -//.word 0xb5731741 -//.word 0x77e8ca36 -//.word 0xa85b9a8a -//.word 0xa0d834c6 -//.word 0x12548b9d -//.word 0x333f2021 -//.word 0x1f588236 -//.word 0x78c51046 -//.word 0x50630636 -//.word 0x495bb899 -//.word 0xfaf61824 -//.word 0x95b27e62 -//.word 0xc795a9a9 -//.word 0xe0c1014d -//.word 0x34491e13 -//.word 0xc1438ee9 -//.word 0x121ed3d4 -//.word 0x6336ac29 -//.word 0x05a69600 -//.word 0x045d91e6 -//.word 0x087527d2 -//.word 0x79c0ab5b -//.word 0xe6a3bf27 -//.word 0xa82718a7 -//.word 0xc24d8601 -//.word 0x0ca22e4e -//.word 0x91141a06 -//.word 0x3504f5b8 -//.word 0x9b9c0fff -//.word 0x4563a8b1 -//.word 0xfd0e6a59 -//.word 0x749a37e8 -//.word 0x2a9725a7 -//.word 0x8dc7c770 -//.word 0x65e7af1e -//.word 0x6fcd3042 -//.word 0x48b36918 -//.word 0x8dd37eb9 -//.word 0x41342991 -//.word 0x6fc37214 -//.word 0x10a5baad -//.word 0x2eccfef7 -//.word 0x4ac85a30 -//.word 0xfce0cceb -//.word 0xd9623b04 -//.word 0x9937b8d9 -//.word 0x7aba03b7 -//.word 0xdfcb5193 -//.word 0x3d1e4cfb -//.word 0x37d95c4c -//.word 0x085f2524 -//.word 0x2266511a -//.word 0x14508fad -//.word 0xb1b8db7b -//.word 0x6f4b01b4 -//.word 0x0dd95ccd -//.word 0x79abe479 -//.word 0xf01868d5 -//.word 0x675317e2 -//.word 0x2a874539 -//.word 0xc3266cfa -//.word 0x1d7e7106 -//.word 0xe98d296e -//.word 0x41161c2b -//.word 0x8bf4890f -//.word 0xa1afaafb -//.word 0x2f4d3853 -//.word 0x5c6a32af -//.word 0xac8bdbd3 -//.word 0x24b002e2 -//.word 0xb02885ce -//.word 0xc3a91813 -//.word 0x3da043a5 -//.word 0x91c6aa26 -//.word 0x27f4915d -//.word 0xff389fe4 -//.word 0x9828e220 -//.word 0x10761476 -//.word 0x8cc51dbc -//.word 0xdabbd8ee -//.word 0x55581a23 -//.word 0x0986f1bf -//.word 0x18f129e9 -//.word 0x5d181540 -//.word 0x4ea58cc9 -//.word 0x27f9312c -//.word 0x450cf721 -//.word 0xcf74e525 -//.word 0x9cc31771 -//.word 0x5116062c -//.word 0xcaeb09e0 -//.word 0xbc331b2b -//.word 0x98a9deb7 -//.word 0xb261e06b -//.word 0xa2a41de3 -//.word 0xeafbc61e -//.word 0xda8a4177 -//.word 0xb19f71d7 -//.word 0x058b3728 -//.word 0x65b1390d -//.word 0x3cdce2d0 -//.word 0xf8d6aa9c -//.word 0x6c3697ec -//.word 0x73790343 -//.word 0xd754a11e -//.word 0x7149bb26 -//.word 0x9179bdab -//.word 0xa0b9f74e -//.word 0x03e79ffd -//.word 0x437f1525 -//.word 0x6b696b22 -//.word 0xb21525fb -//.word 0x5aca3d4c -//.word 0xd83b6b83 -//.word 0x355ca34f -//.word 0xb473de56 -//.word 0xb5721d27 -//.word 0xd984ab6f -//.word 0x67e6a36f -//.word 0xeff8b3ad -//.word 0x2d941fea -//.word 0x2f9e0955 -//.word 0xbadceffe -//.word 0xeb08758d -//.word 0x1a246534 -//.word 0x030ef4e2 -//.word 0x285447ba -//.word 0x714935c3 -//.word 0x16594fe1 -//.word 0xbe991d04 -//.word 0xe9a2ab9f -//.word 0x8ba0445c -//.word 0xf9a67e0e -//.word 0x094577e6 -//.word 0x755c5deb -//.word 0x813134a4 -//.word 0xdec1d317 -//.word 0xcd5530f8 -//.word 0x8856de1a -//.word 0xdd62d429 -//.word 0x1c9f709b -//.word 0x3350bce4 -//.word 0x18a6efe9 -//.word 0x67d837b8 -//.word 0x4d76b576 -//.word 0xa4fac998 -//.word 0x5fa09157 -//.word 0x2977ac5d -//.word 0x49b844c5 -//.word 0xc9574b42 -//.word 0xd7d9049e -//.word 0x6b65c667 -//.word 0x2a1dfde5 -//.word 0x8baf714e -//.word 0x3826cb3d -//.word 0xb7075561 -//.word 0x49990172 -//.word 0x1284ad6a -//.word 0x7b9da5f1 -//.word 0xd5016919 -//.word 0x3f61b14b -//.word 0xc99caf82 -//.word 0xd99394b6 -//.word 0xce39559c -//.word 0xe4e9af8c -//.word 0x57fd69c2 -//.word 0xcc9cd9ca -//.word 0xecd3a936 -//.word 0x52e7db92 -//.word 0xa7ea0b9a -//.word 0x0b8df4aa -//.word 0xb7353675 -//.word 0xe15157fa -//.word 0xe0ea07b4 -//.word 0x917ba811 -//.word 0xf9040d26 -//.word 0x2c5a82a1 -//.word 0x6dc10dff -//.word 0x96bcf4ff -//.word 0xbb247f56 -//.word 0x0a78ffa4 -//.word 0xf5740fa7 -//.word 0x94e51aae -//.word 0x44bb1e51 -//.word 0x9560af60 -//.word 0x63483e19 -//.word 0x42ca9b9e -//.word 0x202eb9a6 -//.word 0x2507b272 -//.word 0xdec30a03 -//.word 0x9b80388a -//.word 0x15216220 -//.word 0x54a169b7 -//.word 0xd0a82550 -//.word 0xd75cf26f -//.word 0x2e7a6bcc -//.word 0xfba5754c -//.word 0xe2fe802f -//.word 0x6ff4098b -//.word 0xb45e63f9 -//.word 0x33c7b88e -//.word 0xfe084b0d -//.word 0x1c1dff5a -//.word 0x2f311d32 -//.word 0x54fb521a -//.word 0x4b4df795 -//.word 0xd8ea959a -//.word 0x6899a945 -//.word 0xf877a4cd -//.word 0x339136b6 -//.word 0xdab2cc48 -//.word 0x697a583f -//.word 0xf8b050c4 -//.word 0x5fd9f99c -//.word 0x9d0ae5a0 -//.word 0x7bfaba6d -//.word 0x6c5b365c -//.word 0xb86b70b5 -//.word 0xd9c6611f -//.word 0x257ea25b -//.word 0xae6d7732 -//.word 0x67ca0dac -//.word 0x88fb0083 -//.word 0x33aa20d7 -//.word 0x571b7523 -//.word 0xd5bd8170 -//.word 0xe1ffc4c9 -//.word 0xab6486ee -//.word 0x3fdad04d -//.word 0xaa48bc2d -//.word 0x5f66ee2d -//.word 0xd9d163ed -//.word 0x815f6a0b -//.word 0xd1afef51 -//.word 0xba05ff2c -//.word 0x43558960 -//.word 0x749e62fb -//.word 0x727a8c87 -//.word 0xebf2b884 -//.word 0xb4960916 -//.word 0xb1ce1bfa -//.word 0xf66b44be -//.word 0x2b811a32 -//.word 0x3579351a -//.word 0x13623625 -//.word 0x05880723 -//.word 0xf4486572 -//.word 0x0e229cb9 -//.word 0xb11092d9 -//.word 0x8a160721 -//.word 0xfe1b1bc2 -//.word 0xc8f71182 -//.word 0xe4cd52b4 -//.word 0xac9bb567 -//.word 0x420ffdde -//.word 0x2d9da440 -//.word 0x47ced791 -//.word 0xd6dbc1e1 -//.word 0xf97a0cc3 -//.word 0x46f8a501 -//.word 0xb188c08e -//.word 0xafdb1dbc -//.word 0x9cf089af -//.word 0x5a2ea712 -//.word 0x3cb0f008 -//.word 0x22e0f966 -//.word 0xe547f41f -//.word 0xf5a37a00 -//.word 0x403a889d -//.word 0x566fc78b -//.word 0xcb9310cf -//.word 0xddfd2f97 -//.word 0x575de728 -//.word 0xb64d3718 -//.word 0x8929dcbd -//.word 0x1e2117e5 -//.word 0x5a8cb0c7 -//.word 0xe97f3b3a -//.word 0x989f9a25 -//.word 0xfe33c337 -//.word 0x627ec4d8 -//.word 0xd94b045f -//.word 0xafc9cb85 -//.word 0x08990419 -//.word 0xc72642f6 -//.word 0xaf350233 -//.word 0xc8bd3099 -//.word 0x05f8ec5a -//.word 0x23ba8dff -//.word 0xd402e6a3 -//.word 0x1dcec95f -//.word 0xfd34ca05 -//.word 0x4faf4511 -//.word 0xf1b7a3dc -//.word 0x2694d813 -//.word 0x39733068 -//.word 0x64ba4c87 -//.word 0xef99674c -//.word 0x9ce1df33 -//.word 0x431af010 -//.word 0xbad0c200 -//.word 0xf72da69f -//.word 0x79cd9c7b -//.word 0xe4cd1ac9 -//.word 0xeb250857 -//.word 0x72380fc2 -//.word 0xf4aa13e9 -//.word 0x2372fea1 -//.word 0xcf30c0ab -//.word 0x09c094e3 -//.word 0x880f84b9 -//.word 0x4c2d2fe5 -//.word 0x80a4ca57 -//.word 0xa509656d -//.word 0xedd06f69 -//.word 0xe5647d22 -//.word 0x577847fa -//.word 0x6f97f30f -//.word 0x1c0397b6 -//.word 0xb9bcf925 -//.word 0xeddf996f -//.word 0xd031f1b6 -//.word 0x4ffcfb9b -//.word 0xd11af4fa -//.word 0x1b4f60d5 -//.word 0x70dc4e8d -//.word 0xfd50dd58 -//.word 0x75a2ffef -//.word 0xf97d7d87 -//.word 0x3adb3b03 -//.word 0xe1d5be68 -//.word 0x2fb9eb91 -//.word 0xe05e1124 -//.word 0x56b42ac4 -//.word 0xf39f5e88 -//.word 0xc706c9ac -//.word 0x6b277e87 -//.word 0x2c2dccbd -//.word 0x6c04c0b6 -//.word 0x466cea4f -//.word 0x714c64cf -//.word 0x6749111c -//.word 0xc698232f -//.word 0xf610e0c5 -//.word 0x0c84a557 -//.word 0xee4f2b4d -//.word 0xb830096f -//.word 0x5f597a9c -//.word 0x95c261be -//.word 0xecc38afd -//.word 0x3de23333 -//.word 0x4beacba0 -//.word 0xa43df9e0 -//.word 0xc86ae019 -//.word 0x8d02a279 -//.word 0xc2a822e0 -//.word 0x13680fd9 -//.word 0x2c4a1ecf -//.word 0x2226967e -//.word 0x0eb912a7 -//.word 0xfbf98208 -//.word 0x02a6748b -//.word 0xb32292be -//.word 0xb7826b83 -//.word 0xb4e57609 -//.word 0x710453fa -//.word 0x3b0b55f6 -//.word 0x87a83e41 -//.word 0xd86149b8 -//.word 0xe32a6e0a -//.word 0xf137e124 -//.word 0x860fdced -//.word 0x40e29e34 -//.word 0x011cb4e6 -//.word 0x513a7785 -//.word 0xfddcd6d5 -//.word 0x041c55d9 -//.word 0xb41f56fd -//.word 0x11e99795 -//.word 0x7676fd86 -//.word 0x7f069043 -//.word 0x25b8c6fc -//.word 0x2b5a0412 -//.word 0xba8062cd -//.word 0x48d3af51 -//.word 0xbeacb5ce -//.word 0xd9e2bdf8 -//.word 0xd0e056b7 -//.word 0x38fa531f -//.word 0x250113a2 -//.word 0x93140584 -//.word 0x04ba6a90 -//.word 0x6a2e5d0a -//.word 0x46fa11e4 -//.word 0x12c75b34 -//.word 0xdd7470e6 -//.word 0x3565efae -//.word 0x491e2241 -//.word 0x4f1081c5 -//.word 0x24b27786 -//.word 0x32d469ea -//.word 0x9731f5a7 -//.word 0x84437733 -//.word 0xe25bd27d -//.word 0x3cf06dda -//.word 0xd9377b42 -//.word 0x28f580bc -//.word 0x62921017 -//.word 0x6a6edadb -//.word 0xf878e67f -//.word 0xf6fc1bdc -//.word 0x2abc04e2 -//.word 0x1643d48a -//.word 0x1c76a70b -//.word 0xe66c0a51 -//.word 0x057fbeab -//.word 0xd8a3b9c4 -//.word 0xb0f76ed4 -//.word 0x319a4e17 -//.word 0xfcc08f7f -//.word 0x8b052ca6 -//.word 0x5b012d06 -//.word 0x511c286c -//.word 0x57a308aa -//.word 0x461c0d8c -//.word 0x08d7140e -//.word 0xfec619cc -//.word 0x9f8efaba -//.word 0x62de7d15 -//.word 0xde00959a -//.word 0x30aee1f5 -//.word 0x9e26767c -//.word 0x7a81de1d -//.word 0x48406095 -//.word 0x232882e3 -//.word 0x5c50cdfd -//.word 0x6578d0c1 -//.word 0xed9c682e -//.word 0x4dc93ed4 -//.word 0x23309089 -//.word 0x3c79355e -//.word 0xb859dbd2 -//.word 0x68679445 -//.word 0x7b2b91af -//.word 0x5a782c91 -//.word 0xd0fc2c2c -//.word 0x6e1645f2 -//.word 0x2ee7df3a -//.word 0x56ac1937 -//.word 0x9f4b0c2b -//.word 0x972b54d8 -//.word 0x4449cd37 -//.word 0x0a899a6d -//.word 0xce4a6cfb -//.word 0x5c3c0035 -//.word 0x0676eaf5 -//.word 0x8ec39290 -//.word 0x473d7c09 -//.word 0x761ecc85 -//.word 0xfed209ff -//.word 0x3d51213d -//.word 0x31abad03 -//.word 0xdfe47786 -//.word 0xf5033923 -//.word 0xae66a851 -//.word 0xf658b1d5 -//.word 0xcfe60335 -//.word 0xf3eecd6e -//.word 0xba78c9e9 -//.word 0x3f4979ac -//.word 0xbeb6b1ce -//.word 0x41b7552d -//.word 0x7c3c6463 -//.word 0xf5c435f5 -//.word 0x682b01ce -//.word 0x69c3a2ec -//.word 0x4ba79a5a -//.word 0x414c575e -//.word 0xc359b6f3 -//.word 0x33b9c579 -//.word 0xc1eecdac -//.word 0x8c800000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x0000EC08 -//// expected output -//.word 0xcbee0413 -//.word 0xf1f169a6 -//.word 0x512ecaef -//.word 0xcf5a0c66 -//.word 0x5ddbc5f5 -//.word 0x365749da -//.word 0x16dd98a0 -//.word 0x4b993958 -//.word 0x4004295a -//.word 0xae3867f2 -//.word 0x697c52a2 -//.word 0x8be0e42d -//.word 0xb6d1d209 -//.word 0x54e386db -//.word 0xdeec7447 -//.word 0x70fdd2ba -//// SHA512LongMsgvector_76 -//// vector length -//.word 0x0000EF20 -//// input message -//.word 0x41e9d656 -//.word 0x32f74f44 -//.word 0x9a6842d5 -//.word 0xe6c4a86e -//.word 0xf8379130 -//.word 0x7b92161f -//.word 0x74938f84 -//.word 0x1a660690 -//.word 0xe86beb41 -//.word 0xf03a088a -//.word 0x72e5b8ae -//.word 0xad7d54ed -//.word 0xf5d7ef62 -//.word 0x068f432c -//.word 0x984eeacc -//.word 0x3449d2ce -//.word 0x450aebac -//.word 0x727322ef -//.word 0x2b009397 -//.word 0x824cfabd -//.word 0x3dd76b77 -//.word 0x290644fc -//.word 0xb16b5f08 -//.word 0xae478c82 -//.word 0x814d3e5d -//.word 0x60a984bc -//.word 0xed413b59 -//.word 0x0d3b8327 -//.word 0xf7bf6f36 -//.word 0x8bfe01d7 -//.word 0xe6735502 -//.word 0x33681cf4 -//.word 0xc3bd4c1c -//.word 0x61e51638 -//.word 0xdf3119bc -//.word 0xf551d573 -//.word 0x4c186268 -//.word 0xd57f6107 -//.word 0x5fed3480 -//.word 0x69b56a6c -//.word 0x34e07db3 -//.word 0x1d2ec0ad -//.word 0x2a579387 -//.word 0xe396d9e9 -//.word 0x6368acd5 -//.word 0xae924fd3 -//.word 0x4561634b -//.word 0xf8355e32 -//.word 0xfc413ae8 -//.word 0x3d8c6a61 -//.word 0xf53b1284 -//.word 0x7e1377d0 -//.word 0x653ab545 -//.word 0xbf3db082 -//.word 0xc0574c2b -//.word 0x89f1e18d -//.word 0x4265e985 -//.word 0x6907fc9d -//.word 0x6966ff79 -//.word 0x6fcf9872 -//.word 0x7913e480 -//.word 0xb08a6d5d -//.word 0xf75856e7 -//.word 0xc4efd9c7 -//.word 0x2ed6f450 -//.word 0x48a85ea9 -//.word 0xae5fc02f -//.word 0x5dd22215 -//.word 0xc87da34d -//.word 0x28816eac -//.word 0x13ebe949 -//.word 0x50393026 -//.word 0xea1bc112 -//.word 0x837679cd -//.word 0xebaebf6e -//.word 0xf125ff02 -//.word 0x79ff5a76 -//.word 0xcf299bb7 -//.word 0x3b996d17 -//.word 0xd6d7ccf3 -//.word 0x9bbcba92 -//.word 0xc1793351 -//.word 0x49dc62fd -//.word 0xd3cf1581 -//.word 0xb5226fc1 -//.word 0x4e8adcc5 -//.word 0x98e94a1a -//.word 0xfdcf9775 -//.word 0x6c41459a -//.word 0xabba757c -//.word 0xef7013a6 -//.word 0xaad84ed9 -//.word 0xa46c4bf7 -//.word 0x4dac1a1f -//.word 0x5263e91a -//.word 0x6e2b77f6 -//.word 0x8333ccf0 -//.word 0xe9402898 -//.word 0x05f2392f -//.word 0x1e499054 -//.word 0x6d6756e0 -//.word 0x73983b0e -//.word 0x908fb0df -//.word 0xd0f356bc -//.word 0x081ab65d -//.word 0x221432eb -//.word 0xb5eb3b61 -//.word 0xd929c538 -//.word 0x399bf843 -//.word 0x695529d8 -//.word 0x7af60830 -//.word 0xcc2d1b10 -//.word 0x247c6ba9 -//.word 0xfe3c7dbe -//.word 0x25e28304 -//.word 0x8080d4ce -//.word 0x2f8f9ae9 -//.word 0xd7ebcac5 -//.word 0x391f5ad6 -//.word 0x0ae3ae3a -//.word 0xfee3539c -//.word 0x27c2ef58 -//.word 0x7d5f78e0 -//.word 0xbe57a55e -//.word 0x78cba29b -//.word 0x6363081f -//.word 0xf5920c9a -//.word 0x311cf782 -//.word 0xc0d6d6fe -//.word 0x42ad7203 -//.word 0xe6ea82bc -//.word 0x38b52030 -//.word 0x3bd77a1f -//.word 0xb8c4ca2c -//.word 0xd5d88842 -//.word 0xe9e1dd30 -//.word 0x8fde5c96 -//.word 0xfa06ed05 -//.word 0x880c0962 -//.word 0x99a22d8b -//.word 0xa13c883d -//.word 0x7c16f736 -//.word 0x02783496 -//.word 0xdc394b8b -//.word 0x96824d2d -//.word 0xf4d447a7 -//.word 0x8a4c7598 -//.word 0x8726b4b9 -//.word 0xd28136bf -//.word 0x58617983 -//.word 0xa4fa7a60 -//.word 0xb02c26dc -//.word 0xfa4a118b -//.word 0xdb1f6a31 -//.word 0x14332f27 -//.word 0xaa4a9d00 -//.word 0xf52eeb6b -//.word 0xf3ae375b -//.word 0xe2e7c166 -//.word 0x0dc2576b -//.word 0xe6be1078 -//.word 0x55f03deb -//.word 0x50489dd7 -//.word 0xac15d0a9 -//.word 0x32cb0e0b -//.word 0xf6041908 -//.word 0xe4c67071 -//.word 0x9c04c680 -//.word 0x8067b2bc -//.word 0x0a4ea81c -//.word 0x6413286f -//.word 0x329035fb -//.word 0xb2e10965 -//.word 0x086c07d1 -//.word 0xd31ff149 -//.word 0x04f95b63 -//.word 0xf0cc601e -//.word 0xa441930e -//.word 0x781c38b9 -//.word 0xe7c1b540 -//.word 0x9df74342 -//.word 0xd2ede9fd -//.word 0xd77babb6 -//.word 0xeea9ff5b -//.word 0x5f758068 -//.word 0xc8d1e607 -//.word 0xb5ec367b -//.word 0x70b236be -//.word 0x1b962469 -//.word 0xfb8fa7d5 -//.word 0x17600680 -//.word 0x021d98b2 -//.word 0xf5eb7c60 -//.word 0x20078950 -//.word 0x420a887e -//.word 0x786ba1bf -//.word 0x524514a4 -//.word 0x2c5a2aa1 -//.word 0xbc596a6e -//.word 0xe75c0fae -//.word 0xd9b5bacf -//.word 0x54ea6531 -//.word 0x48fe988a -//.word 0xa5f2df89 -//.word 0x6d8c7bb9 -//.word 0x0d5758a9 -//.word 0xedeb3f4a -//.word 0x466e4d98 -//.word 0x345ba47c -//.word 0x0c8260f1 -//.word 0xef51cd67 -//.word 0x9f51d764 -//.word 0x92f3c171 -//.word 0x458d1a34 -//.word 0xd3a0edda -//.word 0xc65c39b8 -//.word 0x2d66a031 -//.word 0xefd863da -//.word 0x5e8a8edc -//.word 0x0f90709a -//.word 0xea034e94 -//.word 0x7d05598b -//.word 0x95ffdce7 -//.word 0x102dba55 -//.word 0xed5d18b4 -//.word 0xa5f35732 -//.word 0xbe3145b2 -//.word 0x9db59472 -//.word 0x9c438bea -//.word 0x5cc5fbf7 -//.word 0x5d907538 -//.word 0xcbe9bab8 -//.word 0x9bc873ce -//.word 0xd7dc2242 -//.word 0x36ce59b1 -//.word 0xf0ca2a33 -//.word 0xd03cde3a -//.word 0x8bd7e9be -//.word 0x50dc1e97 -//.word 0xa099202a -//.word 0x60301947 -//.word 0x2d99ae52 -//.word 0xefea32a1 -//.word 0xb1d61926 -//.word 0xb074b04e -//.word 0xb1420c28 -//.word 0x986a40ca -//.word 0x3744d4f1 -//.word 0x641b72e7 -//.word 0x4e34e1aa -//.word 0x110c384a -//.word 0x87e24b93 -//.word 0x61756aec -//.word 0x770f4b7f -//.word 0x5dc2449a -//.word 0x37f2bd55 -//.word 0xce14e676 -//.word 0xe3b4a591 -//.word 0xc3bdd374 -//.word 0x1bf5a7c2 -//.word 0x0ec772dd -//.word 0x85458d09 -//.word 0xc66d90cf -//.word 0x49abc5a0 -//.word 0xc6a0ddbb -//.word 0x9322e151 -//.word 0x2d846be6 -//.word 0x151715fa -//.word 0xddf032e9 -//.word 0x82ecbc10 -//.word 0xfcf28e31 -//.word 0x1478d318 -//.word 0x7649bf7f -//.word 0x07857d30 -//.word 0x78e96869 -//.word 0x1c507d84 -//.word 0xf67a10d7 -//.word 0x170dbfda -//.word 0x27d9a587 -//.word 0x4160d007 -//.word 0x0496f48a -//.word 0xe6e56077 -//.word 0xcc7432c5 -//.word 0xd8a9c7a8 -//.word 0x82ed7671 -//.word 0xebaf7eaf -//.word 0x6dab3c9b -//.word 0x776ca2b3 -//.word 0x980fe4a4 -//.word 0xd94b746d -//.word 0x50ae31c2 -//.word 0xf229dcae -//.word 0xa9cfcb7d -//.word 0xa7dae1d9 -//.word 0xf9efbd33 -//.word 0x5fa33265 -//.word 0x5b3df795 -//.word 0x88bda05c -//.word 0x2d1ecd27 -//.word 0x12d9a2de -//.word 0x92aa77c4 -//.word 0xf296d09f -//.word 0xf12d8f18 -//.word 0xa00d6864 -//.word 0x74a79624 -//.word 0x9a46cc8a -//.word 0x8a4d6fbe -//.word 0xdfbf0280 -//.word 0x6605e20e -//.word 0x75ec3348 -//.word 0x7eee1a12 -//.word 0xe3b22cfa -//.word 0x0cd6271b -//.word 0xb8ebe040 -//.word 0x90c17d4d -//.word 0x02e5e4db -//.word 0x4c697423 -//.word 0xd7e3f21d -//.word 0xc7b8c6e9 -//.word 0xd09b676d -//.word 0x4b501440 -//.word 0x89b6c5c6 -//.word 0x6704619d -//.word 0x22533138 -//.word 0x6d5d95ca -//.word 0xc184f566 -//.word 0xf516fb64 -//.word 0x0ecfff06 -//.word 0x589fc35c -//.word 0xb6ae6164 -//.word 0x369e8176 -//.word 0xe810cfdf -//.word 0xf169adcd -//.word 0xdbd6246b -//.word 0x2f8d214c -//.word 0x4656de0d -//.word 0x5c4a9e36 -//.word 0xe6db9d62 -//.word 0x251547a0 -//.word 0xfc24a818 -//.word 0xff1524f2 -//.word 0xcce16873 -//.word 0x9ea7a069 -//.word 0x1f39eaca -//.word 0x7eda0b98 -//.word 0xc2466207 -//.word 0x5ef31ae2 -//.word 0x0597a32b -//.word 0xbfea6202 -//.word 0x3dada7c7 -//.word 0x69ebe083 -//.word 0x427f0d84 -//.word 0xe7d67448 -//.word 0xf1f6969d -//.word 0x06bf6105 -//.word 0xac71a75f -//.word 0x5a6fcfc4 -//.word 0xd543cbb0 -//.word 0xbae14a62 -//.word 0x56302e85 -//.word 0xbec6400f -//.word 0x1cf3226a -//.word 0x480286d2 -//.word 0x98bb9efe -//.word 0xf82dd302 -//.word 0x3daaba74 -//.word 0xb61244cd -//.word 0x04553513 -//.word 0x2c33d7b5 -//.word 0xeb46efb7 -//.word 0x4a43f00e -//.word 0x717d6f4e -//.word 0xc0aad782 -//.word 0x1cea5e5b -//.word 0x8705378e -//.word 0xf4f40977 -//.word 0x59a4a102 -//.word 0x05f6e4cb -//.word 0x340a0784 -//.word 0xe1bd0298 -//.word 0xdb70410d -//.word 0x1b0c9daf -//.word 0x55428c6b -//.word 0xcd1894f9 -//.word 0x6ca106be -//.word 0x130be8f0 -//.word 0x2fe033fb -//.word 0x8e853f23 -//.word 0x71077b6b -//.word 0xe21661b6 -//.word 0x4752a92d -//.word 0x38c6bde0 -//.word 0x8eb26eb0 -//.word 0xbc8ee56c -//.word 0x634bdc3a -//.word 0x20dc0e39 -//.word 0xa9f5eb64 -//.word 0x181391ba -//.word 0x86bcf89c -//.word 0xdc086c76 -//.word 0xe66041a1 -//.word 0xa986c288 -//.word 0xf7d56a0a -//.word 0x40cb5720 -//.word 0xabc4fbc0 -//.word 0x65081501 -//.word 0x3908df7f -//.word 0x62e58901 -//.word 0x9d32e759 -//.word 0x82fb678c -//.word 0x13064533 -//.word 0x96580221 -//.word 0xa0fb1246 -//.word 0x73ffd5d3 -//.word 0x89bfc89f -//.word 0x7166fdca -//.word 0xdab1c8a0 -//.word 0xeef6bcc0 -//.word 0xe165d57d -//.word 0xc98ef784 -//.word 0xb02397bf -//.word 0xe7ffb87a -//.word 0x9e681ac5 -//.word 0xb291ae19 -//.word 0xc6634c3e -//.word 0x957da86b -//.word 0x867a83b0 -//.word 0x82721e91 -//.word 0x02c3f4f4 -//.word 0x6c11a83d -//.word 0x9f8b3db7 -//.word 0xcc708536 -//.word 0x89d2dcfa -//.word 0x209b16d7 -//.word 0x2dcdb593 -//.word 0x680e5f90 -//.word 0xbf6390aa -//.word 0xa83c8d63 -//.word 0xb5b1993e -//.word 0x680b6a68 -//.word 0x4a86de9d -//.word 0x3755eb4a -//.word 0xfce7d4ef -//.word 0x2469a3c8 -//.word 0x0e8cd3ac -//.word 0x43884d35 -//.word 0x07619621 -//.word 0x2e6846f8 -//.word 0x3106bcef -//.word 0x81b5100d -//.word 0x1b4f498c -//.word 0x5d8bd082 -//.word 0x18c425c1 -//.word 0xe6fdd1fb -//.word 0xbe239c2a -//.word 0xc591ff2e -//.word 0x67dadcb8 -//.word 0xa7c26d68 -//.word 0xb38d7b32 -//.word 0xbc7dd006 -//.word 0x0496eeb0 -//.word 0x39a401fd -//.word 0x017f131f -//.word 0xd68e7f52 -//.word 0x148aa8c0 -//.word 0x5084eaa2 -//.word 0xec2ad1a9 -//.word 0xe846899c -//.word 0xfb879642 -//.word 0xe384c582 -//.word 0xf9fe63c9 -//.word 0x0865acac -//.word 0x5f9e86cf -//.word 0x25047005 -//.word 0xedadb5b8 -//.word 0x8aeee58c -//.word 0x2521853f -//.word 0x8da506d4 -//.word 0xcd27f4f0 -//.word 0x04207084 -//.word 0x719fe0ac -//.word 0xce49e5d7 -//.word 0xdf9e8e29 -//.word 0x4a7ecb1d -//.word 0xa9eb246f -//.word 0xde10aa39 -//.word 0xa6822e5c -//.word 0x72c7b221 -//.word 0x72151d20 -//.word 0xf25b3361 -//.word 0xe986c3c2 -//.word 0xcffd2298 -//.word 0xb06dd999 -//.word 0x7fcc9bfa -//.word 0xac987ad4 -//.word 0xf8605acc -//.word 0x8986a5f3 -//.word 0x394340eb -//.word 0x34ebbe4c -//.word 0xc273d445 -//.word 0x61300d87 -//.word 0x17e1bf5e -//.word 0x06f03e21 -//.word 0x41f54fcd -//.word 0xde7ce0ed -//.word 0x4d08f6bd -//.word 0xe858e68e -//.word 0xcae8c86c -//.word 0xe5bb29ff -//.word 0x4f5800af -//.word 0xdd13e30b -//.word 0xf38d7b6c -//.word 0x9a7e36d5 -//.word 0xd3b23b1e -//.word 0x2c52a352 -//.word 0x9065e655 -//.word 0x639693ca -//.word 0xcf384533 -//.word 0x5887d25a -//.word 0xb731c5f1 -//.word 0xe5150f75 -//.word 0x764af958 -//.word 0x28635d5e -//.word 0xbcf11648 -//.word 0x044ab5b0 -//.word 0x3e897534 -//.word 0xa0d672d6 -//.word 0x34e815a3 -//.word 0xe6c7d393 -//.word 0xdcd717b1 -//.word 0x05127c7b -//.word 0xf595408c -//.word 0xf05ef678 -//.word 0x44547af8 -//.word 0xdc872a47 -//.word 0x13ba53cb -//.word 0xc61feaf8 -//.word 0xad617d72 -//.word 0xebe76871 -//.word 0xe3584c6a -//.word 0x4e5abdec -//.word 0x8aa03bc8 -//.word 0x35236474 -//.word 0xfbaf67b1 -//.word 0xaca2bc6c -//.word 0x92f113e2 -//.word 0x016b8a08 -//.word 0x2f42222a -//.word 0x46c774d2 -//.word 0xb875a0eb -//.word 0xd3318726 -//.word 0x95d03a9d -//.word 0xc1dab1b7 -//.word 0x328dc14b -//.word 0x70254808 -//.word 0x815bab14 -//.word 0x022c82f3 -//.word 0x76db91ab -//.word 0xdd39fb25 -//.word 0x8924b2d7 -//.word 0x2d4e32a0 -//.word 0x37406ff3 -//.word 0x5f9e0b38 -//.word 0x80accd6f -//.word 0xa7114f17 -//.word 0x6adbf64e -//.word 0x7cc42739 -//.word 0x7eb3b8a6 -//.word 0x1786a5f0 -//.word 0x460f0523 -//.word 0xf75c3c61 -//.word 0xd53c7185 -//.word 0x60fe4305 -//.word 0x3f7cb71d -//.word 0xd759752a -//.word 0x1c863554 -//.word 0xa70b746f -//.word 0x0a046b23 -//.word 0x60e9414b -//.word 0x2813809c -//.word 0x537cc687 -//.word 0x9bc7bd60 -//.word 0x17804cbf -//.word 0x0ca40f27 -//.word 0x076405e5 -//.word 0x2826893b -//.word 0xc1cd84be -//.word 0x203ae0fd -//.word 0xa8124063 -//.word 0x27c2ee5f -//.word 0x63c114c1 -//.word 0xf6153068 -//.word 0x5c19c21a -//.word 0x4b7d47b3 -//.word 0x428e6b82 -//.word 0x65b87bf0 -//.word 0x88491962 -//.word 0x8a773361 -//.word 0xe4a536f9 -//.word 0x81e27e5e -//.word 0xd1b312d6 -//.word 0x19128ed2 -//.word 0x0db6605e -//.word 0xa09537bc -//.word 0x1ba8b94c -//.word 0x6cee75b0 -//.word 0xc1b3182c -//.word 0x5612e353 -//.word 0x8bb95ce0 -//.word 0x3aec44e2 -//.word 0x47cdca1c -//.word 0x79dafeab -//.word 0x88b788e9 -//.word 0x772e9a92 -//.word 0x23742325 -//.word 0x1dad468d -//.word 0xb5b30a01 -//.word 0x57135329 -//.word 0x1b591182 -//.word 0x978eb703 -//.word 0xf8feef01 -//.word 0x513f8b50 -//.word 0x326ebfab -//.word 0x7dbc8e55 -//.word 0x75298301 -//.word 0x1890a1f0 -//.word 0xafe49c59 -//.word 0xa3b94a0d -//.word 0x9206545b -//.word 0xa2293131 -//.word 0x152b5585 -//.word 0x1e46a5f3 -//.word 0xf3a42fa8 -//.word 0x246a187e -//.word 0x2bf5d568 -//.word 0x44639e11 -//.word 0x7f5620c0 -//.word 0x13f4737f -//.word 0xf5334b7c -//.word 0xa95372af -//.word 0x59ac76bd -//.word 0x24a99f1d -//.word 0xb8152379 -//.word 0x23959d57 -//.word 0xe676bcf8 -//.word 0x4ba93880 -//.word 0xf90c0b58 -//.word 0xc6ecddd1 -//.word 0xccc7c00a -//.word 0xbf561d13 -//.word 0x7ecaee52 -//.word 0xe7572e26 -//.word 0xf0ef8ecb -//.word 0xf3506a7e -//.word 0x4a40fbe1 -//.word 0x1c17cea0 -//.word 0x767f7555 -//.word 0x9e787ca9 -//.word 0xa49f9fbc -//.word 0x39af39c8 -//.word 0xc4480001 -//.word 0xb3eff0bf -//.word 0x0f5785de -//.word 0x54de2d65 -//.word 0x7f5bfd67 -//.word 0x6817a327 -//.word 0x52199c7f -//.word 0xc1a7a783 -//.word 0x8c097961 -//.word 0x3290b28c -//.word 0x71d71019 -//.word 0x1549e269 -//.word 0x0fe3c008 -//.word 0xc63b7ad5 -//.word 0xb2c24e63 -//.word 0x26465ea0 -//.word 0x6dbb61b4 -//.word 0x193a982c -//.word 0x984a0358 -//.word 0x085fd6f1 -//.word 0x4ca027ff -//.word 0x60ede9fa -//.word 0xe9211d30 -//.word 0x11944766 -//.word 0x91e51fc2 -//.word 0x0ff68ae9 -//.word 0xab37c864 -//.word 0xd528ef48 -//.word 0x61199816 -//.word 0xdd34d8e0 -//.word 0x22be72ad -//.word 0x299a4a1f -//.word 0x200f1d53 -//.word 0xbdcb7009 -//.word 0xd327c605 -//.word 0x23ac16b5 -//.word 0x74d67c13 -//.word 0xe6192fcd -//.word 0x8322b3a3 -//.word 0x175f5011 -//.word 0x41c1c22f -//.word 0xcbc132d5 -//.word 0x37a16502 -//.word 0x9af4347f -//.word 0xae603cbf -//.word 0x22a3d60a -//.word 0x34d44adb -//.word 0x82eb3f86 -//.word 0x1d84761d -//.word 0xe0e0b895 -//.word 0x002d0d25 -//.word 0xe3072fef -//.word 0x363e3ee2 -//.word 0x3adab5df -//.word 0x5e5c9d1a -//.word 0x134701c4 -//.word 0xdcdfa1e7 -//.word 0xa431ea91 -//.word 0x55532634 -//.word 0xa6edf14d -//.word 0x35f8ec44 -//.word 0xd5c6b593 -//.word 0x2943162b -//.word 0x727a7c13 -//.word 0xa55bab53 -//.word 0xc1bbb110 -//.word 0x5f9c18f8 -//.word 0x8aaf60e1 -//.word 0xd217adac -//.word 0x9c70bc70 -//.word 0xbc101bd5 -//.word 0x468c9abd -//.word 0xa07efd2a -//.word 0xdc86f35c -//.word 0x458f4c39 -//.word 0x385466f2 -//.word 0x3622e8e4 -//.word 0x36dfb3bc -//.word 0x404b16df -//.word 0x37864109 -//.word 0xf7d3fd33 -//.word 0xa09b9abb -//.word 0x30b528bf -//.word 0x58e4eac9 -//.word 0x88a107b2 -//.word 0x4d1b83c0 -//.word 0xdc7d6e12 -//.word 0xef6f5b3e -//.word 0xcfdf1438 -//.word 0xb2018c76 -//.word 0x48941551 -//.word 0x9168d3af -//.word 0xf11d71df -//.word 0x862d12c4 -//.word 0xb92d8b36 -//.word 0x134fcfa5 -//.word 0x532caaff -//.word 0xbdc0b3d4 -//.word 0xb4b67cb9 -//.word 0x8be60bea -//.word 0x991d8e33 -//.word 0x8b1c4a10 -//.word 0xfee3d513 -//.word 0x4e2f8586 -//.word 0xa8412852 -//.word 0x67e1f51f -//.word 0x9da3c3bd -//.word 0xef6979c2 -//.word 0xa729c675 -//.word 0x04f012eb -//.word 0xd427b470 -//.word 0x45166529 -//.word 0xf9a6f4f7 -//.word 0x586b3c9d -//.word 0x2ae15426 -//.word 0x65f60581 -//.word 0x43c9816f -//.word 0x98b2519f -//.word 0x63829016 -//.word 0xa30c57d5 -//.word 0x6ce478b6 -//.word 0x39666f98 -//.word 0x84fa95bb -//.word 0x9497976d -//.word 0x978627e7 -//.word 0xf069f172 -//.word 0xd27bd1ce -//.word 0x0e1943d3 -//.word 0x29821b59 -//.word 0xb2db7656 -//.word 0xd276f046 -//.word 0x255317d0 -//.word 0xc8e720a6 -//.word 0xb41dd9ad -//.word 0x4a9bdf5e -//.word 0x2e46116c -//.word 0x590844a6 -//.word 0x6ad13920 -//.word 0x3ddbcc8d -//.word 0xbf336df0 -//.word 0x0175d474 -//.word 0x8bd6f197 -//.word 0xf268228e -//.word 0xad9aa9e5 -//.word 0x24fe5d67 -//.word 0x0a509f3d -//.word 0xedb3905a -//.word 0x0b3d8216 -//.word 0x68b6ac18 -//.word 0x1d9d217a -//.word 0xf36c0328 -//.word 0x301ef389 -//.word 0xb1edcd62 -//.word 0x396092f7 -//.word 0x0985a673 -//.word 0xb17b3c89 -//.word 0x25340e5c -//.word 0x1379519c -//.word 0x742fe8f2 -//.word 0x62d8d89f -//.word 0x295dfc60 -//.word 0xa00afa94 -//.word 0xbada75a0 -//.word 0x58f58493 -//.word 0x61776306 -//.word 0x15736947 -//.word 0x9e383ab6 -//.word 0xe8d23e6e -//.word 0xb3d45228 -//.word 0xe755bd5d -//.word 0x273965ab -//.word 0xa8b2437a -//.word 0x440514df -//.word 0xca9251c1 -//.word 0x990f623a -//.word 0x6d140f3f -//.word 0x78dc3784 -//.word 0xb54ac49a -//.word 0x792ade5a -//.word 0x4bba5f87 -//.word 0xf56887af -//.word 0xdbdef252 -//.word 0x8c3cc647 -//.word 0x97a4315a -//.word 0xa0fc133a -//.word 0xb2eff793 -//.word 0xd7354877 -//.word 0xe615c202 -//.word 0x9d28263e -//.word 0xef5f3244 -//.word 0x9f47d0a4 -//.word 0x0e8c8e07 -//.word 0x52bd4e13 -//.word 0x874e3e8f -//.word 0x6ae30bc8 -//.word 0x24cc5233 -//.word 0x63cb5853 -//.word 0xaf1efadd -//.word 0xfcb9e71b -//.word 0x7bd40c8e -//.word 0xb6a550d7 -//.word 0xdc6f82d8 -//.word 0x59bb8f16 -//.word 0xaae5f961 -//.word 0x70db84b8 -//.word 0xc3223367 -//.word 0xc81a7272 -//.word 0x86829536 -//.word 0xf53e814e -//.word 0x5858a9b4 -//.word 0xcd463d28 -//.word 0x236b9dd6 -//.word 0xebe01433 -//.word 0xd273c328 -//.word 0x2ef0db72 -//.word 0xd6a01049 -//.word 0x37104a3f -//.word 0xa4139d6c -//.word 0xee0a7bc8 -//.word 0x356328d8 -//.word 0xfd606f8d -//.word 0x841a9469 -//.word 0x54c589e3 -//.word 0x1435640d -//.word 0xa3a11174 -//.word 0x68a84447 -//.word 0xe391b2bc -//.word 0x88d781b0 -//.word 0xcee5fd8e -//.word 0x831e8c71 -//.word 0x6220e48d -//.word 0xe74a7bcb -//.word 0x627c3fb3 -//.word 0x4b1d888f -//.word 0xd5634bcd -//.word 0xc5ce90a6 -//.word 0x85f626fd -//.word 0x7487958a -//.word 0x818a5437 -//.word 0xf8e63cca -//.word 0x9b263dc5 -//.word 0xf57c508a -//.word 0xeb06acc3 -//.word 0x94513d01 -//.word 0x4b1c52a3 -//.word 0x025e96fa -//.word 0xd98a41ab -//.word 0xef118f54 -//.word 0x77287272 -//.word 0x0fcd8382 -//.word 0x4e043f66 -//.word 0x9c67700b -//.word 0x47dde949 -//.word 0xd3aa760a -//.word 0x91a813af -//.word 0x73d35caf -//.word 0x1e0b4581 -//.word 0x41160bbd -//.word 0x25e56b7e -//.word 0x8618110a -//.word 0xa2c453b5 -//.word 0x8f731f02 -//.word 0xd16c320c -//.word 0x2c358b24 -//.word 0xb75720bc -//.word 0x3261cf84 -//.word 0x992f97d2 -//.word 0xf96c0847 -//.word 0x8356f8b0 -//.word 0xdfc1782a -//.word 0xc35f078a -//.word 0xc33e05fb -//.word 0x6b926ae9 -//.word 0x8bb5b71e -//.word 0xd26c2d2b -//.word 0x9e6c3d0a -//.word 0x131d4101 -//.word 0x6b9d69c9 -//.word 0x8c08f8f0 -//.word 0xe0f7b07c -//.word 0x61468ad1 -//.word 0xf31babd5 -//.word 0xf7239451 -//.word 0x1d1f999b -//.word 0x79a09472 -//.word 0xda0eda29 -//.word 0x57ef6e08 -//.word 0x2a6675ef -//.word 0xc2faea3c -//.word 0x139993ef -//.word 0x31dd340c -//.word 0x1d8e0241 -//.word 0xde675ac9 -//.word 0xd41db390 -//.word 0x4a9dd298 -//.word 0x4a953d9b -//.word 0xb537f1f2 -//.word 0x933a57b5 -//.word 0xa7217524 -//.word 0x46bf6145 -//.word 0x6afbfccf -//.word 0x03d1dc47 -//.word 0x8d998a69 -//.word 0xe78ceec9 -//.word 0x638407ba -//.word 0x1a03e06f -//.word 0x8277bf60 -//.word 0x42bc9fef -//.word 0x44e3e04c -//.word 0x0c323e96 -//.word 0x496b0043 -//.word 0xaa5271c1 -//.word 0xf369945d -//.word 0x50fe1465 -//.word 0xe9677a89 -//.word 0xb68da287 -//.word 0x95a77008 -//.word 0x9a48bfc4 -//.word 0xa69c9aed -//.word 0x3beeafcb -//.word 0x8e6e00a4 -//.word 0xde32dcde -//.word 0x057a0e67 -//.word 0x4d385455 -//.word 0x84d013ca -//.word 0x531c481b -//.word 0xcbb3c231 -//.word 0x416b8f2f -//.word 0x5c1cb454 -//.word 0x6ca72124 -//.word 0xfd37e3c2 -//.word 0xadc79ca1 -//.word 0x3ae5305b -//.word 0xdfb5c2e1 -//.word 0xe138dfd5 -//.word 0x65cef834 -//.word 0x84fa1638 -//.word 0xa166c97d -//.word 0xfa276162 -//.word 0x7e4161b2 -//.word 0xdf6e3184 -//.word 0xe71b135f -//.word 0x0fb458a2 -//.word 0x4e21d423 -//.word 0x2f918f17 -//.word 0x2676bd32 -//.word 0x24d0f10f -//.word 0x69af8dd1 -//.word 0x9af37d0b -//.word 0x135725dd -//.word 0x7eae9760 -//.word 0xa46c0a44 -//.word 0x846788b8 -//.word 0xa2dfe68a -//.word 0xa2bcf990 -//.word 0x15180746 -//.word 0x93fd7cb8 -//.word 0x0a70dea3 -//.word 0x55ae03d7 -//.word 0x11b582df -//.word 0xac0667e4 -//.word 0xbeaa2bcf -//.word 0x9d73e3ae -//.word 0x2c84b759 -//.word 0xf3139655 -//.word 0x756e28f8 -//.word 0xbd3c04ce -//.word 0x3b06243c -//.word 0xcef69563 -//.word 0x22de7347 -//.word 0x3c7b1531 -//.word 0x53fc8552 -//.word 0xe2be33a8 -//.word 0xfb5aea26 -//.word 0xdee1020f -//.word 0xca66d8a3 -//.word 0x13bd7bfd -//.word 0x7583a83c -//.word 0xa85ef9e1 -//.word 0x34865978 -//.word 0x8785bb7b -//.word 0x453b0c73 -//.word 0xdf246560 -//.word 0x67de865b -//.word 0xa3e5807a -//.word 0x60a2b1f4 -//.word 0x08a4f585 -//.word 0x772d1b14 -//.word 0x0bf09694 -//.word 0xfa197528 -//.word 0xe98e968a -//.word 0xba7416ad -//.word 0xa5f60ba1 -//.word 0x8a4176b8 -//.word 0x85d373e7 -//.word 0xc4f6b36e -//.word 0x95872cbb -//.word 0xc3fc0f8c -//.word 0x23a6fb55 -//.word 0x6a3270e1 -//.word 0x4176863b -//.word 0x9c6bdfcf -//.word 0x4775dacd -//.word 0xc1eb09ce -//.word 0x4ed3e6ba -//.word 0x48edc1e9 -//.word 0xb6f4fd88 -//.word 0x20207c3f -//.word 0xa1ef5810 -//.word 0x3d25d483 -//.word 0x75119200 -//.word 0x1913067c -//.word 0x5e5b2a58 -//.word 0x30f37385 -//.word 0xc90004ed -//.word 0x8345230e -//.word 0xeae8e9e8 -//.word 0x16793d1a -//.word 0x38300348 -//.word 0x727690bf -//.word 0xeca7615c -//.word 0x24170daa -//.word 0x8553794a -//.word 0x3ca94b98 -//.word 0x47eaa18b -//.word 0xce6e02dd -//.word 0xb759956c -//.word 0x751d90e1 -//.word 0x2040f48f -//.word 0xcb60789e -//.word 0x1274c268 -//.word 0xf254dd23 -//.word 0xde7ce8c1 -//.word 0x0e0c0b14 -//.word 0x1b14b036 -//.word 0xc90fef28 -//.word 0x23ad49b9 -//.word 0xced69aa9 -//.word 0x97eb490f -//.word 0x4e4fc2f8 -//.word 0xd7262651 -//.word 0x7e5c4007 -//.word 0x8be9bc6c -//.word 0x165493dd -//.word 0x1d76caa2 -//.word 0xd4815c15 -//.word 0x3c417506 -//.word 0xf7a1e05f -//.word 0x5b70c304 -//.word 0xc5658afd -//.word 0x306121d7 -//.word 0x06f56647 -//.word 0x3524de11 -//.word 0x866aa628 -//.word 0x2bfdad17 -//.word 0x9652219f -//.word 0x92e327a2 -//.word 0x8c30cf40 -//.word 0x3103473f -//.word 0x3ff94fb0 -//.word 0x943eeccf -//.word 0x8c98612c -//.word 0x89a75b08 -//.word 0xd36b6c02 -//.word 0xa306baf3 -//.word 0x7ac3f916 -//.word 0xb758966c -//.word 0x6968355e -//.word 0x624c5ea5 -//.word 0x8d137367 -//.word 0x81c7e6a2 -//.word 0x55f2a8ce -//.word 0xb661e5be -//.word 0x3828eec8 -//.word 0xeae77725 -//.word 0x2d4b029a -//.word 0xc6d79b58 -//.word 0x31e4c622 -//.word 0x38e6b6ad -//.word 0xc5f2bf4c -//.word 0xf57d0ecd -//.word 0x6d67989d -//.word 0xf1385033 -//.word 0x33a99dac -//.word 0xe8660bb3 -//.word 0x211241a4 -//.word 0xd98b33f1 -//.word 0xca7098c4 -//.word 0x86e19fe6 -//.word 0xc286dddf -//.word 0xf5d38a5f -//.word 0x228aeedc -//.word 0xf181167d -//.word 0x05a5cb37 -//.word 0x8a3fc536 -//.word 0x0d761b7e -//.word 0x9115fed2 -//.word 0xdf8fa7d4 -//.word 0x1d418e6f -//.word 0xa2f6dd72 -//.word 0x09b0247d -//.word 0x84a64e21 -//.word 0x7389d443 -//.word 0x360b30c1 -//.word 0x3fa29559 -//.word 0x6b89ddc6 -//.word 0x9209c32b -//.word 0x5df652b5 -//.word 0x577c9d7c -//.word 0x471cb1ab -//.word 0xbef1c8e1 -//.word 0xec38bfd7 -//.word 0xb70fca42 -//.word 0x0f7d67fb -//.word 0x7bb3905d -//.word 0xf89135ee -//.word 0x046ce942 -//.word 0xf60fdc1d -//.word 0x90ff09d8 -//.word 0xd704b006 -//.word 0x22e40757 -//.word 0x72722dbc -//.word 0x01c75fcb -//.word 0x1ed06e66 -//.word 0x37097097 -//.word 0x3887b6bf -//.word 0x143cfff0 -//.word 0xa077eb97 -//.word 0xa8aab35e -//.word 0x3d701650 -//.word 0x4cce973e -//.word 0x75b9e562 -//.word 0x19d99b43 -//.word 0xb58d29d8 -//.word 0x6f2f12f0 -//.word 0xef9959d2 -//.word 0x70e83520 -//.word 0x17800c01 -//.word 0x83509f7e -//.word 0xa557832d -//.word 0xd266d00d -//.word 0x16281db2 -//.word 0xcc61aba2 -//.word 0x6b73e0fe -//.word 0xa326f765 -//.word 0xa9a8f715 -//.word 0xcfd3e153 -//.word 0x57af2e0e -//.word 0x893878bf -//.word 0x03617893 -//.word 0x515830cc -//.word 0xbd0c6964 -//.word 0x68ed60f4 -//.word 0x9af2bdd5 -//.word 0x57e1c485 -//.word 0x33cbcf4c -//.word 0x67d5fc1f -//.word 0x233f23c4 -//.word 0x269e0b37 -//.word 0x8d6cdd4d -//.word 0xe8c3d897 -//.word 0x93664789 -//.word 0x4401b0db -//.word 0xe0b24f30 -//.word 0x93c7c2f6 -//.word 0x1fca068d -//.word 0x74bba2ab -//.word 0x829c22ff -//.word 0x4b33c714 -//.word 0x3c0b7d79 -//.word 0xbdbc0d1f -//.word 0x076c9402 -//.word 0x3596340b -//.word 0x9e0a0935 -//.word 0x63355ff0 -//.word 0x44a322c3 -//.word 0xb8c29534 -//.word 0x3ce947ec -//.word 0xeb984417 -//.word 0x4f02880a -//.word 0x77c8b928 -//.word 0x49081506 -//.word 0x1a96a9cd -//.word 0x7c89c3e0 -//.word 0x57faabbf -//.word 0x3c088e2c -//.word 0xf51fbb8c -//.word 0x617b128f -//.word 0x7fe7b813 -//.word 0xc8cb1046 -//.word 0xc265e70b -//.word 0xd257efa0 -//.word 0x51626f7d -//.word 0xe371387f -//.word 0x04d9db45 -//.word 0xe4df19db -//.word 0x757b9b95 -//.word 0xc25be43e -//.word 0x822b8372 -//.word 0xed148d49 -//.word 0xce824a36 -//.word 0xda2b2f2e -//.word 0x404d0c0c -//.word 0x81368734 -//.word 0x820ac976 -//.word 0xe0c17736 -//.word 0x836fe4ca -//.word 0x76c88524 -//.word 0xf5e3a5b1 -//.word 0xc83e5980 -//.word 0xd003b7a7 -//.word 0xe08943e3 -//.word 0xce1eaa7e -//.word 0xc904b376 -//.word 0xecb972db -//.word 0x147bbf79 -//.word 0xef0ce6b7 -//.word 0x56b3a0bf -//.word 0xdd8342df -//.word 0xa8df352f -//.word 0x803ea675 -//.word 0x252c7e45 -//.word 0xe692956d -//.word 0x70362290 -//.word 0xe4857710 -//.word 0x2c91eb31 -//.word 0x8e56177c -//.word 0x81414562 -//.word 0xc0f32522 -//.word 0x9e42c2ed -//.word 0x9980b547 -//.word 0x310098b0 -//.word 0xfbd7be84 -//.word 0xf1e02120 -//.word 0x0c039c46 -//.word 0x15b65bc3 -//.word 0xb8c38f4e -//.word 0xda4c66b4 -//.word 0x2c0d3a32 -//.word 0x00e20922 -//.word 0x5c8925db -//.word 0x4da82cd2 -//.word 0x7e123b05 -//.word 0x09465f99 -//.word 0x8d394cc1 -//.word 0x815552e3 -//.word 0xc8c18cf6 -//.word 0x85e35b2f -//.word 0x302312dc -//.word 0xeaf2f390 -//.word 0x0d0b5b80 -//.word 0x08f9392d -//.word 0x6adac443 -//.word 0x3c626ec1 -//.word 0x9423135b -//.word 0x670b771d -//.word 0x9f2eef50 -//.word 0x6dc55ea1 -//.word 0xe1776380 -//.word 0xb8d8d1c7 -//.word 0x7530609c -//.word 0xb37da298 -//.word 0xb9bb3829 -//.word 0x4f624534 -//.word 0xd03123ff -//.word 0x812a554f -//.word 0x21debdcd -//.word 0xc1ea0fae -//.word 0xd6c28693 -//.word 0x8dadd6ae -//.word 0x5e116127 -//.word 0xe4f1adbe -//.word 0xecb416b1 -//.word 0xcc28c0e0 -//.word 0xf6c6d02f -//.word 0xcc38dc2c -//.word 0xb6189ff2 -//.word 0x72fbf24d -//.word 0xacaef81e -//.word 0xcfbf9801 -//.word 0x1a3f302e -//.word 0xf6c7879d -//.word 0x87b9046e -//.word 0x81c81e87 -//.word 0x3dbb147f -//.word 0x0c6ddebb -//.word 0xcb1963d6 -//.word 0xb7d4ec46 -//.word 0x835bd93d -//.word 0xa80f93ce -//.word 0xfd3ec151 -//.word 0x87a4bf08 -//.word 0x92324b03 -//.word 0x000e8240 -//.word 0xe2da0c17 -//.word 0x453993d5 -//.word 0x4e8f79a8 -//.word 0x8a09cabb -//.word 0x7fde6fa1 -//.word 0x87d4a5f7 -//.word 0xde05ae45 -//.word 0xf9e3c626 -//.word 0x197a59a9 -//.word 0x21f573f6 -//.word 0xa4647835 -//.word 0x43bc15ab -//.word 0x361f7626 -//.word 0x285eba9c -//.word 0x48bda40f -//.word 0x9df693b3 -//.word 0x9980b453 -//.word 0xf21076f1 -//.word 0xad613ead -//.word 0x7c315de8 -//.word 0x498c3fa8 -//.word 0x134ce43e -//.word 0xf9e19427 -//.word 0x944ecf31 -//.word 0x8a7484de -//.word 0x6093830d -//.word 0x900e33d7 -//.word 0xdc6e88b8 -//.word 0xe1aa30ef -//.word 0xefa60d27 -//.word 0x18f9e856 -//.word 0x87f364e6 -//.word 0x14df3013 -//.word 0x15858194 -//.word 0x76f3c07d -//.word 0x0c7d7f64 -//.word 0x2603b2c2 -//.word 0x65721c9d -//.word 0xce8d0764 -//.word 0x1eee381b -//.word 0x5d4722b7 -//.word 0xb6ee5acc -//.word 0x86994b65 -//.word 0xb3662b33 -//.word 0x3f1e2eeb -//.word 0x1dbaf9e9 -//.word 0x43265919 -//.word 0x00463517 -//.word 0x9037c195 -//.word 0xeed7f5fe -//.word 0xe9873e58 -//.word 0x7a2f736f -//.word 0x55830a30 -//.word 0xbe858c53 -//.word 0x9e4b463d -//.word 0xd6034224 -//.word 0xd3347574 -//.word 0x62473a71 -//.word 0xc645ff1e -//.word 0x09e23e5e -//.word 0x8fbbb05a -//.word 0xf1dcbd22 -//.word 0x08853697 -//.word 0x472e4688 -//.word 0x4ec8a61b -//.word 0xbd46116f -//.word 0x465cf87f -//.word 0x0786764a -//.word 0x164d8631 -//.word 0x5dc674a0 -//.word 0xa85b91f0 -//.word 0xfccd2b8c -//.word 0x2b7abc53 -//.word 0xa5dc623e -//.word 0x91538f43 -//.word 0x1c240279 -//.word 0x11c1f67c -//.word 0xab4b9913 -//.word 0xa755bf10 -//.word 0x9cebd878 -//.word 0x8fd21fe4 -//.word 0xc2121527 -//.word 0xceb22e31 -//.word 0xf1c3ca34 -//.word 0xa9a06605 -//.word 0x827314c4 -//.word 0x2cfb28bf -//.word 0xd08d3594 -//.word 0xa4593896 -//.word 0xbeef1272 -//.word 0x26023c13 -//.word 0x2e6bb6c2 -//.word 0x06704092 -//.word 0x8b47cdfb -//.word 0x60d635c5 -//.word 0x40bd2a27 -//.word 0x92966d31 -//.word 0x3e7b4167 -//.word 0xc0c921af -//.word 0x7b24ae6d -//.word 0x4fbcebec -//.word 0x6dceac00 -//.word 0x6a6d4ce9 -//.word 0x93829f7b -//.word 0x8112277c -//.word 0xedbf8b4e -//.word 0xc59244cd -//.word 0x7ef79a7b -//.word 0xad09cfdb -//.word 0xd1109a1a -//.word 0x7348d7f4 -//.word 0x72e57cd6 -//.word 0x9853cf40 -//.word 0x70c2d66e -//.word 0x5ce20f37 -//.word 0xe2eb6235 -//.word 0x47e15426 -//.word 0x5f167d92 -//.word 0xa3f03caf -//.word 0x84eca981 -//.word 0xffe3cb45 -//.word 0x728d0c10 -//.word 0xae43e9b4 -//.word 0x4d09eee3 -//.word 0x46cbe297 -//.word 0xbee73fb0 -//.word 0x21ece5df -//.word 0x72a10ec4 -//.word 0xdf4a8553 -//.word 0x9926137c -//.word 0xe23c3a0b -//.word 0x685826cd -//.word 0xd150e1f4 -//.word 0x978bc6bc -//.word 0x16c4384f -//.word 0xe30c94e6 -//.word 0x600e6332 -//.word 0x8d97d5fa -//.word 0x21566b05 -//.word 0xdae0f33a -//.word 0x11f6b906 -//.word 0x910bfcfe -//.word 0xa9019fc6 -//.word 0x80342131 -//.word 0xa9b9cfa9 -//.word 0xf7e838d2 -//.word 0x9317e26a -//.word 0x4ba93b74 -//.word 0x2d48d295 -//.word 0x556ec7be -//.word 0x032a810b -//.word 0xf1219eeb -//.word 0xe3d33082 -//.word 0x7f1f264b -//.word 0x5f090802 -//.word 0x65bce8c1 -//.word 0x4ecb9569 -//.word 0x8abc1143 -//.word 0x4bc745e7 -//.word 0xdddbf45d -//.word 0x35e2ee83 -//.word 0xcc4686ae -//.word 0xaeb44594 -//.word 0xcd20e06a -//.word 0x9c096849 -//.word 0xd9fec1d6 -//.word 0xaa615522 -//.word 0xec6b09cf -//.word 0xc8707175 -//.word 0x87643f43 -//.word 0xa79f02ea -//.word 0x2edd0db6 -//.word 0x3e89b4fe -//.word 0xea3bbfbf -//.word 0x487f1884 -//.word 0xc7d8c789 -//.word 0xc304201f -//.word 0x57823b52 -//.word 0x7352a5ca -//.word 0x2efc55ef -//.word 0x5dd3e251 -//.word 0x647bf346 -//.word 0x4ca9f6d5 -//.word 0x162a15d2 -//.word 0x4f27654b -//.word 0xe5a76123 -//.word 0x395598fd -//.word 0x7584a25b -//.word 0x20705807 -//.word 0xf0c645b3 -//.word 0xdf6757dc -//.word 0x8069daf4 -//.word 0x945fa7bf -//.word 0xd9db99fe -//.word 0x2231414b -//.word 0xac7ddb44 -//.word 0xb0e780eb -//.word 0x35259d4d -//.word 0x2842a362 -//.word 0xae9e0035 -//.word 0xb9374f44 -//.word 0xda26cb2a -//.word 0x566d0a7b -//.word 0x7befe8f0 -//.word 0x34c0c1c4 -//.word 0xdc9fe35d -//.word 0x50c1422f -//.word 0x48d16ede -//.word 0xe734c3a2 -//.word 0x9091dff0 -//.word 0xfc915a57 -//.word 0x89e3b1a8 -//.word 0xd5848259 -//.word 0x8c3dff2b -//.word 0x7e6d9d0b -//.word 0xf5080c36 -//.word 0x45e06ca1 -//.word 0xa423be98 -//.word 0x3c2598a5 -//.word 0x7f601db3 -//.word 0xbbba2d73 -//.word 0xee06d9ff -//.word 0xdbcc1abe -//.word 0x5d4dc287 -//.word 0xfcc2b209 -//.word 0xbee54e6a -//.word 0x3fb22e2e -//.word 0x046f165b -//.word 0x0dea29da -//.word 0xa9025921 -//.word 0x8f68220f -//.word 0x29a77817 -//.word 0x3362fea1 -//.word 0x85dd78ad -//.word 0x2dc083ba -//.word 0xc11784e6 -//.word 0xf49cde56 -//.word 0x663968d8 -//.word 0xc1c91ec7 -//.word 0x011f1630 -//.word 0x1349b632 -//.word 0xa21525ab -//.word 0x2ed5ff11 -//.word 0x5e604d9d -//.word 0x9759b4af -//.word 0xcdb4ec6e -//.word 0x997574ae -//.word 0x8cbb8418 -//.word 0xc4fe4484 -//.word 0xbc953baa -//.word 0x687b0afa -//.word 0x82525ac8 -//.word 0x1fa813ac -//.word 0x857ace29 -//.word 0x40f68e8c -//.word 0x7385aa17 -//.word 0x6d090e5f -//.word 0x7c63a4f3 -//.word 0x06390c3e -//.word 0xd5f693af -//.word 0xb3126317 -//.word 0x3793f752 -//.word 0xded4d229 -//.word 0x5d857177 -//.word 0x36f37e8b -//.word 0x8a8946ce -//.word 0x2e976da5 -//.word 0x0153e099 -//.word 0x7c1e0cb6 -//.word 0x8a084e30 -//.word 0x9a95aa4d -//.word 0xf3c2bf7e -//.word 0x4843facf -//.word 0x8d0f0b82 -//.word 0x091e95f7 -//.word 0xab712ad0 -//.word 0xa1547652 -//.word 0x27e0ba0d -//.word 0x9dc37dbf -//.word 0xdd447e76 -//.word 0xcb81ecf5 -//.word 0x2efbd959 -//.word 0xbe55edfc -//.word 0x7d59579a -//.word 0x4b3c09b2 -//.word 0xb523252f -//.word 0x0fe5b248 -//.word 0xc21394a5 -//.word 0xe636bbc3 -//.word 0x14579a99 -//.word 0x75c5db7c -//.word 0x1f125140 -//.word 0xa25f2ea0 -//.word 0xddd976df -//.word 0x1784b3b0 -//.word 0x4b38eb54 -//.word 0xc2e9cf02 -//.word 0xe72b358b -//.word 0x58f4c83e -//.word 0x39a4fe09 -//.word 0xcd444be2 -//.word 0x470b9565 -//.word 0xdd27e7bf -//.word 0x1fba69ca -//.word 0x87229079 -//.word 0x517d9277 -//.word 0x8c6c1d0b -//.word 0x7218483f -//.word 0xf573ca41 -//.word 0x9ac16909 -//.word 0x8a56b63c -//.word 0xe7a1f851 -//.word 0x5c6966f2 -//.word 0xf85799a5 -//.word 0x3cb540ab -//.word 0x72751628 -//.word 0x41751185 -//.word 0x7f01dc13 -//.word 0x469a88f1 -//.word 0x4af57f2f -//.word 0x6947b933 -//.word 0x84c0325c -//.word 0x8e559be6 -//.word 0xe2c34f0e -//.word 0xdad18a76 -//.word 0x9dd5d5ca -//.word 0x3879c5a4 -//.word 0xf1bfe5ad -//.word 0xd743f106 -//.word 0x9ec145e6 -//.word 0xaad69484 -//.word 0x6a0bdd37 -//.word 0xe70f9bdb -//.word 0x9d443d78 -//.word 0x897dd51e -//.word 0x83071413 -//.word 0xcee67631 -//.word 0xee60ba89 -//.word 0xb9c0954c -//.word 0xb154a7ec -//.word 0x91b8ae7e -//.word 0x2656fa63 -//.word 0x602e2127 -//.word 0xa9d3f3a9 -//.word 0x75b6b07c -//.word 0x1ba7798e -//.word 0xe3990507 -//.word 0x60a69574 -//.word 0x00532a25 -//.word 0xe114f5d3 -//.word 0xe6130f87 -//.word 0x0b2d6ab6 -//.word 0xf53d08b1 -//.word 0xce9e6a3d -//.word 0x4feb4c7d -//.word 0x1e098f19 -//.word 0x5b687799 -//.word 0x75851612 -//.word 0x43b40805 -//.word 0x501c6184 -//.word 0x7603e496 -//.word 0xae4c76dd -//.word 0x263dd276 -//.word 0x94867d21 -//.word 0xcb7ffda2 -//.word 0x8bb24667 -//.word 0x9e99756a -//.word 0x20a9c059 -//.word 0x1f8fadf5 -//.word 0x64b983b8 -//.word 0x8f18feba -//.word 0x6a2447d5 -//.word 0x77212307 -//.word 0xcba16b19 -//.word 0x1f4bbc7e -//.word 0x25da6f7e -//.word 0x1869cc94 -//.word 0x97ed7a14 -//.word 0xb3033a10 -//.word 0x47ecd67d -//.word 0x88d55392 -//.word 0xdc5c6e71 -//.word 0xf0514709 -//.word 0x04b9573b -//.word 0x8a19a73b -//.word 0xf0f1443a -//.word 0xba86ee42 -//.word 0xd3e41061 -//.word 0x2524f509 -//.word 0x67eb38b7 -//.word 0x36337cd3 -//.word 0x684e5ed7 -//.word 0x9d27a8b4 -//.word 0x16ccc772 -//.word 0xcb298016 -//.word 0xb716dec8 -//.word 0x77956f35 -//.word 0x1354b033 -//.word 0x1c7ac5a3 -//.word 0xf7a06d9c -//.word 0x781c36c6 -//.word 0xb386ed03 -//.word 0x0e755955 -//.word 0x9b8a29fc -//.word 0xa5b02ade -//.word 0x89a1bd2c -//.word 0xc7ad8943 -//.word 0x59b76dd0 -//.word 0x4480b838 -//.word 0x6c289d37 -//.word 0xacf1e1c7 -//.word 0x2647d743 -//.word 0xd8fd8ecc -//.word 0x71da49ec -//.word 0x62542f79 -//.word 0x379b44bc -//.word 0x28d998d3 -//.word 0xebb8bf54 -//.word 0xcd268033 -//.word 0x0155d1e6 -//.word 0x380504c6 -//.word 0x72053bb9 -//.word 0x13f7210e -//.word 0x3955dca8 -//.word 0x4db13d5f -//.word 0xd8413aa3 -//.word 0x989a9f62 -//.word 0xd4bc002c -//.word 0xec4ff296 -//.word 0x342c7bdc -//.word 0x021fc6ca -//.word 0x06eb1bdc -//.word 0xda8f0fa4 -//.word 0xdac8f86c -//.word 0x36d7a41d -//.word 0x46844b5f -//.word 0x1d63c102 -//.word 0x6056f09d -//.word 0x59538674 -//.word 0x4768eb9f -//.word 0xf8fc7669 -//.word 0x9a57e0f7 -//.word 0xcf65f92a -//.word 0xffb699c5 -//.word 0xf2cadad3 -//.word 0x9e8c8443 -//.word 0x3d1cc9d6 -//.word 0xa3d1333b -//.word 0xcf7fda78 -//.word 0xc0f5da8b -//.word 0x8aca0451 -//.word 0xa85ad4a8 -//.word 0x940ba3d0 -//.word 0x95d51e18 -//.word 0xd801f7b6 -//.word 0xc330dbf6 -//.word 0x86a0a397 -//.word 0xf3abce71 -//.word 0x8f902f5c -//.word 0xe976e34e -//.word 0x2aae86c3 -//.word 0xee39a662 -//.word 0x528a78dd -//.word 0x4e8cca19 -//.word 0x46e7398f -//.word 0xdb80a4f2 -//.word 0x073ee111 -//.word 0x6914ae00 -//.word 0xdd3cea72 -//.word 0x50c0056a -//.word 0xd33fb513 -//.word 0xedeeeaeb -//.word 0x36dd0527 -//.word 0x217c4454 -//.word 0x1a5d813a -//.word 0xd13b1d05 -//.word 0xd53c37a7 -//.word 0x64732178 -//.word 0x82a9141f -//.word 0x485d22b6 -//.word 0x7f096d29 -//.word 0x6da797df -//.word 0xef74799d -//.word 0xc8f418a7 -//.word 0x3936d428 -//.word 0xd259e3d3 -//.word 0x874ffecb -//.word 0x06e15ac0 -//.word 0x48f3da5b -//.word 0x660a83dd -//.word 0xaf0b3003 -//.word 0xf746872c -//.word 0x31b22bbd -//.word 0x417a33c5 -//.word 0x0bb9dcdd -//.word 0xd0827a53 -//.word 0xba24b587 -//.word 0xb5acf194 -//.word 0x81ab0e33 -//.word 0x053952dd -//.word 0xe739a330 -//.word 0x59dffa94 -//.word 0x3670141e -//.word 0x4d496bb5 -//.word 0xfd236473 -//.word 0x0295ca4d -//.word 0x8eda7bf7 -//.word 0x9bd56102 -//.word 0x8052a448 -//.word 0xc38f1e89 -//.word 0x2ffb1056 -//.word 0x263d132e -//.word 0x387851e8 -//.word 0xf4cef450 -//.word 0xfd23df15 -//.word 0x61239ce3 -//.word 0x278696cc -//.word 0x279289ec -//.word 0x1fe2364d -//.word 0x02675b08 -//.word 0x93ace2ad -//.word 0x335e59e5 -//.word 0xf70ba256 -//.word 0xfe2aecc7 -//.word 0x025ce285 -//.word 0x2cf12105 -//.word 0x2daef0ca -//.word 0x8acd2b89 -//.word 0x3746818c -//.word 0x684de054 -//.word 0xa41c2c82 -//.word 0x1bf237f8 -//.word 0x395cee3b -//.word 0x7bb3d01b -//.word 0x82e6a597 -//.word 0x66796cfb -//.word 0x4cce954b -//.word 0x3ba470e4 -//.word 0x2bdde661 -//.word 0x5f8467bc -//.word 0xf50e23b5 -//.word 0xbce07d78 -//.word 0x4512bc7a -//.word 0x3d7304a4 -//.word 0xf9cd86b3 -//.word 0x536af3df -//.word 0xb5d636ba -//.word 0x73e7625c -//.word 0x5efbe9bd -//.word 0x96811062 -//.word 0x9fbb9f3c -//.word 0xb7c1ddcd -//.word 0x67cabb8c -//.word 0x59a7508b -//.word 0x69908557 -//.word 0xfe23121f -//.word 0x9baaa919 -//.word 0xb19d7022 -//.word 0xb868b5a5 -//.word 0x80000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x0000EF20 -//// expected output -//.word 0xec4ae4e3 -//.word 0x66803549 -//.word 0x10748388 -//.word 0x88491390 -//.word 0xf18c964b -//.word 0xbf2aa16f -//.word 0x44f76a16 -//.word 0x7ea90043 -//.word 0xcbdce5fe -//.word 0x79fe09c2 -//.word 0xe78cdb1f -//.word 0xbfb8c3ea -//.word 0xb143299b -//.word 0xb7ef98f9 -//.word 0x787a4a9f -//.word 0x94ca413e -//// SHA512LongMsgvector_77 -//// vector length -//.word 0x0000F238 -//// input message -//.word 0x090d8832 -//.word 0xd14f3320 -//.word 0x7b3bf973 -//.word 0xd374be0e -//.word 0x88082e7b -//.word 0x46fe0125 -//.word 0x1f2e7dc8 -//.word 0x2f563d25 -//.word 0x806932fa -//.word 0x2b2ae731 -//.word 0xc0fa0958 -//.word 0xe8ee2651 -//.word 0x4925b54b -//.word 0xaa5957f1 -//.word 0x58b35ce0 -//.word 0xc8e4895f -//.word 0x7d71184a -//.word 0x2c4e0150 -//.word 0x1faf785f -//.word 0xd71bb75b -//.word 0xf5c2fd16 -//.word 0x5b10d77d -//.word 0x8e829e0f -//.word 0x5eb94194 -//.word 0xcacd440b -//.word 0x1ee309e4 -//.word 0x5e024f6f -//.word 0xe722f895 -//.word 0x54860fc6 -//.word 0x9f4c0932 -//.word 0x88434b3c -//.word 0x3bfced2b -//.word 0x2d24be23 -//.word 0x47108855 -//.word 0x469a9572 -//.word 0x622c7165 -//.word 0x2d1af241 -//.word 0xbf357678 -//.word 0x109d6c4f -//.word 0xa5d6168e -//.word 0x6f1e8c7c -//.word 0xf0fe050a -//.word 0x9f20524f -//.word 0x8e60ab34 -//.word 0x4a25ae71 -//.word 0x02f2a5b8 -//.word 0xec38082f -//.word 0xe56f4324 -//.word 0x5864b8fd -//.word 0x60d5086d -//.word 0x313b8eee -//.word 0xb4e72d6b -//.word 0x71504c3c -//.word 0xb2ac1e58 -//.word 0xe5bd27c6 -//.word 0x43eefc55 -//.word 0xaf9e4a8d -//.word 0xe1bc19e5 -//.word 0xc3945237 -//.word 0x1be87f70 -//.word 0x6b43d38c -//.word 0x158a6ac2 -//.word 0xc3d4d1fb -//.word 0x067bc989 -//.word 0x3e744816 -//.word 0xb9dbc1da -//.word 0x1fd2a512 -//.word 0x0d8c2aad -//.word 0x00a54b48 -//.word 0x75b5105c -//.word 0x4e240fb6 -//.word 0x78403328 -//.word 0xcb8cbc7f -//.word 0x315b87b4 -//.word 0x0b9e9067 -//.word 0xd0fbb588 -//.word 0xf71fbd58 -//.word 0x18549890 -//.word 0x4e56e8df -//.word 0xdf62c19a -//.word 0x1f91adb0 -//.word 0x9164f4dc -//.word 0x50a01a1e -//.word 0xad5ca86b -//.word 0x1a5830a4 -//.word 0x47908bc5 -//.word 0x8a11655f -//.word 0x840cfc48 -//.word 0x02292490 -//.word 0x211d8fb8 -//.word 0xb67f4b1f -//.word 0xecd78cbd -//.word 0x2ff9ac13 -//.word 0x49917062 -//.word 0xcbfe8d1c -//.word 0xaf646a98 -//.word 0x3bfc2809 -//.word 0x29afe0b1 -//.word 0x04e42b52 -//.word 0xd596e8e6 -//.word 0xffa9398f -//.word 0x687ecfd1 -//.word 0xd9c568ff -//.word 0xa89295f3 -//.word 0x94b3c102 -//.word 0xf0426f30 -//.word 0x0476c39f -//.word 0xb0be444e -//.word 0x5211e000 -//.word 0xea7f3179 -//.word 0x7c0dfef0 -//.word 0xb6bf05c2 -//.word 0xd3f6f764 -//.word 0xbffcc59b -//.word 0x7cde1aef -//.word 0xc47a285d -//.word 0xf0d8a84c -//.word 0x18be1cc2 -//.word 0x7c7e58d8 -//.word 0x2213406b -//.word 0xc16cd315 -//.word 0xde08695b -//.word 0x35c33828 -//.word 0x5af01d7b -//.word 0xa0a79a5c -//.word 0x3a601b14 -//.word 0xa0c17d9d -//.word 0x35b5d058 -//.word 0x26be5cfe -//.word 0x958ce3d9 -//.word 0xf7ce2634 -//.word 0xba48aa10 -//.word 0x2b26bc18 -//.word 0x9890b3d7 -//.word 0xb17e7529 -//.word 0x34ce3def -//.word 0xca949b07 -//.word 0x2cb1bc7c -//.word 0x89a7ebf9 -//.word 0x2cab5884 -//.word 0x5afc1868 -//.word 0x79746e73 -//.word 0x785c4962 -//.word 0x6a850d9a -//.word 0x74949619 -//.word 0xea9e7bab -//.word 0xb5f58f61 -//.word 0xf841ae3f -//.word 0xf3d2b635 -//.word 0x2734d351 -//.word 0xba040032 -//.word 0x1e03cac0 -//.word 0xee69571a -//.word 0x187ca8d0 -//.word 0x41601b53 -//.word 0x653134a9 -//.word 0xbe4f9c65 -//.word 0xe8f96ad7 -//.word 0x421ea280 -//.word 0x976ffbc8 -//.word 0xfeb9e6f4 -//.word 0xfe72cb52 -//.word 0xf69296b6 -//.word 0xbca4722a -//.word 0x851cd4e2 -//.word 0x05ebbc6e -//.word 0xd7513833 -//.word 0x1ef2291c -//.word 0x6d2d498d -//.word 0xe4a96d99 -//.word 0x9c300874 -//.word 0x46c1f12b -//.word 0x0ee06692 -//.word 0xc631507e -//.word 0x4045c835 -//.word 0xfbb4db23 -//.word 0x026c8acf -//.word 0x1248150d -//.word 0xfbe57a74 -//.word 0x48b13812 -//.word 0x2244585f -//.word 0x72f4ae70 -//.word 0x46a35d6d -//.word 0x76dc9945 -//.word 0x871fb1a0 -//.word 0xcf784c16 -//.word 0xda56f29e -//.word 0x0d9bcf49 -//.word 0x89f0b430 -//.word 0x535b5faa -//.word 0xb113fcc3 -//.word 0xd793ecea -//.word 0xc2edc4ea -//.word 0x6561991c -//.word 0x032e7bda -//.word 0xdca83f36 -//.word 0x0b8b82ec -//.word 0xaf8fea96 -//.word 0x493caf1f -//.word 0x65005a7a -//.word 0x7d7fcd94 -//.word 0x1a2a8487 -//.word 0x3c131a10 -//.word 0xfcff0f43 -//.word 0x70bdc87d -//.word 0xcfb7d79b -//.word 0xd5c77d69 -//.word 0x694c6d5d -//.word 0x7e7cd386 -//.word 0x37fc95bf -//.word 0x4eaed928 -//.word 0xb6cac7d7 -//.word 0x7f3090ca -//.word 0xfbfcaf20 -//.word 0x1f5b6f89 -//.word 0x2b9eadfc -//.word 0x8e8ddfa8 -//.word 0x03fe552c -//.word 0x01a6bf0a -//.word 0x522ef059 -//.word 0x0189e1bb -//.word 0x7a86f98f -//.word 0xeda18b68 -//.word 0xf31fa1bd -//.word 0x745af8e2 -//.word 0xc8594b36 -//.word 0x1ca3d49f -//.word 0x18551133 -//.word 0xbf73c438 -//.word 0x967c3d4f -//.word 0x0841dbec -//.word 0x09f6d109 -//.word 0xfa8a261c -//.word 0xcc340046 -//.word 0x694f21cd -//.word 0x4f67b2cc -//.word 0x7e943f29 -//.word 0x950604c8 -//.word 0x38e267fe -//.word 0xb44dc549 -//.word 0xe6c5713e -//.word 0x59b8fac2 -//.word 0xae4fad7d -//.word 0x418b5b8c -//.word 0x09945d76 -//.word 0xc04ed462 -//.word 0x442c3587 -//.word 0x3e4906e3 -//.word 0x01b5e230 -//.word 0xb50cc314 -//.word 0xb44e8198 -//.word 0x34ea95db -//.word 0x271c2308 -//.word 0x5f793885 -//.word 0xf6c9506d -//.word 0xed141b41 -//.word 0x130080da -//.word 0x285ae3a2 -//.word 0x43f2a304 -//.word 0x71ace721 -//.word 0x9fd49bc5 -//.word 0xbab2b599 -//.word 0x145ebd9a -//.word 0x0ad68cc9 -//.word 0xe44e5424 -//.word 0xfcc7e0d6 -//.word 0x23e31dab -//.word 0x40f8dac6 -//.word 0x3a63cc96 -//.word 0x181fd506 -//.word 0x679685f4 -//.word 0xdcb6e2e5 -//.word 0x3b4864f7 -//.word 0x777d4417 -//.word 0x1bcaf773 -//.word 0xe8f6f532 -//.word 0xc072be63 -//.word 0xc3e81f34 -//.word 0xb716b165 -//.word 0xaddda4fc -//.word 0xe195ba39 -//.word 0xe3a496cc -//.word 0xf44f3746 -//.word 0xb3d0c0ce -//.word 0xf9a87a15 -//.word 0x01361b8c -//.word 0xcc8949d4 -//.word 0xc3735a75 -//.word 0x9fde5ed4 -//.word 0x86635f5f -//.word 0x7619e70b -//.word 0xe7abc300 -//.word 0xacae0792 -//.word 0x1b315274 -//.word 0x6d955328 -//.word 0x689f8cba -//.word 0x3bcb56ae -//.word 0xa9e32637 -//.word 0x69d10eaa -//.word 0xcdb28731 -//.word 0xa32b6dc4 -//.word 0x59004b55 -//.word 0x64e2d94b -//.word 0xe189c332 -//.word 0x7d03acb1 -//.word 0x934c73bc -//.word 0x951eb50a -//.word 0xad0a93ca -//.word 0xa4c8b592 -//.word 0x02cc8e98 -//.word 0x7719e224 -//.word 0x795a8645 -//.word 0x2f2f68c4 -//.word 0x8ec5cf56 -//.word 0xc2a9e315 -//.word 0xcfde6f31 -//.word 0x782de6e3 -//.word 0x60bca4a3 -//.word 0x6fe2779b -//.word 0x773a5e5b -//.word 0x17f690ce -//.word 0xe076c06d -//.word 0xb71aa0b2 -//.word 0x7a54a4d0 -//.word 0xe70108a1 -//.word 0xb9f914e0 -//.word 0x13e49f98 -//.word 0x2250d2dc -//.word 0xff012eb9 -//.word 0xd288d069 -//.word 0x3d18f4c9 -//.word 0xf894b90e -//.word 0xb8ec24b3 -//.word 0x56aa66b5 -//.word 0x2dc86203 -//.word 0xc4c56a30 -//.word 0xadf8496c -//.word 0xac2387b2 -//.word 0x1c4be843 -//.word 0x8fc73652 -//.word 0xb5984001 -//.word 0x7ff8238c -//.word 0x8335c8c4 -//.word 0xa3c0aec0 -//.word 0xe981eacf -//.word 0xb66e6cb0 -//.word 0x1c5c8306 -//.word 0x8815a406 -//.word 0xa4aa6773 -//.word 0x7b0bd2cc -//.word 0xdfd4dac4 -//.word 0x076a27f2 -//.word 0x7d4718ca -//.word 0x389207cc -//.word 0x04f3cefb -//.word 0x2ba58991 -//.word 0x4ecd9ef1 -//.word 0x940afbdd -//.word 0x074d9fe9 -//.word 0x3aeb5c2f -//.word 0x2ff0db45 -//.word 0x79b7e06c -//.word 0x9eb7cf0a -//.word 0xbfa0705b -//.word 0x7ba7ef63 -//.word 0x101d2727 -//.word 0xc3471f1c -//.word 0x836ad5e0 -//.word 0xc9253b28 -//.word 0xc20380fa -//.word 0xb051901c -//.word 0x8e2ddecc -//.word 0xf2e061b1 -//.word 0x386edc12 -//.word 0xdd6b6346 -//.word 0x290f1b6b -//.word 0x118d415b -//.word 0x5ba16edc -//.word 0x03681917 -//.word 0xde755d4c -//.word 0x7d21fcc3 -//.word 0x5422a506 -//.word 0x1b60724d -//.word 0x7504b53a -//.word 0xd0d1f4c6 -//.word 0x8cb7327c -//.word 0x5fa570e5 -//.word 0xf8a07443 -//.word 0xe212c981 -//.word 0xac64076b -//.word 0x47ce551b -//.word 0xaf6e2bb3 -//.word 0xcd985d52 -//.word 0x9d6e5540 -//.word 0x8cb09f6c -//.word 0x24d5ac19 -//.word 0xea5acfd4 -//.word 0x875a8ca9 -//.word 0x275f1296 -//.word 0x1f780640 -//.word 0xd28b82e5 -//.word 0xd5ed5e92 -//.word 0x5130ae96 -//.word 0xa93c8b36 -//.word 0x5da117a2 -//.word 0x2f2cbb28 -//.word 0x84b9b3a8 -//.word 0x0c47cd48 -//.word 0xa5526d68 -//.word 0x7d5dd5d9 -//.word 0x77cea349 -//.word 0xd1fe9b02 -//.word 0x0391a7d5 -//.word 0xea031c50 -//.word 0x25843f38 -//.word 0xc0060833 -//.word 0x0f9426c4 -//.word 0xdde5427c -//.word 0xc731886f -//.word 0xe24364e6 -//.word 0xa4d08953 -//.word 0x0107388a -//.word 0xd469bf2d -//.word 0x81db4068 -//.word 0xd8f9b3df -//.word 0x3dae2ee5 -//.word 0x060164ef -//.word 0x25326d48 -//.word 0x0706c506 -//.word 0xbc5f963c -//.word 0x570f3a71 -//.word 0x98eefb51 -//.word 0xc82b1ea3 -//.word 0xe5df217b -//.word 0xffe840b1 -//.word 0xe2f43e91 -//.word 0xf5dc61d4 -//.word 0x6234bfd0 -//.word 0x7720b8eb -//.word 0x4d68c455 -//.word 0xa7cf6ff7 -//.word 0x1ca1a1a6 -//.word 0x798c239d -//.word 0x61b05f2a -//.word 0x36f967a7 -//.word 0x3dad39ac -//.word 0xfc414283 -//.word 0xe77120dc -//.word 0x3c90acc2 -//.word 0x2c1c38ce -//.word 0x3b95159b -//.word 0xe98f5979 -//.word 0x9207de66 -//.word 0x93f38e3a -//.word 0xae1cde21 -//.word 0xb030994e -//.word 0x5013dfee -//.word 0x5b776d5b -//.word 0x0eac1f93 -//.word 0xc3b9b2e8 -//.word 0xd1abcff9 -//.word 0xad2d45e0 -//.word 0x555997ad -//.word 0xeeceb614 -//.word 0xab030f62 -//.word 0xf2dbc8b5 -//.word 0xba79476d -//.word 0x3855f5de -//.word 0xba8f4147 -//.word 0xd384e708 -//.word 0xb8a0720f -//.word 0xea73ff94 -//.word 0x15064506 -//.word 0x386fd245 -//.word 0x07a39711 -//.word 0x8e8ca7c3 -//.word 0x165b3c3a -//.word 0x4c20fb19 -//.word 0xa0977930 -//.word 0xec45fd37 -//.word 0x56c488c2 -//.word 0x775c1271 -//.word 0xbdd31767 -//.word 0x0d8552fe -//.word 0xadb7c9b9 -//.word 0x6228097b -//.word 0xd5e9b3f6 -//.word 0x3b6f3765 -//.word 0x35e7e07e -//.word 0xf5c911a2 -//.word 0xa3b0ce58 -//.word 0xff697df9 -//.word 0x4749eead -//.word 0x5bc49a95 -//.word 0x1f3c284a -//.word 0x21173687 -//.word 0x7c145522 -//.word 0xfcdf5541 -//.word 0x82e3c4ca -//.word 0xaa5fb11b -//.word 0xacbcb5fc -//.word 0x801e35d1 -//.word 0x4639e115 -//.word 0xe4668003 -//.word 0xf1f5f096 -//.word 0xd2c568b4 -//.word 0x221301a6 -//.word 0x589075cc -//.word 0xa3b6268f -//.word 0x195b6296 -//.word 0x1187e53d -//.word 0xcd839f43 -//.word 0x5d32b8c2 -//.word 0xbfa4d265 -//.word 0x4be98ed5 -//.word 0x4f235174 -//.word 0xf6df484e -//.word 0x6ea6a94d -//.word 0x49ce3cac -//.word 0x24961bad -//.word 0x8773b68f -//.word 0x0da419ba -//.word 0xc50c723e -//.word 0xd741cd7b -//.word 0x6be12321 -//.word 0xc625935c -//.word 0xb6b8ef48 -//.word 0x31c97aab -//.word 0x395ff0e3 -//.word 0x02ecc71d -//.word 0x5726b5c8 -//.word 0x3a12724a -//.word 0xcb61bff1 -//.word 0x6b00a72c -//.word 0x20eb05fb -//.word 0x3b4246a4 -//.word 0x399e70a8 -//.word 0xe8a563f5 -//.word 0xcbdc605d -//.word 0xbebdc747 -//.word 0xdd0a25a4 -//.word 0xa3606d25 -//.word 0x4f0f86ab -//.word 0x8c290600 -//.word 0x50d93ec4 -//.word 0x05f676aa -//.word 0xe7d879e4 -//.word 0xad6b55db -//.word 0x6b815c24 -//.word 0xb76d6eaf -//.word 0x0bcd7b42 -//.word 0x6aa74326 -//.word 0x46b86021 -//.word 0xa20887a4 -//.word 0x74c20b44 -//.word 0x4d43a26e -//.word 0x3b716c57 -//.word 0xef4e3133 -//.word 0x1bcdeba7 -//.word 0x1ee48480 -//.word 0xe3e2e0a5 -//.word 0x06031e4a -//.word 0x39411b67 -//.word 0xe76e3869 -//.word 0x17805e27 -//.word 0x922c3f17 -//.word 0x48b6dec2 -//.word 0xf0075175 -//.word 0xef00c53a -//.word 0x7b0ec406 -//.word 0x00feb334 -//.word 0xc2139f32 -//.word 0xc556397b -//.word 0xea2e1ec5 -//.word 0x5a305c7b -//.word 0x2738326d -//.word 0x31b918c7 -//.word 0x4751ff3f -//.word 0x8fa1da93 -//.word 0x285b5d33 -//.word 0x0d9c053a -//.word 0x3d7d58a3 -//.word 0x19e56eba -//.word 0x0da1b0d0 -//.word 0x72b6e033 -//.word 0xb3f55a5e -//.word 0xafd1996c -//.word 0x5f6efcd3 -//.word 0xb9faca4e -//.word 0xd440751b -//.word 0x4c7a1b67 -//.word 0xe8675207 -//.word 0x7a9e2568 -//.word 0x07225ac9 -//.word 0x2836f7a7 -//.word 0xb0730479 -//.word 0x8f17919e -//.word 0xf7a0fb94 -//.word 0xbd9a6c6a -//.word 0x01b5a178 -//.word 0x111af04d -//.word 0x8bff89e9 -//.word 0xc279fc2d -//.word 0x6392fb8f -//.word 0x599c6112 -//.word 0xedc57476 -//.word 0x32eb67ab -//.word 0xa0b1248c -//.word 0xffd248ca -//.word 0x87b56e26 -//.word 0x4542b0e4 -//.word 0xc0f56b7c -//.word 0xdd304392 -//.word 0x00d66728 -//.word 0x74151613 -//.word 0x0d8363ab -//.word 0x0b6d35c7 -//.word 0x426b91e9 -//.word 0x78381cb5 -//.word 0x0fc1dba8 -//.word 0xe47c3e06 -//.word 0x76fb5d14 -//.word 0x4bc18188 -//.word 0x8f54e63e -//.word 0xff94bf2c -//.word 0x054a7b98 -//.word 0x24044788 -//.word 0x9721d47b -//.word 0x35285a56 -//.word 0x985edda1 -//.word 0x7e97aff3 -//.word 0x6f4c36ab -//.word 0xa1eeefe1 -//.word 0x187ab39d -//.word 0x114e3946 -//.word 0xa13bdd5d -//.word 0x9adb9f6b -//.word 0xae246f37 -//.word 0xd73ea83d -//.word 0xf692da5c -//.word 0xba24cccf -//.word 0xc322c15e -//.word 0x07bdfbd5 -//.word 0x75377eb6 -//.word 0xd93d162b -//.word 0x00789b3e -//.word 0x1c5f744c -//.word 0x694f5ab7 -//.word 0x11dd5edc -//.word 0x4e6b2e45 -//.word 0xcef9941f -//.word 0x5b3e3fee -//.word 0xbbf7c67f -//.word 0xd580ea1e -//.word 0x16a11c0a -//.word 0x13aa3f26 -//.word 0x70c2aef1 -//.word 0x007c81b8 -//.word 0x2dab0c0b -//.word 0x9b78a96d -//.word 0x08b1b84f -//.word 0x7764e340 -//.word 0x8dada75e -//.word 0x3bcc0f10 -//.word 0x9d7ac3f7 -//.word 0x227e4221 -//.word 0xee7b6c80 -//.word 0x7c0c439b -//.word 0x8812f284 -//.word 0x2c4d0f0a -//.word 0x492a1d2f -//.word 0x28dc55dd -//.word 0x61aea6d4 -//.word 0xfc98fae7 -//.word 0xd710bb68 -//.word 0x472295e1 -//.word 0x02c37e04 -//.word 0x3d63f4e5 -//.word 0x11c18667 -//.word 0x230396f4 -//.word 0x84065d72 -//.word 0xd6f33072 -//.word 0xb11301aa -//.word 0x45e428a5 -//.word 0x406c64b9 -//.word 0xf2cd1c3a -//.word 0xae1aebed -//.word 0x74695cbf -//.word 0xce29f2b7 -//.word 0xf8b66c2a -//.word 0x432b462e -//.word 0xbb788350 -//.word 0x08b4aa8a -//.word 0x92b40f6f -//.word 0xe9dc53a9 -//.word 0x63352ea5 -//.word 0x07c06c8d -//.word 0xa90a3677 -//.word 0x570193dc -//.word 0xf4062f4b -//.word 0x23435a5e -//.word 0x673f53ee -//.word 0x88afc783 -//.word 0x3890950e -//.word 0xf672d4db -//.word 0x331717c1 -//.word 0xb33cef9c -//.word 0x37b7b2fd -//.word 0x59c27b1f -//.word 0xb797721d -//.word 0x533d4e63 -//.word 0x3aa11862 -//.word 0x64e83189 -//.word 0xdc049670 -//.word 0x20856356 -//.word 0xcbb296cd -//.word 0x71d916b4 -//.word 0xcbe3f466 -//.word 0x142bf031 -//.word 0xb2913f0a -//.word 0x19ca8b7e -//.word 0xedfa3cec -//.word 0x6684f6f2 -//.word 0xf9206225 -//.word 0x352f3205 -//.word 0xeb4c5f30 -//.word 0x9124b5d5 -//.word 0xe887926c -//.word 0xddbfeba4 -//.word 0xad208f9d -//.word 0x4de0b058 -//.word 0x09299f6c -//.word 0x6b6dd7fa -//.word 0x5efa3de2 -//.word 0x93cea637 -//.word 0x24ac9af1 -//.word 0x786f58e2 -//.word 0x669f19ec -//.word 0x9d429970 -//.word 0x43f4d409 -//.word 0xdc3a0d7b -//.word 0x6e1415e6 -//.word 0xe2d1ca40 -//.word 0xae27de01 -//.word 0xb183da20 -//.word 0x5e9e623f -//.word 0x1d51ba23 -//.word 0xeeaa8966 -//.word 0x503fdd70 -//.word 0x61c270a3 -//.word 0x46d62ad6 -//.word 0xcd21e605 -//.word 0x51a37946 -//.word 0xdf46f0ff -//.word 0x96b61a57 -//.word 0x547247ea -//.word 0x8f244ec1 -//.word 0x802ed581 -//.word 0x8785cce2 -//.word 0xcbc23b63 -//.word 0x21763e3d -//.word 0x2fbe4d95 -//.word 0xd118c1f5 -//.word 0xbb7594fd -//.word 0x60906956 -//.word 0x137dcce8 -//.word 0x6c85ba4d -//.word 0xee316485 -//.word 0xe6a530eb -//.word 0x962f0167 -//.word 0x9320b8e6 -//.word 0x6cdbfb07 -//.word 0x8c2b3517 -//.word 0x62dadd40 -//.word 0xbf7ffcfd -//.word 0x7f97e9d1 -//.word 0x6bd75739 -//.word 0x5ec192df -//.word 0xa7760610 -//.word 0xafcb0170 -//.word 0xdc9ebaed -//.word 0xb46b91f1 -//.word 0x461a98dc -//.word 0xc51b53b1 -//.word 0x77b5bc0f -//.word 0xcd9b8a64 -//.word 0xd4c1b35d -//.word 0xcc6d30a1 -//.word 0x159100be -//.word 0x53586f63 -//.word 0xcaff98d1 -//.word 0x0ae6298c -//.word 0xd1e76656 -//.word 0x2de6715d -//.word 0xe1a9c8b4 -//.word 0x0aea0f00 -//.word 0x02ab1074 -//.word 0x85ca00ff -//.word 0x12d503c3 -//.word 0x941ff3ca -//.word 0x42145df4 -//.word 0xc4c9cd34 -//.word 0x97d84cfc -//.word 0xb26a26f6 -//.word 0x6a95f1f5 -//.word 0x93e9ca2b -//.word 0xe845e29c -//.word 0xadef3ad2 -//.word 0x92e4aad3 -//.word 0xdb6d2850 -//.word 0xbef3471f -//.word 0x0c14feec -//.word 0x14f7ab2b -//.word 0xc5dc5750 -//.word 0x12f73c43 -//.word 0x9b7e840e -//.word 0x890154d9 -//.word 0xb9fa0919 -//.word 0x1ea5c204 -//.word 0x60111e48 -//.word 0xc97747fc -//.word 0x62cc2fd7 -//.word 0x599219a0 -//.word 0xa6f35ce5 -//.word 0xee1063f0 -//.word 0xa897f9f7 -//.word 0x7e93c393 -//.word 0xf6890e73 -//.word 0x51c0cc52 -//.word 0xb4e0d826 -//.word 0x85bf829b -//.word 0x187747bf -//.word 0x8bbce0ff -//.word 0xee6c7f52 -//.word 0xa76855b4 -//.word 0x15a357d6 -//.word 0x74784214 -//.word 0x0141dca7 -//.word 0x5e257d1c -//.word 0x3731cf04 -//.word 0x26aad2ee -//.word 0xd4a22392 -//.word 0x62ca7d4f -//.word 0x078780d8 -//.word 0xfa48b12a -//.word 0x9216c3c1 -//.word 0xab6d150b -//.word 0x4d4a7b1d -//.word 0x888541a5 -//.word 0xa2616d1f -//.word 0x7562454c -//.word 0x125e11e0 -//.word 0xaad7227b -//.word 0xaf8813db -//.word 0x363e4f50 -//.word 0xa0e9d370 -//.word 0x79f3360b -//.word 0xa0d0e662 -//.word 0xa8d7b493 -//.word 0x7f509358 -//.word 0x4dce9cf1 -//.word 0x9fbf565f -//.word 0xc54135d3 -//.word 0x78376066 -//.word 0xc19cb70a -//.word 0x161815c1 -//.word 0xc5d1d20d -//.word 0x96848da7 -//.word 0xabd42873 -//.word 0xace213b4 -//.word 0x211dce7d -//.word 0x1f5ca968 -//.word 0x272acf89 -//.word 0x4b6082a5 -//.word 0x92faa8a0 -//.word 0x9e238735 -//.word 0x8c92cdea -//.word 0x1c19d342 -//.word 0x127b2234 -//.word 0xdc7f37dc -//.word 0x74428371 -//.word 0x88d1b677 -//.word 0xd9f73d35 -//.word 0xe154096a -//.word 0xb8af933c -//.word 0x388e1d71 -//.word 0x60033ae1 -//.word 0xf6c8902b -//.word 0x708edda8 -//.word 0x1593389d -//.word 0x60739ab5 -//.word 0xa5409cae -//.word 0xf6d48252 -//.word 0x486679a9 -//.word 0xd25c1d6d -//.word 0xb6603ebe -//.word 0xe3b6e417 -//.word 0x3acd9081 -//.word 0xf014c506 -//.word 0x330ec769 -//.word 0x10a9a314 -//.word 0x94cc6f52 -//.word 0x312fd3be -//.word 0x646fc9fc -//.word 0x9562a0a6 -//.word 0x3fa84789 -//.word 0x5082c812 -//.word 0xd3e71303 -//.word 0xccd5fd6a -//.word 0x63e688d4 -//.word 0x452365be -//.word 0x481cb74c -//.word 0x4e391a3e -//.word 0x6b4be41f -//.word 0x4a66abbf -//.word 0xccf307e4 -//.word 0xf301983d -//.word 0xffdc4b97 -//.word 0xd6e1da53 -//.word 0xa9909218 -//.word 0xd5e359c5 -//.word 0x07deefaa -//.word 0xa46874f7 -//.word 0x68592b74 -//.word 0x4dd47d73 -//.word 0xaed74104 -//.word 0xac103a67 -//.word 0xd1f3e1c7 -//.word 0xf3096525 -//.word 0x5b8bf192 -//.word 0x272f2da1 -//.word 0xed42071c -//.word 0xa1f7b3f6 -//.word 0xb9fff081 -//.word 0x8e598ee1 -//.word 0x066c2dc1 -//.word 0x70534744 -//.word 0xaf78713e -//.word 0x9b64dda5 -//.word 0xa4d52442 -//.word 0xb91142ac -//.word 0x687be277 -//.word 0x4664dda9 -//.word 0x9123fd6d -//.word 0x1468060c -//.word 0x4bcdf718 -//.word 0xc8ae8deb -//.word 0xd53b0950 -//.word 0x5bcb337f -//.word 0x02749f4f -//.word 0x9ad82fa7 -//.word 0xba41d935 -//.word 0xa6f1aa63 -//.word 0x76b30b87 -//.word 0x75b6445a -//.word 0xc89b3eac -//.word 0x50cd8d56 -//.word 0xd111ad6f -//.word 0x535e8cc3 -//.word 0xc8ee4980 -//.word 0xf0953c33 -//.word 0x7a5236f3 -//.word 0x6c240adc -//.word 0xc41e4cc0 -//.word 0x5fbe5818 -//.word 0x1b7b9641 -//.word 0x399dfde5 -//.word 0x0551d6b7 -//.word 0xb8fdc363 -//.word 0x9dd1ffc4 -//.word 0x739fe758 -//.word 0x13ecbaf2 -//.word 0x52479daf -//.word 0x29d9e22b -//.word 0x133e89f5 -//.word 0xb7930740 -//.word 0xc7d047db -//.word 0x2858ef63 -//.word 0x53cfe4b7 -//.word 0xfb2c10ac -//.word 0xf00f6302 -//.word 0x43541797 -//.word 0xabe839db -//.word 0x27db6584 -//.word 0xe5b7d183 -//.word 0x63118c36 -//.word 0xd45d08df -//.word 0xc507d755 -//.word 0x00bfb2f9 -//.word 0xb014bfec -//.word 0xc744147f -//.word 0x9d5277eb -//.word 0xd95a6743 -//.word 0x952261a6 -//.word 0xbdf15cb9 -//.word 0xb8a49654 -//.word 0x4bfe927c -//.word 0xba406192 -//.word 0x30f922c9 -//.word 0x6020c5de -//.word 0x6d601403 -//.word 0x07b3f31c -//.word 0xd832e62d -//.word 0x1e2cd513 -//.word 0x99750c73 -//.word 0xa70086f1 -//.word 0xaeb06ba2 -//.word 0xba6cd7c3 -//.word 0x6772ddab -//.word 0x02edccfe -//.word 0xebc9b024 -//.word 0x3dc61cf9 -//.word 0xb1cb27c6 -//.word 0xc07eb571 -//.word 0x0811f8f0 -//.word 0xf15e3603 -//.word 0x9037cc23 -//.word 0xccf773b5 -//.word 0xbf5dc284 -//.word 0x5f9bf46e -//.word 0x5da9ec5e -//.word 0x4ddf767a -//.word 0x08c3d09d -//.word 0x4e206907 -//.word 0xb058e853 -//.word 0xadfa70aa -//.word 0x1c972237 -//.word 0xcad2e4da -//.word 0x63b76121 -//.word 0x964e5174 -//.word 0x746ffb8f -//.word 0x19d7f836 -//.word 0x8f7c3923 -//.word 0xef1e4c44 -//.word 0xc91fda23 -//.word 0xc69475a6 -//.word 0x8c9c90f8 -//.word 0xe2f1cfc7 -//.word 0x15bc82b0 -//.word 0x9aae6cf7 -//.word 0xf44cc87c -//.word 0xd98a8eea -//.word 0x909cf232 -//.word 0x9d092d38 -//.word 0xa00181cb -//.word 0x7bf077db -//.word 0xb3536ce6 -//.word 0x19cb4bb4 -//.word 0xa96f9c44 -//.word 0xb267be06 -//.word 0x37b7704b -//.word 0x955897f9 -//.word 0x678d3b83 -//.word 0xa774d218 -//.word 0x16dbc11b -//.word 0xdd5620d4 -//.word 0x748ebd65 -//.word 0xc3dc64ff -//.word 0x87175e55 -//.word 0xf8aa3851 -//.word 0xa9e9c606 -//.word 0xafa566e7 -//.word 0x05fd8936 -//.word 0x2f7870bf -//.word 0x1e5134c5 -//.word 0x5412093d -//.word 0x4864c33a -//.word 0x0c269aa9 -//.word 0x2dbc2a3e -//.word 0xdbaabeae -//.word 0x4961cd1f -//.word 0x5758c5dc -//.word 0x6f5f084e -//.word 0xac313428 -//.word 0x4248a8e1 -//.word 0x1af54467 -//.word 0xbcaf6f12 -//.word 0x72ac5fd6 -//.word 0xaaae95be -//.word 0x9d20a695 -//.word 0x2e6141e6 -//.word 0x15606e28 -//.word 0x3c691432 -//.word 0x693ebef5 -//.word 0x1e6a9e69 -//.word 0xbed2d3c8 -//.word 0xf08de7fb -//.word 0x48f59c51 -//.word 0x25fee877 -//.word 0xd5c73ea5 -//.word 0x006f0f15 -//.word 0x432a91b9 -//.word 0x1b94bf2d -//.word 0x0545a1eb -//.word 0xe3a5cdbe -//.word 0xa2012e79 -//.word 0x1adf04e8 -//.word 0x358f2c07 -//.word 0x5403a272 -//.word 0xeee1441d -//.word 0x7ad5d845 -//.word 0x902c51a6 -//.word 0x4b9f4eef -//.word 0xf16ce473 -//.word 0xd6ac9d21 -//.word 0x7de0c0b6 -//.word 0x01cdd331 -//.word 0xb38a5f87 -//.word 0x05d7f399 -//.word 0xa7b06b63 -//.word 0xef227276 -//.word 0x7e5e46a8 -//.word 0x210cbc0a -//.word 0xf5e1831a -//.word 0xcf74ac3a -//.word 0xda4d6a61 -//.word 0x823f1711 -//.word 0x91f97889 -//.word 0x98d7423b -//.word 0x91fedd80 -//.word 0xc2a7678b -//.word 0xe5bbfc9b -//.word 0x85a13575 -//.word 0xab53ee12 -//.word 0xbab84d95 -//.word 0x982e0080 -//.word 0x0e65c526 -//.word 0x72743064 -//.word 0x8326a98c -//.word 0x9495b4a2 -//.word 0xedfb75cb -//.word 0x6ec47302 -//.word 0x75e89c0d -//.word 0x027789af -//.word 0x19760420 -//.word 0x68e9c7ba -//.word 0x2a3187f5 -//.word 0x4b983195 -//.word 0xcd2b7422 -//.word 0x6ac87f99 -//.word 0x7b770c61 -//.word 0x18fd9d80 -//.word 0x81af050f -//.word 0xbc852beb -//.word 0x806f0bae -//.word 0x52ecfdde -//.word 0xeed83a64 -//.word 0xe8859c3f -//.word 0x930ea579 -//.word 0x22e8c35a -//.word 0x0dbad2dd -//.word 0xb76fe360 -//.word 0x4d893c9f -//.word 0xf1b8a0e3 -//.word 0x18abd077 -//.word 0x3026515c -//.word 0x8755703d -//.word 0x686084a5 -//.word 0x873f7370 -//.word 0x9ed07780 -//.word 0x592622b1 -//.word 0x7024a00e -//.word 0x124b3d45 -//.word 0x8ad12658 -//.word 0x1df37496 -//.word 0x318c66ca -//.word 0xb5e5eeb2 -//.word 0xbccf70b2 -//.word 0x6befc6ca -//.word 0x165a87c6 -//.word 0xa66289b4 -//.word 0x3eafa49b -//.word 0x1e91b96a -//.word 0xc794f32f -//.word 0x5f554d89 -//.word 0x58955560 -//.word 0x4d8c2fd3 -//.word 0x2c7fdc72 -//.word 0x9a95bdae -//.word 0x93e7528d -//.word 0x51d648a3 -//.word 0x70a1b33d -//.word 0x4f3798df -//.word 0xb949aef1 -//.word 0xc5a465b5 -//.word 0xfabe287c -//.word 0xb78edf1a -//.word 0xd2a1b997 -//.word 0x806b2827 -//.word 0x75db2d5c -//.word 0x4c32d59b -//.word 0x281404cd -//.word 0x9cdf7156 -//.word 0xc83df24b -//.word 0xc5f5fadf -//.word 0x44075f1f -//.word 0x71f761e0 -//.word 0x1e69e9f5 -//.word 0x1dee0ea5 -//.word 0xed1edd5c -//.word 0x9ae75aa0 -//.word 0xde24c247 -//.word 0x8c7113e7 -//.word 0x2e3ece8f -//.word 0xed23fcb4 -//.word 0xb2736f6e -//.word 0x8b144ae5 -//.word 0x508ec405 -//.word 0x8661287a -//.word 0x839c20d8 -//.word 0xd3ab3419 -//.word 0xdb718e4d -//.word 0xbc97008d -//.word 0x7b234831 -//.word 0x5e4c9243 -//.word 0x998c3e33 -//.word 0x29f8e4cb -//.word 0x01cd9566 -//.word 0x644b645d -//.word 0x92c625c3 -//.word 0xa6fa7552 -//.word 0xbf9ffba4 -//.word 0x5e3deda7 -//.word 0x0f42d54b -//.word 0x4c52957d -//.word 0x9edea859 -//.word 0x05f8ac9b -//.word 0x9a651d57 -//.word 0x73f464eb -//.word 0xc70f1031 -//.word 0x529063f9 -//.word 0xfbd610b6 -//.word 0xb5174377 -//.word 0xa3f7e219 -//.word 0x7f5a12bb -//.word 0x3c77fe73 -//.word 0xea2fd43f -//.word 0xdb9c0f3f -//.word 0x04ecfc21 -//.word 0xa57077dc -//.word 0x2df0f6a1 -//.word 0x5842ca0e -//.word 0x9a1aa1a6 -//.word 0xc0244e7e -//.word 0xd550cd38 -//.word 0x426e8135 -//.word 0x3afac107 -//.word 0x55399325 -//.word 0x7b85b7e3 -//.word 0x04e4e8a1 -//.word 0x1de05e42 -//.word 0x6e9397e0 -//.word 0xfa0257bd -//.word 0x46acee7d -//.word 0xbd62b993 -//.word 0x5358ebfa -//.word 0x697d8d25 -//.word 0xf008c438 -//.word 0xd2535378 -//.word 0x8ded6000 -//.word 0x21eb7bb7 -//.word 0x2d7edc7e -//.word 0x55cbecae -//.word 0xe6f608c1 -//.word 0xbd80814f -//.word 0x65d4e73d -//.word 0x7f1c8731 -//.word 0x67593248 -//.word 0x14b3400c -//.word 0x400dd5a0 -//.word 0xc9dd633e -//.word 0x583b70e4 -//.word 0x40389a49 -//.word 0xa970d816 -//.word 0xede30253 -//.word 0x4200941f -//.word 0x9a03afa5 -//.word 0xc781604b -//.word 0xe341252c -//.word 0xef4eadc9 -//.word 0xba4ae0fb -//.word 0x04051f2d -//.word 0xe44fcdc7 -//.word 0x670a0eed -//.word 0x7a83ce6a -//.word 0x0a0206e7 -//.word 0x699f3a61 -//.word 0xf45847da -//.word 0xf3615b4e -//.word 0xc0bb45e8 -//.word 0x2c08ef76 -//.word 0x1e9e281b -//.word 0x7ddaa743 -//.word 0x50b64ddc -//.word 0x249eabc4 -//.word 0xae80c47d -//.word 0xb2231428 -//.word 0x24b9d1b1 -//.word 0x8cb77047 -//.word 0xafe46b0f -//.word 0x6bb04219 -//.word 0xe3c8c093 -//.word 0xdce77f3c -//.word 0x67efae1c -//.word 0xc1381273 -//.word 0x77284bef -//.word 0xcd045921 -//.word 0x61055e32 -//.word 0x0cafa5d2 -//.word 0x095ee472 -//.word 0x5922beb3 -//.word 0x65cc8c1e -//.word 0xe6495d15 -//.word 0x022f3b09 -//.word 0xb796b1ee -//.word 0x7d298aec -//.word 0x277dda58 -//.word 0x0ba143e2 -//.word 0x62f67110 -//.word 0xf240e7eb -//.word 0xeafefef8 -//.word 0x0df72a69 -//.word 0x12168095 -//.word 0x4b7775a6 -//.word 0x86c2e991 -//.word 0x31b8644c -//.word 0xc10b9f3b -//.word 0x547346eb -//.word 0x94fefc02 -//.word 0xdfa8a076 -//.word 0xa62bcefe -//.word 0x1318a9c6 -//.word 0xef27d867 -//.word 0xc2cbcf16 -//.word 0x3c0a501b -//.word 0xd38c3186 -//.word 0xaef25f1d -//.word 0xc2692398 -//.word 0x3b7ea411 -//.word 0x1d34aeb6 -//.word 0x2b53b1c1 -//.word 0x08040daa -//.word 0x9c9b8c9a -//.word 0xb9b43024 -//.word 0xfe813030 -//.word 0xfc623d37 -//.word 0x98b609b6 -//.word 0xb0f20adc -//.word 0x02f07c86 -//.word 0x4989a56e -//.word 0xa8655c9f -//.word 0x4c12cc2d -//.word 0x4e547622 -//.word 0xd6bc75bb -//.word 0x867c06d5 -//.word 0x167a47a2 -//.word 0x3ba33fa0 -//.word 0xce821fcc -//.word 0x2a11c713 -//.word 0xd6cf8c09 -//.word 0x641239dd -//.word 0x989f538d -//.word 0xcd78a256 -//.word 0x95f5ec6f -//.word 0xa01604f6 -//.word 0xdf18042b -//.word 0xe846d6dc -//.word 0x9d12f920 -//.word 0x08648148 -//.word 0x8a326013 -//.word 0x3551e521 -//.word 0x768b82aa -//.word 0xf7f1d270 -//.word 0xc372daf2 -//.word 0xacad90e3 -//.word 0xea0499da -//.word 0x04f2574b -//.word 0xf49e23b6 -//.word 0x86b0d71e -//.word 0x016390bd -//.word 0x09dbb2f6 -//.word 0xc4ba2c8b -//.word 0x3ceefd10 -//.word 0x04ccf7a0 -//.word 0x1f63c2ce -//.word 0x1d0a25de -//.word 0x873c8136 -//.word 0x7da69e0f -//.word 0x9e7daa70 -//.word 0x28157f5d -//.word 0x60b0254c -//.word 0x359498d8 -//.word 0x2060cbb9 -//.word 0x4e9fecf4 -//.word 0x019eea4f -//.word 0x347b3508 -//.word 0x7e7fc5c6 -//.word 0x38ad5dd0 -//.word 0xe29b117d -//.word 0xc38106ec -//.word 0xd09079f4 -//.word 0xcf85025e -//.word 0xbc7d1a52 -//.word 0x6c0bdc10 -//.word 0x708808e1 -//.word 0x3caa4d4c -//.word 0x8958c88c -//.word 0xf7bdc842 -//.word 0xf79cd468 -//.word 0xe8e3ef86 -//.word 0x80821a28 -//.word 0x6e7d1b8f -//.word 0x3d407da7 -//.word 0x7c34d839 -//.word 0x1c8f5262 -//.word 0x19706644 -//.word 0x5d2be4fb -//.word 0xe1e139d2 -//.word 0x1555f1b7 -//.word 0x82fa7aed -//.word 0xad512b01 -//.word 0x3f7184ff -//.word 0x64e7b8e5 -//.word 0x71c16858 -//.word 0xc9e6b296 -//.word 0x01a96aac -//.word 0x429da7e9 -//.word 0xefaa8292 -//.word 0x88601ad7 -//.word 0xcf8cdc06 -//.word 0x290901ff -//.word 0x46d957e8 -//.word 0x04744522 -//.word 0x9160097b -//.word 0xd00245a5 -//.word 0xffb4bae7 -//.word 0x96185312 -//.word 0x72ab65b7 -//.word 0x329d3597 -//.word 0xe2e0bb5b -//.word 0xd77fa585 -//.word 0xd9319fa7 -//.word 0x882ed2d2 -//.word 0xf841aa52 -//.word 0x9f1edd98 -//.word 0x71f7a978 -//.word 0x494a5d95 -//.word 0x8bfd1a19 -//.word 0x07acdba9 -//.word 0x2142b398 -//.word 0x2fc6565a -//.word 0x2378db3c -//.word 0x6a1dc053 -//.word 0x14972fb2 -//.word 0x34b87fe0 -//.word 0x8a58fe8a -//.word 0x5fa5ee74 -//.word 0xb1bbcdb5 -//.word 0x9075da24 -//.word 0xc882d40e -//.word 0xc0bb052a -//.word 0xa2b37fce -//.word 0xbc90a662 -//.word 0x271aee16 -//.word 0xa612e6d0 -//.word 0xd0c57668 -//.word 0x72e16418 -//.word 0x2f861d2e -//.word 0x69a0b304 -//.word 0x65752232 -//.word 0xa97ad702 -//.word 0xa96b7325 -//.word 0xa39acca4 -//.word 0xc8883419 -//.word 0x9cb2ff1e -//.word 0x9fad3f06 -//.word 0x2d75d2cb -//.word 0xa3039f48 -//.word 0xc31d1ca8 -//.word 0x5a72141f -//.word 0x1fe6a7d8 -//.word 0xdf2b922e -//.word 0xd791b01e -//.word 0x621fc1fc -//.word 0xd4e26b66 -//.word 0xa5857e77 -//.word 0xd2227c3c -//.word 0x8058596c -//.word 0xe29e7f53 -//.word 0x5ed61510 -//.word 0xeb268100 -//.word 0xbe032b7a -//.word 0x258e84bd -//.word 0xb3244826 -//.word 0x9d3000a7 -//.word 0x6444ca74 -//.word 0xb4695cff -//.word 0x8db34727 -//.word 0xa01879ac -//.word 0xfc8106e7 -//.word 0xe92228b8 -//.word 0x140784bf -//.word 0xedf0aecf -//.word 0x4e5ff09f -//.word 0x5def47c3 -//.word 0xb3e7afdb -//.word 0xbe0fa00b -//.word 0x63c3d9ab -//.word 0xe8455c3f -//.word 0x1258baa9 -//.word 0x8a0a909d -//.word 0x85d15256 -//.word 0xa4d94787 -//.word 0x199dd595 -//.word 0x0cb5ff03 -//.word 0x3dee2c2e -//.word 0xeaa02a3a -//.word 0xf33c724c -//.word 0x3c25aef9 -//.word 0x53c178ff -//.word 0x53cf6533 -//.word 0x08fb42bb -//.word 0x53af9d7d -//.word 0xd02d88d7 -//.word 0xb7db9991 -//.word 0x00dd3510 -//.word 0xcbe90ecc -//.word 0xfe57eb04 -//.word 0x3078a8b0 -//.word 0xc6297db7 -//.word 0x5ba88362 -//.word 0x66a67310 -//.word 0x169db12c -//.word 0x81638a5d -//.word 0xfe00bafc -//.word 0xcfbd32cb -//.word 0x047d18e4 -//.word 0x9b500eef -//.word 0xec46b798 -//.word 0x45817741 -//.word 0xd18e7bf3 -//.word 0xbef6fa9b -//.word 0x9e0fba73 -//.word 0x0e18d5be -//.word 0x9685bdb8 -//.word 0xd1987ecd -//.word 0xce314309 -//.word 0xb5e71cd0 -//.word 0xae57fecf -//.word 0xfebc0c32 -//.word 0x73c11417 -//.word 0x03935d43 -//.word 0xb039a014 -//.word 0xaf2854b7 -//.word 0xc8122e9b -//.word 0x0000e926 -//.word 0x76a043a6 -//.word 0x8be0488a -//.word 0x45bbd2d2 -//.word 0xf65351c4 -//.word 0x1841c8e1 -//.word 0x7c291817 -//.word 0xa4918138 -//.word 0x6df366ab -//.word 0xf0105062 -//.word 0xab88360b -//.word 0xdca8fc8b -//.word 0x2e8339a8 -//.word 0x97443d05 -//.word 0x81c25354 -//.word 0x285543c7 -//.word 0x43e91bc7 -//.word 0xe6502fe9 -//.word 0xa7dd5f1e -//.word 0x002e982a -//.word 0xf4499e57 -//.word 0xf5eb086a -//.word 0x061c8cd6 -//.word 0x1d077c30 -//.word 0xcb0991e3 -//.word 0x1e08e825 -//.word 0xc7064a29 -//.word 0x78f5b096 -//.word 0x90cd0639 -//.word 0xfadd30f6 -//.word 0x525e4b05 -//.word 0x4a4e355b -//.word 0x4d7c4f65 -//.word 0x62df81fc -//.word 0x522b7f96 -//.word 0x0da64bb9 -//.word 0x4a38fcb6 -//.word 0x6ec2bd93 -//.word 0xafb11849 -//.word 0x79d37530 -//.word 0x1069ddb7 -//.word 0x787d0458 -//.word 0x927687cb -//.word 0x87e9727a -//.word 0x69b20536 -//.word 0x1844b828 -//.word 0x633d7c0a -//.word 0x703e4497 -//.word 0x5ef9c43f -//.word 0x288b7820 -//.word 0xcd0de932 -//.word 0xae652cc1 -//.word 0x3762ab21 -//.word 0xc109289d -//.word 0xb729feb0 -//.word 0xf836aa78 -//.word 0x7d538b67 -//.word 0x3cb1e63c -//.word 0x4c182d31 -//.word 0x49c38176 -//.word 0xfa7175df -//.word 0x31b915da -//.word 0xf39e27a3 -//.word 0xd963b0bb -//.word 0xb6a1ba96 -//.word 0x7a965593 -//.word 0x57c0dc32 -//.word 0x22aa7982 -//.word 0xfb07ebd8 -//.word 0x30fd87c6 -//.word 0x5fc37d4b -//.word 0xdb6e5d48 -//.word 0x5108da33 -//.word 0xace3cd0f -//.word 0x352c7d9c -//.word 0xffc31dcb -//.word 0x824a9674 -//.word 0x867d874b -//.word 0x43c18a11 -//.word 0xc6ffba07 -//.word 0x96b272a8 -//.word 0x983f5797 -//.word 0x308698d7 -//.word 0xa9b6743a -//.word 0xd765fd1c -//.word 0xfae01c50 -//.word 0xe6bfd65b -//.word 0x61bdcde0 -//.word 0xcdc70a5c -//.word 0x0753f914 -//.word 0x8ef3b54b -//.word 0xe82a86b7 -//.word 0x417ea936 -//.word 0x56ce4fbe -//.word 0x91e6e792 -//.word 0x7551a0bc -//.word 0x3d6e2ab7 -//.word 0xc0c7bd6c -//.word 0x989d5d60 -//.word 0x83c85c2b -//.word 0x09be202c -//.word 0x60f1277b -//.word 0x8c5e471f -//.word 0xca623b81 -//.word 0x2fd05b21 -//.word 0x8d42ab88 -//.word 0x96ac177e -//.word 0x4437fd7c -//.word 0x784cec64 -//.word 0xe1eeac70 -//.word 0x1f4e7e68 -//.word 0x2899a419 -//.word 0xeb152402 -//.word 0x346cca50 -//.word 0xd0486c0d -//.word 0xf11f7194 -//.word 0xd4519448 -//.word 0xa070e685 -//.word 0x92de12d7 -//.word 0x579ee56a -//.word 0xb9640ec2 -//.word 0x7eee22ac -//.word 0x8d97e375 -//.word 0x532ac159 -//.word 0x65f4a13e -//.word 0x671ddea3 -//.word 0x2c388dd3 -//.word 0x1e18065e -//.word 0xe1e5a0c9 -//.word 0x3370bb85 -//.word 0x17c4041e -//.word 0x32fef4b5 -//.word 0x755e9ab0 -//.word 0xfc9d9bb0 -//.word 0x368177c3 -//.word 0x47b00ddc -//.word 0xaac26280 -//.word 0x1b999ec1 -//.word 0xb4f55770 -//.word 0x5643128f -//.word 0x4ab60705 -//.word 0x28992595 -//.word 0xf8e45611 -//.word 0x980d04cb -//.word 0x5e20dc4d -//.word 0xfd12d24a -//.word 0xad5365d4 -//.word 0x86a224ce -//.word 0x2d2571a5 -//.word 0xb3b9853b -//.word 0xba87b424 -//.word 0xdad8f215 -//.word 0x432a9799 -//.word 0xa3825f06 -//.word 0x4a05b5b0 -//.word 0x8cc2315c -//.word 0x66d35ff8 -//.word 0x65a4c289 -//.word 0xc4921864 -//.word 0xd4b8e0a1 -//.word 0xa1051acd -//.word 0xd3924edf -//.word 0xd233cf6d -//.word 0x2e4d4120 -//.word 0x3de75966 -//.word 0x0603e466 -//.word 0x5d2e0b39 -//.word 0x5056d557 -//.word 0xc2dced4f -//.word 0x56eaa6bc -//.word 0x8f073c74 -//.word 0x35e85d02 -//.word 0xfa89e757 -//.word 0x5d7df4bc -//.word 0xcf83140b -//.word 0x1459d91f -//.word 0xedd59989 -//.word 0xf4316f84 -//.word 0xc7a7832c -//.word 0x683d8bea -//.word 0xe4e39233 -//.word 0x33bbf872 -//.word 0x60b8bb42 -//.word 0xea6af4e1 -//.word 0x6918a5e1 -//.word 0x7410b121 -//.word 0xc33b2cfc -//.word 0x91f4d5c0 -//.word 0x441ae162 -//.word 0x5064fb70 -//.word 0x59f58846 -//.word 0x98312f85 -//.word 0x7fce99c1 -//.word 0xa02e757a -//.word 0xcbecc04e -//.word 0x76b5436c -//.word 0x62595d4c -//.word 0x7c21029e -//.word 0x02640480 -//.word 0xe65591f3 -//.word 0x771ffe90 -//.word 0x3e34c277 -//.word 0x26e1c689 -//.word 0xe127dcd7 -//.word 0x86c68c59 -//.word 0x7f9a17e4 -//.word 0xa22ab656 -//.word 0x9e7f2314 -//.word 0x99325ab6 -//.word 0x17c9a100 -//.word 0x1e44c614 -//.word 0x98f2a8e7 -//.word 0xf889f8f2 -//.word 0x2076412a -//.word 0x82722631 -//.word 0x8656ecce -//.word 0x2c30389b -//.word 0xf39619fd -//.word 0xf93a4859 -//.word 0x63bfaf85 -//.word 0xffcb297d -//.word 0x285e8958 -//.word 0xeb62dd7a -//.word 0x6883f40a -//.word 0x7a401da7 -//.word 0x9a423256 -//.word 0x00edd5bf -//.word 0x0c36fa9a -//.word 0xe5b4a664 -//.word 0x60f9f556 -//.word 0x23226297 -//.word 0x0aad43b1 -//.word 0xc98b9342 -//.word 0xd376f4f4 -//.word 0x7b85f4ae -//.word 0x59fe900c -//.word 0xf06bf70d -//.word 0x8df0900c -//.word 0x72db3df2 -//.word 0x347de2a9 -//.word 0x623921d4 -//.word 0x67da68bd -//.word 0xb2292e8e -//.word 0x14c079c5 -//.word 0x6919a4e2 -//.word 0x7aea5f62 -//.word 0x22b5f7f1 -//.word 0xb09ad8dc -//.word 0x8d7150c5 -//.word 0x1f15959a -//.word 0xec020ac8 -//.word 0x0323beab -//.word 0x98e53549 -//.word 0xee906c41 -//.word 0x7ad717fe -//.word 0x45ae2d30 -//.word 0x925ba67d -//.word 0xc1d08473 -//.word 0x733810c2 -//.word 0xefd066a8 -//.word 0xc4f833ac -//.word 0xb08abe8f -//.word 0xc16a2580 -//.word 0xba5ee98f -//.word 0xb820ad64 -//.word 0x15b23b31 -//.word 0x8df2c8e5 -//.word 0x9f6e79a3 -//.word 0x36792672 -//.word 0x897f5d36 -//.word 0x4095aadf -//.word 0xd85415e0 -//.word 0x48e8ede2 -//.word 0xe564c4ba -//.word 0x8358bb99 -//.word 0xdda60083 -//.word 0x37919403 -//.word 0x4117521c -//.word 0x3f812d82 -//.word 0x6738b90b -//.word 0x8adaed60 -//.word 0xf78d27f8 -//.word 0x9d947047 -//.word 0x6f200132 -//.word 0x0d6807c7 -//.word 0xa0fba42b -//.word 0x055536d3 -//.word 0x2fb1dbf7 -//.word 0xc61f3544 -//.word 0x14d66ad2 -//.word 0x22cb6f55 -//.word 0x1e838797 -//.word 0x00250626 -//.word 0x6ed35b49 -//.word 0xdc3a4d39 -//.word 0xf768858e -//.word 0x44de4df8 -//.word 0x04e7972f -//.word 0x5c28412d -//.word 0xb277979a -//.word 0x5af11a88 -//.word 0x72468060 -//.word 0x0a58fb1c -//.word 0x8905beb7 -//.word 0x4b40bee2 -//.word 0x8f67b5f9 -//.word 0x91d06d35 -//.word 0xf3a63b23 -//.word 0x61f3c955 -//.word 0x75fd1957 -//.word 0xd8d6c7e4 -//.word 0xab2f8f5a -//.word 0x256d0e6c -//.word 0x7dffcd17 -//.word 0x0aee7bd7 -//.word 0xa9b57a1a -//.word 0x5f549ef5 -//.word 0x3fa03116 -//.word 0x8edd3afa -//.word 0x268efe60 -//.word 0x188cc8fd -//.word 0x9556e671 -//.word 0x0fa8f47a -//.word 0x9b4f5d67 -//.word 0x9a3b1ed0 -//.word 0x98d6cd85 -//.word 0x7494dac4 -//.word 0xc1cb16af -//.word 0x6dc671fc -//.word 0xa01508ef -//.word 0xe7265f85 -//.word 0x921aeaf3 -//.word 0x5bd1d34e -//.word 0x4847f78c -//.word 0xd22432ab -//.word 0x468edc30 -//.word 0x6c4293d3 -//.word 0x67e33b79 -//.word 0xdc914462 -//.word 0x56be2ba4 -//.word 0xe93d44d8 -//.word 0x169cb613 -//.word 0xefb4c718 -//.word 0x7b7e5acb -//.word 0x5c29b5e9 -//.word 0xaf6988f7 -//.word 0x34112b78 -//.word 0xafe42863 -//.word 0x8ea8f9d4 -//.word 0xcb7d1302 -//.word 0x146d2371 -//.word 0x2a449769 -//.word 0x87a260a6 -//.word 0x434ef651 -//.word 0x38cd9d2f -//.word 0x6534e819 -//.word 0x903a7bac -//.word 0x2f911441 -//.word 0x8977cd1f -//.word 0x19889bf0 -//.word 0x33d61b72 -//.word 0xea3b8e6f -//.word 0x30ee21ef -//.word 0x3f5573ac -//.word 0x381a51c6 -//.word 0x0a81c4b8 -//.word 0x96f94d8b -//.word 0x11f16f4a -//.word 0xa9ec6eb5 -//.word 0x6bd85739 -//.word 0x649b4020 -//.word 0x06f0d106 -//.word 0xce71038c -//.word 0x24f42850 -//.word 0x831b2c1c -//.word 0xd9271a5d -//.word 0x310de1d7 -//.word 0x8fcc5998 -//.word 0x1bfd812a -//.word 0x82ac0b0d -//.word 0x9a661a64 -//.word 0x45934aef -//.word 0x9707f180 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x0000F238 -//// expected output -//.word 0xfa933b22 -//.word 0x4e091268 -//.word 0x7b04a51d -//.word 0xdbe1383a -//.word 0x5c1ccfd2 -//.word 0xc0c15a3a -//.word 0xa8b40844 -//.word 0xfe70f356 -//.word 0xafa3a331 -//.word 0x7175b664 -//.word 0xcd3e0185 -//.word 0x4adfb1e2 -//.word 0xa6e20fb2 -//.word 0xa4720d53 -//.word 0xc4fa9ba5 -//.word 0x55dd5e9d -//// SHA512LongMsgvector_78 -//// vector length -//.word 0x0000F550 -//// input message -//.word 0x97fa3fd1 -//.word 0xe776ca79 -//.word 0x582bd034 -//.word 0xffebae7b -//.word 0xc2141db6 -//.word 0xbd62b4ad -//.word 0xe507af3f -//.word 0xebfeee56 -//.word 0x649c411a -//.word 0x2668e265 -//.word 0xf52c4377 -//.word 0x5f4c0aec -//.word 0xe4575aeb -//.word 0x5adc559f -//.word 0x907fdfeb -//.word 0x324ba459 -//.word 0xec4a5c54 -//.word 0xd2534e98 -//.word 0x002412e6 -//.word 0x7db19cfc -//.word 0x66bb76c4 -//.word 0x48a34dcc -//.word 0xcd81aff6 -//.word 0x9b711371 -//.word 0x792d1ae7 -//.word 0xb3e114f8 -//.word 0xc03ac6e8 -//.word 0x23c06b94 -//.word 0x8f67f8ab -//.word 0x4e60a41a -//.word 0xe435a8c8 -//.word 0xef154384 -//.word 0x516d023c -//.word 0x91b83e6f -//.word 0x7f97e6e4 -//.word 0x17247f9d -//.word 0xa8836807 -//.word 0x36bb6373 -//.word 0x1cc451c9 -//.word 0xf5e23d7b -//.word 0xbd319cb9 -//.word 0x3480d3e4 -//.word 0x8362fa44 -//.word 0x2283e0fd -//.word 0xf9394f3f -//.word 0xc65b91be -//.word 0xbe563262 -//.word 0x777d083f -//.word 0x05a171c7 -//.word 0x64e2dc3e -//.word 0x16c48b6f -//.word 0x0c86979e -//.word 0xcaaf34bd -//.word 0xc7e936e3 -//.word 0x1212d4f9 -//.word 0x3b91acb7 -//.word 0x71e608cf -//.word 0xe8856067 -//.word 0x7ee520cd -//.word 0x9dd4aa66 -//.word 0x630d9fe8 -//.word 0x000c5bc9 -//.word 0x6021bef8 -//.word 0x0bc432ca -//.word 0x4928e937 -//.word 0x89136746 -//.word 0x03ec41c6 -//.word 0x9d16243f -//.word 0x0b7c1828 -//.word 0x3b6d065a -//.word 0xf0ab78c5 -//.word 0xadbea162 -//.word 0xd48e9d68 -//.word 0x0f31fac3 -//.word 0xef0276c2 -//.word 0xd3f30a10 -//.word 0x0c2428e5 -//.word 0x3eb4427d -//.word 0x09d78bca -//.word 0xe9280166 -//.word 0x5b41abcb -//.word 0x42891fc6 -//.word 0x884e4829 -//.word 0x081466c1 -//.word 0xac2c5687 -//.word 0xd288141a -//.word 0xf5cd7e6d -//.word 0x89aa5bbd -//.word 0x26699bc7 -//.word 0xe9c3e037 -//.word 0x18f93e63 -//.word 0x04203f39 -//.word 0x34bc2b76 -//.word 0xbf91861a -//.word 0xfab6d918 -//.word 0x53ebb651 -//.word 0x7d2cf6c3 -//.word 0xce8745fe -//.word 0xe52ae1d8 -//.word 0x8fc09e62 -//.word 0xecfe2e1b -//.word 0xcd789f63 -//.word 0x61ba2532 -//.word 0x11941a09 -//.word 0xa8b54329 -//.word 0xb77b5504 -//.word 0x380ab7f1 -//.word 0x719c8a23 -//.word 0x1b18e7dc -//.word 0xc4e567de -//.word 0x7200e923 -//.word 0x894c8fcd -//.word 0xee2a0a60 -//.word 0x6d4a182f -//.word 0x58c14a14 -//.word 0x715b0b64 -//.word 0x0a32de22 -//.word 0x6b7fe773 -//.word 0x74b1ad52 -//.word 0x84bc1e85 -//.word 0x99b4d4d0 -//.word 0xb89a9668 -//.word 0x8f7622aa -//.word 0x59a5290d -//.word 0x02759c56 -//.word 0x8bef260b -//.word 0xb1f4fa29 -//.word 0xc98cce19 -//.word 0xef7a27e1 -//.word 0x5f14d898 -//.word 0x2351c51c -//.word 0xef24ed07 -//.word 0x4908a8de -//.word 0xecdc2c8c -//.word 0x6ff2560f -//.word 0x2263a872 -//.word 0x39a58efb -//.word 0x2c5fe5a5 -//.word 0x5d7bbdd0 -//.word 0xfc7d5e38 -//.word 0x27148a24 -//.word 0x56ef02e0 -//.word 0xf7d24c6c -//.word 0x55e9b276 -//.word 0xbe5c8e86 -//.word 0xe523c579 -//.word 0x851c9230 -//.word 0x475b8589 -//.word 0xe6c1cb8e -//.word 0x91d0afed -//.word 0x91bd61a9 -//.word 0x2bc7f60e -//.word 0xc8c8b1ea -//.word 0x530a81fa -//.word 0xe35bcaa3 -//.word 0x9a6468e2 -//.word 0xcd36f286 -//.word 0x64263b9d -//.word 0x84db1f2c -//.word 0x6ca57c23 -//.word 0x9d107e8f -//.word 0x3eba2012 -//.word 0xbe61ef90 -//.word 0xbb40112c -//.word 0x239c8773 -//.word 0x999aafd6 -//.word 0x1a530d5e -//.word 0xe02a4a9b -//.word 0x865e7dde -//.word 0x6edbaaa8 -//.word 0x60568861 -//.word 0x7398884d -//.word 0x311a12bd -//.word 0xf6d31282 -//.word 0x994eb3a7 -//.word 0x4eff6a60 -//.word 0xcbd7373d -//.word 0xaa1628a3 -//.word 0x0f611e7d -//.word 0x8a14d32f -//.word 0x3fd91ccb -//.word 0x447a6c88 -//.word 0x4af39a70 -//.word 0x80cce458 -//.word 0xb4a53315 -//.word 0xbb13a1ed -//.word 0x14aa384c -//.word 0xc85bfcb8 -//.word 0x94012c07 -//.word 0x4a36c6d0 -//.word 0x756b491f -//.word 0x3c38be6d -//.word 0x89f0f9cf -//.word 0x6a791d6d -//.word 0xb75a5e36 -//.word 0xf5160bd2 -//.word 0x7ab9cbd8 -//.word 0xd2b02742 -//.word 0x62dd481e -//.word 0x4beb0286 -//.word 0x91df12d1 -//.word 0x7df0a40b -//.word 0x3f9919a3 -//.word 0xd8ec0664 -//.word 0x372980a6 -//.word 0xa28f97c6 -//.word 0x587220d3 -//.word 0x758eb88a -//.word 0x159b0585 -//.word 0xbc223faf -//.word 0xf68eeffb -//.word 0x3a86f756 -//.word 0x147ad3da -//.word 0x847c1e44 -//.word 0xa15258a8 -//.word 0x81c9e663 -//.word 0x5d4c5a52 -//.word 0xf1b4f541 -//.word 0x22626aa6 -//.word 0xe38be590 -//.word 0x59d44cda -//.word 0x3d1fc5a4 -//.word 0x83a47803 -//.word 0x394396f8 -//.word 0xb1189a9f -//.word 0xe251cfa9 -//.word 0x0c3c120c -//.word 0x9ba4d9f9 -//.word 0x4e5e740f -//.word 0x981f93ce -//.word 0x4791094e -//.word 0x63a5cf31 -//.word 0x592a4cd6 -//.word 0x589fd3cf -//.word 0xfc456e96 -//.word 0x2a79da7b -//.word 0x3b41d2e1 -//.word 0x5c2591aa -//.word 0x344092f0 -//.word 0xc8969af6 -//.word 0x9ca8f85e -//.word 0x1b460b9c -//.word 0x39a506aa -//.word 0x57b1f0fd -//.word 0x67a4efb9 -//.word 0x50d8c521 -//.word 0x94d99b51 -//.word 0x30bffe2f -//.word 0xc4bb279f -//.word 0xf3ef7ff6 -//.word 0x0d8362b2 -//.word 0xebf52368 -//.word 0x1bb051fd -//.word 0x3ee13919 -//.word 0xad86acd9 -//.word 0x63c703c4 -//.word 0x178a5f01 -//.word 0xa84236c7 -//.word 0xbe070b14 -//.word 0xafec7ca2 -//.word 0x9f8d8217 -//.word 0xece7f57b -//.word 0xc96d4ef0 -//.word 0x2858b19d -//.word 0xde3e2bec -//.word 0x01e638f5 -//.word 0x955b883a -//.word 0x683f0294 -//.word 0x3b620a6d -//.word 0x2293ff30 -//.word 0x2eb608fe -//.word 0x481711a3 -//.word 0x60fe10c8 -//.word 0xc8848d69 -//.word 0xdaa4618a -//.word 0xe195be26 -//.word 0x37576f69 -//.word 0xaa8d611f -//.word 0x248a636b -//.word 0x8cae2abc -//.word 0xe7f398fd -//.word 0xc3c33e0c -//.word 0xd50d1f6e -//.word 0xe197b641 -//.word 0xda963b71 -//.word 0x4b7c232f -//.word 0xf511e69f -//.word 0xb9c504d1 -//.word 0xb9444af3 -//.word 0xbb4c51c5 -//.word 0xcebb494d -//.word 0x2fedf4cb -//.word 0x6d44f5ef -//.word 0xcc084b4a -//.word 0xe7721903 -//.word 0x9a03a8cb -//.word 0x1f1aae12 -//.word 0x77c6d17b -//.word 0x0cd9678e -//.word 0x943e80ae -//.word 0x388c264a -//.word 0xf6dae357 -//.word 0x44d684fd -//.word 0xf6111d90 -//.word 0x619d4dc3 -//.word 0xc1dac318 -//.word 0xd88d019b -//.word 0xd83260d0 -//.word 0x839455ea -//.word 0x919af23d -//.word 0x5264b0f6 -//.word 0x94966b0a -//.word 0xc7f4ae6c -//.word 0x5f303183 -//.word 0x7affa0db -//.word 0xc3729e1b -//.word 0x96840a37 -//.word 0x65f081e6 -//.word 0x5a452457 -//.word 0x3d3b9b1f -//.word 0x99485a77 -//.word 0x1a6f22a4 -//.word 0x3a59cbb6 -//.word 0x1ca64275 -//.word 0xb885ce99 -//.word 0x39829739 -//.word 0xa3a06886 -//.word 0xb9a8b4b9 -//.word 0x1ec0d74a -//.word 0xba3f9f63 -//.word 0x5fc00b94 -//.word 0xad7652c8 -//.word 0x33bf2778 -//.word 0xd6fb3c1e -//.word 0x779e05ed -//.word 0xd084bebf -//.word 0x9f85af4f -//.word 0x074aafa8 -//.word 0x335ee7dd -//.word 0x3c88d8fb -//.word 0x4d59a03c -//.word 0x0501787d -//.word 0x1c6782f2 -//.word 0x4a78c219 -//.word 0x64be69ec -//.word 0xc9355a5b -//.word 0xfc5be7f9 -//.word 0x9287dbf6 -//.word 0x4f7bbe4d -//.word 0x8c3c543e -//.word 0xdb2267ff -//.word 0xee2bc6af -//.word 0xb5948e8b -//.word 0xc7aba864 -//.word 0x03df9351 -//.word 0x771964a1 -//.word 0x814f0b13 -//.word 0x3356d74a -//.word 0xfcf73d7b -//.word 0x8546d569 -//.word 0xda2fa593 -//.word 0xca52a2ab -//.word 0x9011744b -//.word 0xb3e67ae4 -//.word 0x2afa0ef7 -//.word 0xc4f40a87 -//.word 0xc70f8ace -//.word 0xd770f42f -//.word 0x1ab6366c -//.word 0x9ad24f19 -//.word 0xeb191150 -//.word 0x0d9725a7 -//.word 0x93a74f5f -//.word 0x05c1f3de -//.word 0x8492d95f -//.word 0xac522de9 -//.word 0xbf52ca7d -//.word 0xffd4b894 -//.word 0x5b20f2c9 -//.word 0x4ed46dd2 -//.word 0x057c57b4 -//.word 0xc0629c37 -//.word 0x7aa8af98 -//.word 0xcc93877f -//.word 0x0f2ae830 -//.word 0xc100e305 -//.word 0x294ea01c -//.word 0x3e445b4d -//.word 0xc6a1ad5f -//.word 0xbb820d7b -//.word 0xf27796e0 -//.word 0xffdc0bd9 -//.word 0x536718ec -//.word 0xa7fdda55 -//.word 0x9ecaa2b3 -//.word 0xa590f600 -//.word 0x1e3fd9c6 -//.word 0xbfc74d90 -//.word 0x342a159f -//.word 0x0cd5bfdf -//.word 0xd230e21a -//.word 0x7a74a56a -//.word 0x00bd80f4 -//.word 0x4b6047d3 -//.word 0x577e6453 -//.word 0x93d96360 -//.word 0x88e7b53e -//.word 0xbc25ad7a -//.word 0xd6aecf20 -//.word 0x020c4a2e -//.word 0x974ec349 -//.word 0xf85a54af -//.word 0xb885d56d -//.word 0x01615ad2 -//.word 0x36d6fc23 -//.word 0xd775dd90 -//.word 0xa5086667 -//.word 0x076ed388 -//.word 0xada6f219 -//.word 0x7329277a -//.word 0x887db47b -//.word 0xcf0737cd -//.word 0x852174b7 -//.word 0x256c550a -//.word 0x88672f57 -//.word 0x5141475f -//.word 0x88ec95cb -//.word 0x8573c81e -//.word 0x108d8ae7 -//.word 0xc672043b -//.word 0xbfeda562 -//.word 0x6db31fd1 -//.word 0xc7f3b358 -//.word 0xa72eaf9d -//.word 0x714935c9 -//.word 0xf6e13d81 -//.word 0x98dedd18 -//.word 0xae4bc903 -//.word 0x2a65168d -//.word 0x79f143cc -//.word 0xaad379d3 -//.word 0xd3dd1229 -//.word 0xb0e5597a -//.word 0x8e1a908d -//.word 0x67983876 -//.word 0x4f398c0d -//.word 0x0eae4f9e -//.word 0x0fcfc7e2 -//.word 0x79300a2e -//.word 0x9bf578eb -//.word 0x8de78946 -//.word 0x14c7c928 -//.word 0xc7e22069 -//.word 0x70e55741 -//.word 0xb5f3d8ff -//.word 0xf8f5b5fd -//.word 0x7b31ecd3 -//.word 0xc81feacb -//.word 0x50774d95 -//.word 0x528fee3c -//.word 0xfee41f59 -//.word 0xdbf63187 -//.word 0x665a3a16 -//.word 0xfc0a1404 -//.word 0xf9ffa928 -//.word 0x22026eb1 -//.word 0x40bf2ecf -//.word 0x0e1b09b0 -//.word 0x55c7bcae -//.word 0x561523c7 -//.word 0x680bfc4d -//.word 0xe2b7edde -//.word 0x3bc1c997 -//.word 0x70470f85 -//.word 0xa6e4b35c -//.word 0x1112216c -//.word 0x14b380d0 -//.word 0xaaea33e9 -//.word 0x042fa60b -//.word 0x74a34775 -//.word 0x89a0d287 -//.word 0x7c95d22f -//.word 0xca1165a5 -//.word 0x231d3f58 -//.word 0x83cff128 -//.word 0x9f1c6bd5 -//.word 0x82eec0b7 -//.word 0x78762ab0 -//.word 0x2bc44e60 -//.word 0x0c95c197 -//.word 0xf46cca10 -//.word 0x0be46a5c -//.word 0xea44991c -//.word 0xfc54d373 -//.word 0x2a6fd3bb -//.word 0xb7da9f77 -//.word 0x6854c489 -//.word 0xe9eee3a6 -//.word 0x6c1d6c06 -//.word 0x930eaa60 -//.word 0x90390015 -//.word 0x8b3972ac -//.word 0x43db667e -//.word 0xf975acb2 -//.word 0x8a79bd6c -//.word 0xdb494042 -//.word 0x794dd3f0 -//.word 0x8144074c -//.word 0xbed7ac7c -//.word 0x12745066 -//.word 0x17590268 -//.word 0x05ef5c49 -//.word 0xd75ac070 -//.word 0xa94ee154 -//.word 0x65248534 -//.word 0x9e2d8a08 -//.word 0xbc4627b7 -//.word 0x5aac758a -//.word 0xec122ee1 -//.word 0xa5f1b425 -//.word 0x982055fd -//.word 0x1da4cdc5 -//.word 0x76c90c3c -//.word 0xb2723a7c -//.word 0xd2adf930 -//.word 0x2b8aea01 -//.word 0x0b2e7251 -//.word 0x9f23be2c -//.word 0x14f2047b -//.word 0xfdf40c7b -//.word 0xf565f06e -//.word 0x85ba2091 -//.word 0x4834a84d -//.word 0x4cb6b6b1 -//.word 0xbcd45620 -//.word 0xbc2c8147 -//.word 0x95f95652 -//.word 0x12e5a760 -//.word 0x2a1fb734 -//.word 0xdeae422d -//.word 0x6505be78 -//.word 0x87d7e184 -//.word 0x472c63b6 -//.word 0xc4b5055f -//.word 0x615cd2eb -//.word 0x2420a55b -//.word 0x5c20ebf5 -//.word 0x87f5aa39 -//.word 0x7245c318 -//.word 0xa2957461 -//.word 0xf35f207c -//.word 0x7f65535a -//.word 0xc14401ac -//.word 0xfb4c0e53 -//.word 0xd48f1318 -//.word 0x4638609e -//.word 0xb71f3d94 -//.word 0x669a762f -//.word 0x099516d8 -//.word 0xb5e57222 -//.word 0xfdd969fe -//.word 0x5e12eb32 -//.word 0xdb95b807 -//.word 0xe41f6a42 -//.word 0x7cb9b656 -//.word 0x9b8befd8 -//.word 0xd1f5cb33 -//.word 0x2ddc6a9d -//.word 0x5d42944a -//.word 0x161a43df -//.word 0xb75a6129 -//.word 0x2951d20f -//.word 0x093bb5c5 -//.word 0x0913e743 -//.word 0x93a8c9f6 -//.word 0xb0f344b5 -//.word 0x29a80af6 -//.word 0xec0b1e42 -//.word 0xb00596e6 -//.word 0xdc77a0ec -//.word 0xa5cec349 -//.word 0x77d86758 -//.word 0x97d69887 -//.word 0x06d20751 -//.word 0xa832516c -//.word 0xa58e8443 -//.word 0x10bfe0a6 -//.word 0xc738dac0 -//.word 0x9a9a674a -//.word 0xaf8276ff -//.word 0x24a5be50 -//.word 0xf720bb58 -//.word 0x2309f312 -//.word 0x0c4a7eca -//.word 0x1dafc5d1 -//.word 0xb03d8a75 -//.word 0x2ec62930 -//.word 0x77ba1d20 -//.word 0x8440c5b7 -//.word 0x4b8568b4 -//.word 0xe2547852 -//.word 0xe8e813bf -//.word 0x21fecfcf -//.word 0x602eb7f2 -//.word 0xaa7a9164 -//.word 0x982863a3 -//.word 0xfdcd3526 -//.word 0xc9ab174c -//.word 0x2d3c6693 -//.word 0x000f4c0a -//.word 0x62d38609 -//.word 0x9fb26a1f -//.word 0x56e0284c -//.word 0xda735070 -//.word 0xd8759404 -//.word 0x3a37d008 -//.word 0x4ce9473c -//.word 0x1d682f93 -//.word 0x295771e5 -//.word 0x3471aae4 -//.word 0x791d7551 -//.word 0x0443ec70 -//.word 0x5d5f6cb9 -//.word 0x66d499d0 -//.word 0x8682a2b7 -//.word 0x079ac743 -//.word 0xbdb118cc -//.word 0xe9147f29 -//.word 0x5c5c00db -//.word 0xe0424089 -//.word 0xd3b444ad -//.word 0x15287c8c -//.word 0x2530006b -//.word 0x864e1900 -//.word 0x680a0327 -//.word 0x8443f1d6 -//.word 0x48c35253 -//.word 0x341653a4 -//.word 0x849ba548 -//.word 0x0fdb8024 -//.word 0x6f1ae8c0 -//.word 0x622c2fb3 -//.word 0x708abb5c -//.word 0xcea509d3 -//.word 0x837af21f -//.word 0xc9672daa -//.word 0xb63d16f2 -//.word 0x1b96ad80 -//.word 0xad69e21e -//.word 0x62db1045 -//.word 0x1e58c7d5 -//.word 0x8fe3ce08 -//.word 0x55aa68a9 -//.word 0x67ded781 -//.word 0xb2c11f13 -//.word 0x03010c89 -//.word 0x264476ed -//.word 0x5004c49c -//.word 0xba9daff8 -//.word 0x8fa4495e -//.word 0x087b3d58 -//.word 0xd5225813 -//.word 0xc0504813 -//.word 0x8dc3a425 -//.word 0x24d42d95 -//.word 0xf24e54a2 -//.word 0x8c80fc2f -//.word 0x959180bb -//.word 0xe314f893 -//.word 0xdddcb846 -//.word 0x27121a5a -//.word 0x82847e3d -//.word 0xed408e7e -//.word 0x1062c73d -//.word 0xdb2a35e1 -//.word 0x6b527d09 -//.word 0x2d9e21c4 -//.word 0x45b40004 -//.word 0x312e1c50 -//.word 0xa9eea0ba -//.word 0xcab12211 -//.word 0x74e72557 -//.word 0xf1c3e275 -//.word 0xd78e482e -//.word 0x2f404152 -//.word 0xd6513734 -//.word 0x24cdd75d -//.word 0xcca71482 -//.word 0x034f6fb4 -//.word 0xe58676d7 -//.word 0x14728b55 -//.word 0xa2ede714 -//.word 0x3123dfa5 -//.word 0x585c65be -//.word 0x4916d1ea -//.word 0xb157e27f -//.word 0xe041ffd0 -//.word 0x2ae7c3a5 -//.word 0x8d5fb9e8 -//.word 0x941964a1 -//.word 0x7a6e8325 -//.word 0x937c9289 -//.word 0xe832945d -//.word 0x21a71097 -//.word 0xa9b05ace -//.word 0x0cb113a9 -//.word 0xa4b3f396 -//.word 0x74b7c6bf -//.word 0x544ab53a -//.word 0x4f5ac77f -//.word 0x4948a820 -//.word 0xe43ea8b4 -//.word 0xa5c30614 -//.word 0x538d6fcb -//.word 0xa096c2c7 -//.word 0x0c721655 -//.word 0x05dffe4c -//.word 0x539e0c87 -//.word 0xb3819399 -//.word 0xc2c6b1bd -//.word 0x1da38d0c -//.word 0xc722def3 -//.word 0xcb2fade3 -//.word 0x22ef5b4a -//.word 0xd654e5c3 -//.word 0x68ef6789 -//.word 0x7005df32 -//.word 0x83e4349a -//.word 0x5977771d -//.word 0x2f196809 -//.word 0x6ba73c52 -//.word 0x7fd99d88 -//.word 0x0fd2f307 -//.word 0x56f5e26e -//.word 0xc6fb1352 -//.word 0xee423833 -//.word 0xa1684aae -//.word 0x551915f5 -//.word 0xc925f77d -//.word 0xebd6e5f6 -//.word 0xf880ae80 -//.word 0xe559841c -//.word 0xfe8bb860 -//.word 0xcd88c570 -//.word 0x3d9e9029 -//.word 0xffcbee9f -//.word 0x2dd267ca -//.word 0x2d8e3a7c -//.word 0xd987a096 -//.word 0xdcc3557c -//.word 0x5fdf55c6 -//.word 0xe65ee339 -//.word 0x7440d0f5 -//.word 0xf6d6faef -//.word 0xded613a2 -//.word 0x0faba402 -//.word 0xf90e51b2 -//.word 0x05da5e76 -//.word 0x331c72eb -//.word 0x016a9b76 -//.word 0x9077937a -//.word 0x02e442ce -//.word 0x2658836e -//.word 0x57d22b70 -//.word 0xa13e483a -//.word 0x2647a6f3 -//.word 0xc06d9837 -//.word 0xe857f40f -//.word 0xd76a6020 -//.word 0xea9acc22 -//.word 0x4b804094 -//.word 0xceadd8ae -//.word 0x193f0d98 -//.word 0x08b235d9 -//.word 0x50f84d12 -//.word 0x62cbf7ec -//.word 0x9242bf4f -//.word 0x78a2a2d5 -//.word 0x9677d17e -//.word 0x3ce4b2a5 -//.word 0xa9382832 -//.word 0x73c11412 -//.word 0x29e51ce4 -//.word 0x366eabf5 -//.word 0x0826386f -//.word 0x72a4cccd -//.word 0x4f65be92 -//.word 0x691fc13b -//.word 0x99512272 -//.word 0x2f1f4a84 -//.word 0x935d8a15 -//.word 0x2dea1813 -//.word 0x833f54e8 -//.word 0xa14750f4 -//.word 0xbe72903a -//.word 0x1c050e59 -//.word 0x30b481bf -//.word 0x0372df19 -//.word 0xd888210d -//.word 0x0fe4462c -//.word 0x49b49a22 -//.word 0xcd343830 -//.word 0x2bc4cedd -//.word 0x1f3ea0e8 -//.word 0xb786d080 -//.word 0xb863dcb7 -//.word 0x3f8d6835 -//.word 0xa4073e29 -//.word 0xa3ae9386 -//.word 0xbe138c6b -//.word 0xdd8600e2 -//.word 0x387380ce -//.word 0x76f2941f -//.word 0x16994848 -//.word 0x0f94e7f3 -//.word 0xb3f807f3 -//.word 0xd955c57a -//.word 0x3b8b528c -//.word 0x1ddeafb3 -//.word 0x304cb4f5 -//.word 0xb51d5703 -//.word 0xe5bd2bb3 -//.word 0x91c727b0 -//.word 0x0662a970 -//.word 0x33d0ba67 -//.word 0x0e44947b -//.word 0x33f462b7 -//.word 0xce704643 -//.word 0xbc32a094 -//.word 0xed768ee0 -//.word 0x0d4cafd5 -//.word 0x63eb2d8a -//.word 0xf948fab6 -//.word 0xfde75920 -//.word 0x67f1a156 -//.word 0xdc883da2 -//.word 0xd257f83a -//.word 0xf66d78b7 -//.word 0xca4b07c8 -//.word 0x933b9a28 -//.word 0x72e40bcd -//.word 0xd11caa63 -//.word 0x00fdf4f8 -//.word 0x203ba2f9 -//.word 0x41b4e65d -//.word 0xc749f120 -//.word 0x12edb8f3 -//.word 0x5efbf832 -//.word 0xe7cd7716 -//.word 0x518a8e2c -//.word 0x483fe405 -//.word 0x64327c2f -//.word 0x4f73f265 -//.word 0x29b30103 -//.word 0x2b5949bd -//.word 0x8bd34f8f -//.word 0xa02ac6f7 -//.word 0x47da0d63 -//.word 0x85e0f8e5 -//.word 0x6e14d32e -//.word 0x45b9a4ba -//.word 0xe453b148 -//.word 0x5eb8428d -//.word 0xe46aa829 -//.word 0xe5247eda -//.word 0x79b32ff0 -//.word 0x0007b901 -//.word 0x068ab0dd -//.word 0x6bb185c4 -//.word 0xc0d008d7 -//.word 0xf3322ccd -//.word 0x2f690ae7 -//.word 0xfee32926 -//.word 0xb1befdbb -//.word 0x01ddadbf -//.word 0xf63c1a24 -//.word 0x08801cec -//.word 0x85d30e98 -//.word 0x32ee8ee4 -//.word 0x35777eb1 -//.word 0x328e4e43 -//.word 0xb5a37eac -//.word 0xd08a5e88 -//.word 0x05d119eb -//.word 0x6551f198 -//.word 0xfa03cc74 -//.word 0x6315f03a -//.word 0xbe3d0b6f -//.word 0xcb4e7699 -//.word 0x4d09baac -//.word 0xb43554c5 -//.word 0xfaf2b51a -//.word 0xcb4a8d31 -//.word 0xe8094951 -//.word 0xcdceda37 -//.word 0x9263b909 -//.word 0x0f4a2890 -//.word 0x4398baa1 -//.word 0xf70715dc -//.word 0x9e46f79a -//.word 0x80937720 -//.word 0x178c8e19 -//.word 0xb942d543 -//.word 0x78909068 -//.word 0x47abec90 -//.word 0x5ef98575 -//.word 0xdf272b37 -//.word 0xb976e651 -//.word 0xcc5537cc -//.word 0x4f35a1b2 -//.word 0x6f9968c6 -//.word 0x396c9972 -//.word 0xba984a01 -//.word 0x65d4230e -//.word 0xb5bd1e3c -//.word 0x13298a28 -//.word 0xf9b8569c -//.word 0x58ac8c06 -//.word 0x37fa1c28 -//.word 0x9da0db10 -//.word 0xb23acb4b -//.word 0x21d09d56 -//.word 0xc0f37455 -//.word 0x7308ec07 -//.word 0x4ee35bfa -//.word 0xf99857fb -//.word 0x598d78d1 -//.word 0x6cd45e2b -//.word 0x75b8f6d6 -//.word 0x5a96fa33 -//.word 0x4aefb7e9 -//.word 0xa2ba13d7 -//.word 0x12ffce4d -//.word 0xfca1087b -//.word 0x1c7c0429 -//.word 0x6eaf2ba9 -//.word 0x4c3b540a -//.word 0xd7ce428f -//.word 0x99d96e5f -//.word 0x69e8077e -//.word 0x8e3338fc -//.word 0x2770a96d -//.word 0xcaec4899 -//.word 0x6bda4974 -//.word 0x7feb6b50 -//.word 0x621f7e51 -//.word 0xf6da2221 -//.word 0x8e3ad1e6 -//.word 0x0aa82071 -//.word 0x43ad41b8 -//.word 0xa907cd87 -//.word 0x2afdc072 -//.word 0x56efc60e -//.word 0xc131b561 -//.word 0xa91a5a96 -//.word 0xd95778f5 -//.word 0xcd850e13 -//.word 0x1700d946 -//.word 0x02f51a5c -//.word 0x74bf998d -//.word 0x1970eaad -//.word 0xbdadefa7 -//.word 0xfac09e26 -//.word 0x14e80495 -//.word 0x21f38a4a -//.word 0x6d0f78fe -//.word 0x1cdeb781 -//.word 0x11c8dbab -//.word 0x0f956196 -//.word 0x1e3b340a -//.word 0x31f47639 -//.word 0x05947ead -//.word 0x4c1a1d7e -//.word 0x0b8526c8 -//.word 0x41e92d5c -//.word 0xc9c18eb6 -//.word 0x8187b230 -//.word 0xac828d75 -//.word 0x95e06b37 -//.word 0x7604ed25 -//.word 0x97214e17 -//.word 0xba08eb8c -//.word 0xb73e0357 -//.word 0x6452bb95 -//.word 0xb76d65e2 -//.word 0x2f2b01cd -//.word 0x6fa90489 -//.word 0x2de059e5 -//.word 0x4a31a67d -//.word 0x4240d032 -//.word 0xc706c1d9 -//.word 0xa9226930 -//.word 0xf9700216 -//.word 0x6edd99fb -//.word 0x077aca95 -//.word 0xf2cfcbd4 -//.word 0xad71ac19 -//.word 0x6bd7dca3 -//.word 0xb969f049 -//.word 0x61daa06f -//.word 0x8fb81233 -//.word 0x32415ce7 -//.word 0xa57944c4 -//.word 0x8f7949dc -//.word 0x080ae851 -//.word 0xfd7218c5 -//.word 0xd58e1711 -//.word 0x5421683a -//.word 0xc06c1da1 -//.word 0x43ff5279 -//.word 0x91cefa7e -//.word 0xca87dee4 -//.word 0xa223e28e -//.word 0xbfbc8a81 -//.word 0x639ebe98 -//.word 0x4aa0ca79 -//.word 0xd6b5a9c7 -//.word 0x69be839a -//.word 0x12a2742c -//.word 0x6da18fd5 -//.word 0xc4e52339 -//.word 0x7a5a3cc0 -//.word 0xaac06d46 -//.word 0x0bffcd14 -//.word 0x17ba400f -//.word 0x6c26f830 -//.word 0x721d3b34 -//.word 0x3e6e6695 -//.word 0xb67832b8 -//.word 0xf6f73668 -//.word 0xf31dad83 -//.word 0x5ee57af3 -//.word 0xcca469e0 -//.word 0x13e0b824 -//.word 0xf766d600 -//.word 0x06976a0d -//.word 0xc0039775 -//.word 0xfb397e62 -//.word 0x86dc05b7 -//.word 0x0dfad7ff -//.word 0x3c9aada2 -//.word 0x2794cb5f -//.word 0xeaa6cdf6 -//.word 0x8cc3a325 -//.word 0x2aaedbd6 -//.word 0x51c81e97 -//.word 0xab27fe4a -//.word 0xdee7ef1e -//.word 0xb1c592be -//.word 0x71e93ac8 -//.word 0x9304a980 -//.word 0x9a9b1ac6 -//.word 0x3ba38545 -//.word 0xbf4d1eee -//.word 0xaa231ea5 -//.word 0x9a54c739 -//.word 0x714ca29a -//.word 0xb6880c46 -//.word 0x39a9f005 -//.word 0xf6c7d6d6 -//.word 0x3c071d29 -//.word 0x0f70844e -//.word 0xcafaf02e -//.word 0x09e86939 -//.word 0xc558659f -//.word 0xc11949c3 -//.word 0x25bc2ded -//.word 0x69eedf3e -//.word 0x75052bea -//.word 0x07d85aa1 -//.word 0x54d4f94e -//.word 0xf24cdc04 -//.word 0xf5116235 -//.word 0x5943f926 -//.word 0xa066e59f -//.word 0xbbb83ee7 -//.word 0x2ec238f0 -//.word 0x702ea8ce -//.word 0x90d8c36d -//.word 0x1e282884 -//.word 0x499e21c5 -//.word 0x45ae2557 -//.word 0xf0cfa285 -//.word 0xb4cffab8 -//.word 0xaf69cba2 -//.word 0x111974bd -//.word 0xc62fd5f4 -//.word 0x5623569f -//.word 0x09282ab5 -//.word 0x4e03d53d -//.word 0x5d1eeb06 -//.word 0x1cd81b98 -//.word 0x3f206d6a -//.word 0xb442c856 -//.word 0x3e00b749 -//.word 0x60e56c3f -//.word 0x7cd6066f -//.word 0x3cea0fc2 -//.word 0x317c498a -//.word 0xba7eaa71 -//.word 0x280fa5af -//.word 0x1f50ab81 -//.word 0x3f74f2d6 -//.word 0x0417754b -//.word 0xebd13c59 -//.word 0xd70addcd -//.word 0xb2104379 -//.word 0x5766ae2a -//.word 0xb060fbda -//.word 0x1bec2626 -//.word 0x13b30d02 -//.word 0x0c6176ab -//.word 0x9e4054dd -//.word 0xe60c4647 -//.word 0x2a03613c -//.word 0xbb3b2fab -//.word 0x2038f751 -//.word 0x70be3f2d -//.word 0x00e49034 -//.word 0x3e6a7947 -//.word 0xdd4cd662 -//.word 0x33975316 -//.word 0xdf7c2b39 -//.word 0xaea336dc -//.word 0xc0c2227d -//.word 0xe66d007e -//.word 0x4f3003d6 -//.word 0x64db8507 -//.word 0xf01d4b50 -//.word 0x84540a23 -//.word 0x1aa42ad9 -//.word 0xf846c9a5 -//.word 0xd72303c6 -//.word 0x45a27101 -//.word 0x48beef4f -//.word 0x445ba3d3 -//.word 0x1eda3b0e -//.word 0xa2eb7556 -//.word 0x22a2e584 -//.word 0x60cef3ee -//.word 0xaf862395 -//.word 0x5404999f -//.word 0x32b7dc07 -//.word 0xa793da93 -//.word 0xb1ac2c06 -//.word 0x55039c97 -//.word 0x419fe4a3 -//.word 0xb0e0b99f -//.word 0x8e110850 -//.word 0xdc3c803e -//.word 0x57425066 -//.word 0x542a322f -//.word 0xefbaa89f -//.word 0x644485cf -//.word 0xbdc3b09c -//.word 0xae2725a0 -//.word 0xbdec3c61 -//.word 0xa5f12ec7 -//.word 0xfd88d5d4 -//.word 0x15c9b38f -//.word 0x212d3641 -//.word 0x99583ae4 -//.word 0xdf35d0d9 -//.word 0x23483ed9 -//.word 0x8440472e -//.word 0x77ccac23 -//.word 0x6db0f2b9 -//.word 0xb018669b -//.word 0x8e2c5f54 -//.word 0xbae4c3c0 -//.word 0xef1eccc0 -//.word 0xd6ee0c32 -//.word 0x2a35af21 -//.word 0x1a750138 -//.word 0xefe3307d -//.word 0xeebe523c -//.word 0x80e0a940 -//.word 0x90932649 -//.word 0x35a52dbb -//.word 0x91bf9894 -//.word 0xf9f2fea0 -//.word 0x559335f0 -//.word 0xca491588 -//.word 0x97647f58 -//.word 0x3d709e6e -//.word 0xe30a6d69 -//.word 0xf8f37a31 -//.word 0x1a63e9e5 -//.word 0x37a0bb15 -//.word 0xf2ce5132 -//.word 0x48092b42 -//.word 0x73b1f6d8 -//.word 0x0e05c644 -//.word 0x7bf4a007 -//.word 0x822f3b8a -//.word 0x3a83070f -//.word 0x2d666fe7 -//.word 0xb7d05be5 -//.word 0xaf4cfa14 -//.word 0x494ebea5 -//.word 0x3bc7a82b -//.word 0x1ff7c50b -//.word 0x1982f92d -//.word 0xb9c7fbf8 -//.word 0x236da17e -//.word 0x6d3e5ef3 -//.word 0x48390964 -//.word 0xe3e2dfa5 -//.word 0x0cddcc8c -//.word 0x99bbe65c -//.word 0x06143a84 -//.word 0x5fd6cc8a -//.word 0x60dcd942 -//.word 0xdcc35f43 -//.word 0x5bf9e09b -//.word 0x071662c2 -//.word 0xc970bacd -//.word 0xafe90ae4 -//.word 0x910c89f6 -//.word 0xf45982ab -//.word 0x2edca09b -//.word 0xcb0568bd -//.word 0x30b30722 -//.word 0x7e924ee3 -//.word 0xb9a7fb58 -//.word 0x2a293a8a -//.word 0x01936beb -//.word 0x3ff72645 -//.word 0xd3957cf1 -//.word 0x03ac8049 -//.word 0x0e90075f -//.word 0x10fdabf0 -//.word 0x25ab1693 -//.word 0xd1227d36 -//.word 0xa0d06acb -//.word 0x0959bf3f -//.word 0x982ef8ac -//.word 0x4d61b0cf -//.word 0x3fb866bc -//.word 0x840082d0 -//.word 0x55a393e8 -//.word 0x6e7ddbd0 -//.word 0xb4ec0dff -//.word 0x1a265581 -//.word 0xc5d09934 -//.word 0x6fccff37 -//.word 0x0952afa0 -//.word 0xa442da6d -//.word 0x91b8fbbe -//.word 0xc7e15c41 -//.word 0x860edced -//.word 0x3a07f1f3 -//.word 0xa2a2e9f1 -//.word 0x31947569 -//.word 0xb5866773 -//.word 0x366cbbae -//.word 0x2112d47c -//.word 0xa6f7096f -//.word 0x5e5f60fe -//.word 0x31a4997d -//.word 0x77cd6f4c -//.word 0x5d611a4e -//.word 0x8a7e189c -//.word 0x03252d7b -//.word 0x4cd8a98c -//.word 0xd167e943 -//.word 0x8407209a -//.word 0xc6a45807 -//.word 0x8b78b3ab -//.word 0xb9ddf7cc -//.word 0xd25f4985 -//.word 0xd31639bc -//.word 0x5c33ff55 -//.word 0x10d804a5 -//.word 0x3f2da52a -//.word 0xc3b03379 -//.word 0x27cc3e77 -//.word 0x0fae13cc -//.word 0xd3548395 -//.word 0x6ee6e659 -//.word 0x974a603f -//.word 0x2df3637e -//.word 0xd8f97514 -//.word 0xee6f34bb -//.word 0x93f19719 -//.word 0x257c7637 -//.word 0xd7824d34 -//.word 0x9b3e3d3b -//.word 0x464653b2 -//.word 0xee5f0db4 -//.word 0x97941ac2 -//.word 0x0f8a62b5 -//.word 0x170e46f7 -//.word 0xc3f029f3 -//.word 0x24142fca -//.word 0x24c64448 -//.word 0xb04e6116 -//.word 0x1dc40a31 -//.word 0xc4261c9a -//.word 0xf0a8c550 -//.word 0xfb4bd47b -//.word 0xb3b133ea -//.word 0x0230b1bf -//.word 0xcf250569 -//.word 0x1f8b10d3 -//.word 0x80cc63db -//.word 0xa7d60106 -//.word 0x58726672 -//.word 0x86d1c80c -//.word 0xbc689c02 -//.word 0xbbff5c7c -//.word 0x65048887 -//.word 0xd924eb51 -//.word 0xe01d1f9c -//.word 0x88cd536d -//.word 0x0e8f4c04 -//.word 0x01c8aa11 -//.word 0xa5bd6d25 -//.word 0x96a8b767 -//.word 0xad0ad388 -//.word 0x274277f9 -//.word 0x045f465b -//.word 0xae339937 -//.word 0xdba87fef -//.word 0xb45803f4 -//.word 0x3757ad3a -//.word 0xda534be9 -//.word 0x71e0f056 -//.word 0x510d3e31 -//.word 0xb63be100 -//.word 0x622f5ccb -//.word 0x87650819 -//.word 0xe7a7591c -//.word 0x3adf6429 -//.word 0xd02a9e6b -//.word 0x772de7d7 -//.word 0x9facc762 -//.word 0xbc58f772 -//.word 0xece92393 -//.word 0xda6dee6c -//.word 0xe2e037f1 -//.word 0x76fc9ada -//.word 0xc0523a53 -//.word 0x889abef5 -//.word 0x59489af5 -//.word 0xdf60909b -//.word 0x948a76f6 -//.word 0x9c6939cf -//.word 0xec2922db -//.word 0xb2575834 -//.word 0xf1f6a70a -//.word 0x6ccf7f96 -//.word 0xc6084050 -//.word 0xe7f8b462 -//.word 0xa23add5c -//.word 0x9400f229 -//.word 0x4faaa442 -//.word 0xb898a521 -//.word 0xad3c6bf9 -//.word 0xeb7332a4 -//.word 0x2f1540dd -//.word 0x9cca6caf -//.word 0x5d20e12d -//.word 0x8bdb2064 -//.word 0x518d448e -//.word 0x4e668a89 -//.word 0x3a4c1087 -//.word 0xcd2edd06 -//.word 0xdc962203 -//.word 0xc67ebf6a -//.word 0x0e6509d2 -//.word 0x49a2cb67 -//.word 0x3bf78b27 -//.word 0x3d690e52 -//.word 0xe14f1e1b -//.word 0xd9aa8aa4 -//.word 0x15b46f29 -//.word 0x2cbcb67c -//.word 0xfd30deb1 -//.word 0x96fcfb1a -//.word 0x5512ff76 -//.word 0x4c4a3965 -//.word 0xea6d1b1f -//.word 0xd88c4066 -//.word 0x2297aeb9 -//.word 0x972b58cb -//.word 0x72aae733 -//.word 0x3a91b965 -//.word 0xe6062ae1 -//.word 0x45b113aa -//.word 0x9dcd91fa -//.word 0x937f0834 -//.word 0x4a66671a -//.word 0xcf73ad40 -//.word 0xb5fbacc0 -//.word 0xfc0a0c30 -//.word 0x38fb94d1 -//.word 0xee45a509 -//.word 0x42980714 -//.word 0xcf29e9f6 -//.word 0xd74a22b4 -//.word 0x9c3dbdc3 -//.word 0x0d4ab5c1 -//.word 0xa50ffd63 -//.word 0x9118c3af -//.word 0x11aff66b -//.word 0x20f506d5 -//.word 0x5732eb94 -//.word 0x0f6a68ef -//.word 0xc631913d -//.word 0xc4bf8b9c -//.word 0xfd4793e6 -//.word 0x3a8541e1 -//.word 0x74970eb6 -//.word 0x800d15a5 -//.word 0xf24316f6 -//.word 0x3befc033 -//.word 0x14f63094 -//.word 0x2084b5bb -//.word 0xcc5bd6a1 -//.word 0x7b6b96d1 -//.word 0xe0a3f6d4 -//.word 0xaa08bcec -//.word 0x67047305 -//.word 0xa200b3e8 -//.word 0x4f35a2b2 -//.word 0x6abebb84 -//.word 0xdaf2ce7d -//.word 0x9bf248e5 -//.word 0x1c7eb5ab -//.word 0xe60d8312 -//.word 0x7f1c09a7 -//.word 0x8ec6c876 -//.word 0x3f95f07d -//.word 0xe9982661 -//.word 0xefb58460 -//.word 0xe441e187 -//.word 0xf2ce5325 -//.word 0x7c44f37f -//.word 0x0234e0c5 -//.word 0x45688745 -//.word 0xacbf21df -//.word 0xe7387cb9 -//.word 0xd24cff34 -//.word 0x9c81e91e -//.word 0x283cd929 -//.word 0xb3d6939b -//.word 0xb8f30148 -//.word 0x100f78bd -//.word 0x5e5a3dbf -//.word 0xaac648f4 -//.word 0x4c5e47df -//.word 0x0cd9e612 -//.word 0x876f4e9e -//.word 0xd5ebebcf -//.word 0x68027316 -//.word 0x37e32447 -//.word 0x1c0f4d04 -//.word 0x7b6b0f79 -//.word 0x2593654b -//.word 0x7c7262ca -//.word 0xd710ba6e -//.word 0x28aa8481 -//.word 0xdc083e19 -//.word 0x020b1249 -//.word 0xb0865798 -//.word 0xa24e5bb2 -//.word 0x2595605e -//.word 0x3373e4b0 -//.word 0xe0c62680 -//.word 0xf53ce51b -//.word 0xdaae6b37 -//.word 0xb9b0ca2d -//.word 0xe0666662 -//.word 0x6799b306 -//.word 0x13094002 -//.word 0x7b05f52b -//.word 0x693a99bc -//.word 0x83c99603 -//.word 0x2b9c015a -//.word 0xa3f9d559 -//.word 0x75577f4a -//.word 0x1271a0dd -//.word 0xb99a0e1e -//.word 0x9a501ca3 -//.word 0x3c131b0a -//.word 0x1c7820a3 -//.word 0x97790869 -//.word 0x090fba37 -//.word 0x3703ac38 -//.word 0xea00a9a0 -//.word 0xddeed199 -//.word 0xd97be180 -//.word 0x1ffab452 -//.word 0x06710a61 -//.word 0xe5ed894c -//.word 0x3319012d -//.word 0xed0ff414 -//.word 0x386e56b5 -//.word 0x48ad915d -//.word 0x80afcc2b -//.word 0xdb976d7c -//.word 0x8adddca7 -//.word 0xdfa28aeb -//.word 0x694033a5 -//.word 0x612660c6 -//.word 0x44e32f85 -//.word 0xc2805651 -//.word 0xd713660a -//.word 0x38914d70 -//.word 0xf0e41fdc -//.word 0x4b3d162e -//.word 0xf3acd706 -//.word 0x59eef637 -//.word 0x5686bd78 -//.word 0x130f295d -//.word 0x26d03686 -//.word 0xfd915c17 -//.word 0x80ad5a67 -//.word 0xf26932fd -//.word 0x188475b8 -//.word 0x9e0fc04d -//.word 0xb67f87f7 -//.word 0x02011169 -//.word 0xb40dc408 -//.word 0xf43ea357 -//.word 0x826115b2 -//.word 0x9ccce840 -//.word 0x22f19523 -//.word 0xf832c6f1 -//.word 0xacf71568 -//.word 0x58fe175d -//.word 0xcaf399f6 -//.word 0xe3412919 -//.word 0x3d27d924 -//.word 0x100e3fdf -//.word 0x571ac0af -//.word 0x2eff0f0c -//.word 0x7f16f034 -//.word 0xddb04221 -//.word 0xb0aa3cb9 -//.word 0x9341f746 -//.word 0xfa282c25 -//.word 0x18d840c2 -//.word 0x00287dc4 -//.word 0x0a1da384 -//.word 0x78039fc4 -//.word 0x59bc9a9e -//.word 0xae5935ba -//.word 0xcce713c4 -//.word 0x018b991d -//.word 0x7ad2f1d1 -//.word 0x644255ca -//.word 0x52358a43 -//.word 0xdfe7aa7f -//.word 0x94cd27ba -//.word 0x0c280d60 -//.word 0x55db877d -//.word 0x9a79a574 -//.word 0xffa35cf5 -//.word 0xcd91cf29 -//.word 0xcfeecc2f -//.word 0xfce99acc -//.word 0x5589f25e -//.word 0x11404b12 -//.word 0xf8c45b57 -//.word 0x0d1ada93 -//.word 0x6ff38914 -//.word 0x813c7349 -//.word 0x49f17232 -//.word 0x1632f615 -//.word 0x66980273 -//.word 0x06c9773a -//.word 0x7b4a953c -//.word 0xa195bfe0 -//.word 0x926c7e17 -//.word 0xc96cc992 -//.word 0x88e58433 -//.word 0x76e946c1 -//.word 0x8da35fdf -//.word 0x33ea1a3f -//.word 0xa7163f13 -//.word 0x9f13dcc4 -//.word 0x30b445e7 -//.word 0xed495a6d -//.word 0x53730819 -//.word 0x65371338 -//.word 0x9352128c -//.word 0xe0ccbb89 -//.word 0x44d060c4 -//.word 0x4fbbbaa8 -//.word 0x1073e66a -//.word 0x35faad40 -//.word 0x734308ce -//.word 0x2944e3e1 -//.word 0x404c2260 -//.word 0x5597e280 -//.word 0x1a200136 -//.word 0xf9b6e0f2 -//.word 0xfb52678a -//.word 0xe9a84a74 -//.word 0xb1fc8b39 -//.word 0x0a374126 -//.word 0x5b3a9745 -//.word 0xd972178c -//.word 0xf0ac2953 -//.word 0xe52bd60c -//.word 0xb9f8d22e -//.word 0x507aba72 -//.word 0xd3469a42 -//.word 0x5238b26e -//.word 0xaec37a22 -//.word 0xb685e315 -//.word 0x901fe002 -//.word 0x5b43255c -//.word 0x120f2e3e -//.word 0xb39984a1 -//.word 0xa1cb3cd1 -//.word 0x4771c022 -//.word 0xff90d2de -//.word 0x32f9cd83 -//.word 0xc01f2e2b -//.word 0xa226544c -//.word 0xce3c84a1 -//.word 0x5a2c3068 -//.word 0xe53079ce -//.word 0x3307f2a8 -//.word 0x1748a763 -//.word 0x96f65e3e -//.word 0x49541cb6 -//.word 0x03fbeb42 -//.word 0xb429db41 -//.word 0x8d5c4731 -//.word 0x65205921 -//.word 0x5c25d069 -//.word 0xbe940198 -//.word 0x2aa31cae -//.word 0xf368b18c -//.word 0xc6ea73a8 -//.word 0x8d7e3b05 -//.word 0x94515063 -//.word 0xea41e5b3 -//.word 0x0bf1e3cd -//.word 0xbb1ce965 -//.word 0x3529913b -//.word 0x8500f693 -//.word 0x331d73e5 -//.word 0x21e2add5 -//.word 0xb632d365 -//.word 0x3c3b246a -//.word 0x8793b23d -//.word 0xd88766b2 -//.word 0x01b0454e -//.word 0xc9c7f1b4 -//.word 0x91b97361 -//.word 0x38fe3799 -//.word 0x3d2758a1 -//.word 0x23b71f2f -//.word 0x1a34c61f -//.word 0xdb7e8167 -//.word 0xd45fbf4d -//.word 0x8562acd8 -//.word 0x2ae9fb84 -//.word 0x9a7ae439 -//.word 0x6f5a687e -//.word 0x675ddceb -//.word 0x0afca5dc -//.word 0x8da8416d -//.word 0xf75e87a2 -//.word 0x827c2fe5 -//.word 0x44d394b6 -//.word 0x0efdb99e -//.word 0x95f08a64 -//.word 0xcfd46584 -//.word 0xa012d9dd -//.word 0xb6aeaeaa -//.word 0xb2d625b3 -//.word 0x88bb80c5 -//.word 0x289fc55f -//.word 0x5e2fc0ae -//.word 0xf61447bb -//.word 0x25c5c2e4 -//.word 0x249fea89 -//.word 0x1e37d007 -//.word 0x4cef21ea -//.word 0x5fc7a95e -//.word 0x1e7617e7 -//.word 0x50ba0052 -//.word 0xdcec26ec -//.word 0x2fd7f9f1 -//.word 0xdeca5e47 -//.word 0x8cecb06c -//.word 0x0fd004ae -//.word 0xce49b29a -//.word 0x6d8011b6 -//.word 0xad438173 -//.word 0x8da0af5d -//.word 0xb6b31495 -//.word 0x15bcbf81 -//.word 0xca7455c2 -//.word 0x41a25666 -//.word 0x9ee9a15f -//.word 0x5fe43b34 -//.word 0x3c754cf7 -//.word 0x52596a77 -//.word 0x81001ab6 -//.word 0x139c949e -//.word 0x9e79c7ef -//.word 0x2b8c9d7c -//.word 0x974e8097 -//.word 0x3acb1dca -//.word 0xc7f568c8 -//.word 0x733fe0a2 -//.word 0x5a67143e -//.word 0x1e936606 -//.word 0xd1a00fdd -//.word 0x15b76357 -//.word 0x81215629 -//.word 0x475c40de -//.word 0x146eddcc -//.word 0x38799847 -//.word 0x07900914 -//.word 0x7fc9bc20 -//.word 0x2b933472 -//.word 0x464a2f5f -//.word 0x24092cfd -//.word 0xcec02bda -//.word 0xed86b4ed -//.word 0xe9301acc -//.word 0x51220120 -//.word 0x7e651e56 -//.word 0x73fa3e98 -//.word 0x086e8afc -//.word 0x48af09fb -//.word 0x171e6624 -//.word 0x18e5f411 -//.word 0xcd8bef9b -//.word 0x00c6054a -//.word 0x6290140f -//.word 0x737c3636 -//.word 0xa14bfb96 -//.word 0xb4baf50b -//.word 0x699f7a26 -//.word 0x5d34a522 -//.word 0x2db39e1a -//.word 0xdc231b7a -//.word 0x757127b4 -//.word 0xf1c22334 -//.word 0x5a080a95 -//.word 0x31d3f915 -//.word 0x0e6bee46 -//.word 0x861bcf07 -//.word 0x51cfafb3 -//.word 0xace24e98 -//.word 0xfd31deab -//.word 0xb6740d79 -//.word 0x7bce3f61 -//.word 0x87a21b01 -//.word 0x4ca94aee -//.word 0x59417ba8 -//.word 0x8108abcd -//.word 0x3aaaa38c -//.word 0x43f7c25d -//.word 0x8a39fcef -//.word 0x4cc42362 -//.word 0x7ece65b7 -//.word 0x6c811785 -//.word 0xa04fb1ed -//.word 0x058619cf -//.word 0x4c24243e -//.word 0x8fec5a32 -//.word 0x34b9f97d -//.word 0x15133d01 -//.word 0xdd00df1f -//.word 0xb51cdb73 -//.word 0x21ec77be -//.word 0x24708123 -//.word 0xabf7d897 -//.word 0x29372e93 -//.word 0x7e9d0b0b -//.word 0x1de215a4 -//.word 0x6edf9022 -//.word 0x71a2211f -//.word 0xa5c1d703 -//.word 0x28ee6b30 -//.word 0x1fccc77d -//.word 0x5802c6e6 -//.word 0x2e8d3b82 -//.word 0xad5a34b5 -//.word 0xf71480a6 -//.word 0xe63b6ef3 -//.word 0xf376d8a4 -//.word 0x572a605e -//.word 0x704bfad9 -//.word 0x6572ab94 -//.word 0x0d3090c8 -//.word 0x0da3219a -//.word 0x4146b794 -//.word 0x5e0d4c56 -//.word 0xd5b28289 -//.word 0xfa49e715 -//.word 0x651b7894 -//.word 0x98b16406 -//.word 0xe32f12c6 -//.word 0x85e464bd -//.word 0x141e3ed5 -//.word 0x1f4342b0 -//.word 0x111dde9b -//.word 0x587689bd -//.word 0xc7e54994 -//.word 0x39e779a3 -//.word 0x7831c964 -//.word 0x5d458684 -//.word 0x38441c4f -//.word 0x7103d96a -//.word 0x7060f3c0 -//.word 0xbbd7cdbe -//.word 0x5e5076c3 -//.word 0x903b72d2 -//.word 0x93dfbe8b -//.word 0xdcef0e59 -//.word 0x745f59ec -//.word 0x9e7597ea -//.word 0xba23cae1 -//.word 0x69943b81 -//.word 0xf2050608 -//.word 0xe5d6d8fd -//.word 0xfee1f821 -//.word 0x4b0a84a3 -//.word 0x9117fe93 -//.word 0xedc30799 -//.word 0xb70d69e7 -//.word 0xabd65b6c -//.word 0x4bab014a -//.word 0x7fe0338b -//.word 0x7fde7f0f -//.word 0xf2bd71c9 -//.word 0x5816112c -//.word 0xa512aedf -//.word 0x2ec7dab8 -//.word 0xc9c5b6e8 -//.word 0x30eb7073 -//.word 0xa78009e4 -//.word 0xdf7f5c3e -//.word 0x19315c35 -//.word 0x8e019d9e -//.word 0x0f8d1625 -//.word 0xe9f9253e -//.word 0x0b88d35e -//.word 0x6b6d5a6a -//.word 0xa5dee470 -//.word 0xe56b9695 -//.word 0x088ecd4e -//.word 0xfe83a7d3 -//.word 0x7359c6d1 -//.word 0xae4a505f -//.word 0xb9483a34 -//.word 0xc2d8c717 -//.word 0xc1234b96 -//.word 0x5b4a35fb -//.word 0x06fb4c7c -//.word 0x6f4239b2 -//.word 0x19a1464d -//.word 0x46626505 -//.word 0x1a2c74d4 -//.word 0xfed5bf62 -//.word 0x4377c7c1 -//.word 0x07c6425a -//.word 0x5da06227 -//.word 0xa8e65a23 -//.word 0x488b1fff -//.word 0x79ea6b17 -//.word 0x775d08a4 -//.word 0xe70b4b33 -//.word 0x7201df56 -//.word 0xb385c399 -//.word 0x53a696b7 -//.word 0x7218130e -//.word 0x493fd851 -//.word 0x0e8a6b7d -//.word 0x18027e0e -//.word 0x44237272 -//.word 0x97ea1bbe -//.word 0x252fc3a0 -//.word 0x31357194 -//.word 0x95806b5b -//.word 0x65e6f9aa -//.word 0xcfe96c1f -//.word 0x45445f78 -//.word 0xdfc43d07 -//.word 0xfa590361 -//.word 0x266d4757 -//.word 0x3f747a27 -//.word 0xd9c56af3 -//.word 0xe1a80a71 -//.word 0x82b076e5 -//.word 0x464b324c -//.word 0x7e97b2da -//.word 0xe37720a7 -//.word 0x7de759a6 -//.word 0xc48c39d6 -//.word 0x068f18bc -//.word 0x08ac9410 -//.word 0xf08691b7 -//.word 0x623e7ff1 -//.word 0xea43dcd4 -//.word 0x9a6cf9f9 -//.word 0xf4440075 -//.word 0x0aa5360a -//.word 0xe3887e9f -//.word 0x211b1fee -//.word 0xe114c67d -//.word 0xe345cfcf -//.word 0xeb71c0db -//.word 0x665f16bd -//.word 0x512c45ac -//.word 0x57e5fa2c -//.word 0x3956a384 -//.word 0x731c3173 -//.word 0x1d021c1f -//.word 0x0f8aa84e -//.word 0x48c968d8 -//.word 0x9178005d -//.word 0x5d492e33 -//.word 0xf4770ca2 -//.word 0xd0a18f54 -//.word 0x47d85407 -//.word 0x6bf79c85 -//.word 0x2f3295d6 -//.word 0xcbf2dbb4 -//.word 0x61e13e3f -//.word 0xe040c6f2 -//.word 0x2981f4d6 -//.word 0x70124bf5 -//.word 0xe5770f12 -//.word 0x949b4d97 -//.word 0x8a681bcf -//.word 0x3a952155 -//.word 0x1fbf58cd -//.word 0xa2bc12d1 -//.word 0x3d2c3b2e -//.word 0xe150de51 -//.word 0x9520eafc -//.word 0x6197373e -//.word 0x6a52c4a1 -//.word 0x5e5943a5 -//.word 0x123dd76d -//.word 0x6a631cb9 -//.word 0x7a9f6814 -//.word 0xea04504f -//.word 0x9ffb6e2d -//.word 0x97936260 -//.word 0x151817b4 -//.word 0xffe7488b -//.word 0x84804289 -//.word 0x01ddeb90 -//.word 0x260303ef -//.word 0x55d6aad6 -//.word 0x4a31220e -//.word 0x0136d7e6 -//.word 0xd4e39c71 -//.word 0xe5e638ee -//.word 0xbbb38000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x0000F550 -//// expected output -//.word 0xd4292e3e -//.word 0x757b4819 -//.word 0x873b5542 -//.word 0x78a8c484 -//.word 0xe99c019a -//.word 0x18d10734 -//.word 0x59c56ac4 -//.word 0x54c2d518 -//.word 0x298050a7 -//.word 0x8e46e2af -//.word 0x85b25e05 -//.word 0xfcff6ad5 -//.word 0xfed4c436 -//.word 0x577a90a3 -//.word 0x107f25b9 -//.word 0x9f1cc999 -//// SHA512LongMsgvector_79 -//// vector length -//.word 0x0000F868 -//// input message -//.word 0x7d130ba8 -//.word 0x31a68bc3 -//.word 0x532c78bc -//.word 0x6b1a47c2 -//.word 0x3e3772fa -//.word 0xaaf37974 -//.word 0xd2fb275e -//.word 0x7b0a1677 -//.word 0xb60275c7 -//.word 0xc03b098e -//.word 0x261b727a -//.word 0x2ce7b01c -//.word 0x70d8e59d -//.word 0xcb725cad -//.word 0x7811cbbd -//.word 0x78c5d56e -//.word 0x345fd349 -//.word 0x65ccd4b0 -//.word 0x31a2e214 -//.word 0x96f98869 -//.word 0x0c7c91d7 -//.word 0x66c011b3 -//.word 0xfad4aaad -//.word 0x0119084b -//.word 0x4153ae96 -//.word 0xe901f513 -//.word 0xbcea51f4 -//.word 0x71f9d790 -//.word 0x5a4afc11 -//.word 0x4585a06c -//.word 0xa06b4b97 -//.word 0xe0aeb6f6 -//.word 0x23068d16 -//.word 0x1381739d -//.word 0x0e1b4781 -//.word 0x858ea579 -//.word 0xa26bb0b1 -//.word 0x2e6a0fc2 -//.word 0xb1fe36e1 -//.word 0xdb2de756 -//.word 0x229ff831 -//.word 0xadf55638 -//.word 0x715c4a23 -//.word 0x9a61fb0c -//.word 0x2c073521 -//.word 0xea16689c -//.word 0x77b7f4f5 -//.word 0xbb3ea355 -//.word 0x8847774f -//.word 0x7d04a7cb -//.word 0x2bd5e442 -//.word 0x7719e031 -//.word 0x3f4511c7 -//.word 0x4133b3e1 -//.word 0x38bc0c39 -//.word 0x4788f3da -//.word 0x9b2593d8 -//.word 0x4d576d3d -//.word 0x85af9c46 -//.word 0xe55f5dd0 -//.word 0x254dce0d -//.word 0xfa66f67b -//.word 0x3d350617 -//.word 0x49b4dece -//.word 0xa562d334 -//.word 0xe395b078 -//.word 0xc712fa98 -//.word 0xacdb79d1 -//.word 0x2448f35a -//.word 0xdf593b51 -//.word 0xce4b6bf6 -//.word 0x87696d17 -//.word 0xec25c0cb -//.word 0x07677863 -//.word 0x3925879e -//.word 0x94343c1c -//.word 0x855e0915 -//.word 0xb6b4894b -//.word 0x3225c13d -//.word 0xcb50a79e -//.word 0xb997e005 -//.word 0x8375cee6 -//.word 0x2311cac1 -//.word 0x6513ae99 -//.word 0x90b697a8 -//.word 0x481ee951 -//.word 0xb3ed9356 -//.word 0xdb11944b -//.word 0x53dfbe4b -//.word 0x1e66b9e9 -//.word 0xccfd4c69 -//.word 0xe61fd831 -//.word 0x8c79257a -//.word 0x5d40614b -//.word 0x97c866a8 -//.word 0x7f533c07 -//.word 0x0427df03 -//.word 0x9fe34254 -//.word 0x7d1293ff -//.word 0xe001c1ca -//.word 0xc3ce3cf3 -//.word 0xbdc2fc21 -//.word 0x27e0c49b -//.word 0x81bea8b8 -//.word 0x1294cd97 -//.word 0xcf93700f -//.word 0x7e7829e9 -//.word 0x1b60714d -//.word 0x7bde637b -//.word 0x2f4bbfbc -//.word 0xab5d3497 -//.word 0xa8fbdf47 -//.word 0xc6500f6d -//.word 0x761f4b03 -//.word 0x17569691 -//.word 0x5fe5f1a3 -//.word 0xfdd0227a -//.word 0x7c83b402 -//.word 0x6b673f04 -//.word 0xbbb2e99d -//.word 0x68832def -//.word 0x5c2edb16 -//.word 0x90d4605d -//.word 0x743848b2 -//.word 0x91cd0158 -//.word 0x6c14e2dc -//.word 0xae246b4a -//.word 0x838acfa0 -//.word 0x4054af83 -//.word 0x48692931 -//.word 0x301c11b7 -//.word 0x21007e64 -//.word 0x7efd897d -//.word 0xc7a35132 -//.word 0xbebf43d1 -//.word 0xc82c983a -//.word 0x95ec1e93 -//.word 0x03773c3d -//.word 0x40533006 -//.word 0x2fe59ca0 -//.word 0x0e874152 -//.word 0x55db0aed -//.word 0xe15e4c02 -//.word 0x51404c52 -//.word 0xb1730286 -//.word 0x56021c20 -//.word 0x08a446b2 -//.word 0x6791a94d -//.word 0x8794b13d -//.word 0xde6114f3 -//.word 0x602a1043 -//.word 0xe86df4d0 -//.word 0xda10e1c4 -//.word 0x06afd2c4 -//.word 0xd035da23 -//.word 0x8ea9ad55 -//.word 0x324b62a7 -//.word 0x29e0772e -//.word 0x834a16fd -//.word 0x535b969b -//.word 0x59eb45b5 -//.word 0xde28650f -//.word 0xe02e74c0 -//.word 0x6fd8b19f -//.word 0x57d5dbf9 -//.word 0xfffe3c85 -//.word 0x91e6e699 -//.word 0x5bb33d9d -//.word 0x762db5c1 -//.word 0xa515ddeb -//.word 0x7fb89df3 -//.word 0xd1c4bb13 -//.word 0x3e59a499 -//.word 0x28636adf -//.word 0xd428097d -//.word 0xc81deebd -//.word 0x78feba50 -//.word 0x221d433f -//.word 0xf7fbdb24 -//.word 0x7b15d699 -//.word 0x2e0046f1 -//.word 0x6cb80926 -//.word 0x92360613 -//.word 0x6240b3e3 -//.word 0xa985dbca -//.word 0x1ee99ef3 -//.word 0x8e1eb9b9 -//.word 0x36740719 -//.word 0x71f24867 -//.word 0x93a52241 -//.word 0x143865c2 -//.word 0xf1c593f7 -//.word 0x4feba097 -//.word 0x6121f6ee -//.word 0x8d49bc1b -//.word 0xca89587b -//.word 0x4d563265 -//.word 0x64d1bb18 -//.word 0xa257aff1 -//.word 0x3c5397e2 -//.word 0xb357911f -//.word 0xb36c531a -//.word 0x3ca66eb2 -//.word 0xfffbd0a7 -//.word 0x0b548d52 -//.word 0xa8e5df93 -//.word 0x83ba6b0a -//.word 0x0c93c58a -//.word 0x1df237ca -//.word 0xdc72be5e -//.word 0xe25a56e6 -//.word 0x9d727786 -//.word 0xf216e096 -//.word 0x2788939a -//.word 0x018b2174 -//.word 0x292d27d8 -//.word 0xd4e41901 -//.word 0xa3dc3ea2 -//.word 0xc890fc20 -//.word 0x6b9856fe -//.word 0x4cc1b399 -//.word 0xa963e115 -//.word 0x62ef5997 -//.word 0x5bc8c5b4 -//.word 0x2254bf2a -//.word 0xd252dcce -//.word 0x376ee9c6 -//.word 0x321274f8 -//.word 0x5f808fc2 -//.word 0xf61ed0ec -//.word 0xef109cdb -//.word 0x6a0ca507 -//.word 0x4d6ab2af -//.word 0x2f7b9fcb -//.word 0x751ca442 -//.word 0xba8bda5d -//.word 0x7579fa7b -//.word 0xd5606807 -//.word 0xf01671a8 -//.word 0x1da3d1b7 -//.word 0x9e5079f6 -//.word 0x83008f7f -//.word 0xcac3b5fa -//.word 0xcba98e13 -//.word 0xd4d47e2c -//.word 0x10d1b24e -//.word 0xad296166 -//.word 0x3d3251ae -//.word 0x5d2b9c69 -//.word 0x9588b4d3 -//.word 0x808ba558 -//.word 0x2d149a04 -//.word 0xc4baa33b -//.word 0x6d1ab5aa -//.word 0x6d6ff37d -//.word 0x92642bd2 -//.word 0xd226a46e -//.word 0x2fbc17af -//.word 0xde9bfbc2 -//.word 0xa7750516 -//.word 0x8f53f011 -//.word 0xb5e37a01 -//.word 0x7a13af55 -//.word 0xe4de690d -//.word 0x4566186f -//.word 0x1744bffc -//.word 0x2b1c3fa2 -//.word 0x0374d833 -//.word 0x7cc6ed16 -//.word 0xafd3073d -//.word 0x1a3b1d56 -//.word 0xfb4b1346 -//.word 0xfd1680d3 -//.word 0x16c7b4a0 -//.word 0xb035fa5f -//.word 0x07b81a42 -//.word 0xd23c22b2 -//.word 0x25936644 -//.word 0x9610c6e9 -//.word 0x9f512f65 -//.word 0x435c6502 -//.word 0xf4eeff85 -//.word 0xb50fb361 -//.word 0x7cead32b -//.word 0xdadc184e -//.word 0xddcb9f00 -//.word 0x36b93174 -//.word 0x9798c751 -//.word 0x5f604d64 -//.word 0x7960a791 -//.word 0x81d1f210 -//.word 0x29b10cd6 -//.word 0xdccf5650 -//.word 0xa122b857 -//.word 0x415ee661 -//.word 0xacc9e2f4 -//.word 0x994bc361 -//.word 0x6dc5b4ae -//.word 0x5ea43fd4 -//.word 0xd8b6cc2b -//.word 0x1f3c6422 -//.word 0x3740bb33 -//.word 0x01296e16 -//.word 0xa68c8935 -//.word 0x38454c61 -//.word 0x97c72fc3 -//.word 0x92b02315 -//.word 0x4fa11b12 -//.word 0xed4ccb2a -//.word 0x67ceaf7b -//.word 0xbc4050fd -//.word 0x4d88c3fc -//.word 0x867572cc -//.word 0xc00c1fb8 -//.word 0x661c253b -//.word 0x57190173 -//.word 0x8c2612d2 -//.word 0xfb749d17 -//.word 0xbbcb147c -//.word 0x68669831 -//.word 0xc904bc0a -//.word 0xb03c8c75 -//.word 0x2211ceae -//.word 0xb8c68736 -//.word 0x45f4c181 -//.word 0xb9d98cee -//.word 0x46f343fd -//.word 0xc1cd10bd -//.word 0x4a1ab283 -//.word 0x2f007ee1 -//.word 0x0eb6a4d6 -//.word 0x3a51b443 -//.word 0x60db619e -//.word 0x6ba684ea -//.word 0xa4df64e7 -//.word 0x1e663486 -//.word 0x51dddd9f -//.word 0x0500fee6 -//.word 0x7234311c -//.word 0xa5629182 -//.word 0x25057993 -//.word 0xd7828ef2 -//.word 0x1fb9ffa2 -//.word 0x48d90b75 -//.word 0x2678c4c7 -//.word 0xf9e3136b -//.word 0x95b2fde6 -//.word 0xc0a024db -//.word 0xdc9a91c7 -//.word 0xc616b0ef -//.word 0xfda69c96 -//.word 0x07cd9d72 -//.word 0x1011f061 -//.word 0xd551c659 -//.word 0xc0598e9d -//.word 0x54b47737 -//.word 0xccc131a2 -//.word 0xff0af4c7 -//.word 0x87d0c42b -//.word 0x22ebf366 -//.word 0x58d1e7d7 -//.word 0x5ff41e96 -//.word 0x3b516eaa -//.word 0x2945927c -//.word 0x3ea3e28c -//.word 0x4c056263 -//.word 0x055ffec9 -//.word 0x63da1437 -//.word 0x47df338f -//.word 0x6071230b -//.word 0x4ec12573 -//.word 0x07fc7b94 -//.word 0x7a682bed -//.word 0x73af01ab -//.word 0xbf7bd3d8 -//.word 0x904208cf -//.word 0x23645bf3 -//.word 0x9f73dda0 -//.word 0x41d13962 -//.word 0xb6813c65 -//.word 0xc837952d -//.word 0x3db1d987 -//.word 0xfc4acac0 -//.word 0x72cdd814 -//.word 0x3487e869 -//.word 0xe6a0553e -//.word 0x5bab34de -//.word 0xfd7bddd9 -//.word 0x7038a7b4 -//.word 0x72b3f2e0 -//.word 0x06f76be9 -//.word 0xd1218bf0 -//.word 0xc471615b -//.word 0xfba092cb -//.word 0xe5749e4e -//.word 0xa69364d7 -//.word 0xb995e9eb -//.word 0xda5c559c -//.word 0x23a83ebb -//.word 0x75e6294a -//.word 0x19494e30 -//.word 0xa71c9c30 -//.word 0x2757fd1c -//.word 0x7770db46 -//.word 0xed73e338 -//.word 0x3c5509a5 -//.word 0x9c86cc9f -//.word 0x25c5bb09 -//.word 0x7c383850 -//.word 0xb2bc7c56 -//.word 0x697adbaf -//.word 0x39bb4910 -//.word 0x52fd1e04 -//.word 0x624516e1 -//.word 0xb9b89cfb -//.word 0xab654817 -//.word 0x3566a623 -//.word 0xe4273924 -//.word 0xf305bf6f -//.word 0xb31bb71c -//.word 0x305821b8 -//.word 0x12d5853a -//.word 0xc1663638 -//.word 0xcd70d85b -//.word 0x8cfa2011 -//.word 0x0506db81 -//.word 0x0c2132c4 -//.word 0xaf392c52 -//.word 0xd1af74ba -//.word 0x15ad5d97 -//.word 0xfeba23bf -//.word 0x548b74bd -//.word 0xc91c2e82 -//.word 0xdc006b57 -//.word 0xfef6bb16 -//.word 0xf3bcb09a -//.word 0x7c28a074 -//.word 0x3374a6df -//.word 0xb6daeaf7 -//.word 0x07602225 -//.word 0x33f659de -//.word 0x32beef8d -//.word 0x0fabe2cd -//.word 0x494d4bdc -//.word 0x78eb2c4c -//.word 0x33d368fc -//.word 0x32ee1347 -//.word 0xb097ec7b -//.word 0x13ad288d -//.word 0xcfe7720b -//.word 0x88682f51 -//.word 0x77940600 -//.word 0x0e21a0ac -//.word 0xdf71acd5 -//.word 0xba1f2719 -//.word 0x15d8daa7 -//.word 0xb16c24f7 -//.word 0x7b24f9b9 -//.word 0xb1572b0b -//.word 0x4538e8ee -//.word 0x86f285fb -//.word 0xfdf77952 -//.word 0x9594add4 -//.word 0x00caf392 -//.word 0x5559d384 -//.word 0xfe1d8e7f -//.word 0xd19d5d61 -//.word 0x7de2fa8f -//.word 0x288561a1 -//.word 0x560cd85b -//.word 0x0d772ddf -//.word 0x37153f22 -//.word 0x479cbf9d -//.word 0x1f793845 -//.word 0x31654dbc -//.word 0xe53943c9 -//.word 0x3b03bf06 -//.word 0xb259d0d8 -//.word 0x68ed2fa4 -//.word 0x8262c640 -//.word 0xce5e70a8 -//.word 0xa7e100f3 -//.word 0x1ad58485 -//.word 0x47e6cb85 -//.word 0x09932492 -//.word 0xd98569b1 -//.word 0xef203c8a -//.word 0xab5991d5 -//.word 0x34c76d0f -//.word 0x5ffcec71 -//.word 0xd2158922 -//.word 0x69909aac -//.word 0xd85e1aad -//.word 0x9239abcf -//.word 0xea38dbf9 -//.word 0x78a1a7c7 -//.word 0xbffe3e38 -//.word 0x0c7307a7 -//.word 0xa14ee4fd -//.word 0x13e0b924 -//.word 0xf18c28bf -//.word 0xa61d9f18 -//.word 0xa15c9559 -//.word 0xb3e31000 -//.word 0xb82c6b8d -//.word 0x79ed567d -//.word 0xd1a81e7c -//.word 0x0f7d2fd7 -//.word 0x9c44d730 -//.word 0xded84c75 -//.word 0x5bb5f113 -//.word 0x22c6d566 -//.word 0x67787c74 -//.word 0x6d13e3dc -//.word 0xa94abe09 -//.word 0x241104ab -//.word 0x21aead68 -//.word 0x0013bbce -//.word 0x626b778d -//.word 0x8ef3fde3 -//.word 0x130bfa57 -//.word 0xaf8db5aa -//.word 0x705d4c0b -//.word 0x1941408a -//.word 0xc7f334cf -//.word 0xd475f20c -//.word 0xfca5af30 -//.word 0xbe11905e -//.word 0x050c6d9d -//.word 0x0802d4d1 -//.word 0x6f0851ea -//.word 0xb7b7ec5b -//.word 0xd73bf4cd -//.word 0x24a7fb15 -//.word 0x728b2264 -//.word 0x7cc997be -//.word 0x86a45bae -//.word 0x401a4937 -//.word 0xee74540d -//.word 0xc61b1006 -//.word 0x99ad74cb -//.word 0xb650ded3 -//.word 0x0c475792 -//.word 0x8ec318ed -//.word 0xdcfb4ef2 -//.word 0x1f7e1bc6 -//.word 0x34c8ddde -//.word 0x0e14b272 -//.word 0x55723c2f -//.word 0x5319a12d -//.word 0x11fed620 -//.word 0xbda61ed2 -//.word 0x4f38cdd1 -//.word 0x6dd65264 -//.word 0x8b2d74c4 -//.word 0x564bdc89 -//.word 0x53b1d463 -//.word 0xc3aa4e0a -//.word 0xcbdb2878 -//.word 0xd11aae55 -//.word 0x298461b3 -//.word 0xf1c9f7fb -//.word 0x39cba227 -//.word 0x68689532 -//.word 0xda93c5cd -//.word 0xceaaec54 -//.word 0x8003d400 -//.word 0x92c9d25e -//.word 0xb0069000 -//.word 0x74001072 -//.word 0x87c9ee6f -//.word 0x0a12e655 -//.word 0x344095d7 -//.word 0x3cc284f2 -//.word 0x79a16222 -//.word 0xc85891d5 -//.word 0x2ee7e520 -//.word 0xbe23a8b1 -//.word 0xbd50e105 -//.word 0x05f1d5db -//.word 0xa7dfcfe8 -//.word 0xd4991dcc -//.word 0xfedb5b45 -//.word 0x3a72f4a2 -//.word 0xe94ee57b -//.word 0x97d9c4a0 -//.word 0x2387014f -//.word 0x20ae6daa -//.word 0x7c99f867 -//.word 0x5fd8bfca -//.word 0x56d946d0 -//.word 0xb1bd01ae -//.word 0x2a641a79 -//.word 0xc7ca6e27 -//.word 0x0197d9b6 -//.word 0x25f1b3ab -//.word 0xfb959abe -//.word 0xa62672d4 -//.word 0xcbc4ab2d -//.word 0xf5e1c2df -//.word 0x38500b83 -//.word 0x159fad2e -//.word 0x9ea7eea3 -//.word 0xda61b1c6 -//.word 0x6bfc3c54 -//.word 0x6e2c3fd2 -//.word 0xa3c412c3 -//.word 0xce873f1e -//.word 0x5d3b40ff -//.word 0x4a008a9d -//.word 0x43e0ca7c -//.word 0x09a76ee4 -//.word 0x16f56791 -//.word 0x82912dac -//.word 0x270004fa -//.word 0x04577f54 -//.word 0xdf4d4257 -//.word 0x2e940b5c -//.word 0x386af4aa -//.word 0x786bf2eb -//.word 0x42a9a2dd -//.word 0xa9fe454a -//.word 0x9fa1083a -//.word 0x5ef88a67 -//.word 0x07ad98f1 -//.word 0x89043b53 -//.word 0xc56cf496 -//.word 0xf05446c5 -//.word 0x383f75a0 -//.word 0xaa1b8e94 -//.word 0x53cea7eb -//.word 0xa5136841 -//.word 0x1d84ca37 -//.word 0x23f71f6b -//.word 0x320e53a7 -//.word 0x380a7158 -//.word 0x40e06842 -//.word 0x4e8f1073 -//.word 0x8ab06875 -//.word 0xa14f22c8 -//.word 0x69f9618f -//.word 0xc416c18a -//.word 0xc67a9844 -//.word 0x1a367b8e -//.word 0xa1b4042b -//.word 0x5d03d3cd -//.word 0x8e6fd341 -//.word 0x1a55bee6 -//.word 0x3235e463 -//.word 0x33092899 -//.word 0xcad54bd7 -//.word 0x5c806d4d -//.word 0xa5e2d0c4 -//.word 0x9f1ee08c -//.word 0xa53270b5 -//.word 0xd8cc4782 -//.word 0xc260db1a -//.word 0x39775c81 -//.word 0x864af4c7 -//.word 0xc78f4e7f -//.word 0x92935573 -//.word 0xdb893e96 -//.word 0x1821c83a -//.word 0xa25dc283 -//.word 0x5fa1ce1c -//.word 0x9e096628 -//.word 0x42fe1c7c -//.word 0x230c260b -//.word 0xb1ee19a1 -//.word 0xdbebf5d5 -//.word 0x2f666239 -//.word 0x42b039d3 -//.word 0x522046d1 -//.word 0x2a664d78 -//.word 0x461c4a5e -//.word 0x389efdd9 -//.word 0x4a1ca6b7 -//.word 0x65ed0e2f -//.word 0x3126c618 -//.word 0x7e6cb359 -//.word 0xe306cba1 -//.word 0xa4361958 -//.word 0xd9ca07d5 -//.word 0xcdeedcd1 -//.word 0xa544841b -//.word 0x4237908e -//.word 0x688c7d41 -//.word 0x1f3939fd -//.word 0x597be3f4 -//.word 0xd623d2af -//.word 0x4530da49 -//.word 0xaca3cadb -//.word 0x098f3937 -//.word 0x3a7083d9 -//.word 0x1abd0e1a -//.word 0xedc1d2a7 -//.word 0xfea61832 -//.word 0x86d38167 -//.word 0xd0784b22 -//.word 0x9b66d0df -//.word 0xc0254f72 -//.word 0x1440eff8 -//.word 0x90e4010d -//.word 0xafa9863f -//.word 0x18b0f1c3 -//.word 0x7dee2e67 -//.word 0xc3c7e2c8 -//.word 0x63dff5c5 -//.word 0x102d4e33 -//.word 0x9a51ddd2 -//.word 0x1227df80 -//.word 0x2f9c5dad -//.word 0xf0c0f60f -//.word 0x831ddf97 -//.word 0x664828a3 -//.word 0xccb54175 -//.word 0x42cfbce4 -//.word 0x92485451 -//.word 0xe7ae2fdd -//.word 0x334060d9 -//.word 0xceffb07f -//.word 0x60089edf -//.word 0x0020a41b -//.word 0x9d91bcd7 -//.word 0x9d3523ec -//.word 0xc5d05d5c -//.word 0x59a2798b -//.word 0x843d96ac -//.word 0xf995a679 -//.word 0xdb567227 -//.word 0xdb7adf99 -//.word 0xa01a6fd4 -//.word 0x6b840ab3 -//.word 0xfb8fffdb -//.word 0xae2b46f2 -//.word 0xea3c080c -//.word 0xbba96066 -//.word 0xbdaf6457 -//.word 0x3d7c5f83 -//.word 0x9bf96152 -//.word 0xf2e7faa1 -//.word 0xfb2d42b7 -//.word 0x2f701c7a -//.word 0x2ce5bce2 -//.word 0x5a6367af -//.word 0xcebd7a57 -//.word 0x6f4eae43 -//.word 0x57d59a3a -//.word 0x7c847a1e -//.word 0x8f532ed6 -//.word 0x249a868b -//.word 0x14dfbc17 -//.word 0x1fec42ba -//.word 0xd625be0f -//.word 0xb919543f -//.word 0x9c572375 -//.word 0x4f831292 -//.word 0x7da9cc21 -//.word 0xd5d0098d -//.word 0x68d31091 -//.word 0x526c79f1 -//.word 0x9d923868 -//.word 0x6205d7e1 -//.word 0x312703ea -//.word 0xb30d4a65 -//.word 0x8ed62380 -//.word 0x893b2fe8 -//.word 0xf168be3a -//.word 0x3b0a95bb -//.word 0xeaaaef48 -//.word 0xb439c190 -//.word 0xe0ec4280 -//.word 0xf24aabff -//.word 0x8a833bdc -//.word 0x8a037f04 -//.word 0x7747d0f9 -//.word 0x22ef1d7f -//.word 0x8715eb99 -//.word 0xf5de99b3 -//.word 0x6f4ee921 -//.word 0x5361bcc8 -//.word 0x39571d1b -//.word 0x1e4f814a -//.word 0xc2174db5 -//.word 0x4e4399a7 -//.word 0x3a7c3441 -//.word 0x6e1be8b4 -//.word 0xa7f7ffb4 -//.word 0x1d7a0529 -//.word 0x63fbd027 -//.word 0x8e47be20 -//.word 0x99813e58 -//.word 0x082d929a -//.word 0xcc87d32a -//.word 0x671935fa -//.word 0x508c8c20 -//.word 0x99bf0f88 -//.word 0xcf165ce6 -//.word 0x2215bdef -//.word 0xc52daac9 -//.word 0x98d58fc0 -//.word 0x05ddcf3a -//.word 0x27ff08ed -//.word 0x32b8994f -//.word 0x0f56614e -//.word 0x4651ca42 -//.word 0x21de0620 -//.word 0x0fc299f0 -//.word 0x46641881 -//.word 0xac27305b -//.word 0xf8f6e9f5 -//.word 0x14212c28 -//.word 0xc66784e4 -//.word 0x90542122 -//.word 0xd5cd2219 -//.word 0x3ce914b5 -//.word 0x5a02b545 -//.word 0x8b0cfe74 -//.word 0x2026617a -//.word 0xc06f5093 -//.word 0x081bfeb0 -//.word 0x75c6696d -//.word 0x84079844 -//.word 0x17492100 -//.word 0x1bd6ef74 -//.word 0x6835426c -//.word 0xe8b6f7e4 -//.word 0xfc4b0a78 -//.word 0x1b99591c -//.word 0xbd4fab0d -//.word 0x77b7f008 -//.word 0x678bcbb9 -//.word 0xd2094d76 -//.word 0x0c49042d -//.word 0x98cf349b -//.word 0x915d64bf -//.word 0x480a1c8f -//.word 0x2f98eee9 -//.word 0xf603b3cc -//.word 0xf35617c8 -//.word 0xc7c258b3 -//.word 0x3ff14a9e -//.word 0x78989f07 -//.word 0x474c6551 -//.word 0xd796d071 -//.word 0x94493ae9 -//.word 0x481368fa -//.word 0x84530f15 -//.word 0x422a9694 -//.word 0xc8d51ea7 -//.word 0xd03ac091 -//.word 0xe5c01514 -//.word 0x1064fc29 -//.word 0xb40a97f5 -//.word 0xb71097f9 -//.word 0xe229ba89 -//.word 0x8b69917f -//.word 0x719c8730 -//.word 0xe7dc1f9f -//.word 0x35637df1 -//.word 0x3b9d2821 -//.word 0x57810ef5 -//.word 0x8922c931 -//.word 0xd581200a -//.word 0xe9a6d1dd -//.word 0x00ef8e21 -//.word 0x06a7459b -//.word 0xfddaa4d0 -//.word 0x9f68ddc0 -//.word 0x4559a6d1 -//.word 0x0770840a -//.word 0x25034a81 -//.word 0xa60adc17 -//.word 0x3e753962 -//.word 0x75c3b9eb -//.word 0x06d0939a -//.word 0x85eea16e -//.word 0x45386871 -//.word 0x792353ec -//.word 0x99563fd7 -//.word 0x08bc3c93 -//.word 0xf3d792dc -//.word 0x7c5703f9 -//.word 0x18eb5035 -//.word 0x3557ff93 -//.word 0x21c75abe -//.word 0x2762bb3f -//.word 0xfb2307f2 -//.word 0x58e479bb -//.word 0xe7bca175 -//.word 0x638bac2b -//.word 0xfbd3e58b -//.word 0xf7ca7c97 -//.word 0x9fad869e -//.word 0x5856466b -//.word 0x1111abbc -//.word 0xddac19f6 -//.word 0xe1cd6d16 -//.word 0x71883beb -//.word 0x76315983 -//.word 0x136fa2e3 -//.word 0x8892f4fa -//.word 0x56277bd8 -//.word 0xa4c9321c -//.word 0xe13aa6ab -//.word 0xabb2fea8 -//.word 0xef7638a0 -//.word 0x52adb504 -//.word 0xd06ff8dd -//.word 0xa320abbb -//.word 0x67fce2ee -//.word 0x7bf2a4f9 -//.word 0xaab6a844 -//.word 0x0b125c11 -//.word 0x257d2bb1 -//.word 0x57ee00f8 -//.word 0x78f206ee -//.word 0xbafdb3c7 -//.word 0xd4fd0416 -//.word 0x60350a3d -//.word 0x8149a528 -//.word 0xca95903b -//.word 0x5bc39d88 -//.word 0x4d9d4246 -//.word 0x511f557e -//.word 0x93d11408 -//.word 0xe55468b6 -//.word 0x193a6bcf -//.word 0xae1b27bf -//.word 0xb0e4a10c -//.word 0xd973168c -//.word 0xfc6184d6 -//.word 0xa41f6cf6 -//.word 0xf845d665 -//.word 0xe1269738 -//.word 0x6fa8cf97 -//.word 0x7953b571 -//.word 0x84a7976e -//.word 0xe6b31c25 -//.word 0x2ce3cd90 -//.word 0xb81ad3bc -//.word 0xaf0002c5 -//.word 0x129e1702 -//.word 0x2a283e7d -//.word 0x2a19d8a6 -//.word 0x10857a48 -//.word 0xccab39bb -//.word 0xa4cb255c -//.word 0xd737133a -//.word 0x80aba012 -//.word 0xbee1727e -//.word 0x1261c169 -//.word 0x089716c6 -//.word 0x1a275381 -//.word 0xd185f4b6 -//.word 0x2dc09422 -//.word 0x479eb3d7 -//.word 0x35eeb633 -//.word 0x2e1a2f12 -//.word 0xeefc5f43 -//.word 0x5cf2fa39 -//.word 0x6b352903 -//.word 0x3e66d57f -//.word 0x8f6a23ca -//.word 0x51783bfa -//.word 0x94704e10 -//.word 0xaa6fd728 -//.word 0x88a021f3 -//.word 0x6e550967 -//.word 0xcb5605b5 -//.word 0x5b78657c -//.word 0x9272d93c -//.word 0x3ded340d -//.word 0x67da6f91 -//.word 0x7908f127 -//.word 0xa6f60d61 -//.word 0x86e6cdb9 -//.word 0x0132ee7f -//.word 0x6fe32b16 -//.word 0xfd80bf60 -//.word 0x53242577 -//.word 0x74d3229e -//.word 0xe50e0577 -//.word 0x11a52e76 -//.word 0xeccdcd95 -//.word 0xd772ec49 -//.word 0xc4cfb0b5 -//.word 0x9a3bdb1e -//.word 0xdb4696a0 -//.word 0x84046e1f -//.word 0x34a99c80 -//.word 0x91568918 -//.word 0xe7339164 -//.word 0x13be07fb -//.word 0xa0637ac2 -//.word 0x2f4c375f -//.word 0x1c7a0ff0 -//.word 0x5e155bfc -//.word 0xaf003da9 -//.word 0xeeb12830 -//.word 0xc140a28f -//.word 0x7ebd487e -//.word 0x4cc713a3 -//.word 0x855adb09 -//.word 0x5fe919cf -//.word 0xccadf11d -//.word 0x9e3c705c -//.word 0xef5d12a7 -//.word 0xc01b877c -//.word 0xe018b6b8 -//.word 0x102403c2 -//.word 0x640ecd06 -//.word 0xecba3ba5 -//.word 0x9474396a -//.word 0x4984bd01 -//.word 0x5d034f63 -//.word 0x2dedc895 -//.word 0x01775a92 -//.word 0x33a2d086 -//.word 0x9410173c -//.word 0x0b16feda -//.word 0x7f143acc -//.word 0xf701adfe -//.word 0x004ae84e -//.word 0x50ddee41 -//.word 0xa8803af4 -//.word 0xff680456 -//.word 0xdc07c195 -//.word 0x0425e9d6 -//.word 0x5532fc29 -//.word 0xf2dbc7bc -//.word 0xa0dbe44f -//.word 0x701480e7 -//.word 0x9fde60c7 -//.word 0xba9f269c -//.word 0x059cd1f8 -//.word 0x1e0e8401 -//.word 0xde79886b -//.word 0x803993a3 -//.word 0x055d4b4d -//.word 0xd6b906f1 -//.word 0xac37d4f1 -//.word 0xad6ebfbf -//.word 0xd876514c -//.word 0xa2fa57c4 -//.word 0xe18ee578 -//.word 0xea439a1c -//.word 0xf6792532 -//.word 0xcbf508c6 -//.word 0x98349c5c -//.word 0x20fe5627 -//.word 0x1a3e487b -//.word 0xd810eb85 -//.word 0x281c1b3a -//.word 0x7823638d -//.word 0x3dd77be5 -//.word 0x95f00fce -//.word 0x2a7cc2ee -//.word 0x5a76733c -//.word 0x969bbf6c -//.word 0x0879c7ad -//.word 0x79c93397 -//.word 0x71fe775f -//.word 0xa01e544e -//.word 0x7cd1a271 -//.word 0x2cb84e91 -//.word 0xa5ff9f65 -//.word 0x1336bd07 -//.word 0x7a5c73a5 -//.word 0x9d3d3479 -//.word 0x1fff5cfb -//.word 0xe8f7b955 -//.word 0xcac14a17 -//.word 0x648f462c -//.word 0x47c1600d -//.word 0x58b64a34 -//.word 0x76e278d4 -//.word 0x5c2126c7 -//.word 0xc84b9cc7 -//.word 0xdd09b1e2 -//.word 0xc5e78e28 -//.word 0x9caab4a7 -//.word 0x89e34199 -//.word 0x2ec46edb -//.word 0x43335da1 -//.word 0x7d1d1269 -//.word 0xb50dbf2d -//.word 0x46fd44dd -//.word 0xb76cf60c -//.word 0x9ab09fea -//.word 0xb38ec772 -//.word 0x5d0832e4 -//.word 0x2a76aa76 -//.word 0xcad8ff46 -//.word 0x2e6b4b94 -//.word 0xec7a7a2e -//.word 0xe6770a2b -//.word 0x274a10dc -//.word 0x0de97c00 -//.word 0xad299d37 -//.word 0x73d4e8ba -//.word 0x09fbf548 -//.word 0x7a8dca64 -//.word 0x98295cbd -//.word 0x9b3153ee -//.word 0x0a200e67 -//.word 0xdf1de7ab -//.word 0xe6d0b8bd -//.word 0x66749ed4 -//.word 0x032dfc56 -//.word 0xe39cc304 -//.word 0x10b1f172 -//.word 0x1dc158bb -//.word 0x0dd9a172 -//.word 0x705190dc -//.word 0xcfa48a5c -//.word 0x4a7f542e -//.word 0x80171d58 -//.word 0xafc0bfde -//.word 0x1cbc4236 -//.word 0xb650a1fb -//.word 0xf61dd1e6 -//.word 0x09ae00f9 -//.word 0x314e1bfd -//.word 0x691c922f -//.word 0x48615f37 -//.word 0x27204559 -//.word 0x86ef55ef -//.word 0xac06b717 -//.word 0x8e96a7a9 -//.word 0xf25cbe6c -//.word 0xd4757389 -//.word 0x0974e13f -//.word 0x22b2cbd9 -//.word 0x93e5dddd -//.word 0x15f43487 -//.word 0x480a2175 -//.word 0x9dea2aa4 -//.word 0x7382529b -//.word 0x80c29be6 -//.word 0x73aec8c6 -//.word 0xd7b26727 -//.word 0x3b360fd2 -//.word 0x9073e7e4 -//.word 0xd285677f -//.word 0xebc163bf -//.word 0xd44845f0 -//.word 0xfddc9afe -//.word 0xeff3d02c -//.word 0x300a3d09 -//.word 0x663c64a1 -//.word 0xc01374f0 -//.word 0x929e129c -//.word 0x3fc458e3 -//.word 0x5cd71ed1 -//.word 0x126d78b7 -//.word 0xc46b7fda -//.word 0xf2625568 -//.word 0x5e1f63b0 -//.word 0x6d7de591 -//.word 0xcf7ea933 -//.word 0x629a13f6 -//.word 0x545765a8 -//.word 0x891a3dfb -//.word 0x3c3d6036 -//.word 0xe861b52a -//.word 0x69069568 -//.word 0x5e5942b1 -//.word 0xd34cb4ae -//.word 0x1dec9ce1 -//.word 0x04f0a3dc -//.word 0x288df2b1 -//.word 0x9d92f8a9 -//.word 0xd9b06739 -//.word 0xd0198031 -//.word 0x5d4e9137 -//.word 0xe431bc74 -//.word 0x3662f98d -//.word 0xb4c85ed5 -//.word 0xb86e9fc1 -//.word 0x3091d19c -//.word 0x8cf7737b -//.word 0xdb82ae74 -//.word 0x3004dc0b -//.word 0x4b5548ed -//.word 0x75a334e1 -//.word 0xac0a21fb -//.word 0x00644a12 -//.word 0x3d637275 -//.word 0xcadddfda -//.word 0xd166a797 -//.word 0xa0242a15 -//.word 0x50dfe081 -//.word 0xa45855c4 -//.word 0x33dc71b6 -//.word 0xca18fd8e -//.word 0x0c2f639e -//.word 0x5b0ab53d -//.word 0xfcf0f104 -//.word 0x7556843d -//.word 0x3af80c98 -//.word 0x89286220 -//.word 0x9366d86e -//.word 0xdc32bf1c -//.word 0xe41e2d7d -//.word 0x0727fd8b -//.word 0xa2451621 -//.word 0x7741f16b -//.word 0x53c7559a -//.word 0xeebc65dc -//.word 0x12d1dd8b -//.word 0xff5999a4 -//.word 0x0f58577c -//.word 0x96dcbdae -//.word 0x0c909e58 -//.word 0x6e8e7987 -//.word 0xe17542ef -//.word 0x99bb65e0 -//.word 0xf9450975 -//.word 0xfb35910f -//.word 0xd3046901 -//.word 0xcfd0ff8d -//.word 0x82f70f10 -//.word 0x21e42479 -//.word 0x2d295cff -//.word 0x52ce6b14 -//.word 0x90e9e294 -//.word 0x986fb243 -//.word 0x794aeb76 -//.word 0x7bacca10 -//.word 0x4ba2f3b0 -//.word 0x59ecfb29 -//.word 0x7f0c2933 -//.word 0xe39d7e60 -//.word 0x1ee6f251 -//.word 0x9eaf0129 -//.word 0x48536642 -//.word 0x6217271f -//.word 0xb1bad1a2 -//.word 0xde4e057f -//.word 0x1f4633f1 -//.word 0x13cfa6ac -//.word 0xed64c112 -//.word 0xd49c88a9 -//.word 0x8a4762cd -//.word 0x4cba1ca2 -//.word 0xfa67324d -//.word 0x78b14a64 -//.word 0x54fe02a2 -//.word 0xa90debe0 -//.word 0x438ad540 -//.word 0x03df4eac -//.word 0x854e657f -//.word 0x013cb481 -//.word 0x6fd09d19 -//.word 0xefbdd3be -//.word 0x675c1caf -//.word 0x6efe56e4 -//.word 0x6980b844 -//.word 0xf3205b18 -//.word 0x838ef9c0 -//.word 0x4847f4a4 -//.word 0x581e9a6e -//.word 0x0a1ba777 -//.word 0xa0890b7e -//.word 0x2a4beea0 -//.word 0xa76ff284 -//.word 0x6c06b8d7 -//.word 0xca32a5f8 -//.word 0xeb80e6f4 -//.word 0xfd78b1b4 -//.word 0x9273ce75 -//.word 0x47ad5779 -//.word 0xa49bbcfc -//.word 0x447f096a -//.word 0x36396ccf -//.word 0xa260f28f -//.word 0xb0919157 -//.word 0xa5076b53 -//.word 0x506c51a2 -//.word 0xa4ef8607 -//.word 0xa697c6e1 -//.word 0x8ad7875d -//.word 0x18627fea -//.word 0x554066ed -//.word 0x6022fdb6 -//.word 0x9af34fb3 -//.word 0x09af37e4 -//.word 0xff78228f -//.word 0xf6e71635 -//.word 0xbfa0f4c4 -//.word 0xdc29fa0e -//.word 0x2afc8b7a -//.word 0xc3da33fa -//.word 0x2263e63d -//.word 0x88e48825 -//.word 0x9f70b37b -//.word 0x5d32b4e2 -//.word 0x2c01d609 -//.word 0x4835e425 -//.word 0x68b9e99f -//.word 0xa0623a09 -//.word 0x867fb657 -//.word 0x94b24d4c -//.word 0xcdfebf32 -//.word 0xa320a6ce -//.word 0x1923b793 -//.word 0x252f4516 -//.word 0x58a206c2 -//.word 0xc0611acd -//.word 0x0e71496a -//.word 0xf4c18d41 -//.word 0xd14ad01c -//.word 0x905af6e3 -//.word 0xcd2d1eca -//.word 0x3abe25c9 -//.word 0x42dc6c4d -//.word 0xec80dc2d -//.word 0x015e27df -//.word 0x71ba50ec -//.word 0xf37d6da1 -//.word 0xec88ac07 -//.word 0x92489416 -//.word 0x518b8d26 -//.word 0x6e92a3a6 -//.word 0xea678710 -//.word 0xa971d61c -//.word 0xd3459e35 -//.word 0x7bbf1f29 -//.word 0x7e52ce24 -//.word 0xae9ca0df -//.word 0x303d8415 -//.word 0x23ea3137 -//.word 0x82bd2360 -//.word 0x4ccfe08b -//.word 0xe2098004 -//.word 0xb0376c1c -//.word 0x0f5e6621 -//.word 0x6a50ca8d -//.word 0xa07d137e -//.word 0xaa0ca066 -//.word 0x7e2bb904 -//.word 0x33a3cd93 -//.word 0x65affd41 -//.word 0xdb0edfe2 -//.word 0x67577be6 -//.word 0x0e8d9a88 -//.word 0x69f34149 -//.word 0x4b21789d -//.word 0xa5584fe4 -//.word 0xa613239b -//.word 0x26de1ed4 -//.word 0x446bfde3 -//.word 0x4ee3165b -//.word 0xe27a9939 -//.word 0x5346165e -//.word 0x4e513f43 -//.word 0xbeedf0e8 -//.word 0xec476c0d -//.word 0xeb3feaa5 -//.word 0x33775088 -//.word 0x8caa3e68 -//.word 0x2e404e06 -//.word 0x261f9aa5 -//.word 0xfbc37fbf -//.word 0x9291a1f8 -//.word 0x4f682f50 -//.word 0x7d7a699c -//.word 0xf05a5f37 -//.word 0xe855fbf5 -//.word 0x39064158 -//.word 0xa925d607 -//.word 0x9aa0bf7b -//.word 0xe9ed6cfc -//.word 0x159ef5cc -//.word 0xa436a3a2 -//.word 0xc23bb259 -//.word 0x2c8c55ea -//.word 0x4cf5fb98 -//.word 0xa501d16a -//.word 0x720f88de -//.word 0x8aa858dc -//.word 0x871045e9 -//.word 0x271ba19d -//.word 0xf342d257 -//.word 0x1ef6552f -//.word 0xaf35032c -//.word 0xe35a93b8 -//.word 0xcc396150 -//.word 0x3f6b6d80 -//.word 0xede7a70f -//.word 0xd0d26a77 -//.word 0xc9994697 -//.word 0x873c02ac -//.word 0xaaede17e -//.word 0x28d925d7 -//.word 0xf046d239 -//.word 0xcedeb4d0 -//.word 0x8f4aa3a6 -//.word 0x65030616 -//.word 0x8d659683 -//.word 0x2e06654a -//.word 0x85451ef4 -//.word 0x3f268eb1 -//.word 0x265d6302 -//.word 0x00a834b5 -//.word 0xb462c216 -//.word 0xaf567e64 -//.word 0x86d14b82 -//.word 0xddfb84ef -//.word 0x876641f8 -//.word 0xefe8d62c -//.word 0xb6a69d11 -//.word 0x9d72f615 -//.word 0xa6578bc7 -//.word 0x7671d947 -//.word 0xfe02ecfb -//.word 0x5ac36984 -//.word 0xf978d2f1 -//.word 0xffc70632 -//.word 0xe74a07cf -//.word 0x6de300da -//.word 0xab508722 -//.word 0x82ff1fa9 -//.word 0x3b230158 -//.word 0x6e071cf2 -//.word 0x23a25a47 -//.word 0x386d25aa -//.word 0x03712aa4 -//.word 0x37a45cea -//.word 0x0c753c8d -//.word 0x9aa65871 -//.word 0x865a1200 -//.word 0xe16fa31f -//.word 0x4d0d6061 -//.word 0x627f3b7b -//.word 0x50428cf9 -//.word 0xc55c122f -//.word 0x11ef3471 -//.word 0x880e8d87 -//.word 0x27cfa85b -//.word 0x7ba208f5 -//.word 0xbfe16ca9 -//.word 0x45a8518f -//.word 0x17e6b734 -//.word 0xddb4288f -//.word 0x01e6f737 -//.word 0x12e0c6d3 -//.word 0x66ac4ad1 -//.word 0x0449535b -//.word 0xc0450686 -//.word 0xa88e6dcd -//.word 0x9f8533bf -//.word 0x4854a8f4 -//.word 0x26810b45 -//.word 0x01c4093c -//.word 0x8b1681ca -//.word 0x430b8a38 -//.word 0x9a61b760 -//.word 0x54d99a1d -//.word 0x32458600 -//.word 0xcee39945 -//.word 0xc6e9fa05 -//.word 0x1c6160ad -//.word 0xdd37d4ae -//.word 0x0191b776 -//.word 0x935e06a0 -//.word 0x1232dd67 -//.word 0x16513a61 -//.word 0x360a046a -//.word 0x2a464cdd -//.word 0x2d60d20b -//.word 0xa537cbe5 -//.word 0x0682e1fc -//.word 0xf4647cac -//.word 0xa8414093 -//.word 0x94cfd748 -//.word 0x4a70f04a -//.word 0x9abf8737 -//.word 0xfa68673f -//.word 0x2c3eeed7 -//.word 0x1a8711b2 -//.word 0x059a9fed -//.word 0xdeadca8a -//.word 0xf4e8e31f -//.word 0xd0be65cf -//.word 0x5d7c357a -//.word 0x4d222831 -//.word 0xb773c6ed -//.word 0x05484e80 -//.word 0x0d29facb -//.word 0x7e1e8332 -//.word 0x7ec3e84d -//.word 0x919b6ce0 -//.word 0xbda6dd0e -//.word 0xec361cc9 -//.word 0x91feda8d -//.word 0x8e6ca04e -//.word 0x563912af -//.word 0x4e3e7474 -//.word 0x7a896d3a -//.word 0x55b00b65 -//.word 0x0065085b -//.word 0x9f4b4cf0 -//.word 0x0108b220 -//.word 0x7f9c0f04 -//.word 0x26f171ff -//.word 0x18b2a439 -//.word 0x2f61fb4e -//.word 0xe4a44c47 -//.word 0x6fe03dc9 -//.word 0x3009be8c -//.word 0x4eb9d70f -//.word 0x9e7fa48a -//.word 0xc6799e25 -//.word 0xa2251b67 -//.word 0xe67419f1 -//.word 0x0520376c -//.word 0x524004c0 -//.word 0x651a7c86 -//.word 0xc138d0c1 -//.word 0xb4be66c8 -//.word 0x7efa2187 -//.word 0xb53de2e7 -//.word 0xe7e94f8b -//.word 0x82ccd3bd -//.word 0xf1ace5a8 -//.word 0x08238ec7 -//.word 0xa2ae259d -//.word 0x88005ea7 -//.word 0x959c838f -//.word 0x18a200a2 -//.word 0x7ae92584 -//.word 0x214f2822 -//.word 0x934d69e9 -//.word 0xdfcffa36 -//.word 0x39425f0d -//.word 0xe4ee920d -//.word 0x55864ba3 -//.word 0x95fd7d7f -//.word 0xe79c2444 -//.word 0xab523e84 -//.word 0x824b17eb -//.word 0xb3c3caba -//.word 0xcd1d0577 -//.word 0x8e2f0ce3 -//.word 0x04e1012d -//.word 0xf2f66265 -//.word 0x7529d333 -//.word 0xe77c1ec9 -//.word 0x04cd7816 -//.word 0x4baa063d -//.word 0xa7669f45 -//.word 0x4f6cd412 -//.word 0xebd42d94 -//.word 0xf834b63e -//.word 0x6db9baba -//.word 0x9f76cfdb -//.word 0x62fb12d3 -//.word 0x712ab4a6 -//.word 0x1046b6de -//.word 0xef4df081 -//.word 0x52885840 -//.word 0x6f6081f1 -//.word 0x1773623f -//.word 0x99e759a0 -//.word 0xe4fe7088 -//.word 0xebebdedd -//.word 0x4ee5d1aa -//.word 0x36796a17 -//.word 0x80240999 -//.word 0x1f21cc66 -//.word 0xbb80522c -//.word 0x9e78c502 -//.word 0xd1fe179f -//.word 0x82968bc9 -//.word 0xa96a7811 -//.word 0xec994abe -//.word 0xbfd1c907 -//.word 0xcf209e85 -//.word 0xa10712e7 -//.word 0x76d11ae8 -//.word 0x7322917e -//.word 0xfed3c454 -//.word 0x6bfd337b -//.word 0xd854965d -//.word 0x55b71ff2 -//.word 0x4905ff36 -//.word 0x11312bda -//.word 0xe9996039 -//.word 0x1093648f -//.word 0x27499065 -//.word 0xdac88b50 -//.word 0xc35358db -//.word 0x8bfd93c2 -//.word 0x5377f761 -//.word 0x5226246b -//.word 0xbf789fdf -//.word 0xf1791b38 -//.word 0xc5a1f7e5 -//.word 0x40f007f8 -//.word 0x753e9722 -//.word 0xa9ccaddf -//.word 0xb61e8fee -//.word 0xad0d8504 -//.word 0xbf18e0c1 -//.word 0x5efb3be3 -//.word 0x9f8301ba -//.word 0xe3a030dc -//.word 0xb6bc5c19 -//.word 0xf74bf6b1 -//.word 0x3aa3cec5 -//.word 0x6a0ed70c -//.word 0xb31e2ac7 -//.word 0x9e414ef7 -//.word 0x7e95b7cd -//.word 0x0cfe8c62 -//.word 0x4e75aea8 -//.word 0xbda3f5a1 -//.word 0xa6aebdce -//.word 0xd153a1eb -//.word 0x613586d9 -//.word 0xfb74dcdc -//.word 0x2a822006 -//.word 0x0232a5f3 -//.word 0x041295b7 -//.word 0x42fb3215 -//.word 0xc4e662f2 -//.word 0x29016b08 -//.word 0x9103fbdf -//.word 0xbbbc6bf9 -//.word 0x6bf0444d -//.word 0x0f6503f8 -//.word 0xa13b192e -//.word 0xcf7c3676 -//.word 0x5af4c717 -//.word 0xbc43becd -//.word 0x0d3091c1 -//.word 0x274085b8 -//.word 0x09882c8b -//.word 0x79bf2cd7 -//.word 0xee9743f5 -//.word 0xac4d882d -//.word 0x317ff426 -//.word 0xd03f20a1 -//.word 0x9c655067 -//.word 0x8729b180 -//.word 0xcbf1dfa6 -//.word 0x8967aafa -//.word 0xb0cf1af5 -//.word 0x2198b1a0 -//.word 0x1130ef08 -//.word 0xae1d1cec -//.word 0x054a41ba -//.word 0x239e78ba -//.word 0x7ad36588 -//.word 0x878605c7 -//.word 0xb28aa614 -//.word 0x76823739 -//.word 0xc1afc2a3 -//.word 0x9e063717 -//.word 0x11866ba0 -//.word 0x42c860cc -//.word 0xded8c717 -//.word 0xbb43c3a8 -//.word 0xbb71f03b -//.word 0xf235a45f -//.word 0x0ba375e1 -//.word 0xe722fb88 -//.word 0x88c2d702 -//.word 0x2ecff31f -//.word 0xbfa60c3d -//.word 0x6cc76e04 -//.word 0x922cff53 -//.word 0xded97f79 -//.word 0xb5b50ea9 -//.word 0xd398efa8 -//.word 0x32a58bc9 -//.word 0x2ddab91b -//.word 0xe5e53ce1 -//.word 0xe4398d42 -//.word 0x0062dc42 -//.word 0x829551f1 -//.word 0x888c97e2 -//.word 0xa8919bdf -//.word 0xd6d891db -//.word 0x88113928 -//.word 0x183e60eb -//.word 0x69c2a9cc -//.word 0xcdbb8df2 -//.word 0x2692a12e -//.word 0x4cd11776 -//.word 0xaf348896 -//.word 0x3e02f122 -//.word 0x879dfbaf -//.word 0x1f587f42 -//.word 0x448a4909 -//.word 0xc1e11c49 -//.word 0x12f8f798 -//.word 0xc92b974c -//.word 0x30aa3d33 -//.word 0x30ccb185 -//.word 0x71a68716 -//.word 0xc3dda1d0 -//.word 0xbdb8f561 -//.word 0xa3799031 -//.word 0x8deedb97 -//.word 0xc6431e4c -//.word 0x731a4220 -//.word 0x75dddbeb -//.word 0x905366c7 -//.word 0xcc72ce7c -//.word 0x1b75363c -//.word 0x3d2ef291 -//.word 0xe19cd693 -//.word 0x0dc0b45e -//.word 0xbfad20c3 -//.word 0xd5df763e -//.word 0x2acd1f28 -//.word 0x02c10f2e -//.word 0xa8e89202 -//.word 0x55a54950 -//.word 0x542b6ff4 -//.word 0x644b616a -//.word 0x5e8a5e86 -//.word 0x17778b65 -//.word 0x883c3aa3 -//.word 0x2c726bce -//.word 0xaa3a931b -//.word 0xb4899d58 -//.word 0x2fc32f22 -//.word 0x948c2e58 -//.word 0x96db84d0 -//.word 0x054f2148 -//.word 0xf2c73f9f -//.word 0x142deb45 -//.word 0x6a92c1f0 -//.word 0x2280f790 -//.word 0xba8b9d86 -//.word 0x652a2210 -//.word 0xb0c51b08 -//.word 0x650f40cf -//.word 0xaf96b784 -//.word 0x80999679 -//.word 0x3019a3e7 -//.word 0x67325ee0 -//.word 0x3cac4186 -//.word 0x9ece467b -//.word 0xf372aa98 -//.word 0x005ff0e2 -//.word 0x09d22ab9 -//.word 0x395e7453 -//.word 0x44f6c169 -//.word 0x4a49da30 -//.word 0xff4ea38b -//.word 0x091fa07f -//.word 0xa90ab9e7 -//.word 0x9ee53a69 -//.word 0x46a31ea8 -//.word 0x07258dbb -//.word 0xed52a3df -//.word 0x946a7368 -//.word 0x49974cfe -//.word 0x6cc63b05 -//.word 0x18b4d05d -//.word 0x074c254c -//.word 0xaf301db8 -//.word 0xb196ea9a -//.word 0x7455d2af -//.word 0x0d3f3271 -//.word 0x63b2c345 -//.word 0x906a1cf6 -//.word 0x8a997862 -//.word 0x023aba73 -//.word 0x8ca2ae51 -//.word 0x015892d6 -//.word 0x2126d543 -//.word 0x7d701e31 -//.word 0x95c590ca -//.word 0x3db44d38 -//.word 0x45e1385e -//.word 0x585800c6 -//.word 0x25205adb -//.word 0xbd148d59 -//.word 0x3cee3401 -//.word 0xaca53f91 -//.word 0x26f93cf3 -//.word 0x3a4bd5b5 -//.word 0x92b399b9 -//.word 0xd14dff2e -//.word 0xc1d3a7be -//.word 0xae71e409 -//.word 0x0dd47853 -//.word 0x62859e79 -//.word 0x60754e2a -//.word 0x51d9bc53 -//.word 0xb83722db -//.word 0x35c1bf91 -//.word 0xaae31f63 -//.word 0x9c189ed0 -//.word 0xdc0128a0 -//.word 0x66b842d2 -//.word 0x89624ed6 -//.word 0x48030afc -//.word 0x01975b2d -//.word 0x4c5e49d9 -//.word 0x26774a30 -//.word 0x4fb0c395 -//.word 0xf09dcc4f -//.word 0x81e73482 -//.word 0xeae7c45e -//.word 0xe873c897 -//.word 0xb3f8cc15 -//.word 0xdec9a4ec -//.word 0x7eb7af8e -//.word 0x8ee25c40 -//.word 0x92cfecca -//.word 0x7bba7a73 -//.word 0xcb2d392c -//.word 0xf9d1fe0c -//.word 0x1785fefc -//.word 0xb2add8b4 -//.word 0xfaccd6e6 -//.word 0x22566fb8 -//.word 0x0abf1178 -//.word 0x1cd81e8b -//.word 0x745b35a7 -//.word 0x43c4b243 -//.word 0x7563784b -//.word 0x91b0ee17 -//.word 0xe1de479e -//.word 0xd4b307e7 -//.word 0xa096c2c1 -//.word 0x2bea27b4 -//.word 0x2c9a3e37 -//.word 0x8df5ee23 -//.word 0x15bdc268 -//.word 0x437aedff -//.word 0x7d148b20 -//.word 0x6aa129b4 -//.word 0x9c7c880d -//.word 0x72979ed5 -//.word 0x3c12de44 -//.word 0xa10cb996 -//.word 0x3eb965bd -//.word 0x90b4dd53 -//.word 0x149729d2 -//.word 0xaccadf07 -//.word 0x4598eac4 -//.word 0xb7888ad6 -//.word 0xecea9c36 -//.word 0x45b01c84 -//.word 0x397fe8b0 -//.word 0x4006c6fb -//.word 0xef8fa91e -//.word 0x64d330c8 -//.word 0xe413704e -//.word 0xc364f39e -//.word 0x844b0076 -//.word 0x42891dd3 -//.word 0x4f38d3ab -//.word 0x1a17b1de -//.word 0x5623946b -//.word 0x586725df -//.word 0xc114a214 -//.word 0x5ed4e217 -//.word 0x4c5c936a -//.word 0x6040c76c -//.word 0xc50caf15 -//.word 0xe790a5e6 -//.word 0x907b7020 -//.word 0x512cc435 -//.word 0x24c4097c -//.word 0x4f805d28 -//.word 0x8c46dc7b -//.word 0x667d1f37 -//.word 0xe6220256 -//.word 0x6f18abfa -//.word 0xe7c0c8a7 -//.word 0x17ca17b0 -//.word 0x554b2cef -//.word 0x600f6fb9 -//.word 0x8b306411 -//.word 0x1ee72f1c -//.word 0xf9a357d6 -//.word 0x7a58ca02 -//.word 0xa11a2167 -//.word 0x72ea2639 -//.word 0x9bd093d6 -//.word 0x572a1db3 -//.word 0x9243b195 -//.word 0x4e27fe04 -//.word 0x45b633fc -//.word 0xd0f80ae7 -//.word 0x07b005c8 -//.word 0x2a34f7b9 -//.word 0x407bc797 -//.word 0xfd7871fc -//.word 0xe9a64d6d -//.word 0xbfe594d5 -//.word 0x13842032 -//.word 0x389f738f -//.word 0x61abfb32 -//.word 0x064f9516 -//.word 0x8a754f9c -//.word 0x1aa2727d -//.word 0xd882c003 -//.word 0x39c8fa79 -//.word 0xab35a5e0 -//.word 0x7cf50ee3 -//.word 0xf7328c0d -//.word 0xd0e4053a -//.word 0xc2e6b34b -//.word 0x764f281e -//.word 0xa7ff90be -//.word 0x847837d6 -//.word 0x55f04b6c -//.word 0x62a4e2cb -//.word 0x106e3ec1 -//.word 0x4e9a500b -//.word 0x2ff67c0e -//.word 0xd8289cc8 -//.word 0x9d444705 -//.word 0x679e53d6 -//.word 0x59dd983f -//.word 0xb351f730 -//.word 0xf6879cb6 -//.word 0x491a7f73 -//.word 0x1bcb314c -//.word 0x0ad4d561 -//.word 0x037a6c42 -//.word 0xabe25760 -//.word 0xfe2516c1 -//.word 0x36a656f8 -//.word 0xefa42b55 -//.word 0x880b9a59 -//.word 0xcc905a6c -//.word 0xd2fcdbd2 -//.word 0x21c888dc -//.word 0x18eb4a5b -//.word 0x8ef04d5a -//.word 0xb54b060d -//.word 0x44ed7504 -//.word 0xd516a7a4 -//.word 0x8b6b80d8 -//.word 0xf948b704 -//.word 0x3f57223b -//.word 0x766234b1 -//.word 0x4f65c473 -//.word 0xf6e80f55 -//.word 0x3d8b012c -//.word 0xf6e3b03e -//.word 0xa0842af7 -//.word 0x475f70de -//.word 0xa54fc2c7 -//.word 0x8dee1d49 -//.word 0x8aad0372 -//.word 0xc3247aba -//.word 0x21a65736 -//.word 0xb419bc0e -//.word 0x5304e031 -//.word 0x83ea0e47 -//.word 0x9bd7f1e8 -//.word 0x25380e0b -//.word 0x86ef92c1 -//.word 0xe2a74e23 -//.word 0x3a650088 -//.word 0xd760d4fc -//.word 0xec132aee -//.word 0x77909a29 -//.word 0x68173506 -//.word 0x05e70edf -//.word 0x8d54fac6 -//.word 0x1b1a9377 -//.word 0xcef1838c -//.word 0x2762fff0 -//.word 0xb2d89196 -//.word 0xe9fa1b6b -//.word 0x55381989 -//.word 0xf6a426ad -//.word 0xe504c2eb -//.word 0x382552a0 -//.word 0x267268a9 -//.word 0x6cc445d2 -//.word 0xee7c9c91 -//.word 0xa2d099f5 -//.word 0xaa6222d9 -//.word 0xc0800000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x0000F868 -//// expected output -//.word 0x06b3fe00 -//.word 0xa2c681db -//.word 0xc14f6e81 -//.word 0xae1e7add -//.word 0xedeeaaf4 -//.word 0xc7485d28 -//.word 0xbeed0b52 -//.word 0xd128cb9e -//.word 0x7b295838 -//.word 0xdad38405 -//.word 0x4a826cd3 -//.word 0x16fe20b8 -//.word 0xea1aa35d -//.word 0xe2b39ae6 -//.word 0x12342dd1 -//.word 0x911212d9 -//// SHA512LongMsgvector_80 -//// vector length -//.word 0x0000FB80 -//// input message -//.word 0x20e0a773 -//.word 0x19b72144 -//.word 0x235b24a9 -//.word 0xec5c53c5 -//.word 0xd816e9fc -//.word 0x8e285804 -//.word 0xb727303f -//.word 0x02934148 -//.word 0x6c0904cc -//.word 0xbebb379b -//.word 0x571ec8fe -//.word 0x2be2f44c -//.word 0x0c27b0b8 -//.word 0x29ee486d -//.word 0xd4cd46dd -//.word 0x88e89555 -//.word 0x2a1ce6d5 -//.word 0x8f7d5320 -//.word 0x3f03420f -//.word 0x78808d2a -//.word 0x76d5e079 -//.word 0xf2666298 -//.word 0xe9cb970a -//.word 0x9ec985cf -//.word 0xe2801539 -//.word 0x93e5bdfb -//.word 0x63735c83 -//.word 0xda1e658a -//.word 0x9f8940e9 -//.word 0xf378edae -//.word 0x7e88eb6f -//.word 0x4e1e58de -//.word 0x1d9d599e -//.word 0xd2dcbc55 -//.word 0x4bd7dc03 -//.word 0x5aa4c592 -//.word 0x0da999ae -//.word 0x330d33d6 -//.word 0x1b6c09b3 -//.word 0x9fcf57a9 -//.word 0x61db7aad -//.word 0x55489956 -//.word 0x80958b36 -//.word 0xfffaf56a -//.word 0x4a9fb370 -//.word 0xba0b7a39 -//.word 0x49dfbb7f -//.word 0x9ac4ca59 -//.word 0x39a23f0d -//.word 0x23139d25 -//.word 0x891731c5 -//.word 0xd1093d3b -//.word 0xded156d8 -//.word 0x915c0bfe -//.word 0x8f49c77b -//.word 0x45e5f915 -//.word 0x2a5a7166 -//.word 0x44230deb -//.word 0xeec39657 -//.word 0xd8b7e52d -//.word 0x4fa94a8d -//.word 0xbfe62e4e -//.word 0x7612f64e -//.word 0xaa1b2b06 -//.word 0xbe6bd862 -//.word 0xc16234cf -//.word 0x38038195 -//.word 0x1ded3467 -//.word 0x278d5638 -//.word 0x4c932a51 -//.word 0x85a210a1 -//.word 0xd14ca954 -//.word 0x7c3d3ca7 -//.word 0xa1b659fa -//.word 0xee3ebc26 -//.word 0xa7947312 -//.word 0xede74481 -//.word 0x4149492e -//.word 0x4462dd1b -//.word 0xc061bc26 -//.word 0xec3865dd -//.word 0xec09c393 -//.word 0x98db0db4 -//.word 0x7e92eb55 -//.word 0x2a1eda0f -//.word 0xa5f2d10e -//.word 0x3bb82565 -//.word 0x8143aaa4 -//.word 0x97c51bad -//.word 0xab42bbc3 -//.word 0xbe443de4 -//.word 0xabd1e159 -//.word 0x659ae18b -//.word 0x80750b18 -//.word 0xf30daf26 -//.word 0x1cd8bbf8 -//.word 0x044a25bf -//.word 0xe54989b2 -//.word 0xe9e01460 -//.word 0x3537a045 -//.word 0x26c3209c -//.word 0xdaba3f75 -//.word 0xf3ca4407 -//.word 0x970a3947 -//.word 0xbb314cba -//.word 0xa2067587 -//.word 0xa01759d0 -//.word 0x24ae6f42 -//.word 0xf60161eb -//.word 0xbca9b54c -//.word 0xc355acb0 -//.word 0xfcc06abc -//.word 0x45e05846 -//.word 0xea61c76b -//.word 0x6c51d6db -//.word 0x811d9578 -//.word 0x5bbc6a20 -//.word 0x2d2ab4c6 -//.word 0xec18afc8 -//.word 0x53e2987c -//.word 0x29c1110c -//.word 0xc642c685 -//.word 0xd4f6512a -//.word 0x536b5b0e -//.word 0xdf5c04e2 -//.word 0x3625850b -//.word 0xf57914f8 -//.word 0xa25709b2 -//.word 0xef3a3eb4 -//.word 0x3d91bbfe -//.word 0x606e9365 -//.word 0xa282092d -//.word 0x0a49f7d9 -//.word 0xde827142 -//.word 0x66e2a5e7 -//.word 0xf3090584 -//.word 0x20b5a9e6 -//.word 0x5836eefd -//.word 0x98226433 -//.word 0x7649e7fc -//.word 0x63eb0bae -//.word 0x2d29be94 -//.word 0xc8ba283d -//.word 0x4ddfd61a -//.word 0x43991849 -//.word 0x1e19a7ab -//.word 0x05788b3c -//.word 0xd8a83ca4 -//.word 0x72ab0809 -//.word 0x2b02b428 -//.word 0xa16966a4 -//.word 0xb9c1c39d -//.word 0xe04e5485 -//.word 0x97222e2f -//.word 0x2ed9d229 -//.word 0xcf87524c -//.word 0xbfefb591 -//.word 0xe1f69d27 -//.word 0x7c5727c2 -//.word 0x3d971335 -//.word 0x803c2543 -//.word 0xcb3acab2 -//.word 0x9baeffa2 -//.word 0x64ce6f1d -//.word 0xd320dbef -//.word 0x56ebbfb8 -//.word 0xdeec333f -//.word 0xe4490f09 -//.word 0xaacb522b -//.word 0xc347c55c -//.word 0xd55ddb4e -//.word 0x9e65dc3f -//.word 0x35a742cb -//.word 0x92ca6404 -//.word 0x519051c4 -//.word 0xb3c0ff42 -//.word 0xe663a5e4 -//.word 0x86326554 -//.word 0x63502ed6 -//.word 0x8535e1d9 -//.word 0x6deab2cb -//.word 0x9e7cd232 -//.word 0x5cab4bf9 -//.word 0xb4e22b07 -//.word 0xbc6ce417 -//.word 0x1ce4f3c3 -//.word 0xcdedc0e1 -//.word 0x2124c513 -//.word 0x0453f39a -//.word 0x81e8516b -//.word 0x88a5e785 -//.word 0xee98da81 -//.word 0xb54ed86b -//.word 0x8e44b6d0 -//.word 0x9c9e5818 -//.word 0x7b1bd216 -//.word 0x8149ccde -//.word 0x43f52bd7 -//.word 0x5be6ee11 -//.word 0x69cb55d8 -//.word 0x58714989 -//.word 0xe339f8a4 -//.word 0x57cac023 -//.word 0x9a034e0a -//.word 0x6c330740 -//.word 0xed8da69d -//.word 0x5fd62744 -//.word 0x2e61e533 -//.word 0x2d3dff18 -//.word 0x23adff66 -//.word 0x86d8bea9 -//.word 0x86c28217 -//.word 0x4e7b6a67 -//.word 0x86970ce6 -//.word 0x1cdd5cc7 -//.word 0x4444d0ba -//.word 0xbd1bc1c1 -//.word 0x5687153f -//.word 0xb2321b52 -//.word 0x4842b663 -//.word 0xad88befc -//.word 0x16faa3d9 -//.word 0x19645341 -//.word 0xb35a5e97 -//.word 0x8f71582c -//.word 0x85af8057 -//.word 0x623f9ec8 -//.word 0xe7693219 -//.word 0x14c2caa6 -//.word 0xa6a0b49f -//.word 0xded1d55b -//.word 0x848dd9ef -//.word 0x2ca88d00 -//.word 0xb80c88d5 -//.word 0x1e6711b0 -//.word 0x6b213d5f -//.word 0x0891580e -//.word 0x3c70865f -//.word 0xf38eaabd -//.word 0xbec387ed -//.word 0x1a2926e5 -//.word 0xf58877e2 -//.word 0x6e123ab5 -//.word 0xdd51205d -//.word 0x135d2edb -//.word 0xe3526342 -//.word 0xe1019a0e -//.word 0x69e6b2b6 -//.word 0xe35beb85 -//.word 0x460a93a5 -//.word 0xdba8e37d -//.word 0x44e1243d -//.word 0xbc8e15b6 -//.word 0xa02e9170 -//.word 0x2f946df6 -//.word 0x8edda075 -//.word 0x0ea5a685 -//.word 0xb27b2647 -//.word 0xec91d2b0 -//.word 0xa8b88e24 -//.word 0x8b8cd547 -//.word 0x7dec5910 -//.word 0x65aeea1f -//.word 0x33909950 -//.word 0x24711d90 -//.word 0x41c176ef -//.word 0x2a36d0f7 -//.word 0x11c0a93c -//.word 0x09c03635 -//.word 0x8175034a -//.word 0x0bb6db2e -//.word 0x63e7e76f -//.word 0xac26194c -//.word 0xfcc5ccc6 -//.word 0x1bfda4fa -//.word 0x88e0bcad -//.word 0xbd900029 -//.word 0xb4afd748 -//.word 0xaa1606ce -//.word 0x23cad1fb -//.word 0x2e2b6261 -//.word 0xea6f6ff4 -//.word 0x494f1860 -//.word 0x14000e9f -//.word 0x3065faca -//.word 0x1f831d2f -//.word 0xc93533a5 -//.word 0x7d219e1c -//.word 0x33eac078 -//.word 0x14a8a9a0 -//.word 0x3c95f2d1 -//.word 0xbe08e839 -//.word 0xe8a8eec1 -//.word 0xc9d91c2a -//.word 0xf17b2c5b -//.word 0x78d497f9 -//.word 0x42cafb39 -//.word 0x8056c0f2 -//.word 0x7a35fbf7 -//.word 0x8de192a3 -//.word 0x6fbfa2b5 -//.word 0xbb9a1d5e -//.word 0xa950b899 -//.word 0x1ccb04bb -//.word 0xe333da4b -//.word 0x3862fd13 -//.word 0x8d99fb77 -//.word 0x89715406 -//.word 0x4d14de4f -//.word 0xfbac68f6 -//.word 0x791c9e07 -//.word 0x72ef2d89 -//.word 0x9e8d2757 -//.word 0x44b5a82b -//.word 0xfd27bafc -//.word 0xbaa1768a -//.word 0x080d6c37 -//.word 0x93f94518 -//.word 0xe947a74c -//.word 0x8126598c -//.word 0xfc41a804 -//.word 0xaa360961 -//.word 0x5049ff2c -//.word 0x295a3f56 -//.word 0x2a141314 -//.word 0x8a68fced -//.word 0x82399b10 -//.word 0x5259d1ec -//.word 0x84b526fb -//.word 0x74cc67de -//.word 0x106693af -//.word 0xdd82f993 -//.word 0x3b909a8e -//.word 0xe9e0d49c -//.word 0xcb5b42fd -//.word 0xeb71ded0 -//.word 0xbf5268e3 -//.word 0xaa610cca -//.word 0xc4e53f2e -//.word 0xde02ea68 -//.word 0xc1e9ca4e -//.word 0xb74b164d -//.word 0x4d1363b9 -//.word 0x5654c660 -//.word 0x33803865 -//.word 0x52dc3e4c -//.word 0xf530c951 -//.word 0x35c35afe -//.word 0x46866bfc -//.word 0xfc900b2a -//.word 0x8ecac8ec -//.word 0x9becd1c6 -//.word 0x6aa85c29 -//.word 0x7624468c -//.word 0x2aaef9bf -//.word 0xe9ac937c -//.word 0x51d14540 -//.word 0xc197f858 -//.word 0x18e9373f -//.word 0xc01f4927 -//.word 0xec309dd6 -//.word 0x1d236cb3 -//.word 0xebc79921 -//.word 0x02a4dc0b -//.word 0x6b311fc0 -//.word 0x0d482802 -//.word 0x73d67959 -//.word 0xcfd774ae -//.word 0x3f82c314 -//.word 0x50c0f7e9 -//.word 0xc1e36f1e -//.word 0x89957cd3 -//.word 0x1a0ec227 -//.word 0xe88be24e -//.word 0x25fb56e4 -//.word 0xcffb9c80 -//.word 0xed04968d -//.word 0x16e33155 -//.word 0x326a455f -//.word 0x8566bcfb -//.word 0xe9d1f71b -//.word 0x5a486d64 -//.word 0xb8bf9585 -//.word 0xc97307c8 -//.word 0x7e20dee6 -//.word 0x77746020 -//.word 0xc8c4e18b -//.word 0xfeffe4ac -//.word 0x5de08444 -//.word 0x6c67126d -//.word 0xb48900e6 -//.word 0xc427fdac -//.word 0x783d62ca -//.word 0x7b5ccd71 -//.word 0x0b5a0b4b -//.word 0xfc483c0d -//.word 0x00a4314c -//.word 0x25d01991 -//.word 0x9fc35daf -//.word 0xc8ffc854 -//.word 0x65c2ebdf -//.word 0x2b81c071 -//.word 0x82928d47 -//.word 0x88290b47 -//.word 0x5985c8d8 -//.word 0x8e6bcaf7 -//.word 0x03d47588 -//.word 0xdee3afe9 -//.word 0xcc1941cd -//.word 0x8ecc8048 -//.word 0xb5d52e26 -//.word 0xa98a9b81 -//.word 0xf0ec0f93 -//.word 0xad216cc8 -//.word 0x67241017 -//.word 0x0cbbf993 -//.word 0x36a92c3d -//.word 0xac25571d -//.word 0x2c8cb591 -//.word 0x685332e4 -//.word 0x4e3fd022 -//.word 0x8cd8492b -//.word 0x541bf607 -//.word 0x5c6fef79 -//.word 0x2ada74d7 -//.word 0x8e758b18 -//.word 0x701deb2f -//.word 0xcb6c1998 -//.word 0xfae7d130 -//.word 0x3379a749 -//.word 0x5121eefe -//.word 0xd6e7d9c4 -//.word 0x3014e042 -//.word 0x3ba26563 -//.word 0x08f298a9 -//.word 0xddbd98c4 -//.word 0x7c4ddb63 -//.word 0xa8edcf4a -//.word 0xe69ec1a4 -//.word 0x810bff9b -//.word 0xd0bf3927 -//.word 0xbb962d23 -//.word 0x7c7184a6 -//.word 0xa32ef690 -//.word 0x5dd8b563 -//.word 0xf51a0955 -//.word 0x9bfa37a3 -//.word 0x65c4a827 -//.word 0x9343472d -//.word 0x17372b83 -//.word 0x550476cf -//.word 0x27a87d25 -//.word 0x24ef29d9 -//.word 0x22ea9d92 -//.word 0xf99d18a0 -//.word 0x8af81d90 -//.word 0x0009d2fd -//.word 0x566fa7a9 -//.word 0x1a1237cc -//.word 0x701173ab -//.word 0x59fcfd6d -//.word 0x3544d22a -//.word 0x87ef2c46 -//.word 0xf990a7fd -//.word 0xa077a23e -//.word 0x8025e8bd -//.word 0x53039044 -//.word 0x86532149 -//.word 0x8566fac6 -//.word 0x380ff145 -//.word 0xcd593b3a -//.word 0xb9758c96 -//.word 0xf9f67e99 -//.word 0x9e4137e8 -//.word 0x883e46df -//.word 0x7254cf28 -//.word 0x2f95e88d -//.word 0x3235420a -//.word 0x54410c27 -//.word 0xd28d1485 -//.word 0x95ef30b6 -//.word 0xb7aadc51 -//.word 0x422d2446 -//.word 0x3bfec570 -//.word 0xdff18f69 -//.word 0x2c9d0da2 -//.word 0xa31068b3 -//.word 0x4dc289ef -//.word 0xfcc87e3c -//.word 0xd34a1f22 -//.word 0x0837f121 -//.word 0xe9374a48 -//.word 0x1de2b603 -//.word 0x2d2f9a35 -//.word 0x432f1786 -//.word 0x31fb31ff -//.word 0xb4eb31d4 -//.word 0xfa084780 -//.word 0x63c47417 -//.word 0x85e9a7d8 -//.word 0x72d02702 -//.word 0x3dd330ea -//.word 0xba04e149 -//.word 0x862056da -//.word 0x47be1125 -//.word 0x35cc9e95 -//.word 0xda3c76d1 -//.word 0x15fb2549 -//.word 0x6523a80f -//.word 0x647119e9 -//.word 0x92f98ea4 -//.word 0x54183eab -//.word 0x3dabe5d8 -//.word 0x8b7e6a89 -//.word 0xf508bff7 -//.word 0xa4550ac3 -//.word 0x7f4302d2 -//.word 0xabf19b5b -//.word 0x5275e53e -//.word 0xa4cd3198 -//.word 0x1c187794 -//.word 0x0507f484 -//.word 0x3c8e1730 -//.word 0x37df9e6d -//.word 0x4698fdf2 -//.word 0x193bff68 -//.word 0x83e0afc0 -//.word 0x7d2679c9 -//.word 0x6e6f8d02 -//.word 0xaa4d84ad -//.word 0x38374624 -//.word 0xd8812b70 -//.word 0x448b6018 -//.word 0xb7388d37 -//.word 0xaca1b4d1 -//.word 0xe80b5d67 -//.word 0xba17f0c9 -//.word 0x8239622c -//.word 0x706b137c -//.word 0x8e23f7f4 -//.word 0x0182f5eb -//.word 0x8cce8cf1 -//.word 0x5522bc1a -//.word 0xec64249a -//.word 0x89786892 -//.word 0x95b3d52a -//.word 0x6c9348e0 -//.word 0x62ad4b20 -//.word 0x04e68214 -//.word 0xa0e646bd -//.word 0x07ca8f43 -//.word 0x91191789 -//.word 0x62fabc05 -//.word 0xeca426cf -//.word 0xb515abf7 -//.word 0x5a076f1c -//.word 0xd520d03a -//.word 0xfb6901c4 -//.word 0x4801f4f3 -//.word 0xdf137e5d -//.word 0xcd05b6c9 -//.word 0x8ef29e42 -//.word 0xd25b056a -//.word 0x8119ab11 -//.word 0xfc96a706 -//.word 0xa63d062d -//.word 0xa32fb5d2 -//.word 0xdf38a13d -//.word 0x52011c87 -//.word 0x838783ac -//.word 0x4bcb1de0 -//.word 0xdccc4727 -//.word 0x01b2ce20 -//.word 0xa84c9d21 -//.word 0x9dbc9889 -//.word 0x9871c752 -//.word 0x7a56b7e6 -//.word 0xd4491d34 -//.word 0xa9cfbd02 -//.word 0x75068a85 -//.word 0x6ddb0f2f -//.word 0x097c0dc8 -//.word 0xc01166c0 -//.word 0x12a739c4 -//.word 0xcc6c4f8f -//.word 0x8822b603 -//.word 0x73ceab78 -//.word 0x53b0be54 -//.word 0xc87830db -//.word 0xd1b7a049 -//.word 0x9394e61e -//.word 0x56c040ba -//.word 0xd1acac29 -//.word 0xa7f99440 -//.word 0x3130b0e9 -//.word 0x7eb329bb -//.word 0x98f3face -//.word 0x09e49ccd -//.word 0x9eaee24c -//.word 0x6ba6225c -//.word 0x0f7c955d -//.word 0x3ab50014 -//.word 0x6c5c94fe -//.word 0xfff513e3 -//.word 0x67b335ad -//.word 0xb9eb4a7b -//.word 0x6ac720f2 -//.word 0x593f27d3 -//.word 0x1045d3d3 -//.word 0x474042a7 -//.word 0xaabc1f5e -//.word 0xdd60c6f3 -//.word 0xbc20a923 -//.word 0xe7b4f27c -//.word 0x7e486ab7 -//.word 0x29759947 -//.word 0x5c702f32 -//.word 0xd981a220 -//.word 0x76b719b1 -//.word 0x20db8914 -//.word 0x20a21dd6 -//.word 0x9d26dcf7 -//.word 0x62978643 -//.word 0xe22ebedf -//.word 0x79636e23 -//.word 0xf56068a7 -//.word 0x55b549a1 -//.word 0xd14da36e -//.word 0x1aa15b6e -//.word 0xe22b4f15 -//.word 0x9f1e3c3f -//.word 0x8c54e0c4 -//.word 0xf1885b4d -//.word 0xa5c5db66 -//.word 0xd11e78d4 -//.word 0xf6a05d28 -//.word 0x32852994 -//.word 0xbfaa95fe -//.word 0xbc445653 -//.word 0x30ce451e -//.word 0x4c46bd59 -//.word 0xf0984482 -//.word 0x715b6ef2 -//.word 0x9abbff6b -//.word 0xf0b650f0 -//.word 0x3a8cf4d9 -//.word 0x41709a26 -//.word 0xd5843514 -//.word 0x10045bee -//.word 0xdfc1eb26 -//.word 0xbdd2f3a4 -//.word 0xc286d15e -//.word 0xdd9d9829 -//.word 0x5eb7b5ce -//.word 0xb70cd261 -//.word 0x835eface -//.word 0xc72cfeb5 -//.word 0x78291878 -//.word 0x3eeccf92 -//.word 0x78e91a2a -//.word 0x80a0c8e7 -//.word 0x30141f07 -//.word 0xa57fc4ab -//.word 0x4244db75 -//.word 0xf8256e55 -//.word 0xc5b613a0 -//.word 0x7b11c963 -//.word 0xc3cc24f6 -//.word 0x6128aad4 -//.word 0xba8b7ca9 -//.word 0x933139ad -//.word 0x1b1e1f31 -//.word 0x2c577377 -//.word 0xce5123c7 -//.word 0xfdaaabbf -//.word 0xac1735eb -//.word 0x099e0496 -//.word 0x030512df -//.word 0x098af80f -//.word 0x15d40f29 -//.word 0xea2ad5c3 -//.word 0x9ae39215 -//.word 0x4a1d3b50 -//.word 0x39b29631 -//.word 0xff689fd5 -//.word 0x13682bcf -//.word 0x90f2cb78 -//.word 0x394ef386 -//.word 0xba065be0 -//.word 0x3152a6b1 -//.word 0xecd442bb -//.word 0x74858fef -//.word 0xcbf0433a -//.word 0xf39e0da1 -//.word 0xafd17890 -//.word 0x8e75136f -//.word 0x2453cf77 -//.word 0x9b88a8c4 -//.word 0x6b3587ab -//.word 0x6579674d -//.word 0xf69cb76c -//.word 0xaa8d007e -//.word 0xef8fc800 -//.word 0x1c2fb60d -//.word 0xb179f72f -//.word 0xe06bdf75 -//.word 0x4daad4c6 -//.word 0x13746874 -//.word 0x07d6c514 -//.word 0x401f4e8e -//.word 0xd7948370 -//.word 0xeb652588 -//.word 0xe8e09bb1 -//.word 0x09e595ed -//.word 0x1c9aefb4 -//.word 0x865fd88c -//.word 0x860533da -//.word 0xbe3a3df8 -//.word 0xef487187 -//.word 0x0400a907 -//.word 0x52f085a5 -//.word 0x1edd1053 -//.word 0x5f6da11e -//.word 0xc62300bc -//.word 0xfc90ca65 -//.word 0x2bc817e5 -//.word 0xbf1459ee -//.word 0x6ee688b2 -//.word 0x75127cb1 -//.word 0x253a9ad0 -//.word 0x9f8ab2ac -//.word 0xdca6282d -//.word 0xf0e1525e -//.word 0x8fb0227c -//.word 0xd05e054d -//.word 0x31010ab2 -//.word 0xdbac4780 -//.word 0x28e6798c -//.word 0x635bea05 -//.word 0xcfd29807 -//.word 0xea5f936c -//.word 0xf2daa7e6 -//.word 0xa98f3b4b -//.word 0x5637792f -//.word 0x0c28afb8 -//.word 0x2ec8f5ae -//.word 0x334711d2 -//.word 0xa78e9771 -//.word 0x72725538 -//.word 0x5d2eed4a -//.word 0xd210c490 -//.word 0xe3721b50 -//.word 0x8fec7c02 -//.word 0x40c8585f -//.word 0x97b6eeba -//.word 0x6cc16e93 -//.word 0x11825f6a -//.word 0xd7943ed1 -//.word 0xd44868c5 -//.word 0xe3993a3e -//.word 0xeb627605 -//.word 0x65cee8c6 -//.word 0x18104a66 -//.word 0x27556696 -//.word 0x4ef77aa9 -//.word 0x69f4e0a2 -//.word 0x369eee92 -//.word 0x5b941c21 -//.word 0xabf0646a -//.word 0xa5c2ef0c -//.word 0x3dbeed7d -//.word 0xe031c5a2 -//.word 0xb23a6e9d -//.word 0x1a361ce7 -//.word 0x807c209e -//.word 0x554b0920 -//.word 0x540010d8 -//.word 0x088cb358 -//.word 0x8f269fa8 -//.word 0x9d3dd3de -//.word 0xc4b103ef -//.word 0xf2423ac5 -//.word 0x3b49c492 -//.word 0xd8a64b63 -//.word 0x70f940f8 -//.word 0x97157dd3 -//.word 0x95b1288f -//.word 0x6861da73 -//.word 0x0cc50047 -//.word 0xf9008266 -//.word 0xee6ca315 -//.word 0xed8d2913 -//.word 0x8643bd72 -//.word 0x594394a4 -//.word 0xd7c74fd9 -//.word 0x48852089 -//.word 0x12de2f4c -//.word 0x38593cf2 -//.word 0x214f85d0 -//.word 0x9be8ea58 -//.word 0x1f464fed -//.word 0x57ff42f5 -//.word 0xddd1dd2f -//.word 0x4691ee46 -//.word 0x5f6556a7 -//.word 0xb633af90 -//.word 0x5c59326a -//.word 0xea9fd759 -//.word 0xc269bd11 -//.word 0x9732cdeb -//.word 0x30359b38 -//.word 0x686d8cd5 -//.word 0x7ac03e00 -//.word 0x7b782469 -//.word 0x28f2718c -//.word 0xe29a383f -//.word 0xf717d187 -//.word 0x23c27eb0 -//.word 0x575d4e9d -//.word 0xb802425c -//.word 0xeb59affd -//.word 0x900ee3a5 -//.word 0x0c820bde -//.word 0x8cc15531 -//.word 0x47b551f7 -//.word 0x03999d6c -//.word 0xdaafc105 -//.word 0x3e365804 -//.word 0x3b977149 -//.word 0xfcdf346b -//.word 0x9171c907 -//.word 0xeffd7558 -//.word 0x38ac0608 -//.word 0x3d9d7246 -//.word 0x4295bb19 -//.word 0x01f215f4 -//.word 0xf1e14b8a -//.word 0xc7d15fe3 -//.word 0x3d2871b0 -//.word 0x1334e1dc -//.word 0x5464b863 -//.word 0xdbb84467 -//.word 0x15760381 -//.word 0x091fc355 -//.word 0x95a10669 -//.word 0xfaceab37 -//.word 0x9b0dcb80 -//.word 0x014fe2e4 -//.word 0x23452fb0 -//.word 0xe4d15df7 -//.word 0xdeba62e4 -//.word 0x5ea3a84e -//.word 0xaf3e6a8d -//.word 0x9cbd628c -//.word 0x3089a120 -//.word 0xc037be98 -//.word 0x2cb83296 -//.word 0x61cf031d -//.word 0x22c8a0ea -//.word 0x09680c08 -//.word 0xc8203f9f -//.word 0xb585ca0d -//.word 0x8605b937 -//.word 0x58d2bd21 -//.word 0xf7238bbd -//.word 0x599c7f01 -//.word 0x6b0a853c -//.word 0x115439aa -//.word 0x67af4d46 -//.word 0x4e102bdf -//.word 0x24e7dc6e -//.word 0xd20a29a7 -//.word 0x0cef00ce -//.word 0xd41f19cc -//.word 0x40e7d882 -//.word 0x7e51765d -//.word 0x15535c2b -//.word 0x6d45cf2d -//.word 0x9298d26d -//.word 0x35c64851 -//.word 0xf4855a71 -//.word 0xdb4018a6 -//.word 0x2ac76363 -//.word 0x58460a49 -//.word 0x597433f5 -//.word 0x1d0cfd1d -//.word 0x598163db -//.word 0x89ee6448 -//.word 0x364b604d -//.word 0x74e7c6b6 -//.word 0xb012ec88 -//.word 0xa81a3e95 -//.word 0xbb7a9b4d -//.word 0x634dfcd7 -//.word 0x00095761 -//.word 0xd769c3b4 -//.word 0x5aabdc0b -//.word 0xaafc6925 -//.word 0x5a313c99 -//.word 0x76b75a6a -//.word 0xc3cd5cdb -//.word 0x49f01584 -//.word 0x0f9775a6 -//.word 0x2621adbc -//.word 0xe80c9452 -//.word 0x82674a1a -//.word 0xb08a1b3d -//.word 0xc804a6ef -//.word 0xfad53e46 -//.word 0xd6de904c -//.word 0x0e958653 -//.word 0x7efd6c88 -//.word 0x69d652cb -//.word 0x0610b1be -//.word 0x3b86511c -//.word 0xa8e9694d -//.word 0xe7fa0937 -//.word 0x12fdb556 -//.word 0x866a520f -//.word 0xe7e54741 -//.word 0x6570dc1e -//.word 0x3de0e539 -//.word 0x828da5df -//.word 0x1d4eedab -//.word 0x13a58455 -//.word 0x0636cbcb -//.word 0xff7ea183 -//.word 0x6ac1850f -//.word 0x6244faf2 -//.word 0x2fbd30b2 -//.word 0x0d08e02e -//.word 0x2f1b7832 -//.word 0x043c7849 -//.word 0xb9721cd2 -//.word 0xff393b56 -//.word 0x0e796f19 -//.word 0xeab976ef -//.word 0xe590d851 -//.word 0x655dcab0 -//.word 0xe7385309 -//.word 0x4429adba -//.word 0x3397ee94 -//.word 0x1003e831 -//.word 0xdcf64d88 -//.word 0x843717be -//.word 0x66422640 -//.word 0x11f62b0e -//.word 0x4c8ec65a -//.word 0x5bd2eb51 -//.word 0x7d8e8a39 -//.word 0xb9446fbc -//.word 0xda1e6783 -//.word 0xb926a407 -//.word 0xbab962a4 -//.word 0x9939cbf0 -//.word 0x6703184a -//.word 0xcfa1fab6 -//.word 0x9e4038e8 -//.word 0x8364999e -//.word 0x12da0433 -//.word 0x0fefe671 -//.word 0xeadfd4a8 -//.word 0x869072fc -//.word 0x3e809303 -//.word 0x2afca190 -//.word 0x9e9440c9 -//.word 0xf4cb2e80 -//.word 0x8c136dc0 -//.word 0x10f8a5a5 -//.word 0xfd9bc471 -//.word 0x5f62e7dd -//.word 0xdcee7dad -//.word 0xf34da987 -//.word 0x8671e905 -//.word 0x96e1f609 -//.word 0x4fafeb51 -//.word 0x44aaa84b -//.word 0xfbd4792a -//.word 0xac17f339 -//.word 0x46331f6f -//.word 0xb3fbdb44 -//.word 0x5dc17cc4 -//.word 0xf10fb8e2 -//.word 0x6398c40e -//.word 0x326db90a -//.word 0xed743cf9 -//.word 0xf6175eb9 -//.word 0x8639c172 -//.word 0xf16efd6f -//.word 0x2b6b412d -//.word 0x8bbb3eb2 -//.word 0xd0b44020 -//.word 0x62aa9e8a -//.word 0xda625506 -//.word 0xc3c9f004 -//.word 0xa2e6abde -//.word 0x350ed7b0 -//.word 0xf9578069 -//.word 0xee4f4e22 -//.word 0x9eeda9af -//.word 0x5cc72074 -//.word 0xca860c7a -//.word 0x9e9770c3 -//.word 0xa52424da -//.word 0x084333ad -//.word 0xce6d819f -//.word 0xa231b1da -//.word 0xd62945e2 -//.word 0xa92e0770 -//.word 0xc5c8a87d -//.word 0x0ce8a89d -//.word 0x94da758e -//.word 0xf075d711 -//.word 0xb2958bf8 -//.word 0x2dcb2f81 -//.word 0x80525ee2 -//.word 0xd0451b25 -//.word 0xd4107336 -//.word 0x97255e3b -//.word 0x79f0e723 -//.word 0x770c8c82 -//.word 0xadb7e89c -//.word 0x19838fbf -//.word 0xa24f3ad7 -//.word 0x5976243c -//.word 0xfe46b3ce -//.word 0xc6b45b44 -//.word 0x5b4dc0c1 -//.word 0x25701aa8 -//.word 0xc8bbdeb2 -//.word 0xeec39b3e -//.word 0x460821e8 -//.word 0xcd28e95c -//.word 0x4c52b16d -//.word 0x21fe6761 -//.word 0x43db488f -//.word 0x8109492d -//.word 0x0a89b663 -//.word 0x32f219a3 -//.word 0x73655d3d -//.word 0xb2c2332e -//.word 0xc41cb539 -//.word 0x316b493a -//.word 0x3881c9b6 -//.word 0x1340e1b6 -//.word 0x7c09b8d6 -//.word 0x6f77d299 -//.word 0x324e35ff -//.word 0x93aeca5a -//.word 0x718d075d -//.word 0x7d64cb76 -//.word 0x4227895e -//.word 0x637ba9ee -//.word 0x24242b34 -//.word 0x2cbc8ec6 -//.word 0x8aabf056 -//.word 0xf5537687 -//.word 0x588beeff -//.word 0x8e4fb3bd -//.word 0x69b5d1ad -//.word 0xfa236a7a -//.word 0x0cc059a4 -//.word 0xf22814d2 -//.word 0x8364d769 -//.word 0x6219ff5d -//.word 0x83ffb448 -//.word 0xea95cab9 -//.word 0xb614e9ce -//.word 0x5fa1ec05 -//.word 0x3cc6884f -//.word 0x48232e66 -//.word 0x25613261 -//.word 0x61682c86 -//.word 0xf9d29f5f -//.word 0x1b9fd810 -//.word 0x302a19e7 -//.word 0x1a5bf735 -//.word 0xba1f015c -//.word 0xb615a22a -//.word 0x798b4965 -//.word 0x7ba8c6a7 -//.word 0xc2eaf86c -//.word 0xa9d4a56a -//.word 0xe0e0a921 -//.word 0xb4bb53b2 -//.word 0x90b10cf4 -//.word 0xc46639c5 -//.word 0x86c8639e -//.word 0x3641956b -//.word 0xe7310699 -//.word 0x1a9bf870 -//.word 0xcc1fe0a3 -//.word 0xb428c725 -//.word 0xc666f03f -//.word 0xfb7fbbe0 -//.word 0x5401c934 -//.word 0x1d9c6177 -//.word 0x6f8e130c -//.word 0xf85e9bc9 -//.word 0xfecd0896 -//.word 0xa20a1d36 -//.word 0x6225f764 -//.word 0xe2c6f022 -//.word 0xec1fc44e -//.word 0xb51ff276 -//.word 0x62e865ed -//.word 0xca84541e -//.word 0x7ed36721 -//.word 0x07c81b8c -//.word 0x6ed5678c -//.word 0x02a4a034 -//.word 0x55089a14 -//.word 0x8833100e -//.word 0xc8294565 -//.word 0x1975ec17 -//.word 0x521a456d -//.word 0x69cc8ad0 -//.word 0xf16089de -//.word 0xe18292bd -//.word 0x97a693af -//.word 0x1d4182e7 -//.word 0xaa38fb9c -//.word 0x6c982b5b -//.word 0x8489eca1 -//.word 0x537d31a9 -//.word 0xf4ada583 -//.word 0x09c68f66 -//.word 0xbbdff947 -//.word 0xfcaf11aa -//.word 0x0ffdcfb9 -//.word 0x4b57d893 -//.word 0x1c07a3e6 -//.word 0x4a43dac0 -//.word 0x7ea403a2 -//.word 0x02da5fd7 -//.word 0xc89d1203 -//.word 0xaee685ff -//.word 0x006009e4 -//.word 0x3e19bd66 -//.word 0x207eb164 -//.word 0xd8864bbc -//.word 0x972dea64 -//.word 0x5224cab7 -//.word 0xc6c7280c -//.word 0xba4fa68d -//.word 0x8449f047 -//.word 0xce47a07d -//.word 0x9ad55f42 -//.word 0x84ae4d47 -//.word 0x4730a4f1 -//.word 0x830e98ae -//.word 0xbe45818a -//.word 0xa8513bfd -//.word 0xa3a0cd07 -//.word 0x82474a7f -//.word 0x91f4f5a9 -//.word 0xd623a806 -//.word 0x97957770 -//.word 0x1dfe9066 -//.word 0xb7ff65a4 -//.word 0x01530ef6 -//.word 0x654de84f -//.word 0xe3828315 -//.word 0x0ec3bbc0 -//.word 0x574e24a3 -//.word 0x8e44ac09 -//.word 0xa65e7b84 -//.word 0xb9dc1e82 -//.word 0x4bbfe521 -//.word 0xd3388945 -//.word 0x786012e7 -//.word 0x1829f8b0 -//.word 0x8e9589c6 -//.word 0x35268ae6 -//.word 0xa89521b3 -//.word 0xccc7f34d -//.word 0x11fc8926 -//.word 0xf44af811 -//.word 0xc94ac19c -//.word 0xb711f6a0 -//.word 0x04619e16 -//.word 0x92215b2c -//.word 0xaa0b4a99 -//.word 0xf9a52b2d -//.word 0xd872c2ac -//.word 0xd1697cdc -//.word 0x5ea656dd -//.word 0xf360fbb9 -//.word 0x3f1b2c3c -//.word 0xb01e6506 -//.word 0x3528bede -//.word 0x475f0f49 -//.word 0x2a89575b -//.word 0x707e5fce -//.word 0xc0dd9a51 -//.word 0xd5ff5022 -//.word 0xc929fbdf -//.word 0x9406f29a -//.word 0xd054442b -//.word 0xbfdde7ca -//.word 0x8ea912dd -//.word 0xdb72e70e -//.word 0x765855a1 -//.word 0x64d63d04 -//.word 0x2af5d3a8 -//.word 0x48bf4810 -//.word 0x03f7a628 -//.word 0x6707fbd7 -//.word 0x8d3ab9d7 -//.word 0x1a2b5dc5 -//.word 0x087e4f74 -//.word 0xa9cd0987 -//.word 0xe8e57c3f -//.word 0xd333af91 -//.word 0x5679aa7c -//.word 0x49c59299 -//.word 0xaea415f4 -//.word 0x3393091a -//.word 0xffb64f73 -//.word 0xaacdfed2 -//.word 0x8d63bd4b -//.word 0x3d487145 -//.word 0x524219cf -//.word 0x6d00f538 -//.word 0x794feed9 -//.word 0x30913236 -//.word 0xe16a1f46 -//.word 0x71bc620e -//.word 0xa1d66075 -//.word 0x8ee8d553 -//.word 0x7ebabacb -//.word 0xd99e6ddb -//.word 0x76a40c31 -//.word 0x180c2140 -//.word 0x39018594 -//.word 0x06847e62 -//.word 0xaaa62b64 -//.word 0xcffa22e3 -//.word 0x624a5716 -//.word 0x978940aa -//.word 0x2e0936a2 -//.word 0xf4ee1f61 -//.word 0x8ce34a05 -//.word 0x6f0b9af7 -//.word 0x323ae7c0 -//.word 0x0866a11f -//.word 0x8758b658 -//.word 0xafa7b6ce -//.word 0x28e736d4 -//.word 0xcb1e72c1 -//.word 0x64773642 -//.word 0xb63bfef5 -//.word 0xc0fc5c33 -//.word 0x3f149a2d -//.word 0x744ea03a -//.word 0x27e2196f -//.word 0xeca7d271 -//.word 0xa5846287 -//.word 0x482710f3 -//.word 0xe3faf183 -//.word 0xdd535163 -//.word 0x7eec5435 -//.word 0xb192dd63 -//.word 0x0921afb4 -//.word 0x03afd31e -//.word 0x8b0839dc -//.word 0xc15ba2c0 -//.word 0xfc32bcc9 -//.word 0x0fa78ff8 -//.word 0xccd51960 -//.word 0xc78e357d -//.word 0x5d4cc2c6 -//.word 0xf4690085 -//.word 0x83923de7 -//.word 0x5679b24f -//.word 0x0bcaa8f0 -//.word 0xe161df9b -//.word 0x32ba2fd5 -//.word 0x3da8702d -//.word 0x294a98cd -//.word 0x473b234e -//.word 0x980ab8d1 -//.word 0x8fea094b -//.word 0x17aafb20 -//.word 0xd8e707f4 -//.word 0xb680dfbd -//.word 0x9b4a551d -//.word 0x770579f0 -//.word 0x858f0221 -//.word 0xcf58f0c1 -//.word 0xf4166f5a -//.word 0x29bafd80 -//.word 0x7ea2cfaa -//.word 0x63107140 -//.word 0x6adbaef5 -//.word 0x4e64af57 -//.word 0x35cc67a4 -//.word 0x32642ee0 -//.word 0x0e65ab24 -//.word 0x48e2f839 -//.word 0x5afa0166 -//.word 0x3e522d85 -//.word 0x31c3415c -//.word 0xb74f812b -//.word 0xdf5a1882 -//.word 0xc816b955 -//.word 0x64408752 -//.word 0x7c0a3272 -//.word 0xf45863cf -//.word 0x512e5bb5 -//.word 0x7869d7fb -//.word 0xb8ae3694 -//.word 0x0ba1dd61 -//.word 0x9957db49 -//.word 0x7e0dc98c -//.word 0xcd1af454 -//.word 0xd522bf8e -//.word 0xa38d42f7 -//.word 0xc837377a -//.word 0x5c6917b9 -//.word 0x420980ea -//.word 0xae0ddae4 -//.word 0xe5353a79 -//.word 0x44fa8607 -//.word 0x84c2db4a -//.word 0x3c552b74 -//.word 0xa7942b80 -//.word 0xa8696cc3 -//.word 0x0bfac7c4 -//.word 0x0e22ff4d -//.word 0x2021a2c2 -//.word 0xe89230b2 -//.word 0x899e7fac -//.word 0x25705e54 -//.word 0xa0e879b5 -//.word 0xa6947dd9 -//.word 0xefdc7c97 -//.word 0xc17c92ad -//.word 0xb738c90f -//.word 0xc2ca3a7e -//.word 0x6d20755b -//.word 0x65c423be -//.word 0x389ceac3 -//.word 0x5dd39124 -//.word 0x7517650d -//.word 0xd005db2b -//.word 0x33e17607 -//.word 0xd88beb92 -//.word 0xb7ae8400 -//.word 0x043bc2da -//.word 0xf916464f -//.word 0xd50ff1cc -//.word 0x25134bcc -//.word 0x42a321f0 -//.word 0x1b867352 -//.word 0x34bb8d17 -//.word 0xefb27343 -//.word 0x0bbc82d1 -//.word 0x6abf5504 -//.word 0x172ee6f8 -//.word 0x8738f57c -//.word 0x1f40ae24 -//.word 0xf78e8699 -//.word 0xde446634 -//.word 0x9e930bcb -//.word 0x812eadcb -//.word 0x13ffde87 -//.word 0x2a1ab6d0 -//.word 0x24ef2dc6 -//.word 0x70c3c8ed -//.word 0x50617884 -//.word 0xdc0cbf12 -//.word 0x4bb91441 -//.word 0x6e7b89ef -//.word 0x7d3fab83 -//.word 0x16b9a97d -//.word 0x839eb952 -//.word 0x3c14b876 -//.word 0xac6710ba -//.word 0x38fddfd8 -//.word 0x7e8c564c -//.word 0xda8a5f66 -//.word 0x2fe5829e -//.word 0xe4f50927 -//.word 0x2caf62c7 -//.word 0x8b1bc6e5 -//.word 0x960818e4 -//.word 0xfafe10af -//.word 0xbf749895 -//.word 0xce437658 -//.word 0xb15b2c80 -//.word 0x9bb41cf5 -//.word 0xa888f0cd -//.word 0x65c03963 -//.word 0x93ac56a9 -//.word 0x28f698bf -//.word 0x97d9a4c4 -//.word 0x518e18ec -//.word 0x8c0771d2 -//.word 0x43e02c10 -//.word 0x7e932b0e -//.word 0xd3eb5b17 -//.word 0x2dbb94b2 -//.word 0xcccfc02f -//.word 0x8d234080 -//.word 0x6c538b4a -//.word 0x4753183c -//.word 0xe5607fa0 -//.word 0x3636db2f -//.word 0xdc84722a -//.word 0xeb9d98a6 -//.word 0xed70d028 -//.word 0x2aba3571 -//.word 0x267a189b -//.word 0x6aa6eb65 -//.word 0x871c5dcc -//.word 0x59dbc7db -//.word 0x8973c7c3 -//.word 0x55ba2a2e -//.word 0x94c110d1 -//.word 0xf4064a40 -//.word 0x87eb0707 -//.word 0x7e67b0f6 -//.word 0x34fc10bc -//.word 0x6ee9b8b8 -//.word 0xe1a0a20b -//.word 0xf47a14f2 -//.word 0xc8aac753 -//.word 0x75704995 -//.word 0x978fa0b5 -//.word 0x0a003096 -//.word 0xf1e8df99 -//.word 0xfdc8766e -//.word 0xecf34a2a -//.word 0x4f461d99 -//.word 0x91133fd5 -//.word 0x355ef817 -//.word 0x5f4c2bce -//.word 0x96d833ee -//.word 0xc8c8118b -//.word 0x8edfc9a6 -//.word 0xb2550947 -//.word 0xef840ccc -//.word 0xf7e4be80 -//.word 0xbb39216f -//.word 0xe60bef79 -//.word 0xaa5781a6 -//.word 0xc084efb9 -//.word 0xaa987908 -//.word 0x3cac258a -//.word 0x5a9eaa32 -//.word 0x03058d7b -//.word 0x8f6a8a45 -//.word 0x34b535df -//.word 0xcfe5e165 -//.word 0xe104c14c -//.word 0xd85a4d3b -//.word 0x91e2e71c -//.word 0x1afabf74 -//.word 0xbc5ef4ef -//.word 0x3957fc40 -//.word 0x52304527 -//.word 0x8cea1cd3 -//.word 0x3431cf6b -//.word 0xa18e0ee8 -//.word 0xb9dd9725 -//.word 0xb7021339 -//.word 0x2bd83a04 -//.word 0x416a3e08 -//.word 0x4766677a -//.word 0x6acefa99 -//.word 0xc0f1603f -//.word 0x8c9a84b6 -//.word 0xbd877dcc -//.word 0xb71c6d2a -//.word 0x5659a9e1 -//.word 0x300a1a46 -//.word 0x1b3de300 -//.word 0xf0f9435f -//.word 0x8e2dbdf0 -//.word 0x21e7774e -//.word 0xa4c6e13a -//.word 0xa4b296ee -//.word 0x47ca87af -//.word 0x8e9e56a2 -//.word 0xd79f00e0 -//.word 0xa6d4bfcc -//.word 0xa4ce2fa5 -//.word 0xe8ddaf57 -//.word 0x76840a97 -//.word 0x052b572e -//.word 0x06141d95 -//.word 0xe190bbc3 -//.word 0x82730743 -//.word 0x14c53689 -//.word 0x0cbafc86 -//.word 0x6ae4f37a -//.word 0x3ba8410a -//.word 0x63ef7692 -//.word 0x991db3bc -//.word 0xb3471152 -//.word 0x24a14050 -//.word 0xc3356f3e -//.word 0xcedb6cbc -//.word 0x2e650d5f -//.word 0xfc1acebb -//.word 0x4566bbc1 -//.word 0x0acf914c -//.word 0x8b2b20f6 -//.word 0xc610f330 -//.word 0x3a8d3392 -//.word 0xf017c96f -//.word 0xbcc6c3ad -//.word 0xc1c2f9d3 -//.word 0x33f8f064 -//.word 0x6111fe6c -//.word 0xf2a4af58 -//.word 0x6eaa680a -//.word 0x01334a2d -//.word 0x7c5859c6 -//.word 0x9d71de0c -//.word 0x90880a7a -//.word 0xb50ddb22 -//.word 0xa4ca4444 -//.word 0x6f1a881f -//.word 0x2756e707 -//.word 0xa1917cb8 -//.word 0x798566ea -//.word 0x58cc2626 -//.word 0x735448d7 -//.word 0x540d46a4 -//.word 0xdde4a9fd -//.word 0x8af571f4 -//.word 0xf6fcb74f -//.word 0xa10d91db -//.word 0xf0863603 -//.word 0x754162a0 -//.word 0x710efc13 -//.word 0x9760f792 -//.word 0x134676bf -//.word 0xcb9d337f -//.word 0xe5852109 -//.word 0x8911503d -//.word 0xe8431138 -//.word 0x7d375c25 -//.word 0x929e6e55 -//.word 0x076eb693 -//.word 0x4fd8f2b1 -//.word 0xbb7b9667 -//.word 0xfbd76d5e -//.word 0xe2048287 -//.word 0x69a341b1 -//.word 0xf716da5b -//.word 0xdfece6c6 -//.word 0x2a9f4d4f -//.word 0x988267fc -//.word 0xe1f56155 -//.word 0x40dbe375 -//.word 0x324eef60 -//.word 0x7c910d97 -//.word 0x6b45a5ea -//.word 0x5fe0ac8e -//.word 0x8b5c826f -//.word 0xf62c1bc7 -//.word 0xc5745ef0 -//.word 0xbd79ca77 -//.word 0x04575f71 -//.word 0x27f2bc12 -//.word 0x612e857b -//.word 0x1b6307d4 -//.word 0xaf0b1f9b -//.word 0x71be573b -//.word 0xf06153e1 -//.word 0x799a6c8b -//.word 0xdd869a62 -//.word 0x74af9749 -//.word 0x623841b6 -//.word 0x195b41c0 -//.word 0x2016ea7a -//.word 0x12206380 -//.word 0xe92209cf -//.word 0x7c240fda -//.word 0x474567da -//.word 0x6bb0e665 -//.word 0xf5cba342 -//.word 0x63b2a07c -//.word 0x65e3acb5 -//.word 0xe03b87bd -//.word 0x38214863 -//.word 0xcf01fc8b -//.word 0xc9fc9081 -//.word 0x13ddf18d -//.word 0xa34f71c8 -//.word 0x014e6d2d -//.word 0x06dc2cf3 -//.word 0xe3f50b1b -//.word 0x66c4d745 -//.word 0x79177bc7 -//.word 0xec11db00 -//.word 0x741effea -//.word 0xf32c74ef -//.word 0xf919effe -//.word 0x8b6734dd -//.word 0x243736c1 -//.word 0xfa75801c -//.word 0x8250d3b6 -//.word 0x36ed11ff -//.word 0x965c59a4 -//.word 0x6dcb7460 -//.word 0x55f97015 -//.word 0x7dee8a1b -//.word 0xaaea52d7 -//.word 0x7c9b0990 -//.word 0xf3924e7f -//.word 0x31f8fa25 -//.word 0x827d48e2 -//.word 0x999239c2 -//.word 0x1dd8369a -//.word 0x64d8f754 -//.word 0x7ef4a587 -//.word 0x759d3b4b -//.word 0xd3c7324b -//.word 0x659a5d1b -//.word 0x3f6b12cc -//.word 0x00ea8abe -//.word 0x579d8ab6 -//.word 0xc68d4330 -//.word 0xa63f78f7 -//.word 0x6ce5def2 -//.word 0x2ad6c841 -//.word 0x593c0389 -//.word 0xd50cff8b -//.word 0x293c30fc -//.word 0x0d30b490 -//.word 0x2d753659 -//.word 0x2cb1124f -//.word 0xe9daba30 -//.word 0x01a7588a -//.word 0x9544b515 -//.word 0x4d4a5947 -//.word 0x9ceef423 -//.word 0x4679fc52 -//.word 0x20f89874 -//.word 0x1734bdb8 -//.word 0x74e496aa -//.word 0x5f222a4d -//.word 0xa11c396a -//.word 0xae0c6627 -//.word 0xe26a9cdb -//.word 0x0b5faa21 -//.word 0x287e302c -//.word 0x70afbf5a -//.word 0x966b3c0b -//.word 0x4c2f85b3 -//.word 0x062a572e -//.word 0x00397054 -//.word 0x8216f0ce -//.word 0x63cd0528 -//.word 0xcc6fc726 -//.word 0x3e09615c -//.word 0xd6d772f9 -//.word 0xd0b6b3e4 -//.word 0x4bd8d90a -//.word 0x4bbbbdf6 -//.word 0x045cbaa2 -//.word 0x56a8568c -//.word 0x9433250d -//.word 0x892cebe6 -//.word 0xbd91011c -//.word 0xf49ffa07 -//.word 0xf88d85a5 -//.word 0x98799534 -//.word 0xf1a3c0ff -//.word 0xecd9e578 -//.word 0x08321287 -//.word 0x5affa522 -//.word 0xd2ffb11e -//.word 0xbfd2a344 -//.word 0x95b025a8 -//.word 0xee5b4236 -//.word 0xd052cb8e -//.word 0x2e48fa12 -//.word 0xb1d4563c -//.word 0xb86ad636 -//.word 0x9d8a49a4 -//.word 0x3a37f5c4 -//.word 0xabab7fba -//.word 0x56490b25 -//.word 0x29d3a3f6 -//.word 0x23dddd82 -//.word 0x1682b8d6 -//.word 0xab55c84a -//.word 0xa69a9359 -//.word 0x6bb73aaf -//.word 0xc1e55c84 -//.word 0xd72b3729 -//.word 0x858d10e0 -//.word 0xd381d5f1 -//.word 0xbfa202fa -//.word 0x3ba8c187 -//.word 0x769855e2 -//.word 0x5c38b82d -//.word 0x60c683ad -//.word 0x79e90f69 -//.word 0x6ae8daf4 -//.word 0x471a2c87 -//.word 0x359efa52 -//.word 0x714b0a14 -//.word 0x94ea58ea -//.word 0x15a3b964 -//.word 0x0fb6bede -//.word 0x446cdb0e -//.word 0x634cc8d9 -//.word 0x8691286b -//.word 0xffdc6986 -//.word 0x5427eb1a -//.word 0x88fa6417 -//.word 0x9ce1837f -//.word 0x561dd3bf -//.word 0x419ae33f -//.word 0xf521a438 -//.word 0x98cf12c6 -//.word 0xa5c6163e -//.word 0xec22abc1 -//.word 0xdb2f4111 -//.word 0xfbd95ea4 -//.word 0xbd638bf7 -//.word 0x775c6e25 -//.word 0xaacf34b8 -//.word 0x86bb32bf -//.word 0xb0c2cb21 -//.word 0x42259430 -//.word 0x14f0b681 -//.word 0x3a7294fc -//.word 0xcdf0ae2f -//.word 0xef9bc5e7 -//.word 0x09be4102 -//.word 0x573ccf7f -//.word 0xa73a4ed7 -//.word 0x5d19ec90 -//.word 0xbba78c0f -//.word 0x5f966cae -//.word 0x0d2d040e -//.word 0xaf3d31af -//.word 0x9a5792bd -//.word 0x133c322d -//.word 0x12956809 -//.word 0x46e4fc08 -//.word 0x58bb8b62 -//.word 0x742c2de2 -//.word 0x0680543d -//.word 0xc12bf8a2 -//.word 0xe600f192 -//.word 0xc3a2a4f2 -//.word 0x7a3be15f -//.word 0x03700cc1 -//.word 0x74947b23 -//.word 0x801b20c2 -//.word 0x3e526863 -//.word 0x2c4e62ea -//.word 0x74222429 -//.word 0x6e566bf6 -//.word 0x65948180 -//.word 0x9ea364e3 -//.word 0x969a24f9 -//.word 0x8c4d8d73 -//.word 0x3f0c0629 -//.word 0xf98db9af -//.word 0xcc26f429 -//.word 0x1c3fcf60 -//.word 0x5e081015 -//.word 0x1e674b95 -//.word 0x47354e8d -//.word 0x9fa9bc20 -//.word 0x9114f737 -//.word 0x2fcf4318 -//.word 0x7772293b -//.word 0xd5471a58 -//.word 0xeaff55c5 -//.word 0x8ca30bff -//.word 0x0ecdc087 -//.word 0xc117f4ef -//.word 0xbad40334 -//.word 0xd6fe4a4e -//.word 0xfc708b06 -//.word 0xa2559208 -//.word 0x93e11939 -//.word 0xef3fea4a -//.word 0x73ca438e -//.word 0xfa7f7e08 -//.word 0x44b2f1c9 -//.word 0xf7011479 -//.word 0xe387e133 -//.word 0x8a528196 -//.word 0xe0162418 -//.word 0x4f22319e -//.word 0xfe949f4a -//.word 0x53c9a294 -//.word 0xb7188b9d -//.word 0x99c0e9bf -//.word 0xb51ef569 -//.word 0x96242d2a -//.word 0x59063e0b -//.word 0xb5362722 -//.word 0x38939c64 -//.word 0xd3dea8bb -//.word 0x996d9759 -//.word 0xc423134b -//.word 0xf99f8d51 -//.word 0xcdb4dfed -//.word 0x87192fba -//.word 0x276216ff -//.word 0xa82f0184 -//.word 0x83a4d8a4 -//.word 0x7419dea4 -//.word 0x8012d943 -//.word 0x37717292 -//.word 0x37eade06 -//.word 0xf1b8becc -//.word 0xb08e445c -//.word 0xd7d19851 -//.word 0x69047a78 -//.word 0xcf842827 -//.word 0xd67582d0 -//.word 0xf8fc6cd5 -//.word 0xdcae749e -//.word 0x2049b5ea -//.word 0x55a2fa62 -//.word 0x4bdf2774 -//.word 0x8fe6d55e -//.word 0x33163d89 -//.word 0xcd345719 -//.word 0xc2a843c2 -//.word 0xc5e9e7dd -//.word 0x9a36dabb -//.word 0x20878039 -//.word 0x8ec37794 -//.word 0xfd33327f -//.word 0x2737e473 -//.word 0x6e37a047 -//.word 0x20ddbe00 -//.word 0xf98180ea -//.word 0xe9e5f6e8 -//.word 0x18231e08 -//.word 0x28e3505a -//.word 0xbad1d903 -//.word 0x334fe78d -//.word 0xc066a581 -//.word 0x9703a638 -//.word 0x806087ee -//.word 0x94c0d018 -//.word 0x455f1cf7 -//.word 0x9fa97a6e -//.word 0xceaa1211 -//.word 0xdfc60c7e -//.word 0xcbaaadf0 -//.word 0xb182c311 -//.word 0x636c4410 -//.word 0x242d32f4 -//.word 0xb024c130 -//.word 0x7d7cbc77 -//.word 0x41a525d1 -//.word 0xb4041cef -//.word 0x97e901bb -//.word 0xf5c2dd34 -//.word 0xa98ffe79 -//.word 0x2096e223 -//.word 0x605857d8 -//.word 0x49c3df1e -//.word 0x1ba9596c -//.word 0x3971de87 -//.word 0x2d0dea0c -//.word 0xeb2cbc48 -//.word 0x5ab0ff50 -//.word 0x1062a94e -//.word 0x5de4241a -//.word 0x8ce8ac0a -//.word 0x65a0f80a -//.word 0xf7751cef -//.word 0x94fcae08 -//.word 0x1c2627f6 -//.word 0x7fb78dbe -//.word 0x7df94f1d -//.word 0xb0b1711c -//.word 0xcd52e8e3 -//.word 0x277148d2 -//.word 0x74799cce -//.word 0xd4a095d9 -//.word 0x0f19e8e6 -//.word 0x1e8bf1eb -//.word 0xeec39c37 -//.word 0x60a68506 -//.word 0x94695e53 -//.word 0x670492ed -//.word 0x3ae327cd -//.word 0xf6dfe9a7 -//.word 0x4c6ec5bf -//.word 0x421673fe -//.word 0xeb285845 -//.word 0x75aaaa01 -//.word 0x6a95d500 -//.word 0x2f411d83 -//.word 0xd11d8594 -//.word 0x00a3f099 -//.word 0x5c8b872a -//.word 0xf03f5a20 -//.word 0xfc904aee -//.word 0xf8a72635 -//.word 0xd53e1492 -//.word 0x861033bb -//.word 0xbf8d7eca -//.word 0xfdd3f4d8 -//.word 0xc6daf6ce -//.word 0x32eef078 -//.word 0xaa633bdb -//.word 0xf08442c9 -//.word 0x5fcce4b2 -//.word 0x75591abd -//.word 0x8e9dda17 -//.word 0xf2573b8b -//.word 0x12c1d954 -//.word 0x0f0b7b2f -//.word 0x7c09f3b4 -//.word 0x652946e5 -//.word 0x90a70d08 -//.word 0x02041bb2 -//.word 0xc5b46025 -//.word 0xe9170ddb -//.word 0xc9aaf963 -//.word 0x907f446c -//.word 0xfbea3a20 -//.word 0x607e7ab3 -//.word 0xef37573b -//.word 0x38f97ec2 -//.word 0xed39d999 -//.word 0xe9fab4f0 -//.word 0x72fc1fa4 -//.word 0xbb309358 -//.word 0xad6ed8c7 -//.word 0xe76a2558 -//.word 0x04e58af4 -//.word 0x1c208b14 -//.word 0x8d960e1e -//.word 0xfbea77f1 -//.word 0x951f11be -//.word 0x9a07b01b -//.word 0x1cfe9452 -//.word 0x05d891ff -//.word 0x57176dda -//.word 0xb8618ad1 -//.word 0x2d32c45a -//.word 0x26cf9d07 -//.word 0xbb7b985a -//.word 0x35ece2dc -//.word 0xd0003769 -//.word 0xbfad04ce -//.word 0x7136c996 -//.word 0x13a5c220 -//.word 0x5675c6f5 -//.word 0x728f6f59 -//.word 0x6b787b20 -//.word 0x92c872c3 -//.word 0x50de89b3 -//.word 0x1fd2c7ed -//.word 0xd9ab66cf -//.word 0x35d27c2a -//.word 0x8ec7db98 -//.word 0xe7133510 -//.word 0x2d7e84b7 -//.word 0xbb81a8f9 -//.word 0x24fe52d9 -//.word 0x2c2f2285 -//.word 0x17dd0c2e -//.word 0x27d20016 -//.word 0x6090caeb -//.word 0x8e433753 -//.word 0x89f579c8 -//.word 0xb801cca6 -//.word 0xd4ca5a82 -//.word 0xeeac5cbe -//.word 0xb433835a -//.word 0xf08b960d -//.word 0x51385c95 -//.word 0x6e07bc4b -//.word 0x084523fa -//.word 0x8f2e26f1 -//.word 0xe8a86957 -//.word 0x6e32bfbf -//.word 0x371792fc -//.word 0x98e78637 -//.word 0xeb27593f -//.word 0x8f480e1f -//.word 0x31d64af6 -//.word 0x4af2fe03 -//.word 0xe9024600 -//.word 0xb3a791b1 -//.word 0x28f003bc -//.word 0x28cd17bb -//.word 0xb5c68990 -//.word 0xfaec73f8 -//.word 0x8c10b664 -//.word 0xf1349b04 -//.word 0x5f3fba24 -//.word 0xc5f51bbb -//.word 0x10259c41 -//.word 0xa72492c2 -//.word 0x377bb331 -//.word 0xb6dd34fe -//.word 0xa25c2eea -//.word 0x8adc461b -//.word 0xd0c78d6b -//.word 0xad02a506 -//.word 0x80000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x0000FB80 -//// expected output -//.word 0x8bcf4c7d -//.word 0xf9b79044 -//.word 0xab522ecb -//.word 0x2d9bb9dc -//.word 0xf54b6e13 -//.word 0x1404f1f2 -//.word 0xbb413b27 -//.word 0x90968c2b -//.word 0x83c4d34c -//.word 0x61edef83 -//.word 0x02e3129e -//.word 0x67e3f95b -//.word 0x249d160a -//.word 0xe5e0c4d3 -//.word 0x48807926 -//.word 0x3e5ed128 -//// SHA512LongMsgvector_81 -//// vector length -//.word 0x0000FE98 -//// input message -//.word 0x1e0c4f0f -//.word 0x251137b6 -//.word 0x5a35ba9f -//.word 0x8a2a9525 -//.word 0xf240a345 -//.word 0xed7ea453 -//.word 0xcff13eed -//.word 0x1044412e -//.word 0xad912f23 -//.word 0xcb77fc83 -//.word 0x9d6d129a -//.word 0x89559887 -//.word 0x8655f4a7 -//.word 0xc9e28e51 -//.word 0xa01dd7c4 -//.word 0x9e638b5d -//.word 0xf81f330e -//.word 0x2fe3ed0b -//.word 0xefb86fc6 -//.word 0x38b24a1e -//.word 0xbbc76cd3 -//.word 0x87e0e93e -//.word 0xe431fb3f -//.word 0x7fc64776 -//.word 0xc85f61b6 -//.word 0x997e93b6 -//.word 0x18beda0a -//.word 0xde663252 -//.word 0x593e13b2 -//.word 0x6ea23c82 -//.word 0x63d4af46 -//.word 0xfd97fde0 -//.word 0xe5f9c304 -//.word 0x507075ed -//.word 0xdf285a4e -//.word 0xc49cd88c -//.word 0x2764f22a -//.word 0xc84d0f85 -//.word 0xe5affdc1 -//.word 0x5efb3503 -//.word 0x179461e0 -//.word 0x9ee01b16 -//.word 0x0e9ef87a -//.word 0x337ac532 -//.word 0xeede1024 -//.word 0xdb0cebae -//.word 0x326aec98 -//.word 0xeb1c7847 -//.word 0x26d84133 -//.word 0xc9f60e9b -//.word 0x6bc7bb77 -//.word 0x712880ae -//.word 0x76577689 -//.word 0xf1055667 -//.word 0x11ac84b3 -//.word 0xec224d14 -//.word 0xd96f6de3 -//.word 0x1adcd5e2 -//.word 0xbf4cab2b -//.word 0xc6cf9166 -//.word 0x87752a3f -//.word 0x5060da18 -//.word 0x4c1dcefa -//.word 0xa9353dd2 -//.word 0xf9feedda -//.word 0xd9b7f855 -//.word 0xd1d4d07f -//.word 0x7c9781c4 -//.word 0xe9e03630 -//.word 0x4046ff27 -//.word 0xa966d156 -//.word 0x697bcfe9 -//.word 0x4e30c7fe -//.word 0x4eb2005a -//.word 0x6b08335b -//.word 0xdaa7d72e -//.word 0x6341a142 -//.word 0x0bdf4cfd -//.word 0xf12f96ad -//.word 0x761f8bc1 -//.word 0xa0aa0539 -//.word 0xc1f2745b -//.word 0x5390dba8 -//.word 0x27281b0e -//.word 0xbf40745f -//.word 0xf8524902 -//.word 0xeb1f23e9 -//.word 0x1647f9c2 -//.word 0xb717af72 -//.word 0x79a2dcbf -//.word 0x5213d04c -//.word 0xac41d6cb -//.word 0xc384b66e -//.word 0x4ec87e9e -//.word 0x61df82f0 -//.word 0x921ca255 -//.word 0x5b1dcb91 -//.word 0xbfe8c1ee -//.word 0x303a1b31 -//.word 0xb11b8fcd -//.word 0x38b66f57 -//.word 0x5668743a -//.word 0x1917bbac -//.word 0x32c50de0 -//.word 0x5364637d -//.word 0xdbeca950 -//.word 0xb5acc33d -//.word 0x7dddce7c -//.word 0xe57da802 -//.word 0x585bb23c -//.word 0xdd6ed403 -//.word 0x3d6ac2cd -//.word 0x68957e20 -//.word 0x15d71f4d -//.word 0xa911d05a -//.word 0x5ab01b40 -//.word 0x94826857 -//.word 0x9bc8c00e -//.word 0x738cd7df -//.word 0xfd354a82 -//.word 0x62582561 -//.word 0xb4d1a84d -//.word 0xd3134b6f -//.word 0x8ebcff81 -//.word 0x0b6db73e -//.word 0x69d82716 -//.word 0xa31acb27 -//.word 0xb84c2c69 -//.word 0x09545f28 -//.word 0x0201ceb8 -//.word 0xfc583b64 -//.word 0x622801a7 -//.word 0x13e59d9f -//.word 0x08b26ebe -//.word 0x37c0b9c3 -//.word 0xb7d7f0e8 -//.word 0x2432345d -//.word 0x459018f6 -//.word 0xec88a821 -//.word 0x1e1daa1a -//.word 0x74922362 -//.word 0xc1801d6d -//.word 0xf525a89a -//.word 0x42ff1f69 -//.word 0x7d99ace9 -//.word 0xc6a60e6f -//.word 0x6b4c9a8d -//.word 0x0ac28042 -//.word 0xf61d506f -//.word 0xdc67bd8a -//.word 0xa7f2a096 -//.word 0xa0eb4053 -//.word 0xda32d0b2 -//.word 0xcd69398b -//.word 0x414c1a92 -//.word 0x6e400d88 -//.word 0x612e2dae -//.word 0xa191d57f -//.word 0x13ceaa9e -//.word 0x1bc5db0e -//.word 0x04a5a7a1 -//.word 0xa20420b3 -//.word 0x352f2f17 -//.word 0x91bed952 -//.word 0x7c6cc007 -//.word 0x5826edb3 -//.word 0x0262cc9b -//.word 0xf9b27802 -//.word 0xc399399e -//.word 0x8c9d4c4d -//.word 0x119de205 -//.word 0xbc656a09 -//.word 0x10801363 -//.word 0x484d8d8e -//.word 0x3b561073 -//.word 0x83dca097 -//.word 0xdeb78f92 -//.word 0xd45d43c3 -//.word 0x9b403a42 -//.word 0x375d4a16 -//.word 0xe5112ea8 -//.word 0xba2f3e78 -//.word 0x88517e0f -//.word 0x016bda35 -//.word 0x1fa6b063 -//.word 0xc36b8f7b -//.word 0x9cbd3fb7 -//.word 0x4acd01df -//.word 0xc3c817c0 -//.word 0xf6f487d9 -//.word 0xaffb1d57 -//.word 0xbb87af44 -//.word 0x4c0ea4fb -//.word 0x9ff0b7df -//.word 0xdbbff94c -//.word 0x3ddd15ce -//.word 0x724dd891 -//.word 0x44c3f119 -//.word 0x79fdf533 -//.word 0xf856a62c -//.word 0x2e997440 -//.word 0xb0134455 -//.word 0x22ec71ea -//.word 0x57b7104a -//.word 0xb9477905 -//.word 0xecc403a0 -//.word 0xaeff0e8c -//.word 0x02034755 -//.word 0x8ded271c -//.word 0x40fdbd47 -//.word 0x37ecae77 -//.word 0xe1807aba -//.word 0x625f0003 -//.word 0x352145d7 -//.word 0x16a87148 -//.word 0x1fb41a27 -//.word 0x31b2c576 -//.word 0x95d5aa1c -//.word 0xe368b8dc -//.word 0x2363d988 -//.word 0x333c7772 -//.word 0x69ff3f24 -//.word 0x78a12551 -//.word 0x9892a80b -//.word 0xe1915735 -//.word 0xf8c4943c -//.word 0xee089802 -//.word 0x6586b71b -//.word 0xf587e53c -//.word 0xce897af0 -//.word 0x9e91328d -//.word 0xb5c47867 -//.word 0x6731e443 -//.word 0xb1f2020f -//.word 0x207355d0 -//.word 0xef119bdb -//.word 0x6fe75348 -//.word 0xace47da4 -//.word 0x4e21a1e6 -//.word 0xbd7212a4 -//.word 0x893c7487 -//.word 0x08867cfd -//.word 0x4152f72d -//.word 0x082d0e30 -//.word 0x6b05c87e -//.word 0x4d3bd0a6 -//.word 0x51f97943 -//.word 0xfac6ff2b -//.word 0x105710e9 -//.word 0x45a88a6e -//.word 0x184c8703 -//.word 0xfa029782 -//.word 0xaf884cc6 -//.word 0xf8b4fc60 -//.word 0x6fc0c28b -//.word 0xb2e6c663 -//.word 0xc32cbe51 -//.word 0xaf82b5ca -//.word 0x6e0a0b39 -//.word 0x0bb7be39 -//.word 0x0519e708 -//.word 0xf4778838 -//.word 0x6f1f84a8 -//.word 0x2efaefb3 -//.word 0x6c6388a7 -//.word 0x8f398479 -//.word 0x0b338eb7 -//.word 0x84740bbd -//.word 0x3360a22c -//.word 0x8aadfc98 -//.word 0x1bbdc881 -//.word 0xb62b0385 -//.word 0xd1a476d3 -//.word 0x2df880e3 -//.word 0xb7701565 -//.word 0xad630777 -//.word 0x0104841a -//.word 0x027ee1e7 -//.word 0x394395fe -//.word 0x91a08940 -//.word 0xbc968fbe -//.word 0xd1e52f70 -//.word 0x3a69aa2b -//.word 0xcda939cd -//.word 0x39ae96bb -//.word 0xa411bd8d -//.word 0x9258f407 -//.word 0x0983094b -//.word 0xf3e1db4e -//.word 0xc3281b89 -//.word 0x5bc554f1 -//.word 0x2d712928 -//.word 0xa105dff5 -//.word 0xb78f1bf2 -//.word 0xeea5ec84 -//.word 0x64f90b10 -//.word 0x3e2e626c -//.word 0x4aeacc94 -//.word 0xe32d1c9f -//.word 0x16e160f1 -//.word 0x03b267b1 -//.word 0x851f807e -//.word 0x15d1855d -//.word 0xeb2c18f6 -//.word 0x67252d01 -//.word 0xb053c9fb -//.word 0x9b48081d -//.word 0xce21658e -//.word 0x255c36d8 -//.word 0x54ea7699 -//.word 0xce85c77b -//.word 0xe644b765 -//.word 0x346d43f3 -//.word 0x3b8a9a24 -//.word 0x48bf2353 -//.word 0x9d5ac069 -//.word 0xcfac5550 -//.word 0x6d1884ab -//.word 0xe269bbc4 -//.word 0x9d6871c5 -//.word 0x6fafac2c -//.word 0x34b8c779 -//.word 0xb5397229 -//.word 0xcdb4fae8 -//.word 0xcb49cb03 -//.word 0x18d0331c -//.word 0x1a246821 -//.word 0x57c1cd7f -//.word 0xde927192 -//.word 0xe304d860 -//.word 0xa95fff88 -//.word 0xa5569a75 -//.word 0xe0dda0d7 -//.word 0x9d3a0954 -//.word 0x3c5fd77a -//.word 0x5e7753f9 -//.word 0x4abf990f -//.word 0x8f975643 -//.word 0xebd9d156 -//.word 0x6c692877 -//.word 0xd50ddcb6 -//.word 0x437f90bb -//.word 0x10c10eb8 -//.word 0xf8b18b9c -//.word 0x7add2c8a -//.word 0x8198c989 -//.word 0x444ef07d -//.word 0x6b142d56 -//.word 0x73838887 -//.word 0x53c750b9 -//.word 0x60f317c1 -//.word 0x6e97fed0 -//.word 0x389533ea -//.word 0x0230b79a -//.word 0x7c6665e3 -//.word 0xea803079 -//.word 0x82e7ac32 -//.word 0x1539d0b7 -//.word 0xf29cfa7f -//.word 0x085333fe -//.word 0x4a8fb419 -//.word 0x5887aade -//.word 0x5bca3772 -//.word 0x30d4b94a -//.word 0xcae04e9e -//.word 0xd1fe981b -//.word 0x8f65bdd9 -//.word 0x0d0ab28c -//.word 0x7972bafe -//.word 0xcbc429bd -//.word 0xa9226e10 -//.word 0x87395030 -//.word 0x121778b5 -//.word 0xcf3d304f -//.word 0xfff66ab6 -//.word 0xc7e704e4 -//.word 0x8de64a81 -//.word 0xa510bd9f -//.word 0x2d1513a7 -//.word 0x35d77e93 -//.word 0x2434315e -//.word 0x561f21b9 -//.word 0x0af60800 -//.word 0x7c0fb06c -//.word 0x4e956e8a -//.word 0x2c92ecec -//.word 0xb04c2c1e -//.word 0x83d5cadb -//.word 0xc6de8281 -//.word 0xb0ccf1c3 -//.word 0x780ea09e -//.word 0x75ad3e8e -//.word 0x84242d01 -//.word 0xaa73410c -//.word 0xfa6fc45d -//.word 0xb95cbd71 -//.word 0xc1bd7107 -//.word 0x236b2bd4 -//.word 0x10e53978 -//.word 0xfae737b1 -//.word 0xf63e90ce -//.word 0x65da4167 -//.word 0xd325e04c -//.word 0x1f93ddbb -//.word 0xdc7a09d6 -//.word 0xf8255453 -//.word 0x9b24db76 -//.word 0x52e5223c -//.word 0x6d899dda -//.word 0xa6f07665 -//.word 0x03168ad3 -//.word 0xfda3b522 -//.word 0xe1bd4fd7 -//.word 0x7721f6aa -//.word 0xe2728e80 -//.word 0xc7d08799 -//.word 0xb1ad5e0b -//.word 0xb4dc676f -//.word 0x51ebc9da -//.word 0x9ab3ca0f -//.word 0x962d4df2 -//.word 0xe7889840 -//.word 0xaa785b7e -//.word 0x9fd0ee2f -//.word 0x8a53db4a -//.word 0xd9c79ceb -//.word 0x864ca649 -//.word 0x3feca6e8 -//.word 0xc5730a10 -//.word 0x9281c37d -//.word 0xbedd4958 -//.word 0x230ce066 -//.word 0xc0231b80 -//.word 0x5bd99e43 -//.word 0x6ae02708 -//.word 0x3476d016 -//.word 0x34378e17 -//.word 0xbe35fec9 -//.word 0xe54a61f6 -//.word 0x9bade4a6 -//.word 0x1ac42693 -//.word 0x8339f4dd -//.word 0xc55057ff -//.word 0xc178d002 -//.word 0xac20e2f1 -//.word 0xb4cbd18c -//.word 0xe667aa40 -//.word 0x4fda8357 -//.word 0x61df046d -//.word 0x99102623 -//.word 0x5f433b17 -//.word 0x2e1a2f13 -//.word 0xf4d60d84 -//.word 0xbc6cc42e -//.word 0x8adb2c1f -//.word 0x86bc44e1 -//.word 0x5d1bbef4 -//.word 0xe585bd7b -//.word 0x0062dd36 -//.word 0xc28674b0 -//.word 0xd60217ba -//.word 0x1d406017 -//.word 0x994fef79 -//.word 0x8a7bafad -//.word 0xd6215a12 -//.word 0xaec1404f -//.word 0x6f554445 -//.word 0xc6e12743 -//.word 0x184c0979 -//.word 0x216e2cb0 -//.word 0xdb6afc38 -//.word 0xa13e4c21 -//.word 0x9498e3ae -//.word 0x3eec3706 -//.word 0x75c3782d -//.word 0x8256d033 -//.word 0x835beaab -//.word 0x0e1fb15f -//.word 0x17d55a42 -//.word 0x142da4a6 -//.word 0x5e295eaf -//.word 0xdb2d2a08 -//.word 0xda5582d4 -//.word 0x3e0af8e8 -//.word 0xdfd8c237 -//.word 0x2d7a758d -//.word 0x17371181 -//.word 0x2b723ea5 -//.word 0xfe7cd5ff -//.word 0xceaca2bd -//.word 0x66b26924 -//.word 0x422826ca -//.word 0xf46a9905 -//.word 0xc6a802a3 -//.word 0xa1392adb -//.word 0x2d32a284 -//.word 0x3a384f85 -//.word 0x5f92278d -//.word 0xe0823504 -//.word 0xd5d6e341 -//.word 0x89ba78fd -//.word 0x21d0e007 -//.word 0x7e83ac3a -//.word 0x649859ad -//.word 0xdb05d529 -//.word 0xd5073fe0 -//.word 0x126fee5b -//.word 0x413cb6b5 -//.word 0x686f6607 -//.word 0x851b9523 -//.word 0x76bc9f85 -//.word 0x16c9ea86 -//.word 0xa98d6ed3 -//.word 0x7a32741e -//.word 0xc21f9d13 -//.word 0xcc84278e -//.word 0x57326c0b -//.word 0x3cb1ab5e -//.word 0x508c0ba4 -//.word 0x8cf0dd79 -//.word 0x6b75226b -//.word 0x943c4daf -//.word 0xb93a4a13 -//.word 0xbfd3be34 -//.word 0x1fab91f1 -//.word 0x8cb9aa1f -//.word 0xd69df97e -//.word 0x0e33bbec -//.word 0xeb68f9d9 -//.word 0x6c4c52fb -//.word 0xbf69fb43 -//.word 0x6254040f -//.word 0x8881dda1 -//.word 0xbe5b18d0 -//.word 0xce9470fd -//.word 0xe3ba0b49 -//.word 0xef0cfc05 -//.word 0x4a8b0c6b -//.word 0x9c54ba8b -//.word 0xfc2c8087 -//.word 0x595d5803 -//.word 0x19c17fd8 -//.word 0x011c7908 -//.word 0x55ae55f7 -//.word 0x400932d8 -//.word 0x75210265 -//.word 0x17a28ed3 -//.word 0xd786bb05 -//.word 0x5ce60b00 -//.word 0xe710669f -//.word 0x37db1b87 -//.word 0xaa37225e -//.word 0xa608a438 -//.word 0x3735bc52 -//.word 0xf9fb8003 -//.word 0x39883bef -//.word 0x57c5fd7e -//.word 0x6e73568d -//.word 0x37795e63 -//.word 0x2b7cf8e6 -//.word 0xe8b1580e -//.word 0xd6efc39b -//.word 0x0a099603 -//.word 0x6b5a8aaf -//.word 0x13a13666 -//.word 0xf810d60a -//.word 0xcb9f4a82 -//.word 0x20a662f7 -//.word 0xd0ab5843 -//.word 0x9b789ea6 -//.word 0x1271dabb -//.word 0xb52530ab -//.word 0x5823bfa1 -//.word 0xcb0f6e7e -//.word 0xb9f5e8cd -//.word 0xd1dce5f9 -//.word 0x249facbd -//.word 0xcef8d5dd -//.word 0xd9de5414 -//.word 0x5e11b34d -//.word 0xedf39f16 -//.word 0x2f99a651 -//.word 0xca223f2c -//.word 0x85470b54 -//.word 0xad345a66 -//.word 0xb796f1a7 -//.word 0x26f60bf4 -//.word 0xb0459dfc -//.word 0x9cb8deac -//.word 0x6ed607eb -//.word 0xc6cf5788 -//.word 0x860f5b70 -//.word 0x33136c25 -//.word 0x9e7b796b -//.word 0xc3610745 -//.word 0xf1ea751f -//.word 0x2b1a854d -//.word 0xcfed18b4 -//.word 0x75a339c7 -//.word 0x1a5b5db6 -//.word 0x7ee3e9e1 -//.word 0xcacff593 -//.word 0x76c850ed -//.word 0x6a27c420 -//.word 0x63c39be0 -//.word 0x99066115 -//.word 0x9f47ecd3 -//.word 0x8a539a8c -//.word 0x554dda84 -//.word 0x84b9ee86 -//.word 0x08d3efd6 -//.word 0x63251166 -//.word 0x0c58284c -//.word 0x154b6b74 -//.word 0x0b627892 -//.word 0x1e21995b -//.word 0x81f946f5 -//.word 0x1461ebac -//.word 0x4129ebe6 -//.word 0x230be459 -//.word 0xee84357b -//.word 0x8be2bd3a -//.word 0x829de6ee -//.word 0x1deae28c -//.word 0xcb8e351c -//.word 0xc2f0746d -//.word 0xe8734c07 -//.word 0xf402c561 -//.word 0xd0edc854 -//.word 0x42f3e0d0 -//.word 0xcca03dce -//.word 0xd1d9fe85 -//.word 0xf8b5b0e1 -//.word 0xd68e1131 -//.word 0xc7581a20 -//.word 0x1c323de6 -//.word 0x7c3becbf -//.word 0x84a75a9c -//.word 0xb1128519 -//.word 0x801374b0 -//.word 0xd315bd2c -//.word 0x97624b60 -//.word 0xa4815e18 -//.word 0xe4c2d350 -//.word 0xb817a6a4 -//.word 0x9725b508 -//.word 0xf99bc7b9 -//.word 0x73c3cc74 -//.word 0x235767e5 -//.word 0x4e95a962 -//.word 0x489520d9 -//.word 0x94db1007 -//.word 0x4d2900eb -//.word 0xc496787b -//.word 0x6be40a95 -//.word 0xf20f8f38 -//.word 0xaf22b3f4 -//.word 0x434eb49f -//.word 0x7b3d664a -//.word 0x74a47b73 -//.word 0x0318017d -//.word 0x53222c5d -//.word 0xd0955695 -//.word 0x441f4466 -//.word 0x401fab41 -//.word 0xbeb6f280 -//.word 0x04213a53 -//.word 0xcc469cfd -//.word 0xa18cb140 -//.word 0x8cf05815 -//.word 0xf056b3a1 -//.word 0xb31c7365 -//.word 0x9ef556b5 -//.word 0x07f5ed6b -//.word 0xade8a3dc -//.word 0xe3e8fb0b -//.word 0xf12f191d -//.word 0xb729840d -//.word 0x93cd2aa1 -//.word 0x852ea59d -//.word 0x914dbc36 -//.word 0x65322dc9 -//.word 0x3c3baacd -//.word 0x02b32107 -//.word 0xb9a640fc -//.word 0x1bf439ac -//.word 0x81a5c27d -//.word 0x037c6076 -//.word 0xe1cfe6ad -//.word 0x22963803 -//.word 0x7ac1550e -//.word 0x71cf9557 -//.word 0xc29c2fc6 -//.word 0x017afd5a -//.word 0x8184841d -//.word 0x752f2f58 -//.word 0x5522db03 -//.word 0x8448987f -//.word 0x2f23ae88 -//.word 0x7863df65 -//.word 0xd4b7ec61 -//.word 0xb1e35b7f -//.word 0x5d13766a -//.word 0x236e97ab -//.word 0xb7efa31e -//.word 0xd470d5a7 -//.word 0x2308bd21 -//.word 0x5f978897 -//.word 0xb79f81b7 -//.word 0x7356d883 -//.word 0xdbf9a24a -//.word 0x546222d7 -//.word 0xcddd47e8 -//.word 0x593875e2 -//.word 0x1d1989c2 -//.word 0x6d941757 -//.word 0x32fdf5af -//.word 0x8ffbfecf -//.word 0xc4de10a6 -//.word 0x52335744 -//.word 0x6095ce48 -//.word 0x5dc60297 -//.word 0xe7fe1a54 -//.word 0xeb82140c -//.word 0x0e795130 -//.word 0x4cfb54c9 -//.word 0xdf6cc767 -//.word 0x6308be5a -//.word 0x37be4025 -//.word 0x26420430 -//.word 0x475e78bd -//.word 0x2189071d -//.word 0x13ba9c24 -//.word 0xf47e62da -//.word 0xf649cf73 -//.word 0xd009e082 -//.word 0x1c01a669 -//.word 0xfdd50114 -//.word 0x06e1ace7 -//.word 0x57cf79f4 -//.word 0x0969de72 -//.word 0xcdabb16a -//.word 0xcf1d30b4 -//.word 0xe1604422 -//.word 0xd50607fb -//.word 0x2aa783ab -//.word 0xec30bdb8 -//.word 0xd57ff2f8 -//.word 0xb82d2002 -//.word 0x20abc8e2 -//.word 0x3491f211 -//.word 0xdd3273a4 -//.word 0x2b746bc3 -//.word 0xf5df115d -//.word 0xc0f3b31a -//.word 0xe2bff891 -//.word 0xe8af69bc -//.word 0x34a62fa8 -//.word 0xeb4c1e71 -//.word 0x0eaaf36e -//.word 0xe6f4daa9 -//.word 0xa6a53492 -//.word 0x4cd196f4 -//.word 0xc8b71527 -//.word 0x6097c188 -//.word 0x53c36f26 -//.word 0xbcf7bcbe -//.word 0xbaed4eea -//.word 0xce2d5d95 -//.word 0x842372b2 -//.word 0x56736f2d -//.word 0xcd91d022 -//.word 0xe98c304e -//.word 0xc32a0fc3 -//.word 0x713ad2df -//.word 0x2a260b7e -//.word 0xaac8fb6f -//.word 0xd87e5625 -//.word 0xa78145af -//.word 0x3a72b1eb -//.word 0x4b36bff6 -//.word 0xcd0497e6 -//.word 0xd0bc6abc -//.word 0xa67bb394 -//.word 0x446cbd1f -//.word 0xeae16553 -//.word 0x07a22161 -//.word 0x578441e8 -//.word 0x4e3e7568 -//.word 0xb97990f9 -//.word 0xa3268b3d -//.word 0x7514cd93 -//.word 0x62c2a98d -//.word 0x027229a5 -//.word 0x3d7e0a2b -//.word 0x6bef0782 -//.word 0xb94c5b8c -//.word 0xcfb08163 -//.word 0xb01f3e4a -//.word 0xe11ae1e3 -//.word 0xcd71caa2 -//.word 0x68592981 -//.word 0x13be08f5 -//.word 0xc0db8c21 -//.word 0x5607774a -//.word 0x57d2f28c -//.word 0xc0508acb -//.word 0x30b578ec -//.word 0x4d222544 -//.word 0x63bfed50 -//.word 0x4f0a23a7 -//.word 0x9c6f562e -//.word 0xeb18d38b -//.word 0x98066bdc -//.word 0x9a6177a8 -//.word 0xab0c1915 -//.word 0xaa7dc45c -//.word 0x3dccfe7b -//.word 0xba09642a -//.word 0x48d3ef0f -//.word 0x41267735 -//.word 0xdb7575bb -//.word 0x08f90dc9 -//.word 0x9a484cc8 -//.word 0xab29aed3 -//.word 0x3ca7e368 -//.word 0x1c64d264 -//.word 0x0c30df2e -//.word 0x20da6932 -//.word 0x68469791 -//.word 0xd0c05516 -//.word 0x4590996d -//.word 0x19cfeb8f -//.word 0xa9792481 -//.word 0x3dc3763e -//.word 0x2faeacf2 -//.word 0x50dcb368 -//.word 0x87a25ac6 -//.word 0xbb605678 -//.word 0xf30d896a -//.word 0xbc16847a -//.word 0xcc694a2d -//.word 0xe4cc56a0 -//.word 0xfb74e0c2 -//.word 0x98d35dc1 -//.word 0x80b145c2 -//.word 0x917e18d5 -//.word 0xeee7a328 -//.word 0x5ca7807b -//.word 0xeca0dcd3 -//.word 0xdb2a7c73 -//.word 0xb6ab0208 -//.word 0xc1686d24 -//.word 0x9a9ae0ed -//.word 0x1ac5a417 -//.word 0x7c456f0f -//.word 0xc129e779 -//.word 0x524562dd -//.word 0xe883f09d -//.word 0xa97a9b2b -//.word 0x9442ed78 -//.word 0x1e86b3b0 -//.word 0x1dda0124 -//.word 0xe64f7688 -//.word 0xb245c15e -//.word 0x478164b2 -//.word 0xd480b808 -//.word 0x1c0a3293 -//.word 0xd60ae4a7 -//.word 0x549c4771 -//.word 0x646837e6 -//.word 0x742f3ff9 -//.word 0xf9a31711 -//.word 0x117c6bba -//.word 0x66c8de9a -//.word 0x56824fa8 -//.word 0x52675b98 -//.word 0x84052399 -//.word 0xb5154f43 -//.word 0x6d0a53cb -//.word 0x5ceaf07a -//.word 0xf85dfe5d -//.word 0x68046a3d -//.word 0xa10b7bd1 -//.word 0xcf025933 -//.word 0xf6e8cf91 -//.word 0xd9895025 -//.word 0x1b0b3867 -//.word 0xa4c35581 -//.word 0x464da603 -//.word 0xa0db62d8 -//.word 0x43cd3c79 -//.word 0x1482e660 -//.word 0xf26ed4c0 -//.word 0x986d4273 -//.word 0xc4577833 -//.word 0x99d54d0e -//.word 0x4173ea14 -//.word 0xd8f6d053 -//.word 0x85ef1d05 -//.word 0xea900a07 -//.word 0xbfbfb98d -//.word 0xb9692e15 -//.word 0xb1199b99 -//.word 0x02c9e009 -//.word 0x33f852f8 -//.word 0xd6fcbb96 -//.word 0xaf9aa3de -//.word 0x19d4ce10 -//.word 0xa6020662 -//.word 0x06241bf2 -//.word 0x2a772700 -//.word 0xa846165a -//.word 0x62036617 -//.word 0x63962c88 -//.word 0x09f5586c -//.word 0x69f53963 -//.word 0xef6044a6 -//.word 0x454711f4 -//.word 0x7699a6d0 -//.word 0x54f5f8e9 -//.word 0x17bdafda -//.word 0x466c2a13 -//.word 0xdb29c317 -//.word 0xa29c54e9 -//.word 0xe200fac0 -//.word 0x3f791802 -//.word 0xdfa89f70 -//.word 0xcc7d8d9e -//.word 0x994db4a7 -//.word 0x4925bd1e -//.word 0x6c5d6c48 -//.word 0x8b702688 -//.word 0xc60bb01a -//.word 0xbc633904 -//.word 0xabcc9b4a -//.word 0xd888de62 -//.word 0x32dcfde7 -//.word 0x3269ed92 -//.word 0x05badc65 -//.word 0xed1ab729 -//.word 0xe5a8ee1b -//.word 0x84ad7be3 -//.word 0x232c21c5 -//.word 0x42bbf11b -//.word 0x28921303 -//.word 0xcae2c355 -//.word 0xee689ad8 -//.word 0x90410fb5 -//.word 0x85003d2b -//.word 0x5efee785 -//.word 0x8ff1b949 -//.word 0xd1c0d0b3 -//.word 0xc4967d61 -//.word 0xd9364650 -//.word 0x6f8e2e07 -//.word 0x3c8e3712 -//.word 0xef3a24b2 -//.word 0x13fe83d3 -//.word 0x3742eb3e -//.word 0x4c3f8310 -//.word 0x4e11c36b -//.word 0x270d7f6b -//.word 0xd054215c -//.word 0xb9a8362a -//.word 0x6b7f2c18 -//.word 0x6c5659b5 -//.word 0x6248400d -//.word 0x7cdf101c -//.word 0x0e2a6e88 -//.word 0x7b10748f -//.word 0x58e3fa3d -//.word 0xce3914e3 -//.word 0x40f7dbc6 -//.word 0x2eae7114 -//.word 0x5a2b3f1c -//.word 0x294981bd -//.word 0x4b0a051f -//.word 0x9ee62fa2 -//.word 0x50634114 -//.word 0x45e6d927 -//.word 0xb8c9bc22 -//.word 0x24add1d6 -//.word 0x651271d4 -//.word 0x1a25dedd -//.word 0x4fd8109a -//.word 0x5938b88d -//.word 0x00fc7f48 -//.word 0xe4598edd -//.word 0x191e5495 -//.word 0x15fc83e5 -//.word 0xcc255c9d -//.word 0x191a2d63 -//.word 0x60bd1860 -//.word 0x72ae1539 -//.word 0xb0d43a41 -//.word 0x743a3bed -//.word 0xac1d2d88 -//.word 0xc8438f27 -//.word 0xd78e8ae0 -//.word 0xecd07837 -//.word 0xc7e1a4d9 -//.word 0xb1ef508d -//.word 0xa816fd67 -//.word 0xbc30e63e -//.word 0xb9efce61 -//.word 0x0629fb86 -//.word 0xcd728303 -//.word 0x5cf0c641 -//.word 0xcc6b3c6d -//.word 0xe0a47170 -//.word 0x2fe84d22 -//.word 0x86e499ba -//.word 0x88bbbf8a -//.word 0x9756d1e9 -//.word 0xf8fccd70 -//.word 0x31222069 -//.word 0xb6846884 -//.word 0xc5747ecc -//.word 0x8f72b4da -//.word 0x98fe5b48 -//.word 0x60aa8969 -//.word 0x43731937 -//.word 0x9e51f28d -//.word 0x330d8d97 -//.word 0xcf53b186 -//.word 0x2a088188 -//.word 0x0eddb9f7 -//.word 0xbb2535d0 -//.word 0x8be4b368 -//.word 0xd228d95a -//.word 0x089c7ac4 -//.word 0x2a5a15b3 -//.word 0x5d019edb -//.word 0xd507818c -//.word 0xf551e5e1 -//.word 0xb7012d3b -//.word 0x4f90c5ed -//.word 0x0b1c1b39 -//.word 0x7e03eb7c -//.word 0xddb0c0a5 -//.word 0xa9b5b8eb -//.word 0x8e1a87c0 -//.word 0x8cf5be00 -//.word 0x543b4e6f -//.word 0xf5d64762 -//.word 0xb7f8e6bc -//.word 0x47aecf1c -//.word 0x15b89755 -//.word 0xfb98851f -//.word 0x1fe99a0c -//.word 0x1af2cebd -//.word 0x5a7b9d55 -//.word 0xc4dfc22e -//.word 0x9e6343cb -//.word 0xadc6ad0e -//.word 0x9a1aa1ab -//.word 0x9bd28fdd -//.word 0x4f1bc258 -//.word 0xe9709d7e -//.word 0x906824d5 -//.word 0x06d3beb9 -//.word 0x8806384e -//.word 0xf6730eb9 -//.word 0x347de690 -//.word 0xd08a5e8e -//.word 0xe559078c -//.word 0x3f96b1ac -//.word 0xbfabead8 -//.word 0x01dac16b -//.word 0x3d88d02d -//.word 0x6bdc7985 -//.word 0xab896fea -//.word 0xe3e8789b -//.word 0xaa4a7290 -//.word 0x658c94b0 -//.word 0xafecf744 -//.word 0xff1a55ac -//.word 0x84931050 -//.word 0x542a76da -//.word 0xc6e743a3 -//.word 0x1c15676a -//.word 0x66970a4c -//.word 0xa37bcef0 -//.word 0x28d25403 -//.word 0x46be01e4 -//.word 0x27cc02a0 -//.word 0xf9848d20 -//.word 0x4e3f6aa1 -//.word 0xc339b365 -//.word 0xe0e7d8a8 -//.word 0x408be5d6 -//.word 0xf20508fb -//.word 0x1eec4e7b -//.word 0xecddad03 -//.word 0xa11347bf -//.word 0x0c38edce -//.word 0x207be2f3 -//.word 0xe2e3e28d -//.word 0x86e363c9 -//.word 0xd42e1b16 -//.word 0xd1ccc2d9 -//.word 0x9c6e1962 -//.word 0x96ff2b1f -//.word 0xc57bd310 -//.word 0x7b047e7b -//.word 0x323332e1 -//.word 0xbbacd030 -//.word 0x98f5963a -//.word 0xa688e766 -//.word 0xff264fa6 -//.word 0x1e6fc2a9 -//.word 0x44b02451 -//.word 0x1bfc0f67 -//.word 0x997ed08e -//.word 0x280db275 -//.word 0x04018051 -//.word 0xe445458b -//.word 0xdcae56b5 -//.word 0x828b92c3 -//.word 0x507ee978 -//.word 0x498a1b1e -//.word 0xdf6cc27a -//.word 0x152f93ff -//.word 0xe1fbe142 -//.word 0xd42e62ae -//.word 0xfcad3679 -//.word 0x0a7d25d6 -//.word 0xb08d296d -//.word 0x4dd62c08 -//.word 0xcca6128f -//.word 0xc939fa36 -//.word 0xf68ac1f5 -//.word 0xbe68c839 -//.word 0x28ccf8d9 -//.word 0xfd6a034b -//.word 0x2d86ec18 -//.word 0x6f09c98d -//.word 0x28d4c8b3 -//.word 0x8e547082 -//.word 0x0d572952 -//.word 0xea1eff92 -//.word 0x26b3a3bc -//.word 0xa57db288 -//.word 0x8f113a61 -//.word 0xf74b7b15 -//.word 0xba9eead0 -//.word 0xaaa87c4b -//.word 0xec092041 -//.word 0x9f768d23 -//.word 0xbe093f0c -//.word 0x48dbbcf7 -//.word 0x9ed51c30 -//.word 0x2cc3c808 -//.word 0x4baa82cd -//.word 0x665ca6f9 -//.word 0x5c49afaa -//.word 0x2698fc52 -//.word 0xba77d5b0 -//.word 0x2fafa9ff -//.word 0x217b996d -//.word 0x579a3bce -//.word 0xa3a39792 -//.word 0x0a9976f4 -//.word 0x25bfdd75 -//.word 0xc7add489 -//.word 0xe1a46b90 -//.word 0xa21fff07 -//.word 0xe2aaba00 -//.word 0xc0f759cf -//.word 0x8a2f3207 -//.word 0xde8675a5 -//.word 0x0f12b28a -//.word 0xcadd9b2f -//.word 0xfa390c94 -//.word 0xe8534879 -//.word 0xa70b86d1 -//.word 0xaf03ac74 -//.word 0xc8f65a14 -//.word 0x2a4c2a72 -//.word 0xe2eb36d1 -//.word 0x774fdbab -//.word 0xceddbda4 -//.word 0x4b740bbc -//.word 0x394605c8 -//.word 0x6ce6bb23 -//.word 0x24a117a1 -//.word 0x35121dc4 -//.word 0x65f17233 -//.word 0x162c1b67 -//.word 0x253988a8 -//.word 0x11aad138 -//.word 0x60023fce -//.word 0x3ec70e45 -//.word 0x68d87196 -//.word 0x4801d704 -//.word 0x61cd6d96 -//.word 0xee9be4ca -//.word 0xc6f47488 -//.word 0x831c2155 -//.word 0xe3e73dc9 -//.word 0x6fce2e43 -//.word 0x5a4271db -//.word 0xab41df98 -//.word 0x9f262fe4 -//.word 0x48c5bd3c -//.word 0x7bb7892c -//.word 0xe9f3837b -//.word 0x8c9e06a3 -//.word 0x4525a283 -//.word 0xc3881e58 -//.word 0xa6f9bdea -//.word 0xe4a5c103 -//.word 0x6cd22e25 -//.word 0x0a2ad07c -//.word 0x8b567f12 -//.word 0x21cfa242 -//.word 0x09f1f26f -//.word 0x6a5281f6 -//.word 0x8151fa60 -//.word 0xfbf22add -//.word 0xa2e9bfee -//.word 0x3cf45061 -//.word 0xb06e9e82 -//.word 0x6b221a90 -//.word 0x025da76e -//.word 0x1947a09b -//.word 0x83721d64 -//.word 0xabb47258 -//.word 0x3232f9fd -//.word 0xd9be12c1 -//.word 0xa2636733 -//.word 0x323d7573 -//.word 0x7a8e48e7 -//.word 0x960f8530 -//.word 0xf584ae5d -//.word 0xbb93a25e -//.word 0x63d663bb -//.word 0xa92f1c86 -//.word 0xa75c638e -//.word 0x3ecbbbd5 -//.word 0xb7af5d44 -//.word 0xaa53389e -//.word 0x1fae36b3 -//.word 0xf439c1d6 -//.word 0x7ffd8690 -//.word 0x73f07896 -//.word 0x088118f9 -//.word 0x5672f49d -//.word 0x02e66eec -//.word 0x1dbbbfcb -//.word 0x49193ccd -//.word 0x1e4bd7a7 -//.word 0xcccee8e5 -//.word 0x01a82edb -//.word 0x0dfb10dd -//.word 0x44da29b3 -//.word 0xa35b0447 -//.word 0xb7ee24a1 -//.word 0xbbed4815 -//.word 0x0174edbb -//.word 0x93721320 -//.word 0x1900443b -//.word 0xfdf2d3a3 -//.word 0xceac62ff -//.word 0xe238a6bd -//.word 0x40956f07 -//.word 0xbc51e2f2 -//.word 0x645a09f9 -//.word 0x1b118fab -//.word 0x84a0c4a0 -//.word 0x228de7b1 -//.word 0xbd90a568 -//.word 0x07a2ddb6 -//.word 0x7f57a6e4 -//.word 0x966d93cc -//.word 0x10a53649 -//.word 0xaed1e2ec -//.word 0x0a2fb5f1 -//.word 0xc2f5d671 -//.word 0xd82dfcd9 -//.word 0x59c3309a -//.word 0x3dddd322 -//.word 0x8f6ae20c -//.word 0xcefe7993 -//.word 0x92dd964d -//.word 0x72562016 -//.word 0x26522849 -//.word 0xe92c6e37 -//.word 0x21c327d1 -//.word 0x42cefda8 -//.word 0xf0705818 -//.word 0x640ddcbf -//.word 0x105b3334 -//.word 0x86bc0cf6 -//.word 0x96cb63a3 -//.word 0xb634036b -//.word 0xa8ca4ac3 -//.word 0x56d32d5e -//.word 0x01a67b59 -//.word 0x9a7966b6 -//.word 0x70743f0b -//.word 0x0c0a817b -//.word 0x598811e6 -//.word 0x09eec45d -//.word 0x33ff22d9 -//.word 0x41946a2c -//.word 0x0935d637 -//.word 0x3aea1f5e -//.word 0xfa4f4439 -//.word 0xcde7888c -//.word 0xb9b2b97a -//.word 0xa802b8f5 -//.word 0x0d8a3679 -//.word 0xcab8bcfa -//.word 0x5245ee1b -//.word 0x0a0a10a0 -//.word 0xf615c926 -//.word 0x91fc2711 -//.word 0xfc71e4c7 -//.word 0x5b17e81c -//.word 0x7d940e0c -//.word 0xbbe82bb0 -//.word 0x22fd4d6b -//.word 0xd47e4065 -//.word 0xabed573a -//.word 0x20f068f3 -//.word 0x6bec1935 -//.word 0xecd55ab8 -//.word 0xca4533fb -//.word 0xdacbc036 -//.word 0xc2857a91 -//.word 0x5ef1b793 -//.word 0x620075dd -//.word 0x416c5318 -//.word 0x4e4ce02c -//.word 0x21e618b2 -//.word 0x3dc42cad -//.word 0xf00a8274 -//.word 0x7a06fdf3 -//.word 0x71097e13 -//.word 0x6375ab77 -//.word 0xbe18ef69 -//.word 0xedb8c114 -//.word 0xc4ef2af3 -//.word 0x1e3a8189 -//.word 0xc44c7a53 -//.word 0x91a85ffb -//.word 0xd46e9cce -//.word 0xf6758170 -//.word 0x5d9b44ce -//.word 0x8f594555 -//.word 0x9b9b9662 -//.word 0xb5cebbf9 -//.word 0x203aaeb9 -//.word 0x5192270f -//.word 0x51c919ab -//.word 0x63288030 -//.word 0xe79e5a30 -//.word 0x7e57f357 -//.word 0x6f8f66e6 -//.word 0x49a96163 -//.word 0xca7b288f -//.word 0x00eddd99 -//.word 0xaec2fe91 -//.word 0xf1b52f1f -//.word 0x23c83a75 -//.word 0x00d95482 -//.word 0x0776a269 -//.word 0x23f2fb31 -//.word 0x8bb8f0be -//.word 0xe7e00900 -//.word 0xb400526a -//.word 0xe94516a6 -//.word 0xdbc2eb87 -//.word 0x5e07ee3f -//.word 0x2df650d2 -//.word 0x8cd212ca -//.word 0x2b990c2d -//.word 0x4e9434ac -//.word 0x2b2c1d1d -//.word 0x93ffbe2b -//.word 0xd533754c -//.word 0xe00a4cf4 -//.word 0xa7b77a09 -//.word 0xca712d96 -//.word 0x72c586c3 -//.word 0x7c30e505 -//.word 0xdbed6892 -//.word 0x370cae18 -//.word 0xdac4e1ae -//.word 0xcd0af30b -//.word 0x3e6227f5 -//.word 0x25f6d4fd -//.word 0x28e5666a -//.word 0xbbdda573 -//.word 0x8bec3ab1 -//.word 0x1d936ed3 -//.word 0xb21d3694 -//.word 0x6f2e6dea -//.word 0xba9f6080 -//.word 0xe7898f67 -//.word 0x14a0b209 -//.word 0x51c3fb5e -//.word 0x05d19b62 -//.word 0x8dbd87c6 -//.word 0x25e57ce5 -//.word 0x0c9f40fb -//.word 0xe3152c91 -//.word 0x5654e73c -//.word 0xff9f7487 -//.word 0x87096f2e -//.word 0x0f43938d -//.word 0xceb28057 -//.word 0xfbc4bb8b -//.word 0xed85f7a4 -//.word 0x816d9311 -//.word 0xbc7c63e4 -//.word 0xb18ab3ce -//.word 0xa5d8894b -//.word 0x72ea2b1a -//.word 0x2999e1f0 -//.word 0xfb64fc6d -//.word 0x5a07174f -//.word 0x5b4f9de6 -//.word 0x5f2c8cc8 -//.word 0xf20878c5 -//.word 0xf357d21d -//.word 0xf66f6af1 -//.word 0xe69a33f8 -//.word 0xef6a4673 -//.word 0x9a4d2a63 -//.word 0x3a6153f9 -//.word 0x888ae84e -//.word 0x8ac1ca54 -//.word 0xb9afd10d -//.word 0x627a59fa -//.word 0x4ddffdd7 -//.word 0x9d81a285 -//.word 0xf780b848 -//.word 0xe64ebc32 -//.word 0x7ebe01df -//.word 0x405eb163 -//.word 0x3e070e81 -//.word 0x80b2fe1e -//.word 0xa58dc7f4 -//.word 0xcd4f178b -//.word 0xb7c84765 -//.word 0x27bce079 -//.word 0x8bf15fe4 -//.word 0xdd8735da -//.word 0xcb8812e2 -//.word 0x16c06343 -//.word 0x38cf1ab9 -//.word 0x497cad6d -//.word 0x234c6124 -//.word 0xc554c8b7 -//.word 0xf54b88c3 -//.word 0x2ae35fa1 -//.word 0xa8596499 -//.word 0xed4b9052 -//.word 0x4ccb7c8d -//.word 0xd8b16c13 -//.word 0x83358dec -//.word 0x87bd7bd2 -//.word 0x05f306e6 -//.word 0xec1b36a1 -//.word 0x1da48d0c -//.word 0xcdfc8b34 -//.word 0x2aa978d8 -//.word 0x41965d66 -//.word 0x1faa5426 -//.word 0x369f01b4 -//.word 0x031261b3 -//.word 0xeed6c2c0 -//.word 0x728e13a5 -//.word 0x7d7b5ecf -//.word 0x1a929303 -//.word 0x4dd2874c -//.word 0x3ed43c38 -//.word 0x9aa46343 -//.word 0x37cf1f94 -//.word 0xf7bd0ce7 -//.word 0xee4180cb -//.word 0xc76f110d -//.word 0x63ae5774 -//.word 0xc40ef3ae -//.word 0x2adbcf8b -//.word 0x7b72a869 -//.word 0xe853caf0 -//.word 0xce781bff -//.word 0xdae55be5 -//.word 0x7181aad5 -//.word 0x4f244b94 -//.word 0x6ef1a775 -//.word 0x29e69587 -//.word 0xa1b1d80d -//.word 0x60c5e92e -//.word 0x3caef8ee -//.word 0x7ea12d5d -//.word 0x4458330e -//.word 0x241df7cb -//.word 0x1224ad87 -//.word 0x841d1594 -//.word 0xd40afc17 -//.word 0xe54e05b8 -//.word 0x0907a99e -//.word 0x229e7d9a -//.word 0x089db3a2 -//.word 0x2bc0e482 -//.word 0x7a4e0dce -//.word 0x83a9d71b -//.word 0xdb241b6e -//.word 0xc016a5f5 -//.word 0xfd2d38f5 -//.word 0x0e04d304 -//.word 0x85f73378 -//.word 0xac36991f -//.word 0x6c18cd31 -//.word 0x6db26382 -//.word 0x7fa93dfc -//.word 0x3944514d -//.word 0xdfc5acdd -//.word 0x89fab703 -//.word 0x820fba78 -//.word 0xefa69e0c -//.word 0xb129f797 -//.word 0x8c5f4233 -//.word 0x883e6aa8 -//.word 0x97019228 -//.word 0x797a0e3d -//.word 0xdda8b2ff -//.word 0xc98c508a -//.word 0x3b397caf -//.word 0x112b92ea -//.word 0x26d9fb94 -//.word 0xbe8dab5a -//.word 0x2474eeee -//.word 0x91f165fc -//.word 0x50374b60 -//.word 0x2017fd96 -//.word 0xda16ba72 -//.word 0x53c3a711 -//.word 0x8448160f -//.word 0xe83e07fa -//.word 0x26c6ef07 -//.word 0xf0d5b904 -//.word 0x2bcf0b8e -//.word 0x5058ca84 -//.word 0x1267e0bc -//.word 0x419b3df4 -//.word 0xeed31b0b -//.word 0xd0f98771 -//.word 0xe61e1ddc -//.word 0x5ecc133c -//.word 0xb69779f2 -//.word 0x21f6be3c -//.word 0x2c5177f4 -//.word 0xa15b5c7b -//.word 0xaba293f0 -//.word 0x3c6532a5 -//.word 0xaca5ffd3 -//.word 0xa37e7a8c -//.word 0x38b81df2 -//.word 0x5a9ae2a7 -//.word 0x6ffe0684 -//.word 0x3cab0c8e -//.word 0x05de0625 -//.word 0xf52a107f -//.word 0xc0821d55 -//.word 0x8695f6dc -//.word 0xfb5a7ff7 -//.word 0xc5eb3cab -//.word 0x259615d3 -//.word 0xda315615 -//.word 0x42affa14 -//.word 0xc3f129e7 -//.word 0x69deffcb -//.word 0xd0b68f14 -//.word 0x45a3286a -//.word 0x2892d731 -//.word 0x94402c49 -//.word 0x439841f8 -//.word 0xab3cf924 -//.word 0x6d6286c6 -//.word 0xf0e12e9b -//.word 0x498b4e1d -//.word 0x5fbe9fb1 -//.word 0x4c36b822 -//.word 0x0625d44e -//.word 0x3e86d61f -//.word 0x88ae8abd -//.word 0xbd242e02 -//.word 0x9db2312f -//.word 0xb9bc3add -//.word 0x91d16c36 -//.word 0xf980e964 -//.word 0xc16d944a -//.word 0x94a41c72 -//.word 0x212c3647 -//.word 0x79e02985 -//.word 0xb87a90ed -//.word 0xe8f15b3d -//.word 0x2205185f -//.word 0xf61771e1 -//.word 0x0e3ff5a5 -//.word 0x0d991bda -//.word 0xbddf832a -//.word 0x6a3d8035 -//.word 0x8960d43f -//.word 0x9ed1ba25 -//.word 0x5c812a96 -//.word 0x0da5587f -//.word 0x34c37ec7 -//.word 0x710ddb3d -//.word 0xa6effbcf -//.word 0x58e43afc -//.word 0x588d848c -//.word 0xa2045e7e -//.word 0x856e2a42 -//.word 0x04cfa628 -//.word 0x7d23b719 -//.word 0x88aa6585 -//.word 0x2283269c -//.word 0x0b7c5fc1 -//.word 0x6c29283b -//.word 0xbd33502e -//.word 0xe6f3a0ca -//.word 0xa43f64c3 -//.word 0x2f842801 -//.word 0x1a15c098 -//.word 0x7ac38bfa -//.word 0x4aaef86c -//.word 0x0e5b48b6 -//.word 0xb706961f -//.word 0xc7391598 -//.word 0xb59d9a38 -//.word 0x93115ae8 -//.word 0xeef9f460 -//.word 0xf6d8b252 -//.word 0xde220be4 -//.word 0x864b6d64 -//.word 0x58243a37 -//.word 0x70671113 -//.word 0xff904e6f -//.word 0xf1efd437 -//.word 0xcdfc0ac3 -//.word 0xddea230a -//.word 0x907fa313 -//.word 0x1c221ead -//.word 0x67364360 -//.word 0x28a61aa3 -//.word 0x49c18a4f -//.word 0x91491e54 -//.word 0x7fc609ab -//.word 0x7920678c -//.word 0x266dc5e0 -//.word 0x1808e4f9 -//.word 0xaee3ba81 -//.word 0x381ebab0 -//.word 0x5dd855c2 -//.word 0xba45c1a9 -//.word 0xcc00f9ff -//.word 0x10a3053e -//.word 0x68967b33 -//.word 0xc12446b0 -//.word 0xf3d4a682 -//.word 0xe8f678a2 -//.word 0x017cb8b0 -//.word 0xb50b449c -//.word 0x7c52e2a7 -//.word 0xeb9b858a -//.word 0x209fccf4 -//.word 0x609fcc3a -//.word 0xffb00f4a -//.word 0x8057dce2 -//.word 0xfe55b9ff -//.word 0xcbc42f97 -//.word 0x5663cd8a -//.word 0x522f70d7 -//.word 0x1433c10b -//.word 0x3da0fe00 -//.word 0x9a20fec3 -//.word 0x48686fd6 -//.word 0x1c0c6398 -//.word 0x41980b01 -//.word 0x23dcc192 -//.word 0x8c874c8c -//.word 0x0df86061 -//.word 0xa0506568 -//.word 0x8bcc79d4 -//.word 0x8852b8e7 -//.word 0x2249bb63 -//.word 0x62ae5e42 -//.word 0xab64c7a6 -//.word 0xe3cca413 -//.word 0xd396b3dc -//.word 0xd1d788db -//.word 0x9c5b8b65 -//.word 0x873c407d -//.word 0xdab3cb48 -//.word 0x752fb3c2 -//.word 0xb6a4e6ae -//.word 0x9d26fdd3 -//.word 0x2eb6c265 -//.word 0x175cefc2 -//.word 0x9376395f -//.word 0x8e4f8d01 -//.word 0x0af39a30 -//.word 0xc1428fe8 -//.word 0x0c442693 -//.word 0x03bce134 -//.word 0xe60093e5 -//.word 0xbc072383 -//.word 0x39c48da8 -//.word 0xe5b229d9 -//.word 0x7bb13001 -//.word 0x8f107c1e -//.word 0x74eb8f3b -//.word 0x5db7d79e -//.word 0xc21b3142 -//.word 0x0601ab88 -//.word 0x56ee8e29 -//.word 0xd48e9c6f -//.word 0xf59496a5 -//.word 0x27c101cc -//.word 0xb8412a8f -//.word 0xf33e6879 -//.word 0x8cb0a166 -//.word 0x3e720f37 -//.word 0xb29b44ca -//.word 0xa30b6c2a -//.word 0x4044d302 -//.word 0xd17ca758 -//.word 0x9ef0fe77 -//.word 0x0c7a1a2d -//.word 0x0a66ec37 -//.word 0xab82d8fa -//.word 0x1474b874 -//.word 0x99502371 -//.word 0x236aef02 -//.word 0xd569f42b -//.word 0xef9d13dc -//.word 0xf2937822 -//.word 0x05e61b9f -//.word 0x97578d38 -//.word 0x4620f10d -//.word 0xff8648ae -//.word 0x67aef38c -//.word 0x7ab172ad -//.word 0x72f272a4 -//.word 0xebb007c1 -//.word 0x44d73685 -//.word 0x481cb658 -//.word 0x0e48f77e -//.word 0x1dd46448 -//.word 0xd4b7e687 -//.word 0x0a7ca946 -//.word 0xf19722b9 -//.word 0x40f95170 -//.word 0x91e243d0 -//.word 0x07f7dcc4 -//.word 0x3594d3b0 -//.word 0x3b63fea7 -//.word 0x322ed0dd -//.word 0xcbf1205f -//.word 0x32342b01 -//.word 0x3997dd98 -//.word 0xb2af4c6a -//.word 0x1c1086e3 -//.word 0x83ab8c8a -//.word 0xa15b9e33 -//.word 0x49bab975 -//.word 0x06395f5e -//.word 0xff709666 -//.word 0x1db233a2 -//.word 0x70e5583a -//.word 0xcf903c1d -//.word 0xbf362af3 -//.word 0x97e3cd54 -//.word 0xe104aa37 -//.word 0x027beead -//.word 0x1ef36acf -//.word 0x3671dcf4 -//.word 0x932c7028 -//.word 0x689f86da -//.word 0xb3dcb6d5 -//.word 0x64231172 -//.word 0xc1b3aa0b -//.word 0x09e056b2 -//.word 0x5766af23 -//.word 0xcafd5ff8 -//.word 0xe32e9b1c -//.word 0x2e64ed82 -//.word 0x25463717 -//.word 0x5144f5f5 -//.word 0xb270c2d9 -//.word 0x61901ed7 -//.word 0x74716e4c -//.word 0x227e4415 -//.word 0x2890e1fe -//.word 0x6a08f87d -//.word 0xde1cb5a1 -//.word 0xa66efe45 -//.word 0x7ce3f989 -//.word 0x53b2ce83 -//.word 0x3bbbae31 -//.word 0x861b14b2 -//.word 0x29fd4ab6 -//.word 0x65b23034 -//.word 0xa605395b -//.word 0xabc8b6ca -//.word 0xe7b35703 -//.word 0x276fee1d -//.word 0x76ed77ba -//.word 0x3dfc5639 -//.word 0xaf1bdf2d -//.word 0x648b1b0d -//.word 0x44a9c92d -//.word 0xa77ba4ec -//.word 0xbb89e42f -//.word 0x25ee070f -//.word 0xebaed1cf -//.word 0x914a9211 -//.word 0x8292a749 -//.word 0xb2bb4371 -//.word 0x82b170ff -//.word 0xe4ae5014 -//.word 0xbf0ca9f6 -//.word 0x9558a0c0 -//.word 0x63a7c558 -//.word 0xc82d50a2 -//.word 0x6a0baaf3 -//.word 0x966930c9 -//.word 0x26c533b9 -//.word 0xa88a43a8 -//.word 0xbce5ad3e -//.word 0xbed44298 -//.word 0xa5805a3d -//.word 0x2bcc1954 -//.word 0x2f2ef114 -//.word 0x57be687b -//.word 0xf98c1c43 -//.word 0x3c370412 -//.word 0x7abbf8f1 -//.word 0xe98b74ff -//.word 0x7be09966 -//.word 0x0250748f -//.word 0x98a28392 -//.word 0x3ee175f1 -//.word 0xc3af3285 -//.word 0xe8dc1bb8 -//.word 0xc13793f5 -//.word 0x5ea4be5d -//.word 0xab6f88bc -//.word 0x95e0eabb -//.word 0x6e106957 -//.word 0x93fadf91 -//.word 0x4cd57d67 -//.word 0xf3a21104 -//.word 0x59018534 -//.word 0x6548a81a -//.word 0xfed63225 -//.word 0x2ba50240 -//.word 0x791fa949 -//.word 0x9e332cc5 -//.word 0x5ba706d2 -//.word 0xa7b06d5c -//.word 0x09c0d694 -//.word 0x469fbb9e -//.word 0x3cbd9c8a -//.word 0x0ec74486 -//.word 0x81784d52 -//.word 0xa6b2e6f4 -//.word 0xbacdd4ac -//.word 0x4a2fb72a -//.word 0x9a1c8fff -//.word 0x48d07e52 -//.word 0x2dcbd0d4 -//.word 0x846d38f6 -//.word 0x4ec25c59 -//.word 0xf59f9485 -//.word 0x2feeefdf -//.word 0x254678d5 -//.word 0xd5bfb75c -//.word 0xb4047a9c -//.word 0x98a9d5e9 -//.word 0xd6bf67f6 -//.word 0xa7a6df45 -//.word 0xd123bfe2 -//.word 0x83b26051 -//.word 0x801e36c5 -//.word 0x7f4e5693 -//.word 0xd26235e5 -//.word 0x47ffb3b3 -//.word 0x4ce658ef -//.word 0x56ccdd00 -//.word 0x8366ee72 -//.word 0x7ec32eec -//.word 0xa3de7c62 -//.word 0x6374758b -//.word 0xea133996 -//.word 0x00747219 -//.word 0x2d0a934a -//.word 0x21db5e71 -//.word 0x528fa99d -//.word 0xe7c66196 -//.word 0xd5afcf14 -//.word 0x48d71a2e -//.word 0x443e0e15 -//.word 0x8cb01b02 -//.word 0xc352a16d -//.word 0xd17c6b80 -//.word 0x88c679cb -//.word 0x88660239 -//.word 0x5fb9b943 -//.word 0xf51f5063 -//.word 0x280c3acc -//.word 0xb35cb658 -//.word 0x54e709c2 -//.word 0x2e560a15 -//.word 0x6c35e464 -//.word 0x274918bc -//.word 0x8923c157 -//.word 0x33f51c12 -//.word 0xdda54721 -//.word 0x3c204902 -//.word 0x29f153af -//.word 0xff124618 -//.word 0x450174d0 -//.word 0x8d17ab07 -//.word 0x9b1670b8 -//.word 0xca018823 -//.word 0xac30bd7e -//.word 0xf1a3dee8 -//.word 0x8a97089e -//.word 0x0e572471 -//.word 0x5c55b178 -//.word 0x8279c402 -//.word 0xddb94cce -//.word 0x82ea9b7f -//.word 0xddd5224a -//.word 0x988e7cf2 -//.word 0xbe01aff6 -//.word 0x21ceae09 -//.word 0xf95722c2 -//.word 0xcd166995 -//.word 0x9735df02 -//.word 0x23585d0c -//.word 0xb8be00ed -//.word 0xfa882c08 -//.word 0x0f58d01f -//.word 0x011eebc6 -//.word 0x632f4f17 -//.word 0x3898a5a8 -//.word 0x10b1b1ba -//.word 0x74f5d7b3 -//.word 0x8410decf -//.word 0xdf3af512 -//.word 0xc3c4f381 -//.word 0x76f0e391 -//.word 0xe406c0e0 -//.word 0x89a47d23 -//.word 0x9156485f -//.word 0x3e66105d -//.word 0x8bf64558 -//.word 0x0f4bdff8 -//.word 0x236ca184 -//.word 0x47ec9f53 -//.word 0xc204fe83 -//.word 0x89e5fbee -//.word 0x624b2e5a -//.word 0x495610f0 -//.word 0x1396bcf0 -//.word 0x5164f2a2 -//.word 0x77796190 -//.word 0x3eb926f2 -//.word 0x4650906a -//.word 0x000026f1 -//.word 0xcbb9eb11 -//.word 0x5d6be056 -//.word 0x6518cbff -//.word 0x6e2d37f8 -//.word 0x0712bc0d -//.word 0x21008058 -//.word 0xb813fefb -//.word 0xb6a00615 -//.word 0x14c805ee -//.word 0x424d8775 -//.word 0xc9a5faed -//.word 0x2f4db5e3 -//.word 0x1a603963 -//.word 0xb968b66b -//.word 0x6074d1a0 -//.word 0x726ba440 -//.word 0x849f0658 -//.word 0xbfa50d37 -//.word 0x8665d222 -//.word 0x596d7449 -//.word 0xfa8b60fa -//.word 0xce9acf15 -//.word 0x859c90c0 -//.word 0xfe09075b -//.word 0x646776b7 -//.word 0x9e1b7b82 -//.word 0xe67fda06 -//.word 0xb7347d14 -//.word 0xedbab93a -//.word 0x283dd33c -//.word 0x71b2c3c2 -//.word 0x2023374f -//.word 0xfc47db72 -//.word 0xa556d840 -//.word 0x2f1b9a01 -//.word 0x104bd72a -//.word 0x3c15cd8c -//.word 0x8efacbca -//.word 0x6adff210 -//.word 0xa1613d02 -//.word 0x9468bff3 -//.word 0x9dff2c58 -//.word 0xaa639b7c -//.word 0x2b598a75 -//.word 0x2fc52356 -//.word 0xc979bea6 -//.word 0xb94ba611 -//.word 0x486a205e -//.word 0x74f2a9a1 -//.word 0x4dbd80b2 -//.word 0x9f7d64dd -//.word 0xd1079fdb -//.word 0x0df24301 -//.word 0xa261b4b8 -//.word 0xa61d662d -//.word 0xdfe7e84a -//.word 0xe40c22e4 -//.word 0x7f39db80 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x0000FE98 -//// expected output -//.word 0xc9c7d9b0 -//.word 0x413dd754 -//.word 0x96646779 -//.word 0xefd98d50 -//.word 0x5921b9a5 -//.word 0x47cbd5c4 -//.word 0x60450b24 -//.word 0xfcb8119a -//.word 0x769c27a9 -//.word 0xb63e3004 -//.word 0x02cf0444 -//.word 0x2e900cd4 -//.word 0x96c0a056 -//.word 0x82f88c82 -//.word 0x0d5a6d43 -//.word 0x1005eff8 -//// SHA512LongMsgvector_82 -//// vector length -//.word 0x000101B0 -//// input message -//.word 0x8d41b809 -//.word 0xa8085d72 -//.word 0xa9906c95 -//.word 0x931a2e65 -//.word 0x1adf0e76 -//.word 0x13b0aabf -//.word 0x2ada269e -//.word 0xd34cc51c -//.word 0x83fcba73 -//.word 0x1f863bcd -//.word 0xb516d84f -//.word 0x6a890b56 -//.word 0xb3cf1000 -//.word 0xc894f6ef -//.word 0x561ff749 -//.word 0x747a0503 -//.word 0xd9d3a560 -//.word 0x4c2200b4 -//.word 0x5b0c376e -//.word 0x5007f855 -//.word 0x61c04f12 -//.word 0x27babeef -//.word 0x52378fde -//.word 0x9a5b69bd -//.word 0xf98f22d8 -//.word 0x1724d4b0 -//.word 0x063833fb -//.word 0x2fde1deb -//.word 0x8c7973b3 -//.word 0x18692848 -//.word 0x84ea9764 -//.word 0x2c381ad1 -//.word 0x49f8d8e4 -//.word 0x68d3de48 -//.word 0x1b6472fc -//.word 0xee54a39f -//.word 0x9cc325ec -//.word 0x83ea5c81 -//.word 0x56ffb7e4 -//.word 0x12593fc7 -//.word 0x33d5708b -//.word 0x27784704 -//.word 0x03569c7c -//.word 0x75b2b2fa -//.word 0xf9660dc4 -//.word 0x50868322 -//.word 0x2f409665 -//.word 0x34060128 -//.word 0x1df091d6 -//.word 0x3c5b366c -//.word 0x26d75a80 -//.word 0xac407183 -//.word 0x0c2ad243 -//.word 0x6882c5b3 -//.word 0x7673ddef -//.word 0x7a87887b -//.word 0x710fe4cb -//.word 0x8fc4d409 -//.word 0xecae5412 -//.word 0x7b4509c2 -//.word 0x3bd71c71 -//.word 0xb12949bd -//.word 0x9561338a -//.word 0xcc23fb48 -//.word 0x96fb1075 -//.word 0x09fb4962 -//.word 0xbea53139 -//.word 0xca0ba23f -//.word 0xef349557 -//.word 0x14c238c8 -//.word 0xf3d2413f -//.word 0x12248218 -//.word 0xf47cbed9 -//.word 0x9047bcff -//.word 0x028299fe -//.word 0x81d86283 -//.word 0x910ae3fc -//.word 0x7994b95a -//.word 0xf88eaf15 -//.word 0x34d04771 -//.word 0xf3599601 -//.word 0x0df25569 -//.word 0x220e3667 -//.word 0x88f57415 -//.word 0x8721ae68 -//.word 0xc9e8f5fd -//.word 0x0c5c2415 -//.word 0x1a706fde -//.word 0xfb5c3ff4 -//.word 0x69423e27 -//.word 0x8411ad7f -//.word 0xc7aafe7d -//.word 0x3b419fa4 -//.word 0xea061438 -//.word 0x97054846 -//.word 0xac4b25e4 -//.word 0x744b62ba -//.word 0x8a809cc1 -//.word 0x9253a94b -//.word 0x263e2944 -//.word 0x13325db7 -//.word 0xc6363d93 -//.word 0x0152c4b0 -//.word 0xd3ab8f0d -//.word 0xc6efa65c -//.word 0x5af39ac0 -//.word 0xb29bd0d5 -//.word 0x8efb1cf1 -//.word 0x79bb91a9 -//.word 0x44c09897 -//.word 0xb208405b -//.word 0x75d6d5e0 -//.word 0x5910b4e1 -//.word 0xc0e55dab -//.word 0x4eb2ca24 -//.word 0xe527000c -//.word 0xd4a6e383 -//.word 0x4beb4ecb -//.word 0x13f26350 -//.word 0x7b1520e5 -//.word 0x96763351 -//.word 0xa39c100a -//.word 0xcd614040 -//.word 0x150bfc1d -//.word 0x8cb9fa4c -//.word 0xc50187b8 -//.word 0x8ad7d696 -//.word 0xceb098a5 -//.word 0xe3e8ccb4 -//.word 0xed61d966 -//.word 0x976eda32 -//.word 0x04ef39ad -//.word 0x09bd7f0c -//.word 0x99486ae4 -//.word 0x807e4135 -//.word 0x54ef64a7 -//.word 0xa92f2713 -//.word 0x857ce045 -//.word 0x14a13f01 -//.word 0x9c1ade43 -//.word 0xb27919cb -//.word 0xaf0920d9 -//.word 0x5eb04a36 -//.word 0xf71aad73 -//.word 0x5113eb75 -//.word 0x53354e32 -//.word 0xacc418b5 -//.word 0xc3d61468 -//.word 0xf1b77192 -//.word 0xef8bd01f -//.word 0x8a359ca0 -//.word 0x9e789a92 -//.word 0x415cc1e3 -//.word 0x3fd44bb2 -//.word 0xc79d0c57 -//.word 0x636903a3 -//.word 0x2d3d2f68 -//.word 0x4118a33c -//.word 0x6ed5dd7b -//.word 0x3152548b -//.word 0xe3d25064 -//.word 0x31a0fe4f -//.word 0xcdf6c4ed -//.word 0x631cd27c -//.word 0xcfd4fa56 -//.word 0x8df6c1ba -//.word 0x7058b6cf -//.word 0x97f002e6 -//.word 0x9e3d4100 -//.word 0x11e29090 -//.word 0x2695e782 -//.word 0xab37aa7b -//.word 0x3d447a63 -//.word 0xbb6e5121 -//.word 0xfa85cea5 -//.word 0xba9acd2c -//.word 0xd9643bbf -//.word 0xc7e329fd -//.word 0x3a421e1b -//.word 0x2302b229 -//.word 0xe0555897 -//.word 0xb3c87cf7 -//.word 0x7325ce04 -//.word 0x8198dde4 -//.word 0xfe10e7aa -//.word 0x3be8ef1f -//.word 0x71c711c2 -//.word 0xb3c5130d -//.word 0x20cf3cfa -//.word 0x5d4c69c6 -//.word 0x43005df5 -//.word 0xd4315996 -//.word 0x7409ecc8 -//.word 0x563c0d7d -//.word 0x34eb677e -//.word 0x43c7f4b0 -//.word 0x6679cd95 -//.word 0xa1424115 -//.word 0xd1de247f -//.word 0x9baf69cb -//.word 0xa317f422 -//.word 0xfe26a9a0 -//.word 0xe975c958 -//.word 0xbb517e98 -//.word 0x181cb46f -//.word 0x68f12b6d -//.word 0x8787caaa -//.word 0xbe583709 -//.word 0xf302a4be -//.word 0x1cedec0e -//.word 0xfa2ede56 -//.word 0x03abd84f -//.word 0xa0809990 -//.word 0x98a25055 -//.word 0xccc2f87e -//.word 0x2675e8db -//.word 0xcc91a6a6 -//.word 0x99dafd51 -//.word 0xcdde4f83 -//.word 0x031d2c5d -//.word 0x646d2201 -//.word 0x1b9dd755 -//.word 0x08595604 -//.word 0xb94da7c6 -//.word 0x968ea2e2 -//.word 0x5b3504f1 -//.word 0xcc4dc3e4 -//.word 0xa4ef9f48 -//.word 0xceabfac9 -//.word 0xd72ae9f5 -//.word 0xa4128b43 -//.word 0x602a9a54 -//.word 0xb9bf3f78 -//.word 0x4c462b74 -//.word 0x5d42e383 -//.word 0xcc685b9a -//.word 0x4401c7f0 -//.word 0xb691aebe -//.word 0x06b64043 -//.word 0x0452e90c -//.word 0x9dec2672 -//.word 0x53549864 -//.word 0xea865767 -//.word 0x64d188da -//.word 0x3039327f -//.word 0x9f194d37 -//.word 0x970d1c0d -//.word 0x8b0ebd76 -//.word 0xaadfffd7 -//.word 0x57a97348 -//.word 0xdae2c698 -//.word 0x55724d91 -//.word 0xf919e27d -//.word 0x790befe9 -//.word 0xbfdec8a8 -//.word 0xdfa63e1b -//.word 0x495f71b0 -//.word 0x428be5a9 -//.word 0x951bd81f -//.word 0x8593d346 -//.word 0x076a80f2 -//.word 0x2eafbb5a -//.word 0xe7f3eb1c -//.word 0xe6629382 -//.word 0xe0332404 -//.word 0xfb43160e -//.word 0x83fc3603 -//.word 0xde7c4281 -//.word 0xc2f3b3e7 -//.word 0xa54dda14 -//.word 0x75122e72 -//.word 0x8a8ae534 -//.word 0xd924c1db -//.word 0x6a182dff -//.word 0x0c4c884c -//.word 0x4775c1cb -//.word 0x927e2462 -//.word 0xc62d739f -//.word 0xd30439b1 -//.word 0xb1655bb7 -//.word 0x9afaf03e -//.word 0x77545204 -//.word 0x98d27502 -//.word 0xa7c578aa -//.word 0xdfd17a6e -//.word 0x7997af81 -//.word 0x6790b3e1 -//.word 0x453c1e95 -//.word 0x8d7d5833 -//.word 0x0a3dafa6 -//.word 0x8f57a62e -//.word 0xe8b590a8 -//.word 0x11b65e10 -//.word 0xa6d2b644 -//.word 0x9b80450b -//.word 0x2d575555 -//.word 0x1874a2c5 -//.word 0x0b1d696c -//.word 0x59a3c3d8 -//.word 0xf18d314d -//.word 0x90f27852 -//.word 0x3527af6f -//.word 0xd69b9636 -//.word 0x51fe2980 -//.word 0xa5a975f9 -//.word 0x623aabdf -//.word 0x5e7e7306 -//.word 0xaa958220 -//.word 0xc4506f3b -//.word 0x0edec28b -//.word 0x7fa84f6a -//.word 0x9979c29d -//.word 0x9be27ad9 -//.word 0xf7dd9b85 -//.word 0x06b05ec2 -//.word 0xfb14aca9 -//.word 0x1697ecd3 -//.word 0x1a3f191f -//.word 0x007017af -//.word 0xed0f4734 -//.word 0x62e8596c -//.word 0xb24d61e9 -//.word 0xba002d13 -//.word 0xcc54d670 -//.word 0xec8e9623 -//.word 0x3f91d9b3 -//.word 0xc0bb970e -//.word 0x350ae0ce -//.word 0x6283b9ba -//.word 0x7cd42690 -//.word 0xe0388802 -//.word 0x059b29fe -//.word 0xafff1632 -//.word 0x661e2dd0 -//.word 0x2750768e -//.word 0x59b0b7f2 -//.word 0x027a42cc -//.word 0x3bb81204 -//.word 0xe21e1695 -//.word 0x8e32cdda -//.word 0xc8b01309 -//.word 0x782c3bfd -//.word 0x9df95d38 -//.word 0x414af128 -//.word 0xad979da9 -//.word 0xd9424ccc -//.word 0x267b80d6 -//.word 0x4f61e98c -//.word 0x9d6936ae -//.word 0x5b042bc2 -//.word 0x8a7cf412 -//.word 0xd61fb9f8 -//.word 0xc8a07259 -//.word 0x3cbafd70 -//.word 0x16166dcd -//.word 0x316fa69d -//.word 0x98f4272b -//.word 0xf9ee26a7 -//.word 0x56a2e227 -//.word 0xfe7935eb -//.word 0xbc5e68e5 -//.word 0x4e684c78 -//.word 0x18b98681 -//.word 0x1aa62b94 -//.word 0x20188d88 -//.word 0x38315435 -//.word 0x6933d07c -//.word 0xa29e8d88 -//.word 0xf1992854 -//.word 0xf593626d -//.word 0x962a73fa -//.word 0xf34ca1f9 -//.word 0x9c9c10cb -//.word 0x0217dcf3 -//.word 0x2cf7651b -//.word 0xabd7ea57 -//.word 0xcf195aae -//.word 0x1b8566d7 -//.word 0xf732db40 -//.word 0xa5aa2f55 -//.word 0x764959fe -//.word 0x3ee6e669 -//.word 0x05b64a0b -//.word 0xff6c74e1 -//.word 0xbfa5a5fc -//.word 0xa784813c -//.word 0xa399675c -//.word 0x1708fe2e -//.word 0x15e71028 -//.word 0xd4e79c20 -//.word 0x5d372654 -//.word 0x88a552ad -//.word 0x2707b145 -//.word 0x81d9db26 -//.word 0x0227be55 -//.word 0x30ae350f -//.word 0xe13edd52 -//.word 0xab62249f -//.word 0x9d43a2ff -//.word 0x2ccaad44 -//.word 0x70052791 -//.word 0x91cc9b1c -//.word 0x7ca48833 -//.word 0xdae3fd7d -//.word 0x42156683 -//.word 0xad9fa66e -//.word 0x2ba26612 -//.word 0xd522ac2c -//.word 0x0368afe8 -//.word 0xbfa4eaa7 -//.word 0x79d76ffe -//.word 0xfcf07e02 -//.word 0xa03556c3 -//.word 0xc1e54b16 -//.word 0x711c1998 -//.word 0x6af678ef -//.word 0x46f7f053 -//.word 0xf3abef4e -//.word 0x618919bf -//.word 0x7d1ddf25 -//.word 0x6367531a -//.word 0xcf7e3a1e -//.word 0xd5786396 -//.word 0xd38e3814 -//.word 0xa37c93d9 -//.word 0x1527d399 -//.word 0x9c822e7e -//.word 0x47b2496f -//.word 0xf3710591 -//.word 0xc0b09c0e -//.word 0xc180ee16 -//.word 0xf8321524 -//.word 0x81bd3f83 -//.word 0x0d61bd10 -//.word 0x928a5741 -//.word 0x41f7e366 -//.word 0xb91b162f -//.word 0x7ac4996f -//.word 0x9cfa5f1f -//.word 0xc12a37a6 -//.word 0x48849d58 -//.word 0xc3a1d63c -//.word 0xab693c12 -//.word 0x5334d694 -//.word 0x1b2f2bfd -//.word 0xe60258c8 -//.word 0xceaf61ba -//.word 0x16bdc522 -//.word 0x5f975560 -//.word 0x1f2f45a4 -//.word 0x50e684f8 -//.word 0x65b04981 -//.word 0x8273ef01 -//.word 0xecb102a1 -//.word 0xbf679aee -//.word 0xdf35e721 -//.word 0x30be0ea3 -//.word 0x0a5233d0 -//.word 0xe7cbd7fc -//.word 0x5fb465b3 -//.word 0x57b10745 -//.word 0x751abe82 -//.word 0xd7eab2c3 -//.word 0x04d8c72a -//.word 0x22c3702a -//.word 0x6a53c849 -//.word 0xdadedf24 -//.word 0x298851b4 -//.word 0x00af1ed1 -//.word 0x6786b5f4 -//.word 0x7eff5241 -//.word 0x6def8ac5 -//.word 0x9d6d25fc -//.word 0x297a2b96 -//.word 0x8fe8417a -//.word 0xac74360c -//.word 0xe736daab -//.word 0xac3b0f7e -//.word 0x1c702271 -//.word 0x02c15b7a -//.word 0x0983d221 -//.word 0x2d0f853f -//.word 0x70b0a806 -//.word 0xcec03c41 -//.word 0x720de3dd -//.word 0x2a82f3a9 -//.word 0x1903c95a -//.word 0xac9860d2 -//.word 0xcfce22a2 -//.word 0x605afdcd -//.word 0xe300bacf -//.word 0x78b38add -//.word 0x0bfee26f -//.word 0xcba289fc -//.word 0xdd81f004 -//.word 0x51bac154 -//.word 0x5516ba86 -//.word 0xa8a3bcc7 -//.word 0x529e1fdd -//.word 0x93964968 -//.word 0x19cf7f67 -//.word 0x75e5faff -//.word 0xd0b13e78 -//.word 0xda70a789 -//.word 0x042245d5 -//.word 0xef31eab5 -//.word 0x24538038 -//.word 0x05b1a068 -//.word 0x044961cf -//.word 0x12916e3a -//.word 0x5a5d5cbd -//.word 0x30023af7 -//.word 0x44bc6997 -//.word 0x1c4dae1f -//.word 0xc1e785e9 -//.word 0xb84cb867 -//.word 0x333431ae -//.word 0x89ef0c36 -//.word 0xe44bf1db -//.word 0x39b8a128 -//.word 0x7eaaced5 -//.word 0x173f308e -//.word 0x9122d5f7 -//.word 0x92afb9ec -//.word 0x1058960d -//.word 0xc247fd7a -//.word 0xd444a6db -//.word 0xdfda05a4 -//.word 0x18b51d97 -//.word 0xc84f998a -//.word 0xfccc196a -//.word 0x7d22ca80 -//.word 0x027c39f3 -//.word 0xa5e1698e -//.word 0x941023c4 -//.word 0x09af8df1 -//.word 0x7ca5fee3 -//.word 0x17c51199 -//.word 0x6aacf84a -//.word 0x60ec13aa -//.word 0x716ac168 -//.word 0x1a0477fb -//.word 0x8a770f9e -//.word 0x9f806299 -//.word 0x104218c3 -//.word 0xece8bf45 -//.word 0x438b1ba0 -//.word 0x2256bdf2 -//.word 0xc5e8d775 -//.word 0x09f94f48 -//.word 0x20411272 -//.word 0x8895ab24 -//.word 0x3e54143e -//.word 0x2f01cc15 -//.word 0xef312973 -//.word 0xada8f0e0 -//.word 0x67bf2320 -//.word 0x5a091afd -//.word 0xbd35d547 -//.word 0xae369118 -//.word 0x6da2995c -//.word 0xc8585f91 -//.word 0xd666cbcc -//.word 0xe82ad3fd -//.word 0xbdb74c73 -//.word 0xf57900a3 -//.word 0xc81d0025 -//.word 0xf8ab3cff -//.word 0x04f55026 -//.word 0x9f35a142 -//.word 0x60f2a9b2 -//.word 0xbb238fd0 -//.word 0x3097fb76 -//.word 0xc29428c1 -//.word 0xabbf3b14 -//.word 0x4e3bd360 -//.word 0x6d15e1a3 -//.word 0x9ce0baaf -//.word 0xf69c6a2d -//.word 0x0edd4be1 -//.word 0x2929d730 -//.word 0xaaa1bbdf -//.word 0xcde32c1d -//.word 0x98307ec4 -//.word 0x0fcaf3dc -//.word 0xa8a0d161 -//.word 0xfe2db745 -//.word 0xc99e30b9 -//.word 0x0e3389a9 -//.word 0x93e7e085 -//.word 0x96537e47 -//.word 0xbed067b2 -//.word 0x52dc2ed7 -//.word 0xa9bf0ede -//.word 0xe26e3703 -//.word 0xd5af66df -//.word 0x487eb8e9 -//.word 0x67afc03c -//.word 0x6ed6d79b -//.word 0xa964b3b2 -//.word 0x9e123c9e -//.word 0x89839ab0 -//.word 0x0824936e -//.word 0x185814db -//.word 0x40d20df9 -//.word 0x0c41828b -//.word 0xbd33e01f -//.word 0x3f338d4c -//.word 0x5b35c239 -//.word 0x2e359d5e -//.word 0xda1a728f -//.word 0x7be06336 -//.word 0x5df630e0 -//.word 0x6ce550fb -//.word 0xeb3340dd -//.word 0x69871b09 -//.word 0xf10d6bae -//.word 0x821c3e71 -//.word 0xbe177d6c -//.word 0xe6917a77 -//.word 0x06b4c8a6 -//.word 0x6de34f13 -//.word 0x609e9fdd -//.word 0x10a68570 -//.word 0xc962dc07 -//.word 0x6b82a670 -//.word 0x1ee25c0f -//.word 0x42b18226 -//.word 0xa5d27d54 -//.word 0xf982a95b -//.word 0x853ca726 -//.word 0x1ad9f40a -//.word 0x49fcc04c -//.word 0xd3adfde3 -//.word 0x6144b680 -//.word 0x7589a2cc -//.word 0xa119f9f0 -//.word 0xf70c865b -//.word 0xc0d4febf -//.word 0x7168905d -//.word 0xdaa3bd83 -//.word 0xa1e66a53 -//.word 0xef0533c5 -//.word 0x696103f0 -//.word 0x6251e185 -//.word 0x4ec70d9c -//.word 0x7a304cb3 -//.word 0xfb9b80f3 -//.word 0xe51e7bb6 -//.word 0xbd751547 -//.word 0x30ed7ce8 -//.word 0x0481cc1a -//.word 0x5042e018 -//.word 0xe8fc67a5 -//.word 0x1c163a07 -//.word 0xa2baed54 -//.word 0xd036a3ec -//.word 0x0ea22747 -//.word 0x8cc339f1 -//.word 0x303026d2 -//.word 0xd3b39cb3 -//.word 0xacf2bbfe -//.word 0x0c4f6fc5 -//.word 0x4c0cfe06 -//.word 0x04b3dd2e -//.word 0x7eb5c8db -//.word 0x6b5111e6 -//.word 0xd4b739a1 -//.word 0x536ebd5d -//.word 0x82f33230 -//.word 0xb4a394f5 -//.word 0xe3dadc93 -//.word 0xea5dd083 -//.word 0xf4f51f8c -//.word 0x355dadd1 -//.word 0xd85e2c0e -//.word 0x3839ec1f -//.word 0x5245f4c2 -//.word 0x7bd9519d -//.word 0x4e6cae83 -//.word 0xe9fb25f3 -//.word 0x59ac55e1 -//.word 0x52b0b5b9 -//.word 0x236d27a2 -//.word 0xeaddd100 -//.word 0x0431283c -//.word 0xc8bb4dc7 -//.word 0x750a9d5c -//.word 0x68578486 -//.word 0x93209163 -//.word 0x2a12d0a7 -//.word 0x9f2c54e3 -//.word 0xd1221308 -//.word 0x81fff727 -//.word 0x050f317a -//.word 0x40fcd1a8 -//.word 0xd1379345 -//.word 0x8b99fc98 -//.word 0x254ba6a2 -//.word 0x33e3d95b -//.word 0x55cf5a3f -//.word 0xaff78809 -//.word 0x999ea4bf -//.word 0x978971ee -//.word 0x8b64fd37 -//.word 0x2961be0a -//.word 0xac22e0b2 -//.word 0xc7d9de92 -//.word 0xdfae50ae -//.word 0x7761046d -//.word 0xec304f9d -//.word 0x62fba5b7 -//.word 0xfea66864 -//.word 0x56bffe41 -//.word 0x256026df -//.word 0x44578c0f -//.word 0xd5859b5c -//.word 0xc18492d8 -//.word 0x668dda1c -//.word 0x8998978a -//.word 0x92c47dd5 -//.word 0xf8fae4c4 -//.word 0xfacd1f32 -//.word 0x90a50a5a -//.word 0xa11de351 -//.word 0x76a95bd4 -//.word 0x6f7cec44 -//.word 0xf4a96cef -//.word 0xaf88e391 -//.word 0xf85b9a1b -//.word 0x913174b2 -//.word 0x940b81fb -//.word 0xa93ed196 -//.word 0x7c1886e8 -//.word 0x6fc62d1e -//.word 0x8c754f6e -//.word 0xbdb842a0 -//.word 0x3f2a45ce -//.word 0x5454cd68 -//.word 0x38d1197a -//.word 0x57af0c32 -//.word 0xbd193c9d -//.word 0xce3347b1 -//.word 0x37466690 -//.word 0x241d440b -//.word 0xb4af1065 -//.word 0xa9fed05a -//.word 0x653ef960 -//.word 0x123a3d2d -//.word 0x20f4a579 -//.word 0xf48bdf05 -//.word 0xde62d9dc -//.word 0x4c7f8fd9 -//.word 0x3e312169 -//.word 0xfaf62892 -//.word 0x019b4a35 -//.word 0x41a50c90 -//.word 0x8cf0e806 -//.word 0x4996a023 -//.word 0x6a12d1db -//.word 0x9ea6cb12 -//.word 0xc7faa062 -//.word 0xae057b18 -//.word 0xf530337f -//.word 0x4eb92062 -//.word 0xeb562ecc -//.word 0x361c2f12 -//.word 0xc19e7613 -//.word 0x8059a1bf -//.word 0x3650b6d6 -//.word 0x2df372f2 -//.word 0x2a45ddc8 -//.word 0xa03e22ab -//.word 0x246e9e52 -//.word 0x21e437da -//.word 0xcd4eef0e -//.word 0x5b62b8e7 -//.word 0x737c8b4f -//.word 0xdf88b42a -//.word 0x87227097 -//.word 0x9ffcb973 -//.word 0x1f806120 -//.word 0x73b75e84 -//.word 0x746a6554 -//.word 0x9887ba92 -//.word 0x65c54654 -//.word 0x2c8beac8 -//.word 0xf30f1375 -//.word 0xb3bb8ec3 -//.word 0xc4d49ebe -//.word 0x955d4c17 -//.word 0xa039ff6b -//.word 0x9d914cc8 -//.word 0xf6750f6e -//.word 0x7cc6bbd2 -//.word 0x5853eee9 -//.word 0x444249a2 -//.word 0xfbb27eb5 -//.word 0xed9eaa9b -//.word 0x3804e6dd -//.word 0xd4471892 -//.word 0x0dd31023 -//.word 0x37ffd052 -//.word 0x9d372a7b -//.word 0xba5a9119 -//.word 0xac61298b -//.word 0xe5422019 -//.word 0x24134132 -//.word 0xa373c6f7 -//.word 0x92266efe -//.word 0xc5ffd04f -//.word 0xaa03efb3 -//.word 0x7dcb0e2f -//.word 0xbf2ac6cb -//.word 0xe4105597 -//.word 0x4cae39f0 -//.word 0x74dbfe00 -//.word 0x6eb75484 -//.word 0x8e8e64d2 -//.word 0x67ff641a -//.word 0xf55d69ec -//.word 0x1c557dfa -//.word 0x51d1f220 -//.word 0x981df6a1 -//.word 0xae4867b4 -//.word 0x87cee83f -//.word 0xfb7334e2 -//.word 0xbc72b237 -//.word 0x8bd74a58 -//.word 0xab2a78a2 -//.word 0x964d9eb9 -//.word 0xf0a79fcc -//.word 0xb983a91b -//.word 0xc6b252b6 -//.word 0x7278e787 -//.word 0x91a60092 -//.word 0xa503587c -//.word 0x55f0dc4a -//.word 0x1a4c026c -//.word 0x3c965cfa -//.word 0xfd516d3d -//.word 0x13adbb71 -//.word 0x5c6325c9 -//.word 0xcee177b4 -//.word 0xada73c5f -//.word 0x00f1d47b -//.word 0x4596c640 -//.word 0x643057b2 -//.word 0xe27d5b23 -//.word 0x57054bf9 -//.word 0x22fd98b1 -//.word 0x5b6c3f24 -//.word 0x098c9e09 -//.word 0x957385bc -//.word 0x7ff2913e -//.word 0x50beb57c -//.word 0xd0cd1ad4 -//.word 0x780329d5 -//.word 0x2a0ee646 -//.word 0x208f7f6a -//.word 0x237a2483 -//.word 0xfdbf1a95 -//.word 0x302a0b6c -//.word 0xe887a1e0 -//.word 0x2f0b5358 -//.word 0x60ef7e8d -//.word 0xde5eb791 -//.word 0x0591600f -//.word 0x613979d4 -//.word 0x1e1db98e -//.word 0xc004ddd4 -//.word 0x15d54167 -//.word 0x67fdadb8 -//.word 0xf51171aa -//.word 0xa5b4b498 -//.word 0xf3bc099a -//.word 0x2d904304 -//.word 0xe2d48b30 -//.word 0x9849af7e -//.word 0xbdeebd98 -//.word 0xe06cd1fb -//.word 0x21b02bb3 -//.word 0xe6da8465 -//.word 0xd056a293 -//.word 0xee482b1c -//.word 0x302eb702 -//.word 0x1ec12870 -//.word 0xc91b3efc -//.word 0x021f6629 -//.word 0xcb16d330 -//.word 0x0b96d000 -//.word 0x86a85583 -//.word 0x0b29d823 -//.word 0xef71658d -//.word 0xbb33f1b4 -//.word 0x22a4ec19 -//.word 0x36e0154b -//.word 0xdb8992a9 -//.word 0x7bb1406f -//.word 0xfbfa48f1 -//.word 0xeefbf321 -//.word 0x09e6bf57 -//.word 0xd768b252 -//.word 0xaed1ee7a -//.word 0xe2758667 -//.word 0x385290a7 -//.word 0x9ef37bbc -//.word 0x1994a365 -//.word 0xfe86231f -//.word 0x65d5eaea -//.word 0xdb291250 -//.word 0x57ea6da4 -//.word 0x70a76088 -//.word 0xccb9f4b1 -//.word 0xdc232aef -//.word 0xc6bd8f67 -//.word 0xa3921123 -//.word 0xeb8611ce -//.word 0x2d3cb9b8 -//.word 0x04369021 -//.word 0x463e4bb3 -//.word 0x7e05e750 -//.word 0x9d0bf40e -//.word 0xecbe3480 -//.word 0x45e66438 -//.word 0x83405a89 -//.word 0x37695092 -//.word 0x9dfe8077 -//.word 0xce02f1f2 -//.word 0x3680900b -//.word 0x49718223 -//.word 0x72dfb937 -//.word 0x4c4bc563 -//.word 0x154deda5 -//.word 0x607a7fe4 -//.word 0x098a6431 -//.word 0x6ebbf74c -//.word 0xdc70186a -//.word 0x481e7b35 -//.word 0x40684615 -//.word 0x2189dcae -//.word 0x89f3f3aa -//.word 0x0f35edb8 -//.word 0x322265d4 -//.word 0x903008ca -//.word 0x591ea6f5 -//.word 0x02da884d -//.word 0x3ea105a1 -//.word 0x2a685020 -//.word 0xc77b941e -//.word 0xae644315 -//.word 0xff0eabea -//.word 0x9b2aca72 -//.word 0x93d26335 -//.word 0xe06c5172 -//.word 0x54d21c63 -//.word 0xd0b0cac1 -//.word 0xb82df78b -//.word 0xa4cd2804 -//.word 0x58955dfb -//.word 0xf771e54e -//.word 0x73d476b1 -//.word 0x489e7dac -//.word 0x6a42b3e3 -//.word 0x7b28f19a -//.word 0x42504578 -//.word 0x5939458b -//.word 0x2501a38d -//.word 0x0bcd0266 -//.word 0xe16b08f1 -//.word 0xa336b503 -//.word 0x683af3aa -//.word 0x94996eb2 -//.word 0x4e2ea56e -//.word 0x356f42b5 -//.word 0x4e98a62a -//.word 0x4106c9c0 -//.word 0xc6e0417e -//.word 0x5afda080 -//.word 0x3602033f -//.word 0x81cbe812 -//.word 0xc50d40f4 -//.word 0xa039c687 -//.word 0xbca38e59 -//.word 0x00e3e166 -//.word 0x087b48df -//.word 0xd3bbe72a -//.word 0xbce20c2a -//.word 0xac8608c0 -//.word 0x8d363e92 -//.word 0x025d790b -//.word 0x556983a3 -//.word 0xb12df360 -//.word 0x9184469c -//.word 0x7838310a -//.word 0xe32236f4 -//.word 0x7b9276c6 -//.word 0x90f1c6d0 -//.word 0xc3a40448 -//.word 0x0234ac8e -//.word 0xbaaca6b4 -//.word 0x4743623e -//.word 0xb03b2726 -//.word 0x9109a824 -//.word 0x58b6d92c -//.word 0xb4850037 -//.word 0x4bd60f46 -//.word 0xac4a31a4 -//.word 0x8428a36c -//.word 0x1400c54c -//.word 0xe28e7188 -//.word 0xafe08b42 -//.word 0xaabbd9f8 -//.word 0xe33c154e -//.word 0x02bb410e -//.word 0x39f43b6d -//.word 0x77699190 -//.word 0xdf02964e -//.word 0x78f7b638 -//.word 0x26ef06d6 -//.word 0xd96a1f34 -//.word 0x045c2d9d -//.word 0x511a43a7 -//.word 0x937af270 -//.word 0xfb361926 -//.word 0x9092fecd -//.word 0xd93f9e3c -//.word 0xdc7e4269 -//.word 0x4d8953e7 -//.word 0xff2e6fad -//.word 0x9ebdbc19 -//.word 0xa0247d35 -//.word 0x7959e338 -//.word 0x0ef82550 -//.word 0x6d2ed39e -//.word 0xbbd56782 -//.word 0x6de01d1a -//.word 0xbcfa0405 -//.word 0x526a556d -//.word 0x4a3a0444 -//.word 0x579896cd -//.word 0x437c325f -//.word 0x9c8bfa66 -//.word 0xaa3c9caa -//.word 0xa33923d4 -//.word 0x2208142e -//.word 0xd6eab6aa -//.word 0x7703b126 -//.word 0xffbcdaee -//.word 0x16664e82 -//.word 0xce20be9a -//.word 0x90fa0968 -//.word 0x575a101d -//.word 0x1b9fc6ae -//.word 0x910586d8 -//.word 0x11c8aa62 -//.word 0xd78d59a2 -//.word 0x6ffda042 -//.word 0x6bb3c444 -//.word 0x5758d744 -//.word 0xef0c8afd -//.word 0x8f08420f -//.word 0xea826e00 -//.word 0xffd11780 -//.word 0x49d2b8f1 -//.word 0x368a5126 -//.word 0xdb0db76b -//.word 0xe69e2ec6 -//.word 0xd417397d -//.word 0x648cb1d8 -//.word 0x4b2b1528 -//.word 0x29662108 -//.word 0xbc55a2e3 -//.word 0x535588b7 -//.word 0x86f63d18 -//.word 0x25143577 -//.word 0x6e43c7a4 -//.word 0x83713b92 -//.word 0x1bc6245b -//.word 0x77cff083 -//.word 0x98dcbd81 -//.word 0xafa66e7b -//.word 0xd535fe52 -//.word 0xfc0115de -//.word 0x2558d97b -//.word 0xd4ff07c4 -//.word 0xc11c429e -//.word 0xd153ab79 -//.word 0x4430b1d2 -//.word 0x30c52bfc -//.word 0x2e94a421 -//.word 0x53aff584 -//.word 0x621d1a08 -//.word 0x3f803ef6 -//.word 0xa7f518fb -//.word 0x1f3c7a70 -//.word 0x2a1927de -//.word 0xbff9e6c2 -//.word 0xfad9d48d -//.word 0x1264feef -//.word 0x8b5b2f55 -//.word 0xad3a07b1 -//.word 0x34194d79 -//.word 0x49d086f2 -//.word 0xb15ec7ae -//.word 0x458cc753 -//.word 0xa2cd389f -//.word 0x216958a9 -//.word 0x0adac36a -//.word 0x04768b7b -//.word 0xd04f8a20 -//.word 0x3758f786 -//.word 0x41c93849 -//.word 0xa8c4f739 -//.word 0x8c38785e -//.word 0x68062a3a -//.word 0x45627c4d -//.word 0x2e7cf1df -//.word 0xe36077f9 -//.word 0xd21bf5b5 -//.word 0x422023b7 -//.word 0xd2ea9efc -//.word 0x22e23cd3 -//.word 0xd0829c28 -//.word 0xa6bb0208 -//.word 0x11946262 -//.word 0xd515bb0b -//.word 0x0063a705 -//.word 0x1c2c2f01 -//.word 0xa945e322 -//.word 0xcb922b04 -//.word 0x3f27d8fd -//.word 0x93acfea3 -//.word 0x9706068e -//.word 0x0f34ff5f -//.word 0xaa763500 -//.word 0x38b5052e -//.word 0x171fef35 -//.word 0xee12edfb -//.word 0x9e3b0340 -//.word 0x76ff1824 -//.word 0xa71904ea -//.word 0xf785eafb -//.word 0xb99dc82e -//.word 0xfc834c46 -//.word 0x03beeabd -//.word 0xf5282bc0 -//.word 0xd607487a -//.word 0xb67af795 -//.word 0x281785fe -//.word 0xf6d225e9 -//.word 0x13208816 -//.word 0xd15dad52 -//.word 0x546bfb40 -//.word 0x479d8d59 -//.word 0xcdd3cd32 -//.word 0xbbe644fd -//.word 0x0446b053 -//.word 0x75e15731 -//.word 0xa2479c40 -//.word 0x200cd059 -//.word 0xf46e4a48 -//.word 0x4c38bad0 -//.word 0x6de7baf0 -//.word 0xed0aa665 -//.word 0x22efae70 -//.word 0xda7b29d9 -//.word 0x4c5a2c34 -//.word 0x4f595c63 -//.word 0xca0f005c -//.word 0x6cc35b2d -//.word 0x9d8a383d -//.word 0xb4b0c6d4 -//.word 0x6a59a6dd -//.word 0x8e6843eb -//.word 0xfba0627b -//.word 0xc809fa79 -//.word 0xbe964505 -//.word 0x0f041776 -//.word 0x44056f9f -//.word 0x789e4b52 -//.word 0xc4cec123 -//.word 0xfa704c6e -//.word 0x9662649c -//.word 0xf1e751a1 -//.word 0xb84a40c9 -//.word 0x9dc597b5 -//.word 0x4ca086a0 -//.word 0xa19ddee8 -//.word 0x189427c9 -//.word 0x855bed6b -//.word 0x05e85a1f -//.word 0x34ba0ae5 -//.word 0xa0751a33 -//.word 0x7ecc82f1 -//.word 0x9ca3a5c8 -//.word 0x9775279c -//.word 0x4ef4ff57 -//.word 0x96f0cde9 -//.word 0x307a6d8d -//.word 0xf849cc4d -//.word 0x5e5dfac8 -//.word 0x1ae18133 -//.word 0x1c56f69e -//.word 0xc2eecd78 -//.word 0x4e367156 -//.word 0x97f895f0 -//.word 0xff60c46c -//.word 0xa45d40e0 -//.word 0xdb4a0912 -//.word 0xdace3c82 -//.word 0xb4019eaa -//.word 0x8bd07984 -//.word 0x00a2a74d -//.word 0xef3cec89 -//.word 0x5ae18947 -//.word 0xa2be0da6 -//.word 0xfd866f98 -//.word 0x245a5ae6 -//.word 0x4cebc874 -//.word 0x58e2d2c7 -//.word 0x4d80c6c4 -//.word 0x06817bba -//.word 0x2947e1a3 -//.word 0x5934dca7 -//.word 0xad5853e2 -//.word 0x614c8467 -//.word 0xcc5d9a85 -//.word 0x92ed8149 -//.word 0x1b17f943 -//.word 0x4492e98d -//.word 0x54d8f60a -//.word 0x318755ec -//.word 0xd407dd79 -//.word 0xfa6d610e -//.word 0x1c9f3c64 -//.word 0xa2b92d12 -//.word 0x54b06653 -//.word 0x1136df0a -//.word 0xc3ddf003 -//.word 0x927e1f7c -//.word 0x58dc37e4 -//.word 0x55859ae2 -//.word 0x25f9d799 -//.word 0xee0e7f2b -//.word 0xde93357b -//.word 0xd5340538 -//.word 0x5e9df717 -//.word 0xe4e3e35f -//.word 0x231f86ab -//.word 0xdc5cd6eb -//.word 0xcdb393ad -//.word 0xe0b41f9b -//.word 0xa3088f44 -//.word 0xf855021f -//.word 0x0e6231cc -//.word 0x8f7c489e -//.word 0x1b18f557 -//.word 0xf6b9be32 -//.word 0xfd149727 -//.word 0xdf72b46a -//.word 0x89579c35 -//.word 0xe2617fc7 -//.word 0xb972c9ad -//.word 0xfb12f740 -//.word 0x2a0ea96f -//.word 0x0a65f9be -//.word 0x9e650c8f -//.word 0x5212e6a0 -//.word 0x7ac783d6 -//.word 0xfb202339 -//.word 0x4816e53f -//.word 0x916c974d -//.word 0x374bcd7b -//.word 0x82293098 -//.word 0x96ef196e -//.word 0xa35a5f46 -//.word 0x5da16daf -//.word 0xac59977c -//.word 0xa496ae0c -//.word 0xb754d1ce -//.word 0x29158703 -//.word 0xc5cb0bc6 -//.word 0xcff7e74a -//.word 0x3913c464 -//.word 0x192e8149 -//.word 0x5bd68298 -//.word 0xb33a4b9b -//.word 0xd6904dca -//.word 0xeab5ff90 -//.word 0x3b133152 -//.word 0x2fc89eae -//.word 0x7c05c000 -//.word 0x98b3e82b -//.word 0x725d8d96 -//.word 0x5f4ae474 -//.word 0x57e9b249 -//.word 0x61735fa9 -//.word 0x4ccb4b43 -//.word 0xa0a9651f -//.word 0xd4f7f924 -//.word 0xc17bc9dd -//.word 0x57b7607d -//.word 0x8f0da320 -//.word 0xa027a953 -//.word 0x7696ccd7 -//.word 0x60b900a2 -//.word 0x09e16427 -//.word 0xa9b217d7 -//.word 0x7ccd4de8 -//.word 0x74aca255 -//.word 0x2bccae26 -//.word 0x1b12d9f1 -//.word 0x116870a1 -//.word 0xdfa7f976 -//.word 0x51b9c44d -//.word 0x63ffc322 -//.word 0xb1f09bd3 -//.word 0x2f03fb26 -//.word 0x1acf2d0e -//.word 0x2f71eb2a -//.word 0x1a2f738f -//.word 0x315bdec7 -//.word 0x6279ad19 -//.word 0x6aa4a50b -//.word 0x482ddd26 -//.word 0xf28615f9 -//.word 0x465e4961 -//.word 0x430e8607 -//.word 0x7934fd29 -//.word 0xbe9d569e -//.word 0x23694614 -//.word 0x2769649d -//.word 0x2acc386a -//.word 0x24fb95d5 -//.word 0x96c129a5 -//.word 0xc1af538e -//.word 0x17bf34f8 -//.word 0xef370902 -//.word 0x7cd0b8c5 -//.word 0x0018a8dd -//.word 0x3d15d626 -//.word 0x2c2b26c3 -//.word 0xf23ff765 -//.word 0x101df9c9 -//.word 0xda174383 -//.word 0x2aefa0fb -//.word 0x55f82ab5 -//.word 0x5e771bd5 -//.word 0x6a4fdfe2 -//.word 0x74de6eca -//.word 0x4222d826 -//.word 0x982021c0 -//.word 0xab865052 -//.word 0xd88fc391 -//.word 0x9627c56a -//.word 0xaa50638c -//.word 0x9ac47b26 -//.word 0x63db15f2 -//.word 0x6eb0f672 -//.word 0xc17f737a -//.word 0x735284ee -//.word 0x62dd19cd -//.word 0x28a6b16e -//.word 0x4a69280a -//.word 0xb3bad07b -//.word 0x61ecc443 -//.word 0x5f3279d0 -//.word 0xf30496ff -//.word 0x18c406de -//.word 0x2ea24bb6 -//.word 0xf1bd1549 -//.word 0xa88a1358 -//.word 0x9e7a0968 -//.word 0xd6d723c6 -//.word 0xfbef89c9 -//.word 0x96753357 -//.word 0x8424ffaa -//.word 0xa6a50054 -//.word 0xdab31981 -//.word 0x2a7dcb7d -//.word 0x444c4c76 -//.word 0x2a65d982 -//.word 0x2b314ce4 -//.word 0x129bf18b -//.word 0x9dba96db -//.word 0x31b0e1b0 -//.word 0xcbd2e7a0 -//.word 0x3a09f981 -//.word 0x8c77c12b -//.word 0xc65e8f7f -//.word 0xd83eeda9 -//.word 0xcf3e79a1 -//.word 0x4dcdf4f8 -//.word 0x368996d1 -//.word 0xad60a42e -//.word 0x3ff5456d -//.word 0x5d459212 -//.word 0x108aecc6 -//.word 0xe86092a0 -//.word 0x362672a4 -//.word 0x7aa74089 -//.word 0x1ff9c6c0 -//.word 0x66a67bb1 -//.word 0xa10a5648 -//.word 0xa1fce4b0 -//.word 0x71b1995e -//.word 0x45dc6452 -//.word 0xad1a8599 -//.word 0x0e8ea317 -//.word 0x53c81983 -//.word 0xe0ec92b3 -//.word 0xc710d51a -//.word 0x3fe5e28f -//.word 0x529a3d4f -//.word 0xd5fd8a46 -//.word 0x9de45a8a -//.word 0xf0cb4529 -//.word 0x3abe3924 -//.word 0x017a11bb -//.word 0x1bcf69eb -//.word 0x1f48b136 -//.word 0x190e81a2 -//.word 0x820a2c04 -//.word 0x6f4a987e -//.word 0x08a64d47 -//.word 0x3ca3cbaa -//.word 0xb3972152 -//.word 0x040ebbc4 -//.word 0x296d7c2d -//.word 0x30d50d5e -//.word 0x324a7415 -//.word 0x8915e87e -//.word 0x3e66e3f9 -//.word 0xc13e7a1e -//.word 0xdd8ceafe -//.word 0xea9773ac -//.word 0x459b69fd -//.word 0xfdb7888b -//.word 0xcf068800 -//.word 0x550df191 -//.word 0x7a5531c8 -//.word 0x3158eb87 -//.word 0x67a2934a -//.word 0x353038ac -//.word 0x5b1ca02d -//.word 0xea7c9a32 -//.word 0x4087904d -//.word 0x39f95cbf -//.word 0xa4b95c3b -//.word 0xf4b9c9ed -//.word 0x381e44bb -//.word 0x4ea2b2cb -//.word 0x53364a45 -//.word 0x5debec5a -//.word 0x6d12b585 -//.word 0x9fa2d010 -//.word 0xa4db8fdb -//.word 0x7229ba59 -//.word 0x3a4b27db -//.word 0x9bb48a11 -//.word 0x15328fcd -//.word 0xc0cd260b -//.word 0x3ef21e2f -//.word 0xeed1f68d -//.word 0x6203f02e -//.word 0x147066d1 -//.word 0x54706131 -//.word 0x85306886 -//.word 0x8958964e -//.word 0x7aeaf04d -//.word 0x9b6df5d3 -//.word 0x8e4c763d -//.word 0xc779a7be -//.word 0x40557760 -//.word 0x6ed41d45 -//.word 0x75dcf333 -//.word 0x98ef8850 -//.word 0xf30af029 -//.word 0x6ccd5ff9 -//.word 0xe7dbf729 -//.word 0xb984dd13 -//.word 0x5fa2920b -//.word 0x71c081a0 -//.word 0xd182d41f -//.word 0x28418c59 -//.word 0x93f5d1a6 -//.word 0x9958862a -//.word 0x61482157 -//.word 0x216dbab3 -//.word 0xda1d61dc -//.word 0x437cb5c9 -//.word 0x02e8b352 -//.word 0x2294cbf3 -//.word 0xc27239cd -//.word 0x0a5792ed -//.word 0x645a9dd1 -//.word 0xe87d6528 -//.word 0x178f8cda -//.word 0xcd50e248 -//.word 0x71d736d5 -//.word 0x6f316da5 -//.word 0xe84bd1a5 -//.word 0xa811abcb -//.word 0x58d8139f -//.word 0xf4f907fa -//.word 0x80bfbb0d -//.word 0xf78430a6 -//.word 0x851608af -//.word 0xf56099f7 -//.word 0x6d464036 -//.word 0x59d0f74b -//.word 0xa58b2ac7 -//.word 0x2f2cc7af -//.word 0x7c77957e -//.word 0xaa5fc66a -//.word 0xa56fcfe8 -//.word 0x9e687772 -//.word 0xb92c2e88 -//.word 0x06daa1f5 -//.word 0xb33b8b53 -//.word 0x805dced1 -//.word 0x727dc234 -//.word 0xcc2acd1c -//.word 0x3ba83489 -//.word 0x5193309d -//.word 0x34c445a4 -//.word 0x9879cf51 -//.word 0xeaafde4a -//.word 0xced343e8 -//.word 0xcc9aeb37 -//.word 0x462e6c45 -//.word 0xae8ade99 -//.word 0xf627ec01 -//.word 0x47d82a91 -//.word 0xf5f2aae8 -//.word 0xb3b1cab5 -//.word 0x03d74f7a -//.word 0xf196b890 -//.word 0x01b0cc6c -//.word 0x66dd7620 -//.word 0x746dd224 -//.word 0x582e8857 -//.word 0x07905941 -//.word 0x7407f79b -//.word 0x06b11a11 -//.word 0x4939d046 -//.word 0xe4fb1419 -//.word 0xcb69a327 -//.word 0xb5ad0b90 -//.word 0xd19005ff -//.word 0xb49a04e4 -//.word 0x967a0e04 -//.word 0xbfa9cb34 -//.word 0x3c4bdc61 -//.word 0xd6566dd4 -//.word 0x45f50eb4 -//.word 0xa02fbecd -//.word 0x18c4498f -//.word 0xe657d55a -//.word 0x82d2b7f9 -//.word 0x16078b6c -//.word 0x329383ea -//.word 0xc108ff26 -//.word 0x3c4b5ed2 -//.word 0x1d3a1461 -//.word 0x9792fd12 -//.word 0x8410f22a -//.word 0x9fd79980 -//.word 0xf312813f -//.word 0x93da6ee8 -//.word 0x8c5af196 -//.word 0x18313c86 -//.word 0x141735d6 -//.word 0xb4c4c98d -//.word 0x760e83dc -//.word 0x54515da4 -//.word 0x3e13d637 -//.word 0xc7e84463 -//.word 0x1f946cad -//.word 0x417050da -//.word 0x6d0f48b4 -//.word 0xd920540a -//.word 0xa496b1f9 -//.word 0x0b07aa6a -//.word 0xdf52b1dc -//.word 0x3685ae64 -//.word 0x62fe97f1 -//.word 0x1fd041d5 -//.word 0x10687681 -//.word 0x6d704790 -//.word 0xf6f3a308 -//.word 0x2bc229dc -//.word 0xbe173bb5 -//.word 0x497954f1 -//.word 0x3ddf9bec -//.word 0x1a18b87f -//.word 0xe66ae6c7 -//.word 0xd87a4928 -//.word 0x546b8391 -//.word 0x1c4a8201 -//.word 0xc4aa9b4a -//.word 0x668bdd15 -//.word 0x98819f26 -//.word 0x9b125ce1 -//.word 0xd55fc10d -//.word 0x810703d9 -//.word 0xa648761c -//.word 0x45675ce1 -//.word 0xd752fa23 -//.word 0xf785f2d5 -//.word 0x5b2acc26 -//.word 0x0884d602 -//.word 0xc68d2edc -//.word 0xd2de1dab -//.word 0xd4d0a632 -//.word 0x10e15f85 -//.word 0xe05980c9 -//.word 0x622d3a3b -//.word 0x6e234a74 -//.word 0xcb37cdeb -//.word 0xa23d56bb -//.word 0x32c93ea6 -//.word 0xc64c3b5a -//.word 0xe47f34f4 -//.word 0xc80554c3 -//.word 0x114c5e4e -//.word 0xb9b44098 -//.word 0x4af3eaa2 -//.word 0x4fb86032 -//.word 0x098e0ed3 -//.word 0x64035d1d -//.word 0x290a8336 -//.word 0x759f9f99 -//.word 0x6aa90516 -//.word 0x2424d61a -//.word 0xef7fd531 -//.word 0xb74375c9 -//.word 0xc0f63739 -//.word 0x973f3202 -//.word 0x484bf354 -//.word 0xd16e88d4 -//.word 0xd70ed89c -//.word 0x98bd3683 -//.word 0x21a5359f -//.word 0xc029bd09 -//.word 0xbdc95ee0 -//.word 0x4546e591 -//.word 0xa7072d55 -//.word 0xc3bc38fb -//.word 0xbe417ee7 -//.word 0xfbc5855b -//.word 0x472bb2f5 -//.word 0x54b05f79 -//.word 0x69cf2ed1 -//.word 0x57629c52 -//.word 0xaf09d941 -//.word 0x32cfd796 -//.word 0x890ba0ff -//.word 0x3785ee28 -//.word 0xcbdaf53a -//.word 0x5a2284a2 -//.word 0x2ccf4c13 -//.word 0xb6d87fce -//.word 0xc8189e21 -//.word 0x08f18c2d -//.word 0x9f34e6ed -//.word 0x32459774 -//.word 0x147aa676 -//.word 0xbac5530a -//.word 0x6f9363ae -//.word 0x48f3b88c -//.word 0x5bfb24fc -//.word 0x2c677f49 -//.word 0x6884f7b8 -//.word 0xd64da8c6 -//.word 0x8ad36db2 -//.word 0x5ce2f53b -//.word 0x98e119ab -//.word 0xf7fa6c14 -//.word 0xce7b14da -//.word 0x867cd971 -//.word 0x4cc37c68 -//.word 0x09e44aa7 -//.word 0x95acf0f5 -//.word 0x28c091bd -//.word 0x11821611 -//.word 0xaa34c6ef -//.word 0x8b6016c3 -//.word 0xfe77c22e -//.word 0xb3b81c06 -//.word 0xb553a49e -//.word 0x9dcfda47 -//.word 0x06a95016 -//.word 0x403e03e8 -//.word 0x49eaeba4 -//.word 0xf872d1c0 -//.word 0x7c9f6107 -//.word 0x052c8099 -//.word 0xc1e3e033 -//.word 0x0a02d1b0 -//.word 0xdee35ad0 -//.word 0x8fdc8839 -//.word 0xbb6506bb -//.word 0x7f78eed8 -//.word 0xe83edf84 -//.word 0xaae75029 -//.word 0x15d923ee -//.word 0x440e7d39 -//.word 0x98b7d672 -//.word 0x65264c0b -//.word 0xeaea3dbd -//.word 0x873c1414 -//.word 0x2a9a632d -//.word 0x0bb133bf -//.word 0x99809858 -//.word 0xb3bb88e9 -//.word 0x1c6dec85 -//.word 0x29e2f866 -//.word 0xbdc4b831 -//.word 0x7784ec7a -//.word 0x2afb168b -//.word 0x8e52d161 -//.word 0x351f64f8 -//.word 0xc0d097c9 -//.word 0x524dc690 -//.word 0x45d93352 -//.word 0x1c39a09f -//.word 0xb9191e15 -//.word 0xd1ab2025 -//.word 0x9c91d31a -//.word 0xd1fdb256 -//.word 0xd11755df -//.word 0x229f891b -//.word 0x20d3a6d8 -//.word 0xef931d8f -//.word 0xb4c351ea -//.word 0x05f1a883 -//.word 0x9e37e1ef -//.word 0x5563a8fb -//.word 0x50566735 -//.word 0x75aa60af -//.word 0x2298f9ff -//.word 0x1e18568a -//.word 0xd0492d03 -//.word 0xaf14d62e -//.word 0xfa0ca2ea -//.word 0xa9996e6e -//.word 0xa35678d3 -//.word 0x31b771d3 -//.word 0xb3efd3d0 -//.word 0x92117417 -//.word 0x75755c67 -//.word 0xb85dd3ad -//.word 0x1ad8bf12 -//.word 0xb5e72d37 -//.word 0x34df2ebf -//.word 0x400ee40f -//.word 0x3ba1dc51 -//.word 0x31c59ebf -//.word 0x0b0d831e -//.word 0x0614c788 -//.word 0x6463df6f -//.word 0x62950ddf -//.word 0x69b93103 -//.word 0x88f7e2eb -//.word 0x2277bd8c -//.word 0xe47efd09 -//.word 0xfada4d31 -//.word 0x8381da48 -//.word 0x4275ab0a -//.word 0x96ea35ed -//.word 0xacab2aa7 -//.word 0xf3ba93f0 -//.word 0xd0361e89 -//.word 0x9482b97d -//.word 0xaba45fa7 -//.word 0x15eb3274 -//.word 0x1bd5cbea -//.word 0x3a2fcee9 -//.word 0x647ec1b1 -//.word 0x689e1ea5 -//.word 0xaea9a64f -//.word 0x271bf9a3 -//.word 0x84336488 -//.word 0xa69cfa94 -//.word 0x564ce617 -//.word 0x37adff5c -//.word 0xf8fa9d2b -//.word 0xceecab92 -//.word 0x2297fee6 -//.word 0x878ee504 -//.word 0xee4e02dc -//.word 0x1dda5831 -//.word 0x5da2a49a -//.word 0x73a9f1cd -//.word 0xd2e7671c -//.word 0x0fed6440 -//.word 0x95c7ce56 -//.word 0x9a26a727 -//.word 0x52bfe1ac -//.word 0x62ee74d2 -//.word 0x979faf7a -//.word 0xd86ecbc4 -//.word 0x590dc68d -//.word 0x12e66f36 -//.word 0x7002bda7 -//.word 0x4a2a6494 -//.word 0x164caaff -//.word 0x5d2077ff -//.word 0x6c0aacbf -//.word 0x4d43b6c9 -//.word 0xf5346385 -//.word 0xbf22f4fc -//.word 0x191073e2 -//.word 0x7de147d4 -//.word 0xa4be05de -//.word 0xf6b78940 -//.word 0x44ad4672 -//.word 0xb96fda65 -//.word 0x0e23e50c -//.word 0xfee81c1b -//.word 0xfab9990f -//.word 0x1d94756e -//.word 0x62dc9950 -//.word 0x15fdd11e -//.word 0x874e239a -//.word 0x063b5e1f -//.word 0x0ca3f52a -//.word 0xb77f0e1a -//.word 0x79c5d734 -//.word 0x118c19ea -//.word 0xba700f5d -//.word 0xa2387820 -//.word 0x9db6eb3f -//.word 0x1bef6b80 -//.word 0x587c3be8 -//.word 0xd230f381 -//.word 0x00fbd45b -//.word 0x410e59d1 -//.word 0x13400e0d -//.word 0x85b1a5cf -//.word 0xefad4769 -//.word 0xe0d3280f -//.word 0x58765e4d -//.word 0x3743f3d9 -//.word 0xf624398b -//.word 0x95655daa -//.word 0xd4163f69 -//.word 0xa6b081b1 -//.word 0xe3fbdf21 -//.word 0x3d2ebe54 -//.word 0x75580762 -//.word 0xcf0035a9 -//.word 0xc308adcd -//.word 0xf5d84efd -//.word 0x67b84a78 -//.word 0xed7c3450 -//.word 0xe2675a6e -//.word 0x1a4a54d7 -//.word 0x17ecdd2e -//.word 0x80aee279 -//.word 0xce6fd928 -//.word 0x49ae5453 -//.word 0x33eed643 -//.word 0x435fe534 -//.word 0x55ba6059 -//.word 0x5f6d1321 -//.word 0xa7f889b9 -//.word 0x339721d2 -//.word 0x812164a4 -//.word 0x79309632 -//.word 0xa0828bd0 -//.word 0x8e9fbde3 -//.word 0xa2bc9be9 -//.word 0xf4e023b9 -//.word 0x8b45b20b -//.word 0xd1011b3a -//.word 0x43e5f749 -//.word 0x6da63d25 -//.word 0x163a1329 -//.word 0xb885e3e7 -//.word 0x3335b026 -//.word 0xc1ebab27 -//.word 0x2d9b012d -//.word 0x4035f83b -//.word 0x7d853a20 -//.word 0x0e5870b1 -//.word 0xfde01356 -//.word 0xa7597fc8 -//.word 0x6eed4a18 -//.word 0xafd5d3f4 -//.word 0xf4c21e26 -//.word 0x6a7bdf5d -//.word 0x95c7d430 -//.word 0x428d5860 -//.word 0xbd3a365d -//.word 0x4563bb0c -//.word 0xbdac0fc8 -//.word 0xa4e8c5a7 -//.word 0x4781b0fe -//.word 0x351af827 -//.word 0xf4746e81 -//.word 0xf28e1db9 -//.word 0xbe112148 -//.word 0x78eabd3d -//.word 0x8739a73d -//.word 0x896aa6c8 -//.word 0x90a15fbd -//.word 0x8b5c6c21 -//.word 0x0254af1c -//.word 0x07a4e644 -//.word 0x692c7f1f -//.word 0x2a38ade2 -//.word 0x335dbb7f -//.word 0x47a4a1df -//.word 0x36ebd56c -//.word 0x538763d3 -//.word 0x272e4008 -//.word 0x6715db8a -//.word 0x2455f6e8 -//.word 0x4293b484 -//.word 0x2be0f397 -//.word 0xc4dedb75 -//.word 0xa124b713 -//.word 0x75e404c6 -//.word 0xcccbc84d -//.word 0xfc292612 -//.word 0x58522ead -//.word 0xa844faaa -//.word 0xd68af68c -//.word 0xea607f11 -//.word 0x3817b0b8 -//.word 0xd8bb7881 -//.word 0x57f4f0f4 -//.word 0xac2aec64 -//.word 0x6eecd175 -//.word 0x4493a6dc -//.word 0x9c226d66 -//.word 0xa071b33c -//.word 0x658b6665 -//.word 0x6654e78c -//.word 0x326f6004 -//.word 0x615e5809 -//.word 0xcceb8449 -//.word 0xfec7e0a3 -//.word 0xe572ff2e -//.word 0xcd5a9f7d -//.word 0x90478121 -//.word 0x06f67870 -//.word 0xc304bf85 -//.word 0x020f8f88 -//.word 0xdc17f130 -//.word 0xbe2ad285 -//.word 0x194055eb -//.word 0x5b646d5c -//.word 0x1f14aaf5 -//.word 0xa0eb53b4 -//.word 0x747db680 -//.word 0x7783bc69 -//.word 0x0538c032 -//.word 0x6c02a10c -//.word 0xa05516a5 -//.word 0x31d44261 -//.word 0x7bba89e7 -//.word 0x1d79a1e0 -//.word 0xaca1ecfb -//.word 0xa8020535 -//.word 0xae159957 -//.word 0xf09878c0 -//.word 0xe379eb64 -//.word 0x37f54915 -//.word 0x0c01c502 -//.word 0x63e98a7d -//.word 0xd2370a01 -//.word 0x7dd69273 -//.word 0x417722a8 -//.word 0x32347d28 -//.word 0x48737c31 -//.word 0x550ea7ff -//.word 0x3ab1064b -//.word 0x5b833512 -//.word 0x5008b797 -//.word 0xde468cab -//.word 0x2526062c -//.word 0x1a1ed8cc -//.word 0x380d7013 -//.word 0x736687a8 -//.word 0x6e91f6cc -//.word 0xed8ecb27 -//.word 0x8ddc9cc7 -//.word 0xb3991b66 -//.word 0xc2eaebeb -//.word 0x919db234 -//.word 0x1c0d7013 -//.word 0x79460f96 -//.word 0x0e6a3b8c -//.word 0x02547344 -//.word 0xf17a6098 -//.word 0xe418662a -//.word 0x808b7aee -//.word 0x7dfa33e9 -//.word 0x5a3c2338 -//.word 0x4ff66753 -//.word 0x84047d93 -//.word 0x801b56f2 -//.word 0xe4acac13 -//.word 0x590b9682 -//.word 0xc7d05a3c -//.word 0xc87e8272 -//.word 0x5c62328a -//.word 0xdebeb867 -//.word 0x362765ea -//.word 0x512c9bb8 -//.word 0xce38283e -//.word 0xfabad2f3 -//.word 0xff8233dd -//.word 0x586ec857 -//.word 0x88474411 -//.word 0x0ce62a58 -//.word 0x8e9b9a98 -//.word 0x5bcf6b1f -//.word 0x17e77b23 -//.word 0xb06c4307 -//.word 0x9069afda -//.word 0x17152c21 -//.word 0x48b202d6 -//.word 0xc2b5e4b0 -//.word 0xf227c5a5 -//.word 0x884beeae -//.word 0x27814eca -//.word 0x616a1145 -//.word 0xe24d743a -//.word 0xebbad757 -//.word 0x036d13e0 -//.word 0xe9740ff6 -//.word 0xcc958e1a -//.word 0xbeea4bed -//.word 0x67ce4839 -//.word 0xf6fd6335 -//.word 0x5df62a05 -//.word 0xbea4f081 -//.word 0x203e2137 -//.word 0x676cd2b3 -//.word 0x83ab9cfe -//.word 0xe7f2ab64 -//.word 0x3d96127a -//.word 0x586b6160 -//.word 0x6a2c7a44 -//.word 0x771ca027 -//.word 0x09eed1e4 -//.word 0x26e2566e -//.word 0x7f329859 -//.word 0xeaac359c -//.word 0x12a05395 -//.word 0x6dfc354d -//.word 0x6fb60cfe -//.word 0xfe6a0fd2 -//.word 0x2545cdee -//.word 0x0c21c2af -//.word 0x28f12933 -//.word 0xaf608000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x000101B0 -//// expected output -//.word 0x5169e69b -//.word 0xf0e77758 -//.word 0x1ca94e07 -//.word 0x0b47454a -//.word 0xd7f6af03 -//.word 0x4dd3e2ed -//.word 0x564d020f -//.word 0x6557fd90 -//.word 0x8f721e2b -//.word 0x19e548fb -//.word 0x0c41763f -//.word 0xe0abdd89 -//.word 0xefdacce8 -//.word 0xe3546faf -//.word 0x22f3fd08 -//.word 0x9928b019 -//// SHA512LongMsgvector_83 -//// vector length -//.word 0x000104C8 -//// input message -//.word 0x07ab398f -//.word 0x3a21e5a2 -//.word 0xfd2c0f85 -//.word 0x73ad22c6 -//.word 0x83405d76 -//.word 0x8b1d292e -//.word 0x523caa50 -//.word 0x3fbd948f -//.word 0xc98640b2 -//.word 0x2f2eff94 -//.word 0x691aae70 -//.word 0x5ee58a5b -//.word 0x57054612 -//.word 0xb4ac5bf6 -//.word 0xdeeda055 -//.word 0x7c201aeb -//.word 0xea8715a9 -//.word 0xe63273b5 -//.word 0x8d1f45b1 -//.word 0x87a69840 -//.word 0x7e1491c6 -//.word 0xd497bd70 -//.word 0x955aa275 -//.word 0xaaf09a9b -//.word 0x50f6e1fc -//.word 0xc9f4ec0a -//.word 0x5185fcd1 -//.word 0x54b8f47c -//.word 0xdeb5671b -//.word 0x53a4f6a3 -//.word 0x60cad936 -//.word 0x31f5bba5 -//.word 0xe51bcb34 -//.word 0x3f3e109d -//.word 0x9e92fc57 -//.word 0x2fe24517 -//.word 0x6130f098 -//.word 0x999caf98 -//.word 0x28876c23 -//.word 0x7af72613 -//.word 0x8f3dfcd8 -//.word 0xafd68775 -//.word 0x5a906dcb -//.word 0x7fed331a -//.word 0xeecc53c5 -//.word 0x0e468f55 -//.word 0xd3d784c1 -//.word 0xebbe82ed -//.word 0x38a69b70 -//.word 0x8385fa9a -//.word 0x6fc577b6 -//.word 0xaba2688c -//.word 0x6cd3b92a -//.word 0x1b6c3fe4 -//.word 0x4a03499a -//.word 0xed117839 -//.word 0xc79cd184 -//.word 0x22131115 -//.word 0xc37a409e -//.word 0x1dc68975 -//.word 0xc58b4950 -//.word 0x26d4664d -//.word 0x7652e235 -//.word 0xe9bab001 -//.word 0x2468c69d -//.word 0xf44873ed -//.word 0x40f6f30e -//.word 0x3c2441de -//.word 0xe03d2cbe -//.word 0x9947ad96 -//.word 0x3e0e781a -//.word 0x457fd14c -//.word 0x3752a142 -//.word 0x61ecc92a -//.word 0xcd83b68b -//.word 0x708335ce -//.word 0xa53089fc -//.word 0xda8dbcc9 -//.word 0x897d32d2 -//.word 0x6b298423 -//.word 0xe8a18bfc -//.word 0xd1c6bad5 -//.word 0x5167b19f -//.word 0x21aa104d -//.word 0xfcae8993 -//.word 0x536e3aed -//.word 0x41e939e4 -//.word 0xc180708d -//.word 0x1f9fab52 -//.word 0xac9feff4 -//.word 0xb6eb0ed1 -//.word 0xb7627863 -//.word 0xcdfd540a -//.word 0x6ab2cf0b -//.word 0x4d98b4d8 -//.word 0xb14b3e92 -//.word 0xc4922acc -//.word 0x5a3f0f92 -//.word 0xe357f2a9 -//.word 0x9a731519 -//.word 0x006611e9 -//.word 0x8920242a -//.word 0x95d3cc37 -//.word 0xa154953a -//.word 0xbfc32ff2 -//.word 0x436ec3b4 -//.word 0xc0f387b0 -//.word 0x33a59176 -//.word 0x7d31e9b9 -//.word 0x1782e152 -//.word 0x01e1a987 -//.word 0xfb611e8e -//.word 0xf87ae34d -//.word 0xd0f4b364 -//.word 0x3506f56d -//.word 0xe8c09182 -//.word 0x2ca60300 -//.word 0x7c9eae8b -//.word 0x790c7253 -//.word 0x263b8095 -//.word 0x57ff6d64 -//.word 0x679886a9 -//.word 0x2ada6469 -//.word 0x228bc046 -//.word 0xf60d8849 -//.word 0x1f3c31de -//.word 0xe59a5020 -//.word 0x8aaa6457 -//.word 0xc599f6bf -//.word 0x7223e58c -//.word 0x87b5fb2a -//.word 0x4acfc3c9 -//.word 0xc1ad9f19 -//.word 0x6a261552 -//.word 0x2dd46a78 -//.word 0x8f7572dd -//.word 0x2891a6e7 -//.word 0x575e7713 -//.word 0x34e0e23a -//.word 0xc6544514 -//.word 0x77cf71fa -//.word 0xc42300f0 -//.word 0x3902e9e2 -//.word 0x9d66512e -//.word 0x6a2fa463 -//.word 0x800ee548 -//.word 0x19a34221 -//.word 0x00e2ec2d -//.word 0xfebb2573 -//.word 0x95fa9bbf -//.word 0xf16cf4e7 -//.word 0x1c43aa52 -//.word 0x71bb19bb -//.word 0x53fed633 -//.word 0x1f454365 -//.word 0x5e41601e -//.word 0x40b9e40d -//.word 0x46748dc7 -//.word 0x3e59b40d -//.word 0x74d52452 -//.word 0x277d2c78 -//.word 0x3af5f3db -//.word 0x2c100c90 -//.word 0x4a384aef -//.word 0x2311d64e -//.word 0x3d597e10 -//.word 0x061350df -//.word 0x0de46835 -//.word 0x72bd0621 -//.word 0x9cbae448 -//.word 0x294ac62a -//.word 0x2b9152a6 -//.word 0x910a22c0 -//.word 0xe37118a3 -//.word 0x33e0f1e2 -//.word 0x50381d03 -//.word 0x3cc2ce3e -//.word 0xe0165082 -//.word 0xff3c98b9 -//.word 0x69121f4d -//.word 0x71edf1eb -//.word 0xa0830087 -//.word 0xab09bfa0 -//.word 0xa398ecc5 -//.word 0x6cd5ad58 -//.word 0x70d1df92 -//.word 0x942eabc7 -//.word 0x6c845aeb -//.word 0xaa026a56 -//.word 0xdd59e1c4 -//.word 0x58d5e1a0 -//.word 0x6fcd7d82 -//.word 0xea3ecbf6 -//.word 0xb3b33a7f -//.word 0xd26826db -//.word 0x9baeaa89 -//.word 0x2691b689 -//.word 0x00b96163 -//.word 0x208e806a -//.word 0x1da07742 -//.word 0x9e454fa0 -//.word 0x11840951 -//.word 0xa031327e -//.word 0x605ab82e -//.word 0xcce2fc0c -//.word 0x736c286b -//.word 0xed7ac387 -//.word 0x13d6830d -//.word 0x703262de -//.word 0xf20bf310 -//.word 0xe5d3f736 -//.word 0x224e2ce2 -//.word 0x843d6568 -//.word 0x9c3adfe4 -//.word 0xa6e3d37e -//.word 0xbb3a48ec -//.word 0x484c2b39 -//.word 0xbe11a1c5 -//.word 0x8b949c8e -//.word 0x4a53adad -//.word 0x36e91924 -//.word 0xe5ea2ed6 -//.word 0x330fd7d7 -//.word 0x7c936fe6 -//.word 0x0edcd338 -//.word 0xdd5ebb78 -//.word 0x79bd4a0b -//.word 0x3e31e398 -//.word 0xca2f3fc8 -//.word 0xb546bc4a -//.word 0x7c47f81b -//.word 0xbda89f04 -//.word 0xaa2a8164 -//.word 0xb8bae82f -//.word 0x97952837 -//.word 0x67b077aa -//.word 0x2957ffdc -//.word 0x73143247 -//.word 0x68d25ed1 -//.word 0xe842814d -//.word 0x047e5e43 -//.word 0xb5edd0f4 -//.word 0xcd665f99 -//.word 0x2d9811ec -//.word 0x39a982e9 -//.word 0x891d37d6 -//.word 0xe1fa3081 -//.word 0x6429bcc9 -//.word 0x0420925f -//.word 0x3dbe1cce -//.word 0x037616b9 -//.word 0xf9b05864 -//.word 0xe36cf077 -//.word 0x5e2974fe -//.word 0xcf0597b3 -//.word 0x9925f980 -//.word 0x93574440 -//.word 0xb9f674c6 -//.word 0x210f7620 -//.word 0x31c1f51c -//.word 0x10ea710c -//.word 0x5a0091c7 -//.word 0x183cbaf0 -//.word 0xeffee07b -//.word 0x976d9c6c -//.word 0x8f5d7fe2 -//.word 0x0f77a755 -//.word 0x3f938f1c -//.word 0xa6692b32 -//.word 0xe5693539 -//.word 0xa5e7c2bf -//.word 0xce7b18c1 -//.word 0xf9a8c36d -//.word 0x29bbe62c -//.word 0xb5f6d0e0 -//.word 0x89eecf6a -//.word 0x8f324970 -//.word 0x672d085d -//.word 0x5e4ed6a9 -//.word 0x9e664a5a -//.word 0xa251e1cb -//.word 0xedd850ac -//.word 0xfcd6194a -//.word 0x799a5d10 -//.word 0xb18df14e -//.word 0x4814b43a -//.word 0x2bb81f35 -//.word 0xc7851d4f -//.word 0x79af1d0c -//.word 0x457c6669 -//.word 0xca5dab1a -//.word 0x755ee016 -//.word 0xf6c14c55 -//.word 0xf0e6ded8 -//.word 0xf56fc4eb -//.word 0xb1a13aa7 -//.word 0x650ca0ba -//.word 0x986ed06b -//.word 0x09d5aed8 -//.word 0xe7040182 -//.word 0x4418810c -//.word 0xc86b3040 -//.word 0xa2b9ee53 -//.word 0xc481486a -//.word 0x50ae925c -//.word 0x4d7735ba -//.word 0x9f84490d -//.word 0x3652675e -//.word 0x85d8b8fc -//.word 0x366b5279 -//.word 0x1cdfc5f6 -//.word 0x69eff0a0 -//.word 0x21de1a7b -//.word 0xce5f3e5f -//.word 0x76b3a540 -//.word 0xca11bab2 -//.word 0xa04a1bab -//.word 0xa3adec8b -//.word 0x4928705b -//.word 0x06b1da52 -//.word 0xc0e4609e -//.word 0x82ee9261 -//.word 0x74a9eaf9 -//.word 0x0b08a484 -//.word 0x7db6cfa3 -//.word 0x78faa57f -//.word 0x13de180a -//.word 0x0590ad88 -//.word 0x14088d4d -//.word 0xd1ebdac8 -//.word 0x83b03fc0 -//.word 0x6101cbde -//.word 0x0464ff6c -//.word 0x1b1a255c -//.word 0x6147e48c -//.word 0xcc541248 -//.word 0x0792c911 -//.word 0x2320bd9c -//.word 0x8a0ecc1e -//.word 0x34c2d7c7 -//.word 0x1d9bd18c -//.word 0xf6d5152a -//.word 0x1aadfd68 -//.word 0xc5c5b09c -//.word 0x80c93b70 -//.word 0xe053e4e6 -//.word 0x700cba9a -//.word 0xec157148 -//.word 0xb0a56d8d -//.word 0x6ff31df2 -//.word 0x28568a26 -//.word 0x56aa308b -//.word 0x68f70cf4 -//.word 0x704df6ae -//.word 0x1ff231bd -//.word 0xf1c04167 -//.word 0xa5c8fcf7 -//.word 0xf03be4bb -//.word 0x728bb44f -//.word 0xe9cd391d -//.word 0xa5626325 -//.word 0x3cd69cfa -//.word 0x7e08580d -//.word 0xab8bee2e -//.word 0xe44da650 -//.word 0xe076138d -//.word 0xe093a36a -//.word 0xe5f4745b -//.word 0x2052698a -//.word 0xaab67ed4 -//.word 0x75955814 -//.word 0x834021a5 -//.word 0x557c9222 -//.word 0xa76c5170 -//.word 0x5ab87eff -//.word 0xb2e8884c -//.word 0xc11146ab -//.word 0x23b44343 -//.word 0xece3595a -//.word 0xdfa581d3 -//.word 0xe19ce9f4 -//.word 0xade5476d -//.word 0xc8406e96 -//.word 0xb8711ef9 -//.word 0x71e62110 -//.word 0x10999350 -//.word 0xcb388266 -//.word 0x2884b7c0 -//.word 0x6ef7d24f -//.word 0x59a99d8b -//.word 0x12749ab8 -//.word 0x5e56de68 -//.word 0x16182242 -//.word 0xd72d1801 -//.word 0xfaddfbc0 -//.word 0xc7a36a74 -//.word 0xe5d376ba -//.word 0x157ffad3 -//.word 0x219c2bec -//.word 0x0e616fa3 -//.word 0x99f073c8 -//.word 0xe2387760 -//.word 0x621aedf0 -//.word 0x22ca43f8 -//.word 0x2f79fdbd -//.word 0x4931064b -//.word 0xdb0048bb -//.word 0x30587ab2 -//.word 0xe3b6392a -//.word 0x97825b75 -//.word 0xe936807e -//.word 0xa3c3e953 -//.word 0x32318ee0 -//.word 0x5b856afd -//.word 0x29e71aac -//.word 0x2a04a69b -//.word 0xdbb29ff1 -//.word 0x60d26a47 -//.word 0x787bdbf3 -//.word 0xb155068d -//.word 0xd84251ac -//.word 0xb444cef1 -//.word 0xf49bc847 -//.word 0x652d9c68 -//.word 0x682bcaa4 -//.word 0xa4f24cde -//.word 0xf82f27d7 -//.word 0xb3473faf -//.word 0x08f66fa8 -//.word 0xbc36d92e -//.word 0x22627b14 -//.word 0x499b0421 -//.word 0x746be5cb -//.word 0xcaa8aa42 -//.word 0x4f9b8bb0 -//.word 0x13623ebf -//.word 0xaa93105d -//.word 0xdb2234bc -//.word 0x9c855b9c -//.word 0x3f1585cc -//.word 0xe6b816ee -//.word 0x3cbd2c7c -//.word 0x67073008 -//.word 0x386eabc8 -//.word 0xa5625b51 -//.word 0x7ad187a3 -//.word 0x4b4b8f66 -//.word 0xad65c773 -//.word 0xa65b8596 -//.word 0x61f97992 -//.word 0x26bb3d66 -//.word 0x8a332dcf -//.word 0xe3ab790e -//.word 0xff0c79eb -//.word 0x16fe40fa -//.word 0xfc51731d -//.word 0x9b9c5c4a -//.word 0xa1233a8f -//.word 0x76fedb53 -//.word 0x71786dde -//.word 0x4bb6921c -//.word 0xd499b29d -//.word 0xe4e495e1 -//.word 0x95a231d3 -//.word 0xafc2c093 -//.word 0x64051678 -//.word 0x3e1a3256 -//.word 0x550713fc -//.word 0xc5cacd01 -//.word 0x5f40dbc1 -//.word 0x9f47b7a2 -//.word 0xde1fa89c -//.word 0xc917dbf8 -//.word 0x1265b657 -//.word 0x665569f7 -//.word 0x9ea6c632 -//.word 0x39305247 -//.word 0x0acb9c5d -//.word 0x2e6dcdc5 -//.word 0x41928180 -//.word 0xd1e1d501 -//.word 0x130cc133 -//.word 0xd5f8a9be -//.word 0xb41e2e87 -//.word 0x8f314a75 -//.word 0x3c009c7b -//.word 0x799f00d3 -//.word 0x25c16387 -//.word 0xb069d636 -//.word 0xd0c2e015 -//.word 0x754a1934 -//.word 0x0036f403 -//.word 0xaf13dd14 -//.word 0x5ca98422 -//.word 0x68247853 -//.word 0xf276f7ba -//.word 0x4cf70520 -//.word 0xaf4ebb04 -//.word 0x2d95e2e0 -//.word 0xe8b8c0ae -//.word 0x821e32ab -//.word 0xd48cfb5b -//.word 0xe3465ccd -//.word 0x0f77e520 -//.word 0x8ed28a46 -//.word 0x197af908 -//.word 0xe51f2b4a -//.word 0xd56a3991 -//.word 0xee9c72c2 -//.word 0x0b72aa2d -//.word 0xd24bd4c9 -//.word 0xe68cd4c1 -//.word 0x5e448e30 -//.word 0x770c4329 -//.word 0x85321dfb -//.word 0x301608b3 -//.word 0xdcd3c4e2 -//.word 0x692238a0 -//.word 0x1d7c0ad0 -//.word 0xde7f6ca6 -//.word 0xa5933967 -//.word 0x2fcd4070 -//.word 0xf614e07a -//.word 0x5f82d51c -//.word 0x350c5191 -//.word 0x56664ebc -//.word 0xac212369 -//.word 0x5f1756d6 -//.word 0x4908b272 -//.word 0xab8599e4 -//.word 0x1e0d9b4f -//.word 0xcc7747d5 -//.word 0xdf8f405a -//.word 0x3a04948a -//.word 0x67824a1d -//.word 0xd11b3a59 -//.word 0x34eb22d9 -//.word 0x51fcf58e -//.word 0xe6677603 -//.word 0xddbc06e5 -//.word 0xc4a4bac2 -//.word 0x7dc5b111 -//.word 0x37e6a573 -//.word 0x9d54bf38 -//.word 0x4c84b025 -//.word 0x8bf9fd74 -//.word 0x36689a1d -//.word 0xfc1bbb54 -//.word 0xcb93e753 -//.word 0x87714e59 -//.word 0x02975cf3 -//.word 0x298a8e7a -//.word 0x7b1a85dd -//.word 0xc04659a0 -//.word 0xf75a2f25 -//.word 0x905a0e2b -//.word 0xdba3ee94 -//.word 0xc1d0126b -//.word 0xb2db9825 -//.word 0xde844f27 -//.word 0xa8f7c889 -//.word 0x57a9b01a -//.word 0x0f835ca4 -//.word 0x0142a671 -//.word 0xde1ef80d -//.word 0x91a9a64e -//.word 0x2dfb8192 -//.word 0x240ca948 -//.word 0xbb61a2b2 -//.word 0xbaebaae8 -//.word 0x682c4a21 -//.word 0xb69b2c2e -//.word 0xbb4a2c47 -//.word 0x60c6b10a -//.word 0x5d3e3ec1 -//.word 0x64e844e4 -//.word 0x9ba13bdf -//.word 0x50d4f014 -//.word 0xe99c2124 -//.word 0x192d476a -//.word 0x5a70b3c9 -//.word 0x97eddca8 -//.word 0x28eef83a -//.word 0x04e1c903 -//.word 0x32ffba98 -//.word 0x812b2aa6 -//.word 0x791d0835 -//.word 0x91bfa02e -//.word 0xa3d7b41b -//.word 0x9ce7cf2f -//.word 0x7851d686 -//.word 0x6ebfe0ad -//.word 0x67c24765 -//.word 0xb5ba00a4 -//.word 0x02f527dd -//.word 0x861bde81 -//.word 0x7ec958c6 -//.word 0xd97c31a7 -//.word 0x34b1012c -//.word 0x084a30eb -//.word 0x22340ccf -//.word 0x54471818 -//.word 0x6b6da7a3 -//.word 0x6007aa6c -//.word 0xd38cc751 -//.word 0xb473ab19 -//.word 0x4454a0b4 -//.word 0x3c4a62c4 -//.word 0x4b9b2e5d -//.word 0xc69b1d09 -//.word 0x9ccdb010 -//.word 0x884cacf6 -//.word 0x8a692844 -//.word 0x9796e48c -//.word 0x9083dca7 -//.word 0x71861d41 -//.word 0xcb40d898 -//.word 0x747eb580 -//.word 0x7c5d69ab -//.word 0x64b28b27 -//.word 0x8ba8a328 -//.word 0xe9ab8508 -//.word 0xff85dd8c -//.word 0x0ec70a69 -//.word 0x886b3006 -//.word 0xc4b78884 -//.word 0xf565fbfc -//.word 0x5d00f007 -//.word 0xbe916284 -//.word 0x127b3595 -//.word 0x7ba4caeb -//.word 0x7dd5d144 -//.word 0x6b645e31 -//.word 0x1f103f1d -//.word 0xee2c8e8b -//.word 0xdc00829f -//.word 0x0b6c8ae0 -//.word 0x7ace9d3c -//.word 0xec26cb4d -//.word 0x257819da -//.word 0x5c728ba1 -//.word 0xee4f8253 -//.word 0x50fb48e1 -//.word 0x4778eaf6 -//.word 0x5b8046c4 -//.word 0x896c6404 -//.word 0x38540a38 -//.word 0x6e788a34 -//.word 0x44dedfdc -//.word 0x973df82f -//.word 0x011a5485 -//.word 0x0731cf14 -//.word 0x9416bcb9 -//.word 0xa71c33f6 -//.word 0x4876ac37 -//.word 0xc09ccd59 -//.word 0x09f1816c -//.word 0x84a24ab8 -//.word 0xead1d8ff -//.word 0x85f3da02 -//.word 0xa0761446 -//.word 0x3ca7b218 -//.word 0x04d4dccf -//.word 0x83ad8a51 -//.word 0x95f09ad9 -//.word 0x1b4620f7 -//.word 0xf368fdd8 -//.word 0x2885b3c7 -//.word 0x65e877f4 -//.word 0xb0d68874 -//.word 0x54b5c08a -//.word 0x1f746825 -//.word 0xce2651a9 -//.word 0xc6f020f2 -//.word 0x0526ea97 -//.word 0x57b1016b -//.word 0xcdb40d4a -//.word 0x6b6f5e12 -//.word 0x216380ef -//.word 0xfdb610dc -//.word 0x9edacf66 -//.word 0xec6af5b3 -//.word 0x0654c8c4 -//.word 0x7c3d6cf7 -//.word 0xbf21fdd0 -//.word 0xd53adbf8 -//.word 0x51244586 -//.word 0x833e2a7e -//.word 0xec533b97 -//.word 0xf47a4542 -//.word 0xe03abee7 -//.word 0xfef29e72 -//.word 0x2278700e -//.word 0x5601a830 -//.word 0xce4137d8 -//.word 0x1ad35d14 -//.word 0x9fdabec5 -//.word 0x48e9b9a5 -//.word 0x7920f589 -//.word 0x45983ce4 -//.word 0xe0028d8d -//.word 0x578a6cc2 -//.word 0x7e027d6c -//.word 0x2a3c51a4 -//.word 0xa1b78077 -//.word 0x4f7ef8e6 -//.word 0xbb4e9431 -//.word 0xb9f7f156 -//.word 0xe0047dd4 -//.word 0x3e9ed0b4 -//.word 0x4bae40ca -//.word 0x1c42af39 -//.word 0xd932a835 -//.word 0x7103ab0d -//.word 0x8c0bc468 -//.word 0xc2d662ce -//.word 0x0ac9676b -//.word 0x75057c10 -//.word 0x1c8fa77b -//.word 0x56ad1fd8 -//.word 0x2f935f88 -//.word 0x163e7920 -//.word 0xd6a1adb5 -//.word 0xc8ff3a57 -//.word 0x469874db -//.word 0x628717de -//.word 0xd8ebdb06 -//.word 0x4245488b -//.word 0x8b21ccf6 -//.word 0xa6f90b29 -//.word 0x805676a0 -//.word 0x33381ff6 -//.word 0x7cb8cbab -//.word 0x6fec4924 -//.word 0x690b03f3 -//.word 0x47d1d359 -//.word 0xd5251809 -//.word 0x89fa082f -//.word 0x727348b1 -//.word 0x6b4abab5 -//.word 0x94729663 -//.word 0x03fbbcec -//.word 0xb63748cb -//.word 0xcc1b674b -//.word 0xf5e76a49 -//.word 0x280a193b -//.word 0x943f4a71 -//.word 0xd8fdb29b -//.word 0x760efa8c -//.word 0x857d153d -//.word 0xa7b6d215 -//.word 0x3be9ad67 -//.word 0xd4afeb3d -//.word 0xe9f0e654 -//.word 0xce04a567 -//.word 0xe218afb0 -//.word 0x0bd421ad -//.word 0x5f3bff20 -//.word 0x24d2c859 -//.word 0xfb044db7 -//.word 0x58c5c26d -//.word 0x35761682 -//.word 0x0808801c -//.word 0xf2655bfd -//.word 0x390b334e -//.word 0xf8fa209b -//.word 0x15d15220 -//.word 0x7434ee43 -//.word 0x6a701961 -//.word 0x756251cd -//.word 0x2a950416 -//.word 0x6eaa5b89 -//.word 0xe9fd57f7 -//.word 0xb88520b9 -//.word 0x62fc9af0 -//.word 0x0e403811 -//.word 0xf3fa15a2 -//.word 0x0f7d413e -//.word 0x1cf158df -//.word 0xc0b05a5d -//.word 0x04f0b631 -//.word 0x07a3a87f -//.word 0xf49bc554 -//.word 0x31f2d52c -//.word 0xd9a9e0b7 -//.word 0x6d8f8cdc -//.word 0xc664a6ff -//.word 0x4e3ffe7f -//.word 0x702d7883 -//.word 0x4d1b60f7 -//.word 0xb1f6fed1 -//.word 0x45106a99 -//.word 0x06c6a228 -//.word 0xf560dab0 -//.word 0x103813fc -//.word 0x821feff9 -//.word 0x17fcc476 -//.word 0xf2b6ef28 -//.word 0x82546bf1 -//.word 0xb263a261 -//.word 0x6098827e -//.word 0x11b7d4c0 -//.word 0xe3b3c960 -//.word 0xc317d6d3 -//.word 0xdfa4c291 -//.word 0x5e3cfe1a -//.word 0x4fff343b -//.word 0xe0b3228d -//.word 0xd169a940 -//.word 0x285d2116 -//.word 0x251ff0b2 -//.word 0x78f05b13 -//.word 0xb26f9c5c -//.word 0xfa7534d6 -//.word 0x013d8237 -//.word 0x38c89525 -//.word 0x407f3ff6 -//.word 0xa11b6aba -//.word 0xc0c2af7b -//.word 0x0b7225c3 -//.word 0x77a3775f -//.word 0x2c283a63 -//.word 0x7e577d6e -//.word 0x2069a12f -//.word 0x94246b28 -//.word 0xe6b757b2 -//.word 0x9ae52f42 -//.word 0xe365ddea -//.word 0x16897e23 -//.word 0x5d1fb7c9 -//.word 0xb0954c67 -//.word 0x0160eeb5 -//.word 0xb79d555f -//.word 0x5ef98f08 -//.word 0x9dcf988f -//.word 0x68912a91 -//.word 0x7669d62f -//.word 0xf6205411 -//.word 0x7e3e18aa -//.word 0x447325be -//.word 0x90352622 -//.word 0x71abbbc4 -//.word 0xb0ca11eb -//.word 0x02beb5bf -//.word 0x818baa0b -//.word 0x5df4b942 -//.word 0xcf9c08c0 -//.word 0x4f6bee53 -//.word 0x073306fa -//.word 0x879382ec -//.word 0xba1cc2dc -//.word 0x19b3267c -//.word 0x1e362040 -//.word 0xfc638d64 -//.word 0x8df54530 -//.word 0x8c0ff07b -//.word 0x04de1c6e -//.word 0x087b8d8a -//.word 0xa50ed4ec -//.word 0x153924d0 -//.word 0x35b46055 -//.word 0x3a347880 -//.word 0x9f92f682 -//.word 0x6129d43e -//.word 0x6f809106 -//.word 0x5c2984a5 -//.word 0x58e86fa3 -//.word 0x5e1857c4 -//.word 0xaf4b93d2 -//.word 0x7e31249c -//.word 0xedbb443f -//.word 0x387f41a4 -//.word 0x305f8c4a -//.word 0xec650d46 -//.word 0xbbf2ba88 -//.word 0x5c18685f -//.word 0x7244e140 -//.word 0x322036c3 -//.word 0x5fb757ee -//.word 0x78dbe0b6 -//.word 0x30c336c3 -//.word 0x1ef9d374 -//.word 0xb674de23 -//.word 0x7800ffaa -//.word 0x67e77125 -//.word 0xbdca59fa -//.word 0xddd05617 -//.word 0x8903597b -//.word 0x55f6b7f8 -//.word 0x5bab7c37 -//.word 0x31b503fc -//.word 0x189ac3ab -//.word 0x767b6c0c -//.word 0x87f7334b -//.word 0x4f4c6943 -//.word 0xd3bf53fb -//.word 0x883f3671 -//.word 0x0c45b197 -//.word 0x14fe4f9c -//.word 0xa6ac5d6c -//.word 0x884af97a -//.word 0xf86e6cbd -//.word 0x9d74baf8 -//.word 0xbed9773f -//.word 0xb2e5dbb7 -//.word 0x978d199d -//.word 0x4797ed8a -//.word 0x88ff74f5 -//.word 0x839a41f9 -//.word 0x78f9ad58 -//.word 0xaf906ec1 -//.word 0xb2176c4e -//.word 0xb931d051 -//.word 0x664c5d50 -//.word 0xb2c8034e -//.word 0x285bb14c -//.word 0x51b46c10 -//.word 0x6f5e9e25 -//.word 0x6de8b023 -//.word 0x1743da31 -//.word 0x876b3ac7 -//.word 0xdf4924b9 -//.word 0x3ed9ba71 -//.word 0xec88bc7b -//.word 0xd8e0a148 -//.word 0x4566e62b -//.word 0xc0c3a6a8 -//.word 0x55236bee -//.word 0x02db44a2 -//.word 0x6c4e17de -//.word 0xd111397a -//.word 0x3e4d3c8a -//.word 0x02650827 -//.word 0x62d92d73 -//.word 0x8e6b78d7 -//.word 0xd480c58f -//.word 0x14c81369 -//.word 0x7421dec9 -//.word 0x54b9a9f1 -//.word 0x8573da7f -//.word 0xb58dca37 -//.word 0x2e7f1d03 -//.word 0xc1264f38 -//.word 0xfc21901b -//.word 0xa47cd2a4 -//.word 0x5f8b2082 -//.word 0xb019315e -//.word 0x28c33d64 -//.word 0xdb9e0f00 -//.word 0x12205ce5 -//.word 0x3f3d5354 -//.word 0x36d0759b -//.word 0x993da7dc -//.word 0x9454850f -//.word 0xcb79fa4a -//.word 0x91020d40 -//.word 0x5be1fe09 -//.word 0x74839221 -//.word 0xf2f8abb2 -//.word 0xe8531b16 -//.word 0xdd54ba97 -//.word 0x7d44b77a -//.word 0x8f212b3d -//.word 0x27fbf41c -//.word 0x1d9ec0da -//.word 0xbd7168bd -//.word 0xc09e80db -//.word 0x7c732c94 -//.word 0x57093460 -//.word 0x81235bcb -//.word 0xe358edbd -//.word 0x527598ff -//.word 0x091d7cfb -//.word 0x56b285c3 -//.word 0x9379f955 -//.word 0x58f84d1e -//.word 0xefa33dbc -//.word 0x08b81c08 -//.word 0xae686854 -//.word 0x7a37a1f1 -//.word 0x07a55bf5 -//.word 0xa50e933a -//.word 0x52cf3faa -//.word 0xe6aa28ba -//.word 0x8d6cfc35 -//.word 0x7acc9f3b -//.word 0xda97c389 -//.word 0x070ab8fb -//.word 0xff7f854e -//.word 0x144d372b -//.word 0xe5e97961 -//.word 0x8c516573 -//.word 0x19aa9a52 -//.word 0x40278f6b -//.word 0x4e2e27e4 -//.word 0x61b68523 -//.word 0xd9f42191 -//.word 0x0a361b9d -//.word 0x330fd003 -//.word 0xb4b4ac4e -//.word 0x7ba63f9b -//.word 0xc09192a1 -//.word 0xf274bbee -//.word 0xf103af73 -//.word 0x7d4a5843 -//.word 0xef92e798 -//.word 0x26886c17 -//.word 0xc59ca355 -//.word 0x9ca81199 -//.word 0x63d250e4 -//.word 0xaeb3a82e -//.word 0x1db9dff3 -//.word 0xd3c951ee -//.word 0x2a294325 -//.word 0xa59e7425 -//.word 0x27d1f58f -//.word 0x62f73bd3 -//.word 0x91b1733c -//.word 0x6a31152d -//.word 0x4e9fbcaa -//.word 0xc4bb3519 -//.word 0x25c3d54a -//.word 0x999710b6 -//.word 0x411b4804 -//.word 0xb6dde3d2 -//.word 0xb3f8a0b1 -//.word 0x0e382b71 -//.word 0xed7eefa0 -//.word 0x36662b4d -//.word 0x47284811 -//.word 0xe8bc6a51 -//.word 0x7d4245bd -//.word 0x81a0321c -//.word 0x2f6d814c -//.word 0x820e1184 -//.word 0x601e1fdd -//.word 0x12145c11 -//.word 0xf81f4282 -//.word 0x7b55a77e -//.word 0x420d93c1 -//.word 0xa9894f3b -//.word 0x6fd9be14 -//.word 0xaefbf0ee -//.word 0x1147f56a -//.word 0x410befed -//.word 0xa0726ba4 -//.word 0x3aaaf2c5 -//.word 0xf945da18 -//.word 0x18e062b7 -//.word 0xd903ff12 -//.word 0x7b49f035 -//.word 0x66c1184e -//.word 0xaa930d69 -//.word 0xa7e76d7f -//.word 0x0d0271af -//.word 0x08b2c4cb -//.word 0xb4ed9516 -//.word 0xd7b5eb4c -//.word 0xcf3e38e3 -//.word 0xc9533291 -//.word 0x34f6de0e -//.word 0x7647ed1b -//.word 0xdda74cc3 -//.word 0xd81cf7e1 -//.word 0x67f70ee2 -//.word 0xd0b52acc -//.word 0x9424f17f -//.word 0xa1c7e83c -//.word 0xc97a8963 -//.word 0x73599681 -//.word 0x90dfac89 -//.word 0xd14b1b62 -//.word 0x1748f5a2 -//.word 0x2ccc659a -//.word 0xb0414292 -//.word 0x56e3e455 -//.word 0x506937f1 -//.word 0x07e70db8 -//.word 0x10f3b98a -//.word 0x5b07d957 -//.word 0xae2673df -//.word 0x52c244bc -//.word 0x0dde54a3 -//.word 0x5070cee7 -//.word 0xb0090f3e -//.word 0x9ab7fdc8 -//.word 0x432b9a4d -//.word 0xdf17d9c7 -//.word 0x13dab020 -//.word 0xac5f6e3c -//.word 0x91424f3a -//.word 0xf6354df7 -//.word 0xd3a33ad4 -//.word 0x95930cba -//.word 0x13ce785b -//.word 0xc344c2ba -//.word 0x2eacd3ed -//.word 0xa16b8c21 -//.word 0x26b75ae0 -//.word 0xb2fc0a8f -//.word 0xa07edf3b -//.word 0x5e41e295 -//.word 0x67267a3a -//.word 0x71563c38 -//.word 0xe7e304ce -//.word 0x99ad4574 -//.word 0xb3839d1b -//.word 0xeb8badb6 -//.word 0xffe427f9 -//.word 0x5f892861 -//.word 0x2679c974 -//.word 0x4f15f14a -//.word 0x26c96d4c -//.word 0xfcee423c -//.word 0x1fef4176 -//.word 0x0aabdd75 -//.word 0xd81b3a98 -//.word 0xff358626 -//.word 0x3a108c91 -//.word 0xc74886f7 -//.word 0xd3a433ee -//.word 0x33f62a81 -//.word 0x54436e76 -//.word 0x752442d3 -//.word 0x136c3fa0 -//.word 0xa50ba3ed -//.word 0x8a33ec17 -//.word 0x40b9a648 -//.word 0xd6bd813d -//.word 0xa48da64c -//.word 0x39c74ba5 -//.word 0x95be85d8 -//.word 0x991f5e97 -//.word 0xbbd528bd -//.word 0xfe291190 -//.word 0x222ef743 -//.word 0x175c7dc0 -//.word 0xb87b5ea4 -//.word 0xb6c3018a -//.word 0xd2414e8c -//.word 0x507cc107 -//.word 0xa859bc9f -//.word 0x7e3c2283 -//.word 0xd47021f2 -//.word 0x7fc94fff -//.word 0xd787f991 -//.word 0xb37eb7ad -//.word 0x957444f8 -//.word 0x21cb8d77 -//.word 0xd460089a -//.word 0xf2b24779 -//.word 0xc047cd5d -//.word 0xf44b2082 -//.word 0x6a7b201b -//.word 0x18419697 -//.word 0x44201023 -//.word 0xf453ed70 -//.word 0xa7b1b4b6 -//.word 0x42d4aaf9 -//.word 0x4d7aa38b -//.word 0x5f2b18d2 -//.word 0xd71d7a4b -//.word 0xcd54c6cf -//.word 0x490d5a15 -//.word 0xb25d0779 -//.word 0x891667fb -//.word 0x57ea708b -//.word 0xe3d34a84 -//.word 0xa9b25e76 -//.word 0x8836b028 -//.word 0xbbff6edd -//.word 0x0a03c9d7 -//.word 0x4131031a -//.word 0xe255c972 -//.word 0x173cc4b7 -//.word 0xea186b50 -//.word 0xb8251bf6 -//.word 0xe38d69ba -//.word 0xc88ab74a -//.word 0xf1ca0570 -//.word 0x8b170adb -//.word 0x1a378322 -//.word 0x6b11cc06 -//.word 0xca12adf8 -//.word 0x76cf76db -//.word 0x52ec4e0a -//.word 0xdd3cc89d -//.word 0x6429b7e8 -//.word 0x77574445 -//.word 0x99843d14 -//.word 0x3bb3b0ff -//.word 0xec89b983 -//.word 0xcaf798ab -//.word 0x3c19061f -//.word 0xe35eca5e -//.word 0xcdea8748 -//.word 0xec38d8df -//.word 0xc7049e4e -//.word 0x7068992b -//.word 0xb64536f9 -//.word 0x9be4a8f1 -//.word 0x09dd3a02 -//.word 0xc038e416 -//.word 0x93d31c97 -//.word 0xd403ee31 -//.word 0x0d7e4fda -//.word 0xf079af10 -//.word 0x910dcd62 -//.word 0xd3dfcf32 -//.word 0x200092b9 -//.word 0x5e123f4c -//.word 0x1ead1fdd -//.word 0x1601b0c4 -//.word 0xd1bcf8c0 -//.word 0xa52e1938 -//.word 0xe6aa26c7 -//.word 0x593035f8 -//.word 0xeb4ab54e -//.word 0xa3340288 -//.word 0xd63f3722 -//.word 0x9a77441f -//.word 0x7c844006 -//.word 0x76ce002b -//.word 0x1be5e82f -//.word 0x151f01ca -//.word 0xd1834cc8 -//.word 0x79e55652 -//.word 0x23530d6f -//.word 0x48b0d2cb -//.word 0x779fcfb6 -//.word 0x4aa38b6f -//.word 0x9a84bba3 -//.word 0xeff45c31 -//.word 0x3a72fe30 -//.word 0xc76f6333 -//.word 0x6daf48cb -//.word 0x08f3834e -//.word 0x29d54ed7 -//.word 0x0bf3e38e -//.word 0xc94f492a -//.word 0xcff66db4 -//.word 0x8ee0748d -//.word 0x751850b2 -//.word 0x1c1c913f -//.word 0xc2877e32 -//.word 0xf9ed6572 -//.word 0xa0072f10 -//.word 0x121037cc -//.word 0x9d6e5ddb -//.word 0x369556e7 -//.word 0x6a294658 -//.word 0x986290d2 -//.word 0x5eb5ecfe -//.word 0x51b1bb8e -//.word 0xf127987b -//.word 0xdc8d3091 -//.word 0x41a4532e -//.word 0x98594b47 -//.word 0x90e96cab -//.word 0x4949ec8c -//.word 0xc4c5f53b -//.word 0x98e7f933 -//.word 0xe69a4659 -//.word 0x8e8fda82 -//.word 0xa3e07836 -//.word 0x1df4fbb4 -//.word 0xcea2eb35 -//.word 0x98994e75 -//.word 0xdcffc070 -//.word 0x3558c669 -//.word 0x67aa6031 -//.word 0x92dedda6 -//.word 0xac6af37a -//.word 0x2d2d0f36 -//.word 0x0c9aea7e -//.word 0xeb195d96 -//.word 0x8faa7625 -//.word 0x92cccb39 -//.word 0x5c9d0e8c -//.word 0x4f42e206 -//.word 0x4289ed82 -//.word 0x31cd2fd5 -//.word 0x321b920c -//.word 0xab92c2f6 -//.word 0xc3103ee3 -//.word 0x160bb0aa -//.word 0xadbc7af1 -//.word 0x2d8391a8 -//.word 0x4e878ed7 -//.word 0x8f9d029a -//.word 0x296b0a69 -//.word 0x41cd249d -//.word 0x61774130 -//.word 0x29dc1cc5 -//.word 0x424fc9e8 -//.word 0x94689196 -//.word 0xb9aafd00 -//.word 0xb162318c -//.word 0xd7d27b1d -//.word 0x138f2c94 -//.word 0x5228a797 -//.word 0x3308b791 -//.word 0x039e26f9 -//.word 0xecbb8bd8 -//.word 0x693b6385 -//.word 0xfde763b3 -//.word 0x259a0dae -//.word 0x8ba382e2 -//.word 0x7c6b979d -//.word 0x9c582a16 -//.word 0xd9f0b7ad -//.word 0x9d422674 -//.word 0x4881e7ef -//.word 0xddf34118 -//.word 0xfb09e7a6 -//.word 0x10d0cd8f -//.word 0xc98839cc -//.word 0xcd911d5c -//.word 0xaa8fa48b -//.word 0x0fc60b74 -//.word 0x3dc6b2c5 -//.word 0xb84d73c2 -//.word 0x4269328d -//.word 0x09ddb5a4 -//.word 0x20c6b6ab -//.word 0x2c7e376c -//.word 0x60c1161c -//.word 0xab0ee1df -//.word 0x2f50eb8f -//.word 0xf6bea0b9 -//.word 0xe00015e9 -//.word 0xe093e428 -//.word 0x686e36c2 -//.word 0x22e6214d -//.word 0xe1cf35e6 -//.word 0xd7e451be -//.word 0x0869bbd6 -//.word 0xfe0e7006 -//.word 0xbf17b944 -//.word 0xfcbaff23 -//.word 0x8bc8e09a -//.word 0x18908307 -//.word 0x17012873 -//.word 0xfc0e0318 -//.word 0xaf574a20 -//.word 0x3a058db0 -//.word 0xc5f54625 -//.word 0xc51ab19e -//.word 0x701cddba -//.word 0x744503a3 -//.word 0xe89e184b -//.word 0x83559ef5 -//.word 0x0c62bff8 -//.word 0x116a9cbf -//.word 0xdce4e315 -//.word 0xa37a9f9f -//.word 0xffb255aa -//.word 0x9fcd4c28 -//.word 0x3ef02cf4 -//.word 0xd281cb5e -//.word 0x07d443e3 -//.word 0xeb07483c -//.word 0xeb2ab89b -//.word 0xfea37431 -//.word 0x20d16ff3 -//.word 0x02f0049e -//.word 0x003d8df8 -//.word 0x535a3159 -//.word 0x88f3fd6b -//.word 0x30a2362e -//.word 0xda10ee3f -//.word 0x3e5ed659 -//.word 0xbbc3531c -//.word 0x0476d40d -//.word 0x16ce62df -//.word 0x6da779f1 -//.word 0x77091617 -//.word 0x4904119d -//.word 0x91dead89 -//.word 0xcb716e21 -//.word 0xb8ce2aad -//.word 0x0c26637e -//.word 0x67ebd42f -//.word 0x87324a2b -//.word 0xbc5cb56f -//.word 0x9cf57f92 -//.word 0xf7dc1c02 -//.word 0x0ea4e390 -//.word 0xff3b1c2f -//.word 0x84c95af8 -//.word 0xdddb0b72 -//.word 0x0bc14d11 -//.word 0x3f3403fc -//.word 0x923d2813 -//.word 0xf6526431 -//.word 0x6dc1ddae -//.word 0x79525029 -//.word 0xd3276084 -//.word 0x5fe82e2f -//.word 0x601d29aa -//.word 0xe9db2845 -//.word 0x94a3b62b -//.word 0x7587ac9e -//.word 0x518e0684 -//.word 0x0c5aef23 -//.word 0x61081e29 -//.word 0xd65865ef -//.word 0xee0e87fe -//.word 0xa0984bd3 -//.word 0x08f0cedf -//.word 0x5dc41dd2 -//.word 0x23d50319 -//.word 0xa19d20a5 -//.word 0x96343bef -//.word 0x2874da39 -//.word 0x1d5c0f16 -//.word 0x4db2942c -//.word 0x57ec1a39 -//.word 0x9451df54 -//.word 0x495c7f76 -//.word 0x21610c38 -//.word 0xda7260de -//.word 0x3e84b295 -//.word 0x55ce68f9 -//.word 0xd9722cda -//.word 0xea5f4240 -//.word 0x037619ac -//.word 0x2dec20a1 -//.word 0x72efda63 -//.word 0x958c35ff -//.word 0x00d0188b -//.word 0xfe2d3baf -//.word 0x2a203b65 -//.word 0x2811eefc -//.word 0x927bf463 -//.word 0x354c8ea4 -//.word 0x7e8fb3af -//.word 0x2f486159 -//.word 0x569f32a4 -//.word 0x80412f41 -//.word 0x2a04e853 -//.word 0x78cac576 -//.word 0x2aa79700 -//.word 0xcb467287 -//.word 0x2b88bfa3 -//.word 0x106f8df4 -//.word 0x293b2867 -//.word 0x43d2edb6 -//.word 0xbf655c2e -//.word 0x44516fb5 -//.word 0xb1432a0b -//.word 0x56a07450 -//.word 0x632425c7 -//.word 0xa0c960d9 -//.word 0x5fea235d -//.word 0xb0a81c16 -//.word 0xd38dbf7d -//.word 0xf36f95c1 -//.word 0x1197d70d -//.word 0x3e233b09 -//.word 0x0da90ea3 -//.word 0x481d830f -//.word 0xe2f54b0c -//.word 0x2d8a656a -//.word 0x4dc238c9 -//.word 0xedecdfa3 -//.word 0x30ebc48d -//.word 0xea9770b9 -//.word 0x1160a1c0 -//.word 0x6e359d9e -//.word 0x98a4c7fe -//.word 0x234270b9 -//.word 0x154def99 -//.word 0x9990f462 -//.word 0xf8871913 -//.word 0xc4c4ba69 -//.word 0x579107a5 -//.word 0x7cd7578f -//.word 0x6b3ec0bb -//.word 0xfb96e40b -//.word 0x13760d75 -//.word 0x61227d06 -//.word 0x4fb2ff27 -//.word 0x3371c220 -//.word 0xc68467da -//.word 0xd8cc59e9 -//.word 0x420d5dc9 -//.word 0x1b4f6a68 -//.word 0x2f84bae5 -//.word 0xac6c2198 -//.word 0x1fb69e52 -//.word 0x9f6830e6 -//.word 0x4880eae8 -//.word 0xecdb4ab4 -//.word 0x0457c7b2 -//.word 0xed35a9d9 -//.word 0x51c11d72 -//.word 0xe334891f -//.word 0x4fd91d1b -//.word 0x706fabc3 -//.word 0xc4cfb856 -//.word 0x1eced3f9 -//.word 0x9b6525fe -//.word 0xd70f4a65 -//.word 0x61735fa3 -//.word 0x6c435ca3 -//.word 0xc764a40b -//.word 0x0f4fdbc0 -//.word 0x23b7f8ac -//.word 0xd86c9bbf -//.word 0xee7fa033 -//.word 0x43a7f415 -//.word 0x47e3a701 -//.word 0xb061432d -//.word 0x6f9f5da8 -//.word 0xe2d069e4 -//.word 0x4b81d373 -//.word 0x817c4b0e -//.word 0xe5ec60db -//.word 0x98c350f0 -//.word 0xeb591e13 -//.word 0x1755e6c3 -//.word 0x2fd16e7d -//.word 0x52b9fd38 -//.word 0x25747032 -//.word 0x80c78aee -//.word 0x68f68c7d -//.word 0x3e2c05fe -//.word 0x351cec61 -//.word 0x0ae9ec70 -//.word 0xef43ff0f -//.word 0xc8d43ec2 -//.word 0x99daf871 -//.word 0x3f150168 -//.word 0x5fe34ca2 -//.word 0x9daabc47 -//.word 0x0e763873 -//.word 0xefe3fe39 -//.word 0x973e39e8 -//.word 0xaae7d58c -//.word 0x90f992b8 -//.word 0x252d5783 -//.word 0xb2fccad1 -//.word 0x1d041dd4 -//.word 0x5cad2ad2 -//.word 0x2f0cc328 -//.word 0x0f08438f -//.word 0x61bb699e -//.word 0xf01b6790 -//.word 0x9ad93548 -//.word 0x4a892b92 -//.word 0x2604cfac -//.word 0x090aec05 -//.word 0x332ce444 -//.word 0x3fe9468c -//.word 0x5618a3fe -//.word 0xa3869e80 -//.word 0x06df43bd -//.word 0x0dd29a6d -//.word 0x20707bd7 -//.word 0xfbd5a394 -//.word 0x620b0895 -//.word 0x0f2b6a68 -//.word 0xf0c52bb6 -//.word 0x8f826011 -//.word 0xd20828ec -//.word 0xe41e3deb -//.word 0x7311c85e -//.word 0x1c567a08 -//.word 0x2370d824 -//.word 0x6815d6aa -//.word 0x968ca8ce -//.word 0x9e59d5c9 -//.word 0x641c8ddd -//.word 0xb7b73c93 -//.word 0x87af5f48 -//.word 0x52d597e7 -//.word 0xe025fbf8 -//.word 0x30eeb3da -//.word 0xb233c34c -//.word 0xb7512433 -//.word 0x25e31997 -//.word 0x6fe3c0ee -//.word 0xc412e79d -//.word 0x879922bc -//.word 0x00f01a19 -//.word 0x51ff2880 -//.word 0xab83233a -//.word 0xc1b476d4 -//.word 0x7d257522 -//.word 0xf2ebf182 -//.word 0x93010965 -//.word 0xa2eb440c -//.word 0xeb9add90 -//.word 0xb1905e25 -//.word 0xe944709f -//.word 0xa6c8f236 -//.word 0xd5a94886 -//.word 0x2a17f6da -//.word 0x5a456da9 -//.word 0x8b132461 -//.word 0x08ebeb64 -//.word 0x3ae87d50 -//.word 0xd43e5484 -//.word 0x4dd6c1e0 -//.word 0x93383bcb -//.word 0xfeaef87b -//.word 0x82a6ba71 -//.word 0x2a59ec42 -//.word 0xc1aaed9d -//.word 0xd251ac8a -//.word 0xd43875f0 -//.word 0x9e250a5a -//.word 0x219af6fa -//.word 0x55fa1eef -//.word 0x74ec99c3 -//.word 0x6704c138 -//.word 0x7da18a44 -//.word 0x6311135a -//.word 0x51fc7beb -//.word 0x81fff62d -//.word 0xe597201b -//.word 0x194191bd -//.word 0x97dfb1a9 -//.word 0x2a5ecdca -//.word 0xa5966b60 -//.word 0xd471db48 -//.word 0xb3500f7e -//.word 0xdeaaade0 -//.word 0x49f66134 -//.word 0x31cc786d -//.word 0x5247ab2a -//.word 0x5bad3880 -//.word 0x9f5238f9 -//.word 0x0db92cdc -//.word 0x62fdd9af -//.word 0x9d6f56fb -//.word 0xb381634f -//.word 0x85e3fc87 -//.word 0x0feb2e4e -//.word 0xe23a2ae2 -//.word 0xd49d9818 -//.word 0xf6312d9f -//.word 0xc6cb8088 -//.word 0xa6961906 -//.word 0x8dfecb73 -//.word 0xfdcd4594 -//.word 0x3594e31e -//.word 0xa74dca79 -//.word 0xac3e33c3 -//.word 0x77210718 -//.word 0x4781ad11 -//.word 0xe1671f8a -//.word 0x3e3644a9 -//.word 0x81d47a1c -//.word 0x2c0a71a1 -//.word 0x922e40cc -//.word 0x90ffb205 -//.word 0x78d0e1d0 -//.word 0x4ee90751 -//.word 0x372a900f -//.word 0x2ef174f8 -//.word 0xf93ec3a5 -//.word 0x5b1582e0 -//.word 0x8c24b563 -//.word 0xe6a6bde3 -//.word 0xe187e44d -//.word 0x41c93750 -//.word 0x8e26941b -//.word 0xc5f70368 -//.word 0x4d5449b9 -//.word 0x2c7dbbe1 -//.word 0x7b7851c7 -//.word 0x17fcfb67 -//.word 0x9a8e3819 -//.word 0x8aeae416 -//.word 0xd0a45138 -//.word 0x6b0f9a01 -//.word 0x655e34df -//.word 0x0609c6ae -//.word 0x49733b7f -//.word 0x8cc91598 -//.word 0x8b2d04bc -//.word 0x8f14b7ac -//.word 0xe3ecf2ed -//.word 0x8803e1cc -//.word 0x29a4aca0 -//.word 0x51834b4f -//.word 0xdc5a9c13 -//.word 0xacd5b27e -//.word 0x9dac70bc -//.word 0xba0e5719 -//.word 0xb1469dc2 -//.word 0x84997fd0 -//.word 0x826dd882 -//.word 0x76b1f1ca -//.word 0x1e789b0c -//.word 0xdee77b22 -//.word 0xb652a6a3 -//.word 0x72a26e65 -//.word 0x20fa7b40 -//.word 0xc79a1d15 -//.word 0x5603e00f -//.word 0xdb5b6129 -//.word 0xf51461f1 -//.word 0x8cc9188b -//.word 0xbf68cbf8 -//.word 0x1e96a199 -//.word 0x1a4fb3ee -//.word 0xb9cd62a4 -//.word 0x8facedcf -//.word 0xe94b4374 -//.word 0x4b75154a -//.word 0x1d4130c1 -//.word 0xa1360a44 -//.word 0x28b39abb -//.word 0x868e6d55 -//.word 0xc3fcf784 -//.word 0x13b12749 -//.word 0x08483eb1 -//.word 0x07e4e0a0 -//.word 0xf9186bcd -//.word 0x4204890e -//.word 0xf7c101d6 -//.word 0x4b00d3fb -//.word 0x4bed83bd -//.word 0xcc5ab505 -//.word 0xa119faea -//.word 0x11a9ea79 -//.word 0x881673b6 -//.word 0x8c1a70de -//.word 0xf3887def -//.word 0x53ea0a6a -//.word 0xbb69af58 -//.word 0xa0eebf8b -//.word 0x1a872026 -//.word 0x510c5a60 -//.word 0x3102ed84 -//.word 0x66bfe83c -//.word 0x84cfb710 -//.word 0x85973d2a -//.word 0x7938235c -//.word 0x79b76f64 -//.word 0xdd5a586e -//.word 0xaf5558da -//.word 0x5fa58440 -//.word 0xb73d19b1 -//.word 0x12605740 -//.word 0xc94e92c1 -//.word 0xef2286d1 -//.word 0x3efbeb17 -//.word 0x505a49c9 -//.word 0x13cb0e71 -//.word 0x77c8def1 -//.word 0x69da2ac4 -//.word 0x05010488 -//.word 0x075631b9 -//.word 0x83ef80c0 -//.word 0xd7035b2c -//.word 0xdd4e9c3f -//.word 0x65b7a2ac -//.word 0xe231a39f -//.word 0x63df43fe -//.word 0xc57b66ee -//.word 0x27f8439a -//.word 0x9f66bb30 -//.word 0x2b17e82b -//.word 0xeb00f8d8 -//.word 0x8d613c13 -//.word 0x08a97c52 -//.word 0x8d948ee6 -//.word 0xba96267d -//.word 0x127cf0ea -//.word 0xaa51dc29 -//.word 0x247eba9d -//.word 0xe136069d -//.word 0x7311052f -//.word 0x51f71113 -//.word 0xcf403004 -//.word 0x4d19ec3a -//.word 0xae2a5f33 -//.word 0x0c768eb3 -//.word 0xa982f80a -//.word 0x29b96e95 -//.word 0xff0f2487 -//.word 0x26e509e9 -//.word 0x112c54e0 -//.word 0xe4ce5f2f -//.word 0xe449b9fc -//.word 0x2c9d77d7 -//.word 0xa369caf8 -//.word 0x2a51d7c8 -//.word 0x1aa2c2a4 -//.word 0xed390cdd -//.word 0x3ba12003 -//.word 0xe97b2863 -//.word 0x9d2325ce -//.word 0x74903f9c -//.word 0xf87c59f1 -//.word 0x4cc5e93f -//.word 0xaa14070c -//.word 0x10bcc4f6 -//.word 0x35e5bcf4 -//.word 0xc2e9efde -//.word 0xbffecc30 -//.word 0x4b168f0b -//.word 0x9103cd7c -//.word 0xf7df4d01 -//.word 0x98ab1a49 -//.word 0xf536d63c -//.word 0xe740513b -//.word 0xd9e05ba9 -//.word 0x3323d6aa -//.word 0x19f60f2a -//.word 0x56464e22 -//.word 0x9365ab16 -//.word 0xcdb024e3 -//.word 0x066fedb7 -//.word 0x3afc0761 -//.word 0x942814cb -//.word 0xe2da6ac4 -//.word 0x47f96603 -//.word 0x2f8c0269 -//.word 0x8820aa87 -//.word 0x306a4c60 -//.word 0xa92eaf70 -//.word 0x146005ed -//.word 0x5d88c34c -//.word 0xb36bb007 -//.word 0x3be73c9e -//.word 0x051f14dc -//.word 0x3fd8f35b -//.word 0xa823bb4a -//.word 0x483dc46e -//.word 0x5fb37467 -//.word 0x9bc91035 -//.word 0x8d1dd1fa -//.word 0x5e883b01 -//.word 0xbe45aa00 -//.word 0x1e552e9a -//.word 0x1f219828 -//.word 0x4a62d5b9 -//.word 0x013e7b57 -//.word 0xb5b3a28d -//.word 0x5a39f526 -//.word 0x18a30936 -//.word 0x4447ed5f -//.word 0x8e5e024d -//.word 0x7cae0c83 -//.word 0x17668a5a -//.word 0xe4494346 -//.word 0x150e225c -//.word 0x01074311 -//.word 0xd2024e45 -//.word 0x7d6d0480 -//.word 0xf8bd177b -//.word 0xa7103fe2 -//.word 0x17108a58 -//.word 0xee1bf4bc -//.word 0x22a237aa -//.word 0x6acfe445 -//.word 0xf26bb334 -//.word 0x53fe17eb -//.word 0xc238162c -//.word 0x878f58cd -//.word 0xb22a7ebb -//.word 0x09feb53f -//.word 0x44378a80 -//.word 0x7dd9004a -//.word 0xe2a7df0d -//.word 0xad445029 -//.word 0x5698a768 -//.word 0x067580cc -//.word 0x507a0d8c -//.word 0x1c38ae59 -//.word 0xe394c2e5 -//.word 0x226cbea6 -//.word 0x087e7cd8 -//.word 0x7285d5c1 -//.word 0x1aa47138 -//.word 0x0b08de68 -//.word 0x59cae0d2 -//.word 0x0e120891 -//.word 0x678288e2 -//.word 0x41d246e3 -//.word 0xceb72f9b -//.word 0x8c0ace3b -//.word 0x78261da3 -//.word 0x7f929b28 -//.word 0x35e09e95 -//.word 0xc9d4eb6f -//.word 0x39c9847e -//.word 0xc251c188 -//.word 0x9b1ca260 -//.word 0xe21b6420 -//.word 0xd7e452b2 -//.word 0x4859de95 -//.word 0x4c84f0dd -//.word 0x34c67e7c -//.word 0xbf315dc1 -//.word 0x8d32571e -//.word 0xd6737d2e -//.word 0x5cffbef6 -//.word 0x9ea8b96c -//.word 0x4fa6d035 -//.word 0x06807eb3 -//.word 0x3730ea3f -//.word 0x6282bcb3 -//.word 0x8abd2f2c -//.word 0xe985670e -//.word 0xe2000648 -//.word 0x3738fad9 -//.word 0x7cc09893 -//.word 0xcc9bef1e -//.word 0xba595641 -//.word 0x8a83485d -//.word 0xa239723a -//.word 0x3b1a0906 -//.word 0x5c64619b -//.word 0x095cbc01 -//.word 0xb8f16034 -//.word 0x049cec27 -//.word 0xa58aeb08 -//.word 0xa0fdaac6 -//.word 0xbbf047d1 -//.word 0x34fa0b21 -//.word 0xb274f979 -//.word 0x7cdea7ed -//.word 0xe97f4da2 -//.word 0x184c1cd5 -//.word 0xe00bd11e -//.word 0x0ab889f6 -//.word 0xbe28d778 -//.word 0x3cec1464 -//.word 0xcd78f669 -//.word 0xf88564a4 -//.word 0xf8b38964 -//.word 0x6e732830 -//.word 0x54242f0b -//.word 0x327c8ef6 -//.word 0x942a49b7 -//.word 0xbbb9ccd9 -//.word 0x93b880f4 -//.word 0xe5189b2e -//.word 0xced53c02 -//.word 0x70d9b740 -//.word 0xe71d2d55 -//.word 0x7e1161cd -//.word 0x233ec616 -//.word 0x1929dd87 -//.word 0xed7bbda0 -//.word 0xab60f394 -//.word 0x512d8d04 -//.word 0x8445720e -//.word 0x823df586 -//.word 0x583ea983 -//.word 0x55ab761e -//.word 0xbe04ec76 -//.word 0xc30bd8f8 -//.word 0xb22515dd -//.word 0x6b02a5f3 -//.word 0x148000a1 -//.word 0x0ecdac25 -//.word 0x27cc0e21 -//.word 0x11bb8056 -//.word 0x1312a4af -//.word 0xfeaef781 -//.word 0x632ea911 -//.word 0x039eac57 -//.word 0x87530b01 -//.word 0x71157dbb -//.word 0x53843aae -//.word 0x3eb40d46 -//.word 0x7e1baa39 -//.word 0x84ad43c5 -//.word 0x24455639 -//.word 0x0147c9b6 -//.word 0x45833837 -//.word 0x955d8ecf -//.word 0x442bd232 -//.word 0xc6df4477 -//.word 0x68e6a91c -//.word 0x3f50e34b -//.word 0x5e30c45b -//.word 0x4c46249a -//.word 0xb6db314a -//.word 0x60ed07e9 -//.word 0x618c81b6 -//.word 0x90844e70 -//.word 0x3a3c4761 -//.word 0x16deff9b -//.word 0x7ab89c82 -//.word 0xcee3e68a -//.word 0x42229e42 -//.word 0xbc0c1192 -//.word 0x146eed40 -//.word 0x84eb52b9 -//.word 0x5ae52c0f -//.word 0xf0a1c13e -//.word 0xdea586b3 -//.word 0x6e65370f -//.word 0x511f2628 -//.word 0x9004d450 -//.word 0xc598bedb -//.word 0x8a5b79db -//.word 0x32a9012e -//.word 0xb7df4fbb -//.word 0xf4bf29f8 -//.word 0x14163eb0 -//.word 0x4b9b7203 -//.word 0xc41b77ae -//.word 0xdad39d8c -//.word 0x8a1eeb5d -//.word 0x28506ec7 -//.word 0x52e1d19a -//.word 0x23ce2e58 -//.word 0xa83c24f5 -//.word 0x985e2adb -//.word 0x3f9a2231 -//.word 0xbce7325d -//.word 0x6c7acfc7 -//.word 0xa6a11ae0 -//.word 0xa9ef7064 -//.word 0xd2993cdc -//.word 0x13201066 -//.word 0xa030f5b8 -//.word 0xebc9ff63 -//.word 0xd39c2455 -//.word 0x18b84da2 -//.word 0x1365ae84 -//.word 0xa45053a0 -//.word 0x6be9fc8a -//.word 0x3b0a2b8c -//.word 0xcbd97ba3 -//.word 0xafef33cb -//.word 0x87ba1b7c -//.word 0x771f8f75 -//.word 0xd764d1b8 -//.word 0x2b4ea4d6 -//.word 0x5586166c -//.word 0x09419dee -//.word 0x822065a3 -//.word 0x7355e9f1 -//.word 0x4108c1db -//.word 0x6ff9bac8 -//.word 0x5a662c86 -//.word 0x262f888e -//.word 0xf838318a -//.word 0x650f8d14 -//.word 0x2bcf5bc1 -//.word 0x1f44475e -//.word 0x674fbb79 -//.word 0xe98cf924 -//.word 0x033367f5 -//.word 0x7d3c2951 -//.word 0xbcc7f5ea -//.word 0x38ba2387 -//.word 0x30ac0404 -//.word 0x9c027599 -//.word 0x6357b45f -//.word 0xce22720f -//.word 0x3c92290d -//.word 0x18bdafa6 -//.word 0x09fa0c96 -//.word 0x688b89ce -//.word 0xf7800974 -//.word 0xd0d79c2a -//.word 0x9be85293 -//.word 0x04014d13 -//.word 0x6d4d1ad7 -//.word 0xdffa4216 -//.word 0x479a1b96 -//.word 0xdfcae471 -//.word 0xea121119 -//.word 0xa40de49a -//.word 0x79ca3d1f -//.word 0x7571b3b8 -//.word 0xfc2ae35a -//.word 0xbb3a0828 -//.word 0xde6fcdf0 -//.word 0x83bf5ff9 -//.word 0x6f2cc5fc -//.word 0x00eb7470 -//.word 0x63c41e0a -//.word 0x07bccc85 -//.word 0x52f22c9f -//.word 0x92800000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x000104C8 -//// expected output -//.word 0x68c34d5a -//.word 0xec130f66 -//.word 0x6c98d708 -//.word 0x8506e213 -//.word 0xc84ff3a7 -//.word 0xe86c2193 -//.word 0x2039242a -//.word 0x68b4b78e -//.word 0x36b7b394 -//.word 0x8435d89d -//.word 0x2a86a519 -//.word 0x4ba1b321 -//.word 0x832ae7b8 -//.word 0xec286f86 -//.word 0xb6dbe3e3 -//.word 0x9da2d2a1 -//// SHA512LongMsgvector_84 -//// vector length -//.word 0x000107E0 -//// input message -//.word 0xa6bfb832 -//.word 0x0576574a -//.word 0x1f41ebef -//.word 0x4ca72e04 -//.word 0xb0cffeff -//.word 0xbdef03f8 -//.word 0xf90893ff -//.word 0x02d1d2b3 -//.word 0xcff01e11 -//.word 0x3870aa89 -//.word 0xb9706857 -//.word 0x73182d10 -//.word 0x73d2107b -//.word 0x37b613a3 -//.word 0x6e45052a -//.word 0x005ba6e0 -//.word 0x4e5f0d94 -//.word 0xbbbd472b -//.word 0x6b9641ef -//.word 0x4bb6e729 -//.word 0x51c68ef1 -//.word 0x05c28f45 -//.word 0x40ae3559 -//.word 0x3385da2e -//.word 0xac734c66 -//.word 0x95437657 -//.word 0xbd1b3c5e -//.word 0xdc67a675 -//.word 0xd1134108 -//.word 0x2dfdc205 -//.word 0xf5aaed33 -//.word 0xa438b5c4 -//.word 0x7093a52d -//.word 0xceec7e35 -//.word 0x3867224c -//.word 0x2e14b01f -//.word 0x7b21f169 -//.word 0xb94ef30c -//.word 0x17a0f360 -//.word 0x5a5a80cb -//.word 0x2229de92 -//.word 0x6f9fa9ee -//.word 0x63e2ba63 -//.word 0x4aa64f4d -//.word 0xd75865bc -//.word 0xb09c6981 -//.word 0x2efa1089 -//.word 0x5dd4846a -//.word 0x4b9cc03c -//.word 0x7f443daa -//.word 0xc7f5ce48 -//.word 0x3703c828 -//.word 0x6e2167a8 -//.word 0x1bd16d8d -//.word 0xc01f0c56 -//.word 0xb68f06ca -//.word 0x725413d4 -//.word 0x06c28390 -//.word 0xea0624a6 -//.word 0xfd1566d7 -//.word 0xc7e2bdd5 -//.word 0x01d44758 -//.word 0x5777af6e -//.word 0x6c725112 -//.word 0x1fb99f01 -//.word 0x0d03c3c9 -//.word 0x567f8623 -//.word 0xa5c27082 -//.word 0x6a0430ec -//.word 0x6a8d3f09 -//.word 0x7a6ac17a -//.word 0x8764ac6b -//.word 0xda332b6c -//.word 0x9aee457c -//.word 0x93c6ba67 -//.word 0x35f42d53 -//.word 0xe0f08895 -//.word 0x5fe49dc9 -//.word 0xb2600921 -//.word 0x104f5efd -//.word 0x2c2a81bc -//.word 0xb86b50d2 -//.word 0x2745881b -//.word 0xb892e670 -//.word 0xb00d8d77 -//.word 0xe6c1a8bf -//.word 0x85c1500c -//.word 0x0e1ab0ef -//.word 0x9c06679a -//.word 0x6c622df3 -//.word 0x9c62bae7 -//.word 0x3384e401 -//.word 0x62c2073b -//.word 0x0a0ca914 -//.word 0x7df55ee2 -//.word 0x89adea6a -//.word 0xb32fa6ae -//.word 0xc0bb2506 -//.word 0x7a871672 -//.word 0xb0b26c2f -//.word 0x7f79bd88 -//.word 0xd0ade8ef -//.word 0x2264fb4c -//.word 0x8af05495 -//.word 0xf70d069f -//.word 0xbb5e7e34 -//.word 0x471b6665 -//.word 0x3604c921 -//.word 0x8e997807 -//.word 0x428cad79 -//.word 0xfb77eff2 -//.word 0x17cb3599 -//.word 0xf2084e16 -//.word 0x653480a4 -//.word 0x8d867067 -//.word 0xce624101 -//.word 0x178a0060 -//.word 0x679240d9 -//.word 0x9094017b -//.word 0x3b26d79d -//.word 0x2c8948ba -//.word 0xc723757f -//.word 0xd32ffd21 -//.word 0x7fb41ef4 -//.word 0xa2b31d3a -//.word 0x47a5e838 -//.word 0x6925fb90 -//.word 0xfbe980ca -//.word 0x2cf6ba34 -//.word 0xe814a3ec -//.word 0xa280d43b -//.word 0x51e2a624 -//.word 0xb87e973d -//.word 0xebaeefbe -//.word 0x0f90a3d8 -//.word 0x61fc7948 -//.word 0x7ab96d2b -//.word 0xd1f05314 -//.word 0x81e0bf5c -//.word 0x4cd422b9 -//.word 0xe0523512 -//.word 0x5a969b92 -//.word 0x093fc2fc -//.word 0x74470a3e -//.word 0x9e382948 -//.word 0x889dce1e -//.word 0xf8b7842c -//.word 0x7972d9db -//.word 0xa397c061 -//.word 0x9c4335dd -//.word 0xdf981fa3 -//.word 0x3cb27ad4 -//.word 0x20ddb533 -//.word 0x17055933 -//.word 0x8f6eec55 -//.word 0xdfa515b0 -//.word 0x88b601d1 -//.word 0xba9f04c6 -//.word 0x1a058476 -//.word 0xc2261334 -//.word 0x890fdb93 -//.word 0x850e3f7b -//.word 0xcf6bbf7c -//.word 0x86531c63 -//.word 0x1715bd0b -//.word 0xbb915276 -//.word 0x41ecb71c -//.word 0x0d891b83 -//.word 0x61356110 -//.word 0xdba2c61d -//.word 0x3f17c54c -//.word 0x7765381a -//.word 0xd81dbfb7 -//.word 0xa7006515 -//.word 0xdcb7813e -//.word 0x25c5dbec -//.word 0x2eb91053 -//.word 0x20a83842 -//.word 0x68dac56a -//.word 0xb9c4aefd -//.word 0x5436ce7c -//.word 0x87d687ca -//.word 0x73cdaa84 -//.word 0x13c09b95 -//.word 0x7a02b004 -//.word 0x5c08db11 -//.word 0xd01d8981 -//.word 0x5456c936 -//.word 0x12c9b102 -//.word 0x62fafdbd -//.word 0x8f96fa95 -//.word 0xde64a3a6 -//.word 0xcc7809cb -//.word 0x98aaf8b3 -//.word 0x0146d737 -//.word 0x5105d0ea -//.word 0x9a3c31f2 -//.word 0x40541217 -//.word 0xb77a391a -//.word 0x8e973a48 -//.word 0xad83e24e -//.word 0xdb76d64f -//.word 0x83bf7834 -//.word 0xb7b80a44 -//.word 0x75f916f4 -//.word 0x29cc0d00 -//.word 0x74e12eba -//.word 0x2c43a9a2 -//.word 0xa48b0538 -//.word 0x2d54bf0e -//.word 0xdcee3421 -//.word 0x8e57c069 -//.word 0x2a6628af -//.word 0x264a359f -//.word 0x4d33a21e -//.word 0xbf4f39de -//.word 0x39f8382f -//.word 0x962cf918 -//.word 0x963dd2a6 -//.word 0xdfc93b84 -//.word 0x41ed2ecc -//.word 0x3eb6d41d -//.word 0xcad85dee -//.word 0x4fa32f21 -//.word 0xf43244db -//.word 0x1fe6cd94 -//.word 0x38131c6a -//.word 0xb1f8c0bb -//.word 0x43f5f2f2 -//.word 0x7af830a1 -//.word 0x733927d1 -//.word 0xe527d696 -//.word 0x5ea1f1e6 -//.word 0xcf6a83aa -//.word 0x4bd7d816 -//.word 0x0ccb9a36 -//.word 0xb7e53aca -//.word 0xe0f89154 -//.word 0xd1bcc86f -//.word 0x87c37562 -//.word 0xfeae06f5 -//.word 0xafa06384 -//.word 0x56f3cf51 -//.word 0xf82a0f1e -//.word 0x2527cffc -//.word 0x7b9f415e -//.word 0x6bca0771 -//.word 0x405f53b0 -//.word 0x5cbf4db3 -//.word 0xc570b547 -//.word 0xe1cec9c4 -//.word 0x7efd699b -//.word 0x1522792f -//.word 0x50d387e6 -//.word 0xc9ccad7f -//.word 0x15e3b9a6 -//.word 0x013e8cc5 -//.word 0x1bc3c01e -//.word 0x75d08e17 -//.word 0xa52ceed4 -//.word 0x103eff0b -//.word 0x697daa14 -//.word 0x74288240 -//.word 0x1037ef6c -//.word 0x74918cd6 -//.word 0xb97fcd2f -//.word 0x9961e5f1 -//.word 0x76a0e7f2 -//.word 0x9de32b3a -//.word 0xcd86f311 -//.word 0xf3484e5d -//.word 0x38433d2b -//.word 0x3d22158c -//.word 0xa58e24a2 -//.word 0xd5e997fa -//.word 0xf73f9b1c -//.word 0x4579c361 -//.word 0x84d4aa05 -//.word 0xce92d97d -//.word 0x95f0eb0b -//.word 0xe557ef8f -//.word 0xe9d60da0 -//.word 0xb1d06ddb -//.word 0x32f2547b -//.word 0x8f68902b -//.word 0x97511718 -//.word 0x8e70eb49 -//.word 0x30244033 -//.word 0xf39ae188 -//.word 0x8d41d051 -//.word 0xb67e2c3c -//.word 0x2fa25837 -//.word 0x03195a3d -//.word 0x0de38170 -//.word 0xba494b69 -//.word 0x10c885cc -//.word 0xef52b41f -//.word 0x97b6b4dc -//.word 0x6b5c9fc4 -//.word 0xf535f177 -//.word 0x29f2e942 -//.word 0xee743238 -//.word 0xda84c284 -//.word 0x3dc503fd -//.word 0x62e630fb -//.word 0x111c0269 -//.word 0x58d08d1c -//.word 0x8c956463 -//.word 0x8a5c04e0 -//.word 0x42eb7096 -//.word 0x778b1842 -//.word 0xc001ffef -//.word 0xd3c01dc5 -//.word 0x025d0322 -//.word 0x0643bdec -//.word 0xfca8fc25 -//.word 0xadc075bf -//.word 0x123084b2 -//.word 0x18c5154d -//.word 0xa066c4c9 -//.word 0xca474324 -//.word 0x7360fc2d -//.word 0xfc1ef8db -//.word 0x4d5800e2 -//.word 0x1a840288 -//.word 0x652bb6b5 -//.word 0x459a804a -//.word 0xe5db99b4 -//.word 0xcfe36ac1 -//.word 0x6b0d38b2 -//.word 0xc2c70691 -//.word 0x888bb7c5 -//.word 0x5a1274e3 -//.word 0x44c44dc7 -//.word 0x867223e4 -//.word 0x9847c5d8 -//.word 0x6bfc5943 -//.word 0xf24cfeda -//.word 0xe1a8afb7 -//.word 0xb52b6af3 -//.word 0xf4d09277 -//.word 0xb6e3930f -//.word 0x64b5c4c1 -//.word 0xc094915c -//.word 0x25fad953 -//.word 0x100595cc -//.word 0xe027bbf5 -//.word 0xda1f6297 -//.word 0x702826ed -//.word 0xc370ceb6 -//.word 0x66cb2c89 -//.word 0x65a94569 -//.word 0x8646b299 -//.word 0xce2046b1 -//.word 0x47aef1f2 -//.word 0x014fe4d7 -//.word 0x5781f6ec -//.word 0x735347e3 -//.word 0x151d23e5 -//.word 0x8f6e2926 -//.word 0x1546acbc -//.word 0x338559b1 -//.word 0x9fa41a57 -//.word 0x31a33bdb -//.word 0x3042cc1d -//.word 0xcf7446bf -//.word 0xf711717d -//.word 0x47cb84bc -//.word 0x5a638e65 -//.word 0x481d16f3 -//.word 0x6f71fecb -//.word 0x7303aecc -//.word 0x83d56e28 -//.word 0xdebb1272 -//.word 0x9610ddf8 -//.word 0x94a8a052 -//.word 0xdd05223b -//.word 0x14cec4a0 -//.word 0x3f7c65f7 -//.word 0xce5784d2 -//.word 0xd9a1a4b4 -//.word 0xa911f523 -//.word 0x7a8330fe -//.word 0x7fedc311 -//.word 0x27952ee7 -//.word 0x9f81addf -//.word 0x982f1782 -//.word 0x4a870614 -//.word 0xb80e3869 -//.word 0x365c35fb -//.word 0x29d03239 -//.word 0x0f823621 -//.word 0xbf797b10 -//.word 0xf11f17d9 -//.word 0x00f1db15 -//.word 0xef7b7cbb -//.word 0xab84f0f1 -//.word 0x8f861b21 -//.word 0x2d61ab4e -//.word 0x4c4f41a9 -//.word 0x2d1bd15f -//.word 0x138e4bb6 -//.word 0x012b7b58 -//.word 0xc61c2eee -//.word 0x376b96f1 -//.word 0xbc75efbd -//.word 0x0e9c63e8 -//.word 0x3e3d2bd1 -//.word 0xfae2f87c -//.word 0x0cb8919d -//.word 0x2343bdf2 -//.word 0xd65063d6 -//.word 0xe62bf014 -//.word 0xc313f9f9 -//.word 0x52eb22ad -//.word 0xee323ec3 -//.word 0xad35b70e -//.word 0xe48330b6 -//.word 0xeda26a8c -//.word 0x2700649b -//.word 0x3f2cc7ff -//.word 0xae4680fb -//.word 0x83b5af45 -//.word 0x6317c0a4 -//.word 0xce7ed7bd -//.word 0xa3d9722a -//.word 0xe7b04acd -//.word 0xc2157a64 -//.word 0xcad7e25d -//.word 0x85f8ceeb -//.word 0x2861d359 -//.word 0xa5d5fa9f -//.word 0xe5242133 -//.word 0x52a19d21 -//.word 0x99d5245e -//.word 0xae75eb59 -//.word 0x10920bd4 -//.word 0x4e1029f2 -//.word 0xca595691 -//.word 0xbd5234d9 -//.word 0x7b8f5a15 -//.word 0xf9c3fac2 -//.word 0x8c7ac1e6 -//.word 0xf30affa4 -//.word 0x98c6080c -//.word 0x1376da38 -//.word 0xf0040094 -//.word 0xb278b67d -//.word 0x17264d0e -//.word 0x9e26d136 -//.word 0x4705ea0e -//.word 0x9aba006a -//.word 0xeadca2af -//.word 0xdb1229e4 -//.word 0x22ca980b -//.word 0x8c2ec7b1 -//.word 0x4253c1c4 -//.word 0x4bb46aa5 -//.word 0x52e0657e -//.word 0xaa6f34d6 -//.word 0x8f3aa162 -//.word 0xafcc5d1e -//.word 0xe913e89d -//.word 0x545bb09d -//.word 0x837e7ddf -//.word 0x07540c36 -//.word 0x3671fadd -//.word 0x2b10e50d -//.word 0x0e4acdcf -//.word 0x968cc010 -//.word 0xcb47b6f3 -//.word 0x11e9ba6b -//.word 0x620d4a08 -//.word 0xdbee0111 -//.word 0x7a2273d4 -//.word 0x2685593a -//.word 0xef73ee9e -//.word 0x983a98df -//.word 0x52cecbb4 -//.word 0xcbbf2a40 -//.word 0x6769f0e7 -//.word 0xcd6b8f5f -//.word 0xa65a970a -//.word 0xa1b6d883 -//.word 0xbb1ccb77 -//.word 0xbdbe2eb6 -//.word 0x0611ef89 -//.word 0x8ac54b47 -//.word 0x1bfa3723 -//.word 0xe8b1ff48 -//.word 0x43802d28 -//.word 0xa78bac10 -//.word 0xf9af2d00 -//.word 0x0e00cabb -//.word 0x6e76e91a -//.word 0x57e364a5 -//.word 0x0528e764 -//.word 0x31a999f3 -//.word 0xd8fefed5 -//.word 0x3dec1c0a -//.word 0x3193dce4 -//.word 0x92e8b416 -//.word 0x1266830e -//.word 0x3901bc85 -//.word 0xae5cc754 -//.word 0xb23ba489 -//.word 0xed3bd2ba -//.word 0x6dc16f99 -//.word 0xec30a0c9 -//.word 0x515f33f0 -//.word 0x7a4a830e -//.word 0x39079c0d -//.word 0x9cfca099 -//.word 0x72506a31 -//.word 0x0a9f707e -//.word 0x3ef2eee4 -//.word 0xb0ee4158 -//.word 0x544b9071 -//.word 0x2f88b2c1 -//.word 0x5edd4c65 -//.word 0x59723adb -//.word 0x79ce3114 -//.word 0xb892a2ca -//.word 0xb967e114 -//.word 0x08358638 -//.word 0xa29614c0 -//.word 0xb88ad8d0 -//.word 0xb06c14b6 -//.word 0x6d245dc3 -//.word 0xd09f4259 -//.word 0x7e7c2e46 -//.word 0xe4089050 -//.word 0x796d3811 -//.word 0x43260406 -//.word 0x9db6bde2 -//.word 0x379a3c28 -//.word 0x5e7cd1f8 -//.word 0x7ea9e529 -//.word 0xe5c5dd99 -//.word 0xc9be42c1 -//.word 0x8dfe1f8d -//.word 0x40e5ab6a -//.word 0x677628a0 -//.word 0xfc500be2 -//.word 0xb6e05d23 -//.word 0x8bd661ac -//.word 0x74d5776c -//.word 0x706f408f -//.word 0xcb500352 -//.word 0xa0b95015 -//.word 0x9d31e3b1 -//.word 0x0677ca0d -//.word 0xfcbacbec -//.word 0x000c0009 -//.word 0xb315c466 -//.word 0xdf04d3e1 -//.word 0xbbcbac08 -//.word 0x6b8c3a2e -//.word 0xc74eb4bf -//.word 0x5df5c2d0 -//.word 0xb971e1fa -//.word 0xe4350869 -//.word 0x2aeb8c30 -//.word 0x206641df -//.word 0xe6d8e258 -//.word 0xaa45b2de -//.word 0x6d37646f -//.word 0x0ab43854 -//.word 0x746d68f6 -//.word 0x3f38c2f3 -//.word 0x62c09671 -//.word 0x3b7bd2b3 -//.word 0xd3dd6cea -//.word 0x64cc004d -//.word 0x1853bb6b -//.word 0x149a77c0 -//.word 0xb5162787 -//.word 0x19fd76d0 -//.word 0xe2fdabd2 -//.word 0x362dd082 -//.word 0x0a441365 -//.word 0xa1096ca2 -//.word 0x4f0a805b -//.word 0x8391c63d -//.word 0x05d4e856 -//.word 0x7b6c6c27 -//.word 0x320893fb -//.word 0x1b638177 -//.word 0x14739f71 -//.word 0x69e43e06 -//.word 0x9bc47de6 -//.word 0x60806cf3 -//.word 0xea0f710b -//.word 0x6c6deb21 -//.word 0xdb4b1693 -//.word 0xf2052fb7 -//.word 0x78d4d8b7 -//.word 0xc545bda0 -//.word 0x83e978b5 -//.word 0xb24eb209 -//.word 0xee2f8b4d -//.word 0xf5e83ce6 -//.word 0x642cfb43 -//.word 0xc1fa206d -//.word 0xbecd85df -//.word 0xbc143299 -//.word 0x8fe13a70 -//.word 0x81e5e0a8 -//.word 0x999cfec4 -//.word 0x1dc5a89d -//.word 0x55150cb2 -//.word 0x922c9cbf -//.word 0x6fc87091 -//.word 0x5739e518 -//.word 0x47158bbe -//.word 0xd52c3ef7 -//.word 0x72be9219 -//.word 0xecec756f -//.word 0x376d0f88 -//.word 0x6c82edd5 -//.word 0x122c5f74 -//.word 0x9d9c1e46 -//.word 0x34eb3247 -//.word 0xb70b131f -//.word 0x01fe0ff4 -//.word 0x6a45eb83 -//.word 0x909ccd6f -//.word 0x58e45ad8 -//.word 0x2f611b30 -//.word 0x9625254a -//.word 0xddccf9b4 -//.word 0x2e6aa947 -//.word 0xcec23cfc -//.word 0xa0b95402 -//.word 0xeb0a0e0d -//.word 0x5c3a2af0 -//.word 0x4fcf6c6e -//.word 0x4abd414d -//.word 0xca21a6ad -//.word 0x43314698 -//.word 0x6273e2da -//.word 0x952ef613 -//.word 0xcd1f9a0a -//.word 0x836ca644 -//.word 0xf9de19d6 -//.word 0xc24abc77 -//.word 0x845002d9 -//.word 0xfd48333a -//.word 0x447ac936 -//.word 0x518d1bdf -//.word 0xc043380f -//.word 0xd26316fd -//.word 0xb5f6ec0f -//.word 0x05b5dcef -//.word 0x92c3d5e1 -//.word 0x6498b854 -//.word 0xfc3db9b6 -//.word 0xddbf098d -//.word 0x4bdeb2c4 -//.word 0x5305c242 -//.word 0x0b7fabc2 -//.word 0x1be7eade -//.word 0x7ce0e76c -//.word 0x80071c0e -//.word 0x13267a05 -//.word 0x40ab0846 -//.word 0xf758ced0 -//.word 0x0d3bf13c -//.word 0x84e11f96 -//.word 0x0dc72d6b -//.word 0xcb11ff23 -//.word 0x5a7ea991 -//.word 0x109cd3c9 -//.word 0x82386232 -//.word 0x4a1955dc -//.word 0x08eeec13 -//.word 0xa7841034 -//.word 0xe23cefbf -//.word 0x06bde7ae -//.word 0xf9e6a505 -//.word 0x7b068eab -//.word 0xac505d78 -//.word 0xce890e8f -//.word 0x4d04fcee -//.word 0xfcd04643 -//.word 0xa2307601 -//.word 0xb54b65b4 -//.word 0x65255992 -//.word 0xddce7152 -//.word 0xc5da4341 -//.word 0x0b10c392 -//.word 0xe36767f5 -//.word 0x0c2e886c -//.word 0x558a0c5a -//.word 0x612542dd -//.word 0xa7250d5e -//.word 0xbc5b4567 -//.word 0xd5bd5ab4 -//.word 0x88173a8c -//.word 0xd2fd7552 -//.word 0x5e049f57 -//.word 0x0432f7f2 -//.word 0x91b245d3 -//.word 0xc6cc0994 -//.word 0xa315d191 -//.word 0xe5e3ebfa -//.word 0xcd043c26 -//.word 0x23b0702a -//.word 0x7bbb54ab -//.word 0xb70f7ff0 -//.word 0xcd5a383b -//.word 0xca04945a -//.word 0x1764df79 -//.word 0xfb333d3a -//.word 0x62419108 -//.word 0xdd669ea8 -//.word 0xe9bc6d10 -//.word 0x740bee7d -//.word 0x9d85e1c0 -//.word 0xbcb4f7d8 -//.word 0xa2b035c6 -//.word 0x22959a9d -//.word 0xd03401d9 -//.word 0x080949f1 -//.word 0x326eb230 -//.word 0x450d8ac0 -//.word 0x8a9b0a08 -//.word 0xa3c47b38 -//.word 0xcb619c21 -//.word 0x5ff1484b -//.word 0x9e475441 -//.word 0xad80b730 -//.word 0xdd38edb0 -//.word 0x31fe9de2 -//.word 0x1b0479bb -//.word 0x871b659f -//.word 0x1adfdc32 -//.word 0xbc2f906b -//.word 0x54e151ea -//.word 0xd2b3308b -//.word 0x7384e43b -//.word 0x40c46d0a -//.word 0xd929f782 -//.word 0x70a30037 -//.word 0x1893bda0 -//.word 0x4038ba25 -//.word 0x7a69c279 -//.word 0x828afe2a -//.word 0x7bb96077 -//.word 0x7b484361 -//.word 0x4a704b05 -//.word 0x67439328 -//.word 0x4ce30714 -//.word 0xf3f20ea3 -//.word 0x99496d99 -//.word 0xc2ed6836 -//.word 0x7d3e290c -//.word 0xe972660f -//.word 0xf8423feb -//.word 0x73e3659a -//.word 0x3f388135 -//.word 0xde46d40a -//.word 0x38e81af0 -//.word 0x9cc4b5d7 -//.word 0x027d07a3 -//.word 0x932b203b -//.word 0x6b0899dc -//.word 0x9d6bbfb4 -//.word 0x77fbf5ac -//.word 0x081c5385 -//.word 0xe0ae9326 -//.word 0x17f72e34 -//.word 0x91ddc2e4 -//.word 0x7f59b70d -//.word 0x29282282 -//.word 0xecc4e99e -//.word 0x7e922920 -//.word 0x7a5dd439 -//.word 0x18039fe4 -//.word 0x3b6e1b76 -//.word 0xb2c62176 -//.word 0xb7e574ae -//.word 0xbc0ca282 -//.word 0x68d42b81 -//.word 0xdc67e53a -//.word 0x3aef9f51 -//.word 0x684f05d2 -//.word 0x1112c4c4 -//.word 0xeda0ee02 -//.word 0x43b89f46 -//.word 0xac1ae187 -//.word 0x1984cd85 -//.word 0x17e0f3a2 -//.word 0x52bcfcf3 -//.word 0x58fa8e97 -//.word 0xa0c97047 -//.word 0xcbd4ef2f -//.word 0x29b980fc -//.word 0x7fbca637 -//.word 0x08bd16d1 -//.word 0xb9671aff -//.word 0xc9ab3348 -//.word 0x716c02db -//.word 0xf17c6827 -//.word 0xd3c8eda6 -//.word 0x73cf5ef9 -//.word 0xbf59ba3a -//.word 0x3c65508e -//.word 0x4a6321f9 -//.word 0xa8a38b77 -//.word 0x3a0e2948 -//.word 0x0a14f58b -//.word 0x8ee5af0e -//.word 0x29e48365 -//.word 0xf358e639 -//.word 0xbd65c1e3 -//.word 0x503cd139 -//.word 0xf68e4da8 -//.word 0x3c46ca84 -//.word 0xf5775d9b -//.word 0x8293ff10 -//.word 0x51df3567 -//.word 0xa423f0dc -//.word 0x94a6b1f9 -//.word 0x5559f267 -//.word 0xbb53c205 -//.word 0xfd7daf37 -//.word 0xba8fe881 -//.word 0x393ba354 -//.word 0xf5a7bd27 -//.word 0x5921a0ca -//.word 0xc80f6af7 -//.word 0xe0244c2b -//.word 0x00da2fb3 -//.word 0x071c9e0a -//.word 0x5f42e062 -//.word 0x3b436481 -//.word 0x1c2663ce -//.word 0x9abac0ac -//.word 0x61873306 -//.word 0x7a04a62b -//.word 0xcc0bdfdd -//.word 0xe28960a4 -//.word 0xee7a8b69 -//.word 0x0e150a3f -//.word 0xcf436e84 -//.word 0xf0561629 -//.word 0x68f8534e -//.word 0xa961c912 -//.word 0x27ce19a9 -//.word 0x142ebdaf -//.word 0x6e1e33bb -//.word 0x3c175d38 -//.word 0x15e62870 -//.word 0xe15d6cea -//.word 0xe44913f6 -//.word 0xf8a47e86 -//.word 0x190b243f -//.word 0x27727cd0 -//.word 0xe8161e83 -//.word 0x4db32511 -//.word 0xf6f7d7bb -//.word 0xf7378896 -//.word 0xdd62bb27 -//.word 0xec338b2f -//.word 0xabaa49c8 -//.word 0xa3bc67b1 -//.word 0x634a94e7 -//.word 0xc7502975 -//.word 0x7a5fc48c -//.word 0xba4d32d6 -//.word 0x5b2b9308 -//.word 0x0f77b8b7 -//.word 0xe493d06c -//.word 0x0e7644fa -//.word 0xe7a2df0f -//.word 0x3455320a -//.word 0xaa04370c -//.word 0xb1053452 -//.word 0x678ce2c2 -//.word 0xe8d8cfc3 -//.word 0xcdae0152 -//.word 0xf207dc53 -//.word 0x7d064624 -//.word 0x1b2c0878 -//.word 0x8dcf7763 -//.word 0x64c855b1 -//.word 0x086df27c -//.word 0xffbf96fe -//.word 0x6ce423a3 -//.word 0xd6d7f762 -//.word 0x2b5e104e -//.word 0x053c7368 -//.word 0x2ba8ceb8 -//.word 0x5bff5c9c -//.word 0x47b6095f -//.word 0xdd92d70d -//.word 0xcb1b8086 -//.word 0x434e5dd2 -//.word 0xfb9286b4 -//.word 0x79ed3b82 -//.word 0x8d788233 -//.word 0x1f1012ba -//.word 0x2a4f7093 -//.word 0x09ba589b -//.word 0xf23c5e24 -//.word 0xc0d4d549 -//.word 0xf58af07f -//.word 0xffa7276d -//.word 0xba25dcfe -//.word 0x37653fb4 -//.word 0xbc206f3f -//.word 0x0ba0e24e -//.word 0xe73006a5 -//.word 0xd5d1286f -//.word 0x202e96d6 -//.word 0x1fd200d2 -//.word 0xba99243e -//.word 0x2b64ab31 -//.word 0x02114d8b -//.word 0x6cab3cce -//.word 0xb4ddc030 -//.word 0x0aad1eee -//.word 0x8467bfe2 -//.word 0x62d68e58 -//.word 0x96baa21e -//.word 0x84771dda -//.word 0x060b54a0 -//.word 0xb34230c4 -//.word 0x612dd4ed -//.word 0xe8d07f6b -//.word 0x291bb4cb -//.word 0x4f1c99a8 -//.word 0x55729ec4 -//.word 0xc9055e57 -//.word 0xcff4caa6 -//.word 0x68cf84d8 -//.word 0xf4078905 -//.word 0xf6a21391 -//.word 0x1833beb8 -//.word 0x6f0ae969 -//.word 0xffa85f58 -//.word 0x8276374f -//.word 0x65b6f8c4 -//.word 0x14b901b1 -//.word 0x775228a0 -//.word 0xbc8ca205 -//.word 0x589823d1 -//.word 0x48094544 -//.word 0x9d442e03 -//.word 0x37316d6a -//.word 0xd1372623 -//.word 0x3e686ff8 -//.word 0xf1f8f9e5 -//.word 0xc3f4f372 -//.word 0xf1302b40 -//.word 0x648277e1 -//.word 0x362d53ec -//.word 0x71a0cb51 -//.word 0x1a619ceb -//.word 0x6e449654 -//.word 0x6be044fd -//.word 0x9243cf7e -//.word 0xece5202a -//.word 0x4bdb45e7 -//.word 0xd24d163d -//.word 0xb72a18ac -//.word 0x481aa143 -//.word 0x2cb53d6e -//.word 0xecf25110 -//.word 0xb2e2fed1 -//.word 0x509e48ba -//.word 0x837e78ff -//.word 0x798bbe1b -//.word 0x92371b22 -//.word 0x644c7e53 -//.word 0x01232eed -//.word 0x7c166745 -//.word 0xa9374814 -//.word 0x2543ed15 -//.word 0x96d1d8d0 -//.word 0x34cf95b0 -//.word 0x892f9d5c -//.word 0x74de7c44 -//.word 0x74f62f7a -//.word 0x2334d0c4 -//.word 0x01ac75ef -//.word 0x73bb5566 -//.word 0x0c3e2c03 -//.word 0x0a01e124 -//.word 0x247b6602 -//.word 0x83b8e13e -//.word 0x0e9609bd -//.word 0xea34d2b6 -//.word 0x41a84c09 -//.word 0x43f0c8d3 -//.word 0x6b2b3e3f -//.word 0x040aeb9f -//.word 0xeb813ebb -//.word 0x96c2f568 -//.word 0x556b845d -//.word 0xd8feb643 -//.word 0xf293960b -//.word 0x9cc99084 -//.word 0x3d02d42d -//.word 0x29d0fb48 -//.word 0x67aaed2f -//.word 0xb7e402eb -//.word 0xd3de6703 -//.word 0xf67bc492 -//.word 0x9bd41b9c -//.word 0x872ef4a2 -//.word 0x092ab774 -//.word 0x813c5947 -//.word 0x1f5e3a07 -//.word 0xed064eef -//.word 0x10557c56 -//.word 0x4b9143cc -//.word 0xc4d5a365 -//.word 0x0b073b55 -//.word 0x580bafbd -//.word 0x14364cc5 -//.word 0x9b06efeb -//.word 0x4110229b -//.word 0x933989ff -//.word 0xdf297d18 -//.word 0xf6fdf60e -//.word 0x303caec4 -//.word 0xb10d83b0 -//.word 0xeba71dea -//.word 0x6408d282 -//.word 0xb9eac617 -//.word 0xe4f357a5 -//.word 0xba2cb89f -//.word 0xb7b4db3e -//.word 0xfeb69518 -//.word 0x9c98fdf4 -//.word 0x0d7515dd -//.word 0x01ceac75 -//.word 0x607c828c -//.word 0x8be9aef1 -//.word 0xe5803d88 -//.word 0x92621c9d -//.word 0x7e5b3878 -//.word 0xa114e332 -//.word 0x828a7ac7 -//.word 0xfabe446b -//.word 0x3baf9e22 -//.word 0x1085558b -//.word 0x670f54fc -//.word 0x0c6f7fd4 -//.word 0xb714de0d -//.word 0x49e9fe11 -//.word 0x53cc94cf -//.word 0xd842640d -//.word 0x54696100 -//.word 0xfc2e161a -//.word 0x48bf4423 -//.word 0xaf44cd8b -//.word 0xb1cad0ff -//.word 0x1b7f163a -//.word 0x8725ad1e -//.word 0x22c1d203 -//.word 0xb293154f -//.word 0xd74bb746 -//.word 0x907a5724 -//.word 0x0247cd69 -//.word 0x75635775 -//.word 0xa03ff354 -//.word 0x267c0bdb -//.word 0x60a357f4 -//.word 0x5d160036 -//.word 0x274601b9 -//.word 0x4827d328 -//.word 0x8de14917 -//.word 0x0ac9b997 -//.word 0x5e8f5c08 -//.word 0x39b8f72f -//.word 0x1b4fbb89 -//.word 0x5ed86ade -//.word 0x7686bc18 -//.word 0x78ae0156 -//.word 0xd97a073d -//.word 0x78e23e8e -//.word 0xdfd81afe -//.word 0xc6c3b942 -//.word 0xd92fc669 -//.word 0xbcc39d6e -//.word 0x4b73b00e -//.word 0x26f729d7 -//.word 0x6d7bd182 -//.word 0xc8983082 -//.word 0xab83f6dd -//.word 0xd884993b -//.word 0x25aa403c -//.word 0x7fbee00f -//.word 0x2f75a441 -//.word 0x5ce993d2 -//.word 0xd14a6d8e -//.word 0x01d1d59a -//.word 0x48f6b54e -//.word 0x74e3df42 -//.word 0x8428f0ac -//.word 0xb0b07ae9 -//.word 0xa9f46259 -//.word 0x216e8670 -//.word 0x8e51a30a -//.word 0x2b7777ff -//.word 0x409b22f8 -//.word 0xa4c8d281 -//.word 0x80119f5f -//.word 0x5583b423 -//.word 0x4158b0ff -//.word 0x7e6d4cd9 -//.word 0x2bf73d9e -//.word 0x4f715cd9 -//.word 0x1bd90484 -//.word 0x6f1bbb1d -//.word 0xa0ce15fd -//.word 0x791ed6e6 -//.word 0x7f0957db -//.word 0x79cf2b34 -//.word 0x30a301f1 -//.word 0x74a7cc4f -//.word 0x5f172299 -//.word 0xdec4e241 -//.word 0x6cc51a2f -//.word 0x21692859 -//.word 0xec701f94 -//.word 0x1d7a6ca9 -//.word 0x26bfb9ac -//.word 0xa2011189 -//.word 0x96bf45e0 -//.word 0xf7ac8f13 -//.word 0x6d5f769d -//.word 0x574cf1a5 -//.word 0x0ff3cfd2 -//.word 0x6f575662 -//.word 0x94b22b76 -//.word 0xe16772b0 -//.word 0x47383500 -//.word 0xc4b90abb -//.word 0x2a04f0ee -//.word 0x22af7bf1 -//.word 0x70fb313f -//.word 0x794e3384 -//.word 0x02e420f8 -//.word 0x3ac136ec -//.word 0xfbeabaa2 -//.word 0x4dd49a62 -//.word 0x2c1d52ca -//.word 0x8b7a0c66 -//.word 0x98f10b81 -//.word 0x4248493a -//.word 0xf8bd5fda -//.word 0xb4f7a664 -//.word 0x393d9c6e -//.word 0x99e68930 -//.word 0xf91062db -//.word 0x9895ed2c -//.word 0x0e3b2640 -//.word 0xd22be2aa -//.word 0xffa5b2c3 -//.word 0x58f10a41 -//.word 0x8999a20b -//.word 0xb0d51d4c -//.word 0x1b47e9c6 -//.word 0x53e8666a -//.word 0x5a434a25 -//.word 0x32e144fc -//.word 0x9e04df5b -//.word 0x2d98aaaa -//.word 0x73669622 -//.word 0x9a8b9fdf -//.word 0x1a28ae36 -//.word 0xc45cbe48 -//.word 0x056f3ed7 -//.word 0x6950b759 -//.word 0x5e42af4b -//.word 0x3bd2cdc8 -//.word 0x800c3e5a -//.word 0x5fee5610 -//.word 0x7c1d7bd1 -//.word 0xf2d73fef -//.word 0x9629ccff -//.word 0x7f6285e9 -//.word 0xc6c7ea3b -//.word 0x8a88bcc3 -//.word 0x37f3625c -//.word 0x08e88c08 -//.word 0xcb8d163f -//.word 0xe5422f87 -//.word 0x95d8ba45 -//.word 0x7dfdf4d3 -//.word 0x5efb58d2 -//.word 0x23a3c0c2 -//.word 0x2183ccd0 -//.word 0x9d6087ee -//.word 0x8ee04829 -//.word 0xa586d737 -//.word 0x8be3d150 -//.word 0x6a0b4e40 -//.word 0xae47c0b9 -//.word 0x0d091fed -//.word 0xc425435c -//.word 0x243d91eb -//.word 0x4e7dd937 -//.word 0x3b897f28 -//.word 0xffb4d9c9 -//.word 0x4e73d957 -//.word 0x3f11ec98 -//.word 0x50a4216d -//.word 0xaa3f8eab -//.word 0xa769f027 -//.word 0x92ce9110 -//.word 0xae356f82 -//.word 0x79b29a57 -//.word 0x311dde41 -//.word 0x98c2a216 -//.word 0xf55a106a -//.word 0x5b3b7663 -//.word 0x2dcbecc9 -//.word 0xe23a385d -//.word 0x0671ee6c -//.word 0x8145dca3 -//.word 0x1cf1a425 -//.word 0x41c3abdb -//.word 0x0215320b -//.word 0x5e7fc32d -//.word 0xbf4bcffa -//.word 0xc62995c5 -//.word 0x4b24450e -//.word 0xa0d56655 -//.word 0x16d7752c -//.word 0xc37bcf90 -//.word 0x82bcd179 -//.word 0x3a753db0 -//.word 0x64d1dfe1 -//.word 0xc70371f1 -//.word 0x8638bd91 -//.word 0x5dca0114 -//.word 0x28b7977d -//.word 0xa551d5dd -//.word 0x7a3733dc -//.word 0x7a83ab95 -//.word 0x244566a7 -//.word 0x6c319488 -//.word 0xbf949c1d -//.word 0x418d7588 -//.word 0x59795342 -//.word 0x6faf8769 -//.word 0xf46ea05b -//.word 0xa313d783 -//.word 0x078faa73 -//.word 0x3e19c633 -//.word 0xfc202ad9 -//.word 0xd3848a5a -//.word 0xb105f1a0 -//.word 0xaafcabdd -//.word 0xf749621e -//.word 0x3f8c8723 -//.word 0x1698f46e -//.word 0xc424cf9a -//.word 0x47c4b1ee -//.word 0x9b180732 -//.word 0x3843b9c1 -//.word 0xdd9f0ae0 -//.word 0x8cb0c04e -//.word 0xd556841d -//.word 0x58468bbf -//.word 0x86ba7664 -//.word 0xa7687784 -//.word 0x21b1b6b7 -//.word 0xf71cf3cd -//.word 0x90026c1b -//.word 0xba8b0113 -//.word 0xeed99618 -//.word 0xd682b990 -//.word 0x0c44843a -//.word 0x25f4c5c1 -//.word 0xeeb85d92 -//.word 0xf576e6eb -//.word 0x4b8c9935 -//.word 0x89c26e94 -//.word 0x117c84bc -//.word 0x9635c406 -//.word 0xdf28c2c3 -//.word 0xc750e3d0 -//.word 0x8993c56b -//.word 0x3a3bdb44 -//.word 0x97a558d7 -//.word 0x013d4ffa -//.word 0xc6aa18b2 -//.word 0xa245f54b -//.word 0x86d0f5a8 -//.word 0x976519d7 -//.word 0x7aacb6e8 -//.word 0xcf511a00 -//.word 0xfbb572a9 -//.word 0x2be4ec6c -//.word 0x96c818a2 -//.word 0x029c9487 -//.word 0x89a2e890 -//.word 0x9d19afff -//.word 0x4a6af8b4 -//.word 0xbba2eb46 -//.word 0x0024b052 -//.word 0x0ea08c13 -//.word 0x073f4d33 -//.word 0xbc20e9e1 -//.word 0x71086224 -//.word 0xe055ec6f -//.word 0x80345275 -//.word 0x0614963e -//.word 0x2c5bd87b -//.word 0xb2577817 -//.word 0xa3777f0e -//.word 0xdabb3b82 -//.word 0xc4692a0c -//.word 0x68021a50 -//.word 0xa4748dd4 -//.word 0xb9916212 -//.word 0x0ac0b2cb -//.word 0x20f2f99f -//.word 0xf2d876db -//.word 0x6354d492 -//.word 0x0d2d09ef -//.word 0x3d067fc9 -//.word 0x3e917178 -//.word 0xdb0099e7 -//.word 0x1fbc08eb -//.word 0x5f5a55d3 -//.word 0x7bcbf941 -//.word 0x60d2fa38 -//.word 0xd1bbc775 -//.word 0x684b6303 -//.word 0xd7f3c60a -//.word 0x744881e8 -//.word 0xf5b8a082 -//.word 0x7775d4dc -//.word 0xc6b6d2e8 -//.word 0xd81ff69c -//.word 0x9a7d2c47 -//.word 0xf0b71025 -//.word 0xf6025431 -//.word 0x8d53623a -//.word 0x131a4339 -//.word 0x712dc0e2 -//.word 0x5b02c779 -//.word 0xd32210e7 -//.word 0xefdaff0d -//.word 0xdd34cd58 -//.word 0x2426e396 -//.word 0x2c088608 -//.word 0x014bb9b8 -//.word 0x54695f0c -//.word 0xc318a19c -//.word 0x5ac38f41 -//.word 0x593a0a6e -//.word 0x37a9e1c4 -//.word 0xe8c73ae0 -//.word 0x5c4f3478 -//.word 0x48b4caa6 -//.word 0x2811fb83 -//.word 0x855e27f8 -//.word 0x73eabdd1 -//.word 0x5f051313 -//.word 0x07fd9590 -//.word 0xca4d22b8 -//.word 0x2210b3b2 -//.word 0x6fbc3eac -//.word 0xf60cda6f -//.word 0x293e2336 -//.word 0x297fe0c0 -//.word 0x89a4e3a4 -//.word 0x551a31e5 -//.word 0x522063c6 -//.word 0x88334cdf -//.word 0xfecadc71 -//.word 0xc54444f7 -//.word 0x371f5bfd -//.word 0x816a4135 -//.word 0x5f7d42c8 -//.word 0x27e7fdea -//.word 0x09a8c5b1 -//.word 0x95a14727 -//.word 0x7d486d9e -//.word 0x9da08343 -//.word 0x386999f6 -//.word 0x85932859 -//.word 0x6af9f827 -//.word 0x874c40c8 -//.word 0x764d1022 -//.word 0x5140ecb1 -//.word 0x759db9da -//.word 0x8608de7c -//.word 0xb483a3c9 -//.word 0x3ce3dc54 -//.word 0x3180cc6a -//.word 0x7c3144a6 -//.word 0x22780bc0 -//.word 0xc5f982a6 -//.word 0x6e3188ce -//.word 0x89649cca -//.word 0x31d7411d -//.word 0xae40a74d -//.word 0x3c7b8739 -//.word 0x0e7e4fad -//.word 0x938f7f34 -//.word 0xf8b5532d -//.word 0xee6ca221 -//.word 0xad9c0654 -//.word 0x39cc3d9a -//.word 0xe493cf6c -//.word 0x1450f13b -//.word 0x461baa04 -//.word 0x53fc3425 -//.word 0xf25aa56f -//.word 0x7fb6cf7c -//.word 0xfb996443 -//.word 0x53ca5ee9 -//.word 0xe5c59ddb -//.word 0x4069d219 -//.word 0x2bf19dd5 -//.word 0xea25f23c -//.word 0xbcd1c194 -//.word 0xa877d687 -//.word 0x7941febe -//.word 0x08396bb2 -//.word 0xb9bc59bf -//.word 0x482cf27b -//.word 0xc6e66f45 -//.word 0xde748121 -//.word 0x5d03efc3 -//.word 0xf21780e9 -//.word 0x317d1bee -//.word 0xde822d9c -//.word 0x69624b43 -//.word 0xb5031907 -//.word 0x1de36a7e -//.word 0xb94fa87b -//.word 0xddd77724 -//.word 0xe3fe954b -//.word 0x2b3604fb -//.word 0x5f0b6c50 -//.word 0xfc9ebb8c -//.word 0x0e550e68 -//.word 0x3bd1d4a8 -//.word 0x022030f2 -//.word 0x4534a0e0 -//.word 0x0594dd54 -//.word 0x6e52020c -//.word 0x133def76 -//.word 0x7a57f0c5 -//.word 0xdb8a9a44 -//.word 0x2596f6ea -//.word 0x424ee22f -//.word 0x9c04b31f -//.word 0xe0421fad -//.word 0x02bb5b49 -//.word 0x818080b5 -//.word 0xec773314 -//.word 0xa50a8544 -//.word 0xe51c186d -//.word 0x004184da -//.word 0xea2ef808 -//.word 0xfa6e25fd -//.word 0xef5757db -//.word 0x313de5b5 -//.word 0x59e5cca1 -//.word 0xf23c970f -//.word 0x81498259 -//.word 0xc461de9b -//.word 0x389ab7c4 -//.word 0xdd82b5ed -//.word 0x3d1040ea -//.word 0xabdae71f -//.word 0xc9890395 -//.word 0x4d8a974e -//.word 0x04077bd5 -//.word 0x1716ba18 -//.word 0x8d30387a -//.word 0x11e49825 -//.word 0xf5cc5c9d -//.word 0x78c14e9b -//.word 0x444b1f18 -//.word 0x3b5b4fa8 -//.word 0x733d4c09 -//.word 0x7fc8defc -//.word 0xf1d8c253 -//.word 0x1cfe964c -//.word 0x1f75f51d -//.word 0x1f58e2d0 -//.word 0xd3136a51 -//.word 0x461885c6 -//.word 0xd8d33e1e -//.word 0x86df13ed -//.word 0x6c7a9f77 -//.word 0x8836760a -//.word 0xc1f25192 -//.word 0x28096b67 -//.word 0x7dc92a69 -//.word 0xf527024f -//.word 0x3ab0973c -//.word 0xb4c32193 -//.word 0x07fe150d -//.word 0xddf60209 -//.word 0xe52bb823 -//.word 0x1c3bb007 -//.word 0x4b55a888 -//.word 0xd0f18eec -//.word 0xa2be9f8a -//.word 0x90dcd098 -//.word 0xc94c6d3e -//.word 0xa1a500ee -//.word 0x920874f8 -//.word 0x81557a59 -//.word 0x439f2cd4 -//.word 0x60def045 -//.word 0x17e4a031 -//.word 0xa293e8a1 -//.word 0xbb4cef31 -//.word 0x5eaa3964 -//.word 0xd171cc3a -//.word 0xe2c19105 -//.word 0x7090fe78 -//.word 0x2c57f201 -//.word 0xa10ae059 -//.word 0x724e3059 -//.word 0xe3e7e20f -//.word 0x9b6f7511 -//.word 0xa94e0711 -//.word 0xc4e6bdb2 -//.word 0xd70e659a -//.word 0xbdc25ac8 -//.word 0x4818a828 -//.word 0x89767165 -//.word 0x4b0390ff -//.word 0xe15b7b9d -//.word 0x22876ea4 -//.word 0xb12cc608 -//.word 0x8202ab63 -//.word 0x9988f144 -//.word 0x15f740c9 -//.word 0x6e747370 -//.word 0xfb893f2a -//.word 0xb7d615b1 -//.word 0x4404491c -//.word 0x30fb73b1 -//.word 0x785516fa -//.word 0x4a127f1b -//.word 0x0f8df062 -//.word 0xa9aefe20 -//.word 0xf96238b7 -//.word 0xa54809f5 -//.word 0x18aee0a0 -//.word 0xcabb8d52 -//.word 0xc1edef87 -//.word 0x58c7ccf5 -//.word 0x3fc3001c -//.word 0xc38eda1d -//.word 0x4f74c3cf -//.word 0x33192010 -//.word 0xa56b7a59 -//.word 0x05d4dc96 -//.word 0x66b47d34 -//.word 0x490e9f7b -//.word 0xab82b71e -//.word 0x437bce10 -//.word 0x05a9279a -//.word 0xeab222ab -//.word 0xf324606f -//.word 0x6caf2822 -//.word 0x6e910a27 -//.word 0xa751c254 -//.word 0x5db05f91 -//.word 0xb1dda4a1 -//.word 0x21e8ae3f -//.word 0x5179d76d -//.word 0x0bc2db09 -//.word 0x84b239a1 -//.word 0xe16bdc88 -//.word 0xf9f7fb29 -//.word 0x5d363e9c -//.word 0x961b2277 -//.word 0xad189ee7 -//.word 0xf1d707ff -//.word 0xf42b314f -//.word 0xd746d7b9 -//.word 0xc72c3c80 -//.word 0xc86813a2 -//.word 0xb1fd9c68 -//.word 0x789f113b -//.word 0xb02340b9 -//.word 0x50357908 -//.word 0xb649aa6a -//.word 0xecd4c912 -//.word 0x29bb7237 -//.word 0x9b0bd266 -//.word 0x63ecc31c -//.word 0xe2d03894 -//.word 0x33f0dcde -//.word 0xf8f9f631 -//.word 0x5a029082 -//.word 0x4bc2d855 -//.word 0x0e00c6d4 -//.word 0xfa4aff1e -//.word 0x7beafae1 -//.word 0x5916612b -//.word 0x3d67ba7d -//.word 0x718d4622 -//.word 0xe74029be -//.word 0x7d79cc2a -//.word 0x7fe3807f -//.word 0x6d8c6471 -//.word 0xffe188df -//.word 0x67d952a7 -//.word 0xd67021bf -//.word 0x41573182 -//.word 0x65eabf47 -//.word 0x09626d38 -//.word 0x834ce762 -//.word 0x7d3ac708 -//.word 0xf9b8b63d -//.word 0x9381d4b2 -//.word 0x06f35bcc -//.word 0xf2c17ff9 -//.word 0xdde89845 -//.word 0x77e48228 -//.word 0x222344a2 -//.word 0xb1baf18a -//.word 0x7057cc24 -//.word 0x6576aff1 -//.word 0xd6d8aecb -//.word 0x0c31f731 -//.word 0x5622fcdf -//.word 0x5066d5a1 -//.word 0x6450df6a -//.word 0x9275aaa0 -//.word 0x6da612bb -//.word 0x6621ab0e -//.word 0x4d0763e4 -//.word 0x151162cf -//.word 0xd87f353d -//.word 0x1a522c4c -//.word 0x52bb00e0 -//.word 0xa7d3b9f2 -//.word 0xf78ccf2b -//.word 0x1de890b1 -//.word 0x7469c141 -//.word 0x97c8887e -//.word 0x6bea8a88 -//.word 0x600f50d1 -//.word 0xf34def2c -//.word 0x783de827 -//.word 0x16f44d9b -//.word 0x13342581 -//.word 0x51e41207 -//.word 0x19be31e4 -//.word 0x184842e8 -//.word 0xa70509d7 -//.word 0x50ecf377 -//.word 0x8d19fde8 -//.word 0xd2c3d234 -//.word 0xce6e3327 -//.word 0xef619c61 -//.word 0x245b25a9 -//.word 0xe682a684 -//.word 0x799c1e06 -//.word 0x6f8156e9 -//.word 0x6fd0c1dc -//.word 0x34e2a71d -//.word 0xd8fc824a -//.word 0x53c9a975 -//.word 0x3f072b76 -//.word 0xde80fe85 -//.word 0x5d3c5908 -//.word 0x5af55ea9 -//.word 0xa5cbfcac -//.word 0x4339147f -//.word 0xb948da93 -//.word 0x87027f6b -//.word 0xf22a0df3 -//.word 0x062a9212 -//.word 0xdc4d8082 -//.word 0x192e54e0 -//.word 0xb77176ff -//.word 0x08b06082 -//.word 0xf7b803aa -//.word 0x92f6666c -//.word 0xc52c91c7 -//.word 0x6868a954 -//.word 0x7d375c1f -//.word 0xb21680b5 -//.word 0x2e29f67e -//.word 0x8930d54d -//.word 0x1cb6c436 -//.word 0x7c8ba8a0 -//.word 0x4175809a -//.word 0x0c238c73 -//.word 0xc862b584 -//.word 0x2f942951 -//.word 0x905d46d1 -//.word 0xd09fb909 -//.word 0xb0a9e7e0 -//.word 0x4dab8c2e -//.word 0xed6da116 -//.word 0xf8418496 -//.word 0x4537535c -//.word 0x978f98db -//.word 0x68742c9f -//.word 0xe5e755dd -//.word 0x39f9324f -//.word 0x0e3d593e -//.word 0x517dbee1 -//.word 0x36acd7e5 -//.word 0x7d1cfd4d -//.word 0xf3f1167c -//.word 0x3bd67190 -//.word 0xceeef1f2 -//.word 0x410d6e2b -//.word 0xc72958fa -//.word 0xf60b9da3 -//.word 0xce4acd89 -//.word 0xf77a7dff -//.word 0x4aa1e95c -//.word 0x93eadd4d -//.word 0x959ed570 -//.word 0x4f4f631e -//.word 0x7e57d188 -//.word 0x63810705 -//.word 0xc605b0aa -//.word 0x3bba991c -//.word 0xa48759a2 -//.word 0xf71a377e -//.word 0x42dd487e -//.word 0xec26d8ce -//.word 0x3daf0b10 -//.word 0x2045c4ae -//.word 0x28c4c66f -//.word 0xd2421a49 -//.word 0x0a8bb077 -//.word 0xf0ce49cb -//.word 0xdb959344 -//.word 0x9efa96e3 -//.word 0x0b1850bb -//.word 0xb6c19c48 -//.word 0xfc6f5901 -//.word 0x437cc730 -//.word 0x82953402 -//.word 0x056cd9da -//.word 0x6aadffeb -//.word 0xf0346606 -//.word 0xf17de6b0 -//.word 0xac5b5778 -//.word 0x48edaf88 -//.word 0x16ce6a79 -//.word 0x178d2f6c -//.word 0xbe5db056 -//.word 0xf60dd29b -//.word 0x673a0edf -//.word 0xf5c31618 -//.word 0x8a7dbce8 -//.word 0x1628102b -//.word 0xd4a2c9cc -//.word 0xce5be7dc -//.word 0xa30996e5 -//.word 0x889d547b -//.word 0x8d755615 -//.word 0x22d3281b -//.word 0xd98e9540 -//.word 0x6d07c612 -//.word 0x045faecf -//.word 0xb1e7a57b -//.word 0x3dd8522f -//.word 0x2745cfb4 -//.word 0xe94d0851 -//.word 0x7d9564e0 -//.word 0x20f6a827 -//.word 0x56721866 -//.word 0x2e6ddf2d -//.word 0xc719b070 -//.word 0x1333aedd -//.word 0xdbed896d -//.word 0x032bea3a -//.word 0x10f11290 -//.word 0xe71cbe46 -//.word 0xd7514d4f -//.word 0xda34248c -//.word 0x18da52e4 -//.word 0xad807097 -//.word 0xac7dcbcf -//.word 0x6475c679 -//.word 0xe2d07952 -//.word 0xb76a9e45 -//.word 0xfb8caef4 -//.word 0x911c4795 -//.word 0xad10d1ff -//.word 0x94286104 -//.word 0xa3dddd02 -//.word 0x939562b5 -//.word 0xfb18e24f -//.word 0x164712cb -//.word 0xc70c837e -//.word 0xda8d0eef -//.word 0x8da576e8 -//.word 0x4f9449cd -//.word 0xc7f5072d -//.word 0x18f18697 -//.word 0x64b395af -//.word 0x8f1be080 -//.word 0x45b71414 -//.word 0x3eef4342 -//.word 0xc07f89c8 -//.word 0x662bf09a -//.word 0x21ad9179 -//.word 0x7cf3fcc6 -//.word 0x2487da99 -//.word 0xa74fd10e -//.word 0x7c76a8df -//.word 0x44aaac38 -//.word 0x4f8852c6 -//.word 0x62541d12 -//.word 0xb7eec20d -//.word 0x46018beb -//.word 0x437ef935 -//.word 0xe849ad1a -//.word 0x74328807 -//.word 0x74261277 -//.word 0x41a6180b -//.word 0xca799add -//.word 0x939ee412 -//.word 0xfe85faae -//.word 0xca7f39ac -//.word 0xd9723c4f -//.word 0x36d1fdb3 -//.word 0x56cb3ca7 -//.word 0x9ec325bf -//.word 0x26012da4 -//.word 0xbda73daf -//.word 0x2de612b6 -//.word 0xc071e426 -//.word 0x02324552 -//.word 0xc93d4d0b -//.word 0x7302f471 -//.word 0x6fc6bf08 -//.word 0xff549f0f -//.word 0x3bef160d -//.word 0x5a8c9bac -//.word 0x2d3e40ca -//.word 0xecf292ce -//.word 0x355cc038 -//.word 0x5231007d -//.word 0xbb972f11 -//.word 0xdbdab7c5 -//.word 0x1760b653 -//.word 0x0ddf5d37 -//.word 0x19cd96c1 -//.word 0x1e18e969 -//.word 0x8318a062 -//.word 0x7bc22972 -//.word 0x8a1ebd00 -//.word 0x45fb3f6f -//.word 0x59e167aa -//.word 0xce471f00 -//.word 0x8d062d33 -//.word 0x200e13cb -//.word 0xba5733b0 -//.word 0x771b37f8 -//.word 0xe443b0fe -//.word 0xc21ffdb4 -//.word 0x07596f3a -//.word 0x262cabaf -//.word 0x90d14f47 -//.word 0x7b3ad89d -//.word 0xe203c34b -//.word 0xcda6f2b9 -//.word 0xd2ee5232 -//.word 0xdcaebb3d -//.word 0x2bb2172a -//.word 0x9cf6c7eb -//.word 0x2b164225 -//.word 0xb606ff87 -//.word 0x0403965b -//.word 0x05c9225a -//.word 0x5b07e9c5 -//.word 0x1a103fb1 -//.word 0xccd3a7a3 -//.word 0xb90d3c5c -//.word 0x65bd4ff6 -//.word 0x59d95230 -//.word 0x263ff407 -//.word 0xa8ee8e86 -//.word 0x8876bede -//.word 0x04ad51b9 -//.word 0xf3a467cc -//.word 0x03d9d1ab -//.word 0x46aebee2 -//.word 0xed1a9741 -//.word 0x539f2777 -//.word 0x3d7cffe3 -//.word 0x602319a6 -//.word 0x23edbbfd -//.word 0xa70d9ece -//.word 0x04c35080 -//.word 0xd6d2d710 -//.word 0xf9339761 -//.word 0x900b76d4 -//.word 0x4cdb3d19 -//.word 0xebf64145 -//.word 0xfe394424 -//.word 0xf0f696d0 -//.word 0x44317f82 -//.word 0x1e0fe2a9 -//.word 0x058b1a39 -//.word 0xe76b2846 -//.word 0x5d7210d1 -//.word 0x31d880e2 -//.word 0x1ef7b3d7 -//.word 0xd64795fb -//.word 0x4a8c285a -//.word 0x254e26d4 -//.word 0x998ae871 -//.word 0x5fa786f4 -//.word 0xf9ab40b3 -//.word 0x3baf1ca5 -//.word 0x0991d1bd -//.word 0x62e8e476 -//.word 0x9e3d11b0 -//.word 0xf378ecba -//.word 0x3e98c8b0 -//.word 0x00a7d807 -//.word 0xa7ed9466 -//.word 0x10655eb7 -//.word 0x496d667f -//.word 0x9bc1cb6a -//.word 0xc8aa032b -//.word 0x91737c82 -//.word 0x7b1d839e -//.word 0xd35466a6 -//.word 0xf0a1d593 -//.word 0xb8e08e40 -//.word 0x66f53ac4 -//.word 0x8abb91ff -//.word 0x503dc573 -//.word 0x06291e55 -//.word 0xd981e1e4 -//.word 0xdf9477fa -//.word 0x5b2dcbe1 -//.word 0x3c0af467 -//.word 0xe68f1435 -//.word 0x35bc805c -//.word 0xbf5d2131 -//.word 0x5a801a5b -//.word 0xdf2caa2a -//.word 0x2d50542b -//.word 0x70fa3ef9 -//.word 0xa3c9d855 -//.word 0x53a5bd79 -//.word 0xa6addeaa -//.word 0x9d71dd0d -//.word 0x9662b7bb -//.word 0x1587a617 -//.word 0xc3714660 -//.word 0xb770f682 -//.word 0xf5078132 -//.word 0x349efe39 -//.word 0xe577f410 -//.word 0x70e3c2ae -//.word 0xc1b63e9e -//.word 0x03f89d54 -//.word 0xabdd93c1 -//.word 0xb9f7ba25 -//.word 0x3aab3825 -//.word 0x12e29d1d -//.word 0xf8000ab7 -//.word 0xc21a98bd -//.word 0xe364f72b -//.word 0x32e85689 -//.word 0xed7e8377 -//.word 0xfdf8548a -//.word 0x7b9d4556 -//.word 0x74d962cc -//.word 0xe93268c7 -//.word 0x1a7e27e1 -//.word 0x05532a8b -//.word 0x29c09a5d -//.word 0x8f3a60aa -//.word 0x0bd98a58 -//.word 0xc0c5f0ee -//.word 0xe2eb17ef -//.word 0xc0f45567 -//.word 0x017736c3 -//.word 0x2d6d1fe5 -//.word 0x70e63178 -//.word 0x9bfb7081 -//.word 0x6c042537 -//.word 0x0f0b8115 -//.word 0xe480822d -//.word 0x832d1bbf -//.word 0xfe6d8f0a -//.word 0x66991e62 -//.word 0x90c4e383 -//.word 0x18a8fd25 -//.word 0xa7dfedd1 -//.word 0x72573ff2 -//.word 0x03006d2f -//.word 0x3cc700f8 -//.word 0x99c8f85f -//.word 0xb5bf6e2a -//.word 0x10c07826 -//.word 0x0f294dbe -//.word 0x44d4a9cb -//.word 0xf09173ae -//.word 0xc6d39e9d -//.word 0xf2a94d3a -//.word 0x5af03a6a -//.word 0x24c85864 -//.word 0x7844b708 -//.word 0x8766a873 -//.word 0xcc4a23d0 -//.word 0x91a16570 -//.word 0xb661dd1e -//.word 0xaebb49ac -//.word 0xca4e1dd2 -//.word 0xba9a2439 -//.word 0x51b769d2 -//.word 0x8846586c -//.word 0xc6a92186 -//.word 0x5e6f5d61 -//.word 0x5912f45a -//.word 0x77e53e77 -//.word 0x70486840 -//.word 0x7f1e1ad0 -//.word 0x2181562b -//.word 0x1bb4a4d2 -//.word 0xba586c95 -//.word 0x5ee3a3a9 -//.word 0x3a4fa9fa -//.word 0x550f72c2 -//.word 0xd447e55b -//.word 0x7c3c8152 -//.word 0x730a46bc -//.word 0x4695d3cd -//.word 0x30c1cca6 -//.word 0x9ae67e6f -//.word 0xde7ec6a6 -//.word 0x50212eb6 -//.word 0x7fb45acc -//.word 0xb8dda3e6 -//.word 0xccb9012d -//.word 0x13d22e84 -//.word 0xb14b0861 -//.word 0x185e38db -//.word 0xcf091105 -//.word 0x7103ba7b -//.word 0xf8f5903a -//.word 0x3be7c6b5 -//.word 0xb6f84e25 -//.word 0x8a53fd20 -//.word 0xc45eea6d -//.word 0xe2351717 -//.word 0x945653c0 -//.word 0xbf9e5e38 -//.word 0xc7744f4e -//.word 0x0e4433e6 -//.word 0xb82ff74c -//.word 0xb20088c8 -//.word 0xf2623873 -//.word 0x00516448 -//.word 0xb5cf537e -//.word 0x42d86216 -//.word 0x75975eb0 -//.word 0x38da32a2 -//.word 0x5bc4c24b -//.word 0x93c116a5 -//.word 0xc2bfbb1a -//.word 0x789c6699 -//.word 0xbadadbe8 -//.word 0x039a0d3c -//.word 0x89c88707 -//.word 0xc1930a11 -//.word 0x252078ca -//.word 0x357ff0df -//.word 0xbcde3b0b -//.word 0x54fc6730 -//.word 0x2ce1b1a6 -//.word 0x09cda9d2 -//.word 0x8b6e90fb -//.word 0xb255055a -//.word 0xa0abe170 -//.word 0xa1205f9d -//.word 0x682580ed -//.word 0x9c5bad35 -//.word 0x934b9e5f -//.word 0x5d577c02 -//.word 0x04f04236 -//.word 0x120a69a6 -//.word 0x54cdc4e6 -//.word 0xde8ea907 -//.word 0x4ffd5169 -//.word 0x56a081d1 -//.word 0x75806abb -//.word 0x0522cff2 -//.word 0x7bb8655d -//.word 0xe9997f1c -//.word 0xc8efead4 -//.word 0xf4af1646 -//.word 0xf8cf7727 -//.word 0x8cb32b2b -//.word 0x5ce8dd64 -//.word 0x80000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x000107E0 -//// expected output -//.word 0x9dce12e4 -//.word 0x9fae09e0 -//.word 0xb1a60f44 -//.word 0x199449fa -//.word 0x31b9bb27 -//.word 0x7857a84e -//.word 0xfb874b0c -//.word 0x23118bf8 -//.word 0x453f8435 -//.word 0xf47b161c -//.word 0x9747e719 -//.word 0xa642f805 -//.word 0xbf14c06b -//.word 0x6202535e -//.word 0x7abacd53 -//.word 0xe25ab84f -//// SHA512LongMsgvector_85 -//// vector length -//.word 0x00010AF8 -//// input message -//.word 0xb812e306 -//.word 0x4c1dac2b -//.word 0x9d26def1 -//.word 0x775b3c20 -//.word 0x4af669e1 -//.word 0x766f4d88 -//.word 0xc5efbab1 -//.word 0x39094f8e -//.word 0x09a59d7f -//.word 0xe63c89e3 -//.word 0x824bf12f -//.word 0x5301933d -//.word 0x953b2ae6 -//.word 0x8eb3d9d2 -//.word 0x1574cd8f -//.word 0x55921fe1 -//.word 0xcf17f759 -//.word 0x9e40f729 -//.word 0xffead737 -//.word 0x10474c70 -//.word 0xd8d52f5f -//.word 0x8891dbfe -//.word 0x0068d7cc -//.word 0x95eeb51f -//.word 0x125239bc -//.word 0xfc92bea5 -//.word 0x1bebd632 -//.word 0x35943163 -//.word 0x1dabc075 -//.word 0xed7019b3 -//.word 0x8fb11e8f -//.word 0x8285d9f1 -//.word 0xda3dabcf -//.word 0x8998a6fe -//.word 0xde363748 -//.word 0x4b4f08be -//.word 0x6ba5244f -//.word 0x43b75d9a -//.word 0xc938eb01 -//.word 0xa2bf55ff -//.word 0x30c095bb -//.word 0xccbb77dd -//.word 0x50b342a0 -//.word 0xd9e29a28 -//.word 0xcbaba517 -//.word 0x15d06d5b -//.word 0xb6e58549 -//.word 0x8005f0f0 -//.word 0x1bc33ea7 -//.word 0x4e63f8e9 -//.word 0x7a4b3e63 -//.word 0x67b4af4a -//.word 0x43a589f2 -//.word 0xe822119d -//.word 0x5ea13691 -//.word 0xa1bd716d -//.word 0xa42eefbc -//.word 0x95f9f2cb -//.word 0x63e475b8 -//.word 0x7e2d0fcc -//.word 0xde7b190a -//.word 0x46151308 -//.word 0xca5244fe -//.word 0x8f51a11d -//.word 0xd2e9f022 -//.word 0x2be32d2a -//.word 0x13672dc8 -//.word 0xa5b58155 -//.word 0xa1169d87 -//.word 0xb6113a45 -//.word 0x01e1f8ba -//.word 0xd12748a9 -//.word 0xaddd8900 -//.word 0x988b71af -//.word 0x93bdafba -//.word 0x64b4ce8d -//.word 0x965c5d91 -//.word 0xc17e4dfc -//.word 0x0b379aed -//.word 0xefa92eb8 -//.word 0x3df0027e -//.word 0x62578602 -//.word 0xeacc43b7 -//.word 0x4392be1e -//.word 0xc436a04e -//.word 0xedc415d4 -//.word 0xf13a72be -//.word 0x713d1af3 -//.word 0x8b0ba2c6 -//.word 0x13b133ca -//.word 0x207e30e7 -//.word 0xcbb719ad -//.word 0x338cb0e9 -//.word 0xc54b5a76 -//.word 0xbad4c756 -//.word 0xe04dd501 -//.word 0x9e17b2fd -//.word 0x320041af -//.word 0x3ebac071 -//.word 0x838ca7e5 -//.word 0xec47d388 -//.word 0xce7ce38a -//.word 0x6eece3dd -//.word 0xc440288c -//.word 0x7efa7a4e -//.word 0x48ac795b -//.word 0x4b67397e -//.word 0xf377306b -//.word 0xf64d5254 -//.word 0x92bd7ab7 -//.word 0x166a0c7a -//.word 0xa37ed839 -//.word 0x349e42df -//.word 0xdc1da073 -//.word 0x4f6fe435 -//.word 0xa4e17bea -//.word 0x59887574 -//.word 0x9877e5a5 -//.word 0xb8358b55 -//.word 0x076fb0b2 -//.word 0xc7e952d8 -//.word 0x76ba81a2 -//.word 0x53b909bf -//.word 0x1d335108 -//.word 0x1edf8310 -//.word 0x6813edfd -//.word 0x5f37a897 -//.word 0x777b779f -//.word 0x3fc5f162 -//.word 0x9fede38e -//.word 0x5d2df043 -//.word 0xe6d37a6d -//.word 0x4c39c652 -//.word 0x8bf75a67 -//.word 0x1057aa68 -//.word 0x7c0af4a7 -//.word 0xa51969a5 -//.word 0xdd1e8ddf -//.word 0x78b3e0ea -//.word 0x882bbec2 -//.word 0xeb808460 -//.word 0x888df48a -//.word 0xd57ddbef -//.word 0x9d84f073 -//.word 0x00cd00c8 -//.word 0xbbb3483e -//.word 0xa93323dc -//.word 0x8aa1e5af -//.word 0x049b0662 -//.word 0xe73c830f -//.word 0xb5918155 -//.word 0x625133ab -//.word 0x58c8fff3 -//.word 0xbe15dc53 -//.word 0xfa95ff40 -//.word 0x749fb6db -//.word 0x9d729481 -//.word 0x316bce9d -//.word 0xb97ce5c1 -//.word 0x53d985f6 -//.word 0xb5f4ae50 -//.word 0x70ac11c5 -//.word 0x72c1bd3e -//.word 0xcf8cfaef -//.word 0xc1ed75e4 -//.word 0xed849edd -//.word 0xe7244f5c -//.word 0xf984aefc -//.word 0x20385404 -//.word 0x58e0af3c -//.word 0x19a0a400 -//.word 0x22d07992 -//.word 0x75f4f3b5 -//.word 0xa3eebb77 -//.word 0x4972064e -//.word 0xdbbb7566 -//.word 0xa07c3a3a -//.word 0xfe1a7d62 -//.word 0xf818feab -//.word 0xf5d3fb6d -//.word 0xc36f5419 -//.word 0xdb11ed12 -//.word 0xe74e54be -//.word 0x81e4a4dc -//.word 0x3ea8a918 -//.word 0xebc044dc -//.word 0x1612116a -//.word 0xd1fc4828 -//.word 0xb246e13a -//.word 0x1e55fc56 -//.word 0xc7a17fd4 -//.word 0x74690105 -//.word 0x01a5e7c6 -//.word 0xa63ccc55 -//.word 0x7c772763 -//.word 0x3cb5276a -//.word 0x4a61e240 -//.word 0xf322afed -//.word 0xf351d0ba -//.word 0x3bb0558a -//.word 0xf1593c6d -//.word 0xb7f4dd73 -//.word 0x302d86be -//.word 0xc06662db -//.word 0x94a89f53 -//.word 0xe3e0cf7c -//.word 0x73488f95 -//.word 0x5e236712 -//.word 0x16adf235 -//.word 0xa7523fde -//.word 0x3c1e76a4 -//.word 0xe575bf24 -//.word 0x97045f99 -//.word 0x75f724ae -//.word 0x4d6c0490 -//.word 0x66280146 -//.word 0x79895045 -//.word 0xfdbcb93f -//.word 0xa730413d -//.word 0x324b07ed -//.word 0x5c5b6c3d -//.word 0x31cf7628 -//.word 0x8ba777d0 -//.word 0xda29e9ce -//.word 0x21d69dc6 -//.word 0x419c153e -//.word 0x7a4d2eb0 -//.word 0x2f5001dd -//.word 0xe9970c65 -//.word 0x9fd08d95 -//.word 0x35e02f80 -//.word 0x428de851 -//.word 0x167a22df -//.word 0xfc591982 -//.word 0xbc5c8426 -//.word 0x64ec779d -//.word 0x489e883a -//.word 0x4863319b -//.word 0x51ff75c6 -//.word 0x27bcc678 -//.word 0x615f27b9 -//.word 0xb55b8eb4 -//.word 0x75458cc6 -//.word 0x5a882fd5 -//.word 0x815a28e3 -//.word 0xb3ee29e2 -//.word 0xe9eb91ca -//.word 0x0f1e4bea -//.word 0x096bf37b -//.word 0xf40a3b7b -//.word 0xaef08eb9 -//.word 0x988af32c -//.word 0x9ab13388 -//.word 0x68db3e13 -//.word 0x048ecbb5 -//.word 0x851b3f4f -//.word 0x1688d04e -//.word 0x41ceea80 -//.word 0x6e45d126 -//.word 0xa65c894a -//.word 0x9d8df353 -//.word 0xf09038d6 -//.word 0xabcf6aaf -//.word 0x0e1b6951 -//.word 0x919d045a -//.word 0x250f616b -//.word 0xbd2c9f36 -//.word 0x0d64b9d8 -//.word 0x91d5ae6a -//.word 0xd277dfd2 -//.word 0xe596b8df -//.word 0x34869296 -//.word 0x8192d8c6 -//.word 0x273569e3 -//.word 0xa38d3e10 -//.word 0x540c4d7e -//.word 0x7f71adf5 -//.word 0x96f6fab0 -//.word 0xbacbfb6e -//.word 0x7ec482c6 -//.word 0xee4f94bb -//.word 0xd0a8ca90 -//.word 0x2950f7de -//.word 0x03bb0be3 -//.word 0x6e48381d -//.word 0xc5775317 -//.word 0x32577c84 -//.word 0x743d018a -//.word 0xe0bb8060 -//.word 0xa6d04c1b -//.word 0x565d12c5 -//.word 0xa3d8bdb0 -//.word 0x66449609 -//.word 0xe661b0b0 -//.word 0x56208347 -//.word 0x9f59d78a -//.word 0x60c0e4de -//.word 0x3316b72c -//.word 0x339cd7ef -//.word 0xbbcd298c -//.word 0x704c11e3 -//.word 0x811cda23 -//.word 0x2d0f58e2 -//.word 0x8681cb6d -//.word 0x7545075c -//.word 0xffe0d26a -//.word 0xc6f58e84 -//.word 0xd3011820 -//.word 0x9249efd0 -//.word 0x1e109917 -//.word 0xbf0c427b -//.word 0xb21ba7db -//.word 0x28333203 -//.word 0x9097667e -//.word 0x19517eab -//.word 0x73dc5114 -//.word 0xd62179fa -//.word 0x46a5b435 -//.word 0x15008a3b -//.word 0xa991317e -//.word 0x8070adfb -//.word 0x70a43b0f -//.word 0x3496f08d -//.word 0x24c69e0f -//.word 0x44bdf789 -//.word 0x8043f524 -//.word 0x36d17949 -//.word 0xf54932fb -//.word 0x85e5c06b -//.word 0x276d19c6 -//.word 0x1dae2c52 -//.word 0x6d27c5b9 -//.word 0xe305b1a5 -//.word 0x5552228c -//.word 0x2a6955ce -//.word 0x1dad71fd -//.word 0x3f7ab37b -//.word 0x3b5cc84b -//.word 0xde7f7a21 -//.word 0xd7678fbb -//.word 0xbbe1ee74 -//.word 0x4c3a0417 -//.word 0xfaae66f1 -//.word 0xaa23b82a -//.word 0xb718cd55 -//.word 0x36d80f45 -//.word 0x7ff32222 -//.word 0xe9eec4bd -//.word 0xd43af821 -//.word 0xed63636b -//.word 0xad8af6db -//.word 0x2315cd2a -//.word 0xf4a5571e -//.word 0xa048b85d -//.word 0x06f16b7f -//.word 0x2b252c66 -//.word 0x37f615d2 -//.word 0xc0350730 -//.word 0x4be44bb3 -//.word 0x10ea79a6 -//.word 0xfe0a9901 -//.word 0xff16893a -//.word 0x7d609f5d -//.word 0x25728e5f -//.word 0xebff8eb0 -//.word 0x4e19b70f -//.word 0xdda3aea2 -//.word 0xfa0a8446 -//.word 0xde30db24 -//.word 0xdda94b85 -//.word 0xeb2a04e7 -//.word 0x603eb44f -//.word 0xf83babe2 -//.word 0x1e753daf -//.word 0x6ab167d0 -//.word 0x68ddb6b1 -//.word 0x9bfe65af -//.word 0xc169c5e5 -//.word 0x5936e242 -//.word 0x63f264df -//.word 0x6794b390 -//.word 0xb8b25fba -//.word 0xfaf5be64 -//.word 0xe2cbd790 -//.word 0x3d5b7ecb -//.word 0x34bec103 -//.word 0xce6c8399 -//.word 0xb6f467b7 -//.word 0x3ff1f0e4 -//.word 0xa539e6d5 -//.word 0x9657fb86 -//.word 0xf03cae8a -//.word 0xcd3170a0 -//.word 0xbd100586 -//.word 0x52b42e12 -//.word 0xe2ae857e -//.word 0x8839a804 -//.word 0x6c7199aa -//.word 0x44bf6560 -//.word 0x1b980448 -//.word 0x51678155 -//.word 0xe4c75b17 -//.word 0xedf62ad5 -//.word 0x6e8685dd -//.word 0x4a562418 -//.word 0x95c142e1 -//.word 0x0e154517 -//.word 0xea47a171 -//.word 0xd4e5fa12 -//.word 0x314b895e -//.word 0xa81ac00b -//.word 0xe2e6317b -//.word 0x8e2fac49 -//.word 0xa993a722 -//.word 0xfc41e3d6 -//.word 0xe6b14dae -//.word 0x5b932301 -//.word 0x2d055702 -//.word 0x8a0838dc -//.word 0xc7354f01 -//.word 0x5bac87be -//.word 0x2f4e9214 -//.word 0x152c87c3 -//.word 0x953ed0a7 -//.word 0xf0594347 -//.word 0x5f5b8fac -//.word 0x9ca9da6f -//.word 0xa3dba816 -//.word 0xbab5ffa1 -//.word 0xaf59c95f -//.word 0x61bc7906 -//.word 0x8157f103 -//.word 0x9a1fa30f -//.word 0x4fb6f703 -//.word 0xe5e3eded -//.word 0x01400463 -//.word 0xb2325a17 -//.word 0xb11e14ac -//.word 0xe8da00c8 -//.word 0x3262796b -//.word 0x62cd8c7f -//.word 0x867f59b0 -//.word 0x6d9fbb7d -//.word 0x66cc2b8f -//.word 0x4b0be14a -//.word 0xbe043da3 -//.word 0xb36f6631 -//.word 0x2fc93186 -//.word 0x4e4b44bf -//.word 0x8b1c7b5a -//.word 0x3cc68a48 -//.word 0x5ce7e443 -//.word 0x8d29dc62 -//.word 0x5d730aeb -//.word 0xc961f168 -//.word 0x00f2defd -//.word 0x698113f8 -//.word 0xe6f725aa -//.word 0x5b3ea376 -//.word 0x6af9f827 -//.word 0x81729386 -//.word 0x17d3452d -//.word 0x329aea96 -//.word 0x2d474b77 -//.word 0xb8574352 -//.word 0x20762147 -//.word 0xd1f14e2e -//.word 0x196a30e2 -//.word 0x2ecf4ddf -//.word 0x738db410 -//.word 0xf70099e2 -//.word 0x3e2e3f9d -//.word 0x45b61bf4 -//.word 0xc00336db -//.word 0xa6c5d398 -//.word 0xefa2521d -//.word 0x9d285495 -//.word 0xf907203d -//.word 0x1f7d4575 -//.word 0xbc118117 -//.word 0x1784e207 -//.word 0x4e052b0b -//.word 0xe2a479dd -//.word 0x7609267f -//.word 0xd466eecf -//.word 0x31aa505b -//.word 0xb2f83776 -//.word 0x2f57da8c -//.word 0x36abe1b2 -//.word 0x53e4c981 -//.word 0x8e758925 -//.word 0x360776b1 -//.word 0xdd6f64b5 -//.word 0xa4de0e13 -//.word 0xb958b80e -//.word 0x1d6812a4 -//.word 0xab11601e -//.word 0x5607d8e5 -//.word 0xb2204b97 -//.word 0xb605085a -//.word 0xc02dfe71 -//.word 0xd90c200d -//.word 0x3a870e65 -//.word 0x10acf108 -//.word 0x7da0a672 -//.word 0xdfd820de -//.word 0x548c075c -//.word 0x7e69a523 -//.word 0x83870328 -//.word 0x589a4ff0 -//.word 0x406c81a2 -//.word 0x8f8b3f60 -//.word 0xb43efdd7 -//.word 0x76be6815 -//.word 0x7ea3059b -//.word 0x169d15b4 -//.word 0x3064bd05 -//.word 0xaaf26364 -//.word 0xd0ef5bee -//.word 0x236dc353 -//.word 0x59d5ab75 -//.word 0xa4217a32 -//.word 0x374c8c7d -//.word 0x070720b4 -//.word 0xceae722d -//.word 0x567a2413 -//.word 0xf4f8e270 -//.word 0x52ba468a -//.word 0x724cf973 -//.word 0xf0691cdc -//.word 0x886fe62a -//.word 0xd7118ecc -//.word 0x664c6bcb -//.word 0xe49c5aa2 -//.word 0xb36f6051 -//.word 0xa7da90ad -//.word 0x0a8b2ffa -//.word 0xe3ff17bb -//.word 0x77f559c9 -//.word 0x112226a3 -//.word 0xff26f005 -//.word 0xddbfccbc -//.word 0x163c1bb8 -//.word 0xa7356963 -//.word 0x267a9531 -//.word 0x03493278 -//.word 0x0fc42e83 -//.word 0x3aa1b1e2 -//.word 0xa1244803 -//.word 0xc84a4307 -//.word 0x23485cce -//.word 0xdc339954 -//.word 0xd0017341 -//.word 0xdbb037bb -//.word 0x55c5ad7f -//.word 0xdcf8f830 -//.word 0x542ebdee -//.word 0x2da7872b -//.word 0xe4796aba -//.word 0xcd3de729 -//.word 0x0f081051 -//.word 0xf09dec2b -//.word 0x53e01de6 -//.word 0x7e8ec036 -//.word 0x212c95ee -//.word 0x943d60d1 -//.word 0x61b88fa5 -//.word 0x02b91c8a -//.word 0xec77b58a -//.word 0xcc761b71 -//.word 0x10fec8df -//.word 0xa9cbd49b -//.word 0x0f06192a -//.word 0x867496a1 -//.word 0xa1ee11b7 -//.word 0x0411001e -//.word 0x6d36aa14 -//.word 0xf6a48a35 -//.word 0x9405f493 -//.word 0xe417fb08 -//.word 0x27a491cb -//.word 0x8ab4f042 -//.word 0xac013917 -//.word 0x5aab5b8e -//.word 0x9d2d3716 -//.word 0xf690021e -//.word 0xe8dfea29 -//.word 0xb7dafc25 -//.word 0x70ee45f8 -//.word 0x2965375d -//.word 0x8adb4fee -//.word 0x8cf1f581 -//.word 0x8145a4b8 -//.word 0x55a14ad4 -//.word 0x1372f2ca -//.word 0xaa7ca099 -//.word 0xf2cd7cda -//.word 0xeaef3399 -//.word 0x44629b63 -//.word 0x234996a0 -//.word 0x23643824 -//.word 0x9a3e2c00 -//.word 0x1da8539e -//.word 0x4665af0d -//.word 0xb5278099 -//.word 0x55bbac9f -//.word 0xe080649f -//.word 0xa61d0593 -//.word 0x8a733c7f -//.word 0x4dd16e4a -//.word 0x0f6757cc -//.word 0x12fef128 -//.word 0xc2e6975c -//.word 0xf22f6a16 -//.word 0x691cf4ca -//.word 0x9dd40b01 -//.word 0xbe5bf8f4 -//.word 0xf6c1d959 -//.word 0xf099447d -//.word 0x97ad2d93 -//.word 0x20f00a4b -//.word 0x4ab434a7 -//.word 0xe41d910b -//.word 0x90d67093 -//.word 0xc802b4a8 -//.word 0x1e7635d6 -//.word 0xc82563d8 -//.word 0x5bdb2df5 -//.word 0xd72f2190 -//.word 0xe4b3d4fa -//.word 0x5b6d848a -//.word 0x088bfcf0 -//.word 0xaf52b8c6 -//.word 0x4c584a68 -//.word 0x9ff3fc06 -//.word 0xe8f1b7f7 -//.word 0xf0892350 -//.word 0x489210b6 -//.word 0xd5f31570 -//.word 0x8d5b76c0 -//.word 0x7b324b74 -//.word 0x09cfdfb8 -//.word 0x7eeb572e -//.word 0xc6559441 -//.word 0x72e85ab6 -//.word 0xffbbb183 -//.word 0x5b978be5 -//.word 0xa5aea8ad -//.word 0x3489b7da -//.word 0xdc43be6d -//.word 0x6cf5bb79 -//.word 0x7b718c7a -//.word 0x65330ce7 -//.word 0x90947f0b -//.word 0xf4413010 -//.word 0xdaec585d -//.word 0xe3414222 -//.word 0x4d1cad30 -//.word 0x72f9720f -//.word 0x91ac664a -//.word 0xd152820e -//.word 0x838741f3 -//.word 0xa8d94a1a -//.word 0xb37d4f78 -//.word 0x90413571 -//.word 0xe4c275a9 -//.word 0x97dfc217 -//.word 0x906dec5b -//.word 0xbf2c0451 -//.word 0x61fac1e6 -//.word 0x7f47222a -//.word 0xb8c955a7 -//.word 0x4171d8f2 -//.word 0x2a9dde7f -//.word 0xe38ff4b9 -//.word 0xfe1ee452 -//.word 0x36abd9d8 -//.word 0xb157c58a -//.word 0x82730069 -//.word 0x72393292 -//.word 0x00b972ca -//.word 0xa615af5b -//.word 0x5ef14f1f -//.word 0x652617da -//.word 0x3fb64bcc -//.word 0xfb051687 -//.word 0xb8462bff -//.word 0x6833ade0 -//.word 0xd4014d24 -//.word 0xe193b2e4 -//.word 0x11ee1d6e -//.word 0x4ced4d99 -//.word 0xe135a055 -//.word 0xc86c7c86 -//.word 0x2aa6ed13 -//.word 0x22208f39 -//.word 0xc631af26 -//.word 0x617dadc3 -//.word 0x036ca4d1 -//.word 0x3cdb4d37 -//.word 0x2411219a -//.word 0x9ef4be2f -//.word 0xde7c8ccd -//.word 0x2969a047 -//.word 0xdc31e1f8 -//.word 0xb03d699f -//.word 0x3c542e6e -//.word 0xbc58e15d -//.word 0x103016c4 -//.word 0x0805a629 -//.word 0xdeb15156 -//.word 0x0474a8af -//.word 0x20e92bc3 -//.word 0x5639ae21 -//.word 0xc58f016d -//.word 0x54cccfb3 -//.word 0xae7bc7fa -//.word 0x8b07fa1d -//.word 0x322b84d6 -//.word 0x3bab6f1c -//.word 0x9a42d4af -//.word 0xd9db43f1 -//.word 0xa50465f7 -//.word 0x8c9fe0e0 -//.word 0x05da7b65 -//.word 0xb16283b2 -//.word 0xe0d46d74 -//.word 0x5775bc34 -//.word 0x512226e3 -//.word 0xc38af2b6 -//.word 0xe49aa434 -//.word 0xed39dc8d -//.word 0x1d367c2d -//.word 0x017e0991 -//.word 0xf2935459 -//.word 0xdf39599f -//.word 0x4d736788 -//.word 0x9bad8118 -//.word 0x8b3b054b -//.word 0xfe028b61 -//.word 0xff751079 -//.word 0x03c45461 -//.word 0x6f4f80ad -//.word 0x5b610c06 -//.word 0x961be0c5 -//.word 0xeaaeb9c1 -//.word 0xa1cecf64 -//.word 0x4763b505 -//.word 0xb2818071 -//.word 0x409a2bcb -//.word 0x60f23a97 -//.word 0x54549e11 -//.word 0x3504d9c3 -//.word 0x37f46256 -//.word 0x2e3a4ba9 -//.word 0x51c22120 -//.word 0x3e40143f -//.word 0x3f695777 -//.word 0xcc63ca3f -//.word 0x517ad767 -//.word 0x311499a9 -//.word 0x0ae74482 -//.word 0x3b69c140 -//.word 0xa388985b -//.word 0xac9c1308 -//.word 0x889aa10c -//.word 0xbb8a78ce -//.word 0xda3b7eb1 -//.word 0x92356aa0 -//.word 0xebef26eb -//.word 0xce427851 -//.word 0xc61ee25e -//.word 0x037cc7f7 -//.word 0xa493ce33 -//.word 0x364f8c6c -//.word 0x77ff5d96 -//.word 0x604e92d0 -//.word 0x6374d239 -//.word 0xf2adba05 -//.word 0x40eac7d0 -//.word 0x4bc77631 -//.word 0x1abea993 -//.word 0x439a4d40 -//.word 0xb12e3abf -//.word 0xa4465a60 -//.word 0xf9de0e15 -//.word 0xac92cd83 -//.word 0x9b560f59 -//.word 0x8d6769e1 -//.word 0x7282f9d5 -//.word 0xed530473 -//.word 0x0f30ded3 -//.word 0x66070a79 -//.word 0x3695a327 -//.word 0x06d9faf4 -//.word 0x5ec981a2 -//.word 0xd043e82d -//.word 0x354685a0 -//.word 0x3962f92c -//.word 0x1a6d117b -//.word 0xac78ea42 -//.word 0xa1015916 -//.word 0x076b8980 -//.word 0x12abe653 -//.word 0x1c433a3d -//.word 0xea74169d -//.word 0x31af7494 -//.word 0x584e9a5f -//.word 0x808142e4 -//.word 0xc28bf78a -//.word 0xb72ec24e -//.word 0x3e630614 -//.word 0x794fa93a -//.word 0x19737473 -//.word 0xdc23bdd3 -//.word 0x53394326 -//.word 0xe90a5986 -//.word 0x2199472d -//.word 0x1f0bed87 -//.word 0x6a5ba98b -//.word 0xf04f7b4c -//.word 0x4bab67cb -//.word 0x42a41b10 -//.word 0x9397d279 -//.word 0xf0fb7851 -//.word 0x47950fa4 -//.word 0x46ea5152 -//.word 0x1ffa9763 -//.word 0x882bf99a -//.word 0x0684b74d -//.word 0x6c1bd874 -//.word 0x9ed110ff -//.word 0x9b3ce76d -//.word 0xbbe5189a -//.word 0x35b437d8 -//.word 0xe3a89742 -//.word 0x4acb6b4d -//.word 0xd5662ba0 -//.word 0x61713a26 -//.word 0xfe4dc561 -//.word 0xf4b6ee01 -//.word 0x05f32ab5 -//.word 0xf24fe741 -//.word 0x41cd73d1 -//.word 0x3c18198c -//.word 0x3db98d6d -//.word 0x298c8a4e -//.word 0x3b75b946 -//.word 0x034fd535 -//.word 0xae250d9d -//.word 0x87a5a9b4 -//.word 0xbed1f1b7 -//.word 0x68f84a80 -//.word 0xc8e5a35b -//.word 0xcd560f16 -//.word 0xdbb0b357 -//.word 0xcff0e332 -//.word 0x3de588fb -//.word 0xfb9dc559 -//.word 0xe41dda9c -//.word 0xd6544851 -//.word 0xfd523613 -//.word 0x54b613a4 -//.word 0x68657d3c -//.word 0x60826120 -//.word 0x3a9a6477 -//.word 0x571e8259 -//.word 0x3a17f52a -//.word 0x8d155926 -//.word 0x64680d3c -//.word 0xc693dc20 -//.word 0x6afedd9c -//.word 0xbeeb9727 -//.word 0x2dab69b8 -//.word 0xa2122adc -//.word 0x48280c07 -//.word 0x9521c627 -//.word 0x8690f27f -//.word 0x2cd7b3b3 -//.word 0x67e29c1f -//.word 0xf215cd6d -//.word 0x9f825f67 -//.word 0xe4600309 -//.word 0x97b8e5db -//.word 0xf662d77e -//.word 0xea30ab84 -//.word 0x8d69e085 -//.word 0xe979826e -//.word 0x03e64b1d -//.word 0x18860e2b -//.word 0x26f05609 -//.word 0xae304a4f -//.word 0xb8bfd350 -//.word 0x19b201f2 -//.word 0xf131abbd -//.word 0x772b5631 -//.word 0xf948585d -//.word 0x1e1f3ead -//.word 0x6faa6a04 -//.word 0x15f6010a -//.word 0xe41f04c8 -//.word 0x997cbc72 -//.word 0x60175c83 -//.word 0x9a60e20f -//.word 0xdc223e55 -//.word 0x3bb5b695 -//.word 0xc7768921 -//.word 0x5574d2b5 -//.word 0x826cb00b -//.word 0xf4f8a4ab -//.word 0xe3033a01 -//.word 0xd880ecb1 -//.word 0xb55b432f -//.word 0xf6b03f8a -//.word 0x363cf988 -//.word 0xf51187f8 -//.word 0x988d2044 -//.word 0xb18c8046 -//.word 0x81dd8e5c -//.word 0xbcf33dbf -//.word 0x8bddb010 -//.word 0xd779a134 -//.word 0xc5e40362 -//.word 0x7d34e67a -//.word 0x306a9c99 -//.word 0x59a21aea -//.word 0x438da0bf -//.word 0xcb219de0 -//.word 0x678fcd22 -//.word 0x6776a43c -//.word 0x7b56efd7 -//.word 0x7647b9e4 -//.word 0x51eb6b32 -//.word 0x73a13840 -//.word 0x2ffbb850 -//.word 0x8f73d3bc -//.word 0x5059e18d -//.word 0x2d100f4a -//.word 0x617a050e -//.word 0x67b1c6dd -//.word 0x04f8d738 -//.word 0x87f1a3ef -//.word 0x50101e37 -//.word 0x8f4fa9fc -//.word 0x4e233679 -//.word 0xb2afac05 -//.word 0x7d388d30 -//.word 0xd8dad60e -//.word 0x507926d3 -//.word 0x1efa23a0 -//.word 0xabb2199d -//.word 0x531ee548 -//.word 0x69d5120d -//.word 0x7cbc4116 -//.word 0xd979ce64 -//.word 0x512ab01f -//.word 0x3d56a12a -//.word 0xbf2380fb -//.word 0x4acaf3aa -//.word 0x64495047 -//.word 0xaa58be71 -//.word 0x159d9724 -//.word 0x7d2311d3 -//.word 0x5b091eb7 -//.word 0xd3779066 -//.word 0xf2d681a7 -//.word 0x3441f285 -//.word 0x4936b2a2 -//.word 0x189282ce -//.word 0x05bc76d8 -//.word 0x6f209ea4 -//.word 0x7ddfe67e -//.word 0x1bc43bae -//.word 0x3f7bef4d -//.word 0x71fd5f57 -//.word 0x8a4fd301 -//.word 0xbc6ca54c -//.word 0xd280a6da -//.word 0xb956bd00 -//.word 0x4014d11e -//.word 0x1c26e92b -//.word 0x2f789294 -//.word 0x0ae88247 -//.word 0xb0fb7a0a -//.word 0x9cce7112 -//.word 0x0650eed1 -//.word 0x63afb60f -//.word 0x2b10a73c -//.word 0xde83e405 -//.word 0x49363225 -//.word 0x06e9a27e -//.word 0x42a17168 -//.word 0xc2a12c49 -//.word 0x28961766 -//.word 0x7312d0f8 -//.word 0xc63b3083 -//.word 0x6ac57263 -//.word 0x151d97a7 -//.word 0x6de70823 -//.word 0xc8ab7ec1 -//.word 0x36cb1f18 -//.word 0xc1b9ea40 -//.word 0xf36654e4 -//.word 0x99fe3398 -//.word 0xc7d2dc6d -//.word 0x1c9688c3 -//.word 0x47ccfd5f -//.word 0xca806abe -//.word 0xfe3692a8 -//.word 0x58212c08 -//.word 0xea958afa -//.word 0x2dbf7a26 -//.word 0xfd946a4d -//.word 0xe507cf21 -//.word 0x9d7fc75a -//.word 0xd188fc06 -//.word 0x24c8cc20 -//.word 0x7536a865 -//.word 0x6186ba63 -//.word 0x09e7cbd3 -//.word 0x15f16328 -//.word 0xf9d93268 -//.word 0x76e8ae3b -//.word 0x642bfe42 -//.word 0xb06b17a9 -//.word 0xa15f2500 -//.word 0x5f212c46 -//.word 0xb5dfef47 -//.word 0x16d31129 -//.word 0xde757a41 -//.word 0xdbeffc2b -//.word 0x0cd13619 -//.word 0xa806b96b -//.word 0x62076a80 -//.word 0xec4e28cc -//.word 0xba0eae2b -//.word 0x0821ba75 -//.word 0x1e416f53 -//.word 0xd37cf751 -//.word 0x50e26e34 -//.word 0x1681fb8d -//.word 0x4393408e -//.word 0x10f5f51d -//.word 0x9fdbcf27 -//.word 0xf4c3a737 -//.word 0x41a7d847 -//.word 0x6677e9d6 -//.word 0xb8c66c3a -//.word 0x01c42538 -//.word 0xc96c6fd2 -//.word 0xd4fedc60 -//.word 0xecb01ce2 -//.word 0xe1a02095 -//.word 0xcd0e7ec4 -//.word 0x9cc818e1 -//.word 0xcce5f9d4 -//.word 0x72b67f93 -//.word 0x7efabff3 -//.word 0x3f5125be -//.word 0x2af45b05 -//.word 0xd7a26cb7 -//.word 0x4cde2a73 -//.word 0x7e57cd9b -//.word 0x15a8dcaa -//.word 0x704151c7 -//.word 0xe9a5f89a -//.word 0x5ad7185e -//.word 0xe00e5537 -//.word 0xdeb0d5c6 -//.word 0x457ea2fb -//.word 0x130c4f2b -//.word 0x1a75df63 -//.word 0x034ce2fb -//.word 0x92d6e16e -//.word 0x2c76fc69 -//.word 0x9668d221 -//.word 0xffb2a1ea -//.word 0x4158ae06 -//.word 0x64d0e8ba -//.word 0x63b5c8a7 -//.word 0x33c07b58 -//.word 0x02f34318 -//.word 0xbd171b06 -//.word 0xd4699a6b -//.word 0x4191194a -//.word 0xc7d31839 -//.word 0x7789de70 -//.word 0x79d16020 -//.word 0x09836406 -//.word 0xc066e63f -//.word 0x15a3bb5e -//.word 0x237974bc -//.word 0xad33850f -//.word 0x5f57a73e -//.word 0x56217a74 -//.word 0xe32f6f74 -//.word 0x8c7ee52c -//.word 0x5495928c -//.word 0x3d002598 -//.word 0x0a0029bc -//.word 0x49812d60 -//.word 0x914c22bd -//.word 0x097e04ef -//.word 0x2939bd4b -//.word 0xc59946f2 -//.word 0x47ea0fa6 -//.word 0x3c18a1dd -//.word 0x12668214 -//.word 0x1f635866 -//.word 0xe61b525d -//.word 0x968ac408 -//.word 0xd456114e -//.word 0xbabdce81 -//.word 0x20cb2437 -//.word 0x1ad17655 -//.word 0xc114446c -//.word 0x37c25049 -//.word 0xe52affc7 -//.word 0x072b01e8 -//.word 0x6bed3424 -//.word 0x75d0c601 -//.word 0x67a29be4 -//.word 0xdf15ee27 -//.word 0xa2703a6b -//.word 0x97845b30 -//.word 0x17e2f0a3 -//.word 0x644b05b6 -//.word 0x7668ef76 -//.word 0xfebb769a -//.word 0xa5d63a57 -//.word 0x94cb4f7c -//.word 0x3ae32bba -//.word 0x4993c243 -//.word 0x02abef98 -//.word 0xb3d1169b -//.word 0x7e2e08ec -//.word 0x5b672672 -//.word 0x60cfca38 -//.word 0x41dbe27b -//.word 0x13d6de01 -//.word 0x55d5cdac -//.word 0x30eec24e -//.word 0xfea57dbf -//.word 0x0aa7472d -//.word 0x96bb1eb4 -//.word 0x23f5122e -//.word 0xec2cef4d -//.word 0xb4af1ce7 -//.word 0xc134c390 -//.word 0x2911326e -//.word 0x4caf8249 -//.word 0xa23b76e2 -//.word 0xb79ea586 -//.word 0x73b0dce2 -//.word 0x9fa8be19 -//.word 0xa5d8ad14 -//.word 0x9797ee1a -//.word 0x737e07a0 -//.word 0xa6d76c62 -//.word 0xce525bb2 -//.word 0xc4fa0510 -//.word 0xda68eefc -//.word 0x61369608 -//.word 0x6fb75931 -//.word 0xdfe5946f -//.word 0x989b098b -//.word 0x13058531 -//.word 0x1754c046 -//.word 0xc7b6847b -//.word 0xdf851123 -//.word 0x3bbec142 -//.word 0x99b6e8e6 -//.word 0x9f08feba -//.word 0x20d200d8 -//.word 0x9b2113df -//.word 0x04a96b45 -//.word 0xc7ba6bef -//.word 0x0b6f0dff -//.word 0x332985ee -//.word 0xab3b21da -//.word 0xe1e77421 -//.word 0x918ab32e -//.word 0x46135f93 -//.word 0x1eb92458 -//.word 0xcdee0293 -//.word 0xe48eaa39 -//.word 0x545d2b34 -//.word 0x2db0cdb6 -//.word 0xac6a3dcc -//.word 0x752aeb36 -//.word 0x1dc3b176 -//.word 0xebedb527 -//.word 0xe03a9090 -//.word 0xf44bb079 -//.word 0xa343fa3d -//.word 0xa87cb421 -//.word 0x0979a3e4 -//.word 0x531c7098 -//.word 0x271951b0 -//.word 0xf5abe559 -//.word 0x08865f0e -//.word 0xc30ce666 -//.word 0x2ac33c31 -//.word 0xa4079ec4 -//.word 0xfefcec91 -//.word 0xb4c70afb -//.word 0x6cfe8668 -//.word 0xc45c7b97 -//.word 0x4dbab534 -//.word 0xd73a15a9 -//.word 0xf0c63738 -//.word 0xa7b95346 -//.word 0x96db61fa -//.word 0x1f938107 -//.word 0xf55899c6 -//.word 0xde694088 -//.word 0xb8bedb2a -//.word 0xba3e05ea -//.word 0xfd323578 -//.word 0x3bfa9a51 -//.word 0xd6fe4a48 -//.word 0x1ce89c65 -//.word 0xc911d2f3 -//.word 0xcd38fcd5 -//.word 0x507a1919 -//.word 0xf47e7ed0 -//.word 0x5af17c1c -//.word 0xe7323d8a -//.word 0xc84eefa2 -//.word 0x332e24bd -//.word 0xf00f7917 -//.word 0x19337625 -//.word 0x1ed6b629 -//.word 0x0b644803 -//.word 0x0ee9544a -//.word 0x34c9029b -//.word 0x73b19731 -//.word 0xedcde2b6 -//.word 0x733cd659 -//.word 0x48c17821 -//.word 0x28bbfc81 -//.word 0x89572a2c -//.word 0x2104072a -//.word 0xa827b22c -//.word 0xdf108c1d -//.word 0xd12d9bf9 -//.word 0x597e31e2 -//.word 0xe449c871 -//.word 0x780f314a -//.word 0xf6beeef3 -//.word 0x9c28dce6 -//.word 0xcdb415e4 -//.word 0x1554148d -//.word 0x68b71a2e -//.word 0xaabfd1da -//.word 0x75352fbc -//.word 0x16bc9eab -//.word 0xd8035aff -//.word 0x863f1aa3 -//.word 0x2bd9f26c -//.word 0x1c6378a9 -//.word 0x38d126fc -//.word 0x6fe6ff68 -//.word 0x81ec75aa -//.word 0x08a88bcd -//.word 0xb98d37f9 -//.word 0xe7300a8c -//.word 0x48fc126b -//.word 0xfc27009b -//.word 0xcbe4860b -//.word 0xafdb03b4 -//.word 0x92d662e4 -//.word 0x58bd3fd7 -//.word 0x20c44c88 -//.word 0xc7e3f4c6 -//.word 0xae873e8a -//.word 0xbe87f388 -//.word 0xa9590304 -//.word 0x728625e7 -//.word 0x2f5bbe12 -//.word 0x0ee104f2 -//.word 0x96106355 -//.word 0x2f40207c -//.word 0xe5e03c71 -//.word 0x696a9b9b -//.word 0x5896658f -//.word 0xc0cfad29 -//.word 0xe1e350dc -//.word 0x30fe2046 -//.word 0xa2d94207 -//.word 0x262fd5d4 -//.word 0x7371d4c7 -//.word 0x05ba3ef9 -//.word 0x62057453 -//.word 0xa29ee2a1 -//.word 0x2ed6e1e8 -//.word 0xc8fbdcfa -//.word 0xcc87b247 -//.word 0xb5985cf6 -//.word 0xe2a0d035 -//.word 0x9b5e25cd -//.word 0x4f0df7f9 -//.word 0x1fdb0d78 -//.word 0xa19c39e1 -//.word 0xddc08037 -//.word 0x9c827bbd -//.word 0xe363fd0b -//.word 0xbad7f762 -//.word 0x313e983d -//.word 0xa515b828 -//.word 0x406e76d5 -//.word 0xbf9d206d -//.word 0x78355424 -//.word 0x9b336510 -//.word 0xb878003b -//.word 0x817d10f7 -//.word 0xd242de71 -//.word 0xee877d89 -//.word 0x0c3f65e1 -//.word 0x12425e34 -//.word 0xa042a0ea -//.word 0x500038e9 -//.word 0x3cbfadad -//.word 0xc1f9e49b -//.word 0x83524192 -//.word 0xb1ca0fc4 -//.word 0x8b3622c4 -//.word 0x21f1badf -//.word 0x5dcfabb0 -//.word 0x4352bbef -//.word 0x78214c8a -//.word 0x01b53bf7 -//.word 0x4e5607c8 -//.word 0x77463680 -//.word 0xc53cf4a5 -//.word 0x7413fe16 -//.word 0xb7c4be9f -//.word 0xfd92b7cb -//.word 0x738424f9 -//.word 0xca18dcb2 -//.word 0x3a36793a -//.word 0xc763b965 -//.word 0xc33725ac -//.word 0x9411f080 -//.word 0xb70921df -//.word 0x0526f524 -//.word 0x35d27e23 -//.word 0xa38a9175 -//.word 0x4fdadf11 -//.word 0x2989621c -//.word 0x8c11fb03 -//.word 0x085159c6 -//.word 0x64861c97 -//.word 0xe3783aa3 -//.word 0xc7f1a230 -//.word 0x147320e8 -//.word 0x962a8174 -//.word 0x2520f74d -//.word 0x28b0bfcf -//.word 0x583d0090 -//.word 0xc724f7ef -//.word 0x20ee51f0 -//.word 0x30cbd847 -//.word 0xa53c52b2 -//.word 0x160fa68c -//.word 0x449041a0 -//.word 0xa0feb83b -//.word 0x0d3caf85 -//.word 0xe6c9f910 -//.word 0x43f201b2 -//.word 0x78466890 -//.word 0xdf4bef7c -//.word 0xd86f9881 -//.word 0x0d4108bb -//.word 0xfbe1306c -//.word 0xaeb52c4d -//.word 0xcb5e6b22 -//.word 0xd4eb1191 -//.word 0xa84c9934 -//.word 0x4909bfed -//.word 0xe2349d7a -//.word 0x099c1449 -//.word 0x41436d8d -//.word 0xc3124091 -//.word 0x7ecc954c -//.word 0x5c414a37 -//.word 0xc7c4b55b -//.word 0x6cde89ae -//.word 0x3e44fe9f -//.word 0xbe072cf0 -//.word 0x7a0bb8c4 -//.word 0xd4bab3f9 -//.word 0x05f9bfb7 -//.word 0x625b7449 -//.word 0xdd95022c -//.word 0xce331766 -//.word 0xf4890319 -//.word 0xb6eb1a58 -//.word 0xaf215939 -//.word 0x6a154d2c -//.word 0x6acf318b -//.word 0x6ea35772 -//.word 0xf3a9c9d0 -//.word 0xf96e2fbe -//.word 0x0ae9f310 -//.word 0x79b1a42a -//.word 0xe86d9816 -//.word 0x0c8bd6d3 -//.word 0xb53532ef -//.word 0x0880ba58 -//.word 0x0fe7516f -//.word 0x75f99a5e -//.word 0x8a4e18ab -//.word 0x8dbf930e -//.word 0x2bd6bd80 -//.word 0x43841595 -//.word 0xec120c0b -//.word 0xb95a66a3 -//.word 0x3c37e42f -//.word 0xc83a20ed -//.word 0x7b9fb813 -//.word 0x7c7faeab -//.word 0x82470fa1 -//.word 0x9668d31b -//.word 0x19500508 -//.word 0x089a24fc -//.word 0x7f81c83b -//.word 0x7c9b8814 -//.word 0xe6c41c70 -//.word 0xce57bfaa -//.word 0xf4a5d7a1 -//.word 0x8d9fd80c -//.word 0x43d6660e -//.word 0x7ea6ba0b -//.word 0xe2ad46b9 -//.word 0x19829c7a -//.word 0xd2a48ce9 -//.word 0x09b18cb2 -//.word 0x89d95ea8 -//.word 0xb091ec11 -//.word 0x738c7744 -//.word 0xa1e7f077 -//.word 0x6ca4a6d2 -//.word 0x255922c8 -//.word 0x47294fa6 -//.word 0xb7f4df6c -//.word 0x4acbe9dd -//.word 0x88a7d7d2 -//.word 0xb05a7fd3 -//.word 0xfcc590e8 -//.word 0x254c30ad -//.word 0x2a87e3a5 -//.word 0x4e3aafd0 -//.word 0x5f887e80 -//.word 0x3e63c368 -//.word 0x9c4760f6 -//.word 0x0228c8e3 -//.word 0x14a96008 -//.word 0x168e2c73 -//.word 0xaf74a7ba -//.word 0xedbff28f -//.word 0x8ad53195 -//.word 0x6e8a3372 -//.word 0x74da5126 -//.word 0x71de989b -//.word 0x73f92a7c -//.word 0x4653e14b -//.word 0x3d8836ae -//.word 0x2ea1610a -//.word 0xbf43c253 -//.word 0xe0268023 -//.word 0x99c97009 -//.word 0x06643823 -//.word 0xa01fb4ef -//.word 0xbd81985e -//.word 0x5b2b572a -//.word 0x19c6446a -//.word 0x863af764 -//.word 0x9e20f3a2 -//.word 0x927b8648 -//.word 0xc8a2f0a4 -//.word 0x2381c707 -//.word 0x840199d3 -//.word 0x91c5d4d6 -//.word 0xb517e3d6 -//.word 0x67229a6d -//.word 0xb061d418 -//.word 0xe7575a8a -//.word 0xc0810746 -//.word 0x85892a6c -//.word 0xa2bc2cd3 -//.word 0x67be7359 -//.word 0x0a7c8577 -//.word 0xeb637119 -//.word 0x1cd06bac -//.word 0x21c7b678 -//.word 0xf4e7c730 -//.word 0x4d9da7c7 -//.word 0x1f999986 -//.word 0x667efd5c -//.word 0x20de7475 -//.word 0x9965450d -//.word 0xec54ff87 -//.word 0xc73160b9 -//.word 0x6ebd768b -//.word 0x032704c0 -//.word 0x047f2713 -//.word 0x156d3986 -//.word 0x0023f6f7 -//.word 0xfa90ddf4 -//.word 0x28d7d9d0 -//.word 0x61ff21f6 -//.word 0x36ec5d7e -//.word 0x2f8e0afe -//.word 0x58581fa3 -//.word 0xfcf4f180 -//.word 0xb1355425 -//.word 0x944d0374 -//.word 0xd64042b0 -//.word 0x7898c1d7 -//.word 0x525bc432 -//.word 0x5a3a812a -//.word 0x230bc95d -//.word 0xa479ebf1 -//.word 0x3bfad628 -//.word 0xf2027d35 -//.word 0x0077804f -//.word 0x93640803 -//.word 0xccf1f2ce -//.word 0x0b9331eb -//.word 0x6e806d6a -//.word 0x9466f082 -//.word 0xa75cc328 -//.word 0x991914e0 -//.word 0xad63dbd4 -//.word 0x3acbbe23 -//.word 0xac98317b -//.word 0xcb01e1ea -//.word 0x409f53f1 -//.word 0x5421c8db -//.word 0xfc42654c -//.word 0x13f8901d -//.word 0xe6ee9d67 -//.word 0xf535aade -//.word 0xf837c761 -//.word 0x21ec5bcf -//.word 0xa150c31b -//.word 0x6d143ba3 -//.word 0x429302bd -//.word 0xe609b993 -//.word 0xb2ff0c32 -//.word 0x4d0a95dd -//.word 0xbab5fda7 -//.word 0x95bc6541 -//.word 0x997b0410 -//.word 0x66a51182 -//.word 0x8139e3a3 -//.word 0x9db257eb -//.word 0x197f725a -//.word 0xc9b247c8 -//.word 0xf9fc1b76 -//.word 0xafd9c8e8 -//.word 0x31085ff7 -//.word 0xc73e1122 -//.word 0xc21b5025 -//.word 0xbd5d31cd -//.word 0x2354150a -//.word 0xf2968846 -//.word 0xbef369f5 -//.word 0xf8ab4c6d -//.word 0x70df1cf8 -//.word 0x19460528 -//.word 0x0c21906b -//.word 0xd07110df -//.word 0xd9673e68 -//.word 0x4e1c20ff -//.word 0x10822f4d -//.word 0xf79bb878 -//.word 0x5fe8833d -//.word 0xe325b33f -//.word 0x6833ed9e -//.word 0x5e56bccc -//.word 0x42a0349c -//.word 0x67add69c -//.word 0xf791b4a5 -//.word 0x340fd6b0 -//.word 0x040cdbeb -//.word 0xad42e30d -//.word 0xdd39ade6 -//.word 0xed73fd3a -//.word 0x66e741cf -//.word 0xc5b273c5 -//.word 0x7b084126 -//.word 0x38706cbe -//.word 0x69316e2d -//.word 0x00075f3a -//.word 0x731b196a -//.word 0x07329bd2 -//.word 0x4e25ab29 -//.word 0xee91c021 -//.word 0xa5cf1ef7 -//.word 0x8a274349 -//.word 0x96408229 -//.word 0x62dbee6f -//.word 0x32c17953 -//.word 0x33fa5d3b -//.word 0x0140bbd1 -//.word 0x6cb48259 -//.word 0x7ccf9342 -//.word 0xb39a23fa -//.word 0x91226007 -//.word 0x5e265754 -//.word 0x231415c8 -//.word 0xfa340c1d -//.word 0x8722b9f0 -//.word 0xc7818414 -//.word 0x08eee82c -//.word 0x3933d379 -//.word 0x64bd50f0 -//.word 0x79516390 -//.word 0x4dfa34f2 -//.word 0xe2467022 -//.word 0xe9b1edad -//.word 0x85628dfb -//.word 0x521564df -//.word 0xa6591d6d -//.word 0x17fb990c -//.word 0x3dc2dacc -//.word 0xb95c20f9 -//.word 0x759951f0 -//.word 0x2ed79e31 -//.word 0x30be64b6 -//.word 0x612d5083 -//.word 0x8173c77f -//.word 0xb0c38582 -//.word 0x31e284af -//.word 0x6d231f04 -//.word 0x3b95772f -//.word 0x5e7b16a3 -//.word 0x4ffcd2ec -//.word 0x3e1cf43f -//.word 0x53eb9a56 -//.word 0x39fc5a7b -//.word 0xdd1928e2 -//.word 0x73357a3b -//.word 0xbba2aa88 -//.word 0x82859b2c -//.word 0x6b869f45 -//.word 0xefcc983c -//.word 0xa3285e9b -//.word 0xb990611e -//.word 0xcad0900c -//.word 0xd37c79c7 -//.word 0x7d29b1a2 -//.word 0xa1dc76f4 -//.word 0x0bc3936b -//.word 0x7e2384a2 -//.word 0xf992dbf5 -//.word 0x3966e294 -//.word 0x7f6d82d6 -//.word 0x93df63d0 -//.word 0x09905527 -//.word 0xc36aef22 -//.word 0xb71b7503 -//.word 0xf20bff98 -//.word 0xdd91d80d -//.word 0xc0662504 -//.word 0x845ac7e7 -//.word 0xbd45827d -//.word 0xe8415ebc -//.word 0xf0164ddf -//.word 0xf8f60fb8 -//.word 0x546b5346 -//.word 0xd88d1f8a -//.word 0x56787197 -//.word 0x62fd27e9 -//.word 0x58981cf7 -//.word 0xa1a2940b -//.word 0x31c8da52 -//.word 0x54bc272f -//.word 0xab2ac6d5 -//.word 0x71ee7615 -//.word 0x03841074 -//.word 0xa0c06981 -//.word 0x6dbf7a66 -//.word 0xbc1dbebc -//.word 0x8d68dca4 -//.word 0x55d58613 -//.word 0xff32a16d -//.word 0x311ca656 -//.word 0xd07248c5 -//.word 0xc60a5759 -//.word 0x03a2e4f1 -//.word 0xc119a677 -//.word 0x0ddf9cfc -//.word 0x83aaf40a -//.word 0x596a2c35 -//.word 0x9f8077f4 -//.word 0xc42a62af -//.word 0x5d42b719 -//.word 0x2229a1c0 -//.word 0x39fe12e3 -//.word 0xb8136283 -//.word 0x65a139bc -//.word 0xc0baae56 -//.word 0x4380b098 -//.word 0xe895a55c -//.word 0xecd25269 -//.word 0xd23cfbfc -//.word 0xac33cba8 -//.word 0x96ed7660 -//.word 0x83231cd3 -//.word 0x3c0a71f8 -//.word 0xa5851be9 -//.word 0x42995bf4 -//.word 0xfb21f0ef -//.word 0x1cc338cd -//.word 0xa022996f -//.word 0xaf551fbc -//.word 0x659966f4 -//.word 0xd542bb41 -//.word 0x4ef87e90 -//.word 0xdd1fca9e -//.word 0x12975956 -//.word 0x07a6a15a -//.word 0x9f3243e0 -//.word 0x0c34a6bf -//.word 0x9469dfc9 -//.word 0x944bd55c -//.word 0xc53fa234 -//.word 0xbe103c83 -//.word 0xba9c5444 -//.word 0x9ccd7ecc -//.word 0x30cb93a2 -//.word 0xb4705390 -//.word 0x97fd4ffa -//.word 0x800b076f -//.word 0x92c44f7e -//.word 0xef52f7cb -//.word 0x7a98aa62 -//.word 0xe220174a -//.word 0xdc554f5e -//.word 0xaff36e58 -//.word 0xf6bb7e2f -//.word 0xa16b98a3 -//.word 0x3eed4c15 -//.word 0x77cf449d -//.word 0xdbf32357 -//.word 0xe188b3fd -//.word 0x293840bb -//.word 0x06a33f3e -//.word 0x3a0d340f -//.word 0x0053d21f -//.word 0x502463a3 -//.word 0x5e6d6a21 -//.word 0x641587cb -//.word 0xa1eb9c0d -//.word 0xa1dd2e62 -//.word 0xc06a0e6b -//.word 0xea5a3842 -//.word 0xa4acfb0c -//.word 0x50d05acd -//.word 0xac16b381 -//.word 0x9d679e68 -//.word 0x2b3318a1 -//.word 0xccaae1fa -//.word 0xe52f2207 -//.word 0x8e095371 -//.word 0x965c5c91 -//.word 0xc658fa3d -//.word 0x6ab165e2 -//.word 0x0e4f30d3 -//.word 0x864670e1 -//.word 0x3108202c -//.word 0x7edac439 -//.word 0xae844d44 -//.word 0xdc4d3dd7 -//.word 0x3b260b9b -//.word 0xa026c96f -//.word 0x403604b7 -//.word 0xba0eecf6 -//.word 0x5860b4a0 -//.word 0x91523c29 -//.word 0xd332ee62 -//.word 0x8065e605 -//.word 0x37a1558e -//.word 0x545d274d -//.word 0xba85e3ba -//.word 0xd071d308 -//.word 0xc91866fd -//.word 0x2981d200 -//.word 0x847bfd74 -//.word 0x898e9e44 -//.word 0x40319fbf -//.word 0x903dc7a7 -//.word 0x04a29584 -//.word 0xcf596f3e -//.word 0x0d9afceb -//.word 0x4b4ecee6 -//.word 0x4ac74421 -//.word 0x00afaebc -//.word 0xe03eb3d6 -//.word 0x5bb0f0a3 -//.word 0xa7f7e2be -//.word 0xbfad06c1 -//.word 0xab4c3e14 -//.word 0x01a17702 -//.word 0xac7e8912 -//.word 0xecb05e94 -//.word 0x9e30577a -//.word 0xbe9eeb69 -//.word 0x2aea9210 -//.word 0xa855e1b9 -//.word 0x2b98f61d -//.word 0x5262167d -//.word 0x320895ee -//.word 0x5578f6f5 -//.word 0x02705453 -//.word 0xbfed0122 -//.word 0x15e56c21 -//.word 0x9338484d -//.word 0x16e5eab1 -//.word 0x4779f37e -//.word 0x64ce305e -//.word 0x44f1be06 -//.word 0x9564720a -//.word 0x698677f6 -//.word 0xf14f399a -//.word 0x874082a5 -//.word 0xf29ae376 -//.word 0xe6cf562e -//.word 0xcb36210a -//.word 0xbf02fef0 -//.word 0xde757847 -//.word 0xc151980c -//.word 0x4490c122 -//.word 0x8d54d9ea -//.word 0x4a21a914 -//.word 0x394a87b5 -//.word 0xeea93299 -//.word 0xd193fdda -//.word 0x660b30b1 -//.word 0xd136ab8d -//.word 0x9910cc62 -//.word 0xac5c9344 -//.word 0xa3e10434 -//.word 0x48d3cd3a -//.word 0x559029b4 -//.word 0x7f8d04ed -//.word 0xb38f60f1 -//.word 0xa01ef7a0 -//.word 0x75362202 -//.word 0xec41f9da -//.word 0x8742bc7e -//.word 0x195372e5 -//.word 0x8951cf02 -//.word 0xd3d65b50 -//.word 0x4f67d1af -//.word 0x36efc56e -//.word 0x626c8aa9 -//.word 0x55e953d5 -//.word 0x7dac9899 -//.word 0xb7b0bcdf -//.word 0x1156ec2c -//.word 0xd4574a2c -//.word 0xc2fd4b92 -//.word 0x9c935d1f -//.word 0xe71aceff -//.word 0xf03de95c -//.word 0x0e87622e -//.word 0x27d4f450 -//.word 0x750548d9 -//.word 0x8af819a9 -//.word 0x92b89642 -//.word 0xd9f007da -//.word 0x8da6b4ae -//.word 0xc4250298 -//.word 0xc03be0e4 -//.word 0x72a56160 -//.word 0x3ec8aab2 -//.word 0xfea20fee -//.word 0x49ff7968 -//.word 0xf5f00bc7 -//.word 0xda79055b -//.word 0xd98ae8b1 -//.word 0x1e30db64 -//.word 0xa10d4d35 -//.word 0xf306dc5e -//.word 0x373b7524 -//.word 0x6e3cbdac -//.word 0xf97ab00f -//.word 0x58fb88b0 -//.word 0x3852e1ce -//.word 0xadcf1a55 -//.word 0xbcf3fefa -//.word 0x1c26a486 -//.word 0x3dac9372 -//.word 0x8ad62ab5 -//.word 0xec7540da -//.word 0x8f940755 -//.word 0xe8673617 -//.word 0xf77e6760 -//.word 0xc93ebdd5 -//.word 0x4292cbd2 -//.word 0x19deb101 -//.word 0x2435882c -//.word 0xd6cb014f -//.word 0x06ad48f2 -//.word 0xf1af2fb5 -//.word 0x83a6882d -//.word 0xd2d8d2ee -//.word 0xecb119e9 -//.word 0xd2b817f9 -//.word 0xc4c19fb8 -//.word 0xbf633c97 -//.word 0x45ac152e -//.word 0x5c1413d0 -//.word 0xd9b04663 -//.word 0xdea8856e -//.word 0xa2eb5574 -//.word 0x70210d81 -//.word 0xf3e23702 -//.word 0xb02538d9 -//.word 0xd4fb34b1 -//.word 0x307d2c8f -//.word 0x820269aa -//.word 0xf6961e7d -//.word 0xeca8491a -//.word 0xfc03dac1 -//.word 0x370017b1 -//.word 0xb0f93f3e -//.word 0x3c006d24 -//.word 0x75d1c01b -//.word 0x0506b9ac -//.word 0x218ae442 -//.word 0x5350bb84 -//.word 0x7d45c7e2 -//.word 0x1b83086e -//.word 0xc8c797ee -//.word 0x04258a2f -//.word 0x34fa189c -//.word 0xea23fe0e -//.word 0x676c20e6 -//.word 0x5e4b745a -//.word 0xfbcf1c0c -//.word 0x24d3d2e1 -//.word 0xff778910 -//.word 0xb4d15179 -//.word 0x74df7c39 -//.word 0xbac0ff7b -//.word 0xd0241b90 -//.word 0x96023c43 -//.word 0x7f892166 -//.word 0xdc583db1 -//.word 0x5df15dcd -//.word 0xd46b8cab -//.word 0x3d68331a -//.word 0xfc478599 -//.word 0x659b1a69 -//.word 0x81dbdae7 -//.word 0x0f5b1d19 -//.word 0xca7a1187 -//.word 0xea1d5b4c -//.word 0xed5d016c -//.word 0x977d8768 -//.word 0x381f5810 -//.word 0x2db76899 -//.word 0xa93f18ef -//.word 0xb62d5a4c -//.word 0x76a2150a -//.word 0xafe4cbb6 -//.word 0x860e7965 -//.word 0x8b06be4b -//.word 0xf6b04089 -//.word 0x30614c47 -//.word 0x9697bc03 -//.word 0x79e71e28 -//.word 0x693612e3 -//.word 0xb32cf432 -//.word 0x28e6bb3e -//.word 0x20eb21ea -//.word 0xbf6205ac -//.word 0x77820d9c -//.word 0xce498fca -//.word 0x6271b2d5 -//.word 0x2aa0d0b9 -//.word 0xfedf1fe9 -//.word 0x5a4d919e -//.word 0x5f14f86e -//.word 0x1a9d6e20 -//.word 0x0900f4bf -//.word 0xdbbf59ed -//.word 0x78b35e7a -//.word 0x41461735 -//.word 0x99e39402 -//.word 0xa4abc12d -//.word 0x4e6a8bfe -//.word 0x90c9448e -//.word 0xefc549d8 -//.word 0x455fe213 -//.word 0xc3956940 -//.word 0x3792afff -//.word 0x8b229ba6 -//.word 0x8e681494 -//.word 0xf8d321c3 -//.word 0xa84e4f9d -//.word 0x2fb75411 -//.word 0x9293f1e5 -//.word 0x4c001d4e -//.word 0x93ea5fbe -//.word 0xdc827cfd -//.word 0xa1ec527b -//.word 0x623804e5 -//.word 0xea9457f6 -//.word 0xd3c05c90 -//.word 0x4cc2500b -//.word 0x1adac0cd -//.word 0xddb8f01a -//.word 0x95ed7e2e -//.word 0x64a04389 -//.word 0x96827a8b -//.word 0xde042440 -//.word 0xe2c7ab7d -//.word 0xfa53c52c -//.word 0x350d9be4 -//.word 0x9e632bbd -//.word 0xbd4aea62 -//.word 0x60eaae67 -//.word 0x9b97ccdd -//.word 0x0d047d24 -//.word 0x65b38701 -//.word 0x25b019f0 -//.word 0xa67ff6bc -//.word 0x5c53d54c -//.word 0x5c8108c0 -//.word 0x1b335dbd -//.word 0x79614204 -//.word 0xfefd2c4a -//.word 0x636e3944 -//.word 0x54401401 -//.word 0x741a197c -//.word 0xa2f0b972 -//.word 0x7b792071 -//.word 0x1fe41632 -//.word 0x38c72328 -//.word 0x3958f759 -//.word 0xe4df086d -//.word 0x0f6b7d04 -//.word 0xa7c44b4d -//.word 0xf5a29ed5 -//.word 0x201c7a9c -//.word 0xf463a26e -//.word 0xe1b0b970 -//.word 0x477ba7fa -//.word 0xf1ee3ea4 -//.word 0xdf991ea4 -//.word 0x4867d557 -//.word 0xdfd14b1d -//.word 0x56515e6a -//.word 0x201ac91a -//.word 0x7c064a05 -//.word 0xafd004d4 -//.word 0x90832213 -//.word 0x4a32bd87 -//.word 0x5eeaffc1 -//.word 0xe7e589f3 -//.word 0x22001303 -//.word 0x2d6f52de -//.word 0x0fb01f0f -//.word 0xf9bdd590 -//.word 0xcc86fbdf -//.word 0xda9e2355 -//.word 0xf13511b4 -//.word 0x964620ff -//.word 0x8e11e28e -//.word 0xa3cc0761 -//.word 0xa49680b5 -//.word 0xaeace4d5 -//.word 0xaadf1233 -//.word 0x174618b7 -//.word 0x0a305357 -//.word 0x725cd8e8 -//.word 0xa16d1333 -//.word 0x0898ae4c -//.word 0x42a0b41f -//.word 0x5504f74c -//.word 0x3477af35 -//.word 0x88906354 -//.word 0xafc30dd3 -//.word 0x05907956 -//.word 0x63faee1c -//.word 0xe63b1046 -//.word 0xf2b60576 -//.word 0x762dd79c -//.word 0x7134190d -//.word 0xb5e5ced6 -//.word 0xebd6864f -//.word 0xd748caf3 -//.word 0xdda1ba6e -//.word 0xc41df5f8 -//.word 0xbbc0b9e2 -//.word 0x998f4c6e -//.word 0x69ff9ae4 -//.word 0x26ae1fe2 -//.word 0xc35107f4 -//.word 0x6eed9464 -//.word 0x164bc154 -//.word 0x2ba62509 -//.word 0xa5a6198a -//.word 0x47921d6a -//.word 0x25c178e2 -//.word 0x64511f23 -//.word 0x411cd8e9 -//.word 0x54e89f54 -//.word 0x16de49f4 -//.word 0xa23e6722 -//.word 0xb8506d97 -//.word 0x079e1437 -//.word 0xac60fc2e -//.word 0xf638963e -//.word 0x6c1f4157 -//.word 0x119fb369 -//.word 0xe6449b76 -//.word 0xb14d84eb -//.word 0xfda6fd30 -//.word 0x621bf77e -//.word 0x06c66ef1 -//.word 0x64c94cde -//.word 0x4c438a66 -//.word 0x2b7c984b -//.word 0x8d63ff03 -//.word 0xe03b450b -//.word 0x7b91107e -//.word 0xdf718fe6 -//.word 0x3cd91652 -//.word 0x376e0880 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00010AF8 -//// expected output -//.word 0xe95fda82 -//.word 0xd0384a00 -//.word 0xd1aaf907 -//.word 0x44ec582c -//.word 0xdbbe31f5 -//.word 0xc6b2ea26 -//.word 0xb963ff63 -//.word 0x3c722434 -//.word 0x0fc44232 -//.word 0x03a8972f -//.word 0xe7d90c2a -//.word 0x2342cdb8 -//.word 0xfbe73e0a -//.word 0xb036a29b -//.word 0x81d08d85 -//.word 0x9978281f -//// SHA512LongMsgvector_86 -//// vector length -//.word 0x00010E10 -//// input message -//.word 0x3a2a624b -//.word 0xcfb908a6 -//.word 0x1b03e422 -//.word 0xb256dd9e -//.word 0x4d9e0475 -//.word 0x273319f5 -//.word 0xa6f55113 -//.word 0x3e9b565c -//.word 0x9348902f -//.word 0xdd5fa32a -//.word 0x919939e2 -//.word 0x3e5501d7 -//.word 0xb42ff8a7 -//.word 0x6cd3e781 -//.word 0x24142cdd -//.word 0xca38be6a -//.word 0x9b966c48 -//.word 0x8c646578 -//.word 0xe9cafd91 -//.word 0x3c3aaeb4 -//.word 0x70045dc1 -//.word 0x3625dfcb -//.word 0xa860bcca -//.word 0x2c913390 -//.word 0x9c3d7eff -//.word 0xa46d5778 -//.word 0x6bbdba96 -//.word 0x75b0ed1d -//.word 0xc846be2d -//.word 0x4dd10cbc -//.word 0x7a048843 -//.word 0x2e4dbdb6 -//.word 0xdc654eba -//.word 0xec257f13 -//.word 0x5e9bf75b -//.word 0xb15dc5fa -//.word 0x031da052 -//.word 0x797e733a -//.word 0xe12619ae -//.word 0x961464c4 -//.word 0xa43465e2 -//.word 0x2d31e72f -//.word 0x0c8b3d47 -//.word 0xb7e93e33 -//.word 0x6ab08d98 -//.word 0x82d41e2e -//.word 0x27eff574 -//.word 0x2d9031a3 -//.word 0x3cd54ae0 -//.word 0x2f3c97b5 -//.word 0xbbb613c2 -//.word 0x51fd60b0 -//.word 0x45280c67 -//.word 0x2f7d1481 -//.word 0x9286a6fe -//.word 0xbb672b39 -//.word 0xec6e851a -//.word 0xbaec958e -//.word 0xb4430134 -//.word 0x4541345a -//.word 0xdcaca627 -//.word 0x491e5d19 -//.word 0x6b13b4b3 -//.word 0x08415b6f -//.word 0xfc289ffa -//.word 0x96e9eba0 -//.word 0x3f5b8f05 -//.word 0x5c5cc117 -//.word 0x7665e140 -//.word 0x986202e0 -//.word 0xf9c0a5fa -//.word 0xdbc7c72e -//.word 0xb32a1fe7 -//.word 0x8adca1d5 -//.word 0xa326469e -//.word 0x5ef70fd0 -//.word 0x5c7b481b -//.word 0xe4ee0abd -//.word 0x86b3033d -//.word 0xfea0795c -//.word 0x5b9d8d49 -//.word 0x606dbd14 -//.word 0x2acbad65 -//.word 0x13b9276e -//.word 0xd715601e -//.word 0xf56d7d97 -//.word 0x581455e3 -//.word 0x377579e2 -//.word 0x3aa87287 -//.word 0xde434944 -//.word 0x1a734dc3 -//.word 0x434b10d7 -//.word 0x2d5bb3b2 -//.word 0x93856358 -//.word 0xb80c2454 -//.word 0x4feecda9 -//.word 0x9874540b -//.word 0xcd074c4f -//.word 0xbc45ac21 -//.word 0xb554d2f5 -//.word 0xa676c840 -//.word 0x85dec5e7 -//.word 0xeec3f7f7 -//.word 0x0eb27f98 -//.word 0xbf28be3c -//.word 0xf460cf1c -//.word 0x586a54e5 -//.word 0x327d76ae -//.word 0x8c8e272e -//.word 0x9421aa2c -//.word 0x42605636 -//.word 0x3b6a9796 -//.word 0xf6ed3582 -//.word 0x1df7d993 -//.word 0x3609cd79 -//.word 0x826e03ec -//.word 0x25ca59e5 -//.word 0x88f61b0f -//.word 0xfc0bc978 -//.word 0xa0bd1b8d -//.word 0x84eb4345 -//.word 0x0e73729c -//.word 0x9d4b9d43 -//.word 0x6dce8196 -//.word 0xbb53e5ce -//.word 0x29041f78 -//.word 0x63eed926 -//.word 0x03541564 -//.word 0xb2496fed -//.word 0x907ea21f -//.word 0xd7584ead -//.word 0xbb45f994 -//.word 0x94515350 -//.word 0x3ef4be4f -//.word 0xc02e0da6 -//.word 0x2dd68c03 -//.word 0xc83041e2 -//.word 0x6bbd7204 -//.word 0x2a57681d -//.word 0x337d72ce -//.word 0xf8eb2cd2 -//.word 0x916d007c -//.word 0x5bf6ee61 -//.word 0xe6ec8952 -//.word 0x0ec7428d -//.word 0x67dae933 -//.word 0xdf7071fd -//.word 0x9e1bf42b -//.word 0x3149f6be -//.word 0xe818eee7 -//.word 0x7c6c03bf -//.word 0xf53e1338 -//.word 0xcb37f954 -//.word 0x4c7d1095 -//.word 0x3dcdf3b4 -//.word 0xc4ca8796 -//.word 0x86943c7b -//.word 0x0c9d8f79 -//.word 0x6bb8d429 -//.word 0x247332a0 -//.word 0x49a7efa0 -//.word 0xe14ded10 -//.word 0x8e9375aa -//.word 0x6d3034f4 -//.word 0x3ef48371 -//.word 0xc5a3ec18 -//.word 0x6f03e905 -//.word 0x3934ee6f -//.word 0xce40aada -//.word 0xeff38b8d -//.word 0x18ed8047 -//.word 0x61f5022e -//.word 0xa2905508 -//.word 0xdad20bad -//.word 0xd275cbbc -//.word 0xfd28508e -//.word 0xa329b468 -//.word 0x3e16eff5 -//.word 0x25019bf3 -//.word 0x67c2fa2c -//.word 0xfa9139a8 -//.word 0x15d4f621 -//.word 0xda3501b7 -//.word 0x38f85fe5 -//.word 0x108b95b4 -//.word 0x965f232e -//.word 0xfbf74e16 -//.word 0x493f22d6 -//.word 0x8e1eb8b9 -//.word 0x3c4eb55a -//.word 0xd06c135d -//.word 0xb24b245c -//.word 0x5c8ed324 -//.word 0xbf762e22 -//.word 0xe2f82118 -//.word 0xcd138414 -//.word 0xa56059a3 -//.word 0x18eb4e42 -//.word 0xfc418a15 -//.word 0x32caa5dc -//.word 0xd159f822 -//.word 0x800218b7 -//.word 0x242c9d61 -//.word 0xbce628cf -//.word 0x887fa4ce -//.word 0x7150cbc0 -//.word 0xa5ddec49 -//.word 0x821dec4b -//.word 0xb5158c15 -//.word 0xa3ace9d7 -//.word 0x08ba4959 -//.word 0xdd6214ed -//.word 0x80a221a3 -//.word 0x0f2833bb -//.word 0x1467c460 -//.word 0x68eb0193 -//.word 0x51e91565 -//.word 0xee1baa69 -//.word 0xd5caad69 -//.word 0xfa2d5258 -//.word 0xd3f15988 -//.word 0xb9198f1d -//.word 0x920897c2 -//.word 0xaddcea9a -//.word 0xedfe1d79 -//.word 0x2af76355 -//.word 0xd48652f7 -//.word 0xd9efeaf6 -//.word 0xc995d3e6 -//.word 0x39cbe6cd -//.word 0x65e8efd6 -//.word 0x1999b14a -//.word 0xd17c2bbb -//.word 0x1fea1a83 -//.word 0x4d14bf6d -//.word 0x4351e2b1 -//.word 0xacb61726 -//.word 0x55e840b3 -//.word 0xd52e5306 -//.word 0x73ca5e89 -//.word 0x448ac892 -//.word 0x949ad9db -//.word 0x879c7c31 -//.word 0x00fa4470 -//.word 0xc27baeae -//.word 0xd615a6b7 -//.word 0x2c034cba -//.word 0x8517f741 -//.word 0x8f507a66 -//.word 0x52afa744 -//.word 0xcc4712ad -//.word 0xd894181b -//.word 0x550d1fe8 -//.word 0x83fc1ec1 -//.word 0xb08e6158 -//.word 0x15268659 -//.word 0xfbf7cca0 -//.word 0x22d28da9 -//.word 0x623c0847 -//.word 0x93c46499 -//.word 0xab94f23a -//.word 0x2645b3b9 -//.word 0xabf81a49 -//.word 0xeca212b9 -//.word 0xcea743a6 -//.word 0xcaab91ef -//.word 0x92a4e669 -//.word 0xf83432d4 -//.word 0x0c37b00e -//.word 0x85986a87 -//.word 0x6368fff5 -//.word 0xd231a449 -//.word 0x508769e1 -//.word 0x12e1beff -//.word 0xa4a7357a -//.word 0xd18c89b3 -//.word 0xc21ee0cb -//.word 0x6a9b4d13 -//.word 0x210799c4 -//.word 0x8e7b43f1 -//.word 0xcbc0c5b9 -//.word 0xc41d19c1 -//.word 0xe06c7ce2 -//.word 0xe473721e -//.word 0x14720ad9 -//.word 0x9bf96345 -//.word 0x2cfc6f1f -//.word 0xea29f799 -//.word 0x8579df97 -//.word 0xa606ac1d -//.word 0x8e1c4308 -//.word 0xfa92f3fd -//.word 0x495bb6a0 -//.word 0xe058b406 -//.word 0xce70096c -//.word 0xace3c829 -//.word 0xc7db40e1 -//.word 0x82457efc -//.word 0xf5de1356 -//.word 0xda911738 -//.word 0xaa006d88 -//.word 0x0361493c -//.word 0x4d8bf014 -//.word 0x9d50bf89 -//.word 0xd90e6f01 -//.word 0x1e819744 -//.word 0x5edb7233 -//.word 0x4e17e3b8 -//.word 0x7f8ab6f9 -//.word 0xcabb29d1 -//.word 0xf274ab80 -//.word 0x8519e3a1 -//.word 0x0339f45d -//.word 0x426300df -//.word 0x113beb07 -//.word 0x1ccc6163 -//.word 0x10201a5b -//.word 0xff0e5cab -//.word 0x0554c217 -//.word 0x2ce63d59 -//.word 0x8d85585f -//.word 0xb892c0b3 -//.word 0x5625033b -//.word 0x0d5a9822 -//.word 0xa4eb2016 -//.word 0x6804ebb4 -//.word 0xce52be40 -//.word 0x595ed39a -//.word 0xbe19226d -//.word 0x47b7dfaa -//.word 0x75c14435 -//.word 0xe96690de -//.word 0x84135092 -//.word 0xce43ddd2 -//.word 0x94972665 -//.word 0xd629af4a -//.word 0xe01edaf1 -//.word 0xb67a66ab -//.word 0xb538355e -//.word 0x789b527d -//.word 0xf9bf3237 -//.word 0xf8733aef -//.word 0xa14b82ed -//.word 0x69f0d953 -//.word 0x39bb0952 -//.word 0xce825c9d -//.word 0x60b25e1e -//.word 0x819ee5e9 -//.word 0x49174f6e -//.word 0xb03d0bf2 -//.word 0x3b945b40 -//.word 0xdb5b579b -//.word 0x121936f8 -//.word 0x5778c96a -//.word 0xbc5648de -//.word 0xce1a5108 -//.word 0xbc442e9d -//.word 0xbc4957c3 -//.word 0xab9d37c6 -//.word 0xf311330c -//.word 0xb25fe94b -//.word 0x1903b5f9 -//.word 0x124d7a04 -//.word 0x25b59fc4 -//.word 0x9c6e572e -//.word 0xe53e264a -//.word 0x398ca1e7 -//.word 0x7bbb758d -//.word 0x63b6aab3 -//.word 0xdbcc2932 -//.word 0xa9bf7cfa -//.word 0x4f17d603 -//.word 0x2fbc5387 -//.word 0xf3c4806f -//.word 0x2c8a1e0b -//.word 0x39002305 -//.word 0x6b460298 -//.word 0x677b2cfd -//.word 0xcbd3d726 -//.word 0x14e9feaf -//.word 0xbf57a912 -//.word 0xae856e1a -//.word 0xcebe389a -//.word 0xf789475e -//.word 0x13367862 -//.word 0x83b7c742 -//.word 0xbeb112f2 -//.word 0x3bd320af -//.word 0x9267e135 -//.word 0xde26f733 -//.word 0x655176fc -//.word 0x7bfde87f -//.word 0xa3af9579 -//.word 0xf82801e9 -//.word 0xcb82b5c5 -//.word 0x8e7c42eb -//.word 0xf013845a -//.word 0x4a5224a2 -//.word 0x3a6a6099 -//.word 0x8d050f50 -//.word 0x63d8df45 -//.word 0x8d77e2da -//.word 0x3a6e4906 -//.word 0xd38d6f4b -//.word 0x238319e8 -//.word 0xbbaffc4f -//.word 0x95327fd9 -//.word 0xf749c3b9 -//.word 0x9adae02f -//.word 0x0c4c72fe -//.word 0x539c551f -//.word 0xd3adacb7 -//.word 0x72e02847 -//.word 0xf9e58722 -//.word 0xbdd15a25 -//.word 0x80700ca2 -//.word 0x92dc209d -//.word 0x3b4eba3b -//.word 0x5e356177 -//.word 0x56850317 -//.word 0x245239de -//.word 0xcc9dcd04 -//.word 0xfc6e7ae3 -//.word 0xef23f2f3 -//.word 0x910726f8 -//.word 0xe426c17a -//.word 0xa260f576 -//.word 0x24bd7b53 -//.word 0x8200d517 -//.word 0xfc7fd7db -//.word 0x9831657d -//.word 0x0d097e94 -//.word 0xe0827aa9 -//.word 0xcd7c8fa4 -//.word 0x68469a84 -//.word 0x04fc1c53 -//.word 0xd4138359 -//.word 0x5032ac91 -//.word 0xda43a559 -//.word 0xa2cbb76d -//.word 0xc776a416 -//.word 0xbff72d9f -//.word 0xf80ed709 -//.word 0xbfeaef00 -//.word 0x62b2cc0d -//.word 0x915f540c -//.word 0x0accc2e1 -//.word 0x7610a667 -//.word 0x8d0b2ca9 -//.word 0x813fa255 -//.word 0x9ae1356d -//.word 0x1d30fb40 -//.word 0x73063799 -//.word 0x87add836 -//.word 0x70f3427b -//.word 0x50815168 -//.word 0x7c689bc9 -//.word 0xddfdf6ac -//.word 0x96e73b18 -//.word 0xe67649fc -//.word 0x50374c66 -//.word 0xfac53ff5 -//.word 0x54e1af91 -//.word 0xf9c5c259 -//.word 0xdab679dd -//.word 0x99d9328e -//.word 0x33477173 -//.word 0xe263df1d -//.word 0x426c93dc -//.word 0xb24e9133 -//.word 0xfdbe908a -//.word 0x3a850123 -//.word 0xf01c4c4f -//.word 0x7e7a5de2 -//.word 0xba2a5fe4 -//.word 0xd9a0c789 -//.word 0x8fcd9563 -//.word 0x76f1d6d7 -//.word 0xb4b16ece -//.word 0xd96914ac -//.word 0x06c39e86 -//.word 0x54897f90 -//.word 0x73b78ed4 -//.word 0x92d5092a -//.word 0x7f83d964 -//.word 0x105617c9 -//.word 0xc1e2d0c5 -//.word 0x9e1805de -//.word 0x64d3f6ea -//.word 0xe3ada17f -//.word 0xa61785ac -//.word 0xd6a9abe6 -//.word 0x5cb6e745 -//.word 0x46245cf1 -//.word 0x6c7a3ed7 -//.word 0x533bdca0 -//.word 0x5173dde3 -//.word 0xf28fc999 -//.word 0x9b71ccd2 -//.word 0x6dc4b7a7 -//.word 0x6c8d4870 -//.word 0xe103ab37 -//.word 0xfda1406c -//.word 0xbe799fd9 -//.word 0x17cbdad9 -//.word 0x4bd602c5 -//.word 0x9aeeecb0 -//.word 0x1fcf3454 -//.word 0xf931834b -//.word 0xa99d0e83 -//.word 0xbb7e5fec -//.word 0xa97b5873 -//.word 0xfc047534 -//.word 0xb42b51eb -//.word 0xeab66cac -//.word 0xb4722bd5 -//.word 0x49ca2040 -//.word 0x65978cbd -//.word 0xef3a22bf -//.word 0xdae90e55 -//.word 0x4946365c -//.word 0xf636c0f4 -//.word 0xd4f0d430 -//.word 0xf354a312 -//.word 0xa47fa8b6 -//.word 0xdf9c2dcd -//.word 0xe1fc124d -//.word 0x196aca67 -//.word 0x45b8a6ba -//.word 0xd99e56c6 -//.word 0xa0c5ada3 -//.word 0xa51ea4f2 -//.word 0x5478a215 -//.word 0xdd52fa9b -//.word 0xd9edb5fe -//.word 0x30a69391 -//.word 0x3a834cb4 -//.word 0x240c1b4a -//.word 0x965c7d6d -//.word 0x92773760 -//.word 0xa0de96c4 -//.word 0x2861fa0f -//.word 0x1f35963b -//.word 0xe54671bb -//.word 0x6eceb0b3 -//.word 0xa1271868 -//.word 0xfddecff6 -//.word 0x82086241 -//.word 0xcfd90c2d -//.word 0x88723612 -//.word 0xfafb3a6a -//.word 0x02f26ccd -//.word 0x2ac25b20 -//.word 0x16985409 -//.word 0x1f7228a5 -//.word 0x3d792f7e -//.word 0x2a908db7 -//.word 0xc42db48a -//.word 0xb4672bf5 -//.word 0x4d518daf -//.word 0xb687d461 -//.word 0x4c06d713 -//.word 0x424112e4 -//.word 0x8a71a6ff -//.word 0xf92ca0ca -//.word 0xa6397e61 -//.word 0x93a3f042 -//.word 0x8f0cdb4a -//.word 0x5a44a3e0 -//.word 0x0b1aaa70 -//.word 0xaf72141b -//.word 0x3398ceac -//.word 0x84d4cece -//.word 0xf43f9c7d -//.word 0xe0d411bb -//.word 0x8fca5e84 -//.word 0x5e225103 -//.word 0x1a7cd406 -//.word 0xae2eb7b0 -//.word 0xfe97af6d -//.word 0x12b19e2b -//.word 0x77e614c8 -//.word 0xe22516c6 -//.word 0x17341f46 -//.word 0x09486534 -//.word 0x43d35dbf -//.word 0x869d810c -//.word 0xb416512b -//.word 0xeceb984a -//.word 0xf7d7f028 -//.word 0xe3bc88cd -//.word 0xedf22579 -//.word 0xa5de67da -//.word 0x4cc74e81 -//.word 0x81e6fc97 -//.word 0x1dbcbdcc -//.word 0x5ba94491 -//.word 0x3cb93887 -//.word 0x29c1ef37 -//.word 0xdaab7903 -//.word 0x780ee05c -//.word 0xfe02ae36 -//.word 0xe532b0b9 -//.word 0x0032fa3a -//.word 0xa5132b69 -//.word 0x0d35f2cc -//.word 0xfd5dd16c -//.word 0xa60721ce -//.word 0xcbfe5724 -//.word 0x212985c5 -//.word 0xfba824db -//.word 0x2620105b -//.word 0x1252d43b -//.word 0x33f328df -//.word 0xa7b7b8d4 -//.word 0x19b027c0 -//.word 0xe5d65499 -//.word 0x7de7dc16 -//.word 0x0b71e063 -//.word 0x582c0819 -//.word 0xec8ec76d -//.word 0x779ae1a8 -//.word 0x6ff92bd7 -//.word 0xfb4b92c3 -//.word 0x10bf5f23 -//.word 0xd9e1ba11 -//.word 0x5db46cbb -//.word 0x5c01e95b -//.word 0x79ee8d69 -//.word 0x9fd2260e -//.word 0x9d48b3dd -//.word 0x13836bbe -//.word 0x92e1012a -//.word 0xffc2279e -//.word 0x389a5149 -//.word 0xfa45bb08 -//.word 0x039bad95 -//.word 0x7345fefc -//.word 0x78cfd74e -//.word 0x2afdb998 -//.word 0xb463c116 -//.word 0xb5302ba5 -//.word 0xe64b1677 -//.word 0xfca1860a -//.word 0xd0bdaf5b -//.word 0xbd997157 -//.word 0x49b31f92 -//.word 0x0864843b -//.word 0xbe6d2850 -//.word 0xc4d3cf0e -//.word 0xadee43ac -//.word 0x28bc5348 -//.word 0x287b1c22 -//.word 0x43768708 -//.word 0x581f1311 -//.word 0x755ed58e -//.word 0xf829bd3e -//.word 0xf4551ac1 -//.word 0xd6ab604f -//.word 0x483f29aa -//.word 0x55fd7b51 -//.word 0xce8549f7 -//.word 0xed393c33 -//.word 0x3993b379 -//.word 0xa9bd0849 -//.word 0x0c5b15a6 -//.word 0xa8abf6ca -//.word 0x22d11118 -//.word 0x9e6c5452 -//.word 0x266dbe0c -//.word 0x50292161 -//.word 0x1bad26e4 -//.word 0x1b5191d9 -//.word 0xd690c6a6 -//.word 0x6d168c84 -//.word 0x7f1b127a -//.word 0x4af0308c -//.word 0x13d7ee30 -//.word 0xc8184a01 -//.word 0xe55136b7 -//.word 0x940ee157 -//.word 0x189937a7 -//.word 0x6b14abe5 -//.word 0x26c434b8 -//.word 0xa2b09567 -//.word 0x5d6be249 -//.word 0x9f2e407d -//.word 0x5d29ecda -//.word 0x5d1b7f29 -//.word 0x9b217092 -//.word 0xeccbda55 -//.word 0xe1757fbb -//.word 0xeed50e4b -//.word 0xcbd0a140 -//.word 0x1b928a3b -//.word 0x4cdd4f36 -//.word 0xbea1f3b9 -//.word 0x27ce7750 -//.word 0x3666a13c -//.word 0x76d6fc69 -//.word 0x768620a0 -//.word 0x27af33fe -//.word 0x856db0a5 -//.word 0x791567b1 -//.word 0xfec8c66e -//.word 0x844856c8 -//.word 0x910b8802 -//.word 0xae8eb2ab -//.word 0x81ec55ce -//.word 0x37afa16a -//.word 0x25e63b21 -//.word 0xae783d34 -//.word 0x67b77faf -//.word 0x793815e1 -//.word 0x47e3180f -//.word 0x5146aa6a -//.word 0x582e343d -//.word 0xc479f26b -//.word 0x4226b219 -//.word 0xb1aed8a8 -//.word 0x3f97a6e6 -//.word 0xcf46ba85 -//.word 0x9f15d8cc -//.word 0x27a5ea8c -//.word 0x44764556 -//.word 0x95b42eeb -//.word 0x25549df4 -//.word 0x4b6041f3 -//.word 0xcf8fc37a -//.word 0x4e194f9b -//.word 0xe0c9519f -//.word 0xf7547cfa -//.word 0x8be9117f -//.word 0x74095ed1 -//.word 0x1799851a -//.word 0x44367eff -//.word 0x5fc85fd3 -//.word 0xbe5adb0a -//.word 0x532909f1 -//.word 0x8bfa679d -//.word 0x75b11f21 -//.word 0x27208905 -//.word 0x5e1df0f3 -//.word 0x64d799b2 -//.word 0x376a0159 -//.word 0xe7b067bc -//.word 0x405a8a2b -//.word 0xa940b45c -//.word 0x4cf6f7a5 -//.word 0x77a0b76e -//.word 0x420769e7 -//.word 0x73ec99f6 -//.word 0x9e9c3274 -//.word 0x91c4fa98 -//.word 0xef875cb3 -//.word 0x1ace6a1e -//.word 0x56df2271 -//.word 0x2c32f0f6 -//.word 0x0d7f755e -//.word 0x381c87b2 -//.word 0xde86798c -//.word 0x833e9c86 -//.word 0xa7d605f3 -//.word 0xa64b91cd -//.word 0xdd9527ef -//.word 0x0e7d3d84 -//.word 0x05af9ec0 -//.word 0x7c106ace -//.word 0x3d515e09 -//.word 0x86c5556e -//.word 0xb16f0f51 -//.word 0x14603250 -//.word 0x27408e86 -//.word 0xe42aa501 -//.word 0x74bd6b75 -//.word 0x076f4a31 -//.word 0x04256953 -//.word 0x62012e38 -//.word 0x557b0237 -//.word 0x2eb4548f -//.word 0x7c06e09d -//.word 0x78e03153 -//.word 0xa0d164e5 -//.word 0xa1e230c5 -//.word 0x7a2923d2 -//.word 0xdf9b2ecd -//.word 0xdb22640c -//.word 0xbaf0ff72 -//.word 0x2612a49e -//.word 0x9048e863 -//.word 0xd2141278 -//.word 0x12112271 -//.word 0xe98613ee -//.word 0xc43b5e13 -//.word 0x8b8bbf38 -//.word 0x81bb3be1 -//.word 0x6c8a62f0 -//.word 0xf509d219 -//.word 0x51adfc97 -//.word 0x21a32b1d -//.word 0x9763c210 -//.word 0xdb88c4f3 -//.word 0xaddf9a23 -//.word 0x4bbe11c4 -//.word 0x9597a3fb -//.word 0x6fccf75d -//.word 0x67c5aba8 -//.word 0x984150b1 -//.word 0xcde9b69e -//.word 0xea2b6a55 -//.word 0x88457e35 -//.word 0xe0a08803 -//.word 0xea60ed27 -//.word 0xc6396018 -//.word 0x5a84a515 -//.word 0x3d929b16 -//.word 0xd3407902 -//.word 0xbacb5822 -//.word 0x65e6f2d6 -//.word 0x070aa986 -//.word 0xb30ecbdc -//.word 0xc1f71430 -//.word 0x73117444 -//.word 0xd93f1332 -//.word 0xf18f93a2 -//.word 0x13119540 -//.word 0x8cea7e6e -//.word 0x8aa47b35 -//.word 0x38c8c282 -//.word 0x29af1b8f -//.word 0xfa959f9f -//.word 0x33efc0ee -//.word 0x6ffe8ae8 -//.word 0xbda52999 -//.word 0x4578aa65 -//.word 0x2f1506f9 -//.word 0xc0b75c81 -//.word 0xc6087e1b -//.word 0x3737af8c -//.word 0x154bab33 -//.word 0x94b7e83b -//.word 0x7f2e1c14 -//.word 0xd8b8ff23 -//.word 0xbf0652b8 -//.word 0x94022041 -//.word 0x60ab44be -//.word 0x71202b75 -//.word 0x45fadbe7 -//.word 0xaadf3402 -//.word 0x22557698 -//.word 0x8cd30410 -//.word 0x011e685c -//.word 0xfdd3962b -//.word 0xbf3f755f -//.word 0xf2779bc1 -//.word 0x8ca558f3 -//.word 0xf7a1f7a7 -//.word 0x6fc1400f -//.word 0xabf14294 -//.word 0xbf064fcb -//.word 0x414f47a5 -//.word 0xaa6d1ae6 -//.word 0x006588d8 -//.word 0xb2f42b40 -//.word 0xc423b891 -//.word 0x2b1a8260 -//.word 0x7b393f18 -//.word 0xbf650fef -//.word 0xa8a0ba18 -//.word 0xebdd393a -//.word 0xe4127922 -//.word 0x7f8e5bb5 -//.word 0x588dff28 -//.word 0x210a4273 -//.word 0x45d48502 -//.word 0xcae4b1ae -//.word 0x7cee77ed -//.word 0x4836dd45 -//.word 0xe6a5f607 -//.word 0xbb1cf039 -//.word 0xfd0855d4 -//.word 0x18378a30 -//.word 0x50ea9cbc -//.word 0xa82b3bf2 -//.word 0x0360078a -//.word 0x8a210bee -//.word 0x4d4787ef -//.word 0x2d45f3b6 -//.word 0xf9bc40fd -//.word 0xd749617f -//.word 0xe6a20aac -//.word 0x21e1b8a2 -//.word 0x871ff159 -//.word 0x7945cd1d -//.word 0x631fb542 -//.word 0x9eb26b13 -//.word 0x95d04a0b -//.word 0x27e9d048 -//.word 0x4d24593c -//.word 0xfdae2da6 -//.word 0x4e52bdc0 -//.word 0xdc4b2aba -//.word 0x6e560768 -//.word 0xd60b6038 -//.word 0x196cfb66 -//.word 0xd0bfdd73 -//.word 0xce9910d3 -//.word 0x033ca4e6 -//.word 0xa022f429 -//.word 0x7cda2bae -//.word 0xb71306c9 -//.word 0x9df7db0d -//.word 0xcdbada76 -//.word 0x9a7293e8 -//.word 0xb129b8d8 -//.word 0xfc302449 -//.word 0xc7b71dfb -//.word 0x229bd6df -//.word 0x867f38cd -//.word 0xbb1ee279 -//.word 0xf8df6fa4 -//.word 0x4dabf78f -//.word 0x3efbd8b5 -//.word 0xb135b6b9 -//.word 0x0a38c09e -//.word 0x94353536 -//.word 0x23c227dd -//.word 0xf7298067 -//.word 0xe4064256 -//.word 0xb0111350 -//.word 0xbd38f8d1 -//.word 0xe7f1611e -//.word 0xb0ce667a -//.word 0x9b51509b -//.word 0xd5035b5f -//.word 0x1ac0babc -//.word 0xd755dcf5 -//.word 0x8c4dee14 -//.word 0x7507a194 -//.word 0x690c2d5e -//.word 0x02a096f7 -//.word 0xfe972df7 -//.word 0xe56a5bbd -//.word 0xec8a9a61 -//.word 0x1af4c4ea -//.word 0xa90690c1 -//.word 0xaf915966 -//.word 0xfe2f2262 -//.word 0x48d7d87d -//.word 0x87aed630 -//.word 0x9b20af5d -//.word 0x3530273e -//.word 0xf50c829c -//.word 0xcfe50241 -//.word 0xb3fdabaf -//.word 0x6d024912 -//.word 0xca9ab474 -//.word 0xfc3f5330 -//.word 0x3f4ddfa9 -//.word 0xbd59693b -//.word 0xafc59f72 -//.word 0xc6914b7a -//.word 0xc9741cd7 -//.word 0x7f2ca956 -//.word 0xcf12b344 -//.word 0x26f1aadd -//.word 0x19187307 -//.word 0x4cae6941 -//.word 0x9246a2d6 -//.word 0x55b37356 -//.word 0x391e3646 -//.word 0xfc564a17 -//.word 0xa1665c55 -//.word 0xcd6de521 -//.word 0x71aaf4e1 -//.word 0xa9d72e36 -//.word 0xe4b8132f -//.word 0x46f383bc -//.word 0x4a228065 -//.word 0xac27353b -//.word 0x86bf370f -//.word 0xb95b0ce3 -//.word 0x8e2bea9e -//.word 0x9d7bc004 -//.word 0xee427be4 -//.word 0x5ff88293 -//.word 0x45a9829a -//.word 0x564871ac -//.word 0xc745cddb -//.word 0xb161250b -//.word 0xb9c2dba6 -//.word 0xf0422891 -//.word 0xf80d605f -//.word 0x696b78c5 -//.word 0x72dac54e -//.word 0xc4600650 -//.word 0xab1fa51f -//.word 0x7e2a3a80 -//.word 0x3a975161 -//.word 0x6ad66dc7 -//.word 0x4a414d07 -//.word 0x2bf36d39 -//.word 0x19ded0ea -//.word 0xbc18fd11 -//.word 0x7c764844 -//.word 0xe85c522c -//.word 0x59d3d337 -//.word 0xd2dc978c -//.word 0x2b05c744 -//.word 0x6f396ad7 -//.word 0x82dc2bd4 -//.word 0x07185dd6 -//.word 0x80713cb3 -//.word 0xb7a076f6 -//.word 0x5e9eea90 -//.word 0xf2ffafca -//.word 0xe581587e -//.word 0xfbe57687 -//.word 0xf5fd5f76 -//.word 0x6d072e86 -//.word 0x01390bd3 -//.word 0xb39dadc6 -//.word 0x901f1cd4 -//.word 0x90e5bc68 -//.word 0xbede871d -//.word 0x989e9a31 -//.word 0xb969f337 -//.word 0xb58d790b -//.word 0x45f53c0b -//.word 0xa4fcff84 -//.word 0x387ff46b -//.word 0x7536c64e -//.word 0xff44dc89 -//.word 0x0e0cddbd -//.word 0x17476f7e -//.word 0xa953454c -//.word 0x95ce58c5 -//.word 0x51647418 -//.word 0x9ee5f7bd -//.word 0x699bd664 -//.word 0xefdae02b -//.word 0x25d84713 -//.word 0x57bf5cb5 -//.word 0x0f019a31 -//.word 0x38ece668 -//.word 0x837e156b -//.word 0x0a7aaf32 -//.word 0x34bbf292 -//.word 0xd8c91a69 -//.word 0xa5aae01c -//.word 0xc1fb4143 -//.word 0xb03f80a2 -//.word 0x78766e5c -//.word 0x02f2e963 -//.word 0xc466a333 -//.word 0x9d4025c0 -//.word 0x003813ac -//.word 0x5529b1be -//.word 0x9c20a690 -//.word 0x54b30087 -//.word 0x9b957908 -//.word 0x9667f8e9 -//.word 0x13d05b26 -//.word 0x6dcf74d6 -//.word 0xb050515d -//.word 0xfefec1e2 -//.word 0x32591304 -//.word 0xc20821c8 -//.word 0xea708ed6 -//.word 0x07854be6 -//.word 0x41e06075 -//.word 0x6c13e9bc -//.word 0x30395ee2 -//.word 0x68d11871 -//.word 0xc9cc1107 -//.word 0xc4e4ec4e -//.word 0xad30352d -//.word 0x1cf5e940 -//.word 0x94c03986 -//.word 0x62b18b5a -//.word 0xc81ac2a5 -//.word 0x5b49bf51 -//.word 0xaaa12701 -//.word 0x20f067ff -//.word 0x2cfcf675 -//.word 0x9e5fdae1 -//.word 0x55956ec3 -//.word 0x17546298 -//.word 0xc01b030c -//.word 0x9f0ebd6c -//.word 0x1d01de5a -//.word 0x9fd39cc4 -//.word 0xaefd5a17 -//.word 0x566a27af -//.word 0xcb8a8893 -//.word 0x53a2775f -//.word 0x5f66ab81 -//.word 0xfbc91aa8 -//.word 0x6914bd7a -//.word 0x09359386 -//.word 0x7d5ae879 -//.word 0x09bfd794 -//.word 0x40c40e5d -//.word 0xdd43d195 -//.word 0xef20426b -//.word 0x3922dfef -//.word 0xd8014cc9 -//.word 0x26c0532b -//.word 0xdf3c2904 -//.word 0x8206f277 -//.word 0xfa6e888b -//.word 0x7ee07824 -//.word 0xb6744e32 -//.word 0x1fc01328 -//.word 0xb0f113b0 -//.word 0xbe1ae49c -//.word 0x1dcba320 -//.word 0x88e6813f -//.word 0x42ae7e84 -//.word 0xfe2175f2 -//.word 0xfd88593d -//.word 0x764cbe3b -//.word 0x3a0b9b95 -//.word 0x98eb4ec2 -//.word 0x7e2ee036 -//.word 0xe2078bd6 -//.word 0x60ac79b0 -//.word 0x25adcfe9 -//.word 0x0b84eaf6 -//.word 0x056de80f -//.word 0xbe786be1 -//.word 0x7ddc9984 -//.word 0x4c8e68ac -//.word 0x59121823 -//.word 0x9c920177 -//.word 0xba2d8ef0 -//.word 0x2a918ac4 -//.word 0x96cc9a8e -//.word 0x845f0bfd -//.word 0x3594cec9 -//.word 0xcd12c1ec -//.word 0xb5af310e -//.word 0x3e859c41 -//.word 0x8748bbee -//.word 0xa0d7bf0f -//.word 0xef10dc9f -//.word 0xd3e9044f -//.word 0x88bcf57b -//.word 0x4be3755c -//.word 0xbe85dc7f -//.word 0x8dafd476 -//.word 0x52a75dcd -//.word 0xb67d1440 -//.word 0xd9e2b42a -//.word 0xf53ddd41 -//.word 0x3efc1481 -//.word 0x0c280c66 -//.word 0x3b3d235e -//.word 0xd238307e -//.word 0xe4f17c74 -//.word 0xb4ab0ebd -//.word 0x1cea2c18 -//.word 0x30851e3a -//.word 0x1efb35c3 -//.word 0x590a0c71 -//.word 0xf67e0e93 -//.word 0x564838c1 -//.word 0x05cf20cb -//.word 0xe28b37ef -//.word 0x80cf4b4f -//.word 0xcde650a2 -//.word 0xf1625f29 -//.word 0x79b1ffe4 -//.word 0xb5f1a407 -//.word 0x5e0575a8 -//.word 0x7ce952ba -//.word 0x8742163e -//.word 0xcd3a19b8 -//.word 0x138afae0 -//.word 0x7fd89b9b -//.word 0xb6446c29 -//.word 0x413eeda0 -//.word 0x359a6e99 -//.word 0x13e61929 -//.word 0xedfb3313 -//.word 0xcad29f3b -//.word 0x4c99a45e -//.word 0x9006f001 -//.word 0x56ecdca7 -//.word 0x620cf147 -//.word 0x222dabfd -//.word 0x906f7e00 -//.word 0x5adc17d4 -//.word 0x4040e4c1 -//.word 0xbe3ad683 -//.word 0xec946643 -//.word 0xa2d0d6c6 -//.word 0xdf03b9e5 -//.word 0x6ce7b53d -//.word 0xbc2b8827 -//.word 0x170d49eb -//.word 0xf82bf030 -//.word 0xb39619b7 -//.word 0x5a290549 -//.word 0xe219e2ee -//.word 0x82cc4c60 -//.word 0x5cef13bf -//.word 0x5fc33f86 -//.word 0x6cb751be -//.word 0xb73ccc72 -//.word 0x71d5f462 -//.word 0xa46dd6fb -//.word 0x5eee8887 -//.word 0x110fb2a2 -//.word 0x3a6e4ded -//.word 0x41deab06 -//.word 0xa002b8b7 -//.word 0x481b7f6d -//.word 0x401ef0ec -//.word 0x900ae042 -//.word 0x5d7851f9 -//.word 0x5573f491 -//.word 0x4e8bec2e -//.word 0x2925d58d -//.word 0xfd15053c -//.word 0x726f110b -//.word 0x6a9993be -//.word 0xe7a52b04 -//.word 0x29dec4ad -//.word 0x16a11917 -//.word 0xdf6f77e9 -//.word 0xe13fc404 -//.word 0xc919c0b7 -//.word 0xfce08b32 -//.word 0x3670683e -//.word 0x70e9c02b -//.word 0x08496a09 -//.word 0x1c41291b -//.word 0x36417688 -//.word 0x2fd68054 -//.word 0x4d35728f -//.word 0xaf18f4cc -//.word 0xebc8f4d5 -//.word 0xf57ba69d -//.word 0x43e1c976 -//.word 0x2efa2d84 -//.word 0x9c2a7272 -//.word 0xdc8f1263 -//.word 0xd192a22c -//.word 0x53bc54c0 -//.word 0xd2ccc1eb -//.word 0x3c06e544 -//.word 0x21cd6b5d -//.word 0x16742b3c -//.word 0x5752f20f -//.word 0xb014811b -//.word 0x9d57d8f6 -//.word 0xb077b4f6 -//.word 0x33a156e9 -//.word 0x0f308606 -//.word 0xec36d824 -//.word 0x9a582e2a -//.word 0xafe07ec7 -//.word 0x720dd563 -//.word 0xf8ad9c55 -//.word 0x8dee1b56 -//.word 0x56723b35 -//.word 0x34a190cd -//.word 0xea439635 -//.word 0x834e3b36 -//.word 0xeefc9e02 -//.word 0xec211722 -//.word 0x2cbc77b1 -//.word 0xb3cc91c8 -//.word 0x8265f939 -//.word 0x73020b80 -//.word 0x651d2ff6 -//.word 0x98fd5c48 -//.word 0x5ad0db28 -//.word 0xe4f94e42 -//.word 0x7fabf072 -//.word 0xebb71e34 -//.word 0x00a2175c -//.word 0x96fb0007 -//.word 0xa3eb2bd1 -//.word 0xa30e9848 -//.word 0x3d81bca1 -//.word 0x233d82aa -//.word 0x3aa39000 -//.word 0xfb57cb82 -//.word 0x19521d05 -//.word 0x6333764a -//.word 0xedd6102d -//.word 0x6a28f81e -//.word 0xdd3acad5 -//.word 0x7194bb42 -//.word 0xa4cbddc3 -//.word 0xab569f9a -//.word 0x129d939e -//.word 0xa4537530 -//.word 0x8a066871 -//.word 0xb7f482b3 -//.word 0x83218b2d -//.word 0x95a602f2 -//.word 0x074c6124 -//.word 0xc559a364 -//.word 0x36aa028e -//.word 0x1f0205a3 -//.word 0xc4a2ba07 -//.word 0x501a40ed -//.word 0x765e890f -//.word 0x591c5ea2 -//.word 0xa94da489 -//.word 0x0f0bddc9 -//.word 0xcca2f23d -//.word 0x9de92f8b -//.word 0xe1d38f56 -//.word 0xfd413ab5 -//.word 0x001a4ce4 -//.word 0x839ed83a -//.word 0xd4f72d5b -//.word 0x531157af -//.word 0x1bace913 -//.word 0xe5b0face -//.word 0x2ac06ec6 -//.word 0x881177f4 -//.word 0x677d5a15 -//.word 0xdcd377a2 -//.word 0xce728403 -//.word 0x57161900 -//.word 0x6cf17178 -//.word 0xc1fe6f55 -//.word 0xe792dfbf -//.word 0xb734ff90 -//.word 0xf4ae3d08 -//.word 0x2c6443c3 -//.word 0xdfe531e7 -//.word 0xe4c029a2 -//.word 0x079911d4 -//.word 0xf77b9408 -//.word 0x60706aa9 -//.word 0x544fda73 -//.word 0xefd67d27 -//.word 0x3bf84483 -//.word 0x5178bc71 -//.word 0xc1b7917f -//.word 0x34cb528f -//.word 0x50d073cf -//.word 0xdc8398ec -//.word 0x250d1183 -//.word 0xa01ca0d9 -//.word 0xd03883cb -//.word 0x6a55ae08 -//.word 0xb8a4597d -//.word 0x3bafba11 -//.word 0x94a51493 -//.word 0xa5f2f0f0 -//.word 0xf313aaaa -//.word 0x4ea93085 -//.word 0xb5cc0784 -//.word 0x74a18f13 -//.word 0x8f2f8786 -//.word 0x636ed3c2 -//.word 0x8ba17d3a -//.word 0x01e6fb1e -//.word 0x850cb0ce -//.word 0x43a4b595 -//.word 0xb05bd894 -//.word 0xb587e5fc -//.word 0x0fff2581 -//.word 0xf630250b -//.word 0xfc6db8ae -//.word 0x39873fdc -//.word 0xa59e28d9 -//.word 0xc536b570 -//.word 0x8a8dffe5 -//.word 0x762d3a2a -//.word 0x00bd3a55 -//.word 0x3a1c3652 -//.word 0xb1b1cdd5 -//.word 0x94fc4693 -//.word 0x19711cb2 -//.word 0x1d87ba7e -//.word 0x0b0c835d -//.word 0xfebb1505 -//.word 0x2a10cfec -//.word 0x785b9100 -//.word 0x7014c299 -//.word 0x5c6e98ac -//.word 0xaa2e9341 -//.word 0x93be4b27 -//.word 0xfa7d6ce6 -//.word 0x975afff5 -//.word 0x54a1eb2d -//.word 0xf714bb7e -//.word 0x023ea1e1 -//.word 0xd704bb8d -//.word 0x207d966e -//.word 0x6e04f1d3 -//.word 0x208bc367 -//.word 0x87327f62 -//.word 0x48189600 -//.word 0x01703d33 -//.word 0x2fd87294 -//.word 0x4fe739a0 -//.word 0x43052c21 -//.word 0xf88032ea -//.word 0x46dc8fc7 -//.word 0x176a1db4 -//.word 0xcc1cd84d -//.word 0xdc97a086 -//.word 0xbe8a3b9c -//.word 0x0a3e9a4c -//.word 0xdb6f5d42 -//.word 0x775b99d4 -//.word 0x3218d8f0 -//.word 0x8f2a6153 -//.word 0xa955bafc -//.word 0xd1b06ce1 -//.word 0x79fb06e0 -//.word 0x513264f8 -//.word 0xaf6231b9 -//.word 0x34bcabf9 -//.word 0xade8a6c9 -//.word 0x379cd4a8 -//.word 0xa76c43f6 -//.word 0x28e427ab -//.word 0x26d4da48 -//.word 0x6beb210e -//.word 0x8887b16e -//.word 0x77ccf2c2 -//.word 0x7ef4023a -//.word 0x56e5fd19 -//.word 0x8d097c21 -//.word 0x295a5b4b -//.word 0x8ebcc0bc -//.word 0xa29058f5 -//.word 0x2e86e44a -//.word 0x88b2f595 -//.word 0x6fe3f32b -//.word 0x3630640f -//.word 0x25d36b66 -//.word 0x1c3b8f2b -//.word 0x795cbe24 -//.word 0x3c4a9215 -//.word 0x6906d333 -//.word 0xae973cdb -//.word 0x465d8284 -//.word 0x1da392f3 -//.word 0x35731aae -//.word 0x48ae4cb2 -//.word 0xaf5cdf68 -//.word 0x824056d6 -//.word 0x01af8412 -//.word 0x32a350fd -//.word 0xcc0cb62d -//.word 0x54660e2b -//.word 0x869091df -//.word 0xf6dc1948 -//.word 0xf7632871 -//.word 0xbc9b2ca0 -//.word 0xbd2b01d0 -//.word 0x5cfdb861 -//.word 0xc995970f -//.word 0x23a26021 -//.word 0xe0d3d7e2 -//.word 0x6eec7e55 -//.word 0x1a19a325 -//.word 0x32829cdb -//.word 0x661f5253 -//.word 0x74cefc71 -//.word 0x05a32d10 -//.word 0xd17f113b -//.word 0x0ae4f3a0 -//.word 0xf8070341 -//.word 0xe127576d -//.word 0x2b1e2fef -//.word 0xc4367d85 -//.word 0xc23da594 -//.word 0x47dc8119 -//.word 0xa824a8e3 -//.word 0xce6af000 -//.word 0xdc553175 -//.word 0x11354c32 -//.word 0xf1966c44 -//.word 0x9f168c4d -//.word 0x8e733a31 -//.word 0x58e89a13 -//.word 0xeebaad80 -//.word 0xf20ed3e9 -//.word 0x61fd8f57 -//.word 0x75ea8b5a -//.word 0xca13dc42 -//.word 0xbf678692 -//.word 0x1f9843b2 -//.word 0x017080e4 -//.word 0xec68a979 -//.word 0x3f77a645 -//.word 0xd028a650 -//.word 0xd4ef1bce -//.word 0xffbd0552 -//.word 0xecd2743e -//.word 0xbed3487e -//.word 0x081c3c76 -//.word 0xea572338 -//.word 0x7d4d71fb -//.word 0x71fdfcc9 -//.word 0xf5eb0477 -//.word 0xd7bb71da -//.word 0xedfe5d38 -//.word 0xb34cd2fd -//.word 0x3593d5af -//.word 0x30aea324 -//.word 0x743a3af3 -//.word 0x8ca51b28 -//.word 0xa1874f3c -//.word 0x9c36a844 -//.word 0x8b954968 -//.word 0x462c6897 -//.word 0x527e5379 -//.word 0x0596b1a5 -//.word 0xebe40b15 -//.word 0x69478bd6 -//.word 0xa06b0304 -//.word 0x945530f6 -//.word 0x8e3c41b6 -//.word 0xbf9b93b4 -//.word 0x2584bfbb -//.word 0xb337d623 -//.word 0xacf3eb49 -//.word 0x500cd23c -//.word 0xba3e28b9 -//.word 0x0941935a -//.word 0xbe9d4b0a -//.word 0x65c0dabc -//.word 0x784e205d -//.word 0x80b89906 -//.word 0x7d10e377 -//.word 0x881c7ac1 -//.word 0xb7a9c742 -//.word 0x412159d6 -//.word 0xe260724c -//.word 0x81c4c517 -//.word 0x11837e46 -//.word 0xb54283b7 -//.word 0x27e3f987 -//.word 0x5a9e0bcc -//.word 0x5e53e687 -//.word 0x851e08d4 -//.word 0xc42dbb64 -//.word 0x5bcedc2d -//.word 0xb8cce160 -//.word 0x99fc1b9c -//.word 0x72133761 -//.word 0x0eba0bc7 -//.word 0x78e59070 -//.word 0x1c602abb -//.word 0x2aaa303a -//.word 0x3b07a867 -//.word 0x37d15292 -//.word 0x760fe91e -//.word 0x2549a5ed -//.word 0xec9a0419 -//.word 0xcd06cae5 -//.word 0x500e46f3 -//.word 0xdd82d8b7 -//.word 0x6997b02b -//.word 0x5539d8c4 -//.word 0x92a275a5 -//.word 0x0a2c4a14 -//.word 0x3b637d2a -//.word 0x255f9ece -//.word 0x6751e5e4 -//.word 0xa55bbbc1 -//.word 0x2ca57ce2 -//.word 0xd9ad7cde -//.word 0x37de489a -//.word 0xe7652ebc -//.word 0x4540ff62 -//.word 0x48971313 -//.word 0xaa508ef6 -//.word 0x49dee241 -//.word 0xce5995f5 -//.word 0x8cd445c9 -//.word 0xabebe963 -//.word 0x859b59ce -//.word 0x50571129 -//.word 0xfe57319c -//.word 0x6134c991 -//.word 0x93b25420 -//.word 0x95dc82ca -//.word 0x36573b6b -//.word 0x36f0e06a -//.word 0xac77d433 -//.word 0xa5d03be7 -//.word 0x0e470151 -//.word 0xd4241e1d -//.word 0x497f1944 -//.word 0xca56cbcb -//.word 0x9fdd66ad -//.word 0x2215b616 -//.word 0x23a0a6d1 -//.word 0x8cd40504 -//.word 0x410e8a1b -//.word 0x4a491602 -//.word 0x34ef3a97 -//.word 0xb4eef95f -//.word 0x8e0fcf77 -//.word 0xb584f2ce -//.word 0xb4bfd792 -//.word 0x4c8bf8e8 -//.word 0x5f55d5e0 -//.word 0x0dca38a8 -//.word 0x1ca8be00 -//.word 0x9dcd93ed -//.word 0xcc957db2 -//.word 0x39621cfc -//.word 0x257c705d -//.word 0x2f1c9bfb -//.word 0x30c3e88a -//.word 0x63d00d77 -//.word 0xc952ad66 -//.word 0xcb1b21df -//.word 0x22167844 -//.word 0xf4dabc07 -//.word 0x3f7e7719 -//.word 0x7baf76a6 -//.word 0x7b01cdff -//.word 0x95831cd8 -//.word 0x029610b3 -//.word 0x87ff2c9c -//.word 0x553ac917 -//.word 0x2f115b57 -//.word 0xca6ef7b0 -//.word 0x796e124f -//.word 0x0ab68c29 -//.word 0xea0aed31 -//.word 0x901ceece -//.word 0x19a13b8c -//.word 0x30aa7712 -//.word 0x31328054 -//.word 0x8ef3f509 -//.word 0x717ff660 -//.word 0xa38b2bee -//.word 0xac8e08eb -//.word 0x3c8b4f9f -//.word 0xc92ad617 -//.word 0x7a0e8a1c -//.word 0x4463b466 -//.word 0x53b67b0c -//.word 0xab0aaa3f -//.word 0x0f28b438 -//.word 0x2136f66f -//.word 0xcc8b3b0e -//.word 0xdfc285a5 -//.word 0xfa0d0b1f -//.word 0xaecc7ef5 -//.word 0xe05f90a1 -//.word 0x6e38b756 -//.word 0x16342eee -//.word 0x932b3e24 -//.word 0x08c6bb03 -//.word 0xa290d19e -//.word 0x79500102 -//.word 0xb8976669 -//.word 0xfe953db0 -//.word 0x0430a40b -//.word 0x7f58a2f8 -//.word 0x48946871 -//.word 0xbae1d666 -//.word 0x5bbd416a -//.word 0xbf7f74ad -//.word 0xaae9f42a -//.word 0x75008921 -//.word 0xb31bf9c8 -//.word 0x143b173e -//.word 0x899afcc0 -//.word 0xa887951f -//.word 0x53705e71 -//.word 0x94416c07 -//.word 0xccedb1a0 -//.word 0x0d497cdc -//.word 0xc4213ff4 -//.word 0x9b8695a7 -//.word 0x9d658378 -//.word 0x9b5efe16 -//.word 0xcfd2ae1c -//.word 0xc03ef2fa -//.word 0x65c82433 -//.word 0x8d181eca -//.word 0x7f69fdf6 -//.word 0xdde0251d -//.word 0xce1c8500 -//.word 0x5b0e1c34 -//.word 0x1a0bbbd1 -//.word 0x0a1f0d6e -//.word 0xbfa5d64c -//.word 0xbf1478d1 -//.word 0x2b1cbb38 -//.word 0xa2f2cd88 -//.word 0x62e888c2 -//.word 0xb040f45f -//.word 0x7b420df9 -//.word 0x3c8cc649 -//.word 0x20aa4d51 -//.word 0x69e691da -//.word 0x11610221 -//.word 0xb16397ce -//.word 0xa2f01625 -//.word 0x629c9080 -//.word 0x39a02afd -//.word 0x1c2c2474 -//.word 0xd1ff13ac -//.word 0x543671ce -//.word 0x7a615819 -//.word 0xd4dc8bd8 -//.word 0xd65db691 -//.word 0x38c9f780 -//.word 0x9d4c9c43 -//.word 0x73a82fd7 -//.word 0x1acdb0c3 -//.word 0x48ab2193 -//.word 0xac444888 -//.word 0xd105b08e -//.word 0x4656f16e -//.word 0xfc703145 -//.word 0xef6eeb35 -//.word 0x08a7ef5a -//.word 0x423caa00 -//.word 0x0deda813 -//.word 0xf03157d6 -//.word 0x71850ed8 -//.word 0x39044d25 -//.word 0x743847b9 -//.word 0x77309d3a -//.word 0xa5d26de6 -//.word 0x93738bca -//.word 0x6aa50e34 -//.word 0x8d500f6c -//.word 0x7c05ad9f -//.word 0xf98e541c -//.word 0x69ca40c3 -//.word 0x7cb83cb9 -//.word 0x10d1b061 -//.word 0x539bda88 -//.word 0x287b5ce0 -//.word 0xcdcaf7b0 -//.word 0xba2c96c9 -//.word 0xcc1d8ebc -//.word 0xa2cd244a -//.word 0x482e501c -//.word 0x124bc0b5 -//.word 0xcbdb20a4 -//.word 0x0f1699fe -//.word 0xf6c7970b -//.word 0xf3a3d040 -//.word 0xfbd9826d -//.word 0xe9eafb38 -//.word 0x21bb5fca -//.word 0x73e9a6c8 -//.word 0x435ce485 -//.word 0xe71fcd76 -//.word 0x516e78e6 -//.word 0xee1163ea -//.word 0xcde9b898 -//.word 0x04c9ce74 -//.word 0x5087f32b -//.word 0xfb526984 -//.word 0x0345ae93 -//.word 0x783d0030 -//.word 0x26e821a7 -//.word 0x741f58b1 -//.word 0x8c76b8a3 -//.word 0xbc11a4e6 -//.word 0x1cb993a7 -//.word 0x722e11cf -//.word 0x52bf0736 -//.word 0x8a193b13 -//.word 0xbd5d1ab8 -//.word 0x4d75b67c -//.word 0x7ea70bf8 -//.word 0xd96a8676 -//.word 0xcf79c8a6 -//.word 0x9f27a793 -//.word 0x7af275d6 -//.word 0xe45a8509 -//.word 0x5df4ec7f -//.word 0x41ba8532 -//.word 0xeda538fd -//.word 0x237e7b0c -//.word 0xb0f11890 -//.word 0x4be331b7 -//.word 0xc10582db -//.word 0x4fa9e7fa -//.word 0x4fd51e66 -//.word 0x1896cdbd -//.word 0x1f97c71c -//.word 0x62f28b90 -//.word 0x06460ecd -//.word 0x3e0aba23 -//.word 0x7021b6ad -//.word 0x93ae68cc -//.word 0xdc2938d3 -//.word 0x99b39704 -//.word 0x5da640bc -//.word 0x5d71beea -//.word 0x1aa32fc5 -//.word 0x404547bf -//.word 0xce6d98b4 -//.word 0x78101068 -//.word 0x4a18c330 -//.word 0x8db6eaef -//.word 0xeefa2c44 -//.word 0xdda11d02 -//.word 0x342e05e1 -//.word 0x193ce273 -//.word 0x2512b059 -//.word 0xc678e7b6 -//.word 0xe1c946e4 -//.word 0xbc4acf66 -//.word 0x1cba131e -//.word 0xaa2aafc0 -//.word 0x9b0f1787 -//.word 0x90969227 -//.word 0xbb378602 -//.word 0x448df69e -//.word 0xeb654957 -//.word 0xee154d51 -//.word 0x2d0f7bb1 -//.word 0x8cb57d0d -//.word 0x996fed20 -//.word 0x6ffb60c3 -//.word 0xda05a319 -//.word 0xbbf84409 -//.word 0xae1354f1 -//.word 0xebbf6c98 -//.word 0x6a20ee65 -//.word 0x4bea8dcf -//.word 0x74761015 -//.word 0x7c15522f -//.word 0xc8a48e04 -//.word 0xf360d9dd -//.word 0x73fcf01a -//.word 0x7af13424 -//.word 0x1b16f3a2 -//.word 0xae70e9f0 -//.word 0x754b07cc -//.word 0x80897353 -//.word 0xcd3bcf2d -//.word 0xb46ebe04 -//.word 0x8247a43a -//.word 0x6553aedb -//.word 0x881813d0 -//.word 0x7ef09956 -//.word 0xe4175aaf -//.word 0x4202c817 -//.word 0x33f2effa -//.word 0xc6cafa64 -//.word 0x231df9b9 -//.word 0x728ce1a6 -//.word 0xf84fd457 -//.word 0x8311a3eb -//.word 0x09019225 -//.word 0x8c265b64 -//.word 0x40f275d5 -//.word 0xf01b95e7 -//.word 0x9ea676ff -//.word 0x6a45d66e -//.word 0xb5e2c1a0 -//.word 0x857c1195 -//.word 0x2b323695 -//.word 0x249d3320 -//.word 0x3e63e925 -//.word 0xfb099874 -//.word 0x3a09a374 -//.word 0x14259319 -//.word 0x05fa5f11 -//.word 0x4cd8eb3e -//.word 0x94d1ce69 -//.word 0xd3105835 -//.word 0x736dd451 -//.word 0xb03e0af2 -//.word 0x416f0881 -//.word 0x3ad52290 -//.word 0x31bf3813 -//.word 0x9fce37cd -//.word 0x8a07e208 -//.word 0x6127d389 -//.word 0x2836bcc3 -//.word 0xd45ff34b -//.word 0xf9ff2e8c -//.word 0xa2fc8bbc -//.word 0x8058d30f -//.word 0x4806ff2a -//.word 0x56fcfbda -//.word 0x9689ab06 -//.word 0xa4e92ce2 -//.word 0x32175c66 -//.word 0xabe29cff -//.word 0x1543d484 -//.word 0x3ceeb86b -//.word 0x0d274a3d -//.word 0x40d7a047 -//.word 0x3adfe893 -//.word 0x31aca916 -//.word 0x910b4c2b -//.word 0x9e3fda40 -//.word 0x5b5207cf -//.word 0xaba87091 -//.word 0xb7da21ee -//.word 0x8fc15ab7 -//.word 0x14d09317 -//.word 0x15a7bdc7 -//.word 0xb8e6cb82 -//.word 0x1c3f71b9 -//.word 0x3cd02b87 -//.word 0x17af82e7 -//.word 0x0ec68b25 -//.word 0x8de1b092 -//.word 0xed05b27c -//.word 0x9904ef5d -//.word 0x704ee153 -//.word 0x6b0ae8d0 -//.word 0x80654993 -//.word 0xc62a76d7 -//.word 0xd99490ca -//.word 0x80602a40 -//.word 0x8d2550a9 -//.word 0x05e8c740 -//.word 0x81eb9786 -//.word 0xd4c7c7ef -//.word 0xeeba68db -//.word 0x0142d5c7 -//.word 0xe2eb38c5 -//.word 0xb1655029 -//.word 0xbcd97286 -//.word 0xa17dced9 -//.word 0xb367f403 -//.word 0x9f9f977d -//.word 0x50779047 -//.word 0x0f1f2521 -//.word 0xef748cfe -//.word 0x6819abb6 -//.word 0x42c922fb -//.word 0xb4eb8b8e -//.word 0xce6700b2 -//.word 0x14b9dee2 -//.word 0x6c44c9bf -//.word 0x3ae8f14c -//.word 0xc9d6935d -//.word 0xeda3c24d -//.word 0xe69c67f0 -//.word 0x885a87c8 -//.word 0x9996c47c -//.word 0x7b3e2785 -//.word 0x0ac71c2b -//.word 0xc8c6beb0 -//.word 0x38ba55cb -//.word 0x872c1d58 -//.word 0x71fb4a4d -//.word 0x63f148f0 -//.word 0xdd994747 -//.word 0x1b55f7d0 -//.word 0xf4ab9073 -//.word 0x02e016b5 -//.word 0x03c8db2e -//.word 0x7fdc453d -//.word 0xac8dd1fa -//.word 0x8ed8586c -//.word 0x621b92fd -//.word 0x3d27d82a -//.word 0xf1962e7f -//.word 0x305f80c3 -//.word 0xf4a72c70 -//.word 0x1ddac166 -//.word 0x5cfb06df -//.word 0x51383fa6 -//.word 0xf0c2ab84 -//.word 0x29db51fb -//.word 0xc831fd37 -//.word 0x9a6a8542 -//.word 0xd1005077 -//.word 0xa94f1939 -//.word 0x4cecf1e5 -//.word 0xf3398304 -//.word 0x4f369cc6 -//.word 0x279aebac -//.word 0x42230584 -//.word 0x872aab9a -//.word 0x637a502d -//.word 0x6b62d620 -//.word 0x430999f2 -//.word 0xbe02aef0 -//.word 0x46206da9 -//.word 0x7f8c2ca3 -//.word 0x27144e4c -//.word 0x41c67d33 -//.word 0x72be3378 -//.word 0xab3c7f82 -//.word 0x08fa06ef -//.word 0xf8bc48d1 -//.word 0x9f282417 -//.word 0x78d89e49 -//.word 0x3faee179 -//.word 0x0e678076 -//.word 0xc6730142 -//.word 0xb0049cc6 -//.word 0x646640c5 -//.word 0xea8ed70f -//.word 0x20f5cbf7 -//.word 0x5ba7c906 -//.word 0x5196c5f1 -//.word 0x37353ec9 -//.word 0x2642c372 -//.word 0xc3e3b656 -//.word 0x1ff5505a -//.word 0xdca1e512 -//.word 0x92306930 -//.word 0x70203443 -//.word 0x2777029e -//.word 0x03573e95 -//.word 0x5bd380f0 -//.word 0x2c015499 -//.word 0x01503d98 -//.word 0x161cf941 -//.word 0xbc8007ac -//.word 0xff6c6766 -//.word 0x87f7a166 -//.word 0xbcf60843 -//.word 0x2ecd40a4 -//.word 0x3385fef7 -//.word 0xd21f0f66 -//.word 0xdf289c06 -//.word 0x688eac52 -//.word 0x50b2ead9 -//.word 0x3abea933 -//.word 0xa8392539 -//.word 0x64d90b76 -//.word 0x20983cd8 -//.word 0x5909ceab -//.word 0x81ed54c8 -//.word 0x5c02600a -//.word 0xab1b4602 -//.word 0x087522ec -//.word 0x11491ce1 -//.word 0xc89eea4e -//.word 0x3a6197a4 -//.word 0x5fb78351 -//.word 0x4292acf0 -//.word 0x61832bbc -//.word 0x57cf024b -//.word 0xb8c41479 -//.word 0x3d4d75a2 -//.word 0x21c5e414 -//.word 0xca0996c3 -//.word 0xacd1363f -//.word 0x6b4029e4 -//.word 0x3fb91650 -//.word 0x9df5a61b -//.word 0x145288c2 -//.word 0x756eb9e3 -//.word 0x36f502b0 -//.word 0x18b7c29e -//.word 0x08feed5d -//.word 0x431e550d -//.word 0xbe4d28af -//.word 0xc5b5bad9 -//.word 0xe2c885ae -//.word 0x00d46f0e -//.word 0xd0d74b0a -//.word 0x6c94a19b -//.word 0x3be6b293 -//.word 0x1455b7d3 -//.word 0xa6e76abf -//.word 0x1738c7ef -//.word 0xebcd1427 -//.word 0x28a61f8a -//.word 0xb712c70a -//.word 0x0ec8bd23 -//.word 0x0c328cc9 -//.word 0x240cd79f -//.word 0xbe2ee269 -//.word 0xdaa655c4 -//.word 0xf70a3c15 -//.word 0x330d51bf -//.word 0xb34f7e99 -//.word 0x457a9e9f -//.word 0x448a84e7 -//.word 0xbd6c3ed7 -//.word 0xcfcb9a96 -//.word 0x5827eac0 -//.word 0xce27055e -//.word 0x6a308e15 -//.word 0x8c36799d -//.word 0x5bd2ca75 -//.word 0xab95a0d5 -//.word 0x259d73e5 -//.word 0xa1659a2c -//.word 0xd7e1104b -//.word 0x37cb77eb -//.word 0x15385df4 -//.word 0x096ebfff -//.word 0x96f9cb0f -//.word 0x09fcea7b -//.word 0xa4c6fe2f -//.word 0xfca5e815 -//.word 0xa0ff4ecd -//.word 0xfb9e9ba4 -//.word 0x7c4c47c4 -//.word 0xf4a058a8 -//.word 0x3f1729d3 -//.word 0x26666ac2 -//.word 0x840f681f -//.word 0xa8338e37 -//.word 0xfba72cae -//.word 0xe24a7871 -//.word 0xe695d3ed -//.word 0x13734d7f -//.word 0x9d536a2b -//.word 0xca7c2790 -//.word 0x0ba1381b -//.word 0x6cb6947c -//.word 0x2f023356 -//.word 0xb474163b -//.word 0x9d3a89d7 -//.word 0x2f90a56b -//.word 0xfad6187e -//.word 0xbce629cf -//.word 0x83a4f68d -//.word 0x12d700ca -//.word 0x8637ea2e -//.word 0x39c67ee8 -//.word 0xe764f1ea -//.word 0x0f9e6856 -//.word 0x9cc8ba33 -//.word 0xc54b7865 -//.word 0x323f2bdc -//.word 0x603ddc0b -//.word 0x466eda9c -//.word 0x39e8b762 -//.word 0x0d3b948f -//.word 0x7d469e27 -//.word 0xcc50d9b4 -//.word 0xad541d3c -//.word 0x619b5e70 -//.word 0x1f903026 -//.word 0xb8d18909 -//.word 0x7b82c98f -//.word 0x56e6f92c -//.word 0x3f3050c6 -//.word 0xd296fc68 -//.word 0x3ca81f3a -//.word 0x57e017b1 -//.word 0x167a0203 -//.word 0x248581de -//.word 0xc83bbd59 -//.word 0x0c8ea82b -//.word 0x1e03861a -//.word 0xf6c3abb7 -//.word 0x39f08649 -//.word 0x5e358000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00010E10 -//// expected output -//.word 0xa4245a5f -//.word 0x76f62281 -//.word 0x13344929 -//.word 0xdb4ea364 -//.word 0x01f1b48e -//.word 0xcde3714e -//.word 0xa7e9f901 -//.word 0x32f08658 -//.word 0x457e3b90 -//.word 0xd935c5e4 -//.word 0x00da2367 -//.word 0x1ab42ca8 -//.word 0x36f0b070 -//.word 0x609d4dd9 -//.word 0x4480b245 -//.word 0x31026eff -//// SHA512LongMsgvector_87 -//// vector length -//.word 0x00011128 -//// input message -//.word 0xdde88aca -//.word 0x45102cd4 -//.word 0x960f969e -//.word 0x5b94ccee -//.word 0xd52a3a4f -//.word 0xf05f4959 -//.word 0x75262f32 -//.word 0x817b0b55 -//.word 0x36453192 -//.word 0xb080c256 -//.word 0x3b9b812d -//.word 0xc31fe185 -//.word 0x8c9263b5 -//.word 0x239b1e3e -//.word 0x94679f50 -//.word 0xdd4af490 -//.word 0xa3aa0418 -//.word 0x241922bf -//.word 0x6dc1e19b -//.word 0xcc0529c5 -//.word 0x89658a5c -//.word 0xd1a2d1cd -//.word 0xf323d951 -//.word 0xcf98a4b7 -//.word 0x8addaa63 -//.word 0x87217197 -//.word 0x93475ef1 -//.word 0x608ccb35 -//.word 0x356b5a4d -//.word 0xe3be888e -//.word 0xfb25853d -//.word 0x3eab4352 -//.word 0x55a7cc7b -//.word 0xc3e1da64 -//.word 0x17f6a136 -//.word 0x66fef05e -//.word 0xf86b788f -//.word 0x42346b0a -//.word 0x14344a1d -//.word 0x14cdf8e9 -//.word 0x6bd01269 -//.word 0xbea183b0 -//.word 0x60965272 -//.word 0xc6a1bfc6 -//.word 0x3b2f8f2a -//.word 0xd44fa4c8 -//.word 0xa717d0f8 -//.word 0x3843eb05 -//.word 0x34202334 -//.word 0x62a99402 -//.word 0xd6ef19ae -//.word 0x68be61f7 -//.word 0x647d4527 -//.word 0x83565850 -//.word 0x1a97c0d6 -//.word 0x9258452d -//.word 0x185fa8e4 -//.word 0x954036e3 -//.word 0xe1c89cf1 -//.word 0x349cfd79 -//.word 0xdd1e428d -//.word 0x3690b22b -//.word 0xd77cc2bf -//.word 0x0a532eea -//.word 0x7f544882 -//.word 0x41af90da -//.word 0xe9eb8643 -//.word 0x1285bcd2 -//.word 0x0cda2f64 -//.word 0xd546d7e0 -//.word 0x448e7dbc -//.word 0x887bcdc3 -//.word 0xd1c8ac15 -//.word 0x4d3fcc6f -//.word 0x561e7dac -//.word 0xeabfc68c -//.word 0x5b78b4b5 -//.word 0x47c1f2f7 -//.word 0xcb949ad4 -//.word 0xf41a4b40 -//.word 0x76837ca5 -//.word 0xa1350f2a -//.word 0x902a2935 -//.word 0xa493422e -//.word 0x31c27887 -//.word 0x764629f9 -//.word 0xd358c010 -//.word 0x3676cfe9 -//.word 0xd74d5f3b -//.word 0x25dc8494 -//.word 0xffd734e5 -//.word 0x28495841 -//.word 0xf57e24e2 -//.word 0x4920a46d -//.word 0xc3a09876 -//.word 0x36d78247 -//.word 0x5aeefddd -//.word 0xc17b5034 -//.word 0x0cec43c5 -//.word 0x5e29324c -//.word 0x11755fce -//.word 0xa8958cdb -//.word 0x0535ca11 -//.word 0xdd878ce1 -//.word 0x682dff96 -//.word 0x5d599e92 -//.word 0x1d3301db -//.word 0x2e7bf5d7 -//.word 0xec6fd254 -//.word 0x7bef09cb -//.word 0x00dffde6 -//.word 0x11cd143f -//.word 0x6ad30d6b -//.word 0xe1bf9437 -//.word 0x9c721331 -//.word 0x8186cc6b -//.word 0xee34257b -//.word 0xaa7442c6 -//.word 0x1c65d9ff -//.word 0xbbf042ea -//.word 0xc6a8ce66 -//.word 0x35f55aaa -//.word 0xef7224cf -//.word 0x3d93dd8f -//.word 0x7f8bff4c -//.word 0x1e6d6053 -//.word 0xc1910863 -//.word 0xc4393f69 -//.word 0xe674eb8e -//.word 0x41431973 -//.word 0x80fbdabb -//.word 0x4cea50cb -//.word 0x073d08cd -//.word 0xbd218afb -//.word 0x57292f1a -//.word 0x12f03344 -//.word 0x30ff0beb -//.word 0xeef1f91b -//.word 0xb5d5ddff -//.word 0x94d34ea7 -//.word 0xee13e908 -//.word 0x70dae945 -//.word 0x46f6f92d -//.word 0x8f5d4604 -//.word 0x0e11d786 -//.word 0x22462129 -//.word 0xf8c7d6a3 -//.word 0xff96ffac -//.word 0x9cd24a05 -//.word 0x20dea5b9 -//.word 0xf7c00ba3 -//.word 0x21c79e30 -//.word 0xe771f766 -//.word 0xc68bba25 -//.word 0xb09a6dad -//.word 0x747a8a61 -//.word 0x7a45d2cb -//.word 0xb377e5df -//.word 0xd04f1084 -//.word 0xb2786650 -//.word 0x22e81293 -//.word 0xc309eb98 -//.word 0x44164927 -//.word 0xdac8174e -//.word 0xee332a62 -//.word 0x13ead140 -//.word 0x3a6aaed8 -//.word 0x29b6c4ed -//.word 0x293ed016 -//.word 0xff05dd09 -//.word 0x1e031318 -//.word 0x1bc9d0fc -//.word 0x6163fad2 -//.word 0x26829363 -//.word 0x9edb8da8 -//.word 0x6ecae08e -//.word 0x633bdbf6 -//.word 0x64cab700 -//.word 0xa5297289 -//.word 0x1ec2dbf2 -//.word 0x3c9ee923 -//.word 0xd68650d0 -//.word 0x626856fb -//.word 0x69fce3bb -//.word 0x38a6d83b -//.word 0xd99fa205 -//.word 0x41500f81 -//.word 0xcbfe60b8 -//.word 0xe5ac9f5e -//.word 0x093d3310 -//.word 0xf0dab1da -//.word 0x0293f5fc -//.word 0x104972ee -//.word 0x45cbc6a1 -//.word 0x5a3f9108 -//.word 0x0ac488d7 -//.word 0xc655c58b -//.word 0xa9f061aa -//.word 0xaef8454c -//.word 0x21d93dda -//.word 0x53ea4f16 -//.word 0x92974a5b -//.word 0x58bfa126 -//.word 0xc35b7ad6 -//.word 0x456103b0 -//.word 0x9de80526 -//.word 0x068cbb59 -//.word 0xae14e4dc -//.word 0x695217bb -//.word 0xa74b57bc -//.word 0xa498e7e4 -//.word 0xde0c5f3d -//.word 0xcc9700d7 -//.word 0xcd6a450d -//.word 0x5f5cba09 -//.word 0x918d118b -//.word 0xbb4973e5 -//.word 0x6c2f144b -//.word 0xa4920a49 -//.word 0x431f5f95 -//.word 0xc2c06507 -//.word 0x21c149e6 -//.word 0x2032eb65 -//.word 0xb28ced6d -//.word 0xaf970b9d -//.word 0xc98aaa90 -//.word 0xc174b35e -//.word 0xdbdca165 -//.word 0x8fa4d949 -//.word 0x81343a39 -//.word 0xb3d4f674 -//.word 0xf958a00c -//.word 0xae0386ea -//.word 0xa6a64013 -//.word 0x6308892a -//.word 0x8c8a4e35 -//.word 0x9a0b05a4 -//.word 0xd50a408f -//.word 0x7f0a823f -//.word 0x4f3b51f0 -//.word 0x21568cd5 -//.word 0xebc9ff5d -//.word 0xf31435b5 -//.word 0x3f738d8e -//.word 0x4dbd9020 -//.word 0x058c826e -//.word 0xec9e37cc -//.word 0x9a7b299f -//.word 0x6e58c765 -//.word 0x803c0ff5 -//.word 0xd7615e07 -//.word 0xdddd87f6 -//.word 0x0f8123c5 -//.word 0xf9022961 -//.word 0x6256bf25 -//.word 0xc4614fa3 -//.word 0xffd1dca2 -//.word 0x4d479763 -//.word 0x79b7ad29 -//.word 0x4c1164f7 -//.word 0x4921669c -//.word 0x9ab45ced -//.word 0x49fcbf52 -//.word 0xb335eb84 -//.word 0x3a897694 -//.word 0x3b31bf30 -//.word 0x40deca22 -//.word 0x76574b19 -//.word 0x616300ac -//.word 0xcee9449c -//.word 0x0956e259 -//.word 0x513f27c8 -//.word 0x89483b44 -//.word 0x3044b1e3 -//.word 0x939d5cfa -//.word 0x41f664e3 -//.word 0xc0109afd -//.word 0x7eea09f5 -//.word 0x0a2dcd44 -//.word 0x84c629f9 -//.word 0x53d5d3b9 -//.word 0x15c69204 -//.word 0xdcbd0bb9 -//.word 0x9738d8dd -//.word 0xcef0db98 -//.word 0x9300d280 -//.word 0xb5482b1b -//.word 0x3614199e -//.word 0xfff9e7fb -//.word 0xd3008d1b -//.word 0x82078168 -//.word 0x5f63cf8f -//.word 0xf3ca6c84 -//.word 0xf371c7c6 -//.word 0x7071a2e4 -//.word 0x4e6f2040 -//.word 0xf77c1f13 -//.word 0x503ac7b1 -//.word 0xed40630f -//.word 0x81c07082 -//.word 0x9867f4c9 -//.word 0x8885124e -//.word 0xa46edaa9 -//.word 0xb4206666 -//.word 0xa2262208 -//.word 0x76bc6b4d -//.word 0x84335cb4 -//.word 0xe497e43d -//.word 0x23901c70 -//.word 0x3886d8a0 -//.word 0xba087d71 -//.word 0x506f1298 -//.word 0x68be99e2 -//.word 0x2ccd9f78 -//.word 0xb1a71261 -//.word 0x72305348 -//.word 0xfe0b8c80 -//.word 0xedba4445 -//.word 0x18073045 -//.word 0x0aa34c5f -//.word 0xb10e2baa -//.word 0x59b68bb9 -//.word 0xdc632d1d -//.word 0x12d2e42c -//.word 0x8fa0eb01 -//.word 0x8e6b7bc4 -//.word 0x28339d2c -//.word 0xca063e41 -//.word 0xe5dc8167 -//.word 0xe7c05998 -//.word 0x6b3056f1 -//.word 0xacc7bf70 -//.word 0x4019e2fc -//.word 0x03dfa8a5 -//.word 0x51546c2e -//.word 0x78de0dc8 -//.word 0x6cf14221 -//.word 0xbd302e9d -//.word 0xc7d635e3 -//.word 0x29550d9c -//.word 0x783d1877 -//.word 0x345ef171 -//.word 0xfa314553 -//.word 0xfc74e47c -//.word 0xaf1517e0 -//.word 0xc3513551 -//.word 0x581d71fe -//.word 0x6fc5f639 -//.word 0x9ed3367d -//.word 0x09327eaf -//.word 0x8d93cea4 -//.word 0x3e10e9e4 -//.word 0x140fa8ad -//.word 0xe16a933b -//.word 0x86cdb247 -//.word 0x675fa1ce -//.word 0x1ca4e313 -//.word 0x6aa278e7 -//.word 0x7142b228 -//.word 0x26fa4488 -//.word 0x04a99c8f -//.word 0xffc273e4 -//.word 0xbaada2c8 -//.word 0xf96a37e3 -//.word 0x5978c843 -//.word 0x3ff507a2 -//.word 0x0e0697e7 -//.word 0x9d791ef0 -//.word 0xe8a99c8f -//.word 0x05a2fbd2 -//.word 0x5a86e788 -//.word 0x0e30df00 -//.word 0xbd168c14 -//.word 0x70745266 -//.word 0xcca726ea -//.word 0x89d69fa5 -//.word 0x26d84fb4 -//.word 0xdb52538f -//.word 0xd020298f -//.word 0x8cf7c2ae -//.word 0xb048d88f -//.word 0xe56782be -//.word 0x13ec0638 -//.word 0xd45aee2e -//.word 0x28fe5e06 -//.word 0x6a1aa4a3 -//.word 0x824311e6 -//.word 0x5d080774 -//.word 0x9ad454ba -//.word 0x8616be2f -//.word 0x4b9edfd9 -//.word 0x644a3413 -//.word 0x54e3708d -//.word 0x98421694 -//.word 0xdab74694 -//.word 0x67abd7db -//.word 0xe383a79f -//.word 0x3cc82f43 -//.word 0xdc855bd6 -//.word 0x23f198dd -//.word 0x144e2e52 -//.word 0x4e11d0ec -//.word 0x3e4371a1 -//.word 0x94275a6a -//.word 0xf31d7a46 -//.word 0xedc6fd81 -//.word 0x2e692036 -//.word 0xf7964313 -//.word 0xcf093f5c -//.word 0x75d0fb32 -//.word 0x18b13a16 -//.word 0xcac6b7a9 -//.word 0x336a74b5 -//.word 0x82594f71 -//.word 0xa912d601 -//.word 0xca805c3d -//.word 0xecda4db3 -//.word 0xf3c8beef -//.word 0xcfc748fa -//.word 0xf3ce1720 -//.word 0x09323ef6 -//.word 0xe4c74d9c -//.word 0xb6482640 -//.word 0x83f80ce3 -//.word 0xd58afd60 -//.word 0xb23e42aa -//.word 0xcb4e4455 -//.word 0xf688a158 -//.word 0xde3c7f11 -//.word 0xf9582189 -//.word 0xbbd2b8fa -//.word 0x0a467b8e -//.word 0xf1e1f96a -//.word 0x987daeeb -//.word 0x740dd52f -//.word 0xbb3c7ed8 -//.word 0x1b51e00c -//.word 0xab56f0c0 -//.word 0x22793337 -//.word 0x47b2d0c5 -//.word 0xa8a6e9d9 -//.word 0x8fcc2b3b -//.word 0x32cea491 -//.word 0x2a32d528 -//.word 0x263909f1 -//.word 0xe107e5ca -//.word 0x51053fff -//.word 0x22843411 -//.word 0x62a374b6 -//.word 0x7e72e120 -//.word 0x6d575982 -//.word 0x2bb1cfd1 -//.word 0x69bca1c8 -//.word 0x83b5252e -//.word 0xb23e855b -//.word 0x8303cef9 -//.word 0x879e4308 -//.word 0x4cb8f724 -//.word 0x8d719b0b -//.word 0xa602945a -//.word 0x4aa15197 -//.word 0x78a6db74 -//.word 0xabebad52 -//.word 0x5278c705 -//.word 0x7f60fed7 -//.word 0xe3e696cf -//.word 0xfae41233 -//.word 0x836e4b4b -//.word 0x33b2c068 -//.word 0xaa222d25 -//.word 0xa6d65fed -//.word 0x772b46bd -//.word 0xb3b14c2b -//.word 0x2a44e5a8 -//.word 0x1c786702 -//.word 0xaa3b1d2d -//.word 0x8bb59642 -//.word 0x007343c8 -//.word 0x0ac54233 -//.word 0xda6474aa -//.word 0x8958d50d -//.word 0x09190d37 -//.word 0x5cf54280 -//.word 0x03b13186 -//.word 0xba737d2e -//.word 0x62e046e5 -//.word 0x3f81fe2c -//.word 0x636b7853 -//.word 0x6a1f4284 -//.word 0x68af3504 -//.word 0x20224ab6 -//.word 0x771ab0e1 -//.word 0x28b41b32 -//.word 0xb8b05e05 -//.word 0xadd23ce0 -//.word 0xfb877b40 -//.word 0xbfcc3b99 -//.word 0x2f4c8698 -//.word 0xd1c828ab -//.word 0xecbcc1c3 -//.word 0x3d401859 -//.word 0xea2cb2af -//.word 0xbc7fa458 -//.word 0x8802a5fa -//.word 0xee286753 -//.word 0x4639287a -//.word 0xd8af8467 -//.word 0x4be18db6 -//.word 0x61de1da8 -//.word 0xe19c6b6b -//.word 0xd452dd9b -//.word 0xf3221d08 -//.word 0x61fb6fba -//.word 0x96be4232 -//.word 0x9b9f04f3 -//.word 0x7dcf3b41 -//.word 0xfc58d229 -//.word 0x8348b0c1 -//.word 0x5d1190b1 -//.word 0x25300cf2 -//.word 0x7e0dfad6 -//.word 0x0522fc49 -//.word 0x84605356 -//.word 0x69cef4ed -//.word 0x7674dee3 -//.word 0xb977aa3a -//.word 0xbf8564a3 -//.word 0x05739941 -//.word 0xaf25b1b0 -//.word 0x7caf7f46 -//.word 0xfab91798 -//.word 0xf628e040 -//.word 0x37fbeade -//.word 0x6c72815d -//.word 0x62760278 -//.word 0x7a35ed7c -//.word 0x5b0d3c4f -//.word 0xe4abf3b1 -//.word 0x6474f9c2 -//.word 0x0e2326c4 -//.word 0xa7b49d23 -//.word 0x82825cb2 -//.word 0xaeac1138 -//.word 0x6ebc2f2b -//.word 0xe98b42bb -//.word 0x235f8013 -//.word 0x2c57a0db -//.word 0x9809ef01 -//.word 0x2e69a0b9 -//.word 0xe5ed63c2 -//.word 0x0cee3aeb -//.word 0xc85288d7 -//.word 0xc3686bfd -//.word 0x23134cf2 -//.word 0xb92bb5eb -//.word 0x7b20627e -//.word 0x35e09aa8 -//.word 0x7bfbc014 -//.word 0xe205259a -//.word 0x703d2007 -//.word 0x506b611c -//.word 0xca0f82d9 -//.word 0x73b7dffb -//.word 0xa1b1a8c3 -//.word 0x22e234f9 -//.word 0x2ef69831 -//.word 0x99ba794d -//.word 0x4dc51e43 -//.word 0xf85ec920 -//.word 0x029a484d -//.word 0xc2c5c711 -//.word 0xf103e858 -//.word 0x5f3716b3 -//.word 0xe424169f -//.word 0x9ad3de0a -//.word 0x4934ab13 -//.word 0x23074e12 -//.word 0xb2fdc6d8 -//.word 0x0e1b1438 -//.word 0x53604bc6 -//.word 0x52a7e7de -//.word 0x87cf5fe8 -//.word 0x4c18fedb -//.word 0x4bd0ee00 -//.word 0x393096f9 -//.word 0xc2812601 -//.word 0xbf826f75 -//.word 0xaf0ef994 -//.word 0x65fa4f83 -//.word 0xfe3d9e93 -//.word 0x16537ec7 -//.word 0x3ce31091 -//.word 0xa29f49dd -//.word 0x196b8d50 -//.word 0x3dc280d2 -//.word 0xed56194a -//.word 0xfff7f8a8 -//.word 0x31b6f929 -//.word 0x624a09d6 -//.word 0x02b3384f -//.word 0xc71d10c6 -//.word 0xa106254e -//.word 0xf1a3ee56 -//.word 0xf680d370 -//.word 0x87688758 -//.word 0x08849831 -//.word 0x97c64511 -//.word 0x86898fc0 -//.word 0x0e7193bd -//.word 0x41991682 -//.word 0x41ed6209 -//.word 0xb0d4518f -//.word 0x6713a798 -//.word 0x6beea433 -//.word 0x1c8fda7f -//.word 0xb0ac3d6e -//.word 0xe06579c9 -//.word 0xe16b8875 -//.word 0x966783f4 -//.word 0x049ab82e -//.word 0x06c0fe72 -//.word 0x423b45b8 -//.word 0x5b6d7129 -//.word 0x696669e1 -//.word 0xa6bf6af3 -//.word 0x69c5a2ad -//.word 0x59dbfa1e -//.word 0xda1933d6 -//.word 0xcc3934ed -//.word 0x75b4a247 -//.word 0xbb28b215 -//.word 0x97fd3b9f -//.word 0xc6481042 -//.word 0xc2ef8cb4 -//.word 0xf00f6e90 -//.word 0x1b9ae70e -//.word 0x2145f211 -//.word 0xeca1e468 -//.word 0xa487444d -//.word 0x23badc32 -//.word 0xaac810be -//.word 0xd2316f12 -//.word 0xc5cb8850 -//.word 0xad65ff5e -//.word 0x6dabe0e7 -//.word 0x904a32a3 -//.word 0x7e54d0d9 -//.word 0xf6e57422 -//.word 0xb807156f -//.word 0x82d3734d -//.word 0x3ed9f068 -//.word 0x7ac2a14e -//.word 0x1834a576 -//.word 0x47f6b581 -//.word 0xb255fdbf -//.word 0xf7c62af5 -//.word 0x5accc55e -//.word 0xbb1cbfef -//.word 0xc5004ddf -//.word 0x69f9f667 -//.word 0x8aa8e9c7 -//.word 0xfaee9589 -//.word 0xa6537409 -//.word 0x0da42735 -//.word 0xf7e0c892 -//.word 0x63567c80 -//.word 0xc10747be -//.word 0x61512530 -//.word 0x2ccf56e0 -//.word 0x927bf944 -//.word 0xc315dcbf -//.word 0x22c99369 -//.word 0xf60cc713 -//.word 0x63c7d186 -//.word 0x9ab7870c -//.word 0x4c135632 -//.word 0x647092cb -//.word 0xf5e30938 -//.word 0x7165dee7 -//.word 0x1d7b951a -//.word 0xc1166aea -//.word 0xa4b7e78b -//.word 0xb7d8b5d1 -//.word 0x1188b3f3 -//.word 0x9b554590 -//.word 0x0d6eefef -//.word 0x1909228b -//.word 0xe50355cf -//.word 0xbfc6581e -//.word 0x0d70e516 -//.word 0x82327916 -//.word 0x98f561fd -//.word 0x3a441835 -//.word 0xc066d0f1 -//.word 0x21ca4fb2 -//.word 0x64a9fc10 -//.word 0x58e63ab7 -//.word 0x8539f4b0 -//.word 0x628c79e2 -//.word 0xc9a58bd8 -//.word 0xa706b2c4 -//.word 0xf811d7c4 -//.word 0xf3700d65 -//.word 0x81b4b266 -//.word 0xf43cb7be -//.word 0xf6593cdf -//.word 0xbfaf603d -//.word 0x8cdf570a -//.word 0x4c63bd44 -//.word 0x9cb929f2 -//.word 0xf5c306ab -//.word 0x246e9e57 -//.word 0xfb92783a -//.word 0x4719e42e -//.word 0x0264d42f -//.word 0xc9eaed1d -//.word 0x9022debe -//.word 0x94a4f103 -//.word 0x918bdf8c -//.word 0x351de96d -//.word 0xd5ae2433 -//.word 0x60c11522 -//.word 0x91717dc1 -//.word 0x680f7699 -//.word 0xda0dbf39 -//.word 0xc81a557d -//.word 0x2e8f4310 -//.word 0x9d0aba30 -//.word 0xeb5864b1 -//.word 0x2999f645 -//.word 0xd59e05fa -//.word 0x51961a04 -//.word 0x94ea08bd -//.word 0x20657dea -//.word 0x3398d840 -//.word 0x427d3a27 -//.word 0xa35ae0bd -//.word 0x8ae8b01e -//.word 0x36b511e3 -//.word 0x6cc700e8 -//.word 0x25826153 -//.word 0x84cc92d1 -//.word 0x0a6e4623 -//.word 0x0dbd91da -//.word 0x667b3f5e -//.word 0x6bf86a35 -//.word 0x1d7c4c82 -//.word 0xa2e951cc -//.word 0xf59d7001 -//.word 0xdc96bcbb -//.word 0x1ad936c1 -//.word 0xe614e6d1 -//.word 0x9d822a9d -//.word 0xb40f4d13 -//.word 0xf0bd5be1 -//.word 0xd9463439 -//.word 0x6c03e0d1 -//.word 0x100c222f -//.word 0xcba15023 -//.word 0xb6c86195 -//.word 0xae384880 -//.word 0x4d76813f -//.word 0x183ee908 -//.word 0xfa24d2b6 -//.word 0xf27b57cb -//.word 0x0876edb5 -//.word 0x858d3b50 -//.word 0x63222cad -//.word 0x03654212 -//.word 0x1e752d41 -//.word 0xfec89cfd -//.word 0xeecc53cb -//.word 0xefce7df6 -//.word 0xac1c44d5 -//.word 0xb066a050 -//.word 0xd76a6ca1 -//.word 0x02d1bf58 -//.word 0x0f5379a2 -//.word 0x09221cca -//.word 0x9b86de00 -//.word 0xcbc4fc5a -//.word 0xe5455018 -//.word 0xb4f4262c -//.word 0xf8e84cfa -//.word 0x1543685c -//.word 0x095a8ee9 -//.word 0xa0161277 -//.word 0xeb9a9bde -//.word 0xee2579ff -//.word 0x993a3905 -//.word 0xfaff76eb -//.word 0xb0e4f23f -//.word 0xa384e525 -//.word 0xf2d0949e -//.word 0x2d6a260a -//.word 0xc54fb3ec -//.word 0xc0b99fee -//.word 0xb1442625 -//.word 0xe84f3795 -//.word 0xe6a586f8 -//.word 0x145dddbb -//.word 0xb4feb24a -//.word 0x17e7ff8d -//.word 0x10ee4eb2 -//.word 0xaa48132e -//.word 0x16a93ffe -//.word 0xe7ab1233 -//.word 0x827431ad -//.word 0xcf93f827 -//.word 0x352c1174 -//.word 0xc6554607 -//.word 0xb6bf93b9 -//.word 0x129980c7 -//.word 0xaeb1ae1a -//.word 0x60ddafcc -//.word 0x6b991ae7 -//.word 0x3ef1df70 -//.word 0x5fa2d9a4 -//.word 0xa27ca281 -//.word 0x9e0aab88 -//.word 0x61758cc2 -//.word 0x63a69801 -//.word 0xb9abb568 -//.word 0x8b5c6b2d -//.word 0xc83e3a9e -//.word 0x18a73162 -//.word 0x1323bc02 -//.word 0xb017bea8 -//.word 0x00a4df26 -//.word 0x1cce2839 -//.word 0x5cdecd0f -//.word 0xc9044908 -//.word 0xd541b0ba -//.word 0x4a844137 -//.word 0x81143b92 -//.word 0xd42df39f -//.word 0x55ee22fb -//.word 0xc173834c -//.word 0xaf3e9eca -//.word 0x0ddbdeff -//.word 0xcdc3eaca -//.word 0xdc8232aa -//.word 0x5415c839 -//.word 0xf29672f7 -//.word 0xca1bfd49 -//.word 0x39dbd4c2 -//.word 0x1c92d1a0 -//.word 0x3f27529a -//.word 0x198c90d9 -//.word 0xb6e72c44 -//.word 0xf4ef0b00 -//.word 0xf2986437 -//.word 0xc6f21719 -//.word 0x6e4e4121 -//.word 0x09a40d9a -//.word 0x4831cd61 -//.word 0x1f6449ec -//.word 0xc0fb568b -//.word 0xc96aabee -//.word 0xbc7cf1e8 -//.word 0xb13c1972 -//.word 0x4716f2f3 -//.word 0xe03afbbf -//.word 0x0e4176dd -//.word 0x4813bd0d -//.word 0xe208d909 -//.word 0x3c4d510c -//.word 0x398a4091 -//.word 0xf2c1aa5d -//.word 0xac7a10bf -//.word 0x081d4217 -//.word 0x7a9f7595 -//.word 0xfc609543 -//.word 0x0454dd46 -//.word 0xb362a461 -//.word 0x4f097aba -//.word 0xf34973e1 -//.word 0x85c1c30e -//.word 0xe9158baa -//.word 0x7492f311 -//.word 0xa4157997 -//.word 0x0e2889c9 -//.word 0x976f4df5 -//.word 0xe743c6ec -//.word 0x1b9c1c06 -//.word 0xba343267 -//.word 0xebe97e81 -//.word 0xe56318da -//.word 0xa6f8100f -//.word 0xe8cc051a -//.word 0x513df3d0 -//.word 0xea7e4dad -//.word 0xd2814cd4 -//.word 0x341b8652 -//.word 0x7663c2a3 -//.word 0xb35b0b77 -//.word 0x6cd203b6 -//.word 0x7a887ac1 -//.word 0x47943ffb -//.word 0x3e033688 -//.word 0x80c2ab54 -//.word 0xd9bee657 -//.word 0xf2490018 -//.word 0xc8c0f570 -//.word 0x5c6af991 -//.word 0xada41046 -//.word 0xe33bd97d -//.word 0xcd1aaa02 -//.word 0x8d25e28d -//.word 0x92647bff -//.word 0xc764dfe9 -//.word 0x0adafd4e -//.word 0xe08a9baa -//.word 0x6767ee32 -//.word 0x8cfc685e -//.word 0x7d0ad1a5 -//.word 0x62739987 -//.word 0x48566dd1 -//.word 0x5d7c081d -//.word 0x63f34c98 -//.word 0x5ff89108 -//.word 0x911b3d0d -//.word 0xa99d94a6 -//.word 0x381dd2f8 -//.word 0x6573774b -//.word 0xe1dde356 -//.word 0x1d5922bc -//.word 0xba5109d6 -//.word 0x417d82b3 -//.word 0x1406245d -//.word 0xa4e7075e -//.word 0xe599d683 -//.word 0xffef25e0 -//.word 0x473f0514 -//.word 0x6dc2d6cf -//.word 0xf63d5d91 -//.word 0xede117b4 -//.word 0xd670ccac -//.word 0xe4a2668e -//.word 0x6cc704cf -//.word 0x98ad4b4e -//.word 0x60c4fc95 -//.word 0xb680cc5c -//.word 0x01ff704f -//.word 0xcdecf712 -//.word 0xc1a35c81 -//.word 0xd1965c3c -//.word 0xb5ef8563 -//.word 0x9977909e -//.word 0x16b6f061 -//.word 0x615cab6e -//.word 0xc2df699b -//.word 0x4866cad5 -//.word 0xbce6fd65 -//.word 0xd38a8f72 -//.word 0xa75980c7 -//.word 0x68139cd7 -//.word 0x4f5b08fe -//.word 0xd41b1c0a -//.word 0x212570fa -//.word 0xc6163a06 -//.word 0xae80d7df -//.word 0x5248a737 -//.word 0x2c4c1e84 -//.word 0x6f491801 -//.word 0xf5fd6df6 -//.word 0x7988c63a -//.word 0x0618aff6 -//.word 0xafc5edab -//.word 0x81ba1177 -//.word 0xb6964d94 -//.word 0x2b128721 -//.word 0x15e3ac25 -//.word 0xefe247d1 -//.word 0xb76a5205 -//.word 0x59014b16 -//.word 0x6c3b8bcf -//.word 0x1cdcd4b5 -//.word 0x673d298f -//.word 0x8df1e226 -//.word 0xc1a7ff4a -//.word 0x2552bd15 -//.word 0xf5886774 -//.word 0x02286fe2 -//.word 0x6340bd77 -//.word 0x672e4722 -//.word 0xce05e233 -//.word 0x3832571c -//.word 0xdd5fba78 -//.word 0x7f97f74c -//.word 0x9dabae8d -//.word 0xead541e3 -//.word 0xfd9c2bad -//.word 0x4af79345 -//.word 0x51b52085 -//.word 0x151c108a -//.word 0xd0d184b7 -//.word 0xe5f81efd -//.word 0x169bce5a -//.word 0xf750e9a0 -//.word 0xa2167c78 -//.word 0xad81dfa6 -//.word 0x59178d8f -//.word 0x0cf932f8 -//.word 0x02c60610 -//.word 0x3fbc5ab1 -//.word 0xc82070e3 -//.word 0x12e090a2 -//.word 0xbb7858e1 -//.word 0x781254ce -//.word 0x4ff1cf58 -//.word 0x060fe8ee -//.word 0xdb05e88a -//.word 0x752cd2ef -//.word 0x1b023c2f -//.word 0x24cf5e6f -//.word 0xae8869ee -//.word 0x93f31a44 -//.word 0x990c8ee8 -//.word 0xe9a858f5 -//.word 0xc358d12e -//.word 0x6f90af3f -//.word 0x7708d946 -//.word 0x13637a91 -//.word 0xe50f54a9 -//.word 0xe66c5890 -//.word 0xa1307348 -//.word 0x9f0aaa94 -//.word 0x22856903 -//.word 0x16301829 -//.word 0x44fcf030 -//.word 0xc9e50d90 -//.word 0xc6d4c41a -//.word 0x5ac4363b -//.word 0xcd24257f -//.word 0x0e7d0754 -//.word 0x60555911 -//.word 0x50533636 -//.word 0xeaa428f5 -//.word 0x2c9c3ef2 -//.word 0xbba15f48 -//.word 0xd545ddcc -//.word 0x87b24d95 -//.word 0x204b97bc -//.word 0xe5904960 -//.word 0x064231ed -//.word 0xd1c82a9e -//.word 0x26d23641 -//.word 0x2b3ccd3b -//.word 0x403575cb -//.word 0x36a09393 -//.word 0xbbba8154 -//.word 0x19fee0f9 -//.word 0x214630d7 -//.word 0x61329e33 -//.word 0x9ecd1c04 -//.word 0x7e6eb7fb -//.word 0x84dd25c1 -//.word 0x41b79e80 -//.word 0xc914eea4 -//.word 0x6566c7e3 -//.word 0x87a55b7a -//.word 0x03a92aba -//.word 0x7bd719c4 -//.word 0x1bffc591 -//.word 0x87851635 -//.word 0x12bf1764 -//.word 0x319f0535 -//.word 0x2f92a626 -//.word 0x22a7db60 -//.word 0x1df4793d -//.word 0xa7365508 -//.word 0x6cb79e04 -//.word 0x337570af -//.word 0x1080a547 -//.word 0xdba4ef8e -//.word 0xe04824cb -//.word 0xd896d811 -//.word 0x19dc31c3 -//.word 0x0932f758 -//.word 0xd85eeb5c -//.word 0x6ff45ab7 -//.word 0xa3c2f132 -//.word 0xaf6ad337 -//.word 0xe151e9d8 -//.word 0x93b87914 -//.word 0x5d29fb55 -//.word 0x8915283c -//.word 0xc7bb53a1 -//.word 0x224bfcd6 -//.word 0x334ca32c -//.word 0x953bdab9 -//.word 0x99759e58 -//.word 0x3a57e7f0 -//.word 0x53a37efa -//.word 0x0f250f3d -//.word 0xa1977fdc -//.word 0x36c37f93 -//.word 0x28e7623e -//.word 0x755d2b9b -//.word 0x6f7beb50 -//.word 0xb5b94a30 -//.word 0x611163ba -//.word 0x83acd5e2 -//.word 0xcfba1615 -//.word 0x92a20b77 -//.word 0xeb5bd66f -//.word 0x3719f065 -//.word 0xcd2d77ca -//.word 0xec26c959 -//.word 0xf13d519d -//.word 0xcdf0a1b4 -//.word 0xb7ecc152 -//.word 0x1e30c709 -//.word 0xe270a8c7 -//.word 0xc3b74ea0 -//.word 0x1a51ebcd -//.word 0xc7e88cf5 -//.word 0x6aedf1ac -//.word 0xd63a9c3a -//.word 0xc2f5289d -//.word 0xc2b7dcd1 -//.word 0x76ed804e -//.word 0x017f6fd3 -//.word 0xbdb0ee62 -//.word 0x2e46bc8b -//.word 0x34eaebee -//.word 0x84d1edfc -//.word 0x589cf2fd -//.word 0x667d7257 -//.word 0x0f9c050d -//.word 0xdab97b86 -//.word 0x20122990 -//.word 0x098781a4 -//.word 0xb7fce66c -//.word 0xc0ffbe82 -//.word 0xe2aac87b -//.word 0xf2cbaf24 -//.word 0x1643e00b -//.word 0x34ac9941 -//.word 0xaa3f435f -//.word 0x40f402c7 -//.word 0x5aea8a2c -//.word 0x730a3455 -//.word 0xc6e8511d -//.word 0x4ee9bebf -//.word 0xf1abb950 -//.word 0xf9a1f28d -//.word 0xc3fee5d7 -//.word 0xbbd5687c -//.word 0x887e8038 -//.word 0x833b79fc -//.word 0x6e1b36ed -//.word 0x631fc5b0 -//.word 0x0a9c36e5 -//.word 0x0fe0aef1 -//.word 0xd318b701 -//.word 0x6272da4c -//.word 0xa67e7098 -//.word 0xdadab5ff -//.word 0x400e1ef3 -//.word 0x17b5ed80 -//.word 0xc8de02d1 -//.word 0x60b1f4f6 -//.word 0x425660e4 -//.word 0x1e1281bd -//.word 0x1db30152 -//.word 0x5e2f0fe7 -//.word 0xa688b236 -//.word 0x53f25db6 -//.word 0x9238c31c -//.word 0xd25cec22 -//.word 0x797e8988 -//.word 0xd5fe8559 -//.word 0x55e5dc70 -//.word 0xf981b03a -//.word 0x07509abe -//.word 0x00203eda -//.word 0xd27322cf -//.word 0x4f28c000 -//.word 0xde58d9f6 -//.word 0x707f0da8 -//.word 0xb6dca9f9 -//.word 0x921ac083 -//.word 0xcb2f7d93 -//.word 0x0485b774 -//.word 0xef57c6f1 -//.word 0xbe5f9515 -//.word 0xdaaef935 -//.word 0xd8db4131 -//.word 0xa95f0ff6 -//.word 0x10406647 -//.word 0x59ed03be -//.word 0x4969f10d -//.word 0x51ac588a -//.word 0x064796eb -//.word 0xd646904d -//.word 0xf35a4a7c -//.word 0x9438b66e -//.word 0x5d3cca10 -//.word 0x1b52d546 -//.word 0xb516132c -//.word 0x603a7fa3 -//.word 0x1128e809 -//.word 0x38e94747 -//.word 0xab465011 -//.word 0xe02d4769 -//.word 0x60561565 -//.word 0x78259b33 -//.word 0x32d3465a -//.word 0x84c9e442 -//.word 0xc64cb6f7 -//.word 0x695fc62a -//.word 0xe7e57a79 -//.word 0xf6076af0 -//.word 0x01d56fcf -//.word 0xd830fc8d -//.word 0xa7e7b21e -//.word 0x25202e72 -//.word 0x0dfa263e -//.word 0xd270b4fe -//.word 0x8f81f13b -//.word 0x3c8dc609 -//.word 0x2803ffd5 -//.word 0xa339a15d -//.word 0xfb9b7e00 -//.word 0xab080638 -//.word 0xce796065 -//.word 0xdae4bacc -//.word 0x8a60dddf -//.word 0x1c8904bf -//.word 0xbd26eeff -//.word 0x420932ab -//.word 0x1837d388 -//.word 0x7e49149e -//.word 0xf1128df4 -//.word 0xe8827f9b -//.word 0xc2ca65ed -//.word 0xfdc1cb17 -//.word 0xa88763d5 -//.word 0x1b68567d -//.word 0xe503d83f -//.word 0x06abffab -//.word 0x5f0dd573 -//.word 0x6613ac73 -//.word 0x1e09b1ee -//.word 0x47ffc41b -//.word 0xd16e87e0 -//.word 0x971eb5dd -//.word 0x4a46b6ac -//.word 0xabf67067 -//.word 0xfeb25f6b -//.word 0xbb5fe85c -//.word 0x8664ea6a -//.word 0x610997d2 -//.word 0x212282a7 -//.word 0x1ef2f8d2 -//.word 0x2f4a9458 -//.word 0xd6f10edb -//.word 0xb7485464 -//.word 0x4f2edc5f -//.word 0xe22238e7 -//.word 0xb5a7eb44 -//.word 0x7eed7bb2 -//.word 0x19adc764 -//.word 0x7c559bc9 -//.word 0xed65820e -//.word 0x7319dbe4 -//.word 0x8a482f83 -//.word 0x1a8cc2ef -//.word 0xaaa3687a -//.word 0xd1159a8a -//.word 0xee17c99c -//.word 0x19b0f289 -//.word 0x5a1a7308 -//.word 0x186b1d75 -//.word 0xd4758ad1 -//.word 0x17eab109 -//.word 0xa8c4b77b -//.word 0x03e309b6 -//.word 0x07f8a781 -//.word 0xefa3c320 -//.word 0x83d88ad2 -//.word 0x8f87429e -//.word 0x957c954f -//.word 0xbf842cbe -//.word 0x17d1804f -//.word 0xfa9fedbe -//.word 0xca18091c -//.word 0xe4753314 -//.word 0xd2676f73 -//.word 0xc1b571e8 -//.word 0x3526f707 -//.word 0xfba15c94 -//.word 0x60936aff -//.word 0xa091712b -//.word 0xa13f9573 -//.word 0xe1706cef -//.word 0xad8ec9f3 -//.word 0x953dd2d9 -//.word 0x1c3b5901 -//.word 0xb48a6915 -//.word 0xe9d21e92 -//.word 0xdc01ba84 -//.word 0xf334f691 -//.word 0xcfda9638 -//.word 0x7e16405b -//.word 0xf2668efb -//.word 0xb2836244 -//.word 0xd0887ac9 -//.word 0x1b554410 -//.word 0x9536f351 -//.word 0x28c0d27b -//.word 0x94fcd878 -//.word 0xacc87db2 -//.word 0xc279cdd6 -//.word 0x60c5bbd8 -//.word 0x39e1b737 -//.word 0x5ee68382 -//.word 0xb579421b -//.word 0xa8abd23b -//.word 0x1a1e5b36 -//.word 0x9f6a2800 -//.word 0xecbeb6f0 -//.word 0x8ccb0bc5 -//.word 0xd5dd49e7 -//.word 0x1b4b83ef -//.word 0x2312cf68 -//.word 0xdabd9dd7 -//.word 0x478847fa -//.word 0xbfc4e94e -//.word 0x587d72d3 -//.word 0xa05bfb13 -//.word 0x8ec65861 -//.word 0xb84ded5f -//.word 0xc749c3c3 -//.word 0x28bddc5a -//.word 0x0581c34d -//.word 0x74a066a3 -//.word 0xeefe2807 -//.word 0x023e33cb -//.word 0x4ae20b2e -//.word 0x9fb469da -//.word 0x896546b1 -//.word 0xf97536c9 -//.word 0x3b52f7b5 -//.word 0x26c44a07 -//.word 0x96880112 -//.word 0x1c3c5af5 -//.word 0xf37b8bd5 -//.word 0x36489e69 -//.word 0x51b07fbc -//.word 0xb6ab542e -//.word 0xd1440cbc -//.word 0x3df93b82 -//.word 0x3865257e -//.word 0x541c1897 -//.word 0x70d700de -//.word 0xe7d13513 -//.word 0x0770976b -//.word 0xc528dd90 -//.word 0xae9d2aea -//.word 0x2107e11d -//.word 0xbcdbbbd3 -//.word 0x14a817bb -//.word 0xa93e91d2 -//.word 0x1916d5e1 -//.word 0x93eeb646 -//.word 0x8fb47af8 -//.word 0xbca578c6 -//.word 0x3ab6e6df -//.word 0x0a33ec97 -//.word 0xc3a6fc68 -//.word 0x86fa6637 -//.word 0x33e027d9 -//.word 0xdd7202d6 -//.word 0x7c16d36d -//.word 0xe2a61fd8 -//.word 0xf1ceefd1 -//.word 0x0ab5df54 -//.word 0xc8df72a7 -//.word 0xef52a898 -//.word 0x9ff7d306 -//.word 0xce44a6a2 -//.word 0xf5188ff7 -//.word 0x08e647a8 -//.word 0xac16a7f9 -//.word 0xa5a8bd91 -//.word 0x8d1b1f7f -//.word 0xcc8d7f7a -//.word 0xc423806d -//.word 0x4cabc833 -//.word 0x6080569e -//.word 0x16ae16bf -//.word 0xd457b361 -//.word 0xc156add7 -//.word 0x7921abf8 -//.word 0x05f41267 -//.word 0x0a2cd618 -//.word 0x40f1910f -//.word 0x2617d26b -//.word 0xf546b7a4 -//.word 0xd259be11 -//.word 0x4705d8ad -//.word 0xf4bbbf1a -//.word 0x82cf8ae6 -//.word 0xd9d97f0e -//.word 0x935c28c0 -//.word 0xb0a5a965 -//.word 0x8bf650df -//.word 0x0ce46e0f -//.word 0x20fe659b -//.word 0x66af03ee -//.word 0x2c660e80 -//.word 0x99f32057 -//.word 0x2b35b5ce -//.word 0x65f28395 -//.word 0xc1060af9 -//.word 0xecc06b65 -//.word 0x32897d29 -//.word 0x37c61e7b -//.word 0xe900c7bb -//.word 0xb24264fc -//.word 0xf2c362bf -//.word 0xacc50901 -//.word 0x80bd0c79 -//.word 0xd9b45e1b -//.word 0x67ed48e0 -//.word 0xd0c8b9c9 -//.word 0xa2e6dd22 -//.word 0x8d8ef004 -//.word 0xcf50551d -//.word 0xefe8e2b3 -//.word 0xae657fe7 -//.word 0x3b8aef37 -//.word 0xa674ed47 -//.word 0x977d7be1 -//.word 0x4061773a -//.word 0x909f6f77 -//.word 0xa922b66f -//.word 0x9521b7b3 -//.word 0x34448acc -//.word 0x7908c5c3 -//.word 0xd66495e7 -//.word 0xf5ad0dca -//.word 0xa9b7bd8d -//.word 0x243d875d -//.word 0x6a82ae3e -//.word 0x06393007 -//.word 0xfba256ae -//.word 0xfdf789c6 -//.word 0xe1066746 -//.word 0x531f168c -//.word 0xc730d8a2 -//.word 0xb22fe0bf -//.word 0xf9b86511 -//.word 0xa9f8f4b9 -//.word 0xeac90a18 -//.word 0x2e1ee249 -//.word 0xaea28cee -//.word 0x179c3f30 -//.word 0x8016f001 -//.word 0xa03e23a4 -//.word 0x3e0c0270 -//.word 0xe825acd1 -//.word 0xe800cf8f -//.word 0x74477953 -//.word 0x25802b67 -//.word 0xabec30bd -//.word 0xbeaf2c33 -//.word 0x5732f815 -//.word 0x21c6ade3 -//.word 0x2a8aff55 -//.word 0xdf8ecd9d -//.word 0x3738f5ec -//.word 0x2ee76d37 -//.word 0x75d7903b -//.word 0x6845b5bf -//.word 0x40d30619 -//.word 0x8a2d90f3 -//.word 0xd8ed964f -//.word 0xb6bc2bc9 -//.word 0xdfba001c -//.word 0xb1217ae8 -//.word 0xdf2507b3 -//.word 0x661eb32d -//.word 0xc2e8f6b8 -//.word 0x618ad027 -//.word 0x581718c6 -//.word 0x55d2129b -//.word 0xd4953fec -//.word 0x96747902 -//.word 0x4f9d3f2c -//.word 0xa0824d06 -//.word 0x443b6ffa -//.word 0x8e259808 -//.word 0x13d02ec3 -//.word 0xa418a99c -//.word 0x7f915c63 -//.word 0xc529920b -//.word 0x2f08ddae -//.word 0xfdbbabd0 -//.word 0x30921ae8 -//.word 0xf9460e1d -//.word 0x71df804d -//.word 0x8ad51953 -//.word 0x4676ff8a -//.word 0x2787ef8d -//.word 0xe62e8c41 -//.word 0x6810f616 -//.word 0xedb69f89 -//.word 0x8b355aee -//.word 0xdb0eb56c -//.word 0xf2538949 -//.word 0x920bcf67 -//.word 0xa2d8b50f -//.word 0xdcd7f2ee -//.word 0xc6c8565d -//.word 0xe36fa5e6 -//.word 0x2a39a503 -//.word 0xb7237628 -//.word 0xc1d82204 -//.word 0xcc197505 -//.word 0x1f620f1a -//.word 0x79cbb7bc -//.word 0x002cf22f -//.word 0x7a84d405 -//.word 0xbf9c17e5 -//.word 0x6ee76a8a -//.word 0xe0ad0b0e -//.word 0x5a689869 -//.word 0x876f2335 -//.word 0x25d184b4 -//.word 0xfe84f313 -//.word 0x1abfd6f0 -//.word 0x33a4d71b -//.word 0x69223a99 -//.word 0x371a6def -//.word 0xa6c0e19d -//.word 0xc04519e8 -//.word 0x48b301dc -//.word 0xa8188092 -//.word 0x2be650af -//.word 0x6c9a0e2d -//.word 0x0f9c8d5e -//.word 0xae66702d -//.word 0x16e9f8a8 -//.word 0xb42c1abb -//.word 0x4a37d53e -//.word 0xe62fc233 -//.word 0x15c2ed48 -//.word 0x54c6e3a4 -//.word 0xc71c0cdf -//.word 0x2edb3b52 -//.word 0x14aa8492 -//.word 0x496e4e37 -//.word 0x9326a8e2 -//.word 0xa112e17e -//.word 0x401b52c5 -//.word 0xd26f7f06 -//.word 0xfb6c5f26 -//.word 0x9dbff7e6 -//.word 0x07cd2e63 -//.word 0x6952dce3 -//.word 0x8b4724ce -//.word 0xbf0a04fb -//.word 0x15b92a2d -//.word 0xcdde09de -//.word 0x12522d3b -//.word 0xe55bcb6f -//.word 0x57189d24 -//.word 0xfb1fec47 -//.word 0x9b64ef0c -//.word 0x2a5d5333 -//.word 0xfa631b89 -//.word 0x2f5caab1 -//.word 0x74971e24 -//.word 0xecf7e077 -//.word 0x6b5479dd -//.word 0xe71ea8ec -//.word 0x2943b1a4 -//.word 0xc853f7ad -//.word 0x58e3cde0 -//.word 0xdf2f8a09 -//.word 0x8803dbeb -//.word 0x9cdb5e85 -//.word 0xad496c94 -//.word 0x15973659 -//.word 0x9fad139c -//.word 0x833618f1 -//.word 0x98ffea3a -//.word 0xc59fd06d -//.word 0xb85d0c98 -//.word 0xdb4e6c22 -//.word 0x84be1c53 -//.word 0x6dd1be16 -//.word 0x636abcfe -//.word 0x424cdd88 -//.word 0x208017a0 -//.word 0xc9f6a566 -//.word 0x6c6f5931 -//.word 0x939932d4 -//.word 0x587c3121 -//.word 0xd61669ac -//.word 0xdf4256d2 -//.word 0xeddf6ff9 -//.word 0x5a2dfe18 -//.word 0xd37a307b -//.word 0x0aff68c0 -//.word 0xab05d926 -//.word 0x924c5407 -//.word 0x3bac5ea2 -//.word 0x79fd861e -//.word 0x6b35f6cc -//.word 0xacd047ad -//.word 0xcb759a34 -//.word 0xfbd6e44c -//.word 0x0bd8899d -//.word 0x98f42d0b -//.word 0x81dcc680 -//.word 0x9b62f6ec -//.word 0xa696998a -//.word 0x802f9a64 -//.word 0x992d0a19 -//.word 0xa7bc73de -//.word 0x9b5a69c3 -//.word 0xd33c6338 -//.word 0x91eec9cf -//.word 0xac3b4e43 -//.word 0x854c80ba -//.word 0x3d149d47 -//.word 0x25eba9b3 -//.word 0x7678bd7d -//.word 0x43d5a21f -//.word 0xabee9f93 -//.word 0x532a8e16 -//.word 0x144e352c -//.word 0xf09ed4e4 -//.word 0x4b45fb5d -//.word 0x57f69e89 -//.word 0xd1d46b31 -//.word 0xeb8f5b39 -//.word 0x89d08826 -//.word 0xafd83edd -//.word 0x3a6454ad -//.word 0xcfd3bd90 -//.word 0x128a5aae -//.word 0x18981223 -//.word 0x1e962502 -//.word 0x7bd1bd9a -//.word 0xd3acc7f8 -//.word 0x8e3f00ad -//.word 0x884453d1 -//.word 0x0a346247 -//.word 0xfaad6343 -//.word 0x4e172d0a -//.word 0xc68792f9 -//.word 0xdbe3f0c9 -//.word 0xf3480311 -//.word 0xd6a8fd0c -//.word 0x65b8d99d -//.word 0x8a09ec90 -//.word 0x6b74bd23 -//.word 0xe3bc16c5 -//.word 0x326f5b1d -//.word 0xf30d1b4e -//.word 0x4f6ce57a -//.word 0x715b5d85 -//.word 0x39868e1b -//.word 0x359a82f4 -//.word 0xcda91056 -//.word 0xbdcff6dc -//.word 0xc9162877 -//.word 0xab9767b2 -//.word 0x51e2143a -//.word 0x45a0479d -//.word 0x6d771c52 -//.word 0xf42e4dfa -//.word 0x881206e5 -//.word 0xc698f4d8 -//.word 0xf243a00d -//.word 0xecc8fb7c -//.word 0x5f713959 -//.word 0x3cbfe3de -//.word 0x6753284a -//.word 0xb00e752a -//.word 0x047845d7 -//.word 0xe45e3940 -//.word 0x17c06be9 -//.word 0x9cea0034 -//.word 0xe3e0fce0 -//.word 0x3dff5acf -//.word 0x90e25d0c -//.word 0x4f83210c -//.word 0xa9a27534 -//.word 0x016bed9c -//.word 0x9f533213 -//.word 0xa5439d63 -//.word 0x44f804d6 -//.word 0x2faad4f8 -//.word 0x50eb609f -//.word 0xbbd37929 -//.word 0xe05a3f05 -//.word 0x04053675 -//.word 0xf2c59d91 -//.word 0xed1cfb90 -//.word 0xea81fa43 -//.word 0xfc0678e2 -//.word 0x1038dc0b -//.word 0xda46a608 -//.word 0x0f664b51 -//.word 0xd5753f51 -//.word 0x78dd536d -//.word 0x5ebc4143 -//.word 0x3d43852f -//.word 0x8b5c6f14 -//.word 0x368f7759 -//.word 0x9626d031 -//.word 0xa08f4020 -//.word 0x5c032ebb -//.word 0x9965fdaf -//.word 0xdf6d9804 -//.word 0xa5054ea3 -//.word 0xc4f3e116 -//.word 0x2cb9d990 -//.word 0xd5b91e2d -//.word 0xf99dc67a -//.word 0x81f62c38 -//.word 0xbd23425d -//.word 0x5775285c -//.word 0x8a91fda6 -//.word 0x8f15f571 -//.word 0x587eabb8 -//.word 0x8149b983 -//.word 0x84588768 -//.word 0x2c986052 -//.word 0x4ce1cb81 -//.word 0xb01d18d2 -//.word 0x54ad3941 -//.word 0xd408d3ac -//.word 0x24a595da -//.word 0x811cc9bb -//.word 0xa78828f1 -//.word 0x452ff390 -//.word 0xae653f22 -//.word 0xd1ad91ef -//.word 0x6b22aa7b -//.word 0x7b15a44f -//.word 0xf7f83efc -//.word 0xbd7a755e -//.word 0xccf4541e -//.word 0xb4040c7a -//.word 0x4b774749 -//.word 0xa26dba39 -//.word 0x37b7f95c -//.word 0x6c8490e3 -//.word 0x383d4f29 -//.word 0x1dade5f3 -//.word 0x5a65b1f6 -//.word 0x615fd499 -//.word 0x8be18bfd -//.word 0x0ba4bc3a -//.word 0x2136ceec -//.word 0x909dbeef -//.word 0x513d6f66 -//.word 0x89fc4202 -//.word 0xb9a3e781 -//.word 0x34877374 -//.word 0xd76ab246 -//.word 0xf49cbe7a -//.word 0x8f65d034 -//.word 0xcda857fb -//.word 0xa9c047bd -//.word 0xe9aeb413 -//.word 0x50769fc7 -//.word 0x16c61094 -//.word 0x95d9652c -//.word 0x459be980 -//.word 0xea0ea83b -//.word 0x0cec828f -//.word 0xa88e7f35 -//.word 0x250c62af -//.word 0x89a681d1 -//.word 0xed62d37f -//.word 0x2ff74bb8 -//.word 0xe6ea64d4 -//.word 0x9bf7fe09 -//.word 0x36b26834 -//.word 0xb66ebed6 -//.word 0x255e755d -//.word 0xcbfa34a6 -//.word 0xa3a4e5bf -//.word 0x0b8c0df1 -//.word 0xbfd158fe -//.word 0x08e979a7 -//.word 0x31423071 -//.word 0x3b29aca9 -//.word 0xd2ec14a6 -//.word 0x7f3b614e -//.word 0x1ed46edc -//.word 0x936052e0 -//.word 0xb997ed86 -//.word 0x9babc11c -//.word 0xe7e403cf -//.word 0x9f87f2b5 -//.word 0x12fd6811 -//.word 0x0b31afd2 -//.word 0x483a955c -//.word 0x2d3ac38b -//.word 0xba864af5 -//.word 0xbb077f70 -//.word 0x3ee009d5 -//.word 0x4a503803 -//.word 0xceda9926 -//.word 0xd8a4c739 -//.word 0x071e83c9 -//.word 0x43e307fc -//.word 0xabe498d3 -//.word 0xcfc35bac -//.word 0x207d690b -//.word 0xa54c2599 -//.word 0xefccce6d -//.word 0x4e5c508b -//.word 0x45c760aa -//.word 0x3c24c73b -//.word 0x75fafea6 -//.word 0x41a8fcd7 -//.word 0x74044cf9 -//.word 0x16436281 -//.word 0x5b192f6f -//.word 0xd520f3d0 -//.word 0xe97e5388 -//.word 0x80c3ab4e -//.word 0xfe10a5f8 -//.word 0x787e0bf9 -//.word 0x22bdd928 -//.word 0x06fc97c3 -//.word 0xfc09e5b3 -//.word 0xd6ba5811 -//.word 0xdb8b84ea -//.word 0x77885a3f -//.word 0x306eb550 -//.word 0xdc0d2f1b -//.word 0x11f0391f -//.word 0xde406b65 -//.word 0xb8e618c1 -//.word 0xb7f02656 -//.word 0x03361c58 -//.word 0x893d7d16 -//.word 0xf25b5537 -//.word 0xd51c1143 -//.word 0x2be59366 -//.word 0x04d78671 -//.word 0x79f6ef22 -//.word 0xe28b05a5 -//.word 0x49c7435a -//.word 0x1ea8bbd9 -//.word 0x2b21ad34 -//.word 0xcb75587c -//.word 0x57e41086 -//.word 0xe28991ee -//.word 0x2683935d -//.word 0xbd539f08 -//.word 0x95852079 -//.word 0x9e93bd92 -//.word 0xc506e6cf -//.word 0x26deadcb -//.word 0x7d34d806 -//.word 0xde1e34e5 -//.word 0xa7d32cfa -//.word 0xb20f9986 -//.word 0xcfb9dc3c -//.word 0x71c42b48 -//.word 0xa7532890 -//.word 0x4e20b83a -//.word 0x861e126e -//.word 0x625d165d -//.word 0xe42ee182 -//.word 0x28899e27 -//.word 0xdfab9e2c -//.word 0xff03ac04 -//.word 0xb94f9a00 -//.word 0xac0320d0 -//.word 0x58eae747 -//.word 0xd50fe05e -//.word 0xc4deda7c -//.word 0x878754f4 -//.word 0xada38fcf -//.word 0xb01ae8cd -//.word 0xe34465a6 -//.word 0xa64e8e95 -//.word 0xdce07e17 -//.word 0x9ffc39f1 -//.word 0x322a4070 -//.word 0x36d263f4 -//.word 0x21e9d7b0 -//.word 0xedcf88ab -//.word 0x0d78b00a -//.word 0xa5cba992 -//.word 0xfa470069 -//.word 0x28ecca1c -//.word 0x13593be6 -//.word 0x9f327430 -//.word 0x24c49d54 -//.word 0x1cec34a6 -//.word 0x1f34a4b5 -//.word 0x12401ace -//.word 0x9b6994c2 -//.word 0xd7a73be9 -//.word 0x50b4f267 -//.word 0x296e2fae -//.word 0x9c7e0945 -//.word 0xa73793c7 -//.word 0x01c0692e -//.word 0x53768851 -//.word 0xa58c63ac -//.word 0x16f43360 -//.word 0xd1838e7a -//.word 0x3c503b78 -//.word 0x735d450a -//.word 0xf4794e15 -//.word 0x9c6426fd -//.word 0xd2359c24 -//.word 0x02f994ae -//.word 0x4d9d5a88 -//.word 0x7e0e36a8 -//.word 0x409e4196 -//.word 0x8faa762b -//.word 0x6d790c98 -//.word 0xd66804ab -//.word 0xf544fe4e -//.word 0x98f85051 -//.word 0xe2685969 -//.word 0x3f9c1378 -//.word 0x9d21e80e -//.word 0xdaacc730 -//.word 0x78017659 -//.word 0x98132abf -//.word 0x266d55d7 -//.word 0x51d0bf1b -//.word 0x3e1ed80b -//.word 0xfd764d72 -//.word 0xbca1d9ea -//.word 0x3aad5ea2 -//.word 0x7fd7345f -//.word 0xcbafc0c1 -//.word 0xcc7649c8 -//.word 0x13cb0896 -//.word 0xc9877e77 -//.word 0x9ee50b1e -//.word 0x03e6bb32 -//.word 0x99f36309 -//.word 0xe9c4edb3 -//.word 0x5582f03a -//.word 0x4e288428 -//.word 0xc82f544a -//.word 0xeb6af4b4 -//.word 0x0c2f7505 -//.word 0xdbb737ec -//.word 0xdec7ffeb -//.word 0x1e90495b -//.word 0x20d5e0b1 -//.word 0x164babff -//.word 0x5745cabe -//.word 0x0d90e2ca -//.word 0x2d9cb4ae -//.word 0xadddf522 -//.word 0xf17159d2 -//.word 0x8603f261 -//.word 0x12efb8ae -//.word 0x8ba76956 -//.word 0xa855937a -//.word 0x95c2eec2 -//.word 0xeb76f0a1 -//.word 0xdf219cdb -//.word 0xba399b45 -//.word 0x89e58dcc -//.word 0x151aa1b9 -//.word 0x15036334 -//.word 0xa3a7d606 -//.word 0xedc6c3a3 -//.word 0x2d035067 -//.word 0xdb49d420 -//.word 0x2067eacd -//.word 0x8ffdc5a5 -//.word 0x109cc35b -//.word 0x1c2944a1 -//.word 0x3082bceb -//.word 0x7b640775 -//.word 0xda8dfd87 -//.word 0x071d47f8 -//.word 0x0e4271f1 -//.word 0x00143ff3 -//.word 0xeabe451b -//.word 0x08dfb2a5 -//.word 0x37306db0 -//.word 0xa9666340 -//.word 0xdc5a1f89 -//.word 0xcd679b6b -//.word 0x69135539 -//.word 0x44f2a6be -//.word 0x8dc84f82 -//.word 0x42ee5549 -//.word 0xa0f710dd -//.word 0xde927e0d -//.word 0x1ab2ddf6 -//.word 0x94ed7881 -//.word 0x1a22c12d -//.word 0xc35fa00f -//.word 0xe0020b17 -//.word 0x301ed794 -//.word 0x5320cdfa -//.word 0x81b201e3 -//.word 0x7cdf5f55 -//.word 0xc3788743 -//.word 0x09b7db56 -//.word 0xe523d5ed -//.word 0xcbb39f62 -//.word 0x3b36dd8f -//.word 0x38f2cd90 -//.word 0xfc8c93cb -//.word 0xea28ce2e -//.word 0xc4d06fb8 -//.word 0x1e1acb3b -//.word 0x1305ef60 -//.word 0x362533eb -//.word 0xcb001240 -//.word 0x38b73826 -//.word 0xb6e9ddcc -//.word 0x4cd4520a -//.word 0xfebdd9e8 -//.word 0x4292ba64 -//.word 0xb3cf9370 -//.word 0x099ef03b -//.word 0x49421bb1 -//.word 0x39b53645 -//.word 0x179086ee -//.word 0x8a2c126f -//.word 0xd9076ddc -//.word 0x5b69d05a -//.word 0x2f476b26 -//.word 0x2c67fdd9 -//.word 0x1bc5a3ea -//.word 0x2436ed74 -//.word 0x874b3739 -//.word 0x8d7837e8 -//.word 0xbd75d29b -//.word 0x52e534a4 -//.word 0xed361f89 -//.word 0x88c8834d -//.word 0xab5150f1 -//.word 0xe280883b -//.word 0x6ee098b6 -//.word 0x3b00e8fa -//.word 0x12d1b12d -//.word 0x104f0fca -//.word 0x576357a1 -//.word 0x0308aa20 -//.word 0x60aecad0 -//.word 0x5adb2d22 -//.word 0x3418506c -//.word 0x7d0b4e2f -//.word 0x40e1b19b -//.word 0x7cef8855 -//.word 0xd398ba77 -//.word 0x867199d9 -//.word 0xa1a3ba8f -//.word 0x739105b2 -//.word 0x41bb0864 -//.word 0x3ce2900e -//.word 0xaf6e7bec -//.word 0x7d0cc8cc -//.word 0xcb9bf012 -//.word 0xfa497900 -//.word 0xd8f9c834 -//.word 0x17e93772 -//.word 0xfe9167a4 -//.word 0x5eced81f -//.word 0xc83fb628 -//.word 0xfdeff6b7 -//.word 0xa635a27b -//.word 0x45d9711d -//.word 0x6c789bc9 -//.word 0x2d2aebeb -//.word 0xd1611636 -//.word 0xcc154beb -//.word 0xf11e0b58 -//.word 0xe3e13b9f -//.word 0xcc2e78b8 -//.word 0x5169aab9 -//.word 0xc5e8dc55 -//.word 0x9c9d4ba3 -//.word 0x23f5bc21 -//.word 0x6fff13f9 -//.word 0x93d12283 -//.word 0x1728bf0a -//.word 0xa54e19d3 -//.word 0x04414c5b -//.word 0x4b1132e1 -//.word 0x4e8a7c24 -//.word 0x5d13026e -//.word 0x2ed658d1 -//.word 0x1721a2b1 -//.word 0x800ca983 -//.word 0x995d2ed3 -//.word 0x48a87e8c -//.word 0x66bb4674 -//.word 0x2a39a9f6 -//.word 0xe5849024 -//.word 0xf0e041fc -//.word 0xe3d634ea -//.word 0x08d7218f -//.word 0x10225ec1 -//.word 0x04e868d3 -//.word 0x7eadc016 -//.word 0x18f1f89f -//.word 0x25100d4b -//.word 0x9f67f701 -//.word 0x61b87f37 -//.word 0x96cf51b8 -//.word 0x726652a4 -//.word 0x204733b8 -//.word 0xfbb047cf -//.word 0x00fb91a9 -//.word 0x837e22ec -//.word 0x22b1a268 -//.word 0xf88e2c9f -//.word 0x133e5f85 -//.word 0x27f1b184 -//.word 0x830e07c3 -//.word 0x458c83a8 -//.word 0xca9f9d9c -//.word 0x6998760e -//.word 0x610668ba -//.word 0x0f22e22b -//.word 0x656a737e -//.word 0x978b246a -//.word 0x17840b7d -//.word 0xc4091da8 -//.word 0x5f2544fe -//.word 0x3e24b2b9 -//.word 0x44b0747e -//.word 0x103a4ae2 -//.word 0x759cb62c -//.word 0x2afc535c -//.word 0xc3f3686d -//.word 0xe0eebdd8 -//.word 0xa5d5ad59 -//.word 0x6aeb7df5 -//.word 0xb3f6ec3c -//.word 0x629f0bcc -//.word 0x2b1b4f16 -//.word 0x490be565 -//.word 0x6fa1451c -//.word 0x02050a3e -//.word 0x85f70134 -//.word 0x55b580cb -//.word 0x961ff97d -//.word 0x6d19cef1 -//.word 0x6f3167c5 -//.word 0x5a82838a -//.word 0x03d7cb10 -//.word 0x9014ade4 -//.word 0xe7d26718 -//.word 0x674a6242 -//.word 0xd574c2c7 -//.word 0x99703b5a -//.word 0x2a2426bf -//.word 0xc727d4d5 -//.word 0x68dd22d3 -//.word 0xf4e44dd2 -//.word 0xb4af088c -//.word 0x0871cc63 -//.word 0x583d70a5 -//.word 0x4e6bf90e -//.word 0x423db38e -//.word 0xf6c3814d -//.word 0x84fb71ed -//.word 0x943d930f -//.word 0xd2d60c18 -//.word 0xa0f46635 -//.word 0x07c22a9c -//.word 0xf4d3b115 -//.word 0xa1c437b9 -//.word 0x511d31fa -//.word 0x40800000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00011128 -//// expected output -//.word 0x2529d5d0 -//.word 0xf4625ae7 -//.word 0x01397a41 -//.word 0xb5184bbd -//.word 0x45b840c3 -//.word 0xfee6652a -//.word 0x467ff1a4 -//.word 0x9c622604 -//.word 0x991157b1 -//.word 0x6393136c -//.word 0xd123a515 -//.word 0xe4a0412d -//.word 0xd2bf2b32 -//.word 0x27dffb65 -//.word 0x2e11a630 -//.word 0x4523c31d -//// SHA512LongMsgvector_88 -//// vector length -//.word 0x00011440 -//// input message -//.word 0xde4fbfd5 -//.word 0x53cdf370 -//.word 0x19f25afa -//.word 0x82dc6b99 -//.word 0x70f4bb1e -//.word 0xbbc37f80 -//.word 0xd3084c88 -//.word 0xa70722cd -//.word 0xc523a9e3 -//.word 0xc2afbad0 -//.word 0xdc0221bf -//.word 0xdec9a2f9 -//.word 0x44a23a10 -//.word 0xa0e6a65d -//.word 0x3cc52aad -//.word 0x01998b38 -//.word 0x97745dd3 -//.word 0xcefb8566 -//.word 0x3d78f69f -//.word 0x292abee8 -//.word 0xa8e04697 -//.word 0x05c6d565 -//.word 0x677e5722 -//.word 0xae725da7 -//.word 0x9e69640b -//.word 0x3f595a1a -//.word 0x837c5e02 -//.word 0x2aa6c850 -//.word 0xe3d6691b -//.word 0xb40b147f -//.word 0x9b595c4e -//.word 0x763ba001 -//.word 0x202b45f5 -//.word 0xdd7043d4 -//.word 0xf838e350 -//.word 0xaae6c718 -//.word 0x3ead2a04 -//.word 0x735e6993 -//.word 0x227ec298 -//.word 0x209c5c30 -//.word 0x66e188f7 -//.word 0x6fe9477c -//.word 0xe2d10cf2 -//.word 0x7192c328 -//.word 0x018d11bb -//.word 0x0b67de8a -//.word 0x4216116a -//.word 0x763c9a1b -//.word 0xb8b4b67b -//.word 0xbf6b6efa -//.word 0x8a72614e -//.word 0x4751c468 -//.word 0x749da7a6 -//.word 0x44cd7a4a -//.word 0x4449cf2b -//.word 0x3ec462aa -//.word 0x5dcc56e8 -//.word 0x939fc136 -//.word 0x38416bcd -//.word 0xf4cbd3c0 -//.word 0xde06732e -//.word 0xe53845bc -//.word 0x703e8642 -//.word 0x41dbbac5 -//.word 0x9f50f0a6 -//.word 0xb42d4718 -//.word 0x3466b1d7 -//.word 0x3fa9f718 -//.word 0x89effebb -//.word 0xb85248c8 -//.word 0x0d1ebd19 -//.word 0x472aac54 -//.word 0xc4690d1d -//.word 0xeabc0989 -//.word 0xc50abcd5 -//.word 0xf1933958 -//.word 0xbb81ceb6 -//.word 0x83c08a57 -//.word 0x6510fd17 -//.word 0x18593f3f -//.word 0x153e34b5 -//.word 0xfcf40d6f -//.word 0x3455122d -//.word 0xd2309f68 -//.word 0xbde46d85 -//.word 0x0f2d134f -//.word 0xbe3dcda4 -//.word 0x7b0f7b6e -//.word 0xdaf8edd6 -//.word 0xb47f5db4 -//.word 0xca6e3d49 -//.word 0xaa293430 -//.word 0xd73f6392 -//.word 0x243fec9a -//.word 0x61cdb528 -//.word 0x39f469ca -//.word 0x5bbec0e8 -//.word 0xd802013e -//.word 0xcc7ec58f -//.word 0x4125fd98 -//.word 0x50ba3644 -//.word 0x899e1c1e -//.word 0x96e73d0b -//.word 0x1ab11039 -//.word 0xdfb93653 -//.word 0x3128fff7 -//.word 0x85ac3069 -//.word 0x5fcd0489 -//.word 0x727f7002 -//.word 0x08f3abc5 -//.word 0xa4b3eeb6 -//.word 0xe6ee79a4 -//.word 0xb010d67f -//.word 0x879661c5 -//.word 0x3c21083e -//.word 0xcbc950e9 -//.word 0x83b39836 -//.word 0x67e6a275 -//.word 0xd55a4f8f -//.word 0x6552aaf4 -//.word 0x14ec28d4 -//.word 0xa2f72f92 -//.word 0x3804d476 -//.word 0x4ec0e9a2 -//.word 0xcc813747 -//.word 0x6f1e0818 -//.word 0x6f04e9ff -//.word 0x5f86ad0f -//.word 0x5475b5bb -//.word 0x49f16f45 -//.word 0xc27e1d79 -//.word 0xb05bd89a -//.word 0x950fd49d -//.word 0xe844e595 -//.word 0xbbd8426f -//.word 0x9b328adf -//.word 0xb8d2049a -//.word 0x462c2bc6 -//.word 0x22b76aae -//.word 0xb94124bb -//.word 0x2685f7a0 -//.word 0x9aff42d4 -//.word 0x01ffe445 -//.word 0xe2fd474b -//.word 0x872c9eda -//.word 0x5f516afd -//.word 0xa0d6437f -//.word 0x301ad5eb -//.word 0xc60c29b8 -//.word 0x4df826bd -//.word 0x89a157eb -//.word 0xfc8fee3a -//.word 0x0baa09e4 -//.word 0x5d0835d2 -//.word 0x84043053 -//.word 0xdf90f414 -//.word 0xbeccf04d -//.word 0xc8d79938 -//.word 0x9ae421c7 -//.word 0xb1918696 -//.word 0x8a75cf1f -//.word 0x07f8932d -//.word 0x1568ba93 -//.word 0x8c49871d -//.word 0x57ecd7c7 -//.word 0xd443a32d -//.word 0x7df3cc43 -//.word 0xc9ab1846 -//.word 0x4db477f2 -//.word 0x27ca8cf6 -//.word 0x9c2b68a5 -//.word 0x00ed99ee -//.word 0xd694638e -//.word 0x39e44d84 -//.word 0x7bf4e0c5 -//.word 0x0b84ab32 -//.word 0x9c908ac7 -//.word 0x83262815 -//.word 0x6174c3f2 -//.word 0x03252f6f -//.word 0x86ee1e0a -//.word 0xbf639e25 -//.word 0xda10e3b7 -//.word 0x40c54742 -//.word 0xbf318f05 -//.word 0xe5b27072 -//.word 0xac6c52e2 -//.word 0x5d995388 -//.word 0xae1f8fa3 -//.word 0x2d689ff8 -//.word 0xe26e5f80 -//.word 0x3015f45e -//.word 0xfdbe0e13 -//.word 0x13196bf5 -//.word 0xc53a9dde -//.word 0xd5f00c21 -//.word 0x95523ec2 -//.word 0x4d9a56e6 -//.word 0xdd37db88 -//.word 0xa31dbb6e -//.word 0x9f60905b -//.word 0xd5012187 -//.word 0xf3082c4c -//.word 0x34d26322 -//.word 0x84adb4cd -//.word 0xe5a2cdd5 -//.word 0x1192e037 -//.word 0x6185a35a -//.word 0xed3e9c44 -//.word 0xf5139b0e -//.word 0x80fb8895 -//.word 0x42e95e73 -//.word 0xc358782e -//.word 0xbe270cae -//.word 0xc7a8f5f5 -//.word 0x31f4b50a -//.word 0x2f81ba36 -//.word 0x39f6e073 -//.word 0xb23d3822 -//.word 0xc7da08fc -//.word 0x9a7c124b -//.word 0xa0d2195a -//.word 0x47a0a22a -//.word 0xdd12f866 -//.word 0xad507299 -//.word 0x6b52f89f -//.word 0xd2f6c45a -//.word 0x8b5066a6 -//.word 0x51410b8e -//.word 0x534bfec0 -//.word 0xd9a36f3e -//.word 0x2b887457 -//.word 0xafd44dd6 -//.word 0x51d1ec79 -//.word 0x274db5a4 -//.word 0x55f18257 -//.word 0x2fceea5e -//.word 0x9e39c3c7 -//.word 0xc5d9e599 -//.word 0xe4fe31c3 -//.word 0x7c34d253 -//.word 0xb419c3e8 -//.word 0xfb6b916a -//.word 0xef6563f8 -//.word 0x7d4c3722 -//.word 0x4a456e59 -//.word 0x52698ba3 -//.word 0xd01b3894 -//.word 0x5d998a79 -//.word 0x5bd285d6 -//.word 0x9478e313 -//.word 0x1f551172 -//.word 0x84e27b44 -//.word 0x1f16095d -//.word 0xca7ce9c5 -//.word 0xb68890b0 -//.word 0x9a2bfbb0 -//.word 0x10a53b2a -//.word 0x3b9b3007 -//.word 0xae6995ab -//.word 0x89b93c2b -//.word 0xe5559bba -//.word 0x73398865 -//.word 0x5fed4101 -//.word 0x7b11af61 -//.word 0x9939eccc -//.word 0x38fc02ad -//.word 0x6448f68d -//.word 0xd7f8053f -//.word 0x64a92d5a -//.word 0x96c9efed -//.word 0x94f0546d -//.word 0x47742ef2 -//.word 0xbf38a0a3 -//.word 0xd3c4e06f -//.word 0x089b3cff -//.word 0xb5c85be8 -//.word 0x64bbc624 -//.word 0x7a53a6c3 -//.word 0x1b3cd0de -//.word 0x487bfecd -//.word 0x4a475f99 -//.word 0x541b53b4 -//.word 0x64096fe8 -//.word 0x6a51c88e -//.word 0xac326e00 -//.word 0x69003651 -//.word 0xbc77bd3b -//.word 0xc44fa958 -//.word 0x02103295 -//.word 0x0228e2e5 -//.word 0x3e3b9832 -//.word 0x3fbad399 -//.word 0x05b72dd6 -//.word 0xa9f826fd -//.word 0x414a236c -//.word 0x0417b7fd -//.word 0xaf3b2080 -//.word 0x27141568 -//.word 0x5fd8bfc4 -//.word 0x7c2c0571 -//.word 0x37f20c8e -//.word 0x8362fe31 -//.word 0x705c0b58 -//.word 0x50fcae23 -//.word 0x18703240 -//.word 0x090674a6 -//.word 0x8f89ea86 -//.word 0x69cee47e -//.word 0x0a8a1211 -//.word 0x3f664754 -//.word 0x13567ce9 -//.word 0xf0261831 -//.word 0x06566fbe -//.word 0xf0278807 -//.word 0x95f62360 -//.word 0x4dc9fa29 -//.word 0x46284845 -//.word 0x252e88ce -//.word 0xf0df7f06 -//.word 0x2bbc7c91 -//.word 0x4195dfe2 -//.word 0x269fd8f4 -//.word 0x3bc6713a -//.word 0x7244cfd8 -//.word 0xb273b413 -//.word 0x7ddf4906 -//.word 0xd0a01b97 -//.word 0x4ae763aa -//.word 0x91d68a95 -//.word 0xf295ecd3 -//.word 0x47a2ddfc -//.word 0x1e68e9f4 -//.word 0x17146063 -//.word 0x8ea41366 -//.word 0x7a405885 -//.word 0x95ce54e4 -//.word 0xbec179bd -//.word 0x9b314d0d -//.word 0x82316d8e -//.word 0x9a5dd2e6 -//.word 0x3db2541e -//.word 0xa1a36c55 -//.word 0xb8683eb6 -//.word 0x549ad7a7 -//.word 0x8ffdb343 -//.word 0x6a9d820b -//.word 0xb41c2bd8 -//.word 0x2e4a1215 -//.word 0xecf6972a -//.word 0xfe04df3b -//.word 0x50c0d613 -//.word 0xcf72745b -//.word 0xcd334010 -//.word 0xa7fe1334 -//.word 0xa50a1fc3 -//.word 0x21572fe8 -//.word 0xec873071 -//.word 0xedf0f181 -//.word 0x0bef2784 -//.word 0x4e7fb468 -//.word 0x400a290b -//.word 0x9a7f89ef -//.word 0x1ca45035 -//.word 0xbdaeb3c9 -//.word 0x040f2ada -//.word 0xb68f2c8d -//.word 0xb19e39f2 -//.word 0x18e81e37 -//.word 0xb02b751b -//.word 0x8a456ba6 -//.word 0xe392c617 -//.word 0x4874261f -//.word 0xfe338a4c -//.word 0xa00817c8 -//.word 0x0a741543 -//.word 0x76d63b2e -//.word 0xe53d2c2a -//.word 0xc17b41c0 -//.word 0xc07b8952 -//.word 0x0bd40e51 -//.word 0xa09d5ab1 -//.word 0xf4843a9a -//.word 0xdd1ac261 -//.word 0xb07191b6 -//.word 0xa6e9571f -//.word 0x854794a5 -//.word 0x7c07a2cc -//.word 0x4ef4f5c9 -//.word 0xb3f5a2f0 -//.word 0xfb2a1e6c -//.word 0xf4374832 -//.word 0x0ee0aa38 -//.word 0xbdd7fce1 -//.word 0x1fd1eabc -//.word 0xdfdf186f -//.word 0x59fc62ee -//.word 0xfee268f1 -//.word 0xfa234aa4 -//.word 0x1574b0a0 -//.word 0xd74c0e1a -//.word 0xf0ae265a -//.word 0xd742ce6f -//.word 0xb0abf322 -//.word 0x7315de28 -//.word 0x4b0db69c -//.word 0x3c9646ac -//.word 0x09790192 -//.word 0x55dc43c6 -//.word 0x0816da71 -//.word 0xf4c2c525 -//.word 0xb9123bcc -//.word 0xe567f0df -//.word 0x601e93d9 -//.word 0x08ac9bea -//.word 0x98ed43ef -//.word 0xceb9d3a2 -//.word 0xcdb9220e -//.word 0xc0785947 -//.word 0xc0bdf957 -//.word 0xf819207b -//.word 0x06bc0890 -//.word 0xa58cd0c8 -//.word 0x89797fa1 -//.word 0x8b0a4618 -//.word 0x063c0519 -//.word 0x818d113b -//.word 0x8e5435aa -//.word 0xf153f664 -//.word 0x058f1ba9 -//.word 0x5c606dac -//.word 0xa6c4bc8f -//.word 0xd4f8228e -//.word 0x7d4a8c7b -//.word 0x8029756a -//.word 0xeb7ef5ad -//.word 0x1b3ffb03 -//.word 0x2540d60c -//.word 0x754dfb00 -//.word 0xb57702a1 -//.word 0xf1abf16e -//.word 0xf889bd1a -//.word 0x05720e3c -//.word 0x9ee34348 -//.word 0xbd02b6be -//.word 0x2e7741a1 -//.word 0x387d012b -//.word 0x7f3959bf -//.word 0x294a3a1f -//.word 0x40a1a2df -//.word 0x5793631a -//.word 0x712c2663 -//.word 0x1ec7affe -//.word 0xe7db6351 -//.word 0xec180795 -//.word 0xccb3cad1 -//.word 0xc5fe8609 -//.word 0x1d3b43b2 -//.word 0xc0b2fd6a -//.word 0x2a01a7e6 -//.word 0x87b46f2c -//.word 0x19154402 -//.word 0xdb4595a6 -//.word 0x648c5cbf -//.word 0x0dee5c94 -//.word 0x56ffa67c -//.word 0x86f86295 -//.word 0x9209ccb9 -//.word 0x40f17dae -//.word 0x8ccdec9d -//.word 0x4b2d34c6 -//.word 0x0e6d1871 -//.word 0x49434428 -//.word 0xb594d523 -//.word 0xf28c1c04 -//.word 0x71ed9fc5 -//.word 0x91a761ee -//.word 0x08aa640b -//.word 0x85f86b5d -//.word 0x94fe04d0 -//.word 0xc124c62d -//.word 0x00a3d891 -//.word 0x4c96b31e -//.word 0x8f5528f0 -//.word 0xc2fea452 -//.word 0x5554b332 -//.word 0xd1cdc3d3 -//.word 0xbce62bc2 -//.word 0xbdba6b0b -//.word 0x00d3b5ac -//.word 0xdc40ad4a -//.word 0xb3e76e23 -//.word 0x1a1dcd44 -//.word 0x3a74e1fc -//.word 0x76d4c390 -//.word 0x4fce9230 -//.word 0x842cba2a -//.word 0x7dcd765e -//.word 0xe9b094f2 -//.word 0xa74e7947 -//.word 0xe22d642b -//.word 0x81b2f750 -//.word 0xbe37f3fc -//.word 0x145d4303 -//.word 0x5fa33cf3 -//.word 0x3f38238e -//.word 0xbd0eef7d -//.word 0x31305142 -//.word 0x6355f26f -//.word 0xf0b5fc15 -//.word 0xef1bdb80 -//.word 0xd53c4521 -//.word 0x964777cc -//.word 0x0dbdc224 -//.word 0x9e834753 -//.word 0x1a36fffe -//.word 0xe2befe77 -//.word 0x5026f835 -//.word 0x52aa0482 -//.word 0x5812a074 -//.word 0x713ff51e -//.word 0xb0045d07 -//.word 0xd53723dc -//.word 0x29078a61 -//.word 0xaa8f10ad -//.word 0x68acf397 -//.word 0x2f0cf56c -//.word 0x66885ce3 -//.word 0x37b43e52 -//.word 0xf1b4fb21 -//.word 0xaa510b7f -//.word 0x284cfa55 -//.word 0x02f1b078 -//.word 0x02f0f623 -//.word 0xce6936a4 -//.word 0xc7468255 -//.word 0x32cdd8ce -//.word 0x9675a559 -//.word 0x64f987a7 -//.word 0xddac57c1 -//.word 0x310c6740 -//.word 0xe49908c1 -//.word 0x76e85094 -//.word 0x43f31ab4 -//.word 0xa8b34dfc -//.word 0x67f16297 -//.word 0x4d5920b9 -//.word 0x12d0aa8c -//.word 0x8007bc6e -//.word 0xd7503259 -//.word 0x71b1caa2 -//.word 0xa2372ae7 -//.word 0xe28d2543 -//.word 0x2ecd3ac3 -//.word 0xab965d1e -//.word 0x8d5ffba0 -//.word 0x370b3868 -//.word 0xa3bd7bd3 -//.word 0x05ed2c38 -//.word 0xabbcbcd6 -//.word 0x2884e60a -//.word 0xb1b435c6 -//.word 0xc7dbc73e -//.word 0x170250e4 -//.word 0x9e3f6197 -//.word 0x1087eb17 -//.word 0x7bc4ffbd -//.word 0x2727d769 -//.word 0xc2c01abb -//.word 0xb94c5c86 -//.word 0xe94ee481 -//.word 0x7761b340 -//.word 0xfcccc263 -//.word 0xe6578a0e -//.word 0x1b5dc999 -//.word 0xdf238488 -//.word 0xf76848bd -//.word 0x0e3db6ec -//.word 0x59173f50 -//.word 0x77232b9c -//.word 0x9bd9e035 -//.word 0xecd4619e -//.word 0x2ce11533 -//.word 0x9856ca1b -//.word 0x10a5f978 -//.word 0x78304be0 -//.word 0x5e5f5d11 -//.word 0xddf0c0e0 -//.word 0xc18f4573 -//.word 0xeba777b0 -//.word 0xf87768f5 -//.word 0x1d68b10a -//.word 0x559eb454 -//.word 0xbfcd244b -//.word 0x414ec82e -//.word 0x72727bf5 -//.word 0xb7167887 -//.word 0xac77d42d -//.word 0xc5484c46 -//.word 0x3502413d -//.word 0x0e7c01b9 -//.word 0xaabb4813 -//.word 0x4b0b070d -//.word 0xfe4e63c1 -//.word 0xc59501d7 -//.word 0xf4ed81fb -//.word 0xdc7c488e -//.word 0xa7cc839c -//.word 0x8366680f -//.word 0x03a3bf22 -//.word 0xc1bfa218 -//.word 0x492f812d -//.word 0x323469cd -//.word 0x8eb18504 -//.word 0x853ae536 -//.word 0x3c6d7e10 -//.word 0xfc8572be -//.word 0x902c925e -//.word 0xee9121b5 -//.word 0x1abbdb21 -//.word 0x481d36cf -//.word 0x416ae82e -//.word 0x07aaa9a4 -//.word 0xbc8e3a7f -//.word 0xc000a62e -//.word 0x1affc8b1 -//.word 0x19aa0d4e -//.word 0x3a9a7c86 -//.word 0x4d75f347 -//.word 0xd4c0b363 -//.word 0xacf51e41 -//.word 0xefd6c0d3 -//.word 0x18008dc7 -//.word 0x68c36902 -//.word 0x8931ee4a -//.word 0x72756942 -//.word 0x8a67259c -//.word 0x105ded8a -//.word 0xba43cc75 -//.word 0x9cee17f2 -//.word 0x4cadadf2 -//.word 0x44217e38 -//.word 0x874f4a11 -//.word 0x88f4ab3f -//.word 0x47185636 -//.word 0xbde69e8b -//.word 0x7abb3aa9 -//.word 0x8d7d47c6 -//.word 0xa42e9115 -//.word 0x74c10e3d -//.word 0x5b2cab0b -//.word 0x44be4b63 -//.word 0xccb30d7d -//.word 0xa306ce4e -//.word 0x3486f043 -//.word 0x882c5935 -//.word 0x67acbe9a -//.word 0xc14a21f8 -//.word 0x4def98a0 -//.word 0x707c5198 -//.word 0x605ed3d9 -//.word 0x896386ba -//.word 0x30cb76ad -//.word 0x56a35429 -//.word 0xdf4ebee7 -//.word 0xf365bf51 -//.word 0xa5c19a38 -//.word 0xd2d5c3c5 -//.word 0x4c412fb2 -//.word 0x38a5cdb9 -//.word 0xb5b3554d -//.word 0xbf894089 -//.word 0x523d1766 -//.word 0xd2b9f130 -//.word 0xaac9383b -//.word 0x3472abd2 -//.word 0xd986a970 -//.word 0x7975ac33 -//.word 0x0c66148d -//.word 0x8a86263d -//.word 0x09a0547d -//.word 0x25efbe7d -//.word 0xa530fa11 -//.word 0x5cfa10a6 -//.word 0x4c52c97b -//.word 0x127b2a0e -//.word 0x7e0b3bd4 -//.word 0x81440d2c -//.word 0x4ca0fa96 -//.word 0xb6ae2f20 -//.word 0xde1d6822 -//.word 0x1216fb2b -//.word 0xf0d0183b -//.word 0xcb5e4f33 -//.word 0x51cb5289 -//.word 0x6a68fd40 -//.word 0x63659318 -//.word 0x4b9f4b02 -//.word 0x9db90bd6 -//.word 0x206e7348 -//.word 0x0c251d19 -//.word 0x6ec6238a -//.word 0xcdcde216 -//.word 0x0e9dfe60 -//.word 0x9516a76b -//.word 0xad691a09 -//.word 0x2a2b6a96 -//.word 0x4da980e5 -//.word 0xe77c607b -//.word 0xc15daffb -//.word 0x3c3a72e2 -//.word 0x35891974 -//.word 0x2bdcbcf7 -//.word 0xa4b5a41e -//.word 0xcc9c0dc8 -//.word 0x60702aeb -//.word 0xcafb6aca -//.word 0x8ec8fa6f -//.word 0xe4398b55 -//.word 0xa6d45565 -//.word 0x6dde5c23 -//.word 0xf82bf22a -//.word 0xcd347dd6 -//.word 0x226a7a40 -//.word 0xfdcac26f -//.word 0x9bb20ccc -//.word 0x0ff3b4d7 -//.word 0x2b27bb19 -//.word 0xa3450e59 -//.word 0x70720b13 -//.word 0x731a4126 -//.word 0x5b4077cd -//.word 0xc812f0d0 -//.word 0xb0c1eefc -//.word 0x038f75d0 -//.word 0x8a2a5179 -//.word 0x15385b01 -//.word 0xd533f7c3 -//.word 0x0777e122 -//.word 0xd2992a7a -//.word 0x73fb7d57 -//.word 0x979da7e5 -//.word 0x083656a8 -//.word 0x8c84216d -//.word 0x0be0c981 -//.word 0xef15bf20 -//.word 0xd072e630 -//.word 0x511e9930 -//.word 0x45acf06b -//.word 0x17ef3f71 -//.word 0x6810e0c7 -//.word 0xf9dd33de -//.word 0xcc64e242 -//.word 0x86c16a14 -//.word 0x1834d7ba -//.word 0x9e77ced5 -//.word 0x874ed173 -//.word 0xf75fbf87 -//.word 0x69449a96 -//.word 0x99df8db2 -//.word 0xa1ed2eac -//.word 0x62de0086 -//.word 0x25e53c27 -//.word 0x824bd152 -//.word 0x8208a9d9 -//.word 0x00942e0e -//.word 0x55fb0d7b -//.word 0x343039d3 -//.word 0xd2a33428 -//.word 0x4a158a5d -//.word 0x41ab9edf -//.word 0xc542a890 -//.word 0x7b03ff04 -//.word 0xfa3794f0 -//.word 0x725cbfdf -//.word 0x91783f27 -//.word 0xa7ad7c1c -//.word 0x080e0e83 -//.word 0xb2b1834a -//.word 0x2f055d76 -//.word 0xbd665b5c -//.word 0xadeffa14 -//.word 0x09903a2b -//.word 0x7960a598 -//.word 0x67348ef1 -//.word 0x627097df -//.word 0xc01d76d0 -//.word 0x883cf8eb -//.word 0x8f5a4549 -//.word 0xe0656762 -//.word 0x61be06c5 -//.word 0xb48f750d -//.word 0x5c5ff310 -//.word 0x21e42a59 -//.word 0xb518fcd9 -//.word 0x978f7fd9 -//.word 0x38074633 -//.word 0x5d41e3c2 -//.word 0xc40fa917 -//.word 0x0aafb76d -//.word 0xcc5732df -//.word 0x0d11d1d9 -//.word 0xd7c99fcd -//.word 0x25a4fc27 -//.word 0x0194e582 -//.word 0xea2a761c -//.word 0x78abad87 -//.word 0x436571a2 -//.word 0x0043d3c8 -//.word 0xeda09347 -//.word 0x7059e614 -//.word 0xfa2676bd -//.word 0x322aab9e -//.word 0x50c82958 -//.word 0xc6b99a7f -//.word 0x265bad93 -//.word 0x404c5e32 -//.word 0x8a38798b -//.word 0xc6ef5916 -//.word 0xdebbf683 -//.word 0x13f01ff0 -//.word 0x56c4035e -//.word 0xf661f666 -//.word 0x7c397228 -//.word 0xd49a5c85 -//.word 0xad82898e -//.word 0x21b4813b -//.word 0x990b8361 -//.word 0xeb0fc9de -//.word 0xc6c60c16 -//.word 0x50cd4ba4 -//.word 0x0da6c949 -//.word 0x03545528 -//.word 0x1c25cd36 -//.word 0xcbd0e5ec -//.word 0xf2bf253f -//.word 0x04ae31d1 -//.word 0x67754d69 -//.word 0x1c2220a1 -//.word 0xa14bb8de -//.word 0x16a3cf85 -//.word 0xa0ca4d6c -//.word 0x0b6a0e8f -//.word 0xb37fe405 -//.word 0xa4f6e032 -//.word 0x007acd3d -//.word 0xa18bfec4 -//.word 0x00d04acf -//.word 0x55ae5403 -//.word 0x00191019 -//.word 0x28aa828e -//.word 0xa2f2c99b -//.word 0x140f5d67 -//.word 0x5a7c957c -//.word 0x282e6c77 -//.word 0xf1dc8404 -//.word 0x089e6b0a -//.word 0x06b91e23 -//.word 0x6bb9cb4f -//.word 0x88c1dbe9 -//.word 0x9c2030da -//.word 0x3d24ab0c -//.word 0xf933f222 -//.word 0x3e177066 -//.word 0x779a9d02 -//.word 0x78537f74 -//.word 0x1cbf713c -//.word 0x2c9423d7 -//.word 0x8351e2f1 -//.word 0x701a19d7 -//.word 0x5cc3182b -//.word 0xad2b15db -//.word 0xeacb7053 -//.word 0x1f8e3cf2 -//.word 0x83e3fabb -//.word 0x5811a74e -//.word 0x13ccfa16 -//.word 0xbd05e7c3 -//.word 0x990667fb -//.word 0x07bd7b4c -//.word 0xa8586e66 -//.word 0xc3135b87 -//.word 0xe74ef036 -//.word 0xd2e37134 -//.word 0x92b600b0 -//.word 0xea8e1bba -//.word 0xf72366fa -//.word 0x1378aba2 -//.word 0xfa6a1fa1 -//.word 0x2c89e71a -//.word 0x9228da14 -//.word 0x63b08973 -//.word 0x493a7c27 -//.word 0xc05cbfa3 -//.word 0xbf429e90 -//.word 0x9b01acc3 -//.word 0x28290a6d -//.word 0x2199e592 -//.word 0xca9841bd -//.word 0xd321f5f1 -//.word 0x807df7e2 -//.word 0x0718da65 -//.word 0x3a8d9526 -//.word 0x65038699 -//.word 0x7abcb733 -//.word 0x6beb5fd9 -//.word 0xd8c6ac99 -//.word 0xeaddbf98 -//.word 0x7faaf94b -//.word 0x876975ea -//.word 0xad2ad522 -//.word 0x3b24420b -//.word 0x374cae59 -//.word 0xd2265cd6 -//.word 0x04dba310 -//.word 0x708def4e -//.word 0x8de708c9 -//.word 0x07f89719 -//.word 0x6341e6ee -//.word 0xe30ce700 -//.word 0xa9007849 -//.word 0x1ef3e571 -//.word 0x95ffae8a -//.word 0x2cd88bfd -//.word 0xf35caec4 -//.word 0x516c48da -//.word 0xa3fb4ef0 -//.word 0x25647d62 -//.word 0x16019c69 -//.word 0x17f90192 -//.word 0xd559566f -//.word 0xe7679d8c -//.word 0xfa3372a4 -//.word 0x2b6e9015 -//.word 0xb47f9792 -//.word 0xcbd40d18 -//.word 0xc776a223 -//.word 0x85e1b821 -//.word 0x0a122227 -//.word 0x69e12ce3 -//.word 0xe791dcd2 -//.word 0x5ea678b2 -//.word 0xdff6483b -//.word 0x9b039d0a -//.word 0x048813de -//.word 0x2f521206 -//.word 0x7d519b1a -//.word 0x7aef41ea -//.word 0x05a075b4 -//.word 0xb2bb079a -//.word 0x6c88ea52 -//.word 0x5f9a3820 -//.word 0x155f7501 -//.word 0xdef51829 -//.word 0x763f47b0 -//.word 0xe239e389 -//.word 0x9b88c4b3 -//.word 0xee5646b3 -//.word 0xa35c0441 -//.word 0xdd40e342 -//.word 0x412253f6 -//.word 0x5a72d173 -//.word 0x3c04b052 -//.word 0x68661aa8 -//.word 0xf0715238 -//.word 0xdc1e3be6 -//.word 0xcb9b1e6f -//.word 0xde9ea858 -//.word 0xd1fa3224 -//.word 0x6b7046ca -//.word 0x19c75e66 -//.word 0xd61eee2f -//.word 0x4d82a5a9 -//.word 0x42bcf01c -//.word 0x2e6cc144 -//.word 0x295c8e4a -//.word 0x0d0e9cf3 -//.word 0xd9977d18 -//.word 0x53b0d856 -//.word 0xf20b6806 -//.word 0xfae3476f -//.word 0xe9d76d3b -//.word 0x12f87328 -//.word 0x88219d00 -//.word 0x3d8718cb -//.word 0x6b908043 -//.word 0x33e9a688 -//.word 0x85d38f15 -//.word 0x3fbdc0f3 -//.word 0x9918b82c -//.word 0xc067bf83 -//.word 0xc195de62 -//.word 0xa98c2f14 -//.word 0xea035734 -//.word 0x01975066 -//.word 0x561e6c45 -//.word 0x6438969c -//.word 0x1926dbd8 -//.word 0x80e02abd -//.word 0x9d615859 -//.word 0x99466736 -//.word 0x1f9708d4 -//.word 0x05e55e56 -//.word 0x2f95057c -//.word 0xb07b53d1 -//.word 0x33abde26 -//.word 0x9a8b3e3e -//.word 0xe42d14cb -//.word 0x54dc4b99 -//.word 0xcff59d0a -//.word 0x87f959c2 -//.word 0xd6df64a3 -//.word 0x6caf7efc -//.word 0xad4cc7fd -//.word 0x5591826f -//.word 0x5ea018a2 -//.word 0x237760a6 -//.word 0xc5c51dbd -//.word 0xcefbc911 -//.word 0x14a591a3 -//.word 0xe1fba084 -//.word 0x50b3a047 -//.word 0xfa1a7eb6 -//.word 0xd2636ec4 -//.word 0x4e3f30c3 -//.word 0xc8ae91d7 -//.word 0x231434ab -//.word 0xb18f9262 -//.word 0x548840d1 -//.word 0xe48871eb -//.word 0xd14dbb7c -//.word 0x0a1e1e1b -//.word 0x1d5b4259 -//.word 0x9f58003f -//.word 0xce6b24f8 -//.word 0x754471ca -//.word 0x107de64b -//.word 0x317240d1 -//.word 0x2253c02a -//.word 0xcc782e8d -//.word 0xd7f41ed1 -//.word 0x136c72dd -//.word 0x172a2060 -//.word 0x286d36c2 -//.word 0x5c031b5a -//.word 0xfe1a17e1 -//.word 0x35541526 -//.word 0xe119a804 -//.word 0xc6314d91 -//.word 0xec92f099 -//.word 0x4576b14b -//.word 0x91b1e731 -//.word 0x7f426566 -//.word 0x1528fd03 -//.word 0x517743da -//.word 0x11aa9367 -//.word 0x303b5603 -//.word 0xf271805b -//.word 0xa27a5d21 -//.word 0x79b98e01 -//.word 0xc2614fd7 -//.word 0x3c43fb1f -//.word 0xc0e4d1ac -//.word 0x23d3f89e -//.word 0x5e39c18e -//.word 0xecb22d0b -//.word 0x745baf4a -//.word 0xa82d3219 -//.word 0x6d895e15 -//.word 0x3c13171d -//.word 0xc8c44706 -//.word 0xe13bde90 -//.word 0x98541799 -//.word 0xa4fcfc91 -//.word 0x04442c2e -//.word 0xe6b4dc61 -//.word 0xc8e11c88 -//.word 0xdd415be5 -//.word 0xb23f2e4f -//.word 0x118b4d27 -//.word 0x26b4de8e -//.word 0xe0f8f7d5 -//.word 0x9a5b5e35 -//.word 0xfbf693c1 -//.word 0x1a921098 -//.word 0xe675cf5f -//.word 0xc67c0def -//.word 0x7c6a4e4a -//.word 0x4f80a1d4 -//.word 0x694e25c0 -//.word 0x7ec8ccc8 -//.word 0xae9c5f21 -//.word 0xadc3c2ae -//.word 0x21567a74 -//.word 0x4ba46c4e -//.word 0xea81e7e1 -//.word 0x5ce1e5d3 -//.word 0x07a58e38 -//.word 0xf7b4fe4d -//.word 0xc84e4869 -//.word 0xc79dbb30 -//.word 0x548d640a -//.word 0x8bded3d4 -//.word 0x237822d5 -//.word 0x95fe34f3 -//.word 0x81a53b26 -//.word 0x4e477d2e -//.word 0x12b35781 -//.word 0xb1488288 -//.word 0x48c2950a -//.word 0xcc53cbe9 -//.word 0xeef6070c -//.word 0x4200159c -//.word 0xa1f73373 -//.word 0xcca8d0d1 -//.word 0x51749351 -//.word 0xb3eb9f1c -//.word 0xc59c165d -//.word 0x572adbf5 -//.word 0x14a39d6f -//.word 0xab0e1136 -//.word 0x2d437e05 -//.word 0xb6007fa0 -//.word 0x503805c2 -//.word 0x14ae9b56 -//.word 0x93c3eee9 -//.word 0x748c8c60 -//.word 0x5e28ece6 -//.word 0x1851af29 -//.word 0xee3025c6 -//.word 0x57761301 -//.word 0xd6a8b3ba -//.word 0x1ebafd9d -//.word 0x79e02598 -//.word 0x6aa16592 -//.word 0x912dfc5a -//.word 0xd0f077dd -//.word 0xac672f9d -//.word 0xf633135e -//.word 0xaa6ca722 -//.word 0x17374d58 -//.word 0x409bc451 -//.word 0x8390eef3 -//.word 0x7859d6b1 -//.word 0x1c14f1bb -//.word 0x2f90a471 -//.word 0xda5e071e -//.word 0x952be9e3 -//.word 0x484d14f1 -//.word 0xb09bd1fb -//.word 0x0582afec -//.word 0xda5581d5 -//.word 0x44e5a629 -//.word 0x3e528d2c -//.word 0x4c2077a9 -//.word 0x5f8d7fe3 -//.word 0xf922d8cf -//.word 0x91895780 -//.word 0x399e31e3 -//.word 0x7ec805ac -//.word 0x908a1d90 -//.word 0xa355f1b5 -//.word 0x94a1ec67 -//.word 0xd03c730c -//.word 0x72e1245a -//.word 0xab0c5bc7 -//.word 0x670dfb41 -//.word 0x2d5b6b20 -//.word 0x472cde59 -//.word 0x2442d8f4 -//.word 0xfa08eec0 -//.word 0xafddcd45 -//.word 0xfab07dfa -//.word 0xc6cde7b8 -//.word 0xd7f6956f -//.word 0xafb6ba18 -//.word 0xb3f272ea -//.word 0x8ac14ad1 -//.word 0xc67e031c -//.word 0xc61b9375 -//.word 0xdab76d17 -//.word 0xa973023b -//.word 0xd08288d3 -//.word 0xcc80fa7b -//.word 0x1a0560ad -//.word 0x9c795034 -//.word 0x3f2ab5e3 -//.word 0xdb9bcf86 -//.word 0x5b207b19 -//.word 0x1da7b538 -//.word 0x9cd95bd7 -//.word 0x4c623333 -//.word 0xc58c3008 -//.word 0x2413f105 -//.word 0xae358b7d -//.word 0xb708885f -//.word 0xc3103068 -//.word 0xea110797 -//.word 0x812296e2 -//.word 0xf6036e27 -//.word 0xfcb06b65 -//.word 0xe836362c -//.word 0x5bc60d52 -//.word 0x2208c7e8 -//.word 0x5ab1126c -//.word 0xd8580040 -//.word 0xc886c25b -//.word 0x930cb33f -//.word 0x0799982b -//.word 0xb28b2591 -//.word 0x8e06c4ca -//.word 0xe4439309 -//.word 0x6a2bab8e -//.word 0xae25a81c -//.word 0xb82c66ac -//.word 0xeb240863 -//.word 0x2d6e3fc2 -//.word 0x48bac91d -//.word 0x8f1c374e -//.word 0xc463f4aa -//.word 0x39a68334 -//.word 0x361f0811 -//.word 0x9b3c0a3c -//.word 0xc6f4777b -//.word 0xb758e892 -//.word 0x726a27b6 -//.word 0xa531ef44 -//.word 0x8b0df2b3 -//.word 0x104920c8 -//.word 0x36ef2708 -//.word 0xb7e03673 -//.word 0xec23076f -//.word 0xed7e1c03 -//.word 0xfa434945 -//.word 0x1a6d7216 -//.word 0x01eb960c -//.word 0x373c0cb0 -//.word 0x773c0dea -//.word 0x563e73b9 -//.word 0x255ac027 -//.word 0x1709627d -//.word 0xa7ef36b3 -//.word 0x34f74a2a -//.word 0xeea5e79e -//.word 0xf6a8cf56 -//.word 0xc1afc39d -//.word 0xbe7e4876 -//.word 0x3841ab8c -//.word 0x7d204368 -//.word 0x4013f6e6 -//.word 0x3cf8feea -//.word 0x1ae3ed4f -//.word 0x95b5ef20 -//.word 0xdcf0500b -//.word 0x37c93e12 -//.word 0xee7fcf84 -//.word 0x67ec462c -//.word 0x8e5a92c8 -//.word 0x799717bd -//.word 0x4d4cb108 -//.word 0x5b8af678 -//.word 0x8fa6bc1a -//.word 0x0b47dcf5 -//.word 0x0fbd35f8 -//.word 0x1c94f331 -//.word 0x59691140 -//.word 0x35fd1c0a -//.word 0x4e883ab2 -//.word 0x92506cc5 -//.word 0xa37910b4 -//.word 0x801faa88 -//.word 0x63a2e3d1 -//.word 0xe541d2df -//.word 0x68eb7b35 -//.word 0xb651953b -//.word 0xe6409133 -//.word 0x802ed76e -//.word 0xe11353c0 -//.word 0xe07a3031 -//.word 0xb1d7e3f5 -//.word 0x0a1b6c9f -//.word 0x8586d891 -//.word 0x46bc0bb7 -//.word 0xdd1cbc75 -//.word 0x6d4dc1dd -//.word 0x0e198d26 -//.word 0x717ff759 -//.word 0xc3033d4e -//.word 0xd34948d7 -//.word 0x76e2313b -//.word 0x2b6605e6 -//.word 0xfbc3c55e -//.word 0xa3d4b179 -//.word 0xf536c6ce -//.word 0x7c578669 -//.word 0x5fcff7c3 -//.word 0x87f4eef1 -//.word 0x04a88d1b -//.word 0xad760b30 -//.word 0x07deb3d8 -//.word 0x69ec30aa -//.word 0x5d1007a0 -//.word 0x482965c7 -//.word 0x4ee31b3b -//.word 0x7043e753 -//.word 0xf780f519 -//.word 0x1615a5fd -//.word 0xcb148fca -//.word 0x06bdc5d8 -//.word 0x0d4f5784 -//.word 0x1f1e1ddd -//.word 0x57e6b0a0 -//.word 0xd45fba67 -//.word 0x1711701d -//.word 0xac6a5cb5 -//.word 0x0d0e601b -//.word 0xc36ef86b -//.word 0xce9cbf62 -//.word 0x475e3512 -//.word 0x4481bfd9 -//.word 0xfc6fef93 -//.word 0x2c04060f -//.word 0xb99eb7c0 -//.word 0x96732eb5 -//.word 0xe82851cb -//.word 0x689f4622 -//.word 0x091035cd -//.word 0xdc5b4fce -//.word 0x309c0f41 -//.word 0xfd00bfd7 -//.word 0x83d83f86 -//.word 0x2eec027f -//.word 0xbd125961 -//.word 0xa3fff4ac -//.word 0xad5ca578 -//.word 0xe61d6867 -//.word 0xb80ea1d8 -//.word 0x53aea45d -//.word 0x53417a70 -//.word 0x9c21e361 -//.word 0x89559793 -//.word 0x4764d1e8 -//.word 0x7b6b0e7a -//.word 0x2b6e128c -//.word 0xdbec2dc0 -//.word 0xf6b6bc8a -//.word 0x7001f2e4 -//.word 0xaab9d943 -//.word 0x961893ca -//.word 0x1b78e6be -//.word 0xbb65f83b -//.word 0x73f75625 -//.word 0xe25e3b60 -//.word 0xaebf1044 -//.word 0x243f2f4b -//.word 0x1e5dec0d -//.word 0x2a84d66f -//.word 0xe8e03a17 -//.word 0xb472e923 -//.word 0x855f3b1a -//.word 0x158e5422 -//.word 0x4371a674 -//.word 0xb523b70e -//.word 0xc1b425a7 -//.word 0x8ec1e7e8 -//.word 0x7647d5d9 -//.word 0xafb86b9a -//.word 0x2b4fca53 -//.word 0xbca1ff6d -//.word 0x7c768803 -//.word 0x6cd61493 -//.word 0x5b678bfa -//.word 0x0af64e9f -//.word 0x8d53c0ee -//.word 0xf4620508 -//.word 0x2b6f0ab8 -//.word 0x1fc2c5aa -//.word 0x2273bed7 -//.word 0x9180ce44 -//.word 0xb41d26ec -//.word 0xe54b94fa -//.word 0xf5ac023c -//.word 0xcb9640d5 -//.word 0x4e660332 -//.word 0x86172d3f -//.word 0xfd134eda -//.word 0x6c486b88 -//.word 0x937fff66 -//.word 0x69e94063 -//.word 0x75fba3ad -//.word 0x7c7ca269 -//.word 0x5cddbda7 -//.word 0x38c8bf95 -//.word 0xd5fb42f2 -//.word 0x445775c6 -//.word 0xc2341d51 -//.word 0xdcf8da41 -//.word 0xd7e8ac28 -//.word 0x4e3eb52c -//.word 0x1d7b4101 -//.word 0x7efe0314 -//.word 0x72d6a109 -//.word 0x63d57468 -//.word 0x07e58993 -//.word 0x879febfc -//.word 0xe11a2494 -//.word 0x8b010187 -//.word 0x59e99626 -//.word 0xa0e18224 -//.word 0x9c4a7406 -//.word 0x0fe9eed5 -//.word 0x2b3a4916 -//.word 0xb207fafc -//.word 0x5c3a13db -//.word 0x79f00de0 -//.word 0xd7cec400 -//.word 0xe698c32e -//.word 0x1affc2d1 -//.word 0x91bb6d75 -//.word 0xf6da67c0 -//.word 0xa5588fa8 -//.word 0x0fef82e4 -//.word 0x603061a0 -//.word 0x60d3d475 -//.word 0x974c4e98 -//.word 0xb59f9352 -//.word 0x317478b0 -//.word 0x2f6eea7b -//.word 0xa7b9326a -//.word 0xc4e27797 -//.word 0x8aec8530 -//.word 0xbca0cd6f -//.word 0xfd24accc -//.word 0x35cff071 -//.word 0x363c98ee -//.word 0xa09ddb2e -//.word 0x01526ca9 -//.word 0x41bbfddc -//.word 0x3e4a02f6 -//.word 0xb3dcb7d5 -//.word 0x5e496430 -//.word 0x6239df16 -//.word 0xea3a5397 -//.word 0x0f1041c1 -//.word 0xfc4cc4ce -//.word 0x4f21199b -//.word 0xc3725e5c -//.word 0x0c2f9a8f -//.word 0x03e2fe2e -//.word 0x03856b29 -//.word 0x93973413 -//.word 0x456f241b -//.word 0xdecfc33f -//.word 0xb6bcd5bc -//.word 0x628d24c9 -//.word 0x91437f84 -//.word 0x3418032d -//.word 0xe25b9992 -//.word 0x7a7ac0ca -//.word 0x0a618d26 -//.word 0xef02ef65 -//.word 0x3e353827 -//.word 0x63c3d9a5 -//.word 0x08bd6d9e -//.word 0x3913fa95 -//.word 0xc5617339 -//.word 0xe70c8125 -//.word 0x258e82c9 -//.word 0x790ed3a8 -//.word 0xaf344ac5 -//.word 0x0e3b0757 -//.word 0x3a486dc4 -//.word 0x59fa6bcd -//.word 0x75420006 -//.word 0x2175fe8a -//.word 0x609f0eec -//.word 0xc21bf471 -//.word 0xd060147c -//.word 0xaa1e3549 -//.word 0xef8a86de -//.word 0xddf5de3f -//.word 0xbaa448e2 -//.word 0x72dcbf62 -//.word 0x813c3677 -//.word 0x1350dc26 -//.word 0x6a629d35 -//.word 0x8193ece2 -//.word 0xef2bc0d5 -//.word 0x0d2edc52 -//.word 0x5b3054b3 -//.word 0x20694d16 -//.word 0x510c0453 -//.word 0xb4d51231 -//.word 0x45e1eed9 -//.word 0xd9c3b38a -//.word 0x01d4238f -//.word 0x31caec6e -//.word 0x228d2b63 -//.word 0x74462f0c -//.word 0x98b87f66 -//.word 0xedd31ef8 -//.word 0x29860d4e -//.word 0xfbd612a9 -//.word 0xef2db8f5 -//.word 0x91f497fb -//.word 0xd563d5d8 -//.word 0xb698edae -//.word 0x1ee7af99 -//.word 0x067289e5 -//.word 0xdef9047e -//.word 0x2ff391a7 -//.word 0x7fdd86ef -//.word 0x75d26461 -//.word 0x3d5c5bfc -//.word 0x2e8a1063 -//.word 0xaa429dd5 -//.word 0x46d9d95e -//.word 0x2be1db4f -//.word 0xbd42b9ed -//.word 0x7a8d9566 -//.word 0x248cdb09 -//.word 0x221ec4b5 -//.word 0x24411f92 -//.word 0x06715000 -//.word 0xf73199cd -//.word 0xdae798ab -//.word 0xecec11e1 -//.word 0xa7e4ee40 -//.word 0xe74b8459 -//.word 0x4c5118ed -//.word 0xdfe8a2a5 -//.word 0xf81bd003 -//.word 0x5fa14e99 -//.word 0xb1b24579 -//.word 0x051922ec -//.word 0xd08b9867 -//.word 0x0637e8ba -//.word 0x829e608b -//.word 0xa8a52103 -//.word 0x49e826c7 -//.word 0xc652822a -//.word 0x79ebe9a1 -//.word 0x50f07277 -//.word 0xbb299bc1 -//.word 0xc9778e95 -//.word 0x8eada377 -//.word 0xc7a02514 -//.word 0xc1825933 -//.word 0x766bbce8 -//.word 0xf9398d0a -//.word 0x159a8be8 -//.word 0x31670038 -//.word 0x7734fe50 -//.word 0x3625e999 -//.word 0x84033540 -//.word 0x278e712e -//.word 0xb615853b -//.word 0xfb45389e -//.word 0x9c3ff5a8 -//.word 0xfaedceb3 -//.word 0x5a95c155 -//.word 0x43ae3ad9 -//.word 0x26f3daef -//.word 0x45b777a2 -//.word 0xcd78648b -//.word 0x45b6f244 -//.word 0x2c053620 -//.word 0xde620d19 -//.word 0xb8c35e0a -//.word 0x7cf29f1f -//.word 0xf79a9b89 -//.word 0xe1a27276 -//.word 0x04bbe140 -//.word 0xa135c3e4 -//.word 0x0f17d8b7 -//.word 0xa56ec654 -//.word 0xdae55dd9 -//.word 0xab961f53 -//.word 0x3d200076 -//.word 0xc4fa6a92 -//.word 0xa30784c2 -//.word 0xd56ab467 -//.word 0x8b9b63d4 -//.word 0x16ba004b -//.word 0x08244729 -//.word 0x9645c35d -//.word 0x41ad911e -//.word 0xb66568de -//.word 0xf283d679 -//.word 0xa9fcccb3 -//.word 0xe9ba5de1 -//.word 0xfbeec3e6 -//.word 0x8aa8a361 -//.word 0x06a59225 -//.word 0x4b67d7ea -//.word 0x7e8b7242 -//.word 0x38585ece -//.word 0xe79414b1 -//.word 0x719b5045 -//.word 0x1ab2170d -//.word 0xa798f9eb -//.word 0xc35e9493 -//.word 0xa3795940 -//.word 0xe61693a6 -//.word 0xbfada427 -//.word 0x55d99249 -//.word 0x6a67c368 -//.word 0x3bac05a8 -//.word 0xa81cd22e -//.word 0x9519d190 -//.word 0x90099f89 -//.word 0xb4abd0f2 -//.word 0xcdab31ed -//.word 0xbd745064 -//.word 0x1e453fb2 -//.word 0x2887949f -//.word 0xd55eb492 -//.word 0x447e5202 -//.word 0x5b40322e -//.word 0xb1f4330e -//.word 0xab798c89 -//.word 0xe50c56e8 -//.word 0xd35e4b8b -//.word 0xa8e9cdda -//.word 0x76832a7f -//.word 0x97341ed3 -//.word 0x4d459995 -//.word 0xa599c3e2 -//.word 0xa1413d61 -//.word 0x954aaabf -//.word 0xd2d96f5b -//.word 0x827bb642 -//.word 0xd3b6b95d -//.word 0x58e43de9 -//.word 0xac415c28 -//.word 0x58428856 -//.word 0xf628cddf -//.word 0x97d656cf -//.word 0x63df338a -//.word 0x7fe45abd -//.word 0x341deb94 -//.word 0x4d35b82e -//.word 0xc05b044e -//.word 0x91968b53 -//.word 0xf458c36a -//.word 0xb2576202 -//.word 0xcd982080 -//.word 0x67ccbe34 -//.word 0xe0e0478c -//.word 0x3fd09688 -//.word 0xd3bc186e -//.word 0x1a3dd3bf -//.word 0xe1f9a769 -//.word 0xad75d43e -//.word 0x5a2bbda5 -//.word 0x02ddec90 -//.word 0x202855ae -//.word 0xf55cdfe1 -//.word 0x2b8b20f2 -//.word 0xb9e06884 -//.word 0x06320246 -//.word 0x51d9b66d -//.word 0x50c19262 -//.word 0x17bdebb7 -//.word 0x3c1d9e60 -//.word 0x39829b20 -//.word 0x11f1a541 -//.word 0x37275388 -//.word 0xab2c5b68 -//.word 0x662b0f76 -//.word 0xf881281d -//.word 0x7014c393 -//.word 0x7ce6a90b -//.word 0xd1ead32d -//.word 0xcd162ec3 -//.word 0x5bb99bb5 -//.word 0x180f3a37 -//.word 0xb412e841 -//.word 0x9a94063f -//.word 0xd38b7d0b -//.word 0x27acfe18 -//.word 0x863b8ff0 -//.word 0xa72143e0 -//.word 0xef3f48f1 -//.word 0x9402271b -//.word 0x023748b6 -//.word 0x7e21b531 -//.word 0x09c91f06 -//.word 0x879626ed -//.word 0x201dd551 -//.word 0xe73a6c00 -//.word 0xb9606326 -//.word 0x682dab7c -//.word 0x194237bd -//.word 0xeb51bb5a -//.word 0xda77b46e -//.word 0xe2cda8f4 -//.word 0x673aaf38 -//.word 0xd48b328b -//.word 0x83c5f33b -//.word 0xddb94dc2 -//.word 0xc2dabe3e -//.word 0x2b4ca221 -//.word 0x0d3d412a -//.word 0x81780c94 -//.word 0x2337248d -//.word 0xb7391ce9 -//.word 0x13150018 -//.word 0x39ce9655 -//.word 0xc3a7e321 -//.word 0x8439f1f0 -//.word 0x6cc2d022 -//.word 0xacc0db34 -//.word 0x1bbf3c38 -//.word 0xd86fb382 -//.word 0x31f993a5 -//.word 0xc4930d9e -//.word 0xe453b04e -//.word 0x3f40312e -//.word 0xbdaf683e -//.word 0xabcd9c3e -//.word 0x18780021 -//.word 0x7f537dbf -//.word 0xa719b2ca -//.word 0xc8313a03 -//.word 0xef832dad -//.word 0xa38be942 -//.word 0xc9ab1266 -//.word 0xc5c6d719 -//.word 0xe20a7730 -//.word 0xf40d0406 -//.word 0x3c1c686f -//.word 0x8bd0a5ed -//.word 0xaae16127 -//.word 0xfa3fa196 -//.word 0x585fd582 -//.word 0x43d3152d -//.word 0x411eaa4e -//.word 0x7ec6d0c0 -//.word 0xb7abba7c -//.word 0x5696d7c5 -//.word 0xdf1554a2 -//.word 0x8a87e291 -//.word 0x3273b97a -//.word 0x6d1edce2 -//.word 0xfd5c9f61 -//.word 0x67a66756 -//.word 0xe16db2d9 -//.word 0x71ae57f1 -//.word 0x54c70e07 -//.word 0x9d89329b -//.word 0x1e8ec636 -//.word 0x8bccb7a0 -//.word 0xdd6b6052 -//.word 0xf5d4532e -//.word 0x820b576e -//.word 0x243eaddb -//.word 0xd29e983f -//.word 0x796d1c1c -//.word 0xe558059e -//.word 0xe5082bcf -//.word 0xaaf4f50a -//.word 0x71791cb2 -//.word 0x622cb123 -//.word 0xb76f62e9 -//.word 0x2042f931 -//.word 0x665c257c -//.word 0x4f7b7d9b -//.word 0xc3f8c2d7 -//.word 0x2c9e6470 -//.word 0x23bc4849 -//.word 0x4879c9e1 -//.word 0x7168fd85 -//.word 0x085c39c4 -//.word 0xae7ed724 -//.word 0x249c3613 -//.word 0x6cc40320 -//.word 0x2b12b76b -//.word 0x52c6615a -//.word 0xfd99a68e -//.word 0x9c520616 -//.word 0x509461e2 -//.word 0x98fab97a -//.word 0x2c6639f0 -//.word 0x29957612 -//.word 0x6ff7f6e5 -//.word 0x47beef4f -//.word 0x4a355014 -//.word 0x7e540504 -//.word 0xc1917772 -//.word 0x6bf853e7 -//.word 0x2f7e8d18 -//.word 0x4293a416 -//.word 0xbff627c5 -//.word 0x4bcd788f -//.word 0xf5f5d059 -//.word 0x5f9783b6 -//.word 0x23fc865b -//.word 0x70a22ed4 -//.word 0xf48f3a75 -//.word 0xffe51492 -//.word 0xe5b754f3 -//.word 0xa41b8682 -//.word 0xc6802d47 -//.word 0x89420896 -//.word 0x3e7c9387 -//.word 0xef1ed1a7 -//.word 0x443f49ed -//.word 0xa7b44ef0 -//.word 0xa7e18456 -//.word 0x9acfa090 -//.word 0x877f6fc5 -//.word 0x437e1a0b -//.word 0xd9baa8dd -//.word 0x2f94c4ca -//.word 0xe736c16a -//.word 0x8427db96 -//.word 0xce1cc0d8 -//.word 0x77124f21 -//.word 0xfe999fba -//.word 0xd473437d -//.word 0xbe5dcc45 -//.word 0x7a2d90a3 -//.word 0xa51daad3 -//.word 0xdc6742ee -//.word 0x22120f60 -//.word 0x810b199d -//.word 0xf477c410 -//.word 0x85480a54 -//.word 0xb30e08a7 -//.word 0x1610bc9c -//.word 0x469c0d10 -//.word 0xf89b0b5e -//.word 0x6a6879d7 -//.word 0x02e3896c -//.word 0x32c1e6ae -//.word 0x9e26f7f9 -//.word 0x817563eb -//.word 0x4c67d01b -//.word 0x915af108 -//.word 0x20ecbf50 -//.word 0x70c90623 -//.word 0x40c124f6 -//.word 0x7d1e0d7c -//.word 0x673493d2 -//.word 0xf039e5fa -//.word 0x6457558a -//.word 0x4f005ea5 -//.word 0x9c82e52b -//.word 0xfadbbf2d -//.word 0x84ce74a4 -//.word 0xa0364262 -//.word 0x279b6548 -//.word 0xc70396ba -//.word 0xa60ad250 -//.word 0x48355cce -//.word 0xb3840557 -//.word 0xd146abdd -//.word 0x153100dc -//.word 0x61b28c48 -//.word 0x2882f6c4 -//.word 0xd07a7f14 -//.word 0x5aa8cfd5 -//.word 0x44a2f46b -//.word 0xae1aa83c -//.word 0xbdb3d21c -//.word 0x3d135007 -//.word 0x8a3af416 -//.word 0xb012ccac -//.word 0xd147a7f0 -//.word 0xc758d481 -//.word 0x0bef2d65 -//.word 0xd56e5542 -//.word 0x85ca3dd0 -//.word 0x429ced8e -//.word 0xe17581b4 -//.word 0x08727169 -//.word 0x93111637 -//.word 0x36436abc -//.word 0x64c310a2 -//.word 0x70a594d1 -//.word 0xf332f3e2 -//.word 0x6df35ed7 -//.word 0x2f0c3b0a -//.word 0x78cc6d64 -//.word 0xde81d5cf -//.word 0xef9118ee -//.word 0x19c6a30b -//.word 0xc7eaed51 -//.word 0xcd94fc3b -//.word 0x06412b4c -//.word 0x3ba62a01 -//.word 0x47454604 -//.word 0x793feba2 -//.word 0x3a69677f -//.word 0xf0a1f088 -//.word 0x2263e92a -//.word 0xdc9761c1 -//.word 0x55addd54 -//.word 0xcfec577f -//.word 0xbf0786b0 -//.word 0x2ef26097 -//.word 0x5ff3ded7 -//.word 0xb2fcff02 -//.word 0xc8380fc4 -//.word 0xe8e4295e -//.word 0xa160fb56 -//.word 0xb186c96d -//.word 0x263ab4d2 -//.word 0xc3423d95 -//.word 0xa559055e -//.word 0x277ed65f -//.word 0x0292e787 -//.word 0xb9225cf9 -//.word 0x34820dbc -//.word 0xaa1b88b4 -//.word 0xc50559d1 -//.word 0x01d98986 -//.word 0x56c0647d -//.word 0x16d07f89 -//.word 0x1899fadc -//.word 0x16fa037a -//.word 0x543a9bed -//.word 0x82539d3a -//.word 0xe491fc15 -//.word 0xb05c4c51 -//.word 0xb852849a -//.word 0x489a0266 -//.word 0x5274cf29 -//.word 0xc81425c8 -//.word 0x4ab02e51 -//.word 0x01d80fe9 -//.word 0xcb062506 -//.word 0x98768ede -//.word 0x1437ec1f -//.word 0x868365e0 -//.word 0xf74cefd7 -//.word 0x9817cacd -//.word 0x5e0d4d50 -//.word 0xef4fe6a8 -//.word 0xc18b5d0c -//.word 0x80cd5815 -//.word 0xb1972472 -//.word 0x9633b2de -//.word 0x5148e04f -//.word 0x4bacfa70 -//.word 0xd7798152 -//.word 0x13632b5e -//.word 0x0f482a8f -//.word 0x3209b1de -//.word 0xd999b5fd -//.word 0x4053f147 -//.word 0xa6912cf8 -//.word 0xac7abe99 -//.word 0xff1b51bf -//.word 0x36bae5f5 -//.word 0xfe6617f7 -//.word 0x74d3a221 -//.word 0xd2652626 -//.word 0x4e8b2805 -//.word 0x3f4e5a39 -//.word 0x822a1d30 -//.word 0x1c1c45ff -//.word 0x20fc1c54 -//.word 0xd40da9ac -//.word 0x0fd332c6 -//.word 0xe524ff57 -//.word 0x868261ff -//.word 0x64a8f37c -//.word 0x9463201e -//.word 0x77a3e57a -//.word 0x99d2d863 -//.word 0xd9646a16 -//.word 0xcbb069b5 -//.word 0x5afec9f7 -//.word 0xb2e1a31d -//.word 0x5dc77e28 -//.word 0xabcece49 -//.word 0x58d9ba99 -//.word 0x69e4220a -//.word 0x5794e19d -//.word 0x6f124fd6 -//.word 0x791a0a6e -//.word 0x984ff747 -//.word 0x71d283a5 -//.word 0x8f122f9a -//.word 0x06e64bc2 -//.word 0x57d90131 -//.word 0x94c496aa -//.word 0xc5a3ed11 -//.word 0x89a14d23 -//.word 0x01756365 -//.word 0xe9f18b5a -//.word 0x08d84bf9 -//.word 0xcbf1205e -//.word 0x2d597ec0 -//.word 0xd91d12a3 -//.word 0x93084a4f -//.word 0xd4ba1780 -//.word 0xb4faf25f -//.word 0x0d4e1db1 -//.word 0xdec82b4f -//.word 0xed22c2d6 -//.word 0xb10ea09f -//.word 0x6ec7dcf2 -//.word 0xa2ec6e76 -//.word 0xa08ef2ec -//.word 0x7b88a91d -//.word 0x250ec111 -//.word 0xd889d682 -//.word 0xb5a2b890 -//.word 0xac9d6fb7 -//.word 0x9be97cfd -//.word 0xbaf56270 -//.word 0x364565cf -//.word 0x1cc49288 -//.word 0x795cffe2 -//.word 0xc0c4547c -//.word 0x6b998af6 -//.word 0xe5b1f3ee -//.word 0xa8ac7b2e -//.word 0xa2cb2d23 -//.word 0xde06f992 -//.word 0x6058b486 -//.word 0x515e608d -//.word 0x5c20ae23 -//.word 0x572fc16f -//.word 0x26f0352d -//.word 0xdc3760ec -//.word 0x2417d779 -//.word 0xe0f9349b -//.word 0x0fec1700 -//.word 0xf43c6b78 -//.word 0x7546eb61 -//.word 0xc18ae462 -//.word 0x35023c5d -//.word 0x81b3b39e -//.word 0x06816959 -//.word 0x8347a153 -//.word 0xf127c4df -//.word 0xab1fa90c -//.word 0xd2dd131d -//.word 0xf0d57b39 -//.word 0xdb901064 -//.word 0xdd47fdae -//.word 0x11b0eaaa -//.word 0x1018c522 -//.word 0xcdb2c209 -//.word 0xbe2fa0b1 -//.word 0x3d8e2f3f -//.word 0x2d360f5b -//.word 0xe042ba2c -//.word 0x381cc483 -//.word 0x0d4d6256 -//.word 0xcf932a71 -//.word 0x6d341968 -//.word 0x7593dad0 -//.word 0x7c0145ae -//.word 0xc0d52730 -//.word 0x0cbf419b -//.word 0xdc599385 -//.word 0xc2ffda44 -//.word 0x08e157a6 -//.word 0x9756d2e3 -//.word 0x1774dfcf -//.word 0x58dd6054 -//.word 0xf1db4b20 -//.word 0x27b0ad9b -//.word 0x1027ef1c -//.word 0xf86f585c -//.word 0x0329d42b -//.word 0x14c0f461 -//.word 0xeef93518 -//.word 0x99cb8518 -//.word 0x08700393 -//.word 0xf8bc0713 -//.word 0x1bae62b0 -//.word 0x7645e786 -//.word 0x07942a66 -//.word 0xac1987cc -//.word 0x404b6611 -//.word 0x0772bee2 -//.word 0x4cbbd8f1 -//.word 0x488c56ea -//.word 0x461573a9 -//.word 0x05288caa -//.word 0x5e4ae0c1 -//.word 0x260a940b -//.word 0x5691fa24 -//.word 0x697b129a -//.word 0x06e551a2 -//.word 0xdfc7a20a -//.word 0xd985ab6f -//.word 0x6dc051b0 -//.word 0x4e727ea2 -//.word 0x4c3a2106 -//.word 0x78f477b8 -//.word 0x898d8a29 -//.word 0x7e15f70e -//.word 0x8516f35a -//.word 0x1c25906a -//.word 0x76b63d80 -//.word 0x20358c73 -//.word 0xe45239a5 -//.word 0xee9c6734 -//.word 0x2d512c75 -//.word 0xfc74509e -//.word 0x022152c2 -//.word 0x561eac03 -//.word 0xe7b25803 -//.word 0x1cba939b -//.word 0xb7f9e1d0 -//.word 0xffb05102 -//.word 0x1e6e0267 -//.word 0xc82ae6b8 -//.word 0x1d8fc62a -//.word 0xd19787a0 -//.word 0x8a5bab1f -//.word 0x892a1b82 -//.word 0x8dd8236f -//.word 0xf458be89 -//.word 0x248d14e7 -//.word 0x295e41c6 -//.word 0x9f09587a -//.word 0xd3b9a7ab -//.word 0x255a3dbd -//.word 0xb1acaa90 -//.word 0x2e96066a -//.word 0x15be3531 -//.word 0x065668de -//.word 0x6939e72e -//.word 0x51360f9a -//.word 0xa5ab968a -//.word 0x815617c6 -//.word 0xda69ca2d -//.word 0x61dc92a9 -//.word 0xaa073e62 -//.word 0x8e700832 -//.word 0xcee2625a -//.word 0xf8bff373 -//.word 0x8f96dca7 -//.word 0x66f83f20 -//.word 0x4d8802c1 -//.word 0xef52d014 -//.word 0xfb5e6184 -//.word 0x8284fccd -//.word 0xa1813ab0 -//.word 0x5f4b0ceb -//.word 0xd8a2ff68 -//.word 0x9ce8bfb5 -//.word 0x5232dab4 -//.word 0xa19fc794 -//.word 0x50e927ff -//.word 0xab394a95 -//.word 0x2940f59a -//.word 0x4d8363eb -//.word 0xcaf68937 -//.word 0xeacd9f6b -//.word 0x308fdb6e -//.word 0x3d6c800f -//.word 0xf0d0173c -//.word 0xd138fc74 -//.word 0xb0451d7e -//.word 0x890eff5c -//.word 0xabbb027b -//.word 0x1950e52c -//.word 0x31c68c58 -//.word 0x8b60016e -//.word 0x243cbaa1 -//.word 0xbc291a51 -//.word 0x7cb839c6 -//.word 0xdc96e824 -//.word 0xc418f09b -//.word 0xf1189bdf -//.word 0x9b0076d8 -//.word 0x5524549a -//.word 0x34559697 -//.word 0x33b2aa13 -//.word 0xd6c2d2d9 -//.word 0x0ec0272d -//.word 0x5d36dd01 -//.word 0x3acec86c -//.word 0xb7641f57 -//.word 0x615f817a -//.word 0x68423587 -//.word 0x007eb6a4 -//.word 0x068b6f1f -//.word 0xe736c35d -//.word 0xbe3d5014 -//.word 0xbc1975ba -//.word 0xcd1b113e -//.word 0x78ba8ef5 -//.word 0x072c1fd7 -//.word 0xe93345eb -//.word 0x543a9800 -//.word 0x2fa0c49e -//.word 0x2e54d23c -//.word 0x3fa2a9b3 -//.word 0x254cd4f3 -//.word 0x62dd85f5 -//.word 0x5b3adaf1 -//.word 0xb77a60d0 -//.word 0x08f7d6e4 -//.word 0xada533d7 -//.word 0xf7a3eae1 -//.word 0x8a106c3e -//.word 0x0620eee0 -//.word 0xe76f6d61 -//.word 0xaa95f03b -//.word 0x32fa0e3b -//.word 0x80000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00011440 -//// expected output -//.word 0xc8b144ba -//.word 0x9b9a8ae0 -//.word 0xff3cf8a6 -//.word 0x444cf929 -//.word 0x1cb72feb -//.word 0x3d840223 -//.word 0x7d2598a5 -//.word 0x7d0d8389 -//.word 0xb198f67b -//.word 0x5203576f -//.word 0xa8f878ef -//.word 0x2728644f -//.word 0x706421fb -//.word 0xc3db966b -//.word 0x967cad49 -//.word 0x90a49480 -//// SHA512LongMsgvector_89 -//// vector length -//.word 0x00011758 -//// input message -//.word 0x8a46ea29 -//.word 0xd6c39408 -//.word 0xe4d4eba3 -//.word 0x705a1a0c -//.word 0x9415b712 -//.word 0x317245b7 -//.word 0x90a4fde5 -//.word 0x49f6ce5c -//.word 0x6460a2ef -//.word 0xbf58e3f0 -//.word 0xafea3de9 -//.word 0xea0ba68c -//.word 0xa52b9ced -//.word 0xf909aeef -//.word 0x8bcb3efc -//.word 0x6c4e85fa -//.word 0x3ebbd87a -//.word 0x995b2932 -//.word 0xadacd0ad -//.word 0x28b48c41 -//.word 0x5a95c442 -//.word 0x96621375 -//.word 0xdc3104c7 -//.word 0xb6711a3f -//.word 0x607e1432 -//.word 0x2b736eb6 -//.word 0x23402b58 -//.word 0xf0fcd212 -//.word 0xfa7cb777 -//.word 0xd1247b31 -//.word 0xcbfdd6ad -//.word 0xef089415 -//.word 0x11d2de7f -//.word 0x3f49bb64 -//.word 0x5cced753 -//.word 0x0b8b82e6 -//.word 0xcf07fbf6 -//.word 0x70f7ef0b -//.word 0xa0583d16 -//.word 0xdebafc63 -//.word 0x9bdfbfc9 -//.word 0x9b841724 -//.word 0x9f7f5a05 -//.word 0x410aa3a7 -//.word 0x1f5f1a25 -//.word 0x3b8576eb -//.word 0xa269c06a -//.word 0x4c305911 -//.word 0x44cc3e78 -//.word 0x08cd8bde -//.word 0x337a3ed5 -//.word 0x59213e3c -//.word 0x33ab9c6e -//.word 0xfc7318b9 -//.word 0x1a59e712 -//.word 0x0112b306 -//.word 0x55c2e4f4 -//.word 0x4ecc1e7a -//.word 0x61e80a2d -//.word 0x1d775a8d -//.word 0x53140738 -//.word 0x796cdd5d -//.word 0x504f3a74 -//.word 0xc507132c -//.word 0x15e837a5 -//.word 0x3528d8e0 -//.word 0x71f14774 -//.word 0x53b5ff82 -//.word 0xc6c2e5ea -//.word 0x7b16cebf -//.word 0x8c7442f9 -//.word 0x60b7806a -//.word 0xce67c1f4 -//.word 0x858ac1f8 -//.word 0xabbc7c11 -//.word 0xc4823503 -//.word 0xd6dcbdee -//.word 0xca19f2c8 -//.word 0x16ef8609 -//.word 0x99cb02a8 -//.word 0xc6660a47 -//.word 0x0599e2ab -//.word 0x5672316e -//.word 0x388705f8 -//.word 0xc98a18ab -//.word 0x2e1e525e -//.word 0x35e98e0d -//.word 0x39eba1ce -//.word 0x470e9807 -//.word 0x7efe42df -//.word 0xbc3aeff2 -//.word 0x776c7649 -//.word 0xe8f67d89 -//.word 0x6fcdf46a -//.word 0x338ae36b -//.word 0x09be66c5 -//.word 0x9786f59d -//.word 0xb960e97d -//.word 0x233d3c05 -//.word 0x48d891de -//.word 0x7b4574f0 -//.word 0x54cde2d5 -//.word 0x56f90c8d -//.word 0xceed5873 -//.word 0xfef7a96f -//.word 0x7b68e06e -//.word 0xd4a3a30f -//.word 0x74735d9f -//.word 0xcaa28548 -//.word 0xa7c72485 -//.word 0xe75f91d9 -//.word 0x531f7fc1 -//.word 0xc6893ae7 -//.word 0x8fbe2e98 -//.word 0x1793a978 -//.word 0xc4e6e275 -//.word 0x1c3339f9 -//.word 0x2e62c064 -//.word 0x2de3fbb9 -//.word 0x5ffde497 -//.word 0x3563326c -//.word 0xbc09dbe5 -//.word 0x3435d8a9 -//.word 0xfdd92846 -//.word 0xbb20176b -//.word 0xb247c059 -//.word 0x72aed194 -//.word 0xb92f8ede -//.word 0x95ae1965 -//.word 0xc9f1f03c -//.word 0x72b2b708 -//.word 0xeaf338fc -//.word 0xed92a807 -//.word 0xfa1d2b4b -//.word 0xfce79bd2 -//.word 0x2a5c857c -//.word 0x2c91753c -//.word 0x7f207484 -//.word 0x1a32cefe -//.word 0x52dd197d -//.word 0xfbb17233 -//.word 0xd08d0a24 -//.word 0x15b7e2da -//.word 0x7a2cd25b -//.word 0x4335d058 -//.word 0xa63b6fa7 -//.word 0x74dca6f4 -//.word 0xfc3fd3b3 -//.word 0x2da4ff58 -//.word 0xfa3f64cb -//.word 0x03462c16 -//.word 0x71497c61 -//.word 0x21c2b121 -//.word 0x06edea8c -//.word 0xc8d9c650 -//.word 0xb1bf6f84 -//.word 0xca94d7df -//.word 0x41da4128 -//.word 0x0ebb04ed -//.word 0xd6588b78 -//.word 0x105fa1ff -//.word 0x66dbeb1b -//.word 0x5e51b67b -//.word 0x3908f4da -//.word 0x1ca8802e -//.word 0x6d07aa23 -//.word 0x803fefc7 -//.word 0x73040887 -//.word 0x5634275a -//.word 0x8fb07d3c -//.word 0x7d6bffde -//.word 0x5cc06a9c -//.word 0x690984af -//.word 0x466da5a4 -//.word 0x9ff9770c -//.word 0x0ef2fa76 -//.word 0x3c6acb9a -//.word 0x4a12a5d7 -//.word 0x6f4f28e0 -//.word 0xe290d9b2 -//.word 0xfade6bc9 -//.word 0x93b53d93 -//.word 0xb5122325 -//.word 0x70cd692d -//.word 0x0a291527 -//.word 0x5daa6dd4 -//.word 0x7a26b9e8 -//.word 0x921f4a03 -//.word 0x1750bbe3 -//.word 0x1e8677d8 -//.word 0x08b17b78 -//.word 0x613b5e93 -//.word 0x08988e6a -//.word 0x901fdc1b -//.word 0xe7183b60 -//.word 0x3516c479 -//.word 0x0787fe67 -//.word 0xad895d5b -//.word 0xe0ff086e -//.word 0xa9e4df92 -//.word 0x7ee0bdc9 -//.word 0xad19fa95 -//.word 0xfe4c35af -//.word 0x931c50fb -//.word 0x14aabbbc -//.word 0x0965f605 -//.word 0x87245170 -//.word 0x0f72f711 -//.word 0xb3282aad -//.word 0x7a42d028 -//.word 0x06eb2f3d -//.word 0x74daf572 -//.word 0x84e17b4a -//.word 0xfac34abc -//.word 0x4447dfe4 -//.word 0x5c8aabf9 -//.word 0xf0995e7f -//.word 0xc13f65bd -//.word 0x491cb172 -//.word 0xa0f7bbc4 -//.word 0xa056c579 -//.word 0x484b6269 -//.word 0x5e903833 -//.word 0x58d60530 -//.word 0x7d5be0a5 -//.word 0x48bbc23d -//.word 0x0d0844b6 -//.word 0xde1caada -//.word 0xb02e21b1 -//.word 0xbaa445f5 -//.word 0x1e28e6c6 -//.word 0xcbfe0c9f -//.word 0xa2953889 -//.word 0xd85ced8e -//.word 0x9bd66f71 -//.word 0xf8f1cb9c -//.word 0xfc94175a -//.word 0x1977fb46 -//.word 0xcc377104 -//.word 0x7daac82e -//.word 0xa770ef91 -//.word 0x38caf09a -//.word 0x3bafbb0b -//.word 0xb41d25f2 -//.word 0xcbae30dc -//.word 0x2d6b8d46 -//.word 0xb0e45f54 -//.word 0x368142c6 -//.word 0xd3138c27 -//.word 0x32aed347 -//.word 0x34bbafec -//.word 0xdb49c0c5 -//.word 0x67a4f39f -//.word 0xbe2902db -//.word 0x11583a20 -//.word 0xbd2b814d -//.word 0x6fa697b2 -//.word 0x8cb09c7f -//.word 0xd021d37c -//.word 0x351ca5fb -//.word 0x169fe90c -//.word 0x945862ef -//.word 0x39bb89cf -//.word 0xdb518dad -//.word 0xc353999a -//.word 0x0f775529 -//.word 0x550aaf24 -//.word 0x893fdb7e -//.word 0x21c79889 -//.word 0x76a1b669 -//.word 0x6e34d5c9 -//.word 0x589b6fcc -//.word 0x17401946 -//.word 0x83ac052d -//.word 0x0c9dcc4a -//.word 0xa1596a34 -//.word 0xd0438a7f -//.word 0x2eac0531 -//.word 0xf9eba575 -//.word 0xfcb02e94 -//.word 0xb3959f20 -//.word 0xb0f6b573 -//.word 0x3d03b158 -//.word 0x43135b07 -//.word 0x6a3c4757 -//.word 0x8220572f -//.word 0x2209813d -//.word 0x8e39d2eb -//.word 0xde7bb38f -//.word 0x5dfe6ce2 -//.word 0x3063e6b4 -//.word 0x3815b5de -//.word 0x39d95577 -//.word 0x3ba6b44b -//.word 0x30b6f188 -//.word 0xd8dd64bb -//.word 0xe21adefb -//.word 0x546c3264 -//.word 0x2ce6f4c8 -//.word 0x470680a0 -//.word 0x83433e49 -//.word 0x21e5256d -//.word 0x6d197ebf -//.word 0xa045ebeb -//.word 0x0599a7cc -//.word 0x5be70fe0 -//.word 0x7bb462fa -//.word 0x3a8fc537 -//.word 0x91a18a33 -//.word 0xfb86b17d -//.word 0x1f5baf48 -//.word 0xaf186f63 -//.word 0x9020976b -//.word 0x3b170c3f -//.word 0x63f4b8b4 -//.word 0xd8578b8a -//.word 0xab1cbf9f -//.word 0x93306163 -//.word 0x8fa30d8c -//.word 0xcdfff90b -//.word 0xcbd9343e -//.word 0xbca53067 -//.word 0x2dcf7f5d -//.word 0xe807da81 -//.word 0x18dc67f4 -//.word 0xaf8c3c07 -//.word 0x051a1ff3 -//.word 0xc1a28fcb -//.word 0xfdea09ae -//.word 0xa5398441 -//.word 0x206c3e5c -//.word 0x3346ba04 -//.word 0x2208099a -//.word 0x18414a51 -//.word 0xc8e86de6 -//.word 0x55a83c8b -//.word 0x6f7b9b24 -//.word 0xc07a0eb5 -//.word 0x86f47d1b -//.word 0x81bd34fb -//.word 0x0fc82ef9 -//.word 0x96f8932a -//.word 0x22347fcb -//.word 0x4fba0533 -//.word 0x6ab57406 -//.word 0xd311d8ac -//.word 0xa58ec401 -//.word 0x99134f4e -//.word 0x28465d79 -//.word 0xf0592078 -//.word 0x5926de0b -//.word 0x787ff4ab -//.word 0x34bf1bbd -//.word 0xa7a5ea0c -//.word 0xc7639c76 -//.word 0x45f114e6 -//.word 0xb5a71e82 -//.word 0xf00bf825 -//.word 0xb6e8110f -//.word 0x98a010db -//.word 0x15c218b2 -//.word 0x04df4abf -//.word 0x329a8ce2 -//.word 0x4bff89a9 -//.word 0xfe16f97c -//.word 0x5cb72317 -//.word 0x819fa03e -//.word 0x77c461ab -//.word 0x57e6f44c -//.word 0xb16702ab -//.word 0x2e5c1dae -//.word 0x74e4b880 -//.word 0x4ab977cf -//.word 0xfd04aa38 -//.word 0x027614ff -//.word 0xdc94f004 -//.word 0x415236f2 -//.word 0x78e41aba -//.word 0x05d1d540 -//.word 0x8849a953 -//.word 0xe3b81fe3 -//.word 0x9b9b946e -//.word 0x8193f3bc -//.word 0x91b7c4cc -//.word 0x1a2f660e -//.word 0x1fff98d3 -//.word 0xfd203f01 -//.word 0x4fd5630b -//.word 0x0f3c7a20 -//.word 0xfe23e9a3 -//.word 0x451ec8dc -//.word 0x5cd6e5ed -//.word 0x2ba40c07 -//.word 0x6f5f86dd -//.word 0x6072e059 -//.word 0x9131ee8e -//.word 0x176d0eef -//.word 0xed45b1be -//.word 0x974018c7 -//.word 0x06995c4d -//.word 0xbcdab145 -//.word 0x30acebc2 -//.word 0x74ee42b1 -//.word 0x150452c6 -//.word 0x437266b6 -//.word 0x31a9f5a7 -//.word 0xbf206de4 -//.word 0x57a730d6 -//.word 0x14f9dc30 -//.word 0x2a90d069 -//.word 0x82bdec6f -//.word 0xa4f7979a -//.word 0xda7407de -//.word 0x92f6bd46 -//.word 0x05e84e9d -//.word 0x16a9696e -//.word 0x7d281630 -//.word 0x24b13cba -//.word 0xd10666fd -//.word 0x06b2c6f1 -//.word 0x269a7bd0 -//.word 0xd8d50f83 -//.word 0xb0bd4459 -//.word 0x0d4610ff -//.word 0x3d8fe6ad -//.word 0xe8b7379d -//.word 0xabf239c1 -//.word 0x03dce7b5 -//.word 0x6d0d49f3 -//.word 0xcbedf546 -//.word 0x0ac9d681 -//.word 0x02272c70 -//.word 0x9d57d40f -//.word 0x3c4bcafa -//.word 0x56a9ec25 -//.word 0x621d00cd -//.word 0xf8f4f9ae -//.word 0x33e77677 -//.word 0x59348c7b -//.word 0xbef4c5a9 -//.word 0xe5a868be -//.word 0xe915fbb9 -//.word 0x1b52078f -//.word 0xed1f1b21 -//.word 0x0f78136b -//.word 0xd76a9afe -//.word 0xe626eeb0 -//.word 0x0954e492 -//.word 0x5da92b22 -//.word 0xb7bcd4c2 -//.word 0x42151269 -//.word 0x6a873f99 -//.word 0xf9c12091 -//.word 0x801f6ac3 -//.word 0xf9c68588 -//.word 0xaaef8f13 -//.word 0x4d83a4a3 -//.word 0x6de95dfd -//.word 0x131b961a -//.word 0xa200751d -//.word 0x00f6a888 -//.word 0xf6adedae -//.word 0xda3cd86c -//.word 0x6b6ed114 -//.word 0xfc5d5caa -//.word 0xd5439d53 -//.word 0xd68c1b0a -//.word 0x5d30c495 -//.word 0x6a3f31b7 -//.word 0x01be2ca8 -//.word 0xd0b16fc2 -//.word 0x1279af7d -//.word 0xb360d99d -//.word 0xb5739caa -//.word 0xd29027a1 -//.word 0x63bf34e9 -//.word 0x80c54588 -//.word 0x69f72d97 -//.word 0x244dd3f3 -//.word 0x68b73336 -//.word 0xbab4a5e6 -//.word 0xd62062ec -//.word 0x504d4447 -//.word 0x7b56cd01 -//.word 0x8ab06b62 -//.word 0xf502fa65 -//.word 0x1f378b68 -//.word 0x35d16427 -//.word 0x598048eb -//.word 0x00f3f8ff -//.word 0x98eef964 -//.word 0x6f9d98c5 -//.word 0xd0282cad -//.word 0x6f879bf8 -//.word 0x06981f88 -//.word 0x416e4a39 -//.word 0xd8ec4816 -//.word 0xfa9365cd -//.word 0xf299ce60 -//.word 0x053b9c1e -//.word 0x99540ed2 -//.word 0x9d2d163a -//.word 0x249718ba -//.word 0x5337ee52 -//.word 0x7e222fce -//.word 0x8eaab13c -//.word 0xa6774ca3 -//.word 0x06d9e1f2 -//.word 0x2f5c9b37 -//.word 0x479d7511 -//.word 0xc05dfd68 -//.word 0x35d4575b -//.word 0x9447847a -//.word 0x82dde536 -//.word 0xfbaffa95 -//.word 0x391e702b -//.word 0xd8695b45 -//.word 0x377fc067 -//.word 0x211156f9 -//.word 0xadec8d3d -//.word 0x6286d084 -//.word 0x9fd607a2 -//.word 0x3a69619f -//.word 0x68b350af -//.word 0xdda3d564 -//.word 0x347afd23 -//.word 0x90dcacd5 -//.word 0x842799de -//.word 0x30059a53 -//.word 0xad3d2267 -//.word 0xaccf0727 -//.word 0x593f8968 -//.word 0x863191fd -//.word 0x0536362d -//.word 0x55e68564 -//.word 0x822f8228 -//.word 0x46ec6a4f -//.word 0x74b93b6f -//.word 0x96067697 -//.word 0xd56b243c -//.word 0x1a3b1776 -//.word 0x735c726d -//.word 0xb8566c0d -//.word 0x6ea95002 -//.word 0xeb64c8e0 -//.word 0xbbf35ca1 -//.word 0x43393655 -//.word 0xa4df2815 -//.word 0xe3ebf039 -//.word 0x4694bacb -//.word 0x0154e63b -//.word 0x11400c53 -//.word 0x69953d6e -//.word 0x4c938ce5 -//.word 0xfa8ecdcb -//.word 0x8e429dda -//.word 0x2767a3ac -//.word 0x4685152f -//.word 0x770a7d53 -//.word 0x349abd05 -//.word 0x06a65061 -//.word 0xed40d423 -//.word 0x022dc55f -//.word 0x5b3c8c73 -//.word 0x2fd7b839 -//.word 0x3ad88b81 -//.word 0x639eb8be -//.word 0x9d5f6bff -//.word 0x0bbf8a21 -//.word 0x67a23a43 -//.word 0xa43fa67b -//.word 0xd277fcc7 -//.word 0x4364b747 -//.word 0xec3424a9 -//.word 0x0d381fe4 -//.word 0x15381e29 -//.word 0xc00a7216 -//.word 0x8262c92e -//.word 0x28ecf686 -//.word 0xbd98f5c0 -//.word 0xaa36293d -//.word 0x2242e98f -//.word 0xbd013b2d -//.word 0x63cddf6b -//.word 0x6cac90a9 -//.word 0x052886ca -//.word 0xd65b3fe8 -//.word 0xe24a7f45 -//.word 0xae749685 -//.word 0xa5aae11b -//.word 0xbb209302 -//.word 0x51c5b5ad -//.word 0x58d06c40 -//.word 0xba9b7b00 -//.word 0xf5b50808 -//.word 0x0933a33f -//.word 0x95468486 -//.word 0x3d131436 -//.word 0x4ebeb0c9 -//.word 0xa5c8a9d7 -//.word 0xcd9c8f45 -//.word 0x6764afb9 -//.word 0xcf21da50 -//.word 0xfcfb6894 -//.word 0xa8d57da8 -//.word 0xb1258bc6 -//.word 0xc00318ec -//.word 0x2880c2d1 -//.word 0x1138801e -//.word 0xd52b2adb -//.word 0xaac83c27 -//.word 0x824bd72d -//.word 0x2f490853 -//.word 0xcb894db4 -//.word 0x571655d1 -//.word 0xa2920883 -//.word 0x6ccdc735 -//.word 0xcc97f54f -//.word 0xcfd2b6f5 -//.word 0x62cbf6f2 -//.word 0x72caaeef -//.word 0x51e762e9 -//.word 0x5c20efe2 -//.word 0xdba983d6 -//.word 0x2883edf0 -//.word 0x145017fe -//.word 0x8666d023 -//.word 0x6522cfcb -//.word 0xb87ef5e4 -//.word 0x0ce6d34c -//.word 0x16486c85 -//.word 0x9a6b3cb0 -//.word 0x8c8179b9 -//.word 0x74ff98cf -//.word 0x17ac1317 -//.word 0x53f86aa1 -//.word 0x4b90689b -//.word 0xc42fa7c4 -//.word 0xcfb75624 -//.word 0xa9803afb -//.word 0xdff0f3f7 -//.word 0xb54c81a9 -//.word 0xc9cd063a -//.word 0xf4f7cd5a -//.word 0x71268c7a -//.word 0x416ae63b -//.word 0xcd943426 -//.word 0xce91859d -//.word 0x6af7e311 -//.word 0x9fded976 -//.word 0xe5f132f4 -//.word 0x0fc502e0 -//.word 0x7369ebea -//.word 0x4a3e9998 -//.word 0x5a088ff3 -//.word 0xd2462680 -//.word 0x75bfd271 -//.word 0xfa5ea81d -//.word 0xb33f1dae -//.word 0x6e0a1119 -//.word 0x99800c54 -//.word 0xa953c7c3 -//.word 0xbc3beef3 -//.word 0x7c46248a -//.word 0x4770487e -//.word 0x8e73f686 -//.word 0x7be051ce -//.word 0xd76f00ef -//.word 0x2a93771e -//.word 0x245278a3 -//.word 0x3b54d98e -//.word 0x963a87a5 -//.word 0x2a31cba0 -//.word 0x23c6cc99 -//.word 0x85fc56be -//.word 0x139bd949 -//.word 0x70ccb5b2 -//.word 0x84e3b422 -//.word 0x217cd82c -//.word 0xe6c958b8 -//.word 0x642ae53f -//.word 0x80fe313e -//.word 0x18bab2e4 -//.word 0xea38a40e -//.word 0xb1514d76 -//.word 0x90ad8427 -//.word 0xb4da7435 -//.word 0x369c9eaa -//.word 0x3e841dc3 -//.word 0x6ec42e5d -//.word 0x7e42efaa -//.word 0x23eb6728 -//.word 0x364ac7d4 -//.word 0x1259ef9b -//.word 0x3e973411 -//.word 0x4c5a6165 -//.word 0x0067fb95 -//.word 0xb5c0cade -//.word 0xfdbd9477 -//.word 0x885e2c7e -//.word 0x47e0ac33 -//.word 0xd08efe64 -//.word 0x05daa128 -//.word 0xf0aca9d0 -//.word 0xf2fa081b -//.word 0x1d990da9 -//.word 0xde532ab2 -//.word 0xdf39faf8 -//.word 0x2b3a82fa -//.word 0x94f5b86b -//.word 0x52cc41e2 -//.word 0xec3a7fd3 -//.word 0x5c66cbbe -//.word 0x6ef8ffa6 -//.word 0x692b38c5 -//.word 0xf123da7e -//.word 0x2c82d493 -//.word 0x24362598 -//.word 0x6c949fa8 -//.word 0x07abea56 -//.word 0x85d2cde6 -//.word 0x6f84a9be -//.word 0xe56e4617 -//.word 0x86c5d2f8 -//.word 0x90dd2765 -//.word 0x48f84dd4 -//.word 0x9d5c40e0 -//.word 0x08a8f341 -//.word 0xb66794fc -//.word 0xe9e612d7 -//.word 0x9c43dd10 -//.word 0x66c7ed4e -//.word 0xa07505d8 -//.word 0xcae33905 -//.word 0x2b49aef4 -//.word 0xb8d8a17c -//.word 0x374daa66 -//.word 0xa4c542da -//.word 0xd4d38418 -//.word 0x58d03069 -//.word 0xa472f554 -//.word 0x71a0f014 -//.word 0x5f85704a -//.word 0xdfe4fcf0 -//.word 0x50ab978e -//.word 0x68ca42b0 -//.word 0xd645c397 -//.word 0x2588a52f -//.word 0xe4fc8041 -//.word 0x04d77aea -//.word 0x81380e4c -//.word 0x45730c83 -//.word 0x49a9e1da -//.word 0xfd9d193f -//.word 0xeac222f5 -//.word 0x95995389 -//.word 0xa7392c07 -//.word 0x4c2fe06d -//.word 0xd9891060 -//.word 0xb12eda1e -//.word 0x697112b4 -//.word 0x2ae5cf71 -//.word 0x57722a9a -//.word 0x70a8425f -//.word 0x3754840e -//.word 0x11512987 -//.word 0xaea1fff0 -//.word 0xecbc6daa -//.word 0xf928b183 -//.word 0xb84a6d2d -//.word 0x677c62ef -//.word 0x7e607b9a -//.word 0xda730dbf -//.word 0x1ae55d1f -//.word 0x4aa86363 -//.word 0xbfc7cd0d -//.word 0x41f947af -//.word 0x7076fa5a -//.word 0x6009525a -//.word 0x87660520 -//.word 0xd9bf5180 -//.word 0x3192851d -//.word 0xf3c5c221 -//.word 0xeff40331 -//.word 0x890a5ba0 -//.word 0x170e7ee2 -//.word 0x8b408344 -//.word 0x5265e8db -//.word 0x7c5fd7ba -//.word 0x1c00a768 -//.word 0xf220a692 -//.word 0x47ed16fc -//.word 0x198375bd -//.word 0x78bd02ac -//.word 0x304a7c16 -//.word 0xa8032db2 -//.word 0x0a7b27d6 -//.word 0xa4d8ceea -//.word 0x8fe2961e -//.word 0x8e5a0e58 -//.word 0x388d1e70 -//.word 0x5a298ca0 -//.word 0x974ec536 -//.word 0x51e8db8c -//.word 0xcd3dca3a -//.word 0x91c2ff8a -//.word 0x11331b2d -//.word 0x8be2f42c -//.word 0x3050dc21 -//.word 0x84fa27a6 -//.word 0x0775e70e -//.word 0x15bdfa53 -//.word 0x0bcb4750 -//.word 0xab654430 -//.word 0xc23abc27 -//.word 0x072ecf60 -//.word 0x47f33a36 -//.word 0xbfd9d8a6 -//.word 0xcae76904 -//.word 0xbc2a93ee -//.word 0x0d4d267f -//.word 0xba6aa4c4 -//.word 0xe8200174 -//.word 0xcae6a7db -//.word 0xc69ebd18 -//.word 0xd36ea988 -//.word 0x26cbd382 -//.word 0x0dd6ac45 -//.word 0x1becf02e -//.word 0x8578282f -//.word 0xcc0c727c -//.word 0x9cb18487 -//.word 0xf57bef2f -//.word 0x8860a134 -//.word 0x6449aeef -//.word 0xd16a5040 -//.word 0x7ccf2cc7 -//.word 0xd538d657 -//.word 0xb62798a7 -//.word 0x45376f4b -//.word 0x1baf57e3 -//.word 0xa657c893 -//.word 0xcb8b81b3 -//.word 0xd08d84c7 -//.word 0x7a2062b1 -//.word 0x7252b825 -//.word 0xed99fa5e -//.word 0x8c216f0f -//.word 0x81657d9d -//.word 0xf4fd278b -//.word 0xa5b6d436 -//.word 0xd2e852c2 -//.word 0x5b041a54 -//.word 0x246dd681 -//.word 0xbb892007 -//.word 0x3b178dbb -//.word 0x70c3eac3 -//.word 0x3bf7c505 -//.word 0x38f530df -//.word 0x9f23c119 -//.word 0x68a5dd18 -//.word 0xb3313654 -//.word 0x661f930c -//.word 0x18c0d038 -//.word 0x2ef125bf -//.word 0x43f0abea -//.word 0xce6e1b18 -//.word 0xfee5d9b4 -//.word 0xe92b3265 -//.word 0xe648e284 -//.word 0x3785dad3 -//.word 0xecc5406c -//.word 0x0318b6f7 -//.word 0xd48edf20 -//.word 0xad491f49 -//.word 0xb9d6a37b -//.word 0x26bea2a3 -//.word 0x8657e2fb -//.word 0x76e07dc6 -//.word 0x7ecde540 -//.word 0x396026d5 -//.word 0xb6796b91 -//.word 0x1dafc4d8 -//.word 0x969f2657 -//.word 0x6684b43a -//.word 0x5b093c9f -//.word 0x6b5b054b -//.word 0x9881c89c -//.word 0x17f0fcbf -//.word 0xb05a5623 -//.word 0x68c8912e -//.word 0x5ee86b2e -//.word 0xf3a8f092 -//.word 0x2d03fa5a -//.word 0x5e1bf9cc -//.word 0x0089f069 -//.word 0xe4f1c01f -//.word 0x8cd9a9c0 -//.word 0xd5bb0eb3 -//.word 0xd85878ea -//.word 0x1350de13 -//.word 0xc4f02413 -//.word 0x964be1b0 -//.word 0x7f8c658d -//.word 0xe98afb5c -//.word 0x109d6b4f -//.word 0xabb1c3cf -//.word 0xce985771 -//.word 0x0fa50726 -//.word 0xe876c0b2 -//.word 0x5c11465f -//.word 0xdd3330f2 -//.word 0x6ee434de -//.word 0x054fa4b8 -//.word 0x33d139eb -//.word 0x065010ad -//.word 0x2fcef231 -//.word 0x603dd81e -//.word 0xf895ae41 -//.word 0xe225587e -//.word 0xba26f30d -//.word 0x32965de3 -//.word 0xb544f76d -//.word 0x4a27a984 -//.word 0xbaf3279e -//.word 0xf5ee7341 -//.word 0xb200a4be -//.word 0x560ae51b -//.word 0x1779c051 -//.word 0x611b9db8 -//.word 0x783185bf -//.word 0x60c52ce0 -//.word 0xfa3e2fd3 -//.word 0x6f319a02 -//.word 0xd17aad3e -//.word 0x008ce0b0 -//.word 0xcb052412 -//.word 0x58866c1f -//.word 0xc6c16c47 -//.word 0x10d3a0a8 -//.word 0x35d5913a -//.word 0x96ad5449 -//.word 0x9f2a5329 -//.word 0xa9515025 -//.word 0x1ff1a6b8 -//.word 0xe07ed200 -//.word 0xe51b336f -//.word 0x24f90ec4 -//.word 0xb4e0d539 -//.word 0x310ba9fe -//.word 0x62391de7 -//.word 0x19013d62 -//.word 0x5b66cfab -//.word 0xc1abd843 -//.word 0x1e69629e -//.word 0x62de7d1b -//.word 0xbf88843a -//.word 0x0af2a10a -//.word 0x63cf93e0 -//.word 0x1845af4e -//.word 0xc78b2553 -//.word 0xc3b685d0 -//.word 0xb9d0823b -//.word 0x942bf597 -//.word 0x9df425a4 -//.word 0xe70b4553 -//.word 0xea123e7c -//.word 0x6ec5afd3 -//.word 0xab893219 -//.word 0xae47e28f -//.word 0xfe7a1ab0 -//.word 0x80877f1f -//.word 0x984e40df -//.word 0x91fe9cc2 -//.word 0x3f2da524 -//.word 0xe22844d8 -//.word 0x4e877e63 -//.word 0x4905f568 -//.word 0x358fb264 -//.word 0xef9b219c -//.word 0xf6bb5d53 -//.word 0xd072ae3f -//.word 0xa946513e -//.word 0x3e167746 -//.word 0xf9ae8f9a -//.word 0x5d99c844 -//.word 0xa536d2bf -//.word 0xa80fe5f4 -//.word 0x00650568 -//.word 0x6b1084b3 -//.word 0x7186c834 -//.word 0x48394f03 -//.word 0xf426ef27 -//.word 0xb2aa6309 -//.word 0x97980329 -//.word 0x758ad310 -//.word 0xfe74bf86 -//.word 0x2c7f2504 -//.word 0xe014946c -//.word 0xc936d4f8 -//.word 0x87162670 -//.word 0x10e1cca1 -//.word 0x53ddcc0a -//.word 0x1cb4f2d8 -//.word 0x38101415 -//.word 0xd967991c -//.word 0x3c193c50 -//.word 0x88b80e0d -//.word 0xfaa6badf -//.word 0x3fe60df2 -//.word 0x212cb6ca -//.word 0x66364a34 -//.word 0xf55f8b7d -//.word 0x3b72e9e1 -//.word 0xcdbc4946 -//.word 0x4f65062b -//.word 0x940035db -//.word 0x06602ee6 -//.word 0x49ad48d1 -//.word 0x1bb8e30d -//.word 0x7f8cac26 -//.word 0x1a461c3d -//.word 0xdd2642b8 -//.word 0xe4e5c338 -//.word 0x9e491fcb -//.word 0x2ff83564 -//.word 0x128a0a88 -//.word 0x03e1c649 -//.word 0x1cbdff78 -//.word 0x3e8b3a17 -//.word 0xb27eaf0d -//.word 0x10e14d1d -//.word 0x60acfe19 -//.word 0x80552c53 -//.word 0xc6e88455 -//.word 0xe55afad2 -//.word 0x151b0ddc -//.word 0x6eea4c56 -//.word 0x95ed19ad -//.word 0x9b01adc3 -//.word 0x224f5c2c -//.word 0xc2201a9d -//.word 0xabf23fa1 -//.word 0x8bca878e -//.word 0xb2cd5db8 -//.word 0x740a59e4 -//.word 0xce9b0700 -//.word 0x4decea11 -//.word 0x2c5ac06c -//.word 0xbc000829 -//.word 0x09cdc2d5 -//.word 0xbbda7667 -//.word 0x3afb7775 -//.word 0x169569a8 -//.word 0xa5af016e -//.word 0xee4b0cee -//.word 0xc5f6b341 -//.word 0x389efddf -//.word 0x2aa49557 -//.word 0x3e32ce44 -//.word 0xf7cfe47c -//.word 0x1d30858a -//.word 0x62518f5f -//.word 0x45c51c44 -//.word 0x374bbc13 -//.word 0xfca101a7 -//.word 0x559d4191 -//.word 0xdc79970c -//.word 0x2f6f2b34 -//.word 0x5085b372 -//.word 0x4cab3a3b -//.word 0x1b0320fa -//.word 0xc880634a -//.word 0xd2b21c69 -//.word 0xd1e04de9 -//.word 0x5c58d9a9 -//.word 0x2b03d404 -//.word 0x793cfd48 -//.word 0xace2896a -//.word 0x38ac23f8 -//.word 0xc1bd304e -//.word 0x8079570d -//.word 0xe79641c9 -//.word 0x88769d02 -//.word 0x33b46856 -//.word 0x5efd6bf4 -//.word 0xca210554 -//.word 0x64692a26 -//.word 0x6a2cac88 -//.word 0xce9db97b -//.word 0xdfe7a698 -//.word 0x267ceaff -//.word 0x8ea96e91 -//.word 0xc96f045f -//.word 0xee8e3461 -//.word 0x67e23f6c -//.word 0x0af25e5e -//.word 0x86c74b9c -//.word 0x01fa02be -//.word 0xff11c988 -//.word 0x860c6e1c -//.word 0x803ad06f -//.word 0x6051a0fa -//.word 0x08be69b2 -//.word 0xea3ace39 -//.word 0x6e9e1456 -//.word 0x94f8e0a3 -//.word 0xdbde4185 -//.word 0x6102f061 -//.word 0x4b07d70d -//.word 0x6793d185 -//.word 0x10a6b1e0 -//.word 0x532a8582 -//.word 0x50cb1c92 -//.word 0xe208c5af -//.word 0x828a5ade -//.word 0x68b57dc7 -//.word 0xf47e2222 -//.word 0x4d7c4e6c -//.word 0x48411dde -//.word 0x8bea0a9f -//.word 0xf2f56b39 -//.word 0x31533b4a -//.word 0xbbbe1c7c -//.word 0xe34d9cb6 -//.word 0x4146b894 -//.word 0x58339f15 -//.word 0x7538b894 -//.word 0xdaa3e5fa -//.word 0x1cc50a31 -//.word 0xca01c9dc -//.word 0x4f229045 -//.word 0x1af1d696 -//.word 0xfc08a14d -//.word 0xd1e14cea -//.word 0x623287ea -//.word 0x8a7d9ff9 -//.word 0x98e20064 -//.word 0xf539f8cd -//.word 0x075dbd22 -//.word 0x54cab2d0 -//.word 0xeb6be633 -//.word 0x00addd51 -//.word 0xd6d894c9 -//.word 0xe29fbf06 -//.word 0x2df655b8 -//.word 0xfa234e85 -//.word 0xa918acfb -//.word 0xdb00b8ca -//.word 0xd7188e30 -//.word 0x2cc0dbb4 -//.word 0x98d2e617 -//.word 0x2932cd88 -//.word 0xa2a61117 -//.word 0x20e8556c -//.word 0xfdfa63b9 -//.word 0xf5ba70ed -//.word 0x87b6a12b -//.word 0x9e41ce7a -//.word 0x71c785be -//.word 0xa85d52e7 -//.word 0xc09c3d68 -//.word 0xb0b095ea -//.word 0xcdacec42 -//.word 0xeb2063a1 -//.word 0xc5ee280b -//.word 0x9f593c0b -//.word 0x295f7aa4 -//.word 0xa749d58a -//.word 0x4f80e193 -//.word 0xf2a29568 -//.word 0xdfd54f80 -//.word 0x055c184f -//.word 0x576829ba -//.word 0x7530afcf -//.word 0x8843ccb3 -//.word 0x6d1ddedb -//.word 0x17f9037f -//.word 0x2ee7dd4c -//.word 0xfc1e925a -//.word 0x8a93175d -//.word 0x06cbaf1f -//.word 0x68edae2e -//.word 0x561b83d1 -//.word 0x4402f541 -//.word 0xdfb0ad16 -//.word 0xaca6f500 -//.word 0xec2fbfb7 -//.word 0xc4f0e935 -//.word 0x9abfbf22 -//.word 0xc2b9c290 -//.word 0x5a8ea8e8 -//.word 0x7220a324 -//.word 0x714de63f -//.word 0xb30866ea -//.word 0x77afdd81 -//.word 0xf998153d -//.word 0xdbee63ab -//.word 0xc9bb715d -//.word 0x5d4541df -//.word 0x409e6fec -//.word 0x9377b7e2 -//.word 0x8d35b674 -//.word 0x6547f59f -//.word 0x72b623df -//.word 0x91fda2a2 -//.word 0xc71c46fd -//.word 0x27e8599e -//.word 0xf6a5e202 -//.word 0x0ed626e8 -//.word 0x80547005 -//.word 0x7d9e0ef9 -//.word 0x77709c82 -//.word 0x839785ef -//.word 0x0203c6d8 -//.word 0x801ef50d -//.word 0xdc5c82cc -//.word 0xa9133e37 -//.word 0xd58e1904 -//.word 0x885d3077 -//.word 0x4fee078d -//.word 0x7a62127b -//.word 0xc3997b56 -//.word 0x308f1f14 -//.word 0x3aecdab3 -//.word 0x2ed604b8 -//.word 0xd40a3bdb -//.word 0x4f2b6301 -//.word 0x4459ec6a -//.word 0x3e06532c -//.word 0x5105ece0 -//.word 0xfee4de9b -//.word 0x577c6f20 -//.word 0x63c68253 -//.word 0xc4f15df1 -//.word 0x97b1b07f -//.word 0x9cd9d380 -//.word 0x972c50eb -//.word 0xf670a1dc -//.word 0xb3c53b8a -//.word 0x7c35cb79 -//.word 0x128cbff1 -//.word 0xef6a08ae -//.word 0x2b961ed9 -//.word 0xa0954537 -//.word 0x4d7c10a1 -//.word 0xf80223b4 -//.word 0x17d93cc9 -//.word 0xf13f7527 -//.word 0x01d0c378 -//.word 0x9b9ec37a -//.word 0xd283b6f7 -//.word 0x98b6c9f7 -//.word 0x279d9b34 -//.word 0xa0e2f9ce -//.word 0xf2c9ec40 -//.word 0xfec1f593 -//.word 0xf93997d2 -//.word 0x11b416bd -//.word 0x53207fc1 -//.word 0xcc63e828 -//.word 0xee38f98e -//.word 0x3639ab94 -//.word 0x0c3c50d8 -//.word 0xebe3d424 -//.word 0xc16f42e5 -//.word 0x99d589df -//.word 0x77148120 -//.word 0x83c52932 -//.word 0x6af43395 -//.word 0x022ec26c -//.word 0x2ddb7277 -//.word 0xffcf9941 -//.word 0x231bcc9b -//.word 0x7a29a548 -//.word 0x0608c4fa -//.word 0x0704147e -//.word 0x637a4f33 -//.word 0x4beac5c0 -//.word 0x1c4e5906 -//.word 0x83aacc54 -//.word 0xe5e53eda -//.word 0xfed7f161 -//.word 0xc8a35139 -//.word 0x9e473172 -//.word 0xa171584f -//.word 0x5b953cf7 -//.word 0xa23c0d6e -//.word 0xbf9ff5c4 -//.word 0xd0749f8c -//.word 0x6b08f690 -//.word 0x848e2fc3 -//.word 0x91b60977 -//.word 0xeb8253d0 -//.word 0x7856af79 -//.word 0x874e9795 -//.word 0xfbd39df9 -//.word 0xac71f798 -//.word 0x0ae33a3e -//.word 0x04706682 -//.word 0x287b23f6 -//.word 0x0b554aa0 -//.word 0xeb55a7ae -//.word 0x932bfe65 -//.word 0x7f714b5b -//.word 0x41834ee6 -//.word 0x239147d4 -//.word 0x0ef2ff5c -//.word 0xaabb0755 -//.word 0xc79144a6 -//.word 0xfcbbacfe -//.word 0x8d7b4ac5 -//.word 0x929f8852 -//.word 0x5653ad5e -//.word 0xfe39a5b8 -//.word 0x6bbc013b -//.word 0x61a13efe -//.word 0xe8de4aca -//.word 0xf2b044d1 -//.word 0x3fe8839c -//.word 0x7e85db46 -//.word 0xb5881be8 -//.word 0xe204da54 -//.word 0xe3757406 -//.word 0x93524f57 -//.word 0x36e663f4 -//.word 0x175bf98f -//.word 0x6f18b2d4 -//.word 0x894dcc9f -//.word 0x24cba16c -//.word 0x191a700f -//.word 0x3dc560a5 -//.word 0x89f9c2ca -//.word 0x784e970c -//.word 0xb1e552a0 -//.word 0xe6b3df54 -//.word 0xfc1ce3c5 -//.word 0x6cc446d2 -//.word 0xe9a2ef50 -//.word 0x4356ceff -//.word 0x8bbc20bd -//.word 0x78c1eefa -//.word 0x0975d76c -//.word 0x6c621004 -//.word 0x1f1da920 -//.word 0x551a1202 -//.word 0x9bc4dd81 -//.word 0xbbcdc5fe -//.word 0xe0c3f09a -//.word 0xfce571a6 -//.word 0x6734115c -//.word 0xc9cd4fcc -//.word 0x3975a518 -//.word 0xa6760de4 -//.word 0x76aac409 -//.word 0x6ed54e89 -//.word 0xd237bac8 -//.word 0xcd6227f9 -//.word 0x124a87d6 -//.word 0xc49ba394 -//.word 0x944f6016 -//.word 0x297f4061 -//.word 0xc4792b50 -//.word 0x24147088 -//.word 0xa74007af -//.word 0xb3e119d9 -//.word 0x54dec143 -//.word 0x26741544 -//.word 0x76d16080 -//.word 0xa4deb25f -//.word 0xcb5c9bbe -//.word 0xa43233e4 -//.word 0xa8055db7 -//.word 0x750a4d2f -//.word 0x7318480c -//.word 0xb702abc4 -//.word 0x28232fc0 -//.word 0xe03a6bc7 -//.word 0xd5799bbb -//.word 0xb8d89f83 -//.word 0x1daf4748 -//.word 0xdd84cde4 -//.word 0xb821a397 -//.word 0x3fea6ffc -//.word 0xf26e553c -//.word 0xa53c7482 -//.word 0x28f8b3af -//.word 0x26aebd4e -//.word 0x4e654aca -//.word 0xb1f8a1de -//.word 0x6b215a4e -//.word 0x86d769d5 -//.word 0x1bda585e -//.word 0xba8cd477 -//.word 0x0c026b02 -//.word 0xb75b942d -//.word 0x8250f0a5 -//.word 0xba0dcf07 -//.word 0xd43ff698 -//.word 0x536fa035 -//.word 0xed8ec28d -//.word 0xe9d1938d -//.word 0xcbbf4c1c -//.word 0x33882c09 -//.word 0x0398c041 -//.word 0xc06c6146 -//.word 0x3ba4fedc -//.word 0x705a1c06 -//.word 0xaeb31a30 -//.word 0xf8b3baae -//.word 0xac56dd65 -//.word 0x62dc8ec8 -//.word 0x17644207 -//.word 0x8bbc5e82 -//.word 0xe778fa84 -//.word 0xa341e52e -//.word 0xa770e9b1 -//.word 0xb0dc50c1 -//.word 0xf6efa646 -//.word 0x0c00c154 -//.word 0x07dcff5d -//.word 0xe2a6cfa5 -//.word 0x21e273f7 -//.word 0xb5cc0497 -//.word 0x20eeb677 -//.word 0xd9f15dad -//.word 0xf2b43025 -//.word 0xf89bcd93 -//.word 0x1b2a7eac -//.word 0x8ed2bb96 -//.word 0x310af09d -//.word 0x6ea28027 -//.word 0x605409ea -//.word 0x3b9dea5c -//.word 0xe8cb026b -//.word 0xef56bb6f -//.word 0x9a73475d -//.word 0x58e72a3d -//.word 0x5f19f9de -//.word 0x956c61c8 -//.word 0xb1cb6a72 -//.word 0x9d86fdb5 -//.word 0x1f5ca581 -//.word 0xb9d992cf -//.word 0xcee2e3d6 -//.word 0x058e2582 -//.word 0xf3371622 -//.word 0xf4d1af61 -//.word 0x597b6277 -//.word 0xc954a1a0 -//.word 0xe1909fcd -//.word 0x1ecb5a9a -//.word 0xfd9cd981 -//.word 0x606eb24d -//.word 0x348bd0d1 -//.word 0x517a73d9 -//.word 0xa18b7861 -//.word 0x85b0db05 -//.word 0x748e7ab9 -//.word 0xe6d41cba -//.word 0x70ccb1c5 -//.word 0x3030dc86 -//.word 0x6b3eae53 -//.word 0x750eb51a -//.word 0xd1243598 -//.word 0x9a42b5cc -//.word 0x217fbdac -//.word 0xd89ddf16 -//.word 0x6f98f409 -//.word 0x3c7ba815 -//.word 0xe0773910 -//.word 0x28367b0b -//.word 0x316d2084 -//.word 0xd0b136de -//.word 0x308bf10e -//.word 0xbdceab96 -//.word 0x412829b7 -//.word 0x4df820e2 -//.word 0xdb5ff771 -//.word 0x319acf94 -//.word 0x098fc18e -//.word 0xeea56621 -//.word 0xe9d99d46 -//.word 0x5d0f8822 -//.word 0x30a5d836 -//.word 0x2b4e4bd6 -//.word 0xa41e72dc -//.word 0x5ae1b89d -//.word 0xa0b1a01c -//.word 0xbec84e7e -//.word 0x949249be -//.word 0x80067fa2 -//.word 0x82378aee -//.word 0x9e2631d7 -//.word 0x82db32ba -//.word 0x69b43f0e -//.word 0x3ffc4698 -//.word 0x06bff5dd -//.word 0x78dd7edd -//.word 0xee5e97fe -//.word 0x8005c547 -//.word 0x6e28dbce -//.word 0xbfbfbd74 -//.word 0x27ba6acf -//.word 0x2e983a68 -//.word 0x8f356427 -//.word 0xdee3c20b -//.word 0x6ebdd91e -//.word 0x723814a9 -//.word 0x62fb50a4 -//.word 0xa1f19d70 -//.word 0x5c9c43c9 -//.word 0xb5ac04f6 -//.word 0x21d0a142 -//.word 0x0ecca0b0 -//.word 0xcacc4beb -//.word 0xa0f7fc7c -//.word 0x4448983f -//.word 0x71995a18 -//.word 0xd001d2e2 -//.word 0x1c602da8 -//.word 0x8438b618 -//.word 0x50bf9d34 -//.word 0xc832f74b -//.word 0x516b0728 -//.word 0xdab6bc89 -//.word 0x76e17ad3 -//.word 0x4a921e03 -//.word 0xaadd3ce8 -//.word 0x7f16aa90 -//.word 0xece44300 -//.word 0x3197e527 -//.word 0xcfbcbc15 -//.word 0xedeec369 -//.word 0xfaef8708 -//.word 0x94f72f15 -//.word 0xa84bb91d -//.word 0xdb128691 -//.word 0x2964197a -//.word 0xcca51c68 -//.word 0x6011a3ab -//.word 0x4497b5c6 -//.word 0x43eb0921 -//.word 0x74d70dfe -//.word 0x5ed22cae -//.word 0x60d35105 -//.word 0x5167a70b -//.word 0x6302a4f4 -//.word 0x4d924553 -//.word 0xa95a9b8a -//.word 0x9afe8685 -//.word 0xb3dac1a8 -//.word 0x14981e05 -//.word 0xd60213d3 -//.word 0xaa14761b -//.word 0xbc5685b5 -//.word 0xde692973 -//.word 0xe2df7c9c -//.word 0x4750889c -//.word 0x19a952f9 -//.word 0x12c81789 -//.word 0x0546d5e3 -//.word 0x7d940d13 -//.word 0xa14ac792 -//.word 0x5abbd875 -//.word 0xb8cd60e4 -//.word 0x920896ce -//.word 0x6decc8db -//.word 0x9f889da2 -//.word 0xb5489e1d -//.word 0x110ff459 -//.word 0xd8857372 -//.word 0x0bb3d8bf -//.word 0xf3cd4f4a -//.word 0xc34e3983 -//.word 0x794a2b35 -//.word 0x05003ab8 -//.word 0xadb07669 -//.word 0xb0acb457 -//.word 0x29b0913f -//.word 0x3776b3bb -//.word 0x5b8652b6 -//.word 0x214cf723 -//.word 0x036c84ee -//.word 0x8a5a7533 -//.word 0xb62565af -//.word 0xa093d474 -//.word 0x5e7327e0 -//.word 0x272ff0cf -//.word 0xb7a17010 -//.word 0xf5275b16 -//.word 0xd4fadaf0 -//.word 0x77bbd67c -//.word 0x984f74d7 -//.word 0x2aeddc17 -//.word 0x3d753f3d -//.word 0x23041865 -//.word 0xd1c5b240 -//.word 0x870aeac4 -//.word 0xb49b3622 -//.word 0x144de6f9 -//.word 0x1bd7aac9 -//.word 0x96e255aa -//.word 0x905fe03e -//.word 0x721db2e4 -//.word 0x6f9b1e2e -//.word 0x1f1b2e96 -//.word 0x6af79f6c -//.word 0xa8382c13 -//.word 0x0665106d -//.word 0x2c99c694 -//.word 0x1dd813cb -//.word 0x5ea346b4 -//.word 0x5acabfc3 -//.word 0x0582aef2 -//.word 0xc0b71db6 -//.word 0x7da43132 -//.word 0x23a0acab -//.word 0x343bb73d -//.word 0xad89dfcc -//.word 0x2dbe5d3d -//.word 0x5afb9ae5 -//.word 0x8068f241 -//.word 0x7c83b8e8 -//.word 0xd9b87bbf -//.word 0x3831886c -//.word 0xf5efb00d -//.word 0x071a4c29 -//.word 0x28957ee6 -//.word 0x37d6b97d -//.word 0xdaf583ec -//.word 0x670279eb -//.word 0x059c9420 -//.word 0x0ebfac96 -//.word 0xb8de3a6c -//.word 0xf53262ca -//.word 0x97513119 -//.word 0xb8022374 -//.word 0x5950e859 -//.word 0x49dd67a5 -//.word 0x497904bf -//.word 0x6df31e13 -//.word 0xc52fdcc2 -//.word 0x3d792a97 -//.word 0xc219fe3e -//.word 0xa628e0b0 -//.word 0x46a2a9f2 -//.word 0xeabc8bff -//.word 0xec775103 -//.word 0x1d75e8c9 -//.word 0x640b1f77 -//.word 0xa899ab79 -//.word 0xf0166ebb -//.word 0xc9eff91b -//.word 0xe9124f1e -//.word 0x1145ebe1 -//.word 0x38bd0553 -//.word 0xe5ec12a2 -//.word 0xdd9a8af3 -//.word 0xfe37ed56 -//.word 0x6b7008f9 -//.word 0xe900759c -//.word 0x89c96144 -//.word 0x88239134 -//.word 0x7374a719 -//.word 0x8e01a285 -//.word 0x7703a59e -//.word 0x07fef918 -//.word 0x794e5460 -//.word 0xce025c1a -//.word 0x6fee67ce -//.word 0x15fc85de -//.word 0xe6c3c0bc -//.word 0xe15ba259 -//.word 0x7b6ff8e1 -//.word 0x8a93d6a5 -//.word 0x63d8db59 -//.word 0x3f9eb67f -//.word 0xe4aae923 -//.word 0x8179cdc9 -//.word 0xd9d3d7a4 -//.word 0xa3a31908 -//.word 0x31050c22 -//.word 0x51a18ce7 -//.word 0x7138244a -//.word 0x067c8cb2 -//.word 0x2e2570ab -//.word 0x934173db -//.word 0x93cb7439 -//.word 0x9f801079 -//.word 0xe1ee68ca -//.word 0x22ce24c4 -//.word 0xea93b89c -//.word 0xe943e59b -//.word 0x958683ce -//.word 0x15fd7ffe -//.word 0x5ed420e2 -//.word 0x9c9b8e94 -//.word 0xd3519442 -//.word 0xc6c2a526 -//.word 0x18141db8 -//.word 0xb19cca22 -//.word 0x63f6abf4 -//.word 0xcd54f719 -//.word 0x8016610a -//.word 0x619b9b41 -//.word 0x4f5719f1 -//.word 0x052617f4 -//.word 0x41e0dd04 -//.word 0x262e422f -//.word 0xde9c6f85 -//.word 0x85efe514 -//.word 0x42b8c216 -//.word 0xb7293f68 -//.word 0x9c287e3e -//.word 0xa6a28316 -//.word 0xae2280ea -//.word 0x0fa255aa -//.word 0x50a157e9 -//.word 0x037550d7 -//.word 0xece3c86f -//.word 0x66ed83f1 -//.word 0x03eb4b93 -//.word 0x73ddf073 -//.word 0xa7008cd1 -//.word 0x359f0b7b -//.word 0xff2ceb88 -//.word 0x108f4149 -//.word 0xc6befd7d -//.word 0x368e6ec4 -//.word 0xccc90957 -//.word 0x328066f5 -//.word 0x73a28b21 -//.word 0x61ce6d8a -//.word 0x3466b4cb -//.word 0x73e5bf54 -//.word 0x1872e8a8 -//.word 0xefb509ca -//.word 0x3fe93ff1 -//.word 0xac32ed83 -//.word 0x5c310441 -//.word 0x59d682bf -//.word 0x36763918 -//.word 0xf61ed2df -//.word 0x29261159 -//.word 0x58095be9 -//.word 0xa37475cb -//.word 0xa99c8e05 -//.word 0xa8d5809b -//.word 0xe5615303 -//.word 0x4f8502d8 -//.word 0x5fe282d3 -//.word 0x420301f6 -//.word 0x3a336c0a -//.word 0x4291334c -//.word 0xf1665064 -//.word 0xa0b58696 -//.word 0xcf14e63c -//.word 0xc5bb9874 -//.word 0x77dbd816 -//.word 0xab313fe9 -//.word 0x5dda4416 -//.word 0x626902dc -//.word 0x4b373c86 -//.word 0x8cfa9e9a -//.word 0xde994554 -//.word 0xe13f8252 -//.word 0x06afdb91 -//.word 0xacd75398 -//.word 0x89a7ecf3 -//.word 0x4c2369e3 -//.word 0x80b75854 -//.word 0xb4cb500f -//.word 0xd9987831 -//.word 0xeb3a48dc -//.word 0xd406942c -//.word 0x8d1dc66d -//.word 0x86416b8b -//.word 0x48e8f1c9 -//.word 0x598faeb6 -//.word 0x5f51255e -//.word 0x89b885bd -//.word 0x2bd37379 -//.word 0xa88909d0 -//.word 0x952c1fce -//.word 0x1b52c9c4 -//.word 0x9de020f7 -//.word 0x9b674695 -//.word 0xd7b4a4ed -//.word 0xb6a276de -//.word 0xe8338a90 -//.word 0x4bdf4463 -//.word 0x0d2ce625 -//.word 0x127f0e88 -//.word 0x953281d3 -//.word 0x11e626d7 -//.word 0x621b5625 -//.word 0x27fe537e -//.word 0x6c81158b -//.word 0x86b14dce -//.word 0x3d45a4d9 -//.word 0x317243be -//.word 0x760799c6 -//.word 0x82b55866 -//.word 0x49aec16e -//.word 0xa6732284 -//.word 0xfde69dd1 -//.word 0x1fa72afa -//.word 0x6d9ddf52 -//.word 0x41d3704e -//.word 0x8986f239 -//.word 0xb57ce428 -//.word 0xd4976f31 -//.word 0xf9a9edd8 -//.word 0xe48aa9ca -//.word 0xde68e5ce -//.word 0xe55f22f8 -//.word 0x09499b1f -//.word 0x16d81392 -//.word 0x73e2d007 -//.word 0x4afbe8d4 -//.word 0xe949bb62 -//.word 0x6994c1de -//.word 0x8d9d8631 -//.word 0xecb1f233 -//.word 0x537dce1b -//.word 0x6524843b -//.word 0x848f26ea -//.word 0xf505b2c1 -//.word 0x3efb950a -//.word 0xd32d6d75 -//.word 0xf2ed130d -//.word 0xccbbd96b -//.word 0xe5171029 -//.word 0xbd93ce9a -//.word 0xb02ceeb8 -//.word 0x1bda575e -//.word 0xc06682b8 -//.word 0x6c7c36f7 -//.word 0xd7019649 -//.word 0xcba65e08 -//.word 0x88be6a31 -//.word 0x684d7819 -//.word 0xbf612e5b -//.word 0x05a55f15 -//.word 0x37338a54 -//.word 0x7aaaa3cc -//.word 0x028016cd -//.word 0x329a0a72 -//.word 0x041ae21c -//.word 0xac790a1e -//.word 0x78d5f0ba -//.word 0xfb8c504d -//.word 0x6a09b5c6 -//.word 0x46de3d5c -//.word 0x3b139c81 -//.word 0x49be6311 -//.word 0x21d483d0 -//.word 0xd23f0c13 -//.word 0xa4313bbd -//.word 0x44b7b46d -//.word 0x22910cf6 -//.word 0x18418a10 -//.word 0x4c622f4d -//.word 0x573bf34e -//.word 0xa7945236 -//.word 0x21c8075f -//.word 0x0b1c184c -//.word 0x2a4f12df -//.word 0x277396cc -//.word 0x38fb144e -//.word 0xfc14d719 -//.word 0xa639428f -//.word 0x5d015936 -//.word 0xe33c836a -//.word 0x753f8d4f -//.word 0xf37cf30a -//.word 0x41565b31 -//.word 0xed33637f -//.word 0x12d29ccd -//.word 0x7cdfd63d -//.word 0x0cc49fb9 -//.word 0x5ec3069c -//.word 0xaa41a5ae -//.word 0xe865de56 -//.word 0x38e2640b -//.word 0x8011fd0c -//.word 0x57438751 -//.word 0x225539c1 -//.word 0x7c852ca5 -//.word 0xdc831a5d -//.word 0x71cc6551 -//.word 0x51335b2b -//.word 0xd3c0b844 -//.word 0x39be6c5b -//.word 0x93109f8d -//.word 0xe0c4f381 -//.word 0x75eb09e4 -//.word 0xa3a74615 -//.word 0x9485d721 -//.word 0x760df2f1 -//.word 0xdb985fc2 -//.word 0x606238d6 -//.word 0x8de0ed69 -//.word 0xfd548ae7 -//.word 0xbf9e3d5c -//.word 0xfb55132c -//.word 0xd9160204 -//.word 0x9e1c2c10 -//.word 0x1911626f -//.word 0x3d24e7e4 -//.word 0x0f5c77ce -//.word 0xc32c885a -//.word 0x2147d0f7 -//.word 0x2eb5070a -//.word 0x0927eee3 -//.word 0x138890f0 -//.word 0x52d4c831 -//.word 0x182d03ec -//.word 0xdf2c47a2 -//.word 0x78757541 -//.word 0x658ecb9b -//.word 0x83f1ac17 -//.word 0xec5fa4a7 -//.word 0x1b78a7fa -//.word 0x518999f2 -//.word 0x38a51458 -//.word 0xc6f765cf -//.word 0x6556d706 -//.word 0x511a3532 -//.word 0x412e8abc -//.word 0x49672b36 -//.word 0xff14f794 -//.word 0xddd7de99 -//.word 0xe6b3a08f -//.word 0x8c65d73b -//.word 0xd2f83810 -//.word 0xae9416a3 -//.word 0xb197275f -//.word 0xe9e68b7a -//.word 0x07860a27 -//.word 0xbd669e0e -//.word 0x6a7f31f9 -//.word 0xf91fa7d0 -//.word 0x06821fc7 -//.word 0x43a376d6 -//.word 0x1b510d6a -//.word 0x9585cd5a -//.word 0x7af3681c -//.word 0xbadfe139 -//.word 0x0c324efe -//.word 0xd5cddd74 -//.word 0x4b1d1593 -//.word 0xdaf05eb3 -//.word 0xc787c443 -//.word 0x13ecf8bd -//.word 0xa28697d9 -//.word 0x9ceaaf02 -//.word 0x14f48006 -//.word 0xe7177f11 -//.word 0xe7f1a1dc -//.word 0x3922d522 -//.word 0xfc5fd254 -//.word 0x2bc2148d -//.word 0xc56421c8 -//.word 0x2b2e1151 -//.word 0xc9ec4d79 -//.word 0xf8a3978e -//.word 0x23254b0a -//.word 0x29e2e40b -//.word 0x0301c103 -//.word 0xa7b02ab1 -//.word 0x2cb88e50 -//.word 0x2e540e0e -//.word 0x744340bf -//.word 0xd01c2cd3 -//.word 0x47e29b85 -//.word 0x72d89256 -//.word 0x249619ba -//.word 0x4e5d4011 -//.word 0x1fa864d8 -//.word 0x6f03af21 -//.word 0x5d20de40 -//.word 0x372847c8 -//.word 0x9b4f1ab6 -//.word 0xdcabe7eb -//.word 0xa74660e0 -//.word 0xe7726195 -//.word 0xe55c2dca -//.word 0xb4e4fb72 -//.word 0xccacb165 -//.word 0xf56fef55 -//.word 0x67954f03 -//.word 0x2f04ebb2 -//.word 0xd43820dc -//.word 0x3b969225 -//.word 0xc8fd708d -//.word 0xc69ffae9 -//.word 0x090f4094 -//.word 0xd19a2c62 -//.word 0xf2dbc2d5 -//.word 0x328aa794 -//.word 0xf395e018 -//.word 0x1272dda9 -//.word 0x0eb3b689 -//.word 0x6ddbb46f -//.word 0x5b701336 -//.word 0x955106d7 -//.word 0x854afc95 -//.word 0xaee62277 -//.word 0x4b8429fb -//.word 0x33ad4909 -//.word 0x00a58626 -//.word 0x704032ea -//.word 0x0cf7b3b4 -//.word 0x073b869c -//.word 0x680a84a9 -//.word 0x6cbf6445 -//.word 0x252e82ed -//.word 0x68f0de2d -//.word 0xe6fc68cc -//.word 0x99777b44 -//.word 0x62cea774 -//.word 0xf001b399 -//.word 0xe342e27b -//.word 0x31be76e4 -//.word 0xc9bb7356 -//.word 0x77e3a5fd -//.word 0x08dfe4e3 -//.word 0xae289763 -//.word 0xa61a77e0 -//.word 0x174b96b7 -//.word 0x3e1a9f71 -//.word 0xc88b5f3e -//.word 0x7f52849f -//.word 0x292da562 -//.word 0xad7783d3 -//.word 0x78fb8f31 -//.word 0x1f06ac5f -//.word 0x46c035dc -//.word 0xc0bb42f5 -//.word 0xf8cd2739 -//.word 0x8f1b3e2e -//.word 0x4677e742 -//.word 0x1feccc04 -//.word 0xbf966a94 -//.word 0x17b7cd58 -//.word 0x43089af1 -//.word 0xb24d536e -//.word 0x882cd7bf -//.word 0x403f286c -//.word 0x96687187 -//.word 0xa46548df -//.word 0x4ba43076 -//.word 0xd4586235 -//.word 0xd7cccddf -//.word 0x5cf75b44 -//.word 0x415276b7 -//.word 0xdce6cbc1 -//.word 0xe0a94d17 -//.word 0x850a7dca -//.word 0xe3cbe9be -//.word 0x9f0ff35d -//.word 0xcab4d48c -//.word 0x06e2e1de -//.word 0xebe40c08 -//.word 0xa937ad96 -//.word 0xeee183dc -//.word 0x0a04f52e -//.word 0x51b39e54 -//.word 0xc0040938 -//.word 0xe467b9e2 -//.word 0xf8366da6 -//.word 0x4e8da29c -//.word 0xf05b5851 -//.word 0x86b919bc -//.word 0x7a7b3874 -//.word 0x5b055720 -//.word 0x7f612b2e -//.word 0xed8e84c8 -//.word 0x791a8703 -//.word 0x31f33e5a -//.word 0xf87a545c -//.word 0x71d919a1 -//.word 0x1f96cc02 -//.word 0xca691a09 -//.word 0x244be2a7 -//.word 0xacd03b25 -//.word 0xd3b6b85d -//.word 0x5dbeeb2a -//.word 0x0bba271d -//.word 0x77e88a72 -//.word 0x3f7e3b42 -//.word 0x6586f1fa -//.word 0xf6ecb50b -//.word 0xead6e8e3 -//.word 0x4c33871d -//.word 0x9b97aef4 -//.word 0x6f465bfe -//.word 0x5f8f7517 -//.word 0x235b0d9a -//.word 0xf605e3d8 -//.word 0x3e6c2cc2 -//.word 0x6f4792e9 -//.word 0x2db97da9 -//.word 0xb12691a0 -//.word 0x6d447865 -//.word 0xf375e177 -//.word 0x1354c874 -//.word 0x438df88c -//.word 0x45f3cf34 -//.word 0x03cc421f -//.word 0xbe6f206a -//.word 0x67129b17 -//.word 0x4ddd04bc -//.word 0xf943d67c -//.word 0x5691f637 -//.word 0x16c739fe -//.word 0x50a827ca -//.word 0x6e0dff6d -//.word 0x467efbc8 -//.word 0x8703d43f -//.word 0x5738896a -//.word 0x3aa05d0d -//.word 0x363b1e4b -//.word 0x355bad16 -//.word 0xaab3bbea -//.word 0x77b1d1bb -//.word 0x0f0e932c -//.word 0xd7a34501 -//.word 0xd37e8ed7 -//.word 0x7e357c12 -//.word 0xf97ac918 -//.word 0x68f05dbd -//.word 0x9a3d13fd -//.word 0xe861c0f1 -//.word 0x5f4672fc -//.word 0x2197f546 -//.word 0x08d69c6b -//.word 0x8da93d74 -//.word 0xe8757e06 -//.word 0x792e4fd9 -//.word 0x676eb86c -//.word 0x87c4d5f7 -//.word 0x7f4e1fa2 -//.word 0x2b8aecf4 -//.word 0x3f693a8e -//.word 0x2ea5a819 -//.word 0x4b55c57d -//.word 0x2ebf8d53 -//.word 0x5a6d319e -//.word 0x1d8317b5 -//.word 0xb74f2284 -//.word 0xbe2233f4 -//.word 0xc05ef0a8 -//.word 0x2bd1c4ea -//.word 0x6a4126e5 -//.word 0x51481f14 -//.word 0xbb6306fa -//.word 0x71458f14 -//.word 0x4e71040c -//.word 0xa107d12f -//.word 0xd3de4621 -//.word 0x4ad499cf -//.word 0x8c622aa6 -//.word 0xa8740b03 -//.word 0xd277c0ea -//.word 0x4db343fa -//.word 0x8edb4ca0 -//.word 0x9ee2ce8c -//.word 0xc011c561 -//.word 0x54572fb1 -//.word 0xfbe05828 -//.word 0xfce85b07 -//.word 0xe6d2e6d4 -//.word 0x77743d50 -//.word 0xbdb682aa -//.word 0x7b5b33f2 -//.word 0xce1ef4d0 -//.word 0x10018f76 -//.word 0xfde239d3 -//.word 0x144f170a -//.word 0x409b0022 -//.word 0xb83185ff -//.word 0x24292e91 -//.word 0x0119074b -//.word 0x462e5bd7 -//.word 0x487bc008 -//.word 0xdb905310 -//.word 0xba4f45f3 -//.word 0x29fb973b -//.word 0xd89221ee -//.word 0x0b5dd9bd -//.word 0xf8c5527e -//.word 0x706883dc -//.word 0xc26cca4d -//.word 0xdd133145 -//.word 0xb490efaa -//.word 0xe71a3287 -//.word 0x9f3e1b04 -//.word 0xb9790a96 -//.word 0x28061d73 -//.word 0x94f5f349 -//.word 0x477db62f -//.word 0x4a9358dc -//.word 0xcbbb1c16 -//.word 0xc21f596e -//.word 0xd5de7b2b -//.word 0x78a64a84 -//.word 0x58856f12 -//.word 0xfafc3384 -//.word 0x9f568b95 -//.word 0x6c37523b -//.word 0xc778d521 -//.word 0x04329458 -//.word 0x4119474a -//.word 0x8e0c20ef -//.word 0x52ea5043 -//.word 0xeaa6ccf7 -//.word 0x929e5166 -//.word 0x8928a5cc -//.word 0x706e21b2 -//.word 0xf37d6cad -//.word 0xac988948 -//.word 0x44d2143f -//.word 0xdcdcc8ee -//.word 0xab1b4508 -//.word 0xe8fd108c -//.word 0xea8edcf5 -//.word 0x8e4608b2 -//.word 0xd92568d5 -//.word 0xde03480f -//.word 0xe221aedc -//.word 0xbf03e0fb -//.word 0x86822680 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00011758 -//// expected output -//.word 0xbcf7e3ac -//.word 0x677b3403 -//.word 0x18080a62 -//.word 0x12387096 -//.word 0x153ed60c -//.word 0x24b1ac5c -//.word 0x1744575e -//.word 0x7f94fd03 -//.word 0x63d2e0ca -//.word 0x6fa4d744 -//.word 0x5924963a -//.word 0xafb47cec -//.word 0x33632399 -//.word 0xc3533bbc -//.word 0x144bbaff -//.word 0xeeabe46f -//// SHA512LongMsgvector_90 -//// vector length -//.word 0x00011A70 -//// input message -//.word 0xc84f05b8 -//.word 0x0fe8318c -//.word 0xc378c25a -//.word 0x1c625cc0 -//.word 0x8f5ea853 -//.word 0xabcd5893 -//.word 0x414a651e -//.word 0xc7829b23 -//.word 0xfe45581a -//.word 0xd3dd91b2 -//.word 0x839e150b -//.word 0x03be1626 -//.word 0x9f67e59a -//.word 0xe10bfd88 -//.word 0xb4f843d0 -//.word 0xc92c8c85 -//.word 0x3a6a609f -//.word 0x6e8dfef0 -//.word 0x3c1d9f5a -//.word 0x5320ff3e -//.word 0xd9321a37 -//.word 0x52d83309 -//.word 0xc4121bd4 -//.word 0x182fb08e -//.word 0xc4e5a4af -//.word 0xa7a1802e -//.word 0x341ce8ad -//.word 0xd32f20f1 -//.word 0x84e8cf94 -//.word 0xc6dd03fe -//.word 0xb7c07691 -//.word 0x7c341024 -//.word 0xe3dfacb3 -//.word 0x47c11f54 -//.word 0xb5c4766d -//.word 0x4c948025 -//.word 0xeab08d18 -//.word 0x05c2744f -//.word 0xd62cdb6f -//.word 0xbde3b230 -//.word 0xe1800111 -//.word 0x1794e44b -//.word 0x053cd303 -//.word 0x87f627c3 -//.word 0x51b3da2b -//.word 0xd62e8fe4 -//.word 0x697bd2d6 -//.word 0xa2e3a09b -//.word 0x04ef2a33 -//.word 0xdcc3d6f9 -//.word 0x6cad87d5 -//.word 0x49fe1eb4 -//.word 0x02194135 -//.word 0x02c95ba5 -//.word 0xb8d8e32e -//.word 0xf5dde24b -//.word 0x9555af7f -//.word 0x61f5fd47 -//.word 0x343f184d -//.word 0x5d546cde -//.word 0x4509479e -//.word 0x523ce07b -//.word 0x0a6997df -//.word 0x7c787e2a -//.word 0xdbd9195f -//.word 0x6dd3621d -//.word 0xa31910d2 -//.word 0x8a9f192b -//.word 0x62ab76cf -//.word 0x8b2f264c -//.word 0xa9567551 -//.word 0x005d7e1f -//.word 0x20a4ef3a -//.word 0xc7050c64 -//.word 0x0364f7cb -//.word 0x97872e82 -//.word 0xa028552e -//.word 0x78493602 -//.word 0xdbc806ed -//.word 0x4833e911 -//.word 0xaaddb978 -//.word 0x38320302 -//.word 0x9a4753a2 -//.word 0x4db6b2ca -//.word 0x48a86c24 -//.word 0xe0331783 -//.word 0xe9e7d019 -//.word 0x1ea3c8ea -//.word 0xc3ad0080 -//.word 0x880250e1 -//.word 0xb1ebaebe -//.word 0x74d1aded -//.word 0xa252441a -//.word 0x8a95d1b9 -//.word 0x1bda5d3e -//.word 0x48552291 -//.word 0xb13c4abc -//.word 0x7f1ffae7 -//.word 0x8f788f87 -//.word 0xd48328d2 -//.word 0xf64f6476 -//.word 0x3f156d8a -//.word 0xb8ca35c5 -//.word 0x8ff0ffee -//.word 0xbcb12293 -//.word 0xe42e09fe -//.word 0x7e157f65 -//.word 0x34712961 -//.word 0x8cc754a1 -//.word 0xc75ef2e0 -//.word 0x0adede14 -//.word 0xbb1d68e9 -//.word 0x2e350d6d -//.word 0x81da860d -//.word 0xc4ea05c0 -//.word 0x5d46bb82 -//.word 0xabe19d04 -//.word 0xea1668a2 -//.word 0x573fe295 -//.word 0x9483636a -//.word 0x4def95b2 -//.word 0x1cc878fc -//.word 0xaa20a900 -//.word 0x18a8e31d -//.word 0x9dc5c606 -//.word 0x70e6d7b8 -//.word 0xe814c9af -//.word 0xe1cbfb59 -//.word 0x630841cb -//.word 0x7ea3e7b3 -//.word 0x78dff38d -//.word 0x2b40ab1a -//.word 0xa89c570e -//.word 0x20754809 -//.word 0x058619c9 -//.word 0x6c9c359e -//.word 0xb6a7991e -//.word 0x6f11dc19 -//.word 0x764e6cd0 -//.word 0x5eb51a61 -//.word 0x158ed986 -//.word 0xc36cc27f -//.word 0xf5bd5c4d -//.word 0xfb9f1b21 -//.word 0x8ef52614 -//.word 0xb7ba5d18 -//.word 0xec969b2f -//.word 0x7baf38db -//.word 0x2cc2d3d5 -//.word 0x21724e01 -//.word 0x02e019a2 -//.word 0x577bb4cb -//.word 0x351a6f16 -//.word 0x1d487597 -//.word 0x21de0813 -//.word 0x48d80e6e -//.word 0x3461cd63 -//.word 0x0230f378 -//.word 0x7217d930 -//.word 0x48d90882 -//.word 0xf23dfd8a -//.word 0x6a60297f -//.word 0x5e4f3ce5 -//.word 0x8fd5a303 -//.word 0x77924f98 -//.word 0x2e4db9ca -//.word 0x8e8c235f -//.word 0x9661202f -//.word 0x0c8656d9 -//.word 0x66ac83b6 -//.word 0xeb11be0b -//.word 0x16510083 -//.word 0x3b7ee2dc -//.word 0x6c72a8e0 -//.word 0x9e647f97 -//.word 0x08ba03bb -//.word 0xcc1e046c -//.word 0xd9d48a25 -//.word 0x104b16ef -//.word 0xa6f22bd4 -//.word 0xc94c0d97 -//.word 0x8647c9a2 -//.word 0xeaca7540 -//.word 0x678db90c -//.word 0x7a2d8faa -//.word 0x8b8046b4 -//.word 0x1526cdf7 -//.word 0x06602ee0 -//.word 0x69255931 -//.word 0x427323f8 -//.word 0xb9e48ec2 -//.word 0x7b814b0c -//.word 0x5eda7dfa -//.word 0x4457c04c -//.word 0x41c96a8d -//.word 0x0044118d -//.word 0x62314d12 -//.word 0x699fbecb -//.word 0x55da5185 -//.word 0x0c3fc0a1 -//.word 0xbf4e58c6 -//.word 0xcb01ffd3 -//.word 0xdd5c7518 -//.word 0x5a46dac5 -//.word 0xfe9771a2 -//.word 0xc372a301 -//.word 0x04d547f2 -//.word 0xe26e20b5 -//.word 0xe7b1a775 -//.word 0xe9270b33 -//.word 0x31097700 -//.word 0xdd0d936f -//.word 0x83804d4a -//.word 0x1795d984 -//.word 0x0ffdf66f -//.word 0xc4b7742f -//.word 0x1c2af36f -//.word 0x6671ed52 -//.word 0x85f6f7ac -//.word 0x51424373 -//.word 0x3a136a70 -//.word 0x2faf683a -//.word 0xbe79e865 -//.word 0x7cc2c3f7 -//.word 0xa7e1c31b -//.word 0x0a86ac1a -//.word 0x214b7d86 -//.word 0x7e8cf3b9 -//.word 0x6b794f7e -//.word 0xd169590d -//.word 0x5872a53d -//.word 0xd03615f5 -//.word 0xd0ff9fe3 -//.word 0x9c0f5071 -//.word 0x4c3191f5 -//.word 0x2b94aa28 -//.word 0x5ed984da -//.word 0xc66bb3e4 -//.word 0x270fb35d -//.word 0x89bc7211 -//.word 0xdeac0f2e -//.word 0xe6b3e241 -//.word 0x50d0bc61 -//.word 0x220270aa -//.word 0x5a5c92ee -//.word 0xd55c7ea6 -//.word 0x71799c2f -//.word 0x6ffbe333 -//.word 0x1b0f9c65 -//.word 0xae1b6971 -//.word 0x734f8532 -//.word 0x297d4d26 -//.word 0xa92a0020 -//.word 0xc8e5c33d -//.word 0x7fd7e819 -//.word 0x499c6f43 -//.word 0xcd51cdee -//.word 0xbdeeede9 -//.word 0xfed675d1 -//.word 0x09ad4a85 -//.word 0x916a56da -//.word 0x66ad8990 -//.word 0x99521d85 -//.word 0xe1461f29 -//.word 0x3d992b32 -//.word 0xdbd57791 -//.word 0x398f12a4 -//.word 0x8a3b6ead -//.word 0x5b451d83 -//.word 0x765dd887 -//.word 0x0612c5da -//.word 0xfda2facd -//.word 0xb3103d99 -//.word 0xcf780d51 -//.word 0x6ba0e714 -//.word 0x73cfc287 -//.word 0x4ee2dc82 -//.word 0xc19cb80a -//.word 0x103e6780 -//.word 0x66570817 -//.word 0x76de8b8c -//.word 0x637eba11 -//.word 0xdd31798a -//.word 0x8e104cfb -//.word 0xb46a1b41 -//.word 0x0f133201 -//.word 0xfdfe8cdf -//.word 0xe40e51f0 -//.word 0xd02a9d71 -//.word 0x5d9083b9 -//.word 0xd86b526c -//.word 0xa1a716f2 -//.word 0xd3046227 -//.word 0x27694d54 -//.word 0x167cbb5f -//.word 0x3e6fde3e -//.word 0x071cfcb1 -//.word 0x86557231 -//.word 0xa275f923 -//.word 0x753b2852 -//.word 0xf5d93a9c -//.word 0xd34712ec -//.word 0xa3dd7c68 -//.word 0x3e21b6eb -//.word 0x64de2fb5 -//.word 0xa6768e61 -//.word 0x8378f618 -//.word 0xd2758805 -//.word 0x60102a08 -//.word 0xd95587af -//.word 0xec4c5762 -//.word 0xaacde1dd -//.word 0x2f95bee4 -//.word 0x859adf31 -//.word 0xc59cd2b2 -//.word 0x7ffd40f1 -//.word 0x5cd2bbd4 -//.word 0x023ab686 -//.word 0x38efd5b5 -//.word 0x4b1a68fe -//.word 0xb06c32a5 -//.word 0xea6a6e8a -//.word 0xaf081458 -//.word 0x467a5800 -//.word 0x33477366 -//.word 0x169fa759 -//.word 0xd1ee7dc9 -//.word 0xe9b15234 -//.word 0x2f891162 -//.word 0x9f8d4252 -//.word 0x88e54474 -//.word 0xed95d619 -//.word 0x2b96dd27 -//.word 0xdd2b6111 -//.word 0xfd72d806 -//.word 0x4c39a769 -//.word 0xf314e682 -//.word 0x6aac6373 -//.word 0x995aea6d -//.word 0x3df5c423 -//.word 0x8ee87e7f -//.word 0x1f87ec94 -//.word 0x05a36cd5 -//.word 0x3b5b6f84 -//.word 0x4536366d -//.word 0x146fdad3 -//.word 0x2a908fab -//.word 0xfe422908 -//.word 0xa264e0d7 -//.word 0xa35a50cc -//.word 0x31a8c49c -//.word 0x7fbfb36d -//.word 0x6d168b8a -//.word 0x657dae5c -//.word 0x82afba96 -//.word 0xf8260eaf -//.word 0xb0338a95 -//.word 0x324d95a0 -//.word 0xc8aa65c4 -//.word 0xe00c7b0c -//.word 0xb3de6c43 -//.word 0x247fe7f4 -//.word 0xebdef496 -//.word 0xf2477a00 -//.word 0xff7c0423 -//.word 0x9408c4f7 -//.word 0x14d0d9b6 -//.word 0x26ebcd49 -//.word 0x5eb362ff -//.word 0x1b1c8e85 -//.word 0xab45c413 -//.word 0xb64d75e3 -//.word 0xd968d7e7 -//.word 0x9132e5bb -//.word 0x5b43a7d9 -//.word 0x1903b30c -//.word 0xb8bff427 -//.word 0x10fdaaf6 -//.word 0x0b0db275 -//.word 0x0ae10840 -//.word 0x841f8a4b -//.word 0xf073fed3 -//.word 0xe62a5794 -//.word 0x81fd343d -//.word 0x072aaa21 -//.word 0xccca432f -//.word 0x535e4624 -//.word 0xb7ab39ff -//.word 0x49c8a5b5 -//.word 0x7b751927 -//.word 0xfdae7151 -//.word 0x258058c4 -//.word 0x941c0c56 -//.word 0x172a6218 -//.word 0xcb5f0988 -//.word 0x85521208 -//.word 0x708bb08f -//.word 0xf8dd3d9f -//.word 0xe7f77e77 -//.word 0xce352889 -//.word 0xa7bca32e -//.word 0xb8c50d99 -//.word 0xbb398209 -//.word 0x3b7f9b43 -//.word 0x41913440 -//.word 0x30567323 -//.word 0xee2c066e -//.word 0x44c3ab74 -//.word 0x8832f612 -//.word 0x79444f9a -//.word 0x6a133a10 -//.word 0xa3d9db99 -//.word 0x0402b930 -//.word 0xeb86c29b -//.word 0x58758f9d -//.word 0x4fd4ea6e -//.word 0x7ea78d68 -//.word 0x204f2d03 -//.word 0x2116b703 -//.word 0x8309daf0 -//.word 0x0006c5c7 -//.word 0xf11532ef -//.word 0x6efba36e -//.word 0xb70deb5d -//.word 0xd243f199 -//.word 0x768db1bc -//.word 0x286a834c -//.word 0xa4b6a032 -//.word 0x7ec3e26d -//.word 0x09accb07 -//.word 0x78e6c948 -//.word 0x4318b82b -//.word 0xcd2da90e -//.word 0x43a7e2ad -//.word 0xc7362651 -//.word 0xce893645 -//.word 0xc664978a -//.word 0xfdf396cb -//.word 0xbe5e8a93 -//.word 0xbd9d59be -//.word 0xb48e3d2e -//.word 0x4f44c8bf -//.word 0x46a2267c -//.word 0xc829a313 -//.word 0x200f6c86 -//.word 0x93919a24 -//.word 0x878a6cb8 -//.word 0xeb43d400 -//.word 0xd28d3660 -//.word 0x610d6cd8 -//.word 0xecd80d34 -//.word 0x5c40ef82 -//.word 0xd4edeac9 -//.word 0x942fdff8 -//.word 0x1d92f91d -//.word 0x95b333d7 -//.word 0x6e531b0e -//.word 0x43aad5e1 -//.word 0x02fd62e0 -//.word 0x5073237c -//.word 0x292598bb -//.word 0xc7746e31 -//.word 0xc69fb92b -//.word 0x85957e2d -//.word 0xcf07749f -//.word 0xbbc20bc3 -//.word 0xd03caeea -//.word 0x6d6c45e8 -//.word 0x68dfffc5 -//.word 0xf6094eb5 -//.word 0xcbd9334a -//.word 0x8290bbe9 -//.word 0x3ed2ca7b -//.word 0x92fd1764 -//.word 0x9ebb78b9 -//.word 0x7bd360ad -//.word 0xda45a54d -//.word 0xe795876e -//.word 0x7467efe3 -//.word 0x534cf4f3 -//.word 0x03dca30a -//.word 0x900500ae -//.word 0xb4a248b5 -//.word 0x424f79b5 -//.word 0xc47c14bd -//.word 0x63c12242 -//.word 0x0871755c -//.word 0xc1723033 -//.word 0x664c8ab3 -//.word 0x7c7fce88 -//.word 0x591aa646 -//.word 0x89899ae7 -//.word 0x71afd47b -//.word 0x3235261b -//.word 0xd1214e1f -//.word 0x94aa7891 -//.word 0xaf4a04e1 -//.word 0x1f168ad9 -//.word 0xd74b1bd4 -//.word 0x1a29ca2b -//.word 0x28046bf1 -//.word 0x1c989be0 -//.word 0x159d0192 -//.word 0x949bd3f5 -//.word 0x25009bf9 -//.word 0x42703b8b -//.word 0x745c2ec7 -//.word 0xbbd61269 -//.word 0x30a36385 -//.word 0xe9928a79 -//.word 0x1d0d161f -//.word 0x88ee4947 -//.word 0x1194d664 -//.word 0xab35e985 -//.word 0x79756887 -//.word 0x35387889 -//.word 0xd2b544a1 -//.word 0x60cdfacd -//.word 0x319a152d -//.word 0x3a4ae26f -//.word 0xbb2e3d8a -//.word 0x230e9caf -//.word 0x2ec0507c -//.word 0x50f80774 -//.word 0x566294ac -//.word 0x4beef3c6 -//.word 0x986c8723 -//.word 0x7058a755 -//.word 0x6bf759d3 -//.word 0x71a35df1 -//.word 0xda626e0f -//.word 0xd3bec410 -//.word 0x04d1dd0e -//.word 0x70a07d4b -//.word 0x9caaf46b -//.word 0xf3c09fe1 -//.word 0x6916b1a8 -//.word 0x5f9b3333 -//.word 0xc6864aa6 -//.word 0x8831b946 -//.word 0x232ba62e -//.word 0x9789a145 -//.word 0x837ce26c -//.word 0x8b29d2fc -//.word 0xfcb4ce6f -//.word 0xb39e275d -//.word 0x3b526dab -//.word 0x35faedff -//.word 0xfd977876 -//.word 0x8a51669a -//.word 0x960bdb8e -//.word 0xff3b498c -//.word 0x6ef93692 -//.word 0x36564057 -//.word 0x7fee5e84 -//.word 0xa3c16821 -//.word 0xd83eda4d -//.word 0x10a1d533 -//.word 0x1d7f6639 -//.word 0x199f0b7a -//.word 0x050c7377 -//.word 0xb0688609 -//.word 0xda83a59b -//.word 0x9a2d3395 -//.word 0xfd48541b -//.word 0xf021f4f8 -//.word 0x60000cd5 -//.word 0x9ffd20af -//.word 0x0a160d88 -//.word 0xe97f015c -//.word 0x9639cb56 -//.word 0xe2e65544 -//.word 0xb4dc6e49 -//.word 0xf378cdd1 -//.word 0xa6b453ca -//.word 0x5afc9112 -//.word 0xc43e8a2b -//.word 0xa841ba36 -//.word 0xfa37571f -//.word 0x4295d615 -//.word 0x4522b13d -//.word 0xe14e68a7 -//.word 0x39c6c681 -//.word 0x1245658a -//.word 0x7dad74ca -//.word 0xb756b881 -//.word 0x4da6d15d -//.word 0x83e2bfef -//.word 0xf743a460 -//.word 0x824dcb60 -//.word 0x5f5cea60 -//.word 0x8f80a401 -//.word 0x7b8a52cc -//.word 0xdc670323 -//.word 0xd8adc177 -//.word 0x6d7417bc -//.word 0x1367d01a -//.word 0x9d1b00e6 -//.word 0x619f49d0 -//.word 0x9854575e -//.word 0x08fead99 -//.word 0xe01ca406 -//.word 0xe375b0d7 -//.word 0xc8f4e663 -//.word 0xe1b5bbd4 -//.word 0xfc600f1f -//.word 0x87b66a3a -//.word 0xf7698589 -//.word 0x6a310c99 -//.word 0x8a1ca210 -//.word 0xb52626e4 -//.word 0x5c0934cc -//.word 0xa956eff4 -//.word 0x65c5fef5 -//.word 0x18c9d504 -//.word 0x72683669 -//.word 0xe94af734 -//.word 0xa410052b -//.word 0x98e7a906 -//.word 0xf15c0adf -//.word 0xb372f4e4 -//.word 0xa1f1d74f -//.word 0x5e021398 -//.word 0xd2f972e8 -//.word 0xcf72f6d2 -//.word 0xf49fd63e -//.word 0xd2e0c3a5 -//.word 0x4e946f84 -//.word 0x4630500a -//.word 0x788ea214 -//.word 0x9f87ab5c -//.word 0xdec342ed -//.word 0x62d092db -//.word 0x44721c30 -//.word 0xac3afb29 -//.word 0x3c5a6ca3 -//.word 0xacb88dd0 -//.word 0xb141652e -//.word 0x248025ba -//.word 0x606fad61 -//.word 0xec8d52b7 -//.word 0x5a30dfeb -//.word 0x6e1dd9fb -//.word 0x83560824 -//.word 0x2b33329d -//.word 0x16b42a84 -//.word 0x35160a19 -//.word 0x1ea4bc2a -//.word 0xb3d0bfce -//.word 0xfe822756 -//.word 0x60b0e681 -//.word 0xeb2f4bef -//.word 0x0cc9c8d8 -//.word 0x6d8ff8fe -//.word 0x1970e0e0 -//.word 0xe20b7631 -//.word 0x00c25f88 -//.word 0xfa10fd59 -//.word 0xca1ca924 -//.word 0x3c8e3dec -//.word 0x97a1d6eb -//.word 0x7f79d884 -//.word 0x1ab83279 -//.word 0x724ce35e -//.word 0x1a8abd4e -//.word 0x158168dc -//.word 0xf388ab4c -//.word 0x3d1ae704 -//.word 0x13e4e43d -//.word 0x141bd0fe -//.word 0x7e13854b -//.word 0x960e0b9a -//.word 0x4b525e86 -//.word 0x167e71c7 -//.word 0x241d7262 -//.word 0xb77c501d -//.word 0xcab97b36 -//.word 0xf41deb54 -//.word 0x8eab63be -//.word 0x18f9f7cb -//.word 0xd93fcc9a -//.word 0xc6ae1f02 -//.word 0xa50388cc -//.word 0x725b8020 -//.word 0x0249223e -//.word 0xe6262e6f -//.word 0x92a8533a -//.word 0xbfb6aeda -//.word 0x0d7b8ef0 -//.word 0xedba7a76 -//.word 0xbe6175f4 -//.word 0x366080f6 -//.word 0x04bb61bd -//.word 0xb3dea335 -//.word 0xd232de27 -//.word 0x52ed38b0 -//.word 0x2f2e2cf2 -//.word 0x53498a09 -//.word 0xb75fbf40 -//.word 0xcb335785 -//.word 0x1838c01b -//.word 0x23ef518f -//.word 0x956f8aed -//.word 0x9a459e33 -//.word 0x877f2e06 -//.word 0xbf0458a4 -//.word 0xd727f01a -//.word 0xf87b0db7 -//.word 0x85e8c8c0 -//.word 0xfefe4065 -//.word 0x258ae2f4 -//.word 0x5f67e74d -//.word 0x5c971d96 -//.word 0xfa92eb30 -//.word 0x67de8fe9 -//.word 0x86e0ab73 -//.word 0x95f20015 -//.word 0x0cb679a0 -//.word 0xc8a96ba5 -//.word 0x68fb1be5 -//.word 0xf89e8109 -//.word 0xcd9d4b93 -//.word 0xafaf2515 -//.word 0x3e0c38a0 -//.word 0x8e7ff080 -//.word 0x15bc0326 -//.word 0xc7f5af66 -//.word 0x7fa843e3 -//.word 0xa1bbe0c7 -//.word 0xfdca81b7 -//.word 0xf7c03906 -//.word 0xe5a4bc28 -//.word 0xb9b6216a -//.word 0xe0bbe6e1 -//.word 0x6a9535a0 -//.word 0x6a16652e -//.word 0xa016c438 -//.word 0x55c39482 -//.word 0x87395323 -//.word 0x465340f2 -//.word 0x5ec01a3c -//.word 0x36592bb8 -//.word 0xf8b185bc -//.word 0xf2ee8cb0 -//.word 0x3dd8b4c4 -//.word 0x9c308cde -//.word 0xa643fcd6 -//.word 0x28bfcae6 -//.word 0xc5c4635c -//.word 0xdf3ed992 -//.word 0xbb732820 -//.word 0xdfd8bd50 -//.word 0xbf2939d3 -//.word 0x99b872b2 -//.word 0x9e06ba87 -//.word 0x529065ec -//.word 0x35eb8534 -//.word 0xa313f859 -//.word 0xf901a536 -//.word 0xf97b02f6 -//.word 0x7030dacd -//.word 0x15044de6 -//.word 0xb5a9189c -//.word 0x8d6f16ec -//.word 0xf85d072a -//.word 0x4a8091f4 -//.word 0xfb838465 -//.word 0x0880628a -//.word 0x96161f1a -//.word 0xd8bc2561 -//.word 0x34549b7e -//.word 0xa104e7ce -//.word 0x544171a8 -//.word 0x9b2caa4b -//.word 0x09224e14 -//.word 0xd38ee6f5 -//.word 0x7a029022 -//.word 0xaa87020d -//.word 0x6331cd95 -//.word 0x56f6df7a -//.word 0x92bf4c15 -//.word 0x5fc04e46 -//.word 0x6a058aad -//.word 0x234e941d -//.word 0x641db64d -//.word 0x530dedd1 -//.word 0x89653549 -//.word 0x74ed06d9 -//.word 0xf9011fd9 -//.word 0x5ee382cd -//.word 0x6856c097 -//.word 0xc06876eb -//.word 0x9b8f1804 -//.word 0x9af7ed95 -//.word 0xef1b5b03 -//.word 0xc29365d1 -//.word 0xd32c725c -//.word 0x603e50c8 -//.word 0x493a783a -//.word 0x72839447 -//.word 0x697f3ead -//.word 0x49ed0b41 -//.word 0xde79c829 -//.word 0x098d034b -//.word 0x666bce05 -//.word 0x2d79bf1f -//.word 0x56db3bfe -//.word 0x0147f41a -//.word 0x1415b1b2 -//.word 0x26964ebe -//.word 0x9ca70325 -//.word 0x1186e930 -//.word 0xfce4b93e -//.word 0x8c3bd7ba -//.word 0xd761904b -//.word 0x345ea04a -//.word 0xe57bf879 -//.word 0xfa9bbef2 -//.word 0x71ce945d -//.word 0xa2241d66 -//.word 0xdbbfbd6f -//.word 0x472ca181 -//.word 0x14f40089 -//.word 0xd46da0c1 -//.word 0x24d69b6c -//.word 0x8ca363c6 -//.word 0xa716043b -//.word 0x840fa9d7 -//.word 0x4b2562fe -//.word 0x24f5245d -//.word 0x54ba1220 -//.word 0xa91ffa65 -//.word 0x195123f1 -//.word 0xa6574622 -//.word 0x85a6da25 -//.word 0x7ef09469 -//.word 0x963e2f54 -//.word 0xec3e6934 -//.word 0xe1de4e78 -//.word 0x7b19b820 -//.word 0x0c111772 -//.word 0x0e5f6eef -//.word 0x52a79e85 -//.word 0x5a6fe706 -//.word 0x0331acd9 -//.word 0x66ae76f0 -//.word 0x01863cf9 -//.word 0x1206e2d9 -//.word 0x4441ff56 -//.word 0x8d62e313 -//.word 0x5740d9c2 -//.word 0xde33a995 -//.word 0xd92761f5 -//.word 0x5cee5577 -//.word 0xfddb650c -//.word 0x368c7e78 -//.word 0x0a076405 -//.word 0xeb09ae78 -//.word 0xdc9a1244 -//.word 0xd3e5e2fe -//.word 0x6147d711 -//.word 0x94a60eb3 -//.word 0x1d045017 -//.word 0xae5396e4 -//.word 0xa68bcce7 -//.word 0xf0fbd604 -//.word 0x28dcd173 -//.word 0x002c9b29 -//.word 0xe3ba9593 -//.word 0xd87da78a -//.word 0xa8298584 -//.word 0x43043107 -//.word 0x60f6c264 -//.word 0x64e063a1 -//.word 0x852f9eb7 -//.word 0x2fb1dbfe -//.word 0xa6a723e5 -//.word 0xee1b2ae6 -//.word 0xe8748db9 -//.word 0xbd4758c8 -//.word 0x7f70cbe4 -//.word 0x0e625e36 -//.word 0x39bb0278 -//.word 0x261caa65 -//.word 0xf4370a6d -//.word 0x9e299eae -//.word 0x230bef20 -//.word 0xe4c3120f -//.word 0x4d2071cf -//.word 0xb727ceab -//.word 0x8da7841e -//.word 0xae141046 -//.word 0x1391d195 -//.word 0xb24f0cca -//.word 0xa216331f -//.word 0x7f2167c4 -//.word 0x102f3b8d -//.word 0x27d7bbe8 -//.word 0xc91cad11 -//.word 0x8f411689 -//.word 0x4cdf00c4 -//.word 0xf0347b21 -//.word 0xadbee220 -//.word 0x58085fd0 -//.word 0x11c5b186 -//.word 0x261b2dd4 -//.word 0x354103b9 -//.word 0x914cc316 -//.word 0xe7462061 -//.word 0x2281f39d -//.word 0x8b2a838a -//.word 0x35210319 -//.word 0x98085c22 -//.word 0x7c9b2d59 -//.word 0x193f107f -//.word 0x7cdd20d5 -//.word 0x2cf0b8d6 -//.word 0x0edd7d25 -//.word 0x86849ec5 -//.word 0xdf145a88 -//.word 0xed23c3ca -//.word 0xf0fec25e -//.word 0xbc3d5cc9 -//.word 0x179b33ae -//.word 0x6305508a -//.word 0x7df11fa2 -//.word 0xe4f1bb39 -//.word 0x1e886c05 -//.word 0x573c6fe4 -//.word 0x4cecf5cc -//.word 0x67646d00 -//.word 0x2b2f068a -//.word 0xd3ac70e5 -//.word 0x3665e3fa -//.word 0xee9b634e -//.word 0xb9264279 -//.word 0x1f7ce6da -//.word 0x560fcd89 -//.word 0x62dccd8d -//.word 0x8040a14f -//.word 0xc50ea14f -//.word 0x03e0d116 -//.word 0xecaa1d6c -//.word 0x7a95e3ca -//.word 0x8e0ab212 -//.word 0xd70c527e -//.word 0xf5cc04d6 -//.word 0xde770ae7 -//.word 0x81536a30 -//.word 0xaa0af0de -//.word 0x264672fb -//.word 0x277d57e2 -//.word 0xea0f5af6 -//.word 0x968e8c93 -//.word 0x685c9845 -//.word 0x0d7c4b38 -//.word 0x4fa254f0 -//.word 0xf48c483a -//.word 0xe395e963 -//.word 0x8988a7a7 -//.word 0x7bb267ec -//.word 0x5d3b84b1 -//.word 0x02b61341 -//.word 0xd4f66c2c -//.word 0x7723e6f7 -//.word 0xa90ee113 -//.word 0x6dc20a0c -//.word 0x685cda03 -//.word 0x8b1c605e -//.word 0xf2bb41be -//.word 0x0cfffd31 -//.word 0xfd8e73aa -//.word 0x4000a8ae -//.word 0x9137c44f -//.word 0x0af35d5e -//.word 0x8ca1f8dd -//.word 0x6074cdb3 -//.word 0x1eb7cba3 -//.word 0xce62dc7f -//.word 0x4eeb6a99 -//.word 0xf45e227b -//.word 0x73b0f8d8 -//.word 0x03516bc2 -//.word 0xbc000a1c -//.word 0x43e33753 -//.word 0xa9d72b49 -//.word 0x90053a92 -//.word 0x90b658e3 -//.word 0xd968ddc7 -//.word 0x19208594 -//.word 0xa003bb9e -//.word 0xc22017aa -//.word 0x7c9125a6 -//.word 0x5bc26897 -//.word 0x9a109ed2 -//.word 0x8a96466f -//.word 0x374360fb -//.word 0x4930746d -//.word 0x2831d55b -//.word 0x64ab276e -//.word 0x53a51f14 -//.word 0xfc218a74 -//.word 0x33ac91a7 -//.word 0x06343b25 -//.word 0x581a337d -//.word 0xcc88cc4a -//.word 0xe5054262 -//.word 0x6b464350 -//.word 0x1047ad05 -//.word 0x539b9aca -//.word 0xa5019a79 -//.word 0xca373fed -//.word 0x8313dfb7 -//.word 0x6acf9512 -//.word 0x1da5891a -//.word 0x9e9b7138 -//.word 0xfaa158e1 -//.word 0x29d99e80 -//.word 0x363641b0 -//.word 0xa0485aaf -//.word 0xff56eb0f -//.word 0xeaaed7af -//.word 0x193932ea -//.word 0xc752bb0e -//.word 0x5ad8a710 -//.word 0x4682a17e -//.word 0x2f730eb4 -//.word 0x4e0f9553 -//.word 0x150cdfef -//.word 0x16cc9b08 -//.word 0x21eac63c -//.word 0xac1329ba -//.word 0x781723fa -//.word 0x723fa8ac -//.word 0xd8e28aee -//.word 0x9c33f7c1 -//.word 0x0d5d44be -//.word 0xb4d2e805 -//.word 0x7cdfcc77 -//.word 0x1785c225 -//.word 0x9c845207 -//.word 0x75b8bdf2 -//.word 0x78a83cc4 -//.word 0x545d89e2 -//.word 0x2f70a0e4 -//.word 0x8d67c78e -//.word 0x7442cc02 -//.word 0xce508e35 -//.word 0x0e47bea0 -//.word 0x1694e738 -//.word 0x58f0ac9f -//.word 0x3c34529c -//.word 0xc26e7ec9 -//.word 0x69343f8b -//.word 0x4f384e47 -//.word 0x991d95d3 -//.word 0x1589ef2b -//.word 0x1e7c2f66 -//.word 0xc1e063e8 -//.word 0x1e615ad8 -//.word 0x107e63d5 -//.word 0x10e058e4 -//.word 0x56ebdbad -//.word 0x4294e0e8 -//.word 0xfb726c12 -//.word 0x56179b64 -//.word 0xf9a0e805 -//.word 0xc08ba97f -//.word 0x5fc9d970 -//.word 0x49141a82 -//.word 0xd183fa9c -//.word 0x8f5c765a -//.word 0x0629bdbb -//.word 0x830e361a -//.word 0x4859c360 -//.word 0xea5b4877 -//.word 0xf8776702 -//.word 0xdd788e4b -//.word 0x0827347c -//.word 0x4a1e5f13 -//.word 0x7fd76a90 -//.word 0x70080570 -//.word 0xf8337d5f -//.word 0x66783eaa -//.word 0x23af96f3 -//.word 0x95b3bb28 -//.word 0x420010b6 -//.word 0x3981a4f9 -//.word 0xaea3fbf7 -//.word 0xe4ae124f -//.word 0x50559d6c -//.word 0xfb8c93fe -//.word 0x2899ecab -//.word 0x376eaa01 -//.word 0xc93616b0 -//.word 0x252e4cf6 -//.word 0xdab6f95a -//.word 0xa6a8649d -//.word 0x97e8abee -//.word 0x703c4f5d -//.word 0x4e5ef392 -//.word 0x8b5061bf -//.word 0xe3f0ced3 -//.word 0xd5cc5ff1 -//.word 0x4c37ec20 -//.word 0x7f9d0344 -//.word 0x1613304d -//.word 0x8e327bae -//.word 0xde263310 -//.word 0x5b02ea48 -//.word 0xd956c187 -//.word 0x1304e6d1 -//.word 0x4d4f5ab1 -//.word 0x3735f82a -//.word 0x15ffb3f0 -//.word 0x1d161fd9 -//.word 0x2018338e -//.word 0x6d2b4d86 -//.word 0xf3927635 -//.word 0xa57ee780 -//.word 0x2326cd75 -//.word 0x96194a39 -//.word 0xdbd3bc41 -//.word 0xe58f41c5 -//.word 0x5c5d7b72 -//.word 0x8a749060 -//.word 0x78c97543 -//.word 0x54e16de5 -//.word 0x16e3ccd4 -//.word 0x64f10157 -//.word 0xb2b8d3a7 -//.word 0xad46eb5c -//.word 0xda1c9326 -//.word 0x7a85bdbd -//.word 0xb226471b -//.word 0xe8d57de8 -//.word 0x70afe036 -//.word 0x6864266e -//.word 0xe0d6818a -//.word 0x3fe32485 -//.word 0xe17e0410 -//.word 0x0505db87 -//.word 0xe7ce7323 -//.word 0x29042171 -//.word 0x77b18f03 -//.word 0x6b1bbf65 -//.word 0xae544d52 -//.word 0x610df528 -//.word 0xbbab549a -//.word 0xf39df3a5 -//.word 0x60ec81c5 -//.word 0xdf136068 -//.word 0x751264a3 -//.word 0x35bed724 -//.word 0x645bc068 -//.word 0xdc6c642e -//.word 0xaeca0e2b -//.word 0x0bf40cff -//.word 0x65a6fa68 -//.word 0xd1ad43b5 -//.word 0xb0f9e47e -//.word 0x8ef47393 -//.word 0x4a126032 -//.word 0x77a97c7d -//.word 0x0304b72a -//.word 0x16b32e7d -//.word 0x3d246573 -//.word 0xc878d041 -//.word 0x718f99fc -//.word 0x3e659d9a -//.word 0xa8a2b819 -//.word 0xfc6c42fe -//.word 0x0280d901 -//.word 0xdd816107 -//.word 0x328f4a50 -//.word 0x8c1c11f2 -//.word 0xfffb0a86 -//.word 0x0cba5c21 -//.word 0xc5324d86 -//.word 0x315cc099 -//.word 0xf267fb17 -//.word 0x2507ae85 -//.word 0x8a0f3166 -//.word 0xe5420eb1 -//.word 0xa466bf82 -//.word 0xc19bb910 -//.word 0xeaeba9df -//.word 0xe022fd37 -//.word 0x1de0a6d4 -//.word 0xb9ec1cdf -//.word 0x8ecba31d -//.word 0x9b92ce67 -//.word 0xa6f8415a -//.word 0x25afba4f -//.word 0x5ff5538d -//.word 0xcf6601be -//.word 0xc91461a0 -//.word 0x60d9b4fd -//.word 0x86ec27dd -//.word 0x75b359fa -//.word 0x4ed81774 -//.word 0x009f6ac6 -//.word 0x6c77d3f9 -//.word 0xc7cfd518 -//.word 0x3f2ab4e3 -//.word 0xe1767dc7 -//.word 0xba99460e -//.word 0x3c4eb754 -//.word 0xe42fc93a -//.word 0x1a12ce5e -//.word 0x5999b28a -//.word 0x8f05802b -//.word 0xc74b2705 -//.word 0x056a7f26 -//.word 0x71fb8718 -//.word 0xb80af15b -//.word 0xb024e012 -//.word 0x3bb1f0fd -//.word 0x6d8577a7 -//.word 0xf1b10ae1 -//.word 0xa89f436e -//.word 0x945ec200 -//.word 0xf53a7264 -//.word 0xb1900df9 -//.word 0xf9e0e366 -//.word 0x2a24d78c -//.word 0xf160aaba -//.word 0xb37b7c20 -//.word 0x2c4d8f87 -//.word 0x56f94f3f -//.word 0x8c7d8f58 -//.word 0xef871615 -//.word 0x098b5a9d -//.word 0xb0128bf4 -//.word 0x2d55d32a -//.word 0x9e0addd2 -//.word 0x997e94b6 -//.word 0x12e42dc9 -//.word 0x7fec675d -//.word 0x39981196 -//.word 0x264ccd1f -//.word 0x9524151b -//.word 0x69897b5f -//.word 0x7a0735de -//.word 0x3859d864 -//.word 0x92c66488 -//.word 0x16b181dc -//.word 0x596b0866 -//.word 0x994bc554 -//.word 0xa1017ceb -//.word 0xed2729c1 -//.word 0x0f198c2c -//.word 0x5107e5fa -//.word 0x9c48fd62 -//.word 0x98f1653b -//.word 0x15a7026c -//.word 0xaab1caa4 -//.word 0x9b51c84b -//.word 0x005566b8 -//.word 0x24e9eba4 -//.word 0x2caf43de -//.word 0xf912ff41 -//.word 0x4fd79ce4 -//.word 0x36f40890 -//.word 0xa0a66277 -//.word 0x4dbe0122 -//.word 0xec3bb9ac -//.word 0x831e592e -//.word 0x107a787a -//.word 0x71cb720c -//.word 0x8188ad3d -//.word 0x84fc21ba -//.word 0xc5511735 -//.word 0x7dee305a -//.word 0xf703aa05 -//.word 0xf261dfb2 -//.word 0x47900e35 -//.word 0xcb1b5eab -//.word 0x772f20b0 -//.word 0xc66455d2 -//.word 0x5fdb7046 -//.word 0xf4895dda -//.word 0x6ad2c12b -//.word 0x3a5a8418 -//.word 0x17188d76 -//.word 0xd1accc05 -//.word 0x79f27ea3 -//.word 0xc6d7acc0 -//.word 0xb76bf512 -//.word 0x7a388e8a -//.word 0x8dd38786 -//.word 0x23b05048 -//.word 0xc93a7ba7 -//.word 0x4923c304 -//.word 0xcef94e80 -//.word 0x4afb2f6c -//.word 0x152a2f02 -//.word 0xd7a3cd52 -//.word 0xa72b837e -//.word 0x740c4b2a -//.word 0xa420622f -//.word 0xfc2b4c8f -//.word 0xc06d18ae -//.word 0x1b78e5bf -//.word 0xc040a57c -//.word 0xd271211a -//.word 0x02053e7c -//.word 0xf7157ea7 -//.word 0xf2efc976 -//.word 0xb26a6e8e -//.word 0x95766595 -//.word 0x01f7d79f -//.word 0x02d4dfe9 -//.word 0x344a93ca -//.word 0xe4873ee6 -//.word 0x7274f0a5 -//.word 0xf9d239e4 -//.word 0x328831ea -//.word 0x963bbb9d -//.word 0xc3200bf5 -//.word 0x210e66b2 -//.word 0xc5d8294a -//.word 0x96d90d26 -//.word 0xaed0a90d -//.word 0x03ef39e1 -//.word 0x462e9d89 -//.word 0x0be5a52e -//.word 0x2b9a8baa -//.word 0x6617c13d -//.word 0x4dc0ed82 -//.word 0x602433a2 -//.word 0x73d2b2c8 -//.word 0x566e51d5 -//.word 0xb404bb54 -//.word 0x3c9ba8b0 -//.word 0xff0e5fa4 -//.word 0x191778f4 -//.word 0x94ade75b -//.word 0x899036c4 -//.word 0x882212bd -//.word 0x3a780928 -//.word 0x45b19233 -//.word 0x70864e8b -//.word 0x08238dcd -//.word 0x8235143e -//.word 0x61451ebb -//.word 0x5b44a0f3 -//.word 0xb767d1d3 -//.word 0xf935ea42 -//.word 0xc1de2a0f -//.word 0xf1ce1e27 -//.word 0x0e821f0c -//.word 0xe99a1c82 -//.word 0x7e309a8c -//.word 0x1c69f896 -//.word 0xc649f8f4 -//.word 0xdacc7b8b -//.word 0xf0328cce -//.word 0x059aa0ed -//.word 0xd9d21c48 -//.word 0x956e182a -//.word 0xb11763b4 -//.word 0x1526c717 -//.word 0x7e728e07 -//.word 0x2465446c -//.word 0x9a56bf5a -//.word 0xf5125d43 -//.word 0x30bc8d6b -//.word 0xcfd8919d -//.word 0xc3a2821d -//.word 0x8ea494dd -//.word 0xa7879bf3 -//.word 0x202ace4b -//.word 0x86f1cb99 -//.word 0x0960dc92 -//.word 0xdce8795c -//.word 0xdf000e43 -//.word 0x7c78fead -//.word 0xce0ae750 -//.word 0x093328a2 -//.word 0x1641a091 -//.word 0x7dacb975 -//.word 0x88a9a543 -//.word 0xa6fde803 -//.word 0x0d0f1784 -//.word 0xa342df4e -//.word 0x1f8148d8 -//.word 0x6b1c3bfb -//.word 0x4dd243a7 -//.word 0x472f90d5 -//.word 0xbc1841bc -//.word 0x53a4e348 -//.word 0xa12d34c8 -//.word 0x02a72de7 -//.word 0xc73140dd -//.word 0x97eadfe6 -//.word 0x0f063df3 -//.word 0xac2158a0 -//.word 0xebd23767 -//.word 0xae847013 -//.word 0xe281ee77 -//.word 0x5f50f15f -//.word 0x0f4156c7 -//.word 0x5346194b -//.word 0xa20418df -//.word 0x742a1ac0 -//.word 0x5e020fab -//.word 0x7e469a4c -//.word 0x1934ccf9 -//.word 0x83e433a0 -//.word 0x3fda13fe -//.word 0x68d8f312 -//.word 0x4ff55bd2 -//.word 0x66f3dd1c -//.word 0x5dce52ef -//.word 0x8a9166db -//.word 0x8e6d57b6 -//.word 0x360cf991 -//.word 0x9f23feea -//.word 0x9e477424 -//.word 0x5e018f34 -//.word 0x4b24a99c -//.word 0x2f5e879d -//.word 0x9b0edea8 -//.word 0x89551517 -//.word 0x3f704d1a -//.word 0x77459ff4 -//.word 0xbc3ba467 -//.word 0x174f3b6c -//.word 0xeb658628 -//.word 0x1edb361c -//.word 0x7964099c -//.word 0x52149082 -//.word 0x68b73623 -//.word 0x0e677e82 -//.word 0x8c5e8cc4 -//.word 0xc208e7e4 -//.word 0x0e5c7da8 -//.word 0x706de8d4 -//.word 0xec3cef9d -//.word 0x30d15060 -//.word 0x778abd94 -//.word 0xadb224fe -//.word 0xd4553323 -//.word 0xa6531c03 -//.word 0x7cb49504 -//.word 0x6e3b232d -//.word 0xbc3e9994 -//.word 0x6db5db1a -//.word 0x3590e855 -//.word 0x9c4e18ce -//.word 0x5dcba26d -//.word 0x0c596031 -//.word 0xfc13d724 -//.word 0x606e728f -//.word 0xb0110e6a -//.word 0x4fe7bb16 -//.word 0x6a72c14f -//.word 0x2362e25c -//.word 0xef66df88 -//.word 0x3c423ed6 -//.word 0x582249f1 -//.word 0x8e2d5a62 -//.word 0x925e5605 -//.word 0x1f8f78be -//.word 0xded75068 -//.word 0x8a160b0e -//.word 0x52cef45e -//.word 0x7e353b5a -//.word 0x5688f551 -//.word 0x3fa1650e -//.word 0x28cc7a4f -//.word 0x24d79879 -//.word 0x58689c89 -//.word 0x18931a4e -//.word 0x4dace8d6 -//.word 0x1a5ae126 -//.word 0xbfede32d -//.word 0xbdf21afb -//.word 0x3b04812f -//.word 0xa8e5a5ae -//.word 0xa2cdad9b -//.word 0x16019783 -//.word 0xa9a8c4d7 -//.word 0x57dab7a0 -//.word 0x5afb1a6e -//.word 0x4e470191 -//.word 0x92ad738c -//.word 0xf1e127c7 -//.word 0x82ad8b84 -//.word 0xcc880a14 -//.word 0x2e698f4b -//.word 0x7fdd4531 -//.word 0xf158a2fa -//.word 0x3bc8a339 -//.word 0xf7705950 -//.word 0x48f4a42b -//.word 0xc1b03f2e -//.word 0x824efc6b -//.word 0xa4985119 -//.word 0xd88a1441 -//.word 0x4aac83bb -//.word 0xcc9f8759 -//.word 0x30f53a62 -//.word 0xf546a642 -//.word 0x277fd07f -//.word 0x807ef5ef -//.word 0xd3dc1329 -//.word 0xab0aab39 -//.word 0x2fa0c598 -//.word 0x48f1365b -//.word 0x06e31eaa -//.word 0x40feb474 -//.word 0x7bc24661 -//.word 0x0d3e7b08 -//.word 0x83dedc63 -//.word 0x3f85927f -//.word 0x66db7178 -//.word 0xf9e936a5 -//.word 0x41e30d10 -//.word 0x71445729 -//.word 0x8720a9bb -//.word 0x73b6181e -//.word 0x7b46b4af -//.word 0xde22527d -//.word 0xb7068f45 -//.word 0x25ac11a1 -//.word 0xa99c107c -//.word 0xcf4215c9 -//.word 0x11420274 -//.word 0xf8105399 -//.word 0x84bba3f5 -//.word 0xce09729a -//.word 0xecc925e6 -//.word 0x15654eb5 -//.word 0x05b72ed6 -//.word 0xa31d79bc -//.word 0xe2d05876 -//.word 0xe571b4e2 -//.word 0x66e5b21d -//.word 0x58637a3d -//.word 0xcbcb3d43 -//.word 0x113a764b -//.word 0x1fdb7006 -//.word 0x3500086a -//.word 0xc271b4a8 -//.word 0x8203c45f -//.word 0xe96de80f -//.word 0xc458f3d0 -//.word 0x1eb5de44 -//.word 0x605310ca -//.word 0xbdb1dcf4 -//.word 0xcd114c3c -//.word 0x78cd1df2 -//.word 0x16ee0a79 -//.word 0xd4fb4eb3 -//.word 0x5a0f64ba -//.word 0xab2e11d1 -//.word 0x4cd9a49a -//.word 0xa8e07d89 -//.word 0xb378cc98 -//.word 0xce8d9b3c -//.word 0xeb5a0f98 -//.word 0xf136eaf1 -//.word 0x62b15563 -//.word 0x3bdfddd2 -//.word 0x1bf4bb23 -//.word 0xa81158ab -//.word 0x2e5e10e7 -//.word 0x8a59366e -//.word 0x476e5925 -//.word 0x06c7c6b2 -//.word 0x23654e33 -//.word 0x95704a2f -//.word 0x16cbdccc -//.word 0x85ec7743 -//.word 0x88eba192 -//.word 0x75d8f771 -//.word 0x73527286 -//.word 0xdc55eadc -//.word 0xe654d892 -//.word 0x838860d0 -//.word 0x85878fff -//.word 0x0618e13a -//.word 0x074606ff -//.word 0x57b3e52b -//.word 0xb72fe225 -//.word 0x3b895c59 -//.word 0xf3a57ae8 -//.word 0xcbcf289d -//.word 0xb04f5c24 -//.word 0xf43e9e76 -//.word 0xf498c798 -//.word 0xf8920985 -//.word 0x5a2d2f69 -//.word 0xeb0b260f -//.word 0x9281bd9d -//.word 0x36efa97f -//.word 0xde4ccca1 -//.word 0x1705b7e1 -//.word 0x97086dc4 -//.word 0x1f1b6967 -//.word 0xa673e3b9 -//.word 0xb38250e8 -//.word 0x0b102819 -//.word 0x8c8deb5c -//.word 0x59a666df -//.word 0x37163362 -//.word 0x37bf7fea -//.word 0x96f90fba -//.word 0xe12a857f -//.word 0x5c97e0cb -//.word 0xa57943c4 -//.word 0x9554f71e -//.word 0x6784b246 -//.word 0x1c181ae0 -//.word 0x1de48574 -//.word 0x23d20364 -//.word 0x54799e22 -//.word 0xaff1e09f -//.word 0xa9e59607 -//.word 0x18e9d4ab -//.word 0x510e393f -//.word 0x8db47445 -//.word 0x92a007c9 -//.word 0x8f4f4b4f -//.word 0x4789b50a -//.word 0x7139574e -//.word 0x5f7baa48 -//.word 0xdff78aed -//.word 0x5f6e8230 -//.word 0x54924a78 -//.word 0xdc1b8e51 -//.word 0xa117f161 -//.word 0x0181529f -//.word 0x6d164ebf -//.word 0x0f6406f0 -//.word 0xb02422ca -//.word 0xd8c91682 -//.word 0x3759a361 -//.word 0x437ca174 -//.word 0x23d3fd84 -//.word 0xcc8afe48 -//.word 0x6a31ccda -//.word 0x01c73268 -//.word 0x5418a32c -//.word 0x064a7b9e -//.word 0xffb288e8 -//.word 0x11ecc99a -//.word 0xdb2a759f -//.word 0xeecc3f70 -//.word 0x2f31d987 -//.word 0x7dcdb717 -//.word 0x937c15fa -//.word 0x2f163bea -//.word 0x744400f5 -//.word 0x8c928d2b -//.word 0x93c5639a -//.word 0xb06ea07c -//.word 0x85bf7dae -//.word 0xca9e1c64 -//.word 0x34f8811c -//.word 0x9c58ded0 -//.word 0x5db81370 -//.word 0xfe97758f -//.word 0x114bce5d -//.word 0x5a99a6d5 -//.word 0x3483c137 -//.word 0x3161e9b9 -//.word 0x0133ee79 -//.word 0x9536eab7 -//.word 0x83b5c941 -//.word 0xad22092e -//.word 0x1e65bfcf -//.word 0x3474dbe3 -//.word 0x0424ac0a -//.word 0xfa3fa77d -//.word 0xc0d664fb -//.word 0x61d8e907 -//.word 0xafe42b50 -//.word 0xe25cd271 -//.word 0x81bb3dda -//.word 0x8628c60e -//.word 0xbd4b4710 -//.word 0x6d5fdd17 -//.word 0x3a88eb89 -//.word 0x4a676227 -//.word 0xa7ec4085 -//.word 0xe46c57be -//.word 0x04f45065 -//.word 0x97dcefbf -//.word 0x269f992f -//.word 0xd1ea13f1 -//.word 0x37f28c0b -//.word 0x960bde81 -//.word 0x337711c9 -//.word 0xfd7b207e -//.word 0x6db80059 -//.word 0xb0b9df5c -//.word 0x08c9aa50 -//.word 0x7007d172 -//.word 0x7fbc4e6a -//.word 0x8eebe47c -//.word 0x1d2aa402 -//.word 0x73b1b61a -//.word 0x85b1569c -//.word 0x19e71d4f -//.word 0x2b70825c -//.word 0x90dfa002 -//.word 0xd98d3a8c -//.word 0x7a30fc80 -//.word 0x2caf031a -//.word 0x8f35a0f8 -//.word 0x14855917 -//.word 0x1a8d31fe -//.word 0x573d2a39 -//.word 0x7a990709 -//.word 0x0e0d565a -//.word 0xa201aef5 -//.word 0x27ae36f7 -//.word 0x99306682 -//.word 0xe2dc12b2 -//.word 0xfbd3a4d3 -//.word 0x54d7a9d1 -//.word 0x765e8fef -//.word 0xe7e5acbc -//.word 0x4d878344 -//.word 0xd7ce4383 -//.word 0xd9c9911f -//.word 0xb65f8756 -//.word 0x03e2fd34 -//.word 0xe9e8070a -//.word 0xcb56be1d -//.word 0x29bd449b -//.word 0xc5ea02d3 -//.word 0x04b834a4 -//.word 0x9629a836 -//.word 0x59b5c2e9 -//.word 0x7be2c48b -//.word 0xe0154cce -//.word 0xc3a81ff9 -//.word 0x9f3c24dd -//.word 0x5051b40b -//.word 0x75141144 -//.word 0x1a773331 -//.word 0x9487cb54 -//.word 0xabfb823f -//.word 0xff088104 -//.word 0xa47d37ec -//.word 0x100b566c -//.word 0x37e41f54 -//.word 0xf489e04a -//.word 0xabdcbb77 -//.word 0x2d7da880 -//.word 0xdb53bdb8 -//.word 0x0f69ae94 -//.word 0xb7fc905f -//.word 0x43d2e22e -//.word 0xc2cdcd17 -//.word 0x47bfab9e -//.word 0x9280c770 -//.word 0xec3e6354 -//.word 0x5315005e -//.word 0xd7dfd965 -//.word 0x444eb1b8 -//.word 0x0138ce0d -//.word 0x383146ba -//.word 0x375f7928 -//.word 0x178adf84 -//.word 0x9b7304b7 -//.word 0x5a67d099 -//.word 0x21130c61 -//.word 0x939a2261 -//.word 0x12e524f0 -//.word 0xe33b10a7 -//.word 0x8c1153d0 -//.word 0x81238b1b -//.word 0x00c39193 -//.word 0x3a71b7d1 -//.word 0xb3ad4e6f -//.word 0xeb096cc0 -//.word 0x3e82ecbe -//.word 0x0910b544 -//.word 0x0e7c407e -//.word 0x1a72549d -//.word 0xe5d714cf -//.word 0x395c3c6e -//.word 0x5654a877 -//.word 0x96c3163f -//.word 0x4db72c61 -//.word 0xf3dbbdfb -//.word 0x8549481a -//.word 0x28a0c172 -//.word 0x10569453 -//.word 0xa050e8d8 -//.word 0xd2b02062 -//.word 0xdaefa844 -//.word 0x062beec0 -//.word 0xe9c2ae33 -//.word 0xb81f738c -//.word 0xf4d45b02 -//.word 0x49e91a07 -//.word 0xb7744177 -//.word 0xef6ac116 -//.word 0x00b5aa39 -//.word 0x328739c3 -//.word 0x32ed1253 -//.word 0x70a7cabc -//.word 0xc637a8b6 -//.word 0x5a38add3 -//.word 0xc5f1d1b4 -//.word 0x752a907c -//.word 0x4f3ea585 -//.word 0x99721652 -//.word 0x188570c5 -//.word 0x75895492 -//.word 0xe6f132f4 -//.word 0x0aea559f -//.word 0x14ef20f5 -//.word 0x2b97977c -//.word 0x11b22190 -//.word 0x03958b55 -//.word 0xe1b251f0 -//.word 0x8f6c19f7 -//.word 0x9b298125 -//.word 0x20a81a53 -//.word 0xea95b4a3 -//.word 0xda5addff -//.word 0x8c39a4c2 -//.word 0x3897a3b4 -//.word 0xd69b3c3c -//.word 0x86f822d1 -//.word 0x2e071bb2 -//.word 0x651905d7 -//.word 0x900b1727 -//.word 0x4a1b6aeb -//.word 0x0af9b883 -//.word 0xff226357 -//.word 0x3f69b911 -//.word 0x21d6760a -//.word 0xe7b48a01 -//.word 0xa1e61d13 -//.word 0x4e7ad1e7 -//.word 0x4381472a -//.word 0xd11de43b -//.word 0x22dbd527 -//.word 0x644350d7 -//.word 0x29ae1d88 -//.word 0x0e58567c -//.word 0x9bb66bef -//.word 0x6b0a684d -//.word 0x8d347ba2 -//.word 0x29cbb152 -//.word 0x676c000a -//.word 0x8c528af6 -//.word 0x67272035 -//.word 0xeb1a058a -//.word 0x1d32f554 -//.word 0x31e266c0 -//.word 0xefdd0e3d -//.word 0x5c2ba530 -//.word 0x977dece9 -//.word 0x01beeed6 -//.word 0xa0ea86f7 -//.word 0xc6232192 -//.word 0xed02c528 -//.word 0xe62b53a7 -//.word 0x332409e1 -//.word 0xb1674a3d -//.word 0x7ab5a2ad -//.word 0x09ae05e0 -//.word 0x9f9f57b8 -//.word 0xe69b32fe -//.word 0xd4cde355 -//.word 0xd30cb56c -//.word 0x1fb07378 -//.word 0x6fa428e2 -//.word 0xd7bd293c -//.word 0xed4a557a -//.word 0x2bed9c5f -//.word 0x94a9be35 -//.word 0x9a3b55c1 -//.word 0x40ae1676 -//.word 0x7c2a54e9 -//.word 0xdf0dc585 -//.word 0x773c8980 -//.word 0xf5bc680d -//.word 0x0b7c5cd4 -//.word 0x18754f9f -//.word 0x07f52556 -//.word 0x7438fd2d -//.word 0x1139b41c -//.word 0x49c7ab90 -//.word 0x23dbcb60 -//.word 0x6829c602 -//.word 0x08f59fff -//.word 0xba286ca4 -//.word 0xe3a35bfa -//.word 0xb9d3f3f9 -//.word 0xa8869cf9 -//.word 0xf5fd6269 -//.word 0xa142f6c3 -//.word 0x90bcf5bf -//.word 0xea006dc8 -//.word 0xc2ea9eac -//.word 0xf5edfd97 -//.word 0x55a77f42 -//.word 0x07b81368 -//.word 0x2ad5707a -//.word 0xb9181293 -//.word 0xb39a7fae -//.word 0x7944cf17 -//.word 0x77e26b1f -//.word 0x06791514 -//.word 0x91db2970 -//.word 0xf7782251 -//.word 0x31775f29 -//.word 0x350628b7 -//.word 0x1aeeec36 -//.word 0x7c6accd4 -//.word 0x22395e65 -//.word 0xdef2aa59 -//.word 0xb59879eb -//.word 0x406ed09c -//.word 0x520cb7e0 -//.word 0xdcb33e17 -//.word 0x0ddec2be -//.word 0xbd196de7 -//.word 0x0b16fce6 -//.word 0x45fec54e -//.word 0x0905f81c -//.word 0xaa412531 -//.word 0xd5bcfe06 -//.word 0x75c85f9b -//.word 0xd3928bb0 -//.word 0x02fab938 -//.word 0x7aa2cf0b -//.word 0x03456ddb -//.word 0xd54b2d69 -//.word 0xfd9a29f8 -//.word 0x02aebe02 -//.word 0xc9ec902b -//.word 0xb633ce73 -//.word 0x14b5b8af -//.word 0xb7055e3a -//.word 0xdf70aae8 -//.word 0x6091a03b -//.word 0x0020e5da -//.word 0x210b7e3e -//.word 0xa0c8dbaf -//.word 0xfce9146f -//.word 0xbbf17235 -//.word 0x096631dc -//.word 0xa327845d -//.word 0xf300dafb -//.word 0x7c7c60bd -//.word 0x79fac721 -//.word 0xc103470f -//.word 0xeedbe40c -//.word 0xbe56f0b0 -//.word 0xbaedd15a -//.word 0x15110422 -//.word 0xd6c0620f -//.word 0x3a55a28b -//.word 0x53a42013 -//.word 0xf646dc33 -//.word 0xd432c6b2 -//.word 0xe78d390a -//.word 0x10c4c51a -//.word 0xfed7311f -//.word 0x51f8c0e1 -//.word 0xff54b42a -//.word 0xf731117c -//.word 0x0539a303 -//.word 0xf61542c9 -//.word 0xfc3e5529 -//.word 0x54109586 -//.word 0x2521143d -//.word 0xacd07dd7 -//.word 0x96219d84 -//.word 0xadc822c5 -//.word 0xb783a368 -//.word 0x9bade1b9 -//.word 0xc6114df7 -//.word 0xcdfcca05 -//.word 0x5496b362 -//.word 0x2e71205b -//.word 0xc663657f -//.word 0xbd91dc54 -//.word 0xd4cde548 -//.word 0x0d222aea -//.word 0x0dac285a -//.word 0xc5adebfe -//.word 0x51de1877 -//.word 0x200331d4 -//.word 0x56c21505 -//.word 0x6eb5c692 -//.word 0x24be6f8d -//.word 0x929ba6c5 -//.word 0x99baee3c -//.word 0x824e80db -//.word 0xe5a24b65 -//.word 0xcaad39aa -//.word 0x0fe8b4fd -//.word 0x0a5c69e7 -//.word 0x6eff4b1d -//.word 0x7340dbb0 -//.word 0x31e1a784 -//.word 0x4d051103 -//.word 0xd88a5212 -//.word 0x7498bf44 -//.word 0xb97a4a4e -//.word 0xd7ad4bbc -//.word 0x7c3781e2 -//.word 0xf83a5314 -//.word 0x9fc95c1a -//.word 0x6efa27de -//.word 0xf23d3768 -//.word 0x66ec4b0c -//.word 0x1c23e0e2 -//.word 0x1ed1f677 -//.word 0x140f17c2 -//.word 0x68b1965a -//.word 0xa91b15e6 -//.word 0x2d5749d4 -//.word 0xfb64024e -//.word 0xe7d06569 -//.word 0xff897ca0 -//.word 0x26f0f282 -//.word 0xff2f17a7 -//.word 0x0dcc2ae8 -//.word 0x187fd8cf -//.word 0xd241004d -//.word 0xbaa6b9ab -//.word 0x416c96c3 -//.word 0x2b542970 -//.word 0x3930c543 -//.word 0x053e8878 -//.word 0x2db49928 -//.word 0xb39cafc0 -//.word 0xa4e2d3b1 -//.word 0xf8ac6669 -//.word 0xbae96583 -//.word 0x692dec3a -//.word 0x9dbcf924 -//.word 0xede5731d -//.word 0x11916b80 -//.word 0x441ba19e -//.word 0xec624a68 -//.word 0x7d1d106f -//.word 0x9b6f5b0f -//.word 0x7fbccfe6 -//.word 0x9bba168b -//.word 0x81cbdf7d -//.word 0x018a265a -//.word 0x91a3b652 -//.word 0xf3e9edda -//.word 0x11a2c0a5 -//.word 0x2c25fed0 -//.word 0x35a8d95d -//.word 0x7b53a2e2 -//.word 0x8799d482 -//.word 0x44c7541d -//.word 0x64ddf7c4 -//.word 0xfe9e4570 -//.word 0x7ce37df3 -//.word 0xb434d92e -//.word 0x55991285 -//.word 0x85ae2790 -//.word 0xc8f65b13 -//.word 0x24717c31 -//.word 0x83716bdc -//.word 0x58a9d990 -//.word 0x85874f41 -//.word 0x7dc47192 -//.word 0xa5398347 -//.word 0x01f42cfd -//.word 0x0c8b7a18 -//.word 0xe7b027fe -//.word 0xb6061b83 -//.word 0x483331a3 -//.word 0xf6373e77 -//.word 0xcdfc5062 -//.word 0xef2d338c -//.word 0x364c3a91 -//.word 0x1bff3b7a -//.word 0xd6abdcec -//.word 0xc7440d9f -//.word 0x1564d612 -//.word 0x959a537d -//.word 0xed04fd08 -//.word 0xf9202a3a -//.word 0x6ddfd8b4 -//.word 0xbcfba61f -//.word 0x398b2363 -//.word 0x7cd54b19 -//.word 0x08634f44 -//.word 0x2b59953b -//.word 0x250500ea -//.word 0x8cb8713a -//.word 0xeed48ece -//.word 0xb927c2f0 -//.word 0x587784cb -//.word 0x9f5eddda -//.word 0x695924a0 -//.word 0x7f1b0d9a -//.word 0xbc27e272 -//.word 0x6f9d0f75 -//.word 0x0154e447 -//.word 0xd82a97d5 -//.word 0x7a98888c -//.word 0xf68ac9c9 -//.word 0x806dde90 -//.word 0x5b89c180 -//.word 0xfc912a06 -//.word 0x6c780cd2 -//.word 0xee876387 -//.word 0xe2ad2db7 -//.word 0xe916b60e -//.word 0x4afe19cd -//.word 0x94c8047a -//.word 0x854abbd6 -//.word 0x2b6c6010 -//.word 0x49f17138 -//.word 0xfc9492f6 -//.word 0x9e578d7c -//.word 0xeb1897b9 -//.word 0x6265d5d0 -//.word 0xee911ec8 -//.word 0xc6070385 -//.word 0x92df0cf7 -//.word 0xcfaf4591 -//.word 0x74a4f9fd -//.word 0xd6d1be0e -//.word 0xc9c6b1f6 -//.word 0x086503b9 -//.word 0xd7f1b5e1 -//.word 0xe6689f74 -//.word 0x7913b723 -//.word 0xc65b90c4 -//.word 0x9ede2102 -//.word 0x50c2c853 -//.word 0xcb498f2b -//.word 0x02a6ad70 -//.word 0x9510502d -//.word 0xad14998a -//.word 0x272fe8fc -//.word 0xf69c5bb9 -//.word 0xc26b916f -//.word 0xd5d3b435 -//.word 0x38c9b6c2 -//.word 0x19d1dadc -//.word 0x70157714 -//.word 0xe3b4f9b1 -//.word 0xe65c28ea -//.word 0x261bad58 -//.word 0x2872d1aa -//.word 0x2dac899b -//.word 0x5a6db021 -//.word 0x158e93e7 -//.word 0xb228b2fe -//.word 0x4fefc5d0 -//.word 0xfcc2fe55 -//.word 0x20808e89 -//.word 0x181c6a1d -//.word 0x20f44f6c -//.word 0x775e03b2 -//.word 0xbe84df78 -//.word 0xa1738a53 -//.word 0xba6e07ce -//.word 0xb288f2a5 -//.word 0xaa720634 -//.word 0xd991e32e -//.word 0x76530e92 -//.word 0xd8c43adb -//.word 0xdc5cc678 -//.word 0x871b867b -//.word 0xecd9c695 -//.word 0x50d78c42 -//.word 0x8d991e41 -//.word 0xb4f8c447 -//.word 0xf673cff4 -//.word 0xc5c6da06 -//.word 0x36be50cd -//.word 0xaa4b2fdf -//.word 0xadd70b0c -//.word 0x1ed65594 -//.word 0x919edd98 -//.word 0xf17996cf -//.word 0x6af9997a -//.word 0x858c6d9a -//.word 0x95508660 -//.word 0x53290be5 -//.word 0xc510dd1b -//.word 0x64aed404 -//.word 0x7d294c21 -//.word 0xd83ee02e -//.word 0x9890750c -//.word 0x623f7bff -//.word 0xc1bd6f19 -//.word 0xc9dda4f6 -//.word 0xfb2d44aa -//.word 0x698691f8 -//.word 0x1be171c5 -//.word 0xb06c2acb -//.word 0x48de6a92 -//.word 0xa2078a9c -//.word 0x82ab13e0 -//.word 0x5690827b -//.word 0x18d648a1 -//.word 0x768715d9 -//.word 0x316f566a -//.word 0xc32efd10 -//.word 0x448b80f4 -//.word 0x8e0b24db -//.word 0xa0c37b9e -//.word 0x406a2bda -//.word 0xe5b2f2e8 -//.word 0xd3d8e710 -//.word 0x887a03f9 -//.word 0x57aadf64 -//.word 0x5340bf1a -//.word 0x6e74d023 -//.word 0xe2acae39 -//.word 0xd092297d -//.word 0x276a4968 -//.word 0xc8a39003 -//.word 0xe8ab7e5b -//.word 0xb5085b2f -//.word 0x3ca530ed -//.word 0x8a6917dd -//.word 0x110eb49b -//.word 0x4e3104ca -//.word 0xa9a55507 -//.word 0x9d0d961c -//.word 0x18aad176 -//.word 0x2571f6da -//.word 0xc861da53 -//.word 0x29137f6f -//.word 0xf59396aa -//.word 0x026e422b -//.word 0x320c1fae -//.word 0x994083c2 -//.word 0xe21e0434 -//.word 0xee0d3acb -//.word 0xbf1dc635 -//.word 0x959a9242 -//.word 0x56e15b50 -//.word 0x33726d07 -//.word 0x8947ae46 -//.word 0x0564de5c -//.word 0x0cb01d7c -//.word 0x5a03ae6b -//.word 0xe980fa7c -//.word 0x1425d8be -//.word 0xfca00b74 -//.word 0x2b640cc5 -//.word 0x77fd0bb5 -//.word 0x29a03054 -//.word 0x5f078000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00011A70 -//// expected output -//.word 0xaa13b83b -//.word 0x4db9a58a -//.word 0x7684bad6 -//.word 0xb864abda -//.word 0xd23bdd71 -//.word 0xb4e5bcab -//.word 0x1a8750aa -//.word 0x8e6b1ca7 -//.word 0x0730a7b9 -//.word 0xff684fa6 -//.word 0xb73a70ca -//.word 0x75c55aee -//.word 0x6afe1b6f -//.word 0x573c8fb6 -//.word 0xecf3962a -//.word 0x30e0af0b -//// SHA512LongMsgvector_91 -//// vector length -//.word 0x00011D88 -//// input message -//.word 0x32670fb2 -//.word 0xa42da763 -//.word 0x62bfcca8 -//.word 0xbb8358c1 -//.word 0x7a6595a0 -//.word 0x5d7b51a9 -//.word 0xc8e935b6 -//.word 0xbb03525e -//.word 0x02b2fd77 -//.word 0xab19ddd9 -//.word 0xbd784265 -//.word 0x2750b846 -//.word 0xf7c8dd77 -//.word 0xcc4f6f85 -//.word 0x8e83a997 -//.word 0x5c51d0ab -//.word 0xc65e0922 -//.word 0x3da66d7f -//.word 0xc7645f6c -//.word 0xf8311dfe -//.word 0x1d6f9639 -//.word 0xbae87cd7 -//.word 0x37b39945 -//.word 0xd65866ef -//.word 0xe833dabd -//.word 0x411e80dd -//.word 0xe94accc4 -//.word 0x146eaf6f -//.word 0x542469ef -//.word 0x0e8f9f24 -//.word 0x2b42adc9 -//.word 0x0f5d3db0 -//.word 0xcff9194f -//.word 0x9ec73d7c -//.word 0x89f33175 -//.word 0x654f9523 -//.word 0x05adfda0 -//.word 0xb08c00f6 -//.word 0xd1f88c2a -//.word 0xf1ab7c79 -//.word 0xe3786de1 -//.word 0x3eeacde3 -//.word 0x11283488 -//.word 0xd11bf8a2 -//.word 0x96d3fc54 -//.word 0x8727c8d4 -//.word 0x939cdf70 -//.word 0x63894ccf -//.word 0x8c787f7a -//.word 0x08ce579a -//.word 0xe7af8004 -//.word 0x421cff72 -//.word 0x715e0b13 -//.word 0x7da81f47 -//.word 0xd8f84da3 -//.word 0x4c3ed53c -//.word 0x32c0f622 -//.word 0xe4bd042a -//.word 0x7550bbf1 -//.word 0x9f98d31d -//.word 0xfc16d4e6 -//.word 0x79562cd6 -//.word 0x09d27fcc -//.word 0x96133e47 -//.word 0x3d197be1 -//.word 0xbafdfc1a -//.word 0x21d58e57 -//.word 0xd0d89b2b -//.word 0xa1c3ffd4 -//.word 0x647b1809 -//.word 0x8cf31cf3 -//.word 0x2850b079 -//.word 0x154bb6c0 -//.word 0x72d766f2 -//.word 0x5504a03f -//.word 0xbc248022 -//.word 0xc72c34e6 -//.word 0x245d0a68 -//.word 0xca23cd1e -//.word 0xea3d5258 -//.word 0x221e4ec6 -//.word 0xf5936a3b -//.word 0x78a79ab0 -//.word 0x4dc4aa8c -//.word 0xd51a1a23 -//.word 0xa2442b7c -//.word 0x2b293a57 -//.word 0xc4214d6e -//.word 0xcd5aecfc -//.word 0x2979327c -//.word 0xf28423b3 -//.word 0x6aff40f0 -//.word 0x35555993 -//.word 0xc67aa3cc -//.word 0x18cf0aa5 -//.word 0x9e46c843 -//.word 0x7cc63768 -//.word 0xf7d1e33d -//.word 0x2a64e44f -//.word 0xfb1e6bd7 -//.word 0x4ea59a3e -//.word 0x794699e0 -//.word 0xf7dbe611 -//.word 0x60f2ec5d -//.word 0x982bd814 -//.word 0x47e2a807 -//.word 0x8a0e848c -//.word 0xe96952c8 -//.word 0x88d2852d -//.word 0xa1ef3541 -//.word 0x311675a1 -//.word 0xf26ee146 -//.word 0x8a517608 -//.word 0x02f5a760 -//.word 0x794cac72 -//.word 0x1a281e4b -//.word 0x4ba3c167 -//.word 0x27bea176 -//.word 0x2f48605f -//.word 0x3c02ce86 -//.word 0xb900ba4b -//.word 0x0e5208d3 -//.word 0x5fe4040a -//.word 0x77a3f6e8 -//.word 0xffe1f7f4 -//.word 0xf4fb0207 -//.word 0x58394e53 -//.word 0x27f5dba3 -//.word 0x8c004be4 -//.word 0x5541f4e5 -//.word 0xa59f335b -//.word 0xe8220328 -//.word 0x0c54cedd -//.word 0xefee837d -//.word 0x13b0e884 -//.word 0x99913227 -//.word 0x6d18d3de -//.word 0xbe0a9320 -//.word 0xb145e26d -//.word 0x56ec6c92 -//.word 0xdbc4ef29 -//.word 0xffde495f -//.word 0xca77d6fa -//.word 0x7b1cf89a -//.word 0xc312f73e -//.word 0x30f40c0b -//.word 0xec9eb849 -//.word 0xa74a5aaf -//.word 0xd2f901e0 -//.word 0x0e157f35 -//.word 0xe454bfbd -//.word 0xb6df5882 -//.word 0xf5b4610e -//.word 0x9548882e -//.word 0xbe715ef6 -//.word 0xc584f505 -//.word 0x5abaad0b -//.word 0x03d94b88 -//.word 0xc9104bd6 -//.word 0x30227869 -//.word 0x6dc7b956 -//.word 0xd44f2e12 -//.word 0x90887b7c -//.word 0x96e2641e -//.word 0xdcd19bb0 -//.word 0xc573d5de -//.word 0xe073234c -//.word 0xd32d80d6 -//.word 0x9212a61c -//.word 0xd54e273e -//.word 0xc8a9b8e4 -//.word 0x04abd082 -//.word 0xbe0472da -//.word 0x3e2b46c2 -//.word 0x9344ef27 -//.word 0x86479952 -//.word 0xcc5fd16a -//.word 0x80909a3a -//.word 0xd09dbd35 -//.word 0xf62960b7 -//.word 0x6a1cda8e -//.word 0x5548c6b9 -//.word 0x494d566f -//.word 0x30b9eb64 -//.word 0x8374e247 -//.word 0xbd5cb08f -//.word 0x0e2c3177 -//.word 0x53a23d47 -//.word 0x46e17dd6 -//.word 0xf2147c4d -//.word 0x6b54012d -//.word 0xbbcc9d94 -//.word 0x1f1a80bc -//.word 0x74f990c4 -//.word 0xec1dbdb3 -//.word 0x055f8eba -//.word 0xbc1a00b9 -//.word 0xfdd59105 -//.word 0x5f229869 -//.word 0x0ec5d76a -//.word 0x081953cf -//.word 0x8db06461 -//.word 0xd03a08f0 -//.word 0xf3a87c96 -//.word 0x32910e40 -//.word 0x5fd42d69 -//.word 0x8e7fc229 -//.word 0x11efc36f -//.word 0xa739048a -//.word 0xf0c951ef -//.word 0x2449bb36 -//.word 0x05c52f65 -//.word 0x120c4d71 -//.word 0xfe597602 -//.word 0x60322777 -//.word 0xac91862a -//.word 0x62423bf5 -//.word 0x858c81f5 -//.word 0x4f137d8d -//.word 0x23fdceae -//.word 0xc3546556 -//.word 0xc3ab9757 -//.word 0x3e05705a -//.word 0xc7f24b23 -//.word 0xa2fb9f17 -//.word 0x35401cfb -//.word 0xb960f7fe -//.word 0x359982fa -//.word 0xad31fff7 -//.word 0x9614b6f1 -//.word 0x8ebe45db -//.word 0x4a5b38e3 -//.word 0xd02dd9f8 -//.word 0xe62f4989 -//.word 0xcaf8d090 -//.word 0x23e172d0 -//.word 0x386ac35a -//.word 0x60dafc56 -//.word 0xb9264d00 -//.word 0x1d1475f1 -//.word 0x52a091a0 -//.word 0x819f3128 -//.word 0xeaa2b14c -//.word 0xd51dc7b8 -//.word 0xccc95889 -//.word 0x07469010 -//.word 0x280531d3 -//.word 0x29652bd5 -//.word 0x921c6e18 -//.word 0xefd9fc5f -//.word 0x81284238 -//.word 0x3495a83a -//.word 0xd114678c -//.word 0x75a09aa7 -//.word 0x4223995c -//.word 0x54968218 -//.word 0xf6691867 -//.word 0x1625d1b7 -//.word 0xf7502a5f -//.word 0x26913edf -//.word 0xaf149769 -//.word 0x903044a1 -//.word 0x6e472ba2 -//.word 0x87eea141 -//.word 0xe84e3895 -//.word 0xe0cad8b7 -//.word 0xb4e312c6 -//.word 0x9458b02e -//.word 0xce91912a -//.word 0x423db488 -//.word 0x163b92ad -//.word 0xabb6b1d8 -//.word 0xcf9576ab -//.word 0x34123be7 -//.word 0x20a8a177 -//.word 0x673327b0 -//.word 0x9753fcd7 -//.word 0x721112e3 -//.word 0xa1c57485 -//.word 0xa637d966 -//.word 0x130479b0 -//.word 0xf9431fcf -//.word 0xa4698079 -//.word 0x856acbeb -//.word 0x70218176 -//.word 0x08f2873b -//.word 0x77ae7a33 -//.word 0x62b64272 -//.word 0x1b64eaac -//.word 0x19a6aef8 -//.word 0xa6ec56d4 -//.word 0xd845c369 -//.word 0xc2c4c811 -//.word 0xeb293b17 -//.word 0x00bd4bbe -//.word 0xc57e1384 -//.word 0x517c70a7 -//.word 0x7b8310e9 -//.word 0x90facc90 -//.word 0x470b38b2 -//.word 0xf60578af -//.word 0x05fe55ff -//.word 0xa3bc902e -//.word 0xb9d67524 -//.word 0x1c16b4aa -//.word 0x07226d2a -//.word 0xc85b8ab6 -//.word 0xb906514c -//.word 0x72aa3959 -//.word 0x3db8fd7b -//.word 0xcb71f08b -//.word 0x250590db -//.word 0xe4f85dbc -//.word 0xa5caec44 -//.word 0xb8d7374e -//.word 0x187c37c1 -//.word 0xa07bb516 -//.word 0x7ba15d14 -//.word 0xdda614de -//.word 0xf0548b30 -//.word 0x12eb14e6 -//.word 0x3dc5b5be -//.word 0xc6367b5e -//.word 0x4bb61199 -//.word 0xe74291ee -//.word 0xa7ff9a51 -//.word 0x4221a32f -//.word 0x040b8fac -//.word 0x0cb7812f -//.word 0xb759f120 -//.word 0x5c3f00f0 -//.word 0x3afc085a -//.word 0xaec578e9 -//.word 0xaa1bdfbb -//.word 0x62ab4684 -//.word 0x4872c3d5 -//.word 0x3b244b9f -//.word 0xfbcfc8f3 -//.word 0xe1bb6b0b -//.word 0xcd96448e -//.word 0x5fcd1010 -//.word 0x6a3d52d8 -//.word 0xa50ba5e7 -//.word 0xa4d05036 -//.word 0x07fa1b3e -//.word 0xf26f61bd -//.word 0xbd7367b8 -//.word 0xeccbecbc -//.word 0x6122016a -//.word 0xd0ad1b33 -//.word 0x740b675f -//.word 0x006f5d54 -//.word 0xd9009815 -//.word 0x8280e509 -//.word 0x572c9afe -//.word 0x7fe4296d -//.word 0x1c8cf4ff -//.word 0xc4b26351 -//.word 0x357134f4 -//.word 0x449513b9 -//.word 0x17ff6b2b -//.word 0x944c7b5c -//.word 0x19b1ace5 -//.word 0x6e292228 -//.word 0xf8d391d8 -//.word 0x2f9552bc -//.word 0x5206b6af -//.word 0x598b9aec -//.word 0x2bc03b88 -//.word 0x11194c40 -//.word 0x6ac94675 -//.word 0xa1e20075 -//.word 0x5dbe7ffc -//.word 0xf79f0ffb -//.word 0x31929297 -//.word 0x25991975 -//.word 0x7b08b135 -//.word 0xdf30803c -//.word 0xb23b10b7 -//.word 0x0057eadc -//.word 0xb3176773 -//.word 0x0615c396 -//.word 0x3cdd73b5 -//.word 0x9106b8dd -//.word 0x71a27539 -//.word 0xe8d93ed9 -//.word 0x5ad0b1b2 -//.word 0x74d009e6 -//.word 0x62a4f046 -//.word 0x42429515 -//.word 0xd9aeff0f -//.word 0x851ca1aa -//.word 0x73552e9c -//.word 0x125bae9d -//.word 0xc850d26e -//.word 0xe394841a -//.word 0xd22ec37c -//.word 0x956dae01 -//.word 0x72cedeb0 -//.word 0xea21f967 -//.word 0xebe88467 -//.word 0x4700f912 -//.word 0x65831af4 -//.word 0x37ec8401 -//.word 0x6b7c871d -//.word 0xe6dd35e2 -//.word 0x6e06b99d -//.word 0xa65eeb99 -//.word 0x402421a1 -//.word 0x6e0e47c0 -//.word 0x9930324b -//.word 0x56203121 -//.word 0x9658e532 -//.word 0x1cdb533e -//.word 0x351c38df -//.word 0xa31b9cca -//.word 0xdad1aa52 -//.word 0x6fcebf2e -//.word 0xcd21c17b -//.word 0x2a78b205 -//.word 0xb98885c2 -//.word 0x21af309f -//.word 0x2fd8027f -//.word 0xc7a03781 -//.word 0x21b7ca82 -//.word 0x32888ae4 -//.word 0x671c708d -//.word 0x993b3032 -//.word 0x3ed50ed5 -//.word 0xdca1f38c -//.word 0xc404c085 -//.word 0xfc34e247 -//.word 0x7d9d273a -//.word 0x9e84cf6a -//.word 0xd1eae788 -//.word 0x8db3d232 -//.word 0x8b072973 -//.word 0x35f9c58e -//.word 0x5c6619f7 -//.word 0x2920c5a3 -//.word 0x564c6981 -//.word 0x9d09b749 -//.word 0x7153cd74 -//.word 0xed26c18b -//.word 0x0ae67da5 -//.word 0x14fecd2c -//.word 0x5fc8b6df -//.word 0x36ad0a1d -//.word 0x148d3960 -//.word 0x17606a08 -//.word 0xb11eca5a -//.word 0xa1dd24c8 -//.word 0x2139b372 -//.word 0x61f934ee -//.word 0x35f03e44 -//.word 0x0a20d63d -//.word 0x1f263fde -//.word 0xf2d20f2f -//.word 0xf8158841 -//.word 0x9020246e -//.word 0x3aca72e3 -//.word 0x0432215c -//.word 0x46a65a2f -//.word 0x8fc4548c -//.word 0xdfdf2203 -//.word 0x17a5cf46 -//.word 0xadfeac31 -//.word 0xa437e907 -//.word 0xbc5f63ff -//.word 0xe6f1bdff -//.word 0xfab4b2a7 -//.word 0xace0a991 -//.word 0xbd828ad7 -//.word 0x6e21d1d6 -//.word 0x3aa2e132 -//.word 0xc4699a1b -//.word 0x0fc12dce -//.word 0xed7e2f5e -//.word 0xbae1edb4 -//.word 0x49bb00d4 -//.word 0x1fd52163 -//.word 0xdf903e66 -//.word 0x06c9cd4d -//.word 0xd8ff6030 -//.word 0x9bb87958 -//.word 0x0220a001 -//.word 0xecf4b45e -//.word 0x4f9e7fde -//.word 0x6ea28cae -//.word 0x53383d7f -//.word 0x793a1889 -//.word 0xc94162d0 -//.word 0xc70cefa6 -//.word 0x0e213871 -//.word 0xfab6aeae -//.word 0xa4d14e36 -//.word 0x13af76c0 -//.word 0xb063f7a8 -//.word 0xfbbf6bef -//.word 0x7d77c982 -//.word 0xfd8436bf -//.word 0xf7c71e35 -//.word 0x4aef84ab -//.word 0x319c9664 -//.word 0x74c485a2 -//.word 0xe0579369 -//.word 0xf41e6e85 -//.word 0xdde9bccf -//.word 0xa5e9f7ab -//.word 0xa75b7bd5 -//.word 0x4666dd5e -//.word 0xde477ff1 -//.word 0xfbab615b -//.word 0xc95c3a4a -//.word 0xcc20c855 -//.word 0xd1df643d -//.word 0x2503d973 -//.word 0x042476da -//.word 0x54e562cd -//.word 0x94193064 -//.word 0x0f2bb3f3 -//.word 0x55bc14d4 -//.word 0xeb8d2167 -//.word 0x42a0e856 -//.word 0xe69a851e -//.word 0xf86c38cb -//.word 0xde32bb02 -//.word 0x395bd245 -//.word 0x170b2373 -//.word 0x6bbd488e -//.word 0xba2d23c1 -//.word 0x167571a2 -//.word 0x5076a2b4 -//.word 0x6a79e930 -//.word 0x4b168f05 -//.word 0xb6568c1d -//.word 0x7d1458e2 -//.word 0xf2a9ff01 -//.word 0x9fc8746d -//.word 0x37a627a8 -//.word 0xcc5ed93e -//.word 0x4195af92 -//.word 0x035986dc -//.word 0xf44f8773 -//.word 0xa80efb48 -//.word 0xd4c660b3 -//.word 0x0325bc73 -//.word 0x8b7b31f0 -//.word 0xc01cd2c2 -//.word 0x6706b577 -//.word 0x6ec34991 -//.word 0xda91eacf -//.word 0x00c1b3ae -//.word 0xf85d942e -//.word 0x4f0da4d9 -//.word 0xfc3bb802 -//.word 0x9576344b -//.word 0xc314216a -//.word 0xf41c802c -//.word 0x4f63deb9 -//.word 0xedf4291b -//.word 0x46b5c2fa -//.word 0xe948d3a9 -//.word 0x7130e367 -//.word 0xb435a8de -//.word 0x3d091cf0 -//.word 0xfd2bd3b3 -//.word 0x3d0c8bba -//.word 0xd7710597 -//.word 0xa618139d -//.word 0x3b9ef3eb -//.word 0xd1a0dba6 -//.word 0x8321d585 -//.word 0xbd2bcd93 -//.word 0xf1b9e830 -//.word 0x8bd51859 -//.word 0x26feee2a -//.word 0x00ccafa1 -//.word 0xabd7a9a5 -//.word 0x06d4c747 -//.word 0x6c016447 -//.word 0x2bc45dda -//.word 0x388e6aaa -//.word 0x2106ae1f -//.word 0x42648cdd -//.word 0x3c1abd8e -//.word 0xa3ba9fe1 -//.word 0xf714d0d2 -//.word 0xd69efc2d -//.word 0x6f1af34d -//.word 0x3a72ff2a -//.word 0xe7e77493 -//.word 0x946a88b7 -//.word 0x424a65ea -//.word 0x8a107da6 -//.word 0x8ca81ed0 -//.word 0x29c1463d -//.word 0x7275b875 -//.word 0x5f2d4fb7 -//.word 0xc5bf933d -//.word 0x82da8ac0 -//.word 0xfaa4d13f -//.word 0xc8a1eafd -//.word 0xadd7d8c9 -//.word 0xcc30e981 -//.word 0x1a1fd4d9 -//.word 0x10860359 -//.word 0xa3d832a5 -//.word 0x757b3901 -//.word 0x4d702614 -//.word 0xc5358fec -//.word 0x42ea2743 -//.word 0x29b48e01 -//.word 0x505f6e02 -//.word 0xb347c318 -//.word 0x69787a54 -//.word 0xd6143e81 -//.word 0x21f58ff2 -//.word 0xe894147e -//.word 0x332932c8 -//.word 0xa714ddc4 -//.word 0xfd7cae76 -//.word 0xb23636fd -//.word 0xffe893d1 -//.word 0x0b6e4049 -//.word 0x607c3260 -//.word 0x9b8520b8 -//.word 0x68dc22df -//.word 0xae1a7dd2 -//.word 0x07bfbdbf -//.word 0x731c050f -//.word 0x4d70a4a4 -//.word 0x7e51e85f -//.word 0xf04d37e6 -//.word 0x46d25ba4 -//.word 0xca4b1e11 -//.word 0xa68c1733 -//.word 0x5870c365 -//.word 0x60c0d857 -//.word 0x3b57d556 -//.word 0x9584decd -//.word 0xbbb0c70c -//.word 0x4f416f49 -//.word 0x3fbe4fe4 -//.word 0xf73352f0 -//.word 0xd6d7e7ee -//.word 0xdfec55db -//.word 0xb2e7506e -//.word 0xbad1c99b -//.word 0xa7ed0a5b -//.word 0x1f9b01af -//.word 0xb07cdce2 -//.word 0x0ad7d70f -//.word 0x6b3b52e4 -//.word 0x5a6627a5 -//.word 0x98663a74 -//.word 0x54fe52cf -//.word 0x9e4b275a -//.word 0x1ea7bcdf -//.word 0x06ceee93 -//.word 0x45404d9b -//.word 0xfee62cce -//.word 0x38f7f4bd -//.word 0xd71dbef0 -//.word 0xcbd42073 -//.word 0x87134692 -//.word 0xb42f45e0 -//.word 0x27fcad7e -//.word 0x11355d99 -//.word 0x761e9c35 -//.word 0xe1676529 -//.word 0x5554016b -//.word 0x861bdc8e -//.word 0x498e9189 -//.word 0x4af947ba -//.word 0xfd4e402b -//.word 0xd77faf13 -//.word 0xbd2ccaa0 -//.word 0xbd7e21f3 -//.word 0xfc532e6d -//.word 0xef9b2d29 -//.word 0xce012ec9 -//.word 0x46cf6876 -//.word 0x6f0bd022 -//.word 0xfde6ea10 -//.word 0xba58df97 -//.word 0x3404d123 -//.word 0xb2616b7c -//.word 0x6d1bbc4b -//.word 0xfdb745da -//.word 0x1277501b -//.word 0x647d84ec -//.word 0xed32b799 -//.word 0x55e903a2 -//.word 0xaec01cbf -//.word 0x61c7e022 -//.word 0x686530fc -//.word 0xbef7ff42 -//.word 0x14b9a8b1 -//.word 0xc6ea8510 -//.word 0x0d2bbdb5 -//.word 0x76295d4a -//.word 0x937babd1 -//.word 0xf0ceb7e6 -//.word 0x483f3244 -//.word 0xf908838b -//.word 0xb65f1841 -//.word 0x7c9bfa16 -//.word 0xc799a56c -//.word 0x055e1616 -//.word 0x4bfd2560 -//.word 0x47bb1550 -//.word 0x76726a2c -//.word 0x9633fa3c -//.word 0x5f2f47d1 -//.word 0x6ed80c87 -//.word 0x824316c6 -//.word 0xead1558f -//.word 0x3e0e3375 -//.word 0x4ed924e9 -//.word 0x58c67fbb -//.word 0x7ec08cde -//.word 0x76f3de6c -//.word 0x84e9e3e9 -//.word 0xa5f2b9cc -//.word 0x0dca433b -//.word 0xd4767d17 -//.word 0xed6f0c38 -//.word 0x57021afa -//.word 0x97f760f8 -//.word 0x65718417 -//.word 0xa615a6c7 -//.word 0x9a6e3685 -//.word 0x579008a4 -//.word 0x76fcaa4e -//.word 0x0cc4f5c6 -//.word 0xdcf0e2ef -//.word 0xca1f9f12 -//.word 0x9372e2dc -//.word 0xbca57ea6 -//.word 0xc87f34fa -//.word 0xae6dcb52 -//.word 0x8a6a6222 -//.word 0x93210619 -//.word 0x4d5680a4 -//.word 0x008270b5 -//.word 0x68bda0c2 -//.word 0xaee19210 -//.word 0x97ed5b31 -//.word 0xfca7b4cc -//.word 0x7a864f9c -//.word 0x6ace67bb -//.word 0x13fd9b21 -//.word 0x1f66fc67 -//.word 0x4c1c65d1 -//.word 0x64110b8c -//.word 0x6f7f5434 -//.word 0x2787ed9a -//.word 0xac1917c3 -//.word 0x79134134 -//.word 0x97addc6c -//.word 0x10146bb3 -//.word 0xa755d912 -//.word 0xc67d10a3 -//.word 0xb8fec70b -//.word 0x18559b44 -//.word 0x8aea62a0 -//.word 0xa938bc0a -//.word 0x402dea8f -//.word 0xbcd4e41e -//.word 0xe131a58c -//.word 0xbd6dcadb -//.word 0xda335bbc -//.word 0xb859e952 -//.word 0x7ac3d939 -//.word 0xe084ffc7 -//.word 0x75476f92 -//.word 0x0aee8f32 -//.word 0x62787148 -//.word 0x2f2860bf -//.word 0x3de3b951 -//.word 0xeedbfd4d -//.word 0xe66a2398 -//.word 0x074033f2 -//.word 0xa0c1107b -//.word 0xe1a99576 -//.word 0x93f2e44c -//.word 0x06f7fbd4 -//.word 0x4ad989d1 -//.word 0xa122ffbd -//.word 0x35a8e9c5 -//.word 0x07b57f14 -//.word 0x28647754 -//.word 0x2b4e1e72 -//.word 0xda66a7a2 -//.word 0x2822c3a4 -//.word 0x67dc7245 -//.word 0xbb771828 -//.word 0xcf45d3c6 -//.word 0xc6280cb4 -//.word 0x75f84c25 -//.word 0xcf2551af -//.word 0xa09e6252 -//.word 0x7ff1dfb6 -//.word 0xfdb31cb4 -//.word 0x23226f18 -//.word 0x1c0988a5 -//.word 0x2ee4015a -//.word 0xef4536f4 -//.word 0xb57657b4 -//.word 0x4e60bc62 -//.word 0xf1ab7892 -//.word 0x75273026 -//.word 0xc16b2e14 -//.word 0x84bcb16a -//.word 0x2630878f -//.word 0xfe12decb -//.word 0xc5895809 -//.word 0x4a755ddc -//.word 0x689ab5c1 -//.word 0x350056a4 -//.word 0x7d997aa5 -//.word 0x6f25f51b -//.word 0x9553c6d9 -//.word 0x0a29ecb1 -//.word 0xe7a57b37 -//.word 0xfea5eec7 -//.word 0xcb04bfca -//.word 0xa7063534 -//.word 0x3ff67e51 -//.word 0x450dfdc2 -//.word 0x6596e5c3 -//.word 0x7b5007af -//.word 0x0314e8c5 -//.word 0xd0b7172c -//.word 0x0232bd35 -//.word 0x320076e1 -//.word 0xefc85fa3 -//.word 0x6e3c7166 -//.word 0x7d410dd2 -//.word 0xb950d7cb -//.word 0x011cc83b -//.word 0x2a757f12 -//.word 0xf46cd88b -//.word 0x3db8c0b0 -//.word 0x75584820 -//.word 0x527af810 -//.word 0xc59c6590 -//.word 0x2cf1050f -//.word 0xc9064322 -//.word 0x73a5cf81 -//.word 0x8bfa3852 -//.word 0x32f4bcab -//.word 0xb9ee5f52 -//.word 0x598f3ac7 -//.word 0x25ee1684 -//.word 0x3cfa3983 -//.word 0x431a8001 -//.word 0x1310ae82 -//.word 0xae230415 -//.word 0x787d12d9 -//.word 0xa4d2ccc0 -//.word 0xec42e093 -//.word 0x85814736 -//.word 0x52351a2e -//.word 0x589fa860 -//.word 0x727ec51b -//.word 0x45306559 -//.word 0x771b6942 -//.word 0x1c4bb8f2 -//.word 0x715c927c -//.word 0xcd9b212f -//.word 0xd4685118 -//.word 0xeedfe2c7 -//.word 0xf8b7bc56 -//.word 0x396982a8 -//.word 0x979569ef -//.word 0x0aa24b71 -//.word 0x52a6f78b -//.word 0xe585ccf6 -//.word 0x2c5c8649 -//.word 0xee2057bf -//.word 0x0d823a3b -//.word 0x70168489 -//.word 0x40b5bbe7 -//.word 0x5720acc4 -//.word 0xf5e5b8c7 -//.word 0xb5876f13 -//.word 0xc0d960ca -//.word 0x41ab2ecf -//.word 0x19a8e7d1 -//.word 0xd37f9285 -//.word 0xda410732 -//.word 0xe90a0473 -//.word 0xc4e47c39 -//.word 0x26e8320f -//.word 0xfaa787a2 -//.word 0xcdc89080 -//.word 0x84f26c20 -//.word 0x4aecd523 -//.word 0xcd02f4d9 -//.word 0xaaab7a07 -//.word 0x256aece7 -//.word 0x1ef23e71 -//.word 0x418da4d9 -//.word 0x7cbea559 -//.word 0xb6257130 -//.word 0xbea474eb -//.word 0x81c02be3 -//.word 0x814a3707 -//.word 0x823eb0db -//.word 0x86ebbbc1 -//.word 0xfc545f78 -//.word 0x35d794e2 -//.word 0x170c9d0a -//.word 0x15f09865 -//.word 0x5f435458 -//.word 0x552e62fb -//.word 0x42296f1d -//.word 0x471cd188 -//.word 0x95c45f85 -//.word 0xdf5986a3 -//.word 0x106e99b5 -//.word 0x3918691a -//.word 0xcd521641 -//.word 0x10a0246b -//.word 0xcdf3d1b3 -//.word 0x47cda64c -//.word 0x73a54d0b -//.word 0x648da225 -//.word 0x07120c39 -//.word 0x10640e91 -//.word 0x34b719a5 -//.word 0x99e8a5e0 -//.word 0x8b6480a7 -//.word 0x70466598 -//.word 0xfebfd00f -//.word 0xabbb11ef -//.word 0x65c19f9f -//.word 0x841bb052 -//.word 0xfd38068c -//.word 0xd84e0ce2 -//.word 0xe4432101 -//.word 0xa9ce34f1 -//.word 0x9eda919b -//.word 0x9c2bfa89 -//.word 0x9343faee -//.word 0x7c8776e6 -//.word 0x8e9e85fe -//.word 0xb51a82f7 -//.word 0x405a5fc7 -//.word 0xd9ae3be1 -//.word 0xbbbd37b6 -//.word 0x1f24867c -//.word 0xf760c42e -//.word 0xdfee89d4 -//.word 0x51b03d04 -//.word 0x18932ea9 -//.word 0x076fdf03 -//.word 0xea2fa4ef -//.word 0xbd316b69 -//.word 0x1cf0dd4f -//.word 0xfbe0a667 -//.word 0x979910a4 -//.word 0xac38d7a5 -//.word 0xe902397f -//.word 0xa14b4cbc -//.word 0xc39794a4 -//.word 0x0cfed5bb -//.word 0x7bd5268a -//.word 0x068a47a2 -//.word 0x8bd034df -//.word 0x09fcfaea -//.word 0x10afca01 -//.word 0x76b64cfb -//.word 0x4c2e3586 -//.word 0x10ec1cb4 -//.word 0x241c8ab6 -//.word 0x7f2750e7 -//.word 0xa3db1d0c -//.word 0xcfc64fd9 -//.word 0x75e20ab8 -//.word 0xee7887c7 -//.word 0x6d3eaf1f -//.word 0x32c2e95c -//.word 0x000c305a -//.word 0xd07f683c -//.word 0xc701f2b3 -//.word 0x665c7e7d -//.word 0x01e3202b -//.word 0x7258a728 -//.word 0x0e0d2af7 -//.word 0xd84ae3bc -//.word 0xf5ef40fe -//.word 0x605a38ab -//.word 0xdf8bdc5c -//.word 0x36862edb -//.word 0x9af935e3 -//.word 0x681f5126 -//.word 0x17e4cd94 -//.word 0x6c4ab3db -//.word 0xec0be42a -//.word 0x9780673b -//.word 0xd3c10290 -//.word 0xa70e07fd -//.word 0x296e7166 -//.word 0x3a952fca -//.word 0x700bc080 -//.word 0x548b00c1 -//.word 0xceaa4267 -//.word 0xddb99ef4 -//.word 0x8beb8dd6 -//.word 0x21bbb3ea -//.word 0x9788fb3e -//.word 0x4e82e91b -//.word 0x02ca2c43 -//.word 0xfad57377 -//.word 0x8112823c -//.word 0x9acc85df -//.word 0xf051a4b7 -//.word 0x0c54d7aa -//.word 0xca90fcf2 -//.word 0x0eae2721 -//.word 0xb3693963 -//.word 0xc4f0b404 -//.word 0xef8bcd32 -//.word 0x3682c303 -//.word 0xe83b70ba -//.word 0xd0a21e46 -//.word 0xaccd9b0b -//.word 0xe1e190e5 -//.word 0x6c2f0e6a -//.word 0x1ca36a70 -//.word 0xfe5f4bd0 -//.word 0x19a30169 -//.word 0x5cf01867 -//.word 0xd56d2dc5 -//.word 0x24890110 -//.word 0x2ee2cc6e -//.word 0x1666d4e0 -//.word 0x69b73dc4 -//.word 0x98d4239e -//.word 0xacf7e617 -//.word 0x35b9c546 -//.word 0x837caf2f -//.word 0x190a5589 -//.word 0x5f7a84c5 -//.word 0x9754b24b -//.word 0x12f5d707 -//.word 0xa4347e24 -//.word 0x55451b17 -//.word 0x59de9fe0 -//.word 0x43994a8c -//.word 0x759ac0ff -//.word 0xdb7160f0 -//.word 0xd941d135 -//.word 0x8122dd41 -//.word 0x0ac583eb -//.word 0x7d574771 -//.word 0xb2a7cdbc -//.word 0x7b8aa6e5 -//.word 0x1f7f6af9 -//.word 0x0a8f07f9 -//.word 0xc2775825 -//.word 0x1d09fa7a -//.word 0xb2d05b7a -//.word 0x8df3132b -//.word 0x275b7862 -//.word 0x95186c41 -//.word 0xff017aff -//.word 0x549b22e7 -//.word 0x3c3d70a4 -//.word 0x4e71d4bb -//.word 0x849c2d59 -//.word 0xebe2274f -//.word 0x9f44c75b -//.word 0xf70b44a9 -//.word 0xfd6a1999 -//.word 0x215f58c3 -//.word 0x2eda4139 -//.word 0x7c21130b -//.word 0x68732211 -//.word 0x01eb2ae4 -//.word 0x04a8e32e -//.word 0x0b2bd524 -//.word 0x01006e50 -//.word 0xd9a15294 -//.word 0x7f97f26c -//.word 0x0fe26073 -//.word 0x469b6229 -//.word 0x36d8c5f3 -//.word 0x3dd0f363 -//.word 0x3740c8ba -//.word 0xf30da2ab -//.word 0xe42ab762 -//.word 0x19bcacc5 -//.word 0x6f7c63fa -//.word 0x065d1429 -//.word 0xf1709f83 -//.word 0x32042083 -//.word 0xe511c473 -//.word 0xbbd7dc33 -//.word 0xaac23036 -//.word 0xe39196cd -//.word 0x05b7c3a8 -//.word 0x90016099 -//.word 0x9c7a619c -//.word 0xcb8c9215 -//.word 0x7c677258 -//.word 0x41a7456e -//.word 0x94306517 -//.word 0xc55dd90b -//.word 0x375b2885 -//.word 0xcccf6f02 -//.word 0x9ebfb246 -//.word 0xf0af70a1 -//.word 0x640a7a70 -//.word 0x6ec405e6 -//.word 0x083efd0d -//.word 0xa76a9c07 -//.word 0x6e2f3c9a -//.word 0xa20f69ec -//.word 0x5f073b8a -//.word 0x89b6e2af -//.word 0x04c283c4 -//.word 0x28784323 -//.word 0x6fb2a120 -//.word 0x71fe084a -//.word 0x13fca4ee -//.word 0xfb0876dd -//.word 0x4719a36f -//.word 0x7ee912c8 -//.word 0xc657355a -//.word 0x580927ab -//.word 0x3255f859 -//.word 0x0b62455b -//.word 0x8c8a0b89 -//.word 0xbd03bc5f -//.word 0xbebf93fe -//.word 0xb7902573 -//.word 0x11903a3c -//.word 0xe7c0da08 -//.word 0xb7efabbf -//.word 0x5ede7ac2 -//.word 0x43a11774 -//.word 0xd24866f9 -//.word 0x2cbfb33e -//.word 0x1cf34639 -//.word 0x4e363772 -//.word 0xbbe584c2 -//.word 0x6848615a -//.word 0x50b9cf08 -//.word 0x9e0970b6 -//.word 0x201f9a34 -//.word 0xf9e2aa37 -//.word 0x965a9ba1 -//.word 0xe311d702 -//.word 0xbec04c5f -//.word 0xac27c333 -//.word 0xca3d6db4 -//.word 0x0789bf57 -//.word 0x91d08096 -//.word 0x8df021f1 -//.word 0x0b0c4c33 -//.word 0x39e9bff6 -//.word 0xd6985b69 -//.word 0xea567851 -//.word 0xb5b07c4e -//.word 0xe5ebac60 -//.word 0x0ca242a9 -//.word 0x50b1bf75 -//.word 0x65528277 -//.word 0xb8869a55 -//.word 0xedb7d968 -//.word 0x8c9b29bd -//.word 0xf75b235f -//.word 0xa0f5ded8 -//.word 0x78df05f5 -//.word 0xabed2dca -//.word 0x8a7465f6 -//.word 0xc8b00e28 -//.word 0xea63ede2 -//.word 0xf9bf7e7d -//.word 0x7a868b6e -//.word 0xa070fec7 -//.word 0xbfcdf401 -//.word 0x046b12f8 -//.word 0x64ba1c37 -//.word 0xd22ec376 -//.word 0xb5e5bf61 -//.word 0x998a1e9b -//.word 0x2479dc03 -//.word 0x4c23b336 -//.word 0xc8b43455 -//.word 0xc4f41708 -//.word 0xd96bd0c2 -//.word 0x3cc96347 -//.word 0x3685786c -//.word 0xd4c3b21e -//.word 0xdf7b3da6 -//.word 0x0ed8a62b -//.word 0x7bdef079 -//.word 0x5450e401 -//.word 0xd3d1a820 -//.word 0x704993a4 -//.word 0x558a408c -//.word 0x1234e10f -//.word 0x92d5d6e0 -//.word 0x4d557fb1 -//.word 0xc0924ef6 -//.word 0x1a4720eb -//.word 0x3932cdd8 -//.word 0xd476fd93 -//.word 0xfa3e3e47 -//.word 0xbba35475 -//.word 0x25d0d038 -//.word 0x7263e5cd -//.word 0x7f177652 -//.word 0x80a073ce -//.word 0xf3d76672 -//.word 0xd217491f -//.word 0x0de79b28 -//.word 0x37d9b358 -//.word 0x7fb25337 -//.word 0xe3ca8089 -//.word 0xa0b69118 -//.word 0xed2587b3 -//.word 0xe8089c77 -//.word 0xd1f61f4d -//.word 0x76ce7eb4 -//.word 0xee9ea5c1 -//.word 0x8ac38663 -//.word 0x0952f9ec -//.word 0x0bb7c7cd -//.word 0xc99c01a1 -//.word 0x020d976e -//.word 0x39d92527 -//.word 0x1d3b1075 -//.word 0x49b9d2b6 -//.word 0x2d4d9247 -//.word 0x4cc3f8fe -//.word 0xa9623ffb -//.word 0x7bce8ca1 -//.word 0x282d7edf -//.word 0x718906b4 -//.word 0xea7579f2 -//.word 0xaef4e342 -//.word 0x50969f68 -//.word 0x15e424c8 -//.word 0x60fe2229 -//.word 0x6d83ceba -//.word 0x42b17952 -//.word 0xe3ce68fc -//.word 0xc6c6e0b3 -//.word 0x8615806a -//.word 0xdbe7d450 -//.word 0xca7e2651 -//.word 0x19d597e0 -//.word 0x06836ff4 -//.word 0x39e1b250 -//.word 0xf66ff408 -//.word 0x97746d41 -//.word 0x3ae55038 -//.word 0xb7885986 -//.word 0xd559a5a2 -//.word 0xbd2dc7a7 -//.word 0xae951857 -//.word 0xf3054e60 -//.word 0x123651df -//.word 0x47c84a23 -//.word 0x302cfcb3 -//.word 0xcac15792 -//.word 0x9c3d4ac1 -//.word 0x324fda06 -//.word 0xcd8371ec -//.word 0x5965780b -//.word 0x9fe92789 -//.word 0xbc0a9ce1 -//.word 0xd2b22be3 -//.word 0xfddaf6fd -//.word 0x89f2bdb8 -//.word 0x6283f785 -//.word 0xcb1321ba -//.word 0x534956d8 -//.word 0x0551200f -//.word 0xe0828e04 -//.word 0x873e86d1 -//.word 0x391a5d4d -//.word 0x023fa58f -//.word 0x331146ad -//.word 0x110ed1c9 -//.word 0xcaf8104f -//.word 0xad36e278 -//.word 0x99784513 -//.word 0xb69ab584 -//.word 0x64cbb50d -//.word 0x71eeab4c -//.word 0x8f40f005 -//.word 0x053b2822 -//.word 0xa4bbcff8 -//.word 0xfd6015cc -//.word 0xd133ec96 -//.word 0xc98c5f04 -//.word 0x673325c2 -//.word 0x3dc576f9 -//.word 0x5d591d16 -//.word 0x1064cfcc -//.word 0xcbdabb5c -//.word 0x5e966214 -//.word 0x6ffca915 -//.word 0x27dd2c5a -//.word 0x2b9ad6f6 -//.word 0xce8daf9d -//.word 0x85a4f466 -//.word 0x9b4f6dcf -//.word 0x259dfb02 -//.word 0x39a27157 -//.word 0x5b1ba419 -//.word 0x3855c68d -//.word 0x974aef30 -//.word 0x8c0dfd41 -//.word 0xee699e7f -//.word 0x0cc5ab34 -//.word 0x9c4bb872 -//.word 0xf44ae99d -//.word 0x7dd80729 -//.word 0x64bbd2a5 -//.word 0x928a99f9 -//.word 0xdf0f09ec -//.word 0x82f043e9 -//.word 0xcc8e3102 -//.word 0x172e1935 -//.word 0xf95772ee -//.word 0xbd7af7ce -//.word 0x13d9fbab -//.word 0x06a1fcd8 -//.word 0x2f597aa6 -//.word 0x2880092a -//.word 0x4472a641 -//.word 0x7d8c47d2 -//.word 0xae90b653 -//.word 0x034b9e8f -//.word 0xad75e6a6 -//.word 0xdad83f55 -//.word 0xe4b5f977 -//.word 0xc8631bcc -//.word 0xdb39b2fa -//.word 0xb8ae69d1 -//.word 0x7dbf5ad3 -//.word 0x379124f4 -//.word 0x9a583e9e -//.word 0xf6778bf8 -//.word 0x66e92e68 -//.word 0x4bdf9f57 -//.word 0xf8aafe34 -//.word 0xafdca8bb -//.word 0xcdaa0977 -//.word 0x4195b185 -//.word 0x424aa99c -//.word 0x42c6074a -//.word 0x1dbdc080 -//.word 0x973dbe51 -//.word 0x058f32f7 -//.word 0x4a5e2c17 -//.word 0x051a6946 -//.word 0x099f6bcb -//.word 0x0e12cfa6 -//.word 0xa60cdcd2 -//.word 0x72fb58c8 -//.word 0x95c59f44 -//.word 0x69aef64b -//.word 0x717b1c6d -//.word 0x8fd72248 -//.word 0x77f77d4d -//.word 0x647a5ac7 -//.word 0x0a933118 -//.word 0xcb699d46 -//.word 0x2dbe6bb7 -//.word 0x8ccff039 -//.word 0x0c7ca046 -//.word 0xd2a9dd85 -//.word 0x74e40d93 -//.word 0xad48ef04 -//.word 0x56a12fa5 -//.word 0x91d13804 -//.word 0x48724933 -//.word 0xd6bccbc8 -//.word 0x03a9e228 -//.word 0x36584206 -//.word 0xe6af4426 -//.word 0x52453867 -//.word 0x727ffd00 -//.word 0x2df9d00a -//.word 0xcc27623f -//.word 0xaf3c2d01 -//.word 0x3e4a079e -//.word 0x23abf8d2 -//.word 0xb7a1498d -//.word 0xb939ddf7 -//.word 0x4675c5b1 -//.word 0x05a90e5e -//.word 0xa326dd63 -//.word 0x7f16bfea -//.word 0xa6a73a2d -//.word 0x016ca8f1 -//.word 0xcd004550 -//.word 0x4cec86bc -//.word 0xbacaac41 -//.word 0x83ab9a0a -//.word 0xb3b7e327 -//.word 0xae13288e -//.word 0x2108a15f -//.word 0x3861f96c -//.word 0x12145ff8 -//.word 0x7225dabf -//.word 0xb7c8dc37 -//.word 0x0ec61b16 -//.word 0xe6219c14 -//.word 0xa4fb10f2 -//.word 0x98b464bb -//.word 0x3053944a -//.word 0x6c27c00c -//.word 0x92ae8107 -//.word 0x23b57d1b -//.word 0x0dc13988 -//.word 0x22ae2fb1 -//.word 0xc9962120 -//.word 0xf4f4acc9 -//.word 0x52092093 -//.word 0xc57f8f14 -//.word 0x164d249c -//.word 0xe8dab676 -//.word 0xea659d6a -//.word 0x51a4c586 -//.word 0x86ab011f -//.word 0x1b10a112 -//.word 0x044d464f -//.word 0x0465f599 -//.word 0x65cb6b87 -//.word 0xec7fb0cf -//.word 0x0c7aefc3 -//.word 0x5a4c851c -//.word 0x410458f7 -//.word 0xf7506a1d -//.word 0xafe5ae87 -//.word 0x11211a22 -//.word 0xe7effdcf -//.word 0x19ec93ae -//.word 0xdbc8d69c -//.word 0x25ee98fa -//.word 0x6367cfb1 -//.word 0x6ffb3072 -//.word 0xbc9aff43 -//.word 0xd4fb2537 -//.word 0x0483837c -//.word 0x5568869b -//.word 0xbf16fbfc -//.word 0x9ad225a9 -//.word 0x559d0d53 -//.word 0x6a5b1a9a -//.word 0x9134e189 -//.word 0x353b3e60 -//.word 0x244da497 -//.word 0x8a3cb11f -//.word 0x202d06eb -//.word 0xa13f55af -//.word 0x7e6ebbe8 -//.word 0xd2b6511c -//.word 0x987bfe63 -//.word 0x1c288f26 -//.word 0xaf170927 -//.word 0x9fb13dc1 -//.word 0x66d69e72 -//.word 0x227f5096 -//.word 0x45a18175 -//.word 0x8e55fc80 -//.word 0x3837fbd8 -//.word 0x710b3d10 -//.word 0x0da75934 -//.word 0x7c0d520a -//.word 0xf9d76b97 -//.word 0x05d83de5 -//.word 0x14000604 -//.word 0x8680444f -//.word 0xd82f83f0 -//.word 0x1c2c73a7 -//.word 0xa6c53dc7 -//.word 0x09981781 -//.word 0x42f81764 -//.word 0x32934425 -//.word 0x5251f39c -//.word 0xa27f5110 -//.word 0xe22c3cb4 -//.word 0x05d35771 -//.word 0xe33b5de6 -//.word 0x2e9cb5ae -//.word 0xa70347e1 -//.word 0x91f78fdd -//.word 0x665def46 -//.word 0xca994a4b -//.word 0xbdf6ce2b -//.word 0x144811f8 -//.word 0x2ad0609c -//.word 0xd35f5419 -//.word 0x91bea515 -//.word 0x0b4e4395 -//.word 0xbaeca309 -//.word 0xe6175789 -//.word 0xd155e25e -//.word 0x32d2cac4 -//.word 0xe44befee -//.word 0xe02a1a4b -//.word 0x69f3d908 -//.word 0x86de8bd6 -//.word 0xb5c6b7ed -//.word 0xde41a250 -//.word 0x86112053 -//.word 0x45bbaa5b -//.word 0x7a75b1e6 -//.word 0x3d4532cb -//.word 0x95688bc2 -//.word 0xebf18d26 -//.word 0xbfb2d2fa -//.word 0x9a5f502b -//.word 0x44f12f14 -//.word 0x3649d847 -//.word 0x52164f8b -//.word 0xd2f8c221 -//.word 0x7fe6624c -//.word 0x23cd7110 -//.word 0x40799c39 -//.word 0x02b98c9f -//.word 0x73beb8a9 -//.word 0xeec57d10 -//.word 0xd6f670e5 -//.word 0x878bf3d6 -//.word 0x8d3406ad -//.word 0x15ba6019 -//.word 0xa0e3bfb1 -//.word 0xff977c36 -//.word 0x7b406218 -//.word 0x5477c03c -//.word 0x6ddcbdfd -//.word 0x4545ec71 -//.word 0x291c20ed -//.word 0xa80282cb -//.word 0x48b8e06a -//.word 0x77404877 -//.word 0xc43fd66b -//.word 0x4fa6ca55 -//.word 0x7e91ddda -//.word 0xf270d67a -//.word 0xba645815 -//.word 0xc6ecfead -//.word 0x9ec0aa6d -//.word 0x54fd19ea -//.word 0xb683bbaa -//.word 0xc99bc2e3 -//.word 0x73de7984 -//.word 0x7852d879 -//.word 0xa8d5552b -//.word 0x56bffc47 -//.word 0x0bc3c2c1 -//.word 0x7c161718 -//.word 0xbad3badb -//.word 0xa99fd16c -//.word 0xb3893904 -//.word 0xbd331bf7 -//.word 0x5a37c03a -//.word 0x3fc4a622 -//.word 0xf888d36e -//.word 0xd9d36988 -//.word 0x36f97b08 -//.word 0xd7f81f7a -//.word 0xa65ac461 -//.word 0xab5dc67c -//.word 0x3a524047 -//.word 0x6b4322c5 -//.word 0xcbd8837d -//.word 0x517b38c2 -//.word 0x94bba538 -//.word 0x3aeed394 -//.word 0xb41bc3a3 -//.word 0x2917028e -//.word 0xafed7e5c -//.word 0xc18398b8 -//.word 0xee7b7af5 -//.word 0xce58ab4f -//.word 0x3ae2e074 -//.word 0xbccb1643 -//.word 0x4592ddd3 -//.word 0x1ea8f7b7 -//.word 0x21d22180 -//.word 0x29ce3184 -//.word 0xc73961de -//.word 0x37b0ebb6 -//.word 0x9236d6c3 -//.word 0x44d50f0d -//.word 0xc188bbf8 -//.word 0x7459cc7e -//.word 0xf8c7d2bc -//.word 0x8b6a14b0 -//.word 0xc0dae041 -//.word 0x74cc1f7f -//.word 0x027e2c2d -//.word 0xbb56e77d -//.word 0x90c6051a -//.word 0x1272aa6b -//.word 0x9d953917 -//.word 0xcfa06bc4 -//.word 0x3f259e25 -//.word 0x6cf47033 -//.word 0xf4848dba -//.word 0x0794c518 -//.word 0x1a116241 -//.word 0xe03bb807 -//.word 0x7604fd99 -//.word 0xdeb85b49 -//.word 0xaee34492 -//.word 0x09700659 -//.word 0xcf0e9f73 -//.word 0x11d8d268 -//.word 0xc8347a76 -//.word 0xc6fb1fd9 -//.word 0xecdbc74a -//.word 0x9efa0ec6 -//.word 0x74dc7990 -//.word 0x32870879 -//.word 0xfbe50a5f -//.word 0xc16935f4 -//.word 0x00f5f6c0 -//.word 0xacfc066a -//.word 0x68e43e33 -//.word 0xf8aeacc3 -//.word 0xf9d8e628 -//.word 0xcf829e1c -//.word 0xe0d17786 -//.word 0x00911744 -//.word 0x2b1e7e28 -//.word 0x7a849640 -//.word 0x50e50b5b -//.word 0xd41b5cc8 -//.word 0xa59f3361 -//.word 0xc9a9f2c9 -//.word 0xe6998ef1 -//.word 0xb496a0e1 -//.word 0xb275b9b5 -//.word 0x18dcf6e5 -//.word 0x0da7d5ca -//.word 0x1b8a475e -//.word 0xe0f80744 -//.word 0x06442908 -//.word 0x7507f6a7 -//.word 0xc6c1f752 -//.word 0xfbc3506f -//.word 0x6e4c50e1 -//.word 0x08f24589 -//.word 0xb343950c -//.word 0x12ad0ad7 -//.word 0x6f9b6e61 -//.word 0xf5e158b0 -//.word 0x1f5a451f -//.word 0x70cfea5e -//.word 0x651bc9ba -//.word 0xa88d039f -//.word 0x868e6d5b -//.word 0xa384e524 -//.word 0xecf6e75d -//.word 0xcef05b15 -//.word 0xa5a9b1d1 -//.word 0x7863308b -//.word 0xe3938bfa -//.word 0x5442b614 -//.word 0x7bb3f7d2 -//.word 0xfb464033 -//.word 0x669cbc83 -//.word 0x68fca8dd -//.word 0x42f564ef -//.word 0x7a45cafd -//.word 0xd1fabe28 -//.word 0x76d706f1 -//.word 0x79f95df9 -//.word 0x82bbc20a -//.word 0xc3d6165b -//.word 0x2bcde610 -//.word 0xdd888601 -//.word 0xe03e5fbc -//.word 0x189989cd -//.word 0x75159d3d -//.word 0x6aaac458 -//.word 0xa1aa14b3 -//.word 0xedec1d6e -//.word 0x802abeb7 -//.word 0x5ea83e8f -//.word 0x111697d1 -//.word 0x9eb81570 -//.word 0xb9c42000 -//.word 0x350c5678 -//.word 0xbedcde36 -//.word 0xca26f843 -//.word 0xcddcd8d9 -//.word 0xac9eb422 -//.word 0x75951c43 -//.word 0x4d9f8a99 -//.word 0xaaac3a42 -//.word 0xc2683be0 -//.word 0x431ac799 -//.word 0x44cbd063 -//.word 0x7bacdb7e -//.word 0xb1b21141 -//.word 0x7483931a -//.word 0x0c950fd1 -//.word 0xb094910c -//.word 0xf9059b18 -//.word 0x962a77e6 -//.word 0x4225cc54 -//.word 0xf35f70ae -//.word 0x542b7d75 -//.word 0x76a7a75f -//.word 0xc2e3cc9e -//.word 0x3346cd65 -//.word 0xc22d9da9 -//.word 0x21d49725 -//.word 0xab7a15a0 -//.word 0x9cc03e72 -//.word 0x7d531f45 -//.word 0xe3cafe19 -//.word 0x59d2ea8b -//.word 0x9b889756 -//.word 0x0526691a -//.word 0x4ae2cf5c -//.word 0x6913d2ce -//.word 0xdd96eed1 -//.word 0x14702039 -//.word 0x23b44050 -//.word 0xb8a8911d -//.word 0x502397e6 -//.word 0xaa3928f3 -//.word 0x7b1ac695 -//.word 0x63382c67 -//.word 0x20a827d4 -//.word 0x02cba7d9 -//.word 0x9e2d160c -//.word 0xc7ade8de -//.word 0xbadf741d -//.word 0x99ae02bd -//.word 0x1b4625d7 -//.word 0x81314bf2 -//.word 0xccbf9282 -//.word 0x2dacddae -//.word 0xbdfd2856 -//.word 0x6e2b1855 -//.word 0x4183d603 -//.word 0xbacd1efe -//.word 0x922c932b -//.word 0xab4556f7 -//.word 0x49a3d6e3 -//.word 0x7e5aea3f -//.word 0xe6eb1d35 -//.word 0x9568480a -//.word 0x4ed967a1 -//.word 0xf5dda541 -//.word 0x4795b997 -//.word 0xc9bd75ff -//.word 0xfe1c9cff -//.word 0xdd1ff514 -//.word 0x82c19db2 -//.word 0x24ada186 -//.word 0x47a7ccfe -//.word 0x3328be0b -//.word 0xa4483e26 -//.word 0xc3e1d291 -//.word 0x55f28cdf -//.word 0x334126b6 -//.word 0xfa4552d4 -//.word 0x03424b50 -//.word 0x96b6b022 -//.word 0x5af492e6 -//.word 0x100fccdd -//.word 0x81f99235 -//.word 0xb5ec4d8a -//.word 0x6609a6ac -//.word 0xb440e1a3 -//.word 0x1b6f6df0 -//.word 0xa1ceb916 -//.word 0x548a4959 -//.word 0xf3b008c6 -//.word 0xec4de073 -//.word 0x86d48808 -//.word 0x60bf9d7e -//.word 0x1a79f527 -//.word 0x527c30ef -//.word 0xd2b68fe1 -//.word 0x07320aed -//.word 0xb6f49ce8 -//.word 0xea25e2d4 -//.word 0x3170e462 -//.word 0x07ab33b5 -//.word 0x93ba3469 -//.word 0x91b0bbd4 -//.word 0x9038db8b -//.word 0x5d34fd28 -//.word 0xbfa3304b -//.word 0x64c8c0df -//.word 0x1c890a9f -//.word 0x45158ed8 -//.word 0x86c94670 -//.word 0xc1553727 -//.word 0x421a451d -//.word 0x3dd74b95 -//.word 0x77856bf8 -//.word 0x437fa31d -//.word 0xb0e6a1c7 -//.word 0x0144d96f -//.word 0x5d6fd444 -//.word 0xc8b1cb71 -//.word 0x5225749e -//.word 0x8e641cb9 -//.word 0x4661f6f6 -//.word 0x6d92b314 -//.word 0x555152e3 -//.word 0x23813a03 -//.word 0x7f7486ee -//.word 0x900ca038 -//.word 0x27211116 -//.word 0x3a23971e -//.word 0x9501784d -//.word 0xcc49174e -//.word 0x7490c5f9 -//.word 0x9214d91b -//.word 0x54a00375 -//.word 0xffb0dd07 -//.word 0x29d6c38e -//.word 0x285ce54b -//.word 0xca2b9a06 -//.word 0x47ebf853 -//.word 0x736ca114 -//.word 0x3845df3f -//.word 0x44bbf4e1 -//.word 0xffe4ab63 -//.word 0xc00c330c -//.word 0x40572dc8 -//.word 0x4fa80428 -//.word 0xc5c27da9 -//.word 0xbcad8f39 -//.word 0xfc5c74f7 -//.word 0xb78c003b -//.word 0x77ef32d6 -//.word 0x548a099b -//.word 0x6a5b981e -//.word 0x8a405dbb -//.word 0x3014cfda -//.word 0xb51b3672 -//.word 0xc6a0bfcc -//.word 0x15dcd08a -//.word 0x4e1a99e7 -//.word 0x4d19ec40 -//.word 0x8eb24ed4 -//.word 0xe5ba4ec8 -//.word 0x6f2a156e -//.word 0xc87d3fc6 -//.word 0x7e5ae945 -//.word 0xc6730bd6 -//.word 0x6ead091f -//.word 0x13818405 -//.word 0x94a27672 -//.word 0xc6e07e55 -//.word 0x6a4c78eb -//.word 0x5c9d513e -//.word 0x0dd219eb -//.word 0x32195a27 -//.word 0xbef0a904 -//.word 0x0e8a7af1 -//.word 0x64743980 -//.word 0x9778966d -//.word 0x09c220db -//.word 0xd84115e0 -//.word 0x59507844 -//.word 0xc2966586 -//.word 0x262aa220 -//.word 0xa7fb760c -//.word 0xe770be87 -//.word 0xbf4b3d15 -//.word 0x34d334c5 -//.word 0xa63232b6 -//.word 0x4b1c2eda -//.word 0xdcb1d3fa -//.word 0x8ea51bfb -//.word 0x449e1f5f -//.word 0x03dd2e0f -//.word 0xa6211c57 -//.word 0xd3c8dc32 -//.word 0x2d3851c8 -//.word 0xcb7d6235 -//.word 0xea334d8c -//.word 0xdea73d1b -//.word 0x4f391ef1 -//.word 0xa105b09e -//.word 0xb4c2da3a -//.word 0xcee942a9 -//.word 0xd51a1a1c -//.word 0xc2bd3ddb -//.word 0x52e57a43 -//.word 0xfe792f0a -//.word 0x2e951acb -//.word 0xaa2e6dbe -//.word 0x51f520c6 -//.word 0x0d7e8bb2 -//.word 0x06a234bc -//.word 0x1622e656 -//.word 0x7e8c0327 -//.word 0xd7631a50 -//.word 0x4b7abcf3 -//.word 0x04a18cf6 -//.word 0xe5839604 -//.word 0x78cfe2d5 -//.word 0x289648b0 -//.word 0xb1f5852e -//.word 0xd4f38f40 -//.word 0x4fac2673 -//.word 0x0cb0ac73 -//.word 0x99a636ce -//.word 0xd835e3fb -//.word 0xf8246d9b -//.word 0xa3bffdfe -//.word 0x797d44e9 -//.word 0xbee1c797 -//.word 0x4f9e7afd -//.word 0xdbfe9153 -//.word 0x4f8493cf -//.word 0x92d1b0b4 -//.word 0x73c4548b -//.word 0xe0e5fcb0 -//.word 0x58044911 -//.word 0xa21d5233 -//.word 0xc07f3f76 -//.word 0x1f2d1499 -//.word 0x1085ca80 -//.word 0x7c1fa435 -//.word 0xd2f8c02e -//.word 0x45d0edce -//.word 0x35d0bc2d -//.word 0xea70da1c -//.word 0x88989c64 -//.word 0x3f05dc4f -//.word 0xc3ef046a -//.word 0xfce96888 -//.word 0xfe08d90a -//.word 0x3b47765e -//.word 0xf72ac6c6 -//.word 0xfda2045b -//.word 0x9131ba51 -//.word 0xa54e927c -//.word 0x500b6813 -//.word 0x7bf5a3b5 -//.word 0xde3cc6a9 -//.word 0x2b14426a -//.word 0x885a8f63 -//.word 0x437b7af7 -//.word 0xc192c1c4 -//.word 0xb8d0dd29 -//.word 0x9e211f05 -//.word 0x620cfec2 -//.word 0x59dbb093 -//.word 0x7bfdf7f9 -//.word 0xcfa83e8c -//.word 0x24c3e4f8 -//.word 0x0202d846 -//.word 0xe053665d -//.word 0x977950c8 -//.word 0x17f621b9 -//.word 0x592fbe4e -//.word 0x95cb3e14 -//.word 0xb45cfbca -//.word 0x0841e967 -//.word 0x3bcb275e -//.word 0x859ed420 -//.word 0x225a24e2 -//.word 0x047bb3a1 -//.word 0xc57e1964 -//.word 0xdf46bec2 -//.word 0x1fbdf0a3 -//.word 0x57be324b -//.word 0x5433d794 -//.word 0x0f7ad07a -//.word 0x270ec3dd -//.word 0x8f635d83 -//.word 0x8411e85d -//.word 0xc335200b -//.word 0xf81442a1 -//.word 0x790267ac -//.word 0x34831070 -//.word 0xe7af0274 -//.word 0x8fdb5441 -//.word 0x2275c666 -//.word 0x803054bf -//.word 0xa7610bf7 -//.word 0x27a91c4c -//.word 0xd7d52f92 -//.word 0xc502f97b -//.word 0x73051115 -//.word 0x400aff94 -//.word 0x247a9652 -//.word 0xa0238514 -//.word 0xf593288f -//.word 0x95c4a42b -//.word 0xd7ff3206 -//.word 0xeefabb3c -//.word 0x1c44a666 -//.word 0x23e2ee60 -//.word 0xfd3b7750 -//.word 0xcc31a2e3 -//.word 0x14911fda -//.word 0x28ad02c6 -//.word 0xe247190f -//.word 0x97b17d3b -//.word 0x4a33686d -//.word 0x20ad462c -//.word 0x147d0f66 -//.word 0xeca3d3b5 -//.word 0x6c2397e0 -//.word 0xc9ab5fa5 -//.word 0x61768cb6 -//.word 0xa8706801 -//.word 0x669b0034 -//.word 0x20b13281 -//.word 0xd30b069f -//.word 0xe9c14211 -//.word 0x651338aa -//.word 0x6108e351 -//.word 0xba543202 -//.word 0x0a7fa415 -//.word 0xd64415c3 -//.word 0x0938d8e6 -//.word 0xa1ac0500 -//.word 0xa9d3147f -//.word 0x6728ab3f -//.word 0xd60ab551 -//.word 0x57a9b4fb -//.word 0xa32658ff -//.word 0x04f65020 -//.word 0xc58860e3 -//.word 0xe627b493 -//.word 0x15217487 -//.word 0xda2998a8 -//.word 0x12fafe2d -//.word 0x9e3db9a9 -//.word 0x5cadad48 -//.word 0x56795955 -//.word 0x3ae9f300 -//.word 0x0b45ba5f -//.word 0x15f388b2 -//.word 0x26dfa6eb -//.word 0xfb20e56e -//.word 0xf9d8ea15 -//.word 0x1e5bca77 -//.word 0x3694d76a -//.word 0x52a5b9c6 -//.word 0x76cec06c -//.word 0x92907887 -//.word 0xb3127e12 -//.word 0x7bc3939b -//.word 0xcf41ef46 -//.word 0xcf7ad714 -//.word 0x0b117265 -//.word 0xf303d9bc -//.word 0x908a6dc3 -//.word 0x72416d8f -//.word 0xea89c824 -//.word 0x792c2f3c -//.word 0x87416f44 -//.word 0x5850fea8 -//.word 0x3db6d350 -//.word 0x074a7b6b -//.word 0xc1406a6b -//.word 0x9f4e8f50 -//.word 0x310e2b2a -//.word 0xdca4e2d9 -//.word 0x8ba01318 -//.word 0xa22665ba -//.word 0x344ca232 -//.word 0x75c3c959 -//.word 0x72ba5e6c -//.word 0xffff0554 -//.word 0xf1674f2b -//.word 0x8e71d4fb -//.word 0x422682c9 -//.word 0x944334d2 -//.word 0x579a8614 -//.word 0x25b6e810 -//.word 0x09bef2cf -//.word 0x7c9bf823 -//.word 0x935ddd2f -//.word 0x76db2c29 -//.word 0x149a645f -//.word 0x15f19478 -//.word 0x106a28fd -//.word 0xff6a0318 -//.word 0xf015ce9b -//.word 0xfd6c8f43 -//.word 0x7db87d3f -//.word 0x7c2c13ec -//.word 0x69c663e3 -//.word 0x0f76ad35 -//.word 0xc78230f5 -//.word 0xeb2940f7 -//.word 0x8d8799d8 -//.word 0x69b8f33e -//.word 0x1940d661 -//.word 0x88aab0cb -//.word 0xa970255c -//.word 0x691ba690 -//.word 0xe2ab4505 -//.word 0xd139c737 -//.word 0x4adbfb8e -//.word 0xaac84b9c -//.word 0xcebd919f -//.word 0x829f2c4e -//.word 0x3c6152d2 -//.word 0x0b28a712 -//.word 0xcaad0f33 -//.word 0x99e3c15f -//.word 0x8edb9ec6 -//.word 0xa7e4c0e3 -//.word 0x03f65501 -//.word 0x5251aefd -//.word 0x8b61934d -//.word 0xdde5da41 -//.word 0xe7503889 -//.word 0x2b6f56f8 -//.word 0xc04d2788 -//.word 0x48547a9d -//.word 0x22b4cb8e -//.word 0xe1095f61 -//.word 0xfc3890d6 -//.word 0xc69965a8 -//.word 0xa15c650f -//.word 0x6f25ad89 -//.word 0x4afa41da -//.word 0x755fa051 -//.word 0x92bf9b4e -//.word 0x150e6601 -//.word 0xf8adf074 -//.word 0xb18e70cc -//.word 0x619840cc -//.word 0x4e4def9a -//.word 0x93aa92c6 -//.word 0x164e5a88 -//.word 0xbbdf6c49 -//.word 0xd7aaec65 -//.word 0xe8895b30 -//.word 0x830a2437 -//.word 0x8dcd71c8 -//.word 0xae2e43b4 -//.word 0x0324c253 -//.word 0x1369d2c9 -//.word 0x05dce688 -//.word 0x10231916 -//.word 0x32947b11 -//.word 0x2556a870 -//.word 0x8fc3a00b -//.word 0x7911d25e -//.word 0x02327a89 -//.word 0x54f82d9c -//.word 0xd87db212 -//.word 0xa6c2149b -//.word 0x4096f51f -//.word 0x7fba25ff -//.word 0xcd42749e -//.word 0x953ec420 -//.word 0xf89a6271 -//.word 0xc2439689 -//.word 0x9c8b78ef -//.word 0x83cf067c -//.word 0x78577462 -//.word 0x797dc36d -//.word 0xb1129588 -//.word 0xecfd4082 -//.word 0x4d252112 -//.word 0x43923319 -//.word 0xb9cfdf28 -//.word 0x8d921642 -//.word 0x449e9ee3 -//.word 0xfce9a940 -//.word 0xa1faacd1 -//.word 0x64966e0d -//.word 0x699b6075 -//.word 0xc02c2cd3 -//.word 0x970e90c4 -//.word 0xae526d74 -//.word 0x0b351ba9 -//.word 0xee440003 -//.word 0x07c46182 -//.word 0xe7507748 -//.word 0xb5c4c6a0 -//.word 0x225aaa40 -//.word 0x9e1333cb -//.word 0xcd59329a -//.word 0x34e294bc -//.word 0x39d7ef3b -//.word 0x4a365ba1 -//.word 0x5c7583bb -//.word 0x9768fc9d -//.word 0x4f64d5e6 -//.word 0x37a56f46 -//.word 0xd1ed8e3d -//.word 0x296eb125 -//.word 0xc3ea9f72 -//.word 0xd2194339 -//.word 0xaa4bb9ef -//.word 0x784ea974 -//.word 0x3192d44f -//.word 0xc88bec3c -//.word 0xa457a9e4 -//.word 0x51a119eb -//.word 0x76c5382f -//.word 0x0734c04f -//.word 0xbb1b426b -//.word 0xc13f762b -//.word 0xaf2bd003 -//.word 0xbb8e53b5 -//.word 0x2ddfaa17 -//.word 0x14427516 -//.word 0x38afe1fb -//.word 0x51517bed -//.word 0x762c46b7 -//.word 0xd8030acc -//.word 0xb079f088 -//.word 0x76764cb9 -//.word 0x54ccba5e -//.word 0xda1b6caf -//.word 0xf3f2c25d -//.word 0x18361b1a -//.word 0xc3c8ec5c -//.word 0x27620f5e -//.word 0x1ec25d68 -//.word 0x630b7e51 -//.word 0x01680042 -//.word 0x0bf2a7bc -//.word 0x8ed404dd -//.word 0xc4ac49df -//.word 0x8a355ce1 -//.word 0x14242aea -//.word 0xe04f3e2b -//.word 0xe8149284 -//.word 0x1cf9a54a -//.word 0x0f90cd48 -//.word 0xf19ecf03 -//.word 0xbd7bad43 -//.word 0xb3bcbfce -//.word 0x09100577 -//.word 0xde68bc57 -//.word 0x6f5b2f5b -//.word 0x8dc8d0ff -//.word 0x4fbd8758 -//.word 0x04974a58 -//.word 0x6b6bee4e -//.word 0x27a53dac -//.word 0x6def480d -//.word 0x0055ff76 -//.word 0x5fa6fedc -//.word 0x3c1daae7 -//.word 0x31407df6 -//.word 0xaf099e63 -//.word 0x3744b508 -//.word 0xcc38fd02 -//.word 0xa8899bb4 -//.word 0x2e5d2e0f -//.word 0x20bea711 -//.word 0x12405b8c -//.word 0x1ee35629 -//.word 0xda3af2ac -//.word 0x87cda97a -//.word 0x8bbd2858 -//.word 0x22a6a475 -//.word 0x50c971ab -//.word 0x1a6bd102 -//.word 0xf5780a76 -//.word 0x7f6cbbfa -//.word 0x6d736fbc -//.word 0xc4cf73ab -//.word 0x4d7be537 -//.word 0x420e0e57 -//.word 0x4ee1f2d1 -//.word 0xb5800000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00011D88 -//// expected output -//.word 0x6730a70e -//.word 0xd95c48d1 -//.word 0xfa1c04dd -//.word 0x32c19233 -//.word 0x7ab47f4d -//.word 0xf3c6a1e9 -//.word 0xd101c098 -//.word 0x3cceded1 -//.word 0xa10ab25f -//.word 0xe0437de2 -//.word 0x4a6f9e38 -//.word 0x48f892c2 -//.word 0x327fc7fa -//.word 0x6a0fb185 -//.word 0x4d81bf05 -//.word 0xd9733573 -//// SHA512LongMsgvector_92 -//// vector length -//.word 0x000120A0 -//// input message -//.word 0x645d2797 -//.word 0x0ccce096 -//.word 0xd082fccf -//.word 0xc1183955 -//.word 0xbad2611a -//.word 0xf0dd7c58 -//.word 0xc9d54430 -//.word 0xf28bd992 -//.word 0xac04b65c -//.word 0x66c5e4c6 -//.word 0x914d6dfd -//.word 0xb0e4140e -//.word 0xae934306 -//.word 0x75744557 -//.word 0xbc2cb57e -//.word 0x20b537e3 -//.word 0x77616601 -//.word 0x611b0dc6 -//.word 0x1ff0993d -//.word 0xa9cfce6a -//.word 0xfa8dba76 -//.word 0xaf2ce70c -//.word 0xd05dd502 -//.word 0xee43a73c -//.word 0x6e7a1dcd -//.word 0x2458c260 -//.word 0x247367d7 -//.word 0xd463cf31 -//.word 0x46c9acb1 -//.word 0xc590ca3c -//.word 0xae728b04 -//.word 0x82be9363 -//.word 0x3859c409 -//.word 0xd8036d5a -//.word 0x45dcbe12 -//.word 0x5a27802b -//.word 0x394d0300 -//.word 0xe02557b2 -//.word 0xfe72becb -//.word 0x04ae6221 -//.word 0x7e0644fe -//.word 0xa4a5757d -//.word 0x2c358837 -//.word 0x63a3471f -//.word 0x7c23a5ab -//.word 0x2875f435 -//.word 0x676658a0 -//.word 0x9d997c3e -//.word 0xe88783f1 -//.word 0xb1c54291 -//.word 0x8186ac8e -//.word 0x16608dd7 -//.word 0xb7537cfa -//.word 0xc4070a8c -//.word 0x915540cb -//.word 0x74094982 -//.word 0x1de66b2d -//.word 0x26eb3c5e -//.word 0xebd5125f -//.word 0x9ce5bb19 -//.word 0x91e36e34 -//.word 0xdd630280 -//.word 0x25475e94 -//.word 0xb38531b5 -//.word 0xc62be3f9 -//.word 0x2ca0cbab -//.word 0x132ca2f2 -//.word 0x1dba37ae -//.word 0xb2dd65a3 -//.word 0x9a1242d9 -//.word 0xcb459a42 -//.word 0x7f969c9e -//.word 0x8a5cd29c -//.word 0xeb6a5742 -//.word 0xa192448e -//.word 0xc0686b5e -//.word 0xc348488d -//.word 0x249b345f -//.word 0x2a55dc1f -//.word 0x03c2f206 -//.word 0x1283225f -//.word 0x8ad448e9 -//.word 0x3c10e07d -//.word 0xad76bdf0 -//.word 0x6c2dff3b -//.word 0xa2863fd9 -//.word 0xeb820c71 -//.word 0x64949bb5 -//.word 0x06a7ba8a -//.word 0x32630669 -//.word 0x8cac5e05 -//.word 0x0d6c972e -//.word 0x549371f5 -//.word 0x3d5cca11 -//.word 0xb5d11281 -//.word 0xcd91ff73 -//.word 0x0dd18265 -//.word 0x0aa1f98a -//.word 0x3a70a66f -//.word 0x08d360de -//.word 0x24828803 -//.word 0x1da33fcd -//.word 0x314cd697 -//.word 0x64438608 -//.word 0xcf086237 -//.word 0x3b158913 -//.word 0xee64a003 -//.word 0xc53280c9 -//.word 0x83032bac -//.word 0x69e605d6 -//.word 0x07fa41fb -//.word 0x5131993b -//.word 0xf554424a -//.word 0xec471fce -//.word 0x4f8f3508 -//.word 0x6d115fb7 -//.word 0x1a1c4239 -//.word 0x4aaa84f4 -//.word 0xdee339f4 -//.word 0xbde39ed5 -//.word 0x27bd0ae4 -//.word 0x46c02181 -//.word 0x06f94bc8 -//.word 0x27f86570 -//.word 0x91d7b6f2 -//.word 0xe77924ee -//.word 0x5e10a7cb -//.word 0xd0e2ff9f -//.word 0x0c4ca24e -//.word 0x7107f9f5 -//.word 0xbbaacb89 -//.word 0x1c70fabb -//.word 0x8f3c6d1f -//.word 0x69da4d8e -//.word 0x308874c9 -//.word 0xb1b5225e -//.word 0x4d08f2d0 -//.word 0x94a40df2 -//.word 0x15ab9e94 -//.word 0x73008661 -//.word 0xbc525008 -//.word 0xf756679a -//.word 0xfc538633 -//.word 0x89e471dd -//.word 0x91fae3b1 -//.word 0xd720c740 -//.word 0xbc03aa31 -//.word 0x5531712b -//.word 0xc12147f5 -//.word 0xba74dadb -//.word 0x697ac754 -//.word 0x7ff852e3 -//.word 0x81285b3b -//.word 0x63028ea6 -//.word 0x59bad9a7 -//.word 0xea8a23de -//.word 0x46b13b2d -//.word 0xd9bc0e19 -//.word 0x20041e73 -//.word 0xbc782f37 -//.word 0xc59c43b4 -//.word 0x60d2c9ed -//.word 0x94d91240 -//.word 0x59930445 -//.word 0xf20b12f9 -//.word 0x7db66c1c -//.word 0xc9f972d7 -//.word 0x67ec6fa2 -//.word 0x045e8465 -//.word 0xf619e2dd -//.word 0x14663c42 -//.word 0xcbd47d27 -//.word 0x6e36b6a1 -//.word 0xceeb5aab -//.word 0x0b62adc9 -//.word 0xa9dc7aec -//.word 0xe6740496 -//.word 0x4b5d403e -//.word 0x826c41f6 -//.word 0x67d6f44b -//.word 0x613a0d6d -//.word 0xf3e24190 -//.word 0x8e46b691 -//.word 0xaad1b8dd -//.word 0x15e8ad8f -//.word 0x8a294bd8 -//.word 0x85f008a4 -//.word 0x5620d27a -//.word 0x742001a4 -//.word 0x15238a91 -//.word 0xfbad7577 -//.word 0x9153913c -//.word 0x36c26697 -//.word 0xd9026b73 -//.word 0xc6fc7994 -//.word 0xbf3a807c -//.word 0x4fef7990 -//.word 0x5b379b77 -//.word 0xfa9fd2c3 -//.word 0x87e86dd3 -//.word 0xf40816f7 -//.word 0x607208d6 -//.word 0xec977c0d -//.word 0xcbad6419 -//.word 0x99af5c77 -//.word 0xeea5de09 -//.word 0x3225b5bc -//.word 0xb31ab468 -//.word 0xf4c4a7f8 -//.word 0x49008aca -//.word 0xa0caf959 -//.word 0xa200e819 -//.word 0xfb6894a2 -//.word 0xf5f5b911 -//.word 0x4c4606ab -//.word 0x3e70cec4 -//.word 0xe1fd00e0 -//.word 0xb9355917 -//.word 0x8a9cd8be -//.word 0x6bbb7343 -//.word 0x1c230859 -//.word 0x99b09655 -//.word 0xef0badd8 -//.word 0x4f7223af -//.word 0x61bc09f7 -//.word 0xda97dd85 -//.word 0x51150185 -//.word 0x4f676c60 -//.word 0xa5e8a0e4 -//.word 0x025ddc9f -//.word 0xc47a928b -//.word 0x0fa91bf1 -//.word 0x1c08aa87 -//.word 0xd4b07fdb -//.word 0x9e3d5df5 -//.word 0x758b3d38 -//.word 0x3dbd448a -//.word 0x5784f3b5 -//.word 0x739e9e0c -//.word 0xa59c1f51 -//.word 0xbce9cbd6 -//.word 0xcf08a5e3 -//.word 0x181dd258 -//.word 0x05af4d93 -//.word 0x8dacdc94 -//.word 0xc1ad435f -//.word 0xa37cb7a2 -//.word 0x3ad49598 -//.word 0xe667542d -//.word 0xf225b963 -//.word 0x68bc49f4 -//.word 0x295b0439 -//.word 0x3cbc504a -//.word 0x67613467 -//.word 0xfc1ec697 -//.word 0xf6d7e78e -//.word 0x448b2dd4 -//.word 0x65912124 -//.word 0x3522ab13 -//.word 0x0718caf2 -//.word 0xf3f588f4 -//.word 0x72272e94 -//.word 0x288bb431 -//.word 0x002f7bfb -//.word 0x7e5c3f13 -//.word 0x51d447ee -//.word 0x2858defb -//.word 0xc76d0785 -//.word 0x5a606dda -//.word 0x098899ad -//.word 0xcccb67b9 -//.word 0x8163bba7 -//.word 0x3ce27032 -//.word 0xde749189 -//.word 0xe965ccf4 -//.word 0x92e323bb -//.word 0x1804e544 -//.word 0x550bdd7b -//.word 0x93e7c976 -//.word 0xa0fc0e5a -//.word 0x2526a978 -//.word 0x33fb69bc -//.word 0x1f515b48 -//.word 0x9001865c -//.word 0xd6ead979 -//.word 0x7d3862c6 -//.word 0x22e6c1b2 -//.word 0x8681dbdb -//.word 0xe12fd32f -//.word 0x79f13650 -//.word 0x7225753d -//.word 0xe84f9930 -//.word 0x3b1832c2 -//.word 0xaa979055 -//.word 0x24d036b3 -//.word 0x5a7a8cf3 -//.word 0x1906d49d -//.word 0xd7dc5f0e -//.word 0x8ce8011d -//.word 0xc355c2fe -//.word 0xf098d667 -//.word 0x04b1d0f2 -//.word 0x3fad12c3 -//.word 0x4570886a -//.word 0x75b1960a -//.word 0x76464ebb -//.word 0x12a2e72e -//.word 0x489c6a90 -//.word 0x9c72afb0 -//.word 0xb20d8863 -//.word 0x1b863c28 -//.word 0x6fea3708 -//.word 0x9c3affc0 -//.word 0x7db66a22 -//.word 0xaf5b0fb9 -//.word 0xa0abfaac -//.word 0xe8aca4e4 -//.word 0xdd332271 -//.word 0x61629c2a -//.word 0xff700194 -//.word 0x37a8f906 -//.word 0x15b51b0a -//.word 0x091c6105 -//.word 0xf20ad81b -//.word 0x7c509c4d -//.word 0xacac04e4 -//.word 0xb94a1a13 -//.word 0x1e8a4ed8 -//.word 0xed046b23 -//.word 0x66cac93a -//.word 0xc8ecc55c -//.word 0x67426ea4 -//.word 0xff658131 -//.word 0x48ff9884 -//.word 0xca459e29 -//.word 0xf3c1869a -//.word 0x67553c60 -//.word 0x977ddc7b -//.word 0x95d42304 -//.word 0x27da2311 -//.word 0x1af43ad9 -//.word 0xd8b44419 -//.word 0x3d5b10b6 -//.word 0xa79c11a3 -//.word 0x4ca35605 -//.word 0xd156bc95 -//.word 0x18db6346 -//.word 0x595a5e29 -//.word 0x7404af8d -//.word 0x8554726a -//.word 0xb9945800 -//.word 0x61a457bb -//.word 0x45f7a05a -//.word 0x3bded250 -//.word 0xf8096d6a -//.word 0x254a89b3 -//.word 0xb69dc895 -//.word 0x77668940 -//.word 0xe7f95e50 -//.word 0x4a5fc1a9 -//.word 0xfa5802a6 -//.word 0xfe9c8474 -//.word 0xdd6629b8 -//.word 0xb4330b78 -//.word 0x87c76d38 -//.word 0xd572f163 -//.word 0x6f910bed -//.word 0x8a57b537 -//.word 0x12ce6433 -//.word 0x41183bc8 -//.word 0x71fb7f78 -//.word 0x2e9d4c40 -//.word 0x908b86bf -//.word 0xc700119b -//.word 0xf8654521 -//.word 0x48149c2b -//.word 0x3661ae47 -//.word 0x2ddb6015 -//.word 0x59cf58f1 -//.word 0xbb0eb4d2 -//.word 0x78f0fb72 -//.word 0x779953b0 -//.word 0x2a7bf532 -//.word 0xac1cdf4e -//.word 0x0d1ac82b -//.word 0xea6c5923 -//.word 0x40ea9a6c -//.word 0x8110abf8 -//.word 0xe8ffb499 -//.word 0x0ac41e69 -//.word 0xafdd0469 -//.word 0xdff9e468 -//.word 0x40009b27 -//.word 0x9f5390ba -//.word 0xcc552f31 -//.word 0xab2a9978 -//.word 0x88bf997c -//.word 0xab0adb8f -//.word 0x2c93580e -//.word 0x09331541 -//.word 0x761b0d82 -//.word 0x74196ba2 -//.word 0xa517fd88 -//.word 0x5fe5e61b -//.word 0xff389363 -//.word 0x80f2f0ea -//.word 0x4ca3db69 -//.word 0x5150d9a0 -//.word 0x58740786 -//.word 0x924554a2 -//.word 0x7438eeb9 -//.word 0xc5c7faa9 -//.word 0xf6728895 -//.word 0xb104c642 -//.word 0xb41773c1 -//.word 0xe0da974f -//.word 0x8d127279 -//.word 0x215fb284 -//.word 0xe1c1e90b -//.word 0x075a3dea -//.word 0x1476625b -//.word 0x67c8c55f -//.word 0x0ff60a60 -//.word 0xde59b914 -//.word 0xbefe34a4 -//.word 0x48f0ed0e -//.word 0x93b9d5c8 -//.word 0x4a2618a6 -//.word 0x024b07fd -//.word 0xcac75509 -//.word 0x0349878c -//.word 0x7253a6b8 -//.word 0x933e374f -//.word 0x307f6d09 -//.word 0x33289c36 -//.word 0xb9b2f1a4 -//.word 0x67f961c3 -//.word 0x0188df07 -//.word 0x3817d28e -//.word 0xc452c603 -//.word 0xb3dc61c2 -//.word 0x0194993c -//.word 0x6817259d -//.word 0x798631ad -//.word 0xec8956f4 -//.word 0x3593c922 -//.word 0x5868d3ae -//.word 0xfddd81bc -//.word 0xc7df9c44 -//.word 0xe2b7db71 -//.word 0xdb8c5847 -//.word 0xb52a4189 -//.word 0x3902d0da -//.word 0x8d717d22 -//.word 0x08457233 -//.word 0x457d3fad -//.word 0x7650cf1e -//.word 0xfb719a6e -//.word 0x34921d7b -//.word 0x93278700 -//.word 0xf56cb6bb -//.word 0x32a961cf -//.word 0xf2b49767 -//.word 0xc3b8689c -//.word 0x6936e299 -//.word 0x75493ffc -//.word 0x1a2e5c80 -//.word 0x3b036dd9 -//.word 0xc8cff0e0 -//.word 0x4bc3dff0 -//.word 0xbec02a90 -//.word 0xa0196452 -//.word 0x4899bcfb -//.word 0x78c830e3 -//.word 0x356afd9f -//.word 0xd6495ade -//.word 0x5c346591 -//.word 0x01485e4f -//.word 0x146e13f7 -//.word 0x03259b97 -//.word 0xba82478c -//.word 0x2b74d6eb -//.word 0x2e4de820 -//.word 0x8c7eb6d5 -//.word 0x56a2ff16 -//.word 0x7cbf46b2 -//.word 0x9ac83ae4 -//.word 0x15667632 -//.word 0x67f76a96 -//.word 0xb7d899dc -//.word 0xaddf064b -//.word 0x842ce887 -//.word 0x6122a5b6 -//.word 0xe3b0fee2 -//.word 0xfbd5879e -//.word 0xfe635bed -//.word 0xf8030d5f -//.word 0x4479e27d -//.word 0x59293d67 -//.word 0xe7da5abc -//.word 0x23bb3fba -//.word 0x5ea3f0a7 -//.word 0xdd9de36f -//.word 0xe5a4b38e -//.word 0x15ab1830 -//.word 0xf9e11797 -//.word 0xdb3276be -//.word 0xdc11733c -//.word 0x4475b66a -//.word 0x172183c8 -//.word 0xe929349d -//.word 0xf2b2e7de -//.word 0x65f97451 -//.word 0xfe97a2f2 -//.word 0xda039a96 -//.word 0x8c589bce -//.word 0x6d58f00e -//.word 0x33b11f0f -//.word 0xc6806471 -//.word 0x4f145da5 -//.word 0x91f4070a -//.word 0x7c23e956 -//.word 0xffa28f38 -//.word 0x1f373a3c -//.word 0x466dd6ee -//.word 0xdddc2c42 -//.word 0x1caa5933 -//.word 0x21527fab -//.word 0x40a4baa3 -//.word 0x9b0e568b -//.word 0xf2193fec -//.word 0xbc36b84c -//.word 0x76bb5052 -//.word 0x3b29122a -//.word 0x95b0fd2b -//.word 0x93f5b4b7 -//.word 0x1b127663 -//.word 0x82de4f58 -//.word 0x5a7090fa -//.word 0x8bde7ec7 -//.word 0xa64a4781 -//.word 0x75203a8f -//.word 0xd79936a1 -//.word 0xca846393 -//.word 0xca452194 -//.word 0x5a1e3e87 -//.word 0xe0ad6ca9 -//.word 0xb5b6f274 -//.word 0x7d23a1c4 -//.word 0xb4490a39 -//.word 0x8a6deedc -//.word 0xf187f605 -//.word 0xf445a47c -//.word 0x4a538ade -//.word 0x2bdaba42 -//.word 0x62477d1d -//.word 0xa44d4863 -//.word 0x202debef -//.word 0x57350c25 -//.word 0x2e86d4d6 -//.word 0x411be863 -//.word 0x7b079b26 -//.word 0xe4fe620d -//.word 0xb9178888 -//.word 0xc2d022a6 -//.word 0xe053467b -//.word 0xe6f878c4 -//.word 0xa90a65ce -//.word 0x5bced493 -//.word 0x14c1d926 -//.word 0xb2224b52 -//.word 0xe3b0797e -//.word 0x80b519d4 -//.word 0x1d4381a3 -//.word 0xdebe1a01 -//.word 0x8c9a11b4 -//.word 0xe7664f53 -//.word 0x3e0aaca8 -//.word 0x3e4d5f59 -//.word 0x089ab9c7 -//.word 0x86031437 -//.word 0xfe860630 -//.word 0xe78fda23 -//.word 0xfcbf4052 -//.word 0x90ec43ea -//.word 0x21697c72 -//.word 0x2f878569 -//.word 0x4e5bb12b -//.word 0x7bc2fa15 -//.word 0xaca33be9 -//.word 0xab74a074 -//.word 0x23005a6e -//.word 0xfb6797a1 -//.word 0xe466b14e -//.word 0x2ed8a5cc -//.word 0xe07dc872 -//.word 0x07fbb5b7 -//.word 0x4e228a98 -//.word 0xcf74543a -//.word 0x29e5c7d1 -//.word 0xd3df33c0 -//.word 0xb089b302 -//.word 0xe349a8c8 -//.word 0xe4886563 -//.word 0xd3b52c65 -//.word 0x0d8c5a03 -//.word 0xfe98debe -//.word 0x36f6ef43 -//.word 0xbe5dff8f -//.word 0xac5bea56 -//.word 0xf5e174a6 -//.word 0x8302f2c8 -//.word 0x87f84767 -//.word 0x116812f3 -//.word 0xdee72648 -//.word 0x70bc3b8b -//.word 0x64e7e355 -//.word 0x0163bf14 -//.word 0x0da9f2ae -//.word 0xe475d667 -//.word 0xcbccee04 -//.word 0x813e1c30 -//.word 0x17691420 -//.word 0x02be1173 -//.word 0x6f88c75c -//.word 0xd6299802 -//.word 0xd2a70a27 -//.word 0x30687908 -//.word 0x453a0985 -//.word 0x8597df82 -//.word 0x5226918d -//.word 0x1284dac1 -//.word 0x844593ea -//.word 0x5436deea -//.word 0xede5a55b -//.word 0x8e644375 -//.word 0xa0498032 -//.word 0x47f9c3b1 -//.word 0x372783d8 -//.word 0xc997ff3e -//.word 0x4d282f48 -//.word 0xa211fa92 -//.word 0x056ba990 -//.word 0x27f09c75 -//.word 0x82023b53 -//.word 0xecef3084 -//.word 0x6d73d44a -//.word 0x4e7ee6b2 -//.word 0x723883be -//.word 0xea4252c2 -//.word 0xc33f000f -//.word 0x2294eccf -//.word 0x946b2330 -//.word 0x9ffe8ec5 -//.word 0x9d126a29 -//.word 0xcac1f9e5 -//.word 0x9b7d7793 -//.word 0x51525044 -//.word 0xcf6b9020 -//.word 0xa8d89b4c -//.word 0x7d8f1e11 -//.word 0x86b0453a -//.word 0x6e0d2fbd -//.word 0x64e99f9e -//.word 0x6f00f411 -//.word 0x01c85bdf -//.word 0xd0f7430a -//.word 0xe14511b4 -//.word 0xe573153d -//.word 0xc98cbdac -//.word 0x896b0950 -//.word 0x457d3fa7 -//.word 0x96c8e07e -//.word 0x222cda5a -//.word 0x6ee9ff17 -//.word 0xf462b6cf -//.word 0x7621f1fd -//.word 0x911a5fe2 -//.word 0x9534e228 -//.word 0x940543c6 -//.word 0xb9dd2523 -//.word 0xdb07377e -//.word 0x524bae8d -//.word 0x0ab7f364 -//.word 0xd6a09899 -//.word 0x06e391a6 -//.word 0x3b70a18e -//.word 0x7a0a12c4 -//.word 0x8048a948 -//.word 0x55e0d913 -//.word 0x242437b5 -//.word 0x4acd2e3d -//.word 0xadf8f459 -//.word 0x4f6ebcbe -//.word 0x23282eca -//.word 0x1f131468 -//.word 0x92105635 -//.word 0xb83f28e1 -//.word 0x8b7d82d7 -//.word 0xdd2bd020 -//.word 0xa432ec84 -//.word 0x954349f3 -//.word 0xf4647124 -//.word 0xaaa8b17c -//.word 0x983d1231 -//.word 0x2bac8caf -//.word 0x305d773b -//.word 0xea5a42d6 -//.word 0x62546764 -//.word 0xffeb9e0d -//.word 0x562a52e4 -//.word 0x435151c6 -//.word 0x39d8c785 -//.word 0xd6b06d46 -//.word 0xbbccfe28 -//.word 0x9ae0eb27 -//.word 0x90694f3f -//.word 0xb6ed25d4 -//.word 0xf384b951 -//.word 0x14975c10 -//.word 0x1ee85c7a -//.word 0xe2d2336f -//.word 0xd3d3ffe8 -//.word 0x154732da -//.word 0xd6768b5e -//.word 0xe1d14510 -//.word 0x70798eb4 -//.word 0x42013a20 -//.word 0xee75b956 -//.word 0x779b46f0 -//.word 0x207862c1 -//.word 0x821681b9 -//.word 0xdb850309 -//.word 0xa9206588 -//.word 0x7811b955 -//.word 0xf81853be -//.word 0x5288c661 -//.word 0xbc920f91 -//.word 0x4cc50ffc -//.word 0x09d63f8a -//.word 0x489d9f88 -//.word 0x3661ef05 -//.word 0xb155227c -//.word 0x5c6210b4 -//.word 0xf2276be5 -//.word 0xda3ff41c -//.word 0xfcc2eee0 -//.word 0xd40ed316 -//.word 0xc4c74722 -//.word 0xaf1c4a4f -//.word 0xc34cb171 -//.word 0x9669d7c9 -//.word 0x755d9028 -//.word 0xf92a5e57 -//.word 0xda76e8b7 -//.word 0x0846a725 -//.word 0xf80ae320 -//.word 0x3cdade2e -//.word 0x57ff4f7b -//.word 0xcfb511c4 -//.word 0x842f1d73 -//.word 0x3fdcb60c -//.word 0x8ee9e3c7 -//.word 0xd007227f -//.word 0x8c6e5bca -//.word 0x0721136a -//.word 0x1574e2e4 -//.word 0x2fcc276e -//.word 0xc6a7fa0e -//.word 0xd7dc6201 -//.word 0xc023c85a -//.word 0x52d7aceb -//.word 0x27fb9768 -//.word 0x357c51ca -//.word 0xa4b553f2 -//.word 0xdd387f8f -//.word 0xe4cc0f41 -//.word 0xe7b2ccff -//.word 0x172d80b6 -//.word 0xb641ad32 -//.word 0x71ba7f42 -//.word 0xf1700017 -//.word 0xadca8bee -//.word 0x028183ef -//.word 0x85a64454 -//.word 0x98e75acd -//.word 0x3b0ef223 -//.word 0x25ca8d1c -//.word 0x14b2fca0 -//.word 0x61878819 -//.word 0xd7b97120 -//.word 0xc52d9a55 -//.word 0x523e828e -//.word 0x11027635 -//.word 0xd5ce05eb -//.word 0xc7fcb571 -//.word 0xb5ebf4c9 -//.word 0xad485198 -//.word 0xcb8ceccf -//.word 0x4fc62b8a -//.word 0xf29baf39 -//.word 0x7b8b87fd -//.word 0x8d76a355 -//.word 0xc35e8bf9 -//.word 0xff6e5106 -//.word 0xfe3bc35c -//.word 0x304be644 -//.word 0xc7d4a057 -//.word 0x0ec5b59b -//.word 0xfd0af5ee -//.word 0x0a0cb3a8 -//.word 0x4178787c -//.word 0x9742f99f -//.word 0x7ce9472c -//.word 0xaffc46c8 -//.word 0x56dd6082 -//.word 0x4ec57afc -//.word 0xc00827d0 -//.word 0xf59b1c2d -//.word 0x6bd3e5c1 -//.word 0x286fd6dc -//.word 0x4ed943d2 -//.word 0xf0a9f4a1 -//.word 0x246bd3d3 -//.word 0x59a2e8a6 -//.word 0xeb0d876b -//.word 0xf528c82c -//.word 0x67f63891 -//.word 0x58fece04 -//.word 0x9d932114 -//.word 0x9a59d717 -//.word 0x58056114 -//.word 0xd864e6e0 -//.word 0xa79f7c86 -//.word 0xb3bd9eec -//.word 0x5d69dbb4 -//.word 0xcff6cb61 -//.word 0x90a047bb -//.word 0x5515d974 -//.word 0x1b34720b -//.word 0x72145bf1 -//.word 0x1c486eeb -//.word 0xd66186b7 -//.word 0x76b534f2 -//.word 0x365fb439 -//.word 0x50871f8f -//.word 0xcbe4e1fe -//.word 0x947e6e81 -//.word 0xd0b93122 -//.word 0x718fc560 -//.word 0x071d68d3 -//.word 0xd961ad13 -//.word 0x354271d5 -//.word 0x04d00f57 -//.word 0xa1ced8ff -//.word 0xec6ebd3f -//.word 0x9a5b4fbb -//.word 0xcffceaae -//.word 0xeef82c89 -//.word 0xb0f5acde -//.word 0x73a6e97d -//.word 0xd50481dd -//.word 0x82dba4bd -//.word 0x4a89c70a -//.word 0x77029d04 -//.word 0x5d18439d -//.word 0x32fabb21 -//.word 0x20fa9b1c -//.word 0x99930679 -//.word 0xebaadce7 -//.word 0x14142e81 -//.word 0xd759f5ad -//.word 0x0fb70344 -//.word 0x446a39f4 -//.word 0x7c2bfbe3 -//.word 0x53f7e195 -//.word 0x4e11af10 -//.word 0x6d4a883e -//.word 0xff805e92 -//.word 0xba65adee -//.word 0x0b8169c5 -//.word 0xab7b357d -//.word 0x7394d517 -//.word 0x7174e611 -//.word 0x3b29cc8b -//.word 0x836dedaa -//.word 0xec271d3a -//.word 0x1c355897 -//.word 0x1369b7cd -//.word 0xbbd19dfe -//.word 0xc03c3104 -//.word 0xa1f91258 -//.word 0x08e24632 -//.word 0x579a73f2 -//.word 0x831251bf -//.word 0x25525f6e -//.word 0xce76d5a5 -//.word 0x9bf6da40 -//.word 0x0a2bf8f3 -//.word 0x0c0fcd31 -//.word 0x5c45034d -//.word 0x0e5982e0 -//.word 0x6b48e36a -//.word 0xfc43283c -//.word 0xe5b0ab95 -//.word 0x7572550b -//.word 0xfa6a102c -//.word 0xda3d7f66 -//.word 0xdf58ec24 -//.word 0xd332823a -//.word 0x4dd1bc83 -//.word 0xca901dc8 -//.word 0xff1f22e4 -//.word 0x6ecb7526 -//.word 0x380063f7 -//.word 0x320c90bd -//.word 0x3a25e9ff -//.word 0xccaedbc9 -//.word 0xd0b6c252 -//.word 0xb6c2a5dc -//.word 0xc5cc20dc -//.word 0xb08ba15b -//.word 0x6bf5d89c -//.word 0x3c0368ff -//.word 0x15b4e325 -//.word 0x2154f555 -//.word 0x9dfedf1e -//.word 0xe960273e -//.word 0xdfbe8ec3 -//.word 0x63394370 -//.word 0x3b525662 -//.word 0x22aa6ff4 -//.word 0x170bc0df -//.word 0xfbac38a6 -//.word 0x5bb1fa31 -//.word 0x8bf20db7 -//.word 0xf4fd55e2 -//.word 0xae5ec22e -//.word 0x521ec793 -//.word 0x09890e63 -//.word 0xe9346a75 -//.word 0x823f0d83 -//.word 0xb3d8fbd1 -//.word 0xc300be0f -//.word 0xac925b81 -//.word 0xba81865d -//.word 0x55611275 -//.word 0x1b29ab15 -//.word 0x3337c72f -//.word 0xdd94dab5 -//.word 0x4d7ac947 -//.word 0xb913a20e -//.word 0xb1848ae8 -//.word 0xaf2af7c5 -//.word 0xef231f51 -//.word 0x8011b0d3 -//.word 0x9c1ac154 -//.word 0x35340805 -//.word 0xd09f4edb -//.word 0x96b2217c -//.word 0xa8dbc95e -//.word 0xb4e27d2d -//.word 0xc66dd66e -//.word 0x60c98363 -//.word 0xcce73f2e -//.word 0xb1a50038 -//.word 0xe54f71d4 -//.word 0x8266a320 -//.word 0x3ca0ff2c -//.word 0xf12f805f -//.word 0x82461f16 -//.word 0xe2da8e8d -//.word 0x6ca62803 -//.word 0x7a712919 -//.word 0x33931a7c -//.word 0xa4b690c3 -//.word 0x13da169b -//.word 0x8f9c6821 -//.word 0xccb7e28f -//.word 0x2ecb371b -//.word 0x245d661c -//.word 0xb71fea6f -//.word 0x63723119 -//.word 0x252a502d -//.word 0xd591f5f1 -//.word 0xb6ae9d3c -//.word 0x4cc70722 -//.word 0x6d24e8d3 -//.word 0x9b16e0c1 -//.word 0x9138ad01 -//.word 0x1cf59ff4 -//.word 0x2c4a4b26 -//.word 0x2bcd8476 -//.word 0x8def8778 -//.word 0xa97e7617 -//.word 0xc76e087f -//.word 0x7ad87e3a -//.word 0x3043d998 -//.word 0x07234a55 -//.word 0xe29fea76 -//.word 0xbd97ab74 -//.word 0x3de68e9c -//.word 0x8be417b6 -//.word 0x632fffe5 -//.word 0x68ac28ce -//.word 0xbbc8d6fc -//.word 0xcb041b83 -//.word 0x6fb093e4 -//.word 0x32f65231 -//.word 0xed1b1b72 -//.word 0x9c02d246 -//.word 0x6af234ce -//.word 0x0e98c6c6 -//.word 0x5a500bf5 -//.word 0x11a0fac8 -//.word 0xfa05af3a -//.word 0x32f361f6 -//.word 0xc61794c0 -//.word 0x81df9011 -//.word 0x033c1101 -//.word 0x13a7406a -//.word 0x3762e24b -//.word 0x8100d06a -//.word 0xab27a73e -//.word 0x6795c00b -//.word 0xf061634f -//.word 0xe583375d -//.word 0x5797fd48 -//.word 0x21de7e02 -//.word 0x7786c2c5 -//.word 0xc22b83b2 -//.word 0xab9de1b9 -//.word 0x76e458b8 -//.word 0x9281eee7 -//.word 0x6ef7b173 -//.word 0x8e8a6069 -//.word 0xdd4769d6 -//.word 0x4544132d -//.word 0x7d29fde8 -//.word 0x22efc772 -//.word 0x0ae80f45 -//.word 0xd5009f4f -//.word 0xc442e49b -//.word 0xcf9ea32d -//.word 0xf1e9e72e -//.word 0xc7253e49 -//.word 0x59032454 -//.word 0x38a6c033 -//.word 0xc9aacef9 -//.word 0xe065dd51 -//.word 0x906cba1d -//.word 0x42592c5c -//.word 0x05cce151 -//.word 0x25b0a9e2 -//.word 0xffc0e23e -//.word 0x134933c2 -//.word 0x5b317e1e -//.word 0xdc380fb3 -//.word 0x7a7e1a40 -//.word 0x104664be -//.word 0xc0f94088 -//.word 0x886ebdbf -//.word 0x16681eed -//.word 0xde608ae8 -//.word 0x698505fa -//.word 0xf0029f3e -//.word 0x297feb4d -//.word 0x61eab31a -//.word 0xcb77ea1b -//.word 0x18e5e2aa -//.word 0x4704c0aa -//.word 0xbf742c6d -//.word 0x9baf4dd5 -//.word 0x4549f4ba -//.word 0x4677178c -//.word 0x5ccf823a -//.word 0xcd4ec952 -//.word 0xfc9f8169 -//.word 0x3a9aafbd -//.word 0xde0c8119 -//.word 0x98b63cf9 -//.word 0x029876ef -//.word 0x786f8545 -//.word 0x2a7c37e4 -//.word 0x6f87c474 -//.word 0x5d2400c5 -//.word 0x9635d56e -//.word 0x64b0f1b4 -//.word 0x09a2bcad -//.word 0x50748da5 -//.word 0x686d1dc0 -//.word 0xf2793ce1 -//.word 0x5929c2cb -//.word 0x62fac986 -//.word 0x04da1905 -//.word 0x79e8e405 -//.word 0x957cb438 -//.word 0x5767a1a3 -//.word 0xbe7cc744 -//.word 0xdd4ff7f9 -//.word 0x323cad9d -//.word 0x34ab4274 -//.word 0x2b9363c9 -//.word 0x443dc2d5 -//.word 0xe54b0be3 -//.word 0x3ef81ab2 -//.word 0x21a16b1b -//.word 0x1385d2f3 -//.word 0xa3c96c33 -//.word 0xfabfd556 -//.word 0xb4679b03 -//.word 0xee36f3ec -//.word 0xa017abf6 -//.word 0x2eb0609a -//.word 0x39e6f18b -//.word 0xbba33399 -//.word 0x53d6e7d5 -//.word 0xddbce9f6 -//.word 0x465faafb -//.word 0x9e5cdf12 -//.word 0x6fe87bb9 -//.word 0x4e15db23 -//.word 0xaf5241dd -//.word 0xfe3184b1 -//.word 0xeb6e06cb -//.word 0x052ce51a -//.word 0x8a8176f9 -//.word 0x7d35ef0f -//.word 0xfac76373 -//.word 0xc7b1f414 -//.word 0x2bed4459 -//.word 0x03b82c04 -//.word 0x1296b15c -//.word 0x9996338b -//.word 0x27d7e845 -//.word 0xb34b89aa -//.word 0xe8bb4b6e -//.word 0xc00c1137 -//.word 0x54c0e046 -//.word 0xf3c0935a -//.word 0x7158d0d1 -//.word 0xc1833a11 -//.word 0xc669e826 -//.word 0x672617ac -//.word 0xe2cd1bf0 -//.word 0x62ac9c52 -//.word 0xd3d2feee -//.word 0xf5cf217b -//.word 0xafbb4b72 -//.word 0xa77a6273 -//.word 0x0f3d5fe6 -//.word 0xc24cffde -//.word 0x8f04bb42 -//.word 0xd41bfb2e -//.word 0x4f2c8797 -//.word 0x326f3e2e -//.word 0x75c70a87 -//.word 0x7003137b -//.word 0xa95d33cb -//.word 0xeb47ab05 -//.word 0x986814ac -//.word 0x3fe19893 -//.word 0x71d4618a -//.word 0xd127523c -//.word 0x6b85f558 -//.word 0x47a6b5ef -//.word 0x3dd14e1e -//.word 0x0a9f81ec -//.word 0xa4010c75 -//.word 0xcb84d949 -//.word 0xe1d4760f -//.word 0xfb7fc56e -//.word 0x38fcf52d -//.word 0x52ecb098 -//.word 0x729f9626 -//.word 0x49daeb5a -//.word 0x5cd88ce7 -//.word 0x9f8e2817 -//.word 0x4634ac6d -//.word 0xd800ff8a -//.word 0x8535f04d -//.word 0xb95c6d3e -//.word 0xf1d1f52d -//.word 0xce824f16 -//.word 0x67f47d48 -//.word 0xe487ecc6 -//.word 0x49faedee -//.word 0x8f316958 -//.word 0xf936cf01 -//.word 0xa57f52a9 -//.word 0x626f5279 -//.word 0xc11e17e9 -//.word 0x6f5dc5e1 -//.word 0xc1f58c1e -//.word 0x913020d8 -//.word 0x499b69a2 -//.word 0x3d097b91 -//.word 0x3edbc8a0 -//.word 0x6b7f9453 -//.word 0x4b37aa9b -//.word 0x191c4efa -//.word 0x5f6272e7 -//.word 0xc7dd2d74 -//.word 0x2dc4682e -//.word 0xf8b6db45 -//.word 0xabfa38ed -//.word 0xb70ba503 -//.word 0x945470f4 -//.word 0x0f38fedb -//.word 0xe65505e9 -//.word 0x920afb0a -//.word 0x6436cfc5 -//.word 0xd343d664 -//.word 0x15640856 -//.word 0xec1a6cd1 -//.word 0xc3fdd1bc -//.word 0xf9b9bfcb -//.word 0x7d57adec -//.word 0x9bbe74e2 -//.word 0x1579042f -//.word 0x76ba5638 -//.word 0xa39fa2a4 -//.word 0xb3b5d105 -//.word 0x00bb35ba -//.word 0x7ea87814 -//.word 0x4cefd2b7 -//.word 0x89017f43 -//.word 0x69137134 -//.word 0x88224207 -//.word 0x7e356c9f -//.word 0xb3e3bce6 -//.word 0x751404b7 -//.word 0x470c11fc -//.word 0x7ca5dc13 -//.word 0x05db0477 -//.word 0x888e7c9c -//.word 0xb284811a -//.word 0xcdaed00e -//.word 0x95ac15bd -//.word 0x4792a67b -//.word 0xfced71cc -//.word 0x350134c8 -//.word 0xb755ecc4 -//.word 0x99728f2e -//.word 0x9be7fdb9 -//.word 0xb99034ba -//.word 0x0018c4d2 -//.word 0xa1bd84ce -//.word 0x445382cb -//.word 0x9e8c409e -//.word 0x46761d73 -//.word 0xc44511b3 -//.word 0xeb539d2c -//.word 0x6a65026c -//.word 0x9d30b26d -//.word 0xa91c0478 -//.word 0xc7472b43 -//.word 0xe0cd695d -//.word 0x5b4780cb -//.word 0x33916af4 -//.word 0x4cd149ba -//.word 0x07b4a1ea -//.word 0x14fbc5d6 -//.word 0x87378f40 -//.word 0x2ed0547a -//.word 0x224c17cc -//.word 0x9dcefd16 -//.word 0x0bdd01b6 -//.word 0x6467e9ac -//.word 0xb80679fc -//.word 0x0c81e654 -//.word 0x64968eef -//.word 0x21f7e5b9 -//.word 0x8d92b3b4 -//.word 0xb5157d9a -//.word 0x77b240c4 -//.word 0xdb20664a -//.word 0xa7e2f26c -//.word 0x2dcbfe31 -//.word 0x68c2674d -//.word 0x47c3c748 -//.word 0x4926a3dd -//.word 0x4a24e6a1 -//.word 0x9d978ee5 -//.word 0x5a01a6dc -//.word 0xf9d07401 -//.word 0x20e0f3b3 -//.word 0xba428422 -//.word 0x493ce06f -//.word 0x7d90510f -//.word 0x05012271 -//.word 0xa51453e0 -//.word 0x891492aa -//.word 0xd9586782 -//.word 0x8dc9af23 -//.word 0x839e4b36 -//.word 0xce6a1976 -//.word 0x52592312 -//.word 0x8eb61752 -//.word 0xb8b1f87e -//.word 0x0f6012fc -//.word 0x6d0333b8 -//.word 0x1b8c18c9 -//.word 0xea5f2651 -//.word 0x7f565ba4 -//.word 0xef0883ad -//.word 0x8c4baf8e -//.word 0xfef7e387 -//.word 0x95ed0f19 -//.word 0xdd58406b -//.word 0x733318ec -//.word 0x180c7c3a -//.word 0x04078c43 -//.word 0x7c25d8aa -//.word 0xa7c6d06c -//.word 0x9e6d7dc3 -//.word 0xc2c46f4a -//.word 0x52e0f762 -//.word 0x3dc596d5 -//.word 0x342db4ba -//.word 0x04859599 -//.word 0x23398acf -//.word 0x88316433 -//.word 0xc09c2ef9 -//.word 0x3fec1cd7 -//.word 0xf421be67 -//.word 0x204b79cd -//.word 0x674a3899 -//.word 0x28d95fef -//.word 0x0acb01e5 -//.word 0xd793522c -//.word 0x8e0a5ff3 -//.word 0xb36dfc08 -//.word 0xeaa5fe40 -//.word 0xc4ccab1a -//.word 0xd9ec6f9f -//.word 0x170ad18c -//.word 0x5963a4b3 -//.word 0x3bf5829f -//.word 0x2d417677 -//.word 0xc750f924 -//.word 0x5df420b6 -//.word 0xd2501304 -//.word 0xb19ac193 -//.word 0x7920d2ba -//.word 0x3989dd03 -//.word 0x5d5edcd3 -//.word 0xc8c9dd4e -//.word 0x239cfa75 -//.word 0x74948a91 -//.word 0xf2e099d5 -//.word 0x18dd963f -//.word 0xf8244cbf -//.word 0xd2c6149b -//.word 0xe5d64812 -//.word 0x8528fa40 -//.word 0x6e59e641 -//.word 0x580fa699 -//.word 0xcb8225d3 -//.word 0x353c5669 -//.word 0x3a1d26e4 -//.word 0x4ba1af44 -//.word 0x7a66aea2 -//.word 0x8ce83714 -//.word 0x508fa7d1 -//.word 0x30eddb96 -//.word 0x06409f48 -//.word 0x313f69da -//.word 0xe7134871 -//.word 0xcca317c6 -//.word 0xc414f6cc -//.word 0x0690fb94 -//.word 0x7347246d -//.word 0x25b4904f -//.word 0x4a22ef7a -//.word 0x336e385a -//.word 0xa80e9aae -//.word 0x7f52b4e9 -//.word 0x6dea08d8 -//.word 0x1ba9ad86 -//.word 0x7c89455d -//.word 0x5fee2f8d -//.word 0x402ffeb2 -//.word 0x645229b1 -//.word 0x251703e2 -//.word 0x8a39ee75 -//.word 0x1af0cc0e -//.word 0xf2bab7b3 -//.word 0x165bf2e8 -//.word 0x05221f18 -//.word 0x906fb237 -//.word 0xeb72a5a6 -//.word 0x05356e57 -//.word 0x15dd2e31 -//.word 0x752d2bb6 -//.word 0xb44b80e3 -//.word 0xe7c71357 -//.word 0x3fd9c8b8 -//.word 0xe1eaf453 -//.word 0xf1561502 -//.word 0xf071c053 -//.word 0x49c8dae6 -//.word 0x26a90b17 -//.word 0x88e570dd -//.word 0x97d490f2 -//.word 0x379a9235 -//.word 0xdba9ad4c -//.word 0x9e87df8d -//.word 0x90d2e21f -//.word 0x4d815c5c -//.word 0xd56c567a -//.word 0x970fef6b -//.word 0xcf8a5101 -//.word 0x12ede556 -//.word 0x27b3c36b -//.word 0x198c6d0f -//.word 0x8a60bc03 -//.word 0x4a901a5b -//.word 0x297ff227 -//.word 0x09516553 -//.word 0x37f23fcc -//.word 0xfb5a29e4 -//.word 0x6d1020f8 -//.word 0x8bed2550 -//.word 0x89233646 -//.word 0x687e7eab -//.word 0xcae9c966 -//.word 0x05333a5e -//.word 0x7613409b -//.word 0x186ac6a8 -//.word 0x54c9aa3b -//.word 0x1b337117 -//.word 0x33243932 -//.word 0xced1ee13 -//.word 0x61b2c17f -//.word 0xb33ed654 -//.word 0x35f63db5 -//.word 0x91a42467 -//.word 0x85e54b7b -//.word 0xf2e5b82e -//.word 0x306aab0d -//.word 0xa514d45d -//.word 0x96e3c4b9 -//.word 0x3cf9a2fd -//.word 0x1ba11f63 -//.word 0x8f91abec -//.word 0xa86cea02 -//.word 0x378b615b -//.word 0x29fd7620 -//.word 0x14cc974f -//.word 0x1082b95e -//.word 0xc8ec0421 -//.word 0xd11ecced -//.word 0x3ab7c4fe -//.word 0x64676e16 -//.word 0x13aed667 -//.word 0xc6e680b3 -//.word 0x44839fb2 -//.word 0x789a87b4 -//.word 0x7ea06587 -//.word 0xfe752e9b -//.word 0xb9a0d564 -//.word 0x61ddc100 -//.word 0xaed57e1a -//.word 0xae2cb30e -//.word 0x5dc0544d -//.word 0x75301804 -//.word 0x879c2ef8 -//.word 0x4bac2cb4 -//.word 0x35d448e7 -//.word 0x48d6ca08 -//.word 0x2f88c13b -//.word 0x8ad7f578 -//.word 0x860c1eea -//.word 0xb04e5395 -//.word 0x0b68c53c -//.word 0x5fcdad82 -//.word 0xd5d9834f -//.word 0xc15a7175 -//.word 0xbf4f0794 -//.word 0x01f0303b -//.word 0xe7ee654f -//.word 0xd0fb20b1 -//.word 0x318d941b -//.word 0xe4df9b4b -//.word 0xc239f064 -//.word 0x73729e91 -//.word 0x85b3b8eb -//.word 0xbc7d4b9d -//.word 0xa9ee9145 -//.word 0x7e40679e -//.word 0x2192015d -//.word 0x7febdd58 -//.word 0x237cf5ed -//.word 0x072539a2 -//.word 0xaa3b3c09 -//.word 0x62892ee7 -//.word 0xf4940a94 -//.word 0x622410a5 -//.word 0x04ff76c9 -//.word 0xdaf85bf1 -//.word 0x2128fcb4 -//.word 0x247c2af1 -//.word 0x5570fcb6 -//.word 0x9c19c160 -//.word 0xef693804 -//.word 0x23af040e -//.word 0x025d5a28 -//.word 0x9d0efd5e -//.word 0xe4c76c7f -//.word 0x737d59c6 -//.word 0xafd85eb9 -//.word 0x1237ec52 -//.word 0xc3f4845d -//.word 0x6ae92921 -//.word 0x42331542 -//.word 0x7035abe6 -//.word 0x93e0ad17 -//.word 0x9c32af69 -//.word 0xe0fdcbdc -//.word 0x6bea9703 -//.word 0x97bd5466 -//.word 0xdedb6826 -//.word 0xed090fdf -//.word 0xf9764dd2 -//.word 0x56fc2744 -//.word 0x46a31221 -//.word 0x0f67ace5 -//.word 0x503baabc -//.word 0x944d11e8 -//.word 0x288caa64 -//.word 0x2a68afc7 -//.word 0xe3d8cb6a -//.word 0x57a242cd -//.word 0x19d76b37 -//.word 0x649c679d -//.word 0x68300dc5 -//.word 0xe22b24ac -//.word 0xef04d524 -//.word 0x22d65fc1 -//.word 0xd4640df6 -//.word 0xbb5a667c -//.word 0xbfd6a3f3 -//.word 0x082666cc -//.word 0x5cd4a866 -//.word 0xa8dff377 -//.word 0xdc4cd2ae -//.word 0xfcdd8797 -//.word 0x7421fbbe -//.word 0xadadfb17 -//.word 0xdda8a09d -//.word 0x238d0f3a -//.word 0xd32c63e7 -//.word 0x0ff2e814 -//.word 0x976b8a4a -//.word 0xe1058d0f -//.word 0x6d177e0a -//.word 0x53216967 -//.word 0x1e564c7d -//.word 0xdc57ccae -//.word 0x7642278f -//.word 0x3eeb6a49 -//.word 0xc769e440 -//.word 0xf9d5daf2 -//.word 0x644e7c21 -//.word 0xd5401834 -//.word 0x27e68edb -//.word 0x5c0e04f2 -//.word 0xed1ddaa8 -//.word 0x5d52e0e0 -//.word 0x144fc7d7 -//.word 0x6bd5d607 -//.word 0x04cfde4c -//.word 0x5c927046 -//.word 0xa3634dfe -//.word 0xcb391ecc -//.word 0xdfc56678 -//.word 0x96b0b49f -//.word 0x28241d58 -//.word 0x608de918 -//.word 0xf2a18dd3 -//.word 0x109eda64 -//.word 0x38d2732f -//.word 0x50618405 -//.word 0xf443b148 -//.word 0x0f8c4d4f -//.word 0xa8f0cd0b -//.word 0xff867ceb -//.word 0xd9cc70fe -//.word 0x18ecbc58 -//.word 0x8e3de7b6 -//.word 0x130d9d65 -//.word 0xd59ea55f -//.word 0xf06e13b8 -//.word 0x3fbbbf38 -//.word 0x7147f54a -//.word 0x5f596e14 -//.word 0x9c047fe8 -//.word 0x4eab91db -//.word 0x3dc5d1b3 -//.word 0x2ade2907 -//.word 0x62de6ea1 -//.word 0x938edb27 -//.word 0xdd58befb -//.word 0x2c4f715f -//.word 0xc66f8cdd -//.word 0x202559e6 -//.word 0xf61288b9 -//.word 0x9a0c2486 -//.word 0x8d65c6d3 -//.word 0x4c700920 -//.word 0x6c423dc6 -//.word 0xe9b66025 -//.word 0xbcb44afe -//.word 0xabb2271e -//.word 0x657a2a3d -//.word 0xce2e8025 -//.word 0x988a8317 -//.word 0x136a316a -//.word 0x468cdc75 -//.word 0x3e9622af -//.word 0xa65b2015 -//.word 0x985ae3cc -//.word 0xb3871f08 -//.word 0x6e4f242c -//.word 0xabd60d33 -//.word 0x90833b4e -//.word 0x92be02ce -//.word 0xd2f8a145 -//.word 0xadec78e8 -//.word 0x8e257538 -//.word 0x07c1d0e2 -//.word 0x2174f8e3 -//.word 0xf0d0cdef -//.word 0x6ac30f14 -//.word 0x7961169b -//.word 0x4ee3c42f -//.word 0xf9f0b941 -//.word 0x361cc5aa -//.word 0x8aafa392 -//.word 0x8fa7e491 -//.word 0x8c002915 -//.word 0x49329504 -//.word 0x22fc82a2 -//.word 0x596073b4 -//.word 0xb1ef4ae6 -//.word 0x3846bc6a -//.word 0x64d901e2 -//.word 0x61efd080 -//.word 0xaaee8a6b -//.word 0xd7d9b665 -//.word 0xb517adac -//.word 0x9c76961d -//.word 0xfd6f959f -//.word 0x3bac40bf -//.word 0xbcc75398 -//.word 0x3f55a4f6 -//.word 0x702359bb -//.word 0xb9bf5881 -//.word 0x5c3aff80 -//.word 0xbf2d16b2 -//.word 0x06fa0136 -//.word 0xe7543af3 -//.word 0xba02ff7d -//.word 0xd0df483c -//.word 0x0626fccb -//.word 0x9aec649e -//.word 0x3deee0e8 -//.word 0x698dd9bb -//.word 0xf417f671 -//.word 0xe648934c -//.word 0x88116f59 -//.word 0xbd97a49a -//.word 0x957fdd63 -//.word 0x2069c305 -//.word 0x80bab8aa -//.word 0x429fc880 -//.word 0xef4fdc1a -//.word 0xdd903113 -//.word 0x4b7c09f4 -//.word 0xad85a157 -//.word 0x45b7624d -//.word 0xf33d5bfe -//.word 0x4e27ef8f -//.word 0xf36acb49 -//.word 0x1e281cf7 -//.word 0x7732fe8f -//.word 0x2ecc3715 -//.word 0x49b025bd -//.word 0x3d55f550 -//.word 0xbc7016d0 -//.word 0xcfbced5f -//.word 0x24f6cb5d -//.word 0xa92c1cd1 -//.word 0x5a38e10a -//.word 0x56886086 -//.word 0x39201912 -//.word 0xa6e1fd33 -//.word 0x230bdbc5 -//.word 0x2a011be2 -//.word 0x7c4cae05 -//.word 0xb9e3456f -//.word 0x2ea9c1ca -//.word 0xee38eb0d -//.word 0x24dd669f -//.word 0xa7e3e2bf -//.word 0xcf159123 -//.word 0x887edfdf -//.word 0xa4735e89 -//.word 0x76d4ff9b -//.word 0x9c8e8818 -//.word 0x1c644273 -//.word 0xb3f0f2ac -//.word 0x69e40bbc -//.word 0x69962233 -//.word 0x10bca220 -//.word 0x4473c131 -//.word 0x0787b31b -//.word 0x4bee1d3c -//.word 0x0895cc7f -//.word 0x8d60a781 -//.word 0x146ce2f2 -//.word 0x9897753d -//.word 0xeb42cd6b -//.word 0x0355c144 -//.word 0x9484c7b8 -//.word 0xe5d1687e -//.word 0xdc52f1fb -//.word 0x5a356c65 -//.word 0xcf01ce28 -//.word 0x051e7289 -//.word 0x4098c689 -//.word 0x8920450c -//.word 0x4754a53a -//.word 0x0f405126 -//.word 0xbd2419ad -//.word 0xc47728a2 -//.word 0xc22d3728 -//.word 0x5836015e -//.word 0x3847f742 -//.word 0x7fdc34cf -//.word 0x467eb369 -//.word 0x7341c07b -//.word 0xd592ac5f -//.word 0x712fc57e -//.word 0x167785b8 -//.word 0x38e40a06 -//.word 0xfbd6c65d -//.word 0x8d9278d6 -//.word 0xb98a5b0d -//.word 0xb9df9dc6 -//.word 0x4c2412d7 -//.word 0x09652a42 -//.word 0xf36721a1 -//.word 0x4d3275c7 -//.word 0xb0cd9da4 -//.word 0x5a49f869 -//.word 0xc90004ed -//.word 0x891fd04f -//.word 0x4a62b4de -//.word 0x351f3f35 -//.word 0x808671aa -//.word 0x40272aea -//.word 0x7fb5e3dd -//.word 0x8f099cd0 -//.word 0x9d6915d2 -//.word 0x890b415e -//.word 0xf6d5f83b -//.word 0x9d67eca1 -//.word 0xe65bde9d -//.word 0xb9cb12b6 -//.word 0x911400d1 -//.word 0xd3da4c52 -//.word 0x5f4df884 -//.word 0x64aad93b -//.word 0x780447b8 -//.word 0xe84419cc -//.word 0x4c6fd141 -//.word 0x5f271375 -//.word 0x0e755c48 -//.word 0xcfc5f038 -//.word 0x343214cb -//.word 0xc0047e2e -//.word 0xf9770a1b -//.word 0xbebfaeff -//.word 0xdb48b05d -//.word 0xdb42166d -//.word 0x1e5d5f0a -//.word 0x2bd170cb -//.word 0x46a2d16f -//.word 0x4622197e -//.word 0xa1b7a72d -//.word 0xc9de9382 -//.word 0xbb70e4ba -//.word 0xd42504e8 -//.word 0xe75671de -//.word 0x8e07b450 -//.word 0xbd249737 -//.word 0x9d0b9374 -//.word 0x974b88b6 -//.word 0xaeabb19d -//.word 0x136fd620 -//.word 0xf3d6c32c -//.word 0x94e7fa8d -//.word 0xa06da512 -//.word 0xc141ceec -//.word 0x6dc7d258 -//.word 0x04bb137e -//.word 0x182eee98 -//.word 0x0bcbed56 -//.word 0xe05f3d81 -//.word 0x4b9962e0 -//.word 0x0a0e2958 -//.word 0x787fde56 -//.word 0x605fc072 -//.word 0x0f90b24c -//.word 0xad6e33ba -//.word 0xcd0e9026 -//.word 0x42c75831 -//.word 0x34f2119c -//.word 0x74ef2969 -//.word 0x0d69303d -//.word 0x1cda4409 -//.word 0xe151cce9 -//.word 0x1573694d -//.word 0x7ebf2956 -//.word 0xc217fe83 -//.word 0x797c6f8c -//.word 0x851a8e8e -//.word 0xa6842a69 -//.word 0x49404566 -//.word 0xa186c81e -//.word 0xf9457697 -//.word 0x49671faf -//.word 0x075616be -//.word 0x3fbfe577 -//.word 0xe6963e0f -//.word 0x6c5a35a2 -//.word 0x909aadd2 -//.word 0x78b810b1 -//.word 0x01ed44e1 -//.word 0x548ddaf9 -//.word 0xba8c882b -//.word 0xb142d924 -//.word 0x3f6b2334 -//.word 0x8672baaf -//.word 0x99ef6393 -//.word 0x8e6e0b6a -//.word 0xd472b972 -//.word 0xc7b9c2fc -//.word 0x82c23c12 -//.word 0xf48db45c -//.word 0x37a22445 -//.word 0x1c541f59 -//.word 0x0b474ff1 -//.word 0x0a302113 -//.word 0x1bdcbf94 -//.word 0xcb743f7f -//.word 0x08ff19bb -//.word 0x3328dfe7 -//.word 0x76412889 -//.word 0x5889ce68 -//.word 0x8eaa5936 -//.word 0x1486ba72 -//.word 0x7d333d8d -//.word 0x8844b94c -//.word 0xf34b096d -//.word 0x949cc08d -//.word 0xa5531949 -//.word 0x60982da4 -//.word 0xcc2169a8 -//.word 0xd6f93e51 -//.word 0xa3801aa6 -//.word 0x25b49829 -//.word 0xecaef471 -//.word 0x3f6fc116 -//.word 0x6cdddecd -//.word 0x5c09a6d4 -//.word 0x6ab36791 -//.word 0x75101576 -//.word 0x34cb4027 -//.word 0xca4944df -//.word 0x9b31c010 -//.word 0x5d2c4949 -//.word 0x72e95f5d -//.word 0x75659fc2 -//.word 0x13693b37 -//.word 0x1c54a8a9 -//.word 0xd91a9658 -//.word 0xa18d2536 -//.word 0xa7db568f -//.word 0x1658bfef -//.word 0x607e8441 -//.word 0xd2328234 -//.word 0x6d49cde3 -//.word 0xf14b5db4 -//.word 0x3a770480 -//.word 0xcf07a3f5 -//.word 0xb9b59e39 -//.word 0x917d8dd0 -//.word 0xdda535c0 -//.word 0x9dfbb6f3 -//.word 0x205e05dc -//.word 0x1c7f9d5e -//.word 0xfee972e9 -//.word 0x7f3f27e6 -//.word 0x78c58055 -//.word 0xf7221ab4 -//.word 0x92655a23 -//.word 0xfb45a3c7 -//.word 0xd5adcc6c -//.word 0xc678d16e -//.word 0xce79c8d9 -//.word 0xd7be17cf -//.word 0x8d15e52a -//.word 0x6fd0ce63 -//.word 0x26c6dbb3 -//.word 0x169ab177 -//.word 0x344008d9 -//.word 0x17bc5fad -//.word 0x512dee99 -//.word 0xff0bdd79 -//.word 0x9fadb301 -//.word 0x220e11a4 -//.word 0x42d0a0b5 -//.word 0x168148cd -//.word 0xe41ea36c -//.word 0x36d5b1e3 -//.word 0x300fcd71 -//.word 0x20aedfac -//.word 0x5793d422 -//.word 0x38644b41 -//.word 0x8e8c9174 -//.word 0x2383d08f -//.word 0x8e4f836d -//.word 0x4c4b2dd7 -//.word 0x12274ba8 -//.word 0x6230872f -//.word 0x5dd12ed5 -//.word 0xd85ae400 -//.word 0xb1019737 -//.word 0x6327b186 -//.word 0xd9dc9224 -//.word 0x80a43d53 -//.word 0xa07b5188 -//.word 0xec183ccc -//.word 0x586fab62 -//.word 0x2a7944aa -//.word 0x54379845 -//.word 0x01f5537a -//.word 0x6eccb6d8 -//.word 0xfb6a481d -//.word 0x8216c857 -//.word 0xe7ee6549 -//.word 0xf0733210 -//.word 0x5748d407 -//.word 0x1e377de7 -//.word 0x23751f33 -//.word 0xf427d9d3 -//.word 0xe424b6fe -//.word 0x5ffd965e -//.word 0x7a3b6c6f -//.word 0xcee7aa29 -//.word 0x8750fade -//.word 0xb8082f65 -//.word 0xf2307b78 -//.word 0x14f5e25b -//.word 0x645beebe -//.word 0xdf3aa5e5 -//.word 0xce85b806 -//.word 0x9ad2fdf3 -//.word 0xe1171ff8 -//.word 0xc9b29507 -//.word 0x95add012 -//.word 0x763fb9b9 -//.word 0xa3965a25 -//.word 0xabd3db34 -//.word 0x0a57b1d6 -//.word 0xfb3d12b7 -//.word 0x8e27ac1e -//.word 0xfa3e9615 -//.word 0x347487ca -//.word 0xc10d4635 -//.word 0xc85d61fb -//.word 0x6bd32292 -//.word 0x5736bfa6 -//.word 0x9a2fd1bc -//.word 0xb6080716 -//.word 0xf3b31cd6 -//.word 0xf90e0666 -//.word 0x9d657116 -//.word 0xfc386b07 -//.word 0xc63f6149 -//.word 0xddac4a40 -//.word 0x1fb0224c -//.word 0x7f409aa8 -//.word 0x5b190e93 -//.word 0x0a02b7ae -//.word 0xb45122a6 -//.word 0x66b0e012 -//.word 0x6521809f -//.word 0xc340ba6a -//.word 0x31c8edad -//.word 0x1459cc9e -//.word 0xdb795394 -//.word 0x8fd8016c -//.word 0xabd8412b -//.word 0x2f4c29e4 -//.word 0xf08066dd -//.word 0x327b77ed -//.word 0x78801a28 -//.word 0x9bdb04bf -//.word 0x1adad521 -//.word 0xb1194b66 -//.word 0x2d02b6ee -//.word 0x7e95ac45 -//.word 0x0e65fd4a -//.word 0x51e3e991 -//.word 0x9edf9105 -//.word 0x3d4cacd2 -//.word 0xc1447b82 -//.word 0x974cff65 -//.word 0xe0d86937 -//.word 0x7c12d2fd -//.word 0x67d72c30 -//.word 0x4902791d -//.word 0x48ee3b8c -//.word 0x21362ba0 -//.word 0x77bf2dfe -//.word 0x6bf98431 -//.word 0x6c61424e -//.word 0x504b03d3 -//.word 0xa4dedbd5 -//.word 0x41608d5b -//.word 0x20b4fe05 -//.word 0x7020e9f1 -//.word 0xe554d3de -//.word 0x52a84292 -//.word 0x7aa62a7a -//.word 0x24c8a891 -//.word 0x6d82f282 -//.word 0x62838f11 -//.word 0xce39c3b7 -//.word 0x51934e8c -//.word 0xb20a566b -//.word 0x76e2a150 -//.word 0xb2ad0704 -//.word 0x1d1227fd -//.word 0x69cc5a7f -//.word 0xd4f5e508 -//.word 0xfa8573eb -//.word 0xed16c23b -//.word 0x87ea9cea -//.word 0xff2e0932 -//.word 0xbb80c334 -//.word 0x65b0eae0 -//.word 0x41c3f914 -//.word 0xbe3ef908 -//.word 0x4ba1f4e9 -//.word 0x6b31adc4 -//.word 0x0cfa8ea6 -//.word 0x1515e202 -//.word 0x3e274452 -//.word 0x242a5701 -//.word 0x9d70b889 -//.word 0x48e431d9 -//.word 0x699430f9 -//.word 0xf46c77f0 -//.word 0xe84414e6 -//.word 0xde1e9486 -//.word 0xe2a874a6 -//.word 0x8109d82a -//.word 0x23d97f25 -//.word 0x9c71f742 -//.word 0xfd660d63 -//.word 0xb0508887 -//.word 0xc4d017f1 -//.word 0x85d18787 -//.word 0x500d3978 -//.word 0xa5d3d421 -//.word 0x7e083732 -//.word 0xdf6db20c -//.word 0xaf1f756e -//.word 0xc6644851 -//.word 0x47a47d10 -//.word 0x30b623cc -//.word 0x2f5e7d0f -//.word 0xb813b3af -//.word 0x5405c6f6 -//.word 0x3c5ec9ff -//.word 0x26c84f63 -//.word 0x5f302016 -//.word 0x1aca308b -//.word 0x0856d11f -//.word 0x28a127b4 -//.word 0xe14edc9c -//.word 0x4ed616ba -//.word 0xd9cea6e3 -//.word 0x0b69838a -//.word 0xa23d769d -//.word 0xe44a16aa -//.word 0x3438f746 -//.word 0xe3e01faf -//.word 0x480eb9b0 -//.word 0x13850ec5 -//.word 0xde44b080 -//.word 0x0508f82b -//.word 0xb812b3af -//.word 0x4e2a19b5 -//.word 0xdce4ff0a -//.word 0x07224d48 -//.word 0x16dab1b3 -//.word 0x4c1a9561 -//.word 0x74494f9e -//.word 0xbdaf988e -//.word 0xc8384014 -//.word 0x007420f3 -//.word 0x2ae34f33 -//.word 0x3c7099c7 -//.word 0x733b2c6c -//.word 0xa09b95d4 -//.word 0xc364eb04 -//.word 0xda654afb -//.word 0xfb358394 -//.word 0xa13012ad -//.word 0x44bc5189 -//.word 0x2cd1eb73 -//.word 0x86b892a4 -//.word 0xb812f567 -//.word 0xf21dec7b -//.word 0x0533f6b9 -//.word 0x7993e6f6 -//.word 0xd964d92b -//.word 0x52f76bd4 -//.word 0x7d4d2b95 -//.word 0x78d94c23 -//.word 0x3b869d62 -//.word 0x29fcbbcb -//.word 0xe61f8411 -//.word 0x69d9d004 -//.word 0x521a5cb5 -//.word 0x7d1d07db -//.word 0xd7ec4175 -//.word 0x7026c0b1 -//.word 0xd200740d -//.word 0x928abebc -//.word 0x2434dd4b -//.word 0xf390a984 -//.word 0xb1598393 -//.word 0xecb58c67 -//.word 0xe3b7155b -//.word 0x97285716 -//.word 0x258764af -//.word 0x524e5e15 -//.word 0x6877e7af -//.word 0x413fd83f -//.word 0xa12a360c -//.word 0xc9476240 -//.word 0x48b58f8f -//.word 0x15667919 -//.word 0xdb235592 -//.word 0x94d003a0 -//.word 0x59f28b84 -//.word 0x786ec7fd -//.word 0xc8935d69 -//.word 0x395bf12e -//.word 0xafee9858 -//.word 0x11688f84 -//.word 0x9cdc2dfc -//.word 0x7e991623 -//.word 0xa0acb214 -//.word 0xc3a6dd86 -//.word 0xce9fe0f3 -//.word 0x667aa0f9 -//.word 0xc06b1600 -//.word 0xb3b7ff1d -//.word 0x12bbd536 -//.word 0x3830fd67 -//.word 0xe4ad42a5 -//.word 0x486d82a1 -//.word 0x5c53a7ef -//.word 0x782bd968 -//.word 0x2233f3cd -//.word 0x25da33ad -//.word 0xe3c73588 -//.word 0xeb1d2234 -//.word 0xcefe2580 -//.word 0x2f4e1e18 -//.word 0x1ab99ba8 -//.word 0x97f70444 -//.word 0x7e4e1508 -//.word 0x8c5991fb -//.word 0xb7093539 -//.word 0xbfe9eb52 -//.word 0x06a641ed -//.word 0xa1ce19b1 -//.word 0xafd8a265 -//.word 0xe9658755 -//.word 0x7bc566f8 -//.word 0x13bd83d1 -//.word 0x3787be93 -//.word 0xdb1bc288 -//.word 0x33ad8033 -//.word 0xc677dc35 -//.word 0xc4b8a56d -//.word 0x99fdcb63 -//.word 0xc29fcce7 -//.word 0xdf8d70f5 -//.word 0x0a4bb6dc -//.word 0x683b0e9f -//.word 0xfd1cc89c -//.word 0xc5d0cd6b -//.word 0x00628d09 -//.word 0xcd473836 -//.word 0xfae4311b -//.word 0x1b51c030 -//.word 0xd95d075d -//.word 0x8dd23760 -//.word 0x0efa036e -//.word 0xc661551d -//.word 0x0cdd4081 -//.word 0xaecc3795 -//.word 0xcc9d7cdd -//.word 0xed92da4a -//.word 0x4cc3975e -//.word 0x7367a590 -//.word 0x0b4f18f2 -//.word 0xf3b3dd11 -//.word 0x8f31a81d -//.word 0x63132e4a -//.word 0xe0d19575 -//.word 0x7dd6280b -//.word 0x0a875027 -//.word 0x4182bffa -//.word 0x9f23ef70 -//.word 0x724dcb10 -//.word 0x3267ac25 -//.word 0x14a4861b -//.word 0xdd88642b -//.word 0xf4a8113b -//.word 0xbcb118ff -//.word 0x20abef65 -//.word 0x707f7030 -//.word 0x6bb788e2 -//.word 0x9d8633e0 -//.word 0xeb08a8d1 -//.word 0x6ccad047 -//.word 0x7a8dfda1 -//.word 0x0947d930 -//.word 0x386b9d98 -//.word 0x266a8379 -//.word 0x077a7d4f -//.word 0x77962797 -//.word 0x0dc6fa34 -//.word 0x34a0c310 -//.word 0x360f5406 -//.word 0x9a537a00 -//.word 0xb0492f5c -//.word 0x6aed1095 -//.word 0x6d1d111f -//.word 0x68a06f92 -//.word 0xa566e60b -//.word 0xde1125cf -//.word 0x51b57f32 -//.word 0x16dce3b8 -//.word 0xb1ce0e79 -//.word 0xe40fffca -//.word 0xc728ab19 -//.word 0x1aaaf319 -//.word 0xd971d320 -//.word 0x1126dccd -//.word 0xf307e4ed -//.word 0x26ebfc9f -//.word 0x6280a2b7 -//.word 0x3bd83861 -//.word 0x3a24b507 -//.word 0x32bf9b74 -//.word 0xd16e2939 -//.word 0x76e6d14f -//.word 0x428eecff -//.word 0x7287adff -//.word 0xecea53de -//.word 0x1750a3a1 -//.word 0xf09896af -//.word 0x5be44fea -//.word 0xb6e54f1f -//.word 0xb459eca0 -//.word 0x69d1ff2f -//.word 0xa1b8de1e -//.word 0x76918ab5 -//.word 0x228029d4 -//.word 0x110cb6d9 -//.word 0x3b23f7c4 -//.word 0xb05eaf9a -//.word 0x74871607 -//.word 0x8e598646 -//.word 0x5c867746 -//.word 0x29ffad05 -//.word 0x016fb040 -//.word 0xc4087d4f -//.word 0x7a837b4b -//.word 0xe662b071 -//.word 0x5e7935cb -//.word 0xdaace70d -//.word 0x4afa60bd -//.word 0x2dbb2696 -//.word 0x5f25212f -//.word 0x321553d8 -//.word 0xc10dc3c4 -//.word 0x80000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x000120A0 -//// expected output -//.word 0xc49a67a9 -//.word 0x6dccfe95 -//.word 0x97d5c107 -//.word 0x0077f460 -//.word 0x24b331f4 -//.word 0xb64d8713 -//.word 0x709f9ab3 -//.word 0x248ec7b9 -//.word 0x5319da1a -//.word 0xc43e0d67 -//.word 0xe2f3ac55 -//.word 0x8943a5fd -//.word 0x9ed2a67d -//.word 0xecbe6c87 -//.word 0x3efe01f5 -//.word 0x9db57cb8 -//// SHA512LongMsgvector_93 -//// vector length -//.word 0x000123B8 -//// input message -//.word 0x223674f8 -//.word 0x9f44f89f -//.word 0x54660b3e -//.word 0x32ddb843 -//.word 0x409eef70 -//.word 0x86a885d3 -//.word 0x29947cf9 -//.word 0xd76e855f -//.word 0x65c3c329 -//.word 0xb7fbd216 -//.word 0xe1e908b4 -//.word 0x8ba1fad0 -//.word 0x9a8a4231 -//.word 0x0db48086 -//.word 0x246b9f9c -//.word 0xc80c5ad4 -//.word 0x2717fed5 -//.word 0x9f86717e -//.word 0xdd5d731e -//.word 0x468324e8 -//.word 0x95d0c6a1 -//.word 0xc667c59c -//.word 0x3446f4e8 -//.word 0xfe1b1ac8 -//.word 0xae59ad63 -//.word 0x1d8cddbd -//.word 0x91ead5e6 -//.word 0x292a3d72 -//.word 0x7b990328 -//.word 0x7b6a5bff -//.word 0x9f4d0446 -//.word 0x4044cd22 -//.word 0x44b2593d -//.word 0xfab51fbd -//.word 0x45b6b473 -//.word 0xfd3f4d55 -//.word 0x920c802f -//.word 0xf2644a95 -//.word 0xadaa561c -//.word 0x572f7cca -//.word 0x2f4a89ca -//.word 0xfdab3e64 -//.word 0x41ec9b2d -//.word 0x89695d7b -//.word 0x2352c51c -//.word 0xf4fe9b48 -//.word 0xa88273d3 -//.word 0x0c832fa7 -//.word 0xb748c572 -//.word 0xf013429c -//.word 0xccb20f7c -//.word 0x975173cb -//.word 0x75925a59 -//.word 0x49e055fe -//.word 0xd600e1d4 -//.word 0x25e8eca3 -//.word 0x26d5959d -//.word 0x9998344c -//.word 0x2f309ac8 -//.word 0xed9e9a2d -//.word 0xd2f5c84c -//.word 0xb9b180a1 -//.word 0x81492a86 -//.word 0x6a08bda5 -//.word 0xc21882b3 -//.word 0xc2e01b5c -//.word 0xb390c379 -//.word 0x54f9d789 -//.word 0x80a3965f -//.word 0x0c192518 -//.word 0xef88d550 -//.word 0xa588a996 -//.word 0xd53a131c -//.word 0x3193ffb3 -//.word 0x9df712f7 -//.word 0x940a34c7 -//.word 0xc8c34cf9 -//.word 0x09c24a4b -//.word 0x68e36b9c -//.word 0x9c13b85c -//.word 0xa562d141 -//.word 0xaf5ae83b -//.word 0x388f10ab -//.word 0x7578b8d0 -//.word 0xf27d7281 -//.word 0x7a51fa22 -//.word 0x368273d1 -//.word 0x184ff3e0 -//.word 0x7bb94288 -//.word 0x03dddfdb -//.word 0xcb8044fb -//.word 0xbfec6b8a -//.word 0x46fb9161 -//.word 0x25713a85 -//.word 0xa08e7556 -//.word 0xe1e4610a -//.word 0x9e67f05a -//.word 0xf7c3eb7b -//.word 0x9df23750 -//.word 0x390d56de -//.word 0x0c623000 -//.word 0xd2c8145c -//.word 0xed2ffa95 -//.word 0xbf7b0bc3 -//.word 0x58936320 -//.word 0x51b41503 -//.word 0xf70c6f13 -//.word 0xad8480b4 -//.word 0x8bddd8c6 -//.word 0x4bfe8f8f -//.word 0x668c89f5 -//.word 0x7abcf7f1 -//.word 0xef652140 -//.word 0xda5a645c -//.word 0x21f676aa -//.word 0xe1f8f2f5 -//.word 0x0c91101b -//.word 0x57bcb306 -//.word 0x53ceaade -//.word 0xd94e2f7d -//.word 0xac06b424 -//.word 0x5a5ae06c -//.word 0x63d9d47f -//.word 0x9d12b287 -//.word 0xd7a96067 -//.word 0xbdaa89aa -//.word 0xfc1ce5b8 -//.word 0xa6dabb50 -//.word 0xd79ea432 -//.word 0x995f911c -//.word 0x05dd0ff8 -//.word 0xab7aca54 -//.word 0x344b5012 -//.word 0x466f1861 -//.word 0xa89fc3ec -//.word 0xa707a151 -//.word 0xb85477d4 -//.word 0x5e0f8055 -//.word 0x4e29b17f -//.word 0xd2d74143 -//.word 0x6ba06984 -//.word 0xbab36914 -//.word 0xa07fcbe0 -//.word 0xa57eeb67 -//.word 0x9651b771 -//.word 0x7212b4fd -//.word 0x88e6427b -//.word 0xd9d1203b -//.word 0xc3cf3226 -//.word 0xe12082ac -//.word 0x2de386fd -//.word 0x67e6a17c -//.word 0xbbbdeb70 -//.word 0x9e1135fd -//.word 0xf93b4854 -//.word 0x89116e26 -//.word 0x8500345e -//.word 0x825c6d0f -//.word 0x95f37aab -//.word 0xb7e8c977 -//.word 0x6dbf9c3b -//.word 0xa8b40c3e -//.word 0xe9514d71 -//.word 0xaa3f33eb -//.word 0xfa5df595 -//.word 0x670f3227 -//.word 0x20d93153 -//.word 0x5b2c6d3f -//.word 0xf57f5139 -//.word 0x58a240a7 -//.word 0xa24fd83c -//.word 0x04037872 -//.word 0x670bff34 -//.word 0x56e2d7da -//.word 0x18ba335b -//.word 0x1c5994be -//.word 0x9b2692d2 -//.word 0x7884d91f -//.word 0x6b5e721c -//.word 0x5e0344a3 -//.word 0x1735daa1 -//.word 0x187c6612 -//.word 0xc3c1062d -//.word 0xc21747db -//.word 0xa6dce86e -//.word 0xce01e090 -//.word 0x8ba6a179 -//.word 0x81ea9f66 -//.word 0x51010c46 -//.word 0x7587e6b6 -//.word 0x6b13342f -//.word 0x15108d7e -//.word 0x60c8d975 -//.word 0x24c25ce1 -//.word 0x4b4ef0bc -//.word 0x365e91a3 -//.word 0x5c971f8a -//.word 0x34a860ae -//.word 0x56db45cb -//.word 0xdde96e8f -//.word 0x0f13ef4f -//.word 0x406e55fa -//.word 0xf37fe44b -//.word 0x43072342 -//.word 0x81209bd4 -//.word 0x1f89dbe2 -//.word 0xcc3fbf68 -//.word 0xe14df2f7 -//.word 0xfce4b265 -//.word 0xeaaed3c3 -//.word 0xcb60078f -//.word 0x708f5c2b -//.word 0x08c4068e -//.word 0xfcd25f3a -//.word 0x17672c6d -//.word 0xeae2229c -//.word 0x6f64a91d -//.word 0xec2adf24 -//.word 0x1a1ae0f0 -//.word 0x879b4546 -//.word 0x39aaea1f -//.word 0x942bf59e -//.word 0x7e7c1344 -//.word 0xc0500567 -//.word 0xafbb5ce0 -//.word 0x0d898005 -//.word 0x2ad4f7d7 -//.word 0x4ed6e47c -//.word 0x5bfbceef -//.word 0xaf3aa3f6 -//.word 0x48a6fd54 -//.word 0x2b40a340 -//.word 0x06105317 -//.word 0x1474bf4e -//.word 0x41b7d5aa -//.word 0x8fe543b3 -//.word 0xb8de3b66 -//.word 0x15aa732a -//.word 0xbe0c7105 -//.word 0xf35a0510 -//.word 0xba8b1728 -//.word 0xca92a2e7 -//.word 0xa8eb01d2 -//.word 0x10736ad4 -//.word 0x967cb8ec -//.word 0x8d216d22 -//.word 0x28d7f7bf -//.word 0xdf4532bd -//.word 0x14562f7d -//.word 0xf78c34b8 -//.word 0xa79703b8 -//.word 0x9a265fc8 -//.word 0x3efdcde9 -//.word 0xe04798c6 -//.word 0xce2e17ea -//.word 0xb8aa3231 -//.word 0x5c96237c -//.word 0x63097aa9 -//.word 0x85e364c3 -//.word 0xf4a62c75 -//.word 0xf88802c5 -//.word 0xd6c6fcff -//.word 0xf73a5aee -//.word 0x46300e52 -//.word 0xda767c8f -//.word 0xd5b27ea3 -//.word 0x8cf8ab5a -//.word 0xe89cd9c5 -//.word 0x0c45e0e8 -//.word 0x3743a1b3 -//.word 0xec234734 -//.word 0x5180cd0a -//.word 0xd61cc11d -//.word 0x162f478c -//.word 0x02fe60e7 -//.word 0x3cb06c9f -//.word 0xc15deeba -//.word 0xcb6990cb -//.word 0xf6106722 -//.word 0xa1417740 -//.word 0x97b07a8e -//.word 0xef27dd4e -//.word 0x301c0cd1 -//.word 0xb989efea -//.word 0x60f8b4a4 -//.word 0x5addd030 -//.word 0x5b294021 -//.word 0xfd1c15dc -//.word 0x665b2f49 -//.word 0x254249cf -//.word 0x5e7b3680 -//.word 0x27d06990 -//.word 0x313dbb0c -//.word 0xab4a69c8 -//.word 0x63985c9a -//.word 0x2fb9aec5 -//.word 0x8b4469b8 -//.word 0x832992f9 -//.word 0xd443665c -//.word 0x4e2ce378 -//.word 0x7c558a5b -//.word 0x8756647d -//.word 0x588243f3 -//.word 0xfdbf4ae5 -//.word 0x4e95af42 -//.word 0xd084c0b2 -//.word 0xd99b24cd -//.word 0xf546648a -//.word 0x8968aafa -//.word 0xb6a9c836 -//.word 0x80127b96 -//.word 0x30d7f123 -//.word 0xf6738a4f -//.word 0xd3fadce4 -//.word 0xb6abf93b -//.word 0xe6c5f4ae -//.word 0x9f9da14f -//.word 0x00ec9ddb -//.word 0x256d8ee9 -//.word 0x90a8ac67 -//.word 0xcd088147 -//.word 0x5534ec76 -//.word 0xb49c6c0e -//.word 0xe7529bcc -//.word 0x081cf9c4 -//.word 0x2dc7eb53 -//.word 0x8dbe0456 -//.word 0xe4db8299 -//.word 0x197c1c93 -//.word 0x1edafb50 -//.word 0x199606ae -//.word 0xc19562cc -//.word 0x0a0e39c0 -//.word 0x04e1bb88 -//.word 0x002b6343 -//.word 0xf6177ca2 -//.word 0x23f7e399 -//.word 0xf6930e5a -//.word 0x2dc04d83 -//.word 0x3c355096 -//.word 0xee9beaab -//.word 0x4ee31461 -//.word 0xc8dc351a -//.word 0x8c05a168 -//.word 0x33a05fc2 -//.word 0xa5072f7c -//.word 0x3a43cbf6 -//.word 0x1fdb6e13 -//.word 0xfcea93ec -//.word 0xd374ffc6 -//.word 0x2cfa0142 -//.word 0x6f4cf9d4 -//.word 0x919f1776 -//.word 0xf2df659e -//.word 0x8647086d -//.word 0x342ec329 -//.word 0x7b24bced -//.word 0x5b3d839f -//.word 0x73ad5023 -//.word 0x67958cce -//.word 0x841d931e -//.word 0xa7c3b9a8 -//.word 0x5af38b51 -//.word 0x41d757c1 -//.word 0xb570ee15 -//.word 0xaee6a8d4 -//.word 0xe61ca925 -//.word 0x3b88633f -//.word 0x55425c20 -//.word 0x8a5a3182 -//.word 0xfe6fdc0b -//.word 0x0f7d32c4 -//.word 0xf0f7afcc -//.word 0x9316764e -//.word 0xcd7094b0 -//.word 0xb5cc850d -//.word 0x4d35f9e6 -//.word 0x644dd814 -//.word 0xbae48301 -//.word 0x66c95d18 -//.word 0x75e08a7a -//.word 0xd475f6f3 -//.word 0x70d0992c -//.word 0x9b0afa22 -//.word 0xb21ff2d6 -//.word 0xfc43b347 -//.word 0xd67a089d -//.word 0x0d63dfa7 -//.word 0x8c540487 -//.word 0x37ac2fac -//.word 0x16654101 -//.word 0xb6e9cb64 -//.word 0xcc27d05a -//.word 0x1ce5cc01 -//.word 0x9958f446 -//.word 0xcef2c057 -//.word 0x7c7ba75c -//.word 0x85632962 -//.word 0x08571397 -//.word 0xce12ffbd -//.word 0xe5761ad9 -//.word 0x8adb2a2b -//.word 0x4da7cf63 -//.word 0x6f1e0812 -//.word 0x8f7cfa5f -//.word 0x8541edfb -//.word 0x8fcd9857 -//.word 0xab2c9e14 -//.word 0x433358bb -//.word 0x0fccd5ae -//.word 0x388e1f5e -//.word 0xb991c0bf -//.word 0x0b8085f9 -//.word 0x01ef8261 -//.word 0xf1ef56a7 -//.word 0x14e0b150 -//.word 0x2f871367 -//.word 0x7361d670 -//.word 0xa2366e9e -//.word 0x74f0f046 -//.word 0x39aed192 -//.word 0xbf15f07a -//.word 0x76e6d7f0 -//.word 0xd2d63e5b -//.word 0xf19ad147 -//.word 0x7e41345b -//.word 0xd5c6438b -//.word 0x68e69e8f -//.word 0x612f6593 -//.word 0x895a4030 -//.word 0x68daa39b -//.word 0xaeb5501c -//.word 0xd1931dc2 -//.word 0xf814f756 -//.word 0x1867278d -//.word 0x5c19d481 -//.word 0xcb2ac962 -//.word 0x25667969 -//.word 0x0df2400e -//.word 0x6d26ec7b -//.word 0x179a7c40 -//.word 0xa8842848 -//.word 0xb241a10c -//.word 0x1a319906 -//.word 0xbec88669 -//.word 0x5be2a30f -//.word 0xaf5738b3 -//.word 0xdad01c60 -//.word 0x0ad97829 -//.word 0x5737cd1b -//.word 0xec7b3970 -//.word 0x68d7f605 -//.word 0x8431230f -//.word 0xf576c709 -//.word 0x943113f1 -//.word 0xbc5ce7b3 -//.word 0xf37598e6 -//.word 0xcdd5f1b6 -//.word 0x0e3e7721 -//.word 0x0fb3f167 -//.word 0x638c28bb -//.word 0xb9c9ec3f -//.word 0x04a7572f -//.word 0xda71565c -//.word 0x1a9964dd -//.word 0xd2079901 -//.word 0x60b1e488 -//.word 0xd76c9512 -//.word 0xa4011ed7 -//.word 0x71841a99 -//.word 0x49e18ed7 -//.word 0xfdb86f44 -//.word 0xc76b6577 -//.word 0x2e75cfe4 -//.word 0x29fd070b -//.word 0x87aae7ef -//.word 0x8eba8cca -//.word 0xe34e59ff -//.word 0xaa083f50 -//.word 0xedd83c51 -//.word 0x4213221c -//.word 0xa8c69a47 -//.word 0xb3496813 -//.word 0xe917f1e6 -//.word 0x6bdcfafc -//.word 0xd8d0b259 -//.word 0x6e44f302 -//.word 0x727ac56c -//.word 0xd2ba2435 -//.word 0x0aa20312 -//.word 0x44be9009 -//.word 0xc359bae0 -//.word 0x8192f0d5 -//.word 0x17b22c8f -//.word 0xdebc3155 -//.word 0x5446117e -//.word 0xc188f128 -//.word 0x1ab3102d -//.word 0x25840653 -//.word 0xde184ac3 -//.word 0x1a02f7bd -//.word 0x6a9bd089 -//.word 0x429981b1 -//.word 0x5ae3286d -//.word 0x55a4135f -//.word 0xa19ecb80 -//.word 0x9ec2525b -//.word 0x02fdaa79 -//.word 0x7c54961c -//.word 0x9733a530 -//.word 0xe2026b7e -//.word 0x4efa1223 -//.word 0xd7371240 -//.word 0x660e3cf4 -//.word 0xf6a0fd87 -//.word 0xf6afe1e8 -//.word 0xefb1565a -//.word 0x6723b36a -//.word 0x05207824 -//.word 0xf632d786 -//.word 0x8e687435 -//.word 0x33a96a6f -//.word 0x77478e41 -//.word 0x84d7f7fa -//.word 0xbd41bedf -//.word 0xa2130220 -//.word 0xf41b2f0b -//.word 0x1a348080 -//.word 0xc460c3a5 -//.word 0xce175dda -//.word 0x67df8df0 -//.word 0x721df595 -//.word 0x2c2b5613 -//.word 0x10aa9b3b -//.word 0xf81a199b -//.word 0x84a815f8 -//.word 0xbf4686f8 -//.word 0x00011d1e -//.word 0x0f8f83fb -//.word 0x8928e2a3 -//.word 0x8698a65f -//.word 0x789185a1 -//.word 0x5745bc3d -//.word 0xfb349cd5 -//.word 0xc9434695 -//.word 0x910fb321 -//.word 0xb780f7cc -//.word 0x91a1c60b -//.word 0x11af3729 -//.word 0xa470c83c -//.word 0x59c5a257 -//.word 0x46831f01 -//.word 0x287f8ae6 -//.word 0x49e826cd -//.word 0xa7da71ca -//.word 0x522fa9b5 -//.word 0x169990da -//.word 0x5aee6df2 -//.word 0x48c25353 -//.word 0x2e3ba563 -//.word 0x2421da52 -//.word 0xf0357e09 -//.word 0x26c4795d -//.word 0x947b9489 -//.word 0xdc7d39db -//.word 0x63b37aad -//.word 0x6a635697 -//.word 0x7b0537e3 -//.word 0x0752be41 -//.word 0x4d9dc3bc -//.word 0x7d6698ed -//.word 0x1e2d8e6f -//.word 0xad84bb93 -//.word 0x8768fa54 -//.word 0x09d1328d -//.word 0xf588dc69 -//.word 0x1739bf1b -//.word 0x29c9fed0 -//.word 0xf5e955e2 -//.word 0xb9eca04f -//.word 0xcfd59d69 -//.word 0x8db5f2cf -//.word 0x6b34729b -//.word 0x636d9cdd -//.word 0x9eff6449 -//.word 0x4c60372c -//.word 0xd47539a5 -//.word 0x2d60d111 -//.word 0x8b9a67c7 -//.word 0x3f416c06 -//.word 0xd8b39b2b -//.word 0x8f5b7f27 -//.word 0xe2cb3631 -//.word 0x7e0b74b8 -//.word 0x6231cb9c -//.word 0x4232299d -//.word 0x29f8a214 -//.word 0x63b56fe1 -//.word 0x9a7637a4 -//.word 0x3ffb8e30 -//.word 0x2cc6bc3c -//.word 0x8772bf5c -//.word 0xe9469330 -//.word 0xbf0ab0db -//.word 0xf119d5b7 -//.word 0xc2b80448 -//.word 0xf8a6cd6e -//.word 0x3cf5d0de -//.word 0xc3177ed2 -//.word 0x2e3c1f00 -//.word 0xafdc19c9 -//.word 0x6e8f6fb4 -//.word 0x2b25881a -//.word 0x24f33223 -//.word 0x396be6f1 -//.word 0x4ef04e1a -//.word 0xf1e8045c -//.word 0x3c129d8c -//.word 0xfd19e6d0 -//.word 0x156a6d0e -//.word 0x1e4343a4 -//.word 0x510d015a -//.word 0xa6ec0994 -//.word 0x3c940ecd -//.word 0xfc5ed740 -//.word 0x7a9b3fe8 -//.word 0x1b2881ab -//.word 0x7d43b2d3 -//.word 0x139c8fbd -//.word 0x10af79d5 -//.word 0x8752bec2 -//.word 0xd08a1add -//.word 0x2da37ee8 -//.word 0xad800ffd -//.word 0x512f72c4 -//.word 0x6ec047e9 -//.word 0x5258f3cd -//.word 0x2a81a37c -//.word 0x24c48ee0 -//.word 0xd07a7a34 -//.word 0xccdf81ba -//.word 0xa06815b1 -//.word 0xe7574282 -//.word 0xb08c333a -//.word 0x239ef83c -//.word 0x682a8638 -//.word 0xc46bff57 -//.word 0x050b34b8 -//.word 0x21396920 -//.word 0x1afc58ed -//.word 0x24c7784c -//.word 0x0a4d7eac -//.word 0xce962473 -//.word 0x90532aef -//.word 0xb06f9b8f -//.word 0x37e65253 -//.word 0x73dabc81 -//.word 0xe2e4e09a -//.word 0x52a89c8c -//.word 0x45ac3129 -//.word 0x9a6a02d8 -//.word 0x6aa3988a -//.word 0x31f7eaf0 -//.word 0x2eb3dbec -//.word 0x0cea0545 -//.word 0xc1c7b59e -//.word 0xb72136a9 -//.word 0x29505398 -//.word 0xd13f17d4 -//.word 0xc0c3d7f2 -//.word 0x8d2b73e3 -//.word 0xb119d86a -//.word 0x3290c9d3 -//.word 0x7f4de0e3 -//.word 0x9b5bcf0b -//.word 0x7ee2ece0 -//.word 0xb940edd0 -//.word 0x585aef0d -//.word 0x0c34bece -//.word 0x8ac050b7 -//.word 0x2ef49295 -//.word 0xe41f684f -//.word 0x487dee1a -//.word 0x0c0905eb -//.word 0x9a920b32 -//.word 0xfb11e9c5 -//.word 0xf83a531a -//.word 0x7f514bba -//.word 0x483fe7f2 -//.word 0xb7e555cc -//.word 0x05b01c3e -//.word 0x9b6ea4a0 -//.word 0xbe60f963 -//.word 0x7190cc01 -//.word 0x9764bb30 -//.word 0x5974d25b -//.word 0xc7995152 -//.word 0xc246af41 -//.word 0x191ce0df -//.word 0xf2b8d4e7 -//.word 0x6cd040cc -//.word 0x827ea0a9 -//.word 0x33db7d76 -//.word 0xdfd0eb82 -//.word 0xf529571d -//.word 0xcbeb7f95 -//.word 0xcde8c265 -//.word 0xda909aa8 -//.word 0xeb0a67d4 -//.word 0xf6846ea4 -//.word 0x12c72156 -//.word 0xdb0ea117 -//.word 0x181881bc -//.word 0x9b7ccdb2 -//.word 0x693d4a38 -//.word 0x1b9e00cb -//.word 0x8437f6e2 -//.word 0x94493ddc -//.word 0x7c4f2f37 -//.word 0x13d5f902 -//.word 0x798d5795 -//.word 0xfaa09f7f -//.word 0x354201c0 -//.word 0x7d890d39 -//.word 0x7f7f7560 -//.word 0x25761538 -//.word 0xbb9b3081 -//.word 0x51cefd2b -//.word 0x60b16211 -//.word 0xb0ffffe4 -//.word 0x78206e65 -//.word 0xc8fac9d8 -//.word 0x24096db5 -//.word 0x71b2fea0 -//.word 0x16d4ac9b -//.word 0x5ba1b47b -//.word 0x14ac2998 -//.word 0x8442f4c9 -//.word 0x7cfe1a90 -//.word 0xc3983d91 -//.word 0xbafe6649 -//.word 0x40a601fc -//.word 0xd42229ef -//.word 0xf9f526d8 -//.word 0xdfa53493 -//.word 0x3f118616 -//.word 0x87058ba7 -//.word 0x370c704d -//.word 0x8b85e684 -//.word 0x5af92534 -//.word 0x3eac31e4 -//.word 0xf5725c2b -//.word 0x07c40c68 -//.word 0xa913beb3 -//.word 0xe25c4b14 -//.word 0xecfd6af2 -//.word 0xddc777ce -//.word 0x87547331 -//.word 0x9c9b4be2 -//.word 0x16c15d5d -//.word 0xd5333881 -//.word 0x8af1a389 -//.word 0xd52de23d -//.word 0xaa143469 -//.word 0xf9eca08f -//.word 0x8e5ff1d9 -//.word 0x36160051 -//.word 0x238a3154 -//.word 0x91174044 -//.word 0xaa533e7e -//.word 0xa79dd68c -//.word 0x39f9d59b -//.word 0x271bea2f -//.word 0x38c1a915 -//.word 0x5346d69a -//.word 0xe574e1fa -//.word 0x839bad1b -//.word 0xd1df957b -//.word 0xa2d6b167 -//.word 0x6053556f -//.word 0xaf7cdb16 -//.word 0x4d23a3ce -//.word 0x3c535723 -//.word 0x24287436 -//.word 0xf3e4066d -//.word 0xc640b369 -//.word 0x0c00fa38 -//.word 0xe8cabdcc -//.word 0xd838fdac -//.word 0x952ce6ea -//.word 0x3a640b55 -//.word 0xa74ef2ef -//.word 0x281dd3a2 -//.word 0x521c9d2e -//.word 0x2e423a66 -//.word 0x9a07149c -//.word 0xeb77d85a -//.word 0xd7857a53 -//.word 0x93a17998 -//.word 0x388d640f -//.word 0x6b6c9d22 -//.word 0x3d1c5db4 -//.word 0x50c5f859 -//.word 0x3cb262c6 -//.word 0x3060f286 -//.word 0xddd567ef -//.word 0x8f332955 -//.word 0x9d8dd17d -//.word 0x04f9ea54 -//.word 0x4fe7f9e1 -//.word 0xbab1bc79 -//.word 0x9673b032 -//.word 0xef1cd59a -//.word 0x6dc5b5a8 -//.word 0x7842a3f2 -//.word 0x9ff74121 -//.word 0x3bed45a2 -//.word 0x4f267c9f -//.word 0xb32d0f2e -//.word 0x72f005c8 -//.word 0x70d209fc -//.word 0x50fd6d64 -//.word 0x94f570d9 -//.word 0x0673bce3 -//.word 0x57703373 -//.word 0x0780ebd5 -//.word 0x846177e0 -//.word 0x96d46970 -//.word 0xfaab1416 -//.word 0x4e24970d -//.word 0x2d751770 -//.word 0x9aa84bab -//.word 0xa2a93e30 -//.word 0x3d9e506b -//.word 0x76767ef7 -//.word 0xcbc5e412 -//.word 0xd7cf804e -//.word 0x2ee2398a -//.word 0x89ea2021 -//.word 0x233ff561 -//.word 0x62c1ed3f -//.word 0xba27b248 -//.word 0xcf94acdb -//.word 0xd96b7f96 -//.word 0x4d65d50e -//.word 0xbae15dc3 -//.word 0xf07b1453 -//.word 0x68dfc3ed -//.word 0xe0e0c809 -//.word 0x46c41a56 -//.word 0xd7e288f4 -//.word 0x887041e4 -//.word 0xa59699bd -//.word 0xb8c60aa0 -//.word 0xac50796d -//.word 0x3231bb37 -//.word 0x642c58f6 -//.word 0xa81d8f7c -//.word 0xd8899aab -//.word 0xa07933e4 -//.word 0x278956c2 -//.word 0xf13c4909 -//.word 0x0492dad9 -//.word 0x49dde828 -//.word 0x36d0246f -//.word 0xaad919a2 -//.word 0x18b16a66 -//.word 0xe8315b7f -//.word 0x1a679387 -//.word 0x2de921e6 -//.word 0x3f69bcfe -//.word 0x758a4fa6 -//.word 0x9df2b5da -//.word 0x12a0c0b0 -//.word 0xe080818e -//.word 0x293dc39b -//.word 0xc857d973 -//.word 0x33759a1f -//.word 0xa6fca944 -//.word 0x7ee0fa9a -//.word 0xe3bb91a0 -//.word 0xa91c8d8f -//.word 0x7821668c -//.word 0x2b487321 -//.word 0x7782afee -//.word 0xcd89bc9c -//.word 0x81742813 -//.word 0x2b89f0ed -//.word 0x4e52422a -//.word 0x37f38725 -//.word 0x28baa1c6 -//.word 0xb6f871fa -//.word 0x700f9d60 -//.word 0xc1cd9046 -//.word 0x18f8c2d3 -//.word 0x452a3985 -//.word 0x27df50df -//.word 0x84cdb75b -//.word 0x3874bba6 -//.word 0x92f5c70c -//.word 0xfb272b31 -//.word 0xd8e81d03 -//.word 0xb2b1fdec -//.word 0x946ede4c -//.word 0xb58c4126 -//.word 0x5753231a -//.word 0xef763b93 -//.word 0x86e87d41 -//.word 0x5ff2e2ca -//.word 0xda836bbc -//.word 0x98c764c7 -//.word 0xe0fae629 -//.word 0x427f9f69 -//.word 0x7a2cd548 -//.word 0x97e9a9f5 -//.word 0x5c799980 -//.word 0xe6974991 -//.word 0x8f45835a -//.word 0x13617cca -//.word 0xf1795903 -//.word 0x14e0f10f -//.word 0xb301d5ce -//.word 0x76f48e33 -//.word 0xda4f25b0 -//.word 0xd63fe9ef -//.word 0xbfd76cc3 -//.word 0x69a7cf5e -//.word 0x8f913fc4 -//.word 0x74d8c080 -//.word 0xcb7a2995 -//.word 0xd4c070b7 -//.word 0xc91328bb -//.word 0x7811484d -//.word 0x31e02ee1 -//.word 0xe2c2e4ec -//.word 0x81eaa153 -//.word 0xaa8f9323 -//.word 0x8a3edb84 -//.word 0xfb74dae8 -//.word 0xf06cab88 -//.word 0x1436f011 -//.word 0xae09d29a -//.word 0xc8da43da -//.word 0x902d8698 -//.word 0xfe2cf262 -//.word 0xb7f6f382 -//.word 0x3239512e -//.word 0x1903b5ff -//.word 0xf2d569a5 -//.word 0xfefa5fd8 -//.word 0x61167591 -//.word 0x8402f77b -//.word 0xb8d765a4 -//.word 0x1c497779 -//.word 0xc0375ff1 -//.word 0x0a7f4e08 -//.word 0x5917396f -//.word 0xe95add82 -//.word 0xf79f017a -//.word 0x2510fbe4 -//.word 0x1fba7552 -//.word 0x7fe07150 -//.word 0xee958b99 -//.word 0x8c8a7e8b -//.word 0x9324ead9 -//.word 0x37d15580 -//.word 0xd09d6ffc -//.word 0x3a009abb -//.word 0x7cfaa9d2 -//.word 0xa962e8ef -//.word 0x047c5d8e -//.word 0x67c94e70 -//.word 0xe6230449 -//.word 0xaf09ceba -//.word 0x3437487e -//.word 0x8d79dce8 -//.word 0x17c28a8d -//.word 0x6278e53e -//.word 0x4a135e39 -//.word 0x63e6c59f -//.word 0x9b3c0d29 -//.word 0x1aa75017 -//.word 0x6d95126a -//.word 0xe424ca53 -//.word 0x38389feb -//.word 0x71ca6f24 -//.word 0x07831500 -//.word 0x4889ec01 -//.word 0xf9998fe0 -//.word 0x4056e382 -//.word 0xc2e05827 -//.word 0x08a96be5 -//.word 0x27847055 -//.word 0xa0ff8e8c -//.word 0x85f30b4c -//.word 0xdd59c97c -//.word 0x4a5f11d6 -//.word 0xe9bc90e0 -//.word 0x7a409f1d -//.word 0xc1afc884 -//.word 0x2bcf8531 -//.word 0xb5c04a5b -//.word 0x0a8cc686 -//.word 0xebff67f9 -//.word 0xd4b91c73 -//.word 0xdd815e1a -//.word 0xdedc71b4 -//.word 0xd6dee719 -//.word 0x8e4167e8 -//.word 0x79b4ac7a -//.word 0xdf75d014 -//.word 0x3a22cb61 -//.word 0xe1cd371f -//.word 0xe34e5618 -//.word 0x36dd5554 -//.word 0x11e0d28d -//.word 0x96019de3 -//.word 0xb484bbd1 -//.word 0x4cd7b160 -//.word 0x926bff9a -//.word 0xb7c3ea42 -//.word 0xc5cb7ec2 -//.word 0xca6ad465 -//.word 0x385a91c6 -//.word 0x8c38af89 -//.word 0x2ed78048 -//.word 0x98daefd0 -//.word 0xbb820a8e -//.word 0x9ec4bd44 -//.word 0x499fe000 -//.word 0xe1ac754f -//.word 0x14f72aae -//.word 0xb80d2641 -//.word 0xae5601c8 -//.word 0x0da514ce -//.word 0x7c0ef423 -//.word 0xe0f8398d -//.word 0x387284bb -//.word 0xc4cbc07a -//.word 0x6d5ca72c -//.word 0x61a98875 -//.word 0xfea94837 -//.word 0xf161a8c1 -//.word 0x9fb8c543 -//.word 0xc486e585 -//.word 0x59ee70d9 -//.word 0xbcee3d4f -//.word 0x0b340f27 -//.word 0xd033608c -//.word 0xe4775d7f -//.word 0x8d353111 -//.word 0xea2786d5 -//.word 0x91964995 -//.word 0x76b9ae44 -//.word 0x0f3d7534 -//.word 0xb5256b89 -//.word 0x4ed433ee -//.word 0x29684686 -//.word 0x294a3925 -//.word 0x26033fc1 -//.word 0x9052ee23 -//.word 0x557b46e2 -//.word 0x05e1ef92 -//.word 0x35d7c239 -//.word 0x21b48b02 -//.word 0x95250d36 -//.word 0x0dc84767 -//.word 0x1bf6f6ef -//.word 0x09e05b99 -//.word 0xbfdd3e9d -//.word 0xe80233d2 -//.word 0x51f41c1f -//.word 0x91faef32 -//.word 0xef56ba75 -//.word 0x80d6e43e -//.word 0x90a6b547 -//.word 0x4368185d -//.word 0x7c86a05c -//.word 0xfec7ca5a -//.word 0xd2218223 -//.word 0xe8cfe8e6 -//.word 0x01a3532d -//.word 0xcb9c9612 -//.word 0x4ebb83b0 -//.word 0x8813aed9 -//.word 0x54207407 -//.word 0x91593b94 -//.word 0x7f08fa2d -//.word 0x6c5afd84 -//.word 0x91b2e245 -//.word 0x3743e84c -//.word 0x1ede6915 -//.word 0x1e08a473 -//.word 0x0f50c085 -//.word 0xe7e00ee6 -//.word 0x22518f25 -//.word 0x67c4b675 -//.word 0x682e6ea5 -//.word 0x0af35f52 -//.word 0xc6b76d5b -//.word 0x4e708295 -//.word 0x74c08ec0 -//.word 0x4883ccba -//.word 0x81a446f3 -//.word 0x1f349b21 -//.word 0x4ebd0035 -//.word 0x8cd3858d -//.word 0x0eed9a6b -//.word 0x6073d1a6 -//.word 0x4d18e59f -//.word 0xfe6afc77 -//.word 0x66a7297f -//.word 0xddd335f0 -//.word 0x0a079fdd -//.word 0x070ce165 -//.word 0xc029f52d -//.word 0x9c38180e -//.word 0x60ffce0a -//.word 0x50be2685 -//.word 0x97053fb1 -//.word 0xe8c80b4b -//.word 0x66b55385 -//.word 0xc1c5fb43 -//.word 0xa2128889 -//.word 0x4ae8df34 -//.word 0x761e4fe9 -//.word 0x85a7d24c -//.word 0xdc649072 -//.word 0x8a3ca598 -//.word 0x286f2415 -//.word 0x03275c8d -//.word 0x7e515a68 -//.word 0xb1aaaf82 -//.word 0x561d7324 -//.word 0xe64c8934 -//.word 0xff6d25a8 -//.word 0x09578c40 -//.word 0x19dc1b75 -//.word 0x155a8bad -//.word 0x1a8d73b0 -//.word 0x1aa70e5f -//.word 0xcaa33fa4 -//.word 0xbbd6d2a5 -//.word 0xc6c7053d -//.word 0xae4047ac -//.word 0x01a53f8d -//.word 0x3f851009 -//.word 0x3e6fdc4b -//.word 0xcd078733 -//.word 0x9858bd4f -//.word 0x4c6c3607 -//.word 0xfb1a3817 -//.word 0xc1205e43 -//.word 0xa8729945 -//.word 0xc9d1740b -//.word 0xb49e9c1f -//.word 0x12f19f67 -//.word 0x89e6f40e -//.word 0xe0373cc2 -//.word 0x6410c720 -//.word 0x8a1e5a6c -//.word 0xd5ea2f86 -//.word 0xfa653e19 -//.word 0x43c3bb16 -//.word 0x318de061 -//.word 0x65f2ecca -//.word 0xc05f6c3e -//.word 0xca4fb93e -//.word 0x5063c291 -//.word 0x52b50b36 -//.word 0x1c6af69d -//.word 0xb2864217 -//.word 0x7104d18a -//.word 0xf427ae69 -//.word 0x350b4ee3 -//.word 0xf47f165b -//.word 0x5d171e19 -//.word 0xe57c353f -//.word 0x750725fe -//.word 0xca8e3809 -//.word 0x1c7efa4a -//.word 0xfd2a41d5 -//.word 0x85636b1a -//.word 0xac49e75e -//.word 0xf760f76c -//.word 0x57e7b387 -//.word 0x4e6552a4 -//.word 0x5384a5d6 -//.word 0x7822e40a -//.word 0x4aa6adf4 -//.word 0xf8904a49 -//.word 0xb855332f -//.word 0x6769d3f2 -//.word 0x6f9d8ff8 -//.word 0xeeab05f7 -//.word 0x150f9165 -//.word 0xce191630 -//.word 0xa141fbb0 -//.word 0xd8ba73da -//.word 0xe14a02b6 -//.word 0xf5583d13 -//.word 0xf747d179 -//.word 0x9f02c65f -//.word 0xd7d8059e -//.word 0x658b1826 -//.word 0xcba332ef -//.word 0x6b086f33 -//.word 0xefd05cdb -//.word 0xe856ba37 -//.word 0xb58c7ff1 -//.word 0xa7921e44 -//.word 0x63870869 -//.word 0x879f7352 -//.word 0x90755a9b -//.word 0xfba3c5be -//.word 0xaa914a86 -//.word 0x8a8ad4c6 -//.word 0x7315a34a -//.word 0x4f82940e -//.word 0x7fc3a3ae -//.word 0x7a7dae1e -//.word 0xb75f7c9b -//.word 0xceb3fde1 -//.word 0xda32d39f -//.word 0x211d1228 -//.word 0xf789446b -//.word 0xdffbb125 -//.word 0xf434dd55 -//.word 0x874e51f1 -//.word 0x0a089ed7 -//.word 0x2c5fa006 -//.word 0x465e000e -//.word 0xf636fcc5 -//.word 0x09916b3c -//.word 0x9f24fbf1 -//.word 0x8983be46 -//.word 0xf63ae532 -//.word 0x4f19cb37 -//.word 0x5fcf3594 -//.word 0xb7bbd8bb -//.word 0x51fe1b05 -//.word 0x73d51fa5 -//.word 0xd626fcdb -//.word 0x08584e6a -//.word 0x0f68f14b -//.word 0x4f3908a3 -//.word 0xae2c44f3 -//.word 0xf5f1638e -//.word 0x799df651 -//.word 0xfcfc688e -//.word 0xce283c49 -//.word 0x375a96a7 -//.word 0x1a01fda3 -//.word 0xd2115f03 -//.word 0x609e558a -//.word 0xc8a9a970 -//.word 0xb83a160f -//.word 0x6baf4edf -//.word 0xcd5342a4 -//.word 0xe0329de6 -//.word 0x5e2c91a2 -//.word 0xa049d73f -//.word 0xbe4cf1c3 -//.word 0xf88bb347 -//.word 0x54fd01a9 -//.word 0x8995da80 -//.word 0x1cce9655 -//.word 0xc9886b10 -//.word 0x241236b0 -//.word 0x8088783f -//.word 0x105f9f05 -//.word 0x4c3e88fd -//.word 0x960f4185 -//.word 0x1e571359 -//.word 0x03c2c0c2 -//.word 0xbb03090b -//.word 0xb4da7335 -//.word 0x3b764bec -//.word 0x9efee8b9 -//.word 0x8d6b3078 -//.word 0xc6985e0d -//.word 0xf29c0253 -//.word 0xc9574855 -//.word 0x7d4b7ec1 -//.word 0x56add199 -//.word 0x99bc572c -//.word 0xaf525345 -//.word 0x83b9b4a2 -//.word 0x2cbfdea7 -//.word 0xcc0dad54 -//.word 0xb8b4b775 -//.word 0xd909d218 -//.word 0x52b3d744 -//.word 0x6202a5e8 -//.word 0x8c836812 -//.word 0xf6d11b61 -//.word 0x10ad4bbd -//.word 0x75511e45 -//.word 0x16029589 -//.word 0x95e50efa -//.word 0xef130d9f -//.word 0x5eef3b09 -//.word 0x7eb8af88 -//.word 0xae5a6d9f -//.word 0xb98a2cb6 -//.word 0xb6115d0f -//.word 0x2c6868fb -//.word 0x7a86394e -//.word 0x76f6fb10 -//.word 0x552c2375 -//.word 0xcb19b10f -//.word 0x72fdb243 -//.word 0x707d0afa -//.word 0x55f57098 -//.word 0x420fba32 -//.word 0x50955bfc -//.word 0x2f832a00 -//.word 0x0e616516 -//.word 0xbbcff510 -//.word 0x0c62f335 -//.word 0x7dae6cf1 -//.word 0x1aa461ca -//.word 0xa01f1296 -//.word 0xdfb97deb -//.word 0x62e321d8 -//.word 0x523507d2 -//.word 0x980203f1 -//.word 0x4230385d -//.word 0x2846da03 -//.word 0xcfc7388c -//.word 0x8dbff98f -//.word 0xee9ba505 -//.word 0x573d68fe -//.word 0xe9501393 -//.word 0xa8d9641c -//.word 0xdd0f87a3 -//.word 0xb96ddc98 -//.word 0x3a05fbc5 -//.word 0x5317f685 -//.word 0x47e2de31 -//.word 0x56ba88dc -//.word 0x9b5b9040 -//.word 0x357d9ff7 -//.word 0xa5a9eaef -//.word 0x774afb18 -//.word 0x2507b45f -//.word 0x385091e0 -//.word 0xb0372d57 -//.word 0xa68208d8 -//.word 0x30fe87c1 -//.word 0x85163cec -//.word 0x61a36829 -//.word 0xab06beeb -//.word 0x56756a41 -//.word 0x85925208 -//.word 0xf2429c60 -//.word 0x90bc705c -//.word 0x6fe0fffe -//.word 0xe0cbc462 -//.word 0xdba80939 -//.word 0x9dc8ae79 -//.word 0x95f62653 -//.word 0x8104c266 -//.word 0xd5aa3232 -//.word 0x5c9149cf -//.word 0x21aa00de -//.word 0x90c4bec1 -//.word 0xd95ed607 -//.word 0x95b9512a -//.word 0xac32ef7d -//.word 0x76cf6860 -//.word 0x2018f7b6 -//.word 0x52281999 -//.word 0x0e03934c -//.word 0xdc2ab270 -//.word 0x246dd67b -//.word 0xdb013267 -//.word 0x61d2cda7 -//.word 0xaa1acc5f -//.word 0x9d33f4d4 -//.word 0xb9aa6b22 -//.word 0xfe94be2d -//.word 0x0b2528d9 -//.word 0x847e127e -//.word 0xb6c7d696 -//.word 0x7e7ec8b9 -//.word 0x660e77cc -//.word 0x12a43075 -//.word 0xdb3ec4d1 -//.word 0xb9058b6a -//.word 0x66dca963 -//.word 0xc03990f6 -//.word 0x7033c721 -//.word 0xc9dde99b -//.word 0xf2d3f00d -//.word 0x4812b37f -//.word 0xfe0dae10 -//.word 0x06fd02eb -//.word 0x3578bc76 -//.word 0xa2455acd -//.word 0x4f6f8c6e -//.word 0x0b983736 -//.word 0x9690bf8c -//.word 0x072686dc -//.word 0x6b3eb047 -//.word 0xaf242a98 -//.word 0xc020ea7a -//.word 0xf04b78e9 -//.word 0x9ca0ade7 -//.word 0x0b56ba70 -//.word 0x9a6e6daf -//.word 0x1688b072 -//.word 0x6afa53dc -//.word 0x7a230b59 -//.word 0x4efdbad7 -//.word 0x73f2f034 -//.word 0x9ef1b2f2 -//.word 0x93c07b32 -//.word 0x459481e0 -//.word 0x3fdf392b -//.word 0x42691d38 -//.word 0x30a2ad17 -//.word 0x2837b4f6 -//.word 0xf3e3cc94 -//.word 0x9f8824f9 -//.word 0x697e8165 -//.word 0xe12a8386 -//.word 0x48d32aed -//.word 0x3db298c3 -//.word 0x994819b8 -//.word 0x97f5603d -//.word 0x38c514f3 -//.word 0xe58d8b63 -//.word 0x5637d5ef -//.word 0xb45afc08 -//.word 0xfa0e8aa2 -//.word 0xa1fe4ce5 -//.word 0x7cbe5626 -//.word 0xe15f4715 -//.word 0x0941ce38 -//.word 0xb9296d98 -//.word 0x22937dba -//.word 0x074a73d0 -//.word 0x1d356131 -//.word 0xb774c007 -//.word 0xa2ac6c47 -//.word 0x4e9ef0e7 -//.word 0x2fff044b -//.word 0x63835400 -//.word 0x953c83ac -//.word 0x21227045 -//.word 0x79f3b882 -//.word 0xc73d7c8f -//.word 0xd4b86405 -//.word 0x28dae319 -//.word 0x73a6bd14 -//.word 0x2bc5c703 -//.word 0x77d7eeaf -//.word 0x4c0b7bcf -//.word 0xd5ed967d -//.word 0x198008e7 -//.word 0xd88d4547 -//.word 0xb53aa915 -//.word 0x9bde027a -//.word 0x59144f09 -//.word 0x8f0fc7aa -//.word 0xce2d1dd6 -//.word 0xfbce030a -//.word 0xf466ed75 -//.word 0x76d117f4 -//.word 0x3fe7c941 -//.word 0x6f51da68 -//.word 0x349b737a -//.word 0xa6891584 -//.word 0xf0afddc2 -//.word 0xb13c0711 -//.word 0xa217b2a3 -//.word 0x782de2f6 -//.word 0x0c09cb07 -//.word 0xb9a54dc3 -//.word 0x057fbbbe -//.word 0x84f0e027 -//.word 0xfab944fc -//.word 0xc0dfab7a -//.word 0x69badfd8 -//.word 0xa448af34 -//.word 0x64c738ce -//.word 0x3f826374 -//.word 0x14ebaf3d -//.word 0xf1ea317a -//.word 0x3475d9ea -//.word 0xf061f62d -//.word 0x9277fc7b -//.word 0xc4cb8596 -//.word 0x914997fd -//.word 0xca912563 -//.word 0xa905d85f -//.word 0xb51f0f65 -//.word 0xe50924f5 -//.word 0x0867f112 -//.word 0x647792f6 -//.word 0x9e5d6d04 -//.word 0xdab870fe -//.word 0x22799a78 -//.word 0x0cf5bd8d -//.word 0x973982d0 -//.word 0x579dad85 -//.word 0xd29ca212 -//.word 0x29e228b0 -//.word 0xfba76e66 -//.word 0x863c4c38 -//.word 0x0fe3ca9c -//.word 0x84e4e62d -//.word 0x61dd92a3 -//.word 0xd05afd03 -//.word 0x14a51313 -//.word 0x27e04711 -//.word 0xa25090a4 -//.word 0xdefcb113 -//.word 0x5977beb5 -//.word 0x5bfadca9 -//.word 0xd9b548c6 -//.word 0x99679bd5 -//.word 0x972d4cfe -//.word 0xa8977681 -//.word 0x5d01dba7 -//.word 0x2a212af7 -//.word 0xc7dc7dac -//.word 0xd75e2667 -//.word 0xc869ab22 -//.word 0xfaed0f65 -//.word 0x23da53bc -//.word 0xf2323d68 -//.word 0xf2625855 -//.word 0xb2d23c4c -//.word 0x23bb0f6a -//.word 0x41394cd1 -//.word 0xf5a1c39d -//.word 0x3a14e21a -//.word 0x80543234 -//.word 0x4dd7242e -//.word 0x2a1a0e97 -//.word 0xbd38717a -//.word 0x33bb7dd6 -//.word 0xe1b2d74d -//.word 0x2a049920 -//.word 0xa3039b5b -//.word 0x7544f14d -//.word 0x03afb43b -//.word 0xcdd20656 -//.word 0x947a50e9 -//.word 0xc085ced7 -//.word 0xfef24e45 -//.word 0x2d3a3494 -//.word 0x7be3c292 -//.word 0xcb5296f1 -//.word 0x5be174f8 -//.word 0xa3314678 -//.word 0x80c26102 -//.word 0x91c00a57 -//.word 0xe1203920 -//.word 0xc7ec9ddf -//.word 0x0bdbdf26 -//.word 0x4a252b07 -//.word 0x9c95edcb -//.word 0x73e0d8e6 -//.word 0xc7352d2b -//.word 0x70153a3d -//.word 0xd3652146 -//.word 0xc0c2daeb -//.word 0x9b147b7f -//.word 0xba66b776 -//.word 0x0ff5a51d -//.word 0x0786c389 -//.word 0xb1fd3bcd -//.word 0x232c6571 -//.word 0x1ae98c1f -//.word 0xe063f59e -//.word 0x73b61d05 -//.word 0xe3bc4328 -//.word 0xfc262657 -//.word 0x25cc1048 -//.word 0x88421351 -//.word 0x73ac93da -//.word 0xfed30513 -//.word 0xef78f5e2 -//.word 0xdae84e20 -//.word 0x8dd0d604 -//.word 0xab53f8df -//.word 0x965ac60a -//.word 0x922b3e1d -//.word 0x283ecc62 -//.word 0xc94b118a -//.word 0xb4a8e39e -//.word 0x1ad29538 -//.word 0x7f4a78f2 -//.word 0x63a2a11f -//.word 0x22d7edb9 -//.word 0x19e1439b -//.word 0x0a8919f0 -//.word 0xc17b3aec -//.word 0xf89cc6ba -//.word 0x799d7ab5 -//.word 0x82d131da -//.word 0x6d3bab7d -//.word 0x90ec8e3c -//.word 0x638caa32 -//.word 0xe036816d -//.word 0x308907a1 -//.word 0x83fba61d -//.word 0x407185ff -//.word 0x5e0d0aa4 -//.word 0x11479e63 -//.word 0xaa40b07b -//.word 0xb852fc49 -//.word 0x74ec0dbf -//.word 0x5c9d0011 -//.word 0x1d6e8cb1 -//.word 0xb6753f7e -//.word 0xdba70a39 -//.word 0x97ee0038 -//.word 0x367c5b5e -//.word 0x625ec04a -//.word 0x8c54c4cf -//.word 0x8ee0aea4 -//.word 0x8e9d7e5d -//.word 0x25d22f9a -//.word 0xc0473a7f -//.word 0x47575b64 -//.word 0xfd4797cd -//.word 0xa8d67e9c -//.word 0xf115ae85 -//.word 0x0d7998c3 -//.word 0x9d2f8709 -//.word 0xd3afdebc -//.word 0xd794a05f -//.word 0x69ab364f -//.word 0xc74a6db0 -//.word 0xd1e3bfa7 -//.word 0x6bd8d3c9 -//.word 0x239147d4 -//.word 0x14cdac9d -//.word 0x0935d24a -//.word 0xe63746c1 -//.word 0x44111a61 -//.word 0x5c2ce4ef -//.word 0x26ac09d3 -//.word 0xc2453c84 -//.word 0x16504141 -//.word 0xb91ef702 -//.word 0x0f8c95ae -//.word 0xb6d7348e -//.word 0x21b28e02 -//.word 0x83960572 -//.word 0xef5ae788 -//.word 0xbd03f09c -//.word 0x2fdd1070 -//.word 0x55cb6f1e -//.word 0x2ddbaf4e -//.word 0x0f1d71ac -//.word 0x48b61a9a -//.word 0x0630d721 -//.word 0x7414de2e -//.word 0x25bbf7fb -//.word 0xb6613bcb -//.word 0xaf7b1cda -//.word 0xab4aa694 -//.word 0xb9b10505 -//.word 0x01444691 -//.word 0xaba162e5 -//.word 0xfc03782d -//.word 0xc2145a87 -//.word 0xf3034bb8 -//.word 0x91d7071f -//.word 0xd00304e7 -//.word 0x7b3af880 -//.word 0x94849b4f -//.word 0x3b92aea4 -//.word 0xd04e3ced -//.word 0x5cb7202a -//.word 0x2decc7a1 -//.word 0xc18637d3 -//.word 0xe62b50ae -//.word 0x1e615204 -//.word 0x489fa03c -//.word 0x7daac448 -//.word 0x391fb2d7 -//.word 0xbb4b51cb -//.word 0xae4337ed -//.word 0x0831b4df -//.word 0x33ed1353 -//.word 0x6bcd1c7b -//.word 0x67bddec0 -//.word 0x3b92abb7 -//.word 0x7d9b6351 -//.word 0xa679f652 -//.word 0xbc312404 -//.word 0x2e80872c -//.word 0x006fd43d -//.word 0x27265ecc -//.word 0x3705db44 -//.word 0x3bf16bdb -//.word 0xe4ecd6c4 -//.word 0xe7e915a6 -//.word 0xa0de154e -//.word 0xfb1ab7a1 -//.word 0x94d91bd4 -//.word 0x1d161edf -//.word 0x01a0212e -//.word 0x46700d9a -//.word 0xb83a9399 -//.word 0x4442b9b1 -//.word 0xa2719233 -//.word 0x37a84c25 -//.word 0x39547180 -//.word 0x1443669c -//.word 0x0cb638e8 -//.word 0x24b797de -//.word 0x3fac2336 -//.word 0x862de75a -//.word 0x0913231b -//.word 0xa9d14fa2 -//.word 0x35085ca9 -//.word 0xd3553deb -//.word 0xa26ea6d8 -//.word 0x9d6d148e -//.word 0xc36b0d05 -//.word 0x7551a989 -//.word 0x1feb516e -//.word 0x1a3ec7ff -//.word 0xd11c66b7 -//.word 0x23f5acb4 -//.word 0x09f0f568 -//.word 0x793a8992 -//.word 0x8a9ed96c -//.word 0xd8570626 -//.word 0x2a22a394 -//.word 0x5297bc24 -//.word 0x55b81712 -//.word 0xcccbb9df -//.word 0x8a65acff -//.word 0x7fc800d2 -//.word 0xdc6e10d5 -//.word 0x78e6071a -//.word 0x73dfa2f5 -//.word 0x198337f9 -//.word 0x0906f622 -//.word 0x967e6f54 -//.word 0x6df55404 -//.word 0x78bc8035 -//.word 0x030339a7 -//.word 0x1ea7b24b -//.word 0x424bd4f9 -//.word 0x37aa3e65 -//.word 0x342b8b50 -//.word 0x49b7d3fb -//.word 0xfac774e1 -//.word 0x2dc112a5 -//.word 0x4684dc4a -//.word 0x904111a2 -//.word 0xdf8ec309 -//.word 0x73b5dc53 -//.word 0x20525e02 -//.word 0xac1defbc -//.word 0x790494fd -//.word 0x637dbd0a -//.word 0xec1a8226 -//.word 0x975d2c07 -//.word 0x91cff78b -//.word 0x964c16a8 -//.word 0x13a1f8a1 -//.word 0x8859ca80 -//.word 0x31d33dc0 -//.word 0xe598894a -//.word 0x3eecb2a3 -//.word 0xfaa30963 -//.word 0xa136f7e9 -//.word 0x6816f64d -//.word 0x5640e096 -//.word 0xa5126c2d -//.word 0x6b5df592 -//.word 0x7abb7e4e -//.word 0x8423f429 -//.word 0x83bab29c -//.word 0x57ec4b89 -//.word 0xb1bc832a -//.word 0x31589e48 -//.word 0xcbf1dead -//.word 0x6fc947db -//.word 0xe98ea5fe -//.word 0x06e6d020 -//.word 0xf84b2f9c -//.word 0xfb197bd5 -//.word 0x39e5c527 -//.word 0xeb11bb1e -//.word 0xc29d27e6 -//.word 0x8540b803 -//.word 0xfbb80542 -//.word 0x0b5ecff0 -//.word 0x22fd8649 -//.word 0xd5e40f33 -//.word 0xc83ac52d -//.word 0xce92be82 -//.word 0x51bf4fc2 -//.word 0xf5ead272 -//.word 0x78e2a603 -//.word 0xddb27801 -//.word 0xc979c18d -//.word 0x2d76900d -//.word 0x25638a22 -//.word 0x20042fdb -//.word 0x42ff5f28 -//.word 0x06ee1c91 -//.word 0x28b39127 -//.word 0xc20b53bb -//.word 0xb567e84f -//.word 0x4af786ca -//.word 0x19071cf0 -//.word 0x2a8e9790 -//.word 0x5b045eff -//.word 0x01751ec6 -//.word 0xd2d4cd98 -//.word 0x0391e987 -//.word 0xad6d0177 -//.word 0x758e77d2 -//.word 0x6cce847d -//.word 0x34597c0b -//.word 0x65775431 -//.word 0x2ea6617a -//.word 0x40ec623c -//.word 0xe76bc1cb -//.word 0x7a3616ec -//.word 0xf663ed8d -//.word 0xe662c9b3 -//.word 0x868d69b3 -//.word 0x27ff49a5 -//.word 0xd5aa6c16 -//.word 0x38a459fd -//.word 0xb8c264f0 -//.word 0xe4682e98 -//.word 0x159f6f63 -//.word 0x4e68f378 -//.word 0x6751e3f0 -//.word 0x6b454643 -//.word 0x3ea8c700 -//.word 0x83a4b9c2 -//.word 0xbcbd585f -//.word 0xb3ac5262 -//.word 0x1a6a86bc -//.word 0x6e8b0bb6 -//.word 0x21cd742a -//.word 0xf7f152f3 -//.word 0xb1c9fba2 -//.word 0xe9938a72 -//.word 0x3d85277f -//.word 0xafa98932 -//.word 0x4cebb800 -//.word 0x0c711854 -//.word 0xfa2aa3c9 -//.word 0x94aa769d -//.word 0x75358f63 -//.word 0x3119d5f7 -//.word 0x814158b7 -//.word 0xa008dbf0 -//.word 0xf44b9097 -//.word 0xf1c2223a -//.word 0x3b90f835 -//.word 0x0a18b929 -//.word 0xd3130baa -//.word 0x25dfa138 -//.word 0xd11a7471 -//.word 0x4d705084 -//.word 0x5ab193e9 -//.word 0xe5273250 -//.word 0x2b26fcd7 -//.word 0x21e4237f -//.word 0x138bf8e1 -//.word 0x8b8df61d -//.word 0x74380214 -//.word 0x7f8af1d7 -//.word 0xc6464b5e -//.word 0xb0474e7e -//.word 0x14153615 -//.word 0xa1b6bc88 -//.word 0x7dc7dd6f -//.word 0x2ccbdc8e -//.word 0xb4c28a08 -//.word 0xfefec5cf -//.word 0x80323f5f -//.word 0x19cc81ac -//.word 0x3c842f58 -//.word 0x51358d2a -//.word 0x58ec42bc -//.word 0xd03f5c73 -//.word 0xd7e195b4 -//.word 0x9273d455 -//.word 0xcf9cf752 -//.word 0xe95bd0c2 -//.word 0xec9c6d09 -//.word 0xfa0a9d4e -//.word 0xee25af30 -//.word 0x3e947db4 -//.word 0x26bcaa82 -//.word 0x03912752 -//.word 0xfdacfca1 -//.word 0xe89f45a8 -//.word 0x6c857a8e -//.word 0x64ddf4dd -//.word 0x8598ad33 -//.word 0x4070483a -//.word 0xe97c51d9 -//.word 0x1801c5ac -//.word 0x508cd5b2 -//.word 0xde3de746 -//.word 0x0466de51 -//.word 0x57559bbd -//.word 0x666dc32d -//.word 0x9c7cc3eb -//.word 0x68481221 -//.word 0x9a6bb64d -//.word 0x11610aef -//.word 0x93e0be84 -//.word 0xfc671fb8 -//.word 0x9b1a99d8 -//.word 0xd9cd7a86 -//.word 0x1b5ff8b0 -//.word 0xea4976c3 -//.word 0x5276031b -//.word 0x875624bf -//.word 0xcf2ed34b -//.word 0x9bb2c72d -//.word 0xf7d5f614 -//.word 0x25e059a6 -//.word 0x85c1ef72 -//.word 0xb9a60425 -//.word 0x05cbb300 -//.word 0xfc90aa89 -//.word 0x59cf2d81 -//.word 0x2b6c5e17 -//.word 0x352ebb5b -//.word 0x94cde8f5 -//.word 0xa24caf17 -//.word 0x1b8845b0 -//.word 0x7e12cee3 -//.word 0xb63a24b7 -//.word 0xfa6cd410 -//.word 0xf2c06ade -//.word 0x1bccef94 -//.word 0x6cbdafdc -//.word 0x3aa64088 -//.word 0x5917bfcc -//.word 0x84f25dab -//.word 0xfe7a1ab0 -//.word 0x7aadd1de -//.word 0x39d475e9 -//.word 0x72589aa7 -//.word 0xf6d737c1 -//.word 0x1477aaae -//.word 0xba7afce2 -//.word 0xde136742 -//.word 0x1c7815dc -//.word 0xa1392bd5 -//.word 0x47d006a2 -//.word 0x0179c47b -//.word 0x7a44070d -//.word 0xf968f570 -//.word 0x88da8458 -//.word 0x551ef48f -//.word 0x585e9da3 -//.word 0x36b9eadc -//.word 0x66dda670 -//.word 0x92d876fa -//.word 0x402ba729 -//.word 0xb1202ab5 -//.word 0x095edd98 -//.word 0xb1bb0d7a -//.word 0xfa51386d -//.word 0x03d417da -//.word 0xdc23dbbb -//.word 0xeb1cb80b -//.word 0x8fb5a07b -//.word 0x04485167 -//.word 0x872f9108 -//.word 0xba91b8eb -//.word 0x497b70a2 -//.word 0xce33b9b9 -//.word 0xf2c930ec -//.word 0xd5ee9096 -//.word 0xb109796d -//.word 0xba88706d -//.word 0x48742812 -//.word 0x3749ffca -//.word 0x8e04ccaa -//.word 0x607dd860 -//.word 0xf0f72a69 -//.word 0x18f60884 -//.word 0xec51ba66 -//.word 0x9a8791af -//.word 0x9556281d -//.word 0xf28aeaff -//.word 0x1214d4ed -//.word 0x815b7cb7 -//.word 0x1ed7539b -//.word 0x7cdb27bb -//.word 0x89b2ecce -//.word 0x6deebb15 -//.word 0xb5fd1b90 -//.word 0xb1fd8073 -//.word 0x1ad111d4 -//.word 0xf875aea6 -//.word 0xc38e32ea -//.word 0xc946f524 -//.word 0xcf56960c -//.word 0xfb64f787 -//.word 0xf29088d5 -//.word 0x3d4ac90c -//.word 0xf1660ac5 -//.word 0x8f727515 -//.word 0x29474fbf -//.word 0xc6de7ba7 -//.word 0x0865408a -//.word 0x0c924ced -//.word 0x9238f853 -//.word 0x5e18cdb3 -//.word 0xdef94729 -//.word 0x0cfbdaec -//.word 0x96283380 -//.word 0x3c4cc02d -//.word 0x7a0672af -//.word 0x6820c22f -//.word 0xde1cf272 -//.word 0xdb0f9551 -//.word 0x28b35169 -//.word 0x38b7e413 -//.word 0x53596597 -//.word 0xf437cc9c -//.word 0x6f62b5e3 -//.word 0xd6b56135 -//.word 0x1e65fe9a -//.word 0x7ed828cc -//.word 0x18bbafeb -//.word 0xdb4f9b72 -//.word 0xa8036d6a -//.word 0xb348a8de -//.word 0x2da1908e -//.word 0x20f932e7 -//.word 0x9a3aa433 -//.word 0x0d1b8e0e -//.word 0xf63ae919 -//.word 0xbd6a07f2 -//.word 0xdc4ed463 -//.word 0x44275bd9 -//.word 0xfcea8c18 -//.word 0x0c963c2e -//.word 0x99c46da5 -//.word 0x517fd0fd -//.word 0x0a57885a -//.word 0xa5b13179 -//.word 0x396121e8 -//.word 0x6e7bed77 -//.word 0x26652fea -//.word 0x633187f0 -//.word 0x652ae059 -//.word 0x12adf583 -//.word 0x9b3b1315 -//.word 0x5dcb20f0 -//.word 0x0565dc63 -//.word 0xf8ec679e -//.word 0xf23c046a -//.word 0xec751c17 -//.word 0x449586b5 -//.word 0x184d0587 -//.word 0xf20d12b4 -//.word 0xab62dc40 -//.word 0x89818e3b -//.word 0xab24d038 -//.word 0xa7949001 -//.word 0x71070289 -//.word 0x7f2de522 -//.word 0x2a0609f0 -//.word 0x58f60e9e -//.word 0x581b6e4f -//.word 0x0ddebed8 -//.word 0x4fc8302c -//.word 0x8e985d17 -//.word 0xb8924130 -//.word 0x5d198709 -//.word 0x128007a8 -//.word 0x131e8e3b -//.word 0x2ca0dd07 -//.word 0xd9a3f4a2 -//.word 0xac839062 -//.word 0xef6df215 -//.word 0x8bbce2f2 -//.word 0x2882f4d0 -//.word 0x96640a96 -//.word 0x6bac1af3 -//.word 0xee99314f -//.word 0x34f9b801 -//.word 0x89faf7c2 -//.word 0x123ed761 -//.word 0xb02decb9 -//.word 0x268fb2e1 -//.word 0x7f5a17a2 -//.word 0xaac83a2e -//.word 0x68ad730e -//.word 0x6808935d -//.word 0xafd86d34 -//.word 0x3e319565 -//.word 0xef8e676c -//.word 0xa1694ba2 -//.word 0x940938b4 -//.word 0x169c7754 -//.word 0x6085aa2e -//.word 0xbbf70c1e -//.word 0xe7c3faa0 -//.word 0xbc6eb388 -//.word 0x12875cf3 -//.word 0xdf37477d -//.word 0x9f1a74b4 -//.word 0xf94d58cd -//.word 0x9fc9de96 -//.word 0x76efacac -//.word 0xf763a7ee -//.word 0xd51eb931 -//.word 0xdfbfd236 -//.word 0x29222cd9 -//.word 0x6634d48a -//.word 0x99066601 -//.word 0xed20172e -//.word 0xe017f96f -//.word 0xa7627b06 -//.word 0xce692fca -//.word 0x20dfd11c -//.word 0xc652841d -//.word 0xb3005e1f -//.word 0x3fed2759 -//.word 0x11325ede -//.word 0x43987dd0 -//.word 0xc1657fd0 -//.word 0xf2769eba -//.word 0x9b8e618f -//.word 0x00eed6b3 -//.word 0x4c261c59 -//.word 0x322a253b -//.word 0xd5a8ba8e -//.word 0xe599c035 -//.word 0x0b17b935 -//.word 0x886e8e69 -//.word 0x19758b77 -//.word 0x1d1fab02 -//.word 0xf94d1621 -//.word 0xbce6e810 -//.word 0xff2a3426 -//.word 0x10434907 -//.word 0x4f1d331b -//.word 0xd778853f -//.word 0x613c56ba -//.word 0x660c8a72 -//.word 0x841d5360 -//.word 0x2349f641 -//.word 0x585fd38e -//.word 0x0abea0af -//.word 0x5322f56c -//.word 0x28bd0da4 -//.word 0x3d8acb41 -//.word 0x23defb6b -//.word 0xb340dbfc -//.word 0xb07ad934 -//.word 0xa8f09faf -//.word 0x1b314d93 -//.word 0xe0cc050e -//.word 0xc365ad00 -//.word 0x7307f0f4 -//.word 0x9cbc8655 -//.word 0x505bb6df -//.word 0xaba21953 -//.word 0xb784a06f -//.word 0x8dc4d81d -//.word 0xbdc36deb -//.word 0xf097eebb -//.word 0xcc5ccfbb -//.word 0x18cfb498 -//.word 0x2119edef -//.word 0x5ce83c05 -//.word 0x4cc4dfb7 -//.word 0xa6a1cab4 -//.word 0xb4b035e9 -//.word 0xf77b563d -//.word 0x1031707f -//.word 0xe13e0c9c -//.word 0xef1f8616 -//.word 0x0a75ccb1 -//.word 0x31586370 -//.word 0xb0edabbf -//.word 0x8b3b63f2 -//.word 0x1f3a6fee -//.word 0x072dd926 -//.word 0x3d3217ca -//.word 0x81188c3a -//.word 0xff7051c1 -//.word 0x2ce73480 -//.word 0xf1d301a8 -//.word 0x0b0b01ed -//.word 0xb2fcc137 -//.word 0x78f9149a -//.word 0x75d35b88 -//.word 0xa1aa0445 -//.word 0x8102519c -//.word 0x06195bd1 -//.word 0xb27956d6 -//.word 0xfcc916c1 -//.word 0xf6e8d27e -//.word 0x2d3d29c1 -//.word 0xd048623f -//.word 0x157df81e -//.word 0xd95356aa -//.word 0x8798df49 -//.word 0x3a0731b1 -//.word 0x261cab58 -//.word 0x34272d2c -//.word 0xeca01e85 -//.word 0x98bab458 -//.word 0xa63a6fad -//.word 0x4f8ae753 -//.word 0x7609c8d2 -//.word 0xd3a61ba1 -//.word 0x50adc799 -//.word 0xb3e057aa -//.word 0x7ecafdcd -//.word 0x1350d739 -//.word 0x1c8972da -//.word 0x2ad08dff -//.word 0x9c171f53 -//.word 0xc37e9b0e -//.word 0x4424726c -//.word 0xbd3cd95f -//.word 0xab64ce80 -//.word 0x8b33554c -//.word 0x3f11088d -//.word 0xb44cce16 -//.word 0xc268ebb3 -//.word 0x53b63960 -//.word 0xc828b4b9 -//.word 0x98633cb2 -//.word 0x3a169788 -//.word 0x468ab6f8 -//.word 0xd77b39ae -//.word 0x33273500 -//.word 0xaea434dc -//.word 0xcb767dff -//.word 0xa5619668 -//.word 0x8d7c080d -//.word 0xf58762cc -//.word 0x8d7e80a4 -//.word 0xab6e0d25 -//.word 0xf0884725 -//.word 0x297402b5 -//.word 0x73e8f054 -//.word 0xa3781f62 -//.word 0xe4b0c3d7 -//.word 0xa2603634 -//.word 0xa7373dba -//.word 0x84938dda -//.word 0x33988eee -//.word 0xfa805e26 -//.word 0x923119c5 -//.word 0x8915588d -//.word 0xe526f777 -//.word 0x0a481ca8 -//.word 0xdedc74a1 -//.word 0x2a92c0b6 -//.word 0x447e91c1 -//.word 0xeb6f4f17 -//.word 0x727c80bb -//.word 0x21df47d2 -//.word 0xd8072b57 -//.word 0xf5e81a10 -//.word 0x7896aec1 -//.word 0x6512af9f -//.word 0x6a63d807 -//.word 0xc2e9de70 -//.word 0x59efae9f -//.word 0x317ff61a -//.word 0x047ae8de -//.word 0x2be83b54 -//.word 0xbe8c7282 -//.word 0xfdbb607e -//.word 0xee6fec29 -//.word 0x48981219 -//.word 0x90b22ad7 -//.word 0x829c6d4b -//.word 0xb2a8b574 -//.word 0x73ef845d -//.word 0xf8e7484c -//.word 0xb937dd3c -//.word 0x18c9548d -//.word 0x4521f3fb -//.word 0x5fee7ccd -//.word 0xdcdfb34e -//.word 0x2ab81a81 -//.word 0x96a5ff11 -//.word 0x6eceb887 -//.word 0x622b2ebf -//.word 0x309a989d -//.word 0x812f89fc -//.word 0x0dcb2de7 -//.word 0x06f0cf0c -//.word 0xb4d39f6d -//.word 0x5db3b359 -//.word 0x676a4b9b -//.word 0xc04259f1 -//.word 0x7e0941c0 -//.word 0xc368dd05 -//.word 0xe470c48f -//.word 0xca76cc6c -//.word 0x9821cda1 -//.word 0x8dc1a81e -//.word 0x2de288f0 -//.word 0x9b2268b9 -//.word 0x4a3fd65d -//.word 0xd474f6ff -//.word 0x2a06c92c -//.word 0xee1aaf55 -//.word 0x1dc92b83 -//.word 0xf176e746 -//.word 0x065ff8ee -//.word 0xbb7362fe -//.word 0xdb64dfde -//.word 0x7dfcdcd0 -//.word 0x28b4c525 -//.word 0x3b8382b1 -//.word 0x8cf4427c -//.word 0x507b7780 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x000123B8 -//// expected output -//.word 0xabdeca34 -//.word 0xf0dfd5d9 -//.word 0x097f0ea9 -//.word 0xe44263d1 -//.word 0x7d93c6e0 -//.word 0x2372c2e8 -//.word 0x896e8bd8 -//.word 0xc32957ea -//.word 0x39055a95 -//.word 0x6e4f803e -//.word 0xa2a34116 -//.word 0x6a87edb9 -//.word 0x1cf0adb7 -//.word 0x58fd39ea -//.word 0xe9438d0b -//.word 0x2cb2cd39 -//// SHA512LongMsgvector_94 -//// vector length -//.word 0x000126D0 -//// input message -//.word 0x03405c03 -//.word 0xce1a5d8f -//.word 0xb4030f73 -//.word 0x596050e5 -//.word 0xabba9945 -//.word 0x141cd6a6 -//.word 0xf4bd7489 -//.word 0x4edfbbeb -//.word 0xc2f75e83 -//.word 0xbb0e5045 -//.word 0xe967da2a -//.word 0xf262eb33 -//.word 0x64a0afac -//.word 0xef6862ae -//.word 0xd14a67e7 -//.word 0x9102949d -//.word 0xf09fd1f1 -//.word 0x1de4e161 -//.word 0x28ee7f91 -//.word 0xb917ad4b -//.word 0x021b49c4 -//.word 0xf279e121 -//.word 0xab1cc839 -//.word 0x373b699d -//.word 0x767edcd6 -//.word 0x5b62b7ed -//.word 0x58de2731 -//.word 0x17473f34 -//.word 0x6b718f17 -//.word 0x8617f907 -//.word 0x6c7cc008 -//.word 0xa853e2f1 -//.word 0x3ddca8b8 -//.word 0xdf517bf0 -//.word 0x6380f990 -//.word 0x75b948f6 -//.word 0x89eaaa2c -//.word 0x14095269 -//.word 0xfbb277db -//.word 0x4b12a6a3 -//.word 0x2c035c22 -//.word 0x1078d473 -//.word 0x301c1e38 -//.word 0x3936719a -//.word 0x42d0c28b -//.word 0x0218954e -//.word 0x4006143a -//.word 0x8a3f5ebb -//.word 0x2a3a2199 -//.word 0x56a16b7d -//.word 0xa7fabdb1 -//.word 0xcd866227 -//.word 0x8069febd -//.word 0xb90c6abf -//.word 0x23c0bfad -//.word 0xcca4b13f -//.word 0x21c81fa7 -//.word 0x1992e716 -//.word 0xb061ff81 -//.word 0x9771c2a5 -//.word 0x2aff8749 -//.word 0xa2ad78c3 -//.word 0x8c27a2bd -//.word 0x7a074839 -//.word 0xf8f67dd3 -//.word 0xc114f246 -//.word 0x339b0c32 -//.word 0x01bf391d -//.word 0x28d885b7 -//.word 0x24c26862 -//.word 0x6384e2f1 -//.word 0xfa31cab0 -//.word 0x970c64a5 -//.word 0xb6ef3116 -//.word 0x18ee0b4c -//.word 0x71377196 -//.word 0x623c1f90 -//.word 0xa615e1a4 -//.word 0x901faad2 -//.word 0xb5eae0ad -//.word 0xe652fba6 -//.word 0x61eb4e8d -//.word 0x47a32455 -//.word 0x51a20f18 -//.word 0xbf757d5a -//.word 0x926c8c92 -//.word 0xfb4020e7 -//.word 0x13f93237 -//.word 0xcc0f6b5d -//.word 0x28d0f1b4 -//.word 0xa90181d7 -//.word 0x08c8beab -//.word 0x2acac8a0 -//.word 0x4f901133 -//.word 0x8d2f6cb8 -//.word 0x7d286756 -//.word 0x348ddb53 -//.word 0x7465c191 -//.word 0x24524759 -//.word 0xfe712458 -//.word 0x888228e7 -//.word 0x45491790 -//.word 0x2c33b7cd -//.word 0x593d2812 -//.word 0x0312740e -//.word 0xae73672f -//.word 0xa1dca164 -//.word 0x9b65e926 -//.word 0xc2e6c4b9 -//.word 0xdc5e46af -//.word 0xc19629af -//.word 0x10011c74 -//.word 0x22e75d18 -//.word 0x3cc28a93 -//.word 0x09e9b57f -//.word 0x476bb61e -//.word 0xc03ec59d -//.word 0x7c99489a -//.word 0x359ee9e5 -//.word 0x0b3cec83 -//.word 0x7954bff9 -//.word 0x881ad3c7 -//.word 0x42bfab32 -//.word 0x6a4d3346 -//.word 0x6ad2521c -//.word 0x8dc0c259 -//.word 0x6e9420f7 -//.word 0xb1b63f48 -//.word 0xf0a0c237 -//.word 0xf843ead2 -//.word 0x36a6ac05 -//.word 0x6cd107a8 -//.word 0xa8e994bd -//.word 0x779c5ff2 -//.word 0x56c0f56e -//.word 0x6936bec9 -//.word 0x70158d5c -//.word 0xf60476bc -//.word 0xcbe8e081 -//.word 0xb5c0da4c -//.word 0x63ccb308 -//.word 0xa2f5c46f -//.word 0xd46991d0 -//.word 0x9d861110 -//.word 0xdff949f0 -//.word 0xe927208d -//.word 0xebcc6e2d -//.word 0xade15638 -//.word 0x81c4d685 -//.word 0x77939cd7 -//.word 0xcfd81ba8 -//.word 0xb46cdf25 -//.word 0x27951d79 -//.word 0x39728f4e -//.word 0x7d997e91 -//.word 0xbdfe2176 -//.word 0xec1725bd -//.word 0x5c3d8d33 -//.word 0x3156bc7b -//.word 0x16b1d00e -//.word 0x2e313281 -//.word 0x4dae6b07 -//.word 0x69983a36 -//.word 0x4bdde30e -//.word 0x8a0dc937 -//.word 0xbabd3f8a -//.word 0xe1299cd3 -//.word 0x2a1d8dd5 -//.word 0xde15b08f -//.word 0x8fa35ebe -//.word 0x9711c8a3 -//.word 0xc1474506 -//.word 0x45f0ea7b -//.word 0xfad95ce4 -//.word 0xc799e237 -//.word 0x5a77be82 -//.word 0x1d88be2c -//.word 0x66180e7d -//.word 0xef4b5060 -//.word 0x8504ee68 -//.word 0x0406af12 -//.word 0x825a894a -//.word 0xcbf0b730 -//.word 0x0e890b1b -//.word 0xd5d384de -//.word 0x3ad6234b -//.word 0x5890fbf6 -//.word 0x01dc883c -//.word 0xaf994183 -//.word 0xbc0770c2 -//.word 0xd5744245 -//.word 0xac191aaa -//.word 0xed3f2b30 -//.word 0x74a64631 -//.word 0xbd26f0ec -//.word 0x9b97b888 -//.word 0x2defc856 -//.word 0x0eaab957 -//.word 0xcd6facfe -//.word 0x9df09636 -//.word 0x4d12dba7 -//.word 0x7a4e1f35 -//.word 0x035658ca -//.word 0xbdfc2856 -//.word 0x68506b14 -//.word 0xe2090c0e -//.word 0x9b271ce3 -//.word 0x49d625c8 -//.word 0xdd94bbcd -//.word 0xb5965562 -//.word 0x13685b19 -//.word 0xced580ad -//.word 0x47065244 -//.word 0x9fee0ff1 -//.word 0x27e5bb7d -//.word 0x18926f67 -//.word 0x850ff429 -//.word 0x8d4891bd -//.word 0xd5a42060 -//.word 0x36e86796 -//.word 0xb258a66e -//.word 0xad1f6d07 -//.word 0x59f0b053 -//.word 0x73ee1d1b -//.word 0x2dc9ad43 -//.word 0x6b2a7a50 -//.word 0x3152d027 -//.word 0x5cfe8617 -//.word 0x918d8f1a -//.word 0x7464cc58 -//.word 0x1a9224ed -//.word 0xc0b0d7ec -//.word 0xbd0b0fa4 -//.word 0xb506b922 -//.word 0x10b992f7 -//.word 0xaade853b -//.word 0xccee34d1 -//.word 0x5c87d5ed -//.word 0x50113fd4 -//.word 0x68a144e3 -//.word 0x1d1d42d3 -//.word 0xd5a2f53b -//.word 0x58228f56 -//.word 0x87520b07 -//.word 0x4cc3be1a -//.word 0xcd4e2fcd -//.word 0xe5b6288f -//.word 0xd4890d07 -//.word 0x35476d58 -//.word 0x31c6d7a4 -//.word 0xf3d5efcf -//.word 0x5b20c085 -//.word 0xf754547e -//.word 0x2f838200 -//.word 0xbfc908a6 -//.word 0x6b30da61 -//.word 0xedd1b9bc -//.word 0x333c0664 -//.word 0xc71ad9e7 -//.word 0x8f114ebc -//.word 0xb6e81f84 -//.word 0xeaec788f -//.word 0xc89206a2 -//.word 0x945d52f7 -//.word 0x2e024d86 -//.word 0x41cb2b83 -//.word 0xbe397528 -//.word 0x89ed5ab4 -//.word 0x72c847b4 -//.word 0x6652b781 -//.word 0xe6584b0a -//.word 0xb9da1dd3 -//.word 0xde24523e -//.word 0xc53aee0a -//.word 0xbf79ec19 -//.word 0xb27c8f76 -//.word 0x113df396 -//.word 0x0b7ce7de -//.word 0x0365ff66 -//.word 0x416de4fd -//.word 0xe77def6d -//.word 0x2652f600 -//.word 0xb1246642 -//.word 0x72859209 -//.word 0x7d8d4bb3 -//.word 0x4234b1af -//.word 0x06ff483f -//.word 0x94df4f7b -//.word 0x2f564d9a -//.word 0xccdbec6d -//.word 0x7e800a2c -//.word 0x32d20e75 -//.word 0x9c007892 -//.word 0x7140bdfb -//.word 0xd76f511b -//.word 0x1af70557 -//.word 0xa0f6934d -//.word 0x1f9d7759 -//.word 0x0dd6015e -//.word 0x5829a9c3 -//.word 0x58e0a2bb -//.word 0x0269b2ca -//.word 0x5efd4085 -//.word 0x3b7faf99 -//.word 0x21a7ea0e -//.word 0x875f40cd -//.word 0x466d7360 -//.word 0x4e530bfa -//.word 0x9773f0b7 -//.word 0x5b773824 -//.word 0x83f03e02 -//.word 0x5f3df447 -//.word 0x99af7a66 -//.word 0x6cebefd0 -//.word 0x118f87bb -//.word 0x7a18dd22 -//.word 0x43038b0d -//.word 0xe632f912 -//.word 0x2e92721c -//.word 0xeefb7d6b -//.word 0xf2576adc -//.word 0x36072b6b -//.word 0x568265f6 -//.word 0x463fc744 -//.word 0x43d69b45 -//.word 0x09629a9b -//.word 0x4729055a -//.word 0x507ff10c -//.word 0x13e7e3f9 -//.word 0x4d7c9ca5 -//.word 0xfd8f3699 -//.word 0x19927066 -//.word 0x7f3447e8 -//.word 0x2ecec6c8 -//.word 0xb6fe1e44 -//.word 0xed91f933 -//.word 0xe4a70c43 -//.word 0x1911eb86 -//.word 0xeefe222d -//.word 0x5ad78193 -//.word 0xdf67b77d -//.word 0xbc3f23a0 -//.word 0x6359e663 -//.word 0x2dfb3de7 -//.word 0x4dde0e44 -//.word 0x0390c016 -//.word 0x12175039 -//.word 0x73d7a1d0 -//.word 0x4bb6148c -//.word 0x1b7d592b -//.word 0x3681853e -//.word 0x79846430 -//.word 0x36d61084 -//.word 0x71bfc25e -//.word 0x4f22e945 -//.word 0xcb5a7927 -//.word 0xab68869d -//.word 0xb2501171 -//.word 0x18c0225e -//.word 0x37f31716 -//.word 0x87d53b8a -//.word 0xcc689a65 -//.word 0x8e6614d9 -//.word 0xca28b19f -//.word 0xe7c63439 -//.word 0xeb80f37b -//.word 0xef5ce549 -//.word 0xd111fda2 -//.word 0x2824b6de -//.word 0x7d51f033 -//.word 0xb82cfa7e -//.word 0xd808f040 -//.word 0xe71847e7 -//.word 0x2dd4a650 -//.word 0xa59ef789 -//.word 0xada6bfdb -//.word 0x010baa08 -//.word 0xea436bd1 -//.word 0xb3bcc2bb -//.word 0x5dc3de13 -//.word 0x94a6e630 -//.word 0xe115d3f8 -//.word 0x20ce80a6 -//.word 0x357a04ca -//.word 0xfbd13f90 -//.word 0x7d05b346 -//.word 0x695e9519 -//.word 0xc121241f -//.word 0xd4b73a9b -//.word 0x6d0b217c -//.word 0x4a34a726 -//.word 0xcf547575 -//.word 0xfcc09cff -//.word 0x9d61719a -//.word 0xc05a9b1f -//.word 0x6cea6a6d -//.word 0x90946bb0 -//.word 0x3a7e39e3 -//.word 0x09189593 -//.word 0xe5fdb9e6 -//.word 0xed1eeadd -//.word 0xb11d4dd6 -//.word 0xa2f7fb55 -//.word 0xc7e65703 -//.word 0xb186a0f7 -//.word 0xb036c235 -//.word 0x47c17274 -//.word 0xde3e7925 -//.word 0xb73450b0 -//.word 0x2302ee01 -//.word 0xf67ede43 -//.word 0x38dd94eb -//.word 0x1dd301f9 -//.word 0x37fa657a -//.word 0xeb786552 -//.word 0x22dd5d38 -//.word 0x404af702 -//.word 0x5ad8fd23 -//.word 0xa4376b72 -//.word 0x2896c92d -//.word 0xbec3b73d -//.word 0x3894cabb -//.word 0xdd8596b4 -//.word 0x19a20c29 -//.word 0x72a8075a -//.word 0xbe672145 -//.word 0x936acb69 -//.word 0x00da9dcf -//.word 0x7aa0ea4b -//.word 0x19ca9800 -//.word 0x05302e22 -//.word 0x2b572f00 -//.word 0x3495a741 -//.word 0xb776036d -//.word 0xad5f25b0 -//.word 0x2671b8db -//.word 0x3bb0c1ac -//.word 0x4465774f -//.word 0x4bc15524 -//.word 0xc0c26dc3 -//.word 0x6d5bff3e -//.word 0xadcf4aa6 -//.word 0xd95ea2d0 -//.word 0x0423c358 -//.word 0xe83d65e7 -//.word 0x1f2d11b2 -//.word 0x977f3243 -//.word 0x40ad6f7c -//.word 0x074038d9 -//.word 0x08389ff5 -//.word 0xffae6a50 -//.word 0x00b8664f -//.word 0x698dfe84 -//.word 0x14e90b30 -//.word 0xd1b3ee06 -//.word 0x13dedd32 -//.word 0xe98d7a9a -//.word 0x307aaa64 -//.word 0x0898a4b8 -//.word 0x84f748c7 -//.word 0xa6e8b30c -//.word 0x8a6310d1 -//.word 0xe1a5b0f6 -//.word 0xa11d5eee -//.word 0xfb89ec0a -//.word 0x8e5d12fa -//.word 0xda647991 -//.word 0xf7a912c8 -//.word 0x8698ac06 -//.word 0xe961c69e -//.word 0xaf9da199 -//.word 0x52349ab7 -//.word 0x257eb7b0 -//.word 0x88a880bf -//.word 0x5e5a1061 -//.word 0xc1966b5b -//.word 0xf4e412fa -//.word 0x98acd59e -//.word 0x23e3e97a -//.word 0x8fe93a95 -//.word 0x4fb20214 -//.word 0x87259bbc -//.word 0x7cc192b3 -//.word 0x4a86fc86 -//.word 0xd5130d70 -//.word 0x010ce6da -//.word 0x26beaf1e -//.word 0xbe06e690 -//.word 0x616ef6bf -//.word 0xf49a0cf8 -//.word 0x1de3260c -//.word 0xf9416d53 -//.word 0x126ec4f1 -//.word 0x8b48a158 -//.word 0x9e781b0f -//.word 0x495145b1 -//.word 0x43fabb38 -//.word 0x35d07a7b -//.word 0x2706f5f6 -//.word 0x388e65ca -//.word 0x933d6004 -//.word 0x9e2aad22 -//.word 0x755757d4 -//.word 0x969300ff -//.word 0xde9e7807 -//.word 0xb48f8e4e -//.word 0x847326f8 -//.word 0x6f378cf2 -//.word 0x40c80832 -//.word 0xa278b340 -//.word 0x91a488f5 -//.word 0x0f93be82 -//.word 0x18a256b5 -//.word 0xd79ef078 -//.word 0x1a72e29b -//.word 0x04028bd3 -//.word 0x0156e502 -//.word 0xfffb5ab8 -//.word 0xdca6d9fa -//.word 0x1a1b2843 -//.word 0xda4d7cc9 -//.word 0x08c74701 -//.word 0xd34a5165 -//.word 0x60b80a75 -//.word 0xbf301ffc -//.word 0x1e7b4b94 -//.word 0x3ca7706c -//.word 0x21f1e649 -//.word 0x0de912cb -//.word 0xaed03bf2 -//.word 0x95459ae0 -//.word 0xeb21b0e1 -//.word 0x609fdda8 -//.word 0x65c02ddc -//.word 0x9bed75d3 -//.word 0x8bde9f9d -//.word 0x97bc4244 -//.word 0x30827652 -//.word 0x4aa9e694 -//.word 0x0d04261e -//.word 0xcee9478f -//.word 0x3d91a996 -//.word 0xe0c111b5 -//.word 0xc0aafb45 -//.word 0x620f32bb -//.word 0xf8a59d29 -//.word 0xd9bf5c08 -//.word 0x2f2a1434 -//.word 0xef568638 -//.word 0x0fb767cc -//.word 0xf36b6b9c -//.word 0x281da44b -//.word 0x54290ab8 -//.word 0x6d015b80 -//.word 0x2acf25c4 -//.word 0xb75c202c -//.word 0xad30c22b -//.word 0x41fb0e85 -//.word 0xbc33ad0f -//.word 0x2bff3fb6 -//.word 0x5754f3c3 -//.word 0xf75d555e -//.word 0x25216850 -//.word 0x0f60f50d -//.word 0xefbd22f1 -//.word 0x3d2346ca -//.word 0x2261fc97 -//.word 0x3117778f -//.word 0x52d61565 -//.word 0xfe8336cb -//.word 0xb2fc4e35 -//.word 0x9dfe39df -//.word 0x9c47cf11 -//.word 0x69f7b9a2 -//.word 0x103c83bb -//.word 0xa22ef1dd -//.word 0x2cf89725 -//.word 0xea39a4cf -//.word 0xb9aafffa -//.word 0xcb0095aa -//.word 0x9e14f113 -//.word 0x2f410d15 -//.word 0x6b0d6703 -//.word 0xe60c58a8 -//.word 0xcf02a18c -//.word 0x24484773 -//.word 0x2271a227 -//.word 0x002cb077 -//.word 0xdc6caf80 -//.word 0xf6c7ea2b -//.word 0x1c1cd3f7 -//.word 0x657952f9 -//.word 0x223c5d21 -//.word 0x1278c9be -//.word 0xd59a5f44 -//.word 0xa34c334d -//.word 0x3e9931df -//.word 0x2552f9ed -//.word 0x0bb1ed20 -//.word 0x873d87d7 -//.word 0x0dedf16c -//.word 0x1d90cfb9 -//.word 0xba6c5fda -//.word 0x1e26c535 -//.word 0xace2a0b8 -//.word 0x26aae162 -//.word 0x2014dd05 -//.word 0xb51fa14a -//.word 0x785f85f5 -//.word 0xad5a046a -//.word 0xba31ca70 -//.word 0xd8830f36 -//.word 0x0e8e2494 -//.word 0x60974b92 -//.word 0x448ccc2e -//.word 0x55e9455a -//.word 0x4bd84245 -//.word 0x2b9c0ddb -//.word 0xbb2fc88f -//.word 0x392ab858 -//.word 0x4ce6e4f9 -//.word 0x3be1df86 -//.word 0x5d63e224 -//.word 0xd1611d10 -//.word 0x6ea14fe3 -//.word 0xfd1f9514 -//.word 0xa6b07fbe -//.word 0xa9e569a3 -//.word 0x4f320972 -//.word 0x1f4f4445 -//.word 0x54df466e -//.word 0x8f50d173 -//.word 0xca02d557 -//.word 0x8dab421b -//.word 0x64fa1a85 -//.word 0x907aca20 -//.word 0xfdbaba84 -//.word 0x74ab23d7 -//.word 0x12492194 -//.word 0xf97d098b -//.word 0x4542fc2a -//.word 0x4208bcfa -//.word 0xdc55bf6c -//.word 0x56b282d6 -//.word 0x3fc520b9 -//.word 0xa2bb2345 -//.word 0x7ee99a1f -//.word 0x75b26c61 -//.word 0xc8abebe3 -//.word 0x83fdacb9 -//.word 0xf50b97fc -//.word 0x63553ace -//.word 0xfe9c6298 -//.word 0x1148ed96 -//.word 0x7f06da96 -//.word 0x6db5a2fc -//.word 0x3c83cb0a -//.word 0xba53ba5e -//.word 0x9963c9bc -//.word 0x202b990e -//.word 0x2088aaa9 -//.word 0x2a1928d2 -//.word 0xffe90881 -//.word 0x484f5465 -//.word 0x8713c327 -//.word 0x4ed28df3 -//.word 0xafa47d35 -//.word 0xf3fb48a0 -//.word 0x8ecf1d75 -//.word 0x53f87d02 -//.word 0xe5db4d69 -//.word 0x6e482aa2 -//.word 0x93a3fcc3 -//.word 0xa742ce7f -//.word 0x1e17dded -//.word 0x458fee8b -//.word 0x31b9e583 -//.word 0xf5ab942d -//.word 0x1922d1d4 -//.word 0x4768cbbd -//.word 0x467b9e65 -//.word 0x2d6b240b -//.word 0xd0040e6e -//.word 0x7fad34d8 -//.word 0xf0902a5b -//.word 0x79fb145b -//.word 0x8206bb4d -//.word 0x3b77e0bd -//.word 0x8ae2d096 -//.word 0x4815389e -//.word 0xacb33b40 -//.word 0x071ec28e -//.word 0xb29a1386 -//.word 0x45b0a694 -//.word 0x0ad13359 -//.word 0xb23c10ab -//.word 0x4622badd -//.word 0x6007b240 -//.word 0x9a6b8ae9 -//.word 0x47aa3fb5 -//.word 0x6121c98b -//.word 0xc392f1e1 -//.word 0x98c96382 -//.word 0x1480048e -//.word 0x628185c2 -//.word 0xdd0a39f9 -//.word 0x827523f3 -//.word 0xa5185456 -//.word 0xe46b74f2 -//.word 0x5a689e49 -//.word 0x1538714f -//.word 0xc90b636e -//.word 0xc54859cd -//.word 0x27e675d2 -//.word 0x4c192fe6 -//.word 0x8b32a878 -//.word 0x23c03a44 -//.word 0x71fc54d5 -//.word 0x67648548 -//.word 0x39a5d654 -//.word 0x59be5d87 -//.word 0xa6630fd2 -//.word 0xe19fd648 -//.word 0x60bee423 -//.word 0x066a4608 -//.word 0x7214bc8c -//.word 0x7796c8f6 -//.word 0xcc160546 -//.word 0x052dba77 -//.word 0xc248af02 -//.word 0x274f3fa3 -//.word 0x8c85af5f -//.word 0x75b0bec6 -//.word 0xc4797d76 -//.word 0x2d1561e0 -//.word 0xeb25974f -//.word 0xb1db9726 -//.word 0xe45ffc68 -//.word 0x0771937e -//.word 0x774fb235 -//.word 0x58d9cb07 -//.word 0xcff3409b -//.word 0x712b798f -//.word 0xfc9c3574 -//.word 0x45111d1a -//.word 0x726e9f0e -//.word 0x694cf962 -//.word 0x89e494ac -//.word 0x972e9451 -//.word 0xfb4aad04 -//.word 0x2c1e3889 -//.word 0x694186bf -//.word 0xaa1774dd -//.word 0xd63e3ffc -//.word 0x36299ad6 -//.word 0x2a0bfecd -//.word 0x1af7422f -//.word 0xb0456bb8 -//.word 0x4437c558 -//.word 0x98dd3337 -//.word 0xc635c3f7 -//.word 0x76978539 -//.word 0x54509e62 -//.word 0xc28e989f -//.word 0xc97cfc26 -//.word 0x56ad23bf -//.word 0xa3be4983 -//.word 0xf337e3e4 -//.word 0x82b332ee -//.word 0xbc4119cd -//.word 0xad092c8e -//.word 0xb933092a -//.word 0x8d04ebc0 -//.word 0x554a7c22 -//.word 0x2ffbeb93 -//.word 0xe0193fcf -//.word 0xc7d8eb4c -//.word 0x0f03a2c0 -//.word 0x289c6ce3 -//.word 0x77c3fa76 -//.word 0x4cd83684 -//.word 0x15e41fe8 -//.word 0xd235d40f -//.word 0xc949eeff -//.word 0x7bee1398 -//.word 0xd6a6c91a -//.word 0xac5087e8 -//.word 0x6405128c -//.word 0xf04107fa -//.word 0xff43b319 -//.word 0x73b62b7f -//.word 0x1590997c -//.word 0x873bd55b -//.word 0x7bf335e4 -//.word 0x236fa526 -//.word 0xe8c3fa73 -//.word 0x5f8583ab -//.word 0x792ee1be -//.word 0xfac4196c -//.word 0x2cb6e84f -//.word 0xd408571c -//.word 0x65af8e26 -//.word 0x743fed23 -//.word 0x6cc35933 -//.word 0x83ecd41e -//.word 0xec6f51dd -//.word 0x4ea8c65d -//.word 0x7683827f -//.word 0x499cc163 -//.word 0xfca57ee6 -//.word 0x87098869 -//.word 0x56ced8d5 -//.word 0x42c022db -//.word 0xc1ccaa81 -//.word 0x59aa59da -//.word 0x5bbf1014 -//.word 0xcd413cb9 -//.word 0xa89cab2e -//.word 0x44149e80 -//.word 0x10ac1f5f -//.word 0x8647946b -//.word 0x5e0e95af -//.word 0x0211fb6b -//.word 0x43313917 -//.word 0x4a3df0a4 -//.word 0xd15bbd05 -//.word 0x93aa56ee -//.word 0x0025d5dc -//.word 0x36cb5355 -//.word 0x2dfdb971 -//.word 0x3127d399 -//.word 0x96a2a68f -//.word 0xa7d904ae -//.word 0xdfab5d74 -//.word 0x5c11d83d -//.word 0x9001a251 -//.word 0x3a928621 -//.word 0x9460bfce -//.word 0xce320aeb -//.word 0xbcdaff84 -//.word 0xcc5da05f -//.word 0x3a543381 -//.word 0x87924df4 -//.word 0x270730c8 -//.word 0x7ae45658 -//.word 0xfd004ecf -//.word 0xc27bc7ea -//.word 0x1da1ebff -//.word 0xa111ee3e -//.word 0x4a1ee637 -//.word 0xfc75dd9c -//.word 0x2c002448 -//.word 0xdd0beb81 -//.word 0xcfa60f7a -//.word 0xf34a331c -//.word 0x21bf1206 -//.word 0x0d3c13d3 -//.word 0x78d11f9b -//.word 0xa302afbc -//.word 0x09b529da -//.word 0x4d4e6c24 -//.word 0x7218a9d9 -//.word 0x4ae7760b -//.word 0x31fb1da4 -//.word 0xfb283aa6 -//.word 0x2a3485b7 -//.word 0x6481ecdc -//.word 0x25ebe585 -//.word 0xb2f402ca -//.word 0x4e1fc5f4 -//.word 0xaf99b73f -//.word 0xb31eb4de -//.word 0x501b8940 -//.word 0xc910c192 -//.word 0x2839bb85 -//.word 0xe86d0051 -//.word 0xf246d4fa -//.word 0xcb820bd1 -//.word 0x0ba91e3f -//.word 0x11f07ebe -//.word 0xf55e2828 -//.word 0xbe2d7a34 -//.word 0xd573453d -//.word 0xba022346 -//.word 0xf68c0b3c -//.word 0x510b227a -//.word 0x445fd493 -//.word 0xb139244b -//.word 0xd23940e6 -//.word 0x705359a6 -//.word 0x5577b18f -//.word 0x0371f66d -//.word 0xa60ece18 -//.word 0x4880b3f7 -//.word 0x440301c3 -//.word 0xfdc14d8d -//.word 0xcff3f903 -//.word 0x464a05ef -//.word 0x8e8d2800 -//.word 0x2b8320cd -//.word 0xea134617 -//.word 0x18aa654e -//.word 0xf1ddcc57 -//.word 0x5b50a28d -//.word 0xd5d67a06 -//.word 0xaad92717 -//.word 0x6afdd21a -//.word 0x9a004a6e -//.word 0xabe59ac0 -//.word 0x2951e189 -//.word 0x35355ed8 -//.word 0x35adcb52 -//.word 0xca28ec77 -//.word 0x03ca6727 -//.word 0xd00ed664 -//.word 0xb9b01b59 -//.word 0xcfcaf39b -//.word 0xe33dcfb0 -//.word 0xf752dfce -//.word 0xf2a16fe4 -//.word 0x983276df -//.word 0xb8e36c26 -//.word 0xa7095d66 -//.word 0xee5a3c95 -//.word 0x400b7931 -//.word 0xaf35d5c9 -//.word 0x1f7d76bf -//.word 0xfaf4364c -//.word 0x253c41c4 -//.word 0x33eddf1c -//.word 0xd9368ea9 -//.word 0xa2c8542a -//.word 0xe4ef5309 -//.word 0xf3029ede -//.word 0x94fe4b35 -//.word 0xb56eca91 -//.word 0x5b8e75b1 -//.word 0xdbaf6711 -//.word 0x4ddd92b4 -//.word 0x3ec00c21 -//.word 0xa5c0aaac -//.word 0x186cd0f6 -//.word 0x401d87b7 -//.word 0x8bd6d0bb -//.word 0x206f392b -//.word 0x18f3ad0e -//.word 0xeb46900f -//.word 0x280b0c81 -//.word 0x6ac4a5a0 -//.word 0x873b141a -//.word 0x0a2252ce -//.word 0xe4f6f3d3 -//.word 0x5e29b5bc -//.word 0x527f591a -//.word 0x9bb9b143 -//.word 0xca71fb52 -//.word 0x1a456d6f -//.word 0xa7371151 -//.word 0xda54d300 -//.word 0x2894d9e0 -//.word 0xfc0212eb -//.word 0xf11c123e -//.word 0x457d1dd7 -//.word 0x8bb9819d -//.word 0x9f8929a0 -//.word 0xdf2870a3 -//.word 0x98fc33d8 -//.word 0xbf792aea -//.word 0xe2437840 -//.word 0x5d928081 -//.word 0xd1dbfb53 -//.word 0xd2ad4769 -//.word 0xe0d902bc -//.word 0x99d5d818 -//.word 0x2c6299db -//.word 0x116d8ffa -//.word 0xf8330e44 -//.word 0xffa94ceb -//.word 0x271b7340 -//.word 0x0913f5be -//.word 0xc57c204a -//.word 0x3c07f2b9 -//.word 0x7fce2e93 -//.word 0x8638af16 -//.word 0x261cfd7e -//.word 0x3d291e84 -//.word 0x3085af25 -//.word 0x97b433a4 -//.word 0x36bcaad2 -//.word 0x3086668d -//.word 0x77881a87 -//.word 0x87a13449 -//.word 0x54446c77 -//.word 0x80d99d55 -//.word 0xd260d48a -//.word 0xe458a724 -//.word 0x1bdfc9dd -//.word 0xdc1adb9c -//.word 0xfdd7843f -//.word 0x7a71c398 -//.word 0x6af484b5 -//.word 0x31827265 -//.word 0xf6f60df7 -//.word 0x58c6fc45 -//.word 0x5c2ea4f2 -//.word 0xaa8bf9ef -//.word 0xfa059444 -//.word 0xc970070d -//.word 0x50746dc2 -//.word 0xb6ec45bc -//.word 0x858d80f5 -//.word 0x5bc8d810 -//.word 0xe2f16499 -//.word 0x01a0698d -//.word 0x5458741d -//.word 0xda66a5af -//.word 0xee0c4e26 -//.word 0x79dfbd63 -//.word 0x656e550b -//.word 0x5524e48b -//.word 0x9370305a -//.word 0x4922d37e -//.word 0xf5194952 -//.word 0x171b4886 -//.word 0x2c044f67 -//.word 0xe0238261 -//.word 0x80e1b5c2 -//.word 0xaea3c7c0 -//.word 0x58f231be -//.word 0xebdadecb -//.word 0xc38f3e6c -//.word 0xe757969b -//.word 0xf3a39a0f -//.word 0x557f3dbe -//.word 0xbc2dc8a1 -//.word 0xce0d29b7 -//.word 0x1ac18e4c -//.word 0x4d8d337b -//.word 0xa80478f2 -//.word 0xb1e137f5 -//.word 0x293354a6 -//.word 0x3fbd9683 -//.word 0x039cb530 -//.word 0x1d2ab477 -//.word 0xbf23708d -//.word 0xd8067a96 -//.word 0x8bbe226c -//.word 0xdf82d49c -//.word 0xb8faa8b2 -//.word 0x06a334b7 -//.word 0x3c74a5f7 -//.word 0x04c20e08 -//.word 0x3061ff07 -//.word 0xf40c5a25 -//.word 0x53066262 -//.word 0xd8021599 -//.word 0x8641bcbd -//.word 0x11fac062 -//.word 0x4ffebf7f -//.word 0xe99cdf72 -//.word 0x56c26244 -//.word 0x0a667b2f -//.word 0xea24605d -//.word 0x0429a1f3 -//.word 0x7d4fb84e -//.word 0xca89e18c -//.word 0x23822c4f -//.word 0x3581d0bd -//.word 0x1890c2cc -//.word 0x80dd86bc -//.word 0x376046e5 -//.word 0xcbbe21b2 -//.word 0x846ec5ee -//.word 0x981a403e -//.word 0xa24813ef -//.word 0x513988f2 -//.word 0x5d114625 -//.word 0xc03923d5 -//.word 0x22023980 -//.word 0x958b3cdf -//.word 0x82e40b23 -//.word 0xe3738480 -//.word 0xb3979de8 -//.word 0xa38cb019 -//.word 0x0f8f17d9 -//.word 0x3042f980 -//.word 0x935163b8 -//.word 0xca569b81 -//.word 0x61fab178 -//.word 0x145d5658 -//.word 0x3eb9f1c1 -//.word 0x9542f038 -//.word 0x15505c70 -//.word 0x3abfb1c7 -//.word 0x7296ec14 -//.word 0xd2e8e5a0 -//.word 0x08f8df72 -//.word 0x91a05ed0 -//.word 0x2cf43902 -//.word 0x8e22ef59 -//.word 0x579d3e70 -//.word 0x457af2b2 -//.word 0xa71afc1c -//.word 0x1509c344 -//.word 0x5f26bf9b -//.word 0xc30443ef -//.word 0x63919a34 -//.word 0xf6f55683 -//.word 0xbdbde563 -//.word 0xb8396548 -//.word 0x1b22b959 -//.word 0xfc80dd76 -//.word 0x4ecb767a -//.word 0x1251aebd -//.word 0xccd73ede -//.word 0x3483ccbf -//.word 0x2ffa78d0 -//.word 0xfdc5b291 -//.word 0xb4f94e52 -//.word 0xed17da3d -//.word 0xbd312f97 -//.word 0xe74e4643 -//.word 0x4f104d88 -//.word 0xb294fa14 -//.word 0x959a2040 -//.word 0x7be68095 -//.word 0x5be6e18f -//.word 0x519463a2 -//.word 0x949e107b -//.word 0xa8c4b488 -//.word 0xd582eeba -//.word 0xd7f0888a -//.word 0xd7e6043a -//.word 0x9a63775d -//.word 0xf9309b99 -//.word 0x91c01fac -//.word 0xbb5b41ad -//.word 0xbf7c9f94 -//.word 0x44774afd -//.word 0x0b5e1d29 -//.word 0xdd264d46 -//.word 0xc20640f0 -//.word 0x7420a3f7 -//.word 0x1363b763 -//.word 0x1ab0ebb5 -//.word 0x923bb070 -//.word 0x863589d8 -//.word 0xb6a861fa -//.word 0x8fa222ec -//.word 0x5b958356 -//.word 0xb6fe2231 -//.word 0x4145d2cf -//.word 0x9ae4361c -//.word 0x8bcc8f23 -//.word 0x8104d2d4 -//.word 0x4094fe04 -//.word 0xd6a1acb5 -//.word 0xcdd9e798 -//.word 0xa5123fd0 -//.word 0x822d19f9 -//.word 0x21414969 -//.word 0x10f6e3b5 -//.word 0x1f2e4d77 -//.word 0x12eb994f -//.word 0x986d1228 -//.word 0x819a15bd -//.word 0x2ba3235b -//.word 0x3de533e8 -//.word 0x980d4d24 -//.word 0x8b80542f -//.word 0x46fa244c -//.word 0x9274dde4 -//.word 0xbf4c7dce -//.word 0xdda0b5cd -//.word 0x2ffaf55a -//.word 0xdc33caa4 -//.word 0xe89169d6 -//.word 0x63338c98 -//.word 0xe0af7cd8 -//.word 0x29f96fca -//.word 0x3187152d -//.word 0x4ab26ed1 -//.word 0x9860de56 -//.word 0xc6e08336 -//.word 0xf715c606 -//.word 0x00d730f8 -//.word 0xd49680a5 -//.word 0x3f40fa09 -//.word 0xd86501cf -//.word 0x319ae8cf -//.word 0x501b06d6 -//.word 0x63b408a5 -//.word 0xafe18b3c -//.word 0xca34eb58 -//.word 0x0af7553a -//.word 0x3d1324aa -//.word 0x9a306a3c -//.word 0xf81eccd2 -//.word 0x3e739462 -//.word 0x1b7601f9 -//.word 0xf73ce100 -//.word 0x291162bf -//.word 0x6a1a261f -//.word 0x893895b4 -//.word 0x612e77fa -//.word 0x0907c2df -//.word 0x4ab2b082 -//.word 0x56f0153b -//.word 0xb670f0db -//.word 0x85374035 -//.word 0xdc4619dd -//.word 0x8d77f62f -//.word 0x14a95193 -//.word 0xca1c7100 -//.word 0x5c1e84bf -//.word 0x7ce8ed72 -//.word 0xd6c3df54 -//.word 0x466f2bc2 -//.word 0x48c456fb -//.word 0xb09aef24 -//.word 0x9be71f8f -//.word 0xa527823c -//.word 0x5c0135a0 -//.word 0xf52731a6 -//.word 0x3e7ed7f4 -//.word 0xd47fcb6f -//.word 0x96dd0601 -//.word 0x5967279a -//.word 0xde310a74 -//.word 0x01ee9c9c -//.word 0x32a1eeae -//.word 0x297588df -//.word 0xd6e8ff41 -//.word 0x972fca43 -//.word 0xaed65177 -//.word 0xf2a84799 -//.word 0xc4ce3acc -//.word 0x453b6826 -//.word 0xc747d56f -//.word 0x81999a26 -//.word 0x864b80c5 -//.word 0xf849cd47 -//.word 0x78fa5ee6 -//.word 0xe223f629 -//.word 0x3708d61e -//.word 0xdbd48ee4 -//.word 0x013a126d -//.word 0x635d1082 -//.word 0x36ed8108 -//.word 0x5d937f81 -//.word 0xdd9056d6 -//.word 0x91a1dd53 -//.word 0x1f2507f3 -//.word 0x2a81b5de -//.word 0xc9c4ce30 -//.word 0x388792fc -//.word 0xce182b91 -//.word 0x2fd785fb -//.word 0xc3df60cd -//.word 0x67e9a41e -//.word 0x626ef4d2 -//.word 0x9a0c851b -//.word 0x082b313e -//.word 0x69e0c79b -//.word 0x3612a6e8 -//.word 0xd7db8abd -//.word 0x1430a555 -//.word 0xccc5f293 -//.word 0xe92bc643 -//.word 0x933ba8a3 -//.word 0xa4b86221 -//.word 0x5c305867 -//.word 0x57231995 -//.word 0xbb6834cd -//.word 0xb6cb4df5 -//.word 0x28fb6fb8 -//.word 0x9ca4a4ce -//.word 0x7dd8c37e -//.word 0x87b38a61 -//.word 0x7b3fec68 -//.word 0x1795ac20 -//.word 0x45452b35 -//.word 0x93f87f36 -//.word 0xe354c497 -//.word 0x6320b7fc -//.word 0xc0a981b5 -//.word 0x9764d084 -//.word 0x2dd42ca7 -//.word 0x5fae8912 -//.word 0xdc3c18fd -//.word 0x91ff639e -//.word 0x65989938 -//.word 0x27e92654 -//.word 0xc477874e -//.word 0xbe125d14 -//.word 0xd9b9c02b -//.word 0x18b8d5f3 -//.word 0xe713a32b -//.word 0x9a2722b7 -//.word 0x168f95a1 -//.word 0xce451a5f -//.word 0xf2098054 -//.word 0xe2075899 -//.word 0xe9b44ffc -//.word 0x28f9bb49 -//.word 0xd09373c9 -//.word 0x95bae409 -//.word 0x5f0061dc -//.word 0x427dbba3 -//.word 0xb02912cc -//.word 0xed89ea99 -//.word 0xc48e8123 -//.word 0x79ba619e -//.word 0xfe8431de -//.word 0x69fed01a -//.word 0xa6b5a5f1 -//.word 0x69d830aa -//.word 0x679de5c0 -//.word 0xc6e13b9e -//.word 0xd20f00a7 -//.word 0xf142ef79 -//.word 0xd9ae8473 -//.word 0x003c0f75 -//.word 0x547408e6 -//.word 0x2da0a2fc -//.word 0x802ea237 -//.word 0x5557722f -//.word 0x7bfe7190 -//.word 0x7adb8e63 -//.word 0xc9d8158f -//.word 0x41bbc89f -//.word 0xd20632c5 -//.word 0x751b381f -//.word 0x61a4f13a -//.word 0x8232b8d5 -//.word 0x27247fe7 -//.word 0xfbcb66e3 -//.word 0x36cc8c3a -//.word 0x14c52421 -//.word 0x8733cc96 -//.word 0x28931b9d -//.word 0x74c779d0 -//.word 0x35bc3416 -//.word 0x3e4ad0b3 -//.word 0x5b5b9e81 -//.word 0x8850907c -//.word 0x61a04b84 -//.word 0xdac27e5f -//.word 0x304e72fe -//.word 0x205fe301 -//.word 0x563b0f7d -//.word 0x28360cfc -//.word 0x84d35ec5 -//.word 0x272dc95e -//.word 0x10956450 -//.word 0x357def2a -//.word 0x749566c8 -//.word 0xcc33d6d5 -//.word 0xcdf8708f -//.word 0x4db1dcca -//.word 0x5d7bd038 -//.word 0x7c2be0e7 -//.word 0x0aec980b -//.word 0xff2ac8fe -//.word 0xdcaf1f85 -//.word 0xe20cfb55 -//.word 0x823b80d6 -//.word 0x1682e826 -//.word 0xce9a1961 -//.word 0xed117d20 -//.word 0x35ed0e3f -//.word 0x9f92b0e4 -//.word 0x50e6c4bc -//.word 0xc9b2fa88 -//.word 0x5e4c66d9 -//.word 0xe973d717 -//.word 0xbf7a64c8 -//.word 0xe3a9470f -//.word 0x7ae0ef73 -//.word 0x7f7d50e2 -//.word 0xb8807ef6 -//.word 0xe9ed7a77 -//.word 0x47724b20 -//.word 0x2f4a51a6 -//.word 0x1861d7f6 -//.word 0xc7b9e7be -//.word 0xc20c6230 -//.word 0x06b35003 -//.word 0xfcc674ba -//.word 0xaa852328 -//.word 0x26f65734 -//.word 0x51d000da -//.word 0xc1989a72 -//.word 0xff0a0435 -//.word 0xf3ba90fd -//.word 0x9cfb574c -//.word 0x0500cf90 -//.word 0x74419fa5 -//.word 0xe420b19c -//.word 0xb5cd89bb -//.word 0xa367d6c4 -//.word 0xf564477b -//.word 0xf632a062 -//.word 0xa91e0dc7 -//.word 0xb976b600 -//.word 0xafea93f6 -//.word 0x673882e0 -//.word 0xc5099751 -//.word 0xa415b375 -//.word 0x0f8e5897 -//.word 0xb4bcbbe7 -//.word 0x95e51b7b -//.word 0x016f5293 -//.word 0xc348aa21 -//.word 0x9986f189 -//.word 0xe84bd0a5 -//.word 0xadec580c -//.word 0xb752de94 -//.word 0x14a00915 -//.word 0xc9152970 -//.word 0xc635cad0 -//.word 0x18238a30 -//.word 0x6152271e -//.word 0x855cdcbe -//.word 0xa732ee11 -//.word 0x54768277 -//.word 0xfd25b173 -//.word 0xab79deaf -//.word 0xee0e4740 -//.word 0x1643db2a -//.word 0xa6e34c27 -//.word 0x060564a4 -//.word 0x78309c0d -//.word 0x4dc3eb4a -//.word 0x5994dc8a -//.word 0xa4d8e33f -//.word 0x6243f169 -//.word 0x26704618 -//.word 0x5282872c -//.word 0xd20c1060 -//.word 0x0a2e8b87 -//.word 0x0c01c115 -//.word 0x0f35b1e0 -//.word 0x1df9df28 -//.word 0x0b1befd5 -//.word 0xae717201 -//.word 0x4c7700b6 -//.word 0x513987f9 -//.word 0x4374e207 -//.word 0xf8f8aede -//.word 0x075059ff -//.word 0x7ca57b73 -//.word 0xd0e06a0c -//.word 0x180f09ed -//.word 0x7c0ae04c -//.word 0xeb567277 -//.word 0x0d49ca15 -//.word 0x796f58af -//.word 0x292dfb6f -//.word 0x2aa45f27 -//.word 0x98d88994 -//.word 0xca12b0e5 -//.word 0xca834f77 -//.word 0x082978e3 -//.word 0x4ff76b3a -//.word 0xf730678f -//.word 0x5d14c0b6 -//.word 0x90be324c -//.word 0x4d4d75f7 -//.word 0x2e4211ef -//.word 0x1e2974be -//.word 0x107c4244 -//.word 0xf1c4ecfd -//.word 0xda018487 -//.word 0x8b4cd05e -//.word 0x15bb9deb -//.word 0xd68555bd -//.word 0xaa66d416 -//.word 0x604578a9 -//.word 0x6b1577a2 -//.word 0xdaf976e7 -//.word 0x8bab579d -//.word 0x9b1e52ef -//.word 0x2062470a -//.word 0x1bc9526c -//.word 0xa848a15f -//.word 0x781f82c0 -//.word 0x81bcc005 -//.word 0xf4dd307f -//.word 0x70f687db -//.word 0x75d26eef -//.word 0x1b7cd9b4 -//.word 0x0460948e -//.word 0x8fae1ed4 -//.word 0x4effbb8c -//.word 0xbb3bc576 -//.word 0x26ba434d -//.word 0xf2a9bd49 -//.word 0x01b04ee8 -//.word 0x6dd1faee -//.word 0x799442aa -//.word 0xc761f67c -//.word 0xcb2d4b94 -//.word 0x7f592dfc -//.word 0x58d6d6d9 -//.word 0x798ea0ee -//.word 0x28ff1761 -//.word 0x7e2953c2 -//.word 0x62ab8549 -//.word 0xb829cf5f -//.word 0xd5f05960 -//.word 0x36dda1a0 -//.word 0x727b12ac -//.word 0x6e6bd9d2 -//.word 0xd009f4e3 -//.word 0xb64c8b37 -//.word 0xa7ee84f2 -//.word 0xcacd5286 -//.word 0x55920d79 -//.word 0x4990c869 -//.word 0x5def1f4d -//.word 0x37090ffd -//.word 0xe2140bf5 -//.word 0x7d024b55 -//.word 0x30a5682d -//.word 0x651726f8 -//.word 0x34599066 -//.word 0x1e3a4b5f -//.word 0xff7a2444 -//.word 0x3e30eb78 -//.word 0x4769841f -//.word 0x3b123b25 -//.word 0xe5185882 -//.word 0xf1cdf3bd -//.word 0x588e0aaf -//.word 0x1fa3d18a -//.word 0x4166491a -//.word 0xeaa7144a -//.word 0xe55088e9 -//.word 0x584502ae -//.word 0xaf8e7d7a -//.word 0xd6b863de -//.word 0xab78a2dd -//.word 0xb39203f3 -//.word 0x0bf9b856 -//.word 0xa238337b -//.word 0xa6103fdc -//.word 0x3c6349f9 -//.word 0x7451fe9c -//.word 0x7ca01c62 -//.word 0x14618177 -//.word 0x41d089a1 -//.word 0x467d9680 -//.word 0xd0a9f014 -//.word 0x71f3d07f -//.word 0x4f34b70c -//.word 0x1ea70471 -//.word 0x4b4dc651 -//.word 0x7a8fcf05 -//.word 0x33260a9c -//.word 0xd8380e20 -//.word 0xdbc3f21b -//.word 0x2d3f635a -//.word 0xfa7ff5f1 -//.word 0x93d9b780 -//.word 0xac860ab4 -//.word 0xc74bb310 -//.word 0xf0592eed -//.word 0xab7345bf -//.word 0x2b4ee29b -//.word 0xc43d22f6 -//.word 0xa30eaab0 -//.word 0xbd2e3e51 -//.word 0x05149092 -//.word 0xe2dd551f -//.word 0xe0349e9b -//.word 0xa67566e4 -//.word 0x28126799 -//.word 0x1d3533da -//.word 0xb4a77f4f -//.word 0x82f0c26c -//.word 0xbfc0fff3 -//.word 0xb38ddeba -//.word 0x6b7e02ae -//.word 0xb0889718 -//.word 0x3ad72a1f -//.word 0x206fbe8e -//.word 0x93131cd8 -//.word 0xcc656a5a -//.word 0x4350ffdf -//.word 0x22a37669 -//.word 0xf9fe012f -//.word 0xb3f200e2 -//.word 0xc964d334 -//.word 0xb532ec9b -//.word 0xaa1a2852 -//.word 0x82d75fa2 -//.word 0xf88c3a5f -//.word 0x176644b5 -//.word 0xf27d4425 -//.word 0x96fccbca -//.word 0x3d8209e1 -//.word 0xc4c8e488 -//.word 0x5f834cc6 -//.word 0x8c8cc8cc -//.word 0x453e557a -//.word 0x7a1f7125 -//.word 0xbec37398 -//.word 0x41ee1d58 -//.word 0xfef9742d -//.word 0x3577cfdd -//.word 0x1c182f3b -//.word 0xd2cdce60 -//.word 0x942cfb39 -//.word 0x33172442 -//.word 0xc5983590 -//.word 0x9b102115 -//.word 0x7491bd20 -//.word 0xf088d523 -//.word 0x489f7ab9 -//.word 0x3be199e7 -//.word 0x4c1fd2a2 -//.word 0x2a938692 -//.word 0x70c43216 -//.word 0x8ea9fc88 -//.word 0x07118cc2 -//.word 0xde431de1 -//.word 0x4ae1d449 -//.word 0xb11250e9 -//.word 0xd4df82c0 -//.word 0x48debf9f -//.word 0x250e1331 -//.word 0x0203d93a -//.word 0x2043881c -//.word 0xe5efd09f -//.word 0x8ca6e6f1 -//.word 0x1ca61cec -//.word 0x9634b498 -//.word 0x733ff6f1 -//.word 0x4d4080ea -//.word 0xdd64deb1 -//.word 0x25ed5a35 -//.word 0xeed515e6 -//.word 0x75b557bb -//.word 0x62e6247a -//.word 0xf9e61034 -//.word 0x94fd540e -//.word 0x51202048 -//.word 0x08153377 -//.word 0x80d8aa15 -//.word 0xe23e153c -//.word 0x6dd8d0af -//.word 0x6c1a911a -//.word 0x65bc3d9b -//.word 0x94610080 -//.word 0x97779c53 -//.word 0x6b5e0114 -//.word 0x97cc1fc5 -//.word 0xa770f82c -//.word 0xdcd5f9d4 -//.word 0x228a8a55 -//.word 0x4280e4d5 -//.word 0x59b322cf -//.word 0x890c9b13 -//.word 0xee86700e -//.word 0xd491614c -//.word 0x27b4e53b -//.word 0x2a757932 -//.word 0x6c7d38b1 -//.word 0xf9f8aceb -//.word 0xcd3be481 -//.word 0x8ea9c691 -//.word 0x7ad7a7ef -//.word 0x9eee19b2 -//.word 0x485104f3 -//.word 0xc080f9d1 -//.word 0x333dc2b8 -//.word 0xf0ed3ee4 -//.word 0xd7406c20 -//.word 0x0d14c5d4 -//.word 0xf597cf3e -//.word 0x5cacef00 -//.word 0xf4917edb -//.word 0x04be20ba -//.word 0x5d1051f2 -//.word 0x902641c8 -//.word 0x5e0ce234 -//.word 0x70163fe4 -//.word 0x490f0f84 -//.word 0x78938a3d -//.word 0x12ba7b7b -//.word 0x5ff797f4 -//.word 0xd43f0de6 -//.word 0x416d5e9f -//.word 0x4ce56f43 -//.word 0x1e77ddca -//.word 0x5c879048 -//.word 0x596b9371 -//.word 0x8a15225c -//.word 0x3af20587 -//.word 0x7e111d1c -//.word 0x6c883d72 -//.word 0x88143bd7 -//.word 0x7fff468d -//.word 0x18477912 -//.word 0x67fcb1a4 -//.word 0x44ea9c05 -//.word 0xfb78137c -//.word 0x45d0aa1c -//.word 0x77408548 -//.word 0xfae06d77 -//.word 0xfb762235 -//.word 0x6396f36b -//.word 0x0a0e8ddf -//.word 0x278111fe -//.word 0x0c5169da -//.word 0x10c2db6f -//.word 0xcc5dde2a -//.word 0x8a932dac -//.word 0xfaa31bcb -//.word 0x27be26d9 -//.word 0xaa68ce29 -//.word 0x1d21a8d0 -//.word 0xd345aea9 -//.word 0xc631d99c -//.word 0xd1a7f21f -//.word 0x2074a5fc -//.word 0xe44fd755 -//.word 0x4b0539e6 -//.word 0xafd31d8b -//.word 0x0e138902 -//.word 0xba1c8af1 -//.word 0x5163cb2b -//.word 0xf0e6662f -//.word 0xa4cafaf2 -//.word 0x2142fede -//.word 0xb7b4551a -//.word 0x8117220c -//.word 0xe0a0dd1c -//.word 0x279da7bb -//.word 0x98a1daa4 -//.word 0x90e1e562 -//.word 0xfede5713 -//.word 0x1944396b -//.word 0x5312a1fc -//.word 0x88fc84b4 -//.word 0x7c0ecca7 -//.word 0x8491aa0e -//.word 0x83322e90 -//.word 0x186115c1 -//.word 0x16f8e2e9 -//.word 0x351d3006 -//.word 0x07694614 -//.word 0x2d4aec8b -//.word 0xcaa57d2a -//.word 0x38c03ef3 -//.word 0xfa60ee77 -//.word 0xf22e9e53 -//.word 0xd45fc3fb -//.word 0xdb948ab6 -//.word 0xbbff6bea -//.word 0xd6c8019a -//.word 0xb2af192d -//.word 0xabf20971 -//.word 0xe57143df -//.word 0x85102921 -//.word 0x215d23d1 -//.word 0x7473ef84 -//.word 0x571e3907 -//.word 0xed3f6ce8 -//.word 0x1d72c738 -//.word 0x45efb390 -//.word 0x2cae5452 -//.word 0x39cf5e31 -//.word 0xe3382af4 -//.word 0x69800976 -//.word 0xc30cd8f2 -//.word 0xd877d47d -//.word 0xf137b0d4 -//.word 0x6e7ee558 -//.word 0xb85f4a57 -//.word 0x7632e48d -//.word 0x0439ffeb -//.word 0x20847d97 -//.word 0xe7116f33 -//.word 0x0138e262 -//.word 0x1846fb88 -//.word 0x8e6947d2 -//.word 0x6fcc4c77 -//.word 0xa402643d -//.word 0x6aa8cb3e -//.word 0x0346f6ec -//.word 0xab772653 -//.word 0xce4a3e9e -//.word 0x78e7d1dd -//.word 0x0d768005 -//.word 0x3a3c8338 -//.word 0x2b078547 -//.word 0xffcdb576 -//.word 0x79901a7f -//.word 0xf88426d9 -//.word 0xa9748f39 -//.word 0xfb625a5a -//.word 0x536e39fa -//.word 0x02f91625 -//.word 0x7409f0b5 -//.word 0xa9efe61a -//.word 0xe9289157 -//.word 0xb482974d -//.word 0xf97f7d3c -//.word 0x88febd87 -//.word 0xc81819b7 -//.word 0xad492ec3 -//.word 0xe5d04c8f -//.word 0x525885b2 -//.word 0xbdd7047c -//.word 0xc9b7a138 -//.word 0x2534b2ae -//.word 0x060523ec -//.word 0xd53ec946 -//.word 0x2475f39c -//.word 0xe72342db -//.word 0xe14ebbc6 -//.word 0x5c651bf7 -//.word 0x1d6c6a20 -//.word 0x9758d397 -//.word 0x5fbdb312 -//.word 0xe0a6f0af -//.word 0x50c48c37 -//.word 0xe3cc7aa3 -//.word 0x3e1ab0df -//.word 0x2e9a7dcf -//.word 0x9ae81d90 -//.word 0xb6b68b00 -//.word 0x7a6f9680 -//.word 0x531937f8 -//.word 0x1880221c -//.word 0x3f919bee -//.word 0x51048b84 -//.word 0x9b3ed30c -//.word 0x2775e00d -//.word 0xea157ff0 -//.word 0x3f62f3be -//.word 0x945f462b -//.word 0x63efdcd4 -//.word 0x653b4ec5 -//.word 0x0253753e -//.word 0x0b18c4b7 -//.word 0xab59db21 -//.word 0x9b3c5a6f -//.word 0x96e0f355 -//.word 0x0d40c44f -//.word 0x1b5be3e6 -//.word 0xbb923a2f -//.word 0x39519594 -//.word 0xe6f1f9d6 -//.word 0x10dd3853 -//.word 0x31f4c285 -//.word 0x672fbecc -//.word 0x2484596d -//.word 0x270a5eda -//.word 0xab5d0834 -//.word 0xde44140e -//.word 0x94911974 -//.word 0x3d491c2b -//.word 0x14055f3b -//.word 0x9a987bab -//.word 0x43f2ae8c -//.word 0x6f457639 -//.word 0x9b665fdc -//.word 0xd9751934 -//.word 0x7dc0cd96 -//.word 0x1ae5b132 -//.word 0xad37db98 -//.word 0x1763537b -//.word 0xd1546bb4 -//.word 0xdb535389 -//.word 0xf573e830 -//.word 0x122ccd8f -//.word 0x0a46bd46 -//.word 0x8ff81fef -//.word 0x6252dba4 -//.word 0xc6d86dc2 -//.word 0x367038ed -//.word 0x537e1c55 -//.word 0x204d4a37 -//.word 0x71b157a6 -//.word 0xa1ea908b -//.word 0x84cc8eeb -//.word 0x9c1d0a68 -//.word 0x903ff20b -//.word 0xd90ebb40 -//.word 0xbf0cfa22 -//.word 0x84bc2ef9 -//.word 0xdf4be001 -//.word 0xac75ef6e -//.word 0xe1a725ac -//.word 0xc4610deb -//.word 0x5bdf09db -//.word 0x24f89fb4 -//.word 0x0746147a -//.word 0x89873c7f -//.word 0x42439029 -//.word 0x91b081f5 -//.word 0x8ed20cbc -//.word 0x40e68f36 -//.word 0x1101dbbc -//.word 0x7ef58a52 -//.word 0x137493e4 -//.word 0x97781bd0 -//.word 0x84e18ea5 -//.word 0xba60ef2a -//.word 0x73956ca3 -//.word 0x7a74364f -//.word 0x98ed8f35 -//.word 0x4fcc2521 -//.word 0xcbde9ee9 -//.word 0x165574f4 -//.word 0x8b6d03fd -//.word 0x8d50e015 -//.word 0x79376de7 -//.word 0xd8d3aa40 -//.word 0xdaeb4ecf -//.word 0x00461729 -//.word 0x18cb5e0f -//.word 0x6ee7eef4 -//.word 0x412f16ba -//.word 0x7447fdbd -//.word 0x86023612 -//.word 0xc4ca9411 -//.word 0xbd434010 -//.word 0xf72b0872 -//.word 0xe085fae1 -//.word 0x07f632d7 -//.word 0x8c6ff063 -//.word 0xd60cee2a -//.word 0x833cf0ac -//.word 0xa5239cc8 -//.word 0x2b3c8c82 -//.word 0x9d43a205 -//.word 0x0d529be4 -//.word 0x4a4ae7a5 -//.word 0x5674b880 -//.word 0x1a685a64 -//.word 0x592ec23b -//.word 0xe3a4696f -//.word 0x0b1f5bad -//.word 0x5a558ae9 -//.word 0x857b69a2 -//.word 0x9daab667 -//.word 0x8687979a -//.word 0xaa23e974 -//.word 0xee20d549 -//.word 0xe616a40d -//.word 0x4434d418 -//.word 0x972b6b26 -//.word 0x32478ba2 -//.word 0x69df4724 -//.word 0x04f0b538 -//.word 0xed054461 -//.word 0x2c5a505d -//.word 0x1540f4ab -//.word 0xc0c3204b -//.word 0xba8bebc5 -//.word 0xfa002a6c -//.word 0x17b241e4 -//.word 0xb8f739e2 -//.word 0x4bd61333 -//.word 0xfa235c00 -//.word 0xdaec0250 -//.word 0x661466ce -//.word 0x2d3eb2cd -//.word 0xc7ec6d89 -//.word 0x0de84daf -//.word 0x8ae44c20 -//.word 0x2c5dfdf2 -//.word 0x3fc521b8 -//.word 0x9ce07604 -//.word 0x1e6fcf2a -//.word 0x560c6946 -//.word 0x80557d80 -//.word 0xb54c128e -//.word 0x62fe157b -//.word 0xf863aba7 -//.word 0xe586c610 -//.word 0xc4e5f7cf -//.word 0xd01b83e6 -//.word 0x9fbcb838 -//.word 0x0d8181d9 -//.word 0x76a53988 -//.word 0x288ebd7a -//.word 0x17b0c55a -//.word 0xd3af748d -//.word 0xb8c32dba -//.word 0x6461a98a -//.word 0x6f1846ac -//.word 0x56b9a21d -//.word 0xb7ba69a6 -//.word 0xc4dc6ba6 -//.word 0xf20cf211 -//.word 0xf18752b9 -//.word 0xe142c1cc -//.word 0xc389699e -//.word 0x2de6bca9 -//.word 0x424408d3 -//.word 0xe2544bef -//.word 0x1e304885 -//.word 0xef3fdad6 -//.word 0x2758891b -//.word 0xa72a5b0e -//.word 0xd3dbecab -//.word 0x43efc138 -//.word 0xbb6cda83 -//.word 0x5e3b866b -//.word 0x1ed27ca1 -//.word 0x771026b0 -//.word 0x5d68403b -//.word 0x7342a286 -//.word 0x7d9e5a39 -//.word 0x18fbfe60 -//.word 0xa97741b5 -//.word 0x9337c322 -//.word 0xad092e82 -//.word 0xf3487ea8 -//.word 0x7b01a0a2 -//.word 0xab533f3e -//.word 0xaa1cdbce -//.word 0x14d21b29 -//.word 0xf2ae64f2 -//.word 0xe910aa1d -//.word 0xb11f86ae -//.word 0xc9af89c4 -//.word 0x6969d1d7 -//.word 0xb925d93e -//.word 0x409b95f4 -//.word 0x9f3bbf9b -//.word 0x7f596cc1 -//.word 0xc88de263 -//.word 0x135aadaf -//.word 0x630df00e -//.word 0x0fe8fa62 -//.word 0x0380198c -//.word 0x2964b332 -//.word 0x21ff92bf -//.word 0x38c080ab -//.word 0x987814fc -//.word 0xbc03cb0d -//.word 0x272a5a8e -//.word 0x56c843cc -//.word 0xf32ca732 -//.word 0x4bbf5b10 -//.word 0x02e63e9c -//.word 0x052ac937 -//.word 0xc197e7f1 -//.word 0x9361074e -//.word 0x7fce704b -//.word 0x244fd59c -//.word 0xeff02a38 -//.word 0x90f3b617 -//.word 0xaab8683a -//.word 0xcfe16eed -//.word 0xabb30449 -//.word 0x7fbe8afc -//.word 0xd2c0da4d -//.word 0x63c7d85a -//.word 0x61964ba4 -//.word 0xde4aebce -//.word 0x823dbaa2 -//.word 0x7c2b9855 -//.word 0xbe93120c -//.word 0x6a607c9e -//.word 0x87c93f9c -//.word 0xf976738f -//.word 0xb0e4b180 -//.word 0x1f0a22be -//.word 0xf03ddcdb -//.word 0xf6516ff8 -//.word 0x6301ba42 -//.word 0x3b9004bd -//.word 0x08b14841 -//.word 0xd0a5cfc2 -//.word 0x44a304d4 -//.word 0x3a7c856d -//.word 0x5d7f76ed -//.word 0x239a1a5d -//.word 0x00c3a4f4 -//.word 0xda964ae0 -//.word 0xbc409c43 -//.word 0xce9b147b -//.word 0x859aeea6 -//.word 0x17e83965 -//.word 0x32cc2fe1 -//.word 0xed50c20c -//.word 0xffa2772a -//.word 0x2eba778f -//.word 0x0b3de4aa -//.word 0xdda26942 -//.word 0xdb931500 -//.word 0x9e96692e -//.word 0xd5ecafbe -//.word 0x3bb98e8e -//.word 0xc666dcea -//.word 0x2144b353 -//.word 0x5d72c77e -//.word 0xe400f6a0 -//.word 0xae5421e9 -//.word 0xb7cd3b4e -//.word 0xb0a79f8c -//.word 0xf41fa76a -//.word 0xbfd77a3e -//.word 0x9a7b25b2 -//.word 0x1aa5eec8 -//.word 0xcafee41c -//.word 0x66a7bb6a -//.word 0x4ad7d74f -//.word 0x29c5a754 -//.word 0x02c83428 -//.word 0x50bcfa2d -//.word 0x82a9f636 -//.word 0xaa9f0090 -//.word 0x79e45b3f -//.word 0x6b528b89 -//.word 0x3ffa66b9 -//.word 0xaa0d6e1d -//.word 0x4cfd5e51 -//.word 0xe3df03bf -//.word 0xbf144d67 -//.word 0x7628a6dc -//.word 0xd8fa828f -//.word 0x251d3850 -//.word 0x7e7f1012 -//.word 0x9a489def -//.word 0xba054d6c -//.word 0xdf063efd -//.word 0x3a0453cc -//.word 0xe40888b6 -//.word 0xcf878296 -//.word 0xfdd26bc7 -//.word 0xefaefce4 -//.word 0x613edbd2 -//.word 0x342a2801 -//.word 0xacfa52ee -//.word 0xdbc330ed -//.word 0x5d064d25 -//.word 0x46d583dc -//.word 0x5937cbf5 -//.word 0x7bce53b6 -//.word 0x67b7d1cf -//.word 0xa2b21898 -//.word 0xb283e89b -//.word 0x8b980b52 -//.word 0x4aeb9d32 -//.word 0x252aace8 -//.word 0xa21601e2 -//.word 0x08293c11 -//.word 0x137b27ed -//.word 0xece644ba -//.word 0x5868a80a -//.word 0x30ca0c84 -//.word 0x117f22e3 -//.word 0x54cf2542 -//.word 0x4135b496 -//.word 0x7f05e07c -//.word 0xcf518435 -//.word 0xfb0ed5ee -//.word 0x08733945 -//.word 0xb3a25d0a -//.word 0x1c8a8142 -//.word 0xbc0c1772 -//.word 0x9c5c8d1a -//.word 0xc9ab677f -//.word 0x030390ad -//.word 0xb572f2bd -//.word 0x2a6a4454 -//.word 0xfd68236c -//.word 0xd1d46557 -//.word 0x4328aa00 -//.word 0x1d553375 -//.word 0xcc63f8a2 -//.word 0x1557f45f -//.word 0x0359c4ae -//.word 0x2416703d -//.word 0xf5648933 -//.word 0x9a247429 -//.word 0xd26d0575 -//.word 0x2be750af -//.word 0x7274bb6e -//.word 0x6e165853 -//.word 0xce0d7249 -//.word 0x5f3f660a -//.word 0x82ddb4e6 -//.word 0xde4456c0 -//.word 0x52215159 -//.word 0x2dd989d1 -//.word 0xa228d96a -//.word 0x76086390 -//.word 0xfcd42516 -//.word 0x43adcec3 -//.word 0x8e1dcf0d -//.word 0x04fab424 -//.word 0xa98db532 -//.word 0x8df488e1 -//.word 0x44c57a1f -//.word 0x95f4be1e -//.word 0x76f7059e -//.word 0x39274f6e -//.word 0x006a0030 -//.word 0x760f365e -//.word 0xc1f95a8a -//.word 0xb200f5ea -//.word 0x3f94c513 -//.word 0x34a31105 -//.word 0x25bd3968 -//.word 0xa7779115 -//.word 0xc00d6fd8 -//.word 0x9b4b8374 -//.word 0x80ad67e8 -//.word 0x04c577f1 -//.word 0x7ddde3d0 -//.word 0xb9de034d -//.word 0xf070eafc -//.word 0xf6633dbf -//.word 0xb54e468c -//.word 0xdb754471 -//.word 0xd0f005d5 -//.word 0xeb0ab700 -//.word 0xe5e8fcde -//.word 0x8e6b3cff -//.word 0xbe563fe3 -//.word 0x8fb4fb75 -//.word 0xc974aad5 -//.word 0x9e57205a -//.word 0x980c5cd8 -//.word 0xcf995d1e -//.word 0x5ffc37c3 -//.word 0x19126523 -//.word 0x79b961a4 -//.word 0xd831723e -//.word 0xe3c9c53a -//.word 0x4cb7c039 -//.word 0xc0479379 -//.word 0x18381054 -//.word 0xd362bc09 -//.word 0xc49d26bf -//.word 0x08df77c7 -//.word 0x3ba44b22 -//.word 0xeb93bf43 -//.word 0x4d5ecb15 -//.word 0x2fead340 -//.word 0x2eb078a9 -//.word 0x2963b437 -//.word 0xf6d226dd -//.word 0x5311aad5 -//.word 0x1fd32d29 -//.word 0xca1bc078 -//.word 0x0a14eaf7 -//.word 0xcf3c43b6 -//.word 0x7ac83e25 -//.word 0x494547d6 -//.word 0x167b0e84 -//.word 0x42962255 -//.word 0xec88c15c -//.word 0x66a9ef62 -//.word 0xe9a0c5e6 -//.word 0x87870c62 -//.word 0x624a0ad0 -//.word 0x1c509c6d -//.word 0x8e5e85bd -//.word 0xbdb806cf -//.word 0x0989afc2 -//.word 0xa8847488 -//.word 0x53cc03ea -//.word 0x3f1155cc -//.word 0x4ffc83b3 -//.word 0x88cedc84 -//.word 0xc544348f -//.word 0xacbd7ecb -//.word 0xe09e9e63 -//.word 0x78f67872 -//.word 0xb15e4d0b -//.word 0xdf24477d -//.word 0xaaa852d5 -//.word 0x76052ea4 -//.word 0x23f4c202 -//.word 0xf7eeb4d2 -//.word 0xd8913648 -//.word 0xbf4523a9 -//.word 0x691f4a52 -//.word 0x50060afc -//.word 0xd9141f3e -//.word 0xcf3ebb53 -//.word 0x1038d81e -//.word 0x8693cd6b -//.word 0x59292078 -//.word 0x63ba9cb4 -//.word 0xe5d7a3c6 -//.word 0x78ffc5d1 -//.word 0x460991f7 -//.word 0x79c1aa1c -//.word 0xf4d61eec -//.word 0x41f4f41f -//.word 0xcb2d04fb -//.word 0x4e9d0c1b -//.word 0x8b4eff70 -//.word 0x4059a085 -//.word 0x574e5007 -//.word 0x5ed62484 -//.word 0x37973b73 -//.word 0x11584f75 -//.word 0x976689da -//.word 0x66369a67 -//.word 0xc54b0756 -//.word 0x905ac49f -//.word 0x76ad0576 -//.word 0x65c55115 -//.word 0x4143d8bb -//.word 0xdc0906f5 -//.word 0x239c581c -//.word 0x95cc6f1f -//.word 0xfa986382 -//.word 0x514c59a7 -//.word 0x0aec584d -//.word 0x75d55856 -//.word 0x7ba29ccd -//.word 0x8c4d4227 -//.word 0xd89619c9 -//.word 0xc2a9b2cb -//.word 0x91fbbafc -//.word 0x69758626 -//.word 0x7bd4f093 -//.word 0x785062cf -//.word 0x4b7b30b0 -//.word 0x076d2b94 -//.word 0x1e1e73ea -//.word 0xd5138cf4 -//.word 0xf43db4ca -//.word 0xc21e74a3 -//.word 0x302d7650 -//.word 0x557c9609 -//.word 0x1a983b6c -//.word 0x37b0e8c3 -//.word 0x5efa0e86 -//.word 0xb5532521 -//.word 0x8a26faf6 -//.word 0x438e4ba6 -//.word 0x93bf918c -//.word 0xf4a21d8b -//.word 0x51bf660a -//.word 0x0260a23c -//.word 0xfef393a5 -//.word 0x4cb1a4da -//.word 0xbb7d3488 -//.word 0xd30f32b7 -//.word 0x0b51ea50 -//.word 0x3d091edd -//.word 0x56b95991 -//.word 0x52c38088 -//.word 0x68d1aa4f -//.word 0x81748000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x000126D0 -//// expected output -//.word 0x956d5ca8 -//.word 0xfb9c84cd -//.word 0xc882eb0b -//.word 0xf3f5ff0a -//.word 0x61238f98 -//.word 0x2286673b -//.word 0xb9185a45 -//.word 0x858ea138 -//.word 0x27dee168 -//.word 0xb4abf313 -//.word 0xa0b82aa5 -//.word 0xe98d2a01 -//.word 0x510dfc9e -//.word 0x2228c657 -//.word 0x425f2941 -//.word 0xff0c6d63 -//// SHA512LongMsgvector_95 -//// vector length -//.word 0x000129E8 -//// input message -//.word 0x204047ae -//.word 0xeeffcd14 -//.word 0x1d9ac8fe -//.word 0x0c003df0 -//.word 0x86e2e352 -//.word 0xa20d2a66 -//.word 0xe7f77d7d -//.word 0xb497c46b -//.word 0xdf7a2e38 -//.word 0x9d142d18 -//.word 0xa254c29d -//.word 0x897bfa2c -//.word 0x752db9ae -//.word 0xf9c8b687 -//.word 0x35f6c7cc -//.word 0x427e5fb0 -//.word 0xd1605440 -//.word 0x0e20e651 -//.word 0xcb62feb6 -//.word 0xdab7b3b6 -//.word 0xbab712bd -//.word 0x77501f51 -//.word 0xcb5d1748 -//.word 0x897af838 -//.word 0x3b174330 -//.word 0x0acc01a5 -//.word 0xdfec04af -//.word 0xc85d6f76 -//.word 0x9da779e6 -//.word 0xe34a6dab -//.word 0xf055f559 -//.word 0x503499ea -//.word 0x68ca836e -//.word 0x59c085fe -//.word 0x281c5df2 -//.word 0x1b153754 -//.word 0x66257394 -//.word 0x0661a97c -//.word 0xee06ea67 -//.word 0x615449ae -//.word 0x9f9f9a64 -//.word 0xc3a37a43 -//.word 0xec1890e5 -//.word 0x9b861238 -//.word 0x5c5b8a2c -//.word 0xa93bdaae -//.word 0x0b977dda -//.word 0x8281116c -//.word 0x27be1278 -//.word 0x101de95c -//.word 0x740825f2 -//.word 0x0f59080a -//.word 0xc86f4517 -//.word 0x92800828 -//.word 0x9030371a -//.word 0x7c63f70c -//.word 0x49507314 -//.word 0x07d8d930 -//.word 0x0815a480 -//.word 0x413521b2 -//.word 0xf2892cbd -//.word 0x8ad93bd2 -//.word 0xc5fb9f8f -//.word 0x17a30677 -//.word 0x4d7d439f -//.word 0x727952a9 -//.word 0xef6796f6 -//.word 0xf7c36618 -//.word 0x22d2c886 -//.word 0x58ee7c94 -//.word 0xf11d3da2 -//.word 0x1ae94393 -//.word 0x7b6c0c81 -//.word 0x17ab5cae -//.word 0x732583be -//.word 0xfaabde24 -//.word 0xa071a0db -//.word 0xc666d256 -//.word 0x5dc199b9 -//.word 0x4fdcb849 -//.word 0x1a465521 -//.word 0xbe140028 -//.word 0xda77f13f -//.word 0x129491bf -//.word 0xb38f3d22 -//.word 0x9ae94600 -//.word 0x520d3c3e -//.word 0x7c256c82 -//.word 0x7432a7e9 -//.word 0x315c45fd -//.word 0x6d866ae1 -//.word 0x062688cf -//.word 0xa55425c5 -//.word 0x9d21df7a -//.word 0x1629ad97 -//.word 0x6a6c6724 -//.word 0xcf598940 -//.word 0x372c3416 -//.word 0x747a750c -//.word 0xa00aca3d -//.word 0xbce7e22a -//.word 0x97b3a5ac -//.word 0xf13e742e -//.word 0xe158b218 -//.word 0x74e3838e -//.word 0x972cd35b -//.word 0x377b9b28 -//.word 0xa6e85ff2 -//.word 0x4171fcbb -//.word 0x504aa07f -//.word 0x2d741a69 -//.word 0xa9915447 -//.word 0xabf71d3c -//.word 0x1a032cb4 -//.word 0xfdaf629d -//.word 0xe16750d5 -//.word 0x7b19f9de -//.word 0x8f8cd9d9 -//.word 0x11f226b2 -//.word 0x89c05598 -//.word 0xbcbde0b0 -//.word 0x8859470a -//.word 0x104155d4 -//.word 0x1930a4cd -//.word 0xb40863fd -//.word 0x1e2157a4 -//.word 0xe4e12070 -//.word 0x4a8dbef2 -//.word 0xee5e5353 -//.word 0xa9d82a43 -//.word 0xb657f933 -//.word 0x16eb63c4 -//.word 0x3265c17f -//.word 0xc3b222c6 -//.word 0xef68900a -//.word 0xb49f963f -//.word 0x8a02ff8d -//.word 0x4426df49 -//.word 0x381ad823 -//.word 0x9f3f96a1 -//.word 0x3f599ccc -//.word 0x47e74329 -//.word 0x7ab0ffea -//.word 0x8f9fe566 -//.word 0xd8d06ac7 -//.word 0x23eb6e02 -//.word 0xdeb1790d -//.word 0x7ed4444c -//.word 0x210c7b4c -//.word 0x7167c1b3 -//.word 0xcce1f577 -//.word 0xa334b34f -//.word 0x20f11e67 -//.word 0x0cd0dd58 -//.word 0xef446457 -//.word 0x795375ac -//.word 0x20a5e667 -//.word 0x0bdba44e -//.word 0x2f22f819 -//.word 0xb80709e2 -//.word 0xaa8da3d7 -//.word 0xc87c3632 -//.word 0xb5fd226b -//.word 0x596431ab -//.word 0x864d6585 -//.word 0xdbeaf5e1 -//.word 0xe99b9238 -//.word 0x95bfee07 -//.word 0xbdcb7f7d -//.word 0x1f998177 -//.word 0x76023aaf -//.word 0xe5ae8130 -//.word 0x992b810e -//.word 0xab3dbb53 -//.word 0x43754a3c -//.word 0x03056ba6 -//.word 0xa3d33cc3 -//.word 0xd8ccc411 -//.word 0x7b7b348d -//.word 0xe7da6c24 -//.word 0xa368c16a -//.word 0x417bfe8e -//.word 0x85d8a88e -//.word 0xca8187a7 -//.word 0xa2ce6110 -//.word 0xbdbf09e7 -//.word 0x0c91996c -//.word 0x258ffb6d -//.word 0xea2bae01 -//.word 0x654dc679 -//.word 0xf7eb3594 -//.word 0xb2da4af2 -//.word 0x03e477cb -//.word 0x941a57e1 -//.word 0x706befb3 -//.word 0x697635f4 -//.word 0xb79dce3b -//.word 0xe15b1cfc -//.word 0xe1d778b7 -//.word 0x83b9bc6f -//.word 0x0e3c055e -//.word 0x2684b7e7 -//.word 0xf133c1cc -//.word 0x793722a1 -//.word 0x51e5ac81 -//.word 0x7c4c07ff -//.word 0x8ac3fa5f -//.word 0x04c5e607 -//.word 0x0aff9330 -//.word 0x3ba62fe1 -//.word 0xd50e941e -//.word 0x1d79ca5d -//.word 0x022dcd39 -//.word 0xfdc9906a -//.word 0x3bd841f5 -//.word 0xfea7cfa0 -//.word 0x4154aaa9 -//.word 0x9b28cab7 -//.word 0x6526f211 -//.word 0x1fe4360e -//.word 0x109abbcd -//.word 0x2d79be25 -//.word 0x3c3ed7df -//.word 0x39067f23 -//.word 0xf964d131 -//.word 0x0db18d52 -//.word 0xe9a3620d -//.word 0x46216d9d -//.word 0xc456fda3 -//.word 0xd4059919 -//.word 0xd51c4487 -//.word 0x7d8bff79 -//.word 0x7b569030 -//.word 0x5ae98298 -//.word 0xa9ad6d7a -//.word 0x59d877f3 -//.word 0x66891b25 -//.word 0xba14292c -//.word 0x4e9a0e53 -//.word 0x92de5688 -//.word 0x0f536f0e -//.word 0x4a7ab072 -//.word 0xec6a99c0 -//.word 0x21b05df6 -//.word 0x3e5a9db9 -//.word 0xa64f7747 -//.word 0xeee2bfad -//.word 0x3fa68c3a -//.word 0xfc83f733 -//.word 0xa5091fc8 -//.word 0xfc057147 -//.word 0x66522690 -//.word 0x93f20cc9 -//.word 0x615d8a53 -//.word 0xfe19defc -//.word 0x4d8baa76 -//.word 0x8c0daf08 -//.word 0x3341d883 -//.word 0x1fa47a78 -//.word 0xef66daa8 -//.word 0xaf79f0bc -//.word 0xb4e86a36 -//.word 0xc66af4a8 -//.word 0x8537b723 -//.word 0x051a1ff3 -//.word 0xbcc7e289 -//.word 0x9e703eb9 -//.word 0x86938226 -//.word 0xd816cffa -//.word 0x649520da -//.word 0x8efb8819 -//.word 0xac4fbb2b -//.word 0xb0d1d05d -//.word 0x074645c4 -//.word 0xc1904473 -//.word 0xf18124f1 -//.word 0x57f133eb -//.word 0x3c0eb325 -//.word 0x9ef422b6 -//.word 0x8d7ebf75 -//.word 0xd55b49af -//.word 0xdd640a1b -//.word 0xcf2c140f -//.word 0xf9d9cbf3 -//.word 0x7433a3f7 -//.word 0x03fb2b01 -//.word 0x3d7e4be9 -//.word 0xef6ac9e9 -//.word 0xbcdf124f -//.word 0x06c93875 -//.word 0x126e37f3 -//.word 0x66437c13 -//.word 0x7604a886 -//.word 0x80039155 -//.word 0xb5c1891a -//.word 0x99bbe46f -//.word 0xac86b4a7 -//.word 0x4a1ed7bc -//.word 0xd07c3489 -//.word 0x00664139 -//.word 0xa78bc900 -//.word 0x7ccfec09 -//.word 0x4ce467af -//.word 0x541a15ef -//.word 0xef78b61d -//.word 0x710bf0d7 -//.word 0x527e9338 -//.word 0x8feb214d -//.word 0x4df18ecd -//.word 0xbf074404 -//.word 0x4b0f6a11 -//.word 0xe82f6651 -//.word 0xcbdca01b -//.word 0x423789ae -//.word 0xe09ddd67 -//.word 0xda792538 -//.word 0xb15d7f55 -//.word 0x1152a130 -//.word 0xfa6c1ca8 -//.word 0x1da1de7d -//.word 0x89dafb08 -//.word 0x864bad29 -//.word 0xc1009980 -//.word 0xaab953e0 -//.word 0x1bf82500 -//.word 0x3a580c74 -//.word 0xa02004dc -//.word 0xbb18855c -//.word 0x709c4e4c -//.word 0x05ee6130 -//.word 0x3fd14fea -//.word 0xc753b52e -//.word 0xd2ea0737 -//.word 0x01c28cb8 -//.word 0x8656aa16 -//.word 0x893e64d4 -//.word 0xca47214f -//.word 0x87c9afab -//.word 0xa035870d -//.word 0xf9ee530a -//.word 0x205aad60 -//.word 0x30382ae4 -//.word 0xf53497bc -//.word 0x50b882ce -//.word 0xdd06fd78 -//.word 0xd4849e82 -//.word 0x2d56ca51 -//.word 0x0832335d -//.word 0x4b70a0e5 -//.word 0x8d61ede1 -//.word 0x33e25238 -//.word 0xd831e833 -//.word 0xf3ff6831 -//.word 0xb3c6369d -//.word 0x2e5c9f1e -//.word 0xbbc95f0d -//.word 0x9c56672c -//.word 0xe1e6dd95 -//.word 0x888963f0 -//.word 0xe94f9ce9 -//.word 0x525aece2 -//.word 0xee3780e4 -//.word 0xeb6f8fdc -//.word 0xdb58df04 -//.word 0x5b318a9f -//.word 0xf36e02e9 -//.word 0x3e51534e -//.word 0x4bbaa8da -//.word 0x424011f1 -//.word 0x4b808340 -//.word 0xabb521f3 -//.word 0x308ab928 -//.word 0xd02c92a4 -//.word 0x8da265c5 -//.word 0x9c61a9b8 -//.word 0xc51b13ec -//.word 0x0dd95ec7 -//.word 0x93494897 -//.word 0xb859ddcb -//.word 0x8204f763 -//.word 0x436c06a5 -//.word 0x752a0d12 -//.word 0xe9e2ed98 -//.word 0x211ae609 -//.word 0xfa4c5bcc -//.word 0x8d39d5d3 -//.word 0x58814bcc -//.word 0x9971a19c -//.word 0xfb1c6e09 -//.word 0x74ad02b6 -//.word 0x6efba855 -//.word 0x255e2818 -//.word 0x50c29068 -//.word 0x03f934da -//.word 0xd456f45f -//.word 0x3d77bdbb -//.word 0x41625338 -//.word 0x52d44d9b -//.word 0x73d56157 -//.word 0x9a90e101 -//.word 0x58628604 -//.word 0xbb316d96 -//.word 0x74ff5fea -//.word 0x35be55a7 -//.word 0x5d663b9a -//.word 0xd746f5a7 -//.word 0x3f97a006 -//.word 0x47571aac -//.word 0x5a55c406 -//.word 0x7f8886ed -//.word 0x7fa414d7 -//.word 0x4aef704a -//.word 0x9751b197 -//.word 0xcbab02c4 -//.word 0x1c6aedca -//.word 0xf65cda01 -//.word 0x9dc2d2d8 -//.word 0x15a689c9 -//.word 0x3f6f9c8c -//.word 0x44b2178b -//.word 0x364b3a97 -//.word 0xf5ad7dd9 -//.word 0x5076d10b -//.word 0x6d4729e8 -//.word 0x6bd239e0 -//.word 0x45347d11 -//.word 0xfa867e73 -//.word 0xebae5152 -//.word 0x847b6002 -//.word 0x1ef26dce -//.word 0x24e2d331 -//.word 0x75bf0f49 -//.word 0x0aac8088 -//.word 0xd9da6bad -//.word 0xf91142f2 -//.word 0x068c2687 -//.word 0xc70aaa40 -//.word 0x0e22da8b -//.word 0xe0d77ca4 -//.word 0xd66c950c -//.word 0xc37a2f37 -//.word 0x973f5a84 -//.word 0x84397173 -//.word 0x5ff39e13 -//.word 0x4820a0b9 -//.word 0x8de6ccf7 -//.word 0xcc7c52cc -//.word 0x58f7c219 -//.word 0xde61cf54 -//.word 0x490c5280 -//.word 0xe225925d -//.word 0xbc8cc2dc -//.word 0x4fe3cbd5 -//.word 0x63e64cfc -//.word 0x30fadf12 -//.word 0xc3089f58 -//.word 0xa38be749 -//.word 0xb5e85c88 -//.word 0x5dff2d18 -//.word 0xe6ff99cb -//.word 0x247eb2fd -//.word 0x57c96181 -//.word 0x5378abdc -//.word 0xde4632b1 -//.word 0x5a20ff7d -//.word 0xa47c7e85 -//.word 0x3becca0c -//.word 0xa5f32bc8 -//.word 0x0e17de97 -//.word 0x3337146f -//.word 0x7e1f3c93 -//.word 0x725a850d -//.word 0x4a479f58 -//.word 0xdd70c25d -//.word 0xc516f2a1 -//.word 0xc01181bc -//.word 0x56d7d50d -//.word 0xbdda6cac -//.word 0xf9171ca0 -//.word 0x47eba052 -//.word 0xbc295042 -//.word 0x2a6b30f9 -//.word 0x43a52c3f -//.word 0x0100a28d -//.word 0x45e521c5 -//.word 0xbe577121 -//.word 0x0c87d369 -//.word 0x25a2896a -//.word 0xf8ee99a3 -//.word 0x5115cf41 -//.word 0xfdc1014e -//.word 0x2e689625 -//.word 0x216a4929 -//.word 0xfd592bb6 -//.word 0xff97e758 -//.word 0xd4274a3b -//.word 0x46bd03e3 -//.word 0x1b17a71d -//.word 0x3a90f836 -//.word 0x10f3666a -//.word 0x328dd69f -//.word 0x4486a354 -//.word 0x1971e2d4 -//.word 0x1b21ebaf -//.word 0xeebe156a -//.word 0x5019c076 -//.word 0x443d995f -//.word 0x6f471946 -//.word 0xc2774f91 -//.word 0x5986e0e1 -//.word 0xa33a4c44 -//.word 0xc43972ad -//.word 0x371b57a1 -//.word 0xb8c22332 -//.word 0x61ee6c31 -//.word 0x130cb7a0 -//.word 0x174f3c66 -//.word 0x0502ea46 -//.word 0xe51dab12 -//.word 0x9516e91c -//.word 0x6bf951ee -//.word 0x1abbd73b -//.word 0xdaccfa15 -//.word 0xc3eb495f -//.word 0x7a3e2686 -//.word 0x10a2ca6c -//.word 0x274089a5 -//.word 0x576157e6 -//.word 0xd0838cba -//.word 0x40abe477 -//.word 0xf7feca71 -//.word 0x498bd66d -//.word 0x336c9459 -//.word 0x420d873a -//.word 0xb1cb6d65 -//.word 0xd1c1c5f2 -//.word 0xaede8f6e -//.word 0xf03b53d0 -//.word 0xffac64ae -//.word 0x6b9666b1 -//.word 0x8a000e47 -//.word 0x63ec2997 -//.word 0xcae7e0ba -//.word 0xcddf3a28 -//.word 0x4f35e270 -//.word 0xf3132b2d -//.word 0x3c005135 -//.word 0xf2b10213 -//.word 0xc7221cb8 -//.word 0x3ae6b96d -//.word 0xbcbc690c -//.word 0x1162be70 -//.word 0xfaae0e2a -//.word 0x11da7475 -//.word 0xf420186d -//.word 0xa586b07b -//.word 0x31fc4714 -//.word 0x90a43da3 -//.word 0xcd7190c3 -//.word 0x67f359b2 -//.word 0xf6719a02 -//.word 0x11393692 -//.word 0x703441bd -//.word 0x4ebd7ad1 -//.word 0x11b316c3 -//.word 0x2dcdc021 -//.word 0x462edd47 -//.word 0x953a14d6 -//.word 0x8ca70e62 -//.word 0xbdd77a6b -//.word 0xf865558f -//.word 0xb3fe68fd -//.word 0xaf72122d -//.word 0xd90a47cf -//.word 0x6f1dd901 -//.word 0x63def6c4 -//.word 0x0478f3b1 -//.word 0xdb5d47e8 -//.word 0xd3dadb4a -//.word 0x9ef081e8 -//.word 0x535fc1ba -//.word 0x5c03dc95 -//.word 0x8f630b57 -//.word 0x9b880865 -//.word 0xa60bcf57 -//.word 0x3472a6f1 -//.word 0x4bbd5b55 -//.word 0xd53bcd78 -//.word 0x45a2add3 -//.word 0x7d5f865b -//.word 0xef2bfbb2 -//.word 0x03df519f -//.word 0xb9892dbc -//.word 0x90bf9e6e -//.word 0xa6335d1a -//.word 0x20885496 -//.word 0xcc645ede -//.word 0x05c74e09 -//.word 0xd89b327b -//.word 0x658cd95b -//.word 0x87199248 -//.word 0xb7eb3747 -//.word 0x2d666a00 -//.word 0x497f1f2b -//.word 0x32cd5b45 -//.word 0xbde23a87 -//.word 0x90db3718 -//.word 0x8736a882 -//.word 0x56e48863 -//.word 0x709f7965 -//.word 0x287e096f -//.word 0x16c7351d -//.word 0xbd042c6e -//.word 0x6a5955bd -//.word 0x5f1492f3 -//.word 0x3186c7fa -//.word 0x6f129675 -//.word 0x84836dae -//.word 0xdfa2c3cf -//.word 0x51099e56 -//.word 0xb63259c3 -//.word 0xd7d3a493 -//.word 0x8f6ecc72 -//.word 0x2d233dad -//.word 0x1aca45e6 -//.word 0xbc3e1a0b -//.word 0x99fb1f89 -//.word 0xc0ec63bc -//.word 0x657e6aaa -//.word 0xcbf931f2 -//.word 0x67106cff -//.word 0x42b71281 -//.word 0x9f341b1e -//.word 0xde798964 -//.word 0xa0b1a503 -//.word 0x2c198b39 -//.word 0x1111e88d -//.word 0x0d7303c0 -//.word 0x2e23fa01 -//.word 0x37e74e60 -//.word 0x4579a285 -//.word 0xb2dbc0a2 -//.word 0x3aebdda6 -//.word 0x5c371eb4 -//.word 0x03125bd3 -//.word 0x66e822e7 -//.word 0x2dceffe0 -//.word 0xd55dfa31 -//.word 0x55c16283 -//.word 0x020dc9ab -//.word 0xb0d150da -//.word 0x1aef2514 -//.word 0x84aa49e4 -//.word 0x9e00974d -//.word 0xac3a0203 -//.word 0xe4c11edc -//.word 0x1733e281 -//.word 0x94b6ac69 -//.word 0x4a8d8508 -//.word 0x2ce9a643 -//.word 0xda013c28 -//.word 0x7d6469dc -//.word 0xf28e8bd4 -//.word 0x2cbac048 -//.word 0xd3f8aae5 -//.word 0x317f6fc3 -//.word 0x4f440496 -//.word 0x5bccac28 -//.word 0x4d3ebb07 -//.word 0xcbbca07a -//.word 0x49f322ba -//.word 0x74f1ea5f -//.word 0xd1374219 -//.word 0xa1101ca0 -//.word 0x092156ee -//.word 0x6f403cab -//.word 0x278a4fe9 -//.word 0x4faf4511 -//.word 0xf791501d -//.word 0x860ea308 -//.word 0x58193383 -//.word 0xac10baea -//.word 0xbe490276 -//.word 0x30ef60b4 -//.word 0xae0c7e36 -//.word 0xd2e65e88 -//.word 0x458f9c65 -//.word 0x28b8f42b -//.word 0xb2c6038d -//.word 0x1a285288 -//.word 0xb7e79098 -//.word 0x667e1f2b -//.word 0x2cedd356 -//.word 0x1c09f6c7 -//.word 0x7b168ffb -//.word 0x2397e3b1 -//.word 0x25653d9e -//.word 0xb2ffeb62 -//.word 0x3c2189bb -//.word 0xd89882f8 -//.word 0xe754d3b1 -//.word 0xf5bf12b6 -//.word 0xe14daf45 -//.word 0x3e547b80 -//.word 0xfa1f661d -//.word 0x3d3e8d60 -//.word 0x941f7446 -//.word 0x4fe38f04 -//.word 0x286a08af -//.word 0x25b0bc3d -//.word 0xbf5d87ac -//.word 0x4397c181 -//.word 0x791b0874 -//.word 0x848c406a -//.word 0x090ad9a3 -//.word 0x93075035 -//.word 0x3656f9b9 -//.word 0x7385fb44 -//.word 0x5c6d9c99 -//.word 0xf807bf9c -//.word 0xe982aa0a -//.word 0x4c920d68 -//.word 0xe10a4039 -//.word 0x6cadcd74 -//.word 0x5b412e35 -//.word 0xa8e6d8b3 -//.word 0x01a67872 -//.word 0x274d7cba -//.word 0x947bd547 -//.word 0x60f7fb42 -//.word 0x65463270 -//.word 0xa27d0daa -//.word 0xdd53308d -//.word 0x8c7a5972 -//.word 0xf630a2a0 -//.word 0x961100c1 -//.word 0xc02f1093 -//.word 0x876413e0 -//.word 0xdde736b0 -//.word 0xfc1e18bd -//.word 0x05b38627 -//.word 0xe7ea8969 -//.word 0x8332a28c -//.word 0x0efa549b -//.word 0xb6c5e356 -//.word 0x88815c2a -//.word 0x9114d561 -//.word 0x4339f697 -//.word 0x1b8ab86d -//.word 0x81dd6d81 -//.word 0xf0d4019d -//.word 0x56b07f2e -//.word 0xbe66d6f8 -//.word 0x2cf5de09 -//.word 0xc8f696eb -//.word 0x3f75b01e -//.word 0x67ff4fc5 -//.word 0x22fc0fa0 -//.word 0x8440463a -//.word 0x38dc8964 -//.word 0x1f3a72e1 -//.word 0x3b69a163 -//.word 0xccb501b7 -//.word 0xb87b4c3c -//.word 0x303bd299 -//.word 0x91ef76af -//.word 0x889bf9cd -//.word 0x7a267b23 -//.word 0x23683e7a -//.word 0x7d84ae22 -//.word 0xe3789e2b -//.word 0x76f2d5d8 -//.word 0xc066c950 -//.word 0x975daa97 -//.word 0x4410a2bd -//.word 0xe5355c55 -//.word 0x1019c329 -//.word 0xb9ef0c2c -//.word 0x5667f6b0 -//.word 0x408350d9 -//.word 0x5da7bc52 -//.word 0xfcefb43e -//.word 0x00c4ca72 -//.word 0x41b234e1 -//.word 0x2f748757 -//.word 0xb951c36b -//.word 0x6dac90af -//.word 0xe0d6c729 -//.word 0x50263407 -//.word 0x884c9b8e -//.word 0x04e2f854 -//.word 0x56440baf -//.word 0xc8a2146d -//.word 0x4353dcc5 -//.word 0x6f6cf48e -//.word 0x1c9241af -//.word 0xe10cb9d7 -//.word 0x021c676e -//.word 0x9790b5cb -//.word 0xeb94eaa7 -//.word 0x23caf2d1 -//.word 0x209d5e24 -//.word 0xa6d2abb7 -//.word 0xbd5fc753 -//.word 0x5781d12a -//.word 0x340920c5 -//.word 0x03f6883f -//.word 0xca49d8b1 -//.word 0x8715a7ed -//.word 0x18d6516f -//.word 0x58033c90 -//.word 0x8be760fd -//.word 0xfcac0668 -//.word 0xe4b9cf7d -//.word 0x8e3ef918 -//.word 0xb90cdeb5 -//.word 0x3eabbd28 -//.word 0xf2a6bd8e -//.word 0xce2a2f83 -//.word 0x4dcf1495 -//.word 0x16b6dff9 -//.word 0xdbd47c7d -//.word 0x818d90be -//.word 0x8185039b -//.word 0x8eb3bce9 -//.word 0x78b7ab68 -//.word 0x506d0df6 -//.word 0xcdc2eb03 -//.word 0xeec6e445 -//.word 0xe1032dad -//.word 0x240ed699 -//.word 0xea5b4f4b -//.word 0xc0552a9a -//.word 0x70ae22e7 -//.word 0x25f45d53 -//.word 0xd166ee2f -//.word 0xcc059eb5 -//.word 0xbeeeecf5 -//.word 0xbee65211 -//.word 0xbb37caad -//.word 0x1bbb91a2 -//.word 0xa3362bf2 -//.word 0x97e8a701 -//.word 0x22632402 -//.word 0xf79b94af -//.word 0x393cc03d -//.word 0x99408d8f -//.word 0xbec07daa -//.word 0xe90a7869 -//.word 0xd9f5cd71 -//.word 0xec717468 -//.word 0x88629662 -//.word 0xb9af4e9c -//.word 0x1b95b26d -//.word 0xfb420d79 -//.word 0xb99f6f28 -//.word 0x706d6857 -//.word 0xd993104d -//.word 0x6db64af0 -//.word 0xca0b4a38 -//.word 0x586955e5 -//.word 0x2ca3c86d -//.word 0x2d145c39 -//.word 0x757ba810 -//.word 0xfa0ae8d4 -//.word 0x6db9fc6c -//.word 0x62e0b401 -//.word 0xb2054a6d -//.word 0x1df230f0 -//.word 0x340b0c25 -//.word 0x77df0235 -//.word 0xbafd314b -//.word 0xcd098048 -//.word 0x5b0f9ab7 -//.word 0x13163703 -//.word 0x06f99ee7 -//.word 0x50726727 -//.word 0xfb78867e -//.word 0x20cb85d7 -//.word 0x4fcd11c0 -//.word 0x3193b81b -//.word 0x6c3cf116 -//.word 0xc7815d5e -//.word 0x8f8e4c90 -//.word 0x391083f1 -//.word 0x48903d5e -//.word 0x72ff6f86 -//.word 0xfe925056 -//.word 0x70d019b5 -//.word 0x68e90972 -//.word 0xc849ad7a -//.word 0x156d5e4f -//.word 0x20f50bb5 -//.word 0xe5fb39af -//.word 0xb3a447a9 -//.word 0x8df4f7f7 -//.word 0xd1e72a7e -//.word 0x17bdebb1 -//.word 0x5c95afc0 -//.word 0x603ddb0b -//.word 0x4c4987dd -//.word 0x98628257 -//.word 0x2ce196aa -//.word 0xc59d0d8a -//.word 0x9b0073df -//.word 0x41619ebd -//.word 0xcc8dec96 -//.word 0x37a7ccae -//.word 0x063380d0 -//.word 0x2a6d2140 -//.word 0x25dfe3f0 -//.word 0x6e329af6 -//.word 0x17457d3e -//.word 0xad7c2a7c -//.word 0x605beb65 -//.word 0x6353381f -//.word 0x96db7df6 -//.word 0x63c31d50 -//.word 0xe5c5b6e3 -//.word 0x505ea725 -//.word 0x8ddccf04 -//.word 0x24b798d8 -//.word 0x5f243496 -//.word 0xade82746 -//.word 0x446a06b7 -//.word 0x0a0d7e71 -//.word 0xb6bc97eb -//.word 0x32c73afe -//.word 0x44edf29a -//.word 0x6ebaefb8 -//.word 0x1313508f -//.word 0xda0fa20b -//.word 0x5808a37b -//.word 0xe9f24c8a -//.word 0xdeec0f70 -//.word 0xde155e69 -//.word 0x86a16c66 -//.word 0x532c3703 -//.word 0xc24dc6ba -//.word 0xb56faf56 -//.word 0x19dcddaa -//.word 0xc61b9082 -//.word 0xa67ca5da -//.word 0x1af1184e -//.word 0x991fc7d2 -//.word 0x9bb579a3 -//.word 0xb5fd1e7e -//.word 0x05b1590f -//.word 0xd00f3bac -//.word 0x6a2f5243 -//.word 0x5695e291 -//.word 0xaf037295 -//.word 0xc6908a45 -//.word 0x0dfebc7f -//.word 0x3449e142 -//.word 0x917ca51e -//.word 0xc5c846e9 -//.word 0x9dd798b4 -//.word 0x365e4dfd -//.word 0x65f27327 -//.word 0x551c3e27 -//.word 0x72af087f -//.word 0x86599670 -//.word 0x22799d6b -//.word 0x403084ca -//.word 0x26bb6cbd -//.word 0x8e006e87 -//.word 0x036623ea -//.word 0x8eea6adf -//.word 0x9270658b -//.word 0xf556c56f -//.word 0x804f48df -//.word 0x896f7fb5 -//.word 0xcf82d546 -//.word 0xa5a2cd95 -//.word 0x53098bc7 -//.word 0xb92396d7 -//.word 0x35e7dc8b -//.word 0xc768f7a7 -//.word 0x73a7ae60 -//.word 0xe7acbf13 -//.word 0x5ed5dc37 -//.word 0xc46df391 -//.word 0x1b80b2a6 -//.word 0x1dee4b76 -//.word 0x23bf7467 -//.word 0x45b6b280 -//.word 0xc329d8d7 -//.word 0xa410ca4d -//.word 0x9c5b8778 -//.word 0x338967e1 -//.word 0x2476a170 -//.word 0x03740f24 -//.word 0x239e3607 -//.word 0xb7698162 -//.word 0x377ccd2d -//.word 0x06c22ac9 -//.word 0x51bde0f2 -//.word 0x3a1db1ef -//.word 0x36915e0b -//.word 0xb3dd6d49 -//.word 0xff2d2854 -//.word 0x65a8e9b5 -//.word 0x99499548 -//.word 0x56ea67f1 -//.word 0x45a2ef8b -//.word 0x21515a21 -//.word 0x1979f361 -//.word 0x7550ea4d -//.word 0x7d135434 -//.word 0x969c74e1 -//.word 0xaf373912 -//.word 0xdbb2072c -//.word 0x3fb3bb2c -//.word 0x2f4ee9e1 -//.word 0x94d76759 -//.word 0x91f51099 -//.word 0x66f8c290 -//.word 0x946da94e -//.word 0x42efc072 -//.word 0xdf4094e1 -//.word 0x09984cbe -//.word 0xad3ce696 -//.word 0x7053c3da -//.word 0x4ef56693 -//.word 0x81867951 -//.word 0xa5421064 -//.word 0x1918324f -//.word 0xa8bc967a -//.word 0x69f8aa27 -//.word 0xe343d9a7 -//.word 0x75940ece -//.word 0xf67874a4 -//.word 0x9863815d -//.word 0x1243328c -//.word 0xfe5b9893 -//.word 0x7f4f935e -//.word 0x287bde51 -//.word 0x19894b7e -//.word 0x6b43501c -//.word 0xcfa5c334 -//.word 0x7137e29e -//.word 0x239a962c -//.word 0xb760f925 -//.word 0xac2115f5 -//.word 0x0ecaef22 -//.word 0x9739c482 -//.word 0x1a0792ac -//.word 0x22a5daac -//.word 0xd6aba4fb -//.word 0x1f6cc5ae -//.word 0x0dce5ded -//.word 0x7759a3a7 -//.word 0xe28de584 -//.word 0xa479ca1b -//.word 0x4a89db66 -//.word 0x36a04172 -//.word 0x8d66d05b -//.word 0x50e44578 -//.word 0xc84eccd3 -//.word 0x281fc6dc -//.word 0x6e6bc85e -//.word 0x8a71e7b1 -//.word 0xc2713332 -//.word 0x55bd81f0 -//.word 0x5e116ea8 -//.word 0xfc27a0f4 -//.word 0xb0874fbf -//.word 0x069d04fc -//.word 0x780da197 -//.word 0x8f4ba2ac -//.word 0x4b66a2f8 -//.word 0xc524218d -//.word 0x135484c9 -//.word 0x6c605d88 -//.word 0x8c22ed99 -//.word 0x5af8e86f -//.word 0xc91b7719 -//.word 0xfc2c8375 -//.word 0xad1031a0 -//.word 0xcffea9b0 -//.word 0x72d61ca6 -//.word 0xe8b5059e -//.word 0x26c6af49 -//.word 0x6c5bf79d -//.word 0x293c53cb -//.word 0x193e1372 -//.word 0xb018e712 -//.word 0xbb73a2c3 -//.word 0x45403d27 -//.word 0xb74e1f9d -//.word 0x441c9bb7 -//.word 0x84ecbbef -//.word 0x5f183c95 -//.word 0x2da9d90c -//.word 0x1b26cd36 -//.word 0xd1aa932d -//.word 0x5239f034 -//.word 0x235433ed -//.word 0xafcbbccc -//.word 0xead3bbcb -//.word 0x35583a5f -//.word 0x82955eab -//.word 0xb8e1e9f4 -//.word 0x59cc0456 -//.word 0x626a3cb5 -//.word 0x72efcaf6 -//.word 0x2f7c176e -//.word 0xe5397f9a -//.word 0x71a45511 -//.word 0x5e2928b8 -//.word 0x4df24535 -//.word 0x9a007da6 -//.word 0x3c7b2992 -//.word 0xed466b1f -//.word 0x8cd7b686 -//.word 0xbf4690c5 -//.word 0xdca39694 -//.word 0x0a8dc199 -//.word 0xa300e9df -//.word 0xdd6f8785 -//.word 0xaa13bfb3 -//.word 0xdc829ed2 -//.word 0x8d83a0fd -//.word 0xbe2175b2 -//.word 0x3efe04ce -//.word 0xceeab1b8 -//.word 0x82b4dbdc -//.word 0x6a40a95b -//.word 0x72da0700 -//.word 0x87caeb77 -//.word 0xfb29ddb9 -//.word 0x2bf3b6cb -//.word 0x5f5da8a8 -//.word 0xf1687e7c -//.word 0xb2b62512 -//.word 0x899c6c90 -//.word 0x5d7a0862 -//.word 0x3547db74 -//.word 0x9e7076a4 -//.word 0x4ee3dc77 -//.word 0x0666880a -//.word 0xbd2eb24c -//.word 0xfaadcf6b -//.word 0x82ab578c -//.word 0x3398cabf -//.word 0x3021f532 -//.word 0x3e0172a5 -//.word 0x6e1a6e1d -//.word 0xfdc4aedd -//.word 0x7865d492 -//.word 0x2342dfce -//.word 0x9c94f2b7 -//.word 0xbcdf5601 -//.word 0xbe7fc119 -//.word 0xa383d9a3 -//.word 0xd4bff427 -//.word 0x0a1d2207 -//.word 0x6b346db5 -//.word 0xf61c5f22 -//.word 0x2080c57a -//.word 0xbff4b30e -//.word 0x2889c892 -//.word 0x949fb388 -//.word 0xc9fbf6fc -//.word 0xf61aea72 -//.word 0xdec4041d -//.word 0x38e45651 -//.word 0x5696593b -//.word 0x0682e9d0 -//.word 0xb6699103 -//.word 0xdbfd093b -//.word 0x93f6fd04 -//.word 0x88621004 -//.word 0x183c2132 -//.word 0xb441cd42 -//.word 0x86ff3563 -//.word 0x572f012d -//.word 0xaf44a5d5 -//.word 0x3e44e2a4 -//.word 0x7ad790a7 -//.word 0x8a9e9ca7 -//.word 0x63c54d5b -//.word 0x31dccbdd -//.word 0xf8e2e15b -//.word 0x7ba3020f -//.word 0x5d458a71 -//.word 0x861d47ab -//.word 0xc8c7384d -//.word 0xc2759442 -//.word 0x05870e03 -//.word 0x765c580a -//.word 0xf468e68a -//.word 0x3a87f45d -//.word 0x0691ca3d -//.word 0x7b2f3f38 -//.word 0xc3ed7c5e -//.word 0xfa9002bd -//.word 0x47a9ef8f -//.word 0x4c6a7cb1 -//.word 0xc1b9cb57 -//.word 0x5b83e0ff -//.word 0xf353eda3 -//.word 0xe423d233 -//.word 0xb572e442 -//.word 0xf896ed00 -//.word 0x71547568 -//.word 0x7bae40ba -//.word 0xa8fc182c -//.word 0xa83ecddc -//.word 0x6cb1790a -//.word 0x8aa00884 -//.word 0xe47df861 -//.word 0x85305ef2 -//.word 0xcbaf2af6 -//.word 0xcbcfab0d -//.word 0xf15a5670 -//.word 0xe761c3de -//.word 0xb8d3f8da -//.word 0x364fea13 -//.word 0x99374124 -//.word 0x68065c7d -//.word 0x9de395a1 -//.word 0x0476c693 -//.word 0xe4fa0c8a -//.word 0xe193caec -//.word 0x21e2f17a -//.word 0xaed77fc8 -//.word 0x1bc746f1 -//.word 0x6bbfef88 -//.word 0x2e173ed2 -//.word 0xed4a9832 -//.word 0xc805c2e4 -//.word 0x5e7debee -//.word 0xed06ed54 -//.word 0xbae2d08c -//.word 0xb4568f31 -//.word 0x54031ffc -//.word 0xc774aeef -//.word 0x4ff429d3 -//.word 0xe7a200e5 -//.word 0x26c72dcd -//.word 0x656673cf -//.word 0x2415e345 -//.word 0xaa0ca54d -//.word 0xec7cf5bf -//.word 0xb0226c62 -//.word 0xf21b815f -//.word 0x87fa4ff5 -//.word 0x0018996f -//.word 0xd12b0b53 -//.word 0xb31ac2dd -//.word 0x46100fab -//.word 0xfbd078ba -//.word 0x31480091 -//.word 0x9e68a9bc -//.word 0xf134367c -//.word 0xb51835bd -//.word 0x797c3d48 -//.word 0x2e99753a -//.word 0xd08b55b5 -//.word 0x49a7b1d5 -//.word 0x920ef3e6 -//.word 0x1b82a8d4 -//.word 0x6d793ee2 -//.word 0x0e700b9f -//.word 0xa4829217 -//.word 0x5e390246 -//.word 0x90a400d2 -//.word 0x9daaa6f9 -//.word 0x1a9dccc7 -//.word 0x3013868d -//.word 0x42f1ed90 -//.word 0xd0c823fe -//.word 0x9c659126 -//.word 0x0ba373e7 -//.word 0xcd849769 -//.word 0xc080610c -//.word 0x121d139e -//.word 0xa7c04bd1 -//.word 0xbac3ceec -//.word 0xc6c783c0 -//.word 0xa74cc3de -//.word 0xfc7fd007 -//.word 0xd152a2e4 -//.word 0x7bd2eaf7 -//.word 0xc2b651d2 -//.word 0x46330087 -//.word 0x1b18665f -//.word 0xb71635cf -//.word 0x0e5faea7 -//.word 0xfb741f8d -//.word 0xe237aaaa -//.word 0x944847a3 -//.word 0x728e0ccb -//.word 0xd614ad97 -//.word 0xae173f52 -//.word 0x6a5d4111 -//.word 0x19c8dcea -//.word 0xce2a6a61 -//.word 0x495b3623 -//.word 0xd38982f7 -//.word 0x6ad0cff1 -//.word 0x1e0a58e8 -//.word 0xbbe9e02b -//.word 0xa843ad70 -//.word 0x0facd50d -//.word 0x3e4ab86b -//.word 0x4ee5ceb7 -//.word 0x023ea3da -//.word 0xf1a21fac -//.word 0xe8be0b64 -//.word 0x8ab5d154 -//.word 0x397083d3 -//.word 0x3a361f7a -//.word 0x137c1293 -//.word 0x38feface -//.word 0xe70eb036 -//.word 0x512c8664 -//.word 0xfad8cdf2 -//.word 0x62a49b33 -//.word 0xe58dcb21 -//.word 0xe08b4497 -//.word 0x15677fc1 -//.word 0x51cd43d0 -//.word 0x4ca2b3f2 -//.word 0xd0978b81 -//.word 0x1dffa77a -//.word 0x8ddec532 -//.word 0x74428b44 -//.word 0x4ad6ccce -//.word 0x0cb407dd -//.word 0xdf7b3025 -//.word 0xf7a1b3f6 -//.word 0xb70bb76b -//.word 0x19db9fe5 -//.word 0x518ad7b7 -//.word 0xad36cd23 -//.word 0xc03d3d86 -//.word 0xbf0ab2cf -//.word 0x2b2f4a35 -//.word 0xb0b4b92a -//.word 0x4eaf908a -//.word 0xb615c019 -//.word 0xf7d0592c -//.word 0x591298a6 -//.word 0x89e82126 -//.word 0xf712897f -//.word 0x7d121769 -//.word 0x4183cc76 -//.word 0xdcaca047 -//.word 0xbc550fff -//.word 0xc6d9d4f8 -//.word 0x407df5b5 -//.word 0xef00ff18 -//.word 0x7c7493d5 -//.word 0x1d4c2127 -//.word 0x71b5f4c2 -//.word 0xab2a6f08 -//.word 0xf242967f -//.word 0x08cdd083 -//.word 0x2a20ea38 -//.word 0x38ad60c3 -//.word 0x16d7d8ba -//.word 0x5204f0d8 -//.word 0x07f339f6 -//.word 0x01508336 -//.word 0x21855c82 -//.word 0x03d4d335 -//.word 0xdfa28217 -//.word 0xad16cb8f -//.word 0x8de36114 -//.word 0x65620ae5 -//.word 0xcce4a4fa -//.word 0x2746663a -//.word 0x11c669ee -//.word 0x01146776 -//.word 0x26adc23a -//.word 0x9664c8e4 -//.word 0xa84135cd -//.word 0x9e8ff9b4 -//.word 0x88313cb6 -//.word 0x6535a07a -//.word 0x8aacc6ad -//.word 0x48b813ae -//.word 0xc9e6b48a -//.word 0x3bbedf2a -//.word 0x30995ccb -//.word 0x45b345af -//.word 0x02810a12 -//.word 0x0245b760 -//.word 0x54df7aa5 -//.word 0x20e66045 -//.word 0x8ef75fed -//.word 0xe34d99c9 -//.word 0xee92dff8 -//.word 0xa2f5743d -//.word 0x047d14f7 -//.word 0x489d3553 -//.word 0x36088dc0 -//.word 0xd3c6d4a3 -//.word 0x3e88cb4c -//.word 0xd8397d29 -//.word 0xa7d5c53a -//.word 0xfd7e10c5 -//.word 0x54cd644b -//.word 0x7d66a2ba -//.word 0xfacf08e4 -//.word 0xa882f930 -//.word 0xa1400190 -//.word 0x60a914b3 -//.word 0x260a167b -//.word 0x9d76a1b1 -//.word 0xbb1802f8 -//.word 0xeac784ff -//.word 0x66dbf2fb -//.word 0xe63f5755 -//.word 0x7ec8089f -//.word 0xc4c5e4cd -//.word 0x32d8dba2 -//.word 0xcb04ad68 -//.word 0x0106f4e4 -//.word 0xd7e96589 -//.word 0x43d553ec -//.word 0xd6287478 -//.word 0x9ec7e863 -//.word 0x4cb777e0 -//.word 0x92e71b97 -//.word 0xcf50be52 -//.word 0xee4044f9 -//.word 0x8bf3ccc0 -//.word 0x5864339f -//.word 0xc062da03 -//.word 0xcae6aac3 -//.word 0x3fa45555 -//.word 0x0fe0de42 -//.word 0xf1835bd7 -//.word 0x4a6efa1d -//.word 0x500e420c -//.word 0x6f319bfc -//.word 0xec18115c -//.word 0xc8cd55a6 -//.word 0xe7b70492 -//.word 0x716b2c8b -//.word 0x79c50d5f -//.word 0xdc381c3a -//.word 0x6c624ed5 -//.word 0x4ee392eb -//.word 0xa1709fed -//.word 0x6023f1f6 -//.word 0x8a150e01 -//.word 0x802f0e5a -//.word 0xae3d5a52 -//.word 0x6d44b437 -//.word 0x28167883 -//.word 0xbe232154 -//.word 0x28920e1c -//.word 0x5c91879a -//.word 0x71e9fb09 -//.word 0x03d58b97 -//.word 0xd914cd18 -//.word 0xc53dc9fc -//.word 0xcc53487e -//.word 0x87994f1f -//.word 0xc9a7e653 -//.word 0x83be1d7a -//.word 0xe4595111 -//.word 0xc404ac2a -//.word 0x4271eb19 -//.word 0xacc96471 -//.word 0xa040472f -//.word 0x71ec2434 -//.word 0xccd7adf9 -//.word 0x9c53be7e -//.word 0x2a8d9a83 -//.word 0x896578fb -//.word 0x317d3ebe -//.word 0xea908c7e -//.word 0xec06fcfc -//.word 0x44c5a87b -//.word 0x7949ed75 -//.word 0x70f76f8e -//.word 0x8dae5dc6 -//.word 0x1ba0f7f2 -//.word 0xee604d6d -//.word 0x463b490b -//.word 0xf7ccef4e -//.word 0xc7cbe4dd -//.word 0x18262d31 -//.word 0xc7533a92 -//.word 0x53e42342 -//.word 0x425c31f8 -//.word 0xc041a08f -//.word 0x8a72a300 -//.word 0x0abba98e -//.word 0xc3a7df40 -//.word 0xf095f694 -//.word 0x680e2672 -//.word 0xc556735f -//.word 0xc5412ff3 -//.word 0xf148c08d -//.word 0x7cdca345 -//.word 0x6dfbb122 -//.word 0x0100a18e -//.word 0x4abfcf06 -//.word 0x1dd13b16 -//.word 0x2b2dd585 -//.word 0x6ef8f8cd -//.word 0xc79f34cd -//.word 0xe52250c2 -//.word 0x68b38f74 -//.word 0x467f33ad -//.word 0x6ecc40ef -//.word 0xac448266 -//.word 0xcd90d11c -//.word 0x0329946c -//.word 0x8b6b84b9 -//.word 0x8cecb360 -//.word 0x430bccea -//.word 0x5dcc9c87 -//.word 0xa4e3d1b8 -//.word 0xde0e024b -//.word 0xf2a8f08c -//.word 0x4d7c0cba -//.word 0x84d739b8 -//.word 0x3be1d205 -//.word 0x452cefee -//.word 0x0d8ee402 -//.word 0x342c0bc7 -//.word 0x7bd8c4ab -//.word 0xe49db93d -//.word 0x1497679d -//.word 0xfc08da31 -//.word 0xb8a9b79a -//.word 0xb73e80e7 -//.word 0x1d6d1408 -//.word 0x65d07585 -//.word 0x4b49ce70 -//.word 0xe996b598 -//.word 0x2025adff -//.word 0x3929ef8e -//.word 0xcced6a08 -//.word 0xe168083d -//.word 0x56133380 -//.word 0x81f7985a -//.word 0x150a2a80 -//.word 0x4abb6a03 -//.word 0x38cce6c7 -//.word 0x84600036 -//.word 0x3f55f135 -//.word 0x0bd30e57 -//.word 0x80254951 -//.word 0xcec8faaf -//.word 0xa3c2e0c5 -//.word 0x4f3562e7 -//.word 0x26341bdd -//.word 0x25d59691 -//.word 0xd988560b -//.word 0x7da71a9f -//.word 0x634e5f65 -//.word 0x956c25ea -//.word 0xbb1af625 -//.word 0x3f2c25ad -//.word 0xb0065429 -//.word 0x64b23807 -//.word 0x622fa171 -//.word 0x7e0bb47c -//.word 0xc6347ba3 -//.word 0x1d0ba175 -//.word 0x26ba768a -//.word 0x64c739bb -//.word 0x9fea9792 -//.word 0x891c6f00 -//.word 0xa1f1d84e -//.word 0x58276556 -//.word 0x727fa8f3 -//.word 0xb0cbf4b6 -//.word 0xac4967db -//.word 0x042f287b -//.word 0xba87ee03 -//.word 0xdb3dc2e4 -//.word 0x5f77058c -//.word 0x5124b496 -//.word 0x30d8eb3d -//.word 0x94d7a817 -//.word 0x1470d200 -//.word 0x688c7a53 -//.word 0xcb866061 -//.word 0xa33db91b -//.word 0x64682f12 -//.word 0xb22a2aa2 -//.word 0xc6e74e69 -//.word 0x125545fe -//.word 0x28d6bee0 -//.word 0xd805b5ad -//.word 0x988ef595 -//.word 0x2a44dc0d -//.word 0x786d5fc8 -//.word 0xc3604de3 -//.word 0xfc53d860 -//.word 0x726e51d5 -//.word 0xae243365 -//.word 0x9bc263f0 -//.word 0xeb48b687 -//.word 0xb579b423 -//.word 0x632e9c96 -//.word 0xcbefa8c1 -//.word 0x9cc49108 -//.word 0xfc495603 -//.word 0x6f013a76 -//.word 0xfbec0b84 -//.word 0x8a5caa1f -//.word 0x8f04c8c3 -//.word 0xec52ee64 -//.word 0x14ffc0a5 -//.word 0x6ce4824a -//.word 0xf80fdbf0 -//.word 0x3316d9fb -//.word 0x3eab36d1 -//.word 0x3d71da46 -//.word 0xff0ea056 -//.word 0xdd825d1a -//.word 0xe4b71ff5 -//.word 0x3658b20f -//.word 0xade76904 -//.word 0xc20a1add -//.word 0xad266b3f -//.word 0xce2f4ce2 -//.word 0x4cbfc545 -//.word 0xfc65f2a0 -//.word 0x843f4c1b -//.word 0xc0cb293d -//.word 0x64fa87a7 -//.word 0xe3860502 -//.word 0x90863236 -//.word 0x03400adc -//.word 0xbf3ebef7 -//.word 0x12a4b4de -//.word 0x3cc0cf7d -//.word 0xd3e3f0bd -//.word 0x656fbd41 -//.word 0x6032a153 -//.word 0x2ff2131e -//.word 0xa6491c1d -//.word 0xa0b413d3 -//.word 0xe6e6acbd -//.word 0x53623185 -//.word 0x36480e78 -//.word 0xf86f933a -//.word 0xffb5f6b8 -//.word 0xd193975f -//.word 0x7df5888c -//.word 0x37484d43 -//.word 0x42d4e023 -//.word 0x134cf999 -//.word 0xb3a38b55 -//.word 0x652292fa -//.word 0x89b80c1a -//.word 0xc0914561 -//.word 0x51e95810 -//.word 0xcb23f3ad -//.word 0xec155af9 -//.word 0xc2a7af23 -//.word 0x109c703b -//.word 0xf3af41e9 -//.word 0xc5e2ec5f -//.word 0x4213a68c -//.word 0xe9d09493 -//.word 0xa56c8d7b -//.word 0xad522228 -//.word 0xa99adb8a -//.word 0x16dac414 -//.word 0xeb3f2870 -//.word 0x7ddc9d71 -//.word 0xa0414049 -//.word 0x0f5042fc -//.word 0x0e4ca414 -//.word 0x4d333e97 -//.word 0x104e0636 -//.word 0x8d068fc7 -//.word 0x95f9d0f5 -//.word 0x774d2736 -//.word 0x22449efe -//.word 0x89116c33 -//.word 0x4cebbfe0 -//.word 0x945fb82d -//.word 0x3eeab78f -//.word 0x3dc7da3c -//.word 0x3906c0e2 -//.word 0x7cde9398 -//.word 0x0f444515 -//.word 0x20bc191f -//.word 0xa7706647 -//.word 0x4a7f98d4 -//.word 0x7d9777fd -//.word 0xedc6ac5b -//.word 0x1f8d809d -//.word 0x5437e87e -//.word 0xb168bff4 -//.word 0x9cf952aa -//.word 0x690321b1 -//.word 0x363ae473 -//.word 0x137dcde8 -//.word 0x67ab0d0c -//.word 0x8fb79990 -//.word 0xc7ff2ecf -//.word 0x4ed99205 -//.word 0xc56f1ebb -//.word 0xd8ce7986 -//.word 0x2139a6f1 -//.word 0x49c341b8 -//.word 0x711d0537 -//.word 0xd0ac9221 -//.word 0x9dde6d75 -//.word 0x2fbf49ae -//.word 0x63c7853b -//.word 0x3ef6f52e -//.word 0xd324e538 -//.word 0x67925bd5 -//.word 0xd4c49dc4 -//.word 0x2b93f3ba -//.word 0x9d7eae57 -//.word 0x9c416959 -//.word 0x3da98f10 -//.word 0xe1a61e12 -//.word 0x14a2aa2f -//.word 0xb511a4a7 -//.word 0x5849dc9b -//.word 0xe89445c2 -//.word 0x9184f85d -//.word 0xdc877c6d -//.word 0x1cbb4523 -//.word 0x0a047a98 -//.word 0xac5bfcbe -//.word 0x7b69a397 -//.word 0xc454cba4 -//.word 0x4fd90fa1 -//.word 0x3f9b546f -//.word 0x39ba0a52 -//.word 0xc8a8ae5c -//.word 0x00389329 -//.word 0x62f8e3cd -//.word 0x00c1e00b -//.word 0xe28c70c8 -//.word 0xa787d9be -//.word 0x6f69c975 -//.word 0xf902996f -//.word 0x0916d2a3 -//.word 0x0d6bf12e -//.word 0xff216744 -//.word 0x8d42e46c -//.word 0x789ad5ed -//.word 0x3ac92c83 -//.word 0xeb965f57 -//.word 0x6586b32e -//.word 0xa7aebae1 -//.word 0x77c51a0d -//.word 0x4c7d910b -//.word 0x6a133623 -//.word 0x4f2502fc -//.word 0x4ec58e57 -//.word 0x7acb1efd -//.word 0xc56fdff6 -//.word 0x69176dfc -//.word 0x876d9830 -//.word 0x0eb5680b -//.word 0xdf5e5f96 -//.word 0x2fd6fdde -//.word 0x2ca38aa2 -//.word 0xe3b00f50 -//.word 0x61e4a630 -//.word 0x18f9f3de -//.word 0x858cf3fd -//.word 0x1070f42a -//.word 0x3448e52f -//.word 0xdf55d079 -//.word 0x1c8ca5cd -//.word 0xefec3936 -//.word 0x800e8e42 -//.word 0x7cfe556d -//.word 0xb949b1de -//.word 0x19573e51 -//.word 0xb0fb5255 -//.word 0x294983b7 -//.word 0x65a8693e -//.word 0x6628a598 -//.word 0x6c152195 -//.word 0x5dcc9a93 -//.word 0x6acd5c3a -//.word 0xf0124d69 -//.word 0x9c9f2d6f -//.word 0xd35b1c7f -//.word 0x511e5d5e -//.word 0x100b595f -//.word 0x6b20e791 -//.word 0x830bca37 -//.word 0xe23f7b78 -//.word 0x5e482a58 -//.word 0x405bffe7 -//.word 0xa632a5b8 -//.word 0x26170995 -//.word 0xb43e5f71 -//.word 0xc657679e -//.word 0xb664ee41 -//.word 0x67c89702 -//.word 0x2ba1db08 -//.word 0xe4584f24 -//.word 0x6a77254c -//.word 0x2dbaf64c -//.word 0x1c68bfb8 -//.word 0xc5e32925 -//.word 0xbd7e0d98 -//.word 0x4290373f -//.word 0x1fc76a5f -//.word 0xd0bea58e -//.word 0xe7d1a522 -//.word 0xae30abe9 -//.word 0x0e327f1b -//.word 0xafecb58c -//.word 0x61032f26 -//.word 0xbbbee397 -//.word 0x015fde47 -//.word 0x4bb4898d -//.word 0xe4e92c22 -//.word 0xf1a0b0d6 -//.word 0x5343a981 -//.word 0xce99943d -//.word 0x6a985cd2 -//.word 0x197b2472 -//.word 0x9b1440a7 -//.word 0x9f628489 -//.word 0x2b66c234 -//.word 0x3d338e79 -//.word 0xb34544d4 -//.word 0x68134d9e -//.word 0xa0e79d84 -//.word 0xa6ee8038 -//.word 0xb38b9766 -//.word 0x12f11dea -//.word 0x82f16f40 -//.word 0xdc10cc3c -//.word 0xf5dd59fb -//.word 0xc6826819 -//.word 0xca98f924 -//.word 0xa8408151 -//.word 0x126feb6e -//.word 0xed89dd18 -//.word 0xb2323c2e -//.word 0x1461f286 -//.word 0xe3b5efde -//.word 0x300d6d15 -//.word 0xb253799b -//.word 0x6898af26 -//.word 0x806645a6 -//.word 0x78514b7c -//.word 0x83d030e6 -//.word 0x2e4b89be -//.word 0x43750e65 -//.word 0xeddce5fa -//.word 0x1ebf24cf -//.word 0x2e1f911d -//.word 0xc518acf6 -//.word 0xfa72ef7c -//.word 0xbc745451 -//.word 0x71f8184e -//.word 0xdec5be78 -//.word 0x4718582f -//.word 0xd78402a9 -//.word 0x42fcaf9f -//.word 0xa82f2846 -//.word 0xbd145181 -//.word 0x27c5ae55 -//.word 0x2790279d -//.word 0x7c4b08ff -//.word 0x84e94c1e -//.word 0xa54b1b11 -//.word 0xeb589115 -//.word 0xf250c17e -//.word 0x075dfaf4 -//.word 0x8a6c49db -//.word 0x963a3e13 -//.word 0xe5b2f3e2 -//.word 0xed764b2e -//.word 0x4fbc78f0 -//.word 0x725bc0e5 -//.word 0x6b258087 -//.word 0x2178713b -//.word 0xae102acc -//.word 0x081fe618 -//.word 0xe0a08809 -//.word 0xcae8dcc7 -//.word 0x9f7e202c -//.word 0x1f2cc379 -//.word 0xdb566c47 -//.word 0x538b3ec0 -//.word 0x5b5a5b0e -//.word 0xc367a614 -//.word 0x36bece5c -//.word 0x63668851 -//.word 0x5b3a1baf -//.word 0x3af42237 -//.word 0x0a8b8da7 -//.word 0xe4bfeae9 -//.word 0x58f1e38b -//.word 0x1039076f -//.word 0xafb3cdc4 -//.word 0xff19d534 -//.word 0x4c97725f -//.word 0x0bda6689 -//.word 0xc06bec8f -//.word 0x1e3bfc20 -//.word 0x6f7fca29 -//.word 0x36bd9091 -//.word 0x13278d27 -//.word 0xe8294dd9 -//.word 0x3a3e2c26 -//.word 0xda0716d6 -//.word 0xc49e90e8 -//.word 0x4728fccc -//.word 0x66a918d2 -//.word 0x7f1dc9e3 -//.word 0x2ac4176f -//.word 0x64bd78a6 -//.word 0xedd651eb -//.word 0xeea3ba85 -//.word 0xdfcd8298 -//.word 0xa8ad7254 -//.word 0x0619d66d -//.word 0x317e3acb -//.word 0xbc2f7282 -//.word 0xbcfddd04 -//.word 0x2c08ea96 -//.word 0x90d5da00 -//.word 0xd9a0c889 -//.word 0x89f3e722 -//.word 0x17770ce2 -//.word 0x950b6cb2 -//.word 0x9013a64a -//.word 0x3812045c -//.word 0xc07cfd0e -//.word 0x08c5ffae -//.word 0x7abe6ca1 -//.word 0x3221e39d -//.word 0x616ac019 -//.word 0xf3e9e601 -//.word 0x6f16bcad -//.word 0x1f247514 -//.word 0x72d9953d -//.word 0x9e9cb0f7 -//.word 0x89d075ca -//.word 0xea60ec2d -//.word 0xab9bfcf9 -//.word 0x9343301e -//.word 0x21e0bb95 -//.word 0xbb5ab996 -//.word 0x08c7b70a -//.word 0x9a827643 -//.word 0xd07deceb -//.word 0xfad88c3a -//.word 0xbfb2c76c -//.word 0xbc3fd373 -//.word 0x6e1aabe9 -//.word 0x52dd5748 -//.word 0x4af06d5d -//.word 0x439ed8fa -//.word 0x156ed8ec -//.word 0xaab04a2c -//.word 0x63562a5a -//.word 0xb7055666 -//.word 0x1e6c9491 -//.word 0x2dd5d794 -//.word 0x02f9be1e -//.word 0xe2195e84 -//.word 0x214a41b4 -//.word 0x4211ae6c -//.word 0x602f2ba9 -//.word 0xcdbe4161 -//.word 0xf87d7f74 -//.word 0x9469c2e1 -//.word 0xf68db335 -//.word 0xbf1a904a -//.word 0xbcba302d -//.word 0x0a224160 -//.word 0x7ee6d542 -//.word 0x43921dcb -//.word 0xc5f6737c -//.word 0xcec19e96 -//.word 0xef52528b -//.word 0x22caf7b2 -//.word 0xad66ab3e -//.word 0x4a0c8a71 -//.word 0x84232d0d -//.word 0x64a8700c -//.word 0x4d7e7990 -//.word 0x2506f61d -//.word 0xb5f0a506 -//.word 0x53511a25 -//.word 0xbef5bdcf -//.word 0x49f61207 -//.word 0x3c8d3df2 -//.word 0x7729c58c -//.word 0x58be9898 -//.word 0xdf604fdd -//.word 0x1010b48f -//.word 0x99d6810c -//.word 0xb5106bc9 -//.word 0x50095f8b -//.word 0x6ccd0cda -//.word 0xc33ca1b2 -//.word 0xae5ed87d -//.word 0x45f6333e -//.word 0xc85a850f -//.word 0x3e81b5cd -//.word 0x5b5ebf12 -//.word 0xa76cfb63 -//.word 0xdd8ba2ab -//.word 0x910a8ee8 -//.word 0x16054125 -//.word 0x9ff129a8 -//.word 0xa475236c -//.word 0x887b3dd2 -//.word 0x7888c093 -//.word 0x96486ef9 -//.word 0x576e084f -//.word 0x29bb1396 -//.word 0x5a5bdc79 -//.word 0x3578ba83 -//.word 0x6e0a9390 -//.word 0xc0eca181 -//.word 0xd4357634 -//.word 0x65c53eb4 -//.word 0xa21e45ac -//.word 0xd376b922 -//.word 0x400ab061 -//.word 0x4eb46c37 -//.word 0xecc0de61 -//.word 0x2dfc6a44 -//.word 0x360eeade -//.word 0x5b0af5fb -//.word 0x854461ac -//.word 0xd76306f5 -//.word 0x91b7c5c6 -//.word 0x34cdca2c -//.word 0xe7400dc9 -//.word 0x19d11f82 -//.word 0x68ba2377 -//.word 0xc1401a38 -//.word 0xc9886536 -//.word 0x7cab8477 -//.word 0x140c248e -//.word 0x2dea59cb -//.word 0x263128af -//.word 0xca9648a2 -//.word 0x30e229e8 -//.word 0xdf8e36d2 -//.word 0x36915831 -//.word 0x0c76bb10 -//.word 0x93b1d4a3 -//.word 0x8233a37a -//.word 0x733c35fa -//.word 0x89716e0e -//.word 0x572e051a -//.word 0xfd1dd031 -//.word 0x94084287 -//.word 0xcdeb3229 -//.word 0xd44eddeb -//.word 0x7bd12fa2 -//.word 0x94093e94 -//.word 0x9e8a182d -//.word 0xa545bef4 -//.word 0x631570bd -//.word 0xab942b1f -//.word 0x08337128 -//.word 0xa18a4850 -//.word 0x5fec85ac -//.word 0x523f4a64 -//.word 0x510ace67 -//.word 0xe1d05c5d -//.word 0x599d9fde -//.word 0x43de1ce1 -//.word 0x04750077 -//.word 0xc00d1cb9 -//.word 0x78ab2efe -//.word 0x75866252 -//.word 0xea191824 -//.word 0xd576e83f -//.word 0x26dde3fc -//.word 0x238d1cb5 -//.word 0x0bda687c -//.word 0xf980610d -//.word 0x0c37b102 -//.word 0xc5888d46 -//.word 0xb0de7fcc -//.word 0x47e06981 -//.word 0x13fec77f -//.word 0x144a3483 -//.word 0x638a30a1 -//.word 0x168b2036 -//.word 0x64b8961f -//.word 0x0aead328 -//.word 0xec828ac7 -//.word 0x00b6e70b -//.word 0x6828d0cf -//.word 0xdebd6b33 -//.word 0x55ace04d -//.word 0xddd5601b -//.word 0xc85566bc -//.word 0x0b573ce0 -//.word 0xe72cc27e -//.word 0xc89f6bc5 -//.word 0x6d828854 -//.word 0x498dc9ad -//.word 0x296900e7 -//.word 0x180729a4 -//.word 0x7f36a843 -//.word 0x9175d157 -//.word 0xe605ad57 -//.word 0x6643fb97 -//.word 0x69357676 -//.word 0x1d6356d9 -//.word 0x27e819d9 -//.word 0x8dc883b9 -//.word 0xd384e41b -//.word 0x64ec9973 -//.word 0x3435d5bb -//.word 0xa44ba269 -//.word 0xa668229e -//.word 0x21e61ba0 -//.word 0x9752b28a -//.word 0x05c17742 -//.word 0x0a67a2ac -//.word 0x4c659c1d -//.word 0x18e3c213 -//.word 0x485f6523 -//.word 0x6a441532 -//.word 0x1ebf1fe8 -//.word 0xc0ce5462 -//.word 0x479a0c27 -//.word 0x6d066b5e -//.word 0x1188e33e -//.word 0xd938fac5 -//.word 0x1b264ead -//.word 0xfef1d69c -//.word 0xdc956a9b -//.word 0xeb8586c9 -//.word 0x1dfa4b50 -//.word 0x448ac699 -//.word 0x7afc75bc -//.word 0xc05b073b -//.word 0xe54964ef -//.word 0xaa96ed42 -//.word 0x2311059f -//.word 0x609ed027 -//.word 0x4d893aa6 -//.word 0xd71a3cc5 -//.word 0x506a5b81 -//.word 0x157471db -//.word 0x6e6fafd1 -//.word 0xb55ce38e -//.word 0xbbdbf7de -//.word 0x6742bae4 -//.word 0xa0f0e40f -//.word 0x6ddf544a -//.word 0x5b799b73 -//.word 0x20adbe0f -//.word 0x7d41383c -//.word 0x696a3fe6 -//.word 0x6b9a483e -//.word 0x4899cd68 -//.word 0xded74e74 -//.word 0x50019690 -//.word 0x63d23f7c -//.word 0x282c783e -//.word 0xdc670616 -//.word 0x0ce989b4 -//.word 0xfcf601a9 -//.word 0x4aca901c -//.word 0xcfe582be -//.word 0xc6a78a00 -//.word 0x301c4e83 -//.word 0x771926cf -//.word 0x51882149 -//.word 0xe7004a5f -//.word 0x37992906 -//.word 0xb6fe8c66 -//.word 0x3ac387d3 -//.word 0x18f9b900 -//.word 0x8900d16f -//.word 0x539d512c -//.word 0xa54c92bb -//.word 0x42d8084f -//.word 0xe128c83d -//.word 0xd45c47af -//.word 0xe919659d -//.word 0x8e20aaf9 -//.word 0x3826cf2a -//.word 0x05e080bc -//.word 0xa05d6056 -//.word 0x65984eec -//.word 0xc54ee735 -//.word 0xec0d4b60 -//.word 0xa28e2403 -//.word 0x6f44e554 -//.word 0x0335509b -//.word 0xd4093be7 -//.word 0x09609300 -//.word 0x9769a19e -//.word 0xaab18cd8 -//.word 0x463820df -//.word 0x2ecacdec -//.word 0x058cf377 -//.word 0xb3d65daa -//.word 0x0a400b15 -//.word 0xaa0034a3 -//.word 0x21738bcd -//.word 0x57f9c20d -//.word 0x2a064c96 -//.word 0x55766842 -//.word 0x96215bcc -//.word 0x10b0fc3f -//.word 0xeeaf76ae -//.word 0x49e34a26 -//.word 0x4bdd93e1 -//.word 0x95cf8ebc -//.word 0xdf9f59eb -//.word 0xde3afbec -//.word 0x6b2ba5b9 -//.word 0xe16c3842 -//.word 0xc77b061a -//.word 0xafb1dd71 -//.word 0x5dd04242 -//.word 0x2cdbfacd -//.word 0xae2acf48 -//.word 0x93bd90d2 -//.word 0xccd15aa8 -//.word 0xf0b1169b -//.word 0xdecf43c2 -//.word 0xa413f66c -//.word 0x9f731e58 -//.word 0xe4c40d29 -//.word 0xdfcf3414 -//.word 0x3aa82edc -//.word 0x003b0100 -//.word 0x0328a033 -//.word 0x7bd1b40c -//.word 0xefb09bff -//.word 0x59efb18c -//.word 0x8532cfb6 -//.word 0xbab812b7 -//.word 0x9ca2def2 -//.word 0x51922229 -//.word 0xe378ddf0 -//.word 0xe5a9e161 -//.word 0x5a32d712 -//.word 0xd26b8344 -//.word 0xd6cf495d -//.word 0x860af099 -//.word 0x8154a7fc -//.word 0x05fe458b -//.word 0x584ad5bb -//.word 0x6680522a -//.word 0xab3eaf8d -//.word 0x53101ae9 -//.word 0xa0408207 -//.word 0x8df05722 -//.word 0xb16591e2 -//.word 0x65a6f38e -//.word 0x2946917d -//.word 0x447e90cd -//.word 0xab7f2d58 -//.word 0x240500e4 -//.word 0xab30829a -//.word 0x1590ceba -//.word 0xf37ea48c -//.word 0xb9b3b39a -//.word 0x2013181c -//.word 0xc8ca22b4 -//.word 0x229a585b -//.word 0x8d73bd9b -//.word 0xbf455200 -//.word 0x6712ddc9 -//.word 0x1047e9e2 -//.word 0x494c0e17 -//.word 0x035a7282 -//.word 0x3a8d9045 -//.word 0xd83a387f -//.word 0xd682d778 -//.word 0xa427f91f -//.word 0xcb9f0cb7 -//.word 0xd16767cd -//.word 0x5c9a8b6d -//.word 0x9bc2a895 -//.word 0xe2ee63ea -//.word 0x9405d6aa -//.word 0x4659d8e2 -//.word 0x217f7fe1 -//.word 0x885fe4ec -//.word 0xfb872633 -//.word 0x3cc5b204 -//.word 0xb0f4c13f -//.word 0x0716220a -//.word 0x20a339c5 -//.word 0x26214841 -//.word 0x00f5ed2c -//.word 0xe879ecd0 -//.word 0x594e2ffe -//.word 0x2ff40b44 -//.word 0x0a97c566 -//.word 0xf32c550c -//.word 0x42bd69b9 -//.word 0xbe01adfc -//.word 0x07304aea -//.word 0x3115accb -//.word 0xb2658914 -//.word 0x7e4f1f96 -//.word 0x7054bdf4 -//.word 0xec59845a -//.word 0xc3fb6f6c -//.word 0x5622917d -//.word 0xffd99e02 -//.word 0xac5dad46 -//.word 0xcd733c5f -//.word 0x71ff7560 -//.word 0xabd3b0d0 -//.word 0x3bc5385b -//.word 0x6a0452c8 -//.word 0x36ac7b2b -//.word 0xaf97f25c -//.word 0xa17776a7 -//.word 0x732151c5 -//.word 0x4f2c950b -//.word 0x84bba6e2 -//.word 0x2897f877 -//.word 0x01811ab4 -//.word 0xa6c6f46e -//.word 0xe1134de0 -//.word 0x588b9058 -//.word 0x6c17cf30 -//.word 0x62fd0800 -//.word 0xc0b5a712 -//.word 0xfaf84d16 -//.word 0x4e19d017 -//.word 0xed9883ae -//.word 0x5bf5b776 -//.word 0x18c281bf -//.word 0x80fcbe87 -//.word 0xf09b55a6 -//.word 0x2a68bc48 -//.word 0xfb0fbea0 -//.word 0x1b757bdb -//.word 0x544bb053 -//.word 0xe6e43806 -//.word 0x2b43d346 -//.word 0x777927b2 -//.word 0x422e0464 -//.word 0x897dec6c -//.word 0x7105d37d -//.word 0x2e3c23e7 -//.word 0x230703c5 -//.word 0x4a88d978 -//.word 0xd7370d54 -//.word 0x18351198 -//.word 0xa0dd9ea4 -//.word 0xa49b4066 -//.word 0xa5011416 -//.word 0x4f17d023 -//.word 0xa2f3056d -//.word 0x4f8aa1b4 -//.word 0x65c6b850 -//.word 0x2cd98423 -//.word 0x51d0aacd -//.word 0x446bbe1e -//.word 0xdf2c0ad1 -//.word 0x48ae8b77 -//.word 0x18383db1 -//.word 0xbd9299a2 -//.word 0x1d175ba4 -//.word 0x7b0c883a -//.word 0x9f30b047 -//.word 0x3194707d -//.word 0x67ad3c17 -//.word 0xe0a85bcb -//.word 0xcffd33fa -//.word 0x5b800000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x000129E8 -//// expected output -//.word 0x46cf6321 -//.word 0x94dc6c65 -//.word 0xbea19ef7 -//.word 0x91b91ebd -//.word 0x5a6d21f5 -//.word 0x5a42893c -//.word 0x09c77dd4 -//.word 0x49af60cd -//.word 0x2a8c70fc -//.word 0xd2905cea -//.word 0x2081c104 -//.word 0x3fd0d0b9 -//.word 0x73cd86cc -//.word 0xc936b735 -//.word 0xeffa0ed0 -//.word 0x1ef8c4d9 -//// SHA512LongMsgvector_96 -//// vector length -//.word 0x00012D00 -//// input message -//.word 0xfcbacddf -//.word 0x3448c746 -//.word 0x4297ae53 -//.word 0x166793e2 -//.word 0xed962de0 -//.word 0xd0947c5e -//.word 0x5e17abe3 -//.word 0xcc103b07 -//.word 0x2add5e3d -//.word 0xe8c0a1f1 -//.word 0x9890ced3 -//.word 0xf5ae1172 -//.word 0x253b590c -//.word 0x3b8801a4 -//.word 0x00ceb056 -//.word 0xf3207ee8 -//.word 0x8e9d58a1 -//.word 0xcbeaa55e -//.word 0xe7e029e2 -//.word 0x66812a6e -//.word 0x5731d291 -//.word 0xd923d542 -//.word 0xde11542c -//.word 0x2f300049 -//.word 0xb16382b2 -//.word 0xe6ae1bb6 -//.word 0xb6ee8729 -//.word 0x70c828fe -//.word 0x0ce06019 -//.word 0xb34b3f5e -//.word 0x81465e0e -//.word 0x89280a53 -//.word 0x1995a519 -//.word 0x40f54a20 -//.word 0x8e24b04f -//.word 0x1b6b514c -//.word 0xcab0cb49 -//.word 0xcfe98621 -//.word 0x6fd797a3 -//.word 0x07f0e42d -//.word 0x509d897e -//.word 0xe1a57bc5 -//.word 0xf6e96bfd -//.word 0x6f53ee7d -//.word 0x1c09dacb -//.word 0x37e6f3b2 -//.word 0x322ac794 -//.word 0xb470d601 -//.word 0xdee1f687 -//.word 0xd2a8f6cc -//.word 0x76a582db -//.word 0x756646bc -//.word 0x87535747 -//.word 0xf328ce39 -//.word 0x52a9b688 -//.word 0x959128f4 -//.word 0x49cbb4df -//.word 0x1ae4035e -//.word 0x96c1bb90 -//.word 0x348da32f -//.word 0x95f60864 -//.word 0x09995fe0 -//.word 0x55ba2b28 -//.word 0xb4392130 -//.word 0x1bc18a2c -//.word 0xc143eaa3 -//.word 0xdfa3dfc5 -//.word 0xb4b14bfe -//.word 0xcd5ab5cb -//.word 0x8320edcd -//.word 0xc5c7ef1c -//.word 0x18510add -//.word 0xdb2d4217 -//.word 0xd0acf2c2 -//.word 0xd8b4b621 -//.word 0xfeb88752 -//.word 0xb7e72824 -//.word 0x68a4c228 -//.word 0x2937cb0b -//.word 0xc9c22b22 -//.word 0x1276a247 -//.word 0x4e0664e4 -//.word 0x0a5c074d -//.word 0x198c9f53 -//.word 0xdc062816 -//.word 0xc10f241a -//.word 0x0a72849d -//.word 0xd072cc28 -//.word 0x47047365 -//.word 0x433b8830 -//.word 0xfb049cf0 -//.word 0x0d13db28 -//.word 0xc31d7c49 -//.word 0x95485ccb -//.word 0xefe0e57b -//.word 0x344b3517 -//.word 0x023f7c18 -//.word 0xb832a6cf -//.word 0x35123bb3 -//.word 0xe33783fa -//.word 0xf596ed66 -//.word 0xec37b162 -//.word 0x60e9b54d -//.word 0xfd34ae16 -//.word 0xcc8f8709 -//.word 0xb3d306e8 -//.word 0x40f0ad3e -//.word 0xa2dedef0 -//.word 0xf8d74315 -//.word 0xcfc46d07 -//.word 0xe5f5bbba -//.word 0x33147e4d -//.word 0x2b5c5adf -//.word 0x3f06f0a4 -//.word 0xa204b938 -//.word 0x52f23533 -//.word 0x564a46fd -//.word 0x44d7d6e4 -//.word 0x076cc06b -//.word 0xdfd5eee5 -//.word 0xa90ebf43 -//.word 0x61b3ab2b -//.word 0xe5b8294a -//.word 0xfc5ad0ea -//.word 0x9655bdc7 -//.word 0x5658361e -//.word 0x4db68c08 -//.word 0x095e4606 -//.word 0xce0d7bdd -//.word 0x23c280a4 -//.word 0x9073c41b -//.word 0xa7fef73e -//.word 0x4162721a -//.word 0x0a2fd3e0 -//.word 0x403be738 -//.word 0xb797ced7 -//.word 0x21c15954 -//.word 0x8c1bb737 -//.word 0x2c9c5154 -//.word 0x5bc6f257 -//.word 0xded82b9f -//.word 0x6a44f650 -//.word 0x666399a3 -//.word 0xf368cd81 -//.word 0x2a932051 -//.word 0xa4a7980e -//.word 0x409d999c -//.word 0x209a085c -//.word 0xf51fb1fe -//.word 0x7d7fe696 -//.word 0x4a9769f2 -//.word 0xc4b98d2b -//.word 0x71e9977b -//.word 0x744c6a4e -//.word 0x54dd649c -//.word 0xff628375 -//.word 0x0f9fccde -//.word 0x4bc9eddb -//.word 0x713d21cd -//.word 0x337254fe -//.word 0x7f2c887b -//.word 0x03f37722 -//.word 0xf1c479fb -//.word 0xff06a9cc -//.word 0xb3bf43e7 -//.word 0xdd085147 -//.word 0x65bf87db -//.word 0x467b6b22 -//.word 0xdbc5b9f8 -//.word 0x5a8505b0 -//.word 0x9ebaa262 -//.word 0x296ec386 -//.word 0x69eae0c2 -//.word 0x3a265b01 -//.word 0xad8364c5 -//.word 0x07bc1abe -//.word 0x0d1af29b -//.word 0x7fe85d20 -//.word 0xe327a579 -//.word 0x838318ce -//.word 0xb9856917 -//.word 0x6a095332 -//.word 0xd1f37f32 -//.word 0x7e1ea8fb -//.word 0x9e95fd0c -//.word 0x7c06c79b -//.word 0x48734be7 -//.word 0x182bf2ca -//.word 0x2cf9a78d -//.word 0x769b8101 -//.word 0x5975a2cb -//.word 0xb2875f00 -//.word 0x159da1f2 -//.word 0x59c58a49 -//.word 0x56065c55 -//.word 0xed4f97a2 -//.word 0x49ae62cd -//.word 0x65c22c97 -//.word 0xce739338 -//.word 0xabe085f6 -//.word 0xfa99a5f5 -//.word 0x1c0ff051 -//.word 0x9449a06a -//.word 0x0cd8507f -//.word 0x980c627f -//.word 0x3f689e1b -//.word 0xb8541b20 -//.word 0x71126304 -//.word 0xd6f3d2be -//.word 0xcfcb3fdb -//.word 0x8aa2dfcf -//.word 0x7cac6589 -//.word 0xa27c6e4a -//.word 0x0d741db6 -//.word 0x9d80022c -//.word 0x0d044153 -//.word 0x2f12f0f5 -//.word 0x79e1c011 -//.word 0xc17ae02b -//.word 0x45b51ee7 -//.word 0xee6450d6 -//.word 0xd6cef290 -//.word 0x075f1003 -//.word 0x869d670a -//.word 0x905ec742 -//.word 0x2338bb19 -//.word 0xc03a6c27 -//.word 0x70d9c3c2 -//.word 0x052dcecc -//.word 0xa25e65d0 -//.word 0x7d590d4d -//.word 0xe4c71c52 -//.word 0x7e3f1e4b -//.word 0xd4ba781b -//.word 0x0f484b6b -//.word 0x03029b41 -//.word 0x6d40b1d4 -//.word 0x790cbd9f -//.word 0x88d6c0b4 -//.word 0x2f69a953 -//.word 0x831dbebb -//.word 0x944e3e40 -//.word 0x370e459e -//.word 0x0917ef8d -//.word 0xb003c095 -//.word 0x64c04424 -//.word 0xaf3ef2de -//.word 0x706a5634 -//.word 0x26607038 -//.word 0x6bdc57af -//.word 0xbff22168 -//.word 0x870007cd -//.word 0x55e0c5b8 -//.word 0x6a624088 -//.word 0x7af96b73 -//.word 0xafb46b1e -//.word 0xf070fa6a -//.word 0x624d0991 -//.word 0x2f5ea973 -//.word 0x87a52b2a -//.word 0xe53e86e4 -//.word 0x94dafaf2 -//.word 0x716ff31c -//.word 0xf22e3038 -//.word 0x67b624fb -//.word 0x80879d0e -//.word 0x10b9a364 -//.word 0x10eea3cc -//.word 0xe785cdc2 -//.word 0xe910ba8b -//.word 0x1d085281 -//.word 0x43c0edab -//.word 0x1598b890 -//.word 0xce735b4d -//.word 0xe96bd8e6 -//.word 0x2bc3b6da -//.word 0xe31c60fa -//.word 0x71ecc87a -//.word 0x052d4f49 -//.word 0xa952e99e -//.word 0x827f7cd4 -//.word 0x52f98a77 -//.word 0x42dc109f -//.word 0xdf0cae7c -//.word 0x626d0733 -//.word 0x34576be8 -//.word 0xb144b41c -//.word 0x2dcc6d3a -//.word 0x34d43a6c -//.word 0x160273b3 -//.word 0xa3741337 -//.word 0x34b1d1dc -//.word 0xebdf8c15 -//.word 0x3b37ecfd -//.word 0xaab747a4 -//.word 0xd516c1a6 -//.word 0xb5fdb803 -//.word 0x22745f2a -//.word 0x959ba857 -//.word 0x329a681f -//.word 0x06dab64a -//.word 0x8d7693e0 -//.word 0x77ecd186 -//.word 0xab192d0b -//.word 0x8d64bf3f -//.word 0x7c399404 -//.word 0x9fb999a7 -//.word 0xe2afba70 -//.word 0x3bc64c77 -//.word 0x32faa8ba -//.word 0xa04d196d -//.word 0xb7bbf991 -//.word 0x426f16c8 -//.word 0x2e375b68 -//.word 0x4a36acce -//.word 0x4bd911f5 -//.word 0x130c1747 -//.word 0x33ad73b2 -//.word 0xae40e9ff -//.word 0x00e56c5f -//.word 0x5e888747 -//.word 0x4058fb7e -//.word 0x1d7aaa75 -//.word 0x75feb3d6 -//.word 0x1512df5f -//.word 0x97753cf1 -//.word 0x282f07e4 -//.word 0x8e80cf9e -//.word 0x6916d864 -//.word 0xb882be6f -//.word 0xa0ed5a43 -//.word 0x6907e93c -//.word 0xca416b6a -//.word 0x663c4a9f -//.word 0x96813cc5 -//.word 0x69726a75 -//.word 0xe981d2c6 -//.word 0xa09fea63 -//.word 0x5bf786e1 -//.word 0x2eddfb4f -//.word 0xb801850e -//.word 0xa8e9e6e3 -//.word 0x809e504a -//.word 0x9aa5850d -//.word 0x68303d16 -//.word 0xff96c881 -//.word 0xd701f4f6 -//.word 0xcc663136 -//.word 0x69bbf3f3 -//.word 0x666458e5 -//.word 0x6fee0b1a -//.word 0x28ff688e -//.word 0x6d8de1fb -//.word 0xde4fa0f2 -//.word 0x9b716d2b -//.word 0x4c8cd31a -//.word 0x65d57ec2 -//.word 0xa895e8ce -//.word 0xebd935de -//.word 0x1b6a5b1f -//.word 0x81ff851e -//.word 0x44b2bade -//.word 0x2fb1b928 -//.word 0xb5362822 -//.word 0x32b9ee23 -//.word 0x7464dec6 -//.word 0x7ac7953d -//.word 0x7bcda5e8 -//.word 0x2beef326 -//.word 0x39a75d6c -//.word 0x1c27a094 -//.word 0x0f4c7977 -//.word 0x5acd0bbd -//.word 0xd4b981f4 -//.word 0xa620f4e0 -//.word 0x510f8f12 -//.word 0xf3c2f1bc -//.word 0xc616d2c4 -//.word 0xe93dea17 -//.word 0x63b50e40 -//.word 0x657b9d39 -//.word 0xcf7c1a81 -//.word 0xf64c1a6e -//.word 0xa41a61c5 -//.word 0x61e44888 -//.word 0xf1e7620f -//.word 0x1e5a5e5a -//.word 0xb85b2fa6 -//.word 0xd92a6b3e -//.word 0x6d95f194 -//.word 0xf2b3cf90 -//.word 0x7dd56328 -//.word 0xfebac031 -//.word 0xc4025275 -//.word 0x44e5c605 -//.word 0x162524d1 -//.word 0x40413e75 -//.word 0xb7ec4e56 -//.word 0x23bddbee -//.word 0xe328dc64 -//.word 0x51ad2060 -//.word 0x474fed1d -//.word 0xe248e8c0 -//.word 0x85fb34e8 -//.word 0x212ade86 -//.word 0xb46979ef -//.word 0x10d3052f -//.word 0xdefb16a0 -//.word 0xe22632bc -//.word 0x81b77a30 -//.word 0x80ea8c31 -//.word 0x0ec5a913 -//.word 0x054c1318 -//.word 0x6df5b986 -//.word 0x425b16fc -//.word 0x76365705 -//.word 0x3a8bbcee -//.word 0x7a2040d5 -//.word 0xa6337c03 -//.word 0xb86bc97c -//.word 0x730fa5d3 -//.word 0xe8765843 -//.word 0x3fbfd7fc -//.word 0xb4c2e8bb -//.word 0xe045879d -//.word 0x3a748835 -//.word 0xdd8b7fdc -//.word 0x8cd6dd48 -//.word 0xf3db5b61 -//.word 0x2fd69c4f -//.word 0x91650dd8 -//.word 0x9f8511e9 -//.word 0x5cbd5b72 -//.word 0xca999a77 -//.word 0xac5a5c65 -//.word 0x90ec2ca2 -//.word 0x0d18fe67 -//.word 0x4afbced2 -//.word 0xbfb78337 -//.word 0x406819b8 -//.word 0x375aff15 -//.word 0x3179bec5 -//.word 0x9c08dc45 -//.word 0xce9600b0 -//.word 0x4a2e5690 -//.word 0x3fcf35f3 -//.word 0x521b00c2 -//.word 0x9d534a4f -//.word 0xf8833d2d -//.word 0x77fa3c44 -//.word 0x34fdc724 -//.word 0x4ebd9f9a -//.word 0x31862b81 -//.word 0x18381bdb -//.word 0xd1fb4b21 -//.word 0xc02fead7 -//.word 0x27a2db62 -//.word 0xa5065b1e -//.word 0xfca2e5ac -//.word 0x17475289 -//.word 0x4b8645e5 -//.word 0xdd20c6b2 -//.word 0xc4be2dfb -//.word 0xb1e24277 -//.word 0x4d1ea25e -//.word 0xc184657b -//.word 0x7c5dfd83 -//.word 0x301e61a5 -//.word 0x1e976c62 -//.word 0x946e7f9f -//.word 0xb4cc6ef8 -//.word 0x76569a58 -//.word 0xf15f5ac6 -//.word 0xd65ba082 -//.word 0x3d97d951 -//.word 0xa4281415 -//.word 0x342267a0 -//.word 0x470a8eca -//.word 0x288dd6c1 -//.word 0x19713aa1 -//.word 0x9bcdcb45 -//.word 0xe975555c -//.word 0xc6b93fbf -//.word 0x784fb302 -//.word 0x158dff48 -//.word 0xfddb3b5c -//.word 0xa8692cfe -//.word 0xa21d697b -//.word 0xd3d0bc81 -//.word 0x04b9cb30 -//.word 0x9f29f874 -//.word 0xb6798593 -//.word 0x4741fc02 -//.word 0xbfcbce7d -//.word 0xbcc83a56 -//.word 0x1741700e -//.word 0x22d0f722 -//.word 0x2e0f4c27 -//.word 0x5151cc19 -//.word 0x6690d3f1 -//.word 0x54a72675 -//.word 0x94c18e54 -//.word 0xed12c672 -//.word 0x82c59781 -//.word 0x0f3542d1 -//.word 0x705f1e69 -//.word 0x63988256 -//.word 0x8e7be543 -//.word 0xc426444a -//.word 0x84a6c50a -//.word 0xc2af99fa -//.word 0xea9026fc -//.word 0x23676636 -//.word 0xd1918a1d -//.word 0x5d65e4d2 -//.word 0x382203b2 -//.word 0x1d252029 -//.word 0x9760b9c6 -//.word 0xc4077b95 -//.word 0x588c65a9 -//.word 0xe4ce2bf8 -//.word 0x598ed86c -//.word 0xc822b836 -//.word 0x6b6d7566 -//.word 0xe90e80b8 -//.word 0xd6d8b2b1 -//.word 0x798234eb -//.word 0xd3a09cae -//.word 0xdcd258bf -//.word 0x103c507d -//.word 0x2a36c729 -//.word 0x30448286 -//.word 0xaf482da2 -//.word 0x48f6faf3 -//.word 0x6b898ba5 -//.word 0x63b41233 -//.word 0x93dcb735 -//.word 0xff843a79 -//.word 0x0e09d954 -//.word 0x8e8f743a -//.word 0xf83bef8d -//.word 0xf5a3d8b3 -//.word 0x2282496b -//.word 0x10b11061 -//.word 0x90520e00 -//.word 0x2d4edd87 -//.word 0xf903b65f -//.word 0x8d3691ac -//.word 0x4b4f8d22 -//.word 0xe6c59319 -//.word 0x25d736e4 -//.word 0xe37dde5f -//.word 0x5b9e26c8 -//.word 0xa28382d0 -//.word 0x758c25f1 -//.word 0x35212201 -//.word 0x30ecd108 -//.word 0x2245744f -//.word 0xfcee1ab9 -//.word 0xe301c456 -//.word 0x7c26c736 -//.word 0x6709717b -//.word 0x090cefb2 -//.word 0x8f396e64 -//.word 0x2f7a81e7 -//.word 0xb10cc37a -//.word 0x2f31bd92 -//.word 0x19250a6e -//.word 0x7b54b8f1 -//.word 0x83caf2b1 -//.word 0x3eebdc4c -//.word 0xa264bffb -//.word 0xd1616669 -//.word 0x9c01c8c5 -//.word 0x4606e715 -//.word 0x8bd2f7ce -//.word 0xe18fc3a2 -//.word 0xfead4d9a -//.word 0x9a91b464 -//.word 0x768b5bee -//.word 0x9d094834 -//.word 0xea0bca56 -//.word 0xcad75fed -//.word 0x43eed49f -//.word 0x363eaef1 -//.word 0xe199c95d -//.word 0xa7663fa5 -//.word 0x14978b66 -//.word 0x1cdbeff0 -//.word 0xa3141355 -//.word 0x430beec0 -//.word 0x4962e908 -//.word 0x00cb4285 -//.word 0x3378af23 -//.word 0xedd345b4 -//.word 0x836e978b -//.word 0xd43d2246 -//.word 0xd003e9eb -//.word 0x370a5c37 -//.word 0xa3177e32 -//.word 0xc99d4707 -//.word 0xfc314713 -//.word 0xf33e8d3c -//.word 0xcbfac784 -//.word 0x4f98abdd -//.word 0x78c09540 -//.word 0x303c71f9 -//.word 0x5bf4db45 -//.word 0x181c851e -//.word 0x44acd956 -//.word 0x4110e0e3 -//.word 0xf521637a -//.word 0x1555505f -//.word 0xa3325e7b -//.word 0xb509f4af -//.word 0x79e04868 -//.word 0x76b0c473 -//.word 0x14d1ad13 -//.word 0x5fb20651 -//.word 0x08cdb294 -//.word 0xacdada71 -//.word 0x59438ec4 -//.word 0x4fd9af00 -//.word 0x03c50cc3 -//.word 0x6ac1cbae -//.word 0x73880b73 -//.word 0xd68ac72f -//.word 0x0ce5fdfb -//.word 0x9e9110bd -//.word 0xa3da6c45 -//.word 0x84146895 -//.word 0x038a707f -//.word 0x7cb76376 -//.word 0x6ab93a9e -//.word 0x2c02eb25 -//.word 0x0a518cd6 -//.word 0x73e0bceb -//.word 0x88df3f23 -//.word 0xdf22e815 -//.word 0x8017bcc4 -//.word 0x34fa5473 -//.word 0x004c83bb -//.word 0xec8139da -//.word 0x08f9a74e -//.word 0xb131a4a3 -//.word 0x113b5089 -//.word 0xe56bf729 -//.word 0x835438b9 -//.word 0x1bf2664e -//.word 0x3d292ef2 -//.word 0x9b6e7af7 -//.word 0x11c5968b -//.word 0xe2eb918c -//.word 0x45d4e79d -//.word 0x20585c79 -//.word 0x13292b87 -//.word 0xb80860af -//.word 0x2938836d -//.word 0xc3337623 -//.word 0x2a9da0b4 -//.word 0x8d764c4e -//.word 0x2c934b87 -//.word 0x174fe1ac -//.word 0x387edf55 -//.word 0x93a20c3d -//.word 0xcd62c951 -//.word 0xeb37f507 -//.word 0x5d690ff1 -//.word 0x3b3a9a92 -//.word 0xce60c670 -//.word 0x52b94c6a -//.word 0xfa3b9a4c -//.word 0x352a30a1 -//.word 0x308d4ac9 -//.word 0x9ce2bf4b -//.word 0xb111296c -//.word 0x739f4600 -//.word 0x34249e80 -//.word 0x5aff665d -//.word 0x6248a594 -//.word 0x25069583 -//.word 0x5aa24cfa -//.word 0x5d9c9b96 -//.word 0x2f7d374a -//.word 0xbd0d163f -//.word 0x65c51cde -//.word 0xb687f72b -//.word 0x778d4854 -//.word 0xeba00389 -//.word 0x548a180f -//.word 0xb6cd5390 -//.word 0xdd9580b6 -//.word 0xa1ecd4f8 -//.word 0x692d88b3 -//.word 0xeebbc77c -//.word 0x42f2cab5 -//.word 0x105e425e -//.word 0x252bf62e -//.word 0x2fddade2 -//.word 0xc5424ed6 -//.word 0xa8a446d2 -//.word 0x49422a26 -//.word 0x8b029df9 -//.word 0xc96075de -//.word 0x1baa19a8 -//.word 0xd56f2d80 -//.word 0x51357234 -//.word 0xef6ae7d2 -//.word 0x599d3576 -//.word 0x0cee4960 -//.word 0x14c34349 -//.word 0x16bd8ff7 -//.word 0x94eb5110 -//.word 0x6d3d072c -//.word 0xa33b6a2d -//.word 0x61f694d3 -//.word 0x3d3f688b -//.word 0xba182f88 -//.word 0x11687f15 -//.word 0x31f3612a -//.word 0x0488b23d -//.word 0xf47cca5a -//.word 0xae585c76 -//.word 0x25cf9d01 -//.word 0xdaf3a9ba -//.word 0x5ca822c7 -//.word 0x0a581a05 -//.word 0x20e8339d -//.word 0xf2eb04d8 -//.word 0x7216bf34 -//.word 0xf8f411b7 -//.word 0x43db4a83 -//.word 0xbb1fbeab -//.word 0xf8856b45 -//.word 0x88fbdcc0 -//.word 0xed864d78 -//.word 0xe67b0f88 -//.word 0xf0f22edf -//.word 0x0b785297 -//.word 0xc104e382 -//.word 0x652d7005 -//.word 0x99995229 -//.word 0x12b98cef -//.word 0xa0b3f6e4 -//.word 0x68a09bf6 -//.word 0x74f85f86 -//.word 0x6f4ae5be -//.word 0xa931af25 -//.word 0x62838770 -//.word 0x44cb1e9c -//.word 0x31faf439 -//.word 0x3f597709 -//.word 0x01c26fc9 -//.word 0x0910994f -//.word 0xaad492d5 -//.word 0x034af795 -//.word 0x388bcb96 -//.word 0x030319c5 -//.word 0x6c26da47 -//.word 0xd45f180e -//.word 0x384954aa -//.word 0xb4222662 -//.word 0x467d2384 -//.word 0xd53603f9 -//.word 0x72ab041c -//.word 0xdd2989cd -//.word 0x4ba507c0 -//.word 0x66ad211b -//.word 0x969e1241 -//.word 0x7f164ce8 -//.word 0xcbac5e72 -//.word 0x29df1b7a -//.word 0x954df9ad -//.word 0xdb26b7db -//.word 0x56df434d -//.word 0xfe2bda5a -//.word 0xa2277135 -//.word 0x71d45409 -//.word 0xbfcb0d48 -//.word 0x062c8740 -//.word 0x2bd873ef -//.word 0x03e0eb18 -//.word 0x163d5596 -//.word 0xa3c18bf1 -//.word 0xe44d392f -//.word 0x924586ec -//.word 0xac41f6ad -//.word 0x75058e72 -//.word 0xbcb43a8a -//.word 0x5f406dab -//.word 0x12250742 -//.word 0x5d577b08 -//.word 0xe47831d6 -//.word 0xeb4f29ba -//.word 0x1976e24a -//.word 0x7c527a38 -//.word 0xce481627 -//.word 0xf72e84bd -//.word 0xd2001ffa -//.word 0x34d5f3c8 -//.word 0x2b1122d3 -//.word 0x83db879a -//.word 0x8fd298c7 -//.word 0x26fb91bb -//.word 0xebfecf6e -//.word 0xd1937976 -//.word 0xdf376665 -//.word 0x31233b58 -//.word 0x407ed4cd -//.word 0x63d2e6b5 -//.word 0x95bde2cb -//.word 0x78e91c23 -//.word 0x9a3d2c06 -//.word 0xf75594fd -//.word 0xc030a42c -//.word 0x5b299be1 -//.word 0xab290f6d -//.word 0x911a8f33 -//.word 0xb39f86fe -//.word 0x7c026298 -//.word 0x646ef698 -//.word 0x715e1d7b -//.word 0xfd55a1f6 -//.word 0xbbd05b8b -//.word 0xf5789b5b -//.word 0x179dca3b -//.word 0x71e04d09 -//.word 0x392fad41 -//.word 0xcff7f5cb -//.word 0x45945c17 -//.word 0x1f0d246c -//.word 0x57fec27d -//.word 0xa5d53f3e -//.word 0xfd41def5 -//.word 0x58e8ff94 -//.word 0xb7594346 -//.word 0x6541f148 -//.word 0x7de199fa -//.word 0xadbff736 -//.word 0x399c19e0 -//.word 0x43a7c4be -//.word 0x49f0158a -//.word 0xef1f6446 -//.word 0xff666dd0 -//.word 0xaeb4b2b6 -//.word 0x212c1b4b -//.word 0x2fd5e0fb -//.word 0x6993a8db -//.word 0x5756f384 -//.word 0x0591b522 -//.word 0xbeee43c8 -//.word 0x18407307 -//.word 0x31b8ffbe -//.word 0x375d2b33 -//.word 0x2eb6a863 -//.word 0xedc9b797 -//.word 0x6a4a9238 -//.word 0x380c07e4 -//.word 0x4ebb66c1 -//.word 0x0acd9d12 -//.word 0x76b6a208 -//.word 0xc95b11da -//.word 0x31ca1718 -//.word 0xcf288e3c -//.word 0x03ea6982 -//.word 0xeb4953f9 -//.word 0x26ef93da -//.word 0xdef73319 -//.word 0x0514613b -//.word 0xde101567 -//.word 0xc079f4bf -//.word 0x179775f1 -//.word 0xaba04208 -//.word 0x252fe189 -//.word 0xcff393bb -//.word 0x9ba47c46 -//.word 0x673c05ff -//.word 0x7f637f03 -//.word 0x632b0903 -//.word 0xcbfdb3de -//.word 0xe9d4e375 -//.word 0xeea8f8bb -//.word 0xcf2e2e0b -//.word 0x49bec1bf -//.word 0x239456fe -//.word 0xb33c96d5 -//.word 0xa3481c89 -//.word 0xf544912c -//.word 0x45ec156f -//.word 0x4e9ce1b7 -//.word 0xb0072b73 -//.word 0xf12c4aac -//.word 0xc1861bdd -//.word 0x8283a306 -//.word 0x0738f6fc -//.word 0x9c535703 -//.word 0x4751a09e -//.word 0x4ef1e5a6 -//.word 0xf9e8549a -//.word 0x99d65f36 -//.word 0xc9791e47 -//.word 0xf420eebd -//.word 0x18635f02 -//.word 0xc9124d8a -//.word 0x786b4cac -//.word 0xf5904ab0 -//.word 0x33386f29 -//.word 0x4ca44885 -//.word 0xc4d525e2 -//.word 0x12fcbf23 -//.word 0x5c321e43 -//.word 0x8369baea -//.word 0x5fa2e13e -//.word 0x4c6158fc -//.word 0xe55e45c7 -//.word 0x0f7e4cc0 -//.word 0x3a01f956 -//.word 0xe3fd5e60 -//.word 0x5d0bfd69 -//.word 0xd240e84a -//.word 0x855f26ff -//.word 0x594c59b3 -//.word 0x97c49e1d -//.word 0xec4cb50f -//.word 0xb167624c -//.word 0x6f0c129b -//.word 0xa357c219 -//.word 0xbe7f1dd3 -//.word 0x7008e494 -//.word 0x263a93fc -//.word 0xd2d142d2 -//.word 0xeaf6c99b -//.word 0xb36e276c -//.word 0xbf1225fc -//.word 0xb47f36fd -//.word 0x500ea2ad -//.word 0xaa07e3a8 -//.word 0xbb114f00 -//.word 0x1cedf88f -//.word 0x1164d18c -//.word 0xc77e125d -//.word 0xdaf5ddac -//.word 0x1ae921bd -//.word 0x8fd5bfff -//.word 0xbbc2ebe1 -//.word 0x1ebbd5e6 -//.word 0x008089fc -//.word 0x6a7f140a -//.word 0x76ffe9c8 -//.word 0xc89f83d3 -//.word 0x5dff4b01 -//.word 0x84bdbbf1 -//.word 0x29a3c4e7 -//.word 0x591e6dd7 -//.word 0x03f2bec0 -//.word 0xfc2ddc3c -//.word 0x46597554 -//.word 0x92f65e98 -//.word 0x03287b70 -//.word 0x35ace0ad -//.word 0x7e103563 -//.word 0x74245ffb -//.word 0xafac5d84 -//.word 0xd0576f4a -//.word 0xc1f57eaa -//.word 0x3fe4b824 -//.word 0x96cb7bb2 -//.word 0xac8b7458 -//.word 0x417308fd -//.word 0x75b4f279 -//.word 0x8b142eef -//.word 0xece6165d -//.word 0x6f39cc71 -//.word 0xd750d79f -//.word 0x9e521170 -//.word 0xf143c01d -//.word 0xfb33035c -//.word 0x66b5707a -//.word 0x1f93fbaa -//.word 0x5ac0199d -//.word 0xd78e2652 -//.word 0x63210430 -//.word 0xa1240652 -//.word 0x0aba0c22 -//.word 0x33b8ef29 -//.word 0x4e111f25 -//.word 0xf4928a5c -//.word 0x22cfc031 -//.word 0x815d55f5 -//.word 0xea4187ff -//.word 0x29a921ff -//.word 0x01daa08f -//.word 0x716a930b -//.word 0x36af48a3 -//.word 0x9177a4ae -//.word 0x4af95341 -//.word 0xf50c2201 -//.word 0x7497a835 -//.word 0xbd492c20 -//.word 0xde8ac38d -//.word 0x3eb1b9ab -//.word 0x2577321b -//.word 0x7eab1148 -//.word 0xdc2819f7 -//.word 0xbc05521f -//.word 0x0a0baffa -//.word 0xe66ced5c -//.word 0xa7b1be44 -//.word 0x20f527b0 -//.word 0x235127b6 -//.word 0x449799d1 -//.word 0xdf435b79 -//.word 0x5daeb0f6 -//.word 0xb285e375 -//.word 0x2a7a2e5c -//.word 0x6639d9db -//.word 0xa19ea6c3 -//.word 0x39256d9c -//.word 0x6aa204f2 -//.word 0x5c3261ef -//.word 0x6071032f -//.word 0x76ed8ecf -//.word 0x14dbb5c7 -//.word 0x22095c7a -//.word 0x4914fe8c -//.word 0x6ddb4df4 -//.word 0x78331952 -//.word 0x5add7382 -//.word 0x4eb51271 -//.word 0x5e2bf62f -//.word 0x29f74a46 -//.word 0xe4098f4b -//.word 0x9fbff7b2 -//.word 0xc95b0fe6 -//.word 0xf7b4a19a -//.word 0xe12cd959 -//.word 0xade1a665 -//.word 0x712863be -//.word 0xf337b781 -//.word 0xb321ba73 -//.word 0x2b0859de -//.word 0x558dfb9c -//.word 0x6e8c6571 -//.word 0xfa07da9e -//.word 0x085f87b2 -//.word 0xb7ca1fa4 -//.word 0xf901c31f -//.word 0x9739241d -//.word 0x7555ebb7 -//.word 0x185a593b -//.word 0x65232a80 -//.word 0xab56c076 -//.word 0xe4967d01 -//.word 0x38fa7108 -//.word 0xc3be35c9 -//.word 0x9839166f -//.word 0x060f76e6 -//.word 0x1aa870ee -//.word 0x64e1bb6e -//.word 0xfe01d10b -//.word 0xcbee50fa -//.word 0xfda1a012 -//.word 0xdad7d626 -//.word 0xbf09d891 -//.word 0x659fc212 -//.word 0x636189db -//.word 0xf42edfe4 -//.word 0xfbf05685 -//.word 0x44cfc744 -//.word 0x0da5f5ec -//.word 0xc5b26edf -//.word 0x1392b2ac -//.word 0x1a6b97e4 -//.word 0xfc6bec2a -//.word 0x9c725d8a -//.word 0xa90b960c -//.word 0xd8a1ac88 -//.word 0x70f0b8bb -//.word 0x0cb9c59b -//.word 0x9cbaece8 -//.word 0xaeddbd04 -//.word 0xecb0e104 -//.word 0xe515fe07 -//.word 0x103bdbc6 -//.word 0x0dccc56d -//.word 0x2f6831aa -//.word 0x3853a203 -//.word 0x636acd6c -//.word 0xa85cfb19 -//.word 0x3b16b091 -//.word 0x567f8a04 -//.word 0x38666bde -//.word 0x6eb8db9c -//.word 0x51f7a7de -//.word 0xd0e7cebe -//.word 0x6f8b9e61 -//.word 0x904f1bcb -//.word 0xf187a0f8 -//.word 0x7718c928 -//.word 0x2a758f7a -//.word 0x80ceb5bc -//.word 0xde846482 -//.word 0x5cdf1275 -//.word 0xc903a8ee -//.word 0xef20e3c4 -//.word 0x17eafa62 -//.word 0xd049821c -//.word 0xed518fc3 -//.word 0xcd741d76 -//.word 0xdff6aebc -//.word 0x64a234d0 -//.word 0x77bc303c -//.word 0x4b361ca9 -//.word 0xb52607f6 -//.word 0xea787f87 -//.word 0x89e0b3e0 -//.word 0xdc13d972 -//.word 0x5b37ceb4 -//.word 0x7198fc76 -//.word 0x839c8173 -//.word 0x2ff98e25 -//.word 0xd1250cdd -//.word 0x4c0f8612 -//.word 0x070c43f9 -//.word 0x3514b257 -//.word 0x5a2e0c94 -//.word 0x0a293410 -//.word 0xf48de2ba -//.word 0x20d100de -//.word 0x75ce543e -//.word 0x7e746065 -//.word 0x6ebc8638 -//.word 0x61dd70ce -//.word 0xe4c3af81 -//.word 0xb8bda245 -//.word 0xd3769a39 -//.word 0xa8263b7c -//.word 0xa8092642 -//.word 0x0911d527 -//.word 0xc6d8c5c3 -//.word 0xe7d8db7e -//.word 0x02de01a5 -//.word 0x02bc10be -//.word 0x273ef219 -//.word 0x4e6008a8 -//.word 0x73bec910 -//.word 0x744cac00 -//.word 0x174748c2 -//.word 0x4f6cba10 -//.word 0xbb674828 -//.word 0x708e4423 -//.word 0xf8cf3282 -//.word 0x9ae72d0a -//.word 0xdcd586d2 -//.word 0x478faf9a -//.word 0x6af3575e -//.word 0x2200d72b -//.word 0x1846cd32 -//.word 0x8a9b061b -//.word 0x4f10a29b -//.word 0x15247249 -//.word 0xee37a5ad -//.word 0x0b41a49a -//.word 0xc6c33abe -//.word 0xe6fef878 -//.word 0x1f64d8e9 -//.word 0xd94c204e -//.word 0x33e9898d -//.word 0x467da10d -//.word 0xaeca6ecb -//.word 0x47c954ab -//.word 0x349f380c -//.word 0x26cde69e -//.word 0xdaa7b078 -//.word 0xe4075865 -//.word 0xac42317f -//.word 0xb65b8000 -//.word 0x26772854 -//.word 0x83918773 -//.word 0xbb6f9b6d -//.word 0x67d56946 -//.word 0x51f89f05 -//.word 0x33357808 -//.word 0xc203e09a -//.word 0xeb27d9c8 -//.word 0x5d271d70 -//.word 0x4700049a -//.word 0x631ba90b -//.word 0x337e4818 -//.word 0x8b40ebb9 -//.word 0x4f3f46de -//.word 0x7e15df06 -//.word 0x6f47720d -//.word 0x5bc09345 -//.word 0x1c7e95c9 -//.word 0x348cab0e -//.word 0x11304dbb -//.word 0x9065ddbb -//.word 0xbf8b8b90 -//.word 0xe75e76ea -//.word 0xca251378 -//.word 0x292bd3fe -//.word 0x897300a8 -//.word 0x37a8e89e -//.word 0x8a533ed8 -//.word 0x6851bd34 -//.word 0x0b830ec5 -//.word 0x05c7ec6e -//.word 0x822786b0 -//.word 0xce5125c1 -//.word 0x17470ede -//.word 0x7358aae1 -//.word 0x254fe416 -//.word 0x1cead34b -//.word 0xbc8e9926 -//.word 0xe1388bbc -//.word 0x21b7925e -//.word 0x5219d0b6 -//.word 0x4c638714 -//.word 0xf0853702 -//.word 0x6a8c071e -//.word 0xb21a6629 -//.word 0x5913f25b -//.word 0x829a99f9 -//.word 0x2f3cfe2a -//.word 0xbe6a1e07 -//.word 0xb32d33f1 -//.word 0xb715d927 -//.word 0xe1736f97 -//.word 0x35c7c0f5 -//.word 0x6a7ce20b -//.word 0xf1d35f50 -//.word 0x321e93bb -//.word 0x192e55d9 -//.word 0xd10eda1e -//.word 0xcff2d579 -//.word 0x136ae32a -//.word 0xaadb27d8 -//.word 0x783031de -//.word 0x34cd25e7 -//.word 0xb4c419ba -//.word 0x6b4cbe57 -//.word 0x306f4342 -//.word 0x4002761f -//.word 0x87da2d7f -//.word 0x1b3de4fa -//.word 0x0a97a77e -//.word 0x556e33e6 -//.word 0x3c9858ce -//.word 0xbcaca1a6 -//.word 0x57b63706 -//.word 0x132f0341 -//.word 0xc52c133d -//.word 0x8fd53f82 -//.word 0xa8190c90 -//.word 0x5ba0d076 -//.word 0x530117a0 -//.word 0x153646f1 -//.word 0xce4d7e12 -//.word 0x4f5fc309 -//.word 0x56c65e0d -//.word 0x0f8b7f98 -//.word 0xda1e27bf -//.word 0x4f4a45bf -//.word 0x7f6720d8 -//.word 0x7dd2f45e -//.word 0x1e9ae00d -//.word 0xfc7cff9d -//.word 0xc112d696 -//.word 0xa247ee66 -//.word 0x290ec1b0 -//.word 0x3854dbe8 -//.word 0x4b32391d -//.word 0xfd68f515 -//.word 0xce07259f -//.word 0x236d0025 -//.word 0x8e764281 -//.word 0x50f1d211 -//.word 0x1c51a20e -//.word 0x1ea5d719 -//.word 0x3ccb2b17 -//.word 0x9ce08f3f -//.word 0x66fa1471 -//.word 0xcb1a0bca -//.word 0x465c6b75 -//.word 0x217174c4 -//.word 0x3c4f927f -//.word 0x0a27847c -//.word 0xdc98bd6f -//.word 0x62220b04 -//.word 0x6edd762b -//.word 0xfc6b6bb3 -//.word 0x702b1a1b -//.word 0x1eaf1ca5 -//.word 0x0f7159ab -//.word 0x02c12936 -//.word 0xb202b9cd -//.word 0x5716b18b -//.word 0x6f171375 -//.word 0xbe48660a -//.word 0x944b151b -//.word 0x4e9412dc -//.word 0x1f1dbe3c -//.word 0x115b0d72 -//.word 0x4672e5d8 -//.word 0x84a5c8fd -//.word 0xf110b3f5 -//.word 0x1a9946f4 -//.word 0x3a24241c -//.word 0xba069d92 -//.word 0xf4bc8bd7 -//.word 0x3cde7956 -//.word 0x214e0b39 -//.word 0xf0b59a81 -//.word 0x7a301e56 -//.word 0x1746519b -//.word 0xeb1e11c6 -//.word 0x68ee06ef -//.word 0x14b78626 -//.word 0x8d30b50a -//.word 0xcafff198 -//.word 0xa32f6d40 -//.word 0x94df1b3e -//.word 0xbe37d027 -//.word 0x2ea1a3c2 -//.word 0x6235961a -//.word 0x097478d1 -//.word 0x0b3a09b7 -//.word 0xc9ee609b -//.word 0xa6fc8a62 -//.word 0xc6857456 -//.word 0x16550ac0 -//.word 0x8c15a1b8 -//.word 0xb0c1923c -//.word 0x5b5d2880 -//.word 0xbee4bd85 -//.word 0xa7821fed -//.word 0x0002390e -//.word 0x988aef45 -//.word 0x2786498c -//.word 0x8ce2d44f -//.word 0x587c457c -//.word 0x90d960da -//.word 0xaf17189b -//.word 0xeb22f834 -//.word 0xb92bc16c -//.word 0x935655b3 -//.word 0xf9b3d3b6 -//.word 0xb6700430 -//.word 0x644df603 -//.word 0x324fe687 -//.word 0xe5b96322 -//.word 0x1d38b119 -//.word 0xda5e6ca5 -//.word 0x3e516d4a -//.word 0x95c5f264 -//.word 0x9227f803 -//.word 0xdb1becf8 -//.word 0xc9298330 -//.word 0x68b3e741 -//.word 0xc62b1343 -//.word 0x6a8380e1 -//.word 0x22e401af -//.word 0x02a2ebbf -//.word 0xa9707a6f -//.word 0xc6d07084 -//.word 0xdbceff7d -//.word 0x41eee921 -//.word 0x6d63e65b -//.word 0x71814647 -//.word 0xc575d78d -//.word 0x483409ee -//.word 0x82b1501c -//.word 0x2c53cacf -//.word 0xf2a62215 -//.word 0x7751b4e9 -//.word 0x9a48f208 -//.word 0xf8420600 -//.word 0xb16eb98a -//.word 0x70619319 -//.word 0xa55343b3 -//.word 0x158c4200 -//.word 0x9519b4a1 -//.word 0x12c38fc2 -//.word 0xd542fef3 -//.word 0x05ad0833 -//.word 0x6e356d4e -//.word 0x8013d06a -//.word 0x9bbf1bdc -//.word 0x8a632040 -//.word 0x4d8f7cc8 -//.word 0x1b2ec1d4 -//.word 0xa7b9d4c3 -//.word 0xa3aa9309 -//.word 0x8234bb82 -//.word 0x83310907 -//.word 0xeb5ca03e -//.word 0x91c0abb6 -//.word 0xa0704333 -//.word 0x99799346 -//.word 0x97153a21 -//.word 0xd721f0aa -//.word 0x77d16dce -//.word 0x7ea38718 -//.word 0x1d919a82 -//.word 0x358b2c8b -//.word 0x1824d189 -//.word 0x948c4d41 -//.word 0x2ebef9b5 -//.word 0xabfa683d -//.word 0xd57649d9 -//.word 0x7b518fc6 -//.word 0xbac8d04f -//.word 0x7bacebe6 -//.word 0x3d13ee73 -//.word 0x154f37ec -//.word 0xf21cd926 -//.word 0x261d41eb -//.word 0x228a194c -//.word 0x81236c38 -//.word 0x49680b4e -//.word 0x6d0b30f0 -//.word 0x96a66299 -//.word 0x22aa9870 -//.word 0x6d97a11d -//.word 0x5073c3db -//.word 0xe875a3ce -//.word 0x99016498 -//.word 0x52d91327 -//.word 0x129143d0 -//.word 0xab43f4a2 -//.word 0xc685baf4 -//.word 0x27981b41 -//.word 0x32e23836 -//.word 0xae9eb008 -//.word 0xcad3c10b -//.word 0x5d82b081 -//.word 0x72246baf -//.word 0x04546e37 -//.word 0x06c8e3a1 -//.word 0xa7850d3b -//.word 0xd353e623 -//.word 0xfd6f07a2 -//.word 0x1c81c9bb -//.word 0xf3cdaa04 -//.word 0x96adf2b5 -//.word 0x2a3f96ff -//.word 0xec5b5c9f -//.word 0x75c840b2 -//.word 0x3caf16cb -//.word 0x5c4f7243 -//.word 0x97f3c5d0 -//.word 0x9b21c859 -//.word 0x85151e09 -//.word 0xa46e35a3 -//.word 0x7f266d15 -//.word 0x19c77c4f -//.word 0x73dc1155 -//.word 0x53a6b793 -//.word 0x4411fc72 -//.word 0xdee6d328 -//.word 0x474238d4 -//.word 0xfa4712ca -//.word 0xc7115d2b -//.word 0x1bec88ba -//.word 0x82c41cea -//.word 0x6add9f3c -//.word 0x2ac4b8c7 -//.word 0x43859418 -//.word 0xe51e873d -//.word 0xb534f71d -//.word 0xcd05760b -//.word 0x049e2e9a -//.word 0x704d82b2 -//.word 0x2a5af2e3 -//.word 0x51f23ffa -//.word 0x5264d0d2 -//.word 0x6690556d -//.word 0x5c9baa43 -//.word 0x98e8feda -//.word 0x5c443497 -//.word 0x466189d4 -//.word 0x1a867833 -//.word 0xc284db31 -//.word 0x93ec52fe -//.word 0xd27fe88c -//.word 0x77e6f4e5 -//.word 0x30a43ec3 -//.word 0xa948635a -//.word 0x0be77b79 -//.word 0xc3c9f8d1 -//.word 0x8463d194 -//.word 0x8f85e143 -//.word 0x32d58ac1 -//.word 0x8e7c9dab -//.word 0x9e1f7eec -//.word 0x7511838b -//.word 0xc7c79ec8 -//.word 0xab8c3c68 -//.word 0x9f756c4d -//.word 0xcd984449 -//.word 0x8d798034 -//.word 0x2ac56d3c -//.word 0xe943067d -//.word 0x47075cd2 -//.word 0x83e93bea -//.word 0x5c350a9e -//.word 0x1ca4f381 -//.word 0xd58b44b9 -//.word 0xeb53150e -//.word 0xd2292c41 -//.word 0x19f61d9f -//.word 0xa892b5d5 -//.word 0x46359906 -//.word 0x5e2e2b1b -//.word 0x02d7ad5b -//.word 0x30c8a93b -//.word 0x544b9077 -//.word 0x0f10a161 -//.word 0x37220c79 -//.word 0x1f1a583f -//.word 0x18930245 -//.word 0x37dd6788 -//.word 0x59f6e300 -//.word 0x65b53b76 -//.word 0xd1493896 -//.word 0x68e29545 -//.word 0x4aae1c35 -//.word 0x34070bb6 -//.word 0x01ebbccf -//.word 0x71ac858d -//.word 0x2ae8de9b -//.word 0xfcbcc113 -//.word 0x69355794 -//.word 0x6507d095 -//.word 0x5a8292f8 -//.word 0x6fc197e2 -//.word 0x0a2510cb -//.word 0x93024fd1 -//.word 0x7c97e352 -//.word 0x7e4405b9 -//.word 0x25f73398 -//.word 0x8ee81af8 -//.word 0x7086b9ed -//.word 0x59b0c46d -//.word 0x3a294661 -//.word 0x26468bfd -//.word 0x57ea3d4d -//.word 0x72b4cd11 -//.word 0x0b7714cb -//.word 0x6ceb3b16 -//.word 0x92a2d839 -//.word 0x793d59fc -//.word 0x9adfa6bb -//.word 0xb1e202b8 -//.word 0xc3c932b5 -//.word 0x6076e2c3 -//.word 0x269e4455 -//.word 0x8679fa98 -//.word 0xcbbe3607 -//.word 0x57ce203a -//.word 0x302f78fe -//.word 0xbc3d7cab -//.word 0xc91c0cb2 -//.word 0xd0f10c76 -//.word 0x7b520a5d -//.word 0x64fb2026 -//.word 0x20c21c7d -//.word 0x7ccddfcc -//.word 0x06020355 -//.word 0xd0bfc17e -//.word 0x70cb116b -//.word 0x4b8d12d2 -//.word 0x147cad0b -//.word 0x8fd77567 -//.word 0x9b96d2c3 -//.word 0x6fa05f5d -//.word 0x243e90e6 -//.word 0x74d098d8 -//.word 0xc1bf8a09 -//.word 0x58b2be81 -//.word 0xf8057688 -//.word 0x8e77c104 -//.word 0x4322a002 -//.word 0xb8b16893 -//.word 0x90cd67d9 -//.word 0x30d8ca61 -//.word 0xc2debeb3 -//.word 0x80c8d628 -//.word 0x2fd3adfc -//.word 0xe941cca4 -//.word 0x204fce62 -//.word 0xe066c216 -//.word 0x5495d057 -//.word 0x8c3f20c2 -//.word 0x7d11f792 -//.word 0x4a372372 -//.word 0xc2d09a8f -//.word 0x299f5ef0 -//.word 0x3b03a30a -//.word 0x6e29348f -//.word 0x78801388 -//.word 0x116d5fa3 -//.word 0xfa417bce -//.word 0x3e686d04 -//.word 0xb8e28467 -//.word 0xd5f83e90 -//.word 0x9b276823 -//.word 0xea6187a6 -//.word 0x02757793 -//.word 0x46cb52ab -//.word 0x4054948e -//.word 0xe4c17c89 -//.word 0x19f3b5af -//.word 0x75b3352b -//.word 0x48a466d4 -//.word 0xdd758302 -//.word 0xfc5b45a0 -//.word 0xb3bfc083 -//.word 0x573487fa -//.word 0xc5ab17a7 -//.word 0xedea738d -//.word 0x923a0b69 -//.word 0x4b60e246 -//.word 0xcecff04c -//.word 0x6d1cc6d9 -//.word 0xe1b270d3 -//.word 0x47c79f3c -//.word 0x688f0806 -//.word 0x3daf0729 -//.word 0xb3f488f4 -//.word 0xab4527a0 -//.word 0x45d6962b -//.word 0x5e9f3f64 -//.word 0x570d2b42 -//.word 0x18f72379 -//.word 0x55d3154f -//.word 0x102ab9ac -//.word 0x60497371 -//.word 0x703a7c0b -//.word 0xcaf23d48 -//.word 0xd6ccfb69 -//.word 0x9d36b978 -//.word 0xd3aa5adc -//.word 0x15e1072a -//.word 0x6f43d03e -//.word 0x21a1968b -//.word 0xa32628af -//.word 0xe68bac4a -//.word 0xdd8b4111 -//.word 0x3c97e21e -//.word 0x80ca8d8a -//.word 0x2f1fa53e -//.word 0x61e29606 -//.word 0x7f64b7e8 -//.word 0x4bf374b3 -//.word 0x2009acda -//.word 0x7bc45883 -//.word 0xbb966edc -//.word 0x253e05ae -//.word 0x2bf7b934 -//.word 0xeeef512d -//.word 0x01fa9f30 -//.word 0x7088a840 -//.word 0x01d505a0 -//.word 0xb95f89e8 -//.word 0xa29d2459 -//.word 0xccee076e -//.word 0x92d009b3 -//.word 0x1e524ada -//.word 0x30cc160c -//.word 0x1acd0c7d -//.word 0x10557f43 -//.word 0x9e441c68 -//.word 0x7a13cd3e -//.word 0x7cc2def2 -//.word 0xeb115f64 -//.word 0xfaf3c936 -//.word 0x9240e424 -//.word 0x52aae793 -//.word 0xd5f2e16c -//.word 0x335c592a -//.word 0xca603132 -//.word 0x3ea2d163 -//.word 0xbe2481ef -//.word 0x89ba1569 -//.word 0xb1bfd01f -//.word 0x1f0783a9 -//.word 0xd814f5c2 -//.word 0x7f8d8757 -//.word 0x1aeb18de -//.word 0x197627e9 -//.word 0x947037fb -//.word 0xd490789a -//.word 0x15b2a3a5 -//.word 0x8acc26e8 -//.word 0xa22481ee -//.word 0x8ac0f016 -//.word 0xf31e4ae9 -//.word 0x152629ab -//.word 0xf35d4b30 -//.word 0xe15b38f2 -//.word 0x447f2560 -//.word 0x9ae11978 -//.word 0xba884e97 -//.word 0x5cdeda90 -//.word 0xdb608efc -//.word 0x3a9a1fd2 -//.word 0x66538338 -//.word 0xba059e98 -//.word 0xc8901ef5 -//.word 0x572ea480 -//.word 0xa8aa2466 -//.word 0xfecd8eed -//.word 0x5c1aaebf -//.word 0x91bb5185 -//.word 0x72baa9b8 -//.word 0x6774f2b4 -//.word 0x294b560f -//.word 0xc99c0e28 -//.word 0xf5f1cb03 -//.word 0x77775454 -//.word 0xfeb270d9 -//.word 0x216f06ed -//.word 0xa1fa835b -//.word 0xee927c70 -//.word 0xed1a9554 -//.word 0xf911a19a -//.word 0x28c40a15 -//.word 0xcfc273ed -//.word 0x48919df3 -//.word 0xf29f8732 -//.word 0x7a7bdac6 -//.word 0x594583f2 -//.word 0x9e64a26c -//.word 0xee76a3fb -//.word 0xc98daa44 -//.word 0x0e9835e1 -//.word 0xc21ffdb4 -//.word 0x0d341d7b -//.word 0x85a675a4 -//.word 0xb0775162 -//.word 0xc3904600 -//.word 0xb0b45d76 -//.word 0x60b3743a -//.word 0x3de0e058 -//.word 0xf4c457c5 -//.word 0x79140ef0 -//.word 0x4be11e9b -//.word 0xf90f2ce9 -//.word 0xe50849b8 -//.word 0x48b11730 -//.word 0x769e2d9c -//.word 0x6482bd79 -//.word 0x67e974cd -//.word 0x3e29a2bb -//.word 0x53959b53 -//.word 0x3ef55daf -//.word 0x8b33733b -//.word 0xbd571954 -//.word 0x92b5a015 -//.word 0x8965146d -//.word 0xa2f41d75 -//.word 0x65592301 -//.word 0x252bb576 -//.word 0x86112cdb -//.word 0x3d798b32 -//.word 0x178daa08 -//.word 0x3d62944b -//.word 0xb6732d5c -//.word 0x2d4f1865 -//.word 0xf58ed7ed -//.word 0x4a0934a9 -//.word 0xda4be095 -//.word 0x84425b44 -//.word 0x5f3a1374 -//.word 0xfe0dd0e6 -//.word 0xf2934f6d -//.word 0x91602d44 -//.word 0xf6af08a4 -//.word 0x4999e096 -//.word 0x418bc307 -//.word 0xe6f6a91a -//.word 0x9c489dc2 -//.word 0x5d1c1d8f -//.word 0x46adc4c8 -//.word 0x559126bb -//.word 0x71a4fc51 -//.word 0xaa4281e5 -//.word 0xc3b91b56 -//.word 0xedfd3e5b -//.word 0xd69e8d17 -//.word 0xe2f843ee -//.word 0xb8aad296 -//.word 0x0149ca71 -//.word 0x6c55fb1a -//.word 0xf66bde3e -//.word 0x68bd31ad -//.word 0x21c0e2b0 -//.word 0x15242e9e -//.word 0x16090aaa -//.word 0x5370c2ff -//.word 0x1eefe00f -//.word 0xf2aa4f27 -//.word 0xb47ec047 -//.word 0x397f4d32 -//.word 0x09a55cc1 -//.word 0x62c2c77c -//.word 0x80b73a6b -//.word 0x1ce8dc2a -//.word 0x33ed313c -//.word 0x088b3fa1 -//.word 0x6ce2efab -//.word 0x3de7b70d -//.word 0x2d157635 -//.word 0xc4609fdc -//.word 0xa96b9adb -//.word 0x1dfa6740 -//.word 0xc8aa85a1 -//.word 0xb8e012b0 -//.word 0xa7ff3310 -//.word 0x7cdeb667 -//.word 0x1579f6b5 -//.word 0x44e6ffe4 -//.word 0x178bf3a0 -//.word 0x5d8fad68 -//.word 0x658ea3e5 -//.word 0x0991117b -//.word 0xeb3d541f -//.word 0xff4a9368 -//.word 0x4a37a5e8 -//.word 0xe93c2fbc -//.word 0x54810d62 -//.word 0xe48df4cb -//.word 0x930155b1 -//.word 0x0486842b -//.word 0xc304197f -//.word 0xcd159737 -//.word 0x53b94b77 -//.word 0xbb4b778d -//.word 0xe8b3b0ca -//.word 0xbbde8590 -//.word 0xd96b61ad -//.word 0xafa7b3e7 -//.word 0xb4bc4bd8 -//.word 0xee2507fd -//.word 0xb865b009 -//.word 0xc2f91f7f -//.word 0x598ba47f -//.word 0xe968a8e0 -//.word 0xc0349080 -//.word 0x14dde5d8 -//.word 0x48cdb2d4 -//.word 0x6b642ee1 -//.word 0x02a59b47 -//.word 0x072f6eb9 -//.word 0x316fb02a -//.word 0x7615a4e3 -//.word 0xcfc4aad3 -//.word 0x3b0e6326 -//.word 0x069f1619 -//.word 0x4bb8530c -//.word 0xb8e0d6d8 -//.word 0x91d6ad64 -//.word 0xf7c99e73 -//.word 0x6bcbc3c0 -//.word 0x8e84774d -//.word 0x2a2376f8 -//.word 0x769a3f4f -//.word 0x960bbda5 -//.word 0x627d2766 -//.word 0x68d425a7 -//.word 0x34003401 -//.word 0xcf744ba0 -//.word 0x85dabf97 -//.word 0xeb056476 -//.word 0x2127f51f -//.word 0x5544b5d5 -//.word 0x88e65796 -//.word 0x95131bab -//.word 0x6f7c3b7d -//.word 0xaaf785aa -//.word 0x3d2f4958 -//.word 0x869a75ca -//.word 0x8eacff31 -//.word 0x8f4b83c4 -//.word 0xb3822e12 -//.word 0x1f79da97 -//.word 0x30a57a8e -//.word 0x043cb907 -//.word 0x3decde39 -//.word 0x01ccf319 -//.word 0x4593262c -//.word 0x4c086f99 -//.word 0x6ab97382 -//.word 0x0ef0a994 -//.word 0x00e3bbdd -//.word 0xe62b2fde -//.word 0x0d7746e2 -//.word 0x6682248e -//.word 0xcf4232b8 -//.word 0x9463c17d -//.word 0x36f3f08d -//.word 0x6b5fcfca -//.word 0x659ec412 -//.word 0x57ac2e58 -//.word 0x363a49fa -//.word 0xbda4524e -//.word 0xb323eb7e -//.word 0x7044c097 -//.word 0x9e986bdc -//.word 0x3dad9560 -//.word 0xe93e5ed4 -//.word 0x60a7ff9d -//.word 0x3f9bae2a -//.word 0x0c19c384 -//.word 0x799c1826 -//.word 0xe793b510 -//.word 0x2a10ad17 -//.word 0x8cc4437f -//.word 0x142b51cb -//.word 0x0804ebd4 -//.word 0xb0043f19 -//.word 0x5dcbbf56 -//.word 0xaa178358 -//.word 0x0238e80f -//.word 0x62c47ee5 -//.word 0x608b214e -//.word 0x6dcd65a0 -//.word 0x57ab3826 -//.word 0x12dcc26f -//.word 0xb7a190ec -//.word 0xcdfbf2bb -//.word 0xc81ba1bd -//.word 0xcf1aa5ee -//.word 0xc2ea76f6 -//.word 0x7c8d62fb -//.word 0x55842eba -//.word 0xeb8b00d6 -//.word 0x23837d6f -//.word 0x6ab02ef7 -//.word 0x41242841 -//.word 0xf87becdb -//.word 0xb9c98c9e -//.word 0xc9d10f83 -//.word 0x0b7817b9 -//.word 0xc679c1f4 -//.word 0xa759cd07 -//.word 0x0a9effb5 -//.word 0x753cc4c4 -//.word 0x65501954 -//.word 0x4e10a96f -//.word 0xdd0235e1 -//.word 0x806d394a -//.word 0x280ecd71 -//.word 0x4e0bc9db -//.word 0x342d2c9d -//.word 0x6d49bf6e -//.word 0x9ffff500 -//.word 0x88a71691 -//.word 0x3f899cbd -//.word 0xbc4cde96 -//.word 0x9bb2ebf6 -//.word 0x1d82b914 -//.word 0x70c57f56 -//.word 0x30345f66 -//.word 0x2df24888 -//.word 0x6f771b2b -//.word 0x77cc0cbd -//.word 0xc8fe4cc4 -//.word 0xa6cde52b -//.word 0x1ea4e5d9 -//.word 0x46cebe89 -//.word 0xc6e6edd5 -//.word 0x978fda93 -//.word 0x0b66ff65 -//.word 0x0e354d8c -//.word 0xab6acbfd -//.word 0xd2c781b7 -//.word 0x585a9453 -//.word 0x3fb0b2dd -//.word 0x3846b0e2 -//.word 0x664072ca -//.word 0x655d0c68 -//.word 0x8b2b26d0 -//.word 0x6d77a569 -//.word 0xa5088843 -//.word 0xd38d0faa -//.word 0xe2d323fb -//.word 0x8d3bf2b6 -//.word 0x216cdad5 -//.word 0x8445885c -//.word 0x76156132 -//.word 0x170f202f -//.word 0xa9f8c176 -//.word 0x98239f05 -//.word 0xb79fd98a -//.word 0xcdaff978 -//.word 0x507ad85b -//.word 0x7004bc69 -//.word 0x585dc459 -//.word 0xb0198678 -//.word 0x66fff6f9 -//.word 0xae068a8c -//.word 0x477d9b33 -//.word 0x00890f51 -//.word 0x7cd43504 -//.word 0x3284f0b5 -//.word 0xb76a18ee -//.word 0x407c1d6b -//.word 0x6386ed73 -//.word 0x1d1c1869 -//.word 0x19d3329e -//.word 0x2fb17a69 -//.word 0x2ce1b87a -//.word 0xd1ab6c6b -//.word 0x1ea42498 -//.word 0xd0222e31 -//.word 0x28f36f8d -//.word 0xee4f93c1 -//.word 0xb60a6772 -//.word 0x620e82e7 -//.word 0xe8092b62 -//.word 0x556377b1 -//.word 0x1273b200 -//.word 0x66f200f1 -//.word 0x3db044ef -//.word 0x288541bf -//.word 0xa48b0057 -//.word 0x9f8a71f4 -//.word 0x38b45467 -//.word 0xc7935aaf -//.word 0x1d3f88cd -//.word 0x0dd4ddd4 -//.word 0x2b233440 -//.word 0xd3a86c88 -//.word 0x6dbdc5f7 -//.word 0xf00c8db7 -//.word 0xa54afd2f -//.word 0x2e235e8f -//.word 0xc6706fa8 -//.word 0xcab00b02 -//.word 0x79b60728 -//.word 0xf89f5a47 -//.word 0x980780f7 -//.word 0x5c7d2059 -//.word 0xb633ec62 -//.word 0x92fac876 -//.word 0x956e2f39 -//.word 0xa76ed3a2 -//.word 0xafd08451 -//.word 0x9d525322 -//.word 0xaed3f702 -//.word 0xebc37001 -//.word 0xf4d8eaa9 -//.word 0xfb02e38e -//.word 0x13a29027 -//.word 0xabf77ddc -//.word 0x55d87560 -//.word 0xcda9a141 -//.word 0x3688f3be -//.word 0xa6c7c6d8 -//.word 0xe59fbeac -//.word 0x7222f6ff -//.word 0xc7725a1b -//.word 0xde3151da -//.word 0xf438a000 -//.word 0x8d8c8bcd -//.word 0xb88d3cd3 -//.word 0x94716906 -//.word 0x13f13212 -//.word 0xfe4248f1 -//.word 0x3a4754bc -//.word 0x490597c1 -//.word 0x1357cdd7 -//.word 0xe7e358ee -//.word 0xbd4c9aea -//.word 0xbeaaa3b2 -//.word 0x06370c83 -//.word 0xa84a228b -//.word 0xf28a48b3 -//.word 0xf35b96bc -//.word 0x3b9dc68d -//.word 0xe29651cb -//.word 0xcc2cd5ab -//.word 0x2a58ba04 -//.word 0x44d715a9 -//.word 0x7723ccf5 -//.word 0x79a1fca7 -//.word 0xe51c97f0 -//.word 0xf37252cb -//.word 0x868dbe8d -//.word 0x6d95b4bd -//.word 0xe264f725 -//.word 0x573b1529 -//.word 0x73b38e58 -//.word 0x57f63841 -//.word 0x252ee288 -//.word 0xc33e3839 -//.word 0xdcb1e75b -//.word 0x28ef01c9 -//.word 0xeeb7a23d -//.word 0xc7c9d4ae -//.word 0xa4e3b0dc -//.word 0x12efc629 -//.word 0xbd7bbfaa -//.word 0x3369417e -//.word 0xebe8135e -//.word 0x86a38276 -//.word 0x54380373 -//.word 0x1aeb19de -//.word 0x139c79a8 -//.word 0x34f66d06 -//.word 0xb4ea767f -//.word 0xcc5b3542 -//.word 0xbc1b8bbe -//.word 0x0e17006d -//.word 0x1ece61f0 -//.word 0xda08ad61 -//.word 0xc7c433e5 -//.word 0x4572f480 -//.word 0x13624e2e -//.word 0x157ddc2f -//.word 0x553398a2 -//.word 0x49b44255 -//.word 0x546306dc -//.word 0x8e8759e0 -//.word 0xc84424ba -//.word 0xcbcb2440 -//.word 0xe1cd90df -//.word 0x9735fdeb -//.word 0xc0168032 -//.word 0xbde212d7 -//.word 0xfcde385e -//.word 0xbfd2e303 -//.word 0x1f059450 -//.word 0x5068c5ee -//.word 0x261285bc -//.word 0xd8ec621e -//.word 0x05ae8b98 -//.word 0xf40a369b -//.word 0x2026409e -//.word 0xf4501371 -//.word 0xd3eecdce -//.word 0x5bb39f32 -//.word 0xeb1972ea -//.word 0x620bd171 -//.word 0x2ae103f9 -//.word 0x76927748 -//.word 0xc72566c5 -//.word 0xb569b3d3 -//.word 0xece6165d -//.word 0x751379b2 -//.word 0x37caa294 -//.word 0xbdf8138b -//.word 0x39992e80 -//.word 0xc9e49d86 -//.word 0xfac2f1fb -//.word 0x8b8589d0 -//.word 0x73d7b625 -//.word 0x24f01c19 -//.word 0x120d5ce0 -//.word 0x6f1df016 -//.word 0x39bd5652 -//.word 0x776670ff -//.word 0xc0e52b67 -//.word 0xfc0c5f11 -//.word 0x6fa8f64d -//.word 0xf3b3510d -//.word 0x84cae7f6 -//.word 0x02e12fb7 -//.word 0x3335c19a -//.word 0x0882b858 -//.word 0x21765a32 -//.word 0x9266fb3d -//.word 0xe8411efe -//.word 0x67c2de36 -//.word 0x96e98cff -//.word 0xfeab9a18 -//.word 0x2ee9b77e -//.word 0x029f3c3c -//.word 0x255ec783 -//.word 0xd5fc25fd -//.word 0xe68a765f -//.word 0x0a868b3e -//.word 0x4f529323 -//.word 0xe9e5f7e1 -//.word 0x32c18226 -//.word 0xef24c551 -//.word 0xd583ba83 -//.word 0x4c34a7f9 -//.word 0x726b4599 -//.word 0x636722ca -//.word 0xb8ed4489 -//.word 0x4df60fba -//.word 0x48a569bb -//.word 0x567b1b3f -//.word 0x38ce7a5a -//.word 0x7f7748d8 -//.word 0x93ccd5d3 -//.word 0xface6985 -//.word 0xd7a3e65a -//.word 0xb146aa49 -//.word 0x767db365 -//.word 0xc00b06af -//.word 0x5627512f -//.word 0xf62ecf43 -//.word 0x52956c36 -//.word 0x58212a14 -//.word 0xb65ac3bd -//.word 0x9e3d9039 -//.word 0xc631a94b -//.word 0xb43c4e49 -//.word 0x3877852a -//.word 0x3abf05e1 -//.word 0xb5ae53ea -//.word 0x04c92b22 -//.word 0x5dfb21db -//.word 0x9b438830 -//.word 0x40a99396 -//.word 0xba76bab4 -//.word 0xe5a45f75 -//.word 0xd294b25b -//.word 0xc7ffd216 -//.word 0x862f3555 -//.word 0xd26f49dc -//.word 0x30c05bd6 -//.word 0xebcdb96d -//.word 0x5a211399 -//.word 0x65982735 -//.word 0x46139e58 -//.word 0x8d7030e2 -//.word 0x67ba0f55 -//.word 0x1f9c83e7 -//.word 0xe51cd1d5 -//.word 0xcf8662f9 -//.word 0x1da5219f -//.word 0xc1392595 -//.word 0x1fa69081 -//.word 0x11eab777 -//.word 0x2ed183cb -//.word 0x4c6c1724 -//.word 0x43bfb2d2 -//.word 0xf4bad762 -//.word 0x8a6bac6f -//.word 0x0071a1bb -//.word 0xe4b4517e -//.word 0x5a53adfd -//.word 0x63de575f -//.word 0x5fc64cbc -//.word 0xd111c678 -//.word 0x635261cf -//.word 0x2ad97cb0 -//.word 0x2a27e2cf -//.word 0x1da5aaf6 -//.word 0x70955b9b -//.word 0x8f4854b8 -//.word 0x62916bd7 -//.word 0x177bd56c -//.word 0x23374668 -//.word 0x8358580b -//.word 0x484331fa -//.word 0x52e06091 -//.word 0x5c96097a -//.word 0x3977427f -//.word 0x5cb7bc9c -//.word 0x9e63a659 -//.word 0x3c4fce57 -//.word 0x1f510a28 -//.word 0x61acd663 -//.word 0x0ccf3ef8 -//.word 0x2540ffc2 -//.word 0xe9d3e95b -//.word 0x561f8734 -//.word 0xed3202e5 -//.word 0xb78443c1 -//.word 0x862a58ae -//.word 0x7d4c1934 -//.word 0xd2d90bd3 -//.word 0xd379849a -//.word 0x27c410f5 -//.word 0x57b114c7 -//.word 0x8d51b1b8 -//.word 0x9bbdebd1 -//.word 0x3e4d0b46 -//.word 0xa40a4192 -//.word 0x2d668ec9 -//.word 0x6f2be12a -//.word 0x7cb281f4 -//.word 0x6755aa7c -//.word 0x04267b7b -//.word 0xf0e210ac -//.word 0xd120eb97 -//.word 0xdfce98a7 -//.word 0xa4de9083 -//.word 0xff3d5f9b -//.word 0x6f050201 -//.word 0x8ef3937b -//.word 0xdc1b28d6 -//.word 0xbedaf87d -//.word 0xc70dbf4a -//.word 0x3580649b -//.word 0xbfaad9a9 -//.word 0x8e974415 -//.word 0x89255cc4 -//.word 0xd57315ed -//.word 0x9c977f70 -//.word 0x0e8feb6a -//.word 0xa67a5106 -//.word 0xaf09ee96 -//.word 0x063031e2 -//.word 0x2121d8bf -//.word 0x507a57e4 -//.word 0x43bd79fa -//.word 0xcd0249f2 -//.word 0xe7e8339b -//.word 0xf8d16774 -//.word 0x544f7ebf -//.word 0x02d960d6 -//.word 0xc2c365c2 -//.word 0x4e6dba0a -//.word 0xe1ba07c9 -//.word 0xf6c34e03 -//.word 0x52cd1739 -//.word 0x4479ca3b -//.word 0x2c3b5c3e -//.word 0x3a0d2d2e -//.word 0x78653146 -//.word 0x0b644fdd -//.word 0xb6500683 -//.word 0x9f44564c -//.word 0x5626de6c -//.word 0x13da4204 -//.word 0x3fb5cf3c -//.word 0x36356292 -//.word 0x4cef8572 -//.word 0x0ec8dc06 -//.word 0xca68c04f -//.word 0x51ec2975 -//.word 0xfbdbd15b -//.word 0xec5c9677 -//.word 0x96a620e1 -//.word 0x7fb7c5a9 -//.word 0x4449a96e -//.word 0xdf022a2c -//.word 0x25eb7b56 -//.word 0x92238e25 -//.word 0x49d5382f -//.word 0x5767903b -//.word 0x38f49854 -//.word 0x9cfd1f1c -//.word 0x6b5be563 -//.word 0x067801f8 -//.word 0xd0bf80bf -//.word 0xed514f04 -//.word 0x49fa5b0f -//.word 0xdc63f6f9 -//.word 0x2d897dbe -//.word 0x156d3792 -//.word 0xc60e8179 -//.word 0x0b942812 -//.word 0xd2ce17b3 -//.word 0xe7de32bb -//.word 0x02338124 -//.word 0x04b89158 -//.word 0x7e4b1746 -//.word 0x7371d7b4 -//.word 0x5f48c4d7 -//.word 0x77bd6921 -//.word 0x33fe875a -//.word 0x0a3300f2 -//.word 0x7c69f396 -//.word 0x56ce2901 -//.word 0x3224b015 -//.word 0x3d70c52a -//.word 0x3df2f8a6 -//.word 0xd25a8acd -//.word 0xfb391adb -//.word 0xddb68050 -//.word 0xc082fa8c -//.word 0x5b0e869b -//.word 0x51fb8e52 -//.word 0xfbd2ca9b -//.word 0x68f5630d -//.word 0xa2d554c0 -//.word 0x3366165f -//.word 0xe8d07c7e -//.word 0xd568dc2e -//.word 0x99de6fcf -//.word 0xe4b7fa26 -//.word 0x36feaeb0 -//.word 0xe9374d35 -//.word 0x71958f9f -//.word 0xe36dc40d -//.word 0xb4e9ba24 -//.word 0xc301e1a5 -//.word 0x9aa7ad45 -//.word 0xf1423cb9 -//.word 0x745e3910 -//.word 0xc7a20045 -//.word 0xc6020315 -//.word 0x11366c0e -//.word 0xc86a04e9 -//.word 0x93375319 -//.word 0xe6d209a4 -//.word 0x83839c32 -//.word 0x40593363 -//.word 0x0a1dc366 -//.word 0x80000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00012D00 -//// expected output -//.word 0xb5a4f6d8 -//.word 0x3ff89145 -//.word 0x1101726f -//.word 0x1ad4d1ca -//.word 0xf87a5d9a -//.word 0xdb3ab3b9 -//.word 0x0196fdbd -//.word 0x440e75cf -//.word 0xb8c2e700 -//.word 0x40f56a60 -//.word 0xf70da600 -//.word 0xfc144708 -//.word 0x597cec73 -//.word 0xd1ebf7b0 -//.word 0x1f0fbc00 -//.word 0x1a01c31b -//// SHA512LongMsgvector_97 -//// vector length -//.word 0x00013018 -//// input message -//.word 0x8532190e -//.word 0xe23ddd58 -//.word 0x861065fe -//.word 0x170e971e -//.word 0xd3ccc88c -//.word 0xc7738a5f -//.word 0x4166c5b0 -//.word 0x89250a9e -//.word 0xcc722395 -//.word 0x59b2efd1 -//.word 0x10956d1d -//.word 0x16f916e1 -//.word 0xce0c705b -//.word 0x05b1e02d -//.word 0x6d26bf18 -//.word 0x4de3b107 -//.word 0x76c5324f -//.word 0x796b7235 -//.word 0x17e163b1 -//.word 0xf97b1071 -//.word 0xa2043021 -//.word 0xa118fbea -//.word 0x0bcf3c38 -//.word 0x289ca8c1 -//.word 0x6d746ec3 -//.word 0xaa320f8c -//.word 0x853a7040 -//.word 0x275c2ed7 -//.word 0x35fc3165 -//.word 0x0270849e -//.word 0x03aa6399 -//.word 0x831796d4 -//.word 0x97c6fe79 -//.word 0x55cd6edf -//.word 0x41e9bc54 -//.word 0x0864171a -//.word 0x713c9aaf -//.word 0x90812251 -//.word 0x3dff5dc2 -//.word 0xc41d2449 -//.word 0xde050bf9 -//.word 0xe0053635 -//.word 0x33356e74 -//.word 0x045b7342 -//.word 0x3c0b9488 -//.word 0xb3137e0c -//.word 0xa016523b -//.word 0x5576fa27 -//.word 0x2977bccc -//.word 0xb5a20f97 -//.word 0x4368ae29 -//.word 0x8308ec58 -//.word 0x80b34776 -//.word 0xd3ed3fd6 -//.word 0x1636698d -//.word 0x9ceabf76 -//.word 0x5f663a79 -//.word 0x3a6ca30c -//.word 0x59c9a6f9 -//.word 0xed342862 -//.word 0x247ada03 -//.word 0x58d80eb8 -//.word 0x87a8ca3f -//.word 0x03411b3e -//.word 0x6a18ac88 -//.word 0xd92b979c -//.word 0x5d9f7b6f -//.word 0xaaa7cf6b -//.word 0x10a976b7 -//.word 0xaa9c93b9 -//.word 0xd9b59ed9 -//.word 0xf042b888 -//.word 0x31d63b81 -//.word 0xf9a6964f -//.word 0x37335810 -//.word 0x22298a78 -//.word 0x2c874219 -//.word 0x310175e1 -//.word 0xf5a30de4 -//.word 0xcdb63b5b -//.word 0x9ce70fed -//.word 0x01a6462e -//.word 0xcfcd6366 -//.word 0xbe820193 -//.word 0x605e67b1 -//.word 0x56cf5d38 -//.word 0xc3ba3ee7 -//.word 0x01654fc0 -//.word 0x93954f54 -//.word 0x5bf34f40 -//.word 0x0db4c4f8 -//.word 0xe479dbc3 -//.word 0x94740c07 -//.word 0x7fcdf2c7 -//.word 0x2b445a6a -//.word 0xf4179abe -//.word 0xfe26243c -//.word 0x6e555a8e -//.word 0xda32a44e -//.word 0xfdd8c011 -//.word 0xb0135aa4 -//.word 0x16c4dd95 -//.word 0x168788f5 -//.word 0x0e94c45d -//.word 0xc5e3b52f -//.word 0xa2940f1e -//.word 0x1c8d2bf1 -//.word 0x72655a83 -//.word 0x9c81790f -//.word 0x817cc5aa -//.word 0x6accf111 -//.word 0xb7a376a5 -//.word 0xd1142bb4 -//.word 0x5f7715fa -//.word 0xbd0e8068 -//.word 0xa9e94e24 -//.word 0x400690d0 -//.word 0x2abd530f -//.word 0x115bbc45 -//.word 0x570e589f -//.word 0x0801ad54 -//.word 0x0dc7152a -//.word 0xa3fdcc3b -//.word 0x0c2b47f9 -//.word 0x84ecc770 -//.word 0x774f2fcb -//.word 0xf17c121a -//.word 0x569b1152 -//.word 0x53f16495 -//.word 0x144cb6b4 -//.word 0xb8a236f3 -//.word 0x02f5eb0c -//.word 0x51794776 -//.word 0xd2f900e6 -//.word 0xf4771b17 -//.word 0x1c134ac7 -//.word 0x9b2e7702 -//.word 0xddcea1a2 -//.word 0xe244e717 -//.word 0xf20de264 -//.word 0x8df7386a -//.word 0xa2846e69 -//.word 0x0193fec4 -//.word 0x113daa04 -//.word 0xc6fe0f20 -//.word 0xce157dfc -//.word 0x0b2d062f -//.word 0x463cd509 -//.word 0x22acc2d5 -//.word 0x4eb9235b -//.word 0xff1ae4a9 -//.word 0x9ee3da13 -//.word 0xbdaa5479 -//.word 0x50e8f3c8 -//.word 0x1aa3bcc3 -//.word 0x654a6c04 -//.word 0xf6e10b3d -//.word 0x405dc4c4 -//.word 0xd852f44f -//.word 0x29cb81fc -//.word 0x69796d94 -//.word 0xcc11ab10 -//.word 0xf7ef315c -//.word 0xb7ff4e5c -//.word 0xf3dd3e2d -//.word 0xdf3bfcad -//.word 0x7384573d -//.word 0x1cbe48c5 -//.word 0xb1b583f9 -//.word 0xa8564cdb -//.word 0x8a598c81 -//.word 0xa4232419 -//.word 0x00ea812a -//.word 0x931a701d -//.word 0xb8f734fb -//.word 0xdd84d778 -//.word 0x7ca4bd31 -//.word 0x4e807f32 -//.word 0xbb28f6bb -//.word 0x947d9544 -//.word 0x044efcbe -//.word 0xc4c1cb1c -//.word 0x8ff5b412 -//.word 0xd6e5d51c -//.word 0xb49044c3 -//.word 0x2457eb1c -//.word 0x72a69691 -//.word 0xefd64ae3 -//.word 0xe952d970 -//.word 0xdaf9b3b2 -//.word 0xe0c4ff09 -//.word 0x6da9eaba -//.word 0x40bf3f37 -//.word 0x94a239a1 -//.word 0x9719958b -//.word 0x1df6ea01 -//.word 0x963e3dc8 -//.word 0x3d8ad0e8 -//.word 0x93ad3c68 -//.word 0x0c97bf59 -//.word 0x087ad716 -//.word 0x042b10c9 -//.word 0x12ca1a31 -//.word 0x86a51ea3 -//.word 0xf35a524f -//.word 0x563cccc5 -//.word 0x90f894b8 -//.word 0x1a79fc01 -//.word 0xf40834e6 -//.word 0xdeb8199d -//.word 0xcb014e0c -//.word 0x93ab8ed3 -//.word 0xe8ed408c -//.word 0x8bd74c51 -//.word 0xbfed2e7f -//.word 0xff1549ba -//.word 0xecb37d32 -//.word 0x8912fb24 -//.word 0xaa0658a3 -//.word 0xaacfe198 -//.word 0x5d412f08 -//.word 0x4522fb95 -//.word 0x09d43348 -//.word 0x22334c8d -//.word 0xd8c1db7f -//.word 0x6d015f66 -//.word 0x9820617e -//.word 0x35dac0fb -//.word 0x3a9c4649 -//.word 0xede67e98 -//.word 0x54f4ca98 -//.word 0xed9db081 -//.word 0xa07b7557 -//.word 0xf24ced6c -//.word 0x7b989126 -//.word 0x9a95d202 -//.word 0x6747add9 -//.word 0xe9eb8063 -//.word 0x8a961cf9 -//.word 0xc71a1b9f -//.word 0x2c297441 -//.word 0x80bd4c3d -//.word 0x3db60f22 -//.word 0x43c5c0b7 -//.word 0xcc8a8d40 -//.word 0xa3f9a7fc -//.word 0x910250f2 -//.word 0x187136ee -//.word 0x6413ffc6 -//.word 0x7f1a25e1 -//.word 0xc4c204fa -//.word 0x96353122 -//.word 0x52ac0e04 -//.word 0x81d89b6d -//.word 0x53808f0c -//.word 0x496ba876 -//.word 0x31803f6c -//.word 0x572c1f61 -//.word 0xfa049737 -//.word 0xfdacce4a -//.word 0xdff757af -//.word 0xed4f05be -//.word 0xb65801cd -//.word 0xc0d0193f -//.word 0x79ba5bbe -//.word 0x70bbe3c4 -//.word 0xc5c4f160 -//.word 0xdff13f37 -//.word 0x5cb191c9 -//.word 0x4e288df5 -//.word 0xa4d1cdbf -//.word 0xe6683352 -//.word 0x26077c41 -//.word 0x338f1812 -//.word 0x0f4939fd -//.word 0xa3cd2bf1 -//.word 0xb223e3d8 -//.word 0x0c29da1c -//.word 0x04341c6a -//.word 0x23fa9bb6 -//.word 0x1eb0ca7f -//.word 0x066f6754 -//.word 0xbfdc9897 -//.word 0xb3083a81 -//.word 0xc7957666 -//.word 0x8f1b953a -//.word 0xbdc91555 -//.word 0xe050fc73 -//.word 0x4bfc6cff -//.word 0x52247891 -//.word 0xbdc536b5 -//.word 0x766a15ee -//.word 0x854f71fa -//.word 0x3ec56558 -//.word 0xb9d8e108 -//.word 0x8330fc92 -//.word 0x93358b49 -//.word 0x8077f2d1 -//.word 0xf14c3adf -//.word 0x54bb6440 -//.word 0xd398fd1d -//.word 0x83f1f37d -//.word 0xdfa9a70b -//.word 0x7663431a -//.word 0xe0a14ee6 -//.word 0xf62d7e1c -//.word 0x43b9cd9d -//.word 0xb5c2ce7f -//.word 0x98ba4255 -//.word 0xc565e7b1 -//.word 0x178490e7 -//.word 0x1fb17a13 -//.word 0x198ade5d -//.word 0x1e11c37b -//.word 0x9b531678 -//.word 0x0148fcb4 -//.word 0xbefb672d -//.word 0x6deae8fc -//.word 0x49b0c423 -//.word 0xe8e14985 -//.word 0x26366236 -//.word 0x5fea6af5 -//.word 0xe1633ef7 -//.word 0xa01596e7 -//.word 0x2ca4952a -//.word 0xe1489e67 -//.word 0x5d766a47 -//.word 0x38bd5779 -//.word 0xefee03fa -//.word 0x207f1a93 -//.word 0xfd316ca3 -//.word 0xfbf1431e -//.word 0xcafcf3d6 -//.word 0x8a47b2f9 -//.word 0x3c1eaadb -//.word 0x760b4df6 -//.word 0x5bf9e930 -//.word 0xcb997c5c -//.word 0xd705c902 -//.word 0x78a4ab63 -//.word 0x804daab8 -//.word 0xd0afccbb -//.word 0xccf0ad68 -//.word 0x0c94d205 -//.word 0x54a13b60 -//.word 0xc7003758 -//.word 0x57277d9e -//.word 0x80f577bd -//.word 0x36dde158 -//.word 0x1c4793b3 -//.word 0xf6339b76 -//.word 0x61208fad -//.word 0xc22c2212 -//.word 0x7c7cf48f -//.word 0x66deafff -//.word 0x7cad4f35 -//.word 0xd4f6c13f -//.word 0xd4d8b0eb -//.word 0xa3319c8b -//.word 0xdd772cf6 -//.word 0x8be3c5cf -//.word 0x52d55b0a -//.word 0xea7487ab -//.word 0xd294dad1 -//.word 0x42de72f4 -//.word 0x622aca6b -//.word 0xb930d631 -//.word 0xe86050e8 -//.word 0x980e4d1e -//.word 0xb1d213d0 -//.word 0xcc2f2e2c -//.word 0xec72c19b -//.word 0x68dd1bff -//.word 0x2c058a39 -//.word 0x227974ef -//.word 0xeaa4a38c -//.word 0xd1f5e188 -//.word 0x013dc5e9 -//.word 0xf558cc0a -//.word 0x300fab9b -//.word 0x2f3de4e9 -//.word 0x9c31985f -//.word 0xc4549c4d -//.word 0x4b0bcfe9 -//.word 0x1edfaa94 -//.word 0xaadc185e -//.word 0x4c3688cb -//.word 0x083341d8 -//.word 0x7d44f639 -//.word 0x18759be5 -//.word 0x890877d4 -//.word 0x735d7907 -//.word 0x6816cfca -//.word 0x1478b536 -//.word 0xb8138bf9 -//.word 0xdba52b5a -//.word 0x3c3c7977 -//.word 0x0a9b3cd1 -//.word 0x57df2c0b -//.word 0xcb624bef -//.word 0x95e079b2 -//.word 0xa7d84379 -//.word 0x2335fd1b -//.word 0x102e1029 -//.word 0x526b942c -//.word 0xd969222d -//.word 0x181fe37b -//.word 0xb9e2eda8 -//.word 0x8f86d0d5 -//.word 0xccc66b2f -//.word 0x74e505ba -//.word 0x1196994e -//.word 0xa91a70df -//.word 0xeda8f501 -//.word 0xb311c6aa -//.word 0xa6a4073a -//.word 0x3c4ffbba -//.word 0xe908d561 -//.word 0x936bcb5d -//.word 0x45a56dd0 -//.word 0x27903518 -//.word 0xae1f5f53 -//.word 0x10fdfa22 -//.word 0xfb7140ae -//.word 0x868523e9 -//.word 0x68672817 -//.word 0x670f788c -//.word 0x142235b7 -//.word 0xb6170a5f -//.word 0x8498062d -//.word 0x172baa6b -//.word 0x1e11400b -//.word 0x546e6feb -//.word 0xafab0d57 -//.word 0xda1934d0 -//.word 0xe6d7980b -//.word 0x3df5173d -//.word 0xd7d99296 -//.word 0xb0e2fc0b -//.word 0x794cb059 -//.word 0x8d540847 -//.word 0x289c2b2b -//.word 0xd3d026af -//.word 0x238a3fd5 -//.word 0xa3738539 -//.word 0x0facac97 -//.word 0xc36c188c -//.word 0x72ea38a1 -//.word 0x1b7d1585 -//.word 0x39012b9a -//.word 0x3b7e77b3 -//.word 0x3304d11d -//.word 0xd2d97cdc -//.word 0x94d7fc36 -//.word 0x380f2776 -//.word 0x73b27fea -//.word 0xe532bf2e -//.word 0x4ca4b4ac -//.word 0xf8694e64 -//.word 0x7f0df7e9 -//.word 0xb16f23ac -//.word 0xce22297d -//.word 0xf714514f -//.word 0xe36d2e3c -//.word 0xd3ba2ec9 -//.word 0xc84b6f6a -//.word 0xf3d9d449 -//.word 0x6d6d5943 -//.word 0x287ca333 -//.word 0x2657dc74 -//.word 0xe8c3bda1 -//.word 0x2ae3ec9f -//.word 0xcd5f89de -//.word 0x15bf03db -//.word 0x141831ea -//.word 0x66eb9e32 -//.word 0x1f4a24f9 -//.word 0x023cbc22 -//.word 0xf46394f3 -//.word 0xb0dc621c -//.word 0xbb67f9f5 -//.word 0x9bc81908 -//.word 0x446d8ccf -//.word 0xd3506ebf -//.word 0x7e1fcd85 -//.word 0xcb9b728f -//.word 0x013efdce -//.word 0xdc2038ba -//.word 0x851ba597 -//.word 0xc12d59f7 -//.word 0x691f0d81 -//.word 0x1a6473f0 -//.word 0x2d44c65f -//.word 0xea3aa5c3 -//.word 0xf89a21b9 -//.word 0x18761582 -//.word 0x14c3b64b -//.word 0xf1b86ab2 -//.word 0x6c77de87 -//.word 0xa5ef52cf -//.word 0x1501380f -//.word 0xc5e1fec7 -//.word 0xc2c0283c -//.word 0xcca8a17a -//.word 0x4ea7539a -//.word 0x932ff541 -//.word 0x36bd2469 -//.word 0xdab9b664 -//.word 0x1c9d4b1d -//.word 0xc65a24a2 -//.word 0x45f839df -//.word 0x5e7c85ac -//.word 0x1c0ea50b -//.word 0x0d5ba1aa -//.word 0xae390ab0 -//.word 0x238945b6 -//.word 0x2b622612 -//.word 0x546cc15c -//.word 0x6b897c2b -//.word 0x37bb6920 -//.word 0x6742d326 -//.word 0xc80417f7 -//.word 0xbb32b5e3 -//.word 0xe729a7cd -//.word 0x2b96f276 -//.word 0xd6de7afe -//.word 0x1bbd1aa7 -//.word 0xbf2df4dd -//.word 0x15890673 -//.word 0x2cf2ff30 -//.word 0x47f2508a -//.word 0x8d5f85b1 -//.word 0x0282d6cf -//.word 0xb679f98e -//.word 0x3dda3bdc -//.word 0x5e99cfeb -//.word 0x0f2c667b -//.word 0xa2ec005b -//.word 0x39bf012d -//.word 0x7ff4876b -//.word 0x9a6efba7 -//.word 0x5b05e617 -//.word 0xb8290650 -//.word 0x7dc8a252 -//.word 0x3e721ac5 -//.word 0x90bcc282 -//.word 0x79e2f055 -//.word 0x24b05401 -//.word 0xd9a28885 -//.word 0x2d4ae89e -//.word 0x76f2a48d -//.word 0x8283141a -//.word 0x89a54bd9 -//.word 0x5f28eeac -//.word 0xeea34789 -//.word 0xe45a957e -//.word 0xa965a6f2 -//.word 0x940fa82d -//.word 0x5e7d3d1b -//.word 0xd790cd4c -//.word 0xd70b2040 -//.word 0x78f92ce2 -//.word 0x82492b52 -//.word 0x27bcf1e7 -//.word 0xf1017d75 -//.word 0xf81ececb -//.word 0x5811f880 -//.word 0xe2b776f0 -//.word 0x12eec281 -//.word 0x41f6232b -//.word 0x1c1ec637 -//.word 0x559c1146 -//.word 0x99bc3496 -//.word 0xc13d0181 -//.word 0x4cf7fd46 -//.word 0x0dc2b70c -//.word 0x21945824 -//.word 0x24e97c8f -//.word 0xa46840c0 -//.word 0xd6c39ca2 -//.word 0x88dff4dd -//.word 0x5735e956 -//.word 0x227875f4 -//.word 0xbf7737aa -//.word 0xec460bb2 -//.word 0x8898de16 -//.word 0x0370c175 -//.word 0x13f93b04 -//.word 0xa8b1e4d3 -//.word 0x23cd2f52 -//.word 0xc2da8813 -//.word 0x5fa09fd1 -//.word 0x5b4b03b2 -//.word 0xd5cdf2c9 -//.word 0x1f7e70df -//.word 0x72059673 -//.word 0xe07c2dff -//.word 0x8bcf7b7d -//.word 0x15655d2a -//.word 0x5703968a -//.word 0x56ed67ac -//.word 0x724e60af -//.word 0xe1d97585 -//.word 0x5cb154f7 -//.word 0x1886f6e9 -//.word 0xf80174e0 -//.word 0x01631dc1 -//.word 0x0e69c5dc -//.word 0xc5725f28 -//.word 0xc9e3cfd0 -//.word 0x31cbf9ef -//.word 0x3ac31e98 -//.word 0x3819681a -//.word 0xd32dc382 -//.word 0x6f1aef61 -//.word 0xec99d3cf -//.word 0x902315af -//.word 0x4156e735 -//.word 0xf89a24a6 -//.word 0x72049b5f -//.word 0x297bab19 -//.word 0x8219106b -//.word 0x48d3fc90 -//.word 0x595d696b -//.word 0x9f48aec8 -//.word 0x426e51e5 -//.word 0x1c8f1d31 -//.word 0x6e3c7453 -//.word 0xd1f4e66e -//.word 0x6f8e02a4 -//.word 0x72d66bd9 -//.word 0xbd7b2fb9 -//.word 0xda2955fc -//.word 0x34f2b5e8 -//.word 0x87f20d18 -//.word 0x9433507d -//.word 0x19ce41a2 -//.word 0x00534134 -//.word 0xd76b65c1 -//.word 0x80bcccc0 -//.word 0x2a0d30d2 -//.word 0x80abba47 -//.word 0x1f0b1be4 -//.word 0x4eb0d8e3 -//.word 0xe94fe53c -//.word 0x9f327623 -//.word 0x5eda12d2 -//.word 0x0ae8e988 -//.word 0x753e67d2 -//.word 0x8c610909 -//.word 0xce21701c -//.word 0x037db48f -//.word 0x2ac1fac4 -//.word 0xb3f1497a -//.word 0xee6a9993 -//.word 0xc4c72d1a -//.word 0xa5022384 -//.word 0xc1db4a36 -//.word 0x7b7e3348 -//.word 0x1a608b89 -//.word 0xc26aa7c3 -//.word 0xa4596140 -//.word 0x7165238c -//.word 0x1420417d -//.word 0xa0a28c71 -//.word 0x87e324d7 -//.word 0x0e688df1 -//.word 0xfd2205d7 -//.word 0x9b9315c0 -//.word 0xd932677d -//.word 0xce11d746 -//.word 0x63bdccb9 -//.word 0x5065c920 -//.word 0x473f3ff3 -//.word 0x6e28a69e -//.word 0x138bcb83 -//.word 0x9c836c43 -//.word 0xbc440239 -//.word 0xedb7de48 -//.word 0x1a6477d7 -//.word 0x9b950319 -//.word 0x67b84492 -//.word 0x8506a5d7 -//.word 0xc4628595 -//.word 0xac84d3d4 -//.word 0xb456db7d -//.word 0xb69e5f1a -//.word 0x9fdeeade -//.word 0x6b7861e5 -//.word 0x5116dbbc -//.word 0x3a49b224 -//.word 0x7871db13 -//.word 0xb5dc72fc -//.word 0x29329950 -//.word 0x11108345 -//.word 0x5cf3ccd6 -//.word 0xa7580c0b -//.word 0x6b21ab7a -//.word 0x753bf70e -//.word 0x977e7307 -//.word 0x9ed47242 -//.word 0x839ee5bb -//.word 0xe6537250 -//.word 0xb76ac6c8 -//.word 0x377b2b13 -//.word 0x1fa15dd3 -//.word 0x1e22991c -//.word 0x8952f878 -//.word 0x4fb4fb2f -//.word 0x2b6367c5 -//.word 0x1db053c3 -//.word 0x1a0d7fbb -//.word 0x032ae786 -//.word 0xd45d98d0 -//.word 0x1e47c3d7 -//.word 0xb7b5106f -//.word 0xafc4344a -//.word 0x8749c676 -//.word 0x9e6f4e27 -//.word 0xeca2a0b7 -//.word 0xf2ac68eb -//.word 0xf11e0578 -//.word 0x5bf29bc5 -//.word 0x876e63f3 -//.word 0xa84c461b -//.word 0x0017abd6 -//.word 0x51d88d03 -//.word 0x95f2d0c4 -//.word 0xee4bd5ca -//.word 0xe0ac4cd3 -//.word 0xbe6b4970 -//.word 0x62479a0c -//.word 0x2193592a -//.word 0xff97bdee -//.word 0x1e3335df -//.word 0x7dc5b8eb -//.word 0xdf4d56ac -//.word 0x08cf14e9 -//.word 0x2ff9f660 -//.word 0xb1065dc2 -//.word 0x03e29300 -//.word 0xea8fa5c5 -//.word 0xeec77143 -//.word 0x0ce3ff33 -//.word 0xabfb1517 -//.word 0xd14f05c3 -//.word 0x97e5ca1b -//.word 0xda74531e -//.word 0x34811f24 -//.word 0x2ac80a63 -//.word 0xa7dd67b8 -//.word 0xaa134ea5 -//.word 0x3b9d3796 -//.word 0xa3f3c868 -//.word 0xdc78ec2b -//.word 0x47592527 -//.word 0x9db8231e -//.word 0x280a95d1 -//.word 0x33bd3fc5 -//.word 0xbf1e4d47 -//.word 0x777be7ae -//.word 0xe68405e0 -//.word 0xe8f78518 -//.word 0x5e7d7be6 -//.word 0x26cfc877 -//.word 0x4b1cee16 -//.word 0x78af22f3 -//.word 0xb3cda323 -//.word 0x47dc4be9 -//.word 0x02cb6334 -//.word 0xa1adbc68 -//.word 0x89a7fb61 -//.word 0xb80d35b6 -//.word 0xfac8bc3a -//.word 0x60fb38c9 -//.word 0xeee6f941 -//.word 0x940a8bce -//.word 0x608d8b6b -//.word 0xf1e1baa5 -//.word 0x2fa150a2 -//.word 0x39bb9363 -//.word 0x9fd4a746 -//.word 0xd2e8a8cf -//.word 0xd831f6a7 -//.word 0x444bd0e5 -//.word 0x6695258d -//.word 0xbfdaa656 -//.word 0xb73120b1 -//.word 0x93210906 -//.word 0xa1095941 -//.word 0xb5bf9b8d -//.word 0xd978435f -//.word 0x41e842b7 -//.word 0x7daad8a3 -//.word 0xf2e1a904 -//.word 0x8b201494 -//.word 0xac87c028 -//.word 0x682f7733 -//.word 0xf3c9388c -//.word 0x5a818771 -//.word 0x712908cb -//.word 0x0d934cb3 -//.word 0x743eeb36 -//.word 0x1235d355 -//.word 0x6e35df50 -//.word 0x5c0eac25 -//.word 0x734ba853 -//.word 0xc1156be3 -//.word 0xbe554ba9 -//.word 0x7f192ac8 -//.word 0x2c399374 -//.word 0xb43a06fc -//.word 0xbf728f07 -//.word 0xe56d9d1d -//.word 0x1d90126a -//.word 0x78fc97bf -//.word 0x0fb632da -//.word 0x39041ae7 -//.word 0x021aca47 -//.word 0xd9f5548f -//.word 0x8988f8d4 -//.word 0x6b16f526 -//.word 0xd9df9f5a -//.word 0xe5feb20d -//.word 0x4b92e6e5 -//.word 0xa51cc31a -//.word 0xde28b735 -//.word 0xe9306618 -//.word 0xb3bd413f -//.word 0x56cf5a45 -//.word 0x8f7f76aa -//.word 0x72e364d3 -//.word 0x5c328e52 -//.word 0x2a28ce68 -//.word 0xa8ac83c8 -//.word 0x4cb1e39e -//.word 0x255a93d0 -//.word 0x0e617584 -//.word 0x27b9c1e2 -//.word 0x8672571b -//.word 0x29de53aa -//.word 0x2ff2e2da -//.word 0x48ee5588 -//.word 0x6b41742a -//.word 0xc7a61510 -//.word 0xfb94edea -//.word 0x89d5a58b -//.word 0x887430ec -//.word 0x9add5d74 -//.word 0x1e40a876 -//.word 0xa73656fc -//.word 0xaca7c1c3 -//.word 0x81ebf086 -//.word 0x852f6a7f -//.word 0x9e1b4c2c -//.word 0xe2b29a4f -//.word 0x9779d338 -//.word 0x5edbc846 -//.word 0xabccadac -//.word 0x78ad7171 -//.word 0x3b6f4bbb -//.word 0x15fc964c -//.word 0x4cd2de4d -//.word 0xfbf13b4a -//.word 0x08f8dd7f -//.word 0x578be952 -//.word 0x3df78420 -//.word 0x38192c3c -//.word 0xdd7c4f35 -//.word 0x11c11658 -//.word 0x7c448276 -//.word 0x3bfcbbe8 -//.word 0xd5a3a5cf -//.word 0x7117b3a0 -//.word 0x460100e1 -//.word 0x52b49c2d -//.word 0x4f58237e -//.word 0xe34795ac -//.word 0x17b76130 -//.word 0x0a9ac32e -//.word 0xe7c250b3 -//.word 0x1449d03b -//.word 0xac304b76 -//.word 0x3046674b -//.word 0x794bf11e -//.word 0xf156b94e -//.word 0x0374a302 -//.word 0xd092fb26 -//.word 0x249d09b0 -//.word 0xa8e7e528 -//.word 0x59cd8d67 -//.word 0x3897359f -//.word 0x439fde9b -//.word 0xa5b62a48 -//.word 0x2ac36f75 -//.word 0xf5ad0ad7 -//.word 0x757bf650 -//.word 0x95ba9d70 -//.word 0x331fed3d -//.word 0xd46eaf2f -//.word 0x969a147f -//.word 0x662e91a2 -//.word 0x72ebed10 -//.word 0xe1b39949 -//.word 0xc2a63f1a -//.word 0x438a9d1c -//.word 0x2470947f -//.word 0x6b947c05 -//.word 0x5886bb51 -//.word 0x9b879662 -//.word 0xc536475b -//.word 0xfd6c4f85 -//.word 0xf4640d96 -//.word 0x1b1f9034 -//.word 0x1306aab5 -//.word 0x64d24529 -//.word 0x73a9fa9a -//.word 0xae89e092 -//.word 0x0aeaa2de -//.word 0xaf9fd592 -//.word 0xf1fe884d -//.word 0x83401cbe -//.word 0xe72b5667 -//.word 0x29eeb2a1 -//.word 0xcd4cfae1 -//.word 0x06fc1839 -//.word 0x29502922 -//.word 0x6016d278 -//.word 0xa3bcd7c6 -//.word 0xe4b7e9c4 -//.word 0x8a24c01e -//.word 0x21b06a77 -//.word 0x50b6e3ae -//.word 0x0ba8e560 -//.word 0x09b001ae -//.word 0x7997ef40 -//.word 0xf1e52389 -//.word 0xa74aa04d -//.word 0xe33c1161 -//.word 0xb4e216b3 -//.word 0xe331dc8a -//.word 0x2555f00e -//.word 0x9452550a -//.word 0x60ebd4f1 -//.word 0xc2c3931f -//.word 0x32c2e962 -//.word 0xdaba71b9 -//.word 0x4a4a5d5b -//.word 0x6d030dfb -//.word 0xbccae14b -//.word 0xb17d4bbf -//.word 0x7fda2893 -//.word 0x009c500f -//.word 0xefe66b0a -//.word 0x57e507ad -//.word 0x4bb2e879 -//.word 0xd8759f8b -//.word 0x38d05f1f -//.word 0x487b0b54 -//.word 0x3d2b932f -//.word 0x92b981e1 -//.word 0x4480cf4d -//.word 0x4207fcc5 -//.word 0x1fe05f14 -//.word 0x0bcfbac2 -//.word 0x012f1293 -//.word 0x4292be51 -//.word 0x01a8bfcb -//.word 0x60624f1e -//.word 0x9b56bc33 -//.word 0x83667789 -//.word 0x2f9c6835 -//.word 0xee598527 -//.word 0x7fafa3ae -//.word 0x850b8c3f -//.word 0x35175172 -//.word 0x52dee24d -//.word 0x5b32dbc5 -//.word 0x034aa182 -//.word 0xe1b0aee3 -//.word 0x695b2942 -//.word 0x1b17ba79 -//.word 0xfa2e9ca4 -//.word 0x4041f429 -//.word 0x507761f6 -//.word 0xecdad40a -//.word 0xa8fda237 -//.word 0x9ee2d726 -//.word 0x641cce9b -//.word 0x3b31fefa -//.word 0x8942170b -//.word 0x8aee4efa -//.word 0x4273f4a2 -//.word 0xb6164e0a -//.word 0x5bc6a130 -//.word 0xcffc8c06 -//.word 0xc7e59abb -//.word 0x49c3183b -//.word 0x1b9124f9 -//.word 0x7be507ec -//.word 0x101bc5d7 -//.word 0x21b0f2ce -//.word 0x05ecc6f6 -//.word 0xdac4748c -//.word 0x7afeb829 -//.word 0xab96af44 -//.word 0x9661ecf8 -//.word 0x7bf0c807 -//.word 0xa2b7f920 -//.word 0x956e675d -//.word 0x8cb83b10 -//.word 0x290338bf -//.word 0x65af4e6d -//.word 0xcb726c1b -//.word 0xe4fb978f -//.word 0xf2d53954 -//.word 0xe08fbb02 -//.word 0x7a1a55c0 -//.word 0xda722506 -//.word 0x22807fa8 -//.word 0x71408510 -//.word 0x0f1ff7ca -//.word 0xeba74c47 -//.word 0x485d01da -//.word 0xb3ea3107 -//.word 0x387a66fd -//.word 0xd562af61 -//.word 0x2f05f24d -//.word 0x84f88499 -//.word 0xe164f759 -//.word 0x95ac33a6 -//.word 0xe550c8a2 -//.word 0x011283b6 -//.word 0x3757401e -//.word 0x67cffea8 -//.word 0xb75839b8 -//.word 0x87207490 -//.word 0xa80a15ce -//.word 0xc8547536 -//.word 0x317638b2 -//.word 0xb44dda97 -//.word 0xdf788b2a -//.word 0x77033d63 -//.word 0x2242fbf1 -//.word 0x63007c7d -//.word 0xcbdaf833 -//.word 0x6ee53a7f -//.word 0x9597f714 -//.word 0xb2e45e33 -//.word 0x99a7f02a -//.word 0xec44921b -//.word 0xd78be0fe -//.word 0xfee0c5e9 -//.word 0xb499488f -//.word 0x6ea8a908 -//.word 0x777aadd0 -//.word 0xe51f3611 -//.word 0xcbaa1625 -//.word 0xb0db2556 -//.word 0x40fb92e9 -//.word 0x4208765c -//.word 0xca12afeb -//.word 0xb0e5eb59 -//.word 0x40e803ec -//.word 0x33458bba -//.word 0xdf4aa723 -//.word 0xaa101f9f -//.word 0xc45ab6ba -//.word 0x16bfb85c -//.word 0x750cd34e -//.word 0x1ce427fa -//.word 0x59a9a072 -//.word 0x86a084b4 -//.word 0x3b4f482d -//.word 0xc22aa87b -//.word 0xcb6ff777 -//.word 0x614fb373 -//.word 0x1d4e5cc0 -//.word 0x9aec8674 -//.word 0x28852e69 -//.word 0xc5764a89 -//.word 0x4981a349 -//.word 0xe073e774 -//.word 0xbd03fa2a -//.word 0x0dfe8e28 -//.word 0x2aa1f34a -//.word 0x1246304d -//.word 0x174452da -//.word 0xd81004c0 -//.word 0x6fa86082 -//.word 0xec310511 -//.word 0x03de6ada -//.word 0x01157203 -//.word 0x04cd40f2 -//.word 0x6c3b4c10 -//.word 0x8dadb6cc -//.word 0xa6b6dbe2 -//.word 0x178b27dd -//.word 0xcead2ada -//.word 0x03c8ed90 -//.word 0x25db868d -//.word 0x149aeac2 -//.word 0x90110342 -//.word 0xf2890247 -//.word 0x19aff776 -//.word 0xa8f39e64 -//.word 0x6f2f7c58 -//.word 0x26892b53 -//.word 0x619af34d -//.word 0xc0d09ac2 -//.word 0x66107c6d -//.word 0xada0de54 -//.word 0x18457f04 -//.word 0x8aa8701e -//.word 0xb5fe2612 -//.word 0xd4e8ce2b -//.word 0x9d98e0cc -//.word 0x7136f7f9 -//.word 0xd782e018 -//.word 0x28baf0f9 -//.word 0x8cbe9b15 -//.word 0x24724313 -//.word 0x89644e91 -//.word 0x76af7b20 -//.word 0xc11f7690 -//.word 0x9095aa6f -//.word 0xc9ad56cc -//.word 0xca9fe340 -//.word 0x5b637530 -//.word 0xe019c04c -//.word 0xd4a71d5b -//.word 0x72a4dc3b -//.word 0xb575dc23 -//.word 0x83b55a2c -//.word 0x25db0710 -//.word 0xfb165d31 -//.word 0x6e7c32dd -//.word 0x25648ed0 -//.word 0x7c10bafa -//.word 0x32909983 -//.word 0x61e23b0d -//.word 0xb45eb039 -//.word 0xd4521a6c -//.word 0x23e906d3 -//.word 0xad51fda4 -//.word 0x5c1c55a7 -//.word 0x6be74df6 -//.word 0x1c3a5a01 -//.word 0xaeb0bbd4 -//.word 0x8958539d -//.word 0xbd5ab868 -//.word 0xaade882e -//.word 0x0029fc0e -//.word 0xeb09bfda -//.word 0x877400d5 -//.word 0x9a6cc6bb -//.word 0x82258302 -//.word 0x6c6aed60 -//.word 0xc73d098d -//.word 0xf9be884a -//.word 0x504e57a2 -//.word 0x3bf37270 -//.word 0xbafef921 -//.word 0x13ec85bb -//.word 0xc78bbc1e -//.word 0xc45e238b -//.word 0xdc413462 -//.word 0x7650b130 -//.word 0x830637e8 -//.word 0xb4a21671 -//.word 0xeacf6061 -//.word 0xef834009 -//.word 0x63288db1 -//.word 0xf9fa9f24 -//.word 0xe3b06270 -//.word 0x8a5ea8e7 -//.word 0x839ac469 -//.word 0xbede54e6 -//.word 0x012d5e1e -//.word 0x95f99fab -//.word 0x40451f42 -//.word 0x73070936 -//.word 0xc3d0ba3d -//.word 0x9dae1877 -//.word 0x365225ac -//.word 0xc26ed4d6 -//.word 0xe6611bdf -//.word 0x6f1649ab -//.word 0x44299a59 -//.word 0x994c08c6 -//.word 0x66ea6553 -//.word 0x180aa7e9 -//.word 0x8675833a -//.word 0x261b3d49 -//.word 0x81b3be2c -//.word 0xe4a2e710 -//.word 0x591e257f -//.word 0xd59345de -//.word 0xb3458a3a -//.word 0x6138fd44 -//.word 0x5a4d0599 -//.word 0x54ad3747 -//.word 0xba6a6f8d -//.word 0x5c6420e3 -//.word 0x666ae83a -//.word 0x8ea26885 -//.word 0x922b5278 -//.word 0xe200c390 -//.word 0x9920d453 -//.word 0xb2ec6cd9 -//.word 0x79d0588b -//.word 0x3f259d2b -//.word 0x52560c15 -//.word 0x2d4218c4 -//.word 0xebe2e597 -//.word 0x022ca1d5 -//.word 0x2d3717f0 -//.word 0xaa9f8106 -//.word 0xa62b9ead -//.word 0xf6ad05f0 -//.word 0x072ab995 -//.word 0x183bfda2 -//.word 0xa6b36a1f -//.word 0x28823e1c -//.word 0xfddaf7f6 -//.word 0xa39021d7 -//.word 0x29c46c7c -//.word 0xe7c4013b -//.word 0x6c2e1644 -//.word 0xb855c027 -//.word 0xace60996 -//.word 0xbecc436c -//.word 0xf1509cef -//.word 0x0585f252 -//.word 0xeae3e87f -//.word 0x7b323913 -//.word 0x69aa4ca9 -//.word 0x7558095b -//.word 0xe3c3ec86 -//.word 0x2bd057ce -//.word 0xf1e32d62 -//.word 0x37479c81 -//.word 0xd2d03a3e -//.word 0x1abe5480 -//.word 0xe6e5824c -//.word 0xb80b7f47 -//.word 0x34923876 -//.word 0xd7572349 -//.word 0xe5d9d2d8 -//.word 0xa39ec86c -//.word 0xc7d28b41 -//.word 0x2d32fb8a -//.word 0xcb28e1b6 -//.word 0xe737cbf2 -//.word 0x879a18ef -//.word 0x2a284fe5 -//.word 0xb57bb5d8 -//.word 0xb0511e1a -//.word 0xb2320311 -//.word 0x1a54d53a -//.word 0x00bb916e -//.word 0x6ca49564 -//.word 0xc524b278 -//.word 0x8c0d82aa -//.word 0x4a11fbea -//.word 0xc62a4593 -//.word 0x7c39c935 -//.word 0x4bed8b97 -//.word 0x6ee6b9fc -//.word 0xad1a84a6 -//.word 0xd4782e99 -//.word 0x65cc64a1 -//.word 0x8ae3cf96 -//.word 0x4defe6df -//.word 0x0b2c0635 -//.word 0x26c4c4a9 -//.word 0xfbf182e9 -//.word 0x146140bf -//.word 0x9edeb5da -//.word 0x1d2e9ed1 -//.word 0x5e385765 -//.word 0xad69a807 -//.word 0x4956e19a -//.word 0x15a32979 -//.word 0x902313bc -//.word 0x074072b7 -//.word 0x0a9e6fc4 -//.word 0x1cfbd843 -//.word 0xae5abbde -//.word 0x4f603412 -//.word 0x1dfe83ea -//.word 0x7f50610e -//.word 0x16c595fd -//.word 0xf081c297 -//.word 0xffff83de -//.word 0xcafbb9fd -//.word 0x638f248a -//.word 0x999c3108 -//.word 0x6e6b13b0 -//.word 0xcc941571 -//.word 0x731f2f35 -//.word 0x36ead766 -//.word 0x674a19b0 -//.word 0x90f5ea09 -//.word 0x6320baef -//.word 0xf4e448f1 -//.word 0x26e6ba71 -//.word 0x6337eda8 -//.word 0x91790aeb -//.word 0x41445a2c -//.word 0x29c85bc3 -//.word 0xd4b3136f -//.word 0x9855a497 -//.word 0xc90121d6 -//.word 0x2cb7a0b7 -//.word 0xae0190bd -//.word 0x561b4da7 -//.word 0x7956f2f1 -//.word 0x2dbe6f9e -//.word 0xfffbdb35 -//.word 0xe9750b0a -//.word 0x7ebc63be -//.word 0x6826ec09 -//.word 0x14baa7b7 -//.word 0xac4c21f1 -//.word 0x46ea48be -//.word 0x5b777dca -//.word 0x7a96ea65 -//.word 0x3dca16ce -//.word 0x7ddbb6b2 -//.word 0xc27bc7f0 -//.word 0xfd29d99f -//.word 0x7a56ae52 -//.word 0x10c6039a -//.word 0x9b3aaecd -//.word 0xac4ce906 -//.word 0x7e9aee6d -//.word 0x2c26c4b9 -//.word 0x22fd58f3 -//.word 0xd117cf7c -//.word 0xa87f1b51 -//.word 0x3fb3cc8e -//.word 0xd54e2931 -//.word 0xfce48021 -//.word 0x932eba6f -//.word 0xf56732db -//.word 0x70f5c89a -//.word 0xf94c3156 -//.word 0x1d109177 -//.word 0x3b794ba1 -//.word 0xf1fc177d -//.word 0xd42856bd -//.word 0x64cea35a -//.word 0x3f64ab20 -//.word 0x94ab3e6d -//.word 0xdb90a636 -//.word 0xc350374a -//.word 0x6ce027db -//.word 0xd78ca03a -//.word 0x9bde14e2 -//.word 0xd9c1d1b8 -//.word 0x71e6d591 -//.word 0x7667e3f5 -//.word 0xe0abd623 -//.word 0x81893654 -//.word 0x3bb00944 -//.word 0x6f46ebef -//.word 0xb8cf6198 -//.word 0xda516b10 -//.word 0xf5b55835 -//.word 0xff71deb9 -//.word 0x70646a25 -//.word 0x3f01b51d -//.word 0x0eb098e5 -//.word 0xa2712124 -//.word 0x95c3e6e8 -//.word 0x4fc499eb -//.word 0x3299dd15 -//.word 0x15105841 -//.word 0xf4840a44 -//.word 0xe502dd2b -//.word 0x4ea97dc5 -//.word 0x56576962 -//.word 0x99824bd9 -//.word 0x206385d0 -//.word 0x905a0c37 -//.word 0xa18e7916 -//.word 0xd2d45d89 -//.word 0x5cd2d508 -//.word 0x64645fec -//.word 0x743eec2f -//.word 0x2cd33774 -//.word 0x35765447 -//.word 0x77bf8ca5 -//.word 0x8c3168bf -//.word 0x74190cfb -//.word 0x8ab9c63c -//.word 0xb6a6e763 -//.word 0xe56fd216 -//.word 0xb67f52c0 -//.word 0x764531d8 -//.word 0x4f920667 -//.word 0xbc424ec4 -//.word 0x401ebea2 -//.word 0x5801d84d -//.word 0xae3abd31 -//.word 0x8f32429c -//.word 0x9f4f45c5 -//.word 0xcc17420c -//.word 0x80992183 -//.word 0x1b0852ae -//.word 0xa0aa1c87 -//.word 0xaef032c5 -//.word 0xb3e7885e -//.word 0x5ccf644b -//.word 0x5008b88b -//.word 0x1d36af6a -//.word 0x729d8603 -//.word 0x90cd9d04 -//.word 0xfb84ceb1 -//.word 0x75d0fd2c -//.word 0x2c74f0f3 -//.word 0x338d61aa -//.word 0x2f75521b -//.word 0x53e8a17b -//.word 0x8e65dcee -//.word 0x02d7564e -//.word 0xb9757b28 -//.word 0x93e76008 -//.word 0x83aa9ff7 -//.word 0xfbb56141 -//.word 0xa55dbc7c -//.word 0x547640c5 -//.word 0x3abbcc4d -//.word 0x5b70a615 -//.word 0x4145cbf5 -//.word 0xf27e84e3 -//.word 0x1f513a72 -//.word 0x9e8f8b99 -//.word 0x1b879eb6 -//.word 0x0a28b3d2 -//.word 0xdf65fe27 -//.word 0x82deb5df -//.word 0xfdbc681f -//.word 0x78dc9144 -//.word 0x68316c6d -//.word 0x03630839 -//.word 0xf7bc9ed2 -//.word 0x5b45232a -//.word 0xe62c1984 -//.word 0x5f69aa37 -//.word 0x54a1f7ae -//.word 0x0f4baeb4 -//.word 0xc611daee -//.word 0x127900a9 -//.word 0xa2c467d7 -//.word 0x3117b753 -//.word 0xb5d8c66d -//.word 0xda5baea2 -//.word 0xaebe23ab -//.word 0x9e1103ba -//.word 0xa1ba2f00 -//.word 0xb3189a72 -//.word 0x85679fcd -//.word 0x73e498d7 -//.word 0xb631ace8 -//.word 0xdbfae8aa -//.word 0x73d9911d -//.word 0x0d77b9de -//.word 0x61f511a8 -//.word 0xce8afe1b -//.word 0x076defbc -//.word 0x09f5ed3e -//.word 0x50fe7400 -//.word 0x4a9081d6 -//.word 0x0cbbec0c -//.word 0x44c5f8a8 -//.word 0x6e8829f0 -//.word 0x4b15552c -//.word 0x8f9dfead -//.word 0xda92df0e -//.word 0xea09c5ba -//.word 0x0f63a0ae -//.word 0xdf2cda81 -//.word 0x2a43e7a1 -//.word 0x313b1edf -//.word 0x1202c72e -//.word 0x87c075a7 -//.word 0xd00296d1 -//.word 0xee184820 -//.word 0x12bb6ebb -//.word 0x55f40382 -//.word 0xa939af50 -//.word 0x10d8987d -//.word 0x0c997ba8 -//.word 0x569efbb3 -//.word 0xd28f390e -//.word 0xc3f4a439 -//.word 0x3ce21384 -//.word 0xd7da111a -//.word 0xa8ee773d -//.word 0x742541d3 -//.word 0x1f219a22 -//.word 0x64ff39d8 -//.word 0xc97ff04e -//.word 0xd165820d -//.word 0x731fb692 -//.word 0xcba7a94e -//.word 0x10ab68f1 -//.word 0xc6ecbee8 -//.word 0x34e44b24 -//.word 0x19abd61e -//.word 0x9b1be518 -//.word 0x80338aa5 -//.word 0xa0b97f6b -//.word 0x9a237528 -//.word 0xc7b8aaf3 -//.word 0x6cf3bac5 -//.word 0x3428b737 -//.word 0xdd697b8d -//.word 0x31ab3df4 -//.word 0x38256308 -//.word 0xacf99799 -//.word 0xad161daf -//.word 0xb65d64cb -//.word 0xd003db70 -//.word 0x053605e2 -//.word 0x1803d02e -//.word 0x7377236a -//.word 0x6104b63e -//.word 0x7d2726a4 -//.word 0x6b4849eb -//.word 0xc5e2bf02 -//.word 0x58e3c9f3 -//.word 0x91565eae -//.word 0x323f7c08 -//.word 0x49c6bd03 -//.word 0x63982a50 -//.word 0xfd8b5312 -//.word 0x3b81a0e5 -//.word 0xdd8ee21f -//.word 0x6e5d2d56 -//.word 0xbecfea22 -//.word 0x93e62823 -//.word 0x9ce23346 -//.word 0xa6a96845 -//.word 0x126c476d -//.word 0x8788caa4 -//.word 0xe4aaf5aa -//.word 0x7937af9f -//.word 0x76ebd0c6 -//.word 0xa3c07b88 -//.word 0x5211aebc -//.word 0x93ff1725 -//.word 0xa6142a3c -//.word 0xb6267030 -//.word 0xc47e222c -//.word 0xe13af6d8 -//.word 0xa0f03922 -//.word 0xcb941e3e -//.word 0x559c56eb -//.word 0x9061e0f9 -//.word 0xa0c92308 -//.word 0x30233a92 -//.word 0x63528f2c -//.word 0x0d2eab08 -//.word 0x24274cbf -//.word 0x712cb84d -//.word 0x8bcb525d -//.word 0x06996bc8 -//.word 0xe8d45a58 -//.word 0x5c47cfd1 -//.word 0xab6e6432 -//.word 0x67db7538 -//.word 0xead83224 -//.word 0xff4ef2be -//.word 0xdee5cb9a -//.word 0x5e6d5f9a -//.word 0x667df8b4 -//.word 0xa459d8f5 -//.word 0x8219cac6 -//.word 0x5608fd6f -//.word 0xd94b12d9 -//.word 0xdbc37498 -//.word 0x3534e828 -//.word 0xfea66577 -//.word 0x020b25a4 -//.word 0x6f23fc07 -//.word 0xd29de971 -//.word 0x427febb5 -//.word 0xdbc71567 -//.word 0x6f52e5e3 -//.word 0x77fed291 -//.word 0x500c2468 -//.word 0xa4c808b1 -//.word 0x266be40e -//.word 0x8240e8ba -//.word 0x9306e612 -//.word 0xd7966355 -//.word 0x21c5eea8 -//.word 0x8e8cb05d -//.word 0xba664574 -//.word 0x34faca62 -//.word 0x2ffa3712 -//.word 0x7a4bef2a -//.word 0xb266968f -//.word 0xb6fe232b -//.word 0x5be336ee -//.word 0x6126ab12 -//.word 0xa67e6fa4 -//.word 0x9aea9240 -//.word 0xf3989e1c -//.word 0xa2062847 -//.word 0x0567a433 -//.word 0x5e487e72 -//.word 0x847366bd -//.word 0xd813eb3a -//.word 0x7b1a4bff -//.word 0xbee089d2 -//.word 0xda0cc132 -//.word 0xe2b8b99c -//.word 0xf5d0b807 -//.word 0xb8bb9bb1 -//.word 0x033e251d -//.word 0xdb9d975c -//.word 0xa103808d -//.word 0x8823d7a0 -//.word 0x4d20475f -//.word 0x22aacaae -//.word 0xeb6b7911 -//.word 0xaca1a370 -//.word 0x420c1c17 -//.word 0x520ad701 -//.word 0x8001b756 -//.word 0xe1fda332 -//.word 0xb29ad9a8 -//.word 0x4a258407 -//.word 0x4dfe905b -//.word 0x2340bd37 -//.word 0xa8a4f2b2 -//.word 0x25a3d5b0 -//.word 0x80db9863 -//.word 0xafb41511 -//.word 0x72431e17 -//.word 0x426f0e2e -//.word 0x8452a4ed -//.word 0x03e2128f -//.word 0x9dd050f7 -//.word 0x3db0b6f1 -//.word 0x095bcabb -//.word 0xdc9157c4 -//.word 0xf6e3bfb3 -//.word 0xf2d091ab -//.word 0xf92f5ecd -//.word 0x36cdc9ff -//.word 0x8956deec -//.word 0x8079a54c -//.word 0x8347f666 -//.word 0x4edc8ed3 -//.word 0xa5426384 -//.word 0x42923507 -//.word 0x135c6605 -//.word 0xa2490b10 -//.word 0xd5ff439b -//.word 0xd745c84a -//.word 0x5668c36d -//.word 0xefdde5c7 -//.word 0xe627b393 -//.word 0x1bfc21c9 -//.word 0x39a3639d -//.word 0x31a00048 -//.word 0xe793280c -//.word 0x2a5e4772 -//.word 0xea86dad7 -//.word 0xa5dc8226 -//.word 0x235c56e7 -//.word 0x63557e79 -//.word 0xd5cafe9b -//.word 0xca18cf32 -//.word 0x28da3446 -//.word 0x620a4b4d -//.word 0xa769e2ac -//.word 0x5a208d7b -//.word 0xc3a7f588 -//.word 0x04e6739f -//.word 0x4e9ade09 -//.word 0x54fba153 -//.word 0x009c1051 -//.word 0x6592fc61 -//.word 0xf6d884f4 -//.word 0xf5f22f4b -//.word 0x2ed1387f -//.word 0xe4f729c4 -//.word 0x0cdbabee -//.word 0xb98f9d35 -//.word 0xd8a06335 -//.word 0x1d3e8139 -//.word 0x3d9c68b8 -//.word 0x5e9a8f20 -//.word 0xcba2c6d3 -//.word 0xedcfc86f -//.word 0x77550f53 -//.word 0xe01dec5f -//.word 0x16afd6fa -//.word 0x7155035a -//.word 0xe57d3500 -//.word 0x7d60d781 -//.word 0x04e1488c -//.word 0x05b87729 -//.word 0xf7cfb03f -//.word 0xb1ecb559 -//.word 0x249111a9 -//.word 0x4821a94e -//.word 0x574394d2 -//.word 0x3a8b2cf7 -//.word 0x405865b3 -//.word 0x16f85e79 -//.word 0xf41336ba -//.word 0x144621ac -//.word 0x680ebb4a -//.word 0x8ce89c9c -//.word 0xfab62c38 -//.word 0x7d65b809 -//.word 0xe8cdc64f -//.word 0x07d8a6e7 -//.word 0xd6e74acd -//.word 0xf17158df -//.word 0x4ced7ce3 -//.word 0x24f303cc -//.word 0x359ea639 -//.word 0x2e34a33f -//.word 0x62091368 -//.word 0xc0a077fb -//.word 0x0514947e -//.word 0x30b6817a -//.word 0x36f8fe7e -//.word 0xf88a0766 -//.word 0x72c2a9dd -//.word 0x35411521 -//.word 0x17d4f307 -//.word 0x2998f83e -//.word 0xe962bbd7 -//.word 0xb95dc405 -//.word 0x90f5e622 -//.word 0xf0f4d0f3 -//.word 0x18ebde2d -//.word 0x7ad43538 -//.word 0x6ff50e32 -//.word 0x2a085237 -//.word 0xea9868e0 -//.word 0x74ae4a09 -//.word 0xc1addfd8 -//.word 0xf47b85fb -//.word 0x8fe1ec30 -//.word 0xe5352b0b -//.word 0xd3360df4 -//.word 0xab37ac6f -//.word 0x718042a0 -//.word 0x4af13b0e -//.word 0x31e88fa7 -//.word 0xec654e04 -//.word 0x3e6c7def -//.word 0x5fab2022 -//.word 0xa95d9852 -//.word 0x946e2f6c -//.word 0xe4e0f21f -//.word 0x216dbf9a -//.word 0x486e9e97 -//.word 0xc0fb5498 -//.word 0x8f543670 -//.word 0xce7f3c06 -//.word 0x5a335656 -//.word 0xcdf503b8 -//.word 0xad811f65 -//.word 0xe36bfc37 -//.word 0x6e06b5b0 -//.word 0x5885bf3e -//.word 0xe960c1bd -//.word 0x1cfaa63e -//.word 0x4f80f007 -//.word 0x3e144fdb -//.word 0x322b727b -//.word 0x76331d6c -//.word 0x0b7a7cfb -//.word 0x9c4bb77f -//.word 0xb45ac6de -//.word 0x2f618752 -//.word 0xef0c0d6d -//.word 0xd0133b5b -//.word 0xdda59268 -//.word 0xc40d48c1 -//.word 0x87909a7f -//.word 0x759463e1 -//.word 0x5908ecd9 -//.word 0xf1ff06cb -//.word 0xa19e5691 -//.word 0x6939f1c2 -//.word 0x15b92934 -//.word 0xb341a6bf -//.word 0x4a11b844 -//.word 0xc9aaebee -//.word 0x3e32dcb8 -//.word 0x481b4c30 -//.word 0xcf00737a -//.word 0xf2cf9697 -//.word 0x412ddce8 -//.word 0x2d165eed -//.word 0xbcc47d53 -//.word 0x82d3782e -//.word 0xcca23e83 -//.word 0x1efc8009 -//.word 0xe0f80b30 -//.word 0x541d5563 -//.word 0xcbca558a -//.word 0x19d598d4 -//.word 0x467392b3 -//.word 0x86583228 -//.word 0x6b1fb940 -//.word 0x5aebcbdf -//.word 0x3c4fc6bc -//.word 0x756b54ad -//.word 0x1a583c25 -//.word 0x5ec77efa -//.word 0x4ee49e6c -//.word 0xbf814064 -//.word 0x8470f5f9 -//.word 0xe4305538 -//.word 0x4bcd4e25 -//.word 0x3f01bbfd -//.word 0x969f38be -//.word 0xe63135e9 -//.word 0x3ee04a87 -//.word 0x1395ca6a -//.word 0x7d5e9bb5 -//.word 0xa413459f -//.word 0x74394873 -//.word 0x9926b3db -//.word 0xa766f25f -//.word 0x985ee829 -//.word 0x7c2f3e0b -//.word 0x6cdefac3 -//.word 0xc0b1537d -//.word 0x82dcc399 -//.word 0x225c5faf -//.word 0x6a2464d0 -//.word 0xb577120f -//.word 0x5c95bd40 -//.word 0x72992100 -//.word 0xb1a2f6f6 -//.word 0xb331c458 -//.word 0x66d2f9b0 -//.word 0xbaff39e0 -//.word 0x9c41f563 -//.word 0x28983fd7 -//.word 0x1a1ddcb8 -//.word 0x86e69b6f -//.word 0xca2ae68b -//.word 0xc0a5974e -//.word 0x383e0d6b -//.word 0xa5e87e0e -//.word 0x16c68e1d -//.word 0x689221bd -//.word 0xba3f6e19 -//.word 0x22dd565f -//.word 0x9ebef30a -//.word 0x4ed77367 -//.word 0xe0682752 -//.word 0x4be0d741 -//.word 0xc0fb5985 -//.word 0xdd2d61cc -//.word 0x25439be9 -//.word 0xad48f7d8 -//.word 0x17a545fc -//.word 0xc48d01ac -//.word 0x469870ee -//.word 0x14aeec82 -//.word 0x82277b23 -//.word 0xf030a709 -//.word 0x41718ab2 -//.word 0x8fed29e2 -//.word 0x1c2903e9 -//.word 0x8c90e924 -//.word 0x52160fc6 -//.word 0x691c64d8 -//.word 0x44931f7f -//.word 0x07659a7e -//.word 0xf71064fb -//.word 0x2f949286 -//.word 0x96905557 -//.word 0x0da8d2d7 -//.word 0xed292d63 -//.word 0xb0f0e74c -//.word 0xee886b22 -//.word 0x8c92e332 -//.word 0x306a504d -//.word 0xf707dacb -//.word 0x6b2364d0 -//.word 0xaf9c64ce -//.word 0xfd1bf24b -//.word 0x53f31fe5 -//.word 0x684c8793 -//.word 0xe5802a2d -//.word 0xd2c5772f -//.word 0x4e0daaba -//.word 0x842a58db -//.word 0xda364810 -//.word 0x6b328508 -//.word 0xb8edb1ab -//.word 0x9a279c5a -//.word 0x7cf71678 -//.word 0xc66a0129 -//.word 0x9c6daa59 -//.word 0xc9ed5901 -//.word 0xf63c26a5 -//.word 0x20b70f22 -//.word 0x49a648a6 -//.word 0x6d63d200 -//.word 0xb7bf4f1a -//.word 0xf5a115c3 -//.word 0x4af081b2 -//.word 0x22b38dc8 -//.word 0x6b77a596 -//.word 0x03f1b71f -//.word 0x6ce58adf -//.word 0xc747500c -//.word 0x009f7e1b -//.word 0x46b2db86 -//.word 0xbe5ed7cd -//.word 0x78c61fbb -//.word 0xa2af6eea -//.word 0xfb2aa689 -//.word 0x8b741f5d -//.word 0x921a3f06 -//.word 0xbe604b84 -//.word 0xa0e47cf9 -//.word 0x617f56b0 -//.word 0xb16c355f -//.word 0x01ac29a9 -//.word 0xf2a803e7 -//.word 0x0d19b028 -//.word 0xb425c676 -//.word 0x58ca5d5c -//.word 0xed8020a5 -//.word 0x9b1aa465 -//.word 0xb7eef83e -//.word 0xf1357ddc -//.word 0xcfb5f7c2 -//.word 0x5a9de549 -//.word 0x17b00ee5 -//.word 0x38a55dab -//.word 0x14ceee10 -//.word 0xd5f969f4 -//.word 0x70948fdf -//.word 0xdb14128a -//.word 0x7a97aaa1 -//.word 0xdac765c7 -//.word 0xa1023fdb -//.word 0xc5b9f279 -//.word 0xfd160fc4 -//.word 0x75e24e63 -//.word 0xc6a522ca -//.word 0x250f91bb -//.word 0xda96430c -//.word 0xf561d9aa -//.word 0x3c6580de -//.word 0x67cec5cf -//.word 0x90a0ab49 -//.word 0xe59efabc -//.word 0xa06bdb88 -//.word 0x39efa277 -//.word 0xd9fceb8b -//.word 0x1331e8fb -//.word 0xcf1ff978 -//.word 0x86ab7db4 -//.word 0xb5b3e925 -//.word 0x8bf51707 -//.word 0xe52ce0a0 -//.word 0x7d7becc7 -//.word 0x5e0fc9a7 -//.word 0x9c013bc1 -//.word 0x4179d330 -//.word 0x8a19c331 -//.word 0x5499f1e2 -//.word 0xd1ae4a4a -//.word 0x7f31599a -//.word 0x5b7d18b2 -//.word 0x521906e7 -//.word 0xf8977904 -//.word 0x7cbb368e -//.word 0xdce03f4d -//.word 0x5598ec07 -//.word 0x1e933d8f -//.word 0x55c26fff -//.word 0x3abbcd41 -//.word 0x9b60c9d4 -//.word 0x8fbb4bcc -//.word 0x672d491b -//.word 0xe2c89810 -//.word 0xa0f9021d -//.word 0xd96a98dd -//.word 0x4f264955 -//.word 0x81ffb47b -//.word 0x222d3bf4 -//.word 0xc9375922 -//.word 0xea17355e -//.word 0x05997782 -//.word 0x1d045aab -//.word 0x6cfc023d -//.word 0x55a71127 -//.word 0x9a0f7568 -//.word 0xcfc783d2 -//.word 0x0fd24a0d -//.word 0xedc021e0 -//.word 0xad1a83ac -//.word 0xb5001d39 -//.word 0x3e1124b5 -//.word 0x4f8becfa -//.word 0xecb3b710 -//.word 0x8b78cbf3 -//.word 0xc753c796 -//.word 0x58713627 -//.word 0x43146595 -//.word 0x4e377250 -//.word 0xb771a650 -//.word 0x251b0458 -//.word 0xdfb5227c -//.word 0x3c8638e1 -//.word 0x5b8377c4 -//.word 0x13729cbd -//.word 0x2d4fc445 -//.word 0xd1ef8277 -//.word 0x3fe32f13 -//.word 0xc09f81c8 -//.word 0xdbdc5fb3 -//.word 0xcb3af423 -//.word 0x312a039f -//.word 0x070b7a2a -//.word 0xd59349c5 -//.word 0x27717436 -//.word 0x3e306708 -//.word 0x065f8bd3 -//.word 0x48ef16bd -//.word 0x21dc2741 -//.word 0xb310122f -//.word 0x1a84f8f4 -//.word 0xa1a89c1c -//.word 0x36057115 -//.word 0x1c20f836 -//.word 0xe0a248ff -//.word 0x8eb7eea3 -//.word 0x24b4f8c3 -//.word 0x47fc4d7d -//.word 0x352440a5 -//.word 0xfb556452 -//.word 0xe8f2a19d -//.word 0x417b87a5 -//.word 0x36b2e3d7 -//.word 0x15fc906c -//.word 0xbe099032 -//.word 0x57b75b90 -//.word 0x413477c4 -//.word 0x4a634970 -//.word 0x24822b55 -//.word 0x1609bf5e -//.word 0xf1d582e0 -//.word 0x4685a420 -//.word 0xd6251716 -//.word 0x4a0ae670 -//.word 0x24fcc8da -//.word 0xf69bf57d -//.word 0xd1fb38c5 -//.word 0x01924568 -//.word 0xf7544ea4 -//.word 0x871cd1c8 -//.word 0x544eb4f5 -//.word 0x88ba9326 -//.word 0xc8c4596e -//.word 0x67c20d81 -//.word 0xd9a6ef76 -//.word 0x6bddc4cb -//.word 0x32776eaa -//.word 0x4187bf6a -//.word 0x1fcd8f59 -//.word 0x79920cb9 -//.word 0x13d45208 -//.word 0x04a33c85 -//.word 0x23cb79ef -//.word 0xbdb3e290 -//.word 0x89850a7a -//.word 0xdd8f1711 -//.word 0x21ead1c9 -//.word 0x8559f931 -//.word 0xef73dc31 -//.word 0x3705288f -//.word 0x97b2fdb8 -//.word 0x5ddc47be -//.word 0xe3c84c9d -//.word 0xc1fc81c2 -//.word 0x41eca2ce -//.word 0x14d60197 -//.word 0x43eb1f6f -//.word 0x68af79aa -//.word 0x1da2a45a -//.word 0xb5209c5d -//.word 0x2a865a9a -//.word 0x5796a487 -//.word 0x671d29ef -//.word 0x8ed2cdf2 -//.word 0xf782424d -//.word 0xfd6ad8db -//.word 0x9de5965c -//.word 0x2b478976 -//.word 0x45085cf9 -//.word 0x06252967 -//.word 0x7bc38fb4 -//.word 0x5b15054a -//.word 0xf2816d50 -//.word 0x5ffeed2c -//.word 0xffc1fa46 -//.word 0x2918b50f -//.word 0x1c967b43 -//.word 0x3570b76b -//.word 0x6627fba5 -//.word 0xe36750a7 -//.word 0x1e30ca02 -//.word 0xf6335fa4 -//.word 0x2b7ff8a1 -//.word 0x165cc933 -//.word 0x9777deff -//.word 0x4e40f799 -//.word 0x0e91964b -//.word 0x8e905612 -//.word 0x62d67eea -//.word 0x2ad1d64b -//.word 0x0a66baf4 -//.word 0x5adb6ce7 -//.word 0x9ef5afb5 -//.word 0xb85d91fb -//.word 0x5c48882d -//.word 0xc557c092 -//.word 0xa6bcb490 -//.word 0x649ffc2a -//.word 0x82c065c7 -//.word 0x5d5d4735 -//.word 0x195613ed -//.word 0xdb8f2c99 -//.word 0x3896f8d3 -//.word 0xee863630 -//.word 0xd22b927d -//.word 0x0a667648 -//.word 0x7cd324a3 -//.word 0x86aa0224 -//.word 0xf0e33430 -//.word 0x1f9e7079 -//.word 0x8bc10ec6 -//.word 0x73e35ff3 -//.word 0xcf694038 -//.word 0x86eeefae -//.word 0xe1e91d0e -//.word 0x3f8944bc -//.word 0x0be43a05 -//.word 0xec5107a5 -//.word 0x3b12f48d -//.word 0xba37e4e3 -//.word 0x83bee749 -//.word 0x3eff0d62 -//.word 0x97487892 -//.word 0xf0c4b506 -//.word 0x52a14df5 -//.word 0xaa719625 -//.word 0x32d1cfb0 -//.word 0x2d496c08 -//.word 0xd774af39 -//.word 0x9c61786e -//.word 0x88385eb7 -//.word 0xff21fe09 -//.word 0xae619387 -//.word 0xc1c6c8ff -//.word 0x5646cab8 -//.word 0x32e3a06b -//.word 0xb3d2bf8f -//.word 0x06dbd9d9 -//.word 0x9a03f704 -//.word 0xd569c7ce -//.word 0x056e3743 -//.word 0x9918423d -//.word 0x91b90a2c -//.word 0x33cb2813 -//.word 0x001f40d3 -//.word 0xe637d8ac -//.word 0xb7f06a01 -//.word 0xda63b75b -//.word 0x410e5fb1 -//.word 0x9a2fafe7 -//.word 0xca71ba94 -//.word 0x97caab08 -//.word 0xa4a4598e -//.word 0xa33b1cee -//.word 0xc646e036 -//.word 0x76d977ba -//.word 0x488a345a -//.word 0x2dd3b503 -//.word 0xe9b70079 -//.word 0xc6a8d253 -//.word 0x89a93347 -//.word 0xa5b04ea7 -//.word 0xaf4e802c -//.word 0x1291aff3 -//.word 0x042addc5 -//.word 0xb8cbfc9b -//.word 0xd5d30461 -//.word 0x282d44fb -//.word 0x9575f586 -//.word 0x545d15e0 -//.word 0x5a50736a -//.word 0x1455060c -//.word 0x5b35827a -//.word 0xa5e02db6 -//.word 0x780defd7 -//.word 0x2521a908 -//.word 0xb252c8d3 -//.word 0x180c1aa0 -//.word 0xaf93e078 -//.word 0xe6eb240f -//.word 0x37f54d02 -//.word 0x5adaf05d -//.word 0xb9ace960 -//.word 0x254bab83 -//.word 0xc786d4b7 -//.word 0x598305ef -//.word 0x9661f0df -//.word 0xee1bb203 -//.word 0x7fb064e4 -//.word 0x4181ec97 -//.word 0x80fa1986 -//.word 0x9074f073 -//.word 0xbc5a40b9 -//.word 0x7f8b7dd5 -//.word 0xf700ca26 -//.word 0x96af58f1 -//.word 0x1bafefa8 -//.word 0xc09cca6c -//.word 0xb53da8d0 -//.word 0xce6420e0 -//.word 0x79163562 -//.word 0xf2ec2a5b -//.word 0xbab998d5 -//.word 0x456dbde0 -//.word 0xf23a17d7 -//.word 0x41f531e4 -//.word 0x41bebec6 -//.word 0x47e3e4d2 -//.word 0xe502da38 -//.word 0x1a6eb588 -//.word 0xc7d47f75 -//.word 0x621f8ad8 -//.word 0xee9803f8 -//.word 0x2b52ca08 -//.word 0x0ac581f1 -//.word 0x63b9e452 -//.word 0xea6658c5 -//.word 0x60d9c665 -//.word 0x0699a98d -//.word 0x578b66e2 -//.word 0xf613dd93 -//.word 0xe67c3ddf -//.word 0xf99a1cd8 -//.word 0x8badc767 -//.word 0x6f89d691 -//.word 0x2af404f8 -//.word 0x5f503ea5 -//.word 0x8b7afa04 -//.word 0xf3f1ca30 -//.word 0xda3b3171 -//.word 0xf684b504 -//.word 0x2589351a -//.word 0x5db47d22 -//.word 0xe188184b -//.word 0xbb406545 -//.word 0x66b3ee48 -//.word 0xcb7bf458 -//.word 0x6f564fc7 -//.word 0xeacc75fb -//.word 0x9b13d872 -//.word 0x9a2f7502 -//.word 0xee5da966 -//.word 0x00b247f6 -//.word 0x5000e9b6 -//.word 0x67f98392 -//.word 0x0d973ee8 -//.word 0xbbbb8347 -//.word 0x53145577 -//.word 0x0f42e5b9 -//.word 0xb73b604f -//.word 0x18ee0c3f -//.word 0xb1279355 -//.word 0xafb39f67 -//.word 0x1cc4a6dc -//.word 0x5397086f -//.word 0xb7535731 -//.word 0xa435f5cd -//.word 0xa6eae510 -//.word 0xe93cdba9 -//.word 0xf1f1952d -//.word 0x8bf06e5e -//.word 0x04a631ac -//.word 0x98a82bfc -//.word 0x2d9a84a9 -//.word 0x424fcfc8 -//.word 0x2231dfb1 -//.word 0x5de4dcbb -//.word 0x78269746 -//.word 0xe4fa1bff -//.word 0x2d05855f -//.word 0x74381575 -//.word 0x1faf84e6 -//.word 0xcfd99832 -//.word 0x92daf738 -//.word 0x5b2d39fd -//.word 0xaf8e40a9 -//.word 0xa017ccd2 -//.word 0xffa94afd -//.word 0xce8ded62 -//.word 0xf45b00f0 -//.word 0x341b7b91 -//.word 0x60abd4af -//.word 0xca6117f7 -//.word 0xfcf0395d -//.word 0xa990aa60 -//.word 0xe359298f -//.word 0x8df0dc4c -//.word 0x1466a0d0 -//.word 0x5a5d9e6f -//.word 0xf36d1f1d -//.word 0x94c6a132 -//.word 0xc816296a -//.word 0xe5addc30 -//.word 0x3fdfc91c -//.word 0x9ba90aba -//.word 0xe7980b8d -//.word 0x28e72953 -//.word 0xb3e77f8b -//.word 0xa0a4fc35 -//.word 0x7cc6b9d9 -//.word 0x3eb58aca -//.word 0x7c01d4ac -//.word 0xdf009e34 -//.word 0xd5b9ea2f -//.word 0x850045c6 -//.word 0x08e39d00 -//.word 0xd6455388 -//.word 0x7ec991b1 -//.word 0x9bf2deb7 -//.word 0x0388ef48 -//.word 0x413dc042 -//.word 0x4690e4bf -//.word 0x5bf21a4f -//.word 0x5a272084 -//.word 0x1ef0ccb4 -//.word 0x38e758fa -//.word 0xe3aafe7e -//.word 0x3b3bc4f6 -//.word 0xa9a79a6d -//.word 0xa2e6a243 -//.word 0x9103cf76 -//.word 0x117db11f -//.word 0x60ec8f40 -//.word 0x10e7b7bc -//.word 0x002612a7 -//.word 0x8be4fbc0 -//.word 0xff87513c -//.word 0x5183cbc6 -//.word 0x0f7c8cc3 -//.word 0x95abf8da -//.word 0x8482c5b4 -//.word 0x70935500 -//.word 0xd9ae43bb -//.word 0x5d493cae -//.word 0x2b251038 -//.word 0xbb2f084d -//.word 0xbda57bbf -//.word 0x4f799cbc -//.word 0x72fa9699 -//.word 0xbfb1dbcd -//.word 0x5689b841 -//.word 0x18342ec7 -//.word 0x16c9fde7 -//.word 0x48b201e2 -//.word 0x83c5c1f1 -//.word 0xa5b146ce -//.word 0x139c2975 -//.word 0x650af02c -//.word 0x5f019bc1 -//.word 0x236b7913 -//.word 0xa6bb40d3 -//.word 0x61d35d8c -//.word 0x492589e1 -//.word 0x00199d17 -//.word 0x4dafa7d3 -//.word 0xca663d24 -//.word 0xdc5c11c3 -//.word 0xe8b6c69a -//.word 0xc4420284 -//.word 0x6c5bc554 -//.word 0xf70ef918 -//.word 0xc97b4a9f -//.word 0x097d3738 -//.word 0x568d69bd -//.word 0xb5e344d0 -//.word 0xcedfbd65 -//.word 0x59a86b81 -//.word 0xd313e040 -//.word 0x75c6391d -//.word 0x669df46e -//.word 0x304c022e -//.word 0x71461dff -//.word 0xd3de5c6f -//.word 0x3dac057b -//.word 0x4b33a252 -//.word 0xfcc0575b -//.word 0xab957278 -//.word 0x4147448d -//.word 0xa865303c -//.word 0x835a01f3 -//.word 0x1c958029 -//.word 0x9de747e4 -//.word 0x842cd07f -//.word 0x512dd1aa -//.word 0x81c5ccb2 -//.word 0xc043e103 -//.word 0x5b10e8eb -//.word 0xf492bca0 -//.word 0x794fd980 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00013018 -//// expected output -//.word 0xe855da51 -//.word 0xd23beb46 -//.word 0x47c4ff36 -//.word 0x07c3ac88 -//.word 0xe94a7058 -//.word 0x66fef028 -//.word 0x42b76be3 -//.word 0xcea65b43 -//.word 0xb545d673 -//.word 0xdbef9972 -//.word 0xf35d2658 -//.word 0xecd60bd8 -//.word 0x2373a550 -//.word 0x2376d1a4 -//.word 0x07f83a36 -//.word 0x9bfa6947 -//// SHA512LongMsgvector_98 -//// vector length -//.word 0x00013330 -//// input message -//.word 0x3299530a -//.word 0x2446fb39 -//.word 0x5b9380a8 -//.word 0x5417e9d1 -//.word 0xf13acd7f -//.word 0x1f4a1485 -//.word 0xb6cb01af -//.word 0xa10e71f9 -//.word 0x3e055dff -//.word 0x0755a6b5 -//.word 0x73ad1258 -//.word 0x175691a4 -//.word 0x110cc648 -//.word 0xa60dc297 -//.word 0x2a6f1380 -//.word 0x20b6fdc0 -//.word 0xa3a60756 -//.word 0x0556ba37 -//.word 0xb586a544 -//.word 0x6632a479 -//.word 0x6d686267 -//.word 0x6b561de4 -//.word 0x2da7a901 -//.word 0xd010b83c -//.word 0x292558f7 -//.word 0x6472bd29 -//.word 0xeac74154 -//.word 0x89d3a9b7 -//.word 0xcff4aac4 -//.word 0xb64eacd4 -//.word 0x871bcd1a -//.word 0xf84129d5 -//.word 0x972a59ca -//.word 0x6cd039f2 -//.word 0xda17ee70 -//.word 0xc76028c5 -//.word 0xfd5ba547 -//.word 0xcf1cf7d0 -//.word 0xff7286b3 -//.word 0xdf74d8f4 -//.word 0xb75c10b8 -//.word 0x6799b5fa -//.word 0x4d1fb580 -//.word 0x6902aa0d -//.word 0xbf435bd9 -//.word 0xfdea863e -//.word 0x5e54ddb4 -//.word 0xcecf4eff -//.word 0x4f6487a7 -//.word 0x9bf4baa9 -//.word 0x0b879d6c -//.word 0xb7e0b6f6 -//.word 0xdf55d560 -//.word 0x8adde287 -//.word 0x6c6bd805 -//.word 0x0d7a1260 -//.word 0x28e9c680 -//.word 0x510acf67 -//.word 0xdbf6af1c -//.word 0xf923d4e8 -//.word 0x23381ac5 -//.word 0xbc1f9214 -//.word 0xf15c828e -//.word 0xe49eac7d -//.word 0x0a94d32c -//.word 0xd1027c9c -//.word 0x8714f278 -//.word 0x77f28c4b -//.word 0x559432f1 -//.word 0xdcd81e4c -//.word 0xb5d2e038 -//.word 0x9b63a5c0 -//.word 0xbd0db892 -//.word 0x630549b0 -//.word 0xd58a6e69 -//.word 0x79766788 -//.word 0x3b1326cb -//.word 0x312f0f96 -//.word 0x7f73fce9 -//.word 0x79f08490 -//.word 0x08fb7d99 -//.word 0x4f3bbf0b -//.word 0x8e002bd5 -//.word 0x46d6ec05 -//.word 0x9e5bfd3a -//.word 0x054deb5c -//.word 0x19e7dd8a -//.word 0xc76ed154 -//.word 0xb407282b -//.word 0xdccb6515 -//.word 0x7a1d32a6 -//.word 0x273ba42b -//.word 0x4514bf28 -//.word 0x9e5a3d05 -//.word 0x49d78b04 -//.word 0xce041576 -//.word 0x89d8c32f -//.word 0x54dec337 -//.word 0x608a8ac2 -//.word 0x64cd1562 -//.word 0xfae7757c -//.word 0x457d8af9 -//.word 0xd8eb0f3d -//.word 0xd3dbd65d -//.word 0x4f17558c -//.word 0xfd9b62d7 -//.word 0x09ef3b13 -//.word 0x45b3c913 -//.word 0x837b261e -//.word 0x42de5c9f -//.word 0x8eca701f -//.word 0x211a9f71 -//.word 0xce6be72c -//.word 0x202bc95f -//.word 0x3ef24e7f -//.word 0x111648a4 -//.word 0xa97adaf5 -//.word 0xdda63a61 -//.word 0x321db691 -//.word 0xffeaf51a -//.word 0xce7d80f6 -//.word 0x04b58035 -//.word 0xc53ecaf0 -//.word 0x121d187f -//.word 0x348999eb -//.word 0x5efdada6 -//.word 0x8e8be97a -//.word 0xb47362c0 -//.word 0x16f428d2 -//.word 0xf36210c3 -//.word 0x6679b74d -//.word 0x8ef1c30a -//.word 0xec526ce7 -//.word 0x0c0a3cd7 -//.word 0x68bd12c4 -//.word 0x89dc6dcb -//.word 0x6f79e7a8 -//.word 0x335a006f -//.word 0xeb4c1d7e -//.word 0xceb9d1af -//.word 0x997d5ad2 -//.word 0x31f66f5a -//.word 0x895a3956 -//.word 0xc64e9fa3 -//.word 0xa1b4c660 -//.word 0x0dc4d8a3 -//.word 0x1a5e056a -//.word 0x1a9ec8d5 -//.word 0x02b26c92 -//.word 0x13e8ce98 -//.word 0xb90b6418 -//.word 0xb3f07eb0 -//.word 0x744ccce3 -//.word 0xc9c821c6 -//.word 0xbd5876fb -//.word 0xbac832e3 -//.word 0xf098a910 -//.word 0xfa09e2f9 -//.word 0xbf789df2 -//.word 0x97eb945b -//.word 0xb0ea0217 -//.word 0xaf906240 -//.word 0x9ae17918 -//.word 0xf55e9643 -//.word 0x2bd71934 -//.word 0x308132e6 -//.word 0x6548ebcc -//.word 0xbc66690a -//.word 0x1c356ee5 -//.word 0x07412378 -//.word 0x7aa215a9 -//.word 0x14897d5c -//.word 0x7b18c4e7 -//.word 0xfc7746c5 -//.word 0x7124578e -//.word 0x688a8326 -//.word 0x81d61a35 -//.word 0x1806edd8 -//.word 0x24425297 -//.word 0x5f706e96 -//.word 0xa803b30f -//.word 0xa513a7ff -//.word 0xacb3e720 -//.word 0xe47f6c18 -//.word 0xa7740ef0 -//.word 0x2b0546c7 -//.word 0x626a38c8 -//.word 0x1e3cf159 -//.word 0x793fed95 -//.word 0x747fdcfd -//.word 0xde9ea56a -//.word 0x786cac47 -//.word 0x56b851fc -//.word 0x8866b9ad -//.word 0xfac2d025 -//.word 0x99148e0d -//.word 0xb7757a62 -//.word 0xb1e06d26 -//.word 0xcf8c9955 -//.word 0x6b79c91a -//.word 0x5649ea43 -//.word 0x7752cbf3 -//.word 0xb5f12196 -//.word 0x1821ce1a -//.word 0x2a4c635d -//.word 0xa461e3e1 -//.word 0x4626cac7 -//.word 0x07d04dfb -//.word 0x6ed1e4ac -//.word 0x40f106ff -//.word 0x5ba03304 -//.word 0xe28a38e9 -//.word 0x9a6daf6d -//.word 0x9427c598 -//.word 0x0d1440a9 -//.word 0x9296c051 -//.word 0x68f5441e -//.word 0x2a6af13a -//.word 0xb4760f55 -//.word 0x407855e0 -//.word 0xcf7f667c -//.word 0xcb5d9bb2 -//.word 0xeafd03e4 -//.word 0x55f6a883 -//.word 0x0a5f1483 -//.word 0x7ee6140c -//.word 0x871cbc73 -//.word 0x7a13ab68 -//.word 0x902b9171 -//.word 0x8f29ee97 -//.word 0xa6891c5e -//.word 0x98168ffb -//.word 0x1db75cc2 -//.word 0x858cf8de -//.word 0x9e394244 -//.word 0xd882c4ea -//.word 0xa7193633 -//.word 0x29b344ae -//.word 0x09619201 -//.word 0xa31efc20 -//.word 0x68a422c3 -//.word 0x84852416 -//.word 0xbf76aab2 -//.word 0xa1ee28cc -//.word 0xdaf060ac -//.word 0xe1242861 -//.word 0xda2d6db4 -//.word 0xbd37785a -//.word 0xb5cf706e -//.word 0xc6f8201e -//.word 0xb37bfba4 -//.word 0x1f7e5d78 -//.word 0xf25814c3 -//.word 0xfea41f17 -//.word 0xe394b55e -//.word 0x2f898a11 -//.word 0xcae04dab -//.word 0x920e755c -//.word 0x42ef3d01 -//.word 0x985bed54 -//.word 0xb7fb5c60 -//.word 0xca5ab339 -//.word 0xea3f73e9 -//.word 0x423bbaad -//.word 0x707ec262 -//.word 0x2feeaa3a -//.word 0x337b79b3 -//.word 0x55ac60ca -//.word 0xf07e3f6b -//.word 0x8b6f6b2d -//.word 0xb8d6af3c -//.word 0x3b759096 -//.word 0x6f51d57b -//.word 0xe6c2471e -//.word 0x50c6b6a1 -//.word 0x9e9a3c40 -//.word 0x678cc6cd -//.word 0x8a0bcf5c -//.word 0x15006f3f -//.word 0x65619535 -//.word 0x8f0290de -//.word 0xffafd572 -//.word 0x5f79fcb3 -//.word 0xbb4d0b20 -//.word 0xe2cbf76c -//.word 0x0f54682e -//.word 0xc865bdda -//.word 0x072450f0 -//.word 0x9839fb73 -//.word 0xc2dfdb9d -//.word 0x293b53d1 -//.word 0xf3ec54d1 -//.word 0x2ae3dc31 -//.word 0x6175bd0c -//.word 0x9baea0f5 -//.word 0x68e94930 -//.word 0x519d1d23 -//.word 0x767ae107 -//.word 0x76b5c4e3 -//.word 0x8fa0a0bb -//.word 0x077d7d04 -//.word 0xca94575c -//.word 0x54832178 -//.word 0xd1d6095e -//.word 0x83d7fed4 -//.word 0x65a76f18 -//.word 0x0e8e56d1 -//.word 0xd7907646 -//.word 0x4041e0ce -//.word 0x90dabc87 -//.word 0xbc8b464b -//.word 0x8a1317e0 -//.word 0xf68fa66f -//.word 0xd58f0e38 -//.word 0xb86f1283 -//.word 0x13e55eda -//.word 0x9fd60f75 -//.word 0xfc6e76f6 -//.word 0x9b6f1957 -//.word 0xdbc9fb20 -//.word 0x726c1edd -//.word 0x0f5a45cf -//.word 0x3e00fee2 -//.word 0x8bc6e0df -//.word 0xeae512e3 -//.word 0x56780d10 -//.word 0xb9d7a282 -//.word 0x0c203e84 -//.word 0xbf166d04 -//.word 0x5b2f9d45 -//.word 0x66e825d4 -//.word 0x875c85bd -//.word 0xea15effe -//.word 0xe622073c -//.word 0xdd69e8b5 -//.word 0x643f6776 -//.word 0xa4369bce -//.word 0x00369d02 -//.word 0xf9d08c42 -//.word 0x4eced4dc -//.word 0x670fb0b0 -//.word 0xf392eee4 -//.word 0xd1d0f3d9 -//.word 0x2c4ffe5d -//.word 0xeb74b122 -//.word 0x4899cd6e -//.word 0xbe5f3d15 -//.word 0x294556a5 -//.word 0x297a5de0 -//.word 0xc7f0496f -//.word 0x5bb2cbd4 -//.word 0xad778ca1 -//.word 0x5a77b6e7 -//.word 0x797db5f2 -//.word 0x7f3e3f33 -//.word 0x60e9917e -//.word 0xf7fffc76 -//.word 0xa865a145 -//.word 0x44b87990 -//.word 0x2ce098a9 -//.word 0xbae8b207 -//.word 0xdc0cdef4 -//.word 0x02149a86 -//.word 0x3be10fd0 -//.word 0x9a469759 -//.word 0xdf197dce -//.word 0x538904f3 -//.word 0xf4b1aadf -//.word 0xd26ead69 -//.word 0xb96ecfde -//.word 0x108a56f5 -//.word 0x01565804 -//.word 0xdbf63573 -//.word 0xb4336571 -//.word 0x52ce74e7 -//.word 0x4c134aaa -//.word 0x6cb2b0f5 -//.word 0x58cb1016 -//.word 0x71487c67 -//.word 0xfc6ff280 -//.word 0x80b7dfab -//.word 0x6edbe199 -//.word 0x072ed153 -//.word 0x7b2e0172 -//.word 0x4e5bc293 -//.word 0x004a2a06 -//.word 0xedf514c6 -//.word 0x725567ae -//.word 0x51339ce9 -//.word 0x573b7aab -//.word 0x3c52241e -//.word 0xca2956a0 -//.word 0x4112ec2b -//.word 0xfb13a414 -//.word 0x4c3924f9 -//.word 0xac2f3ff5 -//.word 0x180f7415 -//.word 0xb578b710 -//.word 0xb7e17532 -//.word 0x812dd29a -//.word 0x0d7f35a5 -//.word 0x8f4f06aa -//.word 0x55beb6e8 -//.word 0xf22600bc -//.word 0x9bf66f18 -//.word 0xd1bd2130 -//.word 0x4184ca76 -//.word 0xe861fbc9 -//.word 0x7a49a5e9 -//.word 0x0526d92f -//.word 0xd129d17b -//.word 0x8c62346d -//.word 0xa38e96d8 -//.word 0xf3303e73 -//.word 0xa1e32dd2 -//.word 0x46ee5c95 -//.word 0x501944e0 -//.word 0xa5bfa30b -//.word 0x89257e9a -//.word 0xc10a626f -//.word 0xf87ff03e -//.word 0x63f99942 -//.word 0xa1a5a52e -//.word 0xe5fb7a67 -//.word 0x56961b70 -//.word 0xb643efa5 -//.word 0x4258c42d -//.word 0xda47132a -//.word 0x62728532 -//.word 0x6841b703 -//.word 0x07723a72 -//.word 0x0bb1dfa5 -//.word 0x55693182 -//.word 0x82d94267 -//.word 0xc76aab1c -//.word 0x1f40ce06 -//.word 0xa90f5e9d -//.word 0x4b302220 -//.word 0x9cf4f587 -//.word 0x013812b9 -//.word 0x16398eff -//.word 0x4faa26b8 -//.word 0xdf043b4f -//.word 0xd81e1b6b -//.word 0x94fd8265 -//.word 0x55ed61ff -//.word 0x28d0dd53 -//.word 0x0fb79b09 -//.word 0x5eaf3bcd -//.word 0x66de2200 -//.word 0x51ce7dae -//.word 0x4d0882c1 -//.word 0xede5f974 -//.word 0xcba1fc0a -//.word 0x73b1fbbf -//.word 0x7c5603ff -//.word 0xf8733fd6 -//.word 0x0f9cbfa8 -//.word 0xe66f7822 -//.word 0xc6278c70 -//.word 0x7a6eccb0 -//.word 0xf8737ba7 -//.word 0x443d55b3 -//.word 0x923fd001 -//.word 0xab2ca200 -//.word 0x910c8316 -//.word 0x66903491 -//.word 0x8aa2c0e0 -//.word 0x04410203 -//.word 0x238c6740 -//.word 0x641cf618 -//.word 0x97978d79 -//.word 0x3e826d35 -//.word 0x3657f8b3 -//.word 0x99d8bae5 -//.word 0xe2a2a779 -//.word 0x5205a354 -//.word 0x9313483c -//.word 0x9cf7e3d4 -//.word 0xd489bfce -//.word 0x7a1fa75c -//.word 0x44a5a6e7 -//.word 0x46f01104 -//.word 0x164fc7a4 -//.word 0x2e63b88a -//.word 0x9131a403 -//.word 0xb27625d1 -//.word 0x913af068 -//.word 0x27a8585d -//.word 0x041d141b -//.word 0x377f41d8 -//.word 0x6ed0abc7 -//.word 0x5e03488f -//.word 0x650e05fd -//.word 0x6e40c5f5 -//.word 0x16d5a7af -//.word 0x0dc88820 -//.word 0xbee8cab5 -//.word 0x322e5347 -//.word 0x314ed84c -//.word 0xab8c5b4a -//.word 0x57d1f292 -//.word 0x9afecb2a -//.word 0xaa806d0b -//.word 0xf325408c -//.word 0xba2d501f -//.word 0x00a54e3b -//.word 0xa9f0d899 -//.word 0xdda7f9a3 -//.word 0xafa3f42a -//.word 0xfc573d57 -//.word 0x9663c9e4 -//.word 0xa267878b -//.word 0x3f152fbf -//.word 0x698b3a9b -//.word 0x1cdf3118 -//.word 0xbcfb2b82 -//.word 0xb4ab922d -//.word 0x5ef42564 -//.word 0x23a843a2 -//.word 0xe3376605 -//.word 0x96c8eeff -//.word 0x3488204f -//.word 0xd3426e2f -//.word 0x0f31f8cf -//.word 0xaf125403 -//.word 0x867c8a38 -//.word 0x967463ad -//.word 0x7c3de4e0 -//.word 0x086d1546 -//.word 0x2b46073e -//.word 0x16421448 -//.word 0xa0f06972 -//.word 0xe8ffc214 -//.word 0x3c9875bd -//.word 0x3af2b26d -//.word 0x35200905 -//.word 0xdb2d2cfb -//.word 0x146af752 -//.word 0x2d07adca -//.word 0x35e18554 -//.word 0xa79b65c8 -//.word 0x4af0edda -//.word 0x5647b74b -//.word 0xd888dd5c -//.word 0x572fbc88 -//.word 0xb89ff872 -//.word 0x5fb8c11d -//.word 0x97ab545b -//.word 0x340dc488 -//.word 0x772bfa77 -//.word 0x319efaad -//.word 0x2b1f69cd -//.word 0xc69c4c54 -//.word 0xdf8b1386 -//.word 0xf57ed6a9 -//.word 0x8ef7de70 -//.word 0xd67e67ba -//.word 0x8af2a47d -//.word 0x141d04fc -//.word 0xf88ab441 -//.word 0x6e9b65c7 -//.word 0x50d64f77 -//.word 0x378076d5 -//.word 0xe26d2c7c -//.word 0xd716d7c8 -//.word 0x4cecf4d2 -//.word 0x47ec5ca1 -//.word 0x0574c69e -//.word 0x99558e49 -//.word 0xd529b52b -//.word 0x6de7280b -//.word 0x5ab44565 -//.word 0x7dfc9b18 -//.word 0x85c2f15f -//.word 0x12348a02 -//.word 0x1a83a8ce -//.word 0x8df14f42 -//.word 0x342c4b8b -//.word 0xdfda75b3 -//.word 0xbf753115 -//.word 0x11593b14 -//.word 0xfc1ba40c -//.word 0xbd1d1789 -//.word 0x015f61b7 -//.word 0x9298301a -//.word 0x36861b7f -//.word 0xd582e333 -//.word 0xd957f972 -//.word 0xda544022 -//.word 0x7ba013c2 -//.word 0x8fce8a9d -//.word 0x81b1f943 -//.word 0xf272ba39 -//.word 0xa3df2df0 -//.word 0x9606fcf4 -//.word 0x7003a466 -//.word 0x221631ac -//.word 0xc8f94867 -//.word 0xd1706ba5 -//.word 0x61217959 -//.word 0xf3a67408 -//.word 0x43e187c4 -//.word 0x6b8f485e -//.word 0x4c203ad8 -//.word 0x2fc79619 -//.word 0xaccd4be4 -//.word 0xcc2a430b -//.word 0x6a56e8e0 -//.word 0xdf5de7ed -//.word 0xde3233e5 -//.word 0x9c454eda -//.word 0x3457c4af -//.word 0x4b8df8d1 -//.word 0xefc42222 -//.word 0xc5259936 -//.word 0x64f94ec2 -//.word 0xfcbe9951 -//.word 0x3b7a3939 -//.word 0x714f96ce -//.word 0xf25048d5 -//.word 0xbc93dd3c -//.word 0x5987d708 -//.word 0x0788f58e -//.word 0x17b1b4e6 -//.word 0x93f2149d -//.word 0x23629faa -//.word 0x31d6a8a3 -//.word 0x4cb2d131 -//.word 0xcaffd0c2 -//.word 0xb2be727d -//.word 0xd97cdf7b -//.word 0x4a272134 -//.word 0xeb20e037 -//.word 0x5e916f1f -//.word 0x26010dc2 -//.word 0x0b2664ab -//.word 0xbffa56cb -//.word 0xc111f96b -//.word 0x8229e065 -//.word 0xc7039d94 -//.word 0x4e718389 -//.word 0xb4b1b17f -//.word 0x96f94c91 -//.word 0xf7530b2b -//.word 0xe1abf9bf -//.word 0x4f2676b9 -//.word 0x4bb67fb4 -//.word 0x54ec30ee -//.word 0x020d87f9 -//.word 0xed676bb4 -//.word 0xcae5ed7a -//.word 0xd7e2cd99 -//.word 0x7a3b4006 -//.word 0x24a8f04f -//.word 0x7c4c45d0 -//.word 0xba8ae32a -//.word 0x501b74f1 -//.word 0xd05da7a5 -//.word 0x0aee78e4 -//.word 0x747ab3dd -//.word 0xd0d1b308 -//.word 0x083d7015 -//.word 0x5d12b922 -//.word 0xc086bd30 -//.word 0x80c3d0d8 -//.word 0x263b6c3a -//.word 0x9e3c7637 -//.word 0x97c4c3e0 -//.word 0x2b96db2d -//.word 0xc38dfdf3 -//.word 0x35316310 -//.word 0x3088c6e8 -//.word 0xda2f2516 -//.word 0xb7a8c35b -//.word 0xcdf66fda -//.word 0x06670788 -//.word 0xd5b23fde -//.word 0x1c419fd1 -//.word 0x4ed0cb03 -//.word 0xd137073b -//.word 0xa684fa13 -//.word 0x4b4db2f0 -//.word 0xe045e937 -//.word 0x8a0c87be -//.word 0x154c6881 -//.word 0xdd015e97 -//.word 0xee187a64 -//.word 0x6a3c870f -//.word 0x2bedd836 -//.word 0xaad244e1 -//.word 0x1f506eb5 -//.word 0xea5b4a6b -//.word 0x328cdc80 -//.word 0xcc74432d -//.word 0x5e31f799 -//.word 0xc43e4f4e -//.word 0xb29046e9 -//.word 0x9bde7e16 -//.word 0xd24085bc -//.word 0xf0fb5875 -//.word 0x759b2541 -//.word 0xb243557b -//.word 0xe642ca0c -//.word 0xa7e665de -//.word 0x8395cc94 -//.word 0xe8196a78 -//.word 0x413cb7b4 -//.word 0x6295b9c6 -//.word 0x26a1cb2e -//.word 0x56169d69 -//.word 0xcd737c23 -//.word 0xdadcd3a9 -//.word 0xe625f29d -//.word 0x572d0fed -//.word 0xb46d8a05 -//.word 0x09d07644 -//.word 0x8dc554ad -//.word 0x829321e0 -//.word 0x5dee9448 -//.word 0x27c7a195 -//.word 0x2368416d -//.word 0xb1bf755e -//.word 0x72fa8818 -//.word 0xad5595d9 -//.word 0xf1304a28 -//.word 0xfc65ebc6 -//.word 0xdcd89ae2 -//.word 0x5450d58c -//.word 0x8185406c -//.word 0xbd7aa5b4 -//.word 0xc40c3953 -//.word 0x16cb216c -//.word 0x9c0a3406 -//.word 0x8d320305 -//.word 0x935c1659 -//.word 0x2a1e7975 -//.word 0x49a47802 -//.word 0x4503a6d5 -//.word 0xf2cb241f -//.word 0x0bdb1fe4 -//.word 0xd47a9baf -//.word 0xfda36f83 -//.word 0xca9f9114 -//.word 0x71da9437 -//.word 0xc4ef6f98 -//.word 0x0f0580ab -//.word 0x445ed1e5 -//.word 0x552d992b -//.word 0xe2a8068b -//.word 0x145f392a -//.word 0xc9cc937d -//.word 0xf12b2fbc -//.word 0x378caf94 -//.word 0xe5263c1d -//.word 0x01eec80b -//.word 0xbc689628 -//.word 0x0ebdfd02 -//.word 0x9a0f69e0 -//.word 0xd709a2fb -//.word 0x71ba51eb -//.word 0xeda3c060 -//.word 0x8d0ee112 -//.word 0x73a292fb -//.word 0x08351fc3 -//.word 0x9fe1087c -//.word 0x565a058f -//.word 0x3d7e48f6 -//.word 0xbb2e02ac -//.word 0x2d5d2862 -//.word 0xcf667774 -//.word 0xe0a3b61b -//.word 0x013b3be4 -//.word 0xdf3bb061 -//.word 0x11e9171e -//.word 0x44550cd6 -//.word 0x95304ae7 -//.word 0x3ee17104 -//.word 0x75d6072a -//.word 0x9118bcd5 -//.word 0x6f23f273 -//.word 0x14f47c19 -//.word 0x9363a675 -//.word 0x31b37604 -//.word 0xc8683284 -//.word 0x695822ad -//.word 0x4505971c -//.word 0xce2a2d90 -//.word 0x19944c58 -//.word 0x8733f50c -//.word 0xa471bb7c -//.word 0x4fc20fe6 -//.word 0x1c7dc16c -//.word 0xf6eac4c4 -//.word 0x099c3232 -//.word 0xdf018fb3 -//.word 0xc837527b -//.word 0x8021a1a2 -//.word 0x0cbb5d1b -//.word 0xe5aa5ee5 -//.word 0x58180085 -//.word 0x2dbedeb3 -//.word 0x8742dd54 -//.word 0x0bc46da8 -//.word 0x44b40bc5 -//.word 0x46e60a44 -//.word 0x92e8943a -//.word 0x3a93ec6a -//.word 0x46e0f5b8 -//.word 0x55fdf8e1 -//.word 0x88a0a26a -//.word 0x9b9c4cd6 -//.word 0x55b2801c -//.word 0x23a9b858 -//.word 0x00a068c1 -//.word 0x97a43fdb -//.word 0xac7eaaee -//.word 0xb8ce9bb6 -//.word 0xd35e885c -//.word 0xd7b0b6a5 -//.word 0xc3d9b76a -//.word 0x5d923248 -//.word 0x1c8de298 -//.word 0x4405e1a1 -//.word 0x5399270d -//.word 0x9c5a4d9a -//.word 0x32239712 -//.word 0x0729327d -//.word 0x55d2ba95 -//.word 0x3dcb007a -//.word 0xaf5509a7 -//.word 0x89df5a25 -//.word 0x03da72fe -//.word 0x4ac999f5 -//.word 0x6b97d874 -//.word 0x732e49c6 -//.word 0xd4459186 -//.word 0x0b79aa58 -//.word 0x80a0e6d7 -//.word 0xae5a30ce -//.word 0x83e895aa -//.word 0x0a42042f -//.word 0x4763526b -//.word 0x63e881e8 -//.word 0x09d94226 -//.word 0x0fc7b848 -//.word 0x59177f0e -//.word 0xfa9ded03 -//.word 0x9d6d98f8 -//.word 0x24ed18b0 -//.word 0x8e2f0edd -//.word 0x1e7e654b -//.word 0xb937d75c -//.word 0x91dbb3b4 -//.word 0x0061de35 -//.word 0xb6d1182e -//.word 0x170e81cf -//.word 0xdff35ce1 -//.word 0x08a212b4 -//.word 0xed197a58 -//.word 0xaf07570f -//.word 0xd8dd2303 -//.word 0x3e270b35 -//.word 0x2b1d3ab6 -//.word 0xba755a19 -//.word 0x847c5828 -//.word 0x7c6568d6 -//.word 0x18e14a75 -//.word 0xb2f0cb29 -//.word 0x2df68e9d -//.word 0xdb110cf4 -//.word 0x9eaada03 -//.word 0x4e4a2bbd -//.word 0x5baf95ee -//.word 0xb420182d -//.word 0xe7fd5c0b -//.word 0x899a3a91 -//.word 0xd84d7eea -//.word 0x9fc6eb5c -//.word 0x5a9f807d -//.word 0x9b34faa3 -//.word 0xacb59a9c -//.word 0x767a289f -//.word 0xa1963883 -//.word 0xfdaeac2f -//.word 0x210c7a52 -//.word 0x52efb054 -//.word 0xa625b58c -//.word 0x68dcd1b3 -//.word 0xbfb6ef98 -//.word 0x8b1ba216 -//.word 0x90d36743 -//.word 0xd6d42aeb -//.word 0x4f580b3d -//.word 0xbb3361c3 -//.word 0xc964ff98 -//.word 0x7feab7d5 -//.word 0xdbd91d4c -//.word 0xbbac8d79 -//.word 0xfadd70b5 -//.word 0xdcb3baad -//.word 0xac5cb713 -//.word 0xa33b0893 -//.word 0x0c83e909 -//.word 0xa605b5f1 -//.word 0x4a46ab1e -//.word 0xcdd5f2b0 -//.word 0x28dbdb40 -//.word 0xd6f4675d -//.word 0x7e3d093c -//.word 0xd2afacab -//.word 0xb7abf847 -//.word 0xa6d5d1ef -//.word 0x52262178 -//.word 0x8b3dd8a2 -//.word 0x62f6314b -//.word 0x8e3e36e3 -//.word 0x0e268620 -//.word 0x103656f3 -//.word 0x1203b6ba -//.word 0x470315b7 -//.word 0x3ca108c1 -//.word 0xbb8d4739 -//.word 0xf056f840 -//.word 0xca3a3127 -//.word 0xa43db827 -//.word 0x25780d53 -//.word 0x64b4aaca -//.word 0x50378931 -//.word 0x50dee761 -//.word 0x266c485c -//.word 0x1922bb86 -//.word 0x53905f12 -//.word 0x88aa26ba -//.word 0xd81ed9b3 -//.word 0xf7e55ce0 -//.word 0x8b183446 -//.word 0xd50646c0 -//.word 0x9483e1f3 -//.word 0x2683ff85 -//.word 0xf1e7c88a -//.word 0x0196583f -//.word 0xf2d0c2fb -//.word 0x11bf5562 -//.word 0xbe4f1edc -//.word 0x1540ad46 -//.word 0xcd7a1ce7 -//.word 0x5fa04ea5 -//.word 0x6be77578 -//.word 0x5829d720 -//.word 0x3c35d113 -//.word 0xfb6a1cba -//.word 0xb2844fdc -//.word 0x56b5a55b -//.word 0x98f8011e -//.word 0x0ca22f4e -//.word 0x8b396dc5 -//.word 0xd68a2ac3 -//.word 0x7bf60de3 -//.word 0xfd0d394e -//.word 0x2f5ed02f -//.word 0xe18cb567 -//.word 0xbea59781 -//.word 0x75b02be8 -//.word 0x1785b857 -//.word 0xc0e2d992 -//.word 0x7aba7f54 -//.word 0x5ed03588 -//.word 0xfd85a8bb -//.word 0xfeee66d2 -//.word 0x082ae6f8 -//.word 0xe2f3c9db -//.word 0xd8725f18 -//.word 0x61586df3 -//.word 0x002a2d4c -//.word 0x68dc97cf -//.word 0xe3a2df6a -//.word 0xf4033f04 -//.word 0x3b2ff66c -//.word 0x9a92918f -//.word 0x96a969ef -//.word 0x00156d50 -//.word 0xd4ee21b4 -//.word 0x6159e78a -//.word 0xaa5d7e23 -//.word 0x0df2c865 -//.word 0x225bd0c3 -//.word 0xe6b60b6d -//.word 0x19d2dec3 -//.word 0xe4406110 -//.word 0xbfad6375 -//.word 0x926fae23 -//.word 0x1a5d8bcd -//.word 0x8fe4895e -//.word 0x84577be7 -//.word 0x0e87c0db -//.word 0x2894c77e -//.word 0x5602d19b -//.word 0x890ff975 -//.word 0x43447201 -//.word 0xfb4b1152 -//.word 0xc3000b55 -//.word 0x28caffbe -//.word 0x5a2c3742 -//.word 0x8d972b07 -//.word 0x9e834659 -//.word 0xfabeed9e -//.word 0xbc03be8c -//.word 0x15ce1599 -//.word 0xf16fd5b3 -//.word 0xd75d6532 -//.word 0x11cef80b -//.word 0x0e841246 -//.word 0x04ea48b2 -//.word 0xd95f47d7 -//.word 0x44d2172c -//.word 0x308fa18a -//.word 0x61586fe1 -//.word 0x59b8b42a -//.word 0x7d948c9c -//.word 0x74038423 -//.word 0xd0605d0e -//.word 0xf09d0d07 -//.word 0x24d90749 -//.word 0x1335bc0d -//.word 0x5ae46245 -//.word 0x7682f48d -//.word 0xe4a77a5f -//.word 0x86bb8a86 -//.word 0x490c0fd5 -//.word 0x051d4918 -//.word 0xa542154b -//.word 0x87696f0a -//.word 0x263b3549 -//.word 0xf6642d45 -//.word 0x8f2e4aba -//.word 0x0e552b57 -//.word 0xb817e56f -//.word 0xe18a02f1 -//.word 0x0d32ca9a -//.word 0x54d3c169 -//.word 0x0b847054 -//.word 0xa0056839 -//.word 0xc6528517 -//.word 0xd278707e -//.word 0x65a86744 -//.word 0x4c8a417a -//.word 0xa4d3ac9e -//.word 0x421aba12 -//.word 0x52e89ccd -//.word 0x3d0ead51 -//.word 0xd13bb2dd -//.word 0x9ccd5fe3 -//.word 0x98e81ebc -//.word 0x0ec50d9b -//.word 0xb44d45c0 -//.word 0x18e762ee -//.word 0x428e401e -//.word 0x95260275 -//.word 0xf7105974 -//.word 0x32fc036f -//.word 0x99fe9140 -//.word 0xeee56e3c -//.word 0x83c81d66 -//.word 0xa0e1c2e3 -//.word 0x259ee4ae -//.word 0x70f6718d -//.word 0x81fa0244 -//.word 0x5cac6108 -//.word 0xaf134936 -//.word 0xb58f6c45 -//.word 0x5a6bbafa -//.word 0xa0b1e1da -//.word 0x414210e5 -//.word 0x96250181 -//.word 0xb72036b5 -//.word 0xe4858397 -//.word 0x244fcc08 -//.word 0x2b6d109e -//.word 0x815ea6e2 -//.word 0xe1fec7bc -//.word 0xe0a04d2b -//.word 0xcf5cba39 -//.word 0xe1ab7c2f -//.word 0x91317005 -//.word 0x3ed9a41c -//.word 0x18276130 -//.word 0x40ca6988 -//.word 0x2b717d6f -//.word 0x48e022e8 -//.word 0xe243a59e -//.word 0x47c25d1a -//.word 0x2a553038 -//.word 0x46da58dc -//.word 0x446567e1 -//.word 0xdfd78952 -//.word 0x46b20add -//.word 0xc12b1884 -//.word 0x9881c996 -//.word 0x318e60de -//.word 0x789ccc1a -//.word 0x837971af -//.word 0x77ce2b9a -//.word 0xa5ac90aa -//.word 0xf96876ec -//.word 0x95a9b667 -//.word 0xb9bf2f0a -//.word 0xe6360de3 -//.word 0x43ab4b92 -//.word 0x3fdf76fc -//.word 0x780ab444 -//.word 0xdc7206f7 -//.word 0x0d3bca86 -//.word 0x0a8184fa -//.word 0x0da4dde3 -//.word 0xafe3ec91 -//.word 0x522db587 -//.word 0xc033ef2d -//.word 0x10c20bc5 -//.word 0xca5071a0 -//.word 0x4bd50d92 -//.word 0x6adc0aa3 -//.word 0x5bd9dd07 -//.word 0xd4bd8651 -//.word 0x6fc812e3 -//.word 0x509e65a9 -//.word 0x079e3607 -//.word 0xb76f5b0f -//.word 0x78db47f8 -//.word 0xfbe1d1cb -//.word 0x6d053760 -//.word 0x9deb6289 -//.word 0x60246b8d -//.word 0x35485fd8 -//.word 0x25453ff0 -//.word 0xedf64bab -//.word 0x5ff880a0 -//.word 0x06b960db -//.word 0x09d1f1d5 -//.word 0x519608a3 -//.word 0xeeeac76d -//.word 0xb7586522 -//.word 0x31602d6a -//.word 0xb30ecadc -//.word 0xc7d2c172 -//.word 0xd28b3f39 -//.word 0xf8e5154d -//.word 0x3ae50105 -//.word 0xe1c22f6b -//.word 0x20f7ffef -//.word 0xf596095c -//.word 0x50df5f0a -//.word 0x77111156 -//.word 0xa980f74f -//.word 0x01e8aab2 -//.word 0x9e01d419 -//.word 0x0153aa6f -//.word 0xb64cb6a7 -//.word 0x3790daad -//.word 0x0d90929d -//.word 0x385e7934 -//.word 0xd1c00f84 -//.word 0xee83b9eb -//.word 0xc6110945 -//.word 0x16464061 -//.word 0xc38011b2 -//.word 0xc0f5a847 -//.word 0x324aebfd -//.word 0xd26100f4 -//.word 0x93720f3f -//.word 0x865d49e0 -//.word 0xfa3e29f3 -//.word 0xe742f929 -//.word 0x8dba9978 -//.word 0x586e7c11 -//.word 0x0734f393 -//.word 0x0dc1ae7e -//.word 0x37be7fea -//.word 0x901f6279 -//.word 0x82b0bb8a -//.word 0x3df0deaf -//.word 0x5d23d462 -//.word 0xc6a35df3 -//.word 0xd37731c5 -//.word 0xb1268bba -//.word 0x05cde8ec -//.word 0xd5700c9e -//.word 0xa58e4772 -//.word 0xe0f8f6dc -//.word 0x7ae34cd6 -//.word 0xd43b53d5 -//.word 0xe03a2dfc -//.word 0x853aa090 -//.word 0x45c7d2ad -//.word 0x1df95037 -//.word 0xac005512 -//.word 0x98014a96 -//.word 0x2e21893d -//.word 0x48df669f -//.word 0x74a670a1 -//.word 0x52a2f4e9 -//.word 0x3ed4c395 -//.word 0x2f61352c -//.word 0xdf306ed4 -//.word 0x2db3e0c6 -//.word 0xbf051100 -//.word 0xeb369f39 -//.word 0xd8e3811a -//.word 0xe0098fab -//.word 0x391a450c -//.word 0xd551c465 -//.word 0x8643191f -//.word 0x66b8c255 -//.word 0x76b86e85 -//.word 0x85e9058c -//.word 0x5418e8d1 -//.word 0xf7157ac0 -//.word 0x7ec4df7a -//.word 0xd57104ca -//.word 0xe964df5c -//.word 0x0cb5f829 -//.word 0x9b622836 -//.word 0xde9fa07e -//.word 0x2f6d2e2c -//.word 0x5f6ebc0e -//.word 0x55f81a47 -//.word 0xf868fd44 -//.word 0x50b947f1 -//.word 0xe755882c -//.word 0x762ac57a -//.word 0xbd0179f8 -//.word 0xb30bda95 -//.word 0xdfbd5d7f -//.word 0x06de7cdb -//.word 0x06dfb7b9 -//.word 0x026ad947 -//.word 0xbf3d7c44 -//.word 0x4e39cfb8 -//.word 0xecb697e3 -//.word 0x261a7473 -//.word 0x41aa66fa -//.word 0xd8a08f9e -//.word 0xc77d3b13 -//.word 0x48a01dc6 -//.word 0x5c18db5b -//.word 0x6db7ce5a -//.word 0x31670325 -//.word 0xd1c1852e -//.word 0x4bdcde66 -//.word 0x1563dbf9 -//.word 0x03eb9038 -//.word 0x6a839cd6 -//.word 0x868cae58 -//.word 0x19cb48c7 -//.word 0x55bcc3a8 -//.word 0xfc29942e -//.word 0xc6fccdad -//.word 0x0352e752 -//.word 0x81d0be12 -//.word 0xb03adde0 -//.word 0x0441fc23 -//.word 0x9b9dc767 -//.word 0x205ce152 -//.word 0xef7a29da -//.word 0x79b13cb6 -//.word 0xea923b12 -//.word 0x0ad5ce87 -//.word 0x61ee684a -//.word 0x9fe1cda4 -//.word 0x3b56d2a2 -//.word 0x59f0640d -//.word 0xf1dbcc9c -//.word 0x2ea43169 -//.word 0x144e5fa2 -//.word 0x66a2c781 -//.word 0xc7c6c67e -//.word 0x1f112ac3 -//.word 0x401ef2e0 -//.word 0xca1f55c0 -//.word 0x4b7406db -//.word 0xab7db7ae -//.word 0xc8acdc68 -//.word 0x5ddeb1e7 -//.word 0x28eb7ee2 -//.word 0x4c7b1968 -//.word 0xf41cad89 -//.word 0x3992bb53 -//.word 0x466e5e00 -//.word 0xb9e3d36d -//.word 0x4dd438ce -//.word 0xb63194a1 -//.word 0xcd8418e0 -//.word 0xedc7a57b -//.word 0x9d798e05 -//.word 0x6ff19ead -//.word 0x28f15d71 -//.word 0x207e8f8e -//.word 0xeceffe3b -//.word 0x3b457996 -//.word 0xfeba1ddf -//.word 0xcc9dd3e4 -//.word 0x845c1abc -//.word 0x34e307b8 -//.word 0x39248997 -//.word 0xa8f7f2f9 -//.word 0xed25b317 -//.word 0xb2bf67b0 -//.word 0x03b51447 -//.word 0xafa3ad8b -//.word 0xf1eedb17 -//.word 0x4f10fc5b -//.word 0xc3306dda -//.word 0x19f60497 -//.word 0x989de1c9 -//.word 0xe44a67d6 -//.word 0x239c857f -//.word 0x5f843a58 -//.word 0x2b57587c -//.word 0x8a21887e -//.word 0x0c3d8ea3 -//.word 0x3a22ce4e -//.word 0x34800fbb -//.word 0x998c80f0 -//.word 0xa797f8f1 -//.word 0xa4e68234 -//.word 0x7cbe1954 -//.word 0xabbeb009 -//.word 0x5d727658 -//.word 0xd4245707 -//.word 0x0bf5c654 -//.word 0x992dbae7 -//.word 0xd7d0f604 -//.word 0x45728e05 -//.word 0x2a4ba708 -//.word 0x7b8e7ee5 -//.word 0xfef7ac63 -//.word 0xafa3a8ab -//.word 0x63258dfc -//.word 0xabd61da1 -//.word 0xfb6c0620 -//.word 0x0ccf65b5 -//.word 0x7e2889fe -//.word 0xc23af9f8 -//.word 0x37f5b82a -//.word 0x9348c720 -//.word 0x8538ec1b -//.word 0x992fb207 -//.word 0x5b96b1ad -//.word 0xbfa50f2a -//.word 0xc07a47a0 -//.word 0x4869292b -//.word 0x50942317 -//.word 0x48bbbe50 -//.word 0xb9556b19 -//.word 0x29df8001 -//.word 0x3f747e13 -//.word 0x279e954e -//.word 0x386c6a55 -//.word 0xd4c41767 -//.word 0x90fb7390 -//.word 0x95a39521 -//.word 0x47a4935f -//.word 0x248f8f78 -//.word 0xee2ef5bb -//.word 0x0c60fe07 -//.word 0x2e237984 -//.word 0x30f3ca92 -//.word 0x415333ff -//.word 0x44a9527d -//.word 0x764eeb53 -//.word 0x51e6e852 -//.word 0xb1ed9e0b -//.word 0x3693523f -//.word 0xe9cafc97 -//.word 0x229d4a95 -//.word 0xa9c3e8cb -//.word 0x1b74ff4b -//.word 0x8f7bfc5e -//.word 0x7a8d9279 -//.word 0xd0d9026c -//.word 0x6ce09add -//.word 0xb2877bf5 -//.word 0x736aa059 -//.word 0x10741c5c -//.word 0xe3ada373 -//.word 0xda524ce9 -//.word 0x652b95d3 -//.word 0x9319a847 -//.word 0x78efddc9 -//.word 0xd1827f06 -//.word 0xeb04d3c5 -//.word 0xc08d561a -//.word 0x63fb47dc -//.word 0x9ffc655a -//.word 0xdb69fa4a -//.word 0x41d61802 -//.word 0x206723eb -//.word 0x8ee58f32 -//.word 0x5110ebc0 -//.word 0x00371f6d -//.word 0x6507f270 -//.word 0x26a1cf1a -//.word 0xa4efc8c5 -//.word 0x2437db07 -//.word 0x2df0742b -//.word 0x30d534e1 -//.word 0x6f39f134 -//.word 0x179afebd -//.word 0xaf78ac16 -//.word 0xb6671092 -//.word 0x8864072b -//.word 0x826578bc -//.word 0x6634d971 -//.word 0x017cf57b -//.word 0x0b24ec08 -//.word 0x4edd7b72 -//.word 0x0bf77db6 -//.word 0x9979b229 -//.word 0x4f70c066 -//.word 0xa487778b -//.word 0x95d859a5 -//.word 0x47025a68 -//.word 0xee7ce424 -//.word 0xed291ef4 -//.word 0x3f2c6e39 -//.word 0x15fd3d46 -//.word 0xc0bcfa5d -//.word 0xd2c661db -//.word 0x8087fdaf -//.word 0x4b8feb10 -//.word 0xe0e7e270 -//.word 0x3ca570ab -//.word 0x13be8685 -//.word 0x731c3753 -//.word 0xa5f0bdf8 -//.word 0x544abd13 -//.word 0xf0e7cc77 -//.word 0x554931dc -//.word 0xa80decd4 -//.word 0x827af800 -//.word 0x5156ce83 -//.word 0xfbfd2ab7 -//.word 0xc4b4111f -//.word 0x713a139d -//.word 0xada0cee5 -//.word 0xad5bb332 -//.word 0x10980d38 -//.word 0x09cf3e59 -//.word 0xbf9b4c1b -//.word 0xf4c99dda -//.word 0xe5aeffba -//.word 0x72beece0 -//.word 0x7f5b0be2 -//.word 0x9aebf97b -//.word 0xde2d4a84 -//.word 0x17cdcb1f -//.word 0x27360a36 -//.word 0xa8a71924 -//.word 0xd2898eb1 -//.word 0x9f00ce44 -//.word 0x2ec08c54 -//.word 0x65228c20 -//.word 0xdb76ada0 -//.word 0xf59b26bb -//.word 0x4fce10ba -//.word 0x5dc025fd -//.word 0x52ebc7ec -//.word 0x40254431 -//.word 0x81765825 -//.word 0x5727f387 -//.word 0xcf1b3d74 -//.word 0xeb63d793 -//.word 0xff0c6491 -//.word 0x5c3b49cd -//.word 0x2c7db054 -//.word 0x9d58d30f -//.word 0x4226773b -//.word 0xb623b61a -//.word 0x82c402e8 -//.word 0x404a6711 -//.word 0x019810a1 -//.word 0xed410dfc -//.word 0x29e654cf -//.word 0xfebf0546 -//.word 0x3777f280 -//.word 0xca3d5e40 -//.word 0xbb1805e5 -//.word 0x3e7a5d9c -//.word 0x1c191cd4 -//.word 0x57fafaf2 -//.word 0x11ceb846 -//.word 0xaa82613e -//.word 0x2912d0da -//.word 0xdd9e7260 -//.word 0x44bf4d51 -//.word 0x2b1b419b -//.word 0x17378e10 -//.word 0xe48d9717 -//.word 0xacdfe6a2 -//.word 0xeaca6f60 -//.word 0xdf9e1933 -//.word 0x356d7ae4 -//.word 0xe362e216 -//.word 0x50549c78 -//.word 0xbb9b703f -//.word 0xda236cd4 -//.word 0xc1bfe5c9 -//.word 0x06bfb812 -//.word 0x23c4d572 -//.word 0x1bd3ff33 -//.word 0x61a9cd1a -//.word 0xf54ef59a -//.word 0xd0edc948 -//.word 0x82e3028f -//.word 0x1a16bda5 -//.word 0x4688c3bd -//.word 0xbb2c0d7f -//.word 0xd7f888b5 -//.word 0x853b1547 -//.word 0x6231d469 -//.word 0x1ed4a213 -//.word 0x24f6e0b1 -//.word 0x7d8d771d -//.word 0xf14e18ca -//.word 0x707dc942 -//.word 0xb1039dd2 -//.word 0x19c1c283 -//.word 0xde24c14d -//.word 0x6cf90288 -//.word 0x08838fa3 -//.word 0xb3cb1918 -//.word 0x5138409f -//.word 0x0a5f0fa3 -//.word 0xf11cc6f2 -//.word 0xe3e2ddb8 -//.word 0xb24f45ae -//.word 0x8304f18f -//.word 0x75b395cc -//.word 0x8479ae80 -//.word 0xac6fc2a6 -//.word 0x517ce98a -//.word 0xde6d8c7d -//.word 0xad476dcd -//.word 0x27dbe7f4 -//.word 0x2c9c7810 -//.word 0xb5ae7c93 -//.word 0xb73f3b3c -//.word 0x4b1a2646 -//.word 0x0d795edf -//.word 0xc11b76db -//.word 0x3d977aaa -//.word 0x83f03087 -//.word 0x2d699df3 -//.word 0x0e9bcb62 -//.word 0x16c4ca34 -//.word 0x7662f5e6 -//.word 0x0501768a -//.word 0xe2510d74 -//.word 0x5b7b0d37 -//.word 0x0eb5a7d0 -//.word 0x4e156a20 -//.word 0xc9a20ba0 -//.word 0x67b16250 -//.word 0x756fb6f0 -//.word 0x02ba3a73 -//.word 0x8935d7b1 -//.word 0xd19b2c5c -//.word 0x1253d435 -//.word 0x5945e77f -//.word 0x2dedc3b4 -//.word 0x73ad0c78 -//.word 0x8f68f1cb -//.word 0xcc4cb182 -//.word 0xfeef5ef8 -//.word 0x669ee201 -//.word 0xd5f23f1f -//.word 0x14a31bf9 -//.word 0x84a17b08 -//.word 0x0261cf94 -//.word 0x0d752fdf -//.word 0x2b60e4a0 -//.word 0x88a82ab2 -//.word 0xe12d340e -//.word 0xa0b871f7 -//.word 0x49d70e74 -//.word 0x14e9bc03 -//.word 0xdc75b38c -//.word 0x37c0f694 -//.word 0xe79ed9b3 -//.word 0x7188c148 -//.word 0x0bef2c6b -//.word 0xbbd0f123 -//.word 0xbe89c8d9 -//.word 0x27eb0c0d -//.word 0xc890c048 -//.word 0x556ed152 -//.word 0xc7ad9aa4 -//.word 0xffb6ad20 -//.word 0xac8dd100 -//.word 0x6e60470d -//.word 0x3c605211 -//.word 0x03cff68e -//.word 0x8f5affb0 -//.word 0xafaa4581 -//.word 0x94362f5c -//.word 0x7b5b76a4 -//.word 0x8cae2bb5 -//.word 0x0191fc1b -//.word 0x8a04b303 -//.word 0xf0beffee -//.word 0xf97d77ad -//.word 0x8d9adc89 -//.word 0x16e09ec2 -//.word 0x2d9ea23b -//.word 0x72fb4373 -//.word 0xbb8a97b7 -//.word 0x721ef396 -//.word 0x38e0b196 -//.word 0xce9e3025 -//.word 0x36661dd2 -//.word 0x1554f1bd -//.word 0x5ca8bb4c -//.word 0x271b2020 -//.word 0xe674a048 -//.word 0xba561bb4 -//.word 0x225c93ec -//.word 0xd6683302 -//.word 0xf33790c4 -//.word 0x59393037 -//.word 0x51a04941 -//.word 0x74b7caa6 -//.word 0xc8769f36 -//.word 0x2b533144 -//.word 0xf55a2d59 -//.word 0xd980872a -//.word 0x0c35bec8 -//.word 0xa9386117 -//.word 0x55afd281 -//.word 0x1f774aeb -//.word 0xa9b91de8 -//.word 0x8dbe402d -//.word 0xfa040846 -//.word 0x9e913487 -//.word 0xc9872e44 -//.word 0xcff98e45 -//.word 0xaefde074 -//.word 0xf002a7d9 -//.word 0xd364a2c8 -//.word 0xa83e4d59 -//.word 0x7980ab19 -//.word 0xee4143ff -//.word 0x715668a2 -//.word 0x9123bea8 -//.word 0xa4b1fa82 -//.word 0xb101e957 -//.word 0x8da0b43d -//.word 0x437c62af -//.word 0xb9f69e3c -//.word 0x9138bb7c -//.word 0x4ec9f548 -//.word 0xb85efa2a -//.word 0x81f4a913 -//.word 0x281b194c -//.word 0x1e95ddaf -//.word 0x281f8617 -//.word 0x048f6a15 -//.word 0x4f1fa4e5 -//.word 0xa6095ca0 -//.word 0x0c5449b2 -//.word 0x8bed738f -//.word 0x1ef93ea2 -//.word 0xcf6aa486 -//.word 0x1dd0c279 -//.word 0xa072960e -//.word 0xf09e0722 -//.word 0xc23d2510 -//.word 0x54aab329 -//.word 0x0cc5e35e -//.word 0x5c436040 -//.word 0xe848912b -//.word 0xeb371dbd -//.word 0xd6c9aa8d -//.word 0x3b5ceb1a -//.word 0xea8ed902 -//.word 0x5a0b4075 -//.word 0x4aa37ee8 -//.word 0xa7a0870e -//.word 0xb1562d04 -//.word 0x5afb9fcc -//.word 0xeeb92ffc -//.word 0xf90258b7 -//.word 0x6624ffdd -//.word 0xe41df97f -//.word 0x8eb0ce96 -//.word 0xcab8bcf4 -//.word 0x71bdff7a -//.word 0x31c5508c -//.word 0x306cacc2 -//.word 0xf23756e0 -//.word 0x7d261f09 -//.word 0xbb88e52f -//.word 0x1f135ace -//.word 0x8b3406da -//.word 0x72a490f6 -//.word 0x3a3c39e6 -//.word 0xe40aa947 -//.word 0xeea4ee7d -//.word 0x78bcc2ee -//.word 0xa7f50c6e -//.word 0x47f5aaf9 -//.word 0xb4bc6ea8 -//.word 0xfa3466de -//.word 0x3b0961c2 -//.word 0x51baaef3 -//.word 0xb5f12777 -//.word 0x9f106ff4 -//.word 0x6f0c7722 -//.word 0x4c7e4780 -//.word 0x0bf7fb46 -//.word 0x52940b9b -//.word 0xfdd3d009 -//.word 0xc0a5442e -//.word 0x0ec50ab4 -//.word 0x3a47ae83 -//.word 0xdd742d34 -//.word 0x77d5b8c9 -//.word 0x598eb59c -//.word 0xc2ee0796 -//.word 0x48438fa1 -//.word 0x79f3f260 -//.word 0xc3c89d1d -//.word 0x918c0703 -//.word 0xb7d6368d -//.word 0x1023853e -//.word 0x6528a493 -//.word 0x9167e036 -//.word 0xe301a574 -//.word 0xc4cb41f1 -//.word 0x9aa3ea9a -//.word 0xec0503dc -//.word 0xc6d99b13 -//.word 0x5f8f3746 -//.word 0xf96ed111 -//.word 0x092920e2 -//.word 0x98b41a69 -//.word 0xe955b849 -//.word 0x5cfef914 -//.word 0x92da2976 -//.word 0xd22663b0 -//.word 0xab425548 -//.word 0xdb0843ff -//.word 0x705c4e04 -//.word 0x2d04f767 -//.word 0x2fbbdfd0 -//.word 0xd180d071 -//.word 0xcc340139 -//.word 0xa364964b -//.word 0x3e6467ae -//.word 0xd49d0246 -//.word 0x0f27f303 -//.word 0x6b9b4358 -//.word 0xe0223eef -//.word 0xc0d2799b -//.word 0xe23b148e -//.word 0x003c3dcc -//.word 0x5e1cf5df -//.word 0xacd517cc -//.word 0x2eb39647 -//.word 0x1a1e0623 -//.word 0x42b45e0c -//.word 0xf29cfc78 -//.word 0x1c16e9db -//.word 0xb2565f1a -//.word 0x54928843 -//.word 0x2b5a897b -//.word 0x1528bf38 -//.word 0x023848b0 -//.word 0x9e99c691 -//.word 0x30855ff2 -//.word 0xc1ee0989 -//.word 0x8259041f -//.word 0x68efa742 -//.word 0x19d1603a -//.word 0x0badf73e -//.word 0xea8f12e7 -//.word 0x3bf9fee4 -//.word 0x4035acf0 -//.word 0x1beafa01 -//.word 0x35ee34c2 -//.word 0xe15bdb44 -//.word 0x3de5a5f0 -//.word 0x596ac4c1 -//.word 0x9ccb6bb0 -//.word 0x63fb8f6f -//.word 0xea55eb59 -//.word 0x703346aa -//.word 0x96bcf8eb -//.word 0x09fdabb1 -//.word 0x603c5f87 -//.word 0x4888b129 -//.word 0xde955cf3 -//.word 0x5cc70098 -//.word 0xf88d2217 -//.word 0x09f074eb -//.word 0x6c6c5782 -//.word 0x26fe9ff1 -//.word 0x4a7e96e6 -//.word 0x1e2f43de -//.word 0x7995ec98 -//.word 0x6f86d9c9 -//.word 0x30845b11 -//.word 0x2e4a0d2e -//.word 0x7ea55a70 -//.word 0x81853f6c -//.word 0xc35452f5 -//.word 0x23860448 -//.word 0x35722387 -//.word 0xe460a369 -//.word 0x5ce39d2f -//.word 0x276998da -//.word 0x9510089b -//.word 0x62bb148b -//.word 0x93669c9c -//.word 0xa1b67bcf -//.word 0xd9d409a8 -//.word 0x037ce4e0 -//.word 0x4251f159 -//.word 0x3b749d57 -//.word 0x795469ec -//.word 0x10c8a5b4 -//.word 0x815b7bc3 -//.word 0xdee630dc -//.word 0x2f65a7e3 -//.word 0x13032795 -//.word 0xab775d77 -//.word 0xb393a50c -//.word 0xf21a854b -//.word 0xd5d37a50 -//.word 0x57dbf852 -//.word 0x233facd5 -//.word 0xfdca0421 -//.word 0x5e1cf1f2 -//.word 0x5efcec71 -//.word 0xd7f03763 -//.word 0xc80a65a1 -//.word 0xf7041cc8 -//.word 0xdb901a31 -//.word 0xb8e97624 -//.word 0x0cae2848 -//.word 0x2af0cc5e -//.word 0x258aa32f -//.word 0xefb0dbc3 -//.word 0xc2cb10d4 -//.word 0xbf841282 -//.word 0xd61fe949 -//.word 0xe50b162f -//.word 0x24b71c42 -//.word 0xc0a73f41 -//.word 0xc6c68c9a -//.word 0x43fe1994 -//.word 0xaa068ece -//.word 0x757be4e8 -//.word 0x0f336d80 -//.word 0xf2ce1560 -//.word 0x0c8de7f5 -//.word 0x6868d304 -//.word 0x0a5aae98 -//.word 0x1b007a3f -//.word 0x4662e875 -//.word 0x61111b61 -//.word 0x5072afbf -//.word 0x2659fa1e -//.word 0x8ed9914b -//.word 0x6a5b0e0d -//.word 0xb9ee1112 -//.word 0xbede852a -//.word 0x5f8825b3 -//.word 0xcb6c3e54 -//.word 0x5f84b6ef -//.word 0xcbd54dd0 -//.word 0x7043232b -//.word 0x0da97bc5 -//.word 0x9b29bef1 -//.word 0x75c1c3be -//.word 0xbc1f4d6f -//.word 0xfab7d52b -//.word 0x05128af6 -//.word 0x276997e0 -//.word 0x7b72a47c -//.word 0x9a7a9f94 -//.word 0x77b4bc1b -//.word 0x88d1ba63 -//.word 0x27d06991 -//.word 0x3718694d -//.word 0x0ac434be -//.word 0x823e5eb5 -//.word 0x770f1c28 -//.word 0x59f504e3 -//.word 0x1736137a -//.word 0x3f35f482 -//.word 0x66437f00 -//.word 0xcab78122 -//.word 0x3641bb2d -//.word 0x267b2db7 -//.word 0x2cc19416 -//.word 0x92433118 -//.word 0x4158ccf5 -//.word 0xe116f981 -//.word 0x421f9aa6 -//.word 0xfbbda512 -//.word 0x5132272d -//.word 0x5a49894e -//.word 0x6231122e -//.word 0x8d8bae9d -//.word 0xbec2ee73 -//.word 0xb89b4fca -//.word 0x830dbf6a -//.word 0x12525d85 -//.word 0x223e81a5 -//.word 0x65d0fce2 -//.word 0xe007a158 -//.word 0x91f604d8 -//.word 0x561b81de -//.word 0x0aed80c3 -//.word 0xf1b4f834 -//.word 0x569d32e3 -//.word 0x720ed07c -//.word 0x90370ddb -//.word 0x6fea467c -//.word 0xe8acba33 -//.word 0xd00c8e1d -//.word 0x203314d6 -//.word 0x53bd4cec -//.word 0x10c7ab94 -//.word 0x09491c9c -//.word 0x23a745a1 -//.word 0xd7820b82 -//.word 0xd8d45814 -//.word 0xf63c1b18 -//.word 0x4296916a -//.word 0x73cfc47b -//.word 0x88f75100 -//.word 0xaf986dec -//.word 0x66472a9c -//.word 0xe078f752 -//.word 0xaa9766e5 -//.word 0x8e5433b7 -//.word 0xb83e81e6 -//.word 0x179366c7 -//.word 0x0656aa90 -//.word 0x2ca3cc54 -//.word 0xa0404635 -//.word 0x517412d5 -//.word 0xa61c6d0d -//.word 0x61fbdbe2 -//.word 0xc9526bb4 -//.word 0x08b03cb9 -//.word 0xd20c40aa -//.word 0x471140bc -//.word 0x1bb921d2 -//.word 0xf41d65f1 -//.word 0x138cf5f4 -//.word 0x37da1d81 -//.word 0xbefad83b -//.word 0x0ecf4e39 -//.word 0x33409bb8 -//.word 0xc98bd20c -//.word 0x1ddb41dd -//.word 0x8f1cf78f -//.word 0x3b0e8402 -//.word 0xd898007c -//.word 0xdf604fe3 -//.word 0xf098a230 -//.word 0x731b4120 -//.word 0x7bb8892c -//.word 0xefcd30bc -//.word 0xeb18d198 -//.word 0x64cba49f -//.word 0x0bde8cbb -//.word 0x74a95814 -//.word 0x78b24284 -//.word 0xd8c4bc4c -//.word 0x22416d05 -//.word 0xd9b876d9 -//.word 0xd0baf9f2 -//.word 0xd7eadc33 -//.word 0x9954ca26 -//.word 0xc5007b36 -//.word 0x6cc6361f -//.word 0xab6394a2 -//.word 0x89cd867d -//.word 0x22c4999a -//.word 0x06aa7987 -//.word 0xdc94b426 -//.word 0x4ba1c1a6 -//.word 0x1a8b41b1 -//.word 0x957b84e7 -//.word 0x33224f8c -//.word 0x7705dd7d -//.word 0x14182369 -//.word 0x548f593d -//.word 0xbaf1b5e0 -//.word 0xe76e7a21 -//.word 0xba7231ee -//.word 0xbb7a36c6 -//.word 0xba277770 -//.word 0xb39079ee -//.word 0xf5dd9cad -//.word 0x83129ffe -//.word 0xbb2866ca -//.word 0x3562fb80 -//.word 0xeeded453 -//.word 0xa66b54a3 -//.word 0x869a93b8 -//.word 0x061862b6 -//.word 0x0e3a8acd -//.word 0x5bda55b1 -//.word 0x2562504a -//.word 0xff264eac -//.word 0xfef7b049 -//.word 0x1df4e465 -//.word 0xe0a42ccb -//.word 0x3842a1bf -//.word 0xa7587733 -//.word 0xa490823e -//.word 0x41c6f9c9 -//.word 0x0b617b8c -//.word 0x32e44f39 -//.word 0xeac0f0f6 -//.word 0x106dc911 -//.word 0x11b83def -//.word 0x085fea46 -//.word 0x26db2f8c -//.word 0x577debb0 -//.word 0x22bc8807 -//.word 0xd1ce3989 -//.word 0xd3757f3d -//.word 0x5e1cf2f2 -//.word 0x59223e30 -//.word 0x78766c6e -//.word 0xa9646385 -//.word 0xafaeae65 -//.word 0x0cdf7f07 -//.word 0x25dcf4a3 -//.word 0xa1bc9a22 -//.word 0x12d930d6 -//.word 0xd727ad69 -//.word 0x41c58413 -//.word 0xf4d22610 -//.word 0x9082c852 -//.word 0x91716773 -//.word 0x74370aed -//.word 0x1c3c488d -//.word 0x73ce0925 -//.word 0x54709182 -//.word 0xa975ba9d -//.word 0xd0ce8015 -//.word 0x4421c3dd -//.word 0x791b4932 -//.word 0x070603d1 -//.word 0x0b9e9166 -//.word 0xca200747 -//.word 0x98a5f262 -//.word 0xf9ae9675 -//.word 0x05007a7d -//.word 0x11b22770 -//.word 0x8b842c2e -//.word 0x267265b5 -//.word 0x37897d95 -//.word 0x5ffab2a5 -//.word 0x6b6dd8f3 -//.word 0x7897a101 -//.word 0x5b0f1b2e -//.word 0x405d7a72 -//.word 0x9054184e -//.word 0x19a3ba03 -//.word 0x69a61503 -//.word 0x7a8291a5 -//.word 0x95704c1c -//.word 0x705962aa -//.word 0x9aa46c11 -//.word 0x184c464b -//.word 0x5135167a -//.word 0x27c08922 -//.word 0x679d6096 -//.word 0x63e02cb0 -//.word 0xdd5755c5 -//.word 0x271b61d8 -//.word 0x8966730e -//.word 0xe3a41262 -//.word 0x93cd2c9a -//.word 0x99f15b7a -//.word 0xf9156637 -//.word 0x613d0b2f -//.word 0x0ccafcd6 -//.word 0xe60627f4 -//.word 0xf1fe3a0e -//.word 0xe7906721 -//.word 0x21c46597 -//.word 0xb760b773 -//.word 0xe9b630cf -//.word 0xbec1b788 -//.word 0xea704838 -//.word 0xf5423b64 -//.word 0x9a13c9f7 -//.word 0x6e36ccef -//.word 0xc2c3c657 -//.word 0xc9322575 -//.word 0xfe29c544 -//.word 0xc093b725 -//.word 0x3ff241d1 -//.word 0x9cf62592 -//.word 0x4c4e26b3 -//.word 0xbebec934 -//.word 0x3d7259c3 -//.word 0x17922de8 -//.word 0xff162e80 -//.word 0xb0dc936c -//.word 0xd3f7ef8a -//.word 0x234b6ee4 -//.word 0xcf575b28 -//.word 0x1f51e659 -//.word 0x5b7825c3 -//.word 0xe9a65834 -//.word 0xb5247169 -//.word 0xd6c3d4c7 -//.word 0x6e285b4c -//.word 0xd1689dc4 -//.word 0xead57040 -//.word 0xdb17acc4 -//.word 0xe47e3240 -//.word 0x86962dc1 -//.word 0xe8fc98e9 -//.word 0x7971019d -//.word 0xd72d8cfd -//.word 0xf0753a99 -//.word 0x67706be1 -//.word 0x3937a2de -//.word 0xa02b8920 -//.word 0x378b35f8 -//.word 0x5f46aae7 -//.word 0xe20da255 -//.word 0xd7ad8a86 -//.word 0xc69ccecb -//.word 0x0cd156f5 -//.word 0x80d9510f -//.word 0x5628314d -//.word 0x44adf63f -//.word 0xe4a9b04a -//.word 0x5ac03f59 -//.word 0x36515ed0 -//.word 0x9c03e0c2 -//.word 0xa2a03863 -//.word 0xf9273fc0 -//.word 0xd01c32ad -//.word 0xf523faff -//.word 0x3dcdb1fc -//.word 0x27b26110 -//.word 0xbcc00fc2 -//.word 0xb9d2f8e5 -//.word 0xf0841a13 -//.word 0xec46f657 -//.word 0xd4b0952a -//.word 0x9116c9a1 -//.word 0x335bb5e4 -//.word 0x910a8fe2 -//.word 0x30a2a543 -//.word 0x67329e9e -//.word 0xc02603ed -//.word 0xa061fe3e -//.word 0x2b8c61ab -//.word 0x62ade98b -//.word 0x8efbc5ea -//.word 0xe2f15237 -//.word 0x5ca1293d -//.word 0xec4b5b55 -//.word 0xd82efbd9 -//.word 0x5f9edddb -//.word 0x9d579e17 -//.word 0xae11e427 -//.word 0x1654e7f6 -//.word 0x608e3177 -//.word 0x0663a297 -//.word 0x9144b670 -//.word 0x01430bbf -//.word 0x6f251d98 -//.word 0xf1b95458 -//.word 0xbe6942dc -//.word 0x930f25f0 -//.word 0x550ab40a -//.word 0xf7901839 -//.word 0x9e453858 -//.word 0x030d3987 -//.word 0x191f45dc -//.word 0xf15c8c55 -//.word 0xdade8911 -//.word 0xccd387c0 -//.word 0x078c6359 -//.word 0xf7d1930b -//.word 0x5b786775 -//.word 0xa6368f19 -//.word 0xa5b4de0e -//.word 0x63e54ef6 -//.word 0x4a984330 -//.word 0x8a49144f -//.word 0xbf3dc7ca -//.word 0xcece1cf4 -//.word 0x0f03ce2f -//.word 0xb263155d -//.word 0x5b0b6f98 -//.word 0x10ffa023 -//.word 0x55bef7a0 -//.word 0x9519d483 -//.word 0xc44467c6 -//.word 0x432ebadf -//.word 0x040ef2ef -//.word 0xee3ed23c -//.word 0x834d80e1 -//.word 0xc0508cc4 -//.word 0x44782ec9 -//.word 0xb5eacf45 -//.word 0x60cacbb6 -//.word 0x1f9976b1 -//.word 0x80c25d1b -//.word 0x236fce9c -//.word 0x64a19a51 -//.word 0x3a8019c1 -//.word 0x5ff06f13 -//.word 0xb2640e7e -//.word 0xd9f77c00 -//.word 0x2ab95753 -//.word 0xcc46961d -//.word 0x199e1167 -//.word 0x47304450 -//.word 0x48384f02 -//.word 0xee4b42e6 -//.word 0x53309814 -//.word 0x78f2010e -//.word 0x2c3365ad -//.word 0x30c3255b -//.word 0x9872a483 -//.word 0x74220646 -//.word 0xb0203770 -//.word 0x39b42faa -//.word 0x61f675f1 -//.word 0x85e4e246 -//.word 0xedb2a8a7 -//.word 0xf361933f -//.word 0x68938eda -//.word 0x339e689b -//.word 0x3bdfd8f1 -//.word 0x8851bfc7 -//.word 0xa55daefb -//.word 0x48f4a812 -//.word 0x34dc292a -//.word 0x5f47662f -//.word 0x50aad752 -//.word 0xccccf3b7 -//.word 0xb11e3b6e -//.word 0x224a79a5 -//.word 0xe40e4a1c -//.word 0x084bdad9 -//.word 0xcb59ef1c -//.word 0xba9e2995 -//.word 0x1a5f88d5 -//.word 0x86d52e03 -//.word 0xda8466d0 -//.word 0x50c8e6ac -//.word 0xe9b1513b -//.word 0x0f100002 -//.word 0x78d20267 -//.word 0x4d8d61d8 -//.word 0x8c59a74a -//.word 0xabe1a1e5 -//.word 0x7eba63fd -//.word 0x5af38c45 -//.word 0x7bedcc3f -//.word 0xa36ca3f7 -//.word 0x04ef6bf1 -//.word 0x603d9860 -//.word 0x6f413f98 -//.word 0x8117d5c6 -//.word 0x64673adf -//.word 0x88f2f5d6 -//.word 0x616ac212 -//.word 0x0d874a1f -//.word 0x375731a4 -//.word 0x3bd65595 -//.word 0x8abe55a9 -//.word 0x51a0510f -//.word 0x5534f15d -//.word 0x21eea9c9 -//.word 0x64d13b9b -//.word 0x95887de2 -//.word 0xd8b35c66 -//.word 0x257f21df -//.word 0xa779f364 -//.word 0x62a49d26 -//.word 0x19c8925e -//.word 0x6f0e2e84 -//.word 0x4cca3fc2 -//.word 0x8298c4a8 -//.word 0xb1aaf521 -//.word 0x686083a6 -//.word 0x8c1920b1 -//.word 0xfe4a4275 -//.word 0x78cd24cc -//.word 0xb87b0e71 -//.word 0xe1fcd76f -//.word 0x1edea8d9 -//.word 0x88e502bc -//.word 0x4aa20352 -//.word 0x0247e578 -//.word 0x6bbac762 -//.word 0x3ae8b08e -//.word 0x455cd1f6 -//.word 0xea100a8a -//.word 0xaf83b0dd -//.word 0x260b8e1f -//.word 0x146d294b -//.word 0xd1ab49a1 -//.word 0xf21db457 -//.word 0x26c33d8c -//.word 0x5edafd7d -//.word 0x31ade1fb -//.word 0x7eae651d -//.word 0x53c59e32 -//.word 0x0de87ef9 -//.word 0xc1ec5415 -//.word 0xdb9b92bb -//.word 0x0506d3ae -//.word 0x4b1d1c6d -//.word 0x7c7c62aa -//.word 0xd3884dff -//.word 0xd6bb3cdd -//.word 0x7f3c89c5 -//.word 0x9ab30eba -//.word 0x6e5be8f6 -//.word 0x9f597adc -//.word 0x534cb52e -//.word 0x94259780 -//.word 0xf639f2ec -//.word 0x79946f08 -//.word 0xb090d215 -//.word 0x23a78079 -//.word 0xf3863e70 -//.word 0xbc623bfe -//.word 0xbf8f5128 -//.word 0x414f8863 -//.word 0x2ee8dc4d -//.word 0x02f9409b -//.word 0xe90de252 -//.word 0x2571b13b -//.word 0xb1431d90 -//.word 0x24cc1dfc -//.word 0xd71077c3 -//.word 0x4aa23c3c -//.word 0xc4bd9188 -//.word 0x3a91b57e -//.word 0x72db40e5 -//.word 0x69b8a9e6 -//.word 0xf1bb0bc0 -//.word 0x9e3d29be -//.word 0xe3f4af67 -//.word 0x79c8bbf4 -//.word 0x00e19b07 -//.word 0xe905d999 -//.word 0x93217434 -//.word 0xb4257163 -//.word 0xfb159268 -//.word 0xf45d662c -//.word 0x2b66827c -//.word 0x94660d71 -//.word 0x2a7c8230 -//.word 0xd7fcb1d4 -//.word 0x940807a9 -//.word 0xd160109b -//.word 0x177a3aee -//.word 0xecd6dc2f -//.word 0xf78c766a -//.word 0x64273b9d -//.word 0x8ab5cc6d -//.word 0xcb1f4718 -//.word 0xbcb780ab -//.word 0x86108e75 -//.word 0x8d128abb -//.word 0x4f4d93ad -//.word 0x8e8e1599 -//.word 0xb1b04b5f -//.word 0x68b50325 -//.word 0x8f16a24b -//.word 0x555667a1 -//.word 0x9dddf4d8 -//.word 0xa4040a37 -//.word 0xe46d948f -//.word 0x3995e771 -//.word 0x43ac489e -//.word 0x0ba4aebf -//.word 0xe988ca57 -//.word 0xa50f45f5 -//.word 0xdc7149ae -//.word 0xa57942ca -//.word 0x75dbe6be -//.word 0x40c9735b -//.word 0xe1c13744 -//.word 0xbca956a5 -//.word 0xa21dc822 -//.word 0xf508a10e -//.word 0x0c7195de -//.word 0xd898bbdd -//.word 0xc8429121 -//.word 0xeb5141bd -//.word 0x55972238 -//.word 0xc3ec823e -//.word 0x827ea396 -//.word 0x8c690354 -//.word 0xf588e050 -//.word 0x858afcd6 -//.word 0xa7489e9f -//.word 0x8155d900 -//.word 0x65d71062 -//.word 0x6896baf2 -//.word 0x5053639a -//.word 0xb45bf32f -//.word 0x5e5c33ec -//.word 0xf4768d1f -//.word 0xd8951422 -//.word 0x4cffc48d -//.word 0xda290aaa -//.word 0xf3cf8729 -//.word 0xd6431115 -//.word 0xb306fa07 -//.word 0x1095959a -//.word 0x6d85f71e -//.word 0x23d2fb91 -//.word 0x927589cb -//.word 0x7b3417f8 -//.word 0xabbe6f4b -//.word 0xdaf7b3f1 -//.word 0xd2919f44 -//.word 0xd4dc0f42 -//.word 0x37dfc13d -//.word 0x52a75bd3 -//.word 0x9cdfb021 -//.word 0x12a13f34 -//.word 0xd98cfcc0 -//.word 0x25175415 -//.word 0x59246b4e -//.word 0x70d9a8cc -//.word 0x9bab73e3 -//.word 0x2bbb3dd2 -//.word 0xb266c1f9 -//.word 0x65178a46 -//.word 0xc560b6f1 -//.word 0x7f4af969 -//.word 0x90e9e58e -//.word 0xac336820 -//.word 0xe1128000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00013330 -//// expected output -//.word 0xd0eb914e -//.word 0x0164d7b2 -//.word 0x72e0b8bd -//.word 0x16c18bb3 -//.word 0x11fa528d -//.word 0xb3e31c84 -//.word 0x025f2596 -//.word 0x41921649 -//.word 0xc222ba1b -//.word 0xe6a20543 -//.word 0x9cc07bf4 -//.word 0x4b8faa02 -//.word 0xc73caf3a -//.word 0xf31776cd -//.word 0xdef89e8e -//.word 0x05c11a5f -//// SHA512LongMsgvector_99 -//// vector length -//.word 0x00013648 -//// input message -//.word 0x78c5626c -//.word 0x5f3fa6cf -//.word 0xecba132e -//.word 0x1896998c -//.word 0x6e8927ea -//.word 0x7742c20e -//.word 0x754cd483 -//.word 0x5336c6e1 -//.word 0xddf1d04f -//.word 0x2d791045 -//.word 0x65b7da97 -//.word 0xa4a750af -//.word 0x32b63219 -//.word 0xfe6ef746 -//.word 0x4b541c89 -//.word 0xa611bc66 -//.word 0x1bd1610c -//.word 0xa8e91a20 -//.word 0xf2bccdbc -//.word 0x37dfcfb8 -//.word 0x847bb228 -//.word 0x28f35e25 -//.word 0x68c763d1 -//.word 0x74b98e95 -//.word 0x9a2ebbad -//.word 0xbad6e9e7 -//.word 0xfa8f94a7 -//.word 0xba873f2f -//.word 0xcba1501d -//.word 0xdb1b2035 -//.word 0x346d5361 -//.word 0xa77465f6 -//.word 0xc2cf8639 -//.word 0x4a8aa822 -//.word 0xe5f9d660 -//.word 0x16e7c79c -//.word 0x6ef1b302 -//.word 0x012c65fe -//.word 0x180e9243 -//.word 0x258b6912 -//.word 0xfc7e6bb9 -//.word 0x3f4b7d5a -//.word 0x1ac23bed -//.word 0x31479088 -//.word 0xd73083de -//.word 0x816f5407 -//.word 0x7a71c87f -//.word 0xd846c170 -//.word 0xae011134 -//.word 0x83629015 -//.word 0x03b26d58 -//.word 0xf5efc17b -//.word 0x6d296aba -//.word 0x432c16d8 -//.word 0xc35f9e1b -//.word 0xa6ec9699 -//.word 0x422122b2 -//.word 0xfd170ade -//.word 0x079111a9 -//.word 0x492683fb -//.word 0x98a30e9d -//.word 0x2fabd2f9 -//.word 0x5ca0bb21 -//.word 0x79c70f13 -//.word 0x1ea6433c -//.word 0x95b1133a -//.word 0x8e26d2e6 -//.word 0x1436fe92 -//.word 0xc065178f -//.word 0x2d33b1f3 -//.word 0xabfcc998 -//.word 0x381d5568 -//.word 0xac581ed8 -//.word 0x337ad2b3 -//.word 0x003a5519 -//.word 0x406559c7 -//.word 0x4d382e99 -//.word 0x250ddb4c -//.word 0x1a3b6d89 -//.word 0xcb378f1f -//.word 0x52ff5b91 -//.word 0xbfb870d0 -//.word 0xc6954549 -//.word 0xb4fcbd22 -//.word 0xa7e4fbc1 -//.word 0xff82778f -//.word 0x102451fb -//.word 0x195de6c1 -//.word 0x7a62a26c -//.word 0x21b41519 -//.word 0x46ff487f -//.word 0x5842512c -//.word 0x37312511 -//.word 0xa3d8ae41 -//.word 0xf5801df6 -//.word 0x0cd682d5 -//.word 0x8b4a9973 -//.word 0x42b6e717 -//.word 0xe94006c2 -//.word 0x14813e6c -//.word 0x63e75591 -//.word 0xf957a7ec -//.word 0x30177983 -//.word 0x8bec8ae3 -//.word 0xed7febad -//.word 0x08051151 -//.word 0x171f291a -//.word 0xd0ffab6b -//.word 0x94cd3248 -//.word 0xea498b17 -//.word 0x2bb10ba8 -//.word 0x7fe52674 -//.word 0x07c93e22 -//.word 0x5cebb950 -//.word 0x3966568f -//.word 0x7406c1af -//.word 0x33ac653e -//.word 0x5cf4814b -//.word 0x4d167e6f -//.word 0xce0a800f -//.word 0x43f03bdb -//.word 0x27ae089a -//.word 0xb5db372a -//.word 0xe8dca7c2 -//.word 0xa64c957b -//.word 0x38a2b20f -//.word 0xfe0d78e0 -//.word 0x61a3bd3c -//.word 0x08bb89df -//.word 0x4f9725b9 -//.word 0xf54774f2 -//.word 0x14c9862c -//.word 0x57756b08 -//.word 0x679945eb -//.word 0xa660a102 -//.word 0x20f80883 -//.word 0xbff3d036 -//.word 0xbeee3835 -//.word 0x5f71b5f0 -//.word 0xe1178673 -//.word 0xacef8eec -//.word 0xd0216367 -//.word 0xadd5a3dd -//.word 0xf350876d -//.word 0xce60bae9 -//.word 0x5afb6b94 -//.word 0x5d23a12a -//.word 0x350cce21 -//.word 0x0f81a82f -//.word 0x5a84340c -//.word 0x7c352379 -//.word 0xc3f56281 -//.word 0x9ecaedff -//.word 0x0d05e460 -//.word 0x5623e0aa -//.word 0xfaf287bd -//.word 0xe7f55eda -//.word 0xef08df61 -//.word 0x7947ccdf -//.word 0x762dc247 -//.word 0x97f91180 -//.word 0xbd56cb20 -//.word 0xb23a1b78 -//.word 0x160fd8d0 -//.word 0x9c115af3 -//.word 0x76f78def -//.word 0x0dd54316 -//.word 0xf641cf48 -//.word 0x21b5cf75 -//.word 0x5434495d -//.word 0xd830fa9a -//.word 0x73aceae1 -//.word 0x969e4485 -//.word 0xd697653c -//.word 0xa0a53326 -//.word 0x2979b00b -//.word 0xa5c5cfe5 -//.word 0xb9e8869e -//.word 0x32cd241a -//.word 0xf710e578 -//.word 0x3c63c395 -//.word 0xf93190d2 -//.word 0x9b814218 -//.word 0xf91c8e19 -//.word 0x89f2b8d8 -//.word 0xd4baa96b -//.word 0x27d942ff -//.word 0x8c85f01e -//.word 0xf82a802d -//.word 0xc60c3539 -//.word 0x642f18f3 -//.word 0x4d7490f8 -//.word 0x37043256 -//.word 0x8df1da4c -//.word 0x1f1bfb52 -//.word 0x19513359 -//.word 0x31b92354 -//.word 0x25727df7 -//.word 0x65775ebf -//.word 0x0cc7df32 -//.word 0x15c3e768 -//.word 0xccd743ca -//.word 0x825cf81a -//.word 0x85bdd7b4 -//.word 0x50d95313 -//.word 0xfea99096 -//.word 0x0523bc84 -//.word 0x205ea24f -//.word 0x8df67c15 -//.word 0x79b2096c -//.word 0xb964e05f -//.word 0xba1104b4 -//.word 0xbb52b871 -//.word 0x39fa959e -//.word 0xabf9d94b -//.word 0x708102d5 -//.word 0x06679c66 -//.word 0x7ccb57bb -//.word 0x2afb5c2a -//.word 0x9f95e1e3 -//.word 0xdbecfb76 -//.word 0xbfadb495 -//.word 0xc1c35e1b -//.word 0xe477274e -//.word 0xe8dced61 -//.word 0xbd6a533e -//.word 0x3ee91482 -//.word 0x1c9197c8 -//.word 0x186fc42a -//.word 0x760a1705 -//.word 0xae47f2fd -//.word 0x648a3841 -//.word 0x9a1e1710 -//.word 0x25d7257d -//.word 0x5df5af6f -//.word 0x194c4deb -//.word 0xdba2ba96 -//.word 0x4759e375 -//.word 0xda4e3ef8 -//.word 0xd8005d37 -//.word 0x86f5c37b -//.word 0x9a59f600 -//.word 0xf0e9d6f9 -//.word 0x7e0f2cd5 -//.word 0x8a4e86c1 -//.word 0x1ae1436e -//.word 0xad9fea14 -//.word 0x2822c0b7 -//.word 0x132899a9 -//.word 0x0539ee50 -//.word 0x5d8b3029 -//.word 0x33225c0d -//.word 0x8f3bd0b3 -//.word 0xd8eb5d77 -//.word 0x8f049d59 -//.word 0x3d388649 -//.word 0xa98140a2 -//.word 0x4fc034f4 -//.word 0x0ea46606 -//.word 0x21cd041b -//.word 0x50313f75 -//.word 0x67bf5918 -//.word 0xe843ffd0 -//.word 0xfd8ada75 -//.word 0xb0c6616e -//.word 0x5e33f174 -//.word 0x69fb1f98 -//.word 0x2e584d88 -//.word 0x37f87b0e -//.word 0xb1a560d9 -//.word 0x2025b980 -//.word 0x515fe2c4 -//.word 0x90c0a316 -//.word 0x1cdd4c59 -//.word 0xd85a04e8 -//.word 0x430a5edb -//.word 0xaa572d86 -//.word 0x9de59a43 -//.word 0x9f727372 -//.word 0x2101c6bd -//.word 0xb237afa1 -//.word 0x70056e29 -//.word 0xc287bcfd -//.word 0x492c609c -//.word 0x1318fde6 -//.word 0x12c62edd -//.word 0xcdf2d4ac -//.word 0x56b6afe9 -//.word 0x7cf32c17 -//.word 0x41f27e6f -//.word 0x8f4bf0e0 -//.word 0x26067a54 -//.word 0xd9019235 -//.word 0xfa91442f -//.word 0x136c8538 -//.word 0xd6c7c5ce -//.word 0x57bbc380 -//.word 0x79eda5b0 -//.word 0xa66e4897 -//.word 0xc4e0d58a -//.word 0x64db957b -//.word 0x3c8f06c2 -//.word 0xd7aa2e1e -//.word 0x8b7c2ff6 -//.word 0xac581ce5 -//.word 0xff3e0b76 -//.word 0x71b86b2c -//.word 0x090298c6 -//.word 0x1c6dadc0 -//.word 0xc0059a1d -//.word 0x82727664 -//.word 0x5c1c16e9 -//.word 0xe193de4d -//.word 0xbb2dd748 -//.word 0x57f102a6 -//.word 0xdfb3ec90 -//.word 0x6981830d -//.word 0x6e3e28c9 -//.word 0x7d8d0514 -//.word 0x30f1a12d -//.word 0x6032b1c1 -//.word 0x950232af -//.word 0xc0e0b40e -//.word 0x2d3df971 -//.word 0xb3ddbe69 -//.word 0x2e81d94c -//.word 0x2fc38435 -//.word 0xf141f94c -//.word 0x8ffd3f48 -//.word 0x75044332 -//.word 0x144e2a6b -//.word 0xdbe6e6f0 -//.word 0x624a07dd -//.word 0xe815d430 -//.word 0xffdb9bd0 -//.word 0x865545ce -//.word 0xd8be2dea -//.word 0x437c3359 -//.word 0xbc030cc5 -//.word 0xd0f7dc96 -//.word 0xde900670 -//.word 0x844342fc -//.word 0x579ff1ec -//.word 0xd775ae39 -//.word 0xa23b26af -//.word 0xe7b229ac -//.word 0x1ec70125 -//.word 0xf6b702e9 -//.word 0x8f77622a -//.word 0xea534b39 -//.word 0x9ed52f91 -//.word 0xcce85c17 -//.word 0x543dd0a0 -//.word 0x49ee4eb4 -//.word 0xa362b192 -//.word 0x34708173 -//.word 0xdec7c413 -//.word 0x028d166e -//.word 0x3b46fcc7 -//.word 0x4df876ef -//.word 0x588cd3c4 -//.word 0x5278c9f8 -//.word 0xb39bc514 -//.word 0x726880bc -//.word 0x3147d334 -//.word 0xb538cc23 -//.word 0x98ba0197 -//.word 0x42eb244a -//.word 0x15f0d824 -//.word 0xe897c300 -//.word 0xb73be5b3 -//.word 0x98e9284a -//.word 0xf1c03894 -//.word 0xe99e94e1 -//.word 0x1cf9e608 -//.word 0x930a90af -//.word 0xf33187c6 -//.word 0xf4956455 -//.word 0x150bb878 -//.word 0x8f39a0a7 -//.word 0x87fb9a3b -//.word 0x8705972e -//.word 0x2fca5223 -//.word 0x289ddfa6 -//.word 0x5a1687b4 -//.word 0x5fb8d37e -//.word 0x37d0e76a -//.word 0x3da0115b -//.word 0x59bda232 -//.word 0x78b6fd95 -//.word 0x39f6edef -//.word 0xe9ec3cb7 -//.word 0xb26981f6 -//.word 0x0f493903 -//.word 0x83551991 -//.word 0x8b68a3ec -//.word 0xd1d1f880 -//.word 0xa2f9ed9b -//.word 0xa2466074 -//.word 0xbf3ecd6b -//.word 0x63f01c92 -//.word 0xee8fbd6d -//.word 0x6361f7f6 -//.word 0x61d77de4 -//.word 0x56fe432d -//.word 0xef168fca -//.word 0xd37f53ba -//.word 0x90ddba49 -//.word 0xd5740192 -//.word 0xe3d48843 -//.word 0x3ebb29a0 -//.word 0xa837c8cb -//.word 0x4f0b2b42 -//.word 0x46540ca9 -//.word 0x326c6dca -//.word 0x460f2cda -//.word 0x71bcd7fd -//.word 0xd55ec10d -//.word 0x7c2c5697 -//.word 0x46ceab27 -//.word 0x26c15ac6 -//.word 0x8efc8cc0 -//.word 0x28d457ab -//.word 0xc71d4ba4 -//.word 0x9d9247dc -//.word 0xae779154 -//.word 0x847c26e4 -//.word 0x25e54f82 -//.word 0x42e875c1 -//.word 0xb1563698 -//.word 0x1e7eb965 -//.word 0xfd4f3e31 -//.word 0xc2bcf936 -//.word 0x5565209e -//.word 0xc073438e -//.word 0x2bc3dc63 -//.word 0x0b48273c -//.word 0x96aa33b8 -//.word 0x7a333901 -//.word 0xceec2e09 -//.word 0x49039413 -//.word 0xb2709576 -//.word 0x97d8529d -//.word 0x42b27953 -//.word 0xe9a8153d -//.word 0x2540aba8 -//.word 0xa5bb8286 -//.word 0x243e42b2 -//.word 0x982fc17c -//.word 0xade21961 -//.word 0x7175fe1a -//.word 0x51f84ed9 -//.word 0x44d1eacf -//.word 0x465fc5f1 -//.word 0x08de3afc -//.word 0xe68ba3b6 -//.word 0x19082777 -//.word 0x2e01d3e9 -//.word 0xb610ec0c -//.word 0x40de847d -//.word 0x848c4cf7 -//.word 0xe151a91a -//.word 0x0a640a6b -//.word 0xfc1c789d -//.word 0x33556f0f -//.word 0x1d17ec95 -//.word 0xcf72c77b -//.word 0xf7ac43c7 -//.word 0x119fe4bf -//.word 0xde5c80ab -//.word 0x121499dc -//.word 0x4d39eaed -//.word 0x4de04049 -//.word 0x626a8bed -//.word 0x22633570 -//.word 0x5daab240 -//.word 0x54d2592e -//.word 0x25c9722d -//.word 0x8ab79056 -//.word 0xc3292130 -//.word 0xd16f432f -//.word 0xe542d97a -//.word 0x18abdef1 -//.word 0x5c20fa6f -//.word 0xb3ef534c -//.word 0x9fe0a627 -//.word 0xd91596e2 -//.word 0x453644ed -//.word 0x26cb1fc8 -//.word 0x8fe9fec3 -//.word 0x1a116c09 -//.word 0xdb5542dc -//.word 0x97bc7c22 -//.word 0x32e84521 -//.word 0x67f65487 -//.word 0xbca67bad -//.word 0xb4bc7d1c -//.word 0x46a62151 -//.word 0x8e5e84bd -//.word 0xc392b310 -//.word 0x690379b7 -//.word 0xc72b76a3 -//.word 0x9c22714d -//.word 0x0ec2f0f7 -//.word 0xe30a0534 -//.word 0xf3c06aaa -//.word 0xdd5ad017 -//.word 0xfa1f7592 -//.word 0x8f8af514 -//.word 0x47ef6236 -//.word 0xe060963c -//.word 0x24d2c853 -//.word 0x1b7c5e17 -//.word 0x7f800258 -//.word 0x70cdf81e -//.word 0x6944afea -//.word 0x731a963f -//.word 0x987d3061 -//.word 0x9b7a6b5d -//.word 0xe61e2e49 -//.word 0xc4db31cd -//.word 0xd02e11e3 -//.word 0xae7fa4da -//.word 0xf8498aa1 -//.word 0x7b7a0442 -//.word 0xa41d09ad -//.word 0x353697b7 -//.word 0x3ced4862 -//.word 0x46ef255f -//.word 0xd012bed1 -//.word 0xfe387b54 -//.word 0x90752d3e -//.word 0x1174e825 -//.word 0x511615a1 -//.word 0x165dc352 -//.word 0x0f893e25 -//.word 0x0980e3d4 -//.word 0x657332ac -//.word 0xcabf2593 -//.word 0x1711c049 -//.word 0x9cceeaee -//.word 0x89b27bc5 -//.word 0xa6b79637 -//.word 0x4538391b -//.word 0x76561234 -//.word 0x799b95fb -//.word 0x79dd4b9f -//.word 0x77656d4b -//.word 0x8451b1a7 -//.word 0x333764a1 -//.word 0x4e0bb96d -//.word 0xc84361ca -//.word 0xf3385b88 -//.word 0xf3d00e47 -//.word 0x735a9581 -//.word 0x96b95acb -//.word 0x30c5e657 -//.word 0x37eef7be -//.word 0x7423d3fc -//.word 0x7ef2ddbc -//.word 0xe9f066d7 -//.word 0xbb5bc517 -//.word 0x1ffeaa40 -//.word 0x5e55af51 -//.word 0x0af23007 -//.word 0x7d1f5da3 -//.word 0x82c58ded -//.word 0x518cd679 -//.word 0xc144da29 -//.word 0xb984e3f3 -//.word 0xe79033e4 -//.word 0xb5809565 -//.word 0x799f38be -//.word 0xec12bdd8 -//.word 0xdeba8f47 -//.word 0x285b7387 -//.word 0xe1fd6086 -//.word 0xd5929063 -//.word 0x32dad776 -//.word 0x85843490 -//.word 0xe596a684 -//.word 0x6e0e40e6 -//.word 0xf2c98012 -//.word 0xeaa5dd70 -//.word 0xb3e39ff7 -//.word 0xf7cff3f0 -//.word 0x69a23ffd -//.word 0xb5a7b359 -//.word 0xb69d2161 -//.word 0xea5d0e54 -//.word 0x24bc0957 -//.word 0x81b33bbc -//.word 0x9dbd4083 -//.word 0x07813521 -//.word 0xf2b11281 -//.word 0x2d323a49 -//.word 0x557d515e -//.word 0x49454eaa -//.word 0xde5ad11d -//.word 0xd4cdb6f1 -//.word 0x0955ea33 -//.word 0xedf17d7f -//.word 0x36cff90b -//.word 0xd56df3e6 -//.word 0x28fedf82 -//.word 0x710f2971 -//.word 0x876a816c -//.word 0xcb3a7699 -//.word 0x5e71460e -//.word 0x9167f491 -//.word 0x9dc39ca1 -//.word 0x959f04bb -//.word 0x98e773d6 -//.word 0x4b02c630 -//.word 0x86b5c04c -//.word 0x4e44a23b -//.word 0x04dafb1c -//.word 0xdb2ac2df -//.word 0x9057a24e -//.word 0x5511954d -//.word 0x0e02b460 -//.word 0xbf684e6f -//.word 0x450337c6 -//.word 0x45316260 -//.word 0x6358b265 -//.word 0xb4840ef1 -//.word 0x7551b417 -//.word 0xfd0ccf26 -//.word 0xf0154b2a -//.word 0xb687e8b6 -//.word 0x2b1b8de1 -//.word 0x984ae08f -//.word 0xe3b213f2 -//.word 0x02bb0050 -//.word 0xb57a7906 -//.word 0x75d6d9cd -//.word 0xa7e9df3c -//.word 0x16a9bd8e -//.word 0xa0c76ba6 -//.word 0x30d74150 -//.word 0xecb2c5ca -//.word 0xaf18c283 -//.word 0xb99a9a22 -//.word 0xa5b7dcca -//.word 0x9c46199c -//.word 0xc914f47e -//.word 0x0ccd791b -//.word 0xf320b02b -//.word 0xe61e71f5 -//.word 0xa1e37912 -//.word 0xe879be73 -//.word 0x75f900a6 -//.word 0x36f3a154 -//.word 0xb510b60f -//.word 0xd8f65e4a -//.word 0xca6c53a9 -//.word 0x39bfbe7c -//.word 0xc2645086 -//.word 0xa9de8e02 -//.word 0xcee36ce8 -//.word 0xdcba1e6c -//.word 0xc4e72bc7 -//.word 0x6a0ac33b -//.word 0x9d055251 -//.word 0x4d5d5566 -//.word 0xf8e36d65 -//.word 0x6693b1d6 -//.word 0x96bc4918 -//.word 0xf86139ea -//.word 0xdddf7a31 -//.word 0x2bd14ff5 -//.word 0x5531d6ac -//.word 0x8ac0ddbb -//.word 0x2da7f83a -//.word 0x865ed0f7 -//.word 0xb7cdbebe -//.word 0xf1b199d8 -//.word 0xe742ccd2 -//.word 0x8313ab80 -//.word 0xd8390740 -//.word 0x59afff83 -//.word 0x48f91a8a -//.word 0x7108936e -//.word 0x175ef463 -//.word 0x2f72e63d -//.word 0xcc564834 -//.word 0xdb977ee4 -//.word 0x10650c98 -//.word 0x20f363c7 -//.word 0x3121fadf -//.word 0x8e59a142 -//.word 0xa0b6138e -//.word 0x1a6cca22 -//.word 0x736417de -//.word 0x99267129 -//.word 0xe4fc0e39 -//.word 0x4854b08f -//.word 0xd067c2c0 -//.word 0x4718a37b -//.word 0x381f42c8 -//.word 0x1a66eb8e -//.word 0xc4b36058 -//.word 0x27882c58 -//.word 0x3b4834ad -//.word 0x3a9a8fe1 -//.word 0x0d1297b6 -//.word 0x030f4022 -//.word 0xc9dfa998 -//.word 0x972af189 -//.word 0xa78d4c2b -//.word 0xeb855679 -//.word 0xff8fa77b -//.word 0x5d8da7c7 -//.word 0xd06ca348 -//.word 0x2b04213e -//.word 0x3a3f7186 -//.word 0xf97e851c -//.word 0x043803de -//.word 0x4fe49792 -//.word 0x171a8e2b -//.word 0x18f5a148 -//.word 0x01bb0efe -//.word 0x25c0eed7 -//.word 0x7387c21a -//.word 0xa82b4f4d -//.word 0xc3fdacf9 -//.word 0xb96f99ad -//.word 0x6b311245 -//.word 0xd599246c -//.word 0x88480060 -//.word 0x5a0b4ef6 -//.word 0x5cffc3dd -//.word 0x0cf9f626 -//.word 0xcc246f04 -//.word 0x93ec01d1 -//.word 0xe31b5b52 -//.word 0xfb42d93c -//.word 0x4d5ba0f7 -//.word 0x32ace9a1 -//.word 0xddef9d56 -//.word 0x8daf23af -//.word 0x07f57588 -//.word 0x44247a07 -//.word 0x672290da -//.word 0xf2b867bf -//.word 0x383c164a -//.word 0x166d68e3 -//.word 0xde9e770e -//.word 0x94177def -//.word 0x5db8e60d -//.word 0x34dfaa56 -//.word 0xdf8cd963 -//.word 0x21c378fe -//.word 0x32328be1 -//.word 0x6c1473c1 -//.word 0x47557a8b -//.word 0x87f7adee -//.word 0xb4b4ea19 -//.word 0xcbe539c6 -//.word 0x33a25f77 -//.word 0xf22bb1ff -//.word 0x21862745 -//.word 0x9d6ab145 -//.word 0x005cce57 -//.word 0xd0185ab4 -//.word 0xf632a736 -//.word 0x71fdd05f -//.word 0x4bac4a9d -//.word 0xccb7bccc -//.word 0xef8111fd -//.word 0x1237cb76 -//.word 0xf1fb9afa -//.word 0xd5422d4a -//.word 0x097a48eb -//.word 0x8ef1172a -//.word 0x0ff2c25e -//.word 0x1731416d -//.word 0x82687291 -//.word 0x3243685c -//.word 0x037a06fa -//.word 0x003ccdb7 -//.word 0xd7d4f3c0 -//.word 0x8a87b52e -//.word 0x68bbee40 -//.word 0x3c5fe7e8 -//.word 0xc486718a -//.word 0x64553100 -//.word 0x1c203ce1 -//.word 0xb8d0e403 -//.word 0x4688d13e -//.word 0xcd885373 -//.word 0x3c51f6cd -//.word 0xa1095747 -//.word 0x9b22376f -//.word 0x1237ce69 -//.word 0x25366136 -//.word 0x64c41737 -//.word 0x40dd09ec -//.word 0xbfbb9802 -//.word 0x75fa038d -//.word 0xaff93992 -//.word 0xf183ebc8 -//.word 0xa3afe69f -//.word 0x0704a082 -//.word 0x6ee11059 -//.word 0xac1cc353 -//.word 0xc9ea2de2 -//.word 0xf9ff3d07 -//.word 0xcef634cf -//.word 0xadf2b61e -//.word 0x7f8621ab -//.word 0xa8d21f4c -//.word 0x3def7774 -//.word 0x718e29f9 -//.word 0x51dbb91b -//.word 0xb2a8cbc3 -//.word 0x67c7f008 -//.word 0xb7b7c0f7 -//.word 0x0e842994 -//.word 0xf2e8061c -//.word 0x39b6f38d -//.word 0x79786068 -//.word 0xc157e5b6 -//.word 0x863cd549 -//.word 0xe0351644 -//.word 0xf71a30de -//.word 0xb770a362 -//.word 0xcc8d7e7a -//.word 0xcafd2dae -//.word 0xab259328 -//.word 0x7f2659ba -//.word 0x5f058522 -//.word 0xa3084e8c -//.word 0x55632e58 -//.word 0xe5133a1e -//.word 0x1d0bafef -//.word 0x588ecdde -//.word 0xefdce8bf -//.word 0xf510bc2f -//.word 0x244901d5 -//.word 0x16083fe7 -//.word 0xb9d9e4ef -//.word 0xfd3694cf -//.word 0xcfa8c002 -//.word 0x4b2f7a26 -//.word 0x2de487b7 -//.word 0x89ddb61e -//.word 0xbd5171ea -//.word 0xa3fc925d -//.word 0x0bc5782a -//.word 0x689f597d -//.word 0xc9add93c -//.word 0x0ba9dc8c -//.word 0x4d869998 -//.word 0xa554f18e -//.word 0x1165fee9 -//.word 0xb1aeeef6 -//.word 0x336f1291 -//.word 0x8e173230 -//.word 0xf3622424 -//.word 0x00c49c1b -//.word 0x380a46e8 -//.word 0xb03f1287 -//.word 0x0accd05b -//.word 0xa7e4fcbb -//.word 0x191fdbad -//.word 0xd765c7f1 -//.word 0x350ec642 -//.word 0x934762d8 -//.word 0xd4b8b531 -//.word 0x1264c411 -//.word 0x8fd00ec8 -//.word 0xef6764b3 -//.word 0xa51dfa05 -//.word 0xac53bfc7 -//.word 0x77faea1e -//.word 0x2afcd5cd -//.word 0x0ad70ffa -//.word 0x328bad35 -//.word 0x89b7e0b6 -//.word 0xf0ffcde6 -//.word 0xc0b09822 -//.word 0x73a7c2bb -//.word 0xa16fb641 -//.word 0x2fa99e01 -//.word 0xc3b17bcc -//.word 0x7a7e75fa -//.word 0xdeca6faf -//.word 0x1273df5d -//.word 0x5022dd8a -//.word 0x962a7ad4 -//.word 0x9bb35232 -//.word 0x0817657c -//.word 0xe58c222e -//.word 0x5104c569 -//.word 0x7751e33a -//.word 0xbd8d431f -//.word 0x3eb9f0c7 -//.word 0x7ba48c1a -//.word 0x4d0ee779 -//.word 0x1f0ed147 -//.word 0x59b12ca8 -//.word 0x1fe44588 -//.word 0x3c9464e0 -//.word 0x5913a134 -//.word 0x73befa61 -//.word 0x8cdda395 -//.word 0xa0ca9d9f -//.word 0xda568a69 -//.word 0x0868c0c2 -//.word 0x4de79c61 -//.word 0x15da1827 -//.word 0x4ecea0a5 -//.word 0xd67822de -//.word 0x2f9c654e -//.word 0x7a2e9b2b -//.word 0xa3b639ea -//.word 0xd9f90605 -//.word 0x41d572fc -//.word 0xeb6d2a9a -//.word 0x0586e979 -//.word 0x4e3191c8 -//.word 0xceab7a4c -//.word 0xc5810aa5 -//.word 0xe1f786d3 -//.word 0xb3ab27f8 -//.word 0x6476715f -//.word 0xa493c0be -//.word 0xe40324b8 -//.word 0xc52f6ea6 -//.word 0xd0d08b97 -//.word 0x670c1195 -//.word 0xfbe1182b -//.word 0x80c74b24 -//.word 0x1e913f94 -//.word 0x2a95031d -//.word 0x540cf86b -//.word 0x22bce201 -//.word 0x9dd44038 -//.word 0x4a17d984 -//.word 0x5b3c98fa -//.word 0x2795990f -//.word 0xd8f084a3 -//.word 0x63bb1a3e -//.word 0xbe6b0d99 -//.word 0x4d1e1560 -//.word 0x9d7e4036 -//.word 0x54e98afa -//.word 0x68d0ad48 -//.word 0x905d3a43 -//.word 0xf859e992 -//.word 0x394c2da9 -//.word 0x88e60c4a -//.word 0x2d9d2e4b -//.word 0x38983499 -//.word 0x6fcc4b7d -//.word 0x8a65001e -//.word 0xa3675648 -//.word 0xe895156b -//.word 0x939266e7 -//.word 0x1c469d86 -//.word 0xac83564a -//.word 0xd6e8c36a -//.word 0x82064497 -//.word 0x29c23883 -//.word 0x48fa14a4 -//.word 0x0e6cb236 -//.word 0x58d3eb7f -//.word 0xe0526756 -//.word 0xb116b4e6 -//.word 0xdf3896b0 -//.word 0x74e09ecf -//.word 0xadb0fe80 -//.word 0x67609ce1 -//.word 0xd4a565f9 -//.word 0x7258e4f9 -//.word 0x3ed413c1 -//.word 0x25a071a6 -//.word 0xbb4e5473 -//.word 0x2fa281ad -//.word 0x7ff7fa1c -//.word 0xe8df1786 -//.word 0xa10ad8be -//.word 0xc8697ade -//.word 0x9d9248d0 -//.word 0xee67b413 -//.word 0xd2f2a6bb -//.word 0x9a9414ba -//.word 0x055fd35f -//.word 0xb3c0ad1c -//.word 0xdc61b38c -//.word 0x424dd4b4 -//.word 0x6456af8a -//.word 0xf5b4a6b3 -//.word 0x8cee3491 -//.word 0x9dfe807d -//.word 0xa8b03251 -//.word 0xb04b852a -//.word 0xef739d6c -//.word 0xc84e1c06 -//.word 0xfde6f0f7 -//.word 0x22ce6e11 -//.word 0x5209a5fc -//.word 0x2027ec7f -//.word 0xd0b1befb -//.word 0xc8c7c838 -//.word 0x41083f64 -//.word 0x42b27759 -//.word 0xcf0ab21f -//.word 0x5eff36b2 -//.word 0x8a0aa205 -//.word 0x0b588146 -//.word 0xe62b2064 -//.word 0xe17e9dcf -//.word 0x3ae8417f -//.word 0x98c20f37 -//.word 0x428c9d0b -//.word 0x8f8d2320 -//.word 0x9ebad2b3 -//.word 0x46d9675c -//.word 0x50e6ff94 -//.word 0xe4b62d76 -//.word 0x42da4ac2 -//.word 0xb3c60c27 -//.word 0xbe335ac2 -//.word 0x9ec15fe2 -//.word 0xf4e1de0e -//.word 0xbaf2c549 -//.word 0x78aa0494 -//.word 0xbab89fb5 -//.word 0xc1a70237 -//.word 0x790696b2 -//.word 0xabc6914c -//.word 0x74e31280 -//.word 0xf6476d1e -//.word 0x4debc393 -//.word 0xc43fd76b -//.word 0x49cc1c14 -//.word 0x1f1713e5 -//.word 0xd3c9d35e -//.word 0x710ee9b2 -//.word 0xf73b6382 -//.word 0x0ab328ec -//.word 0xe80b8bc4 -//.word 0x9e6c1f21 -//.word 0x7b39cc1c -//.word 0xc4f222d4 -//.word 0xa959eeb6 -//.word 0x78d30bfb -//.word 0x11107b71 -//.word 0x9aeeb67f -//.word 0x749b4263 -//.word 0x6dfa84bf -//.word 0x3749d654 -//.word 0x1900da0d -//.word 0xe4fc0d3f -//.word 0x29dc9f2f -//.word 0xa9ac82d5 -//.word 0x0dc1c1df -//.word 0xd7e313f9 -//.word 0x99b2b04c -//.word 0x64426344 -//.word 0x8409e097 -//.word 0x6afb5983 -//.word 0xeaf34c57 -//.word 0xa7559f34 -//.word 0xcbf1ee15 -//.word 0xfb2b240d -//.word 0x8a5948d0 -//.word 0xec6d9a75 -//.word 0x6ed4df7a -//.word 0x259ef909 -//.word 0x24deba79 -//.word 0xf254fa18 -//.word 0x3c49e728 -//.word 0xc6bb9d27 -//.word 0xa7baf754 -//.word 0xb612a46e -//.word 0x402a7dbf -//.word 0xfc2c1559 -//.word 0x406692a0 -//.word 0x74f1bc08 -//.word 0xc8905420 -//.word 0x22daa7d0 -//.word 0x5a9c63de -//.word 0xaa79a8b7 -//.word 0x60d3626d -//.word 0xd6efd7fc -//.word 0xa4537cd1 -//.word 0x14730d8d -//.word 0xd78ddc06 -//.word 0xf6d26a8e -//.word 0x0bc63479 -//.word 0xb0e9cfd9 -//.word 0x3897378c -//.word 0x9d2d6579 -//.word 0xba6d1f16 -//.word 0xba24142e -//.word 0xd10928e1 -//.word 0x2ae90dec -//.word 0x2001132a -//.word 0xb0ac415b -//.word 0x2e3ea425 -//.word 0x382fe758 -//.word 0xe97c2476 -//.word 0x4e4afa73 -//.word 0x1ecce0b9 -//.word 0xa568b86f -//.word 0x0215a8fb -//.word 0x920825c5 -//.word 0xac8f503e -//.word 0x8f3d8622 -//.word 0x984732fa -//.word 0xb92ee6e4 -//.word 0x269eab96 -//.word 0x519795a1 -//.word 0x19ca9af3 -//.word 0x3e46a3a0 -//.word 0x1953e4e2 -//.word 0x8a9e695e -//.word 0x3197f2a8 -//.word 0xe118010a -//.word 0x51473181 -//.word 0x15bdc909 -//.word 0xcde8911a -//.word 0x9dade573 -//.word 0xdd520716 -//.word 0x119cba94 -//.word 0x1b340c8a -//.word 0xaf4f736c -//.word 0x088e1b81 -//.word 0xd9237f2f -//.word 0x87363779 -//.word 0x958710c6 -//.word 0x605462e4 -//.word 0x0c7d9e4c -//.word 0xbee627a8 -//.word 0x0b1d6392 -//.word 0xb13d119f -//.word 0x8512dd9c -//.word 0xad7d3117 -//.word 0x0f1a4f22 -//.word 0x09219d53 -//.word 0x638a3f0f -//.word 0x8275eb08 -//.word 0xdec8f905 -//.word 0xb61abae2 -//.word 0x02d00bd7 -//.word 0xa9852afd -//.word 0xf4b0c80d -//.word 0x42805f6b -//.word 0xfe0bc564 -//.word 0xcfa802b4 -//.word 0x0e995f4c -//.word 0x7deebf52 -//.word 0x36a53268 -//.word 0xe116c831 -//.word 0x2a8fa311 -//.word 0x733b5035 -//.word 0xc54858d4 -//.word 0x0d4811b4 -//.word 0x85d8baef -//.word 0x7080c7f7 -//.word 0x0adb7ad8 -//.word 0xbff8b3bd -//.word 0x9bff09b6 -//.word 0x021819b8 -//.word 0xa1881ee6 -//.word 0xa41dc30e -//.word 0x29cd3577 -//.word 0xf59a7bda -//.word 0x66b90aae -//.word 0xa9f294a8 -//.word 0x2d4a2283 -//.word 0x58e062fd -//.word 0x78154222 -//.word 0xfcefbdcc -//.word 0xe4c0f56b -//.word 0x76028302 -//.word 0x33860b72 -//.word 0x09ce13fb -//.word 0xcab71500 -//.word 0xdd5ad20a -//.word 0x3435ea10 -//.word 0x7d86aaf6 -//.word 0x9df82553 -//.word 0x5a818677 -//.word 0x578ba4ad -//.word 0x4652d7bd -//.word 0x598d0bb5 -//.word 0xf95012e9 -//.word 0xbb313f39 -//.word 0x90aa3092 -//.word 0x3cbeebb8 -//.word 0x09df2d42 -//.word 0xbc10fee6 -//.word 0xc84789f6 -//.word 0xc2152b2b -//.word 0x1588caa2 -//.word 0xf7516824 -//.word 0x9b22f7aa -//.word 0xa85a6f20 -//.word 0xebe41f6a -//.word 0x485c40a5 -//.word 0xf774d0af -//.word 0xed979ee9 -//.word 0x97cca13b -//.word 0xcedc8d59 -//.word 0x08b7a845 -//.word 0xcb14da16 -//.word 0x685804f7 -//.word 0xe5b99372 -//.word 0x3ba355ef -//.word 0xc25a8b77 -//.word 0xe9e23fbe -//.word 0x2a1cd861 -//.word 0x3d31eb6c -//.word 0x8c33541f -//.word 0xe80286f2 -//.word 0x7a6d1fd6 -//.word 0xfc9ac0be -//.word 0x29a81b5e -//.word 0x71924d32 -//.word 0xf2576fc3 -//.word 0xa4586726 -//.word 0xd30104c5 -//.word 0xd3ab4b62 -//.word 0xefc10b58 -//.word 0xa222b824 -//.word 0x0ac77525 -//.word 0x99a673a0 -//.word 0x0ed67a07 -//.word 0xa3f3c57b -//.word 0x88c4138f -//.word 0x911bfb4f -//.word 0x2cfd8081 -//.word 0x9503e52a -//.word 0x4d00c354 -//.word 0xc8e4580f -//.word 0x65e122b6 -//.word 0xa4ccac73 -//.word 0x94c5a905 -//.word 0x8a1a3fc1 -//.word 0x1869a5d7 -//.word 0x3d05f0d7 -//.word 0xda9b2a74 -//.word 0x6516a587 -//.word 0xe1bf8e57 -//.word 0x0ea9c517 -//.word 0xdd4cecb0 -//.word 0x2670bfc1 -//.word 0x9d4da3e4 -//.word 0x03f08134 -//.word 0x99e0d40c -//.word 0xda020111 -//.word 0x69bae872 -//.word 0x4953b86e -//.word 0x4ca10717 -//.word 0xcee42256 -//.word 0xa2f0a130 -//.word 0x4d8b3f47 -//.word 0x7217e9a4 -//.word 0x8e7115b3 -//.word 0xe618558f -//.word 0xbd922c80 -//.word 0xc90b20c3 -//.word 0xe8401089 -//.word 0x109bc841 -//.word 0x849fd31a -//.word 0x4e8790c4 -//.word 0xe92a8977 -//.word 0x3e22ff37 -//.word 0xd22dca56 -//.word 0x3dd3603a -//.word 0xde4a3361 -//.word 0xcd9640a1 -//.word 0x11f4e4b5 -//.word 0x1379f2f5 -//.word 0x53f70465 -//.word 0x5a200ef1 -//.word 0xf0ee39f7 -//.word 0x8e42ee06 -//.word 0x16cb30e6 -//.word 0xc22930d8 -//.word 0x5a521b1e -//.word 0xab3537be -//.word 0x349e2e84 -//.word 0x225aaa46 -//.word 0x7f9b216b -//.word 0xa69ef3ae -//.word 0xfa8ab220 -//.word 0xd79cc06c -//.word 0xc981205f -//.word 0xfc0386a8 -//.word 0xf4e8b0dc -//.word 0x7e17f9bd -//.word 0xe7fd2cbb -//.word 0x6b2f96bb -//.word 0xf0515f18 -//.word 0xf5361ae7 -//.word 0xc5489a80 -//.word 0xf02b073a -//.word 0xfb9d3275 -//.word 0x57a126de -//.word 0x90dc00ee -//.word 0xc73f00b4 -//.word 0x62e6dfd5 -//.word 0x024063d1 -//.word 0xb5713287 -//.word 0x6ef4e4fc -//.word 0xb2855b58 -//.word 0x933e5731 -//.word 0xe200450c -//.word 0xa1145821 -//.word 0xb712db5f -//.word 0xe702c6b0 -//.word 0x03c28f7e -//.word 0x5da84276 -//.word 0x7f67d48c -//.word 0x1c37b53f -//.word 0x4630a41e -//.word 0xe0f7c78b -//.word 0x579dfbbf -//.word 0x8dc4690e -//.word 0x16045a6c -//.word 0xa78d4c31 -//.word 0xcb0d4419 -//.word 0xd8d4678f -//.word 0x2236c42b -//.word 0x6e307579 -//.word 0xaa4fe6fc -//.word 0xdbce7472 -//.word 0x56fe3a5a -//.word 0x33eb27b4 -//.word 0xff3d5408 -//.word 0xb15c95a9 -//.word 0xdfd84f3b -//.word 0x32078973 -//.word 0x18f0451e -//.word 0xb8671065 -//.word 0x2b7ad84f -//.word 0xe90cfe87 -//.word 0x81c0ac60 -//.word 0x8e196916 -//.word 0xe6dfea57 -//.word 0x14c42b01 -//.word 0x0947bf2e -//.word 0x0ed9656e -//.word 0xfd3edb53 -//.word 0xb137f733 -//.word 0xbb5ef329 -//.word 0x5651095d -//.word 0x9e123f85 -//.word 0xfcae85ac -//.word 0xe51dfd32 -//.word 0xc46a9a15 -//.word 0x3414ec6e -//.word 0x73b33a3f -//.word 0x13ded26b -//.word 0xf34d9d06 -//.word 0x6e3bf6cf -//.word 0xd20ebcfb -//.word 0x143aa635 -//.word 0xc263d7e2 -//.word 0x38c2b3a9 -//.word 0x17c9f033 -//.word 0xf30af02f -//.word 0x4c554e9a -//.word 0xc020b73d -//.word 0x7e2cfb77 -//.word 0xfe66633c -//.word 0xf00c465e -//.word 0x7210d70b -//.word 0x85c14198 -//.word 0xc2a8f67c -//.word 0x49b043a0 -//.word 0xfb8b29d6 -//.word 0xe95068a6 -//.word 0x0b69dc51 -//.word 0x36ac0c10 -//.word 0x48c8019d -//.word 0xa6e354f4 -//.word 0xe8818b5b -//.word 0xd2a8a6a0 -//.word 0x8642f4a2 -//.word 0xf9c22b12 -//.word 0xa40ab87b -//.word 0x7c8c5480 -//.word 0x23b0d866 -//.word 0x607652d2 -//.word 0xcd5d58d3 -//.word 0xcf839c22 -//.word 0xcb0dc1a9 -//.word 0x97c96d43 -//.word 0x2f12a0c3 -//.word 0xaaf54437 -//.word 0x6c92056e -//.word 0x9cc462b7 -//.word 0xd90404ec -//.word 0x288a4faf -//.word 0x31b638f4 -//.word 0xacaf56c0 -//.word 0x164a3b2f -//.word 0xa82d04bc -//.word 0x89342fbd -//.word 0x4313ad2d -//.word 0x743d38ae -//.word 0xc605e7ce -//.word 0x2003008a -//.word 0x1eba0d11 -//.word 0xbf7732ca -//.word 0x5e7cbd97 -//.word 0xe45eff5c -//.word 0x3bac5bbb -//.word 0x06d19c22 -//.word 0x8f3c8b08 -//.word 0x00bec273 -//.word 0xd733bbbe -//.word 0x94642c99 -//.word 0xb42c9751 -//.word 0xe3da1c52 -//.word 0x6ed793ea -//.word 0xf789d74f -//.word 0x6c7664e4 -//.word 0x3aad25b8 -//.word 0xbd62874f -//.word 0xfbd8d2a6 -//.word 0x9384b971 -//.word 0xf06f30a7 -//.word 0xc2dc7d40 -//.word 0xaf2b923e -//.word 0x45fd9aea -//.word 0x3499d260 -//.word 0xba8e9a4d -//.word 0x5e9accf8 -//.word 0xe1cb4c7f -//.word 0x72e4e063 -//.word 0x21024247 -//.word 0x967f74f5 -//.word 0x031754a2 -//.word 0x57497073 -//.word 0xb5001b40 -//.word 0x2473c197 -//.word 0x884a7704 -//.word 0xd102d68f -//.word 0x72920a87 -//.word 0x144f267e -//.word 0x8c0dba95 -//.word 0x0b87a8fa -//.word 0x950133ae -//.word 0xb52b598c -//.word 0x6e496387 -//.word 0x7491ba33 -//.word 0x9dd4fc87 -//.word 0x92614fe1 -//.word 0xca27f64a -//.word 0xb91922fb -//.word 0x44d70a21 -//.word 0x798a3dde -//.word 0x7d0f3790 -//.word 0xc5593355 -//.word 0x891041cf -//.word 0x767e9824 -//.word 0xa4ac2d49 -//.word 0xc7c88581 -//.word 0xa9cac720 -//.word 0xd8581595 -//.word 0x9be61ca7 -//.word 0x2b21eaff -//.word 0x208e00e7 -//.word 0x2a6ea951 -//.word 0x01e68a1b -//.word 0x9f5c7991 -//.word 0xac249334 -//.word 0x3a5c88ba -//.word 0xb2143a55 -//.word 0x0eb38738 -//.word 0x49956258 -//.word 0x14f9296f -//.word 0xcb1b3247 -//.word 0xa79da835 -//.word 0x352b95e3 -//.word 0x075f3f53 -//.word 0xa9e2b821 -//.word 0xd6d5b109 -//.word 0xec6f8fa8 -//.word 0x9ee7c187 -//.word 0xe9945055 -//.word 0x4953b774 -//.word 0x2c29f6b8 -//.word 0xa729e26b -//.word 0x6898bf94 -//.word 0xec501078 -//.word 0xf262ae62 -//.word 0x2fff18a0 -//.word 0x43990ace -//.word 0xec455157 -//.word 0x7964dd38 -//.word 0x82821807 -//.word 0xd77e7634 -//.word 0xb6eb4d90 -//.word 0x41b7e80b -//.word 0x2e0ad7c2 -//.word 0xc1718839 -//.word 0xf73c1ce4 -//.word 0x052573ed -//.word 0x00328931 -//.word 0xdedc068c -//.word 0x9d701056 -//.word 0xc2b6642d -//.word 0x05d1a5f5 -//.word 0x4b66f31e -//.word 0xd400c025 -//.word 0xb6b3df5e -//.word 0x8a00def0 -//.word 0x65f99621 -//.word 0x0aa500d4 -//.word 0x5da64b4f -//.word 0x1b192b42 -//.word 0xc9be7305 -//.word 0xea59e622 -//.word 0x75584a13 -//.word 0x86b5bf4d -//.word 0x541e4f7d -//.word 0x6354c611 -//.word 0xfbd1c4fa -//.word 0xd8ad10b0 -//.word 0x23c22f77 -//.word 0xa10f36e2 -//.word 0x2b5adc95 -//.word 0x5e19d34e -//.word 0x93935927 -//.word 0x11430a15 -//.word 0x827df8b5 -//.word 0xa454fd48 -//.word 0x41ba50fb -//.word 0x61e9576d -//.word 0xbe02bc6b -//.word 0x78f4c3fe -//.word 0x0aa0dba7 -//.word 0x7d3b73e9 -//.word 0xdcf30e08 -//.word 0xe7d59a11 -//.word 0x0beefd1a -//.word 0x92b0f2cb -//.word 0x1898131d -//.word 0x3e0e3662 -//.word 0xa28dfd86 -//.word 0x0e03a994 -//.word 0xef7b2f7b -//.word 0x09f98e13 -//.word 0x6aa55f5b -//.word 0x9c2cae05 -//.word 0x1f640834 -//.word 0x162fd584 -//.word 0x41a1e94b -//.word 0x2b65551e -//.word 0xa55c8397 -//.word 0x72888256 -//.word 0x44299e46 -//.word 0xe8253421 -//.word 0xbdadc437 -//.word 0x6a1e486b -//.word 0xd025c47e -//.word 0x3e271f90 -//.word 0xe4e031e3 -//.word 0x8b4a1de3 -//.word 0x83c0e163 -//.word 0xdc632b2a -//.word 0xd9bd6fae -//.word 0xa1a4361f -//.word 0x3861b9a7 -//.word 0xae12aef1 -//.word 0x964d62e8 -//.word 0xba0608c1 -//.word 0x0db3503b -//.word 0xe1ad3c25 -//.word 0x5ada3021 -//.word 0x238948a9 -//.word 0x5f9ded4f -//.word 0xe3eeab49 -//.word 0xa2ec3d2c -//.word 0x6886eaf8 -//.word 0xcc4a1555 -//.word 0x60cd0f1c -//.word 0x2a4d2f19 -//.word 0x58952510 -//.word 0x2f218bfd -//.word 0x4583bda0 -//.word 0xf005eb39 -//.word 0xfe906c91 -//.word 0xa6cc5539 -//.word 0xbf894b16 -//.word 0x305e951e -//.word 0xa88f755c -//.word 0x8f34b93a -//.word 0x3c988dff -//.word 0x68e09397 -//.word 0xe2ed3693 -//.word 0x85833b70 -//.word 0x68aa981c -//.word 0x54548ab6 -//.word 0x7b41e295 -//.word 0x66209f8d -//.word 0x30f7c26d -//.word 0xf2c45ecc -//.word 0x7e65ef06 -//.word 0x50b5ec81 -//.word 0xc1f8a035 -//.word 0x7e79356b -//.word 0x397112c4 -//.word 0x9e2b677e -//.word 0x896605f3 -//.word 0x76fb7462 -//.word 0x39bf3ff2 -//.word 0xefab93f4 -//.word 0x343a0869 -//.word 0x9613bfc4 -//.word 0x4ae8adf1 -//.word 0x1e9e3695 -//.word 0xafaefe98 -//.word 0xdccbfce1 -//.word 0x7ac5d060 -//.word 0x49ad5652 -//.word 0x273a7bc0 -//.word 0x846b4f49 -//.word 0x166e5c22 -//.word 0xcec1375b -//.word 0x0a975464 -//.word 0x0c7d1ecf -//.word 0xab3d4757 -//.word 0x48025d22 -//.word 0x04be9f43 -//.word 0x30c90e83 -//.word 0x06cbc761 -//.word 0x96db8f57 -//.word 0x02e8b05f -//.word 0xee5804b6 -//.word 0x33f04fe0 -//.word 0xd3f4d1ec -//.word 0x328f1cf9 -//.word 0x837424f9 -//.word 0x80c695b5 -//.word 0x5e366912 -//.word 0x006bb992 -//.word 0x6ba6d31d -//.word 0x7aa68e02 -//.word 0xd2c9da39 -//.word 0x19759beb -//.word 0x63b6b833 -//.word 0xed286e27 -//.word 0x0e18eb12 -//.word 0x6ae61804 -//.word 0x69adb68d -//.word 0xe826acc5 -//.word 0x2eca9f8f -//.word 0x2137c41f -//.word 0xb9d5f2ba -//.word 0xb6b9fcbd -//.word 0x8eca3de1 -//.word 0xaa2274bd -//.word 0xd1b7d38d -//.word 0xe53a5231 -//.word 0xcd3f4979 -//.word 0xb29f3e9f -//.word 0x6e1afb15 -//.word 0x4141e481 -//.word 0xc6948807 -//.word 0x26e776c6 -//.word 0x8c0a52a5 -//.word 0xd9a8284f -//.word 0x9870ff7c -//.word 0x3473b273 -//.word 0x68cdfbcc -//.word 0xf888d17b -//.word 0x9fbdf40a -//.word 0x48fcc626 -//.word 0x81ee5c5d -//.word 0x2c39d526 -//.word 0x77a4ea22 -//.word 0x0f7cc7a1 -//.word 0x91361968 -//.word 0x425569b2 -//.word 0xff8fa874 -//.word 0x772b0be5 -//.word 0x97ad193e -//.word 0x46b502be -//.word 0x532532f2 -//.word 0xab822633 -//.word 0xd09d7e70 -//.word 0x8672542e -//.word 0xd050cdcc -//.word 0x1a3aed0c -//.word 0xb88eb0cf -//.word 0x8fe45620 -//.word 0x1239fe74 -//.word 0x714d7630 -//.word 0x0c49526c -//.word 0x2ea53bf7 -//.word 0xf8498a9b -//.word 0x9bf216a2 -//.word 0xcbd84998 -//.word 0x708e7a53 -//.word 0x9e297631 -//.word 0xc7a460a1 -//.word 0x2f83bce5 -//.word 0xa1b7c616 -//.word 0x61c20868 -//.word 0x611b2baf -//.word 0xb7d40e22 -//.word 0x4f7a155f -//.word 0xdd3dc4b0 -//.word 0x16508c8d -//.word 0x2093e462 -//.word 0x47709c92 -//.word 0xf1026ebb -//.word 0xd47dd73c -//.word 0x66ca25f4 -//.word 0x9571d04d -//.word 0xb9bc0d79 -//.word 0xc71aa1fc -//.word 0xc7c1f36b -//.word 0x88976673 -//.word 0x9253e51c -//.word 0x5cdfc04f -//.word 0xbf01b697 -//.word 0xab3b5324 -//.word 0x19f07c15 -//.word 0x40c748f7 -//.word 0x0c551188 -//.word 0xccf6cbc1 -//.word 0x2bfb9514 -//.word 0x610b8ef3 -//.word 0xaac3ea91 -//.word 0xf7a045ec -//.word 0xe41f360b -//.word 0xeb222884 -//.word 0xd7966542 -//.word 0x7b537485 -//.word 0xa343a52a -//.word 0x4bc7ea2d -//.word 0x0f56e86c -//.word 0xe3684eae -//.word 0x049266e3 -//.word 0x2ff2eaae -//.word 0x10cd1820 -//.word 0xfd7708c7 -//.word 0xe4733ee7 -//.word 0x82dc7c07 -//.word 0xd603d9af -//.word 0xd65a1771 -//.word 0x60913226 -//.word 0x73fe357a -//.word 0x9f4251ab -//.word 0xba2a308d -//.word 0xd5d387d2 -//.word 0x6e12eb88 -//.word 0xe812e5e3 -//.word 0x383f483d -//.word 0xe063c25b -//.word 0x210fb2f2 -//.word 0x6c3d3969 -//.word 0x1b3394e1 -//.word 0x5eaba973 -//.word 0x7830dfb8 -//.word 0x2bcb338f -//.word 0x70df891a -//.word 0x6c523f0a -//.word 0xa0ed081d -//.word 0x6006f8e4 -//.word 0x865cdbca -//.word 0x6742cb52 -//.word 0x060002a0 -//.word 0x8876ec3b -//.word 0xe8028011 -//.word 0xeca4d1bc -//.word 0x5860e003 -//.word 0x61e4b5a4 -//.word 0x646bae51 -//.word 0xd8e116f8 -//.word 0x8248f947 -//.word 0xe75a3770 -//.word 0x0770d829 -//.word 0x48a29ff7 -//.word 0xb130e2ad -//.word 0x5821992f -//.word 0x1e29b47c -//.word 0x99d0b2ec -//.word 0x52d16fb6 -//.word 0x31c03db4 -//.word 0x35f0376b -//.word 0x6894d246 -//.word 0x1324b522 -//.word 0x2e03cb0f -//.word 0x1a5e9655 -//.word 0x9357c6b6 -//.word 0xe0630af3 -//.word 0x4cf02692 -//.word 0xda4c46dd -//.word 0x35c2912e -//.word 0xe606026a -//.word 0xc9d373cc -//.word 0xc2d2fbe4 -//.word 0xacbe7adf -//.word 0x92c67208 -//.word 0x2232198f -//.word 0x5e4aac89 -//.word 0x95730539 -//.word 0x929c708e -//.word 0x13d8bbec -//.word 0x7d4c8c30 -//.word 0xcd4cf7ee -//.word 0xd2c150fc -//.word 0x9ace3e35 -//.word 0x2ab31177 -//.word 0x71f156ee -//.word 0x7fafa895 -//.word 0xf35cc9f9 -//.word 0xb296f141 -//.word 0xdf4a656b -//.word 0x071d4cd8 -//.word 0x9b0bbe0b -//.word 0xa44e1fae -//.word 0xb282abd5 -//.word 0x15065187 -//.word 0x50a5c57b -//.word 0xcb76d11f -//.word 0xc800ecde -//.word 0x98a20da3 -//.word 0x0f33c199 -//.word 0x35e57c36 -//.word 0x3e6f2c77 -//.word 0xbd6b146d -//.word 0x14fcd8f8 -//.word 0x2fb5d4d3 -//.word 0x72b6b2d0 -//.word 0xef183c65 -//.word 0xdd8c6e68 -//.word 0x453ed017 -//.word 0xff00035b -//.word 0xdda4994e -//.word 0x26a92afa -//.word 0x461ba364 -//.word 0xc3b4e2c9 -//.word 0x73478027 -//.word 0xed5feeff -//.word 0x3d23c459 -//.word 0xdc7c550a -//.word 0xdf7a8732 -//.word 0x6ef4e208 -//.word 0x786fe6da -//.word 0xa541a24f -//.word 0x8cf782f0 -//.word 0x27f369e6 -//.word 0x835aff05 -//.word 0xbc2d4d0a -//.word 0x29b58721 -//.word 0xd42528ab -//.word 0x2d7b443d -//.word 0xffa71aec -//.word 0xa2efeac8 -//.word 0x739206a6 -//.word 0x81ab2a23 -//.word 0x895910e5 -//.word 0x251d4024 -//.word 0x40832669 -//.word 0xcd056696 -//.word 0xb82c7427 -//.word 0x1df85fb7 -//.word 0xb982edc6 -//.word 0x9ee0edb9 -//.word 0x2a49c922 -//.word 0x39795b42 -//.word 0x9a5701cd -//.word 0xc0d6f4ec -//.word 0xba19d588 -//.word 0x66da89c6 -//.word 0xe10c47ce -//.word 0x41bfefd1 -//.word 0x87459e4a -//.word 0xcf937f84 -//.word 0xcae9e45c -//.word 0x6eb69548 -//.word 0xecb66798 -//.word 0xe35d11fc -//.word 0xd3783c47 -//.word 0xd412d972 -//.word 0x8894b7e4 -//.word 0x4e3155f0 -//.word 0xb881f5a0 -//.word 0x406cf1b1 -//.word 0x364a52de -//.word 0xfd489f62 -//.word 0x770ef3b8 -//.word 0xbe9f52a5 -//.word 0x15803d78 -//.word 0x1e1c8491 -//.word 0x4d675c20 -//.word 0x9cc2b12f -//.word 0x801fbee3 -//.word 0x1c65dafe -//.word 0xb51695a9 -//.word 0x672f0371 -//.word 0x164f588f -//.word 0xa71cb56c -//.word 0x6fe24264 -//.word 0xeb7e7dca -//.word 0xb27bd22d -//.word 0xa97a6bda -//.word 0x76d749a2 -//.word 0x378994de -//.word 0x734a2fb0 -//.word 0x50f9908b -//.word 0x073ccff5 -//.word 0x9669fc8b -//.word 0xb5a7b646 -//.word 0x0a50f9fe -//.word 0xa09a382c -//.word 0x9677acf4 -//.word 0x14b9eb63 -//.word 0x837abcf5 -//.word 0xfebb2a5a -//.word 0x034bd779 -//.word 0x6feb93b6 -//.word 0xa9af2d70 -//.word 0x1da789ce -//.word 0xecbff3bc -//.word 0xe1e4b330 -//.word 0xa868e2b2 -//.word 0x3aa87c1b -//.word 0x9cecb69d -//.word 0xc98e9103 -//.word 0xed5faf3a -//.word 0xd3466511 -//.word 0xa12a133d -//.word 0xc312b0a0 -//.word 0x258ba9cb -//.word 0xa54becc1 -//.word 0xc8133ffd -//.word 0xabdad7b7 -//.word 0x3d272664 -//.word 0xacbff47c -//.word 0x1d80b17f -//.word 0xa08d0a3a -//.word 0x63abba47 -//.word 0x26eba3d3 -//.word 0xee8a1da3 -//.word 0xfe158e59 -//.word 0x03d03bf4 -//.word 0x8f595d97 -//.word 0xc889788b -//.word 0x629be886 -//.word 0xca90bc2e -//.word 0xa4d1c8d9 -//.word 0x7817f697 -//.word 0xa888dd72 -//.word 0xa62395f4 -//.word 0x635dc9ea -//.word 0x0b0c0d68 -//.word 0xef85720d -//.word 0xc3015888 -//.word 0x0946845b -//.word 0xcd8373df -//.word 0x937bed89 -//.word 0x8ee5dd6b -//.word 0x12135ffe -//.word 0x4cd31b1e -//.word 0x3193d256 -//.word 0xb4c8365e -//.word 0x3c90ffe2 -//.word 0x55953b85 -//.word 0xa535e526 -//.word 0x23e1ba62 -//.word 0x83c3485a -//.word 0xf4a448b6 -//.word 0x0e0c2dea -//.word 0x06abfdb7 -//.word 0x25f760f5 -//.word 0x7817f791 -//.word 0xc800eed2 -//.word 0xccded5e0 -//.word 0x9eb5ab86 -//.word 0x6c483c37 -//.word 0x703aae4f -//.word 0x2273569c -//.word 0xacc5d01d -//.word 0x9ecf4e09 -//.word 0xe3223013 -//.word 0xf4a3d5ed -//.word 0x4b31b10b -//.word 0x1b87a0a9 -//.word 0x3e637a0f -//.word 0x6ee8e814 -//.word 0xb94076e1 -//.word 0x2f87e9f7 -//.word 0xdee4d274 -//.word 0x00f96391 -//.word 0x727e8270 -//.word 0x68281c15 -//.word 0x60d0bcb2 -//.word 0x54d15c27 -//.word 0x34b27bc9 -//.word 0x93056f62 -//.word 0xa18efd7a -//.word 0x59a827d5 -//.word 0xfbe5453d -//.word 0xbdf55782 -//.word 0xbdc99abe -//.word 0x3bf759dd -//.word 0x0561065d -//.word 0x32128953 -//.word 0x1368d8af -//.word 0x6778c8c0 -//.word 0xceae23fb -//.word 0x81b4faf8 -//.word 0x3f953cbd -//.word 0x8b23883f -//.word 0x14964026 -//.word 0x7575dfd1 -//.word 0x1eba8c9a -//.word 0x9231ef5b -//.word 0xd4214331 -//.word 0x1b2eac7f -//.word 0xcd7ecb36 -//.word 0xab1b9054 -//.word 0x499850ab -//.word 0xc2f818e4 -//.word 0xa9cb40c3 -//.word 0x439a43ad -//.word 0xf385ce67 -//.word 0xf52b1620 -//.word 0x4fca6fb2 -//.word 0x05a71b25 -//.word 0x8db15f74 -//.word 0x8261dc94 -//.word 0x9de41db3 -//.word 0xe07c6dbe -//.word 0x1424eb25 -//.word 0x7673e0e2 -//.word 0xaec24fb8 -//.word 0x0091ceb8 -//.word 0xc627950a -//.word 0x1e79d5ea -//.word 0xe04d4bf1 -//.word 0xd39f1496 -//.word 0x2044c3f4 -//.word 0x06cdb1ce -//.word 0xd0ae94d0 -//.word 0x04a05317 -//.word 0xde4319f4 -//.word 0xfc08a9ed -//.word 0x5b4ef105 -//.word 0x82cbe13e -//.word 0xfd2e7d5b -//.word 0x0d0231ea -//.word 0x9ed66582 -//.word 0x799b524a -//.word 0xbb4d14ba -//.word 0x86d600a6 -//.word 0xf62f3778 -//.word 0x57c87bbd -//.word 0x952a42e3 -//.word 0xf3db0940 -//.word 0x0081eb57 -//.word 0xc84b7257 -//.word 0x478dade5 -//.word 0x23aa831b -//.word 0x9a3746d1 -//.word 0xb85d8c1b -//.word 0xce7f3a12 -//.word 0x211de1d8 -//.word 0xdff94ed6 -//.word 0x57785c48 -//.word 0x684a0dfc -//.word 0x3a4dd956 -//.word 0x2daf4698 -//.word 0x0f54b960 -//.word 0x92778c73 -//.word 0xfd9360b8 -//.word 0x2184b588 -//.word 0x8fe9b825 -//.word 0x08ce5b87 -//.word 0x3588ab5f -//.word 0x98df5f56 -//.word 0xc373ac95 -//.word 0xc858618b -//.word 0xf0042fea -//.word 0xb06b48f3 -//.word 0xd8682df4 -//.word 0x0e5fc00f -//.word 0x7b21a13c -//.word 0xc40fb791 -//.word 0x3c830dc2 -//.word 0x586be0e4 -//.word 0x6337f676 -//.word 0x72f631a1 -//.word 0x9bbb63bf -//.word 0x6246641b -//.word 0x74e062f7 -//.word 0x988779d4 -//.word 0xe24b83ed -//.word 0x29f83205 -//.word 0xbcf55c62 -//.word 0x516c951a -//.word 0x3eab038d -//.word 0xeccb6e33 -//.word 0x888f9798 -//.word 0xfb8ecba4 -//.word 0x1d95b720 -//.word 0x25477e76 -//.word 0x650609b8 -//.word 0x34179fe4 -//.word 0x2b00b567 -//.word 0x943507df -//.word 0x1ff4e725 -//.word 0xd76ed58b -//.word 0x55275162 -//.word 0x339fedc0 -//.word 0xc432a680 -//.word 0x023d7489 -//.word 0xc8822054 -//.word 0x42ce56a8 -//.word 0xa1d9fba8 -//.word 0x136dc010 -//.word 0xf2caf8bc -//.word 0x3b4aa76a -//.word 0x4341dbc0 -//.word 0xa5273f91 -//.word 0x7ff9ed5c -//.word 0xdedc8415 -//.word 0x76047a28 -//.word 0x97d4b4bc -//.word 0x5c465434 -//.word 0x268ed3fc -//.word 0x48fa4f82 -//.word 0x041d2682 -//.word 0xb72cc387 -//.word 0x50a8b8af -//.word 0x063d0dae -//.word 0x4bebd815 -//.word 0xfb630ed5 -//.word 0xdab499fe -//.word 0x3d26abcd -//.word 0x076651e6 -//.word 0xd7e44bde -//.word 0x807a1bfc -//.word 0xba4e5c41 -//.word 0x17f955a5 -//.word 0x38e9cea4 -//.word 0x400322f9 -//.word 0x898d96aa -//.word 0x964ce944 -//.word 0x49e92d68 -//.word 0x569ad586 -//.word 0xf8fe0ee9 -//.word 0xe34853f4 -//.word 0x799f3bab -//.word 0x40c59675 -//.word 0x94f7b91f -//.word 0x99151625 -//.word 0x7403102d -//.word 0xbb4f0dd5 -//.word 0x2914ccae -//.word 0x971ef988 -//.word 0x274efef1 -//.word 0xc3401df8 -//.word 0xc62cbb37 -//.word 0xf80aff10 -//.word 0xc0fa9c36 -//.word 0x95e2eb6f -//.word 0xb6593d99 -//.word 0x1bc46feb -//.word 0xabbebf7e -//.word 0xafbedd0c -//.word 0x87f346f7 -//.word 0x9b73cd8d -//.word 0x95957a8a -//.word 0xce9b98de -//.word 0x05950ab1 -//.word 0x5782dea5 -//.word 0x6bb7255b -//.word 0xee850138 -//.word 0x3f16ff69 -//.word 0x6b98a724 -//.word 0x5b9d5231 -//.word 0x4cc23caa -//.word 0x808fdaff -//.word 0x339f6e3c -//.word 0xd101d88f -//.word 0x66ddaf05 -//.word 0x565b9094 -//.word 0x4ec0b65e -//.word 0x7adbcb34 -//.word 0xf99ffe59 -//.word 0x8e115689 -//.word 0x9865463a -//.word 0x44638122 -//.word 0x01100ff9 -//.word 0x348ba180 -//.word 0x2d3522c2 -//.word 0x5a148e9a -//.word 0xbb7a0775 -//.word 0x96e12659 -//.word 0x6c1a8f27 -//.word 0x2ba7c81d -//.word 0xa5654b9e -//.word 0x416ed936 -//.word 0xf13d12d9 -//.word 0x6413436b -//.word 0x7c9a7f86 -//.word 0x02c8f177 -//.word 0x99077089 -//.word 0xf0935487 -//.word 0x3c23887c -//.word 0xe6cbe1bd -//.word 0x8021ae29 -//.word 0xfe9f91b0 -//.word 0x23488d12 -//.word 0x398e5fe9 -//.word 0x057412ea -//.word 0xfaf0ce68 -//.word 0xad93f119 -//.word 0x896b601d -//.word 0xc429203c -//.word 0x917f2070 -//.word 0x98cc59a3 -//.word 0xa3fb19b9 -//.word 0x9aa89cd1 -//.word 0xb185ddc8 -//.word 0xe0fdabff -//.word 0x9417ff5f -//.word 0xa49c8d9a -//.word 0x867c99b3 -//.word 0xc36e0cc0 -//.word 0xa8d7c7ef -//.word 0x3eed37c7 -//.word 0x7d1c2ab0 -//.word 0xbda9e1b6 -//.word 0x6d95668a -//.word 0x07c420c9 -//.word 0x435ea481 -//.word 0x8c76cef2 -//.word 0xb0e91191 -//.word 0xdb890b53 -//.word 0xc67b5c27 -//.word 0x2cdeb9c4 -//.word 0x7ead3ca6 -//.word 0xd7e7fe53 -//.word 0x32ede8e3 -//.word 0xdb2bc6bf -//.word 0x23fa9da9 -//.word 0x58c53ffd -//.word 0xf46b1c36 -//.word 0x15e55bb3 -//.word 0x2d292abc -//.word 0xfb4e52c0 -//.word 0xbaf00ee0 -//.word 0x98d61db2 -//.word 0x69d2163e -//.word 0x9de9fc4d -//.word 0x6fb412e4 -//.word 0x6006f00b -//.word 0xe4d0d7d2 -//.word 0x5b414296 -//.word 0x4231bd81 -//.word 0xabbffa50 -//.word 0xea392259 -//.word 0x923d69cc -//.word 0xa01ee539 -//.word 0xf589a052 -//.word 0x0a69ecf3 -//.word 0xdf07f65f -//.word 0x34769ecd -//.word 0xfc2e8623 -//.word 0x0ff76901 -//.word 0x1f09af01 -//.word 0xed713e3d -//.word 0xbcb69212 -//.word 0x06bd1024 -//.word 0x6fea97a2 -//.word 0xf78859cc -//.word 0x736be9b2 -//.word 0x3ed3943e -//.word 0x2c94f574 -//.word 0xbf74c4f9 -//.word 0x9ed5efd2 -//.word 0x4294ec6f -//.word 0xf3304de8 -//.word 0xf32f9586 -//.word 0xf9bd4a85 -//.word 0xe0974b18 -//.word 0xa12764ae -//.word 0x7ff02074 -//.word 0x812dde1b -//.word 0x25b527db -//.word 0x53223fb8 -//.word 0x9032fa04 -//.word 0x746ed125 -//.word 0x5e093598 -//.word 0x660a2436 -//.word 0x93aef9b6 -//.word 0x4f078874 -//.word 0x17ea6a70 -//.word 0x7708969a -//.word 0x365b314d -//.word 0xcec4a819 -//.word 0x1ef2fbc5 -//.word 0x63855c94 -//.word 0x6573f8c8 -//.word 0xeeab1565 -//.word 0x80f95d37 -//.word 0x472a7916 -//.word 0x4d70e269 -//.word 0xed08f4e9 -//.word 0x8a1945a8 -//.word 0x81e03451 -//.word 0x5b0ac5b1 -//.word 0x4861ac76 -//.word 0xc9aba737 -//.word 0xaccf11b5 -//.word 0x3d3ab561 -//.word 0xbb81e01e -//.word 0x0948ba47 -//.word 0xa662d5f4 -//.word 0xdf3a0779 -//.word 0x43717530 -//.word 0x58c8f179 -//.word 0x8c4186fe -//.word 0x6e81503c -//.word 0x1e79913f -//.word 0x024502ac -//.word 0xbb546705 -//.word 0x58ca6629 -//.word 0xc922991a -//.word 0x9618e203 -//.word 0xd1c6ff7a -//.word 0x490d5e02 -//.word 0x003632d4 -//.word 0xdfd9c6df -//.word 0xa9fe110d -//.word 0x2e838cc8 -//.word 0xc1be40bd -//.word 0xeb6223df -//.word 0x61a7a4af -//.word 0x34a585bb -//.word 0x4801e965 -//.word 0x07ccaee6 -//.word 0x56a8fc93 -//.word 0xc82d1e5e -//.word 0x128b919f -//.word 0xc0705b15 -//.word 0x262c9e27 -//.word 0x98136d70 -//.word 0xde22de7b -//.word 0xe2e661cb -//.word 0xac9a501f -//.word 0x9090c7f4 -//.word 0xa6d2b54a -//.word 0x7b0833ab -//.word 0x069c156a -//.word 0xde1dbf29 -//.word 0xaae13b9d -//.word 0xd8ef8896 -//.word 0x921b3439 -//.word 0xed732d90 -//.word 0x64dad446 -//.word 0x86f353ab -//.word 0xeb4130fe -//.word 0x6c8c23ec -//.word 0x93862554 -//.word 0x51aeca4d -//.word 0xef75d06a -//.word 0x479ff83d -//.word 0x34ed1419 -//.word 0x47f9621c -//.word 0xbc61186d -//.word 0xac2740c3 -//.word 0x8458c627 -//.word 0xb5ecd0fa -//.word 0xadee4d39 -//.word 0x07ddd100 -//.word 0xfe51a04d -//.word 0x28e10907 -//.word 0x6145f53f -//.word 0x04b8bfb5 -//.word 0x62a0469e -//.word 0x6c7141a4 -//.word 0xb3cfd32f -//.word 0x93f360e3 -//.word 0xaa4f9e6a -//.word 0x8f75ef73 -//.word 0xc135eefa -//.word 0xde0547ca -//.word 0x16a7cd41 -//.word 0xde05c654 -//.word 0xe96089d2 -//.word 0x54a94ced -//.word 0x212f37f6 -//.word 0xe67bbd68 -//.word 0xc6782b28 -//.word 0xa1d8810b -//.word 0x88b28299 -//.word 0x74700711 -//.word 0x37e898ad -//.word 0xb2c93d26 -//.word 0x4939927b -//.word 0x94bc1aef -//.word 0x5758d550 -//.word 0xb5f7157f -//.word 0xa00c8d2d -//.word 0x9479abe3 -//.word 0x85b12845 -//.word 0x1619dd97 -//.word 0x0bb5d880 -//.word 0x0100af0e -//.word 0x5c1b14fb -//.word 0x822aaa2f -//.word 0x47fc1785 -//.word 0xa7ea5bd2 -//.word 0xbb016024 -//.word 0xe663d147 -//.word 0x50ea308e -//.word 0x950f23cf -//.word 0xbe0a0fb0 -//.word 0x703be821 -//.word 0x63c9482a -//.word 0x1689bee7 -//.word 0xc12168d1 -//.word 0x8c6dc43e -//.word 0xfe21c32c -//.word 0xb8b01f3a -//.word 0x636deff7 -//.word 0xe7f0795f -//.word 0xddbc47a3 -//.word 0x481f7d29 -//.word 0x7f5969d4 -//.word 0x6e005c85 -//.word 0xfea2b8e2 -//.word 0xd2ad4b56 -//.word 0x348cdb58 -//.word 0x4f1302f1 -//.word 0x9e1d3d78 -//.word 0xa4733fa1 -//.word 0xdef08bb6 -//.word 0xf6e34123 -//.word 0x39b53838 -//.word 0x4bcc4e2b -//.word 0x19aefc5c -//.word 0x106a2edd -//.word 0x8d345132 -//.word 0x944fad55 -//.word 0xc430f5fe -//.word 0x8ae01c20 -//.word 0x96a26bb7 -//.word 0x8bd6d1c1 -//.word 0xfb1d7a8a -//.word 0x92bea22d -//.word 0x9148ac58 -//.word 0x7e796e4f -//.word 0x1a5fd034 -//.word 0x94bd9585 -//.word 0xfcb078e6 -//.word 0xfa927b21 -//.word 0xc01f7c6b -//.word 0x3dd609e9 -//.word 0x94a27572 -//.word 0xccba2b97 -//.word 0xc9c643e0 -//.word 0x7b435359 -//.word 0x5528884d -//.word 0x01caf552 -//.word 0x52fd2a85 -//.word 0x7a7c0917 -//.word 0x7d8bd509 -//.word 0xe5da8c33 -//.word 0xb8ad778b -//.word 0xa73affa4 -//.word 0x8852c275 -//.word 0x0644e65c -//.word 0x97ffad63 -//.word 0xaf764ac1 -//.word 0x3449f4a4 -//.word 0x31800000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00013648 -//// expected output -//.word 0x5c59f574 -//.word 0x82184460 -//.word 0x99dac3a2 -//.word 0xbeebb570 -//.word 0x848a6ba3 -//.word 0x190f7c5a -//.word 0xb97af95d -//.word 0xbf50ba08 -//.word 0x0a53d382 -//.word 0xaa213e9e -//.word 0x6d8a27c2 -//.word 0x49ff61cb -//.word 0x424900a0 -//.word 0x043696d7 -//.word 0x477ce2bb -//.word 0xfdd2605b -//// SHA512LongMsgvector_100 -//// vector length -//.word 0x00013960 -//// input message -//.word 0x6e6a88ab -//.word 0xbb52a709 -//.word 0xb47365ad -//.word 0x6aa8016f -//.word 0xa9a03a9b -//.word 0xd8345aea -//.word 0x21f773b1 -//.word 0xd20fe959 -//.word 0x0344300f -//.word 0x7a57d7bc -//.word 0xcb95c638 -//.word 0xc3abc4bb -//.word 0x07bc3c94 -//.word 0xf9b1401d -//.word 0xdbd1ceee -//.word 0x37915251 -//.word 0x7ead6df6 -//.word 0xef77f5e8 -//.word 0xba6f3dc0 -//.word 0x66159619 -//.word 0x70fb1543 -//.word 0x351e973c -//.word 0x117603db -//.word 0xc9cccf4f -//.word 0x26ccc6c8 -//.word 0xe35b0874 -//.word 0xca2b52ad -//.word 0x198c7f71 -//.word 0x2a854f12 -//.word 0x5323682e -//.word 0x0c119ae2 -//.word 0x4f69673b -//.word 0x45cac3ed -//.word 0x1eab1848 -//.word 0x40ee8d67 -//.word 0xa5b888ab -//.word 0x7e817168 -//.word 0x1d67badd -//.word 0x11c81c6a -//.word 0x930f23fd -//.word 0x21ceecce -//.word 0x680e2e4c -//.word 0x67e37756 -//.word 0xd243b8af -//.word 0xb41704ac -//.word 0x59939530 -//.word 0x6bc310da -//.word 0x5b67097d -//.word 0x0201cad1 -//.word 0x892c5068 -//.word 0x862f97e3 -//.word 0x67d21865 -//.word 0x14718f48 -//.word 0xd04e010f -//.word 0x602bfe9c -//.word 0x701924a4 -//.word 0x328be45f -//.word 0x48ae8984 -//.word 0xe4fd7574 -//.word 0x2e10aeb5 -//.word 0xe6b49aa3 -//.word 0x4a410762 -//.word 0x3a286e17 -//.word 0x9acc7958 -//.word 0xf893c2e1 -//.word 0x6e3cde88 -//.word 0xca739a73 -//.word 0xeda28488 -//.word 0x710bae25 -//.word 0x8f14ae11 -//.word 0x3fe1e9b3 -//.word 0xa0281282 -//.word 0x9b41edbd -//.word 0xc37d595c -//.word 0x80b98d46 -//.word 0x6d33a2c4 -//.word 0xfe9c5236 -//.word 0x666eff05 -//.word 0xb87ff6d8 -//.word 0x4cd7f60b -//.word 0x64beec5d -//.word 0x0f1a01e8 -//.word 0x4ef8d657 -//.word 0x76690e53 -//.word 0xd58f0e3e -//.word 0x98f70024 -//.word 0xec291eee -//.word 0x647e2dd9 -//.word 0x9b324727 -//.word 0x1abade15 -//.word 0x7c58fe0c -//.word 0xd0ecd21b -//.word 0x3e0d6aa5 -//.word 0xee58bb57 -//.word 0x2508e85d -//.word 0xb1c8c0d6 -//.word 0x88c58785 -//.word 0xac06f9c9 -//.word 0x51008ccf -//.word 0x4265f606 -//.word 0x813eefd3 -//.word 0x2d393887 -//.word 0xa944dc8e -//.word 0xfb5ab6e8 -//.word 0x729d33de -//.word 0x8ca659ed -//.word 0x16190807 -//.word 0x957c80fb -//.word 0xe5492431 -//.word 0x20417e9a -//.word 0xc20482e7 -//.word 0x0adf17f9 -//.word 0xa3e5d399 -//.word 0x8341066a -//.word 0x14cafb1b -//.word 0x91d87ae1 -//.word 0xb3569125 -//.word 0x8e19957a -//.word 0xb57063d1 -//.word 0xa5fdebf0 -//.word 0x61c3f020 -//.word 0x597f0926 -//.word 0x903cec75 -//.word 0xfe22eba2 -//.word 0x348fbf18 -//.word 0x3e69850d -//.word 0xcdb206b5 -//.word 0x965c3bb5 -//.word 0xf55f11da -//.word 0xd60a690b -//.word 0xd596637c -//.word 0xa401dc25 -//.word 0xad1a3573 -//.word 0xf9d8563d -//.word 0x51eff3f9 -//.word 0xa3a50e30 -//.word 0xa7e2be2f -//.word 0xc1872e00 -//.word 0x2a01e898 -//.word 0x4b1e5452 -//.word 0x691f7b9c -//.word 0x870e11f0 -//.word 0x8852b307 -//.word 0x95806d49 -//.word 0xbe747f87 -//.word 0xe4a161ec -//.word 0xd6a50431 -//.word 0xba205b11 -//.word 0xafc71afd -//.word 0xb0b4be10 -//.word 0xbb00cd45 -//.word 0x33945fe8 -//.word 0x843cdd4a -//.word 0x05fe09b9 -//.word 0x22a93eaf -//.word 0xbab0f94a -//.word 0xc63999fc -//.word 0x3c726384 -//.word 0x3324c91d -//.word 0x478aecf5 -//.word 0x3f635fe0 -//.word 0xed462e4e -//.word 0x56361f7b -//.word 0x137637e5 -//.word 0xf79e8003 -//.word 0xf2ef0a34 -//.word 0x35e430f6 -//.word 0x97091c58 -//.word 0x38108eb2 -//.word 0x6422d893 -//.word 0xba732efb -//.word 0x8d191cca -//.word 0x8a1e5879 -//.word 0x9bd4ba08 -//.word 0x0c688937 -//.word 0xedbaf8f9 -//.word 0xb76cf026 -//.word 0x323a1070 -//.word 0x9589f398 -//.word 0xef42b1e2 -//.word 0xc7e0a8c6 -//.word 0xffc87ce8 -//.word 0xffd95c4a -//.word 0x0f4587c0 -//.word 0x039f0fa5 -//.word 0x1e35ddcd -//.word 0x319ff6ba -//.word 0x0398fd13 -//.word 0xf50df851 -//.word 0xe67457bc -//.word 0x555f3296 -//.word 0xc551d296 -//.word 0x66d07398 -//.word 0xf1bb4892 -//.word 0xd4dec0ca -//.word 0x8fc40846 -//.word 0x5eccd184 -//.word 0x187f536c -//.word 0x57219183 -//.word 0xd986df61 -//.word 0x2628a265 -//.word 0x737658a7 -//.word 0xc76ed82e -//.word 0x5c6dda64 -//.word 0x4846b9c6 -//.word 0x5c9278e0 -//.word 0x4d480479 -//.word 0x118eb80b -//.word 0x8cce2676 -//.word 0x6c0b15f4 -//.word 0x5276c650 -//.word 0x323c7c53 -//.word 0xfca33a80 -//.word 0x7c55cf01 -//.word 0x7ffb10e0 -//.word 0x370e657a -//.word 0xe0ea8731 -//.word 0xa4258762 -//.word 0xbc1e1397 -//.word 0xd9d9f5fd -//.word 0xc20adc18 -//.word 0x3e6f5fb5 -//.word 0x34633f20 -//.word 0x11b1ec98 -//.word 0x6aa64b00 -//.word 0xe36ab7d7 -//.word 0x4f90466a -//.word 0x18eb4d48 -//.word 0xe1a326f7 -//.word 0x6b8930e5 -//.word 0xb5a818a1 -//.word 0x681c574b -//.word 0x7128fc4a -//.word 0xf082ac3c -//.word 0x51f1e733 -//.word 0xb81a8c1e -//.word 0xa397a085 -//.word 0xcb4a4b7a -//.word 0x4bf123cc -//.word 0x03faae7d -//.word 0x3f982176 -//.word 0x94166e7a -//.word 0x0b6c7e59 -//.word 0x8210bb66 -//.word 0x4e0ed22a -//.word 0x255bb75a -//.word 0x3c66e907 -//.word 0xacf1f715 -//.word 0x1a1f43ee -//.word 0x97ce0677 -//.word 0xc5269444 -//.word 0x3b72e208 -//.word 0x2b2f454f -//.word 0x42637c6f -//.word 0xd031f1bb -//.word 0x29a93cfb -//.word 0x4be5e919 -//.word 0xc1517b1d -//.word 0xc74ab05b -//.word 0xaeeb07eb -//.word 0x8223805a -//.word 0xeb0ba39f -//.word 0x5177c351 -//.word 0x43cc8417 -//.word 0x1a119b5f -//.word 0xd948d553 -//.word 0x58fe5b08 -//.word 0xa22134f9 -//.word 0x9b120bb5 -//.word 0xe6fb33d4 -//.word 0x0563e82f -//.word 0xc2ffd851 -//.word 0xcecbe228 -//.word 0xa95a1d00 -//.word 0xc16a1cb3 -//.word 0xdebc7019 -//.word 0xbd236fc6 -//.word 0xfbda34f5 -//.word 0x361ae7bf -//.word 0x6eec3f91 -//.word 0xb13d44dc -//.word 0xf7305a0e -//.word 0x4bb87bc2 -//.word 0x2b65c433 -//.word 0x327e33f7 -//.word 0xf451afea -//.word 0x2ac74868 -//.word 0x0f3bc1bf -//.word 0x098c4be3 -//.word 0x8c719464 -//.word 0x3b0d009e -//.word 0x51c43630 -//.word 0x404cdfaf -//.word 0x9807aa9b -//.word 0x29909491 -//.word 0x6c9466c3 -//.word 0x1fe37fa6 -//.word 0x30c6d3ea -//.word 0xdc9434af -//.word 0x1880d1f6 -//.word 0x30b5fc55 -//.word 0xaea530f0 -//.word 0x7d9d52a4 -//.word 0x4e9d3785 -//.word 0x3b68678b -//.word 0xaad72088 -//.word 0x75729e5d -//.word 0x48419a6e -//.word 0x4ae01153 -//.word 0xffd246d1 -//.word 0x6d170a08 -//.word 0x7d013bed -//.word 0xa5438bfb -//.word 0xc44b8226 -//.word 0x4dd2c711 -//.word 0xa8b19b80 -//.word 0xd5f6a610 -//.word 0x5337f626 -//.word 0x40264525 -//.word 0xc1667ae4 -//.word 0xa49d735f -//.word 0x44cb02ac -//.word 0xadda3531 -//.word 0x0176db15 -//.word 0x1b1e43f4 -//.word 0x717b47d7 -//.word 0x3ff18963 -//.word 0xe275fd50 -//.word 0x819ea81d -//.word 0xf3fea702 -//.word 0xddb27227 -//.word 0x1b386213 -//.word 0x62817167 -//.word 0x234742cc -//.word 0xb2a1612a -//.word 0xa7d5cb1b -//.word 0x856db19f -//.word 0x998d7911 -//.word 0x25830659 -//.word 0xbea03964 -//.word 0xf346b7d1 -//.word 0x2f43eded -//.word 0xe15d52e2 -//.word 0xd92eec2b -//.word 0xf533164b -//.word 0xfe1f80bf -//.word 0xcd757731 -//.word 0xb25567ee -//.word 0x16969e9a -//.word 0x5e165223 -//.word 0x134ee6f3 -//.word 0x402a696a -//.word 0x1c17608b -//.word 0xe95dc5f5 -//.word 0x1caf4f15 -//.word 0xbe00f49b -//.word 0x1299ad2a -//.word 0x78697954 -//.word 0x919ca4c5 -//.word 0xa46f49be -//.word 0x414216c6 -//.word 0x24ee4f9c -//.word 0x5b5a156f -//.word 0xac49e951 -//.word 0x31766cea -//.word 0x45e36869 -//.word 0xa46e14c0 -//.word 0xcda59411 -//.word 0xabdbc063 -//.word 0x757c269a -//.word 0xd39d52a6 -//.word 0x42d74dfa -//.word 0xb9566340 -//.word 0x8d2d294b -//.word 0x92ecbf4d -//.word 0x8375534a -//.word 0xa30be6cc -//.word 0xa5ac53d9 -//.word 0xc9a18d22 -//.word 0x4953287d -//.word 0xf3601b95 -//.word 0x17eec4e0 -//.word 0xa3402cd2 -//.word 0x8d878d51 -//.word 0x71fa1168 -//.word 0x7c28dd3f -//.word 0x888d4e4b -//.word 0x886482c2 -//.word 0x27bd1b52 -//.word 0xaccf3f12 -//.word 0x218fe3b9 -//.word 0xb4824a0e -//.word 0x5dcfc89f -//.word 0xc198ccb6 -//.word 0x578a1e89 -//.word 0xc9b364b1 -//.word 0x9d94ebdd -//.word 0x1478a4c8 -//.word 0x52046d68 -//.word 0xc00e9269 -//.word 0xafb394d9 -//.word 0x3ea32925 -//.word 0x7dc08344 -//.word 0xd2e8d532 -//.word 0x9c0e14a0 -//.word 0x1790fbea -//.word 0x80c45149 -//.word 0x79d46e4a -//.word 0xaecdfc7e -//.word 0xb9f2fb73 -//.word 0x435607e4 -//.word 0x6caade2d -//.word 0x6d531d01 -//.word 0x7cc04a5f -//.word 0xf1fa17c2 -//.word 0xa67ce599 -//.word 0xa34688f6 -//.word 0xfb2d4a8a -//.word 0xf17532d1 -//.word 0x5fa1868a -//.word 0x598a8e6a -//.word 0x0daf9b11 -//.word 0xedcc483d -//.word 0x11ae003e -//.word 0xd645c0aa -//.word 0xccfb1e51 -//.word 0xcf448b73 -//.word 0x7376d531 -//.word 0xa6dcf042 -//.word 0x9005f5e7 -//.word 0xbe626b21 -//.word 0x8011c621 -//.word 0x8ff32d00 -//.word 0xf30480b0 -//.word 0x24ec9a33 -//.word 0x70d1d30a -//.word 0x9c70c9f1 -//.word 0xce6c61c9 -//.word 0xabe508d6 -//.word 0xbc4d3f2a -//.word 0x16775661 -//.word 0x3af1778f -//.word 0x3a94e777 -//.word 0x1d5989fe -//.word 0x856fa4df -//.word 0x8f8ae59f -//.word 0xfb7da8c4 -//.word 0x8d0b7342 -//.word 0xb2fac336 -//.word 0x676a0cd6 -//.word 0x5765fba8 -//.word 0x43b7fef3 -//.word 0xa7000674 -//.word 0x9b078c51 -//.word 0xf751d253 -//.word 0xbaf36b4f -//.word 0xada4fde5 -//.word 0x4316466d -//.word 0xc4875d2f -//.word 0xaa933ad2 -//.word 0x4c4c7918 -//.word 0xb98c5bc8 -//.word 0xe78a0eeb -//.word 0x0dac2e3a -//.word 0x4d9c8bd8 -//.word 0x969e2d3d -//.word 0xc9219572 -//.word 0x1a934684 -//.word 0xba7a8433 -//.word 0xb3c15cea -//.word 0x134fe4f4 -//.word 0x4cdfc4ec -//.word 0xdb0bf575 -//.word 0x28a9c92c -//.word 0xad5b2cdb -//.word 0x5b6229f0 -//.word 0x39b3b02d -//.word 0x4f4d96a0 -//.word 0xc2c9ddd6 -//.word 0x4033364c -//.word 0x9e18c426 -//.word 0xc0e02323 -//.word 0xba5ea9d1 -//.word 0x34a6ebfd -//.word 0x131f836e -//.word 0x56d911d3 -//.word 0x3d2080f9 -//.word 0xb1518b41 -//.word 0xe0ec7f52 -//.word 0x28eb420b -//.word 0x365294bb -//.word 0x6f089595 -//.word 0x8ee5875e -//.word 0x8f0cd669 -//.word 0xcd7b55c5 -//.word 0x67e0cbb5 -//.word 0xe7aeae60 -//.word 0x26712eca -//.word 0x6a5f7603 -//.word 0xd22f2e9f -//.word 0xf42e4465 -//.word 0xc48fec4c -//.word 0xb802e5a3 -//.word 0x2989fe8f -//.word 0xfd87daba -//.word 0x831af04a -//.word 0x9eabd510 -//.word 0x26c4be02 -//.word 0x8b2141ec -//.word 0xbb095b62 -//.word 0x46dfb7f9 -//.word 0xc0f42db7 -//.word 0x689f8ac7 -//.word 0x06908f71 -//.word 0x1a613c4a -//.word 0x326e4ea8 -//.word 0x9ce70659 -//.word 0x3d232c95 -//.word 0xc1375430 -//.word 0xf5c86014 -//.word 0x701d46ef -//.word 0x79781329 -//.word 0x25a73019 -//.word 0xc0d6e478 -//.word 0x6ea71b16 -//.word 0x128566cb -//.word 0x6f3542b1 -//.word 0x8ead9d90 -//.word 0x5f2a969a -//.word 0xa27d8559 -//.word 0x08a53be5 -//.word 0x96a38b5a -//.word 0x4b8a0989 -//.word 0x02d611ee -//.word 0x9afe0be3 -//.word 0x534dee12 -//.word 0x7bed0330 -//.word 0x4b45ece9 -//.word 0x0c85e416 -//.word 0x7d7e4836 -//.word 0x79b8571c -//.word 0xd5be36e5 -//.word 0x88bd362d -//.word 0x0e4d5a83 -//.word 0x0e8f1419 -//.word 0x3a7850c0 -//.word 0x766cb314 -//.word 0x3d0f25f4 -//.word 0x41588d36 -//.word 0x52e7db98 -//.word 0x81984cf9 -//.word 0x8558e9c9 -//.word 0x5e3752be -//.word 0x38bfb9c8 -//.word 0x91843148 -//.word 0x9efd297d -//.word 0xeb92333e -//.word 0x43f60bef -//.word 0xcfb7d4ae -//.word 0x8114a4cd -//.word 0xb40e4385 -//.word 0x0cc230e8 -//.word 0xa4f5e518 -//.word 0x68f15cb7 -//.word 0xbf90d29e -//.word 0x6e96cbd2 -//.word 0xb94356b3 -//.word 0xca299277 -//.word 0x573c71d7 -//.word 0x8028bc08 -//.word 0xf6e758ed -//.word 0x6292c78b -//.word 0x0577f1bd -//.word 0x9b6d2529 -//.word 0x86645b72 -//.word 0x2840bcb0 -//.word 0x91e8641d -//.word 0x5a996610 -//.word 0xd0811030 -//.word 0x568971e1 -//.word 0x04721903 -//.word 0x942320dc -//.word 0x7f416a52 -//.word 0x6301285e -//.word 0xa83aa2bd -//.word 0x63bf35e9 -//.word 0x7aeb9747 -//.word 0x0a7d63a2 -//.word 0x05a6d1d8 -//.word 0x2061c4d3 -//.word 0xec030bbb -//.word 0x4213e06a -//.word 0xe55bb521 -//.word 0x633f3179 -//.word 0x3c4e759c -//.word 0x4617a3b4 -//.word 0x503ea1a4 -//.word 0x06cf1af7 -//.word 0x15d1c615 -//.word 0x8f1fecbd -//.word 0x907325af -//.word 0x22c462a9 -//.word 0x5ed23095 -//.word 0xd4ff3b01 -//.word 0x2d6011cf -//.word 0x0f14292e -//.word 0x41d424c9 -//.word 0x10cc523e -//.word 0xf1a978d1 -//.word 0x67f4d162 -//.word 0x279e529c -//.word 0x7bdc3270 -//.word 0xe435aac1 -//.word 0x03d8fa61 -//.word 0xb934ac3d -//.word 0x8ec31cd4 -//.word 0x4f2638ee -//.word 0xfb77858a -//.word 0xe1db6318 -//.word 0x025691e8 -//.word 0xbce4f3e3 -//.word 0xaac59379 -//.word 0xc618e7da -//.word 0xd0ab5269 -//.word 0xf412ec6d -//.word 0xa7f6860a -//.word 0xd2b0e971 -//.word 0x32165f53 -//.word 0xfe95759b -//.word 0xcb81fe5c -//.word 0xaea85b08 -//.word 0xa02dfae4 -//.word 0x26941db8 -//.word 0x3119ddcb -//.word 0x42466e0e -//.word 0xd3c4a498 -//.word 0xf372b652 -//.word 0x30b443f4 -//.word 0xb90e9230 -//.word 0xc4f11e2c -//.word 0x2ed45236 -//.word 0x618791b4 -//.word 0x7bc47959 -//.word 0xad08699f -//.word 0xe0a04071 -//.word 0x9f076827 -//.word 0x316f14b8 -//.word 0x059ec52b -//.word 0x54fb134f -//.word 0x01e9aaac -//.word 0xc45393b9 -//.word 0x8788b550 -//.word 0x104a9b5e -//.word 0xe12177df -//.word 0x5cf6670a -//.word 0x2bdcf8c8 -//.word 0xdf31e96b -//.word 0xd7e6319d -//.word 0x641b4296 -//.word 0x2aef9093 -//.word 0xca964d83 -//.word 0xbeac7703 -//.word 0x84c8158c -//.word 0xfe55beeb -//.word 0x199d5af2 -//.word 0xad272d6e -//.word 0xa4431159 -//.word 0x5fe30250 -//.word 0x55ace047 -//.word 0xfd4d717b -//.word 0xef10a6a8 -//.word 0x46ae1f7c -//.word 0x4868f04c -//.word 0x4953a607 -//.word 0xccf48568 -//.word 0xec0c146f -//.word 0xfab5dc11 -//.word 0x68ae6c2f -//.word 0xe5f4a0c5 -//.word 0xca922364 -//.word 0xb5b933e2 -//.word 0x7313a450 -//.word 0x2455282c -//.word 0x9914cdd8 -//.word 0x01d9c74b -//.word 0xc5777007 -//.word 0xb09c8d4a -//.word 0x53a7d389 -//.word 0xa8b9aa1a -//.word 0xf50f3031 -//.word 0xf38f810d -//.word 0x30a03673 -//.word 0xb23f2b5c -//.word 0xdd5086eb -//.word 0x9731f4a1 -//.word 0xa99536d4 -//.word 0x6890dd5d -//.word 0x96ee5192 -//.word 0x83c91874 -//.word 0x775b5529 -//.word 0x54108fac -//.word 0x78dfb4c3 -//.word 0xe1db5e31 -//.word 0x9405542d -//.word 0x3f655414 -//.word 0x1d59105b -//.word 0x1a2c76c7 -//.word 0x38ea34e0 -//.word 0x31737ca3 -//.word 0x5ecf0477 -//.word 0xd7c15262 -//.word 0xdc9f367d -//.word 0x736098a5 -//.word 0x53f77374 -//.word 0x01e0226f -//.word 0x39f8db81 -//.word 0x8f9179a9 -//.word 0x56c67eef -//.word 0xc10c589c -//.word 0x480ae3aa -//.word 0x4dab307a -//.word 0x007185c5 -//.word 0x800ca4d5 -//.word 0x432b50f5 -//.word 0xb7920e26 -//.word 0x296c2913 -//.word 0xe7e3f847 -//.word 0xa1ef639e -//.word 0x156ba4f9 -//.word 0xec6e4b36 -//.word 0xded88560 -//.word 0x1d2b9d22 -//.word 0xf19dc382 -//.word 0x9f6b0dcc -//.word 0x906fbbcb -//.word 0xaff5bf3f -//.word 0x13cb7d8c -//.word 0xde97cfb0 -//.word 0x656d4c77 -//.word 0x91a1caf2 -//.word 0x85da2125 -//.word 0x80683200 -//.word 0x05d82891 -//.word 0x3ac5fe77 -//.word 0x8ff1429a -//.word 0x9f941819 -//.word 0x5bf38184 -//.word 0x6535dd4c -//.word 0xba72af77 -//.word 0x940ea198 -//.word 0x8f45c8ff -//.word 0x0a06282d -//.word 0xd0057b8b -//.word 0xf80c2e5b -//.word 0x0991adee -//.word 0x628ee017 -//.word 0xd98df5e1 -//.word 0xa302617d -//.word 0x74de217e -//.word 0xe6614649 -//.word 0x1f30b0c6 -//.word 0xaea71a5c -//.word 0xb770571d -//.word 0x5055da3d -//.word 0x2a527cc9 -//.word 0x74ef7a95 -//.word 0xfccdbd77 -//.word 0x987e5fb2 -//.word 0xc4996ab5 -//.word 0x8c0ee306 -//.word 0xadb80779 -//.word 0xf731d4a5 -//.word 0xf5eacb98 -//.word 0xd07bf5ca -//.word 0x71372450 -//.word 0xe6047b52 -//.word 0x076a30bf -//.word 0x59e9913f -//.word 0x3290456a -//.word 0x1ecbd537 -//.word 0x827d6bb7 -//.word 0x7f4ed903 -//.word 0x1947dc73 -//.word 0x999ca210 -//.word 0x2fc88b4c -//.word 0xdcdf2df1 -//.word 0x8f209a58 -//.word 0x8fcae5db -//.word 0x1832e28c -//.word 0x49112e28 -//.word 0x3e226f46 -//.word 0x79edddd4 -//.word 0x86dd02c4 -//.word 0xde99bd03 -//.word 0x0d918dab -//.word 0x10d70c79 -//.word 0x0131ba81 -//.word 0xf66cfc20 -//.word 0x26f36533 -//.word 0x4da03386 -//.word 0x52d11d90 -//.word 0x27bf4c5d -//.word 0xf20ba7cb -//.word 0x6a9a53f9 -//.word 0x83a37afd -//.word 0x4d064cd5 -//.word 0x19e044a0 -//.word 0xdf5cad0f -//.word 0xdccc6416 -//.word 0x7ff8dfe7 -//.word 0x86b56e20 -//.word 0x65bac143 -//.word 0xe7b0ab68 -//.word 0x1788252e -//.word 0x611196f7 -//.word 0xf5ca5255 -//.word 0x6cf560bf -//.word 0xaeec8089 -//.word 0x13b86c13 -//.word 0xc8e05f40 -//.word 0x757fd429 -//.word 0x1c999013 -//.word 0x45afe29f -//.word 0x58912a41 -//.word 0x4a7498f3 -//.word 0x7b44362b -//.word 0xdf3c290a -//.word 0x5db334d6 -//.word 0x74397daa -//.word 0x24e2946c -//.word 0x0ce2b100 -//.word 0xd05a3dbb -//.word 0xbd72941b -//.word 0xb0a80ab5 -//.word 0x33682c6e -//.word 0xeadc48ee -//.word 0x2e052f52 -//.word 0xf70b3921 -//.word 0xffd18a82 -//.word 0x24cd94ac -//.word 0x0e17dd9d -//.word 0x13bf020f -//.word 0x5764fda8 -//.word 0x3802a371 -//.word 0xe90c7089 -//.word 0x5cbb871b -//.word 0x66a5f58d -//.word 0x1e9136fa -//.word 0x868afae3 -//.word 0x6d322921 -//.word 0x9359241e -//.word 0x0fce4e45 -//.word 0xee75cbb7 -//.word 0x1d9a8740 -//.word 0x89857a89 -//.word 0x844f2b8f -//.word 0x6bf47353 -//.word 0x85a884d4 -//.word 0x2f6f293a -//.word 0x36e85054 -//.word 0x8569c544 -//.word 0x00514079 -//.word 0xaf9aa2de -//.word 0x1fae7c51 -//.word 0x057cd157 -//.word 0x25ca1d0e -//.word 0x72cd9563 -//.word 0x77f7b184 -//.word 0xf510e899 -//.word 0xce88baaf -//.word 0x210cf4f4 -//.word 0xb757302a -//.word 0x9e4b9b56 -//.word 0x1340fbb8 -//.word 0xa69cf000 -//.word 0x98a379bf -//.word 0x8891bb1c -//.word 0x4ee6fec8 -//.word 0x2802f934 -//.word 0x14f14f01 -//.word 0x7c8859b8 -//.word 0x18b126bb -//.word 0x1103c07b -//.word 0x6296b1ec -//.word 0x8415c636 -//.word 0x4a1413ae -//.word 0x0aa43704 -//.word 0xfd25e2bd -//.word 0xe85c94e4 -//.word 0xfcc6a7fd -//.word 0xfb2b8f3b -//.word 0x9d7561f3 -//.word 0x32c3924f -//.word 0x88ba0147 -//.word 0x0f1b38cd -//.word 0x3b9bef48 -//.word 0x2aefd244 -//.word 0x87268568 -//.word 0xae3be4a8 -//.word 0x11eb8fbc -//.word 0xdac4a6d0 -//.word 0xd27fd17d -//.word 0x818f84f8 -//.word 0x97fa8189 -//.word 0x8a689e3f -//.word 0x8179c8e3 -//.word 0x715c482a -//.word 0x859e452e -//.word 0xc43f8a1f -//.word 0xee0b8a36 -//.word 0xa627a1eb -//.word 0xd6eb9d68 -//.word 0x50ef7d3d -//.word 0xb1697955 -//.word 0x8bb64229 -//.word 0xc3368a33 -//.word 0x375dc7a6 -//.word 0xa407345c -//.word 0xc80c1910 -//.word 0xc3154dcd -//.word 0xc3aef9a6 -//.word 0xe09c9ea8 -//.word 0x45705a0d -//.word 0x915c67b2 -//.word 0x7d46e4cc -//.word 0xbe1bd8d6 -//.word 0x2d6674ce -//.word 0x252198a0 -//.word 0x2cca99e3 -//.word 0xd6ba42c3 -//.word 0xe7b3183e -//.word 0xb8b8e294 -//.word 0xdc2169f8 -//.word 0x02ee7d8c -//.word 0x1d5c388c -//.word 0xc3b687c9 -//.word 0xd36ee55a -//.word 0x5b6c6a8e -//.word 0xb9a60525 -//.word 0x00f106bf -//.word 0x9d16df94 -//.word 0x3a292b66 -//.word 0xe216efb4 -//.word 0x667d2031 -//.word 0x00c06674 -//.word 0x375a20f1 -//.word 0x0272a828 -//.word 0x30afd81c -//.word 0x074fcd07 -//.word 0x2c73ea4c -//.word 0xc3bd20ad -//.word 0xd61d6dbe -//.word 0xfbe8a399 -//.word 0x312b6bd4 -//.word 0x0c3e89b0 -//.word 0x129c6293 -//.word 0x64f1bbb9 -//.word 0xa175c326 -//.word 0x077954df -//.word 0xdb3f7659 -//.word 0x0b0f2532 -//.word 0x1387541f -//.word 0x1d333126 -//.word 0x6c5eab0d -//.word 0xfa273112 -//.word 0x60d7bddc -//.word 0xf77112b2 -//.word 0x3d8b42eb -//.word 0x7a5d72a5 -//.word 0xa318e1ba -//.word 0x7e7927f0 -//.word 0x079dbb70 -//.word 0x1317b87a -//.word 0x3340e156 -//.word 0xdbcee28e -//.word 0xc3a8d95a -//.word 0x8ef9145c -//.word 0xaa831c8d -//.word 0x7737f378 -//.word 0xab029ba6 -//.word 0xf5e9d759 -//.word 0xe058367d -//.word 0xfbb74cdb -//.word 0x373f4390 -//.word 0x900c93bd -//.word 0xef730d81 -//.word 0x4f951e24 -//.word 0x1f345295 -//.word 0xe8c61717 -//.word 0x30c8c437 -//.word 0x9e55d901 -//.word 0x5ff78873 -//.word 0xc7bd7532 -//.word 0x3c8ebb7c -//.word 0x50bc2f5e -//.word 0x2ddce827 -//.word 0x36d6ff1c -//.word 0xeb38936d -//.word 0x0dd01068 -//.word 0x0379b1ed -//.word 0x7d354422 -//.word 0x577c2e67 -//.word 0xc0d4ae8d -//.word 0x9ba26642 -//.word 0x254017d0 -//.word 0xd94fac08 -//.word 0x914f7a78 -//.word 0xed6dc6e5 -//.word 0xf89b87f5 -//.word 0x09e66e2b -//.word 0xe8042418 -//.word 0x322dd3d0 -//.word 0xff2de79c -//.word 0xc1b616ee -//.word 0x70fa9d9a -//.word 0xe479cd42 -//.word 0x8218c712 -//.word 0x1a7484ae -//.word 0x10751869 -//.word 0xba2637b8 -//.word 0x0ac4f8e6 -//.word 0x6d15d909 -//.word 0xf2fa0334 -//.word 0xaf48d0ee -//.word 0x61d48be3 -//.word 0x52cd77da -//.word 0x804f12e7 -//.word 0xfb349ae2 -//.word 0x8f2ed117 -//.word 0xa313fe3f -//.word 0x617734b0 -//.word 0x1780d6d0 -//.word 0xddf65bcf -//.word 0x799a4f96 -//.word 0x7fb99afa -//.word 0xbd000536 -//.word 0xd592fa98 -//.word 0x2c588b7a -//.word 0x0398b774 -//.word 0xe4cae8d0 -//.word 0x40a7bf3e -//.word 0x568214c9 -//.word 0x56db390a -//.word 0xc7327f9c -//.word 0x2619fcd0 -//.word 0xd08d8ba1 -//.word 0x228613ea -//.word 0xdecd0dd6 -//.word 0xd00e4098 -//.word 0xb22ecf5d -//.word 0x4ede767f -//.word 0xe27111fc -//.word 0xc8ea5e26 -//.word 0x565a039c -//.word 0x0469d378 -//.word 0xcc324dca -//.word 0xd7546546 -//.word 0x55458839 -//.word 0xadeadac2 -//.word 0xd665c23e -//.word 0x042fa804 -//.word 0x8866fd53 -//.word 0xf1687c88 -//.word 0x78a0b094 -//.word 0x9ba0b7ae -//.word 0x07704545 -//.word 0xbb26ec39 -//.word 0x6bb79a4a -//.word 0x220d63d1 -//.word 0x2c5a80ae -//.word 0x33ab9881 -//.word 0xa8c03f1d -//.word 0x651bbd39 -//.word 0x90571069 -//.word 0xc2bb344d -//.word 0x680fa108 -//.word 0x6aae16f4 -//.word 0x0bdd9595 -//.word 0x115baecb -//.word 0x253a014b -//.word 0x7cecff4f -//.word 0xb7a1f08d -//.word 0x08d13a66 -//.word 0x9714e061 -//.word 0x243a49d7 -//.word 0xed9843f0 -//.word 0xd2a047ce -//.word 0xb7b5ff07 -//.word 0x2a3d0559 -//.word 0x45f7ee99 -//.word 0xd68e87ed -//.word 0xbe6f5e3b -//.word 0x97d884e1 -//.word 0x9a3292a7 -//.word 0xbfa1eaf1 -//.word 0x25d93f3a -//.word 0xb53358bd -//.word 0x03001075 -//.word 0x741da248 -//.word 0xa6c82380 -//.word 0x0cb1507a -//.word 0xd9548aa2 -//.word 0x20871f9f -//.word 0x394fcbca -//.word 0x66f87fe5 -//.word 0xb665600a -//.word 0x2aa413e1 -//.word 0x17c53816 -//.word 0xcbed340a -//.word 0x73a634c9 -//.word 0x3d796f3d -//.word 0xb9bfaba1 -//.word 0x85b40237 -//.word 0x29cde63e -//.word 0x404c631f -//.word 0xd911a4e7 -//.word 0x1cb3b9f9 -//.word 0x31cf9705 -//.word 0x5da06034 -//.word 0x6ed0e5a5 -//.word 0x5a8e6a1d -//.word 0x23e1a9fa -//.word 0xfd3c1969 -//.word 0xb3526fd9 -//.word 0x472b65b0 -//.word 0xd978bb3c -//.word 0xc9247cec -//.word 0x202b83c0 -//.word 0x2caf3dfe -//.word 0x6b49b127 -//.word 0xab9dbd29 -//.word 0x6e31a2d6 -//.word 0x937fc395 -//.word 0x3348a957 -//.word 0xca2c4bcd -//.word 0x97788cd9 -//.word 0x453f0642 -//.word 0xcaac06ab -//.word 0x9096d7c6 -//.word 0xd25544c5 -//.word 0x4ad45811 -//.word 0x09e8683f -//.word 0xa6e05440 -//.word 0x9a5e09d7 -//.word 0xeb654a50 -//.word 0x08b2b170 -//.word 0xf450f0a8 -//.word 0xa7675d8d -//.word 0xb255ae8d -//.word 0x21ff00da -//.word 0xa5691fab -//.word 0xf38501a4 -//.word 0x67499392 -//.word 0xed04b95c -//.word 0x21f28f37 -//.word 0xb50ef618 -//.word 0x13274c6f -//.word 0x44367a12 -//.word 0x11ef3477 -//.word 0x68967c27 -//.word 0x0114686f -//.word 0x404a2659 -//.word 0x5ea53ddb -//.word 0xc4f3154d -//.word 0xb775ba20 -//.word 0x3a35ddce -//.word 0x30991c0d -//.word 0xc2398348 -//.word 0x00ee524f -//.word 0xcb2b004e -//.word 0xf29181fc -//.word 0x9bbdc514 -//.word 0xe5658109 -//.word 0xcba331f6 -//.word 0x4c905ed3 -//.word 0xc8151cef -//.word 0xaefed89a -//.word 0x54505022 -//.word 0x26dde302 -//.word 0x03150b55 -//.word 0xe41f2891 -//.word 0xbf297f71 -//.word 0xabfc8233 -//.word 0x44d35204 -//.word 0x516d82b9 -//.word 0xa4611ebf -//.word 0x42b2eb55 -//.word 0xc4a3f1f8 -//.word 0xfdcc371f -//.word 0xdd6ece29 -//.word 0x95041094 -//.word 0xfc1a2a6f -//.word 0x3262d812 -//.word 0x8305700c -//.word 0x8e37225d -//.word 0xa60e7ee6 -//.word 0x7894361d -//.word 0xee1b2605 -//.word 0x54d0915e -//.word 0xba93ae18 -//.word 0x9906630e -//.word 0xb9e450f1 -//.word 0x51950f82 -//.word 0x71ffba05 -//.word 0x9d9eaef2 -//.word 0xbad78fed -//.word 0x2f898df8 -//.word 0x44e6e5e8 -//.word 0xcd81aa15 -//.word 0x0da7c556 -//.word 0xd5f33b2d -//.word 0xec1dae3e -//.word 0xb3132706 -//.word 0x094b12c9 -//.word 0x6d578acc -//.word 0x62bad7c5 -//.word 0x18fa3590 -//.word 0x48f6d723 -//.word 0x607a2cc4 -//.word 0xe011617a -//.word 0x041a27c1 -//.word 0xa31eb681 -//.word 0x57611241 -//.word 0xdeb78d98 -//.word 0xc0998de5 -//.word 0x32788f40 -//.word 0x3b516cb1 -//.word 0x1582db9f -//.word 0xd6dc388b -//.word 0x50f984fe -//.word 0x35d0acbf -//.word 0x7f860e4a -//.word 0x0e88397e -//.word 0x93d6f496 -//.word 0xaea2835a -//.word 0x53192596 -//.word 0x7281e1cc -//.word 0xd7848226 -//.word 0x4fcbe1ae -//.word 0x0ccf62c1 -//.word 0x4aecc1c1 -//.word 0x33b80f0b -//.word 0x0092f729 -//.word 0x627e4648 -//.word 0x2030abec -//.word 0x0166bae2 -//.word 0xec7b3777 -//.word 0x4e3992e7 -//.word 0xbcf0ae18 -//.word 0xdac4e688 -//.word 0x7b4b5284 -//.word 0x0958469c -//.word 0x28111c53 -//.word 0x9648341b -//.word 0x55083880 -//.word 0x0d6da5a3 -//.word 0xacb987ea -//.word 0x4fa584f6 -//.word 0x65f51bd5 -//.word 0x114f2e79 -//.word 0xd14dbe69 -//.word 0x5ed1f7b7 -//.word 0xd3996c32 -//.word 0x1013a3dc -//.word 0x6172d49f -//.word 0x5b01ee3b -//.word 0x07b7db83 -//.word 0x430c05c9 -//.word 0x640c1997 -//.word 0x20aa0ba0 -//.word 0xac565af5 -//.word 0x21d2957c -//.word 0x24411e9f -//.word 0xc6812e41 -//.word 0xa9ba19f6 -//.word 0x6537d373 -//.word 0x2975b343 -//.word 0xa67a78bc -//.word 0x28688a32 -//.word 0x0652826a -//.word 0x3d4eeb51 -//.word 0x58cc4aee -//.word 0x93265d96 -//.word 0x3f78a15f -//.word 0x68b116d7 -//.word 0xb6ea46f5 -//.word 0x91f7844f -//.word 0x883c728e -//.word 0xf4c2c61f -//.word 0xd88b4d2c -//.word 0x0c2230cb -//.word 0x9b757675 -//.word 0x69e7cab9 -//.word 0x19a27e31 -//.word 0x2d2ad1b6 -//.word 0x6f386dd0 -//.word 0x90c53470 -//.word 0x10653ce2 -//.word 0x5dd618fd -//.word 0x3fd95a9d -//.word 0x73405553 -//.word 0x9749285a -//.word 0x462af8cd -//.word 0x83ed7c18 -//.word 0x5b7ebfad -//.word 0xc60321f8 -//.word 0xcf6b9f94 -//.word 0xf44a55bf -//.word 0xd0e4410b -//.word 0xf7874a57 -//.word 0x221f81fe -//.word 0x8c04a64e -//.word 0x9b16ee3c -//.word 0xc30c0355 -//.word 0xa8094df8 -//.word 0x827070c3 -//.word 0xc6fa164b -//.word 0x0306ee10 -//.word 0x0930f5b0 -//.word 0x5124f45a -//.word 0x99b54986 -//.word 0xcf29ebe3 -//.word 0x30d7a991 -//.word 0xb1f5b291 -//.word 0x9eab5a7a -//.word 0x816b1b6d -//.word 0x4585da4a -//.word 0x9bf66c24 -//.word 0x9d8159f3 -//.word 0xb102e089 -//.word 0xb1fe3bc8 -//.word 0x497e2411 -//.word 0xa01e97ff -//.word 0x3a61da56 -//.word 0x1d47bb36 -//.word 0x32221995 -//.word 0xefa5a5ec -//.word 0x333eea2f -//.word 0x71a68b03 -//.word 0x11b6cc2c -//.word 0x137c5444 -//.word 0xf68e32b3 -//.word 0xd89e1ddb -//.word 0xde4f0093 -//.word 0xd647b6d7 -//.word 0x1b8511bd -//.word 0xb9f522ab -//.word 0xd242b4c8 -//.word 0x41ec1ab0 -//.word 0x7c9a2b6c -//.word 0xbfb18aa1 -//.word 0x67252b07 -//.word 0x9c90121d -//.word 0x32815e1c -//.word 0xd1168729 -//.word 0x54cde4ce -//.word 0x709770ab -//.word 0x962ecd69 -//.word 0x1aa989f0 -//.word 0x944ea1da -//.word 0x87a74327 -//.word 0x40d8d832 -//.word 0x012f42e3 -//.word 0x5ffd6227 -//.word 0xe9a4de9d -//.word 0x0af22193 -//.word 0x31ada330 -//.word 0x2e6f6af2 -//.word 0xe0b4d15c -//.word 0x0d3288e8 -//.word 0x9169dc43 -//.word 0xbb7a38b9 -//.word 0xf43cecee -//.word 0xa18d2ed0 -//.word 0x4be65ec9 -//.word 0xfd338f39 -//.word 0xeee14223 -//.word 0x60387427 -//.word 0xc8ebdcb0 -//.word 0x2fed6e6e -//.word 0xd8872307 -//.word 0x23a8fc09 -//.word 0xb17c4524 -//.word 0xc93f1796 -//.word 0xfb5420e6 -//.word 0x0391a6d5 -//.word 0xf0deca92 -//.word 0x85fe0a2d -//.word 0xdfac0a4e -//.word 0x58ea9427 -//.word 0xac96dda7 -//.word 0x5a3e0af0 -//.word 0x4d35f20c -//.word 0xbce626db -//.word 0x4f692f50 -//.word 0x835416dd -//.word 0x4fd42a2c -//.word 0x08fcfd10 -//.word 0x825cb0bb -//.word 0x78d67031 -//.word 0x2dad41fd -//.word 0x54dffa22 -//.word 0x2db59154 -//.word 0xf2989968 -//.word 0x7126090a -//.word 0xfa853fae -//.word 0x7bf745c9 -//.word 0xeaaf5240 -//.word 0xe3e49420 -//.word 0x93232c91 -//.word 0xd4e97b05 -//.word 0x99719cb5 -//.word 0x8dcb314e -//.word 0xf72e63e7 -//.word 0xe18f2437 -//.word 0x7972b705 -//.word 0xb70173df -//.word 0x405bc40f -//.word 0x8b2e72cb -//.word 0x428826ac -//.word 0xebea2a62 -//.word 0xc79f70a5 -//.word 0xfa4bd66e -//.word 0xedc7a868 -//.word 0xf12c66a1 -//.word 0x252ec886 -//.word 0x99ac000e -//.word 0xb3843f35 -//.word 0xd2ac7aac -//.word 0x327f6ecf -//.word 0x1054e2d7 -//.word 0x0e552c51 -//.word 0xd88ff6cf -//.word 0x084542dd -//.word 0x478aac36 -//.word 0xb50fef38 -//.word 0x8c39ab96 -//.word 0x0076664d -//.word 0x69d2d0d9 -//.word 0xa3c54ba8 -//.word 0xb54faacf -//.word 0xb24739fc -//.word 0xddf1feab -//.word 0x10ce3f9d -//.word 0x5fb84586 -//.word 0xf82e5f07 -//.word 0x4dec29db -//.word 0x76be0d55 -//.word 0xd0970b0a -//.word 0xebddb6cb -//.word 0xa3087fd6 -//.word 0x8c6b364c -//.word 0x9451cee6 -//.word 0xe34c61e4 -//.word 0x06ca7347 -//.word 0x4de97b40 -//.word 0x718da0e8 -//.word 0x7aafc031 -//.word 0xe0f8b61d -//.word 0xf18edd2e -//.word 0x722ed01d -//.word 0x897b74cf -//.word 0xdb953984 -//.word 0xf1ee9c52 -//.word 0xe059f1d2 -//.word 0x29645f19 -//.word 0xdee82ce9 -//.word 0x06de3a29 -//.word 0x4374d293 -//.word 0xb261a1ad -//.word 0x137500fa -//.word 0x2a747971 -//.word 0x6424862e -//.word 0xbea59b68 -//.word 0xe30167a3 -//.word 0x94045826 -//.word 0x4d4e5db0 -//.word 0x26a6ef67 -//.word 0xf7915211 -//.word 0xbf231886 -//.word 0x4716e865 -//.word 0x02197d07 -//.word 0x386af1b1 -//.word 0x63a73c0e -//.word 0xdae2f8dc -//.word 0xacf367e5 -//.word 0xcf12b631 -//.word 0x7aa5837a -//.word 0xcf569ee0 -//.word 0xbd690cde -//.word 0x254c527d -//.word 0x3b70f0c7 -//.word 0x30582b7f -//.word 0x0ef00f0f -//.word 0xe31fb5c2 -//.word 0x219fc233 -//.word 0x450d3006 -//.word 0xb73c51d5 -//.word 0xf1cf106d -//.word 0xe4077b3b -//.word 0x97d97e01 -//.word 0x1244f1cd -//.word 0x7ae1d62c -//.word 0x7dbcdb9b -//.word 0xf162273e -//.word 0xb73b52d5 -//.word 0xe61ab5eb -//.word 0x2513e550 -//.word 0x598d7aca -//.word 0x81971508 -//.word 0xdd80a1d7 -//.word 0x56a1d899 -//.word 0x1a7e09f2 -//.word 0x870e19c4 -//.word 0x4a56c95e -//.word 0xc83d36f0 -//.word 0xbd9ba642 -//.word 0x229381a6 -//.word 0x55239e2c -//.word 0x74f9c014 -//.word 0x09886189 -//.word 0xed5cae8c -//.word 0x66aad22e -//.word 0x932c7702 -//.word 0x0a2b8ad2 -//.word 0xbfde3f91 -//.word 0x28f25691 -//.word 0x9e6a9cf6 -//.word 0x07a9b46b -//.word 0xb2cd1713 -//.word 0x823f5ac2 -//.word 0x4f88b06e -//.word 0x8967afe0 -//.word 0x1e2057af -//.word 0x9e16506f -//.word 0x9e9c7326 -//.word 0x5a098cff -//.word 0x9e0a5e43 -//.word 0xe63de884 -//.word 0xc4fbe71c -//.word 0x82759cd6 -//.word 0x0802cfea -//.word 0x01b7142f -//.word 0x3a394d8c -//.word 0x4acf70af -//.word 0x78bb8b02 -//.word 0xd9cb05db -//.word 0xb92b26f4 -//.word 0x3c7dd91a -//.word 0x452bb129 -//.word 0x97fc2b37 -//.word 0x3be63310 -//.word 0x2124e9e3 -//.word 0x0a88a43a -//.word 0xa411372f -//.word 0xf7c074dd -//.word 0x01a8ef16 -//.word 0x9d450554 -//.word 0xaa0e1cf1 -//.word 0x684d2b9a -//.word 0x252f7e01 -//.word 0x1a17b3d2 -//.word 0x903809e9 -//.word 0x4763dac2 -//.word 0x171d6530 -//.word 0xd8f5d152 -//.word 0x80156fc3 -//.word 0x8b164012 -//.word 0xa019b772 -//.word 0x7113bfb2 -//.word 0xe368006f -//.word 0x6fbc5e88 -//.word 0xc705c3d2 -//.word 0xbde51f0d -//.word 0x6138ad17 -//.word 0x6ae97760 -//.word 0xd8091c9e -//.word 0xd722d1c2 -//.word 0xe5c8a62a -//.word 0x37720b18 -//.word 0x59889263 -//.word 0x16bdf66c -//.word 0x979f5d54 -//.word 0xcf6cda6c -//.word 0x162836ed -//.word 0x13ecf0ea -//.word 0xe0818282 -//.word 0x692ee65a -//.word 0x15cd594b -//.word 0xa9245f57 -//.word 0x697307e2 -//.word 0x804a701e -//.word 0xa19d8cc8 -//.word 0xef1a2412 -//.word 0x1aba1ce0 -//.word 0xcb97f936 -//.word 0x43fda0f1 -//.word 0x3fc360b6 -//.word 0x1edc3329 -//.word 0x4529415f -//.word 0xc391a695 -//.word 0x31547522 -//.word 0xdc9cfdaa -//.word 0x27564b95 -//.word 0x2a3ff0bf -//.word 0x9f420471 -//.word 0xff016a91 -//.word 0xe8b25615 -//.word 0xc22c0dbd -//.word 0xa241ec02 -//.word 0x6e4fac4a -//.word 0x4312e45d -//.word 0x13bccf1c -//.word 0x93485071 -//.word 0x540b3382 -//.word 0x2f8cb62a -//.word 0xe79548a9 -//.word 0x0a8a909a -//.word 0x18fab126 -//.word 0xe774cd78 -//.word 0x469cc870 -//.word 0xe17d4e9c -//.word 0x65211764 -//.word 0xe45f6984 -//.word 0x7af5dfc0 -//.word 0x31d76ad2 -//.word 0x22c695a8 -//.word 0xdd230dcc -//.word 0x0b066024 -//.word 0x528b05db -//.word 0x796c9d9f -//.word 0xcdd5780d -//.word 0xc3735b69 -//.word 0xdecf8093 -//.word 0xd3dadf36 -//.word 0xecc8ac43 -//.word 0xaa22219e -//.word 0xae177d17 -//.word 0xd9144d9b -//.word 0xb394eaab -//.word 0x0938430e -//.word 0xdb1adcc3 -//.word 0x755f173a -//.word 0xdb0bb3c4 -//.word 0x6a199247 -//.word 0xbdccbf36 -//.word 0xce40afc0 -//.word 0x5d44c748 -//.word 0x966c1f16 -//.word 0xee61864c -//.word 0x4e7cc61b -//.word 0x73932936 -//.word 0x95133b87 -//.word 0x464fd222 -//.word 0x9e184c77 -//.word 0x958e18cb -//.word 0xb03578e9 -//.word 0xe04c8414 -//.word 0xa75a7341 -//.word 0x7c091683 -//.word 0x7137a5c7 -//.word 0x134bbec1 -//.word 0x91c5ab26 -//.word 0x211ae41c -//.word 0xa0bed4ef -//.word 0x7882e005 -//.word 0xc720a614 -//.word 0xbe148292 -//.word 0x47ae576d -//.word 0xea668cfd -//.word 0xf16f5437 -//.word 0xca8f3323 -//.word 0xae2dbe90 -//.word 0x80aca206 -//.word 0xf8f7e7fc -//.word 0x005d764b -//.word 0x5ea0d9e3 -//.word 0x944843bc -//.word 0x043dd010 -//.word 0x58950dc8 -//.word 0x21abbb34 -//.word 0xbe71d0fe -//.word 0x8007bf61 -//.word 0x0c8cf996 -//.word 0x0034b48f -//.word 0xd99aebe8 -//.word 0x1458a61b -//.word 0x93d67bf3 -//.word 0x435f5543 -//.word 0xfc7a74d7 -//.word 0xa877b5ab -//.word 0xa848145b -//.word 0x73926fdb -//.word 0x80048d68 -//.word 0x67e85ebe -//.word 0x43f7848c -//.word 0x5a721325 -//.word 0x006e9578 -//.word 0xb8705242 -//.word 0x9d39ce82 -//.word 0x00e3922e -//.word 0x532d2f24 -//.word 0x45148163 -//.word 0x2fa3317b -//.word 0xaf0b7d42 -//.word 0x92f63cc9 -//.word 0xf8191c8e -//.word 0xb2082ff3 -//.word 0xef4fa6ef -//.word 0x18bedc04 -//.word 0xf8049671 -//.word 0x208089a8 -//.word 0x8a531c02 -//.word 0x7cba70b2 -//.word 0xaf9b9df8 -//.word 0xb15d3f97 -//.word 0x88fd3288 -//.word 0x985e99f0 -//.word 0xc7e12550 -//.word 0xde3694fb -//.word 0x327277ce -//.word 0x8561391b -//.word 0x271d5de6 -//.word 0x60df0754 -//.word 0x1316be60 -//.word 0x9bb670d0 -//.word 0xf9d3b667 -//.word 0x316e5a5d -//.word 0xf18f170c -//.word 0x74949fec -//.word 0xa6c8e3c1 -//.word 0x89378e13 -//.word 0xd7c1d2df -//.word 0xe96e688c -//.word 0xd701d220 -//.word 0xe1d0e4b4 -//.word 0x0dd28226 -//.word 0x12faab0d -//.word 0x75c3b7f2 -//.word 0xf20ddcbd -//.word 0x1d27f76d -//.word 0x492d890c -//.word 0xa99400e2 -//.word 0xb50339ea -//.word 0xcf644282 -//.word 0x273c6466 -//.word 0xdc3761df -//.word 0x6408fa38 -//.word 0x2d6fb472 -//.word 0x849bdc39 -//.word 0xb7b3c916 -//.word 0x76b061e5 -//.word 0x7f6ddf8a -//.word 0x7b01d3e0 -//.word 0x224c69f2 -//.word 0xa6d0ef6e -//.word 0x4fc29256 -//.word 0x626168f9 -//.word 0x4887b422 -//.word 0xec7e658f -//.word 0x6514dfa4 -//.word 0xd5f2fe61 -//.word 0x91295892 -//.word 0x820ec345 -//.word 0xcb481881 -//.word 0xab273635 -//.word 0xa538496f -//.word 0xdf164cce -//.word 0xc982cc3a -//.word 0xfeb6efd2 -//.word 0x6ff7b626 -//.word 0xbe6a7fa7 -//.word 0xe828ce5c -//.word 0x27944cd6 -//.word 0x17ed1065 -//.word 0x171f1e8c -//.word 0xf2df2db3 -//.word 0xbff6ae1c -//.word 0x05dd0918 -//.word 0x238b2a7b -//.word 0xef8b3c4d -//.word 0x9e51b4c2 -//.word 0xe4ce926c -//.word 0x5b42e3b0 -//.word 0x29528b77 -//.word 0xde5a4125 -//.word 0x9b04dbcf -//.word 0x791acca9 -//.word 0x2898ebbd -//.word 0xd70676e3 -//.word 0x540456ed -//.word 0x7527a422 -//.word 0xb6036dee -//.word 0x2389b2d7 -//.word 0x7994b3b3 -//.word 0x88be6e18 -//.word 0xdb786215 -//.word 0x9b5a981f -//.word 0xb1b7e44e -//.word 0x2b7569ca -//.word 0xe11b5b80 -//.word 0x582c0919 -//.word 0xe6b41a2c -//.word 0x172016b2 -//.word 0x505229bb -//.word 0xb2f52460 -//.word 0x410ec5f9 -//.word 0x46d43890 -//.word 0xf2c2dd95 -//.word 0x43ea4cd2 -//.word 0x2c8c97a2 -//.word 0xf0e7cf5e -//.word 0xcf4fc919 -//.word 0xe480218d -//.word 0x4e328054 -//.word 0x8eee1b5c -//.word 0x301f7c95 -//.word 0xae6c85ec -//.word 0x9145b27d -//.word 0xd9bc9e04 -//.word 0x9f97c995 -//.word 0xf9a3988e -//.word 0x1e4b9dc9 -//.word 0xca681916 -//.word 0xe45bbfe8 -//.word 0x5f5abb4e -//.word 0x5e07f325 -//.word 0x9b478d8d -//.word 0x0951b199 -//.word 0xb805904b -//.word 0xf980a5bf -//.word 0xc4ed3aa6 -//.word 0x569d2ff6 -//.word 0x1e5bf7e0 -//.word 0xdaf9e303 -//.word 0xfe2fa3df -//.word 0x55a60a8c -//.word 0xea4f11ab -//.word 0x29f91f9e -//.word 0x422387f4 -//.word 0xce0e5227 -//.word 0xb517408a -//.word 0x4f44097d -//.word 0xc91de8e3 -//.word 0xcbbd5ad6 -//.word 0x57282499 -//.word 0xf5df93cd -//.word 0x0db207e8 -//.word 0x94d6b3e4 -//.word 0xea379e34 -//.word 0x030fedfc -//.word 0xc6b86581 -//.word 0xb2bf2cdf -//.word 0xc739cffa -//.word 0xa45a89b6 -//.word 0xed43c36b -//.word 0xef1cd793 -//.word 0x876319c6 -//.word 0x3f8318e9 -//.word 0xbba921a2 -//.word 0x54d3050e -//.word 0x022a1cb7 -//.word 0x7f918ac0 -//.word 0xa97ec163 -//.word 0x2908489e -//.word 0x5242ba28 -//.word 0x4bc811aa -//.word 0x7197242c -//.word 0xf7226fcd -//.word 0xcfa213b8 -//.word 0xcead1d53 -//.word 0x0b0a0bba -//.word 0x88c48d6b -//.word 0x147d8843 -//.word 0x6f0560a9 -//.word 0xb02b7709 -//.word 0xe4d3f184 -//.word 0xf849bbe5 -//.word 0xd9d5cbd7 -//.word 0xd990a956 -//.word 0x55752e64 -//.word 0x94bb8bfd -//.word 0xf3638e4c -//.word 0x3f0d211f -//.word 0x630f1499 -//.word 0x43c81c26 -//.word 0xe7321bb4 -//.word 0xdcb7a121 -//.word 0xd746b3ef -//.word 0x9ca5cc3f -//.word 0x1e0922fd -//.word 0xe8e42a58 -//.word 0xbbfe5e75 -//.word 0x79c73e64 -//.word 0x41ec9553 -//.word 0xdc28fd01 -//.word 0x585da576 -//.word 0xf2e352f2 -//.word 0x3a1fa423 -//.word 0x71589b9a -//.word 0x36c75980 -//.word 0x62ed2a85 -//.word 0x302ac11a -//.word 0xa18ac5e0 -//.word 0x1ee28c60 -//.word 0x5f1c26fc -//.word 0x8dcf9d25 -//.word 0xa3137bcf -//.word 0x1a938d22 -//.word 0xc5e3e773 -//.word 0xfa142872 -//.word 0xf286ffa5 -//.word 0x72feee15 -//.word 0xabf84e47 -//.word 0x603f946d -//.word 0x46bad2de -//.word 0xb08981c4 -//.word 0x6b517d14 -//.word 0xe7d351c4 -//.word 0x98c4b538 -//.word 0x9cd855fd -//.word 0x9e21d4b9 -//.word 0xfa971162 -//.word 0x22f8a9af -//.word 0x40d2bdcc -//.word 0x1dddf552 -//.word 0x418fc476 -//.word 0x5cebee81 -//.word 0xe49a4880 -//.word 0x003cbf3c -//.word 0xa5009c6c -//.word 0xfe72072a -//.word 0x1295c9a4 -//.word 0xa1325614 -//.word 0x4e6f0af2 -//.word 0x04a3b367 -//.word 0x92695006 -//.word 0x98f418b7 -//.word 0xa7a2bef3 -//.word 0xa4d3f437 -//.word 0x6dfb2eb2 -//.word 0xbff6a841 -//.word 0x589caa9e -//.word 0x58960bd5 -//.word 0xed70f4f7 -//.word 0x2feee611 -//.word 0x49a4fe5f -//.word 0xdac178be -//.word 0x9b2c7360 -//.word 0x41d2f3c3 -//.word 0xa53e2ce4 -//.word 0x226afeb0 -//.word 0x3ed4bcbb -//.word 0x8dd53134 -//.word 0xd32ee519 -//.word 0x69e49ca7 -//.word 0xe24f2015 -//.word 0xed6d4081 -//.word 0x7d7c192b -//.word 0x28c794e1 -//.word 0xcdc030ba -//.word 0x7a4f0207 -//.word 0x8d6afa87 -//.word 0x19e667da -//.word 0x8b8cbd38 -//.word 0x8d709663 -//.word 0x2a7ef8da -//.word 0x3356d650 -//.word 0xe25ad95c -//.word 0xbe046072 -//.word 0xbe7ec512 -//.word 0xb16ce23f -//.word 0xdd0cd333 -//.word 0xe782fe51 -//.word 0xf36d515b -//.word 0x0bbecbe5 -//.word 0xc5ca3e0a -//.word 0x209e535d -//.word 0xb092ce22 -//.word 0xfb2113bf -//.word 0x22f7e96d -//.word 0xc44c7f33 -//.word 0x1f71ad15 -//.word 0x78a87b89 -//.word 0xbd39e72a -//.word 0x6ac2e3b0 -//.word 0xa9cf9e20 -//.word 0xbdaa0440 -//.word 0xa075884e -//.word 0xeb7521f1 -//.word 0xf7b19270 -//.word 0x42bcef22 -//.word 0x14cf5d26 -//.word 0x621a1953 -//.word 0xf25cbc72 -//.word 0xc0b2bdab -//.word 0xa1ac373e -//.word 0x26a6ec74 -//.word 0xc3568bd4 -//.word 0x30a12e99 -//.word 0x10b32764 -//.word 0xd14efc2f -//.word 0xd362b082 -//.word 0xccdf44e9 -//.word 0x6bc77ea5 -//.word 0x3b87e9a2 -//.word 0xcb871da9 -//.word 0x0c0040d7 -//.word 0xfa0ecd4e -//.word 0x7e06942a -//.word 0x930903b7 -//.word 0xa9d9a3e1 -//.word 0x46ece5eb -//.word 0xf3bf1f64 -//.word 0x566dd257 -//.word 0x9c802ec3 -//.word 0x1a07d84a -//.word 0x33e9ea2d -//.word 0x7c783c78 -//.word 0x1e49e27a -//.word 0x7c44f578 -//.word 0x16f797a3 -//.word 0xad2f3146 -//.word 0xa9caff44 -//.word 0xb7c7cfc2 -//.word 0xb69f0521 -//.word 0xd4d8e32f -//.word 0xf4d7079e -//.word 0x54f635b5 -//.word 0x6cd65745 -//.word 0x19f7c2df -//.word 0xfa85bb44 -//.word 0x1a753a1d -//.word 0xd0d1eeec -//.word 0xe4508043 -//.word 0xf32a1c34 -//.word 0x152a2e08 -//.word 0xbc056933 -//.word 0xe0ea0e88 -//.word 0x595a6baa -//.word 0x8c3aa2c3 -//.word 0x4927ab78 -//.word 0xf4099c1c -//.word 0xe3eb2823 -//.word 0x080a66da -//.word 0xd02bd456 -//.word 0x4a329caa -//.word 0x8cf1165e -//.word 0x533e8d1c -//.word 0xe94846ab -//.word 0x4c2bbe22 -//.word 0x8cc13455 -//.word 0x75bb6794 -//.word 0x6ef1a195 -//.word 0xa1f7f4ae -//.word 0x5cf1c447 -//.word 0xb7a88690 -//.word 0x78ddc66f -//.word 0x33dd6fbd -//.word 0xb65547b1 -//.word 0xa468b99c -//.word 0x5fffd7d7 -//.word 0x2b609ffa -//.word 0x91037d4f -//.word 0x02a01287 -//.word 0xbd8d34ab -//.word 0xf3473655 -//.word 0x284f691f -//.word 0xdc37e25c -//.word 0x6bfc7e06 -//.word 0x329624f8 -//.word 0xf3ce4a5d -//.word 0x7a50bb69 -//.word 0x81019747 -//.word 0xd2929b52 -//.word 0xab56a287 -//.word 0x66506c3a -//.word 0x59919f09 -//.word 0xfcc10b0f -//.word 0x49fb325a -//.word 0x69de089e -//.word 0x8ce0f72a -//.word 0x19e6261c -//.word 0x0712fbd1 -//.word 0x8adcdfa0 -//.word 0xf36541c8 -//.word 0xd107dda6 -//.word 0x5d313e2c -//.word 0x1572818e -//.word 0xa6d35d3e -//.word 0x0f6a601b -//.word 0x042c7be6 -//.word 0x9003c1f5 -//.word 0xff216c2b -//.word 0xfb932127 -//.word 0xf51975bc -//.word 0xc735afa1 -//.word 0x9782cf6a -//.word 0xfe47d0b7 -//.word 0x694c2bac -//.word 0xc0ec9ca1 -//.word 0x466c281a -//.word 0xc18b5ff9 -//.word 0xda5adff2 -//.word 0xc64e1940 -//.word 0x26945896 -//.word 0x2ca4ff59 -//.word 0x0019110c -//.word 0x62c0f70c -//.word 0x90ef7e7d -//.word 0x6a182084 -//.word 0xd49d84b6 -//.word 0x5ce648d1 -//.word 0x1db2fdaa -//.word 0xe2aa7367 -//.word 0x8f3c37ee -//.word 0xbda65b9e -//.word 0xa551753c -//.word 0x3f61ea30 -//.word 0xab8a6df1 -//.word 0xcf25c2be -//.word 0x4283c88f -//.word 0x6881b64b -//.word 0xdf5ca53b -//.word 0x1ac74fbf -//.word 0x4c3b163f -//.word 0x888f4865 -//.word 0x26c8a189 -//.word 0x6832116d -//.word 0x5eb0c02b -//.word 0x0650506b -//.word 0xb82262d9 -//.word 0xc14b5bd7 -//.word 0x4f55686e -//.word 0x8dc9bf8b -//.word 0x0e002868 -//.word 0x6f36bc48 -//.word 0x38e0ed67 -//.word 0x043fc731 -//.word 0xe23676b2 -//.word 0xfa59074e -//.word 0x744673b2 -//.word 0x9538d90a -//.word 0x2bd90b74 -//.word 0x2c584cb5 -//.word 0x9abc582c -//.word 0xa978a504 -//.word 0x243fe9ad -//.word 0x0d19dc8c -//.word 0x84b73ff1 -//.word 0xe9031d4a -//.word 0x45fc5197 -//.word 0xe6c1481e -//.word 0x4aeb0860 -//.word 0x3f20714b -//.word 0x47e6c3b1 -//.word 0x41b461f9 -//.word 0x464fd515 -//.word 0xd25413b4 -//.word 0x241002b8 -//.word 0xe79838ea -//.word 0x111605ec -//.word 0x0c62b470 -//.word 0x14d20da8 -//.word 0xe0521ffd -//.word 0x84b73c04 -//.word 0x965044ae -//.word 0x8fbe27bf -//.word 0x7506a581 -//.word 0xb7e558b9 -//.word 0x5964f5da -//.word 0x50abcf79 -//.word 0x301a9c01 -//.word 0x04967ca8 -//.word 0x7d2137a1 -//.word 0x50aec693 -//.word 0xd933164b -//.word 0x04ff08ae -//.word 0x6d4ebcf1 -//.word 0xc61b0f0c -//.word 0x7a35626b -//.word 0x8f959ee7 -//.word 0xd1ef74f6 -//.word 0x2d87ea1e -//.word 0x5b4613b0 -//.word 0xc00d1db2 -//.word 0x9249921d -//.word 0x3dc8d749 -//.word 0x05cbf9a5 -//.word 0xed5ca8ab -//.word 0xd8e18413 -//.word 0xeff29847 -//.word 0x42682418 -//.word 0xb2b6a0af -//.word 0x0e7dfdc6 -//.word 0x7c5a2e18 -//.word 0x1b03e715 -//.word 0xe692a5db -//.word 0xdc20ee62 -//.word 0x5e96daf6 -//.word 0xd8c0d2eb -//.word 0xa3a3988c -//.word 0x2a118754 -//.word 0x4c7a1d61 -//.word 0x0205b625 -//.word 0x42df9a5f -//.word 0x23d33a49 -//.word 0x411cb713 -//.word 0x6377a491 -//.word 0x5b7c0d31 -//.word 0x2e2db82f -//.word 0x75d0aa0c -//.word 0x03faed3c -//.word 0xc8ed911f -//.word 0xf523f132 -//.word 0x612b3887 -//.word 0x2cb42372 -//.word 0xa2e80886 -//.word 0x62fb17bf -//.word 0xbf03e001 -//.word 0x660a15c1 -//.word 0x41619102 -//.word 0x9c389a84 -//.word 0x876c6338 -//.word 0x7ba0d5f6 -//.word 0x408f8f72 -//.word 0x0da02c6d -//.word 0xf2bcc428 -//.word 0x735cb51e -//.word 0x76e6a3f2 -//.word 0x5f39bda7 -//.word 0x7986420f -//.word 0x98634486 -//.word 0xfc1aade0 -//.word 0x79477f9f -//.word 0xd5a26069 -//.word 0x721955ba -//.word 0x2c22ced7 -//.word 0x854fe303 -//.word 0x0022ddf4 -//.word 0xca24f888 -//.word 0x9f3167b5 -//.word 0xec1699be -//.word 0x315ebbad -//.word 0xaa687efd -//.word 0x2ebd1a97 -//.word 0x57a19300 -//.word 0xe3e83ad0 -//.word 0x5a0b7866 -//.word 0xf17bc7da -//.word 0xaf350133 -//.word 0xce97ddda -//.word 0x6472b64f -//.word 0x43608f1b -//.word 0x1d585506 -//.word 0xec7f6389 -//.word 0x90414c86 -//.word 0xbaa1d437 -//.word 0x0acd3f65 -//.word 0x74f6cfda -//.word 0xe85e8818 -//.word 0x32b3364b -//.word 0x1f9bb17d -//.word 0xe1906009 -//.word 0xb4eefc52 -//.word 0xc24a96b4 -//.word 0x4406dcbb -//.word 0xeb229893 -//.word 0x7e5579c0 -//.word 0xc45d160f -//.word 0xa49330cd -//.word 0x8bc23736 -//.word 0x0e391030 -//.word 0xd11f163a -//.word 0xa7075f9f -//.word 0xfac440ef -//.word 0x6e7f13af -//.word 0xc1073750 -//.word 0xf667595e -//.word 0xb2bef2fa -//.word 0xe64b118a -//.word 0xaec85baf -//.word 0x79f95078 -//.word 0x6b84d0d5 -//.word 0xff03dd4e -//.word 0xf158a2f4 -//.word 0x5b40b498 -//.word 0x1e2c993c -//.word 0x834c87c7 -//.word 0x22ec6dfd -//.word 0x030338ad -//.word 0x04094f2c -//.word 0x7a0a5f03 -//.word 0x1bf95ee5 -//.word 0x1c46cae4 -//.word 0x96b232e4 -//.word 0x2e63f84f -//.word 0xf533550a -//.word 0x8d4e9da8 -//.word 0x8efcc5de -//.word 0x27bb2237 -//.word 0x09917309 -//.word 0x80a022a8 -//.word 0xe3fbc7d9 -//.word 0x2fb8ee8a -//.word 0xef471ac0 -//.word 0x5f020ad0 -//.word 0xd0043ad2 -//.word 0x4e3fad53 -//.word 0x81c9ea4a -//.word 0xd177454d -//.word 0xcdad5f05 -//.word 0xce74f0e0 -//.word 0xd7cdc405 -//.word 0xc046048d -//.word 0x94cab7f0 -//.word 0x37bd88bd -//.word 0x4c49ca8f -//.word 0x55f2b93c -//.word 0x1c71034f -//.word 0x53bf87b9 -//.word 0x77705cc3 -//.word 0xfa421547 -//.word 0xa0f64320 -//.word 0x2a5e3cdf -//.word 0x32b81bbf -//.word 0x563a08dc -//.word 0x98eeba9f -//.word 0x05c0397d -//.word 0x95d6e9e1 -//.word 0x531fc466 -//.word 0xbd2fe74a -//.word 0x6e4a5020 -//.word 0xfabee6c4 -//.word 0x1a76b994 -//.word 0x09cd8cdd -//.word 0x2da09194 -//.word 0xfaa77347 -//.word 0x14059952 -//.word 0xb31daa56 -//.word 0x4ca84ce7 -//.word 0x6e043285 -//.word 0xeacf55ce -//.word 0x36b581f1 -//.word 0x13861466 -//.word 0x6e8c03dd -//.word 0x841b1d74 -//.word 0x4a69942c -//.word 0x0ca0b99e -//.word 0x543207ea -//.word 0x0d6d63f1 -//.word 0xe84fa2c4 -//.word 0xff9b4c5b -//.word 0xb92c9f8b -//.word 0xed8ad732 -//.word 0x4abbadb5 -//.word 0xf65c1eac -//.word 0x75f06ddb -//.word 0xcd776b65 -//.word 0xe743f63c -//.word 0x3907c0dc -//.word 0xa2315239 -//.word 0x957950f5 -//.word 0x7abafed7 -//.word 0x51010379 -//.word 0x99e46d40 -//.word 0x7016f691 -//.word 0xfb388542 -//.word 0x08f1f84f -//.word 0xf24021cf -//.word 0xc5110e26 -//.word 0xa30f8e7b -//.word 0x67baf06d -//.word 0x87b90e01 -//.word 0x3f718bdf -//.word 0xecd658bf -//.word 0xb6817d1e -//.word 0x71041635 -//.word 0xc57a9b2b -//.word 0x8d62658a -//.word 0x7ead6ef0 -//.word 0x09155907 -//.word 0x82b1b2b6 -//.word 0x81c67699 -//.word 0x89e1d6af -//.word 0xe7223853 -//.word 0xdddb7f6e -//.word 0x005a8cea -//.word 0xdf02046a -//.word 0xe5a15438 -//.word 0x81fdf37e -//.word 0x83b0e7ba -//.word 0xca368b6c -//.word 0x1c458f11 -//.word 0x555c4055 -//.word 0xc49f0a85 -//.word 0xd2e23b43 -//.word 0xe404097d -//.word 0x837ed7a0 -//.word 0xbb3bb408 -//.word 0xc0ab25bc -//.word 0xd8132458 -//.word 0x7427684a -//.word 0xa0dae741 -//.word 0x9e759ae3 -//.word 0xcee680bf -//.word 0xd25be582 -//.word 0xee10e46d -//.word 0xb5652b06 -//.word 0xe234fe0e -//.word 0x84617fb4 -//.word 0x5eb32c08 -//.word 0x8de2a9b2 -//.word 0x6bf1c0e4 -//.word 0xb4bda68d -//.word 0xe7d77fd0 -//.word 0xef8f25b4 -//.word 0x0351251d -//.word 0xcb350bfb -//.word 0xc4d1e0c1 -//.word 0xe552f019 -//.word 0x83cbd1d5 -//.word 0x72cca029 -//.word 0x6d378e18 -//.word 0xb74f9b2d -//.word 0x0312a26b -//.word 0x92c99686 -//.word 0x9bdd0b54 -//.word 0xefecf87e -//.word 0xdd1cbb7b -//.word 0x53af5dbf -//.word 0x47d8182f -//.word 0x55cd16d9 -//.word 0xaa1e7ce2 -//.word 0x2045a7bf -//.word 0xaa7eb5a8 -//.word 0xf3d9484a -//.word 0x428d86bd -//.word 0xa18f65b5 -//.word 0x3e6325fc -//.word 0x11331e20 -//.word 0xbf1ebb69 -//.word 0xbfd2c70d -//.word 0xbb5de7a7 -//.word 0x394068e6 -//.word 0x7ac53b82 -//.word 0xa2933e75 -//.word 0x1a80be67 -//.word 0x33a6396a -//.word 0x0cb968e7 -//.word 0xb5987cd8 -//.word 0x9421a938 -//.word 0x084ae1b8 -//.word 0x4d6de2b4 -//.word 0xa0e47265 -//.word 0xa3d6e958 -//.word 0x0250f11f -//.word 0x57988a46 -//.word 0x4bbe5189 -//.word 0xfe730143 -//.word 0xaa1e3a2a -//.word 0x832d813a -//.word 0xe1a989ef -//.word 0xa00eb0b7 -//.word 0xc759cda7 -//.word 0x6962296d -//.word 0xc96ccb86 -//.word 0xc1fbf9b1 -//.word 0x65e6fba3 -//.word 0xe3ac22fc -//.word 0xae0b097a -//.word 0xdbcf1b6c -//.word 0xcbe9556a -//.word 0x0ac04d44 -//.word 0x77cc7438 -//.word 0xa5609868 -//.word 0x82c7ad8b -//.word 0x3693cce2 -//.word 0x4e327c6d -//.word 0x1ac23160 -//.word 0x532612d1 -//.word 0x015affb3 -//.word 0x9c03d307 -//.word 0x724be651 -//.word 0x48ebd749 -//.word 0x448988d4 -//.word 0x0b456932 -//.word 0x268ffa79 -//.word 0xaa3b8b42 -//.word 0x18d746a2 -//.word 0x823c705c -//.word 0xef63ec54 -//.word 0x017a0147 -//.word 0xd5375dba -//.word 0x2b6d5930 -//.word 0xc7dd7ea0 -//.word 0x174e4826 -//.word 0x15e02bf9 -//.word 0x6f9dd49d -//.word 0xe551b15a -//.word 0xf39bb3ec -//.word 0xb145537c -//.word 0xf7d1d3cf -//.word 0xc454c6be -//.word 0xe188d2e6 -//.word 0xc11cb5a0 -//.word 0xac4e8634 -//.word 0x80000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00013960 -//// expected output -//.word 0xa3cfce93 -//.word 0x0b5e8de5 -//.word 0x4554e9c3 -//.word 0x1cb3e4b7 -//.word 0x54b24e6c -//.word 0xfeb6b89a -//.word 0xda2ca51b -//.word 0x907a057d -//.word 0x3814d119 -//.word 0x80367109 -//.word 0xc1f55b35 -//.word 0xd7b187e3 -//.word 0xbe90cbb9 -//.word 0x0867bb59 -//.word 0xb78cf6c0 -//.word 0x4eb2587f -//// SHA512LongMsgvector_101 -//// vector length -//.word 0x00013C78 -//// input message -//.word 0x5d146aa4 -//.word 0x39e41599 -//.word 0xb3a48574 -//.word 0xdd33f121 -//.word 0x44f8f854 -//.word 0x1773e1c2 -//.word 0x8c182791 -//.word 0x805e350d -//.word 0x5e136e9c -//.word 0x41f270f4 -//.word 0x5d779a8b -//.word 0x9bf2cc4f -//.word 0x83db6d98 -//.word 0x5f65b35b -//.word 0x9d551ea0 -//.word 0x76154636 -//.word 0xcd04d7a5 -//.word 0x5a11da64 -//.word 0x0788364c -//.word 0x9a2b764d -//.word 0x9585cc60 -//.word 0x5a7b56bc -//.word 0x9324a14d -//.word 0xd1db6c62 -//.word 0x7392aea6 -//.word 0xca69da51 -//.word 0x7b7f619f -//.word 0x24077882 -//.word 0x429f1d93 -//.word 0x52de544f -//.word 0x362cb780 -//.word 0xdbd72df9 -//.word 0x1963fa86 -//.word 0xda21f823 -//.word 0x7f03236c -//.word 0x7fae5b55 -//.word 0x51d1661b -//.word 0x8db5357b -//.word 0x4e166821 -//.word 0xda321463 -//.word 0x851fc32f -//.word 0xd261bc42 -//.word 0xdcbc859b -//.word 0xf447a730 -//.word 0x8cc2b1df -//.word 0x54297fa7 -//.word 0xa289bc18 -//.word 0x1713a608 -//.word 0x806f1188 -//.word 0xfa53af17 -//.word 0x5a538e15 -//.word 0xcbfbe27a -//.word 0xb91b05c7 -//.word 0xee62bc3d -//.word 0xfb2ebc4d -//.word 0xdaa36d51 -//.word 0xd1fbed79 -//.word 0x991c5808 -//.word 0xc07047c0 -//.word 0x4cf1969a -//.word 0xa1836bbb -//.word 0xa58773a4 -//.word 0x21ad6fa9 -//.word 0x6b09f0a4 -//.word 0x426a5eea -//.word 0xf9e73f7e -//.word 0xd8bab685 -//.word 0xbf524afa -//.word 0x0ca3e9a3 -//.word 0xbfc12d44 -//.word 0xdcadde12 -//.word 0x116eb76a -//.word 0x99646dc3 -//.word 0x60daede2 -//.word 0x68dae54d -//.word 0x6b458701 -//.word 0xc2238a67 -//.word 0x85377185 -//.word 0xf4d60f71 -//.word 0x15fa4b0c -//.word 0x9f9321ec -//.word 0x171de99a -//.word 0x3977dcfe -//.word 0x99f3d417 -//.word 0x8aaa53f0 -//.word 0x3f12c7cf -//.word 0x30d20caf -//.word 0xbfd433f0 -//.word 0x1c9c824e -//.word 0x66d9bb10 -//.word 0x133aa281 -//.word 0x9183b9a4 -//.word 0x2de04e24 -//.word 0x3579b78a -//.word 0x5946ddb2 -//.word 0x5725f780 -//.word 0xd82a98cf -//.word 0x9436ecaa -//.word 0xbdcb3ebf -//.word 0x9b1ebe10 -//.word 0x746e82ec -//.word 0xae95ca1e -//.word 0x37dd8864 -//.word 0x25142023 -//.word 0x9ae36c58 -//.word 0xeb5b03d2 -//.word 0x01d1bb9f -//.word 0xffec6cc4 -//.word 0x24fcf731 -//.word 0xf48d87f3 -//.word 0x923d17ac -//.word 0x71ca3540 -//.word 0x2b6f05d2 -//.word 0xb17188ef -//.word 0xa5f51e08 -//.word 0x04144a26 -//.word 0x0831b6d9 -//.word 0x4d8a7771 -//.word 0x320e9171 -//.word 0x826fbe41 -//.word 0x54776b23 -//.word 0x2f9f0468 -//.word 0x72de71e4 -//.word 0xf3bfe19f -//.word 0xe7b6c6cd -//.word 0x02b42001 -//.word 0xdff9ff9d -//.word 0xa12a438d -//.word 0xdba3a735 -//.word 0xad0efea7 -//.word 0x3034bc1a -//.word 0x1414b798 -//.word 0x88322ff6 -//.word 0x5a320c09 -//.word 0x60a56817 -//.word 0x16234d8c -//.word 0x889ac0ee -//.word 0x73e5fe13 -//.word 0xa7a10592 -//.word 0xaf3c5677 -//.word 0xb44efa3b -//.word 0x9f2dc3f3 -//.word 0x7ebcd4c7 -//.word 0x298363a6 -//.word 0x2505be38 -//.word 0xc84d8c14 -//.word 0x9ecb5634 -//.word 0x0c5e46a5 -//.word 0x33b22e83 -//.word 0x17cccb25 -//.word 0x01e34c95 -//.word 0x22720e43 -//.word 0x788baafa -//.word 0xf66e3112 -//.word 0xdf5ab6e8 -//.word 0x73a30d8b -//.word 0xcd05d3b8 -//.word 0x0c38ae09 -//.word 0xb1c4d669 -//.word 0x4817d5cb -//.word 0x4bd58b1c -//.word 0x436f7475 -//.word 0x30f72e96 -//.word 0x2b333590 -//.word 0x4af0f2c1 -//.word 0xc498f405 -//.word 0x55077d2b -//.word 0xe49b40a6 -//.word 0x648a6985 -//.word 0xf879dea6 -//.word 0x5a4ac426 -//.word 0x7d35461b -//.word 0x711a9186 -//.word 0x88152383 -//.word 0xb75446c3 -//.word 0x3e25d73c -//.word 0x8b534c1f -//.word 0x5cb3f60b -//.word 0x25fa8280 -//.word 0xb1d1c696 -//.word 0x0b2cbbef -//.word 0x9fd7c5ea -//.word 0x9d513b19 -//.word 0x9ede23f6 -//.word 0x8ad83dd1 -//.word 0xb946440d -//.word 0x58b0708c -//.word 0x0f313f68 -//.word 0xe0cd75e4 -//.word 0x530561a2 -//.word 0xd0a96316 -//.word 0x4ceeab3a -//.word 0x28c04383 -//.word 0x55595014 -//.word 0xbd139533 -//.word 0xde7a38f9 -//.word 0xb8a6c94d -//.word 0xeac88013 -//.word 0x1802c6a0 -//.word 0x8f7cf771 -//.word 0x2cb4671d -//.word 0x7a15a389 -//.word 0x1accf95b -//.word 0x68d73ab1 -//.word 0x5b5ebe12 -//.word 0xad47a9a5 -//.word 0x3c056da0 -//.word 0xb1b09004 -//.word 0x5f5bb088 -//.word 0x6ea2c4d2 -//.word 0x3882a4ed -//.word 0xf36eccf8 -//.word 0x919e5c1b -//.word 0xe4ab64c0 -//.word 0x06595fff -//.word 0xf8b3fd59 -//.word 0x895e26aa -//.word 0x79273b59 -//.word 0xdfde9fd2 -//.word 0xc8677636 -//.word 0x210eac50 -//.word 0xd71b39cc -//.word 0x3ca6a4a3 -//.word 0xadadc6da -//.word 0x7264d16c -//.word 0xe5cc9185 -//.word 0xd687f1f0 -//.word 0x2febc0d3 -//.word 0xd455b59a -//.word 0xcdc0b131 -//.word 0xa7964576 -//.word 0x17c574ee -//.word 0xe116bab6 -//.word 0xf8bb4dbd -//.word 0xe726a231 -//.word 0x6f223337 -//.word 0x721c80df -//.word 0x10c15357 -//.word 0x0fcf495f -//.word 0x80248efc -//.word 0x9f1ce871 -//.word 0xfc19f76b -//.word 0xd863bb7c -//.word 0xd23356ca -//.word 0xc30a1309 -//.word 0xe647a8a6 -//.word 0x3cf9b845 -//.word 0x2ef29c6e -//.word 0x751d6383 -//.word 0x371117f6 -//.word 0x72e542b8 -//.word 0x9e46b1f5 -//.word 0x8ec878fe -//.word 0x987a3787 -//.word 0xf5bd9b12 -//.word 0x6a5627ab -//.word 0x28c134d6 -//.word 0xf2c836c6 -//.word 0x7d5542cf -//.word 0x1c85cd1e -//.word 0x9dfdb7a8 -//.word 0x6d818860 -//.word 0x03c3f9ad -//.word 0x7c78b61b -//.word 0x83b16251 -//.word 0x7469db43 -//.word 0xc15ac0a8 -//.word 0x941631af -//.word 0xb652d6ed -//.word 0xaf85239a -//.word 0x2fb2dafe -//.word 0xac81d126 -//.word 0x4d95f5db -//.word 0x071a8fd5 -//.word 0x069dc62b -//.word 0x4e21650e -//.word 0xa26fdfb7 -//.word 0xa4ad919e -//.word 0x3f3246ed -//.word 0x42990034 -//.word 0x4d14f65e -//.word 0xf103d9e4 -//.word 0x13c65b40 -//.word 0x91cff2a5 -//.word 0x29fbd9ed -//.word 0x962259d3 -//.word 0xfbed4662 -//.word 0x85e7ccad -//.word 0x4cd76cc1 -//.word 0x7b4e41d8 -//.word 0xb17c88cf -//.word 0xa7475fda -//.word 0x129fcd77 -//.word 0xcb0b03a0 -//.word 0x2d88e145 -//.word 0xbe94bcf9 -//.word 0x12865fec -//.word 0xed204f19 -//.word 0xa86754c0 -//.word 0xd6b23417 -//.word 0x2702c23d -//.word 0x8c91176f -//.word 0x9bae207e -//.word 0x36c75980 -//.word 0x67c8d7c6 -//.word 0x8fa48c0f -//.word 0xc030c7fb -//.word 0x6738fac3 -//.word 0x2ecdc026 -//.word 0x20dc1ea7 -//.word 0x0e0509f5 -//.word 0x32a929ab -//.word 0x1345dd39 -//.word 0xa8ff7f22 -//.word 0xc07fe969 -//.word 0xa2003845 -//.word 0xf0a7d01c -//.word 0xd113a0af -//.word 0x4e35a793 -//.word 0xfd62b6e0 -//.word 0xdda6782d -//.word 0x825cb1bb -//.word 0x72fbc3f0 -//.word 0xce337607 -//.word 0x3539f807 -//.word 0xe55f23f1 -//.word 0x23e7ff3e -//.word 0xde198888 -//.word 0x8f93b188 -//.word 0x63e1a840 -//.word 0x9c4d5c79 -//.word 0x34f83d70 -//.word 0xc42a42cd -//.word 0xa5e731d4 -//.word 0x55c31bdf -//.word 0x1cf7250c -//.word 0xefb38f33 -//.word 0x94b6ee1b -//.word 0x071dbced -//.word 0x1d7813e8 -//.word 0x6723b657 -//.word 0x59d451c0 -//.word 0xab70025f -//.word 0x002317d2 -//.word 0xc6af1a16 -//.word 0x5d040bb2 -//.word 0x7b12ec32 -//.word 0xcfdb83d7 -//.word 0xe4cc5b8d -//.word 0x494d0c1d -//.word 0xef97bca4 -//.word 0xd2c5e644 -//.word 0xdb2e5a19 -//.word 0x05f3856f -//.word 0xc0d4f332 -//.word 0x934812a5 -//.word 0x04cc3957 -//.word 0xbc7be854 -//.word 0xe7df5298 -//.word 0xda0718c9 -//.word 0xf8d95825 -//.word 0xd6aae6b9 -//.word 0x9d0cd9d3 -//.word 0xb0e74abb -//.word 0x8fcc589e -//.word 0xfc856fcb -//.word 0x5cf1cb22 -//.word 0x5f0f37c8 -//.word 0xe3581b20 -//.word 0x1652b5f7 -//.word 0xdb62a7ff -//.word 0x70e1b27f -//.word 0x4d73c148 -//.word 0x4f9429eb -//.word 0x15742f29 -//.word 0xab05cbab -//.word 0x6552abf4 -//.word 0x0e127b93 -//.word 0x427d649d -//.word 0x195ed25a -//.word 0x066a7b3f -//.word 0xfed09d1c -//.word 0xdc118697 -//.word 0x04125ad9 -//.word 0x46701187 -//.word 0x0613bff4 -//.word 0x9a061895 -//.word 0xf48533b5 -//.word 0x81588e69 -//.word 0x506053c7 -//.word 0x7770d953 -//.word 0xb35e6eba -//.word 0x4e5954c3 -//.word 0x467c0982 -//.word 0xaba4cbcf -//.word 0x497f5cf6 -//.word 0x87e603b0 -//.word 0x8f6dd352 -//.word 0xaf382f45 -//.word 0xff108eb6 -//.word 0x45b57c8e -//.word 0x1576e2a5 -//.word 0x3d008632 -//.word 0x6074d587 -//.word 0xe0bce1fb -//.word 0x011ea627 -//.word 0x4c119155 -//.word 0x32504335 -//.word 0xf22e92d2 -//.word 0xbd29d0c5 -//.word 0x17c150a8 -//.word 0x808b27ce -//.word 0x54813031 -//.word 0xf09c53ac -//.word 0x16a5066b -//.word 0x9348139f -//.word 0x1e6a9c76 -//.word 0x84bc5d4a -//.word 0x02903219 -//.word 0xf2ecd935 -//.word 0xabddf83c -//.word 0xa20e624b -//.word 0xd599966f -//.word 0x691d895c -//.word 0x9111a562 -//.word 0xb358119c -//.word 0xc615336b -//.word 0xffc07322 -//.word 0xac7a4203 -//.word 0x609d5b6b -//.word 0x50984949 -//.word 0xfdfa2ad4 -//.word 0x13ccb27e -//.word 0x91247323 -//.word 0x2bf75b87 -//.word 0xed2f7eff -//.word 0x20fd156e -//.word 0x7171c773 -//.word 0x504828e1 -//.word 0x97058070 -//.word 0x6c43cdb2 -//.word 0x68490b48 -//.word 0xf9dfb255 -//.word 0x04608133 -//.word 0xcf117a65 -//.word 0x1fb12ecd -//.word 0x9d513a1f -//.word 0x7e661296 -//.word 0x631dfde6 -//.word 0x7eee6171 -//.word 0xf77441bd -//.word 0x8e7c0426 -//.word 0x815c78d0 -//.word 0xb08616e0 -//.word 0xff5c88ec -//.word 0xfc4668af -//.word 0xc2024b02 -//.word 0x1d3cfe08 -//.word 0xee5f0fa8 -//.word 0xd1aa8f40 -//.word 0xfe861797 -//.word 0x6d170914 -//.word 0x3e11182e -//.word 0x57cd0b24 -//.word 0x4f9cbdee -//.word 0x8b5b6973 -//.word 0xa64724fc -//.word 0x1613abe9 -//.word 0x0d385fa3 -//.word 0x9e8d8ed1 -//.word 0x2117f4cf -//.word 0xd822825b -//.word 0xd3905e92 -//.word 0x10722a1c -//.word 0xe7d589a3 -//.word 0xa5dedf89 -//.word 0x781a59da -//.word 0x8b0f2e7f -//.word 0x711724b5 -//.word 0xc76e55be -//.word 0x158933d6 -//.word 0xf6a9ca69 -//.word 0x79b14583 -//.word 0xc634b488 -//.word 0x05d30c25 -//.word 0x7bc66f86 -//.word 0xf6b8aeca -//.word 0x6cd80db4 -//.word 0xdf2d46a3 -//.word 0x8329d0c4 -//.word 0x23826086 -//.word 0xc13db14e -//.word 0x7d0c816d -//.word 0xb8d9dc4f -//.word 0x78a39cf4 -//.word 0x0e8931a4 -//.word 0xf7249edf -//.word 0x011ac494 -//.word 0xaef0e393 -//.word 0xdd205e43 -//.word 0xa76cbe98 -//.word 0x8871fa40 -//.word 0xbf7ff61d -//.word 0xf7a849f8 -//.word 0x26174374 -//.word 0xb6a42f40 -//.word 0xe3a5d591 -//.word 0x640643d0 -//.word 0x4d9ccd8f -//.word 0x34b653c2 -//.word 0x92f5c22c -//.word 0x6d5edd17 -//.word 0x34ae3e48 -//.word 0xebed9732 -//.word 0x87463e6a -//.word 0x9c16e95b -//.word 0x3543b63b -//.word 0x03cf6e3e -//.word 0xbbad0a09 -//.word 0xb9d37669 -//.word 0xe9909645 -//.word 0xe72087d1 -//.word 0x657e2705 -//.word 0xce79d74e -//.word 0x280a7f83 -//.word 0x3fe5d31a -//.word 0x004ed59c -//.word 0x232e9b56 -//.word 0x0d665352 -//.word 0xf4638485 -//.word 0x44f2974a -//.word 0x4156950f -//.word 0xee99324e -//.word 0x2e1f0bc0 -//.word 0x2a812ccd -//.word 0xf298d546 -//.word 0x67d77e56 -//.word 0x58de18b6 -//.word 0xeb4d9621 -//.word 0x3fd6ac08 -//.word 0x4f97d686 -//.word 0x1aa69d96 -//.word 0x01ed1684 -//.word 0x7038aba1 -//.word 0xc08c1d3b -//.word 0x5cbbcacc -//.word 0x23352c72 -//.word 0x0e21a39f -//.word 0x13ac7412 -//.word 0x49a11106 -//.word 0x4c3b9ba9 -//.word 0xe337a5cf -//.word 0xe02c3be8 -//.word 0x481f222f -//.word 0xb4526225 -//.word 0xf75e023e -//.word 0x018113da -//.word 0x0439f076 -//.word 0xd512c324 -//.word 0x94bc4b38 -//.word 0x8f60dd45 -//.word 0x6434a948 -//.word 0x664e3f22 -//.word 0x42b6524c -//.word 0xe3bebbc6 -//.word 0x9296c050 -//.word 0x621b97dd -//.word 0xcbf02645 -//.word 0x95d00d3a -//.word 0xf722e67d -//.word 0x01cecb51 -//.word 0x37501931 -//.word 0x7f0b74be -//.word 0x3ddf0cfb -//.word 0xbcfd1ebc -//.word 0xd0fabd5c -//.word 0xb923d2af -//.word 0x4b116237 -//.word 0x4c7d0f9b -//.word 0x1e55e254 -//.word 0x9d0e47aa -//.word 0x4b3d59df -//.word 0xab6160aa -//.word 0xea0398e7 -//.word 0xc402358c -//.word 0xa628a3df -//.word 0x100012e6 -//.word 0x3eec321f -//.word 0x07723b72 -//.word 0x05d73164 -//.word 0xf6ef668d -//.word 0x6233404c -//.word 0x7f143cb9 -//.word 0x518f33db -//.word 0x1502dd1c -//.word 0xe03e93f9 -//.word 0x84dd59fe -//.word 0xb3d61bf2 -//.word 0x674e374f -//.word 0x80b13cf5 -//.word 0xaf02f11e -//.word 0x946f9a95 -//.word 0x23297623 -//.word 0x4c728c4a -//.word 0xdbf8a836 -//.word 0x9d61a0f1 -//.word 0xc427dbd6 -//.word 0x8ca61448 -//.word 0x1f735ca4 -//.word 0xb6f05e73 -//.word 0x021de7e5 -//.word 0xcab1a67b -//.word 0xd56a3003 -//.word 0x0aa146c9 -//.word 0xd6215b0c -//.word 0xce3951af -//.word 0x96108431 -//.word 0x013909df -//.word 0x79873848 -//.word 0xa22367f2 -//.word 0x3adbf94b -//.word 0x44bd98e2 -//.word 0x65e5bed7 -//.word 0x8e937a91 -//.word 0xdb8171ae -//.word 0xbb732340 -//.word 0x520f6f36 -//.word 0x1bef5918 -//.word 0xd2f50cf8 -//.word 0x91de1ba5 -//.word 0x391a0c21 -//.word 0x13db1755 -//.word 0xb76d2b04 -//.word 0x2dc532fe -//.word 0x535c9696 -//.word 0x7e3e0455 -//.word 0x645d70f0 -//.word 0x3a2c5978 -//.word 0x19694ed1 -//.word 0xa63ab165 -//.word 0xf27cbb19 -//.word 0x9f58c081 -//.word 0x4517b44f -//.word 0x1337ef12 -//.word 0xbabe2d1d -//.word 0x86ced9c4 -//.word 0xce7a8bcf -//.word 0x8fd8cf28 -//.word 0x545728d7 -//.word 0x59535430 -//.word 0xefe7d24b -//.word 0x2203a2b5 -//.word 0x9abe4c65 -//.word 0xbfed23f2 -//.word 0x21f4cb03 -//.word 0x16dcf906 -//.word 0xa5a67a25 -//.word 0xa2df7775 -//.word 0x1b75f771 -//.word 0xf3c9a5a8 -//.word 0xcd05d4b2 -//.word 0x2bb0c068 -//.word 0xd7801655 -//.word 0x836fb767 -//.word 0xac10b9ea -//.word 0xc424afb7 -//.word 0x8f692ba9 -//.word 0xceb28151 -//.word 0x1b3ccdeb -//.word 0x14403790 -//.word 0xbbc575ad -//.word 0x1db892b3 -//.word 0x323eee10 -//.word 0x0549875f -//.word 0x146a76db -//.word 0xfae6bd1a -//.word 0x4b0b3ff8 -//.word 0xc0c410d1 -//.word 0x946ceff3 -//.word 0x2de01152 -//.word 0xffd8217e -//.word 0xae7784d3 -//.word 0x7220e1ef -//.word 0xc08ce16a -//.word 0x271933c1 -//.word 0x7865d492 -//.word 0x291c8d0f -//.word 0xfb0ebdad -//.word 0xdb85581c -//.word 0x06d5307c -//.word 0x713473ce -//.word 0x68cc75a8 -//.word 0x750fb02d -//.word 0x834b0a3d -//.word 0x437e56e9 -//.word 0xcf6b1c2a -//.word 0x8eed9dd2 -//.word 0x578c12c2 -//.word 0xd94e355e -//.word 0x3acf023e -//.word 0xfe94bf26 -//.word 0x2b9d3a39 -//.word 0xaa395269 -//.word 0xf11fb832 -//.word 0xdfb9f788 -//.word 0xe7c3b20e -//.word 0x71152d88 -//.word 0x7dbd1093 -//.word 0x8a516794 -//.word 0xb684ecee -//.word 0x26f68978 -//.word 0xa851192e -//.word 0x97916f26 -//.word 0x00a399c6 -//.word 0x02326535 -//.word 0x7bbe250f -//.word 0xe1eeb05d -//.word 0x6d27a9c4 -//.word 0x7f5d04fc -//.word 0x3e29c584 -//.word 0x7e1c0b94 -//.word 0xe8544e54 -//.word 0x544ce54b -//.word 0x7af8cb1a -//.word 0xca12a26a -//.word 0x98aff823 -//.word 0x7c15cade -//.word 0xf9d0469e -//.word 0x5c03d5ba -//.word 0xe7fd591e -//.word 0x2f0cb3b4 -//.word 0xc396891c -//.word 0x0e6546a3 -//.word 0x7f436273 -//.word 0xe7c7e307 -//.word 0x226e24e2 -//.word 0xf9edd581 -//.word 0x47c6438e -//.word 0x5b1ad956 -//.word 0x9ebee77d -//.word 0x7591a3f0 -//.word 0x690c6e1c -//.word 0x861a585e -//.word 0x002ae5ba -//.word 0x1d8312cf -//.word 0x4ed8930a -//.word 0x9f1d5f1b -//.word 0x52996ea5 -//.word 0xc73bc13a -//.word 0xa031a486 -//.word 0x22b730ca -//.word 0xdd2d138d -//.word 0x8f6d948e -//.word 0x465bd1fc -//.word 0xc5be4be9 -//.word 0x294ea5fd -//.word 0xcc0da967 -//.word 0x6adb8c19 -//.word 0x82457335 -//.word 0xff9f35c2 -//.word 0x185263a4 -//.word 0x757686cb -//.word 0x93a4a7aa -//.word 0x690515eb -//.word 0x4caf6261 -//.word 0x1032af3e -//.word 0x706d2986 -//.word 0xafa7d4c3 -//.word 0x80db88fb -//.word 0x245239df -//.word 0xd2777b45 -//.word 0x5be844d8 -//.word 0x0ec9f40e -//.word 0xd95d945b -//.word 0xb2d75ba5 -//.word 0x356d77f7 -//.word 0x8faf0a79 -//.word 0x9a1772a0 -//.word 0x49e1cda2 -//.word 0x471cbc2d -//.word 0xdb026858 -//.word 0x0f85c3da -//.word 0x112a1179 -//.word 0xd91aa6c6 -//.word 0x0c77f108 -//.word 0x21ecb976 -//.word 0xc288a7a9 -//.word 0x75cc0550 -//.word 0x7b02c526 -//.word 0xf8d1c521 -//.word 0x550f51ec -//.word 0xe3d6ea98 -//.word 0xc1da458f -//.word 0xfff997c9 -//.word 0x03141042 -//.word 0x2c1ea5ab -//.word 0xb672135f -//.word 0xde6a219a -//.word 0x462d25e5 -//.word 0x9ac8c9d5 -//.word 0x74810ff5 -//.word 0x7d679301 -//.word 0xd62e1155 -//.word 0xb63a26a4 -//.word 0x54fa5bed -//.word 0x07775fab -//.word 0xab2d944d -//.word 0x4819cde5 -//.word 0xee135724 -//.word 0xe35e3686 -//.word 0x017eb0ca -//.word 0x594910a5 -//.word 0x1c41a4b7 -//.word 0xbc2108be -//.word 0x4eb6a60a -//.word 0x33f07e31 -//.word 0xf7392303 -//.word 0x790506c0 -//.word 0x4cabf789 -//.word 0x5e73e915 -//.word 0xd7f0f6a5 -//.word 0x4490a33a -//.word 0xf5716405 -//.word 0xa376631f -//.word 0x579b7d7a -//.word 0x86858d18 -//.word 0x815eee7a -//.word 0x0ddf3b5c -//.word 0x4dae599f -//.word 0xe9ebb887 -//.word 0x6905d526 -//.word 0xe2d30418 -//.word 0xd5e06c71 -//.word 0x540653f4 -//.word 0x663e9c86 -//.word 0xadb68de2 -//.word 0x4624d68d -//.word 0xf15bcf0d -//.word 0x721b0256 -//.word 0x372ee985 -//.word 0x3ab0f9d0 -//.word 0x29afdfbd -//.word 0xc5f40993 -//.word 0x881f680e -//.word 0x8afa7457 -//.word 0xa5077133 -//.word 0xd75bf17b -//.word 0xe9af9bcc -//.word 0x4eb52a7f -//.word 0x4ea8b9dc -//.word 0x64273d8a -//.word 0xe443534a -//.word 0xe0d73ce6 -//.word 0x4d182563 -//.word 0x626cac7e -//.word 0x4180a157 -//.word 0xd9940967 -//.word 0x0b1a69b7 -//.word 0x0b804154 -//.word 0x0a4ad6fe -//.word 0x12633420 -//.word 0x31b57405 -//.word 0xd9f73b48 -//.word 0x87c6838c -//.word 0xa3f89e6e -//.word 0xa72d77b8 -//.word 0x84a61cd7 -//.word 0x425b7990 -//.word 0xe64766ee -//.word 0x9807e57f -//.word 0x05a3a4c0 -//.word 0x03accad5 -//.word 0x7387f07d -//.word 0x6c086c46 -//.word 0x9643d6fd -//.word 0xd39ec569 -//.word 0x252bda39 -//.word 0xcc35003a -//.word 0xae19f1cd -//.word 0xfc57fd99 -//.word 0x13e9077d -//.word 0xa0d4d0c8 -//.word 0x08fc78ad -//.word 0x073c41f1 -//.word 0x97b697e7 -//.word 0x13684d9e -//.word 0x9c012a59 -//.word 0xbcf2a43f -//.word 0x49c7eb54 -//.word 0x8cb829a8 -//.word 0xa37b08cf -//.word 0x245d7690 -//.word 0x0391a5e1 -//.word 0xb6c85514 -//.word 0x9602554b -//.word 0x89a34731 -//.word 0xdec9a5ec -//.word 0x78dd014d -//.word 0x2f68914a -//.word 0x7328eaaf -//.word 0x32640c10 -//.word 0xfc7c9f02 -//.word 0x66c47c8b -//.word 0xac926fd6 -//.word 0x9a963b2b -//.word 0xac6adf1f -//.word 0x746a1808 -//.word 0x3cc627b4 -//.word 0xedd6d45b -//.word 0x2fadb3d1 -//.word 0xd2f0a600 -//.word 0x6de9a396 -//.word 0x44d7b8fb -//.word 0x6f884c86 -//.word 0x392aa7f0 -//.word 0xc75fb509 -//.word 0xfa8f06a9 -//.word 0x95821aea -//.word 0xa32edc94 -//.word 0x13cd6cd9 -//.word 0xa6332143 -//.word 0x0b5fcfea -//.word 0x485045ea -//.word 0x5b1a1a14 -//.word 0x2138aae4 -//.word 0x78245bb3 -//.word 0xa025252e -//.word 0xe8685107 -//.word 0x865380eb -//.word 0xc616f0b3 -//.word 0x6783fbde -//.word 0x411fe03f -//.word 0x2c79c6f3 -//.word 0x1ebafe96 -//.word 0x937e89b6 -//.word 0x32e2da88 -//.word 0xaddedcda -//.word 0xe9d63749 -//.word 0x5f6bd0b4 -//.word 0xc2978ef1 -//.word 0xe1f964be -//.word 0xd06d8cfa -//.word 0x42e01015 -//.word 0x3a638fc5 -//.word 0xe37d3efa -//.word 0xbbc62d15 -//.word 0xf7b1cc54 -//.word 0x24aaad91 -//.word 0x0a618b2d -//.word 0xd5658c47 -//.word 0x77f4c331 -//.word 0x4812f924 -//.word 0xefd8ad32 -//.word 0x860f597d -//.word 0xf9fdf7a7 -//.word 0xaf7fc489 -//.word 0x6d584428 -//.word 0x77c986e4 -//.word 0xf862a9f3 -//.word 0xa3179f0e -//.word 0x9b96316a -//.word 0x90d843ea -//.word 0x2bf65a93 -//.word 0xad3f5b40 -//.word 0xd3879697 -//.word 0xfcc1023b -//.word 0x8dd1ca43 -//.word 0x959b09ec -//.word 0xad60d28a -//.word 0x234a74c5 -//.word 0x5745fc01 -//.word 0x6411fb1e -//.word 0x03958962 -//.word 0xad7789b3 -//.word 0x00e92f0a -//.word 0x64c6c024 -//.word 0xeedd997b -//.word 0x858d7374 -//.word 0x4392e5da -//.word 0x1d1e2a8b -//.word 0xc72b2571 -//.word 0xd210a2b4 -//.word 0x1853df2e -//.word 0x59bf4b20 -//.word 0x26b68d23 -//.word 0xfec8c861 -//.word 0xb8841e04 -//.word 0x208d73ef -//.word 0xe5f173ac -//.word 0xb3b7d6a6 -//.word 0x9cb7e299 -//.word 0xbcaf3246 -//.word 0x1d92b76b -//.word 0xd823fcf2 -//.word 0x7dc3ae69 -//.word 0xb5875bb2 -//.word 0x268e7afc -//.word 0x9792acf2 -//.word 0x55bc4131 -//.word 0xd5bdfe00 -//.word 0x9a1a1d3b -//.word 0x59c79691 -//.word 0x5cf89df0 -//.word 0x24346c3c -//.word 0x52ab4247 -//.word 0xc8c9acfe -//.word 0x0b0b03e0 -//.word 0xeb1236b5 -//.word 0x67f6c97c -//.word 0xcbdc1ea5 -//.word 0x1bcbf480 -//.word 0xb4bb2df6 -//.word 0x31efd477 -//.word 0x8c855e33 -//.word 0x854c308d -//.word 0x48d562cc -//.word 0x4acdc314 -//.word 0x74891d96 -//.word 0x83e3ba03 -//.word 0xaf452646 -//.word 0x8a033772 -//.word 0x2cee4bf9 -//.word 0x8d26d120 -//.word 0x322f0baf -//.word 0x0c4711ed -//.word 0x9df71acb -//.word 0x5ce9f760 -//.word 0x5bf9e095 -//.word 0x278e7322 -//.word 0xef2bfab9 -//.word 0xe941ed80 -//.word 0xf248b8c5 -//.word 0x750dbdee -//.word 0x8d4e9dae -//.word 0x6e84b37f -//.word 0x0100e24c -//.word 0xce39916d -//.word 0x1f65f3d9 -//.word 0x62468c97 -//.word 0xd047f176 -//.word 0x4cc7cffe -//.word 0x8eb52ea6 -//.word 0x805df748 -//.word 0xe881b4d1 -//.word 0x48ac983d -//.word 0x02c3bfc3 -//.word 0xc0ddb64c -//.word 0x13543e2a -//.word 0x5b1d4d07 -//.word 0xe654561b -//.word 0x5c1bcaa3 -//.word 0x5aa5df8e -//.word 0x5d8e9079 -//.word 0xe26ee5dd -//.word 0xcbad7487 -//.word 0x05992849 -//.word 0x68b541f0 -//.word 0xde549c75 -//.word 0xc8673578 -//.word 0x9d94eae9 -//.word 0xd4888209 -//.word 0x058ded91 -//.word 0x4b5fcd30 -//.word 0xec3b363b -//.word 0x3c3ab2a1 -//.word 0xbedd891d -//.word 0x8de93faf -//.word 0xfa755d4c -//.word 0x774175d5 -//.word 0xb4496046 -//.word 0x079aca30 -//.word 0x1165f169 -//.word 0x9f52a901 -//.word 0xce16a479 -//.word 0x7348f030 -//.word 0xb970c11e -//.word 0x0c6271c4 -//.word 0x36cac563 -//.word 0xc807726d -//.word 0xbc3ddf39 -//.word 0x58a52dfa -//.word 0x562875f2 -//.word 0x412d50e3 -//.word 0x22af9dc7 -//.word 0x5c927ec0 -//.word 0xd537a452 -//.word 0x564ecdd0 -//.word 0x35eb8a14 -//.word 0x31dc4673 -//.word 0x9d3b84f1 -//.word 0xc13f68b0 -//.word 0x7d5779af -//.word 0x2f7aa5b1 -//.word 0xd7b8867a -//.word 0x7916e341 -//.word 0xc3987a63 -//.word 0xf09ffc55 -//.word 0xec755adc -//.word 0xb9273f80 -//.word 0x1193dd3e -//.word 0x4dc1ed7d -//.word 0x8577f143 -//.word 0xf907bda9 -//.word 0xaf6c358c -//.word 0x5e955886 -//.word 0x8b017e1c -//.word 0xf28cdd39 -//.word 0x278952dc -//.word 0x7d105f0d -//.word 0x27997015 -//.word 0x9dca62ee -//.word 0x428e45f9 -//.word 0x436761ef -//.word 0xc205781a -//.word 0x34174bc5 -//.word 0x07615ff1 -//.word 0x880f0149 -//.word 0x05498858 -//.word 0x2e07dafa -//.word 0xc1273210 -//.word 0x67bd2078 -//.word 0xd9aad13d -//.word 0x4670900a -//.word 0xf9448de5 -//.word 0x3765dd19 -//.word 0x66adc374 -//.word 0x75652eb3 -//.word 0x775e823b -//.word 0x913d9b0a -//.word 0x171710ec -//.word 0xf23eb4f2 -//.word 0x455a6320 -//.word 0x50bbfb66 -//.word 0x94eda8d2 -//.word 0x378d6503 -//.word 0xab5cbfe1 -//.word 0x8b92dc8b -//.word 0xc575bd91 -//.word 0xfe29c064 -//.word 0x32ca690a -//.word 0x9bb86116 -//.word 0xd532bfd8 -//.word 0x3f2787d1 -//.word 0xa4487069 -//.word 0x1b62ebe5 -//.word 0x2beb6093 -//.word 0x33dbbb47 -//.word 0x09bd270b -//.word 0xe2051913 -//.word 0x72a491ef -//.word 0x54da9d04 -//.word 0xab4b1e3d -//.word 0x0a56cefe -//.word 0x91a2825a -//.word 0x59f9ad85 -//.word 0x135a268c -//.word 0xeb492b43 -//.word 0xb36aa57f -//.word 0x3d4ead86 -//.word 0x088d50c4 -//.word 0x1f158fc0 -//.word 0x3fc1aa4e -//.word 0x382e9f05 -//.word 0x95caedf3 -//.word 0x7f2d9d90 -//.word 0xdfad83f1 -//.word 0xc32cc23e -//.word 0x03358e66 -//.word 0x24483611 -//.word 0x7c7161d7 -//.word 0x971f97af -//.word 0xda3404aa -//.word 0x665979e1 -//.word 0x4094b4ab -//.word 0xae1ce114 -//.word 0xe46c618b -//.word 0xdf96c9db -//.word 0x92da2e5d -//.word 0x4077a06b -//.word 0x29c1f417 -//.word 0x6874c71d -//.word 0x1c48bf17 -//.word 0xc6c514f0 -//.word 0xf2594f9b -//.word 0x1aa85205 -//.word 0xc7239948 -//.word 0xf9dcbf21 -//.word 0xc99844a4 -//.word 0x4d268d2e -//.word 0xbcf02c9c -//.word 0xd2d062ba -//.word 0x7625e2fe -//.word 0x9b25d877 -//.word 0x64752a00 -//.word 0x8bf7feb9 -//.word 0x03e37cb8 -//.word 0xdc19d5fb -//.word 0x68b584a1 -//.word 0x9ce4d45a -//.word 0xb8f7a21d -//.word 0x2bb66419 -//.word 0xb0f76aed -//.word 0xbe6f641b -//.word 0x1fc725ba -//.word 0xdef2a66c -//.word 0x67bf4e90 -//.word 0xeaaa70b9 -//.word 0x00f8165e -//.word 0x9103fdd3 -//.word 0xf5d2e077 -//.word 0x59ecf930 -//.word 0x656ec614 -//.word 0x1c5c0969 -//.word 0x033512d0 -//.word 0x85ca40bd -//.word 0x964fc62a -//.word 0x97b3ab8d -//.word 0x792d1507 -//.word 0x2618c6de -//.word 0x1c00e72d -//.word 0x5bfd04da -//.word 0x823f59c9 -//.word 0x35eb4c4f -//.word 0xc1263aea -//.word 0x036e762f -//.word 0x86318f03 -//.word 0xeb98d20e -//.word 0x8ea4106d -//.word 0x667da2a7 -//.word 0x2d07a9e3 -//.word 0xc1b59a58 -//.word 0xcba2fb04 -//.word 0x9ede67a1 -//.word 0x6205d8d5 -//.word 0x711726a9 -//.word 0x0183ca3c -//.word 0x0485e8b9 -//.word 0x4cb28d86 -//.word 0xf3d235be -//.word 0xfaed90e2 -//.word 0x30a985cb -//.word 0x55d378e3 -//.word 0x803bc895 -//.word 0xbec59c02 -//.word 0xfcbde0f6 -//.word 0x276b8a1a -//.word 0x91e7226b -//.word 0x972f81ea -//.word 0x8177d995 -//.word 0xa9c0f597 -//.word 0xe0acc2bc -//.word 0x0d910f27 -//.word 0x17cc9147 -//.word 0x05582a07 -//.word 0x649f6a45 -//.word 0xe98f5786 -//.word 0x58f169e8 -//.word 0xa4f6d958 -//.word 0x58131c04 -//.word 0x350faa13 -//.word 0x1d5b0394 -//.word 0x30a1f4b5 -//.word 0x349f1636 -//.word 0x3a36991d -//.word 0x7ebe3faa -//.word 0x909dab8d -//.word 0xb118dc57 -//.word 0x8069f52f -//.word 0xd6113fc6 -//.word 0xee6f708d -//.word 0xc9922e25 -//.word 0xd04ccf16 -//.word 0xbc8763c5 -//.word 0xb3dcf4a0 -//.word 0xb3620c9c -//.word 0x34c478e1 -//.word 0x09974cc3 -//.word 0x88ea27f5 -//.word 0xea1eb8f9 -//.word 0xf5f881db -//.word 0xd8f4db1f -//.word 0x56dc3bf8 -//.word 0x269ab3bb -//.word 0x9a4bbc92 -//.word 0x80943275 -//.word 0x4639a056 -//.word 0x61ebbe9c -//.word 0xee6238d3 -//.word 0x9aacb1a2 -//.word 0xc0c508fd -//.word 0xd267da9b -//.word 0xfa2348ab -//.word 0x01b1fac3 -//.word 0x6f856319 -//.word 0xf4a247f5 -//.word 0x06b37b66 -//.word 0xcc58ed35 -//.word 0x3bbee417 -//.word 0x7f728826 -//.word 0x9c77a492 -//.word 0x5596ab94 -//.word 0x4df5f9a4 -//.word 0x6ceb5cec -//.word 0x8413d3fc -//.word 0x349f95bf -//.word 0x0def55ae -//.word 0xf463c543 -//.word 0xc76d59b1 -//.word 0x44ea4dd2 -//.word 0x26b2e961 -//.word 0x906d0469 -//.word 0xafa9c7fd -//.word 0x9c2ab32a -//.word 0x7f81e52a -//.word 0xfae199da -//.word 0xc52dee6f -//.word 0x9555e964 -//.word 0x43e3bbb6 -//.word 0x2ad14754 -//.word 0xd19edfd1 -//.word 0xcaa14e5d -//.word 0xd99c1cf3 -//.word 0x59940dd4 -//.word 0xdce0eb33 -//.word 0x12818532 -//.word 0xecb1f80d -//.word 0x00be2d95 -//.word 0x3019a3e1 -//.word 0x86aa6f40 -//.word 0x63678171 -//.word 0xd9252817 -//.word 0x55aed967 -//.word 0x81132c24 -//.word 0x684427cd -//.word 0xdcddbf15 -//.word 0x14439c93 -//.word 0x9af01dbb -//.word 0x650b9c0d -//.word 0x413cf38c -//.word 0x78be3e72 -//.word 0xabb6e322 -//.word 0x01c3d05e -//.word 0x84d604ba -//.word 0xc7445150 -//.word 0xcc1960b6 -//.word 0x26b0f52d -//.word 0x5b80741b -//.word 0x8c39a5bc -//.word 0x5810b414 -//.word 0xfd567c28 -//.word 0xc050046d -//.word 0x90434a81 -//.word 0xe6ce4019 -//.word 0xef7c153b -//.word 0xed9ab5ad -//.word 0xdb4693ad -//.word 0x4fc9a6e2 -//.word 0xa527b193 -//.word 0x5af4c817 -//.word 0xb668108c -//.word 0xaeb6c6cc -//.word 0x089a839d -//.word 0xc031be28 -//.word 0xab0e92ad -//.word 0x5a8ac174 -//.word 0x415bfa07 -//.word 0x1869579e -//.word 0x82dd2adb -//.word 0xed7af9b7 -//.word 0xb930c7bd -//.word 0x9cee9576 -//.word 0x45b92924 -//.word 0x3ffb0eb2 -//.word 0x191ddcec -//.word 0xc457baec -//.word 0x3cc720d4 -//.word 0x6ac1e2c3 -//.word 0x4a676a01 -//.word 0x4979447d -//.word 0xf16ee17a -//.word 0xc7c39485 -//.word 0x7493e1aa -//.word 0x2468f7e7 -//.word 0x2c517be1 -//.word 0xef3487d6 -//.word 0x0266f3d3 -//.word 0x8e79d327 -//.word 0xf6554017 -//.word 0xba8a5cd3 -//.word 0x9ce590a9 -//.word 0x01421879 -//.word 0x99a0c269 -//.word 0x427bf2d9 -//.word 0x2a56ea9a -//.word 0x3497485a -//.word 0x9e97d063 -//.word 0xe0fa6c86 -//.word 0xd73c7151 -//.word 0x228d2489 -//.word 0xcddf7dd4 -//.word 0x2c3d2bb5 -//.word 0x0a5ed7bd -//.word 0x047aad00 -//.word 0x2f5c19c7 -//.word 0x01b9ce84 -//.word 0x6ec00d0b -//.word 0x51f224fe -//.word 0x0e343589 -//.word 0x75223850 -//.word 0xeaa743a6 -//.word 0xc3ca0900 -//.word 0xf2cba2a9 -//.word 0xe46f8ab7 -//.word 0xa998eb3d -//.word 0x54181fc2 -//.word 0xa5c770f2 -//.word 0xe5d42394 -//.word 0x1258b6bc -//.word 0x3c316542 -//.word 0x2f0df372 -//.word 0x52c5a605 -//.word 0xcfed9451 -//.word 0xf4a91dbc -//.word 0xdac1b976 -//.word 0x44f8f468 -//.word 0xc99ab667 -//.word 0x3655c8ae -//.word 0x2e49948b -//.word 0x13622c58 -//.word 0x2ae68ead -//.word 0xf94a27d4 -//.word 0xf44a957d -//.word 0x5939b1b3 -//.word 0x5995cd0f -//.word 0x78de3a2c -//.word 0x36a80e5a -//.word 0xeff02397 -//.word 0x00ac63bb -//.word 0x2ba543f2 -//.word 0x3d898e6f -//.word 0xed3c645f -//.word 0x0870821c -//.word 0xcb75c4a4 -//.word 0x9052e749 -//.word 0xae1494aa -//.word 0x9a669ae1 -//.word 0x52627cfe -//.word 0xfba72bb5 -//.word 0xc8ac1453 -//.word 0x1f545df6 -//.word 0xf7c26cfe -//.word 0x856eaabf -//.word 0x17788678 -//.word 0x403dbc89 -//.word 0x3529d7e0 -//.word 0x77ccf4b5 -//.word 0xb22fca77 -//.word 0xe568e706 -//.word 0xc46c3c22 -//.word 0x5b25dc24 -//.word 0xf3c401eb -//.word 0x3959501a -//.word 0x9da05e81 -//.word 0xf91e72d8 -//.word 0x736d8db3 -//.word 0xa4d5a7b2 -//.word 0xfa1c3cf8 -//.word 0x5a9e07df -//.word 0x0aa00eea -//.word 0xcfe1defc -//.word 0x527218c7 -//.word 0xc8c82c86 -//.word 0xd21065ef -//.word 0xa2c22663 -//.word 0x60797369 -//.word 0xcc02b25a -//.word 0x24b2b35e -//.word 0x48fdef96 -//.word 0x1c450d9b -//.word 0x2ef0ab28 -//.word 0x99bd5a13 -//.word 0x2958ea82 -//.word 0xbf2ce95b -//.word 0xf77866fc -//.word 0x09a5fa2d -//.word 0xedd70a52 -//.word 0xc3c246e6 -//.word 0x71bf7524 -//.word 0x8e1e7507 -//.word 0x7fbe7d75 -//.word 0xdfdca6b7 -//.word 0x2529aa2d -//.word 0x801feb40 -//.word 0x0694b797 -//.word 0x0e90ca8e -//.word 0xda5c14e4 -//.word 0x7adbbdb3 -//.word 0xec1d67a6 -//.word 0x8832b366 -//.word 0x9c3c0655 -//.word 0x53c88d7f -//.word 0xdb5f7ece -//.word 0xc657a17d -//.word 0xb1ef10ce -//.word 0x249c3b00 -//.word 0xba9d2e7b -//.word 0x82d5174f -//.word 0xa4da02dc -//.word 0x484ae8d2 -//.word 0xb35ee85d -//.word 0xb3c1d499 -//.word 0x3ea2ef4c -//.word 0x5608f5d4 -//.word 0x2f655c5e -//.word 0x946fda59 -//.word 0x872b272b -//.word 0x284a0422 -//.word 0xd8b97cad -//.word 0x9d746acc -//.word 0xc89b3bc5 -//.word 0xd6c7f519 -//.word 0x959e78b6 -//.word 0x88a5056e -//.word 0x8b56fca8 -//.word 0xba73ea55 -//.word 0x9099c226 -//.word 0x4c186bfc -//.word 0x99027ba1 -//.word 0x6d8243b5 -//.word 0x326f0beb -//.word 0x24219e75 -//.word 0xfa840abc -//.word 0xc86aa155 -//.word 0x24264330 -//.word 0x8856e013 -//.word 0xf7003847 -//.word 0xe3e1e592 -//.word 0x4f019c65 -//.word 0x318bb055 -//.word 0x1adcd7cf -//.word 0x18da3108 -//.word 0xdc878634 -//.word 0x18d6d0f8 -//.word 0x2bbdf921 -//.word 0x008be596 -//.word 0x337cb38b -//.word 0x768a40f8 -//.word 0x3487ed4a -//.word 0x7469a358 -//.word 0xffe51498 -//.word 0xc53f4393 -//.word 0x7d604696 -//.word 0x8c294aab -//.word 0x2807d9c7 -//.word 0xbdc75845 -//.word 0x8facd493 -//.word 0xa2bffe2c -//.word 0xd76773c6 -//.word 0x573941cc -//.word 0x3411a70e -//.word 0x4e621db8 -//.word 0x74ca9480 -//.word 0xcceaff24 -//.word 0x75741214 -//.word 0x6a854a6b -//.word 0xaa362d24 -//.word 0x966ed38b -//.word 0x9afaa5f1 -//.word 0x0fdf65a4 -//.word 0x60ee6f1f -//.word 0x6c9a3e7d -//.word 0x2c073134 -//.word 0x96638fff -//.word 0xc179ca1c -//.word 0x498300b8 -//.word 0xf540c7a8 -//.word 0x97472a59 -//.word 0x349bef0a -//.word 0x657f1c38 -//.word 0xfd8cb95a -//.word 0xec00d6cf -//.word 0x6459d015 -//.word 0x3a23d13b -//.word 0x8e0e9699 -//.word 0xae4375be -//.word 0x38f89eaa -//.word 0x7f42a13e -//.word 0x302b30f0 -//.word 0x360526c3 -//.word 0xdafec977 -//.word 0x2ff44cfc -//.word 0xad8a992d -//.word 0x1c7b4dbb -//.word 0xb42e0367 -//.word 0x828bd575 -//.word 0x0d0e205d -//.word 0x3a1988c3 -//.word 0x6d8f3ca9 -//.word 0xf19e7be4 -//.word 0x9adc58cc -//.word 0xa896ba38 -//.word 0xef64a6aa -//.word 0x3501c1c6 -//.word 0xdc5a1009 -//.word 0xc1e503b7 -//.word 0x6334b215 -//.word 0x48ca66d9 -//.word 0x9c2d5bdf -//.word 0x1c3dc41d -//.word 0x32c310d9 -//.word 0x614d6c19 -//.word 0xe43a895c -//.word 0x92119f87 -//.word 0x0517b222 -//.word 0xfb2014c4 -//.word 0xfca52bcc -//.word 0x3e177452 -//.word 0xc573c85e -//.word 0xce17de57 -//.word 0x6ed412be -//.word 0x7744641c -//.word 0x9b5dc438 -//.word 0xd4478d8e -//.word 0x036b4ffd -//.word 0xd7cdd1c0 -//.word 0xf09b569f -//.word 0x44062066 -//.word 0xc2503397 -//.word 0x36265b5c -//.word 0x6d3170bf -//.word 0x99e8d91d -//.word 0xf6a84fd8 -//.word 0xae06e34d -//.word 0xfb644306 -//.word 0x8bc23930 -//.word 0x28d7744f -//.word 0x98608b30 -//.word 0xc2b93f1f -//.word 0x13aa015b -//.word 0x2083b4c7 -//.word 0x8d6bb3e2 -//.word 0x2df516f9 -//.word 0x6af4319c -//.word 0xe8915e4e -//.word 0x659afd80 -//.word 0xe41db8c1 -//.word 0x0a360c2f -//.word 0xc8250431 -//.word 0x3aa34868 -//.word 0xcf7757e2 -//.word 0xab441191 -//.word 0x49a578fc -//.word 0x657bb735 -//.word 0x1986640b -//.word 0x46330280 -//.word 0x35b5ca7e -//.word 0x7e57abc5 -//.word 0x29118f28 -//.word 0x1459e0f9 -//.word 0x943b4ac2 -//.word 0x5facc335 -//.word 0xaa1cc966 -//.word 0x8e4aeb38 -//.word 0xb05c8b15 -//.word 0x212fe2e3 -//.word 0x83ec4533 -//.word 0x6edca6bb -//.word 0x127d5d06 -//.word 0x1dd5296a -//.word 0xdf06713b -//.word 0xab23d03e -//.word 0x8142d160 -//.word 0xebd2f7a8 -//.word 0x252f016b -//.word 0x80746bbf -//.word 0x08913831 -//.word 0x659defbb -//.word 0xff6de4f0 -//.word 0x6665b87a -//.word 0xf08e23c6 -//.word 0xa4e9f1fe -//.word 0x56034b38 -//.word 0x14ca38ed -//.word 0xc19f64ac -//.word 0x00ac1f0f -//.word 0x5478a8ef -//.word 0x85b8acd4 -//.word 0x45690aaf -//.word 0x131bd9cc -//.word 0x6090ac02 -//.word 0xf085142d -//.word 0x84d067de -//.word 0xb6abc050 -//.word 0x2450479e -//.word 0xd0c6b334 -//.word 0xc7fa0d83 -//.word 0x0111b6fa -//.word 0x89fdab31 -//.word 0xdd4e0867 -//.word 0x984bcb2e -//.word 0x4e42db65 -//.word 0xb81c4967 -//.word 0x1134d582 -//.word 0xbf6ab4ab -//.word 0x3673906f -//.word 0x1a73d12d -//.word 0xa3cd1b83 -//.word 0x46391706 -//.word 0x92187736 -//.word 0x580534b1 -//.word 0x0ead1aa6 -//.word 0x75e0878d -//.word 0x7ae87015 -//.word 0x5a19a45e -//.word 0x0aa95569 -//.word 0xd6c2d4cd -//.word 0x48d69cab -//.word 0x4b3392e3 -//.word 0x90d78b88 -//.word 0x31850f92 -//.word 0x95185dd3 -//.word 0x9318ae2d -//.word 0xda8bbe01 -//.word 0x900d89ea -//.word 0x392352ac -//.word 0xdbcdea67 -//.word 0x5f5a2f11 -//.word 0x3b80d322 -//.word 0x4eac5f91 -//.word 0x0b977700 -//.word 0xda1a5f34 -//.word 0xbb43bec7 -//.word 0x2da8a221 -//.word 0x4efbc5a4 -//.word 0x43df0f27 -//.word 0xdafa5ba6 -//.word 0x6e4c7e37 -//.word 0x0cbf8540 -//.word 0xd3ff3fe8 -//.word 0xa18bfccb -//.word 0xec0d93f2 -//.word 0xede7aa02 -//.word 0x040e31b3 -//.word 0x581b3084 -//.word 0xbe9fc3ae -//.word 0xdcb76256 -//.word 0x8ee16606 -//.word 0x880ec95e -//.word 0x3df92e07 -//.word 0x00b621e9 -//.word 0x698e9f9e -//.word 0xfb0ad926 -//.word 0x034e35dc -//.word 0xc3a896a8 -//.word 0xd069dd77 -//.word 0xb9f4b0e8 -//.word 0xe9147a48 -//.word 0xcf93b2c1 -//.word 0x3c0861ce -//.word 0x0cf0def2 -//.word 0x0800dcaa -//.word 0x0bbaa7a0 -//.word 0x643fab21 -//.word 0x7c6436d1 -//.word 0xb9077f9e -//.word 0xa1a4e6f2 -//.word 0x43237d2d -//.word 0xd2f4c852 -//.word 0x945ec100 -//.word 0xfa141fa5 -//.word 0x110ad8ee -//.word 0x1986e582 -//.word 0x727a45ef -//.word 0xc01144e4 -//.word 0x4788fda2 -//.word 0x973f1ead -//.word 0x6e10ebc7 -//.word 0xdadf861e -//.word 0x9e726dc5 -//.word 0xd7834461 -//.word 0xdf14d525 -//.word 0x72035500 -//.word 0x0fdee814 -//.word 0xa1f8686b -//.word 0x5fbd62e5 -//.word 0xf1426275 -//.word 0xd421718d -//.word 0xff83dbd7 -//.word 0xc77e3626 -//.word 0x00a29fac -//.word 0x65ce476d -//.word 0x3a482ff3 -//.word 0x2f0d2f44 -//.word 0x88663d11 -//.word 0x7bbcec30 -//.word 0xd9ad334d -//.word 0xf16070dc -//.word 0xb215ac51 -//.word 0x0f002194 -//.word 0xa857f9af -//.word 0xa6aa59ca -//.word 0xe6739e5a -//.word 0x5beee795 -//.word 0xad2ad329 -//.word 0x26608c2d -//.word 0xcf850458 -//.word 0xd61b7e71 -//.word 0x334c5106 -//.word 0x8b39e861 -//.word 0x55900eb8 -//.word 0x3b5c68a4 -//.word 0xc32243d4 -//.word 0x2e299103 -//.word 0xa1192d27 -//.word 0x82c867ec -//.word 0x2550bc60 -//.word 0xa865e5f0 -//.word 0x1be51493 -//.word 0xe4b17a45 -//.word 0x62bc0cb7 -//.word 0xd1618745 -//.word 0x6efab128 -//.word 0xdbaee2ed -//.word 0xc48ac425 -//.word 0xc3d3575f -//.word 0x819b3853 -//.word 0x1f932260 -//.word 0xd420b539 -//.word 0xd7b176db -//.word 0x7f4f18c2 -//.word 0xa876fa5c -//.word 0x5a23f0be -//.word 0xa52e4696 -//.word 0xcfda0260 -//.word 0xb2ab6add -//.word 0x5f77c6c1 -//.word 0x07c067ac -//.word 0x1c41e85c -//.word 0xb3c7b421 -//.word 0x2d42c891 -//.word 0x161cbb7c -//.word 0x4dc9fb23 -//.word 0x65a059a4 -//.word 0x4ce9c8b9 -//.word 0x2a3761a2 -//.word 0x8cf8ab60 -//.word 0xc24a1a24 -//.word 0x8510d507 -//.word 0xde45bcfb -//.word 0x4391aa02 -//.word 0x021af79e -//.word 0xe39d4288 -//.word 0x08bd6da4 -//.word 0x199be835 -//.word 0x9ea6334e -//.word 0xacb59e89 -//.word 0xc45354fa -//.word 0xf8599766 -//.word 0x4fc34db1 -//.word 0x6bbcbc96 -//.word 0x69fb929b -//.word 0x09522843 -//.word 0x0f840785 -//.word 0xe958ac7d -//.word 0x91eb8862 -//.word 0xb54a4bb8 -//.word 0x164062c6 -//.word 0x2e6dbe4b -//.word 0x1598d86d -//.word 0xa547f2f2 -//.word 0xdd8c9fb2 -//.word 0x8321854c -//.word 0x0db76219 -//.word 0xc28c4d5e -//.word 0x1d3c3fc6 -//.word 0x72d9d10f -//.word 0xd33d4703 -//.word 0x359fceaa -//.word 0xcf6502be -//.word 0xc339b35f -//.word 0x005fe908 -//.word 0x674625c2 -//.word 0x2d5dea97 -//.word 0x80277c4a -//.word 0x6d92e845 -//.word 0x018544d3 -//.word 0xaeb8388f -//.word 0xf1c8be1d -//.word 0x328b2517 -//.word 0xeca15c4a -//.word 0x0d4b6d23 -//.word 0xa0804864 -//.word 0xa93ec21b -//.word 0x501fddd5 -//.word 0x422c4a0f -//.word 0x55f52ced -//.word 0x6be21f2f -//.word 0x98c47960 -//.word 0x87afd050 -//.word 0x190cbcc5 -//.word 0x50eadd6e -//.word 0x6c952018 -//.word 0x536a3f24 -//.word 0x36e98739 -//.word 0x720cde36 -//.word 0xb4d7046b -//.word 0x61311908 -//.word 0x35f260d5 -//.word 0x2a3d4224 -//.word 0x9b109605 -//.word 0xa9191fb8 -//.word 0xdecc5668 -//.word 0x10b26a16 -//.word 0x880486d3 -//.word 0x64785232 -//.word 0x3a5bbcfd -//.word 0xfee0f827 -//.word 0x26b8c502 -//.word 0x0be2f3b2 -//.word 0x93c522e2 -//.word 0x0d7cccb5 -//.word 0x5c7186ff -//.word 0x582d82b6 -//.word 0x716e59a3 -//.word 0x967a075d -//.word 0x55b43778 -//.word 0x436dc2fa -//.word 0x9efc720e -//.word 0x31110bfd -//.word 0x78468c59 -//.word 0x05f7b27c -//.word 0x2254be31 -//.word 0xb8b478b0 -//.word 0x6f2d74d0 -//.word 0x17619478 -//.word 0x479ace56 -//.word 0x431a2fd4 -//.word 0x23ac2048 -//.word 0x327fe96b -//.word 0x9534730d -//.word 0x2d365207 -//.word 0xbe4a0270 -//.word 0x50677114 -//.word 0xd5c7be21 -//.word 0x0d3e4124 -//.word 0xa7cbcb34 -//.word 0xa96d2f6d -//.word 0x113701a1 -//.word 0xbca79d49 -//.word 0x88346bc2 -//.word 0xb62662b6 -//.word 0x92aacbd8 -//.word 0x552648d4 -//.word 0x4aca1485 -//.word 0x30688c69 -//.word 0xe085ef53 -//.word 0x2fb06260 -//.word 0x1612372c -//.word 0x10476e46 -//.word 0xc46c7ce1 -//.word 0xe4794ccc -//.word 0x55d184a4 -//.word 0x90180948 -//.word 0x4845c58d -//.word 0x4df8a833 -//.word 0xb00dec18 -//.word 0x28719eac -//.word 0xb4345aa5 -//.word 0x82e056f4 -//.word 0x100aa1f7 -//.word 0x9126adf0 -//.word 0x92a00cb6 -//.word 0xdd2877aa -//.word 0x9d4d14ed -//.word 0xc44df9d0 -//.word 0xaa2bec8c -//.word 0xf6036c34 -//.word 0xc29bf6e7 -//.word 0xfa3a814a -//.word 0x05bd4b35 -//.word 0xa8e7d7ad -//.word 0x27f93613 -//.word 0xad82879a -//.word 0xed79baff -//.word 0x0a899974 -//.word 0xb4ac08dd -//.word 0x95fb8b3e -//.word 0xebc50a74 -//.word 0x76ded124 -//.word 0x9439dbf2 -//.word 0xabb950f3 -//.word 0xc7454c64 -//.word 0x841be29c -//.word 0x2f66613f -//.word 0x2812d5b5 -//.word 0x8adfd1da -//.word 0x0eb46cf7 -//.word 0x2d378af2 -//.word 0x859a5dc1 -//.word 0x7eb72b24 -//.word 0x2d605194 -//.word 0x79f08876 -//.word 0x7c266795 -//.word 0x2c3429cf -//.word 0x3a12b10f -//.word 0x3a18cb7b -//.word 0x05ccb5ee -//.word 0x5bf9dea8 -//.word 0xcd01ed44 -//.word 0xda7305eb -//.word 0x59e047c8 -//.word 0x17eb99bb -//.word 0xc0a0a652 -//.word 0x030726f5 -//.word 0xf1f86060 -//.word 0xa630ed57 -//.word 0x2ca5be94 -//.word 0x9c176105 -//.word 0x86e87f34 -//.word 0x932daa07 -//.word 0x690555a9 -//.word 0xcf2a24c8 -//.word 0x12c56701 -//.word 0xa787e198 -//.word 0x11f5cd6d -//.word 0x0603232b -//.word 0xcde517c3 -//.word 0xea22e219 -//.word 0xfdeac6fc -//.word 0xe8a94c5c -//.word 0x30dcd1b7 -//.word 0xa62440d5 -//.word 0x469821b5 -//.word 0x5f60d3c7 -//.word 0xf480155c -//.word 0x62f1cc5a -//.word 0x44f60034 -//.word 0x94ad2719 -//.word 0x13e4a66c -//.word 0xea2f9575 -//.word 0x9137c256 -//.word 0xf055f940 -//.word 0xc46083e6 -//.word 0x45c3ed32 -//.word 0x06d20b37 -//.word 0x1c5e3b68 -//.word 0x8286ee07 -//.word 0xbcd165e0 -//.word 0xbb7ab936 -//.word 0x010b1efe -//.word 0x052d684b -//.word 0xd9bfcf0a -//.word 0x0a25efef -//.word 0xc8e313af -//.word 0x466ab270 -//.word 0x64313a7d -//.word 0x8c080d3f -//.word 0xd9aac969 -//.word 0x7f91cd72 -//.word 0x670ef948 -//.word 0x1998b443 -//.word 0xdf653457 -//.word 0x2737fa8f -//.word 0x2a799bb6 -//.word 0xcb8ac657 -//.word 0xc25983e9 -//.word 0xf932b943 -//.word 0x36d7f356 -//.word 0xfbd3631a -//.word 0xab0b28c9 -//.word 0xed96cc4c -//.word 0x55ce11f2 -//.word 0x42a7ed68 -//.word 0x0240d3e6 -//.word 0x3db834a6 -//.word 0x9043469a -//.word 0x787d045e -//.word 0x72fe766c -//.word 0x602e328f -//.word 0x2f5a239a -//.word 0xb7088959 -//.word 0xe28841c8 -//.word 0x11cc4783 -//.word 0xbb7a797e -//.word 0x573e9df6 -//.word 0x7d65a6a7 -//.word 0x48a83340 -//.word 0xfe455914 -//.word 0xf355a212 -//.word 0xaa5955f7 -//.word 0x3e16f8c2 -//.word 0x00a31468 -//.word 0x62c038ca -//.word 0x146940e4 -//.word 0x6cabd747 -//.word 0x0bb73bc9 -//.word 0xbe35417b -//.word 0xa2da98db -//.word 0x8c3d514b -//.word 0xa7e69fc2 -//.word 0x5fa8dcc2 -//.word 0x7e32cd8a -//.word 0x95e0278c -//.word 0x9ed75221 -//.word 0xdf506c7c -//.word 0x123491dc -//.word 0xc2ea5a06 -//.word 0xf86ca3f3 -//.word 0x17a192c6 -//.word 0x05e7d501 -//.word 0x8bee2af7 -//.word 0xffcd2585 -//.word 0x204f2efd -//.word 0x418ec963 -//.word 0xaac41adc -//.word 0x3b5da863 -//.word 0x525161be -//.word 0xefb0deb0 -//.word 0x167fe971 -//.word 0x75c23c5b -//.word 0x47da8ce6 -//.word 0x7811c6d6 -//.word 0x0a7499b3 -//.word 0xb7e1347a -//.word 0xd8605192 -//.word 0x85b67201 -//.word 0xfe386ae0 -//.word 0x49de200c -//.word 0x1d98901f -//.word 0xffe5129f -//.word 0xaba1df75 -//.word 0xb51ed1a0 -//.word 0x70776a2a -//.word 0x0f21185b -//.word 0x0ac3b72e -//.word 0xc4485801 -//.word 0x6a324190 -//.word 0x1e313524 -//.word 0x55f4f508 -//.word 0x7d3f063d -//.word 0xe43eb56e -//.word 0xd5195926 -//.word 0x04c8d841 -//.word 0x2b296ca1 -//.word 0xf64fa722 -//.word 0x1d1db5cf -//.word 0xcf14e256 -//.word 0x576a5bb9 -//.word 0xfa5c3947 -//.word 0x1ec5bbcb -//.word 0xb2eed303 -//.word 0xc9a8e553 -//.word 0x8898cbbb -//.word 0x43d31c07 -//.word 0xe3abae45 -//.word 0x8bc8597c -//.word 0x7b7afe9b -//.word 0x344dc8b0 -//.word 0xdcdeb25a -//.word 0xe5ee4a81 -//.word 0xeab5b444 -//.word 0xd978f133 -//.word 0x575e62bf -//.word 0x608087ee -//.word 0x2e3f0d54 -//.word 0x5dda083e -//.word 0x4c407d30 -//.word 0xc6222392 -//.word 0xe24d6aa6 -//.word 0x2737bdbd -//.word 0xf4d704ab -//.word 0x1fba6e78 -//.word 0xdd546d58 -//.word 0xe29402dd -//.word 0xc9bb3a6c -//.word 0xb56df9ee -//.word 0x3908f6c7 -//.word 0x7536070c -//.word 0x82be9ff0 -//.word 0x11a09480 -//.word 0x4e602691 -//.word 0x0ba23ef6 -//.word 0x1af7f3f6 -//.word 0xfaf752fd -//.word 0xb7905f91 -//.word 0x0b9d5788 -//.word 0xc9ba3878 -//.word 0x7b578370 -//.word 0x4a0c41e5 -//.word 0x1f2c44ef -//.word 0x089dafb6 -//.word 0xdde7b926 -//.word 0x238aadeb -//.word 0x30953599 -//.word 0x9074d92a -//.word 0xa80ac3ae -//.word 0x9900c53e -//.word 0x685c9d32 -//.word 0x5b557794 -//.word 0xa665b3d4 -//.word 0x46a1e9bc -//.word 0x2e462aa7 -//.word 0xa19489ee -//.word 0xdfdfdaa4 -//.word 0x03e3ba83 -//.word 0x2c58d025 -//.word 0xdbc65278 -//.word 0x9c9bca6c -//.word 0xe97b1aee -//.word 0x4bd7bd1a -//.word 0xc2c151ac -//.word 0x67fe52b8 -//.word 0x505d299c -//.word 0xb4486532 -//.word 0x4f99484a -//.word 0x08af8557 -//.word 0xd2c04868 -//.word 0xd070775a -//.word 0xbca3374c -//.word 0x8990b354 -//.word 0x47181970 -//.word 0x4855e4c0 -//.word 0x817561f2 -//.word 0x32c96cfd -//.word 0xca197b12 -//.word 0x053bdfcf -//.word 0x57e346b7 -//.word 0x8dbd83df -//.word 0xb2b992e9 -//.word 0x2fa7d636 -//.word 0x3703a658 -//.word 0x621208c6 -//.word 0x982ebcd4 -//.word 0x315d7de2 -//.word 0x5a2983d3 -//.word 0xbbac4cc1 -//.word 0x57eb9cee -//.word 0xb365c3fe -//.word 0x3aeb1e64 -//.word 0xe0b1e01b -//.word 0x06a61296 -//.word 0x9d01d9f9 -//.word 0x8f1cf889 -//.word 0x5a869561 -//.word 0xfe544068 -//.word 0x1ab7317f -//.word 0x52d4d1ff -//.word 0xf3cf7d62 -//.word 0xda298640 -//.word 0x924d7c7e -//.word 0xbc65acc2 -//.word 0xb472e729 -//.word 0x719c853d -//.word 0xadc6aa21 -//.word 0x4666c80f -//.word 0xe5946505 -//.word 0xdd611fba -//.word 0x5669edd7 -//.word 0xaaaca764 -//.word 0x0f99c980 -//.word 0x776c7456 -//.word 0xb4bab54c -//.word 0xe04a0a7d -//.word 0xfc27226a -//.word 0xd7f3e5ec -//.word 0x317eb46e -//.word 0x2198f258 -//.word 0xb423c3ce -//.word 0xd76c139b -//.word 0x77bbdb68 -//.word 0xe6289f32 -//.word 0x81b13cfb -//.word 0x908ae0bf -//.word 0x6db45aa9 -//.word 0xe9d19487 -//.word 0xeb375d7c -//.word 0x5a436cf4 -//.word 0x3defa2dd -//.word 0x21a79015 -//.word 0xbb59391e -//.word 0xcfcc1919 -//.word 0x513266f2 -//.word 0xc90095d8 -//.word 0xfcfd20f0 -//.word 0xc899874a -//.word 0x50819514 -//.word 0x5970e40d -//.word 0xf448a33d -//.word 0x5e6197e4 -//.word 0x242160b0 -//.word 0x8acdfe32 -//.word 0x2e9e9393 -//.word 0xe9186a83 -//.word 0xf6973973 -//.word 0x562ba304 -//.word 0x72a501bf -//.word 0x03f26206 -//.word 0x2fa8d04a -//.word 0xf4dfd67f -//.word 0xca423fcd -//.word 0x84661f89 -//.word 0x785a1863 -//.word 0xdf7fd6e1 -//.word 0x7f99dc0c -//.word 0x87278369 -//.word 0xbaf03f2a -//.word 0xcfdf25a6 -//.word 0x1810aa07 -//.word 0x632bae42 -//.word 0x1ef1b94d -//.word 0xbe14848c -//.word 0x614cbb8c -//.word 0xb1a701f3 -//.word 0x0c2135b7 -//.word 0xe374f38f -//.word 0x60315ea7 -//.word 0x4c101d98 -//.word 0x2f84a497 -//.word 0xb993b5ec -//.word 0x60e526a7 -//.word 0x4b1be48e -//.word 0x6f623859 -//.word 0xf8474922 -//.word 0xeacde317 -//.word 0x08bc7672 -//.word 0xf53d62ab -//.word 0x99a471eb -//.word 0xc68da5c5 -//.word 0x1b2a3521 -//.word 0x29dbd278 -//.word 0xd5ff2e47 -//.word 0xfd0bbfbd -//.word 0x5fd9c1b7 -//.word 0xb6427aef -//.word 0x25eec170 -//.word 0xd96bc14e -//.word 0xeb7dfb93 -//.word 0x83b58a7c -//.word 0x4345abe6 -//.word 0xe3137c03 -//.word 0x180c0451 -//.word 0xbbbb74cd -//.word 0x271aac64 -//.word 0xe3a801aa -//.word 0x81bb3ece -//.word 0xc518e8ce -//.word 0x0ac1c7e7 -//.word 0xe20ea150 -//.word 0xfdff4927 -//.word 0x4cd1d9ac -//.word 0x65cf3bad -//.word 0x2a6bee41 -//.word 0xa58d06b9 -//.word 0x372b75d4 -//.word 0xf21a8a32 -//.word 0x4324b70b -//.word 0xd45a9721 -//.word 0xb0ab2ff3 -//.word 0xa9b67534 -//.word 0xf7dd0e7b -//.word 0x219b5c3c -//.word 0x2117b8f7 -//.word 0xc3f9fcaf -//.word 0x4e7c459e -//.word 0x66c4f727 -//.word 0x3173010c -//.word 0xb97762e1 -//.word 0x9125ecc1 -//.word 0xbc8c473f -//.word 0xca033a9f -//.word 0x44052647 -//.word 0x4a3fd370 -//.word 0x7be66f21 -//.word 0x154ed45e -//.word 0x5db90a9d -//.word 0x426d0d79 -//.word 0x3d09d0aa -//.word 0x7b188135 -//.word 0x3ee70fe0 -//.word 0x8194eae9 -//.word 0xdb680af7 -//.word 0xa5663251 -//.word 0x5f24764e -//.word 0x50dafb0d -//.word 0x6db9fe65 -//.word 0x7c7e171f -//.word 0x7946bf63 -//.word 0x39a41171 -//.word 0x4df1cd92 -//.word 0x29e3a24d -//.word 0x8661addd -//.word 0x04963de3 -//.word 0x1445d959 -//.word 0x155c84c7 -//.word 0xbdcb3fb9 -//.word 0xbb96d070 -//.word 0x9a29c2d8 -//.word 0xe9edadba -//.word 0x9918b733 -//.word 0xa6c95b65 -//.word 0xfa54696c -//.word 0x8eda4e93 -//.word 0xd21e96c8 -//.word 0x4f93af4e -//.word 0x8abaf0b2 -//.word 0x2caad900 -//.word 0x61f09d36 -//.word 0x7e9addf9 -//.word 0xe68fb787 -//.word 0x2e22ffed -//.word 0x7fe6cc7a -//.word 0x3cc33773 -//.word 0xe5495f08 -//.word 0x3c45b187 -//.word 0xa69266d0 -//.word 0xd3324c09 -//.word 0xa19dca93 -//.word 0x3e591e3c -//.word 0x8dcbeab6 -//.word 0xcc4def48 -//.word 0x738118c3 -//.word 0x5fe4bab8 -//.word 0x2fa61ae8 -//.word 0xefb930fc -//.word 0xf428aa76 -//.word 0x06aa34e8 -//.word 0xc577f763 -//.word 0x455a5f33 -//.word 0xfc0722c9 -//.word 0xdeb07ef9 -//.word 0xc6d3c266 -//.word 0x18560f3a -//.word 0xa4d5601a -//.word 0xce3bc859 -//.word 0xec8ffb6b -//.word 0xf011109d -//.word 0x47868504 -//.word 0x01d084b3 -//.word 0x31c16431 -//.word 0x9731732b -//.word 0x7c4ef365 -//.word 0xde3462f6 -//.word 0xcdbeffb5 -//.word 0x159b89ef -//.word 0x1da44a5b -//.word 0x0f6c544f -//.word 0x39190b33 -//.word 0xb473e337 -//.word 0x433b6b41 -//.word 0x7dbe8b29 -//.word 0x2faa0929 -//.word 0xfc1f528f -//.word 0x460978b5 -//.word 0x52ae7733 -//.word 0xa683bc53 -//.word 0xb644e8c6 -//.word 0xc043d195 -//.word 0xf501c95a -//.word 0xd9fb24af -//.word 0xecc6f4e7 -//.word 0x8a5e17fc -//.word 0x10bc74c9 -//.word 0x40a68179 -//.word 0xe7cb0940 -//.word 0xbc0f2c49 -//.word 0x8c24a7ef -//.word 0x945a552f -//.word 0x2fb8f65d -//.word 0xb14b3017 -//.word 0x92bed378 -//.word 0xcf2b618d -//.word 0x8d31ce0d -//.word 0xff478444 -//.word 0x8b4faa51 -//.word 0x286fa691 -//.word 0x0b1ce05b -//.word 0x8277c9ee -//.word 0x20dd1da7 -//.word 0x1ab96578 -//.word 0xf19dbf95 -//.word 0x5192e170 -//.word 0x3aac5ce8 -//.word 0x5de11ebd -//.word 0xc91a3b48 -//.word 0xc68bed69 -//.word 0x0140d9c0 -//.word 0xeaf99320 -//.word 0x5b386540 -//.word 0x7a984cb4 -//.word 0xe060441c -//.word 0xfb58c59c -//.word 0xb0dc8e8c -//.word 0x452ea170 -//.word 0x7f118f2a -//.word 0x0793f56e -//.word 0x122a4777 -//.word 0x4102ccf8 -//.word 0xc696ea56 -//.word 0xc97ea414 -//.word 0x0a87618f -//.word 0xc709efeb -//.word 0xe075c74d -//.word 0x392e934a -//.word 0x609aeda0 -//.word 0x70786a24 -//.word 0x3574d7fc -//.word 0x90f8c20e -//.word 0x1d463db8 -//.word 0x14c4dec2 -//.word 0x6d960a91 -//.word 0x4872739d -//.word 0x8bb0e025 -//.word 0xcda12d21 -//.word 0x73229278 -//.word 0x18712873 -//.word 0x333fa871 -//.word 0xf30676dd -//.word 0x6e9cdf5e -//.word 0xfb099f4d -//.word 0xdc96a76c -//.word 0x21261dd5 -//.word 0xc8c9a330 -//.word 0x298fdc29 -//.word 0x929a2c22 -//.word 0x2e77c024 -//.word 0x2bafcf1c -//.word 0x1b981f44 -//.word 0x9b71cadf -//.word 0x33ae4229 -//.word 0x7e91938e -//.word 0x8bfae81a -//.word 0x82805180 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00013C78 -//// expected output -//.word 0xd1089fea -//.word 0xe2a08019 -//.word 0xd9b7b121 -//.word 0xbc3fdb2e -//.word 0x64d90647 -//.word 0x735608bf -//.word 0x4e34be89 -//.word 0xf453d1fe -//.word 0xfa35e914 -//.word 0x4cd3a4f3 -//.word 0x89d3b911 -//.word 0xb330af77 -//.word 0x5ced0007 -//.word 0x46dd0b52 -//.word 0x6a1ffef1 -//.word 0x648e88bd -//// SHA512LongMsgvector_102 -//// vector length -//.word 0x00013F90 -//// input message -//.word 0xe5a4fde0 -//.word 0x5da8f531 -//.word 0x0909de90 -//.word 0xdb06ce4f -//.word 0x2ea08da7 -//.word 0xa6f49aaa -//.word 0x5ec76f7a -//.word 0x426306b9 -//.word 0xb9a29c40 -//.word 0x8848b514 -//.word 0xf3956095 -//.word 0x241bbcf9 -//.word 0xd1cebbf9 -//.word 0x1a5a26ca -//.word 0xb0b9e24f -//.word 0x3c04718d -//.word 0xff89bb5f -//.word 0xb51f0f6b -//.word 0xc0b66554 -//.word 0x8232e632 -//.word 0x0b7aae3f -//.word 0xf4cbd0d2 -//.word 0x8a539a92 -//.word 0x30fb1be3 -//.word 0xfe84e3a5 -//.word 0xaed50a1e -//.word 0xb9937434 -//.word 0xbdf352e0 -//.word 0x22ccecdf -//.word 0xfdf19fab -//.word 0x34bd21a9 -//.word 0xe4ef0da4 -//.word 0xffb89b7a -//.word 0x3a13ae15 -//.word 0x2655159d -//.word 0x9c050aec -//.word 0x5fedff43 -//.word 0xfd719b3b -//.word 0xf620fffe -//.word 0x20894db6 -//.word 0x4a506b46 -//.word 0x20810439 -//.word 0x4f23d0f7 -//.word 0xe911163f -//.word 0x0a056fd1 -//.word 0xbcf6cc6b -//.word 0x18a4baf7 -//.word 0xae71e503 -//.word 0x2772db71 -//.word 0x29c61370 -//.word 0x7b262eab -//.word 0x6abe7cc0 -//.word 0x6b3bc2f3 -//.word 0x01263b24 -//.word 0xe170dcfe -//.word 0x554edc72 -//.word 0xde477463 -//.word 0x1d8ae4a3 -//.word 0xf386b61f -//.word 0xe8b54656 -//.word 0xc9b88210 -//.word 0x95a9ef4c -//.word 0x9baded7a -//.word 0xdcc83bea -//.word 0xb6f6bd85 -//.word 0xc4777dbb -//.word 0x006af1bc -//.word 0x2a9d7ceb -//.word 0x6ea4368f -//.word 0x4128f0cc -//.word 0x8c8273d3 -//.word 0x0c880955 -//.word 0xf8a73f3d -//.word 0xe533e89e -//.word 0xe8fa65ea -//.word 0xfa1f2466 -//.word 0xa02667da -//.word 0xcb4b478d -//.word 0xfc18f870 -//.word 0xad364e9a -//.word 0xed8480f4 -//.word 0x4a662d36 -//.word 0xf3609c12 -//.word 0x1ee348ae -//.word 0xa8669c58 -//.word 0xfbb9fb76 -//.word 0x359603bb -//.word 0x877a13a1 -//.word 0xdab20a13 -//.word 0xb9b95269 -//.word 0x6bc11e9a -//.word 0x5f90efad -//.word 0xce8d5d71 -//.word 0x9b1b146e -//.word 0x7e251d1b -//.word 0x61fa5f52 -//.word 0x0a5c6500 -//.word 0xfbd36121 -//.word 0x964871ec -//.word 0x85ce224a -//.word 0x59c3338d -//.word 0x71189b5f -//.word 0x1eedccf8 -//.word 0x04613a95 -//.word 0xc4a81725 -//.word 0xd85e6145 -//.word 0xbe1a1f6e -//.word 0x5847e86d -//.word 0x932fa414 -//.word 0x47599730 -//.word 0x5e159bbb -//.word 0x3955ac52 -//.word 0x4fbeaae9 -//.word 0x17ff5bbd -//.word 0x2962b08a -//.word 0xa0a049fe -//.word 0xc2fa3a6e -//.word 0xe38510c9 -//.word 0x86c60fca -//.word 0xc67ebe71 -//.word 0xf4c7a6b3 -//.word 0x82605671 -//.word 0x1f46aaa7 -//.word 0x24844de6 -//.word 0x2f4b7d04 -//.word 0x0d450e12 -//.word 0xde27b28e -//.word 0x738677da -//.word 0xfbeb91ed -//.word 0xdf295a49 -//.word 0xeaee972c -//.word 0xad99fd0b -//.word 0x224bf43c -//.word 0x8f419af3 -//.word 0xad610b6f -//.word 0x0a12e075 -//.word 0xac51f5fe -//.word 0xf702702d -//.word 0xd183fe83 -//.word 0x03876056 -//.word 0xe222277f -//.word 0x3020bb54 -//.word 0x3d9ba2d6 -//.word 0x51cdff2b -//.word 0x4e22594e -//.word 0x92919e05 -//.word 0x1b2d6813 -//.word 0xeef77eaf -//.word 0xb9f79e36 -//.word 0xb78b7a1d -//.word 0xd4fe0029 -//.word 0x125cdee2 -//.word 0x2b854645 -//.word 0x7881eeb9 -//.word 0x11135c44 -//.word 0x369160ff -//.word 0xedf2e2c7 -//.word 0xed29dd36 -//.word 0xbbb2acd1 -//.word 0x136a8583 -//.word 0x89a3434b -//.word 0x70786831 -//.word 0xfb5e627e -//.word 0xa2fc0d2c -//.word 0xc73d7a9c -//.word 0x9aa3ef87 -//.word 0x3ade2e37 -//.word 0x1d9dfaf7 -//.word 0xb1a4d8c8 -//.word 0x431e1355 -//.word 0x21350229 -//.word 0xfbe18d20 -//.word 0x8ffdee1b -//.word 0x86a0b5f8 -//.word 0x98aa0fc2 -//.word 0xf79d4724 -//.word 0xebaf8d24 -//.word 0xb91df70e -//.word 0xcac1c5ad -//.word 0x09e7e9c1 -//.word 0x8d5dc7ae -//.word 0x78c93972 -//.word 0x1f3fd6d9 -//.word 0x6b1374f4 -//.word 0x7fecebc7 -//.word 0x9a1a1c42 -//.word 0x3f2a3273 -//.word 0x94b728f9 -//.word 0x09838cbc -//.word 0x39c682db -//.word 0x15c50be6 -//.word 0x3fa7874e -//.word 0xb4847919 -//.word 0xaec08bda -//.word 0xc997d2e1 -//.word 0x64f852af -//.word 0x4a97c5ad -//.word 0x923e981d -//.word 0xc3633750 -//.word 0x3c008a19 -//.word 0xd39fbf83 -//.word 0xbdb44bbf -//.word 0xae302b60 -//.word 0x405370cb -//.word 0x99c2fae8 -//.word 0x48d9841e -//.word 0x7142e17f -//.word 0x2ac7843f -//.word 0x2464466b -//.word 0x8ea164d7 -//.word 0x361fc759 -//.word 0xf2708934 -//.word 0x3e2bb4d7 -//.word 0x26404dc8 -//.word 0x678a91db -//.word 0xd1a37ea7 -//.word 0xeffc953a -//.word 0xea2ddf0c -//.word 0xab892e32 -//.word 0x40f6a5d4 -//.word 0x81fc7ae1 -//.word 0xf31bfb01 -//.word 0xec62cfcc -//.word 0xf83d7f39 -//.word 0x7c8f3559 -//.word 0x9900c345 -//.word 0x5399e655 -//.word 0xf38ecc92 -//.word 0xa95ad56e -//.word 0x761197b3 -//.word 0x49f224ba -//.word 0x693c8fdd -//.word 0x1244ac2e -//.word 0x63c3186a -//.word 0x78747928 -//.word 0xd3df0756 -//.word 0x006f4ce6 -//.word 0x78cb27c5 -//.word 0xc763170d -//.word 0xea49b67b -//.word 0xfb438423 -//.word 0x101ee662 -//.word 0x60456f15 -//.word 0xa7925d08 -//.word 0xcc6367b2 -//.word 0xc1f1b61f -//.word 0xacdd312d -//.word 0x440cfdfb -//.word 0x7db5449f -//.word 0x67b83617 -//.word 0x53324e82 -//.word 0x394ed791 -//.word 0x565eae38 -//.word 0x192a49a9 -//.word 0x4087f882 -//.word 0x3f2c6b45 -//.word 0xe1c2750a -//.word 0x313a0f70 -//.word 0x9b63a0d9 -//.word 0x4fbc7cd7 -//.word 0xe687aae1 -//.word 0x481eea4b -//.word 0xcd8af675 -//.word 0xa2520942 -//.word 0x6f919ecb -//.word 0x364b7a55 -//.word 0x7f01ec81 -//.word 0xb28354c3 -//.word 0xc406e215 -//.word 0x1576a0ed -//.word 0x990eb36c -//.word 0x3725ded8 -//.word 0x6e4b474c -//.word 0x3e947eae -//.word 0x4634bbe2 -//.word 0x2a4c673d -//.word 0x3704de3d -//.word 0x4ada7477 -//.word 0xed3ab6d0 -//.word 0xc44ef2f0 -//.word 0x2817f9f4 -//.word 0x11bd2363 -//.word 0x39239464 -//.word 0x7ebfbe2e -//.word 0x88a927bf -//.word 0xadf16cd1 -//.word 0x1136870a -//.word 0x12744d73 -//.word 0xe31e3a2b -//.word 0x766d715d -//.word 0xa0f7ff6f -//.word 0x7883607c -//.word 0x001c4405 -//.word 0x076493e3 -//.word 0x4d2bae80 -//.word 0xe940f847 -//.word 0xe8879559 -//.word 0x374c7182 -//.word 0xc3d7846b -//.word 0xde415511 -//.word 0xe586bd75 -//.word 0x1fdaee96 -//.word 0xe941b39c -//.word 0x105afa56 -//.word 0x7f7b8fe6 -//.word 0x1a032abb -//.word 0xe9ecacc0 -//.word 0x79a0a6d3 -//.word 0x7f0e1b79 -//.word 0xbffc87d0 -//.word 0x2c9f1fc5 -//.word 0x51695b86 -//.word 0xef22b23b -//.word 0xe83aa4f1 -//.word 0x5b5efed6 -//.word 0x11495aac -//.word 0x18dde578 -//.word 0xad72657a -//.word 0x606e7a62 -//.word 0x721523c1 -//.word 0x82a385be -//.word 0x6898e80a -//.word 0x62540316 -//.word 0x6ee37983 -//.word 0xf61aa3da -//.word 0xb2e3907d -//.word 0xcbd54add -//.word 0x3c085bee -//.word 0x7e2790d8 -//.word 0x64c6fdf0 -//.word 0x44f641e6 -//.word 0x57170c3f -//.word 0x62eede06 -//.word 0x96f811bf -//.word 0xb5fd199d -//.word 0x77e70bf5 -//.word 0x2cd55cf1 -//.word 0xa26ceb89 -//.word 0x496d42af -//.word 0x958d19ca -//.word 0xa4811c66 -//.word 0x2158ef2a -//.word 0x680d6e0a -//.word 0xeb5d39be -//.word 0xd4d67072 -//.word 0xec31bbbf -//.word 0xbbe18eda -//.word 0xf1ecab0b -//.word 0x04fae861 -//.word 0x1bab32a5 -//.word 0x2b2ed28c -//.word 0x5f10ef30 -//.word 0xbe5154c1 -//.word 0x08bd7478 -//.word 0xe079abcd -//.word 0x30ddc7ea -//.word 0xca81c75f -//.word 0x4b9be317 -//.word 0x4588cc8b -//.word 0x9da83435 -//.word 0x316f9148 -//.word 0xbeb91e9e -//.word 0x025e23f2 -//.word 0x1d07774f -//.word 0x3d4043c8 -//.word 0x7ace086a -//.word 0xff42e46f -//.word 0x6bce11b4 -//.word 0x7758ae6e -//.word 0xd8cdc218 -//.word 0x67b87eb0 -//.word 0x7f13c222 -//.word 0xa65ce305 -//.word 0x70ecac85 -//.word 0xa185a2a0 -//.word 0x922a8c96 -//.word 0xd633339a -//.word 0x1ca067ce -//.word 0x57ae426e -//.word 0x1da8b14b -//.word 0x4d002f7c -//.word 0xf59ed450 -//.word 0x73788f87 -//.word 0xda63b0c1 -//.word 0x9728a936 -//.word 0x54db15a8 -//.word 0x1c68f996 -//.word 0xc06f4ab3 -//.word 0x7a52b096 -//.word 0xd18c8ab3 -//.word 0xbc44328a -//.word 0x0a21821e -//.word 0x016197a9 -//.word 0x4625d48e -//.word 0xfd0f2a8f -//.word 0x300f9740 -//.word 0x757aedbb -//.word 0xcb5dd596 -//.word 0xc6101312 -//.word 0xec0e0c95 -//.word 0x5e03855b -//.word 0xbb27ad68 -//.word 0x41cb5ec1 -//.word 0x3531a0db -//.word 0x85a16f54 -//.word 0xadb9bee1 -//.word 0xd705bb88 -//.word 0x46d0550f -//.word 0xf439fbb4 -//.word 0x7a89a71e -//.word 0x31c31c94 -//.word 0x977d6c6d -//.word 0xf4efbcc7 -//.word 0x3d4a4b7c -//.word 0x384bb152 -//.word 0xe10f6572 -//.word 0x0d29821c -//.word 0x4df2cb98 -//.word 0x1520ec70 -//.word 0x1d9a03dc -//.word 0x088b5e7e -//.word 0x44b5864f -//.word 0x31097dda -//.word 0x857445a8 -//.word 0xeffba1fb -//.word 0xfa0a20bf -//.word 0x350956bd -//.word 0x91316d12 -//.word 0x0a9edddf -//.word 0x89a57743 -//.word 0x0967a886 -//.word 0xf9a6fc97 -//.word 0xe2d8e1b9 -//.word 0x4a7aae79 -//.word 0xd8a7e3e3 -//.word 0xb9e9b2f5 -//.word 0x414fbf54 -//.word 0xd6c0253e -//.word 0x0a8eb9c0 -//.word 0x074e9229 -//.word 0x30e8c9be -//.word 0x05ea7daf -//.word 0x47221a4a -//.word 0x5d6bdb6f -//.word 0xf7c78e44 -//.word 0xf1ae9829 -//.word 0x7aa638ef -//.word 0x75141044 -//.word 0x1f52e172 -//.word 0xf301964a -//.word 0xcba1845a -//.word 0x475ff067 -//.word 0x722dd117 -//.word 0xa318d8ed -//.word 0xa2d6ae7a -//.word 0x0c9f7dd2 -//.word 0xf93fb13e -//.word 0xdb680030 -//.word 0xaa4ca77c -//.word 0x3e6bf7c4 -//.word 0xfcaa1134 -//.word 0xb4a6ee70 -//.word 0xca47a2cb -//.word 0x9498e1ba -//.word 0x04d6c288 -//.word 0x87c7c34b -//.word 0x2c4c0d16 -//.word 0x093afa70 -//.word 0xdb66d505 -//.word 0xecffe19c -//.word 0x3a219c49 -//.word 0xd5a644e4 -//.word 0x89409bb9 -//.word 0xbdc5e881 -//.word 0x9bc93e92 -//.word 0x71720052 -//.word 0x5788a5f1 -//.word 0x13ccb958 -//.word 0x398b245c -//.word 0x9772af38 -//.word 0xcfa4c43a -//.word 0x460a75bc -//.word 0x3deac156 -//.word 0x3ebc1252 -//.word 0xba390960 -//.word 0xf0b47e8b -//.word 0x10adc36c -//.word 0xa1a4299e -//.word 0x202bc672 -//.word 0xea3f75e3 -//.word 0x5cd81dcc -//.word 0x38bf3758 -//.word 0x4aa08aba -//.word 0x4c60391f -//.word 0x08b000e1 -//.word 0xbce3bbfe -//.word 0xc2fc28c8 -//.word 0x700cedde -//.word 0x3ebbdd5a -//.word 0x2624774c -//.word 0x51e6af68 -//.word 0xef77f2fb -//.word 0x67bc6424 -//.word 0xb0d76c40 -//.word 0xfe4172a6 -//.word 0xa218e795 -//.word 0x2bba866a -//.word 0xd292da16 -//.word 0x153201d0 -//.word 0xa1a2af07 -//.word 0x75f8769b -//.word 0x4529444c -//.word 0x1c1f2d73 -//.word 0x460c6af0 -//.word 0x6dfda263 -//.word 0x02b2699f -//.word 0xdfad075b -//.word 0x2a897a2b -//.word 0x7c8dbeaf -//.word 0x42814b0a -//.word 0x64c0e096 -//.word 0x258f7fd7 -//.word 0x4badb8ad -//.word 0x7f2c2bcd -//.word 0xf67e4971 -//.word 0x51d35a4f -//.word 0xc2a3c4c8 -//.word 0x71868a63 -//.word 0x1e4c1379 -//.word 0x074a2d32 -//.word 0x0cf251b0 -//.word 0x11a72989 -//.word 0xa4cf4f7b -//.word 0xdf29585b -//.word 0x9060114f -//.word 0x98e1083d -//.word 0x91ea4e83 -//.word 0xb4e47ce9 -//.word 0xf9f3f4d3 -//.word 0x7fcb69bc -//.word 0x2fc5a2df -//.word 0x9d327a37 -//.word 0x2eef2caa -//.word 0x803acd82 -//.word 0x06c31a1c -//.word 0xf30674e4 -//.word 0x5ad92981 -//.word 0x9341f54c -//.word 0xe08ac907 -//.word 0x5097cacc -//.word 0xe4769d43 -//.word 0xf137e218 -//.word 0xc5fffeac -//.word 0x8d581e0b -//.word 0x77cb791f -//.word 0x13b1d523 -//.word 0xff464c59 -//.word 0xc3ff5000 -//.word 0xfa1eed81 -//.word 0xb3834ee9 -//.word 0x16c5839b -//.word 0x4b818147 -//.word 0x97f26a16 -//.word 0xc8c20f27 -//.word 0xd420b43f -//.word 0xbd1313bc -//.word 0xb70ea3cb -//.word 0x8dc419db -//.word 0x413d2f52 -//.word 0xf32aa57e -//.word 0x037686ce -//.word 0x7a1dad42 -//.word 0xa6418720 -//.word 0x057b1be9 -//.word 0x656f478b -//.word 0x48a34cd8 -//.word 0x8d918d37 -//.word 0x4dfa9399 -//.word 0x047e55af -//.word 0xf16ab65b -//.word 0xbfd15064 -//.word 0x64de706d -//.word 0x4a686128 -//.word 0xacc7eec7 -//.word 0x44e622b3 -//.word 0x239a5281 -//.word 0xe0325e22 -//.word 0xf4503359 -//.word 0x65f79472 -//.word 0xa2e41b32 -//.word 0xae227a0a -//.word 0x81d9078f -//.word 0xac67782f -//.word 0x3bb1ea1c -//.word 0xdfbb298d -//.word 0x4d772b26 -//.word 0xe1dbddb4 -//.word 0x8736231e -//.word 0xdbc41999 -//.word 0x8f80a01a -//.word 0x0d391611 -//.word 0x5ee86454 -//.word 0x4b413e59 -//.word 0xc288a6a9 -//.word 0x7ba6b291 -//.word 0xda7c901b -//.word 0x1877c73d -//.word 0x9e65bf4f -//.word 0xb18784c2 -//.word 0x54e7c710 -//.word 0x6aeb26ef -//.word 0x1c2badca -//.word 0x7a809c71 -//.word 0x655d6a10 -//.word 0xac630b5e -//.word 0x752f6f16 -//.word 0xdf774bab -//.word 0xe5551b38 -//.word 0x86e268b5 -//.word 0x22074671 -//.word 0x289022bc -//.word 0xee82bae4 -//.word 0xe0af6d64 -//.word 0xdd87b557 -//.word 0xde31f233 -//.word 0xd9db69b3 -//.word 0xe54e8c15 -//.word 0x9ec57c86 -//.word 0xcbffccdb -//.word 0x3e938881 -//.word 0xfc8475b7 -//.word 0x9e159bfa -//.word 0xf7de01c1 -//.word 0xf720b86b -//.word 0xcf561a76 -//.word 0x560c54f1 -//.word 0xacf42234 -//.word 0x1d37dace -//.word 0x4809acbf -//.word 0x808028e8 -//.word 0x72a600bf -//.word 0x08cd1047 -//.word 0x8e229b40 -//.word 0x1485d89a -//.word 0x1398ad30 -//.word 0x5316bab3 -//.word 0x0b6799e4 -//.word 0x4b716407 -//.word 0x97b07894 -//.word 0xd489792f -//.word 0x69db97da -//.word 0x9ed80f6a -//.word 0x4713f437 -//.word 0xa7d92f18 -//.word 0x8fc5c58f -//.word 0xc68f5840 -//.word 0xad25f1a8 -//.word 0x23fdfc0b -//.word 0xa7a994ae -//.word 0xbcac0147 -//.word 0x928c7fb2 -//.word 0xe22841e5 -//.word 0x1a4cb626 -//.word 0xba830b7c -//.word 0xfe2cf163 -//.word 0xbdd0a0c3 -//.word 0x91b31c23 -//.word 0x38a9b71a -//.word 0x3a2bd707 -//.word 0xccaaf902 -//.word 0xf523f613 -//.word 0xeff485a1 -//.word 0xd0ee022d -//.word 0x6aab6e40 -//.word 0x6f22b6a1 -//.word 0xd97838cc -//.word 0x881a83a0 -//.word 0x2d085e58 -//.word 0x68740dbc -//.word 0x2d8bcf98 -//.word 0x6c93ab6e -//.word 0xf1366c68 -//.word 0x891deb90 -//.word 0x66c18c43 -//.word 0xc47e0be3 -//.word 0xcdea79cd -//.word 0xba64818b -//.word 0x3cf0f04a -//.word 0x1a42758e -//.word 0x1b18a424 -//.word 0x26cd4159 -//.word 0xa82bbc69 -//.word 0x3682f83a -//.word 0x74f6504a -//.word 0x351ddce6 -//.word 0xe3caf09e -//.word 0x2223e6f5 -//.word 0xb0fa1e5d -//.word 0x8f5a4262 -//.word 0x675fcf25 -//.word 0x264bd10c -//.word 0xe9d7eeb8 -//.word 0x1fc7a537 -//.word 0xebc1d87b -//.word 0xcb5f880b -//.word 0x7883e1f9 -//.word 0x0deb7614 -//.word 0x6a05cd5e -//.word 0xdb041ec1 -//.word 0xf53358fd -//.word 0xc18965e5 -//.word 0x1d7eafcb -//.word 0x5e1ee339 -//.word 0x3a5cf5e2 -//.word 0xe6a864d7 -//.word 0x7bc4bffe -//.word 0x9ed368c1 -//.word 0x60b39803 -//.word 0x638ca358 -//.word 0x3fa97d75 -//.word 0x23877de5 -//.word 0xc02c62fe -//.word 0x62ba9414 -//.word 0x6044acec -//.word 0xb7e03573 -//.word 0xf2feb4b0 -//.word 0x4df8e7f8 -//.word 0x19ea4b61 -//.word 0x62c3e079 -//.word 0xd09c3037 -//.word 0xcb498e31 -//.word 0xe22e9c10 -//.word 0x6e541041 -//.word 0x72bdb7ee -//.word 0xc6f4ba2d -//.word 0x75e72077 -//.word 0x63f9945b -//.word 0x33546873 -//.word 0x677cdb98 -//.word 0xc92a9752 -//.word 0x0a577e92 -//.word 0xaa97a6a4 -//.word 0x17a8a25f -//.word 0x194b049f -//.word 0x6d521ff5 -//.word 0xb1fb129c -//.word 0x807c02af -//.word 0xdddfa69a -//.word 0xd51009cf -//.word 0x60358bba -//.word 0x893d29f6 -//.word 0xcebcffc1 -//.word 0xcaf60bad -//.word 0x11393499 -//.word 0x5c718be0 -//.word 0xe6f6d0d0 -//.word 0x15a8385e -//.word 0x5d3e6d17 -//.word 0x62dbd75a -//.word 0x5ce21ac5 -//.word 0xc00ce0ed -//.word 0x1db8d852 -//.word 0x4382ff92 -//.word 0xab161edc -//.word 0x134793a8 -//.word 0x695b55a5 -//.word 0xeaa933f3 -//.word 0x8b675c93 -//.word 0x98bd241c -//.word 0x9b1d05af -//.word 0x7fd7e42c -//.word 0xf5e896a6 -//.word 0x1713a315 -//.word 0x4b344a4b -//.word 0x6bd0c52a -//.word 0x23f0ce13 -//.word 0x9a3061a1 -//.word 0x5413c498 -//.word 0x5799c518 -//.word 0x8c144317 -//.word 0x6937ef0e -//.word 0xcd7054f1 -//.word 0x2b781565 -//.word 0xeb28762e -//.word 0x0d8e1ee6 -//.word 0x10401cf5 -//.word 0x12f027bd -//.word 0x38412a15 -//.word 0x50d900f9 -//.word 0xb5b77b7f -//.word 0x73c7ac0d -//.word 0xacb45eca -//.word 0x3bfee452 -//.word 0x964c15ae -//.word 0xf9039483 -//.word 0xc1175589 -//.word 0x16225c3f -//.word 0xccb3c8de -//.word 0x8be8118b -//.word 0x2e3f8ed0 -//.word 0x6aa93a4d -//.word 0xb0e0b7ab -//.word 0x54fb93d2 -//.word 0xee40cb5c -//.word 0x01398d49 -//.word 0xda0a42f4 -//.word 0xbb01cc45 -//.word 0x396f0c29 -//.word 0xe3b6a83f -//.word 0x24a40bd5 -//.word 0x6bffad12 -//.word 0x88619474 -//.word 0x5a461b7e -//.word 0xa764f2aa -//.word 0x4b3b66a5 -//.word 0x95ece2bb -//.word 0xee4eb690 -//.word 0xbb3f1812 -//.word 0x853868ab -//.word 0x5725b9bb -//.word 0x68738c45 -//.word 0xfa6adee9 -//.word 0x82bd6612 -//.word 0x095f1870 -//.word 0xd299eda9 -//.word 0x3d5ae64b -//.word 0xebce4f06 -//.word 0x23314118 -//.word 0x75e66a08 -//.word 0x9dc31097 -//.word 0xaab054f4 -//.word 0x5f70b42f -//.word 0xd9bed4f0 -//.word 0x729c7e69 -//.word 0xe6e8e789 -//.word 0xb4303472 -//.word 0xc7c73c2e -//.word 0x5618909d -//.word 0x093bb9b2 -//.word 0x5dc6c0df -//.word 0x49e6f4ce -//.word 0x22aee752 -//.word 0xbcaeba9d -//.word 0xd2c89ab3 -//.word 0xa73f8b1f -//.word 0xee1164e4 -//.word 0xe7871bb6 -//.word 0xcc0a436a -//.word 0x6b38d3ac -//.word 0x143729f0 -//.word 0xb5494fab -//.word 0x44a17cc2 -//.word 0x5d76de42 -//.word 0x2d559653 -//.word 0x8ebb0567 -//.word 0x73e346b7 -//.word 0x87ddfbf0 -//.word 0x11e04d29 -//.word 0x1be12e19 -//.word 0xd364e187 -//.word 0x3193bd01 -//.word 0xda8d2ed1 -//.word 0x4500fc2d -//.word 0x1cfad0ae -//.word 0xe5fcf404 -//.word 0xe1515ae7 -//.word 0x349de050 -//.word 0x47b9d2ea -//.word 0x6bbeb0c3 -//.word 0xbf603248 -//.word 0x537e8a70 -//.word 0x8df6e937 -//.word 0xccbe444e -//.word 0x4c315811 -//.word 0x4aa6ecb9 -//.word 0x684756d3 -//.word 0x522140f1 -//.word 0xa277ac9f -//.word 0x015c3698 -//.word 0x8f81993a -//.word 0x864b7538 -//.word 0x1a28508f -//.word 0xa324dabb -//.word 0xfdb7752a -//.word 0x2fe1f4f1 -//.word 0x4c79a3be -//.word 0x97c3880d -//.word 0xea40e99f -//.word 0x59ca0f28 -//.word 0x12e04949 -//.word 0x873e33bd -//.word 0xd0b037d7 -//.word 0x4a29552c -//.word 0x850f208d -//.word 0x5dda0938 -//.word 0x66dde04e -//.word 0x8e639888 -//.word 0xfdfe4b26 -//.word 0x401c7d29 -//.word 0xa7dba5c2 -//.word 0xeb1fea0a -//.word 0x14e12af3 -//.word 0x9aca407f -//.word 0xcb008730 -//.word 0x6c409abf -//.word 0xa32d5e11 -//.word 0x15e74366 -//.word 0x4be0c6d4 -//.word 0x5aeb3bf4 -//.word 0xc396c9db -//.word 0x98bab64b -//.word 0xe050e42b -//.word 0x3d869c35 -//.word 0xcc138bef -//.word 0x4dc70adc -//.word 0x8466a3f3 -//.word 0xdeb6d050 -//.word 0x58d7052a -//.word 0x9dd3f105 -//.word 0x6e760228 -//.word 0x47602752 -//.word 0x4058d9a9 -//.word 0x31e35cf3 -//.word 0x19154208 -//.word 0xc1a83287 -//.word 0x9c4be7c9 -//.word 0xf23c7b13 -//.word 0x3d19e610 -//.word 0xd4f4c27e -//.word 0xc6a55127 -//.word 0x0964c013 -//.word 0xd497adfc -//.word 0x49e8e802 -//.word 0x579b76a0 -//.word 0xdf1edcdf -//.word 0x15e29ac9 -//.word 0x2a6af521 -//.word 0x28a2f951 -//.word 0x1d71bfa4 -//.word 0x7b91ecb5 -//.word 0xbf9f7a28 -//.word 0x516ebb97 -//.word 0xaba19acf -//.word 0xbe79253d -//.word 0x91eb48a3 -//.word 0x2cf6db0f -//.word 0xb433e00e -//.word 0xd7ae051d -//.word 0x6bf47160 -//.word 0x516dbc97 -//.word 0xa0ec3f4d -//.word 0xff858f52 -//.word 0x539f446c -//.word 0x9b49ff4a -//.word 0x17d2abb9 -//.word 0xb093021b -//.word 0x94105314 -//.word 0x21408386 -//.word 0x042853c0 -//.word 0xa2afe0f2 -//.word 0xb7ad70e4 -//.word 0x3c456be8 -//.word 0x8f75a80e -//.word 0xceebea96 -//.word 0x831aabab -//.word 0x878e184e -//.word 0x207c5c90 -//.word 0x6d9e2104 -//.word 0x043d5474 -//.word 0xd99029d3 -//.word 0x62446073 -//.word 0xf85cc678 -//.word 0x813bfe8d -//.word 0x4cff81d5 -//.word 0x3c11e424 -//.word 0x29fa5a70 -//.word 0x83797982 -//.word 0x38d241f1 -//.word 0xd8685a51 -//.word 0xf88e9da8 -//.word 0xd49bd621 -//.word 0x383cc805 -//.word 0xa00f72e6 -//.word 0x9e6d911e -//.word 0x7c876678 -//.word 0x22b4b92c -//.word 0x3b091e11 -//.word 0x942b770e -//.word 0xc461bad1 -//.word 0x12edf5c4 -//.word 0x939d8f3d -//.word 0x939dd0f6 -//.word 0x368fa3bc -//.word 0x5fdd9b6b -//.word 0xd14e3519 -//.word 0x95d85d92 -//.word 0x9bb63305 -//.word 0xa4ba0efc -//.word 0x5ee3c191 -//.word 0xd1321edf -//.word 0xfbbab9b8 -//.word 0xb7f7ef96 -//.word 0xe46026d3 -//.word 0xc23f551c -//.word 0x9fc1c823 -//.word 0xb4491d94 -//.word 0x4a0a934b -//.word 0x21d584c4 -//.word 0x112f2fd2 -//.word 0xf2a7bb94 -//.word 0xba6779a5 -//.word 0xe5086a94 -//.word 0x1aab0194 -//.word 0x0b452974 -//.word 0x9d3a8ad1 -//.word 0x492e088a -//.word 0xc1178d74 -//.word 0xd797094f -//.word 0x9b8ab7f9 -//.word 0xc4dba1e2 -//.word 0x529b66c0 -//.word 0x71543b84 -//.word 0x9f9a308c -//.word 0x11e4b51a -//.word 0x539a5c05 -//.word 0x306fe0ae -//.word 0xd1f16736 -//.word 0x295e04ee -//.word 0x90ba800f -//.word 0xad1e5aac -//.word 0x9a530ce4 -//.word 0x43a0905c -//.word 0x0fdf23ed -//.word 0xc3d64999 -//.word 0xa3c511c4 -//.word 0xda3c9aa0 -//.word 0x1b2fd6ea -//.word 0x894c8ed4 -//.word 0xd48ca642 -//.word 0xa509a338 -//.word 0x3d0f6a93 -//.word 0x59754af8 -//.word 0x582e3d0b -//.word 0x9f1b6be1 -//.word 0x3d23f0b7 -//.word 0xcb86dfe4 -//.word 0x966e870c -//.word 0x01c8f597 -//.word 0x2451ba61 -//.word 0xb9f4eeb3 -//.word 0x39537473 -//.word 0x42a48097 -//.word 0x3cbe57df -//.word 0x3c7356c4 -//.word 0x282136ac -//.word 0x1d848e5f -//.word 0x0dce99be -//.word 0xadfa3ab3 -//.word 0x8e5d3d64 -//.word 0x897ee0ac -//.word 0x612792cb -//.word 0xa4bcfa5c -//.word 0xd2cc3b88 -//.word 0xc1e6777a -//.word 0x40ae9212 -//.word 0xfb2f38de -//.word 0x9f732146 -//.word 0x3e519306 -//.word 0xf48729e2 -//.word 0xcb09d494 -//.word 0xdc981f0a -//.word 0xb795b7ce -//.word 0x05182ac6 -//.word 0x6c3def1d -//.word 0xb3bea781 -//.word 0x27c7a28f -//.word 0x3d05a58b -//.word 0x7801ea55 -//.word 0x8dac6998 -//.word 0xc63a5645 -//.word 0xa434eb40 -//.word 0xc8c96759 -//.word 0x1366577d -//.word 0x0d86142d -//.word 0x83ca8d30 -//.word 0x754c4685 -//.word 0x2f31a19c -//.word 0xb57d5dc6 -//.word 0x642b5ce9 -//.word 0xd77ea978 -//.word 0x0892b9a2 -//.word 0xb736f1ca -//.word 0x10fe6938 -//.word 0x8893f00e -//.word 0x084e507d -//.word 0x4d05d338 -//.word 0x8f250529 -//.word 0x6001bc64 -//.word 0xd86a5659 -//.word 0xef80424d -//.word 0x2ac7c20b -//.word 0x7a7eeed6 -//.word 0x612cfda3 -//.word 0x567bc085 -//.word 0x6b496f69 -//.word 0x2dfda803 -//.word 0xcb17b508 -//.word 0x7b0c0e9e -//.word 0x1a501e11 -//.word 0x12b44ac7 -//.word 0x81f23076 -//.word 0x98862c94 -//.word 0x41c0210f -//.word 0x0418763f -//.word 0x2bc15e19 -//.word 0x24815da5 -//.word 0x28bf08b2 -//.word 0x1ade0cc8 -//.word 0xb2c9715e -//.word 0xdacf204d -//.word 0x58b2a385 -//.word 0xaefa2dfe -//.word 0x3e8fdaf2 -//.word 0xb287374a -//.word 0x9b3d0556 -//.word 0x58a33ac0 -//.word 0x3ad949c3 -//.word 0xe6fea398 -//.word 0xfa467e31 -//.word 0xf34cd52a -//.word 0x4eaab0fd -//.word 0xedc8a575 -//.word 0xbdf19f65 -//.word 0x96acde99 -//.word 0x62493f0d -//.word 0x82babe5d -//.word 0x6da4397d -//.word 0x9ab677aa -//.word 0xa13a68a0 -//.word 0x9de9ae0e -//.word 0xd4045d47 -//.word 0x9aa0ff3a -//.word 0x7242dca4 -//.word 0x77ab7884 -//.word 0xfaf55cd0 -//.word 0x6ddf1966 -//.word 0x7f668b45 -//.word 0x89955bfd -//.word 0x299dc764 -//.word 0x2c28a68b -//.word 0xb2eba6f0 -//.word 0x8c7ad9f5 -//.word 0xe9617091 -//.word 0x3270c646 -//.word 0x3256a053 -//.word 0x7a72b32a -//.word 0x04e56624 -//.word 0x16ecda74 -//.word 0x696d275a -//.word 0x8bcfe999 -//.word 0x820ffc2a -//.word 0xb2108332 -//.word 0x01332f32 -//.word 0x3828be7d -//.word 0xac04c1f0 -//.word 0x1f93a3dd -//.word 0xe1efe748 -//.word 0x3a51b156 -//.word 0x0d288802 -//.word 0xb5685a12 -//.word 0x3325c049 -//.word 0x8b6084df -//.word 0x6b21612e -//.word 0x0ec609ae -//.word 0x609a6d23 -//.word 0x63a93815 -//.word 0xd1d39c81 -//.word 0x032052ce -//.word 0x1153dc02 -//.word 0x3bc20e36 -//.word 0x8764cc48 -//.word 0xac2c15cf -//.word 0x2f954154 -//.word 0xcc7f86bf -//.word 0x1739c10f -//.word 0x63df734e -//.word 0xe3e60ac4 -//.word 0x0ff5636c -//.word 0x49f68ca4 -//.word 0xc16ece28 -//.word 0x9609eb41 -//.word 0x3e7aa43a -//.word 0x27817e14 -//.word 0x9e4dc67b -//.word 0xf105d3f8 -//.word 0xd0a28b67 -//.word 0xf9ff29ac -//.word 0x15333da2 -//.word 0xdc1ef354 -//.word 0x80429970 -//.word 0x49d45cf8 -//.word 0x7c13523b -//.word 0x82d9be04 -//.word 0x46708f11 -//.word 0xdfa629c6 -//.word 0x6f246823 -//.word 0x4bfbe2f4 -//.word 0x5c806d47 -//.word 0xc55ae223 -//.word 0xc5d92077 -//.word 0xdf8a5351 -//.word 0x39087650 -//.word 0x4314165c -//.word 0x98e85994 -//.word 0x29c94088 -//.word 0x98dc29a9 -//.word 0xe23a98fe -//.word 0x41463618 -//.word 0x513f1a47 -//.word 0x7111480e -//.word 0x6c7177d5 -//.word 0x592818de -//.word 0xbfaf937a -//.word 0xfdfdd47d -//.word 0xe99d06ef -//.word 0xb8039e04 -//.word 0x1e209c4e -//.word 0xb5340d32 -//.word 0xa3e4d599 -//.word 0x788cabe7 -//.word 0x55d66531 -//.word 0x538c76ab -//.word 0x22aab55f -//.word 0xf1b86025 -//.word 0x8e5660cf -//.word 0xcf19cea4 -//.word 0x3095b710 -//.word 0xbdbb1c99 -//.word 0x33663d15 -//.word 0x6230181a -//.word 0xd58a2cb7 -//.word 0xb50c8261 -//.word 0xeb09ee30 -//.word 0x8567934c -//.word 0x5bada5a2 -//.word 0xf25e73db -//.word 0xa086a48e -//.word 0xf192c0b4 -//.word 0x4a64f35d -//.word 0xcca70ea2 -//.word 0x7b60cfdb -//.word 0xa0c66212 -//.word 0x6c5427b7 -//.word 0xdd1cb694 -//.word 0xe65e2104 -//.word 0xca597960 -//.word 0xc96193bb -//.word 0xfe320bcf -//.word 0x88848a36 -//.word 0xe8e045de -//.word 0xaab1c6b7 -//.word 0x489eefae -//.word 0x4b173cdf -//.word 0xb32e4806 -//.word 0x99a99337 -//.word 0x135582d0 -//.word 0x589da7ab -//.word 0x245a4398 -//.word 0x5eed090a -//.word 0xf98c2510 -//.word 0x18d97d87 -//.word 0x75b9378f -//.word 0x03637b3b -//.word 0xd2b77a8d -//.word 0x33d2afa1 -//.word 0x1edf6428 -//.word 0xd02f7918 -//.word 0xb88d61a2 -//.word 0x94cb6d65 -//.word 0xd8a14de1 -//.word 0x4fb8d42e -//.word 0x0401fbed -//.word 0x634b2980 -//.word 0x9c15b176 -//.word 0x48a09c49 -//.word 0x4f49aa4c -//.word 0x091693df -//.word 0xa38f92e5 -//.word 0xc5cf2478 -//.word 0x71da0edb -//.word 0x2f319daf -//.word 0x67a4316a -//.word 0x0e68fd06 -//.word 0x846908f6 -//.word 0xbde1775e -//.word 0xa02a0f83 -//.word 0xacd1f681 -//.word 0xe1ebb93c -//.word 0xdeac9398 -//.word 0x4735eded -//.word 0x69ae21b5 -//.word 0x21958388 -//.word 0xf955a24b -//.word 0x951bcba4 -//.word 0x4ee5cfb0 -//.word 0x1cdc06f9 -//.word 0xb9e394a2 -//.word 0x0370ebe5 -//.word 0xa39a92c0 -//.word 0xec7424ea -//.word 0x059a9b0c -//.word 0x4b09ce2e -//.word 0xf134396f -//.word 0xe954fdfa -//.word 0x08ff2735 -//.word 0x65fc353c -//.word 0x0256d78d -//.word 0xaeaff205 -//.word 0x29d7ea0b -//.word 0x8a9d210b -//.word 0xdee5bb26 -//.word 0x12fba527 -//.word 0x1327d5b9 -//.word 0x3382d3d8 -//.word 0xcf077886 -//.word 0x2eedf5bf -//.word 0xad3518ae -//.word 0x197fcb21 -//.word 0x5d21de3b -//.word 0x5d7a0668 -//.word 0x21842596 -//.word 0x36a9cba3 -//.word 0x51d8fd11 -//.word 0x36d73601 -//.word 0xd8dbac5f -//.word 0xc256d45a -//.word 0xb5102817 -//.word 0x937928a6 -//.word 0x7b3e9f35 -//.word 0x361a2783 -//.word 0xd2efef98 -//.word 0x8c15bcb4 -//.word 0xf4f12e85 -//.word 0x4bca459c -//.word 0x30d92322 -//.word 0x7c9f14c7 -//.word 0x6a7ccbfc -//.word 0xfb7cef62 -//.word 0x9874d682 -//.word 0xf94e90be -//.word 0x47a12787 -//.word 0x7d8525d1 -//.word 0x14a557c4 -//.word 0xdf95d1b5 -//.word 0x34663254 -//.word 0x4c782927 -//.word 0xec903837 -//.word 0x452ab809 -//.word 0x1a111ecf -//.word 0x202c7ce0 -//.word 0xaa9b4b66 -//.word 0x85036756 -//.word 0x21255ba6 -//.word 0xf2b6dfba -//.word 0x166a9f1f -//.word 0x38533e7b -//.word 0xb4699bc4 -//.word 0xfc6a53b1 -//.word 0x3ae4876e -//.word 0x378fdf94 -//.word 0x7be1ce58 -//.word 0xb6dd1803 -//.word 0x5e2c92a2 -//.word 0x9a6e29fe -//.word 0x5fd226ce -//.word 0xd8e4b12c -//.word 0x0ca79346 -//.word 0xbbe44056 -//.word 0x88c114d4 -//.word 0x5e95dde9 -//.word 0x0cfb9a28 -//.word 0x32268279 -//.word 0x61744855 -//.word 0x7e459e39 -//.word 0x670df854 -//.word 0xd9a89283 -//.word 0x92eeb480 -//.word 0xb2883557 -//.word 0x67023e19 -//.word 0xc92050d3 -//.word 0x037688c1 -//.word 0xb43322c0 -//.word 0x953e3d02 -//.word 0x5b84dd05 -//.word 0xdf9036c6 -//.word 0x7c5c2832 -//.word 0xb86606dd -//.word 0x27079bf6 -//.word 0x8d006f7b -//.word 0x435646a9 -//.word 0xdc61eab7 -//.word 0x071f2ac3 -//.word 0xb7ce230d -//.word 0x82b9be63 -//.word 0x47527adc -//.word 0x14816cc9 -//.word 0x473c84e9 -//.word 0xf35811dc -//.word 0x859e87da -//.word 0xa72280a5 -//.word 0x64d002bc -//.word 0x8d4800d2 -//.word 0x5cec237e -//.word 0x5836ca34 -//.word 0x78504f74 -//.word 0x8bde8c41 -//.word 0xd71e9dd5 -//.word 0x0134e893 -//.word 0x2dbf5b3d -//.word 0x65b0f567 -//.word 0x3f5c882c -//.word 0xbad0bd1f -//.word 0x6a645884 -//.word 0xd593bdc1 -//.word 0x1c09b30f -//.word 0xdefe6975 -//.word 0x59c3b7f7 -//.word 0xd29aa50b -//.word 0x37cb314c -//.word 0x04f44d72 -//.word 0x63a12882 -//.word 0x971cae42 -//.word 0x9a8752f0 -//.word 0x05270b33 -//.word 0x31039c52 -//.word 0x9cae19a4 -//.word 0x8e61a748 -//.word 0xfc4c8315 -//.word 0xac2e46d4 -//.word 0x9a2467ad -//.word 0x9bbe01e0 -//.word 0x4058d6b6 -//.word 0xfda895b6 -//.word 0x8a93581b -//.word 0x8a457186 -//.word 0x6b8066f1 -//.word 0x8d343ae4 -//.word 0xa651eeeb -//.word 0x65d94847 -//.word 0x5539d3e4 -//.word 0x05d9278b -//.word 0x66f26a59 -//.word 0x74a01770 -//.word 0x1838feec -//.word 0x4ddb8d19 -//.word 0x834b4de3 -//.word 0x40feaf8d -//.word 0x0d7109a6 -//.word 0x90bfdc39 -//.word 0xf6725845 -//.word 0x9499226c -//.word 0xcd1b54ef -//.word 0x364ac6da -//.word 0xf8bb8c7c -//.word 0x7656bf1a -//.word 0x30a981e5 -//.word 0xe7813b28 -//.word 0x03bc29c6 -//.word 0x315919e4 -//.word 0x50d16fe3 -//.word 0x8eaa6d91 -//.word 0xce49b1a0 -//.word 0x4e08ff57 -//.word 0x86884187 -//.word 0x5349ccc1 -//.word 0x5477e5c6 -//.word 0x9407843f -//.word 0x6a0358ae -//.word 0x9e220aa5 -//.word 0xcd9cc636 -//.word 0x0f3cf8aa -//.word 0xd6b75375 -//.word 0x1a3c186a -//.word 0xb34c952c -//.word 0x06ccece5 -//.word 0xe359153a -//.word 0xaedb267e -//.word 0xbd5dd225 -//.word 0x021c307c -//.word 0xeaddbe98 -//.word 0x8484a68c -//.word 0xe6e340e0 -//.word 0xcdd0d73e -//.word 0x837ab06d -//.word 0x06fd4884 -//.word 0x6633de57 -//.word 0x6fcd3136 -//.word 0x88a38bd7 -//.word 0xdb49fe90 -//.word 0xb6e3eec9 -//.word 0x313ad0b2 -//.word 0x120f3031 -//.word 0xedaff91f -//.word 0x90c7f1b3 -//.word 0x9e7a833e -//.word 0x79b1c119 -//.word 0x65b2a9dc -//.word 0xebf5a7d1 -//.word 0x7c325ca9 -//.word 0x57bf9e6d -//.word 0xad19c0b7 -//.word 0x02c11321 -//.word 0xd649acfe -//.word 0x85ae6848 -//.word 0x6ce82eda -//.word 0x4dc074df -//.word 0xf4e2058b -//.word 0x1b330109 -//.word 0x8c6425b4 -//.word 0x85c84c89 -//.word 0x606236dc -//.word 0x7343894b -//.word 0x361315f1 -//.word 0xa3ed5cdc -//.word 0xe37052c0 -//.word 0x261261ec -//.word 0xd3b8b07e -//.word 0xe184a5d3 -//.word 0x84eea942 -//.word 0x0d172b0a -//.word 0x0b59e788 -//.word 0xb72368ae -//.word 0x8f04cbb0 -//.word 0x4005c700 -//.word 0xc93cea7d -//.word 0xde9e25e8 -//.word 0x8a158b97 -//.word 0x19d3566d -//.word 0x35e52b09 -//.word 0x4f0b9f3e -//.word 0x41c7f9c3 -//.word 0x31b4392c -//.word 0xb8195a19 -//.word 0x43bed5ae -//.word 0xbafe6643 -//.word 0x601e125c -//.word 0xfbdd69db -//.word 0x344c0974 -//.word 0x40e06362 -//.word 0xc0c6c258 -//.word 0xe67689bb -//.word 0xda8bbb0e -//.word 0x5cd2c1ae -//.word 0xaaa168bf -//.word 0xa46a2a66 -//.word 0x2e8fae38 -//.word 0xd67892f3 -//.word 0xb7e4676c -//.word 0x9c7cfdc9 -//.word 0x69aee1f0 -//.word 0xb7b82540 -//.word 0xbf035f7e -//.word 0x79b3f412 -//.word 0x057c9773 -//.word 0x49b70ce0 -//.word 0xdcb53251 -//.word 0x225340ad -//.word 0xb9ce4f3d -//.word 0x14d91961 -//.word 0x66ed0081 -//.word 0xc2e15247 -//.word 0x80bacb0b -//.word 0xe2c45b8f -//.word 0xf8e22aed -//.word 0xc022dacd -//.word 0x92940cdb -//.word 0xbb5d2579 -//.word 0x690752b0 -//.word 0xc71bc96d -//.word 0x68f252ea -//.word 0xe9c8066a -//.word 0xd2125729 -//.word 0xbe115193 -//.word 0xbca820b4 -//.word 0xf46bd1f0 -//.word 0x8ef85df4 -//.word 0xcf8ae3ec -//.word 0x85cb35f6 -//.word 0xa6ea96d7 -//.word 0x34eec2ee -//.word 0x634a2f66 -//.word 0xfeb193af -//.word 0x072ba62e -//.word 0x9e692933 -//.word 0x2355272c -//.word 0x9fee7b19 -//.word 0x60539240 -//.word 0xe41d7222 -//.word 0xf9f2fbad -//.word 0x21586db3 -//.word 0x3bc62b9b -//.word 0x6001bf57 -//.word 0x0ca61d96 -//.word 0x7e022c3a -//.word 0x612a820c -//.word 0xab486fae -//.word 0xc6343ed2 -//.word 0xee44b7aa -//.word 0xda64e99f -//.word 0x9e692646 -//.word 0xd0a24e90 -//.word 0xe9b05141 -//.word 0xef98efa3 -//.word 0x5117c27b -//.word 0x13367f3c -//.word 0x2a1d797b -//.word 0x2a2c66a3 -//.word 0x1e4866ea -//.word 0xb7734183 -//.word 0xaaa0f015 -//.word 0x53c5606d -//.word 0x9e317270 -//.word 0x27204653 -//.word 0xa08db90e -//.word 0x74472c0d -//.word 0xa9478829 -//.word 0x0b417ed8 -//.word 0x877914a0 -//.word 0xd5d85dd2 -//.word 0x5a3f8774 -//.word 0x4c1b1c7f -//.word 0x173a814b -//.word 0xffddc347 -//.word 0x070e92ed -//.word 0x12338ef5 -//.word 0x49e4c2c9 -//.word 0xbcfa6e3a -//.word 0x4ce80a71 -//.word 0xc84f8728 -//.word 0x56ccd81a -//.word 0x1515b1b7 -//.word 0x00448f1d -//.word 0x1672f844 -//.word 0xb8880478 -//.word 0x52521c0d -//.word 0x3dd5024e -//.word 0xe4e311b6 -//.word 0x26ecc763 -//.word 0xfc1780c7 -//.word 0x5c9184a1 -//.word 0x5d25442b -//.word 0x9b0ee195 -//.word 0xdd09eeb3 -//.word 0xf5ae77f3 -//.word 0xe8ff4291 -//.word 0x4f42540e -//.word 0xfd0cb7de -//.word 0xe29f7b61 -//.word 0x2f75fb14 -//.word 0xbb1d6209 -//.word 0xa6466d94 -//.word 0x3c1a7248 -//.word 0x1ccda121 -//.word 0x99758a03 -//.word 0x601cdf63 -//.word 0x5b137b44 -//.word 0xd68aa466 -//.word 0xe15e8dba -//.word 0xf5321f18 -//.word 0xdac1f934 -//.word 0xc772b6cf -//.word 0xcc2e6e2a -//.word 0x6d6e7fc0 -//.word 0x90988d34 -//.word 0x998bc789 -//.word 0xd3786c91 -//.word 0x12f58ea8 -//.word 0x964c17a2 -//.word 0x33190901 -//.word 0xaf140a6b -//.word 0x6c2b1f5c -//.word 0x46d4b819 -//.word 0xbfa1ede5 -//.word 0x5a140776 -//.word 0x44b642aa -//.word 0x3963d177 -//.word 0xa6e82320 -//.word 0x0bd065af -//.word 0xa47a489f -//.word 0x486f04d9 -//.word 0x91f39de2 -//.word 0x3dda6452 -//.word 0xd49dc288 -//.word 0x8bad319c -//.word 0x69078b95 -//.word 0xa80987dc -//.word 0x5e8480f1 -//.word 0x5d12795d -//.word 0x57aa5fe8 -//.word 0x46718d0b -//.word 0x0ad396a8 -//.word 0x54d33ef9 -//.word 0xc49fc9c7 -//.word 0x4e6879dc -//.word 0xe27052ba -//.word 0x4c65208d -//.word 0x59edbb5f -//.word 0x3b828a8b -//.word 0x2e804674 -//.word 0x5c7c0076 -//.word 0xfed8661d -//.word 0xc5944295 -//.word 0x78674362 -//.word 0xde0f0051 -//.word 0xdee53aaf -//.word 0xe5b461b8 -//.word 0x88cb5a52 -//.word 0x6b5180fc -//.word 0x61d9e901 -//.word 0xd436eaf1 -//.word 0x6891dd51 -//.word 0xdbb92192 -//.word 0x30b96340 -//.word 0x0cb01c7c -//.word 0x60dd5bac -//.word 0x48fac571 -//.word 0x33cbdada -//.word 0x45f67ad7 -//.word 0xf915a7f0 -//.word 0x0b0a8c36 -//.word 0x9592be7a -//.word 0x781ec3be -//.word 0xfdded1e9 -//.word 0xbc1ed7bf -//.word 0xbdd5c20f -//.word 0xde7bf92e -//.word 0x741c29a5 -//.word 0x35ab4827 -//.word 0x5698d4c6 -//.word 0xf0a45c66 -//.word 0xa8f54271 -//.word 0x8f65bfcc -//.word 0x4720270a -//.word 0x686e6fe0 -//.word 0x21cdecd9 -//.word 0x23435d4b -//.word 0xbaf22c8a -//.word 0x3dedf15b -//.word 0xa94a38ac -//.word 0x89798482 -//.word 0x19d49432 -//.word 0xaa76e4d4 -//.word 0x485177f5 -//.word 0x9b7bd48c -//.word 0x0bc94f2f -//.word 0x279f8987 -//.word 0x48063a02 -//.word 0x71ff2ec7 -//.word 0x7a188eef -//.word 0x6e3c61f2 -//.word 0x31cf525f -//.word 0x66fbb4d1 -//.word 0x8f44c31e -//.word 0x76632dd1 -//.word 0xcd51d1db -//.word 0x11a2c685 -//.word 0xb4149fa9 -//.word 0x7a68ed22 -//.word 0x24700681 -//.word 0x4c6a0501 -//.word 0x908c12be -//.word 0xf2e0e421 -//.word 0x7f52839f -//.word 0x2f0853a3 -//.word 0x0df14ec8 -//.word 0x97a1914c -//.word 0x685c1ac2 -//.word 0x1470d006 -//.word 0x54c8c376 -//.word 0x63bfb65f -//.word 0xa732dbb6 -//.word 0x94d9dd09 -//.word 0xced723b4 -//.word 0x8d8f5458 -//.word 0x46ba1689 -//.word 0x88b61cc7 -//.word 0x24215fb0 -//.word 0x90a7ab73 -//.word 0x8d185e88 -//.word 0x08be6d9f -//.word 0x3eeda7d6 -//.word 0x24db3e2e -//.word 0x06b28340 -//.word 0x6ee4f12c -//.word 0x47bf6dd3 -//.word 0x4241cc46 -//.word 0x792d967d -//.word 0x535e094d -//.word 0xa75c6194 -//.word 0x242d57b7 -//.word 0xf06ee84e -//.word 0x8fa2571d -//.word 0x07c97547 -//.word 0x413520be -//.word 0xb3990afe -//.word 0x3c63bcfb -//.word 0x4f4bda57 -//.word 0x542ca8d9 -//.word 0x4b13cd1b -//.word 0xb3965782 -//.word 0xaa680073 -//.word 0x552aafc4 -//.word 0x82834271 -//.word 0x8c728b91 -//.word 0x7fe39888 -//.word 0x7d81387d -//.word 0x61ccba0f -//.word 0xa16bf843 -//.word 0x79c395c1 -//.word 0x46c88241 -//.word 0x3013c740 -//.word 0x0b3680f7 -//.word 0x7f4c258d -//.word 0x67d40f8c -//.word 0x78bf3892 -//.word 0x23c74349 -//.word 0xbc03bc98 -//.word 0xdbb8a01b -//.word 0x037320d1 -//.word 0x8154a215 -//.word 0x97ad09d0 -//.word 0xdacc36ec -//.word 0xd914ce0c -//.word 0xff533e7a -//.word 0xbb4ffd60 -//.word 0xdda2113c -//.word 0x44c8d58e -//.word 0xb677f9d3 -//.word 0x0f2ecab7 -//.word 0x9e11b487 -//.word 0xccf405e5 -//.word 0xfeb6f3bf -//.word 0xbdd0e182 -//.word 0x152dde8a -//.word 0x3a3d6fde -//.word 0x72458e1a -//.word 0x2ef9f2ac -//.word 0x7a4c9143 -//.word 0x98876485 -//.word 0xe8986a01 -//.word 0x0cadef64 -//.word 0x48020eef -//.word 0x2ff77528 -//.word 0x7c6668d0 -//.word 0x3e330916 -//.word 0x3825d60a -//.word 0x87f47354 -//.word 0x85a3aa26 -//.word 0xee0fb06f -//.word 0x41c9a952 -//.word 0x69216fd6 -//.word 0x9d838fdf -//.word 0x8507955d -//.word 0x9e438ac3 -//.word 0xdf64babb -//.word 0x9d7dbb17 -//.word 0xac1eaa0b -//.word 0xc729b89a -//.word 0x31e1e54f -//.word 0x9d440c2d -//.word 0x4c9b20e8 -//.word 0x754fb556 -//.word 0xe9fec220 -//.word 0xf7cea5bd -//.word 0x8d0167a1 -//.word 0xa1ca42b1 -//.word 0xcf5f60fb -//.word 0x4450e6a4 -//.word 0xda173121 -//.word 0x84f05faa -//.word 0xedeb12ec -//.word 0x5c3f70ff -//.word 0xdbe16f97 -//.word 0x98554f7e -//.word 0x8bc56842 -//.word 0x5950252b -//.word 0x79a4516f -//.word 0x95cf91a9 -//.word 0x33523288 -//.word 0x947725c4 -//.word 0xdce54857 -//.word 0x7472e8e9 -//.word 0xad38838c -//.word 0xa6ebd2a9 -//.word 0x6f6a063a -//.word 0x6e93533a -//.word 0x025cab5a -//.word 0x671fccf6 -//.word 0xda367c47 -//.word 0xfdc813da -//.word 0x7ce23b41 -//.word 0xf1caf408 -//.word 0x0590dbeb -//.word 0xd8e5ab45 -//.word 0xa43004cc -//.word 0x9ddf6b7c -//.word 0x1bfb93d1 -//.word 0xfa00da39 -//.word 0x41eb17c9 -//.word 0x0394932f -//.word 0x833e55e8 -//.word 0x9b6da3b3 -//.word 0x5ff8c545 -//.word 0xfd5e0c3e -//.word 0xe85d135c -//.word 0x35c145ee -//.word 0x457b9f8c -//.word 0xa4f2b706 -//.word 0x319efe9a -//.word 0x7fd2426a -//.word 0x7cd9772d -//.word 0x5045b624 -//.word 0x8884864f -//.word 0x74b45be2 -//.word 0xcdb85cf3 -//.word 0x9b8c6975 -//.word 0x56d55d69 -//.word 0x4cbd9053 -//.word 0x42fda1eb -//.word 0x5e3b7216 -//.word 0x45977314 -//.word 0x808124fb -//.word 0x24cdd564 -//.word 0xb209b064 -//.word 0x3c0efabe -//.word 0xc9d59656 -//.word 0xfb8ccbe9 -//.word 0xefe947fc -//.word 0x65bf6312 -//.word 0x21cfa822 -//.word 0x91e09248 -//.word 0xaf1295bb -//.word 0x296f5eff -//.word 0xbfc35b5c -//.word 0xedad7d8e -//.word 0xcbf73dbe -//.word 0x3123ddb1 -//.word 0x1e46f040 -//.word 0x5b1a1c08 -//.word 0x5b4e1f62 -//.word 0x66201096 -//.word 0xf72ee74b -//.word 0x62894042 -//.word 0xb90c5c44 -//.word 0xf1ec6959 -//.word 0x418f033b -//.word 0xcba2fa0a -//.word 0x7e665641 -//.word 0x3b4a98e9 -//.word 0x36bf430d -//.word 0xa0489b6d -//.word 0x83d0ad76 -//.word 0xed418f72 -//.word 0x5052e9fd -//.word 0x29a1b4b8 -//.word 0xe0014241 -//.word 0xef157f62 -//.word 0x471e7688 -//.word 0xef111777 -//.word 0xefed373d -//.word 0x6c4bd864 -//.word 0x1436ab6c -//.word 0xbd3ed379 -//.word 0x48c8ec48 -//.word 0xcca84c67 -//.word 0xf1f288a6 -//.word 0x990c3ac9 -//.word 0xc608027f -//.word 0xb831cb98 -//.word 0x55e45072 -//.word 0xcea2deb4 -//.word 0x80625b3f -//.word 0x182c8762 -//.word 0xfbe3824d -//.word 0xe5638fc9 -//.word 0xcfcc1726 -//.word 0x171cf174 -//.word 0xdb04e0f6 -//.word 0xa5f45dd3 -//.word 0x4e79970f -//.word 0x1cc8b9ba -//.word 0x2e9b6b67 -//.word 0x1a3b9be0 -//.word 0xd4de7d18 -//.word 0xd234d061 -//.word 0x6d3d64df -//.word 0x8b5dd93d -//.word 0x7bb2a99e -//.word 0x20a569d7 -//.word 0x52bf4bdb -//.word 0x81bfe876 -//.word 0x9be93c3f -//.word 0x30a0f2c8 -//.word 0xd537e217 -//.word 0xc605d95a -//.word 0xcfb798d6 -//.word 0x6cea1f21 -//.word 0x2ffa2b91 -//.word 0x6214fdf4 -//.word 0xee935d81 -//.word 0x7b89df0f -//.word 0xd99b6585 -//.word 0x9e13e592 -//.word 0x11306c9e -//.word 0x47c06300 -//.word 0x8cf11271 -//.word 0x056562c0 -//.word 0x9384e7c8 -//.word 0xf9161da0 -//.word 0x4211f211 -//.word 0x5daf854d -//.word 0x0bc42edd -//.word 0xfb4fbedc -//.word 0x324f0863 -//.word 0xb1d8a044 -//.word 0x5265e2fb -//.word 0xf47036e1 -//.word 0xd74093a3 -//.word 0x490342f3 -//.word 0x831ce57d -//.word 0xcebeb71d -//.word 0xeaba154f -//.word 0xaf953ee7 -//.word 0xf5de5702 -//.word 0xb2beb23c -//.word 0x62d14f23 -//.word 0xac34a3ec -//.word 0x42e09965 -//.word 0x0936d72b -//.word 0x7ada421d -//.word 0x48c5c410 -//.word 0x42964dc5 -//.word 0x7c291718 -//.word 0xa96b2f79 -//.word 0xcc6d31a0 -//.word 0x10b7527d -//.word 0xf3dea46e -//.word 0xaa5996b5 -//.word 0xc190ba29 -//.word 0x0336cc2b -//.word 0x99d9efdc -//.word 0x76b7398e -//.word 0xf2d47278 -//.word 0xb44919ad -//.word 0xd6dfa84f -//.word 0x44dc1aff -//.word 0x651da999 -//.word 0xfe65dc1e -//.word 0x53f5c1f2 -//.word 0x8f5d7748 -//.word 0x6591f0da -//.word 0xf83ff5dd -//.word 0xf8606b34 -//.word 0x0e0ed4e4 -//.word 0x7b9519c8 -//.word 0xfccc8686 -//.word 0xf0a616c1 -//.word 0xbc04f190 -//.word 0x6fcd332f -//.word 0xa241eff5 -//.word 0xa38a7486 -//.word 0xd294ce4a -//.word 0x4a1f901e -//.word 0xc413d149 -//.word 0xb91375b1 -//.word 0xc754ae4f -//.word 0x56b0c1e0 -//.word 0x7bf60edd -//.word 0x1d854bae -//.word 0x5619101b -//.word 0x1be49803 -//.word 0x20e1c650 -//.word 0xf665662a -//.word 0x76f7b66b -//.word 0x63612453 -//.word 0x4b075a7e -//.word 0xae787812 -//.word 0x6343a03d -//.word 0x360cb8df -//.word 0xd6de6b83 -//.word 0xefc37194 -//.word 0x939211ce -//.word 0xde09e4f2 -//.word 0xda1bdbbe -//.word 0xa08b831c -//.word 0xc0ba889a -//.word 0xe3be791a -//.word 0xafb3caca -//.word 0xeb561f57 -//.word 0xe4d0c85e -//.word 0x0fcf8724 -//.word 0xefdb9a86 -//.word 0x39e8f533 -//.word 0x3727d018 -//.word 0x6a22611c -//.word 0x7308eb0e -//.word 0x3445f7db -//.word 0x3256e105 -//.word 0x3ddc9750 -//.word 0x54ef9ebf -//.word 0xc3b456be -//.word 0x8e327ea1 -//.word 0x1261fa4d -//.word 0xea84d435 -//.word 0x10b98289 -//.word 0x44cf67a9 -//.word 0xb2579ce0 -//.word 0xcffeef4f -//.word 0x841a2c27 -//.word 0x8e829c1c -//.word 0x25a3cc16 -//.word 0xdbd08f29 -//.word 0xc8da46c7 -//.word 0xe4e15f34 -//.word 0xb4691c3b -//.word 0x29b09620 -//.word 0xc54001d5 -//.word 0xffc03170 -//.word 0xe90f5ddd -//.word 0x109424d0 -//.word 0xa3cfcdfe -//.word 0xd834d38d -//.word 0x8c3aa1c9 -//.word 0x2aaf9a18 -//.word 0xcd4e5c30 -//.word 0xa9934687 -//.word 0xa7ce380b -//.word 0x4f779914 -//.word 0xebc19f97 -//.word 0xe971ca9c -//.word 0x82f1b2f2 -//.word 0x99a00321 -//.word 0xe66dc6a0 -//.word 0x53a4e248 -//.word 0xa607e209 -//.word 0x6121f8dc -//.word 0xe6d742f8 -//.word 0xdf404d49 -//.word 0xddb7d81e -//.word 0x3f2eda22 -//.word 0x56c5c68d -//.word 0xc79b0d9b -//.word 0x30e3e43e -//.word 0x0e3b490f -//.word 0xde3a408b -//.word 0x8248637c -//.word 0xe7b399b5 -//.word 0xe5ff2602 -//.word 0x667de45f -//.word 0xcb1fcf68 -//.word 0x8b8ac711 -//.word 0x1d6d9297 -//.word 0x191121b7 -//.word 0x9a32141d -//.word 0xe60e801f -//.word 0x51bbefab -//.word 0x5ebda87e -//.word 0x28d83197 -//.word 0x002313ec -//.word 0x585edd5b -//.word 0xe0856be3 -//.word 0xeea56814 -//.word 0x23ef12c4 -//.word 0x4c0b3d04 -//.word 0x86af9b53 -//.word 0xa66f3a11 -//.word 0xd7d74e36 -//.word 0x85b73143 -//.word 0x7abea879 -//.word 0x474a6849 -//.word 0xe67fd90d -//.word 0x9d9719f5 -//.word 0x25784444 -//.word 0x0c8cf3bc -//.word 0x58cd0256 -//.word 0x6d1f9737 -//.word 0x31e35fe0 -//.word 0x6dc91ba5 -//.word 0x77e55c60 -//.word 0x0e068a66 -//.word 0x85432bba -//.word 0x24d66281 -//.word 0xcb2eb6b6 -//.word 0xd83f151f -//.word 0x4b1d1980 -//.word 0x28c98a0e -//.word 0x1d4a2326 -//.word 0x6500993f -//.word 0xec36d91e -//.word 0xb4f69149 -//.word 0x7721f3bd -//.word 0x8ebfb6e3 -//.word 0x11935dc1 -//.word 0x40f2bb6d -//.word 0x21d6b7c8 -//.word 0x6b2f4d68 -//.word 0xa379d5d6 -//.word 0x859388fa -//.word 0xa5cf40d3 -//.word 0x56467f6c -//.word 0xcb6eb30b -//.word 0x7ceeb8ab -//.word 0xcbb09fac -//.word 0xe838aeca -//.word 0xf235a74c -//.word 0x5f564e7d -//.word 0x9d5f2560 -//.word 0xf97c7aa0 -//.word 0xc1d5a3c6 -//.word 0xa56289ae -//.word 0x6301633c -//.word 0xa4c6c44b -//.word 0x2092d8e6 -//.word 0x09e7eabb -//.word 0xa7fa2acc -//.word 0x400aae68 -//.word 0x3af1b65a -//.word 0x83f93460 -//.word 0x31f08cdf -//.word 0x667f98d4 -//.word 0x77b7ef0e -//.word 0x4ded679b -//.word 0x0bc8d880 -//.word 0xf09823ad -//.word 0x80e9732f -//.word 0xde59c3a8 -//.word 0x7da6a1fc -//.word 0xf70b314e -//.word 0x3dcd742b -//.word 0xf111ca04 -//.word 0x10f0b6e2 -//.word 0xd4cde255 -//.word 0xd9e663ad -//.word 0x7e2a3d6d -//.word 0x8e4b2afd -//.word 0x2013979f -//.word 0xbbfbf0a4 -//.word 0xbefa1de0 -//.word 0xff9b4d5b -//.word 0xb352f249 -//.word 0x8e100c3d -//.word 0x2b15ab99 -//.word 0xad06af49 -//.word 0xa73fd3b1 -//.word 0x396aeae3 -//.word 0x7c506816 -//.word 0x20f02354 -//.word 0x54ce5b72 -//.word 0xe68ef845 -//.word 0xacc11413 -//.word 0x22ffb948 -//.word 0x5436ec6a -//.word 0xff41ea4f -//.word 0xf3bdb18e -//.word 0xbb18c233 -//.word 0x80ea26b7 -//.word 0x2b89af2f -//.word 0xcad880c3 -//.word 0x355fcf62 -//.word 0xf1a1eab4 -//.word 0x54a97850 -//.word 0xeae70230 -//.word 0x183ab261 -//.word 0xff4e5aff -//.word 0xa328b761 -//.word 0x4dfff891 -//.word 0x2e4e7aff -//.word 0x4427d676 -//.word 0x82ca1d4e -//.word 0x2b7662e4 -//.word 0x7f7f7947 -//.word 0x99a1ff34 -//.word 0x98949a45 -//.word 0xfde08265 -//.word 0x54f34187 -//.word 0x1771b798 -//.word 0xcfcb60b1 -//.word 0x7c13da92 -//.word 0x370fa14c -//.word 0x168c1e3d -//.word 0x50f4e041 -//.word 0xa1232927 -//.word 0xf077ac62 -//.word 0x30269501 -//.word 0x84d5cae2 -//.word 0xa6667022 -//.word 0x8911b2d7 -//.word 0x3db6bd02 -//.word 0x14710fbf -//.word 0x0370f2bf -//.word 0x4a0143f8 -//.word 0x57ef789b -//.word 0xe80fe247 -//.word 0x71162e7c -//.word 0xbdad3252 -//.word 0xd7c8e76b -//.word 0x2b33b126 -//.word 0xe96de715 -//.word 0xaaba8fb2 -//.word 0x5674694d -//.word 0x45a23049 -//.word 0xa4cc1c88 -//.word 0x1b0dab24 -//.word 0xac69a160 -//.word 0xdf614dde -//.word 0x1cc50f12 -//.word 0x58ca17f6 -//.word 0xf45c6fff -//.word 0xe1b53c50 -//.word 0x092f412f -//.word 0xea56a4b5 -//.word 0x8442f5c9 -//.word 0x76246c4f -//.word 0x641e729c -//.word 0x9b58632d -//.word 0xf8509399 -//.word 0x06718fc5 -//.word 0x66e8a557 -//.word 0x74b3a66d -//.word 0x27faea8e -//.word 0x39a395e1 -//.word 0x8821199c -//.word 0xbd8cfcc0 -//.word 0x2bf7dc04 -//.word 0xfafeb00e -//.word 0x849e50e9 -//.word 0xff4a38b4 -//.word 0x5d3a8897 -//.word 0x700750fc -//.word 0x52750bfb -//.word 0x048f6915 -//.word 0x55fa5226 -//.word 0x05832795 -//.word 0x2bfa4bce -//.word 0xd443e2f2 -//.word 0xedaad8cc -//.word 0x63772508 -//.word 0x88c2509f -//.word 0xb9893296 -//.word 0x3e00fde8 -//.word 0x71287dc1 -//.word 0x22a39dec -//.word 0x3bc72c8f -//.word 0xa0f1e116 -//.word 0x591c9d6d -//.word 0xf3b2f172 -//.word 0x23a1e0aa -//.word 0xadb2e632 -//.word 0x841739f9 -//.word 0x33424e2d -//.word 0x7bfe9ff3 -//.word 0x3eb8ac5b -//.word 0x9c1d3f93 -//.word 0x5bebf55b -//.word 0x8c00fab8 -//.word 0x6bb814ed -//.word 0x8875e3a7 -//.word 0x247f6778 -//.word 0xde0fc286 -//.word 0x8fa63f85 -//.word 0x72a394e2 -//.word 0x88156441 -//.word 0x3ace082a -//.word 0x41b98fff -//.word 0xc36d0332 -//.word 0xbe01eeb4 -//.word 0xaa221db1 -//.word 0x5a64a47a -//.word 0x24d623c3 -//.word 0x41d9470e -//.word 0x76329367 -//.word 0xf45d6052 -//.word 0x7e242202 -//.word 0xc971eecb -//.word 0x286139da -//.word 0x6999e324 -//.word 0xf9dd749c -//.word 0x4fdfa5a9 -//.word 0x885422d7 -//.word 0x4f4d8ecd -//.word 0x00c5c77f -//.word 0x0d766ca4 -//.word 0xa0f29d6b -//.word 0x82ee0269 -//.word 0x3be10fd6 -//.word 0x7bce86fa -//.word 0xb85d3de2 -//.word 0x19312157 -//.word 0x93767b11 -//.word 0x52b97227 -//.word 0x5afdd1ca -//.word 0x6e0b0b33 -//.word 0x30097dda -//.word 0x8b4ef2e9 -//.word 0x4e756cf0 -//.word 0x19b022da -//.word 0x7d5fc520 -//.word 0x5fe2073c -//.word 0x9dab5e61 -//.word 0xf5970569 -//.word 0x227e450f -//.word 0x4709f25e -//.word 0x91c33869 -//.word 0x1873983d -//.word 0x07aa2d14 -//.word 0xfd9834cb -//.word 0xb323cb96 -//.word 0xde3bf9f3 -//.word 0x5767efdc -//.word 0x79a48d41 -//.word 0xca7028b5 -//.word 0xde228b68 -//.word 0x797c3b55 -//.word 0xf48300bc -//.word 0xe28ea0d3 -//.word 0xf39eeeb9 -//.word 0x18ed03ab -//.word 0xe7cacc7a -//.word 0x42a3c53c -//.word 0x33640342 -//.word 0x1b00784b -//.word 0x0c4c73f7 -//.word 0x7314667f -//.word 0xfa69eca2 -//.word 0xac380ae3 -//.word 0x5a21b5f1 -//.word 0x3e859567 -//.word 0xdfe109b5 -//.word 0x345b6b5e -//.word 0x0c9b9565 -//.word 0xaedca401 -//.word 0xbc43fc98 -//.word 0x5d6f8ceb -//.word 0x9a51538f -//.word 0x093e229c -//.word 0xa942a4a9 -//.word 0x0eb89df7 -//.word 0xbe176fec -//.word 0xda0fe2c3 -//.word 0x01d52483 -//.word 0x71bb0f2d -//.word 0x6f03ab3a -//.word 0xeaf5f444 -//.word 0x5b2fdd04 -//.word 0xef3d947c -//.word 0xe8690875 -//.word 0x40d4a92c -//.word 0x90c66e49 -//.word 0x31431d10 -//.word 0xa1dfc7db -//.word 0x28d391c8 -//.word 0xbb4fbbaf -//.word 0x2012da57 -//.word 0x533968e9 -//.word 0x29547fa4 -//.word 0x33bfe2d3 -//.word 0xe5303dfc -//.word 0xf78cae5b -//.word 0x0cff838e -//.word 0x924b4692 -//.word 0xe960f7ee -//.word 0xc72e982e -//.word 0xdbb7ef93 -//.word 0xb0688709 -//.word 0xd5a9f859 -//.word 0x3bb368a0 -//.word 0xdea15200 -//.word 0xa7ca8695 -//.word 0x914f71ab -//.word 0x0cf09f2e -//.word 0x9f247e61 -//.word 0xd06865d3 -//.word 0x48d7d490 -//.word 0x33fbfe94 -//.word 0xe6e38485 -//.word 0xc47584a1 -//.word 0x6206d2f5 -//.word 0xe92885cf -//.word 0xbcc3b677 -//.word 0x5b68841a -//.word 0x88e15b07 -//.word 0xa80d771e -//.word 0x6beba384 -//.word 0xaff4479c -//.word 0xa2aea133 -//.word 0x277e53fb -//.word 0x7cbd1e3b -//.word 0x190fedc4 -//.word 0xdbf01527 -//.word 0x6190db25 -//.word 0xb7e13767 -//.word 0x31eed770 -//.word 0x9a6e67cf -//.word 0x8e991099 -//.word 0x253a3e16 -//.word 0xd206a7bb -//.word 0x8a2c8958 -//.word 0x282d3293 -//.word 0x10eec695 -//.word 0x120c3d03 -//.word 0x926fab30 -//.word 0xe622c491 -//.word 0x00619f71 -//.word 0x4df4bae5 -//.word 0xdcbc3f03 -//.word 0xc38c854f -//.word 0xbf3ada76 -//.word 0x1af5803f -//.word 0xd2d8f5be -//.word 0xf7c077cb -//.word 0x555bc8b2 -//.word 0x53822f2c -//.word 0x1bc9bf8e -//.word 0xfb54db41 -//.word 0x0becfa72 -//.word 0x1151a80a -//.word 0xa1d2cee1 -//.word 0x891c322e -//.word 0x6c504143 -//.word 0xac580d77 -//.word 0x8d7a9263 -//.word 0x982d3d51 -//.word 0x3e2caff1 -//.word 0xbecabe4e -//.word 0x4985bc01 -//.word 0x63ddfca4 -//.word 0x8c67938a -//.word 0x201d5cad -//.word 0x7cf83fe8 -//.word 0x62c1b267 -//.word 0x9f247f5b -//.word 0xea06c8f2 -//.word 0x10184986 -//.word 0x4eacde15 -//.word 0xfec845f1 -//.word 0x777924b8 -//.word 0x2e6a4e87 -//.word 0x21b5426b -//.word 0x75f9f518 -//.word 0x5dadd1de -//.word 0x3fb4fdd8 -//.word 0x1231df67 -//.word 0x0b9cdfde -//.word 0x78166e7f -//.word 0xecf947a7 -//.word 0x9cb4f545 -//.word 0x09d68000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00013F90 -//// expected output -//.word 0xd440079d -//.word 0x982249c5 -//.word 0x1971bc20 -//.word 0x35b6dd45 -//.word 0x94766485 -//.word 0x424563d0 -//.word 0xe4d6822b -//.word 0x26d385c9 -//.word 0xb415702d -//.word 0xd7aaa6a1 -//.word 0xb4c18093 -//.word 0x8c4d30b0 -//.word 0xba63d09c -//.word 0x57cb2312 -//.word 0xd49ddcb8 -//.word 0xb32602af -//// SHA512LongMsgvector_103 -//// vector length -//.word 0x000142A8 -//// input message -//.word 0x4ccdc1f4 -//.word 0xdd8a783b -//.word 0xfc8e8aec -//.word 0x74c83618 -//.word 0x9d7ebbd2 -//.word 0xd3ef6dee -//.word 0x28370809 -//.word 0x567244ca -//.word 0xf824aa66 -//.word 0xf9d9a56a -//.word 0x4c08dcb5 -//.word 0xdd3dbfc3 -//.word 0xc8776032 -//.word 0xcacf857e -//.word 0xf45bfb10 -//.word 0xa7522d77 -//.word 0xbc71f5f5 -//.word 0x039db13d -//.word 0xefc99a7b -//.word 0x8f1a5195 -//.word 0xc049bbb0 -//.word 0xa24a0ff7 -//.word 0x482b2d97 -//.word 0xb43e320e -//.word 0x027a49a6 -//.word 0xe31fc43c -//.word 0x4d996b46 -//.word 0x71a71315 -//.word 0xeebc7357 -//.word 0x44a634df -//.word 0x8b6d47a9 -//.word 0x657e7b18 -//.word 0x31084f83 -//.word 0x81a704f0 -//.word 0xce40f71f -//.word 0x6b2c2ecb -//.word 0xb898312c -//.word 0x982b1bc0 -//.word 0x25eaf04b -//.word 0xa259311d -//.word 0xb0e3ae93 -//.word 0xc57c9ce0 -//.word 0xdb85e70d -//.word 0x65f0ca3f -//.word 0x87a49c39 -//.word 0x8623ed21 -//.word 0x7e6ad187 -//.word 0x53197ca3 -//.word 0xe9d30fde -//.word 0x98e8b295 -//.word 0xda31e319 -//.word 0x473c0dfa -//.word 0xc4a95d85 -//.word 0xf7d4d18b -//.word 0xfeb59264 -//.word 0x60048334 -//.word 0x43a01a6d -//.word 0xe0316f95 -//.word 0x350c924a -//.word 0xf9582283 -//.word 0xd56f1b18 -//.word 0xd187f085 -//.word 0x0d92daeb -//.word 0xb1636f57 -//.word 0x26117647 -//.word 0x87a0fa6a -//.word 0x52de9da8 -//.word 0x648c2f62 -//.word 0x24be7ffb -//.word 0xfe857197 -//.word 0x13ca5122 -//.word 0x2e7d6795 -//.word 0xfaf0cc74 -//.word 0x737d7c9b -//.word 0x9b6fab3b -//.word 0x6e205d20 -//.word 0x175e3135 -//.word 0x64137d49 -//.word 0x7825a013 -//.word 0xc09c9474 -//.word 0x2803c3fd -//.word 0x8e101cb1 -//.word 0x7687650c -//.word 0x005bd344 -//.word 0x1816d8ce -//.word 0xed7c3c24 -//.word 0xa46b6fc6 -//.word 0x4d061e7e -//.word 0x161304e9 -//.word 0xbea00333 -//.word 0x4ded7322 -//.word 0x0386ba56 -//.word 0x8eb01ccf -//.word 0x8006d5af -//.word 0xff646541 -//.word 0xbe042c3b -//.word 0x2de73640 -//.word 0xed7758a9 -//.word 0x876a7c85 -//.word 0x5de939de -//.word 0xe1f2a73f -//.word 0x04fb7172 -//.word 0xf2d82b8e -//.word 0xfcdee632 -//.word 0xd549020b -//.word 0x02db449c -//.word 0x8cc6283e -//.word 0xf8cc7965 -//.word 0x78a51e26 -//.word 0x63a137f6 -//.word 0xe38e69b5 -//.word 0xeedc75eb -//.word 0x77ff1051 -//.word 0xe515ef93 -//.word 0xc4c92154 -//.word 0xba77a172 -//.word 0xbd912c8c -//.word 0x844150c2 -//.word 0x3b4fc6bc -//.word 0x7b4601ee -//.word 0x79d2071a -//.word 0x7e6d8016 -//.word 0x973a0ccf -//.word 0x8d31da8e -//.word 0x177d777a -//.word 0x4f22e35f -//.word 0x63e3eaad -//.word 0x8d63b1c4 -//.word 0x458a906e -//.word 0xb52a1fad -//.word 0x6de394b8 -//.word 0x58444c40 -//.word 0xee32a7f7 -//.word 0xac8e1953 -//.word 0xc1127e8f -//.word 0x0b7caef4 -//.word 0x41ef5256 -//.word 0x7296f6e1 -//.word 0xae8a5f16 -//.word 0x03f61e10 -//.word 0xab79650c -//.word 0x83cb1a28 -//.word 0xbfa42a6b -//.word 0xdcd92006 -//.word 0xd7c8f6d9 -//.word 0x9df72a39 -//.word 0xc2f815f1 -//.word 0x75907986 -//.word 0xb41859c0 -//.word 0xbc220d65 -//.word 0xc4609548 -//.word 0xeac22e82 -//.word 0x6edf2300 -//.word 0x1e96e63e -//.word 0x11f55f51 -//.word 0x9859842b -//.word 0x72d72a1b -//.word 0x3fdb1a93 -//.word 0x370f682e -//.word 0x1c7f00f1 -//.word 0x6dfa82d2 -//.word 0xddbb5076 -//.word 0x0449e53f -//.word 0x539b6886 -//.word 0x4d808025 -//.word 0xf43e6b39 -//.word 0x82794a26 -//.word 0x5a57bfdb -//.word 0x3ee2ba57 -//.word 0xc2ae906b -//.word 0x01bb4ec2 -//.word 0x8e9c4c20 -//.word 0xaed905e7 -//.word 0xc49325df -//.word 0x0c66e436 -//.word 0x8c9493c6 -//.word 0x485f7497 -//.word 0xb6b6cfa5 -//.word 0x711442e3 -//.word 0x31a6597f -//.word 0xfbac5f68 -//.word 0x9521730e -//.word 0x3d9ede69 -//.word 0x9a7ca33c -//.word 0xf339589b -//.word 0x9f1c35ab -//.word 0xbd1c6ba9 -//.word 0x25ffb62d -//.word 0x9ebf36b0 -//.word 0x51317b4c -//.word 0x7de8dfc4 -//.word 0x6d5818c4 -//.word 0xa7370d6a -//.word 0x6729e904 -//.word 0x4b9b6e1c -//.word 0x50ef8db2 -//.word 0xfdda33c8 -//.word 0xde0b6524 -//.word 0x340e8f51 -//.word 0xeb6f19e7 -//.word 0xcc223c0c -//.word 0xf422143b -//.word 0x8559f644 -//.word 0x9bc00394 -//.word 0x82c7fdb7 -//.word 0x26f75a1b -//.word 0xcad69717 -//.word 0xfd0bcf2b -//.word 0xcac28c8a -//.word 0x3052ddd5 -//.word 0xd21da92a -//.word 0xeeb8425d -//.word 0x934d3d85 -//.word 0x0f3d82bb -//.word 0xa7099f1e -//.word 0x8c72621b -//.word 0x0adfa6eb -//.word 0x01006d5c -//.word 0x99b12fd5 -//.word 0x32217294 -//.word 0x9a339b3b -//.word 0x8324048b -//.word 0x346f4e6f -//.word 0x7eedf93c -//.word 0xf2413137 -//.word 0x5173eb58 -//.word 0x44db314d -//.word 0x4d41bac2 -//.word 0xfe42bee0 -//.word 0x69f50813 -//.word 0xd7cf4d11 -//.word 0xbdc4bc18 -//.word 0xebafd676 -//.word 0x07f4804f -//.word 0x3a64579b -//.word 0x2961436e -//.word 0x27424f7c -//.word 0xa8f9b8dc -//.word 0xf9f2430c -//.word 0x2f3fd436 -//.word 0x5ef33db1 -//.word 0x0bcb54cb -//.word 0xe31448c6 -//.word 0xadc83520 -//.word 0x7dfbf518 -//.word 0x2a753a6d -//.word 0x03a1d969 -//.word 0xbea6691e -//.word 0xb1d30df0 -//.word 0x45408e53 -//.word 0xa7b2add6 -//.word 0xc0c0b761 -//.word 0x683459ba -//.word 0xd6b4b64e -//.word 0x5ba2b72f -//.word 0x5140a259 -//.word 0x4e18ef39 -//.word 0x9d9b5770 -//.word 0xee082dd4 -//.word 0x4c8ff1b7 -//.word 0x50b7236d -//.word 0x94fd5508 -//.word 0x6bbd8466 -//.word 0xcf56a86e -//.word 0x9b8a8a96 -//.word 0xfb23d6a8 -//.word 0x20dc71c7 -//.word 0x387e0cad -//.word 0x9d4afa36 -//.word 0x4c973e22 -//.word 0x9abce916 -//.word 0x2230a3e5 -//.word 0x02f0870e -//.word 0x47213486 -//.word 0xa5f720b7 -//.word 0x6cd530c8 -//.word 0xb7b6861f -//.word 0xe6cb9b24 -//.word 0x4f658d48 -//.word 0x3116ba47 -//.word 0xe9138da9 -//.word 0x69dd988f -//.word 0xe521e3ac -//.word 0xcfdc8492 -//.word 0x06c2702f -//.word 0x4be19197 -//.word 0xf4821904 -//.word 0xe450151a -//.word 0xbabc4570 -//.word 0x499f2b4d -//.word 0x492162af -//.word 0x4bdb3192 -//.word 0xf338606e -//.word 0x61214a02 -//.word 0xf0d93450 -//.word 0x2325dde9 -//.word 0xdcb1566a -//.word 0xcfaf1447 -//.word 0x37c144c7 -//.word 0xc7195e50 -//.word 0xe4defde5 -//.word 0x11d2eeed -//.word 0xab338736 -//.word 0xd6df3a39 -//.word 0xb7bb6aa0 -//.word 0xe4547c05 -//.word 0x18c732fd -//.word 0x2cdf3455 -//.word 0x427ef09b -//.word 0x443ea4e0 -//.word 0x8d57b9bd -//.word 0xe5c45394 -//.word 0xb3a12618 -//.word 0x6ed88b10 -//.word 0x55fcd358 -//.word 0x6075db28 -//.word 0x76dee098 -//.word 0xe0ab9564 -//.word 0xfe0f73ed -//.word 0x381d5181 -//.word 0x382d34dc -//.word 0x568168ef -//.word 0x5428d0e0 -//.word 0x4c237a51 -//.word 0xe6c776e5 -//.word 0xce62e900 -//.word 0x66215dcf -//.word 0xb8315b89 -//.word 0xae253cf4 -//.word 0x85983c2a -//.word 0x7f13d09d -//.word 0xd8313a59 -//.word 0xfc005a89 -//.word 0xf7abc73d -//.word 0x2d561e6a -//.word 0x4b4a9a32 -//.word 0x7d52e566 -//.word 0xe2642e4a -//.word 0x3d847c98 -//.word 0xede642c7 -//.word 0x1f53338c -//.word 0x42cd57a2 -//.word 0xbb765fc7 -//.word 0xdaae3607 -//.word 0x0d7cd83c -//.word 0x542f67d6 -//.word 0xf5457cd8 -//.word 0x718bbb23 -//.word 0xb686aaf7 -//.word 0x9612c3b7 -//.word 0x7849c7ec -//.word 0x4ea6568d -//.word 0xc76abd7e -//.word 0xc53f0f56 -//.word 0x111c7765 -//.word 0x4e68ccf6 -//.word 0x2b6266d1 -//.word 0xddc03004 -//.word 0xcd96ffe3 -//.word 0x8d7a224e -//.word 0x11e63b32 -//.word 0x1cde4d52 -//.word 0xf8d21548 -//.word 0x6ac59ec6 -//.word 0xe5af1022 -//.word 0xfe20c812 -//.word 0x2027aeb4 -//.word 0x8172c3d1 -//.word 0x54b6fa62 -//.word 0x41524953 -//.word 0x122fff88 -//.word 0xafea581e -//.word 0x4c354ff3 -//.word 0xe17ab368 -//.word 0xdac27d65 -//.word 0x10d6619e -//.word 0xf9a3a315 -//.word 0x1be32ce0 -//.word 0xc7fadd2d -//.word 0x031e2383 -//.word 0xc8bbcc4b -//.word 0x6e16198e -//.word 0x64301400 -//.word 0x24ed233e -//.word 0x6675de54 -//.word 0x94db1e82 -//.word 0x7ffd5640 -//.word 0x50ab277f -//.word 0xc10b2e32 -//.word 0x8d3b210d -//.word 0x24391a8c -//.word 0xa4003238 -//.word 0x05f45226 -//.word 0x938046c0 -//.word 0xa2fe13c7 -//.word 0x7dd78b99 -//.word 0x9feb1eb0 -//.word 0x2633f36c -//.word 0x84a43812 -//.word 0x7857b614 -//.word 0x3de8a893 -//.word 0x011ccd22 -//.word 0x98c6bccd -//.word 0x72eb785a -//.word 0xca2444ce -//.word 0x2144b833 -//.word 0xeb3b1599 -//.word 0x883ad65b -//.word 0x751887a3 -//.word 0xc4f5da30 -//.word 0xc91df857 -//.word 0x172e1548 -//.word 0xab7e4793 -//.word 0x66b798eb -//.word 0xc1c45a29 -//.word 0xbcf1ba94 -//.word 0x174d985f -//.word 0xc5539673 -//.word 0x9eca6f6f -//.word 0x54ea8bed -//.word 0xa8c0d008 -//.word 0xddd4ba1b -//.word 0x6d08aeca -//.word 0xfcc38b47 -//.word 0x8a4f83ce -//.word 0xec802972 -//.word 0x7d97ca1c -//.word 0x116501d1 -//.word 0x2ab48633 -//.word 0x6fe2474b -//.word 0x59cfba85 -//.word 0x30fa71fc -//.word 0x36e6eff8 -//.word 0x22c3bab5 -//.word 0xcf4ab167 -//.word 0x36e9a07a -//.word 0x9a20121e -//.word 0x022b6603 -//.word 0xece12561 -//.word 0x40dc933c -//.word 0x83da84e6 -//.word 0x4d6371c5 -//.word 0xfdaccb56 -//.word 0xabbc8f72 -//.word 0x5ecd1bd1 -//.word 0x7ff540cc -//.word 0x8e059867 -//.word 0x14b21a8e -//.word 0xd9f2eb9f -//.word 0x56a97729 -//.word 0x6d85c1f4 -//.word 0x5826f741 -//.word 0xe0834a52 -//.word 0xcf89fd2d -//.word 0xa705bb9e -//.word 0x94c32d7b -//.word 0xa0f7cc2b -//.word 0x26ddf469 -//.word 0x899d3a46 -//.word 0x2571006d -//.word 0x860947ab -//.word 0xd82fc4af -//.word 0x9fa7350e -//.word 0xa959f58a -//.word 0x40b2ce93 -//.word 0xa4470f0e -//.word 0xb8bbdf56 -//.word 0xfbe3d180 -//.word 0xba29b9e4 -//.word 0x842ebdd8 -//.word 0xdfb4afbf -//.word 0x39ba9a43 -//.word 0x21e89ade -//.word 0xb72ef19f -//.word 0x61a9582b -//.word 0xc0c69302 -//.word 0xe3a94803 -//.word 0xbad01133 -//.word 0xcdf3d0ba -//.word 0x2d2f432e -//.word 0xab64d814 -//.word 0x49dcc2a4 -//.word 0xee2d4ccd -//.word 0x5e606d79 -//.word 0x68529d12 -//.word 0x625be845 -//.word 0xd22e4106 -//.word 0x6e0018d4 -//.word 0x47ed2f3e -//.word 0x4197a9a6 -//.word 0xc6106445 -//.word 0xbbfa886f -//.word 0xb3ec6018 -//.word 0x63186998 -//.word 0x572ba9ab -//.word 0xe37542bc -//.word 0x5b4a4763 -//.word 0x86a8ce2c -//.word 0x5119479a -//.word 0xc1db0c6b -//.word 0x2b3f391e -//.word 0xa74fbdb3 -//.word 0xc2b3b1b2 -//.word 0x73d6e96e -//.word 0x5144c98b -//.word 0x02575abe -//.word 0xf7129dd4 -//.word 0x564d20f6 -//.word 0x3812ce2b -//.word 0x15480b1e -//.word 0x7c8e0122 -//.word 0x086a3473 -//.word 0x8fa35dbe -//.word 0x9ceb75e4 -//.word 0x20c110fc -//.word 0x6496ec97 -//.word 0x422fca47 -//.word 0x954a7c62 -//.word 0xee844003 -//.word 0x897a4c52 -//.word 0x7f2faa05 -//.word 0x3cae4627 -//.word 0x34f04618 -//.word 0xd2ff99d6 -//.word 0xb15cd37a -//.word 0x0f9e3806 -//.word 0x7f5d165d -//.word 0xdd4e5993 -//.word 0x87af5967 -//.word 0xcae6f60e -//.word 0x9b65e733 -//.word 0x88d04f3b -//.word 0xee6291cd -//.word 0x6b8d6692 -//.word 0x96e02d39 -//.word 0xee2e82bf -//.word 0x11ed11ed -//.word 0x2fdcac22 -//.word 0xbde99c52 -//.word 0x6e51354f -//.word 0x5f09ae47 -//.word 0x915d2f8e -//.word 0x9dd72a9e -//.word 0xa362ef5d -//.word 0x84af7b9e -//.word 0x51d891e9 -//.word 0x03430d7f -//.word 0x6cca7499 -//.word 0x6d18cff1 -//.word 0x6a56ba83 -//.word 0xfb08b895 -//.word 0xe431c9f5 -//.word 0x48be3f82 -//.word 0x1921cded -//.word 0xd33de1c1 -//.word 0x6a8233a1 -//.word 0x80599ed1 -//.word 0xdcc230f9 -//.word 0x183b7d25 -//.word 0x99e5380f -//.word 0xc5e204a1 -//.word 0x6f0187b6 -//.word 0x969dc021 -//.word 0x50c29bf0 -//.word 0x0192c3f2 -//.word 0xd0e7b876 -//.word 0x5c3a2156 -//.word 0xaac46334 -//.word 0x63e27204 -//.word 0x3cbee8ca -//.word 0xb52c54a5 -//.word 0x06d2d40d -//.word 0x568ce659 -//.word 0x2f0f7b84 -//.word 0x2fcc4d30 -//.word 0x001773eb -//.word 0x8a8832b2 -//.word 0x66a117b3 -//.word 0x96b24257 -//.word 0x74fa0580 -//.word 0xe90fae10 -//.word 0xdf80a0aa -//.word 0xf9b8a9bc -//.word 0x81258fbd -//.word 0xa29aecb3 -//.word 0xd7f23cf9 -//.word 0xa3f7353f -//.word 0x838257d2 -//.word 0x21e3c31e -//.word 0xca825071 -//.word 0x22c7dc01 -//.word 0x1638e031 -//.word 0x13e14710 -//.word 0x75f98122 -//.word 0x43c2d364 -//.word 0x19b1f18a -//.word 0x65cfce8b -//.word 0xd65fb35f -//.word 0x12c18f07 -//.word 0xa8968ecf -//.word 0x4525ecd0 -//.word 0x2afe0cb8 -//.word 0xdddcc4ce -//.word 0x1fd0fb30 -//.word 0x1f9c775f -//.word 0xed5df0fe -//.word 0x316e69d7 -//.word 0x1d88c01f -//.word 0xa02e83fb -//.word 0xdd480543 -//.word 0xdb0eb185 -//.word 0x7e279f4d -//.word 0xb61265a3 -//.word 0xf6c630d6 -//.word 0xe8951378 -//.word 0x5f569eaa -//.word 0x8dc3b39a -//.word 0x76209549 -//.word 0xa41e4292 -//.word 0x1cfe0368 -//.word 0x92f9415f -//.word 0xd9e09a6d -//.word 0x9d0034f2 -//.word 0x544851f7 -//.word 0x72ae24b3 -//.word 0xdccee454 -//.word 0xa0d41efc -//.word 0xe39d4f09 -//.word 0x1b19b299 -//.word 0x7ef4574d -//.word 0xb975754e -//.word 0xe6a6018e -//.word 0xb8b57f51 -//.word 0xf99a19eb -//.word 0x37faeecb -//.word 0xba4bacb8 -//.word 0xb93a615b -//.word 0xcd498efe -//.word 0xa5bd7e93 -//.word 0xfcb7d5f8 -//.word 0xc8a16c79 -//.word 0xb4cb5c97 -//.word 0xd1565907 -//.word 0x885242fe -//.word 0xd423f5ac -//.word 0xae296806 -//.word 0xc8a0f6c9 -//.word 0x7dc4f6bc -//.word 0x08399235 -//.word 0xf5abd7de -//.word 0xd6b208b9 -//.word 0x37f83862 -//.word 0xd49d1795 -//.word 0x09da0def -//.word 0x89e585f9 -//.word 0x53158c62 -//.word 0xe2479a8c -//.word 0xa480af4b -//.word 0xaed4a2e9 -//.word 0xae86b66d -//.word 0x21706f1c -//.word 0xc6a5a441 -//.word 0x5256d42a -//.word 0x65f2be73 -//.word 0xbd912b87 -//.word 0xaa930f63 -//.word 0xc184d09d -//.word 0xd543e6a5 -//.word 0x2364a44c -//.word 0xcdd25582 -//.word 0x8ab98b64 -//.word 0x9ba3b476 -//.word 0x01e1ee2c -//.word 0xed2c1db0 -//.word 0x788c3adf -//.word 0x9479ee94 -//.word 0x42405f2a -//.word 0x06a94a3c -//.word 0x98d752af -//.word 0xdd6f97f3 -//.word 0x15fd8b85 -//.word 0x569301b9 -//.word 0x39b387b6 -//.word 0xd36ef6c2 -//.word 0xe7ce47c0 -//.word 0x5972a8f6 -//.word 0xe678cf14 -//.word 0x13a08f72 -//.word 0x63ada99a -//.word 0xcd0fe406 -//.word 0x6dc0602b -//.word 0x7a6c27b6 -//.word 0x78d40515 -//.word 0xaf749a39 -//.word 0xdb63ad9a -//.word 0x257cc37c -//.word 0x52bbf071 -//.word 0x3be9ee20 -//.word 0x7d7c6c44 -//.word 0x71b9a8f8 -//.word 0x5f1b4031 -//.word 0xeef8468c -//.word 0xdf62924a -//.word 0xfb4c5c98 -//.word 0x4aed0a14 -//.word 0x866a468e -//.word 0xcfaf540b -//.word 0xa09da210 -//.word 0x026ba11d -//.word 0x0046d477 -//.word 0x5a3b272a -//.word 0x7e57814f -//.word 0xb30d9c8b -//.word 0x98d715d8 -//.word 0xcd20bf88 -//.word 0xf0623d87 -//.word 0xcb8cd0e0 -//.word 0xcba66d82 -//.word 0xb4b71345 -//.word 0x94e75b28 -//.word 0xf6e151dc -//.word 0x577b8287 -//.word 0xde9956c2 -//.word 0x474ea0e3 -//.word 0x21457482 -//.word 0x39603936 -//.word 0x569efea0 -//.word 0x264212ab -//.word 0x7932ce11 -//.word 0xad9db622 -//.word 0x69e0c1c1 -//.word 0x8fabf4af -//.word 0x6b5f350c -//.word 0x31bb5f1a -//.word 0xa6b89245 -//.word 0x1db1cd60 -//.word 0xa5c7be32 -//.word 0x8184d831 -//.word 0xd8bfa78d -//.word 0xaebf6070 -//.word 0x13a3bd85 -//.word 0x9a0007b7 -//.word 0x0dcd743b -//.word 0x5f7cb4d0 -//.word 0xe26ac745 -//.word 0xba79113c -//.word 0x92fbb02f -//.word 0x8ed30db0 -//.word 0x80d6b1f5 -//.word 0x5e785b93 -//.word 0xf4a44f8a -//.word 0xd6ebf082 -//.word 0x99e19154 -//.word 0x42c489cc -//.word 0xff5f85ae -//.word 0x152e23f6 -//.word 0x1ac3bc64 -//.word 0x64688038 -//.word 0xc106c93b -//.word 0x6846a9fe -//.word 0x30f5c566 -//.word 0x00ad6768 -//.word 0x87b2ce12 -//.word 0x2d1ac9cb -//.word 0x493184db -//.word 0x941ba12e -//.word 0xdebb8a54 -//.word 0xffd406cd -//.word 0x116e0b84 -//.word 0xdc7cd499 -//.word 0x92bb3263 -//.word 0xbddd27b6 -//.word 0x75e7b161 -//.word 0xd6d8e4fb -//.word 0xb18b3be0 -//.word 0x82de3076 -//.word 0xa2140ab5 -//.word 0xbe78f7e6 -//.word 0x88435aaa -//.word 0xacc0663f -//.word 0x06aeecff -//.word 0x12e67129 -//.word 0xa43e84e4 -//.word 0xd9ac4f81 -//.word 0x4daf6b01 -//.word 0x8eeaf9d7 -//.word 0xd112eeef -//.word 0xe40baeee -//.word 0x644eddbc -//.word 0x308e7140 -//.word 0x1d9b0c6a -//.word 0xec868a77 -//.word 0x7906d570 -//.word 0x341a01f4 -//.word 0xd5f09538 -//.word 0x4c06264c -//.word 0xf78f2ba0 -//.word 0x18180cc6 -//.word 0x866b7c79 -//.word 0xa3b409df -//.word 0x8de2f10b -//.word 0x995038c6 -//.word 0xfda5f78f -//.word 0xccf9f7e0 -//.word 0x28397eb3 -//.word 0xb3cc6945 -//.word 0x46767b1a -//.word 0xe67df541 -//.word 0xf30b67d9 -//.word 0xa3d4c5d4 -//.word 0xaff8bdfb -//.word 0x4c2b4832 -//.word 0x5d1380fe -//.word 0xe7f1b144 -//.word 0xc584b254 -//.word 0x9d2b7625 -//.word 0x1249dee2 -//.word 0x3bedd1a6 -//.word 0x54b38f85 -//.word 0xb4e542cb -//.word 0xffe6d788 -//.word 0x9dd10b4c -//.word 0x6b5dc92f -//.word 0xb004b314 -//.word 0x5264ff2f -//.word 0x4ae584c5 -//.word 0x559c1433 -//.word 0xec6f0d32 -//.word 0x777a2b59 -//.word 0xbeb2a0e4 -//.word 0xa0c867b3 -//.word 0x0751d596 -//.word 0x1b2371c7 -//.word 0xb60205b8 -//.word 0x187cf50f -//.word 0xdd11d0ef -//.word 0x2c97257a -//.word 0x30dd9894 -//.word 0xcc8f34e9 -//.word 0x8a590331 -//.word 0xd54fdcb3 -//.word 0x698d7d07 -//.word 0x071ada21 -//.word 0x6d13b48b -//.word 0x85056cf2 -//.word 0xdd9a1ae4 -//.word 0x5778dad8 -//.word 0x2266666f -//.word 0xe8b0eaf9 -//.word 0x49cd133b -//.word 0x89406970 -//.word 0x85bce08d -//.word 0xec8ba9c9 -//.word 0xab314e5d -//.word 0xa94cfe88 -//.word 0xb5be26d7 -//.word 0xbd0e41a3 -//.word 0x400cf0db -//.word 0x05b44d04 -//.word 0x0e557c7d -//.word 0xc8f38408 -//.word 0x84e95d86 -//.word 0x2ad24b02 -//.word 0x2caa6af1 -//.word 0xba3189b8 -//.word 0x35903b6f -//.word 0xe53f2ce5 -//.word 0xee26b2e4 -//.word 0x8003a4b6 -//.word 0x4f0b6fe7 -//.word 0x43d4664d -//.word 0x70725a46 -//.word 0x48e16b41 -//.word 0x0fa31d80 -//.word 0x90a9af1c -//.word 0x0f77a849 -//.word 0x7e84b2db -//.word 0xf4dfab09 -//.word 0x5a18fa71 -//.word 0x685e1f5d -//.word 0xd0e58e45 -//.word 0xb88bbe95 -//.word 0x6eba7daf -//.word 0x57908634 -//.word 0x293d5580 -//.word 0x5aad3a73 -//.word 0xd968ad77 -//.word 0xfbb6e1be -//.word 0xb8069ccc -//.word 0x17904536 -//.word 0xe73a3fa9 -//.word 0xb0b8752d -//.word 0xe9f836ab -//.word 0x6bbd44ad -//.word 0x268a2766 -//.word 0x13c1c7f2 -//.word 0x690c3adf -//.word 0x14fcdbeb -//.word 0x63f09c0f -//.word 0x01399dbd -//.word 0x267bfd67 -//.word 0x0e56f040 -//.word 0xab461146 -//.word 0x97c8fa80 -//.word 0x4cbf1284 -//.word 0x9715a73d -//.word 0x4aa53deb -//.word 0x3259256b -//.word 0x488f51b9 -//.word 0x2bc266b3 -//.word 0xce661320 -//.word 0x6e13a2f0 -//.word 0xc8e6ccc5 -//.word 0x8825d2b3 -//.word 0x0421c944 -//.word 0x2a6135c0 -//.word 0xb7fcdaab -//.word 0xab47cf8e -//.word 0xf9b0d4fb -//.word 0x82eae5cb -//.word 0x444b10aa -//.word 0xcf7283d6 -//.word 0xf92ce923 -//.word 0xd399f743 -//.word 0xdc8a4144 -//.word 0x742e535a -//.word 0x93eefddf -//.word 0xba95ee98 -//.word 0x2ab4843a -//.word 0x5545e32c -//.word 0x928e458f -//.word 0x1448917c -//.word 0x1d012e8c -//.word 0x6fbf199e -//.word 0x04e635d4 -//.word 0xfe5be3df -//.word 0xe1ead37d -//.word 0x00e51a3f -//.word 0x350e8490 -//.word 0xd5b72bf3 -//.word 0xe328488c -//.word 0x84414ae2 -//.word 0xb36125e3 -//.word 0x3686ed29 -//.word 0xd1b5a37b -//.word 0xb99c4f97 -//.word 0x4b764e2e -//.word 0xfe2fee31 -//.word 0x97c8384b -//.word 0x9cfe0daf -//.word 0x0a267513 -//.word 0x4a5c33fc -//.word 0x62dc9d3d -//.word 0x69b0aaba -//.word 0x3d8c4d72 -//.word 0x78f601bd -//.word 0x9fa9a5d1 -//.word 0x9d3c8b8b -//.word 0x70ffcc6d -//.word 0x2326dee3 -//.word 0xfc2968ca -//.word 0xf66a5432 -//.word 0x71192663 -//.word 0x29548d1f -//.word 0x65933827 -//.word 0x7144eb01 -//.word 0x4db2d2f7 -//.word 0xa72b1563 -//.word 0x0762ac2a -//.word 0x4a127587 -//.word 0x51e4840a -//.word 0xfa93bae0 -//.word 0x4f4e9954 -//.word 0xfe5e5696 -//.word 0x0a0830bb -//.word 0xbfb50106 -//.word 0xeb501366 -//.word 0x4bf0343f -//.word 0x44b70d6d -//.word 0xd3faaf87 -//.word 0xc7a16f60 -//.word 0x2ed1f4d4 -//.word 0x0dc98ec1 -//.word 0x540ac953 -//.word 0x10bb4385 -//.word 0xe34bbae4 -//.word 0xb1586996 -//.word 0x9dd0959c -//.word 0x34566354 -//.word 0xe7e7ec42 -//.word 0xbfbd930f -//.word 0x4c7397d2 -//.word 0xdf6be48f -//.word 0xf96d2ffd -//.word 0x0290418d -//.word 0x3e5e93a7 -//.word 0xfe331c37 -//.word 0x13e66768 -//.word 0x88abe8af -//.word 0x9138900c -//.word 0xbe279f8d -//.word 0x749cba13 -//.word 0x9e273d58 -//.word 0xa0ecd231 -//.word 0x8c014311 -//.word 0x99178ccf -//.word 0xd15d35a9 -//.word 0x09a1de88 -//.word 0x16b81c86 -//.word 0x3e2183ad -//.word 0xede50401 -//.word 0xa9c17ac1 -//.word 0x48877feb -//.word 0x61c284fe -//.word 0x00992103 -//.word 0x9ef6a9ce -//.word 0x50e70282 -//.word 0x3e44b353 -//.word 0x57923f90 -//.word 0x4327b2e0 -//.word 0x998f79cc -//.word 0x532f767d -//.word 0x7f2854c7 -//.word 0x377e1867 -//.word 0xd27af989 -//.word 0x5c4c728e -//.word 0x44f5950b -//.word 0x5564a215 -//.word 0xe7dfd8bc -//.word 0x57a58bd5 -//.word 0xb4d277fd -//.word 0xbb8254da -//.word 0x0639aba4 -//.word 0x8083e7e4 -//.word 0x1cd7af7c -//.word 0xc7c173e8 -//.word 0x9b4145c3 -//.word 0x556eeb8d -//.word 0x095e32ab -//.word 0x144a85af -//.word 0x53eebdda -//.word 0x922f3bdf -//.word 0x470034ea -//.word 0x81864de1 -//.word 0x1b7a68ea -//.word 0x35d0bd2d -//.word 0xe4962cdb -//.word 0x291ed16f -//.word 0x205fda34 -//.word 0x7a999507 -//.word 0x2d38cd5e -//.word 0x6afb5789 -//.word 0xd055e838 -//.word 0xdf142a3e -//.word 0xaf400e94 -//.word 0xe24663a1 -//.word 0xd755a8b8 -//.word 0x20091ee3 -//.word 0x374722df -//.word 0x6c68ba67 -//.word 0x22996eb6 -//.word 0x3b815947 -//.word 0xd1257fdf -//.word 0x270961cd -//.word 0xdf98cf70 -//.word 0x6dc6fefb -//.word 0xcbf4da75 -//.word 0x6e149d04 -//.word 0x7a0da16a -//.word 0x326172d0 -//.word 0xb20d28c3 -//.word 0xe0b1f47c -//.word 0xa0f0f864 -//.word 0x471a5cd7 -//.word 0x53089e28 -//.word 0x594829e6 -//.word 0x3e7b2a5e -//.word 0xaafa9f61 -//.word 0xbac0b048 -//.word 0xf5844334 -//.word 0x8225cb9b -//.word 0x984b6000 -//.word 0x354c1501 -//.word 0x134c8697 -//.word 0xd8a9b09a -//.word 0x8c960683 -//.word 0x5105c176 -//.word 0x4ecb7780 -//.word 0xedfeef1d -//.word 0x46a234fd -//.word 0xdb85e807 -//.word 0x8568db9f -//.word 0xae5fdc24 -//.word 0xc17bcfbd -//.word 0xdfa50056 -//.word 0xd4cdb7e5 -//.word 0x49450df2 -//.word 0x3a67fd56 -//.word 0xab7ebe43 -//.word 0x97e45084 -//.word 0x2a675606 -//.word 0x30f12398 -//.word 0xcc6917ef -//.word 0x6dd42ced -//.word 0xfec0cc23 -//.word 0x5de2e694 -//.word 0x0ffe40bb -//.word 0x32070fd0 -//.word 0xb288c548 -//.word 0xc0422a9b -//.word 0x8016ae49 -//.word 0x0226fd1f -//.word 0x7438d5b6 -//.word 0x965b143e -//.word 0x6ecc1679 -//.word 0x3c1a3d0a -//.word 0xb089d1f0 -//.word 0x5bb40b4e -//.word 0x64776c6d -//.word 0x7c0c5303 -//.word 0x1374cfb6 -//.word 0xcc19b2dc -//.word 0x2fb1e785 -//.word 0x9f6505bb -//.word 0x8b332308 -//.word 0xe891ef39 -//.word 0xde53fa62 -//.word 0xc1ce5622 -//.word 0x443e6328 -//.word 0xe965e6f6 -//.word 0xbc755be5 -//.word 0x41308d6a -//.word 0xab4e6397 -//.word 0x4e1ffde5 -//.word 0x5771ff30 -//.word 0xbbb42d03 -//.word 0x6d5c3916 -//.word 0xd487d815 -//.word 0x7ce01ba3 -//.word 0x0cc3fd9f -//.word 0x78a239a6 -//.word 0x77a75ed9 -//.word 0x389a24e0 -//.word 0x5006012f -//.word 0xf897f887 -//.word 0x75c7b2c0 -//.word 0xd7b9cfc7 -//.word 0xe6657ee3 -//.word 0x5af64b3c -//.word 0x4a70399d -//.word 0xe7961179 -//.word 0x6a0bf92c -//.word 0x4bb74884 -//.word 0xb46c9980 -//.word 0x35ca1f57 -//.word 0xb96038bc -//.word 0xb9134461 -//.word 0xafc4b7ba -//.word 0xce2d6d03 -//.word 0xf00c3e84 -//.word 0xd084d314 -//.word 0x79c0b7dc -//.word 0xfed9b15d -//.word 0x6cfa52b5 -//.word 0xfdc2ca1d -//.word 0x8ee900b7 -//.word 0x5327e187 -//.word 0xca51f7be -//.word 0xedc63e3f -//.word 0xac09345c -//.word 0x9aaf30e0 -//.word 0xe77cf453 -//.word 0x8ec98579 -//.word 0xcf283b1c -//.word 0xe04b140b -//.word 0xe0224d63 -//.word 0x0c44340d -//.word 0x35903888 -//.word 0x721442e9 -//.word 0x122e4820 -//.word 0xd4f01f7c -//.word 0x5bc99072 -//.word 0xdc62af9a -//.word 0x1ac768fa -//.word 0x94c75b87 -//.word 0xfc9deae9 -//.word 0xecd08f7f -//.word 0xd55773a3 -//.word 0x38013d2f -//.word 0x1814283f -//.word 0xaf345939 -//.word 0x60876f0b -//.word 0xed175bb4 -//.word 0xea787206 -//.word 0x71aac0aa -//.word 0x1840a064 -//.word 0x20c28a98 -//.word 0xef512b0e -//.word 0xc089bbf2 -//.word 0x9aac8b1f -//.word 0x7efcdd9d -//.word 0xe568f967 -//.word 0x6a6b7d72 -//.word 0xc332f5ec -//.word 0xf5fdabc1 -//.word 0xc8c7c164 -//.word 0x79297ccc -//.word 0xb07ce3bd -//.word 0xb13e8948 -//.word 0xd6b6a795 -//.word 0x3ddb6de0 -//.word 0xbe739ac2 -//.word 0x20784bb2 -//.word 0x8cbf10cb -//.word 0x41dc45d0 -//.word 0x8a40a06d -//.word 0xeda406bf -//.word 0xa6aba317 -//.word 0x54c239fb -//.word 0xf14bb86e -//.word 0x07fc1072 -//.word 0x218143ca -//.word 0x8069be04 -//.word 0x103fe9b7 -//.word 0x9bf7fd0a -//.word 0x3b8d1675 -//.word 0x15e889cc -//.word 0x44047779 -//.word 0x1450a208 -//.word 0x715580ea -//.word 0x9f998e72 -//.word 0x2bc3e724 -//.word 0x21ff152f -//.word 0x7fa42738 -//.word 0xea150359 -//.word 0xa0e5fe6a -//.word 0xae3eaa7f -//.word 0x6383efb1 -//.word 0x04345e22 -//.word 0xc112c13b -//.word 0xe884f738 -//.word 0x593affe7 -//.word 0x3a1052ac -//.word 0xeb3576c9 -//.word 0x3c8cd0dc -//.word 0xde52baa9 -//.word 0x1802d51a -//.word 0xbb75a084 -//.word 0x584e4a2c -//.word 0xb095c50a -//.word 0x6ca21ccd -//.word 0x0f3d061f -//.word 0x2803bb29 -//.word 0xcc0c065a -//.word 0x43ca9c64 -//.word 0x0234ac88 -//.word 0xd924b714 -//.word 0x6efea22a -//.word 0xea930ac2 -//.word 0xf245d7f2 -//.word 0xd96b146e -//.word 0x14f7fe4b -//.word 0xee565a08 -//.word 0x7d970cce -//.word 0xd4d0e6f7 -//.word 0x7abdbece -//.word 0x1babc395 -//.word 0x7e9411cd -//.word 0xb78c82b1 -//.word 0x9e5bc704 -//.word 0x7f6cb80c -//.word 0x13e6e9df -//.word 0xaf187edd -//.word 0xbc1a407e -//.word 0x67b1f04e -//.word 0x9974db35 -//.word 0x2a2daefc -//.word 0x52828c0d -//.word 0x60d55e7a -//.word 0xae686a41 -//.word 0xd4c528cf -//.word 0x1c5d50c2 -//.word 0x366f38f3 -//.word 0x2d2b5db4 -//.word 0x9a183f56 -//.word 0x18b373ef -//.word 0xf759f359 -//.word 0x3566b87e -//.word 0xa99f8bd3 -//.word 0x82cd1823 -//.word 0xf0ab448e -//.word 0x2102c0d1 -//.word 0x6f13dec8 -//.word 0xd835a431 -//.word 0xaebf20b2 -//.word 0x8f28fa1e -//.word 0x986d50f4 -//.word 0xd6b3bd28 -//.word 0xfd2ebb26 -//.word 0x5d412c15 -//.word 0x11e73358 -//.word 0x7a51485b -//.word 0xecd18c8c -//.word 0xa6f659a7 -//.word 0x08f91e37 -//.word 0x00576a5a -//.word 0xc6c046c4 -//.word 0xc930c806 -//.word 0xe95ce510 -//.word 0xe64f87f5 -//.word 0x1855dfef -//.word 0x6118fda3 -//.word 0x61099ea6 -//.word 0xe801453f -//.word 0xb1288d6f -//.word 0x4d17bd2e -//.word 0x5d399df8 -//.word 0x04778888 -//.word 0x9c14c3e4 -//.word 0xa8d50d99 -//.word 0x0a667748 -//.word 0x77f97661 -//.word 0x2730372f -//.word 0xd13d3215 -//.word 0xd6480217 -//.word 0xbd10749b -//.word 0xdfd6de71 -//.word 0x6377b212 -//.word 0x6dd85225 -//.word 0x93862648 -//.word 0x919eed0c -//.word 0x3deb5041 -//.word 0xbd4fbd75 -//.word 0xf76472b7 -//.word 0x4962d8a1 -//.word 0x7a441395 -//.word 0xf126d746 -//.word 0x25f27d7a -//.word 0x553b560f -//.word 0x79693f3c -//.word 0x7817751a -//.word 0x9bb9ab63 -//.word 0x42825a79 -//.word 0xd68559aa -//.word 0xfe1aadb2 -//.word 0x1683a281 -//.word 0xddcf1b3f -//.word 0x6dff268e -//.word 0x7168d30f -//.word 0x92584727 -//.word 0x32fc0c03 -//.word 0x5d81abd9 -//.word 0xfc7a7d71 -//.word 0x4c82bee5 -//.word 0x8f22e3a5 -//.word 0x02f52dbd -//.word 0x0e097f5b -//.word 0xc2896d8b -//.word 0x81999546 -//.word 0xf88232ab -//.word 0x530fee8c -//.word 0xb137f82c -//.word 0xd5fb5747 -//.word 0x1e927e53 -//.word 0xb9c42006 -//.word 0x15944518 -//.word 0x97219e4a -//.word 0x90ce15a7 -//.word 0x6ca1a90a -//.word 0x2ce979e0 -//.word 0x16241e2f -//.word 0xaa1f3ed8 -//.word 0xd95f5e19 -//.word 0x72c0f855 -//.word 0xdd5cce18 -//.word 0x0bae7d56 -//.word 0xadf855f3 -//.word 0xa4e16888 -//.word 0xb963e165 -//.word 0x8fe498d2 -//.word 0xd5a3e39b -//.word 0xc056aecb -//.word 0xb912ceb7 -//.word 0x536a923e -//.word 0x7fdb9b50 -//.word 0x0368eead -//.word 0x288148ef -//.word 0xb329b2cb -//.word 0x17585494 -//.word 0xe99e8e00 -//.word 0x940a452f -//.word 0x4e4a7be9 -//.word 0x4b132328 -//.word 0x30c433d6 -//.word 0xca46fad7 -//.word 0x0036b44a -//.word 0x06465c0c -//.word 0xd4e0c17e -//.word 0xd70ddc89 -//.word 0xe69661df -//.word 0x77699483 -//.word 0x133d5e8b -//.word 0x0779a025 -//.word 0x5d52c7d8 -//.word 0x0a34a10c -//.word 0x69646fcd -//.word 0xe8e33bcc -//.word 0x02956ba6 -//.word 0x6da29769 -//.word 0x941d9855 -//.word 0x47e4e1df -//.word 0xb1c713fc -//.word 0x8beccb9b -//.word 0x9071be73 -//.word 0x31540900 -//.word 0x8990c2c8 -//.word 0x9389d3e3 -//.word 0x9baa08ba -//.word 0xf24d660f -//.word 0xe6dbbf3e -//.word 0xf13483c2 -//.word 0x3151d9fa -//.word 0x1828ee2d -//.word 0x65cf8dcd -//.word 0x53e5f1f8 -//.word 0x102ed744 -//.word 0x707dd7bc -//.word 0xe3d7f326 -//.word 0xa5d57188 -//.word 0x344ae6ea -//.word 0x0726945c -//.word 0x7d9af53b -//.word 0x147d98b1 -//.word 0xdbef2c7b -//.word 0x2a3cdbef -//.word 0x9003d93d -//.word 0x0d973cf5 -//.word 0x81a50ec9 -//.word 0x6517a095 -//.word 0xb939229c -//.word 0x3d1a7114 -//.word 0xe43630e6 -//.word 0x86511aaf -//.word 0xd5a6960a -//.word 0x92418c11 -//.word 0x01aa7821 -//.word 0x9ac3bdde -//.word 0x01f33b77 -//.word 0x3884232c -//.word 0x144a0a0d -//.word 0xed863d04 -//.word 0x9a095515 -//.word 0x9c9d0be5 -//.word 0x9aa04d79 -//.word 0x0ef29141 -//.word 0x3d126955 -//.word 0x6c8357fe -//.word 0x5175e378 -//.word 0xc8a1ecf6 -//.word 0xc7753ce7 -//.word 0x94715f78 -//.word 0x35d1b45a -//.word 0x296cc4c5 -//.word 0x55dcd3bd -//.word 0x41dfb594 -//.word 0x84fde3b0 -//.word 0x7d6bce8e -//.word 0x44307307 -//.word 0xe08630d2 -//.word 0xbb83d64b -//.word 0x53f8ff72 -//.word 0x319aa237 -//.word 0x1f5fe4f5 -//.word 0x962b313c -//.word 0x76ac8cd3 -//.word 0xf98223fd -//.word 0xeaa427fc -//.word 0x12ffdad4 -//.word 0xf460ea51 -//.word 0xba93fd4b -//.word 0x6ecd8d29 -//.word 0x6d47f6a4 -//.word 0x192ccdce -//.word 0xcfb57452 -//.word 0x1992ebfd -//.word 0x248de97d -//.word 0x746a2c69 -//.word 0xd6110d82 -//.word 0x96ef5739 -//.word 0xf3995971 -//.word 0xd0b23a85 -//.word 0xac108d8d -//.word 0xd41a25dd -//.word 0xd7742bcf -//.word 0x3bdf6dc3 -//.word 0x6e5af963 -//.word 0xff8deb2c -//.word 0x0e68832a -//.word 0x02087b02 -//.word 0x7ada9736 -//.word 0x85027da5 -//.word 0x15fec751 -//.word 0xb1865765 -//.word 0x6bb7ea77 -//.word 0x1271f00a -//.word 0xa8fe9c57 -//.word 0x16f4374d -//.word 0x1f5cb9d6 -//.word 0x93139a5c -//.word 0xc571e68c -//.word 0x3e299059 -//.word 0xb3700844 -//.word 0x35620fdb -//.word 0xa8a1cb80 -//.word 0x763f166c -//.word 0x85de1cf4 -//.word 0x6615250a -//.word 0xcf16af06 -//.word 0x4b8ec0a7 -//.word 0x30cd7a54 -//.word 0xd127f0a8 -//.word 0xf69a382e -//.word 0x89b1c269 -//.word 0x92a7e718 -//.word 0x66d0c5b7 -//.word 0x1a354b49 -//.word 0x3e7e9055 -//.word 0xc816692f -//.word 0x4f893a78 -//.word 0x7a310ce8 -//.word 0xb711e04b -//.word 0x300143ca -//.word 0xfb0c236c -//.word 0x9016e1dd -//.word 0x81c1a76d -//.word 0x6592fc5b -//.word 0x15509654 -//.word 0x1cad6f37 -//.word 0x68291b1b -//.word 0x46325893 -//.word 0x8d90e731 -//.word 0x18009a48 -//.word 0x7a1faff6 -//.word 0xee8a5c62 -//.word 0x8d44ab43 -//.word 0xc45888a2 -//.word 0x04bf18e0 -//.word 0xbb834dfa -//.word 0x8425b80c -//.word 0x9a3d9e14 -//.word 0x93604df9 -//.word 0x4b46b0cc -//.word 0x1e2c224d -//.word 0x5a7880b1 -//.word 0xf39c82a2 -//.word 0x793c4b88 -//.word 0x48933e07 -//.word 0xff1314c8 -//.word 0x334b2b7d -//.word 0x640e211f -//.word 0x2fd2a27a -//.word 0xc6567eec -//.word 0x9e88ff6a -//.word 0x67a579c3 -//.word 0x41a22229 -//.word 0x2dcb24ed -//.word 0xc1aaf18a -//.word 0x212ad7e5 -//.word 0x2afcd4d3 -//.word 0xf03aabdc -//.word 0x6b4a373f -//.word 0x6d060035 -//.word 0xd7190c7a -//.word 0x0dacf80a -//.word 0xa7434728 -//.word 0x6ae1f9a5 -//.word 0x76735f5f -//.word 0xc06b2f08 -//.word 0xc3acd429 -//.word 0x73a60766 -//.word 0x73c2a303 -//.word 0x8700b5a7 -//.word 0x4cded360 -//.word 0x277db0e8 -//.word 0x7bffed27 -//.word 0x1f3331f8 -//.word 0x0f747b30 -//.word 0x61ceb7dd -//.word 0x7b6390cb -//.word 0x840d864d -//.word 0x18454039 -//.word 0x40442335 -//.word 0xa1672331 -//.word 0xf3d8d935 -//.word 0xb56bd65d -//.word 0x1fc63822 -//.word 0x59c57bda -//.word 0xea1d9182 -//.word 0x733f34bc -//.word 0x9d7f7b14 -//.word 0x5075ab87 -//.word 0x26a35046 -//.word 0x1f598db7 -//.word 0x96d6b1bd -//.word 0x73b00a39 -//.word 0xa376fed1 -//.word 0xc59357f0 -//.word 0x2675df0d -//.word 0xf0ef2d31 -//.word 0x9edcbeb3 -//.word 0xb3064846 -//.word 0xac464a37 -//.word 0x33ece8ef -//.word 0x9560f6bf -//.word 0x760a53dd -//.word 0xc47078a9 -//.word 0xe99e5035 -//.word 0x45cb4b05 -//.word 0xdb39ae13 -//.word 0x4a5d2d16 -//.word 0x0040bb04 -//.word 0xaa25a1d6 -//.word 0xee6ccd8b -//.word 0x5db66d6f -//.word 0xa34abd9d -//.word 0x01b81dc3 -//.word 0xfebc6725 -//.word 0x59647fe5 -//.word 0x41752c81 -//.word 0xc80c269d -//.word 0x96817003 -//.word 0xda90e7e8 -//.word 0x87bb1c71 -//.word 0xbcea5f75 -//.word 0x83551c85 -//.word 0xbfa36b29 -//.word 0x6053e26d -//.word 0xd95cad9c -//.word 0xd410e14c -//.word 0x24460e9a -//.word 0xfbb814b7 -//.word 0x5daa37a4 -//.word 0xd4cd7539 -//.word 0x6662166c -//.word 0xc4a286d0 -//.word 0xc45e605c -//.word 0x11e3cb6e -//.word 0x2120090f -//.word 0x680b4d79 -//.word 0xcc40cdd7 -//.word 0x58eb194b -//.word 0x34e9ab35 -//.word 0xd52abfb3 -//.word 0x715a6564 -//.word 0xb6c0d472 -//.word 0xbb6601cf -//.word 0x377a70be -//.word 0xf1f44a96 -//.word 0x7779b1c2 -//.word 0x137f500d -//.word 0xfbb3361d -//.word 0xc897e43c -//.word 0x2970a45f -//.word 0xd95f1d60 -//.word 0xcece258f -//.word 0xb40dd669 -//.word 0x993de4a7 -//.word 0xea6e2d7b -//.word 0x9e049216 -//.word 0xb15f066d -//.word 0xd4bbe43d -//.word 0x6354864c -//.word 0x97ce13f3 -//.word 0xfdd598d9 -//.word 0x26015b01 -//.word 0xa0fc6c07 -//.word 0x26e67ca6 -//.word 0x14f8f27e -//.word 0x1e683c14 -//.word 0x408d631b -//.word 0xf844e3f2 -//.word 0xb492b96d -//.word 0x868bbdd8 -//.word 0x1f723239 -//.word 0xfb219cd6 -//.word 0xd9abd1f7 -//.word 0x6e4153ed -//.word 0x5a52dd53 -//.word 0x5bf63c94 -//.word 0xc18d60ae -//.word 0x22a3b335 -//.word 0x4e18aa9a -//.word 0x857d99ad -//.word 0xe8c0cb61 -//.word 0x2e0cd2cf -//.word 0x98eb1c7e -//.word 0x27aec7e2 -//.word 0x0c0eb622 -//.word 0x6013e51f -//.word 0x1535f9b1 -//.word 0x2dc21c33 -//.word 0x297f0743 -//.word 0xc59260c3 -//.word 0xe29f4723 -//.word 0xc4322ce3 -//.word 0x7d5de353 -//.word 0xa9a2fa9e -//.word 0x5c124a06 -//.word 0x59b7cc71 -//.word 0x8530ae25 -//.word 0x9b9ba6d0 -//.word 0x20b887cb -//.word 0x9a4a129f -//.word 0xfdc10ec9 -//.word 0x66179bba -//.word 0x0bf8c322 -//.word 0x7225526e -//.word 0xe21ae78f -//.word 0x18ef4cfe -//.word 0x3a7c03fd -//.word 0x11c0211f -//.word 0x7284600a -//.word 0xfd3b6f7c -//.word 0x0b2d8c8c -//.word 0xe1d45533 -//.word 0x2a86db0a -//.word 0xa455f955 -//.word 0x1934e441 -//.word 0x915b026a -//.word 0xc6ec00a0 -//.word 0xd8d61feb -//.word 0x42f9cecc -//.word 0x0d8c7ec6 -//.word 0x43bcb21d -//.word 0xa79655de -//.word 0xa327511f -//.word 0x82e25d88 -//.word 0xdf421613 -//.word 0x5db0520f -//.word 0x99a6b16b -//.word 0x5d157531 -//.word 0x17049351 -//.word 0x897a09a0 -//.word 0xc19f7320 -//.word 0x4c1ed982 -//.word 0xa7cdcce9 -//.word 0xf690b1f1 -//.word 0xf87b5cf0 -//.word 0x3b36e17c -//.word 0x8ca6a62d -//.word 0xb2c9bda3 -//.word 0x5ce271cb -//.word 0x57d71f5f -//.word 0x04d748ac -//.word 0x0a3fe398 -//.word 0x48bff8e3 -//.word 0x0eb96aad -//.word 0x8ce91539 -//.word 0x8a4b18f0 -//.word 0x5a3974a9 -//.word 0x0bd4d727 -//.word 0xe0a6b2e3 -//.word 0x0086910c -//.word 0x6fbbaccd -//.word 0x3d64b9ce -//.word 0xfe1705fd -//.word 0x7ac8c38e -//.word 0xa5eca440 -//.word 0xd1dfa8e3 -//.word 0x22833317 -//.word 0x422b6356 -//.word 0x57b7a135 -//.word 0x320076e6 -//.word 0xc976a002 -//.word 0xe8076685 -//.word 0x2343281b -//.word 0x0fbe3a9a -//.word 0xb2b6f3cf -//.word 0x37f6007d -//.word 0xe6fafea3 -//.word 0x545449fe -//.word 0xd74f0ecf -//.word 0x3dd1a8de -//.word 0xbe8629bf -//.word 0x2e3a3654 -//.word 0x78871993 -//.word 0x47b11189 -//.word 0x06ceec9f -//.word 0x0b2ad81d -//.word 0x0fe977ec -//.word 0xe2ee31a0 -//.word 0x5cfcceb6 -//.word 0x971b4419 -//.word 0x5b3ecdeb -//.word 0xda223d83 -//.word 0x9e7993b2 -//.word 0xbf48ce4b -//.word 0x598e02e2 -//.word 0x3d26aad3 -//.word 0xe7ee4087 -//.word 0xb1290bf2 -//.word 0x46223960 -//.word 0x58132d72 -//.word 0x96441a63 -//.word 0xd877d190 -//.word 0x9d84d738 -//.word 0xb841bb80 -//.word 0x46a4a6ba -//.word 0xe32c34e6 -//.word 0x1e7c8279 -//.word 0x2a4a895e -//.word 0xd677aa3b -//.word 0xbe7f89f5 -//.word 0xc3141f76 -//.word 0xba060bae -//.word 0x616629d7 -//.word 0x97eb66fe -//.word 0xcc94d3bf -//.word 0xb68ff850 -//.word 0x455a6ac1 -//.word 0xda28a081 -//.word 0xb4860225 -//.word 0xaa3e4365 -//.word 0x207cf167 -//.word 0x342f4a41 -//.word 0x38b252b9 -//.word 0x65ac224e -//.word 0xcd35837d -//.word 0x923abb3d -//.word 0x5622a7cc -//.word 0xf2b10aad -//.word 0x6b2d25f2 -//.word 0x22c088b7 -//.word 0x4a1e27ef -//.word 0x9f67b063 -//.word 0x554f1cf7 -//.word 0x4f7c852f -//.word 0x923037f3 -//.word 0xf927098f -//.word 0x2ac3eefe -//.word 0xc866c768 -//.word 0xeb1f7be9 -//.word 0xcd8a4a94 -//.word 0xc6f15eb8 -//.word 0x7ab7a361 -//.word 0x51f7d922 -//.word 0x2768e812 -//.word 0x45847315 -//.word 0x90e9af5d -//.word 0x01ff7630 -//.word 0x55db97eb -//.word 0x06637147 -//.word 0x79b3c0db -//.word 0x79c0b6e2 -//.word 0xe43b4e3f -//.word 0xa4b9ddbe -//.word 0xe110e99d -//.word 0x75043f4b -//.word 0xa123406f -//.word 0xfeed7c2c -//.word 0xb63882a3 -//.word 0xf3d3f5ba -//.word 0x986ae31c -//.word 0x30a95382 -//.word 0x23a41d30 -//.word 0x3077ffc2 -//.word 0x1729ec28 -//.word 0x96d7a7f0 -//.word 0x970e91c3 -//.word 0xa878c033 -//.word 0xabbb50b4 -//.word 0xcf9efee7 -//.word 0xbf6ef21f -//.word 0x19a0dd1e -//.word 0x21b7441f -//.word 0xb7681c1a -//.word 0x86fc9643 -//.word 0x7ff73cd3 -//.word 0x86f73d0c -//.word 0x6ade0577 -//.word 0x1b331171 -//.word 0x17c602e5 -//.word 0x2693f05b -//.word 0x47e90032 -//.word 0xeacc3929 -//.word 0x5f979325 -//.word 0x8fe6512e -//.word 0xeab291ba -//.word 0xa0be222e -//.word 0x143295a2 -//.word 0x8e8697e4 -//.word 0x2fa27ec0 -//.word 0x2b44217f -//.word 0x32a1edae -//.word 0x2f4f3521 -//.word 0x3562ca37 -//.word 0xb6d6cc5e -//.word 0xf72dbfda -//.word 0xc058e1c3 -//.word 0x58dbbb4d -//.word 0xb12df74d -//.word 0xdf5d71f8 -//.word 0xcefb91ed -//.word 0x3536d776 -//.word 0xc642b70a -//.word 0xa8fda817 -//.word 0x26d178ff -//.word 0xa9dce260 -//.word 0xe34e6299 -//.word 0x4e13488a -//.word 0xd5b30c9b -//.word 0xd076e1ff -//.word 0x36cb8c3a -//.word 0x0eea77e0 -//.word 0x27b901a0 -//.word 0x09ec1982 -//.word 0x2b710b6d -//.word 0x670b99ec -//.word 0xaa3d4e31 -//.word 0xf0690f5b -//.word 0x7039f3f4 -//.word 0x133e55be -//.word 0x2bd727af -//.word 0x6255883a -//.word 0xf05c99d0 -//.word 0x128c8da7 -//.word 0xb76100ba -//.word 0x7c588a11 -//.word 0xda549342 -//.word 0x9e3f6938 -//.word 0x9af48f33 -//.word 0x9b5d5910 -//.word 0x9bd8b5cb -//.word 0x37e04c42 -//.word 0x63e9ca3b -//.word 0x5c8b79a9 -//.word 0xdee3152b -//.word 0x9837dcd6 -//.word 0xddd8e434 -//.word 0x9c4db18c -//.word 0x92ad0764 -//.word 0xbe4dfd45 -//.word 0x159b53be -//.word 0x784a05ab -//.word 0xe3b020b8 -//.word 0xe76cd520 -//.word 0x5a4bccbb -//.word 0x4d6dbb37 -//.word 0x3ea336a5 -//.word 0x8f1cc938 -//.word 0x3741444a -//.word 0xb8dd56a0 -//.word 0x51815def -//.word 0x74277d9f -//.word 0x7a15efce -//.word 0x96049c98 -//.word 0x0782eb96 -//.word 0x9295d7a4 -//.word 0x30a144e8 -//.word 0x048b9310 -//.word 0x8f1f74da -//.word 0x27affbda -//.word 0xa5fdf778 -//.word 0x5f5c7f38 -//.word 0x5611cd3e -//.word 0xb0ff5011 -//.word 0x6884fc9f -//.word 0x449ee581 -//.word 0x07520c81 -//.word 0xe84e7859 -//.word 0x44cd89be -//.word 0x90bb8a9d -//.word 0x911985a5 -//.word 0xcfa45b05 -//.word 0x47b11377 -//.word 0x605c737d -//.word 0x20e1cdea -//.word 0xa04a1ca5 -//.word 0xbd4b50aa -//.word 0x116ae551 -//.word 0x2262bad3 -//.word 0xd8ca210a -//.word 0x35f23278 -//.word 0x400e668b -//.word 0x4296611f -//.word 0x35ec0e45 -//.word 0x7a40f143 -//.word 0xcab1b9dc -//.word 0x6fb415d1 -//.word 0xb4bac9a7 -//.word 0x9a0d01ab -//.word 0xccfbe534 -//.word 0xd5376d28 -//.word 0x917c77c1 -//.word 0xe1731791 -//.word 0xa3d72ec4 -//.word 0xe2d73ea6 -//.word 0x49bc7c65 -//.word 0xdecb2717 -//.word 0xed6d19fe -//.word 0x418d9c0b -//.word 0x9a427ea2 -//.word 0x5cae689d -//.word 0x85266b93 -//.word 0xe192dc5a -//.word 0x811762ca -//.word 0x69f44dc4 -//.word 0x89aa2973 -//.word 0xef6093d2 -//.word 0x3a854c6f -//.word 0x52b78c6e -//.word 0x56e499d0 -//.word 0xd6af97f6 -//.word 0x4315a260 -//.word 0xa3501abb -//.word 0x89fb3e1b -//.word 0x4578fd85 -//.word 0x588f08b0 -//.word 0x2b572c0c -//.word 0x005adf04 -//.word 0x28f41980 -//.word 0x76fc65af -//.word 0xf5a63703 -//.word 0xd6a8807d -//.word 0xac9c802a -//.word 0xdca6dbee -//.word 0x4e56f080 -//.word 0x69d066b6 -//.word 0x3f2a0703 -//.word 0x0415d23e -//.word 0xc5c04ba4 -//.word 0x56f91621 -//.word 0x8d96c4cb -//.word 0xad13edaf -//.word 0x257c7fd1 -//.word 0x7b8d556e -//.word 0x83190c84 -//.word 0xd4a81295 -//.word 0x7c64ffa7 -//.word 0xf336298f -//.word 0x4e2c726f -//.word 0xb51e657e -//.word 0x17918207 -//.word 0x1cdbd5b5 -//.word 0x5c88ce0d -//.word 0xcefd4c3c -//.word 0x835bfb13 -//.word 0x94a6e050 -//.word 0x5927321f -//.word 0xdb0e6ce0 -//.word 0x8c5ca02b -//.word 0x36000e11 -//.word 0x3240f5a5 -//.word 0xda5ba9bc -//.word 0x406de6f0 -//.word 0x219264eb -//.word 0x144eabe2 -//.word 0x072d295f -//.word 0xeca68244 -//.word 0xb045270d -//.word 0x6d0a2a55 -//.word 0xe00c519b -//.word 0x1d616947 -//.word 0x8142dce8 -//.word 0xe96b86c0 -//.word 0x21c1c582 -//.word 0xa037cf5a -//.word 0x72f2492e -//.word 0x75ac1524 -//.word 0xc8566b64 -//.word 0x81012b1f -//.word 0x9efe71d0 -//.word 0x3f446ac1 -//.word 0x121367d1 -//.word 0x0ed73076 -//.word 0x644f9bfe -//.word 0xb2ee5d1a -//.word 0x7a821f9c -//.word 0xd413d580 -//.word 0x5f0e4b29 -//.word 0x7da300ee -//.word 0xc06b38d5 -//.word 0x9f4e4d9e -//.word 0x6ea44604 -//.word 0x8d9aaa3f -//.word 0xdfd797cd -//.word 0x7d600e72 -//.word 0xacb9917e -//.word 0x0d4ef04e -//.word 0x14116015 -//.word 0xbb63cddd -//.word 0x783871c8 -//.word 0x6c76a69c -//.word 0xdd9ff87e -//.word 0xe6b07ffe -//.word 0x6d496c54 -//.word 0x560de1e9 -//.word 0xf64c061a -//.word 0xcbe05938 -//.word 0x6a5445d3 -//.word 0xb84cf738 -//.word 0x5d206d38 -//.word 0x76cbcf2b -//.word 0x8a040335 -//.word 0xc0aa7cc8 -//.word 0x4f65526a -//.word 0x358b98b9 -//.word 0x2c40eaac -//.word 0xdae2451b -//.word 0x48a41b82 -//.word 0x9578a702 -//.word 0xec337fa8 -//.word 0xb3eb68f2 -//.word 0x05a46d8f -//.word 0x632c3367 -//.word 0xa64487db -//.word 0x3800394e -//.word 0x84712de4 -//.word 0xab81af89 -//.word 0x791d0736 -//.word 0x979a4d6f -//.word 0x02517f11 -//.word 0xbb8dd14a -//.word 0xc1a844e9 -//.word 0x3c707ad8 -//.word 0xfbcfc9e6 -//.word 0x20ac8eca -//.word 0x1a0cc465 -//.word 0xd47dd548 -//.word 0x2cb4af76 -//.word 0xa7751b6b -//.word 0x63b34a5d -//.word 0x4df9b1c1 -//.word 0x93081811 -//.word 0x5dc2edcd -//.word 0xb846ddc0 -//.word 0xd25da684 -//.word 0x6d152648 -//.word 0x8eabb8d1 -//.word 0x75aec1bf -//.word 0xd2628612 -//.word 0x366341ec -//.word 0xc88a7398 -//.word 0x39147bcc -//.word 0xfa01682b -//.word 0xacbb0c0e -//.word 0xd8f85184 -//.word 0xe0e1d198 -//.word 0x3574a0d2 -//.word 0xcb276c00 -//.word 0xcacec935 -//.word 0x87bec613 -//.word 0xb233c446 -//.word 0xd1ef8851 -//.word 0xec248e8d -//.word 0x8a94a06e -//.word 0xddf7a809 -//.word 0x3a9dc3d3 -//.word 0xcc5496ac -//.word 0x888ce51c -//.word 0x63b961dc -//.word 0xc3f9c298 -//.word 0x34f716f3 -//.word 0x5d0f59cc -//.word 0x32b345bf -//.word 0x6b0d6bef -//.word 0x34e58303 -//.word 0x26c6016f -//.word 0x765ce9f5 -//.word 0x6c21e36b -//.word 0x173992be -//.word 0x40992237 -//.word 0x9c6f20fd -//.word 0x45be8fdc -//.word 0x6b493844 -//.word 0x47b34195 -//.word 0x51e40199 -//.word 0xb3af1352 -//.word 0xfdb1a9f7 -//.word 0x1a7c2339 -//.word 0x83f5e1ca -//.word 0xb2fa5520 -//.word 0xda485c77 -//.word 0xd59cce15 -//.word 0x5e1953d1 -//.word 0x80ea79d6 -//.word 0x4e2804a5 -//.word 0xd5fe8659 -//.word 0x4f0b2f2f -//.word 0x9a07e545 -//.word 0xe8aa97a2 -//.word 0xb7c9cf77 -//.word 0x04c387a4 -//.word 0xbb1b3e7e -//.word 0x73664bd0 -//.word 0x58687020 -//.word 0x687ab233 -//.word 0xe32e68d3 -//.word 0xfc3693cf -//.word 0xd5826d44 -//.word 0xaaa9451b -//.word 0x4d8a89d3 -//.word 0xd2332580 -//.word 0x8b020b14 -//.word 0x370913de -//.word 0x76b70650 -//.word 0x80b5f505 -//.word 0x170fd003 -//.word 0xba94343d -//.word 0x1c7f835c -//.word 0xd4573abe -//.word 0x56137fbf -//.word 0x2282fa38 -//.word 0x3beae646 -//.word 0xdbf0684d -//.word 0x65b71f3c -//.word 0x9b4cfc12 -//.word 0x114254a1 -//.word 0xe1993391 -//.word 0xa1e5f4a9 -//.word 0x92ab0e4a -//.word 0x1a0f313c -//.word 0x75ac92ae -//.word 0xa7c48377 -//.word 0xb59946a2 -//.word 0x141a232a -//.word 0x62c2b802 -//.word 0x54be9158 -//.word 0xf04ef81b -//.word 0xfc6d0ebb -//.word 0xb6b41b30 -//.word 0xc57c233d -//.word 0x7043baf6 -//.word 0x0e511880 -//.word 0xbd9a7018 -//.word 0x57e77e56 -//.word 0xa23160b3 -//.word 0xc74da64a -//.word 0x06cfacdb -//.word 0xa7282815 -//.word 0x3411ff15 -//.word 0xe52d5d2a -//.word 0x5ce904db -//.word 0x92a8e42b -//.word 0x121dec1b -//.word 0x65f72171 -//.word 0xcdc4edb8 -//.word 0x360fb988 -//.word 0x69ccbe07 -//.word 0x83f717b0 -//.word 0xa5771b53 -//.word 0xee48eb5d -//.word 0xa6d9475a -//.word 0xbcb3a6b8 -//.word 0x735c85ce -//.word 0x587bff1d -//.word 0x773c9ed5 -//.word 0xcef6719b -//.word 0x020c5e89 -//.word 0x5111ba76 -//.word 0xc82f1778 -//.word 0xb6c95da8 -//.word 0x605f1d25 -//.word 0xf6b2215c -//.word 0xc6294886 -//.word 0xb0749171 -//.word 0xda6f7584 -//.word 0xa5497afe -//.word 0xdfe5057e -//.word 0x3a806fc8 -//.word 0xfc955cc6 -//.word 0xf9fd48cd -//.word 0xbe5b6322 -//.word 0x10b79fbd -//.word 0x9569074c -//.word 0xd039527b -//.word 0x53c4b873 -//.word 0x2f2204a0 -//.word 0xb0c5ebb8 -//.word 0x47a49cf9 -//.word 0xc89998b2 -//.word 0xd508c404 -//.word 0x9ac2bcea -//.word 0xbc296b77 -//.word 0x8b94d95f -//.word 0x7ff543b9 -//.word 0xe2b97103 -//.word 0xcaef4467 -//.word 0x4aad8f3c -//.word 0xe9af27d0 -//.word 0x53423e65 -//.word 0x4f60ec79 -//.word 0xf11d0f4b -//.word 0x1142559a -//.word 0xfc3797b0 -//.word 0x6826699f -//.word 0xae5defcb -//.word 0x33f4f2a8 -//.word 0x27b032c5 -//.word 0x7328fe0a -//.word 0xec26033e -//.word 0xcd5062cb -//.word 0x640805c6 -//.word 0x0b90322a -//.word 0x5a726064 -//.word 0x9b1f4a15 -//.word 0x7ed64313 -//.word 0x0fc7c9b1 -//.word 0xe4795c40 -//.word 0x9b6991d5 -//.word 0x84f4624d -//.word 0x9a76c88f -//.word 0xb8b48c11 -//.word 0x0977599e -//.word 0xc17a1756 -//.word 0x0a8674f6 -//.word 0x41dcc359 -//.word 0x63d30a3f -//.word 0xc2c2564e -//.word 0xfd205256 -//.word 0x2eea18d9 -//.word 0x654547cb -//.word 0x56655696 -//.word 0x4ead2861 -//.word 0x6c18e092 -//.word 0x0dd7f691 -//.word 0x883c8bcf -//.word 0x1cd6f908 -//.word 0x26deafc5 -//.word 0x97d13c24 -//.word 0xa65fa9db -//.word 0xc2840c7b -//.word 0xcbf55af2 -//.word 0x81bd7d54 -//.word 0x3d28a6db -//.word 0xdfe0e52c -//.word 0x0756f7db -//.word 0x88635f32 -//.word 0x1930b82e -//.word 0x4e5349cb -//.word 0xc73ada81 -//.word 0xa8cdc60f -//.word 0x484f5277 -//.word 0x2e853d4a -//.word 0x391b9825 -//.word 0x1e43d87c -//.word 0x189f2a96 -//.word 0xda6106d9 -//.word 0xc9b10748 -//.word 0x684ffa4a -//.word 0x137935ad -//.word 0xf10f2aea -//.word 0x24f53bab -//.word 0x42b9d08a -//.word 0x0975a71c -//.word 0x4ef76c2e -//.word 0x37208a4e -//.word 0xaa8a408e -//.word 0x056df784 -//.word 0x10c4d395 -//.word 0x30ab8874 -//.word 0xdd0c6fe5 -//.word 0x557ad9c7 -//.word 0x925da351 -//.word 0x7a500a9c -//.word 0x57c7c161 -//.word 0x86f54105 -//.word 0x73ed61d2 -//.word 0xc5072688 -//.word 0xd585dc14 -//.word 0x6576659f -//.word 0x8fdbd2ca -//.word 0xfb093038 -//.word 0x554ea44e -//.word 0xfed7bb36 -//.word 0x02d1fb2a -//.word 0x4bcfbeef -//.word 0x146c409f -//.word 0xa031f6ac -//.word 0x2bb92122 -//.word 0x2112a42c -//.word 0x8e6712da -//.word 0xd5dc0c21 -//.word 0xa6baca24 -//.word 0x2accf7b1 -//.word 0x8009c20f -//.word 0x6d7232f7 -//.word 0x4f3eb9e0 -//.word 0x53350d80 -//.word 0xe85a338f -//.word 0x74ccdcce -//.word 0x45eef548 -//.word 0xcac67ad7 -//.word 0x03a38beb -//.word 0x3603c187 -//.word 0xe4b3c28c -//.word 0xfb38133a -//.word 0x4d6e2ef4 -//.word 0x416fd543 -//.word 0xc8b6a51e -//.word 0x9385ee69 -//.word 0x8483c2bb -//.word 0x62aa4c64 -//.word 0xd06063af -//.word 0x80e45f64 -//.word 0xa4ec2c91 -//.word 0xa58d9d8a -//.word 0x185a022f -//.word 0xeed0fc6d -//.word 0xeaf29008 -//.word 0x59307b97 -//.word 0xfd8dc5d0 -//.word 0x4a019905 -//.word 0xd51c54ef -//.word 0x09eddcab -//.word 0x1b223302 -//.word 0x41704ced -//.word 0x1f361d58 -//.word 0x825df527 -//.word 0x51821077 -//.word 0xc1576926 -//.word 0xc746cf95 -//.word 0xd3583bac -//.word 0xbb56611f -//.word 0xf52e85f0 -//.word 0x0a979036 -//.word 0x47f8631c -//.word 0xb6866b2c -//.word 0x4dad75ce -//.word 0x64b2c40b -//.word 0x6d966197 -//.word 0xdf3db30f -//.word 0x73d04f7f -//.word 0x935f1127 -//.word 0x0fcb6c7f -//.word 0x13e3fe78 -//.word 0x56cd6805 -//.word 0x93a85cda -//.word 0x3d6ff873 -//.word 0x6f205259 -//.word 0x221e54a1 -//.word 0xa2d4cab5 -//.word 0x439cb957 -//.word 0x4fdff2e2 -//.word 0x447de8d3 -//.word 0x3c6fbf89 -//.word 0xadaba549 -//.word 0x52476585 -//.word 0x69e2395e -//.word 0x1f40e067 -//.word 0x4934f1ac -//.word 0x54c36ff3 -//.word 0x7f869d41 -//.word 0x475014a0 -//.word 0x23111220 -//.word 0x72fa151c -//.word 0xb2e2a9be -//.word 0xf2e97ec5 -//.word 0x8a5bbd86 -//.word 0x09d79c31 -//.word 0x6fb03156 -//.word 0x9d9383a8 -//.word 0x096ae700 -//.word 0xb6818aa5 -//.word 0x64e74aca -//.word 0x0418ca58 -//.word 0x6ed8c5ee -//.word 0x5662a226 -//.word 0x7cc2491b -//.word 0x24803628 -//.word 0xc67ecbf2 -//.word 0x0623eba8 -//.word 0xe6b9c489 -//.word 0x3b14eca7 -//.word 0x5e75b0eb -//.word 0x23aea95a -//.word 0x0f869096 -//.word 0xc55e52a8 -//.word 0xc21567fc -//.word 0x4a2a60ad -//.word 0xa220c004 -//.word 0x80270d3b -//.word 0xc0f82786 -//.word 0x5801d854 -//.word 0x8ec2abd1 -//.word 0x697702b0 -//.word 0x65f76329 -//.word 0x6adc133d -//.word 0xffe4e641 -//.word 0xbc97559a -//.word 0xfd2ad1c6 -//.word 0xdea4579c -//.word 0x633f45d4 -//.word 0xf6116cc9 -//.word 0x17eb667e -//.word 0x4f8229df -//.word 0x65ccdd4a -//.word 0xd5adeb4e -//.word 0x7ed357b3 -//.word 0x9bdf4fba -//.word 0xf4c504a5 -//.word 0x5675b87a -//.word 0x40bb1805 -//.word 0xdf63cd1c -//.word 0x3ca24e27 -//.word 0xb5b1f8df -//.word 0xaabb6055 -//.word 0x78f9e836 -//.word 0xab1c904e -//.word 0x6feb0f4c -//.word 0x482d23c5 -//.word 0x03c9257b -//.word 0xed2ce0de -//.word 0x42eba3d3 -//.word 0xe8a995b5 -//.word 0x5d3c4999 -//.word 0xef0b92d7 -//.word 0x2bba99c6 -//.word 0x970a2cc6 -//.word 0xa4fa5984 -//.word 0xde333c79 -//.word 0x66a215b4 -//.word 0xa2679dda -//.word 0x33ee9b6b -//.word 0x275bb246 -//.word 0x702c7d70 -//.word 0x9519de11 -//.word 0xa83f92bf -//.word 0x787e09ff -//.word 0x07207509 -//.word 0x3fbb22cc -//.word 0xe0580532 -//.word 0xbdd497a5 -//.word 0x2887e4d2 -//.word 0xab24dead -//.word 0xf9e0f8b5 -//.word 0x23d7f079 -//.word 0x0fabec5b -//.word 0x276ec994 -//.word 0x4ec2b078 -//.word 0x183eeafb -//.word 0x3a14f575 -//.word 0x3ff1d7a2 -//.word 0x7d25b2ed -//.word 0x480499ee -//.word 0x658ca231 -//.word 0xc1483c39 -//.word 0x6373c3c4 -//.word 0xa0615251 -//.word 0x8e1bd9e0 -//.word 0xbb4a6ff9 -//.word 0x1e56e9ef -//.word 0x4dceab66 -//.word 0xf10bbe13 -//.word 0x771023c3 -//.word 0x09b5679f -//.word 0xbd0578ae -//.word 0x0ce4b79b -//.word 0x85f54eb9 -//.word 0xc2bac444 -//.word 0x9cfdcfea -//.word 0x9b6f6989 -//.word 0xb090253b -//.word 0x27cec490 -//.word 0xd7f1031a -//.word 0x9cb6b82f -//.word 0x07ba1dea -//.word 0x539a6c73 -//.word 0x9b59ac80 -//.word 0x4b02ca1c -//.word 0xd58eeba8 -//.word 0xa507011f -//.word 0x56ee9c9e -//.word 0x26db0423 -//.word 0xa7638494 -//.word 0xb83e0804 -//.word 0xb4a9eb33 -//.word 0xe90a0a53 -//.word 0x4cd31d12 -//.word 0x6aa847d4 -//.word 0xa2c4eb40 -//.word 0x92800000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x000142A8 -//// expected output -//.word 0x97dd0fa2 -//.word 0xb0afe26a -//.word 0xf1ee630a -//.word 0x4b1b0f7c -//.word 0x075753a7 -//.word 0x9e1f7303 -//.word 0xc0577d86 -//.word 0x9d23f117 -//.word 0xc4a8611e -//.word 0x845cc406 -//.word 0x5f6a85b9 -//.word 0xa2e0a684 -//.word 0x883236d6 -//.word 0xfa65cd77 -//.word 0x2363f1a2 -//.word 0x6ee85bdc -//// SHA512LongMsgvector_104 -//// vector length -//.word 0x000145C0 -//// input message -//.word 0x40021d58 -//.word 0xf36b960c -//.word 0xb8bffa07 -//.word 0x98ec4acf -//.word 0x50cdc63a -//.word 0xb2ff6bdf -//.word 0x49f0bbca -//.word 0x3c38bc74 -//.word 0x742d43f2 -//.word 0x01b1726c -//.word 0xba4f80d1 -//.word 0x2487b8c9 -//.word 0x9665c5eb -//.word 0x9a592c31 -//.word 0x95421aa8 -//.word 0xabcc606c -//.word 0xddfcbcd4 -//.word 0x74095aea -//.word 0xa36e9a1e -//.word 0x683d143b -//.word 0xb3b6da99 -//.word 0xca18fc95 -//.word 0xecb7523e -//.word 0x344f7551 -//.word 0xc1980f68 -//.word 0x141a556e -//.word 0xb943d156 -//.word 0x2ab7650c -//.word 0xf0e78dac -//.word 0x0be5e4f3 -//.word 0x9477eaf3 -//.word 0xa16a040a -//.word 0x6928c414 -//.word 0xa98d6be0 -//.word 0x46f7ace1 -//.word 0x339cb326 -//.word 0x9521668c -//.word 0x2568eb33 -//.word 0xd6a96a2e -//.word 0xb9c4147f -//.word 0x1dd56442 -//.word 0xfa09a428 -//.word 0x90b1b427 -//.word 0x4b950770 -//.word 0xea8beea2 -//.word 0xe048193d -//.word 0xfa755a59 -//.word 0x4306ad98 -//.word 0x25c77659 -//.word 0xd037092e -//.word 0xe09a6f91 -//.word 0x394a68d2 -//.word 0x364eac54 -//.word 0x042d76f9 -//.word 0x480443db -//.word 0x08d7d73d -//.word 0xc82582c1 -//.word 0xf3bfa1db -//.word 0x7dda6785 -//.word 0xc762de34 -//.word 0xc391280b -//.word 0x58c10b4f -//.word 0x087ead1c -//.word 0xd0e09b56 -//.word 0x4f1710e1 -//.word 0x2b487515 -//.word 0xb198246c -//.word 0xbb86717e -//.word 0xd77deb30 -//.word 0xa5a9df28 -//.word 0x810b1e84 -//.word 0x62c800cb -//.word 0x02c7a923 -//.word 0x407a8bc5 -//.word 0xc2fc2caf -//.word 0xde5d2a98 -//.word 0xbb3a7c29 -//.word 0xb390fa6a -//.word 0xfcd1207b -//.word 0x88380f84 -//.word 0x295ad4ee -//.word 0xf9ffedd4 -//.word 0xf92f09b4 -//.word 0xf890106b -//.word 0xb7ef6360 -//.word 0x4a1c65ff -//.word 0xc1fb3a69 -//.word 0x08d8cf69 -//.word 0x0cfb1aab -//.word 0x1f7ca328 -//.word 0x9e5943e5 -//.word 0xd1c62bdd -//.word 0x12c4293b -//.word 0x32f527cd -//.word 0x18aff5b6 -//.word 0xab4f4863 -//.word 0xf3d002c0 -//.word 0x7a9cb3ab -//.word 0xf9a160a9 -//.word 0x30a884d7 -//.word 0x16e25524 -//.word 0x32c448be -//.word 0x4915d7ca -//.word 0x39468258 -//.word 0x25011496 -//.word 0xd2042743 -//.word 0x5130ea67 -//.word 0xdfdd2242 -//.word 0x09716f82 -//.word 0x1431d1b9 -//.word 0x9b576a0d -//.word 0x7a648632 -//.word 0xebb7d895 -//.word 0xef5f06da -//.word 0xf02e6989 -//.word 0xa40e0e04 -//.word 0x349800bd -//.word 0x9ee3c9a5 -//.word 0x589a36e8 -//.word 0x36525bd7 -//.word 0x8d1ad725 -//.word 0x99535957 -//.word 0x1cc26376 -//.word 0x48e34e07 -//.word 0xdf808f3d -//.word 0x9983386c -//.word 0xc609c2c1 -//.word 0x34b70931 -//.word 0x535198af -//.word 0x978827a2 -//.word 0x1e146296 -//.word 0x9303ec31 -//.word 0x5251a469 -//.word 0xccb827f5 -//.word 0x2dc99601 -//.word 0x3d3c9926 -//.word 0x8485a399 -//.word 0xb2a878a3 -//.word 0x3e4ded51 -//.word 0x4c17ef6c -//.word 0xd432c7ab -//.word 0x012b9c28 -//.word 0xd7053a11 -//.word 0x198912a0 -//.word 0x6add814d -//.word 0xb2585542 -//.word 0xc3958d0f -//.word 0x3dc6609f -//.word 0xae4b816a -//.word 0xfe84a2ed -//.word 0x0be33757 -//.word 0x90457c86 -//.word 0x4b82b931 -//.word 0x5f42c467 -//.word 0xf713c838 -//.word 0x2cb946b2 -//.word 0x29c5590f -//.word 0x8c6a3e2c -//.word 0x108b133d -//.word 0x6918dfc0 -//.word 0x709bd3af -//.word 0x800ed0fa -//.word 0x20f02934 -//.word 0xe298a98c -//.word 0x8bc8d800 -//.word 0x73857acd -//.word 0x2f26592a -//.word 0x6eac4435 -//.word 0x2151582e -//.word 0xdf647ee3 -//.word 0x8753356b -//.word 0x270a9217 -//.word 0x1c7b84a6 -//.word 0x7b7e5db8 -//.word 0xb0dc8e86 -//.word 0x65a6b2cf -//.word 0xa6cccf16 -//.word 0x42ead80a -//.word 0x74657646 -//.word 0xc2b7073a -//.word 0x2607e869 -//.word 0x6cfdefd6 -//.word 0xdbd43cb8 -//.word 0x17b13275 -//.word 0x4633c0ce -//.word 0x724be557 -//.word 0x2e4e732b -//.word 0x7d4813dd -//.word 0xef9489b2 -//.word 0x0da9390d -//.word 0xf737ea2a -//.word 0x4c73cb0f -//.word 0x4aaeb3c0 -//.word 0x372dadb3 -//.word 0xff35b483 -//.word 0x1e65bbe8 -//.word 0xc049f1e7 -//.word 0x272b4246 -//.word 0x4e2c2143 -//.word 0xcc948586 -//.word 0xfa673153 -//.word 0x58393904 -//.word 0x2d42c2b7 -//.word 0x6eb50944 -//.word 0xe14ea772 -//.word 0x822a136a -//.word 0x26dc686b -//.word 0x5ebd68c0 -//.word 0x9e83c1ef -//.word 0x9f169034 -//.word 0x019f242d -//.word 0x35e104d7 -//.word 0x9acc33b9 -//.word 0xe64fb25f -//.word 0xc86f470a -//.word 0xcc967da6 -//.word 0x7e2decfc -//.word 0xd26cba29 -//.word 0xc371624f -//.word 0x3b90b48a -//.word 0x33eb1e26 -//.word 0x1b42290f -//.word 0x7c0c4688 -//.word 0xdcc6cb20 -//.word 0xe28b39e2 -//.word 0xbae5c0cd -//.word 0xbbe30584 -//.word 0x476b2246 -//.word 0xf3d2ee1f -//.word 0xe8aa8060 -//.word 0x8adbee4e -//.word 0x57f65a17 -//.word 0x11c5300a -//.word 0x1f27a906 -//.word 0x311a9433 -//.word 0x231a55f1 -//.word 0x24aa2e0e -//.word 0x1730bd3c -//.word 0x3905c6c2 -//.word 0x04cd3371 -//.word 0x540459da -//.word 0xc9da7dbe -//.word 0x6c4197c6 -//.word 0x95445574 -//.word 0x0c9a635a -//.word 0x6e7bea8a -//.word 0xd2b2574d -//.word 0xadf45d18 -//.word 0xf3703dbb -//.word 0x7fa745dc -//.word 0xb57e96a4 -//.word 0x66912bb8 -//.word 0xf3cb176b -//.word 0xb6340e32 -//.word 0x9d092758 -//.word 0x1812e0f2 -//.word 0x36306316 -//.word 0x0b360848 -//.word 0x54f91a35 -//.word 0x5eabdea4 -//.word 0x2364d1a9 -//.word 0xb602321b -//.word 0xe233c049 -//.word 0x0ed0c5e9 -//.word 0x646d5351 -//.word 0x332eceea -//.word 0x91dcaae1 -//.word 0x4437761f -//.word 0xe38e1a7c -//.word 0x388e5d2f -//.word 0xe958aa89 -//.word 0x57d613e4 -//.word 0xc74e96d6 -//.word 0xc0379faa -//.word 0xb34ccf10 -//.word 0xe2e0fc13 -//.word 0x7a71794c -//.word 0x027f9755 -//.word 0xf99e6b81 -//.word 0xbbcbd2ca -//.word 0xa5fcb30b -//.word 0x79fb8470 -//.word 0x0473102a -//.word 0xfe4b7767 -//.word 0x31347681 -//.word 0xde7ee875 -//.word 0x5c308d98 -//.word 0x02570b85 -//.word 0x479e325a -//.word 0x281f8424 -//.word 0xca79f597 -//.word 0x6123ef03 -//.word 0x50009983 -//.word 0x92335978 -//.word 0x58349835 -//.word 0xf323c5fc -//.word 0xf55d9c2a -//.word 0x934ea8ae -//.word 0x4e8606bf -//.word 0xd30e6dcf -//.word 0x1ffc6bba -//.word 0xe645f144 -//.word 0x36d312c2 -//.word 0x58d70817 -//.word 0xf76178e2 -//.word 0x832ef7f6 -//.word 0xd8c0cc0b -//.word 0x1bb4f7b3 -//.word 0xe551738f -//.word 0xa45db9c2 -//.word 0x3e3485a6 -//.word 0xf71bdcbe -//.word 0x94d14eec -//.word 0xc06779e4 -//.word 0xb052cee1 -//.word 0x03bf9897 -//.word 0xec263968 -//.word 0x9222b7da -//.word 0xb7807849 -//.word 0x98954ad9 -//.word 0x15d5a7af -//.word 0x12a23661 -//.word 0x1d6294aa -//.word 0x51d45563 -//.word 0x7aa446ae -//.word 0x7a3df575 -//.word 0xebde7413 -//.word 0x05f05950 -//.word 0xc2970993 -//.word 0x41873753 -//.word 0x6819a7cf -//.word 0xce9d38ff -//.word 0xd8f221ca -//.word 0x22557b79 -//.word 0x2077006c -//.word 0x05d2120b -//.word 0xe33cff00 -//.word 0x14bd83a4 -//.word 0xda9e8eb6 -//.word 0x42c24853 -//.word 0x4e3a5222 -//.word 0x52134fd0 -//.word 0x9f72a4bc -//.word 0x5fe47bf3 -//.word 0xc0ef0e5e -//.word 0x55ed223a -//.word 0xb91ad1c9 -//.word 0x75eb8d47 -//.word 0x23a16220 -//.word 0xd41f7b60 -//.word 0xb0f8e86b -//.word 0xdccd9fee -//.word 0xa1d6c015 -//.word 0xcabe1dff -//.word 0x4db4f96f -//.word 0x2ebf10c4 -//.word 0xa151d82b -//.word 0x6f200713 -//.word 0x9a3155e1 -//.word 0x443583e5 -//.word 0xcd199c8d -//.word 0x3cd97bd9 -//.word 0xe0958d0f -//.word 0x37e6d8b0 -//.word 0x0e723caa -//.word 0xeabef9cf -//.word 0xa7447286 -//.word 0x5fc631c1 -//.word 0x8de12a2f -//.word 0x72e544b2 -//.word 0xb8e41513 -//.word 0x5609edf5 -//.word 0xb32b1707 -//.word 0x0ea25b7e -//.word 0x1d5ac7c3 -//.word 0xf426b068 -//.word 0x2956f361 -//.word 0x368b8071 -//.word 0x1eca1ae2 -//.word 0x54d05879 -//.word 0xd8a5f0a9 -//.word 0xa3743407 -//.word 0x459addfe -//.word 0xcdfd08c4 -//.word 0xe99f7e8c -//.word 0x4e7338fe -//.word 0x5a6f23e4 -//.word 0xf8e22026 -//.word 0xc5084ff8 -//.word 0x71db8d52 -//.word 0x672d3ba0 -//.word 0xb0f442bc -//.word 0x14e55319 -//.word 0x83447441 -//.word 0xb4fab881 -//.word 0x0ce84de2 -//.word 0xc17bbc5c -//.word 0x3f806d47 -//.word 0xcb3a6a12 -//.word 0x66b26437 -//.word 0xf44ffb6e -//.word 0x9da63a22 -//.word 0x74936121 -//.word 0x5689e897 -//.word 0x1526c03d -//.word 0xd60bdcce -//.word 0xb8eaf0bb -//.word 0xb7e0791f -//.word 0xcf06fdf5 -//.word 0x64439489 -//.word 0xe164a72c -//.word 0xa06ef82c -//.word 0x0a32e203 -//.word 0xff23e3cf -//.word 0x78655702 -//.word 0x6a26865b -//.word 0xee31e115 -//.word 0xa0c0895e -//.word 0x4492110a -//.word 0xb03e8589 -//.word 0xe6c7ab16 -//.word 0x80708832 -//.word 0x51d22651 -//.word 0x492b95d3 -//.word 0x99f93035 -//.word 0x18c82189 -//.word 0xe5482823 -//.word 0x4ea29896 -//.word 0xf10ca2df -//.word 0x219cd5df -//.word 0x8c59e60f -//.word 0x1a98ad6f -//.word 0x188671bf -//.word 0x950165f2 -//.word 0x0cac72e0 -//.word 0x4442373b -//.word 0x752a4fc4 -//.word 0xac4cd2be -//.word 0x70241ea3 -//.word 0xa614d717 -//.word 0xb2ff2c1a -//.word 0xdf135c81 -//.word 0x01e679a7 -//.word 0x59c56d60 -//.word 0xb8493a2e -//.word 0xe72a86b8 -//.word 0x47585677 -//.word 0xb5481ab3 -//.word 0xb08ceaae -//.word 0xbea70f1f -//.word 0x0b1fc5e1 -//.word 0x54d43fed -//.word 0x038fec86 -//.word 0x9cdef9b3 -//.word 0x572017f2 -//.word 0x0fdc7e2b -//.word 0x5a5731e3 -//.word 0xfa6584b2 -//.word 0x747fdcf7 -//.word 0xfe16b7ca -//.word 0x9e27ec32 -//.word 0x91103398 -//.word 0xeaa2e77c -//.word 0x7b770b67 -//.word 0xf8858c21 -//.word 0x5af4c523 -//.word 0x822d484f -//.word 0x1f34dcdf -//.word 0xd137c29c -//.word 0x8f673d50 -//.word 0x4606517d -//.word 0xc2c1ca4f -//.word 0xd24180d0 -//.word 0xa7fdda5b -//.word 0x7e529153 -//.word 0x7fd5b614 -//.word 0xe4e8f72a -//.word 0x5d8b1ec2 -//.word 0xb375da5d -//.word 0xac64c2cc -//.word 0x30b19758 -//.word 0xa927c941 -//.word 0xb0153d6a -//.word 0xe5a24e52 -//.word 0x1e611246 -//.word 0xc525ded5 -//.word 0x7b170c85 -//.word 0x0105fbc4 -//.word 0x59fd5821 -//.word 0x281b9cbc -//.word 0x5f9fd6fb -//.word 0x1a42ab7f -//.word 0xc9cb9b57 -//.word 0x8ddd8673 -//.word 0xe5136e5b -//.word 0x894f7e21 -//.word 0x964e4b93 -//.word 0xec805bb6 -//.word 0xd417e470 -//.word 0xe75ed585 -//.word 0x2b4d1ac5 -//.word 0x7e5a1c83 -//.word 0x38918848 -//.word 0x0ce752c9 -//.word 0x2fccf917 -//.word 0xbcff0c16 -//.word 0x58a6ed30 -//.word 0x129ed54a -//.word 0x8c1018f7 -//.word 0x6045abec -//.word 0xbdbbe3b5 -//.word 0x51787fa6 -//.word 0x6c9ee913 -//.word 0x6240b9c4 -//.word 0x31747ba3 -//.word 0x63a9b2b8 -//.word 0x363b1d57 -//.word 0xfb453898 -//.word 0xbcb70608 -//.word 0x21a80e9e -//.word 0x94eda3f1 -//.word 0xa4ea69a7 -//.word 0xa7a81531 -//.word 0xa42874b6 -//.word 0x70f7af4c -//.word 0x1603cd6e -//.word 0x7cad79ab -//.word 0x441f069b -//.word 0xf1e0b017 -//.word 0x4ba525a9 -//.word 0x046b4442 -//.word 0x9bc2242b -//.word 0x816c583e -//.word 0x7b267156 -//.word 0x47c6c504 -//.word 0x82866f84 -//.word 0xc9a097ef -//.word 0x1f1bf4b1 -//.word 0x8ee48e3e -//.word 0x1120c901 -//.word 0xb2c19f95 -//.word 0xf0572d38 -//.word 0x6329717d -//.word 0xa3855241 -//.word 0x6554e0df -//.word 0xe7f1dea8 -//.word 0x8f3c7e8d -//.word 0xcfea6b1f -//.word 0x4b1f0cba -//.word 0x3e3e08fc -//.word 0x1900057c -//.word 0x6ec3b6b9 -//.word 0x0d251451 -//.word 0x6dd2eb74 -//.word 0x4d9a9997 -//.word 0x9ac7126d -//.word 0x94ad2813 -//.word 0x2d820a8b -//.word 0xb1700a6b -//.word 0xace9a3d6 -//.word 0x093bbaac -//.word 0x776424fe -//.word 0x112769c5 -//.word 0x3d5fc7d3 -//.word 0xd4947a09 -//.word 0x84cc3bcb -//.word 0x73a307b1 -//.word 0x259e217f -//.word 0xa0bd5a58 -//.word 0xce4f902e -//.word 0x220a757d -//.word 0x7e5b9139 -//.word 0x55fb8b05 -//.word 0x0dc3a4a5 -//.word 0xa7c184b6 -//.word 0xa18b399c -//.word 0x1bd37dbd -//.word 0x3a3c37ed -//.word 0xca6c4528 -//.word 0x27637987 -//.word 0x5d0be16d -//.word 0x8e104c01 -//.word 0x94f109e2 -//.word 0xe858f216 -//.word 0xc2a7aa43 -//.word 0x82d32221 -//.word 0x4f75622f -//.word 0xfe1e86a5 -//.word 0x35eb06aa -//.word 0xd05a3bc8 -//.word 0x835c1f9d -//.word 0xc1ac55d3 -//.word 0xdd5e6952 -//.word 0x70bb58b3 -//.word 0xfa4c53f8 -//.word 0xcc35c07b -//.word 0x25c58225 -//.word 0x9b4a7ae0 -//.word 0xbc2a4d4f -//.word 0xf62f68bc -//.word 0xb4234252 -//.word 0xca9de18c -//.word 0x131aa0ed -//.word 0x584f2ff2 -//.word 0x74bedb45 -//.word 0xb6881033 -//.word 0x87821c60 -//.word 0x4d8a35b9 -//.word 0x8f1cbeab -//.word 0x5920c692 -//.word 0xe206d275 -//.word 0x6c15dcf0 -//.word 0x6c009b71 -//.word 0xebbb05a8 -//.word 0x2c8c1338 -//.word 0x8f65c4b3 -//.word 0xb57164c5 -//.word 0xe5ed0eaf -//.word 0xae3970f7 -//.word 0xce2fce5e -//.word 0x53b34913 -//.word 0x008b6226 -//.word 0xf272ba3f -//.word 0x84671b90 -//.word 0x6f4bbc08 -//.word 0x36abc1ca -//.word 0xc1db02dd -//.word 0x47440d25 -//.word 0x72fe6e92 -//.word 0xbea22e97 -//.word 0x235999de -//.word 0xf339443a -//.word 0x05d24fdd -//.word 0x1303e8cb -//.word 0x6113108e -//.word 0x9ffca22b -//.word 0x110a9156 -//.word 0xeda571e2 -//.word 0x056b397b -//.word 0xa5834797 -//.word 0xbf2da4aa -//.word 0x459d8a99 -//.word 0xd7092372 -//.word 0x9e01945a -//.word 0x78ff3ac7 -//.word 0x553f33ef -//.word 0xe1d02180 -//.word 0x63ec2a91 -//.word 0xe48544d8 -//.word 0x9520af1e -//.word 0x6be6c2f1 -//.word 0x0cf8eb99 -//.word 0xee04f24d -//.word 0xbd167da6 -//.word 0xfeb0d953 -//.word 0xf31cf70f -//.word 0xbe01b5d0 -//.word 0xc8355f41 -//.word 0x64d27673 -//.word 0xb08cb0cf -//.word 0xbc413f50 -//.word 0xefd256ef -//.word 0xa632ea5e -//.word 0x1dbcb6f8 -//.word 0x93ca81f9 -//.word 0xa983a3ea -//.word 0x0cf4c660 -//.word 0x5363eae6 -//.word 0x2bdfac38 -//.word 0xb11cc7b2 -//.word 0x1f7edb07 -//.word 0xab746d36 -//.word 0xac072fba -//.word 0xffb38201 -//.word 0xa9753a20 -//.word 0xbd25a1c5 -//.word 0x8106be6d -//.word 0xcc9cd7d7 -//.word 0xb2bd34b8 -//.word 0x63eb26b0 -//.word 0x51e1487d -//.word 0x916c056f -//.word 0x847c5a1b -//.word 0xb67bdd54 -//.word 0x06ddff57 -//.word 0x08f98e46 -//.word 0xa7177ed8 -//.word 0x0fcae84e -//.word 0xca8053a9 -//.word 0x2857331a -//.word 0xe532afba -//.word 0x060da77b -//.word 0x048df65e -//.word 0x2cdbf4e7 -//.word 0x46b33fcf -//.word 0x75b8bcf8 -//.word 0x5e0bd8a6 -//.word 0x8c1b14eb -//.word 0x13bfc063 -//.word 0x74820622 -//.word 0xc13d2beb -//.word 0x02ec12a2 -//.word 0xd6ba0204 -//.word 0x5e5ea896 -//.word 0x56aa60db -//.word 0x8561b0ca -//.word 0x584a157f -//.word 0xca820331 -//.word 0x86162764 -//.word 0x50d1ef60 -//.word 0xa1534ce1 -//.word 0x9163b710 -//.word 0xfa8772b2 -//.word 0xdbd110a0 -//.word 0xfafb3777 -//.word 0xceb7a590 -//.word 0x9b407133 -//.word 0xdf359307 -//.word 0xeda7a7cd -//.word 0xd871ee4e -//.word 0x92c79692 -//.word 0x55123b53 -//.word 0x42fbadb1 -//.word 0x49c6f428 -//.word 0x48e291be -//.word 0x77be0781 -//.word 0x03de9a30 -//.word 0xf92d5739 -//.word 0x669554e3 -//.word 0xbdcd39cd -//.word 0x7872ff97 -//.word 0x025af8df -//.word 0xd525106f -//.word 0xdf1452b4 -//.word 0x2b1fae73 -//.word 0xbd41f9b7 -//.word 0xbe17350e -//.word 0xd9a913f4 -//.word 0xe488b690 -//.word 0xc319ba9e -//.word 0x893075ad -//.word 0xe1e07c8a -//.word 0xad9269fc -//.word 0xec55dcb1 -//.word 0xe175c079 -//.word 0x724fd0b2 -//.word 0xce635903 -//.word 0x52ab414e -//.word 0xae2c48df -//.word 0x43ca8eea -//.word 0xd0605634 -//.word 0x4e100910 -//.word 0x18d87e8d -//.word 0x4f6678ee -//.word 0x7d2e705a -//.word 0x78b995d5 -//.word 0x8a40126f -//.word 0xce798fbb -//.word 0xddb1fa83 -//.word 0xaa1b87ba -//.word 0xab68f5b2 -//.word 0x3a971490 -//.word 0x3a0f84fc -//.word 0xfdebbf1d -//.word 0x659559c4 -//.word 0x4a9687e7 -//.word 0x1cacdf52 -//.word 0xca1d5e99 -//.word 0xe24caf51 -//.word 0xf98aaa7f -//.word 0x4d2e1c51 -//.word 0xa9e8c60c -//.word 0x8952a846 -//.word 0x7fc87f55 -//.word 0xd57a8c07 -//.word 0x74bf9794 -//.word 0x04ad34d0 -//.word 0x55e645a5 -//.word 0xfeb4c0c1 -//.word 0x4459b28c -//.word 0x3da0845d -//.word 0x35b87ded -//.word 0x5042890c -//.word 0x71a93992 -//.word 0x5bb20a99 -//.word 0x1654eae9 -//.word 0x95c9f8b4 -//.word 0x95e58c84 -//.word 0xc8a77771 -//.word 0x330e8c97 -//.word 0xd42d5fc7 -//.word 0x89824c7d -//.word 0x2d84bb12 -//.word 0x047ba333 -//.word 0x59944d92 -//.word 0x65355bdb -//.word 0x738e08ea -//.word 0x4271b13b -//.word 0xab6395a2 -//.word 0x83f3d93c -//.word 0xc34acfa5 -//.word 0xe604776b -//.word 0x933e46c3 -//.word 0x7cf0277b -//.word 0x867ec030 -//.word 0x2a89f6c1 -//.word 0x1b0bb303 -//.word 0x29a3e6b7 -//.word 0x652dccb9 -//.word 0x86966f7a -//.word 0x8bee6caf -//.word 0xa2bff84b -//.word 0x499e25ab -//.word 0xb3ff6211 -//.word 0x6d4e4154 -//.word 0x413b7ed6 -//.word 0x5b553cb5 -//.word 0xaada9146 -//.word 0x89cd45bf -//.word 0x9f4ad733 -//.word 0x0317c1c4 -//.word 0xa47bfd14 -//.word 0xe953c8fc -//.word 0x9462a681 -//.word 0xece9a603 -//.word 0x1b77e7b8 -//.word 0xd5035b59 -//.word 0x3a38cb1b -//.word 0xfe101ce1 -//.word 0xc7a4d0b0 -//.word 0xd643d063 -//.word 0xeac168a0 -//.word 0x6111930a -//.word 0xa11679b8 -//.word 0xb6b736e7 -//.word 0x3c32ddeb -//.word 0x80b2bc6c -//.word 0xe223e2ce -//.word 0x7e45dff1 -//.word 0x0bffcb1b -//.word 0x02f78a32 -//.word 0x035f4d2f -//.word 0x76125ccf -//.word 0x6edf148b -//.word 0xd2242bcb -//.word 0xbe9f3c57 -//.word 0x27827f0e -//.word 0xbec5d7da -//.word 0x17c013e3 -//.word 0x0bf96d03 -//.word 0x5b3b577b -//.word 0x95e878e4 -//.word 0x3c8ff168 -//.word 0x23c1e431 -//.word 0x1a213722 -//.word 0xccbb95c5 -//.word 0xe897b685 -//.word 0x7f8de11e -//.word 0xae5aaf51 -//.word 0x7cf411dc -//.word 0x051b94a9 -//.word 0xd931e446 -//.word 0x9f4b8f95 -//.word 0xfe880cc5 -//.word 0xbda2fc80 -//.word 0x28c2af66 -//.word 0xb699eabb -//.word 0xeaace85c -//.word 0x77ef9ef8 -//.word 0xa796447c -//.word 0xfd2810cf -//.word 0x1ad545c0 -//.word 0xdd096c3d -//.word 0xce41e1c5 -//.word 0xbd1e921f -//.word 0xa6b7044d -//.word 0xd83497bc -//.word 0x56990abd -//.word 0x7edf4139 -//.word 0xe849469f -//.word 0x91f58f22 -//.word 0x39b27f22 -//.word 0x09112ee7 -//.word 0x79bf6d95 -//.word 0x7111055c -//.word 0xaee140f0 -//.word 0x6899ab39 -//.word 0x328d194b -//.word 0x218eeb98 -//.word 0x30bb8f64 -//.word 0xe39b477a -//.word 0x2b692c1e -//.word 0x8aaf7242 -//.word 0x7717edfd -//.word 0x047dd438 -//.word 0xbe48c6ab -//.word 0xd5fb0a08 -//.word 0x7d071b75 -//.word 0x93e46440 -//.word 0x845f48ce -//.word 0x6b3665d5 -//.word 0x79e21acb -//.word 0x9ab4469f -//.word 0x552353a6 -//.word 0xf46574d8 -//.word 0xe63c2a3c -//.word 0x61130da1 -//.word 0x4c49c98f -//.word 0x5bcd677d -//.word 0x7cebce44 -//.word 0x726589d4 -//.word 0xbfc6ca26 -//.word 0xc8f3af72 -//.word 0x3403c5a1 -//.word 0x9550cb05 -//.word 0x4aceb848 -//.word 0xa49cffa2 -//.word 0x47d9114f -//.word 0xd3b92341 -//.word 0xc4d83212 -//.word 0x97ce453c -//.word 0x2f03f38c -//.word 0x76c524d4 -//.word 0x47971ce1 -//.word 0x8cccb5ac -//.word 0xa355ebd4 -//.word 0x07d89e4c -//.word 0x2c029451 -//.word 0xaa1dbea0 -//.word 0x9ee5bce5 -//.word 0x4d97a276 -//.word 0x0b4cfd41 -//.word 0x5c851104 -//.word 0x580765bc -//.word 0x54e9825f -//.word 0xbeebf7cd -//.word 0x4909a004 -//.word 0x4a502894 -//.word 0x62f1cd54 -//.word 0x5e946352 -//.word 0x5bee9c10 -//.word 0x2e9686ed -//.word 0x031455e1 -//.word 0x433b636d -//.word 0xbcba75d2 -//.word 0xfced4082 -//.word 0xfdf92cd4 -//.word 0x081757fb -//.word 0xd330dd39 -//.word 0xedab5750 -//.word 0x5b83a13a -//.word 0x849ce119 -//.word 0x4a57c471 -//.word 0x7a640b95 -//.word 0x66d7475f -//.word 0xd07ee024 -//.word 0x0a725ce7 -//.word 0x5ceddecd -//.word 0xa65bedd1 -//.word 0x46b477b9 -//.word 0x3c081649 -//.word 0x8c5c91b6 -//.word 0xe4b4a65e -//.word 0x7f7107b5 -//.word 0x49dda283 -//.word 0x4405254d -//.word 0x2ac7c210 -//.word 0x542b3036 -//.word 0xdaf7f2c2 -//.word 0xfc7ddbce -//.word 0xc1b8d237 -//.word 0xdd97d397 -//.word 0xd8993673 -//.word 0x6d9a34b6 -//.word 0x31eda75e -//.word 0x75aa1176 -//.word 0x6c49e044 -//.word 0x9170f0c3 -//.word 0x430a5254 -//.word 0xb2994cb0 -//.word 0xffcda021 -//.word 0x9f5511f2 -//.word 0x01f52423 -//.word 0x70d92462 -//.word 0x3a296837 -//.word 0x12ddd97f -//.word 0xb3d3ae1b -//.word 0xc61e7ae9 -//.word 0x06a269f3 -//.word 0xa2dec6e7 -//.word 0xe208c1c8 -//.word 0x0e5f70e2 -//.word 0x8cbd1303 -//.word 0x486b9ce8 -//.word 0x593a6ff6 -//.word 0xe1cf662b -//.word 0x343f1853 -//.word 0x3ddc5b7f -//.word 0x1e4e07b3 -//.word 0x17e5fddf -//.word 0xa92d6810 -//.word 0xfbc343e8 -//.word 0x7c681c4c -//.word 0xca54175c -//.word 0xd3cc35a8 -//.word 0x3af7d6a0 -//.word 0xfcee7d4d -//.word 0x5312d43f -//.word 0xdaa2f0c7 -//.word 0xf28dd566 -//.word 0x65843d84 -//.word 0x4a549565 -//.word 0x2973495a -//.word 0x5fd84134 -//.word 0xc310acfe -//.word 0x898ffcec -//.word 0x6744318e -//.word 0xf7705b49 -//.word 0x5db75a08 -//.word 0x2978e92f -//.word 0x7f5adbd1 -//.word 0x7527a322 -//.word 0xbcde1a2f -//.word 0x83037dcc -//.word 0x983ab5ce -//.word 0xd014dc7b -//.word 0xaa29fc3f -//.word 0x2f671aa1 -//.word 0x1ca97374 -//.word 0x438b0552 -//.word 0x2f7d5146 -//.word 0x071760c9 -//.word 0xb4ad04f0 -//.word 0x462260e3 -//.word 0x9401aa91 -//.word 0x23c930a2 -//.word 0x4a8999ad -//.word 0x93ad6eac -//.word 0x6318d9ad -//.word 0xde73acca -//.word 0x05c4a45a -//.word 0x2142f069 -//.word 0x6568ed66 -//.word 0xcf48341c -//.word 0x4f22d6e4 -//.word 0x2b35e618 -//.word 0xa2d538ca -//.word 0xd0be69b6 -//.word 0xd1a81f76 -//.word 0x291b92f5 -//.word 0x63854c26 -//.word 0xf98a2df6 -//.word 0x749bb17f -//.word 0xd4ca767e -//.word 0x32dcf807 -//.word 0xa4a09f77 -//.word 0x6180fdab -//.word 0x2656506f -//.word 0xd8814f39 -//.word 0x6a372318 -//.word 0x011cb3e7 -//.word 0x561424c6 -//.word 0x5c56a0cb -//.word 0x24c357f4 -//.word 0xfd75c460 -//.word 0xdf9a32bf -//.word 0x0a837e08 -//.word 0xeaf81e6a -//.word 0x3ecf6284 -//.word 0x79bdfad8 -//.word 0x686bb97d -//.word 0x16cc9915 -//.word 0xedaffeff -//.word 0x1d903fce -//.word 0x42b462f9 -//.word 0x417527d3 -//.word 0x72da49be -//.word 0x056a009c -//.word 0x9e42ca87 -//.word 0x43666bc2 -//.word 0x785532ef -//.word 0xa8e07f82 -//.word 0xc73b8275 -//.word 0x3655453e -//.word 0xe765edfe -//.word 0xc1c53dfb -//.word 0x46045b50 -//.word 0x7337d7e3 -//.word 0xe78fe998 -//.word 0x4831fac4 -//.word 0xe34166e5 -//.word 0x92408190 -//.word 0xe399d8aa -//.word 0x7676b9db -//.word 0xa7d8f540 -//.word 0x6de7e460 -//.word 0x8287aa62 -//.word 0xc52bb97d -//.word 0xdcee97af -//.word 0x1de0e2b2 -//.word 0xaf9d912c -//.word 0xec257c26 -//.word 0x0ae71fbf -//.word 0xfb1f9a21 -//.word 0x9162fdb5 -//.word 0xe677c393 -//.word 0xfb699c3d -//.word 0x9fda708c -//.word 0x939aa0ea -//.word 0xeb798fc2 -//.word 0xb7596135 -//.word 0xe387020f -//.word 0x5c4b6af9 -//.word 0x74bd20f0 -//.word 0x88dbfdf5 -//.word 0xe0d93306 -//.word 0xd6b88e4e -//.word 0x3b1af999 -//.word 0xf655430a -//.word 0xeec62310 -//.word 0x2b687a96 -//.word 0x38a4d97a -//.word 0xcb6b4341 -//.word 0xa7833409 -//.word 0xc21ee1be -//.word 0xa3b1c291 -//.word 0x0f034ea6 -//.word 0xe485060d -//.word 0x45e1b4f4 -//.word 0xf7d5f51b -//.word 0x0b42f588 -//.word 0xbe807a7b -//.word 0x9df524a4 -//.word 0xede6f394 -//.word 0x498c0972 -//.word 0x8d6bb1ef -//.word 0xf3dfa17b -//.word 0x7cf87cba -//.word 0x92879b31 -//.word 0xeb790d46 -//.word 0xb064dc67 -//.word 0xdf609289 -//.word 0xee18fcd4 -//.word 0xb1212e9c -//.word 0x7d8ac794 -//.word 0x8eb4773e -//.word 0xa663bea6 -//.word 0xf716f650 -//.word 0x4394936f -//.word 0x42c8aa57 -//.word 0x44ceb035 -//.word 0x174e85fe -//.word 0x2b09b0a5 -//.word 0xf4b1ed91 -//.word 0x90fee54e -//.word 0xaafe3c83 -//.word 0x9eadd024 -//.word 0xddc540e8 -//.word 0x94d7acfe -//.word 0x889bbcfc -//.word 0x4485e418 -//.word 0x7798e69a -//.word 0x987f9891 -//.word 0xcbdae7c5 -//.word 0x08d61cee -//.word 0x7a005e23 -//.word 0x255b7895 -//.word 0xccafdd7d -//.word 0x1225e953 -//.word 0xdf116a41 -//.word 0x050f5fd7 -//.word 0x24510000 -//.word 0xcb37fe35 -//.word 0xdf200bf0 -//.word 0x41819d64 -//.word 0xab34ef6b -//.word 0xdb1249c0 -//.word 0xf4c3826e -//.word 0x21d5c388 -//.word 0x7b0c8d1b -//.word 0x2df9fe61 -//.word 0xd5ce5037 -//.word 0x2e71a2d1 -//.word 0xedcffbad -//.word 0xe8738cc5 -//.word 0x7d573509 -//.word 0x32fa4b0c -//.word 0x99b299fe -//.word 0x7744a4da -//.word 0x24b234e0 -//.word 0x35540f46 -//.word 0x592a082b -//.word 0x817138cc -//.word 0x44748cfa -//.word 0x81a580cc -//.word 0x46ec2991 -//.word 0xf03f7908 -//.word 0x9473bfd4 -//.word 0x9e526d2a -//.word 0xb8ed1ecd -//.word 0xee34d73c -//.word 0x0fc38d29 -//.word 0x56ffe82e -//.word 0x496247bc -//.word 0xe2130454 -//.word 0xedbaf9f9 -//.word 0xb19243e5 -//.word 0xd2c0457b -//.word 0x76e3f07d -//.word 0xa7ec427f -//.word 0xf9300d9b -//.word 0x6cbbfa67 -//.word 0x93e7cd24 -//.word 0xf62eeb38 -//.word 0xb63d19df -//.word 0x6f49861d -//.word 0x62a60cf7 -//.word 0xd496b3e2 -//.word 0xb15f777c -//.word 0x75a04b7a -//.word 0x4ce45de1 -//.word 0x78789c7a -//.word 0xf47a787f -//.word 0x5733e89b -//.word 0xfaa7b212 -//.word 0x5d69e73b -//.word 0xc7b4ac37 -//.word 0x2db840dd -//.word 0x55323bf4 -//.word 0x3c3f14a5 -//.word 0xb472e62f -//.word 0x512474dd -//.word 0x860b6a36 -//.word 0x0c0fe673 -//.word 0x83583636 -//.word 0x5cace478 -//.word 0xf6f8efc3 -//.word 0x072c5ca2 -//.word 0x3e4ced57 -//.word 0x27c431cb -//.word 0x4efdbdcb -//.word 0xa72db870 -//.word 0x2d739ddf -//.word 0xca233c33 -//.word 0x775f02b8 -//.word 0xa4e77b5a -//.word 0xda31155d -//.word 0x9fbd274e -//.word 0x9aa33139 -//.word 0xf76e661c -//.word 0x0d2c679c -//.word 0x3ec652f7 -//.word 0x1f8efb3a -//.word 0xd91779b4 -//.word 0xd049e5aa -//.word 0x82b45e4c -//.word 0xb12550e8 -//.word 0xc477f65e -//.word 0x6bac1ed4 -//.word 0x823d2daa -//.word 0x38ad62b0 -//.word 0x70645f97 -//.word 0x67bbe5a6 -//.word 0x9754dfae -//.word 0xdcaca240 -//.word 0xd6f3731d -//.word 0x8e1b49ee -//.word 0x5c2fd536 -//.word 0x08e6c084 -//.word 0x2f7834ed -//.word 0xe8b09db9 -//.word 0xa842b15d -//.word 0x6360aeaa -//.word 0xf488e243 -//.word 0xbfa07154 -//.word 0x95445381 -//.word 0xd85f9c1d -//.word 0xdff8009d -//.word 0x9b4f964c -//.word 0x7b29dc40 -//.word 0x8e68fc8c -//.word 0xe8de4db7 -//.word 0x46631d6d -//.word 0xf525ae75 -//.word 0xef407ee3 -//.word 0x488fcb8f -//.word 0xc8c157c5 -//.word 0xdaaf693e -//.word 0xa4ec144f -//.word 0x789ebb61 -//.word 0x6b8dd5a1 -//.word 0x437aeef9 -//.word 0x97b2ee3e -//.word 0x31e39eab -//.word 0xb72d688e -//.word 0x8b7c5f41 -//.word 0xef167f5c -//.word 0x6d703529 -//.word 0x76462258 -//.word 0x49ea1cf4 -//.word 0x16dd7596 -//.word 0x639c80d9 -//.word 0xb0bc520d -//.word 0x5639c630 -//.word 0xb50cc41a -//.word 0x8efbc2f7 -//.word 0xaeb58afa -//.word 0xcd1e3e50 -//.word 0xb5e89a53 -//.word 0xa7637a01 -//.word 0xfa969cac -//.word 0x058ea6f2 -//.word 0x3ff66bf0 -//.word 0xa5e86ab3 -//.word 0x5c0397ef -//.word 0x98be5ff4 -//.word 0xbcfbe6dd -//.word 0xc3e0930b -//.word 0xdee2ced2 -//.word 0x5e220871 -//.word 0xd5fdfc48 -//.word 0x78de3545 -//.word 0xc857d1a0 -//.word 0x727184c8 -//.word 0x7340e09d -//.word 0x7fbad3df -//.word 0xa4c971e6 -//.word 0x2b9ef394 -//.word 0xbf490089 -//.word 0xd1862c95 -//.word 0x3adabf73 -//.word 0x22dfb7b4 -//.word 0x21dc10f9 -//.word 0xa5994265 -//.word 0x94720c52 -//.word 0x32a97043 -//.word 0x4401ff1a -//.word 0x7688568c -//.word 0xfab4e9d1 -//.word 0x72b1ffa0 -//.word 0x10fafe5a -//.word 0xfb27e986 -//.word 0xf505277d -//.word 0x3cec8666 -//.word 0xad4d7f65 -//.word 0x2f8bbc10 -//.word 0x4f0cd723 -//.word 0x288f6574 -//.word 0x86c03329 -//.word 0x4b09cf28 -//.word 0x11ac4acf -//.word 0x100f3de6 -//.word 0x42560ad1 -//.word 0xc637640a -//.word 0x830a12cf -//.word 0x0d20ef18 -//.word 0xcc5636cc -//.word 0x5beafc34 -//.word 0x2e8dfeb0 -//.word 0x78b99da9 -//.word 0x4b4427c6 -//.word 0x01365863 -//.word 0xdcd8213f -//.word 0xe90da774 -//.word 0x2ae58fad -//.word 0xf3707993 -//.word 0x95d0ca88 -//.word 0x3a92af98 -//.word 0x103f5fac -//.word 0xaa2da001 -//.word 0xa39b8cd9 -//.word 0x84fd9571 -//.word 0xe795c732 -//.word 0xdd434d2b -//.word 0x8e9e37bf -//.word 0x1f437a9b -//.word 0xd96e38ec -//.word 0x87c742ce -//.word 0x1f7edc07 -//.word 0xa599c0f5 -//.word 0x4d8d65c5 -//.word 0xe00c80e6 -//.word 0x601fccbd -//.word 0xef74069b -//.word 0xedf93cec -//.word 0x61aa48b1 -//.word 0x9aa69830 -//.word 0x168930e9 -//.word 0xa2f6f1cd -//.word 0xc3731bab -//.word 0x557a11eb -//.word 0x72cc5c7e -//.word 0x9509f315 -//.word 0xff7eb991 -//.word 0x5a3e48bb -//.word 0x9d74ed36 -//.word 0x2ff7f3b2 -//.word 0x4f1f2561 -//.word 0xb3d88eaf -//.word 0x6ff4832e -//.word 0x19c6e4cf -//.word 0x2bec9e58 -//.word 0xa86c7412 -//.word 0x030300c2 -//.word 0x3cb9f4db -//.word 0x4cb9a6f2 -//.word 0xc360cc72 -//.word 0xb0948391 -//.word 0xc1579783 -//.word 0xab9bfeed -//.word 0xcc58a59c -//.word 0x0fdd7077 -//.word 0x11647cb2 -//.word 0x82e8a745 -//.word 0xcd3b529d -//.word 0xfb536591 -//.word 0xd4e49497 -//.word 0x4835e138 -//.word 0x0e2c62c1 -//.word 0x8baa453c -//.word 0xf51f119e -//.word 0xb8552e42 -//.word 0x1990a896 -//.word 0x19d93015 -//.word 0x9c976475 -//.word 0xca5f5021 -//.word 0xb60d34e9 -//.word 0x3d1487f8 -//.word 0x32123d07 -//.word 0xb8a846d1 -//.word 0xee8857c7 -//.word 0xd2cfec04 -//.word 0x5f968e83 -//.word 0xf9c35190 -//.word 0x0b25a27c -//.word 0xefc13f95 -//.word 0x0e668755 -//.word 0x4888f4da -//.word 0x964be696 -//.word 0xeddda248 -//.word 0x66099a2b -//.word 0x9d09ef6d -//.word 0x569c34e2 -//.word 0x675975fa -//.word 0xd24377f1 -//.word 0x319d4245 -//.word 0x5700dd6d -//.word 0x34aa59c8 -//.word 0xf91910d4 -//.word 0x7dd92fa0 -//.word 0xdf9a7284 -//.word 0x6e852f0f -//.word 0xc5d09641 -//.word 0x3a9037fa -//.word 0x7acfc5b3 -//.word 0x6ddf196c -//.word 0x60ed79e5 -//.word 0x62d91b11 -//.word 0xee46e5c8 -//.word 0xcbed77bc -//.word 0x31366bae -//.word 0x2d09dbe2 -//.word 0x46e124d0 -//.word 0x6123ea1c -//.word 0xe2af5dc8 -//.word 0x14b4baa9 -//.word 0xcbc81417 -//.word 0x483854e9 -//.word 0x5c9c7fa1 -//.word 0xd1af37e3 -//.word 0x055e852c -//.word 0xd81fd5c0 -//.word 0xc88442e4 -//.word 0x5b10144e -//.word 0xbe4987da -//.word 0xab0ecf7e -//.word 0x8f2b5880 -//.word 0xed2b52e6 -//.word 0xfd6e6d2f -//.word 0x9a7be140 -//.word 0x5b96b2a1 -//.word 0xff9632e9 -//.word 0x0ef1c777 -//.word 0xbd19ee63 -//.word 0x120b80b4 -//.word 0x4a2435d4 -//.word 0x78376641 -//.word 0x6ede1784 -//.word 0xe00d3467 -//.word 0xc7ed1b63 -//.word 0x04e75b58 -//.word 0x46febb81 -//.word 0x2d637fa6 -//.word 0xb043e693 -//.word 0xbce4f7ca -//.word 0x1df07d75 -//.word 0xa211519e -//.word 0x7cbdd7a2 -//.word 0xe854cbe3 -//.word 0x0e683ebe -//.word 0x285bdbbd -//.word 0xe6306f0d -//.word 0x119ba932 -//.word 0x705a1ef9 -//.word 0xe8c88fae -//.word 0xe6b06f90 -//.word 0x025fa082 -//.word 0xdcfd7e03 -//.word 0x4a1d1e60 -//.word 0xb692d728 -//.word 0xc18402e1 -//.word 0x2cc4fff9 -//.word 0xf95d7900 -//.word 0xcd6cea14 -//.word 0x9931619c -//.word 0x79658339 -//.word 0xddcecff9 -//.word 0xe61227ce -//.word 0x13c98c3f -//.word 0x1cd52a5e -//.word 0x1ef694fa -//.word 0xf9995015 -//.word 0xf6f19698 -//.word 0xae495546 -//.word 0x279977ef -//.word 0x3f5766e6 -//.word 0x4e8fcfb5 -//.word 0x0736a60e -//.word 0x9fbc6a05 -//.word 0x32e0aa7d -//.word 0x62c8c8e0 -//.word 0x4151fd14 -//.word 0x71a49daa -//.word 0x890a9c58 -//.word 0xbb0152a9 -//.word 0xb48f7bf3 -//.word 0xc4d6828a -//.word 0x3fe9ff33 -//.word 0x23de7edb -//.word 0xfa248289 -//.word 0x0217c992 -//.word 0x8cd2d20c -//.word 0xa2449d84 -//.word 0xec87b2f4 -//.word 0xd56c64ef -//.word 0xe95b571f -//.word 0x815a40f1 -//.word 0xa36bec8f -//.word 0x241b840f -//.word 0x0f580fe9 -//.word 0x4b8338af -//.word 0x77c651f8 -//.word 0x19a8999e -//.word 0xf8deba29 -//.word 0xc664968a -//.word 0x02cd430d -//.word 0x1dd85489 -//.word 0xdc435bd9 -//.word 0xfde4ac90 -//.word 0x1df563e9 -//.word 0xd9b0a8fd -//.word 0x341c3139 -//.word 0x3826090e -//.word 0xe1f390ea -//.word 0x3675c468 -//.word 0xb93cbec4 -//.word 0x018f7f91 -//.word 0xa6bcedae -//.word 0x5dac1976 -//.word 0x64bac337 -//.word 0x21c520e5 -//.word 0x0684db10 -//.word 0xb71a5914 -//.word 0x6feb4190 -//.word 0xa0ad3c19 -//.word 0xd9c2f92f -//.word 0xedc5756f -//.word 0x5263790b -//.word 0xc76c6478 -//.word 0x39292a66 -//.word 0xe8f19df5 -//.word 0xc6f7eb26 -//.word 0x1f66688f -//.word 0x7fb08e54 -//.word 0xd1224252 -//.word 0xc4bd599d -//.word 0x73415b2d -//.word 0x448a87d4 -//.word 0x101f1773 -//.word 0x8509c56e -//.word 0xc9e18d5d -//.word 0x602db505 -//.word 0x50ed0b86 -//.word 0x83706ed5 -//.word 0x6c6c8f6d -//.word 0xee4ef942 -//.word 0x79cf4ff7 -//.word 0x76c8d550 -//.word 0xe54732ea -//.word 0x44e2752a -//.word 0xb34b5573 -//.word 0x5725bd9c -//.word 0xfc1688a1 -//.word 0xfe1e8998 -//.word 0x6927cee7 -//.word 0x5fdd25b5 -//.word 0xbabfe09e -//.word 0xf376d6ab -//.word 0x4366aa81 -//.word 0x078450d8 -//.word 0x6967cc2f -//.word 0x3da13dbe -//.word 0x294f1bad -//.word 0x09efbd83 -//.word 0x91721ee1 -//.word 0x3492e070 -//.word 0x45669118 -//.word 0x5d342e73 -//.word 0xfc86e581 -//.word 0x73801f9d -//.word 0x0170beaf -//.word 0x3ca7a3a4 -//.word 0xb288741b -//.word 0xd1de9c61 -//.word 0x047393a0 -//.word 0x1fde5f53 -//.word 0xfd9c5bfd -//.word 0x6762371b -//.word 0x38b24057 -//.word 0xbfade1fe -//.word 0x65286ab4 -//.word 0x90011167 -//.word 0xc7b33781 -//.word 0x1629ec62 -//.word 0xb4d0b40d -//.word 0xe3f08b21 -//.word 0x183c280c -//.word 0x5ca87f7b -//.word 0xf27a8914 -//.word 0x3aa44768 -//.word 0xd5510523 -//.word 0x0abedc86 -//.word 0x684b7a18 -//.word 0xadd22698 -//.word 0xe737fe35 -//.word 0xd9408302 -//.word 0xa0a758a4 -//.word 0x976e474d -//.word 0x777385ef -//.word 0xc34437a9 -//.word 0x63343486 -//.word 0x8eaf0d66 -//.word 0xeeca4b3c -//.word 0xff1ef77a -//.word 0xb9d760ca -//.word 0x6e0818ff -//.word 0xf542404b -//.word 0x086405b2 -//.word 0xebb46bbe -//.word 0x4e2f4a75 -//.word 0x751e9588 -//.word 0x96eae2cd -//.word 0x833127ef -//.word 0x8819c265 -//.word 0x97e5bda0 -//.word 0xa2c64f89 -//.word 0x49f3a62a -//.word 0xb5fbe3ab -//.word 0xc45a6781 -//.word 0x664b4de2 -//.word 0x47de377c -//.word 0xae4a4e66 -//.word 0xa5848457 -//.word 0x5a111d16 -//.word 0xc5186d31 -//.word 0x8bbbe3f2 -//.word 0x22a7468f -//.word 0x36ea3fa1 -//.word 0x4c0618d7 -//.word 0xa643c3ec -//.word 0x66491ed6 -//.word 0xf6ed7541 -//.word 0xa64c483b -//.word 0x97164f31 -//.word 0xd92dbc1a -//.word 0xd06fc0f2 -//.word 0xdccf506a -//.word 0x38ab29de -//.word 0x235a1287 -//.word 0x3e0461f2 -//.word 0x36b6c0b0 -//.word 0xa2b53150 -//.word 0x2f13508a -//.word 0xfa81d8bd -//.word 0x3d64699c -//.word 0x2e2b8923 -//.word 0x24dfe8d1 -//.word 0xfcfbe811 -//.word 0xbb7f5cf9 -//.word 0x74409036 -//.word 0x6d828b47 -//.word 0x7dc890ea -//.word 0xb8ebebd4 -//.word 0x4f6aeaa5 -//.word 0xb101291b -//.word 0xf67d1286 -//.word 0x7ecea57c -//.word 0xd55e75cd -//.word 0xdaa1f3b9 -//.word 0x21eeef61 -//.word 0x958d5c7c -//.word 0x6211544b -//.word 0x12e75ccf -//.word 0xf530e839 -//.word 0xc7cc22a2 -//.word 0x8db7e7fc -//.word 0xc0991249 -//.word 0xad98fe0b -//.word 0x1c7146fb -//.word 0x30c7cffd -//.word 0x8ebb0954 -//.word 0xc1bc7112 -//.word 0xdea05bd3 -//.word 0x63f4eeab -//.word 0x6591705d -//.word 0xeb70c4ce -//.word 0x95c030b9 -//.word 0x813564a3 -//.word 0x6ea2b812 -//.word 0x22cab6fa -//.word 0x0a74d878 -//.word 0x21bd92c2 -//.word 0x12b2935f -//.word 0xa11e4993 -//.word 0x47a1a31e -//.word 0x1c021a26 -//.word 0xfbc6f271 -//.word 0xe002bdd7 -//.word 0x946d22f7 -//.word 0x8db9dc2a -//.word 0x0f2405b5 -//.word 0x984a9543 -//.word 0x7b3d2692 -//.word 0xcbd7fa6c -//.word 0x7a4f3ed9 -//.word 0xc20b9093 -//.word 0xc4b5c0ba -//.word 0x7091d3c9 -//.word 0xa40e4ec9 -//.word 0x989bb1c4 -//.word 0x79bb417d -//.word 0x545c0a5e -//.word 0x366525b2 -//.word 0x928e3714 -//.word 0xe2743a27 -//.word 0x91ed8088 -//.word 0x1998f401 -//.word 0x69b9a400 -//.word 0x89447c47 -//.word 0x803854e4 -//.word 0x762e2e64 -//.word 0x1632b844 -//.word 0x36d119a8 -//.word 0xba73e94f -//.word 0xb5ec81c7 -//.word 0xd24d76dd -//.word 0xf3006058 -//.word 0x1714e0e7 -//.word 0x81d5e157 -//.word 0x17a01d09 -//.word 0x08f5e3a4 -//.word 0xb1ce1807 -//.word 0xc22f7d82 -//.word 0x9cff2f45 -//.word 0xfe167418 -//.word 0xe197b44d -//.word 0xa080c6f3 -//.word 0x5c7f6e4d -//.word 0x9f082383 -//.word 0x3fa41596 -//.word 0x868c6e99 -//.word 0x8f76d81f -//.word 0xf3af40f0 -//.word 0xa66ada00 -//.word 0x1b5866a1 -//.word 0xaf78b1f7 -//.word 0x44315eac -//.word 0x2c9ee6e6 -//.word 0x4a29de76 -//.word 0x735b7953 -//.word 0x1af24d46 -//.word 0x2d345ae6 -//.word 0x3a8448c7 -//.word 0xd633f0ef -//.word 0x3f981e89 -//.word 0x406395de -//.word 0x552e5480 -//.word 0x105518c8 -//.word 0xbb082283 -//.word 0x3f9e3ae9 -//.word 0x452cf4cf -//.word 0x9a57321d -//.word 0xd866ea81 -//.word 0x439c2a65 -//.word 0xf1c4591f -//.word 0x2e0dbf68 -//.word 0x1e184810 -//.word 0xa45084f0 -//.word 0x837af31f -//.word 0xc38c8069 -//.word 0x57c34bfc -//.word 0xfcf0ab65 -//.word 0x641374bb -//.word 0x942a751a -//.word 0x8b4b4553 -//.word 0x24f140e2 -//.word 0x3d94cc21 -//.word 0x197ce1bb -//.word 0x03d6c862 -//.word 0x340822c5 -//.word 0xf7422dbc -//.word 0x0b5543c6 -//.word 0x49c9a3b6 -//.word 0x862974a9 -//.word 0xbba2073b -//.word 0x64cd5dfb -//.word 0x25c8e91c -//.word 0xb38b966d -//.word 0xf2790c8b -//.word 0x5b362f54 -//.word 0xa1b9e9a0 -//.word 0x94a22a2c -//.word 0x45cd2dd7 -//.word 0x6b27fc11 -//.word 0x05c03690 -//.word 0x41221044 -//.word 0x9de29a8e -//.word 0x4c7444ad -//.word 0xdb43a079 -//.word 0x14016953 -//.word 0x233cc55c -//.word 0xf733c7e5 -//.word 0xebe73827 -//.word 0xa6759734 -//.word 0x3fa25e2e -//.word 0xa5b887b7 -//.word 0x3f914fa8 -//.word 0xcff13a06 -//.word 0x9c195732 -//.word 0xd098c55f -//.word 0x1f657649 -//.word 0xa92b3325 -//.word 0x22e4e0d3 -//.word 0x30a9025b -//.word 0x14c87e97 -//.word 0x8d18a32d -//.word 0xf9896bc1 -//.word 0xbefffe68 -//.word 0xe861785f -//.word 0x14ececfd -//.word 0x8ccea9e6 -//.word 0xb3f0bc82 -//.word 0xa413b6ad -//.word 0x161eafb0 -//.word 0x83b68a70 -//.word 0x89107be6 -//.word 0x9003c7cf -//.word 0xad62cba5 -//.word 0xc68840cd -//.word 0xf734bd12 -//.word 0x35987d52 -//.word 0x31ac6377 -//.word 0x7fc83ba9 -//.word 0xf87243c3 -//.word 0x5d75ea03 -//.word 0x3d33d705 -//.word 0x183b2df2 -//.word 0xc41e0ef5 -//.word 0x107f5eee -//.word 0xa86ac96b -//.word 0x38e707d4 -//.word 0xd4ce5ee5 -//.word 0x98dc6961 -//.word 0x8b071905 -//.word 0xc90ff9bb -//.word 0xe256b611 -//.word 0x7df1dee9 -//.word 0x41ffe872 -//.word 0xf5397557 -//.word 0xe5cbd536 -//.word 0x8863cd53 -//.word 0x6187978e -//.word 0x232b2b92 -//.word 0x1883bd50 -//.word 0xc31687ac -//.word 0xc514c875 -//.word 0xfde90d9b -//.word 0xf312af9c -//.word 0x772f9d40 -//.word 0x855a5b86 -//.word 0x6cb84bde -//.word 0x2f4d2c98 -//.word 0x2c15e09d -//.word 0xfb50725d -//.word 0x991d5708 -//.word 0xc64af401 -//.word 0xab6b6190 -//.word 0xc0296dd7 -//.word 0xeddde207 -//.word 0xf05e0ad3 -//.word 0xfe167125 -//.word 0xad5ced10 -//.word 0x11fedc07 -//.word 0x251cad4c -//.word 0x6d3da2aa -//.word 0xda9cd367 -//.word 0xeec37775 -//.word 0x205b5fe8 -//.word 0x8243c3ad -//.word 0xa1df4178 -//.word 0xadb323fe -//.word 0xda30e165 -//.word 0x05cde6f8 -//.word 0x9b5a9720 -//.word 0xb791928f -//.word 0x8aef33bf -//.word 0x00c25d9b -//.word 0xa082777c -//.word 0xb564b456 -//.word 0xab2d9834 -//.word 0xbb44b8e1 -//.word 0xcb0cc1e8 -//.word 0x8f70bbbf -//.word 0xf5c08f40 -//.word 0xc0bbc758 -//.word 0x72ed9603 -//.word 0x703b1878 -//.word 0x61bcdaa0 -//.word 0xd7ca9dcd -//.word 0x315957a9 -//.word 0xc0887b6d -//.word 0x28767a53 -//.word 0x09578a4d -//.word 0xdfc7a6f7 -//.word 0x275dd6ca -//.word 0xc484b093 -//.word 0xa0861f24 -//.word 0x96ea634a -//.word 0x900059ff -//.word 0xecbafde0 -//.word 0x25bd2de1 -//.word 0xafb8b03f -//.word 0x22f576b6 -//.word 0x9b2e21f5 -//.word 0x5fa1c54f -//.word 0xc266ecb3 -//.word 0x4801dede -//.word 0x09341fcf -//.word 0x5a17387b -//.word 0xa96abac3 -//.word 0xa92981a3 -//.word 0xb06136ac -//.word 0x5d4317b4 -//.word 0x7d76fbcc -//.word 0x2fb29072 -//.word 0x478be808 -//.word 0xf18a3485 -//.word 0x9782cf6b -//.word 0x04217ef9 -//.word 0xc9c6f6a1 -//.word 0xdf929ebc -//.word 0x8fc2977d -//.word 0x8f3cfa23 -//.word 0x6e676073 -//.word 0x3140a866 -//.word 0x3fabf41f -//.word 0x7a06f51f -//.word 0xaf0469bc -//.word 0x30b9e1cf -//.word 0xbff1c8ae -//.word 0xaec6a15a -//.word 0x457290f9 -//.word 0x64611c86 -//.word 0x698b33c7 -//.word 0x54006e7f -//.word 0x2ac497e6 -//.word 0x97de6956 -//.word 0xd6ac9647 -//.word 0xd6790f7d -//.word 0x95517f80 -//.word 0xd014184d -//.word 0xdfca934b -//.word 0xdb367280 -//.word 0x01ae8905 -//.word 0x5b2abcb7 -//.word 0x9d9a0a30 -//.word 0x4d7dcbf6 -//.word 0x26af35f1 -//.word 0xbf822523 -//.word 0x68111d93 -//.word 0x54d1888a -//.word 0xfe694602 -//.word 0xc5c4645c -//.word 0xd9642b51 -//.word 0x5bf95d2b -//.word 0xc032bb35 -//.word 0x77d3ca70 -//.word 0xcb08d787 -//.word 0x0af83905 -//.word 0xe79ed6c6 -//.word 0x1dd4e9ab -//.word 0x55b10292 -//.word 0x4a154e86 -//.word 0x2b821832 -//.word 0x412e909c -//.word 0xd156cb10 -//.word 0x44d40c59 -//.word 0x85f44238 -//.word 0xab84d10e -//.word 0xd82a95dc -//.word 0x60fb246d -//.word 0x2e4854d2 -//.word 0x64bbfe0f -//.word 0x42a30114 -//.word 0x498d89ef -//.word 0xa014913f -//.word 0xb6faa6ec -//.word 0x2977ee15 -//.word 0xe7d06a4a -//.word 0x932c78fc -//.word 0x2aa49c31 -//.word 0xe6997f7c -//.word 0x624a382d -//.word 0x00a5cbc5 -//.word 0x885eefad -//.word 0x113f1527 -//.word 0x25bfa584 -//.word 0x20d58b98 -//.word 0xd90ef26b -//.word 0x84de4f31 -//.word 0xd733a27c -//.word 0x6c50f9b1 -//.word 0x67d935b8 -//.word 0x582a10f8 -//.word 0x63ed5f83 -//.word 0x9eec958d -//.word 0xba238923 -//.word 0xe61a791a -//.word 0xf0724e45 -//.word 0xadbd21eb -//.word 0x9c93ff77 -//.word 0xc6e2e972 -//.word 0xe8851faf -//.word 0xd4189fc5 -//.word 0x150be8c2 -//.word 0xd2f6031e -//.word 0xf52cc4ee -//.word 0x8b934e5a -//.word 0x6eb3d551 -//.word 0x220ca87c -//.word 0xfead6e70 -//.word 0x8c02af27 -//.word 0x32ee97b1 -//.word 0x1119f727 -//.word 0x2d8c8de1 -//.word 0xce7b85e8 -//.word 0x27613fae -//.word 0x365353fd -//.word 0xeb8dd32e -//.word 0x8c52d09b -//.word 0x58f31f57 -//.word 0x6b2d5c1c -//.word 0xe1b73084 -//.word 0x3e1cd07c -//.word 0x0ec7c6f6 -//.word 0xc85cf4df -//.word 0xf84fd651 -//.word 0x9daf0709 -//.word 0xd042071b -//.word 0xa7d73be4 -//.word 0x59d83541 -//.word 0xa31f36fe -//.word 0x6a0af192 -//.word 0xa1d29209 -//.word 0x6d18ff41 -//.word 0x87c15e59 -//.word 0xe304d767 -//.word 0x8fc19b69 -//.word 0xdd15257f -//.word 0xc42bc057 -//.word 0x845549e8 -//.word 0x895b3663 -//.word 0x9213d766 -//.word 0x1231dc73 -//.word 0xd66118a2 -//.word 0xe9938492 -//.word 0xb59687a5 -//.word 0x6ae9746d -//.word 0xa4ce5561 -//.word 0x489fe7d5 -//.word 0xae65e529 -//.word 0x06a78940 -//.word 0xf4805133 -//.word 0x7ef4ff47 -//.word 0x2884e31d -//.word 0x5d005c29 -//.word 0x119d9d65 -//.word 0xa548ad47 -//.word 0x0b39b1f0 -//.word 0x2aca6ea6 -//.word 0x848a0a84 -//.word 0x168d1270 -//.word 0x7f07c24e -//.word 0x65198073 -//.word 0x15eba95d -//.word 0x69fb90a1 -//.word 0xefb5c424 -//.word 0x4743928e -//.word 0xcda6cbfc -//.word 0x7906c8f6 -//.word 0x0346aaa0 -//.word 0x4adce634 -//.word 0xf6e002af -//.word 0x5c6299cb -//.word 0xa301a52e -//.word 0x25b9fee1 -//.word 0x18fd1d03 -//.word 0x6e0626bf -//.word 0xf96a267b -//.word 0xd3f09852 -//.word 0xfda32fc5 -//.word 0x4625cfad -//.word 0x6f46dc74 -//.word 0x8cd5b885 -//.word 0xadb78701 -//.word 0xbe3536b4 -//.word 0xac9abb47 -//.word 0xcafe9eb7 -//.word 0x725db806 -//.word 0xefec3b30 -//.word 0x9aacf260 -//.word 0x443fca64 -//.word 0xd4fb925e -//.word 0x313dffbd -//.word 0x63fff36c -//.word 0xf5adfe49 -//.word 0x9d3526d9 -//.word 0x1f5ee33a -//.word 0x6e5a6e59 -//.word 0x149e3b65 -//.word 0xd5f1c483 -//.word 0x8fc389c3 -//.word 0x65c15552 -//.word 0x1ca6c2f2 -//.word 0xc554ffa8 -//.word 0x9d23d1b4 -//.word 0x3179d8c6 -//.word 0xc69b146f -//.word 0xf7c2a8d6 -//.word 0xa072ddac -//.word 0xfb076962 -//.word 0x0991f299 -//.word 0x34e1ceda -//.word 0x32e40d87 -//.word 0x2c30b911 -//.word 0x20dd5c6c -//.word 0x8496c3c0 -//.word 0x2cef0262 -//.word 0x6df9b802 -//.word 0x83159426 -//.word 0x300518d7 -//.word 0xa6499d99 -//.word 0xa7a898a1 -//.word 0xeb0d1b43 -//.word 0xc2949faa -//.word 0xfae500cb -//.word 0x03c1c99b -//.word 0x51dab280 -//.word 0x02e86706 -//.word 0xc1f98bd4 -//.word 0xea08fdde -//.word 0xeed25adc -//.word 0xfae5c3fa -//.word 0xd3fae0d1 -//.word 0x05842496 -//.word 0x3c895391 -//.word 0xf2b142d1 -//.word 0x4a9ddf1f -//.word 0x3c797030 -//.word 0xf3d5201f -//.word 0x73b0b71a -//.word 0x7fd6a95b -//.word 0xba6d5259 -//.word 0x0cca8040 -//.word 0x4789329f -//.word 0x0bdc9f61 -//.word 0xe7237aff -//.word 0xc0bd75f4 -//.word 0x771e0470 -//.word 0xc6226350 -//.word 0x6ba1da4e -//.word 0x89444075 -//.word 0x4b97bed9 -//.word 0xca5fd584 -//.word 0x312da2b3 -//.word 0x1f336143 -//.word 0x4c573166 -//.word 0x7086169a -//.word 0x604b44dc -//.word 0x7aa09b18 -//.word 0x44046ee5 -//.word 0x50cd886f -//.word 0x63c071b4 -//.word 0xd5dfedf4 -//.word 0x3b82c662 -//.word 0x44a9cb20 -//.word 0xe191196a -//.word 0xa9859912 -//.word 0x7bf7ca2c -//.word 0x65cfc10a -//.word 0xc4036e6b -//.word 0xad6820ef -//.word 0x8cc84bce -//.word 0x0b348aca -//.word 0x369be062 -//.word 0xdc9c4349 -//.word 0x38995b16 -//.word 0xd00d873d -//.word 0x9e1f213e -//.word 0x6e77031c -//.word 0x87504911 -//.word 0x8dce5980 -//.word 0xa692212b -//.word 0xdc8da0a6 -//.word 0xc311a80c -//.word 0x5b2ee2f0 -//.word 0x373b1296 -//.word 0xdfb39c63 -//.word 0x74434893 -//.word 0x9220422a -//.word 0x7a9e652d -//.word 0x71ffb811 -//.word 0x63883974 -//.word 0xccdbda0b -//.word 0xd980cadc -//.word 0xcac5f5ad -//.word 0x9ac8cebc -//.word 0xe2d24cb0 -//.word 0xfbe632d0 -//.word 0x629a9473 -//.word 0x612697b7 -//.word 0xecbb7876 -//.word 0xca16d076 -//.word 0xf55416e0 -//.word 0x420865f4 -//.word 0x448b7ffa -//.word 0x6e93137c -//.word 0x79073bb2 -//.word 0x0512493e -//.word 0x8377c31a -//.word 0x5224acce -//.word 0x280905e6 -//.word 0xb42a94a3 -//.word 0x82f3e4f1 -//.word 0x1ecc8d99 -//.word 0x7ceeb5b8 -//.word 0x9775d770 -//.word 0x59b6c4dd -//.word 0xbbd2e74a -//.word 0x2d8ccca5 -//.word 0x3857e431 -//.word 0x62b3827b -//.word 0x52ba2a8f -//.word 0x34f60b6b -//.word 0x5f76cab4 -//.word 0x352181a8 -//.word 0x4b4a0854 -//.word 0xcb847307 -//.word 0x16b7db06 -//.word 0xad736281 -//.word 0x518571c6 -//.word 0x69c844b5 -//.word 0xa53ea974 -//.word 0xe15f0464 -//.word 0x4cb19753 -//.word 0xc99900f3 -//.word 0x9571038a -//.word 0x2ada8aec -//.word 0x6454eaa7 -//.word 0xe30c687d -//.word 0xb0f4fc17 -//.word 0x231955f7 -//.word 0x04321caf -//.word 0xf0747d50 -//.word 0xfeaee426 -//.word 0xa39104a2 -//.word 0xd34f1e98 -//.word 0x696980ab -//.word 0xc9c14c05 -//.word 0xc4f77a4b -//.word 0xbcf220cf -//.word 0x08bdf108 -//.word 0x99950440 -//.word 0xde40d88d -//.word 0xe6a09402 -//.word 0xc5879326 -//.word 0x38cd1fa5 -//.word 0x8ca07d46 -//.word 0xbb1c2b1d -//.word 0xd91b6502 -//.word 0xae4fed42 -//.word 0xa58e0c94 -//.word 0xe56cd44e -//.word 0xbd0fa9d8 -//.word 0x453f0061 -//.word 0x42bd65d2 -//.word 0x4bd6c300 -//.word 0x2a37e026 -//.word 0x85032792 -//.word 0xbe23aa9e -//.word 0x17de67e2 -//.word 0x1aa9caa8 -//.word 0x384074a0 -//.word 0xb0f53bd6 -//.word 0xb24872e0 -//.word 0xc4b96a5c -//.word 0x66da389a -//.word 0xf1a8b995 -//.word 0xc51bd428 -//.word 0xa3fcff7e -//.word 0x58f705cb -//.word 0x9cf10639 -//.word 0x399cbf26 -//.word 0x70480b8c -//.word 0x98fcaac0 -//.word 0x08c54260 -//.word 0x374ea386 -//.word 0x22b14f42 -//.word 0xee8d3a48 -//.word 0xcf59cee5 -//.word 0x28f73238 -//.word 0xf48ccc9e -//.word 0x6490056e -//.word 0xc9214ce7 -//.word 0xb59d5d66 -//.word 0x5d6fc3dc -//.word 0x42299b80 -//.word 0x11d49cc1 -//.word 0xc783547f -//.word 0x182fb47a -//.word 0x12becf0b -//.word 0xfe65df12 -//.word 0x8730892f -//.word 0x1edf6235 -//.word 0x9cf4b1db -//.word 0x290a77b5 -//.word 0x5d68ac63 -//.word 0xa6d6cc09 -//.word 0xeab092ff -//.word 0x6d3803c9 -//.word 0xf430af49 -//.word 0x2ba93433 -//.word 0x441603c2 -//.word 0xe1a467a9 -//.word 0x34cec34d -//.word 0x642b1b31 -//.word 0x338bd5b1 -//.word 0xdf43c1f4 -//.word 0x45c5581c -//.word 0x4c7441bf -//.word 0x81b61a9b -//.word 0xff4a7485 -//.word 0x92dc1fa3 -//.word 0x1cd6a9db -//.word 0x377a218b -//.word 0x1b2e207b -//.word 0xc3160b10 -//.word 0x4be892c2 -//.word 0x9dfc7ccf -//.word 0x4ca3a731 -//.word 0xc0ba4ace -//.word 0x947f7ef0 -//.word 0x3ca3fdf4 -//.word 0xeba02946 -//.word 0xb34c508d -//.word 0xefae2e22 -//.word 0xde11b3c7 -//.word 0x90580796 -//.word 0x0691cc37 -//.word 0x95cda356 -//.word 0x8b2ef154 -//.word 0x1541e33d -//.word 0x608eaffb -//.word 0xff6e1dc9 -//.word 0x8d1d47ea -//.word 0x93109c9a -//.word 0xab892b45 -//.word 0xe6681ff7 -//.word 0x6c448514 -//.word 0x62ba5649 -//.word 0x1105b1c2 -//.word 0x44cf689d -//.word 0xf147be9f -//.word 0x1c746f26 -//.word 0xf9c9f15f -//.word 0x51f9fab9 -//.word 0x260d429a -//.word 0x9ab38a50 -//.word 0x0dd9dd4a -//.word 0x867a1688 -//.word 0x54b8a250 -//.word 0xf52c8723 -//.word 0x367aa5ef -//.word 0x9c283c86 -//.word 0x03b0af4f -//.word 0x85d3883b -//.word 0x9d31bbfb -//.word 0x8c172f71 -//.word 0xfc987a64 -//.word 0xe4dfed77 -//.word 0xabc3d05c -//.word 0x909cee45 -//.word 0x4955559b -//.word 0xeac357f3 -//.word 0x0935d43e -//.word 0x204dbc3f -//.word 0x320ecf43 -//.word 0xb235a70c -//.word 0xa0cdf90e -//.word 0xf5fe18de -//.word 0x4126bae7 -//.word 0x932bff5f -//.word 0x990faf79 -//.word 0x08c4c3dc -//.word 0x3e422855 -//.word 0x27d8bfc8 -//.word 0x5dbfa86d -//.word 0x93f5c038 -//.word 0x33486899 -//.word 0x46b18966 -//.word 0x95e4d516 -//.word 0x0d254f2f -//.word 0x685d0d01 -//.word 0x0a6d3c95 -//.word 0x29c266e1 -//.word 0x312af03d -//.word 0x67e6e71b -//.word 0xcc00fcf2 -//.word 0x44dfcc7b -//.word 0xf7186520 -//.word 0xf88706b2 -//.word 0x259f275a -//.word 0x4efeb9d2 -//.word 0x9944afd4 -//.word 0x2426bdd3 -//.word 0xedbe60ea -//.word 0xef251e12 -//.word 0x8e440f97 -//.word 0x35e79ccd -//.word 0x3e1387ff -//.word 0x129a2ca8 -//.word 0x91ec06e5 -//.word 0xb430742b -//.word 0x7094bd35 -//.word 0xdee15241 -//.word 0x9a52547c -//.word 0x69a656bb -//.word 0x1e74646b -//.word 0xbebf44cb -//.word 0xe2cafb59 -//.word 0x5d2d9489 -//.word 0x1f291cbd -//.word 0x5939f172 -//.word 0xe2e93db7 -//.word 0xdaebbde4 -//.word 0x8d68c788 -//.word 0x99948ba3 -//.word 0x54859916 -//.word 0x6845a357 -//.word 0xc0268469 -//.word 0xa855820c -//.word 0x2fb2d031 -//.word 0xd0df57b0 -//.word 0x5297b73d -//.word 0xed428899 -//.word 0xaec6e505 -//.word 0x1d9f2bfc -//.word 0x1c32fe21 -//.word 0x125e8d77 -//.word 0x495517d0 -//.word 0x95aaaf88 -//.word 0x37ab3c72 -//.word 0x00f0c313 -//.word 0xba34e90e -//.word 0xc364b3e0 -//.word 0xfbf691cd -//.word 0xe07c9b1a -//.word 0xf8791a7d -//.word 0x70734ad2 -//.word 0x02495e0f -//.word 0x1cc7c57a -//.word 0x3e78ac1a -//.word 0xa3bbc46b -//.word 0x25194556 -//.word 0x5bd6335f -//.word 0x04c6e021 -//.word 0xa862b2f7 -//.word 0x7c1b26fd -//.word 0x87ef1537 -//.word 0x0339360f -//.word 0x06cde505 -//.word 0x614422a2 -//.word 0xc895ddad -//.word 0x34e671a2 -//.word 0x86a16e60 -//.word 0x6dc99b22 -//.word 0x898f3bb0 -//.word 0xd12090d7 -//.word 0x32c29e16 -//.word 0x781f319a -//.word 0x72e0216d -//.word 0x517ed5ea -//.word 0x52550674 -//.word 0x9dfbc567 -//.word 0x6ccfc04f -//.word 0x6fd5c158 -//.word 0x70c17706 -//.word 0x33517926 -//.word 0xa0e08805 -//.word 0x233914df -//.word 0x54a9029a -//.word 0xd358adb4 -//.word 0x76d82b7b -//.word 0xa7ffd17c -//.word 0x07f2f93d -//.word 0x5883022f -//.word 0x99bd99de -//.word 0x72bc376b -//.word 0xd3c3eb3c -//.word 0xd9885af2 -//.word 0xf1d2049b -//.word 0x3f46c929 -//.word 0x417eab24 -//.word 0xaf5cd59b -//.word 0xa69edd60 -//.word 0x06b24675 -//.word 0x19cb49c1 -//.word 0x7534d407 -//.word 0x23e5d419 -//.word 0x0054b049 -//.word 0x648d1521 -//.word 0x0285f954 -//.word 0x0fabdaf3 -//.word 0xa7c147e4 -//.word 0x6ceaa291 -//.word 0x700424dd -//.word 0x5537215c -//.word 0xb2ce8ec3 -//.word 0xb946c09d -//.word 0x17a57640 -//.word 0x1c0e1a00 -//.word 0x1c9144a2 -//.word 0x15478014 -//.word 0x919f515b -//.word 0xcef376cc -//.word 0x1d5f6b7f -//.word 0x88d23301 -//.word 0xb7655549 -//.word 0x15ec25ed -//.word 0x2ecb4496 -//.word 0x5b0c6ab2 -//.word 0xa2ae6368 -//.word 0xd83f58d1 -//.word 0x08ad5065 -//.word 0x1959f6b3 -//.word 0xaa6d9d56 -//.word 0x41708124 -//.word 0xa51750a8 -//.word 0x885ee9d3 -//.word 0x69d863ee -//.word 0xb94351d3 -//.word 0x3d60445d -//.word 0xb302921d -//.word 0xb864564e -//.word 0xe9bfb80b -//.word 0x491c6fc0 -//.word 0xe36784df -//.word 0xb0c658d4 -//.word 0xba29e83a -//.word 0x8221504f -//.word 0x9ff58ea5 -//.word 0xa9f3891b -//.word 0x5504520c -//.word 0xe183a9c6 -//.word 0xb34fc33e -//.word 0x3d1f4a02 -//.word 0x2316a66e -//.word 0xa0987b23 -//.word 0x265b72b5 -//.word 0x44c13da4 -//.word 0xcd65d58e -//.word 0x37f306a2 -//.word 0x413e2e58 -//.word 0xd88c425f -//.word 0x3c3411d7 -//.word 0x5f6ccdc1 -//.word 0x80000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x000145C0 -//// expected output -//.word 0xcc785d5e -//.word 0xd3094ac1 -//.word 0x2e2069c4 -//.word 0x6e3b81fe -//.word 0x9830ac5f -//.word 0x7d752880 -//.word 0xac683a7c -//.word 0x80433c8d -//.word 0x9b2c9bf5 -//.word 0x9c8e717a -//.word 0xf3b730ae -//.word 0xcf76dba6 -//.word 0xde4d4e6d -//.word 0x4cf9fb60 -//.word 0xf550c6eb -//.word 0x77baf5e2 -//// SHA512LongMsgvector_105 -//// vector length -//.word 0x000148D8 -//// input message -//.word 0x2d01188e -//.word 0xaeb6996f -//.word 0x1e6aa604 -//.word 0x68b78943 -//.word 0x37e18139 -//.word 0xf6fe5c4f -//.word 0xfb5a48cd -//.word 0xff19e79c -//.word 0xd21ea150 -//.word 0x4c2c3e66 -//.word 0x874bb4c9 -//.word 0x4b6e3d9b -//.word 0xca52ad33 -//.word 0x8ea90362 -//.word 0xaf783efb -//.word 0x49be7292 -//.word 0x2d561a83 -//.word 0xd71eb037 -//.word 0xa1597ba2 -//.word 0x3652a910 -//.word 0x48439d22 -//.word 0x86748a13 -//.word 0xc8a74140 -//.word 0x8db447e8 -//.word 0xa8712b30 -//.word 0x36d4166a -//.word 0xd35ca496 -//.word 0x0eacf229 -//.word 0x1a7af90e -//.word 0xc6a71aeb -//.word 0xaeaff9a5 -//.word 0xb3448f26 -//.word 0xaa367b5e -//.word 0x51969987 -//.word 0x871bd6ae -//.word 0xbcc4436f -//.word 0xa6bf6800 -//.word 0x358ada71 -//.word 0xca581031 -//.word 0xa4b672d5 -//.word 0x9a6eb315 -//.word 0x10ac6117 -//.word 0x245fbaf1 -//.word 0x28e2c269 -//.word 0x55dc92fe -//.word 0xbd65f32d -//.word 0x826a2bed -//.word 0x4652177c -//.word 0xe2e17a5d -//.word 0x5b5d95a2 -//.word 0x12f0f867 -//.word 0x3a4e979f -//.word 0x8f972013 -//.word 0x457f8ca7 -//.word 0x3facf5df -//.word 0x8260a7a3 -//.word 0xe957793f -//.word 0x1af35eae -//.word 0xb8963718 -//.word 0xdb4feb99 -//.word 0xbdbaba44 -//.word 0xb621ce68 -//.word 0x6ae71311 -//.word 0x412749d2 -//.word 0x179858c2 -//.word 0x35b4e3c5 -//.word 0x80191f0d -//.word 0xf12fe6e0 -//.word 0x450b079b -//.word 0xf693e1f7 -//.word 0x69e3308b -//.word 0x69f02692 -//.word 0xd46bbeef -//.word 0x94e94d6e -//.word 0xd140594d -//.word 0x6534affb -//.word 0x9153b01f -//.word 0xee1decdc -//.word 0xa668f253 -//.word 0xe303656a -//.word 0x889a53cc -//.word 0x20d9c332 -//.word 0x13d48de0 -//.word 0x20a76f72 -//.word 0x07595cd8 -//.word 0x860717a0 -//.word 0x873e0173 -//.word 0x98a830e3 -//.word 0x9bebc064 -//.word 0xbfce6e97 -//.word 0xaf9e62cf -//.word 0x09d04dce -//.word 0x11e7b4cf -//.word 0xa7988cca -//.word 0x762c06f3 -//.word 0x6f27ac83 -//.word 0x7627adbc -//.word 0x5a0e7527 -//.word 0x0b638121 -//.word 0x07f67295 -//.word 0x16c3600b -//.word 0x371970e2 -//.word 0xdafca9d9 -//.word 0x4fc703d5 -//.word 0x7f16c1de -//.word 0xdae2016a -//.word 0x90ee92de -//.word 0x04620552 -//.word 0x7eb60794 -//.word 0x1fd2ee70 -//.word 0x1b74912f -//.word 0x22d15d5e -//.word 0x1f7fa5d1 -//.word 0x25923ae7 -//.word 0xa6063c0e -//.word 0xe75d2f8a -//.word 0xb0885173 -//.word 0x480b2bfd -//.word 0xa15d67fd -//.word 0xcf8de1a8 -//.word 0xbe2b019d -//.word 0x25664726 -//.word 0xb67227ba -//.word 0x982d18c7 -//.word 0x1601e8af -//.word 0x990c5210 -//.word 0xd37ed249 -//.word 0x3e43b83a -//.word 0xc5e37c4b -//.word 0xc0a651af -//.word 0x26fbfcea -//.word 0xfe1ae790 -//.word 0x17e97150 -//.word 0xf91c8932 -//.word 0x1ba17b1d -//.word 0x573b099c -//.word 0x9a6dbee1 -//.word 0xe0997f0b -//.word 0x606963a4 -//.word 0x036ec56e -//.word 0x1b07975f -//.word 0x5285f8ea -//.word 0xe08c0980 -//.word 0x02bcfd57 -//.word 0xa791706a -//.word 0x6c88fac1 -//.word 0xca8403f2 -//.word 0x8e6fd9e8 -//.word 0x8a24ffe3 -//.word 0x8b8dc9c0 -//.word 0x8b08257b -//.word 0x2710bcf2 -//.word 0x53193aeb -//.word 0x4cbbe959 -//.word 0xce1385db -//.word 0x88674c86 -//.word 0xcd0854e4 -//.word 0x8c7d213c -//.word 0x82dd7714 -//.word 0xae7d6df5 -//.word 0x05cbc36e -//.word 0x687a755b -//.word 0xd3e09068 -//.word 0xd79c45d0 -//.word 0x4a7b3c6b -//.word 0x3d9d2be7 -//.word 0x2ed3a655 -//.word 0x7f4c39e8 -//.word 0x2771b4fa -//.word 0xa80dc650 -//.word 0x41b1cd9f -//.word 0x6457ed4f -//.word 0x6a455f7e -//.word 0x86340c48 -//.word 0xf7b25b46 -//.word 0x82c54754 -//.word 0x20d1b498 -//.word 0xf4bb03c0 -//.word 0x7f4fe48a -//.word 0x17df6b8a -//.word 0x952d6728 -//.word 0x4f8cefe8 -//.word 0x46413dee -//.word 0xa02fc0c1 -//.word 0x58b46c4f -//.word 0x34ce5531 -//.word 0xf7827c31 -//.word 0xd87ee809 -//.word 0x34fdf96e -//.word 0x80ebfa4d -//.word 0x8149f555 -//.word 0xbfd4cbb5 -//.word 0x37e18327 -//.word 0x508ce32d -//.word 0x10113d9a -//.word 0x907a8c55 -//.word 0xad7bc05a -//.word 0x019a5501 -//.word 0x12922a83 -//.word 0xc8fa91ba -//.word 0x2522a228 -//.word 0x303ed63b -//.word 0x32c6d1cf -//.word 0x251c7ef5 -//.word 0x6a7061f3 -//.word 0xbae1298c -//.word 0x5fe48581 -//.word 0xa4ea3957 -//.word 0x8a3d715b -//.word 0xbc2b55e4 -//.word 0xc567ddd8 -//.word 0x81ace771 -//.word 0xd1a38741 -//.word 0x93079e74 -//.word 0xd207ae56 -//.word 0x39ecec15 -//.word 0xcefb97c7 -//.word 0xdd9d89ae -//.word 0x31bd0cbb -//.word 0x8a72ee52 -//.word 0x4cded84d -//.word 0x7556db43 -//.word 0xd1c24c0a -//.word 0x7147d27a -//.word 0x5924bd74 -//.word 0x79da9923 -//.word 0xdf900382 -//.word 0x2ab5bc1f -//.word 0x42e7fc1e -//.word 0x46140980 -//.word 0xc6df07a6 -//.word 0x33451210 -//.word 0x93808a6b -//.word 0x792baecb -//.word 0x35a86d35 -//.word 0x48bf7860 -//.word 0x1b879cbc -//.word 0xf08a4fb4 -//.word 0x18248930 -//.word 0x662cd55f -//.word 0xe5d6a7b3 -//.word 0xc6d8f02d -//.word 0x9cccf0da -//.word 0xccd64b9e -//.word 0x3e866030 -//.word 0x5900d666 -//.word 0x2f5a77b3 -//.word 0xf44542ee -//.word 0xb5f0bb54 -//.word 0x462986d1 -//.word 0x7dc6347b -//.word 0x9d435d5f -//.word 0x15acef81 -//.word 0x6bbdc51e -//.word 0x73497c34 -//.word 0xc4d88245 -//.word 0x6c946f57 -//.word 0xe366993f -//.word 0x3e5ce21f -//.word 0xa54ed52e -//.word 0x07c1f2b7 -//.word 0x0c0b4565 -//.word 0x4cb83ebd -//.word 0xbe2dbcec -//.word 0x738b6bc3 -//.word 0x84d65000 -//.word 0x4957a2cf -//.word 0xcb3edc90 -//.word 0x7c8c10db -//.word 0x26307ec1 -//.word 0x22706555 -//.word 0xca8b196c -//.word 0x309d56a0 -//.word 0x11c2d49b -//.word 0x047e1b92 -//.word 0xf75d990f -//.word 0xdcd6f2f4 -//.word 0xa07597bd -//.word 0x5d3a9a05 -//.word 0xd03cc14b -//.word 0x0d91d9f7 -//.word 0x71724c98 -//.word 0xd99bf670 -//.word 0x11f13532 -//.word 0x90673f0a -//.word 0x6222b9de -//.word 0x65dc85d4 -//.word 0xb886db14 -//.word 0x71319bcf -//.word 0x8e2ee180 -//.word 0x2f74da71 -//.word 0x0243d781 -//.word 0xfe07a026 -//.word 0x547f0bae -//.word 0xa21ecdca -//.word 0x6ab28f4c -//.word 0xc4434530 -//.word 0x4f3ebbd9 -//.word 0x6dd3709e -//.word 0xb09ba885 -//.word 0x8f7ebd4e -//.word 0x5ed4b6b4 -//.word 0x7dca1aef -//.word 0xcf07077d -//.word 0x6d907e22 -//.word 0x9ce9012e -//.word 0xfd7e60fe -//.word 0x0441d0c5 -//.word 0xab933d8d -//.word 0x6868e178 -//.word 0x5ca6164c -//.word 0xcdcf682e -//.word 0xd6e0efae -//.word 0x5d79dc04 -//.word 0x463d5199 -//.word 0xe67c76ca -//.word 0xbb10c9e8 -//.word 0x5a84b583 -//.word 0xa87c67e8 -//.word 0x4d50dde8 -//.word 0x66fb3fdb -//.word 0x7a3473e5 -//.word 0xb0daec78 -//.word 0x3f95c21a -//.word 0x25bb0869 -//.word 0x1c705a5c -//.word 0xca12b5cb -//.word 0x38d48b32 -//.word 0x85a817b2 -//.word 0xdc63ef58 -//.word 0xa31bd8a2 -//.word 0xf5d4dd3f -//.word 0x535ca317 -//.word 0x9674f78b -//.word 0x2830a9fe -//.word 0x74a19d94 -//.word 0x9bb11f39 -//.word 0x694d77e6 -//.word 0x87cabd1f -//.word 0xf281efc1 -//.word 0xabbd41fa -//.word 0xb1d8b499 -//.word 0x2ca0ea88 -//.word 0xebff3996 -//.word 0x10dcfe7a -//.word 0x0a3c3415 -//.word 0xc4ad45f8 -//.word 0x1ce41f26 -//.word 0x97a58b1b -//.word 0x53e3ba0d -//.word 0x3d292171 -//.word 0x833888c1 -//.word 0x4df25d7d -//.word 0xa8764d70 -//.word 0xc28d1634 -//.word 0x5d4596f8 -//.word 0x7edb2881 -//.word 0x65de316f -//.word 0xc292f6c2 -//.word 0x2693b19c -//.word 0xb8bae348 -//.word 0x2944eb7c -//.word 0xea31d8db -//.word 0x9ceb7cbe -//.word 0xc828c134 -//.word 0xd0114148 -//.word 0x25a41082 -//.word 0xbb57dcb0 -//.word 0xbafe39e5 -//.word 0x77ee36c3 -//.word 0xa26334f6 -//.word 0xc11ff801 -//.word 0xdc54fe3d -//.word 0x7ac4101e -//.word 0xcd2718b9 -//.word 0x2acd3383 -//.word 0xbc84065c -//.word 0x78bc55cc -//.word 0x53e9d18c -//.word 0xb3293248 -//.word 0x242786a3 -//.word 0x4d3fc97c -//.word 0x22e3b56f -//.word 0x5b3ddb9f -//.word 0x2415f3b3 -//.word 0x16f6711f -//.word 0x668c59a5 -//.word 0x5c51531b -//.word 0x0769026e -//.word 0x30c992e7 -//.word 0x8c9f90ad -//.word 0x35eeff8c -//.word 0x5b79a8f4 -//.word 0x37e3b145 -//.word 0x41147149 -//.word 0xa3df8302 -//.word 0xede119a7 -//.word 0x0aac93e9 -//.word 0x7325517a -//.word 0xa22ac5d0 -//.word 0xca78cc27 -//.word 0xc5cc3ec5 -//.word 0x4e49c381 -//.word 0x701ae986 -//.word 0x3e587455 -//.word 0xc52ef609 -//.word 0x3f3b9fdf -//.word 0x8a3755f5 -//.word 0xd8da0752 -//.word 0xa7f93f27 -//.word 0xf4f3f754 -//.word 0xab4bae2e -//.word 0x6396bb80 -//.word 0x4898e0d0 -//.word 0x58aa22e3 -//.word 0xd35ed883 -//.word 0xec66037f -//.word 0xc5b2ddf4 -//.word 0x9ad9b5cb -//.word 0x3dbaf983 -//.word 0xc2639530 -//.word 0x7b327bc4 -//.word 0x2739838e -//.word 0x66e77600 -//.word 0x70e565b5 -//.word 0x073f40b3 -//.word 0xaac4a4ed -//.word 0x0caff30c -//.word 0xc487aa6e -//.word 0x4643ef6f -//.word 0x12b26ae8 -//.word 0x2b1a56f6 -//.word 0xcb20d8fd -//.word 0x55e78fec -//.word 0x8b7c6cc2 -//.word 0x0172c451 -//.word 0xd1c9a341 -//.word 0x91156459 -//.word 0x82db7efa -//.word 0x0a3fa1ec -//.word 0x65dc025e -//.word 0x97f4f327 -//.word 0xa5c9b652 -//.word 0x044a93da -//.word 0x52f228b2 -//.word 0x44ee0108 -//.word 0xe07e68cb -//.word 0xec9d7e6b -//.word 0xa6e48be0 -//.word 0xb5ac93ed -//.word 0x60732aa6 -//.word 0xfe818830 -//.word 0xadcae0c8 -//.word 0x4717ee06 -//.word 0x9261d063 -//.word 0xb77d16fa -//.word 0xf6ff1c8b -//.word 0x975898c5 -//.word 0x24416fc5 -//.word 0xd55dcdda -//.word 0x4c19748b -//.word 0x82d854db -//.word 0x024d5ccb -//.word 0x55279121 -//.word 0xbdf45d68 -//.word 0x263f2938 -//.word 0x59fc2eb7 -//.word 0x73278760 -//.word 0x95a78b03 -//.word 0xde785b0d -//.word 0x9609b70a -//.word 0xace31668 -//.word 0x638cf57e -//.word 0x48ab6fcd -//.word 0x676c0e85 -//.word 0xbe26e14b -//.word 0xf23cce39 -//.word 0x41412a26 -//.word 0xb85f8728 -//.word 0xa6f9cd58 -//.word 0x508f8dd5 -//.word 0xe6e2910c -//.word 0xb659b836 -//.word 0xa0a40121 -//.word 0xca9fe534 -//.word 0x9579eaae -//.word 0xcf15752e -//.word 0x2ab0df78 -//.word 0xecc5cc76 -//.word 0xe92db87d -//.word 0xae8bd3d2 -//.word 0x00e70f6d -//.word 0x859977fc -//.word 0xc069c22b -//.word 0x43f42823 -//.word 0x1f527450 -//.word 0xa0f55b68 -//.word 0x37d40ca9 -//.word 0xb8c90862 -//.word 0xc53834b4 -//.word 0x8af22c9a -//.word 0xac59db27 -//.word 0x7bc4490f -//.word 0x6f25b369 -//.word 0xd2e9e1b3 -//.word 0xba1fb417 -//.word 0x3addffec -//.word 0xd9df9780 -//.word 0x4372ae15 -//.word 0x3f905c29 -//.word 0xe14d7ffb -//.word 0x0172c54a -//.word 0xec670760 -//.word 0x5856d94f -//.word 0x9e8d5f7b -//.word 0x23246258 -//.word 0x17e0a275 -//.word 0x63586eba -//.word 0xdc5673ee -//.word 0xbd80d27b -//.word 0x54387576 -//.word 0xfbc0a2da -//.word 0x4aa2d014 -//.word 0x8b4fbac5 -//.word 0x6e06b3c3 -//.word 0xfff73961 -//.word 0xd4a9ccf0 -//.word 0x8b990185 -//.word 0x7424d2fd -//.word 0x8aa6383f -//.word 0xa8e4fcc1 -//.word 0xf9a7c94e -//.word 0xb1aa8706 -//.word 0xfab6e4a6 -//.word 0x310c3309 -//.word 0x53037aef -//.word 0xb2f2c6fe -//.word 0xed50c206 -//.word 0x1e1a8889 -//.word 0x5575b77b -//.word 0x4695c646 -//.word 0x3edd9811 -//.word 0x5c485042 -//.word 0xfd076641 -//.word 0x786cfb7f -//.word 0x0c0669b8 -//.word 0x160e1f75 -//.word 0x8701acd4 -//.word 0x968f198b -//.word 0xb2b47c2b -//.word 0xbb25caa2 -//.word 0x71eded04 -//.word 0x2d58168b -//.word 0xcf1055dc -//.word 0xf786678b -//.word 0x7893cfe2 -//.word 0x096028de -//.word 0x3e83b97b -//.word 0xb76a4a31 -//.word 0x98fd36bf -//.word 0x387fc227 -//.word 0x1eb5adfa -//.word 0x294b08d5 -//.word 0x0e73482c -//.word 0x08cf9a46 -//.word 0xca917689 -//.word 0xb9e177f8 -//.word 0x587f6afa -//.word 0x03a9a55d -//.word 0xe13f9a9a -//.word 0x1425ab5b -//.word 0x32e9403a -//.word 0xf9a517cc -//.word 0x3e27dcde -//.word 0x2750fafe -//.word 0x9abab03e -//.word 0xf59d6734 -//.word 0x00f44345 -//.word 0x20dbf824 -//.word 0xcd3cdf95 -//.word 0x45aa4977 -//.word 0x828d1301 -//.word 0x6a807a4c -//.word 0x47f73111 -//.word 0x7625b1b5 -//.word 0x631dd182 -//.word 0xb5379638 -//.word 0xc5b54cc4 -//.word 0x55a6d54f -//.word 0x7f0b427a -//.word 0xeb39a0e8 -//.word 0x457e14fe -//.word 0xee072be6 -//.word 0xf2016bda -//.word 0x3bff2e9f -//.word 0x049cb04f -//.word 0x9061665c -//.word 0x1be991d2 -//.word 0x114214dc -//.word 0x7e97828a -//.word 0xc50c7cd1 -//.word 0x96ea3ad4 -//.word 0x1afc6761 -//.word 0x703932bf -//.word 0x5da2a2a7 -//.word 0x3f6e2990 -//.word 0x43657d30 -//.word 0xd88aa33f -//.word 0x64fc4c7e -//.word 0x351e65f8 -//.word 0xbaf6ea87 -//.word 0xf3d3fb9b -//.word 0x26333137 -//.word 0xd4e3323c -//.word 0xeb6883ea -//.word 0x3d9e9ea4 -//.word 0x319f45f3 -//.word 0xb8e615ce -//.word 0x83b55e19 -//.word 0x74b3326b -//.word 0x52dabc14 -//.word 0xc090d35f -//.word 0x7014cf14 -//.word 0x941c9c41 -//.word 0x95bd0d3a -//.word 0x088a72df -//.word 0xde006c1d -//.word 0xda2200b8 -//.word 0x4960eb47 -//.word 0xedbd3580 -//.word 0x3a3109b5 -//.word 0xc54cc49f -//.word 0xf91d4c5b -//.word 0x0b52a3b2 -//.word 0x31a0bc9d -//.word 0x0f668d08 -//.word 0x728d65d7 -//.word 0x41b28027 -//.word 0xb187d9d6 -//.word 0xb7763f45 -//.word 0xc388ab5c -//.word 0xab86d1cf -//.word 0xe55ef5a0 -//.word 0xfac700e6 -//.word 0x3728d3cc -//.word 0xa6b6dbdc -//.word 0x3ddde57e -//.word 0x54e234bb -//.word 0x5dc6d147 -//.word 0xcf6d23bf -//.word 0x6300bf2f -//.word 0x838f81d7 -//.word 0xfffbdc2f -//.word 0x03136e28 -//.word 0x46fdd8b5 -//.word 0x83d8cc8a -//.word 0x2d9f6823 -//.word 0x5f50c209 -//.word 0x124ec451 -//.word 0x92043a65 -//.word 0x33cc2907 -//.word 0x3f0f6292 -//.word 0x34ad5883 -//.word 0x2c9f2f39 -//.word 0x9ddb15f9 -//.word 0x4277d535 -//.word 0x5912a90e -//.word 0x0f705017 -//.word 0x3964615c -//.word 0x44f3dfa3 -//.word 0x6fb60df1 -//.word 0x37808450 -//.word 0x134182d0 -//.word 0x622a85cc -//.word 0xa212196e -//.word 0xe219ee75 -//.word 0x7a8b2d36 -//.word 0xf9070ce1 -//.word 0x5fe0a106 -//.word 0x8dc3f358 -//.word 0xf99a57b0 -//.word 0xa6b1fa55 -//.word 0x5417ba7a -//.word 0xf4483a08 -//.word 0x5e08359e -//.word 0x469212d6 -//.word 0x6cf2b9cb -//.word 0x14b0a6d8 -//.word 0xb6ae3ba2 -//.word 0xf6535b58 -//.word 0xd6e93439 -//.word 0x2b445c57 -//.word 0x4ea5209b -//.word 0x13de190a -//.word 0xffb60046 -//.word 0xb58ec258 -//.word 0xb245d7ac -//.word 0x3a5ad05d -//.word 0x925030b4 -//.word 0x70577deb -//.word 0xb0289736 -//.word 0x48314804 -//.word 0x7ef21b81 -//.word 0x59a77260 -//.word 0x5527d3d9 -//.word 0x5a0c83ed -//.word 0xef1456f1 -//.word 0xacc7c54a -//.word 0xed5a4176 -//.word 0xced4c74c -//.word 0x536fb584 -//.word 0xe641dc79 -//.word 0x071bd62e -//.word 0x3fb2998f -//.word 0x55fc4dfa -//.word 0xc5dd5bfe -//.word 0x6e03c763 -//.word 0x8b0fbf6a -//.word 0xe4f57455 -//.word 0x46a5282a -//.word 0x30eb88b5 -//.word 0xcf933dcc -//.word 0x2cd2bed7 -//.word 0xa5e1688f -//.word 0x9aebd005 -//.word 0x682958e6 -//.word 0x9b4c00fe -//.word 0x5f1b7ffc -//.word 0x385d9375 -//.word 0xf3f9952b -//.word 0xdd5c508e -//.word 0x321b1383 -//.word 0xd8d90565 -//.word 0x4d6cb949 -//.word 0xdf3b0287 -//.word 0x1bea0976 -//.word 0x873a9c76 -//.word 0x942ac934 -//.word 0xce63ac29 -//.word 0x56d28564 -//.word 0x92970d8a -//.word 0x231e0b1b -//.word 0x178b22f6 -//.word 0x605ced20 -//.word 0x85494ec1 -//.word 0x986f026f -//.word 0x68ae79af -//.word 0xf750e5b9 -//.word 0x2feb927c -//.word 0xd08875e2 -//.word 0xad040755 -//.word 0x18b75482 -//.word 0x9b544e5d -//.word 0xe9106865 -//.word 0x13076029 -//.word 0xffdb5c0b -//.word 0x179e3944 -//.word 0x3ef22028 -//.word 0x086e5aab -//.word 0x2a446525 -//.word 0x2f214752 -//.word 0x6d55229d -//.word 0x3834099e -//.word 0x55bc12e1 -//.word 0xb178ace9 -//.word 0x53a33374 -//.word 0x9091c201 -//.word 0x7e4b4990 -//.word 0xab7adfa9 -//.word 0x0e86599f -//.word 0x3dfe1b16 -//.word 0xe13b2ec3 -//.word 0x67409373 -//.word 0xf9e5d74f -//.word 0xad35e85e -//.word 0xfc14274b -//.word 0x7525be69 -//.word 0xb2ea34f4 -//.word 0x8c2d3f9a -//.word 0x8b9fd939 -//.word 0xa0c095eb -//.word 0x17fe3440 -//.word 0xc72173ca -//.word 0x8ce628df -//.word 0xf7ea8d9a -//.word 0x43cadc23 -//.word 0x8b891c30 -//.word 0x3b323acc -//.word 0xc5be5b58 -//.word 0x953771cf -//.word 0x461e0c4e -//.word 0x160b74d3 -//.word 0x9793f444 -//.word 0xa86e78b4 -//.word 0xa4d95be3 -//.word 0xd93a7a03 -//.word 0x3c038dc2 -//.word 0x5ad8b784 -//.word 0x92f45bf0 -//.word 0x82c932af -//.word 0xbfe69a70 -//.word 0xc91e3130 -//.word 0x3ee7a3b8 -//.word 0x4d00c067 -//.word 0x6e57d231 -//.word 0x50292de8 -//.word 0x136b07ba -//.word 0xb8698afc -//.word 0xd6ad2826 -//.word 0x8e222f1e -//.word 0xc0799db9 -//.word 0x7fcc357f -//.word 0xc381d2ae -//.word 0x5e72fc82 -//.word 0x324ab9b4 -//.word 0xa032a540 -//.word 0x44ae456c -//.word 0xdfc19906 -//.word 0x9458f0ed -//.word 0x58e600d3 -//.word 0xa44b3640 -//.word 0x6cfa4bda -//.word 0x555b18e5 -//.word 0x236eab06 -//.word 0x70b29a4c -//.word 0xa4459770 -//.word 0x214c455c -//.word 0xbe954beb -//.word 0x777ba6f0 -//.word 0x630a4379 -//.word 0xe664cd55 -//.word 0x2763c4d3 -//.word 0xc480cfcd -//.word 0xc5f453e5 -//.word 0xcf1d440f -//.word 0x9a223b50 -//.word 0xa5dac9c5 -//.word 0x29ea0ce6 -//.word 0x4b2e7f0c -//.word 0x955b1631 -//.word 0xa7e28bf7 -//.word 0x2a17f2ec -//.word 0x0692940d -//.word 0xd5d5fa89 -//.word 0x973048c7 -//.word 0xa7e2cda9 -//.word 0xee81d713 -//.word 0x569ccca7 -//.word 0x819e76d3 -//.word 0xbcf59f0e -//.word 0x2e74de5e -//.word 0x55f6b01e -//.word 0xb445cafe -//.word 0xc53aae4b -//.word 0x35257d71 -//.word 0x506e0cbe -//.word 0xbb7d3968 -//.word 0x61d880d2 -//.word 0xaf8bc90b -//.word 0x04cd8497 -//.word 0x63e0f873 -//.word 0x6c39d853 -//.word 0x8ae1182e -//.word 0x6d1bfefc -//.word 0xbb477cbf -//.word 0x0206bdc0 -//.word 0xf29ffe1b -//.word 0xc9a29f7d -//.word 0x0ecb7a2d -//.word 0x82287349 -//.word 0x547e5053 -//.word 0x94eaccec -//.word 0xeac4e6de -//.word 0x88c87f60 -//.word 0x5d782496 -//.word 0x8bbc2958 -//.word 0x1cccf734 -//.word 0xf04fa6b6 -//.word 0xfac5cfe6 -//.word 0xad229b13 -//.word 0xb0bb20cf -//.word 0xd966ee3b -//.word 0x59dde485 -//.word 0x346449ae -//.word 0xf5ac1891 -//.word 0x9ff69a21 -//.word 0xe67b3af2 -//.word 0x9f0c96fb -//.word 0x76f6d29a -//.word 0xdf2831d8 -//.word 0x4f98e6ef -//.word 0xabe22709 -//.word 0x0132844b -//.word 0x76657712 -//.word 0x7f6b3c7c -//.word 0x54f0e22b -//.word 0xa23ba345 -//.word 0x805671bf -//.word 0xa56fd1dc -//.word 0xd87eecf0 -//.word 0xa728e36a -//.word 0x5ce36411 -//.word 0x2d5c7b8e -//.word 0xb316aa2b -//.word 0x9e533bda -//.word 0xa637d579 -//.word 0xc52b4e54 -//.word 0xa380c0ec -//.word 0x5254dff7 -//.word 0x3bba89a7 -//.word 0x58159f2f -//.word 0xa4c51484 -//.word 0xd0064360 -//.word 0x3814868d -//.word 0x15940460 -//.word 0xf42fca84 -//.word 0x67801ef8 -//.word 0xfa300f5b -//.word 0x685f5168 -//.word 0x0f4648bd -//.word 0xa21b63e0 -//.word 0x1e35ab83 -//.word 0xff719c07 -//.word 0xb3d43340 -//.word 0x4f724878 -//.word 0x818e1eb6 -//.word 0xc5023940 -//.word 0xdce26f5e -//.word 0x7b5c4261 -//.word 0x40e26de4 -//.word 0xe98cbd52 -//.word 0xc8b722a8 -//.word 0x72f3067c -//.word 0xb81cdd3f -//.word 0xd8c6febf -//.word 0xf4deb1ef -//.word 0xc28f89eb -//.word 0x8663f437 -//.word 0x3dab1047 -//.word 0x1b20c045 -//.word 0x38ca000e -//.word 0x8721757e -//.word 0x077348ed -//.word 0x3d8535f9 -//.word 0xe17ddf86 -//.word 0xd8ff6704 -//.word 0x62973cf1 -//.word 0x9557359e -//.word 0x0ac1dd35 -//.word 0xd6e70efb -//.word 0xbbd0c1d3 -//.word 0xa01e2404 -//.word 0x3feeed3b -//.word 0x1e00eed4 -//.word 0xc018ea55 -//.word 0x1ca3a83b -//.word 0x4e9e45fa -//.word 0x8db4ce3f -//.word 0x5da60f78 -//.word 0x05f0a596 -//.word 0x44aa5b11 -//.word 0x40acb32d -//.word 0xbff5c27d -//.word 0x994e41a5 -//.word 0x6e2ae263 -//.word 0x94d1e0d1 -//.word 0x53bddae4 -//.word 0x5544e139 -//.word 0x5878d011 -//.word 0x264cdb9a -//.word 0xc7f86b70 -//.word 0xf59e2a63 -//.word 0xd02d597b -//.word 0xd3866a39 -//.word 0x07ddcb20 -//.word 0x76620074 -//.word 0xe321f442 -//.word 0xb82791a0 -//.word 0x40e78e36 -//.word 0x16dc88fd -//.word 0xde6f5547 -//.word 0x321a9500 -//.word 0xdfce8933 -//.word 0x529229cf -//.word 0x4d6e70ac -//.word 0xdf87fbc9 -//.word 0x928bd2d8 -//.word 0xe64f86fc -//.word 0xfeb77cd1 -//.word 0x9ad788ad -//.word 0x4557bd25 -//.word 0xd01c84d3 -//.word 0xfe24ec57 -//.word 0x81b2419c -//.word 0x25ace05d -//.word 0x4c4149e7 -//.word 0x9ace7620 -//.word 0xf1036cc8 -//.word 0xa0420fff -//.word 0xd7473a07 -//.word 0x5f0e0f4c -//.word 0x87f18ca1 -//.word 0x62125fcd -//.word 0x2ff8fc46 -//.word 0x197dec3c -//.word 0x21e768d9 -//.word 0x585526c8 -//.word 0x515d73f4 -//.word 0xd6f38292 -//.word 0xda8c0461 -//.word 0xaf84f830 -//.word 0x79bdc5a2 -//.word 0xe38a862e -//.word 0x10cba569 -//.word 0xd559ab88 -//.word 0x25a45620 -//.word 0xcc9aed31 -//.word 0x60cbd063 -//.word 0x75cb538f -//.word 0x11d8cc81 -//.word 0x60bdebfd -//.word 0xa8f64aff -//.word 0x7e154547 -//.word 0x3b650c15 -//.word 0xaaccf632 -//.word 0x03f6192f -//.word 0x1daf17f1 -//.word 0xdf913a6e -//.word 0xf8e0c4b1 -//.word 0xcfb28024 -//.word 0xbd539d0e -//.word 0x7be7bc5b -//.word 0xd651489c -//.word 0xaa54064e -//.word 0x0df8ed5f -//.word 0xcb3037ee -//.word 0x13b9b853 -//.word 0x6f456f5f -//.word 0xf9d95be4 -//.word 0xcd748f78 -//.word 0xbaf18977 -//.word 0x3d2ec047 -//.word 0xaf6e7ce0 -//.word 0xbdfcea8b -//.word 0x191270e9 -//.word 0x6ff83e38 -//.word 0x9b7026d2 -//.word 0x1952adf6 -//.word 0xbc7462cb -//.word 0xa3cc6ea2 -//.word 0x6ad96d7c -//.word 0x9d3e7ccc -//.word 0x72b1937e -//.word 0xb7131637 -//.word 0x09e0a6df -//.word 0x47ca3d5d -//.word 0x46a17aa1 -//.word 0xc67639e8 -//.word 0xa500673b -//.word 0x533f1539 -//.word 0x865eca17 -//.word 0x2fde1ee5 -//.word 0xacf18413 -//.word 0x3f246833 -//.word 0xbf417a00 -//.word 0x8d7449a0 -//.word 0xcaac1326 -//.word 0xc744db5b -//.word 0xbde3bdbe -//.word 0xbfa17fc9 -//.word 0xec6b6876 -//.word 0xe9a85502 -//.word 0x8f1c09f1 -//.word 0xe00dc552 -//.word 0x40a51844 -//.word 0xe298f9b9 -//.word 0x8007137a -//.word 0x4fa3606c -//.word 0x3215f911 -//.word 0x2d9e2d51 -//.word 0x1dfad07b -//.word 0xa78bd587 -//.word 0x6fb3209e -//.word 0x8a8295dc -//.word 0x35917554 -//.word 0xc72dea54 -//.word 0xe4b8e0eb -//.word 0xf44d17a9 -//.word 0xd3a376a6 -//.word 0xca34a3c5 -//.word 0xbf9ed03a -//.word 0xa849d84a -//.word 0x464a8a52 -//.word 0x0f87440b -//.word 0x6c1cc50c -//.word 0x24fe3c91 -//.word 0x18dea47a -//.word 0x32515497 -//.word 0x982dd222 -//.word 0x2536e98d -//.word 0x19fafb7f -//.word 0x0ff99819 -//.word 0x30094e7d -//.word 0xa7f9c391 -//.word 0x54750200 -//.word 0xc5291382 -//.word 0x622ace5e -//.word 0xe791f02d -//.word 0x18696fe0 -//.word 0xb0cb0b04 -//.word 0x9a472645 -//.word 0x6386d531 -//.word 0xf02e373f -//.word 0x6c060610 -//.word 0x855b6bf4 -//.word 0xd8a217b0 -//.word 0xa95e8f7f -//.word 0xd844c756 -//.word 0x109df36c -//.word 0x42ed9afa -//.word 0x52d2ec3f -//.word 0x102e55c8 -//.word 0x698852ee -//.word 0xdfb084a0 -//.word 0x36a20363 -//.word 0x70adf496 -//.word 0xfcd55efb -//.word 0x2b753973 -//.word 0xe329c809 -//.word 0x97ea2932 -//.word 0x767b2b53 -//.word 0xe3055f84 -//.word 0x26fe7294 -//.word 0x614eb94d -//.word 0xc5b50ef9 -//.word 0x0567db25 -//.word 0x0bfa74a4 -//.word 0xeb82aad7 -//.word 0x15fb9d2c -//.word 0xcee7d1e5 -//.word 0xe137841b -//.word 0x916f3f02 -//.word 0xd306ac6e -//.word 0xba0ba796 -//.word 0x330f9718 -//.word 0xf23eff3e -//.word 0xaccf5080 -//.word 0x879f024a -//.word 0xcf18e2ff -//.word 0xea58ae3d -//.word 0x8e8fdf63 -//.word 0x31a9c650 -//.word 0xc12eda6e -//.word 0x966651f0 -//.word 0xa5c0ed57 -//.word 0xf674193b -//.word 0x58683448 -//.word 0x53512d87 -//.word 0x5e1a50de -//.word 0x52895fdb -//.word 0x1f20e5ad -//.word 0xbd41c773 -//.word 0x66961cba -//.word 0x03b03e40 -//.word 0xe4ee21fe -//.word 0xb3a1e466 -//.word 0xab6da6ea -//.word 0x05f39bbd -//.word 0xb3ac5fdd -//.word 0x51188a51 -//.word 0x591984af -//.word 0x96999be2 -//.word 0xdb73522a -//.word 0xf491fc64 -//.word 0xdd528a8c -//.word 0x322ea280 -//.word 0xe79cf107 -//.word 0x3933c111 -//.word 0xe410ce41 -//.word 0x977955a8 -//.word 0xa5bf6fd4 -//.word 0xfd699d09 -//.word 0x5c8ea4ce -//.word 0xc1839bab -//.word 0x22b74232 -//.word 0x5dda953c -//.word 0x7145a175 -//.word 0xee96971b -//.word 0xaa9a1f02 -//.word 0xb671eedc -//.word 0x90ec9bb7 -//.word 0x9a3aaec7 -//.word 0xcbc4fb66 -//.word 0xa5552e59 -//.word 0x677ea655 -//.word 0x833987c1 -//.word 0x52cc0abe -//.word 0x07f01865 -//.word 0xe233184f -//.word 0xa69b055b -//.word 0x4c8cc3ab -//.word 0xf9ebb3f0 -//.word 0x2e8485e8 -//.word 0x3ea94d25 -//.word 0x061cd90f -//.word 0xd830422c -//.word 0xb82ac29f -//.word 0xcbedc5ef -//.word 0x0cd7430a -//.word 0x41e64c8a -//.word 0x2e1fe536 -//.word 0x083012cc -//.word 0x2c5434fe -//.word 0x117795ba -//.word 0x7b9b42ae -//.word 0xf27a190c -//.word 0x736c228a -//.word 0x658c23ae -//.word 0xce166e48 -//.word 0xc714fe40 -//.word 0x2e3ac291 -//.word 0x9a0e3996 -//.word 0x944c3f85 -//.word 0x04882739 -//.word 0xe9150934 -//.word 0x4d265de4 -//.word 0x7933c925 -//.word 0x659e3808 -//.word 0x72972cd2 -//.word 0x5b3d5548 -//.word 0x6905622a -//.word 0xe76017fe -//.word 0xd698a00e -//.word 0xe2fb25b4 -//.word 0x943c9ed5 -//.word 0xc816e9ac -//.word 0x623219c9 -//.word 0x3d4b1259 -//.word 0x649053a7 -//.word 0x854a12e3 -//.word 0xa2be8e23 -//.word 0x0a55a1a7 -//.word 0x88fa9461 -//.word 0xdac438b4 -//.word 0x64d5327d -//.word 0x26829750 -//.word 0xecb4b904 -//.word 0xc48d4071 -//.word 0xb54f7c78 -//.word 0xae7af944 -//.word 0xbd3554d0 -//.word 0x81ef4ea9 -//.word 0xe2461ff6 -//.word 0xff280db5 -//.word 0x68383c47 -//.word 0x8e73c82f -//.word 0x78131117 -//.word 0xb7b35613 -//.word 0x9bb5862a -//.word 0xa7e15213 -//.word 0x434e873c -//.word 0xb1869b11 -//.word 0x42e5857a -//.word 0xca42d2a5 -//.word 0x51d2f607 -//.word 0x0b48e09d -//.word 0x8b41d178 -//.word 0x33e06d78 -//.word 0xefb51358 -//.word 0x23e46aea -//.word 0xe1833ca4 -//.word 0x6043885c -//.word 0xa953d250 -//.word 0x9481be69 -//.word 0xf3a3ddc1 -//.word 0x0d35c762 -//.word 0x4e436a51 -//.word 0x3c8aa1cb -//.word 0xadda09ce -//.word 0x37be10db -//.word 0xe95f4efb -//.word 0x38a61900 -//.word 0x3ca1530d -//.word 0x1d288758 -//.word 0xc8c0342f -//.word 0xe6bf6939 -//.word 0x0eb192ff -//.word 0x39fb92aa -//.word 0x77be120e -//.word 0xe1fe18e8 -//.word 0xcf04db64 -//.word 0x4b00d6e3 -//.word 0xc5f31bfa -//.word 0x08cceabe -//.word 0x6cd1823f -//.word 0x4d413752 -//.word 0xbd38c594 -//.word 0x76d2e4ab -//.word 0x12931ccf -//.word 0x7f07db8a -//.word 0xada5c5bb -//.word 0x89f94be1 -//.word 0x2f037f96 -//.word 0x5bda265a -//.word 0x21940f92 -//.word 0xdf6aa4d0 -//.word 0x6f18bf55 -//.word 0xa183bfd5 -//.word 0xe89eda7a -//.word 0x538eb52b -//.word 0xbf0d310d -//.word 0x4c0c884a -//.word 0x0d9c9a12 -//.word 0x040e81e0 -//.word 0x4d596bff -//.word 0x99bda94c -//.word 0xdea6033d -//.word 0x4dd34f22 -//.word 0x85b742ab -//.word 0x062085ab -//.word 0xe8160b1b -//.word 0xcd06a362 -//.word 0x1420c9d4 -//.word 0x4ffdc278 -//.word 0xf785e80e -//.word 0x5f104250 -//.word 0xe7cb5779 -//.word 0x725e4404 -//.word 0x1acb0db6 -//.word 0x229931de -//.word 0x2b3381dc -//.word 0xab8b31e0 -//.word 0x9c0230f4 -//.word 0x718cb53d -//.word 0x4e0f1b7d -//.word 0x780deedd -//.word 0x0b8346ea -//.word 0xeb1153dd -//.word 0xfc5a3a1f -//.word 0x96ae1f0c -//.word 0x33e783f8 -//.word 0x6b90d16f -//.word 0x234d33c1 -//.word 0x0176aabe -//.word 0x23065ebf -//.word 0x10b433e6 -//.word 0xee5f9ca6 -//.word 0xf6afb485 -//.word 0x26fa8b20 -//.word 0x3564bd70 -//.word 0xcc4b4a4d -//.word 0xf3e2a130 -//.word 0xca1bfe3d -//.word 0x79cbf681 -//.word 0x69095178 -//.word 0xb5d617d2 -//.word 0xdb04ed76 -//.word 0xb850a2c8 -//.word 0xb3d20627 -//.word 0x3897fbba -//.word 0x688cce6d -//.word 0x0e9dc736 -//.word 0xd51ffe9d -//.word 0xb96b717b -//.word 0xbccc5402 -//.word 0xda9ca8fd -//.word 0x3ea90f59 -//.word 0xb6dedfe5 -//.word 0x651f7556 -//.word 0xb874cc8e -//.word 0x9b6a4e1e -//.word 0xecb6e909 -//.word 0x2f1c66cb -//.word 0x848ff699 -//.word 0xd79a0eeb -//.word 0x57fe7538 -//.word 0x299d9c00 -//.word 0x5d962d10 -//.word 0x21b2e602 -//.word 0x34ffa803 -//.word 0x9ebacbd9 -//.word 0x9f72b524 -//.word 0xe56babe3 -//.word 0x0141e63b -//.word 0x1ccdea74 -//.word 0xe64c1345 -//.word 0xd0be7151 -//.word 0x7b8dd6f1 -//.word 0x706f2c34 -//.word 0x118d0c24 -//.word 0xd0e58d4b -//.word 0x9eed5a76 -//.word 0xa67908b9 -//.word 0x3cdea6b3 -//.word 0x10589513 -//.word 0xa8a99a5b -//.word 0x0d0331e5 -//.word 0xc4282423 -//.word 0xffd05d2a -//.word 0x154bf872 -//.word 0x30679dd7 -//.word 0x45940de4 -//.word 0x4a46fa51 -//.word 0xa39b1cca -//.word 0xdd3e81f3 -//.word 0x9e8b25a8 -//.word 0xdcf4c289 -//.word 0x4ea3e9b6 -//.word 0x206052d7 -//.word 0xebb67160 -//.word 0xe4514913 -//.word 0x54ab85c6 -//.word 0x48e8c566 -//.word 0x89fe363c -//.word 0xce18656f -//.word 0x313d55ca -//.word 0xe02ccfc0 -//.word 0x158bf9ad -//.word 0x48412a5f -//.word 0xa321fdd5 -//.word 0xb6c8a446 -//.word 0x6cc87f66 -//.word 0x3d06ede4 -//.word 0xa6606337 -//.word 0xd693bb9a -//.word 0xab5cce55 -//.word 0xdcde443f -//.word 0x7844ab81 -//.word 0x8fa7c79c -//.word 0x2e3229ae -//.word 0x918403f1 -//.word 0x95553b84 -//.word 0x6c5dbe6e -//.word 0x947117e0 -//.word 0x0af040ba -//.word 0xbb5db851 -//.word 0x3b4dd56f -//.word 0xb9845c9c -//.word 0x335b4f9c -//.word 0xe6650639 -//.word 0x09518143 -//.word 0xba12fdd4 -//.word 0x393ec5d8 -//.word 0x54b44bcd -//.word 0x228277c8 -//.word 0xf4063fb9 -//.word 0x895378ef -//.word 0x81d5ecdf -//.word 0x1439ac21 -//.word 0x0487a8bb -//.word 0xd0917ca2 -//.word 0x2b918d7e -//.word 0xac0e55ae -//.word 0xc7fffb8c -//.word 0xfc3327f2 -//.word 0x4ef014fd -//.word 0xf7dbe710 -//.word 0x5a173f1c -//.word 0x39b10d1f -//.word 0x283ca6eb -//.word 0x42b81629 -//.word 0x1ab9b79d -//.word 0xf5c503ac -//.word 0x36fda71b -//.word 0x19ffd819 -//.word 0xa40cea80 -//.word 0xdb661f58 -//.word 0x34fcbd9d -//.word 0x4a496341 -//.word 0xd57a9c75 -//.word 0xdacfb525 -//.word 0x1f43ccc1 -//.word 0xe26f2a43 -//.word 0xcaacd36e -//.word 0x1e785a53 -//.word 0x351bfa1a -//.word 0x2e8ae3ff -//.word 0xe18bd29b -//.word 0x141ae465 -//.word 0xf30bac78 -//.word 0xbaf28397 -//.word 0xb5401f6e -//.word 0x6aae681a -//.word 0x15df86ec -//.word 0x54403f6a -//.word 0x24348097 -//.word 0x0c6e3975 -//.word 0x989d6ec7 -//.word 0x094f8c1b -//.word 0x4b0ff908 -//.word 0x27d1eeb5 -//.word 0xba91899a -//.word 0x26361e8b -//.word 0x87bccff2 -//.word 0x29925c5c -//.word 0xf8413c37 -//.word 0x374fecd9 -//.word 0x756387c5 -//.word 0xbda9972a -//.word 0x0e782aad -//.word 0x0a332968 -//.word 0xf26de633 -//.word 0xd250f422 -//.word 0xf93f3b4f -//.word 0xacba4bd9 -//.word 0x1c82f12c -//.word 0x95fe0883 -//.word 0xf7de92ac -//.word 0x6afe080b -//.word 0x4e8deee2 -//.word 0x716ea9d0 -//.word 0x85de9597 -//.word 0xd1585322 -//.word 0x26b560c6 -//.word 0x1598ecc8 -//.word 0x5f09e91f -//.word 0xad60627c -//.word 0x81650e88 -//.word 0x6db5256c -//.word 0x83687297 -//.word 0x0cf0aabb -//.word 0x7d44fc19 -//.word 0xa63fe9ff -//.word 0x2d42568f -//.word 0x3b21dfc1 -//.word 0x753d6fac -//.word 0x2eed0d01 -//.word 0xda23f9d8 -//.word 0xc64cf8af -//.word 0x0777ecaf -//.word 0xb1baa732 -//.word 0x49d10183 -//.word 0x7c0928e4 -//.word 0x105d38d6 -//.word 0x1cde0c94 -//.word 0x745853e1 -//.word 0x6832e603 -//.word 0xae965910 -//.word 0x9cd2cf68 -//.word 0x9afe1383 -//.word 0xd8dfe5ed -//.word 0x3c0c928e -//.word 0x9f4fc82f -//.word 0x384ea73a -//.word 0x586b1bc1 -//.word 0x58e86ac2 -//.word 0xd04f09aa -//.word 0x0a11b417 -//.word 0xb76dbde2 -//.word 0xe093a55d -//.word 0x1f0ae9d9 -//.word 0x0e4f1e6c -//.word 0x00bf40f1 -//.word 0xefb6484f -//.word 0xb6f9fcff -//.word 0x80510bc8 -//.word 0x817959cd -//.word 0xe43a98ca -//.word 0x04d5189b -//.word 0xdea1e0fe -//.word 0xc7f5fd99 -//.word 0x5a481a3f -//.word 0xb597516f -//.word 0xe508411d -//.word 0x9ecc61b5 -//.word 0x2f49935e -//.word 0xb679fd7c -//.word 0x908d1478 -//.word 0x14d7f9c3 -//.word 0x81e60918 -//.word 0x34f3b002 -//.word 0x1f7c7d9f -//.word 0x762e7ca3 -//.word 0xab08c09f -//.word 0x9dbe3f84 -//.word 0x0d5be363 -//.word 0x512bdd76 -//.word 0x4cd83d64 -//.word 0x9dd3bfc1 -//.word 0x17f5e8d4 -//.word 0x7167529e -//.word 0x3fbf4517 -//.word 0x216b86bb -//.word 0x3b537445 -//.word 0xe5ba50bb -//.word 0xa365ddaa -//.word 0x570029b3 -//.word 0xb5bdaa46 -//.word 0xf83e8cae -//.word 0xd3b54a4e -//.word 0xab4a7c2a -//.word 0x03bdf0a9 -//.word 0x384cfb99 -//.word 0x6ed71173 -//.word 0xca4294e0 -//.word 0xe21bea7d -//.word 0x717cd2db -//.word 0x5033f8cb -//.word 0xa121c7d8 -//.word 0x4de07e14 -//.word 0xb2a98618 -//.word 0x95740346 -//.word 0x5e60a951 -//.word 0x8456d000 -//.word 0x46e9cb2e -//.word 0x9c817616 -//.word 0x6db90fcd -//.word 0x02054710 -//.word 0xbb989840 -//.word 0x0085d8ab -//.word 0x7b240f0d -//.word 0x84b78657 -//.word 0xdd4d20ae -//.word 0xa0e7edb7 -//.word 0x75dafd12 -//.word 0x08747224 -//.word 0xbbe2d91a -//.word 0x9851bb2a -//.word 0x89546e1c -//.word 0xcb86310a -//.word 0xa0707964 -//.word 0x44ad8536 -//.word 0x234b38ae -//.word 0x497528d9 -//.word 0x1a4ff3ad -//.word 0x4322d24c -//.word 0xf0b97087 -//.word 0x400bfca1 -//.word 0xf51a7c56 -//.word 0x711a651c -//.word 0xded669a9 -//.word 0xac5091b5 -//.word 0x40a78b01 -//.word 0xea3e4598 -//.word 0x181bbb55 -//.word 0xca8d0da5 -//.word 0x4612d48e -//.word 0x0d77b6f1 -//.word 0x0d41380c -//.word 0x184cd442 -//.word 0x95b24c1f -//.word 0x76ee3d97 -//.word 0x6a42f78e -//.word 0x53568c9e -//.word 0xfa212714 -//.word 0x010c9f3b -//.word 0x1a554cde -//.word 0x77b21a08 -//.word 0x8238db0e -//.word 0xcd7ae2cf -//.word 0x4cf5cd3b -//.word 0xc2aca212 -//.word 0x790f1eee -//.word 0x36214984 -//.word 0x6cda4e27 -//.word 0xb0ca8a8e -//.word 0x6d00e3d6 -//.word 0xd92a5bca -//.word 0x27fee463 -//.word 0xffd8778b -//.word 0x2ba46026 -//.word 0x93fedc53 -//.word 0x6b98e5ef -//.word 0xabdc4d5c -//.word 0xbfd30a80 -//.word 0x8046d110 -//.word 0x6423e60e -//.word 0xf1213290 -//.word 0x78a796c4 -//.word 0xffeb7f31 -//.word 0x7f57ba3f -//.word 0x50308afa -//.word 0xe179f813 -//.word 0xac156b27 -//.word 0x692d7844 -//.word 0x82d1fbaa -//.word 0xc8e267ce -//.word 0x642f5aa5 -//.word 0x10de751e -//.word 0x870e6af1 -//.word 0x39ba5697 -//.word 0x44e05299 -//.word 0xa0e3440e -//.word 0x992ffc5f -//.word 0x831b7c4e -//.word 0xa9139637 -//.word 0x86f6bd95 -//.word 0x38bd15c7 -//.word 0x315ecc15 -//.word 0x30efadee -//.word 0x6f0ff273 -//.word 0x1e825a3a -//.word 0x111b7c4b -//.word 0xb6df5b6f -//.word 0x49673aab -//.word 0x4b86b207 -//.word 0x302c0193 -//.word 0x588aa5ac -//.word 0x40772a7c -//.word 0xfa1340c0 -//.word 0xdaaa10ce -//.word 0x73dbd0d6 -//.word 0xc1f99568 -//.word 0xa8b16936 -//.word 0x9ded9e1c -//.word 0xa4f9625d -//.word 0x7ae49330 -//.word 0x132ad47b -//.word 0x478fe0de -//.word 0xc84e1ef3 -//.word 0x577376d4 -//.word 0x378664de -//.word 0xe2694ab5 -//.word 0xfc830b88 -//.word 0x851fd597 -//.word 0x520e3ef2 -//.word 0xbe949383 -//.word 0x9d826c4e -//.word 0x719f84f8 -//.word 0xe14cc886 -//.word 0x6668ae68 -//.word 0x4872c8b6 -//.word 0xc9ed99b9 -//.word 0x9f09a7ad -//.word 0xa87fd1c5 -//.word 0xdabde370 -//.word 0x794368db -//.word 0x8c4dc0b7 -//.word 0x91b2723c -//.word 0x700cc36e -//.word 0xae19879f -//.word 0xe3613735 -//.word 0x6e1944ad -//.word 0x6748abe0 -//.word 0xd528ca85 -//.word 0x21cf71f8 -//.word 0xcb0e3d3a -//.word 0x5c9a2138 -//.word 0x9c694650 -//.word 0x045f1511 -//.word 0x762a9242 -//.word 0x2c6beb26 -//.word 0xef1650ff -//.word 0x891b06d1 -//.word 0x7c46b768 -//.word 0xf4630d9c -//.word 0xfba77fd4 -//.word 0xec4b6ac9 -//.word 0x2a7a638d -//.word 0x116dcccb -//.word 0x2dd5a550 -//.word 0xaa79a5ca -//.word 0x0c2089d0 -//.word 0x21b1ad23 -//.word 0x3399d934 -//.word 0x816d5de6 -//.word 0xf1d06094 -//.word 0xff987556 -//.word 0xf92c6f80 -//.word 0x6e30776c -//.word 0xe4655b7a -//.word 0xc9ca2954 -//.word 0xac08fd77 -//.word 0xad0c17ef -//.word 0x32f63061 -//.word 0xdc320e4f -//.word 0xbae45798 -//.word 0xbc8aa33e -//.word 0x6addd46c -//.word 0xd5f7aab8 -//.word 0xcebb92a5 -//.word 0x5772bf6c -//.word 0x57b27cfc -//.word 0x9284c13f -//.word 0xd7c5049f -//.word 0x7bcd51c9 -//.word 0x074f9db0 -//.word 0x2e8058d5 -//.word 0x027c41c7 -//.word 0x67e57ee5 -//.word 0xc7cdec6b -//.word 0x07d6b4ad -//.word 0xba971f9d -//.word 0x9542ab93 -//.word 0x23845e4e -//.word 0xbaad5a36 -//.word 0xae11b2e3 -//.word 0xc4ae7ce3 -//.word 0xea0f27b8 -//.word 0x25700f21 -//.word 0xca224f9b -//.word 0xf131d626 -//.word 0x2745be4c -//.word 0x63c6d960 -//.word 0x3c438c04 -//.word 0x5815e0ed -//.word 0x283fd6eb -//.word 0xd299fb23 -//.word 0x6f2e3d9f -//.word 0x77e2fd0a -//.word 0x795865b4 -//.word 0x1012fcdd -//.word 0x12da772f -//.word 0x0a61d38c -//.word 0xe927a00a -//.word 0xf89aa03c -//.word 0x118290b4 -//.word 0x0f9c46c5 -//.word 0x8385fc8e -//.word 0xa9daec33 -//.word 0x9a9e1d6e -//.word 0xc2dc7c47 -//.word 0x958d2e1f -//.word 0x7ebb25f3 -//.word 0x18e7f1df -//.word 0xa1a9d9e1 -//.word 0xac962be0 -//.word 0x1566d0ed -//.word 0x3a5723c8 -//.word 0x68cc04a6 -//.word 0x943a2731 -//.word 0x4c44b2d1 -//.word 0xed25082a -//.word 0x154fdfe6 -//.word 0x5b5199b4 -//.word 0x3efed190 -//.word 0x5ccc3446 -//.word 0xe57a9231 -//.word 0x4ef63449 -//.word 0x4a7d715d -//.word 0xf6047c9c -//.word 0x53d7805a -//.word 0xfa80ef11 -//.word 0x0bea17a6 -//.word 0x67c6f6ee -//.word 0x1f2e4f71 -//.word 0x2c88fd6e -//.word 0x60ae881f -//.word 0x9c4cf63d -//.word 0x4489e3c7 -//.word 0xf0e9d400 -//.word 0x6471c9b7 -//.word 0xc30d11ca -//.word 0xff3062ed -//.word 0x94ba29a8 -//.word 0x761e1f9f -//.word 0x47c41d16 -//.word 0xceac31b4 -//.word 0xa555f187 -//.word 0x31dd0f49 -//.word 0xd7692ee2 -//.word 0x6dc7f42d -//.word 0xef5261ff -//.word 0x74165f66 -//.word 0x60359a2e -//.word 0xda8a91aa -//.word 0x818beeb1 -//.word 0x5a7412e6 -//.word 0x0da2f53c -//.word 0x523c2dba -//.word 0xa6194c7c -//.word 0x42de6ffb -//.word 0x4d67148e -//.word 0x51692c30 -//.word 0xec557283 -//.word 0xc87ffa15 -//.word 0xcc7f0de2 -//.word 0x94d7341b -//.word 0x1fd79326 -//.word 0xc8be78e6 -//.word 0x7822343c -//.word 0x19922ace -//.word 0x4e792507 -//.word 0x6145ef5f -//.word 0x7dc91fdc -//.word 0x1de032d8 -//.word 0xc454dd06 -//.word 0xeffea2b0 -//.word 0x472ea242 -//.word 0x1c4db20c -//.word 0x0fc0b044 -//.word 0x0e10184a -//.word 0x8648d230 -//.word 0xd39f4e7a -//.word 0xfc57d322 -//.word 0x9de514e0 -//.word 0x245205a8 -//.word 0x40e1ec73 -//.word 0x97f2bb42 -//.word 0xb8269d60 -//.word 0x50c4cfe8 -//.word 0xa05cb188 -//.word 0x2eaa1d84 -//.word 0xbbbcf7fe -//.word 0x76570574 -//.word 0x6f98018a -//.word 0x4ed7ed0a -//.word 0x45d0a729 -//.word 0x4305bd0c -//.word 0x6b5e828a -//.word 0xc4136234 -//.word 0x32cb7292 -//.word 0xa5064bb0 -//.word 0x90b819d9 -//.word 0x9d36efa3 -//.word 0x9f565e2c -//.word 0xc7d245a2 -//.word 0x1ceeea09 -//.word 0x255b4a38 -//.word 0xe85aae25 -//.word 0x19257f63 -//.word 0x8b8a5be9 -//.word 0xead96815 -//.word 0xac00e9f1 -//.word 0x45f50fb4 -//.word 0x9a54118c -//.word 0xb94a7f9a -//.word 0xc7b1d33e -//.word 0x397c4996 -//.word 0x4856f041 -//.word 0x9e860169 -//.word 0x56167000 -//.word 0x2334c249 -//.word 0xcfd81e9b -//.word 0xe8a7a662 -//.word 0xb6180866 -//.word 0x6fd54f50 -//.word 0xae64006a -//.word 0x220662a6 -//.word 0x83df1de2 -//.word 0xcb58066a -//.word 0xa2c23abe -//.word 0x1a3c6a96 -//.word 0x9cd67524 -//.word 0x23f63c99 -//.word 0xa7fbb2ea -//.word 0xdd2132d4 -//.word 0x1da4161e -//.word 0xa329851e -//.word 0xfb598c7e -//.word 0xb7cf7040 -//.word 0x63344300 -//.word 0xbba8b679 -//.word 0x1b642e4b -//.word 0x369e1afc -//.word 0x0bad833c -//.word 0x156ee46d -//.word 0xc2e63d62 -//.word 0x27296367 -//.word 0xf27a9a82 -//.word 0xa0b365f9 -//.word 0xf0e89d14 -//.word 0x9747c124 -//.word 0x35428dc4 -//.word 0x88f1ce5f -//.word 0xdfb174f3 -//.word 0xd212e914 -//.word 0x31f0a133 -//.word 0x3adff320 -//.word 0x0fcd27ce -//.word 0x67e2d057 -//.word 0x83ab5c3f -//.word 0x6478e9fd -//.word 0x3b025ab7 -//.word 0x2151aa4e -//.word 0x08dd819a -//.word 0xf1f405f7 -//.word 0x605bf300 -//.word 0x0d38ee9a -//.word 0xdd2f1735 -//.word 0x10ccdd4e -//.word 0xbc211738 -//.word 0x7ab0501d -//.word 0x5f8b6140 -//.word 0x2eb94684 -//.word 0xcbdc2a32 -//.word 0xf311c4f7 -//.word 0x2b18e62c -//.word 0xf6b5535a -//.word 0x4b55d2fe -//.word 0x46f58089 -//.word 0x1e406aab -//.word 0x57f75bd1 -//.word 0x3996f3ed -//.word 0x8035f975 -//.word 0x55acf2ae -//.word 0x7dfaf32a -//.word 0xd1e8b38f -//.word 0xeee9e49b -//.word 0x2d45c465 -//.word 0xd676efe6 -//.word 0x90d277b7 -//.word 0x1c6b361c -//.word 0x43346342 -//.word 0x0d6564c5 -//.word 0x3420e375 -//.word 0xd854245a -//.word 0x74e296f6 -//.word 0x11fea8c9 -//.word 0xbad8dd1b -//.word 0x2f7c23f5 -//.word 0xdef76171 -//.word 0x0ebc4f33 -//.word 0x5e468a38 -//.word 0x6efee8cf -//.word 0xdc5e08e4 -//.word 0x72572e84 -//.word 0x9df04e9e -//.word 0x21316707 -//.word 0x0c3f13c1 -//.word 0xe8c85b7d -//.word 0x35a1cf5e -//.word 0x17aed700 -//.word 0x4b0344b9 -//.word 0x5f482a1f -//.word 0x2362f2ca -//.word 0x5b50ab5b -//.word 0xb652a1bc -//.word 0x045131aa -//.word 0xa37bdb71 -//.word 0x3a2e99f7 -//.word 0xaa176ffc -//.word 0x429b44a0 -//.word 0x3375f026 -//.word 0x43a196f7 -//.word 0xc57934ea -//.word 0xc81f78c2 -//.word 0x8f1ad6f9 -//.word 0x4144d7bc -//.word 0xe2e3b436 -//.word 0x82162311 -//.word 0xb473713a -//.word 0x42eed1e5 -//.word 0x1ffcf4d2 -//.word 0x9df9d9ce -//.word 0xe0c7e77c -//.word 0x93b93955 -//.word 0xd9af39ee -//.word 0x87827079 -//.word 0x90a29c8f -//.word 0xc1fd032d -//.word 0xae2308fc -//.word 0xeca8fcd5 -//.word 0x80ca3684 -//.word 0x985466cc -//.word 0x79c326ac -//.word 0xb9a6d2e1 -//.word 0xae4b9aac -//.word 0x2697d5d5 -//.word 0x583698f0 -//.word 0x1bf588df -//.word 0x566bec98 -//.word 0xb8df0729 -//.word 0xa966a4f9 -//.word 0x804cf250 -//.word 0xf6b59219 -//.word 0xda84efe7 -//.word 0x077cce37 -//.word 0x94a526f5 -//.word 0x4af23141 -//.word 0x5b20c372 -//.word 0x50e1db5b -//.word 0x443a77ce -//.word 0x502aad5f -//.word 0x468cf86a -//.word 0xa23ed058 -//.word 0xbd837d1d -//.word 0x44a62c05 -//.word 0xe9e143b1 -//.word 0x587cf25c -//.word 0x6d390a64 -//.word 0xa4f01305 -//.word 0xd1779967 -//.word 0x11c4c6db -//.word 0x00563661 -//.word 0x2cd1066f -//.word 0xcae82eed -//.word 0xa87f1184 -//.word 0x63115318 -//.word 0xda50eb93 -//.word 0xe20c79e5 -//.word 0x3c56d949 -//.word 0xc4e5f8c9 -//.word 0xeab9e604 -//.word 0x66fd2d2f -//.word 0x2832625a -//.word 0x8e8af9f4 -//.word 0xda925d92 -//.word 0xe31441ec -//.word 0x0b3c3028 -//.word 0x70f96c5c -//.word 0x67a6f54e -//.word 0x26eae87e -//.word 0xc0dd0a66 -//.word 0x576ca500 -//.word 0x8cfe9389 -//.word 0x3b589885 -//.word 0x66bdf503 -//.word 0x6e5a3922 -//.word 0x89e25bd4 -//.word 0x707606e2 -//.word 0x58c73430 -//.word 0x247efe43 -//.word 0xd9dcb200 -//.word 0x529d27b6 -//.word 0x35234d5f -//.word 0x25d00823 -//.word 0x39b43f1e -//.word 0xad683063 -//.word 0xd8390641 -//.word 0x5e89adc5 -//.word 0xa773e57f -//.word 0x90ae9589 -//.word 0x60b462c6 -//.word 0xfd238168 -//.word 0x6063c9b5 -//.word 0x46890d0a -//.word 0x287ba820 -//.word 0x6e55598e -//.word 0xe00c528f -//.word 0x5d528b06 -//.word 0xcfb95cbf -//.word 0x5e1a4bf8 -//.word 0xe4382320 -//.word 0xa1a146de -//.word 0x31d54355 -//.word 0xbaaaaba7 -//.word 0x6aef21b7 -//.word 0x2150b134 -//.word 0x6a7963d3 -//.word 0xb07f0fdb -//.word 0xaf7b72e7 -//.word 0x287882e7 -//.word 0xd98fff69 -//.word 0xac504b17 -//.word 0x2f647b80 -//.word 0x4471ae1b -//.word 0x1a3e9d88 -//.word 0x5b18741a -//.word 0xa774e193 -//.word 0x42d56a2e -//.word 0x09f003e3 -//.word 0xab0ee0e6 -//.word 0x15b38871 -//.word 0x2e7d2bc3 -//.word 0xc54e3569 -//.word 0xc7ae23bc -//.word 0xb66a95ab -//.word 0x5681a5ba -//.word 0xaa41784b -//.word 0x1eae121c -//.word 0x06236f12 -//.word 0x473ccf35 -//.word 0x54f251fb -//.word 0x5d08c3c9 -//.word 0xc3a7b9b7 -//.word 0xce45dc94 -//.word 0xa2cb852a -//.word 0x6ff68bc2 -//.word 0xe9fd59eb -//.word 0xf8754378 -//.word 0xb0721ac8 -//.word 0x83f0fd4a -//.word 0xb571733f -//.word 0x11e7b7c2 -//.word 0xdbd35306 -//.word 0x05aff0e0 -//.word 0xa58a6d85 -//.word 0xa7f22e94 -//.word 0xbf16b757 -//.word 0xa22c7946 -//.word 0x7611ebcc -//.word 0x872fdd4e -//.word 0x3ba40a6a -//.word 0x48a1ec7c -//.word 0x240fd467 -//.word 0xbe793992 -//.word 0x6b265030 -//.word 0x2385dec5 -//.word 0xedcf4be5 -//.word 0x98e7f73f -//.word 0xac85d1db -//.word 0xa09325a0 -//.word 0x4dd7b519 -//.word 0xa3d30c79 -//.word 0x9be90fdc -//.word 0x6cc3d5cf -//.word 0x02f2b813 -//.word 0xacd5ac9e -//.word 0x15bdd0e3 -//.word 0x754e4353 -//.word 0x08293924 -//.word 0xc0c84e51 -//.word 0x37a81ae2 -//.word 0xe7ae056d -//.word 0x9dc45cdd -//.word 0x2bc3a572 -//.word 0x5d953009 -//.word 0x2f9bef9e -//.word 0x3d4c870f -//.word 0x7b1fa722 -//.word 0x26ab99ca -//.word 0xfb0d17a6 -//.word 0xa68b5fcb -//.word 0x7d778ac3 -//.word 0x6e5519d5 -//.word 0x3640d187 -//.word 0xd489c962 -//.word 0x3ea2c1f5 -//.word 0x523ab51d -//.word 0x0faab283 -//.word 0x0590e965 -//.word 0x0ab9029a -//.word 0x2f45b2d0 -//.word 0xf3059019 -//.word 0xb62824a6 -//.word 0x701741d1 -//.word 0xa29d9561 -//.word 0x8d4b7f0a -//.word 0xa31b2034 -//.word 0x3b53b5fe -//.word 0x88ac2481 -//.word 0xccb4d459 -//.word 0xc971c262 -//.word 0x7847d2bf -//.word 0xfe1b6321 -//.word 0xdcb92545 -//.word 0x66732fbf -//.word 0x760b4cf7 -//.word 0x61d49671 -//.word 0x2a134751 -//.word 0xf6abcb1e -//.word 0xc0fa1ac6 -//.word 0x4efe44e2 -//.word 0x64bc4d3c -//.word 0x37e23c8e -//.word 0x24ab6f8d -//.word 0xa2033126 -//.word 0x76ec8f08 -//.word 0x26206762 -//.word 0xaff7c1ee -//.word 0x7a8c622e -//.word 0x8d1b9ff6 -//.word 0xffae702a -//.word 0xaef9c5c9 -//.word 0x34821d2a -//.word 0x16055486 -//.word 0x3f16bcb7 -//.word 0xad08703f -//.word 0x6b0ee58c -//.word 0xbfa0c27b -//.word 0xa420f21a -//.word 0x7abef7b2 -//.word 0xfd998105 -//.word 0x74263fd4 -//.word 0x2ad6f5a4 -//.word 0x22f3cfc2 -//.word 0x07cbf585 -//.word 0x62115fd3 -//.word 0x1080ebe6 -//.word 0xf2c1ac50 -//.word 0xe68f853d -//.word 0xf619f7f9 -//.word 0xd0a838b2 -//.word 0x7681857e -//.word 0x370db8a0 -//.word 0xde371d07 -//.word 0x29168217 -//.word 0x7dcc8dac -//.word 0xd7ae535c -//.word 0x06a525fd -//.word 0x18d3ad67 -//.word 0x127a3b7b -//.word 0xe41a5965 -//.word 0x9bdaa51d -//.word 0xd929e034 -//.word 0x82a542cd -//.word 0xb93c10ea -//.word 0x0b9171e9 -//.word 0xe9a17e4e -//.word 0x5ca698c2 -//.word 0xf43cfe5c -//.word 0x02c29e20 -//.word 0x06032cc5 -//.word 0x6b1572bc -//.word 0x7282e76d -//.word 0x6da682c4 -//.word 0x2d58d0ec -//.word 0xbdcd455a -//.word 0x51b8d00e -//.word 0x79b6b115 -//.word 0x9aea8f53 -//.word 0x9fe4c57f -//.word 0xecc8fe6f -//.word 0x93ac0196 -//.word 0xcb41cecb -//.word 0x9eb6e94b -//.word 0xe1d9f602 -//.word 0x69808606 -//.word 0x7c273165 -//.word 0x86dae520 -//.word 0x0d567d77 -//.word 0xe76b9567 -//.word 0xaba49d72 -//.word 0x652a2d9e -//.word 0x8ee698c0 -//.word 0x3be6c4fa -//.word 0x94023983 -//.word 0x88bf77a6 -//.word 0xbf738d0e -//.word 0xd0aae740 -//.word 0xb5c96869 -//.word 0x7cf1b95a -//.word 0x3e26e0d1 -//.word 0x55b114fa -//.word 0xcac2cf35 -//.word 0x0d5a261a -//.word 0xe96856ba -//.word 0xb6339f28 -//.word 0xd1f75539 -//.word 0x49d33487 -//.word 0xdbe2f4bc -//.word 0x21a91d0d -//.word 0x06b11d04 -//.word 0x7d749783 -//.word 0x737eff06 -//.word 0x01cc6428 -//.word 0xe7788c69 -//.word 0x3698462e -//.word 0x4c63fc09 -//.word 0x0595883b -//.word 0x30154877 -//.word 0x40d575e9 -//.word 0x44fab077 -//.word 0x1a3ede47 -//.word 0xdf923681 -//.word 0xa9079856 -//.word 0x79ee2141 -//.word 0x6b3efc8c -//.word 0x30377b17 -//.word 0xbe456655 -//.word 0x46279397 -//.word 0x6750b68d -//.word 0xa18e7b09 -//.word 0x0ce9d207 -//.word 0x4ace8aeb -//.word 0xba6d2209 -//.word 0xee5fdc6a -//.word 0x608c12cd -//.word 0x604ccded -//.word 0x51cc9402 -//.word 0x15b4828a -//.word 0xc6069c49 -//.word 0xa749618f -//.word 0x5ae8a2b9 -//.word 0x53d593fa -//.word 0x8c71235c -//.word 0x7ab08901 -//.word 0x41781faf -//.word 0x244b748c -//.word 0x3f269c25 -//.word 0x78a9cbb5 -//.word 0xb37723a5 -//.word 0x45e0c94f -//.word 0xabbe3e07 -//.word 0x7d9ced5c -//.word 0x9d1e009b -//.word 0xb49d7895 -//.word 0xdf117da2 -//.word 0xa534f2e6 -//.word 0x2de44dd3 -//.word 0xadc9a6ef -//.word 0x26390dd8 -//.word 0x4f582185 -//.word 0xce84dfce -//.word 0xaef0b72f -//.word 0x0e8ee5c9 -//.word 0x1633fea9 -//.word 0x30f6c94d -//.word 0x74d95164 -//.word 0x63ab38d6 -//.word 0xd92c4e04 -//.word 0x3d736251 -//.word 0xfb8d59e1 -//.word 0x34677da1 -//.word 0xb4ed1787 -//.word 0x24743f1b -//.word 0x8055f336 -//.word 0xccdb6709 -//.word 0x03609c62 -//.word 0x51b2342b -//.word 0x81bc8533 -//.word 0xb962ec32 -//.word 0x65ac6307 -//.word 0x71275643 -//.word 0xbb88b3eb -//.word 0xc893417a -//.word 0xb63b3226 -//.word 0x710bfb64 -//.word 0x2ac463ae -//.word 0x0548da84 -//.word 0x12b60db1 -//.word 0x7fd7b7cf -//.word 0x0cb9ba0d -//.word 0xbe996e30 -//.word 0xd80639d8 -//.word 0x07446005 -//.word 0xddef1cd9 -//.word 0x80e0f1a0 -//.word 0xa4553b0d -//.word 0xb64b0ac6 -//.word 0x5a2f2f24 -//.word 0x18b69733 -//.word 0x520ad801 -//.word 0x7a260a15 -//.word 0x8283d83d -//.word 0x93f4d68d -//.word 0x01ce16a4 -//.word 0x7f4df631 -//.word 0x8f333bb6 -//.word 0x3db2648c -//.word 0x0d8c3828 -//.word 0x3279a29c -//.word 0x00c9be60 -//.word 0xa44a3453 -//.word 0x136cc5fd -//.word 0x40a32317 -//.word 0x920d064d -//.word 0x95557c42 -//.word 0xf0d780d5 -//.word 0x9705cfa3 -//.word 0x4109f7cc -//.word 0x1dacb1fb -//.word 0xc07670a0 -//.word 0x62163a80 -//.word 0x4b05b770 -//.word 0x8867885d -//.word 0xe232d990 -//.word 0x11913a30 -//.word 0x2c8baa09 -//.word 0x64e0f58b -//.word 0xf2334116 -//.word 0x4e6ee375 -//.word 0xa26377a8 -//.word 0x7eaf2fe6 -//.word 0xcde46be2 -//.word 0x08e78a4e -//.word 0xa996009d -//.word 0xe3aea90e -//.word 0x90ec5ee6 -//.word 0x6b73c5fc -//.word 0x7f6e6d7b -//.word 0xdff61ae4 -//.word 0x98365d52 -//.word 0xe4cd6802 -//.word 0xa0732112 -//.word 0x00e07589 -//.word 0x82eaef98 -//.word 0x20ed8920 -//.word 0xca6fc273 -//.word 0x1304f05f -//.word 0x2b70d869 -//.word 0x0d0c7c56 -//.word 0xf96b34f0 -//.word 0x253c0006 -//.word 0xb0721db5 -//.word 0xd7a3d6e6 -//.word 0x6bae9d18 -//.word 0x82a15a60 -//.word 0x6eda03ad -//.word 0xeb6c6d51 -//.word 0x9cc462bd -//.word 0xb98cf38c -//.word 0x02cf0fc4 -//.word 0xf75e5558 -//.word 0x4a7327f1 -//.word 0x959500ed -//.word 0x49bb07a8 -//.word 0xe6b4e4fb -//.word 0x72c6d203 -//.word 0x2496f524 -//.word 0x6047ef4d -//.word 0xe8e6ae7d -//.word 0x50068786 -//.word 0xb2a78911 -//.word 0xa45d0be2 -//.word 0x67ae885d -//.word 0x61bbad49 -//.word 0xcd23afd5 -//.word 0xb224e2d8 -//.word 0x1103885d -//.word 0x63aee65f -//.word 0x43a19ed1 -//.word 0x670638e2 -//.word 0xd420027e -//.word 0x52e91a18 -//.word 0x1efac9a7 -//.word 0xe0ac12ee -//.word 0xdc7d8b01 -//.word 0x6cb56c05 -//.word 0xae49e637 -//.word 0x7affb630 -//.word 0x97d3f967 -//.word 0x2e9942f7 -//.word 0x7ee5eaa2 -//.word 0xd228a716 -//.word 0xb01b6070 -//.word 0x546140ff -//.word 0x5d680a4a -//.word 0xc590ac54 -//.word 0x168f161e -//.word 0xdb144c6e -//.word 0x55aabacf -//.word 0x70dfc9d9 -//.word 0xf5a6afb2 -//.word 0x01fb8bd5 -//.word 0xb6c5b112 -//.word 0x300042d6 -//.word 0xbb1b01ad -//.word 0x439f6105 -//.word 0x0c12e335 -//.word 0xa31b9ebe -//.word 0x14e71fd0 -//.word 0x5dca7410 -//.word 0x232a8498 -//.word 0xa499a23f -//.word 0xed41611b -//.word 0x4c85a945 -//.word 0x09e50adc -//.word 0x5122514d -//.word 0x73a359d1 -//.word 0x4f182437 -//.word 0x0a5d2ae3 -//.word 0x07a1f117 -//.word 0x13c7de71 -//.word 0xe00c4bb5 -//.word 0xb5ebdacd -//.word 0x633e080e -//.word 0x7ba505bd -//.word 0xbe2bc3d2 -//.word 0xd5274cfb -//.word 0x43615ae4 -//.word 0x977621b6 -//.word 0xe67e70de -//.word 0x78ebf80f -//.word 0xc2b4eb8a -//.word 0x94b4ca9d -//.word 0x944d7869 -//.word 0xeb5092e9 -//.word 0x3e210330 -//.word 0xe016d2f2 -//.word 0x46213f46 -//.word 0xbbaf0faa -//.word 0x54cf2448 -//.word 0x27975078 -//.word 0xb8c36b85 -//.word 0xb4a0a3b4 -//.word 0xe2291482 -//.word 0x566f992e -//.word 0xe83ee177 -//.word 0xe4fdc5a7 -//.word 0x03d6d8d0 -//.word 0x9a174056 -//.word 0x12d8c5ad -//.word 0x98df2864 -//.word 0x15c0b663 -//.word 0x61481c71 -//.word 0xb41c7df9 -//.word 0x5d9ec20d -//.word 0xb61032ab -//.word 0x57fc423f -//.word 0x8ad3ae6a -//.word 0xffd4c802 -//.word 0xc12f105a -//.word 0x696b06c3 -//.word 0x92053c52 -//.word 0x8c5aafe4 -//.word 0x55c65760 -//.word 0xc40efd3c -//.word 0x08fb4d43 -//.word 0x51482c95 -//.word 0xcdbf4cef -//.word 0xd69efd2c -//.word 0x6a3f460c -//.word 0xdbf83435 -//.word 0xc7417277 -//.word 0x4b141a54 -//.word 0x749acbc0 -//.word 0xf603fc25 -//.word 0x21b58faa -//.word 0x10aaa9b5 -//.word 0x2413c2ae -//.word 0xb142f807 -//.word 0xf6c6a979 -//.word 0x53d84090 -//.word 0xb6f64f69 -//.word 0x57cddfbb -//.word 0xa55c0414 -//.word 0x7f57b465 -//.word 0xa8c9d8c1 -//.word 0x75fea462 -//.word 0xc9a024ed -//.word 0x432018f6 -//.word 0xb65702c7 -//.word 0xda6e7d5d -//.word 0x41fbd0b4 -//.word 0x8c6cc345 -//.word 0xdea9b2cc -//.word 0x91f5df4e -//.word 0x28150c5b -//.word 0x85b54a91 -//.word 0x5d070c61 -//.word 0xe8ad7f16 -//.word 0xddd91e12 -//.word 0x9db3815b -//.word 0xaefb7557 -//.word 0x6cef52d4 -//.word 0xfb6f894b -//.word 0x805f7d66 -//.word 0x914d94bf -//.word 0xea538deb -//.word 0x613f14b7 -//.word 0x1cf293b1 -//.word 0x01064ceb -//.word 0x6eb4a5fb -//.word 0x2af4c246 -//.word 0x9ce5597f -//.word 0x3b70c26a -//.word 0x46284ee6 -//.word 0xb575da2a -//.word 0x6ff2a480 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x000148D8 -//// expected output -//.word 0x9e99388d -//.word 0x377aac36 -//.word 0xafac4a85 -//.word 0x66b9d168 -//.word 0xc6f0faad -//.word 0x772b3495 -//.word 0x379d680a -//.word 0x83d5b482 -//.word 0xa617c89d -//.word 0x9744f126 -//.word 0x94fd47d1 -//.word 0xc9dfffe9 -//.word 0x1ad04bc3 -//.word 0x940faceb -//.word 0x2eec299a -//.word 0xc386c4d7 -//// SHA512LongMsgvector_106 -//// vector length -//.word 0x00014BF0 -//// input message -//.word 0x12b89aa3 -//.word 0xe9a7ac15 -//.word 0xe01d7863 -//.word 0x1b3ceae0 -//.word 0x720e36f7 -//.word 0x737307c0 -//.word 0xaa5ed9d1 -//.word 0x2041a357 -//.word 0x21c6ba65 -//.word 0x42c0f28b -//.word 0xa36106ab -//.word 0x72ad3a08 -//.word 0xb02e3ea0 -//.word 0x38ea56bc -//.word 0xfd92b8c5 -//.word 0x93fc3559 -//.word 0xf1d31c9e -//.word 0x758e5cd6 -//.word 0x289ee834 -//.word 0x44ec60ee -//.word 0xf382ed94 -//.word 0x5a886da0 -//.word 0xd673d04e -//.word 0x8579c1ae -//.word 0x094889f7 -//.word 0x88f7311e -//.word 0xf73de7a7 -//.word 0x99e1a4bc -//.word 0xc2710b7c -//.word 0xe1379395 -//.word 0xbd69e815 -//.word 0xffa08f7d -//.word 0xf18bc917 -//.word 0x85e5bb8a -//.word 0x99a4cbac -//.word 0x79744d97 -//.word 0xa6635fff -//.word 0xd6de11c3 -//.word 0x3bdccac1 -//.word 0x0859e7ef -//.word 0x3206a4a8 -//.word 0x733f4043 -//.word 0x953d5cea -//.word 0xed8da5a9 -//.word 0x26c0b2c6 -//.word 0x40652f51 -//.word 0xd7343cfb -//.word 0xa98c102c -//.word 0x5320e24f -//.word 0x5bed0971 -//.word 0x736f620a -//.word 0xfc14f21a -//.word 0xcaf1cc78 -//.word 0x27b33567 -//.word 0x1ad9076b -//.word 0xe921535b -//.word 0xdc404ab6 -//.word 0x44d65e3a -//.word 0xbca1a4b3 -//.word 0xaff17d12 -//.word 0x1a5c75be -//.word 0x93b26b2f -//.word 0x8b34f3b8 -//.word 0xd000f8a4 -//.word 0x55d0a685 -//.word 0x36e486c9 -//.word 0xf73deb8e -//.word 0x0d0c8eb8 -//.word 0x9f6a7540 -//.word 0x8d4919ce -//.word 0xb2abc78b -//.word 0x66124730 -//.word 0x4737bc64 -//.word 0x3afecb44 -//.word 0xacaaff43 -//.word 0x1e4d6c34 -//.word 0xe08393a5 -//.word 0x1c60866f -//.word 0x17a74d8b -//.word 0xb43d8727 -//.word 0x3add54f9 -//.word 0x560c73d4 -//.word 0x6450a879 -//.word 0xea9d61af -//.word 0x65109896 -//.word 0x49e0fb38 -//.word 0x43914b61 -//.word 0xc16a02b1 -//.word 0xb42a38ef -//.word 0x94f7c7a0 -//.word 0xa597aed8 -//.word 0x7ae2b351 -//.word 0xb7774dba -//.word 0x1bafc051 -//.word 0xbdcf8ab4 -//.word 0x9582fef4 -//.word 0x3f862fec -//.word 0xfca50fd1 -//.word 0xfae7d80a -//.word 0xd506ab41 -//.word 0x5d2277ba -//.word 0x9ab61de3 -//.word 0x0dcbd22d -//.word 0x396bc41b -//.word 0x62590098 -//.word 0x95ff938e -//.word 0xe8a8efb4 -//.word 0x03ef91a8 -//.word 0xdf77e13d -//.word 0xcedd5a16 -//.word 0xbcebea74 -//.word 0xb40f9c4c -//.word 0xa60b749d -//.word 0x67ed9a00 -//.word 0xf942bc81 -//.word 0x0d87adad -//.word 0xc6e052ec -//.word 0xc00dbe11 -//.word 0x51999c30 -//.word 0x0e54cdaf -//.word 0x910453a0 -//.word 0x7a586e4e -//.word 0xb41d0416 -//.word 0xfab44679 -//.word 0x99c4916f -//.word 0x772c92fd -//.word 0x543cae09 -//.word 0x5024a16e -//.word 0xadac654c -//.word 0xd72655a1 -//.word 0xa1a1921e -//.word 0xd260a633 -//.word 0xe08b676d -//.word 0xfb231e01 -//.word 0x4d3be9a9 -//.word 0x81665eae -//.word 0x826c7146 -//.word 0x85419821 -//.word 0x49372d3f -//.word 0x9d721304 -//.word 0x249c9c8e -//.word 0x55dbaa46 -//.word 0xc50015b5 -//.word 0xa9024d9a -//.word 0x96aa4139 -//.word 0x8c8f7ff5 -//.word 0x33459c21 -//.word 0x64d2d614 -//.word 0xeb61f87b -//.word 0x8c3b7ef4 -//.word 0x44f2fad8 -//.word 0xd0dfb657 -//.word 0x74cf9bcb -//.word 0xf5fa5146 -//.word 0xe735a86d -//.word 0x2f68378a -//.word 0xc04143dc -//.word 0xa82ae232 -//.word 0x50795fb8 -//.word 0xffe7e110 -//.word 0xa14448a4 -//.word 0xc769583b -//.word 0xee6d19cb -//.word 0x041c7d8e -//.word 0x28a44458 -//.word 0xb2921d28 -//.word 0x73fd0efd -//.word 0x3e0115eb -//.word 0xa670106d -//.word 0x0ac3dafd -//.word 0xcf57b7e2 -//.word 0xedd6f24a -//.word 0xadf2c498 -//.word 0xb15a78ff -//.word 0x34e6cd50 -//.word 0x93159c10 -//.word 0x0cbabace -//.word 0xc6f220b3 -//.word 0x1259495b -//.word 0xf17edce3 -//.word 0xd6948b44 -//.word 0xad6a3bdf -//.word 0x1b9d6559 -//.word 0x080cbca8 -//.word 0x5b8c106e -//.word 0x04dd7286 -//.word 0x40dd99dd -//.word 0x18fc8484 -//.word 0x2bf06103 -//.word 0xaeaaaeef -//.word 0xb1889ebf -//.word 0xa4ccbedb -//.word 0x194dd8f6 -//.word 0xcc6c179e -//.word 0xe04a6d11 -//.word 0x6b383253 -//.word 0x356f0e7d -//.word 0xbd021858 -//.word 0x7d103f2a -//.word 0x6f3eead0 -//.word 0xd064db0d -//.word 0x24875922 -//.word 0x7a088e9f -//.word 0xf11a2e78 -//.word 0x7b79595b -//.word 0xe15ac341 -//.word 0x089d1244 -//.word 0x724a87b0 -//.word 0x073be15c -//.word 0x16167e3b -//.word 0x977fc42e -//.word 0xb38bbf1c -//.word 0x86770b45 -//.word 0x239af5d3 -//.word 0xd898ddb2 -//.word 0xb4d9dfa2 -//.word 0x4739b28b -//.word 0xa901cf10 -//.word 0xbe17d666 -//.word 0xb7712e67 -//.word 0xdccfece2 -//.word 0x89aaf736 -//.word 0x7767691f -//.word 0x3dd138cf -//.word 0x17c61541 -//.word 0xe53094ca -//.word 0x77388ef1 -//.word 0x07b6c480 -//.word 0x07ebc4db -//.word 0x1e721191 -//.word 0x6d747e31 -//.word 0x161cdb5f -//.word 0xff4ad326 -//.word 0xd38c1590 -//.word 0x4a4ab274 -//.word 0xab40c690 -//.word 0x8f315bd7 -//.word 0xe7da8a0c -//.word 0x4026e390 -//.word 0x46a01079 -//.word 0x872db4e3 -//.word 0x7afb998b -//.word 0xc0b50b9a -//.word 0xa9f97fbe -//.word 0xfa0b797f -//.word 0xeecbacd1 -//.word 0x7ae462e5 -//.word 0xd5471e45 -//.word 0x38d88020 -//.word 0xe3666ae2 -//.word 0x60e16108 -//.word 0x0bc73633 -//.word 0xd2e0e57b -//.word 0x3a2bbd05 -//.word 0xa218c1d8 -//.word 0xccf74fec -//.word 0x99b1ff84 -//.word 0x14b6cebe -//.word 0xb2367c69 -//.word 0xd9943216 -//.word 0x9e186872 -//.word 0xd3e406d3 -//.word 0x4129c910 -//.word 0x329ae996 -//.word 0x3321f9b8 -//.word 0x17d10e47 -//.word 0x3f1d2363 -//.word 0x1947bc90 -//.word 0xe71bca0d -//.word 0xc2dccf61 -//.word 0xde7f4236 -//.word 0x0f17356a -//.word 0x8c913564 -//.word 0xf4a172a4 -//.word 0x8efc209e -//.word 0xd5c81cc9 -//.word 0x3450d3f3 -//.word 0x0efd60d7 -//.word 0x0182f4f1 -//.word 0x6c567b91 -//.word 0x2e677c2f -//.word 0xb10d41fe -//.word 0x283c39c3 -//.word 0x14ff9ae8 -//.word 0x0d214acc -//.word 0xbf2d005e -//.word 0x339aa7ea -//.word 0x503f0333 -//.word 0xa10d96c1 -//.word 0x58fcc57c -//.word 0x9346377a -//.word 0xdfd47e16 -//.word 0xfaf5f942 -//.word 0xde56f81e -//.word 0xfa2f22c9 -//.word 0xc3ba1476 -//.word 0x6be94bc3 -//.word 0xf0584447 -//.word 0x5981e16a -//.word 0x3d2f0f7a -//.word 0x8435a6fb -//.word 0x715f913e -//.word 0xe1a92e35 -//.word 0xcdaff785 -//.word 0x166563dd -//.word 0x82080786 -//.word 0x0154013c -//.word 0x36f8963d -//.word 0x32471a9f -//.word 0x833010e6 -//.word 0x6d7093d6 -//.word 0x7706f586 -//.word 0x2ae7a5b6 -//.word 0x15f45662 -//.word 0x14295d98 -//.word 0xd2175b86 -//.word 0x8d941dd7 -//.word 0x19b1c040 -//.word 0x28ec1955 -//.word 0xc8a754a2 -//.word 0x2dd9daf7 -//.word 0xb1047903 -//.word 0x1967bf24 -//.word 0x1a74a67e -//.word 0x1c84774b -//.word 0x3dcae871 -//.word 0x9985875a -//.word 0xc97a5c00 -//.word 0xa9a2ca47 -//.word 0x5e20b790 -//.word 0x9875ed8b -//.word 0x15f7bf4c -//.word 0x6780efa2 -//.word 0xf663cfa4 -//.word 0x48a4a78c -//.word 0x806857c9 -//.word 0x25aa3d4f -//.word 0x25305932 -//.word 0x1abdaf73 -//.word 0xcb89ed1a -//.word 0xf6ee4e84 -//.word 0x4d64beff -//.word 0xbeaf3f94 -//.word 0xf7578b24 -//.word 0x2a59fbb7 -//.word 0x0d1ca710 -//.word 0x26a6cf85 -//.word 0x45107a0d -//.word 0x52375c9b -//.word 0x48b5fdaa -//.word 0x82101819 -//.word 0x3630413a -//.word 0x3f17cb26 -//.word 0x1fcce953 -//.word 0x44981368 -//.word 0x8a75ac4f -//.word 0x02c4e18c -//.word 0xf23ed4ce -//.word 0x1c2dfac4 -//.word 0x43dcc132 -//.word 0xec4c7744 -//.word 0x62286722 -//.word 0xfcfb45c4 -//.word 0xa2a1cc08 -//.word 0x8efca502 -//.word 0x50e88b93 -//.word 0x1570ad3d -//.word 0x28425335 -//.word 0xb960c5ba -//.word 0xde1969a6 -//.word 0xd7382b43 -//.word 0x967b215f -//.word 0x7f466fa3 -//.word 0x6c996920 -//.word 0xf440f82b -//.word 0xed493f6b -//.word 0x2fbb7e30 -//.word 0x9b853606 -//.word 0x5cb58e8b -//.word 0x6deaf57d -//.word 0x5b0c0917 -//.word 0x4d3ab79e -//.word 0x4104a437 -//.word 0x98dbccfb -//.word 0xd5c56a4d -//.word 0xa256176b -//.word 0x14db3544 -//.word 0x2fd88e8a -//.word 0xadb53907 -//.word 0xfbb4be34 -//.word 0x85267908 -//.word 0x33df440e -//.word 0x33e750ba -//.word 0xfa7254fd -//.word 0x8512ea17 -//.word 0xe52c35ad -//.word 0xfaa9c81b -//.word 0x7fedc30b -//.word 0x460d3f47 -//.word 0xc53cedcb -//.word 0xd287f91f -//.word 0xabc335e3 -//.word 0x39c373ab -//.word 0x96ce320e -//.word 0xcc4f7efa -//.word 0xe0cf114a -//.word 0x0f21be9b -//.word 0x57dc105b -//.word 0x390f2e22 -//.word 0xbe2f0146 -//.word 0xb85499aa -//.word 0x4aa5cdd6 -//.word 0xaa11224d -//.word 0x2641ef1a -//.word 0x65cabead -//.word 0xf0a6f4e5 -//.word 0xf0e5b56e -//.word 0x3aa0024d -//.word 0x882f24b9 -//.word 0x099b4e2d -//.word 0x1d567ebb -//.word 0x592aa4a3 -//.word 0xd2700624 -//.word 0x9882e392 -//.word 0x807356a9 -//.word 0x27fd7e21 -//.word 0x33badc82 -//.word 0xdc97fc3a -//.word 0xac8758ed -//.word 0x8274790c -//.word 0xdd7b5fa9 -//.word 0x5758238a -//.word 0x701fdb7c -//.word 0x8d2ebee9 -//.word 0x415f89ad -//.word 0xca822126 -//.word 0xdf0a798a -//.word 0xa906b67e -//.word 0x0f5391e4 -//.word 0x3610fdf4 -//.word 0x48530a8e -//.word 0x751a0ace -//.word 0x3885f2e2 -//.word 0xdc420318 -//.word 0x3e48a93b -//.word 0xd4c8a320 -//.word 0xee60647c -//.word 0x3c93b9f8 -//.word 0x9176ad88 -//.word 0xe6abaaf8 -//.word 0xa293e0c8 -//.word 0x19c0ea39 -//.word 0x52a9afa8 -//.word 0x0da2871b -//.word 0x040ba01a -//.word 0x72c79fc0 -//.word 0xd2f08a11 -//.word 0xe9c8e58e -//.word 0x06f31b07 -//.word 0x89e420b1 -//.word 0xa2965578 -//.word 0x5b7cac96 -//.word 0xd9ba0c65 -//.word 0xde95f771 -//.word 0x93286ad2 -//.word 0x855904b9 -//.word 0xed0c6b48 -//.word 0x3497eca7 -//.word 0xb6756154 -//.word 0xc73e58ba -//.word 0xf3d67106 -//.word 0x8ae50836 -//.word 0x5d881472 -//.word 0xc2474fa0 -//.word 0xde469833 -//.word 0x23bf9543 -//.word 0x17af9ce3 -//.word 0x57d0d4af -//.word 0xdcc897a4 -//.word 0x7ea01b35 -//.word 0xb677529a -//.word 0xa8780e6c -//.word 0x6109696f -//.word 0x5d4564af -//.word 0x4cadcece -//.word 0x151a689c -//.word 0x1cf746e8 -//.word 0xc1ac7896 -//.word 0x295deaf2 -//.word 0x40d58944 -//.word 0xfebda7a5 -//.word 0xea12a110 -//.word 0xddd6bfbc -//.word 0x09055ba9 -//.word 0x39ca4679 -//.word 0x5af36782 -//.word 0x3ba3a521 -//.word 0x91460851 -//.word 0x3eca1a7c -//.word 0xd30d9491 -//.word 0x53913656 -//.word 0x3a77f700 -//.word 0xbdab5e01 -//.word 0x545c3021 -//.word 0x76af4bd0 -//.word 0xa3b4d2ba -//.word 0xa8998a9d -//.word 0x1f1d8457 -//.word 0x3548fd44 -//.word 0xb05982c6 -//.word 0x30015825 -//.word 0xb4ce1a9a -//.word 0x61eaa4a6 -//.word 0x7f0530a8 -//.word 0xc590bfaf -//.word 0xd62cbb8d -//.word 0x0b62da2d -//.word 0x73944526 -//.word 0x1833fa8f -//.word 0x84336e16 -//.word 0x84bc774c -//.word 0x2c236a43 -//.word 0x1b18805b -//.word 0x01217f59 -//.word 0x5e4796b9 -//.word 0x8c0e8846 -//.word 0xffab0de7 -//.word 0xcc7275bc -//.word 0x688e8e69 -//.word 0xb2f4c8b2 -//.word 0x349a9749 -//.word 0xa6e319e3 -//.word 0xb45ef991 -//.word 0x02b1934e -//.word 0x6cd058d4 -//.word 0x927374b5 -//.word 0x94c6afa6 -//.word 0x1a62911e -//.word 0x987cca20 -//.word 0xd05cd154 -//.word 0x9811ca5d -//.word 0xdd64ad67 -//.word 0xe80aa5ff -//.word 0xe01eb628 -//.word 0x90cea3ab -//.word 0x6b540fae -//.word 0xcd28e288 -//.word 0x8473eed4 -//.word 0x8fc7d3c4 -//.word 0x250e1fb9 -//.word 0xfac1ba10 -//.word 0xbd5b823e -//.word 0xe50c321f -//.word 0xadb1888b -//.word 0x5d04a72b -//.word 0xcc10ba8a -//.word 0x23e9da6f -//.word 0xe399326b -//.word 0x2a5d60ae -//.word 0x32121f1e -//.word 0x1aea23ab -//.word 0xe96345dc -//.word 0xd07ae0ae -//.word 0xaf1b7b9f -//.word 0xdbdda806 -//.word 0x1fec2ba5 -//.word 0x00465f81 -//.word 0x452bd6f2 -//.word 0xb7ce40f6 -//.word 0x26518eca -//.word 0xacf057bc -//.word 0x367d7a3b -//.word 0x3f0c0530 -//.word 0xdfef5591 -//.word 0x05e57f32 -//.word 0x008eefdf -//.word 0x45224fa9 -//.word 0x6c63ab7d -//.word 0x7bd0d2fb -//.word 0x671cff84 -//.word 0xd8deb895 -//.word 0x2d8af754 -//.word 0xc0a08869 -//.word 0x6b23b20f -//.word 0x4b4d196b -//.word 0xc381e31c -//.word 0xc4811a13 -//.word 0x4ce151a5 -//.word 0x2dbc8bde -//.word 0x10a55819 -//.word 0xb9e041cd -//.word 0x8dd366aa -//.word 0x51b766e5 -//.word 0x34937fd0 -//.word 0x106bf7ad -//.word 0xedb4bac4 -//.word 0xc70c44b3 -//.word 0x9128c106 -//.word 0x790e7307 -//.word 0x6e8455d7 -//.word 0xdfc8febe -//.word 0xc681c7c0 -//.word 0xe6f63071 -//.word 0x507e800a -//.word 0x2c37acbb -//.word 0xb6fb7a43 -//.word 0x8790e6bf -//.word 0x161fc5bf -//.word 0x7ee8a89f -//.word 0x82330315 -//.word 0xce8a8f06 -//.word 0x7f25ec9e -//.word 0xe6a68b9f -//.word 0x8907cbf9 -//.word 0x6bd0629c -//.word 0x8e8dff8a -//.word 0xb57f2e30 -//.word 0x6e927bf6 -//.word 0x508fda15 -//.word 0x829346a8 -//.word 0x7dc0a907 -//.word 0x1232fc50 -//.word 0xae34af46 -//.word 0xddb44b5f -//.word 0x0df55618 -//.word 0x9584778c -//.word 0xf56dda45 -//.word 0x5faed652 -//.word 0x77eccd99 -//.word 0x5865546f -//.word 0xd7269466 -//.word 0x0b7ef066 -//.word 0x0db2e900 -//.word 0xfcf23efe -//.word 0x448c573f -//.word 0x2060e3c2 -//.word 0x5e94c100 -//.word 0x63891c7f -//.word 0x6e0ddba4 -//.word 0x21d238c9 -//.word 0x3d1eae8f -//.word 0xadc51975 -//.word 0xc65519aa -//.word 0xcd90b720 -//.word 0xb91f4be2 -//.word 0x3b849da7 -//.word 0xfc514aa7 -//.word 0x269769ad -//.word 0x25a26f6e -//.word 0xafe35019 -//.word 0x012ee72f -//.word 0x6c269895 -//.word 0x11f534e8 -//.word 0xe9401c10 -//.word 0x0859aa18 -//.word 0x22b7cc3c -//.word 0x4ea4f244 -//.word 0x0a362b11 -//.word 0x7f808a76 -//.word 0x0709cf49 -//.word 0xed7e43b9 -//.word 0x74a3e4e1 -//.word 0x1a8fc29e -//.word 0x1d19a99e -//.word 0x3f8e00ba -//.word 0xc6a5f186 -//.word 0xc8b4cb26 -//.word 0xa523a463 -//.word 0xd52142fe -//.word 0xe4973c43 -//.word 0xba5a5ce2 -//.word 0x20a548fb -//.word 0x80c66178 -//.word 0xec17ec9f -//.word 0x623070e7 -//.word 0x4f5b5e0b -//.word 0x5149f75e -//.word 0x41036b5e -//.word 0x71223e8b -//.word 0x3243f07a -//.word 0x9ab6dd25 -//.word 0x84766285 -//.word 0xd75e4163 -//.word 0x0c99476b -//.word 0xea5b2c82 -//.word 0x94ceba59 -//.word 0xc6503142 -//.word 0x5cdbeb43 -//.word 0x14c43c69 -//.word 0x94a99c5f -//.word 0xafa5083f -//.word 0xe4c5a5a8 -//.word 0x27c0a711 -//.word 0xe5e2715d -//.word 0x424afdaf -//.word 0xa5557f7f -//.word 0x765a45ee -//.word 0x2698e256 -//.word 0x706c8b26 -//.word 0xdfc8c1ed -//.word 0x91e031b4 -//.word 0x3a26d891 -//.word 0x6b796a79 -//.word 0x1599f556 -//.word 0x49dfc159 -//.word 0x412b7c92 -//.word 0xa41d93be -//.word 0x0688e360 -//.word 0xae239113 -//.word 0x9d82361e -//.word 0xcc454049 -//.word 0xb49095ef -//.word 0x13bb7955 -//.word 0xee4ab13a -//.word 0xd21fe8af -//.word 0x60ee5329 -//.word 0x09f291d5 -//.word 0x15ded52b -//.word 0xea1746c6 -//.word 0x8b20a673 -//.word 0x5f553288 -//.word 0x34ddca77 -//.word 0x83da52a2 -//.word 0xf5e25871 -//.word 0x27b3f7a2 -//.word 0xaa22fbe1 -//.word 0x4f554599 -//.word 0xa1327209 -//.word 0xb217b79a -//.word 0x1bcc0f70 -//.word 0x3eb6993f -//.word 0xce4d3b60 -//.word 0x92d08c24 -//.word 0x6537f168 -//.word 0x82690669 -//.word 0xfeaf3fda -//.word 0x9668cf34 -//.word 0xabffc84e -//.word 0x8b1b842d -//.word 0xf215451d -//.word 0xd1af1800 -//.word 0x4d03ffe7 -//.word 0x0bb94edf -//.word 0xab7d560e -//.word 0x92b041fe -//.word 0xed5e3d38 -//.word 0xf271dd15 -//.word 0x6924bbd1 -//.word 0x6cba63e1 -//.word 0x6b6f6c86 -//.word 0x73afe8a3 -//.word 0xaf86ffcc -//.word 0x2f58d69f -//.word 0xe8d2b657 -//.word 0xfc206a9e -//.word 0x3c60e8a3 -//.word 0xeb57346d -//.word 0xc563826f -//.word 0x40b19b5c -//.word 0x12b0813c -//.word 0xf3c656c0 -//.word 0xa4417ad2 -//.word 0x3090f471 -//.word 0x72b313bc -//.word 0xd7f0544c -//.word 0x66c887c7 -//.word 0xfd292eb2 -//.word 0xdde52687 -//.word 0x68638908 -//.word 0x2a95d2d2 -//.word 0x17294235 -//.word 0x13048343 -//.word 0xb8ec8c27 -//.word 0x5384c4b9 -//.word 0x2f7e6a4f -//.word 0x170c34d5 -//.word 0x16973620 -//.word 0x81b4067f -//.word 0x37541e93 -//.word 0x283a8161 -//.word 0x14b3a2a6 -//.word 0x9581816a -//.word 0x601817d8 -//.word 0xc80df44d -//.word 0x84cb27af -//.word 0xb1885e00 -//.word 0x1b774e33 -//.word 0xb83f553e -//.word 0x75ad5e70 -//.word 0x35a50605 -//.word 0x175ffdf8 -//.word 0xf8d0ae18 -//.word 0x3a65225e -//.word 0xc3f7217e -//.word 0x48fc9bbc -//.word 0xcbfa4701 -//.word 0x62428a2e -//.word 0x3bda9ab0 -//.word 0xddbbe355 -//.word 0xb03caa5d -//.word 0xc0cff0d5 -//.word 0xbeeb9920 -//.word 0x4849cdd7 -//.word 0x69539fd3 -//.word 0x64daec87 -//.word 0xad078693 -//.word 0x39949297 -//.word 0xf73b2f45 -//.word 0x9f6f59bb -//.word 0xaa4b0c0f -//.word 0xa1c8ac2b -//.word 0x9b32a4db -//.word 0x02dd4e24 -//.word 0x951413d8 -//.word 0xb352d367 -//.word 0xd6b586f8 -//.word 0x5eaf24b8 -//.word 0x90ffc372 -//.word 0xdedfff61 -//.word 0x687f9f42 -//.word 0xc4b376ac -//.word 0xfae886a4 -//.word 0xd35d6c6d -//.word 0x5490f89d -//.word 0x85f61b76 -//.word 0x77ee0672 -//.word 0x84f89020 -//.word 0xd922d82f -//.word 0x32c42cc8 -//.word 0xe56d2a22 -//.word 0x221d2550 -//.word 0x79b5cb5d -//.word 0x9cab049a -//.word 0x67021d37 -//.word 0x1d7a2511 -//.word 0xf50497cb -//.word 0xd5783a20 -//.word 0x5d8a4677 -//.word 0x27fbc8b8 -//.word 0x4d0c475f -//.word 0x2c38a8cf -//.word 0x68224fe8 -//.word 0x31cd87db -//.word 0xc40b243d -//.word 0x3438675b -//.word 0x6a2721ce -//.word 0x6a5d1b4f -//.word 0xd97db6cc -//.word 0xbc04cfbb -//.word 0x8336e5ae -//.word 0x46597e27 -//.word 0x4e20c6ae -//.word 0xd76a7a22 -//.word 0x142d044d -//.word 0x74ace8ba -//.word 0x24f15ecb -//.word 0xd5774006 -//.word 0xbf2727b0 -//.word 0xe685d29d -//.word 0x9c2cc746 -//.word 0x47783c1c -//.word 0x6482371c -//.word 0xcc51f5a4 -//.word 0x364e8985 -//.word 0xfef9c559 -//.word 0x25db5d17 -//.word 0x98bb4ae4 -//.word 0xb5156d2c -//.word 0x0bc875f2 -//.word 0x610f0264 -//.word 0xfab20ab3 -//.word 0x187e7d21 -//.word 0xbff2245c -//.word 0xbb3bcf0a -//.word 0xe563afa5 -//.word 0xa1c50189 -//.word 0xabc4ec4b -//.word 0x14bcad4d -//.word 0x8739f18f -//.word 0xd16782c8 -//.word 0xa0ca26b6 -//.word 0x8b2fc5b2 -//.word 0x53e3c987 -//.word 0x6922ca84 -//.word 0xb0d26bd0 -//.word 0x83727ffe -//.word 0xfa4d71e1 -//.word 0x69f3e2a2 -//.word 0x2ae9930f -//.word 0x9da08636 -//.word 0x6ca46033 -//.word 0x14161246 -//.word 0xa15cb829 -//.word 0xb817c1a0 -//.word 0xdb555151 -//.word 0xe909e3d6 -//.word 0xe4b83311 -//.word 0xf7745bbf -//.word 0xb80e3c50 -//.word 0xaa881ff7 -//.word 0x06c99cfd -//.word 0xbb94bc5a -//.word 0xb3bb5a86 -//.word 0x5890cf8d -//.word 0x579dce62 -//.word 0xa3958c75 -//.word 0xbe8a2487 -//.word 0x345f3bbd -//.word 0x6881dff4 -//.word 0x92d2b555 -//.word 0x09e65429 -//.word 0xbe72ecee -//.word 0x09012baa -//.word 0xa9e9617f -//.word 0x067ee280 -//.word 0xb885acc3 -//.word 0x4dec49b7 -//.word 0x47b8f7b8 -//.word 0x653e07e1 -//.word 0x24968322 -//.word 0x844d1392 -//.word 0x0f5a2106 -//.word 0x18533ce2 -//.word 0x41e1ba2f -//.word 0x4072a2ee -//.word 0xe22dc9ac -//.word 0x4f2b3a57 -//.word 0x91e4db50 -//.word 0x50e74ec1 -//.word 0xdfcf1631 -//.word 0x7d72fb56 -//.word 0xd45baf2a -//.word 0xc67bb141 -//.word 0x691b7259 -//.word 0x5015b733 -//.word 0x0d443ea1 -//.word 0xf339a4e1 -//.word 0x212f8629 -//.word 0xbc41e783 -//.word 0x7bdbd1db -//.word 0x696f3f56 -//.word 0xe6693be6 -//.word 0xef64441c -//.word 0xa09ef23d -//.word 0xf7a9dd97 -//.word 0xdb64ba15 -//.word 0x5d2ac712 -//.word 0x3d496a6b -//.word 0xb0b614d8 -//.word 0x60ff6c7c -//.word 0xb580aaba -//.word 0x53da404b -//.word 0xe4a1c08d -//.word 0x1755fa1e -//.word 0xe89464aa -//.word 0x238dc001 -//.word 0x23b8f86d -//.word 0xe0c54d42 -//.word 0x29d2b0b6 -//.word 0x2de070f3 -//.word 0x4088166b -//.word 0xdcea8e6c -//.word 0xe6e787f4 -//.word 0x33901bc6 -//.word 0x4bddb3bd -//.word 0x6da32561 -//.word 0xd3c020b8 -//.word 0x3698ca5f -//.word 0x95c6a7d8 -//.word 0x330bbd26 -//.word 0xdf8af697 -//.word 0x7738c5e2 -//.word 0xaf8e0c71 -//.word 0x0f813e00 -//.word 0x3bb3c167 -//.word 0x77eb96b4 -//.word 0x6ac33b7d -//.word 0x22a0d075 -//.word 0x59e77a3c -//.word 0xf76e057c -//.word 0xd831cd31 -//.word 0xce47de48 -//.word 0xea145a6c -//.word 0xf7bf1b1d -//.word 0x48e69a02 -//.word 0xb4910f80 -//.word 0xde65da8b -//.word 0xba1b22bc -//.word 0x4c30bca4 -//.word 0xb3dd4e61 -//.word 0x6749b46e -//.word 0xbffea2c0 -//.word 0xb6998b0e -//.word 0xeec6c270 -//.word 0xf56ce02b -//.word 0xc82565cb -//.word 0x95f1a273 -//.word 0xc52bd672 -//.word 0x3abc9716 -//.word 0xd58e73c5 -//.word 0x3c44d849 -//.word 0xda28316c -//.word 0x276452c5 -//.word 0x297616d1 -//.word 0x3bde4646 -//.word 0x0d19bda3 -//.word 0xecd3ca0c -//.word 0x4359d655 -//.word 0x624d475d -//.word 0x7f9da49d -//.word 0xfab5f900 -//.word 0xe6f47df5 -//.word 0xc45d72c3 -//.word 0x91904d1e -//.word 0x04f817f7 -//.word 0x11451398 -//.word 0xb11da1ef -//.word 0xe50e622a -//.word 0xf8c89d85 -//.word 0x0589e160 -//.word 0xbad8ec95 -//.word 0x5b76cc08 -//.word 0x0a924480 -//.word 0x453c71b5 -//.word 0xb01cadaa -//.word 0x1564b43c -//.word 0xa90306fb -//.word 0x911c8c3a -//.word 0xa4b67d62 -//.word 0x73b5838c -//.word 0x86091a4e -//.word 0xe92539d4 -//.word 0xe8b23533 -//.word 0x1685e2fb -//.word 0x94cffb0b -//.word 0x8f94c4aa -//.word 0x0b5fedd3 -//.word 0xdf33bacf -//.word 0x01c4610a -//.word 0x04e7b41f -//.word 0xdf48ff35 -//.word 0xf05b348e -//.word 0x4195455d -//.word 0x09dbd2d8 -//.word 0x763b048f -//.word 0xa9dab9fc -//.word 0x032de15b -//.word 0x9f6c27bc -//.word 0x1f44d556 -//.word 0xaccdf11e -//.word 0x38bbac98 -//.word 0x06d8feed -//.word 0x6db28a3f -//.word 0xd990c739 -//.word 0x12ab61ea -//.word 0xc19bddd3 -//.word 0x30107d3e -//.word 0x51c263d2 -//.word 0x02abf865 -//.word 0x8f738f11 -//.word 0x782c468a -//.word 0x753f2dae -//.word 0xb8a6ab5e -//.word 0x725c1d8d -//.word 0x9812bf96 -//.word 0xe724d0d3 -//.word 0x26cbf16b -//.word 0xab94cf6b -//.word 0x20110119 -//.word 0x87ce3485 -//.word 0x7c868560 -//.word 0xba972e11 -//.word 0xe1b46506 -//.word 0x77da8148 -//.word 0x2c855f53 -//.word 0x62230424 -//.word 0xecc98393 -//.word 0x162521e3 -//.word 0xe6b4b898 -//.word 0xa2345988 -//.word 0x925d3535 -//.word 0x07ccbe5a -//.word 0x9d4009c4 -//.word 0xbc087763 -//.word 0x65bc94a1 -//.word 0x2b2c3ff2 -//.word 0x7f960cad -//.word 0x311ce61a -//.word 0x3474f9cc -//.word 0xa2e2cf31 -//.word 0xff63b867 -//.word 0xc22b7051 -//.word 0x1152fceb -//.word 0xcdcbd5da -//.word 0xce954848 -//.word 0x70351dee -//.word 0x4e637772 -//.word 0x4d04fbf4 -//.word 0xdd5834e4 -//.word 0x7b753616 -//.word 0x7af48218 -//.word 0x04ea2ac3 -//.word 0x5c1a3610 -//.word 0x6568452d -//.word 0x689178d0 -//.word 0x121a8bcc -//.word 0xbc8645e2 -//.word 0xf0cc13d9 -//.word 0x2808f0d0 -//.word 0xd87187d4 -//.word 0xaf8b9cae -//.word 0x1a9ea8fe -//.word 0x0b66c38e -//.word 0xf80cc7e0 -//.word 0x2655b309 -//.word 0x271a4dc2 -//.word 0xa2f80cbd -//.word 0x52483435 -//.word 0x515143c9 -//.word 0x97bd8c8a -//.word 0xbd4a2253 -//.word 0x07c2f759 -//.word 0xa22d4502 -//.word 0x2a452dfb -//.word 0x702a9f85 -//.word 0x7957790f -//.word 0xcad5f30a -//.word 0xe2ae3af9 -//.word 0x09a55bc7 -//.word 0x4824635e -//.word 0xb976c475 -//.word 0x0136fba9 -//.word 0x1a0870d0 -//.word 0x56879e8a -//.word 0xa07e7318 -//.word 0x055afa72 -//.word 0x74df3793 -//.word 0xc21b5318 -//.word 0xf198f909 -//.word 0xb2d6fff7 -//.word 0x28f84947 -//.word 0xefbeeacd -//.word 0x5db38d9d -//.word 0x08a8141d -//.word 0x88607e5f -//.word 0x7e8d0eae -//.word 0xd5fba967 -//.word 0x470c810b -//.word 0x2364f091 -//.word 0x4ee5a601 -//.word 0x88de073e -//.word 0xf17fcf23 -//.word 0xcc91f8d2 -//.word 0x8264dd49 -//.word 0xea089f37 -//.word 0xc7bfc80d -//.word 0x93b32e57 -//.word 0x7be51b4d -//.word 0xaa66aaa5 -//.word 0xcac974ac -//.word 0xc8d86c95 -//.word 0xd8860811 -//.word 0xba25a220 -//.word 0x3bd91d26 -//.word 0xfe4dcb41 -//.word 0x7ca48eda -//.word 0x4ab33e7a -//.word 0x9b6d4bdf -//.word 0x059ea450 -//.word 0x88ddd72d -//.word 0xccbb79ca -//.word 0xaa41c87d -//.word 0xee9a8ff6 -//.word 0x5b0c4acf -//.word 0xf02d8b64 -//.word 0x6a539ce5 -//.word 0x0a4c66aa -//.word 0x984f91c6 -//.word 0xa833edde -//.word 0x1cdf113c -//.word 0xea02421f -//.word 0x20049655 -//.word 0x253c580c -//.word 0x4163afe6 -//.word 0x5f487b4b -//.word 0x12c68003 -//.word 0xd7f3c604 -//.word 0x9a9b3f88 -//.word 0x7bedab63 -//.word 0xd173b994 -//.word 0x6f486f1a -//.word 0x2785cb09 -//.word 0x8dfcabdc -//.word 0xfd29ea0d -//.word 0xe065cce3 -//.word 0x2a5d9c8c -//.word 0x27c3936b -//.word 0x7843fcb3 -//.word 0x59b99635 -//.word 0x25a13a76 -//.word 0x1bcebd05 -//.word 0x6260180b -//.word 0x4bf0c624 -//.word 0xd70d6e6d -//.word 0x79ecc2df -//.word 0x1c5ba7db -//.word 0x68f79605 -//.word 0x419f4256 -//.word 0x91287b6d -//.word 0x48525226 -//.word 0xa1fb7e6e -//.word 0xa693fe56 -//.word 0xf6d00066 -//.word 0xc6a30233 -//.word 0x266a3733 -//.word 0x85672cd1 -//.word 0x7871abbd -//.word 0xb7e9e086 -//.word 0x68f0ba6a -//.word 0xa1d7946d -//.word 0x28d715a8 -//.word 0x7d0354e4 -//.word 0x1a7a4067 -//.word 0xf9e1400e -//.word 0x5711169c -//.word 0xb80c0952 -//.word 0x2b3643c0 -//.word 0xcfc278da -//.word 0x966ac84e -//.word 0x4963e715 -//.word 0xcc907b48 -//.word 0xa4f6c536 -//.word 0xb67084b3 -//.word 0x51a316b3 -//.word 0x6f35e117 -//.word 0x383af1c6 -//.word 0xc8efe200 -//.word 0x32ab01ef -//.word 0xc512ae7f -//.word 0x8e8c0570 -//.word 0x1df6bdaa -//.word 0x8c974fd0 -//.word 0xbe555b17 -//.word 0xe5284859 -//.word 0x47d02c65 -//.word 0x41c3eb9a -//.word 0x8c6aa2b4 -//.word 0xbf8c46e5 -//.word 0x150b8828 -//.word 0x71cefcd2 -//.word 0x9ffe7b69 -//.word 0xdd75c6ba -//.word 0x9a736b26 -//.word 0x7d93ed3d -//.word 0xa9fe1f8e -//.word 0x40dfd1bc -//.word 0x2517aed5 -//.word 0x073165e0 -//.word 0x9b9807b5 -//.word 0x2807b012 -//.word 0x49426aea -//.word 0xef044e00 -//.word 0xa538edb5 -//.word 0x186bee1e -//.word 0xd682f85a -//.word 0x56a8d223 -//.word 0x398bc8a2 -//.word 0xcfc85188 -//.word 0xdda3f05a -//.word 0x9dfc580c -//.word 0x077fd3d2 -//.word 0x4f1ae433 -//.word 0xafb42b5f -//.word 0x661c8ac2 -//.word 0x013f86d9 -//.word 0xd99ff045 -//.word 0xdd00c41e -//.word 0x91645189 -//.word 0x573a9a8d -//.word 0xeed3fd22 -//.word 0x3815128b -//.word 0x4073d6e6 -//.word 0x7b1d0902 -//.word 0x4e73d470 -//.word 0xd1c0afdd -//.word 0xd325829f -//.word 0x1ed30a8d -//.word 0xfb7d7f14 -//.word 0xf90e7487 -//.word 0xeb97feb7 -//.word 0x308b18c4 -//.word 0x372e4632 -//.word 0x414b793f -//.word 0x69253374 -//.word 0xe2b1eb7b -//.word 0x8102b330 -//.word 0x7b0518fa -//.word 0x6f6e4a5c -//.word 0xa7f27dc7 -//.word 0x9bb78eb3 -//.word 0xb609eaee -//.word 0x5d4eac33 -//.word 0x2e3c05fe -//.word 0x8549e19f -//.word 0x4563c78d -//.word 0xd5e201fe -//.word 0x68bbfeb4 -//.word 0x82f6f41a -//.word 0xb862c98f -//.word 0xb7873402 -//.word 0x87dc20bf -//.word 0x113a5188 -//.word 0xdf9149e8 -//.word 0x24da6dc4 -//.word 0xfc4c6433 -//.word 0xf4d3c090 -//.word 0xcdbee0cd -//.word 0x7db71409 -//.word 0x77f90365 -//.word 0x2cbd4a14 -//.word 0xd2f566b2 -//.word 0x643dd4d7 -//.word 0xea0f76eb -//.word 0xfa36393c -//.word 0x7f85f54d -//.word 0xb9c89572 -//.word 0x85fb7799 -//.word 0xdfba166b -//.word 0xa5f9e694 -//.word 0x9df57f5e -//.word 0xba6afe85 -//.word 0x9b07a847 -//.word 0x551fd1ba -//.word 0x72a1fd62 -//.word 0x3a4a4403 -//.word 0x3119fbb4 -//.word 0xe0049035 -//.word 0xd8e9b682 -//.word 0xf5c7c2a8 -//.word 0xe02e55d8 -//.word 0xd7f43cba -//.word 0xb12a9403 -//.word 0x1c4e324a -//.word 0x2ac24218 -//.word 0x0c7d2d3e -//.word 0x1d01c16b -//.word 0x228d8cfd -//.word 0xcf938818 -//.word 0x8e6cfef5 -//.word 0x7d4ba47d -//.word 0xb5700817 -//.word 0xd29e32be -//.word 0xb0ce8556 -//.word 0x7225e740 -//.word 0xc924222c -//.word 0x731f892e -//.word 0x01f0de15 -//.word 0xdeec73f8 -//.word 0x8d169011 -//.word 0x329315ce -//.word 0x545e6026 -//.word 0xe13d712a -//.word 0x72f44cdc -//.word 0xd1b89f43 -//.word 0xb9e6a5bf -//.word 0xdcf54a9b -//.word 0x2aaa90e1 -//.word 0x518a3172 -//.word 0x80958655 -//.word 0x7131a750 -//.word 0xa665d4b5 -//.word 0xf347147f -//.word 0x3cb81b9d -//.word 0x804e718e -//.word 0x1692d12e -//.word 0x376cd0d0 -//.word 0xbddbbf8c -//.word 0x2ae9d1db -//.word 0xecdf8161 -//.word 0xe0b52e09 -//.word 0x14cc0857 -//.word 0xd1e030fa -//.word 0xd9381ba1 -//.word 0xed1f3810 -//.word 0x9298d273 -//.word 0x154e37f2 -//.word 0xcdca1a85 -//.word 0xa0e8360a -//.word 0xc88c3495 -//.word 0xd791cf07 -//.word 0xf90236e2 -//.word 0x7a8db15b -//.word 0x883488b1 -//.word 0x394621be -//.word 0xd08e68cc -//.word 0x3cca73a9 -//.word 0xe15f67fe -//.word 0x9b4a95dc -//.word 0x005ae998 -//.word 0xe69c85d9 -//.word 0x2617a9ef -//.word 0x9fbad666 -//.word 0x7d9333db -//.word 0xbb422f0f -//.word 0xe6ac683a -//.word 0x24f4cca2 -//.word 0x76a7fd6b -//.word 0x3a36fab1 -//.word 0xf4aafdd4 -//.word 0x4d939f13 -//.word 0x5c41425d -//.word 0x2537b063 -//.word 0x5fdd00f2 -//.word 0x7b75ba80 -//.word 0xe1503b05 -//.word 0x7d425a0c -//.word 0x7a534b09 -//.word 0x4db7c4ed -//.word 0xf6015ff8 -//.word 0x829340ce -//.word 0xd559f7ce -//.word 0xa6b7a79f -//.word 0xcbbf680b -//.word 0xb7a8eb11 -//.word 0x417b5d35 -//.word 0xa7108d1b -//.word 0xd2395054 -//.word 0xdb3d2578 -//.word 0xcf881575 -//.word 0xafa0dd26 -//.word 0xbb5b4f28 -//.word 0xf050f6e9 -//.word 0xd08bf901 -//.word 0x618541c6 -//.word 0x7853de1a -//.word 0x371da788 -//.word 0xd5d22190 -//.word 0x9d1aa33e -//.word 0x3a8cb702 -//.word 0x3122c2bb -//.word 0xafe9e815 -//.word 0x85fd2a15 -//.word 0x71b5d1f2 -//.word 0x9f1b1027 -//.word 0x6f9fe5c6 -//.word 0x790c400f -//.word 0xcfba6741 -//.word 0x810699b0 -//.word 0x67fff118 -//.word 0x1a628e31 -//.word 0x44c9f183 -//.word 0x1a1fa67c -//.word 0x265727c0 -//.word 0x4a5dfdc0 -//.word 0x024d288e -//.word 0xe9e4c1f0 -//.word 0x7f34deb3 -//.word 0x299bb641 -//.word 0x79f50676 -//.word 0xb011b3b0 -//.word 0x8162b025 -//.word 0x18f7227a -//.word 0x5badc291 -//.word 0x70a483a2 -//.word 0x7fef768d -//.word 0xb990ea6e -//.word 0x99a3d772 -//.word 0x69d97dea -//.word 0x0928489e -//.word 0xecc1f764 -//.word 0x6343fdf1 -//.word 0x1e2e27ee -//.word 0xef9a804f -//.word 0xd22972e0 -//.word 0x2b3a2d20 -//.word 0x4e5f4d53 -//.word 0x4412b6d3 -//.word 0xcda3c3a7 -//.word 0xa175a156 -//.word 0xfb6af5fd -//.word 0x589cc5a0 -//.word 0x7c4e95be -//.word 0xb722d028 -//.word 0x668c6a13 -//.word 0xbc86c46b -//.word 0xc385d06a -//.word 0x9dac756a -//.word 0x104035f7 -//.word 0x425d0d29 -//.word 0xc0e79c30 -//.word 0xc5c28831 -//.word 0xba461e51 -//.word 0xf9ed380f -//.word 0xd64f64d6 -//.word 0xe05142d2 -//.word 0x64992e04 -//.word 0x33451f91 -//.word 0xa5dccf60 -//.word 0xde841de3 -//.word 0x5076af35 -//.word 0x81b0db66 -//.word 0x0fe9c813 -//.word 0xf1cad039 -//.word 0xff5b294a -//.word 0xb5bcc581 -//.word 0x34157673 -//.word 0x89cf56e8 -//.word 0x320566e8 -//.word 0xde357519 -//.word 0x753c4448 -//.word 0x5881e745 -//.word 0xea706ef4 -//.word 0x4f2ac5a1 -//.word 0x747ad994 -//.word 0x4f0cfce5 -//.word 0x68d98b92 -//.word 0x98e6cecf -//.word 0x102e1f9d -//.word 0x9edc4f9e -//.word 0x2cbe4528 -//.word 0x8af7e898 -//.word 0x6df440e9 -//.word 0xb7a1d785 -//.word 0xf8dc665a -//.word 0x352aad31 -//.word 0xe9a8a33b -//.word 0x4a45cfed -//.word 0xcd2ff60e -//.word 0xec8bf60f -//.word 0x2769f29a -//.word 0x49f7af6d -//.word 0xecf43e69 -//.word 0x3f68dce6 -//.word 0x0793164a -//.word 0xe42331da -//.word 0xd6aac8d0 -//.word 0xff4eb7ad -//.word 0xabc338d0 -//.word 0x8d764c48 -//.word 0x4b0b5de7 -//.word 0x3e0a2197 -//.word 0x73d5c1f1 -//.word 0xf5de3b0c -//.word 0x4e160593 -//.word 0x4ba9f31b -//.word 0x00e85ab3 -//.word 0x0c8676bc -//.word 0x1e0809fb -//.word 0xb87745ec -//.word 0x3358ec59 -//.word 0x04deb62c -//.word 0x3d5df382 -//.word 0x57027100 -//.word 0x2ec2a06a -//.word 0x4d90f471 -//.word 0x6cd38bcd -//.word 0x3717108c -//.word 0x5102dfaa -//.word 0x998a69e1 -//.word 0xac66dac2 -//.word 0xabc2fa05 -//.word 0x3e37511e -//.word 0xd8fa8f11 -//.word 0x3d542b86 -//.word 0x42524920 -//.word 0xd4bde10b -//.word 0x3c4c1ed4 -//.word 0xa119047e -//.word 0xcf5256d2 -//.word 0x3731b7f6 -//.word 0x362e0f41 -//.word 0x9a73304e -//.word 0x6290ba4f -//.word 0xc5703ba4 -//.word 0x768b9bad -//.word 0x275eb8dc -//.word 0x4c184d0e -//.word 0x2197181b -//.word 0xee923cab -//.word 0x8918e44c -//.word 0x1d3929c2 -//.word 0x2b03369e -//.word 0xceb0a913 -//.word 0x431d3d04 -//.word 0xa87ea661 -//.word 0x0451bdb4 -//.word 0x8890ddf7 -//.word 0x152b8da9 -//.word 0xfeb55f21 -//.word 0x0e5d1821 -//.word 0xcd2110ae -//.word 0xff3edc1f -//.word 0x6eeb2b75 -//.word 0xe946eeea -//.word 0x8d8fbccd -//.word 0x4394748c -//.word 0x8a6c2413 -//.word 0x77682954 -//.word 0xf9479827 -//.word 0x62a9dd55 -//.word 0x23c7a2ef -//.word 0xd760f3e5 -//.word 0x84f79fd3 -//.word 0x1d3be11e -//.word 0x4bc73f40 -//.word 0x6c0bb360 -//.word 0xdd8a0926 -//.word 0x744788cd -//.word 0x5179d47a -//.word 0xd78613cc -//.word 0xf52f4fb4 -//.word 0xaa081b87 -//.word 0xc82c7a51 -//.word 0xf82efc6d -//.word 0xfe532a52 -//.word 0x3efe24b0 -//.word 0x7f6b89bc -//.word 0xf0a097c7 -//.word 0x68a19416 -//.word 0xf2e46cee -//.word 0x89049bee -//.word 0x20b94da2 -//.word 0xe608c454 -//.word 0xc7b7fb25 -//.word 0x3604895d -//.word 0x2a97c700 -//.word 0x66b435a2 -//.word 0xfeb51a7b -//.word 0x17b86bbe -//.word 0xee95ee27 -//.word 0x1c139fd3 -//.word 0x185b5355 -//.word 0xfdac9b06 -//.word 0x8d51eb9c -//.word 0x76d0fcff -//.word 0xd5656e58 -//.word 0xf9aeb26a -//.word 0x69a82725 -//.word 0x28da8378 -//.word 0x37d07568 -//.word 0x5ccb895f -//.word 0x22b74bc6 -//.word 0x215dafd5 -//.word 0x7fdab0aa -//.word 0xb7503899 -//.word 0x99db40c4 -//.word 0x93c738eb -//.word 0x2e00a985 -//.word 0xdbc9190f -//.word 0xf0b12fa4 -//.word 0xeec317ce -//.word 0x05fe289c -//.word 0xda05c4f4 -//.word 0x8717802b -//.word 0xe34085d3 -//.word 0x05d137d4 -//.word 0x030f14bf -//.word 0xff28de5e -//.word 0x656bfc90 -//.word 0x6eb71e53 -//.word 0xe9342023 -//.word 0x3a423183 -//.word 0xa3af34d9 -//.word 0xc22d667e -//.word 0x5b034116 -//.word 0x5802a11d -//.word 0x0ebb26c3 -//.word 0xc2efd9fa -//.word 0x6c4712cd -//.word 0xba4599f3 -//.word 0x587b0ba4 -//.word 0x6ffb7fab -//.word 0x6c0e6abd -//.word 0x0229c009 -//.word 0x721c5c10 -//.word 0x0a8da2b7 -//.word 0xeba5639a -//.word 0x100900a4 -//.word 0x8c0cd3dd -//.word 0x1323ca82 -//.word 0xbc99555b -//.word 0x05838349 -//.word 0x18f7681f -//.word 0x4d79c1b2 -//.word 0xefb6db34 -//.word 0x4375b0bd -//.word 0xc6ca532b -//.word 0xb78c8f2c -//.word 0xd50acb99 -//.word 0x6afa3106 -//.word 0x88b21097 -//.word 0x939b7e15 -//.word 0xffe24140 -//.word 0x5b70f067 -//.word 0x8f1d5537 -//.word 0x622016d1 -//.word 0x3fca941f -//.word 0x38751467 -//.word 0x4bb71d20 -//.word 0xe4db2005 -//.word 0xa4915f69 -//.word 0x61e407ca -//.word 0x6e6d9fa8 -//.word 0x1cc6a697 -//.word 0x80427894 -//.word 0x77db7295 -//.word 0xe86c5664 -//.word 0x4921f1ac -//.word 0x652bfb54 -//.word 0x5cb83e0d -//.word 0xeb22fb27 -//.word 0xed6689a9 -//.word 0x22d93fa0 -//.word 0x301694b7 -//.word 0xe73b8508 -//.word 0xc9553732 -//.word 0xca18deac -//.word 0x54d4dd59 -//.word 0x8ea42f5c -//.word 0xdee9052d -//.word 0xadf6b0ec -//.word 0x6a0dc2f6 -//.word 0xd18b70b7 -//.word 0x6d5f3bbf -//.word 0x5bc0d017 -//.word 0x52202cd5 -//.word 0xe05b03ee -//.word 0xf635634c -//.word 0xa7039520 -//.word 0x2da8447a -//.word 0x2dc3e017 -//.word 0x3c274579 -//.word 0xa18c983d -//.word 0x5c8472aa -//.word 0x68b04186 -//.word 0x3e33eb2d -//.word 0x9a67b4e4 -//.word 0x81cf616a -//.word 0x834d9dd0 -//.word 0x3e959d8b -//.word 0x23e200c8 -//.word 0x7de8f9ff -//.word 0xae09afcb -//.word 0xbccbe4f9 -//.word 0x0d8ad5de -//.word 0x6f6a62ee -//.word 0x5c906f8b -//.word 0x7b928a1b -//.word 0x692bce5d -//.word 0xba3407fd -//.word 0x3bcf1766 -//.word 0x7ae698d7 -//.word 0x89d4c2b9 -//.word 0xfe618f30 -//.word 0x3ef41ef0 -//.word 0xfc045552 -//.word 0xfcd0cba6 -//.word 0x1d50e5cb -//.word 0x966b3ffe -//.word 0x806a4df0 -//.word 0x95ad421b -//.word 0x379c3055 -//.word 0xb4e171a6 -//.word 0xc8d54757 -//.word 0x6337bf4b -//.word 0xad24db93 -//.word 0x4743ef3c -//.word 0xd4414c6b -//.word 0xb97d1cad -//.word 0x20048d88 -//.word 0x43bf3256 -//.word 0xe7eba653 -//.word 0x26ca72f4 -//.word 0x7298307a -//.word 0xd7c1f1c8 -//.word 0x8051dd71 -//.word 0x7dac1916 -//.word 0xc47feeef -//.word 0x75f627a7 -//.word 0x6230ba6d -//.word 0xcef0ab48 -//.word 0x75952eaa -//.word 0xcd4c0c49 -//.word 0x8c84472a -//.word 0x6aa201fe -//.word 0x28f69ab2 -//.word 0xd1ee1942 -//.word 0x408acdce -//.word 0xe21034ef -//.word 0xbd011b4b -//.word 0xb14b0767 -//.word 0xfec0d4bd -//.word 0x07c79c0f -//.word 0x5652dafa -//.word 0xdf10cfce -//.word 0x89e3259d -//.word 0xea94d392 -//.word 0x52c64084 -//.word 0x0c28abcb -//.word 0xe0efca53 -//.word 0xdc84b1ef -//.word 0x5579f6ef -//.word 0x28c213f4 -//.word 0x45220b03 -//.word 0x6fe351d9 -//.word 0x3dcae57e -//.word 0x654ac01d -//.word 0x39f87213 -//.word 0x723f0a46 -//.word 0x2d5536b8 -//.word 0x336dab5c -//.word 0x7d2fc728 -//.word 0xf865756b -//.word 0x85f75261 -//.word 0x44190e04 -//.word 0x12c31426 -//.word 0x50616dbd -//.word 0xe7cde17e -//.word 0x887a60ad -//.word 0x39f2a133 -//.word 0x0d8209f1 -//.word 0x3233ce54 -//.word 0x31fd5c29 -//.word 0x7238f8b3 -//.word 0xff53a3fb -//.word 0x89c84168 -//.word 0xb04ffa8f -//.word 0x7f53e14c -//.word 0x36a2d312 -//.word 0x4d68a27f -//.word 0xb55e7334 -//.word 0x613f65e3 -//.word 0x057c74a9 -//.word 0x1e309c9f -//.word 0x325641ac -//.word 0x593ace9d -//.word 0xfc2d9d77 -//.word 0xdd7d170b -//.word 0x57a41ccc -//.word 0xe8c0a5de -//.word 0xec43a76f -//.word 0xabec3b4a -//.word 0x96f6fda9 -//.word 0xce8fb14b -//.word 0xe68b2dc7 -//.word 0xea5a7320 -//.word 0xa0371d99 -//.word 0x0da3fecb -//.word 0x3b1206f4 -//.word 0x3ae46692 -//.word 0x6596f531 -//.word 0xe63ad281 -//.word 0x7d244bab -//.word 0x7de7fee5 -//.word 0x17803e45 -//.word 0xdad0b9d2 -//.word 0x7b5057e1 -//.word 0xd200659f -//.word 0x26a0f2ea -//.word 0xaa237965 -//.word 0x4761c1cb -//.word 0x9c0c0283 -//.word 0x44e54975 -//.word 0x572f1d1d -//.word 0x336463dd -//.word 0x7c287f98 -//.word 0x617bbc7c -//.word 0x2132ee1f -//.word 0xcea856ce -//.word 0x52b1c522 -//.word 0xafcf04d3 -//.word 0x8ba974d1 -//.word 0xebb8f291 -//.word 0x3f44fda5 -//.word 0x9f8f1b90 -//.word 0x545078d8 -//.word 0x9a62d15d -//.word 0xa4be90e8 -//.word 0xe1a73907 -//.word 0x7e240419 -//.word 0x2cb3cca5 -//.word 0x233c27f0 -//.word 0x6644d7ce -//.word 0x496361b8 -//.word 0x31f8fb1f -//.word 0x9c1bab00 -//.word 0x61d3aeb9 -//.word 0x3889171b -//.word 0x7cbdb8c0 -//.word 0x30f8459e -//.word 0x4102b7dd -//.word 0x0a54efe6 -//.word 0x1dd09cbd -//.word 0x41b05e90 -//.word 0xb7bd2c90 -//.word 0xc2c1f3ff -//.word 0x663e7f8a -//.word 0x6f609fda -//.word 0xb5318466 -//.word 0x9f0c6b8b -//.word 0xe6547cde -//.word 0x9b65f1c1 -//.word 0x6ccb7a34 -//.word 0x23b3e0ee -//.word 0x6f9ee9ad -//.word 0xe75d7dca -//.word 0x4c390610 -//.word 0x0e721dce -//.word 0x12eb622b -//.word 0xb323abba -//.word 0x0767624e -//.word 0x63462810 -//.word 0x2146bece -//.word 0xa0d52696 -//.word 0x8d820584 -//.word 0x616d4cd8 -//.word 0x2bfc174b -//.word 0x90d0d6a4 -//.word 0x10f8aa86 -//.word 0x8b64128c -//.word 0x039cc698 -//.word 0xa3b2e367 -//.word 0x00744969 -//.word 0xa0e741d0 -//.word 0xb9f164e7 -//.word 0x3a56b8a6 -//.word 0x0fe61b83 -//.word 0xa1f4e58a -//.word 0x9d09c9b0 -//.word 0xf7dafc65 -//.word 0x2e789968 -//.word 0xd1c745df -//.word 0x42310fa7 -//.word 0xba9b99e9 -//.word 0x8d987dee -//.word 0xb0ddea34 -//.word 0x78f68ec1 -//.word 0xa437b9b7 -//.word 0x9ef4bf29 -//.word 0xfef59e2d -//.word 0x5024e032 -//.word 0x1789c394 -//.word 0x1278986e -//.word 0xbd0969b0 -//.word 0x1bc9de71 -//.word 0xb3af6186 -//.word 0xd8528153 -//.word 0x2e5894e1 -//.word 0x6a32a131 -//.word 0x59077dd0 -//.word 0x24ed33ac -//.word 0xd25fa926 -//.word 0x0eec8168 -//.word 0x2b2c3ef9 -//.word 0x65f8a88e -//.word 0x6ada7124 -//.word 0x19c3184b -//.word 0x89fc0ec5 -//.word 0x4d5f184f -//.word 0xf6c7f4bf -//.word 0xdac53f4f -//.word 0x14959639 -//.word 0xcc50fc84 -//.word 0xb9627b1d -//.word 0xe33f0e29 -//.word 0xae52bf9a -//.word 0x14360d00 -//.word 0x322990a2 -//.word 0x06bee0ce -//.word 0x77d2b26d -//.word 0x95c044da -//.word 0x23d9fcf5 -//.word 0x530e4c73 -//.word 0xd0f0d878 -//.word 0x01dbdb67 -//.word 0x8d6dc6f9 -//.word 0x1a3d2b8c -//.word 0x5bcadabe -//.word 0x49b24a3b -//.word 0xb0253ad3 -//.word 0xee9897d0 -//.word 0xf7bea186 -//.word 0x9db44a2b -//.word 0x0f7cdee9 -//.word 0x9face932 -//.word 0xc8675654 -//.word 0x6f8dd44d -//.word 0x692f7ee0 -//.word 0x3e46bae8 -//.word 0x2ca461ed -//.word 0x6f2a21f5 -//.word 0xc03c209c -//.word 0x1c72e267 -//.word 0xc6906d56 -//.word 0x8fb9abb8 -//.word 0x55df0f43 -//.word 0xca7e7b64 -//.word 0x768a62d4 -//.word 0x00a62a6c -//.word 0xa996d43a -//.word 0x19f7ded4 -//.word 0x5e2d68ec -//.word 0x329e9725 -//.word 0x7c1e3725 -//.word 0x1aa9a4ec -//.word 0xde58ea64 -//.word 0xd68e2b39 -//.word 0xd17241ea -//.word 0x1ea3a521 -//.word 0x97278f40 -//.word 0xdfa45f3c -//.word 0xe7d23cae -//.word 0xb730fb27 -//.word 0x6bf642c4 -//.word 0x7b4bed03 -//.word 0x40b9b0d5 -//.word 0xb4defef5 -//.word 0x7a642a77 -//.word 0x1e33cda4 -//.word 0x9de46705 -//.word 0x287949be -//.word 0x254cb21e -//.word 0x77463873 -//.word 0xff516923 -//.word 0x6210b3f8 -//.word 0x0dcd81bc -//.word 0x77b3a706 -//.word 0xa63d0053 -//.word 0xf5ee5558 -//.word 0x14438197 -//.word 0x50e6d331 -//.word 0x1524b4fb -//.word 0xb1a18ad3 -//.word 0x5a4adc35 -//.word 0x738cb609 -//.word 0x0bc34fbf -//.word 0xa7f6e99e -//.word 0x41c1f959 -//.word 0x909288e4 -//.word 0x8a19d985 -//.word 0x28f94c2e -//.word 0x69c4820a -//.word 0x9926c256 -//.word 0xd3609b72 -//.word 0xc5f8cb38 -//.word 0xb3af608c -//.word 0xbeb41d34 -//.word 0x67171feb -//.word 0x4f80c1b0 -//.word 0x4021bc64 -//.word 0x71e99394 -//.word 0x06fb2e94 -//.word 0xd75ec4cd -//.word 0x72f6ff57 -//.word 0x63b35bcb -//.word 0xb308d052 -//.word 0xae9fb002 -//.word 0xe94bd26b -//.word 0x843ef06c -//.word 0xad7c4e4c -//.word 0x658f9c05 -//.word 0x877c1ee3 -//.word 0x06f70a4e -//.word 0x76d332e4 -//.word 0xcebce2cc -//.word 0x6c280c46 -//.word 0x598ba286 -//.word 0xcfca44c2 -//.word 0xf8f31b8a -//.word 0xf92b0558 -//.word 0x2fe8f268 -//.word 0xb8608ec9 -//.word 0x364120b5 -//.word 0xcfa2b11e -//.word 0x79397289 -//.word 0x74cf581f -//.word 0x17f20901 -//.word 0xd0eafbdd -//.word 0x67eedabf -//.word 0x82972b29 -//.word 0x6e943065 -//.word 0x1ca00b1a -//.word 0x6ab1251e -//.word 0xa472d18b -//.word 0x4bf42d15 -//.word 0x15a0499a -//.word 0x34718cfb -//.word 0xdb60532b -//.word 0xff1fda85 -//.word 0x5b096063 -//.word 0xb65a86ec -//.word 0x689bf92d -//.word 0x1b61506c -//.word 0xcf3738b8 -//.word 0x21d9cec5 -//.word 0xcca34cf7 -//.word 0x7048e8bd -//.word 0x92c7f920 -//.word 0xe49b5c9c -//.word 0xc732162e -//.word 0x0fa13aae -//.word 0x06960e5f -//.word 0xb38e69c5 -//.word 0x5c485fb6 -//.word 0x497920b4 -//.word 0xcbc11e7a -//.word 0x7dde6ed5 -//.word 0xca2071b5 -//.word 0xaf1cb384 -//.word 0xc2a513b6 -//.word 0x74f825a2 -//.word 0x9337d490 -//.word 0x13194c13 -//.word 0x0ddf1799 -//.word 0x088a8540 -//.word 0x784b52eb -//.word 0x843b8396 -//.word 0x0c4c91e6 -//.word 0xeb7fc904 -//.word 0x7958f3ac -//.word 0x54903281 -//.word 0x61092ba4 -//.word 0x0d076984 -//.word 0xd99c00f8 -//.word 0x1564718b -//.word 0xeb73ce16 -//.word 0xa08c1f95 -//.word 0x17930333 -//.word 0x97459ba7 -//.word 0xcd27a3c3 -//.word 0x15bce24a -//.word 0xf5fbc503 -//.word 0xea00470b -//.word 0x6802136f -//.word 0x1c85edfa -//.word 0x74d14e4c -//.word 0x61a24e2c -//.word 0x5c21c720 -//.word 0xa713b83a -//.word 0xd551e734 -//.word 0x8c78cbc0 -//.word 0x8ae1a819 -//.word 0xe6d4fcde -//.word 0x98f81a20 -//.word 0x3c0e15ba -//.word 0x13dfdfe0 -//.word 0x4b73b2fb -//.word 0x8084afb4 -//.word 0x8232c64f -//.word 0x59f9d53b -//.word 0x86df14e7 -//.word 0x8cf2b0d7 -//.word 0xaff1b6f6 -//.word 0xfc4a332e -//.word 0x89449a36 -//.word 0xfe7e65ab -//.word 0x5498ff63 -//.word 0xdd30e2fe -//.word 0x8510fcbd -//.word 0x57a55898 -//.word 0x43b4fa8a -//.word 0x1e480b30 -//.word 0xeaef3692 -//.word 0x58255141 -//.word 0x8b1140a2 -//.word 0x1f6f1689 -//.word 0x6ace7e09 -//.word 0x01fb5a8b -//.word 0x7ebda91e -//.word 0x81c2ae0e -//.word 0xf5da4fb8 -//.word 0x9563bb9c -//.word 0xae044fb4 -//.word 0x269fbb05 -//.word 0xbd806073 -//.word 0x93dbfdd9 -//.word 0xeb758b59 -//.word 0x2ea165f1 -//.word 0x336eac4f -//.word 0xbd1feae7 -//.word 0x45dbf542 -//.word 0xfaa61799 -//.word 0x07906ba2 -//.word 0x142c8aaa -//.word 0x0f4467e4 -//.word 0x2ccb7801 -//.word 0x2a131700 -//.word 0xd9412748 -//.word 0xd9fdfaf4 -//.word 0xa46e726e -//.word 0xce65673f -//.word 0x8cd84925 -//.word 0x74930766 -//.word 0x832a2f65 -//.word 0x64325673 -//.word 0xefb0bae7 -//.word 0xf1d22671 -//.word 0x2bdd16ab -//.word 0x9d671cf1 -//.word 0x04c68273 -//.word 0xa1c83188 -//.word 0x3ca5d146 -//.word 0x6931324f -//.word 0x0a56ebed -//.word 0x15c24162 -//.word 0x97dd4a79 -//.word 0xf9fe5261 -//.word 0x82de7dbb -//.word 0x1e4daef2 -//.word 0x5e23a8cb -//.word 0xbf7a733d -//.word 0x2f1a0282 -//.word 0xcd35126e -//.word 0xf1555500 -//.word 0x6c92d037 -//.word 0x11088126 -//.word 0x7488464b -//.word 0xf18efa1d -//.word 0xf073e1e4 -//.word 0x68e446cd -//.word 0xa293623e -//.word 0x402c8067 -//.word 0x7d8b5f1a -//.word 0xb62cd8dc -//.word 0x2ae3c03c -//.word 0xfecd1063 -//.word 0x848643ed -//.word 0xbc9c00f7 -//.word 0x1b44f979 -//.word 0x8c4c13d7 -//.word 0xb551c7b2 -//.word 0x7b32c804 -//.word 0xc8c4e66c -//.word 0x8bc832c6 -//.word 0x011a63ff -//.word 0x342b7827 -//.word 0xc1b09fc8 -//.word 0xdd9c5677 -//.word 0x9a4cd0a8 -//.word 0x67029ac7 -//.word 0xd6957e84 -//.word 0xa367a86e -//.word 0xf19607c3 -//.word 0xd677f686 -//.word 0x1a401cd3 -//.word 0x3c049070 -//.word 0xb6e541a4 -//.word 0x8285964c -//.word 0xddbd512b -//.word 0x4b92b982 -//.word 0xdb64f8e0 -//.word 0xac69c23c -//.word 0xb05a3741 -//.word 0xb06c0be9 -//.word 0x9182e44d -//.word 0xd5a103bc -//.word 0x65a4270a -//.word 0x8d31ae2a -//.word 0x48ebfeff -//.word 0xbee92370 -//.word 0x0b68b9bb -//.word 0x42bc0d0b -//.word 0xb18d7f4c -//.word 0x673f2b3e -//.word 0xf4b2c8c8 -//.word 0x702ccf90 -//.word 0xbf93e0c8 -//.word 0x12e0634b -//.word 0xb1d06be8 -//.word 0xf9dcdffd -//.word 0xa06cdb48 -//.word 0x414854fb -//.word 0x144ffb0e -//.word 0xfc6b64d9 -//.word 0xc8c468e2 -//.word 0xb234c8f4 -//.word 0x2cfc1271 -//.word 0xddb5c9e8 -//.word 0xe689c0ea -//.word 0x69a2c71a -//.word 0x4ce38984 -//.word 0x3ad6b530 -//.word 0xebe65cf6 -//.word 0xa6cf9b93 -//.word 0x045279fd -//.word 0xf62d12f4 -//.word 0x094af6da -//.word 0xe937ccc4 -//.word 0x24d63bd1 -//.word 0x31560abb -//.word 0xb16185ab -//.word 0xf4972352 -//.word 0xbf3c6735 -//.word 0x4d2d0448 -//.word 0x931944bf -//.word 0xc9edaa21 -//.word 0x2590d79e -//.word 0xead1aaa2 -//.word 0xa19eabaa -//.word 0xa676aa57 -//.word 0xe720a3c0 -//.word 0xe99ee50d -//.word 0x0c5d7342 -//.word 0x0faeab58 -//.word 0xd67a2592 -//.word 0x6b30de0e -//.word 0x4403969b -//.word 0xc45376ca -//.word 0x0368f648 -//.word 0xd266fe6a -//.word 0xfa7d4b0a -//.word 0xc5611592 -//.word 0xc0faef56 -//.word 0xbe5cee27 -//.word 0x20f90d24 -//.word 0x5415d0d4 -//.word 0x9c7b2872 -//.word 0x116f9788 -//.word 0xe7e394c0 -//.word 0xf2ee31f6 -//.word 0x6979fb91 -//.word 0xeb3c2214 -//.word 0xbfe9daf0 -//.word 0x60a6009d -//.word 0x39c101e8 -//.word 0xad9ff88f -//.word 0x5af6160b -//.word 0x9f3c47ad -//.word 0x5b6012ec -//.word 0xf8b7c1fe -//.word 0xa939c3a5 -//.word 0xefed4e4c -//.word 0x62a24952 -//.word 0xaee068a6 -//.word 0xdc1e9994 -//.word 0xd3359fde -//.word 0x1e15fc0f -//.word 0xefb7150c -//.word 0x645391ec -//.word 0x0ad20209 -//.word 0xa086c757 -//.word 0x1d1931f5 -//.word 0xf4c3e402 -//.word 0x96c080b2 -//.word 0x380281a1 -//.word 0xd7236467 -//.word 0x7a9d0c6c -//.word 0xb83d63fe -//.word 0x79d544a0 -//.word 0x013299a5 -//.word 0x2a4dc0fe -//.word 0xf0c53451 -//.word 0x338d694b -//.word 0xb9e2f736 -//.word 0x7381fbce -//.word 0x0116ba50 -//.word 0x77f788d5 -//.word 0x6212e9de -//.word 0x0625f530 -//.word 0xea2d01e2 -//.word 0x97207bb4 -//.word 0x9cde16a2 -//.word 0xd56527b9 -//.word 0xed454f2a -//.word 0x22555b9d -//.word 0x48a368c7 -//.word 0x11b14b3f -//.word 0x8bde308d -//.word 0xea228084 -//.word 0x88fe09d3 -//.word 0x2ab359d6 -//.word 0x85b36ab2 -//.word 0x015585a0 -//.word 0xbccc6089 -//.word 0xd25a8ad4 -//.word 0xdcc1087c -//.word 0xb6fb4165 -//.word 0x862a17f0 -//.word 0xf9d257cd -//.word 0xd0465310 -//.word 0x9c60cd87 -//.word 0xc575174b -//.word 0xd1887996 -//.word 0xe3bed3d4 -//.word 0x821283fd -//.word 0x9c4a8921 -//.word 0xcb2ae945 -//.word 0xd6e7516d -//.word 0x7bdffcfa -//.word 0x6c86d636 -//.word 0x97a4e12e -//.word 0xaabed7c0 -//.word 0xd7d111f4 -//.word 0xd547a790 -//.word 0x2723d9e6 -//.word 0xa07faef1 -//.word 0x2738daa0 -//.word 0xb8e8e572 -//.word 0xab148a43 -//.word 0x39a75e66 -//.word 0x3c9fb2f3 -//.word 0x3607b962 -//.word 0x9525ee59 -//.word 0x35f4b0c3 -//.word 0x27d52f22 -//.word 0xb1818c26 -//.word 0x95423c7e -//.word 0x9663aeee -//.word 0x39e42da2 -//.word 0xc97307c2 -//.word 0x9d98ef46 -//.word 0x9e30a00c -//.word 0x031cc327 -//.word 0x5f3a137b -//.word 0xde94bf87 -//.word 0xcbd80f81 -//.word 0x56094ba8 -//.word 0x9573d9d6 -//.word 0xc8e4a554 -//.word 0xe119c6f3 -//.word 0x44775e58 -//.word 0xcbfcc198 -//.word 0x0d74da05 -//.word 0xe0f0cb47 -//.word 0x1c74d4ae -//.word 0xa2f076c6 -//.word 0x9d71d82c -//.word 0x089969a1 -//.word 0x714dc75d -//.word 0xfcade0a5 -//.word 0xaa4957a0 -//.word 0xdb912967 -//.word 0x128e905b -//.word 0xf9d027bb -//.word 0xa5a84f76 -//.word 0x1a97d23d -//.word 0x1205c7dd -//.word 0xfa36b6cc -//.word 0x3e7bfc01 -//.word 0xc6a57009 -//.word 0xc1bf4658 -//.word 0xa1fd34dd -//.word 0x66efd4d9 -//.word 0x20fa4af0 -//.word 0xaf092681 -//.word 0xce808c33 -//.word 0x507292d0 -//.word 0xa813e957 -//.word 0xaf70c04c -//.word 0xa25de553 -//.word 0x6aaf2dfd -//.word 0x21ac17e2 -//.word 0xd1c0acf0 -//.word 0x7f72a902 -//.word 0x6895e0b4 -//.word 0x8ac3dc76 -//.word 0x6607c4e0 -//.word 0x05da8146 -//.word 0x3951238b -//.word 0x2594813a -//.word 0xff9220d2 -//.word 0x15f35762 -//.word 0x0e4eb056 -//.word 0x739d9091 -//.word 0x6eee1bbc -//.word 0xd15b52dd -//.word 0x593b7e2b -//.word 0x359ad221 -//.word 0xc2e74cd1 -//.word 0x99eddc7b -//.word 0xcb05c85e -//.word 0x6b894fce -//.word 0x4d8b8d87 -//.word 0x0ec79e41 -//.word 0x54d70684 -//.word 0x57a650be -//.word 0xa127f693 -//.word 0x12478174 -//.word 0x2620f173 -//.word 0x7b6f5f55 -//.word 0x8d48e1e9 -//.word 0xc408ae99 -//.word 0xb28c833f -//.word 0x95a0453a -//.word 0x24bae7c0 -//.word 0x88e98e75 -//.word 0xa808f33d -//.word 0xa937094f -//.word 0xb58ce18c -//.word 0xfc05ca0e -//.word 0xf9c1bc03 -//.word 0xf770f7bc -//.word 0xd309e701 -//.word 0x03bb4ba8 -//.word 0xd7259666 -//.word 0xffc995e4 -//.word 0x4ebe5315 -//.word 0xbea63ac8 -//.word 0xb3e07a79 -//.word 0x84ffaf6d -//.word 0x377abefe -//.word 0x8ca4ff33 -//.word 0x3edfa293 -//.word 0x850d4b3b -//.word 0xdf48002f -//.word 0x10d345ee -//.word 0x67508549 -//.word 0x4433b474 -//.word 0xd776335e -//.word 0x2a8ff43e -//.word 0x629fde6e -//.word 0x42ec737d -//.word 0xf091b080 -//.word 0xfc7434a8 -//.word 0x9e79a51a -//.word 0x3ff550fa -//.word 0x3b660fc9 -//.word 0xe66170f2 -//.word 0xcdcb139f -//.word 0x3e4c54d1 -//.word 0x0a012ab0 -//.word 0x89714f20 -//.word 0xdfc3a294 -//.word 0x7e2ec927 -//.word 0xecb01ae9 -//.word 0xc703bc76 -//.word 0x06cd09ce -//.word 0x81173760 -//.word 0xb4003868 -//.word 0xbfb2de7b -//.word 0xb2964360 -//.word 0x08c46822 -//.word 0x71be1c63 -//.word 0xd55d20f3 -//.word 0x950b88a2 -//.word 0x14336452 -//.word 0x76f6a050 -//.word 0xa72029e4 -//.word 0x9f5a5126 -//.word 0xe5a17514 -//.word 0x52f6dde2 -//.word 0x1857e391 -//.word 0x03ef58c3 -//.word 0xfe8a23ce -//.word 0xd84b2b0f -//.word 0x48a17881 -//.word 0x2f77958d -//.word 0x1eab3824 -//.word 0x18c2240c -//.word 0x99da4f77 -//.word 0xd6df40da -//.word 0x4702bcfc -//.word 0x6367a14e -//.word 0xab1e127a -//.word 0xe955d43e -//.word 0xbaccf87b -//.word 0x4a89bb89 -//.word 0x5fccaace -//.word 0x99450a8f -//.word 0xf8857605 -//.word 0x9eb3cab4 -//.word 0xd68040f8 -//.word 0x565cd9e1 -//.word 0xc1ebff40 -//.word 0x70b26802 -//.word 0x72173dbd -//.word 0xd1887c89 -//.word 0x17fa9b11 -//.word 0x11956eea -//.word 0xd3ad4a23 -//.word 0xfcf56b1d -//.word 0x3cef939c -//.word 0x13a7f41f -//.word 0xdba1506d -//.word 0x08105f71 -//.word 0xaf487147 -//.word 0x45765497 -//.word 0xaa8f7822 -//.word 0x6586519a -//.word 0x32c2fdb7 -//.word 0xbacf2787 -//.word 0xa1542b06 -//.word 0xc5457aee -//.word 0xc55941d0 -//.word 0xc1bf4564 -//.word 0x610d111e -//.word 0x19795401 -//.word 0xab4b85b8 -//.word 0xed92c8e3 -//.word 0xcc1615af -//.word 0x918f97a9 -//.word 0x631452d4 -//.word 0x0dd609f8 -//.word 0x020e5f3e -//.word 0x9e343cfa -//.word 0xaf7272c8 -//.word 0x3458a1da -//.word 0x65d15890 -//.word 0xf3567c49 -//.word 0x9061ee7a -//.word 0xb22568fd -//.word 0x947ca8ab -//.word 0x7e21d12c -//.word 0x471f0e0e -//.word 0x18897815 -//.word 0x726c3ad2 -//.word 0x7302f277 -//.word 0x55285bea -//.word 0x37122a18 -//.word 0x203e358c -//.word 0x41a6da40 -//.word 0x7a3a9fb3 -//.word 0x208d163b -//.word 0xfecf049d -//.word 0x99fbc1db -//.word 0xb951e24d -//.word 0x240716f3 -//.word 0xad3c4e0a -//.word 0x6d2d21dd -//.word 0x51ab6ede -//.word 0xd5cd43f5 -//.word 0x0ee2fd18 -//.word 0xeea9b11c -//.word 0xc4c5cbcb -//.word 0x026bf536 -//.word 0x435e3b4d -//.word 0x8c1d6cac -//.word 0xd25ac3b8 -//.word 0xbdafc6eb -//.word 0xac8d6f6c -//.word 0xf9758ae3 -//.word 0x7e6a5e8b -//.word 0x58a68f89 -//.word 0xea8c437c -//.word 0x25de8455 -//.word 0x0730e669 -//.word 0x629c69c4 -//.word 0xdfb8a0c0 -//.word 0x42c513d7 -//.word 0xf029e3b6 -//.word 0xae20ac92 -//.word 0xabaeafbf -//.word 0xc1d8317f -//.word 0xf8131e18 -//.word 0x4cfdf229 -//.word 0xb04bd93d -//.word 0x520215a1 -//.word 0x21eba173 -//.word 0x8d4014fc -//.word 0x8dacc740 -//.word 0xe7733ad2 -//.word 0xacecb4ed -//.word 0x01382ac1 -//.word 0x252e620b -//.word 0xb09559e8 -//.word 0x19968000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00014BF0 -//// expected output -//.word 0x0d61f8f4 -//.word 0x238bb647 -//.word 0xfd02199f -//.word 0x8555a38d -//.word 0x2eb4ac07 -//.word 0xcf948d49 -//.word 0x9eabd9e7 -//.word 0x7c89ca75 -//.word 0x3963e95e -//.word 0x036c6673 -//.word 0xb6c88e01 -//.word 0x0f34c32c -//.word 0x57d6f103 -//.word 0xde1b3229 -//.word 0x1705486b -//.word 0x29f93975 -//// SHA512LongMsgvector_107 -//// vector length -//.word 0x00014F08 -//// input message -//.word 0x8eb0ce96 -//.word 0xcab8bcf4 -//.word 0x71bdff7a -//.word 0x31c5508c -//.word 0x306cacc2 -//.word 0xf23756e0 -//.word 0x7d261f09 -//.word 0xbb88e52f -//.word 0x1f135ace -//.word 0x8b3406da -//.word 0x72a490f6 -//.word 0x3a3c39e6 -//.word 0xe40aa947 -//.word 0xeea4ee7d -//.word 0x78bcc2ee -//.word 0xa7f50c6e -//.word 0x47f5aaf9 -//.word 0xb4bc6ea8 -//.word 0xfa3466de -//.word 0x3b0961c2 -//.word 0x51baaef3 -//.word 0xb5f12777 -//.word 0x9f106ff4 -//.word 0x6f0c7722 -//.word 0x4c7e4780 -//.word 0x0bf7fb46 -//.word 0x52940b9b -//.word 0xfdd3d009 -//.word 0xc0a5442e -//.word 0x0ec50ab4 -//.word 0x3a47ae83 -//.word 0xdd742d34 -//.word 0x77d5b8c9 -//.word 0x598eb59c -//.word 0xc2ee0796 -//.word 0x48438fa1 -//.word 0x79f3f260 -//.word 0xc3c89d1d -//.word 0x918c0703 -//.word 0xb7d6368d -//.word 0x1023853e -//.word 0x6528a493 -//.word 0x9167e036 -//.word 0xe301a574 -//.word 0xc4cb41f1 -//.word 0x9aa3ea9a -//.word 0xec0503dc -//.word 0xc6d99b13 -//.word 0x5f8f3746 -//.word 0xf96ed111 -//.word 0x092920e2 -//.word 0x98b41a69 -//.word 0xe955b849 -//.word 0x5cfef914 -//.word 0x92da2976 -//.word 0xd22663b0 -//.word 0xab425548 -//.word 0xdb0843ff -//.word 0x705c4e04 -//.word 0x2d04f767 -//.word 0x2fbbdfd0 -//.word 0xd180d071 -//.word 0xcc340139 -//.word 0xa364964b -//.word 0x3e6467ae -//.word 0xd49d0246 -//.word 0x0f27f303 -//.word 0x6b9b4358 -//.word 0xe0223eef -//.word 0xc0d2799b -//.word 0xe23b148e -//.word 0x003c3dcc -//.word 0x5e1cf5df -//.word 0xacd517cc -//.word 0x2eb39647 -//.word 0x1a1e0623 -//.word 0x42b45e0c -//.word 0xf29cfc78 -//.word 0x1c16e9db -//.word 0xb2565f1a -//.word 0x54928843 -//.word 0x2b5a897b -//.word 0x1528bf38 -//.word 0x023848b0 -//.word 0x9e99c691 -//.word 0x30855ff2 -//.word 0xc1ee0989 -//.word 0x8259041f -//.word 0x68efa742 -//.word 0x19d1603a -//.word 0x0badf73e -//.word 0xea8f12e7 -//.word 0x3bf9fee4 -//.word 0x4035acf0 -//.word 0x1beafa01 -//.word 0x35ee34c2 -//.word 0xe15bdb44 -//.word 0x3de5a5f0 -//.word 0x596ac4c1 -//.word 0x9ccb6bb0 -//.word 0x63fb8f6f -//.word 0xea55eb59 -//.word 0x703346aa -//.word 0x96bcf8eb -//.word 0x09fdabb1 -//.word 0x603c5f87 -//.word 0x4888b129 -//.word 0xde955cf3 -//.word 0x5cc70098 -//.word 0xf88d2217 -//.word 0x09f074eb -//.word 0x6c6c5782 -//.word 0x26fe9ff1 -//.word 0x4a7e96e6 -//.word 0x1e2f43de -//.word 0x7995ec98 -//.word 0x6f86d9c9 -//.word 0x30845b11 -//.word 0x2e4a0d2e -//.word 0x7ea55a70 -//.word 0x81853f6c -//.word 0xc35452f5 -//.word 0x23860448 -//.word 0x35722387 -//.word 0xe460a369 -//.word 0x5ce39d2f -//.word 0x276998da -//.word 0x9510089b -//.word 0x62bb148b -//.word 0x93669c9c -//.word 0xa1b67bcf -//.word 0xd9d409a8 -//.word 0x037ce4e0 -//.word 0x4251f159 -//.word 0x3b749d57 -//.word 0x795469ec -//.word 0x10c8a5b4 -//.word 0x815b7bc3 -//.word 0xdee630dc -//.word 0x2f65a7e3 -//.word 0x13032795 -//.word 0xab775d77 -//.word 0xb393a50c -//.word 0xf21a854b -//.word 0xd5d37a50 -//.word 0x57dbf852 -//.word 0x233facd5 -//.word 0xfdca0421 -//.word 0x5e1cf1f2 -//.word 0x5efcec71 -//.word 0xd7f03763 -//.word 0xc80a65a1 -//.word 0xf7041cc8 -//.word 0xdb901a31 -//.word 0xb8e97624 -//.word 0x0cae2848 -//.word 0x2af0cc5e -//.word 0x258aa32f -//.word 0xefb0dbc3 -//.word 0xc2cb10d4 -//.word 0xbf841282 -//.word 0xd61fe949 -//.word 0xe50b162f -//.word 0x24b71c42 -//.word 0xc0a73f41 -//.word 0xc6c68c9a -//.word 0x43fe1994 -//.word 0xaa068ece -//.word 0x757be4e8 -//.word 0x0f336d80 -//.word 0xf2ce1560 -//.word 0x0c8de7f5 -//.word 0x6868d304 -//.word 0x0a5aae98 -//.word 0x1b007a3f -//.word 0x4662e875 -//.word 0x61111b61 -//.word 0x5072afbf -//.word 0x2659fa1e -//.word 0x8ed9914b -//.word 0x6a5b0e0d -//.word 0xb9ee1112 -//.word 0xbede852a -//.word 0x5f8825b3 -//.word 0xcb6c3e54 -//.word 0x5f84b6ef -//.word 0xcbd54dd0 -//.word 0x7043232b -//.word 0x0da97bc5 -//.word 0x9b29bef1 -//.word 0x75c1c3be -//.word 0xbc1f4d6f -//.word 0xfab7d52b -//.word 0x05128af6 -//.word 0x276997e0 -//.word 0x7b72a47c -//.word 0x9a7a9f94 -//.word 0x77b4bc1b -//.word 0x88d1ba63 -//.word 0x27d06991 -//.word 0x3718694d -//.word 0x0ac434be -//.word 0x823e5eb5 -//.word 0x770f1c28 -//.word 0x59f504e3 -//.word 0x1736137a -//.word 0x3f35f482 -//.word 0x66437f00 -//.word 0xcab78122 -//.word 0x3641bb2d -//.word 0x267b2db7 -//.word 0x2cc19416 -//.word 0x92433118 -//.word 0x4158ccf5 -//.word 0xe116f981 -//.word 0x421f9aa6 -//.word 0xfbbda512 -//.word 0x5132272d -//.word 0x5a49894e -//.word 0x6231122e -//.word 0x8d8bae9d -//.word 0xbec2ee73 -//.word 0xb89b4fca -//.word 0x830dbf6a -//.word 0x12525d85 -//.word 0x223e81a5 -//.word 0x65d0fce2 -//.word 0xe007a158 -//.word 0x91f604d8 -//.word 0x561b81de -//.word 0x0aed80c3 -//.word 0xf1b4f834 -//.word 0x569d32e3 -//.word 0x720ed07c -//.word 0x90370ddb -//.word 0x6fea467c -//.word 0xe8acba33 -//.word 0xd00c8e1d -//.word 0x203314d6 -//.word 0x53bd4cec -//.word 0x10c7ab94 -//.word 0x09491c9c -//.word 0x23a745a1 -//.word 0xd7820b82 -//.word 0xd8d45814 -//.word 0xf63c1b18 -//.word 0x4296916a -//.word 0x73cfc47b -//.word 0x88f75100 -//.word 0xaf986dec -//.word 0x66472a9c -//.word 0xe078f752 -//.word 0xaa9766e5 -//.word 0x8e5433b7 -//.word 0xb83e81e6 -//.word 0x179366c7 -//.word 0x0656aa90 -//.word 0x2ca3cc54 -//.word 0xa0404635 -//.word 0x517412d5 -//.word 0xa61c6d0d -//.word 0x61fbdbe2 -//.word 0xc9526bb4 -//.word 0x08b03cb9 -//.word 0xd20c40aa -//.word 0x471140bc -//.word 0x1bb921d2 -//.word 0xf41d65f1 -//.word 0x138cf5f4 -//.word 0x37da1d81 -//.word 0xbefad83b -//.word 0x0ecf4e39 -//.word 0x33409bb8 -//.word 0xc98bd20c -//.word 0x1ddb41dd -//.word 0x8f1cf78f -//.word 0x3b0e8402 -//.word 0xd898007c -//.word 0xdf604fe3 -//.word 0xf098a230 -//.word 0x731b4120 -//.word 0x7bb8892c -//.word 0xefcd30bc -//.word 0xeb18d198 -//.word 0x64cba49f -//.word 0x0bde8cbb -//.word 0x74a95814 -//.word 0x78b24284 -//.word 0xd8c4bc4c -//.word 0x22416d05 -//.word 0xd9b876d9 -//.word 0xd0baf9f2 -//.word 0xd7eadc33 -//.word 0x9954ca26 -//.word 0xc5007b36 -//.word 0x6cc6361f -//.word 0xab6394a2 -//.word 0x89cd867d -//.word 0x22c4999a -//.word 0x06aa7987 -//.word 0xdc94b426 -//.word 0x4ba1c1a6 -//.word 0x1a8b41b1 -//.word 0x957b84e7 -//.word 0x33224f8c -//.word 0x7705dd7d -//.word 0x14182369 -//.word 0x548f593d -//.word 0xbaf1b5e0 -//.word 0xe76e7a21 -//.word 0xba7231ee -//.word 0xbb7a36c6 -//.word 0xba277770 -//.word 0xb39079ee -//.word 0xf5dd9cad -//.word 0x83129ffe -//.word 0xbb2866ca -//.word 0x3562fb80 -//.word 0xeeded453 -//.word 0xa66b54a3 -//.word 0x869a93b8 -//.word 0x061862b6 -//.word 0x0e3a8acd -//.word 0x5bda55b1 -//.word 0x2562504a -//.word 0xff264eac -//.word 0xfef7b049 -//.word 0x1df4e465 -//.word 0xe0a42ccb -//.word 0x3842a1bf -//.word 0xa7587733 -//.word 0xa490823e -//.word 0x41c6f9c9 -//.word 0x0b617b8c -//.word 0x32e44f39 -//.word 0xeac0f0f6 -//.word 0x106dc911 -//.word 0x11b83def -//.word 0x085fea46 -//.word 0x26db2f8c -//.word 0x577debb0 -//.word 0x22bc8807 -//.word 0xd1ce3989 -//.word 0xd3757f3d -//.word 0x5e1cf2f2 -//.word 0x59223e30 -//.word 0x78766c6e -//.word 0xa9646385 -//.word 0xafaeae65 -//.word 0x0cdf7f07 -//.word 0x25dcf4a3 -//.word 0xa1bc9a22 -//.word 0x12d930d6 -//.word 0xd727ad69 -//.word 0x41c58413 -//.word 0xf4d22610 -//.word 0x9082c852 -//.word 0x91716773 -//.word 0x74370aed -//.word 0x1c3c488d -//.word 0x73ce0925 -//.word 0x54709182 -//.word 0xa975ba9d -//.word 0xd0ce8015 -//.word 0x4421c3dd -//.word 0x791b4932 -//.word 0x070603d1 -//.word 0x0b9e9166 -//.word 0xca200747 -//.word 0x98a5f262 -//.word 0xf9ae9675 -//.word 0x05007a7d -//.word 0x11b22770 -//.word 0x8b842c2e -//.word 0x267265b5 -//.word 0x37897d95 -//.word 0x5ffab2a5 -//.word 0x6b6dd8f3 -//.word 0x7897a101 -//.word 0x5b0f1b2e -//.word 0x405d7a72 -//.word 0x9054184e -//.word 0x19a3ba03 -//.word 0x69a61503 -//.word 0x7a8291a5 -//.word 0x95704c1c -//.word 0x705962aa -//.word 0x9aa46c11 -//.word 0x184c464b -//.word 0x5135167a -//.word 0x27c08922 -//.word 0x679d6096 -//.word 0x63e02cb0 -//.word 0xdd5755c5 -//.word 0x271b61d8 -//.word 0x8966730e -//.word 0xe3a41262 -//.word 0x93cd2c9a -//.word 0x99f15b7a -//.word 0xf9156637 -//.word 0x613d0b2f -//.word 0x0ccafcd6 -//.word 0xe60627f4 -//.word 0xf1fe3a0e -//.word 0xe7906721 -//.word 0x21c46597 -//.word 0xb760b773 -//.word 0xe9b630cf -//.word 0xbec1b788 -//.word 0xea704838 -//.word 0xf5423b64 -//.word 0x9a13c9f7 -//.word 0x6e36ccef -//.word 0xc2c3c657 -//.word 0xc9322575 -//.word 0xfe29c544 -//.word 0xc093b725 -//.word 0x3ff241d1 -//.word 0x9cf62592 -//.word 0x4c4e26b3 -//.word 0xbebec934 -//.word 0x3d7259c3 -//.word 0x17922de8 -//.word 0xff162e80 -//.word 0xb0dc936c -//.word 0xd3f7ef8a -//.word 0x234b6ee4 -//.word 0xcf575b28 -//.word 0x1f51e659 -//.word 0x5b7825c3 -//.word 0xe9a65834 -//.word 0xb5247169 -//.word 0xd6c3d4c7 -//.word 0x6e285b4c -//.word 0xd1689dc4 -//.word 0xead57040 -//.word 0xdb17acc4 -//.word 0xe47e3240 -//.word 0x86962dc1 -//.word 0xe8fc98e9 -//.word 0x7971019d -//.word 0xd72d8cfd -//.word 0xf0753a99 -//.word 0x67706be1 -//.word 0x3937a2de -//.word 0xa02b8920 -//.word 0x378b35f8 -//.word 0x5f46aae7 -//.word 0xe20da255 -//.word 0xd7ad8a86 -//.word 0xc69ccecb -//.word 0x0cd156f5 -//.word 0x80d9510f -//.word 0x5628314d -//.word 0x44adf63f -//.word 0xe4a9b04a -//.word 0x5ac03f59 -//.word 0x36515ed0 -//.word 0x9c03e0c2 -//.word 0xa2a03863 -//.word 0xf9273fc0 -//.word 0xd01c32ad -//.word 0xf523faff -//.word 0x3dcdb1fc -//.word 0x27b26110 -//.word 0xbcc00fc2 -//.word 0xb9d2f8e5 -//.word 0xf0841a13 -//.word 0xec46f657 -//.word 0xd4b0952a -//.word 0x9116c9a1 -//.word 0x335bb5e4 -//.word 0x910a8fe2 -//.word 0x30a2a543 -//.word 0x67329e9e -//.word 0xc02603ed -//.word 0xa061fe3e -//.word 0x2b8c61ab -//.word 0x62ade98b -//.word 0x8efbc5ea -//.word 0xe2f15237 -//.word 0x5ca1293d -//.word 0xec4b5b55 -//.word 0xd82efbd9 -//.word 0x5f9edddb -//.word 0x9d579e17 -//.word 0xae11e427 -//.word 0x1654e7f6 -//.word 0x608e3177 -//.word 0x0663a297 -//.word 0x9144b670 -//.word 0x01430bbf -//.word 0x6f251d98 -//.word 0xf1b95458 -//.word 0xbe6942dc -//.word 0x930f25f0 -//.word 0x550ab40a -//.word 0xf7901839 -//.word 0x9e453858 -//.word 0x030d3987 -//.word 0x191f45dc -//.word 0xf15c8c55 -//.word 0xdade8911 -//.word 0xccd387c0 -//.word 0x078c6359 -//.word 0xf7d1930b -//.word 0x5b786775 -//.word 0xa6368f19 -//.word 0xa5b4de0e -//.word 0x63e54ef6 -//.word 0x4a984330 -//.word 0x8a49144f -//.word 0xbf3dc7ca -//.word 0xcece1cf4 -//.word 0x0f03ce2f -//.word 0xb263155d -//.word 0x5b0b6f98 -//.word 0x10ffa023 -//.word 0x55bef7a0 -//.word 0x9519d483 -//.word 0xc44467c6 -//.word 0x432ebadf -//.word 0x040ef2ef -//.word 0xee3ed23c -//.word 0x834d80e1 -//.word 0xc0508cc4 -//.word 0x44782ec9 -//.word 0xb5eacf45 -//.word 0x60cacbb6 -//.word 0x1f9976b1 -//.word 0x80c25d1b -//.word 0x236fce9c -//.word 0x64a19a51 -//.word 0x3a8019c1 -//.word 0x5ff06f13 -//.word 0xb2640e7e -//.word 0xd9f77c00 -//.word 0x2ab95753 -//.word 0xcc46961d -//.word 0x199e1167 -//.word 0x47304450 -//.word 0x48384f02 -//.word 0xee4b42e6 -//.word 0x53309814 -//.word 0x78f2010e -//.word 0x2c3365ad -//.word 0x30c3255b -//.word 0x9872a483 -//.word 0x74220646 -//.word 0xb0203770 -//.word 0x39b42faa -//.word 0x61f675f1 -//.word 0x85e4e246 -//.word 0xedb2a8a7 -//.word 0xf361933f -//.word 0x68938eda -//.word 0x339e689b -//.word 0x3bdfd8f1 -//.word 0x8851bfc7 -//.word 0xa55daefb -//.word 0x48f4a812 -//.word 0x34dc292a -//.word 0x5f47662f -//.word 0x50aad752 -//.word 0xccccf3b7 -//.word 0xb11e3b6e -//.word 0x224a79a5 -//.word 0xe40e4a1c -//.word 0x084bdad9 -//.word 0xcb59ef1c -//.word 0xba9e2995 -//.word 0x1a5f88d5 -//.word 0x86d52e03 -//.word 0xda8466d0 -//.word 0x50c8e6ac -//.word 0xe9b1513b -//.word 0x0f100002 -//.word 0x78d20267 -//.word 0x4d8d61d8 -//.word 0x8c59a74a -//.word 0xabe1a1e5 -//.word 0x7eba63fd -//.word 0x5af38c45 -//.word 0x7bedcc3f -//.word 0xa36ca3f7 -//.word 0x04ef6bf1 -//.word 0x603d9860 -//.word 0x6f413f98 -//.word 0x8117d5c6 -//.word 0x64673adf -//.word 0x88f2f5d6 -//.word 0x616ac212 -//.word 0x0d874a1f -//.word 0x375731a4 -//.word 0x3bd65595 -//.word 0x8abe55a9 -//.word 0x51a0510f -//.word 0x5534f15d -//.word 0x21eea9c9 -//.word 0x64d13b9b -//.word 0x95887de2 -//.word 0xd8b35c66 -//.word 0x257f21df -//.word 0xa779f364 -//.word 0x62a49d26 -//.word 0x19c8925e -//.word 0x6f0e2e84 -//.word 0x4cca3fc2 -//.word 0x8298c4a8 -//.word 0xb1aaf521 -//.word 0x686083a6 -//.word 0x8c1920b1 -//.word 0xfe4a4275 -//.word 0x78cd24cc -//.word 0xb87b0e71 -//.word 0xe1fcd76f -//.word 0x1edea8d9 -//.word 0x88e502bc -//.word 0x4aa20352 -//.word 0x0247e578 -//.word 0x6bbac762 -//.word 0x3ae8b08e -//.word 0x455cd1f6 -//.word 0xea100a8a -//.word 0xaf83b0dd -//.word 0x260b8e1f -//.word 0x146d294b -//.word 0xd1ab49a1 -//.word 0xf21db457 -//.word 0x26c33d8c -//.word 0x5edafd7d -//.word 0x31ade1fb -//.word 0x7eae651d -//.word 0x53c59e32 -//.word 0x0de87ef9 -//.word 0xc1ec5415 -//.word 0xdb9b92bb -//.word 0x0506d3ae -//.word 0x4b1d1c6d -//.word 0x7c7c62aa -//.word 0xd3884dff -//.word 0xd6bb3cdd -//.word 0x7f3c89c5 -//.word 0x9ab30eba -//.word 0x6e5be8f6 -//.word 0x9f597adc -//.word 0x534cb52e -//.word 0x94259780 -//.word 0xf639f2ec -//.word 0x79946f08 -//.word 0xb090d215 -//.word 0x23a78079 -//.word 0xf3863e70 -//.word 0xbc623bfe -//.word 0xbf8f5128 -//.word 0x414f8863 -//.word 0x2ee8dc4d -//.word 0x02f9409b -//.word 0xe90de252 -//.word 0x2571b13b -//.word 0xb1431d90 -//.word 0x24cc1dfc -//.word 0xd71077c3 -//.word 0x4aa23c3c -//.word 0xc4bd9188 -//.word 0x3a91b57e -//.word 0x72db40e5 -//.word 0x69b8a9e6 -//.word 0xf1bb0bc0 -//.word 0x9e3d29be -//.word 0xe3f4af67 -//.word 0x79c8bbf4 -//.word 0x00e19b07 -//.word 0xe905d999 -//.word 0x93217434 -//.word 0xb4257163 -//.word 0xfb159268 -//.word 0xf45d662c -//.word 0x2b66827c -//.word 0x94660d71 -//.word 0x2a7c8230 -//.word 0xd7fcb1d4 -//.word 0x940807a9 -//.word 0xd160109b -//.word 0x177a3aee -//.word 0xecd6dc2f -//.word 0xf78c766a -//.word 0x64273b9d -//.word 0x8ab5cc6d -//.word 0xcb1f4718 -//.word 0xbcb780ab -//.word 0x86108e75 -//.word 0x8d128abb -//.word 0x4f4d93ad -//.word 0x8e8e1599 -//.word 0xb1b04b5f -//.word 0x68b50325 -//.word 0x8f16a24b -//.word 0x555667a1 -//.word 0x9dddf4d8 -//.word 0xa4040a37 -//.word 0xe46d948f -//.word 0x3995e771 -//.word 0x43ac489e -//.word 0x0ba4aebf -//.word 0xe988ca57 -//.word 0xa50f45f5 -//.word 0xdc7149ae -//.word 0xa57942ca -//.word 0x75dbe6be -//.word 0x40c9735b -//.word 0xe1c13744 -//.word 0xbca956a5 -//.word 0xa21dc822 -//.word 0xf508a10e -//.word 0x0c7195de -//.word 0xd898bbdd -//.word 0xc8429121 -//.word 0xeb5141bd -//.word 0x55972238 -//.word 0xc3ec823e -//.word 0x827ea396 -//.word 0x8c690354 -//.word 0xf588e050 -//.word 0x858afcd6 -//.word 0xa7489e9f -//.word 0x8155d900 -//.word 0x65d71062 -//.word 0x6896baf2 -//.word 0x5053639a -//.word 0xb45bf32f -//.word 0x5e5c33ec -//.word 0xf4768d1f -//.word 0xd8951422 -//.word 0x4cffc48d -//.word 0xda290aaa -//.word 0xf3cf8729 -//.word 0xd6431115 -//.word 0xb306fa07 -//.word 0x1095959a -//.word 0x6d85f71e -//.word 0x23d2fb91 -//.word 0x927589cb -//.word 0x7b3417f8 -//.word 0xabbe6f4b -//.word 0xdaf7b3f1 -//.word 0xd2919f44 -//.word 0xd4dc0f42 -//.word 0x37dfc13d -//.word 0x52a75bd3 -//.word 0x9cdfb021 -//.word 0x12a13f34 -//.word 0xd98cfcc0 -//.word 0x25175415 -//.word 0x59246b4e -//.word 0x70d9a8cc -//.word 0x9bab73e3 -//.word 0x2bbb3dd2 -//.word 0xb266c1f9 -//.word 0x65178a46 -//.word 0xc560b6f1 -//.word 0x7f4af969 -//.word 0x90e9e58e -//.word 0xac336820 -//.word 0xe1129677 -//.word 0x78b7a875 -//.word 0x1c3245ba -//.word 0x3e3f0116 -//.word 0xb7632444 -//.word 0xaf38acd5 -//.word 0xbe05956a -//.word 0x52925726 -//.word 0x513bb163 -//.word 0xff42a5a4 -//.word 0x216ac4cb -//.word 0x63c1ab8d -//.word 0xf7bdce22 -//.word 0x7f8a7441 -//.word 0x2da3034b -//.word 0x28a07ec7 -//.word 0x324e4c0e -//.word 0x89053b47 -//.word 0x0a36c496 -//.word 0x9c449191 -//.word 0xcc953cf4 -//.word 0xb5e85a95 -//.word 0x23e9b89a -//.word 0xf802e4e9 -//.word 0xce75efe0 -//.word 0xdda87247 -//.word 0x1fbfcf82 -//.word 0xb370b90b -//.word 0x8013f720 -//.word 0x1af964b9 -//.word 0xe9ff3bbd -//.word 0x88639175 -//.word 0x6bd62341 -//.word 0xc5d2528a -//.word 0xa82d6cf7 -//.word 0x6eef2de4 -//.word 0x59618610 -//.word 0x76669c95 -//.word 0xc70e141e -//.word 0xa0698e54 -//.word 0x52996f99 -//.word 0x072be4f9 -//.word 0xeda8245d -//.word 0x9766f502 -//.word 0xa0a4712a -//.word 0x91d60a12 -//.word 0x043ecc23 -//.word 0x0abce26c -//.word 0xcbe75c50 -//.word 0x6c5c2f7c -//.word 0x36577d1d -//.word 0xf480174f -//.word 0x9c0741d8 -//.word 0x32f2b516 -//.word 0xeab6ea36 -//.word 0x8d0595a7 -//.word 0x1de871ce -//.word 0xbc0d3bfc -//.word 0xca62019d -//.word 0x4ee39db2 -//.word 0x97af7d81 -//.word 0x2362a58a -//.word 0xbf9ff6be -//.word 0xf0ecb0ec -//.word 0x92c3367c -//.word 0xbfe5115f -//.word 0xf2f23846 -//.word 0x6c378e12 -//.word 0xd7c7ad8c -//.word 0x2acde257 -//.word 0xcc207823 -//.word 0xfc183a22 -//.word 0x70a133c0 -//.word 0x3c8db88f -//.word 0xf62fa980 -//.word 0x1825f359 -//.word 0xa5755963 -//.word 0x10dc7563 -//.word 0x5962f9cc -//.word 0x79323b33 -//.word 0x00a9f103 -//.word 0xfdad3872 -//.word 0x1e40dcb4 -//.word 0x1854d36e -//.word 0x49e10a6d -//.word 0x9c366598 -//.word 0xae8d0123 -//.word 0x2fe1bc06 -//.word 0x8a04f7ae -//.word 0xc8ec9af2 -//.word 0xb14d5948 -//.word 0x356e3639 -//.word 0x0b354712 -//.word 0x9883badd -//.word 0x12c8168f -//.word 0xe5cec383 -//.word 0x56d9cd27 -//.word 0x66f2e5f6 -//.word 0xf980a9a6 -//.word 0x371825a2 -//.word 0x339699ba -//.word 0xca6d7c19 -//.word 0xcf3bc278 -//.word 0x65a15b92 -//.word 0xab51fcd8 -//.word 0x9f682165 -//.word 0x3cff5334 -//.word 0xe6fca691 -//.word 0x082e87cd -//.word 0xfc9ab436 -//.word 0x2b0f8c46 -//.word 0x7501891b -//.word 0xd3940b27 -//.word 0x3af65729 -//.word 0xc3f2df5c -//.word 0x0ac2c4ee -//.word 0xd32599b3 -//.word 0xf4b26a1b -//.word 0x6f6cfc62 -//.word 0xde965706 -//.word 0x14c9827e -//.word 0x01438e29 -//.word 0xd682d585 -//.word 0x6a1284a1 -//.word 0xdca357d5 -//.word 0x7b5ea4b0 -//.word 0xe2799b32 -//.word 0x6709cc3b -//.word 0xb718ea44 -//.word 0xbaf8ce4d -//.word 0xbdd6be16 -//.word 0xcf92f092 -//.word 0x6bcf4a99 -//.word 0x58466cdd -//.word 0xce5ff01f -//.word 0xda02f0a3 -//.word 0x03aac9e1 -//.word 0x2ebc1f7d -//.word 0xbf182279 -//.word 0x01ed0faa -//.word 0xc8d1f968 -//.word 0x5511c98a -//.word 0x79458492 -//.word 0xfe28cc24 -//.word 0x42a7aabd -//.word 0x25388aa1 -//.word 0x256d8715 -//.word 0xc8c9e9cf -//.word 0x3bd2ecab -//.word 0x3867c49f -//.word 0x2c54ddf1 -//.word 0x9a2467a7 -//.word 0xba371240 -//.word 0x671416a1 -//.word 0x38ff7752 -//.word 0xeccf87ea -//.word 0x0bfaacc8 -//.word 0xcaf26304 -//.word 0x2fb485a5 -//.word 0x779dca15 -//.word 0xb5808bd2 -//.word 0xbbf7cc65 -//.word 0x3df67998 -//.word 0x34a6f0e4 -//.word 0x8170c029 -//.word 0xd357b0a2 -//.word 0xca8c0417 -//.word 0x5d3cfb54 -//.word 0x79ad9cdb -//.word 0xea89b2d6 -//.word 0x7f7a164f -//.word 0x69f62ca3 -//.word 0xe55db034 -//.word 0x1b41b35f -//.word 0x4504e0ae -//.word 0x13a9044e -//.word 0x4ee4cec3 -//.word 0xbd73d3da -//.word 0x45b1d4df -//.word 0x53694411 -//.word 0x7fe80553 -//.word 0x69567324 -//.word 0xe746a3d1 -//.word 0x638bece9 -//.word 0x7e4da7f2 -//.word 0xf95d345a -//.word 0xd6c63eb1 -//.word 0xbaa53f15 -//.word 0x963a46ed -//.word 0x863ef8da -//.word 0xfa77d4ea -//.word 0x138bbc0f -//.word 0x5012b1d0 -//.word 0x69eedf3f -//.word 0x7bdfd92b -//.word 0x66522596 -//.word 0x737afb69 -//.word 0x3ba24a67 -//.word 0xc4c2fc60 -//.word 0xec507ba7 -//.word 0x0b5874c6 -//.word 0xd4cfdb6f -//.word 0x7c252fb6 -//.word 0x1f19ff7e -//.word 0x5fd1ad31 -//.word 0x4e2a72b5 -//.word 0x8e4da29b -//.word 0xb6833199 -//.word 0xf84a773a -//.word 0x01a830d4 -//.word 0x21bfc7bb -//.word 0xaca2d4b4 -//.word 0xa067e3ac -//.word 0x877d77aa -//.word 0x9f404e03 -//.word 0x39cbe7cd -//.word 0x5f0d4295 -//.word 0xb920e755 -//.word 0xb2d529a0 -//.word 0xd694ac20 -//.word 0x7e632542 -//.word 0xb0446130 -//.word 0x41c48900 -//.word 0x3cd1a42a -//.word 0x88cc5d40 -//.word 0xc4df06d9 -//.word 0x7691decf -//.word 0x65978faa -//.word 0x43edfb5b -//.word 0x8f26382e -//.word 0xba01d9fa -//.word 0x893c709a -//.word 0xbaad51a1 -//.word 0xea8e984a -//.word 0xb6196dae -//.word 0x2155863a -//.word 0x352fee5f -//.word 0xeecc058b -//.word 0x531ec959 -//.word 0xe6b55305 -//.word 0x3ed8a422 -//.word 0xf3d5a28f -//.word 0xba955ea7 -//.word 0xd17398b8 -//.word 0x9e4e85b6 -//.word 0x93ddd031 -//.word 0x5443de85 -//.word 0x1ce45651 -//.word 0x5d76e12a -//.word 0xa65b2e90 -//.word 0xca2e3a20 -//.word 0x3f9cce0c -//.word 0xc47549c9 -//.word 0x46029f07 -//.word 0x059aa2e6 -//.word 0xf3708067 -//.word 0x5caf8d20 -//.word 0xccc94335 -//.word 0x2e0b8783 -//.word 0x31762e1e -//.word 0xf0cac0fe -//.word 0xd1e37cf5 -//.word 0xad489ce4 -//.word 0x3202da2f -//.word 0x86aa326e -//.word 0x2dc6ea66 -//.word 0x2d56d037 -//.word 0x70a9c3d6 -//.word 0x697574be -//.word 0xfb276ee3 -//.word 0x967854e8 -//.word 0xa3416a91 -//.word 0x2290577b -//.word 0x91fb2a0b -//.word 0x10349aa4 -//.word 0xc4de921d -//.word 0x799fed72 -//.word 0x8b777eb9 -//.word 0x06505358 -//.word 0x0cd63a76 -//.word 0x778885af -//.word 0xc00f0b0c -//.word 0x20cf6f32 -//.word 0xf4bda5d9 -//.word 0x6670b180 -//.word 0x4a7ab25f -//.word 0x46f8209e -//.word 0x366852c4 -//.word 0xcebb4372 -//.word 0x81ab9551 -//.word 0xa24fd649 -//.word 0xcaed03f4 -//.word 0x790f4a52 -//.word 0x00d914be -//.word 0x9e994320 -//.word 0xe9a0b865 -//.word 0x6f51192c -//.word 0x9e77d1c2 -//.word 0xe1dc5851 -//.word 0x0c17b454 -//.word 0xfaa5404e -//.word 0x743bacbc -//.word 0x555b4548 -//.word 0xec26763f -//.word 0xa2718f45 -//.word 0xdd1ac648 -//.word 0x249c7cb2 -//.word 0x83e2c1e3 -//.word 0x315919de -//.word 0x70498042 -//.word 0xb565ad7d -//.word 0x09a1943c -//.word 0xaf432e25 -//.word 0x073d7cc9 -//.word 0xb2bacad4 -//.word 0xf7f73187 -//.word 0x65545f69 -//.word 0xbaab9b39 -//.word 0x04e00326 -//.word 0x06b91843 -//.word 0xddf07d35 -//.word 0xe487fc2e -//.word 0xd45cca20 -//.word 0x30fd0c2a -//.word 0xe0bd9957 -//.word 0x1b080287 -//.word 0x8bf3d0ad -//.word 0xac170c3b -//.word 0x76a005db -//.word 0x3ba14d60 -//.word 0xd2ab05fc -//.word 0xf59d5ab3 -//.word 0xe8bd500f -//.word 0x5b08bf16 -//.word 0x92c79a79 -//.word 0xc363770e -//.word 0xc07a4c80 -//.word 0xd5327746 -//.word 0xf4ce02d1 -//.word 0x0f7f240a -//.word 0xc67c0bfb -//.word 0x4254d8cc -//.word 0x6183ecf2 -//.word 0x134462a3 -//.word 0x04a7dc8d -//.word 0x7be383c7 -//.word 0x82ed4908 -//.word 0x474a7217 -//.word 0xc2215282 -//.word 0x98945893 -//.word 0x3f504b80 -//.word 0x6363d4e2 -//.word 0x894f3d68 -//.word 0xf35c78cd -//.word 0xc3326307 -//.word 0x63a64ac2 -//.word 0x23d5ad0c -//.word 0x246f4452 -//.word 0x7656418b -//.word 0x7d68d5b3 -//.word 0x9998f57b -//.word 0x05445e3f -//.word 0x00c3d738 -//.word 0x2b3db6f3 -//.word 0x33bfa501 -//.word 0xaf8ea6f1 -//.word 0x4cbc557b -//.word 0x27fa6dfe -//.word 0x7aad8e2d -//.word 0x7b443e04 -//.word 0x81c82d02 -//.word 0x69b4bd92 -//.word 0x3808c1ca -//.word 0x01998557 -//.word 0x0aab10b8 -//.word 0x2ac1a5ab -//.word 0x75b490e5 -//.word 0x1c031f06 -//.word 0x8e6aeecc -//.word 0xe3b66787 -//.word 0x7bd78acd -//.word 0xe237ea6e -//.word 0xf74af8aa -//.word 0x4e6784a2 -//.word 0xd2d6810d -//.word 0xaf2a092c -//.word 0x6fd0a100 -//.word 0x62e9bdba -//.word 0x44558773 -//.word 0x1a10dc1d -//.word 0x5dc297ba -//.word 0x5a9113cc -//.word 0xd93aeb0c -//.word 0xfd60045e -//.word 0x6b24ce05 -//.word 0xaef5c613 -//.word 0xdba94024 -//.word 0x70cd634c -//.word 0x823a754e -//.word 0x18e9590f -//.word 0xd209554a -//.word 0xce4e1984 -//.word 0xcb8bfd43 -//.word 0x8f838b7b -//.word 0x87fd3d49 -//.word 0xae1687e3 -//.word 0xafdb18d0 -//.word 0x4e175e54 -//.word 0x046a482f -//.word 0xe99b4f87 -//.word 0xd82fb722 -//.word 0xcd3b12d8 -//.word 0x91760748 -//.word 0x9a9251cb -//.word 0x2ccd0aa6 -//.word 0xc5c32a84 -//.word 0xb8864b23 -//.word 0x18f0af4d -//.word 0xd738830a -//.word 0x2fc46514 -//.word 0x413e258b -//.word 0xfdeac8ea -//.word 0x4137d33a -//.word 0x4594c685 -//.word 0x3684e68e -//.word 0x21f53fbf -//.word 0x13ceea63 -//.word 0x7fc78c15 -//.word 0xdf7d1f78 -//.word 0x9ec6f529 -//.word 0x3641f9f2 -//.word 0x96323941 -//.word 0xc68da1d8 -//.word 0xcd5109c5 -//.word 0xd3177395 -//.word 0x83eb8dc5 -//.word 0xb35a7e79 -//.word 0x47ccde70 -//.word 0x52150638 -//.word 0x7f468b9e -//.word 0xb0c90569 -//.word 0xe4ad1548 -//.word 0x5e3ea608 -//.word 0x04d9720a -//.word 0x05fec8f5 -//.word 0xbea78da8 -//.word 0xdfd88273 -//.word 0xc978c486 -//.word 0x3b5f99a9 -//.word 0x2eb0692e -//.word 0xfd690b24 -//.word 0xc93843ce -//.word 0x1c918854 -//.word 0xccfd0ab7 -//.word 0x23b5f30a -//.word 0x3c6fede0 -//.word 0xb078e501 -//.word 0x73030f61 -//.word 0xf8c12b52 -//.word 0x9cb106f8 -//.word 0x413a43fd -//.word 0x39775b87 -//.word 0x67d2e367 -//.word 0xa0d40e94 -//.word 0x573b72d7 -//.word 0x7a4d0fc7 -//.word 0x976d8df8 -//.word 0x43ecc570 -//.word 0xbc21835a -//.word 0xcdbc8aff -//.word 0xf257d9f1 -//.word 0xbd4e2d89 -//.word 0x78d1c794 -//.word 0x0c376f4a -//.word 0x2295b980 -//.word 0x8790871e -//.word 0xd56fcfd2 -//.word 0x50759f06 -//.word 0x0e6d5e10 -//.word 0x5b8654a9 -//.word 0x5b616da1 -//.word 0xf16939d1 -//.word 0xe0633850 -//.word 0x304555ea -//.word 0xd44cb0cd -//.word 0x8949a086 -//.word 0x013cf92c -//.word 0x41238adb -//.word 0x4814ea64 -//.word 0xf18a7543 -//.word 0x1afd91d2 -//.word 0x06b536bc -//.word 0x00dfadb3 -//.word 0x41e19766 -//.word 0x14eb32ad -//.word 0x38ced807 -//.word 0x8612c847 -//.word 0xd342298a -//.word 0x188b4c6c -//.word 0xd186327c -//.word 0xa2514eed -//.word 0x40e48b8e -//.word 0x8fa291fc -//.word 0x082f4415 -//.word 0x5e828eb1 -//.word 0x613b5f8d -//.word 0x2236f288 -//.word 0x58605112 -//.word 0x02c91be1 -//.word 0x4efb85e5 -//.word 0xba8b9f7f -//.word 0x79edd9ee -//.word 0x188cc50a -//.word 0x611a1e34 -//.word 0x80250a8d -//.word 0x64ec9c66 -//.word 0x68709df8 -//.word 0x33ce8c55 -//.word 0xdccbe39f -//.word 0x52b19c78 -//.word 0xfc5af4b9 -//.word 0x9c8a6f67 -//.word 0x79821ce3 -//.word 0xbdd11a60 -//.word 0x1c6e5b9a -//.word 0xb604a8c6 -//.word 0x3f8de5c4 -//.word 0x5d22979c -//.word 0x5111a328 -//.word 0xda31580e -//.word 0x5672b0f2 -//.word 0x2bb8d3e9 -//.word 0x65eadd30 -//.word 0xa145e11e -//.word 0x29f72e57 -//.word 0x60e9d143 -//.word 0x61dc5bbe -//.word 0xe3b7e411 -//.word 0x601f4f21 -//.word 0x7649d0e7 -//.word 0x8d0cac20 -//.word 0xba3b4046 -//.word 0xe33145be -//.word 0x24ad5253 -//.word 0x72e1a2e3 -//.word 0x7ec51858 -//.word 0xdcb180da -//.word 0x652b1844 -//.word 0xdafe4fd4 -//.word 0xca8ccc26 -//.word 0xb564b263 -//.word 0x711723b6 -//.word 0xcd4803ff -//.word 0x7503fecc -//.word 0x1550cc85 -//.word 0xc107b3e6 -//.word 0x95e54eb2 -//.word 0x98e08ea6 -//.word 0xe6b8feac -//.word 0x0fcf4b52 -//.word 0xba3a037a -//.word 0x8e189d53 -//.word 0x5222ba88 -//.word 0x5284aab7 -//.word 0x05ec3224 -//.word 0xeee08caf -//.word 0xc054b003 -//.word 0xc57cd211 -//.word 0x80df2cbd -//.word 0x92adfdd6 -//.word 0xda52d24c -//.word 0xe04b049d -//.word 0x74388291 -//.word 0x9233d027 -//.word 0x896150cf -//.word 0x5cc6c1d9 -//.word 0x695e052e -//.word 0x4869273e -//.word 0xf6069c39 -//.word 0x3303c982 -//.word 0x28f4c661 -//.word 0x4d8262f8 -//.word 0x8a066778 -//.word 0x9d571f94 -//.word 0xbbdf1636 -//.word 0x7af52271 -//.word 0xee67a1b8 -//.word 0x1255024d -//.word 0x6a4687fb -//.word 0xe7754808 -//.word 0x0b6c7c66 -//.word 0x4dd4f429 -//.word 0xbf8ce83e -//.word 0xeef8f659 -//.word 0x0a9c682f -//.word 0x47e9b6e6 -//.word 0x82564bc9 -//.word 0x28b38c41 -//.word 0x54ba1700 -//.word 0x37e84880 -//.word 0xbd8b02ac -//.word 0x6d1bacdd -//.word 0x92cd7907 -//.word 0x9866ed35 -//.word 0xb84d9d32 -//.word 0xd8e53689 -//.word 0xac19c0b0 -//.word 0x22392481 -//.word 0xfd04ece9 -//.word 0xbf064be4 -//.word 0xcd245da9 -//.word 0xce75af21 -//.word 0x5453029e -//.word 0xbeb24cca -//.word 0x5db100de -//.word 0xd56f8f14 -//.word 0xc6202f5e -//.word 0xac60db58 -//.word 0x04c69b7b -//.word 0xb1bd0594 -//.word 0x9d8f0475 -//.word 0xa3c3d8eb -//.word 0xada95ef0 -//.word 0x19339221 -//.word 0x62065272 -//.word 0xfcd16520 -//.word 0x7fdebbe7 -//.word 0x08e7f676 -//.word 0xdc2a2a20 -//.word 0x4fbfe1d4 -//.word 0xe52a634f -//.word 0xb62d3490 -//.word 0x17e0dd8c -//.word 0x7603ef24 -//.word 0x86924654 -//.word 0x9d9a8bad -//.word 0x5a4cfc05 -//.word 0x8a4f706d -//.word 0x4c5b9563 -//.word 0x74047d49 -//.word 0x2ed35916 -//.word 0xe49b844c -//.word 0x610ac32a -//.word 0x367fcb22 -//.word 0x5c1b038d -//.word 0x1c1b8c9e -//.word 0x2c657f94 -//.word 0x1b607534 -//.word 0xee094d77 -//.word 0x0c442980 -//.word 0x576fbad0 -//.word 0x9c3dbebd -//.word 0x2dc2c620 -//.word 0xccca3d4f -//.word 0xcb6fa64b -//.word 0x72eb253a -//.word 0xa1aa4117 -//.word 0xb6a4e8a8 -//.word 0xb1e9b3b0 -//.word 0x977d6c67 -//.word 0x1467ce27 -//.word 0x63058b68 -//.word 0x73a294ee -//.word 0x424a9441 -//.word 0x8dddbd5e -//.word 0xac63c8ac -//.word 0xb89f3731 -//.word 0xeee7de06 -//.word 0x5833a108 -//.word 0xaa737fd1 -//.word 0x6a26d0e7 -//.word 0x5328ca32 -//.word 0xfccb4ab4 -//.word 0xb52ad274 -//.word 0xb1bacdbb -//.word 0x6b221b83 -//.word 0x424dc92d -//.word 0x66bd2072 -//.word 0xf822e29c -//.word 0x6d2bd0f6 -//.word 0x349c6f81 -//.word 0x98a10ce8 -//.word 0xe761feb6 -//.word 0xd4d72bc7 -//.word 0x1addcefc -//.word 0x628a7733 -//.word 0x67be5377 -//.word 0x58fbad73 -//.word 0x7e77b52d -//.word 0x1e6f80f1 -//.word 0xa1bd518a -//.word 0xf2ad17b9 -//.word 0x280d36df -//.word 0x65838afd -//.word 0xfd24a9de -//.word 0xdb416993 -//.word 0x2184a320 -//.word 0x0f3c3675 -//.word 0x26f64ea0 -//.word 0x8d4de640 -//.word 0xb3038b3d -//.word 0x365063b6 -//.word 0x04796f3b -//.word 0xc0a50d3d -//.word 0x67edc1c2 -//.word 0x33b2345d -//.word 0xbf337d5e -//.word 0x6d5ea046 -//.word 0x05e7547e -//.word 0x9e980a48 -//.word 0xc2e82af5 -//.word 0xcdcea059 -//.word 0x96d7977c -//.word 0x51778492 -//.word 0xb49c672d -//.word 0x59894eb2 -//.word 0x64e21a09 -//.word 0x65038599 -//.word 0x80966474 -//.word 0xcb652ace -//.word 0xf76caeb4 -//.word 0x33332efb -//.word 0x4d5b9376 -//.word 0x1a76f66c -//.word 0x191c6448 -//.word 0x533bde93 -//.word 0x85aea420 -//.word 0x8111b486 -//.word 0xd2d48dd3 -//.word 0x9f8f387f -//.word 0xd295899f -//.word 0x78cca35b -//.word 0x6bbcbaa2 -//.word 0x2fe51d1d -//.word 0x1b567361 -//.word 0xb97b4468 -//.word 0x6f37bc42 -//.word 0x5e32ac08 -//.word 0x8a75d212 -//.word 0x3b345a69 -//.word 0xa4eaa47f -//.word 0xc3ac481e -//.word 0x88b6589f -//.word 0x394be55c -//.word 0x15bcc468 -//.word 0x38c6917d -//.word 0xbe20f535 -//.word 0x2b55257d -//.word 0x0bd0ab47 -//.word 0xd5356980 -//.word 0x15f8db42 -//.word 0xca289c4a -//.word 0x0d8b2cac -//.word 0xf4f0f0c5 -//.word 0xb6c17a72 -//.word 0x10d80b7f -//.word 0xe7935663 -//.word 0x2e2b872a -//.word 0x0a4184b2 -//.word 0x34ba731a -//.word 0xa0cd7c78 -//.word 0x5c5ad0ca -//.word 0xba7eea30 -//.word 0xb1641558 -//.word 0x815e2e39 -//.word 0x9634ab04 -//.word 0xafbcdc57 -//.word 0x3faa71b4 -//.word 0x13aa3d33 -//.word 0x36ac3973 -//.word 0x127fccd6 -//.word 0xd7a249ee -//.word 0x2157ba32 -//.word 0xd5f8dcf6 -//.word 0x4b8e6a9a -//.word 0xb3a09e01 -//.word 0xb149f644 -//.word 0x4b8d34a8 -//.word 0x05eda8ce -//.word 0x4a39b12a -//.word 0x0ea682b6 -//.word 0xb22122e8 -//.word 0x28e2b6e1 -//.word 0x574303e7 -//.word 0xc1d32f15 -//.word 0x63a6c751 -//.word 0xdcf0077f -//.word 0xd2d255f4 -//.word 0x92740e2e -//.word 0xf65485c2 -//.word 0x8cde4995 -//.word 0xf43ca74f -//.word 0x8a6f700d -//.word 0x469ffd57 -//.word 0xe0af6f51 -//.word 0x37153b35 -//.word 0xf3e9e700 -//.word 0x693b0e6c -//.word 0xc0aaaa1f -//.word 0x52329322 -//.word 0x55464294 -//.word 0xbb1fdba0 -//.word 0x56536bac -//.word 0x40a96dd3 -//.word 0x7a2c9496 -//.word 0xd37ec4ce -//.word 0x0c6f61e5 -//.word 0x39cecd46 -//.word 0x6a802c12 -//.word 0x8bce6b15 -//.word 0x890380f8 -//.word 0xb737f3b8 -//.word 0x6f669d57 -//.word 0xfcc5b0d1 -//.word 0xb755f751 -//.word 0x71b85fa5 -//.word 0x1144b7ef -//.word 0x7e56b49e -//.word 0xc0e8389d -//.word 0x6266d3ca -//.word 0x1abe8baa -//.word 0xacb7d85b -//.word 0x0b83f3ca -//.word 0xc1975026 -//.word 0x92ba6994 -//.word 0x5c5cbe24 -//.word 0x422a1a03 -//.word 0x09df17f3 -//.word 0xc25de4f9 -//.word 0xaafc4655 -//.word 0x4e22ddb7 -//.word 0xf314a9b0 -//.word 0x340bcd67 -//.word 0xed8b928d -//.word 0x58f0ae93 -//.word 0x764ac71a -//.word 0xb16a33ab -//.word 0xbf3d02a8 -//.word 0xc9593e82 -//.word 0xcdd6712d -//.word 0x415f68d1 -//.word 0xf98837c3 -//.word 0x4a627db3 -//.word 0x704ee927 -//.word 0x2d0efd28 -//.word 0xb322123a -//.word 0xc4519d92 -//.word 0x1886b084 -//.word 0xffddc43b -//.word 0x47feb5ac -//.word 0x60aa0ecc -//.word 0xbe938701 -//.word 0x7f71ccd7 -//.word 0x4e5280f5 -//.word 0x8731824f -//.word 0x9bcb6f9d -//.word 0xb7ae680b -//.word 0xa0931532 -//.word 0xe2ede947 -//.word 0x29c2a892 -//.word 0xefba2722 -//.word 0x577654c0 -//.word 0x59227521 -//.word 0x204eb560 -//.word 0xb0f9dcab -//.word 0xccef5e3c -//.word 0x1756978a -//.word 0x798355c1 -//.word 0xc4129770 -//.word 0x98359482 -//.word 0x844cff70 -//.word 0x6db68ab5 -//.word 0x34e7a981 -//.word 0x93bb98b1 -//.word 0x480a9fff -//.word 0x767d9576 -//.word 0x48a0a32a -//.word 0xd7384a25 -//.word 0x4ed6a7a4 -//.word 0x4cacf684 -//.word 0x89a056f7 -//.word 0xbd9fcb7b -//.word 0xbd34890d -//.word 0xe7597099 -//.word 0xc18dd3b6 -//.word 0xdd267d90 -//.word 0x00e9f625 -//.word 0x82d802b5 -//.word 0xf84b6b73 -//.word 0x11420081 -//.word 0xbefade1b -//.word 0x96beee13 -//.word 0x7800af7d -//.word 0x72a836ab -//.word 0xe1ac735c -//.word 0xdae1b530 -//.word 0xc911705f -//.word 0x584d3fab -//.word 0x93842593 -//.word 0x495518ca -//.word 0xb522c0e7 -//.word 0x5d667c5e -//.word 0x3b48a6af -//.word 0x1b7018dd -//.word 0x4419ee22 -//.word 0x5a678ee1 -//.word 0x83fbe6dc -//.word 0xc9c6f5a7 -//.word 0xc01a8d5d -//.word 0x68075791 -//.word 0x54e41787 -//.word 0x0c2c31a4 -//.word 0xb18c6d24 -//.word 0xdf39f70b -//.word 0xd787aa5e -//.word 0xdeb88d92 -//.word 0xe0119e45 -//.word 0x5934cf2c -//.word 0x76a94f4d -//.word 0x77be0a6e -//.word 0x579173cd -//.word 0xaf6b8111 -//.word 0xd84ff781 -//.word 0x4fd3e974 -//.word 0x5e2f7c08 -//.word 0xf994ed17 -//.word 0xe7bfd567 -//.word 0x22cdab21 -//.word 0x7f518a85 -//.word 0x91a434db -//.word 0xcb7c58ad -//.word 0xe6c01033 -//.word 0x829bae0f -//.word 0x10d0b83b -//.word 0xef4d313f -//.word 0xd5021aa7 -//.word 0x71f339b4 -//.word 0x4f8c1952 -//.word 0xfb35524a -//.word 0x69270ab9 -//.word 0x947ebcc1 -//.word 0x668f397e -//.word 0xd87bec3b -//.word 0x5a0561e6 -//.word 0x75a009c2 -//.word 0xafcc375c -//.word 0xafa36fc0 -//.word 0xa1afe0ec -//.word 0xdcff2f85 -//.word 0xc27a76c9 -//.word 0xe8738dc5 -//.word 0x787d88c8 -//.word 0xd3808017 -//.word 0x7a0c97e2 -//.word 0x2eee3677 -//.word 0x560199b6 -//.word 0xa2478ec5 -//.word 0xee387905 -//.word 0x695a9c44 -//.word 0xf6129534 -//.word 0xd2ba281b -//.word 0x77f33fcd -//.word 0xc13d2fd8 -//.word 0x50c53dfe -//.word 0x2d7d61e8 -//.word 0xb0724a18 -//.word 0xa15ba120 -//.word 0x9d6d9211 -//.word 0xbb778937 -//.word 0x702a3903 -//.word 0xb0b8e349 -//.word 0x56a2d5ac -//.word 0xc6ca3156 -//.word 0xd1d0efec -//.word 0xd99b25c0 -//.word 0x35368649 -//.word 0xd6de29d1 -//.word 0x2b598d6e -//.word 0x4389d933 -//.word 0x324068a7 -//.word 0xb5568476 -//.word 0x19f97267 -//.word 0x5845b08e -//.word 0x86147ac3 -//.word 0x6b189253 -//.word 0x722741f5 -//.word 0xc2d599ff -//.word 0xaa48fed9 -//.word 0x4248e5b2 -//.word 0x4f96da73 -//.word 0x687fc8f1 -//.word 0x57b07567 -//.word 0xc24c4c23 -//.word 0x0b3c5f7f -//.word 0x74c7ac13 -//.word 0x87629f29 -//.word 0xb5c9d971 -//.word 0x3d4e30f7 -//.word 0x4f71f751 -//.word 0x71b27f1d -//.word 0x23a3ddab -//.word 0xbe41eef6 -//.word 0xa28499d9 -//.word 0x9035547f -//.word 0x5500ea1c -//.word 0xa9ca7bda -//.word 0x5645c417 -//.word 0x9dc1a0cd -//.word 0xd545cf51 -//.word 0x55def741 -//.word 0x9437e8b7 -//.word 0x8f6a24c3 -//.word 0x6b169f19 -//.word 0x5cb2c306 -//.word 0xc520b7a9 -//.word 0xa185e15f -//.word 0x2159aa7f -//.word 0x96ba8148 -//.word 0x92062217 -//.word 0x4aa818dd -//.word 0x3f3280d1 -//.word 0x1ead1162 -//.word 0xe42c5970 -//.word 0x45a849bb -//.word 0x4f07f49c -//.word 0x4b7e94f3 -//.word 0xe419ce60 -//.word 0x8b9837b6 -//.word 0x197d16ac -//.word 0xb6636cd6 -//.word 0xfa9131d4 -//.word 0x53cfe1ca -//.word 0xa7793710 -//.word 0x3ad1382a -//.word 0xd19974fa -//.word 0x18e28934 -//.word 0x411fe813 -//.word 0xee7ddc4a -//.word 0x5177c83e -//.word 0x91a4b072 -//.word 0x70d4fa42 -//.word 0x2c5c76d5 -//.word 0xa2ae9d4d -//.word 0xb92d1640 -//.word 0xfe3f7f6c -//.word 0x8ca369a6 -//.word 0x2f05a414 -//.word 0xc9cfbe9c -//.word 0xf443c69c -//.word 0xe8c755dc -//.word 0xa07fd0c1 -//.word 0x3821e7c3 -//.word 0x9a056120 -//.word 0x597c1cd2 -//.word 0xdd634fbf -//.word 0xc1f81331 -//.word 0x79ec2285 -//.word 0x38b9de27 -//.word 0x103595be -//.word 0x5c6703a3 -//.word 0x5b9a1898 -//.word 0x1db1fcb7 -//.word 0xa3ba51a8 -//.word 0x42c6b817 -//.word 0x48f79665 -//.word 0xe2da189e -//.word 0x3df774ac -//.word 0xeca772ca -//.word 0x8a262c3b -//.word 0xa0e9113b -//.word 0xc8323036 -//.word 0x13e1b438 -//.word 0xa98daaa5 -//.word 0xafd30b2a -//.word 0x6eeef6f3 -//.word 0xb1883d1e -//.word 0x6ed02370 -//.word 0xa9cd6447 -//.word 0x96f276d0 -//.word 0xfef20f7a -//.word 0xe3d6e7ab -//.word 0x674cbfb1 -//.word 0xea42a2fb -//.word 0x73b36b89 -//.word 0x51c187a1 -//.word 0x0205fcc4 -//.word 0x5323aae0 -//.word 0xc9a1d1c7 -//.word 0x40f9d4e0 -//.word 0xd2ec3d1c -//.word 0xfa1a002c -//.word 0xf9d004f2 -//.word 0x7921df35 -//.word 0x7138e298 -//.word 0x48ec55cd -//.word 0x3d950306 -//.word 0x061efaac -//.word 0xb75c8c54 -//.word 0xe69e99ef -//.word 0x0d861140 -//.word 0x2f17b494 -//.word 0xbf0e1cad -//.word 0xbd76feff -//.word 0x2277ad1f -//.word 0x7e6fdf78 -//.word 0xe044b440 -//.word 0xf6f8f4aa -//.word 0x757d985d -//.word 0xbbcb8d26 -//.word 0xb431b4e9 -//.word 0xfae82dde -//.word 0x40eed5f9 -//.word 0xf0110daa -//.word 0x134abec7 -//.word 0x724d9ac7 -//.word 0xfa5ea430 -//.word 0x6566f252 -//.word 0x1746b136 -//.word 0x466b6bd2 -//.word 0x5ea3857e -//.word 0xa42f0cac -//.word 0x1919b1d3 -//.word 0xa1c811ac -//.word 0x64d13aa1 -//.word 0x75106b83 -//.word 0xb2f81c7b -//.word 0xeb273e43 -//.word 0x463dc495 -//.word 0xe1ef62e4 -//.word 0xba57954b -//.word 0xcc8ee3c3 -//.word 0x7b7d6498 -//.word 0x32f0811e -//.word 0x4becfca0 -//.word 0x2f433199 -//.word 0xbe659b26 -//.word 0xf17999bc -//.word 0xbdad7216 -//.word 0x3bca9772 -//.word 0x070b29fd -//.word 0xe62fbb8c -//.word 0xabcd598c -//.word 0x5be8c93c -//.word 0x8fc3101a -//.word 0x1af6399a -//.word 0xecc2511e -//.word 0x36a2b623 -//.word 0xcf2292b8 -//.word 0xd7f4a235 -//.word 0x9a413c29 -//.word 0xb63d9094 -//.word 0x81fe2e57 -//.word 0xa58ec8e8 -//.word 0x0d3f394a -//.word 0x053ec73d -//.word 0x9c6ba5b2 -//.word 0x4d68bc81 -//.word 0xdff0ac5e -//.word 0x8a6b0d0a -//.word 0x5bbffac6 -//.word 0xda68d00d -//.word 0xe9cb3382 -//.word 0xefc75228 -//.word 0x368e6cd1 -//.word 0x92b394d9 -//.word 0x4484b113 -//.word 0x1d99c804 -//.word 0xe7ad7e4f -//.word 0x00add871 -//.word 0x480f46ae -//.word 0x3d65e04b -//.word 0x6532effe -//.word 0xedfcafa3 -//.word 0x8fa25330 -//.word 0xb9f04aeb -//.word 0xeb71c1db -//.word 0x6084697c -//.word 0xf2b27ab7 -//.word 0x383ff810 -//.word 0xf1ff3522 -//.word 0xa56b9748 -//.word 0x89f49b9e -//.word 0xa4981a28 -//.word 0x30b2cb50 -//.word 0x43160a96 -//.word 0xae5dd783 -//.word 0x257e22de -//.word 0xa19f4623 -//.word 0x032ad331 -//.word 0xfa229043 -//.word 0x26b8c021 -//.word 0x7e19a598 -//.word 0xef8b4327 -//.word 0x45b866fb -//.word 0x4f49e61e -//.word 0x3eb72aeb -//.word 0x4f5eebc5 -//.word 0xaad43a08 -//.word 0x8978c540 -//.word 0x9c4e5699 -//.word 0xad0a9c97 -//.word 0x806a2e07 -//.word 0xfdc9cd36 -//.word 0x90f2e960 -//.word 0xd132676b -//.word 0x60b1a2d5 -//.word 0x1301b0ec -//.word 0x54f8e63d -//.word 0xc4bb9e4e -//.word 0x251c3790 -//.word 0x76265e8f -//.word 0x5ff58c6c -//.word 0xd0ccd08d -//.word 0xe661cf93 -//.word 0x0e7b098c -//.word 0x6cbf5e6a -//.word 0x7ec7d0b5 -//.word 0xfc758a7c -//.word 0x03872291 -//.word 0x736b1bf6 -//.word 0x9654ae92 -//.word 0x028dc928 -//.word 0xc00e598a -//.word 0xad4dc50a -//.word 0x2156ba32 -//.word 0xcf1e2eb5 -//.word 0xec149fa4 -//.word 0x94fa9ce5 -//.word 0x69f387e2 -//.word 0x7ddd997e -//.word 0x72e0264d -//.word 0xdf472304 -//.word 0xf68fe52e -//.word 0x64be2b21 -//.word 0x79f75f31 -//.word 0x894a1923 -//.word 0x92d0e5e5 -//.word 0x1ef8467c -//.word 0x6b1cfb3d -//.word 0xca588040 -//.word 0x459bd812 -//.word 0x84fe8aaa -//.word 0xf255ea9e -//.word 0x1b049997 -//.word 0x58154f03 -//.word 0xaf87d809 -//.word 0xf5e85dc2 -//.word 0x3526e5a6 -//.word 0x56a21b44 -//.word 0xf7865237 -//.word 0x9e59c655 -//.word 0x12d02529 -//.word 0x05e74ea4 -//.word 0xf631580f -//.word 0x566cd644 -//.word 0xea59591e -//.word 0x70cb372e -//.word 0x85fd8baf -//.word 0xc6287dbc -//.word 0x3655c4c1 -//.word 0xe0706930 -//.word 0xbd9fcd75 -//.word 0xd7d2ed2b -//.word 0xaf9ae590 -//.word 0xdc3eb336 -//.word 0xf60c3efc -//.word 0xb2ed973d -//.word 0x4e3c7e47 -//.word 0x30d8280f -//.word 0xca783f23 -//.word 0xc03f2bdf -//.word 0x4d9190e4 -//.word 0xe32417c6 -//.word 0x115a7205 -//.word 0xaace9a3f -//.word 0x242c5ba3 -//.word 0x3e4713a9 -//.word 0xe565b700 -//.word 0x59dd16c8 -//.word 0x8ce56202 -//.word 0xcba5ec45 -//.word 0x9f902fb2 -//.word 0xf6f3102a -//.word 0x7ece64be -//.word 0x52e4b366 -//.word 0xd80e3bf6 -//.word 0xe9d4384f -//.word 0x333e63d2 -//.word 0xdce8b91b -//.word 0x68557deb -//.word 0xdd858065 -//.word 0x25caa07e -//.word 0xb3d78faf -//.word 0x6a1ad6ec -//.word 0xba4c19da -//.word 0x0c469c3d -//.word 0x601606af -//.word 0x34526598 -//.word 0xa8ac735a -//.word 0xe1c718cc -//.word 0xab492fea -//.word 0x62328dcb -//.word 0x126c3fd3 -//.word 0xdda21429 -//.word 0x9d565c6b -//.word 0xcb2eeea1 -//.word 0xa08f7070 -//.word 0x796dd291 -//.word 0x80621c81 -//.word 0x89fd6a79 -//.word 0x3a5c34a0 -//.word 0x6ffdd380 -//.word 0xdcd141b6 -//.word 0xf59221ee -//.word 0x0a57ff0f -//.word 0xb766d8b3 -//.word 0x7b49ddda -//.word 0xa72474df -//.word 0x7a4580ab -//.word 0x8afde228 -//.word 0x65ae40f8 -//.word 0x79260468 -//.word 0x312ba89f -//.word 0x6157321c -//.word 0xe427fa5f -//.word 0x844eb3e5 -//.word 0x194fa95a -//.word 0xf54a480b -//.word 0x8016de9a -//.word 0x2091a2f5 -//.word 0x5c34f488 -//.word 0x40ebe6b2 -//.word 0x0323fc76 -//.word 0xe7243074 -//.word 0x61a13917 -//.word 0x7a8d0d0f -//.word 0x7531a502 -//.word 0xb27c007e -//.word 0xd29a6a33 -//.word 0x1cc8fe5f -//.word 0x1f666a89 -//.word 0x994df272 -//.word 0x9864b849 -//.word 0xdf6e3a1e -//.word 0x8b261c99 -//.word 0xf78e28ec -//.word 0xdc849306 -//.word 0xbd968109 -//.word 0x8217ccff -//.word 0x637201c9 -//.word 0x07bfac57 -//.word 0xed94d61f -//.word 0x0c1ecbc7 -//.word 0xb6702125 -//.word 0xc21af56a -//.word 0xeafe789a -//.word 0x725fab40 -//.word 0x0b3b665f -//.word 0xf6db9fab -//.word 0x6ca8e9f9 -//.word 0x3e403bf5 -//.word 0xb9c9f313 -//.word 0xcc861ac8 -//.word 0x6da7eaf9 -//.word 0x38668db4 -//.word 0x594f281e -//.word 0xaddf18ac -//.word 0x24517c96 -//.word 0x6ab5f389 -//.word 0xc642a79d -//.word 0x42ed8a86 -//.word 0x0c3bdf0e -//.word 0x1c53fdc3 -//.word 0x17574fec -//.word 0x73f4a0c2 -//.word 0xdd3895dd -//.word 0xd7a47bed -//.word 0xa68343aa -//.word 0x6b7acb0e -//.word 0x905f60c1 -//.word 0x654e80d5 -//.word 0x0bfae4b3 -//.word 0x9242be55 -//.word 0x5e053fb6 -//.word 0xcf365c87 -//.word 0x2133d224 -//.word 0x905267c6 -//.word 0xc0bd73fa -//.word 0x5d81a052 -//.word 0xfee1ee5a -//.word 0x50f0facd -//.word 0x705f7f09 -//.word 0x98931dc1 -//.word 0xfefa59f2 -//.word 0xf9a0e618 -//.word 0x66fd23a1 -//.word 0x4a12e4a2 -//.word 0xb9b475c9 -//.word 0xf627dc93 -//.word 0xdbee5fbe -//.word 0x7be24602 -//.word 0x0782e2fc -//.word 0xee8ace6b -//.word 0x48c7759e -//.word 0x7529d42d -//.word 0x011a82e8 -//.word 0xcb0eed0d -//.word 0x675be6be -//.word 0xc04c60b1 -//.word 0x0270742a -//.word 0xb738a926 -//.word 0x30c173d9 -//.word 0x26eff95b -//.word 0xa1bb1b9f -//.word 0x19ceb4a4 -//.word 0xdb4e1cef -//.word 0xaff8f238 -//.word 0xb86f1864 -//.word 0x9bd3feb3 -//.word 0xe496243b -//.word 0xa58bda95 -//.word 0x5f404bd6 -//.word 0x268eb9c0 -//.word 0x016e0a3a -//.word 0x900e84fe -//.word 0xf125d592 -//.word 0xe3835679 -//.word 0x2cec90aa -//.word 0x39260041 -//.word 0x05511775 -//.word 0x3c7785ca -//.word 0x9f64b787 -//.word 0xaab89e6b -//.word 0x743ab39c -//.word 0xd86f38e0 -//.word 0xd26cc00f -//.word 0x2be8f1c9 -//.word 0x59958964 -//.word 0xa1b19f28 -//.word 0x7ed72cbf -//.word 0x461cc9e7 -//.word 0x0b57ba6a -//.word 0xbfc02c50 -//.word 0x9cbdbb53 -//.word 0xc3f83793 -//.word 0x24b5a88b -//.word 0x9d638f44 -//.word 0x66706fc8 -//.word 0xac628cda -//.word 0x7c24f3e4 -//.word 0xe39dba31 -//.word 0x5487895c -//.word 0x497f5a09 -//.word 0x2d587cd2 -//.word 0x7ab5de85 -//.word 0x1fd78a8c -//.word 0x24b370ac -//.word 0x904865f3 -//.word 0x8b2f6beb -//.word 0xc0743314 -//.word 0x05a4e091 -//.word 0x3e270e22 -//.word 0x7ed01352 -//.word 0x70b384f2 -//.word 0xf637fcc5 -//.word 0x0f6c187d -//.word 0xfe9ec6e6 -//.word 0xa92ac062 -//.word 0x3f905395 -//.word 0x1dca6561 -//.word 0xf3dcb615 -//.word 0x22ad66e1 -//.word 0x6915b88e -//.word 0xc137156b -//.word 0x8511548b -//.word 0xd651382d -//.word 0x3e6a3a7c -//.word 0x93e88979 -//.word 0x1f005035 -//.word 0xfd6c3743 -//.word 0xc6762c6d -//.word 0x6e5263a6 -//.word 0x68b09b40 -//.word 0x1192a45f -//.word 0x4b5b1eae -//.word 0x68298350 -//.word 0x4b65681a -//.word 0xc999ffff -//.word 0x5581e1cb -//.word 0xdd640a15 -//.word 0xefa4256e -//.word 0x20950bdf -//.word 0xae8b8693 -//.word 0x64375ad0 -//.word 0xbe33862c -//.word 0x4edbc7fd -//.word 0x5e5f5e11 -//.word 0xd716139f -//.word 0x62157a7e -//.word 0xcc017595 -//.word 0xaf21fa93 -//.word 0x4fb716e0 -//.word 0xc29132d3 -//.word 0x54db9625 -//.word 0x29372ba5 -//.word 0x2410852e -//.word 0x082a20d6 -//.word 0xdd7eea69 -//.word 0x96460216 -//.word 0xf054c067 -//.word 0x9da7f577 -//.word 0xa240745f -//.word 0xfe32d1f1 -//.word 0x8cf968a9 -//.word 0x2a0ca1e0 -//.word 0x1bb67343 -//.word 0xaa212784 -//.word 0x10b45f4f -//.word 0x989e5680 -//.word 0x01b36993 -//.word 0x2478d75b -//.word 0xd779c5f7 -//.word 0x10e38503 -//.word 0x4e4e170b -//.word 0x34dbf045 -//.word 0x777ffb7f -//.word 0xfb9ede56 -//.word 0x39dc7ea9 -//.word 0xe430c54d -//.word 0xcc3aa302 -//.word 0x02d652a6 -//.word 0x3df1dfa9 -//.word 0x7c9be6c1 -//.word 0xed5e9ddf -//.word 0x0ece1361 -//.word 0x1262ba89 -//.word 0x8682242e -//.word 0x34e10ab1 -//.word 0x480d9233 -//.word 0xb145d105 -//.word 0xca8a8f60 -//.word 0x3af84b57 -//.word 0x19577f09 -//.word 0x54ee261b -//.word 0x52977a66 -//.word 0xd71902ec -//.word 0x29b1cc11 -//.word 0x72f2f808 -//.word 0x66d0768b -//.word 0x25f70fcf -//.word 0x6361aab7 -//.word 0xc627c848 -//.word 0x8f97525d -//.word 0x7d88949b -//.word 0xeeea89a8 -//.word 0x48a15998 -//.word 0x979420a8 -//.word 0x7800f12f -//.word 0x35131bd1 -//.word 0x31b6aaf6 -//.word 0x87aa317a -//.word 0xeed6c7a7 -//.word 0xe0df5060 -//.word 0xfbfafe9e -//.word 0xa7fe1721 -//.word 0xf9bef85f -//.word 0xd7955ac1 -//.word 0x5d42d40e -//.word 0x80f6a127 -//.word 0xf1aca4f6 -//.word 0x44b9a9a1 -//.word 0x52a4ee03 -//.word 0xdc37e25c -//.word 0x71d62c47 -//.word 0x9110efed -//.word 0x12744c79 -//.word 0xc3a629cc -//.word 0x50b23171 -//.word 0x659f1cd3 -//.word 0x164831ad -//.word 0x7f6709c3 -//.word 0xa7f395d0 -//.word 0xabac63bf -//.word 0x18f41c1d -//.word 0x98e052cf -//.word 0xd18f7800 -//.word 0x8aba325e -//.word 0x0f8dd086 -//.word 0xd7b514bc -//.word 0x65bb3ce0 -//.word 0x6c903c9d -//.word 0x36694ce4 -//.word 0x46cca299 -//.word 0x3deb818c -//.word 0xfa3272aa -//.word 0x051cd275 -//.word 0x2e4a8cb1 -//.word 0x71d62860 -//.word 0x1de505f1 -//.word 0x367be2b5 -//.word 0x1794a392 -//.word 0x5b7052fb -//.word 0xfe2e651f -//.word 0xc09c3f61 -//.word 0xca4ef909 -//.word 0x94ed6139 -//.word 0x06d24322 -//.word 0xded3e877 -//.word 0x515ddd22 -//.word 0xf5c4f537 -//.word 0xded69126 -//.word 0x07b61f34 -//.word 0xf4e8e12c -//.word 0x96a8f051 -//.word 0x6f808098 -//.word 0xf7196514 -//.word 0x3d52d7b2 -//.word 0xd18f7226 -//.word 0xe2538025 -//.word 0xa4127bd5 -//.word 0xf440ce82 -//.word 0x3faedc92 -//.word 0xa01643bb -//.word 0x48f56273 -//.word 0x239819a8 -//.word 0xb97acfb2 -//.word 0x52cdba86 -//.word 0x5d575a2c -//.word 0x127f4773 -//.word 0x57a82de3 -//.word 0xe0bd15f3 -//.word 0x9b0de67c -//.word 0x4b5a2b6e -//.word 0x722c16c2 -//.word 0x756bc5af -//.word 0xfb2dc521 -//.word 0x96cdd567 -//.word 0xa53dec2b -//.word 0x799d7da8 -//.word 0xb60cf917 -//.word 0xfcbe966a -//.word 0xc74e4f3d -//.word 0x94562b0a -//.word 0x463ec39c -//.word 0xc751fec6 -//.word 0xf2162054 -//.word 0xb1dd0342 -//.word 0x6298a32c -//.word 0x80ece106 -//.word 0x7f88800d -//.word 0xf7b674fd -//.word 0x052f5c85 -//.word 0xef344df8 -//.word 0x06dad145 -//.word 0xd1a62f29 -//.word 0x6759eda3 -//.word 0x1d0d94a9 -//.word 0x6181b319 -//.word 0xe6b226f2 -//.word 0x02ab98c4 -//.word 0x549d4765 -//.word 0xa93207e6 -//.word 0x201f8ac5 -//.word 0x8df9de64 -//.word 0x1c4937ba -//.word 0x37e2ef49 -//.word 0xa972cb50 -//.word 0x03588041 -//.word 0x3eb57675 -//.word 0xa3c6cb1f -//.word 0xe8719b7f -//.word 0x9c1d7f58 -//.word 0xc5c753a3 -//.word 0xc7523d85 -//.word 0x871fea7f -//.word 0xd1de1be5 -//.word 0xf7a46191 -//.word 0xbb3d24d8 -//.word 0x6fc3eabd -//.word 0x5b6fd665 -//.word 0x5fb06fcb -//.word 0xda7aa4b5 -//.word 0xcae10ce7 -//.word 0x34e67296 -//.word 0xc691901f -//.word 0xbb401bf9 -//.word 0xff3e00e8 -//.word 0x9397ee74 -//.word 0x342b149a -//.word 0x37022cc1 -//.word 0xb8dfb8f0 -//.word 0xf3188b3d -//.word 0xf2a48c89 -//.word 0x6976b76a -//.word 0xde096469 -//.word 0x0c3dcc6e -//.word 0x8a61c978 -//.word 0xa891dd91 -//.word 0x9a427602 -//.word 0xd81b70c3 -//.word 0xc407dc35 -//.word 0x8d880013 -//.word 0x544e9ea6 -//.word 0x8e087a39 -//.word 0xaa7a16cd -//.word 0xf3cfc00e -//.word 0xb731ce85 -//.word 0xa998290e -//.word 0x84df088d -//.word 0xf11dfedd -//.word 0xab323709 -//.word 0xe1a0ffbf -//.word 0xdc9d8301 -//.word 0xe166dc1e -//.word 0x59d549e1 -//.word 0x2f36bc08 -//.word 0x7a5799f7 -//.word 0x5cdebaae -//.word 0x29dfb6f9 -//.word 0xccae63e6 -//.word 0x67f2997c -//.word 0x3afb39aa -//.word 0xc6566e7e -//.word 0x329e3398 -//.word 0xed9416dd -//.word 0x95723b70 -//.word 0x187da3de -//.word 0x19daae98 -//.word 0x95a2dfa7 -//.word 0xc639e09b -//.word 0x47dbc6c4 -//.word 0x7a7795a5 -//.word 0x27c107a6 -//.word 0x65838909 -//.word 0xbe33871f -//.word 0x8ecbe9bc -//.word 0xacd5dee8 -//.word 0x4cc5d8d7 -//.word 0x248cd81c -//.word 0xce6aeb19 -//.word 0x6e04f4ba -//.word 0x94b6ad63 -//.word 0x642ae926 -//.word 0xf42a1c3a -//.word 0xf5b21ca8 -//.word 0x964a2948 -//.word 0xa5922cec -//.word 0xf71f3cdb -//.word 0x0b856681 -//.word 0xeab5ae64 -//.word 0x518a515a -//.word 0x129e4dfa -//.word 0xb8622350 -//.word 0x6a6edcd5 -//.word 0x12154a9d -//.word 0xbe3d90d3 -//.word 0x466de563 -//.word 0x2f2894f6 -//.word 0xcf7a4723 -//.word 0xb2d086e3 -//.word 0x3d0d7b46 -//.word 0x91d9f865 -//.word 0xb23cbb98 -//.word 0xe96df0e9 -//.word 0x66e4f7c8 -//.word 0x2ab66800 -//.word 0x242254e9 -//.word 0x9a67cedf -//.word 0xcbd9aaf4 -//.word 0xd33485e2 -//.word 0xce300644 -//.word 0x40566205 -//.word 0xb5112618 -//.word 0xa4083169 -//.word 0x99abff14 -//.word 0x930c2ed6 -//.word 0xabf13ac0 -//.word 0xf7278c33 -//.word 0xae19b308 -//.word 0x8da1f10f -//.word 0x791df9bb -//.word 0x65c6f71b -//.word 0x763dd10c -//.word 0x6567acae -//.word 0x267bb314 -//.word 0xc7591340 -//.word 0x9a1e4a4e -//.word 0x96f5a2ef -//.word 0xfb30f819 -//.word 0x3597c2fd -//.word 0x03ff513a -//.word 0xd81f5350 -//.word 0x82a09b57 -//.word 0x097325f1 -//.word 0xda67547d -//.word 0x24fb7f8d -//.word 0x8370ac9a -//.word 0xdc239bf7 -//.word 0x881a0704 -//.word 0xb4dd28a4 -//.word 0x07877cf1 -//.word 0x861cc72e -//.word 0xb51d59fc -//.word 0xff5a8fd1 -//.word 0x58089ca7 -//.word 0x211389f1 -//.word 0x4cb67bd3 -//.word 0xc0483592 -//.word 0xff59dd4a -//.word 0x06fd03df -//.word 0x7568df35 -//.word 0xefbbdaa4 -//.word 0xc41e51a6 -//.word 0xcd0f95d3 -//.word 0x98f93610 -//.word 0xc5098103 -//.word 0xb03d47ca -//.word 0x51bee0ec -//.word 0x606f708f -//.word 0xbcc669ec -//.word 0x0ddb5101 -//.word 0xa8bec685 -//.word 0xb40ebf21 -//.word 0x8bc714dd -//.word 0x635c41d9 -//.word 0x2e06673d -//.word 0xbf5b9372 -//.word 0x2d224393 -//.word 0x7c66261e -//.word 0x7ac924f0 -//.word 0xe81b9e70 -//.word 0xda2bf70a -//.word 0x61dd53df -//.word 0x667d9eba -//.word 0xd953d146 -//.word 0x0c78707f -//.word 0x59e85767 -//.word 0x0bd7b7fa -//.word 0x7c495c63 -//.word 0x7add3170 -//.word 0xefe90544 -//.word 0xc1cc8f4c -//.word 0xf880b074 -//.word 0x1f6ff99a -//.word 0xec886d42 -//.word 0x2391888c -//.word 0xb7bf8064 -//.word 0x3284caf9 -//.word 0x58a8e070 -//.word 0x079b42d9 -//.word 0x620aba62 -//.word 0x2fb0e5ca -//.word 0x7c6fef19 -//.word 0x899f9e8f -//.word 0xe2a692da -//.word 0xccc8cb8c -//.word 0xe2416bcb -//.word 0x0091bd4a -//.word 0x60187779 -//.word 0x03e23cf9 -//.word 0x53c46553 -//.word 0x06a801e9 -//.word 0x45251a2d -//.word 0x0e533b10 -//.word 0xd7dd2ebe -//.word 0x74570a88 -//.word 0x3ad26e21 -//.word 0x65ae070e -//.word 0xb7b05858 -//.word 0x6254ba84 -//.word 0x2865a1c4 -//.word 0xc1ca226f -//.word 0x7da3b2af -//.word 0x2a95317a -//.word 0x386127c3 -//.word 0x1bbc4df1 -//.word 0xf15b4f90 -//.word 0x654dd046 -//.word 0xd38dae09 -//.word 0xadd88890 -//.word 0x1dbc7e07 -//.word 0xebf23807 -//.word 0xa2ed2ac5 -//.word 0xeeb3168a -//.word 0x49ecd263 -//.word 0xd6384b19 -//.word 0x8dc6ca63 -//.word 0x9923765b -//.word 0xfe4f1b2f -//.word 0x7f162919 -//.word 0xbf9d0091 -//.word 0xa63c6ac1 -//.word 0x068b6939 -//.word 0x7fc034e4 -//.word 0xa0387c3a -//.word 0x4e53f3b8 -//.word 0x6a850f8d -//.word 0xaeaa0b97 -//.word 0xd89a308d -//.word 0x0bfe527e -//.word 0x72629d7a -//.word 0x268b928f -//.word 0x520a4cf7 -//.word 0x9511088f -//.word 0xa786e48b -//.word 0x4056e768 -//.word 0x350c4223 -//.word 0xe4a2d5a9 -//.word 0xd396f58e -//.word 0x94416d01 -//.word 0xec65c200 -//.word 0x3405bcc8 -//.word 0xfe792190 -//.word 0xfcc1c476 -//.word 0x1e1abeba -//.word 0xfbcffc2a -//.word 0x72800000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00014F08 -//// expected output -//.word 0x5ed9a434 -//.word 0xfeb7ce13 -//.word 0x32733e63 -//.word 0x78c7ec0d -//.word 0x4b079cdc -//.word 0x80eaf5a9 -//.word 0xa7204d87 -//.word 0x1ae6bdc6 -//.word 0x85c95a9a -//.word 0xaefb7246 -//.word 0xf4e88242 -//.word 0x8b9b545e -//.word 0x9a93aedd -//.word 0x4aaabe1d -//.word 0xd14461fb -//.word 0x1694b896 -//// SHA512LongMsgvector_108 -//// vector length -//.word 0x00015220 -//// input message -//.word 0xce01369d -//.word 0x08d37dcd -//.word 0xa2c899c9 -//.word 0xfc0d11cc -//.word 0xf94a0051 -//.word 0xb2816a1d -//.word 0x6c3ad07f -//.word 0xc8dd02d7 -//.word 0x3a5f3555 -//.word 0xbc205503 -//.word 0xc4149d06 -//.word 0x73226421 -//.word 0x0fc93a7a -//.word 0xb30933a1 -//.word 0x458183ce -//.word 0xa9d54b6a -//.word 0x3452b3d1 -//.word 0x64d53957 -//.word 0xcee84989 -//.word 0x572f0db5 -//.word 0xa70386ac -//.word 0xdb5cdcc6 -//.word 0x7af4f227 -//.word 0xaba93e41 -//.word 0xa523d89a -//.word 0x66b8d0cf -//.word 0xa88cc5da -//.word 0x11fdb390 -//.word 0xaa3e0d6d -//.word 0x92410c94 -//.word 0xf4db4612 -//.word 0x36238263 -//.word 0x731bcb37 -//.word 0x2c92c376 -//.word 0x3a483a81 -//.word 0x0754ffbb -//.word 0xfec3f648 -//.word 0x40826b14 -//.word 0x997ea617 -//.word 0xb209c0d8 -//.word 0x8880b530 -//.word 0x1c2ab951 -//.word 0x6d64d006 -//.word 0xa3fb993d -//.word 0x8dda6ac2 -//.word 0x4de5a24d -//.word 0x52243bbf -//.word 0x87249fa9 -//.word 0xca9abd0e -//.word 0xa04a5b6a -//.word 0x2727aef2 -//.word 0x4cbc281e -//.word 0x3dca9165 -//.word 0x22335947 -//.word 0x08162d91 -//.word 0x1d3cc8dd -//.word 0x23b30c58 -//.word 0x1fb851c8 -//.word 0x51dbfdcd -//.word 0x695d5466 -//.word 0xf8dd92b8 -//.word 0x2533370b -//.word 0xa19da316 -//.word 0xdd19e27c -//.word 0x7a11c996 -//.word 0x013d4273 -//.word 0xd4c6e41d -//.word 0x64a7c71e -//.word 0xa5599643 -//.word 0xbfafe5a0 -//.word 0x07ffc5d4 -//.word 0x2d82968f -//.word 0xb6fd1d51 -//.word 0xada1d774 -//.word 0x96308c6c -//.word 0xa462264e -//.word 0x2c87c48f -//.word 0x586d0b0e -//.word 0x2084bc55 -//.word 0x76408c1c -//.word 0xc1bf300f -//.word 0x8dacb7d2 -//.word 0x81631c41 -//.word 0x91561cfc -//.word 0x75af4523 -//.word 0x5937505e -//.word 0xd676b021 -//.word 0x211c6b2e -//.word 0x829f295b -//.word 0x08268a95 -//.word 0x7ca6bd25 -//.word 0x934a4f32 -//.word 0x67194087 -//.word 0x28d35c97 -//.word 0x0f1bc8be -//.word 0x94dbdcca -//.word 0xe1e530ba -//.word 0x86d6fac6 -//.word 0x6e40979f -//.word 0x120867f7 -//.word 0xec0cde44 -//.word 0x2f09d8c1 -//.word 0xb5bd2db6 -//.word 0x394886fa -//.word 0xc6d86fb6 -//.word 0x6f85ad6b -//.word 0x417ad137 -//.word 0x76560d54 -//.word 0xebd247e1 -//.word 0xd5a36ce5 -//.word 0xafa20791 -//.word 0x772a12c5 -//.word 0x19c10bd6 -//.word 0x2cfb4b8f -//.word 0xdc9c9475 -//.word 0x27fde94f -//.word 0x4db1a2e6 -//.word 0x8167bf0a -//.word 0xe5127dd5 -//.word 0xb5482734 -//.word 0xc2e82fa2 -//.word 0x23007d37 -//.word 0x27ee07e2 -//.word 0x8ec5a2f3 -//.word 0xf8f217dc -//.word 0x9d1f7a38 -//.word 0x3f57b70c -//.word 0x5d6b6e4d -//.word 0xaa9501a3 -//.word 0xbd5ceb6d -//.word 0x0ab75305 -//.word 0x1175e045 -//.word 0xd5dcd04a -//.word 0x90914477 -//.word 0xa5b8debd -//.word 0xd65b8e1a -//.word 0xb710a960 -//.word 0x62d63c38 -//.word 0x6d419f66 -//.word 0x19d74d4f -//.word 0xccb9f2b8 -//.word 0xc286c6d0 -//.word 0xff7c1a71 -//.word 0x88e030a3 -//.word 0xd2a05062 -//.word 0x7b3818a1 -//.word 0x38d2148e -//.word 0x0fb18f18 -//.word 0xc6cfa8ae -//.word 0x9bc5a84a -//.word 0x35ec92af -//.word 0xdbc2fcef -//.word 0xe48f1e2f -//.word 0x6e4829ae -//.word 0x53b3da04 -//.word 0x59cc4ea8 -//.word 0xa96818b5 -//.word 0x831891ee -//.word 0x2f506fff -//.word 0x37c89906 -//.word 0xd3233a51 -//.word 0xa5cf1469 -//.word 0xa62c1850 -//.word 0x61f03308 -//.word 0x5fca6a54 -//.word 0xe24529c3 -//.word 0xd6f0d8e9 -//.word 0x04bcb0f0 -//.word 0x89a5cd50 -//.word 0x869484da -//.word 0x1a84f6fb -//.word 0x8de4e53f -//.word 0xce3dc714 -//.word 0x201519d1 -//.word 0x1013f6f6 -//.word 0xaa64e8b5 -//.word 0xec5cfeb2 -//.word 0x7b611f08 -//.word 0x95059d8c -//.word 0x47720d55 -//.word 0xe00b577c -//.word 0xa5500920 -//.word 0xc602f1ad -//.word 0x9188ea5e -//.word 0xe692f601 -//.word 0xebfc8dfb -//.word 0x00f5358b -//.word 0xf6605353 -//.word 0x7b7a4114 -//.word 0xd9bea0b9 -//.word 0xe106f097 -//.word 0x21f25ef3 -//.word 0x5e8ddcc4 -//.word 0x3e2e77bb -//.word 0x449de581 -//.word 0x01775e40 -//.word 0x89d4ae64 -//.word 0x252687a3 -//.word 0x47651b3a -//.word 0xc369ea7a -//.word 0x3b97d984 -//.word 0xdbbf8551 -//.word 0x4745d6f5 -//.word 0xd27fd724 -//.word 0xf15fc5f5 -//.word 0xef5266e6 -//.word 0xe2679b20 -//.word 0xddb439fd -//.word 0x67f615c8 -//.word 0x2c775ec4 -//.word 0xf335306f -//.word 0xd0406507 -//.word 0x9b64af4e -//.word 0xa008e48b -//.word 0x985698d1 -//.word 0xd99cf183 -//.word 0xc9f2b718 -//.word 0x981eab1c -//.word 0x2fb41a77 -//.word 0x6382b1f2 -//.word 0x6f2a93f7 -//.word 0xa111a998 -//.word 0x537839d4 -//.word 0x1de9bb15 -//.word 0x49d5e8fc -//.word 0x877b1361 -//.word 0xe20bbc96 -//.word 0xf30c63ec -//.word 0x55fb9a79 -//.word 0x59355e18 -//.word 0xfa17a7b0 -//.word 0x13633eba -//.word 0xcfe5cffd -//.word 0x61573f9c -//.word 0xf6833f53 -//.word 0xe8a722fe -//.word 0x351deb5b -//.word 0x2f3bab10 -//.word 0x75790af0 -//.word 0x21d1237a -//.word 0x436c95a2 -//.word 0x8f7ad6d5 -//.word 0x5262cb37 -//.word 0xab1b962f -//.word 0xf7d9b025 -//.word 0x8ded378a -//.word 0xace68919 -//.word 0xb1fd115d -//.word 0x8db06174 -//.word 0x77ac8112 -//.word 0xdef087c9 -//.word 0xa2306887 -//.word 0x83770e60 -//.word 0xda11ab8d -//.word 0x87a84cb5 -//.word 0x2aadb16c -//.word 0x96fa5cfa -//.word 0x82b5e85d -//.word 0x82779c91 -//.word 0x36ad400e -//.word 0xc13f2f93 -//.word 0x7d70ae22 -//.word 0xee067c4b -//.word 0xf4aaabae -//.word 0x4491adbc -//.word 0x185cb2bd -//.word 0x263d3217 -//.word 0xcf5cc5cd -//.word 0x9a793b46 -//.word 0xe0d2e950 -//.word 0xc9474164 -//.word 0x77bca62c -//.word 0x80bf7e42 -//.word 0xa26a883b -//.word 0xb28b6fe4 -//.word 0xd603a0cb -//.word 0xf46c5901 -//.word 0x6aff031f -//.word 0x00b4c287 -//.word 0x1aaa4aec -//.word 0x33caf415 -//.word 0x86a811dd -//.word 0x0ea97e7f -//.word 0xb16b7910 -//.word 0xb961b24d -//.word 0x83bea597 -//.word 0x7b95283c -//.word 0x483e40f8 -//.word 0x43fb39bc -//.word 0x2edbf6ad -//.word 0x23df8570 -//.word 0xca5cf6a5 -//.word 0xcfa06eb1 -//.word 0x93d877c1 -//.word 0x22329a0c -//.word 0x663e3058 -//.word 0x9a9a75bf -//.word 0x00cedeb3 -//.word 0xd775ad40 -//.word 0x889ec291 -//.word 0x2071b4b6 -//.word 0x021620a4 -//.word 0xded2417d -//.word 0xdd73c112 -//.word 0x1eefcfa7 -//.word 0x664872f6 -//.word 0x13b21d76 -//.word 0x52f883dc -//.word 0x921cace2 -//.word 0x393e4948 -//.word 0x95be4519 -//.word 0x15a59c30 -//.word 0xb94170fa -//.word 0xc7105a7e -//.word 0xc0e0fe9a -//.word 0x9233e28f -//.word 0x0fe880c0 -//.word 0x9e1899b6 -//.word 0x303fcd68 -//.word 0x769c69b9 -//.word 0x52da8043 -//.word 0x8bef3d53 -//.word 0xc4457734 -//.word 0xaf1786b1 -//.word 0x7e1f55d5 -//.word 0x9a6eb9f5 -//.word 0x989b01f1 -//.word 0x691fcfb6 -//.word 0xd0002607 -//.word 0x19adc37e -//.word 0x0929b1cd -//.word 0x116c184a -//.word 0xc60756ab -//.word 0x9606500d -//.word 0xb31a0a3c -//.word 0x54f8762e -//.word 0x1dfc8ad0 -//.word 0xdb129506 -//.word 0x75d6d3ec -//.word 0x20fa3f63 -//.word 0xd1e8a8c9 -//.word 0xf8a90707 -//.word 0x6b0610d1 -//.word 0xa0ed0729 -//.word 0x2016d525 -//.word 0x38e55bf3 -//.word 0xf293061a -//.word 0x4489a402 -//.word 0x860c76b7 -//.word 0x291f86ea -//.word 0xa7a53a39 -//.word 0xb6c72ab0 -//.word 0xc1952f8f -//.word 0x98f0bc4d -//.word 0x67a772de -//.word 0xe5e0ee32 -//.word 0xcdbae6fe -//.word 0x923074be -//.word 0x4f41b1fb -//.word 0xfc4d86c9 -//.word 0xe8c3bf95 -//.word 0x63f9611d -//.word 0xbb5b3ec0 -//.word 0x6bc8c6f8 -//.word 0x8e392025 -//.word 0x9aa47a8c -//.word 0x4a209d9f -//.word 0xdc49c47f -//.word 0x7de6aebf -//.word 0x02c9f26b -//.word 0xd8f79348 -//.word 0x3e09d45e -//.word 0xb1d24db4 -//.word 0xa8423f5b -//.word 0x828a25ad -//.word 0xbd818bd7 -//.word 0x68472395 -//.word 0xdb28163d -//.word 0xa5c398ff -//.word 0xc66bbf6b -//.word 0x1fcd9533 -//.word 0x26d36c33 -//.word 0xdec971ae -//.word 0x07bf84db -//.word 0x912e47a0 -//.word 0x57de759d -//.word 0x0a06766c -//.word 0x6bb63027 -//.word 0xbe721f2b -//.word 0x7b1fa81c -//.word 0x4624aa2a -//.word 0x21c95792 -//.word 0xe1e24267 -//.word 0xdeb2b892 -//.word 0xef0a5418 -//.word 0x96b1ce9b -//.word 0x77081424 -//.word 0x0fee9c1f -//.word 0xa2e2f8a7 -//.word 0x7567ab04 -//.word 0x3ead3b72 -//.word 0xd96d8724 -//.word 0x3c155b89 -//.word 0xad2542ce -//.word 0x33d99ba4 -//.word 0x4a08ef43 -//.word 0xda4c82af -//.word 0x6a63283a -//.word 0x91d55a4a -//.word 0xaed7895c -//.word 0xd970b249 -//.word 0x1ada33c8 -//.word 0xd82bdd35 -//.word 0x94354a91 -//.word 0xd7aa71c9 -//.word 0x6884773b -//.word 0xc3a3c976 -//.word 0xc7b86741 -//.word 0xaf6383e0 -//.word 0x43984a92 -//.word 0x4f47025e -//.word 0x553c550f -//.word 0x7f44ec7e -//.word 0xd791400f -//.word 0xba5fad7e -//.word 0x8ad8c9dc -//.word 0xa435f3d4 -//.word 0x92272f33 -//.word 0x817531a8 -//.word 0xf5e6b7c7 -//.word 0xbb611c54 -//.word 0x20532abf -//.word 0x605131eb -//.word 0x61ff5533 -//.word 0xa1302caf -//.word 0x6d4e89b3 -//.word 0x55fd9299 -//.word 0xdcfb19c1 -//.word 0x744a29d5 -//.word 0xa992de52 -//.word 0x9cc17a44 -//.word 0xb3f4b651 -//.word 0x8f9a56f8 -//.word 0x3ed6001b -//.word 0xb2264ebb -//.word 0x72432204 -//.word 0x90483a89 -//.word 0xdb1504d0 -//.word 0x55f6b311 -//.word 0xe880923b -//.word 0x54bc9838 -//.word 0x6c883d72 -//.word 0x82398d96 -//.word 0x20857b98 -//.word 0xf9a177f7 -//.word 0x1ea64342 -//.word 0x753902db -//.word 0x686b92fb -//.word 0xdade1bf6 -//.word 0x5f2ae8c0 -//.word 0xac7e76b0 -//.word 0x4c8bcb85 -//.word 0x959d09a7 -//.word 0xdb0b43af -//.word 0xe3d28f28 -//.word 0x9a7d5d97 -//.word 0x074807ba -//.word 0x7f84a90e -//.word 0x183d3293 -//.word 0x601bbbd3 -//.word 0x4e861821 -//.word 0x780dad1f -//.word 0x87098383 -//.word 0xe87d9c1a -//.word 0xc541830d -//.word 0x34602663 -//.word 0xaebee8c7 -//.word 0xc2fef38b -//.word 0x0aa2cbee -//.word 0x5f74299a -//.word 0x49250671 -//.word 0xb935f689 -//.word 0xfb12b775 -//.word 0xe6840ac7 -//.word 0x5648c1d2 -//.word 0xdcfc1ab5 -//.word 0xb33b4b95 -//.word 0xf6085e29 -//.word 0x11703f7c -//.word 0x766b14ee -//.word 0x9104cc7c -//.word 0xfdb9fb42 -//.word 0xf825e53e -//.word 0x14dcd857 -//.word 0x3097c09e -//.word 0xa791f5d3 -//.word 0xc730572b -//.word 0x85e89d50 -//.word 0x6e5deaaa -//.word 0xe1c7a1dd -//.word 0x7c9b7b93 -//.word 0xd468d77b -//.word 0x69fe5192 -//.word 0xd9d695a1 -//.word 0x53ae7606 -//.word 0x4f743ab8 -//.word 0x7c653886 -//.word 0xfa76a69f -//.word 0xcaf3ac57 -//.word 0x8366bc28 -//.word 0x46ba26f7 -//.word 0xf3a0e799 -//.word 0x9d32c296 -//.word 0x3cd6932d -//.word 0xa266df98 -//.word 0xb18eaf91 -//.word 0xca759f14 -//.word 0x889f3267 -//.word 0xaf126858 -//.word 0x5fb793c6 -//.word 0x8e046662 -//.word 0xb5d84fb7 -//.word 0xc8a60768 -//.word 0x6cd667b9 -//.word 0x65687d51 -//.word 0x4ddbdf3f -//.word 0x8c4d3f3a -//.word 0x84e3402d -//.word 0x0c6b88f3 -//.word 0x2040165e -//.word 0xd66ed67f -//.word 0x94177321 -//.word 0x81166d97 -//.word 0x39e16bb8 -//.word 0xc5b4d227 -//.word 0xcaec96d8 -//.word 0x00b151cf -//.word 0xe6d7922b -//.word 0xb5067764 -//.word 0x92197ed1 -//.word 0x07c5986d -//.word 0xb47b7fda -//.word 0x428f4aa6 -//.word 0x99993fce -//.word 0x531ce880 -//.word 0x70656925 -//.word 0x4bb6109f -//.word 0xcca42ecf -//.word 0xe0be255b -//.word 0x266fc3ae -//.word 0xec26ce40 -//.word 0x59b3e017 -//.word 0xebf5758e -//.word 0x25b24355 -//.word 0x81c6cab9 -//.word 0xac802b25 -//.word 0xf2493de9 -//.word 0xf786de3b -//.word 0xa9c0877b -//.word 0x720224bc -//.word 0xb283227f -//.word 0x6c85c9c1 -//.word 0x407dcc39 -//.word 0x99741edb -//.word 0x27ad08a0 -//.word 0x90887989 -//.word 0x62a69de2 -//.word 0x4d4eb0c4 -//.word 0x8f1015dd -//.word 0xafa8a273 -//.word 0x6e253fa7 -//.word 0xfb4aaff7 -//.word 0x6634ad07 -//.word 0x573d3ba1 -//.word 0x002137fa -//.word 0x505f2f37 -//.word 0x69e2762f -//.word 0x55e17773 -//.word 0xf4044a8c -//.word 0x39c88583 -//.word 0x962455a7 -//.word 0xb56dcd8a -//.word 0x69777d4d -//.word 0xe4fd471d -//.word 0x2a426efe -//.word 0xc6f9f0c7 -//.word 0xbb62166e -//.word 0xbdb74986 -//.word 0xa1c62706 -//.word 0x13dfd64c -//.word 0x87f09862 -//.word 0x72efa07f -//.word 0xb97825d1 -//.word 0x69b8b479 -//.word 0xaa89cad8 -//.word 0xeedea209 -//.word 0x6e624cae -//.word 0xd75cfff0 -//.word 0x40d6b0c1 -//.word 0x60fee364 -//.word 0xfeccc230 -//.word 0xa8e56c91 -//.word 0xa8c08f4f -//.word 0x34073913 -//.word 0xe540eb27 -//.word 0x6bacf07d -//.word 0x7e6fecf3 -//.word 0x17f2b8d5 -//.word 0xe1866da3 -//.word 0xea4abf15 -//.word 0x9f4e8d5d -//.word 0xf7f8b5ac -//.word 0xeea72df7 -//.word 0x359750fb -//.word 0x2805757f -//.word 0x0093c6d9 -//.word 0x4aed50b3 -//.word 0x98ad560f -//.word 0x767ceb89 -//.word 0x9f7ac0dc -//.word 0x71e13aa8 -//.word 0x9fe5c773 -//.word 0x26de73ed -//.word 0x82a8b678 -//.word 0x214a90e7 -//.word 0x18d7d886 -//.word 0x1592d25b -//.word 0x9455ffac -//.word 0x563439c2 -//.word 0x0f5dffec -//.word 0x60420dc6 -//.word 0x04fb2fba -//.word 0x4ee558c8 -//.word 0xd390ee83 -//.word 0x64d8695c -//.word 0x3f511c23 -//.word 0x85e952cb -//.word 0xefc89d6e -//.word 0xbd7b6b90 -//.word 0xf052daa8 -//.word 0xb906cedd -//.word 0x319f400d -//.word 0x4a95d913 -//.word 0x0636bf4a -//.word 0xe747af4d -//.word 0xa6ee4c01 -//.word 0x28d0b6d6 -//.word 0xad765f49 -//.word 0x4bf51aae -//.word 0x9bce752c -//.word 0xb2134909 -//.word 0x52cb8f27 -//.word 0x629875cf -//.word 0x9c97b2ae -//.word 0x8688161d -//.word 0xa32f65a6 -//.word 0xeaf965c3 -//.word 0x77e336e8 -//.word 0x8198e2c4 -//.word 0x8cd935c5 -//.word 0xdf22cfda -//.word 0x398b777c -//.word 0xc0ecb2ef -//.word 0x3a4494c5 -//.word 0x7f5cd7a5 -//.word 0x2ea72a4a -//.word 0xa06dcbce -//.word 0x1a285829 -//.word 0x472fe3f5 -//.word 0xe5914474 -//.word 0xbe44b3d3 -//.word 0xda7f96b0 -//.word 0xf36497db -//.word 0x29e2fa59 -//.word 0xf7da2daf -//.word 0x6680a15d -//.word 0x8005d9a8 -//.word 0x0873c19c -//.word 0x68d84052 -//.word 0xeba6106f -//.word 0x2c5aceed -//.word 0xcf5c4d1e -//.word 0x6e2630ed -//.word 0xd6a9b868 -//.word 0x74ecda7b -//.word 0x0af795fe -//.word 0xa6ef82f3 -//.word 0xd582ad08 -//.word 0x1486a364 -//.word 0x87dccc9f -//.word 0xee9bfb12 -//.word 0xd46a4452 -//.word 0x092e0ef7 -//.word 0x53e668a2 -//.word 0x61d2a13e -//.word 0x00db1285 -//.word 0x922f3fc6 -//.word 0xbb2c1fe6 -//.word 0x5d7fb7a6 -//.word 0xc78dee23 -//.word 0x29129ca3 -//.word 0x4b07e48e -//.word 0x7fcac4bb -//.word 0xd579eaed -//.word 0x8d9ec99e -//.word 0xd212edfb -//.word 0xa51b8b2f -//.word 0x17d85de4 -//.word 0xbbdfac07 -//.word 0x5b24afcc -//.word 0xea1d13f3 -//.word 0xba23db49 -//.word 0xef1c6a71 -//.word 0x3457dee4 -//.word 0xacb7a037 -//.word 0x2b14399d -//.word 0xa7de68ac -//.word 0xe9037164 -//.word 0x8813b76d -//.word 0x18a38da0 -//.word 0x9fef4ac9 -//.word 0x48c39bab -//.word 0x5c9b1e45 -//.word 0x6d092c54 -//.word 0xd557f619 -//.word 0x5f6dd35c -//.word 0x43f6d8b1 -//.word 0x58bfaafa -//.word 0x855f902d -//.word 0x781dcc58 -//.word 0x9b0e2ce2 -//.word 0x447edc13 -//.word 0x2d917ed6 -//.word 0x232a7cbe -//.word 0x020c9d48 -//.word 0xe040d760 -//.word 0x89b66526 -//.word 0x2c2f19f1 -//.word 0x5359f294 -//.word 0x183cf1e1 -//.word 0x96d6296c -//.word 0x9f021692 -//.word 0xad9f2fb9 -//.word 0x1aedbed8 -//.word 0x933af03b -//.word 0xcabf2880 -//.word 0x6bc599e6 -//.word 0x520c14c7 -//.word 0xfb6c1e62 -//.word 0x39bd46de -//.word 0x2bf5b68c -//.word 0x6c90076d -//.word 0x8b355af4 -//.word 0xbb96a40c -//.word 0xcb98495d -//.word 0x58b4edcb -//.word 0x419c8640 -//.word 0x5b22b6ac -//.word 0x6656594a -//.word 0x40ef5a24 -//.word 0x59edcad9 -//.word 0x677c339e -//.word 0x5b1a2983 -//.word 0x93fc23f8 -//.word 0x51ae898f -//.word 0x6cfb0e03 -//.word 0x450c407a -//.word 0xfdd45d07 -//.word 0xe5ab6973 -//.word 0x36387d3d -//.word 0x039562df -//.word 0x6bae5f53 -//.word 0x13ea4ed6 -//.word 0xd40ef5ec -//.word 0xb05e94a4 -//.word 0x0b05bb1d -//.word 0x17b65e49 -//.word 0x91942bf1 -//.word 0xab4f1bf9 -//.word 0x499048e6 -//.word 0x6f98fe9d -//.word 0xfa24146d -//.word 0x8f937d50 -//.word 0xd24a1a6e -//.word 0xd858d2e3 -//.word 0xde56e5c2 -//.word 0x3b917d5a -//.word 0x936c87b8 -//.word 0x4effc06d -//.word 0x48041391 -//.word 0xcaf42207 -//.word 0xba6d2303 -//.word 0x0ed7edca -//.word 0x864752b9 -//.word 0x9ba3b089 -//.word 0xb308c3d1 -//.word 0x9668bdcc -//.word 0x2578995d -//.word 0x4ac9ac50 -//.word 0x2b347de3 -//.word 0xa37cd685 -//.word 0xf22f1bdd -//.word 0xb3cddb0e -//.word 0x0f2ca53a -//.word 0x311b1d45 -//.word 0xf9464edb -//.word 0xf55a42b4 -//.word 0x8d69d016 -//.word 0x7d8fb69c -//.word 0x89d6e837 -//.word 0x6b572772 -//.word 0x11a2d4fa -//.word 0x0560075d -//.word 0x2d37dc12 -//.word 0xb4ee0dba -//.word 0x48d2c6a5 -//.word 0x8658b498 -//.word 0xb20360cd -//.word 0xac88bb3c -//.word 0x1f31f919 -//.word 0xfc7fa39e -//.word 0x2713e80a -//.word 0x70ce35ea -//.word 0xc4380597 -//.word 0xa41ef900 -//.word 0xd7802ba9 -//.word 0x5caac0f4 -//.word 0xa3a0bca0 -//.word 0xfdbf1a8f -//.word 0x50a21dcc -//.word 0x0f43e1cc -//.word 0x696235f4 -//.word 0xc12bad5c -//.word 0x5f13f2d3 -//.word 0x65035d23 -//.word 0x04b8c496 -//.word 0xef6a94b8 -//.word 0x10ab205f -//.word 0x7b9339e9 -//.word 0xa01affc5 -//.word 0xc4c5f635 -//.word 0xb2855d51 -//.word 0xaddcbb50 -//.word 0xaa41ba03 -//.word 0xbcc638a2 -//.word 0xd0f89ccb -//.word 0x9a0666c8 -//.word 0xcf260b11 -//.word 0x9535ff11 -//.word 0x389d132d -//.word 0x1e7c0103 -//.word 0xfd0345ef -//.word 0x4b1c2fd4 -//.word 0xf64f3719 -//.word 0x56e690f1 -//.word 0x604f00e0 -//.word 0x1cc3ee7b -//.word 0x5925bd6f -//.word 0x9f2d58c4 -//.word 0x65c50e63 -//.word 0x84b3a1d6 -//.word 0xec799950 -//.word 0x9579deed -//.word 0xb95d863a -//.word 0x41b6ecf8 -//.word 0x7de3021d -//.word 0x1735e81c -//.word 0x4a51bd66 -//.word 0x4fd5b531 -//.word 0x183e6b78 -//.word 0x41097943 -//.word 0x44184728 -//.word 0xec582012 -//.word 0x0ca18b41 -//.word 0x70ddd892 -//.word 0x146df901 -//.word 0x94c8936c -//.word 0xe465559a -//.word 0x41dc897b -//.word 0x6748e8b1 -//.word 0x05efb350 -//.word 0x6e25ffe2 -//.word 0x916d51af -//.word 0x2be26a3b -//.word 0x3bd5640f -//.word 0xb7b8febc -//.word 0x7d3a351e -//.word 0x8cb414de -//.word 0x74c4cc3a -//.word 0x0b370709 -//.word 0x622d7af9 -//.word 0xf777b91c -//.word 0x2c4450a3 -//.word 0xf8fd0fe9 -//.word 0xdd6da5b3 -//.word 0x1a2571b6 -//.word 0x211f9459 -//.word 0x4ba14bbd -//.word 0xcb647cfa -//.word 0xe1f68eac -//.word 0x505d7eaf -//.word 0x11fd2f26 -//.word 0x49bc02c2 -//.word 0x7963a741 -//.word 0xf4473334 -//.word 0x972a7206 -//.word 0xb45c7e3a -//.word 0x4f2590f4 -//.word 0x8d6817bb -//.word 0x6980077d -//.word 0xa96e74d3 -//.word 0x10365f87 -//.word 0xd686d054 -//.word 0x559925ec -//.word 0x055ba940 -//.word 0xaace68fb -//.word 0xccac424f -//.word 0x684e3ff5 -//.word 0xe5cc226f -//.word 0x49664191 -//.word 0xad22933f -//.word 0xefb70b78 -//.word 0xa6aa2494 -//.word 0x5bb7bec9 -//.word 0xf67228f4 -//.word 0x762e7e96 -//.word 0xe51e351d -//.word 0x8bbaf466 -//.word 0x6364a57f -//.word 0xcb4ccdb1 -//.word 0x7f9118be -//.word 0xc8a93967 -//.word 0xf102f031 -//.word 0xfbe96c69 -//.word 0x92acd466 -//.word 0x3ffb210e -//.word 0xde942e9c -//.word 0x532012a0 -//.word 0x7957ad46 -//.word 0x5b6b81dc -//.word 0xa7a4c38f -//.word 0x5f47b275 -//.word 0xd2bd28d1 -//.word 0xcbf16f92 -//.word 0x08fa551c -//.word 0xedfa834b -//.word 0x7a460ab5 -//.word 0x7bc73f30 -//.word 0xfea0c995 -//.word 0x0a10f8c3 -//.word 0x8e9a59e6 -//.word 0x986487f9 -//.word 0xc7de4389 -//.word 0x03a3c7bc -//.word 0x6ba45893 -//.word 0x8f831b6c -//.word 0xe03d29cb -//.word 0x650ce559 -//.word 0xaf8c8e2d -//.word 0x0e1c104b -//.word 0x0587206a -//.word 0xfce487fb -//.word 0x35babe66 -//.word 0x0168bc97 -//.word 0x34c40cb9 -//.word 0xd6032241 -//.word 0x1bd9ef2f -//.word 0x95e0b390 -//.word 0xa93e1348 -//.word 0x40836b0e -//.word 0xbed065b8 -//.word 0x383ecbb9 -//.word 0xe27d99e8 -//.word 0xc6bc5783 -//.word 0xbcc9a573 -//.word 0x967a18d1 -//.word 0x9b4b44aa -//.word 0x37481aff -//.word 0xf02e7510 -//.word 0x9ccdefdb -//.word 0xd1b0f9df -//.word 0x9e002b25 -//.word 0x78a6d881 -//.word 0x77b0e616 -//.word 0xc3f6dc18 -//.word 0x49fd3dd6 -//.word 0xb21b15f7 -//.word 0x95dcd103 -//.word 0xeba55326 -//.word 0xc4974631 -//.word 0x39b6afe2 -//.word 0xa24bc565 -//.word 0x0987031a -//.word 0xde687b99 -//.word 0xebe16df4 -//.word 0x8b35183c -//.word 0x17a4d046 -//.word 0xa24951ae -//.word 0xe643531d -//.word 0x7d135fc8 -//.word 0x5545e039 -//.word 0x5e537d52 -//.word 0x85c6a68f -//.word 0xe69e6d8b -//.word 0x3df498c6 -//.word 0x9edef4a5 -//.word 0x6793ecba -//.word 0x72cf5946 -//.word 0x8f799cfc -//.word 0x3184eb08 -//.word 0x6713e850 -//.word 0x0ee078fa -//.word 0x46ded22e -//.word 0x221dd61d -//.word 0xa4eea142 -//.word 0xe8495ee7 -//.word 0x9f6b5eec -//.word 0xbfc36cc4 -//.word 0x790f5ac0 -//.word 0x6cc3e090 -//.word 0x18aaa707 -//.word 0x95cfa01e -//.word 0x849e9a3c -//.word 0x474714b4 -//.word 0x6d634f8f -//.word 0x70daa88d -//.word 0xa3042566 -//.word 0x660e4e55 -//.word 0x9ca03ed7 -//.word 0x5fbcf9b1 -//.word 0xf2ea0030 -//.word 0xf69223b4 -//.word 0xe1a99770 -//.word 0xad8f486b -//.word 0xcd3870ca -//.word 0x658b6952 -//.word 0xba07c029 -//.word 0xe8ac8adc -//.word 0xd319fba6 -//.word 0x5ff234f0 -//.word 0xe4845d14 -//.word 0xdcacf466 -//.word 0xdff46475 -//.word 0xd200da8e -//.word 0x5b295482 -//.word 0x9767fba9 -//.word 0x1074b227 -//.word 0xe92eef6e -//.word 0x5c3ec905 -//.word 0x67f75387 -//.word 0xc18029ee -//.word 0x13364811 -//.word 0x654c236c -//.word 0xd6b4f320 -//.word 0x91434e3a -//.word 0xfc10fb38 -//.word 0x331d05ca -//.word 0xb4390ed5 -//.word 0x5c24e6bd -//.word 0x92f55ce4 -//.word 0xc2b9546e -//.word 0x0d5d1a48 -//.word 0x3ecef668 -//.word 0x005e0156 -//.word 0x4f6a36eb -//.word 0x2d39cc58 -//.word 0x9628c46b -//.word 0xb504be0e -//.word 0x58b81011 -//.word 0xa2281929 -//.word 0xff5cd338 -//.word 0x5de1a8ce -//.word 0x9a6c87f0 -//.word 0x38c13619 -//.word 0x58d3ea7f -//.word 0xe62d1597 -//.word 0x11907fdb -//.word 0xfede98cb -//.word 0xbd360d32 -//.word 0x7c6199aa -//.word 0xfa6d1e62 -//.word 0x3f97f41f -//.word 0x8b6f8081 -//.word 0x8c360988 -//.word 0xd38bc856 -//.word 0x89473e37 -//.word 0x5ea5cbde -//.word 0xc3a67bf2 -//.word 0x59b323c9 -//.word 0xa984ad73 -//.word 0x1542b0fa -//.word 0x0ee844e8 -//.word 0x88ef140a -//.word 0xab2ab474 -//.word 0xccef35c5 -//.word 0x9b77f7ac -//.word 0x9e87bfab -//.word 0xde50091b -//.word 0xe095a071 -//.word 0xd60b6bbf -//.word 0x17058a7e -//.word 0xcd50a28a -//.word 0xed5c746e -//.word 0x6d9db5e2 -//.word 0xb1311992 -//.word 0x46c3b221 -//.word 0xd2af786e -//.word 0x4b672916 -//.word 0x6815533a -//.word 0x5582ae82 -//.word 0xab36b061 -//.word 0x9fe15c9b -//.word 0x7af95b05 -//.word 0x49a54d8c -//.word 0xd5da6179 -//.word 0xd5c323f4 -//.word 0x636796c6 -//.word 0xad868363 -//.word 0xedc31027 -//.word 0x9b0994e0 -//.word 0xe027aa8d -//.word 0x4fbd8565 -//.word 0xd05c831b -//.word 0xdce90461 -//.word 0xf0427cab -//.word 0x3b24c735 -//.word 0x9a4dbd47 -//.word 0xc7dd07b8 -//.word 0xce0231b1 -//.word 0xc0d4ffb3 -//.word 0xaa7e05db -//.word 0xc89f7265 -//.word 0xf7f02d70 -//.word 0x69262300 -//.word 0x9c1adf49 -//.word 0x8d275b2b -//.word 0x29d315f9 -//.word 0x04b2667e -//.word 0x4d880f42 -//.word 0x02ae1509 -//.word 0x60b7d09d -//.word 0x9e523ecd -//.word 0xda729db6 -//.word 0x54ad3841 -//.word 0xdae281ed -//.word 0x831f60cf -//.word 0xa0c2cbd7 -//.word 0xf0de9754 -//.word 0x13e08dba -//.word 0x4172c1a3 -//.word 0x3c9f1f15 -//.word 0x83384703 -//.word 0xc9779b16 -//.word 0xa5e395ad -//.word 0x8b735f22 -//.word 0xfbf69d4f -//.word 0xf8b28d50 -//.word 0xbc4c538b -//.word 0xaae88eee -//.word 0x84902f78 -//.word 0xdeda8bfb -//.word 0xd3c5af20 -//.word 0xf6e5f3ab -//.word 0x8bc0d200 -//.word 0xf877f8e6 -//.word 0x76a99d8c -//.word 0x0c9412ca -//.word 0xbe7d99a8 -//.word 0x02527a24 -//.word 0x738f5330 -//.word 0xc95eb0fb -//.word 0x0902db71 -//.word 0xf975f605 -//.word 0xd75046ae -//.word 0x4aecd22f -//.word 0x99c72d9c -//.word 0x1b29901a -//.word 0xef072be6 -//.word 0xec27bd99 -//.word 0xdb8563aa -//.word 0xe4f6ad34 -//.word 0x470bf7f9 -//.word 0x4d38f7a8 -//.word 0x7d35925b -//.word 0x12a5f464 -//.word 0xadf6df49 -//.word 0x4888430d -//.word 0x6b1110b1 -//.word 0xa24048fb -//.word 0x2ea05876 -//.word 0xfbc0a8ba -//.word 0xd29171ed -//.word 0xd00fcf8a -//.word 0x17231761 -//.word 0xc3c86ae0 -//.word 0x206e8a90 -//.word 0x1a9bede2 -//.word 0xf4d8102c -//.word 0x3dcb0eef -//.word 0x00a1715b -//.word 0x3caf4815 -//.word 0x93587a37 -//.word 0x46315999 -//.word 0x61637a4f -//.word 0x3351c572 -//.word 0x017bc824 -//.word 0xfca250ce -//.word 0x6f2e3bac -//.word 0x3dcc888c -//.word 0x8b5bb0d2 -//.word 0xba0939c0 -//.word 0x98b988f4 -//.word 0xd7a9f732 -//.word 0xbe512764 -//.word 0x1e8e98df -//.word 0x88ff76e8 -//.word 0xbdafb677 -//.word 0x66f5623b -//.word 0x059931dd -//.word 0x2c385b89 -//.word 0xedeaabab -//.word 0x9121d6f6 -//.word 0x8cd50bab -//.word 0xb1decb18 -//.word 0xa3a1fb5f -//.word 0x8cee3878 -//.word 0x11296a79 -//.word 0x85a89c15 -//.word 0x5c5d0b63 -//.word 0xe3b57ce1 -//.word 0x2fbfd3b9 -//.word 0x5391e243 -//.word 0xd7e87fca -//.word 0x650ed993 -//.word 0xc4010c1b -//.word 0x0bd1f2a1 -//.word 0x0e4a3ce4 -//.word 0x1dd3c22e -//.word 0xee961891 -//.word 0xd7e16271 -//.word 0x40cc6943 -//.word 0x591dee93 -//.word 0x08683e4c -//.word 0x267b0634 -//.word 0xeaf969b6 -//.word 0xa54450e4 -//.word 0xb0a001bc -//.word 0xa396f4aa -//.word 0xc897e14f -//.word 0xd0e21e81 -//.word 0xc4a82893 -//.word 0x3e6d80d6 -//.word 0xd8b1b85f -//.word 0xe5d0cd0b -//.word 0x5f27b7c1 -//.word 0x21783ff7 -//.word 0x568f1178 -//.word 0x32261264 -//.word 0xe007f378 -//.word 0xbb70078f -//.word 0xc0bb5169 -//.word 0x433ee2ac -//.word 0xe2716228 -//.word 0xb84eec5f -//.word 0xd3fe1f45 -//.word 0xe7b17144 -//.word 0x43cec783 -//.word 0x054c4368 -//.word 0x8a5f5d5c -//.word 0x295836ce -//.word 0x21c6287a -//.word 0xcfe2a2eb -//.word 0x252a333e -//.word 0x574be42a -//.word 0xd744cb3d -//.word 0x84c9dd68 -//.word 0x1fe504be -//.word 0xfee47279 -//.word 0x0470343e -//.word 0xd0fa0aa2 -//.word 0x355c76ec -//.word 0xeabc131c -//.word 0x83b3282d -//.word 0xa0ae7d98 -//.word 0x65956d19 -//.word 0x2aab3db5 -//.word 0x73b6acfc -//.word 0x225fcb8c -//.word 0xebdb0fd6 -//.word 0x09cba525 -//.word 0x2f6105dc -//.word 0xc2c5cafe -//.word 0x45b7c1f4 -//.word 0x1575408b -//.word 0x56dfb93d -//.word 0x2dd98eb1 -//.word 0x2ff12785 -//.word 0x1a42434a -//.word 0xc3978bd0 -//.word 0x50d46da4 -//.word 0xa79227d8 -//.word 0x270a2202 -//.word 0x95348287 -//.word 0x5930fb1a -//.word 0xeae4e67f -//.word 0x87e79495 -//.word 0x289de293 -//.word 0xb4a40d92 -//.word 0x746fc84c -//.word 0xc8318c23 -//.word 0x18fd3065 -//.word 0x0e2bb9ce -//.word 0x02fd734e -//.word 0xb683410d -//.word 0x44bb31ad -//.word 0x54fd53cf -//.word 0x9296ccd8 -//.word 0x60b426f5 -//.word 0xc782ea5c -//.word 0xb49371d5 -//.word 0x6184f779 -//.word 0x11ddf1ba -//.word 0x0039a0a4 -//.word 0x9aa7e763 -//.word 0xeb4f5a04 -//.word 0x57599780 -//.word 0x8b0ad9f6 -//.word 0xb330ca38 -//.word 0xedc19989 -//.word 0xfebf4da5 -//.word 0x455e5902 -//.word 0xed697056 -//.word 0x66e29a59 -//.word 0x15e988cc -//.word 0x4ade24ba -//.word 0x73ca6dfe -//.word 0x90fb8205 -//.word 0xe7effcd5 -//.word 0xf974814e -//.word 0xb40c97b0 -//.word 0xea96b55e -//.word 0x022ba0e2 -//.word 0xee47f530 -//.word 0x5d29012f -//.word 0x317cd975 -//.word 0x3336a752 -//.word 0x05c14311 -//.word 0x5959037a -//.word 0x61b5d39c -//.word 0x86e988c9 -//.word 0x5d8b71e1 -//.word 0xd7142fd4 -//.word 0xb88ac762 -//.word 0x4a5cf625 -//.word 0x528ec5d2 -//.word 0x43155cbc -//.word 0xb2851b99 -//.word 0x0ae9e789 -//.word 0x81f2c254 -//.word 0x4a559ff3 -//.word 0x0c6e7453 -//.word 0x94299055 -//.word 0xc7222f19 -//.word 0xda0b4c7c -//.word 0xc54fb6df -//.word 0xf4f4662b -//.word 0x40c61011 -//.word 0x1fb2f897 -//.word 0x177007d0 -//.word 0x79651eea -//.word 0x4bc7aa6f -//.word 0x860279c4 -//.word 0x825accf6 -//.word 0xaed2adb5 -//.word 0x844d82a1 -//.word 0xbcf4e3c5 -//.word 0xc0d7a961 -//.word 0x61d747ed -//.word 0xc8c35e5a -//.word 0xafc18b9b -//.word 0xd1f08464 -//.word 0x9e4b6332 -//.word 0x34d1418b -//.word 0x8be30787 -//.word 0xefed818f -//.word 0xb448b465 -//.word 0x255f7264 -//.word 0xbd112b0a -//.word 0x9a5706b3 -//.word 0x2e2730a7 -//.word 0x38987457 -//.word 0xf2460de4 -//.word 0x8cf8b8e1 -//.word 0xda800d5a -//.word 0x4ae30e15 -//.word 0x18ba0117 -//.word 0xc5d87b6a -//.word 0xc52dbe1e -//.word 0x78ea448e -//.word 0x5be69ce5 -//.word 0x804175e0 -//.word 0x3b47f9d5 -//.word 0x1f975cf4 -//.word 0x2884b4cd -//.word 0x3abb0b12 -//.word 0xca26b29e -//.word 0xdb11d9b7 -//.word 0x2d8c5d90 -//.word 0xb110e112 -//.word 0x3f6520dc -//.word 0x8bc28189 -//.word 0x5637ed31 -//.word 0xe148dd32 -//.word 0xa7dbb730 -//.word 0x4b545a5a -//.word 0xd0fef7ef -//.word 0x08ad2401 -//.word 0x4fa12b7a -//.word 0x79aea85c -//.word 0x089a534d -//.word 0xa2c71a52 -//.word 0xc31173db -//.word 0xb0faf000 -//.word 0xac05130a -//.word 0x6d5f6535 -//.word 0xd1c4c2b4 -//.word 0xcea1f7f6 -//.word 0xa7768f28 -//.word 0x667fe9fb -//.word 0x86938ea7 -//.word 0xf04cc230 -//.word 0x296859e7 -//.word 0xc96fcc35 -//.word 0x2f968c94 -//.word 0x73e496de -//.word 0x9c9348ca -//.word 0x13b973b3 -//.word 0x5828b19c -//.word 0xf492f972 -//.word 0xaff17090 -//.word 0x02258289 -//.word 0xcfdf3221 -//.word 0x50bfae9c -//.word 0x4eb9273c -//.word 0x93bddf05 -//.word 0xa19784c3 -//.word 0xa414bc4e -//.word 0xa666010d -//.word 0x02c9afb9 -//.word 0x1b675b63 -//.word 0x4d7967b9 -//.word 0x24b0d385 -//.word 0xccd35676 -//.word 0xc9a9ae23 -//.word 0xe819344d -//.word 0x7690b364 -//.word 0xafa37a4d -//.word 0x79f6b063 -//.word 0x535ce8bc -//.word 0x883ff5ad -//.word 0xa8430090 -//.word 0x3826d8c4 -//.word 0xa9eb88f6 -//.word 0x87372f9f -//.word 0xf3fb0cce -//.word 0x5353d928 -//.word 0x48ae5a2d -//.word 0xe13035bd -//.word 0x0e5404da -//.word 0x57d6a9af -//.word 0xcdd0e1d1 -//.word 0x41231dc6 -//.word 0xb5188dc4 -//.word 0x10477dba -//.word 0x16b8e495 -//.word 0x96493abc -//.word 0xe54f8bdc -//.word 0x8c80caeb -//.word 0x3e116767 -//.word 0x0d1b23df -//.word 0xdd4324b5 -//.word 0x189a4422 -//.word 0xa3c2af7a -//.word 0x1153adb2 -//.word 0x177cbc1f -//.word 0x40eee280 -//.word 0xe2f5413f -//.word 0x51e8ecf4 -//.word 0x52c4f92b -//.word 0xd314d867 -//.word 0xd914e367 -//.word 0xb91535a7 -//.word 0x8b23c02a -//.word 0xdce69a77 -//.word 0xa3c698e2 -//.word 0x76521e0c -//.word 0xfee335ad -//.word 0xa97cde91 -//.word 0x9ef5a7e1 -//.word 0xf6597ba4 -//.word 0x298cbe85 -//.word 0xc6319ad7 -//.word 0x68ca93d6 -//.word 0xe5216230 -//.word 0xc8e800c4 -//.word 0x029c01a9 -//.word 0xdcaf2372 -//.word 0x30e527b0 -//.word 0xd9ffdfb9 -//.word 0x689789a8 -//.word 0x184b5ba5 -//.word 0x051d5f67 -//.word 0x981a81f6 -//.word 0x463ae7b6 -//.word 0x7a8880a1 -//.word 0xcf82e0d4 -//.word 0x83c34b4d -//.word 0x29df0ff3 -//.word 0x9d8f17d6 -//.word 0x3d0ebeb9 -//.word 0x56c2e1ce -//.word 0xdd1f38c0 -//.word 0x60c9e6f6 -//.word 0x3bf84e17 -//.word 0x0f2129c9 -//.word 0x70d3d5bf -//.word 0xdedff0f2 -//.word 0xf7bb262e -//.word 0xea2847d1 -//.word 0x2f139dd0 -//.word 0x76b97cfa -//.word 0xdd0f1a81 -//.word 0x6561a1b6 -//.word 0xa7398314 -//.word 0xc3820e80 -//.word 0x9aed40cf -//.word 0x3d94dc89 -//.word 0xa4debdec -//.word 0xa4a26b34 -//.word 0x1b8fec1a -//.word 0x6ecbdd9b -//.word 0x35dac1fa -//.word 0x34c29808 -//.word 0x8e6cb4a3 -//.word 0x354ec87d -//.word 0xa547421f -//.word 0xd2cada2d -//.word 0x5e3f6beb -//.word 0x10a60200 -//.word 0x827e357a -//.word 0x19e5b713 -//.word 0x3a0029b2 -//.word 0xbb9d3235 -//.word 0x9817d16e -//.word 0xe87af26b -//.word 0x0fe840fb -//.word 0x343c3b6d -//.word 0xf6ec8a9b -//.word 0x5a349228 -//.word 0x08714705 -//.word 0xb8cb423a -//.word 0xe71615e3 -//.word 0xcefadb78 -//.word 0x94521352 -//.word 0xc3d3ae6b -//.word 0xf9ee6666 -//.word 0xe0f752cf -//.word 0x5f86b7a3 -//.word 0x121e2213 -//.word 0xf80cb385 -//.word 0x6c92bcdc -//.word 0x57458bf9 -//.word 0xa3b48381 -//.word 0xf34a72e1 -//.word 0x91761e90 -//.word 0xa7082194 -//.word 0xb3dff748 -//.word 0x35c1565c -//.word 0xaa8abd1d -//.word 0xbe8950f7 -//.word 0xbe27e338 -//.word 0x4cc95516 -//.word 0x56f81ff4 -//.word 0x49c02ce1 -//.word 0x8155ec62 -//.word 0x05fda471 -//.word 0x712908c5 -//.word 0x33e50b54 -//.word 0xfa73f617 -//.word 0x6c33b70d -//.word 0x18c77c82 -//.word 0xab738191 -//.word 0x66ca26e8 -//.word 0xcf8745cb -//.word 0xa7b9c25c -//.word 0x1d236419 -//.word 0x41e2e3a6 -//.word 0xbb5042cd -//.word 0xbd295ec3 -//.word 0x36ecc8ac -//.word 0x4984d062 -//.word 0xfd28e272 -//.word 0x36801668 -//.word 0xe409024d -//.word 0x7abad36d -//.word 0xa2e89c5e -//.word 0x2e67ed3d -//.word 0x52f2a83b -//.word 0x11cc1058 -//.word 0xf6a8236f -//.word 0x04c72a73 -//.word 0xef608ef8 -//.word 0x8d44edf5 -//.word 0x87c26dc8 -//.word 0x54c8507a -//.word 0x684cc945 -//.word 0xa8ea0e53 -//.word 0x22cfafc9 -//.word 0xfbd52604 -//.word 0xa8efaf22 -//.word 0x61c85ac5 -//.word 0xd3a75e13 -//.word 0x1696b002 -//.word 0xdec3d4d2 -//.word 0xf526f4db -//.word 0xe9642f88 -//.word 0x02f433a4 -//.word 0x76800ed4 -//.word 0xe08e4165 -//.word 0xef5f1648 -//.word 0x5b17345b -//.word 0x1e1f71eb -//.word 0xe0c8e776 -//.word 0xb3314ab5 -//.word 0x006a79d9 -//.word 0xc1d95216 -//.word 0xf1ddcb5e -//.word 0x41b23e6f -//.word 0x0d95050f -//.word 0x8e284796 -//.word 0x511711ae -//.word 0xe8fca957 -//.word 0xdf801f2e -//.word 0xf2c324ee -//.word 0x7cff1f37 -//.word 0x33687e8e -//.word 0x13564aa6 -//.word 0x98a5ffdd -//.word 0x305c9a0a -//.word 0xf08ef376 -//.word 0x867e4d28 -//.word 0x6f062c66 -//.word 0x6a3a6778 -//.word 0x2c487daf -//.word 0x55a32ca6 -//.word 0xa36040c8 -//.word 0x65e0aa12 -//.word 0x33afd11a -//.word 0xddac2d51 -//.word 0xa16a1185 -//.word 0xa1d7c8aa -//.word 0x941be4d9 -//.word 0xbbc3d399 -//.word 0x161fb35e -//.word 0xd9e8674f -//.word 0x1a26eb4c -//.word 0xcc51e430 -//.word 0xf0b77c53 -//.word 0x0a1d6c54 -//.word 0xd2a95a15 -//.word 0x2d006606 -//.word 0x5bab00a7 -//.word 0x72bffc48 -//.word 0x0bbde813 -//.word 0x3bb79d4d -//.word 0xc5b414d9 -//.word 0x8d567bfe -//.word 0x50ba886a -//.word 0x93a00e76 -//.word 0xd9ccceab -//.word 0x19ac8f85 -//.word 0x6f3a7178 -//.word 0x12247e31 -//.word 0x862a821e -//.word 0x13c81c30 -//.word 0x751616e0 -//.word 0xd5ecf270 -//.word 0xf849c573 -//.word 0xb7f6498f -//.word 0xaf662d82 -//.word 0x39e1af63 -//.word 0x9de26d2a -//.word 0x82bd7873 -//.word 0xa984ab7f -//.word 0xdb2c3b7c -//.word 0x20ec8e06 -//.word 0x32e651ed -//.word 0x3109c539 -//.word 0x9836596b -//.word 0x70a17e06 -//.word 0xc47bb74e -//.word 0x54ceef50 -//.word 0x8da81022 -//.word 0xb97bd16c -//.word 0x74c4d027 -//.word 0x5febe0a5 -//.word 0x186aa4d2 -//.word 0x69325db9 -//.word 0xbf4a004a -//.word 0xdeba8c5a -//.word 0xd4a79aeb -//.word 0x2bbf35ae -//.word 0x63d8edc6 -//.word 0xa0d327cf -//.word 0x9fc7b71f -//.word 0xee5cb14b -//.word 0x5d747bed -//.word 0xb01127a5 -//.word 0x9673005e -//.word 0xdf8063d3 -//.word 0xe969d151 -//.word 0x5b8b41be -//.word 0x1693bbda -//.word 0x69e622c5 -//.word 0x844052c2 -//.word 0x309a6b3a -//.word 0xbd526b04 -//.word 0x3b8603e3 -//.word 0xedc0a350 -//.word 0xfad9d87a -//.word 0x6617d78c -//.word 0x41995a2e -//.word 0x1ef5aa4e -//.word 0xc71ffd20 -//.word 0x2f8d0363 -//.word 0xa898bce7 -//.word 0x56268c4c -//.word 0xe486910c -//.word 0x759b34bc -//.word 0xde3dfe8e -//.word 0x12dcae1b -//.word 0xdd66885f -//.word 0xd66bef05 -//.word 0x8f8036e5 -//.word 0x0ee1b4cc -//.word 0x815a167b -//.word 0x2d67f9f2 -//.word 0xa89ab9ee -//.word 0x483d83b0 -//.word 0xdb39b200 -//.word 0x98365872 -//.word 0x56041ae8 -//.word 0xfc394258 -//.word 0x391c0fcf -//.word 0x75c24fb6 -//.word 0x07773055 -//.word 0xa8605495 -//.word 0x275e230a -//.word 0x5f346530 -//.word 0x67ed10f5 -//.word 0x08785e78 -//.word 0x74962311 -//.word 0x34f65e91 -//.word 0x639d0ecb -//.word 0x1a8c4753 -//.word 0x2b9d8485 -//.word 0x12af3fc9 -//.word 0x2802bf16 -//.word 0x1ae432b5 -//.word 0x9a8efb48 -//.word 0x54494d0a -//.word 0x24d5f958 -//.word 0x860a8471 -//.word 0x4ec07d7a -//.word 0x99ed0dc5 -//.word 0x030dd052 -//.word 0x1ac7e396 -//.word 0x13cd3f7c -//.word 0xbc0445aa -//.word 0xb2e59905 -//.word 0xd4233477 -//.word 0xf78db5f0 -//.word 0xdc37f8aa -//.word 0x5fd4eab2 -//.word 0xf0679ca4 -//.word 0x471b96b5 -//.word 0x546e6df7 -//.word 0x759598d9 -//.word 0xec1c7fed -//.word 0x90ced5ef -//.word 0xc2d42802 -//.word 0xa321b63c -//.word 0x850d8365 -//.word 0x9f3fa8fc -//.word 0x04d1ee7b -//.word 0xd6af9bdd -//.word 0xb6408c5c -//.word 0x8049847f -//.word 0x350ec454 -//.word 0x39badcfa -//.word 0xbf00c063 -//.word 0x81031e58 -//.word 0xb473efbe -//.word 0x3bf94d17 -//.word 0x1bd6844c -//.word 0x2fc76ba9 -//.word 0x1d2bf529 -//.word 0x886703f4 -//.word 0x878a7c26 -//.word 0x562da0d2 -//.word 0x4c9e9947 -//.word 0x0d3d5391 -//.word 0x01258e43 -//.word 0x050f3274 -//.word 0x6074e208 -//.word 0xf8f2d331 -//.word 0xc6f1df34 -//.word 0x8786d571 -//.word 0xb498149e -//.word 0xb5415853 -//.word 0x5276d3cb -//.word 0x6aeb80e9 -//.word 0xe731b479 -//.word 0xf121f6b9 -//.word 0x627e1017 -//.word 0x7ad6663d -//.word 0xd5a9874b -//.word 0x99ce0263 -//.word 0xf4117b6b -//.word 0xc621fd0e -//.word 0x9aaa9204 -//.word 0xdbbe1194 -//.word 0x45793857 -//.word 0x99e5fa3e -//.word 0x951b1ad6 -//.word 0x23abf9cb -//.word 0xd13eadac -//.word 0x817a52ed -//.word 0x6126a532 -//.word 0x1e8fcfcb -//.word 0x552a7e7a -//.word 0x4b7a3a7d -//.word 0xdd34f7c8 -//.word 0xbaa2e693 -//.word 0xcf459114 -//.word 0x03be278e -//.word 0x25ef148a -//.word 0x225dd564 -//.word 0x7cd80b0a -//.word 0xf75fce01 -//.word 0x963e43a9 -//.word 0xc57971c1 -//.word 0xd86d502d -//.word 0xb4b523f7 -//.word 0xcc4b0895 -//.word 0x50efce6a -//.word 0xa0cd068f -//.word 0x075a5dd2 -//.word 0xa67f29ff -//.word 0xaef9415f -//.word 0xd300127f -//.word 0xfd26ef32 -//.word 0x4083a9d9 -//.word 0x0e0f60e2 -//.word 0xab4f988f -//.word 0xe2348ff9 -//.word 0xf740cf54 -//.word 0xdceaff74 -//.word 0xa744fe90 -//.word 0x44db3347 -//.word 0x67de1ee0 -//.word 0xc58333d6 -//.word 0x84a7e994 -//.word 0xf0b50e7d -//.word 0x6fc85d2f -//.word 0xb7145209 -//.word 0x3e823deb -//.word 0xf29a963c -//.word 0x2ba69032 -//.word 0xde14f04d -//.word 0x131d2025 -//.word 0x99a47f66 -//.word 0xf861fc19 -//.word 0xa73ee325 -//.word 0x7f01f615 -//.word 0x702cc01b -//.word 0x73212655 -//.word 0xbf8a3f50 -//.word 0x40f866cb -//.word 0x45ca8dbd -//.word 0x7951d499 -//.word 0x14325ad0 -//.word 0x520b5297 -//.word 0x25595aec -//.word 0x269909d3 -//.word 0xd2adc7e6 -//.word 0xf382e20c -//.word 0x5cf0de89 -//.word 0xd9e10c37 -//.word 0x66b65e12 -//.word 0x9fe679fa -//.word 0x78e80cb5 -//.word 0x2e546034 -//.word 0x7e453117 -//.word 0x1401bd73 -//.word 0x46dc1ad2 -//.word 0x0259cc7b -//.word 0x059397f4 -//.word 0x4edb92c6 -//.word 0xd3a37d80 -//.word 0x729b54fe -//.word 0x2a1924eb -//.word 0x8bbe1e85 -//.word 0x6b57eaa0 -//.word 0xdb013eee -//.word 0x5a91ae7d -//.word 0x4832c681 -//.word 0x9d505654 -//.word 0xdab50dbb -//.word 0x40f2496b -//.word 0x40012ecc -//.word 0x3428f6fc -//.word 0x4c208717 -//.word 0xcb774bb6 -//.word 0x73333cb5 -//.word 0x3db83e3a -//.word 0x4eecb2f2 -//.word 0x2798489e -//.word 0x1c1214cf -//.word 0x0719e5ed -//.word 0x3d00d27e -//.word 0xc10f15a5 -//.word 0xb8261de9 -//.word 0x1da3de38 -//.word 0xb6866c2c -//.word 0x47d3c88d -//.word 0x0538f916 -//.word 0x4df05f7c -//.word 0x96e745ac -//.word 0xa51fb554 -//.word 0x005290a6 -//.word 0xa4d9de59 -//.word 0xfacc62f0 -//.word 0x086b713e -//.word 0xe4bc052a -//.word 0x6f760eb0 -//.word 0x3f1e0828 -//.word 0xdd70d2cb -//.word 0x3100be73 -//.word 0x3a21e5a2 -//.word 0x0306bdc6 -//.word 0xd227edbb -//.word 0xa2e65f92 -//.word 0xd3739791 -//.word 0x21ed447a -//.word 0xd3ca1511 -//.word 0x3478ced8 -//.word 0x47449b1d -//.word 0xb77ca436 -//.word 0x0dd0e10c -//.word 0x25fe30d6 -//.word 0xe3afa527 -//.word 0x229b212b -//.word 0xedf4262d -//.word 0xf202e95d -//.word 0x330ba9d1 -//.word 0xff7540c9 -//.word 0x212ef837 -//.word 0x574c9f7f -//.word 0x06f1de7b -//.word 0x2b72c6c2 -//.word 0x95b8ac2a -//.word 0x52e6378b -//.word 0x673bb7c6 -//.word 0xc43bb806 -//.word 0x7609d846 -//.word 0x1f18d514 -//.word 0xa302ea94 -//.word 0x25b85cc7 -//.word 0x32dc500d -//.word 0x3b6bdfe9 -//.word 0x499f6c05 -//.word 0xec143576 -//.word 0x74292940 -//.word 0x64a9fa1d -//.word 0x24ab727a -//.word 0xf6b60ac3 -//.word 0x2b29b9e0 -//.word 0x97da0a00 -//.word 0x42fe7195 -//.word 0x6049df9f -//.word 0x8456942e -//.word 0x10483522 -//.word 0xf0b21e36 -//.word 0x88b4f93d -//.word 0xea678fab -//.word 0x4d7bdf56 -//.word 0xbb1f6d7e -//.word 0x0921dd0b -//.word 0x0c57c017 -//.word 0x0a3daeac -//.word 0x6fdf95cf -//.word 0xc1fa50bd -//.word 0xd65e7c74 -//.word 0x45968775 -//.word 0x1acb09c9 -//.word 0xcee65842 -//.word 0x76f55703 -//.word 0x3ad08e42 -//.word 0x09fc804d -//.word 0x8bcf38cb -//.word 0x57d52645 -//.word 0x677329e5 -//.word 0xc8caed7d -//.word 0x96de77ca -//.word 0x28f8fefb -//.word 0x8849fd6d -//.word 0x26cf86b9 -//.word 0xcd7dd9f0 -//.word 0xd5963525 -//.word 0x9b5aee2c -//.word 0x2ee4c0a2 -//.word 0x4b53632d -//.word 0x8c285f05 -//.word 0xdcef22b4 -//.word 0x2e22501a -//.word 0x6f4a5ab3 -//.word 0xb867521d -//.word 0xc992fed4 -//.word 0xb3e12b41 -//.word 0xd48b43f3 -//.word 0x084c222c -//.word 0x1e0b269f -//.word 0x89bb8578 -//.word 0x587fe49d -//.word 0x69112533 -//.word 0xd9648065 -//.word 0xbe88d560 -//.word 0x19cf40a2 -//.word 0x062eef75 -//.word 0x36e530b6 -//.word 0x9f62cedb -//.word 0x72639e35 -//.word 0x4e5c5571 -//.word 0xb3189c65 -//.word 0xb9a2670a -//.word 0x026682c4 -//.word 0xed946cea -//.word 0x0cc56982 -//.word 0xd9e1d34c -//.word 0xa440b103 -//.word 0xd00f8bdf -//.word 0x3ff67c5e -//.word 0x0bf78844 -//.word 0x779a30e0 -//.word 0x25474492 -//.word 0x89f3f98a -//.word 0x9dff3bd2 -//.word 0xd65c448f -//.word 0x57f46e84 -//.word 0x664545d7 -//.word 0x1c4fe118 -//.word 0x60b1737f -//.word 0x160f1d75 -//.word 0x93b60756 -//.word 0x5483af76 -//.word 0xf0018062 -//.word 0x4cd1a768 -//.word 0x0e4f2259 -//.word 0x5472198d -//.word 0xa5f47228 -//.word 0x28b3a09c -//.word 0x1358bb6f -//.word 0x6736d63f -//.word 0xdb758d03 -//.word 0x156fdd93 -//.word 0x205a396b -//.word 0x1b28d9ab -//.word 0x2eab5663 -//.word 0xc3fd740e -//.word 0xf21f3e5c -//.word 0x3ce05935 -//.word 0x7d0092fa -//.word 0x1c96b90e -//.word 0x85afb295 -//.word 0xd938c97b -//.word 0xe31e46b8 -//.word 0x4fb341d3 -//.word 0x1654b8a5 -//.word 0x3d49df60 -//.word 0xbfecb7d0 -//.word 0xc80de2e0 -//.word 0x2396b65f -//.word 0xf66b9004 -//.word 0xad946bb0 -//.word 0x349eb1f4 -//.word 0x693e50d3 -//.word 0xd13811c9 -//.word 0x897f260c -//.word 0x809e0111 -//.word 0xe4566d52 -//.word 0xda89d74f -//.word 0x7257ecd2 -//.word 0xda866a78 -//.word 0xd2272f6d -//.word 0x5f769777 -//.word 0xc4030436 -//.word 0xae0fbeaa -//.word 0xaf39fef5 -//.word 0xed5a4562 -//.word 0x1cadf2a7 -//.word 0xa9331467 -//.word 0x38557dfb -//.word 0x51cc1872 -//.word 0x56be7cd6 -//.word 0xb929c0b1 -//.word 0x6b8591d0 -//.word 0x98a58347 -//.word 0x91dfa5b6 -//.word 0x0a6c58ca -//.word 0x85116106 -//.word 0x0eff3cc3 -//.word 0x29f9b375 -//.word 0x09b4b031 -//.word 0x0283506c -//.word 0x41343806 -//.word 0xbb342c87 -//.word 0x63fadea8 -//.word 0xa0a30315 -//.word 0xfedaac71 -//.word 0x24fbd49a -//.word 0x0678352f -//.word 0x5b7b6150 -//.word 0x52cd0da5 -//.word 0x80f6b0a2 -//.word 0x1da64d09 -//.word 0x71538cb0 -//.word 0x89241084 -//.word 0x2e0e05ce -//.word 0x183df8b5 -//.word 0x5eb5ec04 -//.word 0x3139aa2e -//.word 0xca6b5890 -//.word 0xa1364df5 -//.word 0xe069245f -//.word 0x17a40f05 -//.word 0x31786e98 -//.word 0xa7caa1ca -//.word 0xf3781a11 -//.word 0x4840b6a8 -//.word 0x80dd4dd8 -//.word 0x56728875 -//.word 0xd52cf2ab -//.word 0x102352fb -//.word 0x14823980 -//.word 0x1be8d777 -//.word 0x020e12fe -//.word 0xfda9da1c -//.word 0x8a92b602 -//.word 0xa324a390 -//.word 0x38e51f1b -//.word 0xdc69816e -//.word 0xbf748b0e -//.word 0xdc5f42c3 -//.word 0x73bdfd53 -//.word 0xba3ebd91 -//.word 0xd0d3bc96 -//.word 0xf212494f -//.word 0xf1ddd238 -//.word 0xe33e4366 -//.word 0x19968fcb -//.word 0x52f78bb6 -//.word 0x2ece0399 -//.word 0xe6c5080f -//.word 0x39e7871d -//.word 0xaa0520b8 -//.word 0xe8593488 -//.word 0x8e6a40ec -//.word 0x0c2f6a3e -//.word 0xe5775a58 -//.word 0x1c894b57 -//.word 0xe807629f -//.word 0xaf183e1f -//.word 0x32c5d0d6 -//.word 0x06a46d95 -//.word 0x43b42107 -//.word 0x808947f0 -//.word 0xfea956b2 -//.word 0x2335fe15 -//.word 0x2acc7447 -//.word 0x1aac0a22 -//.word 0xf41a02ae -//.word 0x3105a4e7 -//.word 0x6be68ec0 -//.word 0x5bea4c67 -//.word 0x035328cb -//.word 0x2c1b435c -//.word 0x13dbe511 -//.word 0x60ec12b0 -//.word 0x57cc5e4a -//.word 0x52c30204 -//.word 0x6fc62e1e -//.word 0x869ba12d -//.word 0x5e3e78ab -//.word 0x208443b2 -//.word 0x0bfe5e05 -//.word 0x6a207f50 -//.word 0xc3a28bb1 -//.word 0x5227ae76 -//.word 0xb51daa29 -//.word 0xe9e46fca -//.word 0x7532ed5b -//.word 0xe5b626a2 -//.word 0x7afb872a -//.word 0x2090788b -//.word 0xa06632eb -//.word 0x1779d0c5 -//.word 0xa7b2a9e9 -//.word 0x6c0cdec4 -//.word 0xb2f72fe2 -//.word 0x65fa13b1 -//.word 0xc89b0788 -//.word 0x6a8326e7 -//.word 0x57defa01 -//.word 0x8b019277 -//.word 0xac4fd467 -//.word 0xf85d15a5 -//.word 0x7c54e748 -//.word 0x86973269 -//.word 0x5ea68727 -//.word 0x3143b0ee -//.word 0x4ed38cfa -//.word 0x95061a16 -//.word 0x2bbad3aa -//.word 0x731d3df4 -//.word 0x3a12bd96 -//.word 0x32d7ac51 -//.word 0xa2e4ae10 -//.word 0x5b163f28 -//.word 0xee0c8fde -//.word 0x1cd2902a -//.word 0x8ebc4dba -//.word 0xc7957d3a -//.word 0x56f958d3 -//.word 0x5000a9f1 -//.word 0xfd1d254a -//.word 0xd245fb1c -//.word 0x9f53acb5 -//.word 0x0aab1d39 -//.word 0x3c1deba0 -//.word 0xda0dfefe -//.word 0x37d16107 -//.word 0xc85b50d2 -//.word 0xd81893dd -//.word 0x7c170b52 -//.word 0xca6e8b88 -//.word 0x46dae9cd -//.word 0x9da55463 -//.word 0x96cde7c8 -//.word 0x45627f3a -//.word 0x8230ca7b -//.word 0x999ea1d2 -//.word 0x43d69852 -//.word 0xd526d35e -//.word 0xb8a61b6d -//.word 0x191c300b -//.word 0xe11c6121 -//.word 0xe8745b75 -//.word 0x65c73f74 -//.word 0xaa77f730 -//.word 0x0ec8c9a5 -//.word 0x2a432c40 -//.word 0x4859dba2 -//.word 0x184929a1 -//.word 0xa544948f -//.word 0x88ce9cbf -//.word 0x5b67d646 -//.word 0x716b3cff -//.word 0xc437c7d2 -//.word 0x2f8d4035 -//.word 0xde3a53f2 -//.word 0x02f5e52b -//.word 0xc98ba79c -//.word 0x8d39eb21 -//.word 0x4c59b778 -//.word 0x58421847 -//.word 0x4f69b961 -//.word 0x4eccb445 -//.word 0x6290a8e8 -//.word 0x3fe80cb4 -//.word 0x353ac3d0 -//.word 0x5f7df0a2 -//.word 0x1ee60b92 -//.word 0xc5c33511 -//.word 0x96a7c8da -//.word 0xeec73378 -//.word 0xbca40509 -//.word 0x37ea4741 -//.word 0xd1980fb2 -//.word 0x6662524a -//.word 0xba54fa1d -//.word 0x22b73864 -//.word 0x81381cc6 -//.word 0x764763d7 -//.word 0xd4be90df -//.word 0x53c33edc -//.word 0x85efb4ca -//.word 0x0bb0ba21 -//.word 0x08ebaba0 -//.word 0xd6e6cc49 -//.word 0xf866dcad -//.word 0x5014ec69 -//.word 0x922571f1 -//.word 0xf93a988c -//.word 0x3985d9a0 -//.word 0xb42ecf30 -//.word 0xf0f547a3 -//.word 0x491897c7 -//.word 0xe3773115 -//.word 0xe3f67737 -//.word 0xdf23d1c7 -//.word 0x9219fd5a -//.word 0xd5a4a7bd -//.word 0xcba53a7e -//.word 0x5bb8f5ae -//.word 0xe31541e6 -//.word 0x2ab44288 -//.word 0x97b5ac47 -//.word 0xa1fed8ea -//.word 0x8726174c -//.word 0x419246a8 -//.word 0xb6dda213 -//.word 0x2f7dde4a -//.word 0x0ca473ae -//.word 0xb665388d -//.word 0xd41832a3 -//.word 0xc2ffade1 -//.word 0x3e2a8b6d -//.word 0x6597dde9 -//.word 0xdf9eb0f8 -//.word 0x568c29fe -//.word 0x2c8fd528 -//.word 0x6dd23aad -//.word 0x02e8b253 -//.word 0x286e7934 -//.word 0x21ec04c2 -//.word 0x29fd9409 -//.word 0xacb00c34 -//.word 0xb62dff53 -//.word 0xab9c0e5b -//.word 0x3842716e -//.word 0x89edd35d -//.word 0xbd93636c -//.word 0x97362855 -//.word 0x760a948f -//.word 0x87da5dcf -//.word 0x39a888d0 -//.word 0xf194c750 -//.word 0x00ff045b -//.word 0xd2ef3ecb -//.word 0x67b59410 -//.word 0x07ce9f2d -//.word 0x32080503 -//.word 0xd7e54bd2 -//.word 0xc644ebfd -//.word 0x663ea70d -//.word 0xab4f1cf9 -//.word 0x43b69aa5 -//.word 0x101e33a8 -//.word 0xdb7d1252 -//.word 0x473d0fee -//.word 0x039a8044 -//.word 0x444b5162 -//.word 0x7364579c -//.word 0x227be1d2 -//.word 0x450990f1 -//.word 0x9f1469bc -//.word 0x7a0b29cd -//.word 0x9bf2d8d6 -//.word 0x75bea12d -//.word 0x9d03e188 -//.word 0x7ecc7e05 -//.word 0x4eca7a6d -//.word 0x41b2c8b9 -//.word 0xfce05ed5 -//.word 0x4c408ba5 -//.word 0x186e8b46 -//.word 0x941c5996 -//.word 0xb8b5c4f6 -//.word 0xf13fc54e -//.word 0x16861052 -//.word 0x9d77e904 -//.word 0x0fca397a -//.word 0xb9e4e1e2 -//.word 0xa5fb4ec3 -//.word 0xc87b4d86 -//.word 0x7da82134 -//.word 0x3285d481 -//.word 0x61f5ca0a -//.word 0xc3219cdb -//.word 0xc0192334 -//.word 0x29bed28d -//.word 0x29df49d7 -//.word 0x79a22805 -//.word 0xd42621cb -//.word 0xab6652a5 -//.word 0x1961d11c -//.word 0x19788845 -//.word 0xf717438a -//.word 0x049707ac -//.word 0x8e63a609 -//.word 0x0f5a901b -//.word 0xa575ec42 -//.word 0xc2aae7c3 -//.word 0x25104c10 -//.word 0x0943564a -//.word 0x9c0ac204 -//.word 0xb237274a -//.word 0xbbcf8ae1 -//.word 0xf26b2dd1 -//.word 0xd8dea921 -//.word 0xe1183ce2 -//.word 0x6d4b646f -//.word 0xf94cadf2 -//.word 0x973bc72a -//.word 0x9b66db6c -//.word 0x986b1fe8 -//.word 0x8b9da92e -//.word 0x55a981f1 -//.word 0x6f7af90a -//.word 0xd95941bf -//.word 0x53593646 -//.word 0xd0f27b85 -//.word 0x28eccb1c -//.word 0x0d7e8da5 -//.word 0x40b8a93a -//.word 0x041e9b38 -//.word 0xd496c643 -//.word 0x51840a8b -//.word 0x7e33984d -//.word 0x2f77059c -//.word 0xbf909e61 -//.word 0x0252fca1 -//.word 0x7a83d8fe -//.word 0xce852081 -//.word 0x77344996 -//.word 0xbd12e858 -//.word 0xe2a27c0f -//.word 0x9d118ef7 -//.word 0xca1bfd44 -//.word 0x5f2d9362 -//.word 0xa2c7db81 -//.word 0x99253751 -//.word 0xc21e2d0a -//.word 0x054c02b0 -//.word 0xe76d8a95 -//.word 0x00093e1f -//.word 0xaf568fcb -//.word 0x0c587a72 -//.word 0x1e4c5dcc -//.word 0x4f470932 -//.word 0x1c1b18a8 -//.word 0x117a811a -//.word 0xf55e69e6 -//.word 0x42a73c9b -//.word 0xd806fd00 -//.word 0xf11bda59 -//.word 0x58da04e5 -//.word 0xd633bdab -//.word 0xedf2b377 -//.word 0xc9e48c1f -//.word 0x743bc20a -//.word 0x4933b1f3 -//.word 0xabf6eeeb -//.word 0xf7bddb9d -//.word 0xb63978d6 -//.word 0x18317c45 -//.word 0x9e6ca57f -//.word 0x16d14c45 -//.word 0xcccd3c0a -//.word 0xfff5c4b0 -//.word 0x92ed0b93 -//.word 0x0488a4c8 -//.word 0xa23062a7 -//.word 0xfb896e86 -//.word 0x955196c8 -//.word 0xde8be817 -//.word 0x65dc80ed -//.word 0x4a359e59 -//.word 0xf4b2fc00 -//.word 0x01c25e62 -//.word 0x83896a5e -//.word 0x6982baf8 -//.word 0x3b69305b -//.word 0x0b58891a -//.word 0xa83035bb -//.word 0x143a6676 -//.word 0x380e683a -//.word 0xd7b430f1 -//.word 0xc10a3705 -//.word 0x49658923 -//.word 0xf87b183f -//.word 0x838157d8 -//.word 0xfb90047d -//.word 0x444d4590 -//.word 0xc8c9f74a -//.word 0x6ca643ff -//.word 0xc47c72a3 -//.word 0x827a028e -//.word 0x3551f97c -//.word 0x304d79d8 -//.word 0xc7c5953a -//.word 0xc2b6632e -//.word 0x0bab5237 -//.word 0xaae0be13 -//.word 0xf3a6c241 -//.word 0xfe094ec1 -//.word 0x58b1791b -//.word 0xf80618a2 -//.word 0x75988ffa -//.word 0x76bde7d8 -//.word 0x697c2109 -//.word 0x78a9cab6 -//.word 0xb852d0e6 -//.word 0xa45a9444 -//.word 0xcb644023 -//.word 0xc5f25bbf -//.word 0x6bce9bc5 -//.word 0x48aafa16 -//.word 0x4a030bc8 -//.word 0xbd4b8f6e -//.word 0x7a46449a -//.word 0x5cb5fda0 -//.word 0xf432f79c -//.word 0x7e5b6bb6 -//.word 0x133260a4 -//.word 0x20c4c371 -//.word 0x1609b97d -//.word 0x630c34c6 -//.word 0xa24bc565 -//.word 0x0e61b15c -//.word 0x3de2468e -//.word 0x0b876f0f -//.word 0xd48b879e -//.word 0xe6546b70 -//.word 0x3556d330 -//.word 0x5135e243 -//.word 0x9629fb50 -//.word 0xa2a7d700 -//.word 0x0d3ed402 -//.word 0x54bf9053 -//.word 0x15a0b7bc -//.word 0x82a2199c -//.word 0x10b200e7 -//.word 0x6f0dc06f -//.word 0xbfa88f62 -//.word 0x01cf9714 -//.word 0xcb0c4aff -//.word 0x404af609 -//.word 0x403a9905 -//.word 0xdcf6f67b -//.word 0x0de5e8ac -//.word 0xa5def7d1 -//.word 0x859029a4 -//.word 0x11211a21 -//.word 0xe1154f8e -//.word 0xb972c8b9 -//.word 0xbc21d481 -//.word 0xdc982a97 -//.word 0x95b63486 -//.word 0xdbeeaef1 -//.word 0x51a8701c -//.word 0xbbe488af -//.word 0xb6218cb6 -//.word 0xa77d2feb -//.word 0xf11d1138 -//.word 0x6bcfdc78 -//.word 0x11ee8c7e -//.word 0xf9870e58 -//.word 0x89b90dd4 -//.word 0xe8620944 -//.word 0xb2f8a97f -//.word 0xf0b45228 -//.word 0x47f6f833 -//.word 0x6fe534a4 -//.word 0xe755979a -//.word 0xe7ef3f8d -//.word 0x978ba7d4 -//.word 0x7ee1c36a -//.word 0x3d614df1 -//.word 0x7d5f5af7 -//.word 0x26733079 -//.word 0xd1205ba5 -//.word 0x81b3fee4 -//.word 0x8d6e6818 -//.word 0xe1e6e722 -//.word 0x67aae1a8 -//.word 0xbf252015 -//.word 0x36c66ee1 -//.word 0xf65e6212 -//.word 0x7ac97903 -//.word 0x45d06864 -//.word 0xd44eb182 -//.word 0xd19275c8 -//.word 0x89058986 -//.word 0xa00cccf2 -//.word 0x0330b76d -//.word 0x1f7d3507 -//.word 0x5127b544 -//.word 0x9d747e21 -//.word 0xa2d54352 -//.word 0xcd56f8ce -//.word 0xce39e48d -//.word 0x48def690 -//.word 0xcde75c23 -//.word 0x0999525f -//.word 0x3d8438f2 -//.word 0xf066e823 -//.word 0xe14d4610 -//.word 0x3ffc193a -//.word 0x1c901944 -//.word 0x206348f8 -//.word 0x7a31868b -//.word 0x1c796022 -//.word 0x28262a94 -//.word 0xa56f4d72 -//.word 0x77fce145 -//.word 0x8e4a7f16 -//.word 0x5d505034 -//.word 0x8e636a31 -//.word 0xf4575d2e -//.word 0xc1e70858 -//.word 0xf956b2b3 -//.word 0x26575617 -//.word 0x4e2b3d78 -//.word 0x2209d26a -//.word 0x78c2b3e3 -//.word 0xfba50443 -//.word 0x21a00893 -//.word 0x5ea9f20a -//.word 0x985cf8d6 -//.word 0xdae6aa19 -//.word 0x4c218231 -//.word 0x6300bc3c -//.word 0x552e67db -//.word 0xd0f2bd37 -//.word 0xeb56b042 -//.word 0x5d88c540 -//.word 0xec802585 -//.word 0x29e3f280 -//.word 0x5b28d7f8 -//.word 0xb9f9e396 -//.word 0xdcdc97a4 -//.word 0x73123d14 -//.word 0x39bf7cc4 -//.word 0x244c2a00 -//.word 0xdf0a6149 -//.word 0x7b18d554 -//.word 0x62866456 -//.word 0x8cbaef7f -//.word 0xf51369c4 -//.word 0x4ecd2de2 -//.word 0xf22595a0 -//.word 0x1dbdc854 -//.word 0x5841d3a8 -//.word 0x384bfc9e -//.word 0x488452d2 -//.word 0x440d8900 -//.word 0x881d05c5 -//.word 0xc7eb35aa -//.word 0x00ce225e -//.word 0xaea24843 -//.word 0x406fa42c -//.word 0xc8450e66 -//.word 0xf76ac9f5 -//.word 0x49b8591f -//.word 0x7d40942f -//.word 0x4833fc73 -//.word 0x4a034c87 -//.word 0x41c551d5 -//.word 0x7ddafb5d -//.word 0x94ceb4b2 -//.word 0x5680f045 -//.word 0x038306e6 -//.word 0xbcc53e88 -//.word 0x386e2b45 -//.word 0xb80b3ba2 -//.word 0x3dec8c13 -//.word 0xf8ca01c2 -//.word 0x02ae968c -//.word 0x4d0df04c -//.word 0xdb38395d -//.word 0x2df42a5a -//.word 0xff646928 -//.word 0x32301637 -//.word 0x0ae0a004 -//.word 0x9989dee3 -//.word 0x7bac5bfb -//.word 0xc45bf192 -//.word 0x379d998b -//.word 0xb914812c -//.word 0x05dd5f25 -//.word 0xa0b806ce -//.word 0x106936b1 -//.word 0x495eb948 -//.word 0x80000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00015220 -//// expected output -//.word 0xd34e6a8e -//.word 0xcef67262 -//.word 0xa956051b -//.word 0x3418db50 -//.word 0x0aec04c5 -//.word 0x37088a86 -//.word 0x059baa48 -//.word 0xcbcd6f65 -//.word 0x04a73548 -//.word 0x80dbc191 -//.word 0x0f9ffb0c -//.word 0xba8b77ff -//.word 0x75ca9da6 -//.word 0x856a7ef5 -//.word 0x22ff21d3 -//.word 0x9658170b -//// SHA512LongMsgvector_109 -//// vector length -//.word 0x00015538 -//// input message -//.word 0x1ebc2320 -//.word 0xc183fd3a -//.word 0xb71a10bb -//.word 0x418bc9ae -//.word 0x56c6ea17 -//.word 0xf4a0811e -//.word 0xb51b1b70 -//.word 0xa2e835e3 -//.word 0x4b2af359 -//.word 0x187d15e6 -//.word 0xda372635 -//.word 0xa5eef627 -//.word 0xe23a4bbe -//.word 0xa0bbd43a -//.word 0x2b5e5e81 -//.word 0xe0dd4ac4 -//.word 0x3f853f60 -//.word 0x423c1c02 -//.word 0xedc2310f -//.word 0x2737ae43 -//.word 0xc8de5b98 -//.word 0xf3208a69 -//.word 0xa6d44bd7 -//.word 0x8fbdde6c -//.word 0x22546efe -//.word 0xe8c8fcd6 -//.word 0x1a449912 -//.word 0x6e70d848 -//.word 0x313a836c -//.word 0x96d68df4 -//.word 0x4e034839 -//.word 0x5891d821 -//.word 0x1b20e8fb -//.word 0xb22a9baa -//.word 0x8744c506 -//.word 0x23a05c7f -//.word 0x44d72904 -//.word 0x30e5c323 -//.word 0x4a75be71 -//.word 0xe360202c -//.word 0x5270141f -//.word 0x4769e3c6 -//.word 0x5c4a1fb3 -//.word 0xedd02230 -//.word 0x2a3cb726 -//.word 0x6a56163d -//.word 0xc3b21645 -//.word 0xd7329ed5 -//.word 0xf0cc5c31 -//.word 0x508dba71 -//.word 0xc2de0ee0 -//.word 0x750711a3 -//.word 0x0af1939b -//.word 0xec306d8c -//.word 0xe040b67e -//.word 0xdd0f3a63 -//.word 0x1dbc27fb -//.word 0x749f0af5 -//.word 0xe189fa57 -//.word 0x634d131f -//.word 0x0d7f272a -//.word 0x5d7baf56 -//.word 0xcaa908e4 -//.word 0x9c00dc20 -//.word 0x00c9de43 -//.word 0x5ca6ba98 -//.word 0xe0d24bde -//.word 0x5eaa0fee -//.word 0x5b6dd99d -//.word 0x6640c6e4 -//.word 0xa875723e -//.word 0xbd0c6c52 -//.word 0xc27ae7d2 -//.word 0xafaab2a3 -//.word 0xe7426a3e -//.word 0x0e27ee56 -//.word 0x1b4313bb -//.word 0xae86997e -//.word 0xa32a5e56 -//.word 0xe73cd242 -//.word 0x8a58ab70 -//.word 0x16b4da5e -//.word 0x205fbd3f -//.word 0x1ccb96a0 -//.word 0x768a3c4b -//.word 0xde55106b -//.word 0xe35233f2 -//.word 0xc397f638 -//.word 0x81ea92e4 -//.word 0x39ca1a10 -//.word 0xb1b4ada8 -//.word 0x309ff013 -//.word 0x93c9bb16 -//.word 0x9db513f5 -//.word 0x8f7459db -//.word 0xf825c07b -//.word 0xcfb805f8 -//.word 0xbff75a02 -//.word 0xc2c6a343 -//.word 0xf1a9e4f9 -//.word 0x9b88fae4 -//.word 0x94af8a62 -//.word 0xcf1938d9 -//.word 0x2fee1955 -//.word 0x9b4a6a72 -//.word 0x5140827d -//.word 0x7c1f05d6 -//.word 0x08f35b98 -//.word 0xb54f607c -//.word 0x6a4a5dfb -//.word 0xcdc838b3 -//.word 0x10fbe70c -//.word 0x0d292a1b -//.word 0x96af7ac7 -//.word 0x06463c2a -//.word 0x1c853b3a -//.word 0x0aa755a8 -//.word 0xc88f7508 -//.word 0xae09c133 -//.word 0x425314e9 -//.word 0x4fdcaebb -//.word 0x374b2a28 -//.word 0x89c3b107 -//.word 0xd6656e25 -//.word 0xc117412e -//.word 0x5684b8d1 -//.word 0x9d643b1f -//.word 0x6efe8634 -//.word 0x86eb5d1a -//.word 0xdb1c7aea -//.word 0x2d1fcb34 -//.word 0xde9ddaa1 -//.word 0x03288dd7 -//.word 0xbb330f9d -//.word 0xc0620e40 -//.word 0x3b052735 -//.word 0xdddf9eff -//.word 0x2b2b5354 -//.word 0x19e1f17b -//.word 0xdb3569f8 -//.word 0xf8609f6b -//.word 0xa0a462b6 -//.word 0x3f8aa25e -//.word 0x526fdd34 -//.word 0x7a3edb34 -//.word 0xce7f9bad -//.word 0x76918da2 -//.word 0x76330270 -//.word 0xc74ae0b2 -//.word 0xacde9a62 -//.word 0x43655f41 -//.word 0x5a449278 -//.word 0x85937b7f -//.word 0x6d203c3e -//.word 0x6bb70672 -//.word 0x56a18c53 -//.word 0x996bb874 -//.word 0x88e99dea -//.word 0xf479aeb0 -//.word 0xfc8c2d4a -//.word 0x2763e6a9 -//.word 0xb0171c4f -//.word 0x21dcc4b3 -//.word 0x2386f1e7 -//.word 0x954d9078 -//.word 0xdbcd5596 -//.word 0x7951f574 -//.word 0xe05096f2 -//.word 0x8738837a -//.word 0x3e6b2527 -//.word 0xc0872f2d -//.word 0x87eb1875 -//.word 0xe477ce87 -//.word 0x4e92a9ad -//.word 0xfb729d55 -//.word 0xad98b5b8 -//.word 0xcf99bcb9 -//.word 0xc0243d10 -//.word 0x6f41afa7 -//.word 0x28d7e944 -//.word 0xad71dc69 -//.word 0x89418079 -//.word 0xa1660f1b -//.word 0x0c6a72e3 -//.word 0x240ff830 -//.word 0xdd4b4e50 -//.word 0x5691aceb -//.word 0xae524c9e -//.word 0x19c420e6 -//.word 0x33e2c440 -//.word 0x94b4b28e -//.word 0xa4d0b5bd -//.word 0xb021a0a5 -//.word 0x3ee73f30 -//.word 0x9eff8ebf -//.word 0xc26529c9 -//.word 0x50f704c5 -//.word 0xf47b5c4b -//.word 0xfbe4ed76 -//.word 0x1ed1668c -//.word 0x9b571ae1 -//.word 0x8b00f8f8 -//.word 0x6f13bdec -//.word 0x0c16680e -//.word 0x7992eed0 -//.word 0x761630e2 -//.word 0xff7e2a9a -//.word 0x21756d99 -//.word 0x0d39cfac -//.word 0x6b9f61f0 -//.word 0xf056a13a -//.word 0x336ff1b5 -//.word 0xbc1d48cd -//.word 0x5eba284c -//.word 0xc80bd0c3 -//.word 0x56c5b22c -//.word 0x2d5027cd -//.word 0x86ca6260 -//.word 0x4a4fa270 -//.word 0xe078ac06 -//.word 0x42217985 -//.word 0x57702cd3 -//.word 0x7d1347b9 -//.word 0x64c81d8d -//.word 0x23238b0e -//.word 0x858ce38f -//.word 0xa4872958 -//.word 0xba388249 -//.word 0x3326e9c0 -//.word 0x073f24bd -//.word 0x461cf644 -//.word 0xf5879703 -//.word 0x183a6135 -//.word 0x10eaccc6 -//.word 0x27849cb8 -//.word 0x6ab759c5 -//.word 0xb7b20046 -//.word 0x162ff853 -//.word 0x4cb0472c -//.word 0xae0806d7 -//.word 0x341e120b -//.word 0xceee054d -//.word 0xfbd06559 -//.word 0x97fd1bc3 -//.word 0xf44f26de -//.word 0x2d4890dd -//.word 0xb756a138 -//.word 0x39555452 -//.word 0x9e560758 -//.word 0x689f766c -//.word 0x47f3ea03 -//.word 0xea13ae8b -//.word 0x1584c352 -//.word 0xf493d4a3 -//.word 0xaf976c32 -//.word 0x3e7667b9 -//.word 0x7f6aa7e4 -//.word 0x8505086b -//.word 0x3373957d -//.word 0x0a00fc65 -//.word 0x40d93f68 -//.word 0x1217adec -//.word 0x5bf911e0 -//.word 0x64712957 -//.word 0xfee35976 -//.word 0xce29a191 -//.word 0xe9dacd91 -//.word 0xa1cceb99 -//.word 0x9ed702e9 -//.word 0x30dc0102 -//.word 0xe306f60a -//.word 0x54508073 -//.word 0x444887d8 -//.word 0xeb122a27 -//.word 0x8eaff905 -//.word 0x5480656e -//.word 0x5605749c -//.word 0xf5ebba2b -//.word 0x7046847a -//.word 0xb61b5654 -//.word 0x782198d0 -//.word 0x83c88c75 -//.word 0x4d7b83a2 -//.word 0xcd22512d -//.word 0x90ecfe4b -//.word 0x0a4bbeb0 -//.word 0x2a4023f7 -//.word 0x31d89243 -//.word 0xc3f7f427 -//.word 0x3e54adc3 -//.word 0x4cc5d230 -//.word 0xb4bd961f -//.word 0x761206bc -//.word 0x1604f7d9 -//.word 0x387c3c48 -//.word 0x6d911c88 -//.word 0x4d5003a5 -//.word 0xc6bd7759 -//.word 0xb3154e77 -//.word 0xb0561e89 -//.word 0x2d01f6b8 -//.word 0xc21f4bed -//.word 0xc2823536 -//.word 0x134ddc6b -//.word 0x3db72c11 -//.word 0xc00bd17e -//.word 0xabf35f3e -//.word 0x6af7d0b6 -//.word 0xe0413407 -//.word 0xb6a3a436 -//.word 0xf2db7889 -//.word 0xcb15ba34 -//.word 0xbbb1da34 -//.word 0xd747a27c -//.word 0x5ce86d4f -//.word 0x8aa794ed -//.word 0xb5582a71 -//.word 0x9998e9fa -//.word 0xee0e6b09 -//.word 0x3cf09e2a -//.word 0xf1c872d7 -//.word 0xb178d499 -//.word 0xed7be070 -//.word 0xb76f5275 -//.word 0xd4d03ebe -//.word 0x13070282 -//.word 0xdea3787d -//.word 0x0fe67096 -//.word 0x05835dc0 -//.word 0xf6a64e1e -//.word 0x8635206a -//.word 0x9955f297 -//.word 0x6631dab5 -//.word 0xcef7d616 -//.word 0xeb2206af -//.word 0xebff18c0 -//.word 0x1f6a03b8 -//.word 0x4fd9f853 -//.word 0x519d9505 -//.word 0xd9645d9b -//.word 0x93016520 -//.word 0x6f704ffd -//.word 0x3d147c65 -//.word 0x79447ef0 -//.word 0x6806cc86 -//.word 0x641aba7f -//.word 0x733ba808 -//.word 0x1fa179c9 -//.word 0x82ca47c5 -//.word 0xa17a5481 -//.word 0xfb014468 -//.word 0x61bc8a6e -//.word 0x07de21f4 -//.word 0xdc707ceb -//.word 0x1797bf3d -//.word 0x12162f68 -//.word 0x5c13e76c -//.word 0x0a1ecee8 -//.word 0x4d6fc580 -//.word 0x4a6f2581 -//.word 0x257b68c8 -//.word 0x5fe426e0 -//.word 0x633a446a -//.word 0x5bca68c2 -//.word 0x4865afdf -//.word 0x5263a37b -//.word 0x5ce86774 -//.word 0xdc663573 -//.word 0xea630bcb -//.word 0x977da0a4 -//.word 0x7fab9d58 -//.word 0xa2c50a1d -//.word 0x6f4706e5 -//.word 0x2252bc82 -//.word 0x50f3920e -//.word 0xc0a8a38a -//.word 0x7d2070c5 -//.word 0x2943d27f -//.word 0x947234cf -//.word 0x8e10fec2 -//.word 0xf9415445 -//.word 0x22f10145 -//.word 0x5119ae14 -//.word 0x9e3d580f -//.word 0x073a017e -//.word 0xc03ea5bb -//.word 0xca186f97 -//.word 0xc7b22df9 -//.word 0x0ddb02c8 -//.word 0xf94a5a0b -//.word 0x85e0234f -//.word 0x1d2e3b49 -//.word 0xaf3724bd -//.word 0x0277ff9f -//.word 0x4824b877 -//.word 0xf6b37e0a -//.word 0xd39e7636 -//.word 0x4f65b01e -//.word 0x17d35a87 -//.word 0xe6823382 -//.word 0x9ea1434c -//.word 0x97f5ca72 -//.word 0x371e7638 -//.word 0xc31cd83c -//.word 0x74111957 -//.word 0xce48e9c4 -//.word 0x2d77b984 -//.word 0xa1412a00 -//.word 0xfbffc5f1 -//.word 0x28c0ec7d -//.word 0xbe8e10a2 -//.word 0xd5f425d8 -//.word 0x18bd53f2 -//.word 0x1cfdef46 -//.word 0xf056a90d -//.word 0xf574070d -//.word 0xefda1275 -//.word 0x5de14f08 -//.word 0x06fdf07d -//.word 0xd5434c26 -//.word 0xe6288dd1 -//.word 0xe18ca8ec -//.word 0x87f793ec -//.word 0x8a22b2ef -//.word 0xa2b9929f -//.word 0xdd5fd95a -//.word 0x37f37d91 -//.word 0x6a11356e -//.word 0x07dc2dba -//.word 0xc6fbfefd -//.word 0x1ae2dde7 -//.word 0x095312ee -//.word 0x3b24ad39 -//.word 0x514274bd -//.word 0x78f61fa6 -//.word 0x3d67c8f8 -//.word 0xa3619d76 -//.word 0x7254d8c3 -//.word 0xd3a0f1c7 -//.word 0x1a0f1154 -//.word 0xe3a3cb09 -//.word 0x60930777 -//.word 0xf1903e83 -//.word 0xf54ced0b -//.word 0xe13d43cd -//.word 0x8f9f1d84 -//.word 0xd8b83553 -//.word 0x645f9667 -//.word 0xc1bf54d9 -//.word 0xb35979d1 -//.word 0xcb4842f1 -//.word 0x3bc98cf1 -//.word 0xe9fa8986 -//.word 0xc2e2b789 -//.word 0x51b21355 -//.word 0x904a8a71 -//.word 0xfeffb06f -//.word 0xf19cb413 -//.word 0x2ea694b8 -//.word 0xb7e58df0 -//.word 0xe41fd66b -//.word 0xb5278d1a -//.word 0x6717f293 -//.word 0x45d9d3b8 -//.word 0xc1ec4793 -//.word 0xc3649f85 -//.word 0x41339aa0 -//.word 0x10a8d851 -//.word 0xfa359142 -//.word 0x1075877e -//.word 0x416d39d7 -//.word 0x2c135a85 -//.word 0x330c810f -//.word 0xd1ba226f -//.word 0x2d76bd71 -//.word 0xef1a555c -//.word 0x52c324d4 -//.word 0x7ad58dff -//.word 0x093f52e7 -//.word 0xed00071f -//.word 0x7beac7aa -//.word 0xc2a52518 -//.word 0x19f865f2 -//.word 0xfb44ed58 -//.word 0x1551f6e9 -//.word 0x9c4d87e3 -//.word 0xe412a48b -//.word 0x2fa8c3d0 -//.word 0xc30b7f2b -//.word 0x3f2e90c9 -//.word 0x2e3ffbec -//.word 0xdd2d868f -//.word 0x6a686f49 -//.word 0x1ee85d73 -//.word 0xfc70978d -//.word 0x9a1474de -//.word 0x30f9135b -//.word 0xef5c4bca -//.word 0x94d5e527 -//.word 0x3cdd0947 -//.word 0x7a8ff7bb -//.word 0xa7abf8f7 -//.word 0x79e093b4 -//.word 0xd74b0392 -//.word 0xec3be902 -//.word 0x7b373f63 -//.word 0x72428d6b -//.word 0xc15d5fc9 -//.word 0x6c4ef608 -//.word 0xdfa03eb7 -//.word 0x83eb00c7 -//.word 0x8e555934 -//.word 0x1f596be8 -//.word 0x8ac752dc -//.word 0xf00c5980 -//.word 0x14b46e5d -//.word 0x692dd4f8 -//.word 0x70ce18fa -//.word 0x4017468f -//.word 0x663b5c0c -//.word 0xf0dbffd4 -//.word 0xc5156d7c -//.word 0x38bdb32d -//.word 0xdcea204a -//.word 0x99b5f953 -//.word 0xff3d6e0a -//.word 0xdbefcdd4 -//.word 0x0804f661 -//.word 0x884a0f8f -//.word 0xd328798c -//.word 0x6fdc023b -//.word 0xc1085cda -//.word 0x236dcee1 -//.word 0x37f6292d -//.word 0x7af8fe5d -//.word 0x1cb80e7d -//.word 0x0f2e02e2 -//.word 0x5e085c54 -//.word 0xc0f2ae73 -//.word 0x6d150953 -//.word 0x30ddb96a -//.word 0xbd002fac -//.word 0x46bc3ff4 -//.word 0x49608ca6 -//.word 0xac0d4092 -//.word 0x0bbe001c -//.word 0x51861f9a -//.word 0x851911fe -//.word 0xe78e23b5 -//.word 0x3c636acf -//.word 0x66c2f95f -//.word 0x37025725 -//.word 0x8771316a -//.word 0x84514b2c -//.word 0x4a20bc7b -//.word 0xb41d5b23 -//.word 0x7107758b -//.word 0x5a28c1dd -//.word 0x02929567 -//.word 0x8fa95942 -//.word 0xc9e13d31 -//.word 0x71c927cb -//.word 0xd449efdd -//.word 0xa027cf0a -//.word 0xf5d015b4 -//.word 0xbf561b20 -//.word 0x44b579d4 -//.word 0xf95a7944 -//.word 0x9ae6ccae -//.word 0x792f7b43 -//.word 0x17872087 -//.word 0xf14255fa -//.word 0x9c726df8 -//.word 0x14f562de -//.word 0x52b20f6e -//.word 0x1c1f9f75 -//.word 0x210746aa -//.word 0x458a2fda -//.word 0x3a65b542 -//.word 0x5073d53d -//.word 0x8e74e31f -//.word 0x010e7d60 -//.word 0x5411befd -//.word 0xa1ffb31b -//.word 0x87cc13ed -//.word 0x7de22ad9 -//.word 0x656817d6 -//.word 0x65c43719 -//.word 0xf25ee1f0 -//.word 0x2da754ee -//.word 0x735bed48 -//.word 0x2f039e7f -//.word 0xf3bd9b3f -//.word 0xc83f5688 -//.word 0xc21aae0b -//.word 0xd73c63d7 -//.word 0xf0b9ce34 -//.word 0x41cbcfcf -//.word 0xd6170618 -//.word 0x6f3146e9 -//.word 0x8e634668 -//.word 0xceaa9a2e -//.word 0x7602e2a9 -//.word 0x4ee342be -//.word 0xb20c12b3 -//.word 0xe47fd64d -//.word 0xa7cd7035 -//.word 0x099394a0 -//.word 0x80457d2f -//.word 0x382ade14 -//.word 0xaca81c77 -//.word 0x74c2ba18 -//.word 0x5ddf1535 -//.word 0xbfcd51ae -//.word 0x0b059367 -//.word 0xa43170ee -//.word 0xf0eba65e -//.word 0xaec80a83 -//.word 0x8a95c23e -//.word 0xeee0b42b -//.word 0x1cbb3e82 -//.word 0x7abc283b -//.word 0x2c48d776 -//.word 0xe811c319 -//.word 0x06de2bbb -//.word 0xd78b07c1 -//.word 0x38503ec6 -//.word 0x67461941 -//.word 0x1526f761 -//.word 0xbc54433c -//.word 0x321da429 -//.word 0x7f3d736a -//.word 0xeca5720f -//.word 0x5c7bbb16 -//.word 0xdf61f6d7 -//.word 0x85facfa0 -//.word 0x70aaa89c -//.word 0x2d9e8af9 -//.word 0x450d6249 -//.word 0x0ebd6a29 -//.word 0xc7c8e521 -//.word 0xe4a00fcc -//.word 0xa7515439 -//.word 0xf006c090 -//.word 0x56cfb7f9 -//.word 0x76a1e6b9 -//.word 0x8b9f799e -//.word 0x40978e9e -//.word 0xc2d0eabb -//.word 0x1803eb2a -//.word 0xb7a7beb3 -//.word 0x5171d25b -//.word 0xef1c8d41 -//.word 0x3f663dc6 -//.word 0x2f5b51f0 -//.word 0xbad5c911 -//.word 0x0244eba3 -//.word 0xa0ab3877 -//.word 0x38eb9e0f -//.word 0x5044ef48 -//.word 0x6219923b -//.word 0x2ff37966 -//.word 0x57c95207 -//.word 0x277f02c9 -//.word 0xb2ac4fa2 -//.word 0x23a0dcfc -//.word 0x51a65b13 -//.word 0x9486fe9e -//.word 0xd84e2eb1 -//.word 0xef5280e2 -//.word 0x2c72e5ab -//.word 0x2d9b210f -//.word 0xf8917e80 -//.word 0x4aebc101 -//.word 0x2b5f5d88 -//.word 0xc63fe7a6 -//.word 0x7844ca69 -//.word 0x278b3c82 -//.word 0xd5dd70a3 -//.word 0x74330d2b -//.word 0xfc79e005 -//.word 0xbc93cdcd -//.word 0xed9e0c35 -//.word 0x8d7892a8 -//.word 0x6b82cc2d -//.word 0x7ea4938d -//.word 0x7a925db8 -//.word 0xa54eb065 -//.word 0xe7efddf9 -//.word 0x21a0eaaa -//.word 0xc0ebd0e4 -//.word 0x9238e7eb -//.word 0xd8909ec3 -//.word 0x9ca76f4d -//.word 0x451a12b2 -//.word 0x68f5f104 -//.word 0xe178dd23 -//.word 0x231bffde -//.word 0xcccf115b -//.word 0x7d87ceb9 -//.word 0xe8f7a6f3 -//.word 0x2a9bb708 -//.word 0x5cfcf959 -//.word 0x642fb852 -//.word 0x119e484c -//.word 0x680bf4b2 -//.word 0x38d13763 -//.word 0xf56d2f58 -//.word 0xc23e4e87 -//.word 0xd0895307 -//.word 0xe7c07874 -//.word 0x4204ed95 -//.word 0xa0e8863c -//.word 0x9878b16e -//.word 0x2d7aaac4 -//.word 0xa2f3f211 -//.word 0x90edfd45 -//.word 0x35782a92 -//.word 0x0feff9cd -//.word 0xa97c7916 -//.word 0xb6deffbb -//.word 0x5c6a1d5a -//.word 0xd250d246 -//.word 0x2d20ff2c -//.word 0x778d1af7 -//.word 0x027026f0 -//.word 0xfb10e32a -//.word 0x42a0421d -//.word 0x79091b91 -//.word 0x5cea22be -//.word 0x50dd18b1 -//.word 0x3efd3ef1 -//.word 0xa1a50f63 -//.word 0xde7a2e6b -//.word 0xd5ab9e54 -//.word 0xb57731f2 -//.word 0x14f04385 -//.word 0x3fffa7e1 -//.word 0xcea9e2cc -//.word 0x7c9097a8 -//.word 0x36bd4352 -//.word 0x729c2b49 -//.word 0xc2489213 -//.word 0xa9092edc -//.word 0xad1cdd61 -//.word 0xadb2950c -//.word 0x753a9960 -//.word 0x90e3f398 -//.word 0x5d5d1e8b -//.word 0x66e003d3 -//.word 0xec70272e -//.word 0xc75f2224 -//.word 0x6d1353eb -//.word 0x500ad287 -//.word 0x6d1aa635 -//.word 0x21fe380a -//.word 0x3f0e08d8 -//.word 0x614e9f51 -//.word 0x7baac56f -//.word 0xb680f313 -//.word 0x7b5f0bec -//.word 0xcd0f479a -//.word 0xddd16f13 -//.word 0xd8e75046 -//.word 0x045769ff -//.word 0x0bede70b -//.word 0x977fd49c -//.word 0x1e748bef -//.word 0x00876f2b -//.word 0xcfc9dc8d -//.word 0xede55ec2 -//.word 0x5da82194 -//.word 0xd3c1a9c9 -//.word 0x0dc5c348 -//.word 0x6676bc7e -//.word 0xa944d000 -//.word 0x2314e572 -//.word 0xfc417aa7 -//.word 0xc7e0da09 -//.word 0x5749953c -//.word 0xd4d330fe -//.word 0x0fde1c52 -//.word 0x1317e5dd -//.word 0xfdf7ac90 -//.word 0x0d8dd787 -//.word 0xfc7e0731 -//.word 0x904a4ab2 -//.word 0x6fd09385 -//.word 0x31156766 -//.word 0xb841d86f -//.word 0xc4eab781 -//.word 0xc29506e5 -//.word 0xe57aac33 -//.word 0x78886c73 -//.word 0x73a91883 -//.word 0x4c4702b9 -//.word 0x0f0fb4c8 -//.word 0xb1f5e1e8 -//.word 0xa2789b31 -//.word 0xa127c548 -//.word 0xd464cc3e -//.word 0x186892b5 -//.word 0x9687ab45 -//.word 0x97b5cc1e -//.word 0x994a80ee -//.word 0xa1021d05 -//.word 0xd448f7b7 -//.word 0x41b4d301 -//.word 0x02d29f70 -//.word 0x8325603f -//.word 0x216b6bbf -//.word 0xf723d8fc -//.word 0xf44d349e -//.word 0x3171760d -//.word 0x82e234d9 -//.word 0x4c441758 -//.word 0x964c8d91 -//.word 0x62c7bd58 -//.word 0x3ddec0bb -//.word 0x15980e9d -//.word 0x4ba036a1 -//.word 0x0949d34a -//.word 0xd6cfbb60 -//.word 0x67e07995 -//.word 0xb85afe68 -//.word 0x5c57934a -//.word 0x126712ff -//.word 0x981c5648 -//.word 0xc4ccf0bf -//.word 0xd0921b02 -//.word 0xf696f313 -//.word 0x3c8ee1ff -//.word 0x92855abe -//.word 0x1adbc95b -//.word 0xc78ec955 -//.word 0x29b79844 -//.word 0x8758c8bf -//.word 0x2f54387e -//.word 0x0abf43bc -//.word 0x735837df -//.word 0x4954095b -//.word 0x435e47d4 -//.word 0x84db4d83 -//.word 0x7072bcda -//.word 0xbdcc286b -//.word 0xcd981106 -//.word 0x3bd31521 -//.word 0xb446637d -//.word 0x08507307 -//.word 0x80e5f5fd -//.word 0x73d70751 -//.word 0x1454aa52 -//.word 0x8eb17789 -//.word 0x53658ee1 -//.word 0xb059d00c -//.word 0xa65f4e21 -//.word 0xf5ff008a -//.word 0x797abb1d -//.word 0xb9095d89 -//.word 0xbe664bf4 -//.word 0x218d1de2 -//.word 0x68c49759 -//.word 0x93d9db43 -//.word 0xf1abde13 -//.word 0x38eb19ab -//.word 0xd524817d -//.word 0x81f9b8f1 -//.word 0x15af8507 -//.word 0x9feb823e -//.word 0xb5bc14b4 -//.word 0x09dba08e -//.word 0x3e32fc9a -//.word 0xfa9c2433 -//.word 0x3dec2f66 -//.word 0xf1308153 -//.word 0xc23741d5 -//.word 0x2f500e65 -//.word 0xe155ed3b -//.word 0x3ce886b7 -//.word 0x35fd9100 -//.word 0x63998beb -//.word 0x58d8ad1e -//.word 0x31351e75 -//.word 0x6c0668a4 -//.word 0xfa46291e -//.word 0x95970b36 -//.word 0x5487f584 -//.word 0x7d13838b -//.word 0x9a6ab498 -//.word 0xcff3e3ed -//.word 0x6a90f91f -//.word 0xbc25e0bd -//.word 0x28543b32 -//.word 0x798b54ed -//.word 0x784155bf -//.word 0xbf7cbc84 -//.word 0xc8970905 -//.word 0x4942b91d -//.word 0xc4ca781b -//.word 0x599b9368 -//.word 0xe003ac6a -//.word 0x3438b1a7 -//.word 0xd19d0f2e -//.word 0xa2412233 -//.word 0x14a8f0f9 -//.word 0x6fcf18f5 -//.word 0x666a0530 -//.word 0xed7067ed -//.word 0x4ad9e48c -//.word 0x6fa70aae -//.word 0x8723899a -//.word 0xcf699fdf -//.word 0xa726d33b -//.word 0xe9a1e6bc -//.word 0x79f80725 -//.word 0x1dac4693 -//.word 0x8f604b60 -//.word 0xd1de4848 -//.word 0xc15b2cca -//.word 0xedfc1ad1 -//.word 0xa8991994 -//.word 0x5ec00dbb -//.word 0x24fde6c3 -//.word 0x935817a3 -//.word 0xd72049b0 -//.word 0x03e751be -//.word 0xa7ce6088 -//.word 0xa5037a52 -//.word 0x40872acc -//.word 0x7635733a -//.word 0x900009d2 -//.word 0xf77cc265 -//.word 0x49a04742 -//.word 0xacca0f58 -//.word 0x63038e9a -//.word 0x9f84a9a8 -//.word 0x977a6eab -//.word 0xda070280 -//.word 0xe489da1a -//.word 0xf01e2e21 -//.word 0x0e68abdf -//.word 0x758d695d -//.word 0x1a821cc9 -//.word 0x828a8e1b -//.word 0xd4f94df9 -//.word 0x323ea0d7 -//.word 0x4920c062 -//.word 0x2748451f -//.word 0x4d00df4f -//.word 0x063a4617 -//.word 0xf7d474dd -//.word 0xf61a11f5 -//.word 0x208d2f7d -//.word 0x25e33785 -//.word 0xe74e2374 -//.word 0x4401eea6 -//.word 0x2ff1495a -//.word 0x06d890cc -//.word 0x1f80fc9e -//.word 0xa53e1a7c -//.word 0xa2bc7c00 -//.word 0x5cfcaed3 -//.word 0xe59a6b16 -//.word 0xee521100 -//.word 0xdcc153c8 -//.word 0x1e702ec5 -//.word 0xbd0e1ed4 -//.word 0x34fd91fa -//.word 0x83119c4a -//.word 0x7f94ed09 -//.word 0x6c8d0111 -//.word 0xcd419773 -//.word 0x7bfb6460 -//.word 0xf509084a -//.word 0xf7074146 -//.word 0x4e605eb5 -//.word 0xea11f723 -//.word 0x35b0dc6f -//.word 0xa3ad4b2c -//.word 0x8ad96648 -//.word 0x3524e3eb -//.word 0x34ab06a2 -//.word 0xf5f2ccbd -//.word 0x996d6af6 -//.word 0x0046f553 -//.word 0x265a634d -//.word 0xb385b231 -//.word 0xcd1f67c7 -//.word 0x31c63a32 -//.word 0x825e1017 -//.word 0xe0572901 -//.word 0xbd2e9b04 -//.word 0xec37ffa1 -//.word 0xfb996aea -//.word 0xc39a9fe6 -//.word 0x3d1d8237 -//.word 0x9868d0fa -//.word 0x882b0eef -//.word 0xe0bebfda -//.word 0x63abda29 -//.word 0xd76c7bd6 -//.word 0x5c76d98f -//.word 0xfc767815 -//.word 0x83daa0e2 -//.word 0x91930d0e -//.word 0xed19e873 -//.word 0x1cb0f610 -//.word 0x33eb10ab -//.word 0xe96ed3ba -//.word 0xf0f79884 -//.word 0x86a0a684 -//.word 0x475ea70e -//.word 0x45ce5935 -//.word 0x5a3186eb -//.word 0xbdb4366a -//.word 0xd4f623d3 -//.word 0x49c46d15 -//.word 0x60278f11 -//.word 0x88a092fc -//.word 0x30b28104 -//.word 0xdba11c36 -//.word 0x777ad09f -//.word 0xea53e7b1 -//.word 0xefd4fde9 -//.word 0x20f6b3af -//.word 0x530ba77e -//.word 0x2affa344 -//.word 0xe6dd140c -//.word 0x7c94beda -//.word 0xebfcafd6 -//.word 0xcc1471ad -//.word 0x2b8e8435 -//.word 0x958d0b50 -//.word 0x72adc612 -//.word 0x96444026 -//.word 0x12e74a6d -//.word 0x5030a7e9 -//.word 0x5fbf09da -//.word 0x8b7f3d26 -//.word 0x312aa2fe -//.word 0xd110dfbf -//.word 0x6514d516 -//.word 0xf1f7d368 -//.word 0x5cd90971 -//.word 0x7efc402b -//.word 0x7accc8f1 -//.word 0x4e1cb1e4 -//.word 0xa8b33e8e -//.word 0xfc0796c5 -//.word 0xd348bdd2 -//.word 0x66a0c3d3 -//.word 0x6bba3b5e -//.word 0x2f81ef67 -//.word 0xe52ad264 -//.word 0x3d7436ae -//.word 0x392e3f2b -//.word 0x3dfa982a -//.word 0x6552648e -//.word 0x1ac8782f -//.word 0xe892c77d -//.word 0x8a451d67 -//.word 0x47e1117b -//.word 0x820e354e -//.word 0x8ca58f1e -//.word 0xbc724db6 -//.word 0xc239b492 -//.word 0x38f65a44 -//.word 0x7a699516 -//.word 0xb8d233f1 -//.word 0x49fa6b7d -//.word 0x4272148a -//.word 0x481f15af -//.word 0xa2f71d30 -//.word 0x92059425 -//.word 0xe6b3d1d9 -//.word 0xca488d71 -//.word 0xe0b097ce -//.word 0x937ccab4 -//.word 0xa8293d2b -//.word 0x15a5b925 -//.word 0x170f7062 -//.word 0x7fbeeb91 -//.word 0x4c8645b8 -//.word 0x7f3697d5 -//.word 0x2b65b3c6 -//.word 0xcc6f1566 -//.word 0xd9ba16f9 -//.word 0x9d3e63ca -//.word 0x4244ae12 -//.word 0x2f6da31c -//.word 0x94f71ea7 -//.word 0x423c9b8c -//.word 0xc17beea0 -//.word 0x9cdb34dc -//.word 0x00ad09bb -//.word 0x85f2fbe4 -//.word 0x4c1d3f09 -//.word 0x4a1aa30f -//.word 0xe38ec46f -//.word 0xbb6181dc -//.word 0xc97aaf26 -//.word 0xadc90e5e -//.word 0x438b7c3b -//.word 0x78c969bc -//.word 0x5c228b0f -//.word 0x79cbd3b2 -//.word 0x64d49fd8 -//.word 0x91ad310e -//.word 0x6be8601e -//.word 0xa4408d33 -//.word 0xcadbd93f -//.word 0x1ccc959a -//.word 0x9bdcfbec -//.word 0x648a1b4c -//.word 0x3c5017a9 -//.word 0x6d289369 -//.word 0xd14f6851 -//.word 0x2c4998a5 -//.word 0xbe258790 -//.word 0x190268c5 -//.word 0x31d2f567 -//.word 0xb25e6327 -//.word 0x968b95ac -//.word 0xf6db9037 -//.word 0x20362f87 -//.word 0xebeb17fa -//.word 0x47f2eef6 -//.word 0x1874c887 -//.word 0x458ce249 -//.word 0x0b509389 -//.word 0x980b7fa7 -//.word 0xd5cd0ebe -//.word 0x83261d87 -//.word 0x892ef37b -//.word 0x8cc87638 -//.word 0xc1289e26 -//.word 0xff932b5a -//.word 0x196693bb -//.word 0x6a5a3f63 -//.word 0xb106f648 -//.word 0x20a69a1b -//.word 0xaf1a1270 -//.word 0xb6328720 -//.word 0xbb28d3eb -//.word 0x886e3662 -//.word 0x81aa4b05 -//.word 0x35003ba8 -//.word 0x338f311b -//.word 0x1f3e0e09 -//.word 0x05b85d21 -//.word 0xecb58974 -//.word 0xaf7c4d1e -//.word 0x08a56d29 -//.word 0xee24a4ae -//.word 0x2183dd3d -//.word 0x036fa67f -//.word 0xa976e11a -//.word 0x320fbcd5 -//.word 0x57dbe4fd -//.word 0x442af607 -//.word 0xa6c13776 -//.word 0x06db8400 -//.word 0x556d8cec -//.word 0xc8ae3cbe -//.word 0xe6d77b16 -//.word 0xdf2718d6 -//.word 0x1f2b0083 -//.word 0x233cb5ee -//.word 0x8b49fb13 -//.word 0x71d7d541 -//.word 0xfa45af7b -//.word 0x2a55dd1f -//.word 0xfde844c5 -//.word 0xb309576a -//.word 0x6b2d46ce -//.word 0xf3b9711a -//.word 0xdfc523c6 -//.word 0xd8207dba -//.word 0x3794b0b3 -//.word 0xd36b70e9 -//.word 0x1631a5ef -//.word 0x57bc63da -//.word 0x636a1ca5 -//.word 0x5daa14d4 -//.word 0xc9be1658 -//.word 0xe3bf66b3 -//.word 0x35e1f65c -//.word 0x68f8dc65 -//.word 0x5b3b045b -//.word 0x7248226e -//.word 0x3169ebd1 -//.word 0x09168564 -//.word 0x71bb3c91 -//.word 0x39bb7673 -//.word 0x1bb4e93e -//.word 0x94050bdb -//.word 0xf28dcad2 -//.word 0xadb67e6d -//.word 0xfab21c1b -//.word 0x9e05ac12 -//.word 0x0044fd38 -//.word 0x831c9744 -//.word 0x1295f120 -//.word 0xfd98e492 -//.word 0x03b0601c -//.word 0xb00d5e21 -//.word 0xe9ce1548 -//.word 0xc5807126 -//.word 0x9ee1c117 -//.word 0x68eab06c -//.word 0x420d76cc -//.word 0x4bbc4fd4 -//.word 0xb72a2c01 -//.word 0x2255a9d0 -//.word 0x23444023 -//.word 0x258dbce7 -//.word 0x721bf0f4 -//.word 0x912ea834 -//.word 0xd2a3e008 -//.word 0x277634e7 -//.word 0x35859849 -//.word 0xab9749c3 -//.word 0xd39c0473 -//.word 0x6737759e -//.word 0xa579f298 -//.word 0xa5f069e4 -//.word 0xebe0979d -//.word 0x39d07b14 -//.word 0xa6480bbb -//.word 0xf4da2542 -//.word 0x1f5fc8ff -//.word 0x32838493 -//.word 0x5e842fcb -//.word 0x4d36dac4 -//.word 0xb44b0353 -//.word 0x28d10da3 -//.word 0x32fced20 -//.word 0xa5262594 -//.word 0x2f14f690 -//.word 0x2f7bd10e -//.word 0xc6c21054 -//.word 0x310ae31c -//.word 0x566c8df1 -//.word 0x9c81d0dc -//.word 0x0028a540 -//.word 0x66833103 -//.word 0x2c43f5ee -//.word 0x05264557 -//.word 0x05bdfbfd -//.word 0xf8736c33 -//.word 0xf8cb9b41 -//.word 0x3fe9ad07 -//.word 0x39549de3 -//.word 0xddfa31d5 -//.word 0x3e752de1 -//.word 0x5d8cc6b5 -//.word 0x42fd598c -//.word 0x4b7a5d52 -//.word 0xc3f19709 -//.word 0xb6108c6b -//.word 0x04093cd1 -//.word 0xb5920d53 -//.word 0x8c300631 -//.word 0xdfb63d72 -//.word 0xa60893ca -//.word 0xd1259ec1 -//.word 0xdf65e712 -//.word 0xacff5651 -//.word 0x8acdead1 -//.word 0x9454adc5 -//.word 0x3fffe8a5 -//.word 0x32ab93d4 -//.word 0x58680f7f -//.word 0x337e18c8 -//.word 0x73aff524 -//.word 0xc7bcf101 -//.word 0xf32b0fad -//.word 0x2346fa73 -//.word 0x7e673b07 -//.word 0xff73ae24 -//.word 0x80a53773 -//.word 0x188db1af -//.word 0xa7582707 -//.word 0xaf5147c3 -//.word 0x66a8132b -//.word 0x0972daa4 -//.word 0x72f2671d -//.word 0xed1778a9 -//.word 0x4845726d -//.word 0x295952bd -//.word 0xa4e7e782 -//.word 0x0dc53fdf -//.word 0x0bce5f14 -//.word 0xeee036a2 -//.word 0x4327d4b0 -//.word 0xa59ed8ad -//.word 0xd6d22737 -//.word 0x0eeae43b -//.word 0x92e49c5e -//.word 0x8921c09c -//.word 0x0b24592f -//.word 0x7c97f7b3 -//.word 0x188eea87 -//.word 0xce10b576 -//.word 0x52d4c097 -//.word 0x6e484d71 -//.word 0x99d7ad63 -//.word 0xca6cb444 -//.word 0x8e326a46 -//.word 0x599f0320 -//.word 0x19b0126c -//.word 0x1176f94d -//.word 0xe5d1a456 -//.word 0xf17c77a7 -//.word 0xdf498459 -//.word 0x79ae021d -//.word 0xbb81fa1f -//.word 0x2d004431 -//.word 0x7014b225 -//.word 0x16d78b7a -//.word 0xb7533b3c -//.word 0x408d4825 -//.word 0x8fc28808 -//.word 0x3df09270 -//.word 0xbb987284 -//.word 0xa1c2a12d -//.word 0x4243347b -//.word 0x843b5345 -//.word 0xefe1ed10 -//.word 0x0383aa32 -//.word 0xcfc82138 -//.word 0xbf394c84 -//.word 0xb6ff383b -//.word 0x5cee015e -//.word 0xbac3fe36 -//.word 0x04aa39f6 -//.word 0xb504229c -//.word 0xe1668418 -//.word 0xc7e5b7b0 -//.word 0xa79118a3 -//.word 0xd33fb60c -//.word 0x078c4e0a -//.word 0xfd1e7a1e -//.word 0x3d2d25d4 -//.word 0x334242a6 -//.word 0x833fbd1d -//.word 0xa1a0b239 -//.word 0x9c00de13 -//.word 0x3adf53c1 -//.word 0x4aa26f7a -//.word 0x36db0efa -//.word 0xd8cbff28 -//.word 0x8e26b5f7 -//.word 0x91153f8a -//.word 0x82817b9b -//.word 0x468f861d -//.word 0x14677620 -//.word 0xcc3a4cf6 -//.word 0x8b832494 -//.word 0x7c8daf3a -//.word 0xf135e357 -//.word 0xb2f1f1a7 -//.word 0x9411789e -//.word 0x4e45f809 -//.word 0x896089f3 -//.word 0x365bcdc5 -//.word 0x249d23b2 -//.word 0xd2791d52 -//.word 0x82f9358d -//.word 0x8edabbbb -//.word 0xffd71209 -//.word 0x5c2b1c1f -//.word 0xc051f300 -//.word 0x2f0eda31 -//.word 0x2ab1731d -//.word 0x819a32b8 -//.word 0x69f91163 -//.word 0xced88510 -//.word 0xeb5cb1a6 -//.word 0x1747daa7 -//.word 0xe2c21c10 -//.word 0x605a5b80 -//.word 0xc5487c9d -//.word 0x32f5d4b3 -//.word 0xcfbde09f -//.word 0x1af337ec -//.word 0x7f26be3b -//.word 0x28a31be8 -//.word 0x163b6cea -//.word 0x714738fb -//.word 0x1ce9a5fa -//.word 0x8d94ec8d -//.word 0xdcce0b0a -//.word 0x1934ba98 -//.word 0xe3bf9f91 -//.word 0x3647c52b -//.word 0x85454b58 -//.word 0x09dd59ea -//.word 0x581c58fb -//.word 0x397e638c -//.word 0xb7b3f86c -//.word 0x74a2f45c -//.word 0x40afbe70 -//.word 0xea39c2b8 -//.word 0x56672120 -//.word 0xd025a695 -//.word 0xa069fd69 -//.word 0xdfbb1ff9 -//.word 0x89f4118d -//.word 0xd346ce7f -//.word 0xbe7c82a0 -//.word 0xec83f8d7 -//.word 0xb22a560b -//.word 0x70260843 -//.word 0x1d59fa0c -//.word 0x26540a1c -//.word 0x791abd34 -//.word 0xdc26304b -//.word 0x84b052e8 -//.word 0xe32d51d0 -//.word 0xc11552e1 -//.word 0x8ee8653e -//.word 0xf773b8ac -//.word 0xb7500b3c -//.word 0xb0ac632b -//.word 0x3a4c0306 -//.word 0xbbd29811 -//.word 0x783db4ea -//.word 0xaab07d6a -//.word 0xd574a7cc -//.word 0x553f9f11 -//.word 0x39b709a2 -//.word 0x55326d38 -//.word 0x93c02df9 -//.word 0x8a6bbbe4 -//.word 0x52bd086e -//.word 0x9683406d -//.word 0xead1b436 -//.word 0x5f461802 -//.word 0x5591ee97 -//.word 0x91344224 -//.word 0x9088986c -//.word 0x1a022326 -//.word 0x1ab437a4 -//.word 0xac1701b4 -//.word 0x780776c4 -//.word 0x3f0f8949 -//.word 0xb3e7a161 -//.word 0x8c3b4ab6 -//.word 0xd8ae2aa6 -//.word 0x921f38a2 -//.word 0x772b28d4 -//.word 0x15f32905 -//.word 0x251fd3bd -//.word 0x1a235bac -//.word 0xfac00a48 -//.word 0x6dceedb8 -//.word 0x143acdf1 -//.word 0x1b4b611f -//.word 0x1229c346 -//.word 0xf89f2129 -//.word 0x9920b56b -//.word 0x1b08f7f4 -//.word 0xd3251196 -//.word 0x5d7693f0 -//.word 0xeb326893 -//.word 0xdd0c0964 -//.word 0x92b6f042 -//.word 0x7ea450e8 -//.word 0x7d120314 -//.word 0x6748c3e9 -//.word 0xe51d9e91 -//.word 0x83baa428 -//.word 0x06a0e3d5 -//.word 0xffed953a -//.word 0xa0da970f -//.word 0xcf891d09 -//.word 0x79fea501 -//.word 0x296b2952 -//.word 0xd9b09983 -//.word 0x08228826 -//.word 0x0c8b26ff -//.word 0xaa736e69 -//.word 0xe49ea0f6 -//.word 0x12d6f256 -//.word 0x34eb827a -//.word 0x87f790f8 -//.word 0x56e6eab2 -//.word 0x1336a7b3 -//.word 0xa6fc1859 -//.word 0x0528fcb9 -//.word 0x0509f33f -//.word 0x70143695 -//.word 0x57e184c6 -//.word 0xa97660a4 -//.word 0x05c87967 -//.word 0xcd7f6a96 -//.word 0x7cfaa32b -//.word 0x3993a7f2 -//.word 0xac247932 -//.word 0x10ca508f -//.word 0x89e8922f -//.word 0xb86f001c -//.word 0x8d5d2ee9 -//.word 0x5d843799 -//.word 0x358daebc -//.word 0x6d3cd8db -//.word 0x80f61816 -//.word 0x1b80aa0c -//.word 0x730994fb -//.word 0xdc6bda28 -//.word 0x98aef282 -//.word 0xeccd7782 -//.word 0x79bd2255 -//.word 0xcaacf53d -//.word 0x2a87b935 -//.word 0xb8beabd4 -//.word 0xbd4b7373 -//.word 0x3cf15592 -//.word 0xcbc1ab78 -//.word 0xa2e3931a -//.word 0xf293e53e -//.word 0x786a68e0 -//.word 0x51df45d5 -//.word 0x100dbbae -//.word 0x0eb715df -//.word 0x0189d921 -//.word 0xd0a04314 -//.word 0xa64df129 -//.word 0x4616e0bf -//.word 0x9efe978c -//.word 0x9e07a23f -//.word 0x4af44263 -//.word 0x0e536387 -//.word 0x52bbce9c -//.word 0x4f53a09e -//.word 0x2193fb77 -//.word 0x1d4ffb20 -//.word 0x64f1ec09 -//.word 0xb806babb -//.word 0x8ffca8bc -//.word 0x662945b2 -//.word 0x58109dcc -//.word 0xefe0ac5e -//.word 0x3a3e18cb -//.word 0x20441fa8 -//.word 0xf3cacd1e -//.word 0x49e47390 -//.word 0x07ab567e -//.word 0xbe41a4aa -//.word 0x3b0fac79 -//.word 0x59514d9b -//.word 0x1ad5afee -//.word 0xf6ff32a0 -//.word 0x7311a495 -//.word 0xf6a9b708 -//.word 0xd98cb274 -//.word 0xbda166b5 -//.word 0x2241646a -//.word 0x35ae6d9f -//.word 0xe8e02aa9 -//.word 0x48881d50 -//.word 0x0c4fd834 -//.word 0x695e6d69 -//.word 0x2e242565 -//.word 0x0c53751c -//.word 0x352c2d69 -//.word 0x2afdf3b0 -//.word 0xcde8f0c2 -//.word 0xbee5c900 -//.word 0xe40ad1c4 -//.word 0x4a0b7dfc -//.word 0x2dfd1818 -//.word 0x535fb727 -//.word 0x9e5a703c -//.word 0xe048c717 -//.word 0xf1746901 -//.word 0xff201df8 -//.word 0x26cdf70c -//.word 0x40b6ce09 -//.word 0xff9ef156 -//.word 0x39cb161d -//.word 0x825393ac -//.word 0x0096d11c -//.word 0x7b0cfd30 -//.word 0xb441007f -//.word 0xf81db2d6 -//.word 0xf4694ad8 -//.word 0xcb8f1ae7 -//.word 0x66a17948 -//.word 0x0c9d0081 -//.word 0x32f0f906 -//.word 0x94381415 -//.word 0x844e5cdf -//.word 0x82846ae8 -//.word 0x0e2bd8b0 -//.word 0xba59f993 -//.word 0x83e9c7ee -//.word 0x61c21d83 -//.word 0x1d5d271f -//.word 0x6381167a -//.word 0x1851185e -//.word 0xed89870b -//.word 0x350560db -//.word 0xf483f822 -//.word 0x38a9ea58 -//.word 0xac4a547a -//.word 0x6ae543ad -//.word 0x116e6b25 -//.word 0x17511c45 -//.word 0x61b57107 -//.word 0x11fdcb9f -//.word 0xa0957d5b -//.word 0x2cebc9ce -//.word 0x13bb0c2d -//.word 0xc09035f9 -//.word 0xc5887bde -//.word 0x2a5750dc -//.word 0x058e90a4 -//.word 0x4b1eff45 -//.word 0xe617f207 -//.word 0x08b64c97 -//.word 0xbe9fac65 -//.word 0xc867e54b -//.word 0xa855af6f -//.word 0xf96a9c6a -//.word 0x029e4daa -//.word 0x8b6de514 -//.word 0xef92beee -//.word 0x73135bfd -//.word 0xd67d9eea -//.word 0x2a713beb -//.word 0xe25f6d9f -//.word 0x2b92e839 -//.word 0x806d0ee0 -//.word 0x78f46556 -//.word 0xe38e49d8 -//.word 0x1608de46 -//.word 0x83de4984 -//.word 0x8db62020 -//.word 0x9a2e1e35 -//.word 0x69d71c8f -//.word 0xa6813c0f -//.word 0xbbba6851 -//.word 0xea91fb8d -//.word 0x98a0bdbb -//.word 0xec4915fb -//.word 0x993f7a33 -//.word 0xf8482bfa -//.word 0x5a4220b5 -//.word 0x9c6440ff -//.word 0xfcc7d44f -//.word 0x2a253cd4 -//.word 0xa3e0e0a4 -//.word 0x3a466a16 -//.word 0xf713336c -//.word 0x2537fab6 -//.word 0xa7dadcf3 -//.word 0x8b9e8078 -//.word 0xe2249396 -//.word 0xced17477 -//.word 0xdcd23049 -//.word 0x945db09e -//.word 0x4f3a3113 -//.word 0x4983f530 -//.word 0xf7a83890 -//.word 0x9bb56642 -//.word 0x15d88b6e -//.word 0xfc1e0b3c -//.word 0xed7d93f1 -//.word 0x23174f5c -//.word 0x48bd5e70 -//.word 0x8bb28332 -//.word 0xf3b21dd6 -//.word 0xf3335924 -//.word 0x3eeba621 -//.word 0xdc9269ec -//.word 0x7ee9f2e6 -//.word 0x0ffbaf15 -//.word 0x8ba3a0cb -//.word 0x144e0b82 -//.word 0x4302710b -//.word 0xbca0c0e8 -//.word 0x0566caf6 -//.word 0x98b7f64f -//.word 0x361f366e -//.word 0x7f923994 -//.word 0xc0f4e16b -//.word 0x0cdff7e9 -//.word 0x8ea01e78 -//.word 0x1d820554 -//.word 0x1150e134 -//.word 0x55151b2c -//.word 0xbe2645d2 -//.word 0x9b6253a0 -//.word 0x8eb90899 -//.word 0x9aebae2f -//.word 0x7c920a65 -//.word 0x3f638f31 -//.word 0x0bb1d224 -//.word 0x3e323e4c -//.word 0xbd06095a -//.word 0x8df56600 -//.word 0x9df9fd9d -//.word 0xe6fc981c -//.word 0xb6e21f19 -//.word 0x49cac646 -//.word 0x9a91850e -//.word 0x7898c978 -//.word 0xdcc8694d -//.word 0x7ad3db7d -//.word 0x96bca8bf -//.word 0x19991d78 -//.word 0xe49843de -//.word 0x6440125d -//.word 0x67f9e23a -//.word 0x2ecf2276 -//.word 0xc3734cf5 -//.word 0x8d8218df -//.word 0x210af147 -//.word 0x5b4ba50a -//.word 0xaeba60fa -//.word 0xb84cdb3c -//.word 0x19f0d1ef -//.word 0x865db30e -//.word 0x190f9c98 -//.word 0xeb8c87ee -//.word 0xe5ecc07c -//.word 0xd398989b -//.word 0xba525db6 -//.word 0x6c7689ac -//.word 0x597f3a76 -//.word 0xa8cce20a -//.word 0x87a5407f -//.word 0xbf798f71 -//.word 0x8b69fda7 -//.word 0xaa0b5ef3 -//.word 0xb367225a -//.word 0xa9468475 -//.word 0xcfad0517 -//.word 0xbda41931 -//.word 0xb43b20f2 -//.word 0x2fcf9732 -//.word 0xba8a9010 -//.word 0x07295fda -//.word 0x3f02972e -//.word 0x9645355f -//.word 0x22821a1a -//.word 0xed6bbf4a -//.word 0x49dc2438 -//.word 0x631809f7 -//.word 0x1b5661ff -//.word 0x137c0418 -//.word 0x062aa47a -//.word 0x5cfa0232 -//.word 0xfb0661c7 -//.word 0x5fab3b1e -//.word 0xed8d349b -//.word 0x84db4c89 -//.word 0x56d558bc -//.word 0xf68bb374 -//.word 0xb1e73185 -//.word 0x22ed54b5 -//.word 0x0142c366 -//.word 0x3cebf775 -//.word 0x49583861 -//.word 0xbaa1c8b0 -//.word 0x120f5e8e -//.word 0xd7ded5b8 -//.word 0xe8412698 -//.word 0x11a794b1 -//.word 0xdd3d263e -//.word 0xabb45a16 -//.word 0x044418d3 -//.word 0x2cf1e533 -//.word 0xf70d59bf -//.word 0xdefed3aa -//.word 0x52416bfb -//.word 0x51af28ef -//.word 0x36ff7498 -//.word 0xd58dcccb -//.word 0xc759bc39 -//.word 0x03530bdc -//.word 0xaed63395 -//.word 0x35721313 -//.word 0x98eee8f6 -//.word 0x098d7a34 -//.word 0xb59193bc -//.word 0xe2feb55a -//.word 0x3aa00cdb -//.word 0x664fa271 -//.word 0xdf72d259 -//.word 0x01c2ffba -//.word 0x625186d1 -//.word 0x61caf04b -//.word 0x02fa6df2 -//.word 0xf98f7e8c -//.word 0x0420f100 -//.word 0x7e6e12bb -//.word 0x32ea2052 -//.word 0x6d77fe69 -//.word 0x57702bd3 -//.word 0x82edf4fb -//.word 0xc442e882 -//.word 0x42c98d29 -//.word 0xcee251f2 -//.word 0x7337c382 -//.word 0x4d4503ca -//.word 0x9e1877e6 -//.word 0x1f55c045 -//.word 0x947eed0b -//.word 0xa372eeb3 -//.word 0xe6334bf9 -//.word 0x3fec16f7 -//.word 0x6c331e8e -//.word 0xdb8b6507 -//.word 0xbf2dd4fa -//.word 0x63082e6f -//.word 0xbe064344 -//.word 0x499166cf -//.word 0x0d5620c3 -//.word 0x00482658 -//.word 0x91e889a6 -//.word 0x82c42d52 -//.word 0xf63e7c6d -//.word 0xcb8f5b99 -//.word 0x290c5d6e -//.word 0x5ba7371c -//.word 0xdeb87551 -//.word 0xb8fe6b5d -//.word 0x0be06d94 -//.word 0xeaf943f3 -//.word 0x6bd4d707 -//.word 0xfef4310b -//.word 0xfd18a551 -//.word 0x84bd4be3 -//.word 0x82e3b069 -//.word 0x1014cb4d -//.word 0x02a3331e -//.word 0xbc328f32 -//.word 0x48764d90 -//.word 0xa53f970c -//.word 0x61b282b4 -//.word 0x6ad9896b -//.word 0x215f3bd4 -//.word 0xb0943072 -//.word 0x9db7410d -//.word 0xa075f857 -//.word 0xb2ad46cf -//.word 0x677674e6 -//.word 0x7d635c60 -//.word 0xb506d9fe -//.word 0xe1b27c5a -//.word 0x3f858112 -//.word 0x05a60128 -//.word 0x3dcc69a9 -//.word 0xd3002a8d -//.word 0xeda3b2df -//.word 0x7ab29c1e -//.word 0x0e4923e2 -//.word 0xed66ddc2 -//.word 0x66f0a676 -//.word 0x62f8d939 -//.word 0x3c3ec771 -//.word 0xd3f76192 -//.word 0xdecd3840 -//.word 0x8028a8b4 -//.word 0x1dac4f60 -//.word 0x6b03c4d6 -//.word 0xccdc86e6 -//.word 0xdb333306 -//.word 0x44d3fbf8 -//.word 0xda1a53a6 -//.word 0xe3fdee51 -//.word 0xb64be9ea -//.word 0x893646c0 -//.word 0x840f9b5c -//.word 0x1a510ba9 -//.word 0x98e17659 -//.word 0xfe94ed83 -//.word 0x0ff26991 -//.word 0xa43abc59 -//.word 0x45a6c78a -//.word 0xfaefee4a -//.word 0x5f14c91d -//.word 0xf7581c09 -//.word 0xc2890af8 -//.word 0x1288855d -//.word 0x9a06091a -//.word 0xc88c8aa2 -//.word 0x55beab5a -//.word 0x1ae03046 -//.word 0x2599b6e1 -//.word 0x0cf7a14c -//.word 0x81b457ab -//.word 0x27b8accd -//.word 0xa4de9c0b -//.word 0xf8fb4072 -//.word 0x0d1dfb24 -//.word 0x8e10f5fb -//.word 0xfd27ca70 -//.word 0x003883bb -//.word 0xfce9c53c -//.word 0xe52a481a -//.word 0x55038b2a -//.word 0xdb90c612 -//.word 0x954a21ae -//.word 0x018723b2 -//.word 0x10456d91 -//.word 0x7c23a89e -//.word 0x5cb0bc71 -//.word 0xf6e8428d -//.word 0xd4fc3d40 -//.word 0x1a5204ca -//.word 0x16cd83c1 -//.word 0x194ea3b3 -//.word 0x857b070e -//.word 0x28bff93d -//.word 0xc891a414 -//.word 0xfffa836e -//.word 0x4a511914 -//.word 0x5c4ae3e1 -//.word 0xb82f8b24 -//.word 0x7e6c5e46 -//.word 0x855100ad -//.word 0xab145edf -//.word 0x6915e5eb -//.word 0xab66f205 -//.word 0xde8b8970 -//.word 0x4a7e49a1 -//.word 0xa2f79fa1 -//.word 0xd9e93bb3 -//.word 0x3850c037 -//.word 0xae2ac0ce -//.word 0x67c3e7bf -//.word 0x9f367699 -//.word 0xb931f31a -//.word 0x8bf81f50 -//.word 0xfdad29fe -//.word 0xd2ce2141 -//.word 0xc5ffaf73 -//.word 0xd80a0550 -//.word 0xe9241257 -//.word 0x8672f973 -//.word 0x02cbc1db -//.word 0xc8c04e37 -//.word 0xf0d99004 -//.word 0x1022fa39 -//.word 0x55e6362b -//.word 0xd2bb17ae -//.word 0x17becf7d -//.word 0x062062dc -//.word 0xe2e25a7b -//.word 0xa9dcbd9e -//.word 0xa4043c7b -//.word 0x3cedade3 -//.word 0x0f8ebb25 -//.word 0x4345dc30 -//.word 0x1a1c84f7 -//.word 0xc74a991a -//.word 0x81fd26c2 -//.word 0xd55653cc -//.word 0x40b5952b -//.word 0xfd382287 -//.word 0x1c7ea82a -//.word 0xd4b13e1d -//.word 0x1ac39b8e -//.word 0x72f78575 -//.word 0x06a48d78 -//.word 0xf536fa0b -//.word 0xed7503db -//.word 0xfc0a416d -//.word 0xa33e6302 -//.word 0x2d0624bf -//.word 0x3e3d7a0a -//.word 0xaf301037 -//.word 0x995ff764 -//.word 0xb08299a1 -//.word 0xd3cbee55 -//.word 0xe16bf2dd -//.word 0xcd575675 -//.word 0xf54c755c -//.word 0xaf108b33 -//.word 0x25fc21a6 -//.word 0x64b7cc4f -//.word 0xaf4417d7 -//.word 0x193fbe5f -//.word 0x53631d1e -//.word 0xc250e74b -//.word 0xd48b1b3d -//.word 0x95c734d1 -//.word 0x7d63a10c -//.word 0x8c337401 -//.word 0x9a835ef5 -//.word 0xe859dbc2 -//.word 0xfafbaa79 -//.word 0xa9b1804b -//.word 0x74ccfdaa -//.word 0x17e7dfab -//.word 0x5f6d76af -//.word 0x3c5c5842 -//.word 0x18485543 -//.word 0x67a2ad46 -//.word 0x7f3a8136 -//.word 0xaa03883f -//.word 0x7a1603ea -//.word 0x5dfaf38a -//.word 0x712389d8 -//.word 0x9ab8deda -//.word 0xd19ae409 -//.word 0xbfa19db2 -//.word 0x8a298a9d -//.word 0xefcd67ed -//.word 0x91721547 -//.word 0x9088d836 -//.word 0x5e8cc2ce -//.word 0xced16f90 -//.word 0x6e81f38e -//.word 0x17de11d0 -//.word 0xc2ceaef5 -//.word 0x9d97841d -//.word 0x5fe71b07 -//.word 0xd817f577 -//.word 0xccb009db -//.word 0x012f742d -//.word 0x97056a1b -//.word 0x98e27266 -//.word 0xd033d388 -//.word 0xdfea4999 -//.word 0x8c7dfd73 -//.word 0x5c31b415 -//.word 0x64984745 -//.word 0x5b58537a -//.word 0xf32f31f8 -//.word 0x6934293d -//.word 0x5b60e29c -//.word 0xdb4c1d28 -//.word 0xc13ca3d3 -//.word 0x455d7cd7 -//.word 0xcd4b6255 -//.word 0x03d6763c -//.word 0x2b06316d -//.word 0xb45d9c1d -//.word 0x0c5bc47a -//.word 0xb9486891 -//.word 0xa62df66f -//.word 0xba24b686 -//.word 0xafd14453 -//.word 0x2231433e -//.word 0xe69250c2 -//.word 0x9ee335cd -//.word 0x8b2e5f6a -//.word 0xa263939d -//.word 0xe257dc8e -//.word 0xe40cc8ea -//.word 0xb433d387 -//.word 0xdfef2447 -//.word 0xcddc773e -//.word 0x51505b17 -//.word 0x7fe19db3 -//.word 0xbe270414 -//.word 0x1ec33e7a -//.word 0xeb9f1bcb -//.word 0x8278f938 -//.word 0x639a801e -//.word 0x88eb8f2a -//.word 0xf52b75c1 -//.word 0x917a659f -//.word 0x341b24be -//.word 0x01770579 -//.word 0xf66517f1 -//.word 0xc1a89db0 -//.word 0xd5b9be8c -//.word 0xbec87ece -//.word 0xb1fded94 -//.word 0x68039e74 -//.word 0x2dc75b62 -//.word 0x347d17d4 -//.word 0x2de52424 -//.word 0x1acca735 -//.word 0x5ed54859 -//.word 0x17792e72 -//.word 0xae4d2a58 -//.word 0xad83327b -//.word 0xd0b412ca -//.word 0x5edd5ed3 -//.word 0xb9a7ab2b -//.word 0x34ebfe10 -//.word 0x2675854d -//.word 0x3d08855e -//.word 0x14a394d5 -//.word 0x070308fc -//.word 0x4669afbc -//.word 0x289dc1bd -//.word 0xc23312cf -//.word 0xb90d8c89 -//.word 0x5421dd2f -//.word 0xd57c6dd9 -//.word 0x0a8793d2 -//.word 0x1f8a083f -//.word 0xb66e9c01 -//.word 0x39c727dc -//.word 0x6f12c3d8 -//.word 0x4e3a38e7 -//.word 0x1162b8c9 -//.word 0x8adecd2d -//.word 0xb8828f19 -//.word 0x9c201a8b -//.word 0x494c3f61 -//.word 0x3b627a76 -//.word 0xe9cb240e -//.word 0x9d7bea74 -//.word 0x84be7ee1 -//.word 0x01358ca0 -//.word 0x471bf070 -//.word 0x27cd262a -//.word 0x268a02a3 -//.word 0xd377a1d4 -//.word 0x58e69f38 -//.word 0x4ed78a76 -//.word 0xd6bf9740 -//.word 0xe589947b -//.word 0xdfdb1ea0 -//.word 0x689a1462 -//.word 0x77b04c91 -//.word 0xab0d843e -//.word 0xe3eb9b20 -//.word 0x09570136 -//.word 0x2eed6cae -//.word 0xdce3cc06 -//.word 0xa7498271 -//.word 0x068ecc7c -//.word 0x614784f1 -//.word 0x6b2c0bfb -//.word 0xb263808c -//.word 0x750235fc -//.word 0xb5cf63f3 -//.word 0x8e4a1c88 -//.word 0xc8ed82aa -//.word 0xaab237bf -//.word 0x0ed6148c -//.word 0xbbdc1e55 -//.word 0xeed6b545 -//.word 0x3ae00f10 -//.word 0x92ede5d6 -//.word 0xa5c66c4b -//.word 0x6a4f8715 -//.word 0xfb0c3b75 -//.word 0xa6e5632a -//.word 0x4126a592 -//.word 0xbfcaa413 -//.word 0x01f977b9 -//.word 0xeecf5b20 -//.word 0xc65fa495 -//.word 0xb3f8fa78 -//.word 0xa2a7c1e4 -//.word 0x50fcd993 -//.word 0xa81188fb -//.word 0x4cc9b4bd -//.word 0x72565640 -//.word 0xf1fe2b99 -//.word 0x9b1eadaf -//.word 0xce6f419c -//.word 0x4688b256 -//.word 0x35a4de8e -//.word 0x96a6afd8 -//.word 0xbe5a4d0d -//.word 0x34fe92ed -//.word 0xc201bf09 -//.word 0xcc0a6de1 -//.word 0xe13cc649 -//.word 0x90b9f411 -//.word 0x7d64dae4 -//.word 0xb4ec0271 -//.word 0x3c06d7c9 -//.word 0xf0f91508 -//.word 0x8a607d38 -//.word 0x012bcd72 -//.word 0x15e8ef46 -//.word 0x2741715e -//.word 0x4fc5355d -//.word 0xa9eb6a0d -//.word 0xef53baba -//.word 0x4d50c5d9 -//.word 0x70a4cfee -//.word 0xe18ab5ac -//.word 0x91fa265d -//.word 0xb5280f84 -//.word 0xd34e57c1 -//.word 0x1dabcdf6 -//.word 0xffcb5fa8 -//.word 0xf40a8ca8 -//.word 0x9d541cf2 -//.word 0x142e0ed5 -//.word 0x7efad254 -//.word 0xdf76b8cd -//.word 0x3387a9d8 -//.word 0xba351572 -//.word 0x93f62c5b -//.word 0x8c2f51bc -//.word 0x39f8cb0d -//.word 0x4320be36 -//.word 0x03705af4 -//.word 0x4f34537f -//.word 0x94f8916a -//.word 0x259028ca -//.word 0xd35b8a9a -//.word 0xbec8fc5e -//.word 0x6b184607 -//.word 0x1666af17 -//.word 0x49e52805 -//.word 0xad6ac8e3 -//.word 0x212a783e -//.word 0x09c4f046 -//.word 0xe882e22e -//.word 0x32db74d6 -//.word 0x5b3df4a8 -//.word 0x340ac7c0 -//.word 0x77e1a34f -//.word 0xa01eff41 -//.word 0xffa4c71d -//.word 0x0cda532d -//.word 0xfaf39ae0 -//.word 0x8f73a36c -//.word 0x32ee3db7 -//.word 0x4613f078 -//.word 0xb6ea3399 -//.word 0xd15adfe1 -//.word 0x59eee4cf -//.word 0xd6d93bc9 -//.word 0x30371c76 -//.word 0x7d957068 -//.word 0x18b489fe -//.word 0xf38a1188 -//.word 0x2e8a40ad -//.word 0xe825520a -//.word 0x5591391c -//.word 0x10c98f60 -//.word 0xb3d5ceb8 -//.word 0xa64bc311 -//.word 0x34164043 -//.word 0xe4761238 -//.word 0x06483251 -//.word 0x8c884005 -//.word 0x1b142ccc -//.word 0x62b2373b -//.word 0xab551a70 -//.word 0xaf9c84b0 -//.word 0xaf9cca4f -//.word 0xc0dfdad0 -//.word 0x67ac724e -//.word 0x65898f1b -//.word 0xd4ff27a6 -//.word 0x739d1aa2 -//.word 0x3f406764 -//.word 0x43919b8d -//.word 0xb0ce90ea -//.word 0x30ce5398 -//.word 0x783f666c -//.word 0x1c332891 -//.word 0xa8db9173 -//.word 0xec9122dc -//.word 0x971c1c5d -//.word 0x0830f1f0 -//.word 0x6035f8db -//.word 0xdc4964d8 -//.word 0x62887772 -//.word 0x598bf3b2 -//.word 0xbe2ed2fb -//.word 0x74973633 -//.word 0xdc74a323 -//.word 0xa6836c21 -//.word 0xe7586bec -//.word 0x6b5bf5d7 -//.word 0x4c100d2a -//.word 0xc39bd8c5 -//.word 0x3f835206 -//.word 0xb4b63eed -//.word 0x36cd637e -//.word 0xc692f567 -//.word 0x6cbf52e3 -//.word 0x8609efde -//.word 0x5f5d915a -//.word 0x036ac011 -//.word 0x525f785c -//.word 0x54f62353 -//.word 0xccb1c436 -//.word 0x1063750c -//.word 0x17f31389 -//.word 0xd45d3835 -//.word 0xc2f969cb -//.word 0xc10091df -//.word 0x204caec4 -//.word 0xfb5fcbad -//.word 0xc7a72e12 -//.word 0x2b01d256 -//.word 0x117b18a6 -//.word 0xfe5eb924 -//.word 0x9e6cff45 -//.word 0xa4663577 -//.word 0xd1d15c08 -//.word 0x51fa1f43 -//.word 0x4e3809dc -//.word 0xc071f68e -//.word 0x82dfc702 -//.word 0xab145af3 -//.word 0x1b3cba90 -//.word 0x54a39221 -//.word 0x8c77e8ee -//.word 0x00ce075c -//.word 0x8aeabd5a -//.word 0x76bcc7fb -//.word 0x92a88a64 -//.word 0x848804e9 -//.word 0x60f30173 -//.word 0x7abf9225 -//.word 0x79c4bb3f -//.word 0xade36c42 -//.word 0xa348b255 -//.word 0xf6eb2fe7 -//.word 0x675dc896 -//.word 0x30c19d4f -//.word 0x96183eb7 -//.word 0xbec31cca -//.word 0xc1423dc2 -//.word 0x0242343b -//.word 0xc0d75194 -//.word 0xe7061598 -//.word 0x2c86e85e -//.word 0x58c70e6d -//.word 0xe434d824 -//.word 0xc7b6175a -//.word 0x8c79d641 -//.word 0xa7f24990 -//.word 0x092100e1 -//.word 0xf2136057 -//.word 0x07ac5485 -//.word 0xa4a3408b -//.word 0x73ce3782 -//.word 0x3ea06d1b -//.word 0x01f0ef82 -//.word 0x44fb9189 -//.word 0xa7ad2802 -//.word 0xbf1cfa6c -//.word 0x205673d3 -//.word 0xbb5c1af1 -//.word 0x6b6ec399 -//.word 0xca890556 -//.word 0x492fee4f -//.word 0x8066f66d -//.word 0xc20332c0 -//.word 0xf528ca1f -//.word 0xa00cad0f -//.word 0x46fa83e7 -//.word 0xf39de431 -//.word 0x147ac752 -//.word 0x8bbe3d6e -//.word 0x033a5f86 -//.word 0x81ac84e3 -//.word 0x3c40b8b8 -//.word 0xaf566a03 -//.word 0xec8665b4 -//.word 0x33e10211 -//.word 0xc37a9b59 -//.word 0xf02642a7 -//.word 0x767fb31a -//.word 0x0d2f8833 -//.word 0x3e6bac7e -//.word 0x74bd1275 -//.word 0x5607a7a1 -//.word 0x54c58502 -//.word 0x809269b1 -//.word 0xa0ee67c4 -//.word 0x813edc72 -//.word 0x8e14a578 -//.word 0xa0b18eba -//.word 0x18c80d2e -//.word 0x2c8531f6 -//.word 0x7eced5cc -//.word 0xf3c919a3 -//.word 0xc29e138b -//.word 0xcb7ec1d6 -//.word 0x2be44279 -//.word 0x0d1a46b5 -//.word 0xc200c4f6 -//.word 0x1509ebfb -//.word 0xd8865a37 -//.word 0xc3279377 -//.word 0x7fbeadc6 -//.word 0xfd474a8d -//.word 0x0c26c9ff -//.word 0x2bafbdb4 -//.word 0x9beb9d94 -//.word 0xb999bdf7 -//.word 0x8b747c0b -//.word 0x99b4bf75 -//.word 0xfed79f3b -//.word 0xbea15fe1 -//.word 0x5a62a1d2 -//.word 0xa277d902 -//.word 0xcb1301d2 -//.word 0xc1408f34 -//.word 0xbe20a40f -//.word 0x1c7986e5 -//.word 0x687050b3 -//.word 0xb795e818 -//.word 0x3d2032ba -//.word 0x1b7a83e6 -//.word 0x79005976 -//.word 0xd50349f8 -//.word 0x9a13380c -//.word 0xf57dce0e -//.word 0xe41228f5 -//.word 0x902acd7b -//.word 0xdce9e47f -//.word 0x3ec1a4a7 -//.word 0xce380b49 -//.word 0x9cecd38c -//.word 0x47d4a2ca -//.word 0xcbc88139 -//.word 0x9b448fcb -//.word 0xf069f652 -//.word 0x60441fe8 -//.word 0xb253228e -//.word 0xf1458113 -//.word 0xbf021538 -//.word 0xeceb4811 -//.word 0x476385ae -//.word 0xb48eedfb -//.word 0x7f584ce5 -//.word 0xf0ba4bbe -//.word 0x2039e7e3 -//.word 0x0aaf219c -//.word 0xe54df743 -//.word 0xb2e194a9 -//.word 0x1155c4b5 -//.word 0x5878aa4e -//.word 0xe602b57b -//.word 0xb5d2d0c9 -//.word 0x2f79d9ee -//.word 0x43fc55ab -//.word 0xb7d662f7 -//.word 0xc03dec59 -//.word 0xd0a62496 -//.word 0xaf8b2e8c -//.word 0xcd6c1a5e -//.word 0xd71416d1 -//.word 0x881de2f6 -//.word 0xc2b6840a -//.word 0xdda43c9a -//.word 0x3f87baea -//.word 0x2c5f8f98 -//.word 0xe04ee27d -//.word 0xdba064d4 -//.word 0x7d08869e -//.word 0xd22ce945 -//.word 0xaf64157f -//.word 0xfebf6f75 -//.word 0x56486525 -//.word 0xcf87ec04 -//.word 0x144a2ce8 -//.word 0xb9a57926 -//.word 0xcf3786f7 -//.word 0xb6afd521 -//.word 0x338f72d3 -//.word 0xc230e1d0 -//.word 0x2e0655cf -//.word 0x5e262322 -//.word 0x72057597 -//.word 0x0f83439c -//.word 0xf6287fa6 -//.word 0xdcad90d3 -//.word 0x76be02ce -//.word 0xd3fe7cf3 -//.word 0xee4cf2b3 -//.word 0x84451b3a -//.word 0x23092650 -//.word 0x8442a97d -//.word 0x1a63da71 -//.word 0xeb2e01a2 -//.word 0x9f792d37 -//.word 0xd6312625 -//.word 0xbf9fa498 -//.word 0xe7eabe94 -//.word 0x4edea5dc -//.word 0xc0eb9213 -//.word 0x6271fd21 -//.word 0x8c3b10d8 -//.word 0xd6495bd8 -//.word 0x76d2c9af -//.word 0xc989d345 -//.word 0x2f20f378 -//.word 0x1c0a5c03 -//.word 0x6c86e8a4 -//.word 0xf7d9527e -//.word 0x66daa5bc -//.word 0x45b4f477 -//.word 0x59e84cd9 -//.word 0x3391e783 -//.word 0x05eca22d -//.word 0xb517b18c -//.word 0x30199279 -//.word 0x01233f4f -//.word 0x2216a895 -//.word 0x114460dd -//.word 0x277b97eb -//.word 0x2640481a -//.word 0x1158b3fc -//.word 0x408d0e41 -//.word 0xb3ae78da -//.word 0xa7d82e5e -//.word 0x67f401ac -//.word 0x658108d2 -//.word 0x8994922d -//.word 0xc91c5ed2 -//.word 0xfa6b0f2d -//.word 0xe5f2dae8 -//.word 0x9e4c820e -//.word 0x117f8671 -//.word 0xde7e9949 -//.word 0x67f2521d -//.word 0x263925e7 -//.word 0x45af9273 -//.word 0x682d9c08 -//.word 0xced07d4a -//.word 0x98fc985f -//.word 0x68a0af51 -//.word 0x2ebb56b3 -//.word 0x3f1fa788 -//.word 0xa8753860 -//.word 0xc1814ac4 -//.word 0x05a743d4 -//.word 0x20ae5f2f -//.word 0x4ac5a213 -//.word 0xd4c311c6 -//.word 0x00b32134 -//.word 0x169070d9 -//.word 0xb44db3e1 -//.word 0x6618ef8e -//.word 0x76e0eddb -//.word 0x0615e85f -//.word 0x5baf8873 -//.word 0x7c711497 -//.word 0xfc6fe312 -//.word 0x14ce13d9 -//.word 0xf5cb7eb2 -//.word 0x5bfeea99 -//.word 0x66e08063 -//.word 0xa68c80a1 -//.word 0x74c232c7 -//.word 0x8931208e -//.word 0xc9f68296 -//.word 0x6060fa50 -//.word 0x10f6811b -//.word 0xc9bba1ad -//.word 0x7bb0e6b5 -//.word 0x289b8fbe -//.word 0x3d078857 -//.word 0x228c9d71 -//.word 0x1050e808 -//.word 0x23ce8b06 -//.word 0xb0d6a564 -//.word 0xd8d57e92 -//.word 0x5d570519 -//.word 0xb5ca7d7f -//.word 0x5d85736a -//.word 0x7009f309 -//.word 0x7886fbb0 -//.word 0x84a130c2 -//.word 0x7b74d0d4 -//.word 0xafd6e80f -//.word 0xb5ddc7d6 -//.word 0x75a2b2a9 -//.word 0x7d44d94a -//.word 0x9b308a1e -//.word 0xaa9fa5d5 -//.word 0xac60504e -//.word 0x19d7ebb4 -//.word 0x774647ee -//.word 0x2b4b1236 -//.word 0x8faa9607 -//.word 0x444da43d -//.word 0xca89ca78 -//.word 0x4da3ccc1 -//.word 0xc2935270 -//.word 0x3307df4c -//.word 0x57ab02f5 -//.word 0x66a8d07f -//.word 0x2b6a9160 -//.word 0x5ba7ba8c -//.word 0x259d1cde -//.word 0x0a9b5aba -//.word 0xefc2a0f1 -//.word 0x710d92e4 -//.word 0x788f83ed -//.word 0x0ffce8fa -//.word 0x736b0c7b -//.word 0x695a057f -//.word 0xd5f3e619 -//.word 0x898e3609 -//.word 0x5b76a198 -//.word 0x7af0eec4 -//.word 0x0279319d -//.word 0xcd5042ef -//.word 0x8d346d21 -//.word 0x176f6b5d -//.word 0x021391f2 -//.word 0x718448f6 -//.word 0x2d36bd2f -//.word 0xf7b8da34 -//.word 0x1cf274cf -//.word 0x49abc6a6 -//.word 0xa14e1e1a -//.word 0x0dedd670 -//.word 0xd386862e -//.word 0x6b8578c8 -//.word 0x8e8b5c7c -//.word 0x8f6e3d7b -//.word 0xee81b449 -//.word 0x2b155c66 -//.word 0xd83f852e -//.word 0xf2dc2dfe -//.word 0x71d32c98 -//.word 0x1e9aaec9 -//.word 0xa5fce649 -//.word 0xeb1901e2 -//.word 0xa1ae59d4 -//.word 0x1a96ec79 -//.word 0x59910c25 -//.word 0x6f455850 -//.word 0x0482eaf7 -//.word 0x33cad23f -//.word 0x9b11c35c -//.word 0xb2c10db1 -//.word 0x5d01cb38 -//.word 0xbe375e25 -//.word 0x4dcb1ac6 -//.word 0x2b2f3eae -//.word 0xb31c2a12 -//.word 0x511ecc73 -//.word 0x97525c7d -//.word 0x8d6e4930 -//.word 0x4903733d -//.word 0xc0ff9ab3 -//.word 0xdc7616da -//.word 0xcfa2c95f -//.word 0xa62853b2 -//.word 0x219c84ad -//.word 0xc2481776 -//.word 0x24299da6 -//.word 0x8e3bb7ab -//.word 0xc8f7886b -//.word 0x2d196a29 -//.word 0x02a6e0ad -//.word 0x062ecd9f -//.word 0x4a4ee335 -//.word 0x437a5d0e -//.word 0x1ef9f15d -//.word 0x53310049 -//.word 0x7d251194 -//.word 0x693c7d7b -//.word 0x6d446bde -//.word 0xfbb6ffa1 -//.word 0x753ccf52 -//.word 0x4370970c -//.word 0x24e72d9b -//.word 0xc16eb7e0 -//.word 0x88931b77 -//.word 0xb768b798 -//.word 0xb783533b -//.word 0xac495380 -//.word 0x4a6d314d -//.word 0xeab32b39 -//.word 0xddfa39a9 -//.word 0x00794238 -//.word 0x90498f5d -//.word 0x40238048 -//.word 0x896c7e0c -//.word 0x426e3003 -//.word 0x70e9f26e -//.word 0x5fca835d -//.word 0xf23afdcf -//.word 0x37da0b19 -//.word 0x3e4d568c -//.word 0x2cf84052 -//.word 0x8b05d599 -//.word 0xe4aefef4 -//.word 0x90b8f8fd -//.word 0xcb3d0540 -//.word 0x0aaf6254 -//.word 0x8f1a784b -//.word 0x3aa9564d -//.word 0xa26c5f7f -//.word 0x64584029 -//.word 0xbb902619 -//.word 0x51e32d42 -//.word 0x55951ba9 -//.word 0xce624e82 -//.word 0x2fc0f395 -//.word 0x2b6579e7 -//.word 0xca094597 -//.word 0xbd6da806 -//.word 0xef9c0e3a -//.word 0x5c707885 -//.word 0x26592c61 -//.word 0xe55aaa9f -//.word 0x3f54e3c1 -//.word 0xba87a6a4 -//.word 0xcd565b62 -//.word 0x3d4af376 -//.word 0xa75a1f21 -//.word 0x586ac00d -//.word 0x65119f31 -//.word 0xf99f5ff4 -//.word 0xe95fb095 -//.word 0x8e19c5ca -//.word 0xd3db07a7 -//.word 0x8df90bc2 -//.word 0x0b53c195 -//.word 0xeed6ef23 -//.word 0x3b46dedf -//.word 0xaf3a54c9 -//.word 0x5368c1da -//.word 0x5022bda2 -//.word 0x0321b230 -//.word 0x5482d632 -//.word 0x440e5d5d -//.word 0xc6beec0f -//.word 0xd07e5033 -//.word 0xb1327080 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00015538 -//// expected output -//.word 0x9354325b -//.word 0xe0d81277 -//.word 0x22ab167c -//.word 0x4ba9b8c0 -//.word 0x4d6fb4b7 -//.word 0x6ceff8e6 -//.word 0xf32c5530 -//.word 0x0c70705a -//.word 0x3c2bf20c -//.word 0xd85706d3 -//.word 0xf67fef2f -//.word 0x28152824 -//.word 0x56cb9042 -//.word 0xca8a6a6b -//.word 0x9cf57e97 -//.word 0x37ec2592 -//// SHA512LongMsgvector_110 -//// vector length -//.word 0x00015850 -//// input message -//.word 0xf1ec3715 -//.word 0xe90feae7 -//.word 0xf5a92656 -//.word 0x7eccc1b0 -//.word 0x2bd2c3b1 -//.word 0x58fd754a -//.word 0xc45abaa0 -//.word 0x89eba258 -//.word 0x52043d12 -//.word 0xc8f6ad33 -//.word 0x4deb7fe8 -//.word 0xed113c68 -//.word 0x91fb3a79 -//.word 0x7644b835 -//.word 0xde752a0e -//.word 0x0628d210 -//.word 0x576e9066 -//.word 0xe06ffb20 -//.word 0x0450b033 -//.word 0x705aebc1 -//.word 0x5158549b -//.word 0xc3401b05 -//.word 0x8c1646b9 -//.word 0x0a0e4a2e -//.word 0x6af1d919 -//.word 0x1bc1fc35 -//.word 0x82a0613f -//.word 0xf0eef645 -//.word 0xd1b2b721 -//.word 0x263bc341 -//.word 0x3507b6a9 -//.word 0x7ee3333a -//.word 0xf254c034 -//.word 0x6036d7fa -//.word 0x30a33915 -//.word 0x5316867c -//.word 0x7ad00b12 -//.word 0x867bdb71 -//.word 0x400e21e6 -//.word 0x4bf0b4bc -//.word 0x5760ecbe -//.word 0x9614b5f7 -//.word 0x7420e1bc -//.word 0x831ac3ed -//.word 0xb47cf977 -//.word 0xcd49891d -//.word 0x17f43079 -//.word 0x577df63d -//.word 0x00dd06bf -//.word 0xa7a4bdb5 -//.word 0xb7e1013c -//.word 0x6642d420 -//.word 0xe87c2857 -//.word 0xe2edf5ce -//.word 0x21808a69 -//.word 0x8cd22145 -//.word 0x5793b540 -//.word 0x7a2e18bb -//.word 0x62ac409e -//.word 0xe6d5e19d -//.word 0x7c9942ba -//.word 0xadaf490b -//.word 0xc67cd7be -//.word 0xd1365c5a -//.word 0xc349a247 -//.word 0xf7faed91 -//.word 0xdb4a46e9 -//.word 0xea1d14ed -//.word 0xda9beca9 -//.word 0x16d7aa5d -//.word 0x6eaec180 -//.word 0x0df3cf06 -//.word 0xacc975df -//.word 0x064f65c0 -//.word 0x8c83bc25 -//.word 0x59609397 -//.word 0x684ad02a -//.word 0x05ac424b -//.word 0x81e0eeb8 -//.word 0x2a4fa3d0 -//.word 0x7ad9d50d -//.word 0x8f77a8cf -//.word 0xdb1e4a5b -//.word 0x1de78623 -//.word 0x906e9648 -//.word 0x6277395d -//.word 0x67d8066e -//.word 0x0f930040 -//.word 0x96426adb -//.word 0x7ab8dd46 -//.word 0x32e59792 -//.word 0x1dfa1619 -//.word 0xb9cee608 -//.word 0x1580b71b -//.word 0x895fb2a8 -//.word 0xa4060ddf -//.word 0x66cbdd50 -//.word 0xaf5b2cae -//.word 0xf89e4cd2 -//.word 0x41e16a02 -//.word 0x4a336674 -//.word 0x060fe30e -//.word 0x4d3c9a70 -//.word 0xd1f2f334 -//.word 0x533ed674 -//.word 0x17a7be8d -//.word 0x95121023 -//.word 0x71e3ac66 -//.word 0xad65c193 -//.word 0x1e6ce5bd -//.word 0x1c3965cd -//.word 0x7e9dd9c8 -//.word 0xc662fc50 -//.word 0x98e6bb6e -//.word 0x71098c8e -//.word 0x954901cb -//.word 0x492c9d6d -//.word 0x43dfe6b0 -//.word 0x5f1cbbc8 -//.word 0x9350e821 -//.word 0x25fef8eb -//.word 0x1b5e4bd6 -//.word 0xf44b681a -//.word 0x955c93bb -//.word 0x8650a30b -//.word 0x5eaf0e70 -//.word 0x7cae4667 -//.word 0xf85348c9 -//.word 0xd9db714e -//.word 0x8959944f -//.word 0x869f4bd0 -//.word 0x59618abd -//.word 0xcc987a74 -//.word 0x58258484 -//.word 0xddb7abb4 -//.word 0x96ee2048 -//.word 0x4bc1107f -//.word 0xc81dc160 -//.word 0x8fceddb6 -//.word 0xcaa30e5a -//.word 0x83cdcab0 -//.word 0x17897174 -//.word 0xe8ff95b7 -//.word 0x53699824 -//.word 0xe2777d88 -//.word 0xc2f2f892 -//.word 0x77a1c7d7 -//.word 0xce694518 -//.word 0x13b73dc8 -//.word 0x8523fcc9 -//.word 0x074daa77 -//.word 0x180bdae7 -//.word 0x05c75f70 -//.word 0x5d22616b -//.word 0xa6ddb138 -//.word 0x4efa5a82 -//.word 0xe51e79c3 -//.word 0x893a4e0a -//.word 0xa16a92fc -//.word 0xce1e0b18 -//.word 0x1e775f40 -//.word 0x83f42675 -//.word 0x844d42e3 -//.word 0x339f731d -//.word 0x5fca26a9 -//.word 0x0a178ebf -//.word 0x1d1ff64e -//.word 0x5be85640 -//.word 0x945024ff -//.word 0x1baf6c38 -//.word 0x7ab823df -//.word 0x63a0b973 -//.word 0xea83ed83 -//.word 0xf203e571 -//.word 0xe5327e76 -//.word 0xa9b2e1e6 -//.word 0xcf1a57b5 -//.word 0x0d9c5e3b -//.word 0xeee5fc34 -//.word 0xc845530b -//.word 0xef107658 -//.word 0x28447ba7 -//.word 0x606bd17b -//.word 0x9ec3d492 -//.word 0x379d9f6b -//.word 0x41032106 -//.word 0x499d74eb -//.word 0x49d6696d -//.word 0xd43a6830 -//.word 0x942277e9 -//.word 0xf6949865 -//.word 0x246558cd -//.word 0x34a0a528 -//.word 0x9e2ce021 -//.word 0xf4a8330a -//.word 0xcd9a2522 -//.word 0x03c96b13 -//.word 0x1ee701bf -//.word 0x0f737a3c -//.word 0x22de951d -//.word 0x2eed10f4 -//.word 0x0e5ec115 -//.word 0x55cee29c -//.word 0x3edaadb1 -//.word 0xe285290a -//.word 0xaed943b2 -//.word 0x13d22009 -//.word 0x7f77b20d -//.word 0x8d4a89d7 -//.word 0x79e2ec68 -//.word 0xd6d729a6 -//.word 0x83de29a2 -//.word 0xdb35471c -//.word 0x2c426249 -//.word 0x6a7731d4 -//.word 0x2578d722 -//.word 0xb980b8da -//.word 0xc5018aa5 -//.word 0xde8aaf32 -//.word 0x84eec27e -//.word 0x54a37052 -//.word 0x8068890d -//.word 0x7d2a56a3 -//.word 0xfb292ee6 -//.word 0x1a574404 -//.word 0xdb00c351 -//.word 0xd4b01d47 -//.word 0x29529fcb -//.word 0xb7954ab2 -//.word 0x9294de84 -//.word 0xb2b53780 -//.word 0xe9d1dce0 -//.word 0x1896d65e -//.word 0xa32abef6 -//.word 0x22111aee -//.word 0x5a51ea14 -//.word 0x6bd47d47 -//.word 0x4a0d8938 -//.word 0x72df7b72 -//.word 0xd7ba0c98 -//.word 0x1c0715ee -//.word 0x05c6a41b -//.word 0x2f754f2e -//.word 0xff34c8de -//.word 0xd828b216 -//.word 0x911db3b1 -//.word 0x266fcb82 -//.word 0xad2ae497 -//.word 0x8c70aabe -//.word 0xea1b9c49 -//.word 0x63a4630f -//.word 0x004463b3 -//.word 0x66589129 -//.word 0x4d0a8475 -//.word 0x342eceb6 -//.word 0x536a8c64 -//.word 0xd29a3cd6 -//.word 0x3872cf07 -//.word 0x2665ff99 -//.word 0x45c6e31a -//.word 0x7d2ec187 -//.word 0x681d230e -//.word 0x06e42d18 -//.word 0xb2c22d87 -//.word 0x544d743c -//.word 0xd91365dd -//.word 0xe082cbd5 -//.word 0xb605709c -//.word 0x8570eb38 -//.word 0xc89eb904 -//.word 0x02588fb0 -//.word 0xb079ef89 -//.word 0x7c50fafa -//.word 0xb3468553 -//.word 0xf9c16eca -//.word 0x3c4830c0 -//.word 0xe6e7b645 -//.word 0x57d56ddd -//.word 0x92549d84 -//.word 0x36d9f9f1 -//.word 0xb16d7518 -//.word 0xb05357f2 -//.word 0xd9eb9180 -//.word 0xbdd64e0e -//.word 0x085bcbb5 -//.word 0xfb096823 -//.word 0x1d9eff9f -//.word 0x2d287447 -//.word 0x5a6a8d9c -//.word 0xb7810441 -//.word 0xe9c8db00 -//.word 0x22f8f00e -//.word 0x5494d190 -//.word 0x9e84d15d -//.word 0x0bff5c06 -//.word 0x7baf8714 -//.word 0xe110eb90 -//.word 0xaf1ab4c9 -//.word 0x8f1ff551 -//.word 0x54f63f49 -//.word 0x305971de -//.word 0x278cd114 -//.word 0xc33f5cc3 -//.word 0x0ab65bde -//.word 0xad2737fb -//.word 0x82648e10 -//.word 0x34b9867b -//.word 0x3a186246 -//.word 0x057353a8 -//.word 0x7e6a90cf -//.word 0xaf26a8dc -//.word 0xc0851730 -//.word 0x267718e6 -//.word 0x17a8bba0 -//.word 0x415f3787 -//.word 0xbba6818d -//.word 0x3cab1ef6 -//.word 0x8b663516 -//.word 0x367ce85c -//.word 0x8763e48f -//.word 0xb4c73758 -//.word 0x562d6301 -//.word 0x1cd7b07c -//.word 0xc1e7c6a7 -//.word 0x3bc77ace -//.word 0x36c7e971 -//.word 0xc008c348 -//.word 0x469aea85 -//.word 0xbfe13c59 -//.word 0x273dacb9 -//.word 0x2fe99862 -//.word 0x3324571b -//.word 0x6c8f113a -//.word 0x67d7d369 -//.word 0xb593e2aa -//.word 0xe5705099 -//.word 0xaf8bcef1 -//.word 0x721ec152 -//.word 0xe15f9842 -//.word 0xf8a55c71 -//.word 0x36cd8841 -//.word 0x06dc1c85 -//.word 0x7ee5ed89 -//.word 0x4b2e3f54 -//.word 0xec8e9529 -//.word 0x1f19c854 -//.word 0x99005723 -//.word 0xfab2fe32 -//.word 0x00478aeb -//.word 0xfb1feb4e -//.word 0x81c68bee -//.word 0x621bde3c -//.word 0xdeb23b08 -//.word 0x1676ea45 -//.word 0xc1937e0d -//.word 0x209364e5 -//.word 0x34c6bd41 -//.word 0x2ee8694b -//.word 0x27fe64e0 -//.word 0x118156db -//.word 0xeebe6597 -//.word 0x407d4eaf -//.word 0xc0e1b408 -//.word 0x528fb812 -//.word 0x3912c94a -//.word 0x877fbd04 -//.word 0xd8542167 -//.word 0x40a6ceb9 -//.word 0x827cbddd -//.word 0x83761d19 -//.word 0xfeb2a21d -//.word 0x78ef1f41 -//.word 0x77f3570f -//.word 0xef2b1101 -//.word 0xfd926a8b -//.word 0xd7d36f5c -//.word 0x04b2ebe2 -//.word 0xc8a87e0c -//.word 0xe3cdef53 -//.word 0x7bfcc3fb -//.word 0x56310f96 -//.word 0x4c358acb -//.word 0xfc7ee655 -//.word 0xbf50614e -//.word 0xda2997ae -//.word 0xf85c9a0f -//.word 0xd7fc44b3 -//.word 0x41fbccc7 -//.word 0x3e9398e9 -//.word 0x88e552e9 -//.word 0x3fe13ecc -//.word 0xde65cb17 -//.word 0x6ea9684a -//.word 0xf9da98aa -//.word 0x42054943 -//.word 0xb337622e -//.word 0x97e39b10 -//.word 0x898391e3 -//.word 0x2c821af9 -//.word 0x1d5ad53d -//.word 0x26fa06bd -//.word 0xb56aa165 -//.word 0x8cb1a50d -//.word 0xb9f7abb7 -//.word 0xc9e7bf11 -//.word 0x39576e42 -//.word 0x2d2b20e2 -//.word 0x6476a94a -//.word 0x6ce31a0f -//.word 0x1254ddc9 -//.word 0x1dc80119 -//.word 0x3c82d2ea -//.word 0x3c68adf6 -//.word 0x7ea9128c -//.word 0xa9a2fb91 -//.word 0x9c036cc6 -//.word 0xa72d4c48 -//.word 0xfadf735d -//.word 0x5d12046d -//.word 0x2221fd4f -//.word 0x582d0cc7 -//.word 0x42c0a54c -//.word 0x08b0510e -//.word 0xab474937 -//.word 0x3ea04371 -//.word 0x54548ca9 -//.word 0xb5575713 -//.word 0x551c556f -//.word 0x8600858a -//.word 0x6ce54e07 -//.word 0xb11dcb5f -//.word 0x7b8b6627 -//.word 0x9b04a892 -//.word 0x08fb4f36 -//.word 0x8b5ea113 -//.word 0xbbbb01d1 -//.word 0x2ca7c049 -//.word 0xe4603547 -//.word 0x0eb1108e -//.word 0xf316eb1d -//.word 0x252122b1 -//.word 0xfd1ce58b -//.word 0x48f08b73 -//.word 0x3e4629fd -//.word 0xb4eb640b -//.word 0x92798393 -//.word 0x8634c9a3 -//.word 0xfa3201a2 -//.word 0x44bf5ad8 -//.word 0x1dff7531 -//.word 0x55d5bd3d -//.word 0xc504f77c -//.word 0x849419d9 -//.word 0x5e786074 -//.word 0x816d9da4 -//.word 0x7a25d03d -//.word 0x60a5f70e -//.word 0x4fec28ae -//.word 0x18d5de79 -//.word 0x373e91d5 -//.word 0x066a89ba -//.word 0x30a4f371 -//.word 0x6725359b -//.word 0x5a387f76 -//.word 0xe19ca25c -//.word 0x7b2a268c -//.word 0xfbb7962d -//.word 0x7e3c1f90 -//.word 0xa0355ab6 -//.word 0xf0466512 -//.word 0xa124388f -//.word 0x82b336d5 -//.word 0x306c03c8 -//.word 0x89029652 -//.word 0x65458f63 -//.word 0x8146ca36 -//.word 0xbcbc34d5 -//.word 0x86a6dddf -//.word 0x95324f89 -//.word 0xd9de1fe3 -//.word 0xb3ddc15d -//.word 0x62bca089 -//.word 0xbe456e22 -//.word 0x28a4b94e -//.word 0xc1c8c020 -//.word 0xda0c8461 -//.word 0xac172290 -//.word 0x49005f27 -//.word 0xd3b68520 -//.word 0xeca06eb8 -//.word 0x6d80de73 -//.word 0x5b9d1660 -//.word 0x1721a59e -//.word 0xd4c0821f -//.word 0x4e9a58ac -//.word 0xba632129 -//.word 0xf8c1f61b -//.word 0x10f52567 -//.word 0xdcbe855c -//.word 0x027a06f4 -//.word 0x268f8c57 -//.word 0x5d09fea1 -//.word 0xe48599e5 -//.word 0x124d8b72 -//.word 0x8bc4bd55 -//.word 0xb705f01f -//.word 0x72c70be8 -//.word 0x0584b393 -//.word 0x55da1d54 -//.word 0x5b312070 -//.word 0xd49e8f44 -//.word 0x3a07c589 -//.word 0xf28881d6 -//.word 0xc716f566 -//.word 0x9762191c -//.word 0x4c0045c4 -//.word 0x0ec9ff9c -//.word 0xb87e1213 -//.word 0x88aee0d0 -//.word 0x1ad9f8f6 -//.word 0x97d5eba7 -//.word 0x2a715cc7 -//.word 0xb3595702 -//.word 0xc039e410 -//.word 0xb925db37 -//.word 0x5a39f912 -//.word 0x667c3492 -//.word 0x9a0a4c42 -//.word 0xe073a3cf -//.word 0xc65e4ec7 -//.word 0x2e726ca1 -//.word 0x4776b6fe -//.word 0xbcb6582e -//.word 0x2ba900f6 -//.word 0xd8d23490 -//.word 0xa3e4e8f4 -//.word 0x37295056 -//.word 0x8524f3f0 -//.word 0x71760101 -//.word 0xcafee616 -//.word 0x80441f88 -//.word 0x11184c46 -//.word 0x457687d4 -//.word 0x1badf594 -//.word 0x03c09a45 -//.word 0x4d0d72c9 -//.word 0xe22cbd2b -//.word 0x321a9ae0 -//.word 0x6d97d74d -//.word 0xf6cc088a -//.word 0x1531d666 -//.word 0xecae9aab -//.word 0xac012ba3 -//.word 0x085ff3da -//.word 0xea5e4926 -//.word 0x6512fbe5 -//.word 0xec762986 -//.word 0xc10e5a4b -//.word 0xafcbc94c -//.word 0xfc2f00c0 -//.word 0x9ab1a878 -//.word 0x9d63a0ac -//.word 0xf2d24cfa -//.word 0x4d2e30ac -//.word 0x63abbd3a -//.word 0x5a266a0f -//.word 0x7d0c0790 -//.word 0x35784e5b -//.word 0x349bbccc -//.word 0xf4619fc6 -//.word 0x60516fb0 -//.word 0xd1b661bd -//.word 0x3bfc3a71 -//.word 0xa95c6161 -//.word 0xe6bc393a -//.word 0x7dd0ad04 -//.word 0xe4860da8 -//.word 0xf5a118b0 -//.word 0x9da35a4f -//.word 0xd8f1b8a1 -//.word 0xdd324933 -//.word 0x95f867c6 -//.word 0x52a20650 -//.word 0xbe814544 -//.word 0x12394313 -//.word 0x886a34f3 -//.word 0x1290b4df -//.word 0x4c285adf -//.word 0xaf159189 -//.word 0x0841a3c8 -//.word 0x298717dc -//.word 0xdfd13da2 -//.word 0x247d0716 -//.word 0x95061a16 -//.word 0x26e02569 -//.word 0x14a372ff -//.word 0x1b6cbb7a -//.word 0xea803eee -//.word 0xd43313e5 -//.word 0xc809bea7 -//.word 0x831a01b8 -//.word 0x04bbf4a1 -//.word 0x405a57f3 -//.word 0x18aa268a -//.word 0x88016e0f -//.word 0x21fe60c0 -//.word 0xb96ea374 -//.word 0x6170efd9 -//.word 0x97d8d801 -//.word 0xbdd2e71d -//.word 0xcac8ef88 -//.word 0x40859e07 -//.word 0x5e9a534f -//.word 0x96002fc7 -//.word 0x41006f90 -//.word 0x9250f9c3 -//.word 0xc87f34f9 -//.word 0xa8921d11 -//.word 0x2bf0982d -//.word 0x747b03fe -//.word 0x04001142 -//.word 0x31d1d68a -//.word 0xd4b01e41 -//.word 0x43ef03ea -//.word 0x7fd6bfa9 -//.word 0xae45be05 -//.word 0xcb9af8ec -//.word 0x9cd57df7 -//.word 0xe4fb51f0 -//.word 0xdbb87b92 -//.word 0xdb47598f -//.word 0x5c9736d8 -//.word 0x22a61e18 -//.word 0xb531f181 -//.word 0x1290b7cc -//.word 0xa0dc337b -//.word 0x6552bb62 -//.word 0x7afc4765 -//.word 0xbc8ec783 -//.word 0xc58eba14 -//.word 0x1bb7fc4e -//.word 0xa6a0df0e -//.word 0x68997ed6 -//.word 0x68d54e11 -//.word 0xefcff69f -//.word 0xf7e6618d -//.word 0xe14a1124 -//.word 0x661cb626 -//.word 0xd0d1ff54 -//.word 0x6ad8b033 -//.word 0x357cf510 -//.word 0xdc0bf542 -//.word 0xea38abaf -//.word 0x3bbef192 -//.word 0xb046de7b -//.word 0x278b5297 -//.word 0xabbccf31 -//.word 0xe7228b79 -//.word 0xe102c384 -//.word 0xe5c55195 -//.word 0xbe56819b -//.word 0x2dcc21fa -//.word 0x9349d78e -//.word 0xf121b8ed -//.word 0x123f15ed -//.word 0x07c59867 -//.word 0xd4f3903a -//.word 0x694a8a92 -//.word 0xd4f1216a -//.word 0xb457174f -//.word 0xf11aa467 -//.word 0xaa280db3 -//.word 0x6f247991 -//.word 0xb10b0185 -//.word 0x76170638 -//.word 0x51e3c7c1 -//.word 0x92d13224 -//.word 0xbaa9fb18 -//.word 0x3282ec0e -//.word 0x3ce67c6e -//.word 0x2931a224 -//.word 0xcd3aeb5b -//.word 0x3035cb88 -//.word 0x86d830ab -//.word 0x61bd5dd2 -//.word 0x2608f6de -//.word 0xbd495789 -//.word 0x8da42aa8 -//.word 0xa82f39ae -//.word 0x429b8072 -//.word 0x68178732 -//.word 0xef71efd7 -//.word 0xaa7e4a7a -//.word 0xe0bd3028 -//.word 0xfc378fe2 -//.word 0x87a942e8 -//.word 0x54e5e538 -//.word 0xfa76e851 -//.word 0x8783e33c -//.word 0x73f629cd -//.word 0xd3dca027 -//.word 0xcf0fd07e -//.word 0x56133921 -//.word 0x113feab7 -//.word 0x951d4fc8 -//.word 0xdc134b80 -//.word 0xf64286b0 -//.word 0xfcae0916 -//.word 0x469f08de -//.word 0xdd48fe68 -//.word 0x33a7004c -//.word 0x12ac4a9c -//.word 0xd39d1f69 -//.word 0xd0b9d088 -//.word 0x1c1c1a95 -//.word 0x71e2b439 -//.word 0x698f29a9 -//.word 0xf1afe46f -//.word 0xfbb9896d -//.word 0x74398c1f -//.word 0x762efc20 -//.word 0xbeb19ff0 -//.word 0x60d844f4 -//.word 0xb9da55be -//.word 0xa674ac8f -//.word 0xf38ba71a -//.word 0x17127f8b -//.word 0x1e2ed5c8 -//.word 0xe6988ef7 -//.word 0x8e44e140 -//.word 0x2c40aed4 -//.word 0xbede122e -//.word 0x64153899 -//.word 0xcc2572f2 -//.word 0xed7a88af -//.word 0xf8d35020 -//.word 0x8ba37ef5 -//.word 0x28b7be01 -//.word 0xe71a003d -//.word 0x67361310 -//.word 0x0a3b76cd -//.word 0x62c56b7e -//.word 0xe6b94ce0 -//.word 0xea6f22ae -//.word 0xce177422 -//.word 0x75555dba -//.word 0xf82fe138 -//.word 0x9c2981ec -//.word 0x02ae0d35 -//.word 0x9eb2ba46 -//.word 0x6a967526 -//.word 0xdc4c76fa -//.word 0x15bb1787 -//.word 0x5b65e7f3 -//.word 0xc947facb -//.word 0x4500844b -//.word 0xb336a6d9 -//.word 0x683688d2 -//.word 0xe2daa889 -//.word 0xb6b0728d -//.word 0xc958102b -//.word 0xc32e8334 -//.word 0xc12af301 -//.word 0x4b0443b3 -//.word 0x859be9bf -//.word 0xa997fdab -//.word 0xb44d8f12 -//.word 0x60e43eee -//.word 0x53b60617 -//.word 0x96f95a06 -//.word 0x489f73df -//.word 0x947ae7af -//.word 0xe0a47df1 -//.word 0x471e4058 -//.word 0x4ab7d2c8 -//.word 0xc23003a5 -//.word 0x199da251 -//.word 0xba0e94f0 -//.word 0xc66f226f -//.word 0x09ad97c4 -//.word 0x2c1b0b77 -//.word 0x2c137a61 -//.word 0x0be019b4 -//.word 0xc5dbe93b -//.word 0x85d58ce3 -//.word 0x19b5587b -//.word 0xa362aab8 -//.word 0x92e47c7c -//.word 0xd1c63a57 -//.word 0x3ebed24f -//.word 0x5e900bdc -//.word 0x4f2f1737 -//.word 0xfe256bd4 -//.word 0x9a36ce2d -//.word 0x4840b0c2 -//.word 0x1866be5e -//.word 0x376db39b -//.word 0x676671a8 -//.word 0xad8e504a -//.word 0x4972b621 -//.word 0xeb57e82d -//.word 0x24d81f91 -//.word 0x1bd1df96 -//.word 0x817c84f2 -//.word 0xc7da1e4b -//.word 0x8e557ef7 -//.word 0x5fa39106 -//.word 0x9ceded82 -//.word 0xb631aaf5 -//.word 0xa1e5732c -//.word 0x85dddc3b -//.word 0xb76ef6c1 -//.word 0xe7d4226d -//.word 0x9bd122c1 -//.word 0xdc977616 -//.word 0x2ee8e5e1 -//.word 0xc67c5a34 -//.word 0xf8a3f188 -//.word 0xef2b52b9 -//.word 0xa0843e52 -//.word 0x0022670b -//.word 0x75238590 -//.word 0x8b32a684 -//.word 0xe9abc5c6 -//.word 0x83ff9ff3 -//.word 0x115bc22c -//.word 0xbf84e719 -//.word 0x2606812d -//.word 0x7b8d962c -//.word 0x0693ceeb -//.word 0xd63bca58 -//.word 0xb47db6b9 -//.word 0x55842239 -//.word 0xd4540da0 -//.word 0x5fb04362 -//.word 0x303beadb -//.word 0xbedd57d9 -//.word 0x3568265b -//.word 0x247c8998 -//.word 0x76a8e043 -//.word 0xa4d18a0e -//.word 0x29d8fb6d -//.word 0x35770f9c -//.word 0xa56c9ee3 -//.word 0x33da5119 -//.word 0xeaecb467 -//.word 0xdebb8c4e -//.word 0x19726aeb -//.word 0xd8b0807a -//.word 0xf82db41a -//.word 0xaba1f3cf -//.word 0x6fe1c8cd -//.word 0x414b2df4 -//.word 0x0d65a197 -//.word 0x6ac17a81 -//.word 0x84247d3a -//.word 0x59e6ac86 -//.word 0x299c5f2f -//.word 0x27f59604 -//.word 0x75e28e22 -//.word 0x4ffa9272 -//.word 0x871c1473 -//.word 0x3156fc3a -//.word 0x9f0540b7 -//.word 0x903eb539 -//.word 0xa46d2534 -//.word 0x133ca143 -//.word 0x9fb71869 -//.word 0xc7ad299c -//.word 0x3e593684 -//.word 0x9b41ba80 -//.word 0x525fdcea -//.word 0xe37f449c -//.word 0x51e82db2 -//.word 0xd63ebb92 -//.word 0xd5a78f2a -//.word 0x102d9a79 -//.word 0x1b642e51 -//.word 0x114c5b5b -//.word 0x8578785b -//.word 0xbb7000b5 -//.word 0x1855a031 -//.word 0xd8c38dfb -//.word 0xfffb1bee -//.word 0x92428c11 -//.word 0x06842562 -//.word 0xf93d88d3 -//.word 0x209a3d93 -//.word 0x81db928e -//.word 0xe2fba537 -//.word 0x8193bf85 -//.word 0x05fce33b -//.word 0xb5b3a76d -//.word 0xe8024340 -//.word 0xbcdde8f1 -//.word 0x0b0b5319 -//.word 0x9b86a12f -//.word 0x9523654e -//.word 0x3975f838 -//.word 0xcfef109c -//.word 0xe14a9494 -//.word 0xa726af72 -//.word 0xc3f424bc -//.word 0x2f13e175 -//.word 0x7339d69e -//.word 0x1b1507fd -//.word 0x6833e01d -//.word 0x461fc996 -//.word 0x7ecdfb8e -//.word 0x2d389280 -//.word 0x754ae33d -//.word 0x72fc0f30 -//.word 0x6fbed9e5 -//.word 0x5a19b4cd -//.word 0x7693203b -//.word 0x50d337b3 -//.word 0xf4058364 -//.word 0x608013f3 -//.word 0x39a6ce7a -//.word 0xbd0c07d1 -//.word 0xf9dc510c -//.word 0x3c779444 -//.word 0xcb5e609b -//.word 0xd652827a -//.word 0xabbad51d -//.word 0x2a465b52 -//.word 0x79d28c7d -//.word 0xf98deee0 -//.word 0x785ae619 -//.word 0xa876ceec -//.word 0xcf5b4743 -//.word 0xc1e5d173 -//.word 0x0cb499c1 -//.word 0x72d19125 -//.word 0x9c94c64e -//.word 0x0cc5efe5 -//.word 0x54014116 -//.word 0x855f8b4d -//.word 0xeb547e3d -//.word 0xf7d44c27 -//.word 0x7dba7659 -//.word 0x206adef5 -//.word 0x0ab524f3 -//.word 0xe0fd2f69 -//.word 0xf4990a0a -//.word 0xbd7af2ed -//.word 0x850fad91 -//.word 0x62671d1d -//.word 0x679614ec -//.word 0x1b596a48 -//.word 0x2afd4d76 -//.word 0x5b7cd9f4 -//.word 0xc2eae8fe -//.word 0x370f2c56 -//.word 0x07567b45 -//.word 0xe9e669dd -//.word 0x330e1c82 -//.word 0x4de65ca9 -//.word 0x6633eade -//.word 0x678c130c -//.word 0x25bb84f9 -//.word 0xdb666010 -//.word 0xd7ef9063 -//.word 0x73985bf0 -//.word 0x47eb3623 -//.word 0x9d59dd9d -//.word 0x2521a234 -//.word 0xeb73053b -//.word 0x85d58603 -//.word 0x91c7b7a1 -//.word 0x5fa295f2 -//.word 0xeac618dd -//.word 0x0df409d8 -//.word 0xf3f914ae -//.word 0xd08d1e7f -//.word 0xce7ad908 -//.word 0x4b019524 -//.word 0x41795993 -//.word 0x053932fb -//.word 0x35b8cb2c -//.word 0xebf33ea8 -//.word 0x370f2a63 -//.word 0xcd4006c7 -//.word 0xfae9b4fb -//.word 0xdd055965 -//.word 0xd3c56d6e -//.word 0x337a0e85 -//.word 0x3cb69a66 -//.word 0x4bae7c9c -//.word 0x51e34644 -//.word 0x85020115 -//.word 0x5608c09d -//.word 0xa4a97ccd -//.word 0x2ff31bb8 -//.word 0x502fd298 -//.word 0xe708ad12 -//.word 0x94ef6cbb -//.word 0x2abd91da -//.word 0x609ab770 -//.word 0xca1e2575 -//.word 0x08b7a365 -//.word 0x3e4b8dfb -//.word 0xc41e253c -//.word 0x1ef52db8 -//.word 0x2e7cb60d -//.word 0xa8e533ac -//.word 0xc7d2d1e0 -//.word 0x3e750b0c -//.word 0x72f57834 -//.word 0xe614e8be -//.word 0xf610b07a -//.word 0xc9c642e1 -//.word 0x811d019a -//.word 0xb4a25343 -//.word 0x2070f76d -//.word 0x9a5399e8 -//.word 0x482da342 -//.word 0x1098578a -//.word 0x50cc1b59 -//.word 0xd0c41314 -//.word 0xf59cf56b -//.word 0x373e1925 -//.word 0xd43dd020 -//.word 0xc601f793 -//.word 0xf325cc97 -//.word 0xa51d00e6 -//.word 0x391c0de2 -//.word 0x1b34c9d9 -//.word 0xf2c03b87 -//.word 0x17ffaedc -//.word 0x4c010500 -//.word 0xabc74e95 -//.word 0xdca69a3c -//.word 0x8bec0b5a -//.word 0x19c62e1c -//.word 0x92618bb8 -//.word 0xe0507bf6 -//.word 0x3e2e3af0 -//.word 0xef843d15 -//.word 0x2fecc674 -//.word 0x6a77b538 -//.word 0xac4da16e -//.word 0x5993270f -//.word 0x1e92823a -//.word 0x27155cc1 -//.word 0x9212e4e7 -//.word 0x248d2168 -//.word 0x3bba86ba -//.word 0x0462c693 -//.word 0xee87eaab -//.word 0x5f4ba0c3 -//.word 0xa50ed6e6 -//.word 0x2fd787ef -//.word 0xfdf5d54b -//.word 0x55e65900 -//.word 0xb877b7ee -//.word 0x142d7555 -//.word 0x3be40d98 -//.word 0x94b64041 -//.word 0x101eae44 -//.word 0x605da488 -//.word 0x661d35a3 -//.word 0xe9558ce6 -//.word 0x8c6c8099 -//.word 0x01a16987 -//.word 0x7aaa32be -//.word 0x609bb090 -//.word 0x480a32dd -//.word 0x23715a95 -//.word 0xb4d32b78 -//.word 0x48a36220 -//.word 0xa1e10a42 -//.word 0x33864b31 -//.word 0x932283a3 -//.word 0x2cc498b8 -//.word 0x341a8c38 -//.word 0xded9511c -//.word 0xd15fdf51 -//.word 0xda9885b8 -//.word 0xdd1e7c71 -//.word 0x12a4c259 -//.word 0x6d9425d1 -//.word 0x5ef79ec2 -//.word 0xbb96e1de -//.word 0xfb5e3228 -//.word 0xa4097ab6 -//.word 0x06fb9ab5 -//.word 0x2a6affaf -//.word 0x06c27709 -//.word 0xf24843d0 -//.word 0x60fd6db5 -//.word 0xc7c55c55 -//.word 0xe0c8a5be -//.word 0x1519242f -//.word 0x37964c20 -//.word 0x6f0fbb82 -//.word 0x77aa1148 -//.word 0x09850326 -//.word 0x989eab99 -//.word 0x3ff02227 -//.word 0xf7df51e8 -//.word 0x0cd60445 -//.word 0xd22f4000 -//.word 0x9453d775 -//.word 0xcd22391f -//.word 0x9a958d5d -//.word 0x70a10176 -//.word 0x0a5f5edb -//.word 0xa66bdfad -//.word 0x718a437f -//.word 0x408f215d -//.word 0x807f7c0d -//.word 0x70f39794 -//.word 0x8ebe0afd -//.word 0x4ed01655 -//.word 0x125a36fa -//.word 0x5733f616 -//.word 0x2c7b0866 -//.word 0xe97e9540 -//.word 0x1ddad1d4 -//.word 0xc8e5d2b2 -//.word 0xcb49a28c -//.word 0x9cf1933d -//.word 0x3e29d20b -//.word 0x71003f29 -//.word 0x26f17c80 -//.word 0x35c344b0 -//.word 0x52aeff51 -//.word 0x3ebf937e -//.word 0x3a7e7c94 -//.word 0xc1cd1f37 -//.word 0x76135b96 -//.word 0x5c9a62f0 -//.word 0x4536c758 -//.word 0x8d28d8b5 -//.word 0x07412d0c -//.word 0x384b8102 -//.word 0xc3a4c19c -//.word 0x252c634a -//.word 0xa261f924 -//.word 0x7fc90673 -//.word 0x72911073 -//.word 0x5773f657 -//.word 0x24dd848e -//.word 0x1f4f4545 -//.word 0x4f04982d -//.word 0x30d6067e -//.word 0xab5cd33c -//.word 0x4455d3b9 -//.word 0x96497f5b -//.word 0xfc6d489f -//.word 0x92c82c5e -//.word 0x5c94864f -//.word 0xc4e72ace -//.word 0x4a92b1db -//.word 0x77491266 -//.word 0x120573ca -//.word 0x97a73e97 -//.word 0xe5de7694 -//.word 0x374a4c04 -//.word 0x55e2ed29 -//.word 0x0c939f07 -//.word 0xdb290c6a -//.word 0xef73dd2a -//.word 0x52a28bae -//.word 0x5ff372af -//.word 0x798e283e -//.word 0xfcad0c09 -//.word 0x740022da -//.word 0x0d511e60 -//.word 0x4b64be32 -//.word 0xfb215d11 -//.word 0x6af4c66d -//.word 0xd475462b -//.word 0x1f4405a6 -//.word 0xc93795f4 -//.word 0x20b8cc6a -//.word 0xb168cf62 -//.word 0x0209703b -//.word 0x849abaa2 -//.word 0xc3c3c910 -//.word 0xe074e094 -//.word 0x41cab5d3 -//.word 0x87320f4d -//.word 0xc0d093e2 -//.word 0xde22db94 -//.word 0x69e0c98e -//.word 0x70271b66 -//.word 0xc5d73f9f -//.word 0x6a3a6872 -//.word 0x46e6e1cd -//.word 0x1ce4a29d -//.word 0xbe112149 -//.word 0x7ec56a7e -//.word 0xe6b37232 -//.word 0xa910a8e3 -//.word 0xd8f8ce20 -//.word 0x590d074b -//.word 0x9661319d -//.word 0x7296746a -//.word 0x81431ba7 -//.word 0x789aa3a9 -//.word 0xe248122f -//.word 0x159d8ba3 -//.word 0x65ed1e9d -//.word 0x9736e4a9 -//.word 0x99024c4a -//.word 0x708fb03f -//.word 0x712e2c04 -//.word 0xb4e9af9c -//.word 0xc668528e -//.word 0x9e16e92e -//.word 0xd27fd81d -//.word 0x0bfc2913 -//.word 0xb793dbdc -//.word 0xfd197ca1 -//.word 0xf699fa69 -//.word 0x1afab6df -//.word 0xf8dbda56 -//.word 0x2bc2ed0a -//.word 0x8976a4a9 -//.word 0x9da9fb12 -//.word 0x58da855c -//.word 0x037a001a -//.word 0x784e2ddd -//.word 0x9214dffb -//.word 0xe269518f -//.word 0xa3eabcc1 -//.word 0xf09a2948 -//.word 0x3584842d -//.word 0xe4a1f3d1 -//.word 0x69fb6631 -//.word 0x5f136e69 -//.word 0x04805277 -//.word 0xeada6042 -//.word 0xf0d681db -//.word 0x71b21002 -//.word 0xbbd4ecec -//.word 0xc3aecc43 -//.word 0x17e4d36f -//.word 0x13b16514 -//.word 0x588738db -//.word 0x7af5ae76 -//.word 0xf9ce62de -//.word 0x738800df -//.word 0x17e25bd7 -//.word 0x5dc9b9bb -//.word 0xf47d715a -//.word 0xfcf0b9e6 -//.word 0x766fb9b0 -//.word 0xf983e433 -//.word 0xa61a8754 -//.word 0x5ee2a2e8 -//.word 0x32f6f877 -//.word 0x1abc623f -//.word 0xea0d687c -//.word 0x839712e7 -//.word 0x4680fc7d -//.word 0xcf4ca981 -//.word 0xdf0119c4 -//.word 0x99899e24 -//.word 0xf257eb53 -//.word 0x634e6eda -//.word 0xe0dee05d -//.word 0x0e701a20 -//.word 0xb1042aca -//.word 0x6318a669 -//.word 0x8ccc40b7 -//.word 0x8e459b9c -//.word 0x404f5df3 -//.word 0x9e468691 -//.word 0xbf360083 -//.word 0x07417698 -//.word 0x9d416a20 -//.word 0x1faf82f2 -//.word 0x95c423b4 -//.word 0xa4dd4156 -//.word 0x052476e0 -//.word 0x356d516e -//.word 0x6d5ef078 -//.word 0xd4d3d157 -//.word 0xf480e505 -//.word 0x6ad9e625 -//.word 0xe22eeb43 -//.word 0x431b3a5c -//.word 0x271f5da1 -//.word 0x8e8b7878 -//.word 0xd39ed9c4 -//.word 0xdfeed166 -//.word 0x9c09c204 -//.word 0xac5d7a08 -//.word 0x5c55bfec -//.word 0xd3c52bb6 -//.word 0x90883bbe -//.word 0x1368a2b7 -//.word 0xd93de3ed -//.word 0x8e591ecc -//.word 0x7f242aa2 -//.word 0x4e04e5a6 -//.word 0xe980c838 -//.word 0xbca4bf6a -//.word 0x26a737c0 -//.word 0x2acb7834 -//.word 0x6885357d -//.word 0x4bde6191 -//.word 0x83194569 -//.word 0xb696d004 -//.word 0x72f62eae -//.word 0x67809c82 -//.word 0xd3c37a2e -//.word 0x3d7da1f6 -//.word 0x66bcf8fc -//.word 0x7d4342be -//.word 0x922f3ae0 -//.word 0x4ddbe22c -//.word 0xe00018d7 -//.word 0x3a216a05 -//.word 0x7d262b90 -//.word 0xb347c605 -//.word 0xbd2b53f0 -//.word 0x8b51685a -//.word 0x93b0328f -//.word 0x7b9ac425 -//.word 0x19e6ae39 -//.word 0x9e4ed2fc -//.word 0x0e16736f -//.word 0xf4ef8f6a -//.word 0x531a6fe3 -//.word 0xdfd07c6d -//.word 0x6de254ff -//.word 0xa99d1df7 -//.word 0x07f01a5e -//.word 0xfcd17b6e -//.word 0x6ddc7a51 -//.word 0x683da32c -//.word 0x12d1735c -//.word 0xe0882500 -//.word 0x0a0ec9b7 -//.word 0x3daa96ab -//.word 0x916681ce -//.word 0xba700f63 -//.word 0x82c067c1 -//.word 0x77fbab53 -//.word 0xe09788e4 -//.word 0xf6410c19 -//.word 0x517bb83f -//.word 0xa18ad747 -//.word 0x9e8f0e0f -//.word 0x42f433e4 -//.word 0x35096244 -//.word 0x89ef4ee8 -//.word 0xa7b6d602 -//.word 0x89c2d9c3 -//.word 0x2a734a20 -//.word 0x3b0587d6 -//.word 0x18b4e6ab -//.word 0xfa2491f7 -//.word 0x6e019564 -//.word 0x06e235f2 -//.word 0x4e74843e -//.word 0x01d43303 -//.word 0x7d3ca7e1 -//.word 0x75e24e5d -//.word 0xe61d342a -//.word 0x4ccad1a7 -//.word 0x15ee26a8 -//.word 0x569d0879 -//.word 0xbd1abb20 -//.word 0xc73fc2e3 -//.word 0x321ff60a -//.word 0xb6ebd6e6 -//.word 0xf0121e12 -//.word 0x9fac9bf9 -//.word 0x12193d98 -//.word 0xe1e56e86 -//.word 0xdcefa231 -//.word 0x41cb2f6a -//.word 0x32646024 -//.word 0x65e6c478 -//.word 0x1edbcced -//.word 0x5a9495f7 -//.word 0x4dca03bd -//.word 0x0f850f1f -//.word 0x933d62f8 -//.word 0xd83f22a0 -//.word 0x63530cb6 -//.word 0xec9cc31c -//.word 0x58bf6742 -//.word 0xe7486aa8 -//.word 0xaf499f9e -//.word 0x4943944f -//.word 0xca4a22fd -//.word 0xf465428e -//.word 0xae342248 -//.word 0xb2d579d9 -//.word 0x8607179a -//.word 0xad90c014 -//.word 0x1edd3ac4 -//.word 0xf5e9a51b -//.word 0x69600bc9 -//.word 0xfe03383b -//.word 0xfb4ecc62 -//.word 0x1f588eb7 -//.word 0x90fc037c -//.word 0x14364044 -//.word 0x83cffcb5 -//.word 0x7d3de98d -//.word 0x58c545e3 -//.word 0x5ce2abb0 -//.word 0x33ea308d -//.word 0x9befabbe -//.word 0x5ee35470 -//.word 0x8400913f -//.word 0xc7670cfb -//.word 0x470809ac -//.word 0x7fc1f7d3 -//.word 0x78ca44f3 -//.word 0x3c507650 -//.word 0x8e6078f7 -//.word 0xd80731fe -//.word 0x65b85b0d -//.word 0xd0ed931e -//.word 0xbd11ac80 -//.word 0xc69e4922 -//.word 0xb983ab0e -//.word 0x00c8c734 -//.word 0x60749c69 -//.word 0xe7afc3af -//.word 0x1f2448b7 -//.word 0x88a9b8a4 -//.word 0x45227b12 -//.word 0x16a26457 -//.word 0x86d48708 -//.word 0x669a4bc0 -//.word 0x79f3c01c -//.word 0x7122320a -//.word 0x1a0dfe44 -//.word 0xd6e3a417 -//.word 0x49011e69 -//.word 0x551770fa -//.word 0x498681ea -//.word 0x550d297c -//.word 0x42a58b19 -//.word 0x5fa9a598 -//.word 0xbf3a25bc -//.word 0xa1e27efe -//.word 0x30773c8d -//.word 0x6d439494 -//.word 0x696140bb -//.word 0xb76a8af0 -//.word 0x2152a667 -//.word 0x9a8c44df -//.word 0x74756628 -//.word 0xd3ef6fe2 -//.word 0x624c7d87 -//.word 0x446ff9ac -//.word 0x4e2d6d83 -//.word 0x73f995a5 -//.word 0x7fc1b80e -//.word 0x09133869 -//.word 0xa284698f -//.word 0x53529f4a -//.word 0x47488b5e -//.word 0xc4e2c7ca -//.word 0x60b2af4b -//.word 0x71027322 -//.word 0xc5bb6a17 -//.word 0x9386a9be -//.word 0xb230d5f9 -//.word 0x095335be -//.word 0x47330b1a -//.word 0xd4e62576 -//.word 0x07b8af1a -//.word 0x99cd4bef -//.word 0x59086489 -//.word 0x222cbe64 -//.word 0x0a41526e -//.word 0xdd3a5ac6 -//.word 0xcad4a8c4 -//.word 0x5bc13b39 -//.word 0xab0614f8 -//.word 0xd3a24695 -//.word 0xa5704d6c -//.word 0x9d4ea0e5 -//.word 0x147f8af7 -//.word 0xb74e35eb -//.word 0x38f40863 -//.word 0x43bc329a -//.word 0xb46587ed -//.word 0x07c88c9b -//.word 0x0fbbcdc9 -//.word 0xeb3477c9 -//.word 0x37b2229b -//.word 0x7fd8efb4 -//.word 0xf95bd3ff -//.word 0x731f3222 -//.word 0x8a9db002 -//.word 0x1d884489 -//.word 0x01b08ea7 -//.word 0xf6266a96 -//.word 0xdaa1c563 -//.word 0x1d20afaa -//.word 0x75d1b2a1 -//.word 0xd3326257 -//.word 0x9576363e -//.word 0xfd2a96e8 -//.word 0xe218350e -//.word 0xa56ca1d6 -//.word 0x67151955 -//.word 0x796e9e53 -//.word 0x141e4c4f -//.word 0x4b3debc3 -//.word 0x3db8c2aa -//.word 0x8ff6ab3e -//.word 0x1abb6d06 -//.word 0xe04d4510 -//.word 0x45d6c67c -//.word 0x7c0ae43a -//.word 0x3f094b13 -//.word 0xc387f5ee -//.word 0xeb2afb4c -//.word 0xbc33ab16 -//.word 0x1161dc98 -//.word 0x8f127ecd -//.word 0xdcac75dd -//.word 0x0c3ba8e4 -//.word 0x5c5c54f5 -//.word 0x2359a75f -//.word 0x05958a2e -//.word 0x6a2bbef5 -//.word 0x2ed22acb -//.word 0x9b047394 -//.word 0x945fce82 -//.word 0x124b12db -//.word 0xd5dd12fc -//.word 0x53fb299e -//.word 0xf5c11658 -//.word 0x82240a65 -//.word 0xdbd500a8 -//.word 0xea684ded -//.word 0xd5b67872 -//.word 0x77804ba6 -//.word 0x10552a30 -//.word 0x3bb5a433 -//.word 0x217648d0 -//.word 0xed67baed -//.word 0x80340635 -//.word 0x65893360 -//.word 0x077a1cb5 -//.word 0x21237bcd -//.word 0x778b4799 -//.word 0xc4cf40a7 -//.word 0xf37cc8a0 -//.word 0x913cf416 -//.word 0x83b5e37c -//.word 0xf4ae4e76 -//.word 0x92736154 -//.word 0xfa7bc9d8 -//.word 0x70490f40 -//.word 0xd4902480 -//.word 0xd19a3dd0 -//.word 0x58eae066 -//.word 0x4d213f85 -//.word 0x801ec6b6 -//.word 0xde69f056 -//.word 0xe9d25e50 -//.word 0x65552a2c -//.word 0x54417949 -//.word 0x259a4f66 -//.word 0x29bba867 -//.word 0x463fc456 -//.word 0xef22c2a9 -//.word 0x532470c3 -//.word 0xd56e62bd -//.word 0xbd784165 -//.word 0x2d2a6687 -//.word 0x5642a76c -//.word 0xebf571a1 -//.word 0xd6d918f9 -//.word 0x2b026ad5 -//.word 0x5a6b8aa3 -//.word 0xa898fca5 -//.word 0xe07afcf4 -//.word 0x459314c4 -//.word 0xcc5bede9 -//.word 0x88e1669b -//.word 0x66b5e376 -//.word 0x1a06e7c4 -//.word 0x5908e6ff -//.word 0x49985492 -//.word 0x362302e0 -//.word 0x86c4aa87 -//.word 0xefacc9e6 -//.word 0xe7c7acdd -//.word 0x5c9dced3 -//.word 0xa67661fe -//.word 0xbac12bde -//.word 0xa0b6930b -//.word 0x273bfc31 -//.word 0xd7045159 -//.word 0x27ffe16a -//.word 0xf0ef6eef -//.word 0x2256801a -//.word 0xb699ff09 -//.word 0xe35f0149 -//.word 0x953ae199 -//.word 0x1b8991f0 -//.word 0x1f9d31c1 -//.word 0xdc1ae07d -//.word 0x8ba0d25a -//.word 0x1eaba253 -//.word 0x31b8ea6f -//.word 0x3eaa1247 -//.word 0x106b65c2 -//.word 0x7ad66a24 -//.word 0x48d57147 -//.word 0x76c66c27 -//.word 0xa02400a5 -//.word 0xba63dc84 -//.word 0x011b4ab8 -//.word 0x316903e0 -//.word 0xf9934811 -//.word 0xacea2ed5 -//.word 0x39f53a73 -//.word 0x5dcb2d71 -//.word 0x17c12158 -//.word 0x5d45d5b7 -//.word 0x0d0a466a -//.word 0x26667f1c -//.word 0x38f8b10b -//.word 0x198d860b -//.word 0xda44b3ce -//.word 0xf9f1cd62 -//.word 0xd8c05dfb -//.word 0x6e1b36f3 -//.word 0x3dcd060f -//.word 0x84672c04 -//.word 0xb5e2c93a -//.word 0x29871acf -//.word 0x130c05df -//.word 0xb300f103 -//.word 0xcc69db17 -//.word 0x57aba641 -//.word 0x79abb32e -//.word 0xb335b29f -//.word 0x599bb825 -//.word 0x459f9128 -//.word 0xcc93572e -//.word 0xf1bf435a -//.word 0xd903c433 -//.word 0x7fbecea8 -//.word 0xa9ee7550 -//.word 0x1b98baf6 -//.word 0x0a6aa554 -//.word 0xd39f941f -//.word 0xed23d244 -//.word 0x1cf76b72 -//.word 0xe8d83fd8 -//.word 0x4e1b5630 -//.word 0xb5dc73fc -//.word 0x2457ec0f -//.word 0xb196b850 -//.word 0x3d4dcabb -//.word 0x5e029da8 -//.word 0x9d701150 -//.word 0xe22e758d -//.word 0x2c8ce5e1 -//.word 0x85bed6ba -//.word 0x363ceff4 -//.word 0x37681ba0 -//.word 0xe971dc04 -//.word 0x0778e2e2 -//.word 0xdaf2dcfe -//.word 0xad4e8eda -//.word 0x81d723c4 -//.word 0x02dbc512 -//.word 0xb90d6cad -//.word 0x8228f3cc -//.word 0x41d57102 -//.word 0xd1cfc67b -//.word 0x3d457483 -//.word 0x3380b147 -//.word 0xb5c5bae0 -//.word 0x127d698d -//.word 0x15930a40 -//.word 0x7c1e6b5d -//.word 0xab4032be -//.word 0xa24d73fa -//.word 0x2d3082e7 -//.word 0x5a0b065d -//.word 0x301e4f3d -//.word 0x9eeaeab2 -//.word 0xb29672b7 -//.word 0x0c91a8da -//.word 0x9179c63f -//.word 0x643c11e7 -//.word 0x127dae32 -//.word 0x0c39b6a3 -//.word 0x5baa8de4 -//.word 0x8f6b6f0a -//.word 0xf8de4b19 -//.word 0x19cbd5cb -//.word 0x5a49d78d -//.word 0xfde2c7cb -//.word 0x53f29f6d -//.word 0x3050e9a2 -//.word 0x9c3019dc -//.word 0xcb48201c -//.word 0x50323e6f -//.word 0x8d1218b8 -//.word 0x6e780ab1 -//.word 0x5788be2d -//.word 0x5a58fea0 -//.word 0xae99c6e0 -//.word 0x5c7a9e2d -//.word 0x3cc92670 -//.word 0x205bf3c0 -//.word 0x4faf992a -//.word 0x35ce09b2 -//.word 0x58751e95 -//.word 0x8e7672d1 -//.word 0x6e5c76e7 -//.word 0x044ec2e0 -//.word 0xc936a98e -//.word 0xd1221114 -//.word 0x47ea81a9 -//.word 0x17137c98 -//.word 0xeaf30e8b -//.word 0x5716a40a -//.word 0x57e1213f -//.word 0xfa752dfc -//.word 0x59d6d0ff -//.word 0xcc4d4174 -//.word 0x5d0af8bb -//.word 0x7c0e0a6c -//.word 0xf448b698 -//.word 0x1dfe3b52 -//.word 0x536fed6e -//.word 0xa8b78889 -//.word 0xd6f2c44a -//.word 0x78a42ae6 -//.word 0x795925ea -//.word 0xcc885c35 -//.word 0x5dbd3f43 -//.word 0x48f7e0b2 -//.word 0x4a4f05fe -//.word 0x74db7b90 -//.word 0x27d2adf7 -//.word 0x3cf17575 -//.word 0x831d31bd -//.word 0x6f491afb -//.word 0x0f9ad115 -//.word 0x40c93b30 -//.word 0x22ca8f77 -//.word 0xc8abad17 -//.word 0x34beb28e -//.word 0x82fac926 -//.word 0x639f44bc -//.word 0xcd19ebc6 -//.word 0xf1279395 -//.word 0x6e3cf3d7 -//.word 0xc426b45f -//.word 0x0bedc729 -//.word 0xe5fefb98 -//.word 0xb188cf03 -//.word 0x01278470 -//.word 0x4ec0779f -//.word 0xebacae4b -//.word 0x3818b1ac -//.word 0x18ab9b40 -//.word 0xa56a70cb -//.word 0x22d9b19d -//.word 0x30632e13 -//.word 0x45fc1c60 -//.word 0x5b05678d -//.word 0xe5704abf -//.word 0x07241cb9 -//.word 0x06a36da1 -//.word 0xfeea5107 -//.word 0xd399fc23 -//.word 0x69538f5e -//.word 0x18683215 -//.word 0x5ab16399 -//.word 0xc7bc8d7a -//.word 0x4429dd05 -//.word 0x7754510b -//.word 0x7e3512e4 -//.word 0xe08403b4 -//.word 0xc3209aed -//.word 0x60b1ef15 -//.word 0xb58c12ca -//.word 0x79d8a203 -//.word 0x55ef9b98 -//.word 0x51077005 -//.word 0x8d125a6b -//.word 0x31e3efd7 -//.word 0xa691f6c7 -//.word 0x07207aea -//.word 0xd25e1d28 -//.word 0xe40cafe2 -//.word 0xa43eff7b -//.word 0x7e05f117 -//.word 0x934ad1a2 -//.word 0xaefde715 -//.word 0x7a704cf4 -//.word 0xf3fdfc1b -//.word 0x1bef2bbb -//.word 0xeea0dda0 -//.word 0x97deb1b5 -//.word 0xe493fdc9 -//.word 0xf8a52093 -//.word 0x401c14f4 -//.word 0xa883437d -//.word 0x0e909c31 -//.word 0xf607e58c -//.word 0x80db53c4 -//.word 0x9896584e -//.word 0x6dfcbca4 -//.word 0x24ebef46 -//.word 0xcd869efe -//.word 0x96938469 -//.word 0x3e2083b3 -//.word 0xcd6df3a2 -//.word 0x83063ad6 -//.word 0x0e309c4f -//.word 0x0086552f -//.word 0x7fe4e5c1 -//.word 0x3e84acbb -//.word 0xad67b6c0 -//.word 0x6df7d829 -//.word 0x07eafc05 -//.word 0xdd69b95e -//.word 0x617227bf -//.word 0x847bf1f2 -//.word 0x7258ab0e -//.word 0x7c5e66b2 -//.word 0x55c9828b -//.word 0x825bc41c -//.word 0x0c46a8be -//.word 0x784cf9e5 -//.word 0xf8259ea6 -//.word 0xe321b776 -//.word 0x630ee935 -//.word 0x6e5cf56b -//.word 0xf77f90d1 -//.word 0x65956f13 -//.word 0x4449a1d4 -//.word 0x3af721f2 -//.word 0x3d11ac0c -//.word 0x04c1d042 -//.word 0xbbcf463c -//.word 0xfbc6816e -//.word 0xf952879a -//.word 0xfeed0096 -//.word 0x17ba8c4f -//.word 0x0db15a0e -//.word 0x97fdf7fa -//.word 0xcfa263df -//.word 0xe3636a2d -//.word 0x0de33144 -//.word 0xc50a10ee -//.word 0x35aa9f2d -//.word 0xed631438 -//.word 0xd8c4ccc0 -//.word 0x6eb22777 -//.word 0x2c0e99d3 -//.word 0x4192fe0f -//.word 0x8bfc2e74 -//.word 0xc16fd2d6 -//.word 0xf2167661 -//.word 0x2e0adf96 -//.word 0x83769e90 -//.word 0x2bf9e58c -//.word 0x034b9aa8 -//.word 0x3f24aaeb -//.word 0x5c59a086 -//.word 0x57487659 -//.word 0x1d77aab9 -//.word 0x42789571 -//.word 0xf510f906 -//.word 0x3498d940 -//.word 0x3ca28de5 -//.word 0x44e015c8 -//.word 0x6a42ae02 -//.word 0xee5fa380 -//.word 0x9e1666be -//.word 0x9175dfd1 -//.word 0x18d904ab -//.word 0xf257aa9b -//.word 0xbf5b9a13 -//.word 0xb78fe8ae -//.word 0x9cff8071 -//.word 0xed7a0252 -//.word 0x5d3bd0f6 -//.word 0x84c965bf -//.word 0xd31be806 -//.word 0xcd0000a5 -//.word 0x74beebb9 -//.word 0x02f9caa6 -//.word 0xdad73f5b -//.word 0xbe623ad7 -//.word 0x422e10eb -//.word 0x813bce42 -//.word 0x0e1ccca0 -//.word 0x2e598567 -//.word 0x4413a55f -//.word 0x8ce664b6 -//.word 0x0c141346 -//.word 0xc8dff417 -//.word 0x36364f25 -//.word 0xf194c263 -//.word 0xb126d9ff -//.word 0x7b2cdfe8 -//.word 0x15a1f38e -//.word 0xbd1e5ee9 -//.word 0x1afc23bc -//.word 0x73b9d81b -//.word 0x1f9cb52b -//.word 0x3d9ceb29 -//.word 0xa57f36ad -//.word 0x1e3fb630 -//.word 0xd1b1fbcc -//.word 0xfd685f44 -//.word 0xedd89844 -//.word 0x27b78dea -//.word 0xe7a96984 -//.word 0xcb1bee9c -//.word 0xd06f0d32 -//.word 0x7d5ab348 -//.word 0x5e8be5a4 -//.word 0xb48e0fd1 -//.word 0x6bef9967 -//.word 0x4ca2bc8c -//.word 0x74a294bb -//.word 0x05d976c4 -//.word 0x1b408314 -//.word 0x02477d37 -//.word 0xa677da9b -//.word 0x4a561797 -//.word 0x7d8b4fab -//.word 0x4a420c0a -//.word 0xb0d25d55 -//.word 0x529d29aa -//.word 0x6e38c2dd -//.word 0x13cdbd05 -//.word 0x8fbd023b -//.word 0x27891f9e -//.word 0x0cf2e29b -//.word 0x8a5f266b -//.word 0x8180eddc -//.word 0x1931af55 -//.word 0xb2a1f214 -//.word 0x1ab31bbb -//.word 0x03a4840b -//.word 0xb4efceef -//.word 0xfe6d79bc -//.word 0x72c1b1b7 -//.word 0xd1f36bd8 -//.word 0xc45bb1cd -//.word 0xcdc13a42 -//.word 0x7ec23e60 -//.word 0xe9758893 -//.word 0x574fcd91 -//.word 0x3d443c98 -//.word 0x6b2f56f6 -//.word 0x877400cf -//.word 0xbae4d71b -//.word 0xa9e1c3ee -//.word 0xa7c2cffc -//.word 0x2879385c -//.word 0x7972c38c -//.word 0xafbf54b6 -//.word 0xde73bd31 -//.word 0x8b4bd44b -//.word 0x6394c846 -//.word 0x2d48b5a0 -//.word 0xfd7b7598 -//.word 0xaaf5baed -//.word 0x832159e9 -//.word 0x3e26e99e -//.word 0x31538d70 -//.word 0xc5c00ed3 -//.word 0x27322d56 -//.word 0x404037e1 -//.word 0xe8b4d93a -//.word 0x563436ce -//.word 0xdb2237af -//.word 0xd1c022d9 -//.word 0xce986fb9 -//.word 0x1d1bd7f0 -//.word 0x6e88ad54 -//.word 0xcc0f7137 -//.word 0xd037a3ed -//.word 0x147dd588 -//.word 0xeb3d04e6 -//.word 0x4fd628ee -//.word 0x1b0a0a16 -//.word 0x7ba35628 -//.word 0xa05cf147 -//.word 0xb8fe8c2d -//.word 0x1dca7ab6 -//.word 0xcc17bea2 -//.word 0x1a3c6996 -//.word 0xa2b02365 -//.word 0x8270078e -//.word 0xc7a1b406 -//.word 0x2577a037 -//.word 0xec55b048 -//.word 0x3736069f -//.word 0x664b1ba4 -//.word 0xcfe50dc8 -//.word 0xb1963ac7 -//.word 0x69930d29 -//.word 0xe95d180f -//.word 0x65a1632c -//.word 0x4f5c0412 -//.word 0x8642f0af -//.word 0xcb611117 -//.word 0x74029984 -//.word 0x64d0959a -//.word 0x3a3cc5f0 -//.word 0xc91fabcd -//.word 0xc9a1e22f -//.word 0xcb5bb112 -//.word 0x73b8e0ee -//.word 0xe1a1ca82 -//.word 0x7059b4d0 -//.word 0xa3a55d69 -//.word 0x5c31d6ea -//.word 0x4f2f94c7 -//.word 0xb741c447 -//.word 0x4799ded0 -//.word 0x645e7d65 -//.word 0x91526e6d -//.word 0x2bb307b6 -//.word 0x565fbab9 -//.word 0x373bea20 -//.word 0x64d4fc85 -//.word 0x9847b27d -//.word 0xac5fb4d5 -//.word 0xc2fe701b -//.word 0xc4be2460 -//.word 0x0dd7393d -//.word 0x6544d314 -//.word 0x3321a698 -//.word 0xee580b90 -//.word 0xd57c53d8 -//.word 0xe0f55ba8 -//.word 0xf65e6018 -//.word 0x602b15e4 -//.word 0x7e8ff36d -//.word 0xb89dd101 -//.word 0xb8adb45c -//.word 0xd601e86f -//.word 0xd4a85060 -//.word 0xcca3fad1 -//.word 0x6647f665 -//.word 0x4ee26980 -//.word 0xe6a1dd4f -//.word 0x38b1db09 -//.word 0x2ea5bc74 -//.word 0x0518bcaa -//.word 0xff93501d -//.word 0x58b1bad9 -//.word 0x7c80da09 -//.word 0x772b47bd -//.word 0xadd69eea -//.word 0xcbca1ab2 -//.word 0xfdd265e6 -//.word 0x62e4aeca -//.word 0xbd04fc18 -//.word 0x6d66c247 -//.word 0x9fd3b30c -//.word 0xc24dd722 -//.word 0x3bf6df47 -//.word 0x5a2eb687 -//.word 0x8dfc58bc -//.word 0xd4afe756 -//.word 0x75c5fc58 -//.word 0xf10b3ba3 -//.word 0x36062a77 -//.word 0x16924337 -//.word 0xf8c9476c -//.word 0xce26d60d -//.word 0x47ea3dfe -//.word 0x45bf8fd6 -//.word 0x919cf7e5 -//.word 0xcee84c76 -//.word 0xabe2e651 -//.word 0x5d40b084 -//.word 0x4d167f63 -//.word 0x0dfaa2ce -//.word 0x9166bbb2 -//.word 0x9c5ecdd2 -//.word 0x785295c8 -//.word 0xea451e46 -//.word 0x652f90a2 -//.word 0x7ea04892 -//.word 0xa0a72e34 -//.word 0x01f24351 -//.word 0xd4367ae2 -//.word 0xc1d2c9d3 -//.word 0x92af7f08 -//.word 0x2f6ad89e -//.word 0xccb5cf73 -//.word 0x61fa33e8 -//.word 0x5a42fde5 -//.word 0x9056e11e -//.word 0x79232395 -//.word 0x9b63ac60 -//.word 0x477a5dad -//.word 0x839ea303 -//.word 0x483b4ccb -//.word 0xee96990e -//.word 0xe4b09480 -//.word 0xa46da3be -//.word 0xe6f55ed4 -//.word 0x145b9e02 -//.word 0xff7dd6c0 -//.word 0xd02ba7ff -//.word 0x418baeb2 -//.word 0x0dbba18d -//.word 0xa4b99a0c -//.word 0x2480b2b8 -//.word 0x8574d2a6 -//.word 0x1300c640 -//.word 0x227e9347 -//.word 0xfd570b19 -//.word 0x1f6b9e30 -//.word 0xa6b373ec -//.word 0x0424b892 -//.word 0xf8d73694 -//.word 0xbd682813 -//.word 0x819c4da2 -//.word 0x18463c4d -//.word 0xf26bf8da -//.word 0x4aa4c44e -//.word 0xa1c438b3 -//.word 0x6bbb9519 -//.word 0x08ba56db -//.word 0xf5980723 -//.word 0x44755ab0 -//.word 0x499d78d7 -//.word 0x97ae95c8 -//.word 0x2bfec713 -//.word 0xe637186b -//.word 0x4144daa9 -//.word 0x3c713a14 -//.word 0x97cd18df -//.word 0x45d316f3 -//.word 0x1e4aefef -//.word 0xd46a0b6d -//.word 0x28405088 -//.word 0x5d543a9b -//.word 0xed882e4a -//.word 0x7c430bc7 -//.word 0x0acf034e -//.word 0x6c00a9f2 -//.word 0xfd174a9c -//.word 0x91e58151 -//.word 0xaa3406b3 -//.word 0xef62c7cb -//.word 0xd94f3a05 -//.word 0xb07af17c -//.word 0xb6666f78 -//.word 0xa2433a35 -//.word 0x4fca31e7 -//.word 0xb66920fa -//.word 0x1aa0929e -//.word 0x82abe683 -//.word 0x6c61a5e1 -//.word 0xc05c13bc -//.word 0x035a0466 -//.word 0xcde3f145 -//.word 0x7d2c4bd6 -//.word 0x2b3c0ff2 -//.word 0xde4d9b51 -//.word 0xff75c04c -//.word 0x0e8518e7 -//.word 0x94329a0e -//.word 0x59726b1f -//.word 0xd629f7a9 -//.word 0xed054174 -//.word 0xd8a677c1 -//.word 0x6003cad2 -//.word 0x4f097dad -//.word 0x27853b1e -//.word 0x1443adfb -//.word 0x20774cab -//.word 0xa65d74e9 -//.word 0x091dbac6 -//.word 0xa5f180ed -//.word 0x0689c72b -//.word 0x58af442f -//.word 0x1f27b58e -//.word 0x29d9750a -//.word 0xc0324e13 -//.word 0x24c78f8e -//.word 0x383b5fd6 -//.word 0x7b635100 -//.word 0x3aa93964 -//.word 0x04ae3d58 -//.word 0x5f342f3f -//.word 0xb93a1ac3 -//.word 0xa1681a5e -//.word 0x37ae711f -//.word 0xe129d8ab -//.word 0x40461382 -//.word 0x6329c883 -//.word 0x3a5091b3 -//.word 0x4d73503a -//.word 0xadafc3ae -//.word 0x2be45894 -//.word 0xc95c4224 -//.word 0x6eadcc4d -//.word 0xdee0edf9 -//.word 0xe8d21d92 -//.word 0xe2db68c5 -//.word 0x52aec186 -//.word 0xee809854 -//.word 0xc76dafbe -//.word 0xc1172926 -//.word 0x4690e4c5 -//.word 0x3b7a08ef -//.word 0x336ce098 -//.word 0xe398e918 -//.word 0xd7ab292b -//.word 0x63f5c23c -//.word 0xdbcac7e3 -//.word 0x06284eac -//.word 0xd199c71a -//.word 0x415b8ceb -//.word 0xabbfb99e -//.word 0x27cf3d33 -//.word 0x42333132 -//.word 0xf35669ee -//.word 0xd1c4490b -//.word 0x82d7da3e -//.word 0x77921d54 -//.word 0xd6cda076 -//.word 0xb8924eab -//.word 0x95c88b9e -//.word 0xfc0e81a2 -//.word 0x88eab4f3 -//.word 0x0f23dd3e -//.word 0x1c6bf564 -//.word 0xa041907c -//.word 0xe4166c17 -//.word 0xc2af4ac7 -//.word 0x15cafce2 -//.word 0x6e04c083 -//.word 0x09faccd2 -//.word 0xffaf2a85 -//.word 0xbc2ec6a7 -//.word 0xb470c698 -//.word 0x527f1956 -//.word 0x31dc53fa -//.word 0x8f1eb886 -//.word 0xffdd96dd -//.word 0x5dced913 -//.word 0x072fd9e7 -//.word 0x4a66768e -//.word 0x1be567b3 -//.word 0x0850cfbb -//.word 0x6ee2114d -//.word 0xeb0de612 -//.word 0x1660adb9 -//.word 0x6eae023f -//.word 0x916d916d -//.word 0xaf5c2ca2 -//.word 0x3d691cd2 -//.word 0xeed1b5cf -//.word 0xdf892ec7 -//.word 0x11ddaf0e -//.word 0x1d57aa1e -//.word 0x23e26fdd -//.word 0x042ffb1e -//.word 0xd1581169 -//.word 0x83c38dff -//.word 0xec4af419 -//.word 0xed984f71 -//.word 0xead63a03 -//.word 0x7b883815 -//.word 0x64b14975 -//.word 0xc83ebf02 -//.word 0x99a14d6d -//.word 0x53bd6141 -//.word 0xea02b321 -//.word 0x00d91e51 -//.word 0x5c42b079 -//.word 0x98bbfda5 -//.word 0x1965b88f -//.word 0x45628421 -//.word 0xef810736 -//.word 0x161d40a1 -//.word 0xd0421b70 -//.word 0x81124372 -//.word 0x506738f6 -//.word 0xdcbaa1d6 -//.word 0x2a44e3b4 -//.word 0xe362f284 -//.word 0xbc3e684a -//.word 0x35acd425 -//.word 0x8652548d -//.word 0xd60c66d9 -//.word 0xaf8ffb04 -//.word 0xaf4ccdb0 -//.word 0x8097f36b -//.word 0x0a08b232 -//.word 0xe6219733 -//.word 0x1632c2d7 -//.word 0xf47a8500 -//.word 0x698f2e90 -//.word 0x5f00202a -//.word 0x7938293c -//.word 0x01a50f3d -//.word 0x221a6c33 -//.word 0x5772bc79 -//.word 0x2377b5bf -//.word 0x0302d752 -//.word 0xa163439e -//.word 0x4a02d0f1 -//.word 0xa2475c81 -//.word 0x96b860b1 -//.word 0x9361c790 -//.word 0xf57901a2 -//.word 0xc34253e4 -//.word 0x9931710a -//.word 0xe54f4e0b -//.word 0x56df33df -//.word 0x92410f87 -//.word 0x28160e4f -//.word 0xc5a56c50 -//.word 0xaa7e8c38 -//.word 0x5d5c444e -//.word 0x9f507bb0 -//.word 0x9f1cf7df -//.word 0x6ddd707e -//.word 0xb1eee957 -//.word 0x9d08409f -//.word 0x20ae037b -//.word 0x5dc885c3 -//.word 0x5b8e3105 -//.word 0xfea71fcd -//.word 0x3692e523 -//.word 0x7646b056 -//.word 0x681593f8 -//.word 0xdfd61e2a -//.word 0x0d43331a -//.word 0xf6a015c9 -//.word 0x249ec212 -//.word 0x9c7e83e8 -//.word 0x1279c1df -//.word 0x59601aed -//.word 0x1d80b472 -//.word 0xd4c8d177 -//.word 0xf22ea433 -//.word 0x5c4e64d4 -//.word 0x20549e7c -//.word 0x631dcf89 -//.word 0x9b993219 -//.word 0xfe74d7cd -//.word 0x39f5f5ce -//.word 0x6626810e -//.word 0x3835ffd1 -//.word 0x791a996b -//.word 0xb77a6e4b -//.word 0x3acb2c38 -//.word 0x39bae1db -//.word 0x4dc90e7e -//.word 0x253dfe13 -//.word 0x7c375578 -//.word 0x4821ecf9 -//.word 0x344bdc17 -//.word 0x51d6d987 -//.word 0x08d2c27e -//.word 0x54a3752c -//.word 0x2ea9e886 -//.word 0x48207649 -//.word 0xfd44763c -//.word 0x88b912b5 -//.word 0x752b575e -//.word 0x56328839 -//.word 0xb778b8e2 -//.word 0x541d9715 -//.word 0x895a8d6f -//.word 0x09650579 -//.word 0xd3950ce2 -//.word 0x62c71a0c -//.word 0x24002fcb -//.word 0x2e542269 -//.word 0x2e0636ed -//.word 0xa1f0ef9c -//.word 0x462524c1 -//.word 0xd2d654aa -//.word 0xe5723ef3 -//.word 0x3d11ab07 -//.word 0x2a138fe3 -//.word 0x4104501d -//.word 0x55c36625 -//.word 0xa3e424cc -//.word 0x4d52d502 -//.word 0x0a390be4 -//.word 0x1b2334f6 -//.word 0x81616eac -//.word 0x6dac9d30 -//.word 0xf80cba5f -//.word 0x14f96e14 -//.word 0xc2c0dfaa -//.word 0x8629cabc -//.word 0x1857d22f -//.word 0x5def1773 -//.word 0x957d0b05 -//.word 0xd6138139 -//.word 0xb9330736 -//.word 0x53ee7642 -//.word 0x674ec740 -//.word 0xd9f22876 -//.word 0x66f84f94 -//.word 0x93200ff2 -//.word 0xe32d291a -//.word 0x4d8f6486 -//.word 0xed40e0ab -//.word 0xfaeca736 -//.word 0xf8548595 -//.word 0x2ff41ab9 -//.word 0x5be32d1a -//.word 0xa5fc43fc -//.word 0xd23b70f1 -//.word 0xbb696ea0 -//.word 0xfdfcecc4 -//.word 0xf1392878 -//.word 0xdf9bc0b1 -//.word 0x6e78c60c -//.word 0x5fe212ca -//.word 0x7bccdc18 -//.word 0xca6d8a94 -//.word 0x06eac60e -//.word 0x4f2fd48b -//.word 0x201d2290 -//.word 0x82eb219d -//.word 0x80c654f7 -//.word 0xdabba7aa -//.word 0xfed701cf -//.word 0x338d1c0b -//.word 0x18579558 -//.word 0x4da03f08 -//.word 0x70e2bd07 -//.word 0x4b0c5060 -//.word 0x4b26ed02 -//.word 0x343793c5 -//.word 0x1467dba8 -//.word 0x7661d15c -//.word 0xd7fb0207 -//.word 0x5e19d642 -//.word 0xc7ce2063 -//.word 0xa1c5f402 -//.word 0xb9e0b9b6 -//.word 0xd61e7e20 -//.word 0xa6c2922b -//.word 0xf9b24e91 -//.word 0x2d1d36a2 -//.word 0xe9604141 -//.word 0x0f2b742f -//.word 0xebdfb58c -//.word 0xb13bdf9a -//.word 0x263812c5 -//.word 0x9d314de0 -//.word 0x25473eb2 -//.word 0x010458b1 -//.word 0x583f270d -//.word 0x2e3fe0f0 -//.word 0x93233d05 -//.word 0x1a808737 -//.word 0x8d4df4bb -//.word 0xdffc3450 -//.word 0x62ea47c5 -//.word 0x3af991bc -//.word 0x127b30af -//.word 0x0e538d30 -//.word 0x00563175 -//.word 0xdef8db13 -//.word 0x7424cf0a -//.word 0x566b7002 -//.word 0x196111d4 -//.word 0xc244094c -//.word 0x7fdf052e -//.word 0x95aea376 -//.word 0x9a433ce4 -//.word 0xe4e800b8 -//.word 0x418649bb -//.word 0xe8c6297e -//.word 0xb07545e6 -//.word 0x802de7e8 -//.word 0x07324e92 -//.word 0xad9a494b -//.word 0xc9b1045b -//.word 0x149b21ae -//.word 0x5e3b0ad4 -//.word 0x7f54864d -//.word 0x91ee8b04 -//.word 0x5cfc5419 -//.word 0x123bb2e3 -//.word 0x3d5da736 -//.word 0xf56731e1 -//.word 0x5658647b -//.word 0x310bbb60 -//.word 0x025eb0f6 -//.word 0x22948a35 -//.word 0x3ef87766 -//.word 0x08c3da2a -//.word 0x2c40e6bf -//.word 0x862e6c7f -//.word 0x9266f1a9 -//.word 0x24be0464 -//.word 0x592ccf01 -//.word 0xcd2feb81 -//.word 0x0e6a7957 -//.word 0x51926e6f -//.word 0x648b2e6e -//.word 0xe4ce5d3c -//.word 0xb00ef1c0 -//.word 0x9d1b8cea -//.word 0x6c060af7 -//.word 0xf98655f0 -//.word 0xb49a8174 -//.word 0x557015b8 -//.word 0xcc86a6cc -//.word 0x770fab20 -//.word 0x98988c46 -//.word 0x06ebfcf9 -//.word 0x2334895f -//.word 0x0d62718b -//.word 0x19d0b846 -//.word 0x7d25770f -//.word 0x4c797760 -//.word 0xa8b9fe33 -//.word 0x334ce9c5 -//.word 0xc6f6fb9a -//.word 0x66fd75c1 -//.word 0x738be759 -//.word 0x23544554 -//.word 0x2f783d7b -//.word 0xccabc8b2 -//.word 0xdd93007e -//.word 0x677131c4 -//.word 0x450432d4 -//.word 0x1dabf6a5 -//.word 0x92c95e62 -//.word 0xbb6d5126 -//.word 0xd4330f05 -//.word 0x3465c24b -//.word 0x7f665708 -//.word 0x1d518bcc -//.word 0xebdd49af -//.word 0x30843394 -//.word 0xd2e47faf -//.word 0xca650445 -//.word 0xd51c94b3 -//.word 0x6cef8db2 -//.word 0xf7faabd9 -//.word 0x3e322064 -//.word 0x2048e733 -//.word 0x87d15516 -//.word 0x9ba3f147 -//.word 0x36828538 -//.word 0x98fc758f -//.word 0x5d91506f -//.word 0xac17a5fa -//.word 0xb05d1814 -//.word 0x4c0fb469 -//.word 0x0ad983b1 -//.word 0x55cf5c33 -//.word 0xe90dfd87 -//.word 0x879a5aa1 -//.word 0xed93340b -//.word 0x0585ec72 -//.word 0x5d1a9a64 -//.word 0xd7f85a58 -//.word 0xa2e6e6ef -//.word 0x68306a79 -//.word 0xc94d93bb -//.word 0x09c0e9f0 -//.word 0x053c600d -//.word 0x6c0b2949 -//.word 0x2bb1cedd -//.word 0x29cc7e08 -//.word 0x353ea657 -//.word 0x3d8ec123 -//.word 0xc08c705b -//.word 0x8534cd84 -//.word 0x8ed5fcfd -//.word 0x48730488 -//.word 0x0469dd06 -//.word 0xaa52cb82 -//.word 0xac2aea71 -//.word 0x3ab10938 -//.word 0xb510bbef -//.word 0x65bfac65 -//.word 0x6ea63264 -//.word 0x00832436 -//.word 0xcf8bef67 -//.word 0xc354e6cd -//.word 0xf0f2dac6 -//.word 0xc861ebc1 -//.word 0x8f239d00 -//.word 0x10292f9c -//.word 0x8ff728c9 -//.word 0xfe04325b -//.word 0x745f2b89 -//.word 0xda987af1 -//.word 0xe8de9fdd -//.word 0x50650ec5 -//.word 0x380b3e15 -//.word 0xee3afd2f -//.word 0xd71006b4 -//.word 0xa9bdd500 -//.word 0xda2dbaf3 -//.word 0x59e82df7 -//.word 0x7b36613e -//.word 0x38861c4c -//.word 0x9710c5b6 -//.word 0x67babf29 -//.word 0x3038f5ad -//.word 0x6978b62b -//.word 0xeb3dc42d -//.word 0xa60aa7e6 -//.word 0x93414772 -//.word 0xe98cba5f -//.word 0x947c5b6b -//.word 0xe3701c8f -//.word 0x81b91d3d -//.word 0xa6fb7de7 -//.word 0x8ed670c0 -//.word 0x2bc691c6 -//.word 0x17487a00 -//.word 0xcc3f9204 -//.word 0x179527bd -//.word 0xca25bd6b -//.word 0xb2d9a5eb -//.word 0xc80fd139 -//.word 0xab42e633 -//.word 0x4ee693a0 -//.word 0xee932270 -//.word 0x48664c45 -//.word 0x08a55233 -//.word 0x84a149c4 -//.word 0xaae1b540 -//.word 0x377c5a2b -//.word 0x2bc74f0e -//.word 0x7930547b -//.word 0x026a654b -//.word 0xc4cb902a -//.word 0x4ff20356 -//.word 0x79ac69a3 -//.word 0x531977c3 -//.word 0x5c0ac1c4 -//.word 0xf4aed3da -//.word 0x136e7d5f -//.word 0x3a156e18 -//.word 0xaa3404ba -//.word 0xd5c563ac -//.word 0x120ec50f -//.word 0x94c811fc -//.word 0x9d81ae0c -//.word 0xef3f991e -//.word 0x8466b554 -//.word 0x7edb635f -//.word 0x616a53fd -//.word 0x80659abf -//.word 0xb58e0410 -//.word 0x5537ab73 -//.word 0x63a8c80c -//.word 0x04c1ca62 -//.word 0x33e1a563 -//.word 0xb6066da9 -//.word 0x513523fb -//.word 0x391ccf17 -//.word 0xcbf6ceae -//.word 0x7eaf6eb1 -//.word 0x1748b8cb -//.word 0x1c7e8d2f -//.word 0x8aa6f593 -//.word 0xcadcb37c -//.word 0xe25c1dbd -//.word 0xe9302a3a -//.word 0xbd0ccdf2 -//.word 0xf876813d -//.word 0x1f292551 -//.word 0x1dbc0b0b -//.word 0xf07f4ced -//.word 0xa3a65e63 -//.word 0x7ca9e84a -//.word 0x76ead4b2 -//.word 0xf199a6e3 -//.word 0xa9d40d9f -//.word 0xe513b8a7 -//.word 0xf1c46b81 -//.word 0xcd325277 -//.word 0x27ab95e3 -//.word 0x87e22caa -//.word 0xca92f507 -//.word 0xd164048a -//.word 0x7a133a60 -//.word 0xcfce19d4 -//.word 0x7eded616 -//.word 0x8a88b03b -//.word 0x3f358186 -//.word 0x6bd093e6 -//.word 0xcb70b4bf -//.word 0xc4378ded -//.word 0x537a2f07 -//.word 0x4721efe0 -//.word 0xae517454 -//.word 0x8d490e41 -//.word 0xd48a49d3 -//.word 0x903bc305 -//.word 0x63cb3a64 -//.word 0x31d8e916 -//.word 0x1d50151c -//.word 0xb4d6e3d4 -//.word 0x67676cc2 -//.word 0x3f3d138f -//.word 0xccf31752 -//.word 0x5feb640f -//.word 0x79edaf7d -//.word 0x8210c10d -//.word 0xbede1327 -//.word 0x7eb39cb7 -//.word 0x9366e7e8 -//.word 0x082b682f -//.word 0x11b8108c -//.word 0x3ea71f0d -//.word 0xf41c3a93 -//.word 0x1ea7bdd8 -//.word 0x206c52b1 -//.word 0x0c81c391 -//.word 0x19970c4f -//.word 0x51ddb529 -//.word 0x89215e08 -//.word 0x96389c06 -//.word 0xbea1032d -//.word 0x6d658481 -//.word 0x2941fa41 -//.word 0xc807ff6b -//.word 0xe142047e -//.word 0x8019a183 -//.word 0x1e76294e -//.word 0xd0678202 -//.word 0xbec433d3 -//.word 0xd712bf10 -//.word 0xc3a73260 -//.word 0x190ff94c -//.word 0xd3aff6fd -//.word 0xffa88000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00015850 -//// expected output -//.word 0xfc85c2a2 -//.word 0x7bac2627 -//.word 0x72a53f8e -//.word 0xaa19b3df -//.word 0x653c1047 -//.word 0x4adc1049 -//.word 0x7637f246 -//.word 0xb32909b8 -//.word 0xb4c97bb1 -//.word 0x9fb209bb -//.word 0xbd217ec4 -//.word 0x40e2953d -//.word 0xdece86dd -//.word 0x54f3000b -//.word 0x00b37ff3 -//.word 0x4a61d2e5 -//// SHA512LongMsgvector_111 -//// vector length -//.word 0x00015B68 -//// input message -//.word 0x8595ad7e -//.word 0xf34cc6b6 -//.word 0x0238f58a -//.word 0x9a72827a -//.word 0x4b199a47 -//.word 0xe29a8c58 -//.word 0x3a2e385d -//.word 0x55a4c332 -//.word 0xab609006 -//.word 0xc2a46cbc -//.word 0xff0e0991 -//.word 0xbc62ae00 -//.word 0x9b8a2ce3 -//.word 0x19db14da -//.word 0x669a27f0 -//.word 0x74bf0e7c -//.word 0x4df84c46 -//.word 0xabf170eb -//.word 0xc2d38f83 -//.word 0x610bf180 -//.word 0x394c0bd9 -//.word 0x7cd7ad69 -//.word 0xabfa7d92 -//.word 0xa9d6a425 -//.word 0x1366c786 -//.word 0xd4bd390b -//.word 0xf38f6fa6 -//.word 0xb0f3b4c4 -//.word 0xd0671d74 -//.word 0x3515c0cc -//.word 0xb1552188 -//.word 0x1c72edf5 -//.word 0xa4b1eb0e -//.word 0x658f2fe4 -//.word 0x3a4b9143 -//.word 0xd2a45d92 -//.word 0x06e44cfb -//.word 0x691db3cc -//.word 0x21b3fb1d -//.word 0xf61a51b4 -//.word 0xa9e19e25 -//.word 0x87f0ba3d -//.word 0x3d0edda1 -//.word 0xeea656b3 -//.word 0x83ca7fb5 -//.word 0x4378f031 -//.word 0xa31cf398 -//.word 0x5f573829 -//.word 0xc9ffca14 -//.word 0x616742e0 -//.word 0xa7e03b0a -//.word 0x2d7f05ef -//.word 0xf0219eeb -//.word 0xe8adddc3 -//.word 0xde99f140 -//.word 0x7eb00a1d -//.word 0xad125624 -//.word 0x1d7c2f93 -//.word 0x1ec993c4 -//.word 0xb7b9d40d -//.word 0xf5f290e6 -//.word 0x8344e449 -//.word 0x7b31dd5f -//.word 0x7cad2f58 -//.word 0xfd222a9a -//.word 0xe0b7e91f -//.word 0x4ad2cd18 -//.word 0xb3db2ad7 -//.word 0x39443feb -//.word 0x3ac66c8d -//.word 0x21ed9f3b -//.word 0x80d610a2 -//.word 0x60382ec1 -//.word 0xd5a1d84c -//.word 0xd502d14e -//.word 0x496e6e13 -//.word 0x651f9245 -//.word 0x35badc55 -//.word 0x79d31f1c -//.word 0xb3b413c3 -//.word 0x7e5a4ae0 -//.word 0x21c165e1 -//.word 0x646287ae -//.word 0xa3f90a8a -//.word 0x208b713a -//.word 0x9da89e6a -//.word 0x2bee464c -//.word 0x3dcea182 -//.word 0x0093663e -//.word 0xef9ff6a8 -//.word 0xa2f8d780 -//.word 0xe6046504 -//.word 0x1391c414 -//.word 0x9a181994 -//.word 0xde43fa12 -//.word 0x45ac23a8 -//.word 0x8ee86a24 -//.word 0x65c4f567 -//.word 0x34ceaa0b -//.word 0x3d18e749 -//.word 0xe6387319 -//.word 0x5393b59a -//.word 0x3adc24b5 -//.word 0xf3d7fffd -//.word 0xcf633eda -//.word 0xabb7c8e7 -//.word 0xc5ece698 -//.word 0xcebcf820 -//.word 0x40896792 -//.word 0xf1a0da46 -//.word 0xe9c0ad7e -//.word 0x70d69f49 -//.word 0x6c0bcaa8 -//.word 0xea00d9f0 -//.word 0xfb58756f -//.word 0xc1780052 -//.word 0xc98a86c6 -//.word 0x9bc8f05e -//.word 0x90f77bb5 -//.word 0xe4316954 -//.word 0x0ce8f7d6 -//.word 0x4a288e4a -//.word 0x7e1c3dd8 -//.word 0x3fd467a8 -//.word 0x2a45b9ff -//.word 0x7a925fab -//.word 0xda8a78a2 -//.word 0x7771c7e6 -//.word 0x5803abab -//.word 0xf2b651bc -//.word 0xf740281b -//.word 0x705995e7 -//.word 0x0bc2e983 -//.word 0xb68690f5 -//.word 0x6c808a8c -//.word 0x4f1d20c6 -//.word 0xf863cf70 -//.word 0x0b32890f -//.word 0x0eca1d7f -//.word 0x7b8ef3da -//.word 0x1308fc9c -//.word 0x762ce904 -//.word 0xf1e19bbd -//.word 0x97bddbbd -//.word 0x93104c6e -//.word 0xbc259d0b -//.word 0x6ac4034d -//.word 0x88fbe748 -//.word 0xeb1fdc8f -//.word 0xe20dd39f -//.word 0x0fb5927b -//.word 0x75da6293 -//.word 0xd11308ea -//.word 0x2e16f778 -//.word 0xb435c4ce -//.word 0xc129daf8 -//.word 0x3b0f6fa7 -//.word 0x24b0b790 -//.word 0x6e05570f -//.word 0x11fb1c10 -//.word 0x5c73ed2f -//.word 0x888dfe1e -//.word 0x93264747 -//.word 0x4c9f35b3 -//.word 0xaae09f2b -//.word 0x619dfb9d -//.word 0xb7d8d2c1 -//.word 0x94a871fb -//.word 0xd938e284 -//.word 0xf3121ac5 -//.word 0xb09e7403 -//.word 0x51e55e41 -//.word 0xe09b5262 -//.word 0xc45d098f -//.word 0x9237ebd8 -//.word 0x2669c91e -//.word 0xf36bce30 -//.word 0x972eb334 -//.word 0xb2a53349 -//.word 0xf984bf6a -//.word 0x86487295 -//.word 0x7277472d -//.word 0xa6298a9e -//.word 0xeec78c3f -//.word 0x50139b7c -//.word 0x9b683134 -//.word 0x42436c60 -//.word 0x6b03bef6 -//.word 0x44ede60d -//.word 0x96731f41 -//.word 0x9cb69759 -//.word 0x15492227 -//.word 0x983830b0 -//.word 0x2849fd8d -//.word 0x08810791 -//.word 0xd0eac5ac -//.word 0xc194960f -//.word 0x56daf891 -//.word 0x1be6fa52 -//.word 0xc278f49e -//.word 0x74e27514 -//.word 0x65587d07 -//.word 0xab66ec24 -//.word 0x50c23b55 -//.word 0xa6446ae6 -//.word 0xda3339e7 -//.word 0xccc29bd1 -//.word 0x1eda686c -//.word 0x8c1a52ef -//.word 0x7b1d1a69 -//.word 0xd4fb0461 -//.word 0x121288b9 -//.word 0x9a064ad9 -//.word 0x4b064c09 -//.word 0x5751621d -//.word 0x51f9e758 -//.word 0x87e7af8b -//.word 0x91203c7d -//.word 0x2a47358f -//.word 0x3f6213a0 -//.word 0x46e11e2f -//.word 0xd1dc98bf -//.word 0x639c3880 -//.word 0x825dda2b -//.word 0x0d52742e -//.word 0xd0ea4c09 -//.word 0x565268f8 -//.word 0xfe3b46d2 -//.word 0x51ddce31 -//.word 0x933b85d3 -//.word 0x98a90340 -//.word 0xda8ca7ad -//.word 0xc8628921 -//.word 0x6002b0d6 -//.word 0xff2486e2 -//.word 0x78238816 -//.word 0x64024227 -//.word 0xbaae7b0b -//.word 0xa082ada6 -//.word 0x8010b8a6 -//.word 0x5d1fd6ac -//.word 0x68f0d2ac -//.word 0xcec67596 -//.word 0xd5a44236 -//.word 0x27596359 -//.word 0x6dbae231 -//.word 0x202f1cfa -//.word 0x9c7173de -//.word 0x77914416 -//.word 0x103d1953 -//.word 0x6b3f1f5c -//.word 0x3c46daf8 -//.word 0x41e9170e -//.word 0xd5e9220b -//.word 0xc3b63a84 -//.word 0x5835421d -//.word 0xbcc1b9a9 -//.word 0x8270ec92 -//.word 0x7d976a7b -//.word 0xd590b925 -//.word 0x5bba478f -//.word 0x1ac2a362 -//.word 0x2e21ed8b -//.word 0xdae68c2a -//.word 0xd4b61eab -//.word 0xe311b532 -//.word 0xacd6403d -//.word 0xc90a4785 -//.word 0x1cd5dc25 -//.word 0x63cdcefd -//.word 0x0c781f59 -//.word 0x4a0bb8ce -//.word 0x68785c65 -//.word 0x5ea8dbfc -//.word 0xa20588e8 -//.word 0x403cecdf -//.word 0x2d41bc16 -//.word 0xd89309a6 -//.word 0x03c1b734 -//.word 0xd12d30d1 -//.word 0x2010591f -//.word 0x18bec6b5 -//.word 0x042c2ac5 -//.word 0x61af11fc -//.word 0x3506d1aa -//.word 0xa39bbd23 -//.word 0xbb069d65 -//.word 0x97d35bfb -//.word 0xa385ff21 -//.word 0x3cdadd28 -//.word 0x7d510d1c -//.word 0x55ea1ca5 -//.word 0xdd2d012b -//.word 0xe96d533d -//.word 0xde4eb934 -//.word 0xc385a113 -//.word 0x9adf35b2 -//.word 0xf0858a1c -//.word 0xb37e1b35 -//.word 0x447577a0 -//.word 0xcdbd36df -//.word 0xd59231bc -//.word 0x11a2f3e8 -//.word 0x7dcc6ae3 -//.word 0xac27e21b -//.word 0x5c463558 -//.word 0x4eba3b57 -//.word 0x55d988b5 -//.word 0xacbe5710 -//.word 0x8c91c168 -//.word 0xfe0933cb -//.word 0xef2e1e31 -//.word 0x8264f0a5 -//.word 0xaaa544a5 -//.word 0xf70e55cc -//.word 0xb09db9ae -//.word 0x23394c04 -//.word 0x39f26a09 -//.word 0x4d8b6123 -//.word 0x3e3525c6 -//.word 0xc39e4695 -//.word 0xff2a20cb -//.word 0x568052da -//.word 0x7e497152 -//.word 0xd934fd03 -//.word 0x023e9366 -//.word 0xa6306539 -//.word 0x9569e86a -//.word 0x18ddcc36 -//.word 0x865e3192 -//.word 0x121b18ca -//.word 0xe7661768 -//.word 0x77ba5257 -//.word 0x0ffca648 -//.word 0xaf012755 -//.word 0x1a51cde4 -//.word 0x292a6acf -//.word 0x64c8dfc2 -//.word 0xd3e490e4 -//.word 0x127b15b9 -//.word 0xa4d03347 -//.word 0x89b40a77 -//.word 0x13058fbf -//.word 0xf5753dfe -//.word 0x9d8c08a7 -//.word 0xc4f19322 -//.word 0x43e5a26f -//.word 0x2810d20d -//.word 0x0980881a -//.word 0x98ef27bb -//.word 0x784486be -//.word 0x4f5da17e -//.word 0x1d0c8e07 -//.word 0xcc5fb37b -//.word 0x082537b5 -//.word 0x50adb62b -//.word 0x4dd13919 -//.word 0x633365dc -//.word 0x87c7f29b -//.word 0x50925f2d -//.word 0x50b1e437 -//.word 0xa49ca995 -//.word 0xcaac35fc -//.word 0xb3db29dd -//.word 0x19cc2e8c -//.word 0x130b2ca1 -//.word 0xe795bd9f -//.word 0x1f9be1d3 -//.word 0xdf83f37f -//.word 0x7530db38 -//.word 0x3283868d -//.word 0x782193e9 -//.word 0x15774fbb -//.word 0xcffce4d3 -//.word 0x40b6cd0f -//.word 0xe5008d38 -//.word 0x718aa127 -//.word 0x67a1b32c -//.word 0xe7b110b0 -//.word 0xc8085c18 -//.word 0xe8dc85ed -//.word 0xc090f53a -//.word 0x3c330c36 -//.word 0xc94acd23 -//.word 0xafcfd776 -//.word 0xa1799738 -//.word 0x923ebdac -//.word 0xcb17ec32 -//.word 0x3b03b66b -//.word 0x0e4ec79e -//.word 0x8113605b -//.word 0xf400085e -//.word 0x40597eb5 -//.word 0x4c3ff126 -//.word 0xdb3373cb -//.word 0xa8d6acff -//.word 0xb5f2cb7e -//.word 0xe0bec2c7 -//.word 0xb75eb3c5 -//.word 0x8daaa5af -//.word 0xce307c2d -//.word 0x8f7c28bc -//.word 0x69971c53 -//.word 0x88cd0247 -//.word 0xffb3ad6c -//.word 0x5e694f7d -//.word 0x871decbd -//.word 0xbdd00edf -//.word 0xfe5dbb23 -//.word 0x93b7a4c3 -//.word 0xe5729f8d -//.word 0x928557d1 -//.word 0xc04e427d -//.word 0xb2d6d487 -//.word 0x9957f38b -//.word 0xacfbaab6 -//.word 0x7ae721e2 -//.word 0x7f78cd02 -//.word 0xf6cce4c1 -//.word 0xef851466 -//.word 0xa1c974fb -//.word 0x018dbbae -//.word 0x9414b077 -//.word 0x81b2e1fb -//.word 0xead698b1 -//.word 0x7c480b43 -//.word 0x45aed337 -//.word 0xc6559fce -//.word 0x4a2e2a2c -//.word 0x76176aba -//.word 0x205c0bc9 -//.word 0x657e1b78 -//.word 0xf53307d7 -//.word 0xb2adc64c -//.word 0x7a1f5436 -//.word 0x407e62d1 -//.word 0x62854c5a -//.word 0x36fb4b73 -//.word 0xe638ecc8 -//.word 0x7fe6c0f3 -//.word 0x4405559d -//.word 0x483166e6 -//.word 0x3c284f07 -//.word 0x8587c336 -//.word 0x92d4c1cb -//.word 0x6cc1c4a0 -//.word 0x8eaf3bbd -//.word 0xf8723835 -//.word 0x7f546c4b -//.word 0x675c53d9 -//.word 0x33d0acf3 -//.word 0xbcf82cc7 -//.word 0x812573c7 -//.word 0x3ef23f0b -//.word 0xc0cae0f0 -//.word 0xf7aaec06 -//.word 0x4d283329 -//.word 0x36b5f5ed -//.word 0x081f5340 -//.word 0x0e5a044a -//.word 0xd77f4998 -//.word 0xd415237a -//.word 0x2390c3a9 -//.word 0xa517422d -//.word 0x568a927e -//.word 0xdec4b5ea -//.word 0x631d2c36 -//.word 0xa233b388 -//.word 0x3eeb2b85 -//.word 0x57b2d8b6 -//.word 0x5f09cc30 -//.word 0x2940a374 -//.word 0x43817194 -//.word 0x8611f997 -//.word 0xebd3201f -//.word 0xa10ea149 -//.word 0x5c6f01d5 -//.word 0xef52c687 -//.word 0x1d3de4cc -//.word 0xacad78a1 -//.word 0xbc16b8b1 -//.word 0x57252abd -//.word 0x49481541 -//.word 0x32703655 -//.word 0xd916b3d1 -//.word 0xc37c55b4 -//.word 0x0535f1c7 -//.word 0x56e7277d -//.word 0x68504f1e -//.word 0x7987b124 -//.word 0x2584f4e6 -//.word 0x7ee3da73 -//.word 0x5ee52ac1 -//.word 0xfcb8ed07 -//.word 0xbef8dc67 -//.word 0x4e751ad0 -//.word 0xf0371f23 -//.word 0x13bff494 -//.word 0x2590a654 -//.word 0xaceef56d -//.word 0x93e64ced -//.word 0xc18ef646 -//.word 0xf18e8ef5 -//.word 0xbddfb762 -//.word 0xfbd30e07 -//.word 0x4d565dd5 -//.word 0xf47312d3 -//.word 0xe51aef09 -//.word 0x1f20029c -//.word 0x3b87d83a -//.word 0x4500eeb8 -//.word 0xcaae68fa -//.word 0x322d0514 -//.word 0x50d353ae -//.word 0x38351fad -//.word 0x51ed3010 -//.word 0xab9b3517 -//.word 0x922afbab -//.word 0x6355e3fa -//.word 0x9e699462 -//.word 0x3d4ced90 -//.word 0x44be3de9 -//.word 0x9adfb728 -//.word 0x17f12049 -//.word 0xde60cba7 -//.word 0xedffc761 -//.word 0xf2955701 -//.word 0x6098a260 -//.word 0xc338acc4 -//.word 0x51a0854c -//.word 0xc178c18e -//.word 0x60ae277e -//.word 0x6176ae92 -//.word 0x748fa523 -//.word 0x9bc83117 -//.word 0x39c4fcbd -//.word 0x6cfa2cf8 -//.word 0x9dff92a0 -//.word 0x56082425 -//.word 0x53abae75 -//.word 0xdbe5c420 -//.word 0x5161fbba -//.word 0x06f75982 -//.word 0x51740940 -//.word 0xe2995374 -//.word 0x5366ccac -//.word 0x0098ca36 -//.word 0x19701bf7 -//.word 0xf5b6f79b -//.word 0xa9fe32ef -//.word 0xda2ab68a -//.word 0xcf3031b3 -//.word 0xca1d0b7f -//.word 0x995a9b3a -//.word 0x682e9a08 -//.word 0xd985d8cc -//.word 0x57f02d49 -//.word 0xa7ecb388 -//.word 0xbf673279 -//.word 0xdc80dcdc -//.word 0xcf8f3b62 -//.word 0x97656710 -//.word 0x35d57ce5 -//.word 0xbc734bbc -//.word 0xa89b5074 -//.word 0x70b5e54d -//.word 0x5fb8b495 -//.word 0x9fed7285 -//.word 0x97f6cb66 -//.word 0x770e98f7 -//.word 0x10925813 -//.word 0xeac1de8f -//.word 0x90c04762 -//.word 0x2fe02f08 -//.word 0x5f242528 -//.word 0x41fe5b74 -//.word 0xca5aa2d0 -//.word 0x5edd96b7 -//.word 0xa16f16db -//.word 0x8af7f80c -//.word 0xb965fa5b -//.word 0x0af6fb7f -//.word 0x6ab36b78 -//.word 0xe93c0072 -//.word 0x11c3aaeb -//.word 0x765bca18 -//.word 0x8f739f85 -//.word 0xc49d00fd -//.word 0xc89551a9 -//.word 0x297eb07b -//.word 0x266e6fce -//.word 0xc02dc746 -//.word 0x143acafe -//.word 0xe70f9ae2 -//.word 0x83a6d959 -//.word 0xc23c6028 -//.word 0x68553493 -//.word 0xb500b5c4 -//.word 0x3b5c1971 -//.word 0xee5b19ba -//.word 0x7ac6ea50 -//.word 0xd9826fdc -//.word 0x2411ad9f -//.word 0xa95b7f55 -//.word 0x3faf8b60 -//.word 0xd6057422 -//.word 0x528652ab -//.word 0x9a4e5f94 -//.word 0xeb70f22a -//.word 0x733ab2d0 -//.word 0x1bbb039e -//.word 0xa483c54e -//.word 0xf5aa3e59 -//.word 0xb314545d -//.word 0x13f200c2 -//.word 0xec8cff9d -//.word 0x113fcbd4 -//.word 0xddc1c984 -//.word 0x0fadc49f -//.word 0xd83b9ada -//.word 0x334e35c6 -//.word 0x75b5bd3c -//.word 0x25aa0cff -//.word 0x0d9f639d -//.word 0x913b5b96 -//.word 0x409f1ec0 -//.word 0xa9edd6ea -//.word 0x700b66c0 -//.word 0xa1a459ef -//.word 0x43701789 -//.word 0x31b65faa -//.word 0x250ff15c -//.word 0x166c8bb8 -//.word 0xc45a174e -//.word 0x918523c7 -//.word 0x927b91c9 -//.word 0xe6b3901b -//.word 0x46cecb0a -//.word 0xde1ce00b -//.word 0x5b6213a1 -//.word 0x46db4481 -//.word 0x907c1ef5 -//.word 0x6e7c927e -//.word 0x671483bd -//.word 0xaa84c393 -//.word 0xa6563f88 -//.word 0xd5e67669 -//.word 0xd8223035 -//.word 0xc98f6c3b -//.word 0xcd8d9a7c -//.word 0xe8db0a56 -//.word 0x165da564 -//.word 0x971ddba0 -//.word 0x8a91dcca -//.word 0xbd1c0b0e -//.word 0xc4d6afe1 -//.word 0x4890ec2c -//.word 0xa213f3ac -//.word 0xa8a97598 -//.word 0xc7df5d85 -//.word 0x5388be88 -//.word 0x1a050a9a -//.word 0x3fc48640 -//.word 0x4607fa6b -//.word 0x6be7ad9c -//.word 0x3898904d -//.word 0x56eeba8d -//.word 0xa42014ea -//.word 0x86cd5693 -//.word 0x803c32be -//.word 0x03e8ce48 -//.word 0x863c789b -//.word 0xd99b96d5 -//.word 0xb6a3db27 -//.word 0x9ab3c17a -//.word 0xd2aa3359 -//.word 0xd9f2890b -//.word 0xe1bebaff -//.word 0xb08fcd6e -//.word 0xadfd913b -//.word 0x3bb48e1e -//.word 0x45bd3b01 -//.word 0x1aff72aa -//.word 0x7c05209b -//.word 0xf3014136 -//.word 0x68110c25 -//.word 0xeec26af9 -//.word 0xe3d3ad11 -//.word 0x383b7fbe -//.word 0x0d6c18a4 -//.word 0x81dab564 -//.word 0xc8b74578 -//.word 0x7e01655e -//.word 0x3abf8ef8 -//.word 0x67888d33 -//.word 0x4f4434e7 -//.word 0x793750fe -//.word 0x353bdbd9 -//.word 0x754c72ef -//.word 0xde4a09b7 -//.word 0x1ffbddc9 -//.word 0x8250aa40 -//.word 0xc0e91e62 -//.word 0x1ada8e83 -//.word 0xa5b0e926 -//.word 0xe6afea66 -//.word 0x9e5e9194 -//.word 0xe746d322 -//.word 0x80f691bf -//.word 0x664ac7c4 -//.word 0xa4ed06cf -//.word 0x6b1d24ad -//.word 0x65ae327e -//.word 0x4752ae13 -//.word 0xa617fa9b -//.word 0x0b310d7f -//.word 0x49fa698a -//.word 0x0e374c4d -//.word 0xb99d2bc2 -//.word 0x6b945c2f -//.word 0x613a134d -//.word 0x81ab8faa -//.word 0x3280954c -//.word 0x71951e97 -//.word 0x22104d71 -//.word 0xa39ea3a3 -//.word 0xa7007682 -//.word 0x42c79fd0 -//.word 0x405b74dd -//.word 0xbb42f6f1 -//.word 0xed9f4bee -//.word 0x42f96e32 -//.word 0xb13e25bb -//.word 0x4d08338e -//.word 0x171ecf59 -//.word 0x173e5657 -//.word 0xab1a3d74 -//.word 0x1ea049b2 -//.word 0x7c7e02cb -//.word 0xa5e66518 -//.word 0xa18ed9b1 -//.word 0x33fc64d6 -//.word 0xb1001f8d -//.word 0x1282e78d -//.word 0x497d565b -//.word 0xd24cf1b3 -//.word 0x8a25a329 -//.word 0xc3e36b10 -//.word 0x9808519b -//.word 0x7e029e42 -//.word 0x1cad4c67 -//.word 0x5d1abc3a -//.word 0xc38fa7da -//.word 0xfece57bd -//.word 0xbd9a1751 -//.word 0xc478e8e3 -//.word 0x3eb375c1 -//.word 0x55a2499b -//.word 0x012d402f -//.word 0x1d8e3b26 -//.word 0xc0551838 -//.word 0xcaafe297 -//.word 0xbde7448b -//.word 0xcf2d4459 -//.word 0x3d972e6a -//.word 0xe165cda9 -//.word 0x0789e12d -//.word 0x7d67ce18 -//.word 0xe9d992bf -//.word 0x5f76f90b -//.word 0x3314141f -//.word 0x0c8be73a -//.word 0x3abc62df -//.word 0x4ad29334 -//.word 0xd7c819a9 -//.word 0xa32cdcd9 -//.word 0xe622fbb5 -//.word 0xe5ab06df -//.word 0xc7276e54 -//.word 0xa419394e -//.word 0xe02bfa69 -//.word 0xb7720104 -//.word 0x18f2cfea -//.word 0xb765cd32 -//.word 0x5e383d63 -//.word 0x83d770dc -//.word 0x202a3973 -//.word 0xbf5fa35d -//.word 0xd4ebdf4e -//.word 0x50cb80e0 -//.word 0x7310eb39 -//.word 0xe29a08e8 -//.word 0xf9243e11 -//.word 0x62819fca -//.word 0xe7245fc4 -//.word 0x84e68b2e -//.word 0xc104f7d6 -//.word 0x3f677992 -//.word 0x902954de -//.word 0x4b54f7c6 -//.word 0x60ede807 -//.word 0xaa31fb71 -//.word 0xc31ec78f -//.word 0x1c355a8a -//.word 0x4d7f2c4b -//.word 0xa9ce52e0 -//.word 0x1645f421 -//.word 0x1c1a0193 -//.word 0x3b9b218c -//.word 0x826fec98 -//.word 0x5d1f591c -//.word 0xafd57939 -//.word 0x206365f3 -//.word 0xb9867593 -//.word 0xae6cb249 -//.word 0x7a758e16 -//.word 0x3137d3e9 -//.word 0x12c4da09 -//.word 0x5c2ffdb2 -//.word 0x644c4e03 -//.word 0xe3b88a18 -//.word 0x94194873 -//.word 0xffa776a0 -//.word 0x8fec0618 -//.word 0xebc7e567 -//.word 0x83b72d8a -//.word 0x69569b9b -//.word 0x632443b0 -//.word 0x3e868200 -//.word 0x650f3547 -//.word 0xb2fd286c -//.word 0x8307d261 -//.word 0x11563f4c -//.word 0xfdd14de4 -//.word 0x2c9d1b1d -//.word 0xd5e4bf07 -//.word 0xd8d637f3 -//.word 0x52eea2d9 -//.word 0x6e77b1f6 -//.word 0x7e4e58b9 -//.word 0x4ae9c9e0 -//.word 0xa798a2df -//.word 0x4c0b6581 -//.word 0xe2152ad1 -//.word 0x5aaf903b -//.word 0x8340f9ef -//.word 0xdc1cf786 -//.word 0xa74a01e8 -//.word 0x3e8a6b6d -//.word 0xaa969542 -//.word 0x72a9620f -//.word 0xb13eebd6 -//.word 0x6b1a751f -//.word 0x218ca152 -//.word 0xa3f4e364 -//.word 0x268235b5 -//.word 0x96400d39 -//.word 0x2e538cd7 -//.word 0x457ef80e -//.word 0x6be76cde -//.word 0xb41ecee6 -//.word 0x545b02ca -//.word 0x6c075dd7 -//.word 0x247e5dea -//.word 0xfa14978d -//.word 0x5a56f064 -//.word 0x6e9210c8 -//.word 0x379914b1 -//.word 0xddc383d9 -//.word 0x4334841e -//.word 0xdf5e4e28 -//.word 0xc9c7df4d -//.word 0x110cf1b1 -//.word 0x56272ab2 -//.word 0x94ed9383 -//.word 0x3eda4b16 -//.word 0x8d117d40 -//.word 0x179f8f18 -//.word 0xa3009ca0 -//.word 0x3ce425a7 -//.word 0x843303ed -//.word 0x4b4ea089 -//.word 0x60986788 -//.word 0xa73579d7 -//.word 0x6c11a263 -//.word 0xf7248b7e -//.word 0x61f53185 -//.word 0xa65d95bf -//.word 0xfa8eb689 -//.word 0x6153bcb0 -//.word 0x7a9a761f -//.word 0x9b2f06ba -//.word 0x23cadb89 -//.word 0x0c4ce019 -//.word 0xc046f31f -//.word 0x2ebb995f -//.word 0x1c27f0cc -//.word 0xbfbfe5f1 -//.word 0x89fba68f -//.word 0x42525b88 -//.word 0x5a4411fb -//.word 0x7e9ef6b1 -//.word 0x69faccb8 -//.word 0xfd85984d -//.word 0x92059a00 -//.word 0x8e1a8212 -//.word 0x35c3e122 -//.word 0xc325de08 -//.word 0xb8882a02 -//.word 0x74a3360e -//.word 0x0319a396 -//.word 0x3a43fa52 -//.word 0x03309d6b -//.word 0xf5eafddc -//.word 0x28fb0e1e -//.word 0x4730f804 -//.word 0xe69d10e4 -//.word 0x16e106f7 -//.word 0x37ac5f02 -//.word 0x0e7e2636 -//.word 0x18b1df55 -//.word 0x1db9bd17 -//.word 0x07ab15cc -//.word 0xf5fc1142 -//.word 0x8c8ba9e9 -//.word 0x8de2cf35 -//.word 0xadb9ea44 -//.word 0xa1bc86c1 -//.word 0x788f4a08 -//.word 0x2d0e2a8b -//.word 0x7dd9de74 -//.word 0xf610928c -//.word 0x515bdf5b -//.word 0x012efa91 -//.word 0x0c4b2ba4 -//.word 0x1a8881bb -//.word 0xcbd2c5cb -//.word 0x4e72acff -//.word 0x308f505e -//.word 0x71f4e1a8 -//.word 0xdd149880 -//.word 0x994bedd0 -//.word 0xfd670a6a -//.word 0xa1677feb -//.word 0xbb8337e5 -//.word 0xa86cab3d -//.word 0xc8d455d1 -//.word 0x8f31685e -//.word 0xd9bebea2 -//.word 0x7ec312bd -//.word 0x27176fdd -//.word 0x60e3e81a -//.word 0xeea88a9f -//.word 0x62848f0b -//.word 0xeeb1d417 -//.word 0x784e8e78 -//.word 0xed623807 -//.word 0xd81ed01f -//.word 0x33624246 -//.word 0x7c832510 -//.word 0x0c4ca541 -//.word 0xa542c032 -//.word 0x4a2cb676 -//.word 0x53d3babc -//.word 0xc007eef7 -//.word 0xcee28ebd -//.word 0xc8516bed -//.word 0x20cf9c95 -//.word 0xbe747013 -//.word 0x982fa77a -//.word 0x8350e137 -//.word 0x484956f4 -//.word 0xfbb5c8bc -//.word 0x8899b660 -//.word 0x8fead31a -//.word 0x7250b671 -//.word 0xac2ad35c -//.word 0x64d2aaaa -//.word 0x41223ea1 -//.word 0x8137c9e6 -//.word 0x4574ae9d -//.word 0x2fcaafd0 -//.word 0x2f376015 -//.word 0x9a8ddb6b -//.word 0x7d75b666 -//.word 0x30b3328c -//.word 0x2eacb5fe -//.word 0x23257b5b -//.word 0x474d88e1 -//.word 0xebfee1d5 -//.word 0x5140fb25 -//.word 0xc10f744d -//.word 0xd95e0177 -//.word 0x255ba8e6 -//.word 0xf0f52f94 -//.word 0x599bd41a -//.word 0xa9473ed1 -//.word 0xe3bcb437 -//.word 0x9d0c8d94 -//.word 0x0f5ce7dd -//.word 0x6aeb9cd8 -//.word 0x6b517281 -//.word 0x2f0592ad -//.word 0x49223ced -//.word 0x126bb8b5 -//.word 0x408c90bd -//.word 0xbaa3fca8 -//.word 0xabfe9ee4 -//.word 0xd5266fd1 -//.word 0x291dfa25 -//.word 0x94e5c88f -//.word 0x1b411b9a -//.word 0x2ac0dfd5 -//.word 0x29f6dd31 -//.word 0x510d32aa -//.word 0xbe7dff29 -//.word 0xc51763a9 -//.word 0x8748a699 -//.word 0xc69cb782 -//.word 0xf881d9ea -//.word 0x9a4e9978 -//.word 0xc7830359 -//.word 0x095215e1 -//.word 0x6f5f7476 -//.word 0xe0c55eaa -//.word 0xae59e0a7 -//.word 0x6e3249d0 -//.word 0x0869dea5 -//.word 0x0a1dcfe7 -//.word 0x42ba6afd -//.word 0x8b7b8f97 -//.word 0xe72e6491 -//.word 0xce38491a -//.word 0xc6d80f15 -//.word 0x34b064bf -//.word 0x72819293 -//.word 0x21366a6b -//.word 0xc1247ae7 -//.word 0x7f908712 -//.word 0x4d713743 -//.word 0x38780d42 -//.word 0xf64e9aac -//.word 0xbf1df299 -//.word 0x5f515e7b -//.word 0x88a0504a -//.word 0x6c479cde -//.word 0x8b97e49c -//.word 0xcab15454 -//.word 0xc68e906a -//.word 0x6742eb34 -//.word 0xb881daa4 -//.word 0xf662a827 -//.word 0xe7636bcc -//.word 0x6cad36a9 -//.word 0x5a9a907b -//.word 0x8675258c -//.word 0x1f81bcda -//.word 0x413c6975 -//.word 0xc6e40429 -//.word 0x603bd95d -//.word 0xe588a13b -//.word 0xe9deb211 -//.word 0x92a072f7 -//.word 0xa84511b3 -//.word 0xec5978d9 -//.word 0xabc47c37 -//.word 0x924f586f -//.word 0xc4645ae6 -//.word 0x2a15dcdd -//.word 0x0a6176de -//.word 0xdcb2725a -//.word 0x59a98090 -//.word 0xd41eabb0 -//.word 0xcd638c41 -//.word 0xc4c9bec0 -//.word 0x4b66928a -//.word 0x5f1503fc -//.word 0xf8bdecd8 -//.word 0xdfd778ea -//.word 0xc02adaec -//.word 0x80d93fa8 -//.word 0xd0a0015c -//.word 0x035b1e62 -//.word 0x1cc8e810 -//.word 0x2c8dfede -//.word 0xdb7d7ac6 -//.word 0x44176cf1 -//.word 0x064f888f -//.word 0x97921b07 -//.word 0xdc044450 -//.word 0xf70c609e -//.word 0x6112c642 -//.word 0x3887b5cb -//.word 0xda268a72 -//.word 0xb27a36b5 -//.word 0x52a1f041 -//.word 0xc24f2715 -//.word 0x1816bbe5 -//.word 0x49e46cbc -//.word 0x3fcd93e6 -//.word 0x2c0a100d -//.word 0x1d4283a2 -//.word 0xd209bf7f -//.word 0xcda77bca -//.word 0xa91a4b1c -//.word 0xad5ecfe2 -//.word 0xa1eb2a04 -//.word 0xe080b6c5 -//.word 0xaf1ff7eb -//.word 0xcd58cd1f -//.word 0x4ccbed96 -//.word 0x9ee991f1 -//.word 0xf3fa6f62 -//.word 0xc364e811 -//.word 0xa62a83be -//.word 0x6cb399a7 -//.word 0x6acd52ac -//.word 0x12f1d0b1 -//.word 0xc7c9a944 -//.word 0xefef9b7f -//.word 0x49f87b30 -//.word 0x80b16f38 -//.word 0x01a85d31 -//.word 0x0aeea354 -//.word 0x041c0999 -//.word 0x1394f31f -//.word 0xeb09dccf -//.word 0xe542ff3d -//.word 0x521a57ce -//.word 0x0fccca20 -//.word 0x5a6da2a6 -//.word 0xe3ba3c93 -//.word 0x261404fa -//.word 0xf9c9a133 -//.word 0x61956c80 -//.word 0xaa6927f0 -//.word 0xb76aec84 -//.word 0x963d6391 -//.word 0x57823865 -//.word 0x1f9ecc2d -//.word 0x78be2b17 -//.word 0xeb193fb3 -//.word 0xd175439f -//.word 0x66ec7963 -//.word 0x1ff0209a -//.word 0x3e8da153 -//.word 0xa3ee09b6 -//.word 0xe523bbeb -//.word 0xa1216737 -//.word 0x120a3668 -//.word 0xe2af4774 -//.word 0x40545f5d -//.word 0x33b3dc57 -//.word 0x2e43eb2d -//.word 0xe4b9fbe1 -//.word 0x5dcf7293 -//.word 0x4a459ea3 -//.word 0x9626ee1a -//.word 0x3d4d6246 -//.word 0x612740a5 -//.word 0x9bbb0905 -//.word 0x8fe7abe8 -//.word 0xc3ecf82d -//.word 0xb12d57ed -//.word 0x1a33b9a4 -//.word 0x9ef5cf91 -//.word 0x8a567b5f -//.word 0xf1f08404 -//.word 0xfe108dea -//.word 0x8801484c -//.word 0xe78ee7e4 -//.word 0x06c2d3c3 -//.word 0xbaf2a180 -//.word 0x52fe4294 -//.word 0x70d37905 -//.word 0x17349242 -//.word 0x04bb524e -//.word 0x421a2a21 -//.word 0xf9a7af4c -//.word 0x87184fdb -//.word 0xd18a3c7f -//.word 0xdbc9aded -//.word 0x97cb4681 -//.word 0xfb7dd427 -//.word 0x56c33e7b -//.word 0xe4b9b92f -//.word 0xa0403aad -//.word 0x59b631fe -//.word 0x080474eb -//.word 0x61de7962 -//.word 0xa846c91b -//.word 0xc652b17a -//.word 0x9c303bb8 -//.word 0x97675d3e -//.word 0x855f6f51 -//.word 0xa724e2f4 -//.word 0x0767300a -//.word 0x0bc60fbc -//.word 0x4b4dea1a -//.word 0xa03c9105 -//.word 0x7d0a304c -//.word 0x83ab7e15 -//.word 0x4f0f367f -//.word 0x97ebcb85 -//.word 0x75bb5826 -//.word 0x0208d5c2 -//.word 0x27e691c8 -//.word 0xb0c2dc8e -//.word 0xa25a0480 -//.word 0xcf0d847d -//.word 0xa755777e -//.word 0x51925379 -//.word 0xfb09d385 -//.word 0x6e2c353e -//.word 0xe51ca66b -//.word 0x1f6cfbde -//.word 0xb328a19c -//.word 0xa415d73e -//.word 0x353b1a97 -//.word 0xfea1e197 -//.word 0x40588b6f -//.word 0x76ba96f6 -//.word 0x2cf4114c -//.word 0x14c254bd -//.word 0x577aeee8 -//.word 0x294cdf20 -//.word 0xa0c80812 -//.word 0xc6a0dfa8 -//.word 0xedb0672e -//.word 0x423b60b4 -//.word 0xa578bab3 -//.word 0xb84d50f3 -//.word 0x365ad3ab -//.word 0x873904eb -//.word 0x91042737 -//.word 0xd018b474 -//.word 0xa9194f09 -//.word 0xfb37fa3e -//.word 0xf8af8ae7 -//.word 0x33945747 -//.word 0xf9cf382f -//.word 0xe565af66 -//.word 0xaff8604d -//.word 0x4591c8c3 -//.word 0x1d9c2b47 -//.word 0xc934ce5c -//.word 0xcca16732 -//.word 0xac1fd282 -//.word 0x48e105ba -//.word 0x6c56465a -//.word 0xa3ab9c9e -//.word 0x4c91835d -//.word 0xf040e331 -//.word 0xd3bc43d8 -//.word 0xc9573ada -//.word 0x4b77276c -//.word 0xca992295 -//.word 0x4396338f -//.word 0x1425c170 -//.word 0x0ea24d0a -//.word 0xcb0e600f -//.word 0x4256c179 -//.word 0x98d8ec28 -//.word 0x3a23c0cd -//.word 0x28fe7808 -//.word 0x94addccd -//.word 0xab6fb80c -//.word 0xb34b8e91 -//.word 0x560c8829 -//.word 0x3d8bb006 -//.word 0xe12c6364 -//.word 0x9eab036d -//.word 0x0a19ed5a -//.word 0x8421abdc -//.word 0x10906aba -//.word 0x6215aebb -//.word 0x384444c6 -//.word 0xede17948 -//.word 0x4b5c89d6 -//.word 0xa2985a14 -//.word 0x16f06ad5 -//.word 0x3d7c0683 -//.word 0xea90bec2 -//.word 0x43861550 -//.word 0x1abe7d2f -//.word 0x7ae28207 -//.word 0x7f6f45c6 -//.word 0x6b712c89 -//.word 0xf78ed8bf -//.word 0xe745578b -//.word 0xe1789b6b -//.word 0x7f282b18 -//.word 0xa38119ad -//.word 0x0b16340a -//.word 0x256d7e7b -//.word 0x24bee195 -//.word 0x53f81d61 -//.word 0xa90505bd -//.word 0x9e4febfe -//.word 0x3e8359da -//.word 0x7c950286 -//.word 0xc804f71b -//.word 0xe45f1e3e -//.word 0xf308e100 -//.word 0xd3382303 -//.word 0xac4378df -//.word 0xc91d95c3 -//.word 0xa71d0560 -//.word 0x4c021e02 -//.word 0xda343400 -//.word 0x644c0c57 -//.word 0x00d59392 -//.word 0x1e54d0ed -//.word 0x188718b9 -//.word 0x0aeb8102 -//.word 0xe3809970 -//.word 0xbcd0576b -//.word 0x692e5182 -//.word 0x4e3c300e -//.word 0x74b06112 -//.word 0xdd570e66 -//.word 0x145a4d15 -//.word 0x07c09703 -//.word 0x19347bd3 -//.word 0x74089307 -//.word 0x9c7bb869 -//.word 0x4a3772aa -//.word 0x771eb24a -//.word 0xb746c4b7 -//.word 0xc8427fb9 -//.word 0x6ba4bf0d -//.word 0x72bf1551 -//.word 0x1bb2bc20 -//.word 0x9ca2cf7d -//.word 0xff46ba75 -//.word 0x30a9ef00 -//.word 0x552bda29 -//.word 0x5dc9166e -//.word 0xdc9fe16a -//.word 0x16abcdb1 -//.word 0x59d4b9fc -//.word 0x912b0086 -//.word 0x1670f0b5 -//.word 0xc8d87efd -//.word 0x5e0d3702 -//.word 0xfb777afc -//.word 0x02bae560 -//.word 0x2c800dbd -//.word 0xd87872e3 -//.word 0xa29fb24b -//.word 0x36befcb3 -//.word 0x6733c809 -//.word 0x7bf5c58a -//.word 0xc9d3132b -//.word 0x87fcb338 -//.word 0xddc43c3b -//.word 0x3da5cf1f -//.word 0xf7844c95 -//.word 0x0836c6b7 -//.word 0x334335eb -//.word 0x54ea6b0b -//.word 0xf0654ac3 -//.word 0x106e333a -//.word 0x5001c1f4 -//.word 0x3364b8f7 -//.word 0xb965382c -//.word 0x34e33709 -//.word 0x578f2e6d -//.word 0x90f411cb -//.word 0x98b5858b -//.word 0x48164ead -//.word 0xaebe06b0 -//.word 0x60bc15b2 -//.word 0x10c7ddd8 -//.word 0x61ca35f0 -//.word 0xf9a01955 -//.word 0xd71b9f13 -//.word 0xe74c2d4c -//.word 0xd4feeadb -//.word 0x1e847236 -//.word 0x6cb5ce99 -//.word 0x2334a361 -//.word 0x37f5a9b6 -//.word 0x42fc5f6c -//.word 0xd368fe2b -//.word 0x08b1abce -//.word 0x5f2ef00a -//.word 0xc9da6d50 -//.word 0x0057cbf4 -//.word 0x1b33f28e -//.word 0x606b7ca1 -//.word 0x592d697a -//.word 0x2ae2145b -//.word 0x216c65d9 -//.word 0x8fac4983 -//.word 0xd6485fc4 -//.word 0xc4abf50b -//.word 0x1f4d3228 -//.word 0x813494fa -//.word 0x66bb9e47 -//.word 0x8492caeb -//.word 0x5b06c535 -//.word 0x0c82db8e -//.word 0x6e56b05b -//.word 0x5fb83225 -//.word 0x5808cbf7 -//.word 0x4559db08 -//.word 0x932c659a -//.word 0x8a7e0922 -//.word 0xdd0632a9 -//.word 0x7fb89072 -//.word 0xb98dc9dd -//.word 0x7a866b8b -//.word 0xeeef26c3 -//.word 0x51e13815 -//.word 0x060a283d -//.word 0xe3b0b74a -//.word 0xd0f414ff -//.word 0x90544f79 -//.word 0xde741012 -//.word 0xbc1e8986 -//.word 0x0887a954 -//.word 0x50d49267 -//.word 0xe7dc4ef6 -//.word 0x3830bda9 -//.word 0x5b59d2fd -//.word 0xe660ffe9 -//.word 0x0694eec2 -//.word 0xce87725c -//.word 0xce5abd72 -//.word 0xe83ad347 -//.word 0x5f2b3f8e -//.word 0x31040487 -//.word 0xa7bbd66c -//.word 0x2ae38a0b -//.word 0x5873ccb4 -//.word 0x57c91055 -//.word 0x69efcbe4 -//.word 0xc11ce2fd -//.word 0x967e62cd -//.word 0x7536732e -//.word 0xdba58713 -//.word 0x03e6d727 -//.word 0xfd9b10b1 -//.word 0x00ed49bb -//.word 0x01ce3973 -//.word 0x8481a7d1 -//.word 0xb35d217a -//.word 0xadcef1e5 -//.word 0x209c4dbc -//.word 0x1a70ce85 -//.word 0x1c942481 -//.word 0x71fa07d4 -//.word 0xbd8070e7 -//.word 0xd9720a0b -//.word 0xde50e35f -//.word 0x80d268f3 -//.word 0x9e2a902d -//.word 0x1689576c -//.word 0xdee46eec -//.word 0x51f831ea -//.word 0xc68cd908 -//.word 0x67f6f3f2 -//.word 0x41e01142 -//.word 0x974cbfa1 -//.word 0x7cd6b82f -//.word 0xa1395a26 -//.word 0x6b1558ba -//.word 0x48f0af43 -//.word 0x447adb9d -//.word 0xd7154acf -//.word 0x019411ec -//.word 0x9943de37 -//.word 0xe3282d8a -//.word 0x6089bff9 -//.word 0xeaaf48b2 -//.word 0x00e96927 -//.word 0x5ed3dd70 -//.word 0xd0d7f7ea -//.word 0x49f54c25 -//.word 0x2fc0adfd -//.word 0xfaa95806 -//.word 0xfd806e2e -//.word 0x8338a89d -//.word 0x1eeb46e0 -//.word 0x3c1d4947 -//.word 0xfb45e28b -//.word 0x3f8a2ab4 -//.word 0x01ca133a -//.word 0xeae09f6b -//.word 0x2027500c -//.word 0x603adf43 -//.word 0x4dfe31b5 -//.word 0x07e386eb -//.word 0x0066f4fa -//.word 0x0bdb1463 -//.word 0xb669fb38 -//.word 0xda566b80 -//.word 0x70844bdd -//.word 0xa63c556c -//.word 0x332b0fed -//.word 0xe7aafc24 -//.word 0x8643137e -//.word 0xd67070f8 -//.word 0xf7a54a3d -//.word 0xf391250e -//.word 0x96a248e7 -//.word 0x80c772e0 -//.word 0x7879c9d1 -//.word 0x03fc13b9 -//.word 0x35e22861 -//.word 0xc8d2a73c -//.word 0x6b87e992 -//.word 0x5c1b33dd -//.word 0x39863074 -//.word 0x14629e66 -//.word 0xc5f147a9 -//.word 0x84603374 -//.word 0xb74d1ce9 -//.word 0x088822f7 -//.word 0xbb16c07f -//.word 0x3e7cffb5 -//.word 0x023ae9ca -//.word 0x8a9541c8 -//.word 0xc29971bd -//.word 0x915fc41b -//.word 0xb18cd55f -//.word 0xbf1a48f1 -//.word 0x8e5bb74b -//.word 0xc13aef5e -//.word 0x99c55d31 -//.word 0x0be8c3cc -//.word 0x167b2f54 -//.word 0x53802e77 -//.word 0xcea53d0b -//.word 0x141180f1 -//.word 0x8d5cb740 -//.word 0x0cdf6d9f -//.word 0xa52f72f3 -//.word 0xbfe48c3b -//.word 0x699f6ab7 -//.word 0xf24bd950 -//.word 0xb3a23b34 -//.word 0x30f334c1 -//.word 0x6023a6a4 -//.word 0x48f3e042 -//.word 0xcf801257 -//.word 0xcd1004dc -//.word 0x650b082f -//.word 0x95482e6e -//.word 0x0b8ab623 -//.word 0x3a4bcb27 -//.word 0xaeb86ec0 -//.word 0x9cfcb00d -//.word 0xbec124a4 -//.word 0x5df49479 -//.word 0xb0c9f302 -//.word 0x64009398 -//.word 0x7c669821 -//.word 0x5b9eadec -//.word 0x1f21f5dc -//.word 0x318444c9 -//.word 0x1afa9023 -//.word 0x9919a2d8 -//.word 0xf2e11178 -//.word 0x88fa7198 -//.word 0xae3dc874 -//.word 0xbb7641d8 -//.word 0x5c682540 -//.word 0x2f12063e -//.word 0x8d313e1c -//.word 0xa70698c2 -//.word 0xd4594cdb -//.word 0x29be3134 -//.word 0x4b172e64 -//.word 0x815af1b2 -//.word 0x0d95e433 -//.word 0xbd2f5d33 -//.word 0xbd7016d6 -//.word 0xaf43dcff -//.word 0xfd3b8b71 -//.word 0x6ed53935 -//.word 0xf8fdb23b -//.word 0xd6d32544 -//.word 0xdaae1cfe -//.word 0x0361b171 -//.word 0x52beff9b -//.word 0xda59d857 -//.word 0x178fb684 -//.word 0x80c6f362 -//.word 0x5ff53c3f -//.word 0xe1684354 -//.word 0x69bdb4ea -//.word 0x2a336bc1 -//.word 0xf524e4b1 -//.word 0x4fcff292 -//.word 0xc75bb45a -//.word 0x8719c585 -//.word 0x280ab4ba -//.word 0xcba1b4ab -//.word 0x65c9943d -//.word 0x5a2af1e9 -//.word 0x4ea8aa61 -//.word 0x372d9477 -//.word 0xb7a96f3b -//.word 0xaa571964 -//.word 0xfb4102f2 -//.word 0xbb06e011 -//.word 0x74dba43f -//.word 0xbad0acb1 -//.word 0x04553af3 -//.word 0xbafc25d0 -//.word 0x8f80ce71 -//.word 0x110756c9 -//.word 0x7ea40e30 -//.word 0xda202f4d -//.word 0x3efacc3a -//.word 0x73ac04e3 -//.word 0xc0307caf -//.word 0xffc30d63 -//.word 0xf6e9b943 -//.word 0xe5b1e47a -//.word 0x5c3ac0bb -//.word 0x4f760a29 -//.word 0x6c2ef474 -//.word 0xac466245 -//.word 0x294358dd -//.word 0x2f0ab3f9 -//.word 0x95ea18f8 -//.word 0x4edd2b3f -//.word 0x3b0b01dd -//.word 0x4390d76b -//.word 0xa67f0436 -//.word 0x8e272ca1 -//.word 0xe895b7c4 -//.word 0x715a8159 -//.word 0x148ed3d9 -//.word 0x731493e2 -//.word 0xc420b7dc -//.word 0xdef7ffdc -//.word 0x93f6e4c8 -//.word 0x41d6ccbd -//.word 0xa42e7fad -//.word 0xee39de4d -//.word 0x1adad32e -//.word 0x7ddd8429 -//.word 0x9e80cc01 -//.word 0x4732eb44 -//.word 0xdc9a7c72 -//.word 0xecdba861 -//.word 0x06179ae0 -//.word 0xce32329b -//.word 0x4fd8fe3f -//.word 0x93c166de -//.word 0x71332694 -//.word 0xa7c9026b -//.word 0x2974b47c -//.word 0xb8bf2a57 -//.word 0xb557eea5 -//.word 0x38cae60c -//.word 0x5d8f3d53 -//.word 0xde47a1c7 -//.word 0xe742afdd -//.word 0x2545ab18 -//.word 0x218a752d -//.word 0xcc09b866 -//.word 0x5af66544 -//.word 0x548b6068 -//.word 0xe90779b3 -//.word 0x86f79dad -//.word 0xa6b44d23 -//.word 0xea2d5015 -//.word 0x6ce6a5cf -//.word 0x5141bc55 -//.word 0x9dfde604 -//.word 0x4bfc0977 -//.word 0x9e4998a8 -//.word 0xb259c257 -//.word 0x5691eab0 -//.word 0x1e095828 -//.word 0xb3902ea8 -//.word 0x6ef09ded -//.word 0x2573582f -//.word 0x45a54900 -//.word 0x215c8478 -//.word 0x8af6798f -//.word 0xa0e26dca -//.word 0xe7622b1a -//.word 0x9e8ef601 -//.word 0x4c9dc3f6 -//.word 0x9b60a50b -//.word 0x690f89cd -//.word 0x1d48236b -//.word 0x3755281b -//.word 0x2caebeba -//.word 0x70be31b2 -//.word 0xd4eae721 -//.word 0x12d09638 -//.word 0xa6ccb4e1 -//.word 0xe0c12fa4 -//.word 0x38165fcb -//.word 0xe1fe39c4 -//.word 0xa1fdc5c8 -//.word 0xdfa8d2ba -//.word 0xfeace852 -//.word 0xe9117e7a -//.word 0xefc06df8 -//.word 0xd243a54e -//.word 0x1acd1ede -//.word 0xaf7a1252 -//.word 0xa7d76a3b -//.word 0x5da576f8 -//.word 0xc3dae0da -//.word 0xf9e9e386 -//.word 0x1e43b89a -//.word 0x661e5193 -//.word 0x6c754aee -//.word 0xca501d8d -//.word 0xe845955d -//.word 0x113f8536 -//.word 0xcc7eb902 -//.word 0x69df2d22 -//.word 0xda5e7d0d -//.word 0xc4d99d3a -//.word 0xd617ca41 -//.word 0x5a08c03d -//.word 0x094e2e74 -//.word 0x24fd673a -//.word 0xc09f5a12 -//.word 0x627cc417 -//.word 0xcb18a49a -//.word 0x15fcf00d -//.word 0xffb9861f -//.word 0x862b6529 -//.word 0xb5fb1dc9 -//.word 0xbd6784cc -//.word 0x4846ab52 -//.word 0x0b46102c -//.word 0x9a791589 -//.word 0x8110b1d2 -//.word 0x906666d2 -//.word 0x7640731a -//.word 0x92534aa4 -//.word 0x050644b6 -//.word 0x0c7a9409 -//.word 0x8dc77a2b -//.word 0xef89b922 -//.word 0x2f9c4a52 -//.word 0x302352a1 -//.word 0x53cf52d8 -//.word 0x485e9d4c -//.word 0x246110bf -//.word 0xb343fd81 -//.word 0x0f8768da -//.word 0x715176ad -//.word 0x48282255 -//.word 0x88fa32d3 -//.word 0x4560692b -//.word 0x8024ff0b -//.word 0x41014eae -//.word 0xe6a9ce00 -//.word 0xba0d4303 -//.word 0xc9d83571 -//.word 0xf33ca1a3 -//.word 0x40f2eeb1 -//.word 0x737c22db -//.word 0xe2ae5627 -//.word 0x846c684c -//.word 0x4cb5efcf -//.word 0xb5e1746c -//.word 0x9f26dfb7 -//.word 0x59612f03 -//.word 0xff136e83 -//.word 0x06aae4af -//.word 0x15038ce9 -//.word 0x162cc461 -//.word 0x8e6e4836 -//.word 0x298b61de -//.word 0x9a445ac7 -//.word 0xa11e343e -//.word 0x6d669b91 -//.word 0x25731870 -//.word 0xc22b8799 -//.word 0x1fc9ccb5 -//.word 0x53ddc27c -//.word 0x3e937420 -//.word 0x623990e9 -//.word 0xf4fc181c -//.word 0x33f25b22 -//.word 0xf95e24e6 -//.word 0x902f317f -//.word 0xc6c9e60f -//.word 0x440843eb -//.word 0x1b8214fc -//.word 0xa00d6765 -//.word 0x7a824365 -//.word 0xf9c0977f -//.word 0xaaf371d9 -//.word 0x281670e3 -//.word 0x34b67c38 -//.word 0x08f9b4c9 -//.word 0xe9e0a838 -//.word 0xfcc9c982 -//.word 0x5a381ee1 -//.word 0x66d638f1 -//.word 0x5fba6711 -//.word 0x31e82e0c -//.word 0x9117f5f9 -//.word 0x48b8fe5f -//.word 0xcf339a9d -//.word 0x1d749d89 -//.word 0xbda60f58 -//.word 0x233e24be -//.word 0x403c6e55 -//.word 0x54ad5243 -//.word 0x0475b918 -//.word 0xac4b07f5 -//.word 0xf60551f3 -//.word 0xac16cbc2 -//.word 0xca557f91 -//.word 0xd800452e -//.word 0x7600ef6f -//.word 0x396ec4d0 -//.word 0xb557305d -//.word 0xdbbcb9d3 -//.word 0x86dd3502 -//.word 0x50b83a75 -//.word 0xaaccd755 -//.word 0x2c22818b -//.word 0x298e5025 -//.word 0x87336cfb -//.word 0xcd45c292 -//.word 0x7e13fb40 -//.word 0xa644ae91 -//.word 0xb260d4ea -//.word 0x84937d6c -//.word 0xc7aec21b -//.word 0x806ffb40 -//.word 0xe602320c -//.word 0x74c7d77d -//.word 0x3c56b486 -//.word 0x7ec1246a -//.word 0x79198069 -//.word 0x8133db9e -//.word 0x52abef28 -//.word 0xa42a5688 -//.word 0x00e5fe4a -//.word 0xd166d7e8 -//.word 0xbe8fceeb -//.word 0x37dcff53 -//.word 0x4ee82639 -//.word 0xc93357b3 -//.word 0x7522f0f8 -//.word 0xbd47cbc4 -//.word 0x7ae3b8fe -//.word 0x0da92a99 -//.word 0xacc530b8 -//.word 0xf91da715 -//.word 0xd9d7afa3 -//.word 0x831b5b72 -//.word 0xd71aadd3 -//.word 0xf24fc1be -//.word 0xff044870 -//.word 0x4f193858 -//.word 0xad01c234 -//.word 0xeb0d8578 -//.word 0xc1ed01ef -//.word 0xd8744ea4 -//.word 0x219b0d03 -//.word 0x6bc9a03c -//.word 0x355196e8 -//.word 0xc03c69ef -//.word 0x694a6ca9 -//.word 0x3633ff43 -//.word 0xaf320565 -//.word 0xefc49811 -//.word 0xfaaefbcf -//.word 0x513dcf07 -//.word 0xc4d18aae -//.word 0x889d2624 -//.word 0x89a8165d -//.word 0x01177e40 -//.word 0x4aafa34c -//.word 0xf196a181 -//.word 0x0b595c7e -//.word 0xcc33b8e7 -//.word 0x558d0d09 -//.word 0xcec1d5c1 -//.word 0xb523a899 -//.word 0x75426b35 -//.word 0x3b6bc4ee -//.word 0x056fd0bc -//.word 0xfca61959 -//.word 0x0334c2a3 -//.word 0x908b0543 -//.word 0xba32e08c -//.word 0x94c40aa5 -//.word 0xba3b2ceb -//.word 0x296e4e91 -//.word 0x54d98f89 -//.word 0x749d1aa8 -//.word 0x1fc75505 -//.word 0x1cd55ca2 -//.word 0x7677ad4e -//.word 0xcf9225c9 -//.word 0xf78a2b2a -//.word 0xbdc12b7e -//.word 0x055b46b2 -//.word 0x1b4547b3 -//.word 0x4775d9d3 -//.word 0xa273f86f -//.word 0x2718a6ce -//.word 0x0d95df4d -//.word 0x55b8ceb9 -//.word 0x9f6b41fd -//.word 0x417e5bfd -//.word 0x9aa688c1 -//.word 0xa4c5b6d6 -//.word 0xc96bc3f1 -//.word 0xf89d31d6 -//.word 0xf7d62178 -//.word 0xfb4c7f62 -//.word 0x76747a55 -//.word 0x30c83733 -//.word 0x99c8c61b -//.word 0x5e3f55d6 -//.word 0x3ac7a372 -//.word 0x0f8fb82c -//.word 0x355cd494 -//.word 0x11cea5eb -//.word 0xeae5bcd0 -//.word 0xf9c3421c -//.word 0xbfb4e70a -//.word 0x9c6b1c9b -//.word 0x9c8f8238 -//.word 0x9476a299 -//.word 0x6e30dee7 -//.word 0xc1c7a71d -//.word 0xa5c5f1b4 -//.word 0xc5f7e47f -//.word 0xb571d5d4 -//.word 0x86d274ec -//.word 0x98c9478c -//.word 0xb0d857e5 -//.word 0x4a5829ba -//.word 0x31beefc0 -//.word 0x4c1c004a -//.word 0xbbeb8625 -//.word 0x230776c1 -//.word 0x45fbc692 -//.word 0xd67fdab6 -//.word 0x8a3f3fd8 -//.word 0x73de9b54 -//.word 0x893be49c -//.word 0x8af3d1da -//.word 0x04278ed7 -//.word 0xaf7fb41b -//.word 0x016e7856 -//.word 0xfdb823fe -//.word 0x4c32c23a -//.word 0x8ec91eff -//.word 0xf2c6ee78 -//.word 0x04514cac -//.word 0xc733665b -//.word 0x04e07628 -//.word 0xe1b4f4fe -//.word 0xb57d09ac -//.word 0x1b3a48d2 -//.word 0x46229901 -//.word 0x94e8751e -//.word 0x653e5907 -//.word 0x2d987479 -//.word 0xc832a332 -//.word 0x0e54a052 -//.word 0xa8d57707 -//.word 0x22de3969 -//.word 0x40f0f3a3 -//.word 0x9628e154 -//.word 0x53c2e035 -//.word 0x5edd22fb -//.word 0xa47d257f -//.word 0xb0d6e61c -//.word 0x7cc85258 -//.word 0x86a6fdc7 -//.word 0x273b162d -//.word 0x200f9be3 -//.word 0x76e6c97c -//.word 0x818ad7a7 -//.word 0x3fcae357 -//.word 0xeec32d22 -//.word 0xd95e83e7 -//.word 0x721afcb4 -//.word 0xa10ce9e7 -//.word 0x5c240993 -//.word 0x78b1fc25 -//.word 0xbe27fa47 -//.word 0x4220c504 -//.word 0xf0a2dc2d -//.word 0x68a0f2fc -//.word 0x0cc39ef8 -//.word 0x566a5418 -//.word 0x70ef942b -//.word 0xfe2c6177 -//.word 0x3e3df5a1 -//.word 0x5488b3cd -//.word 0xdffb5d05 -//.word 0xd09587df -//.word 0x7c284c5a -//.word 0xf05d3f0a -//.word 0x84f8a475 -//.word 0xb35de1bc -//.word 0x29532f7e -//.word 0x1e0995f9 -//.word 0xe3571772 -//.word 0xba452bd7 -//.word 0xebd16ca4 -//.word 0x14ed9203 -//.word 0xc1c8a237 -//.word 0x3c4e623a -//.word 0xa7f210a5 -//.word 0x47ab53d1 -//.word 0x233c723c -//.word 0xceb9c42e -//.word 0x8147689c -//.word 0x6c23354c -//.word 0x4ee6f43a -//.word 0x4407cd3b -//.word 0xdea100e0 -//.word 0x7876d69d -//.word 0xc835d62a -//.word 0xb3f83b2a -//.word 0x6511a60b -//.word 0xa006112d -//.word 0x54da0446 -//.word 0x718e0b05 -//.word 0xf9e867f5 -//.word 0x597304a5 -//.word 0xf9c7ab06 -//.word 0x120a7914 -//.word 0xc0b790b8 -//.word 0x589e0ced -//.word 0xfb2d3923 -//.word 0x6bed03e0 -//.word 0x1e4fadad -//.word 0x91a9c630 -//.word 0xdf7c5996 -//.word 0x92f86534 -//.word 0xb9c28c6d -//.word 0x3bf40fd6 -//.word 0x6a66fa98 -//.word 0xdb2c9c16 -//.word 0x765f3ad0 -//.word 0xc9210587 -//.word 0xa1db48a3 -//.word 0xdcc9e6d1 -//.word 0x79b904f0 -//.word 0xf10f032e -//.word 0xca0db16e -//.word 0x6951c0ee -//.word 0x289f7726 -//.word 0xa8e1a7f3 -//.word 0x696ce1f4 -//.word 0x9785e634 -//.word 0x27245f0a -//.word 0x23f8ce3e -//.word 0x42aac56d -//.word 0xbc6656af -//.word 0x5c98ca76 -//.word 0xd7f395ba -//.word 0x5cb88a53 -//.word 0x6c354ca6 -//.word 0xec8c0583 -//.word 0x79b55a4e -//.word 0xfbc69e5d -//.word 0x7d7245a2 -//.word 0x3cd09c8a -//.word 0xfd5eb824 -//.word 0xa446ac86 -//.word 0x03e0006d -//.word 0xf0775e23 -//.word 0x9a508da6 -//.word 0x1de8a406 -//.word 0x537e770f -//.word 0xedd15628 -//.word 0xc32bf77b -//.word 0x699eb056 -//.word 0x038ee9d1 -//.word 0x5a70d2b2 -//.word 0x2fd0518d -//.word 0xcf993f30 -//.word 0xe791d33e -//.word 0x9a235e19 -//.word 0xd1613905 -//.word 0xd249fc8b -//.word 0x1547f11c -//.word 0x52fcc9f7 -//.word 0xdf3e8d4d -//.word 0x3960d7a2 -//.word 0xe1b34176 -//.word 0x694c1e25 -//.word 0xce08680c -//.word 0x08cefaed -//.word 0xe014ff94 -//.word 0x02a5abbb -//.word 0x53a1292c -//.word 0x84c5d425 -//.word 0xe8eca900 -//.word 0x82d6fc13 -//.word 0x63296bd6 -//.word 0x33b51143 -//.word 0x0dfcfc83 -//.word 0x90f2e0c6 -//.word 0x32010c73 -//.word 0xd8509e81 -//.word 0xa445f324 -//.word 0x0e4962ad -//.word 0x37cb2aab -//.word 0x7987a857 -//.word 0x4308ce2f -//.word 0x246bd0e0 -//.word 0x25672069 -//.word 0x5c8a9d7e -//.word 0xbec5082a -//.word 0x352bb7b9 -//.word 0xf3f68dd5 -//.word 0x05cb29ef -//.word 0x2b3f5ee1 -//.word 0xe799e3d1 -//.word 0xd4d94c58 -//.word 0x39fa39e3 -//.word 0xde75ce5a -//.word 0x1e066300 -//.word 0x3eb27c9b -//.word 0xfd09fbd4 -//.word 0x6ca994e0 -//.word 0x00038260 -//.word 0xe6627886 -//.word 0x9629db7a -//.word 0xab5b2efc -//.word 0xf261ce4a -//.word 0xc108df44 -//.word 0x8aca86ce -//.word 0xaf4e5876 -//.word 0x98321357 -//.word 0x04078c3c -//.word 0x9c9de909 -//.word 0xce811057 -//.word 0xd8c5605f -//.word 0x23ff9e19 -//.word 0xd39432a5 -//.word 0x9c3793e9 -//.word 0xd7ac007c -//.word 0xd5d271c2 -//.word 0x73e0cd59 -//.word 0xeeef5db4 -//.word 0xf9b98106 -//.word 0x0da0a162 -//.word 0x01f26720 -//.word 0xda6b2b82 -//.word 0xe4fbaf98 -//.word 0x02ca0d60 -//.word 0x427aed32 -//.word 0xb4acfb5b -//.word 0x7dc59909 -//.word 0x27f2d067 -//.word 0x3b698d08 -//.word 0x12f20a89 -//.word 0xe8a68a72 -//.word 0x32f7495e -//.word 0x31f1b35c -//.word 0xc8c0d494 -//.word 0x8b71102e -//.word 0x18fd146f -//.word 0xaa830c25 -//.word 0xebd51646 -//.word 0x0a36f7d4 -//.word 0x0e620e03 -//.word 0x6acf869e -//.word 0xd133cfa7 -//.word 0x4b464e3e -//.word 0x89c953c3 -//.word 0x75c74c3f -//.word 0x0e1b3900 -//.word 0x73326084 -//.word 0x3d124299 -//.word 0x129bcdc1 -//.word 0x780dd3db -//.word 0xe6cbbb00 -//.word 0x215f77ac -//.word 0xc6bdb61e -//.word 0x22cc5a01 -//.word 0x4a222c4b -//.word 0x680fce66 -//.word 0x54def28e -//.word 0x6457ca7a -//.word 0x8489bf3e -//.word 0x89c66670 -//.word 0xc2eeb089 -//.word 0xd0f1618f -//.word 0xb88fc3f1 -//.word 0x37629bb3 -//.word 0x561f5cca -//.word 0x3d199bca -//.word 0x4c06c3be -//.word 0x68060a57 -//.word 0x93e1a34a -//.word 0xc09035f3 -//.word 0xe5008d3e -//.word 0x511290c7 -//.word 0x40e67340 -//.word 0xad592e14 -//.word 0x67cc2d49 -//.word 0x672849ab -//.word 0x611ef827 -//.word 0x99b4c075 -//.word 0xf8fdf2fa -//.word 0x5f2794ec -//.word 0x3bbc9fb7 -//.word 0x5a216b9f -//.word 0xfd6367a7 -//.word 0x2e320db2 -//.word 0x532e15e9 -//.word 0x0462e95c -//.word 0x1a0e5aec -//.word 0x08aa9168 -//.word 0x6f2748f6 -//.word 0xec783ab5 -//.word 0x3551d7a0 -//.word 0x642f3db6 -//.word 0x92986458 -//.word 0xa8a498f2 -//.word 0x72bc2ddd -//.word 0xf5a26e84 -//.word 0x03b1d6c6 -//.word 0x0c67839c -//.word 0x3720e7fc -//.word 0xb124c1fd -//.word 0x45e44b3b -//.word 0x2e81b57d -//.word 0x298ed395 -//.word 0xce171388 -//.word 0x1fe2b1ef -//.word 0x62f42e9d -//.word 0x2c57fe82 -//.word 0xbf1b81cf -//.word 0x959b345b -//.word 0x3d022946 -//.word 0x660db4dc -//.word 0x3a1268bc -//.word 0xed414139 -//.word 0x952a2300 -//.word 0x3c7f83fb -//.word 0x331b6476 -//.word 0xaa448681 -//.word 0x7e2dda95 -//.word 0x52bf387a -//.word 0xe1995467 -//.word 0x9256ef6c -//.word 0x4e0e4a0d -//.word 0x8e1fe030 -//.word 0xb82d5439 -//.word 0xab67a973 -//.word 0x980cb1b2 -//.word 0x152ec836 -//.word 0x6cb7c2d3 -//.word 0x39a9214f -//.word 0x34aa8b0c -//.word 0x4bbf7ce6 -//.word 0xf458395f -//.word 0xc18d05fa -//.word 0x34a796e4 -//.word 0xd6e2cad9 -//.word 0x83719746 -//.word 0x08c340ab -//.word 0xf005cf44 -//.word 0x9ae8bfe8 -//.word 0x8fa4f931 -//.word 0x133d02dd -//.word 0xfa047274 -//.word 0xbd62a82b -//.word 0xcdd1bc09 -//.word 0x272bb548 -//.word 0x2927fcfe -//.word 0xa42011fd -//.word 0x32197df7 -//.word 0xcaff08e6 -//.word 0x912d2baa -//.word 0xf336c8f4 -//.word 0xf3de1964 -//.word 0xbf69e7ee -//.word 0x8819fc82 -//.word 0x90f2daec -//.word 0x85c0adf9 -//.word 0x0d5b7fdb -//.word 0xa22aabce -//.word 0xa0e694fc -//.word 0x9ca0969e -//.word 0xf8063d65 -//.word 0xb4e2b518 -//.word 0x87e3827e -//.word 0x2fa0717e -//.word 0x05dacf85 -//.word 0xd401d828 -//.word 0xebfa720b -//.word 0x71201c01 -//.word 0xf9892174 -//.word 0x568a1108 -//.word 0xb17d717b -//.word 0xd9c1b2d0 -//.word 0xd90360ac -//.word 0xd0bc9c00 -//.word 0xfdfbcce8 -//.word 0x1a6591d3 -//.word 0xeb7afae5 -//.word 0x161af799 -//.word 0x354710ab -//.word 0x2a2c5635 -//.word 0xb25e9a18 -//.word 0x3e63de9d -//.word 0xfe71095c -//.word 0x3e77df5d -//.word 0xf5622f7e -//.word 0x9b994e14 -//.word 0x3cc9c5d5 -//.word 0xcbe847f6 -//.word 0xb874e690 -//.word 0xc4fc8648 -//.word 0x15e2912f -//.word 0x855fece7 -//.word 0x40c72a08 -//.word 0x8e0f00c1 -//.word 0xed8cf9c3 -//.word 0x63fd6b5a -//.word 0x12ccaadd -//.word 0x0d917b49 -//.word 0x6ad8cc29 -//.word 0x9924a2b9 -//.word 0xf434524a -//.word 0x9684f4e8 -//.word 0x7117153b -//.word 0x9b74acab -//.word 0xe9ef4fc7 -//.word 0xbf29a7e8 -//.word 0x26da2211 -//.word 0x1fcee71a -//.word 0x382e0f0e -//.word 0x5c0112d1 -//.word 0xeff27f06 -//.word 0x1b54f12f -//.word 0x64633e16 -//.word 0x83cdf16d -//.word 0x7171fbb1 -//.word 0xc266a554 -//.word 0x343fc91a -//.word 0x888d42c4 -//.word 0x90a6a1ec -//.word 0x8aa52130 -//.word 0xacb2de92 -//.word 0x0084411f -//.word 0x7223bfcf -//.word 0x28f3c3ad -//.word 0x11eee837 -//.word 0xc1316c08 -//.word 0x7cbae2b4 -//.word 0x907026f4 -//.word 0xe8639603 -//.word 0xdf567f47 -//.word 0x527bd634 -//.word 0xf97d296e -//.word 0xf7c3d42d -//.word 0xaff478e6 -//.word 0xdab6a928 -//.word 0xd6bce7c4 -//.word 0x41ffd030 -//.word 0xc74b932d -//.word 0x38fea8a8 -//.word 0xde0dbfde -//.word 0x0d47f6c4 -//.word 0xfbde4ea6 -//.word 0xd223600e -//.word 0x04914ce7 -//.word 0xdf0df3e2 -//.word 0x616c6619 -//.word 0x4d369df3 -//.word 0x7ea96d47 -//.word 0x7c01b4c4 -//.word 0x4df7d790 -//.word 0x8e886e2f -//.word 0xc2f73da7 -//.word 0xe91567e1 -//.word 0x55c0de53 -//.word 0xb9aa1edc -//.word 0x835c1bef -//.word 0x6b7a77f4 -//.word 0x4c48f9eb -//.word 0x336d3b53 -//.word 0xb6f7a24a -//.word 0x88a093f5 -//.word 0x4a4fe422 -//.word 0xa3e2912c -//.word 0x922bb11f -//.word 0x0338a81d -//.word 0xa1d89d01 -//.word 0xec5a2f41 -//.word 0x8b986319 -//.word 0xe335e1e6 -//.word 0xe82261d0 -//.word 0x336760ab -//.word 0x5620171f -//.word 0x6cc5ad07 -//.word 0xf4afac18 -//.word 0xdfd8b2c3 -//.word 0xe7e3695c -//.word 0x235cb87b -//.word 0xd8403ba3 -//.word 0x93c0f121 -//.word 0x74423537 -//.word 0xcda9f07a -//.word 0xecd60c79 -//.word 0x346e2c9f -//.word 0x73de9a5b -//.word 0x6f9d807d -//.word 0xc2b15ce4 -//.word 0xe875ae56 -//.word 0x9799f3af -//.word 0x4e6ad73e -//.word 0x3154a76c -//.word 0x14a5059e -//.word 0xd693df5d -//.word 0xf081a2b5 -//.word 0x4d7eaada -//.word 0x5d0ffe12 -//.word 0x652e3ace -//.word 0x1992cc1a -//.word 0x6c316338 -//.word 0xa704a588 -//.word 0xb80a21ac -//.word 0xcd8f84e8 -//.word 0x22ae0fcf -//.word 0x1715481c -//.word 0x8608f0de -//.word 0x53a936d8 -//.word 0x45762a27 -//.word 0x14137425 -//.word 0xc34a468e -//.word 0x2f508fe1 -//.word 0xe9497209 -//.word 0x410ff63d -//.word 0xa32fff25 -//.word 0x27357d3e -//.word 0x632ae37f -//.word 0x845adb3d -//.word 0x9d5b374c -//.word 0x3e4a2b67 -//.word 0x4958bad1 -//.word 0x01856f3d -//.word 0x64ac4dec -//.word 0xbbc00815 -//.word 0x6f557689 -//.word 0x1e624097 -//.word 0xee45dd2d -//.word 0x2107c141 -//.word 0xeae2d16f -//.word 0x7f001be4 -//.word 0x7086c47a -//.word 0x37d14124 -//.word 0x10ffca8d -//.word 0x0bb20cfc -//.word 0x5f101f7b -//.word 0x010fb738 -//.word 0x75ef9e2b -//.word 0xe50862f9 -//.word 0x70c54b19 -//.word 0xc4f18f35 -//.word 0xef31c9d3 -//.word 0x72d2a834 -//.word 0x97c5e47c -//.word 0x05e87714 -//.word 0x9288094d -//.word 0x5823ac46 -//.word 0x0b72c90f -//.word 0x8aa65a0e -//.word 0xb3f35aa2 -//.word 0x7c4b7a07 -//.word 0x3f6c167a -//.word 0x561c679d -//.word 0xe8b3fa1c -//.word 0x02db6191 -//.word 0xea9428a5 -//.word 0xb07b0b78 -//.word 0x054b6544 -//.word 0x50a4ec3d -//.word 0xff0b9cbb -//.word 0x1b33f19a -//.word 0x207a59e1 -//.word 0x0bb7e9a3 -//.word 0xb4334f23 -//.word 0x5ef5083b -//.word 0x8d43d3ff -//.word 0x1865659d -//.word 0x7eac5e88 -//.word 0x7db37cd5 -//.word 0xe1e50ee5 -//.word 0x9b3fac44 -//.word 0x125726d1 -//.word 0xbe9eba1f -//.word 0xf2e28a1c -//.word 0xf9174df0 -//.word 0x65564428 -//.word 0xa4266f14 -//.word 0xd4fb026d -//.word 0xd8fc133b -//.word 0xac0995f6 -//.word 0xf5fd89ec -//.word 0xdd3073e2 -//.word 0x1d410bfe -//.word 0x5b1236e5 -//.word 0xb7133420 -//.word 0xa1c41bc4 -//.word 0xed758452 -//.word 0x295084dc -//.word 0x2e9ade69 -//.word 0xf536769b -//.word 0xac6b098f -//.word 0x09e71c05 -//.word 0xdf0332c1 -//.word 0xef484231 -//.word 0x0032684f -//.word 0x3235dbc9 -//.word 0x8ffe1f5f -//.word 0xe3fb7c8d -//.word 0xcd1dae6b -//.word 0x17ddded1 -//.word 0x437dd1be -//.word 0x669060fb -//.word 0x3abc28fb -//.word 0x6ebf8206 -//.word 0x40b0b697 -//.word 0x4e876b02 -//.word 0xa9e06259 -//.word 0x2cfc6491 -//.word 0x0c0979e1 -//.word 0xafa35b6b -//.word 0xc29a2a1e -//.word 0x86f661db -//.word 0x6a3809d6 -//.word 0xdfe32d40 -//.word 0x683b8d23 -//.word 0xf04d968d -//.word 0x612f92f0 -//.word 0x72891dc9 -//.word 0xc154d880 -//.word 0x21e2618f -//.word 0x351f82e7 -//.word 0x3e16a88f -//.word 0x31b7978f -//.word 0x0dd75d0c -//.word 0x6b7884b4 -//.word 0x564b8c5d -//.word 0x5e7399e8 -//.word 0xe88c686c -//.word 0xc8ec8791 -//.word 0x1228c639 -//.word 0x2cdae966 -//.word 0x28a29f58 -//.word 0x516bb8f5 -//.word 0x04f0926e -//.word 0xc27ed420 -//.word 0x82fb5fb8 -//.word 0x4c27829b -//.word 0x03226d85 -//.word 0x832fe96f -//.word 0xecb746b7 -//.word 0x3c91947b -//.word 0x24801645 -//.word 0x14fdf3ee -//.word 0x99372fbc -//.word 0xe859dace -//.word 0xbb0b87ba -//.word 0x5b3b0074 -//.word 0xfe1d3872 -//.word 0x5470810d -//.word 0x5d04ff2b -//.word 0x7d795d1b -//.word 0xd249bec0 -//.word 0xc509f7f2 -//.word 0xdfebfb21 -//.word 0xdf88963b -//.word 0x09dc5fd0 -//.word 0xc092e875 -//.word 0x57823766 -//.word 0x25797a6f -//.word 0xd738f60c -//.word 0x0abf41cf -//.word 0x1acbb102 -//.word 0x349d148e -//.word 0xb3fda11b -//.word 0xa97f2f79 -//.word 0xbb05a53e -//.word 0x3385b2b1 -//.word 0x500cbee7 -//.word 0xe003202c -//.word 0x11b291a5 -//.word 0x8502e033 -//.word 0xa487e899 -//.word 0x36bdc0e2 -//.word 0x319231fd -//.word 0xcf256dab -//.word 0xe4cefd9b -//.word 0x6f5efcd2 -//.word 0x6fa88351 -//.word 0xf84064f2 -//.word 0x85821b94 -//.word 0x90d60177 -//.word 0x6033c3e9 -//.word 0x23e21323 -//.word 0x3c859d6e -//.word 0xde573d8a -//.word 0xdab56f4f -//.word 0xb5de0795 -//.word 0xfef72252 -//.word 0xde525c02 -//.word 0xf1ef434c -//.word 0x54430ce2 -//.word 0x003985a9 -//.word 0x56774b1a -//.word 0xfae23de8 -//.word 0xe56430e2 -//.word 0xb6ede51c -//.word 0x49b73849 -//.word 0x8bcf996c -//.word 0x8dd1c0b0 -//.word 0xd7f29d93 -//.word 0xfe448e4a -//.word 0x7936d561 -//.word 0xb05a49a3 -//.word 0x566c4b39 -//.word 0xf98ffc16 -//.word 0xd7d9ae92 -//.word 0xf4129854 -//.word 0x69b9cd76 -//.word 0xff486fe4 -//.word 0xfcba1f05 -//.word 0x3d49b99e -//.word 0x857c3ef3 -//.word 0x1561122f -//.word 0x7d176805 -//.word 0xb190fa98 -//.word 0x5f95fd98 -//.word 0x800b54ae -//.word 0x2e74041b -//.word 0xb5b9e89c -//.word 0xec26a690 -//.word 0xc6b6e15c -//.word 0x2491b00f -//.word 0xedd34f42 -//.word 0x618f1543 -//.word 0xaa14a672 -//.word 0xb46e6aea -//.word 0x3f303e64 -//.word 0x33716959 -//.word 0x3315d167 -//.word 0x744e6ff6 -//.word 0xd061001b -//.word 0x16aefdbd -//.word 0xa5ebcef6 -//.word 0x39b03bbb -//.word 0x043823c0 -//.word 0x01667096 -//.word 0x85064a16 -//.word 0x17568b03 -//.word 0x81c473eb -//.word 0x27fa9e4e -//.word 0x98183203 -//.word 0x63405dd6 -//.word 0x2c58ff76 -//.word 0xfe0ba38f -//.word 0xe311b433 -//.word 0xb2b1ee7e -//.word 0x2984127a -//.word 0x3b7bde40 -//.word 0xab233c60 -//.word 0xda28ba83 -//.word 0xde193a4f -//.word 0xd36aea8b -//.word 0x76bf7784 -//.word 0xf0687eaf -//.word 0xef27448f -//.word 0xfb3aa6d9 -//.word 0x089553d7 -//.word 0x4770380a -//.word 0x42013c13 -//.word 0x288b2ed4 -//.word 0x6597fbd2 -//.word 0x768125dd -//.word 0xfc3770f4 -//.word 0x0f3edf63 -//.word 0xd4f6de2e -//.word 0x521ec1b2 -//.word 0x819a6d8a -//.word 0xa47455b0 -//.word 0xd922a9e4 -//.word 0xef07c952 -//.word 0x773c006f -//.word 0x1e8f6f24 -//.word 0x3acc472e -//.word 0xa23c3cc5 -//.word 0xc36c367b -//.word 0xf02f4968 -//.word 0xfae6e784 -//.word 0x01ff5454 -//.word 0x89bc5bc9 -//.word 0xd0364065 -//.word 0x60a1f59f -//.word 0xe0d19089 -//.word 0x2ffdfdb0 -//.word 0xb4c4f043 -//.word 0xef6d1e78 -//.word 0x5473ad2c -//.word 0x5a41e9ca -//.word 0xcf3a386d -//.word 0x6efc5049 -//.word 0xb3e6a747 -//.word 0xeed82bef -//.word 0x9739348b -//.word 0xe13fb789 -//.word 0x916abc22 -//.word 0x11521239 -//.word 0xc0a34186 -//.word 0x8d66c0f3 -//.word 0xc4826846 -//.word 0x27822901 -//.word 0x4198fc86 -//.word 0xf7e2187f -//.word 0x60ed697d -//.word 0xd7783edf -//.word 0x4e7a42f6 -//.word 0xe566ad67 -//.word 0xbbadbbd0 -//.word 0x03845eae -//.word 0x5be92f7e -//.word 0x5ae0ab22 -//.word 0x68039c87 -//.word 0xd339d585 -//.word 0x1fc62206 -//.word 0x9d847f6b -//.word 0x3f6f882b -//.word 0xaa6731bd -//.word 0x8d32b7b9 -//.word 0x31c1d73a -//.word 0x52b43d86 -//.word 0x2e203ff1 -//.word 0xdb8fcbfe -//.word 0xdd489ec8 -//.word 0xf8d1b7a0 -//.word 0x43b30cf8 -//.word 0x7e7d7b80 -//.word 0xa50b038e -//.word 0xc50834c3 -//.word 0x0fb2e4ec -//.word 0x2bdd2426 -//.word 0xcf3b7346 -//.word 0x8fda3177 -//.word 0xf7ee5625 -//.word 0xd7d1631a -//.word 0xde4899e7 -//.word 0x6a086986 -//.word 0x9f792d3d -//.word 0xb7b915c5 -//.word 0x98e464ac -//.word 0xac93dcf8 -//.word 0xeda2760d -//.word 0x3f3757d1 -//.word 0x03ff000d -//.word 0xe9bbc517 -//.word 0x05fc80ae -//.word 0x262a8625 -//.word 0x63cbdac4 -//.word 0xf602a16b -//.word 0x4e800000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00015B68 -//// expected output -//.word 0x43767f4c -//.word 0xee674909 -//.word 0x0fe23cb0 -//.word 0x7e7db664 -//.word 0xd6c7c512 -//.word 0xf8afa703 -//.word 0x04f2f14b -//.word 0x8a720477 -//.word 0x9e7223aa -//.word 0xa2c8ff3e -//.word 0x82f8cd72 -//.word 0x529e43d5 -//.word 0xdf545e88 -//.word 0x6f647a76 -//.word 0x6ae4172b -//.word 0xaa56407d -//// SHA512LongMsgvector_112 -//// vector length -//.word 0x00015E80 -//// input message -//.word 0x7caae264 -//.word 0x0e734539 -//.word 0xd394d20a -//.word 0x3b0f8c9c -//.word 0x827eb6f7 -//.word 0x26b4e922 -//.word 0x9ea1632e -//.word 0x4976a275 -//.word 0xa50a3224 -//.word 0xc17cc3f7 -//.word 0xf51b7e44 -//.word 0xd082993b -//.word 0x5207296c -//.word 0x5b57388a -//.word 0x645a186e -//.word 0x6d5df65e -//.word 0x366fb290 -//.word 0xb20befea -//.word 0xb9f8660c -//.word 0xfd6e7f90 -//.word 0x3f7a2290 -//.word 0xc3a3ca69 -//.word 0x01cedcbf -//.word 0x9d5f38c2 -//.word 0x99a10daf -//.word 0xca68f199 -//.word 0x88f53169 -//.word 0xaa196524 -//.word 0xb29e486c -//.word 0x44e2c74a -//.word 0xddc5582a -//.word 0xc1c58d27 -//.word 0x3568e989 -//.word 0xefdbf28c -//.word 0xcbd88764 -//.word 0xbfcc747d -//.word 0x113a4407 -//.word 0xc75a57b2 -//.word 0x600734b6 -//.word 0xc1d81f17 -//.word 0x728cef27 -//.word 0x0aab1a4c -//.word 0xe86a1203 -//.word 0x24cfd425 -//.word 0xc517bd6a -//.word 0x3555a02b -//.word 0xf25b176c -//.word 0x85dd1619 -//.word 0xb8d4c690 -//.word 0x04219060 -//.word 0x49737750 -//.word 0xc26aaca4 -//.word 0x37fd5c9b -//.word 0x7419cd3c -//.word 0xfb8aa952 -//.word 0xf61f9ab6 -//.word 0x6f0916cc -//.word 0xc3857d50 -//.word 0x54bb6153 -//.word 0x7fe52480 -//.word 0xceb3c9a4 -//.word 0x6eee046e -//.word 0xe35d9373 -//.word 0xfae5d174 -//.word 0xfff389e4 -//.word 0x311f08a5 -//.word 0x73097613 -//.word 0x44876643 -//.word 0xf103ab8c -//.word 0x091e6d47 -//.word 0x12997dd4 -//.word 0x7a76e6de -//.word 0xd15ac5df -//.word 0x35365ae6 -//.word 0x0d265e98 -//.word 0xfa9a9774 -//.word 0x0ab3ab5c -//.word 0x2ff03251 -//.word 0xf0090e7f -//.word 0x5f1bff79 -//.word 0x4b0672c5 -//.word 0xb6139a9b -//.word 0x89dbc2ea -//.word 0x8764e29c -//.word 0x808c701b -//.word 0xc7ab7814 -//.word 0xe674ef7b -//.word 0x8f1c45cf -//.word 0xd6bf399f -//.word 0x9efff14d -//.word 0x51ee4a12 -//.word 0xd52e6d42 -//.word 0xbb56a3d1 -//.word 0xb9986a17 -//.word 0x5aa1c8d0 -//.word 0xf4c1df67 -//.word 0xdb4cc274 -//.word 0xd4408783 -//.word 0xcc279d17 -//.word 0xca3f60ee -//.word 0x23d9eb87 -//.word 0xedff2de2 -//.word 0xb5594087 -//.word 0x7552f5c9 -//.word 0xc076b44c -//.word 0x401e83c5 -//.word 0x62506401 -//.word 0x50e1e429 -//.word 0x20dcf144 -//.word 0x4a28ecfd -//.word 0x6064ffa6 -//.word 0xf916b17e -//.word 0xef05b72f -//.word 0xcae30d9b -//.word 0x7b2f46d8 -//.word 0x4e5a2179 -//.word 0x1a295c10 -//.word 0xba5acdf1 -//.word 0xc18aae38 -//.word 0x6a56390d -//.word 0xcec17526 -//.word 0x5ad54f8e -//.word 0x7f8eeca5 -//.word 0xabf33e69 -//.word 0x7986d5f3 -//.word 0x25def844 -//.word 0x4293f542 -//.word 0xaf5ab5fe -//.word 0xc7719338 -//.word 0xd83e6e25 -//.word 0xd633fd70 -//.word 0x51f4637e -//.word 0xa5bc04f6 -//.word 0x71fd9681 -//.word 0x4a467bce -//.word 0xb06a4eda -//.word 0x40dfbc6e -//.word 0x2c6495e9 -//.word 0xe9e6223f -//.word 0x27a5ba42 -//.word 0x06939020 -//.word 0x87fccf2d -//.word 0x406ce9e3 -//.word 0x55ce2b27 -//.word 0xa3d196ce -//.word 0x3e90ea60 -//.word 0x1e71031c -//.word 0x154d683c -//.word 0x04d2227a -//.word 0x4f26cad2 -//.word 0x8ecde68a -//.word 0x86cd7670 -//.word 0x5710c963 -//.word 0xf6099514 -//.word 0xde9b470e -//.word 0x033698f4 -//.word 0x0843610a -//.word 0xb1c2b0f7 -//.word 0x9b311bca -//.word 0x2bb0543a -//.word 0xc464fe32 -//.word 0x3d19bf8d -//.word 0x922b971e -//.word 0xd9a670f3 -//.word 0x78acf6da -//.word 0x9617a825 -//.word 0xcf602fab -//.word 0x2cc0ef0f -//.word 0x5294dd45 -//.word 0xf9069051 -//.word 0xa0ea9a52 -//.word 0x7fe618c0 -//.word 0xbed688f2 -//.word 0xe46edbe3 -//.word 0x9221cb35 -//.word 0x71426f76 -//.word 0x696a0da3 -//.word 0x14192fea -//.word 0x72a0f9b4 -//.word 0xde3eb9e3 -//.word 0x4089c058 -//.word 0x850f71b9 -//.word 0x4c3e9771 -//.word 0xe281fcf8 -//.word 0x71ac3754 -//.word 0x749ac5e0 -//.word 0x6e145b4c -//.word 0xdcf57be5 -//.word 0x688c4616 -//.word 0x5f42912f -//.word 0x657d3a66 -//.word 0x68c4bc1c -//.word 0xd2230261 -//.word 0x03d179b9 -//.word 0xfe106920 -//.word 0x6255854d -//.word 0x9da9c134 -//.word 0x5c4f63ce -//.word 0x45a75d1c -//.word 0xe952da6a -//.word 0xf49717d1 -//.word 0xa70574ff -//.word 0x895acb3b -//.word 0x59a400a3 -//.word 0x46a6d9b8 -//.word 0x637d101d -//.word 0x5584a79c -//.word 0x4e747c6a -//.word 0x40d01dac -//.word 0x4a80dd39 -//.word 0x77bb28a2 -//.word 0xa72b1370 -//.word 0xcd4c37ac -//.word 0x5b16c0a5 -//.word 0xfbdbc1ed -//.word 0x8072cba5 -//.word 0x1c95bdfa -//.word 0xd388ddf0 -//.word 0x2ffb285f -//.word 0x3632e73a -//.word 0x99638317 -//.word 0x2e609aec -//.word 0xa0755217 -//.word 0x6694eea2 -//.word 0xf1af9fc4 -//.word 0x2a669cab -//.word 0x1be27478 -//.word 0xec01a38c -//.word 0x12b36402 -//.word 0xc3a4c77c -//.word 0xad1b0323 -//.word 0xe7220de9 -//.word 0x28e76a12 -//.word 0x376241f2 -//.word 0xa238b4f8 -//.word 0xb3df70eb -//.word 0xa0038374 -//.word 0x02296fdd -//.word 0x88937c18 -//.word 0xed635203 -//.word 0x2703c6ea -//.word 0xe2c3f54d -//.word 0x2cc48fe4 -//.word 0x721676e1 -//.word 0xab1d8875 -//.word 0xd339b895 -//.word 0x9ba564fe -//.word 0x5fa0e377 -//.word 0x58cb5d56 -//.word 0x13d3df45 -//.word 0x214fae46 -//.word 0x11ecdcf5 -//.word 0x9bc71a0d -//.word 0x1e1acd2e -//.word 0x4d1b64de -//.word 0x2421e8cd -//.word 0x2209d45d -//.word 0xb2d82861 -//.word 0xeaa1b925 -//.word 0x77aacbb0 -//.word 0xd8cae145 -//.word 0xcb15d430 -//.word 0x05bc23bf -//.word 0x262e8a8e -//.word 0xec83d607 -//.word 0xa71bf72a -//.word 0xed82578a -//.word 0x8e976a98 -//.word 0xcaee8724 -//.word 0xc272f621 -//.word 0x2d4f4aa9 -//.word 0x4c0ff041 -//.word 0x2002095d -//.word 0xdae47527 -//.word 0x93ba307c -//.word 0x3dfde237 -//.word 0xdafab1b3 -//.word 0xec795a8b -//.word 0x2c9d80a4 -//.word 0x7e0b446e -//.word 0x254e1566 -//.word 0x337bc9e0 -//.word 0x4410ed03 -//.word 0x6c225a15 -//.word 0x6eb809f9 -//.word 0x2f7229f5 -//.word 0x6a6e6eb9 -//.word 0xa46bab9d -//.word 0x632fa32b -//.word 0x9b271ddd -//.word 0x694e3627 -//.word 0x034ffbb8 -//.word 0xf0ee37fe -//.word 0x74a48ae8 -//.word 0x4f89bbef -//.word 0xa7784f57 -//.word 0x426d5bb2 -//.word 0xf83196a7 -//.word 0x683ab2f1 -//.word 0xebccedaa -//.word 0xc665e3ca -//.word 0xa458a6eb -//.word 0x43b8104f -//.word 0x6d775823 -//.word 0x2acfe405 -//.word 0x34e15ec5 -//.word 0xab9d0a68 -//.word 0x0ae15773 -//.word 0x5ae5b466 -//.word 0xa5d6a486 -//.word 0xaec115df -//.word 0xdfb3ee8a -//.word 0x831fe72c -//.word 0x357f9dbf -//.word 0x983ee695 -//.word 0x49d66199 -//.word 0x123652d9 -//.word 0x6166ad41 -//.word 0xf86d71a9 -//.word 0xe5733713 -//.word 0xb5230b2d -//.word 0xe5537a1e -//.word 0x99e7ec7e -//.word 0x90f235a6 -//.word 0x581f662b -//.word 0xbe50e9a5 -//.word 0x8984cdb5 -//.word 0x68fe5e46 -//.word 0x28a4f912 -//.word 0x2aa51e68 -//.word 0x155ec72d -//.word 0xc87ff822 -//.word 0x93699864 -//.word 0xa6db7f39 -//.word 0xc9ced009 -//.word 0x4e9d89ab -//.word 0x446958e3 -//.word 0xeebcb128 -//.word 0x746c1daa -//.word 0xd7c3d593 -//.word 0x2adc8f8d -//.word 0x00509885 -//.word 0x211323af -//.word 0x8198e1cb -//.word 0x723cd1a6 -//.word 0x18e15ae3 -//.word 0x1dd997fb -//.word 0xa707f283 -//.word 0x8740f4ae -//.word 0xb4f75b12 -//.word 0xf71a6daf -//.word 0xe7378d2d -//.word 0x18e30c65 -//.word 0x905c4123 -//.word 0x7a6ddc2a -//.word 0x1f927779 -//.word 0x115d6ecd -//.word 0xa918f167 -//.word 0xb4ac570f -//.word 0x6ac2b559 -//.word 0xa027b027 -//.word 0x3e758f6f -//.word 0xf2f0953f -//.word 0x26ae8dfe -//.word 0x30fba6f4 -//.word 0xc9fb810d -//.word 0xc19189d9 -//.word 0xf18083d8 -//.word 0x70d065f5 -//.word 0x0a746c50 -//.word 0xed296940 -//.word 0xa6a15c99 -//.word 0x4ce1432a -//.word 0xfbe8348a -//.word 0x8491aa15 -//.word 0x63ba1d31 -//.word 0xf2a6d5d6 -//.word 0xdca0ff4d -//.word 0xd3e10137 -//.word 0x86b40bd2 -//.word 0xcdd8ee78 -//.word 0x27263268 -//.word 0x677362c9 -//.word 0xaab8abec -//.word 0x8c71a6d2 -//.word 0x9c4271ee -//.word 0x0de0042b -//.word 0xae2fc231 -//.word 0x1ca84fe4 -//.word 0x35fea22e -//.word 0xd1015bff -//.word 0xadc25692 -//.word 0xa8f880f1 -//.word 0x32a2e9bb -//.word 0x01ee1b25 -//.word 0x055aab3f -//.word 0x9f190d79 -//.word 0x0eb8ac65 -//.word 0x2a013abe -//.word 0x542045aa -//.word 0xad040c3c -//.word 0x8608903d -//.word 0x18d3ee2c -//.word 0x757ceb83 -//.word 0xbff2d13c -//.word 0x989c7a94 -//.word 0xd93caa0f -//.word 0x8719a2bc -//.word 0x035df1ba -//.word 0x80bc8efb -//.word 0xba562448 -//.word 0xe6dfad85 -//.word 0xe4fd4237 -//.word 0xbcf13143 -//.word 0x487a51f8 -//.word 0x2ef69250 -//.word 0x12cbd873 -//.word 0x09050a7d -//.word 0x50416581 -//.word 0x3ec917ce -//.word 0x77000971 -//.word 0x6301fcfb -//.word 0xde83d784 -//.word 0x31003fef -//.word 0x41166970 -//.word 0x072d2c4c -//.word 0x405a5be0 -//.word 0x668351e5 -//.word 0xdec4cdf2 -//.word 0x73120142 -//.word 0x031ee5b8 -//.word 0x787cd120 -//.word 0xfa054bb8 -//.word 0x647a1eef -//.word 0xf46aac6c -//.word 0x46558452 -//.word 0x831137c3 -//.word 0xd66d68a3 -//.word 0x1f15239e -//.word 0xecb5706c -//.word 0xa5612753 -//.word 0x063505ee -//.word 0xd238002e -//.word 0xc686d89e -//.word 0xccafefeb -//.word 0x725a5aa3 -//.word 0x9a2e383d -//.word 0x73f2425a -//.word 0xa8f2a44a -//.word 0xd7a50cd2 -//.word 0x448e002c -//.word 0xcf607450 -//.word 0x23659c72 -//.word 0x3120ffcc -//.word 0xdd32cd9d -//.word 0xf67a7272 -//.word 0x6c806ba4 -//.word 0xbd145822 -//.word 0xb1325370 -//.word 0x472981f0 -//.word 0xeffce661 -//.word 0xf9097ea5 -//.word 0x4ee889c7 -//.word 0x5e96263c -//.word 0x59d32369 -//.word 0xa2c81466 -//.word 0x81eda202 -//.word 0x182a2607 -//.word 0x983d77bf -//.word 0xb45bffb6 -//.word 0x561a15c2 -//.word 0x918e8741 -//.word 0xd8b275a2 -//.word 0x6d0a6627 -//.word 0x1b8795e8 -//.word 0x28ab8c1c -//.word 0x86edf494 -//.word 0x495fac88 -//.word 0x5e8e1896 -//.word 0x79aabc08 -//.word 0x4fe70956 -//.word 0x062276eb -//.word 0xe9c8d32c -//.word 0x61f4dab7 -//.word 0x20d708e8 -//.word 0xa05daba2 -//.word 0xcc0d3b4c -//.word 0xfd32ed19 -//.word 0x2738868d -//.word 0x55586d3d -//.word 0x527805d6 -//.word 0xa94c3960 -//.word 0xd0c259c4 -//.word 0xa19d248c -//.word 0x095f26eb -//.word 0x046d44fd -//.word 0xc96e954f -//.word 0x41f473a2 -//.word 0xbe5ed2ec -//.word 0xeafdd1a0 -//.word 0xfe758f2f -//.word 0x346640cf -//.word 0x7e4c807b -//.word 0x78a4e63b -//.word 0x9b51dda5 -//.word 0xb43dafa4 -//.word 0x9543e378 -//.word 0x0b4dc9fe -//.word 0x10b95332 -//.word 0x410226f2 -//.word 0x929cf105 -//.word 0x401ffe5b -//.word 0x07a80796 -//.word 0x967c4aca -//.word 0x40efdf81 -//.word 0xf4854a03 -//.word 0x6f564dd4 -//.word 0xb0b7007d -//.word 0xac16238f -//.word 0x4426b2e6 -//.word 0x743dba2b -//.word 0xcdfa6c9c -//.word 0x252a6f10 -//.word 0x8dec7b35 -//.word 0x8314241d -//.word 0x69cef3f9 -//.word 0x3684bb24 -//.word 0x6c012a63 -//.word 0x4ad69f6b -//.word 0x42fc3ba3 -//.word 0xadbc3b2c -//.word 0xbecc851f -//.word 0xb4bb8015 -//.word 0x548e29ed -//.word 0x97ac64c9 -//.word 0xa0f78f5a -//.word 0xf03c5d5e -//.word 0xddcde266 -//.word 0x406ceadd -//.word 0x6f6b8f46 -//.word 0x6b120bc5 -//.word 0x5a41cae1 -//.word 0x3756c488 -//.word 0xc8510953 -//.word 0xd0379d0c -//.word 0x87b4876e -//.word 0x4703252b -//.word 0x8813c234 -//.word 0x0ee26a34 -//.word 0x612dfd5d -//.word 0x7e4c8368 -//.word 0xcc58bfd7 -//.word 0x518e077e -//.word 0x26f85341 -//.word 0x284a931f -//.word 0xf10a4670 -//.word 0x07f3486a -//.word 0x529cebea -//.word 0xd4554a72 -//.word 0x9451da6d -//.word 0xdb0b42bb -//.word 0xa3e26d69 -//.word 0x4d06ddc0 -//.word 0x92984282 -//.word 0xbc0d4b70 -//.word 0x16d4bc0f -//.word 0xa138c1ac -//.word 0x0887819e -//.word 0xd674f7cb -//.word 0xe7bafd6e -//.word 0x1c02aa17 -//.word 0x5307def3 -//.word 0x97f81b4d -//.word 0x931e9755 -//.word 0x4dbe8f20 -//.word 0x1141ddf1 -//.word 0xaa92cdb7 -//.word 0xd9c82dd6 -//.word 0xff05a32a -//.word 0x1d9d4449 -//.word 0xfe7b6109 -//.word 0xb3c1a443 -//.word 0x40af5cd6 -//.word 0x95c616ee -//.word 0xc02d6d86 -//.word 0x6053232b -//.word 0x5dd67003 -//.word 0xd6a4990f -//.word 0x5b60c5ad -//.word 0x5d070d61 -//.word 0xe2d3d2d4 -//.word 0x7d5f531d -//.word 0x7e0d7e40 -//.word 0x66a507f4 -//.word 0x9e3eb8aa -//.word 0x686208ca -//.word 0x156dee40 -//.word 0x7936f737 -//.word 0x9cf19724 -//.word 0xb254bc07 -//.word 0x4df9a9ee -//.word 0xd20402ba -//.word 0x29052325 -//.word 0xb920b604 -//.word 0x946b85ca -//.word 0xee978c4e -//.word 0xd4d353ce -//.word 0x1bed7b33 -//.word 0x96ba9696 -//.word 0x8cb93c04 -//.word 0x68f35b7e -//.word 0xb325ce44 -//.word 0x40213154 -//.word 0xa672f42d -//.word 0xf33fafd8 -//.word 0x9f72b529 -//.word 0xbf18ec43 -//.word 0x7b0bdc5a -//.word 0xc2cf05bd -//.word 0x3dbb7613 -//.word 0x81599be4 -//.word 0x880f575c -//.word 0x62fe524c -//.word 0x282a9572 -//.word 0x32db54fa -//.word 0x89440a44 -//.word 0x9f63cce8 -//.word 0x3e28d6f8 -//.word 0xbfd96b85 -//.word 0x7cb5dc64 -//.word 0x88d8e631 -//.word 0x9d5e4095 -//.word 0x55cb75c5 -//.word 0x9dabf04b -//.word 0x67755509 -//.word 0xa0b5187b -//.word 0x626a483c -//.word 0x6aadabcc -//.word 0xcc941090 -//.word 0xe556e11a -//.word 0x92b0f8ab -//.word 0x9f87b3f6 -//.word 0x83ce4b27 -//.word 0x4aaa6124 -//.word 0xd2d4da13 -//.word 0x3a40ed1c -//.word 0x98fc7a70 -//.word 0xea5a9e8a -//.word 0x505184b5 -//.word 0x78217ece -//.word 0x5936544b -//.word 0x244fdc7c -//.word 0x77dfca11 -//.word 0xd4b3cadd -//.word 0x53d6ccd9 -//.word 0x93b29f6c -//.word 0xf677c2e9 -//.word 0x0ec1775a -//.word 0x5275187c -//.word 0x16ebae0a -//.word 0xba53c03e -//.word 0x21516996 -//.word 0x64ebadd4 -//.word 0xc8a50d48 -//.word 0xeeea5951 -//.word 0x4aaec622 -//.word 0xd65241c2 -//.word 0x08c80256 -//.word 0x01f763a3 -//.word 0x0761f3cf -//.word 0x3503c667 -//.word 0x717c10a7 -//.word 0x9f72f2f5 -//.word 0x143294ae -//.word 0x4e967425 -//.word 0xe22cfee9 -//.word 0xb5945c47 -//.word 0x6f2a8f10 -//.word 0x2de6bf9d -//.word 0x7780cf0f -//.word 0x71d735db -//.word 0x55930987 -//.word 0x20095bae -//.word 0x8c60ca4a -//.word 0x3ff25233 -//.word 0x42f566e2 -//.word 0xb45b3f7b -//.word 0xc0f6730b -//.word 0xcce0c90d -//.word 0xf31a4c34 -//.word 0xb6739e64 -//.word 0xeeac8f01 -//.word 0x05d9ee6d -//.word 0x660aa0cc -//.word 0x322bee0b -//.word 0x35292320 -//.word 0x18575793 -//.word 0xd80f863d -//.word 0x779ce550 -//.word 0xf1577597 -//.word 0x7111d8ff -//.word 0xc5b16457 -//.word 0x0f1e7654 -//.word 0xbe6008d8 -//.word 0xbd028673 -//.word 0xeabade2b -//.word 0xca4cd778 -//.word 0x7baba393 -//.word 0xea61b7f0 -//.word 0x4632da09 -//.word 0xb4fc7c5e -//.word 0x44e24aba -//.word 0x23a9ffb7 -//.word 0x13627d84 -//.word 0x194a1ce6 -//.word 0x75ee427d -//.word 0xd7933449 -//.word 0xd0d42b6d -//.word 0x878dab32 -//.word 0xadf8104e -//.word 0xb3166a67 -//.word 0x3a518ad3 -//.word 0xcb5f5da2 -//.word 0xc86979de -//.word 0xa26df611 -//.word 0x4de17f08 -//.word 0xf199a8d7 -//.word 0xe3ea821d -//.word 0xd3106e89 -//.word 0x47cd2e9d -//.word 0x485342b2 -//.word 0x5a64713d -//.word 0xb2b8a650 -//.word 0xa49ffd64 -//.word 0x5be71e55 -//.word 0xcc00caae -//.word 0xec5eb327 -//.word 0x211f916c -//.word 0xf7ee7220 -//.word 0x15275122 -//.word 0x6f3beb0f -//.word 0xbd57ce08 -//.word 0x2b40b3b5 -//.word 0x52820d89 -//.word 0x67c9e248 -//.word 0xb28fdac7 -//.word 0x42f796f4 -//.word 0xe0f94215 -//.word 0x41c06e55 -//.word 0x8050197c -//.word 0xcb6c0ffe -//.word 0x5cb77637 -//.word 0xaa19a3f5 -//.word 0xe1643237 -//.word 0x90385534 -//.word 0xa2246c9f -//.word 0x900dd62a -//.word 0xd5d40749 -//.word 0xa133db38 -//.word 0xd1e82a3f -//.word 0x1f169d35 -//.word 0x96e8c043 -//.word 0x4a7758ea -//.word 0x45eef647 -//.word 0xc4eccc96 -//.word 0xa429c0f6 -//.word 0x175dbf6b -//.word 0x9b5d5429 -//.word 0x2d877910 -//.word 0xb961ad73 -//.word 0xd67d461d -//.word 0xb0a00996 -//.word 0x4522f8a2 -//.word 0xd5986b0b -//.word 0x93b162a0 -//.word 0xa15e1a7e -//.word 0x3b36de8e -//.word 0x3318204f -//.word 0x9d12c8d6 -//.word 0xcb81cc13 -//.word 0x7c7a0155 -//.word 0x50693110 -//.word 0x7ff86ddf -//.word 0xcb33a4c5 -//.word 0xb3e975b8 -//.word 0xea554260 -//.word 0x07fd861c -//.word 0x7edb6846 -//.word 0xcfbb90b8 -//.word 0xfde4398e -//.word 0x42fa872e -//.word 0x01231b86 -//.word 0xfc69e695 -//.word 0xc7603a2d -//.word 0x7d0827f7 -//.word 0xb1f404b7 -//.word 0xa7ac4cd1 -//.word 0xc451ac0d -//.word 0x447f5997 -//.word 0x2b77a74a -//.word 0x7e7ed82d -//.word 0xb280313e -//.word 0x65f9546f -//.word 0x4c16c9ef -//.word 0x6d17deaa -//.word 0x8ef7b113 -//.word 0xed4f8b21 -//.word 0x31786f97 -//.word 0xa1eff389 -//.word 0x94fe4f1c -//.word 0x2899b48d -//.word 0x3787df75 -//.word 0x87c2ed4b -//.word 0x411f712a -//.word 0xa531c4d4 -//.word 0xfb6b9cf8 -//.word 0xcd86e0b0 -//.word 0x5322bb4e -//.word 0x2fb0f058 -//.word 0x5b8f6dd1 -//.word 0x5f7522ba -//.word 0xc71113d9 -//.word 0xd4efacb9 -//.word 0x729b55f2 -//.word 0x6a0947aa -//.word 0xd9349e5c -//.word 0xe106afd9 -//.word 0x9e789b8c -//.word 0x5bfa2501 -//.word 0x0615c0a9 -//.word 0xe24fecd7 -//.word 0x7c4fc30f -//.word 0xe041cf80 -//.word 0x0c7c1fcf -//.word 0xa5629a16 -//.word 0xe988932d -//.word 0xe5189d28 -//.word 0xe873a020 -//.word 0x371a2c37 -//.word 0x02ce0ed6 -//.word 0x97f62139 -//.word 0xd642672e -//.word 0xe58e5819 -//.word 0x25097a3c -//.word 0x64963235 -//.word 0x5472dac8 -//.word 0x3b1713df -//.word 0xed615dcf -//.word 0xf8f0e5dd -//.word 0x1ecd9d01 -//.word 0x085092ea -//.word 0x38417b41 -//.word 0x403d8d32 -//.word 0x315b9729 -//.word 0x57104ad9 -//.word 0x2350d883 -//.word 0x69f6c275 -//.word 0xcc66ead1 -//.word 0x7671f08f -//.word 0x0c79bbc5 -//.word 0xe0d55626 -//.word 0x6976fec9 -//.word 0xf1cb792d -//.word 0x8ee3a979 -//.word 0x53d26008 -//.word 0xc7557624 -//.word 0x96b91912 -//.word 0x87f86550 -//.word 0xae26341a -//.word 0xe30b3832 -//.word 0x731247e1 -//.word 0x1562f539 -//.word 0x1f4a689e -//.word 0xf9e26885 -//.word 0xd2efb67a -//.word 0x93089f68 -//.word 0x11f7d015 -//.word 0x87626cec -//.word 0x43ab5cff -//.word 0x9f14e74c -//.word 0x3327823f -//.word 0x4955e979 -//.word 0x91dd6ed0 -//.word 0x17ef9197 -//.word 0x7111d21f -//.word 0x3dc3c37d -//.word 0xcb5e618e -//.word 0x1642a439 -//.word 0xf93055f4 -//.word 0x9ff5208a -//.word 0x3c49ea1b -//.word 0xfaf66564 -//.word 0x373de140 -//.word 0xed75656f -//.word 0x71f5fe97 -//.word 0x61345788 -//.word 0xd72f8ac4 -//.word 0xe30b363f -//.word 0x39fcd263 -//.word 0x26654057 -//.word 0xc941a581 -//.word 0x7fc1794a -//.word 0x9f36da21 -//.word 0x683226c2 -//.word 0x37eac8b8 -//.word 0xfddf5220 -//.word 0xf1becdb1 -//.word 0x82844cf9 -//.word 0x90e5c8e9 -//.word 0xdbef2794 -//.word 0xbceb9e34 -//.word 0x1384396e -//.word 0x802bb8d7 -//.word 0xd6b99db6 -//.word 0xcc56830c -//.word 0xf69ab1d1 -//.word 0xf4f3ef81 -//.word 0xea4799d7 -//.word 0x30daf1d8 -//.word 0x4a71b914 -//.word 0x1ab80229 -//.word 0x54e13f88 -//.word 0x338e9d7c -//.word 0x6af19768 -//.word 0x5e31c450 -//.word 0x9210f49a -//.word 0x62cc7c16 -//.word 0xf542ce3d -//.word 0x6d594db6 -//.word 0x609e5f1f -//.word 0x8c2cc309 -//.word 0xc6cf2544 -//.word 0x3469ef5e -//.word 0xbc946366 -//.word 0xbc88e7f5 -//.word 0xfc409f70 -//.word 0xe1d84187 -//.word 0xe33a2501 -//.word 0x40f99cbc -//.word 0xf27d83ef -//.word 0xdf6118b3 -//.word 0x51190cc2 -//.word 0xa5d8d97e -//.word 0x47b05535 -//.word 0xdefc87a3 -//.word 0xc3fbbab8 -//.word 0xb8bdd19c -//.word 0xd743daf1 -//.word 0xc8e2e658 -//.word 0x37e81736 -//.word 0x8582fab8 -//.word 0xbedd1714 -//.word 0xcc8cc712 -//.word 0xea2a46cc -//.word 0x5b4009b1 -//.word 0x5b6852d0 -//.word 0x56b30154 -//.word 0x5849ad4a -//.word 0xc54ff3ab -//.word 0x4a0e0e96 -//.word 0x1351a8dd -//.word 0x3e0ef0c3 -//.word 0x9049ed04 -//.word 0x67361216 -//.word 0xf09e12af -//.word 0x9a83f687 -//.word 0xcb076c5f -//.word 0xd18a6242 -//.word 0x1b13d30b -//.word 0xa9f1e127 -//.word 0xc1a2259c -//.word 0xe4f3434a -//.word 0x0069c171 -//.word 0xe7e01974 -//.word 0x00720cdd -//.word 0x3c9a3aa0 -//.word 0x4c99f0a4 -//.word 0x1219417f -//.word 0x55115882 -//.word 0xb8e80cf5 -//.word 0xedddb5a3 -//.word 0x26a63e9a -//.word 0xcc577c2c -//.word 0x7486be39 -//.word 0x0fada6b1 -//.word 0x60cf3754 -//.word 0xb45f2ebc -//.word 0xcd5d969e -//.word 0x1fc2974d -//.word 0x3f1e8f7f -//.word 0x98806454 -//.word 0x60961894 -//.word 0xca159d38 -//.word 0x7d5beb2d -//.word 0x46545154 -//.word 0x099a08cd -//.word 0xfee00e75 -//.word 0x199031ad -//.word 0xcab36a5e -//.word 0xe7126d3a -//.word 0xe79a7e44 -//.word 0x50058692 -//.word 0x72b76651 -//.word 0x56e68b0b -//.word 0xf2fec325 -//.word 0x9e444fac -//.word 0xccb93951 -//.word 0xf341e8b1 -//.word 0xcc04f1da -//.word 0xc115300b -//.word 0xa35218bc -//.word 0x9b8b47de -//.word 0x63e65d64 -//.word 0xb5810f02 -//.word 0x045a7735 -//.word 0x6b6cae83 -//.word 0xe31b9d04 -//.word 0xb8d21021 -//.word 0x3eeb0c9c -//.word 0xc0cf63d1 -//.word 0xb95e853b -//.word 0x46919939 -//.word 0xdc5dcd12 -//.word 0x36dbea37 -//.word 0x92a72bc9 -//.word 0x1d864f5b -//.word 0xac4bedf9 -//.word 0xacfb0869 -//.word 0x5c2fe3b0 -//.word 0x3aba16d9 -//.word 0xba8ce2f1 -//.word 0x3ed6c256 -//.word 0x436f4232 -//.word 0xd8771442 -//.word 0x553a61dc -//.word 0x49565d30 -//.word 0xb4211ece -//.word 0x7745ae68 -//.word 0x08ad5fd9 -//.word 0x6aa55e67 -//.word 0x5d3c8b45 -//.word 0xd2ed885c -//.word 0xa17f104c -//.word 0x7e2a8bad -//.word 0x2afbdf9a -//.word 0xe67a8870 -//.word 0x2d89ebd3 -//.word 0xa28fe7f2 -//.word 0x48d6ae0c -//.word 0xf132d334 -//.word 0xf9e4a451 -//.word 0x33bdb968 -//.word 0x2487cd1e -//.word 0x6fa0cd78 -//.word 0x91e82fe6 -//.word 0xcedd8580 -//.word 0x6b05528f -//.word 0x1e8d1c4f -//.word 0xc32fc2f3 -//.word 0x505910ea -//.word 0x0b8b9161 -//.word 0xfb00a409 -//.word 0x9c92d21a -//.word 0xd7d85f98 -//.word 0x30911fd5 -//.word 0x42458b37 -//.word 0x6829143b -//.word 0xbe44b8ba -//.word 0x48d0d26b -//.word 0x70e336aa -//.word 0xb64e7d77 -//.word 0xa3c59ec2 -//.word 0xfe41bfe6 -//.word 0x43a34a73 -//.word 0x519a4230 -//.word 0x63c6d860 -//.word 0x411e3945 -//.word 0xb88fabe3 -//.word 0x47e5d806 -//.word 0x1bef6986 -//.word 0x3eded7ca -//.word 0x0bef7e8b -//.word 0xe54af4da -//.word 0x28299865 -//.word 0x603c6ef6 -//.word 0xb94d2a3c -//.word 0xb7208ace -//.word 0x279de96d -//.word 0x56301289 -//.word 0x80715207 -//.word 0x8b00d142 -//.word 0xf5b32150 -//.word 0x0cf41886 -//.word 0x5d64db3e -//.word 0x6ec53cd7 -//.word 0xb01646fe -//.word 0xafff152c -//.word 0x8c70ec70 -//.word 0xad86816f -//.word 0xb3ae9ba9 -//.word 0xac0cdffe -//.word 0x8a1ee770 -//.word 0xd59c952a -//.word 0x9ca3a7c2 -//.word 0xb1138bbb -//.word 0x1636744e -//.word 0xb2a2ad69 -//.word 0x48602ef9 -//.word 0xaa4d6d65 -//.word 0x2ac1765a -//.word 0x526f3ece -//.word 0xd58c343f -//.word 0xc4341a3c -//.word 0x05091327 -//.word 0x021dfd39 -//.word 0x9e1200c6 -//.word 0x6d7f67c3 -//.word 0x2496af85 -//.word 0x4e04decb -//.word 0x411917ff -//.word 0x51296ab9 -//.word 0x4332f085 -//.word 0x05be18e6 -//.word 0x9c0b3c9b -//.word 0x5d6a7820 -//.word 0x60e5bb78 -//.word 0x32241e2a -//.word 0xca92758a -//.word 0xbebb2439 -//.word 0xb7f835ef -//.word 0x234fa778 -//.word 0x299508fd -//.word 0xe2d54685 -//.word 0xc6f6c2bb -//.word 0x6497a6f2 -//.word 0x573e7966 -//.word 0x75b2f0c5 -//.word 0x49a507ee -//.word 0xc49651f8 -//.word 0x2ff68c76 -//.word 0x648a79f9 -//.word 0x3e10ebd7 -//.word 0x4e251d2b -//.word 0xcf66481d -//.word 0xdcd67564 -//.word 0xe1809009 -//.word 0x505dbf6d -//.word 0x9577f28d -//.word 0x4b4fba85 -//.word 0xb07c5e53 -//.word 0x56962cde -//.word 0x1c520d37 -//.word 0x5dee5c1e -//.word 0x67d0f8c8 -//.word 0x2f6a98df -//.word 0x43605fcb -//.word 0xffedb130 -//.word 0x048344b7 -//.word 0xe6b17a12 -//.word 0x254aee3a -//.word 0x5fc44cfb -//.word 0xc3de67b3 -//.word 0xc9858557 -//.word 0x20f9fdb6 -//.word 0xe82c0502 -//.word 0x226bc58c -//.word 0x653fb0cf -//.word 0xd29613b0 -//.word 0x4a1eee04 -//.word 0xdef20453 -//.word 0x86782edb -//.word 0x1689f4d8 -//.word 0x6fd35e03 -//.word 0xf27c0859 -//.word 0x3b08751d -//.word 0x0b7da520 -//.word 0x85c5ea40 -//.word 0x9e53f72f -//.word 0xcf0a3a76 -//.word 0x0c5a6cb9 -//.word 0xfaac663c -//.word 0x5d0036a6 -//.word 0xcfd47205 -//.word 0xb848cc13 -//.word 0x7a81e7b8 -//.word 0xec4b69cf -//.word 0x0a02522d -//.word 0xebb28cdf -//.word 0xf37dc2b4 -//.word 0x493d76fc -//.word 0x8b6b4e8e -//.word 0xc140af10 -//.word 0x90198d72 -//.word 0xb12082bc -//.word 0xa1291d0a -//.word 0x99da7cd4 -//.word 0xc00f1d73 -//.word 0xa07cf1e1 -//.word 0xd695b2c1 -//.word 0x0eaa779f -//.word 0x2f578678 -//.word 0xd31b697d -//.word 0xfa474414 -//.word 0xff1a6520 -//.word 0xcb2a1d82 -//.word 0x4805cee0 -//.word 0x181946a4 -//.word 0x88d14b48 -//.word 0xbf0177d2 -//.word 0x3c84479a -//.word 0x7f246e53 -//.word 0x05b96f49 -//.word 0x7a956ae8 -//.word 0x2b20367e -//.word 0xbac0b142 -//.word 0x15fc5494 -//.word 0xa8e00b86 -//.word 0xd2a3439c -//.word 0x968744d0 -//.word 0x9401c1d9 -//.word 0x371aadad -//.word 0x2f155145 -//.word 0x22529ca0 -//.word 0x9e72ba0a -//.word 0x53bce89e -//.word 0x7fbf860a -//.word 0xa9396d92 -//.word 0x92388458 -//.word 0x697f8eda -//.word 0x3e2b46bc -//.word 0xb997aec8 -//.word 0x0c7ca433 -//.word 0x265db621 -//.word 0x2922376c -//.word 0x1f0392a1 -//.word 0xe9a7df4c -//.word 0x778db476 -//.word 0x3fac3e6b -//.word 0xe75690c1 -//.word 0x45623a95 -//.word 0x8a8a1e18 -//.word 0xba127f4b -//.word 0x60ab5b06 -//.word 0x7f96fb3f -//.word 0xcb0cc889 -//.word 0x19de60db -//.word 0x1559e993 -//.word 0x336ca6ba -//.word 0xe80dc78a -//.word 0x19d8862d -//.word 0xd4f96fc8 -//.word 0x3e4dffb8 -//.word 0xccc4711c -//.word 0xb60ad593 -//.word 0xa9666247 -//.word 0xbde20d2a -//.word 0xa6ac5b7f -//.word 0x2ebc739d -//.word 0xe3b777ef -//.word 0x0c131440 -//.word 0xe27d5835 -//.word 0xfd77c41b -//.word 0x0d46a3e3 -//.word 0xca0b9a6b -//.word 0x2e307f00 -//.word 0xe1056e20 -//.word 0xf5ab1a84 -//.word 0xd332625e -//.word 0x75fe25df -//.word 0xd66f56fc -//.word 0xa7c15372 -//.word 0x44307207 -//.word 0xe660dd13 -//.word 0x1afda140 -//.word 0x729e018e -//.word 0x7af0109a -//.word 0xed107f1f -//.word 0x2938b3bd -//.word 0xe19e1af9 -//.word 0x1299c086 -//.word 0x38061dc3 -//.word 0xc1ea3284 -//.word 0xc259d415 -//.word 0xe996477c -//.word 0xb37b0eff -//.word 0xde1b02e6 -//.word 0x22a7a282 -//.word 0x1c8eaa6e -//.word 0x8be8e715 -//.word 0xbe154974 -//.word 0x4da13a22 -//.word 0x086b2e8d -//.word 0x2d077b86 -//.word 0xde606c00 -//.word 0xd1a29014 -//.word 0x4a575849 -//.word 0x46d0e113 -//.word 0xf9c60f99 -//.word 0x7b41dbbb -//.word 0xbfb9ee54 -//.word 0xc47b6ebc -//.word 0x0f4f1892 -//.word 0x58588fb8 -//.word 0x843bf39e -//.word 0xd384b6c4 -//.word 0x5b45ab7a -//.word 0xb5ff60eb -//.word 0xf6c6ae59 -//.word 0xe0a18eaa -//.word 0x5a302e24 -//.word 0x1e914575 -//.word 0xb283a3f6 -//.word 0x99cc0c30 -//.word 0xcad946a0 -//.word 0x61a571b7 -//.word 0x95dc9725 -//.word 0xea3f8457 -//.word 0xa74ad83e -//.word 0x8b145a53 -//.word 0xbc788fd8 -//.word 0x00728c60 -//.word 0x2fcb0891 -//.word 0xe9f9b529 -//.word 0x8441d13f -//.word 0x481ef7cc -//.word 0xdfe63c69 -//.word 0x07ab775a -//.word 0x8a5fe0cc -//.word 0x703cdd5b -//.word 0x736318d7 -//.word 0xb3c4d548 -//.word 0xab3d832f -//.word 0x6406900f -//.word 0xe84c822c -//.word 0xfa1c4493 -//.word 0x0483bd5a -//.word 0x51f4a729 -//.word 0x7ce99ffa -//.word 0x29cd781c -//.word 0xf21ad57e -//.word 0xa5bff72a -//.word 0xacc4d310 -//.word 0xcc306805 -//.word 0x132b4f0b -//.word 0x0b6094d3 -//.word 0x34a5c480 -//.word 0xb1de47ae -//.word 0x421ef0b3 -//.word 0x7210d324 -//.word 0x1296579c -//.word 0xe5af8cb8 -//.word 0x9d9ebe66 -//.word 0x06494a60 -//.word 0x82dfb0f3 -//.word 0xb5bdea05 -//.word 0x8193fc56 -//.word 0x35c2cd06 -//.word 0x01093558 -//.word 0xae6157b5 -//.word 0x8b2531f4 -//.word 0xab7671d8 -//.word 0x4dde8ada -//.word 0x9c330829 -//.word 0x99bf20f0 -//.word 0x559d8cd7 -//.word 0x636696cc -//.word 0x8d0e7203 -//.word 0xc608d03b -//.word 0x60b1b244 -//.word 0x7feb7bbe -//.word 0xce084923 -//.word 0x70eb8508 -//.word 0x3a69b99f -//.word 0x1ff5a181 -//.word 0xeb7d84aa -//.word 0x358fc4c5 -//.word 0x8ec0b5ab -//.word 0xff4eab26 -//.word 0xb30457fa -//.word 0xf05e5326 -//.word 0x4ceefb67 -//.word 0x1dfe7ffe -//.word 0x317736b3 -//.word 0xbf02351a -//.word 0x9e6c2115 -//.word 0xb54f419a -//.word 0xb3efd7b6 -//.word 0x0062b1d2 -//.word 0xf3f4fb36 -//.word 0x45c957cb -//.word 0xc5c43025 -//.word 0x4ea84ac0 -//.word 0xf67d9e8a -//.word 0x893666a2 -//.word 0x36907460 -//.word 0x873dc795 -//.word 0x97426014 -//.word 0x7f9e5271 -//.word 0x112c1908 -//.word 0xc9ca2c41 -//.word 0x00bbd613 -//.word 0x634a41c7 -//.word 0xa4b0d4ff -//.word 0x6f38bef6 -//.word 0xa0a1d309 -//.word 0xb3c49877 -//.word 0x7b779965 -//.word 0x17b00325 -//.word 0x23ee6eb7 -//.word 0x2bd4fb90 -//.word 0x65179f9b -//.word 0x9f9bbe7e -//.word 0x76d9fc1e -//.word 0xc9845065 -//.word 0x6d6c5a43 -//.word 0x22a2f6f2 -//.word 0xc6dd117f -//.word 0xc91cbb86 -//.word 0xe18d7e3d -//.word 0xffaeeeb3 -//.word 0x81b2825a -//.word 0xa926a2c4 -//.word 0x4ed401aa -//.word 0xd1e82d32 -//.word 0x53516571 -//.word 0x256aaa2f -//.word 0x80da18eb -//.word 0x77b9771f -//.word 0x29f40ec6 -//.word 0x3bf2b71a -//.word 0x867739a2 -//.word 0x0cc9d16c -//.word 0x31121298 -//.word 0x2806f016 -//.word 0xabc517af -//.word 0xef03814a -//.word 0xd7664768 -//.word 0x682fb7f2 -//.word 0x7d1da834 -//.word 0xbb8e0a29 -//.word 0xc8e8c1f9 -//.word 0xb837b4c0 -//.word 0xc8182091 -//.word 0x4fd533bb -//.word 0xf1d1d64a -//.word 0x1627cad1 -//.word 0x9a8ef667 -//.word 0xc780fff0 -//.word 0x809b1a9e -//.word 0xbe471eb7 -//.word 0x4199de98 -//.word 0x7f77b5fa -//.word 0xe1fd6274 -//.word 0x2e201641 -//.word 0x4791cc44 -//.word 0x16e4d949 -//.word 0xc1f2c48e -//.word 0x237c5782 -//.word 0x7c11f6cc -//.word 0x6731308f -//.word 0x0db294ec -//.word 0x9963c6c9 -//.word 0xecf0d2d1 -//.word 0x9105bfbc -//.word 0xf3b668d1 -//.word 0xcd1f87a9 -//.word 0xe3471335 -//.word 0xf04bcc03 -//.word 0xdfb814bc -//.word 0x3d3800f2 -//.word 0xef71af18 -//.word 0x202adad2 -//.word 0x7eafad70 -//.word 0xa677d5b4 -//.word 0xdc05dbdc -//.word 0x000cb0dc -//.word 0xbdd689ec -//.word 0x04e6ec42 -//.word 0xb9dd0b21 -//.word 0xac9a5212 -//.word 0xcaa53c72 -//.word 0x95ce6a2c -//.word 0xd111f6c8 -//.word 0x80bd05a5 -//.word 0x11d69b82 -//.word 0xd5b7b443 -//.word 0xb2fb90f2 -//.word 0x1b9e4e05 -//.word 0x3f60bcdf -//.word 0x816a6e99 -//.word 0x29340d01 -//.word 0x59a6f2e3 -//.word 0x427ef388 -//.word 0x97f17d7d -//.word 0x4295e495 -//.word 0x577ef631 -//.word 0x46a7d6bf -//.word 0x54940881 -//.word 0x4c36c890 -//.word 0x710fa020 -//.word 0xb8973905 -//.word 0x34dd7277 -//.word 0xd271af12 -//.word 0x46827320 -//.word 0x4544321b -//.word 0xf594606e -//.word 0xa2dfce7c -//.word 0xb24036e3 -//.word 0xdbe81502 -//.word 0x93c3b8b9 -//.word 0xc8599a6f -//.word 0xd2f2ed5a -//.word 0xa6fd77fa -//.word 0x4cb29fe7 -//.word 0x93f7c8cd -//.word 0x0380ddb5 -//.word 0x133b2d86 -//.word 0x9ceb7acb -//.word 0x8e124cb6 -//.word 0xe2158b65 -//.word 0xcf9b4d65 -//.word 0x4136ed75 -//.word 0x87455d8c -//.word 0x4b19bd1d -//.word 0xc8562c99 -//.word 0x379cde36 -//.word 0x8a676eef -//.word 0x5d3476cb -//.word 0x2ae65e63 -//.word 0xbc67719e -//.word 0xe69236c0 -//.word 0x7451fda3 -//.word 0x6202b843 -//.word 0x4c200c81 -//.word 0x261fa820 -//.word 0x2d97d614 -//.word 0x1da54ffc -//.word 0xa58f54ed -//.word 0x18a6fa71 -//.word 0x6571c6cf -//.word 0x4907798d -//.word 0xc3bd2d34 -//.word 0xc901a153 -//.word 0x3986d2c6 -//.word 0x12a2cb38 -//.word 0xe4f4bde7 -//.word 0x854952a7 -//.word 0x06c03f2a -//.word 0xe52d197e -//.word 0x84bc69d7 -//.word 0xdad7028f -//.word 0x6949926b -//.word 0x70a37820 -//.word 0x61ded516 -//.word 0x9543e66b -//.word 0x3f88913b -//.word 0x9f3c3d1f -//.word 0x7865e7f3 -//.word 0xc36772dd -//.word 0xa5273f8a -//.word 0x9f71febb -//.word 0x0597c401 -//.word 0xb15b5dc4 -//.word 0xf80fe38a -//.word 0xddfb8f76 -//.word 0x85ffd00f -//.word 0xeb7a9a44 -//.word 0xd56a01ac -//.word 0x07d40612 -//.word 0xb666b130 -//.word 0x3f5b60bb -//.word 0x199f5ea0 -//.word 0x0833b78e -//.word 0x94d44bb4 -//.word 0xbad722cc -//.word 0xe158ff58 -//.word 0x1093382b -//.word 0x5d92c42c -//.word 0xa9099657 -//.word 0x8a7e2904 -//.word 0x89ac5d6c -//.word 0x8e2a8169 -//.word 0x9848b17d -//.word 0xb13a6216 -//.word 0x22783b10 -//.word 0xe364277c -//.word 0x552da8a0 -//.word 0x33f46e3e -//.word 0xc62e281a -//.word 0x594a9ab6 -//.word 0xed93ef60 -//.word 0x2e57516e -//.word 0xa549b8c9 -//.word 0x2e24ffa8 -//.word 0xad913d9e -//.word 0xfd4b52d7 -//.word 0x2981c09f -//.word 0xdf7cbd23 -//.word 0x2181867c -//.word 0x3ef9f5e9 -//.word 0x01cf565c -//.word 0x281a7739 -//.word 0x17fcfe5a -//.word 0xcec9ff56 -//.word 0x196cce03 -//.word 0x06071239 -//.word 0x9cda1bd9 -//.word 0xca66760e -//.word 0x9ed2bed3 -//.word 0xb88db4b6 -//.word 0xfd3592db -//.word 0x90b89d43 -//.word 0xfeb9fa4e -//.word 0xb835c27f -//.word 0xc7665980 -//.word 0xbbe7fb66 -//.word 0xe41a9735 -//.word 0xc5c7e1a7 -//.word 0xc605a329 -//.word 0x295e5327 -//.word 0x3f2eeb89 -//.word 0xdc4cf57e -//.word 0x08ece578 -//.word 0xf7c4ac78 -//.word 0x3c6e8a8b -//.word 0x390e2494 -//.word 0xda34d64d -//.word 0x83044a89 -//.word 0x46944abc -//.word 0x5a95d2bc -//.word 0xc8366ac9 -//.word 0x6845b2cc -//.word 0x0c973fdc -//.word 0xfbaba506 -//.word 0xa18ad54e -//.word 0x84f1aaf1 -//.word 0x7ab2beed -//.word 0x1a5882c3 -//.word 0x700a8e7c -//.word 0xf5b235ea -//.word 0xbd5e5d30 -//.word 0xf3e68d85 -//.word 0x83cf4834 -//.word 0x166f9ae7 -//.word 0x4352f026 -//.word 0x03dd2d1b -//.word 0x6631f998 -//.word 0x85525c5b -//.word 0xb8898d90 -//.word 0x09060497 -//.word 0xe8cad608 -//.word 0x20c442f4 -//.word 0x093a876e -//.word 0xff6bf94a -//.word 0x14735425 -//.word 0x026e50a6 -//.word 0x64e07602 -//.word 0x255531c6 -//.word 0x384428d1 -//.word 0x8939cb9f -//.word 0x34332cce -//.word 0xf64b11da -//.word 0xe097472c -//.word 0x534e3953 -//.word 0x282dc191 -//.word 0x2f193d99 -//.word 0xdb05e697 -//.word 0x3b165d71 -//.word 0x2c05874c -//.word 0xcec69b53 -//.word 0x346779b3 -//.word 0x603a3eea -//.word 0x6e361542 -//.word 0x0f9b5098 -//.word 0x39d5b762 -//.word 0x1da31ff1 -//.word 0x5a783ff3 -//.word 0x7022c03b -//.word 0x77a993c5 -//.word 0x117a87f4 -//.word 0x9dc41b1f -//.word 0xad23904c -//.word 0xba7c433b -//.word 0x17283aa7 -//.word 0x2454fdc8 -//.word 0xc4a7a71c -//.word 0x11263c67 -//.word 0x4e553df9 -//.word 0x1c9f7a2f -//.word 0xf1f8283c -//.word 0xc7c13329 -//.word 0x11ecd61b -//.word 0xf36068d5 -//.word 0xb29f797d -//.word 0x6aa61da3 -//.word 0xff15887f -//.word 0x558fdb7a -//.word 0xc4643ef1 -//.word 0xc66d2f35 -//.word 0xf33819d6 -//.word 0x30652921 -//.word 0x23505de7 -//.word 0xeaf1de80 -//.word 0x0c008f10 -//.word 0xaf5ce609 -//.word 0x0cadfbf1 -//.word 0x2148de66 -//.word 0xa5542e5f -//.word 0x412be7b4 -//.word 0xfd037ce1 -//.word 0xf9ce2607 -//.word 0x5d5f7b33 -//.word 0x92cd42e3 -//.word 0xb31c86c6 -//.word 0x3e1ae9c4 -//.word 0x10883b3e -//.word 0x907a4b97 -//.word 0x2a01fdf3 -//.word 0xff069d3e -//.word 0xda797371 -//.word 0x66ac9810 -//.word 0x9ff908f7 -//.word 0x87abf757 -//.word 0x1a1c69fc -//.word 0x831afdd1 -//.word 0x908f09a5 -//.word 0x6461ec2f -//.word 0x6c98a050 -//.word 0x94bf8f99 -//.word 0xba8ca80d -//.word 0x62c3b128 -//.word 0xac57df20 -//.word 0x84d2a46a -//.word 0x19f8c880 -//.word 0x90a7bbe2 -//.word 0xf9022a5a -//.word 0x82cfd085 -//.word 0xea1c8f8f -//.word 0x3929bf3e -//.word 0xaf82c632 -//.word 0xfa6ce86b -//.word 0xac82610b -//.word 0xeba0b15d -//.word 0x6a003817 -//.word 0x99a302dc -//.word 0x19f3e405 -//.word 0x73a6c8a1 -//.word 0x09e545ba -//.word 0x4dae73db -//.word 0x3077fdce -//.word 0xde1477aa -//.word 0xa8daf20e -//.word 0x4105cea7 -//.word 0x2e57d0f8 -//.word 0x7802745a -//.word 0xa4c88541 -//.word 0xe461eac2 -//.word 0x8f1dc352 -//.word 0xcfcab5d1 -//.word 0x9ad881c7 -//.word 0xe3bbdced -//.word 0x11917bef -//.word 0xb0056d70 -//.word 0x6673ad4e -//.word 0x294df828 -//.word 0xb0bddc1e -//.word 0x278b12d8 -//.word 0x27420dca -//.word 0xe58ed3b6 -//.word 0xaae90c72 -//.word 0x837658eb -//.word 0x392de66a -//.word 0x83394316 -//.word 0x7b9e6fbb -//.word 0x4f1f36c9 -//.word 0x395fbda0 -//.word 0xb1465c0a -//.word 0xe1a6ab09 -//.word 0x591fe0d4 -//.word 0x0440581c -//.word 0x5aee7393 -//.word 0xd80aa5af -//.word 0xad4ecaab -//.word 0xb778bad0 -//.word 0xadab1ef2 -//.word 0x9e12823d -//.word 0x9ac6ab32 -//.word 0xaff22aec -//.word 0x173531a8 -//.word 0xaf47a684 -//.word 0xabe07687 -//.word 0x88d52ce2 -//.word 0x4384c275 -//.word 0xc973b695 -//.word 0xae34610d -//.word 0x218c8562 -//.word 0x20d4255c -//.word 0xe89e99c1 -//.word 0xb09ce164 -//.word 0x96be3a5e -//.word 0xda9bef9c -//.word 0x4a12729a -//.word 0xfd31ab6d -//.word 0x44559007 -//.word 0xde93f6b7 -//.word 0x6b57a6ef -//.word 0x234bb44a -//.word 0xc87b0ccd -//.word 0xd9b64e6e -//.word 0x0937dcd2 -//.word 0xf085315b -//.word 0xff977462 -//.word 0xb93c4cc1 -//.word 0x20baf795 -//.word 0x6eb59642 -//.word 0x0653cbb7 -//.word 0xaa9e86f3 -//.word 0xee2a1cc7 -//.word 0xedf79ade -//.word 0x3a9858fc -//.word 0x1a95d183 -//.word 0xf00fb13b -//.word 0xf8a23052 -//.word 0x38909fa2 -//.word 0xb41b4033 -//.word 0xe2325b01 -//.word 0x5d508eff -//.word 0xdda2655b -//.word 0x67682b04 -//.word 0xc19dff6a -//.word 0x29da2a85 -//.word 0x4678af18 -//.word 0x5ff52437 -//.word 0xcb98c107 -//.word 0xa958b7c5 -//.word 0xd1fbc209 -//.word 0x0a7b024c -//.word 0x7dad07a8 -//.word 0x69242be0 -//.word 0x195424a0 -//.word 0x13f3d906 -//.word 0x93a57560 -//.word 0x37d7ba38 -//.word 0xfceb998e -//.word 0x6996ff64 -//.word 0x0a87f180 -//.word 0x204adb6d -//.word 0x976b25c3 -//.word 0x38de08a8 -//.word 0x209ea097 -//.word 0x71954260 -//.word 0x47bc0f70 -//.word 0xee83c953 -//.word 0x5273e677 -//.word 0xb612e333 -//.word 0xa907db07 -//.word 0x367e5826 -//.word 0x5cce6931 -//.word 0xbe59f546 -//.word 0x9ab44e39 -//.word 0xff090921 -//.word 0x3bb90e17 -//.word 0x9345eb3a -//.word 0x386e6ef7 -//.word 0x769b7287 -//.word 0x2d7cf9b8 -//.word 0x85ed7bf1 -//.word 0xde1d7e70 -//.word 0x06ef67d7 -//.word 0xafa090e7 -//.word 0x20ab9a8b -//.word 0x2ae90518 -//.word 0x5efdfdd3 -//.word 0x7def77b4 -//.word 0x30177d69 -//.word 0xf93dc69e -//.word 0x6afe8a7c -//.word 0x9571946f -//.word 0xc30b992d -//.word 0x69c0c8f4 -//.word 0x576ba212 -//.word 0x33700cab -//.word 0x26a0a3b7 -//.word 0xd55d4f4a -//.word 0x93fe1b18 -//.word 0xd4754438 -//.word 0xe52e8f28 -//.word 0xdb3be012 -//.word 0xcaaf094d -//.word 0x3747e027 -//.word 0xcf5094e2 -//.word 0x59c441fc -//.word 0xe9b7c1b4 -//.word 0x56f1c6c9 -//.word 0xefdd2585 -//.word 0x6aa275fa -//.word 0x1d8fd98c -//.word 0x71bc1aaf -//.word 0x93eef9f2 -//.word 0x6cbcc33d -//.word 0xd4f02556 -//.word 0x023042aa -//.word 0x47de034b -//.word 0xfd3cae35 -//.word 0xbad4bbd5 -//.word 0xc917e3cc -//.word 0xda4479f0 -//.word 0xf88bfd93 -//.word 0xbc73ef09 -//.word 0xc079e164 -//.word 0x57f9d082 -//.word 0x7b52b44a -//.word 0x07465632 -//.word 0x279f6204 -//.word 0x0c18bde3 -//.word 0xe47a1889 -//.word 0x0906c6d2 -//.word 0x7813ca7e -//.word 0x86f83532 -//.word 0xce2cafc1 -//.word 0x6eac53aa -//.word 0x739dc0e2 -//.word 0x91336cd3 -//.word 0x18d13ca4 -//.word 0x237252bb -//.word 0x12472780 -//.word 0x3ba1d964 -//.word 0xdd12c623 -//.word 0x55cf5945 -//.word 0x955924eb -//.word 0xd15d2fc8 -//.word 0x7bd8906e -//.word 0x727e3ccb -//.word 0x775d1df3 -//.word 0xe0be6520 -//.word 0x904c21f6 -//.word 0x2678110c -//.word 0x751bb7a9 -//.word 0x355daecb -//.word 0xf7d73d6e -//.word 0x5ff42c0a -//.word 0x8d9dd65e -//.word 0xdc15806c -//.word 0xcf21e9c5 -//.word 0x486d2206 -//.word 0xfb2ba0a3 -//.word 0x23fd90e3 -//.word 0x73156a2c -//.word 0x509ac981 -//.word 0x3d4e7a49 -//.word 0x976fd352 -//.word 0x82db4615 -//.word 0x2377363c -//.word 0x10d00861 -//.word 0x04037e19 -//.word 0xd8db4031 -//.word 0xae3abc37 -//.word 0x70ba303c -//.word 0x799305d9 -//.word 0x91c05f70 -//.word 0x1f5df2b4 -//.word 0x9a54176c -//.word 0x41381f74 -//.word 0x0c71e704 -//.word 0xe29aac34 -//.word 0x0c2721c0 -//.word 0xea4bbf09 -//.word 0xe4195d5d -//.word 0xa4e90078 -//.word 0x82fdf44b -//.word 0x40641cfc -//.word 0xf81f862d -//.word 0x52834281 -//.word 0xfade755c -//.word 0x525da9eb -//.word 0x642d6765 -//.word 0x1ae10890 -//.word 0xb114c886 -//.word 0x6b4f1cb9 -//.word 0x842d4635 -//.word 0x68bc2625 -//.word 0x23275399 -//.word 0x19926a86 -//.word 0xf746a60e -//.word 0xe90eb102 -//.word 0x0ee0baa6 -//.word 0x29c0c8b4 -//.word 0x99e24ea3 -//.word 0x8b0fff28 -//.word 0x6e49e3fe -//.word 0xa7b2abe3 -//.word 0x86aa42e3 -//.word 0x7938a4d8 -//.word 0x80abf332 -//.word 0xe181c8f4 -//.word 0x1d87c7ff -//.word 0x22427693 -//.word 0xc28e4f13 -//.word 0x64851308 -//.word 0xfaa26269 -//.word 0x3326891a -//.word 0xf1bb9bb2 -//.word 0xfd58c381 -//.word 0xfa64d8d2 -//.word 0x971e326d -//.word 0x093cbc60 -//.word 0xb9d24bff -//.word 0x39762e2a -//.word 0x7da207ce -//.word 0x485ad9ae -//.word 0xe40e6164 -//.word 0x16c1aaa2 -//.word 0x516bdcbe -//.word 0x2a9c546e -//.word 0x0c63fad0 -//.word 0x2d6ecfad -//.word 0xc072c6fe -//.word 0x6dced5af -//.word 0xfe6b4ba4 -//.word 0x5be664fa -//.word 0xb8f11b8f -//.word 0x0df63fc4 -//.word 0xc6fec981 -//.word 0xbcd26d7a -//.word 0x655f6fb1 -//.word 0x475fb83c -//.word 0xb3362949 -//.word 0xaf1a2f5f -//.word 0x347798e7 -//.word 0x9a92a5ea -//.word 0x506c601c -//.word 0xd0e92f1a -//.word 0xd231aaf0 -//.word 0xc057aade -//.word 0x6b39a25c -//.word 0xfca7335b -//.word 0x2dc7face -//.word 0xb9b7ad69 -//.word 0x107566a8 -//.word 0x50fc3e14 -//.word 0x71b01ec2 -//.word 0xbffcd21c -//.word 0x8e3a5fe3 -//.word 0x29d39775 -//.word 0x0ba7ea4c -//.word 0x52af7fc8 -//.word 0x70e0842e -//.word 0x2453c2f0 -//.word 0xa9a4742f -//.word 0x2d98597e -//.word 0x840208e9 -//.word 0x1ee78436 -//.word 0x36e0106a -//.word 0x4dc0448f -//.word 0xd77761b5 -//.word 0x3436e237 -//.word 0xe1d4533f -//.word 0xf071668c -//.word 0xb5594473 -//.word 0xc32a2124 -//.word 0x173a132f -//.word 0x92332447 -//.word 0xad00a645 -//.word 0x68edc670 -//.word 0x830964fb -//.word 0xf1cf22cf -//.word 0x8a06bb8b -//.word 0x00e697c9 -//.word 0x147c9ca4 -//.word 0x09504677 -//.word 0x5944fae6 -//.word 0xa8bf9723 -//.word 0xf60b4f6a -//.word 0x18fcb5ce -//.word 0x69d31638 -//.word 0xbd610dad -//.word 0x967052cf -//.word 0x9b5ed3a7 -//.word 0x450b06a1 -//.word 0xdcf67dd8 -//.word 0xa2a2bb94 -//.word 0x4e3f4611 -//.word 0xbb86fd83 -//.word 0xe2e5ac56 -//.word 0x06dcdeba -//.word 0x2ea7f25f -//.word 0xd81d717d -//.word 0xecd89f18 -//.word 0xef965082 -//.word 0x79dffd21 -//.word 0xe9e81772 -//.word 0x57b89b4e -//.word 0xca89e76d -//.word 0xab71cc28 -//.word 0x7a41e483 -//.word 0xc0ae266a -//.word 0x45aeb73b -//.word 0x82250385 -//.word 0x59c10d10 -//.word 0x0422031d -//.word 0x4c3f16ee -//.word 0xfb058989 -//.word 0x934107ba -//.word 0x40bf3957 -//.word 0x0cb398c7 -//.word 0x525980c5 -//.word 0x75d98662 -//.word 0xd16d0c49 -//.word 0xf2c51347 -//.word 0x04ab500b -//.word 0x8be3812a -//.word 0x55550166 -//.word 0xac6e9a2f -//.word 0xd0c39b6a -//.word 0xa4f72b72 -//.word 0xa7dfdd5c -//.word 0x26e58580 -//.word 0xb0aa4934 -//.word 0xcbf0fbdb -//.word 0xe5b6a61f -//.word 0x8da4667a -//.word 0xe3aa7dfb -//.word 0x4de5a447 -//.word 0x6cc29fde -//.word 0x4f65149f -//.word 0xe64c9d8f -//.word 0xb92f1cd6 -//.word 0xd92b4f0a -//.word 0x1720a4b0 -//.word 0x75584e00 -//.word 0xda6998e9 -//.word 0x0a5c7955 -//.word 0xd40e69ae -//.word 0x8ed774a1 -//.word 0xbe6a8d22 -//.word 0x1afc24b0 -//.word 0xb3a9fbda -//.word 0x6d133502 -//.word 0xb24cb061 -//.word 0x67f6944b -//.word 0x1fa82cb4 -//.word 0x8f94f5f4 -//.word 0x4367f5c7 -//.word 0x8f714e98 -//.word 0xc70613ff -//.word 0xb2245a88 -//.word 0x3d5593b6 -//.word 0x6dd71847 -//.word 0x97fb05ba -//.word 0xd3cb490f -//.word 0xaeeffdce -//.word 0x1fd2f54a -//.word 0xbd009527 -//.word 0x2ed3e61a -//.word 0xe34ee9f0 -//.word 0x02492cd2 -//.word 0xa4ce9ac7 -//.word 0x41c4977a -//.word 0x68ca4d3e -//.word 0xb466404f -//.word 0xfb5f295a -//.word 0xc8670140 -//.word 0x0cfd5c18 -//.word 0x1092f873 -//.word 0xaeeb96e3 -//.word 0xc1c608be -//.word 0xdac08c1f -//.word 0x3576582e -//.word 0xebeb76a1 -//.word 0x682ad283 -//.word 0x202c9234 -//.word 0x7efba5b2 -//.word 0x1d189f16 -//.word 0x3b1ac462 -//.word 0x6b996279 -//.word 0x894a656f -//.word 0xf36b2503 -//.word 0xf662826a -//.word 0x87a1334f -//.word 0x34cc5b17 -//.word 0x5a1e5d69 -//.word 0x9709f2ee -//.word 0x821c7955 -//.word 0x9a2a8e9b -//.word 0x7da9dd89 -//.word 0x5b58387e -//.word 0xa925e86e -//.word 0x1a4d412b -//.word 0xcbc57ae3 -//.word 0xbdd9bbea -//.word 0x891376ba -//.word 0x4f5efb39 -//.word 0xf06b473a -//.word 0x7d541d45 -//.word 0xef7f599b -//.word 0x18c68075 -//.word 0xd9d49b8d -//.word 0x96d246df -//.word 0xe74404b1 -//.word 0x902dd5d1 -//.word 0xb47a0b1e -//.word 0x459d5949 -//.word 0xbf792ddd -//.word 0x167e3f7d -//.word 0xec156a6d -//.word 0x083ebc55 -//.word 0x0477c941 -//.word 0x45e144eb -//.word 0x319ed03d -//.word 0x9b7d1312 -//.word 0x82d90c3d -//.word 0xfcbea7cc -//.word 0x6d4e8f8e -//.word 0xfc6344d2 -//.word 0x48766d72 -//.word 0x56c06f10 -//.word 0xcf9e3ea0 -//.word 0x683a7426 -//.word 0xa168a0c1 -//.word 0xb2cee0e9 -//.word 0xc248b2f5 -//.word 0x5b8b07e0 -//.word 0x1b08994c -//.word 0xac137fc7 -//.word 0xf644fe4e -//.word 0x921da30f -//.word 0x82ee8e73 -//.word 0x20f6115c -//.word 0x55cb7aac -//.word 0x0bfc2c06 -//.word 0xe5f4f5d8 -//.word 0x2d219b99 -//.word 0x0e56b84f -//.word 0x036ec855 -//.word 0x8f33815b -//.word 0x2f7e63ae -//.word 0x8d9f8fba -//.word 0xf6fedccd -//.word 0x0e03281d -//.word 0xc234ec0d -//.word 0x7f9d13ac -//.word 0xa1750d7e -//.word 0x2ffe1f80 -//.word 0xc5adfd66 -//.word 0xd18b9a27 -//.word 0x02db3fbb -//.word 0xfefddb23 -//.word 0x54929aab -//.word 0xb1e1b86c -//.word 0x567a9814 -//.word 0xc91810ea -//.word 0xcbcc070c -//.word 0x8b5843fb -//.word 0x19d97c5a -//.word 0x1daab5f3 -//.word 0xc984ccfb -//.word 0x0cea4f97 -//.word 0x09c4919f -//.word 0xc74afda1 -//.word 0x2a23ab29 -//.word 0x22ce313f -//.word 0x2242bc32 -//.word 0xd4d15f94 -//.word 0x0b52aa86 -//.word 0xf97f7f36 -//.word 0xa29c21a5 -//.word 0x905a8eae -//.word 0xc8fa0f44 -//.word 0xfeb50dfb -//.word 0x055c26c9 -//.word 0x893c800e -//.word 0x00445dd3 -//.word 0xde6af04f -//.word 0x084a70b0 -//.word 0x8c106a18 -//.word 0x8f995be5 -//.word 0x87d57e35 -//.word 0xaa70e3a9 -//.word 0xa5b1c16a -//.word 0x92a20d6a -//.word 0x24714bed -//.word 0x2516a547 -//.word 0x23363ae7 -//.word 0x6647b894 -//.word 0x25f62df7 -//.word 0xf9c51a5a -//.word 0x91f9caaf -//.word 0xa8b3e1d4 -//.word 0x345d3815 -//.word 0xe047e8f3 -//.word 0xbd92a523 -//.word 0x344e4eda -//.word 0x40dfc148 -//.word 0xdaa5f462 -//.word 0xb4dc42e5 -//.word 0x29c00298 -//.word 0x74f55ed1 -//.word 0x2127633a -//.word 0xc2ee54d5 -//.word 0xe3f4443e -//.word 0x4059e331 -//.word 0x3556994b -//.word 0x7521d115 -//.word 0xff11983e -//.word 0x4e036628 -//.word 0xd0fc3ba7 -//.word 0x9a10ee05 -//.word 0x5a82c249 -//.word 0x8d2c3bb8 -//.word 0xf221309d -//.word 0x3e922046 -//.word 0x11eeca4f -//.word 0x294df723 -//.word 0xd60f9bbf -//.word 0xadc01cb9 -//.word 0x813ff281 -//.word 0x8f2070e8 -//.word 0xf94ee1de -//.word 0x76f5d780 -//.word 0x479fc052 -//.word 0x6d9dbac8 -//.word 0x19a8a90c -//.word 0x64c886fb -//.word 0x4075fa70 -//.word 0xaefc2bc6 -//.word 0x3225d698 -//.word 0x84139ecb -//.word 0x896ba3cf -//.word 0x81b95721 -//.word 0x820f8d15 -//.word 0x25efd3d2 -//.word 0x7f6a029e -//.word 0x538a135c -//.word 0x85ee3452 -//.word 0xd2b41b30 -//.word 0xbf9c9b4e -//.word 0xcf697536 -//.word 0xf98b7062 -//.word 0x59fcac47 -//.word 0x26683392 -//.word 0xe490d1b1 -//.word 0xdbf02695 -//.word 0xc79ff9b6 -//.word 0xd178cf58 -//.word 0xbe77bc0d -//.word 0x67657a7c -//.word 0x69b8b860 -//.word 0x1db5b4d4 -//.word 0xcbd70ccd -//.word 0x1a74d2e8 -//.word 0xcb9ede66 -//.word 0xa7486874 -//.word 0xb6a9d6b0 -//.word 0xb2e6d2ea -//.word 0xbbeba027 -//.word 0x4c99aeec -//.word 0x6e276db9 -//.word 0x2cc260d3 -//.word 0x46777346 -//.word 0x2a538d2b -//.word 0x1fc96827 -//.word 0xc453a134 -//.word 0xb95c0ba4 -//.word 0x9c5e4963 -//.word 0x37489c7c -//.word 0xf722f9de -//.word 0xa0f35f61 -//.word 0x40e36704 -//.word 0x629d1d78 -//.word 0x83f70ee3 -//.word 0xcad5a2de -//.word 0xf34aacbf -//.word 0x8d01401e -//.word 0x65dcc592 -//.word 0x42da4abc -//.word 0xd23e1e87 -//.word 0xe5ee9aad -//.word 0xd919427e -//.word 0x551c0ddd -//.word 0x3ba7008b -//.word 0xd71b01a8 -//.word 0x5d37eb76 -//.word 0x92f4de61 -//.word 0xc9add93c -//.word 0x11838ace -//.word 0xad00648d -//.word 0xc4fbf3a9 -//.word 0x5abb6c4c -//.word 0x7f5f8921 -//.word 0xc67c9313 -//.word 0xf909c057 -//.word 0x0b78c0ac -//.word 0x4e2693e1 -//.word 0xe6f59d98 -//.word 0x7e37fc4b -//.word 0x3acf198c -//.word 0xec927d91 -//.word 0x8af4e7ef -//.word 0xe0e09ba6 -//.word 0x82e7fc5e -//.word 0x059d5df0 -//.word 0x6e401528 -//.word 0xeb9bd1ca -//.word 0xc12a2fd2 -//.word 0x867f8800 -//.word 0x90e40c94 -//.word 0xad421557 -//.word 0x1442b5da -//.word 0x9cb19102 -//.word 0x2c29f3c4 -//.word 0x73ee1a2e -//.word 0xd916d5a7 -//.word 0xb5ed5077 -//.word 0xc0972d8a -//.word 0xcaf7d670 -//.word 0xabd012a9 -//.word 0x7d2ad720 -//.word 0x08f860f5 -//.word 0x7ef77e7f -//.word 0x69d93392 -//.word 0xe1a37dfd -//.word 0x02547057 -//.word 0x9dc787fc -//.word 0x2eda3c52 -//.word 0x0ed0d651 -//.word 0xeaf48342 -//.word 0x747fa6c6 -//.word 0x58bc721b -//.word 0x726ab89b -//.word 0x3e62fd85 -//.word 0x907ad000 -//.word 0x85a85b5d -//.word 0xb96b379d -//.word 0xba668533 -//.word 0xbd4e3a0b -//.word 0x9007baca -//.word 0xd00aa958 -//.word 0x5c0afd9c -//.word 0x09d75886 -//.word 0x98829653 -//.word 0xe5c2a10c -//.word 0x60968d50 -//.word 0xc12ce154 -//.word 0xf8023228 -//.word 0x634bf73c -//.word 0x44949822 -//.word 0x72a7c895 -//.word 0x4fb015bb -//.word 0xf99ebda7 -//.word 0xc5ccc422 -//.word 0xe9e143ab -//.word 0x78f503bc -//.word 0x94f54a4f -//.word 0xdf48f5a1 -//.word 0x32b2c736 -//.word 0x9279011d -//.word 0x5fc73375 -//.word 0xcf505130 -//.word 0x9b340917 -//.word 0xf827540e -//.word 0xc9cf4c9a -//.word 0x136d3da0 -//.word 0xb1c0fe70 -//.word 0x49278201 -//.word 0x7e05aa7e -//.word 0x67695d02 -//.word 0x40efdba1 -//.word 0x60e14ea7 -//.word 0x6ba2a324 -//.word 0xc94d97a8 -//.word 0x5799154b -//.word 0x5c00bff0 -//.word 0xbe20cbcb -//.word 0x76611021 -//.word 0x41d8604f -//.word 0x986b190e -//.word 0xe336f7f5 -//.word 0xea2e2c40 -//.word 0x8c04b3cf -//.word 0xb34de172 -//.word 0x87df3d63 -//.word 0xe27e9114 -//.word 0x04b8412b -//.word 0x890ddccb -//.word 0x9853f116 -//.word 0x5c5924f0 -//.word 0xb8cb8005 -//.word 0x36550f0d -//.word 0x410ba84f -//.word 0x95090963 -//.word 0xf356263d -//.word 0x190fc067 -//.word 0xf1c1388e -//.word 0x0916a640 -//.word 0x43b426f4 -//.word 0xce62724b -//.word 0x546cb695 -//.word 0x75499f97 -//.word 0x757cb58c -//.word 0x31b8ec69 -//.word 0x58477565 -//.word 0xd7addab9 -//.word 0x95884aa4 -//.word 0x61ba32b3 -//.word 0x29ca0d3f -//.word 0x6c887c37 -//.word 0xf1f09920 -//.word 0xba518859 -//.word 0x34af50a4 -//.word 0xb065e9e2 -//.word 0x160e971e -//.word 0xd8a676cd -//.word 0x26ed5554 -//.word 0x610cc7cb -//.word 0xd17b7801 -//.word 0x9a22bec0 -//.word 0xecbf7052 -//.word 0x7b87fb43 -//.word 0x2f10b269 -//.word 0x1c6e6622 -//.word 0xb49d37dd -//.word 0x3b1fa9dc -//.word 0x7ce5fb38 -//.word 0xbb73b425 -//.word 0xea407e77 -//.word 0x205b3765 -//.word 0x4654468d -//.word 0x145a2b39 -//.word 0x3ca15ae1 -//.word 0xe4074af1 -//.word 0x5af6c9cb -//.word 0x038c9210 -//.word 0x95f9211c -//.word 0x8629c6cf -//.word 0xc5a4f993 -//.word 0xa7b2ed9a -//.word 0x24c26868 -//.word 0x430cd192 -//.word 0xd3768bc5 -//.word 0x5cb48109 -//.word 0x55b40247 -//.word 0x9739d009 -//.word 0x12c67382 -//.word 0xbfbdd3ce -//.word 0xd5c8067b -//.word 0x40786747 -//.word 0x4f2ce82b -//.word 0xad35a999 -//.word 0x9237c903 -//.word 0x3ad27c9c -//.word 0x97825d62 -//.word 0x43c4065c -//.word 0xb87bde20 -//.word 0xc3913399 -//.word 0x36e18907 -//.word 0xde553147 -//.word 0xb44b1d55 -//.word 0x573ef20f -//.word 0xbaa25f3c -//.word 0x1a0faecc -//.word 0x34a29861 -//.word 0xb4a15e0f -//.word 0xf05d1560 -//.word 0xd65d419c -//.word 0x23b8a647 -//.word 0xd7c35bea -//.word 0xe5ec2017 -//.word 0x2ee6f1a7 -//.word 0xb007dc46 -//.word 0xfbee0f32 -//.word 0xe568353f -//.word 0x7f95031f -//.word 0x48460de0 -//.word 0xa0aadfb6 -//.word 0x7f2a49fb -//.word 0x6691fa74 -//.word 0x967050d6 -//.word 0x81c16f88 -//.word 0x7eca91ab -//.word 0xc0449d58 -//.word 0x89bdfa28 -//.word 0x9b3ba5fa -//.word 0xf02281f0 -//.word 0xaa57efbb -//.word 0x4da69f19 -//.word 0x2c61a69b -//.word 0x214ad0ac -//.word 0x81b337cf -//.word 0x4fe41428 -//.word 0xb0bdd63e -//.word 0x9f9d71ff -//.word 0xe282f905 -//.word 0x3d716f17 -//.word 0xe518dbf3 -//.word 0x37b29a4a -//.word 0xaa2bfa0d -//.word 0x038404e7 -//.word 0xc87a990b -//.word 0xf662c12f -//.word 0xf6583fd8 -//.word 0xce9869d9 -//.word 0x952c3616 -//.word 0x29c8998e -//.word 0x24f20d99 -//.word 0x0b65716d -//.word 0xc9b817e7 -//.word 0x5c3b1889 -//.word 0xcf22eabf -//.word 0x68e53466 -//.word 0x22e6e08e -//.word 0x5d55727f -//.word 0xd55099fb -//.word 0xd14f04c3 -//.word 0x9dc0775d -//.word 0x39ee1e13 -//.word 0x5327213f -//.word 0x731e78c6 -//.word 0x768e01e3 -//.word 0x3d20d026 -//.word 0xa68fc6bc -//.word 0xbb0a65f0 -//.word 0x2adae2f2 -//.word 0xf6447cd7 -//.word 0x6bb10de2 -//.word 0x570cdf02 -//.word 0x776cc09b -//.word 0x30f35989 -//.word 0x7ff6bb63 -//.word 0x335d3bfc -//.word 0x5a4d8030 -//.word 0xf905dadd -//.word 0x0006d52f -//.word 0x7c770f21 -//.word 0x0fc74640 -//.word 0x9d94b5b2 -//.word 0x49cca178 -//.word 0xa0122ff0 -//.word 0x1363789e -//.word 0xabf9df2b -//.word 0xf86fa3ae -//.word 0x4b27b02b -//.word 0x25e9bb59 -//.word 0xeecc8da9 -//.word 0xea5a9f83 -//.word 0x6aefe8d3 -//.word 0x3f62f3c4 -//.word 0x74e734cb -//.word 0x3d349ce8 -//.word 0x2ae36b29 -//.word 0xa018466f -//.word 0x8a638974 -//.word 0x4ce8de0d -//.word 0xf8bd0fad -//.word 0xc593182b -//.word 0xbd9981c5 -//.word 0xb59dea64 -//.word 0x8274e822 -//.word 0x6a9d0f09 -//.word 0xd921501d -//.word 0x55bd869d -//.word 0xb4434b87 -//.word 0x8d3e105a -//.word 0xecd56d1f -//.word 0x4af2b5aa -//.word 0xbca3ce1e -//.word 0x6ac03faf -//.word 0x43ce8bac -//.word 0xef23bebc -//.word 0x054b4568 -//.word 0x7fab02d9 -//.word 0x6b64a0e3 -//.word 0xe37a2443 -//.word 0x3e36c525 -//.word 0x88c8feea -//.word 0x3031e127 -//.word 0x0160aef1 -//.word 0x539ba458 -//.word 0x83211731 -//.word 0xa00ec319 -//.word 0x677e60b6 -//.word 0x72f57740 -//.word 0xacff7340 -//.word 0x0813fb98 -//.word 0x73bd7fc4 -//.word 0x07fd115f -//.word 0x81ea77e9 -//.word 0xf59a7ec7 -//.word 0xc046918b -//.word 0xbfaa8976 -//.word 0xbeabc73b -//.word 0x333c8006 -//.word 0x2d8259bd -//.word 0x87363486 -//.word 0x614c4989 -//.word 0xd0d278f7 -//.word 0xd51add4b -//.word 0x8c1ba6d0 -//.word 0xa6152163 -//.word 0x1974197a -//.word 0x16f76365 -//.word 0x3c11b4d4 -//.word 0x0b90b69a -//.word 0x9b7c5ab0 -//.word 0x8e426f7d -//.word 0x43117454 -//.word 0x4c85aa3f -//.word 0x23836efb -//.word 0x1864c643 -//.word 0x8e553a52 -//.word 0x67fde5a3 -//.word 0xbd61cbfb -//.word 0xd3056da9 -//.word 0x4b549b0c -//.word 0x99428a57 -//.word 0xb7302691 -//.word 0x1a10a9e0 -//.word 0xe6c96d06 -//.word 0x5eddfe2c -//.word 0x9e4974df -//.word 0x8cad0058 -//.word 0x0cacc400 -//.word 0x7396e833 -//.word 0x3f44ea44 -//.word 0x054435c2 -//.word 0xaa37f6fa -//.word 0xd6762bbd -//.word 0xa6fcfc64 -//.word 0xa1804f10 -//.word 0xeee19737 -//.word 0xc4c7ec5c -//.word 0x2188611d -//.word 0xbf489273 -//.word 0x44657c36 -//.word 0xb81292df -//.word 0x3d410d92 -//.word 0xfac7835c -//.word 0x59babbb9 -//.word 0x721ec059 -//.word 0xc7c13423 -//.word 0x3164e77b -//.word 0x1a1ba8c0 -//.word 0xedf75b19 -//.word 0xcbe14c72 -//.word 0x80c9c3c1 -//.word 0xb501d98e -//.word 0x66e389b2 -//.word 0x97ba0a5f -//.word 0x43e05c60 -//.word 0x962322a2 -//.word 0x5c6daff4 -//.word 0xb8a5630b -//.word 0x19d038c9 -//.word 0x6a7c98bf -//.word 0x895e72f0 -//.word 0xfb3a8cd7 -//.word 0xde031bac -//.word 0x1e4491e4 -//.word 0xecbeb6f7 -//.word 0x6c52fa65 -//.word 0xae2209fb -//.word 0xe0f4a152 -//.word 0xc2d7a09a -//.word 0x5a086295 -//.word 0xe81649e6 -//.word 0x1c459d8c -//.word 0x873097aa -//.word 0x50b3b889 -//.word 0x28085fdf -//.word 0x7f309b52 -//.word 0xf8953e38 -//.word 0x1bed33a1 -//.word 0x4b611197 -//.word 0xf7efefa4 -//.word 0x140d7b95 -//.word 0xca8f467e -//.word 0x6dca62fe -//.word 0xb0fa2fc4 -//.word 0x15e17252 -//.word 0xa8b1a701 -//.word 0xed2c9946 -//.word 0x170a2f33 -//.word 0x7a9b8941 -//.word 0x43ad4b4c -//.word 0x67b039df -//.word 0xd91805b2 -//.word 0x00036471 -//.word 0x681c67bf -//.word 0xb8bf097b -//.word 0xe45e0542 -//.word 0xa323ea35 -//.word 0x24d670fc -//.word 0xfc020d0b -//.word 0x6453c423 -//.word 0xa1433e1c -//.word 0xc3f51be3 -//.word 0x92618abf -//.word 0xc6b217d8 -//.word 0x76ecc5f9 -//.word 0xd3d25d95 -//.word 0x16070508 -//.word 0xb7731420 -//.word 0xe0e825dc -//.word 0x21066b73 -//.word 0x655c4498 -//.word 0x80000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00015E80 -//// expected output -//.word 0x9f0c0f9c -//.word 0xc172a278 -//.word 0x0b8f378a -//.word 0x51155eb7 -//.word 0xecebd238 -//.word 0x579767af -//.word 0x5cb643b5 -//.word 0x903e5ab7 -//.word 0xdce0202d -//.word 0xe501f061 -//.word 0xd467e4a8 -//.word 0x485e1ff2 -//.word 0x11f9277b -//.word 0xade2d389 -//.word 0xc9577d54 -//.word 0x95930f24 -//// SHA512LongMsgvector_113 -//// vector length -//.word 0x00016198 -//// input message -//.word 0xafa4a2c4 -//.word 0xfbaffe83 -//.word 0x8dd149c7 -//.word 0x8ea7851e -//.word 0xa9396304 -//.word 0xb41806a0 -//.word 0x93a90aae -//.word 0x59c0c5bd -//.word 0xb170cc9a -//.word 0x7d22b90c -//.word 0xbce52cc1 -//.word 0xb1051089 -//.word 0x42df20c2 -//.word 0x9ef3a913 -//.word 0x223b915e -//.word 0x7ebc98ef -//.word 0x135adefa -//.word 0xa0f0a644 -//.word 0x1ea05920 -//.word 0xe868ce9d -//.word 0x1ff6c8fe -//.word 0x4dbec06a -//.word 0x4849e5e5 -//.word 0x5ad0627f -//.word 0x9e09dfcb -//.word 0xad414a93 -//.word 0x7aabd7ca -//.word 0x7bf845c2 -//.word 0x0a2764a0 -//.word 0x0a9fd40c -//.word 0xcd7b0f2d -//.word 0x3525a9d4 -//.word 0x1a26d7f7 -//.word 0xec3c2f62 -//.word 0x9aadaea9 -//.word 0xb2dcff61 -//.word 0xc91afa8f -//.word 0x1dbe6c61 -//.word 0x7978161c -//.word 0x59e2f856 -//.word 0x4f58cf65 -//.word 0xa50adc17 -//.word 0x444fe7a4 -//.word 0xd43d84e0 -//.word 0x257695b5 -//.word 0xce4410d1 -//.word 0x14e9029c -//.word 0x0d30d46d -//.word 0x0548cdfd -//.word 0x20d2d91c -//.word 0x413989a2 -//.word 0x2b425aa9 -//.word 0xe6e43af9 -//.word 0x655948c4 -//.word 0x6575dc94 -//.word 0x9837c781 -//.word 0x039edca7 -//.word 0xa4bdafd7 -//.word 0x59129c8d -//.word 0xfd140b22 -//.word 0xd40bf343 -//.word 0x29249da2 -//.word 0x35c5abeb -//.word 0x431e58fa -//.word 0x1201014b -//.word 0x7bf3e5b2 -//.word 0x5383294c -//.word 0x93da1fb5 -//.word 0xb694c77b -//.word 0x63ce96d3 -//.word 0x4c80778b -//.word 0x560e1040 -//.word 0xfa1946d1 -//.word 0xeb9b0313 -//.word 0xf93336c7 -//.word 0x35bd1cc9 -//.word 0x5626bf8a -//.word 0x5b7ebcbf -//.word 0x724f485b -//.word 0x192e75bb -//.word 0x838fb221 -//.word 0x3dde9164 -//.word 0x11cbcee6 -//.word 0x2be58cc5 -//.word 0x7a6ae156 -//.word 0x595d95cf -//.word 0x6fda2743 -//.word 0xd3a711d4 -//.word 0x740b4d24 -//.word 0xb9e3180c -//.word 0x64f2f691 -//.word 0xbc79f613 -//.word 0xeb0737c8 -//.word 0xa593ab69 -//.word 0x0ac81b2b -//.word 0xcea06cf1 -//.word 0x973420c0 -//.word 0xa6d32073 -//.word 0xba51b8b0 -//.word 0x31a1e31a -//.word 0x71a6c9c8 -//.word 0x864786f7 -//.word 0x0cc22dfb -//.word 0x50420c7c -//.word 0xb2b332de -//.word 0x4ed52f01 -//.word 0xdb8f1b2b -//.word 0xd287da42 -//.word 0xd3ef9d3f -//.word 0x46a2acdf -//.word 0x3e6f649b -//.word 0xa2b47bdb -//.word 0x8e2f8c67 -//.word 0xf712cf1e -//.word 0x8e5527ea -//.word 0xe75063f3 -//.word 0xdb89bd13 -//.word 0x2bcba78b -//.word 0x6578c8f4 -//.word 0x0c1f4178 -//.word 0xf3513441 -//.word 0xeab18732 -//.word 0x9c4be5d5 -//.word 0xb8270695 -//.word 0x4f1d312e -//.word 0x7eeaff61 -//.word 0x4c8461ec -//.word 0xd5abe4b9 -//.word 0xa9c13456 -//.word 0x6fdbdfa5 -//.word 0xce185cd5 -//.word 0x8d324c90 -//.word 0xf852ff76 -//.word 0x86293acb -//.word 0xba3c386c -//.word 0x477fee08 -//.word 0x7726948c -//.word 0xcdb860df -//.word 0xea6595d0 -//.word 0xad99bc4d -//.word 0x9ed131d5 -//.word 0x8daee22f -//.word 0x7647545d -//.word 0xa8c4e7cc -//.word 0x26295acd -//.word 0x4e6f9149 -//.word 0xb8d996af -//.word 0x6185df32 -//.word 0x0942cf32 -//.word 0xd9a17ef7 -//.word 0x494fbda5 -//.word 0x41a1556c -//.word 0x7e719000 -//.word 0x3829fb49 -//.word 0x021d695b -//.word 0xf11e3ba8 -//.word 0x004bdf74 -//.word 0xb32b978a -//.word 0xfbf97c2e -//.word 0x5a3fc252 -//.word 0x47a73d0d -//.word 0xd40d2448 -//.word 0x8ed816bb -//.word 0xa58b5a18 -//.word 0x4d976b85 -//.word 0x6374b450 -//.word 0x54ef98de -//.word 0x3bc6b5e5 -//.word 0x49726adb -//.word 0x6a4496af -//.word 0x25b3a3b6 -//.word 0xc4f5c4e8 -//.word 0xb6cc7a4c -//.word 0x31a35db1 -//.word 0x1cd9199f -//.word 0x2b5db78d -//.word 0x4c7b1e54 -//.word 0x42f5d9e4 -//.word 0x8f561a36 -//.word 0x9883ff82 -//.word 0x049315b1 -//.word 0x65e01b15 -//.word 0x1a5e0858 -//.word 0x742c4fb2 -//.word 0x1769615f -//.word 0xa3497351 -//.word 0x94688222 -//.word 0x675e954c -//.word 0xff93439c -//.word 0x465574e4 -//.word 0x17276cf1 -//.word 0x5c5c05bc -//.word 0x73e53be4 -//.word 0xd768ee5c -//.word 0xfc92e461 -//.word 0x7aad0eb0 -//.word 0x6e750cf5 -//.word 0x1d27f286 -//.word 0xdbdc4d51 -//.word 0x2c156114 -//.word 0x2897b5cc -//.word 0x2479d26f -//.word 0x8e7b47dd -//.word 0x1999f014 -//.word 0x1ae078a4 -//.word 0x32811d64 -//.word 0x2e24b362 -//.word 0x2b7eec20 -//.word 0xfe26d6fd -//.word 0xd3a4a5f1 -//.word 0x13cbb37d -//.word 0x8c4ac5e2 -//.word 0xcc7d9092 -//.word 0xcd897ce4 -//.word 0xd8a7a70b -//.word 0xa3c02d49 -//.word 0xbd3ba760 -//.word 0x2b13f14a -//.word 0x542c3129 -//.word 0x1ae71481 -//.word 0x4af45ba5 -//.word 0x3667976f -//.word 0xa00e3034 -//.word 0xda02acf7 -//.word 0x2c7d2edd -//.word 0x76eb3de1 -//.word 0x1644c7c9 -//.word 0x0c986659 -//.word 0x5cece1c6 -//.word 0xb444f66e -//.word 0x4f0157c5 -//.word 0x196df293 -//.word 0x1495755d -//.word 0xfa571220 -//.word 0x24bb8046 -//.word 0xaa8742d2 -//.word 0xcc0d2bde -//.word 0x91482247 -//.word 0xad2723a7 -//.word 0xa8298683 -//.word 0x3d2a84c6 -//.word 0x017df76e -//.word 0x453a6186 -//.word 0x3cd93054 -//.word 0x610040d3 -//.word 0x139aa264 -//.word 0x82299cc0 -//.word 0xcf5df031 -//.word 0x6fe56102 -//.word 0xd1857433 -//.word 0x40697472 -//.word 0x0ab9b847 -//.word 0xe26d298f -//.word 0x8363fe2b -//.word 0x96aecaf9 -//.word 0xd632b903 -//.word 0x726e16f7 -//.word 0xb29811d8 -//.word 0xdeefc0f2 -//.word 0x5c4d6313 -//.word 0x18fbecf8 -//.word 0x29cabf06 -//.word 0xb15fb63b -//.word 0x04cf6863 -//.word 0x0d6cab8f -//.word 0xeede57c3 -//.word 0xe7754def -//.word 0x79bdb820 -//.word 0xcb5393f8 -//.word 0x4cf86c5c -//.word 0x9ae4676c -//.word 0xa35c85b8 -//.word 0x0a8726b0 -//.word 0xcc7ecd5d -//.word 0x23a2244f -//.word 0xaa3240d7 -//.word 0xc21d2576 -//.word 0x35148d94 -//.word 0x1ae4e575 -//.word 0xf903996a -//.word 0x2f689144 -//.word 0x93a0fc0e -//.word 0x591f4cfc -//.word 0x37d4819e -//.word 0xc700ab59 -//.word 0x2d47aa18 -//.word 0xf908393f -//.word 0x4fea2be1 -//.word 0x45b7f332 -//.word 0x8c6e6a3f -//.word 0x5393cddc -//.word 0x68ca05de -//.word 0xa0a42c8b -//.word 0x7ab94c4f -//.word 0xfff76ab1 -//.word 0xec39c384 -//.word 0x131b5562 -//.word 0xff0da156 -//.word 0xd7a7b0d9 -//.word 0x843d5400 -//.word 0x16b2b0f3 -//.word 0x6491faa1 -//.word 0xf35980b2 -//.word 0x1a19e9bd -//.word 0x633dbebc -//.word 0x33a829bd -//.word 0xae03fcda -//.word 0xd554f46a -//.word 0xf1d24079 -//.word 0x35f83d76 -//.word 0x9fd8842c -//.word 0x1fb226f4 -//.word 0xfbc53628 -//.word 0x726588da -//.word 0xa04eb9c6 -//.word 0xa1386f86 -//.word 0xf9abe205 -//.word 0x33159c36 -//.word 0xc91a7d06 -//.word 0x442b018f -//.word 0xa45ac68e -//.word 0x026c4817 -//.word 0x7430ef87 -//.word 0x31104dbb -//.word 0xf6e6a07f -//.word 0xa8119f49 -//.word 0x3ac77328 -//.word 0xd1ac03f7 -//.word 0x26a474d6 -//.word 0x2ce6f0db -//.word 0xf453a704 -//.word 0xcd051470 -//.word 0xaf2a82cf -//.word 0xda13ce18 -//.word 0xba886e7a -//.word 0x0e5fb294 -//.word 0x494d4ae8 -//.word 0x38fb098d -//.word 0xe65ce925 -//.word 0xbd3f4e0f -//.word 0xed208fde -//.word 0x1244b209 -//.word 0x110577e3 -//.word 0x426a99ce -//.word 0xd5fa50ac -//.word 0x6ed21a97 -//.word 0x13f6bbd2 -//.word 0x48e582ff -//.word 0x7870cf92 -//.word 0x97cbd285 -//.word 0x06e5954e -//.word 0xb7f53d0e -//.word 0x91558d0b -//.word 0x1694ab60 -//.word 0x43c727f3 -//.word 0xb71f39a8 -//.word 0x18c14ad4 -//.word 0xb3d1b6f5 -//.word 0x62d0d1a0 -//.word 0xb32928ba -//.word 0x460609eb -//.word 0x77684550 -//.word 0x3d773470 -//.word 0x5217fa72 -//.word 0x95bb098d -//.word 0xac7ee7bf -//.word 0xed7032c2 -//.word 0x7f2de13c -//.word 0xbcb5cc36 -//.word 0xda776fcf -//.word 0xcbafea31 -//.word 0x61f24dc5 -//.word 0xb60713a3 -//.word 0xcbf9ec4d -//.word 0x6f6ac09c -//.word 0x632af0fa -//.word 0xbb09dfd2 -//.word 0x87e9b145 -//.word 0xb317521f -//.word 0x2cdbba09 -//.word 0x444d7000 -//.word 0x586b4d05 -//.word 0xb0698316 -//.word 0xa648de5e -//.word 0x0baa49a9 -//.word 0xc6e5931a -//.word 0xbe567320 -//.word 0xfbf8caa6 -//.word 0x0834298a -//.word 0x9bfb9351 -//.word 0x77138419 -//.word 0x92ae31ce -//.word 0x734112a1 -//.word 0xdf939eb6 -//.word 0xb415561d -//.word 0x15710404 -//.word 0xc765452b -//.word 0xdbd24598 -//.word 0x8e10ca8b -//.word 0x6d8574b4 -//.word 0xbd7643a4 -//.word 0x191c5982 -//.word 0x5dfb01ff -//.word 0xc36ff18b -//.word 0x4c88ccca -//.word 0x6217eb41 -//.word 0xbb095d56 -//.word 0x80f42c77 -//.word 0xaff0e299 -//.word 0xbea84ce4 -//.word 0x81b17eac -//.word 0x4d1a17a4 -//.word 0x5e44c74e -//.word 0x76f30eb6 -//.word 0xc7a64660 -//.word 0x1324e37f -//.word 0x1258fa67 -//.word 0x145e0045 -//.word 0xe7ded50e -//.word 0xfb9900b5 -//.word 0xc4413da1 -//.word 0x608e355e -//.word 0x7a8e8c93 -//.word 0x6e3d2034 -//.word 0xad5590f8 -//.word 0x6467fc0e -//.word 0x582b0c0c -//.word 0x14153428 -//.word 0x472836aa -//.word 0x680fe8a1 -//.word 0x9b6a37d5 -//.word 0xd8666cfe -//.word 0x4a90ae33 -//.word 0xf5ebc8a5 -//.word 0x9c3f2d8d -//.word 0xe2b53963 -//.word 0xafa1ba51 -//.word 0xd59fafe7 -//.word 0xf4e15010 -//.word 0x9bc74e45 -//.word 0xafb05b00 -//.word 0x1111ed74 -//.word 0x7bc43f7b -//.word 0xaba299d0 -//.word 0xc453d27e -//.word 0xf1651398 -//.word 0x4b9cdd2b -//.word 0xfd894e71 -//.word 0xa55ea047 -//.word 0xfe01f2e1 -//.word 0xbd5f4bbd -//.word 0xb803dcd5 -//.word 0x4de78519 -//.word 0x028a9b1c -//.word 0x6942e90e -//.word 0x47d4f4ea -//.word 0xf44284f0 -//.word 0x05e45f56 -//.word 0x29ba583b -//.word 0x510188dc -//.word 0x1404dc0a -//.word 0x5135d0dc -//.word 0x167c79a1 -//.word 0xc0cfc918 -//.word 0x64030fe4 -//.word 0x6ee2bd3a -//.word 0x887d6edd -//.word 0xbec4274c -//.word 0xdf53dd39 -//.word 0x268f383e -//.word 0x19f297cc -//.word 0xb2a35464 -//.word 0xbd4a4909 -//.word 0x812293f5 -//.word 0xa250958b -//.word 0x4673408d -//.word 0x777c928f -//.word 0xc9c05dab -//.word 0x3c4b4a77 -//.word 0x63771d34 -//.word 0xc6be3b48 -//.word 0x86cd69ef -//.word 0x3fd9d62d -//.word 0x32365c07 -//.word 0xa42603f2 -//.word 0x81efc78c -//.word 0x45309b8a -//.word 0x1c74adf1 -//.word 0x4808ec8a -//.word 0xc40ac88f -//.word 0x27c338ab -//.word 0xca370222 -//.word 0x2df9374b -//.word 0x9744fc47 -//.word 0xfd4890ed -//.word 0x25c28b04 -//.word 0x0ccf64b5 -//.word 0x8402363f -//.word 0x21b4c4ed -//.word 0x569bba46 -//.word 0xdc9f3683 -//.word 0x53e88646 -//.word 0x2c3c3488 -//.word 0xc6883fd3 -//.word 0xd7bcacb2 -//.word 0x0edc3d67 -//.word 0xf75481db -//.word 0x1e8d0ddb -//.word 0x77bd0880 -//.word 0xfd03edef -//.word 0x9ab38c43 -//.word 0x47ef52c8 -//.word 0x7477cb6a -//.word 0xaac1656d -//.word 0x6f4d775e -//.word 0x6a338149 -//.word 0xc7feb62c -//.word 0xddbcb7ac -//.word 0x0e56a207 -//.word 0xef1e4b4a -//.word 0xa9a7c9c4 -//.word 0xa0d935ba -//.word 0x5244ae5c -//.word 0x81b5a0f8 -//.word 0x9407466e -//.word 0x3b3c6ee4 -//.word 0x52cd7dba -//.word 0x083db2c0 -//.word 0x40f4afa7 -//.word 0x374b35b6 -//.word 0x67e42fbe -//.word 0xac3cf250 -//.word 0xa683c32d -//.word 0x5eab99fe -//.word 0x2cbf2546 -//.word 0xd8761094 -//.word 0xff0884fd -//.word 0xb840edc9 -//.word 0x78d2016d -//.word 0x33f0feba -//.word 0xc4183253 -//.word 0x8f30c164 -//.word 0x65d4a391 -//.word 0xa8efec2d -//.word 0xaf8850ad -//.word 0x6bdfe65c -//.word 0x4bb92c50 -//.word 0x5ef84c9c -//.word 0xb86e9dc7 -//.word 0x16f36d7d -//.word 0xc5b5fe85 -//.word 0xbfd0cef3 -//.word 0x181f1b9f -//.word 0x9851a7d5 -//.word 0xaa3fb94e -//.word 0x747c645f -//.word 0x482e0b71 -//.word 0x3b1d25b1 -//.word 0x130a3e09 -//.word 0x67423e4e -//.word 0x0173eebb -//.word 0x87bdb89e -//.word 0x5b0caf51 -//.word 0xbfa6cf6c -//.word 0x3d008539 -//.word 0x46d67268 -//.word 0x197a6c04 -//.word 0xe66dc5a6 -//.word 0x332cd0e9 -//.word 0x804ca21d -//.word 0x26c91640 -//.word 0x859c142a -//.word 0x5e8b1207 -//.word 0x7e45da0a -//.word 0x9dae8e60 -//.word 0x8578ea63 -//.word 0x77f3ca11 -//.word 0xca26ecbc -//.word 0xd51ef602 -//.word 0x0f86bb00 -//.word 0x7578bac3 -//.word 0x2c93e7ff -//.word 0x684eaf04 -//.word 0x8c8b36ed -//.word 0x9370e31b -//.word 0xae721ee2 -//.word 0x2eb25881 -//.word 0xa58d4c58 -//.word 0x486e8555 -//.word 0x98e721b0 -//.word 0x4201d4d8 -//.word 0x43d030ad -//.word 0x4f4a23ef -//.word 0x7459c1f6 -//.word 0xfb2e43a4 -//.word 0x8fd95099 -//.word 0xa1167ca5 -//.word 0x0a6a0f83 -//.word 0xf26f07c4 -//.word 0xf16c6009 -//.word 0x75299275 -//.word 0x64025c62 -//.word 0x0239c053 -//.word 0x14914f2a -//.word 0x4618a69c -//.word 0xca4439e1 -//.word 0x42414fb0 -//.word 0xe08a4e6a -//.word 0xcbb73996 -//.word 0xc595778d -//.word 0x0c7cd676 -//.word 0x7dddcf75 -//.word 0xff1b0c20 -//.word 0x1f9c2733 -//.word 0xf81fb584 -//.word 0x56508339 -//.word 0x1b991f38 -//.word 0xe13c9adf -//.word 0xe09f8df6 -//.word 0x12e65ae1 -//.word 0x96c7b41a -//.word 0x539a62df -//.word 0xddb03f28 -//.word 0x9ce686dc -//.word 0x2b7a4c44 -//.word 0xfe1d4ec0 -//.word 0x4849edb9 -//.word 0x1bd477d6 -//.word 0xd1c6a873 -//.word 0xac68714f -//.word 0xb99df784 -//.word 0xfa75dfbd -//.word 0xc300c9a3 -//.word 0x65601a98 -//.word 0x0a22ffa8 -//.word 0xe0cfafbc -//.word 0x7abdf011 -//.word 0x732bdce9 -//.word 0x548de581 -//.word 0xb7251742 -//.word 0xadd39d3b -//.word 0x5e2e87cf -//.word 0xefd3caab -//.word 0xa9fe88fc -//.word 0x575792de -//.word 0xef0e2c17 -//.word 0x75291005 -//.word 0x1d1db5d5 -//.word 0xb09cd0f6 -//.word 0x30af1ccd -//.word 0xbf0456ab -//.word 0xbd898cfc -//.word 0x313a98c1 -//.word 0x6a36e840 -//.word 0xe61980f9 -//.word 0x728641dd -//.word 0x93036bbb -//.word 0x250a61fb -//.word 0x425cac8e -//.word 0x65994325 -//.word 0xcf0e09a1 -//.word 0x2ace98cb -//.word 0x6d043d46 -//.word 0xff8743c2 -//.word 0x1faf7571 -//.word 0x8368debf -//.word 0x3f84d33e -//.word 0xe95634df -//.word 0xfb7cee68 -//.word 0x78fcc422 -//.word 0xd39350d2 -//.word 0x0c4944eb -//.word 0x1c49f602 -//.word 0x93f01c82 -//.word 0x8024d3a1 -//.word 0x91e7e793 -//.word 0x7b2b4efd -//.word 0x9ce8f5ac -//.word 0xdf6dc087 -//.word 0xe1f4ccc2 -//.word 0x5278f755 -//.word 0x9dcba2ad -//.word 0xcbe3b5a1 -//.word 0xa474e4a7 -//.word 0x18c53148 -//.word 0xdebcb2d1 -//.word 0x5b3a954c -//.word 0xc5af61ae -//.word 0x88e57e52 -//.word 0xe920f8a6 -//.word 0xe9698025 -//.word 0x6c27b485 -//.word 0x9aefa031 -//.word 0x869d84f9 -//.word 0x0da4d708 -//.word 0x02a28d17 -//.word 0x883896e1 -//.word 0xbe18a7d7 -//.word 0xa25f3c14 -//.word 0x2f26de93 -//.word 0xc953a1a0 -//.word 0xdbb5f28c -//.word 0xbf518fa5 -//.word 0xdef6d765 -//.word 0x181844ea -//.word 0x66db36a6 -//.word 0xbd6df258 -//.word 0x3699ea3b -//.word 0x6d993f7d -//.word 0x262c84f2 -//.word 0x37e9c50a -//.word 0xa2d3c701 -//.word 0x012d9255 -//.word 0x27902d7d -//.word 0x043aa9d8 -//.word 0xc9a960e4 -//.word 0x4d697fb0 -//.word 0xaf2ac294 -//.word 0x3e157f1f -//.word 0x9560e651 -//.word 0x0a20870a -//.word 0x4a5f15c3 -//.word 0x3d6f697c -//.word 0x307dc9f5 -//.word 0x32696b21 -//.word 0xbed635d8 -//.word 0x9b7dc7cc -//.word 0x01c6bbbe -//.word 0xfd992bf2 -//.word 0x167174e0 -//.word 0x31b33a2c -//.word 0xb23fadd8 -//.word 0xe4440ab9 -//.word 0x9b586427 -//.word 0x18c8a4f9 -//.word 0x2c2ccfb1 -//.word 0xa13f87f3 -//.word 0xd5eed53c -//.word 0xa8af25d0 -//.word 0x981492f4 -//.word 0x2ba0645e -//.word 0x8ed9d7ea -//.word 0x7b9e1f8e -//.word 0x5fbba890 -//.word 0xbdbba2f6 -//.word 0xcdfebd3f -//.word 0x6a0b3150 -//.word 0x2b2602b1 -//.word 0xcf2682f9 -//.word 0xde811787 -//.word 0x8da93e73 -//.word 0xe29bd0c4 -//.word 0x1ab485e4 -//.word 0x48c7b651 -//.word 0x3e6e6794 -//.word 0xb09d8477 -//.word 0x977d6b73 -//.word 0xd477ab68 -//.word 0x168e0b91 -//.word 0xfdf3cfb6 -//.word 0x80d336a3 -//.word 0x8c7447da -//.word 0xed80cd85 -//.word 0x72a1a1ae -//.word 0x4c4d27b2 -//.word 0xb8e41bf3 -//.word 0xdef88ece -//.word 0xf8eb2bcd -//.word 0xb6c0bf1d -//.word 0xe12bf942 -//.word 0x40ea6e09 -//.word 0xb858dfbe -//.word 0xb640bfa0 -//.word 0xd2eff092 -//.word 0xac8dce13 -//.word 0x1aad6e70 -//.word 0x86222738 -//.word 0x911452f1 -//.word 0xfc544f09 -//.word 0xc9edc910 -//.word 0x9dfc3a24 -//.word 0x69c1b1ac -//.word 0x49f5d349 -//.word 0xad5e1f09 -//.word 0xb6a277de -//.word 0xe359dc4f -//.word 0xec657a6e -//.word 0xee86e40a -//.word 0xc929a025 -//.word 0xc681e6a8 -//.word 0x7ed9a556 -//.word 0xf729c7ff -//.word 0x0fe7b6f6 -//.word 0x1e1f1fc5 -//.word 0xd7c6f61e -//.word 0x6f4cba15 -//.word 0x0270fa8d -//.word 0x325818f0 -//.word 0x11e14d24 -//.word 0x4134edba -//.word 0x599aec68 -//.word 0x8b91a2b9 -//.word 0x841fcb03 -//.word 0x9466d29a -//.word 0x0f794f43 -//.word 0xf36eceeb -//.word 0xcab4d299 -//.word 0xd2a719a2 -//.word 0x5c62221c -//.word 0x72d4ed94 -//.word 0xbc170204 -//.word 0xa5fcb4ff -//.word 0xb9eba72f -//.word 0x51ea9001 -//.word 0x73fb3c9f -//.word 0xf4abd41f -//.word 0xdfe85ff9 -//.word 0x1b1388bf -//.word 0x4756a108 -//.word 0xe938e9ae -//.word 0xc86e0a39 -//.word 0x96f4e69a -//.word 0xd25d931d -//.word 0xed68a499 -//.word 0xacd3abe9 -//.word 0xcd74fca0 -//.word 0xed85b3f9 -//.word 0xa940f80d -//.word 0x04ac8149 -//.word 0x08b6591e -//.word 0xb183e0fa -//.word 0x06051478 -//.word 0x89cc0ed4 -//.word 0xd11fcfa1 -//.word 0x764c3dbe -//.word 0x2d3c6986 -//.word 0x344a1347 -//.word 0xf15570f5 -//.word 0xd6142b20 -//.word 0x87aaa924 -//.word 0x3f7b91a0 -//.word 0x703d8c29 -//.word 0xa952493f -//.word 0xbd55c57f -//.word 0x22f3c91b -//.word 0x97fcb488 -//.word 0x09b97a76 -//.word 0xb881ed05 -//.word 0x96873b36 -//.word 0xeff6b89f -//.word 0x4f40de64 -//.word 0xa1b29262 -//.word 0x944da9ad -//.word 0x43d1ab3d -//.word 0x141ad7e4 -//.word 0xe0af6783 -//.word 0x5599157e -//.word 0x9971dd6d -//.word 0x30bd0515 -//.word 0x207d5b96 -//.word 0x5300bee5 -//.word 0x3cfcdf7d -//.word 0xbede4952 -//.word 0x495f9f07 -//.word 0x46582560 -//.word 0xb5d782fa -//.word 0x1472c53a -//.word 0x83dba583 -//.word 0x27b50dac -//.word 0xcca6d8b1 -//.word 0xceaed9a8 -//.word 0x39b71ef7 -//.word 0x2f6d75c5 -//.word 0x8a4f30ae -//.word 0xc30626bb -//.word 0x13f6fa91 -//.word 0xd714a0e8 -//.word 0x39f71c3f -//.word 0x0d318dce -//.word 0xf9df6bbd -//.word 0xd97f0d93 -//.word 0x61026ef1 -//.word 0x04223080 -//.word 0x15f6e128 -//.word 0x2dc47e83 -//.word 0xcc163591 -//.word 0x43106fad -//.word 0xd1000ebf -//.word 0x0c37f3b4 -//.word 0x8218c42b -//.word 0xa16eec71 -//.word 0xd403e3b0 -//.word 0xef6eaf63 -//.word 0xcd2cab0d -//.word 0x37f2872b -//.word 0x08429067 -//.word 0x8f3d310e -//.word 0x35b8bac4 -//.word 0x60916177 -//.word 0x97438791 -//.word 0xe6b93c72 -//.word 0x8460041d -//.word 0xb380db31 -//.word 0xe8cc781c -//.word 0x2c38cf8b -//.word 0xc20ad924 -//.word 0x0a349778 -//.word 0xa5e15533 -//.word 0xda4e2c96 -//.word 0x38dbca28 -//.word 0x7d6276a8 -//.word 0xb7c74e45 -//.word 0xa9d0d312 -//.word 0x7037a8b4 -//.word 0x67fe975d -//.word 0x4703d5ff -//.word 0x93d487b9 -//.word 0x33c48496 -//.word 0x5e3f5d76 -//.word 0xbe5a9b4c -//.word 0xcfae478a -//.word 0x8967b0da -//.word 0x3e98680f -//.word 0xc5d2905b -//.word 0xd8f455c2 -//.word 0xbb44bbce -//.word 0x1ebf9a85 -//.word 0x45aee598 -//.word 0x667a32dd -//.word 0x53c177ff -//.word 0x58a91275 -//.word 0x67750db0 -//.word 0x72569f99 -//.word 0x1983f63a -//.word 0x858b33bb -//.word 0x94eab791 -//.word 0x36db9df2 -//.word 0x176e878c -//.word 0x7eda9e76 -//.word 0x7514d467 -//.word 0x2aa16d26 -//.word 0x95a8bd41 -//.word 0x5b4b3302 -//.word 0xf237969f -//.word 0x067a8fb1 -//.word 0x1c9668e7 -//.word 0x76d313fc -//.word 0x36d96ee6 -//.word 0xc67dc551 -//.word 0x76dc984b -//.word 0x67a69f41 -//.word 0xa9bd0c2a -//.word 0xa0ff1002 -//.word 0xac5fa07a -//.word 0x083b79ee -//.word 0xf3ea6297 -//.word 0x0e94b102 -//.word 0x064610c0 -//.word 0x72458160 -//.word 0xffa3a09a -//.word 0xca1128cd -//.word 0x0df4b9ac -//.word 0xfebbd933 -//.word 0xf46f38e1 -//.word 0xcc8b3821 -//.word 0x8b0fac09 -//.word 0x44d0e046 -//.word 0x3d12db57 -//.word 0x4d58e0fa -//.word 0x887b3be4 -//.word 0x1ffa3ab5 -//.word 0x8191792b -//.word 0xc60d6296 -//.word 0x4e5ef58c -//.word 0xa5eec5dd -//.word 0xaa3143c9 -//.word 0xf17e3f71 -//.word 0x651dac8c -//.word 0x32a1a45b -//.word 0xe277acdf -//.word 0xc5c03849 -//.word 0x975c72b2 -//.word 0x5d47370c -//.word 0x90296259 -//.word 0x7d284e1b -//.word 0xec01960b -//.word 0x00571f0d -//.word 0x5e4b5964 -//.word 0x914cc122 -//.word 0xae30abe3 -//.word 0x33843ebb -//.word 0x3521c06d -//.word 0xbb0014de -//.word 0x655080c9 -//.word 0x51c5b4b3 -//.word 0x3e320822 -//.word 0xf25a060a -//.word 0xda042888 -//.word 0xf14de2d2 -//.word 0xe242e36f -//.word 0x71ae99a3 -//.word 0x1731f32e -//.word 0xec926a36 -//.word 0xcb564281 -//.word 0xb0920de7 -//.word 0x64fd7207 -//.word 0x5d492c3a -//.word 0xdfb455c5 -//.word 0x68dae553 -//.word 0x4bcd76a2 -//.word 0x9b674a7c -//.word 0x4adf8ee9 -//.word 0x929be0a3 -//.word 0x944510ca -//.word 0x402123d9 -//.word 0x749e9ed9 -//.word 0x682b01d4 -//.word 0x494b918d -//.word 0x24ec5a6e -//.word 0x06f575c2 -//.word 0x621e8724 -//.word 0xb2048a37 -//.word 0x617dd098 -//.word 0xe9284411 -//.word 0x3949f410 -//.word 0x59d4cc57 -//.word 0x50c8a4f4 -//.word 0x46be7e74 -//.word 0xe6c20854 -//.word 0x066169b8 -//.word 0x8a03395f -//.word 0x857cd1d7 -//.word 0xa2ddc6ed -//.word 0xc390b068 -//.word 0xe7a430f7 -//.word 0x51653167 -//.word 0xe7306d19 -//.word 0xd88533b4 -//.word 0x815e6817 -//.word 0x92bfcd92 -//.word 0x6c8f7f55 -//.word 0xcea6c428 -//.word 0xb127045d -//.word 0x70101603 -//.word 0x2c0fbe5d -//.word 0x6f987393 -//.word 0x0f3465a6 -//.word 0x561cbea9 -//.word 0x5f06282f -//.word 0xc33f9000 -//.word 0x76fa2a10 -//.word 0xebe8b6b1 -//.word 0x7f080107 -//.word 0x14c1aebc -//.word 0xfc2e36f6 -//.word 0x1ab92e86 -//.word 0x43ebc963 -//.word 0xea829d56 -//.word 0xfdc4aaf6 -//.word 0x0a1498d7 -//.word 0xa6c340ff -//.word 0x0f286e99 -//.word 0x10f3e5ee -//.word 0x25bea490 -//.word 0xe0e568d8 -//.word 0x8b987293 -//.word 0x0f2e8af9 -//.word 0x15bc44df -//.word 0x6ae7822d -//.word 0xa8f63a91 -//.word 0x132c7a75 -//.word 0xc154a92f -//.word 0xfe9d0f78 -//.word 0xeea89820 -//.word 0x74e0d400 -//.word 0x530a432f -//.word 0x931cd079 -//.word 0x27539b0c -//.word 0xcc80fb75 -//.word 0x34a3c4cb -//.word 0x64bac52a -//.word 0x5bdb9563 -//.word 0xf48190f2 -//.word 0x0d241c31 -//.word 0xe90c31cb -//.word 0xd3661872 -//.word 0x049872d5 -//.word 0xc7d27dcc -//.word 0xdbe593d6 -//.word 0x1959f3c6 -//.word 0x56b9c4b9 -//.word 0x8b32574b -//.word 0x345dad0b -//.word 0xf558392c -//.word 0x831be67d -//.word 0xc2095c9b -//.word 0x2bc67f64 -//.word 0x714939b0 -//.word 0x64327a3c -//.word 0x155d7de7 -//.word 0x3bb74c21 -//.word 0xd55086a0 -//.word 0x11b26054 -//.word 0x6d72ea9e -//.word 0x1c0494bd -//.word 0xabd3f089 -//.word 0xe491b963 -//.word 0xf3cc156c -//.word 0xc7c317f5 -//.word 0xbb778837 -//.word 0x7605e744 -//.word 0x0f32ae3e -//.word 0x7548d7c7 -//.word 0x0f219fb8 -//.word 0x9f818a16 -//.word 0x6ca9a742 -//.word 0xa028156f -//.word 0xeff5c659 -//.word 0x79bb8335 -//.word 0xf27430e3 -//.word 0x0039526b -//.word 0xe458cea7 -//.word 0x5da8f33d -//.word 0xc919bbd1 -//.word 0x8e8f4e78 -//.word 0xb8f1c86f -//.word 0xe47c3c0d -//.word 0x5c5ef9f6 -//.word 0x83800c92 -//.word 0x74a306bd -//.word 0xe6aeffc0 -//.word 0x5346da80 -//.word 0x59a0cbf6 -//.word 0x609317df -//.word 0x7df21bb5 -//.word 0x961890dd -//.word 0xc7c40d22 -//.word 0x0528cd62 -//.word 0x013cb387 -//.word 0x4f588bb9 -//.word 0xc80293d3 -//.word 0x2d053a13 -//.word 0x0dc32715 -//.word 0xe8cb7d02 -//.word 0x94ae5e05 -//.word 0xe00faefe -//.word 0x78fa197b -//.word 0x087757e4 -//.word 0xa45eaef5 -//.word 0x686cb971 -//.word 0x5b976915 -//.word 0x999f49cb -//.word 0xb2e60621 -//.word 0x4d812ef9 -//.word 0x118f3882 -//.word 0xc5c9c567 -//.word 0xb55b2546 -//.word 0x58f31d63 -//.word 0x3117e79e -//.word 0xf3bb7ba2 -//.word 0xe8130d60 -//.word 0x93a6d7bc -//.word 0x95a41885 -//.word 0xcd795dab -//.word 0xc3a2ffac -//.word 0x47bfed50 -//.word 0x55eaab96 -//.word 0x3c489bee -//.word 0xffdd7ca8 -//.word 0xfca530ad -//.word 0xcbe0c26d -//.word 0x69ada718 -//.word 0x96da4411 -//.word 0x7bfbb1a0 -//.word 0x90b9bde7 -//.word 0xbd6d3217 -//.word 0xc0ee5ae3 -//.word 0xcea6c135 -//.word 0x7dec3d20 -//.word 0xe18e2c17 -//.word 0xf5acfd5c -//.word 0x3dcdf2ba -//.word 0xaa2c2377 -//.word 0xbe53c785 -//.word 0xf0ebaff8 -//.word 0x52d313bd -//.word 0x716f9188 -//.word 0x7d43730e -//.word 0xaac03175 -//.word 0xd55d3608 -//.word 0x6beae730 -//.word 0x8721e29f -//.word 0x5a7f83cf -//.word 0xd052adab -//.word 0x7012c78c -//.word 0x85f40466 -//.word 0x7bbde844 -//.word 0x8bd408f1 -//.word 0x9b9c11f8 -//.word 0x5f000bcf -//.word 0xc550df50 -//.word 0x904b1768 -//.word 0x427de613 -//.word 0x40cb6888 -//.word 0x314c2ab0 -//.word 0xa75aeddd -//.word 0x01e9a7b9 -//.word 0x9018cb7d -//.word 0xf806ca63 -//.word 0xd9e7da5d -//.word 0xaf57f607 -//.word 0xf7ed26da -//.word 0x941400a3 -//.word 0x70166f34 -//.word 0x667ab35a -//.word 0x6090a90f -//.word 0xbc4a4df0 -//.word 0xf54d7df1 -//.word 0x7f48004f -//.word 0xf285c6c6 -//.word 0x6bbe7105 -//.word 0x2f31155f -//.word 0x92f63cc3 -//.word 0x18912eee -//.word 0xd9c46fdf -//.word 0x2aa7888b -//.word 0x79fa0ad3 -//.word 0x79b9d1b3 -//.word 0x80f186bc -//.word 0x2dd367c4 -//.word 0x4d064bdc -//.word 0xff42e082 -//.word 0x171b3818 -//.word 0xc11a8495 -//.word 0x67121f7b -//.word 0xd4b1ce09 -//.word 0x995646b1 -//.word 0xaf22eecc -//.word 0x5f52e78d -//.word 0x5fcc4a33 -//.word 0x3ef7b083 -//.word 0x01d0f876 -//.word 0x0f3b442f -//.word 0x4a96452f -//.word 0x7f94b9cc -//.word 0x004931df -//.word 0x8f8118be -//.word 0x7e56f16a -//.word 0x1502e009 -//.word 0x34f16c96 -//.word 0x391b83d7 -//.word 0x2490be8f -//.word 0xfa54e7f6 -//.word 0x676eb966 -//.word 0xa63ce657 -//.word 0xa6095f8d -//.word 0x65e1cf90 -//.word 0xa0a4685d -//.word 0xaf5ae35b -//.word 0xabc6c290 -//.word 0xd13ed915 -//.word 0x2bba0cc7 -//.word 0x6d2a5a40 -//.word 0x1d0d1b06 -//.word 0xf63f8501 -//.word 0x8f127533 -//.word 0x38a16da3 -//.word 0x2461d89a -//.word 0xcef99612 -//.word 0x9554b46c -//.word 0xa9f47b61 -//.word 0x2b89ad3b -//.word 0x90c20b45 -//.word 0x47631a80 -//.word 0x9b982797 -//.word 0xda888915 -//.word 0xb72e26d6 -//.word 0xed6439bb -//.word 0x254152a2 -//.word 0x1aa59e96 -//.word 0xfb126842 -//.word 0x11bee0ac -//.word 0xa1e61b20 -//.word 0x14645c69 -//.word 0x55849248 -//.word 0x7b14211e -//.word 0xa8bae5ec -//.word 0x308b747d -//.word 0xfed8a4e2 -//.word 0x344b4e1f -//.word 0x12335124 -//.word 0x191dd9ff -//.word 0x70a4e14f -//.word 0x868af6fc -//.word 0xf9073e25 -//.word 0xb760ba5a -//.word 0x63bcc80c -//.word 0xfa34ec41 -//.word 0xb629cf8c -//.word 0x32da883d -//.word 0xd0351bd5 -//.word 0x58ee3fbd -//.word 0xe1cf6537 -//.word 0xf54ff594 -//.word 0xf065dba8 -//.word 0xa99e427b -//.word 0x546e9f41 -//.word 0xa7c3f28c -//.word 0x3ce049c1 -//.word 0x376985c8 -//.word 0x28ba6008 -//.word 0x337daf93 -//.word 0x6e7ce59d -//.word 0x8ab3d933 -//.word 0xb6aac92a -//.word 0xc0029e55 -//.word 0x7d4d71fb -//.word 0x6c234f87 -//.word 0x96723982 -//.word 0xb8156fbf -//.word 0xa4a8efd5 -//.word 0xe59b38d2 -//.word 0xa286532e -//.word 0xc5bc14fe -//.word 0x5b239e6a -//.word 0x3e432561 -//.word 0xf29cf88c -//.word 0xce3dbe80 -//.word 0x5c92ff37 -//.word 0x027ee7c1 -//.word 0xe1a94737 -//.word 0xfd1cddf1 -//.word 0x9e0bd5f8 -//.word 0xf7f18fbe -//.word 0x06e3a30d -//.word 0xbb1d233e -//.word 0x5ce220ab -//.word 0x28836f67 -//.word 0x3bbdac2c -//.word 0xb1478094 -//.word 0x0eac208c -//.word 0xde571606 -//.word 0x98ec44ef -//.word 0xc8df2661 -//.word 0x6d3f5719 -//.word 0xa0d2572b -//.word 0x77678bf4 -//.word 0x29688551 -//.word 0x73af860e -//.word 0x3a9a41a2 -//.word 0x7162e219 -//.word 0x3da84f51 -//.word 0x5751ae69 -//.word 0xb3942777 -//.word 0x5f51eb79 -//.word 0xada5758f -//.word 0x94bb1067 -//.word 0x54e599f8 -//.word 0x59eb8673 -//.word 0x62a32776 -//.word 0xe2c12c83 -//.word 0xa6f168b2 -//.word 0xb923d4a2 -//.word 0x8526d7b5 -//.word 0x3a79c47d -//.word 0x745ea571 -//.word 0x182f37e5 -//.word 0x7ef53539 -//.word 0xd637d950 -//.word 0xc410a143 -//.word 0x4e844f57 -//.word 0xf814332d -//.word 0x2d90ac39 -//.word 0xe12ded75 -//.word 0x75d8fd57 -//.word 0xdbc90100 -//.word 0xfa5abeb6 -//.word 0x541a5a94 -//.word 0xe61d6280 -//.word 0x4f97125e -//.word 0x35a9d083 -//.word 0xe57bf96d -//.word 0x398be0b1 -//.word 0xbf451434 -//.word 0x17d3e29e -//.word 0x9d361b0c -//.word 0x49961806 -//.word 0xd3d6fab0 -//.word 0x1a6c3644 -//.word 0xc67052bf -//.word 0x2cf2e9db -//.word 0x7391f53e -//.word 0xf5494ef1 -//.word 0xe88d6d13 -//.word 0x3e9676cf -//.word 0xc9fa768b -//.word 0xa380e862 -//.word 0xcd337fd5 -//.word 0x16b51fbd -//.word 0x3fd62c84 -//.word 0x5c650895 -//.word 0x7d47d711 -//.word 0x8ec586c4 -//.word 0x7c2a0b57 -//.word 0x9a8eeec7 -//.word 0x42ed0816 -//.word 0xbf7c8b40 -//.word 0x6a3c4270 -//.word 0x14cf1a74 -//.word 0xa48be26e -//.word 0x01cd4fcd -//.word 0x338f437c -//.word 0xc53d4e59 -//.word 0x6dc576e9 -//.word 0xefee334a -//.word 0x3eeabe69 -//.word 0xe42e8b75 -//.word 0xa5811493 -//.word 0x5f53d9d3 -//.word 0x3551a562 -//.word 0xec361202 -//.word 0x95e44fb8 -//.word 0x6db321c4 -//.word 0x010928d6 -//.word 0x962b647f -//.word 0xc752f8e6 -//.word 0x70022dbc -//.word 0xcb97b972 -//.word 0xd92142a9 -//.word 0x04711eea -//.word 0x02745d97 -//.word 0xfcc00921 -//.word 0xf06dac7c -//.word 0x542613d0 -//.word 0xfc7f5272 -//.word 0x3d890812 -//.word 0x53a5e436 -//.word 0x009568e7 -//.word 0x76d9eda9 -//.word 0x7738e8b1 -//.word 0xbb9d6b53 -//.word 0x9224efba -//.word 0xca7550db -//.word 0xd35119ab -//.word 0x216a0290 -//.word 0xd278b716 -//.word 0x9189dbe4 -//.word 0xba984dee -//.word 0xbe62aaec -//.word 0xca75130a -//.word 0xa38a30e1 -//.word 0xd51474a6 -//.word 0x0c19a3a1 -//.word 0xc24192e1 -//.word 0x1a2d2f2f -//.word 0x0c09c040 -//.word 0xc365702f -//.word 0x4340072a -//.word 0x4f66f96b -//.word 0x8afda269 -//.word 0xdc5ad050 -//.word 0x171982af -//.word 0xdb6cef71 -//.word 0xb7b3ca0f -//.word 0x904dc504 -//.word 0x47ae5480 -//.word 0x96b2b360 -//.word 0x3b312a5e -//.word 0x59d49085 -//.word 0x1b270ee9 -//.word 0x9aef2594 -//.word 0x01bdf2c3 -//.word 0xefc3b153 -//.word 0x1ce78176 -//.word 0x401666aa -//.word 0x30db94ec -//.word 0x4a30eb28 -//.word 0x1494bef5 -//.word 0x205dd87f -//.word 0x3350c1c4 -//.word 0xa56f3d04 -//.word 0x0b121672 -//.word 0x14391b30 -//.word 0xb121697a -//.word 0x7915e922 -//.word 0x4b871a3c -//.word 0x355f111a -//.word 0x9493be7b -//.word 0x7df870ff -//.word 0x5c589bde -//.word 0xdbc4dada -//.word 0x062b3072 -//.word 0xac2c9359 -//.word 0x0829ab26 -//.word 0xa09dd74d -//.word 0x6eaf714e -//.word 0x3e07532c -//.word 0x57e09921 -//.word 0x5d5ea990 -//.word 0x7622713b -//.word 0xac1df0b6 -//.word 0x93a1f81c -//.word 0x2bbe3200 -//.word 0x07cb62a6 -//.word 0xaf43ec73 -//.word 0x44d398a3 -//.word 0x62b0923a -//.word 0x4a2eb53d -//.word 0x418f0821 -//.word 0x33188984 -//.word 0x9c6b2a1b -//.word 0xa9101aec -//.word 0x9a5545bd -//.word 0x6a581ecc -//.word 0xb2629cc0 -//.word 0xcb7682e0 -//.word 0x322ae483 -//.word 0x31b6e7c7 -//.word 0xbc4bc886 -//.word 0x9aa62086 -//.word 0xc5e466f0 -//.word 0x1298b504 -//.word 0x141bcf0a -//.word 0x3e23638c -//.word 0x49978bc2 -//.word 0xd5a2994e -//.word 0x5307132a -//.word 0x22b4fcde -//.word 0xf89955f6 -//.word 0x84bae4b3 -//.word 0x52833401 -//.word 0xee5cdda9 -//.word 0x4c7e05c8 -//.word 0x67052780 -//.word 0x294614ed -//.word 0x8b62375a -//.word 0xfd1c1cb5 -//.word 0x08e73441 -//.word 0x3243d28b -//.word 0x224a7a9f -//.word 0x04865b7b -//.word 0x2f061ac4 -//.word 0x05b1d1b8 -//.word 0x1bda5864 -//.word 0x9b14c317 -//.word 0xe6472b16 -//.word 0x7d03b291 -//.word 0x2115c1d6 -//.word 0x395894c5 -//.word 0x75cef984 -//.word 0xb1ef5474 -//.word 0x1c41e763 -//.word 0x99295003 -//.word 0x6501539a -//.word 0xfa6adafc -//.word 0x34e43ab7 -//.word 0xb39cb88d -//.word 0x80844c27 -//.word 0xf3a9a507 -//.word 0xd4c26cbf -//.word 0xc004cd60 -//.word 0xce3e3436 -//.word 0x732154b2 -//.word 0xa3df6ea8 -//.word 0x39f9d0bb -//.word 0x99519c15 -//.word 0x9487ca5b -//.word 0x8c8270df -//.word 0xd84d4118 -//.word 0x69255450 -//.word 0xaed0289d -//.word 0xb630e412 -//.word 0x9517e336 -//.word 0x085d6fb5 -//.word 0x5c30cd56 -//.word 0x8bac7b2d -//.word 0xa9abb512 -//.word 0x7edf3d52 -//.word 0x751e5ca4 -//.word 0xb5fc245e -//.word 0x8d9ff9e8 -//.word 0x15cf5071 -//.word 0x124db5e2 -//.word 0x1b661310 -//.word 0xfac73036 -//.word 0x559377a2 -//.word 0x8eb3faae -//.word 0xe76eb7f2 -//.word 0xea391ab8 -//.word 0x08d0c4b0 -//.word 0x80858be6 -//.word 0x82d8c2f0 -//.word 0x9449ba6c -//.word 0x366a88aa -//.word 0xc13809a5 -//.word 0x95ab2438 -//.word 0x738c4f8e -//.word 0x288755db -//.word 0x6c815649 -//.word 0x092c0f36 -//.word 0x40d85b9c -//.word 0x688cfad0 -//.word 0xd8559270 -//.word 0x07def396 -//.word 0xf2419f52 -//.word 0xbe1d8a58 -//.word 0x9fe91ef5 -//.word 0xf8878248 -//.word 0xc41c1cae -//.word 0x3420557e -//.word 0x99b19cf7 -//.word 0x852dad76 -//.word 0x2dff13ec -//.word 0x12b9eb90 -//.word 0xe164ecd1 -//.word 0x9713a48f -//.word 0xe8bf048a -//.word 0xe24e1f1b -//.word 0xcef52f22 -//.word 0x57c0d93f -//.word 0xee6fb245 -//.word 0x6c8401eb -//.word 0xf99ac7c5 -//.word 0x2df8fc73 -//.word 0x76661c19 -//.word 0xba40e20f -//.word 0x3dc853d9 -//.word 0xc4c0ff59 -//.word 0xfb398443 -//.word 0x14a653d2 -//.word 0xb134b7b9 -//.word 0x045e135d -//.word 0x34bb6b41 -//.word 0x031b25c1 -//.word 0xafd31104 -//.word 0x1555a82c -//.word 0x1c0491cf -//.word 0x51466aab -//.word 0xcfdac495 -//.word 0x626c6fb3 -//.word 0xec66f9eb -//.word 0x070a719b -//.word 0xebbe708b -//.word 0x93a65b20 -//.word 0x1b78e2d2 -//.word 0x6d8cccdf -//.word 0x1c33f741 -//.word 0x904a9ade -//.word 0x640fce00 -//.word 0x0c334d04 -//.word 0xbb307956 -//.word 0x83dca09d -//.word 0xbf3e7e32 -//.word 0xaea103d7 -//.word 0x60e857a6 -//.word 0xd6211c47 -//.word 0x655df366 -//.word 0x5bbe4164 -//.word 0xe5d1334d -//.word 0x301eff0b -//.word 0xcffe6dd9 -//.word 0x5dad97fa -//.word 0x63a0ecaa -//.word 0x7b197b55 -//.word 0xb6f86f07 -//.word 0x3cd4d524 -//.word 0x324aa659 -//.word 0xe19501d2 -//.word 0x145fb8ad -//.word 0xc1d70eaf -//.word 0xec04bf36 -//.word 0xc959416f -//.word 0x21894ac9 -//.word 0xf69d92aa -//.word 0x6a43da60 -//.word 0xdd692d5a -//.word 0x560a6698 -//.word 0x2448f260 -//.word 0xc5bcd733 -//.word 0x060af5ff -//.word 0x6cb88c96 -//.word 0xd340ff5f -//.word 0x5563d84b -//.word 0x6dc10b0b -//.word 0x5ca77f81 -//.word 0xcc28ca74 -//.word 0xb46f3d87 -//.word 0x7b53206c -//.word 0x602c3e55 -//.word 0x19e5a5ab -//.word 0xba53a703 -//.word 0xd9c5244e -//.word 0xf0dd0c4f -//.word 0x029e1f53 -//.word 0x82c5f71c -//.word 0x705d491e -//.word 0xc58e68ee -//.word 0x11b60af7 -//.word 0x63bb4f6f -//.word 0x699fff89 -//.word 0xd85413ec -//.word 0x0ed27865 -//.word 0xf7680fd8 -//.word 0x2d4ff87d -//.word 0x63851048 -//.word 0x03d8b8a9 -//.word 0x1641d976 -//.word 0x65742526 -//.word 0xddb59f3f -//.word 0x38ed5d11 -//.word 0xdafd8ca5 -//.word 0xf952b6f1 -//.word 0x01ba404d -//.word 0x3776372b -//.word 0x9c904c02 -//.word 0x146f1c8b -//.word 0xc7a8b530 -//.word 0xc81756c2 -//.word 0xf52f776a -//.word 0x1e8e09e2 -//.word 0x69d4ffe4 -//.word 0xf4b60de3 -//.word 0xbd4eb0fa -//.word 0xbfb56e22 -//.word 0x5ed45fa7 -//.word 0x0577ecdd -//.word 0x0ea3d70f -//.word 0xe22a7cb8 -//.word 0x617c56f5 -//.word 0x84c0c43b -//.word 0x40240d45 -//.word 0xae71a251 -//.word 0x6ae2a48c -//.word 0x3936a6cb -//.word 0xee04b47b -//.word 0x8e4f94db -//.word 0xb25a4b69 -//.word 0x2dbde499 -//.word 0xefb96ccd -//.word 0x29c94182 -//.word 0xb2798dc7 -//.word 0xaa7b0df4 -//.word 0x5df81798 -//.word 0x6924dbb3 -//.word 0x2415e926 -//.word 0x38d5f367 -//.word 0x90b6d479 -//.word 0x78e5d21c -//.word 0xff422041 -//.word 0xa06fa7c0 -//.word 0x2227074d -//.word 0xbdd2d8a9 -//.word 0x7e563515 -//.word 0xed2f7b0c -//.word 0xecc24e31 -//.word 0xe2eedd87 -//.word 0x19e567e0 -//.word 0x653aff98 -//.word 0x073b8c82 -//.word 0xd0801323 -//.word 0x8ac4391e -//.word 0x93f403f0 -//.word 0xcb86e1dd -//.word 0xb00ceb2a -//.word 0xc8096a8d -//.word 0x40039ae2 -//.word 0xd2d9ae1f -//.word 0xec57158a -//.word 0x0e08fc2a -//.word 0x734b147b -//.word 0xf5a99566 -//.word 0x2b66836f -//.word 0xd4563031 -//.word 0x78f20207 -//.word 0x4cab760d -//.word 0x577f6547 -//.word 0xd3c9861f -//.word 0xd65d3515 -//.word 0x31d472b2 -//.word 0x98252dbd -//.word 0x0476c1b2 -//.word 0x5631be70 -//.word 0x3d59eb32 -//.word 0x591f8bc0 -//.word 0xa1b0e0e7 -//.word 0x0252ee26 -//.word 0x48af81aa -//.word 0x4270717d -//.word 0x210e25fa -//.word 0x22e55684 -//.word 0x6d8b1577 -//.word 0x3c5f105f -//.word 0x3f651168 -//.word 0x4051c716 -//.word 0x03e1c936 -//.word 0x7070d815 -//.word 0xf3c964ef -//.word 0x243952aa -//.word 0xa3e8fdc4 -//.word 0x46687b8b -//.word 0x778f218c -//.word 0xd782494d -//.word 0x2813523f -//.word 0x694de9ee -//.word 0x424c877b -//.word 0xa3533b4c -//.word 0xa918aa02 -//.word 0xc16254ab -//.word 0x0fd61939 -//.word 0x110efb34 -//.word 0x7fec25ab -//.word 0x762e2d70 -//.word 0xd6429685 -//.word 0xe95b99d1 -//.word 0x45c42417 -//.word 0xf3752429 -//.word 0xd0e40059 -//.word 0x341d6531 -//.word 0xd2154964 -//.word 0xdf3b2a03 -//.word 0x775197f4 -//.word 0x3c7af2a1 -//.word 0x409474ed -//.word 0x25c7716c -//.word 0x825eded3 -//.word 0x89d610ad -//.word 0xe735c650 -//.word 0xec9e6a10 -//.word 0xec2194b2 -//.word 0xe5d7d024 -//.word 0x612fa16b -//.word 0x9e83c6dc -//.word 0xedefbb8f -//.word 0x58628311 -//.word 0x87f5a559 -//.word 0xe57c75fd -//.word 0xfe5b94a6 -//.word 0x2b9cbac2 -//.word 0x723eb378 -//.word 0xa8cfa8e1 -//.word 0xd83da075 -//.word 0xe9e946c3 -//.word 0x7afded66 -//.word 0x1100d134 -//.word 0x75a7a0b8 -//.word 0x58ee39e3 -//.word 0x3968b3fe -//.word 0x89d3a1e3 -//.word 0x0df0946d -//.word 0x8392e22d -//.word 0x88f4a65e -//.word 0xb94f081b -//.word 0x19acbfd0 -//.word 0xb3f7d4ef -//.word 0x8056a8e4 -//.word 0x8ab9384a -//.word 0x52b1a05f -//.word 0x6f85deb5 -//.word 0x7983d92b -//.word 0x2594a21c -//.word 0xb113f9d6 -//.word 0x83df134e -//.word 0x0daf9a12 -//.word 0xf3a6f67e -//.word 0x7028cb33 -//.word 0xf6ebc2c5 -//.word 0x14518db4 -//.word 0x9df5259e -//.word 0x078356b2 -//.word 0x11ce7e68 -//.word 0xa81c926f -//.word 0x0cc461e7 -//.word 0x2ffc1dd1 -//.word 0x5eec17c4 -//.word 0x2207cae1 -//.word 0x699a1b09 -//.word 0xe1a5df4d -//.word 0xa5eb9ea5 -//.word 0x1b4596e5 -//.word 0x1c3b03ee -//.word 0x56d59e21 -//.word 0xefaf641a -//.word 0x6b4c989a -//.word 0xd0ac0bc4 -//.word 0x08219b8d -//.word 0x865efa6e -//.word 0x2dd1b15b -//.word 0x6d3364f9 -//.word 0xaf5d570c -//.word 0xf35d312e -//.word 0xb7c900c7 -//.word 0x1b537e39 -//.word 0x449e935b -//.word 0xfe501a29 -//.word 0xa569e8ba -//.word 0x45d30a72 -//.word 0x00394f78 -//.word 0xb01d076a -//.word 0xce250950 -//.word 0x93b6fbcf -//.word 0x5cc4cda0 -//.word 0x53e98740 -//.word 0x4cb445e8 -//.word 0xed437fbf -//.word 0x12148e4f -//.word 0x6f186c35 -//.word 0x7809bc1d -//.word 0x7dfe0aee -//.word 0x1a3d5342 -//.word 0xce50c819 -//.word 0xea5bcfce -//.word 0xadac4b4a -//.word 0xad941d77 -//.word 0x7875ebf7 -//.word 0x7c1d1f17 -//.word 0x245233fe -//.word 0x44ae2d2b -//.word 0xb7ae651e -//.word 0x47058e54 -//.word 0xcc36f479 -//.word 0x986103da -//.word 0x135d0919 -//.word 0xa3083d24 -//.word 0xcfdbff67 -//.word 0xa3c26141 -//.word 0x562ae7b5 -//.word 0x2a5b8b63 -//.word 0x940804b6 -//.word 0x9d24485e -//.word 0x88f85001 -//.word 0xb5731b2d -//.word 0xc5c1f592 -//.word 0xff1ff96e -//.word 0xf2edd548 -//.word 0x5c04cde1 -//.word 0x4b4b0368 -//.word 0x8285f5ed -//.word 0x1e6d4718 -//.word 0x7a05c31b -//.word 0x4f2b9ee5 -//.word 0x206dfc98 -//.word 0xd51eb73e -//.word 0xa6a95cb8 -//.word 0x3a2677f6 -//.word 0x102b116e -//.word 0x1fe576c6 -//.word 0xb9673cd4 -//.word 0xb54180c9 -//.word 0xcd5573a9 -//.word 0x45e616ff -//.word 0xcef241ce -//.word 0xa9c2eaca -//.word 0x0fbfa4c8 -//.word 0xd1876674 -//.word 0x3c408e42 -//.word 0x3f2d25a7 -//.word 0xd07e6588 -//.word 0x8b6d78f3 -//.word 0x9c86830d -//.word 0xe046e34b -//.word 0x47e8b7e5 -//.word 0x7d7c9e88 -//.word 0xc939c24c -//.word 0x351415e5 -//.word 0xef92da1d -//.word 0xefda6882 -//.word 0xda0e2a5b -//.word 0x26dbebe1 -//.word 0x804f50ac -//.word 0x6aeba66c -//.word 0x29faded9 -//.word 0xde21d6ed -//.word 0xf336db50 -//.word 0xb8556b14 -//.word 0x4e313fa2 -//.word 0xc5a989f4 -//.word 0x819c7a05 -//.word 0xe2fd0786 -//.word 0x242aedd3 -//.word 0x8379f225 -//.word 0xa3146e09 -//.word 0x30080b11 -//.word 0xc198c9c9 -//.word 0x03d745ec -//.word 0x13763ad8 -//.word 0x2bda4840 -//.word 0x8171f421 -//.word 0x6c47f1f7 -//.word 0xc9d49e30 -//.word 0x9d19cfe1 -//.word 0xfcebd0b8 -//.word 0x298ea732 -//.word 0xfe859a0d -//.word 0x8ea9f101 -//.word 0x0a79fdab -//.word 0xe1b159ca -//.word 0x2b1e70ad -//.word 0x48b03fec -//.word 0xc4d15d57 -//.word 0x7ef5382c -//.word 0x0a72a18d -//.word 0x53938b30 -//.word 0x85e70f59 -//.word 0x2adfb405 -//.word 0x9398ee68 -//.word 0x79f6e49a -//.word 0xe4f2768e -//.word 0x4c357f43 -//.word 0xfee5573e -//.word 0xc2bf9d37 -//.word 0xbb663313 -//.word 0x8efa8912 -//.word 0xc7ed1f4a -//.word 0x78124554 -//.word 0x22f72645 -//.word 0xd97504df -//.word 0xa485c509 -//.word 0x2355af7d -//.word 0x749c70c1 -//.word 0x562a6158 -//.word 0x8fc30b39 -//.word 0x8c2deb80 -//.word 0x48887264 -//.word 0x6fde5069 -//.word 0xc2fbf2d6 -//.word 0xbd7f496a -//.word 0x7731ce4b -//.word 0xcb96c33f -//.word 0xb5c3bb1e -//.word 0xfe6f5c88 -//.word 0x1c4c64d3 -//.word 0x5498ea47 -//.word 0x21eee78e -//.word 0xd963f466 -//.word 0x8ece5599 -//.word 0x3267372f -//.word 0xff9436e2 -//.word 0x16ff22d2 -//.word 0x67ec037a -//.word 0xd0ca5ae3 -//.word 0x8907aa17 -//.word 0xbf2937d9 -//.word 0x7f1b0e93 -//.word 0xd6c44590 -//.word 0x37de846b -//.word 0x1c06c5c8 -//.word 0xf00f5741 -//.word 0x2d9c29a4 -//.word 0xc2ee455b -//.word 0xb7fa9b2b -//.word 0x13bf0022 -//.word 0xfed676ca -//.word 0x234baea3 -//.word 0x58abcbd0 -//.word 0x815e6911 -//.word 0xb137def1 -//.word 0x934abf41 -//.word 0x09fea7c4 -//.word 0x1263332c -//.word 0xf1c55145 -//.word 0x8c81bb71 -//.word 0x1217be54 -//.word 0xe08140d0 -//.word 0xa6c30134 -//.word 0xc5c421b0 -//.word 0xfc5ce30d -//.word 0x44aeb09a -//.word 0xf8b85f6a -//.word 0x3928b3bc -//.word 0x917125bb -//.word 0xd61fe468 -//.word 0x52671bd4 -//.word 0x20037292 -//.word 0xd93dd76c -//.word 0x71497e55 -//.word 0x5bd7269f -//.word 0xf4e99f6e -//.word 0x1ee2896d -//.word 0x2be05ebf -//.word 0xfe4cb339 -//.word 0x6cb0bace -//.word 0xe8c80c4a -//.word 0x60dba544 -//.word 0x624b304d -//.word 0x836c866e -//.word 0x019271d2 -//.word 0xa76eb5bf -//.word 0xf19a51cb -//.word 0x7172024c -//.word 0x71260910 -//.word 0xda0d2e4e -//.word 0x553c05dd -//.word 0xaf5870a4 -//.word 0x82a86552 -//.word 0x126ef14f -//.word 0x75787df2 -//.word 0xf7f251f4 -//.word 0xbc7e5624 -//.word 0xa787205d -//.word 0x7bd12bb5 -//.word 0x405565f8 -//.word 0xe94ded55 -//.word 0x338b1b56 -//.word 0xd00ec016 -//.word 0xc5d7afae -//.word 0x11f97cf0 -//.word 0x8ff08358 -//.word 0x1d332c3f -//.word 0xfe0d6e52 -//.word 0x7da89243 -//.word 0xd36b3abe -//.word 0x4b85a19f -//.word 0xa4ca2462 -//.word 0xb7bf02da -//.word 0x5af06026 -//.word 0x838a90e2 -//.word 0xb125929a -//.word 0x87e2db84 -//.word 0xbab6566e -//.word 0x2e05a9f5 -//.word 0x5c73b9f8 -//.word 0xf7f7704c -//.word 0xcf31beb1 -//.word 0xf5fddd05 -//.word 0x2048dab8 -//.word 0x4f225180 -//.word 0xb015784e -//.word 0xc1b55e80 -//.word 0xb5797558 -//.word 0x19c94fad -//.word 0xb758a5e0 -//.word 0xbbb49d12 -//.word 0x141c4c94 -//.word 0x1d917a9f -//.word 0x7d2fa646 -//.word 0x4cbe4aa8 -//.word 0x7785616a -//.word 0x655e2565 -//.word 0xda101d9b -//.word 0x1cd85770 -//.word 0x5549f317 -//.word 0x3957e14a -//.word 0xe8aeea3e -//.word 0x1648f5d6 -//.word 0x693e8317 -//.word 0x22de7ddc -//.word 0x00ff2fca -//.word 0x61919487 -//.word 0xab78d427 -//.word 0xea9b0be7 -//.word 0xbb374c1e -//.word 0x687ae670 -//.word 0x544de545 -//.word 0x9a71dc79 -//.word 0xf1cde256 -//.word 0xd306dbbf -//.word 0xde51f9ad -//.word 0x7a8582e0 -//.word 0xbc75d3ce -//.word 0x8a7ca5e0 -//.word 0x00598fdd -//.word 0x133dcca6 -//.word 0x74233f25 -//.word 0xb760b480 -//.word 0xb57b6992 -//.word 0x2f3ecd9b -//.word 0xb40d8736 -//.word 0xc477ba8c -//.word 0x350b87c8 -//.word 0xd66dd4cb -//.word 0x53a94c20 -//.word 0x58c6a732 -//.word 0xf99f2cbc -//.word 0x52ee7482 -//.word 0x6aaa703f -//.word 0x5e93aede -//.word 0xbb0bd7ec -//.word 0x2b277d4e -//.word 0x5406132f -//.word 0xfd613d3d -//.word 0x72644b15 -//.word 0x2abcfffb -//.word 0xa8f297cf -//.word 0x9ff7073c -//.word 0x59008733 -//.word 0x59934d98 -//.word 0x40e29c3b -//.word 0xed59fd09 -//.word 0xe873cd84 -//.word 0x01d1f770 -//.word 0x348d03cf -//.word 0xd0cc5010 -//.word 0xd9929d84 -//.word 0xaadbce11 -//.word 0xdee7ed2a -//.word 0x71d570fe -//.word 0x2373baf0 -//.word 0x1d55e448 -//.word 0xd724bc28 -//.word 0x39390ec1 -//.word 0x016a23c6 -//.word 0x64248821 -//.word 0xf8bb10e6 -//.word 0xd1fd1c85 -//.word 0xea0d1a43 -//.word 0xc76f4ceb -//.word 0x595fcbc0 -//.word 0x2267cbb7 -//.word 0x9a3020e3 -//.word 0xd0990231 -//.word 0x54060d55 -//.word 0x55fa8b04 -//.word 0x07e9f664 -//.word 0x4747b9c1 -//.word 0x82e53781 -//.word 0xd37d0e5a -//.word 0x6b8c9dc2 -//.word 0x365fc4a7 -//.word 0xbc71ea61 -//.word 0x45f445e5 -//.word 0x40ae553b -//.word 0xe506b232 -//.word 0x1a5f0852 -//.word 0x93a46012 -//.word 0x3e24a14b -//.word 0xdea156ed -//.word 0xf5a3b1f1 -//.word 0xe812d08e -//.word 0x5e0440b0 -//.word 0xe9d4c0a6 -//.word 0xe874471a -//.word 0xac044847 -//.word 0xd9a33466 -//.word 0x0f854169 -//.word 0xca456aec -//.word 0x877db669 -//.word 0x2995beab -//.word 0x9ad86985 -//.word 0xb5cdfbc3 -//.word 0x64c44e61 -//.word 0x05af5efb -//.word 0x13330c85 -//.word 0x02ff1b3c -//.word 0x6a5d7fdc -//.word 0x6806d714 -//.word 0x423b3837 -//.word 0x49112c34 -//.word 0x040dfac8 -//.word 0x8af028f2 -//.word 0x30d43fa8 -//.word 0x6478cec8 -//.word 0xd9d9b151 -//.word 0xe50293d3 -//.word 0x2724b224 -//.word 0x6ce9e255 -//.word 0xd306d5e4 -//.word 0x30109933 -//.word 0xaf906239 -//.word 0xba598a78 -//.word 0x1c19d62f -//.word 0x662ffbd0 -//.word 0x91bc61b4 -//.word 0xe6fd260e -//.word 0x1bd8661e -//.word 0xbfb4baa7 -//.word 0xd88efea2 -//.word 0xca495834 -//.word 0x7a4675de -//.word 0xb43516f4 -//.word 0xca2bcc50 -//.word 0x7ef4ff47 -//.word 0x22aa35dc -//.word 0xfe869134 -//.word 0xf2f79a4a -//.word 0x5df13fe4 -//.word 0x3d8817c6 -//.word 0x97bded25 -//.word 0x19987b5e -//.word 0xfe7776e8 -//.word 0x32a5cb87 -//.word 0xb62e29c3 -//.word 0x47f2bf99 -//.word 0x3af94770 -//.word 0xab06434f -//.word 0xd66f864c -//.word 0xc52bf748 -//.word 0x2c2d92d9 -//.word 0x91f0af88 -//.word 0xaf54873d -//.word 0x1da8f4f7 -//.word 0x2b0878c0 -//.word 0x0de981e1 -//.word 0x3bf2eb52 -//.word 0x170ec774 -//.word 0xd0bf5b02 -//.word 0x87b56945 -//.word 0xb19fb588 -//.word 0xbd41c1cc -//.word 0xf6c6dbbd -//.word 0xaa5859e4 -//.word 0x8cef241d -//.word 0x5766734c -//.word 0xb4d4d94c -//.word 0x5e198228 -//.word 0x84b7ba8e -//.word 0x6fe4ae80 -//.word 0x64dd774d -//.word 0xcc7c54c0 -//.word 0x920d3797 -//.word 0xcd5e8436 -//.word 0x9f15159d -//.word 0x5c468198 -//.word 0xef459e35 -//.word 0x7ab9447b -//.word 0x3df25459 -//.word 0xb97df9dd -//.word 0x15f52ea7 -//.word 0xc01b819c -//.word 0x582916df -//.word 0xcb64eefd -//.word 0xbcf16967 -//.word 0x28e90a26 -//.word 0x49b07bca -//.word 0xba82d1a3 -//.word 0xdd4e1034 -//.word 0x7ac8f2e5 -//.word 0xa8bae4f8 -//.word 0xf19a52be -//.word 0xb162240b -//.word 0xbf9c89e7 -//.word 0x4fbcf386 -//.word 0x17b3637b -//.word 0xb1c1e628 -//.word 0x418b5f79 -//.word 0x576d88d2 -//.word 0x17113445 -//.word 0x9741d709 -//.word 0x88f94727 -//.word 0x19c1c477 -//.word 0x183937cb -//.word 0x5af6b76a -//.word 0x5e8c51c0 -//.word 0x2dec0953 -//.word 0x84f11cf9 -//.word 0x35358849 -//.word 0xcb29ce4f -//.word 0x6d65f784 -//.word 0x053cd5fc -//.word 0xa1948be2 -//.word 0x19f45022 -//.word 0xf2df6f65 -//.word 0x82619242 -//.word 0x55e741b2 -//.word 0xd054a6c5 -//.word 0x14509394 -//.word 0x25e3c677 -//.word 0x4c446b78 -//.word 0xb9ebe207 -//.word 0x6dedc3ef -//.word 0x57891f88 -//.word 0xbdfe092e -//.word 0xdea055f3 -//.word 0xd62ba091 -//.word 0xc15791a3 -//.word 0x23ad5d14 -//.word 0x889891d7 -//.word 0x67bf0cd8 -//.word 0x4c924a33 -//.word 0x3623e9a5 -//.word 0x3e38653f -//.word 0x7a9e2762 -//.word 0x21c0bee7 -//.word 0xf0786c9e -//.word 0xcc24e4fa -//.word 0xa8fd520a -//.word 0xa9a49cab -//.word 0x88fee7fd -//.word 0x39425e13 -//.word 0xca502eef -//.word 0x8d45d5ad -//.word 0x794c9dfe -//.word 0xceb763d8 -//.word 0xf84e9d6c -//.word 0xb6e69c59 -//.word 0x7b360e1f -//.word 0x15e7c6d6 -//.word 0x8ceac020 -//.word 0x4d0e5f5c -//.word 0x87d2fa1c -//.word 0xd67797d9 -//.word 0x1f5af6e6 -//.word 0xbb81d2a3 -//.word 0xd77463f3 -//.word 0x1a4e27f0 -//.word 0x8913e2dd -//.word 0xa844e45b -//.word 0xe2b18ae0 -//.word 0x2b8f0766 -//.word 0xe4ca6460 -//.word 0xff9dc6f2 -//.word 0x635ff061 -//.word 0x92a008c9 -//.word 0x89749e0e -//.word 0xe80fea14 -//.word 0x52925533 -//.word 0x17253ce5 -//.word 0x1046f0c2 -//.word 0xcb6001af -//.word 0xe8a0bc52 -//.word 0xc304f2c9 -//.word 0x54b5fb9b -//.word 0x5396fbee -//.word 0x9f1d64fb -//.word 0xe062bcc0 -//.word 0x6b75a1f4 -//.word 0x67f50a40 -//.word 0x2edecfac -//.word 0xf6a36c58 -//.word 0xb17d026c -//.word 0x32029e51 -//.word 0x90f9be22 -//.word 0xcf6d115d -//.word 0xbd007fdf -//.word 0x1b82690f -//.word 0xfdc23259 -//.word 0x74a4fede -//.word 0x6974b969 -//.word 0xcc7a5ca5 -//.word 0xefcf6b8e -//.word 0x2c6fc226 -//.word 0xce8e9269 -//.word 0x2f30a782 -//.word 0x1df4ec3f -//.word 0x823030c3 -//.word 0x44432a7b -//.word 0x6b27bb53 -//.word 0x82467429 -//.word 0x3f8f5881 -//.word 0x66c8e37b -//.word 0xea264b03 -//.word 0x551b0548 -//.word 0x6b6f8b6f -//.word 0x0a925d88 -//.word 0x553145c1 -//.word 0x1207e0d9 -//.word 0x4ff65ad8 -//.word 0x4c5679fe -//.word 0x958dddf9 -//.word 0x6fdf865b -//.word 0x7588964a -//.word 0x83085879 -//.word 0xd3bf8258 -//.word 0x66b9b788 -//.word 0xa6cb5092 -//.word 0x49df5cd8 -//.word 0x788ce5cc -//.word 0x31ea765f -//.word 0xeaa4d9bd -//.word 0x774e2537 -//.word 0x2df9f980 -//.word 0x4805021d -//.word 0x8a37c317 -//.word 0x250b95f3 -//.word 0xdb4cece3 -//.word 0x64e1dd3e -//.word 0x10eadd2e -//.word 0xad0ccca9 -//.word 0xab0832a2 -//.word 0x7e93c880 -//.word 0x44623acf -//.word 0xa8842b35 -//.word 0x06f479a8 -//.word 0xd06fc3df -//.word 0x30832906 -//.word 0xeee953b6 -//.word 0x9514b524 -//.word 0xd10a1199 -//.word 0x1c733d22 -//.word 0x99ef2688 -//.word 0x40ad1582 -//.word 0x3c3a312a -//.word 0x919646ae -//.word 0x028dc448 -//.word 0x32440b70 -//.word 0x0913e550 -//.word 0x59925478 -//.word 0xc2f78fd3 -//.word 0xd39f47d9 -//.word 0x71ea2e07 -//.word 0x7d4cba8c -//.word 0xb1a12646 -//.word 0xcbc1bbec -//.word 0xee554d8d -//.word 0x45e90839 -//.word 0xe9426dfe -//.word 0x05f19716 -//.word 0x3828c35e -//.word 0x3acd0f0a -//.word 0xc3cd8297 -//.word 0xa8b34d02 -//.word 0x47795038 -//.word 0x269de0cd -//.word 0xd778c8f0 -//.word 0x1fcc8d9f -//.word 0x579cf717 -//.word 0x1140cc8f -//.word 0xffb8df25 -//.word 0x11414919 -//.word 0xde26f739 -//.word 0x45d9659c -//.word 0x5442a893 -//.word 0x6857b2dd -//.word 0x96edd21a -//.word 0x4acd7a82 -//.word 0x2e0b45d7 -//.word 0x4e933898 -//.word 0x79054978 -//.word 0xeac31d0f -//.word 0x284816ce -//.word 0x2abb8d38 -//.word 0xbfc35c4f -//.word 0x2d9ea04d -//.word 0x186dbd95 -//.word 0xa6d2a2e9 -//.word 0xe1bd4edd -//.word 0x5d83928c -//.word 0x1a311989 -//.word 0xab1fa719 -//.word 0x98c89e9f -//.word 0x02d8c657 -//.word 0x85874d47 -//.word 0x63260d73 -//.word 0xdef70e51 -//.word 0xe5424c7c -//.word 0xf3a5baac -//.word 0x35ac86e6 -//.word 0xeba29ff0 -//.word 0x10a67508 -//.word 0x3d0100d5 -//.word 0xcbb6039e -//.word 0x385b92ba -//.word 0xcb28d248 -//.word 0x7b4e0020 -//.word 0x0e89b409 -//.word 0x7ef9672c -//.word 0xa02e33c8 -//.word 0x0782db28 -//.word 0x27ab0bd2 -//.word 0xb690e102 -//.word 0x585cab56 -//.word 0x7ad1f3cb -//.word 0x7ee0b9e8 -//.word 0x1976ff39 -//.word 0xfa988bff -//.word 0xadb2e826 -//.word 0xbe2cae77 -//.word 0x213f030f -//.word 0xd1076210 -//.word 0xb8d99b96 -//.word 0xcfd61bed -//.word 0x86c06e01 -//.word 0x660d0215 -//.word 0xf53a2eb8 -//.word 0xda6272f5 -//.word 0x410f01cb -//.word 0x81507cdd -//.word 0xfc0c0169 -//.word 0x4795647e -//.word 0x8c80bc6a -//.word 0x2cb52272 -//.word 0xa8c2b5c7 -//.word 0xc175e2b5 -//.word 0xdea9e21c -//.word 0xaf608324 -//.word 0x10122c2d -//.word 0x30451b05 -//.word 0xf25ef25e -//.word 0x93b7727f -//.word 0x8ef18639 -//.word 0xbc8c831d -//.word 0xc0b4aeec -//.word 0xa25eff4f -//.word 0xba9424c8 -//.word 0xd00dc9e9 -//.word 0x810117c4 -//.word 0xe43b7aa2 -//.word 0x6e70a8f8 -//.word 0x13cfdf96 -//.word 0xaed96d22 -//.word 0xa37376c5 -//.word 0xc33af224 -//.word 0x7016f592 -//.word 0x01123383 -//.word 0x686bc344 -//.word 0x11e623ea -//.word 0x0e677d89 -//.word 0x72c028a6 -//.word 0xfac772ee -//.word 0xf3ab9d28 -//.word 0x57882768 -//.word 0x3a384f85 -//.word 0x646dd4ce -//.word 0x40fc00f9 -//.word 0xf57ce55c -//.word 0xd210e760 -//.word 0xef817a32 -//.word 0x11902dbb -//.word 0xcf8ae8d3 -//.word 0xf31c71b1 -//.word 0x236935a6 -//.word 0xc15a460c -//.word 0x0f35a079 -//.word 0x9772b038 -//.word 0xcaca17f9 -//.word 0xe790abc7 -//.word 0x1e44be3b -//.word 0xf666a4ef -//.word 0xec886f36 -//.word 0x5ca7fd0a -//.word 0xa5bb3546 -//.word 0x898d8d16 -//.word 0xd2c9cfab -//.word 0x3b541e33 -//.word 0x8ddf3408 -//.word 0x09bded27 -//.word 0x06f109e5 -//.word 0xdb8c2ddd -//.word 0xff362c2d -//.word 0x6f0a85e2 -//.word 0x50a72db0 -//.word 0xd6838ee7 -//.word 0x6483cfa2 -//.word 0xf5c95641 -//.word 0xbace8b1a -//.word 0x04b0df6c -//.word 0x65cd0e94 -//.word 0x1290a084 -//.word 0x8c8bb670 -//.word 0x80c603ca -//.word 0xeb571971 -//.word 0x8133e626 -//.word 0x50447e3f -//.word 0xa1bc1b9f -//.word 0x1fa861e5 -//.word 0x3bc8e7e4 -//.word 0xce9ef454 -//.word 0x00c586c6 -//.word 0x6a8499de -//.word 0x77a3a5bc -//.word 0x107d69bb -//.word 0x7857e75e -//.word 0x74f0b087 -//.word 0xb05961ea -//.word 0x5e076ec2 -//.word 0x20271ec2 -//.word 0x2831d74f -//.word 0x9dc09cec -//.word 0x41a1d4f6 -//.word 0x522a4d91 -//.word 0xaecd80e2 -//.word 0x3aed177f -//.word 0x83efac23 -//.word 0xa695d4a7 -//.word 0x6e875c2d -//.word 0xbd33d29f -//.word 0x2dd74758 -//.word 0xf6dc5420 -//.word 0x13665b5e -//.word 0xa0290f89 -//.word 0x877e37e0 -//.word 0x5bb6af5b -//.word 0x84aeafe1 -//.word 0x9da34fbb -//.word 0x1a484b49 -//.word 0x2e1604f3 -//.word 0xece4c863 -//.word 0xacb753f1 -//.word 0xb0db965f -//.word 0x0733b7c7 -//.word 0xb2cd58d1 -//.word 0x06b91c29 -//.word 0x511c6731 -//.word 0xc08066f3 -//.word 0x806e5059 -//.word 0x243feba0 -//.word 0x472f510a -//.word 0x72b3f4d3 -//.word 0x400de067 -//.word 0xbf1d40d2 -//.word 0x1a7a2478 -//.word 0x75c18106 -//.word 0x192d79a8 -//.word 0xd168dd7d -//.word 0x93a1f148 -//.word 0x63df6f68 -//.word 0x7595ce0a -//.word 0x9276c39d -//.word 0xbc8a0986 -//.word 0x15825e15 -//.word 0xfd49ceb8 -//.word 0x7bdb336f -//.word 0xde5afd80 -//.word 0xa45f2f6c -//.word 0x9a8eaa21 -//.word 0x456dae71 -//.word 0x81769ec3 -//.word 0x686a0309 -//.word 0x75e9d4f2 -//.word 0xe940f560 -//.word 0x6e82fd1c -//.word 0xfbda3cc9 -//.word 0xf71ffd16 -//.word 0xa1a90838 -//.word 0xaf636b98 -//.word 0x35227ac8 -//.word 0xc93515bc -//.word 0xe53e2937 -//.word 0x8d407983 -//.word 0x31f89f65 -//.word 0xd4714d50 -//.word 0x6ed3d9d9 -//.word 0x8f7bf96b -//.word 0x4651cb3c -//.word 0x4156187f -//.word 0x357dd9dc -//.word 0x81bcfa1d -//.word 0x0e625f2a -//.word 0x79ab2537 -//.word 0x74922a3c -//.word 0x69e6cfa5 -//.word 0x61a0fc4b -//.word 0x257465a4 -//.word 0xa2a60c36 -//.word 0x921f0752 -//.word 0x59c084fe -//.word 0x2df60a33 -//.word 0x7a8f0249 -//.word 0x85cc75af -//.word 0x4fb717df -//.word 0xbcb68591 -//.word 0xf461cb2f -//.word 0x0a91298a -//.word 0xdcb917cb -//.word 0x3a7a86ac -//.word 0x4a7169e8 -//.word 0x2a5474ef -//.word 0xd83d23df -//.word 0x4f45ffb0 -//.word 0xf3551dae -//.word 0x2f39e72d -//.word 0x5df61e78 -//.word 0xe65e200a -//.word 0xaae16701 -//.word 0xa2a653cf -//.word 0xc3db2933 -//.word 0x26495b68 -//.word 0x672b0a9c -//.word 0x4b40c9a3 -//.word 0xa51fa4ed -//.word 0x7acb61b5 -//.word 0x6387057c -//.word 0x33eb9ab6 -//.word 0xda3830c3 -//.word 0x89e92220 -//.word 0x178a9adf -//.word 0xa4cd5754 -//.word 0x7cdbae12 -//.word 0x3de8cf16 -//.word 0x3d0a4a41 -//.word 0x264bd20c -//.word 0xe3fd4077 -//.word 0xc04ddb42 -//.word 0xcc1bd660 -//.word 0x82091aa9 -//.word 0xa9d246cf -//.word 0x79def493 -//.word 0xff133f38 -//.word 0xc3ed8238 -//.word 0xa7d16137 -//.word 0x129e0e35 -//.word 0x4e86c507 -//.word 0x2f1c9908 -//.word 0xf6ad730c -//.word 0x74d45895 -//.word 0x7349ea4a -//.word 0x51fa32a4 -//.word 0xee5d9ceb -//.word 0xc9044361 -//.word 0x65726fbd -//.word 0xf22d5cda -//.word 0x29143eb1 -//.word 0x78f38185 -//.word 0x5f55555d -//.word 0x1a996ab7 -//.word 0x8048f87b -//.word 0x2ba6032e -//.word 0xd987dd68 -//.word 0x1264ec88 -//.word 0x0baeada6 -//.word 0xcb62f9c9 -//.word 0x8cde885a -//.word 0x64f3b3d9 -//.word 0x243b7ecf -//.word 0x81add504 -//.word 0x716e16f1 -//.word 0xd8ead078 -//.word 0x6424cbd3 -//.word 0xb54a48cb -//.word 0xc28d892a -//.word 0x78309472 -//.word 0xa4de35cf -//.word 0x1240424b -//.word 0xf6cf2241 -//.word 0x8ce79014 -//.word 0xfc1d9d20 -//.word 0x80d3f4f1 -//.word 0xc80a62b3 -//.word 0x9e7796ea -//.word 0xc6d82564 -//.word 0x2888d16b -//.word 0x31510a3f -//.word 0x7682b5c3 -//.word 0x9a422d76 -//.word 0x722487a5 -//.word 0x68fc1bdf -//.word 0x1df03faa -//.word 0x53d25674 -//.word 0x09ad0acc -//.word 0xe79dd580 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00016198 -//// expected output -//.word 0x099417d1 -//.word 0xf998a371 -//.word 0x7c085abe -//.word 0xc333e1e3 -//.word 0xd5771843 -//.word 0x52aabc84 -//.word 0x3e23ec8c -//.word 0xbd4b7cdf -//.word 0xc5dc7e42 -//.word 0xade40218 -//.word 0x9f2b310e -//.word 0x3ffd7e6f -//.word 0xd2d722d1 -//.word 0xa7a7cfd3 -//.word 0xed9ab629 -//.word 0x3160c972 -//// SHA512LongMsgvector_114 -//// vector length -//.word 0x000164B0 -//// input message -//.word 0x770620f0 -//.word 0xd9010dd1 -//.word 0x7f72d665 -//.word 0x324dabee -//.word 0xbc82d170 -//.word 0x9fddf2b7 -//.word 0x072ab89b -//.word 0xfe9e9a83 -//.word 0xdf72f528 -//.word 0x0dd15e9c -//.word 0xe4f4378a -//.word 0xf08c80bf -//.word 0x5d60f0e9 -//.word 0xaf37449f -//.word 0xb4f8d8a2 -//.word 0xb6107463 -//.word 0xf41468c5 -//.word 0x54a7db23 -//.word 0x529f6095 -//.word 0x3c63ca6f -//.word 0xa197420b -//.word 0x07fc96c9 -//.word 0xdc91d453 -//.word 0xafff1826 -//.word 0xa033a24e -//.word 0x154d2b70 -//.word 0xafb9790e -//.word 0x7d9b3207 -//.word 0x6f71ee5d -//.word 0x0df48f3b -//.word 0x683ed537 -//.word 0x51322dd4 -//.word 0xca19ca4b -//.word 0xba89f78b -//.word 0xe58bac7e -//.word 0x1afc5f8e -//.word 0xae341c68 -//.word 0x2ae6d8ff -//.word 0x414703d4 -//.word 0x05735c76 -//.word 0x5a0c0944 -//.word 0xaa24e77a -//.word 0xda5d1f6c -//.word 0x7d4efa0c -//.word 0x4829f6b2 -//.word 0xc69b191d -//.word 0x4df485b5 -//.word 0x31884d12 -//.word 0x375587c2 -//.word 0x4de6a247 -//.word 0x7877fa60 -//.word 0x0d59aa8a -//.word 0x2498a1c5 -//.word 0x4adcf99b -//.word 0x768d845f -//.word 0x3f3aa7b3 -//.word 0x4b3c6b4c -//.word 0x0b96d1fa -//.word 0xa52066e2 -//.word 0x32e5180e -//.word 0x2ac94829 -//.word 0x1c6f2083 -//.word 0xa359275c -//.word 0x9551125e -//.word 0x7d08de6b -//.word 0x4cfe1b99 -//.word 0x4ba18b7b -//.word 0x54b9eba3 -//.word 0x42031164 -//.word 0xa61c37dd -//.word 0xbca19732 -//.word 0x9d95381d -//.word 0xb50307a6 -//.word 0x78e4292e -//.word 0x514290b2 -//.word 0xdb9ecc4e -//.word 0x54902400 -//.word 0x4fade6af -//.word 0xa8adfb6c -//.word 0xbdcebef7 -//.word 0xdb730f85 -//.word 0xf711a2c0 -//.word 0x9f4b9d10 -//.word 0x305c6319 -//.word 0x48b6aa85 -//.word 0x7ee8d403 -//.word 0x51c57c8f -//.word 0x5fc34ff5 -//.word 0xd8a11d90 -//.word 0x314d2f58 -//.word 0x1d04dc1c -//.word 0xb9bb570b -//.word 0x06becb79 -//.word 0x9d97aae0 -//.word 0x9e314225 -//.word 0xea3d911d -//.word 0x92d55a50 -//.word 0x8f5f78fd -//.word 0xb3b5735e -//.word 0xdf83512c -//.word 0x77f0ae66 -//.word 0x13800f4f -//.word 0x773874b6 -//.word 0xc6042c79 -//.word 0xf257ed4c -//.word 0x771124b7 -//.word 0x49a58a5e -//.word 0x0a7bf885 -//.word 0x81937cd3 -//.word 0x486cac56 -//.word 0xc4243ac8 -//.word 0x5ae0c911 -//.word 0xe06eff0c -//.word 0x5229dc8e -//.word 0xc71d4aa5 -//.word 0xa36cf51d -//.word 0x0df15c49 -//.word 0xa4222900 -//.word 0x6d3bbde5 -//.word 0x109910eb -//.word 0x4563b819 -//.word 0x8970478b -//.word 0x1565daba -//.word 0x101eeffd -//.word 0x0450774f -//.word 0x8f6c2d52 -//.word 0x5bc62594 -//.word 0x4ff6a811 -//.word 0x077e3ffa -//.word 0x82ae0eb5 -//.word 0x1bc56325 -//.word 0xbb598f2b -//.word 0x4cf9f56d -//.word 0x71106056 -//.word 0x740c9a5e -//.word 0x80c03a8b -//.word 0x1007bd37 -//.word 0xa7abd815 -//.word 0xc2850d6f -//.word 0x0ae57db1 -//.word 0xcf34fd2b -//.word 0xb2d76b13 -//.word 0xa15743c9 -//.word 0x09bf6d5f -//.word 0x46465959 -//.word 0x5f2e4eb1 -//.word 0xf0ecff1f -//.word 0x67896097 -//.word 0x7348b712 -//.word 0xba89f691 -//.word 0xcbed485f -//.word 0x53bbea97 -//.word 0x93833ce7 -//.word 0x11011893 -//.word 0x8e4362bd -//.word 0x390ee0e3 -//.word 0x227f4ca9 -//.word 0xf1eea8d9 -//.word 0xd817d2a8 -//.word 0xc67c583b -//.word 0xde058d69 -//.word 0x27eaddc3 -//.word 0x85d25dd1 -//.word 0xe83da69f -//.word 0xc31fe478 -//.word 0xc0cd2af2 -//.word 0xb21d092b -//.word 0xcac96051 -//.word 0x0f157568 -//.word 0x08b24547 -//.word 0xbbe119e4 -//.word 0xdcdc5ad2 -//.word 0x3e71a608 -//.word 0x8df023e4 -//.word 0x3f471470 -//.word 0xc86caae3 -//.word 0x0dfb1c6b -//.word 0x1c21fa29 -//.word 0x1ab8be7d -//.word 0x7cb3a485 -//.word 0x7bbdbbe0 -//.word 0xc11d3cb8 -//.word 0x69dd1bff -//.word 0x262bddf8 -//.word 0xc2ffa9fa -//.word 0xcbfea171 -//.word 0x899f7325 -//.word 0x328c2abf -//.word 0x614b4b89 -//.word 0xc51d1d75 -//.word 0x16264861 -//.word 0x4ecfa199 -//.word 0x1569459d -//.word 0x7d13e525 -//.word 0xefdd6063 -//.word 0x662d9788 -//.word 0xda627d89 -//.word 0x00b86d23 -//.word 0x306bc11d -//.word 0xa620a0cd -//.word 0xee8017dd -//.word 0x9a266b4f -//.word 0x36bbaebf -//.word 0x7e5f91e8 -//.word 0xce4b796a -//.word 0xd9b5d5cb -//.word 0x9ef4aebb -//.word 0x98e57f9c -//.word 0x358d4841 -//.word 0x8a00def6 -//.word 0x458185c1 -//.word 0xe3eac0e8 -//.word 0x234f68b3 -//.word 0xbadefc73 -//.word 0x480938c3 -//.word 0x8be8e90e -//.word 0xd2d8ff52 -//.word 0xb569e423 -//.word 0x04770cf2 -//.word 0xfd96ce8f -//.word 0xc2b472ed -//.word 0x0af98b26 -//.word 0x16f287be -//.word 0xe7ef842c -//.word 0xaea96596 -//.word 0x842825dd -//.word 0x5be46cd9 -//.word 0x342b60e6 -//.word 0x93c2be9f -//.word 0x30cf29e9 -//.word 0xf0f6c234 -//.word 0x13c3f8fd -//.word 0xaf48a297 -//.word 0x5d074b2c -//.word 0x3212ccff -//.word 0xf17021f3 -//.word 0x7ec37551 -//.word 0x96287fc6 -//.word 0xbe5f11ab -//.word 0x792cee89 -//.word 0xbefcdddd -//.word 0xa9ccfb18 -//.word 0x714755ea -//.word 0x9a2eb6c0 -//.word 0x6cfdbe8c -//.word 0xa3cc34c4 -//.word 0x68739dad -//.word 0x80f10ed9 -//.word 0xc40f3eee -//.word 0xd140dfaa -//.word 0x00cc2f24 -//.word 0x992dca55 -//.word 0x43b9c2d6 -//.word 0xbf82f1eb -//.word 0xd67b8ec1 -//.word 0x90dcfff4 -//.word 0xa7c7ee54 -//.word 0x3b2b9fe9 -//.word 0xc7e98135 -//.word 0x543503b8 -//.word 0xed3fa8ba -//.word 0x52135e44 -//.word 0xf1be0c70 -//.word 0x11b36ae2 -//.word 0x516d1597 -//.word 0x5155e3de -//.word 0xafe573a3 -//.word 0x350e09f3 -//.word 0x50d799bd -//.word 0xc44822d6 -//.word 0x9f863e40 -//.word 0x6b3ff6ac -//.word 0xa848da3d -//.word 0x7a85528f -//.word 0x9e0a2ff8 -//.word 0xa27f850e -//.word 0x56c9bd69 -//.word 0x7ee7e6aa -//.word 0xc9194cbb -//.word 0x07484c59 -//.word 0x96a266d0 -//.word 0x1d859406 -//.word 0x7d9edabb -//.word 0x05521f0f -//.word 0xe65c3b45 -//.word 0xe6b851c6 -//.word 0x58c05f69 -//.word 0x4b9613f1 -//.word 0x02c1e1d8 -//.word 0xa41b524b -//.word 0x35ea9f75 -//.word 0xc54d7e00 -//.word 0xe7da3cd9 -//.word 0x65850c34 -//.word 0x32c39fd1 -//.word 0xa0f0f47d -//.word 0xd3ee72db -//.word 0x76103464 -//.word 0xac36a4ad -//.word 0x4a394be8 -//.word 0x4389e7ae -//.word 0x6414befc -//.word 0x416a337b -//.word 0x6f1f9704 -//.word 0xf3714163 -//.word 0xfb2be15b -//.word 0xccca11eb -//.word 0xfcdd2dd0 -//.word 0xe1b2654b -//.word 0x492e1024 -//.word 0x6bfd43ef -//.word 0x1eeca38e -//.word 0x499277f7 -//.word 0x9b360238 -//.word 0x7ced0fb8 -//.word 0x4303cdbf -//.word 0xa99cdd38 -//.word 0x7d9baab6 -//.word 0x9ac3f9b6 -//.word 0x171cc124 -//.word 0xbd993c20 -//.word 0xbef73e01 -//.word 0xa3e8c69a -//.word 0x8771d2bd -//.word 0x839178fe -//.word 0x692333b9 -//.word 0xb5057b57 -//.word 0xc07a98cc -//.word 0x37cdb764 -//.word 0xcc383ec0 -//.word 0x2b035d1b -//.word 0x30f0e5d3 -//.word 0x57d75e24 -//.word 0x748e5436 -//.word 0xa40bf15a -//.word 0x83cdd190 -//.word 0x9f78114e -//.word 0x2dbfa97c -//.word 0xfb86fcc3 -//.word 0xa648ae07 -//.word 0x0db7b632 -//.word 0x05a3b434 -//.word 0x4f1d8448 -//.word 0xc7dc1378 -//.word 0xdde07163 -//.word 0x4954283e -//.word 0xfbb9cd19 -//.word 0x5141d463 -//.word 0x8d79a8b1 -//.word 0x862bfcbb -//.word 0x9e835ba7 -//.word 0xf370078b -//.word 0xda4d002d -//.word 0x89c1630d -//.word 0x13e4f5a5 -//.word 0x9aa300ef -//.word 0xbf655e28 -//.word 0x5eefd3d4 -//.word 0x7984a002 -//.word 0x715154d1 -//.word 0x7c09e633 -//.word 0x53cd01f1 -//.word 0x2b4e9fef -//.word 0xe735d9b2 -//.word 0x8cc3fd1f -//.word 0xf5b4e285 -//.word 0xc86a78de -//.word 0xa847a352 -//.word 0xac5b4afd -//.word 0x103fabf2 -//.word 0x2b40f180 -//.word 0xa1c008b4 -//.word 0xdadab01e -//.word 0xb345d0d8 -//.word 0x737b0dc5 -//.word 0x001a9c17 -//.word 0x538a5414 -//.word 0x29e00819 -//.word 0xfb0213df -//.word 0x310c34fd -//.word 0x93f39dae -//.word 0x006946d5 -//.word 0x6200873e -//.word 0xe191e627 -//.word 0x57df2eff -//.word 0x0478c16d -//.word 0x84dc2e94 -//.word 0xfde10696 -//.word 0x9d56ec56 -//.word 0x44e7ec83 -//.word 0x7d400ed2 -//.word 0xb3762a8a -//.word 0xa2a2fd46 -//.word 0x0bcf7df6 -//.word 0xac166a28 -//.word 0x6f072686 -//.word 0xe24bc69f -//.word 0xe78869ea -//.word 0xad85c807 -//.word 0xde8f0f49 -//.word 0x1a1bec72 -//.word 0xa5ace5bd -//.word 0x5cf7ee22 -//.word 0xee453bd5 -//.word 0x481a5310 -//.word 0x51146612 -//.word 0xd815e068 -//.word 0xcaa53e6b -//.word 0xa991200a -//.word 0x39d8a0c9 -//.word 0x7dc8e30a -//.word 0xe165ed8b -//.word 0xb90aba31 -//.word 0xea538a04 -//.word 0xe7397c7a -//.word 0xe07f5ef8 -//.word 0x364ec496 -//.word 0x311c5723 -//.word 0xf5d27069 -//.word 0xb22de6b1 -//.word 0x1c64248a -//.word 0x1b0c7ec7 -//.word 0xc339c5c7 -//.word 0x86e718f9 -//.word 0xa898fe9e -//.word 0xf43eb2d1 -//.word 0xae5abec5 -//.word 0xc866cb4f -//.word 0x5871b8a4 -//.word 0x4a09e963 -//.word 0x525de2d6 -//.word 0x25a31475 -//.word 0xe9b8f6ab -//.word 0xea0658dd -//.word 0x8eabf5a9 -//.word 0x8bd8476b -//.word 0x57769f06 -//.word 0xe11074e1 -//.word 0x7eedfb2f -//.word 0x267cf974 -//.word 0xe0f6d644 -//.word 0x7b3ef24e -//.word 0x7f0c3c9a -//.word 0x634a000f -//.word 0x00be0038 -//.word 0x46eac748 -//.word 0x2e303a5b -//.word 0xef3a70fe -//.word 0x7599c3f2 -//.word 0x0fac272d -//.word 0x68c4bb22 -//.word 0xb8859e42 -//.word 0x3b9004c3 -//.word 0xe35f89a0 -//.word 0x4a6fc5e1 -//.word 0xeaa5201c -//.word 0x90ebe73c -//.word 0x0e1aa081 -//.word 0x301c9bc8 -//.word 0xf252ca0d -//.word 0xf033d22e -//.word 0x1e3662f1 -//.word 0xb9f2c449 -//.word 0x7e84b2d5 -//.word 0x19326aaa -//.word 0xe04e0552 -//.word 0xc15c0414 -//.word 0x79772c76 -//.word 0x07f09401 -//.word 0x6139fc44 -//.word 0x6501601c -//.word 0x12a1cd32 -//.word 0xf8b774c4 -//.word 0xed10fda9 -//.word 0x02cc1d8f -//.word 0xb6bc6b88 -//.word 0x690f6fc5 -//.word 0x132efca0 -//.word 0x35e4c0e0 -//.word 0x10c21a39 -//.word 0x16c22b13 -//.word 0x9e2a308d -//.word 0xdbb30fc0 -//.word 0x0feb2f48 -//.word 0xfcd88d01 -//.word 0x9bde0d0e -//.word 0x11e20e20 -//.word 0xdfb040f4 -//.word 0x599aba1e -//.word 0x59624706 -//.word 0x345b0130 -//.word 0xedca22c0 -//.word 0xa992163d -//.word 0x6311d595 -//.word 0xe1456f61 -//.word 0xe733e86b -//.word 0xaa89476d -//.word 0x8782ea1c -//.word 0xf50a1c65 -//.word 0xb923eaf7 -//.word 0x59873201 -//.word 0xd28efc3d -//.word 0x8d530d2d -//.word 0x9012baa5 -//.word 0xf2d5fb89 -//.word 0x9150c0d8 -//.word 0x070988e9 -//.word 0xd9bc2ff5 -//.word 0xf2fd07d6 -//.word 0x501f2b0e -//.word 0xfe55100b -//.word 0x42175daa -//.word 0x17c7fdf9 -//.word 0xdd957241 -//.word 0x50a06c44 -//.word 0xb75d9ac3 -//.word 0x5d3dc043 -//.word 0x458a0a11 -//.word 0x1a92a084 -//.word 0x65087a82 -//.word 0x03a77645 -//.word 0xd518a75f -//.word 0xb916f0fc -//.word 0xb9d0d268 -//.word 0x838f83d1 -//.word 0x1998404d -//.word 0xca54e31f -//.word 0x61aeb836 -//.word 0x9cbd8df6 -//.word 0xe0a3083b -//.word 0x2ab53e9b -//.word 0x49dc80ec -//.word 0x4b3a7806 -//.word 0x351176ca -//.word 0xf7e10464 -//.word 0x9ed1c0cc -//.word 0xcc506b93 -//.word 0x65fc3ddc -//.word 0x8cc37ba9 -//.word 0xce484c58 -//.word 0x9c88c96d -//.word 0xffbd5391 -//.word 0x878329db -//.word 0x8539394f -//.word 0x79aa37a4 -//.word 0xceeced4b -//.word 0xc589d2ac -//.word 0xb0ddddb3 -//.word 0x60bf9b8b -//.word 0xe06480a9 -//.word 0x647f7b0d -//.word 0x7cadccc4 -//.word 0x8d111ab2 -//.word 0x823bc08e -//.word 0xbf4f692e -//.word 0x5663dc05 -//.word 0x7e2819ea -//.word 0x41cda41a -//.word 0x74202181 -//.word 0xecf72135 -//.word 0xefce3c44 -//.word 0xe9b160af -//.word 0x605d68b6 -//.word 0x2aa2f056 -//.word 0xde0b6811 -//.word 0x88c168ed -//.word 0xa1ad43bf -//.word 0x3edddfa9 -//.word 0x8729c4e2 -//.word 0x6b1672b5 -//.word 0x92faf8cd -//.word 0x9361c2af -//.word 0x68b0b388 -//.word 0x1f087429 -//.word 0xd16d0b50 -//.word 0xd828af29 -//.word 0x3d69da14 -//.word 0x7031a1a9 -//.word 0x3c6f41f9 -//.word 0xf96afa17 -//.word 0x045e20d8 -//.word 0x6c6a6fd6 -//.word 0xeea99fbb -//.word 0x24a038bc -//.word 0xf9d8a863 -//.word 0x60cb9292 -//.word 0x46056ac5 -//.word 0xc4833f97 -//.word 0x9a5fd788 -//.word 0xd9af01fd -//.word 0xdfaa2788 -//.word 0x880c236a -//.word 0xa3bc5356 -//.word 0xa3acf078 -//.word 0x97019bb6 -//.word 0x5d753936 -//.word 0x12f90120 -//.word 0xcc9ed3a5 -//.word 0x8cb5cc40 -//.word 0x6e35173b -//.word 0x235e0676 -//.word 0xa19c6164 -//.word 0x19aefe56 -//.word 0x2a0791fc -//.word 0x5475c628 -//.word 0xaf008dd6 -//.word 0xdd15b56a -//.word 0x3de4bd38 -//.word 0x6106e749 -//.word 0xc3638d5c -//.word 0xb353b82c -//.word 0x9403eff1 -//.word 0x481b4d29 -//.word 0xe99dd798 -//.word 0xba100c8e -//.word 0x5ddfbd68 -//.word 0x46fc1e59 -//.word 0x6fc81e6b -//.word 0x4d37f4c0 -//.word 0x042ffa1e -//.word 0xd732bfab -//.word 0xe23d57f4 -//.word 0x0bf0f634 -//.word 0x36eebed4 -//.word 0xb887d42e -//.word 0x0e95b996 -//.word 0xd0a3d89b -//.word 0xe0555b8a -//.word 0xe7044334 -//.word 0x02a8b8f1 -//.word 0xb8fb9de5 -//.word 0x30db6882 -//.word 0xa0f0314e -//.word 0x099008e7 -//.word 0x22df8c44 -//.word 0x913bba3d -//.word 0x61d7024e -//.word 0xb1a5a098 -//.word 0xa97a2928 -//.word 0xb36d647c -//.word 0xe7805c43 -//.word 0xc682b365 -//.word 0x2c333943 -//.word 0x80aabd40 -//.word 0x2ef42480 -//.word 0x57feb8f0 -//.word 0xc7b4c286 -//.word 0x276b5aca -//.word 0x737c7e95 -//.word 0xaf326218 -//.word 0xd6e70721 -//.word 0x14690f9a -//.word 0x34a3d052 -//.word 0x5c79a701 -//.word 0xf8f38e86 -//.word 0xf49ef172 -//.word 0x2e2fbeca -//.word 0x2b6abc09 -//.word 0x09421d65 -//.word 0xb4425653 -//.word 0x5d2b2e4d -//.word 0x28df15d3 -//.word 0x257db8b0 -//.word 0x82ced27e -//.word 0xffe0456c -//.word 0xa1f0693f -//.word 0xab8da497 -//.word 0xcafb3b74 -//.word 0x90d667f8 -//.word 0x23f7ac6f -//.word 0x379c668c -//.word 0x39c2a5f5 -//.word 0xcdd63a03 -//.word 0x7b8d12c2 -//.word 0xa511c340 -//.word 0xbd5d6504 -//.word 0xb5eaa3dc -//.word 0xb68b11dc -//.word 0x1495c1a3 -//.word 0x824411e0 -//.word 0x825ac615 -//.word 0x20095f9b -//.word 0xe013a3e7 -//.word 0xf5307d0b -//.word 0xb3b0097f -//.word 0x4761ef22 -//.word 0xa6b3f07c -//.word 0xc31abe46 -//.word 0x05b4112c -//.word 0xf82cf7d1 -//.word 0x43de6b14 -//.word 0xda3c2a92 -//.word 0x7470c26b -//.word 0x4043ec4a -//.word 0xd33d1b9f -//.word 0x650d552f -//.word 0x3e2c42cf -//.word 0x6bbe836c -//.word 0xb5b9444f -//.word 0xd448159f -//.word 0xdf72f528 -//.word 0x07f7b05a -//.word 0x857a6c95 -//.word 0xd1e57ea4 -//.word 0x150a8287 -//.word 0xe186aa75 -//.word 0x20eb5621 -//.word 0x4b1ee53d -//.word 0xdcfdcb3c -//.word 0x0645e45d -//.word 0xa3b309e5 -//.word 0x6e6ae0ab -//.word 0x7295f8da -//.word 0xc24d15f3 -//.word 0x6bbdc811 -//.word 0xa7844371 -//.word 0x535a6c31 -//.word 0xa3f73058 -//.word 0x15311a17 -//.word 0xa364244f -//.word 0x3d16cd52 -//.word 0x76db6bee -//.word 0x7e77c3a8 -//.word 0x5043d745 -//.word 0x2cd2ff8f -//.word 0x48d33b55 -//.word 0xc339c8b4 -//.word 0xda9af195 -//.word 0x5ed52877 -//.word 0x65f8556f -//.word 0x41616e6c -//.word 0xae2348c0 -//.word 0x4fabaddc -//.word 0x5ca3ae5b -//.word 0x95163a43 -//.word 0x7ad5f087 -//.word 0xbd1a32d0 -//.word 0xf86c7b7c -//.word 0x9cc2f2e7 -//.word 0x29eb3fea -//.word 0xa52d9da2 -//.word 0x472d3073 -//.word 0x730e9a4c -//.word 0xebddc92c -//.word 0x432d12e5 -//.word 0x95fe8420 -//.word 0x77e476a1 -//.word 0x2a6563cc -//.word 0x14a2f868 -//.word 0x703a6aa4 -//.word 0x456b0d57 -//.word 0x947a238c -//.word 0xd655f13e -//.word 0xa6781960 -//.word 0xba0d2321 -//.word 0x17575d6d -//.word 0x8550e5b7 -//.word 0x419104f6 -//.word 0xf373bded -//.word 0xdf74a6b0 -//.word 0x5fdcf764 -//.word 0x91a0e146 -//.word 0x4d8621ef -//.word 0x5a8ad4d6 -//.word 0xe1808d16 -//.word 0x21fca571 -//.word 0x656fd295 -//.word 0x3392fb9f -//.word 0xc7084bde -//.word 0xc03f85d9 -//.word 0x18979793 -//.word 0x59c6710d -//.word 0x0e7b170d -//.word 0x7841f51e -//.word 0x83a674d8 -//.word 0xf89dca61 -//.word 0xf4221634 -//.word 0x991cac21 -//.word 0x0387ad95 -//.word 0x7ed2dc1c -//.word 0xf686ac24 -//.word 0xaf299e04 -//.word 0x3662c93d -//.word 0x975ebaff -//.word 0xd0717fef -//.word 0x8601ff27 -//.word 0xf7a08d7e -//.word 0x3078bc0a -//.word 0x7fec74e4 -//.word 0x2c7c452b -//.word 0x64e9fc4c -//.word 0x769a7480 -//.word 0x423faf96 -//.word 0xedb425f2 -//.word 0xda285cd6 -//.word 0xd67eb9e0 -//.word 0x93f396d4 -//.word 0x5802959c -//.word 0xf685338d -//.word 0xfe1ca0ec -//.word 0x31d2ceb1 -//.word 0x38fec78a -//.word 0x96684523 -//.word 0xdaad7ca5 -//.word 0x19e53b7d -//.word 0x9b82335e -//.word 0xd57b9689 -//.word 0x97abe54c -//.word 0x877403c8 -//.word 0xcea78df8 -//.word 0x11a86eef -//.word 0xa3cdad61 -//.word 0xf9088a65 -//.word 0x5ec6ca79 -//.word 0xe7164fc7 -//.word 0xaa0eeba7 -//.word 0x2b6a7664 -//.word 0x17771e43 -//.word 0x3530ffc1 -//.word 0x99a6f41d -//.word 0x1ba5ac16 -//.word 0x079400f6 -//.word 0x169d83cf -//.word 0x9d0e5b05 -//.word 0x05ff500c -//.word 0x7b362373 -//.word 0xe8472122 -//.word 0x24fff7e0 -//.word 0x6703c818 -//.word 0x00b57ddc -//.word 0x49575d2a -//.word 0xda73dd6e -//.word 0xfd7ab949 -//.word 0x62ab4391 -//.word 0x1436fb99 -//.word 0xaca261b2 -//.word 0xc56c07f1 -//.word 0xaff1ea33 -//.word 0x688d025f -//.word 0xc70518eb -//.word 0xfb22d8a2 -//.word 0x349f27a4 -//.word 0xa046b7ae -//.word 0x9955d89b -//.word 0x1d26912b -//.word 0x7e0fef04 -//.word 0x5a889df6 -//.word 0xce8bb583 -//.word 0xe741d69f -//.word 0x59da77b4 -//.word 0x74bc7ae9 -//.word 0x53e104a4 -//.word 0x577a8d4d -//.word 0xd4d93356 -//.word 0x098d5478 -//.word 0x56cf5b3f -//.word 0xa91ddac8 -//.word 0x3a24daca -//.word 0x78e36fd3 -//.word 0x420e8fd4 -//.word 0x5bb023e0 -//.word 0x18155f31 -//.word 0x5ce74f6c -//.word 0xc697b325 -//.word 0x29fe0da6 -//.word 0x3d45f8ec -//.word 0x9402bbf3 -//.word 0xcfa31e34 -//.word 0x11107d6b -//.word 0xb48c1a9d -//.word 0x3bdcb75a -//.word 0x88ac6540 -//.word 0x502e97c0 -//.word 0xcb047a25 -//.word 0xb06089d1 -//.word 0x606a5cca -//.word 0x61e2c076 -//.word 0x0f060da3 -//.word 0x8eb6b4ca -//.word 0x03d61895 -//.word 0x04f49f9e -//.word 0x4d2a087a -//.word 0xb446fff6 -//.word 0x5f29eea0 -//.word 0x346d178a -//.word 0x914be04a -//.word 0x3dbb6d45 -//.word 0x9fdc742e -//.word 0x2e974dc9 -//.word 0x297f49f5 -//.word 0x88fc45e9 -//.word 0x32a97fbe -//.word 0x70faa82e -//.word 0xa2223a9b -//.word 0x31340b52 -//.word 0xc4882312 -//.word 0xb760cac8 -//.word 0xc9cbe69d -//.word 0x14ca8432 -//.word 0x43b2b52a -//.word 0xffd19bea -//.word 0xaa54c39c -//.word 0x5068b57a -//.word 0xdaa0ca49 -//.word 0x85973e23 -//.word 0x93d6867a -//.word 0x41f8e45a -//.word 0xf80c38ee -//.word 0xc73a1946 -//.word 0x11aa2457 -//.word 0x83a19444 -//.word 0x49ed14dc -//.word 0x8284d163 -//.word 0xf168d295 -//.word 0xf5cd8ce8 -//.word 0xbb7eb112 -//.word 0xb27d4acb -//.word 0x3fe905d4 -//.word 0xb325d038 -//.word 0x7a37a6d2 -//.word 0x946ea90f -//.word 0x4a4872f5 -//.word 0x1992a564 -//.word 0xf3d1c89c -//.word 0xa7e15500 -//.word 0x9ddc0d1a -//.word 0xc63e90de -//.word 0xd3462b33 -//.word 0xa59ff1af -//.word 0x053f0da2 -//.word 0x96905657 -//.word 0x07cd2496 -//.word 0x8daf626d -//.word 0x914ae531 -//.word 0xa631fcbf -//.word 0xbde14907 -//.word 0x9c5dcfcc -//.word 0x8c154ba5 -//.word 0x520cc848 -//.word 0x613a6e07 -//.word 0x4e309b9b -//.word 0x84fa3521 -//.word 0x39493e62 -//.word 0xa1d2a857 -//.word 0x61f16bed -//.word 0x4692d605 -//.word 0x375122bf -//.word 0x68e04df8 -//.word 0xd1a92611 -//.word 0xdfb5a4f2 -//.word 0x69cd7b4f -//.word 0xe5dff12a -//.word 0xdca3ee9a -//.word 0x9b7d53ca -//.word 0x2ca68d44 -//.word 0x84876a70 -//.word 0xfe652b57 -//.word 0x0843daad -//.word 0x1c04de0f -//.word 0xf3d1cc89 -//.word 0xf5ba805b -//.word 0xf3a06dfd -//.word 0x18523160 -//.word 0x1df66c77 -//.word 0xbdabd3f6 -//.word 0x696c805a -//.word 0x3c378c29 -//.word 0x316fe07b -//.word 0x948048b9 -//.word 0xb6c1caa5 -//.word 0xe59e359a -//.word 0x9bf6fc15 -//.word 0xf6c24575 -//.word 0x68f83eff -//.word 0xb0afb025 -//.word 0x0983d608 -//.word 0xa13b6f3b -//.word 0x4ca912ca -//.word 0x7ad2c27b -//.word 0x674fc253 -//.word 0x91f3aa5c -//.word 0x6faebba6 -//.word 0x60b1708c -//.word 0xe2d35538 -//.word 0x04341c6a -//.word 0x1e20ee74 -//.word 0xbf36ff8a -//.word 0xe7c96538 -//.word 0x76862a34 -//.word 0xe557a056 -//.word 0x3488f4e5 -//.word 0x23290614 -//.word 0xa5b378cc -//.word 0x92ee06ac -//.word 0x9c11154f -//.word 0x842b8ecd -//.word 0x8ec3ec84 -//.word 0x32bb9418 -//.word 0x147b65b8 -//.word 0x364b91a3 -//.word 0x6cffabeb -//.word 0x11da0179 -//.word 0xf9ad2b52 -//.word 0xa63fe419 -//.word 0xbff119d4 -//.word 0xbda240f3 -//.word 0xe8d1eb8e -//.word 0x82019dee -//.word 0x4262dc4f -//.word 0x04ad87e4 -//.word 0xbe506a1c -//.word 0xb6cb1024 -//.word 0xf25ad8ad -//.word 0xf0d44bef -//.word 0x98d3aded -//.word 0x6f15d2fb -//.word 0x0d22347e -//.word 0xd12f42f4 -//.word 0xd343fa34 -//.word 0x1a98b9f6 -//.word 0x10445295 -//.word 0x32185e14 -//.word 0x0cc9d460 -//.word 0x654ddad4 -//.word 0xb788da02 -//.word 0xe228d7b1 -//.word 0x20ce0222 -//.word 0x3c6e8898 -//.word 0xfff8af16 -//.word 0xec38216b -//.word 0x2dfb876c -//.word 0xcc735a81 -//.word 0x26dcf663 -//.word 0x9d60f123 -//.word 0x8e38aa6f -//.word 0x83152511 -//.word 0xa9be16b8 -//.word 0x84fa3bfb -//.word 0xe1b0ef9b -//.word 0x0c4dfd08 -//.word 0x4466b227 -//.word 0x6c9f3653 -//.word 0x03cb1ca2 -//.word 0x56543769 -//.word 0xf4ddaf02 -//.word 0x632755cc -//.word 0x11313474 -//.word 0x8da46873 -//.word 0xf76d34d8 -//.word 0xb6ac4e48 -//.word 0x68cd7d43 -//.word 0x1ff466a8 -//.word 0xca9fa37c -//.word 0xf18716e7 -//.word 0xa6c77d7f -//.word 0xb83f46ca -//.word 0x293ba4fd -//.word 0xe250e20a -//.word 0xa687f8da -//.word 0x45be5cd7 -//.word 0x124a1aae -//.word 0x96e12753 -//.word 0x86b8f245 -//.word 0xf3e83d13 -//.word 0xc1162b1f -//.word 0x5a539aa2 -//.word 0xa341b2f0 -//.word 0x3077befe -//.word 0xb4273b21 -//.word 0xbbfe2f18 -//.word 0x9b4cbd4d -//.word 0xa765f558 -//.word 0xa747f1c5 -//.word 0x857d1d17 -//.word 0x4943d60c -//.word 0x47ea3723 -//.word 0x977e2f5c -//.word 0xc6a7d73f -//.word 0xcbcd031f -//.word 0x3d7f18a0 -//.word 0xc3161d77 -//.word 0xcb951471 -//.word 0x7fd48ab7 -//.word 0xf4de6d50 -//.word 0xa5971ee7 -//.word 0x21a2c7cf -//.word 0x0081ef44 -//.word 0x1bfe4bf4 -//.word 0xfdcad7be -//.word 0x946526b9 -//.word 0x2c3df678 -//.word 0x9f1a088c -//.word 0xc5b92f4b -//.word 0x32b7a6d0 -//.word 0x21b2a643 -//.word 0xabaa385b -//.word 0x3dad4920 -//.word 0x48b3fcf6 -//.word 0x3ac744d7 -//.word 0xae67b1e0 -//.word 0xdf2e8a0f -//.word 0x63b01d4b -//.word 0x16a653a4 -//.word 0x544b87dd -//.word 0x6b059827 -//.word 0x4f483d30 -//.word 0x90b7995c -//.word 0x8a8d1052 -//.word 0xdc3c58bb -//.word 0x1b54d346 -//.word 0xc7a51cf0 -//.word 0x7da8e082 -//.word 0x6f1bef5b -//.word 0x12ec926f -//.word 0x16582090 -//.word 0x9b54cced -//.word 0xa22cc1d8 -//.word 0xc16a71cc -//.word 0x1cf929ae -//.word 0x908ae953 -//.word 0x31377443 -//.word 0xf766a3bc -//.word 0xb4f1fefa -//.word 0x49848db6 -//.word 0x1a46eced -//.word 0xbfbb9ee2 -//.word 0xfde9a366 -//.word 0xf4b94d57 -//.word 0x99a14f67 -//.word 0x6780171e -//.word 0x52c95e23 -//.word 0xfde4fdb7 -//.word 0x2cd10282 -//.word 0x7c0f0392 -//.word 0x52bcb2a1 -//.word 0x11fdb296 -//.word 0x90a0a94f -//.word 0xcb00979e -//.word 0xd8296691 -//.word 0x1d3dc2f7 -//.word 0xc1172a1f -//.word 0x602d47e3 -//.word 0x03bb7de5 -//.word 0x4f1ec119 -//.word 0xfc7daa84 -//.word 0x89afca43 -//.word 0x2e593ece -//.word 0x1357847e -//.word 0xbf5e8d4d -//.word 0xd3df13de -//.word 0xf82e2dbd -//.word 0x16e321e7 -//.word 0xc781798d -//.word 0x0b555915 -//.word 0x3da10f62 -//.word 0x45faec55 -//.word 0x10ef5293 -//.word 0x3deb0f89 -//.word 0x195de9ae -//.word 0xce157a08 -//.word 0xd7f13ff2 -//.word 0xb7baeb1c -//.word 0xeb4901d3 -//.word 0x1deea183 -//.word 0x9a12a27a -//.word 0x061ae2ee -//.word 0x4f8fda42 -//.word 0xdf7c7685 -//.word 0x1618233c -//.word 0xf7a52961 -//.word 0x21983bab -//.word 0x01fa4c10 -//.word 0x470ea589 -//.word 0x96343515 -//.word 0x800d2800 -//.word 0xb1e0bb65 -//.word 0x6a3d4ef2 -//.word 0x32e0baeb -//.word 0xc8d7e671 -//.word 0x5be89505 -//.word 0xfd2d8248 -//.word 0x5601af04 -//.word 0x9520fa70 -//.word 0xac09f1b0 -//.word 0xbda7e79c -//.word 0xcf3148c2 -//.word 0xc64f29ae -//.word 0x927e2369 -//.word 0xa6b5623f -//.word 0xac49f9c5 -//.word 0x770e781b -//.word 0x39bfc16f -//.word 0xf69f17c2 -//.word 0x386178ef -//.word 0x05452de9 -//.word 0x0e859f44 -//.word 0x29ef6cf7 -//.word 0x01d3ba60 -//.word 0x0c1fcc88 -//.word 0xbec9d3a9 -//.word 0xfd6d06ed -//.word 0xd438f479 -//.word 0x6b0419aa -//.word 0x37c4b09e -//.word 0x6e23c9f7 -//.word 0xbe689bdb -//.word 0x3e9d1b3f -//.word 0xa5f0ce66 -//.word 0xba59dba4 -//.word 0x0b7d6468 -//.word 0xe2d3167a -//.word 0x7505ff80 -//.word 0x5d99a0c7 -//.word 0x49d04440 -//.word 0xf4ce90c9 -//.word 0x54fc5aae -//.word 0x15abbf70 -//.word 0x45fa6fc5 -//.word 0x51f94cdf -//.word 0x300e34f1 -//.word 0xde981af0 -//.word 0x0cd35c97 -//.word 0x16fc50ad -//.word 0x35b5208a -//.word 0xf6aad9d8 -//.word 0xea75be97 -//.word 0x9fbfe263 -//.word 0xd0a8f6fa -//.word 0xd9695ff9 -//.word 0x6d388ce6 -//.word 0x8b6d8673 -//.word 0xaee2c801 -//.word 0x459f5264 -//.word 0x62b7f9e6 -//.word 0xb66d018e -//.word 0xbd9beda2 -//.word 0x3655966a -//.word 0xd6c97b37 -//.word 0x3d6958a4 -//.word 0x294dfa1c -//.word 0xead2519c -//.word 0x1688c7ba -//.word 0x7d4bd0e7 -//.word 0x5fafc2f1 -//.word 0xdda2e8cc -//.word 0xae4cd191 -//.word 0x133aeec7 -//.word 0x0dbc5de2 -//.word 0xcd8bff09 -//.word 0x6cafd01c -//.word 0xdca078f6 -//.word 0x1fac1def -//.word 0xb6987ca5 -//.word 0x5d8a38fd -//.word 0xf5277164 -//.word 0xc2f8995b -//.word 0xd6128332 -//.word 0xcdf6bd13 -//.word 0xbbb62043 -//.word 0x6359a5a5 -//.word 0xaa817b80 -//.word 0x4b4b5681 -//.word 0xcb770904 -//.word 0xb0c9578f -//.word 0xeeae069f -//.word 0xa22336a8 -//.word 0x02d3f157 -//.word 0x947f031a -//.word 0x9fa30ce2 -//.word 0xe057d328 -//.word 0x7d73dd2e -//.word 0x3ff63f87 -//.word 0xfba9b0d9 -//.word 0x51ffe2e2 -//.word 0x994013b9 -//.word 0x1be6df56 -//.word 0x7e485855 -//.word 0x847558f7 -//.word 0xf463166a -//.word 0xd749f84a -//.word 0xe649a867 -//.word 0x44526ac9 -//.word 0x6945adf1 -//.word 0x5e56df62 -//.word 0x30b68660 -//.word 0x9f6f8df8 -//.word 0x168fdb40 -//.word 0xe0882be0 -//.word 0x98d717d1 -//.word 0xe1e47565 -//.word 0x5829e788 -//.word 0xc797ae45 -//.word 0x9c35bf8c -//.word 0x990b1932 -//.word 0xcc3e5539 -//.word 0xc27c7f52 -//.word 0xf89a24a0 -//.word 0x927cacbf -//.word 0x4f36ea05 -//.word 0xbd70f207 -//.word 0xa90f2b5f -//.word 0xda12a5ad -//.word 0xffb9acdc -//.word 0xe5ed9da7 -//.word 0xeddcf85b -//.word 0xbee4b7de -//.word 0x37b2def0 -//.word 0xa7ab54b1 -//.word 0x418af163 -//.word 0xca4bd872 -//.word 0x954907b1 -//.word 0xb1a32ce7 -//.word 0x61e3ba8a -//.word 0xcce23dca -//.word 0xf6e6ebd2 -//.word 0xef0e7b4a -//.word 0x4bf03a20 -//.word 0xd1805b88 -//.word 0x78348e41 -//.word 0x8f65d51a -//.word 0x3bf993b6 -//.word 0x263fe68c -//.word 0x761a3731 -//.word 0xfc6210da -//.word 0xae872d1d -//.word 0x5877d5f7 -//.word 0x8ec26b13 -//.word 0xe5fc4049 -//.word 0x6364ab66 -//.word 0x33c25c2b -//.word 0x9d96ed98 -//.word 0x366eba6a -//.word 0x5498f3e2 -//.word 0xc5f9efc8 -//.word 0xc13dc3b0 -//.word 0x1c31147c -//.word 0xc06c2922 -//.word 0x5b3544af -//.word 0x55a1338c -//.word 0x05fc2200 -//.word 0x246ab3f7 -//.word 0x82ce5102 -//.word 0xf7ebc19e -//.word 0x9dcaf9b9 -//.word 0x3c5b3672 -//.word 0x065e4921 -//.word 0x85843197 -//.word 0xd1d2efa7 -//.word 0x064796e5 -//.word 0xf5bea2ad -//.word 0x1a168a67 -//.word 0xcf8f990a -//.word 0xbe77f9df -//.word 0x9c071188 -//.word 0x15881140 -//.word 0x02b9ca64 -//.word 0xe275c433 -//.word 0x88918ad2 -//.word 0x11044992 -//.word 0x194a9976 -//.word 0x2f0a9bf0 -//.word 0x85f644ec -//.word 0xecf2f80f -//.word 0x00795b41 -//.word 0xa03d6469 -//.word 0xa20eb377 -//.word 0xc4fd24a8 -//.word 0xe5c1a405 -//.word 0x755a432e -//.word 0x2af48b55 -//.word 0xf40d108d -//.word 0x34da4945 -//.word 0x29e79e0f -//.word 0xaaffc2a7 -//.word 0x1b4b4330 -//.word 0x9abd60c0 -//.word 0x79b01a1f -//.word 0xf1c88ecc -//.word 0x14208141 -//.word 0x04a43d78 -//.word 0x63bb9cae -//.word 0x0a2a6267 -//.word 0xfe35cfb2 -//.word 0x9f0675ae -//.word 0x2353484d -//.word 0x433cf458 -//.word 0x347273b4 -//.word 0xd99edee3 -//.word 0x370183cd -//.word 0x295739c1 -//.word 0x5502f0b7 -//.word 0x5e648cd8 -//.word 0x5c8df440 -//.word 0x89166502 -//.word 0x3c4c0d6c -//.word 0x1c92d58d -//.word 0x8d007ef5 -//.word 0x6f50efbc -//.word 0x08fbcdc6 -//.word 0x3e9f4d44 -//.word 0x0aa4467e -//.word 0x291f8bd1 -//.word 0x15f677f3 -//.word 0x3346c97f -//.word 0x4e01b2ad -//.word 0x44dc2d60 -//.word 0xff688f67 -//.word 0xa77e5ffc -//.word 0x16e16791 -//.word 0x8d1f0bcd -//.word 0xa5b8dad1 -//.word 0x888263bf -//.word 0x604c4a7d -//.word 0x10c29bb6 -//.word 0x23915d22 -//.word 0x01cb6b08 -//.word 0x698c7f01 -//.word 0x1bde90fe -//.word 0xd5da5e8c -//.word 0x81104b57 -//.word 0xad296ced -//.word 0x3bcbe0c5 -//.word 0x5abd6080 -//.word 0xb54c186e -//.word 0xeaedb554 -//.word 0x3d23c06d -//.word 0x8ea32aae -//.word 0x88b7284e -//.word 0x1ce04186 -//.word 0x2dbfa496 -//.word 0x8d35c008 -//.word 0x29ca0f38 -//.word 0x804b3214 -//.word 0x5ab74321 -//.word 0xb65d67bf -//.word 0x043ea2ad -//.word 0x94b8f0cf -//.word 0x4f66912f -//.word 0xa542a443 -//.word 0xc60cf76e -//.word 0x15f01ec8 -//.word 0xd963c222 -//.word 0x364e3c45 -//.word 0x5d6e627b -//.word 0xfffaa151 -//.word 0x07874d9a -//.word 0x882a34b7 -//.word 0xf4dc7916 -//.word 0x9022a0f9 -//.word 0x24ede579 -//.word 0xf7bed2ca -//.word 0xfa0f10c0 -//.word 0x44ef7e92 -//.word 0xbeec80df -//.word 0x20359aee -//.word 0x1c003d3a -//.word 0xd82ae02e -//.word 0xa21d532d -//.word 0xe0f750d5 -//.word 0x45e95485 -//.word 0x4bdcac1c -//.word 0xdd5bd304 -//.word 0x53adfb70 -//.word 0xa441eae1 -//.word 0xd75007ef -//.word 0xbbbdb546 -//.word 0xd840dfef -//.word 0xa5c3d4d1 -//.word 0xfc0c5677 -//.word 0xca9ded13 -//.word 0x0bd882c3 -//.word 0xf6672814 -//.word 0x74db3dc5 -//.word 0xd793b2cd -//.word 0xc9e0a79e -//.word 0x82663bac -//.word 0x3fc6a229 -//.word 0xef7a7813 -//.word 0x2f005471 -//.word 0x783aa1da -//.word 0x9715a936 -//.word 0x5e69f3c9 -//.word 0x9a20cf6d -//.word 0x459b2f1e -//.word 0xfc51b8bc -//.word 0xb3b9190d -//.word 0xa76b9c02 -//.word 0x9482fa3b -//.word 0x284474cc -//.word 0xb8051f42 -//.word 0x334880e1 -//.word 0x54285830 -//.word 0x1bf6c1b8 -//.word 0x7d247a08 -//.word 0x5b6180fc -//.word 0xb106de3f -//.word 0x10b1c50f -//.word 0x4e2fdf40 -//.word 0x7ca0e184 -//.word 0x18d560e9 -//.word 0x84fde5a3 -//.word 0xb781430c -//.word 0x332c28e9 -//.word 0x368ff3ef -//.word 0x35a4c586 -//.word 0x86b1dbcc -//.word 0x5d6f1bdd -//.word 0xf96cec52 -//.word 0x1fae4b07 -//.word 0xc8991c22 -//.word 0x1713bd50 -//.word 0x8de5e152 -//.word 0x80649cb9 -//.word 0xc952baed -//.word 0xbeff5574 -//.word 0x60b3a771 -//.word 0xd5501c6b -//.word 0x1834ab50 -//.word 0xef5d67ba -//.word 0x1dd05170 -//.word 0xd93b7130 -//.word 0x80d925ac -//.word 0x8796b8d2 -//.word 0xb3743650 -//.word 0x8c2d7f58 -//.word 0x0f1a9ba0 -//.word 0xa3534dae -//.word 0x4e18eb52 -//.word 0x296f6c74 -//.word 0x110fc30f -//.word 0xa07d6c7e -//.word 0x5b7544f7 -//.word 0x2d8b9d55 -//.word 0x1512921a -//.word 0x1b3d98b4 -//.word 0x888456ff -//.word 0x5649b70c -//.word 0xe6bc3d21 -//.word 0xf1fc9800 -//.word 0xc17f776c -//.word 0xa1b39eea -//.word 0x92e538c5 -//.word 0x3f636f54 -//.word 0x33dd3b7f -//.word 0x4a117780 -//.word 0x65a83ae7 -//.word 0x625a64e1 -//.word 0x4c5977b9 -//.word 0xceeda99f -//.word 0xee5b37a9 -//.word 0xf80cfb17 -//.word 0xb7eb41db -//.word 0xeb0fd759 -//.word 0xf89a636b -//.word 0xdce1f9a8 -//.word 0x63cdede6 -//.word 0x9e81e6fd -//.word 0x913c34ce -//.word 0x2c816484 -//.word 0x7d76111a -//.word 0x238bfd1e -//.word 0x065b60b4 -//.word 0x45d77fdd -//.word 0x70a181f9 -//.word 0xf8b67e8b -//.word 0xe350da3d -//.word 0xc40bd124 -//.word 0xeb465244 -//.word 0xd9cc1157 -//.word 0xf7b4d8ca -//.word 0x87851d09 -//.word 0xda9edafc -//.word 0xc3d599d1 -//.word 0x4d5fcefd -//.word 0xa9f06a7d -//.word 0x6a22ad62 -//.word 0xf51b3c8c -//.word 0x326a73b6 -//.word 0x8833fcb3 -//.word 0x098ca1f6 -//.word 0xe9265e58 -//.word 0x3530bb16 -//.word 0xc1785919 -//.word 0x63d4ca7b -//.word 0x5ec0a546 -//.word 0x2148da7f -//.word 0x32294463 -//.word 0x65337df0 -//.word 0x51f1f6a7 -//.word 0x048c4791 -//.word 0xf6edc380 -//.word 0x3c225097 -//.word 0xfe03760c -//.word 0x2b15b52d -//.word 0x6bae1ca1 -//.word 0x565a17f1 -//.word 0xe37e8947 -//.word 0x233b1a75 -//.word 0x2f95d338 -//.word 0x5fd5e8be -//.word 0xbc2bd467 -//.word 0xb898abc9 -//.word 0x1d0bacf6 -//.word 0x44cb1601 -//.word 0x87143ebe -//.word 0xf805ddca -//.word 0x54baaecb -//.word 0x32b539f9 -//.word 0x8082e9de -//.word 0x309a6559 -//.word 0x2f891de9 -//.word 0x974c2328 -//.word 0x25fd3d96 -//.word 0xedb23898 -//.word 0x4ca27fc1 -//.word 0x1f89ec4f -//.word 0x324eddf9 -//.word 0xfce38be8 -//.word 0x896e9703 -//.word 0xb7a6e66f -//.word 0xa57faf56 -//.word 0x6909d2e8 -//.word 0x01956ca0 -//.word 0x8c1ba8c9 -//.word 0xbbd8d840 -//.word 0x823bc47b -//.word 0x130241ca -//.word 0x0ca106dd -//.word 0xefe3bc87 -//.word 0xd4d354c1 -//.word 0x5add9df2 -//.word 0xe331166e -//.word 0x0168013c -//.word 0x2b6ab81c -//.word 0xb58f44c8 -//.word 0xff042c7b -//.word 0xec718bb0 -//.word 0x95d8652c -//.word 0x3fc13b3e -//.word 0x8b94dd46 -//.word 0xed468074 -//.word 0x5f3710d2 -//.word 0x575bc885 -//.word 0xf699ff50 -//.word 0x82704559 -//.word 0x16e0ae30 -//.word 0x98886e0d -//.word 0xec0ca659 -//.word 0x67b97e70 -//.word 0x876c74a6 -//.word 0xe1aff488 -//.word 0x5a262864 -//.word 0x9a2a110b -//.word 0xbeb3d7d5 -//.word 0x4d7b5de6 -//.word 0x6e6019b0 -//.word 0x580a23b9 -//.word 0x09cf8b9e -//.word 0x3bd3f059 -//.word 0x94744ebf -//.word 0x1de5184c -//.word 0xf5188723 -//.word 0x47e23151 -//.word 0x795add52 -//.word 0xa68296d6 -//.word 0x4f29fec5 -//.word 0x4d0fe580 -//.word 0x0a4b1a6a -//.word 0xf1ea81a7 -//.word 0x23d96623 -//.word 0x6c0511d6 -//.word 0x75c09b47 -//.word 0x3b67004f -//.word 0xbf417420 -//.word 0x00abfb85 -//.word 0x2672346c -//.word 0x008175a1 -//.word 0xb0bc1ddc -//.word 0xa52b26fe -//.word 0xca5bfa98 -//.word 0xfd0188ad -//.word 0xc3e196b9 -//.word 0x3aee59f1 -//.word 0x4fb343cd -//.word 0x30f11cc4 -//.word 0x058a5456 -//.word 0xdb9d9850 -//.word 0xe0f3a34c -//.word 0xd69a5777 -//.word 0xc2cf0c97 -//.word 0xe422284c -//.word 0xecd4ef95 -//.word 0x6b849d97 -//.word 0x880ab29a -//.word 0xf4a48e55 -//.word 0x20503d6b -//.word 0xad789435 -//.word 0x24d47dc2 -//.word 0xe78d8f1c -//.word 0x679ee2cd -//.word 0x988021a2 -//.word 0xa206e0af -//.word 0xda863093 -//.word 0xf03971fe -//.word 0x69e46870 -//.word 0x50b89243 -//.word 0x2977b7eb -//.word 0x27d9c17d -//.word 0x9f2ecf6e -//.word 0xbb44869d -//.word 0x738ba794 -//.word 0xb977e70b -//.word 0xf426fbae -//.word 0xb043f221 -//.word 0x942ac740 -//.word 0x944d37ab -//.word 0x68d6d082 -//.word 0x3c8e4b6d -//.word 0xa9fd1be0 -//.word 0xe4d3469d -//.word 0x3586747a -//.word 0xab3d4564 -//.word 0x0fede8a4 -//.word 0x16c1ea61 -//.word 0xdac04b66 -//.word 0x8baad726 -//.word 0x6222b3fd -//.word 0xd71237b9 -//.word 0x144cfb59 -//.word 0xa96d3515 -//.word 0x8107429e -//.word 0x15ff82a6 -//.word 0xdf3369a3 -//.word 0x1260d3d0 -//.word 0x88449875 -//.word 0xfcff6169 -//.word 0x79bfbad5 -//.word 0x129c683a -//.word 0xd4c1fcb6 -//.word 0xf9cda883 -//.word 0x5e7952c0 -//.word 0x387ae774 -//.word 0x02a9f2d0 -//.word 0xba616db4 -//.word 0x4c28d675 -//.word 0x4f9286de -//.word 0xef633f74 -//.word 0x2af404fe -//.word 0x40d82d45 -//.word 0x64beba19 -//.word 0xb899e894 -//.word 0x78ff02a3 -//.word 0x75cf7ac1 -//.word 0xc6173806 -//.word 0xba353261 -//.word 0x113c3d22 -//.word 0x6b9922bb -//.word 0x00f6f5c7 -//.word 0x925ea24b -//.word 0xa0a2c93c -//.word 0xddfccc42 -//.word 0xe0f326bc -//.word 0x1d7efe04 -//.word 0x146cfbf4 -//.word 0xc8035ba9 -//.word 0x73e83f86 -//.word 0x783f497c -//.word 0x99126989 -//.word 0x6af7f47f -//.word 0x05edf707 -//.word 0x0088cae5 -//.word 0x9c4ee87e -//.word 0x3f60fd97 -//.word 0x255d415f -//.word 0x528305b0 -//.word 0xcb178b92 -//.word 0x05071b01 -//.word 0x9ecf53f0 -//.word 0x4b99bf8d -//.word 0x12a8aac7 -//.word 0xb9f6330d -//.word 0x7e1ca359 -//.word 0x0873fd6e -//.word 0x9e79d75e -//.word 0x9776694e -//.word 0x115fe47d -//.word 0xe6fa0583 -//.word 0xdc43e9d7 -//.word 0x1c0f2394 -//.word 0xe6ef0c7d -//.word 0x82575a3e -//.word 0x7afff4f5 -//.word 0x068a05f0 -//.word 0xc8664fb8 -//.word 0xb9f3c34f -//.word 0x64e74eb7 -//.word 0x52f1f5b3 -//.word 0xc59c24d2 -//.word 0xa97743a8 -//.word 0xc7738b5f -//.word 0x3c8c186f -//.word 0x29ab3fa9 -//.word 0xadcb217a -//.word 0x105b806e -//.word 0x41e4d2f3 -//.word 0x83ec9460 -//.word 0x631ae135 -//.word 0xed9b43a4 -//.word 0x1fc3c951 -//.word 0x9ef85a57 -//.word 0xa8cc488b -//.word 0x4a692804 -//.word 0xd332e2db -//.word 0x88a7042f -//.word 0x99895c6c -//.word 0x543fc5cd -//.word 0x99794120 -//.word 0x8e1348ca -//.word 0x933c600a -//.word 0x79d7ee82 -//.word 0xee214cf3 -//.word 0x3c951b48 -//.word 0x340ddbd6 -//.word 0x6429b9e2 -//.word 0x91f4a763 -//.word 0x61c5b20a -//.word 0x57649080 -//.word 0x046e79ef -//.word 0x7cfb39c3 -//.word 0x087d82b2 -//.word 0x1aec86f9 -//.word 0x8620c5e9 -//.word 0xee7e24a3 -//.word 0x7ed64020 -//.word 0xda8c0174 -//.word 0x55f67253 -//.word 0x6406d0d4 -//.word 0x5229e175 -//.word 0x356e865f -//.word 0x20eb94ec -//.word 0x9a5de067 -//.word 0x4f0e9913 -//.word 0x06fcdb6e -//.word 0xd33780b6 -//.word 0x8e8b3aad -//.word 0x835fdf9a -//.word 0x6bdd0390 -//.word 0x9c53ccf2 -//.word 0x7cd90237 -//.word 0x3b3566eb -//.word 0xc2fb45f6 -//.word 0xe6f94c21 -//.word 0xe2d19ed6 -//.word 0x04e82427 -//.word 0xa67f2413 -//.word 0x60201604 -//.word 0x7c3cb39b -//.word 0xaa124eb0 -//.word 0xf5d26795 -//.word 0xf6037e9b -//.word 0x482225d8 -//.word 0x3c8c5927 -//.word 0xcd9e126f -//.word 0xd61a1929 -//.word 0x82cc1a1c -//.word 0x046efa6b -//.word 0x89ca6ad2 -//.word 0x6b1ebd2d -//.word 0xa8c4f63a -//.word 0x9212269f -//.word 0xc880f52f -//.word 0x64087e69 -//.word 0x76d36041 -//.word 0xb2111124 -//.word 0x65297636 -//.word 0xae12b1de -//.word 0xea003b84 -//.word 0x70443299 -//.word 0x7f6df4d8 -//.word 0x74b4eccc -//.word 0x4097ac93 -//.word 0x1ac33ce1 -//.word 0x7137b248 -//.word 0x25a703b6 -//.word 0xf61e193f -//.word 0x3de8261c -//.word 0xdaaf37f4 -//.word 0x6de40c5b -//.word 0xc9612799 -//.word 0xa54c23ac -//.word 0x953e4790 -//.word 0x39a45bbd -//.word 0xb466baf2 -//.word 0x60c7a931 -//.word 0xc18de70a -//.word 0xb761861d -//.word 0xf778f8db -//.word 0xbb736d8c -//.word 0xb9845d96 -//.word 0x52d360fc -//.word 0x0d204625 -//.word 0x43a964df -//.word 0x1c4e2ca3 -//.word 0xbaf3011b -//.word 0xb32649e1 -//.word 0xc501c38a -//.word 0xc5521ae3 -//.word 0xd9fabb7a -//.word 0xe793e460 -//.word 0x4d56fe2e -//.word 0xd33b2d46 -//.word 0xdd61255b -//.word 0xe6b13f34 -//.word 0x29bfccac -//.word 0xa1f0a9fe -//.word 0x34e2143f -//.word 0x2c08bd2c -//.word 0xe6952026 -//.word 0xce9c137b -//.word 0x8b759be7 -//.word 0x7662045b -//.word 0x517231fc -//.word 0x36a6306f -//.word 0xcd531154 -//.word 0xc2c7f910 -//.word 0x762f72d0 -//.word 0xf5b905cb -//.word 0x29f50bc7 -//.word 0x4d81c0de -//.word 0xa3e59982 -//.word 0x6abcd8bf -//.word 0x0b155dc0 -//.word 0x9318bf95 -//.word 0x65ed9b33 -//.word 0x31d92cbc -//.word 0x20aa1c01 -//.word 0x51569a46 -//.word 0x89dfad45 -//.word 0x2679c875 -//.word 0x55ef9e8b -//.word 0x85433741 -//.word 0x1c954457 -//.word 0x6845b0d8 -//.word 0xd85c779f -//.word 0x6c28bb19 -//.word 0x6a27154d -//.word 0x53272919 -//.word 0x15aa7dbe -//.word 0x828f8b9f -//.word 0x01ef1445 -//.word 0x8346b8a7 -//.word 0xb9d3c4a8 -//.word 0x85414be2 -//.word 0xae8678a2 -//.word 0xd70c2233 -//.word 0xb20ea160 -//.word 0x7146e034 -//.word 0x7dc5b404 -//.word 0x6b226cb0 -//.word 0x2cd6aa25 -//.word 0x83e77126 -//.word 0xbcc47e4d -//.word 0x9c70dc4c -//.word 0x94e3b379 -//.word 0x39ae618a -//.word 0xf9ddcb9c -//.word 0x0621f57b -//.word 0x972fd11d -//.word 0x5063556f -//.word 0xfea9d055 -//.word 0x889d7eeb -//.word 0x23f15a12 -//.word 0xc40f3328 -//.word 0xdb000216 -//.word 0x3e8d7b90 -//.word 0x63a4e298 -//.word 0xd3fd2044 -//.word 0xdbfc16c2 -//.word 0x85da3199 -//.word 0xc7003f31 -//.word 0xf9b38196 -//.word 0x8cf60179 -//.word 0xfaac2578 -//.word 0xf9fe859f -//.word 0xf4fcfa2e -//.word 0xbb87f79c -//.word 0x7a6e1ddd -//.word 0xe8d709e1 -//.word 0xc0e1715d -//.word 0x75876fcd -//.word 0x22c81cba -//.word 0xbf046138 -//.word 0x9baa0ab4 -//.word 0x06101cec -//.word 0x4ea2693f -//.word 0xee3f6127 -//.word 0x01e02b04 -//.word 0xfd7bf51b -//.word 0x9d2788de -//.word 0x1f801f6e -//.word 0xb04d795e -//.word 0x25602dba -//.word 0xebbe3e47 -//.word 0x4100ef0d -//.word 0xa4f9d813 -//.word 0x8b993a6a -//.word 0x5511906c -//.word 0x80386646 -//.word 0x1b2e6eb4 -//.word 0x7e3fd10c -//.word 0x380ac37e -//.word 0x49e25a9a -//.word 0x9274a012 -//.word 0x89aae7c2 -//.word 0x31d05ced -//.word 0x4af6dfca -//.word 0xc495123f -//.word 0x7a75b0ec -//.word 0x1dcd216b -//.word 0x6ead4bd6 -//.word 0xb199aa8a -//.word 0x5e76a32b -//.word 0x19ab15e9 -//.word 0xe4803201 -//.word 0x94c98d86 -//.word 0x81c97361 -//.word 0x82517f97 -//.word 0x192869ca -//.word 0xeaaf1f03 -//.word 0x72c517ae -//.word 0xf5e9e3e6 -//.word 0xb89e06f3 -//.word 0x71140611 -//.word 0xfc04c273 -//.word 0x4fdc0688 -//.word 0xb01c5d7d -//.word 0x26002603 -//.word 0x2d5fea52 -//.word 0xadd3ed6e -//.word 0x2d1a03a9 -//.word 0x44bca569 -//.word 0x51ee442b -//.word 0x6cb7ddc8 -//.word 0x9d51cef7 -//.word 0x4bd2e814 -//.word 0xf70cc520 -//.word 0x2ab15c08 -//.word 0xabbbd22a -//.word 0xf60a9415 -//.word 0xea4fa290 -//.word 0xc22a2edf -//.word 0x468f6541 -//.word 0x426e8dbd -//.word 0x3893501e -//.word 0x52cb573d -//.word 0x9a481b7e -//.word 0x6d46f89d -//.word 0x2def84ab -//.word 0x377c1e53 -//.word 0x159eca62 -//.word 0xf41c3c87 -//.word 0x58bd3256 -//.word 0x0e680793 -//.word 0x638a85ae -//.word 0x93b8fc8a -//.word 0x84969082 -//.word 0xb4f7d7ae -//.word 0x7045a462 -//.word 0x48241df8 -//.word 0xbf5214d0 -//.word 0x47d19494 -//.word 0x6c49b9c1 -//.word 0x4fa8c563 -//.word 0x560b7120 -//.word 0x22e18177 -//.word 0xc14d9b4a -//.word 0x25cd599a -//.word 0xd51a9d93 -//.word 0xe34f25c8 -//.word 0x1e4c5fbf -//.word 0x885d7eb0 -//.word 0x0b17cd8a -//.word 0x67834337 -//.word 0x6f7f5821 -//.word 0x756018f5 -//.word 0x03dc76a7 -//.word 0xcc28e2b6 -//.word 0xe15d1eb1 -//.word 0x28204dfa -//.word 0x0b824dca -//.word 0x6d254675 -//.word 0xe2a183ef -//.word 0x1f25818f -//.word 0xaf624614 -//.word 0xe8a4f4e6 -//.word 0x1e429e9e -//.word 0x16395ac7 -//.word 0xbd1498e6 -//.word 0x1a0fb2b9 -//.word 0x827bc4bd -//.word 0x0b64bdf2 -//.word 0x4372b6e2 -//.word 0x210d83e0 -//.word 0x3bc4888e -//.word 0x3af0cea2 -//.word 0x8b9457e9 -//.word 0x5888ae8c -//.word 0xb7d7c192 -//.word 0x2165f3a6 -//.word 0x25d56e1a -//.word 0x5da9b62d -//.word 0xa2ab8489 -//.word 0x7c8cd110 -//.word 0xdccc31d8 -//.word 0x0ed96274 -//.word 0xe97b2576 -//.word 0x496f4c31 -//.word 0xbf5315c4 -//.word 0x86c2b654 -//.word 0xb9bf3998 -//.word 0xc4578a9b -//.word 0x1982cfbd -//.word 0x244bf7fb -//.word 0x80309671 -//.word 0x6bccf01d -//.word 0x77b353e6 -//.word 0x839eabdd -//.word 0xeac850c2 -//.word 0xfa9722ca -//.word 0xa87fd89f -//.word 0x812495a9 -//.word 0xe4bebc8c -//.word 0x6fc206f2 -//.word 0xb7bfd28a -//.word 0x3c85bc51 -//.word 0x9c8d7010 -//.word 0x0695c125 -//.word 0xf28bf587 -//.word 0x0fac6305 -//.word 0x7ded41ce -//.word 0x3d9ab736 -//.word 0xe63d37b7 -//.word 0x99c11136 -//.word 0x36d74288 -//.word 0xd0998d35 -//.word 0x5f6dce7c -//.word 0xb52d8a97 -//.word 0xb485ca40 -//.word 0xbd9c2a73 -//.word 0x6bf62d76 -//.word 0x8299d317 -//.word 0x226e6e35 -//.word 0x41ebb181 -//.word 0x58ef0a86 -//.word 0x5bed32e7 -//.word 0xef4d02e8 -//.word 0xd80f8830 -//.word 0xb0b25ace -//.word 0xdf542a79 -//.word 0xc71a9b1c -//.word 0x3fd25392 -//.word 0x43d751ad -//.word 0xe935817e -//.word 0x970e8ed0 -//.word 0x743df8f6 -//.word 0x1c3866c7 -//.word 0x983b3de6 -//.word 0x8da37147 -//.word 0xb3989cee -//.word 0x89ee4dfa -//.word 0x484da2e3 -//.word 0x15901900 -//.word 0x7a6ca34c -//.word 0x1752fa69 -//.word 0x959635e5 -//.word 0xdcd09abd -//.word 0x8683b31f -//.word 0x93fca474 -//.word 0x5e7dbb9e -//.word 0xcf9b497e -//.word 0xd3e5b0ba -//.word 0x09c6bebd -//.word 0xbfad39ff -//.word 0x1c6abb86 -//.word 0x9edcc0ad -//.word 0xc8c9fe24 -//.word 0x140df538 -//.word 0x2ff7c654 -//.word 0x65f048c8 -//.word 0x5a5d59ca -//.word 0xfcc772ba -//.word 0xb5397fab -//.word 0xe5eaed1e -//.word 0x8f1c0410 -//.word 0x53447738 -//.word 0x9c6b398a -//.word 0x1ad493ff -//.word 0x73df7498 -//.word 0x352d08a1 -//.word 0x10058b33 -//.word 0x42f760fc -//.word 0x52bf5d42 -//.word 0x016c6a26 -//.word 0x7ec14a26 -//.word 0xd9dbb8e6 -//.word 0xba14b630 -//.word 0x53282239 -//.word 0x93968a26 -//.word 0x9c4941ce -//.word 0x7878b2c2 -//.word 0x07cbf58b -//.word 0x3cbfa032 -//.word 0x894be006 -//.word 0x98c4c899 -//.word 0x3cfee80c -//.word 0xa7b4228c -//.word 0xdd29b91d -//.word 0x6910ab96 -//.word 0x4ea941ed -//.word 0x402ee4b5 -//.word 0x146d32e5 -//.word 0x76b651db -//.word 0xdaf783a1 -//.word 0xb526fb6e -//.word 0xecdff070 -//.word 0x8c4fefc8 -//.word 0xbd5075d7 -//.word 0xf1d5bdb8 -//.word 0x6189d70d -//.word 0xbab3faff -//.word 0x135d1b80 -//.word 0x23b5bed3 -//.word 0xb1b30d4f -//.word 0x4bfc2760 -//.word 0x3b07bace -//.word 0xb77ed442 -//.word 0x58e7f606 -//.word 0xce836b0c -//.word 0xd176d732 -//.word 0x5a2913c4 -//.word 0x14ed3842 -//.word 0x0de1fa64 -//.word 0xb215385c -//.word 0xfaefd05b -//.word 0xe1ceb856 -//.word 0x18ee4b0a -//.word 0xfb8ce03e -//.word 0xc34aa148 -//.word 0xfdd49bd2 -//.word 0x3bc411de -//.word 0x09c31608 -//.word 0x22f15b0b -//.word 0xe4884587 -//.word 0x02bc4202 -//.word 0x79e55e2c -//.word 0xc5df1167 -//.word 0x54b15b86 -//.word 0x3b6e13d5 -//.word 0x28597d5a -//.word 0x974c1a5b -//.word 0x495bc421 -//.word 0xf2b4fafb -//.word 0x33c97885 -//.word 0xc7b20a29 -//.word 0x01cca3e7 -//.word 0x76a7a952 -//.word 0xf71f94db -//.word 0xc2c8b752 -//.word 0xf8905daa -//.word 0x529f18fd -//.word 0x108256cf -//.word 0x33893597 -//.word 0xec6d997c -//.word 0x54367b5c -//.word 0x5d5c8412 -//.word 0x092ddaf9 -//.word 0xda6e3aac -//.word 0x89454710 -//.word 0xfb572195 -//.word 0x702d3ab8 -//.word 0xfedc65cd -//.word 0x3ee530fb -//.word 0x455a7488 -//.word 0xd5422a56 -//.word 0xd53f80ae -//.word 0xff6e2d3d -//.word 0xd98f015c -//.word 0xe666c095 -//.word 0x1d603062 -//.word 0x9a7a7137 -//.word 0x945f8dc3 -//.word 0x8fd05074 -//.word 0xd2495a39 -//.word 0x1ce2728b -//.word 0x93731dae -//.word 0xfdfb6f34 -//.word 0x324322c4 -//.word 0xd1bee519 -//.word 0x33b4f64d -//.word 0x9d9ff358 -//.word 0xbad6eed4 -//.word 0x4868bf03 -//.word 0x114b9e12 -//.word 0x1db6f19f -//.word 0x26cb627a -//.word 0x4c7935a8 -//.word 0x0aa1d8ae -//.word 0x6977bc0c -//.word 0x732c6407 -//.word 0xebcabcab -//.word 0x3b5fab11 -//.word 0xae5debde -//.word 0xdf41190c -//.word 0x727308ed -//.word 0x016d5b6c -//.word 0x59205397 -//.word 0xe793e55a -//.word 0x6dce108d -//.word 0xf9f66d32 -//.word 0x18b908f7 -//.word 0x47ed6e03 -//.word 0xaa7307ee -//.word 0x0162a611 -//.word 0xd7615f01 -//.word 0xfc559956 -//.word 0x363d63b1 -//.word 0x34590cfd -//.word 0xc392edf4 -//.word 0x45168ae5 -//.word 0x5e43dab5 -//.word 0xf0c6e225 -//.word 0x4a048952 -//.word 0x9cb9a782 -//.word 0xaede5f1d -//.word 0xd2d1affa -//.word 0x18b045dc -//.word 0xc005943d -//.word 0xf5a9284a -//.word 0xb8e2362e -//.word 0x1acf7893 -//.word 0xae063766 -//.word 0x3e7baadb -//.word 0xbda47eb2 -//.word 0x7ddab6b8 -//.word 0xa203b590 -//.word 0xd76e99b3 -//.word 0x3ffecbb6 -//.word 0xae8bd4cc -//.word 0x1a85738b -//.word 0x4cdaecf3 -//.word 0xdb1aa2ac -//.word 0x5bdae88f -//.word 0xd2561568 -//.word 0x6b5ad6fa -//.word 0x6f62c944 -//.word 0x70004703 -//.word 0xc87e8178 -//.word 0x42c4ce6b -//.word 0x167d4370 -//.word 0x1b768569 -//.word 0x3846db4c -//.word 0x1b348727 -//.word 0x2e555761 -//.word 0xc7f57742 -//.word 0xa03889b5 -//.word 0x8601f74d -//.word 0x55138887 -//.word 0x2377324f -//.word 0xbc1d30c5 -//.word 0x4fc65440 -//.word 0x66209d93 -//.word 0x1b330c90 -//.word 0x89fdb4cb -//.word 0x825911a1 -//.word 0x80269a78 -//.word 0xdda49947 -//.word 0x46213b5a -//.word 0x6dd6e34f -//.word 0xfe0cc465 -//.word 0xd583aff6 -//.word 0x6e132941 -//.word 0x9c94c16d -//.word 0x7efca1cb -//.word 0xafc7625c -//.word 0xbe9c2593 -//.word 0xde2ddf5b -//.word 0xde5ff45c -//.word 0x5bab087a -//.word 0x34c3119f -//.word 0x3e79b1bb -//.word 0x39ddc409 -//.word 0x03a63593 -//.word 0x0cd415f8 -//.word 0x0a93ee6d -//.word 0xee615402 -//.word 0x1673be27 -//.word 0xc455946e -//.word 0xcfd28992 -//.word 0x98132bb9 -//.word 0x400bb8f6 -//.word 0x18123412 -//.word 0x59cfb88c -//.word 0x165c0dde -//.word 0x6ea57a02 -//.word 0x0611d935 -//.word 0xb765f0fb -//.word 0x83e5ff63 -//.word 0xcebc968c -//.word 0xca9da968 -//.word 0x34abe6c0 -//.word 0x3e964678 -//.word 0xcc07e315 -//.word 0xe23f097c -//.word 0x5dfb8ffc -//.word 0xe29a688f -//.word 0x1581755d -//.word 0x0bbf9d82 -//.word 0x01ed2011 -//.word 0x4e582859 -//.word 0x9663a267 -//.word 0x41264bcc -//.word 0x2b5b0ea0 -//.word 0x9d7b8dc6 -//.word 0x7d24fe72 -//.word 0xc1be38e9 -//.word 0x295e0d88 -//.word 0x2eeadb08 -//.word 0x367f5e00 -//.word 0x090fc8ab -//.word 0x884f14ec -//.word 0x9dd0978f -//.word 0x6e6bd8d2 -//.word 0xd6e3a124 -//.word 0x15c6562c -//.word 0xc694860d -//.word 0x1223c0e9 -//.word 0x2442a8a4 -//.word 0xdc9d49ea -//.word 0xc8e1ad73 -//.word 0x5020ab85 -//.word 0x307601bb -//.word 0x2ceda306 -//.word 0xfe9e52f1 -//.word 0x94196f29 -//.word 0x7807123c -//.word 0x900e57a1 -//.word 0x07f5f8f9 -//.word 0x8b092194 -//.word 0xb9bf7f37 -//.word 0xd59a9b1c -//.word 0xbf4f663b -//.word 0x222814c8 -//.word 0xefa62efd -//.word 0x0a6ae319 -//.word 0x4355a0a9 -//.word 0x87efe006 -//.word 0x5705441f -//.word 0x7a97e678 -//.word 0xeff1eb73 -//.word 0x261757cf -//.word 0x7066256e -//.word 0xb379985b -//.word 0x624acc0b -//.word 0xac9990e3 -//.word 0xf49278fb -//.word 0x82aa2d22 -//.word 0x78ca0822 -//.word 0x07afdf45 -//.word 0xe2911f17 -//.word 0xf3021b6e -//.word 0x4e1aa4a8 -//.word 0x63d1da34 -//.word 0x77ac4154 -//.word 0x559c1820 -//.word 0x4023e6cf -//.word 0x2db85532 -//.word 0x2f6d4381 -//.word 0x33cf175a -//.word 0xed0d5107 -//.word 0x125d6600 -//.word 0xc89ccab0 -//.word 0x5b344e7c -//.word 0x3143ac02 -//.word 0x00fa609e -//.word 0x3e43ba33 -//.word 0xd9a63228 -//.word 0x296dfbb0 -//.word 0x2306db4f -//.word 0xcfaa399a -//.word 0xfc3c783e -//.word 0x32748343 -//.word 0xe83ca992 -//.word 0xf75aacb5 -//.word 0x4f5014df -//.word 0xe880c92c -//.word 0xfc94e129 -//.word 0x741db797 -//.word 0xa07a3d6c -//.word 0x2afc931b -//.word 0x4d48d815 -//.word 0x42fc4090 -//.word 0xfb956687 -//.word 0x1490e402 -//.word 0x07cf2297 -//.word 0x9f3f6b31 -//.word 0xafb84610 -//.word 0x03240311 -//.word 0x97e49430 -//.word 0x076f9e4b -//.word 0x473cd029 -//.word 0x94e374ba -//.word 0xaa7f43a0 -//.word 0x38567eef -//.word 0x91bc3a31 -//.word 0xa434fcae -//.word 0x2ed985ea -//.word 0x2efcef6e -//.word 0x9a0ff9cb -//.word 0x50c1a0dd -//.word 0x4f6bef4d -//.word 0x27ab1759 -//.word 0xae4ec2d8 -//.word 0xf574a578 -//.word 0x7aee544b -//.word 0x9feb5b82 -//.word 0x5bd48a78 -//.word 0x307490f2 -//.word 0x5d5ccca5 -//.word 0x54865ff8 -//.word 0x6e38860c -//.word 0xde2b27f9 -//.word 0xe4eda95b -//.word 0x4384090e -//.word 0xf4542a35 -//.word 0x1c436d81 -//.word 0x3c1a82b0 -//.word 0xa72e7e53 -//.word 0x3a412dd5 -//.word 0x47a3a9b9 -//.word 0xd29c2b23 -//.word 0x000f229a -//.word 0xcc57820c -//.word 0xfc755f12 -//.word 0x536dba76 -//.word 0x09ed9bf3 -//.word 0x7830603b -//.word 0x1822543f -//.word 0xadc583aa -//.word 0xbfd3cdae -//.word 0x4ba53a04 -//.word 0xb8538d2e -//.word 0x0c1d1c00 -//.word 0x6009de5e -//.word 0x92cec647 -//.word 0x39f14f13 -//.word 0xde2e59f8 -//.word 0x691933d3 -//.word 0xd905f925 -//.word 0x3825205c -//.word 0xcef14f55 -//.word 0x96cb701e -//.word 0xeee30800 -//.word 0x9258c3bd -//.word 0xcba05416 -//.word 0xe4297b90 -//.word 0xde406778 -//.word 0x65333f25 -//.word 0x02b2fc7d -//.word 0x917b79bb -//.word 0xf637cd6f -//.word 0x0c9ed8c5 -//.word 0xdee21c0b -//.word 0x1a4bce6e -//.word 0xc21e2d04 -//.word 0x25c41310 -//.word 0x0e28ca81 -//.word 0x3b6120bb -//.word 0x1091be9a -//.word 0x8d0db5b4 -//.word 0x7ebe5adf -//.word 0xf1c754f4 -//.word 0xed67f3d2 -//.word 0x6121c4a5 -//.word 0x5b1b6268 -//.word 0x7ac58ea8 -//.word 0xa6ba828b -//.word 0xfeeb8312 -//.word 0x12fab69b -//.word 0x53e434aa -//.word 0xc8e360e8 -//.word 0x0293796c -//.word 0x51536b3a -//.word 0x38eeeb09 -//.word 0x1f7bc24a -//.word 0x48816965 -//.word 0x045fd746 -//.word 0x27eb9718 -//.word 0xb95a1d50 -//.word 0xee605aee -//.word 0x58978eff -//.word 0x5c255e67 -//.word 0xe39a26dd -//.word 0x51179037 -//.word 0xbbb566e8 -//.word 0x5524a4c7 -//.word 0x2993d212 -//.word 0x0fd090b2 -//.word 0xd9b173c0 -//.word 0xceb20f49 -//.word 0x5adf554e -//.word 0x03f5200f -//.word 0x9fc40a8a -//.word 0xc4d7843e -//.word 0x81572634 -//.word 0x4b2d4340 -//.word 0x3a67c185 -//.word 0x76dd2737 -//.word 0xec14f8a5 -//.word 0x45624076 -//.word 0x18536c32 -//.word 0x5e4c5e05 -//.word 0x276ec1c0 -//.word 0x8cbd9a21 -//.word 0xe5822054 -//.word 0x3ceeceb9 -//.word 0x01ffb6e8 -//.word 0xfea818f3 -//.word 0x8e2c33eb -//.word 0x0acb5ba5 -//.word 0x85a04cbd -//.word 0xb9cabedc -//.word 0x40ca3a37 -//.word 0x082c2b58 -//.word 0x016a3821 -//.word 0x180dd10e -//.word 0x691508ba -//.word 0xb09ba3a5 -//.word 0x01b56f34 -//.word 0xba9ad7f9 -//.word 0xb506b435 -//.word 0xc2e0679b -//.word 0x541b2657 -//.word 0x7ada934f -//.word 0x11d793a9 -//.word 0x39055d8d -//.word 0x0574d12c -//.word 0x77750c01 -//.word 0xab003956 -//.word 0x5252a90b -//.word 0x62da2793 -//.word 0x0c56853f -//.word 0xef3a7bbf -//.word 0x8b51b2e6 -//.word 0xf8a61bad -//.word 0xd7a5857b -//.word 0x8a7e6fa3 -//.word 0xa0ca1a2e -//.word 0x9371e3dc -//.word 0xb6cbd065 -//.word 0x69056904 -//.word 0x8fc7c936 -//.word 0x4213f4c0 -//.word 0xc5716bef -//.word 0xb949fe23 -//.word 0x9490e28f -//.word 0x50a6033a -//.word 0x607f9b49 -//.word 0xe8020481 -//.word 0x2daecb08 -//.word 0x4b83056b -//.word 0x2620e6e5 -//.word 0xa2298fdf -//.word 0x17eb28b3 -//.word 0xff432fb5 -//.word 0xf2bb0f74 -//.word 0xd5f7f53d -//.word 0x4e50dfe1 -//.word 0x7abef6b8 -//.word 0xe3fb1de6 -//.word 0xace5cadd -//.word 0x0f251424 -//.word 0x0a0e0e56 -//.word 0x54c7546d -//.word 0x96ade340 -//.word 0xd8f32e4b -//.word 0x398b6eaf -//.word 0xe44a3979 -//.word 0x3f475627 -//.word 0x6684d069 -//.word 0xd7d04924 -//.word 0x6feb91bc -//.word 0x95ec7793 -//.word 0xb5e0dfcd -//.word 0xf0b41557 -//.word 0x11556127 -//.word 0xc315dcc5 -//.word 0x0251810a -//.word 0xd0508727 -//.word 0x296fefea -//.word 0x387b593d -//.word 0xcb5f1bf0 -//.word 0x05ff94b8 -//.word 0x5263be77 -//.word 0xa01803bd -//.word 0xcdd3528f -//.word 0x5b587168 -//.word 0x6b9a957e -//.word 0xe9243046 -//.word 0x04b70a3a -//.word 0xe13593da -//.word 0x90bd78f1 -//.word 0x3f187419 -//.word 0xad546981 -//.word 0xe2aeafee -//.word 0x1eb6ab00 -//.word 0x0fada4b7 -//.word 0x4632d335 -//.word 0xec1eb9c6 -//.word 0xb1acb61d -//.word 0x06ddd6e1 -//.word 0x8c1aee68 -//.word 0xcc1be8c2 -//.word 0x28095bf9 -//.word 0x11df5f97 -//.word 0x7b169f69 -//.word 0x8e81af83 -//.word 0x9f76a084 -//.word 0x5e2ed21b -//.word 0x516e0aca -//.word 0x8167c4ea -//.word 0x73dccbf0 -//.word 0x598206ee -//.word 0x8aac955d -//.word 0x30271d19 -//.word 0x40635fad -//.word 0xb0d410d1 -//.word 0xe498e431 -//.word 0x695aed70 -//.word 0xe576236d -//.word 0x4e5e44c5 -//.word 0x5b3cde99 -//.word 0x38d9a991 -//.word 0x7ebd1b20 -//.word 0x6298370a -//.word 0x2de0a624 -//.word 0xecbc085b -//.word 0x68218cf8 -//.word 0x583abe23 -//.word 0xd60ea1a5 -//.word 0x105dfef2 -//.word 0x40cafb66 -//.word 0xde40efcf -//.word 0x138e752c -//.word 0x7254c0b4 -//.word 0xe3232e1a -//.word 0xdfe01f10 -//.word 0xe369070a -//.word 0x1e7bc244 -//.word 0x6dd42806 -//.word 0x8a94e227 -//.word 0x81e97cd0 -//.word 0x63ebba82 -//.word 0x3dc5305a -//.word 0x4b160d94 -//.word 0x6a97384f -//.word 0xccfd9e8f -//.word 0xef21ca88 -//.word 0xd05eb61a -//.word 0x5c3ae098 -//.word 0x2749a1cd -//.word 0x604fba41 -//.word 0x05a530b8 -//.word 0x53de5bfc -//.word 0x81a939dc -//.word 0xadf90875 -//.word 0x176413b0 -//.word 0x8dc9cc0c -//.word 0x26361b9e -//.word 0x3309f656 -//.word 0x73553283 -//.word 0x86879899 -//.word 0xa4493c32 -//.word 0x8fa60a54 -//.word 0xc66fa2f2 -//.word 0xfcde66b5 -//.word 0xc87ad0fc -//.word 0x9e3a0a21 -//.word 0xfeedb8fe -//.word 0xebd918af -//.word 0x9fa34e9a -//.word 0x7d6ff9ad -//.word 0x47470ae7 -//.word 0x91c1d61a -//.word 0x76dc6aef -//.word 0x892c1e2a -//.word 0x0e376d2f -//.word 0x6b1e03c5 -//.word 0xd980181b -//.word 0x5f9bfd09 -//.word 0x01b4f497 -//.word 0x35b945c3 -//.word 0x96268e7f -//.word 0xdc255bfa -//.word 0x0cf9f620 -//.word 0xec9c8164 -//.word 0xbaa741bd -//.word 0x1d733dee -//.word 0x5c7e080b -//.word 0xce10db39 -//.word 0x921ee6b5 -//.word 0x7f6ee818 -//.word 0x5efcfed9 -//.word 0x579db813 -//.word 0xaae27288 -//.word 0xa03fe2e7 -//.word 0xc06ced4a -//.word 0x450cbf03 -//.word 0xd08d1a98 -//.word 0x5b4fee0c -//.word 0x6e082b60 -//.word 0x9567d35a -//.word 0x11f75385 -//.word 0xce471379 -//.word 0x95484c5c -//.word 0x83f61aa9 -//.word 0xba3ad230 -//.word 0x560f955f -//.word 0xa3e525bf -//.word 0x8d42f8c1 -//.word 0x57af8bbb -//.word 0x90d2f92e -//.word 0x43d8cc4a -//.word 0x6f1613b4 -//.word 0xb6efb586 -//.word 0x59f80498 -//.word 0x645a95fe -//.word 0x267850d1 -//.word 0xe4d2c333 -//.word 0xcf29bb8d -//.word 0x32e5161b -//.word 0xf0b3d3ab -//.word 0x2e726ba1 -//.word 0x4d50643f -//.word 0x1b302323 -//.word 0x4a500211 -//.word 0x2128a2f3 -//.word 0x7195831e -//.word 0xcb36d1d7 -//.word 0xf0168116 -//.word 0x898c9d8a -//.word 0x1860dcdc -//.word 0x2f2f7638 -//.word 0xe011360a -//.word 0x74788000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x000164B0 -//// expected output -//.word 0xd3891d0e -//.word 0x88988347 -//.word 0x1e15525f -//.word 0x8d4ddc25 -//.word 0xb68339c0 -//.word 0xc17e3a72 -//.word 0x5c8f858e -//.word 0x7784267c -//.word 0xe0767b12 -//.word 0xccefe627 -//.word 0x28983c53 -//.word 0xc6c847d0 -//.word 0xc38adc3f -//.word 0x52249b6a -//.word 0xc082c017 -//.word 0x22d86125 -//// SHA512LongMsgvector_115 -//// vector length -//.word 0x000167C8 -//// input message -//.word 0xddd32f16 -//.word 0x5dc63f63 -//.word 0x3c17c2bf -//.word 0xbe0dacd7 -//.word 0x2ed6495d -//.word 0xc5d53afd -//.word 0xce3dbb93 -//.word 0x08df279b -//.word 0x4c40bde8 -//.word 0x6fefa49a -//.word 0x6a152d4a -//.word 0xb84e5987 -//.word 0x00b79b86 -//.word 0xf449de15 -//.word 0x7965cad1 -//.word 0x08af4399 -//.word 0x54203342 -//.word 0x2d578a8c -//.word 0xa4308355 -//.word 0x7098280d -//.word 0x90a0186a -//.word 0x32d0885d -//.word 0xd4bd8844 -//.word 0xa9dd8761 -//.word 0x3e9b1a8b -//.word 0x5da7f923 -//.word 0x32904a4a -//.word 0xac942351 -//.word 0x26b74a71 -//.word 0x47123fbd -//.word 0x266e7c54 -//.word 0xb211fbdb -//.word 0x52d8f92b -//.word 0xc886fa46 -//.word 0x5b5c0d90 -//.word 0x35ea513c -//.word 0x0a24b804 -//.word 0xfab80b1d -//.word 0xb99f2e6a -//.word 0xedf2a6f0 -//.word 0xd700588a -//.word 0x369d93dd -//.word 0x68bd518f -//.word 0xd341bab4 -//.word 0x8310ea89 -//.word 0x146af465 -//.word 0xd37927ec -//.word 0x20299086 -//.word 0x173abf10 -//.word 0x6f94ced1 -//.word 0xa1daa0af -//.word 0x4d4167a2 -//.word 0xdaa3696a -//.word 0x5ecf037d -//.word 0xbd24ee44 -//.word 0x145ec186 -//.word 0x58afb725 -//.word 0x3a12b308 -//.word 0x4edc8158 -//.word 0x6d935fef -//.word 0x5804bc0d -//.word 0x9d903f4d -//.word 0xbfc70bd8 -//.word 0x913842d9 -//.word 0xe386c731 -//.word 0x60bf496b -//.word 0xb7ea7df2 -//.word 0xf9dfaa81 -//.word 0x425c6bdc -//.word 0x9c54b1be -//.word 0x208a0712 -//.word 0x5f5f1a65 -//.word 0x00e8789c -//.word 0xaa4498e2 -//.word 0x242d1be5 -//.word 0xbacc5142 -//.word 0xe3d2ff3d -//.word 0x22c45fb6 -//.word 0x2a966959 -//.word 0x457c5114 -//.word 0xf6fd51ce -//.word 0xdd49a856 -//.word 0xdccce399 -//.word 0x78035b19 -//.word 0x828fff9a -//.word 0xf688531e -//.word 0x2313b914 -//.word 0x0c37f0cd -//.word 0x0fecda2f -//.word 0xc47582ad -//.word 0x28f05d77 -//.word 0xfb2cd0ed -//.word 0x66baf35a -//.word 0xe14795df -//.word 0x542980ad -//.word 0x7c37fd77 -//.word 0x91de9b28 -//.word 0x26712dd1 -//.word 0x50c112e5 -//.word 0x0aeeb9a8 -//.word 0xd87c63e5 -//.word 0xaba92bdf -//.word 0x05fe448b -//.word 0x5d2583fc -//.word 0xc5fa1d1f -//.word 0xcae4b1a8 -//.word 0x9c66894c -//.word 0x6ff11d31 -//.word 0x20fdd8a3 -//.word 0x1c581f08 -//.word 0x7ebd9016 -//.word 0x77a88743 -//.word 0xf369e77d -//.word 0x7977171c -//.word 0x53084a15 -//.word 0xf0de0470 -//.word 0x8664dafc -//.word 0xfbf97941 -//.word 0x068ce9b6 -//.word 0x92691334 -//.word 0x635281ab -//.word 0xfbd26614 -//.word 0xbfcedea6 -//.word 0x565d764d -//.word 0x52daef58 -//.word 0x12373f71 -//.word 0xe693d9d3 -//.word 0x750f2eb7 -//.word 0x5cde740f -//.word 0x189ca677 -//.word 0x26e1cc69 -//.word 0x68157cb0 -//.word 0xcb86a11f -//.word 0x27b77b82 -//.word 0x67fce7d5 -//.word 0xe943e1b4 -//.word 0x28354713 -//.word 0x987edf2f -//.word 0xd1689cc4 -//.word 0xf0af1d81 -//.word 0x3a9177b9 -//.word 0x0324345b -//.word 0xcfec9c24 -//.word 0xb6ad3313 -//.word 0x0d7e821e -//.word 0x421f1a23 -//.word 0x088cd721 -//.word 0xb4d262a8 -//.word 0xe722f98e -//.word 0x6e2473e4 -//.word 0x668d7e28 -//.word 0xa4f42cbc -//.word 0x54e2ae97 -//.word 0xdf285f3b -//.word 0x137504e7 -//.word 0x7e27510d -//.word 0x1a62b006 -//.word 0x305f3f05 -//.word 0x7607174a -//.word 0x7ac1d498 -//.word 0x448852e8 -//.word 0x3740b45f -//.word 0x394aab7e -//.word 0x1456f599 -//.word 0x1b78238a -//.word 0x107fa0a6 -//.word 0x4582eff0 -//.word 0x02bb348d -//.word 0x2798f678 -//.word 0x12102377 -//.word 0xc334544e -//.word 0x3e065332 -//.word 0x318ddb80 -//.word 0xd7299eaf -//.word 0x1c258c84 -//.word 0x028b5384 -//.word 0x433c22af -//.word 0x383fb36b -//.word 0xf95a88bf -//.word 0xc6df75c1 -//.word 0xa6c95e52 -//.word 0x4d074208 -//.word 0x4318786c -//.word 0x43d83966 -//.word 0xe29a5ff5 -//.word 0x71766c23 -//.word 0x23e5ce39 -//.word 0x738b622f -//.word 0xc0533666 -//.word 0x3ac1939a -//.word 0x02843b12 -//.word 0x8d4bef19 -//.word 0x4ada34b2 -//.word 0x845d5788 -//.word 0x89fcaf24 -//.word 0x0caf2262 -//.word 0xc854ea26 -//.word 0x66ff994b -//.word 0xa1915bdc -//.word 0xa88c7c87 -//.word 0xc3252a4e -//.word 0x3a9b7b80 -//.word 0x73c8b2e8 -//.word 0x5af6be44 -//.word 0x05f303f9 -//.word 0x99685d04 -//.word 0x67666234 -//.word 0x5b42e896 -//.word 0x97a3c831 -//.word 0x5bd9e1f4 -//.word 0x28705fed -//.word 0x25053dbc -//.word 0xc1590846 -//.word 0x9aa4e6ae -//.word 0x9e2cd881 -//.word 0x6f153c30 -//.word 0x0c7b96c4 -//.word 0xafbe8fcd -//.word 0xf11d3e9b -//.word 0x3487a7b1 -//.word 0x42ad8177 -//.word 0x325c3d2f -//.word 0x8c0a432a -//.word 0xadaf7f3c -//.word 0x6cd61c6d -//.word 0xfdf38ff1 -//.word 0x16f7d85b -//.word 0x5122040d -//.word 0xd218f7f3 -//.word 0x29386871 -//.word 0x79292d99 -//.word 0xdab5b9a2 -//.word 0xfddbe395 -//.word 0x0f1fe94a -//.word 0xdf25b493 -//.word 0x427e5db7 -//.word 0xb7c2f122 -//.word 0x47df715a -//.word 0xafb01d35 -//.word 0xc1d2f24a -//.word 0x08b372a5 -//.word 0xabeba3bf -//.word 0x93d05aad -//.word 0xd044b997 -//.word 0x39d2f76c -//.word 0x53fa5fd4 -//.word 0x75c89c66 -//.word 0x29ac331c -//.word 0xd4855103 -//.word 0x9affc737 -//.word 0x7c1f530f -//.word 0xc31c2195 -//.word 0xa2719139 -//.word 0x17303bc6 -//.word 0x12993194 -//.word 0xd9eb8300 -//.word 0xab7a0919 -//.word 0xa3025c9c -//.word 0xe03b2623 -//.word 0xe3ad9c99 -//.word 0x38c648f1 -//.word 0x592a0c17 -//.word 0xcf4a6427 -//.word 0x9a38ebde -//.word 0xd3ba214e -//.word 0x909d6bd5 -//.word 0x084b5b4f -//.word 0xf8a0328b -//.word 0x45faa3fc -//.word 0xe28fdab1 -//.word 0xf404bd87 -//.word 0x343b729e -//.word 0x956c2109 -//.word 0x2877fbca -//.word 0x3c787bfd -//.word 0xc99ceb53 -//.word 0x0f342bc2 -//.word 0x7a08ae7b -//.word 0xc9eec51d -//.word 0x6f9b2028 -//.word 0x39b891b4 -//.word 0x32391463 -//.word 0xc4ea0d94 -//.word 0x1f4ad0d9 -//.word 0xdf9d66ac -//.word 0xe83d8f5d -//.word 0x9531034f -//.word 0x1300fd64 -//.word 0x07c7fab6 -//.word 0x778abe88 -//.word 0xe7c8997c -//.word 0xc252e806 -//.word 0xfc5dde20 -//.word 0xf6d5853f -//.word 0xa2f4ff86 -//.word 0xe714123a -//.word 0x47c1e477 -//.word 0xbf130221 -//.word 0xee3aa71c -//.word 0x7a5b3cc0 -//.word 0xb09b1b87 -//.word 0x6a799809 -//.word 0x3660422b -//.word 0xb47c6693 -//.word 0x40ced55f -//.word 0xd17be716 -//.word 0x216ac0de -//.word 0x0f0dd2f0 -//.word 0x417fa34a -//.word 0x0dd0d1a3 -//.word 0x9a9d53a4 -//.word 0x42e30155 -//.word 0x3b1457d6 -//.word 0x776b764f -//.word 0xc87d6b29 -//.word 0x4812b47f -//.word 0xf83200cf -//.word 0xa78337f6 -//.word 0x16d2ba5b -//.word 0x59efec6a -//.word 0x80bef144 -//.word 0x778bb6b4 -//.word 0x2b9e3166 -//.word 0xee0fea53 -//.word 0x1ddcba80 -//.word 0x0039d2e8 -//.word 0xf12700b6 -//.word 0xc1482eb8 -//.word 0x57f22c11 -//.word 0x9a82af2e -//.word 0x92f399fb -//.word 0xc9af7a56 -//.word 0xf8a457c4 -//.word 0xdf9bab62 -//.word 0x75c5ac1f -//.word 0x4197cf29 -//.word 0x08d88ea5 -//.word 0xa8f969a3 -//.word 0x44a42b51 -//.word 0xa1976e6e -//.word 0xd0b36102 -//.word 0x0e50c94d -//.word 0xe8d446fd -//.word 0xa384d8a4 -//.word 0xda9aa168 -//.word 0x6997edfd -//.word 0x8ada6fd0 -//.word 0x3e72cd85 -//.word 0xef3160a4 -//.word 0x5301358f -//.word 0x937b57b8 -//.word 0xadb65010 -//.word 0x175dedc3 -//.word 0xa5054222 -//.word 0xacbdeee0 -//.word 0x68e6a082 -//.word 0x9b45da11 -//.word 0x7756f512 -//.word 0xbee366b8 -//.word 0x28d63f57 -//.word 0x054cf91c -//.word 0x23ea70fc -//.word 0xf2742fea -//.word 0xe69bee4d -//.word 0x1d1759b1 -//.word 0x42f613bc -//.word 0xb134fb64 -//.word 0xdb8bae60 -//.word 0xec8c4ddc -//.word 0xacef8071 -//.word 0xa328ba54 -//.word 0x813bbfce -//.word 0xbdd064ec -//.word 0x7b8a9677 -//.word 0xb3959e26 -//.word 0x907ea313 -//.word 0x1648716c -//.word 0x08bc796b -//.word 0x09001888 -//.word 0x016b1ced -//.word 0xc298842a -//.word 0xecb9872a -//.word 0x0d2ed865 -//.word 0x0d572958 -//.word 0xcaa6ee32 -//.word 0xfff863d1 -//.word 0x6a25d0ec -//.word 0x2ed50b92 -//.word 0x76963fd3 -//.word 0x5b2cedbd -//.word 0x0828308a -//.word 0x1bbd4517 -//.word 0x4fce4a98 -//.word 0x584b468b -//.word 0x0fbe6aea -//.word 0xcf2197a5 -//.word 0x1ff3204f -//.word 0x918bd017 -//.word 0xeaab2ffb -//.word 0x82580138 -//.word 0xeee91005 -//.word 0xdd5f2b80 -//.word 0x40f46fe9 -//.word 0xaef7c50e -//.word 0x06d6ac06 -//.word 0x567d3922 -//.word 0xfbde5b21 -//.word 0x0ad164a3 -//.word 0xef1fc5e1 -//.word 0x54d9199a -//.word 0x45ef6651 -//.word 0x91fd9fb5 -//.word 0x73686d61 -//.word 0x71aa2ec5 -//.word 0x85ea3f64 -//.word 0x7bd07641 -//.word 0x9a97f393 -//.word 0x866419c0 -//.word 0x65d6d789 -//.word 0x41de2c82 -//.word 0xadd1eac6 -//.word 0xacbbbae8 -//.word 0xcef7602d -//.word 0x9cfc40f8 -//.word 0x367a2185 -//.word 0x3ba632da -//.word 0xe9d14afb -//.word 0x8640745e -//.word 0xfe38ab9e -//.word 0xcd58e273 -//.word 0x1f2c48e2 -//.word 0x36fec9b1 -//.word 0x0defd81e -//.word 0x3b476cd1 -//.word 0x190a480e -//.word 0x27cc802f -//.word 0xacc53952 -//.word 0x9d28b04f -//.word 0xc0b17eed -//.word 0x117d1a55 -//.word 0x651f9fc6 -//.word 0x4df0cf8b -//.word 0x3da6582a -//.word 0xee2957df -//.word 0x00a21b48 -//.word 0xe4d42b62 -//.word 0xf9af8ab4 -//.word 0xf52239ca -//.word 0x8732fee5 -//.word 0x3b4964f1 -//.word 0x9dd003b7 -//.word 0xa1ff0154 -//.word 0x42f4d9ea -//.word 0x6a035b95 -//.word 0x124ef5a1 -//.word 0xaa9530fa -//.word 0xbb4f7de3 -//.word 0xcbf932eb -//.word 0x81aed01d -//.word 0x09f88778 -//.word 0xbae6fc9f -//.word 0xf65e49d1 -//.word 0x52b5451a -//.word 0xf77d07cb -//.word 0x499ea529 -//.word 0xc6a94162 -//.word 0x306847c5 -//.word 0xeebaf031 -//.word 0xb09d0bce -//.word 0x528dfcfc -//.word 0x030d0589 -//.word 0xa683c427 -//.word 0x7848fd1d -//.word 0xf3009a3c -//.word 0xf327f015 -//.word 0x18ed4469 -//.word 0x6b448ee1 -//.word 0x44377cff -//.word 0x6b7dba55 -//.word 0x7d4e71f5 -//.word 0x91750e28 -//.word 0x1ca74463 -//.word 0x12135476 -//.word 0x4e3a8c07 -//.word 0x34010d3f -//.word 0x9504d2c3 -//.word 0xd22eeee6 -//.word 0x4587151d -//.word 0xdc4c5eb3 -//.word 0x074547bd -//.word 0xd553fa51 -//.word 0x5a49cff3 -//.word 0x53fc1150 -//.word 0x0d9e052f -//.word 0x824728a4 -//.word 0xc5d5b986 -//.word 0xa1f67724 -//.word 0x7d83ac34 -//.word 0x83106a0c -//.word 0x02c11515 -//.word 0x105f217c -//.word 0x73aa1d2a -//.word 0xc2f1f1f7 -//.word 0xc7e1641a -//.word 0x289be1e4 -//.word 0x46097aaf -//.word 0x66712d11 -//.word 0x0f4a6655 -//.word 0xb24fc62b -//.word 0x91d3239e -//.word 0xd954d047 -//.word 0x11521ec0 -//.word 0xb861225c -//.word 0x2a7eb915 -//.word 0xc49fcac6 -//.word 0x488ecb9b -//.word 0x83f687c5 -//.word 0x2dbe1e72 -//.word 0x10974dfc -//.word 0x6dd1ef60 -//.word 0x9b73c4f3 -//.word 0xf18a7250 -//.word 0xe6c1c995 -//.word 0x77324bcf -//.word 0xc97cecb2 -//.word 0x1016168e -//.word 0xafe3f07e -//.word 0xa106e0e3 -//.word 0x17f74f10 -//.word 0x62d6ac47 -//.word 0x1400b3e5 -//.word 0x62e1efd9 -//.word 0xcd097d5a -//.word 0x028114da -//.word 0xfe5f4235 -//.word 0x7598f82f -//.word 0x7516491d -//.word 0x470a6fe2 -//.word 0x96840f1d -//.word 0xd241bea1 -//.word 0xd7c3c326 -//.word 0xcaa71e3e -//.word 0x4434ca8a -//.word 0xb330402d -//.word 0xfdf73c81 -//.word 0x66cec309 -//.word 0xb37465a7 -//.word 0x8ffac00f -//.word 0x2fd5457c -//.word 0x32323fa2 -//.word 0xcb8910e3 -//.word 0x2175bec5 -//.word 0xf6c3afa4 -//.word 0x87c8b1a4 -//.word 0xb4f83eea -//.word 0x61b5fd0c -//.word 0x1c658bc5 -//.word 0x00c77cee -//.word 0xd9879da9 -//.word 0x89107ce0 -//.word 0xaaa12bee -//.word 0x74a3409b -//.word 0xe13a204e -//.word 0x101a7e7e -//.word 0xe79c1e6a -//.word 0xfd10df0a -//.word 0xb755f845 -//.word 0xb1a88264 -//.word 0x5fba37c7 -//.word 0xf40579d6 -//.word 0x825f963b -//.word 0x63d04a4f -//.word 0xd9a185d1 -//.word 0xf1b56fde -//.word 0xad1da91d -//.word 0x61e6d63b -//.word 0x5e355b97 -//.word 0xce97623e -//.word 0xdf922519 -//.word 0x24806965 -//.word 0x389d4864 -//.word 0xa45e3452 -//.word 0x0204399b -//.word 0x6372824b -//.word 0xef3b1fc6 -//.word 0xcb0006b9 -//.word 0x40f95750 -//.word 0x19d1e4aa -//.word 0x4cb7f08a -//.word 0xddb2374f -//.word 0x00342f26 -//.word 0x7ef38e7e -//.word 0x59f40cbc -//.word 0xb3e86a30 -//.word 0xecbcb348 -//.word 0x0b6cc204 -//.word 0x5f1804aa -//.word 0x66597fbb -//.word 0xedd51325 -//.word 0x791100ba -//.word 0xe687a9e1 -//.word 0x4ef9988c -//.word 0x2c04c16a -//.word 0xc1f80b5d -//.word 0xb7e70c2e -//.word 0x05fc1480 -//.word 0x120e6e02 -//.word 0x1d75e2e9 -//.word 0xdc1d7e9e -//.word 0x63d997b3 -//.word 0x48f90a1c -//.word 0x051ec79c -//.word 0x9d4d917d -//.word 0x8343ff84 -//.word 0xb708c724 -//.word 0x32c73bf2 -//.word 0x84dd1459 -//.word 0xbc306f8f -//.word 0x88c215c7 -//.word 0x9d86ffa9 -//.word 0x59721aff -//.word 0xa7d547b1 -//.word 0x24eba6f3 -//.word 0x80ae14bd -//.word 0x26f0f27b -//.word 0x1fa72907 -//.word 0x33886ad4 -//.word 0x52d7bb6c -//.word 0x337d2f1c -//.word 0x3b5bf4ed -//.word 0xa0de93d7 -//.word 0xced37432 -//.word 0x0a7da16d -//.word 0x55e5cb02 -//.word 0x937292a9 -//.word 0xecb901cd -//.word 0x7396583c -//.word 0x057c0f22 -//.word 0x74091738 -//.word 0xe5de6339 -//.word 0x77ada796 -//.word 0x2693606a -//.word 0xeea914b0 -//.word 0x33d6dbb4 -//.word 0x60e71ec7 -//.word 0xcfe19f37 -//.word 0xe995b97e -//.word 0x8e76eaba -//.word 0xb7a88e5d -//.word 0x5959ed26 -//.word 0x8d547850 -//.word 0xefd35009 -//.word 0x43950825 -//.word 0x5f31ac14 -//.word 0x45aa0211 -//.word 0x8f430f9d -//.word 0x1095dd2c -//.word 0xb8de7c1e -//.word 0xb89c47f0 -//.word 0xe75b68b4 -//.word 0x64cb9fbe -//.word 0x7d153fa1 -//.word 0xd06f795a -//.word 0xb0efdcca -//.word 0xcb9c1d6a -//.word 0x09cb143a -//.word 0xb7a908fa -//.word 0xe4142c9d -//.word 0x0baf69fb -//.word 0xf3355ec6 -//.word 0xd40da6bf -//.word 0xbb1f5929 -//.word 0x2fe7d57e -//.word 0x15c7be62 -//.word 0xd1a243d5 -//.word 0xaea6a3ac -//.word 0x8069f042 -//.word 0x8838146b -//.word 0x97ac11a9 -//.word 0x767d8da3 -//.word 0x869b8dd2 -//.word 0xa47b817e -//.word 0x4faf81e9 -//.word 0x0dbad6ca -//.word 0x0a22bcfc -//.word 0x03c76678 -//.word 0x62724381 -//.word 0xabb1801e -//.word 0x16e3cecd -//.word 0x7e8f6576 -//.word 0x79fa489e -//.word 0xc9f8cbdd -//.word 0xf3025392 -//.word 0x2d895ed5 -//.word 0x7d8ac3ad -//.word 0x20633a83 -//.word 0x29e51ed7 -//.word 0x6aaa7232 -//.word 0x97a8235c -//.word 0xa9078cce -//.word 0x81303f6a -//.word 0xce27036a -//.word 0x301a1997 -//.word 0x9e3ac4bb -//.word 0x05c90858 -//.word 0x3174b19a -//.word 0xf1e4978b -//.word 0x76902186 -//.word 0xfdd508ee -//.word 0xae485d1f -//.word 0xc34bcea5 -//.word 0xecde25ad -//.word 0xf2b811b8 -//.word 0x9b972997 -//.word 0xcfd42e93 -//.word 0xf83a90ec -//.word 0xaf183485 -//.word 0x949575dd -//.word 0x7d446941 -//.word 0xd4f86540 -//.word 0x3adac360 -//.word 0x70b8e20f -//.word 0x78a06fdc -//.word 0xf7aee3e7 -//.word 0xde224d96 -//.word 0x49b5528a -//.word 0xa82e72d2 -//.word 0x1c308d5e -//.word 0x2456a5b6 -//.word 0x7882e5ec -//.word 0x3571e2ce -//.word 0x3b932261 -//.word 0xd31adb8b -//.word 0x9651fc10 -//.word 0x8a3071c0 -//.word 0x8d2da3ee -//.word 0xf7543f23 -//.word 0x7b9a3914 -//.word 0x4e6f10d2 -//.word 0x8b925341 -//.word 0xd72964cb -//.word 0x41117c55 -//.word 0x6b73ef72 -//.word 0xef98b2d7 -//.word 0xfcfe1a10 -//.word 0x40abe671 -//.word 0x0bc1804e -//.word 0xb153806f -//.word 0x307772be -//.word 0x129cd943 -//.word 0x951e7452 -//.word 0x0a18bf03 -//.word 0x7b7abde3 -//.word 0x905bf5e9 -//.word 0xb390baac -//.word 0x737db0d2 -//.word 0x262b8ccc -//.word 0xd39b1bc1 -//.word 0x4f5a86c7 -//.word 0xa556d459 -//.word 0xbbf0b006 -//.word 0x33526d66 -//.word 0x90034752 -//.word 0x9ab8ec54 -//.word 0x036e3b5d -//.word 0x4ab54bb6 -//.word 0xe04faf39 -//.word 0x8af9f8c1 -//.word 0x06897cdf -//.word 0xf13956cf -//.word 0xe843aeaa -//.word 0xeeae3bdc -//.word 0x0d6705d9 -//.word 0x4093700c -//.word 0x91247610 -//.word 0x7faa3423 -//.word 0xa26ca8d8 -//.word 0x92b8b90c -//.word 0x0477771a -//.word 0x3604a553 -//.word 0x8e3f75a8 -//.word 0x7edd92aa -//.word 0xaa0263b5 -//.word 0x4d118f67 -//.word 0xd8c3bc57 -//.word 0xdd769d04 -//.word 0x2cc82b0c -//.word 0x3c65329f -//.word 0xcc1d1032 -//.word 0xc93ab978 -//.word 0x7310ff8e -//.word 0xbcd51176 -//.word 0xf0b341c6 -//.word 0x9b1c0aa1 -//.word 0xa85e51e7 -//.word 0xc677eba9 -//.word 0x102a60e0 -//.word 0xec52ee5e -//.word 0x3377d104 -//.word 0x939fc236 -//.word 0x3266be8c -//.word 0x945108ca -//.word 0xbf607113 -//.word 0x9de2d759 -//.word 0xa18dec18 -//.word 0xadce3844 -//.word 0x345e6280 -//.word 0x9c16ab90 -//.word 0xe604bb11 -//.word 0x90bea067 -//.word 0xbaf614f8 -//.word 0x894ffe98 -//.word 0xc96f3c43 -//.word 0xd656a012 -//.word 0xbcee3868 -//.word 0x9de3d36c -//.word 0x53b4c0bd -//.word 0x570bd961 -//.word 0xe14ac1fe -//.word 0x5166694c -//.word 0xcef8d9ca -//.word 0x2d912db0 -//.word 0x144edd25 -//.word 0x5fad42b3 -//.word 0xc29f56f8 -//.word 0xb0dfbc9e -//.word 0x7c81008d -//.word 0xbfce1f5e -//.word 0xf94f4a13 -//.word 0x7b28e706 -//.word 0x84a8d920 -//.word 0xaa1d014b -//.word 0x7bed042a -//.word 0x65e24f07 -//.word 0xd3c6590d -//.word 0x993028b7 -//.word 0x929d1788 -//.word 0x87c2d6fd -//.word 0x5321b2c0 -//.word 0x45db171e -//.word 0xc6c553bb -//.word 0x3cbd9c84 -//.word 0x2e3f55e6 -//.word 0xa8338d3d -//.word 0xe109c990 -//.word 0x1b08037b -//.word 0xcbe3f26c -//.word 0xfa8e8c13 -//.word 0xeb4fca13 -//.word 0xfe18abfe -//.word 0xd4147b80 -//.word 0xb48055da -//.word 0x2dbce792 -//.word 0xfda27569 -//.word 0x3216208e -//.word 0x8fde6911 -//.word 0x31b5f19a -//.word 0x739a825b -//.word 0x0e6e5343 -//.word 0x85be8875 -//.word 0xc0def9f8 -//.word 0xf63734b0 -//.word 0xd1e1c58d -//.word 0xcd75b502 -//.word 0xe21c50b9 -//.word 0x62ec2b85 -//.word 0x24756698 -//.word 0xe2962ff6 -//.word 0xe0968729 -//.word 0xce6f4936 -//.word 0xf06d68d1 -//.word 0x7cf878cd -//.word 0x44ae70d6 -//.word 0x94b6ae62 -//.word 0x5e503be5 -//.word 0x94b05144 -//.word 0xd60c1a8d -//.word 0x4df4bbe5 -//.word 0xd7e291c2 -//.word 0x6412ba5a -//.word 0xa093d85b -//.word 0xd29f11dc -//.word 0x03285b93 -//.word 0x64b3f649 -//.word 0xea69398c -//.word 0x3b6b92a4 -//.word 0xcd67c9c8 -//.word 0x4c698491 -//.word 0x3df310ae -//.word 0xe24f5eda -//.word 0x5d244c0b -//.word 0x174826ec -//.word 0x63d56d8e -//.word 0x5f7fd75a -//.word 0x1b24964b -//.word 0xfea5dd5a -//.word 0x65f5a139 -//.word 0x8c6f9d43 -//.word 0xb26d98b4 -//.word 0x7816ea15 -//.word 0x8b773dfb -//.word 0x82d691f1 -//.word 0x0a4283b3 -//.word 0x406fce9d -//.word 0x5ec11262 -//.word 0x9aa7d401 -//.word 0x4b2ac6f5 -//.word 0x4ec649ac -//.word 0xa878313b -//.word 0x6c18c850 -//.word 0xe0e91568 -//.word 0xdb6f5e42 -//.word 0x7180eb93 -//.word 0xd29e0dfb -//.word 0x70845f38 -//.word 0x60ff4c9a -//.word 0x03ffd1b6 -//.word 0xe5ee845f -//.word 0xe540d6d2 -//.word 0x974c9531 -//.word 0xe65ab533 -//.word 0xfefd4f19 -//.word 0x69a3eae4 -//.word 0x776afac5 -//.word 0xe435a6d5 -//.word 0xb500ce06 -//.word 0x63704d59 -//.word 0x3bae7b52 -//.word 0x0576f6aa -//.word 0xe46ba343 -//.word 0x7daeef61 -//.word 0x5bae5b16 -//.word 0x924237fe -//.word 0xa3f5ad2d -//.word 0xa0a00266 -//.word 0x913f198d -//.word 0x15fd395f -//.word 0x4d910f61 -//.word 0xf5cdf716 -//.word 0xd4747775 -//.word 0x574d0c9a -//.word 0x79752abc -//.word 0xe5f97e5f -//.word 0x5fa476cb -//.word 0x601603bc -//.word 0x00169e5b -//.word 0x192a896d -//.word 0xaa6457cb -//.word 0x797eae12 -//.word 0xfd2a4c9b -//.word 0x7aa348ae -//.word 0x6e889af2 -//.word 0x2ceade28 -//.word 0xc7a45519 -//.word 0x31ea2dcd -//.word 0xa42502fe -//.word 0x41fea4cc -//.word 0xf8b91bb3 -//.word 0xa7c5e8b9 -//.word 0x86918eec -//.word 0xc2a1510b -//.word 0x68e03e84 -//.word 0x85386b9e -//.word 0x8c6080f8 -//.word 0xf7f57632 -//.word 0x31cd9fea -//.word 0xb488e7ea -//.word 0x6e67599f -//.word 0x6a62e5ce -//.word 0xac746082 -//.word 0x5d3acc49 -//.word 0x28bcda9f -//.word 0xe38badab -//.word 0x720ce129 -//.word 0xe813cca8 -//.word 0xf0b303f5 -//.word 0x6c5520d7 -//.word 0x5b08c3fc -//.word 0x0018d734 -//.word 0x41e217dd -//.word 0x4de6d09e -//.word 0x811ee859 -//.word 0x8d8f1f5a -//.word 0xd21d95d5 -//.word 0x0fa38d8f -//.word 0x3d4370db -//.word 0xb7fb15c8 -//.word 0x9e793f99 -//.word 0x7c316775 -//.word 0x27acbc60 -//.word 0xe923696a -//.word 0xdd4c1626 -//.word 0x9c74b15e -//.word 0x19ce6e05 -//.word 0xca0b0c6d -//.word 0x092a5bbb -//.word 0xb992fb97 -//.word 0x2c5e6628 -//.word 0x44f8303f -//.word 0xd9e98ed2 -//.word 0x5bef16ad -//.word 0xb950c564 -//.word 0x816f468c -//.word 0x489d712a -//.word 0x4c31136c -//.word 0x58dbed97 -//.word 0xe835ff41 -//.word 0x8e9b06c0 -//.word 0x943d43e2 -//.word 0xe3727edf -//.word 0x23504b8b -//.word 0x24798cd0 -//.word 0x7d37375c -//.word 0x73cc5997 -//.word 0x1c035bd8 -//.word 0xc40b84d8 -//.word 0x8f85c067 -//.word 0x60dca05d -//.word 0xfad5a1d4 -//.word 0x6567b194 -//.word 0x94ccefcf -//.word 0x44d8b30f -//.word 0x278ace6c -//.word 0x42e11302 -//.word 0x93f016a2 -//.word 0xf83533c8 -//.word 0x4c27d2cd -//.word 0xd30eea5e -//.word 0xd817c42d -//.word 0x94a802e6 -//.word 0x52f1df65 -//.word 0xd1c4b826 -//.word 0xeaa6ccfd -//.word 0x72264007 -//.word 0x626d66e0 -//.word 0x35173e16 -//.word 0x92413dde -//.word 0x2be34e06 -//.word 0xe561172b -//.word 0x395c7d2c -//.word 0xdace6ade -//.word 0x9856cd02 -//.word 0x84d0e374 -//.word 0x5529b6a5 -//.word 0x0a71e34a -//.word 0xd1329f56 -//.word 0x2801fc26 -//.word 0x425269fc -//.word 0xac9178af -//.word 0x306ee5a1 -//.word 0xfa78d3f0 -//.word 0xf9ed58f1 -//.word 0x88d03cda -//.word 0x4e3dfebe -//.word 0x62fa18bf -//.word 0xb34e847f -//.word 0xa8167fd7 -//.word 0x03158dcc -//.word 0x0b8cbdbe -//.word 0xea0a2ee3 -//.word 0x5486d2f4 -//.word 0x69ab7226 -//.word 0xdd73f35c -//.word 0x56f7d79b -//.word 0x158607be -//.word 0xd9f4cf6b -//.word 0x00342a45 -//.word 0xf0294063 -//.word 0xb5ba2d02 -//.word 0xeb250476 -//.word 0xdf951367 -//.word 0xf1f66939 -//.word 0x3d0896cc -//.word 0x7ab2b266 -//.word 0x219aa1ed -//.word 0xd2f2945a -//.word 0xf595d36a -//.word 0x9d52bb96 -//.word 0xb1870246 -//.word 0x4df24342 -//.word 0x66c5b669 -//.word 0xadf83ea5 -//.word 0xb6e3aa1e -//.word 0x5a0c34ae -//.word 0x5a3e4e96 -//.word 0x44db9f6f -//.word 0x9b724863 -//.word 0x32946b9c -//.word 0xd9e4eefd -//.word 0x3b6e7c10 -//.word 0x073acd40 -//.word 0x4e202849 -//.word 0x2ddd26ec -//.word 0xab67b8e7 -//.word 0xe47e6b24 -//.word 0x6884eb31 -//.word 0xde8ec6f0 -//.word 0xedbb7390 -//.word 0x5cc593bb -//.word 0x77d57611 -//.word 0xb59ce1d6 -//.word 0x999f0fe7 -//.word 0xd6d2f5f3 -//.word 0xb669cbe7 -//.word 0xbcebc7aa -//.word 0x89882c0b -//.word 0xfcac83f8 -//.word 0x9dd428f0 -//.word 0x3ca109ba -//.word 0xd52aab58 -//.word 0xb7976e37 -//.word 0xe5ec11a8 -//.word 0xbd227894 -//.word 0xd77cad6a -//.word 0x3018265d -//.word 0x88c546cd -//.word 0x08142502 -//.word 0x28b29420 -//.word 0xd0f45c57 -//.word 0xbdb4c75b -//.word 0x275c6214 -//.word 0xa1400096 -//.word 0x40310253 -//.word 0xff4ed68f -//.word 0x621ebe15 -//.word 0x5adcd329 -//.word 0x691249bd -//.word 0x066af4e8 -//.word 0x43c00b93 -//.word 0xad7b2d76 -//.word 0x741ea143 -//.word 0xcc1ae220 -//.word 0x92e75b5b -//.word 0x33526f59 -//.word 0xca19bcd0 -//.word 0x88b5a136 -//.word 0x5977fd7a -//.word 0xc4d63af1 -//.word 0x13088b93 -//.word 0xb5cf7167 -//.word 0xe096843c -//.word 0x7bbc709a -//.word 0x3a303ef8 -//.word 0x0b3ed52f -//.word 0xb1a8c02f -//.word 0xaef931f1 -//.word 0x671646ad -//.word 0x83168c4c -//.word 0x9453c220 -//.word 0xf9c1dfd3 -//.word 0x037f569d -//.word 0x56ac98ba -//.word 0x927cda1c -//.word 0x338b195d -//.word 0xb6715cf7 -//.word 0xfe963ab7 -//.word 0xf5489b6f -//.word 0x760ac3ec -//.word 0x6b2f8c27 -//.word 0x32a8f2bf -//.word 0x461bd5a7 -//.word 0x1b35fb1c -//.word 0x494055db -//.word 0xedf88390 -//.word 0x4c9a9991 -//.word 0xba3f24cc -//.word 0xbb6868ff -//.word 0x67daec27 -//.word 0x13ac393a -//.word 0x2d9ede18 -//.word 0x68acb7bf -//.word 0x19e36fbf -//.word 0xe17444ef -//.word 0x8d070a5d -//.word 0x3a51738b -//.word 0xbde98dd8 -//.word 0x42578c3c -//.word 0x326eca38 -//.word 0x5bdd0c0d -//.word 0x4b00072d -//.word 0xfcfc23ef -//.word 0xb70a7e86 -//.word 0x32133434 -//.word 0xfc7edebb -//.word 0x1a465815 -//.word 0xf34fc864 -//.word 0x69fadb2c -//.word 0x49f752c0 -//.word 0xe55abefa -//.word 0xfff1872f -//.word 0xe9d53362 -//.word 0xeb40e5b8 -//.word 0xe59e242c -//.word 0x35e7de84 -//.word 0xdb2bad84 -//.word 0xdb6f5861 -//.word 0xe3b79d79 -//.word 0x2e642e40 -//.word 0xa8c0f97e -//.word 0x53d8acb8 -//.word 0xe98a79eb -//.word 0xc3de1781 -//.word 0xf99a097d -//.word 0xcb1022f9 -//.word 0x403b49d2 -//.word 0x0c0a7aa2 -//.word 0xb7fc0dee -//.word 0xfced3ba1 -//.word 0x7030deb9 -//.word 0x64dd7841 -//.word 0x0b6c777f -//.word 0xe083b76e -//.word 0x420d496f -//.word 0x618c733b -//.word 0x5eb0f71c -//.word 0xae28985d -//.word 0xc0b8dbfe -//.word 0xdf8c0bad -//.word 0x59cc7ff2 -//.word 0xe17020aa -//.word 0x325625b6 -//.word 0xf59121f4 -//.word 0xe505406e -//.word 0x3131cdd2 -//.word 0x214bf823 -//.word 0xfd92d7ad -//.word 0x2be0aa3e -//.word 0x977e6393 -//.word 0x583d6611 -//.word 0x90c28db6 -//.word 0x93226f4e -//.word 0x4cafe2ea -//.word 0xdd11be8e -//.word 0x8698e42a -//.word 0xc8d07fcb -//.word 0xca568a13 -//.word 0xfbeb93e7 -//.word 0xf9c7be67 -//.word 0xb22f0c23 -//.word 0xc94add8b -//.word 0x3b31b4a8 -//.word 0x42453b0a -//.word 0x79c58702 -//.word 0x41a09c11 -//.word 0x6487349f -//.word 0xf947bcf0 -//.word 0x8856a055 -//.word 0x6eabc89f -//.word 0x82d363d9 -//.word 0xf842e337 -//.word 0x86e74849 -//.word 0xc603a274 -//.word 0xdc3ad1a3 -//.word 0x58eb903a -//.word 0x5ebdb24c -//.word 0x047aaa0d -//.word 0xfb21518a -//.word 0x7236e497 -//.word 0x375d4c09 -//.word 0x1f27a326 -//.word 0xa92cf35a -//.word 0xde5a412c -//.word 0x7b8cca6f -//.word 0x525e8cbd -//.word 0xee400821 -//.word 0x76ca4714 -//.word 0xd3501bab -//.word 0x15b5a70e -//.word 0x1384212c -//.word 0x523cd7ad -//.word 0x29ec7028 -//.word 0x22007597 -//.word 0xa25b1008 -//.word 0xcda61395 -//.word 0xa4e73b95 -//.word 0x7055b714 -//.word 0x646be481 -//.word 0x7e3b5ba7 -//.word 0xae052ddf -//.word 0x3a086d83 -//.word 0x6198efa5 -//.word 0x3f715001 -//.word 0xf04b3631 -//.word 0xf8aed920 -//.word 0xe208c3c1 -//.word 0x28fdd401 -//.word 0x53fe88fa -//.word 0x631d7d69 -//.word 0x711f2f62 -//.word 0x93d30642 -//.word 0x00a394e6 -//.word 0x7569171a -//.word 0xd7844654 -//.word 0x192a4aa3 -//.word 0x60ff0ae2 -//.word 0x65e7ab31 -//.word 0x1b1957a6 -//.word 0x93763e3f -//.word 0x1c18db1b -//.word 0xae2d79ea -//.word 0x8906f5a3 -//.word 0x196bc575 -//.word 0x1d3239ff -//.word 0x081001c3 -//.word 0xa7aef0d8 -//.word 0x05ff00e0 -//.word 0x8cd2953a -//.word 0x6ca30679 -//.word 0x41b75914 -//.word 0xf0684e5e -//.word 0xd1bda0b9 -//.word 0x143d8707 -//.word 0x5d058162 -//.word 0xb219520d -//.word 0x97f849aa -//.word 0x7773c6ad -//.word 0x46bef910 -//.word 0x65c8ec49 -//.word 0xc6c8c479 -//.word 0x501844e6 -//.word 0x854792ab -//.word 0x626a3eae -//.word 0x86b280d3 -//.word 0x9744c16f -//.word 0xe2445d00 -//.word 0x4133a81b -//.word 0x427c2fa5 -//.word 0x85494046 -//.word 0x669bac1b -//.word 0xdc9acbab -//.word 0xa12ac11d -//.word 0x94be00a8 -//.word 0x5b710e4a -//.word 0x4c5389bd -//.word 0x8e0068a7 -//.word 0x7b788311 -//.word 0x492a561a -//.word 0xea5201ec -//.word 0x308594f0 -//.word 0x358a8a3e -//.word 0xfa6c9358 -//.word 0x4ecd9717 -//.word 0xf27df7e5 -//.word 0xfa4c162d -//.word 0x761c1810 -//.word 0x523ae95a -//.word 0x7bee81b4 -//.word 0x4350671b -//.word 0x075e7490 -//.word 0x0f4cda11 -//.word 0xb51b65c9 -//.word 0xca6d0084 -//.word 0x35987a65 -//.word 0xddf98adb -//.word 0xca8b11d1 -//.word 0x87b7a025 -//.word 0xca6e3a5c -//.word 0x56765b94 -//.word 0x210138b9 -//.word 0xb28449fc -//.word 0xcec60581 -//.word 0x5338ed58 -//.word 0x6484cbaf -//.word 0xc6683c46 -//.word 0x8ac56c23 -//.word 0xedf32186 -//.word 0x7c58fb1f -//.word 0x7c39fa7f -//.word 0x88cf40cd -//.word 0x7c9e18ba -//.word 0x920238b6 -//.word 0xcb0b4365 -//.word 0x918a924c -//.word 0x9a6c34d1 -//.word 0x0f473362 -//.word 0xee3319f4 -//.word 0xaddbb3af -//.word 0x20d415e7 -//.word 0x9c2dde4f -//.word 0x5d47be69 -//.word 0x25e63541 -//.word 0x26899d5b -//.word 0x22f76aea -//.word 0xd11bb142 -//.word 0x8311e790 -//.word 0x0681ecc9 -//.word 0xca2c47e0 -//.word 0x43c4b43c -//.word 0x8f01dc69 -//.word 0x59f1630e -//.word 0xfd90271f -//.word 0xec98c753 -//.word 0x539a63d9 -//.word 0xf74ea347 -//.word 0x6328fbd3 -//.word 0x462b2dc5 -//.word 0x17020f2c -//.word 0xfa4d8ed0 -//.word 0xe739f369 -//.word 0x0953650e -//.word 0x649eaff0 -//.word 0xbbe24448 -//.word 0xb148808e -//.word 0x2e2431ec -//.word 0x041256f2 -//.word 0xd344278b -//.word 0x2a1a5530 -//.word 0xeef3925b -//.word 0x0044543f -//.word 0x1ae7d6b6 -//.word 0xfab5607b -//.word 0xc356c999 -//.word 0xa0583a23 -//.word 0xaa7f3426 -//.word 0x0c5cd5dc -//.word 0x64215722 -//.word 0x6db4d92c -//.word 0xdc026278 -//.word 0x87962300 -//.word 0xcc6afcb4 -//.word 0x31fd4227 -//.word 0x48a5c089 -//.word 0xd627fbd5 -//.word 0x3385bb4b -//.word 0xf417c621 -//.word 0xc8ddef76 -//.word 0xa0144f87 -//.word 0x1307d325 -//.word 0x0028f767 -//.word 0x755fd09c -//.word 0xcfa25083 -//.word 0x23c6c6bf -//.word 0xdd95a485 -//.word 0xa7208598 -//.word 0x8d576e77 -//.word 0x5ed654d4 -//.word 0x5502df49 -//.word 0xf8556e47 -//.word 0x41f65b4f -//.word 0xfc8d8064 -//.word 0x7055fac0 -//.word 0x41732cc6 -//.word 0x95860738 -//.word 0x767f89aa -//.word 0x78b38436 -//.word 0x9b2ea172 -//.word 0x724aa49f -//.word 0x8581f223 -//.word 0xf580503a -//.word 0x5e7cede8 -//.word 0x01c9a332 -//.word 0x23a97a8d -//.word 0xb0626e97 -//.word 0x24937205 -//.word 0xabc7b4dc -//.word 0x874b23e5 -//.word 0xb33d2f5a -//.word 0xc6e6cfe6 -//.word 0x194ac9cd -//.word 0x2cfc2e66 -//.word 0x463723d2 -//.word 0x5c2be7e8 -//.word 0x3495126f -//.word 0xcb921b90 -//.word 0xf3b51d8a -//.word 0x4057dba8 -//.word 0x252e0171 -//.word 0x5b22ad1e -//.word 0x825b2d51 -//.word 0x0b9f0b03 -//.word 0x55db46be -//.word 0x16ffe30d -//.word 0xfd0fa432 -//.word 0x96771816 -//.word 0x6da0d486 -//.word 0x76c0ff9b -//.word 0xacf6147a -//.word 0xf996e33e -//.word 0x56c2d933 -//.word 0x333a8245 -//.word 0x19744cb8 -//.word 0x8ef08e19 -//.word 0x39c6c874 -//.word 0x46812dc7 -//.word 0x0c2f5eb7 -//.word 0xedb97982 -//.word 0x7e715235 -//.word 0xe8ea001f -//.word 0x8f0c9c85 -//.word 0xf1674597 -//.word 0xd0c867a3 -//.word 0x930a3d89 -//.word 0xea2f956f -//.word 0xb1b0d4b5 -//.word 0x1710392b -//.word 0xffb76682 -//.word 0xa6fe1c01 -//.word 0x86874679 -//.word 0x7bcf397b -//.word 0x25063ac8 -//.word 0x8d1e4009 -//.word 0x0b22fcc1 -//.word 0x67c9177f -//.word 0x3e4bbb58 -//.word 0xa7735494 -//.word 0x17f598a8 -//.word 0x8203c565 -//.word 0xc31b296e -//.word 0x3e23e8ef -//.word 0xc4b7fa8c -//.word 0xb7c27398 -//.word 0x6e4b0788 -//.word 0xda92cda7 -//.word 0x6a5c430b -//.word 0x2d8b93c7 -//.word 0x37f11462 -//.word 0x45661488 -//.word 0xa418d500 -//.word 0x4e23d5de -//.word 0x576252fa -//.word 0x87840ea0 -//.word 0x49625089 -//.word 0xc38f2b0a -//.word 0x4731028c -//.word 0xea104c3c -//.word 0x72ed9504 -//.word 0x7615c5b9 -//.word 0xc036a596 -//.word 0xf6709fe9 -//.word 0x7aafc60c -//.word 0x8e391697 -//.word 0xbc83fcd4 -//.word 0x75491973 -//.word 0xf8dd437f -//.word 0x75c0cc91 -//.word 0x726f0744 -//.word 0x6f7f09e8 -//.word 0xc5ecad7b -//.word 0xd4afdbd5 -//.word 0x5d8e0922 -//.word 0x2d380195 -//.word 0xfc91e55b -//.word 0x944b71ce -//.word 0x36b681ec -//.word 0x39d9d307 -//.word 0xf4c10dbd -//.word 0xde19022b -//.word 0xf4fb315e -//.word 0x5b068e0a -//.word 0x47b1867f -//.word 0x1bde3dd8 -//.word 0xd2b31a76 -//.word 0x9da585ad -//.word 0xcdd5efbc -//.word 0xf4a01303 -//.word 0x47717c70 -//.word 0x47da483b -//.word 0xa1e42bd3 -//.word 0x52a3b718 -//.word 0x0e0ddaca -//.word 0xe30ca841 -//.word 0x1ad15a5f -//.word 0x5e6c97c4 -//.word 0x2099f340 -//.word 0x39ddb68e -//.word 0xd1d2de3f -//.word 0x80bf67f4 -//.word 0xb46cc9d0 -//.word 0x5335c32d -//.word 0xa15c578e -//.word 0x63a416d5 -//.word 0x451b9db7 -//.word 0x7937606c -//.word 0xa124a6ab -//.word 0xef5dd5d5 -//.word 0x8a7af071 -//.word 0x34485ed8 -//.word 0x2b1fed31 -//.word 0x4c7016a0 -//.word 0x7e9e83bb -//.word 0x4e0fce3e -//.word 0xd7828cff -//.word 0xe5a38a24 -//.word 0x5adc5693 -//.word 0xd06f01aa -//.word 0x7fc22431 -//.word 0x61f9218c -//.word 0x95caab35 -//.word 0x028d896a -//.word 0x3c939623 -//.word 0xabb90d47 -//.word 0xea3d031f -//.word 0x6dd0350b -//.word 0x67ec0474 -//.word 0xea67be01 -//.word 0x50491f0e -//.word 0xdbdb185a -//.word 0x9800ceff -//.word 0x89c8e6a8 -//.word 0x024300fe -//.word 0x54938163 -//.word 0xa94596e3 -//.word 0x2fe27667 -//.word 0x79c0e72c -//.word 0x221e0374 -//.word 0xb3703c7c -//.word 0xc6f89ead -//.word 0x6c965416 -//.word 0xcde16e1a -//.word 0x0e76e166 -//.word 0x7891cf27 -//.word 0xd6da0979 -//.word 0x1e81d322 -//.word 0x548ce780 -//.word 0xac70bcc0 -//.word 0xefdf0751 -//.word 0x1fe28398 -//.word 0x5e27ede6 -//.word 0x0c9c53a7 -//.word 0x303d8fdc -//.word 0x19290fcb -//.word 0x45fcd7f4 -//.word 0x8159c848 -//.word 0x52c62296 -//.word 0x94bd4846 -//.word 0x61ffc349 -//.word 0x342c8a50 -//.word 0x4e91803c -//.word 0x59413fd6 -//.word 0x4c6714c1 -//.word 0x8eda4aad -//.word 0x5ef2accc -//.word 0x729b458a -//.word 0xdea76a79 -//.word 0x3869fb8a -//.word 0xfa7fe583 -//.word 0x27efebad -//.word 0x3276a7cd -//.word 0x1b1ccb56 -//.word 0xdb0caddd -//.word 0x02a303cd -//.word 0x9fc7ea5c -//.word 0x607a2ebe -//.word 0xfaaec598 -//.word 0xcb5b9cb7 -//.word 0xbed09702 -//.word 0x7047d3ad -//.word 0x91bb2eb0 -//.word 0x8cfe0978 -//.word 0x6a064cdc -//.word 0xf387ab52 -//.word 0x17c82863 -//.word 0x8dafd95c -//.word 0xba1dec47 -//.word 0xd482e819 -//.word 0x47a8352d -//.word 0x58d3dff1 -//.word 0x080c97e0 -//.word 0x3bbafbb0 -//.word 0x197217cc -//.word 0xb5102b04 -//.word 0xec07ae83 -//.word 0x91f59402 -//.word 0xc77bcd3c -//.word 0xad4b0ea2 -//.word 0x4182d34f -//.word 0x7e39a53e -//.word 0xc85698bb -//.word 0x8aa81917 -//.word 0x1e34e6a0 -//.word 0xedc95ed0 -//.word 0xd7dbfbc5 -//.word 0xd58e1df1 -//.word 0xdc100913 -//.word 0x052c3166 -//.word 0xec1cb618 -//.word 0x559f2bfd -//.word 0x164c9c85 -//.word 0x3126ceec -//.word 0x4070c9b0 -//.word 0x16c39448 -//.word 0xa35d4013 -//.word 0x18bc278f -//.word 0x4c6c76cb -//.word 0x5e1de91f -//.word 0x9df8d61a -//.word 0xa4336dbc -//.word 0xc9e33ee5 -//.word 0xb912fc0e -//.word 0x5c128037 -//.word 0xff101020 -//.word 0xb1ece2bc -//.word 0xed49dce3 -//.word 0x7ae09e47 -//.word 0x9019c2a9 -//.word 0x3cdc624d -//.word 0x05a4dbab -//.word 0xd0d6d167 -//.word 0x01527483 -//.word 0xe34701d4 -//.word 0x4a4b8bb2 -//.word 0x77abfbf4 -//.word 0x3bff561c -//.word 0x60023ece -//.word 0x44a1bc87 -//.word 0xc7523c8b -//.word 0x67a7d91f -//.word 0xaa23dbf9 -//.word 0xbd4c7ef5 -//.word 0x5a01f609 -//.word 0xee0eaf7b -//.word 0xfcfed951 -//.word 0xbc31240a -//.word 0x092ec88b -//.word 0x7a39c95c -//.word 0xce297914 -//.word 0x8d743e12 -//.word 0xec8c956e -//.word 0xf16e572f -//.word 0xd9773cbf -//.word 0xb77a9d9c -//.word 0x5d117e4f -//.word 0x7f30cba2 -//.word 0x1600e20e -//.word 0x03ea5273 -//.word 0xf5f1e20c -//.word 0x8c46d6a1 -//.word 0xbf166dfe -//.word 0x7ba7aea5 -//.word 0x8ca364c0 -//.word 0xc1b46859 -//.word 0x4b501ecd -//.word 0x67d7427e -//.word 0x3ddbe5c9 -//.word 0x07beb238 -//.word 0x758376f8 -//.word 0x50dee08d -//.word 0x5f8d85c4 -//.word 0x87eb26e9 -//.word 0x35c3363b -//.word 0x0162979d -//.word 0x8bf0a58e -//.word 0xa900755b -//.word 0xc5655e93 -//.word 0x8047b9bc -//.word 0x9b77e644 -//.word 0x180090bb -//.word 0x9cff313f -//.word 0x18b4d837 -//.word 0xa8d82a44 -//.word 0xbc31a674 -//.word 0x75652eb9 -//.word 0x520cc39a -//.word 0x0b089129 -//.word 0xbd192b35 -//.word 0x48ac17c0 -//.word 0xf5f48db3 -//.word 0x5d3c7cd1 -//.word 0x867cceea -//.word 0x4e2aed51 -//.word 0x0d528690 -//.word 0x76e98d59 -//.word 0xbe5f81c0 -//.word 0x0173f1a8 -//.word 0xe14b3f7b -//.word 0x70c4a41f -//.word 0x50077425 -//.word 0x185da343 -//.word 0xfa448904 -//.word 0xa3c2e2be -//.word 0x63f919c5 -//.word 0x8efcc6de -//.word 0x22e175f6 -//.word 0xa917a914 -//.word 0x61fa208d -//.word 0x9ba55977 -//.word 0x6107545f -//.word 0x5b3a993f -//.word 0xf40f7baa -//.word 0xb8ee9e4a -//.word 0x00ddb78c -//.word 0xd2de939a -//.word 0x037e5b8a -//.word 0x9eab16d4 -//.word 0x8ac66f0a -//.word 0x66f9b8c3 -//.word 0xb8cb30d9 -//.word 0x47f181d4 -//.word 0xc5678da5 -//.word 0xb1c06a98 -//.word 0x7cbbab84 -//.word 0xeb16e244 -//.word 0xbca7636b -//.word 0x8ca84a34 -//.word 0xf853bfb8 -//.word 0x03af7864 -//.word 0xb7a980a9 -//.word 0x106637f5 -//.word 0x15d89be3 -//.word 0x488fc5af -//.word 0x40d2b6ec -//.word 0x95ef5479 -//.word 0xfccfb0b1 -//.word 0xb3cd8ae2 -//.word 0x20c81700 -//.word 0xb577029b -//.word 0x16fdb00f -//.word 0x7ebec8fb -//.word 0x5f70f3f4 -//.word 0x4875e07a -//.word 0x0c688c2a -//.word 0x21f6c036 -//.word 0x46efdb13 -//.word 0x689cd171 -//.word 0xc7547470 -//.word 0x554af211 -//.word 0x5ea99fea -//.word 0x6ee3f51f -//.word 0x7045d98d -//.word 0x13d02048 -//.word 0x72445248 -//.word 0xf37dae5f -//.word 0x6f026e6e -//.word 0x94dc4cd9 -//.word 0x88a44438 -//.word 0xcfe09c50 -//.word 0x6f902241 -//.word 0x5203b500 -//.word 0xebef0608 -//.word 0x1dc1a04d -//.word 0x58322672 -//.word 0x051bdc3b -//.word 0x248a6945 -//.word 0x3315dcf5 -//.word 0x526eecae -//.word 0xa6388447 -//.word 0xfb197fbc -//.word 0xad11b023 -//.word 0xc80a25e2 -//.word 0x6eb0ac20 -//.word 0x79829779 -//.word 0x6229bdf6 -//.word 0x6209c13c -//.word 0xd6179703 -//.word 0xe8ea43ca -//.word 0x6c14e4c9 -//.word 0x08b2f228 -//.word 0x9842c46e -//.word 0xd0b5553c -//.word 0x23c5473b -//.word 0xe4892853 -//.word 0xac47f51e -//.word 0xfb89dc9c -//.word 0x22734628 -//.word 0x605315aa -//.word 0x4b7a2a0f -//.word 0x714b2bf6 -//.word 0x409183ac -//.word 0x2316aa5b -//.word 0xee71a67e -//.word 0x7c1fd298 -//.word 0x96d5de26 -//.word 0x171517d2 -//.word 0x4e00e8e9 -//.word 0xa46ba10f -//.word 0x7f347832 -//.word 0x66d6cebc -//.word 0x653cb30d -//.word 0xb3d3ab28 -//.word 0x92e3b2ac -//.word 0x771f7f07 -//.word 0x6b7b06e6 -//.word 0xb13d40ef -//.word 0xa9572eb3 -//.word 0xf4f41cde -//.word 0xd95123b1 -//.word 0xe7cef1b3 -//.word 0xdc45cda3 -//.word 0xc69ad5b0 -//.word 0x68938aed -//.word 0xdfea8fff -//.word 0x86a1ae18 -//.word 0x16961c2a -//.word 0x1257fe54 -//.word 0x62372ba1 -//.word 0x3da234f1 -//.word 0x4dada237 -//.word 0x0ef17ee5 -//.word 0x789a17a5 -//.word 0xddbbff4a -//.word 0x14e55706 -//.word 0xd7f74cdd -//.word 0x6a37e259 -//.word 0x7da2f180 -//.word 0x54816c03 -//.word 0x253de9b8 -//.word 0xc2745e4a -//.word 0x774c2930 -//.word 0x360854db -//.word 0xf1d91634 -//.word 0x48f69d45 -//.word 0x64ee0a36 -//.word 0x233dbe7c -//.word 0x751ed44d -//.word 0x06a1ee57 -//.word 0x1dfd35b1 -//.word 0xc4279b12 -//.word 0x29a46441 -//.word 0x449be4cc -//.word 0xba2e8afd -//.word 0x010a1d0a -//.word 0xc53d468c -//.word 0x8b494f32 -//.word 0x95762ab7 -//.word 0x056cb511 -//.word 0x45003cec -//.word 0xa54f3f56 -//.word 0x460976bc -//.word 0x38101315 -//.word 0xdf42475d -//.word 0x9b920745 -//.word 0xa75e1029 -//.word 0x42fd2942 -//.word 0x0d97a81d -//.word 0xb539374b -//.word 0xd128d85b -//.word 0x0e762705 -//.word 0x89d4dfa8 -//.word 0x7ca7a0f7 -//.word 0x1d5ef0ee -//.word 0xc3027f0c -//.word 0x4b0eafbc -//.word 0xba825314 -//.word 0x2333b7c1 -//.word 0xcc65e242 -//.word 0x8c9b1755 -//.word 0x77aea2af -//.word 0xbe1dd1f0 -//.word 0xd0a440d6 -//.word 0xc51059b1 -//.word 0xfd511c17 -//.word 0x04d11cd8 -//.word 0xb904ca34 -//.word 0xb041f64c -//.word 0xd4d093d7 -//.word 0x5144bb16 -//.word 0xb10af30a -//.word 0x4443afe4 -//.word 0xc6cf19bd -//.word 0x3caa0e87 -//.word 0x1f7c6944 -//.word 0xbc6b8576 -//.word 0xdb34fdd6 -//.word 0x9f7ab648 -//.word 0xad5e200f -//.word 0x904fb83d -//.word 0x5d23d26e -//.word 0x926795b6 -//.word 0x44f447d8 -//.word 0x7ac3cbb9 -//.word 0xd4036714 -//.word 0x7068cb6e -//.word 0x0dc54f4d -//.word 0x71dd7da5 -//.word 0x0977cf93 -//.word 0xd0b0b94d -//.word 0x7195ea5a -//.word 0xb0f1d0fe -//.word 0x06645af9 -//.word 0x8bb50171 -//.word 0x1a69092c -//.word 0xaf950402 -//.word 0x13f09992 -//.word 0xbc2c8335 -//.word 0xee87dc30 -//.word 0x279d9c2e -//.word 0xba805ded -//.word 0xba0a6137 -//.word 0x1972d514 -//.word 0x111e573e -//.word 0xc3b8b7d5 -//.word 0x1f84fa54 -//.word 0x03f1a5c4 -//.word 0xa76e382f -//.word 0x387ef858 -//.word 0xc30ff1a9 -//.word 0x55083c6d -//.word 0x61217e3f -//.word 0x61f7b1c2 -//.word 0xc0602793 -//.word 0xf8fbcb7c -//.word 0xf80cabeb -//.word 0xc887b3a2 -//.word 0x6f6bbbaf -//.word 0x1551c59f -//.word 0x65457fef -//.word 0x35d410c3 -//.word 0x696610da -//.word 0x14cfd8c2 -//.word 0xe120fd48 -//.word 0xb2c31733 -//.word 0x86c7c732 -//.word 0xa078f812 -//.word 0xe6336434 -//.word 0x87785a3f -//.word 0xe041bf12 -//.word 0xa19254fd -//.word 0x2b523630 -//.word 0x3d59ab73 -//.word 0xd0ca1b18 -//.word 0x3fa35d2e -//.word 0xab9235f8 -//.word 0x9e0b1a9e -//.word 0xee973c21 -//.word 0xe56fc594 -//.word 0x9e495f8a -//.word 0xb272f7cb -//.word 0x151dc14b -//.word 0x3afb7d5c -//.word 0x7e0bf822 -//.word 0xc3b4d547 -//.word 0x5b118df1 -//.word 0x298cb5f1 -//.word 0x02ae803e -//.word 0x593584a1 -//.word 0x1c67c1b1 -//.word 0xd9a7df02 -//.word 0x2546b79a -//.word 0x3e9b15a4 -//.word 0xef56bc69 -//.word 0xb411ab7b -//.word 0x1f289f33 -//.word 0x7acbd95e -//.word 0xae512134 -//.word 0x64cf0b8a -//.word 0x69ea7948 -//.word 0x57e9611c -//.word 0x720fd170 -//.word 0xd027309a -//.word 0xbd60c653 -//.word 0x5d5b7f6b -//.word 0x9383ebbb -//.word 0x229d8a5a -//.word 0x129f4714 -//.word 0x56c64217 -//.word 0xabe3d2f0 -//.word 0xc3f6cbb6 -//.word 0xa3fdfc85 -//.word 0x4a0efc2e -//.word 0x93a4272d -//.word 0x5c37e3dc -//.word 0xe80f28e6 -//.word 0x82593ffd -//.word 0x637bc9d0 -//.word 0xd6a50437 -//.word 0x9aa84ab1 -//.word 0x880cda11 -//.word 0x755cdb74 -//.word 0x5ac59e76 -//.word 0xb3e024a6 -//.word 0x24cbe037 -//.word 0x627ebdf8 -//.word 0x515c6386 -//.word 0x6a09b6bf -//.word 0x607ca07b -//.word 0x03551177 -//.word 0x64704492 -//.word 0x3aba433c -//.word 0x8443ad2b -//.word 0x7095b74f -//.word 0x7c457109 -//.word 0xdbc74b98 -//.word 0x1a86d7d4 -//.word 0x0334d01e -//.word 0xc25f5c97 -//.word 0x46468e90 -//.word 0xeaea2f42 -//.word 0x5568bebf -//.word 0x9e85b529 -//.word 0xb48b0e22 -//.word 0xfe540683 -//.word 0x3ea42151 -//.word 0xbbbc6eed -//.word 0x9f2b0c8a -//.word 0x9ee8ede4 -//.word 0xd89eda30 -//.word 0x0147b74e -//.word 0xbffc0946 -//.word 0x530bb5f2 -//.word 0x7c4b0af8 -//.word 0x98ac02fc -//.word 0x0d12c513 -//.word 0xe7646f7a -//.word 0xc3df1388 -//.word 0xebb100e1 -//.word 0xc2c343ed -//.word 0x63d66d88 -//.word 0x85d196fb -//.word 0xa259a12b -//.word 0x58a3c211 -//.word 0x0f863e6a -//.word 0xdcd572b0 -//.word 0xa5eb1748 -//.word 0x8687c4fd -//.word 0x74dbb4ad -//.word 0x20dfca42 -//.word 0x1eebd2e4 -//.word 0x47850a6e -//.word 0x5c78e11e -//.word 0xec26fe90 -//.word 0x771e84ed -//.word 0xd3f19560 -//.word 0xcf4215c9 -//.word 0x171db0b6 -//.word 0x578a1e8f -//.word 0xa361a510 -//.word 0x175fe0fc -//.word 0xba7ac010 -//.word 0xa872d036 -//.word 0x71a9bdfc -//.word 0xbc341544 -//.word 0x30324f3d -//.word 0x945c0c92 -//.word 0x34de9ce1 -//.word 0x8766c46e -//.word 0x107abe19 -//.word 0x820e828d -//.word 0x275644bb -//.word 0x82d93e87 -//.word 0x34c7afc0 -//.word 0x1c8c2456 -//.word 0xc2a5f6c7 -//.word 0xf6b214db -//.word 0xb4cd0291 -//.word 0x4b1b2259 -//.word 0xbea03383 -//.word 0x6b5817f8 -//.word 0xea83d928 -//.word 0x3840ee43 -//.word 0x155dbbac -//.word 0xaa6e58ab -//.word 0x6f1c9462 -//.word 0x4cc03902 -//.word 0xff31913e -//.word 0xbdd92800 -//.word 0x1c0fd45b -//.word 0x30a1f3c2 -//.word 0xf4aff477 -//.word 0xecc01945 -//.word 0x090f7a72 -//.word 0xcd264ef0 -//.word 0xafae66d3 -//.word 0xc186fa08 -//.word 0x9012a843 -//.word 0x4cd6ba39 -//.word 0x2943a810 -//.word 0x04d0dd13 -//.word 0x4a4dbeab -//.word 0x1674e98a -//.word 0x99c2ba2a -//.word 0xbf851476 -//.word 0x0f355ec7 -//.word 0xd407cb11 -//.word 0x7ac0df5f -//.word 0x3ac72f7c -//.word 0xfa7f68f3 -//.word 0x6ed3923a -//.word 0x8413962b -//.word 0xfffefeb3 -//.word 0x6120fdce -//.word 0x0f5eafb3 -//.word 0xb0cfa14b -//.word 0xd6cd94e8 -//.word 0xe04c7e34 -//.word 0x1f6bd268 -//.word 0x374901be -//.word 0xc81a4128 -//.word 0x4e7a8d42 -//.word 0x4600ed85 -//.word 0x9317f7be -//.word 0x1f0996bf -//.word 0xc55d0a55 -//.word 0x6f63307a -//.word 0x7b0d04cb -//.word 0x6400643c -//.word 0x9eeb170a -//.word 0xc1180df1 -//.word 0xea41e8a0 -//.word 0x5ea4bc6a -//.word 0x7159133e -//.word 0xa7e435d9 -//.word 0x1807a63a -//.word 0x19daef56 -//.word 0x181da10e -//.word 0xc8cc985e -//.word 0x7ff47dd7 -//.word 0xdcc68e4f -//.word 0xace9a2d7 -//.word 0x0e1567ed -//.word 0xd6deeff3 -//.word 0x30cd6be0 -//.word 0x86b53636 -//.word 0xa3441534 -//.word 0x18d9bd4c -//.word 0xde9595d7 -//.word 0x3eb5be08 -//.word 0xee1f511e -//.word 0x7d3ae7de -//.word 0xf0035f41 -//.word 0xae5edb6a -//.word 0x99a90cda -//.word 0x7e97b0e7 -//.word 0xaf3c586a -//.word 0xee646fb9 -//.word 0x8d2978d5 -//.word 0xd4c597e4 -//.word 0xa3a453e1 -//.word 0x58be9a92 -//.word 0xf32305ba -//.word 0x79d75e91 -//.word 0x96e16071 -//.word 0x859fbdd2 -//.word 0x355c6678 -//.word 0xa42406eb -//.word 0x8fd7cf28 -//.word 0x4e7d7a96 -//.word 0xfad9893b -//.word 0xd041d030 -//.word 0xdaad3352 -//.word 0xcc0db13b -//.word 0x2ce0a271 -//.word 0xb5023cdc -//.word 0xfec55c7e -//.word 0x5744845e -//.word 0xf3f41fc5 -//.word 0x4d7c0dad -//.word 0xc4c75b77 -//.word 0x885752dc -//.word 0xbadcb426 -//.word 0xcf0542a0 -//.word 0x3696814b -//.word 0x3abbbed2 -//.word 0x299b50c0 -//.word 0xb6311df1 -//.word 0x9c576046 -//.word 0x8424a99d -//.word 0x29782501 -//.word 0xbad51f1d -//.word 0x8071c7f7 -//.word 0xc08932db -//.word 0xe3f7a394 -//.word 0xd40709e3 -//.word 0xaa87c829 -//.word 0x871dbc67 -//.word 0xbfde7b68 -//.word 0x3d1bdb3d -//.word 0x237eb5ea -//.word 0xb156e85f -//.word 0x6830a0aa -//.word 0x6fa7d86a -//.word 0x357d1d87 -//.word 0x58ea9520 -//.word 0xc63341c5 -//.word 0x227f7fe7 -//.word 0x69e7d38c -//.word 0xd5cce647 -//.word 0x016dcf68 -//.word 0x4fb89270 -//.word 0x8761e6c8 -//.word 0xc0323cb2 -//.word 0x84a2fc7f -//.word 0x2fa81203 -//.word 0x98d1a946 -//.word 0xf391367c -//.word 0xf6d6b937 -//.word 0x3be340dc -//.word 0xe65cac53 -//.word 0x879db703 -//.word 0x425036fe -//.word 0x2d3f9c78 -//.word 0xf966c07e -//.word 0xd54de0e5 -//.word 0x8f95e580 -//.word 0xfcd0e896 -//.word 0x9b96f692 -//.word 0x75d510fd -//.word 0x476876aa -//.word 0xe3eb2630 -//.word 0xd4ce9f9d -//.word 0x41a9ea69 -//.word 0x14cfdba9 -//.word 0x5a269585 -//.word 0xed364cec -//.word 0x517f4f87 -//.word 0xdd1045eb -//.word 0x1b55b612 -//.word 0x7131ce0c -//.word 0x004c5ef2 -//.word 0xccaf241c -//.word 0x1d8e4c93 -//.word 0x266436c9 -//.word 0xe5467a88 -//.word 0x4a702a29 -//.word 0x9b255706 -//.word 0x17b6d632 -//.word 0xdae04367 -//.word 0x005a473f -//.word 0x0daf17a7 -//.word 0x8d4a3d91 -//.word 0xf7cf9bea -//.word 0xd7b2adcc -//.word 0x2c020ef4 -//.word 0x0f853e76 -//.word 0x960aa2af -//.word 0xf8fbcc7c -//.word 0xf232fda9 -//.word 0x690de8ad -//.word 0x50c5b994 -//.word 0xccfb563c -//.word 0x9694e5c4 -//.word 0xa2c78e42 -//.word 0xfe7482b4 -//.word 0xfcb83c3a -//.word 0x93be0782 -//.word 0x03d8c083 -//.word 0xb8cedd6e -//.word 0x7176aee1 -//.word 0xa184e35e -//.word 0x15a44ffd -//.word 0xd8c6eb5d -//.word 0x54b91ee0 -//.word 0xb9fc3b18 -//.word 0xa3d14c7c -//.word 0xf7920e60 -//.word 0x0d483c24 -//.word 0x157a10ab -//.word 0xb343080e -//.word 0xeda7e692 -//.word 0x4727fad8 -//.word 0x2c93a354 -//.word 0x90201400 -//.word 0xd4bb5452 -//.word 0xea9c886b -//.word 0xb91d7591 -//.word 0xc3cd41df -//.word 0x05c0793b -//.word 0x1e2a5989 -//.word 0xb42c471e -//.word 0x14eea078 -//.word 0x18eeb72c -//.word 0x4e981b1f -//.word 0x561619f9 -//.word 0x8c6982d7 -//.word 0xe8b9af41 -//.word 0x22e9c15b -//.word 0x196f2d5f -//.word 0x7563794a -//.word 0x8bd540d6 -//.word 0x82647ca9 -//.word 0xb40c05cc -//.word 0x5740545e -//.word 0x5d398d8a -//.word 0x988dbdb6 -//.word 0x22035ffd -//.word 0xfca626e0 -//.word 0xf518f638 -//.word 0xce29336f -//.word 0x9ba83ff0 -//.word 0x6c7a3edc -//.word 0x2de81dff -//.word 0xcb3dd202 -//.word 0x9991e5e2 -//.word 0xf1e02fa1 -//.word 0x1e5fe23b -//.word 0x790fc9db -//.word 0xd392d14f -//.word 0x133ec9b9 -//.word 0x20706688 -//.word 0x02228aa7 -//.word 0x44c0c5f4 -//.word 0x9c381df4 -//.word 0xce510ac5 -//.word 0xcd3dc554 -//.word 0x2371c2d0 -//.word 0x94b47b5e -//.word 0xfe76700e -//.word 0x84646c0d -//.word 0xeb39091d -//.word 0x44d77643 -//.word 0xcc9678bf -//.word 0x10dcaf41 -//.word 0x55ee1b5a -//.word 0x3605df31 -//.word 0x8fa54477 -//.word 0x9a2a009d -//.word 0x58a4b944 -//.word 0x33e4c5f5 -//.word 0xe1d73412 -//.word 0x8b13100c -//.word 0x2fb0e3d7 -//.word 0x43597a9b -//.word 0x9ba2e9ad -//.word 0x8c9ccfbd -//.word 0x52a8db51 -//.word 0xaf888f72 -//.word 0xd5bc44a4 -//.word 0x860b6f1c -//.word 0x7a60222e -//.word 0x01d7d605 -//.word 0xe9186796 -//.word 0xa2e460d6 -//.word 0xa0ed792b -//.word 0x01eb5e21 -//.word 0x70ecb25f -//.word 0x49eb54d9 -//.word 0xfda5e147 -//.word 0xb9a87ad5 -//.word 0x42adc71c -//.word 0x24273b51 -//.word 0x0b1c9abc -//.word 0x7134b96c -//.word 0x7910862a -//.word 0x1bdc47ab -//.word 0x8228270a -//.word 0xb2f3ee75 -//.word 0x6e091026 -//.word 0x5990e994 -//.word 0x5bdd47eb -//.word 0x468c29ba -//.word 0xbacfc6ec -//.word 0x4606d1fa -//.word 0xcf90fc5f -//.word 0x36e1bb4b -//.word 0x35d54a9b -//.word 0x8a44f109 -//.word 0x58d787a0 -//.word 0xca1a3574 -//.word 0xf9d27c8f -//.word 0x1090792e -//.word 0xae86682e -//.word 0x8b9a68c1 -//.word 0x5fb97d65 -//.word 0xff6edb17 -//.word 0xc9b362c3 -//.word 0x43076500 -//.word 0xffc0affa -//.word 0xc2a3c8af -//.word 0xe4b2745f -//.word 0xfa457d3d -//.word 0xb35cb26b -//.word 0x00343025 -//.word 0x7818e03d -//.word 0xfa7a41c7 -//.word 0x94426815 -//.word 0xa36645e6 -//.word 0x3cbb27da -//.word 0xcb0b8229 -//.word 0xfa67f195 -//.word 0xd5be779d -//.word 0x2baf0af4 -//.word 0x379c5231 -//.word 0x7f00aec8 -//.word 0xfd027839 -//.word 0x7d4a8a87 -//.word 0x461300ec -//.word 0xfc8140cb -//.word 0xc53538e6 -//.word 0xab20e7d1 -//.word 0x42941fa7 -//.word 0x8aa189fb -//.word 0x169ee911 -//.word 0x6e06a34e -//.word 0xb3867fee -//.word 0x8153a9f5 -//.word 0x19c1fc68 -//.word 0xc0127fbc -//.word 0x628b308f -//.word 0x7bce0196 -//.word 0x386321d7 -//.word 0xd9987c18 -//.word 0x598b8597 -//.word 0x518533fb -//.word 0x1a89498b -//.word 0x312ddb9e -//.word 0xe0a90e52 -//.word 0x1b2e1f81 -//.word 0xa979a7f1 -//.word 0x84a71dcb -//.word 0x814b9c4f -//.word 0x33bee6c5 -//.word 0x0db6aab7 -//.word 0xc81a025d -//.word 0x04154059 -//.word 0x326aeaa5 -//.word 0xb10703c9 -//.word 0x37dc8c51 -//.word 0x73ed4b7e -//.word 0xf1a6cb3c -//.word 0x3d6fa454 -//.word 0x4b81fce3 -//.word 0x16f84e0b -//.word 0x88296be8 -//.word 0x9a35bec5 -//.word 0xbcdfd390 -//.word 0x779a1b8c -//.word 0x51e6e946 -//.word 0xf1ddc1ca -//.word 0x8309d216 -//.word 0x5e79c1cf -//.word 0xe414a833 -//.word 0xaa2d5f4f -//.word 0xda57fa72 -//.word 0xd57a92e1 -//.word 0x1c2649cc -//.word 0x70288881 -//.word 0x385b8be0 -//.word 0x24c1200f -//.word 0x10d2ab6f -//.word 0x2b146ece -//.word 0x58ec07de -//.word 0xd4b43ae5 -//.word 0x190df1b7 -//.word 0x037781e2 -//.word 0x321f2f28 -//.word 0xaff7f332 -//.word 0xd20c7c82 -//.word 0x631573aa -//.word 0xff4704bb -//.word 0xbd719b01 -//.word 0x1244ebed -//.word 0xf2f23553 -//.word 0x38fcc7d6 -//.word 0x4844c3a0 -//.word 0xf36a2156 -//.word 0x9b55f74a -//.word 0x9710f8f3 -//.word 0xd8d83b9b -//.word 0xcd733f58 -//.word 0x85c32b3d -//.word 0x149a5ad1 -//.word 0x37d016c0 -//.word 0x3b93a4d1 -//.word 0x1aff8218 -//.word 0xe8eeec6d -//.word 0x6d12a41d -//.word 0x1441f3df -//.word 0x040feb09 -//.word 0x8ca2f003 -//.word 0xc4c277fc -//.word 0x71300cdd -//.word 0x2a399a7b -//.word 0xb98ae711 -//.word 0xc4465eed -//.word 0xad561169 -//.word 0xb601fe1d -//.word 0x69bc9153 -//.word 0x37436bbb -//.word 0x5fe86261 -//.word 0x112bc9db -//.word 0xd38cf1c7 -//.word 0x259def75 -//.word 0x605ba0e0 -//.word 0xe4beebe3 -//.word 0x728f46a9 -//.word 0xd77a7c66 -//.word 0xcb64ad44 -//.word 0x18ff96a1 -//.word 0xff9b1277 -//.word 0xd73fe11b -//.word 0xf7f8a92b -//.word 0xd6713ac1 -//.word 0x71c416ed -//.word 0xed903163 -//.word 0x7e4cf570 -//.word 0x87da8933 -//.word 0x035f5309 -//.word 0x2353bc49 -//.word 0x38d43332 -//.word 0xd4407421 -//.word 0x2c020a07 -//.word 0xc1ac121b -//.word 0x404743cc -//.word 0xa6e62bfa -//.word 0xa782bb65 -//.word 0x51010666 -//.word 0xed9846dd -//.word 0x2653206a -//.word 0x6df229e0 -//.word 0x9bf7a8f6 -//.word 0xd8fd9e40 -//.word 0xbc4b035e -//.word 0xb5a95374 -//.word 0xa97349da -//.word 0xdcebea14 -//.word 0x13d3c604 -//.word 0xfa3c7b5e -//.word 0xc3997a5d -//.word 0x10170eb4 -//.word 0x13319ac8 -//.word 0xf37e221c -//.word 0x72ce0c0c -//.word 0xce7628bf -//.word 0xe4e8ef57 -//.word 0x9b87086a -//.word 0x80b911b6 -//.word 0xae3d9b10 -//.word 0xf1bf769e -//.word 0x2ba93046 -//.word 0xf63dd866 -//.word 0x8ae107c6 -//.word 0xe2b922cb -//.word 0x1a7bd9ed -//.word 0x1c7ff36a -//.word 0x7b164e3c -//.word 0x9f1d2149 -//.word 0x23d285db -//.word 0x7be6344f -//.word 0xdad39011 -//.word 0x526fe7c8 -//.word 0x3ec1f5cd -//.word 0xdd14aae2 -//.word 0x3f4b2e21 -//.word 0x65742332 -//.word 0xa4a02ac1 -//.word 0x4af1a82f -//.word 0x84f4ca88 -//.word 0x7f31c6b6 -//.word 0xce0164f4 -//.word 0x0ca0be85 -//.word 0xc28343a5 -//.word 0x8aec02c0 -//.word 0x75bb26e2 -//.word 0xab87bc6f -//.word 0x51edbd14 -//.word 0xb02848fd -//.word 0x93e22f48 -//.word 0xf04ab5ba -//.word 0xcb6796b1 -//.word 0x58ac485a -//.word 0x60cc8124 -//.word 0xe5d0f975 -//.word 0x0966719b -//.word 0x2c7cf405 -//.word 0x550d5db3 -//.word 0xd33b19eb -//.word 0x249f2e2e -//.word 0x15dd7c6a -//.word 0x2b7b4371 -//.word 0x42f3e6aa -//.word 0x7406ef06 -//.word 0x3c545236 -//.word 0xdb2af61c -//.word 0xfb9b717f -//.word 0x93d21402 -//.word 0x0aa62757 -//.word 0x9f6f75b0 -//.word 0x08180c76 -//.word 0x59763e3e -//.word 0x28d8ebf9 -//.word 0xefe0036a -//.word 0xb19146de -//.word 0xe1a84e17 -//.word 0x7f30d089 -//.word 0x84511fc9 -//.word 0x8069f142 -//.word 0x825e662a -//.word 0x383246b4 -//.word 0x57d78a87 -//.word 0x3d451f70 -//.word 0xd6cbe653 -//.word 0xbca2ff68 -//.word 0xa2c847a3 -//.word 0xf20b1f74 -//.word 0xb56470b1 -//.word 0xb487ecd1 -//.word 0xdcb8965a -//.word 0xe7e0849c -//.word 0x39e0e3a0 -//.word 0x08253d5c -//.word 0xc07df728 -//.word 0xa6291e76 -//.word 0xbb3363bd -//.word 0xe30263b6 -//.word 0x462b2ccb -//.word 0xf78afdcd -//.word 0xd4924ee5 -//.word 0xade110cd -//.word 0xa817363f -//.word 0xe3e974ae -//.word 0x5c714735 -//.word 0x0ec835cd -//.word 0x5dd756c2 -//.word 0xb46a1368 -//.word 0x6d862e0a -//.word 0xf1fd0323 -//.word 0x203f0dd0 -//.word 0xf373ab86 -//.word 0x5fc72400 -//.word 0x7d04e97c -//.word 0xe9651b27 -//.word 0x68a94dd6 -//.word 0xcd678bf6 -//.word 0x1da29bc6 -//.word 0xf19d82c4 -//.word 0x1cf04b64 -//.word 0x8edc0308 -//.word 0x78dc082d -//.word 0xb17c84e2 -//.word 0x596e347f -//.word 0xbcdb6e93 -//.word 0x78f7621e -//.word 0xe3d8a001 -//.word 0xa788dab2 -//.word 0xaf59eb34 -//.word 0x47781947 -//.word 0x7ec597dc -//.word 0xcfe24ecb -//.word 0x018adec8 -//.word 0x4c25df94 -//.word 0xbd996c70 -//.word 0xdc62e2d7 -//.word 0x8be5e56c -//.word 0x3101a432 -//.word 0x18e85efb -//.word 0x142d2623 -//.word 0x661ee37d -//.word 0xdf539a8e -//.word 0x4987f0f9 -//.word 0x02a7ea3b -//.word 0xea29f898 -//.word 0x7f9f3255 -//.word 0x478ce128 -//.word 0x6f7641ed -//.word 0xb13c859a -//.word 0x7baa1c75 -//.word 0x4d4b3385 -//.word 0x627e7b46 -//.word 0x94cc2ca1 -//.word 0x7a794a1a -//.word 0xd359274c -//.word 0x27e52992 -//.word 0xab8ecd08 -//.word 0x6652ecb2 -//.word 0x928c3dfa -//.word 0x45101c60 -//.word 0x5077896d -//.word 0x67b874e8 -//.word 0x83f9384d -//.word 0x85a4657b -//.word 0x1cbcc2ad -//.word 0xe87292ab -//.word 0xe0f31742 -//.word 0xf18555f1 -//.word 0xe7d218e5 -//.word 0x91833828 -//.word 0x20111c15 -//.word 0xd1d87d0f -//.word 0xcc6e6c72 -//.word 0x4b3297ca -//.word 0xfe28c843 -//.word 0xaf04ae61 -//.word 0x2284e0f1 -//.word 0x3f031f40 -//.word 0x724cdb8a -//.word 0x53acf9b5 -//.word 0x824bd43f -//.word 0xd5bb8276 -//.word 0xb6d258e7 -//.word 0xc6b5b018 -//.word 0xc736e97a -//.word 0xb860b099 -//.word 0x414f7e96 -//.word 0x524662d7 -//.word 0x08fb01fd -//.word 0xd035db16 -//.word 0xce99d014 -//.word 0x80c1e27f -//.word 0x9e8f3c66 -//.word 0x45c1749b -//.word 0x55c50d20 -//.word 0x18ce40dc -//.word 0x2427fb92 -//.word 0x82c82b14 -//.word 0x0f2737b4 -//.word 0x2350ccfc -//.word 0x7138e09f -//.word 0x2e4ef1ae -//.word 0x76548e0f -//.word 0xeb6d192c -//.word 0x9f77cbe8 -//.word 0x349af8d7 -//.word 0x412195ae -//.word 0xf889f7f8 -//.word 0x06d8dd0b -//.word 0xbb31b13b -//.word 0x6ba40b4d -//.word 0x144a772f -//.word 0x409278e6 -//.word 0x2dd6cdc7 -//.word 0x2c32f2ea -//.word 0x4795eadc -//.word 0x26183c94 -//.word 0x348f3ca8 -//.word 0xfd5e8bc1 -//.word 0xda8fe14d -//.word 0xd1210a73 -//.word 0xb7a22f4c -//.word 0x97005750 -//.word 0x589c2d0e -//.word 0x99a00421 -//.word 0xe093185f -//.word 0xf42a1753 -//.word 0x8761e0ee -//.word 0x18cb8a79 -//.word 0x1826a8ce -//.word 0x4c33cbc8 -//.word 0x72c549f8 -//.word 0x27173d99 -//.word 0x0862cfc6 -//.word 0x18afb6eb -//.word 0x62eafb7a -//.word 0xdf39ffdf -//.word 0x998cbfb5 -//.word 0x1174573a -//.word 0xde38c500 -//.word 0x9826f0e6 -//.word 0xf427e947 -//.word 0x30967071 -//.word 0xb252ba59 -//.word 0xec12718d -//.word 0x82f9fd69 -//.word 0xaf6b028e -//.word 0xe51e2990 -//.word 0xb37424ef -//.word 0xec08ec49 -//.word 0x06864dcd -//.word 0xc0c1a5f3 -//.word 0x07ffe96a -//.word 0x1b97e852 -//.word 0xeebfd4ac -//.word 0xcd9ffe0f -//.word 0x41aae19c -//.word 0x382d6234 -//.word 0x602856e8 -//.word 0xd45e45b0 -//.word 0xfaa86d60 -//.word 0xab8e0ad9 -//.word 0x9518d57c -//.word 0xdee2cbe5 -//.word 0x0a6f2fd5 -//.word 0x1fbfd26f -//.word 0x072492a8 -//.word 0x355121f9 -//.word 0x8cb40856 -//.word 0x7c06eb64 -//.word 0x6e200ee7 -//.word 0x62101879 -//.word 0xd66c1782 -//.word 0xeae6c564 -//.word 0xc3210af6 -//.word 0x2dc3c134 -//.word 0x84ccbf35 -//.word 0xd426115d -//.word 0x3f7c86d3 -//.word 0x9f506e35 -//.word 0x6d48a08b -//.word 0xe2c9c27a -//.word 0x5bc7c4bb -//.word 0x02dcaecb -//.word 0xab979ce3 -//.word 0xfc16062a -//.word 0xd1d7452a -//.word 0xdecb5380 -//.word 0x97acd3d8 -//.word 0x4c915119 -//.word 0x99c0cadd -//.word 0xfdc36f24 -//.word 0xc9bea649 -//.word 0x3c800000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x000167C8 -//// expected output -//.word 0x661b576d -//.word 0x9751845a -//.word 0x0dbcb2bf -//.word 0xca1d1cc2 -//.word 0xb556e22a -//.word 0x0d671e35 -//.word 0xdbc349eb -//.word 0x51baee0d -//.word 0xed828f52 -//.word 0x88a01d70 -//.word 0x0509fca2 -//.word 0x06e4a398 -//.word 0x15dd85af -//.word 0x1b7d706d -//.word 0xa78abb8e -//.word 0x99701129 -//// SHA512LongMsgvector_116 -//// vector length -//.word 0x00016AE0 -//// input message -//.word 0xcc5a4209 -//.word 0xa6a60dcf -//.word 0x12621e17 -//.word 0x150b4576 -//.word 0xb918732e -//.word 0x0ee8d9ba -//.word 0x6ff94ea6 -//.word 0x065af1a4 -//.word 0x936310dd -//.word 0x68a34985 -//.word 0xb81aefb2 -//.word 0x12a8b06e -//.word 0x29c6740a -//.word 0xd67487b6 -//.word 0x6072fb4f -//.word 0xfab34878 -//.word 0x8d0f36ec -//.word 0xb838fd13 -//.word 0x16efaad3 -//.word 0xbf78c4a8 -//.word 0x114b30f7 -//.word 0xb00c529f -//.word 0xcbbd75d2 -//.word 0xa1336d23 -//.word 0x44c67adf -//.word 0x9d4d70a1 -//.word 0xb14a1521 -//.word 0x2261cb4d -//.word 0xf90f6f9b -//.word 0xa298809d -//.word 0x384184d6 -//.word 0x04c0a7cc -//.word 0x40f1a65e -//.word 0x20caeb58 -//.word 0x1391fa45 -//.word 0x464c0b84 -//.word 0x697af89e -//.word 0xb7005ad7 -//.word 0x3066ef03 -//.word 0x2943409b -//.word 0x07f68010 -//.word 0x4897b65f -//.word 0xc32e1fe6 -//.word 0x3022cd76 -//.word 0xeaf495a9 -//.word 0xf42c2876 -//.word 0x3a948002 -//.word 0x1aa57eb9 -//.word 0x233fd19e -//.word 0x1d9d19df -//.word 0x49874cad -//.word 0xeac9594a -//.word 0x03e50c64 -//.word 0x630532a1 -//.word 0xdf33fd7b -//.word 0xdfccaa4e -//.word 0x1c3260af -//.word 0xa7c25c00 -//.word 0x2e064b41 -//.word 0x7b2bf729 -//.word 0x3db52676 -//.word 0x0b71bf81 -//.word 0xa6ab2f15 -//.word 0x7ea20b81 -//.word 0x7839f7ec -//.word 0xefefc6e9 -//.word 0xf911e34c -//.word 0xeb2fef3b -//.word 0x1fccab88 -//.word 0xf459193e -//.word 0x1765de79 -//.word 0x010eeb7b -//.word 0xc1bb5cfd -//.word 0xfc0da0c3 -//.word 0x3212db73 -//.word 0x42bc88a7 -//.word 0x31926341 -//.word 0x27a686ff -//.word 0xbac7d24f -//.word 0x6ff79064 -//.word 0x7e205889 -//.word 0xd60232b5 -//.word 0x6170fc60 -//.word 0x89bc0c96 -//.word 0xfb70164a -//.word 0xab3e4fec -//.word 0x183ad23e -//.word 0xd1474363 -//.word 0x38cfb338 -//.word 0x86b8c4e8 -//.word 0x0f930ebb -//.word 0xc816c12f -//.word 0x06cc8b4a -//.word 0x880bbc2e -//.word 0xb827a8ee -//.word 0x2ee54ca0 -//.word 0x763235b4 -//.word 0x13159e84 -//.word 0xc3e3d92b -//.word 0x05b2f09b -//.word 0xd90f8bea -//.word 0xc7f414ed -//.word 0x22f41a08 -//.word 0x8eb9f344 -//.word 0xc0b0a6a2 -//.word 0x850308b0 -//.word 0x06c82459 -//.word 0x4a78e001 -//.word 0xfca2ded2 -//.word 0x6fe0a150 -//.word 0xdf0bf134 -//.word 0xfaab8077 -//.word 0x9eb1cdad -//.word 0xe5694994 -//.word 0x5faab9ed -//.word 0x9e50db8a -//.word 0xf8eb4ca9 -//.word 0x88b9a980 -//.word 0x76d2f419 -//.word 0x78a33a60 -//.word 0x999d737b -//.word 0x3a2eaa59 -//.word 0x56f15e8e -//.word 0x0a22275e -//.word 0x54549d17 -//.word 0x1b6675a5 -//.word 0x6fb3ed60 -//.word 0x13896b28 -//.word 0x38dd60b4 -//.word 0x8c3c7327 -//.word 0x7305dce4 -//.word 0x94d60da4 -//.word 0x984498c6 -//.word 0x2ecf4de6 -//.word 0x5314a2b0 -//.word 0xd04559f6 -//.word 0x04d75c01 -//.word 0xe37aec25 -//.word 0x3f4efa98 -//.word 0x4754d585 -//.word 0x4d23065b -//.word 0xccdc786b -//.word 0xa95fddb2 -//.word 0xb9bf4cf3 -//.word 0x84f42f0a -//.word 0x48d05c7c -//.word 0x41358252 -//.word 0x2884c728 -//.word 0xfa58af81 -//.word 0xfa75405d -//.word 0xf9fb640e -//.word 0xd5e08e47 -//.word 0x409ca076 -//.word 0xc2260d53 -//.word 0x01203ab9 -//.word 0x414e2bb6 -//.word 0x274d5bde -//.word 0xc282ebe4 -//.word 0xcc50ff6b -//.word 0x2c8e6619 -//.word 0xc03879ed -//.word 0x5a6445d3 -//.word 0x0878ec76 -//.word 0x999b4856 -//.word 0x5c69d21a -//.word 0x2bebc227 -//.word 0xa8c67871 -//.word 0xc7b21b91 -//.word 0x8d2e8019 -//.word 0x17734d24 -//.word 0xdda65e31 -//.word 0x38516731 -//.word 0x2214dbde -//.word 0x3d980d4f -//.word 0x18c596c9 -//.word 0xad35f6d9 -//.word 0x2ee87e9f -//.word 0x01396d6d -//.word 0x09105991 -//.word 0x275ad06e -//.word 0x00b640d2 -//.word 0x01711483 -//.word 0xa1b5201b -//.word 0xe6fd3f16 -//.word 0x2bcc3a2a -//.word 0x209fecd7 -//.word 0x1220a43e -//.word 0x6d9ccb36 -//.word 0x7fb7c79d -//.word 0x7e5f1eec -//.word 0xcdfedf0e -//.word 0x7bf43e73 -//.word 0x0d447e60 -//.word 0x7d8d1489 -//.word 0x823d09e1 -//.word 0x1201a0b1 -//.word 0x258039e7 -//.word 0xbd4875b1 -//.word 0x23089b4b -//.word 0x73013a16 -//.word 0x5ab710e9 -//.word 0x1fec2bab -//.word 0xe0ce4e22 -//.word 0x1f709606 -//.word 0x7d775d5a -//.word 0xc4165ffc -//.word 0x2b3c1b7a -//.word 0xd60b7d27 -//.word 0x9d8db96e -//.word 0x0ea27a67 -//.word 0xb53d3ca8 -//.word 0x9bd0f65e -//.word 0x0c05fd9c -//.word 0x9daf25f2 -//.word 0x6e002942 -//.word 0xadfc4dcf -//.word 0x5b2d4197 -//.word 0x539949e3 -//.word 0x88f19b1c -//.word 0x8e0b08e0 -//.word 0x5c92df55 -//.word 0x50fd0fbd -//.word 0x73bd8b4b -//.word 0xffbbf335 -//.word 0x1e01700b -//.word 0xf5b7e047 -//.word 0xe1523325 -//.word 0x000814b5 -//.word 0xf487cc2e -//.word 0xe3e66485 -//.word 0xc2dc0a3e -//.word 0xd430b783 -//.word 0x6d700e73 -//.word 0xfce686bc -//.word 0x48c8cb6c -//.word 0xfaaf6204 -//.word 0x5c4a8cce -//.word 0x60546e71 -//.word 0xe4c36ec3 -//.word 0x3443e0de -//.word 0xd1e2e276 -//.word 0x710d846a -//.word 0x46bb2d98 -//.word 0x83e83af6 -//.word 0x1d45e7df -//.word 0xce2e73aa -//.word 0x60dc7f81 -//.word 0x28dcb870 -//.word 0xd1bfb5bd -//.word 0x5b142278 -//.word 0x62931f52 -//.word 0xa49be3b3 -//.word 0xbedfa506 -//.word 0x365cbc58 -//.word 0xbe8e0521 -//.word 0xb7e38561 -//.word 0xf5704fef -//.word 0xc2e2a80e -//.word 0x25b86a42 -//.word 0x64b0a662 -//.word 0xc77f8ded -//.word 0x9fc591a1 -//.word 0x8740c74a -//.word 0xea4090d9 -//.word 0xc55b78b5 -//.word 0xae615e56 -//.word 0x1693d60f -//.word 0xcb0fcb2b -//.word 0xc08f693c -//.word 0x115339b0 -//.word 0x425c8ea5 -//.word 0xc8db21ff -//.word 0xcae9f8b7 -//.word 0x28788c75 -//.word 0xbd8a2a62 -//.word 0xe1a19a37 -//.word 0x3276ff9b -//.word 0x95edfeab -//.word 0x774922da -//.word 0x599c7ffb -//.word 0x8b82969c -//.word 0x370f7996 -//.word 0xa20630e2 -//.word 0xaf4c5aae -//.word 0xa59c17b0 -//.word 0x317b26bb -//.word 0xaf6f4b90 -//.word 0xa56cf4f6 -//.word 0x908f1b0d -//.word 0xe40f6edf -//.word 0x4e70ae38 -//.word 0x3cf955b8 -//.word 0x9f697b26 -//.word 0xefe6fa07 -//.word 0x7036d16f -//.word 0xb531c618 -//.word 0x627650b1 -//.word 0x365eb378 -//.word 0x482e6d0b -//.word 0x9091d17b -//.word 0xaa45f2a3 -//.word 0xd714c2b8 -//.word 0x45067b21 -//.word 0x90d53e88 -//.word 0x88a1fa31 -//.word 0x35e5908a -//.word 0x18aa3504 -//.word 0xb4fa1722 -//.word 0x4d9843cf -//.word 0xf0eec6f5 -//.word 0xb347124b -//.word 0x3e3ea46f -//.word 0x8a76e434 -//.word 0xe98c4d3d -//.word 0x474acdcb -//.word 0xaf1e6fd3 -//.word 0x11ca3754 -//.word 0x425c4de7 -//.word 0x44615f98 -//.word 0xc85640f4 -//.word 0xf15fd563 -//.word 0x5b3c31b8 -//.word 0x5c78ff07 -//.word 0x89e320b6 -//.word 0x7c4396d7 -//.word 0xd547a1b5 -//.word 0x7fbc27ad -//.word 0x35035940 -//.word 0x44c39466 -//.word 0x92db8524 -//.word 0xdf9b9160 -//.word 0x4b3374f5 -//.word 0x186b2803 -//.word 0xb2950888 -//.word 0xecc03535 -//.word 0x8d2f397a -//.word 0x0b0aeae4 -//.word 0x965291a8 -//.word 0x581a4c80 -//.word 0xfcf5b1b5 -//.word 0x6dabb47d -//.word 0xe030cb88 -//.word 0x14d650d6 -//.word 0xd8c126cb -//.word 0xcf9b9f85 -//.word 0x708a9d6d -//.word 0x505ff80c -//.word 0xa4112021 -//.word 0x016904f0 -//.word 0x67fe32dc -//.word 0x7e643f38 -//.word 0x1fa1695b -//.word 0x16e07bf2 -//.word 0x276af19b -//.word 0x4fd15daf -//.word 0x4b6e095e -//.word 0x5f0ede02 -//.word 0x50e984ad -//.word 0xb2d4cb04 -//.word 0x6ab74a51 -//.word 0x6b4046d3 -//.word 0xc3d9d559 -//.word 0xdbd8420f -//.word 0xfaf6b497 -//.word 0x0c030b5b -//.word 0xa2d80b22 -//.word 0x398cbce2 -//.word 0xbfeb10d5 -//.word 0x5323c7cf -//.word 0x4dc190cf -//.word 0x7edc71d4 -//.word 0xb99068f2 -//.word 0x91af53a4 -//.word 0x65b20d64 -//.word 0x9af6da79 -//.word 0x28250511 -//.word 0x58f1c78f -//.word 0xcc096b26 -//.word 0xbf45b0a7 -//.word 0x8e246f97 -//.word 0x77797d85 -//.word 0xa161d39a -//.word 0x5d78ec72 -//.word 0xac4d6f2a -//.word 0x01130ebb -//.word 0x4899ae86 -//.word 0x267cc830 -//.word 0x839b0faf -//.word 0x46cb53a5 -//.word 0x5fcca5ed -//.word 0x0b7cbc74 -//.word 0x534b974b -//.word 0xd6ef64fa -//.word 0xc959a116 -//.word 0x3ce78116 -//.word 0x9fdb9162 -//.word 0x840c9bad -//.word 0xa7dbca85 -//.word 0x2b691028 -//.word 0x2607c59a -//.word 0x60ee91f4 -//.word 0x58318bff -//.word 0x88efa201 -//.word 0xeacd3dd7 -//.word 0xbba31e44 -//.word 0x7f768c89 -//.word 0x45a7b136 -//.word 0x2c69413f -//.word 0x26785c52 -//.word 0xfc09b668 -//.word 0x93fcf59b -//.word 0x6d595a37 -//.word 0x72faa413 -//.word 0xf1853122 -//.word 0xe29e6745 -//.word 0x6e5a5263 -//.word 0xb1f68ebc -//.word 0xbec9687a -//.word 0xe3774089 -//.word 0x2f6832a9 -//.word 0x3278f5c2 -//.word 0x04f00277 -//.word 0x89b6f9fd -//.word 0xf2c0412e -//.word 0x87ceefd9 -//.word 0xa459ea5d -//.word 0x02c64c76 -//.word 0x38e00b56 -//.word 0x8285d8f8 -//.word 0xc09f47b1 -//.word 0xc2573108 -//.word 0xc28557c7 -//.word 0x326a4752 -//.word 0xb9a18438 -//.word 0x7853e108 -//.word 0x91ab2e66 -//.word 0xea89165d -//.word 0x2e7b48f7 -//.word 0x15e9d50b -//.word 0xe68fd957 -//.word 0x3a305ece -//.word 0x02897d33 -//.word 0xcb85c6e7 -//.word 0x41afe300 -//.word 0xf2ec779a -//.word 0x556a4c72 -//.word 0x0bd4aeb1 -//.word 0x64c81205 -//.word 0x258afcf6 -//.word 0x89fa1f78 -//.word 0x85c3c5bc -//.word 0x50d6714c -//.word 0x2317c357 -//.word 0x3e559d49 -//.word 0x2b80849f -//.word 0x461649fa -//.word 0x7ddfe872 -//.word 0x55dab02c -//.word 0x2d77a42f -//.word 0xc7062273 -//.word 0x0470c23b -//.word 0xef2581a5 -//.word 0xfd551f80 -//.word 0x9463c55d -//.word 0xc997ebe9 -//.word 0x6e13797a -//.word 0x4c082ce7 -//.word 0xad293c9d -//.word 0x1e603cef -//.word 0x72c041ae -//.word 0x0abc46fa -//.word 0x5496cf57 -//.word 0x921acd04 -//.word 0xdd8bc288 -//.word 0x69de258d -//.word 0x0a2608f1 -//.word 0xf750f81b -//.word 0xcf10258b -//.word 0xd91bc3b5 -//.word 0x9097af10 -//.word 0x5fcf566a -//.word 0xa92cd37e -//.word 0x0c6157c8 -//.word 0xe7e5ce98 -//.word 0x19a6bf66 -//.word 0x0cfc7465 -//.word 0xf3db5c5a -//.word 0x4f4eadaf -//.word 0xb8204dc3 -//.word 0xdadcf385 -//.word 0xbef98a41 -//.word 0x4b4ed6ba -//.word 0x0ccc5978 -//.word 0x336b7863 -//.word 0xde65da91 -//.word 0x9aa3115d -//.word 0x25747cb9 -//.word 0x79856bc5 -//.word 0x050e85a0 -//.word 0x3e49677d -//.word 0x56288efa -//.word 0x4b4777ae -//.word 0x24200401 -//.word 0x787e2241 -//.word 0x2f34a9f2 -//.word 0x8c0e8465 -//.word 0x6c08118c -//.word 0xc8beca0c -//.word 0x81242694 -//.word 0x5d77ba6d -//.word 0x4c73a453 -//.word 0xf1c72984 -//.word 0x5dc69d16 -//.word 0x1e5f838d -//.word 0x784ff6ad -//.word 0xf295488d -//.word 0x1526e8ed -//.word 0x70e389c9 -//.word 0xdfc8802f -//.word 0x0d666e4d -//.word 0x389320ce -//.word 0x3460b367 -//.word 0xb34bfcac -//.word 0xc3b62729 -//.word 0x98989dae -//.word 0x8c732cea -//.word 0x6486623b -//.word 0xd54339c5 -//.word 0x4703fac2 -//.word 0xd8f95b18 -//.word 0xa464ea31 -//.word 0x4409af07 -//.word 0x94e10d7e -//.word 0xb90feaf7 -//.word 0x63141022 -//.word 0x5046d213 -//.word 0x127ff299 -//.word 0x1112c2cb -//.word 0xd3038ae3 -//.word 0x7b772a50 -//.word 0x90690006 -//.word 0x009f0c19 -//.word 0x65dc528a -//.word 0x86588061 -//.word 0x216dd1fb -//.word 0xe89331a6 -//.word 0xc98ea26b -//.word 0x72e6de2b -//.word 0x15983eee -//.word 0x680bda77 -//.word 0xf145f21c -//.word 0x805f8dd4 -//.word 0xfd365f92 -//.word 0x6364f0d1 -//.word 0x0d6ffb70 -//.word 0x313f14c1 -//.word 0xaad68edd -//.word 0xfa3b9c3a -//.word 0x8fb7b67f -//.word 0x45443f96 -//.word 0x2d436403 -//.word 0x8d6d4775 -//.word 0x270c5d9b -//.word 0xbe6b1439 -//.word 0xd78bba7b -//.word 0xbd179a89 -//.word 0xc79a685b -//.word 0xddf0dfcf -//.word 0x39fba8f9 -//.word 0x6b977eba -//.word 0xa0cf9094 -//.word 0x235126bc -//.word 0x241f8871 -//.word 0xb9881c8d -//.word 0x2257ce5a -//.word 0x514ab4a6 -//.word 0xaac5f21a -//.word 0x07c8dcc7 -//.word 0xff1f5b02 -//.word 0x68d89272 -//.word 0x1afac167 -//.word 0xf674696d -//.word 0x2754b122 -//.word 0xa8390844 -//.word 0x060b0c0e -//.word 0x68e9aac5 -//.word 0xcc63878e -//.word 0x93ea9f82 -//.word 0x40842d04 -//.word 0x7dc5ca52 -//.word 0x5ffad85b -//.word 0xeaa721d1 -//.word 0xd834bc7e -//.word 0x96e331db -//.word 0x9005dcdf -//.word 0xae6e9715 -//.word 0x1e2693f1 -//.word 0x55618764 -//.word 0x50b10dae -//.word 0x207b4874 -//.word 0xa5a8cb12 -//.word 0x9a9cb632 -//.word 0xd16c229e -//.word 0xc04bc052 -//.word 0x3d46bcd6 -//.word 0x8632e8ca -//.word 0x84e216c2 -//.word 0x519dc555 -//.word 0xf7ce0171 -//.word 0x7bfe84f1 -//.word 0x1a002172 -//.word 0xd26b6362 -//.word 0x244e7159 -//.word 0x191e34ad -//.word 0x83f3bc41 -//.word 0x85f4e09d -//.word 0x55102544 -//.word 0x41f0e241 -//.word 0xf029a104 -//.word 0xebb5c76c -//.word 0x5ba47825 -//.word 0x150fb534 -//.word 0xd34ec7d0 -//.word 0xc46ae174 -//.word 0x48d50132 -//.word 0xf459174a -//.word 0xdd4f69fb -//.word 0x13113699 -//.word 0x6bb299e0 -//.word 0x82ecb188 -//.word 0xfe59ff19 -//.word 0x17e60f01 -//.word 0x57865be4 -//.word 0x9d236c33 -//.word 0x68da4200 -//.word 0x5267f611 -//.word 0xdbde9e33 -//.word 0x689d71d0 -//.word 0x8c7e2cc4 -//.word 0x8551b46d -//.word 0x0a89fc01 -//.word 0x44352925 -//.word 0x1a32f4bb -//.word 0xb19f50fb -//.word 0x33924dc5 -//.word 0xd0093d35 -//.word 0x03241579 -//.word 0x179116df -//.word 0xe947ac32 -//.word 0xef779647 -//.word 0x79bf47d3 -//.word 0x37a28c7f -//.word 0xfc35703f -//.word 0xc11a5ddf -//.word 0xedb283df -//.word 0xd48f7d80 -//.word 0x7d28321f -//.word 0xa8d1fac2 -//.word 0x0fea03f1 -//.word 0xed56f2c7 -//.word 0xbd2fcd48 -//.word 0x44b718f5 -//.word 0xd1923e9e -//.word 0xc4333378 -//.word 0x4d95586f -//.word 0x762b9fbd -//.word 0x6419efbc -//.word 0xd9a4caf8 -//.word 0xfee72d89 -//.word 0x60c8b7a0 -//.word 0x382b0e5f -//.word 0xef667fee -//.word 0xe1f4e4cb -//.word 0x626dcb61 -//.word 0xfeb5d4dd -//.word 0x05745b3d -//.word 0x48c757a9 -//.word 0x1d368207 -//.word 0xa9e5bbca -//.word 0x5e0ea80a -//.word 0xc2ae9fda -//.word 0x727fc7d6 -//.word 0x67277afb -//.word 0x79afeebc -//.word 0x21361551 -//.word 0x83e7c153 -//.word 0xac280c86 -//.word 0x1814f7f6 -//.word 0x772c5145 -//.word 0xb049db43 -//.word 0x27d6a9bf -//.word 0x3c3bcb9d -//.word 0x149c2d29 -//.word 0x9bc4bcab -//.word 0xc95cca3c -//.word 0x2561b4d7 -//.word 0x88d5c2b3 -//.word 0x24b44ed0 -//.word 0xc42929d0 -//.word 0x55023a09 -//.word 0xa66268d8 -//.word 0x6cb5bb38 -//.word 0x89e9bd93 -//.word 0x8edc27d8 -//.word 0x7e10b9cd -//.word 0xd5a66aa7 -//.word 0xc88ac1d8 -//.word 0xcfeb8328 -//.word 0x61ee8e07 -//.word 0xfea30521 -//.word 0x7338ad34 -//.word 0x5a6c971e -//.word 0xe047003b -//.word 0xcb0875ed -//.word 0xbb603b7c -//.word 0xafdded21 -//.word 0xcca9675d -//.word 0x5a74e38f -//.word 0x10af62c6 -//.word 0x91fb4ed4 -//.word 0x36e15da4 -//.word 0x0ec3b8cd -//.word 0x23125d66 -//.word 0xffc2c11d -//.word 0x6ffbba83 -//.word 0x87129daa -//.word 0xe6b7a3f2 -//.word 0x3c709220 -//.word 0x094699b0 -//.word 0xa7bd7b6d -//.word 0x8a0af03e -//.word 0xc7814843 -//.word 0xd34d5120 -//.word 0x8d637b99 -//.word 0x7fb93a60 -//.word 0x61b2ac2a -//.word 0xdfdd7c08 -//.word 0x9de006f5 -//.word 0x77afbbab -//.word 0x0d02c7bc -//.word 0x7f05f2dd -//.word 0x7551c485 -//.word 0x631bedb7 -//.word 0x0babe41b -//.word 0x4310cd54 -//.word 0xf813a08e -//.word 0x73698856 -//.word 0xdb2d89af -//.word 0xfb8d6662 -//.word 0x46c3c295 -//.word 0x1847859f -//.word 0x3f42811b -//.word 0xba46563b -//.word 0xc03d9260 -//.word 0x05a01de7 -//.word 0x38ead545 -//.word 0xd04b7556 -//.word 0x08a0bbf2 -//.word 0x28a3cac2 -//.word 0x075fcd51 -//.word 0xcee8dd66 -//.word 0xfe482592 -//.word 0xb5bc4305 -//.word 0x2d21f2a5 -//.word 0x85a9e662 -//.word 0xc4d2f8c3 -//.word 0x1b9983c5 -//.word 0x6aea0ee6 -//.word 0x065c2b7d -//.word 0xba1b9e4c -//.word 0x0b25c258 -//.word 0xc0ba29f9 -//.word 0xa20d832d -//.word 0x8140c131 -//.word 0x778f7a53 -//.word 0x71cc8d02 -//.word 0xea0b0827 -//.word 0xfa9e48b8 -//.word 0x90446289 -//.word 0xfb9dc266 -//.word 0xb0e11260 -//.word 0x47d25e64 -//.word 0xc6ef7512 -//.word 0x22eb92cb -//.word 0x035d3b0c -//.word 0xc8b96afb -//.word 0xcb7feb40 -//.word 0xe6b20516 -//.word 0x368c5ca2 -//.word 0x1e701683 -//.word 0x8f203daa -//.word 0x8730646c -//.word 0xd8bb8ed5 -//.word 0x2b544b40 -//.word 0x443f2424 -//.word 0x88e23931 -//.word 0xbc76299c -//.word 0x0f0232b7 -//.word 0x5b8a9ac4 -//.word 0xa8834d0b -//.word 0xf28bc72a -//.word 0x2c5734ad -//.word 0x84edd6de -//.word 0xe913a8de -//.word 0xca0741f5 -//.word 0x2170fa27 -//.word 0xb1955308 -//.word 0x8bcd93d1 -//.word 0xd736afb2 -//.word 0xd1aa6d6a -//.word 0x12efc916 -//.word 0x112e9846 -//.word 0xe9a76b56 -//.word 0x5da2b6fc -//.word 0x19a9321d -//.word 0x3af47fe5 -//.word 0x11250e16 -//.word 0x24363ea0 -//.word 0x76afc573 -//.word 0x091c5291 -//.word 0xa0be7167 -//.word 0xc981ae5d -//.word 0x1b2efdac -//.word 0xbde2596f -//.word 0x28bfacfe -//.word 0x2de1ef77 -//.word 0x3993929d -//.word 0xd8c31ee6 -//.word 0x78b419cf -//.word 0x70f32a73 -//.word 0x408c7d5c -//.word 0x1a7d6999 -//.word 0xa26b5010 -//.word 0xf394c716 -//.word 0xe205f73d -//.word 0x860d436d -//.word 0xf8f12c37 -//.word 0x57e17165 -//.word 0x0f2b7ad6 -//.word 0x5baff689 -//.word 0x0993c4f7 -//.word 0x7e380fa6 -//.word 0xf96cbefb -//.word 0x1ce10b50 -//.word 0xa8dd7146 -//.word 0x8834cc5c -//.word 0x1174bcc1 -//.word 0x885f4a67 -//.word 0xe49ece59 -//.word 0xd6b3104e -//.word 0x0730ad7e -//.word 0xa126bcb4 -//.word 0x10e1b2a5 -//.word 0x0ad28380 -//.word 0xcccd0ac6 -//.word 0xa775ab5c -//.word 0xbcf437df -//.word 0x04ef0f37 -//.word 0x93b88d6f -//.word 0x1dc69fc3 -//.word 0xb963b5fb -//.word 0xe5a5def8 -//.word 0xca9f2d8d -//.word 0xc2d86290 -//.word 0x18fdc630 -//.word 0x0fd25788 -//.word 0x256e2575 -//.word 0x98a8fca5 -//.word 0x2acd43f1 -//.word 0x219424ed -//.word 0x9353eebd -//.word 0xe072b72a -//.word 0x802045f5 -//.word 0xff462f6a -//.word 0x45b93f39 -//.word 0x1bb41b82 -//.word 0xeb85242f -//.word 0xc7869f86 -//.word 0xad4f13fe -//.word 0x0a2af152 -//.word 0x7cc87ad5 -//.word 0xdc32de05 -//.word 0x7c01a162 -//.word 0xadd24381 -//.word 0x85f5205c -//.word 0xdf6595ec -//.word 0xa2fd64fa -//.word 0x47e85a32 -//.word 0x955a2f79 -//.word 0xaf7dad80 -//.word 0x51af1499 -//.word 0x57eabeca -//.word 0x7f83ff20 -//.word 0x6f184f46 -//.word 0xfac4ab56 -//.word 0x9f9438ef -//.word 0x523f2a88 -//.word 0x8011e404 -//.word 0x4d296086 -//.word 0x20e4d286 -//.word 0x61998825 -//.word 0x818715bd -//.word 0x3b0baebd -//.word 0x1a17d4b4 -//.word 0x3cdf34ab -//.word 0x55d5cbb8 -//.word 0xf6d84dd0 -//.word 0x10a8c8dd -//.word 0xb49e8410 -//.word 0x1c9a2f79 -//.word 0xef3c36d5 -//.word 0xc15776a7 -//.word 0xd9a2148a -//.word 0x38b1a9c5 -//.word 0xd724a320 -//.word 0x2f1fe8f6 -//.word 0xfefabc8c -//.word 0x4939e4a1 -//.word 0x9dbe0b46 -//.word 0x9b3d66f0 -//.word 0xb4f194cc -//.word 0x308dc852 -//.word 0x7576291d -//.word 0x862f79fa -//.word 0xca14f53f -//.word 0x0f4c7d5e -//.word 0xcef9f5b9 -//.word 0xb0b1ebb8 -//.word 0x52327a19 -//.word 0x45516e88 -//.word 0x5a34a870 -//.word 0x1cc1c510 -//.word 0x9d56fad1 -//.word 0x76bb42d7 -//.word 0x0955bcd6 -//.word 0x099c4e27 -//.word 0x3dcf8f1b -//.word 0x80e6e48f -//.word 0x0dc8e9c0 -//.word 0xf9be1261 -//.word 0x012792eb -//.word 0x866e7b35 -//.word 0xd63a2744 -//.word 0xade4d864 -//.word 0xfc2e9b77 -//.word 0xe832728e -//.word 0x1698b1b6 -//.word 0x260ca915 -//.word 0x7def8435 -//.word 0x484d709f -//.word 0xbd1000ac -//.word 0xa473ce98 -//.word 0x17b966d8 -//.word 0x861e5fad -//.word 0xfe0ecbfa -//.word 0xaa95d253 -//.word 0x9a179956 -//.word 0xc341693e -//.word 0x473f0db5 -//.word 0xf72f7bea -//.word 0x16d6b7e4 -//.word 0x6092f516 -//.word 0x4b90fe33 -//.word 0x8d3fd443 -//.word 0xde0599f7 -//.word 0xff30ad39 -//.word 0xfb2f1708 -//.word 0xad022683 -//.word 0x82ef5743 -//.word 0x81777aee -//.word 0x88881109 -//.word 0xd8f4f90e -//.word 0xd3224cbf -//.word 0x050485b9 -//.word 0x6248e54c -//.word 0xced3168a -//.word 0xe36b0f9e -//.word 0xeeb33760 -//.word 0x3a5dcd26 -//.word 0x929b87dc -//.word 0x01d67957 -//.word 0xdca339e6 -//.word 0x02f3412a -//.word 0x63899428 -//.word 0xbfb2a59d -//.word 0xb0307491 -//.word 0xeb77fa2f -//.word 0xc31cc7d4 -//.word 0xef8aea66 -//.word 0x8cf711e7 -//.word 0x6696f14a -//.word 0x730ee885 -//.word 0xa02ce1e7 -//.word 0xd0d479ac -//.word 0x223e60cf -//.word 0x735f011f -//.word 0x25a46595 -//.word 0x1ee654e5 -//.word 0x139bbe53 -//.word 0x06495ac8 -//.word 0x0d418d25 -//.word 0x56898dd7 -//.word 0x681ac6ac -//.word 0xab4b7de4 -//.word 0x2b8eb38c -//.word 0x995a4c07 -//.word 0x936870ee -//.word 0x2422321a -//.word 0x8f596ffe -//.word 0x4836f93a -//.word 0x4473f56e -//.word 0x72ca824c -//.word 0x8aae9cf2 -//.word 0x053a3f76 -//.word 0x6c67cfc2 -//.word 0xd681b7a2 -//.word 0xaddc511b -//.word 0xb0c306ff -//.word 0x3eb1b6be -//.word 0xd1c4597f -//.word 0xc96ee76f -//.word 0x6b6e7659 -//.word 0x29fea278 -//.word 0x234e3289 -//.word 0xef32f923 -//.word 0x9517f94b -//.word 0xde3ccf44 -//.word 0xcf1f4ba4 -//.word 0x70355ead -//.word 0xd2dd39d9 -//.word 0x4f97b3b7 -//.word 0x1471ebf6 -//.word 0xddc32fbf -//.word 0x001c1d49 -//.word 0xad7c08a7 -//.word 0x74c49ee4 -//.word 0x076ac751 -//.word 0x4271d01e -//.word 0x6899c828 -//.word 0xb0d32a12 -//.word 0x00f7bd97 -//.word 0xf8b9b91e -//.word 0x32da2b8f -//.word 0xc89b9a66 -//.word 0x1777eb06 -//.word 0xc311824f -//.word 0xfc6caa72 -//.word 0xff5a3704 -//.word 0xdf376a52 -//.word 0x85d614f5 -//.word 0xf5bcfea6 -//.word 0xd48c8953 -//.word 0x27c39272 -//.word 0x5ea59895 -//.word 0x9178213e -//.word 0x09ef59f5 -//.word 0x02e9fd99 -//.word 0xaf5c77f4 -//.word 0x7f8b4b91 -//.word 0x9f80b1d2 -//.word 0xc0b6833d -//.word 0x1a165a17 -//.word 0xb124f534 -//.word 0xd77bda0d -//.word 0xf2773f13 -//.word 0x7f312a43 -//.word 0x57b0d8fb -//.word 0x315d5c0c -//.word 0x69b88810 -//.word 0x004a10fe -//.word 0xe3daedfb -//.word 0x70e40073 -//.word 0x3647f869 -//.word 0xfc3e750b -//.word 0x05916d8a -//.word 0x930dd028 -//.word 0xaa316793 -//.word 0x162a0271 -//.word 0xb002d23c -//.word 0xdc141450 -//.word 0x56c3ef42 -//.word 0x2f6ba074 -//.word 0x1298d4e6 -//.word 0xcc76554f -//.word 0x0b89e96d -//.word 0x669e7899 -//.word 0x9e026c9e -//.word 0x24f15dcb -//.word 0xdb51ee47 -//.word 0x1ea1f2a5 -//.word 0x052cd4b8 -//.word 0xe48235a9 -//.word 0x1528d646 -//.word 0xf88fb99d -//.word 0x374383ca -//.word 0x4f65250d -//.word 0x4c5bbb20 -//.word 0xd3c6b4c7 -//.word 0x66b434a8 -//.word 0xe418b65d -//.word 0x4f77f6c8 -//.word 0xd2e30ea6 -//.word 0x032ddf67 -//.word 0x6557b23e -//.word 0x31481f74 -//.word 0x56c32f01 -//.word 0xbe9abd5d -//.word 0xd31f2294 -//.word 0x42dc1199 -//.word 0xfe84bfdc -//.word 0x8929471e -//.word 0x6fae4e84 -//.word 0x1380e2eb -//.word 0xad81a87c -//.word 0x94453780 -//.word 0xb981bf75 -//.word 0x74c0ee61 -//.word 0x84581466 -//.word 0x519d8597 -//.word 0x73543f0a -//.word 0x786bcc2e -//.word 0xe2e76a5f -//.word 0x701d6ab8 -//.word 0x9f25d629 -//.word 0x6f8c56c9 -//.word 0x6a49546d -//.word 0xe3f25f79 -//.word 0x7c30cdf6 -//.word 0xeb71a5e5 -//.word 0xfddcbcd3 -//.word 0xda8a1dae -//.word 0x8cf3aed7 -//.word 0xbba61178 -//.word 0xba3ec918 -//.word 0xc8919e6d -//.word 0x8f2a4271 -//.word 0xf1fa34b8 -//.word 0x044ae500 -//.word 0x5bf41a0a -//.word 0x88d391a8 -//.word 0xde78e718 -//.word 0x7c1eb990 -//.word 0x87e00a1a -//.word 0xb62ae4a2 -//.word 0x146e424d -//.word 0x01182e0d -//.word 0x7ac32773 -//.word 0x9badc5c4 -//.word 0x6268a04e -//.word 0xb6d36dfc -//.word 0xa8496a29 -//.word 0xf818fdb2 -//.word 0xdb35974f -//.word 0xfb2edf23 -//.word 0xc05f0d91 -//.word 0xce699352 -//.word 0xcfe003c4 -//.word 0x72442d85 -//.word 0xb3338741 -//.word 0x5edcd3c8 -//.word 0xceb7fb64 -//.word 0xfb744069 -//.word 0xb431930d -//.word 0x28ef437a -//.word 0xab47d922 -//.word 0xb7594153 -//.word 0x31062a0b -//.word 0xee5fae0d -//.word 0x765c3634 -//.word 0x08d29808 -//.word 0xde9f838f -//.word 0xb1271d66 -//.word 0x8005ea0f -//.word 0x8efaf08d -//.word 0xaa29192e -//.word 0xb287d8a9 -//.word 0x5a8d0f68 -//.word 0x2a303127 -//.word 0xc612a4be -//.word 0x72fa693b -//.word 0xd582fe34 -//.word 0xfd0f835c -//.word 0xa4061d53 -//.word 0xb23d98c3 -//.word 0x03b050a8 -//.word 0x697651ef -//.word 0xf5f3bd43 -//.word 0x724e6e24 -//.word 0x3325dd39 -//.word 0x0f8042e7 -//.word 0xa904fd22 -//.word 0xf56a3583 -//.word 0xf72fbf9b -//.word 0xce8c4188 -//.word 0xf2a897c5 -//.word 0xba0d7547 -//.word 0x21584ec5 -//.word 0xc9357557 -//.word 0x408b8342 -//.word 0x83f4f812 -//.word 0xc07025ea -//.word 0x605a4919 -//.word 0x459bfaed -//.word 0x501dc6cc -//.word 0x27831b80 -//.word 0x351764d3 -//.word 0xf203755c -//.word 0x64c52998 -//.word 0xe6dd493d -//.word 0x28c8b0ca -//.word 0x7732ad63 -//.word 0x3e68a9dc -//.word 0xcd0c0a14 -//.word 0x5a0c5784 -//.word 0x45d49c17 -//.word 0xa1c3103c -//.word 0xefdcf53a -//.word 0x2cbfc0c5 -//.word 0x0fd77ace -//.word 0x8cd4669f -//.word 0x9c5ce426 -//.word 0x40fd9591 -//.word 0xc367c01c -//.word 0x40d8f427 -//.word 0x65d7ef8c -//.word 0x7625bf2f -//.word 0x95f127d7 -//.word 0x404b443c -//.word 0x1bdb7061 -//.word 0xf0d36723 -//.word 0xf422a912 -//.word 0x4ceb1f81 -//.word 0xcf3500d9 -//.word 0x0ee4f633 -//.word 0x91e87d25 -//.word 0x64b48cdb -//.word 0xd3f1786a -//.word 0x71741562 -//.word 0x5f6e1ea2 -//.word 0xcae3d771 -//.word 0xb65ef0ca -//.word 0xfae2adf6 -//.word 0x8c234461 -//.word 0xfff687a6 -//.word 0x4a07c2ec -//.word 0xcbcae775 -//.word 0x8cb4e874 -//.word 0xc4aa651f -//.word 0xa1ba8706 -//.word 0x44092ca3 -//.word 0x0e0c4432 -//.word 0x1afb7ac3 -//.word 0x0a83188d -//.word 0x07bc2485 -//.word 0x035acf2f -//.word 0x412711b4 -//.word 0x18b18d36 -//.word 0xf43fba60 -//.word 0x9d0a4441 -//.word 0xbcaab05a -//.word 0x9bcf40f5 -//.word 0x2c3116b9 -//.word 0x4dca9b7c -//.word 0x4a422258 -//.word 0xa3abc901 -//.word 0x106ea055 -//.word 0xc3850e35 -//.word 0xedeb7094 -//.word 0x835102cd -//.word 0x4213033a -//.word 0xf16a1402 -//.word 0xe6e3e232 -//.word 0xcb100410 -//.word 0xa27d27ac -//.word 0x07e568b7 -//.word 0xb5a60198 -//.word 0x4c7328bd -//.word 0x5249342f -//.word 0x77a4026a -//.word 0x1df2976b -//.word 0x1748060a -//.word 0xb154948a -//.word 0xf1931b6f -//.word 0x1dc3ac8f -//.word 0x7d9c786c -//.word 0x62bbf1c1 -//.word 0x68df2c5b -//.word 0xf7578a2a -//.word 0x10bb9798 -//.word 0x46db3219 -//.word 0x0af5ef04 -//.word 0x2c2bb9a1 -//.word 0x9f33bc83 -//.word 0x7d518218 -//.word 0x4a825b7e -//.word 0x7dfa0398 -//.word 0x3cd17f62 -//.word 0x68fa4881 -//.word 0xd974ab1f -//.word 0xebc470f5 -//.word 0x39a2baa9 -//.word 0xa8f32e5b -//.word 0xa8f7577b -//.word 0xb6c449dd -//.word 0x25f3850f -//.word 0x1f991dea -//.word 0xe7791967 -//.word 0x607718b4 -//.word 0xd3503b87 -//.word 0xed893eb3 -//.word 0x07a5e8f9 -//.word 0xab9ba620 -//.word 0x53877347 -//.word 0x73a0fa7b -//.word 0xba6aff85 -//.word 0x952dfb05 -//.word 0xf6a506c5 -//.word 0x53fbfa47 -//.word 0xf1f4d6a0 -//.word 0x62696089 -//.word 0x4df70fb4 -//.word 0x6df7275c -//.word 0xdcb02620 -//.word 0x92cc5f11 -//.word 0x2809e50a -//.word 0xe231aa40 -//.word 0xed4ce819 -//.word 0xe514c042 -//.word 0x9ba922fc -//.word 0x1486ecb6 -//.word 0xd5b456e1 -//.word 0x5d3d8d00 -//.word 0xf4e49efe -//.word 0xa31396c5 -//.word 0x8415e70c -//.word 0x3c850e70 -//.word 0xc50773c7 -//.word 0x713691b1 -//.word 0x2bdd566f -//.word 0x0069cdf9 -//.word 0xdf9efa4a -//.word 0x9d8a06ff -//.word 0x3cb79c20 -//.word 0x6da5923e -//.word 0x5377ccbe -//.word 0x8aed5d74 -//.word 0x6892f074 -//.word 0x83376724 -//.word 0x739fc196 -//.word 0xd97c4115 -//.word 0xa09accfe -//.word 0x825b94d2 -//.word 0xce63f388 -//.word 0x69949928 -//.word 0x133dea95 -//.word 0xec8ea2aa -//.word 0x3750bb89 -//.word 0x5dd39030 -//.word 0x3527424e -//.word 0x828e5b54 -//.word 0xbe32b1ce -//.word 0x16148ef4 -//.word 0xb5450d7c -//.word 0x4558c7b3 -//.word 0xb317afcc -//.word 0x33753b78 -//.word 0x85c4c5b7 -//.word 0x762830ed -//.word 0xa94cce38 -//.word 0x97538101 -//.word 0xd51221d1 -//.word 0x967c1e66 -//.word 0x705d6707 -//.word 0x634c8a14 -//.word 0x17da1ce1 -//.word 0x65105bc4 -//.word 0x1919126d -//.word 0xf63bbd76 -//.word 0xfb0cee3b -//.word 0xe5e2efec -//.word 0xf58ba9e1 -//.word 0xf33ec42d -//.word 0x73d21075 -//.word 0x572e2403 -//.word 0x95014516 -//.word 0x3bb3897c -//.word 0xb09b3b63 -//.word 0x3c72826d -//.word 0xca073e02 -//.word 0xed3533ea -//.word 0x2212691b -//.word 0x556ad2cf -//.word 0xa66c2eda -//.word 0x6ca22c3b -//.word 0x7a27d2f1 -//.word 0xa2141e10 -//.word 0x783bee13 -//.word 0x58181d74 -//.word 0xab04ef7a -//.word 0x65acaf53 -//.word 0xd2c29662 -//.word 0x93f2efda -//.word 0xe418798c -//.word 0x20b00dfd -//.word 0x868d80bc -//.word 0x3dcfcbf2 -//.word 0x960f693b -//.word 0x92dc01b4 -//.word 0xa46b4556 -//.word 0xb78a1a82 -//.word 0x73d6f9dc -//.word 0xbc2e955d -//.word 0x7c67bea4 -//.word 0xa341858d -//.word 0x6c9aa105 -//.word 0xe1e2111d -//.word 0xa1cf035d -//.word 0xe152f55a -//.word 0xb1c91a8a -//.word 0x8076ff58 -//.word 0xe3306e74 -//.word 0x9258936d -//.word 0xb30f5d81 -//.word 0x5ca627b4 -//.word 0x5356981f -//.word 0x1832c78b -//.word 0x2559a33e -//.word 0x74709315 -//.word 0x425059d3 -//.word 0x13fb3cb9 -//.word 0xf6d56657 -//.word 0x0a118ba1 -//.word 0x4169cb45 -//.word 0x6412da3c -//.word 0x57ef5e9f -//.word 0x9f0598bd -//.word 0x212f476a -//.word 0x2c12c99a -//.word 0xba54842e -//.word 0xf309840d -//.word 0xf36e6577 -//.word 0xcdda7496 -//.word 0xd0f11156 -//.word 0x091b5877 -//.word 0x083500e1 -//.word 0xe7868237 -//.word 0x89f47eae -//.word 0x20775b20 -//.word 0xf2cf2f5c -//.word 0x5c72dec1 -//.word 0x17c9850b -//.word 0xba9b196c -//.word 0x80ca4bdf -//.word 0x4c3dafb9 -//.word 0xea1d1e80 -//.word 0x98445901 -//.word 0xc5f2ee9d -//.word 0x18c260e4 -//.word 0xb4dd8265 -//.word 0xbb6e24c3 -//.word 0x1056f10c -//.word 0x62209847 -//.word 0x66372a4c -//.word 0x6356c3d9 -//.word 0xf4416de1 -//.word 0x0ab34127 -//.word 0x3097d00c -//.word 0x137ac1a5 -//.word 0x4141bb11 -//.word 0x3117850a -//.word 0x84aa6bb9 -//.word 0x8a97e4cf -//.word 0x082273d1 -//.word 0x382bcbb3 -//.word 0x125e36a9 -//.word 0xcaa9373a -//.word 0x9af36e96 -//.word 0xc10bbd29 -//.word 0xccdea970 -//.word 0x14ee030c -//.word 0x88ffc715 -//.word 0xac1344b0 -//.word 0xe2997de4 -//.word 0xe9e2d0a9 -//.word 0xa3d4d542 -//.word 0x1be289cd -//.word 0xc63cac19 -//.word 0x094267b7 -//.word 0xfc3f3254 -//.word 0x6e54f546 -//.word 0x29b26d64 -//.word 0x760cd21b -//.word 0xe44db7be -//.word 0x4686311e -//.word 0xfb2a3b5b -//.word 0x727d59f9 -//.word 0xec4a7c36 -//.word 0x84d4269b -//.word 0x6d10ced2 -//.word 0x7c1186b7 -//.word 0xe6c4dbb1 -//.word 0x4addfd43 -//.word 0xf21120de -//.word 0x568621fa -//.word 0xe1886d65 -//.word 0xf87d1fda -//.word 0x391b68d5 -//.word 0x00d834a6 -//.word 0x30a20ac4 -//.word 0x30d13465 -//.word 0x335a214b -//.word 0xbd4507e1 -//.word 0x6361cc86 -//.word 0xd2362729 -//.word 0x123b0316 -//.word 0x0c49240f -//.word 0x4a500c9f -//.word 0xff4920ab -//.word 0x476b074a -//.word 0xafa253d7 -//.word 0xf83d6344 -//.word 0x18e687b0 -//.word 0x82d8663c -//.word 0xa74c9d1b -//.word 0xbd34a9e9 -//.word 0xbf2c073e -//.word 0xb5ae9982 -//.word 0x35854c03 -//.word 0x2a84f844 -//.word 0xd4778899 -//.word 0x105a5af0 -//.word 0xdac9e9f2 -//.word 0x10b8a94b -//.word 0x78643245 -//.word 0x0589a19c -//.word 0x56d63b8e -//.word 0x809e5431 -//.word 0x0dd07009 -//.word 0x4529a7da -//.word 0xaca84ebb -//.word 0xcb43d36c -//.word 0x33d8e9e9 -//.word 0xc066e53f -//.word 0x1b7d689f -//.word 0x82f33fb1 -//.word 0xccd9872a -//.word 0xa7ad15a1 -//.word 0x25d1159f -//.word 0x773cf0f5 -//.word 0xf8707452 -//.word 0x6dac2f14 -//.word 0x8a621b5f -//.word 0xb9eb816c -//.word 0x187a1724 -//.word 0xc04f6bee -//.word 0x4d2d85c5 -//.word 0x9b0dc88d -//.word 0xcd141aa7 -//.word 0x94c345c3 -//.word 0xae6e9cf5 -//.word 0xacefe10c -//.word 0xf99b661f -//.word 0x18757368 -//.word 0x2da2e855 -//.word 0xbf1d23dd -//.word 0xbcac2411 -//.word 0xbd13eff3 -//.word 0x8c87328a -//.word 0xe4652836 -//.word 0x7724bd42 -//.word 0x3589f3b8 -//.word 0xcc198479 -//.word 0x6bd4c98c -//.word 0xcc20dab7 -//.word 0x7104f74c -//.word 0x2e962746 -//.word 0xe7b71e94 -//.word 0x9bfd64b5 -//.word 0xa1f1b485 -//.word 0x327ba357 -//.word 0x289a8243 -//.word 0x055884c2 -//.word 0x37fe2478 -//.word 0x9b84c150 -//.word 0x3f4b8bce -//.word 0x6c0fa3a1 -//.word 0xe4177e78 -//.word 0x68ae8b17 -//.word 0x7dd715aa -//.word 0x703d6a59 -//.word 0x98693d1c -//.word 0xdb3749d1 -//.word 0x738b378c -//.word 0xf240c22e -//.word 0x84611939 -//.word 0x759c84e2 -//.word 0xf3f34b68 -//.word 0x14b5d4a5 -//.word 0x1bad0be3 -//.word 0xf79906f0 -//.word 0x0cdeea75 -//.word 0x36790883 -//.word 0x0b394c6f -//.word 0x612bd8e0 -//.word 0x1156ec26 -//.word 0xfaa909cd -//.word 0x48325672 -//.word 0xf69142d6 -//.word 0x91ab6b31 -//.word 0x3fa3bfc9 -//.word 0x0106e0c2 -//.word 0x3545cd38 -//.word 0x5f69c08b -//.word 0x280252fa -//.word 0xa760e574 -//.word 0xe00643aa -//.word 0x8a5c8369 -//.word 0x16a42d27 -//.word 0xec2f9edc -//.word 0xf8d1ad13 -//.word 0x65928e40 -//.word 0xa8a6f754 -//.word 0xc1a0828f -//.word 0xbde25395 -//.word 0x8058fac5 -//.word 0xc1669ac6 -//.word 0x561e4b62 -//.word 0xb2b7be98 -//.word 0xac3a20ec -//.word 0x827f4002 -//.word 0x1d58f36b -//.word 0x960cb8bf -//.word 0xfa0798ec -//.word 0x4acf50cd -//.word 0xc63ab2ff -//.word 0x6bdf49f0 -//.word 0xbbca3c38 -//.word 0xbc74742d -//.word 0x43f201b1 -//.word 0x726cba4f -//.word 0x80d12487 -//.word 0xb8c99665 -//.word 0xc5eb9a59 -//.word 0x2c319542 -//.word 0x1aa8abcc -//.word 0x606cddfc -//.word 0xbcd47409 -//.word 0x5aeaa36e -//.word 0x9a1e683d -//.word 0x143bb3b6 -//.word 0xda99ca18 -//.word 0xfc95ecb7 -//.word 0x523e344f -//.word 0x7551c198 -//.word 0x0f68141a -//.word 0x556eb943 -//.word 0xd1562ab7 -//.word 0x650cf0e7 -//.word 0x8dac0be5 -//.word 0xe4f39477 -//.word 0xeaf3a16a -//.word 0x040a6928 -//.word 0xc414a98d -//.word 0x6be046f7 -//.word 0xace1339c -//.word 0xb3269521 -//.word 0x668c2568 -//.word 0xeb33d6a9 -//.word 0x6a2eb9c4 -//.word 0x147f1dd5 -//.word 0x6442fa09 -//.word 0xa42890b1 -//.word 0xb4274b95 -//.word 0x0770ea8b -//.word 0xeea2e048 -//.word 0x193dfa75 -//.word 0x5a594306 -//.word 0xad9825c7 -//.word 0x7659d037 -//.word 0x092ee09a -//.word 0x6f91394a -//.word 0x68d2364e -//.word 0xac54042d -//.word 0x76f94804 -//.word 0x43db08d7 -//.word 0xd73dc825 -//.word 0x82c1f3bf -//.word 0xa1db7dda -//.word 0x6785c762 -//.word 0xde34c391 -//.word 0x280b58c1 -//.word 0x0b4f087e -//.word 0xad1cd0e0 -//.word 0x9b564f17 -//.word 0x10e12b48 -//.word 0x7515b198 -//.word 0x246cbb86 -//.word 0x717ed77d -//.word 0xeb30a5a9 -//.word 0xdf28810b -//.word 0x1e8462c8 -//.word 0x00cb02c7 -//.word 0xa923407a -//.word 0x8bc5c2fc -//.word 0x2cafde5d -//.word 0x2a98bb3a -//.word 0x7c29b390 -//.word 0xfa6afcd1 -//.word 0x207b8838 -//.word 0x0f84295a -//.word 0xd4eef9ff -//.word 0xedd4f92f -//.word 0x09b4f890 -//.word 0x106bb7ef -//.word 0x63604a1c -//.word 0x65ffc1fb -//.word 0x3a6908d8 -//.word 0xcf690cfb -//.word 0x1aab1f7c -//.word 0xa3289e59 -//.word 0x43e5d1c6 -//.word 0x2bdd12c4 -//.word 0x293b32f5 -//.word 0x27cd18af -//.word 0xf5b6ab4f -//.word 0x4863f3d0 -//.word 0x02c07a9c -//.word 0xb3abf9a1 -//.word 0x60a930a8 -//.word 0x84d716e2 -//.word 0x552432c4 -//.word 0x48be4915 -//.word 0xd7ca3946 -//.word 0x82582501 -//.word 0x1496d204 -//.word 0x27435130 -//.word 0xea67dfdd -//.word 0x22420971 -//.word 0x6f821431 -//.word 0xd1b99b57 -//.word 0x6a0d7a64 -//.word 0x8632ebb7 -//.word 0xd895ef5f -//.word 0x06daf02e -//.word 0x6989a40e -//.word 0x0e043498 -//.word 0x00bd9ee3 -//.word 0xc9a5589a -//.word 0x36e83652 -//.word 0x5bd78d1a -//.word 0xd7259953 -//.word 0x59571cc2 -//.word 0x637648e3 -//.word 0x4e07df80 -//.word 0x8f3d9983 -//.word 0x386cc609 -//.word 0xc2c134b7 -//.word 0x09315351 -//.word 0x98af9788 -//.word 0x27a21e14 -//.word 0x62969303 -//.word 0xec315251 -//.word 0xa469ccb8 -//.word 0x27f52dc9 -//.word 0x96013d3c -//.word 0x99268485 -//.word 0xa399b2a8 -//.word 0x78a33e4d -//.word 0xed514c17 -//.word 0xef6cd432 -//.word 0xc7ab012b -//.word 0x9c28d705 -//.word 0x3a111989 -//.word 0x12a06add -//.word 0x814db258 -//.word 0x5542c395 -//.word 0x8d0f3dc6 -//.word 0x609fae4b -//.word 0x816afe84 -//.word 0xa2ed0be3 -//.word 0x37579045 -//.word 0x7c864b82 -//.word 0xb9315f42 -//.word 0xc467f713 -//.word 0xc8382cb9 -//.word 0x46b229c5 -//.word 0x590f8c6a -//.word 0x3e2c108b -//.word 0x133d6918 -//.word 0xdfc0709b -//.word 0xd3af800e -//.word 0xd0fa20f0 -//.word 0x2934e298 -//.word 0xa98c8bc8 -//.word 0xd8007385 -//.word 0x7acd2f26 -//.word 0x592a6eac -//.word 0x44352151 -//.word 0x582edf64 -//.word 0x7ee38753 -//.word 0x356b270a -//.word 0x92171c7b -//.word 0x84a67b7e -//.word 0x5db8b0dc -//.word 0x8e8665a6 -//.word 0xb2cfa6cc -//.word 0xcf1642ea -//.word 0xd80a7465 -//.word 0x7646c2b7 -//.word 0x073a2607 -//.word 0xe8696cfd -//.word 0xefd6dbd4 -//.word 0x3cb817b1 -//.word 0x32754633 -//.word 0xc0ce724b -//.word 0xe5572e4e -//.word 0x732b7d48 -//.word 0x13ddef94 -//.word 0x89b20da9 -//.word 0x390df737 -//.word 0xea2a4c73 -//.word 0xcb0f4aae -//.word 0xb3c0372d -//.word 0xadb3ff35 -//.word 0xb4831e65 -//.word 0xbbe8c049 -//.word 0xf1e7272b -//.word 0x42464e2c -//.word 0x2143cc94 -//.word 0x8586fa67 -//.word 0x31535839 -//.word 0x39042d42 -//.word 0xc2b76eb5 -//.word 0x0944e14e -//.word 0xa772822a -//.word 0x136a26dc -//.word 0x686b5ebd -//.word 0x68c09e83 -//.word 0xc1ef9f16 -//.word 0x9034019f -//.word 0x242d35e1 -//.word 0x04d79acc -//.word 0x33b9e64f -//.word 0xb25fc86f -//.word 0x470acc96 -//.word 0x7da67e2d -//.word 0xecfcd26c -//.word 0xba29c371 -//.word 0x624f3b90 -//.word 0xb48a33eb -//.word 0x1e261b42 -//.word 0x290f7c0c -//.word 0x4688dcc6 -//.word 0xcb20e28b -//.word 0x39e2bae5 -//.word 0xc0cdbbe3 -//.word 0x0584476b -//.word 0x2246f3d2 -//.word 0xee1fe8aa -//.word 0x80608adb -//.word 0xee4e57f6 -//.word 0x5a1711c5 -//.word 0x300a1f27 -//.word 0xa906311a -//.word 0x9433231a -//.word 0x55f124aa -//.word 0x2e0e1730 -//.word 0xbd3c3905 -//.word 0xc6c204cd -//.word 0x33715404 -//.word 0x59dac9da -//.word 0x7dbe6c41 -//.word 0x97c69544 -//.word 0x55740c9a -//.word 0x635a6e7b -//.word 0xea8ad2b2 -//.word 0x574dadf4 -//.word 0x5d18f370 -//.word 0x3dbb7fa7 -//.word 0x45dcb57e -//.word 0x96a46691 -//.word 0x2bb8f3cb -//.word 0x176bb634 -//.word 0x0e329d09 -//.word 0x27581812 -//.word 0xe0f23630 -//.word 0x63160b36 -//.word 0x084854f9 -//.word 0x1a355eab -//.word 0xdea42364 -//.word 0xd1a9b602 -//.word 0x321be233 -//.word 0xc0490ed0 -//.word 0xc5e9646d -//.word 0x5351332e -//.word 0xceea91dc -//.word 0xaae14437 -//.word 0x761fe38e -//.word 0x1a7c388e -//.word 0x5d2fe958 -//.word 0xaa8957d6 -//.word 0x13e4c74e -//.word 0x96d6c037 -//.word 0x9faab34c -//.word 0xcf10e2e0 -//.word 0xfc137a71 -//.word 0x794c027f -//.word 0x9755f99e -//.word 0x6b81bbcb -//.word 0xd2caa5fc -//.word 0xb30b79fb -//.word 0x84700473 -//.word 0x102afe4b -//.word 0x77673134 -//.word 0x7681de7e -//.word 0xe8755c30 -//.word 0x8d980257 -//.word 0x0b85479e -//.word 0x325a281f -//.word 0x8424ca79 -//.word 0xf5976123 -//.word 0xef035000 -//.word 0x99839233 -//.word 0x59785834 -//.word 0x9835f323 -//.word 0xc5fcf55d -//.word 0x9c2a934e -//.word 0xa8ae4e86 -//.word 0x06bfd30e -//.word 0x6dcf1ffc -//.word 0x6bbae645 -//.word 0xf14436d3 -//.word 0x12c258d7 -//.word 0x0817f761 -//.word 0x78e2832e -//.word 0xf7f6d8c0 -//.word 0xcc0b1bb4 -//.word 0xf7b3e551 -//.word 0x738fa45d -//.word 0xb9c23e34 -//.word 0x85a6f71b -//.word 0xdcbe94d1 -//.word 0x4eecc067 -//.word 0x79e4b052 -//.word 0xcee103bf -//.word 0x9897ec26 -//.word 0x39689222 -//.word 0xb7dab780 -//.word 0x78499895 -//.word 0x4ad915d5 -//.word 0xa7af12a2 -//.word 0x36611d62 -//.word 0x94aa51d4 -//.word 0x55637aa4 -//.word 0x46ae7a3d -//.word 0xf575ebde -//.word 0x741305f0 -//.word 0x5950c297 -//.word 0x09934187 -//.word 0x37536819 -//.word 0xa7cfce9d -//.word 0x38ffd8f2 -//.word 0x21ca2255 -//.word 0x7b792077 -//.word 0x006c05d2 -//.word 0x120be33c -//.word 0xff0014bd -//.word 0x83a4da9e -//.word 0x8eb642c2 -//.word 0x48534e3a -//.word 0x52225213 -//.word 0x4fd09f72 -//.word 0xa4bc5fe4 -//.word 0x7bf3c0ef -//.word 0x0e5e55ed -//.word 0x223ab91a -//.word 0xd1c975eb -//.word 0x8d4723a1 -//.word 0x6220d41f -//.word 0x7b60b0f8 -//.word 0xe86bdccd -//.word 0x9feea1d6 -//.word 0xc015cabe -//.word 0x1dff4db4 -//.word 0xf96f2ebf -//.word 0x10c4a151 -//.word 0xd82b6f20 -//.word 0x07139a31 -//.word 0x55e14435 -//.word 0x83e5cd19 -//.word 0x9c8d3cd9 -//.word 0x7bd9e095 -//.word 0x8d0f37e6 -//.word 0xd8b00e72 -//.word 0x3caaeabe -//.word 0xf9cfa744 -//.word 0x72865fc6 -//.word 0x31c18de1 -//.word 0x2a2f72e5 -//.word 0x44b2b8e4 -//.word 0x15135609 -//.word 0xedf5b32b -//.word 0x17070ea2 -//.word 0x5b7e1d5a -//.word 0xc7c3f426 -//.word 0xb0682956 -//.word 0xf361368b -//.word 0x80711eca -//.word 0x1ae254d0 -//.word 0x5879d8a5 -//.word 0xf0a9a374 -//.word 0x3407459a -//.word 0xddfecdfd -//.word 0x08c4e99f -//.word 0x7e8c4e73 -//.word 0x38fe5a6f -//.word 0x23e4f8e2 -//.word 0x2026c508 -//.word 0x4ff871db -//.word 0x8d52672d -//.word 0x3ba0b0f4 -//.word 0x42bc14e5 -//.word 0x53198344 -//.word 0x7441b4fa -//.word 0xb8810ce8 -//.word 0x4de2c17b -//.word 0xbc5c3f80 -//.word 0x6d47cb3a -//.word 0x6a1266b2 -//.word 0x6437f44f -//.word 0xfb6e9da6 -//.word 0x3a227493 -//.word 0x61215689 -//.word 0xe8971526 -//.word 0xc03dd60b -//.word 0xdcceb8ea -//.word 0xf0bbb7e0 -//.word 0x791fcf06 -//.word 0xfdf56443 -//.word 0x9489e164 -//.word 0xa72ca06e -//.word 0xf82c0a32 -//.word 0xe203ff23 -//.word 0xe3cf7865 -//.word 0x57026a26 -//.word 0x865bee31 -//.word 0xe115a0c0 -//.word 0x895e4492 -//.word 0x110ab03e -//.word 0x8589e6c7 -//.word 0xab168070 -//.word 0x883251d2 -//.word 0x2651492b -//.word 0x95d399f9 -//.word 0x303518c8 -//.word 0x2189e548 -//.word 0x28234ea2 -//.word 0x9896f10c -//.word 0xa2df219c -//.word 0xd5df8c59 -//.word 0xe60f1a98 -//.word 0xad6f1886 -//.word 0x71bf9501 -//.word 0x65f20cac -//.word 0x72e04442 -//.word 0x373b752a -//.word 0x4fc4ac4c -//.word 0xd2be7024 -//.word 0x1ea3a614 -//.word 0xd717b2ff -//.word 0x2c1adf13 -//.word 0x5c8101e6 -//.word 0x79a759c5 -//.word 0x6d60b849 -//.word 0x3a2ee72a -//.word 0x86b84758 -//.word 0x5677b548 -//.word 0x1ab3b08c -//.word 0xeaaebea7 -//.word 0x0f1f0b1f -//.word 0xc5e154d4 -//.word 0x3fed038f -//.word 0xec869cde -//.word 0xf9b35720 -//.word 0x17f20fdc -//.word 0x7e2b5a57 -//.word 0x31e3fa65 -//.word 0x84b2747f -//.word 0xdcf7fe16 -//.word 0xb7ca9e27 -//.word 0xec329110 -//.word 0x3398eaa2 -//.word 0xe77c7b77 -//.word 0x0b67f885 -//.word 0x8c215af4 -//.word 0xc523822d -//.word 0x484f1f34 -//.word 0xdcdfd137 -//.word 0xc29c8f67 -//.word 0x3d504606 -//.word 0x517dc2c1 -//.word 0xca4fd241 -//.word 0x80d0a7fd -//.word 0xda5b7e52 -//.word 0x91537fd5 -//.word 0xb614e4e8 -//.word 0xf72a5d8b -//.word 0x1ec2b375 -//.word 0xda5dac64 -//.word 0xc2cc30b1 -//.word 0x9758a927 -//.word 0xc941b015 -//.word 0x3d6ae5a2 -//.word 0x4e521e61 -//.word 0x1246c525 -//.word 0xded57b17 -//.word 0x0c850105 -//.word 0xfbc459fd -//.word 0x5821281b -//.word 0x9cbc5f9f -//.word 0xd6fb1a42 -//.word 0xab7fc9cb -//.word 0x9b578ddd -//.word 0x8673e513 -//.word 0x6e5b894f -//.word 0x7e21964e -//.word 0x4b93ec80 -//.word 0x5bb6d417 -//.word 0xe470e75e -//.word 0xd5852b4d -//.word 0x1ac57e5a -//.word 0x1c833891 -//.word 0x88480ce7 -//.word 0x52c92fcc -//.word 0xf917bcff -//.word 0x0c1658a6 -//.word 0xed30129e -//.word 0xd54a8c10 -//.word 0x18f76045 -//.word 0xabecbdbb -//.word 0xe3b55178 -//.word 0x7fa66c9e -//.word 0xe9136240 -//.word 0xb9c43174 -//.word 0x7ba363a9 -//.word 0xb2b8363b -//.word 0x1d57fb45 -//.word 0x3898bcb7 -//.word 0x060821a8 -//.word 0x0e9e94ed -//.word 0xa3f1a4ea -//.word 0x69a7a7a8 -//.word 0x1531a428 -//.word 0x74b670f7 -//.word 0xaf4c1603 -//.word 0xcd6e7cad -//.word 0x79ab441f -//.word 0x069bf1e0 -//.word 0xb0174ba5 -//.word 0x25a9046b -//.word 0x44429bc2 -//.word 0x242b816c -//.word 0x583e7b26 -//.word 0x715647c6 -//.word 0xc5048286 -//.word 0x6f84c9a0 -//.word 0x97ef1f1b -//.word 0xf4b18ee4 -//.word 0x8e3e1120 -//.word 0xc901b2c1 -//.word 0x9f95f057 -//.word 0x2d386329 -//.word 0x717da385 -//.word 0x52416554 -//.word 0xe0dfe7f1 -//.word 0xdea88f3c -//.word 0x7e8dcfea -//.word 0x6b1f4b1f -//.word 0x0cba3e3e -//.word 0x08fc1900 -//.word 0x057c6ec3 -//.word 0xb6b90d25 -//.word 0x14516dd2 -//.word 0xeb744d9a -//.word 0x99979ac7 -//.word 0x126d94ad -//.word 0x28132d82 -//.word 0x0a8bb170 -//.word 0x0a6bace9 -//.word 0xa3d6093b -//.word 0xbaac7764 -//.word 0x24fe1127 -//.word 0x69c53d5f -//.word 0xc7d3d494 -//.word 0x7a0984cc -//.word 0x3bcb73a3 -//.word 0x07b1259e -//.word 0x217fa0bd -//.word 0x5a58ce4f -//.word 0x902e220a -//.word 0x757d7e5b -//.word 0x913955fb -//.word 0x8b050dc3 -//.word 0xa4a5a7c1 -//.word 0x84b6a18b -//.word 0x399c1bd3 -//.word 0x7dbd3a3c -//.word 0x37edca6c -//.word 0x45282763 -//.word 0x79875d0b -//.word 0xe16d8e10 -//.word 0x4c0194f1 -//.word 0x09e2e858 -//.word 0xf216c2a7 -//.word 0xaa4382d3 -//.word 0x22214f75 -//.word 0x622ffe1e -//.word 0x86a535eb -//.word 0x06aad05a -//.word 0x3bc8835c -//.word 0x1f9dc1ac -//.word 0x55d3dd5e -//.word 0x695270bb -//.word 0x58b3fa4c -//.word 0x53f8cc35 -//.word 0xc07b25c5 -//.word 0x82259b4a -//.word 0x7ae0bc2a -//.word 0x4d4ff62f -//.word 0x68bcb423 -//.word 0x4252ca9d -//.word 0xe18c131a -//.word 0xa0ed584f -//.word 0x2ff274be -//.word 0xdb45b688 -//.word 0x10338782 -//.word 0x1c604d8a -//.word 0x35b98f1c -//.word 0xbeab5920 -//.word 0xc692e206 -//.word 0xd2756c15 -//.word 0xdcf06c00 -//.word 0x9b71ebbb -//.word 0x05a82c8c -//.word 0x13388f65 -//.word 0xc4b3b571 -//.word 0x64c5e5ed -//.word 0x0eafae39 -//.word 0x70f7ce2f -//.word 0xce5e53b3 -//.word 0x4913008b -//.word 0x6226f272 -//.word 0xba3f8467 -//.word 0x1b906f4b -//.word 0xbc0836ab -//.word 0xc1cac1db -//.word 0x02dd4744 -//.word 0x0d2572fe -//.word 0x6e92bea2 -//.word 0x2e972359 -//.word 0x99def339 -//.word 0x443a05d2 -//.word 0x4fdd1303 -//.word 0xe8cb6113 -//.word 0x108e9ffc -//.word 0xa22b110a -//.word 0x9156eda5 -//.word 0x71e2056b -//.word 0x397ba583 -//.word 0x4797bf2d -//.word 0xa4aa459d -//.word 0x8a99d709 -//.word 0x23729e01 -//.word 0x945a78ff -//.word 0x3ac7553f -//.word 0x33efe1d0 -//.word 0x218063ec -//.word 0x2a91e485 -//.word 0x44d89520 -//.word 0xaf1e6be6 -//.word 0xc2f10cf8 -//.word 0xeb99ee04 -//.word 0xf24dbd16 -//.word 0x7da6feb0 -//.word 0xd953f31c -//.word 0xf70fbe01 -//.word 0xb5d0c835 -//.word 0x5f4164d2 -//.word 0x7673b08c -//.word 0xb0cfbc41 -//.word 0x3f50efd2 -//.word 0x56efa632 -//.word 0xea5e1dbc -//.word 0xb6f893ca -//.word 0x81f9a983 -//.word 0xa3ea0cf4 -//.word 0xc6605363 -//.word 0xeae62bdf -//.word 0xac38b11c -//.word 0xc7b21f7e -//.word 0xdb07ab74 -//.word 0x6d36ac07 -//.word 0x2fbaffb3 -//.word 0x8201a975 -//.word 0x3a20bd25 -//.word 0xa1c58106 -//.word 0xbe6dcc9c -//.word 0xd7d7b2bd -//.word 0x34b863eb -//.word 0x26b051e1 -//.word 0x487d916c -//.word 0x056f847c -//.word 0x5a1bb67b -//.word 0xdd5406dd -//.word 0xff5708f9 -//.word 0x8e46a717 -//.word 0x7ed80fca -//.word 0xe84eca80 -//.word 0x53a92857 -//.word 0x331ae532 -//.word 0xafba060d -//.word 0xa77b048d -//.word 0xf65e2cdb -//.word 0xf4e746b3 -//.word 0x3fcf75b8 -//.word 0xbcf85e0b -//.word 0xd8a68c1b -//.word 0x14eb13bf -//.word 0xc0637482 -//.word 0x0622c13d -//.word 0x2beb02ec -//.word 0x12a2d6ba -//.word 0x02045e5e -//.word 0xa89656aa -//.word 0x60db8561 -//.word 0xb0ca584a -//.word 0x157fca82 -//.word 0x03318616 -//.word 0x276450d1 -//.word 0xef60a153 -//.word 0x4ce19163 -//.word 0xb710fa87 -//.word 0x72b2dbd1 -//.word 0x10a0fafb -//.word 0x3777ceb7 -//.word 0xa5909b40 -//.word 0x7133df35 -//.word 0x9307eda7 -//.word 0xa7cdd871 -//.word 0xee4e92c7 -//.word 0x96925512 -//.word 0x3b5342fb -//.word 0xadb149c6 -//.word 0xf42848e2 -//.word 0x91be77be -//.word 0x078103de -//.word 0x9a30f92d -//.word 0x57396695 -//.word 0x54e3bdcd -//.word 0x39cd7872 -//.word 0xff97025a -//.word 0xf8dfd525 -//.word 0x106fdf14 -//.word 0x52b42b1f -//.word 0xae73bd41 -//.word 0xf9b7be17 -//.word 0x350ed9a9 -//.word 0x13f4e488 -//.word 0xb690c319 -//.word 0xba9e8930 -//.word 0x75ade1e0 -//.word 0x7c8aad92 -//.word 0x69fcec55 -//.word 0xdcb1e175 -//.word 0xc079724f -//.word 0xd0b2ce63 -//.word 0x590352ab -//.word 0x414eae2c -//.word 0x48df43ca -//.word 0x8eead060 -//.word 0x56344e10 -//.word 0x091018d8 -//.word 0x7e8d4f66 -//.word 0x78ee7d2e -//.word 0x705a78b9 -//.word 0x95d58a40 -//.word 0x126fce79 -//.word 0x8fbbddb1 -//.word 0xfa83aa1b -//.word 0x87baab68 -//.word 0xf5b23a97 -//.word 0x14903a0f -//.word 0x84fcfdeb -//.word 0xbf1d6595 -//.word 0x59c44a96 -//.word 0x87e71cac -//.word 0xdf52ca1d -//.word 0x5e99e24c -//.word 0xaf51f98a -//.word 0xaa7f4d2e -//.word 0x1c51a9e8 -//.word 0xc60c8952 -//.word 0xa8467fc8 -//.word 0x7f55d57a -//.word 0x8c0774bf -//.word 0x979404ad -//.word 0x34d055e6 -//.word 0x45a5feb4 -//.word 0xc0c14459 -//.word 0xb28c3da0 -//.word 0x845d35b8 -//.word 0x7ded5042 -//.word 0x890c71a9 -//.word 0x39925bb2 -//.word 0x0a991654 -//.word 0xeae995c9 -//.word 0xf8b495e5 -//.word 0x8c84c8a7 -//.word 0x7771330e -//.word 0x8c97d42d -//.word 0x5fc78982 -//.word 0x4c7d2d84 -//.word 0xbb12047b -//.word 0xa3335994 -//.word 0x4d926535 -//.word 0x5bdb738e -//.word 0x08ea4271 -//.word 0xb13bab63 -//.word 0x95a283f3 -//.word 0xd93cc34a -//.word 0xcfa5e604 -//.word 0x776b933e -//.word 0x46c37cf0 -//.word 0x277b867e -//.word 0xc0302a89 -//.word 0xf6c11b0b -//.word 0xb30329a3 -//.word 0xe6b7652d -//.word 0xccb98696 -//.word 0x6f7a8bee -//.word 0x6cafa2bf -//.word 0xf84b499e -//.word 0x25abb3ff -//.word 0x62116d4e -//.word 0x4154413b -//.word 0x7ed65b55 -//.word 0x3cb5aada -//.word 0x914689cd -//.word 0x45bf9f4a -//.word 0xd7330317 -//.word 0xc1c4a47b -//.word 0xfd14e953 -//.word 0xc8fc9462 -//.word 0xa681ece9 -//.word 0xa6031b77 -//.word 0xe7b8d503 -//.word 0x5b593a38 -//.word 0xcb1bfe10 -//.word 0x1ce1c7a4 -//.word 0xd0b0d643 -//.word 0xd063eac1 -//.word 0x68a06111 -//.word 0x930aa116 -//.word 0x79b8b6b7 -//.word 0x36e73c32 -//.word 0xddeb80b2 -//.word 0xbc6ce223 -//.word 0xe2ce7e45 -//.word 0xdff10bff -//.word 0xcb1b02f7 -//.word 0x8a32035f -//.word 0x4d2f7612 -//.word 0x5ccf6edf -//.word 0x148bd224 -//.word 0x2bcbbe9f -//.word 0x3c572782 -//.word 0x7f0ebec5 -//.word 0xd7da17c0 -//.word 0x13e30bf9 -//.word 0x6d035b3b -//.word 0x577b95e8 -//.word 0x78e43c8f -//.word 0xf16823c1 -//.word 0xe4311a21 -//.word 0x3722ccbb -//.word 0x95c5e897 -//.word 0xb6857f8d -//.word 0xe11eae5a -//.word 0xaf517cf4 -//.word 0x11dc051b -//.word 0x94a9d931 -//.word 0xe4469f4b -//.word 0x8f95fe88 -//.word 0x0cc5bda2 -//.word 0xfc8028c2 -//.word 0xaf66b699 -//.word 0xeabbeaac -//.word 0xe85c77ef -//.word 0x9ef8a796 -//.word 0x447cfd28 -//.word 0x10cf1ad5 -//.word 0x45c0dd09 -//.word 0x6c3dce41 -//.word 0xe1c5bd1e -//.word 0x921fa6b7 -//.word 0x044dd834 -//.word 0x97bc5699 -//.word 0x0abd7edf -//.word 0x4139e849 -//.word 0x469f91f5 -//.word 0x8f2239b2 -//.word 0x7f220911 -//.word 0x2ee779bf -//.word 0x6d957111 -//.word 0x055caee1 -//.word 0x40f06899 -//.word 0xab39328d -//.word 0x194b218e -//.word 0xeb9830bb -//.word 0x8f64e39b -//.word 0x477a2b69 -//.word 0x2c1e8aaf -//.word 0x72427717 -//.word 0xedfd047d -//.word 0xd438be48 -//.word 0xc6abd5fb -//.word 0x0a087d07 -//.word 0x1b7593e4 -//.word 0x6440845f -//.word 0x48ce6b36 -//.word 0x65d579e2 -//.word 0x1acb9ab4 -//.word 0x469f5523 -//.word 0x53a6f465 -//.word 0x74d8e63c -//.word 0x2a3c6113 -//.word 0x0da14c49 -//.word 0xc98f5bcd -//.word 0x677d7ceb -//.word 0xce447265 -//.word 0x89d4bfc6 -//.word 0xca26c8f3 -//.word 0xaf723403 -//.word 0xc5a19550 -//.word 0xcb054ace -//.word 0xb848a49c -//.word 0xffa247d9 -//.word 0x114fd3b9 -//.word 0x2341c4d8 -//.word 0x321297ce -//.word 0x453c2f03 -//.word 0xf38c76c5 -//.word 0x24d44797 -//.word 0x1ce18ccc -//.word 0xb5aca355 -//.word 0xebd407d8 -//.word 0x9e4c2c02 -//.word 0x9451aa1d -//.word 0xbea09ee5 -//.word 0xbce54d97 -//.word 0xa2760b4c -//.word 0xfd415c85 -//.word 0x11045807 -//.word 0x65bc54e9 -//.word 0x825fbeeb -//.word 0xf7cd4909 -//.word 0xa0044a50 -//.word 0x289462f1 -//.word 0xcd545e94 -//.word 0x63525bee -//.word 0x9c102e96 -//.word 0x86ed0314 -//.word 0x55e1433b -//.word 0x636dbcba -//.word 0x75d2fced -//.word 0x4082fdf9 -//.word 0x2cd40817 -//.word 0x57fbd330 -//.word 0xdd39edab -//.word 0x57505b83 -//.word 0xa13a849c -//.word 0xe1194a57 -//.word 0xc4717a64 -//.word 0x0b9566d7 -//.word 0x475fd07e -//.word 0xe0240a72 -//.word 0x5ce75ced -//.word 0xdecda65b -//.word 0xedd146b4 -//.word 0x77b93c08 -//.word 0x16498c5c -//.word 0x91b6e4b4 -//.word 0xa65e7f71 -//.word 0x07b549dd -//.word 0xa2834405 -//.word 0x254d2ac7 -//.word 0xc210542b -//.word 0x3036daf7 -//.word 0xf2c2fc7d -//.word 0xdbcec1b8 -//.word 0xd237dd97 -//.word 0xd397d899 -//.word 0x36736d9a -//.word 0x34b631ed -//.word 0xa75e75aa -//.word 0x11766c49 -//.word 0xe0449170 -//.word 0xf0c3430a -//.word 0x5254b299 -//.word 0x4cb0ffcd -//.word 0xa0219f55 -//.word 0x11f201f5 -//.word 0x242370d9 -//.word 0x24623a29 -//.word 0x683712dd -//.word 0xd97fb3d3 -//.word 0xae1bc61e -//.word 0x7ae906a2 -//.word 0x69f3a2de -//.word 0xc6e7e208 -//.word 0xc1c80e5f -//.word 0x70e28cbd -//.word 0x1303486b -//.word 0x9ce8593a -//.word 0x6ff6e1cf -//.word 0x662b343f -//.word 0x18533ddc -//.word 0x5b7f1e4e -//.word 0x07b317e5 -//.word 0xfddfa92d -//.word 0x6810fbc3 -//.word 0x43e87c68 -//.word 0x1c4cca54 -//.word 0x175cd3cc -//.word 0x35a83af7 -//.word 0xd6a0fcee -//.word 0x7d4d5312 -//.word 0xd43fdaa2 -//.word 0xf0c7f28d -//.word 0xd5666584 -//.word 0x3d844a54 -//.word 0x95652973 -//.word 0x495a5fd8 -//.word 0x4134c310 -//.word 0xacfe898f -//.word 0xfcec6744 -//.word 0x318ef770 -//.word 0x5b495db7 -//.word 0x5a082978 -//.word 0xe92f7f5a -//.word 0xdbd17527 -//.word 0xa322bcde -//.word 0x1a2f8303 -//.word 0x7dcc983a -//.word 0xb5ced014 -//.word 0xdc7baa29 -//.word 0xfc3f2f67 -//.word 0x1aa11ca9 -//.word 0x7374438b -//.word 0x05522f7d -//.word 0x51460717 -//.word 0x60c9b4ad -//.word 0x04f04622 -//.word 0x60e39401 -//.word 0xaa9123c9 -//.word 0x30a24a89 -//.word 0x99ad93ad -//.word 0x6eac6318 -//.word 0xd9adde73 -//.word 0xacca05c4 -//.word 0xa45a2142 -//.word 0xf0696568 -//.word 0xed66cf48 -//.word 0x341c4f22 -//.word 0xd6e42b35 -//.word 0xe618a2d5 -//.word 0x38cad0be -//.word 0x69b6d1a8 -//.word 0x1f76291b -//.word 0x92f56385 -//.word 0x4c26f98a -//.word 0x2df6749b -//.word 0xb17fd4ca -//.word 0x767e32dc -//.word 0xf807a4a0 -//.word 0x9f776180 -//.word 0xfdab2656 -//.word 0x506fd881 -//.word 0x4f396a37 -//.word 0x2318011c -//.word 0xb3e75614 -//.word 0x24c65c56 -//.word 0xa0cb24c3 -//.word 0x57f4fd75 -//.word 0xc460df9a -//.word 0x32bf0a83 -//.word 0x7e08eaf8 -//.word 0x1e6a3ecf -//.word 0x628479bd -//.word 0xfad8686b -//.word 0xb97d16cc -//.word 0x9915edaf -//.word 0xfeff1d90 -//.word 0x3fce42b4 -//.word 0x62f94175 -//.word 0x27d372da -//.word 0x49be056a -//.word 0x009c9e42 -//.word 0xca874366 -//.word 0x6bc27855 -//.word 0x32efa8e0 -//.word 0x7f82c73b -//.word 0x82753655 -//.word 0x453ee765 -//.word 0xedfec1c5 -//.word 0x3dfb4604 -//.word 0x5b507337 -//.word 0xd7e3e78f -//.word 0xe9984831 -//.word 0xfac4e341 -//.word 0x66e59240 -//.word 0x8190e399 -//.word 0xd8aa7676 -//.word 0xb9dba7d8 -//.word 0xf5406de7 -//.word 0xe4608287 -//.word 0xaa62c52b -//.word 0xb97ddcee -//.word 0x97af1de0 -//.word 0xe2b2af9d -//.word 0x912cec25 -//.word 0x7c260ae7 -//.word 0x1fbffb1f -//.word 0x9a219162 -//.word 0xfdb5e677 -//.word 0xc393fb69 -//.word 0x9c3d9fda -//.word 0x708c939a -//.word 0xa0eaeb79 -//.word 0x8fc2b759 -//.word 0x6135e387 -//.word 0x020f5c4b -//.word 0x6af974bd -//.word 0x20f088db -//.word 0xfdf5e0d9 -//.word 0x3306d6b8 -//.word 0x8e4e3b1a -//.word 0xf999f655 -//.word 0x430aeec6 -//.word 0x23102b68 -//.word 0x7a9638a4 -//.word 0xd97acb6b -//.word 0x4341a783 -//.word 0x3409c21e -//.word 0xe1bea3b1 -//.word 0xc2910f03 -//.word 0x4ea6e485 -//.word 0x060d45e1 -//.word 0xb4f4f7d5 -//.word 0xf51b0b42 -//.word 0xf588be80 -//.word 0x7a7b9df5 -//.word 0x24a4ede6 -//.word 0xf394498c -//.word 0x09728d6b -//.word 0xb1eff3df -//.word 0xa17b7cf8 -//.word 0x7cba9287 -//.word 0x9b31eb79 -//.word 0x0d46b064 -//.word 0xdc67df60 -//.word 0x9289ee18 -//.word 0xfcd4b121 -//.word 0x2e9c7d8a -//.word 0xc7948eb4 -//.word 0x773ea663 -//.word 0xbea6f716 -//.word 0xf6504394 -//.word 0x936f42c8 -//.word 0xaa5744ce -//.word 0xb035174e -//.word 0x85fe2b09 -//.word 0xb0a5f4b1 -//.word 0xed9190fe -//.word 0xe54eaafe -//.word 0x3c839ead -//.word 0xd024ddc5 -//.word 0x40e894d7 -//.word 0xacfe889b -//.word 0xbcfc4485 -//.word 0xe4187798 -//.word 0xe69a987f -//.word 0x9891cbda -//.word 0xe7c508d6 -//.word 0x1cee7a00 -//.word 0x5e23255b -//.word 0x7895ccaf -//.word 0xdd7d1225 -//.word 0xe953df11 -//.word 0x6a41050f -//.word 0x5fd72451 -//.word 0x0000cb37 -//.word 0xfe35df20 -//.word 0x0bf04181 -//.word 0x9d64ab34 -//.word 0xef6bdb12 -//.word 0x49c0f4c3 -//.word 0x826e21d5 -//.word 0xc3887b0c -//.word 0x8d1b2df9 -//.word 0xfe61d5ce -//.word 0x50372e71 -//.word 0xa2d1edcf -//.word 0xfbade873 -//.word 0x8cc57d57 -//.word 0x350932fa -//.word 0x4b0c99b2 -//.word 0x99fe7744 -//.word 0xa4da24b2 -//.word 0x34e03554 -//.word 0x0f46592a -//.word 0x082b8171 -//.word 0x38cc4474 -//.word 0x8cfa81a5 -//.word 0x80cc46ec -//.word 0x2991f03f -//.word 0x79089473 -//.word 0xbfd49e52 -//.word 0x6d2ab8ed -//.word 0x1ecdee34 -//.word 0xd73c0fc3 -//.word 0x8d2956ff -//.word 0xe82e4962 -//.word 0x47bce213 -//.word 0x0454edba -//.word 0xf9f9b192 -//.word 0x43e5d2c0 -//.word 0x457b76e3 -//.word 0xf07da7ec -//.word 0x427ff930 -//.word 0x0d9b6cbb -//.word 0xfa6793e7 -//.word 0xcd24f62e -//.word 0xeb38b63d -//.word 0x19df6f49 -//.word 0x861d62a6 -//.word 0x0cf7d496 -//.word 0xb3e2b15f -//.word 0x777c75a0 -//.word 0x4b7a4ce4 -//.word 0x5de17878 -//.word 0x9c7af47a -//.word 0x787f5733 -//.word 0xe89bfaa7 -//.word 0xb2125d69 -//.word 0xe73bc7b4 -//.word 0xac372db8 -//.word 0x40dd5532 -//.word 0x3bf43c3f -//.word 0x14a5b472 -//.word 0xe62f5124 -//.word 0x74dd860b -//.word 0x6a360c0f -//.word 0xe6738358 -//.word 0x36365cac -//.word 0xe478f6f8 -//.word 0xefc3072c -//.word 0x5ca23e4c -//.word 0xed5727c4 -//.word 0x31cb4efd -//.word 0xbdcba72d -//.word 0xb8702d73 -//.word 0x9ddfca23 -//.word 0x3c33775f -//.word 0x02b8a4e7 -//.word 0x7b5ada31 -//.word 0x155d9fbd -//.word 0x274e9aa3 -//.word 0x3139f76e -//.word 0x661c0d2c -//.word 0x679c3ec6 -//.word 0x52f71f8e -//.word 0xfb3ad917 -//.word 0x79b4d049 -//.word 0xe5aa82b4 -//.word 0x5e4cb125 -//.word 0x50e8c477 -//.word 0xf65e6bac -//.word 0x1ed4823d -//.word 0x2daa38ad -//.word 0x62b07064 -//.word 0x5f9767bb -//.word 0xe5a69754 -//.word 0xdfaedcac -//.word 0xa240d6f3 -//.word 0x731d8e1b -//.word 0x49ee5c2f -//.word 0xd53608e6 -//.word 0xc0842f78 -//.word 0x34ede8b0 -//.word 0x9db9a842 -//.word 0xb15d6360 -//.word 0xaeaaf488 -//.word 0x80000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00016AE0 -//// expected output -//.word 0x115f8631 -//.word 0x397ca4c7 -//.word 0xe373734b -//.word 0xb7173658 -//.word 0xc109e88a -//.word 0x9c236d29 -//.word 0x399005aa -//.word 0x3a6cae0e -//.word 0xa5552690 -//.word 0xc8ff8e0c -//.word 0x27a19a6a -//.word 0x435f8017 -//.word 0x98c05b0b -//.word 0x4b1a6583 -//.word 0xabcb4348 -//.word 0x773c43f4 -//// SHA512LongMsgvector_117 -//// vector length -//.word 0x00016DF8 -//// input message -//.word 0x4538be7e -//.word 0xf6502e3f -//.word 0xba34393b -//.word 0xb2c84119 -//.word 0x779aac77 -//.word 0xc4c539e6 -//.word 0x6f159436 -//.word 0x9e6b28f5 -//.word 0x37633432 -//.word 0x98352186 -//.word 0x89d91356 -//.word 0x6e6fbe52 -//.word 0xc2dd7b41 -//.word 0xc0ba9a01 -//.word 0x636bfac9 -//.word 0x918bd8b2 -//.word 0x9391e576 -//.word 0xc9ac9b77 -//.word 0x9cf2d003 -//.word 0xb3ba8cd6 -//.word 0x6a4618e0 -//.word 0x80a65749 -//.word 0x0fd859b3 -//.word 0xc2342ebf -//.word 0x4208f8d2 -//.word 0xf17f4419 -//.word 0xdbc79bca -//.word 0xea7253ad -//.word 0x591dabdc -//.word 0x6a5018c7 -//.word 0x5ca6d97a -//.word 0x972ed123 -//.word 0x2b1096ce -//.word 0x7874c674 -//.word 0x2e9f9a34 -//.word 0x795fbde0 -//.word 0x75aa5ebb -//.word 0xe8828481 -//.word 0x301ba1a8 -//.word 0x7a406be6 -//.word 0x35f3e7f3 -//.word 0xc754c690 -//.word 0x7ec4f5c8 -//.word 0xc9497076 -//.word 0xa8345707 -//.word 0x61024381 -//.word 0x7581dac4 -//.word 0xd234a111 -//.word 0x4af712c8 -//.word 0x44e6ef76 -//.word 0xb17cd50e -//.word 0x42f81477 -//.word 0xd805be47 -//.word 0x3d99fecf -//.word 0x111eab57 -//.word 0x07d01daa -//.word 0x516640d6 -//.word 0x58f4e62d -//.word 0xb110628f -//.word 0x4c3452ec -//.word 0xef63bc04 -//.word 0xe30f5d71 -//.word 0xee3b3de8 -//.word 0x81dd87bc -//.word 0x318698a3 -//.word 0x6b4456bd -//.word 0x64c8c3d2 -//.word 0x50c4d2dc -//.word 0xd49779c5 -//.word 0xbd2c0771 -//.word 0xf21fb8ff -//.word 0xa722864c -//.word 0xd4a043b9 -//.word 0xe6a0e52f -//.word 0xb4eb2160 -//.word 0xb4713b4f -//.word 0x6fe91c12 -//.word 0x32b8a5d6 -//.word 0x07144325 -//.word 0xe369c364 -//.word 0x21fb68a0 -//.word 0x2fce3b8a -//.word 0x88c3a3bf -//.word 0xe203354d -//.word 0xa8a0cd73 -//.word 0xaa7adea9 -//.word 0x146006e0 -//.word 0x9c78e60b -//.word 0x00e130de -//.word 0xb09601d6 -//.word 0xc7967279 -//.word 0x40426adf -//.word 0x6706b671 -//.word 0x8d3b5bf1 -//.word 0x004c2abb -//.word 0x3b18964a -//.word 0x5998c3fd -//.word 0xd0c2df1b -//.word 0x5badb516 -//.word 0x38f57f0c -//.word 0x9461fc93 -//.word 0x44c3c3b6 -//.word 0xb520d73b -//.word 0x26117b28 -//.word 0x14694885 -//.word 0xf6187c62 -//.word 0x2b50951c -//.word 0x31e61fdd -//.word 0x17faca62 -//.word 0x35dabf01 -//.word 0x1a2434ea -//.word 0xc62b3ead -//.word 0x1a9ce7fc -//.word 0x8c6281b2 -//.word 0x1fc63a15 -//.word 0x93dbf058 -//.word 0xd8194665 -//.word 0xc948f7d9 -//.word 0x17a06a4f -//.word 0x832e87e1 -//.word 0x5179caec -//.word 0xf9669514 -//.word 0x1f59cb88 -//.word 0xc59d9a87 -//.word 0xc0069824 -//.word 0x68d41246 -//.word 0x94dba0f2 -//.word 0xc6e1fdcd -//.word 0xa24816dc -//.word 0xa5ed618f -//.word 0x134f70fe -//.word 0x31f4c672 -//.word 0xb508e927 -//.word 0x7b48b950 -//.word 0x791eff5c -//.word 0xf50d4978 -//.word 0xf550f655 -//.word 0xf8be8d2b -//.word 0xe3f153fe -//.word 0x3ea71c20 -//.word 0xa06861f7 -//.word 0x686a9300 -//.word 0xaeb1af14 -//.word 0x7a7a13ea -//.word 0x33da90de -//.word 0x5aa3c0f0 -//.word 0x78879910 -//.word 0x54804399 -//.word 0x6a6f271b -//.word 0x9903495d -//.word 0x1cdcd7a2 -//.word 0xbbf0022c -//.word 0x422e0cff -//.word 0x3362a2e7 -//.word 0xb8596dbc -//.word 0xdb45e4e5 -//.word 0xf962641b -//.word 0x74da826f -//.word 0xa9e7a08f -//.word 0x2237be45 -//.word 0x0c949340 -//.word 0xebc4dc17 -//.word 0x8caef58b -//.word 0x3bbfa60d -//.word 0x378c3f80 -//.word 0x63b9e73f -//.word 0x3e193162 -//.word 0x1516f03d -//.word 0x78544d2a -//.word 0xea911689 -//.word 0xdcd05904 -//.word 0xddb63218 -//.word 0x0b34e1d0 -//.word 0xcd661fd4 -//.word 0xc4bbb3a3 -//.word 0xfe57401d -//.word 0x6db56144 -//.word 0x9891f743 -//.word 0x9105c2b0 -//.word 0x27f22f0e -//.word 0x5ca17196 -//.word 0x1aaad337 -//.word 0x21154ddb -//.word 0x44c055ec -//.word 0xd500f716 -//.word 0x5e8b284f -//.word 0x91965815 -//.word 0x823a46f7 -//.word 0x141c1857 -//.word 0xb14dab6e -//.word 0x3f6f2891 -//.word 0x4f1ad8b2 -//.word 0x977e3929 -//.word 0xa24951b5 -//.word 0xc6cb42bd -//.word 0x57571fdc -//.word 0x1aedfe9d -//.word 0xfc174e83 -//.word 0x04116b4d -//.word 0x872c7077 -//.word 0x9b744d04 -//.word 0xcd91197b -//.word 0x17eba930 -//.word 0x0c1261c4 -//.word 0x565c4aef -//.word 0x62d0657d -//.word 0x5a423f97 -//.word 0x54c0c644 -//.word 0xc92d5b30 -//.word 0x482c28ab -//.word 0x6b40b4f4 -//.word 0x0b31b4b8 -//.word 0xb0b125d6 -//.word 0x4b3f9765 -//.word 0x284cccf8 -//.word 0x1e9c8120 -//.word 0x09f08c33 -//.word 0x7ae2274c -//.word 0xac108c93 -//.word 0xba7cc2bf -//.word 0x1033b6d9 -//.word 0x1f2d8d42 -//.word 0x567539f7 -//.word 0x4d894a14 -//.word 0x43040797 -//.word 0xca7abe67 -//.word 0xc1a45895 -//.word 0x83bd30e1 -//.word 0x5e2b2680 -//.word 0x4762ef1c -//.word 0xcb06af1d -//.word 0x494fc927 -//.word 0x5fb2f5e3 -//.word 0xa2be9403 -//.word 0x92444180 -//.word 0xcdbaa926 -//.word 0x82e19c53 -//.word 0x29a664fc -//.word 0x714655f0 -//.word 0x7ab6a561 -//.word 0x45427ea0 -//.word 0x69745228 -//.word 0x07376fde -//.word 0xff3cd397 -//.word 0x649d41db -//.word 0x2ec194e9 -//.word 0x2f7f54fa -//.word 0x498687ca -//.word 0xddfcc955 -//.word 0x86659fde -//.word 0x08c70936 -//.word 0x830b563b -//.word 0xeda73c9f -//.word 0xbe7a28eb -//.word 0xedf7d3c3 -//.word 0x1c86166b -//.word 0x1027ff8a -//.word 0x6359242e -//.word 0x7d3a3711 -//.word 0xc0efdb1b -//.word 0x0346b627 -//.word 0x429ac80a -//.word 0x93f8fbd1 -//.word 0x5c7ffb4b -//.word 0xc40d47c8 -//.word 0x6718891f -//.word 0x4ed923f6 -//.word 0x1eb00a3d -//.word 0x8fc4d7fc -//.word 0x20ea1b4f -//.word 0x0ac8f3ae -//.word 0x723add72 -//.word 0xe2f4ca95 -//.word 0xfa6975ba -//.word 0x63ecf26d -//.word 0x05158aab -//.word 0x7a67c6a5 -//.word 0xc22fcac1 -//.word 0x38afe4e2 -//.word 0xc47c65e9 -//.word 0x5325b07c -//.word 0x84159006 -//.word 0xa4bbcffe -//.word 0xdde8046d -//.word 0xaa78acaa -//.word 0x8e347c68 -//.word 0x06f7f6f3 -//.word 0xbc103bb7 -//.word 0xfde82002 -//.word 0x6de5830b -//.word 0xfa8de032 -//.word 0x0eef1f89 -//.word 0x093eb094 -//.word 0xeec0da4d -//.word 0x5ce6506b -//.word 0xc1bd06e4 -//.word 0xca8542b1 -//.word 0x1e9ef6d1 -//.word 0x4bac4d90 -//.word 0x00f38409 -//.word 0x7e03fbea -//.word 0x499a8c77 -//.word 0x23c61bd2 -//.word 0x3a4a6e79 -//.word 0xa1433f10 -//.word 0xfd0b9061 -//.word 0x815e3fa1 -//.word 0x1cbbdaf4 -//.word 0xf00db434 -//.word 0x078b39ee -//.word 0x41dd7eae -//.word 0x91801d7d -//.word 0x696b3fa7 -//.word 0x73f3fac2 -//.word 0x82ecdeeb -//.word 0xc811ca53 -//.word 0x49a604fb -//.word 0x8f5b89bb -//.word 0xa074a289 -//.word 0x2d27b8f8 -//.word 0x0c4569ff -//.word 0xe91ddcfc -//.word 0x389e51f8 -//.word 0x6dbbfc2d -//.word 0x701413c5 -//.word 0x4bd226e5 -//.word 0x26d2afea -//.word 0x7607eaf3 -//.word 0x7119e69f -//.word 0xc552dc18 -//.word 0x89bbc150 -//.word 0x7482178a -//.word 0x4d9f081d -//.word 0xa2b7b574 -//.word 0xbd41cc5a -//.word 0xd4e75874 -//.word 0x802fde0f -//.word 0x705aa51d -//.word 0x5f8d5579 -//.word 0x432ec473 -//.word 0xc8910c88 -//.word 0xfcd4e171 -//.word 0x4c072160 -//.word 0xaf90ad86 -//.word 0x21ce78d8 -//.word 0x53fddd13 -//.word 0xa15a36fd -//.word 0x4487aaee -//.word 0xc9304690 -//.word 0xc1ef4fe3 -//.word 0xbb6dd784 -//.word 0x6fcb8f2e -//.word 0x3c40dc81 -//.word 0xd5032d02 -//.word 0x376b8b64 -//.word 0xde547206 -//.word 0x38c6dfbc -//.word 0x5ad1aad2 -//.word 0xf2bb164e -//.word 0x7c5ea776 -//.word 0xb9cb3392 -//.word 0x5d333cf3 -//.word 0x08087d34 -//.word 0x785fc3c0 -//.word 0xfd99fe94 -//.word 0x2d429847 -//.word 0xd8390547 -//.word 0x3f119c65 -//.word 0x80b8a594 -//.word 0x5556b3ed -//.word 0xfe7834f7 -//.word 0x7c6e4626 -//.word 0x00f1cca1 -//.word 0xa30ac148 -//.word 0x572fcdf6 -//.word 0x1eae1603 -//.word 0x7a4f590e -//.word 0x243439f9 -//.word 0x0005d734 -//.word 0x514aa23f -//.word 0x2a18716a -//.word 0x25f0cfe0 -//.word 0x56e495e3 -//.word 0x82fbbf59 -//.word 0x8dd77888 -//.word 0x3295771e -//.word 0xf7f58e74 -//.word 0x5fbb8013 -//.word 0x61551478 -//.word 0x19bd6714 -//.word 0xbea18697 -//.word 0xd4c23c6e -//.word 0xa29a298a -//.word 0xe7411464 -//.word 0xc991833e -//.word 0x0e8988ab -//.word 0x8eefdd51 -//.word 0xe83933ee -//.word 0x75aec899 -//.word 0x7ac9384b -//.word 0xa2de959d -//.word 0xabffb9d3 -//.word 0x5f21db1a -//.word 0xc67b610e -//.word 0x9a2ff57f -//.word 0xfb2cdb75 -//.word 0x64538271 -//.word 0xded959f6 -//.word 0x73ece348 -//.word 0xe6990e74 -//.word 0xa1edc190 -//.word 0xef5ab444 -//.word 0x6b5d848a -//.word 0xb95e07b1 -//.word 0x73d8dda8 -//.word 0x66b94779 -//.word 0xff0c3c14 -//.word 0x00d5ba4e -//.word 0x773c5b29 -//.word 0xf1ee2856 -//.word 0xebc1b1f8 -//.word 0x89975eab -//.word 0x8b8400c5 -//.word 0x7c33abdc -//.word 0x2c85c888 -//.word 0x617c6669 -//.word 0xca58d16c -//.word 0x34ff664b -//.word 0x00a2a553 -//.word 0xd59e886a -//.word 0x92a01350 -//.word 0x870d2d25 -//.word 0xe4a1ae2c -//.word 0x7156b9ce -//.word 0x80874ce2 -//.word 0x2155152b -//.word 0x944a8822 -//.word 0x043c2ef6 -//.word 0x727440d2 -//.word 0xef10745e -//.word 0x0ea61788 -//.word 0x992a5c84 -//.word 0x8312f411 -//.word 0x1eb7deff -//.word 0x8eff81ee -//.word 0x7e39f858 -//.word 0x1148add2 -//.word 0x1b04298e -//.word 0x92dd2a25 -//.word 0x3fc2f693 -//.word 0xb941f083 -//.word 0x94ef69ce -//.word 0xd60ab83e -//.word 0xaa5d8d97 -//.word 0x596482d8 -//.word 0x75b1f3be -//.word 0x588e108a -//.word 0xcde43004 -//.word 0x0c5b69c0 -//.word 0xecc35da0 -//.word 0x54b3569a -//.word 0xf26f96bb -//.word 0x300fe86c -//.word 0x64de7bf5 -//.word 0x4701f03f -//.word 0xa959b2de -//.word 0x63aa864e -//.word 0x8cfc637d -//.word 0xf041838a -//.word 0xbd39bacd -//.word 0x80930717 -//.word 0x5055693b -//.word 0x497df3cd -//.word 0x3de82329 -//.word 0xa57470b7 -//.word 0xde62226e -//.word 0x92fe6697 -//.word 0x7481a2d4 -//.word 0x30360660 -//.word 0xa1dc6498 -//.word 0x454c41bb -//.word 0xef5b2cee -//.word 0xbc024e83 -//.word 0x48bc437a -//.word 0x22302848 -//.word 0x7d10f5d8 -//.word 0x28410dd0 -//.word 0xc03c1415 -//.word 0x24b40191 -//.word 0x29797434 -//.word 0x8f9c4938 -//.word 0x34d46daa -//.word 0x8820f026 -//.word 0x41ae5ce2 -//.word 0x50fc46ed -//.word 0x133d22b9 -//.word 0xccfe5cd8 -//.word 0x5209a403 -//.word 0x06898960 -//.word 0x09704905 -//.word 0xac16e7b8 -//.word 0x28227ff8 -//.word 0x90aed742 -//.word 0x03a6368d -//.word 0x26717917 -//.word 0xd1d46363 -//.word 0x09133582 -//.word 0x2f597e93 -//.word 0x76593586 -//.word 0x9b360525 -//.word 0xd0a0e854 -//.word 0xf941f797 -//.word 0x1a5781d6 -//.word 0x10a25a5d -//.word 0x80807527 -//.word 0x0e57b55c -//.word 0xcf330118 -//.word 0x00b0976e -//.word 0xf81ba2ad -//.word 0x5bd40ee1 -//.word 0x91f69b9d -//.word 0x763a30f8 -//.word 0x531973d6 -//.word 0x0e319669 -//.word 0x9dea73f7 -//.word 0xc059dcdd -//.word 0xf0652cd4 -//.word 0x92282273 -//.word 0x7198f0f5 -//.word 0x6b668e3d -//.word 0x6b265417 -//.word 0x97b1c8c1 -//.word 0xcac7b5aa -//.word 0x44f97d79 -//.word 0xa0c6af51 -//.word 0x0705dc53 -//.word 0xa483a765 -//.word 0x57ec1c32 -//.word 0xaeef4372 -//.word 0x119df46c -//.word 0x3c12ecb9 -//.word 0xf358214a -//.word 0xf08853ad -//.word 0x2132e48b -//.word 0x10ffe976 -//.word 0xa39581e1 -//.word 0x05bb6670 -//.word 0xe4bec173 -//.word 0xdd1343ad -//.word 0x343d7159 -//.word 0xc9f23f6f -//.word 0x4779e123 -//.word 0x9f56deae -//.word 0xb5296652 -//.word 0x58d4e598 -//.word 0x78dcd8dd -//.word 0x9312e00c -//.word 0x717214ad -//.word 0x114b9c1f -//.word 0xe3a07c21 -//.word 0x38cead98 -//.word 0xf670728c -//.word 0x9080e973 -//.word 0x35bfe0b2 -//.word 0x4856eb61 -//.word 0x11bdb34e -//.word 0xb2dc9145 -//.word 0x5c705c8f -//.word 0xc2b17fb9 -//.word 0xce324e97 -//.word 0x93089a87 -//.word 0x842e82fa -//.word 0xe3288d31 -//.word 0x7ce7f645 -//.word 0x92ed476a -//.word 0x1ab12974 -//.word 0x27457b9b -//.word 0xa636a17b -//.word 0x4bb41f5f -//.word 0xcbf266be -//.word 0x4cd0ed06 -//.word 0x19b88499 -//.word 0x9bc5e615 -//.word 0x852b8dd9 -//.word 0x4ed3cac5 -//.word 0xe4451440 -//.word 0x9fcba180 -//.word 0x73d33306 -//.word 0x6b963567 -//.word 0x52f70652 -//.word 0xb3ae95cf -//.word 0x05a52ec5 -//.word 0x1fa293bf -//.word 0xf2274fef -//.word 0x76974774 -//.word 0xe59992d8 -//.word 0x28c18add -//.word 0x8e6e2379 -//.word 0xc4ee7c1f -//.word 0x02e9b440 -//.word 0x82fcff12 -//.word 0x36a4f990 -//.word 0xba5e3ac2 -//.word 0x880c2a3e -//.word 0x6b9b16ef -//.word 0x36e38415 -//.word 0xb5cec48d -//.word 0xe4bdc853 -//.word 0x5f273645 -//.word 0x1a83ba29 -//.word 0x5269a1f2 -//.word 0xc3f4a43f -//.word 0x1c6a0125 -//.word 0xb01fd12e -//.word 0x6e9695a1 -//.word 0x13ea1204 -//.word 0x9e6c5fe0 -//.word 0x048e3cc4 -//.word 0x2600a58c -//.word 0x0018a7e3 -//.word 0x23777307 -//.word 0x65eab1cd -//.word 0xd78e16e4 -//.word 0xf738395d -//.word 0x2713a26b -//.word 0x5e8b2468 -//.word 0x1e6a6e19 -//.word 0xa641dc33 -//.word 0x680a931e -//.word 0xbd0bccf8 -//.word 0xd8fe70dd -//.word 0xf86ee666 -//.word 0xe264286f -//.word 0x8f431d1e -//.word 0x22f12321 -//.word 0x1d37ea36 -//.word 0xd36b89f1 -//.word 0x214ccbba -//.word 0x592dca15 -//.word 0x7f56c026 -//.word 0xb8a71974 -//.word 0xff7ecded -//.word 0x1adbec2a -//.word 0xccc27bf5 -//.word 0x4de17e08 -//.word 0xf7735618 -//.word 0x42644d12 -//.word 0xf2b670a5 -//.word 0x8f239d00 -//.word 0x1604dcdd -//.word 0xee71f2be -//.word 0x1daa3476 -//.word 0xbcb59aec -//.word 0xa849141c -//.word 0x7beb215e -//.word 0xbb579deb -//.word 0x5121da9d -//.word 0x3c9cf3f6 -//.word 0x86fb5d64 -//.word 0x77b6bfc3 -//.word 0x0a300424 -//.word 0x9d96aecd -//.word 0xec0a6d81 -//.word 0x4001f001 -//.word 0xe4e9fbd2 -//.word 0xd910ba41 -//.word 0xcac155a5 -//.word 0x42b0c4e4 -//.word 0x1d97e538 -//.word 0x3d22cb33 -//.word 0x7e095901 -//.word 0xeb7b10ee -//.word 0x32c32627 -//.word 0x5526d8c5 -//.word 0xa30a0107 -//.word 0xe75eeadf -//.word 0xdf3564b1 -//.word 0xefb41457 -//.word 0x172f0f68 -//.word 0x238fa7ba -//.word 0x21f78425 -//.word 0x18a7f68a -//.word 0xf7208914 -//.word 0xcc88dabe -//.word 0x3651aa16 -//.word 0x1d163140 -//.word 0xa0c5b43d -//.word 0x4f035a6e -//.word 0x9bcc3c53 -//.word 0x8a5abb99 -//.word 0xb0491654 -//.word 0x5af83c89 -//.word 0x0c32deef -//.word 0x2e0ec9f6 -//.word 0x02137309 -//.word 0xd9a0d310 -//.word 0x878b763a -//.word 0x1409d0f9 -//.word 0xb4ced04e -//.word 0xf975b746 -//.word 0x482129c5 -//.word 0x8a658482 -//.word 0x23617253 -//.word 0x282ebaab -//.word 0xcc7d5c60 -//.word 0x1c7adcb2 -//.word 0xedf7de8a -//.word 0x12c6f3ff -//.word 0xd266b31e -//.word 0x99e30ceb -//.word 0xedf7d9a3 -//.word 0xa475b644 -//.word 0x54e7134f -//.word 0x0c7688cd -//.word 0x410b6890 -//.word 0x0bb499bb -//.word 0x9249a385 -//.word 0xc24f0639 -//.word 0x471cd181 -//.word 0xb53c70e5 -//.word 0x0614c68f -//.word 0x4ac57c51 -//.word 0x9a5498e9 -//.word 0x4e075183 -//.word 0x7012217f -//.word 0x70721d75 -//.word 0x181a8276 -//.word 0xc34d9095 -//.word 0xca4b9ba6 -//.word 0x402f5f46 -//.word 0xdf18941c -//.word 0x4187c25e -//.word 0x54085796 -//.word 0x0815f7a6 -//.word 0x4a371309 -//.word 0x366ebd5d -//.word 0x88d3ba1e -//.word 0x547cd9b5 -//.word 0xf8a084b1 -//.word 0x4efb9554 -//.word 0x26746b51 -//.word 0xf3fe3cd4 -//.word 0xc4bcacc3 -//.word 0x76689f43 -//.word 0x28f54c7f -//.word 0xf07394a5 -//.word 0xcc349130 -//.word 0xdc2d716d -//.word 0xce9e8538 -//.word 0x99f69507 -//.word 0x6ef1772b -//.word 0xeb03df52 -//.word 0x93f9794f -//.word 0x7bde351e -//.word 0x451be322 -//.word 0x52e3ffb2 -//.word 0x34ceced4 -//.word 0x62c4aa48 -//.word 0x301d99c9 -//.word 0xfe06258f -//.word 0xaf276818 -//.word 0x5d836728 -//.word 0x4a9fa10f -//.word 0x1ae6e72a -//.word 0x404c6dac -//.word 0xb732229e -//.word 0xf2893d25 -//.word 0x153b1804 -//.word 0x65c64261 -//.word 0xfd2ad0cc -//.word 0xc406f37d -//.word 0x9bfed0dd -//.word 0xdb5f8b49 -//.word 0xfe06a512 -//.word 0x9c7e89c8 -//.word 0x9a6861b8 -//.word 0x9e202eb3 -//.word 0xc59d1811 -//.word 0x999902f6 -//.word 0x3df262d4 -//.word 0xeb515031 -//.word 0xa109ddab -//.word 0x1642a539 -//.word 0xf356a8b3 -//.word 0x407b5595 -//.word 0x1ca3e800 -//.word 0xb2a0f601 -//.word 0x688c4616 -//.word 0x5968e3ee -//.word 0x06036f71 -//.word 0x481dba00 -//.word 0x8acd94fe -//.word 0x3420df8f -//.word 0x6a03e89f -//.word 0xf763f727 -//.word 0x849224ab -//.word 0x0eed6d08 -//.word 0x97bc066c -//.word 0x1b59f0a6 -//.word 0xc595cda0 -//.word 0x6357f329 -//.word 0x1886bff8 -//.word 0x50292bee -//.word 0xf9cda39c -//.word 0xf1271505 -//.word 0xbafb48a5 -//.word 0x753d6eb2 -//.word 0x0e75fca1 -//.word 0xb468b9ec -//.word 0x8cf41513 -//.word 0xa63cbde1 -//.word 0x30056cf0 -//.word 0xe960046f -//.word 0xd98add23 -//.word 0x40105dac -//.word 0xcc36c90a -//.word 0x0e9a5a5f -//.word 0x2f1594f6 -//.word 0xdfe2d385 -//.word 0x8f0227af -//.word 0xe0de61cd -//.word 0x5b2f6eee -//.word 0x621be41c -//.word 0x66a0dbe2 -//.word 0x5b36fe0b -//.word 0x69b0e2ab -//.word 0xe5649664 -//.word 0x7f8b7be2 -//.word 0xbdeb55a8 -//.word 0xa8b3a30f -//.word 0xc5a62c8b -//.word 0x467bdb31 -//.word 0x8284cc76 -//.word 0xa38fa73a -//.word 0x9e0a2d05 -//.word 0x696a1090 -//.word 0x68cd0887 -//.word 0x28dd238d -//.word 0x4ff85d81 -//.word 0xd38f70ff -//.word 0x6bcced2a -//.word 0x43788ca9 -//.word 0xf41bc0f0 -//.word 0xb3658fc1 -//.word 0xc8cca1f2 -//.word 0x43779770 -//.word 0xea5b9e84 -//.word 0x75a44355 -//.word 0xfe5689af -//.word 0xb3343802 -//.word 0xcee179ae -//.word 0xc745a07d -//.word 0xc7324971 -//.word 0x6147a6c1 -//.word 0x7d15171e -//.word 0x9481fb3a -//.word 0x2369c78b -//.word 0x598b554d -//.word 0x13a27ec6 -//.word 0x0bd1eacd -//.word 0x4c45278d -//.word 0xea17f987 -//.word 0xef6ff1d6 -//.word 0x98ef41b7 -//.word 0xc24fcf48 -//.word 0x9f448890 -//.word 0xada7f7c0 -//.word 0xe9d316b8 -//.word 0x404f64cd -//.word 0x46ad37ca -//.word 0x2ab15434 -//.word 0xeab6bdd3 -//.word 0xc34eca6d -//.word 0xec297bd5 -//.word 0x83380d25 -//.word 0xc811cb47 -//.word 0x899627ba -//.word 0xddd10992 -//.word 0x152367c1 -//.word 0xf09e1696 -//.word 0x0eafe083 -//.word 0xa700d623 -//.word 0x7d9ce77b -//.word 0x0f55b281 -//.word 0x106399da -//.word 0x174d17e8 -//.word 0x980d5304 -//.word 0x136ff508 -//.word 0x8bba3811 -//.word 0x3a924083 -//.word 0x831daf4d -//.word 0x2865736e -//.word 0xbdfde1b8 -//.word 0x5de808d3 -//.word 0x9bb63f86 -//.word 0xbbf00132 -//.word 0x23b6fb9f -//.word 0x0ca762fb -//.word 0x7d018a20 -//.word 0x7a09b516 -//.word 0x79ae29d9 -//.word 0x1569855c -//.word 0x066754cd -//.word 0x51eae31b -//.word 0xbced50b6 -//.word 0x8507e496 -//.word 0x5391a27e -//.word 0x6d0b2082 -//.word 0x2abc96c7 -//.word 0xa999358a -//.word 0xc168ba63 -//.word 0x3b2542cb -//.word 0x3fa560dd -//.word 0x0d796d59 -//.word 0xee151fee -//.word 0x69325db9 -//.word 0xb9705209 -//.word 0x7f40c165 -//.word 0xb50198d0 -//.word 0xe369c74b -//.word 0x9527529c -//.word 0x0cc6a54e -//.word 0x34d529f9 -//.word 0xd64514c3 -//.word 0x0f128527 -//.word 0x0126d0f5 -//.word 0xc87a169a -//.word 0xaf7e1aa2 -//.word 0xa4bb4f7b -//.word 0xeab6367c -//.word 0x0e18e625 -//.word 0x1c0deca9 -//.word 0x12ea56a9 -//.word 0x95120b43 -//.word 0xe31a5e4b -//.word 0x092be2d8 -//.word 0x56a87f03 -//.word 0x0f11c5eb -//.word 0x642881fd -//.word 0xa3528e72 -//.word 0xac3fee18 -//.word 0xa5cd1956 -//.word 0xef2a956a -//.word 0x5839c7f6 -//.word 0x923809bb -//.word 0xe49ffda4 -//.word 0x1f4b2006 -//.word 0xd4dba226 -//.word 0xc45b75fc -//.word 0x9820a436 -//.word 0xd2f2e680 -//.word 0x04717303 -//.word 0x3fb1162b -//.word 0xcf2883ae -//.word 0x25caecca -//.word 0x1572cfce -//.word 0x428412db -//.word 0xd6d051ec -//.word 0x76ba7714 -//.word 0x75988b07 -//.word 0x475ccddc -//.word 0x39730211 -//.word 0x60ed0cd0 -//.word 0xcfddbd70 -//.word 0x0d03ed3f -//.word 0xc7a8ca7f -//.word 0xc1ca70ae -//.word 0x1279ba0b -//.word 0x91815755 -//.word 0x8b4920d6 -//.word 0xb7fba8a0 -//.word 0x6be51517 -//.word 0x0f202faf -//.word 0xd36fb7f7 -//.word 0x9d69fad7 -//.word 0x45dba615 -//.word 0x0568db1e -//.word 0x2b728504 -//.word 0x113eeac3 -//.word 0x4f527fc8 -//.word 0x2f2200b4 -//.word 0x62ecbf5d -//.word 0xf1e13d15 -//.word 0x7685f730 -//.word 0x8b5882c0 -//.word 0x83b6daa3 -//.word 0x58fcf8c0 -//.word 0xe5eca28d -//.word 0x555387d5 -//.word 0xdce88bb8 -//.word 0xa57860f3 -//.word 0x0b405661 -//.word 0x0b9b74c2 -//.word 0xf9ddc7bc -//.word 0x737efa1f -//.word 0x947b276d -//.word 0x69f9ed9a -//.word 0xa92bc310 -//.word 0xa0778bf6 -//.word 0x6dd46bb2 -//.word 0x6d77d8ac -//.word 0xf7aef355 -//.word 0x4a0c1969 -//.word 0xc3c6b571 -//.word 0x545d598b -//.word 0x317d0e6d -//.word 0xcc26e8a8 -//.word 0x0409dd2a -//.word 0x9935d607 -//.word 0xe4f20779 -//.word 0xc5ed7c25 -//.word 0xdc96f59f -//.word 0xfcc7f431 -//.word 0xdca614d8 -//.word 0x10cc9c90 -//.word 0x38a754d1 -//.word 0x781c985a -//.word 0x2871aa2d -//.word 0xcc6b4ddb -//.word 0x46b38f01 -//.word 0x4a7ee613 -//.word 0x136d7e58 -//.word 0x54b2d236 -//.word 0x72757ab0 -//.word 0xf076432d -//.word 0x2bf3857b -//.word 0x47ccb113 -//.word 0x69e52a9f -//.word 0x26cc56b9 -//.word 0x3c9cf4f6 -//.word 0x8021b023 -//.word 0x183cf4ce -//.word 0xea890209 -//.word 0x5440406a -//.word 0x1e59d256 -//.word 0xadf46e7f -//.word 0x79f76cac -//.word 0xc1f91db9 -//.word 0x7d5f5ede -//.word 0x94c46d34 -//.word 0x4f9ffb74 -//.word 0x0d1f8202 -//.word 0x395ad82b -//.word 0x7aa705ab -//.word 0x29485273 -//.word 0x084da2a9 -//.word 0x31b405ef -//.word 0x4cd58be8 -//.word 0x05fe56f8 -//.word 0xbe5af34c -//.word 0x8017eb1b -//.word 0x38c7942b -//.word 0x20072d96 -//.word 0x7b5f2ace -//.word 0x856acddf -//.word 0xaa37f6f4 -//.word 0xf6ee3c1d -//.word 0xcdb73c4f -//.word 0xdcd731ad -//.word 0x4f1cc605 -//.word 0x447c289e -//.word 0x80f95e31 -//.word 0x61c8dd35 -//.word 0x14b1575f -//.word 0x08b9d56a -//.word 0xa3ff0514 -//.word 0x33e4d569 -//.word 0x276e4043 -//.word 0x7fef6812 -//.word 0x81e1e6d9 -//.word 0xae155e79 -//.word 0xf40d5632 -//.word 0x25a64867 -//.word 0xa8f9f5a1 -//.word 0x6f84fdd7 -//.word 0x2885aded -//.word 0xb8a7187a -//.word 0xe5e069ce -//.word 0x529a7734 -//.word 0xb1119a74 -//.word 0x34fcbe9c -//.word 0x446fb500 -//.word 0x7600d280 -//.word 0xbb29b309 -//.word 0xd7ed5e5f -//.word 0x14be9019 -//.word 0x379f51ed -//.word 0xb386cc2d -//.word 0x1d045e92 -//.word 0xe027ed39 -//.word 0x32a07beb -//.word 0x4621faa1 -//.word 0xc3096247 -//.word 0x764302c1 -//.word 0x436b132c -//.word 0x62339366 -//.word 0xc80651d0 -//.word 0xe2eb4452 -//.word 0x89ab20a0 -//.word 0x33362bbc -//.word 0x66434dbd -//.word 0x733767ce -//.word 0x6048e679 -//.word 0x26e29826 -//.word 0x1d49bede -//.word 0xb4816255 -//.word 0x656beb28 -//.word 0xe830ee63 -//.word 0xa7e24746 -//.word 0x73616949 -//.word 0x757cf25d -//.word 0x67598375 -//.word 0x0417ce45 -//.word 0xbcb1f049 -//.word 0xad26020a -//.word 0xcfd7ea9d -//.word 0x6e30776c -//.word 0xde8aae39 -//.word 0x6a505e5f -//.word 0x8d61fb5b -//.word 0x65b6a88c -//.word 0x64459637 -//.word 0x49258dce -//.word 0x4ef2c872 -//.word 0xa37306b6 -//.word 0x1c7adea6 -//.word 0x270c5308 -//.word 0x00c2a8e1 -//.word 0x286f763b -//.word 0x1303fb26 -//.word 0x20b0b5fd -//.word 0xcf4b2fea -//.word 0x2ff41cac -//.word 0x95f9a298 -//.word 0x93f8f8de -//.word 0x2844330e -//.word 0x358a5ddb -//.word 0x30b5c81e -//.word 0x1c0ea11e -//.word 0xb9a8c80e -//.word 0xf8fbdfd7 -//.word 0xb1cfa218 -//.word 0x985c766b -//.word 0x6eaf44eb -//.word 0x744f87f3 -//.word 0x2521a428 -//.word 0x24897bb9 -//.word 0x74d23be5 -//.word 0xe7d07abe -//.word 0xd9c3852d -//.word 0x1d7ff437 -//.word 0x38ca827e -//.word 0xcd061c0b -//.word 0x5910384a -//.word 0x21676856 -//.word 0x68912f77 -//.word 0xe4ba13ea -//.word 0x739ff3e0 -//.word 0x0baa9bc8 -//.word 0xef5e96d1 -//.word 0x29f643ab -//.word 0x34492c8e -//.word 0xf9f1927e -//.word 0xfdac4dcd -//.word 0xd802d3e1 -//.word 0xe9299638 -//.word 0x482593a8 -//.word 0xfc3327ec -//.word 0x6e68255c -//.word 0x1e9627fc -//.word 0x956f21b8 -//.word 0x9bed3cee -//.word 0xa9f1e12d -//.word 0xa12a133d -//.word 0xbd38035f -//.word 0xc511ded5 -//.word 0x86a4eaa5 -//.word 0x7fbdd19b -//.word 0xdd293d8d -//.word 0xaa1aa4e2 -//.word 0x41cd6655 -//.word 0x056915f7 -//.word 0x522b1373 -//.word 0xb4c06396 -//.word 0x57f2b90f -//.word 0xbf87d373 -//.word 0xb9660c84 -//.word 0x92fc2fb2 -//.word 0x86de89e2 -//.word 0x7bb0426f -//.word 0xf045ed6e -//.word 0x30075d37 -//.word 0xcb9aba21 -//.word 0x46bcd58c -//.word 0x1270b925 -//.word 0xbb5b8365 -//.word 0x626e735b -//.word 0x6dc542ac -//.word 0x7dcfb6d8 -//.word 0xa0b075be -//.word 0xc9e31763 -//.word 0x7d247eef -//.word 0xce8d6af8 -//.word 0x8dff4803 -//.word 0xbcc34b48 -//.word 0x4271beb6 -//.word 0xe2119937 -//.word 0x6e815235 -//.word 0x3817f55d -//.word 0xca8677a3 -//.word 0xd7064886 -//.word 0x71af2795 -//.word 0x7b263a32 -//.word 0x627c5e96 -//.word 0x0853bc15 -//.word 0x01439da3 -//.word 0x027c7f98 -//.word 0x96ac67b0 -//.word 0x13237a56 -//.word 0xcd35c722 -//.word 0x89df68a0 -//.word 0x35aec953 -//.word 0xd6dd47f9 -//.word 0xc1bdfd11 -//.word 0x0e5ada9b -//.word 0x4a5cf71f -//.word 0x6c2b28f0 -//.word 0x0a57d2b2 -//.word 0xcd36fc1a -//.word 0x23cfa8f5 -//.word 0x33f6636c -//.word 0x16b91b86 -//.word 0x44fb31ee -//.word 0x4c5fcff7 -//.word 0xc9687cdd -//.word 0x91deed4e -//.word 0x2f731e28 -//.word 0x94a6a285 -//.word 0x09e838f5 -//.word 0x68fd9e0a -//.word 0x8ca6aa1a -//.word 0x067d9640 -//.word 0x11209ca4 -//.word 0xc991c2fc -//.word 0x97ddf853 -//.word 0xf0fc6009 -//.word 0x3ff9ed1c -//.word 0x1f532fa5 -//.word 0xcea26da6 -//.word 0xde7df502 -//.word 0x2e9cb0cd -//.word 0x193af9c6 -//.word 0xedbdaf22 -//.word 0x9f99898c -//.word 0xbd72aa69 -//.word 0xa3817660 -//.word 0xf238a31a -//.word 0x3e299346 -//.word 0x0724e1e1 -//.word 0xeb9f3ab4 -//.word 0x195b6e1e -//.word 0x0945c613 -//.word 0x6b9b9965 -//.word 0x5d4f1a42 -//.word 0xe0b074ff -//.word 0x8d471913 -//.word 0x84ff5667 -//.word 0xa68a2ccd -//.word 0x04ff5bcd -//.word 0x96c8bfa8 -//.word 0x31bbdf97 -//.word 0xb387c454 -//.word 0x815207db -//.word 0x33a02e72 -//.word 0x8d7739e7 -//.word 0xb1c17719 -//.word 0x94f19eb9 -//.word 0xafe91b52 -//.word 0xf71ba787 -//.word 0x0eef1b9d -//.word 0xbb658539 -//.word 0x98fc7b6a -//.word 0x0ad2afe9 -//.word 0x760cc4a0 -//.word 0xb278606a -//.word 0xba71831a -//.word 0xa50417be -//.word 0xd751c825 -//.word 0x7733159e -//.word 0x2423a703 -//.word 0xe359e2f6 -//.word 0x5c35bb6b -//.word 0x47dec967 -//.word 0x21299e06 -//.word 0x23bc57c3 -//.word 0x747372f4 -//.word 0x9e02e094 -//.word 0x3fdc5b45 -//.word 0x0154fa95 -//.word 0xcb020381 -//.word 0x39690038 -//.word 0x4ad61521 -//.word 0x598b901e -//.word 0x4f1dc213 -//.word 0x161b0ea2 -//.word 0x51f03f39 -//.word 0x4a0b1e4f -//.word 0x2b3d45ea -//.word 0x72622e65 -//.word 0x9f438f70 -//.word 0x2fbbea58 -//.word 0xce195f89 -//.word 0xc9c6c651 -//.word 0xc228fae6 -//.word 0xa7c577ab -//.word 0xe5ac28af -//.word 0xd8117a76 -//.word 0x8637b5fd -//.word 0x8e938cf8 -//.word 0x5b2ef35e -//.word 0x9d4b3027 -//.word 0xfa4a3555 -//.word 0x00cc2d31 -//.word 0x5f1855d7 -//.word 0x55bd0df4 -//.word 0x69792fcf -//.word 0x5c5a9f86 -//.word 0x5d23239a -//.word 0x7cf175ae -//.word 0x611e978c -//.word 0x3e666769 -//.word 0x0248736a -//.word 0xd0af0e67 -//.word 0xafd2a4ee -//.word 0x83594a8b -//.word 0x3cc19946 -//.word 0x4d01bd6e -//.word 0x5f6ec995 -//.word 0x47dc4ddc -//.word 0x36062b71 -//.word 0x3030a655 -//.word 0xc00abc63 -//.word 0xe9d8b68e -//.word 0x5fd0fd6a -//.word 0xf8c32fee -//.word 0x5d007278 -//.word 0x05760911 -//.word 0x641825f2 -//.word 0x5f86fd48 -//.word 0x04e92035 -//.word 0x781e0a17 -//.word 0x3018f60c -//.word 0x647ff4b6 -//.word 0xc19d3b3b -//.word 0x5f7bc090 -//.word 0xf24708f8 -//.word 0x44f93ac7 -//.word 0xe337786c -//.word 0x16756fae -//.word 0x16602d36 -//.word 0x7b7d334e -//.word 0xf50dcce8 -//.word 0x3c359de2 -//.word 0x4a5b7c88 -//.word 0xc7d3865b -//.word 0xc5bb6b11 -//.word 0xad230ddc -//.word 0x79724aef -//.word 0x2404153f -//.word 0x5f18cc86 -//.word 0x86eac58e -//.word 0xd21c2bac -//.word 0xd05a088a -//.word 0x123ea22a -//.word 0x24710b28 -//.word 0xc114f440 -//.word 0x475ec20f -//.word 0x6986e41e -//.word 0x24e3631c -//.word 0xf452ba6b -//.word 0x47d8e9df -//.word 0x3288c5c2 -//.word 0x63a7921b -//.word 0x570fd32f -//.word 0xcdd16149 -//.word 0x7a1ebbb7 -//.word 0xfe689d15 -//.word 0x17c4d4ce -//.word 0x149350df -//.word 0x8d617bde -//.word 0x520dc93b -//.word 0xa12a90c7 -//.word 0x9ca61b72 -//.word 0xf9a9fa59 -//.word 0xfcc09b00 -//.word 0xa23b1fdb -//.word 0x20d46614 -//.word 0x8b916c88 -//.word 0xd9ebd913 -//.word 0x082fd30d -//.word 0x9d251714 -//.word 0x50f0480c -//.word 0x06358665 -//.word 0xff7f439c -//.word 0x51e25205 -//.word 0x95df41c7 -//.word 0xe088e928 -//.word 0xf5e4430b -//.word 0xb8957eb6 -//.word 0xe6b84ed9 -//.word 0x040d86cc -//.word 0x9558e919 -//.word 0x90073d3a -//.word 0x1114a2a4 -//.word 0x4f2d2204 -//.word 0xce1389c8 -//.word 0xd64077e1 -//.word 0x23ccb3c7 -//.word 0xde91c2be -//.word 0xcc8eb959 -//.word 0xc6894f3c -//.word 0x69f83625 -//.word 0x0e22ac2e -//.word 0xfc824d4c -//.word 0xdd6c2b1c -//.word 0x6ff320df -//.word 0x7c0963c2 -//.word 0x0ce85a64 -//.word 0xd9b1af92 -//.word 0x0353a655 -//.word 0x05afae2e -//.word 0xe8fa36a0 -//.word 0xb762c1ef -//.word 0x32f43d28 -//.word 0xc6bd9061 -//.word 0xbd2f7542 -//.word 0xb3c786c4 -//.word 0x49ed9939 -//.word 0x1d1c508d -//.word 0xf942eccb -//.word 0x4a6a62e2 -//.word 0xd498b1aa -//.word 0xa5f47222 -//.word 0x472bb1fc -//.word 0x3a13fb5b -//.word 0xa18eb8db -//.word 0x3cb0bcd2 -//.word 0x962418d5 -//.word 0x80cb367e -//.word 0xbda7256d -//.word 0xfff8318d -//.word 0x13a4b798 -//.word 0x58dc37de -//.word 0x75fdab42 -//.word 0x4bb41785 -//.word 0x296662c7 -//.word 0x3fcf644a -//.word 0x56e9407a -//.word 0xbe0ff42a -//.word 0x87622e21 -//.word 0xf46c62d5 -//.word 0x2c031976 -//.word 0x33708c2e -//.word 0x19d171a8 -//.word 0x71bc15cf -//.word 0x0525abd8 -//.word 0xc882e382 -//.word 0x0c2cbf9c -//.word 0xf509a3c8 -//.word 0x2e68ab80 -//.word 0xda2c4056 -//.word 0xce2dee80 -//.word 0xfddb7093 -//.word 0x33250d8f -//.word 0x0799281c -//.word 0x0bcc1213 -//.word 0x45fc2240 -//.word 0xe3f40867 -//.word 0x2a305e84 -//.word 0xb0428057 -//.word 0xcb749e20 -//.word 0x49af0fa8 -//.word 0x619be880 -//.word 0xea08ce8d -//.word 0xcb8d08c5 -//.word 0xb36ed833 -//.word 0x0ac30c41 -//.word 0x27d7d036 -//.word 0xc3cfc6fe -//.word 0xad8c592a -//.word 0xc0d24e37 -//.word 0x13a99b13 -//.word 0x6f037ddd -//.word 0x06a0c5ec -//.word 0x612f7214 -//.word 0x9bb68524 -//.word 0xcd3311b3 -//.word 0xc984921d -//.word 0x0b847fc8 -//.word 0xec7723ac -//.word 0x19a8a812 -//.word 0x4450759b -//.word 0x19baba85 -//.word 0x74a5482a -//.word 0xd1eaa7c9 -//.word 0x045e6289 -//.word 0x2afaa6bb -//.word 0xdf390b60 -//.word 0xb1c2b2eb -//.word 0xd5479048 -//.word 0x19ad091c -//.word 0x1a6dc14f -//.word 0xb73aafc8 -//.word 0xc5e47377 -//.word 0x047ce999 -//.word 0x52b9fe37 -//.word 0x1f9ac2f0 -//.word 0x214dbff9 -//.word 0x49508a62 -//.word 0xf5d6979b -//.word 0x676c5136 -//.word 0x76dc6aee -//.word 0x835170e9 -//.word 0xafbda23a -//.word 0x4b7801aa -//.word 0x912aaab8 -//.word 0x91ea62de -//.word 0x6da77316 -//.word 0xc9c7b79d -//.word 0x7e0ff2f7 -//.word 0x8ec36433 -//.word 0x5d0e9f70 -//.word 0x1ea397a0 -//.word 0x8ba5f88c -//.word 0xd9c5bc19 -//.word 0xebaafcc9 -//.word 0xc6950684 -//.word 0x4545b199 -//.word 0x0d18ed00 -//.word 0xc4749ee2 -//.word 0x7e65ab5a -//.word 0x7887517e -//.word 0x0927be99 -//.word 0xd5a5dbbb -//.word 0x441c6974 -//.word 0x33454fdc -//.word 0xe99932d6 -//.word 0x4cb64796 -//.word 0x54046561 -//.word 0xc1985f94 -//.word 0x095990e8 -//.word 0x9561b7f4 -//.word 0x2ca606f4 -//.word 0xb0d975c8 -//.word 0x088e5c40 -//.word 0x5d9e4196 -//.word 0x89c9ee3c -//.word 0xcca0c7d8 -//.word 0xc1a35b8e -//.word 0x91a6397d -//.word 0x6779058c -//.word 0x24c7cb66 -//.word 0x533f92c3 -//.word 0x5ff235ea -//.word 0x03fc6e73 -//.word 0x03673452 -//.word 0x1a4c4711 -//.word 0x333b095d -//.word 0xdcdd8fc4 -//.word 0xf7d8f8bd -//.word 0xb2f3fde9 -//.word 0xba7bca98 -//.word 0xace50c8f -//.word 0xcdb44c09 -//.word 0xfa9e7bfb -//.word 0xe2eace9c -//.word 0x721ccc25 -//.word 0x91d4a5d5 -//.word 0x0ef4c539 -//.word 0xd601a9aa -//.word 0x6bccf117 -//.word 0x9151b705 -//.word 0x4bdf20d3 -//.word 0x05793043 -//.word 0x137de336 -//.word 0x5a8379b7 -//.word 0x4d88113b -//.word 0x1c4c7927 -//.word 0x27f84593 -//.word 0xb9041e4e -//.word 0xf3585d22 -//.word 0x06b1d959 -//.word 0xa647fc7f -//.word 0xbbad1d6a -//.word 0x59f80978 -//.word 0xf223e318 -//.word 0xcab22f8c -//.word 0xac9629ed -//.word 0xdc515b6f -//.word 0x4c5a6ee6 -//.word 0x12c34189 -//.word 0x1a1938f6 -//.word 0x188cd777 -//.word 0xc14f8f84 -//.word 0x3b42d789 -//.word 0xd2cf7fe9 -//.word 0xec114142 -//.word 0x3f3c9af3 -//.word 0x4139d8db -//.word 0xe0907364 -//.word 0x748ba0c0 -//.word 0xf2992473 -//.word 0x62f06612 -//.word 0x9376c94a -//.word 0x0de23823 -//.word 0x471e0386 -//.word 0x1af0e9fe -//.word 0x76da76bb -//.word 0x543f8fdc -//.word 0xebc64bee -//.word 0x270404af -//.word 0x5755ae18 -//.word 0x260a689b -//.word 0xccca51aa -//.word 0x85329d78 -//.word 0x42bfe803 -//.word 0x9feec952 -//.word 0x16a1abfb -//.word 0x72c5d8e9 -//.word 0x8632d75c -//.word 0x1ed2f831 -//.word 0x36062d64 -//.word 0x6a451bd3 -//.word 0xae077145 -//.word 0x3fe179aa -//.word 0xdaf1eda5 -//.word 0x2b7c0b47 -//.word 0x88d6eb1e -//.word 0xdf82116e -//.word 0xed9b3fbe -//.word 0xb1728c96 -//.word 0x2179ba88 -//.word 0x1b60c56d -//.word 0x9e7db8f1 -//.word 0x3a71c452 -//.word 0xc5099364 -//.word 0x5062dad9 -//.word 0x59512ebf -//.word 0x4301184a -//.word 0x03de6bd4 -//.word 0x1bb2d522 -//.word 0xcc0eb5e9 -//.word 0x87ec2c90 -//.word 0xa6927738 -//.word 0x59ba7cfa -//.word 0xe3efa26f -//.word 0x063ae676 -//.word 0xbbfe2c31 -//.word 0x2721d251 -//.word 0xcb6c8b94 -//.word 0xfb356b8b -//.word 0x913b3ea1 -//.word 0xe2d11e59 -//.word 0xf13f45d7 -//.word 0xe3651fa2 -//.word 0xb3a1a3a8 -//.word 0x27f3e483 -//.word 0x035fe3fa -//.word 0x7c93a8cb -//.word 0xefca91a8 -//.word 0xd3f0e97f -//.word 0xed07bcfe -//.word 0xc2c9ea57 -//.word 0x528f7b40 -//.word 0x0371323e -//.word 0xdcaf6524 -//.word 0xf3500cd6 -//.word 0x29081753 -//.word 0x145f05f3 -//.word 0x3d10b2ed -//.word 0x8caf701b -//.word 0x008f5a02 -//.word 0xa3e3e50d -//.word 0xbe23b819 -//.word 0x49b2be36 -//.word 0xa5bd79ac -//.word 0x8e66993d -//.word 0x4b22cdaa -//.word 0x275fd979 -//.word 0x256be9f4 -//.word 0xf0912475 -//.word 0x118585e1 -//.word 0x6402e673 -//.word 0xcdb15ebb -//.word 0x274dcde6 -//.word 0x7d05b53f -//.word 0x7d214cf6 -//.word 0x29e9cf20 -//.word 0xd0c21800 -//.word 0x3d9b7385 -//.word 0x2e87ae13 -//.word 0x08ab6f87 -//.word 0xc85bca75 -//.word 0x3d8013b3 -//.word 0x753df11c -//.word 0x75d2b48e -//.word 0x2cc0e935 -//.word 0xaa2e2b0c -//.word 0x8e8b3ca0 -//.word 0xbd755418 -//.word 0x5ad9b872 -//.word 0xf25c8f0f -//.word 0xf6faf172 -//.word 0x6fed4245 -//.word 0xedd1be9c -//.word 0xc005547e -//.word 0x6b54b8a2 -//.word 0x56d5b476 -//.word 0xc30fbf65 -//.word 0x0361d05a -//.word 0xeaa27480 -//.word 0x80041f4d -//.word 0xf93ebfbe -//.word 0xe8ea97e4 -//.word 0xaf2b4b9f -//.word 0x3a9437aa -//.word 0xed4505d7 -//.word 0xda577f9c -//.word 0x387ba1cf -//.word 0x10ddf3ae -//.word 0x3a4f1622 -//.word 0x88a39c45 -//.word 0x41581d21 -//.word 0xd17a86bb -//.word 0xbec3b550 -//.word 0xde0643de -//.word 0xc8cea1e6 -//.word 0x88426770 -//.word 0x974be851 -//.word 0x0af90aa9 -//.word 0x092355af -//.word 0x834e49b1 -//.word 0x20d0f556 -//.word 0x7736c527 -//.word 0x82e29c4d -//.word 0x4ef9229c -//.word 0xf77c60d1 -//.word 0xd4b48a18 -//.word 0xefd41bd2 -//.word 0xb8da2794 -//.word 0xfab6ed73 -//.word 0x0daead7f -//.word 0x4e01b98d -//.word 0xcccacd3a -//.word 0x4428a32c -//.word 0x509cc39b -//.word 0xdbb29910 -//.word 0xd8e4c96d -//.word 0x33bbc72e -//.word 0x0837a2ee -//.word 0x1471202d -//.word 0x697f1050 -//.word 0x6598dce9 -//.word 0xe4785e39 -//.word 0xb506f4f4 -//.word 0x4b35d743 -//.word 0xb528a80f -//.word 0xd1994c7d -//.word 0xbc7bfab5 -//.word 0x8cde92e8 -//.word 0x42143191 -//.word 0xfa1202fb -//.word 0x65185703 -//.word 0x7995f81f -//.word 0x6745ba9f -//.word 0xce9c5433 -//.word 0x2e676fae -//.word 0x9fb1fc09 -//.word 0xc3e3caab -//.word 0xf93058e7 -//.word 0xd330e8c7 -//.word 0xcbcbd408 -//.word 0x31592565 -//.word 0x68076219 -//.word 0x527da69f -//.word 0x09bef5bc -//.word 0xd04fd0bf -//.word 0x499b0708 -//.word 0xe896cfc7 -//.word 0xa7a11406 -//.word 0xfbae11ea -//.word 0x07a41d35 -//.word 0x1005c810 -//.word 0x32ce2608 -//.word 0x519e6b56 -//.word 0x521bb863 -//.word 0x8a91358b -//.word 0x76dd6021 -//.word 0xad8aa5b4 -//.word 0x14392e91 -//.word 0x5146fc89 -//.word 0x82a837f5 -//.word 0x2e19c2f7 -//.word 0x7b781302 -//.word 0xa26b429c -//.word 0xa1485f62 -//.word 0x3036094d -//.word 0xf58f3c35 -//.word 0xfb896b93 -//.word 0x6116cf8b -//.word 0x4f08fe2a -//.word 0x2e79bfec -//.word 0x196a1d81 -//.word 0x8eaabad0 -//.word 0x6afa663d -//.word 0x146ef027 -//.word 0xf8163cb5 -//.word 0x37de96d3 -//.word 0x9cb34677 -//.word 0xd3e76529 -//.word 0xd5d7efc2 -//.word 0xa7cb1974 -//.word 0x441de40a -//.word 0xd89ef271 -//.word 0x2e359878 -//.word 0x6cc936d4 -//.word 0xfe61c367 -//.word 0xd08aacc2 -//.word 0xc0fadfe8 -//.word 0x53722254 -//.word 0xa6e9aa3e -//.word 0xa8e6e91b -//.word 0x872ea763 -//.word 0x689f5496 -//.word 0x5b5c9d81 -//.word 0x8e2a3dbe -//.word 0xc11a167a -//.word 0xf969807a -//.word 0x79a4e160 -//.word 0xee0f7e2b -//.word 0xea4890fe -//.word 0x93289b22 -//.word 0x9deafb4d -//.word 0x758fbf25 -//.word 0xbf80bb00 -//.word 0x0376d9ee -//.word 0xa397b0f9 -//.word 0x11e258ab -//.word 0x3ecc7cd1 -//.word 0x562bb07f -//.word 0xaa540554 -//.word 0xee80dbff -//.word 0xa475f702 -//.word 0xd862d6b6 -//.word 0x0e0a4090 -//.word 0x792420a2 -//.word 0x6d029265 -//.word 0x17723eb5 -//.word 0x6ce2e51d -//.word 0x5fc73955 -//.word 0x573ff209 -//.word 0xe0f41edc -//.word 0xa044b8ad -//.word 0x8ea07d19 -//.word 0x5e32fb41 -//.word 0x3fc3ebcd -//.word 0xc9dbc031 -//.word 0x312a802e -//.word 0xc026d39c -//.word 0x83f65a68 -//.word 0x438f41d9 -//.word 0xb71d1817 -//.word 0xf9a4deed -//.word 0x37e75fce -//.word 0xab89c116 -//.word 0xcd725993 -//.word 0xc774c344 -//.word 0x292e3160 -//.word 0xde31039a -//.word 0x5f6298a4 -//.word 0x26a064f2 -//.word 0x66a643c0 -//.word 0xf9320d56 -//.word 0x99676b8b -//.word 0x546fe988 -//.word 0x3a664cce -//.word 0x5973257b -//.word 0xeb38a6c8 -//.word 0xcd6db5d7 -//.word 0x33c73fac -//.word 0x9b1fcf79 -//.word 0xffd05f1e -//.word 0x4f616ef0 -//.word 0x1e6452b9 -//.word 0x9c9dd001 -//.word 0xc467ea8c -//.word 0xd654f824 -//.word 0x0814fa99 -//.word 0x78982d05 -//.word 0x6676dc54 -//.word 0xa0907904 -//.word 0x3df1ec2a -//.word 0x8ef72bb6 -//.word 0x52b70bf7 -//.word 0x299d5662 -//.word 0x4c531d8f -//.word 0x7ae44f84 -//.word 0x36228b36 -//.word 0x2f45334d -//.word 0x00d4c228 -//.word 0x19c95f21 -//.word 0xfdf0b212 -//.word 0xaf90f618 -//.word 0x664d4f96 -//.word 0x884d5e7d -//.word 0xd69a13cb -//.word 0xe4c7c352 -//.word 0xcdd77bbb -//.word 0x245a93ca -//.word 0x2ed986e4 -//.word 0x4e7401ce -//.word 0xc0ca39b7 -//.word 0x8a198279 -//.word 0xb0a61e1c -//.word 0xa860529b -//.word 0x0dc0bfeb -//.word 0x98f3f03a -//.word 0x4b3b3075 -//.word 0xef939e0c -//.word 0xc19283f9 -//.word 0x6991e2ff -//.word 0x2b10512f -//.word 0x615608b1 -//.word 0x295838c1 -//.word 0x5bdc9ef8 -//.word 0xbede57cd -//.word 0x7b33f65b -//.word 0xd16cd465 -//.word 0x0bfda797 -//.word 0xaf9f560e -//.word 0xf9f20c1b -//.word 0x87678c44 -//.word 0x565dc48c -//.word 0xed8aa4f5 -//.word 0xd89d3042 -//.word 0x5821d401 -//.word 0x59a5f8c9 -//.word 0xa41ad5c1 -//.word 0x567c8761 -//.word 0x91b5637d -//.word 0x71be8a7f -//.word 0x4207bef4 -//.word 0xf019754a -//.word 0xbe7a2cd7 -//.word 0x3bd0fe1e -//.word 0x734a754e -//.word 0x623ca00c -//.word 0xae096672 -//.word 0x95461958 -//.word 0x231c4fd2 -//.word 0xa9eeedf9 -//.word 0x6c3c84ef -//.word 0x9ac8e11d -//.word 0x82f7dfbf -//.word 0x037980a3 -//.word 0x452c3c2d -//.word 0xa83e999f -//.word 0xfa93fc97 -//.word 0xed66bfda -//.word 0xc832834f -//.word 0x5cd3c84f -//.word 0x3ae8bb1c -//.word 0x237d4eae -//.word 0xc0e78eb6 -//.word 0x93ee32dd -//.word 0x2e326f4c -//.word 0xa3c71472 -//.word 0x3b23d201 -//.word 0x6b3adb3a -//.word 0x03e7b06b -//.word 0xa98e33b6 -//.word 0x86000413 -//.word 0x3f9e0a98 -//.word 0x27c250f9 -//.word 0xb35a134b -//.word 0x2ed6190d -//.word 0xad454468 -//.word 0x46ba66b6 -//.word 0x7df55742 -//.word 0xff3f454e -//.word 0x93964c5b -//.word 0x4d0a46a4 -//.word 0x0467e5ec -//.word 0x0714ff79 -//.word 0x0c3b2861 -//.word 0x692a8604 -//.word 0x87fae1da -//.word 0x936efa6f -//.word 0x761d1eab -//.word 0x08d4fa57 -//.word 0x8036b1dd -//.word 0x30a52c4f -//.word 0x6f66b2ab -//.word 0xd6ffb85e -//.word 0xafe4fa06 -//.word 0xaa53ca7c -//.word 0xd27da812 -//.word 0xc0e61419 -//.word 0x0e0ea0a7 -//.word 0x0f514997 -//.word 0xbd0c07d0 -//.word 0xf301a3cb -//.word 0xddfdc94f -//.word 0xacb85e7f -//.word 0x8efc1317 -//.word 0xdd093bf3 -//.word 0x9639dad1 -//.word 0x0ee0fe57 -//.word 0xe0765258 -//.word 0x2af8f053 -//.word 0xf98b773c -//.word 0x01635d7f -//.word 0x92e38743 -//.word 0xc70517eb -//.word 0x01fd86e3 -//.word 0x9319f299 -//.word 0xbfecb9c9 -//.word 0xe2ab46fe -//.word 0xebd72b56 -//.word 0x111c7085 -//.word 0xc67a2b1c -//.word 0xe6a2510c -//.word 0x35a3cc65 -//.word 0x08c5ce64 -//.word 0x42b564ad -//.word 0x82e34ed5 -//.word 0x9b290e23 -//.word 0x45ad3f98 -//.word 0x1208282c -//.word 0xa3a8915b -//.word 0x1b72d5e0 -//.word 0xd4ac39c1 -//.word 0x511b7c8b -//.word 0x7468b0df -//.word 0xf1c9482d -//.word 0x03dd71c0 -//.word 0x5ed7a6fb -//.word 0x64de7ee2 -//.word 0x9bb4c9dc -//.word 0x5f96dcb6 -//.word 0xd46429ec -//.word 0x1f021324 -//.word 0xd6fe00fc -//.word 0xb473af05 -//.word 0x922dcc0f -//.word 0x920dc1a8 -//.word 0x9eafd0df -//.word 0x114b5e4e -//.word 0xb3d99257 -//.word 0xeb791fad -//.word 0x30115e16 -//.word 0xc138a070 -//.word 0x9653c2f2 -//.word 0x96fd02b5 -//.word 0x0aad1073 -//.word 0x5292698e -//.word 0xd6c2e054 -//.word 0x40947d81 -//.word 0xe94a8b05 -//.word 0x90f4ed08 -//.word 0x5291b12c -//.word 0xd676e812 -//.word 0xc9f4b41f -//.word 0x8a35a280 -//.word 0x26673a6b -//.word 0x861cd5a8 -//.word 0xe7f1af51 -//.word 0x8b6e3dd6 -//.word 0xae2ec143 -//.word 0xbc401bc6 -//.word 0xc1cce26c -//.word 0x21fab32b -//.word 0x890fc925 -//.word 0x25dace2b -//.word 0x144ef180 -//.word 0x197039e0 -//.word 0x937419c1 -//.word 0xaf2244d9 -//.word 0xdc7fc2e0 -//.word 0x7faa4497 -//.word 0xe804b509 -//.word 0x85931111 -//.word 0x56a97a1c -//.word 0xa1c08930 -//.word 0xe7a9e22e -//.word 0x16e60b54 -//.word 0x00547e05 -//.word 0x0c0dfccd -//.word 0x2c8c25a0 -//.word 0x0f124662 -//.word 0x974972ad -//.word 0x8d27d4ce -//.word 0x94164310 -//.word 0x5b52173e -//.word 0x17923b63 -//.word 0x31ea84d4 -//.word 0x3bf04170 -//.word 0x291e1427 -//.word 0xbe7700b9 -//.word 0x446dc2c0 -//.word 0x800365f1 -//.word 0xe52f119f -//.word 0x08822480 -//.word 0x540a83b4 -//.word 0xff783303 -//.word 0x3c7e2367 -//.word 0xb37b4cca -//.word 0x2e5afc10 -//.word 0x95b76f58 -//.word 0x1c44a07f -//.word 0xbb6c5ee6 -//.word 0xdf36a276 -//.word 0x5f6b20e1 -//.word 0xb1fb1c2a -//.word 0x5e9d7f67 -//.word 0xb3b62ac6 -//.word 0xb97c8ace -//.word 0x685b6de7 -//.word 0x1898141d -//.word 0x38348921 -//.word 0x42133390 -//.word 0xee5da778 -//.word 0xa725c119 -//.word 0x3b48f4e8 -//.word 0xd698deda -//.word 0x313a1fde -//.word 0x074d6cab -//.word 0xc9ccdfbd -//.word 0x92b6919a -//.word 0x5d6c6b5a -//.word 0x765a3966 -//.word 0x2ed90080 -//.word 0xd3549204 -//.word 0xdfaa5f6d -//.word 0x70d48e1a -//.word 0xf8c84d53 -//.word 0x369d6587 -//.word 0x65ef11d7 -//.word 0xb38510d9 -//.word 0xf431f995 -//.word 0x98f8cfd4 -//.word 0xda73d59b -//.word 0x3b75a3f2 -//.word 0x2fef7ae9 -//.word 0x1610d5dd -//.word 0x6db040f8 -//.word 0x46ee6df7 -//.word 0xf5188530 -//.word 0x0dccbcd3 -//.word 0x8b5d2870 -//.word 0x5078d3b9 -//.word 0xd5080f8a -//.word 0x1a560926 -//.word 0xdf75a1c4 -//.word 0x17dd794a -//.word 0x9a564c58 -//.word 0x1a188288 -//.word 0x583001f4 -//.word 0x972545f9 -//.word 0x51dcb33b -//.word 0x2ab92ae9 -//.word 0x2207dc43 -//.word 0x0e9a5c59 -//.word 0x49b2f715 -//.word 0xa723487b -//.word 0xaab30730 -//.word 0xf9c42239 -//.word 0x0d330f06 -//.word 0x2e7f60af -//.word 0x9e2e987d -//.word 0x146c3dac -//.word 0x6bf62e6f -//.word 0x9c363735 -//.word 0xeaafe32b -//.word 0x5c9c9102 -//.word 0x70d4caf2 -//.word 0x0ef1d2ff -//.word 0xbbb17d7b -//.word 0x0f9d44cc -//.word 0x69e8986f -//.word 0xe199773d -//.word 0x7eed3ced -//.word 0xaaf6bbdb -//.word 0xe2898d07 -//.word 0xb257a961 -//.word 0xe15a3444 -//.word 0xe9739b40 -//.word 0xa951de1c -//.word 0x5e942f1b -//.word 0xd032bb7f -//.word 0xc91ac84c -//.word 0xcb18004e -//.word 0x02f90c5d -//.word 0x78ef65e0 -//.word 0x88376790 -//.word 0x95f8a87f -//.word 0xfc6f8758 -//.word 0x464908e8 -//.word 0xa350dfdd -//.word 0x944acace -//.word 0xe71e247c -//.word 0xe839b858 -//.word 0xd630d345 -//.word 0x94a79d9e -//.word 0xa171a87b -//.word 0x4af9ca30 -//.word 0x1ee02817 -//.word 0xa3e79490 -//.word 0x47101945 -//.word 0x9900d3b3 -//.word 0xb9a804e6 -//.word 0x0d246583 -//.word 0x36e3ba0c -//.word 0x4309a960 -//.word 0x2411cc81 -//.word 0x61b7059a -//.word 0x0c151241 -//.word 0xf40c61f9 -//.word 0x1be525fb -//.word 0x6a38a936 -//.word 0xa40de494 -//.word 0x99424f7f -//.word 0x9c2df3a4 -//.word 0x3681c6f6 -//.word 0x1c7637f6 -//.word 0x5f240832 -//.word 0xe3305c0c -//.word 0x12ab11bd -//.word 0xd1374f9a -//.word 0xb36c6195 -//.word 0x6d7ac406 -//.word 0x8b0f7eac -//.word 0x617bb1ee -//.word 0x43127067 -//.word 0xf9d1d1a2 -//.word 0x6d454422 -//.word 0xa7a923a6 -//.word 0xfb4f8aab -//.word 0x81416831 -//.word 0xc627d6c2 -//.word 0xc16ba8b1 -//.word 0x099c42a0 -//.word 0x4510ae44 -//.word 0xe3ceeb6d -//.word 0x0daa8740 -//.word 0xd8b270c7 -//.word 0xbfc907ad -//.word 0x51927642 -//.word 0x269043c5 -//.word 0x178b26e3 -//.word 0xae35187b -//.word 0xdc0dada4 -//.word 0xea84a3f1 -//.word 0xb25ebbf4 -//.word 0x0f5cc700 -//.word 0x92180533 -//.word 0x7730abb4 -//.word 0xd7a6c33a -//.word 0x1f8739ce -//.word 0xc0cb33d1 -//.word 0x287da040 -//.word 0xf21c1437 -//.word 0x5940d3b4 -//.word 0xf3802c9e -//.word 0x9c940806 -//.word 0xafb7c2ac -//.word 0x7d4f39c5 -//.word 0xf7d024fb -//.word 0xaedea6b6 -//.word 0xfeb2239a -//.word 0x85be5151 -//.word 0xda94928a -//.word 0x7c048141 -//.word 0x0984ca41 -//.word 0xb1d640e8 -//.word 0xe9e4292b -//.word 0x64efdcd9 -//.word 0x3fe88f24 -//.word 0x7c1e6a5d -//.word 0xb11ae0ff -//.word 0x01c73eef -//.word 0x4cd78402 -//.word 0xa36175c0 -//.word 0xffcfea68 -//.word 0x32f76b34 -//.word 0x1d8800dd -//.word 0x24a84562 -//.word 0xdfdbbd06 -//.word 0x12276897 -//.word 0xe07698f6 -//.word 0x3b3b00d4 -//.word 0x9f580eba -//.word 0x00407b4c -//.word 0x015820ce -//.word 0x66a40be7 -//.word 0xcc9fd2a5 -//.word 0x976a27c2 -//.word 0x2d29ad26 -//.word 0x62ab0aac -//.word 0x32493e29 -//.word 0xb61033ab -//.word 0x512294fe -//.word 0x2b59e375 -//.word 0xe02ec6e6 -//.word 0x79d9a2f7 -//.word 0x9bba6b98 -//.word 0xfef8bbd1 -//.word 0x216821be -//.word 0x3cb0bbd8 -//.word 0x77ac0775 -//.word 0x5910f693 -//.word 0x834f42d1 -//.word 0x9ebc02be -//.word 0x92ef7c56 -//.word 0xf86b3aca -//.word 0xd37e6080 -//.word 0x7a683c5b -//.word 0xd9bf1f3c -//.word 0xd9116bc9 -//.word 0x1dccee6d -//.word 0xef5b6e9f -//.word 0x7a928568 -//.word 0x394cb01f -//.word 0xaf52a278 -//.word 0x597fdebd -//.word 0xe122845a -//.word 0x94a46b9f -//.word 0x166b71c2 -//.word 0x54fd0f23 -//.word 0xbb6931d4 -//.word 0xa8e34459 -//.word 0x1fae90ac -//.word 0xbf3fc885 -//.word 0xf59fdfd7 -//.word 0x71111e9e -//.word 0xd6f574d8 -//.word 0xb6ec0dd1 -//.word 0xbd3d25a4 -//.word 0x2c771fff -//.word 0x8958d126 -//.word 0x95ee233b -//.word 0x7ffcd8bc -//.word 0x579fab4d -//.word 0xc5319eb8 -//.word 0xfb6e8f32 -//.word 0xe8d50ce0 -//.word 0xaf516899 -//.word 0x57190eee -//.word 0xc4d51667 -//.word 0xe6021610 -//.word 0x30973b34 -//.word 0x4ce99869 -//.word 0x0dccbdcc -//.word 0xa5fb8c8e -//.word 0x18ba48b0 -//.word 0xf0b9ef0a -//.word 0x333cca92 -//.word 0x927942db -//.word 0xe341f5dc -//.word 0xd1e309f3 -//.word 0xd24ec02a -//.word 0x5a754db8 -//.word 0x4ff8e7cb -//.word 0xbc001b84 -//.word 0xc96a6643 -//.word 0xeb290326 -//.word 0x58e502cc -//.word 0xbee89a5f -//.word 0x343bc0d1 -//.word 0x710cf865 -//.word 0x3b536c72 -//.word 0x23b63b64 -//.word 0x70a91303 -//.word 0x59d902f8 -//.word 0x77cb898c -//.word 0x79c0f3b4 -//.word 0x1adde44b -//.word 0x5088359e -//.word 0xc615ff2d -//.word 0x8da2f6b0 -//.word 0x0f3ff959 -//.word 0x4453e759 -//.word 0x283bb3a5 -//.word 0x6c33bbfa -//.word 0x6b7a551e -//.word 0x61b1ab6a -//.word 0xd784ca85 -//.word 0x628df572 -//.word 0x8d753fcd -//.word 0x145d5951 -//.word 0x537ca89e -//.word 0xfd099a39 -//.word 0x115b3bd5 -//.word 0x0a4f03d1 -//.word 0x57eaf201 -//.word 0x0a3fe0b1 -//.word 0xd4930ee7 -//.word 0x31c000e9 -//.word 0xe0d78fff -//.word 0x96093a7a -//.word 0xf3c8bdf5 -//.word 0xb529e5db -//.word 0x2c8da22a -//.word 0xee805e76 -//.word 0xcbe18d30 -//.word 0x03448528 -//.word 0xb7949051 -//.word 0x9efd40c4 -//.word 0xf9080308 -//.word 0xc908f791 -//.word 0x3fb60086 -//.word 0x741817c8 -//.word 0x5aa7e52f -//.word 0xf3b09017 -//.word 0xc0fbd51b -//.word 0x7dab5720 -//.word 0x0b653696 -//.word 0xaeb4e4fa -//.word 0x78ac349f -//.word 0x05ceb4af -//.word 0x692c3d6c -//.word 0x67cec8bc -//.word 0xe45383e5 -//.word 0x9adb2595 -//.word 0x11257e25 -//.word 0xcbf5521e -//.word 0xbfb967fd -//.word 0x0a6bdd33 -//.word 0xe0b9be70 -//.word 0xc864d621 -//.word 0x09e6c538 -//.word 0x5f57522b -//.word 0xf391023f -//.word 0x8a93ea06 -//.word 0xfd23c126 -//.word 0xe9b8395d -//.word 0xa7968fc2 -//.word 0x7f3b614e -//.word 0x18fac19a -//.word 0x33e687ea -//.word 0x99f1eb6b -//.word 0x525553b9 -//.word 0x183369a4 -//.word 0x0c7a7134 -//.word 0xa70bdaeb -//.word 0xf21b1249 -//.word 0xfad89f96 -//.word 0x7e4f6cdb -//.word 0xec8d6032 -//.word 0x8c04353f -//.word 0xfa3188ff -//.word 0xd97c2cc0 -//.word 0xc660c471 -//.word 0x8bcb911c -//.word 0x95c888b1 -//.word 0xa95ba805 -//.word 0xd2ac8a1a -//.word 0x9e683aa1 -//.word 0x896545bd -//.word 0xba85130a -//.word 0xeddc77de -//.word 0xb11585cf -//.word 0xd311a475 -//.word 0x1ad2e471 -//.word 0x349891ad -//.word 0xf14908e6 -//.word 0xaf16c968 -//.word 0x165cce19 -//.word 0x05c81bb9 -//.word 0xcbbf9768 -//.word 0x9bfd1a69 -//.word 0x3a7cc725 -//.word 0xfb979c73 -//.word 0xed6f4716 -//.word 0x538e3b87 -//.word 0x54ca04f6 -//.word 0xf46cd78b -//.word 0x43926ef1 -//.word 0xd4d21315 -//.word 0x7120fa2b -//.word 0x0df2d3f3 -//.word 0xfaa2a03a -//.word 0x5d13c4a3 -//.word 0xde975da7 -//.word 0xa410d4db -//.word 0x8056b371 -//.word 0x68d9b602 -//.word 0x2888248b -//.word 0x54f15fb5 -//.word 0x81a9ba59 -//.word 0xb4ee8c43 -//.word 0x1b8b8336 -//.word 0xfbfc3a31 -//.word 0xead30df1 -//.word 0x3e5a2cb7 -//.word 0xc57aee4b -//.word 0xb7db6841 -//.word 0xe84d3f7b -//.word 0x4267baef -//.word 0x736d1baa -//.word 0xe3773015 -//.word 0xe9d02578 -//.word 0x3e9d9cbc -//.word 0xb2bfff75 -//.word 0x1dfa1520 -//.word 0x9956d4a8 -//.word 0xeec57730 -//.word 0x4e07d00c -//.word 0x43cbde10 -//.word 0xe517a20e -//.word 0x50e92f9a -//.word 0x551f0110 -//.word 0x70948fd9 -//.word 0xfa8c23e9 -//.word 0xa052ea8c -//.word 0x141f4763 -//.word 0x023e6da9 -//.word 0x466e2dbb -//.word 0x5c880cd8 -//.word 0x18619925 -//.word 0x97f2fef4 -//.word 0x75b6d445 -//.word 0x40543c8d -//.word 0x2d7e2bb7 -//.word 0x0a190569 -//.word 0x749e6e88 -//.word 0x4ac05dfe -//.word 0x624f71bb -//.word 0x7a5c89f9 -//.word 0x719e8fc5 -//.word 0xb71494bb -//.word 0x02ec2211 -//.word 0x42a4cdd7 -//.word 0xd86f0c7c -//.word 0x02da4795 -//.word 0x9aaf31da -//.word 0x01195871 -//.word 0x560afb70 -//.word 0xebda1b9d -//.word 0xf931d478 -//.word 0x9226ee7b -//.word 0xd8a8b0a0 -//.word 0x6d1df424 -//.word 0x2a4a818a -//.word 0x147394e4 -//.word 0x8bc3c04e -//.word 0xc5eef8bb -//.word 0x7b14ebf4 -//.word 0xe2e990dd -//.word 0xdd1301fa -//.word 0x71d38c33 -//.word 0x79e807d4 -//.word 0x9bb065d8 -//.word 0x7a918767 -//.word 0x2d97549d -//.word 0xf15e0c8d -//.word 0x1a33d986 -//.word 0x5076a895 -//.word 0xf742364a -//.word 0xef516ebf -//.word 0x7e19f2d7 -//.word 0x8a3bf8c4 -//.word 0x0c1e57cc -//.word 0xc1d7e14c -//.word 0x234df4fd -//.word 0x979a4c76 -//.word 0xe8b41bf2 -//.word 0xf44c5c54 -//.word 0xa5f66468 -//.word 0x238bba6c -//.word 0x48cb28cf -//.word 0x55471238 -//.word 0xe37f07ca -//.word 0x1c4796a7 -//.word 0x2a6f63b2 -//.word 0xf0a27a9a -//.word 0xf88fe214 -//.word 0xad477667 -//.word 0xcbe6f02e -//.word 0x13764759 -//.word 0x43103b76 -//.word 0x45442d2f -//.word 0xa7bc3513 -//.word 0x4b1b6f99 -//.word 0x602b9561 -//.word 0x9038d3be -//.word 0x7bb7d672 -//.word 0x652c27b8 -//.word 0x2b4ab788 -//.word 0x7c5bbb16 -//.word 0x45e2b99c -//.word 0x6d7fe359 -//.word 0xc314a5d9 -//.word 0x35267a78 -//.word 0x42860322 -//.word 0xb2305a5c -//.word 0x8473a488 -//.word 0x2852e564 -//.word 0xee2b19d5 -//.word 0xbf9680e3 -//.word 0x0b903904 -//.word 0x02d9129d -//.word 0x079a9fc6 -//.word 0x614b894e -//.word 0x34d429fe -//.word 0xb0f25522 -//.word 0x89dd7a46 -//.word 0xa728eb3e -//.word 0x1ee87969 -//.word 0x60184436 -//.word 0xb23cd1e6 -//.word 0xdc455c94 -//.word 0x25b56f73 -//.word 0x7e03b358 -//.word 0xfe410778 -//.word 0x8efccf72 -//.word 0xe6648e90 -//.word 0xb8acb849 -//.word 0x2ab4c10b -//.word 0x8ae67a38 -//.word 0x3d5e9d6f -//.word 0xf94da60c -//.word 0x359fe5f2 -//.word 0xdddbd288 -//.word 0x494ba001 -//.word 0x705e15e1 -//.word 0x594a98bc -//.word 0xd3f58c41 -//.word 0x6616dc78 -//.word 0x8997d748 -//.word 0x153f3f3c -//.word 0xfa8d9c87 -//.word 0x31e7d645 -//.word 0xf2f40303 -//.word 0x26467e82 -//.word 0x1f3c39b8 -//.word 0x87265418 -//.word 0x96abee13 -//.word 0x88683bdf -//.word 0x4fdad677 -//.word 0x857e59e3 -//.word 0xa4362cb9 -//.word 0x79ef9ae4 -//.word 0xd6812aa4 -//.word 0x88d62cd6 -//.word 0x884f9276 -//.word 0x76630162 -//.word 0x428a2860 -//.word 0x2d595163 -//.word 0xf0ee350a -//.word 0x3a8e156a -//.word 0x608d060d -//.word 0x506e8d3a -//.word 0xc84c6b77 -//.word 0xc579ba4d -//.word 0x3d64394b -//.word 0x10c0e54e -//.word 0x3de2c9ff -//.word 0x516b169c -//.word 0x262876fc -//.word 0xc9369ecd -//.word 0xbc6a2221 -//.word 0x5eef8e29 -//.word 0xa731b23f -//.word 0x18fa3d2a -//.word 0xf2db8e9e -//.word 0xa7cec603 -//.word 0x8e192277 -//.word 0xda768816 -//.word 0xcd705f79 -//.word 0x2910a47c -//.word 0xe8b93a45 -//.word 0x2c518282 -//.word 0x79a12cf1 -//.word 0x22ff4d26 -//.word 0x012ab189 -//.word 0x6b75729e -//.word 0x6328c989 -//.word 0x0e2325d1 -//.word 0x68c47a64 -//.word 0x340bdcdb -//.word 0x39fc4c00 -//.word 0xab45d28d -//.word 0xe821cc37 -//.word 0x657c85eb -//.word 0xe7580958 -//.word 0xf66f38ad -//.word 0x8e1a1aa4 -//.word 0x197172bf -//.word 0x9ab496d1 -//.word 0x2bea7dc1 -//.word 0xa9c71a8b -//.word 0xaed3e887 -//.word 0xbfc9c7ee -//.word 0xc73d069a -//.word 0xc482c10d -//.word 0xc1cb6db5 -//.word 0x0490b16f -//.word 0x88347749 -//.word 0xaee4448c -//.word 0x2fc2c4fa -//.word 0x5543aa54 -//.word 0x6bd5b71f -//.word 0x72c617a8 -//.word 0x1561f446 -//.word 0xdf5a46df -//.word 0xac6ce8ad -//.word 0x5d40f142 -//.word 0xd09141ca -//.word 0x108e5a91 -//.word 0xc87f72c5 -//.word 0xfeacc67c -//.word 0xfd7a30f8 -//.word 0x93d8fc2a -//.word 0x7dd9f876 -//.word 0x20a2cab6 -//.word 0x7a878681 -//.word 0x577180ad -//.word 0xc8835f12 -//.word 0xd1fd7391 -//.word 0x62604956 -//.word 0x88d37c59 -//.word 0xe5c5cd2b -//.word 0x5ed476ef -//.word 0x13edbca6 -//.word 0x94b5c4b1 -//.word 0x5228a790 -//.word 0x5380c8f0 -//.word 0x2a5966e5 -//.word 0x27126d74 -//.word 0xcb769254 -//.word 0x7e9c9ef5 -//.word 0x840b0ac2 -//.word 0x2e22cda4 -//.word 0x4db872c7 -//.word 0xecff6da0 -//.word 0x3faeaf2f -//.word 0xd65f7881 -//.word 0x16356d7a -//.word 0xeac3ead1 -//.word 0xb629995c -//.word 0x8d80448e -//.word 0xa379e73e -//.word 0x05400aa9 -//.word 0x87a74dbb -//.word 0xfe80458a -//.word 0xb04a8624 -//.word 0x0911018a -//.word 0x908f91fc -//.word 0x1997d077 -//.word 0x3bb42f7d -//.word 0x040d4614 -//.word 0xec8b6811 -//.word 0x083e7b96 -//.word 0x80fd06da -//.word 0x434d8c28 -//.word 0xf985192b -//.word 0x3a2f1a68 -//.word 0xfdb0710c -//.word 0x532cc9e8 -//.word 0x55a427ba -//.word 0x5a61c2ae -//.word 0x6e961524 -//.word 0x004132b4 -//.word 0xdb52596f -//.word 0x580fc968 -//.word 0xd1b7d674 -//.word 0x58653c2d -//.word 0xa938b33d -//.word 0x5eb1c4d9 -//.word 0x625cda8b -//.word 0xa8b39c35 -//.word 0x1d3f7a53 -//.word 0xdb008680 -//.word 0x9f0f863c -//.word 0x7d8247ec -//.word 0xd2903422 -//.word 0x7bf6261f -//.word 0x44987e96 -//.word 0xa36c72b3 -//.word 0xa794a45c -//.word 0x2bcaf9b7 -//.word 0x4f01a8ec -//.word 0x2949912c -//.word 0xb7f4d1f2 -//.word 0x18f79388 -//.word 0xfc9328ce -//.word 0x5a345b37 -//.word 0x6199fe14 -//.word 0xb035c915 -//.word 0xc9d5650c -//.word 0xc384c3f5 -//.word 0x40abb234 -//.word 0x9f7db11d -//.word 0x739201b9 -//.word 0x33d2ffc7 -//.word 0x3395b102 -//.word 0xd2099fa2 -//.word 0xf5d3e425 -//.word 0xb5f9844f -//.word 0x55ff0070 -//.word 0x775028e5 -//.word 0x8fe031e1 -//.word 0x9710076e -//.word 0x05d2e4ae -//.word 0xfa0d2267 -//.word 0xbc434ebe -//.word 0x66717d43 -//.word 0xde36e32e -//.word 0x0838a1e8 -//.word 0x39c4dfce -//.word 0xefb41b31 -//.word 0xbf96c0a1 -//.word 0x8e0afb6b -//.word 0x046cca60 -//.word 0x3eb356d8 -//.word 0xc39982f7 -//.word 0xbafdc42f -//.word 0x5a853406 -//.word 0xa187e21a -//.word 0x492a6d62 -//.word 0xf8c8d1b6 -//.word 0xb7978192 -//.word 0xa589b617 -//.word 0xec700652 -//.word 0xf56638c1 -//.word 0xd86c5713 -//.word 0x17510530 -//.word 0x8bd61279 -//.word 0x9e0f4d51 -//.word 0xbb0c9adc -//.word 0x03b94506 -//.word 0x420396c8 -//.word 0x213ca6a7 -//.word 0x9dc1707d -//.word 0xb7da2b7b -//.word 0x6de1d86f -//.word 0xeaa71743 -//.word 0xfa133ec6 -//.word 0xc00cacb0 -//.word 0xab995be0 -//.word 0xa647b5e7 -//.word 0x8fcca9ca -//.word 0xebe9fd04 -//.word 0xd895e6cb -//.word 0x4257d694 -//.word 0x5af495d9 -//.word 0x444a931a -//.word 0x107c7d22 -//.word 0xec4f0e8b -//.word 0x98d42884 -//.word 0x1a4823d2 -//.word 0xb2386515 -//.word 0x10e8324d -//.word 0xc5f6c69c -//.word 0xf83ba14e -//.word 0x5af22316 -//.word 0x5c1c589a -//.word 0x9f231532 -//.word 0xabbd44ed -//.word 0xe5137cd6 -//.word 0xbb23d575 -//.word 0x2262fa98 -//.word 0x42a67f53 -//.word 0x6f447545 -//.word 0x5c753c1d -//.word 0x8bff995d -//.word 0x0811085e -//.word 0x576e5494 -//.word 0xabcd6414 -//.word 0x59805853 -//.word 0x8b55d531 -//.word 0x39ba9c36 -//.word 0x5524621b -//.word 0x46b1dc8c -//.word 0x980c192c -//.word 0xf29114da -//.word 0x48b18a33 -//.word 0x51980957 -//.word 0x3c0e4af0 -//.word 0x9f9bc071 -//.word 0xb0ef719c -//.word 0xb7800547 -//.word 0xc3751c5f -//.word 0x9cc3e52d -//.word 0xfa96edd8 -//.word 0xf4f2342c -//.word 0xbb9a8699 -//.word 0x8831087f -//.word 0xd39f12a9 -//.word 0xc6b63c17 -//.word 0xf116bc00 -//.word 0x3f4def17 -//.word 0x2943350e -//.word 0x29d60258 -//.word 0x72c13234 -//.word 0xdec29de7 -//.word 0x28fcec48 -//.word 0x5b9aab82 -//.word 0x8ab59f16 -//.word 0xc277591f -//.word 0x3d810bda -//.word 0xd88b9b65 -//.word 0xc74af6c7 -//.word 0x8897a731 -//.word 0x15cda884 -//.word 0x5e737712 -//.word 0xf61b6da9 -//.word 0x0d894cce -//.word 0x9e181746 -//.word 0xe95a26db -//.word 0x24ff795c -//.word 0x6ef84de6 -//.word 0x04dced62 -//.word 0xb78acb4f -//.word 0x9e10cfc2 -//.word 0x08cbefaa -//.word 0xb4d00080 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00016DF8 -//// expected output -//.word 0xc8a7f49e -//.word 0x8f5e69ab -//.word 0x5c99cccd -//.word 0xcdea01c6 -//.word 0x07657140 -//.word 0x43896cd5 -//.word 0x60afe968 -//.word 0xef583ab4 -//.word 0xcfa6e16b -//.word 0x8600e930 -//.word 0x633ea7c6 -//.word 0x304c288b -//.word 0x4f960937 -//.word 0xe36490d9 -//.word 0x6459b1be -//.word 0x8149b3f1 -//// SHA512LongMsgvector_118 -//// vector length -//.word 0x00017110 -//// input message -//.word 0x21bcd76d -//.word 0xe4058121 -//.word 0xfa75603a -//.word 0xd1cffbb2 -//.word 0xc9015513 -//.word 0x98fb6fe8 -//.word 0xedc10f72 -//.word 0x53bfc09d -//.word 0x585e1a32 -//.word 0xefd4434e -//.word 0x1440b613 -//.word 0xaef6439d -//.word 0xb9175738 -//.word 0xa4667ed0 -//.word 0xf85626a9 -//.word 0x3b68a650 -//.word 0x14b37fd1 -//.word 0xb0c4e12a -//.word 0x63a97100 -//.word 0x93494991 -//.word 0xd2f740ea -//.word 0x4a466c59 -//.word 0x5e1ee626 -//.word 0x8e0fcd7e -//.word 0x9be68eb0 -//.word 0xec7e629c -//.word 0x31d91867 -//.word 0x466f1474 -//.word 0x5ac69890 -//.word 0x5043426d -//.word 0x6540d652 -//.word 0x145f3e10 -//.word 0x371dcf38 -//.word 0x6eaace8b -//.word 0xc4f833b2 -//.word 0x9011ac30 -//.word 0x9aafe594 -//.word 0x7f0607f3 -//.word 0x57e57f95 -//.word 0x94fd00ef -//.word 0x2d80cbd1 -//.word 0xfdef2ee1 -//.word 0x662d4a48 -//.word 0x39d71aab -//.word 0xdad8b15d -//.word 0x9f37c3d3 -//.word 0x7a346758 -//.word 0xd8941b01 -//.word 0xc83909e4 -//.word 0x60f58985 -//.word 0x5ca0e691 -//.word 0x096865cf -//.word 0x62698353 -//.word 0x787e7ff5 -//.word 0x17561801 -//.word 0xa6ca9830 -//.word 0x4f6d11d7 -//.word 0x6065e75f -//.word 0xf17a8ef5 -//.word 0xc86d9582 -//.word 0x798be4de -//.word 0xd1814241 -//.word 0x75721afa -//.word 0xc7477e63 -//.word 0x09476c14 -//.word 0xc5e75057 -//.word 0x6ce3cbdc -//.word 0x3d8db3ae -//.word 0x68655b66 -//.word 0x74eb149f -//.word 0xdeb1f3a9 -//.word 0x03b4d582 -//.word 0x3feca101 -//.word 0x5722cd55 -//.word 0x140224ae -//.word 0x3171c63a -//.word 0x78217053 -//.word 0x2762fdf7 -//.word 0x983b2d78 -//.word 0x21b9a674 -//.word 0x3a873808 -//.word 0xddbf6541 -//.word 0x330021d3 -//.word 0x6cc1d60e -//.word 0xeee4ab0d -//.word 0xb38e0631 -//.word 0xec374fce -//.word 0xebfdf823 -//.word 0x3f3eba90 -//.word 0x21652103 -//.word 0x0f044ab4 -//.word 0xb624ec12 -//.word 0x15d995fc -//.word 0xe0193635 -//.word 0x22cde212 -//.word 0x2729d376 -//.word 0x9939ae00 -//.word 0xe9bd0783 -//.word 0xf03728b7 -//.word 0xd7420e2e -//.word 0x3425b589 -//.word 0x75a896eb -//.word 0x82276dae -//.word 0x9ee43f55 -//.word 0x8ea19cc2 -//.word 0xfe6f22aa -//.word 0x20c14245 -//.word 0x96c4474a -//.word 0x92f3931a -//.word 0x3ce62c3b -//.word 0x546a7809 -//.word 0x18d745a8 -//.word 0x689e0c3d -//.word 0x2822775e -//.word 0xe6c920c7 -//.word 0xbc529c4e -//.word 0x7869b819 -//.word 0xfb78020e -//.word 0xdfc18c8b -//.word 0x5daaec57 -//.word 0x6d5787d9 -//.word 0x2e7e1088 -//.word 0x89774ba3 -//.word 0x11931722 -//.word 0x2eafabec -//.word 0x7b09204a -//.word 0x6c52309c -//.word 0x34043d4b -//.word 0xe6f594fe -//.word 0xda2df411 -//.word 0x52f44a43 -//.word 0x5d30bfae -//.word 0xfceef4fd -//.word 0x843f8cd9 -//.word 0x4345eca4 -//.word 0x668d3e6a -//.word 0x1a9fbc14 -//.word 0xf2d42bdf -//.word 0x8968a50d -//.word 0x68d09cdb -//.word 0x2a4e1cb2 -//.word 0xdec250a1 -//.word 0xacc3480b -//.word 0xbceef99d -//.word 0x537e8683 -//.word 0x3f1ebedc -//.word 0x76fbe56b -//.word 0xfa1cb78f -//.word 0xfff6aa75 -//.word 0x503b748c -//.word 0xeff4cd39 -//.word 0xfbcf76cd -//.word 0xd7ba7ab4 -//.word 0x89b0b4ee -//.word 0x60d391c4 -//.word 0xdabc17b3 -//.word 0xc40f26ad -//.word 0xa352fe81 -//.word 0x53ff0297 -//.word 0xeed7bce0 -//.word 0xf07a200d -//.word 0x983515ff -//.word 0x911b317f -//.word 0xd157c430 -//.word 0xc2c019c1 -//.word 0x9faef867 -//.word 0x210c6f8b -//.word 0x5cafd3c0 -//.word 0xe3e601f7 -//.word 0x3353e9f6 -//.word 0x4ff94e06 -//.word 0xa795c7ec -//.word 0x3e320a1b -//.word 0x0cf86928 -//.word 0xa2459d7e -//.word 0x0cffc353 -//.word 0xfb28a4db -//.word 0x24b239bb -//.word 0xe3956fc0 -//.word 0x242027d1 -//.word 0x838c8122 -//.word 0xb2d75aab -//.word 0x1bd013d9 -//.word 0xc76e9483 -//.word 0x7f65911f -//.word 0x31fb0c36 -//.word 0x95181c15 -//.word 0x0f9decc6 -//.word 0xd8f7063e -//.word 0x59f4d2d8 -//.word 0xd7d55902 -//.word 0x55a44f36 -//.word 0xb6c8512d -//.word 0x23d66b4f -//.word 0xacaadd6d -//.word 0x32b71fb2 -//.word 0x849b22d7 -//.word 0xc8f6d997 -//.word 0x1d7df863 -//.word 0x7e4afc56 -//.word 0xe9766b6b -//.word 0xc1ea5dee -//.word 0x72723b30 -//.word 0x5314c77f -//.word 0xd09f5c55 -//.word 0xc88677d0 -//.word 0x34ef7762 -//.word 0x0a08a1ca -//.word 0x619a6743 -//.word 0xd5e0eafb -//.word 0x2d99bdc6 -//.word 0x3b5cec14 -//.word 0x042c3d21 -//.word 0x214cb56b -//.word 0x65545e69 -//.word 0xc085487a -//.word 0x635ace1c -//.word 0x255f1a5e -//.word 0x2646ec98 -//.word 0xb2389659 -//.word 0x68694ca1 -//.word 0x9bef9a50 -//.word 0xf8d436df -//.word 0x696af84e -//.word 0x3ade275d -//.word 0x7b10f6ff -//.word 0xa5a24e0c -//.word 0x8050ce36 -//.word 0x437f113e -//.word 0xfd182f68 -//.word 0x3596862c -//.word 0xcd5eba2e -//.word 0x2d4ffa70 -//.word 0x9d9b85c6 -//.word 0xf1d56d8b -//.word 0x6c4b9b93 -//.word 0xdf951460 -//.word 0x116e7b99 -//.word 0x63c3d6b7 -//.word 0xb40a9502 -//.word 0x83d5d0bc -//.word 0x53a7d09c -//.word 0x5406d17e -//.word 0x3fd10658 -//.word 0x82d4de70 -//.word 0x9d9a86cc -//.word 0xcc82afea -//.word 0xe61591b2 -//.word 0x85972fa9 -//.word 0x67dcdd67 -//.word 0x145e004b -//.word 0xc18c166d -//.word 0x7564f6d4 -//.word 0x6a4358ea -//.word 0xb6fc972c -//.word 0x2a28b626 -//.word 0x7bbea29f -//.word 0x9fe4b611 -//.word 0x7a04845c -//.word 0xba21d3ba -//.word 0x006ce4f6 -//.word 0x4012fad9 -//.word 0x6a5918e6 -//.word 0x4aeb0d47 -//.word 0xad71ae06 -//.word 0xc5646380 -//.word 0xce20e517 -//.word 0xf23b4528 -//.word 0x6a14313d -//.word 0xe7af7383 -//.word 0x30c0ba7e -//.word 0x0c059dfb -//.word 0x62d9dd46 -//.word 0x9f07ea9e -//.word 0x58dca9e6 -//.word 0x3180759d -//.word 0xfd866410 -//.word 0x26c1cbce -//.word 0x4f59045d -//.word 0x391f6e2b -//.word 0xe31eb6c7 -//.word 0xf6725551 -//.word 0x5f5e5a30 -//.word 0x3e986a02 -//.word 0xffe705d9 -//.word 0xc6f00aa4 -//.word 0x114d7eeb -//.word 0x99e089c0 -//.word 0x7967c1f2 -//.word 0x9150ac83 -//.word 0x2dce7f5c -//.word 0xe22c2c40 -//.word 0xb9629cff -//.word 0x90e639ec -//.word 0xbcc4b090 -//.word 0xf3f1f5a0 -//.word 0x6adc872d -//.word 0x3a47f51b -//.word 0x0855a1d4 -//.word 0xe5e4c43d -//.word 0x731cb2ea -//.word 0x4948608e -//.word 0x99e523b5 -//.word 0x10f9bab5 -//.word 0xfea78fe1 -//.word 0xb7ff3a01 -//.word 0x391b47ff -//.word 0x0f6739e3 -//.word 0x7540ce01 -//.word 0xbcc18571 -//.word 0xf0d95ec0 -//.word 0xb9a1e1e5 -//.word 0x7fed6177 -//.word 0xd122821d -//.word 0x0847f945 -//.word 0x275e9319 -//.word 0x06f479ae -//.word 0xb0f7b27f -//.word 0x09c8e91b -//.word 0xb491711a -//.word 0x33d98655 -//.word 0x5055d657 -//.word 0xbc01400e -//.word 0xf770dbc6 -//.word 0x6f603a59 -//.word 0xec92ee9f -//.word 0x2bd94d2c -//.word 0xc970723b -//.word 0x649085e5 -//.word 0xfc423d97 -//.word 0x9f73a2c2 -//.word 0x454618d4 -//.word 0xf9ae9968 -//.word 0x393b42b9 -//.word 0xa034115d -//.word 0xc2e7ed30 -//.word 0x583de68e -//.word 0x9d91bfc5 -//.word 0xf7c2a9c9 -//.word 0xda87522a -//.word 0xe9031e44 -//.word 0x5f9ab4b6 -//.word 0xae02bd15 -//.word 0x669de8e1 -//.word 0x570632b7 -//.word 0xfaea64c9 -//.word 0x0d19dd8c -//.word 0x7edc91b0 -//.word 0x8a8a5255 -//.word 0x26564f7c -//.word 0x9e6bdabb -//.word 0x7c3b6e36 -//.word 0xab13f0ca -//.word 0xdcf3358b -//.word 0x299ec571 -//.word 0xf8edde4e -//.word 0x2368bc03 -//.word 0x561718f4 -//.word 0xb896efb9 -//.word 0xcd688417 -//.word 0x9b8da82e -//.word 0x0b5739f3 -//.word 0x9379e9e1 -//.word 0x126140ec -//.word 0xfbc8e5b7 -//.word 0xb6871906 -//.word 0x43ac8476 -//.word 0x21cd346c -//.word 0x6e9ce34b -//.word 0x4fbc78ea -//.word 0x92d3d145 -//.word 0x92e1c072 -//.word 0x5bd053d7 -//.word 0x0f4c599b -//.word 0x89d4215a -//.word 0x3f11851d -//.word 0x6d672789 -//.word 0x70cbfb56 -//.word 0x6fd40603 -//.word 0x411465c8 -//.word 0x8ba890cd -//.word 0x290ee099 -//.word 0xd0374fcd -//.word 0xf1dd8012 -//.word 0xe017ff50 -//.word 0x352bc921 -//.word 0x73a30f85 -//.word 0xe7a337d7 -//.word 0xd37924ff -//.word 0xcc76b7ea -//.word 0x61fc9537 -//.word 0xfdd92b33 -//.word 0x0fd3f008 -//.word 0x6784ea31 -//.word 0xe3697431 -//.word 0x4c353e85 -//.word 0x7b6b95d7 -//.word 0xc02be574 -//.word 0x844c7c00 -//.word 0x2cac9069 -//.word 0x41c48419 -//.word 0xce806770 -//.word 0x0a4dbe71 -//.word 0x377383bb -//.word 0xcaa56dbb -//.word 0xccd67221 -//.word 0x804f8b90 -//.word 0x46ffb79a -//.word 0xbf1242eb -//.word 0x32c547c4 -//.word 0x2f7874ac -//.word 0x72040d62 -//.word 0x09503315 -//.word 0xba1f67d7 -//.word 0x9f2c4a50 -//.word 0x1379a6af -//.word 0xd2e4b2e6 -//.word 0x5bfb9217 -//.word 0x99111e49 -//.word 0xc392e460 -//.word 0x8193704c -//.word 0x50adcb80 -//.word 0x270c41a6 -//.word 0x5bc36791 -//.word 0xc0625d73 -//.word 0x11cb5150 -//.word 0x914144b2 -//.word 0xf3c2119f -//.word 0x7797abc8 -//.word 0x5729a603 -//.word 0x6116f9fb -//.word 0xe5840226 -//.word 0xd1b6caf8 -//.word 0x1bdd8b57 -//.word 0x5f306f4e -//.word 0xca3e9b05 -//.word 0x36836cf1 -//.word 0x963a0048 -//.word 0x9573f9b8 -//.word 0x7a657d58 -//.word 0x4f0581df -//.word 0x42d84814 -//.word 0x4b052685 -//.word 0x0fae8a7c -//.word 0x05803c2f -//.word 0xd789e237 -//.word 0x0b4ac943 -//.word 0xe20ee20e -//.word 0x807a0b8e -//.word 0x4e64906f -//.word 0x9de9f2bf -//.word 0x8cb9e7eb -//.word 0x2bb6a1ea -//.word 0xe0be53b8 -//.word 0x0ac4f206 -//.word 0xe5263930 -//.word 0xae3aef6f -//.word 0x072a6c50 -//.word 0x9c035a64 -//.word 0x0708b939 -//.word 0xf14c258a -//.word 0x7a805cb3 -//.word 0xdb09fb67 -//.word 0x4a5688a5 -//.word 0x1f70b5e8 -//.word 0x34d2e39f -//.word 0x917ce6dc -//.word 0x49430850 -//.word 0x9f6b5077 -//.word 0x6d770410 -//.word 0xc7406cd0 -//.word 0xdb45d957 -//.word 0x1b42e663 -//.word 0x9f04fe44 -//.word 0xc47b1e90 -//.word 0x1a11dc17 -//.word 0x7d3aa919 -//.word 0x814c53b7 -//.word 0x1492cea8 -//.word 0x5e9b332d -//.word 0xecd80947 -//.word 0x0e67c427 -//.word 0x7d298be6 -//.word 0x411a3e76 -//.word 0xd2e2b8d9 -//.word 0x7ea75190 -//.word 0x0a26a757 -//.word 0x9c029f0f -//.word 0xd95ba6fc -//.word 0x4aa33d30 -//.word 0x04adb447 -//.word 0x88073555 -//.word 0xe88a051d -//.word 0x2b2f0784 -//.word 0xf3258245 -//.word 0x5d2023e5 -//.word 0x29f346ea -//.word 0x1b617148 -//.word 0xa030211c -//.word 0xb580ca9c -//.word 0x055b194e -//.word 0x518d7c79 -//.word 0x15b6e4da -//.word 0x699dca97 -//.word 0x25c77079 -//.word 0x48496955 -//.word 0x9bda5bcb -//.word 0x912c0433 -//.word 0x727d7bd5 -//.word 0xb869b858 -//.word 0xba02577e -//.word 0x8722990e -//.word 0x1500ac11 -//.word 0x9b022c40 -//.word 0x3bd2e9be -//.word 0xe4b4eb03 -//.word 0x7717b318 -//.word 0x2869c40a -//.word 0x28306299 -//.word 0x81579a30 -//.word 0x41c5821a -//.word 0xda35c2f2 -//.word 0xc941535b -//.word 0x76bf87f2 -//.word 0x5b514a81 -//.word 0x6938a776 -//.word 0xa7698e93 -//.word 0x1de3d4e6 -//.word 0xf03f7bfc -//.word 0xce893452 -//.word 0x8c4e220c -//.word 0x0ef6e1e9 -//.word 0x6854c777 -//.word 0x427c6983 -//.word 0x81d561d4 -//.word 0x246f4f19 -//.word 0x6b961e1f -//.word 0x3fa78947 -//.word 0xce22dd38 -//.word 0x760100d1 -//.word 0xe448b261 -//.word 0x7dde131b -//.word 0xfc9b65c4 -//.word 0x5da214af -//.word 0xfbf1f3eb -//.word 0xf536c9bb -//.word 0xd5e40c46 -//.word 0x7487ec90 -//.word 0x185594a9 -//.word 0xe005ac25 -//.word 0x62e422cb -//.word 0x92252a92 -//.word 0xe67883c9 -//.word 0xb7dffc95 -//.word 0xebbd38a0 -//.word 0xd130ae10 -//.word 0x4ca1f3b6 -//.word 0x349a3c88 -//.word 0xf9d71f52 -//.word 0x899f99a8 -//.word 0x7455551f -//.word 0x4e4a2bbd -//.word 0x56d5e8ad -//.word 0x54a64d37 -//.word 0xc8575af0 -//.word 0x4044cc2e -//.word 0x0a9de4bf -//.word 0x0bb96adb -//.word 0xefadf256 -//.word 0x831e5e1a -//.word 0x5e53a4d5 -//.word 0xc78ed1ef -//.word 0xd39d4ebf -//.word 0xceac62fe -//.word 0xdc5df97c -//.word 0xe01ba411 -//.word 0x9dabe0d7 -//.word 0x1c039b96 -//.word 0x4d60f480 -//.word 0xf093431f -//.word 0xb69b598b -//.word 0xa47909e0 -//.word 0xb940e7ef -//.word 0xd06c4f34 -//.word 0xc874a909 -//.word 0xe1a3ec18 -//.word 0x69236116 -//.word 0x995baaaf -//.word 0xba7b02bc -//.word 0x8b54c6bc -//.word 0xe76e3582 -//.word 0xa354742b -//.word 0xb633d453 -//.word 0x9ca35889 -//.word 0xfcc572ff -//.word 0x888e0e86 -//.word 0x2462d1ba -//.word 0x4be5a37a -//.word 0xaf0e6b9c -//.word 0x207d19de -//.word 0xaf0eea1f -//.word 0x13aee7cf -//.word 0x4c6db0a4 -//.word 0x86d5778e -//.word 0x3f7a4fee -//.word 0xacd3a703 -//.word 0x594811a4 -//.word 0x118c4935 -//.word 0xfd2d72d4 -//.word 0x0f6aa2d3 -//.word 0xa244a16b -//.word 0x5ad8eeae -//.word 0x52eb03be -//.word 0x76c7da3d -//.word 0x2d46b004 -//.word 0x3c2c0918 -//.word 0xe7b9f4d9 -//.word 0x587f907d -//.word 0x4572cfbd -//.word 0xce3e7ace -//.word 0xa4dd7693 -//.word 0x70684511 -//.word 0x732dcf23 -//.word 0x6903636f -//.word 0xb4daf998 -//.word 0xb696bab6 -//.word 0x7f1ec203 -//.word 0xa8af24d6 -//.word 0x7e772ed6 -//.word 0x645fef67 -//.word 0x7228f769 -//.word 0x62b95e22 -//.word 0xadb70878 -//.word 0xf1572664 -//.word 0x967000a3 -//.word 0xb1d5f3af -//.word 0x28e1b5ed -//.word 0x1853e128 -//.word 0x735caf3e -//.word 0xeef70219 -//.word 0x1a79a9e1 -//.word 0xd069de70 -//.word 0xd3911307 -//.word 0xb155ef3f -//.word 0xea449342 -//.word 0x54ed213a -//.word 0xbef47f0a -//.word 0xd465583d -//.word 0x4347643b -//.word 0x1d75eac3 -//.word 0x7ea98395 -//.word 0x70da206f -//.word 0x0cc84e3b -//.word 0xe2d5b987 -//.word 0x9b16ef35 -//.word 0xddaa6774 -//.word 0x6f4ac2ef -//.word 0x9e225044 -//.word 0xdfdfd6b7 -//.word 0xb50a8f28 -//.word 0xd5947042 -//.word 0x89b2b0f6 -//.word 0x52eb8827 -//.word 0xd16e38a7 -//.word 0xe7aa4a63 -//.word 0x1c191ada -//.word 0x3d5c96d4 -//.word 0x498d4350 -//.word 0x8fd181be -//.word 0x102c0f6e -//.word 0x2a9ad149 -//.word 0x785bd1bf -//.word 0xf48e8500 -//.word 0x5e01506f -//.word 0xe2484a53 -//.word 0xf50c44d0 -//.word 0x80a60717 -//.word 0x40ecddd9 -//.word 0x6c4b5301 -//.word 0x99173ca2 -//.word 0xdc1ef92e -//.word 0x2e83f8ea -//.word 0x14ca7b9e -//.word 0x7f2f9b91 -//.word 0xf03c8cb4 -//.word 0xe19a221e -//.word 0x612894b8 -//.word 0xfe4a813a -//.word 0xe7843056 -//.word 0x52471c32 -//.word 0x1c0ab01c -//.word 0xaf9d4f7a -//.word 0x29ba97ff -//.word 0xbbdee725 -//.word 0x4e561ed7 -//.word 0x6d9da66d -//.word 0x5fe5b2de -//.word 0x93f4c331 -//.word 0x42317135 -//.word 0x4fff6872 -//.word 0x7249b15f -//.word 0x955e33d6 -//.word 0x7e0079c4 -//.word 0xafb7b525 -//.word 0x8a6c0530 -//.word 0xb932f6ce -//.word 0xcd674751 -//.word 0x25fcef63 -//.word 0x1211603c -//.word 0x38c50e19 -//.word 0x384c2be9 -//.word 0x8c42b549 -//.word 0xb23eb3b2 -//.word 0x8cabbcf1 -//.word 0x07d3b8d8 -//.word 0xfb3deb34 -//.word 0x52392fff -//.word 0x6db980d6 -//.word 0xc362bead -//.word 0xcbe3afc1 -//.word 0x1d8644ce -//.word 0xd4041d82 -//.word 0x369e4e32 -//.word 0x976964cd -//.word 0x7aeaa30e -//.word 0xfae292f5 -//.word 0x686bba77 -//.word 0x3644aa75 -//.word 0x136a3eeb -//.word 0x58e8216a -//.word 0xa3ef91c8 -//.word 0xc1296216 -//.word 0xd24b46d2 -//.word 0xa7ea4b5e -//.word 0x6f8fa5b1 -//.word 0x930dae4d -//.word 0xde122b70 -//.word 0xe1fdd18f -//.word 0x96ef0800 -//.word 0x4325eef7 -//.word 0xa1859fb3 -//.word 0x3e76b4f9 -//.word 0x20f509c2 -//.word 0xabe6c431 -//.word 0xc5a792c7 -//.word 0x37eb34da -//.word 0x56c63b43 -//.word 0xe4040f58 -//.word 0x31bf361a -//.word 0x8531d3af -//.word 0xc2c66d12 -//.word 0x4675f209 -//.word 0x0f51fc57 -//.word 0x225b5233 -//.word 0x2d9bb2fa -//.word 0x6b6fce21 -//.word 0xc822946d -//.word 0x46c0b266 -//.word 0x9f295a09 -//.word 0x2c6542bd -//.word 0x0537f088 -//.word 0x6af53483 -//.word 0x6196f68b -//.word 0xa10d313a -//.word 0xafd64015 -//.word 0x47ce5907 -//.word 0xfd47570f -//.word 0x245cbc35 -//.word 0xef82f6c2 -//.word 0xd660e1b0 -//.word 0x3be18e60 -//.word 0x4e87438b -//.word 0x2e02c27b -//.word 0x5101ce7b -//.word 0x2548ec8c -//.word 0xf7026759 -//.word 0x1559966d -//.word 0x2f4561a4 -//.word 0x03a102df -//.word 0x3a8409fc -//.word 0x8ccea306 -//.word 0x2b011ba8 -//.word 0x5f53a1e8 -//.word 0x6d014b12 -//.word 0xbee559f1 -//.word 0x3d4bbd45 -//.word 0x0101db72 -//.word 0x2cad8d76 -//.word 0x13636a1d -//.word 0x9f774878 -//.word 0xf390ff8b -//.word 0x4efe7046 -//.word 0x334ec6b7 -//.word 0xc81bfc7d -//.word 0x7d27a080 -//.word 0xedaad6df -//.word 0x09e99f2a -//.word 0x730b5bd2 -//.word 0x28288ddd -//.word 0x62a4dfde -//.word 0xbdbb6625 -//.word 0x985c2633 -//.word 0xbe3bd971 -//.word 0x4622ec21 -//.word 0xb787cb94 -//.word 0x70645e9d -//.word 0x4743d347 -//.word 0x71989fc3 -//.word 0xa254bfa4 -//.word 0x74b7444f -//.word 0x0d660eac -//.word 0xfcbdd822 -//.word 0x656675c3 -//.word 0x5e2b58c3 -//.word 0x98085a2f -//.word 0x4285b8db -//.word 0x2a435b9d -//.word 0x26d45db8 -//.word 0xb2cfc89b -//.word 0xda24a1cc -//.word 0x5bae251f -//.word 0x0507522b -//.word 0x63a0a9fe -//.word 0x9e113310 -//.word 0x9fadc276 -//.word 0x745a7958 -//.word 0xf5a08ea5 -//.word 0xa7ff4f05 -//.word 0xe0866310 -//.word 0x2ca153bd -//.word 0xf033491d -//.word 0x4de41749 -//.word 0x47bd7a99 -//.word 0x27f2a016 -//.word 0x1dfee932 -//.word 0x2af5ebb7 -//.word 0x3d16b8fe -//.word 0x9da06361 -//.word 0x86e8c0f2 -//.word 0x17a76c6e -//.word 0x6c980d6c -//.word 0x0743dbda -//.word 0x741360aa -//.word 0x2caf7bc9 -//.word 0xbb87ab51 -//.word 0x1ead8aff -//.word 0x6fe798e7 -//.word 0xc4023a66 -//.word 0x54690359 -//.word 0xdbf6318c -//.word 0x40077b76 -//.word 0x75d50a23 -//.word 0xa001c571 -//.word 0x7870d17f -//.word 0xf1595863 -//.word 0x1b9c8a1b -//.word 0x4756e2c6 -//.word 0x6db2ab15 -//.word 0xca02c2fc -//.word 0xcd0e9dad -//.word 0x34ab8cc6 -//.word 0x73903fc9 -//.word 0x556689ce -//.word 0xe51e6374 -//.word 0x8f87341d -//.word 0x8320505b -//.word 0x5a2bbea5 -//.word 0xfc023e4f -//.word 0xc1ae8ab9 -//.word 0xd6b6ddc6 -//.word 0xe335b28f -//.word 0xea2fce59 -//.word 0x732580c5 -//.word 0xe6e72847 -//.word 0x38aaf6d9 -//.word 0xc95af4f1 -//.word 0x8d3247b0 -//.word 0x6b89b25c -//.word 0xe2ef5b10 -//.word 0xf278d2b2 -//.word 0x3a584f26 -//.word 0x5eb03bc1 -//.word 0xaba8f201 -//.word 0xfebec87b -//.word 0xe15e4a14 -//.word 0xf8b2c674 -//.word 0x9cbb0db8 -//.word 0xc5a17767 -//.word 0x2d4728a8 -//.word 0xb22392b2 -//.word 0xfc4d3b83 -//.word 0x61d5c0d5 -//.word 0x055a1b4e -//.word 0x46d821f7 -//.word 0x57c24eef -//.word 0x2a51c561 -//.word 0x941b93b3 -//.word 0xace73400 -//.word 0x74c058c9 -//.word 0xbb48e7e7 -//.word 0x414f42c4 -//.word 0x1da4cccb -//.word 0x5c2ba91d -//.word 0xeb30c586 -//.word 0xb7fb18af -//.word 0x12a52995 -//.word 0x592ad139 -//.word 0xd3be429a -//.word 0xdd6547e0 -//.word 0x44beceda -//.word 0xf31fa3aa -//.word 0xcee77ebf -//.word 0xdd104004 -//.word 0xad047a57 -//.word 0xf3b22f3d -//.word 0x73e0dbd4 -//.word 0x20c3b309 -//.word 0x85cd2f0a -//.word 0x63c6c6ff -//.word 0x9c1ef8f5 -//.word 0x4f82921a -//.word 0x45ad2e30 -//.word 0x8c81f93c -//.word 0x6156b97e -//.word 0x54920ea6 -//.word 0xa679f745 -//.word 0xf6479982 -//.word 0x1c7c3c0e -//.word 0x5678975a -//.word 0xa2474d07 -//.word 0x6abeb79e -//.word 0x66c7e481 -//.word 0xbff9de21 -//.word 0x706c2f72 -//.word 0xf2cba49c -//.word 0x18aa51f4 -//.word 0x381ad52a -//.word 0x8b7be0c3 -//.word 0xd692f2ca -//.word 0x4adc65c3 -//.word 0xa921ade1 -//.word 0xab4bdf79 -//.word 0xa07970b5 -//.word 0x56503f8d -//.word 0x3d91d6f3 -//.word 0xc9f1ed4e -//.word 0x1825302a -//.word 0xd53c432e -//.word 0x5c31024e -//.word 0x1fc10d42 -//.word 0x487a8436 -//.word 0xa0150fc3 -//.word 0xaf05221e -//.word 0x25507f8f -//.word 0x789efc25 -//.word 0xcf8f86a9 -//.word 0x1f5266d0 -//.word 0x9374c3b4 -//.word 0x32f56885 -//.word 0xbca1c87c -//.word 0xd49d3f11 -//.word 0x64419b6e -//.word 0x3e25db23 -//.word 0xff7f371b -//.word 0x39ac60cf -//.word 0xd10c08b9 -//.word 0xa513a50c -//.word 0x729d72a2 -//.word 0xf682b736 -//.word 0x516b4bd3 -//.word 0xb1e4578c -//.word 0x2eb25c6e -//.word 0xf36678b3 -//.word 0x9f32e538 -//.word 0xebfcc232 -//.word 0x8cb1161c -//.word 0x5bdc12f4 -//.word 0xb37796a6 -//.word 0x1a00f7c9 -//.word 0x24d00089 -//.word 0x95a936e4 -//.word 0xc68e601a -//.word 0x4ad7475e -//.word 0xd084bbd2 -//.word 0x4bd2d6b2 -//.word 0x510c85cf -//.word 0xc1a44340 -//.word 0xa9822854 -//.word 0x679c23cb -//.word 0x0ec78445 -//.word 0x0bccbdfa -//.word 0x08bf69ac -//.word 0x108c8dda -//.word 0xf4d31e37 -//.word 0xeef6c45a -//.word 0x8570deb7 -//.word 0xb068c6ce -//.word 0x3e8556a2 -//.word 0x7505ab6d -//.word 0xfa092892 -//.word 0xf133bed3 -//.word 0x64736bc4 -//.word 0xe91e017f -//.word 0x7f41299a -//.word 0xba34a756 -//.word 0x2072e019 -//.word 0xd2a7991f -//.word 0x6f0b016c -//.word 0x35eff205 -//.word 0x6995745f -//.word 0xf9458318 -//.word 0x619d12e5 -//.word 0xcb294fcc -//.word 0x7a342993 -//.word 0x68dd0f78 -//.word 0x2e6dfb22 -//.word 0x25e7b0d8 -//.word 0xcbe140f1 -//.word 0x6893d08b -//.word 0xf12e9f80 -//.word 0x2c6f4596 -//.word 0x157339f6 -//.word 0x81cd96e0 -//.word 0x01d61f9c -//.word 0x094480b4 -//.word 0x51fed760 -//.word 0x7c2f7242 -//.word 0xf899da53 -//.word 0x252d111e -//.word 0xb9d8192c -//.word 0x639fb5bf -//.word 0xaeee74c3 -//.word 0x292dea01 -//.word 0xc5954196 -//.word 0x7e42f1a3 -//.word 0x3d89cb47 -//.word 0xfd8b3cca -//.word 0x2d0ad01b -//.word 0x567cf57d -//.word 0xfe5e027d -//.word 0xcccb7727 -//.word 0xed4d8679 -//.word 0xb5f3d318 -//.word 0x8aa47942 -//.word 0xfeb24d04 -//.word 0x3bb266ad -//.word 0xa48cdd82 -//.word 0xb9ced1b3 -//.word 0x3b46ae8e -//.word 0x91cfaff3 -//.word 0x6b6ba208 -//.word 0xa592ec2d -//.word 0x6ecacc33 -//.word 0xa978e4c8 -//.word 0x93f6f536 -//.word 0xa7e5ea4e -//.word 0xbfc5189e -//.word 0x7bc3c4eb -//.word 0xe6d1e5db -//.word 0x57fc2cf1 -//.word 0x96fa42be -//.word 0x40035156 -//.word 0x6de3c502 -//.word 0x8f4c5434 -//.word 0x9e703bc0 -//.word 0x72cfcb48 -//.word 0x704e25f8 -//.word 0x688a4274 -//.word 0xbe6b360f -//.word 0xc8fcb53e -//.word 0x787ad64c -//.word 0x3bab174f -//.word 0x2070a15a -//.word 0x3d9ecef4 -//.word 0x4f0ae9c9 -//.word 0xa0e335a0 -//.word 0x2e45308d -//.word 0x090a1868 -//.word 0xfde4af7d -//.word 0x71a93c85 -//.word 0x8fedd2d6 -//.word 0xa5d6d4d6 -//.word 0xcb2cb9b5 -//.word 0xc7b00d5c -//.word 0x2dafb8a0 -//.word 0xcbd683bc -//.word 0x4348d8fe -//.word 0xfaeec9c0 -//.word 0x310e559a -//.word 0x7220e6d6 -//.word 0x2edd1d24 -//.word 0xa498d28f -//.word 0x04d157b0 -//.word 0xd508fd22 -//.word 0x94cfda36 -//.word 0x9e23c9e7 -//.word 0x50fcb110 -//.word 0x6c230bdc -//.word 0xbe449e7e -//.word 0x00448d23 -//.word 0xfcd49425 -//.word 0xf0478f82 -//.word 0x36a03c8c -//.word 0x24f041e2 -//.word 0x32df719e -//.word 0x5a884bd0 -//.word 0xc58ac32c -//.word 0xa35b46ff -//.word 0x5be0f868 -//.word 0xe43b40c4 -//.word 0x72e5866a -//.word 0x56fc3b99 -//.word 0x1fde1aae -//.word 0x06f6ae9a -//.word 0x89d61594 -//.word 0x5586030b -//.word 0x691c0adf -//.word 0x798d18d0 -//.word 0x90c34137 -//.word 0xfaf0bef4 -//.word 0x612136a7 -//.word 0x36163d23 -//.word 0x53511b1f -//.word 0xde6dce2f -//.word 0x70b152f3 -//.word 0x76e51f8e -//.word 0xd864f45a -//.word 0xd973d3db -//.word 0x3fd14cf1 -//.word 0xb390ff51 -//.word 0x6a225d35 -//.word 0x05b7ae53 -//.word 0xb6c7580c -//.word 0xa5ea5ee7 -//.word 0x92f0273d -//.word 0xbb2e8136 -//.word 0x0016e5f4 -//.word 0x450bfd0d -//.word 0x1873633f -//.word 0x930dac5f -//.word 0x8484a593 -//.word 0xcc45dcc1 -//.word 0x058e6247 -//.word 0x68c8d0ed -//.word 0xed178817 -//.word 0xb32f3d40 -//.word 0xa369b6a3 -//.word 0x5116ce3b -//.word 0x2213c0ee -//.word 0xb49ea106 -//.word 0x7a672ee0 -//.word 0xa7eac8e8 -//.word 0x4efdbdc5 -//.word 0xc7a5c9d0 -//.word 0x542eddcb -//.word 0x047b1ed0 -//.word 0xd89a3187 -//.word 0x259bb69c -//.word 0x39a31270 -//.word 0x413c720f -//.word 0x6bef0d63 -//.word 0x4715a9a7 -//.word 0x73ea601d -//.word 0x77e3a404 -//.word 0xee4281c5 -//.word 0xe7e7226d -//.word 0x8a69975f -//.word 0xff65d54b -//.word 0x8b16fe5a -//.word 0xfc26e3ab -//.word 0x48c4c803 -//.word 0x71f767c0 -//.word 0xab32370f -//.word 0xc128ed5f -//.word 0xb5e14316 -//.word 0xa70ef982 -//.word 0xf79a1a12 -//.word 0xae8181c6 -//.word 0x1ae59be4 -//.word 0xb95f6fed -//.word 0x5993dbcf -//.word 0x7c07205c -//.word 0x0135a1fb -//.word 0x01dee79d -//.word 0xf8a2e9f3 -//.word 0x25ce8adf -//.word 0x33756428 -//.word 0x18c2c471 -//.word 0x3e8cf56c -//.word 0xe02bc24b -//.word 0xb88a3677 -//.word 0xd77ea685 -//.word 0xd456f266 -//.word 0x28b407dd -//.word 0xd99ba836 -//.word 0x56c86f36 -//.word 0xa2460e4e -//.word 0xb53ddb13 -//.word 0x200b8cf3 -//.word 0xef953e20 -//.word 0xd3dfbdd1 -//.word 0x81dbffaa -//.word 0x557ff178 -//.word 0x3b1a7722 -//.word 0xcfe8addd -//.word 0xc3e4749e -//.word 0x81dd2ad5 -//.word 0x12ccb858 -//.word 0x3f65d29d -//.word 0xf6ec7a2d -//.word 0xef4ac655 -//.word 0x8e60e41f -//.word 0x0c9b5b81 -//.word 0xd2c993d3 -//.word 0x252b9886 -//.word 0x08cb1b14 -//.word 0x5e0fba33 -//.word 0x508f814e -//.word 0xee24b035 -//.word 0x1941be14 -//.word 0xa0879fa2 -//.word 0xa993439a -//.word 0x531b5f6f -//.word 0x99396f3c -//.word 0x7a06fcf9 -//.word 0x566b1af5 -//.word 0x9c343680 -//.word 0xa2660ee8 -//.word 0xd4d301a8 -//.word 0x11eb89db -//.word 0x52d506f7 -//.word 0x8dbfbdb7 -//.word 0xd9722059 -//.word 0xd229500a -//.word 0x3fa3e09f -//.word 0xf277dc85 -//.word 0xf0a809fb -//.word 0xd2796f7e -//.word 0x6b821585 -//.word 0xab040c6f -//.word 0xc37aaeba -//.word 0x8a702875 -//.word 0x209836f8 -//.word 0xd11b2ed2 -//.word 0x3c2d4003 -//.word 0xb4e4fc6c -//.word 0xe64a1483 -//.word 0xbcb1644b -//.word 0x82462f84 -//.word 0x48e9ac1e -//.word 0x873cc1f4 -//.word 0x07fa0eb7 -//.word 0xff8b2d28 -//.word 0x7fd5388b -//.word 0x0b548c58 -//.word 0x886dcd33 -//.word 0x5dff2b1e -//.word 0xd23ce3ee -//.word 0xbbb708fb -//.word 0x5bbd831c -//.word 0x83e959d3 -//.word 0xfaf32cc4 -//.word 0x21c9056c -//.word 0xd7e1500f -//.word 0x9bcd28f2 -//.word 0xf010d5cb -//.word 0x06309376 -//.word 0x960c95e9 -//.word 0x0e704a6a -//.word 0xeee7df00 -//.word 0x72d00527 -//.word 0x71b4f4c7 -//.word 0x85d7b067 -//.word 0x6c0d8b9e -//.word 0xaecfebcb -//.word 0x808e4d06 -//.word 0xe9478a57 -//.word 0x23585925 -//.word 0x449216f1 -//.word 0x1e8fc244 -//.word 0x63464ae5 -//.word 0x0ddc0c50 -//.word 0xfcbe9764 -//.word 0xe1ecb25c -//.word 0x5c98a100 -//.word 0x61efa31c -//.word 0xe037bf32 -//.word 0xa51ac06c -//.word 0x7d417fd4 -//.word 0x9a2560c7 -//.word 0x38221fa7 -//.word 0x81cecdd1 -//.word 0xae8815cf -//.word 0x7054c4ce -//.word 0x8ee68952 -//.word 0xcffcf828 -//.word 0x1af1d59d -//.word 0xdc8f90ed -//.word 0xaa260cfe -//.word 0x28daa44e -//.word 0x2941702a -//.word 0x172ec422 -//.word 0x96c7fab9 -//.word 0x64de7261 -//.word 0x837ed6a6 -//.word 0x9bc3a3a9 -//.word 0x9aefe5d0 -//.word 0x9dbb42bc -//.word 0x13eb397b -//.word 0x1f25acff -//.word 0x3f039ccf -//.word 0x2c6735fd -//.word 0x010f0a58 -//.word 0x9e69a1e2 -//.word 0x4fa83285 -//.word 0xa917ac01 -//.word 0xb5adf929 -//.word 0x51e2834f -//.word 0xd2c2f7fd -//.word 0xee4049e6 -//.word 0xdaccf81b -//.word 0xaf289382 -//.word 0x12777c85 -//.word 0x1497ec07 -//.word 0x57b0379c -//.word 0x730d51f9 -//.word 0x972b91a9 -//.word 0x7410b602 -//.word 0x56de2858 -//.word 0x94a88070 -//.word 0x2b844937 -//.word 0xa6e208b4 -//.word 0x411c7b3c -//.word 0x4d4e1fe5 -//.word 0xd667f43d -//.word 0x8480843b -//.word 0xbf6d2275 -//.word 0x16927094 -//.word 0xe2f82405 -//.word 0x26a10bf2 -//.word 0xba184e71 -//.word 0xa94bf4fb -//.word 0xd79da81f -//.word 0xe738bc77 -//.word 0x5ba06fdc -//.word 0xfd8e6bd6 -//.word 0x7efb9256 -//.word 0x5e7bfaa8 -//.word 0x0bcc36a3 -//.word 0x4dafd823 -//.word 0xe1f633b9 -//.word 0x65df66a0 -//.word 0x74a096f3 -//.word 0x11437a1e -//.word 0x49b41d93 -//.word 0x1419dfbe -//.word 0x7d61bd3a -//.word 0x0220d345 -//.word 0x3e9a1f71 -//.word 0xc51d889d -//.word 0x50951f24 -//.word 0x1a5aa454 -//.word 0x894c4c22 -//.word 0x1122c11b -//.word 0x56ff6b9e -//.word 0x9046ee49 -//.word 0x34b0f4b1 -//.word 0xd19c2c56 -//.word 0x37a693d6 -//.word 0xdf7af260 -//.word 0x87eba76c -//.word 0x1d3fa9a9 -//.word 0xdecdc737 -//.word 0xbfcb3017 -//.word 0x0c6138e0 -//.word 0x4f0159b3 -//.word 0x73fb7870 -//.word 0x294c6a2a -//.word 0x8bb7b7d9 -//.word 0xff189e4f -//.word 0x5ff4596e -//.word 0x5754a297 -//.word 0x0ed47565 -//.word 0x08f7189c -//.word 0x4bbd595c -//.word 0xc078179b -//.word 0xdddb03d2 -//.word 0x8154a8f5 -//.word 0x1f9ca9a9 -//.word 0x1f8c4ab2 -//.word 0x813232aa -//.word 0xc42470f9 -//.word 0x0614bb01 -//.word 0x6ca5fe99 -//.word 0xc47d14bd -//.word 0x699bcf83 -//.word 0x67eb4051 -//.word 0xe018324e -//.word 0xafa2f816 -//.word 0x4a3069b2 -//.word 0xed2728c7 -//.word 0xf57b290d -//.word 0x8ac67003 -//.word 0x80971ce2 -//.word 0x7f0ca5cf -//.word 0x62a36254 -//.word 0xde4d4e11 -//.word 0x64c40baf -//.word 0x481f2716 -//.word 0x22a49fe0 -//.word 0x75dda10d -//.word 0x8eee96f8 -//.word 0xaf256089 -//.word 0x6dd3e0ad -//.word 0x575abc03 -//.word 0xd8885fd9 -//.word 0x5f234156 -//.word 0xbcc568f8 -//.word 0xceea2f42 -//.word 0x5b4846ae -//.word 0x3f5ffae9 -//.word 0xc950b63f -//.word 0x62f2ca54 -//.word 0x6f236c16 -//.word 0x795cfcef -//.word 0x8b898d3f -//.word 0xdc17a009 -//.word 0xae4e32ed -//.word 0x76e1fa56 -//.word 0x3dc3ecf4 -//.word 0x463d016d -//.word 0xf13e3a4f -//.word 0xdff2e34a -//.word 0x5795159c -//.word 0xe98a7ecc -//.word 0x51a7649b -//.word 0x9ed4e838 -//.word 0x93d488b3 -//.word 0x4d62e8b4 -//.word 0x2680d26d -//.word 0xda0c7bcd -//.word 0xe89408f6 -//.word 0x3b6b50f2 -//.word 0x0afce4a1 -//.word 0xfd5f4df6 -//.word 0x912a9463 -//.word 0xbd8a0892 -//.word 0xd6923b56 -//.word 0xb0d24ee1 -//.word 0x062c6e37 -//.word 0x1be39fe3 -//.word 0xa2f5b8e8 -//.word 0xdbabaffa -//.word 0x006e17ee -//.word 0xdfdce770 -//.word 0xc81b7df4 -//.word 0xa96de3ef -//.word 0x78055046 -//.word 0xd11af206 -//.word 0xe139ea57 -//.word 0x82df99ab -//.word 0xa7471a3b -//.word 0xfb810fb4 -//.word 0xc5c4a12d -//.word 0x0f05c25d -//.word 0x07c8b50b -//.word 0xa537d1c5 -//.word 0x8e7182d5 -//.word 0x39249071 -//.word 0x505ea432 -//.word 0x59a008c8 -//.word 0x9535aeeb -//.word 0x28c17494 -//.word 0x7b1da66e -//.word 0xdf62c487 -//.word 0x7344864c -//.word 0x47a21eb4 -//.word 0xc15abdbb -//.word 0x40625812 -//.word 0x0015ac15 -//.word 0x3eca80fd -//.word 0x9cab2a57 -//.word 0xc6c554b5 -//.word 0x565b00a3 -//.word 0xf580cadc -//.word 0xc3e56dbe -//.word 0xfaef89fc -//.word 0xce0ca493 -//.word 0x97486eff -//.word 0x311b49ae -//.word 0xa38508b5 -//.word 0x005df7c2 -//.word 0x8be71c51 -//.word 0x1ea4bd23 -//.word 0xcd6e23ec -//.word 0xc6c49d4d -//.word 0x7b62c701 -//.word 0x04140b5b -//.word 0xbecd69f0 -//.word 0x39f37491 -//.word 0x51fe9d7c -//.word 0x9a41b4d2 -//.word 0x0207ac4c -//.word 0xb1e29f2a -//.word 0x3440116d -//.word 0xdb3f7946 -//.word 0x5fc3fece -//.word 0xc8c57ef7 -//.word 0x8eeed4c3 -//.word 0xff645bb4 -//.word 0xe0e4ae83 -//.word 0x5711b215 -//.word 0x090bd7aa -//.word 0x7f449a58 -//.word 0xce8f4fb8 -//.word 0x777a1ddf -//.word 0x8cde4a8f -//.word 0x14b4b8af -//.word 0xb12ab0f9 -//.word 0x80f7dff3 -//.word 0x41eb9e20 -//.word 0xb8ca7777 -//.word 0x525ae414 -//.word 0x0cbb592e -//.word 0x91f78549 -//.word 0xa2dad6ac -//.word 0xbb043b16 -//.word 0xf43c2dad -//.word 0x2507f037 -//.word 0x4d79168c -//.word 0x354c464b -//.word 0x502f3bcd -//.word 0xe6600f57 -//.word 0x717dba94 -//.word 0x4898d642 -//.word 0x7a89a52b -//.word 0xfd885457 -//.word 0x08fb8180 -//.word 0xbd8cfcc6 -//.word 0x0b7fcaa4 -//.word 0xd3427023 -//.word 0x49466e4d -//.word 0x9e0e09e5 -//.word 0xdc864d55 -//.word 0x119553e8 -//.word 0xaff5c039 -//.word 0x33438eec -//.word 0x05520f9b -//.word 0x9fc52e13 -//.word 0xf2ddf9c1 -//.word 0x058f5c67 -//.word 0xe0da2f13 -//.word 0xa8577452 -//.word 0x0b12d9a1 -//.word 0xdf988524 -//.word 0x0551109b -//.word 0x9410d391 -//.word 0x33e963d6 -//.word 0xc7435830 -//.word 0x4f2d534e -//.word 0x0bf63ffd -//.word 0xe4f7d69f -//.word 0x08b467d8 -//.word 0xd524d78a -//.word 0xf84ce704 -//.word 0xd613b476 -//.word 0x2b5184a8 -//.word 0xf029bfec -//.word 0x83993c52 -//.word 0x024fbe1a -//.word 0xf7bebf6f -//.word 0x3b726c52 -//.word 0x14a0f0d4 -//.word 0xa102f588 -//.word 0x78e16838 -//.word 0x8d747dd7 -//.word 0x5668f4b7 -//.word 0x2cc09afc -//.word 0xf5df1251 -//.word 0x00e3d5d9 -//.word 0x30357868 -//.word 0x5d5e2ef4 -//.word 0xf71d8d46 -//.word 0xecb695f5 -//.word 0xcc8cee95 -//.word 0x2cf2712c -//.word 0x483feae5 -//.word 0xec201c09 -//.word 0x9433062a -//.word 0xd2d165a2 -//.word 0xf02b7a3c -//.word 0xd6980d30 -//.word 0x2f2db255 -//.word 0xc88f4b92 -//.word 0x3805ce95 -//.word 0xc6d149c8 -//.word 0x87c12381 -//.word 0xc701a47a -//.word 0xaa33b780 -//.word 0x13c1ef6f -//.word 0xc572c95d -//.word 0xc93c3116 -//.word 0x0f5a47c9 -//.word 0x589e6200 -//.word 0x520755d5 -//.word 0x0596f263 -//.word 0x6f5ecd7c -//.word 0x6bdb439a -//.word 0xd884ba17 -//.word 0xf6a329a0 -//.word 0x1365dce7 -//.word 0x682d7198 -//.word 0x3e2e278f -//.word 0x55395848 -//.word 0x85d34396 -//.word 0xa68b0f98 -//.word 0xae8b0de9 -//.word 0x196c3e18 -//.word 0x8e4f1558 -//.word 0xbf297d78 -//.word 0x915e1e15 -//.word 0x7d92dc0e -//.word 0x35bba138 -//.word 0x8b7b5d53 -//.word 0x8fae4b3d -//.word 0xf83f7566 -//.word 0xc63f7a84 -//.word 0x25388f88 -//.word 0x93bec4d0 -//.word 0x4548899e -//.word 0xc73e70c9 -//.word 0xe45334b2 -//.word 0xc515fb7a -//.word 0x5dc2d872 -//.word 0x045e94d3 -//.word 0x6102aeb0 -//.word 0x8e77a028 -//.word 0x770464e0 -//.word 0x838337b1 -//.word 0x77ba9d9d -//.word 0x97e9a508 -//.word 0x0ea06e24 -//.word 0x8fd3eaae -//.word 0x3d30e2d8 -//.word 0xc8b03a86 -//.word 0xd96d77bc -//.word 0xb1b37e57 -//.word 0x0d599efc -//.word 0x4c52d14f -//.word 0xd37f3f65 -//.word 0xb1c7047b -//.word 0x7f6a33e8 -//.word 0x8a921b50 -//.word 0x352cc91b -//.word 0x98f5ce25 -//.word 0x6dd842b7 -//.word 0x2d7708b7 -//.word 0x7608541b -//.word 0xb0626ba3 -//.word 0xf057aac8 -//.word 0x1c45caf0 -//.word 0x51e862e3 -//.word 0x8172ad82 -//.word 0x61de8eb7 -//.word 0x8281d1a8 -//.word 0xbde2b430 -//.word 0xd5cba68f -//.word 0x58a04e60 -//.word 0xc6f0cfcc -//.word 0xf54a4bfe -//.word 0xb452a6d6 -//.word 0xaf138ce2 -//.word 0x9397b58a -//.word 0x72b5678a -//.word 0x682b3da6 -//.word 0x7fed2898 -//.word 0xd0bcb34e -//.word 0xebf98b52 -//.word 0x79bc3e8a -//.word 0x20214321 -//.word 0xa7e23bc5 -//.word 0x5b2b7613 -//.word 0xb1a9b94f -//.word 0x2ce53e59 -//.word 0x81d0fddc -//.word 0xfa9e2ac9 -//.word 0x18d8ff04 -//.word 0x7cadbb5d -//.word 0x078aebc1 -//.word 0x41eae8b1 -//.word 0xf76ea1f4 -//.word 0x29309a89 -//.word 0x235535e0 -//.word 0xe9e1314a -//.word 0xd8cf70ad -//.word 0x8b62fd7c -//.word 0xfcb64de6 -//.word 0xeb9ac54e -//.word 0x84a27dfc -//.word 0x3c774412 -//.word 0xfc72e4c1 -//.word 0x8169a7bc -//.word 0x03c919ed -//.word 0x14e51068 -//.word 0xcc8eea9d -//.word 0x23e416d1 -//.word 0x9e6bd6cf -//.word 0x2e6242da -//.word 0x555091e7 -//.word 0x8adf9409 -//.word 0xdfed832d -//.word 0xe1e1fc07 -//.word 0xbf3b494c -//.word 0xaf70e222 -//.word 0x8ef432d5 -//.word 0xc6989ecb -//.word 0x7516c4ba -//.word 0xccea0018 -//.word 0xb56435d3 -//.word 0xb8fcca43 -//.word 0x1fe5f25d -//.word 0x58e53129 -//.word 0x9c631c76 -//.word 0xcec260cc -//.word 0xa6ed05a2 -//.word 0x0e33f4d1 -//.word 0xcc56b749 -//.word 0x62de8102 -//.word 0x32b36e36 -//.word 0xe6eb0bce -//.word 0x0fe1191a -//.word 0x0c878ec4 -//.word 0x2efddd07 -//.word 0x1a62771c -//.word 0x6eea92f5 -//.word 0xa730292e -//.word 0x42ce4441 -//.word 0x212c79f9 -//.word 0x3195b329 -//.word 0x4a90329d -//.word 0x566dd351 -//.word 0xb61e92e1 -//.word 0xe1484d41 -//.word 0x4e9acbae -//.word 0x955efce4 -//.word 0xd14d8292 -//.word 0x48a8710b -//.word 0x4e84533e -//.word 0x666670e8 -//.word 0xab0f4c08 -//.word 0x6e997094 -//.word 0x21c36d6a -//.word 0x738a1f89 -//.word 0xbdf92f81 -//.word 0x9d41db28 -//.word 0xe00cfa8f -//.word 0xa60f3a34 -//.word 0xc0dead79 -//.word 0x5d058455 -//.word 0xe6541a4a -//.word 0x267a3497 -//.word 0xaed687ae -//.word 0x78897ae8 -//.word 0xcad02e78 -//.word 0x5d91bb9e -//.word 0xbf33bd1d -//.word 0xf6b310ee -//.word 0x66f4d736 -//.word 0xf557c376 -//.word 0x6c8c9201 -//.word 0x20a8d5b4 -//.word 0xd377f7e1 -//.word 0xd5137b8c -//.word 0x6eb585da -//.word 0x81cc9cc6 -//.word 0x694cae16 -//.word 0x2749548d -//.word 0xbfc45863 -//.word 0xdfc575f2 -//.word 0xc2aa5db2 -//.word 0x54be0167 -//.word 0x970d0c99 -//.word 0x4577b045 -//.word 0xb704a6d2 -//.word 0x05777046 -//.word 0x6f26e2ba -//.word 0xfb08e00c -//.word 0x601069d3 -//.word 0x23b9d598 -//.word 0x00e35a43 -//.word 0x8bddd5d3 -//.word 0x17c3c752 -//.word 0xd70a9e08 -//.word 0x435937f0 -//.word 0xbd9aa068 -//.word 0x7552222c -//.word 0x8a2d7f85 -//.word 0x72de78be -//.word 0x9b2592d8 -//.word 0x52311a7f -//.word 0xe529673c -//.word 0x04065feb -//.word 0x6da33d70 -//.word 0xc91791a6 -//.word 0xd0428798 -//.word 0xb4a66df4 -//.word 0xbd7870bc -//.word 0x30f7a63f -//.word 0x76fd5248 -//.word 0x7ad46395 -//.word 0x534a3d8a -//.word 0x2308bc27 -//.word 0x3f1f7638 -//.word 0x90e441cb -//.word 0x39fef6e7 -//.word 0x79bd747b -//.word 0xd3aee795 -//.word 0x6d6c4ad4 -//.word 0xb7b82a20 -//.word 0x4cccad98 -//.word 0x1dedd4cc -//.word 0xcc40fd2d -//.word 0x56deacc2 -//.word 0xf52a8a1c -//.word 0x4563ae8b -//.word 0xa5751c92 -//.word 0xe0158b99 -//.word 0x0d0c6ce2 -//.word 0xb3d327be -//.word 0x3161a801 -//.word 0x5d411ab3 -//.word 0x6ce7f208 -//.word 0x12443092 -//.word 0xe998e1b6 -//.word 0x1788e95d -//.word 0x2c70ffeb -//.word 0x49faf975 -//.word 0x87f04a2f -//.word 0x964ec923 -//.word 0xa59cb429 -//.word 0x827af413 -//.word 0x037da228 -//.word 0xa439cbd4 -//.word 0x719f709d -//.word 0x278ad159 -//.word 0x9694ec9e -//.word 0x492e407b -//.word 0x69f0d665 -//.word 0xdf2d8274 -//.word 0xb9cb67d0 -//.word 0xcf51b966 -//.word 0xa642c7df -//.word 0x94aa38d2 -//.word 0x25f69438 -//.word 0xbe080721 -//.word 0x808b62a6 -//.word 0x6f84631f -//.word 0xd42a3696 -//.word 0xe0f83b7b -//.word 0x91000a98 -//.word 0xda82b548 -//.word 0xfebd4de4 -//.word 0x3d05a77f -//.word 0xb2165fd3 -//.word 0x7ca81e7a -//.word 0x1c441962 -//.word 0x1e55da7b -//.word 0xfc8243b2 -//.word 0x3f3bd023 -//.word 0xe7921c8a -//.word 0x0d4da7fb -//.word 0xc739d6d4 -//.word 0x4cc13bef -//.word 0x58be171c -//.word 0xd2911dce -//.word 0xad707914 -//.word 0x0cfd11cb -//.word 0xa91d0b13 -//.word 0x77078fff -//.word 0x869bce91 -//.word 0x27f643e5 -//.word 0x524338ac -//.word 0x44d38ddc -//.word 0x6c71b5a6 -//.word 0x88ef01a9 -//.word 0x0c052165 -//.word 0xc35ce8f2 -//.word 0xb8e54ff1 -//.word 0x576fbdc4 -//.word 0xd07985fa -//.word 0xbc44b00d -//.word 0x032dfe50 -//.word 0xfd3a2723 -//.word 0xd7f36669 -//.word 0x3973383c -//.word 0x25be62df -//.word 0x235531f3 -//.word 0x9b0805ee -//.word 0x820c11ca -//.word 0x384d5cfa -//.word 0xb1050ba2 -//.word 0xd48ee307 -//.word 0x20750a45 -//.word 0x95cf0d40 -//.word 0xd2d027dc -//.word 0x7b99c171 -//.word 0xdd523579 -//.word 0xd579d78c -//.word 0xed79368f -//.word 0xc97f9f28 -//.word 0xc289e374 -//.word 0xd0c05afd -//.word 0xad0728e6 -//.word 0x37d4bf69 -//.word 0x173ea684 -//.word 0xa05878ee -//.word 0xf9be2f50 -//.word 0x7f6da2b2 -//.word 0x65d84d33 -//.word 0x9d3851fe -//.word 0xfc23bb79 -//.word 0x996009c0 -//.word 0x76faeb51 -//.word 0x62934609 -//.word 0x1dfb7e4f -//.word 0xbe01f58f -//.word 0x5289cfea -//.word 0xc6dff92b -//.word 0x074b69fd -//.word 0x67e6a75c -//.word 0x43ab8c4a -//.word 0xe2d149c3 -//.word 0xa159acf2 -//.word 0x4de39fa5 -//.word 0xd1c5f2ff -//.word 0x115e5a6c -//.word 0x15a8b9da -//.word 0x6a0d9f27 -//.word 0xc57c11d5 -//.word 0xeabb8a05 -//.word 0xccff40a3 -//.word 0xf6baa8de -//.word 0x29b43cdb -//.word 0x475d7caa -//.word 0x6f623379 -//.word 0x6a7efb07 -//.word 0x4693035c -//.word 0x40f910b8 -//.word 0xe815c2c9 -//.word 0x7f2e1920 -//.word 0xa47d37e6 -//.word 0x308368cb -//.word 0x5ea05f40 -//.word 0x2fe0c3e6 -//.word 0x0c18ea46 -//.word 0xad32e4c2 -//.word 0x3bc5bbcb -//.word 0xb1e9f955 -//.word 0x88496b88 -//.word 0x937925b9 -//.word 0x288ac698 -//.word 0x80dcfdab -//.word 0x60344cfb -//.word 0xf90e0c0d -//.word 0x0e35b213 -//.word 0x54905064 -//.word 0x1e3f5f2a -//.word 0x39e7bb5a -//.word 0x1549efea -//.word 0x261ab33e -//.word 0x8a0eb3e3 -//.word 0xec37927f -//.word 0xa88d2f08 -//.word 0x30ce2735 -//.word 0xae889b32 -//.word 0xeb733398 -//.word 0x6f05629c -//.word 0xea41ec87 -//.word 0xd2d0a666 -//.word 0x4e527d02 -//.word 0x53f6ba12 -//.word 0x0c4885b0 -//.word 0x804ba70a -//.word 0x6fc8945a -//.word 0x7ce5a818 -//.word 0x92f9b16d -//.word 0x809faeec -//.word 0xe60ad67d -//.word 0x5598dc99 -//.word 0xb2a972bd -//.word 0xdbb10c18 -//.word 0x8d8ce687 -//.word 0x861248c4 -//.word 0xe6ec09db -//.word 0xdba652dd -//.word 0x7d04a4d7 -//.word 0xf79a1c05 -//.word 0xe897f644 -//.word 0x09e251c6 -//.word 0x0f683109 -//.word 0xd3b4ca0a -//.word 0xb0c0fcb6 -//.word 0x2c0a1aa1 -//.word 0xdbebeffa -//.word 0x812403bf -//.word 0x77ba1a2d -//.word 0x5005fe7b -//.word 0xbb037ec7 -//.word 0xabf2b751 -//.word 0xb61d92e7 -//.word 0xbbf68ea0 -//.word 0xc865c0cd -//.word 0x3b60182d -//.word 0x27bce560 -//.word 0xf9429b9e -//.word 0x5b06d4a9 -//.word 0x58f49600 -//.word 0xc1acd456 -//.word 0xd0903742 -//.word 0x0c1a1e38 -//.word 0x6c74e3b8 -//.word 0xbf4260c5 -//.word 0x4bc2b199 -//.word 0xb5183c97 -//.word 0x21e3ef81 -//.word 0x9914c9eb -//.word 0xb3009cf0 -//.word 0x6eb41123 -//.word 0x5e88ecc8 -//.word 0x09f79145 -//.word 0x90adc7d3 -//.word 0x92e2bd79 -//.word 0x4de74b3b -//.word 0x06fe798f -//.word 0xab6f4510 -//.word 0xb8d8a176 -//.word 0x57c5bcc6 -//.word 0xcb8082c6 -//.word 0x0e2b66b4 -//.word 0xb90b5f37 -//.word 0x25273096 -//.word 0xd012ed28 -//.word 0x0205bb0c -//.word 0xb030d719 -//.word 0xa052da18 -//.word 0xce883b31 -//.word 0x0f6215a4 -//.word 0xf43c2aba -//.word 0xf1cc29fa -//.word 0xbef72c9f -//.word 0xfee9854a -//.word 0x1f64baf5 -//.word 0x8158ce28 -//.word 0xdab5c26f -//.word 0xd97d5c0b -//.word 0x091d27e8 -//.word 0xf9fdbbcf -//.word 0x9a563edd -//.word 0xe8442b34 -//.word 0xcc1c52f0 -//.word 0x41ff215d -//.word 0xb7af2167 -//.word 0xb4a2c351 -//.word 0xc1555daa -//.word 0x84e3707d -//.word 0x2ad62cc9 -//.word 0x083d3630 -//.word 0x81ffa8f3 -//.word 0x2a6e5a1e -//.word 0x2c1f6000 -//.word 0xeafad3de -//.word 0xe48dd5e9 -//.word 0xdba5cf6c -//.word 0x3720fd4a -//.word 0xa5fd2da8 -//.word 0x04b5c3e7 -//.word 0x82ce01d5 -//.word 0x02ad8524 -//.word 0xc2ac131b -//.word 0x3a6c958b -//.word 0x476d6005 -//.word 0x88dbb94a -//.word 0x08ab9803 -//.word 0x1ee7acb2 -//.word 0x92469ee9 -//.word 0x01009aba -//.word 0x83e00c6e -//.word 0x8a9ba779 -//.word 0x0e60acae -//.word 0xe7b069b0 -//.word 0x7a7000a9 -//.word 0x973d693e -//.word 0xa2ffbac2 -//.word 0xf1c1a6a9 -//.word 0x76c04440 -//.word 0x9ec1129c -//.word 0x78a83ad0 -//.word 0x1a471464 -//.word 0x4174eb02 -//.word 0x375e0471 -//.word 0xfa21dcc8 -//.word 0x9a97b2db -//.word 0xe37145fa -//.word 0x3c87dfdb -//.word 0xcf6d92d4 -//.word 0xea47c24d -//.word 0xa5dee476 -//.word 0xc6f38435 -//.word 0xe1d38d63 -//.word 0xc42bc537 -//.word 0x121e9702 -//.word 0x2d95151d -//.word 0x59d63d20 -//.word 0x1f597b55 -//.word 0xf0d6706d -//.word 0x0ba3f271 -//.word 0xa13d54fb -//.word 0x3625e7a5 -//.word 0x4aedc0c2 -//.word 0x3992bc4c -//.word 0x600cc21e -//.word 0x81244863 -//.word 0x6886194f -//.word 0xcf17550d -//.word 0x8088b9f8 -//.word 0xb92c200d -//.word 0xd4064aa0 -//.word 0x2727dd4f -//.word 0x2a37a935 -//.word 0xd7513060 -//.word 0x57146684 -//.word 0xdaf6b5f0 -//.word 0xc7dc44c2 -//.word 0x15e87957 -//.word 0xf892bd06 -//.word 0xc1fb7f0e -//.word 0xff7d7bcc -//.word 0xeb873c32 -//.word 0x03a8df74 -//.word 0xf4e91b04 -//.word 0xbd607ec1 -//.word 0x1202f96c -//.word 0xfeb99f5b -//.word 0xcdb7aa71 -//.word 0x2909bf4d -//.word 0x836f73c2 -//.word 0xb56b0d87 -//.word 0xe5988d30 -//.word 0xac3dee5d -//.word 0x7722a932 -//.word 0x2ea27a07 -//.word 0x14026660 -//.word 0xef01fd1f -//.word 0x68b0ddf8 -//.word 0xb4847726 -//.word 0x74aa165c -//.word 0xda9a1dff -//.word 0x0eef8f92 -//.word 0xd076d572 -//.word 0x5e85bcc3 -//.word 0x988ebeaa -//.word 0x62f382bc -//.word 0x4a1ca6b7 -//.word 0x6bc8bb70 -//.word 0x90a0910d -//.word 0x9d12b574 -//.word 0x2b5c3904 -//.word 0x73e7b382 -//.word 0x6dd78856 -//.word 0x39e06bf7 -//.word 0xbd5b20a4 -//.word 0x90998655 -//.word 0x1677d4f1 -//.word 0xed3223c1 -//.word 0x887d2d25 -//.word 0x1ad15485 -//.word 0xb605e68b -//.word 0xb41e9f8f -//.word 0x56686f53 -//.word 0xacc67ef1 -//.word 0xb4466e11 -//.word 0xc6f8e05f -//.word 0x2f01393d -//.word 0x1deba6b4 -//.word 0xbb3f5db1 -//.word 0x9c56266e -//.word 0x5d6c1a2e -//.word 0x86f6ab2d -//.word 0xb235e5d7 -//.word 0xf00cf438 -//.word 0x680fe5b4 -//.word 0x42dcb1f8 -//.word 0xc3ae7730 -//.word 0xb92f097a -//.word 0x1a8eaa9b -//.word 0xe8d216f2 -//.word 0x576ec3aa -//.word 0x32156733 -//.word 0x7bcfbaf2 -//.word 0x524d7d37 -//.word 0x1779bb70 -//.word 0xd3524f9d -//.word 0xd4f7a604 -//.word 0x9801c626 -//.word 0xed168ff1 -//.word 0x55bc4137 -//.word 0xaf6a3f5f -//.word 0x14e5135b -//.word 0x00cab1da -//.word 0xb26600be -//.word 0xd5ce96d0 -//.word 0x5f2cc3b2 -//.word 0xba58d216 -//.word 0x22a88b2e -//.word 0x4e08fd63 -//.word 0x524d7a4a -//.word 0xc4c6e2d4 -//.word 0x1d1425c5 -//.word 0x633c0367 -//.word 0x05fb167f -//.word 0x075a1380 -//.word 0x5e814dff -//.word 0x9ed07a67 -//.word 0xd22cbaee -//.word 0xab97d5c7 -//.word 0xde04c499 -//.word 0xc7697431 -//.word 0x5215c674 -//.word 0x1b44da97 -//.word 0xd4f18d92 -//.word 0xe8eb40d1 -//.word 0x5d2bdc2d -//.word 0xff65121c -//.word 0xbbdde824 -//.word 0x497c7196 -//.word 0x0e23db78 -//.word 0x403fb0c3 -//.word 0x4b9e55cf -//.word 0x7381d70b -//.word 0xbbf2e6f1 -//.word 0x06572239 -//.word 0x7d48964d -//.word 0x309e82fe -//.word 0x00cc5e75 -//.word 0xbc731b6c -//.word 0x8a30ac9e -//.word 0x89b9c57b -//.word 0xb428e321 -//.word 0x0a968c88 -//.word 0xececd8fc -//.word 0xc6f630d1 -//.word 0xf1b95652 -//.word 0xd807a5fa -//.word 0x5a509be7 -//.word 0x70bb948b -//.word 0x1075d8a5 -//.word 0x5149d86f -//.word 0xcf72b519 -//.word 0x51ad0277 -//.word 0xa992cbf7 -//.word 0xdc23d6d5 -//.word 0x83a62892 -//.word 0x71b0cba2 -//.word 0x9683cf65 -//.word 0x23998f58 -//.word 0xef81368d -//.word 0x1aea8158 -//.word 0xf0fec64c -//.word 0x10f13565 -//.word 0xcdd95e87 -//.word 0xd4c0f327 -//.word 0x0ff7cf48 -//.word 0xcaae38aa -//.word 0x15c2613e -//.word 0x69d633dc -//.word 0x8ea54d38 -//.word 0xbb964a13 -//.word 0x009242ae -//.word 0xe1129384 -//.word 0x447ce138 -//.word 0x8daf5bcd -//.word 0x07dc4015 -//.word 0x8699a26c -//.word 0x4a306ba6 -//.word 0x273d9d45 -//.word 0xe378deef -//.word 0xe0cf3320 -//.word 0xfab80c1d -//.word 0xb3c58129 -//.word 0x8e78dbfa -//.word 0xb85a566e -//.word 0xed47257b -//.word 0x9a0cb764 -//.word 0x3f343933 -//.word 0x181e5c63 -//.word 0xfc5358dd -//.word 0x85173126 -//.word 0x713e38d6 -//.word 0x4841d64c -//.word 0x3f9185a0 -//.word 0x5d2b1fd9 -//.word 0xdc6d5b60 -//.word 0xd22894b5 -//.word 0x11f6cd61 -//.word 0x4bcef32c -//.word 0x7ad5618f -//.word 0x7e77aa6c -//.word 0x08b792fd -//.word 0xb8c35d0b -//.word 0x82cc4d60 -//.word 0x5614667e -//.word 0x00497491 -//.word 0x4d114fa3 -//.word 0x6fe65e0f -//.word 0xa2245a38 -//.word 0x1060547a -//.word 0xf2fcfa61 -//.word 0xf9f81619 -//.word 0xec0b5726 -//.word 0x92f35455 -//.word 0xd209cef3 -//.word 0x1918353c -//.word 0xfc6f6e16 -//.word 0x1f35d400 -//.word 0x55fd7d45 -//.word 0x089abe75 -//.word 0xdc35f115 -//.word 0x8f9d7596 -//.word 0x24ddf784 -//.word 0x4014f000 -//.word 0xd4816f70 -//.word 0xfcde1975 -//.word 0x27ef6e1e -//.word 0x795a4e5b -//.word 0x6db9bbb4 -//.word 0xbfeee03a -//.word 0x89b652be -//.word 0xac829742 -//.word 0x7182e5ad -//.word 0x70022bc3 -//.word 0xb1f95653 -//.word 0x12dfcdb2 -//.word 0xe8c03d69 -//.word 0xe98f9c2b -//.word 0x4abc680a -//.word 0x240830ea -//.word 0x1c995635 -//.word 0x434913d0 -//.word 0x3b44bb4e -//.word 0x9cd24364 -//.word 0x9571009d -//.word 0xd727b14f -//.word 0xae16c0ce -//.word 0x7151c5df -//.word 0x1dee4c70 -//.word 0x3d5dd886 -//.word 0x0df82876 -//.word 0xdedab858 -//.word 0xbcf58bb9 -//.word 0x4f5f2890 -//.word 0xffede373 -//.word 0x5b035d0b -//.word 0xbcaa4ec6 -//.word 0x25e382cb -//.word 0x6e3c2233 -//.word 0xa2a03576 -//.word 0xa5736623 -//.word 0x1adf08d5 -//.word 0x83685762 -//.word 0xaac70155 -//.word 0x41f5e59f -//.word 0xc5861a89 -//.word 0xa83833ed -//.word 0xaeccc1a6 -//.word 0x98141a45 -//.word 0x004e5905 -//.word 0x84b0a602 -//.word 0x2644b8a5 -//.word 0xf3f69763 -//.word 0xe3eca7a7 -//.word 0x0115e20c -//.word 0xcb0565d0 -//.word 0xdc002e86 -//.word 0xc854240a -//.word 0x48ec57ba -//.word 0x97238ae3 -//.word 0x1bd6ef7a -//.word 0x48bd310d -//.word 0xc2fbb7f8 -//.word 0xc1f328dc -//.word 0xba5e2a4d -//.word 0x3c9a70cb -//.word 0x1845f3f4 -//.word 0xc40b7ff7 -//.word 0x01bc724c -//.word 0xbca2c1a3 -//.word 0x32113b1a -//.word 0x583f12b2 -//.word 0x7a569704 -//.word 0x22c84530 -//.word 0x3be30117 -//.word 0x76a5a0ca -//.word 0xedd1aa41 -//.word 0x07425d51 -//.word 0x9b80f5d8 -//.word 0x58912b3b -//.word 0x6412fc12 -//.word 0x4386ab21 -//.word 0xfbed098b -//.word 0x7599f442 -//.word 0x273d1ec2 -//.word 0xf04710ff -//.word 0x436f6e9b -//.word 0x88907c5d -//.word 0xbfb7e1df -//.word 0x677aab86 -//.word 0x9e8c94b7 -//.word 0x898e8348 -//.word 0xf6275635 -//.word 0x4056df95 -//.word 0x73072ccc -//.word 0xb1e50c01 -//.word 0xd570ced3 -//.word 0x554f4c47 -//.word 0x6de72905 -//.word 0x7a2c56c5 -//.word 0xa4b7db04 -//.word 0xbf1ad4fb -//.word 0x7370b9d1 -//.word 0x9b38e310 -//.word 0xec634c56 -//.word 0xd7ab974d -//.word 0xb02750dc -//.word 0x0f1c749f -//.word 0x77173495 -//.word 0x3538f619 -//.word 0x8bd19d14 -//.word 0x0e300a70 -//.word 0x4db8e2d0 -//.word 0xb337927e -//.word 0xaf7391a4 -//.word 0x1106e5c0 -//.word 0xb86ce952 -//.word 0x6a5b4dd7 -//.word 0x03525efb -//.word 0xd275880b -//.word 0x409819a9 -//.word 0xb29a47c3 -//.word 0xb1f475c6 -//.word 0x4991b20e -//.word 0xaee183a2 -//.word 0x2629e21e -//.word 0x221d86f0 -//.word 0xaeb065c7 -//.word 0x0c2b7849 -//.word 0x9c7cbe05 -//.word 0x00d183a8 -//.word 0x7c66e273 -//.word 0xa39b89ec -//.word 0x304abcd4 -//.word 0x32579d5a -//.word 0x6c89aa8e -//.word 0xfb988718 -//.word 0x3987fe2a -//.word 0xe23344b3 -//.word 0x752d7dd6 -//.word 0xddc5839a -//.word 0x5167e3e3 -//.word 0x792b29a1 -//.word 0xd2a75e47 -//.word 0x5308ce7f -//.word 0x51610f1b -//.word 0xa0423e4f -//.word 0xfb8d8c1e -//.word 0xa585f913 -//.word 0x51286031 -//.word 0x40bfb42c -//.word 0xa9b389da -//.word 0x5da2d6e4 -//.word 0xabb2f9c1 -//.word 0x8125fbe5 -//.word 0xd52e1635 -//.word 0x430374bf -//.word 0xf8343aa8 -//.word 0xce3bc565 -//.word 0xb854332e -//.word 0x618f26b0 -//.word 0x1023c403 -//.word 0xcf0503db -//.word 0xccb92302 -//.word 0xff697c06 -//.word 0x0d34792f -//.word 0x6dc8e5b3 -//.word 0xc933652d -//.word 0xa7f6464c -//.word 0x485b79c8 -//.word 0xd009dc9b -//.word 0xa8d6bc6d -//.word 0x21dc9750 -//.word 0x5acf26ad -//.word 0x638e9a7e -//.word 0xa2f727be -//.word 0x7600bf1e -//.word 0x1b0320fa -//.word 0xce5a108b -//.word 0x312ce75e -//.word 0xf0864f05 -//.word 0xa5ae480c -//.word 0xf9b46f2f -//.word 0x0c497fc9 -//.word 0x18d41890 -//.word 0x51c3bf80 -//.word 0x0f1f2715 -//.word 0x2e64aebd -//.word 0xb58f2b8d -//.word 0xb778e733 -//.word 0x7762e92c -//.word 0xcfd17737 -//.word 0xd39cd909 -//.word 0xb1426042 -//.word 0xdc81a7a0 -//.word 0x69251972 -//.word 0xb91fb350 -//.word 0x58d60b0a -//.word 0x25c292de -//.word 0xb33616ee -//.word 0xf07d8bf1 -//.word 0x04290a28 -//.word 0x7ca81a93 -//.word 0xa8182f66 -//.word 0x415c70b7 -//.word 0x4f70bd79 -//.word 0x4af9f1ad -//.word 0x802164d7 -//.word 0xb6a1b5af -//.word 0x121fc61a -//.word 0x39bb0758 -//.word 0xb4e5f87f -//.word 0x9871e928 -//.word 0x66ed0468 -//.word 0x30328e02 -//.word 0xfd396ada -//.word 0x6f30dfad -//.word 0xa3cd9b00 -//.word 0x59e3f756 -//.word 0x55337ca6 -//.word 0x0584a60c -//.word 0x63f6e9bf -//.word 0x1d93f243 -//.word 0xf3272fe0 -//.word 0x61519152 -//.word 0x7fdb91c2 -//.word 0x254771f5 -//.word 0x52aac4c4 -//.word 0xcfbe30cc -//.word 0x0f327366 -//.word 0x5a44a4da -//.word 0x2b92bbcf -//.word 0xd62d5406 -//.word 0x6df0b048 -//.word 0xe510fd9d -//.word 0x75f3d7bf -//.word 0x3f460ece -//.word 0x324aaa45 -//.word 0x2f6e2c2d -//.word 0x6a231791 -//.word 0x14ecaf31 -//.word 0x37b4017a -//.word 0xe16523b6 -//.word 0x84b6bd81 -//.word 0x9d45c87c -//.word 0x94e59645 -//.word 0xe33913a6 -//.word 0x7b824a0c -//.word 0x63b52b3b -//.word 0xa3d18b41 -//.word 0x606f6ca8 -//.word 0x489a7ff0 -//.word 0x31e2e73d -//.word 0xfcac404c -//.word 0xc0cce0ab -//.word 0x25565c2a -//.word 0x0db04e8d -//.word 0x7aec5683 -//.word 0xac555fdc -//.word 0x894824f6 -//.word 0x4246f278 -//.word 0x3446af43 -//.word 0x0c501ba6 -//.word 0x2f4756d1 -//.word 0x5907a38d -//.word 0x83b06b2a -//.word 0x0b4085b8 -//.word 0x0f68b47a -//.word 0x19987197 -//.word 0x025deb13 -//.word 0x10ec4dfe -//.word 0x62ff3feb -//.word 0x8edfafa4 -//.word 0x88c2d11c -//.word 0xc65864a5 -//.word 0xa1a13863 -//.word 0xff01ed01 -//.word 0x2f96fda2 -//.word 0x14c9fd1b -//.word 0x86231f5f -//.word 0xf563fc3a -//.word 0x4fcd9043 -//.word 0x24c4860c -//.word 0x099bb69b -//.word 0x3aa9ed1e -//.word 0x839becda -//.word 0x600eb365 -//.word 0x635eff15 -//.word 0xd6b811b8 -//.word 0xa277b185 -//.word 0x6fad7353 -//.word 0x0dff3909 -//.word 0x12b7f956 -//.word 0xc514c0a2 -//.word 0x3be4f744 -//.word 0xc055e6f5 -//.word 0x79097684 -//.word 0x47683bcc -//.word 0xed3ab1e4 -//.word 0x7675c695 -//.word 0xd1539911 -//.word 0xbfa882e1 -//.word 0xef735220 -//.word 0x66b3dce7 -//.word 0x257cb408 -//.word 0x064936ff -//.word 0xe894ca25 -//.word 0x0ba46727 -//.word 0xbda756b7 -//.word 0x37003981 -//.word 0xc2e24b61 -//.word 0x1e1ee9d3 -//.word 0x233952ab -//.word 0xa9c2ab06 -//.word 0xa6e24680 -//.word 0x963523a7 -//.word 0x20d8b7b0 -//.word 0xf6c4ed69 -//.word 0xfd5a6b6f -//.word 0xae3e16a1 -//.word 0xbc69d8d4 -//.word 0xf67aa1c9 -//.word 0x704dab5c -//.word 0xddcf03fd -//.word 0x40114564 -//.word 0xc49ba681 -//.word 0xe70238b2 -//.word 0xdebd6a39 -//.word 0x3534ceed -//.word 0xb71a202f -//.word 0x8dfd8320 -//.word 0xaa1b0d12 -//.word 0x6678863c -//.word 0x682d6db1 -//.word 0xca033c93 -//.word 0x7840ee83 -//.word 0xd9c1bd5d -//.word 0xb2493022 -//.word 0x47195536 -//.word 0xc3c14bcc -//.word 0xd935049e -//.word 0xac2349e1 -//.word 0xec84ff78 -//.word 0x4272a868 -//.word 0xef392d8c -//.word 0xb0b0da8a -//.word 0xe4caaa05 -//.word 0xf068c514 -//.word 0xe37147f3 -//.word 0x562543f9 -//.word 0x97ae08ca -//.word 0x06f8a2ce -//.word 0xbec3a4e2 -//.word 0x78f7254d -//.word 0xad3709f5 -//.word 0xfbb882d3 -//.word 0xca54d5a4 -//.word 0x2fda62e1 -//.word 0x11a9dff2 -//.word 0x8a7de49f -//.word 0x8f88acc7 -//.word 0xd4c51a54 -//.word 0xea89fa6e -//.word 0xaa5b8aef -//.word 0xd7053817 -//.word 0xffebae82 -//.word 0xa29c0c56 -//.word 0x97a774c1 -//.word 0xaab0cca3 -//.word 0x8ac2bf87 -//.word 0xe3e705d8 -//.word 0xc7f6e552 -//.word 0x52adf8b6 -//.word 0x8eff2fc2 -//.word 0x94af1760 -//.word 0xf41e5c1e -//.word 0x57628dde -//.word 0x63971ece -//.word 0xdf7ab39b -//.word 0x18349ce2 -//.word 0x83739be8 -//.word 0xa3bfee8a -//.word 0x2d0c8977 -//.word 0x6b8ba49c -//.word 0xdec675e0 -//.word 0x27ec3f12 -//.word 0x28698b1f -//.word 0x66bab589 -//.word 0xb180ab14 -//.word 0x08d3f2c3 -//.word 0xb7d8ea02 -//.word 0xc2965225 -//.word 0x86050e11 -//.word 0x9e682839 -//.word 0x04dd16cd -//.word 0x78333b2d -//.word 0x26fbb0a4 -//.word 0x83e24353 -//.word 0x783ec06b -//.word 0xc2e670a0 -//.word 0x9947e0da -//.word 0x8fb4e32d -//.word 0xbcfeda0b -//.word 0x184533b8 -//.word 0x280d30ff -//.word 0xdd94ea24 -//.word 0xb9649519 -//.word 0x332405f4 -//.word 0x5db371a1 -//.word 0xc47878d4 -//.word 0x97f36142 -//.word 0x0c98a711 -//.word 0x00deb58d -//.word 0xde93ee1c -//.word 0xc172f074 -//.word 0xddf71a0b -//.word 0x1b724ccf -//.word 0x035bed18 -//.word 0xdfe533db -//.word 0x1dd59e20 -//.word 0xf695c6b6 -//.word 0x4d845725 -//.word 0xda915ae4 -//.word 0x8708b6cc -//.word 0x1aabf6cd -//.word 0x15054ce0 -//.word 0xdafbd63c -//.word 0x13a421cd -//.word 0x515bece2 -//.word 0xf3122e26 -//.word 0x4ae95ad1 -//.word 0xfbffe11f -//.word 0xa487f802 -//.word 0xc21f9d13 -//.word 0xd25ed4cf -//.word 0xb6ac3700 -//.word 0x5b57ad79 -//.word 0x99e37a06 -//.word 0x5aa178a3 -//.word 0xff83a3ec -//.word 0xff2edbd5 -//.word 0xd151e69b -//.word 0x0d35b5fb -//.word 0xce96e8a1 -//.word 0x5ab294e3 -//.word 0x059f43af -//.word 0x52e13cc2 -//.word 0x5c3c051b -//.word 0x74c727b0 -//.word 0x0c42315f -//.word 0xd4a9ff27 -//.word 0x22093c98 -//.word 0x97932688 -//.word 0x00ef9108 -//.word 0x7ad32f97 -//.word 0xdad30e95 -//.word 0x4b7b62fa -//.word 0x399b8547 -//.word 0x6ee23cbd -//.word 0x7bae3ccd -//.word 0x5a23edd1 -//.word 0x517b6df9 -//.word 0x199cd888 -//.word 0x40f0c740 -//.word 0xcc71161a -//.word 0x2103eb3b -//.word 0x2507f324 -//.word 0xa12def29 -//.word 0xeb897024 -//.word 0xc2eade6a -//.word 0x7967bffe -//.word 0x583a3605 -//.word 0x3fd2ca7a -//.word 0x8c236923 -//.word 0x3f41adc4 -//.word 0x5c2d5e92 -//.word 0x91ee37ea -//.word 0x19e4ed43 -//.word 0xe05a6d62 -//.word 0xe85a65cd -//.word 0xebc50781 -//.word 0x42a30ae7 -//.word 0x05b7f105 -//.word 0x74568ff1 -//.word 0x957acb8c -//.word 0x1f13a16c -//.word 0x979d691a -//.word 0xb9f75c7e -//.word 0x19735497 -//.word 0x0a2ad370 -//.word 0xbf92474f -//.word 0xb0528c2f -//.word 0x3f54b370 -//.word 0x9c1c02ce -//.word 0xe6593b90 -//.word 0x93ba2201 -//.word 0x11033924 -//.word 0xad60cea4 -//.word 0xb5f9370a -//.word 0xd9c65d32 -//.word 0xd7a57700 -//.word 0x58aa184f -//.word 0x14b66c2a -//.word 0x3d4bbe3f -//.word 0x1b9e3e90 -//.word 0xf4ee026c -//.word 0x2e154a9e -//.word 0xb75d08e4 -//.word 0xa594a0a3 -//.word 0x1a63ecd8 -//.word 0x6bdb8352 -//.word 0x81513b1f -//.word 0x7f6cec44 -//.word 0xa47c77b1 -//.word 0x740d0773 -//.word 0x12bd972c -//.word 0xf14ab5c0 -//.word 0xabef8552 -//.word 0x31f1086f -//.word 0x25759e88 -//.word 0x8494caa6 -//.word 0x88b13659 -//.word 0xcd0af7f1 -//.word 0xb28e11f1 -//.word 0x02ef3ec1 -//.word 0xd4f7eba3 -//.word 0xaf1f84e8 -//.word 0xf25ef164 -//.word 0x733f611f -//.word 0x6736464d -//.word 0x8234a081 -//.word 0x5f797f1d -//.word 0x21aac30d -//.word 0x5b2327b5 -//.word 0x2d8e7e27 -//.word 0xb0b43c9a -//.word 0x94943718 -//.word 0x08b2af76 -//.word 0xdab28c89 -//.word 0xe025e897 -//.word 0x96a3cd0c -//.word 0x081a406e -//.word 0xf3657e93 -//.word 0x27218512 -//.word 0x2fbcd6f7 -//.word 0x34ce7abb -//.word 0x1fad4373 -//.word 0xfe3c5447 -//.word 0xa903e326 -//.word 0xa5853eb8 -//.word 0x48cd0c94 -//.word 0x1e4bd6b4 -//.word 0x8cdec625 -//.word 0xb332ae03 -//.word 0x974c4ba5 -//.word 0x8163cc15 -//.word 0xa2f28ec3 -//.word 0xf80b2a7a -//.word 0x76eeb192 -//.word 0x5fda3668 -//.word 0xf3238d0b -//.word 0x4d855338 -//.word 0x8cb82e89 -//.word 0x314456e9 -//.word 0xc897554b -//.word 0xcb550b9c -//.word 0xc3eff4f5 -//.word 0xb077ae16 -//.word 0xabb3b510 -//.word 0xca707241 -//.word 0x44187485 -//.word 0xd587fdab -//.word 0x641bc026 -//.word 0xe40ae905 -//.word 0x78f95e26 -//.word 0xdaca44a6 -//.word 0xfdb5c69b -//.word 0xf19a1106 -//.word 0x0895a303 -//.word 0x37d4c643 -//.word 0xbea557bc -//.word 0x0bd3cc9f -//.word 0xdc33768b -//.word 0xa57a0200 -//.word 0x31514616 -//.word 0x8bac3b6f -//.word 0x1f57456a -//.word 0x1dd1bb99 -//.word 0x1e5ea376 -//.word 0x0a58bd51 -//.word 0x39c6c48d -//.word 0xd830f00c -//.word 0x8fb1bfe8 -//.word 0x604df564 -//.word 0xd385e122 -//.word 0x5029e396 -//.word 0xcc6e2bba -//.word 0xa840c303 -//.word 0xd5d9d094 -//.word 0x3d9315b3 -//.word 0x5efab879 -//.word 0x382649cd -//.word 0x6a480093 -//.word 0x98824620 -//.word 0x0ffc77f1 -//.word 0xac34e79d -//.word 0xfa952309 -//.word 0x9a4c79db -//.word 0xe857ba31 -//.word 0xdbde3e92 -//.word 0x2dc72925 -//.word 0xbc85ed20 -//.word 0x31301084 -//.word 0xdfdb3008 -//.word 0xee224452 -//.word 0xb802246d -//.word 0x73ee4c78 -//.word 0x111edc9b -//.word 0x642be440 -//.word 0x86d9df7f -//.word 0x78337dd9 -//.word 0x09dea62a -//.word 0xf9a7bbd9 -//.word 0x5f5e1f52 -//.word 0x48e7f6b6 -//.word 0xa18e2cd0 -//.word 0x579b8000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00017110 -//// expected output -//.word 0x7268dc37 -//.word 0x1d074f60 -//.word 0x6ba817ad -//.word 0x4a8868e5 -//.word 0x5f391724 -//.word 0x640f2f2b -//.word 0xc85308b2 -//.word 0xb27aa312 -//.word 0xcedb9427 -//.word 0x424dd909 -//.word 0xabe8ba28 -//.word 0xb6ec7e69 -//.word 0x3894f867 -//.word 0x712b8675 -//.word 0x4bdbffdd -//.word 0x5eb4654e -//// SHA512LongMsgvector_119 -//// vector length -//.word 0x00017428 -//// input message -//.word 0x71dd3fd4 -//.word 0xd9b0e6c8 -//.word 0x835a2c63 -//.word 0xac37d7e4 -//.word 0xe1a987fc -//.word 0x67f83b39 -//.word 0xd95d18c5 -//.word 0x13596650 -//.word 0x4f4bdc4b -//.word 0x8e421d57 -//.word 0x3a1082fd -//.word 0x09a01a9f -//.word 0x2489efae -//.word 0x89e28b1e -//.word 0xad59bb17 -//.word 0x667f93ee -//.word 0x0966b253 -//.word 0xcf6ec8cc -//.word 0x7e5c5562 -//.word 0x45acb399 -//.word 0xe72956a6 -//.word 0x1cba53dd -//.word 0x347f1f69 -//.word 0xfd1c993f -//.word 0xe7554b55 -//.word 0x66dced0e -//.word 0x98662bf9 -//.word 0x2804a9bc -//.word 0x72b1434b -//.word 0xe727995e -//.word 0xb3f8cb21 -//.word 0x9ed9812d -//.word 0x30412fb7 -//.word 0x19339707 -//.word 0xd0578f2c -//.word 0x795004ef -//.word 0x0c4a3f05 -//.word 0xb4d26789 -//.word 0x75eb47a9 -//.word 0x125e529f -//.word 0x2e51e4e3 -//.word 0xb11bcb9e -//.word 0x6d570662 -//.word 0x0237cc19 -//.word 0xfe1cd13c -//.word 0x4963c446 -//.word 0xc1811c67 -//.word 0x2152147c -//.word 0x27aef43f -//.word 0xf63e93bb -//.word 0xb98d1a04 -//.word 0x89620a24 -//.word 0x914e8158 -//.word 0x6f81b97d -//.word 0xdee1d1c5 -//.word 0x925ed0ae -//.word 0x647fe735 -//.word 0xaf41f646 -//.word 0xfa225278 -//.word 0xd779c6f7 -//.word 0x0a08d7c1 -//.word 0xeed44c16 -//.word 0x1535ee29 -//.word 0x2f298d1c -//.word 0x2ded432b -//.word 0xa6cffd28 -//.word 0x793e3627 -//.word 0xb423067a -//.word 0xb4745ce0 -//.word 0x8e0587f9 -//.word 0xaea2fcfd -//.word 0xbe5c53ae -//.word 0xca20928b -//.word 0xa18eae47 -//.word 0x7e074f79 -//.word 0xe708d495 -//.word 0xd6b7971b -//.word 0x17bc720e -//.word 0xf15282a8 -//.word 0x089e2a4c -//.word 0x823f5bbc -//.word 0x6926138c -//.word 0x50a824d7 -//.word 0x3ad13730 -//.word 0xb7fc10db -//.word 0x50a0143e -//.word 0x256d0892 -//.word 0xd5981bde -//.word 0x9e732726 -//.word 0xc64034df -//.word 0x39473ea7 -//.word 0x73263833 -//.word 0xa0695089 -//.word 0x025a756f -//.word 0x941a1623 -//.word 0xedf12d4c -//.word 0x66e37d31 -//.word 0x7f841729 -//.word 0x7f0d2352 -//.word 0x5baedd86 -//.word 0xd926de8b -//.word 0xf5929d8a -//.word 0x848235c3 -//.word 0x1752697e -//.word 0x22b8e545 -//.word 0x5e99c650 -//.word 0x6b215d41 -//.word 0xba123012 -//.word 0xaa5c424b -//.word 0xf1ef9578 -//.word 0x3ecdecda -//.word 0x1d63d55d -//.word 0x1a19e7ca -//.word 0x2928493e -//.word 0x45ab74db -//.word 0x58fa39bd -//.word 0x5b33052f -//.word 0xbe19641f -//.word 0x0a22c4d0 -//.word 0xc5cb7ccf -//.word 0x962f0c28 -//.word 0xa9d8a6d9 -//.word 0x55d5ee87 -//.word 0xfc0cff70 -//.word 0x33d2aea1 -//.word 0x23b91269 -//.word 0x2fa9440d -//.word 0xd83363bd -//.word 0xdd21dbc7 -//.word 0xa652e70b -//.word 0xe2c555af -//.word 0x70f38a14 -//.word 0x7b62c508 -//.word 0xea77a83d -//.word 0xf78cf4f9 -//.word 0x1d429410 -//.word 0x3818dd10 -//.word 0xe83d14bb -//.word 0x36a330ba -//.word 0x7a55e28f -//.word 0x7c0ad3cc -//.word 0xd9fa2d82 -//.word 0xa8f05cfd -//.word 0x5ea116ae -//.word 0xef3c9869 -//.word 0x364233d1 -//.word 0x97980810 -//.word 0xe3db10cb -//.word 0x7bf35f54 -//.word 0xb9eba922 -//.word 0x8bff057f -//.word 0x61f7f181 -//.word 0x4ab4963b -//.word 0x59094e34 -//.word 0x4ecc6419 -//.word 0x722c1bae -//.word 0xc344f10a -//.word 0x51f12404 -//.word 0xe8e176e9 -//.word 0xefed2d70 -//.word 0x90a95fef -//.word 0x1a396cce -//.word 0xa366cc3c -//.word 0xf1f10b22 -//.word 0x9b261155 -//.word 0x6bb5a710 -//.word 0x07be37a1 -//.word 0xd02bd362 -//.word 0x0b4279eb -//.word 0x3f7a9686 -//.word 0xdd8ec8e4 -//.word 0x26d1e80e -//.word 0x4ac1489d -//.word 0xcdde392e -//.word 0x2fbdd111 -//.word 0xcc58eb41 -//.word 0x01a86e99 -//.word 0x9076d344 -//.word 0x466ee176 -//.word 0xdb75bb59 -//.word 0x193c1d4b -//.word 0x4015e346 -//.word 0xaa06cb9f -//.word 0xab1c7bf4 -//.word 0xbb02c660 -//.word 0xd7d22bf0 -//.word 0x242b9e5b -//.word 0xd6848ced -//.word 0x50c019c5 -//.word 0x8c02ac40 -//.word 0xbec2adb5 -//.word 0x34218d63 -//.word 0x817907a7 -//.word 0xda39a673 -//.word 0xc0f088fb -//.word 0xe0a761b1 -//.word 0x3774c274 -//.word 0x794c9c04 -//.word 0xb41900ba -//.word 0x300c2876 -//.word 0x9b35bbd8 -//.word 0x62514db3 -//.word 0x62e325be -//.word 0xc086448d -//.word 0x1581a3c0 -//.word 0xcf9cbb7b -//.word 0xd4324a16 -//.word 0x68885515 -//.word 0x505d695a -//.word 0x37c22799 -//.word 0x522c000d -//.word 0x40c83c69 -//.word 0x340e4112 -//.word 0x5599128b -//.word 0x65361630 -//.word 0xa13b1b28 -//.word 0xe91a9a95 -//.word 0x21353c0d -//.word 0xd7f49e4e -//.word 0x2615512d -//.word 0xda4426d0 -//.word 0xd4eca81d -//.word 0xb14ce972 -//.word 0xa6cd8297 -//.word 0xae93d5f1 -//.word 0xe85295f8 -//.word 0x3a6389eb -//.word 0x3b178cc2 -//.word 0x504bd964 -//.word 0x153c851a -//.word 0xfe9d4d43 -//.word 0x3ee7924a -//.word 0xe7f1a2d6 -//.word 0x53c03940 -//.word 0xc4a0484a -//.word 0x4773f40e -//.word 0xde4ae234 -//.word 0xdd32b268 -//.word 0x9551c90b -//.word 0x30315429 -//.word 0xdc5b89ac -//.word 0x2c2830cf -//.word 0xbad463d5 -//.word 0x12d492fa -//.word 0xcb69caaa -//.word 0xf77636f1 -//.word 0xbe8fe633 -//.word 0x4552cf1d -//.word 0xd5fa13db -//.word 0x3931838b -//.word 0x672662f2 -//.word 0x63e06c6e -//.word 0x61d2172c -//.word 0x2aaf199b -//.word 0xc07f2a21 -//.word 0x45f30b0c -//.word 0x19f5c7cb -//.word 0x4384395e -//.word 0x12bfce0b -//.word 0x033f8d53 -//.word 0xe6aa5424 -//.word 0x3d856450 -//.word 0xe54a1f3e -//.word 0xf8bb11e0 -//.word 0xf1752ee4 -//.word 0x11c85a2f -//.word 0x02c62f87 -//.word 0xbb9afa8f -//.word 0xa31c06f9 -//.word 0xf9a21ef7 -//.word 0x73184df2 -//.word 0x2553e87f -//.word 0xa5a2ce8f -//.word 0x6da6efe5 -//.word 0x80640bce -//.word 0x5199bc0c -//.word 0xe04db713 -//.word 0x26ab4f78 -//.word 0xb3103ba6 -//.word 0x966298d3 -//.word 0x7da33232 -//.word 0x1dc6ff6a -//.word 0xd4c1ec48 -//.word 0x8de3dcb0 -//.word 0xe568eeda -//.word 0x8c4bffbb -//.word 0xed5b71c0 -//.word 0x11912ac2 -//.word 0xc0a1df37 -//.word 0xeacf92a5 -//.word 0x4604595d -//.word 0x39216265 -//.word 0xf99334b6 -//.word 0xf22837a7 -//.word 0x692077aa -//.word 0x5f88a536 -//.word 0xb8c35f04 -//.word 0x9c6ab07e -//.word 0x1e56db75 -//.word 0x1bfa5412 -//.word 0x65f6100f -//.word 0x21eafe26 -//.word 0x6e88d6ca -//.word 0x48ee1116 -//.word 0xab323803 -//.word 0xfb3e62dd -//.word 0xa3def9f8 -//.word 0xfd17bc9f -//.word 0x72bb0a4d -//.word 0xe23a5d20 -//.word 0x45bb158a -//.word 0x936b774a -//.word 0xe215f59a -//.word 0xcef4afaa -//.word 0x1ec53b4e -//.word 0xa51fa1f3 -//.word 0x6507aad8 -//.word 0xfbc05b7b -//.word 0x37e0bc51 -//.word 0x0aa9deb9 -//.word 0xa5951b33 -//.word 0xdf33a0cd -//.word 0xd73229df -//.word 0xdbbb0cf8 -//.word 0x89057918 -//.word 0x34230020 -//.word 0x8a205386 -//.word 0x734d4e4d -//.word 0x3cda3435 -//.word 0xf4a43c2f -//.word 0x164e4c13 -//.word 0x69930495 -//.word 0x25dafe76 -//.word 0x570b54f7 -//.word 0x86a26393 -//.word 0x9702cfed -//.word 0xee0bc808 -//.word 0xd6ee8bb6 -//.word 0x23402b53 -//.word 0x164e91b2 -//.word 0x80b1c158 -//.word 0x2a2260e8 -//.word 0x758f73df -//.word 0x3e6e6a81 -//.word 0x04515d14 -//.word 0x4dba954b -//.word 0x45314e05 -//.word 0xa995bb38 -//.word 0xe3b04b27 -//.word 0x770d2bdc -//.word 0x9d0e0cd2 -//.word 0x2f3926f2 -//.word 0xc6d37dc0 -//.word 0x21b063d7 -//.word 0xc6493e93 -//.word 0xeb0f8b0d -//.word 0x96ff234c -//.word 0x0477bdb9 -//.word 0x4848b5d4 -//.word 0x340c0c26 -//.word 0x7cbaaf76 -//.word 0x1977fc40 -//.word 0xecaf8263 -//.word 0xa465081a -//.word 0xe1c7d12d -//.word 0x99061f69 -//.word 0xbc64f64d -//.word 0x138f2206 -//.word 0x6e2d7c9e -//.word 0xfeb86870 -//.word 0x008ca2df -//.word 0x9b3e3b47 -//.word 0x0c30de34 -//.word 0x006258d2 -//.word 0x418b57a5 -//.word 0x9569727a -//.word 0xe4556a9e -//.word 0x981ab04d -//.word 0x4907276d -//.word 0x9a432a7d -//.word 0x5e61d1c8 -//.word 0x003470de -//.word 0x21e56144 -//.word 0x8242046b -//.word 0x255903df -//.word 0xaf46dbc1 -//.word 0x11499877 -//.word 0x671cdfa2 -//.word 0x20833250 -//.word 0x60247074 -//.word 0xa2999b93 -//.word 0xa2c4debf -//.word 0x7a62cfc9 -//.word 0x0be3f1b3 -//.word 0x9e7a7d64 -//.word 0xcb70629f -//.word 0x9bbd8a36 -//.word 0xe9d95f7b -//.word 0x0ed08ef8 -//.word 0xbd950a60 -//.word 0x2b9855c5 -//.word 0x739afb0a -//.word 0x3ac05f9c -//.word 0x8ee7b95d -//.word 0x143860e1 -//.word 0x63fc45dd -//.word 0xabb1c0dc -//.word 0x9a5d9034 -//.word 0x80221d39 -//.word 0xb113ffb0 -//.word 0x2b46c487 -//.word 0x782aeec3 -//.word 0xd61b3cb9 -//.word 0x96342b81 -//.word 0xc265bba8 -//.word 0x02c57625 -//.word 0xc029af8e -//.word 0x8bf5088c -//.word 0xb932378d -//.word 0x51e109b8 -//.word 0x288fa626 -//.word 0x492a184f -//.word 0x9a1307c2 -//.word 0xbd74c61a -//.word 0x35d4942d -//.word 0xcae91b86 -//.word 0x2ead3d16 -//.word 0xe0b41026 -//.word 0x51bc2790 -//.word 0x4686142f -//.word 0x7de42a94 -//.word 0x931488fa -//.word 0x254c537c -//.word 0x36964286 -//.word 0xd0de608a -//.word 0xee490df4 -//.word 0x9ac9465f -//.word 0x53ef2709 -//.word 0xb100ae84 -//.word 0x4c4ac2af -//.word 0xd9b874e5 -//.word 0x96a58474 -//.word 0xe9ee2751 -//.word 0x434b070a -//.word 0x4bdf8cfb -//.word 0x390d5ac5 -//.word 0x7f8e1bfc -//.word 0xafc07e20 -//.word 0x99417fcf -//.word 0xb3bdea38 -//.word 0xbf041ad3 -//.word 0xa7600750 -//.word 0xac2580cd -//.word 0xbf89b44b -//.word 0x2fb6f763 -//.word 0x851ec335 -//.word 0xad0ffda2 -//.word 0x56877abb -//.word 0x9a49c278 -//.word 0xe23014ae -//.word 0x04c4aa3b -//.word 0xaf0b3d83 -//.word 0x09a2cc21 -//.word 0x960b9ad6 -//.word 0x5c4976c5 -//.word 0x45aa3ee3 -//.word 0xc4e5a6a9 -//.word 0xbb64360c -//.word 0x9de392ae -//.word 0xd03afe56 -//.word 0x5577219e -//.word 0xaa3009eb -//.word 0xef1870a2 -//.word 0x49cf3e99 -//.word 0x84ff4fcc -//.word 0xfca47552 -//.word 0xbdabc18f -//.word 0xe9bffeaa -//.word 0x5a607f41 -//.word 0x89351b5c -//.word 0xaea375a0 -//.word 0x299e81c6 -//.word 0x21bf434b -//.word 0x6b97da68 -//.word 0xad44be44 -//.word 0xc3414669 -//.word 0x61836d74 -//.word 0xfac1d511 -//.word 0xe1130c27 -//.word 0xafbe0f50 -//.word 0xe44e0c8c -//.word 0xd1e66c36 -//.word 0xb5d51137 -//.word 0x2669dc79 -//.word 0xb208739f -//.word 0xc77c41f3 -//.word 0xd08fbe9f -//.word 0xa1d8f021 -//.word 0x15d432f9 -//.word 0xf53934a4 -//.word 0x1c8643ce -//.word 0xd9dfcac4 -//.word 0x95181928 -//.word 0xb61066e8 -//.word 0xc3401170 -//.word 0xc8932d1f -//.word 0xfc783bf8 -//.word 0xa136389b -//.word 0x2c81db73 -//.word 0xa64a1830 -//.word 0x52dbe878 -//.word 0x90224cd9 -//.word 0x014d8f03 -//.word 0xec98cc34 -//.word 0xe063b1f3 -//.word 0x9b888201 -//.word 0x2beb618d -//.word 0x5353cca7 -//.word 0x307867f7 -//.word 0x1c5dfcaf -//.word 0xd3dfc0be -//.word 0xd58ed847 -//.word 0x0bbd1b51 -//.word 0xacd51ac0 -//.word 0x62ef5d84 -//.word 0xa9a1f010 -//.word 0x78171f0d -//.word 0x24667d50 -//.word 0x811e2b0a -//.word 0x4a1e563f -//.word 0xc3ad027a -//.word 0x9cc606be -//.word 0x19b258bf -//.word 0x70dd8b52 -//.word 0x73e29623 -//.word 0x6ee8d7a6 -//.word 0x53315850 -//.word 0x14f05006 -//.word 0x515bedd6 -//.word 0x330250e5 -//.word 0x985fdaa8 -//.word 0x70aea657 -//.word 0x66ff569f -//.word 0xc4891398 -//.word 0x9041cff6 -//.word 0xfbabcd83 -//.word 0xfdf064cd -//.word 0x3932001b -//.word 0x261c69a6 -//.word 0x70bd4806 -//.word 0x9c96e7eb -//.word 0xecf1380d -//.word 0x82751966 -//.word 0xc7f8d69e -//.word 0x0e94efc7 -//.word 0x75fd1c4a -//.word 0x0c118f21 -//.word 0x3ab17947 -//.word 0x5cd0cf6d -//.word 0xaec94eef -//.word 0x6ff6bd06 -//.word 0x407e723f -//.word 0xce6e172c -//.word 0xb00cae59 -//.word 0x9368d381 -//.word 0x94334102 -//.word 0xedd4988f -//.word 0xd4b95e25 -//.word 0xa0eb4340 -//.word 0x2ee6a94e -//.word 0x83a76364 -//.word 0xb206bd30 -//.word 0x0046bd2f -//.word 0x47eba91f -//.word 0x98cbc9b8 -//.word 0x24686e97 -//.word 0x5d7d347b -//.word 0x58d783b3 -//.word 0x76665cd7 -//.word 0x439452b7 -//.word 0x9ed5d691 -//.word 0x1b80b887 -//.word 0xa5ddeb4f -//.word 0x687f892d -//.word 0xeed4161e -//.word 0x87fa0956 -//.word 0xefd488ed -//.word 0x2b5e74d6 -//.word 0xb43da510 -//.word 0xd79b7720 -//.word 0x5c3185be -//.word 0x66a5b4cf -//.word 0x9a177493 -//.word 0x83f74220 -//.word 0x3519710f -//.word 0x310b2b75 -//.word 0x89a6b315 -//.word 0x45e3ecd3 -//.word 0x04f01f6c -//.word 0xe783f965 -//.word 0xaa6fd341 -//.word 0x147537f7 -//.word 0x925c9fa3 -//.word 0x1f437f7c -//.word 0x66378606 -//.word 0x2b012189 -//.word 0xe74142c1 -//.word 0xb2c15fd7 -//.word 0x6603bd90 -//.word 0x021ceec5 -//.word 0x4cc59913 -//.word 0xbbb079d3 -//.word 0x9318a84c -//.word 0x529c1e28 -//.word 0x4b4d7425 -//.word 0x9106ee0d -//.word 0x16fcb9e8 -//.word 0x14957170 -//.word 0xac7ee7c5 -//.word 0xcef82062 -//.word 0x5872a150 -//.word 0x825de999 -//.word 0x793c4000 -//.word 0x4afaafef -//.word 0x028150b1 -//.word 0x1388c8e1 -//.word 0xfaac1123 -//.word 0x1fc37d12 -//.word 0xfd6df779 -//.word 0x82eb8cc5 -//.word 0xb9352bba -//.word 0xa646a966 -//.word 0x72bb0853 -//.word 0xc89cf901 -//.word 0x7e7a9f93 -//.word 0x78ba96c9 -//.word 0xc930342e -//.word 0x1cf00f93 -//.word 0x5360bfbb -//.word 0x6d92e558 -//.word 0xadd16c36 -//.word 0xf87a0eb7 -//.word 0x800e1a7f -//.word 0x9f847570 -//.word 0x05e4dfd9 -//.word 0x161178ea -//.word 0x8ee6836c -//.word 0x678569af -//.word 0xfcec01c3 -//.word 0x6eca0eea -//.word 0x47900a4e -//.word 0x5dca22f0 -//.word 0xfab081e1 -//.word 0x39f8d1b4 -//.word 0xb3efff33 -//.word 0x5bc83f51 -//.word 0xa7345160 -//.word 0xf1330284 -//.word 0x1c29f568 -//.word 0x7a34a32f -//.word 0xedbda1ae -//.word 0x4d4d22d8 -//.word 0x0aa2bc79 -//.word 0x13036f28 -//.word 0xf6d0e376 -//.word 0x485df16c -//.word 0x47006535 -//.word 0xbe690217 -//.word 0x2932c7a8 -//.word 0x1ab7713e -//.word 0xdb2841a7 -//.word 0x55ddff1a -//.word 0x30e93f6e -//.word 0x3cf1e38a -//.word 0x103fe11d -//.word 0xf112478f -//.word 0xf5387c37 -//.word 0x67dfc8ce -//.word 0x6ea91623 -//.word 0xeafef911 -//.word 0x9fa6eeae -//.word 0x9597e1c6 -//.word 0xbe0bf288 -//.word 0xdad6787e -//.word 0x98f746c3 -//.word 0xfe6d2e70 -//.word 0x0a4cc457 -//.word 0x9a0f64f4 -//.word 0x893077a0 -//.word 0x1bf6f108 -//.word 0x9b8f1ede -//.word 0x425e9fce -//.word 0x5b96b0b4 -//.word 0xa508ac0c -//.word 0xf939d2a9 -//.word 0x2cb849ab -//.word 0x37ae62ab -//.word 0x95b71e38 -//.word 0xedf0f087 -//.word 0xf152c366 -//.word 0x863e3f72 -//.word 0x2558488a -//.word 0x8199c883 -//.word 0x6aa0af1d -//.word 0xf1493836 -//.word 0xcd816d3e -//.word 0xfd59edeb -//.word 0xaf59ed2e -//.word 0x61167d65 -//.word 0x46060cd2 -//.word 0xeb942f4c -//.word 0x1a709e34 -//.word 0xff297fab -//.word 0x89fde802 -//.word 0x13f09f72 -//.word 0x441b240e -//.word 0x3347f1f5 -//.word 0xcfba00cc -//.word 0x7f518e6c -//.word 0x05cf1fd7 -//.word 0xa875c271 -//.word 0x92d3966d -//.word 0x77dd8d85 -//.word 0x774170ee -//.word 0x46f8238b -//.word 0x8a1b2b61 -//.word 0x84f96d4b -//.word 0xf36638ee -//.word 0x355686f0 -//.word 0xb0aa7f65 -//.word 0x70493f8a -//.word 0x1173d9b6 -//.word 0xe0529c8d -//.word 0x3dd29577 -//.word 0x44b35451 -//.word 0xacddf362 -//.word 0xeef35590 -//.word 0xaa2aacd3 -//.word 0x475c3eeb -//.word 0xdb58684e -//.word 0x4a7de365 -//.word 0xb18746f7 -//.word 0x05a8cce6 -//.word 0xf7db5819 -//.word 0x1b75b6b9 -//.word 0x4afc24a0 -//.word 0x453d110e -//.word 0x9a99249e -//.word 0xcca08079 -//.word 0xaee147ca -//.word 0x10ff5c72 -//.word 0x9d086efc -//.word 0x040332d3 -//.word 0x56c8efb2 -//.word 0xaf15405d -//.word 0x19dd168f -//.word 0xade3fc33 -//.word 0xfc889fd6 -//.word 0xade18d5d -//.word 0x670d3df3 -//.word 0xf1c65046 -//.word 0x973516f3 -//.word 0xd00b543e -//.word 0x1fcd4407 -//.word 0x376fdefa -//.word 0x62255605 -//.word 0x2376e60f -//.word 0x1a92cde7 -//.word 0x29e5987a -//.word 0xd5eca04a -//.word 0xef48d41b -//.word 0x7311b8ef -//.word 0xb06cae35 -//.word 0xa960753e -//.word 0xbce5eff0 -//.word 0x813e27be -//.word 0xf58992d8 -//.word 0xd895959e -//.word 0x53f3485b -//.word 0xde507a30 -//.word 0x6102f54e -//.word 0x99e00268 -//.word 0xbe573069 -//.word 0x63ba5262 -//.word 0x9ddac7c6 -//.word 0x67d7fed9 -//.word 0x45353866 -//.word 0x283290b0 -//.word 0x925739ac -//.word 0xfa4e086d -//.word 0x72f332e0 -//.word 0x87ad56b9 -//.word 0x69ffbead -//.word 0x4c5ae2e2 -//.word 0x0d362da4 -//.word 0x19610459 -//.word 0x8b9605b7 -//.word 0x94518c34 -//.word 0x20e27cbe -//.word 0xb6c03cad -//.word 0xa021fff6 -//.word 0x4dc749a1 -//.word 0xf31daf7d -//.word 0x7882de12 -//.word 0x93e5ded7 -//.word 0x2f9298a5 -//.word 0x104b966c -//.word 0xb89b0b25 -//.word 0x8c671307 -//.word 0x33c63bfe -//.word 0x3f134459 -//.word 0x0f4024c2 -//.word 0xf36c4e74 -//.word 0x92b833a8 -//.word 0x89570950 -//.word 0x55e5cb08 -//.word 0x73fa814a -//.word 0xc5fec1e1 -//.word 0x383f76a0 -//.word 0xa440e053 -//.word 0xf455dcf6 -//.word 0x866c6625 -//.word 0xd52e5cd4 -//.word 0x55478440 -//.word 0x9e01d125 -//.word 0xcd18e232 -//.word 0x27caccba -//.word 0x002d19ac -//.word 0xdcc511c5 -//.word 0xd3563804 -//.word 0x3af7175f -//.word 0x7f683fb4 -//.word 0x55a58c02 -//.word 0x11bba7d9 -//.word 0x54dbce0f -//.word 0xebadd8b5 -//.word 0xf3e67349 -//.word 0x411db12d -//.word 0x01dbc358 -//.word 0x9cf1044c -//.word 0xe00e3948 -//.word 0x5b9016be -//.word 0x079b0507 -//.word 0x2d682456 -//.word 0x83e08ceb -//.word 0x976ad989 -//.word 0x7101e729 -//.word 0x7489d9f0 -//.word 0x8663605f -//.word 0x713f3aca -//.word 0x8831f80b -//.word 0x8d080577 -//.word 0xd2dbe411 -//.word 0x9fe4b9fe -//.word 0xd4910b39 -//.word 0xcfd9c888 -//.word 0x90cd89af -//.word 0x1b6f18e3 -//.word 0x1ec63081 -//.word 0xd4328300 -//.word 0x29fe0125 -//.word 0x1f345875 -//.word 0x70b5b7f0 -//.word 0x7588d8fc -//.word 0x46733da0 -//.word 0x23c8baf2 -//.word 0x138233d3 -//.word 0xca90a7d9 -//.word 0xd0716d8d -//.word 0xe001bed7 -//.word 0x8f9374b6 -//.word 0x2e3f1134 -//.word 0xf07e039a -//.word 0x50f427e0 -//.word 0xad8c8b67 -//.word 0x37ca78eb -//.word 0x0f5db0b3 -//.word 0xaaf4f40a -//.word 0x7753c9f3 -//.word 0xc1a67c19 -//.word 0xd6156405 -//.word 0x69986793 -//.word 0x350dbfa7 -//.word 0xe388fe1c -//.word 0x2eea50fd -//.word 0x45b501f8 -//.word 0x701e3f0f -//.word 0xf7642091 -//.word 0x4061e749 -//.word 0x375f83f5 -//.word 0xf22c58fa -//.word 0x96714255 -//.word 0x743fd7d5 -//.word 0x78ebed87 -//.word 0xc41c5d72 -//.word 0x98220685 -//.word 0x758914ce -//.word 0x82ee82ed -//.word 0x2e12ddc7 -//.word 0x172d4b7f -//.word 0x2b85cda2 -//.word 0x0c3ec1a1 -//.word 0xb974ab85 -//.word 0x6c8734de -//.word 0xbeb673fc -//.word 0x11f06c62 -//.word 0x2fe6d678 -//.word 0x2f652280 -//.word 0x99e3b8cb -//.word 0xca58842d -//.word 0x994fb1ae -//.word 0x3a3cb482 -//.word 0x63108d3c -//.word 0xae0b493e -//.word 0x3fd1cc74 -//.word 0xa6c1cd42 -//.word 0x068222ba -//.word 0x77de3e13 -//.word 0xaad4f856 -//.word 0xcce88e5b -//.word 0xacbee9f4 -//.word 0x1fe72268 -//.word 0xa4fb4623 -//.word 0x44e856ab -//.word 0xbc8992d6 -//.word 0xde7bf73b -//.word 0x352c07e6 -//.word 0xe834c850 -//.word 0xe0e90f8e -//.word 0x2d2dfec8 -//.word 0xa68bcced -//.word 0xd083c4a5 -//.word 0x02219187 -//.word 0xc6d5b88d -//.word 0x817e66c4 -//.word 0x57c86c48 -//.word 0x49b88870 -//.word 0xa085e646 -//.word 0x8faae63a -//.word 0x14392017 -//.word 0x1f72a635 -//.word 0xf69488f1 -//.word 0xd8f39e5a -//.word 0xe04b812d -//.word 0x2d54db04 -//.word 0x4096e1ca -//.word 0xa57f1d72 -//.word 0xd6b371e8 -//.word 0x5ca35948 -//.word 0x3761704f -//.word 0x80b3360f -//.word 0x4d6610e6 -//.word 0xd5e490b0 -//.word 0xd509f73c -//.word 0x3233f8fd -//.word 0xdf98bf02 -//.word 0x01dd3228 -//.word 0x51e4778f -//.word 0xc2e5b64a -//.word 0x65c0205b -//.word 0x899130de -//.word 0x26853084 -//.word 0x7ced0043 -//.word 0xf791134c -//.word 0x5647ba3e -//.word 0x0cc4a599 -//.word 0xe6b1a675 -//.word 0xef02b974 -//.word 0x918342f5 -//.word 0xfcb3958a -//.word 0xccd6bbad -//.word 0xe54674ae -//.word 0xa20a78f0 -//.word 0x30a90255 -//.word 0x34408ff7 -//.word 0xb4d3e319 -//.word 0x34e14e5d -//.word 0x1f3b2d37 -//.word 0x6916b3a1 -//.word 0x735eea10 -//.word 0x2f4df4a7 -//.word 0x843d97ab -//.word 0xf4baf938 -//.word 0x7cdca732 -//.word 0xbbd3dc7d -//.word 0x57c40171 -//.word 0x9dd47088 -//.word 0x67827d5a -//.word 0x4339b7cc -//.word 0xd1256b84 -//.word 0x6d476aa0 -//.word 0x0ec40ca7 -//.word 0x6e8375bf -//.word 0x6cf61721 -//.word 0xae3878cb -//.word 0x8a593674 -//.word 0x27f648c5 -//.word 0xdf0c86c6 -//.word 0xe80d6c97 -//.word 0x34341b60 -//.word 0x9516a08a -//.word 0x257b7930 -//.word 0xe56b55d0 -//.word 0xa48c1c47 -//.word 0x23ab2ffc -//.word 0x7698f15b -//.word 0xad378685 -//.word 0xb4d4db45 -//.word 0x78b7e647 -//.word 0x4bf82f84 -//.word 0x8a958f01 -//.word 0x7dc237b9 -//.word 0x7e80f5d7 -//.word 0x5e71b329 -//.word 0x04eb41d2 -//.word 0x574b543f -//.word 0x5f8cce5c -//.word 0xa6183f07 -//.word 0xe5ddacc5 -//.word 0xdca490b3 -//.word 0x829e21c0 -//.word 0x5e40d41a -//.word 0x355123e6 -//.word 0xe5428e34 -//.word 0x91bde032 -//.word 0xfe80b39f -//.word 0x3d6c3683 -//.word 0x8bd92e1e -//.word 0x752d3b1e -//.word 0x40ad5d15 -//.word 0x8793b629 -//.word 0x2660920e -//.word 0x5773a431 -//.word 0x1bdb9236 -//.word 0xdc6ab5a5 -//.word 0x500a1ae0 -//.word 0xa054cc59 -//.word 0xca5f5501 -//.word 0x44d68204 -//.word 0xe24e67b3 -//.word 0xf9d6a3c1 -//.word 0xc5cfe5b3 -//.word 0x08feaf92 -//.word 0xf4df5ae3 -//.word 0x4b3c5bd9 -//.word 0xc5ffc4c8 -//.word 0xb2450edd -//.word 0xe0b3150d -//.word 0xbf0d644b -//.word 0xc304b3fe -//.word 0x0a50aeb2 -//.word 0x3ffff80d -//.word 0xbe0d7005 -//.word 0xf834b351 -//.word 0x1905e21d -//.word 0xe938a502 -//.word 0xf0416f35 -//.word 0xde2404ff -//.word 0x2a89396d -//.word 0xf813fb48 -//.word 0x40ee9347 -//.word 0x2da72884 -//.word 0xc341862d -//.word 0xc5851e7c -//.word 0xd6994de9 -//.word 0xded4e19e -//.word 0xafd1d92b -//.word 0xe9c26c7b -//.word 0x1a074d06 -//.word 0x2a002e49 -//.word 0xf71f8373 -//.word 0x3c418862 -//.word 0xb73e85cd -//.word 0x8bbe50c3 -//.word 0xe34f1454 -//.word 0xd8b5528e -//.word 0x958125ab -//.word 0xb8e6ca88 -//.word 0xfcc75f59 -//.word 0x1514eb9c -//.word 0xdc579f4b -//.word 0xac8a5c56 -//.word 0x0c2c7550 -//.word 0x8e94b568 -//.word 0xf784a49c -//.word 0x9f010629 -//.word 0x1b62a546 -//.word 0x1aa85011 -//.word 0x8d0d24ca -//.word 0x0be00a3f -//.word 0x738f8187 -//.word 0xd3069ef3 -//.word 0x88375042 -//.word 0xa7fae914 -//.word 0x9c18daa2 -//.word 0x11a2beab -//.word 0x12889bb2 -//.word 0x6e666466 -//.word 0x60a1c262 -//.word 0x6eb31316 -//.word 0x92c3b405 -//.word 0x98797b32 -//.word 0xc71088d4 -//.word 0xc3ad3e51 -//.word 0xb2ef8c6a -//.word 0x9ec771b3 -//.word 0x1a8abf47 -//.word 0x29441fb9 -//.word 0x5b50554e -//.word 0x3925c569 -//.word 0xe3733646 -//.word 0xf86fd7eb -//.word 0xb66a7f5c -//.word 0x63a9390f -//.word 0xeb71009f -//.word 0xca61c7c4 -//.word 0x2c05bd83 -//.word 0x53a7cea2 -//.word 0x3a686d5f -//.word 0x78909162 -//.word 0x6623fdef -//.word 0x84b5c560 -//.word 0x197e0ed3 -//.word 0x1ab11520 -//.word 0x4d0a730e -//.word 0xaea69fc6 -//.word 0x1218b487 -//.word 0x0ab9749c -//.word 0x0a3f8d8b -//.word 0xcb921c90 -//.word 0xeddb7049 -//.word 0xe1dd10b3 -//.word 0x0688ff55 -//.word 0x12cb3ebb -//.word 0xb4ab9326 -//.word 0x78928982 -//.word 0xeae9b898 -//.word 0xfee84685 -//.word 0xafadae6b -//.word 0xe78cc066 -//.word 0x9fa7eac2 -//.word 0x47beb56b -//.word 0x684892a4 -//.word 0x88c2d7fc -//.word 0x4e47057e -//.word 0xe6614c29 -//.word 0xa71f51a0 -//.word 0xf3672e22 -//.word 0x5f8ebabb -//.word 0x14260cbc -//.word 0x76173a6a -//.word 0x03f266f3 -//.word 0x7d81fca6 -//.word 0x4ba33562 -//.word 0x1d56e04f -//.word 0xcf1661cd -//.word 0x9066faaa -//.word 0x43ac4998 -//.word 0x254112de -//.word 0xb0c93f4d -//.word 0xc0c02576 -//.word 0xf556091a -//.word 0x587de3e2 -//.word 0x41406150 -//.word 0x78562ff6 -//.word 0x9af776e6 -//.word 0xbeeea369 -//.word 0x59f069f4 -//.word 0x5f2c0957 -//.word 0xab23d138 -//.word 0xa1bae2c0 -//.word 0x128d3794 -//.word 0x5f87e307 -//.word 0xe2b09a8e -//.word 0x89457374 -//.word 0xc40eecce -//.word 0xa2ec2fb2 -//.word 0x37b294a4 -//.word 0x40356651 -//.word 0x0aa7ea80 -//.word 0x8f209d45 -//.word 0xe27ebe77 -//.word 0xce6f0c65 -//.word 0xbaccd1c5 -//.word 0xd0291fed -//.word 0x5faa5a46 -//.word 0x7d18f6fd -//.word 0xf03382fb -//.word 0x4f4ae618 -//.word 0x640ae98b -//.word 0xd594f6a5 -//.word 0x03d21fc0 -//.word 0x330a6272 -//.word 0xecb32b06 -//.word 0x9f881b2c -//.word 0x8edc08ef -//.word 0xe62d45e8 -//.word 0x2efb23b1 -//.word 0xe5dab79d -//.word 0x67c7dea6 -//.word 0x11b87fa7 -//.word 0xa57710cc -//.word 0xf0af5c46 -//.word 0xaa478343 -//.word 0x9df0421d -//.word 0x0afa74d1 -//.word 0x486cd9b4 -//.word 0xae531761 -//.word 0xb35afef6 -//.word 0x549b1080 -//.word 0xb6b541b3 -//.word 0x0d1ffbdf -//.word 0xbcbc651f -//.word 0xbeafe5d4 -//.word 0x4470e451 -//.word 0x9f1fd1d8 -//.word 0x611968c6 -//.word 0xbfca340a -//.word 0x3ac252db -//.word 0x7f0a79ab -//.word 0x8bb83756 -//.word 0x12c17da0 -//.word 0x220f5ede -//.word 0x04d314f3 -//.word 0x631d447e -//.word 0xafaa8352 -//.word 0xc4fc1827 -//.word 0xc7b0038f -//.word 0x510d3f2b -//.word 0xd0d9451e -//.word 0x2a70d1c2 -//.word 0xa317e89a -//.word 0x008d1a88 -//.word 0xece30540 -//.word 0x9c8e1afd -//.word 0xafbba473 -//.word 0x58e20504 -//.word 0xbe9e4336 -//.word 0xa3bcc465 -//.word 0x449156b5 -//.word 0x8191734b -//.word 0x3e1ec2bd -//.word 0x099ee0c6 -//.word 0xfdd0613f -//.word 0xe660124a -//.word 0xa6b981d1 -//.word 0xd71ac02f -//.word 0xb1ec652c -//.word 0x2e53d52f -//.word 0x6d03c3af -//.word 0x5455f3eb -//.word 0x7a9944db -//.word 0x44aeed66 -//.word 0x4ed107d5 -//.word 0x0cb34c88 -//.word 0xb1ce1ee7 -//.word 0x4ff8cb9c -//.word 0x40390f00 -//.word 0xc6dadad2 -//.word 0xeebe542f -//.word 0xbaf61ebe -//.word 0x7e8fdb2c -//.word 0x8baef0d8 -//.word 0x0be087cf -//.word 0x2cabdafa -//.word 0x8169ae96 -//.word 0xa5561de5 -//.word 0x21e79923 -//.word 0x8f5d2ebc -//.word 0x009b07bc -//.word 0x9c343487 -//.word 0x88c9abca -//.word 0x0d928cb1 -//.word 0xf63aa95b -//.word 0x39f0458b -//.word 0xdabb1ca0 -//.word 0x0d0da4c7 -//.word 0x9b9c936f -//.word 0x866da1fd -//.word 0xf0318fc1 -//.word 0x39d56829 -//.word 0x68550735 -//.word 0xccd1d92b -//.word 0xe3e2e48c -//.word 0x7a2e0846 -//.word 0x163a852b -//.word 0x9380bea2 -//.word 0x0bc23d9d -//.word 0xf99df6cb -//.word 0x9e61d00e -//.word 0xa420612f -//.word 0x0205f9d1 -//.word 0x1fe7e3a3 -//.word 0x3a1ee7da -//.word 0x099613df -//.word 0xa022bc44 -//.word 0x9512bffd -//.word 0x62070ccd -//.word 0x0a0666fe -//.word 0x00cc6455 -//.word 0x4461bc45 -//.word 0xcff0c063 -//.word 0x31d6291a -//.word 0x79f914a0 -//.word 0x555b4a28 -//.word 0x7aefc45a -//.word 0x46ab6f00 -//.word 0xa4de2c02 -//.word 0x31c41b94 -//.word 0x9d5719ae -//.word 0x536987bc -//.word 0x5cf04e98 -//.word 0x80a11fb5 -//.word 0xafc0009d -//.word 0xa036049d -//.word 0xb8e459be -//.word 0x2d3788f8 -//.word 0x6bfcf9a3 -//.word 0xb776b62e -//.word 0x12ae7013 -//.word 0x600bc70a -//.word 0xc922c67e -//.word 0x60cfad3d -//.word 0x0285f473 -//.word 0x81e28cd9 -//.word 0x0287682a -//.word 0xa4263cd7 -//.word 0x63dc85fb -//.word 0x3bc2c991 -//.word 0x90bf20e5 -//.word 0xcda0f348 -//.word 0x4c6a0408 -//.word 0x76eeae9f -//.word 0x2b9f6f2b -//.word 0x64a1a31e -//.word 0x16229237 -//.word 0x5aedadb1 -//.word 0xcc3c15ba -//.word 0x30ce5d26 -//.word 0x5c3a9165 -//.word 0x528377b2 -//.word 0xacec148e -//.word 0x3d0e726d -//.word 0xf527a1af -//.word 0x05b5fcd1 -//.word 0x4444ade5 -//.word 0xd184743f -//.word 0xfa9ea472 -//.word 0x5dc86e7b -//.word 0x4d18613b -//.word 0x7895322b -//.word 0xc694b94b -//.word 0x84423d5b -//.word 0xc17df14e -//.word 0xf8e8befc -//.word 0xf03e4317 -//.word 0xe1e61b60 -//.word 0xd8c85e1a -//.word 0x5c606abf -//.word 0x5210e3f3 -//.word 0x1ebbf8b6 -//.word 0x0b8fe8dd -//.word 0xed22c5c3 -//.word 0x05c1793c -//.word 0x240506ca -//.word 0x13a61214 -//.word 0x3394a293 -//.word 0x6144268f -//.word 0x1c48b64a -//.word 0xea239b7b -//.word 0xf75b11fd -//.word 0x00d04bc9 -//.word 0x6f4bb822 -//.word 0xc85a850f -//.word 0x435c630e -//.word 0xbbd88a07 -//.word 0xc613fd7f -//.word 0x26e1100e -//.word 0x60bb2813 -//.word 0xaa12c3a6 -//.word 0x0ae3b8ce -//.word 0xbd8cbff4 -//.word 0xd6de3398 -//.word 0x27731743 -//.word 0x644158bd -//.word 0x8670517f -//.word 0x6e69946b -//.word 0xcb30e8bb -//.word 0x3df38e38 -//.word 0xbbe3c9ac -//.word 0x32429d99 -//.word 0x6ebdd62b -//.word 0x3efd4c6c -//.word 0xd37966b7 -//.word 0x6a8edd6f -//.word 0x2bd1c2f0 -//.word 0x50a4c3c6 -//.word 0x8907aa1e -//.word 0x9fb12679 -//.word 0x5860cea8 -//.word 0x9c6d63f4 -//.word 0xd5a3559d -//.word 0x9c518986 -//.word 0x919e5a2e -//.word 0x8a1ddee2 -//.word 0xf1a16a31 -//.word 0x675358a1 -//.word 0xad0107a0 -//.word 0xc5b924bd -//.word 0x54972818 -//.word 0x4bdb2217 -//.word 0xc63eb75b -//.word 0x358767f3 -//.word 0xb95912cf -//.word 0xd14fba77 -//.word 0x354b8afd -//.word 0x020a172f -//.word 0x18fce712 -//.word 0xc053308c -//.word 0x935ae161 -//.word 0x9709e661 -//.word 0xaad6a8df -//.word 0x24cdd464 -//.word 0xb8e35ea5 -//.word 0x9b88c5b3 -//.word 0xe87b9872 -//.word 0x44e2394c -//.word 0xbe9ae126 -//.word 0xf8cce493 -//.word 0x8cc13748 -//.word 0xa9f72fd1 -//.word 0xfd748b82 -//.word 0xd85ab5af -//.word 0x8ebc4520 -//.word 0x1db0c7bf -//.word 0x0fa5be94 -//.word 0xa2f7e9f3 -//.word 0x27c1c4f4 -//.word 0xa8f35224 -//.word 0xcda41a7a -//.word 0x00a96f8d -//.word 0xd066f503 -//.word 0x93e4614d -//.word 0x50248092 -//.word 0xdcb37be8 -//.word 0x427f59ca -//.word 0x68e9c5c7 -//.word 0xf01b1277 -//.word 0x5d9c7cb3 -//.word 0x7721b105 -//.word 0xf0a7905e -//.word 0x47be3007 -//.word 0xed2824da -//.word 0xa7a2fdb2 -//.word 0x33021120 -//.word 0x2e827b60 -//.word 0x355c638b -//.word 0x4b97800d -//.word 0x7a20da5a -//.word 0xbd1cd5dd -//.word 0x1e7d6b31 -//.word 0x1cd3b994 -//.word 0x4f65bd99 -//.word 0x4f815e1d -//.word 0xd110ac7b -//.word 0x136d6a04 -//.word 0x7b78caa9 -//.word 0x7be677fb -//.word 0xb7dbd856 -//.word 0x6aba9458 -//.word 0x053c5198 -//.word 0x1abfc295 -//.word 0x79e1e0ed -//.word 0x994e77d0 -//.word 0x39d6e5b3 -//.word 0x46c31e49 -//.word 0x0069f4af -//.word 0x59fe96e7 -//.word 0x9dac5687 -//.word 0x58e5afb2 -//.word 0x75f78648 -//.word 0xa3e0b05a -//.word 0xfd63b5e1 -//.word 0xe95bd3af -//.word 0x405046a5 -//.word 0xb048c727 -//.word 0x5fdf53cd -//.word 0xd19a2d5b -//.word 0x0c7926f4 -//.word 0xfacb1c8a -//.word 0x0e46c199 -//.word 0x2a579d15 -//.word 0xc1b757a1 -//.word 0x393f3001 -//.word 0x93fdd0d2 -//.word 0x4d874578 -//.word 0x878f4959 -//.word 0x66b8c349 -//.word 0xb6a89144 -//.word 0xd35f8563 -//.word 0xc9c7ad09 -//.word 0xba8cd85d -//.word 0x802d55fe -//.word 0x9454fef2 -//.word 0x2e6376df -//.word 0xae4fae7d -//.word 0x3bb1ae4b -//.word 0xaa1a9281 -//.word 0xa1a7d246 -//.word 0xfcd6c724 -//.word 0x6f986bb9 -//.word 0x6da861af -//.word 0x491a35ee -//.word 0x9c37e40f -//.word 0xe6889f14 -//.word 0x7831cc57 -//.word 0x91814ec1 -//.word 0xc7c6063c -//.word 0xa866996b -//.word 0xa22b7498 -//.word 0x20df0eee -//.word 0xf6196de8 -//.word 0xff56ec09 -//.word 0x044b3bce -//.word 0xe07aa7e1 -//.word 0xe2049c8f -//.word 0x73be687c -//.word 0xf9864195 -//.word 0xfbd88a47 -//.word 0x859c52ee -//.word 0xce421e91 -//.word 0x1811e8cc -//.word 0xd8bc670d -//.word 0x17379104 -//.word 0x18c85f54 -//.word 0x3b61d08f -//.word 0x212d3061 -//.word 0x11699a0b -//.word 0x9a75bc13 -//.word 0x7a2bda3a -//.word 0xbf6f15af -//.word 0x2c07ee82 -//.word 0xdeae065b -//.word 0x3063276c -//.word 0xdb0788a4 -//.word 0x62274d26 -//.word 0xad174ef9 -//.word 0xf3401901 -//.word 0xdeba3a2e -//.word 0xea1ebaf3 -//.word 0x0f95e5fa -//.word 0x9f355016 -//.word 0x718e1b79 -//.word 0x3f7f7427 -//.word 0x4d4f5caa -//.word 0x4bf8ae07 -//.word 0x7dc65df2 -//.word 0x1921fd3e -//.word 0xf1a78597 -//.word 0x517f5373 -//.word 0x2be97046 -//.word 0x711916f5 -//.word 0xc3456f8e -//.word 0x4afda036 -//.word 0xe4bb0663 -//.word 0x81bbbf4b -//.word 0xcd0c6d9c -//.word 0x0fe8366d -//.word 0x50411074 -//.word 0xc19c3b7a -//.word 0x57220e0d -//.word 0xb8f4f775 -//.word 0x5ac0bee9 -//.word 0xe9920902 -//.word 0xeaec256f -//.word 0x9f1803eb -//.word 0x2abd816c -//.word 0xf4b1eb9d -//.word 0x500ec28f -//.word 0x5c88bcab -//.word 0x28fd0bec -//.word 0x1b4ee24b -//.word 0x926e367a -//.word 0xc9b8c2d4 -//.word 0xff864d95 -//.word 0xd5ff2f46 -//.word 0xf830127c -//.word 0xff5ff6c2 -//.word 0x979b78d4 -//.word 0xdd98530e -//.word 0x0bba2723 -//.word 0x57707912 -//.word 0x18c3fb56 -//.word 0x2b2f0e5d -//.word 0x95b1863c -//.word 0x6921ada1 -//.word 0xedc28a09 -//.word 0xf8186333 -//.word 0x9ef980d4 -//.word 0x0fe7328c -//.word 0xbd9d1419 -//.word 0xbde891cb -//.word 0x70b8a637 -//.word 0x6277e930 -//.word 0x7299cbf3 -//.word 0x34751aa2 -//.word 0x9353caf4 -//.word 0xbbc6f42a -//.word 0x363c1f45 -//.word 0x54d3bf76 -//.word 0xd16efbd6 -//.word 0xb209b357 -//.word 0x7049c2fa -//.word 0x58578043 -//.word 0x32ef8beb -//.word 0x21b4c8d4 -//.word 0xcac7a442 -//.word 0xb897a047 -//.word 0xfffb0c7f -//.word 0x207e12fe -//.word 0x2df9f787 -//.word 0x2e689efe -//.word 0xc2f64e20 -//.word 0x0a5ab472 -//.word 0xc2662c77 -//.word 0xb1dd3c26 -//.word 0x4486619b -//.word 0x767e0f0d -//.word 0xf2d2f300 -//.word 0x7c4d7bbc -//.word 0x8d8f98fd -//.word 0x3d5fc3ec -//.word 0x66433e4e -//.word 0x074d9cfc -//.word 0xe6378393 -//.word 0x7ab3b16c -//.word 0x07fc3dcf -//.word 0x0bb11f63 -//.word 0xd9e3f3e9 -//.word 0x846dfa2a -//.word 0xfe83622e -//.word 0x818ec7af -//.word 0x2e37f9cd -//.word 0xf5c20004 -//.word 0xb49e5d5a -//.word 0xa33a93dd -//.word 0xef1ae64c -//.word 0xa5296315 -//.word 0xd251207f -//.word 0xe949c529 -//.word 0x64ae4bb3 -//.word 0xae5604bb -//.word 0x41e1dc0b -//.word 0x0b90de10 -//.word 0x175bfa8f -//.word 0x693d0593 -//.word 0x2ad301aa -//.word 0x05259f50 -//.word 0xd0c402ac -//.word 0x6f15c67a -//.word 0xf5ec4149 -//.word 0x0d5c08e6 -//.word 0x99ceb518 -//.word 0x9851e88d -//.word 0x4d318c15 -//.word 0x9ecb5c0e -//.word 0xba9fa51f -//.word 0xfea74d2a -//.word 0x1ae8147b -//.word 0x6f461a46 -//.word 0xbc9ca250 -//.word 0xfa0c15ec -//.word 0x84944a29 -//.word 0x7be2044a -//.word 0x696abc76 -//.word 0x24b5a1b1 -//.word 0xf6fcde0b -//.word 0xfaf51b17 -//.word 0xc9ed469f -//.word 0x56179396 -//.word 0x1724c14e -//.word 0x6613a0ec -//.word 0x264bd018 -//.word 0xa9e7cbf9 -//.word 0xd1512560 -//.word 0x76121343 -//.word 0x08e82b6e -//.word 0x76196a75 -//.word 0x4e087bed -//.word 0x250636db -//.word 0x396a686d -//.word 0x55e4d2e8 -//.word 0xf50e74e2 -//.word 0xab440bb1 -//.word 0xc1b6d823 -//.word 0x20bba370 -//.word 0x7069006c -//.word 0x8162d101 -//.word 0xeaf00cdd -//.word 0xf055be68 -//.word 0xa95c50f9 -//.word 0x61340949 -//.word 0x3c7ed528 -//.word 0x1da5456e -//.word 0xc76ed635 -//.word 0x42d07645 -//.word 0x810544d0 -//.word 0x41e19860 -//.word 0x3463430d -//.word 0x5f8a18f3 -//.word 0xc069abe3 -//.word 0x357e5859 -//.word 0x994087ae -//.word 0x30f72f8f -//.word 0x45d099ae -//.word 0x113167b7 -//.word 0xdf4ad486 -//.word 0x6eed3d97 -//.word 0x979fe1be -//.word 0x2fefe518 -//.word 0x2f069b41 -//.word 0x128003c7 -//.word 0x7f7a92df -//.word 0x28ec3357 -//.word 0xf23a8ccc -//.word 0x5605821d -//.word 0x0747ff1f -//.word 0xd59ff293 -//.word 0xd1e99855 -//.word 0xb212fbd6 -//.word 0x772ab8cb -//.word 0x4ebb0427 -//.word 0xb55af147 -//.word 0xdf7bee6d -//.word 0x598a8d70 -//.word 0xed378ab2 -//.word 0xc7110851 -//.word 0xd6561da2 -//.word 0x750991db -//.word 0x4b46e30f -//.word 0x6fd38d60 -//.word 0xd0f78970 -//.word 0xd58f1418 -//.word 0x405eb25d -//.word 0x58a5729f -//.word 0x47f37314 -//.word 0xc13fa775 -//.word 0xe634d7f7 -//.word 0x6acce87d -//.word 0xf3205c0c -//.word 0xc27f1c7f -//.word 0x96bd747c -//.word 0xcdcd5fa6 -//.word 0xcd920514 -//.word 0xa2f38203 -//.word 0xe82ee9c7 -//.word 0xec6e8808 -//.word 0x0e9f6e2a -//.word 0x6a812b0d -//.word 0xb7fbd7f7 -//.word 0x6eb356ce -//.word 0x2fdbd98b -//.word 0x624ea8eb -//.word 0x1adb2067 -//.word 0x3ee0f767 -//.word 0xea1bc8b3 -//.word 0x13becb2a -//.word 0x6ac1e3b6 -//.word 0x837cdf7f -//.word 0x3775f95f -//.word 0x4777a397 -//.word 0x41e484c0 -//.word 0xa84bbd04 -//.word 0x4f3d708d -//.word 0x065d833e -//.word 0x78b7a1a1 -//.word 0x54538221 -//.word 0xab096d7a -//.word 0x9a96fb6d -//.word 0x28f01db8 -//.word 0x71d76045 -//.word 0x05ad70a2 -//.word 0x8b87dbb1 -//.word 0xaa8418a1 -//.word 0x295ec81c -//.word 0x543e3bc2 -//.word 0xa2d536d7 -//.word 0x96a8f438 -//.word 0xe3ab6a94 -//.word 0xd312d0d8 -//.word 0xe9645ceb -//.word 0xc6d1519c -//.word 0x49c538d9 -//.word 0xfabd6d21 -//.word 0xa95ade3b -//.word 0x52b31029 -//.word 0x44f06358 -//.word 0x82159619 -//.word 0x6a1b8d55 -//.word 0x9445527b -//.word 0xfdb15bbe -//.word 0x652e0b7e -//.word 0xf54d7a03 -//.word 0x25bb7971 -//.word 0xddcdd1f8 -//.word 0xda5dcc4c -//.word 0x54d5f755 -//.word 0xde892527 -//.word 0x8d4ab734 -//.word 0x5c371bc0 -//.word 0xcfd79396 -//.word 0xd76538fa -//.word 0xf66b3ede -//.word 0xa3937959 -//.word 0xf0b92054 -//.word 0x6a44d287 -//.word 0x41b7d6a4 -//.word 0xa983a7d1 -//.word 0x7f20b05c -//.word 0x305b54aa -//.word 0xd7f23171 -//.word 0xa55ea627 -//.word 0x86f092bb -//.word 0x011f5f82 -//.word 0x60214074 -//.word 0x12b8b698 -//.word 0x4d4f59bd -//.word 0xf845d56b -//.word 0xc7893319 -//.word 0xa8675aa0 -//.word 0x5ea1d5f0 -//.word 0x6bc2d602 -//.word 0x34af7b0e -//.word 0x607f51fd -//.word 0x818c1721 -//.word 0xf6cac424 -//.word 0x1058cb3e -//.word 0x73559dab -//.word 0xbff56f5d -//.word 0x70d43eee -//.word 0x038a11d8 -//.word 0x5b7f7fe8 -//.word 0x620170f0 -//.word 0xf39328bd -//.word 0xf8888148 -//.word 0xcfd17730 -//.word 0xf314ea68 -//.word 0xd8fea02d -//.word 0x16d98a3c -//.word 0xca614841 -//.word 0x39d3ee92 -//.word 0xb748091d -//.word 0xc841dda0 -//.word 0x8483f118 -//.word 0x4025ce7b -//.word 0x6ae703a9 -//.word 0xb5c56ca0 -//.word 0x76ccb4f0 -//.word 0x4e2d1970 -//.word 0x0a906f2e -//.word 0xc7aa68ac -//.word 0x5a121249 -//.word 0xef50a1fd -//.word 0xef376f49 -//.word 0x2876416e -//.word 0x2869ccde -//.word 0xe93578f0 -//.word 0xb41363d7 -//.word 0x3feca9d5 -//.word 0x1927e3ac -//.word 0x47bfed56 -//.word 0x3098edf5 -//.word 0xb613900d -//.word 0xa6e097f1 -//.word 0x5213937b -//.word 0x7c7aec00 -//.word 0x762e2883 -//.word 0x88696a29 -//.word 0x929739ed -//.word 0xf2b08395 -//.word 0xa8c4e2e5 -//.word 0xb8d81d12 -//.word 0xd0f0f27a -//.word 0x2b6d1391 -//.word 0xb5996e1f -//.word 0x7081b1a9 -//.word 0x16030e2c -//.word 0x00273c12 -//.word 0x46b3be5e -//.word 0x28f9672a -//.word 0xadf41e53 -//.word 0x8993df73 -//.word 0x4455020f -//.word 0x9916c012 -//.word 0x1d29f37a -//.word 0x21a61d52 -//.word 0xd805ace0 -//.word 0xbdec7c1f -//.word 0x2f469e70 -//.word 0x5e95588c -//.word 0x6b896cbd -//.word 0xcbd19d4e -//.word 0xed31703f -//.word 0x1cd5303e -//.word 0xa6e534d3 -//.word 0x3e5965db -//.word 0x9f0ffa37 -//.word 0x721a86c5 -//.word 0x725e358f -//.word 0xce5a5243 -//.word 0xce440de4 -//.word 0xba5b7cbe -//.word 0xf879df9f -//.word 0x74e72844 -//.word 0x4576bb12 -//.word 0x8dcb7207 -//.word 0xa0fbe4ef -//.word 0x6958e7db -//.word 0x0a8a53cf -//.word 0xc3e109bb -//.word 0x15e934ac -//.word 0x273fcf44 -//.word 0x68a46868 -//.word 0x76502338 -//.word 0x3f880144 -//.word 0x667362fc -//.word 0xe82ac969 -//.word 0xff0ee01b -//.word 0x465ebc63 -//.word 0x1e0961c2 -//.word 0x51c089a0 -//.word 0xf650a141 -//.word 0x952f15f6 -//.word 0x8b54cd90 -//.word 0xaf4cf81a -//.word 0x358b08c8 -//.word 0xd300fd2a -//.word 0x23ece7a5 -//.word 0x49f3a624 -//.word 0xd574f50b -//.word 0xeb16a76d -//.word 0xa1a32f7e -//.word 0xa81a664b -//.word 0x2fff89a8 -//.word 0x04f6816a -//.word 0xfc9068d7 -//.word 0x9665485b -//.word 0xdb63267d -//.word 0x88653f10 -//.word 0x6f0791ae -//.word 0x1bb99d62 -//.word 0xb3136ca5 -//.word 0x2069d08c -//.word 0x729eec3f -//.word 0x803df6ad -//.word 0xcfc53c7e -//.word 0xb6456549 -//.word 0xbf29fa08 -//.word 0x4f5425c9 -//.word 0x8a6fb8a6 -//.word 0x718070f6 -//.word 0x4dbe7cc5 -//.word 0x51a43982 -//.word 0x7b4440f8 -//.word 0xbbdea280 -//.word 0x57b17274 -//.word 0x8e1184e6 -//.word 0x7cba7592 -//.word 0x3d64eb12 -//.word 0x55971e51 -//.word 0x4fc19842 -//.word 0xa58639d2 -//.word 0xe0577d1b -//.word 0x004602da -//.word 0x1e184423 -//.word 0x509cab53 -//.word 0xcd3cc947 -//.word 0x52d2dccb -//.word 0xc4bd9b55 -//.word 0x16332ff4 -//.word 0x6dd87f83 -//.word 0x8290b022 -//.word 0x4892ece7 -//.word 0xd0bf63d0 -//.word 0x693190fc -//.word 0x0b16be1b -//.word 0xf6bfca24 -//.word 0x96f42a46 -//.word 0xaa8b2e20 -//.word 0xa5398634 -//.word 0x54a70599 -//.word 0xc2c8a5f1 -//.word 0x596bca9b -//.word 0x490ccb2a -//.word 0x2ef0ae15 -//.word 0xed7133af -//.word 0xde96155a -//.word 0x31e68cf8 -//.word 0x8a7e16a3 -//.word 0xef62779e -//.word 0xe411fe8b -//.word 0xd45c0bde -//.word 0xb377ce91 -//.word 0xe251511a -//.word 0x5321b99a -//.word 0xed41c957 -//.word 0x3240a76c -//.word 0x1f33e3bf -//.word 0x534bb534 -//.word 0x74ad8620 -//.word 0xcf7db201 -//.word 0x3e3c8d6c -//.word 0x4f55a446 -//.word 0xa2f24537 -//.word 0x9314415c -//.word 0x19e3f03c -//.word 0xee4376fe -//.word 0xf1a745d9 -//.word 0xc82ae3cb -//.word 0xc9dcee8e -//.word 0x1b595dc8 -//.word 0x18a10882 -//.word 0xf6236bdb -//.word 0xa71ba6fd -//.word 0xfd1ec951 -//.word 0x12f34fef -//.word 0xe7a5e859 -//.word 0x4bd67c68 -//.word 0xff566c86 -//.word 0x17f51b1e -//.word 0xa395ad51 -//.word 0x8f830eeb -//.word 0xc8073695 -//.word 0xa039ac4c -//.word 0x74174911 -//.word 0x8cd53fe2 -//.word 0x42745aea -//.word 0x679685f5 -//.word 0xe2918f26 -//.word 0x9ac22fec -//.word 0x97244632 -//.word 0x642065d6 -//.word 0xb7a78f5d -//.word 0x537f40e5 -//.word 0x2edaad5a -//.word 0xcf2d4eed -//.word 0xfb3f9ac2 -//.word 0x908112e9 -//.word 0xb19d8090 -//.word 0x23518177 -//.word 0xf77e41a4 -//.word 0x6a7c8657 -//.word 0x09b1f040 -//.word 0x19627ff0 -//.word 0x35c8558e -//.word 0x3967bdcb -//.word 0x5f9b6d17 -//.word 0xa8740816 -//.word 0x7ec3e74d -//.word 0x97751922 -//.word 0x1c20a803 -//.word 0x0bdc1ee5 -//.word 0xda5448f0 -//.word 0x5d1d3a78 -//.word 0xe9469330 -//.word 0xba30039a -//.word 0x929f0ac2 -//.word 0xa312022c -//.word 0xaf505f0b -//.word 0x6e4436b3 -//.word 0x300afc51 -//.word 0xc34a91da -//.word 0x97c57c41 -//.word 0x202d79ed -//.word 0x7c3a316a -//.word 0x56fa485f -//.word 0x0a699cc0 -//.word 0x0941cc44 -//.word 0x8013f81a -//.word 0x3497c8d8 -//.word 0xb041b0b4 -//.word 0xa31472f6 -//.word 0x84bbe4ad -//.word 0x77d6f3a1 -//.word 0x7492e88a -//.word 0xa67cea7f -//.word 0x1197c4b1 -//.word 0x78abe959 -//.word 0x7ee1b5ef -//.word 0x0b8df69d -//.word 0xf14babf3 -//.word 0xd04d0cdc -//.word 0x37f3cad1 -//.word 0x0b9c974c -//.word 0x2dbde980 -//.word 0x5730fb47 -//.word 0x47ce155c -//.word 0x203f0eca -//.word 0x0d110fa4 -//.word 0x270899f7 -//.word 0x99b5cafd -//.word 0x014adc93 -//.word 0x1aadeeed -//.word 0x99cb0789 -//.word 0x542f5861 -//.word 0xa9d3c165 -//.word 0x1e369728 -//.word 0x45aea5da -//.word 0xe3007076 -//.word 0x502ec03c -//.word 0x21905b62 -//.word 0x05261407 -//.word 0xed2d0468 -//.word 0x70f01856 -//.word 0x6de1cce8 -//.word 0xf2e8356d -//.word 0x5cfb45a4 -//.word 0xc0ef4b30 -//.word 0x8a8eb946 -//.word 0x64e92aa9 -//.word 0x5af0a3d8 -//.word 0x3b3f1985 -//.word 0x423b344a -//.word 0xf55e5398 -//.word 0x4ecfd0f0 -//.word 0x19368555 -//.word 0x9dce8f01 -//.word 0x7ebc5157 -//.word 0xe29fbc19 -//.word 0xd368cedb -//.word 0xe56c59b7 -//.word 0x18b70643 -//.word 0xffa399c0 -//.word 0x22aa7794 -//.word 0xa27965fb -//.word 0x1b4592f9 -//.word 0xce62d893 -//.word 0x00123f3e -//.word 0x9d9bc398 -//.word 0x219c5756 -//.word 0xb8a0297d -//.word 0xa4f428d6 -//.word 0xe0b6c49b -//.word 0x032ff477 -//.word 0x66637eae -//.word 0x89e57397 -//.word 0xb3f0f853 -//.word 0xd9b44cb9 -//.word 0xc1ee0790 -//.word 0x68bba001 -//.word 0xa0ae324b -//.word 0xfd2080b9 -//.word 0xf2c736d2 -//.word 0x388b72cf -//.word 0x6f948252 -//.word 0x08a8f054 -//.word 0x62b4bb5f -//.word 0x33a8e8fe -//.word 0x2a883973 -//.word 0xd3c03da7 -//.word 0xbab98967 -//.word 0xd3a944cc -//.word 0x19afe9fb -//.word 0x761f480f -//.word 0xe31bce54 -//.word 0xd06307b6 -//.word 0xc66d6179 -//.word 0x4bb9332a -//.word 0x065ffdd5 -//.word 0x23eaf278 -//.word 0xf968b3b8 -//.word 0xeac25ed3 -//.word 0x8b4ac7d6 -//.word 0x05930510 -//.word 0xbc8531c6 -//.word 0x2eb06a28 -//.word 0x1de11c84 -//.word 0xf0f382ba -//.word 0x57e86af0 -//.word 0x2e393986 -//.word 0xa4692e4c -//.word 0x9ce0ebf3 -//.word 0x53f731c2 -//.word 0x4350eb8a -//.word 0x48686edc -//.word 0x026fff79 -//.word 0x7a57950a -//.word 0x082be112 -//.word 0x74a28c20 -//.word 0x5bf4c049 -//.word 0xd4ece9d5 -//.word 0x543ebd39 -//.word 0xcf1c7a46 -//.word 0x20046e9f -//.word 0xabdcbd70 -//.word 0x41405f5d -//.word 0x441b68b9 -//.word 0x0b748cf9 -//.word 0x878be268 -//.word 0x2725e81c -//.word 0xfa24c828 -//.word 0x145ad913 -//.word 0x329f6989 -//.word 0xa121ba51 -//.word 0x5bfc4a7f -//.word 0x740b57eb -//.word 0xb4fda3e1 -//.word 0x86ab751a -//.word 0x10a8e0eb -//.word 0xa41a47bd -//.word 0x57c921bd -//.word 0xef76fad5 -//.word 0x036ebada -//.word 0x5d5f2a07 -//.word 0xa369b4aa -//.word 0x37786b1d -//.word 0x5bd24bf8 -//.word 0x99ecc185 -//.word 0x62826e74 -//.word 0xf5e628d0 -//.word 0x82994132 -//.word 0x8f180c35 -//.word 0x9cf89e29 -//.word 0x0235d20c -//.word 0x21c890b6 -//.word 0xba774e53 -//.word 0x9af1d616 -//.word 0x791a4a2c -//.word 0x21a466ef -//.word 0xd3df065d -//.word 0xe6d2e8c8 -//.word 0xb18ab2ce -//.word 0xabb2378c -//.word 0xd164f60f -//.word 0x483fe30b -//.word 0x44ba6bd0 -//.word 0x28b7b279 -//.word 0xef5c1f67 -//.word 0xca1e1aee -//.word 0x0a1e144d -//.word 0x41b9c8e4 -//.word 0xa45ac1a1 -//.word 0xb4931dbc -//.word 0x1e6d90a4 -//.word 0xdffcac39 -//.word 0xab365f3b -//.word 0x9005bd02 -//.word 0xd79aff70 -//.word 0x2b05cc25 -//.word 0xfd02b8f1 -//.word 0x26160b8f -//.word 0xcedbc390 -//.word 0x8d98dc95 -//.word 0xd115cec1 -//.word 0x80ae586e -//.word 0xdea57c1f -//.word 0xb0bdcbb6 -//.word 0xa204e2e8 -//.word 0xe6f035ed -//.word 0x1ead0b7c -//.word 0x7cb6caf6 -//.word 0x27a375e2 -//.word 0xe1417399 -//.word 0xe8e89242 -//.word 0x19094b01 -//.word 0x5b07486c -//.word 0x3b48233f -//.word 0xd48b7150 -//.word 0xf27cffc5 -//.word 0x77855b84 -//.word 0xfde896eb -//.word 0xbc0b49c2 -//.word 0xae12d66d -//.word 0xf2b3f066 -//.word 0x6f465eeb -//.word 0xb91cfbf4 -//.word 0x38120268 -//.word 0x87668890 -//.word 0x1ac94acc -//.word 0x24b5a985 -//.word 0xb700f362 -//.word 0x2db2e4bf -//.word 0xc8146d5b -//.word 0x9509b350 -//.word 0x96a15b49 -//.word 0x1fec05ef -//.word 0x810c16a4 -//.word 0xe68ebb74 -//.word 0x7cfb2b48 -//.word 0xd6a92c5d -//.word 0x8fd7d8f5 -//.word 0x30f9a14d -//.word 0x535193ce -//.word 0x09bfd987 -//.word 0x7ada83db -//.word 0xcb3f8677 -//.word 0x452a0488 -//.word 0xb343ce2a -//.word 0x0bba2823 -//.word 0x5195ccd1 -//.word 0xb9493161 -//.word 0x0c880c42 -//.word 0x4c5b18d9 -//.word 0x9b701277 -//.word 0x59b50888 -//.word 0x8d26d40d -//.word 0x86e2e44c -//.word 0xc2853cc5 -//.word 0x0eb2bd69 -//.word 0xefefa707 -//.word 0x41b65d07 -//.word 0x1ec8685a -//.word 0x01c5bfb1 -//.word 0x2bfa45ed -//.word 0x467a94d7 -//.word 0x4970f912 -//.word 0x9bb3bf4e -//.word 0x7b9bb1bd -//.word 0x9f14dacb -//.word 0x1bf08f0a -//.word 0x8582b06b -//.word 0x57682ab4 -//.word 0x94a8c02e -//.word 0xafff0c9e -//.word 0xa875c077 -//.word 0x7835324e -//.word 0xaf9c188e -//.word 0x5c908f6d -//.word 0x2d13631f -//.word 0xd7178a49 -//.word 0xb894f1b8 -//.word 0xbbd97c53 -//.word 0x7d20484e -//.word 0xae6433a1 -//.word 0xb9779eb9 -//.word 0xa74f716d -//.word 0x40a06033 -//.word 0x74b16d94 -//.word 0xfa68aedd -//.word 0x37a65118 -//.word 0x61dbdd3a -//.word 0xe4d1ba9e -//.word 0x05ccf4b2 -//.word 0xc5d53cf1 -//.word 0x08533011 -//.word 0xf6dbdc7d -//.word 0xa2498005 -//.word 0xe91093d4 -//.word 0x9ece09a3 -//.word 0xe424d22d -//.word 0xdac4a3e3 -//.word 0x7ecbf8e0 -//.word 0xcb525a1f -//.word 0x253fddec -//.word 0xf761ee98 -//.word 0x9bbd4b71 -//.word 0x7a2253f1 -//.word 0x74048036 -//.word 0x828732b2 -//.word 0x99d9ae24 -//.word 0xd2c566c7 -//.word 0xc9857bc9 -//.word 0x42d880fe -//.word 0x135581d6 -//.word 0x3eff438d -//.word 0x5d19cea1 -//.word 0x433c2989 -//.word 0xe0a665a4 -//.word 0x65d5dc70 -//.word 0xa955bbfc -//.word 0xcbd6bea0 -//.word 0x1a813beb -//.word 0x318c62dd -//.word 0x660cc356 -//.word 0x660b11cf -//.word 0x19db2548 -//.word 0xcca94581 -//.word 0x8e55a76d -//.word 0xda8231e4 -//.word 0x77e98398 -//.word 0x9df2374a -//.word 0x5985673e -//.word 0x321d70ec -//.word 0x0d1ff6f8 -//.word 0x4e6b2964 -//.word 0x40304605 -//.word 0xb7046033 -//.word 0xf43460c5 -//.word 0xc8584b3d -//.word 0xfd2bc33f -//.word 0xf19ad148 -//.word 0x841be19c -//.word 0x34400e80 -//.word 0x878ca0aa -//.word 0xaa85d3f6 -//.word 0x570adb5a -//.word 0xfbe7241c -//.word 0x19a7de42 -//.word 0xe9aab94b -//.word 0x4677ed1c -//.word 0xc7527e3d -//.word 0x2b12be45 -//.word 0xfa2d1393 -//.word 0x6915fa3f -//.word 0x7ec74c50 -//.word 0x76a0c130 -//.word 0x6473b25d -//.word 0x1ada2360 -//.word 0x4cc90003 -//.word 0xf369a7bf -//.word 0xf023a774 -//.word 0xf2fac75d -//.word 0x991f4b42 -//.word 0xdcbf72ef -//.word 0xa82043e6 -//.word 0xc9ec8951 -//.word 0x0ecd1d3a -//.word 0xa83963fe -//.word 0xd49017ff -//.word 0xba644a9a -//.word 0x9417a759 -//.word 0x12acfb69 -//.word 0xfdd7f54e -//.word 0x1c562ad5 -//.word 0x54845b4a -//.word 0x122cfbec -//.word 0xee9bec9e -//.word 0x88f98adf -//.word 0xb6d9eafc -//.word 0xe20e6384 -//.word 0xadc04efd -//.word 0xd8c00bd5 -//.word 0x6519459c -//.word 0xf9e87670 -//.word 0x856dadb8 -//.word 0x25618f15 -//.word 0x498a9b95 -//.word 0x128eb32a -//.word 0xff05d85b -//.word 0xc8d1363a -//.word 0x8ab26096 -//.word 0x2515dc71 -//.word 0xe22de2b4 -//.word 0x5a456122 -//.word 0x9355438b -//.word 0x6bd3f242 -//.word 0x3acb1bd1 -//.word 0xb332b2ea -//.word 0x0b7836a1 -//.word 0x5e5c36d9 -//.word 0x4e0414fc -//.word 0xed4d09f0 -//.word 0xdd606946 -//.word 0xb58628b4 -//.word 0xa73d9ec5 -//.word 0x608b87cf -//.word 0x30924e26 -//.word 0x6b658b8f -//.word 0x0f1acaf7 -//.word 0xa6208e65 -//.word 0x6ed3952e -//.word 0xb84e5e68 -//.word 0x8e80e9a0 -//.word 0x9883bed0 -//.word 0x4128308b -//.word 0x15d7e37b -//.word 0x6d968c0d -//.word 0x4f67f86b -//.word 0x90d750ab -//.word 0x3bd49b45 -//.word 0x37bf84cb -//.word 0x23c25dd4 -//.word 0x8564653a -//.word 0x245a4685 -//.word 0xb2a0e2a6 -//.word 0xaec94fe9 -//.word 0x89942025 -//.word 0x08bfe735 -//.word 0xe920f8ac -//.word 0xc9f16fc5 -//.word 0x456c7499 -//.word 0x6098bd95 -//.word 0x2462552a -//.word 0x8def9cc6 -//.word 0xa2319004 -//.word 0xe5b84a20 -//.word 0xedcbcbad -//.word 0x52b8f98a -//.word 0xc968e512 -//.word 0x90364f93 -//.word 0x0d016c01 -//.word 0xb280e7ec -//.word 0x23d625b0 -//.word 0x9b67cdec -//.word 0x8ce98835 -//.word 0x85be050b -//.word 0x5981410b -//.word 0x7edf0567 -//.word 0xb3a8b094 -//.word 0xe5253642 -//.word 0x54ad6991 -//.word 0xf2737782 -//.word 0x0ba2b4ab -//.word 0x2bac9a30 -//.word 0x3dde0eee -//.word 0xf039e5f9 -//.word 0x5f7da749 -//.word 0xf08693b0 -//.word 0x7cdbe30f -//.word 0xb18551ca -//.word 0xb51dd979 -//.word 0x0c29c1e1 -//.word 0xbca9d722 -//.word 0xafecfa31 -//.word 0x58a8db89 -//.word 0x9a4a051e -//.word 0xe58b1b93 -//.word 0xa24461ac -//.word 0xd1837e06 -//.word 0xf0de8106 -//.word 0x1f07210f -//.word 0x83a149f8 -//.word 0xe852d4bd -//.word 0xaa1a9574 -//.word 0xd5e39a83 -//.word 0x8b59b111 -//.word 0xa6fb2cba -//.word 0x9f72e287 -//.word 0xaf22761d -//.word 0x3300dc34 -//.word 0x55a3184b -//.word 0xe99d499a -//.word 0x950be749 -//.word 0x356b49df -//.word 0x7dae6afd -//.word 0xe08eec4c -//.word 0xb1225db4 -//.word 0x89b0bacf -//.word 0xe8c2319d -//.word 0x1f7c2b79 -//.word 0x6d2c8a4b -//.word 0x68232f00 -//.word 0x9ec4c037 -//.word 0x7ddaa83d -//.word 0x702f5f3c -//.word 0x4b5aebaf -//.word 0xe9d8a719 -//.word 0x135e43f7 -//.word 0xa46e0cf3 -//.word 0xeb296d5a -//.word 0x5164b6d0 -//.word 0x3cfd1d43 -//.word 0x336f031d -//.word 0x42a578be -//.word 0xa00c0029 -//.word 0x8fec97fd -//.word 0x84f8f4a8 -//.word 0x88240bd7 -//.word 0xdeb6d530 -//.word 0xe6a05344 -//.word 0x410dd1bf -//.word 0x363a68e2 -//.word 0x5487c634 -//.word 0x59ce3274 -//.word 0x53f3cad1 -//.word 0x05bc0f5e -//.word 0x8ce3a4c0 -//.word 0x436a5329 -//.word 0xe32f518b -//.word 0xefc0c305 -//.word 0x4f7080a2 -//.word 0x3aab1942 -//.word 0x5a8617d8 -//.word 0x2b9a83d6 -//.word 0xa513ace6 -//.word 0x1a0424db -//.word 0x61fe0ce7 -//.word 0x34e0910e -//.word 0xd7f0b7da -//.word 0xfa2b5651 -//.word 0xe1da6124 -//.word 0xc2666e29 -//.word 0x6f6d730b -//.word 0x3415ce41 -//.word 0x03a1893c -//.word 0xce42dbe5 -//.word 0x352ff246 -//.word 0x61f7ef87 -//.word 0x3016331d -//.word 0x92c7d93e -//.word 0x331a8398 -//.word 0x5a465a42 -//.word 0x114050f3 -//.word 0x868da972 -//.word 0xb154b94d -//.word 0x37b7efce -//.word 0x8e63122b -//.word 0x6266cbfd -//.word 0x384264f3 -//.word 0x523fcfc8 -//.word 0xd205ea72 -//.word 0x2269019d -//.word 0x92889457 -//.word 0x43125b0d -//.word 0x45e988b6 -//.word 0xfceb4c4e -//.word 0xc80b9c86 -//.word 0xe4a735ba -//.word 0x8f16de23 -//.word 0x6a80ed4e -//.word 0x22f20ccc -//.word 0x4eb13d2c -//.word 0x9bcf1c26 -//.word 0x26fd6419 -//.word 0x29a0b5b8 -//.word 0xda2795ff -//.word 0x909bb46d -//.word 0x2877746d -//.word 0xa7bba815 -//.word 0x203c9c12 -//.word 0xd93e57e3 -//.word 0xa9441c46 -//.word 0xa42737f0 -//.word 0xfb66f681 -//.word 0x1dbdf5b7 -//.word 0x22f99ee2 -//.word 0x6a0af198 -//.word 0x815a81a9 -//.word 0x465dbf55 -//.word 0x4d6a7bbd -//.word 0x81c9a898 -//.word 0x0e0d6027 -//.word 0x7ea3286b -//.word 0x21ac7495 -//.word 0xb3086ebe -//.word 0x39b3f3d8 -//.word 0x2c55dee5 -//.word 0xd9148a67 -//.word 0x08ad9217 -//.word 0xdcc3dbd9 -//.word 0xfa77d5f0 -//.word 0xed38fd6e -//.word 0xcadca7ef -//.word 0x0ff0fa87 -//.word 0xd14d3cf9 -//.word 0x17ec502a -//.word 0x81fc7cd5 -//.word 0x2d31707f -//.word 0xda5e84ae -//.word 0x4e464256 -//.word 0xf6b02494 -//.word 0xcdb99e9e -//.word 0x7e6e5ffb -//.word 0xcd9ad5ef -//.word 0x33ddef3a -//.word 0xc8fe2602 -//.word 0x6782be0d -//.word 0x0c7e4933 -//.word 0x80a96e13 -//.word 0x39b5e806 -//.word 0x7be0d151 -//.word 0xc4c6219f -//.word 0x677972ae -//.word 0x77d30648 -//.word 0xe60b0a75 -//.word 0xee871cef -//.word 0xb0f10cd6 -//.word 0x1c8ddfa5 -//.word 0x10ca1a65 -//.word 0xc4173d20 -//.word 0x65f78d99 -//.word 0x0058163a -//.word 0xa221f14e -//.word 0xbe0ac370 -//.word 0xceb08643 -//.word 0x3de98c64 -//.word 0x8554c09d -//.word 0x9535305c -//.word 0x7580c863 -//.word 0x2c3460c0 -//.word 0xe2eafa00 -//.word 0x42ae44a0 -//.word 0x220d65c4 -//.word 0x666ff52b -//.word 0x21a84d63 -//.word 0xfec90239 -//.word 0xdf3cac74 -//.word 0xc310ecc3 -//.word 0xed91adf3 -//.word 0x431ca965 -//.word 0xf4312fc0 -//.word 0x5dca24e3 -//.word 0x2eeb491e -//.word 0xc87bbba1 -//.word 0xea52c034 -//.word 0x8d93c029 -//.word 0x0c3c928f -//.word 0x88fbfaa9 -//.word 0x8b446f9f -//.word 0xeba02172 -//.word 0xf2483a35 -//.word 0xbbf2647b -//.word 0xdfeb8c0c -//.word 0x5266e6dc -//.word 0x8714323d -//.word 0xdbf43d53 -//.word 0x306daac8 -//.word 0xd89af2c2 -//.word 0xb6e5aa12 -//.word 0x9fd705af -//.word 0x062e9962 -//.word 0xd93066c2 -//.word 0xa6401463 -//.word 0x02af7c4b -//.word 0x2bd46aa5 -//.word 0xec5fa1ba -//.word 0xc1ea201c -//.word 0x3cd1a424 -//.word 0xa7446e9f -//.word 0xeb9a46c5 -//.word 0xb1e8c06b -//.word 0xc6d3be79 -//.word 0xc4a2369d -//.word 0xef983641 -//.word 0x5d8025bb -//.word 0x5a894bc4 -//.word 0x0a54942c -//.word 0x504c90cc -//.word 0xef36bfbb -//.word 0xef080cc5 -//.word 0x43ff9718 -//.word 0xa8ecb741 -//.word 0xd0cf4057 -//.word 0xc0a60176 -//.word 0x7787916f -//.word 0xd0ed4cbe -//.word 0xa95098bd -//.word 0x45f86d17 -//.word 0xef12147e -//.word 0xe0042ea1 -//.word 0x63fef958 -//.word 0x37d1cf22 -//.word 0x3505efd2 -//.word 0x32258085 -//.word 0x275ed3d7 -//.word 0x9049e957 -//.word 0x11043538 -//.word 0x5f87a249 -//.word 0x5e35d827 -//.word 0x87b2bbb0 -//.word 0x8df535bc -//.word 0x409e3608 -//.word 0xb189f973 -//.word 0x97a3886d -//.word 0xf1fc82ac -//.word 0xed1e1c20 -//.word 0x099e662a -//.word 0x78f0d009 -//.word 0xc77fec95 -//.word 0xc0fd752f -//.word 0x8ff891f8 -//.word 0x23af5341 -//.word 0xd7238443 -//.word 0x5271a310 -//.word 0xab5e2aca -//.word 0xd1341313 -//.word 0x2bcd9bc4 -//.word 0x7bed46e2 -//.word 0x08d523ce -//.word 0xfc1451bb -//.word 0x0ba1c265 -//.word 0x55273f01 -//.word 0x8ea0ac6f -//.word 0x5c258eb7 -//.word 0x0004cab3 -//.word 0x3914af09 -//.word 0x6545375d -//.word 0xea7b8ac4 -//.word 0xd49dc47b -//.word 0xc0e8f8d9 -//.word 0xf88a7582 -//.word 0xdf6c48de -//.word 0x904f02c9 -//.word 0xc21abb8c -//.word 0xef72560c -//.word 0xb58c0742 -//.word 0x7c3f13eb -//.word 0x595ed781 -//.word 0x32440c69 -//.word 0x23b0496e -//.word 0x21d4c96e -//.word 0xdda86f53 -//.word 0xeb840745 -//.word 0x24eecf1f -//.word 0x49b1361f -//.word 0xe92fe3e1 -//.word 0x84f7f98e -//.word 0xf09a9a51 -//.word 0xfcbbaa0a -//.word 0x5466d547 -//.word 0xa4a3d370 -//.word 0x004aea41 -//.word 0x8418b57d -//.word 0x370325e1 -//.word 0x35cbc557 -//.word 0x0ed2426d -//.word 0x692d2a05 -//.word 0xedfbf44e -//.word 0x61f541f3 -//.word 0x11476192 -//.word 0x749f196f -//.word 0x0d83a36a -//.word 0x8fe7f72e -//.word 0x44ff49ac -//.word 0xaf52d3c8 -//.word 0x7110d451 -//.word 0x69a5d937 -//.word 0x1f8e3bf8 -//.word 0x636be95c -//.word 0x31566762 -//.word 0xd874177a -//.word 0x5bc9b8f4 -//.word 0x18512cb9 -//.word 0xa74c7e39 -//.word 0x05d923a4 -//.word 0xf2c6805d -//.word 0x97a7adac -//.word 0x6c2579b3 -//.word 0x5999aea3 -//.word 0x1cda962f -//.word 0xea52bd41 -//.word 0x5958f9ec -//.word 0x7dbaa8a3 -//.word 0x519839a8 -//.word 0x5979eec6 -//.word 0x8698df43 -//.word 0x5a7f4311 -//.word 0x4cd7eb44 -//.word 0x6e7f0fc9 -//.word 0x4ddb4d54 -//.word 0x196fef9a -//.word 0x06ac6dc1 -//.word 0xf1093214 -//.word 0x4756a3fc -//.word 0x234d5e2b -//.word 0xb66bbf1b -//.word 0xecfea9b7 -//.word 0x4c7e8358 -//.word 0x212080f2 -//.word 0xd7a92490 -//.word 0xa78004fd -//.word 0x7708cdc4 -//.word 0xfb2c875b -//.word 0x213c1b9c -//.word 0xacf71374 -//.word 0x1ee9a2df -//.word 0xdcf7e414 -//.word 0x8d3866fc -//.word 0xc306e9e9 -//.word 0xdd556385 -//.word 0x2c444709 -//.word 0x54f206af -//.word 0xf593d669 -//.word 0x8bc3b2d3 -//.word 0x9319a266 -//.word 0xf0003cef -//.word 0x8cc26b40 -//.word 0x42e66f26 -//.word 0xfcbc259b -//.word 0x1836893c -//.word 0x11f979fd -//.word 0x5bb4bc1b -//.word 0x8eb14252 -//.word 0xc7aaad51 -//.word 0x4bdd116b -//.word 0x6e62f88f -//.word 0xb4bdaa7a -//.word 0x35b0ab2b -//.word 0x46538497 -//.word 0x5566c69f -//.word 0x15e54d3f -//.word 0xdcddc208 -//.word 0x497f63d0 -//.word 0x297207a8 -//.word 0x9b6e5c0e -//.word 0x73077464 -//.word 0xddc680a1 -//.word 0x437edb47 -//.word 0x70dd4a95 -//.word 0xf54282fd -//.word 0xcbceead8 -//.word 0x3bbea359 -//.word 0xfbf8c6bf -//.word 0x9ae3eccf -//.word 0x1d7cf482 -//.word 0xeba700fb -//.word 0xe6c2c1bb -//.word 0xdb80f518 -//.word 0x1cf52deb -//.word 0x6bedd48a -//.word 0x1a826df6 -//.word 0x71ee1c55 -//.word 0x509d68a2 -//.word 0x15873fa3 -//.word 0xc0bc3a1b -//.word 0x56402342 -//.word 0x831ab572 -//.word 0x82a8a223 -//.word 0x4235db19 -//.word 0xc1cd0bdc -//.word 0xbc506469 -//.word 0x8bc69f27 -//.word 0x47f23e1c -//.word 0x2d2a1561 -//.word 0x476608d3 -//.word 0x4996160c -//.word 0xb9399792 -//.word 0x522bc14d -//.word 0xabbe713f -//.word 0x140d296f -//.word 0xc08d5426 -//.word 0x2ae5d25e -//.word 0xb100b078 -//.word 0x8560372d -//.word 0xc7b529c7 -//.word 0xecae4791 -//.word 0x630f168c -//.word 0x7704e363 -//.word 0x76b405a1 -//.word 0x131a6222 -//.word 0x091035c7 -//.word 0x01ad0e6e -//.word 0xb6d11a22 -//.word 0x57fea48e -//.word 0x2d6adcb8 -//.word 0x7d52d7ec -//.word 0xb090d8f5 -//.word 0xb170ce94 -//.word 0x97c01d2a -//.word 0x8426a1b8 -//.word 0xccb7f009 -//.word 0x5ac4e02e -//.word 0x50f74a2b -//.word 0xee9f0df0 -//.word 0xb549558b -//.word 0xcc901d9b -//.word 0xa236f208 -//.word 0xd573faf1 -//.word 0x538c36e6 -//.word 0xbfa80458 -//.word 0x16e0e84d -//.word 0x92958b58 -//.word 0xce0604c9 -//.word 0x2c215721 -//.word 0x749a3bc9 -//.word 0xbd3b2103 -//.word 0x917b7120 -//.word 0x4c5117f4 -//.word 0xc54a3e87 -//.word 0x30da5b0d -//.word 0x43ef6e18 -//.word 0x98cc850d -//.word 0x531581d4 -//.word 0x04261cd4 -//.word 0xcfa92b1f -//.word 0xca6821e9 -//.word 0xa65fd53f -//.word 0x921685f6 -//.word 0x5c2e1ae1 -//.word 0xd939ad47 -//.word 0x88cf4b93 -//.word 0x72def54e -//.word 0x5441eb4b -//.word 0x00942b21 -//.word 0x014734de -//.word 0x7ef20ffa -//.word 0x61e8908a -//.word 0xb7800000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00017428 -//// expected output -//.word 0x61dce069 -//.word 0x399909fa -//.word 0x7f4ae87e -//.word 0x5e9e814c -//.word 0x1521d655 -//.word 0x5eae7923 -//.word 0x93a7422e -//.word 0x43135321 -//.word 0xcdef56ad -//.word 0xf36216ee -//.word 0xdabe1c6f -//.word 0x0cd039fa -//.word 0xb855d837 -//.word 0x923391c2 -//.word 0xdcc9d31f -//.word 0x1a2ff6ec -//// SHA512LongMsgvector_120 -//// vector length -//.word 0x00017740 -//// input message -//.word 0xc38f4de0 -//.word 0x32c8500e -//.word 0x46f9bd0a -//.word 0xc75742db -//.word 0x703f1ae1 -//.word 0xf6283167 -//.word 0x46d78977 -//.word 0x0ed2dcf2 -//.word 0x801683e0 -//.word 0x530c9604 -//.word 0x0aba55b3 -//.word 0x7836c6e7 -//.word 0x8461a090 -//.word 0x2ad1682a -//.word 0xc20fda94 -//.word 0x85038a20 -//.word 0x4daccbe7 -//.word 0x9c15d05f -//.word 0xe084112f -//.word 0xf5f4f041 -//.word 0xecc59d19 -//.word 0x0bb33766 -//.word 0x140534d7 -//.word 0xcb060230 -//.word 0xb2b9ee9d -//.word 0x17c94646 -//.word 0x50bfba23 -//.word 0x46770812 -//.word 0x30d5d927 -//.word 0xa1b4e543 -//.word 0xc51f5ee8 -//.word 0xe7c48c4b -//.word 0x37a5b5ab -//.word 0xcb113fe2 -//.word 0xe3d3183a -//.word 0x71a95681 -//.word 0xd9f81b60 -//.word 0xf5bdbce8 -//.word 0x5cc7226e -//.word 0xe4247099 -//.word 0x65d9e5b9 -//.word 0xc0d6055a -//.word 0x2028f31a -//.word 0x807122b7 -//.word 0x6e952c6c -//.word 0x0eb7027e -//.word 0x61644612 -//.word 0xc70df541 -//.word 0xc3bb496e -//.word 0xfffeded7 -//.word 0x9026136b -//.word 0x7ab6b3dc -//.word 0x7716d5f4 -//.word 0xf488002c -//.word 0x5d5d937b -//.word 0x9a69646c -//.word 0xdab4a873 -//.word 0x8f721381 -//.word 0xb93640d6 -//.word 0x68625217 -//.word 0x7ce2dca0 -//.word 0xb01afe1b -//.word 0xd71cd151 -//.word 0x651f0541 -//.word 0x302dc96f -//.word 0x781beb7f -//.word 0x25be4102 -//.word 0x515c4790 -//.word 0x06610917 -//.word 0x49534472 -//.word 0x5708c83e -//.word 0x2e1720e9 -//.word 0x4f8c750b -//.word 0xc3e0b0fa -//.word 0x5c28df99 -//.word 0x3d8cda70 -//.word 0x9cfb2602 -//.word 0xc71d195a -//.word 0x65893fe8 -//.word 0xff39fd8b -//.word 0xbf3a74ef -//.word 0x77a8a819 -//.word 0xe4dae240 -//.word 0x35da53df -//.word 0xc718f908 -//.word 0x335fc7fb -//.word 0x8a0700f7 -//.word 0xdf6de450 -//.word 0x06a08ec2 -//.word 0x9c5d1d05 -//.word 0x473e12a1 -//.word 0x3f2ef904 -//.word 0x0e204cd2 -//.word 0x9401947c -//.word 0x4dead114 -//.word 0xd79b1c60 -//.word 0xae258b2d -//.word 0x3be655e5 -//.word 0x0dba3664 -//.word 0x66701508 -//.word 0xf97be507 -//.word 0xf2eac906 -//.word 0x379b7be7 -//.word 0xedabeee2 -//.word 0x3f3032d7 -//.word 0x5a2b99e2 -//.word 0xbcb81831 -//.word 0xaf88ef12 -//.word 0x10918c50 -//.word 0x5504adc0 -//.word 0xcf80c617 -//.word 0x2b85a2fe -//.word 0x3f2b4c69 -//.word 0x04143024 -//.word 0xde9f7eae -//.word 0x245ecf4b -//.word 0xdccb0b55 -//.word 0xc6368ad3 -//.word 0x9d02794d -//.word 0x991180de -//.word 0x387da18a -//.word 0x3e8964d2 -//.word 0xfad73186 -//.word 0xccdbfddb -//.word 0xe48f29bd -//.word 0x4c68a666 -//.word 0x29895e30 -//.word 0x3e38cfa7 -//.word 0xb18ef9e3 -//.word 0x12727b15 -//.word 0x99c8f95f -//.word 0xafe5c0e9 -//.word 0xb046ad31 -//.word 0xf0824ba2 -//.word 0xfc7e3b69 -//.word 0x22e0d984 -//.word 0x33c61c1b -//.word 0x87b7be14 -//.word 0x42da9de2 -//.word 0xd665629d -//.word 0xc9596058 -//.word 0xb96dbfaf -//.word 0x9d47d99f -//.word 0x4df2e49b -//.word 0x458dd2db -//.word 0xa54075f8 -//.word 0x7d75e7b6 -//.word 0x48442920 -//.word 0xb62e0adb -//.word 0xaf0f4ab4 -//.word 0x944e007b -//.word 0xc8573914 -//.word 0x6f4be2cb -//.word 0x75f5e8e8 -//.word 0xd2019d83 -//.word 0x0d685e9a -//.word 0xff2f7361 -//.word 0xda5136d9 -//.word 0x6afa77a4 -//.word 0x9af52018 -//.word 0x39681592 -//.word 0xfebf5e0d -//.word 0xcae688f3 -//.word 0x2ebb4832 -//.word 0x2dc36293 -//.word 0x431bc948 -//.word 0xa6b208c3 -//.word 0xcbb6e0cf -//.word 0x2c4c33d9 -//.word 0x4984218e -//.word 0xec8c70ac -//.word 0xb2243111 -//.word 0xc751a019 -//.word 0xf1564d26 -//.word 0xd0e07980 -//.word 0x6481c360 -//.word 0xcf5f0447 -//.word 0x5c2e7794 -//.word 0xc15b1d56 -//.word 0xa18a5f5f -//.word 0x5543f69a -//.word 0xece8089e -//.word 0x70eb9382 -//.word 0x6b3d0ff3 -//.word 0xaa0a4f85 -//.word 0x41a3a947 -//.word 0xd0bc569a -//.word 0x04d71b43 -//.word 0x600029be -//.word 0x3dbb43d5 -//.word 0x0f3b1e72 -//.word 0xebd40db2 -//.word 0x46b3de3a -//.word 0x00cdfece -//.word 0xa115e420 -//.word 0xe2f2ade5 -//.word 0x6ff0042e -//.word 0xebb645f6 -//.word 0x3438e2f7 -//.word 0xe92d05c3 -//.word 0x2ac4770f -//.word 0x9f92c052 -//.word 0xbccf908f -//.word 0x43c35d6e -//.word 0x0a7b4e92 -//.word 0xfec05827 -//.word 0x684aa7ba -//.word 0x6f303f4e -//.word 0xdea3e3ac -//.word 0x28dc35fa -//.word 0xaa53208f -//.word 0x2f327306 -//.word 0xb909ce91 -//.word 0x7fc3c290 -//.word 0x32d93463 -//.word 0x84c5027c -//.word 0xebbaeab8 -//.word 0xa292a7ef -//.word 0xf2085cca -//.word 0xaf2736d4 -//.word 0x05024dd4 -//.word 0x75a6cc5b -//.word 0x1a4d5299 -//.word 0x31d49874 -//.word 0xd86f53dc -//.word 0x169c5c58 -//.word 0x1c550ee5 -//.word 0xca8aef01 -//.word 0x75ce9303 -//.word 0xe851bead -//.word 0xa80ec904 -//.word 0x7d45475f -//.word 0x2d2ce8bf -//.word 0x8be29d5e -//.word 0xb0a4fc8b -//.word 0x8943e7b4 -//.word 0x92d568c5 -//.word 0xe0abe0b1 -//.word 0x6584614d -//.word 0x70005865 -//.word 0x73586f0a -//.word 0x094bb129 -//.word 0x375cef62 -//.word 0xf23a6316 -//.word 0xe28094c2 -//.word 0x669e798c -//.word 0xd817e11c -//.word 0x12ee13ad -//.word 0x315ab164 -//.word 0x99c1e2e0 -//.word 0x39e4af12 -//.word 0x1058ae4f -//.word 0xef35dea3 -//.word 0x8112d369 -//.word 0x8a301318 -//.word 0x6cf5bf60 -//.word 0xef9c7676 -//.word 0x412c76ac -//.word 0x3ca60444 -//.word 0xe8830f86 -//.word 0x415d1010 -//.word 0x3aed346e -//.word 0x0135bdea -//.word 0x85fea5a5 -//.word 0x368585e7 -//.word 0x0b72b6b4 -//.word 0xca09b6a0 -//.word 0x84a4cde4 -//.word 0x5e61f0b0 -//.word 0x9818e5c3 -//.word 0xc790a83a -//.word 0x65f20ea5 -//.word 0x8c7da860 -//.word 0xff7cea21 -//.word 0x6a758ccd -//.word 0xeba43190 -//.word 0xd0a7472c -//.word 0xa37b2e91 -//.word 0x64a79caf -//.word 0x15b74088 -//.word 0x7ceca589 -//.word 0x24325a1a -//.word 0xa5525074 -//.word 0x256983b2 -//.word 0x1f99dc2b -//.word 0x63fe5600 -//.word 0x5ee461f1 -//.word 0x9c378475 -//.word 0x8b3a4509 -//.word 0x827c4dc8 -//.word 0x0109c83c -//.word 0x3bdd0b74 -//.word 0xd19e7956 -//.word 0xe18aa737 -//.word 0x3faebea9 -//.word 0x02582194 -//.word 0x43d05089 -//.word 0x21430d52 -//.word 0x0800bdce -//.word 0x34e710fc -//.word 0x701de455 -//.word 0x2405675f -//.word 0x8e6c7c7f -//.word 0x5004610e -//.word 0x2b148eb0 -//.word 0x0a6de0e1 -//.word 0x42a0f6d1 -//.word 0x186edc72 -//.word 0x8480e6cf -//.word 0x3459df9f -//.word 0xd488631a -//.word 0x8d228a0b -//.word 0xcb6fc727 -//.word 0x44e40f9d -//.word 0x36513dee -//.word 0xef5cb5ff -//.word 0x932e476d -//.word 0x1a6c5720 -//.word 0x98693b23 -//.word 0xc19ae5b2 -//.word 0xac4ac295 -//.word 0xd78ee1ad -//.word 0x6c7c58cd -//.word 0xc298e4cb -//.word 0x278fcfd6 -//.word 0xdd281709 -//.word 0x6277cc41 -//.word 0xf454ba2c -//.word 0x550b48a3 -//.word 0xcc55a03a -//.word 0x6c871015 -//.word 0x980ab0fd -//.word 0xc70b46b2 -//.word 0x85736683 -//.word 0xbb1ade1d -//.word 0x2f3751a1 -//.word 0x4e1c21f9 -//.word 0x2a20926b -//.word 0xbfdc2d6e -//.word 0x7a9a63bd -//.word 0xfc0a73ab -//.word 0x1b378eb6 -//.word 0x29ba385e -//.word 0x792df138 -//.word 0x20e3153e -//.word 0xf9d60169 -//.word 0xece17782 -//.word 0x6f304435 -//.word 0x4cf41f67 -//.word 0xa55bd5c9 -//.word 0x36bfa3ad -//.word 0xdb1ee319 -//.word 0x52caec1a -//.word 0x4161335b -//.word 0x7b00b6f6 -//.word 0x7fb49a8a -//.word 0x4231128e -//.word 0x2ec784e5 -//.word 0x6a91e7b2 -//.word 0x5cf0706d -//.word 0x6c376d37 -//.word 0x0ba8716a -//.word 0xf4a0b175 -//.word 0xb20eaee7 -//.word 0x632914c9 -//.word 0xbb63e231 -//.word 0x4c98cc14 -//.word 0x048cde5c -//.word 0xf794613a -//.word 0x5e9302be -//.word 0xe02831a5 -//.word 0x1126c872 -//.word 0x3945edc0 -//.word 0x561739d6 -//.word 0x643d1a7c -//.word 0xdbda750d -//.word 0x7a4890ce -//.word 0x430a307e -//.word 0xc702fe2e -//.word 0xa3e42f53 -//.word 0x4beb641a -//.word 0x06cbcffb -//.word 0x3ae69891 -//.word 0xeac27fa9 -//.word 0x7dbbc299 -//.word 0xc1f541d3 -//.word 0x2f95e0b9 -//.word 0x71312db3 -//.word 0x2184437f -//.word 0xd467eec9 -//.word 0x57fd0ffc -//.word 0x382d4257 -//.word 0x8855bf43 -//.word 0xe03c7ee4 -//.word 0xa2499fee -//.word 0x81f308ba -//.word 0x44795099 -//.word 0xc6d3dc68 -//.word 0x42e84764 -//.word 0xcd010740 -//.word 0x247e4e75 -//.word 0xa8c82fda -//.word 0xa7860274 -//.word 0xdd14098f -//.word 0x3b30540d -//.word 0xe7f7e1ff -//.word 0x83110872 -//.word 0xb228168b -//.word 0xd89e39d7 -//.word 0x227f9cdc -//.word 0xc7b4d2f4 -//.word 0x8d7a785b -//.word 0x8e131686 -//.word 0x3cbb47b6 -//.word 0xa3de1ace -//.word 0xee88b761 -//.word 0x2d1d4610 -//.word 0x554a0c13 -//.word 0x883bd715 -//.word 0x970f9d45 -//.word 0xc68960aa -//.word 0xcf0854b6 -//.word 0x29b9441f -//.word 0x890b32ea -//.word 0xaa633ec9 -//.word 0x4a12c9a6 -//.word 0x7584d980 -//.word 0x05b9bf76 -//.word 0x6af9f821 -//.word 0xa7c45227 -//.word 0x9d094f0d -//.word 0x8c98ce4d -//.word 0xd7d8e8a9 -//.word 0x07bd19be -//.word 0x13f5a0dc -//.word 0xdf622815 -//.word 0x02cda794 -//.word 0xccd98731 -//.word 0x88350442 -//.word 0xfe16d5b3 -//.word 0x3ce50e59 -//.word 0x96344583 -//.word 0xecf7f3d2 -//.word 0x2bf11e4b -//.word 0x166c35ab -//.word 0x472d3cfa -//.word 0x70a72863 -//.word 0xe76f8d43 -//.word 0x62f07680 -//.word 0xff60941c -//.word 0x87f39c0a -//.word 0xf34eea40 -//.word 0x2f3e6a0d -//.word 0x1faab8ad -//.word 0xe0c6861b -//.word 0x508a3f26 -//.word 0xd063e9c7 -//.word 0x482850b2 -//.word 0x6c4f612b -//.word 0x3e61d41b -//.word 0xd4ab0e63 -//.word 0x5c374570 -//.word 0x5dfae50f -//.word 0x404f3283 -//.word 0x0ea42fd6 -//.word 0x7b73bf6c -//.word 0x24750bde -//.word 0x15122305 -//.word 0x8e1be854 -//.word 0x07bb296b -//.word 0x71ab0cea -//.word 0xbfa6b083 -//.word 0xa51d1054 -//.word 0x9f2b2b73 -//.word 0x36cb62ca -//.word 0x7f492125 -//.word 0xe4f6c189 -//.word 0x2620adc8 -//.word 0xa341c452 -//.word 0xd577ff4e -//.word 0x1c3454e9 -//.word 0xbd37daee -//.word 0x2abb2d98 -//.word 0x84ee14a4 -//.word 0x5ea461a9 -//.word 0xc44d19ac -//.word 0x7b24d5ef -//.word 0x8baa680b -//.word 0xfb53c23e -//.word 0xdc7f1506 -//.word 0x89ab36ef -//.word 0x2ce945a9 -//.word 0x848d905d -//.word 0xe62ab541 -//.word 0x82bd076b -//.word 0xe82733e3 -//.word 0xcbe124fb -//.word 0x04eb23e3 -//.word 0xd9054378 -//.word 0x8022fc5d -//.word 0xdf1a164d -//.word 0x969fc8af -//.word 0x3f72226b -//.word 0xf4d6a8fd -//.word 0x124640c8 -//.word 0x3d634eac -//.word 0xa5301dda -//.word 0x878181e7 -//.word 0xf6b1ba20 -//.word 0xdb949c1e -//.word 0x3baced9a -//.word 0xb8a00f82 -//.word 0x5be9de4b -//.word 0x90cfdc8a -//.word 0x72948cbe -//.word 0x49ef1b70 -//.word 0x51bc457f -//.word 0xbef177b5 -//.word 0xfcd4319d -//.word 0x3b6baf99 -//.word 0x2b34c82f -//.word 0x041716a4 -//.word 0xca9957cc -//.word 0xcf521320 -//.word 0x79a18011 -//.word 0x459ea29c -//.word 0x0c50b61f -//.word 0x8621d16b -//.word 0x0c8ec51a -//.word 0xa2234423 -//.word 0x34a748ab -//.word 0x2094b11e -//.word 0xf5ca307f -//.word 0x7a8365fc -//.word 0xf38a44c6 -//.word 0x9fa8bd1f -//.word 0x855f9cb5 -//.word 0x71dbae2e -//.word 0x39262504 -//.word 0x449b3d93 -//.word 0x4d9d2070 -//.word 0x658907fd -//.word 0x37e8a33a -//.word 0x90eabbde -//.word 0x1f1016a7 -//.word 0x79289bee -//.word 0x5f7eb77e -//.word 0x4451ffa6 -//.word 0x0a84178d -//.word 0x0d96d2c6 -//.word 0x62d49a24 -//.word 0x61cd13d0 -//.word 0x6007fb98 -//.word 0xc2f0558a -//.word 0x3117c6c2 -//.word 0x279c3f80 -//.word 0xb3e6dc7e -//.word 0x7a930c80 -//.word 0xfcb5f32c -//.word 0x183b0c1c -//.word 0xd2ad1332 -//.word 0x551d222b -//.word 0x345a1a77 -//.word 0xf5664448 -//.word 0xd02a38ea -//.word 0xb469fe52 -//.word 0x8bf374f9 -//.word 0xbf1befeb -//.word 0xfd6a251a -//.word 0x39954bf9 -//.word 0xf2ad7a46 -//.word 0xb7965727 -//.word 0xeabaf379 -//.word 0xc4fef065 -//.word 0x99f6e634 -//.word 0x5d540464 -//.word 0x68a7fbfb -//.word 0x7642171b -//.word 0xf279afd7 -//.word 0x7414c045 -//.word 0x88fdd5d4 -//.word 0xb13c2ae0 -//.word 0xad251084 -//.word 0xfbd093b0 -//.word 0x9bca5b7b -//.word 0x150ad0ba -//.word 0xbc2782d1 -//.word 0x34c8c7c9 -//.word 0x325ba6a3 -//.word 0x830af3ec -//.word 0x50eabc92 -//.word 0xa076e4f6 -//.word 0x1e3d0e42 -//.word 0x1dd7bcfd -//.word 0xd91db8dd -//.word 0xff9ab4dc -//.word 0x703c2d8d -//.word 0x424f95b1 -//.word 0x08acb006 -//.word 0x542e3f5f -//.word 0x7a66dcf9 -//.word 0x9690250d -//.word 0xd0c51ca2 -//.word 0xde72cea5 -//.word 0xcb08333b -//.word 0xf7f55656 -//.word 0x60d4b587 -//.word 0x1fe0eb13 -//.word 0x36af8c48 -//.word 0x881d5111 -//.word 0x298675c9 -//.word 0xd8385e4d -//.word 0xca278055 -//.word 0xaae37f04 -//.word 0xddc893bd -//.word 0x0a743139 -//.word 0xda7fe8d6 -//.word 0xfc668932 -//.word 0x6dc78af9 -//.word 0xf6d4acfb -//.word 0xf602dc82 -//.word 0x610157e2 -//.word 0x09f11251 -//.word 0x1cd359f9 -//.word 0xee3db64c -//.word 0xf9521498 -//.word 0x23f224db -//.word 0x3f2e00d8 -//.word 0xd5ff0f6a -//.word 0x26372819 -//.word 0x6bb7faeb -//.word 0x5ee3ab7c -//.word 0xfb53bf51 -//.word 0x88cb3c6a -//.word 0xd36e0b16 -//.word 0xbb2ea20c -//.word 0xf187e0b6 -//.word 0x006d38d0 -//.word 0x8b831232 -//.word 0xd68d6eea -//.word 0x8928cb8e -//.word 0xb0b947d1 -//.word 0x05a30753 -//.word 0x72bdd9be -//.word 0xd203180e -//.word 0xf88bd130 -//.word 0xf2bb23cf -//.word 0x8ebaec6b -//.word 0x1e24a2ab -//.word 0x79027ef4 -//.word 0x42f9e03a -//.word 0x6dc1ef16 -//.word 0xfed97f19 -//.word 0x14793961 -//.word 0x27c9f569 -//.word 0x8e506b25 -//.word 0x44af0b4f -//.word 0xeb8f29fc -//.word 0x11d85d72 -//.word 0xb3232a3d -//.word 0xff73dd80 -//.word 0x5e1fb88a -//.word 0xb21350a9 -//.word 0xdc393443 -//.word 0x8231cf22 -//.word 0x0f489010 -//.word 0xfba848a4 -//.word 0x4cccd35b -//.word 0x5d37faea -//.word 0xde6698d3 -//.word 0x1c03fc37 -//.word 0x825b8feb -//.word 0x6012b6ce -//.word 0xec15fa59 -//.word 0x87d16777 -//.word 0x41a33197 -//.word 0x9e8f9e00 -//.word 0x9b341f65 -//.word 0xecffc0ba -//.word 0x88a0c346 -//.word 0x67ba88f8 -//.word 0x8adfb1fe -//.word 0x3dbb8394 -//.word 0x998f8e1a -//.word 0x4ce2906a -//.word 0x9d739768 -//.word 0xaa7166db -//.word 0xf4ee1a7b -//.word 0x1e920d4a -//.word 0xf28cfb28 -//.word 0xa5ce63a2 -//.word 0x5c7a300c -//.word 0xee9799cf -//.word 0xec094603 -//.word 0xdfc0b441 -//.word 0xd02fdab2 -//.word 0x0e000d6c -//.word 0x2b0621ff -//.word 0x4873d14a -//.word 0x924b6094 -//.word 0x0d1881d8 -//.word 0x91e0755f -//.word 0x12547394 -//.word 0x244a4c15 -//.word 0xbd6d4f06 -//.word 0x3d336aaa -//.word 0xad109334 -//.word 0x44ea66da -//.word 0x30cc102c -//.word 0x93de6ba4 -//.word 0xcb956a7e -//.word 0xf627b8c9 -//.word 0xb5429cbf -//.word 0x31fd2052 -//.word 0x5c0f7207 -//.word 0x7a3e8a07 -//.word 0xdf1b0d74 -//.word 0xfaed72f9 -//.word 0x92eb63a5 -//.word 0x50ae66f9 -//.word 0x7ee5bc3f -//.word 0x0e4b891e -//.word 0xded6366c -//.word 0x3a311443 -//.word 0xa36d4257 -//.word 0xcef4d086 -//.word 0xf0be24b1 -//.word 0x39c79dcb -//.word 0x9ec0772f -//.word 0xdc04ef37 -//.word 0xbacfa70a -//.word 0x8eaa4bb5 -//.word 0x022a757e -//.word 0x18dace74 -//.word 0x6c76774b -//.word 0xba5aa767 -//.word 0x9f399537 -//.word 0xa41298c4 -//.word 0x78608c8a -//.word 0x7d927986 -//.word 0x86ba6f90 -//.word 0xe089b4eb -//.word 0x8f7b221b -//.word 0xd94fcaf6 -//.word 0x09baddfe -//.word 0x6d5ccdee -//.word 0xa1f3af93 -//.word 0x0fcfe4dd -//.word 0xb786f836 -//.word 0x2ce8ca12 -//.word 0xdf35edc8 -//.word 0xa08e4fa0 -//.word 0x62aa182d -//.word 0x3fcad5dd -//.word 0xbcefd6ce -//.word 0x4d4ad4e3 -//.word 0x1cf4d818 -//.word 0x06df5712 -//.word 0xe60da2fb -//.word 0x17ff7e8c -//.word 0x34710e6b -//.word 0x2244fab8 -//.word 0x51bccae2 -//.word 0x3eeb93c0 -//.word 0x3d6dd6dd -//.word 0x7556a513 -//.word 0x2c69075b -//.word 0x458b9ee3 -//.word 0x06778761 -//.word 0x1fb282a8 -//.word 0xe8c25378 -//.word 0xeb9b689b -//.word 0xa25abb2d -//.word 0x8235fa3c -//.word 0x38b2e691 -//.word 0x3218f9cc -//.word 0x61234bb7 -//.word 0x3dfcb6d4 -//.word 0x0a683838 -//.word 0x5a409a9c -//.word 0xd4214fb2 -//.word 0x33649fb5 -//.word 0x92510544 -//.word 0xe68fd570 -//.word 0xccdf2114 -//.word 0x850bde65 -//.word 0x3e1843c9 -//.word 0x95c372ed -//.word 0x5a2c5a11 -//.word 0x92ccdca7 -//.word 0xc2ac2c1d -//.word 0x6ad97bf7 -//.word 0xcf13d320 -//.word 0xfdc54282 -//.word 0x0d3a3ad4 -//.word 0xa40d38b3 -//.word 0xbce1a4f5 -//.word 0xa753f83a -//.word 0x502d25c3 -//.word 0xc5dc3388 -//.word 0xf2252784 -//.word 0xaf132954 -//.word 0xfe34e600 -//.word 0x8d053419 -//.word 0x83aaf404 -//.word 0x79e23d95 -//.word 0xc53bb7e0 -//.word 0xff82444b -//.word 0xbe7ee6e8 -//.word 0xa3dedd02 -//.word 0x996f0ff6 -//.word 0x5a92ad44 -//.word 0x36ee14e6 -//.word 0x1062f1e1 -//.word 0xa93da919 -//.word 0x21b2f869 -//.word 0xba86d8f3 -//.word 0xe00ca4b5 -//.word 0x66537d5e -//.word 0x139eed5f -//.word 0x5d14ca44 -//.word 0x74b95d45 -//.word 0x829dc418 -//.word 0x3154950a -//.word 0x6fa5c44e -//.word 0x6e86c795 -//.word 0xee49f7df -//.word 0xbe103a90 -//.word 0x8086dfc6 -//.word 0xaed1c9ea -//.word 0xdac2d085 -//.word 0x3a4f6455 -//.word 0x634473a1 -//.word 0x55358dc9 -//.word 0xb8b74721 -//.word 0x65d0ddff -//.word 0x28ab1b13 -//.word 0xc4907df7 -//.word 0x38149507 -//.word 0x418dad73 -//.word 0x20c9ae93 -//.word 0x9d00407a -//.word 0x4c0633cd -//.word 0x0fc51ed6 -//.word 0xdceb45d4 -//.word 0xc1e0c095 -//.word 0x25fbda47 -//.word 0x50f5b88c -//.word 0x2e9e3bcc -//.word 0x4fce26cf -//.word 0x339f848b -//.word 0xc5d9443a -//.word 0x25ae27b0 -//.word 0xaaa8dcec -//.word 0x28df69ed -//.word 0x6e6fccc7 -//.word 0x1329e2f5 -//.word 0x738989f1 -//.word 0xf4e80102 -//.word 0x8ef39955 -//.word 0x8a5c8750 -//.word 0x89d01723 -//.word 0xc92808a0 -//.word 0xa4e3324c -//.word 0x59d46db6 -//.word 0x0f18af07 -//.word 0x174b74db -//.word 0x72fb634f -//.word 0x935d2e5b -//.word 0x653fba63 -//.word 0x903e8008 -//.word 0xf9393344 -//.word 0x8706a2b6 -//.word 0x2d63e13a -//.word 0x252fa3bd -//.word 0x79daeb50 -//.word 0xc81ae47a -//.word 0x47df0cd3 -//.word 0x068a98ce -//.word 0x755915d7 -//.word 0x26264b9e -//.word 0xd45266b2 -//.word 0xa5fc5851 -//.word 0xac76797f -//.word 0xb2f97055 -//.word 0x3697579c -//.word 0xb2721a9a -//.word 0x202c202c -//.word 0xbd9e2e15 -//.word 0x0dcd8896 -//.word 0x1f19593f -//.word 0x12b85404 -//.word 0xd8639c93 -//.word 0x3a4fe1e5 -//.word 0x1c5fcc13 -//.word 0x03989e6c -//.word 0xd4d514c4 -//.word 0xdfbc8d0e -//.word 0x1bf06e2e -//.word 0xb388c608 -//.word 0xc2c12edd -//.word 0x5beff4d7 -//.word 0xcdba78e2 -//.word 0x2586d5be -//.word 0xf433c452 -//.word 0x5207be44 -//.word 0x22e861c6 -//.word 0x98cf15b3 -//.word 0xf979efda -//.word 0xa260d69a -//.word 0x4ce9e4af -//.word 0x8edf0e4b -//.word 0xa3200868 -//.word 0x6e96635d -//.word 0xbb69f9b0 -//.word 0xc8738a2c -//.word 0x04f5a733 -//.word 0x1688cf55 -//.word 0x2156d921 -//.word 0x4789913a -//.word 0x6c04a6ae -//.word 0x3c51c484 -//.word 0x6fdbfd94 -//.word 0x4b5e6d9c -//.word 0x6b9b1e8f -//.word 0xc0502930 -//.word 0xd5671ee0 -//.word 0x576ea6b4 -//.word 0xd44767cb -//.word 0xc32128df -//.word 0xc5a73619 -//.word 0x2a76062a -//.word 0xb7d51b97 -//.word 0xa6a02a54 -//.word 0xef867d95 -//.word 0xc67595e1 -//.word 0x65511368 -//.word 0x0becd996 -//.word 0x45336ce8 -//.word 0x6ca59cff -//.word 0x6f0a68f3 -//.word 0xd2611ce9 -//.word 0xf71abce8 -//.word 0x9d85a5e8 -//.word 0xa68b722c -//.word 0x1d9c1dd2 -//.word 0x77e866a9 -//.word 0x19d27942 -//.word 0x1ba1cb4a -//.word 0x4c794516 -//.word 0x768ba480 -//.word 0xe38820f2 -//.word 0x1f5b4bc0 -//.word 0x00173dbb -//.word 0xe42eee03 -//.word 0x3ae5e31c -//.word 0x44040d44 -//.word 0x1ad2ee04 -//.word 0xf340fd06 -//.word 0xa0654c26 -//.word 0x592a68cb -//.word 0xbc478078 -//.word 0x136eca9e -//.word 0xd6c523b5 -//.word 0x719af68a -//.word 0x46535edb -//.word 0xf6a38f21 -//.word 0xdc0472ad -//.word 0xdb618ff6 -//.word 0x5a123032 -//.word 0x8c0ec323 -//.word 0xf55c8134 -//.word 0x2acb4dc4 -//.word 0xd8e3dfc2 -//.word 0x071b217a -//.word 0xa04dd9ae -//.word 0x2d6689e9 -//.word 0xe1629310 -//.word 0xd878a13a -//.word 0x9f9144c1 -//.word 0xf7ffdc9a -//.word 0xd66cb7e1 -//.word 0xaf107db8 -//.word 0xf328cb52 -//.word 0xd8a31e4b -//.word 0x591ef33b -//.word 0x7e122c8a -//.word 0xdd4cb686 -//.word 0x619e69b2 -//.word 0x4ad52f61 -//.word 0x75ea6984 -//.word 0xde7d8ec1 -//.word 0x637e15c5 -//.word 0xcb2e96da -//.word 0x06462cbc -//.word 0xb6751da8 -//.word 0xef10bdb7 -//.word 0x3b068f6a -//.word 0xe212ae86 -//.word 0x68346b22 -//.word 0x566138fe -//.word 0x3e7ac516 -//.word 0xf97b6877 -//.word 0x33f5c252 -//.word 0x2abea04f -//.word 0xb2e61f23 -//.word 0x7dee1465 -//.word 0x9935aa9d -//.word 0x3ab34d9f -//.word 0xbae9c717 -//.word 0xde18a964 -//.word 0x5bb2edaa -//.word 0x980ed922 -//.word 0xb65f27b5 -//.word 0xcee762ca -//.word 0x7968935c -//.word 0x96dc1d4f -//.word 0x4765e604 -//.word 0x3d87b72b -//.word 0x3695e6d8 -//.word 0xc36932d9 -//.word 0x4f58ee48 -//.word 0x5d66625c -//.word 0x11b56e84 -//.word 0xf24470b7 -//.word 0xeed66805 -//.word 0x9f2f5a73 -//.word 0xcc86f405 -//.word 0x3338711c -//.word 0x85babd02 -//.word 0xb3d1dac4 -//.word 0x68058240 -//.word 0xd6530e7e -//.word 0xb6229644 -//.word 0x8a785ae4 -//.word 0x266e6059 -//.word 0x6ee15f92 -//.word 0x616bdc0e -//.word 0x579193a9 -//.word 0x863e18b6 -//.word 0xcb71be4d -//.word 0xa832b8e6 -//.word 0x89ca7e27 -//.word 0x4b3373fb -//.word 0xfecec4e4 -//.word 0xea549392 -//.word 0xd10f55b4 -//.word 0x744a780e -//.word 0x580649cc -//.word 0xcaee1616 -//.word 0x218d8fe4 -//.word 0x43bf7214 -//.word 0x6b6568ba -//.word 0x295d2ab7 -//.word 0xaab2e78d -//.word 0x390fea71 -//.word 0x067a78a2 -//.word 0x263ef7fa -//.word 0xdc2956c2 -//.word 0x17f8a8cb -//.word 0x3b1012ba -//.word 0x246fe8a4 -//.word 0x69e113db -//.word 0xdd77b607 -//.word 0x5c351178 -//.word 0xc40ba5ba -//.word 0x4107986a -//.word 0xcec85c49 -//.word 0xf8368c8f -//.word 0xe5701682 -//.word 0x96069f46 -//.word 0x696923f7 -//.word 0xe29fdcf5 -//.word 0xaa3b667f -//.word 0xd88d2084 -//.word 0x7016d5b5 -//.word 0x293e9cdf -//.word 0x744afc78 -//.word 0xb9885478 -//.word 0xe4cc7a6a -//.word 0x2020a3c2 -//.word 0xe2b88371 -//.word 0x2a24b5b7 -//.word 0x06c95c38 -//.word 0x57920b53 -//.word 0xd7e3e2af -//.word 0x5bcffa16 -//.word 0x568a0487 -//.word 0x9f212c86 -//.word 0x746844b7 -//.word 0xbe341eab -//.word 0x96cb39fa -//.word 0x0999a092 -//.word 0x1825104e -//.word 0x034359cb -//.word 0xc88a0677 -//.word 0xe60840ea -//.word 0x6635f07a -//.word 0x1c262409 -//.word 0x2b03b422 -//.word 0xc7bb2545 -//.word 0x3ff6cd7e -//.word 0x3a4c383c -//.word 0x40b4cb61 -//.word 0x7d3fa796 -//.word 0xc206d1e1 -//.word 0xcd608f79 -//.word 0xca5915d9 -//.word 0x1a606013 -//.word 0x52406367 -//.word 0x87526114 -//.word 0xc9f09a6e -//.word 0xed2c2931 -//.word 0x90c22d15 -//.word 0x584c27a2 -//.word 0x7db5a346 -//.word 0x88f01ba5 -//.word 0x5bea1830 -//.word 0x72bd9af9 -//.word 0x6826bac5 -//.word 0xbd398e63 -//.word 0xd6534d3d -//.word 0x4551b32d -//.word 0x4bffa792 -//.word 0x9bd31ca2 -//.word 0x61dc3502 -//.word 0x83f5ac94 -//.word 0x273e7490 -//.word 0x75cd9dd6 -//.word 0x9ea07982 -//.word 0x1dd6fdc1 -//.word 0x3d1f69e4 -//.word 0xdb722cb3 -//.word 0x6dfe0104 -//.word 0x43625f8c -//.word 0x0d2010f4 -//.word 0x9e4f1f2f -//.word 0xef91f80c -//.word 0x6745cb07 -//.word 0x59fe3165 -//.word 0xcf331280 -//.word 0x8638c65f -//.word 0x396c7a89 -//.word 0x22b5d61b -//.word 0xbf29dd19 -//.word 0xd20e1402 -//.word 0xab05e6a7 -//.word 0xa982473c -//.word 0xff7f98b0 -//.word 0xb472ca3a -//.word 0xee7cc735 -//.word 0x6fe30d2d -//.word 0x60c29c3a -//.word 0x4dff138c -//.word 0x727e1648 -//.word 0x3594f293 -//.word 0xf3bf84eb -//.word 0xff9457be -//.word 0xe8f80c35 -//.word 0xfb93ff51 -//.word 0x0982273a -//.word 0x6b4c3ed4 -//.word 0x42182292 -//.word 0x031d7c8f -//.word 0x34599fdb -//.word 0x7086b312 -//.word 0xb14a1234 -//.word 0xcfaef2b0 -//.word 0x43d145c2 -//.word 0x31deddff -//.word 0xa63bd42f -//.word 0x1e032b5a -//.word 0x49b7b126 -//.word 0x0e302660 -//.word 0xd1d8a1d8 -//.word 0xf11a2f72 -//.word 0x9517bd7a -//.word 0xa99b3838 -//.word 0x234ff2c4 -//.word 0x8b30481c -//.word 0xba3f8274 -//.word 0xe27afacd -//.word 0xce0c81c9 -//.word 0x6bc1febe -//.word 0x88bc5809 -//.word 0xda6c96a5 -//.word 0x43bc45fc -//.word 0x538a1afc -//.word 0x105bd96e -//.word 0xf24d7583 -//.word 0x324d79b0 -//.word 0x4589a6bc -//.word 0xa328de18 -//.word 0xcc39416e -//.word 0x8dea957c -//.word 0x7ffbeb23 -//.word 0xd2727fbb -//.word 0x488fe1aa -//.word 0x84025235 -//.word 0x855c7196 -//.word 0x6ec4174e -//.word 0x88eb7fbc -//.word 0x8942aaef -//.word 0x176a01b9 -//.word 0x88eb3d04 -//.word 0xec2a8469 -//.word 0x4d95d4ff -//.word 0x3521a571 -//.word 0x71f6ca54 -//.word 0x156899b7 -//.word 0xc02a4bfb -//.word 0x21bea6e5 -//.word 0xba30d9f1 -//.word 0xe404a7e9 -//.word 0x146dc7b7 -//.word 0x5cc08b78 -//.word 0x3527c1d1 -//.word 0x7b9ad786 -//.word 0xb90b4248 -//.word 0xa7e11fcf -//.word 0xf1a81b29 -//.word 0x3a079152 -//.word 0x61f2f304 -//.word 0x03206bd0 -//.word 0x41c0c26e -//.word 0xc3688052 -//.word 0xfc4e557f -//.word 0xb0bab7a0 -//.word 0xb4bbcd55 -//.word 0xf61a8ccb -//.word 0xbd8c208f -//.word 0x312b8da4 -//.word 0x1d2796d3 -//.word 0xf4b9de42 -//.word 0x12594d48 -//.word 0x4531b580 -//.word 0x8cd1b51c -//.word 0x1e24de7c -//.word 0xaea31500 -//.word 0xeec8381a -//.word 0x52c605a7 -//.word 0x1677377f -//.word 0x8296f14a -//.word 0x6d2e6096 -//.word 0x00529d27 -//.word 0xbc0fd08e -//.word 0xbe9f9bfe -//.word 0x42dfb65a -//.word 0x6704d692 -//.word 0x3289d430 -//.word 0xd46b0b2e -//.word 0x3099020b -//.word 0x98a64b1e -//.word 0xd7c2aa29 -//.word 0x75e87a31 -//.word 0x36594d8d -//.word 0xe448d33e -//.word 0x4ed7fd7e -//.word 0x9142619b -//.word 0x965ae106 -//.word 0xdc3687a7 -//.word 0x7825b474 -//.word 0x5ae67a42 -//.word 0xd11c46db -//.word 0x52fcc250 -//.word 0x7549f991 -//.word 0x4082bd3a -//.word 0xa85a45b0 -//.word 0x55681b6d -//.word 0xa6203698 -//.word 0xf50262d9 -//.word 0x1c11e96b -//.word 0x37876c73 -//.word 0xacc71290 -//.word 0x6993e5b3 -//.word 0x6d7f7831 -//.word 0x8aa5cd16 -//.word 0x699b77bd -//.word 0xcea2fc9d -//.word 0x1d207d66 -//.word 0x1e51994d -//.word 0xfd398ea3 -//.word 0x95dda1ad -//.word 0xedb2c1b0 -//.word 0x0356674b -//.word 0xc97ec009 -//.word 0x6e300e37 -//.word 0xde324cf3 -//.word 0x8cc21086 -//.word 0x6f87b6f4 -//.word 0x4ac8bbd1 -//.word 0x31dc6755 -//.word 0x49e1afb3 -//.word 0xcfb159a7 -//.word 0x5c12614e -//.word 0x672d9c3b -//.word 0x0b429bc7 -//.word 0x0a99d2a8 -//.word 0x13bcf9c6 -//.word 0x40e3b34a -//.word 0xe3b06ef7 -//.word 0x821c8abd -//.word 0x20b2bd8b -//.word 0xbefbb666 -//.word 0x223900b8 -//.word 0xd7572aea -//.word 0x75212534 -//.word 0x23b1edb4 -//.word 0x59296bbe -//.word 0xeba89b74 -//.word 0x4376ea96 -//.word 0xed82e29b -//.word 0x5a0f0800 -//.word 0xddaa05e0 -//.word 0xfa5f05c5 -//.word 0xe02c5dbe -//.word 0x34b670b1 -//.word 0x103bd3f3 -//.word 0x4cc8af16 -//.word 0xfcac6702 -//.word 0x392c7b47 -//.word 0x2578adb2 -//.word 0x29de621f -//.word 0x813e4a8d -//.word 0xfbbe4378 -//.word 0xfbbe7b63 -//.word 0xc30fd5b4 -//.word 0xf15f8fc4 -//.word 0x49f82137 -//.word 0xb5ab6889 -//.word 0x8a0603ea -//.word 0x0dcefe4c -//.word 0x36a9adba -//.word 0xb41adbeb -//.word 0x30b22517 -//.word 0xd685a009 -//.word 0x12dcc276 -//.word 0x97297f8d -//.word 0xa640b2cf -//.word 0x8dc3bf21 -//.word 0x6ede761f -//.word 0x41353bb4 -//.word 0x1c1b64e7 -//.word 0xb205e3f8 -//.word 0x1b3e25ac -//.word 0xd3dc3ae5 -//.word 0x04f23575 -//.word 0x0807d634 -//.word 0x29c76651 -//.word 0xacf9e3e5 -//.word 0x0fb15dce -//.word 0x8ec7a0ba -//.word 0xec871382 -//.word 0x6faae0ba -//.word 0x2d865586 -//.word 0x86818bae -//.word 0xf2cb45f5 -//.word 0xfd4d1aa7 -//.word 0x8fdcd772 -//.word 0x71b31f76 -//.word 0x0d20549f -//.word 0x757dbb33 -//.word 0xa762daa7 -//.word 0x101925b7 -//.word 0x4e52dab6 -//.word 0x3a182a22 -//.word 0x2604997b -//.word 0x63b1a755 -//.word 0x076fb0ad -//.word 0xec3c1179 -//.word 0xfcf08c82 -//.word 0xacb7ee76 -//.word 0xc7c4ee39 -//.word 0x6d44597d -//.word 0x5b916c92 -//.word 0x6da9817f -//.word 0x60deef51 -//.word 0xddcf2bb3 -//.word 0xb39633bf -//.word 0x65432c14 -//.word 0xe48a4929 -//.word 0x9db8f0e1 -//.word 0xb6eb185f -//.word 0x9583f61b -//.word 0xa3d4d835 -//.word 0x4f1d510a -//.word 0x55be9606 -//.word 0x40a528b9 -//.word 0x2d0ab32c -//.word 0xd35c3675 -//.word 0xc07b6589 -//.word 0xe5274c52 -//.word 0x55b93401 -//.word 0x4a10caa6 -//.word 0x69cf7efd -//.word 0x47c62a8b -//.word 0x2badf4ea -//.word 0x16187562 -//.word 0x00a71bb9 -//.word 0x657dcb4b -//.word 0x00f4cb5d -//.word 0xd78fe0ae -//.word 0x7731b34f -//.word 0x818c79b5 -//.word 0x65dbd30d -//.word 0x6ed4f3cf -//.word 0xffd80196 -//.word 0x1c6ebd2f -//.word 0x2bef65ef -//.word 0xfc83d94a -//.word 0x084bfda2 -//.word 0xf6e05f5d -//.word 0x64fd1a3a -//.word 0xe378fae5 -//.word 0x4377e0c9 -//.word 0x12e06825 -//.word 0x5f11ca62 -//.word 0xc3d2fea4 -//.word 0xa387249f -//.word 0xafab22ac -//.word 0xae798f1b -//.word 0x7eecd0cb -//.word 0x56ea80f9 -//.word 0x4fbc1656 -//.word 0x23c2c15c -//.word 0x346597e1 -//.word 0xd04cefed -//.word 0xb3d30bc9 -//.word 0xcdb9fb58 -//.word 0x4618bdaa -//.word 0xc09ba9cf -//.word 0xdceb0de9 -//.word 0xff6a1485 -//.word 0x5624ec2c -//.word 0x17032734 -//.word 0x0a4262dc -//.word 0x49232599 -//.word 0x44e50baa -//.word 0x07f023f2 -//.word 0xc0549507 -//.word 0x7b718987 -//.word 0x31f744ab -//.word 0x0112941e -//.word 0xbdde6f0f -//.word 0xa821d785 -//.word 0x7e3900f2 -//.word 0xb553b50c -//.word 0x03def8d8 -//.word 0x2040e907 -//.word 0xcdc7e986 -//.word 0x15e2fe51 -//.word 0xd3917988 -//.word 0x741ad7c4 -//.word 0xfefee6ab -//.word 0x512b29c2 -//.word 0xae737c83 -//.word 0x753dfbb0 -//.word 0x337a21e6 -//.word 0xdbdb2d75 -//.word 0x5441ca6f -//.word 0x3476eeff -//.word 0xcc1a03fc -//.word 0x64e045be -//.word 0xc7fa6b31 -//.word 0x03d18927 -//.word 0x6afa35f3 -//.word 0xdc65e933 -//.word 0x49d8a8ed -//.word 0x719ce4de -//.word 0xee77a00e -//.word 0x75dad2a8 -//.word 0x595a0b09 -//.word 0x50645917 -//.word 0x7a2d6dd4 -//.word 0x9fe9f933 -//.word 0xb93d5c2a -//.word 0xb2f68108 -//.word 0x6efb0409 -//.word 0x0c809727 -//.word 0x697da534 -//.word 0xe65f3526 -//.word 0x6cfd10b2 -//.word 0xadcd261c -//.word 0xac582e4d -//.word 0x7feb8d26 -//.word 0x53907914 -//.word 0xb23c5ee4 -//.word 0x014a80d9 -//.word 0x4d28e3fc -//.word 0x475168b4 -//.word 0x8c7b3896 -//.word 0x2a11657e -//.word 0x60e3cfdf -//.word 0xa61d4557 -//.word 0xed75ed87 -//.word 0x28a9e621 -//.word 0x0b292b42 -//.word 0x1310bb03 -//.word 0xc659f74b -//.word 0x3c504be7 -//.word 0xde4610dc -//.word 0x6e89b1fb -//.word 0x48940db7 -//.word 0xe7821d34 -//.word 0xaac9d7a0 -//.word 0xd82452c6 -//.word 0xe3d12ae0 -//.word 0xe9fd26ad -//.word 0x807d18c4 -//.word 0xb3be0528 -//.word 0x48ff861c -//.word 0x45bd6e39 -//.word 0xb26fadbd -//.word 0x9f747526 -//.word 0x694a9b00 -//.word 0x3a003ffb -//.word 0xcfeeaf40 -//.word 0x7ea38905 -//.word 0x771f205f -//.word 0x4a432158 -//.word 0xa9857742 -//.word 0x6fe86b4b -//.word 0xe22c1051 -//.word 0x3541def7 -//.word 0x52029df8 -//.word 0xd62085bb -//.word 0x5c5ca328 -//.word 0xfefa7ebb -//.word 0x1972fbd6 -//.word 0x51687e5c -//.word 0xd5de527b -//.word 0xe4a94bc9 -//.word 0x9121a993 -//.word 0xc31d4071 -//.word 0x7f1fd61e -//.word 0x6acbcd87 -//.word 0x899e0222 -//.word 0x4cdcf481 -//.word 0xcbca2927 -//.word 0x4f1ecd9a -//.word 0x14b49dba -//.word 0x4d820350 -//.word 0x69ce82ea -//.word 0x959e55e7 -//.word 0x827153ce -//.word 0x682c16e4 -//.word 0x4b575cfd -//.word 0x7d89ad92 -//.word 0x64213f14 -//.word 0x7d371680 -//.word 0xa1d36f34 -//.word 0x875c5f01 -//.word 0x8b53b881 -//.word 0xad412caa -//.word 0xddedb5a4 -//.word 0x76d334d8 -//.word 0x08d2584a -//.word 0x5a25c128 -//.word 0xaf9465a3 -//.word 0x49eb33fd -//.word 0x2cacf7e3 -//.word 0x24017efe -//.word 0x09f4fac5 -//.word 0x42e2a795 -//.word 0x882daf03 -//.word 0xec324c71 -//.word 0x1c7b2cdf -//.word 0xe2351904 -//.word 0xede4d99d -//.word 0xd4555306 -//.word 0x58d4f407 -//.word 0xeaa051f0 -//.word 0x6d9c0ee8 -//.word 0x3c47fe82 -//.word 0x6fee8b91 -//.word 0x5a21593e -//.word 0x57632657 -//.word 0xc625f5ea -//.word 0x51f66b13 -//.word 0x75f47912 -//.word 0x3d863ba0 -//.word 0x514d2084 -//.word 0x30574c61 -//.word 0xba963ad2 -//.word 0xf191a6b8 -//.word 0x005aaad3 -//.word 0x7dc02790 -//.word 0xebc56622 -//.word 0x8353ffd4 -//.word 0x342afa9e -//.word 0xe81d35f6 -//.word 0x097e05e8 -//.word 0x43d72069 -//.word 0x8cdabbe9 -//.word 0x629bef27 -//.word 0x54fd6149 -//.word 0xc46a222c -//.word 0xebc8d4f9 -//.word 0x1ea80ff9 -//.word 0x4fc003aa -//.word 0xd69b5e12 -//.word 0x728f7053 -//.word 0x8af08c80 -//.word 0xb983b2af -//.word 0x8a356c4f -//.word 0x800df6bc -//.word 0x5a60a111 -//.word 0x9444793e -//.word 0x3146265a -//.word 0xb860103a -//.word 0x7d25c742 -//.word 0x213fa17b -//.word 0x5c1ba5e6 -//.word 0xfae3a710 -//.word 0x24adb5e7 -//.word 0xe1f2b2cc -//.word 0xdd4141e9 -//.word 0x6834e5c5 -//.word 0xc1a46615 -//.word 0x951976d6 -//.word 0xc3849498 -//.word 0x6231311d -//.word 0x05f71122 -//.word 0x3db2f57d -//.word 0x60f37768 -//.word 0x89f5351d -//.word 0xe0d331a3 -//.word 0x1cf978e7 -//.word 0x46d8020e -//.word 0xbfdfda0a -//.word 0x84a67e6b -//.word 0xb16c8978 -//.word 0x44c38f7f -//.word 0x248a4969 -//.word 0x621cf291 -//.word 0xbec7f0d7 -//.word 0x6d80b7f0 -//.word 0x19d4eb00 -//.word 0x2a22c46a -//.word 0x4408b7e6 -//.word 0x101b53d5 -//.word 0x40db69d2 -//.word 0xcde66f8a -//.word 0x836b26cd -//.word 0xc0e27be5 -//.word 0x79faab26 -//.word 0x7dd3abc6 -//.word 0xfe6ec7ef -//.word 0x4d628913 -//.word 0xe5d0dc80 -//.word 0xab987134 -//.word 0x74cd62f2 -//.word 0xc8671695 -//.word 0xe63864a5 -//.word 0x0722fb28 -//.word 0xe78601ba -//.word 0x82fffae0 -//.word 0x1b51ec9a -//.word 0x839cc037 -//.word 0x98d6ec6d -//.word 0x0c774fa9 -//.word 0x68765ca4 -//.word 0x50757b37 -//.word 0x0839ac70 -//.word 0x375c6ee5 -//.word 0xeb46df48 -//.word 0xde59243c -//.word 0xf86c0b67 -//.word 0x147befc9 -//.word 0x079cdd4c -//.word 0xde35f49c -//.word 0x686d1238 -//.word 0xf5e0adca -//.word 0x5c97feb4 -//.word 0x433765eb -//.word 0x9a780908 -//.word 0x69d9bf9c -//.word 0xcc932dc4 -//.word 0x3bcb2ffe -//.word 0x0f0b793b -//.word 0x42f37e36 -//.word 0x772c9103 -//.word 0x3a9e4aeb -//.word 0x88e32c77 -//.word 0x92fb84cb -//.word 0xbe419435 -//.word 0xef9df106 -//.word 0x06fc2aa1 -//.word 0xa9fdaad1 -//.word 0x43ede060 -//.word 0x4bf69de5 -//.word 0xca93bddd -//.word 0x174709fd -//.word 0xe58f5cc7 -//.word 0x8015055c -//.word 0x54266d91 -//.word 0xaf66fa44 -//.word 0xc8c332f1 -//.word 0xffa72480 -//.word 0x66720361 -//.word 0x812715db -//.word 0x4a65cba1 -//.word 0x789a32a7 -//.word 0x01738a33 -//.word 0xde973337 -//.word 0x0e94d1de -//.word 0xdd19a865 -//.word 0x6667482c -//.word 0x57026f0d -//.word 0xf4ac2bec -//.word 0x5f933f8f -//.word 0x16cac8b0 -//.word 0xbdf62051 -//.word 0x1e4a0350 -//.word 0x6eb5f03b -//.word 0xd159d265 -//.word 0x2140e03a -//.word 0xeb4ac2cf -//.word 0xbb6af5be -//.word 0x9a127030 -//.word 0xd4ec883b -//.word 0xffcb116f -//.word 0x38e1c6ab -//.word 0xb032eb35 -//.word 0x6848300a -//.word 0x3829d973 -//.word 0x16861cd9 -//.word 0x9535cada -//.word 0xace2329d -//.word 0xb9014362 -//.word 0xc506f05d -//.word 0x0ad9d9c4 -//.word 0xb2842727 -//.word 0xe22fb700 -//.word 0xf74f7c8b -//.word 0x101a1ed7 -//.word 0xcc3ee71d -//.word 0x55d2e052 -//.word 0x9d8d37f8 -//.word 0xe736e439 -//.word 0x8a5b8c36 -//.word 0xf146a69d -//.word 0xe72ddc79 -//.word 0x11a9b44f -//.word 0xbc696f66 -//.word 0xda283266 -//.word 0x46dc6325 -//.word 0x503156bd -//.word 0x753529e2 -//.word 0x6e55ec72 -//.word 0x6d88054e -//.word 0xa3cad369 -//.word 0x05cc921e -//.word 0x50ea7fc7 -//.word 0x4a5d3c8b -//.word 0x4bb27577 -//.word 0xfd7ac4d0 -//.word 0x6044d2a8 -//.word 0x11c8c0b0 -//.word 0xcb65c54d -//.word 0x2ece18ee -//.word 0xbf00109c -//.word 0x317789d3 -//.word 0xe3a18b90 -//.word 0xa99326ab -//.word 0xcffba067 -//.word 0x5b55d348 -//.word 0x9362d024 -//.word 0xbfd6c87d -//.word 0x30512d0e -//.word 0x819114a4 -//.word 0x1de6de2f -//.word 0x01e61719 -//.word 0xc4619ed6 -//.word 0xd49806bd -//.word 0x02a93d16 -//.word 0x414e6b74 -//.word 0xaac71d45 -//.word 0xc415a3a7 -//.word 0x0369b67d -//.word 0x8edc5fc2 -//.word 0x4560141e -//.word 0x03f723b7 -//.word 0x2023544a -//.word 0x3b9dc97a -//.word 0x36492a68 -//.word 0x816aff83 -//.word 0x9c135da2 -//.word 0xd7dec550 -//.word 0x5ddf4966 -//.word 0x70dbf0e0 -//.word 0xf6b65ce9 -//.word 0x352baa38 -//.word 0xdbc09a9f -//.word 0x41f8f0e1 -//.word 0xf0ca1ac5 -//.word 0x65521268 -//.word 0x11c786d7 -//.word 0xa4ad37dd -//.word 0x8b4b9f1a -//.word 0xb760d655 -//.word 0xa112b614 -//.word 0x8b273e69 -//.word 0x0877340e -//.word 0xbea10eb4 -//.word 0x6bfe1399 -//.word 0x26d3be59 -//.word 0xe8cb6306 -//.word 0x4aa4147a -//.word 0x9028c6ec -//.word 0xe75fb0c2 -//.word 0xeb03f4a6 -//.word 0x6c3481dc -//.word 0x726d38d3 -//.word 0x7eb74efa -//.word 0x131cf1d4 -//.word 0x755f2e4f -//.word 0xb1ea1252 -//.word 0xdd080f95 -//.word 0xa154a2b5 -//.word 0xf7723388 -//.word 0x2efc3dae -//.word 0x35bfae68 -//.word 0x162891ad -//.word 0xc1f9ea7b -//.word 0x0b40e16c -//.word 0xf68a2389 -//.word 0x33548662 -//.word 0xe5c2ec5f -//.word 0xa8946951 -//.word 0xd255a84c -//.word 0xf9d58ab9 -//.word 0xb5da11a7 -//.word 0xa6137d62 -//.word 0xb94db447 -//.word 0xa8e9e7d6 -//.word 0xc08e7309 -//.word 0xe71b05e4 -//.word 0xdde0024e -//.word 0xc20d261f -//.word 0xd96a6b7a -//.word 0x8b492c5d -//.word 0xafba8a76 -//.word 0x08fd0f39 -//.word 0x0f3d912f -//.word 0xf37b5991 -//.word 0xdfc88515 -//.word 0x7bb7ab08 -//.word 0xb512bf9d -//.word 0xc1cc3785 -//.word 0x5e376cbf -//.word 0x5c7744b2 -//.word 0x5b370e79 -//.word 0xd59aad7e -//.word 0x5f74f94a -//.word 0x2bbb629b -//.word 0xd238d7b7 -//.word 0x5082e601 -//.word 0x502d24ca -//.word 0xab3fcf69 -//.word 0x2be3b28e -//.word 0x946249d3 -//.word 0xe54e2694 -//.word 0xdb019301 -//.word 0xb7467971 -//.word 0x415580fa -//.word 0x0d05783e -//.word 0xfd3df887 -//.word 0x07ab4417 -//.word 0x38b974b9 -//.word 0xf9bdd39c -//.word 0x92708661 -//.word 0xeca26e73 -//.word 0x9b2c4f97 -//.word 0x1b2531c4 -//.word 0x5a590634 -//.word 0x77f68ebb -//.word 0xca897858 -//.word 0x2429ca0a -//.word 0x58f282e4 -//.word 0xfab67d64 -//.word 0x66ee9901 -//.word 0x04f71703 -//.word 0xcb7b4397 -//.word 0x042d5623 -//.word 0x51b99bd7 -//.word 0xedfad185 -//.word 0x356ed1b2 -//.word 0x68e870ed -//.word 0xab85a75f -//.word 0x50e1f1a4 -//.word 0x578bf5d9 -//.word 0x35b665f6 -//.word 0xd531265e -//.word 0xdd99b1b5 -//.word 0x32cdb9f2 -//.word 0xbea20eb5 -//.word 0x71d8c1da -//.word 0x854d894e -//.word 0x07716521 -//.word 0x93fa83dd -//.word 0x5fd96117 -//.word 0x7a6c3243 -//.word 0x56f583cd -//.word 0x854b1e65 -//.word 0xc0cf2e9a -//.word 0x2da2a5aa -//.word 0xe215db98 -//.word 0xa5617780 -//.word 0xf5999328 -//.word 0x4fdc1bd7 -//.word 0xaacf766a -//.word 0x444a69a4 -//.word 0xa05238c6 -//.word 0xcf480e5f -//.word 0xf05f9e66 -//.word 0xf3540b86 -//.word 0xa25905b9 -//.word 0xe1523618 -//.word 0x3443dcf2 -//.word 0x8309b71b -//.word 0x1a492586 -//.word 0xf4a78c16 -//.word 0x3938f8b2 -//.word 0x05390598 -//.word 0x6b0100f3 -//.word 0xba3449af -//.word 0xfe3afb8c -//.word 0xcaefcf71 -//.word 0x359c3e04 -//.word 0x2327e677 -//.word 0xc6862fa4 -//.word 0x64792e5d -//.word 0x5a79cafd -//.word 0x61eb1d43 -//.word 0x109a1d61 -//.word 0xa2647b4f -//.word 0xfa34cb65 -//.word 0xe430e629 -//.word 0x9e338c66 -//.word 0x977d4e7e -//.word 0x76a9ab00 -//.word 0x5ee07a7d -//.word 0x704d8898 -//.word 0x92d0815d -//.word 0x6ff714d4 -//.word 0xbf2a52d5 -//.word 0xc925571d -//.word 0x26ac2da2 -//.word 0xc779ed24 -//.word 0x3a7a2705 -//.word 0x2839845a -//.word 0x239caa42 -//.word 0x9ece6077 -//.word 0x3d7df322 -//.word 0x5046d8f4 -//.word 0x9a6d9272 -//.word 0x56d2d790 -//.word 0x7c20ee82 -//.word 0x40485bcf -//.word 0xdb2ebea7 -//.word 0x8fa1f976 -//.word 0xe59191b9 -//.word 0x3a7c5711 -//.word 0x792a4795 -//.word 0x2a9ab06d -//.word 0xac3c959d -//.word 0xbe61531e -//.word 0x45ef8533 -//.word 0x495925fa -//.word 0x40cef441 -//.word 0x8fb11b9c -//.word 0x4e4a12b4 -//.word 0x4bbbc1e2 -//.word 0x5235e5fd -//.word 0xac6bb670 -//.word 0xe647c78f -//.word 0xd4dc2d2b -//.word 0xd49de363 -//.word 0x57cc6dbe -//.word 0x9e35bc77 -//.word 0xc21b5218 -//.word 0xf773a64a -//.word 0x1150caec -//.word 0x489f4b62 -//.word 0x38145930 -//.word 0x2c6427c7 -//.word 0x9bb5959e -//.word 0xf3520d85 -//.word 0x96a4aa37 -//.word 0x225ea02e -//.word 0xf6f7d8bb -//.word 0xf25dda55 -//.word 0x7de8f032 -//.word 0xcd8c8814 -//.word 0x6354db66 -//.word 0xd40bcc87 -//.word 0xcf3c1366 -//.word 0x5c5e9a4f -//.word 0x62482704 -//.word 0x6ceb3c10 -//.word 0xac3f3c58 -//.word 0x417ecef3 -//.word 0xb591863b -//.word 0xcac7c324 -//.word 0x76cdd3cd -//.word 0x2cdb5e55 -//.word 0x5d2b01f0 -//.word 0x3faf393a -//.word 0xcd0383cb -//.word 0x0fa1c10b -//.word 0x9b54e047 -//.word 0x5cefb805 -//.word 0x923e3395 -//.word 0x1a3db2e9 -//.word 0xf088aca7 -//.word 0xf213987b -//.word 0xe61b0eb2 -//.word 0xbf5c2905 -//.word 0x1c852fb2 -//.word 0x12e974d2 -//.word 0x2b777be6 -//.word 0xaeec5fb3 -//.word 0x21477150 -//.word 0x0d7d237d -//.word 0x016f2536 -//.word 0xd919cd88 -//.word 0x400cbca4 -//.word 0x741ebf32 -//.word 0x4a60f3e7 -//.word 0x71502d5a -//.word 0xfa509813 -//.word 0x1857a0e5 -//.word 0x25e70f7f -//.word 0xe63f763d -//.word 0x10d1cf44 -//.word 0x0bf660cd -//.word 0xf5e1e3c1 -//.word 0xead1e387 -//.word 0x838b6919 -//.word 0x9c08d85e -//.word 0x5b6b16b4 -//.word 0x6e36eccb -//.word 0x93bcb0ba -//.word 0x5eda214c -//.word 0x37e2929b -//.word 0xa2d84be1 -//.word 0xc3e12c8a -//.word 0x21f8938e -//.word 0xaae380fd -//.word 0xf765f7dc -//.word 0xd2b6a62f -//.word 0xf530c857 -//.word 0x154b499e -//.word 0x1fcb2b11 -//.word 0xc238288e -//.word 0x2d8f991d -//.word 0x1a379683 -//.word 0x0b365f15 -//.word 0xd3a5facb -//.word 0x59611e95 -//.word 0x990450f2 -//.word 0xeb144cbe -//.word 0x887aa64b -//.word 0x4a35b1b4 -//.word 0xb34fa06e -//.word 0x3110eb20 -//.word 0xa073f5b5 -//.word 0x11d6ebaf -//.word 0xcaf5efbe -//.word 0x8e197691 -//.word 0x1e8deeec -//.word 0xff52a5fb -//.word 0x7e13e6e6 -//.word 0xf25b65a5 -//.word 0x4106dc16 -//.word 0xa5f6f74c -//.word 0xb0076e2a -//.word 0x8e447031 -//.word 0x8b5b4897 -//.word 0xd44e3b99 -//.word 0x826caf12 -//.word 0xd480934b -//.word 0xbc48fa15 -//.word 0x9e280915 -//.word 0x54201460 -//.word 0x75fc0448 -//.word 0xd7cafc75 -//.word 0x52913c37 -//.word 0xc740451a -//.word 0x61e53dbb -//.word 0x1b1f96db -//.word 0x83d6ebb2 -//.word 0xbd292a85 -//.word 0xcaa8f87b -//.word 0x0bc451ad -//.word 0x00836f7c -//.word 0x5679ee27 -//.word 0x21f32d9d -//.word 0x6675f78f -//.word 0xdc6763ca -//.word 0xf30bf8c4 -//.word 0x16b21574 -//.word 0x2d309067 -//.word 0x678d9e11 -//.word 0x36fdf361 -//.word 0x9b122a98 -//.word 0xa331665a -//.word 0x32433a05 -//.word 0xffacc643 -//.word 0xe08123db -//.word 0x48f502cd -//.word 0x0d158f9d -//.word 0x6fb69cef -//.word 0x57abfb54 -//.word 0xdc3b2b64 -//.word 0x0bd2380d -//.word 0xe8f6dc2a -//.word 0xb07dea57 -//.word 0x61fdec04 -//.word 0x7c850bc9 -//.word 0x0a8a30f9 -//.word 0xdd24697a -//.word 0x187b8ed4 -//.word 0xf27b2487 -//.word 0xb6d081a2 -//.word 0x0e0e3191 -//.word 0x822f9937 -//.word 0x3c43da3d -//.word 0x0e63f9a9 -//.word 0xb6e73cb2 -//.word 0x60d9d7d2 -//.word 0x6ca9c71e -//.word 0x7221ffd3 -//.word 0x839cc231 -//.word 0xb273508c -//.word 0xd3b9c4a0 -//.word 0x83283d25 -//.word 0x695a3ca3 -//.word 0xbb3d4d88 -//.word 0x03c1ea78 -//.word 0x23d39ce4 -//.word 0x968f63de -//.word 0xfab1582b -//.word 0xcb4d919a -//.word 0x72c14595 -//.word 0x7ee730f6 -//.word 0x318f391c -//.word 0x3e2c533d -//.word 0xd1cda1fd -//.word 0xd04fdd40 -//.word 0x60d1fa3d -//.word 0xac6908d5 -//.word 0xe2155922 -//.word 0x7df5e252 -//.word 0xcab7e3b6 -//.word 0xa552cb16 -//.word 0x84f75648 -//.word 0xb844f800 -//.word 0xefbc7eea -//.word 0xfc74f3f6 -//.word 0xdb0ec0f4 -//.word 0xefeb1860 -//.word 0x8f9d937f -//.word 0xc19b19ab -//.word 0x453902ea -//.word 0xd6d77bc6 -//.word 0xac582c59 -//.word 0x45d618a8 -//.word 0x6593c432 -//.word 0x5c339bc8 -//.word 0x8729919e -//.word 0x197007a3 -//.word 0x1b7bee0e -//.word 0xb26e3039 -//.word 0xa18e4bb3 -//.word 0x0ef63f91 -//.word 0x898dab04 -//.word 0x4a343331 -//.word 0xba44243c -//.word 0x36375ba6 -//.word 0x0fa563da -//.word 0xd573dd02 -//.word 0xd547251f -//.word 0xe03e3259 -//.word 0x4ee2be93 -//.word 0x4356a743 -//.word 0x31d49681 -//.word 0x9e5ade5e -//.word 0x289fa776 -//.word 0xc64c4bc9 -//.word 0x506900c6 -//.word 0x4215b8a9 -//.word 0xbd7b4507 -//.word 0xce01c1a7 -//.word 0xf3c22d94 -//.word 0xdb3f5870 -//.word 0x6e51020b -//.word 0x0d634235 -//.word 0x1bdd25d0 -//.word 0xbce39829 -//.word 0xdc408888 -//.word 0x749d4705 -//.word 0x08f7329e -//.word 0x75509187 -//.word 0xe9a4bec1 -//.word 0x331e8aee -//.word 0x3d8cdc64 -//.word 0xd6119b80 -//.word 0xb519ce3c -//.word 0xbb920204 -//.word 0x795aecc6 -//.word 0xf2f35049 -//.word 0xa27e22bf -//.word 0xbfe7ea9d -//.word 0xbe5d6daa -//.word 0x19058956 -//.word 0x50ef614e -//.word 0x2e49ba4d -//.word 0x4dd2a535 -//.word 0xdc925f5e -//.word 0xa0c9752e -//.word 0x39252bea -//.word 0xa7371fcb -//.word 0x0c282a55 -//.word 0xb3a887e4 -//.word 0x52283788 -//.word 0x8c49a312 -//.word 0xba94846f -//.word 0xeb6b0035 -//.word 0x293f157c -//.word 0xff043bef -//.word 0x38e24523 -//.word 0xe82e8927 -//.word 0xb198405c -//.word 0x3fa63086 -//.word 0x15618824 -//.word 0x8c4e0bfd -//.word 0x189f70fc -//.word 0xceab093d -//.word 0x239ca468 -//.word 0xf767af3e -//.word 0xd2029f71 -//.word 0x6dd192b9 -//.word 0x74613224 -//.word 0x8a58ddae -//.word 0x8eac0411 -//.word 0x1c14d1de -//.word 0x57bc0dcd -//.word 0xe63d4051 -//.word 0x3dcc1a70 -//.word 0x1eb111d2 -//.word 0x5ffc4c18 -//.word 0xed73c06f -//.word 0x11ce9964 -//.word 0xf227dbfa -//.word 0x5cac49f9 -//.word 0xbf97868a -//.word 0x7b607a01 -//.word 0x5a30f7fa -//.word 0x5e9a9ca7 -//.word 0xbe86fa68 -//.word 0x2b6df69c -//.word 0x57cc6eb8 -//.word 0xb8d22096 -//.word 0x8a5cc70f -//.word 0x132486cb -//.word 0x2a358a58 -//.word 0xfaa3ec7a -//.word 0x0478d4c2 -//.word 0x63f1e462 -//.word 0x54ebd440 -//.word 0xf5985949 -//.word 0x4d764c08 -//.word 0x8d820877 -//.word 0x95a91415 -//.word 0xba7f0238 -//.word 0xc73396a5 -//.word 0x41c32b5e -//.word 0xf06c53bb -//.word 0x9a65bebc -//.word 0x12cc5d9e -//.word 0x72e1c6ac -//.word 0xa472db58 -//.word 0x2796a68a -//.word 0x0f9e8838 -//.word 0x4e499337 -//.word 0x33373451 -//.word 0x30a01597 -//.word 0xe04641f8 -//.word 0x48a88a13 -//.word 0x5e79284a -//.word 0xc750a218 -//.word 0xe5a1f2a4 -//.word 0x11ece496 -//.word 0x2534bf29 -//.word 0x3eb32781 -//.word 0xc0cc4240 -//.word 0x9a411a54 -//.word 0xcba64212 -//.word 0x2516bd89 -//.word 0x50241b10 -//.word 0x1314e522 -//.word 0xcf4c3b6c -//.word 0x4c05bc23 -//.word 0xb846a69b -//.word 0xed133e16 -//.word 0xf3e273da -//.word 0xc64ebe86 -//.word 0x590f4ca5 -//.word 0xda2a5f84 -//.word 0x3865f241 -//.word 0xe3fe9c25 -//.word 0xd39cb633 -//.word 0xcb86c001 -//.word 0xdf1301c7 -//.word 0x34626eb6 -//.word 0x074acd8b -//.word 0xf0941a63 -//.word 0x68682ad1 -//.word 0x8a068e2e -//.word 0x16b7ba30 -//.word 0xbb0267be -//.word 0x96223503 -//.word 0xf6b895c2 -//.word 0x62bee6e9 -//.word 0xddbcde68 -//.word 0x683e2c43 -//.word 0xc9855be6 -//.word 0x8b7dfaba -//.word 0x46effaf5 -//.word 0x20f857b6 -//.word 0x94bafb51 -//.word 0x7251dfe7 -//.word 0x2708733b -//.word 0x3fcd40c0 -//.word 0x28e3cbf7 -//.word 0x39d7bdf7 -//.word 0xf2b5424d -//.word 0x867baf07 -//.word 0x96ce670c -//.word 0x40ecffaf -//.word 0x58e2a083 -//.word 0xf5ffad70 -//.word 0x3088a606 -//.word 0x28ad4d12 -//.word 0x4abc076f -//.word 0xcf95841f -//.word 0x855ea29a -//.word 0xd3788f66 -//.word 0xf7b12ee8 -//.word 0x93bbbd7a -//.word 0x68ddb4be -//.word 0x61e8f031 -//.word 0xd36d1003 -//.word 0x032d2026 -//.word 0xe9d175a5 -//.word 0x33dbd737 -//.word 0x8ddde614 -//.word 0x20e8b607 -//.word 0x5848bdc4 -//.word 0xeb6eef7d -//.word 0x172e27b0 -//.word 0x2b2bc943 -//.word 0x488fa5d2 -//.word 0x69ff1f48 -//.word 0xa1ce8dac -//.word 0xa470e13e -//.word 0x893288c3 -//.word 0xce29921d -//.word 0x9d68121e -//.word 0x4d76c89e -//.word 0x2c00fdcb -//.word 0x7ccaafc1 -//.word 0xbbebee5b -//.word 0x283a8648 -//.word 0x8204de61 -//.word 0x13002039 -//.word 0xed849af6 -//.word 0x74f86560 -//.word 0x1c8c4438 -//.word 0x7426cecb -//.word 0x649ed0c7 -//.word 0xb22eed4c -//.word 0xcb248746 -//.word 0xc1dae3fb -//.word 0x90e887e0 -//.word 0xa598e7b1 -//.word 0xa19b41c0 -//.word 0x5afac68e -//.word 0x224ffa98 -//.word 0x4d345d73 -//.word 0xedfc4b1b -//.word 0xe0a12189 -//.word 0x0dfea183 -//.word 0xea3e98b8 -//.word 0x4295bd0c -//.word 0x352edd31 -//.word 0x80643577 -//.word 0xfe3420e5 -//.word 0x6ff2f288 -//.word 0x793c230b -//.word 0xec2db088 -//.word 0x4ad2be9e -//.word 0x87e280c4 -//.word 0x0da95cdc -//.word 0x0346490c -//.word 0xcf167cc9 -//.word 0xd9704334 -//.word 0x929331aa -//.word 0xb6dc7b96 -//.word 0xce3da28a -//.word 0xf8ea528f -//.word 0xea558bb9 -//.word 0x355dfefe -//.word 0xc7c2ba47 -//.word 0xb4dd07c8 -//.word 0x368e928d -//.word 0xf275cb56 -//.word 0x7c658ca5 -//.word 0x1e15fb15 -//.word 0xd519b1ed -//.word 0x9d111cf5 -//.word 0xee212189 -//.word 0x87a106eb -//.word 0x6a1590de -//.word 0x285f6870 -//.word 0x5e33c317 -//.word 0x80cc42ff -//.word 0xd5dd17a3 -//.word 0xc3cb6a9b -//.word 0x4d19fbb4 -//.word 0xda240846 -//.word 0x381071c2 -//.word 0xe0021a8b -//.word 0x7c8f9107 -//.word 0xa675f1f5 -//.word 0xf3890601 -//.word 0x30f1b195 -//.word 0xeb938ef3 -//.word 0x36cdd581 -//.word 0xa7677e63 -//.word 0xa3c6a94f -//.word 0xdc623c9d -//.word 0x197ace9e -//.word 0x3606c42f -//.word 0x6bedb98e -//.word 0xd178246c -//.word 0x21063443 -//.word 0xbf02ffe9 -//.word 0xf813dc66 -//.word 0x88920d03 -//.word 0x6041a2a3 -//.word 0xa63a9956 -//.word 0xfc254a2c -//.word 0x05ae0347 -//.word 0x2537ef34 -//.word 0x89c93c7c -//.word 0x68517c75 -//.word 0x88094c5e -//.word 0x033434ab -//.word 0x4b0ecf9e -//.word 0x6c032c17 -//.word 0x911f73ad -//.word 0xcac6ccfd -//.word 0x0ca57c42 -//.word 0x7ae85127 -//.word 0xe2ad41d9 -//.word 0x8bb94e5f -//.word 0x2e6aad2e -//.word 0x42ed26f8 -//.word 0x7cb1bec6 -//.word 0x971c9446 -//.word 0x517c0966 -//.word 0xb6402321 -//.word 0xa0683499 -//.word 0x7f3ab667 -//.word 0x56377a2f -//.word 0x064d0277 -//.word 0xcf4e2bb9 -//.word 0x14a10eb6 -//.word 0x5e38290e -//.word 0xa4c1ba0e -//.word 0xca216cc9 -//.word 0x671e356a -//.word 0xcb5b7fc8 -//.word 0x418a863b -//.word 0x91dd01af -//.word 0xc9bd04f6 -//.word 0x3dbf2563 -//.word 0xcdd4de94 -//.word 0x66c0328f -//.word 0xcccd9311 -//.word 0x96c00422 -//.word 0x7a0c7bed -//.word 0xca4689cf -//.word 0x3fd93cae -//.word 0xf6fb458c -//.word 0xb8df565b -//.word 0x7e2cce13 -//.word 0x34af9803 -//.word 0xbe4c5064 -//.word 0x393ba834 -//.word 0x83710b42 -//.word 0xfd5b8085 -//.word 0x8fd2d0b1 -//.word 0xed4ceb0c -//.word 0x194f887e -//.word 0x2a2c0ce8 -//.word 0x4be9adb7 -//.word 0x067fd7b9 -//.word 0xc346ce2f -//.word 0x8bad9623 -//.word 0x122e10fc -//.word 0xf581654f -//.word 0x4010a7f8 -//.word 0x33acb66a -//.word 0x467e6143 -//.word 0x6a40ce24 -//.word 0x92ad1cbf -//.word 0x72354631 -//.word 0x86f64b93 -//.word 0x57e88ccb -//.word 0xfa5775a8 -//.word 0xd9975f2f -//.word 0xb6f3b52f -//.word 0xece6561c -//.word 0xf88e3b19 -//.word 0x395d5a57 -//.word 0xf412ca9e -//.word 0x9be72729 -//.word 0x4f0c38b7 -//.word 0xa355cfdf -//.word 0xa330f1a4 -//.word 0x15d93749 -//.word 0xfed17467 -//.word 0x688c983c -//.word 0x6369d546 -//.word 0x4ae80010 -//.word 0x4718394d -//.word 0x194ece23 -//.word 0x151c5dc9 -//.word 0x6b813954 -//.word 0xab5e0fce -//.word 0x8829ca89 -//.word 0xdbe5b3b2 -//.word 0xeb52dd29 -//.word 0xeb61c090 -//.word 0xc4ea24a3 -//.word 0x15a141c7 -//.word 0x784724e5 -//.word 0x081d5478 -//.word 0x209eb6e5 -//.word 0x656dae0c -//.word 0x068d871c -//.word 0x42d015ab -//.word 0x2b929806 -//.word 0xaaa6e4c5 -//.word 0xc491bfa3 -//.word 0x1bf68b8d -//.word 0xb85225f9 -//.word 0x07ea0c79 -//.word 0x2301c690 -//.word 0x544d7fc4 -//.word 0xd7acf4f4 -//.word 0xdd148fec -//.word 0xd5c8d337 -//.word 0xeed2fb34 -//.word 0xd8adde6d -//.word 0xcb421623 -//.word 0xcb16612e -//.word 0x2ac14704 -//.word 0x4ea2fe17 -//.word 0xb5d18a64 -//.word 0x35552848 -//.word 0x8997ed96 -//.word 0x0917abe8 -//.word 0xb95e1432 -//.word 0x8534229d -//.word 0xcb12b692 -//.word 0x1ada7f14 -//.word 0x3ac61d54 -//.word 0x6c9e867f -//.word 0xf22fa9db -//.word 0xd2f85212 -//.word 0xd8264ece -//.word 0xdac3cf85 -//.word 0x3f2a1297 -//.word 0xc2be3e96 -//.word 0x74db90e4 -//.word 0x000db584 -//.word 0x3380772a -//.word 0xbcb89c94 -//.word 0x30820b1d -//.word 0x512b3190 -//.word 0x8fefa33a -//.word 0xcfb40543 -//.word 0x6cf92a3e -//.word 0x7b097cfe -//.word 0x54749fab -//.word 0x4ebf5116 -//.word 0xc95b954a -//.word 0x72d41064 -//.word 0xc24bb3a4 -//.word 0xc8269ac3 -//.word 0x29063487 -//.word 0x65f9a596 -//.word 0x5bf26888 -//.word 0x1076393f -//.word 0xac97327b -//.word 0xc52634a9 -//.word 0xe02588fc -//.word 0x357bc6bf -//.word 0xb3ebf6ea -//.word 0x4447f6f3 -//.word 0x52e11ce6 -//.word 0x8a431bb8 -//.word 0xe0202bd9 -//.word 0xd38a6408 -//.word 0xf2646b6b -//.word 0x9f1b51df -//.word 0x1391b88d -//.word 0xa25a38be -//.word 0x402b01f0 -//.word 0x458fc128 -//.word 0x6ddcc88b -//.word 0x23666a28 -//.word 0xfff2a419 -//.word 0x8d6e03ca -//.word 0x50dfc298 -//.word 0x069a329e -//.word 0x2eb75fcb -//.word 0xc8c3f138 -//.word 0x5cb550b9 -//.word 0x3d230cb3 -//.word 0x0fb67b2d -//.word 0x87dca429 -//.word 0x72bc5b34 -//.word 0xf96fae3c -//.word 0x236d80a2 -//.word 0x9b457490 -//.word 0xb4920d8d -//.word 0xaa2a134e -//.word 0x2b9838cf -//.word 0x15cdfba3 -//.word 0x8212cd89 -//.word 0x0241723f -//.word 0x2735ab9b -//.word 0x477f12d7 -//.word 0x7d5a452d -//.word 0xf1e246a3 -//.word 0x59802229 -//.word 0xc0a9d1e1 -//.word 0x86c85ebe -//.word 0xa9784850 -//.word 0x42f727de -//.word 0x53d792b6 -//.word 0xbff741c1 -//.word 0x9ab26f5a -//.word 0xa3568260 -//.word 0x0fd8ee8a -//.word 0x89c657fb -//.word 0x767cf617 -//.word 0x7d9b3d94 -//.word 0x47b7bed4 -//.word 0x83504972 -//.word 0x2e04541b -//.word 0x1102a09f -//.word 0x8bc21a47 -//.word 0x90f4006a -//.word 0xf2b6443b -//.word 0xdf0935e5 -//.word 0xac865cda -//.word 0xd04da467 -//.word 0x343fbf8d -//.word 0xaa6dc40c -//.word 0xbacf1dc0 -//.word 0xa53aa030 -//.word 0xa48cfc65 -//.word 0x712a57f8 -//.word 0x08ac356f -//.word 0xafd69cca -//.word 0x34ca7658 -//.word 0x767d36cf -//.word 0x2668be9c -//.word 0xcf808078 -//.word 0x1467e43c -//.word 0x3ae4eaf6 -//.word 0xe691113c -//.word 0x27d377c0 -//.word 0xb60f4125 -//.word 0x7d1b3d11 -//.word 0x57f3c684 -//.word 0x17aee968 -//.word 0xcbb0c669 -//.word 0x42203806 -//.word 0xcb9db8e8 -//.word 0x402c7e73 -//.word 0x4375ea9c -//.word 0xc83023fa -//.word 0xd4dafe1f -//.word 0x83ac2128 -//.word 0x50cd6893 -//.word 0x91c78751 -//.word 0x4138f11c -//.word 0x02caf90b -//.word 0x62643764 -//.word 0x5ea22eb1 -//.word 0x25832b16 -//.word 0x1e6270e1 -//.word 0x2b289263 -//.word 0x30bf20ff -//.word 0xcfca8580 -//.word 0x769330af -//.word 0x9c44f226 -//.word 0x475ba75f -//.word 0xd2581810 -//.word 0xedb820bb -//.word 0xe5270e80 -//.word 0x26f24b37 -//.word 0xfebb3dbb -//.word 0xa3706a88 -//.word 0x787ee189 -//.word 0x8c41d62b -//.word 0x63bf8cb6 -//.word 0xfa9778dd -//.word 0x0534a394 -//.word 0x7b465021 -//.word 0x5473df76 -//.word 0x9249f1be -//.word 0x7e78cd36 -//.word 0x343e023e -//.word 0x61224eb0 -//.word 0x4ce5bf70 -//.word 0x13b61844 -//.word 0x37a576e6 -//.word 0x5b5a3358 -//.word 0x49070b78 -//.word 0x369b7dd4 -//.word 0x473974bf -//.word 0x54e827a5 -//.word 0xeb8c3e9b -//.word 0x9815363a -//.word 0x63f606ae -//.word 0x9bd8030a -//.word 0xd29001de -//.word 0x294fbb0c -//.word 0xce1975d7 -//.word 0xc279df3d -//.word 0xe0723d87 -//.word 0x1bb8c51e -//.word 0x072148a0 -//.word 0x9b561533 -//.word 0x35ce1b1a -//.word 0xdefd4d86 -//.word 0xcfc84bae -//.word 0x353d3e21 -//.word 0x3281035b -//.word 0x24098d97 -//.word 0x290d84e5 -//.word 0xe33a327c -//.word 0x78a8a051 -//.word 0xdd0bfce9 -//.word 0x552d3e6b -//.word 0x349c0cf9 -//.word 0xe99fda40 -//.word 0x3b6f554e -//.word 0xd3a402a4 -//.word 0xfbee228d -//.word 0xa505daae -//.word 0xafe390dd -//.word 0x65309837 -//.word 0x48fe106c -//.word 0x0eb6085e -//.word 0xe952e7eb -//.word 0x0ccd0906 -//.word 0x6cd8ad0d -//.word 0xc3cf0f56 -//.word 0xdbebd10c -//.word 0x09b99f39 -//.word 0xf7cb1323 -//.word 0xa7add6dc -//.word 0xb51a0915 -//.word 0xdd70e333 -//.word 0xbc629ba5 -//.word 0xdbed8874 -//.word 0xe98d871b -//.word 0x48b09d9a -//.word 0xcc6bddc6 -//.word 0xbf6c8ce3 -//.word 0x28308474 -//.word 0x4c76d652 -//.word 0x76f3b3fc -//.word 0xf4478d2e -//.word 0x623079b5 -//.word 0x2bfdd881 -//.word 0x4c4636fc -//.word 0x5bdb729a -//.word 0xc8fa1fb1 -//.word 0x64c52b8c -//.word 0x1ff2bebb -//.word 0x16c565ac -//.word 0xcd3b7080 -//.word 0xb8899917 -//.word 0x01c4e66d -//.word 0x85e2d02a -//.word 0x20e1a474 -//.word 0x2a462a08 -//.word 0x41c98589 -//.word 0x494f5a17 -//.word 0xb2183424 -//.word 0xf93a2783 -//.word 0x724eb4c2 -//.word 0x4469edba -//.word 0xb54ed964 -//.word 0xa8e11aef -//.word 0x63dfcd0f -//.word 0x96cdb297 -//.word 0x992e8d4a -//.word 0xf6f9ccee -//.word 0x274a69a3 -//.word 0xa1581273 -//.word 0x11a7882a -//.word 0xe57f4568 -//.word 0x0e9c61f4 -//.word 0x0427b653 -//.word 0x0be5439a -//.word 0xb6afce80 -//.word 0xa922cdb7 -//.word 0xa297877d -//.word 0xbb55776e -//.word 0xe906f19c -//.word 0xc96808e1 -//.word 0x9c45ae74 -//.word 0x8fa51dbb -//.word 0x41427660 -//.word 0x7f3ca8a7 -//.word 0x520e94ff -//.word 0x3bc16fd7 -//.word 0xbd6067b2 -//.word 0x1cab897e -//.word 0x650fe221 -//.word 0xaed6e456 -//.word 0x9f9c0cb7 -//.word 0x3102c21a -//.word 0xb6a68121 -//.word 0x1a52370d -//.word 0x6873efd3 -//.word 0x8fcdad72 -//.word 0x676e9983 -//.word 0xefe06012 -//.word 0xd9a3d8ac -//.word 0x48dae3b9 -//.word 0xd845950d -//.word 0xdf6f99b9 -//.word 0xf229d027 -//.word 0xab363c66 -//.word 0xaa481dc2 -//.word 0xda2c5998 -//.word 0xf5412168 -//.word 0x4b2ed22c -//.word 0xbfd419e8 -//.word 0x12825b83 -//.word 0x646854d5 -//.word 0xf74ffe01 -//.word 0x3787b405 -//.word 0xf720978f -//.word 0xfe5d3113 -//.word 0xc265581a -//.word 0x733c55dd -//.word 0x3bf24612 -//.word 0xc51ac106 -//.word 0xfc7ebaec -//.word 0x1511a774 -//.word 0xcf25e1a0 -//.word 0xf9de4ed4 -//.word 0x35e73d2c -//.word 0xfd639111 -//.word 0xe327220f -//.word 0x1d2660e1 -//.word 0x402c3ace -//.word 0x4cd03e39 -//.word 0xe9a40173 -//.word 0xf0aec1d3 -//.word 0x2d1c4909 -//.word 0x643315af -//.word 0x9189b721 -//.word 0x7474798f -//.word 0x4dc24450 -//.word 0xe5aac079 -//.word 0xcd03bdaf -//.word 0xeab4d239 -//.word 0x326c4359 -//.word 0xb09328dd -//.word 0xce80ccf1 -//.word 0xd3ec5437 -//.word 0xaba6a11a -//.word 0xe789775f -//.word 0x04acdefc -//.word 0xf0d8c82e -//.word 0xca3ff5c6 -//.word 0xe96a14c3 -//.word 0x21742b26 -//.word 0x41763802 -//.word 0xe04219d3 -//.word 0x5a54a910 -//.word 0x15052c04 -//.word 0x0902edd9 -//.word 0x7ffd25f6 -//.word 0x18a21f8b -//.word 0x12cd9a69 -//.word 0xc7fa6f18 -//.word 0x76fd7323 -//.word 0x46f39fb7 -//.word 0x88786e6c -//.word 0x3d1a8763 -//.word 0xd80e9c91 -//.word 0x4522925a -//.word 0x29f3e262 -//.word 0x6c603fa0 -//.word 0xf53e79b4 -//.word 0xb44da17a -//.word 0xe66b6edf -//.word 0x9408dff3 -//.word 0x5dda2240 -//.word 0x76d2b55b -//.word 0xef4ecbb8 -//.word 0x3890f1c2 -//.word 0xe36ff12b -//.word 0xab4cf681 -//.word 0xb648f203 -//.word 0x17b43db2 -//.word 0x97ca7fab -//.word 0xb59acfb3 -//.word 0xeb461c14 -//.word 0x3372cca8 -//.word 0xcaf7a433 -//.word 0x34d7e8f5 -//.word 0x8076c380 -//.word 0xcd07e8c8 -//.word 0x0d447a79 -//.word 0x09622a8d -//.word 0xa6449f1d -//.word 0x66ef1a77 -//.word 0x313e5a72 -//.word 0x56d6bdfe -//.word 0xcd5da9ff -//.word 0xbfe72a5c -//.word 0x47b1dc52 -//.word 0x7b120c0f -//.word 0xa6ae1a7c -//.word 0xd8ed215a -//.word 0xa1acda90 -//.word 0x1932bec3 -//.word 0x23656b28 -//.word 0xf33d4996 -//.word 0xce7a6de0 -//.word 0x1192be61 -//.word 0x75ee56d8 -//.word 0x91552b77 -//.word 0xa1a9ee36 -//.word 0x85d1336d -//.word 0x0df6d3a2 -//.word 0x73f28e9f -//.word 0x2905f5c8 -//.word 0xd5ca88ac -//.word 0x9b6a1bda -//.word 0x9a107ef6 -//.word 0xb99d5c0c -//.word 0xa39c6423 -//.word 0x1078a716 -//.word 0x47ec419f -//.word 0xe0bc3cb5 -//.word 0xcfa3b118 -//.word 0x9e8c302a -//.word 0xfa056200 -//.word 0x71f0edb9 -//.word 0x7a7b980e -//.word 0xb653b02b -//.word 0x7515aabd -//.word 0x7c06094d -//.word 0x060383cc -//.word 0x08bb5f6f -//.word 0xb91b21bd -//.word 0x520a69e6 -//.word 0x12571956 -//.word 0x86efb68a -//.word 0x07541122 -//.word 0x844a2638 -//.word 0x82d444f1 -//.word 0x605e6e51 -//.word 0xe03c0254 -//.word 0xe353983a -//.word 0x74162d22 -//.word 0x08b581da -//.word 0x0490bdf6 -//.word 0x80f2591f -//.word 0x4bfc3dae -//.word 0x2fdf267a -//.word 0x764f4ced -//.word 0xac34425e -//.word 0xa7a21d9a -//.word 0x80000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00017740 -//// expected output -//.word 0xaa3a8e59 -//.word 0x0bd53d04 -//.word 0xfc0b0640 -//.word 0x06660148 -//.word 0xbde3ac9c -//.word 0x9e44b82d -//.word 0xb2616538 -//.word 0xcfd8e175 -//.word 0xd0855aa9 -//.word 0xfa4bd60a -//.word 0xce4a01d0 -//.word 0x4c8c2bae -//.word 0xa401e61e -//.word 0xaafd966a -//.word 0x27d11e03 -//.word 0x7bc56f57 -//// SHA512LongMsgvector_121 -//// vector length -//.word 0x00017A58 -//// input message -//.word 0x7021f18b -//.word 0x8f398a59 -//.word 0x99fcdcd1 -//.word 0x28aeea78 -//.word 0xfa2308e6 -//.word 0x97d59b7a -//.word 0x3433214c -//.word 0xd83b7163 -//.word 0xbd4a4329 -//.word 0xf933f21b -//.word 0x5d8f81c5 -//.word 0x9e55ddee -//.word 0xb2ab6110 -//.word 0x7dfb9f0b -//.word 0xad485e19 -//.word 0xe3c3df05 -//.word 0x13996598 -//.word 0x2d10f355 -//.word 0xfdd25866 -//.word 0x508869d5 -//.word 0x58ab8eff -//.word 0x51978046 -//.word 0x65e25007 -//.word 0xcdebaccc -//.word 0x3ab65ec2 -//.word 0x73f7156d -//.word 0x3f6c689a -//.word 0x85701895 -//.word 0xb2ce959d -//.word 0x5bd3c495 -//.word 0x24a700fc -//.word 0xe0dd5f1f -//.word 0xf948368d -//.word 0x1210dfcc -//.word 0xec06b94a -//.word 0x86357196 -//.word 0x89b980d0 -//.word 0xe2d5f55f -//.word 0xb13f75e1 -//.word 0x62be8068 -//.word 0x19f7f5e3 -//.word 0x5484d9da -//.word 0xcc47545f -//.word 0x9cfefc41 -//.word 0xa4175782 -//.word 0x30c59a0b -//.word 0xd553b79f -//.word 0x9cb9970e -//.word 0x636da4ab -//.word 0x7f7b8bff -//.word 0xa6d840bf -//.word 0x0df342fc -//.word 0xcd8e209a -//.word 0x8bcc3c03 -//.word 0x588bcf1c -//.word 0xd6f32d79 -//.word 0x9c4f4bcd -//.word 0xdc1c7ea4 -//.word 0x43608554 -//.word 0x213eca30 -//.word 0xcac6e500 -//.word 0x3c1262ae -//.word 0x028ec442 -//.word 0x5897c910 -//.word 0x8f48f030 -//.word 0xb390392f -//.word 0x6c882c04 -//.word 0x22041c46 -//.word 0x6469ad9c -//.word 0x8bbe9474 -//.word 0x9a059ef8 -//.word 0x69cbf43d -//.word 0x03fe9dbe -//.word 0x4cff440a -//.word 0xe7f83cb9 -//.word 0x5670c1a4 -//.word 0x631c8156 -//.word 0xbff85bbd -//.word 0xea976625 -//.word 0x52b73568 -//.word 0xbf19595e -//.word 0xee90289b -//.word 0x7c57bd5a -//.word 0x07a740b4 -//.word 0x8f896816 -//.word 0x22ea3df1 -//.word 0xb8ed23b3 -//.word 0x5c8514f7 -//.word 0x8c422df8 -//.word 0xe36b6c4c -//.word 0xf54eb8cf -//.word 0x7bd421dd -//.word 0xb0586ac4 -//.word 0xfab9c478 -//.word 0xcdaedd89 -//.word 0xcc5a1953 -//.word 0x32211f75 -//.word 0x71b99884 -//.word 0x19843300 -//.word 0xfa1ded86 -//.word 0x8d318f48 -//.word 0x909078bb -//.word 0xf1839c8f -//.word 0xed61cde4 -//.word 0x795d3abb -//.word 0xe1a235aa -//.word 0xafa239d5 -//.word 0xceaa2b19 -//.word 0xefbae08a -//.word 0x2c95e020 -//.word 0xeb1469ad -//.word 0x06bfb712 -//.word 0x299e83b3 -//.word 0x7b4dca28 -//.word 0x804fcf36 -//.word 0x3ea463fd -//.word 0x9e9e6472 -//.word 0x16f08410 -//.word 0x85084bcb -//.word 0x5e9f6046 -//.word 0x098e0445 -//.word 0x86e3df65 -//.word 0x5434ff0b -//.word 0x91331e9a -//.word 0x628323e9 -//.word 0x95caecf4 -//.word 0x85084bd1 -//.word 0x3e274ee6 -//.word 0xe2d3c45a -//.word 0x4c8bfcc9 -//.word 0xf2f8d03c -//.word 0x107ee258 -//.word 0x031226d5 -//.word 0xf24ba132 -//.word 0xb4bb70a7 -//.word 0xee7f0b5c -//.word 0x7c15cbd8 -//.word 0x136eaabc -//.word 0x24444bb1 -//.word 0x03ae3a9f -//.word 0x48f27420 -//.word 0x769a2a34 -//.word 0xdacac236 -//.word 0xb6d01f0e -//.word 0x9ffd22a9 -//.word 0x24b370a6 -//.word 0xb0c07652 -//.word 0xb2eaabd7 -//.word 0xfacb15b0 -//.word 0x66e00f60 -//.word 0xbfdc4964 -//.word 0xde421066 -//.word 0x1332d0b3 -//.word 0xc783d7ef -//.word 0x5f135b08 -//.word 0x645bbf68 -//.word 0xe147126f -//.word 0x0d44d920 -//.word 0x2a9a0e1a -//.word 0xadfc68ca -//.word 0x9f5ddde0 -//.word 0x430666ff -//.word 0xf9e602b9 -//.word 0x6229fdba -//.word 0xc50c7243 -//.word 0xb2ef0fdb -//.word 0xe5ab1841 -//.word 0x6c27aea4 -//.word 0x0d265216 -//.word 0xe263a53f -//.word 0x46e0714e -//.word 0xf57bed35 -//.word 0x6ec23d16 -//.word 0x9c0839f8 -//.word 0xb6b96fbf -//.word 0x64ea6b5b -//.word 0x2334363f -//.word 0xeac31c15 -//.word 0x0eaab2b0 -//.word 0x63791842 -//.word 0xa4127ccf -//.word 0x14b8dfe1 -//.word 0x66691c7e -//.word 0xda6e2657 -//.word 0xaa309142 -//.word 0xa44d54ea -//.word 0x18ebcdc5 -//.word 0xf44d0547 -//.word 0x2ea43656 -//.word 0x62278afd -//.word 0xbd652664 -//.word 0x19da6700 -//.word 0x69c16b07 -//.word 0x582ad427 -//.word 0x2d4cc877 -//.word 0xf21c3cae -//.word 0xd51f7393 -//.word 0xce7cc1b4 -//.word 0x8255955b -//.word 0x6857b7be -//.word 0x2a90cd76 -//.word 0x4e812432 -//.word 0x1575adad -//.word 0xa31146dd -//.word 0x612b3b6e -//.word 0xa0e00d6e -//.word 0x7fe0724a -//.word 0x0e0d9cf9 -//.word 0xb345be77 -//.word 0xcd7bcd75 -//.word 0x980d844f -//.word 0x5151aa3e -//.word 0x9a7197cf -//.word 0x1f7af593 -//.word 0x7aafc418 -//.word 0x5423a019 -//.word 0xcd8747f2 -//.word 0x1e405656 -//.word 0x7dbd5344 -//.word 0x4207f037 -//.word 0x47998e9e -//.word 0x9473018b -//.word 0x3c6a93af -//.word 0x82c24b86 -//.word 0x40fe6fcf -//.word 0x8af7473f -//.word 0x8e2c2476 -//.word 0xbe59a132 -//.word 0x324b29c3 -//.word 0x47f2b9bf -//.word 0x8db8e7f6 -//.word 0xe01124a8 -//.word 0xd4533ef6 -//.word 0x57c92997 -//.word 0x9102fecc -//.word 0x0f6f4496 -//.word 0x212e6f26 -//.word 0x8020a695 -//.word 0x3441c9d5 -//.word 0xb539b3e8 -//.word 0x512ebc4f -//.word 0xcddd82c6 -//.word 0x4fe9ea2e -//.word 0x7c7261cb -//.word 0xddea68af -//.word 0x87244f76 -//.word 0xfbae4034 -//.word 0x4b6180ac -//.word 0x7e36f2c3 -//.word 0x365cdd34 -//.word 0x9087ee84 -//.word 0x4c8a8139 -//.word 0x2e281c47 -//.word 0xa3273ccb -//.word 0xa8a755fb -//.word 0xe8b2145d -//.word 0x2414e738 -//.word 0xd86dbf49 -//.word 0x1c8415b6 -//.word 0xc8de2b48 -//.word 0xdb9094d4 -//.word 0x1e51f6fa -//.word 0x04d30f12 -//.word 0xd554f664 -//.word 0x0b70a397 -//.word 0xfd39b26d -//.word 0xba8964ad -//.word 0x3897e760 -//.word 0xaec9d73f -//.word 0x3ec9046d -//.word 0xd7db7662 -//.word 0x5a6eae27 -//.word 0xfbf02fc9 -//.word 0xebe73d08 -//.word 0x343ee54f -//.word 0xe4dc3de9 -//.word 0x6d7ced71 -//.word 0x4cb8ee8a -//.word 0xe96692d1 -//.word 0xbe28c510 -//.word 0xbc3f92b5 -//.word 0xeaa0e982 -//.word 0x504a9f85 -//.word 0x13d6b64b -//.word 0xe150df51 -//.word 0x8f453dbb -//.word 0x011d6c48 -//.word 0x4babc286 -//.word 0x1503d442 -//.word 0x448c3c43 -//.word 0xd7569a38 -//.word 0x0eadd9ee -//.word 0xd2eeb4c6 -//.word 0x51997867 -//.word 0xe9a80bb0 -//.word 0x471f2df0 -//.word 0xd0e5fe5a -//.word 0x3fd2c0b3 -//.word 0x9009df4e -//.word 0x1e882e3a -//.word 0x08fd74ba -//.word 0xd8db27f5 -//.word 0x67ae77ef -//.word 0xfbac8fb8 -//.word 0xb38c17e4 -//.word 0x259bfd3a -//.word 0x450c75b1 -//.word 0x898f3e98 -//.word 0x4a262714 -//.word 0x6e34d3cf -//.word 0x44d7b9ef -//.word 0xaf786e45 -//.word 0x87a127c7 -//.word 0x3c0e7a41 -//.word 0xbc066447 -//.word 0x97ec906e -//.word 0x6111d6bc -//.word 0x59cc035c -//.word 0x47cdd896 -//.word 0xabae55ff -//.word 0x13cb37ed -//.word 0xcd54bf2e -//.word 0xbea0b5fa -//.word 0x92c4ad25 -//.word 0x16658999 -//.word 0xe1ca3f04 -//.word 0x3a35dcce -//.word 0x3674c94e -//.word 0x21b34d3d -//.word 0x1f94546b -//.word 0x13826fb0 -//.word 0xc0421b26 -//.word 0x2fca4695 -//.word 0x50570f2f -//.word 0xe3bace7e -//.word 0x99f2549a -//.word 0x7700749f -//.word 0x7cf7c25e -//.word 0x83539a53 -//.word 0x6b8b64d8 -//.word 0x74ea1797 -//.word 0xec9afc45 -//.word 0x0c02b58e -//.word 0x1d527d4b -//.word 0xde5bb1fb -//.word 0x2aa59071 -//.word 0xd6bb3fca -//.word 0xd9ca0fa2 -//.word 0xaf6a0388 -//.word 0xffbc8dae -//.word 0x7bb599e5 -//.word 0x07b9ccc9 -//.word 0x1e6c0e39 -//.word 0x72c5460b -//.word 0xd36464fd -//.word 0x5225a5ee -//.word 0xa6f5124e -//.word 0xcfe44bd3 -//.word 0xf97c826d -//.word 0xa251ca7d -//.word 0xffda9242 -//.word 0x9c7f6c93 -//.word 0x44f314d4 -//.word 0x20c4ad23 -//.word 0x22314dd2 -//.word 0xa53bbc1a -//.word 0x4dff790d -//.word 0x3542fecd -//.word 0x494e45fc -//.word 0xf0fd8b73 -//.word 0xef135437 -//.word 0x8ad0afa8 -//.word 0xebc6bbfc -//.word 0xc8e96aec -//.word 0x41e585ad -//.word 0x07b4f122 -//.word 0xc36f3050 -//.word 0xb6642a12 -//.word 0x9c6a2e0e -//.word 0xd77134e7 -//.word 0xc95d65b5 -//.word 0x8215ddb2 -//.word 0x9bd6af35 -//.word 0x61ce29e5 -//.word 0x37e65a26 -//.word 0x35dfd2d8 -//.word 0x15a0a941 -//.word 0x50cec347 -//.word 0x849e51e3 -//.word 0x19e79bd2 -//.word 0x247cfe8e -//.word 0x8bb8307c -//.word 0x6b5acc67 -//.word 0xb6930a2d -//.word 0x215ecdb8 -//.word 0x3d10e430 -//.word 0xe330896f -//.word 0xd6882eb6 -//.word 0xa47c7a9e -//.word 0xcd9b8e51 -//.word 0x27748cf9 -//.word 0x81ab5a79 -//.word 0x874ca35c -//.word 0xe65e1f0a -//.word 0xb0bc1542 -//.word 0x01201ec4 -//.word 0xe3812b4e -//.word 0x6f9fc9ca -//.word 0x35dca4c6 -//.word 0xde4d4a24 -//.word 0x10113213 -//.word 0x92e1fd3e -//.word 0xb1e9fb43 -//.word 0xe2d6f166 -//.word 0xa8311a87 -//.word 0xb8eb6b51 -//.word 0x5c391bb5 -//.word 0x15a26396 -//.word 0x845583c6 -//.word 0x8ac10532 -//.word 0xaf604559 -//.word 0xc0d33103 -//.word 0xbc344e2f -//.word 0xf2a8fc4d -//.word 0x6333faad -//.word 0x6dd12c38 -//.word 0xabc29c5e -//.word 0x1725c04f -//.word 0x71c8fb6e -//.word 0xe53f6502 -//.word 0xe833cf2f -//.word 0x63fd0226 -//.word 0x13734898 -//.word 0x2f022e70 -//.word 0x4cfe87c1 -//.word 0x7f35b4fd -//.word 0xc1ca2369 -//.word 0x974116cd -//.word 0xf2d6a670 -//.word 0x53130743 -//.word 0x34a10d5d -//.word 0xa45fefa7 -//.word 0x31b14cd9 -//.word 0x0a1b6ba5 -//.word 0x650ec731 -//.word 0x1f01cbcb -//.word 0xa2c4dad9 -//.word 0x0c11920e -//.word 0x8e6552e4 -//.word 0x110df946 -//.word 0x2084f18c -//.word 0x02fc6dad -//.word 0x263beeb0 -//.word 0xc5a80c64 -//.word 0xc2a67351 -//.word 0xd5202cee -//.word 0xe8651e15 -//.word 0xc137d4b3 -//.word 0xe21e80c4 -//.word 0xad03407f -//.word 0xccf9a1cd -//.word 0xd05e6200 -//.word 0x18237ac2 -//.word 0xf5685b4b -//.word 0x0b4c79d8 -//.word 0xfb030658 -//.word 0x3f290068 -//.word 0x55556e81 -//.word 0x1ff2e770 -//.word 0x8a4a5307 -//.word 0x6ee4f613 -//.word 0xb510aa8e -//.word 0xc0c06b15 -//.word 0x0699199c -//.word 0xfe4a7a60 -//.word 0x401d7f1d -//.word 0xe7cbc881 -//.word 0x399569e1 -//.word 0x8a90ef2c -//.word 0x5d419e1d -//.word 0xcd69fdb4 -//.word 0x2b2295e6 -//.word 0xe92bf594 -//.word 0xb681f9ba -//.word 0xeb2f4ce9 -//.word 0x26662cf7 -//.word 0x34d06df5 -//.word 0x3522c161 -//.word 0xfaf1369d -//.word 0xb2c600a0 -//.word 0xc67479ec -//.word 0x01a966bf -//.word 0xf4c47c8e -//.word 0x99e623af -//.word 0x364c7956 -//.word 0x84dc9ac2 -//.word 0x11fd1fb8 -//.word 0xe3ace431 -//.word 0x5ecd0f50 -//.word 0x68be4d96 -//.word 0xca325f59 -//.word 0xd93dd672 -//.word 0x57ab1a37 -//.word 0x9496b1a9 -//.word 0xd838beee -//.word 0x05fdc801 -//.word 0x79dcbda8 -//.word 0x32e837a6 -//.word 0x3522fd32 -//.word 0x3092cda9 -//.word 0x5e965980 -//.word 0xab798f7c -//.word 0x19471d25 -//.word 0x62e03578 -//.word 0xdf4c8ddc -//.word 0xa84eab57 -//.word 0xfd3c5f02 -//.word 0xe40d91ba -//.word 0x14b43c19 -//.word 0x12adbba4 -//.word 0x9ad54446 -//.word 0x407eb2fe -//.word 0x57c387d4 -//.word 0x12193111 -//.word 0xe9278caf -//.word 0x3ed8a90f -//.word 0x41aeceea -//.word 0x1159bd8a -//.word 0x2488393a -//.word 0xe8ffc7fb -//.word 0xaae9b278 -//.word 0xb870513c -//.word 0xc28c8c23 -//.word 0x86189d0e -//.word 0xad2b14db -//.word 0xefa51e95 -//.word 0x7e0806e7 -//.word 0xa28afcd7 -//.word 0xa06816b1 -//.word 0xe17c9440 -//.word 0x50126844 -//.word 0x04f8f621 -//.word 0x1fd418d5 -//.word 0xf6ba652c -//.word 0x72feb337 -//.word 0xb647dafa -//.word 0x01e5bb65 -//.word 0xd6658186 -//.word 0x5b6227fc -//.word 0x009e3baf -//.word 0x6051e1be -//.word 0x6cc01ab9 -//.word 0xc6124611 -//.word 0x6b5fe8cc -//.word 0x950baa7d -//.word 0xe052a174 -//.word 0xab23d132 -//.word 0xc132f420 -//.word 0x39497780 -//.word 0x9adec6a3 -//.word 0x43ebc95c -//.word 0x0afaaeb6 -//.word 0x247feae2 -//.word 0x456b7a73 -//.word 0x07fe6fce -//.word 0x90dda9db -//.word 0x6f64e301 -//.word 0xc83df052 -//.word 0xb1324302 -//.word 0xdb3fb51e -//.word 0x75ec837a -//.word 0x4dda96ec -//.word 0x399b08b7 -//.word 0xb5c6e34a -//.word 0xcd4b2c2b -//.word 0x3e05202e -//.word 0xd88ebdea -//.word 0x2657846d -//.word 0x51f87e2f -//.word 0x42c47d45 -//.word 0x07a1a4d7 -//.word 0x781729d4 -//.word 0x1aa65ae4 -//.word 0x435dde9f -//.word 0x7fa83efc -//.word 0x336aa40c -//.word 0x804be2e8 -//.word 0x6a54b5e8 -//.word 0x3ab94b15 -//.word 0x20f504e1 -//.word 0x1d1c7616 -//.word 0x206db30d -//.word 0x7027ce20 -//.word 0x499f9b61 -//.word 0xca8eb78d -//.word 0x0fafc83b -//.word 0x9a8a0659 -//.word 0xf78afbd9 -//.word 0x9f5686a8 -//.word 0x1e5e26e0 -//.word 0x71b4753e -//.word 0xb21ef3d6 -//.word 0xf7690505 -//.word 0x77003ea8 -//.word 0xeebddc8b -//.word 0x43fe9625 -//.word 0x68fc9582 -//.word 0x8358c080 -//.word 0x4bf73c3e -//.word 0xb41033d2 -//.word 0xce83d53a -//.word 0xea6d9d95 -//.word 0x00f9d694 -//.word 0x4d795d2b -//.word 0x40b5a88c -//.word 0x97820755 -//.word 0xc6972a08 -//.word 0x989de4bd -//.word 0x18852e13 -//.word 0xb21e6f6c -//.word 0x96e7fb5a -//.word 0x5d22d954 -//.word 0xef29c9ae -//.word 0xa40585c8 -//.word 0xa93d4885 -//.word 0xa6ec8dfe -//.word 0x9d161978 -//.word 0x163c3b94 -//.word 0x792e53c6 -//.word 0xbb219108 -//.word 0x3c01ffd0 -//.word 0xf009c23f -//.word 0xbe909d9b -//.word 0x2526b6ff -//.word 0x25df9d51 -//.word 0x5def8a75 -//.word 0x7177e6c0 -//.word 0xae9f0db0 -//.word 0xf1e553da -//.word 0xc4b54523 -//.word 0xcb393133 -//.word 0x5f72e827 -//.word 0x7888c286 -//.word 0xd05ee377 -//.word 0x456abd31 -//.word 0x7fc4d6b2 -//.word 0xd47ccbb4 -//.word 0x683196dd -//.word 0x99df0c36 -//.word 0x9af9a9de -//.word 0x5db89000 -//.word 0xb7b2ce02 -//.word 0xbfaedfff -//.word 0x77b77378 -//.word 0xae6f7246 -//.word 0x24a63dd3 -//.word 0xf02b378a -//.word 0x1fe2848c -//.word 0x9e1710a5 -//.word 0x5a12d37e -//.word 0xa5ec5414 -//.word 0xdca16c68 -//.word 0x46654d79 -//.word 0x403cc26f -//.word 0x97c5b919 -//.word 0x3656fe99 -//.word 0x014e495e -//.word 0x00a77b53 -//.word 0xc0cb2556 -//.word 0xf6a94aec -//.word 0x66076633 -//.word 0x031aae18 -//.word 0x58549ac9 -//.word 0x267da16e -//.word 0x4f054314 -//.word 0xf2994de9 -//.word 0xd8f459af -//.word 0x0ff8946b -//.word 0xd4fdc45d -//.word 0xb7698935 -//.word 0xf980e284 -//.word 0x397ef471 -//.word 0x4fe307ad -//.word 0x790fd2a9 -//.word 0xb50ef806 -//.word 0x6db5d24d -//.word 0x59ee6fe0 -//.word 0xa250d930 -//.word 0x43f39a31 -//.word 0xb5827f0b -//.word 0xcb919c13 -//.word 0xdb3190f9 -//.word 0x1ec20b42 -//.word 0x59098df9 -//.word 0xbd8370a2 -//.word 0x0cf82870 -//.word 0xfe52cab8 -//.word 0xe3b0cba4 -//.word 0x89b70a2c -//.word 0x60281142 -//.word 0xdcb8984d -//.word 0x1b1c4bd9 -//.word 0xc863ce8d -//.word 0x3f88fd5d -//.word 0xf2487801 -//.word 0x0b315fa5 -//.word 0x53fc5ae2 -//.word 0x521cdded -//.word 0xb897aa0e -//.word 0xfb159754 -//.word 0x42369188 -//.word 0x8229e15f -//.word 0xe67baef3 -//.word 0x752cc374 -//.word 0xef08931b -//.word 0xf7347a60 -//.word 0x7708466d -//.word 0x411cf6d2 -//.word 0xf2a6c27a -//.word 0x1c035bde -//.word 0xa4937378 -//.word 0x68ca807b -//.word 0x2584bdc1 -//.word 0x99997205 -//.word 0xe4b27652 -//.word 0x345bf2bb -//.word 0xa159674d -//.word 0x563df342 -//.word 0xf239d077 -//.word 0x2e331d21 -//.word 0xbf18e1bb -//.word 0x7e734d43 -//.word 0xc63e41a5 -//.word 0x1df71278 -//.word 0x17f78be8 -//.word 0x780031f3 -//.word 0x9915cbd9 -//.word 0x0d8e22cd -//.word 0x836b06f1 -//.word 0xeee99181 -//.word 0xe453b04e -//.word 0x441bde6f -//.word 0x1c293333 -//.word 0xca739e5a -//.word 0x61ce6f84 -//.word 0x4e0318e9 -//.word 0x3b26344b -//.word 0x3323c829 -//.word 0x079ac936 -//.word 0xf1eddf09 -//.word 0x78976916 -//.word 0x93bfc1dd -//.word 0x110cc161 -//.word 0x38bc86dc -//.word 0xadf073b1 -//.word 0x944a79a2 -//.word 0xf7ba9643 -//.word 0x6c959cae -//.word 0xf2e83479 -//.word 0x1d0b22e5 -//.word 0x7379cb58 -//.word 0x15def40e -//.word 0xa272cc0b -//.word 0x58862d54 -//.word 0x7c5c1f5e -//.word 0xfc3c9ec7 -//.word 0x54c49d44 -//.word 0xae804adb -//.word 0x4dbb9452 -//.word 0x2b94eae7 -//.word 0xe1544641 -//.word 0xc8fe6ba7 -//.word 0x5e286b70 -//.word 0xeb0a6bba -//.word 0x64d5aa5f -//.word 0x8f46c025 -//.word 0x687a2435 -//.word 0xc404f1cf -//.word 0x343dea3b -//.word 0x2cdbbb03 -//.word 0x64c5825f -//.word 0x7f268df1 -//.word 0xebc065b2 -//.word 0x08840c2d -//.word 0x8c5f84eb -//.word 0x2656902e -//.word 0x61d5bfe2 -//.word 0xcc44a5d0 -//.word 0x58dc6c15 -//.word 0x01b98cd2 -//.word 0xb030d626 -//.word 0x6062b759 -//.word 0x8011bb5a -//.word 0x99b3506c -//.word 0x31c5cd1c -//.word 0xef62b276 -//.word 0x00143178 -//.word 0xb8eaeec7 -//.word 0x7dcb04a1 -//.word 0xe1094813 -//.word 0x0e39d16c -//.word 0x6743b8f1 -//.word 0x6cb51cd2 -//.word 0xde5d695d -//.word 0x2416da72 -//.word 0xeee23d37 -//.word 0x1839f70c -//.word 0xd1a147c2 -//.word 0xfc7fcf07 -//.word 0xd62d5025 -//.word 0xda4cb5ed -//.word 0xe25c53ed -//.word 0x8e8a6fea -//.word 0xe9c8008a -//.word 0x4a23b750 -//.word 0x79513dcd -//.word 0x138abc15 -//.word 0x309aa071 -//.word 0x42339f53 -//.word 0x4187f68f -//.word 0x0516f6c7 -//.word 0xf3c5c027 -//.word 0xdb314d53 -//.word 0x2142b19e -//.word 0x1b03a07d -//.word 0xbbb1313b -//.word 0x6e12e2ee -//.word 0x4307dca9 -//.word 0x506579f3 -//.word 0x52010478 -//.word 0x930ac0ff -//.word 0x119c2b9c -//.word 0xdc918327 -//.word 0xc09b8aec -//.word 0x249087a4 -//.word 0x32048da5 -//.word 0x381dff55 -//.word 0x4ea354e4 -//.word 0x3a57183b -//.word 0x9086332f -//.word 0x1edd6efb -//.word 0x867f33ed -//.word 0x2d55945f -//.word 0x54a590e9 -//.word 0x85e791d5 -//.word 0x31d438d3 -//.word 0x97bf5dee -//.word 0xe72852bf -//.word 0xa88f68e1 -//.word 0x5786b5a5 -//.word 0x510a1406 -//.word 0xf3136cdf -//.word 0xff6a365b -//.word 0x41bb39ad -//.word 0x73eb9802 -//.word 0x5fab0fb4 -//.word 0x434e7ac1 -//.word 0x79d7977b -//.word 0x57570c81 -//.word 0x5576aced -//.word 0x6d4ff6cf -//.word 0xc881dedb -//.word 0x9682d15e -//.word 0x3e37f377 -//.word 0xb7c2ab83 -//.word 0x359c61d9 -//.word 0x09e386b8 -//.word 0xc2f5d57d -//.word 0x993dd919 -//.word 0x0c4db0c3 -//.word 0xc82d0eea -//.word 0xccf3856e -//.word 0xcc94030f -//.word 0xd3fa9c26 -//.word 0x2d578993 -//.word 0x84b871f6 -//.word 0x49dde822 -//.word 0x564836ce -//.word 0xd194598e -//.word 0x53084d02 -//.word 0x496c8a4d -//.word 0x9b1bcfc9 -//.word 0x8c5a1efa -//.word 0xe2e807c0 -//.word 0x46d72ad0 -//.word 0xed99f864 -//.word 0x785eb932 -//.word 0x199ed39b -//.word 0xf8f14926 -//.word 0xd527822c -//.word 0xee954cd5 -//.word 0x23ad2043 -//.word 0x58d2a80c -//.word 0x1b6a7eee -//.word 0x863437be -//.word 0x67dba0a2 -//.word 0x9fcc4780 -//.word 0xc8453db6 -//.word 0x1baf1b0c -//.word 0x902e43e6 -//.word 0x467668bf -//.word 0x26e051d2 -//.word 0xc4bdd91a -//.word 0x85ea3b7d -//.word 0x07a58c45 -//.word 0xbd9e89cf -//.word 0xda519387 -//.word 0x7194f814 -//.word 0xda6c74cf -//.word 0x5725f87a -//.word 0xf7a2a92f -//.word 0xbbf12c96 -//.word 0xf822215b -//.word 0xfc5aeddf -//.word 0xf423bd2e -//.word 0x0e06c832 -//.word 0xda5cd426 -//.word 0xf661fb4c -//.word 0xea8aafe3 -//.word 0x5119fc54 -//.word 0x3aee0dac -//.word 0xcda0f24e -//.word 0x32cca0ea -//.word 0xaead39a9 -//.word 0x0fed8eaa -//.word 0x4bbbe3b2 -//.word 0x641ef21f -//.word 0x8e89321e -//.word 0x94af581e -//.word 0x78981e85 -//.word 0x5af544a1 -//.word 0x9ab1d5e1 -//.word 0x41c8ac45 -//.word 0x9d5c3613 -//.word 0x2c067acc -//.word 0xbc6a565e -//.word 0xcf0e0b9b -//.word 0x446cfcea -//.word 0x3445b23c -//.word 0x1b392442 -//.word 0x389535de -//.word 0x366c7fd7 -//.word 0x0be94fd0 -//.word 0x21e3f07b -//.word 0xb3b22d0a -//.word 0x7b4111e6 -//.word 0x8a65f1a4 -//.word 0x776dad35 -//.word 0xbbfb325c -//.word 0x5c124365 -//.word 0xc96f7a15 -//.word 0x051d89dd -//.word 0x0844c652 -//.word 0x6342e7e2 -//.word 0x22fc09bf -//.word 0xf676f820 -//.word 0x94a2aaa9 -//.word 0x58760c27 -//.word 0x2e410281 -//.word 0xb23fa8ec -//.word 0x966bdf5d -//.word 0x44940544 -//.word 0xc5b30377 -//.word 0xe27c8d6c -//.word 0x8933a5ac -//.word 0x72c16184 -//.word 0x0107effe -//.word 0x6f72d610 -//.word 0x25d07e12 -//.word 0x6862f375 -//.word 0x3b32e6b3 -//.word 0x81a6f582 -//.word 0x63562c4d -//.word 0xf11bcbe4 -//.word 0x0c684973 -//.word 0x83de9ab1 -//.word 0x7c1aae59 -//.word 0x16d23ade -//.word 0x4c20ba5b -//.word 0x1d1db7c8 -//.word 0xe9b24574 -//.word 0x1fabd1af -//.word 0x150d19c7 -//.word 0x37aa7c37 -//.word 0x64f2741a -//.word 0x950c61e6 -//.word 0xc0268856 -//.word 0xfc095ba8 -//.word 0xe5f0fb09 -//.word 0x429afb4e -//.word 0xe59e67e4 -//.word 0xd3ff040a -//.word 0xa500da3d -//.word 0x2e39f0f4 -//.word 0x5eeb578e -//.word 0x66916989 -//.word 0x1db753f4 -//.word 0xa30fd127 -//.word 0x44c239b1 -//.word 0x9f04bb92 -//.word 0x07ebe7ab -//.word 0x29816f72 -//.word 0xef182fea -//.word 0xa5dd6ad3 -//.word 0x5bb0571d -//.word 0x8a33dca3 -//.word 0xfa219916 -//.word 0xe2e22837 -//.word 0x525ca34a -//.word 0xce0b67c7 -//.word 0x3b541852 -//.word 0x0016e6ed -//.word 0x65830e6d -//.word 0x3e2ea32a -//.word 0xce648efb -//.word 0xe6c0d462 -//.word 0x4dfa1703 -//.word 0x6400605b -//.word 0x0a481bae -//.word 0xbe646341 -//.word 0x03d780ca -//.word 0x0927ae25 -//.word 0x89332048 -//.word 0xf1c74579 -//.word 0xc16e4abf -//.word 0x3587e096 -//.word 0x249b3fe6 -//.word 0x28ee6b36 -//.word 0xff54b61d -//.word 0x314686fa -//.word 0xf33558e5 -//.word 0x4c1e05e6 -//.word 0x765f4464 -//.word 0x87c971e0 -//.word 0x51f68de3 -//.word 0x86dd8534 -//.word 0x20a3b74f -//.word 0xffb5b213 -//.word 0xd4133dbb -//.word 0x3fef9c0f -//.word 0x34760edb -//.word 0xa3ee9aa1 -//.word 0x58010b8b -//.word 0x20583aa3 -//.word 0x2d6c8b46 -//.word 0xbb99bad6 -//.word 0xf475d8b0 -//.word 0x115f905e -//.word 0xc35baf0d -//.word 0xd11de441 -//.word 0x0263c3c7 -//.word 0x3d8810ec -//.word 0xef563bec -//.word 0xad1d27ad -//.word 0x1b012fad -//.word 0x0c986b39 -//.word 0xeab52fe1 -//.word 0x597ed528 -//.word 0x17c5bd80 -//.word 0x26959175 -//.word 0x2e0ace28 -//.word 0x1d6680ff -//.word 0x10624d9b -//.word 0x76c2b40a -//.word 0x722c973e -//.word 0x823af7be -//.word 0x5fce009c -//.word 0x24a645a7 -//.word 0xb1304ce1 -//.word 0x529f4d34 -//.word 0x9c3e3760 -//.word 0x9804f438 -//.word 0x2469ee0e -//.word 0x9579d26c -//.word 0xa1279405 -//.word 0x7de3b3ea -//.word 0x426fbe01 -//.word 0x95ee17b4 -//.word 0x873ef7e6 -//.word 0xba87b22b -//.word 0xc6143c38 -//.word 0xda62ec98 -//.word 0xa77781a1 -//.word 0x797563a7 -//.word 0xa76f2b6f -//.word 0x2e7b64e6 -//.word 0x99099313 -//.word 0x2473764b -//.word 0x20d58aa4 -//.word 0x991ecfac -//.word 0x3767cf5a -//.word 0x6284dd44 -//.word 0xa9d99b13 -//.word 0x656fbf34 -//.word 0x994816d1 -//.word 0x1defc900 -//.word 0xfc52df3a -//.word 0x1ad4030e -//.word 0x1a9f8716 -//.word 0x7e37aa2b -//.word 0x105516d5 -//.word 0x81f2ad05 -//.word 0x51a28507 -//.word 0xee2331b2 -//.word 0x203643e2 -//.word 0xa4ad0e28 -//.word 0x18c6b1bf -//.word 0x17b751c2 -//.word 0xa48aa59d -//.word 0xcc2bb8c2 -//.word 0x87c0ea9d -//.word 0xe03838c9 -//.word 0x5527be84 -//.word 0x81d17a60 -//.word 0xf884533c -//.word 0x732c5a73 -//.word 0x2d214f53 -//.word 0x8c4367d1 -//.word 0x04494c7a -//.word 0x395666ad -//.word 0x63cd5908 -//.word 0xf767cf20 -//.word 0x84837775 -//.word 0xdabd4ea5 -//.word 0x72c11ddf -//.word 0x0a62429b -//.word 0x90e6b488 -//.word 0x41a442c6 -//.word 0x12d21b56 -//.word 0x4f9893cf -//.word 0x82682452 -//.word 0x9692b3bf -//.word 0x3c131529 -//.word 0x8eaed288 -//.word 0xf23f29ae -//.word 0x424b547d -//.word 0x2adb0d56 -//.word 0xd18b50d4 -//.word 0xbbde63bb -//.word 0xeed4142b -//.word 0x53bf421a -//.word 0x60529e01 -//.word 0xf4fbb3d4 -//.word 0x82732438 -//.word 0x729335f1 -//.word 0xc4698d99 -//.word 0xf78b3b98 -//.word 0x29abf650 -//.word 0x7f6ca998 -//.word 0xc7742f6c -//.word 0x5cc25ae2 -//.word 0x4a423b60 -//.word 0xb39f9d0d -//.word 0x7259d385 -//.word 0xfd17b4d1 -//.word 0x903ee396 -//.word 0x88c2548c -//.word 0x0d3d0b32 -//.word 0xf33e27c1 -//.word 0xe2e3205e -//.word 0xb5aa4d93 -//.word 0x2184a900 -//.word 0x972bd64e -//.word 0x6bb66265 -//.word 0x356b4adf -//.word 0x78d4bcbc -//.word 0x81152157 -//.word 0x927c5b98 -//.word 0x405a4b6c -//.word 0x1a119772 -//.word 0x8b6faaf8 -//.word 0x023afc25 -//.word 0x4f0c9377 -//.word 0x5161ca71 -//.word 0xceef518d -//.word 0xa2367578 -//.word 0x1c57a17e -//.word 0xa5292543 -//.word 0xa28a37b5 -//.word 0x9cf3373e -//.word 0x9e50383e -//.word 0xdf0ebbb8 -//.word 0xa175bd4c -//.word 0x5938f565 -//.word 0x104a57b3 -//.word 0x09f4dcdc -//.word 0xa425856e -//.word 0x82099e19 -//.word 0xeadc401b -//.word 0x6c0119fb -//.word 0xc44e6f7a -//.word 0x01ab63c7 -//.word 0xe6db73f2 -//.word 0x909943a3 -//.word 0x59e79d0c -//.word 0xfda3b61c -//.word 0xfb5bb3f5 -//.word 0x3e626ba1 -//.word 0xfd236f00 -//.word 0xe0b64805 -//.word 0x64b1ff22 -//.word 0x8041e301 -//.word 0x89798675 -//.word 0x53e909b0 -//.word 0x997399b6 -//.word 0x9e5a3a12 -//.word 0x159cc3c7 -//.word 0x3e822a89 -//.word 0x5375022d -//.word 0x2213425f -//.word 0xfb824893 -//.word 0xcc041e3e -//.word 0x8bccfb45 -//.word 0xd4110db5 -//.word 0xd46075b6 -//.word 0x653694ba -//.word 0x7ace85fa -//.word 0xbe38ea23 -//.word 0x78abec4c -//.word 0xb21c7d2c -//.word 0x9a0fe08a -//.word 0x28ae6cf4 -//.word 0x01188db4 -//.word 0x9cfb0b00 -//.word 0xa3658f71 -//.word 0x9cd763b7 -//.word 0xc89c798a -//.word 0x4b58afe3 -//.word 0x8ee4516d -//.word 0xe259df36 -//.word 0x666b11ab -//.word 0x2af919c3 -//.word 0x94e1287a -//.word 0x03193381 -//.word 0xb3fcf734 -//.word 0xe1e13bcc -//.word 0x2ff255d6 -//.word 0x493cefe4 -//.word 0xc9020b82 -//.word 0x5857456b -//.word 0x16ec58fd -//.word 0x3d26e4eb -//.word 0x01736f32 -//.word 0xbadfa94e -//.word 0x44e2f4ad -//.word 0xa67c2364 -//.word 0xf3848221 -//.word 0x6e3e1760 -//.word 0xf12b28e2 -//.word 0x9025fe5b -//.word 0x79abe86c -//.word 0x1e7982d0 -//.word 0x975b36da -//.word 0x4144041f -//.word 0xac9a7f70 -//.word 0xb4d5180b -//.word 0xed489f11 -//.word 0x453e073b -//.word 0xe4496ac9 -//.word 0x57d74cbc -//.word 0xee062445 -//.word 0x62ba197d -//.word 0xbbec0956 -//.word 0x7145cfd2 -//.word 0xd2ebc673 -//.word 0xa39b89f2 -//.word 0x0af8fd34 -//.word 0xac229279 -//.word 0x128bc5d7 -//.word 0x5106eae7 -//.word 0xea2128be -//.word 0xefb5c51e -//.word 0x67bba3ee -//.word 0xf4610be8 -//.word 0xb35eaa92 -//.word 0x6482d96f -//.word 0xcb912276 -//.word 0x5551ffc3 -//.word 0xffe2e48d -//.word 0x744e8058 -//.word 0x7561416b -//.word 0x7ebb1685 -//.word 0xa72378cc -//.word 0xc81eab06 -//.word 0xe0c0410b -//.word 0xb8c3e17a -//.word 0xc3d646ac -//.word 0x49378ae6 -//.word 0xc484a5d3 -//.word 0x8bcf3131 -//.word 0xadf070ca -//.word 0x201f8fa6 -//.word 0x1bc22c7f -//.word 0xc0831775 -//.word 0xfea65503 -//.word 0xb6996b32 -//.word 0x1ccdd90c -//.word 0x61c5e454 -//.word 0x8f6d9874 -//.word 0xb4ac0eb7 -//.word 0x423cebb8 -//.word 0xb6ba291b -//.word 0x78f91a7a -//.word 0x029ca9a2 -//.word 0x45e4e400 -//.word 0x48c6b756 -//.word 0x1341fab2 -//.word 0xcbeeafa1 -//.word 0x1ed984a0 -//.word 0xe28fa0d3 -//.word 0xf8789bfa -//.word 0x7767cea0 -//.word 0x0670ce95 -//.word 0x8afa339f -//.word 0x02149e6d -//.word 0xae0dfacc -//.word 0x773e011e -//.word 0x8b2b0207 -//.word 0x48cbe269 -//.word 0x5b236293 -//.word 0x291a9fb5 -//.word 0x6e88df97 -//.word 0x23908a8b -//.word 0xa63077a1 -//.word 0x15166919 -//.word 0xfab5da1e -//.word 0x2e99f7b1 -//.word 0xf7f7ebe3 -//.word 0x74896047 -//.word 0x3b9843a7 -//.word 0x405bc8f6 -//.word 0xf97faf86 -//.word 0xbf07c57b -//.word 0x7856ad80 -//.word 0x738ae0b8 -//.word 0x930cf3f7 -//.word 0xb0651933 -//.word 0x3a54e835 -//.word 0x1f1d6094 -//.word 0xef2329e4 -//.word 0x3fb91c2b -//.word 0x4b360594 -//.word 0xdf47a768 -//.word 0x778a0139 -//.word 0xa558d061 -//.word 0xb3e255ab -//.word 0x897f584f -//.word 0xd2446d24 -//.word 0x5bd67611 -//.word 0xbb7c69c4 -//.word 0x397854a7 -//.word 0xea989e10 -//.word 0x1a088fb9 -//.word 0xed6a126f -//.word 0x4628ba0e -//.word 0xe80904ac -//.word 0xdc03dc15 -//.word 0x12516278 -//.word 0x4bc5ed5f -//.word 0x355e50e4 -//.word 0xd81d5d22 -//.word 0x3215a8eb -//.word 0x1ec28eb9 -//.word 0x7b9b75e6 -//.word 0x89ea541f -//.word 0x96dc7716 -//.word 0xdbd47c77 -//.word 0xa105a21e -//.word 0xa8404387 -//.word 0xc80a9e85 -//.word 0xd9f2da37 -//.word 0xd1224838 -//.word 0x2c33e917 -//.word 0x91463007 -//.word 0xb25008d7 -//.word 0x74b51924 -//.word 0x501947cd -//.word 0xf8727ca7 -//.word 0x3e62a872 -//.word 0x32c5060c -//.word 0x8b86a0e5 -//.word 0x49b615b3 -//.word 0x98df9a67 -//.word 0xf6953f5f -//.word 0x984f74dd -//.word 0x0a75cbb8 -//.word 0x17baff51 -//.word 0xe8ac36c9 -//.word 0x70898371 -//.word 0x0755af82 -//.word 0x5429390f -//.word 0x71ce9b37 -//.word 0x4a8bcf9f -//.word 0x463a1220 -//.word 0x2aa1e8bc -//.word 0x3a0060d7 -//.word 0xa1e799a3 -//.word 0x124a85dd -//.word 0xb0d7edb7 -//.word 0x2b87b515 -//.word 0x2c7462fb -//.word 0xf4ead946 -//.word 0x40c0699b -//.word 0x6fe90c9e -//.word 0xe646ea64 -//.word 0xb4be1f2a -//.word 0x7291be47 -//.word 0x6de9165f -//.word 0x08b334da -//.word 0x5baca994 -//.word 0x20bf8dd6 -//.word 0xd08ec386 -//.word 0x094f7f9a -//.word 0x33d906d2 -//.word 0x63feb5a7 -//.word 0x7f1c457f -//.word 0xa4ef4d22 -//.word 0xc4a90871 -//.word 0x94455956 -//.word 0xa5180cf7 -//.word 0xd0a95f2f -//.word 0xd8c2c13e -//.word 0x4bc7d9bf -//.word 0xa947cadb -//.word 0xc8d1b6bd -//.word 0x77098145 -//.word 0x62fad701 -//.word 0x36ae7059 -//.word 0x05fc9209 -//.word 0xeba2d8d5 -//.word 0xf2943377 -//.word 0x33932edd -//.word 0x3e007691 -//.word 0xbcf39979 -//.word 0x53880ec0 -//.word 0xca797614 -//.word 0x6ef22112 -//.word 0xb4a0d4fe -//.word 0x1f0cc9b8 -//.word 0x6427f8eb -//.word 0xcd259588 -//.word 0xdb8fda73 -//.word 0x2f94067c -//.word 0xaaa1a690 -//.word 0xd4311330 -//.word 0x7ae53c23 -//.word 0x9cd7a568 -//.word 0x862cb06f -//.word 0x3ce81c89 -//.word 0x1b06cb9c -//.word 0xbec9c81b -//.word 0x1f4d8835 -//.word 0xfe61704d -//.word 0x879998ab -//.word 0x2f9ecf71 -//.word 0xdfc9dfd0 -//.word 0x54f0127b -//.word 0xc680f45c -//.word 0xc7cc5b87 -//.word 0x6fa5a56c -//.word 0xb62b4150 -//.word 0x21e271fe -//.word 0xa1094db9 -//.word 0xb8270c76 -//.word 0xdde67f48 -//.word 0x2224de1c -//.word 0x1448c7a6 -//.word 0xe2d2849b -//.word 0xc2378d21 -//.word 0x91eb4d84 -//.word 0xb9bf292a -//.word 0x586dbfc9 -//.word 0x9f716bd7 -//.word 0x781b1042 -//.word 0x6be31562 -//.word 0xc2fcad2c -//.word 0xeb2c5ca8 -//.word 0x1fdab7a5 -//.word 0x41696bab -//.word 0x09c48031 -//.word 0x613adf10 -//.word 0x0f8d1238 -//.word 0x95454ca1 -//.word 0x554aa985 -//.word 0xf9b2b6cd -//.word 0x12d834c9 -//.word 0xffae1923 -//.word 0x1154d816 -//.word 0xede9e2db -//.word 0x31a16d64 -//.word 0x5a17744d -//.word 0xe5e5ff10 -//.word 0xb473a478 -//.word 0xb40c4e58 -//.word 0xbd373d7c -//.word 0xb9444ee0 -//.word 0x09257d20 -//.word 0x247fa830 -//.word 0x8101964d -//.word 0xb8f53733 -//.word 0xe4142d91 -//.word 0x4b9f8cba -//.word 0x41abde9d -//.word 0x49bd6bf7 -//.word 0x7e96b7c7 -//.word 0x31504b03 -//.word 0xd4aab889 -//.word 0x16a1da58 -//.word 0x50405a00 -//.word 0x20b87657 -//.word 0x53b3056e -//.word 0x09e6b5c3 -//.word 0x13e598b8 -//.word 0xa03cdf44 -//.word 0x19bbe5e9 -//.word 0x49116fe6 -//.word 0xc19d32ad -//.word 0x7b809597 -//.word 0xbdf7b9d7 -//.word 0x40e8b6ad -//.word 0x92ba28dc -//.word 0xb96aeb5d -//.word 0x19db2255 -//.word 0x986e7e45 -//.word 0xffd3bd80 -//.word 0xa31f70e3 -//.word 0x461e02c0 -//.word 0x38eaf61b -//.word 0xc1bc7019 -//.word 0xc403f7b5 -//.word 0x9cb379b5 -//.word 0x4ae08fdc -//.word 0xd28b0362 -//.word 0xe2bc90a1 -//.word 0xb5d1e811 -//.word 0x3715fc76 -//.word 0x6a947758 -//.word 0x082e8bb4 -//.word 0x6aebf1f1 -//.word 0xa88e2b15 -//.word 0x026d0d39 -//.word 0x7e7f7b3b -//.word 0xd3b774b2 -//.word 0x86905027 -//.word 0x53ea4582 -//.word 0xce1430c2 -//.word 0x4a2a92f1 -//.word 0xfaa1d957 -//.word 0x5620e2ef -//.word 0xc091bb17 -//.word 0x6879ad8b -//.word 0x6d847a94 -//.word 0x4565e37d -//.word 0x5edc6d47 -//.word 0x0518659e -//.word 0x8840220b -//.word 0x974d8a6a -//.word 0xf01ad89f -//.word 0x3cbe9c85 -//.word 0x33190227 -//.word 0x07ad5833 -//.word 0x00afcbab -//.word 0x635e71de -//.word 0x99948d97 -//.word 0x8d9b0e94 -//.word 0x56415839 -//.word 0x162f4786 -//.word 0x22767147 -//.word 0x636bac8a -//.word 0xfcb5d156 -//.word 0x2ca4bf9a -//.word 0x76c5a264 -//.word 0x00b37553 -//.word 0x3a2fc54f -//.word 0xbf73b877 -//.word 0x80c44f5b -//.word 0x1f47e86c -//.word 0x991507b1 -//.word 0x289155bb -//.word 0x68fae9da -//.word 0xb83cc791 -//.word 0xe30ca648 -//.word 0x0033f741 -//.word 0x962a22cd -//.word 0x04e813c0 -//.word 0x20f8f522 -//.word 0x1fce3d27 -//.word 0xb55beb61 -//.word 0x7cdf0c35 -//.word 0x9aff848c -//.word 0x9f170aca -//.word 0xacd17404 -//.word 0xdaf7356e -//.word 0xd9852412 -//.word 0xd8037fc8 -//.word 0xa5112f62 -//.word 0x16444d27 -//.word 0xa730e683 -//.word 0x64c6fbfc -//.word 0x0ae1cc68 -//.word 0x691b575d -//.word 0x0ce51bea -//.word 0x1cd72184 -//.word 0x82443d43 -//.word 0x4c12924f -//.word 0x52c85495 -//.word 0x19e9d2be -//.word 0xf781b361 -//.word 0x78fd7f77 -//.word 0x013f6210 -//.word 0xb3f22d45 -//.word 0x921b9e6e -//.word 0xe7f1e195 -//.word 0xe3ef562a -//.word 0x842795f7 -//.word 0xbdd9b057 -//.word 0xd144b8a3 -//.word 0x00bc82ee -//.word 0x65fdaaf2 -//.word 0x1fbfd949 -//.word 0xaf8b44e1 -//.word 0xa1cc75aa -//.word 0x6f294e91 -//.word 0xa2124bb2 -//.word 0x3a9907c9 -//.word 0x508402ea -//.word 0xfaa0a173 -//.word 0x6f58763e -//.word 0x6b85c21b -//.word 0xd588387d -//.word 0xa0970473 -//.word 0xef540cda -//.word 0x7ca476d2 -//.word 0x3abe6a6e -//.word 0x398219b0 -//.word 0xca0dfeb4 -//.word 0xe58a632b -//.word 0xc74a280b -//.word 0xdf18c085 -//.word 0xebc67c38 -//.word 0x5f0c0ca4 -//.word 0x069343e1 -//.word 0xeb4c1a90 -//.word 0x7a06f813 -//.word 0xe34030f9 -//.word 0xbf3bcbbc -//.word 0xf65489af -//.word 0xe0912232 -//.word 0xaa7ad128 -//.word 0xfc2a13ab -//.word 0xd8a5adfe -//.word 0xc66cecc2 -//.word 0x2e4f306d -//.word 0x0583acf9 -//.word 0xabf467d9 -//.word 0x14dc8631 -//.word 0x2795ce46 -//.word 0x63ac6534 -//.word 0xc836d8df -//.word 0xf567622b -//.word 0x8e606c70 -//.word 0xe0495028 -//.word 0xc8a062eb -//.word 0xd0d0319e -//.word 0x9c060ae7 -//.word 0x8540bee3 -//.word 0x83a7a51c -//.word 0x501ee3b5 -//.word 0xca1beae8 -//.word 0x9ab541b3 -//.word 0x13ff83cd -//.word 0x5c95aadf -//.word 0xd2748df1 -//.word 0xa80fa822 -//.word 0xd09f1c9d -//.word 0x1fbaf6c8 -//.word 0xac27b4bf -//.word 0x79f10600 -//.word 0x55bad168 -//.word 0x0052795e -//.word 0x9188604e -//.word 0x1540aa59 -//.word 0x79c6444a -//.word 0xaa6224cc -//.word 0xfa2dd2db -//.word 0xc6222779 -//.word 0x557854a2 -//.word 0x04302781 -//.word 0xa0ea8ae4 -//.word 0x14fc4dee -//.word 0x44c5250b -//.word 0x383ff429 -//.word 0x7dd44a26 -//.word 0xc8732c84 -//.word 0xdde21564 -//.word 0xaf563bb2 -//.word 0xc941139d -//.word 0xec6b174a -//.word 0xfa44c7c9 -//.word 0x1279ee48 -//.word 0xfdc52686 -//.word 0xc90a9e8b -//.word 0xb3a01b97 -//.word 0x4bec3d58 -//.word 0xd235045f -//.word 0xe7b492d5 -//.word 0x63ea336a -//.word 0x81379a8f -//.word 0x42a76ee5 -//.word 0x0f0f05f5 -//.word 0xa0596f21 -//.word 0x1e1cb6da -//.word 0x84706414 -//.word 0x4b0046f7 -//.word 0x466070d8 -//.word 0xcba18167 -//.word 0x1323282a -//.word 0xe3abe72a -//.word 0x6cb517ec -//.word 0x710c2da2 -//.word 0xa7973ba3 -//.word 0x6176ba19 -//.word 0x6c4e86f9 -//.word 0x38e02a39 -//.word 0x39e15e3d -//.word 0x8d05ce92 -//.word 0xdf5e1dde -//.word 0x8be42a17 -//.word 0x035592f4 -//.word 0x713f76a1 -//.word 0x9e5a7eb7 -//.word 0x121c1d6b -//.word 0x7d881706 -//.word 0x55474195 -//.word 0xc1f988e1 -//.word 0xb6cd35a1 -//.word 0x5f4f70ef -//.word 0xc38202f9 -//.word 0xa22f5ff9 -//.word 0x9f7ce367 -//.word 0xa5c05c6c -//.word 0x8396c99b -//.word 0xd93161dc -//.word 0x38efd7a8 -//.word 0x8530dd7c -//.word 0x9e68e787 -//.word 0x407331a6 -//.word 0x29290393 -//.word 0x7933345a -//.word 0x5e1ded0c -//.word 0xf0abafb6 -//.word 0x5a719794 -//.word 0x3b9ee183 -//.word 0x4c19acb5 -//.word 0x42cffca8 -//.word 0xf64b0559 -//.word 0xc387a7b5 -//.word 0x2f013550 -//.word 0xce127a59 -//.word 0x647bfece -//.word 0x4a4185ec -//.word 0x13bcd9ea -//.word 0x6eeac9e6 -//.word 0x4e097220 -//.word 0x4964bd66 -//.word 0x3e6d29cf -//.word 0x3b0ccbac -//.word 0x9e3793bc -//.word 0x7ac3d09f -//.word 0x3c79f68d -//.word 0x8e6d9f48 -//.word 0x7b8bd14f -//.word 0xd4737f55 -//.word 0xd38752f1 -//.word 0xff41a997 -//.word 0x4fcbdec7 -//.word 0x92c9cb84 -//.word 0x0e798c08 -//.word 0x68ff87b6 -//.word 0xc4faaa50 -//.word 0x2c5bf46a -//.word 0x3677371f -//.word 0xe15b1c02 -//.word 0xc15f6757 -//.word 0x5cfe7c84 -//.word 0xd3e422c2 -//.word 0xc5498818 -//.word 0x707e868a -//.word 0x19c5248e -//.word 0xae6660bf -//.word 0xabff2cd5 -//.word 0x3a1cb7d5 -//.word 0x9e07ed85 -//.word 0xd1e24123 -//.word 0x6cf2aa56 -//.word 0xc83eeb65 -//.word 0x635918a7 -//.word 0x857c563b -//.word 0x23d7e2f8 -//.word 0x032955a7 -//.word 0x218f2670 -//.word 0x52997093 -//.word 0x27a3f559 -//.word 0x14636449 -//.word 0xd1bed79e -//.word 0x01e0a0f9 -//.word 0x128b4554 -//.word 0x64afc937 -//.word 0xad3c2d2e -//.word 0x9c34377a -//.word 0xbc047207 -//.word 0x9c14769e -//.word 0x2d9d695c -//.word 0x6bbbc663 -//.word 0x3fc35dcf -//.word 0xa4d69cec -//.word 0x0ab60ca6 -//.word 0xf7d91e40 -//.word 0xf4bc2849 -//.word 0xa77aabcc -//.word 0x3d9dd7c8 -//.word 0x0b3451df -//.word 0x74263352 -//.word 0x0dc5552d -//.word 0xffa6cbbf -//.word 0xadb1ae4d -//.word 0x97742008 -//.word 0x7ebc8a3b -//.word 0xca6728c9 -//.word 0x2874c8d7 -//.word 0x775ccec6 -//.word 0xe5a57c64 -//.word 0x55b47063 -//.word 0x05e36e0a -//.word 0x6dd3602a -//.word 0x6a049b54 -//.word 0x9ba26449 -//.word 0x0ba2b3b2 -//.word 0x110e3711 -//.word 0x759d99f8 -//.word 0xd4870579 -//.word 0x4697e7dd -//.word 0x3d82f298 -//.word 0xb177677d -//.word 0x7af7942f -//.word 0xfde79bd8 -//.word 0x0ae4741d -//.word 0x05d63551 -//.word 0x44c891e8 -//.word 0xb9f79f2f -//.word 0xd128dd3b -//.word 0x9b3f751f -//.word 0x2d0ebf63 -//.word 0x446b06b1 -//.word 0x2a858fd0 -//.word 0xdd78d7d7 -//.word 0x6d1e1d9a -//.word 0xa6282069 -//.word 0xef6e2afa -//.word 0x72844da3 -//.word 0x7d8eedcc -//.word 0x28557fa5 -//.word 0x399a8f14 -//.word 0x44aa08f2 -//.word 0x1732b076 -//.word 0x5555f2f1 -//.word 0x60fce0bc -//.word 0x7c6d786f -//.word 0x32202654 -//.word 0xf3cd8b1c -//.word 0xfeca7dd0 -//.word 0x84944f0a -//.word 0x09ac5264 -//.word 0x0da49b31 -//.word 0xec79076b -//.word 0x03237ded -//.word 0x146b73e2 -//.word 0xebfdb47e -//.word 0x42be60ec -//.word 0xe35f3487 -//.word 0x0c330b4c -//.word 0x173da58f -//.word 0x5a8ea8ee -//.word 0x4dcee484 -//.word 0xea18db5f -//.word 0x5a0b8133 -//.word 0xcd1d404f -//.word 0xaa333fd1 -//.word 0xe86fe416 -//.word 0xbb499875 -//.word 0x74e2ca2d -//.word 0xa294369b -//.word 0x7ece67b1 -//.word 0x861f7aa3 -//.word 0x679026e3 -//.word 0x2037f950 -//.word 0x6509e4ab -//.word 0x41f0fa4a -//.word 0x001e7510 -//.word 0x4ca0fa9c -//.word 0x96361ec1 -//.word 0xb8622836 -//.word 0xd8bf188f -//.word 0x8f94e96c -//.word 0x4aa914f1 -//.word 0xf1595576 -//.word 0xc7e9b17f -//.word 0x9218b8ee -//.word 0xfbf70877 -//.word 0x37fb1255 -//.word 0xe751213b -//.word 0x3d71988e -//.word 0x61f67ad1 -//.word 0x13ad3061 -//.word 0x91ec8762 -//.word 0xbb25f9f9 -//.word 0x75ba2dbb -//.word 0x4d13c166 -//.word 0x5eef46cf -//.word 0x73f78c1c -//.word 0x70992033 -//.word 0xee131473 -//.word 0x26cefea1 -//.word 0x10ee4325 -//.word 0xcc279676 -//.word 0x40d2bbd3 -//.word 0x03409134 -//.word 0x794e4f80 -//.word 0x40390e00 -//.word 0xcbb48814 -//.word 0x4d381f24 -//.word 0xd99c21da -//.word 0xc7e54a8e -//.word 0x595f8a02 -//.word 0x9fed0950 -//.word 0x979d6920 -//.word 0x997f4b1e -//.word 0xf2b814ac -//.word 0xd0d2f1d3 -//.word 0x5e561880 -//.word 0x2f9d51ed -//.word 0xe0e3b55d -//.word 0xf99db60c -//.word 0x150c6066 -//.word 0x4313df77 -//.word 0xab4640a3 -//.word 0x75437c97 -//.word 0xe645b27f -//.word 0xccf6b479 -//.word 0x1d85c54a -//.word 0xdbf9a151 -//.word 0x3ac5beb9 -//.word 0x059cd2f2 -//.word 0x3e869561 -//.word 0x0534c856 -//.word 0xba90763f -//.word 0x66997a1c -//.word 0x576e4133 -//.word 0x0ba8d105 -//.word 0x50ed0a80 -//.word 0xa8c32c76 -//.word 0xf2a19a4e -//.word 0x474cdefa -//.word 0x2361ec29 -//.word 0xc52dabbd -//.word 0xd8c5b17f -//.word 0x52534e11 -//.word 0x9dafcd25 -//.word 0xf52ff6ed -//.word 0x11bfd8d2 -//.word 0x0534c569 -//.word 0x67dd9da3 -//.word 0xb05b5044 -//.word 0xe6b39e96 -//.word 0x78a2215e -//.word 0x6a318e0f -//.word 0xb188383e -//.word 0xe107d556 -//.word 0x0593858d -//.word 0xce2e1016 -//.word 0xf1cb6f98 -//.word 0xca608fe0 -//.word 0x453c51d3 -//.word 0xfe9bd5a6 -//.word 0xa778f851 -//.word 0xaba21b40 -//.word 0x1012274c -//.word 0xa27ccdeb -//.word 0x4e2413a3 -//.word 0xccf30cc5 -//.word 0x81cae657 -//.word 0xa3162b52 -//.word 0x9ea5400e -//.word 0xb6b832fa -//.word 0xee59b190 -//.word 0x29ee5d88 -//.word 0x900f414c -//.word 0x33959dad -//.word 0xf3f3e9d4 -//.word 0x9fca167b -//.word 0x5db7175d -//.word 0x4c70a0ea -//.word 0x670f2e40 -//.word 0xadad4757 -//.word 0x7f33037b -//.word 0x496dcb00 -//.word 0x64606131 -//.word 0x3bde2089 -//.word 0xad578626 -//.word 0xb3f2ef7a -//.word 0x43dca344 -//.word 0x74e013be -//.word 0xe2396018 -//.word 0x54a41d26 -//.word 0x9cb95656 -//.word 0xbf7ad1e4 -//.word 0x562d9351 -//.word 0x3467a611 -//.word 0x496a1a84 -//.word 0xc6b04a27 -//.word 0x82c8610c -//.word 0x9d611c87 -//.word 0x63a5d12b -//.word 0x73c8b0f4 -//.word 0x20e049c6 -//.word 0x17f74e16 -//.word 0x425e9ae7 -//.word 0xed4573f9 -//.word 0x28890c3d -//.word 0x6ccd4e8b -//.word 0x81ccd897 -//.word 0x9eed4522 -//.word 0xd319ad6d -//.word 0xa4c96ef3 -//.word 0xf7632c57 -//.word 0x30c6169c -//.word 0x9a236b94 -//.word 0x09103d9b -//.word 0xbdd77685 -//.word 0x8a1418d4 -//.word 0x367fc92e -//.word 0x23068e0f -//.word 0x2d1fd7bc -//.word 0xd65cbc78 -//.word 0xa13f86f9 -//.word 0xbb51711d -//.word 0xe06eb0da -//.word 0x7d63b273 -//.word 0x12bba4f2 -//.word 0xdbd537d2 -//.word 0xaf3aa3fc -//.word 0x282eecf5 -//.word 0x04856355 -//.word 0xcbb8717b -//.word 0xb238907f -//.word 0xc0029a68 -//.word 0x2f74469f -//.word 0x155fefa4 -//.word 0x445d9800 -//.word 0x6e652e7b -//.word 0x8d9c0c8e -//.word 0x816ec51b -//.word 0xfbde1d5c -//.word 0x9b1a581a -//.word 0x5553b81f -//.word 0x19cb41ed -//.word 0xb330bfb0 -//.word 0xf0280a72 -//.word 0x022d898e -//.word 0x259bf567 -//.word 0x83075f59 -//.word 0x55d375f0 -//.word 0x4cff0158 -//.word 0x2f42b215 -//.word 0xc55a1ff4 -//.word 0xf5a00942 -//.word 0x2cdfe03b -//.word 0xff6689c5 -//.word 0x125c5f5f -//.word 0x38547854 -//.word 0xdb212934 -//.word 0x9feccc84 -//.word 0x4284c0b5 -//.word 0xc7f4b253 -//.word 0xd35b1b7f -//.word 0x57f80a9f -//.word 0x6f852454 -//.word 0x8ac6e9ad -//.word 0xcc61399a -//.word 0xb0f016a3 -//.word 0xf255abd9 -//.word 0xac4d8d0d -//.word 0xbf494241 -//.word 0x7479005c -//.word 0x6329b622 -//.word 0x94505162 -//.word 0xe5663871 -//.word 0xab7718d8 -//.word 0x9c76e74a -//.word 0xedd323d9 -//.word 0xb74f5b69 -//.word 0x9f10f164 -//.word 0xb6f01eaf -//.word 0x9e1b36dd -//.word 0xefd92ea3 -//.word 0xd8a85b8c -//.word 0x0a8e7cee -//.word 0xd1adfb1d -//.word 0x841870de -//.word 0x20e5671f -//.word 0x308463e5 -//.word 0xf04f2385 -//.word 0xb1612317 -//.word 0x7fac6628 -//.word 0x024673af -//.word 0xa2049e42 -//.word 0xee4a888a -//.word 0x3f21e9f5 -//.word 0x988a8daa -//.word 0xd1139dc2 -//.word 0xf5a720b5 -//.word 0xe8aac112 -//.word 0x4d46d374 -//.word 0xa6ff92b1 -//.word 0xbd8eac54 -//.word 0x44ec004e -//.word 0xb8ada5e8 -//.word 0x8b8f2efc -//.word 0x81532c65 -//.word 0x5bcbf5b4 -//.word 0xb335a424 -//.word 0x27c761d1 -//.word 0xb98be324 -//.word 0x766d3292 -//.word 0x5693b286 -//.word 0x64ec5d9b -//.word 0x1e0c500f -//.word 0x1f378975 -//.word 0xfbbbefa9 -//.word 0x6b839209 -//.word 0xaaea35e2 -//.word 0x1ecd0a29 -//.word 0x3be4bc6c -//.word 0xa552b207 -//.word 0x947a939b -//.word 0x7d1505bc -//.word 0xef81bbea -//.word 0xbb5caec3 -//.word 0x5752aa76 -//.word 0x84330d7b -//.word 0x2f49cc82 -//.word 0x95e8b6a9 -//.word 0xab46fdf1 -//.word 0xbd8df2f3 -//.word 0x552f10cf -//.word 0x5e7a3c66 -//.word 0x896c4bc9 -//.word 0xf0c8c5f0 -//.word 0xfa69e8b0 -//.word 0x7ed7f0e7 -//.word 0x2b1896fa -//.word 0x27c9d781 -//.word 0xf66df640 -//.word 0x9e04c45a -//.word 0x08e01fc1 -//.word 0xaab4b9f1 -//.word 0x63ee1bde -//.word 0xa646e92a -//.word 0xdb97679c -//.word 0x02ee3cce -//.word 0x9ae17625 -//.word 0xc123cf06 -//.word 0x9c552e47 -//.word 0xf91e71e4 -//.word 0x337d6af4 -//.word 0x565e27db -//.word 0x846c77c0 -//.word 0x9827a942 -//.word 0x08369766 -//.word 0x10fee4d4 -//.word 0x0d738144 -//.word 0x272e7633 -//.word 0x32c1dfda -//.word 0xd6473460 -//.word 0xee3fce4f -//.word 0x2f9aa745 -//.word 0x0a1262ec -//.word 0xd3be8b2b -//.word 0x22e31f9e -//.word 0x7a0e4f44 -//.word 0x285f8178 -//.word 0x6e289823 -//.word 0xe1b7752f -//.word 0x106fbd3f -//.word 0x661edd9d -//.word 0x528a4c73 -//.word 0xa44d103f -//.word 0x3be38481 -//.word 0xdd0258b6 -//.word 0x6629d98a -//.word 0x257c734a -//.word 0x83cf7498 -//.word 0xe5011262 -//.word 0xd48bb015 -//.word 0x5c585d0d -//.word 0xb1d89e51 -//.word 0x19506d7d -//.word 0x057481ff -//.word 0x8137d086 -//.word 0xcfe253b8 -//.word 0x4f630924 -//.word 0xa3e83e77 -//.word 0x0fad0df2 -//.word 0x2612241b -//.word 0xa3f1c7b3 -//.word 0x952e18e9 -//.word 0xbf9095cd -//.word 0x3ecfe207 -//.word 0x6ceec9c9 -//.word 0x05ca7f02 -//.word 0x88f428d5 -//.word 0xe0bc9e49 -//.word 0x448e6e42 -//.word 0x5c8224b0 -//.word 0xa52ec906 -//.word 0x16bfa9ee -//.word 0x04485a3a -//.word 0x4359f91e -//.word 0x8ed4b79d -//.word 0x28fc9442 -//.word 0xc4cf6b10 -//.word 0xa3962fbb -//.word 0xfcba7419 -//.word 0xa0d931d3 -//.word 0xde19c460 -//.word 0xa4bc3634 -//.word 0xe8f5c134 -//.word 0x46fa8f6e -//.word 0xeb5bc507 -//.word 0xb192c074 -//.word 0x8bdb9eed -//.word 0x2446011f -//.word 0xc30a0f22 -//.word 0x721cbeaa -//.word 0x5f004e81 -//.word 0x82e01735 -//.word 0x80db840e -//.word 0xd09f6042 -//.word 0x1c3a506c -//.word 0xea2da13b -//.word 0x7bc24467 -//.word 0xf3a017ea -//.word 0xbb9d676c -//.word 0x24d3b2ff -//.word 0x4df6b10c -//.word 0x46e5958d -//.word 0x757e927d -//.word 0x39b79a8d -//.word 0xceea6b19 -//.word 0x7171cb5a -//.word 0xc47312dd -//.word 0x73fdea34 -//.word 0x185553eb -//.word 0x5c8beabe -//.word 0x5f506a08 -//.word 0x5b0b737f -//.word 0x842a8a1f -//.word 0x32b66264 -//.word 0x412b59bc -//.word 0xb886463c -//.word 0xaa9f7292 -//.word 0x5ab9e43b -//.word 0xa258e2f6 -//.word 0x9653b478 -//.word 0x6429ab61 -//.word 0x7f98626f -//.word 0xfc6c44f1 -//.word 0x3c964e7f -//.word 0xcb7d16e9 -//.word 0x88990d6d -//.word 0x063d012d -//.word 0x33b4e6e0 -//.word 0x3790d5c7 -//.word 0x9f3f55e2 -//.word 0xbbdfda65 -//.word 0x44538b66 -//.word 0x429748d8 -//.word 0x2d50ecbc -//.word 0x53a8cf96 -//.word 0x7958901e -//.word 0xc5061139 -//.word 0xdcd2c227 -//.word 0x472c23fe -//.word 0x1be88457 -//.word 0xd9940f47 -//.word 0x93090991 -//.word 0x50405519 -//.word 0xb2673a9c -//.word 0xd634669f -//.word 0x7c7a32a5 -//.word 0x68fa27a5 -//.word 0x087bc1bb -//.word 0x561d741e -//.word 0x00eaed52 -//.word 0xc6ae9a9f -//.word 0x24086cc1 -//.word 0x32c2dce1 -//.word 0xc85e2cc4 -//.word 0xe5f1ef43 -//.word 0x5235cbfb -//.word 0x82d97e45 -//.word 0xbd1b1f69 -//.word 0x7e99a60e -//.word 0x1964aff5 -//.word 0xa0577be7 -//.word 0x08a738ec -//.word 0x88ba82be -//.word 0x423d297d -//.word 0x257135a4 -//.word 0x12c5273c -//.word 0x3daa8250 -//.word 0xd7a38aa0 -//.word 0xea9b4c99 -//.word 0x847cde85 -//.word 0x17fde800 -//.word 0x20bc63ab -//.word 0x078ca124 -//.word 0x46108e35 -//.word 0xce89354b -//.word 0xa6ec862a -//.word 0xd63856e0 -//.word 0x8306a7f7 -//.word 0x5b612aef -//.word 0x34d902ec -//.word 0xefd3cbab -//.word 0xa323dbba -//.word 0xf8ddc7e9 -//.word 0xd06729fc -//.word 0x2dd3a1a2 -//.word 0x4f6c1aab -//.word 0x1c8f4f75 -//.word 0xc5bd8da7 -//.word 0xa7edba22 -//.word 0x6f279635 -//.word 0x824e4110 -//.word 0x9c3efe7c -//.word 0xb61736c9 -//.word 0x2ed7c007 -//.word 0x222f5f79 -//.word 0x1c8f8c46 -//.word 0xf5847672 -//.word 0xf343480d -//.word 0x3586aaaa -//.word 0x51968a13 -//.word 0x3ba91c3b -//.word 0x696f1f74 -//.word 0x34e863e2 -//.word 0x82788830 -//.word 0xa23d0881 -//.word 0x77a078aa -//.word 0xd92a0a9e -//.word 0x389a5729 -//.word 0x82345be2 -//.word 0x475bc15b -//.word 0x1c62619a -//.word 0x3da008cd -//.word 0x76c27739 -//.word 0x4365ae74 -//.word 0x36e56ad4 -//.word 0x996fec27 -//.word 0x555efca4 -//.word 0x12c42e22 -//.word 0xa0466488 -//.word 0x952e9485 -//.word 0x38bbcb81 -//.word 0x9ebb72d3 -//.word 0x135cd134 -//.word 0xbc40d173 -//.word 0x7acf066b -//.word 0x10d1ec33 -//.word 0x893c7194 -//.word 0xd44ab4c0 -//.word 0xb2cf0d40 -//.word 0xd2ca4d2f -//.word 0x393a47a6 -//.word 0xe8338f77 -//.word 0xb930811e -//.word 0x8bab85f4 -//.word 0x9eeb92a6 -//.word 0x401ef1e6 -//.word 0xaaa74460 -//.word 0x25b9c6f0 -//.word 0x7125d412 -//.word 0x6670ad9a -//.word 0xdc2976a5 -//.word 0xc97981cf -//.word 0xa9fccea6 -//.word 0x23cfd25f -//.word 0xe9eb78c8 -//.word 0xe0b1667e -//.word 0x81c58160 -//.word 0x7f20b343 -//.word 0xa961ece8 -//.word 0x1364662b -//.word 0x70162e7c -//.word 0xc388e093 -//.word 0x3742b160 -//.word 0x4ad9b341 -//.word 0x31c45578 -//.word 0x786b29dc -//.word 0xea81ebce -//.word 0xb094be6f -//.word 0xbde2b811 -//.word 0x696fa1eb -//.word 0x5b54f810 -//.word 0xad5a37a2 -//.word 0x4bc75942 -//.word 0x9c7898cc -//.word 0x65307b41 -//.word 0xea301005 -//.word 0x5608764b -//.word 0x5cac9fcd -//.word 0x1fca54c0 -//.word 0x4f5b7a07 -//.word 0x957993a7 -//.word 0x3270887b -//.word 0xe317a529 -//.word 0x0761e554 -//.word 0x032f7013 -//.word 0xe66862a2 -//.word 0x494cce58 -//.word 0x7a0503d9 -//.word 0xd97f0d8d -//.word 0x817a7f51 -//.word 0x2bde706c -//.word 0x504ec4c4 -//.word 0x8effad52 -//.word 0x4dcb70d3 -//.word 0xa2816dc0 -//.word 0x74805a81 -//.word 0xdd84cfde -//.word 0xd2bf07b6 -//.word 0x072ce5f3 -//.word 0x0d2035bd -//.word 0xbd2235ee -//.word 0xdafc53c6 -//.word 0xf21239e1 -//.word 0x85f30765 -//.word 0x6a2edf80 -//.word 0x6d67a712 -//.word 0x3da90aa6 -//.word 0x86fec0a7 -//.word 0x5a3d10d1 -//.word 0xd52493e5 -//.word 0x01a63aa1 -//.word 0xf78692ef -//.word 0x4725475d -//.word 0x9a99e8cd -//.word 0x96fee96d -//.word 0x0211eeea -//.word 0x2bfb47e1 -//.word 0x866ab697 -//.word 0x96e679e9 -//.word 0x10638486 -//.word 0x3e120f5b -//.word 0xa17d504f -//.word 0xdad38a31 -//.word 0xcb8046ee -//.word 0xf901e008 -//.word 0x34f74643 -//.word 0x7b7afda2 -//.word 0x1aaf6591 -//.word 0x159d3d64 -//.word 0xc93c6900 -//.word 0xd1cff3d8 -//.word 0x2774511c -//.word 0x8bfae62c -//.word 0x29f2cb53 -//.word 0x7609ceb2 -//.word 0x5b95bb7a -//.word 0x956ddb5f -//.word 0x5cfebb49 -//.word 0x429b2e4c -//.word 0x5f1595da -//.word 0xab8c5e37 -//.word 0xab84cb2e -//.word 0x503bf503 -//.word 0x1c3b10a8 -//.word 0x862bf033 -//.word 0xa0eacc90 -//.word 0xf7df4373 -//.word 0xba8a9c91 -//.word 0x1f5f5210 -//.word 0x03d5d03c -//.word 0xd1ba797b -//.word 0xa4c9eb83 -//.word 0xb07e85ca -//.word 0xde29273e -//.word 0xb6423837 -//.word 0x82fceeaa -//.word 0xb01cc99f -//.word 0x790c61e5 -//.word 0xc02b6204 -//.word 0x3d68d573 -//.word 0xda0fa10b -//.word 0x5de251bc -//.word 0x486c177f -//.word 0xfd92118b -//.word 0x266bcccc -//.word 0x54520791 -//.word 0xe639b985 -//.word 0x2d4055e0 -//.word 0xce864cde -//.word 0x673ed371 -//.word 0x7506e832 -//.word 0x75758f9e -//.word 0x49f3627f -//.word 0xdece48a8 -//.word 0x0c8a85e5 -//.word 0xbd78f332 -//.word 0x528a8e2b -//.word 0x426536c4 -//.word 0x04b8b13a -//.word 0x30ccf04a -//.word 0xe15d93a0 -//.word 0x5da9af92 -//.word 0xf8c6ce0e -//.word 0x353837d1 -//.word 0x2fc370da -//.word 0x377e021f -//.word 0xbf297c7e -//.word 0x77c0baf6 -//.word 0xb5506717 -//.word 0x1a0ac1b7 -//.word 0x73969ce7 -//.word 0xddaaaa26 -//.word 0x2ddaf9d4 -//.word 0x8eb2bde9 -//.word 0x6c0250e6 -//.word 0x9179770c -//.word 0x8e75e7cc -//.word 0x5d1a0880 -//.word 0x44a2f858 -//.word 0xfcf3d397 -//.word 0x137732ff -//.word 0x8f28f189 -//.word 0xd4ea365a -//.word 0xc81eaef3 -//.word 0x34741aa8 -//.word 0x6e000b53 -//.word 0x3591e949 -//.word 0xdc3e3a8d -//.word 0xab412144 -//.word 0x82092569 -//.word 0xbf8a34c2 -//.word 0x62d8e813 -//.word 0x6ff40991 -//.word 0x94e55299 -//.word 0x0c0b78a2 -//.word 0xc3b16871 -//.word 0xbbe1d08c -//.word 0xae7ce2f0 -//.word 0xf58a5506 -//.word 0xa8ceacd4 -//.word 0x079dba70 -//.word 0x18f166bb -//.word 0x92baac4b -//.word 0xfa74e4a9 -//.word 0x0cfe47bd -//.word 0x5caaaf86 -//.word 0x3d919e0f -//.word 0xe229829e -//.word 0xc319372e -//.word 0x424bce1f -//.word 0x8f438d2d -//.word 0xc9b0369f -//.word 0x66418dc0 -//.word 0xd4ba1493 -//.word 0x604719c3 -//.word 0x5810f2d9 -//.word 0x6c0d88b1 -//.word 0x5a1c122f -//.word 0xcb51232e -//.word 0x778de7b9 -//.word 0x9052a97e -//.word 0x5ed5997f -//.word 0x2755cd0b -//.word 0x51ac85ed -//.word 0xca24b3e3 -//.word 0xa88bbb52 -//.word 0x0d8a7737 -//.word 0x4e327e61 -//.word 0x54d8a6de -//.word 0x4223c7b3 -//.word 0x5763c2d0 -//.word 0x1724c242 -//.word 0xa504c2ab -//.word 0x74c150ef -//.word 0x1e969031 -//.word 0x94c883fe -//.word 0x787c89c7 -//.word 0xc7cb2595 -//.word 0xbb1801f8 -//.word 0xf0a13240 -//.word 0xc555bcf0 -//.word 0x05e65970 -//.word 0xc71e7602 -//.word 0x92767ff7 -//.word 0xc5e55c23 -//.word 0x36f63c8e -//.word 0x1a1d916c -//.word 0x254b5b50 -//.word 0xf2c0aa9c -//.word 0xa4215e3c -//.word 0xceca3294 -//.word 0x9065f9b6 -//.word 0x03bb27d9 -//.word 0xd7cb9207 -//.word 0x3b197a15 -//.word 0xfd49c7d8 -//.word 0xf3ec9396 -//.word 0x999ae8bb -//.word 0xfb41cbcd -//.word 0xd6bc79a2 -//.word 0xfaa8f0d1 -//.word 0xf273b166 -//.word 0xe7b5c5da -//.word 0xc2c4fe42 -//.word 0x91837fc6 -//.word 0x2c7a7e55 -//.word 0x182c4997 -//.word 0xaba48723 -//.word 0x7152c1f3 -//.word 0xcf152114 -//.word 0xe69979a2 -//.word 0xbae386f4 -//.word 0x942a7714 -//.word 0xa5e9a972 -//.word 0xeb32b5d9 -//.word 0x5945aca1 -//.word 0x3261a127 -//.word 0xb6da687a -//.word 0x006c9e57 -//.word 0x2fcfe958 -//.word 0xc48b8168 -//.word 0x4b0ef07a -//.word 0x3efc167b -//.word 0x26c66f84 -//.word 0x037e9955 -//.word 0xeeea10ff -//.word 0xfdd73de0 -//.word 0x67afafd4 -//.word 0xe84ea8aa -//.word 0x6712dbd5 -//.word 0xd7317464 -//.word 0x5b505935 -//.word 0xad51af65 -//.word 0xc06ca10a -//.word 0xa4815c25 -//.word 0xabac5ed2 -//.word 0xca1bf1c2 -//.word 0x411cf2eb -//.word 0x7e7ad77e -//.word 0x3f0af11a -//.word 0xf881ed3f -//.word 0x7488a105 -//.word 0xbe13060e -//.word 0x42ee80b9 -//.word 0x30986698 -//.word 0x2155be25 -//.word 0xfd7f48b0 -//.word 0x1c1dbf9c -//.word 0xabb75bcb -//.word 0x52689a57 -//.word 0x13344083 -//.word 0x769c9cf1 -//.word 0xe3700e15 -//.word 0x4fe5c6e9 -//.word 0x1be7cee2 -//.word 0x38b04b23 -//.word 0x909a00f2 -//.word 0xa1311368 -//.word 0x6b8d146c -//.word 0x8ddf3be2 -//.word 0xab49f11f -//.word 0x12f392a0 -//.word 0x9f5b72fc -//.word 0xddec1e18 -//.word 0x6dd3e49a -//.word 0xab0e95a0 -//.word 0x8ec589b1 -//.word 0xd0dee4f4 -//.word 0x4fcc189f -//.word 0xb4a7abb3 -//.word 0x52823be7 -//.word 0x51f9bfe1 -//.word 0x0b090fac -//.word 0xb625a767 -//.word 0x4485a73a -//.word 0x87c21f8f -//.word 0x99a08a7e -//.word 0x7b2a9888 -//.word 0xfc053189 -//.word 0xdcfeb6e8 -//.word 0x32e58a11 -//.word 0x0b9ed125 -//.word 0x547577ef -//.word 0xfab2741b -//.word 0x4f6d4fa2 -//.word 0xb0a4e189 -//.word 0x658b5ccb -//.word 0xc8238c94 -//.word 0xa90e5caf -//.word 0xf2a29b42 -//.word 0x873c00b9 -//.word 0x70d76c00 -//.word 0x3add70f5 -//.word 0x9a3c0f1d -//.word 0x54bdc595 -//.word 0x5b92c84c -//.word 0x3a2d8d70 -//.word 0xb2598e26 -//.word 0xa5834b7e -//.word 0x33588ea6 -//.word 0x2296f45e -//.word 0x831ba9ab -//.word 0x924373d0 -//.word 0xdf70f27a -//.word 0xabea263b -//.word 0x95ea3139 -//.word 0x76f15e28 -//.word 0x895e6375 -//.word 0xcf40e3c4 -//.word 0xb169379d -//.word 0xe8c46e62 -//.word 0x9ae89285 -//.word 0xc5ec2df7 -//.word 0xe17d0ce4 -//.word 0xc12f439d -//.word 0xbb1172d6 -//.word 0x08844611 -//.word 0x6d4d425a -//.word 0x1be8bf35 -//.word 0xd51f31d5 -//.word 0x50dcad8e -//.word 0xdf3ca88d -//.word 0x50e402c7 -//.word 0x1098432f -//.word 0x960a242c -//.word 0xffef514a -//.word 0xf6586d30 -//.word 0xd74056d2 -//.word 0x1461abe7 -//.word 0xd74d8c9e -//.word 0xe9b9a18c -//.word 0xd21c5ee9 -//.word 0x427985fd -//.word 0xaf78ecd5 -//.word 0x40bc803a -//.word 0xea718ae4 -//.word 0xd92431ea -//.word 0x11d8407d -//.word 0x55562ad6 -//.word 0x47c44c6d -//.word 0xd279716c -//.word 0xc5109b63 -//.word 0xc0bb013d -//.word 0x54da5473 -//.word 0x66cd467f -//.word 0xd4064d94 -//.word 0x5c62a48c -//.word 0xb9b99422 -//.word 0x0eb4f161 -//.word 0x88dee75c -//.word 0x3ffef720 -//.word 0x5ea53ce7 -//.word 0x8403f38e -//.word 0x6afe3a49 -//.word 0xc5861896 -//.word 0x6e22be6f -//.word 0xc0cf0cc4 -//.word 0x410b5728 -//.word 0x852d6acb -//.word 0x50f7caa8 -//.word 0xfb6e3fff -//.word 0x19e98f06 -//.word 0x5a698ddc -//.word 0xaf2852be -//.word 0xae75cb7d -//.word 0x39be742f -//.word 0x5aef6225 -//.word 0x72fb871e -//.word 0x93b732ba -//.word 0x2aefd532 -//.word 0xe1b40b45 -//.word 0xc3f3d976 -//.word 0xa14c3474 -//.word 0xb520c4da -//.word 0x86ece818 -//.word 0x0bd6fab1 -//.word 0x1386d4a8 -//.word 0xe5379334 -//.word 0x230e9bbb -//.word 0xf4aadbfe -//.word 0x61fc5292 -//.word 0x0059d18f -//.word 0xd0cd038c -//.word 0x65b3acca -//.word 0x45822eaf -//.word 0x91ea5176 -//.word 0xe8204326 -//.word 0x8876dec0 -//.word 0xb62e2abd -//.word 0x619023b7 -//.word 0x023abc67 -//.word 0xc6b823cf -//.word 0xef5447b8 -//.word 0x772f985f -//.word 0xf7910d6c -//.word 0xc87e6c23 -//.word 0x688ac6de -//.word 0x1fee40bb -//.word 0xe2da1a92 -//.word 0x770de92a -//.word 0xdaa427ac -//.word 0xe02fee57 -//.word 0x1a0a0176 -//.word 0xfceb0c8f -//.word 0x3eb72dde -//.word 0x839ab201 -//.word 0x395625f5 -//.word 0xc0db8641 -//.word 0xce19d771 -//.word 0x1212dec6 -//.word 0x1733262c -//.word 0x6ce4476c -//.word 0x025e67a3 -//.word 0xd5bc01f3 -//.word 0xce55e578 -//.word 0xe84a807e -//.word 0x935b5ef1 -//.word 0x56ffed14 -//.word 0xb7b38476 -//.word 0x5f92a323 -//.word 0x7a267d17 -//.word 0x5d7eb3f8 -//.word 0x6b806304 -//.word 0x39816148 -//.word 0xf013c412 -//.word 0xf31ea5aa -//.word 0xc233233d -//.word 0x1f1caa1a -//.word 0x6fb87621 -//.word 0x62065277 -//.word 0xd67fa67f -//.word 0xf9a9b006 -//.word 0xaee912be -//.word 0x33988dee -//.word 0x005a0c67 -//.word 0xf2abe4ba -//.word 0xa8bb5aa8 -//.word 0x2e7c66da -//.word 0xd8f9b6d3 -//.word 0x71e9f622 -//.word 0x95844fdc -//.word 0x5c952d49 -//.word 0x39d146de -//.word 0x2167d86b -//.word 0xefd83196 -//.word 0x07097588 -//.word 0x39979ce6 -//.word 0xe96aba03 -//.word 0x6d8d8354 -//.word 0xb73c0e24 -//.word 0x343fd988 -//.word 0xf3770e96 -//.word 0x0ab704d2 -//.word 0x36d509e9 -//.word 0xc1005fa2 -//.word 0xa9538411 -//.word 0xfeabb60e -//.word 0x8cb6b7e5 -//.word 0xba4dce4f -//.word 0xb2040ea1 -//.word 0xc2ffda44 -//.word 0x0207a965 -//.word 0x38dc07ed -//.word 0xf8cdddb4 -//.word 0x1087f1f1 -//.word 0x232bb0f6 -//.word 0x93a32c1a -//.word 0xa43561f6 -//.word 0xdf58bcd4 -//.word 0xb5c7de64 -//.word 0x65d59db1 -//.word 0x20004b54 -//.word 0x6ac83be7 -//.word 0xc3c282bd -//.word 0x87e8fbd0 -//.word 0x13338efb -//.word 0x296cb16a -//.word 0x963f2e4e -//.word 0x119127d5 -//.word 0x67135859 -//.word 0xd5179dd8 -//.word 0xb5a3b4a4 -//.word 0x5ec4435b -//.word 0x45251d1a -//.word 0x68e0c1ee -//.word 0xec94248b -//.word 0x04b8b041 -//.word 0x162f8c2b -//.word 0x191c1eaa -//.word 0x42f7ce11 -//.word 0xdfe10da2 -//.word 0x833496ba -//.word 0x635ff448 -//.word 0x00f14583 -//.word 0x06f33ddd -//.word 0x747b6e32 -//.word 0xfe7ec646 -//.word 0xb0e6596e -//.word 0xd3e4608d -//.word 0x14888242 -//.word 0xe38f5360 -//.word 0x1a7c1b9f -//.word 0xdfead891 -//.word 0xcb2086d7 -//.word 0x4ce69d94 -//.word 0x4797dc22 -//.word 0x02784504 -//.word 0x4248691c -//.word 0xb018e51e -//.word 0x815d2d45 -//.word 0x56448845 -//.word 0x61455c80 -//.word 0xcafbac7c -//.word 0x5133df95 -//.word 0x3443c3ef -//.word 0x539dd1af -//.word 0x92a3b36b -//.word 0x7fbd03de -//.word 0x35a956e1 -//.word 0x80137997 -//.word 0x4166fae7 -//.word 0x14e1ea2f -//.word 0x31ede236 -//.word 0x90ae4463 -//.word 0x51d8c32d -//.word 0x5ac426d3 -//.word 0x42c3484d -//.word 0x6eb26482 -//.word 0x79ce8fbb -//.word 0xd9ca8658 -//.word 0xc01faac2 -//.word 0x41a449a0 -//.word 0xb45e1f4e -//.word 0x5b991d8a -//.word 0x46376971 -//.word 0x7349a5ab -//.word 0x3adc74e2 -//.word 0xe8153a78 -//.word 0xab812479 -//.word 0xaea669ce -//.word 0x84decfb4 -//.word 0xca65706d -//.word 0x08b0be35 -//.word 0xd900c578 -//.word 0x4c38b042 -//.word 0x89eb8ff7 -//.word 0xb8ba5744 -//.word 0x1edd2a55 -//.word 0x89ffd949 -//.word 0xef4fa8e3 -//.word 0x52d45182 -//.word 0xe6004b53 -//.word 0x76894bc5 -//.word 0x04740c3d -//.word 0xb0734c0c -//.word 0xdb70179e -//.word 0x8b6a47f3 -//.word 0x11804c53 -//.word 0xea4b293e -//.word 0xe471bfa3 -//.word 0x81774e52 -//.word 0xa0d739b2 -//.word 0x5a5309b7 -//.word 0x2b88b50f -//.word 0x52c6219c -//.word 0x7a1fe427 -//.word 0x99be4e53 -//.word 0x197baacf -//.word 0x36acc0d0 -//.word 0xa73d9ebf -//.word 0x8003982e -//.word 0x574d8e11 -//.word 0xa5bc6d2b -//.word 0x7055f8c6 -//.word 0x27d5c9a7 -//.word 0xce449241 -//.word 0x5acda929 -//.word 0x5fcdc4ca -//.word 0xe82a015a -//.word 0xa6e6290d -//.word 0x4ef43588 -//.word 0x3c4a1198 -//.word 0x5c37a124 -//.word 0x4af70260 -//.word 0xb8851244 -//.word 0x11b0323d -//.word 0x5b714a22 -//.word 0x627c0e69 -//.word 0x1315809b -//.word 0x2625b605 -//.word 0x008ddeb1 -//.word 0xd7ba7f94 -//.word 0x17790209 -//.word 0x040d707e -//.word 0xa1807d6d -//.word 0xd136c68f -//.word 0xbdc8574c -//.word 0x750f7075 -//.word 0xda7e8935 -//.word 0xbbb59345 -//.word 0x3e548160 -//.word 0x820d07f7 -//.word 0x82fea180 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00017A58 -//// expected output -//.word 0x64fd89d0 -//.word 0xb0992719 -//.word 0x4001a751 -//.word 0xb7424279 -//.word 0x40c96104 -//.word 0xd7bc3748 -//.word 0x9852000b -//.word 0xebfed610 -//.word 0x55d2ac26 -//.word 0x076d5abb -//.word 0x8c34fcee -//.word 0x0d0fb3e0 -//.word 0xcb99ee1c -//.word 0x7dc35d3b -//.word 0xd35350c9 -//.word 0xfd1b5b52 -//// SHA512LongMsgvector_122 -//// vector length -//.word 0x00017D70 -//// input message -//.word 0x00c317f6 -//.word 0xb591269b -//.word 0x94cc28ba -//.word 0x064e5f1e -//.word 0xf661bc87 -//.word 0x7bd3a359 -//.word 0xb74dee92 -//.word 0xffe034fe -//.word 0x3be14bae -//.word 0x90f70ba6 -//.word 0x3d7255d6 -//.word 0xc3de544c -//.word 0x49d803a7 -//.word 0x3e21f0cf -//.word 0x40f13fe3 -//.word 0x3d8ef173 -//.word 0xd81c67f0 -//.word 0x0eb72160 -//.word 0x19bfcc56 -//.word 0x94737c22 -//.word 0xe1c23645 -//.word 0xc85db128 -//.word 0x60115d0d -//.word 0x3354a545 -//.word 0x9d1e71a3 -//.word 0x75faf032 -//.word 0xef5c9423 -//.word 0xc1355e09 -//.word 0x85c55b49 -//.word 0x5fb06fcb -//.word 0xdf5551f6 -//.word 0x295bd7dc -//.word 0x538c74b1 -//.word 0x0ee7ff82 -//.word 0x89f0b523 -//.word 0x924b826a -//.word 0xff897c9a -//.word 0x4c42b022 -//.word 0x85642288 -//.word 0x66ca0fa0 -//.word 0xc2117501 -//.word 0x21a7d6b9 -//.word 0xad243840 -//.word 0x4fde70ab -//.word 0x15b7a022 -//.word 0xd73aff94 -//.word 0x1ae7d8a9 -//.word 0x34cad6f9 -//.word 0xb1537e7b -//.word 0xf661fd40 -//.word 0x24a02461 -//.word 0x3f15b136 -//.word 0x90f7d0c8 -//.word 0x47c1e189 -//.word 0x65857c43 -//.word 0xd983b24f -//.word 0xe9fa9607 -//.word 0xd43efd7d -//.word 0xb60b816e -//.word 0xab19cc71 -//.word 0x37f01374 -//.word 0xe6fee069 -//.word 0x2fe7153d -//.word 0x9e1c2e0a -//.word 0x33afc68d -//.word 0x05665cda -//.word 0x2a0e584e -//.word 0xdb1149c6 -//.word 0xd44b710e -//.word 0xfa1a839d -//.word 0x40b4ab7f -//.word 0xcbbecf92 -//.word 0x551a15f5 -//.word 0xcf00a5be -//.word 0x4a50b0eb -//.word 0x1726b19c -//.word 0x2daff27f -//.word 0xcc3c528b -//.word 0x609547f1 -//.word 0xa8901f4f -//.word 0x17e28b27 -//.word 0x7b345d91 -//.word 0xdc7a912c -//.word 0xa7808a5a -//.word 0x0cc59fad -//.word 0xa48dd69c -//.word 0x5732ef7b -//.word 0x7dbba5aa -//.word 0x43af300c -//.word 0x502c0eba -//.word 0xa93303f9 -//.word 0xd2465f6a -//.word 0x37357f81 -//.word 0xca359638 -//.word 0xec32ae05 -//.word 0x9166e909 -//.word 0x9f2b0d8a -//.word 0x980d3fa3 -//.word 0x79240f3a -//.word 0xe2a1b533 -//.word 0x76a69ae3 -//.word 0x855b1bc8 -//.word 0xe93e8977 -//.word 0x2dba74d5 -//.word 0xf5fc298a -//.word 0x990279b3 -//.word 0x14f4bcd7 -//.word 0x1db8161d -//.word 0x93c1f9bc -//.word 0x1e27ebb2 -//.word 0x14fd8ab9 -//.word 0x99dfcd77 -//.word 0x0bca8cf5 -//.word 0x9d304352 -//.word 0x414c13b9 -//.word 0xccb40990 -//.word 0x542da3f2 -//.word 0xddc29060 -//.word 0x3518b8b3 -//.word 0x1dfc7c55 -//.word 0xa93e3fb1 -//.word 0xeac225e8 -//.word 0xcad41ac6 -//.word 0x36bc17f4 -//.word 0x8392a06f -//.word 0x0a549238 -//.word 0x16361b4e -//.word 0x01390ad9 -//.word 0x99ff49a8 -//.word 0xc8dea7dd -//.word 0x7533dbe7 -//.word 0xa5f9c6b1 -//.word 0xe69af919 -//.word 0xed0477a4 -//.word 0x7e00bc70 -//.word 0x8cbffe6a -//.word 0xa2b6b2c0 -//.word 0x81ad529a -//.word 0x0b125e05 -//.word 0x5f92a12f -//.word 0x46ebb5da -//.word 0xcefbc90b -//.word 0x341da202 -//.word 0x07b6e06f -//.word 0x8b0b83e3 -//.word 0x5c56ad85 -//.word 0x5318a906 -//.word 0xadb02dd7 -//.word 0x6a2ddc99 -//.word 0xf4610fd5 -//.word 0x0136d5ed -//.word 0xba463952 -//.word 0x1da5c3f8 -//.word 0xa0014107 -//.word 0x17eec6d4 -//.word 0xd77bf40f -//.word 0x1c09773e -//.word 0xa85dd269 -//.word 0xadf35e17 -//.word 0xed958f7a -//.word 0x202d7ae7 -//.word 0x96d89489 -//.word 0x1d3bbd55 -//.word 0x251a7d40 -//.word 0x22268db0 -//.word 0x32179931 -//.word 0x00fb446a -//.word 0xe8ce6d4f -//.word 0x5c4ab098 -//.word 0x86003071 -//.word 0x2ea89473 -//.word 0xdfb650d3 -//.word 0x452e26d9 -//.word 0xdab8ec94 -//.word 0xc2f78fcd -//.word 0xf2175839 -//.word 0x98a56ef2 -//.word 0xb7a49d28 -//.word 0x12dd5514 -//.word 0x4c76f62e -//.word 0x4dc64aa0 -//.word 0xe86853fa -//.word 0xba8e4827 -//.word 0x5598daa0 -//.word 0x9ee6bbdf -//.word 0x73ea6117 -//.word 0x91810822 -//.word 0xb583f6bb -//.word 0x029802ed -//.word 0xa34e57cb -//.word 0xb1697662 -//.word 0x577b7aec -//.word 0x34b4a047 -//.word 0x00fa06a5 -//.word 0x733cb384 -//.word 0x6204d8e1 -//.word 0x2c4c55a8 -//.word 0x54937f70 -//.word 0x6f302165 -//.word 0x41e5c185 -//.word 0x23b72410 -//.word 0xa7fd1439 -//.word 0x7fb86022 -//.word 0x9b222507 -//.word 0x928a4cba -//.word 0x435e544f -//.word 0xbc8a5118 -//.word 0x5b0035d4 -//.word 0x32984f23 -//.word 0xb01b113d -//.word 0x7e9a16e4 -//.word 0xa8056497 -//.word 0xfdf9ee09 -//.word 0xb8d85dd1 -//.word 0x601f0f63 -//.word 0xecf4603f -//.word 0x2bff2968 -//.word 0x637b8718 -//.word 0x398ddeb2 -//.word 0xd0d41df8 -//.word 0x3541437e -//.word 0xfb29225e -//.word 0x2298622e -//.word 0x3ee9ca2f -//.word 0xd493bbc7 -//.word 0x0846fd32 -//.word 0x7537bf74 -//.word 0x5db8d892 -//.word 0x020b5301 -//.word 0x53782b5f -//.word 0xcb9d5361 -//.word 0x9706f90d -//.word 0xf7fd0c29 -//.word 0xe6a3fcf3 -//.word 0xfd40c112 -//.word 0x95d81ecd -//.word 0x2cff277b -//.word 0x0aed013a -//.word 0x23d5e9e4 -//.word 0x4073773f -//.word 0x5ae52474 -//.word 0x46bb0bc3 -//.word 0x9851ec74 -//.word 0xc15d7611 -//.word 0x7ac4c6d2 -//.word 0x66b22b59 -//.word 0xf2e92c9f -//.word 0x8159cc2f -//.word 0xc6f10c92 -//.word 0x70b6b20a -//.word 0x0d124983 -//.word 0x286e69c6 -//.word 0xb50338f0 -//.word 0xb0ec3122 -//.word 0x0080247b -//.word 0xa1e07e43 -//.word 0x02cccb69 -//.word 0xacbb7930 -//.word 0x252adf25 -//.word 0x14347e54 -//.word 0xa56386bb -//.word 0x2fc69cff -//.word 0x1543da5e -//.word 0xea2f17e5 -//.word 0xd81c69e3 -//.word 0x42f2e99d -//.word 0xa842b643 -//.word 0xcbd63d23 -//.word 0x128db71d -//.word 0x2d66f257 -//.word 0xf8da5532 -//.word 0xa26f1f7c -//.word 0x0e8aefe7 -//.word 0x798489b9 -//.word 0x5e01d7c6 -//.word 0x967d2e9b -//.word 0xc428d3fd -//.word 0xf0f4be92 -//.word 0x72ec9ddd -//.word 0x12c71c70 -//.word 0x6dbd645c -//.word 0x9b99e1ed -//.word 0x0e104994 -//.word 0xbd51da25 -//.word 0x82dde342 -//.word 0xc1998517 -//.word 0x4b21bb49 -//.word 0x82609828 -//.word 0xbd5ed02c -//.word 0xee587a9f -//.word 0x82161497 -//.word 0x8879c827 -//.word 0x1654edd6 -//.word 0xe87cd150 -//.word 0x4b23b65c -//.word 0x39611a0e -//.word 0xc6143c3e -//.word 0xbbeadb39 -//.word 0x80bc41b5 -//.word 0x3f1e800b -//.word 0x4634fca0 -//.word 0xadc729a4 -//.word 0x39979600 -//.word 0x81f32b89 -//.word 0x4f88af7a -//.word 0x49778c21 -//.word 0xd1aad7d8 -//.word 0x29678b37 -//.word 0xdb251588 -//.word 0x589f167b -//.word 0xdf28641c -//.word 0xa03e5201 -//.word 0x226131c8 -//.word 0xe22616c1 -//.word 0x3d87dee7 -//.word 0x8f7d7015 -//.word 0x9dd14276 -//.word 0x302e1f3e -//.word 0x037c2797 -//.word 0xdf6917de -//.word 0x0548ca10 -//.word 0xcc1f007f -//.word 0x8bfb5fca -//.word 0xb987b70b -//.word 0x53dd8a52 -//.word 0x7e9ccc53 -//.word 0x6e3be75b -//.word 0x869d0289 -//.word 0xc1e5833a -//.word 0x508bd2c5 -//.word 0x85b06069 -//.word 0xefaee983 -//.word 0xc7f4f604 -//.word 0x8a11a523 -//.word 0xe80eac4f -//.word 0xdd019c68 -//.word 0x1edf632e -//.word 0xb69215fa -//.word 0xf14becac -//.word 0x791a8de4 -//.word 0xbfbc8c75 -//.word 0x9cb43316 -//.word 0x399d7f5b -//.word 0x2cbe6ce4 -//.word 0xe3df72d5 -//.word 0x465b5085 -//.word 0x9877087b -//.word 0x9ef22b96 -//.word 0x04dd568b -//.word 0xfcadfd95 -//.word 0x288f6767 -//.word 0xbafbfa66 -//.word 0xda8cb915 -//.word 0x480f0bd0 -//.word 0x42dabebe -//.word 0xa85f4b01 -//.word 0x5e005c2f -//.word 0xf2258b06 -//.word 0x7e8c6d5b -//.word 0xd0e1cf54 -//.word 0xc98f3fd7 -//.word 0x03d5cf42 -//.word 0xb61c155d -//.word 0xdd88768d -//.word 0x94cda54a -//.word 0xc54466d2 -//.word 0x033e981f -//.word 0xb6987217 -//.word 0x798f0d04 -//.word 0xc0d62243 -//.word 0xbee61640 -//.word 0x869633a2 -//.word 0x70eb39c2 -//.word 0xbe311562 -//.word 0x7f4af09c -//.word 0xb4476b18 -//.word 0xb2352982 -//.word 0xc7398f3b -//.word 0x20e0c74f -//.word 0xeab00ba8 -//.word 0xb8032081 -//.word 0x2515201d -//.word 0xba5b7db8 -//.word 0x121643be -//.word 0x3b299d3b -//.word 0x60279b92 -//.word 0xa5b13273 -//.word 0x53ff8507 -//.word 0x35bc626d -//.word 0x4217106a -//.word 0x7b17485c -//.word 0x172e8170 -//.word 0xde127115 -//.word 0xd3c8d0b1 -//.word 0x15015f92 -//.word 0x07aa2927 -//.word 0xafbf0870 -//.word 0x5c606cb3 -//.word 0x8c265871 -//.word 0x0cb7ad98 -//.word 0x6198abfa -//.word 0x6743b5fe -//.word 0x387a5495 -//.word 0x4fda7f70 -//.word 0xeeb31a71 -//.word 0xbc17bc5f -//.word 0xb331b5dd -//.word 0x39d8509d -//.word 0x8d6455d1 -//.word 0x65c1d2e2 -//.word 0xd6c21b65 -//.word 0x73b7104b -//.word 0xb9419e57 -//.word 0xab6589d6 -//.word 0xb9e0688a -//.word 0xe6baf1e7 -//.word 0x2a1e7682 -//.word 0x1569b0c6 -//.word 0xb681bce8 -//.word 0xbb68631e -//.word 0xd9119e0c -//.word 0x6f72597f -//.word 0x66da785e -//.word 0x5b8518de -//.word 0x006e17f4 -//.word 0xbf64d610 -//.word 0xa1603d08 -//.word 0x6f160052 -//.word 0x17ca2177 -//.word 0x5065b7c4 -//.word 0x81c8ed43 -//.word 0xdf604dea -//.word 0xd6fa3f11 -//.word 0xabd9cc2a -//.word 0x5f06a8ac -//.word 0xd6e87050 -//.word 0x39143080 -//.word 0x9866280c -//.word 0xd451d020 -//.word 0xbc731973 -//.word 0x766df6c0 -//.word 0x21f11b7a -//.word 0xb81d04bc -//.word 0x39073a7f -//.word 0x0799d20f -//.word 0x8d9f36c0 -//.word 0x251e28dc -//.word 0x38e703e1 -//.word 0xa66d44e9 -//.word 0x68d44a6a -//.word 0x744a5a1f -//.word 0xe09ae646 -//.word 0x4bfe0f0c -//.word 0x79356846 -//.word 0x3dd6fd61 -//.word 0x9ce4949c -//.word 0x2fa23274 -//.word 0xc9a9e160 -//.word 0x5a37b1bf -//.word 0x13cafd0f -//.word 0xcbeeef5f -//.word 0xa2534607 -//.word 0xe4225796 -//.word 0x3091520c -//.word 0xd9b6c74a -//.word 0x8c9869c6 -//.word 0x338c1183 -//.word 0x1abf0641 -//.word 0x500f7bf1 -//.word 0x511f596b -//.word 0xe1aa3f63 -//.word 0x3b17c799 -//.word 0x6b4e0c51 -//.word 0xf9cb6903 -//.word 0xc7f08353 -//.word 0x3ca08943 -//.word 0xa209baa8 -//.word 0xcdc128db -//.word 0xfe15bcb0 -//.word 0x079e7bac -//.word 0xaf150772 -//.word 0x5767697f -//.word 0xde0c0d17 -//.word 0xc3950e7f -//.word 0x8985b56d -//.word 0x60623cbd -//.word 0x010cd765 -//.word 0xda4df5ab -//.word 0x6bb0c296 -//.word 0xf097f1a2 -//.word 0x4088bab7 -//.word 0xf5c81e5c -//.word 0xcd2b7229 -//.word 0x502a1b7a -//.word 0xb336976b -//.word 0xfd4cbd00 -//.word 0x68ca45a3 -//.word 0x0a818ad4 -//.word 0xb40b8f1c -//.word 0x1b5e4042 -//.word 0x35a2fbc2 -//.word 0xe6404f7b -//.word 0xdc3c04a8 -//.word 0xb8c45b11 -//.word 0x6e099683 -//.word 0xee4dbb7d -//.word 0x043d962c -//.word 0x7c82fd99 -//.word 0x8b935822 -//.word 0x6acd6027 -//.word 0x44c52605 -//.word 0x52dd5748 -//.word 0x4515bf1c -//.word 0xe4240d05 -//.word 0xf6c8d6d0 -//.word 0x625adcca -//.word 0x95a58f2f -//.word 0x24f8d4e5 -//.word 0xb27a066a -//.word 0x15be3a0c -//.word 0xb497c858 -//.word 0x332e07d4 -//.word 0x535157f1 -//.word 0x130e653b -//.word 0x1c81aad3 -//.word 0x5bea351f -//.word 0xf002abc0 -//.word 0x47908cc4 -//.word 0x8437b71d -//.word 0x25923152 -//.word 0xe2832275 -//.word 0xd8c72055 -//.word 0xe7ceb0f4 -//.word 0x59ca0a3c -//.word 0xc4071ded -//.word 0x317ad3da -//.word 0x7d9c9655 -//.word 0x007913e8 -//.word 0x6d033e46 -//.word 0xf9ad9680 -//.word 0xc035aa7c -//.word 0x64c1dca4 -//.word 0xf72e65db -//.word 0x1ba599b5 -//.word 0x676f6ce7 -//.word 0x0d0a36fc -//.word 0xba7cb34a -//.word 0xbee74e25 -//.word 0x6d5e9f52 -//.word 0xc5f732be -//.word 0x51218a70 -//.word 0x4c3865bd -//.word 0x0a5742bb -//.word 0x946e21f8 -//.word 0x93948a6b -//.word 0x6f9ed0aa -//.word 0xb7f0975e -//.word 0xc49394f4 -//.word 0x99889496 -//.word 0x0e5cc05a -//.word 0x2efd1fb9 -//.word 0xddcc5c42 -//.word 0xbef3ca8f -//.word 0x53f9a579 -//.word 0x66949b88 -//.word 0xa8be8aad -//.word 0x990a8c34 -//.word 0xa73931f4 -//.word 0x9a080bc9 -//.word 0x2f4d7044 -//.word 0x03427ba0 -//.word 0xb32154f8 -//.word 0x42f1b1b8 -//.word 0xbb9f9d52 -//.word 0x17507932 -//.word 0x60f640f3 -//.word 0x17210fd3 -//.word 0xd419e464 -//.word 0x2c29a585 -//.word 0xd73d6591 -//.word 0x12b0e4d6 -//.word 0x435f5449 -//.word 0xdc026377 -//.word 0x81bc75bf -//.word 0x6df031bf -//.word 0x1257400c -//.word 0xff4f5126 -//.word 0x077661ab -//.word 0xa07839ca -//.word 0x892538fb -//.word 0xb0c752ed -//.word 0x52b259c0 -//.word 0x641c7b75 -//.word 0x322f0da3 -//.word 0x465d876b -//.word 0x8bf4cfad -//.word 0xb2f2ba7c -//.word 0xd51ad0d0 -//.word 0x5a474f7b -//.word 0x1b01735f -//.word 0xc34ef5dd -//.word 0x7bcad191 -//.word 0xc7fa4d3c -//.word 0xaade3701 -//.word 0x11c56ed5 -//.word 0x6f65a431 -//.word 0xa42b6109 -//.word 0x23d04b02 -//.word 0x542da6e0 -//.word 0x3750173d -//.word 0x4bcfad81 -//.word 0xae5c210e -//.word 0x859a5dbb -//.word 0x9e303c84 -//.word 0x541b9180 -//.word 0xb3486a13 -//.word 0xdd629664 -//.word 0xace96411 -//.word 0x9984ae22 -//.word 0xdd98163c -//.word 0xd6199017 -//.word 0xaba02132 -//.word 0x33bee6c6 -//.word 0x139157f8 -//.word 0x2794cd52 -//.word 0x24bb4274 -//.word 0x7bc05807 -//.word 0x80b79df3 -//.word 0xcbe90ed2 -//.word 0xdedfdaa4 -//.word 0x09bd68c4 -//.word 0x8bd29a1b -//.word 0xfa6c5493 -//.word 0xe5f138ce -//.word 0xb72bb419 -//.word 0xdee43f9b -//.word 0x2db3dfd2 -//.word 0x7f15ef41 -//.word 0x9ebf1f62 -//.word 0x6333bce2 -//.word 0x1e92320d -//.word 0x37b1cf88 -//.word 0x166ec93e -//.word 0x4145839c -//.word 0xc41e0c01 -//.word 0xd669e870 -//.word 0xb96d1489 -//.word 0xe2dd44b7 -//.word 0x5aad6faa -//.word 0x64238d08 -//.word 0x6031a05f -//.word 0xef02f15f -//.word 0x58d39c46 -//.word 0x2b044e9b -//.word 0x246f4e1f -//.word 0x51f8ba01 -//.word 0x77651451 -//.word 0xb371fdb7 -//.word 0x5d1b3f65 -//.word 0x3144114a -//.word 0xb1799788 -//.word 0xc50ea929 -//.word 0xa56cd50d -//.word 0xf8aba727 -//.word 0x3e6427ea -//.word 0x6bc0a4fd -//.word 0xd4d5b036 -//.word 0x4f336cc6 -//.word 0x96b906b1 -//.word 0xedae7f82 -//.word 0x050db23c -//.word 0x1f1f9293 -//.word 0x744fb35c -//.word 0xd53b0c43 -//.word 0x8f07fbbc -//.word 0x91f6893c -//.word 0xd13bf0a8 -//.word 0xeb0c5a0e -//.word 0x0bf9ec93 -//.word 0x0e7c03ac -//.word 0xe4d1bd91 -//.word 0x3907bcef -//.word 0x545826dd -//.word 0x3fb6f012 -//.word 0x28a65d55 -//.word 0x0751c134 -//.word 0x81d88bf9 -//.word 0x0ce982da -//.word 0x55904f70 -//.word 0xdf4f3c6b -//.word 0xec703b83 -//.word 0xa09a2ab2 -//.word 0x64a355a0 -//.word 0x89a53d5f -//.word 0x2d549858 -//.word 0x638e9885 -//.word 0x8e3470e1 -//.word 0x0e39151d -//.word 0x1ff84195 -//.word 0xfdcbbe82 -//.word 0x4dd9e171 -//.word 0xb82f55f4 -//.word 0xd9131997 -//.word 0x5994cc15 -//.word 0x586629cc -//.word 0x0fedce6f -//.word 0xb49841fb -//.word 0x9e7034ec -//.word 0xaaf108b0 -//.word 0xdd18915c -//.word 0x4bbd199e -//.word 0x3723a7f2 -//.word 0x7bce8119 -//.word 0x2b94efc8 -//.word 0x75f7429d -//.word 0xcbb21556 -//.word 0x4592d345 -//.word 0x408779ff -//.word 0x4cfb9d55 -//.word 0x4562b085 -//.word 0xbf1380b1 -//.word 0xa756008f -//.word 0x28be4c63 -//.word 0xccb9e82a -//.word 0xe4654818 -//.word 0x29a59645 -//.word 0xa375afa4 -//.word 0xca7a6f34 -//.word 0xecdd2e7a -//.word 0xce5a8a2e -//.word 0x96946735 -//.word 0xe8ac35cf -//.word 0x50117212 -//.word 0xe09a6f97 -//.word 0x1ad25673 -//.word 0x10936c68 -//.word 0xc9d6945d -//.word 0xe7c9150c -//.word 0x87229cfb -//.word 0x69b385ad -//.word 0x513f5619 -//.word 0xac8d8c5b -//.word 0x77ba9baa -//.word 0x5dd3308a -//.word 0x1fa4b942 -//.word 0x39ca2791 -//.word 0xc310f29d -//.word 0x95f85e2c -//.word 0xae97fe16 -//.word 0xd7a676fb -//.word 0x83d78431 -//.word 0xfa654200 -//.word 0xb6efa512 -//.word 0x0d864a25 -//.word 0x11057203 -//.word 0xb5a04bb4 -//.word 0x31c071f2 -//.word 0xa70fb4dd -//.word 0x06ce1cf0 -//.word 0x2f6f2a34 -//.word 0x566061b3 -//.word 0xab250530 -//.word 0x3aa92315 -//.word 0x10d6d1ad -//.word 0xa063b793 -//.word 0x65edce6b -//.word 0xc84a68cf -//.word 0x431a718c -//.word 0xc79ef40f -//.word 0x5bcee01a -//.word 0x07a50dbc -//.word 0xf0c07a7f -//.word 0xc427d9e3 -//.word 0x586b4d0b -//.word 0x90f172b7 -//.word 0x808d9e72 -//.word 0xd052660d -//.word 0x65a9644b -//.word 0x3da138de -//.word 0x9b86cd92 -//.word 0x65b5dec9 -//.word 0xcaaeb827 -//.word 0x276b418e -//.word 0x2cf1394d -//.word 0x3b24c094 -//.word 0x10df182c -//.word 0xa744ad64 -//.word 0x5a51524f -//.word 0x4bb4ce2c -//.word 0x01e19726 -//.word 0x5661dd3e -//.word 0x906dca85 -//.word 0xcebb098e -//.word 0xa6988523 -//.word 0x0c377337 -//.word 0x7549921c -//.word 0x3dcdb1f6 -//.word 0x462a7370 -//.word 0xe37b4fad -//.word 0xf42ada82 -//.word 0x52c049e2 -//.word 0x6dfb3199 -//.word 0x3322923d -//.word 0x34951462 -//.word 0x04a8900e -//.word 0xe1b1d26d -//.word 0x96609ec5 -//.word 0x9f4ff0ab -//.word 0x8eda8878 -//.word 0xae31a6f7 -//.word 0xe5ab1360 -//.word 0xdf5e608a -//.word 0x68ec725c -//.word 0x1a9f3f85 -//.word 0x39b9d26c -//.word 0xdb05956a -//.word 0x4cb2cf38 -//.word 0xb0616ca3 -//.word 0xea7dfd87 -//.word 0xbdcbfffa -//.word 0x314260c8 -//.word 0x391c3f20 -//.word 0x922df48c -//.word 0xee745026 -//.word 0x52f0250a -//.word 0xbdb40907 -//.word 0x0a3e589a -//.word 0x1705781c -//.word 0x2751613a -//.word 0x854f5ca6 -//.word 0x6b650a0c -//.word 0x21c3a948 -//.word 0x693b93d6 -//.word 0x1b520789 -//.word 0x0d972c80 -//.word 0x35335357 -//.word 0x12c27d9a -//.word 0x47611d7f -//.word 0x8a081fd4 -//.word 0xbc1b2836 -//.word 0x593b2084 -//.word 0x1362ee93 -//.word 0xba2f8223 -//.word 0x5f7e1912 -//.word 0xb93cbcd0 -//.word 0xc87a0a13 -//.word 0xb7bf38cc -//.word 0x07a35659 -//.word 0xea99d4fc -//.word 0xed0d448c -//.word 0xdaaf616a -//.word 0xdd0e51b7 -//.word 0xe56827c4 -//.word 0x4dc0acca -//.word 0xbc325fdc -//.word 0x4a84ba19 -//.word 0xe4fdb726 -//.word 0xf17a93dc -//.word 0x35bed23d -//.word 0xf60a83ad -//.word 0x5eedc55f -//.word 0x215e8a0d -//.word 0x60089bec -//.word 0xcce5dddf -//.word 0x0e0ed2ea -//.word 0x67d262ea -//.word 0x9305dc84 -//.word 0xf49a385c -//.word 0xec759f87 -//.word 0x8b7a2d42 -//.word 0x6aeaf5e4 -//.word 0xd6ef4511 -//.word 0x31752c31 -//.word 0x963c3a20 -//.word 0xbc2b8727 -//.word 0x1de8f62c -//.word 0x57a5bb25 -//.word 0xd23d1bd3 -//.word 0xa37f73ac -//.word 0xb0c97c19 -//.word 0x15dacde1 -//.word 0xc7e1a2e5 -//.word 0x77d9db0f -//.word 0xba194885 -//.word 0x66272322 -//.word 0x3fcede26 -//.word 0xd370202c -//.word 0xa29d0a5d -//.word 0x82e3bee4 -//.word 0x42e822a1 -//.word 0x8eb7e122 -//.word 0x1258b3cf -//.word 0xe3a3df64 -//.word 0x1a55fea5 -//.word 0xc264014d -//.word 0xf4907547 -//.word 0x403b0620 -//.word 0x4f7a42bd -//.word 0xc76ca049 -//.word 0x6fcbc172 -//.word 0x94c0f5d5 -//.word 0xabfc01b6 -//.word 0x370420f5 -//.word 0xedcc473d -//.word 0x1688ad7f -//.word 0x36bf8b9f -//.word 0xeba1206d -//.word 0x179af9d6 -//.word 0x41276f5c -//.word 0x39e971c3 -//.word 0xfbf8840d -//.word 0xd67907a9 -//.word 0xce73bce8 -//.word 0x3ede84b0 -//.word 0xc2fd6a74 -//.word 0x53eee363 -//.word 0xb48054e0 -//.word 0x0e44d533 -//.word 0xd7e7357e -//.word 0xf7be3ef2 -//.word 0x2ea33a42 -//.word 0xb000b658 -//.word 0x13298548 -//.word 0x6bef0882 -//.word 0xb472ad4b -//.word 0x7036b66e -//.word 0x90793c2e -//.word 0x98c47380 -//.word 0xffc12f77 -//.word 0xd44ca700 -//.word 0xa8cc79cf -//.word 0xa7c4ef99 -//.word 0x08a58184 -//.word 0xa8e79bdc -//.word 0xf157a007 -//.word 0x01b32ebb -//.word 0x0874a46e -//.word 0xf2ebe10e -//.word 0x478f4ff3 -//.word 0x4f962112 -//.word 0x79c2d873 -//.word 0xfd7e0ce5 -//.word 0xc12969f0 -//.word 0x7ab2f80b -//.word 0x13659f0f -//.word 0x5204ecec -//.word 0xb91a0e9a -//.word 0xaa8c2453 -//.word 0xcf71bb00 -//.word 0xb92391f1 -//.word 0xc7969fd0 -//.word 0x4ae957d8 -//.word 0xe63b2b42 -//.word 0x3cc04e00 -//.word 0xc514beae -//.word 0x01cf82c6 -//.word 0xd2593013 -//.word 0x2200b368 -//.word 0xcc474b91 -//.word 0xba81d58a -//.word 0x4b9f4def -//.word 0xf74791b4 -//.word 0x35266816 -//.word 0x9c86c2d1 -//.word 0x49234294 -//.word 0x823af9b2 -//.word 0x98e4751a -//.word 0x12a2fa89 -//.word 0x07390ffe -//.word 0xccc03c6f -//.word 0xd0f713ba -//.word 0xc3da6dde -//.word 0xfe76f66b -//.word 0x1ffcec37 -//.word 0xf3142353 -//.word 0x9a734d3d -//.word 0xe5b07857 -//.word 0x0353d898 -//.word 0x5d30c782 -//.word 0xbef30a54 -//.word 0xb7fb5680 -//.word 0x426c125f -//.word 0xa57f5f24 -//.word 0x991d560f -//.word 0xacad90e3 -//.word 0xe42aec99 -//.word 0xa5788c56 -//.word 0xd4f8219b -//.word 0x3d5a69bb -//.word 0x32b2f693 -//.word 0x75ce3075 -//.word 0x59c79d65 -//.word 0x23d76088 -//.word 0xb66a00d9 -//.word 0x70786b1e -//.word 0x4f113b1b -//.word 0x583a3705 -//.word 0x39f71d39 -//.word 0x2da99f2e -//.word 0x209aaba8 -//.word 0x14d7ef2f -//.word 0xc33e9dc0 -//.word 0x85d76bc2 -//.word 0x7568df3b -//.word 0xcf43c944 -//.word 0x9d6311bb -//.word 0x93b7b237 -//.word 0x37be0741 -//.word 0x455446c1 -//.word 0x51cc4ab6 -//.word 0xae3e952a -//.word 0x8f229566 -//.word 0x6c1e2662 -//.word 0xa71d597f -//.word 0x70a17378 -//.word 0xe65a3996 -//.word 0x7ef76b24 -//.word 0xa93c8f23 -//.word 0xb155ef3f -//.word 0xe46ae501 -//.word 0xf5735645 -//.word 0x9f4e7def -//.word 0x8b0eeada -//.word 0x7497ca11 -//.word 0x89686842 -//.word 0x13b7f46f -//.word 0x57c384e7 -//.word 0xbe665875 -//.word 0x33e962d7 -//.word 0xcd1d0571 -//.word 0xaea71e43 -//.word 0x2b9c4119 -//.word 0x2d4e4501 -//.word 0xd6650202 -//.word 0x6831590b -//.word 0x633e752a -//.word 0xee2951fe -//.word 0x78b37a6f -//.word 0x9f14179c -//.word 0x51922615 -//.word 0x3151084b -//.word 0x3c6d4045 -//.word 0xac467894 -//.word 0x1c1bc488 -//.word 0xeedb2ba4 -//.word 0xea376450 -//.word 0x27fcddce -//.word 0x2fa0026f -//.word 0x5e1abb07 -//.word 0x8bf7369e -//.word 0xebabe868 -//.word 0x3125cef8 -//.word 0xfaa6f9b0 -//.word 0x69d2497c -//.word 0x0e0879c0 -//.word 0x0def5b8e -//.word 0x7c51651d -//.word 0x0c2d6d76 -//.word 0xec07b171 -//.word 0xea831ae0 -//.word 0xdc32c20a -//.word 0x3eacb35b -//.word 0x1cdff259 -//.word 0x33a6bcda -//.word 0x539e0f74 -//.word 0x07356c36 -//.word 0x7803dc95 -//.word 0x8f5e31a9 -//.word 0x5a288e9a -//.word 0xb1ec2955 -//.word 0x19295083 -//.word 0xe8eeaabb -//.word 0xaaa7c0f6 -//.word 0xc437bb44 -//.word 0x57476fbe -//.word 0x67dd99bc -//.word 0x3d306548 -//.word 0x09bb34d2 -//.word 0xcc909b25 -//.word 0x75efaf99 -//.word 0x4a17808a -//.word 0x8a5ce30a -//.word 0x517a75d3 -//.word 0xbb29dc7f -//.word 0x4cf150fc -//.word 0x90405b3a -//.word 0xfebadc26 -//.word 0x22d052dc -//.word 0xfc945718 -//.word 0xa3cb6bee -//.word 0x2d44f3bc -//.word 0xd369815c -//.word 0x5114569e -//.word 0x8ca426f5 -//.word 0x774f1b70 -//.word 0x37ba1cec -//.word 0x86c64e89 -//.word 0x55addb5a -//.word 0xb54ff361 -//.word 0xf7c611ba -//.word 0x12408016 -//.word 0x460e1d6b -//.word 0xfff85eea -//.word 0xfcd49332 -//.word 0xb0576cc3 -//.word 0xe92abcb5 -//.word 0xaf407caa -//.word 0x6f681301 -//.word 0x591ed54c -//.word 0x06a7c904 -//.word 0x5e5daf7c -//.word 0xb9474114 -//.word 0x44ecbaaf -//.word 0xa7699567 -//.word 0xe4c2977f -//.word 0x82760f98 -//.word 0xec565d28 -//.word 0x1496b129 -//.word 0x5b25150e -//.word 0xb53aaefb -//.word 0x08303e35 -//.word 0xd693eed8 -//.word 0x1c7b4bc8 -//.word 0x7a188ee9 -//.word 0x938f2093 -//.word 0xb7045d40 -//.word 0xc0f89988 -//.word 0x39d66050 -//.word 0xc6c8023e -//.word 0xbfcf4f70 -//.word 0x1f13a06d -//.word 0x9d78175b -//.word 0x18712773 -//.word 0x381956b3 -//.word 0x538041d2 -//.word 0x8d42e179 -//.word 0x445f0eb0 -//.word 0xab464197 -//.word 0xb4339e56 -//.word 0x34bb3256 -//.word 0x42a679b2 -//.word 0xdffc23e8 -//.word 0xdd6217d5 -//.word 0xf9a7b9e0 -//.word 0x4b9b6875 -//.word 0xe0204bb5 -//.word 0xa5834e6b -//.word 0x860c6742 -//.word 0xd8d31e36 -//.word 0xf4d64c49 -//.word 0x25492377 -//.word 0xc52d6eeb -//.word 0xa2241a73 -//.word 0xa784f632 -//.word 0xb8aab795 -//.word 0xdd913f88 -//.word 0xa3a31fe9 -//.word 0xbfce5a3c -//.word 0xf5db6ca1 -//.word 0x38fb8a04 -//.word 0x13a32c94 -//.word 0x479ac976 -//.word 0xb651e1ba -//.word 0x7f72418e -//.word 0x6bbb83b1 -//.word 0x880dd42b -//.word 0x13c0fa3c -//.word 0x9b3a9592 -//.word 0x64c0a4be -//.word 0x0a8b4ce9 -//.word 0x661fd5c3 -//.word 0xb5d8f6bd -//.word 0xf7c65278 -//.word 0x96bb427d -//.word 0x48a1d52e -//.word 0x361115fd -//.word 0x5e228cdb -//.word 0x367f07f3 -//.word 0x92bd9a99 -//.word 0xc7ebe47d -//.word 0x116a9425 -//.word 0x32ff2c9a -//.word 0x5c260661 -//.word 0x51a994ac -//.word 0xc972ebd2 -//.word 0x149d83fd -//.word 0x00d23822 -//.word 0xfdd29537 -//.word 0x7f4f52a0 -//.word 0xa4011bea -//.word 0x17f694bb -//.word 0x342a9909 -//.word 0x6d57ca8b -//.word 0xec0e476d -//.word 0x7907b848 -//.word 0x9fb69151 -//.word 0x0a1e94d1 -//.word 0x34ea97d5 -//.word 0x41ba8726 -//.word 0x27bbad7b -//.word 0x117a30ee -//.word 0x06fadbad -//.word 0xc50421f2 -//.word 0xf4be5e35 -//.word 0x7a7f60a0 -//.word 0x2ae226c3 -//.word 0xa119e789 -//.word 0x7184576a -//.word 0x7f8225e3 -//.word 0xa988c823 -//.word 0xac707b08 -//.word 0x45138649 -//.word 0x9719c0f5 -//.word 0xcd10521c -//.word 0x00bcbdcb -//.word 0x5bae1f3e -//.word 0x7d18b252 -//.word 0x1ee09539 -//.word 0xf6f3cf71 -//.word 0xdadc91f7 -//.word 0x2995bbb8 -//.word 0x669da248 -//.word 0x264a10d6 -//.word 0x2d618d60 -//.word 0xd4e4dd23 -//.word 0xae2bca56 -//.word 0x6a362417 -//.word 0xfb4205a6 -//.word 0xf79a59d1 -//.word 0x3db09eaf -//.word 0xdb6ce991 -//.word 0x2fc42a36 -//.word 0x4c8db03e -//.word 0x9e91f0e1 -//.word 0xd2e182e1 -//.word 0xf06d6cbd -//.word 0xcad1a328 -//.word 0x9a72cfb9 -//.word 0xe7ca4fe4 -//.word 0xa8007d29 -//.word 0xacbc338b -//.word 0x39398e44 -//.word 0xf49cf1b7 -//.word 0x00844da6 -//.word 0x6ae2a0a5 -//.word 0xc50bbccf -//.word 0x110b4ab7 -//.word 0xe23c0ea2 -//.word 0xbe186df3 -//.word 0xc64c2ce6 -//.word 0x980d7a81 -//.word 0x75af31c8 -//.word 0x9f745931 -//.word 0x05a2ee57 -//.word 0x22d8e2f2 -//.word 0x23a16607 -//.word 0x484a665c -//.word 0x8cf1522f -//.word 0x88df2427 -//.word 0x95189f8b -//.word 0x312fd4b2 -//.word 0xa45febbb -//.word 0xe3d8207e -//.word 0xb4570cc1 -//.word 0x13f926b0 -//.word 0xd4518987 -//.word 0x8bb8f892 -//.word 0xa9e41f57 -//.word 0xe7bd1b12 -//.word 0xe86b3d61 -//.word 0x19b40b41 -//.word 0xdd858839 -//.word 0xe7ceb6d5 -//.word 0xe6935856 -//.word 0x6841fca8 -//.word 0xf83e3994 -//.word 0x8ac33637 -//.word 0x1aee6bb3 -//.word 0x8f13ac24 -//.word 0xe55463d6 -//.word 0x8b711db5 -//.word 0x0ae14804 -//.word 0xe8213a52 -//.word 0xcc4c76aa -//.word 0xe2ec2b0b -//.word 0x810ffe17 -//.word 0x0c9e090f -//.word 0x16eb24ff -//.word 0xc9896336 -//.word 0x8860e0f9 -//.word 0xd300ba79 -//.word 0x6b365d02 -//.word 0xb7dd0474 -//.word 0x67f77df7 -//.word 0x57fd2ceb -//.word 0xb673531e -//.word 0x67be9142 -//.word 0xa73aa89e -//.word 0xf1888303 -//.word 0x1e257702 -//.word 0xd141c95c -//.word 0x12ce70ba -//.word 0x39d71d9e -//.word 0x0e13799a -//.word 0x2ebaadc0 -//.word 0xb1972859 -//.word 0x095f9cda -//.word 0x2d414a13 -//.word 0xf8be80aa -//.word 0xcbbb60c8 -//.word 0x7ad4e212 -//.word 0x66f41ddb -//.word 0xe622c297 -//.word 0xec9ee993 -//.word 0xe52d10e4 -//.word 0xe0b1609e -//.word 0xf3fc3346 -//.word 0xdae6d489 -//.word 0xe29d852d -//.word 0x063dc749 -//.word 0x57a1d5b1 -//.word 0xa17872b5 -//.word 0x4b9be40b -//.word 0x7f9e4109 -//.word 0x8ba4e917 -//.word 0x87785465 -//.word 0x38da0ed9 -//.word 0x3517ff4c -//.word 0x48ddf0f5 -//.word 0x174c4b25 -//.word 0x04502235 -//.word 0x512f73bd -//.word 0x885eab07 -//.word 0x1a9968c4 -//.word 0x463283fd -//.word 0x3caa4e4c -//.word 0x837e1a4b -//.word 0x9843fd4d -//.word 0xd8f5d24c -//.word 0x9f8d8023 -//.word 0xb2d180fd -//.word 0xda70990e -//.word 0xd24eee81 -//.word 0x631d3bb1 -//.word 0xce2d5c9b -//.word 0x6a850f94 -//.word 0x8e32fa37 -//.word 0xb1dff0a2 -//.word 0xd0a670e2 -//.word 0x11266eab -//.word 0xa5d6564c -//.word 0xf2984fe3 -//.word 0xf292bdcd -//.word 0xd6390961 -//.word 0xf0aea4de -//.word 0xcf4e49a1 -//.word 0xac85839c -//.word 0x05e27003 -//.word 0x8771c448 -//.word 0x3145104a -//.word 0xb75445ca -//.word 0x2488741e -//.word 0xc412d729 -//.word 0x4102158a -//.word 0x0c14c214 -//.word 0xfecd257e -//.word 0x40c73f5c -//.word 0x684a084e -//.word 0xe41bfc78 -//.word 0x9c99d632 -//.word 0xd3059c00 -//.word 0x4e22dbc4 -//.word 0xb9fe3432 -//.word 0x460f1785 -//.word 0x9781cf70 -//.word 0xdecfbf58 -//.word 0x4391ebc0 -//.word 0x8695ba05 -//.word 0xe530fa4b -//.word 0x40d624b7 -//.word 0x7be9e1df -//.word 0x24cfce7e -//.word 0x55477c6d -//.word 0xdcfdbcce -//.word 0x9a5c198a -//.word 0x29a3a5ff -//.word 0xc23bf9f2 -//.word 0x5d4877cb -//.word 0x197ed201 -//.word 0xdf35d1d3 -//.word 0x42c04f39 -//.word 0xaafb871a -//.word 0xb2248ebf -//.word 0xceec2188 -//.word 0x31cda1dd -//.word 0xee9d5c68 -//.word 0x5d640e81 -//.word 0xc06ba8ea -//.word 0x26954fbd -//.word 0x90f2a8a2 -//.word 0x53925345 -//.word 0xbd97b508 -//.word 0xfb8efbf5 -//.word 0x3a005bf6 -//.word 0x0d439d48 -//.word 0x0f96db2d -//.word 0xc96e85e1 -//.word 0xd60aa7d0 -//.word 0x444d6f06 -//.word 0x3ecdeae7 -//.word 0xe8280e20 -//.word 0x8b97fddd -//.word 0xf2c5883d -//.word 0x14e1f202 -//.word 0xf3f1f78e -//.word 0xc36a0d0b -//.word 0x4ffeeae9 -//.word 0x99b6468d -//.word 0xc040e247 -//.word 0x278ac985 -//.word 0xd490d647 -//.word 0x167276d3 -//.word 0x6bc9afaa -//.word 0xa03b62ba -//.word 0x3a4dcdd5 -//.word 0x15795362 -//.word 0x4b818053 -//.word 0x57024857 -//.word 0x7b4c8f50 -//.word 0x5f71ef07 -//.word 0xfa9cb51e -//.word 0xb5a42c47 -//.word 0xcee11fb4 -//.word 0xfb3f99cf -//.word 0x5190ef2a -//.word 0x632700b9 -//.word 0xaea2bc3f -//.word 0x3507e306 -//.word 0x68130fd3 -//.word 0x4acef519 -//.word 0xd363e86d -//.word 0x932f9f3a -//.word 0x991837b6 -//.word 0x93207b14 -//.word 0x373964fc -//.word 0xe15cdc38 -//.word 0x7dd5c7b0 -//.word 0xa7e14498 -//.word 0x117a30e8 -//.word 0x2572ed0c -//.word 0xecbf61dd -//.word 0x2f1641d1 -//.word 0xdcbb8f6e -//.word 0xaa976105 -//.word 0x008be59c -//.word 0x1404a22c -//.word 0x50cf000d -//.word 0xf92f0bae -//.word 0x122d7489 -//.word 0x7e30d856 -//.word 0x66cd457f -//.word 0xdae0fbd5 -//.word 0xbbdc6f81 -//.word 0xd85f963d -//.word 0x570a5fc4 -//.word 0x578f8286 -//.word 0xd30b78a1 -//.word 0xc997ca0d -//.word 0x9c198f16 -//.word 0xb8613010 -//.word 0x74716f46 -//.word 0x3c1ba833 -//.word 0xefd256f5 -//.word 0x86bad8fe -//.word 0xf701760d -//.word 0x58729f5c -//.word 0x4847741b -//.word 0x8b3f8b1e -//.word 0xf4f1ecd3 -//.word 0x88606076 -//.word 0xe0cfec88 -//.word 0xcfd7987d -//.word 0x45b674b5 -//.word 0x73eaddad -//.word 0x30fffd77 -//.word 0x9ca59167 -//.word 0x0305ef10 -//.word 0x0455476e -//.word 0xf2aa2965 -//.word 0x7a0e476a -//.word 0x86d37d81 -//.word 0x62270e67 -//.word 0x1de83110 -//.word 0x33b9cc54 -//.word 0x68557fe5 -//.word 0xf723e484 -//.word 0xec0b1574 -//.word 0xcf896f2f -//.word 0x82ff9659 -//.word 0x6c50b9f2 -//.word 0xd8aa18cf -//.word 0x97a3c34b -//.word 0xed88a43a -//.word 0xabf1bf1e -//.word 0x9899b99e -//.word 0x156d9733 -//.word 0x01e3c925 -//.word 0xdb8d67b6 -//.word 0x26eeba9c -//.word 0x128cfeb5 -//.word 0x584666f7 -//.word 0x66e861a6 -//.word 0xbcfd1cc9 -//.word 0x96e548de -//.word 0xcb271dcd -//.word 0xf5089f1b -//.word 0xd25c2060 -//.word 0xea9c06fb -//.word 0x7239ce04 -//.word 0x71305182 -//.word 0x21df46de -//.word 0x98160998 -//.word 0xa7729b39 -//.word 0x03e6e989 -//.word 0xa29b5101 -//.word 0x68fa6283 -//.word 0x0307e349 -//.word 0x14f0171c -//.word 0x8fe540c6 -//.word 0x642b62c9 -//.word 0x5f6c4951 -//.word 0x4c52cd68 -//.word 0x60545569 -//.word 0xd4cf9ab7 -//.word 0xd358aeae -//.word 0x96513cda -//.word 0xceba1167 -//.word 0x424adbd9 -//.word 0xb9be31fe -//.word 0x1a72d420 -//.word 0xd22e357e -//.word 0x764237fe -//.word 0xa9d5351c -//.word 0x417a4726 -//.word 0xa504c1ab -//.word 0x799cfd31 -//.word 0x7e105b26 -//.word 0xb36e8519 -//.word 0xc1d2f82a -//.word 0x957cc0bf -//.word 0x4f258279 -//.word 0x5b93c067 -//.word 0xdd6c5979 -//.word 0x53484f37 -//.word 0x7609cdb2 -//.word 0x606f69bb -//.word 0xf4e7a654 -//.word 0x7ba4bd64 -//.word 0x8bf19daf -//.word 0x2dc63004 -//.word 0x3e99e0b8 -//.word 0x16765a54 -//.word 0x6852918b -//.word 0x699d066f -//.word 0x351648e4 -//.word 0x6ee3b654 -//.word 0x26e18ca4 -//.word 0xff391e67 -//.word 0x90345e52 -//.word 0x0b50a4f0 -//.word 0x1d93af97 -//.word 0x161fe79b -//.word 0x4a07e4c1 -//.word 0xb76134f7 -//.word 0xe89c5942 -//.word 0x191412f7 -//.word 0x9be4dc2e -//.word 0x7afbb774 -//.word 0x5e732dc0 -//.word 0xaf1e91a9 -//.word 0xfc6185d5 -//.word 0x9e45beb5 -//.word 0x98cb0c6f -//.word 0xc280941c -//.word 0x27526034 -//.word 0xaba21b46 -//.word 0xf19a15ed -//.word 0x7bc18eff -//.word 0x13cc3007 -//.word 0x6ab8ddf6 -//.word 0x0015ab15 -//.word 0x43a52d3e -//.word 0xfb25f54c -//.word 0xe56b56d0 -//.word 0x9eb16f06 -//.word 0xc3316407 -//.word 0x57f2ef3f -//.word 0x65e11822 -//.word 0xe623401b -//.word 0xe4aa64c5 -//.word 0xe006a05e -//.word 0x727ef279 -//.word 0x2f6041f2 -//.word 0xcf959e27 -//.word 0x9078c965 -//.word 0xd5e9f7a1 -//.word 0x139cd269 -//.word 0xedb7c21a -//.word 0x9e9d6b52 -//.word 0x980477a8 -//.word 0x6a4e959b -//.word 0xe716c1c9 -//.word 0x8509c762 -//.word 0x03f702db -//.word 0x4f296ae7 -//.word 0xa6f6cea3 -//.word 0xfd915d10 -//.word 0xa0256bc7 -//.word 0x192472e8 -//.word 0x53dc5754 -//.word 0xff4bef1c -//.word 0x3734c239 -//.word 0x61720f7d -//.word 0x578d10c9 -//.word 0xc58b7e81 -//.word 0xd208583d -//.word 0x0289e1c1 -//.word 0x5a0ee830 -//.word 0xc6e64b7c -//.word 0xb9c7be21 -//.word 0x131ec913 -//.word 0x47a410f4 -//.word 0xbd32d78b -//.word 0x75d6c572 -//.word 0xee26e80e -//.word 0x46d4fac4 -//.word 0xa283e36a -//.word 0xd0d97efc -//.word 0x2bd6a091 -//.word 0xbf64578d -//.word 0xae2f6f17 -//.word 0xd3b63bce -//.word 0xa4a392b7 -//.word 0x5d57177a -//.word 0x5bcabdcf -//.word 0xc5928b33 -//.word 0x72419ddf -//.word 0x07f46cfa -//.word 0x60294f0e -//.word 0x32d141b9 -//.word 0xeea7e4a5 -//.word 0xe8bfc6b9 -//.word 0xb862e391 -//.word 0xe0196c2c -//.word 0xb008c7e5 -//.word 0x677dd7a5 -//.word 0x9bc97d56 -//.word 0xdb4f5f9b -//.word 0x92dae8be -//.word 0x2e3490ea -//.word 0x82f45d9a -//.word 0x6997a951 -//.word 0xadd2278c -//.word 0x272721f4 -//.word 0x27b703d9 -//.word 0x16571ddc -//.word 0x59e5a5eb -//.word 0x79ddfb73 -//.word 0x812731d0 -//.word 0xa833cb09 -//.word 0x3048c3ba -//.word 0x8e19d151 -//.word 0xcb9ae97d -//.word 0x2a1104e4 -//.word 0x0b702315 -//.word 0x0fe291bd -//.word 0x7da4691d -//.word 0xe51659bb -//.word 0x0312a558 -//.word 0xe57c6f23 -//.word 0x501a352c -//.word 0x61a69b1b -//.word 0x70226b22 -//.word 0x396cda30 -//.word 0x3e120d68 -//.word 0x6767dbd1 -//.word 0xecd7d54f -//.word 0x747783d2 -//.word 0x7fe0f1cd -//.word 0x013e6aea -//.word 0x4fa484fc -//.word 0x3fa35d34 -//.word 0x8b1a2399 -//.word 0x774fdab2 -//.word 0xb43f5985 -//.word 0x833396c6 -//.word 0x1e942448 -//.word 0x5300fab7 -//.word 0x729d7689 -//.word 0x69aea232 -//.word 0x2e64b597 -//.word 0x5df6ddc6 -//.word 0x23f43be4 -//.word 0x5ad82f66 -//.word 0xf5ded785 -//.word 0x9f15d2eb -//.word 0x9fb64ab3 -//.word 0xffb53190 -//.word 0xed97ca4c -//.word 0x61836c75 -//.word 0x009b8353 -//.word 0x418dd71c -//.word 0xce64116b -//.word 0x2da57bef -//.word 0x9f970760 -//.word 0x48e293b8 -//.word 0x915b6b9f -//.word 0xcb1f0f27 -//.word 0x15df37b9 -//.word 0x7f7a1550 -//.word 0x6fd1dae4 -//.word 0x44d77b2a -//.word 0x3ae7b57a -//.word 0x8d5b4f10 -//.word 0xe25a9f78 -//.word 0xe2f14f44 -//.word 0x28656100 -//.word 0x5dc87168 -//.word 0xa1cb3ad8 -//.word 0x2dd35c03 -//.word 0x374f5de8 -//.word 0x1648ed02 -//.word 0xa7396ebf -//.word 0xef22b334 -//.word 0x02d8080f -//.word 0x239f73cd -//.word 0x2cfa3a2d -//.word 0x31c2a5e4 -//.word 0x60760592 -//.word 0x2bd2f5f5 -//.word 0xaaa3e05c -//.word 0x3ad9c45f -//.word 0x6bde35ce -//.word 0x1926a4e7 -//.word 0xd808e1cc -//.word 0x96ccdf34 -//.word 0x7b05b860 -//.word 0x1421f051 -//.word 0xb13efe38 -//.word 0x0b3f082e -//.word 0x2a1fef25 -//.word 0x86868b1e -//.word 0x6d9a389d -//.word 0xa418915a -//.word 0x51a37b3a -//.word 0x185c667d -//.word 0x85b2cf39 -//.word 0xaa7c0907 -//.word 0x09453efc -//.word 0xb4e6b1db -//.word 0xb25b4588 -//.word 0xa5cf43c0 -//.word 0xaaf95808 -//.word 0x81abdde3 -//.word 0xeea85b48 -//.word 0x5eb74f53 -//.word 0xcef52a3b -//.word 0xe96f9c84 -//.word 0x70f01276 -//.word 0xdf187ecd -//.word 0x4eae56b2 -//.word 0x9537dfea -//.word 0xb3c8ab4e -//.word 0x7118607b -//.word 0x42d9bcca -//.word 0x6e49d683 -//.word 0x6f04a74d -//.word 0x9b1cc8e9 -//.word 0x046b7d20 -//.word 0x9d28f3fa -//.word 0x9eb9c631 -//.word 0x29c8c6e5 -//.word 0x2d99fb91 -//.word 0x8b9be73e -//.word 0x773d0af7 -//.word 0x2102ac7c -//.word 0x95d8d63b -//.word 0xe0a6a27b -//.word 0x7524b4db -//.word 0xcfef09fb -//.word 0x57ddf079 -//.word 0x878d551f -//.word 0x5043455a -//.word 0xb9f3afee -//.word 0xca9c68e9 -//.word 0xa8d872d5 -//.word 0x01b07e32 -//.word 0xaab4af24 -//.word 0x874ca168 -//.word 0xac49aa8c -//.word 0xc1bf6060 -//.word 0xab175ba8 -//.word 0x69603c13 -//.word 0x3be6ed71 -//.word 0x0a062b20 -//.word 0x044042c7 -//.word 0x878e1847 -//.word 0x40f46def -//.word 0x945961f0 -//.word 0x3e953710 -//.word 0x3acb58a2 -//.word 0xe2f99bb5 -//.word 0x58cdc38c -//.word 0x23bb4a4e -//.word 0x1d4c5dff -//.word 0x8cb927af -//.word 0x8fb852f1 -//.word 0xbc96cb8f -//.word 0x0786c67c -//.word 0xe539030a -//.word 0xb2ae4f5d -//.word 0x504c4d20 -//.word 0x122e7676 -//.word 0xd8be5f34 -//.word 0x7b853a4d -//.word 0x6b41a08e -//.word 0x96388e8b -//.word 0x8ccdadd9 -//.word 0xe151d67d -//.word 0xd31bd5a5 -//.word 0x2ddb6d96 -//.word 0x6c2b9de6 -//.word 0x1f6722eb -//.word 0x94bf3d73 -//.word 0xb08ab6b5 -//.word 0x1fdd2188 -//.word 0xae5d60d3 -//.word 0xf4516945 -//.word 0x38fc4a46 -//.word 0x8f296a2d -//.word 0x450711b3 -//.word 0x7e372aa7 -//.word 0x1d2448e4 -//.word 0xe593e881 -//.word 0xde7bf647 -//.word 0xfb169268 -//.word 0xf938136d -//.word 0x8ae04c71 -//.word 0xb30c0f8d -//.word 0x73d2f093 -//.word 0xa5ad4bff -//.word 0x2715892a -//.word 0x3c529ec1 -//.word 0x2f91d676 -//.word 0x3a38d2f5 -//.word 0xa577cd1a -//.word 0x321f2561 -//.word 0xb9b8169e -//.word 0x10cec8ee -//.word 0x2d8b8ced -//.word 0x8f8b6229 -//.word 0xdaebc0d7 -//.word 0xc1a38ec5 -//.word 0x28167590 -//.word 0x8ae85917 -//.word 0x9910242f -//.word 0x252ec699 -//.word 0x3f1e7a31 -//.word 0x9ecd4a67 -//.word 0x424bd5f3 -//.word 0x562250c5 -//.word 0x5be7cb3b -//.word 0x830eb597 -//.word 0x5b02a3b0 -//.word 0xad764de8 -//.word 0xa5f5d95d -//.word 0x32c15d64 -//.word 0xafda9f33 -//.word 0xc35d1fdd -//.word 0x860f5784 -//.word 0xe53a41c9 -//.word 0x47b81a88 -//.word 0x714d66c3 -//.word 0xa63a34db -//.word 0x130ea306 -//.word 0x6bc0a5fd -//.word 0xcffb03f5 -//.word 0xf0b9a1d1 -//.word 0x77130496 -//.word 0xa557111f -//.word 0x365c1712 -//.word 0x8c121012 -//.word 0x095d2436 -//.word 0xbd246fba -//.word 0x41a504f5 -//.word 0xe20b328b -//.word 0x024206e4 -//.word 0xbc0a10dd -//.word 0xc74a6abd -//.word 0x9da7f76a -//.word 0xdc56e9dd -//.word 0xec2e86d3 -//.word 0xe2022bc5 -//.word 0xa42d911b -//.word 0x4e6e4f9d -//.word 0xd5f7a02a -//.word 0xebc067ac -//.word 0x2221704b -//.word 0x53a0f9e1 -//.word 0x410871ae -//.word 0x7abb7f4e -//.word 0x7e4846e7 -//.word 0x2340e8a7 -//.word 0x3846486e -//.word 0x696615c7 -//.word 0x62a8041d -//.word 0x38e45c2c -//.word 0x04d7b8b5 -//.word 0xd1770876 -//.word 0xb884da59 -//.word 0x4960d8ec -//.word 0x2d209111 -//.word 0x0ae37cf7 -//.word 0xa7623948 -//.word 0x51c91ba4 -//.word 0x7dc6e44f -//.word 0xaedfcf26 -//.word 0x9908d4d8 -//.word 0x87752752 -//.word 0xfcad027b -//.word 0x96e0a422 -//.word 0x377a9a34 -//.word 0x67f83d33 -//.word 0xf3fa7ce3 -//.word 0xda9adb47 -//.word 0x6afdbccb -//.word 0xa727ddc3 -//.word 0xec142314 -//.word 0xd5049631 -//.word 0x5b16ac4a -//.word 0x4118cac0 -//.word 0xb09e08db -//.word 0x1e5135bf -//.word 0x748a1b9c -//.word 0x6f200326 -//.word 0x467e7c45 -//.word 0x8ef8590d -//.word 0x5b5ff9f0 -//.word 0xa9d2cb32 -//.word 0xfad8109e -//.word 0x40ace378 -//.word 0xfcd877b2 -//.word 0xa805a162 -//.word 0x53129674 -//.word 0x8b63f59c -//.word 0x7f7c088f -//.word 0x65ce4773 -//.word 0x1ad01d94 -//.word 0x0852ef58 -//.word 0x4d0f5b75 -//.word 0x1a81bd61 -//.word 0x58f9f80b -//.word 0x92ee73c8 -//.word 0x0f956190 -//.word 0x3eb3466a -//.word 0x58b0b625 -//.word 0x40ec6049 -//.word 0xae564c4d -//.word 0x8c3a610a -//.word 0xa05a2a70 -//.word 0x6c41da78 -//.word 0x52d48d59 -//.word 0xfc2ad0ff -//.word 0xfb9d64b9 -//.word 0xae213f32 -//.word 0x66d5d4a2 -//.word 0xc7d89445 -//.word 0x725eb50d -//.word 0xe1033294 -//.word 0x915f1354 -//.word 0x67daee1a -//.word 0x4dc1aeb8 -//.word 0x1c9a93fa -//.word 0xbeb57adc -//.word 0x94045ffa -//.word 0x152c2048 -//.word 0xb8dc8303 -//.word 0x145e7be8 -//.word 0x466ca7a3 -//.word 0x94441c8a -//.word 0x50ff648b -//.word 0xfe1ec663 -//.word 0xb966c811 -//.word 0xd2eef38b -//.word 0xbb76d6af -//.word 0x23fa4e7c -//.word 0x63870482 -//.word 0x194e3697 -//.word 0x12f7bbcc -//.word 0x6e3741a0 -//.word 0xfea5da73 -//.word 0xf1c9b73d -//.word 0xb076327f -//.word 0x065a127a -//.word 0x84d40ba0 -//.word 0x24058548 -//.word 0x2c2a9fa5 -//.word 0x552972f9 -//.word 0x2d699a06 -//.word 0xbae7f3c5 -//.word 0x6087a05b -//.word 0x04a85249 -//.word 0x72fac6e3 -//.word 0xfc949003 -//.word 0x644118fe -//.word 0xfd1be2d7 -//.word 0x0c5c12b3 -//.word 0x74702f8d -//.word 0x934f272b -//.word 0x67099351 -//.word 0xf5a23d34 -//.word 0xeb21df31 -//.word 0x84e42ebf -//.word 0xac3617a3 -//.word 0x65244963 -//.word 0x698cf3fc -//.word 0x1076cfd7 -//.word 0x75a75ffa -//.word 0xd474777c -//.word 0x37d5fb3b -//.word 0x52baead1 -//.word 0xaba29bc3 -//.word 0xfe6947fc -//.word 0xdf61c87a -//.word 0xa1a5a048 -//.word 0x77aa3dac -//.word 0xd9177ca1 -//.word 0x29d76b87 -//.word 0x976c531a -//.word 0x4286f6a1 -//.word 0x9fd41567 -//.word 0x1f1a356f -//.word 0x0c84a364 -//.word 0xb43ab6cf -//.word 0xca34548d -//.word 0x0950b77f -//.word 0x1aa17183 -//.word 0xb80aaea3 -//.word 0x120cba8d -//.word 0x71ddc343 -//.word 0x1abadf14 -//.word 0x767d51cb -//.word 0x70720826 -//.word 0x1f67688a -//.word 0xa5024df4 -//.word 0x57584d33 -//.word 0x1eba3e55 -//.word 0x1cd2f85f -//.word 0x93f05c41 -//.word 0x039e9608 -//.word 0x937a9e56 -//.word 0xb245050f -//.word 0xfe37ee56 -//.word 0x65955bb8 -//.word 0x8a86aaa6 -//.word 0x6a235f29 -//.word 0x3fcd23d1 -//.word 0xa5c30def -//.word 0xfbf32103 -//.word 0x0c111678 -//.word 0xeee75d8f -//.word 0x2bec5e9a -//.word 0x1f17056a -//.word 0xa1f57d0a -//.word 0xe6fa3bae -//.word 0xa1153fe6 -//.word 0x6f869617 -//.word 0x73f4242c -//.word 0x3dbaa089 -//.word 0xf183e040 -//.word 0xa5165788 -//.word 0x0a73dc6b -//.word 0x4f1eacbe -//.word 0x42bbb356 -//.word 0xb9db0779 -//.word 0x3016b693 -//.word 0xb35ac12a -//.word 0xff826814 -//.word 0xe42aa8e8 -//.word 0xedc203b2 -//.word 0x43e27feb -//.word 0xcfddf1a8 -//.word 0x9f997b11 -//.word 0x8b9e5415 -//.word 0x186cc75c -//.word 0x9c127f7d -//.word 0xa3fc0172 -//.word 0x920d7a49 -//.word 0x8aeebb1b -//.word 0x8fa58242 -//.word 0xea69fbc7 -//.word 0xcbb4861a -//.word 0x339bbb06 -//.word 0x115babe3 -//.word 0xac34690e -//.word 0x407aca96 -//.word 0xece96838 -//.word 0xcb39ed8e -//.word 0x62f28e83 -//.word 0x3a82d50a -//.word 0xcd8ca410 -//.word 0xa78477ae -//.word 0xc579e9a4 -//.word 0x41317a03 -//.word 0x317b8f29 -//.word 0xccc1baf2 -//.word 0xcedd3c2d -//.word 0x1e2dc84d -//.word 0xaeea8a61 -//.word 0xa3b56847 -//.word 0xb773881c -//.word 0xdb5b12f6 -//.word 0x204d37d6 -//.word 0xd76672d8 -//.word 0xf7d10dad -//.word 0xc0e0e84b -//.word 0x9e5b76e3 -//.word 0x50180814 -//.word 0x49cb4e5e -//.word 0x57201ad9 -//.word 0x82076827 -//.word 0x374f9ca7 -//.word 0xa6770aeb -//.word 0x68c1bb6d -//.word 0x65876e7d -//.word 0xf5d2de7e -//.word 0x45294352 -//.word 0xfda71b13 -//.word 0x1f512a04 -//.word 0x32a6c0c7 -//.word 0xa1773ad0 -//.word 0x5ef8cb19 -//.word 0xca187d17 -//.word 0xd90e72ee -//.word 0x713470e1 -//.word 0x14199d0c -//.word 0xbfd18655 -//.word 0x129066a0 -//.word 0xb078a642 -//.word 0xe9aea0b8 -//.word 0x97b3a89a -//.word 0x45f24dca -//.word 0x9795dcf1 -//.word 0xe69d262c -//.word 0x2a328302 -//.word 0x1d37179a -//.word 0x9d22542a -//.word 0x520bc0b3 -//.word 0x9202f9ec -//.word 0x81a6f67b -//.word 0x7df48f6b -//.word 0xb95c40db -//.word 0x271a2af3 -//.word 0x9cc35a1d -//.word 0x2f1e4e71 -//.word 0xe236b570 -//.word 0x84ad77f6 -//.word 0xd553f56a -//.word 0xecf79238 -//.word 0xd67e7281 -//.word 0x80328211 -//.word 0xd65cb891 -//.word 0x2d149cfd -//.word 0xde580759 -//.word 0x345c2aa0 -//.word 0x8921d3fe -//.word 0xab49ec3e -//.word 0x852a4486 -//.word 0xfb219342 -//.word 0x1528b85e -//.word 0x60ab44b8 -//.word 0x91983cd5 -//.word 0x6cb61bd3 -//.word 0xe437179e -//.word 0x8490a567 -//.word 0x0d883f52 -//.word 0x618f656f -//.word 0x9f52e2ec -//.word 0x908c5089 -//.word 0x421fde4b -//.word 0xf2635175 -//.word 0x2fbe49b4 -//.word 0x3d75c69a -//.word 0xb8c1ea4d -//.word 0x79260181 -//.word 0xbe00bea3 -//.word 0x845fc757 -//.word 0x38147525 -//.word 0x8f0cd46f -//.word 0xb3ddf2a7 -//.word 0x9f9f56bf -//.word 0xccfdcee0 -//.word 0x0d8b6e5e -//.word 0xb75bd5ec -//.word 0x06cbb20c -//.word 0xbca087ca -//.word 0x0b59adaa -//.word 0xb5bd99df -//.word 0x72b75dbd -//.word 0x92637171 -//.word 0xe369b4f0 -//.word 0xd58aae2d -//.word 0xdc78188f -//.word 0x16eb9ea2 -//.word 0x2ef1e30d -//.word 0x8085c6c4 -//.word 0x7e64e47e -//.word 0x521c5d6a -//.word 0xc566dc1d -//.word 0x5fb5d1cf -//.word 0xcf0f01c8 -//.word 0x8e1c4115 -//.word 0xc07d7e7f -//.word 0x5b5e01be -//.word 0x8a4ff1e9 -//.word 0x544f1a31 -//.word 0x792aeccf -//.word 0x9c06c73b -//.word 0xa738769f -//.word 0x6c5cf98b -//.word 0x88a487ea -//.word 0x8d70d335 -//.word 0x601f8fe6 -//.word 0xdf252e30 -//.word 0xc75eefed -//.word 0xd5a317d8 -//.word 0x2c9a7dfc -//.word 0xf7d24c6c -//.word 0x4f0f0535 -//.word 0x5fe2c391 -//.word 0xc67dc35d -//.word 0x3cc623cd -//.word 0x79aaea5f -//.word 0x53b4490d -//.word 0x26de21c7 -//.word 0x78a7c420 -//.word 0xdd650048 -//.word 0x19dd5a3a -//.word 0x85119736 -//.word 0xb4598172 -//.word 0x55b5e70d -//.word 0x5b62e644 -//.word 0x5cab67e8 -//.word 0x3702e90f -//.word 0xfa4f810b -//.word 0x03881e98 -//.word 0x65821259 -//.word 0x8d07ce86 -//.word 0x2528eddf -//.word 0x38d475e4 -//.word 0x97aa5947 -//.word 0x7c0c42a2 -//.word 0x6e758e66 -//.word 0x640c9913 -//.word 0x2d793caf -//.word 0x0ff79471 -//.word 0xafaa05bd -//.word 0x30347e55 -//.word 0x9f83fecd -//.word 0x8fec573f -//.word 0x007e3241 -//.word 0x86905314 -//.word 0xa79d1e1e -//.word 0x84525a9a -//.word 0xbce4368f -//.word 0x8da789fe -//.word 0x3cdd5e60 -//.word 0xb7cbb050 -//.word 0x7a137284 -//.word 0xaf3dd301 -//.word 0x9997bf8f -//.word 0x323fa96b -//.word 0x137e883d -//.word 0x95571f49 -//.word 0x366082e9 -//.word 0x3ed1d63b -//.word 0xa2db5817 -//.word 0x283ba144 -//.word 0xcc0e28eb -//.word 0x62e7084b -//.word 0x7e1f03af -//.word 0x916cc79d -//.word 0x54b57151 -//.word 0x6a25506a -//.word 0x417febe2 -//.word 0x39b14543 -//.word 0x08ab5f18 -//.word 0x5d71ffa2 -//.word 0xc36fb0cd -//.word 0xc80e0a62 -//.word 0x5f84337e -//.word 0x84f0a643 -//.word 0x1ea633cd -//.word 0x29c74768 -//.word 0x14166e00 -//.word 0x680616d9 -//.word 0xab189680 -//.word 0x84636f01 -//.word 0x2074d15a -//.word 0xd3596130 -//.word 0x03f939c1 -//.word 0x42a7301a -//.word 0xbaf65c89 -//.word 0xceced656 -//.word 0xfebfbdae -//.word 0x0b967ee0 -//.word 0x5c2e52cc -//.word 0xa1890897 -//.word 0xb61f04a4 -//.word 0xca7688c0 -//.word 0xc0f3329d -//.word 0xd5f0c682 -//.word 0x840f2e40 -//.word 0xa7cdbf68 -//.word 0xde5abebb -//.word 0x34a823e2 -//.word 0x00c19c60 -//.word 0x0a5fd5c4 -//.word 0xefb6f723 -//.word 0xc7956fc5 -//.word 0x04adf01f -//.word 0x9d30bb01 -//.word 0x6d9f1e11 -//.word 0xd6dd3a78 -//.word 0xa9870adb -//.word 0x4a88a18d -//.word 0x0fe7b303 -//.word 0xeae45788 -//.word 0x48440b31 -//.word 0x38e9f914 -//.word 0xd0a579b5 -//.word 0xcc50d6c1 -//.word 0x791855ff -//.word 0xd2197383 -//.word 0xe82e6f25 -//.word 0x87060831 -//.word 0x167a8860 -//.word 0xbf1d0107 -//.word 0xd015d78f -//.word 0x612a7e25 -//.word 0x381d85b2 -//.word 0xe93bd40e -//.word 0x41313271 -//.word 0xe5220a2a -//.word 0x37f76e93 -//.word 0x79f75c44 -//.word 0x35974087 -//.word 0xdc93bb0c -//.word 0xad3da3de -//.word 0xd8154b96 -//.word 0xe49b04cf -//.word 0x4e61e3d9 -//.word 0x7364c5b2 -//.word 0xaf9c9131 -//.word 0xc7d2bd85 -//.word 0x84b214de -//.word 0xa121b66a -//.word 0xe8d16083 -//.word 0x9712ed27 -//.word 0x08eb1da8 -//.word 0x916996a4 -//.word 0xaa372838 -//.word 0x4d6f5571 -//.word 0xa3b01103 -//.word 0xdc71c63e -//.word 0x5e949b3d -//.word 0x233ef661 -//.word 0x5ce73ffe -//.word 0x5bade853 -//.word 0xafeeaac0 -//.word 0x91151133 -//.word 0x7fb43ae4 -//.word 0x26d4dc42 -//.word 0x8589852c -//.word 0x50c92665 -//.word 0x927dd242 -//.word 0x97d9c3a6 -//.word 0x09e99e30 -//.word 0x596df7b3 -//.word 0x60e718e7 -//.word 0x47f2fe5e -//.word 0xa4d5a5b9 -//.word 0xe558861b -//.word 0xf2d75dde -//.word 0x0e942f85 -//.word 0xfe518cf2 -//.word 0x6e1f12da -//.word 0x90713275 -//.word 0x0674377a -//.word 0x02a3834a -//.word 0xac961c6b -//.word 0xc41a6839 -//.word 0x888735d8 -//.word 0xd84efc6d -//.word 0x98d2678e -//.word 0x567910f7 -//.word 0x2c028c7e -//.word 0xe819a849 -//.word 0x6b28f23e -//.word 0x4f717cbb -//.word 0xcd5adc87 -//.word 0xdd077709 -//.word 0x9e2e00b8 -//.word 0xf9273bd3 -//.word 0x81430752 -//.word 0x9e5f9b1c -//.word 0xebb9107a -//.word 0xdc0220cc -//.word 0xa4b42d7b -//.word 0x56a5842e -//.word 0x4adde441 -//.word 0xc2a43a73 -//.word 0xcde0afde -//.word 0x6c9ee42d -//.word 0xf4ef7c09 -//.word 0xb3f5dcd4 -//.word 0xd63d2e9a -//.word 0x8a4fac44 -//.word 0x62841b0f -//.word 0xf918953d -//.word 0xd8808c0b -//.word 0x9afe0ce2 -//.word 0x4e7240d1 -//.word 0x1c73383b -//.word 0x2c9ee9cd -//.word 0xc32e76b3 -//.word 0xafceae0c -//.word 0xe6abd59b -//.word 0x6acca7bf -//.word 0x6fa69aa5 -//.word 0xc0eb64bc -//.word 0x5fa4bd69 -//.word 0x6b7f66fd -//.word 0x476a6ae4 -//.word 0xf960a41e -//.word 0xd08381f4 -//.word 0x4a6c07e3 -//.word 0x34bf16dd -//.word 0x1302eeb1 -//.word 0xc3aff2c7 -//.word 0x5e87ac10 -//.word 0x602a103d -//.word 0x08e5052f -//.word 0x01cb21af -//.word 0x4107b460 -//.word 0x327009f1 -//.word 0x0f5ee897 -//.word 0x91bc5fbb -//.word 0xcc5fc3f0 -//.word 0x5396f127 -//.word 0xa303d926 -//.word 0xbfa93e36 -//.word 0x1745b71c -//.word 0xaee2fa4b -//.word 0x7ca85958 -//.word 0x12f58dae -//.word 0x7cafb383 -//.word 0x6bd8940b -//.word 0x946229eb -//.word 0x53455ff0 -//.word 0x94d01701 -//.word 0xf33c7152 -//.word 0x22874adb -//.word 0x8b800309 -//.word 0x371e84b3 -//.word 0xef15814f -//.word 0xa1abfc66 -//.word 0x05c80c45 -//.word 0x7f4ddcf6 -//.word 0x48a7f66e -//.word 0xc9a4c208 -//.word 0x47854932 -//.word 0xc5543f66 -//.word 0x2678415d -//.word 0x93865b7f -//.word 0x1c5acd9d -//.word 0xa2670fe2 -//.word 0xf44b1207 -//.word 0x38a6c9c7 -//.word 0x8d2de893 -//.word 0xeefaec86 -//.word 0x59265b9b -//.word 0x319a4d1e -//.word 0xe2222b60 -//.word 0xc3c4b7af -//.word 0x404f4c85 -//.word 0x38366700 -//.word 0xa49f6792 -//.word 0x7ab891fa -//.word 0xd14a5773 -//.word 0x4590da2b -//.word 0x9d49adf6 -//.word 0xab0cdc44 -//.word 0x74dc2d51 -//.word 0x91fca59b -//.word 0xd5044e99 -//.word 0x303538aa -//.word 0xd30abe4c -//.word 0x950f0a8e -//.word 0x96f6dcc8 -//.word 0x22e88689 -//.word 0xd8193cd1 -//.word 0x0b9f8a80 -//.word 0x6884260f -//.word 0xd91ae87e -//.word 0xaa8e178d -//.word 0xebc0e62f -//.word 0x15523e3c -//.word 0xf000be66 -//.word 0xb32f016e -//.word 0x6dc81f98 -//.word 0xa546765c -//.word 0x3d0eaa5e -//.word 0x9dffeaa0 -//.word 0x0d4b75f6 -//.word 0x61855dbb -//.word 0xdcfb8bc3 -//.word 0x4f450490 -//.word 0x811e6bc9 -//.word 0xd373c6e7 -//.word 0x24ba8532 -//.word 0xf385c0ec -//.word 0xc357c0cc -//.word 0xc4b6c1ae -//.word 0xaf81f688 -//.word 0xf284cea0 -//.word 0x0d4a76fc -//.word 0x3c329f1a -//.word 0x56c581e2 -//.word 0xf5471fd9 -//.word 0xd78ccd97 -//.word 0x840ef07b -//.word 0x313c069d -//.word 0xe514e604 -//.word 0xdaf3481a -//.word 0x26ac875c -//.word 0x9ad8a656 -//.word 0xeb6e92cf -//.word 0x0f94a641 -//.word 0xeab4748c -//.word 0x2ad1c3ea -//.word 0x701cd426 -//.word 0xb0c2ea09 -//.word 0xda090816 -//.word 0xba9bfd77 -//.word 0x1d219e36 -//.word 0x351453b0 -//.word 0x3ed0d547 -//.word 0x62eb3558 -//.word 0xdac4216d -//.word 0x575f63b3 -//.word 0xa070aaae -//.word 0x7cb58d2b -//.word 0xd289cd76 -//.word 0x0fb7dace -//.word 0xc88c9916 -//.word 0xa13065cd -//.word 0x6d365440 -//.word 0x9671bbfe -//.word 0xbf09f48d -//.word 0xa9cf5e5b -//.word 0x53cea6f7 -//.word 0x66224581 -//.word 0xcf0e4a60 -//.word 0xae485a32 -//.word 0x6f97f509 -//.word 0x36a0fad4 -//.word 0x81fd6e1b -//.word 0x099079f0 -//.word 0xe917b122 -//.word 0x01009cb3 -//.word 0x9d7e6f8c -//.word 0x52dc1c70 -//.word 0x29128c2f -//.word 0x0096291c -//.word 0x2c74a0c0 -//.word 0x63a1e5d0 -//.word 0xda8c775d -//.word 0xaaf7e54b -//.word 0x78059104 -//.word 0x5594b46d -//.word 0xe3cca21a -//.word 0xb9f850be -//.word 0x099513e5 -//.word 0x80a9aae5 -//.word 0x6e577f11 -//.word 0x27af2a31 -//.word 0xa9cb372f -//.word 0x7f172913 -//.word 0xe5f0be31 -//.word 0x2c7175a1 -//.word 0x60894ef0 -//.word 0x2951d115 -//.word 0xef9d51a7 -//.word 0x41d2724d -//.word 0x78f7e975 -//.word 0x970e8349 -//.word 0x76a469de -//.word 0x20a7a2af -//.word 0x7978d94b -//.word 0x2441614a -//.word 0xa3897685 -//.word 0xc005c687 -//.word 0x2cb1303e -//.word 0x6720cbf6 -//.word 0xdf102a89 -//.word 0x5c42decf -//.word 0x9b893d5c -//.word 0x3920626b -//.word 0xd4407515 -//.word 0x6cf22dc7 -//.word 0x0f2392f2 -//.word 0xb5f60804 -//.word 0x695e8998 -//.word 0xa9eb32e9 -//.word 0x10e4018d -//.word 0x3297dd60 -//.word 0xc8edd6be -//.word 0x0d41aff5 -//.word 0x677299f9 -//.word 0x4a37425a -//.word 0x59b30e74 -//.word 0xcf4aa4e6 -//.word 0x1eb2ad45 -//.word 0xd64dd811 -//.word 0xc7b622e7 -//.word 0x6a9a54f9 -//.word 0x7dc9cdbc -//.word 0xee8c81e0 -//.word 0xfa3a4285 -//.word 0x96063fac -//.word 0x0e1bcaeb -//.word 0xeceb5e66 -//.word 0x1bc3e0fa -//.word 0x4ca325bb -//.word 0x994eb5a1 -//.word 0x689dce7e -//.word 0x9318ac33 -//.word 0xc6c70824 -//.word 0x2846dfe9 -//.word 0x3d187447 -//.word 0x0b3d985e -//.word 0x7b072923 -//.word 0x0329d911 -//.word 0x8211301c -//.word 0x6b78d5e7 -//.word 0x26370936 -//.word 0xb35c74a6 -//.word 0x917d249c -//.word 0xde4cd37b -//.word 0xbf6c681a -//.word 0x0283c175 -//.word 0x0291b0a2 -//.word 0xcb804307 -//.word 0x7ffc49cb -//.word 0xf984118a -//.word 0xafc1754d -//.word 0xdd1717b9 -//.word 0xe07beb86 -//.word 0xdf84f633 -//.word 0xb1c455f8 -//.word 0xfb5880fd -//.word 0x99bed0c9 -//.word 0x40e73ffd -//.word 0x618d7042 -//.word 0x50c7ef80 -//.word 0xa5dbb951 -//.word 0xe353ffb5 -//.word 0x57532707 -//.word 0x4329142f -//.word 0x3c26a71a -//.word 0xd1ac8567 -//.word 0x6d891b63 -//.word 0x7f83e038 -//.word 0xd734da61 -//.word 0x53196461 -//.word 0xbce52eb5 -//.word 0xeb1b8507 -//.word 0x30dbd5a4 -//.word 0xf4fc6c30 -//.word 0x9c5c8099 -//.word 0xb1747449 -//.word 0x3e3057a0 -//.word 0x7afdaea1 -//.word 0xa72373eb -//.word 0x3a555deb -//.word 0x3c866251 -//.word 0xf0ff7bc0 -//.word 0xb6afa7ca -//.word 0x2fc2321b -//.word 0xa27537f4 -//.word 0x9f2864dc -//.word 0xe2b4fd92 -//.word 0x79002345 -//.word 0x2acf5707 -//.word 0x0fdc3a80 -//.word 0x832996df -//.word 0x4294a216 -//.word 0xcbab8247 -//.word 0x09c10e79 -//.word 0x3342d490 -//.word 0xf143607c -//.word 0xc05dbbb0 -//.word 0x97bc31d6 -//.word 0xcb7357c1 -//.word 0x30124da3 -//.word 0x817b4180 -//.word 0x01f134e2 -//.word 0x637201cf -//.word 0xe7479bf8 -//.word 0xc7d99633 -//.word 0xd1c6e92b -//.word 0x5534f256 -//.word 0x4166ba28 -//.word 0x8b8d7b87 -//.word 0xcfe05f7e -//.word 0x3aee8b35 -//.word 0xa6335c21 -//.word 0x06eaf078 -//.word 0x0523e9e8 -//.word 0xea156d88 -//.word 0xbfb5710f -//.word 0xb2883844 -//.word 0xbbb516b5 -//.word 0x7f5e7aac -//.word 0x75302c5f -//.word 0x4739d267 -//.word 0x7bfab973 -//.word 0x52bed23e -//.word 0xf02afbbe -//.word 0xbe14809f -//.word 0x0d99e2ef -//.word 0xfc69d71b -//.word 0x9b66911a -//.word 0x506e43e8 -//.word 0x7a74e236 -//.word 0x55d62960 -//.word 0x1eeadf9f -//.word 0x77da5c80 -//.word 0x0cb34a94 -//.word 0x77b8a969 -//.word 0x61fc15ba -//.word 0xea304ce3 -//.word 0x4bb9eb97 -//.word 0xba0678d5 -//.word 0x8f20a518 -//.word 0xa482d3cf -//.word 0x012cd60c -//.word 0xb9f3f880 -//.word 0x0f1b40a7 -//.word 0xdd27f440 -//.word 0x37f05c00 -//.word 0x4bf5c987 -//.word 0x8bf2d693 -//.word 0x0fb4ee74 -//.word 0x342b0ec0 -//.word 0x8ac1cc47 -//.word 0xedea9949 -//.word 0xf1fc43e7 -//.word 0x8442bed8 -//.word 0xce4b235d -//.word 0x5c88f977 -//.word 0x7e17b457 -//.word 0xedd97b16 -//.word 0xb1ca2ea6 -//.word 0x4292a809 -//.word 0xee5741c0 -//.word 0x7ad69787 -//.word 0x0cb28f3f -//.word 0x490b962c -//.word 0xba532d60 -//.word 0x745da477 -//.word 0xf8b72585 -//.word 0x583af54d -//.word 0x9bdff7b4 -//.word 0x63d57275 -//.word 0xcdd01315 -//.word 0x99a3361a -//.word 0x8b116178 -//.word 0x10e0114c -//.word 0x2530bacc -//.word 0x750b097e -//.word 0xc13d6ca9 -//.word 0x8566d40a -//.word 0xd94dbac7 -//.word 0x957760a9 -//.word 0xb8f95985 -//.word 0x0b8a4bfb -//.word 0x01dcf463 -//.word 0xe22d6b05 -//.word 0x2819a888 -//.word 0x2ab247ae -//.word 0xf7d2893e -//.word 0x85b09c41 -//.word 0x0bb21c70 -//.word 0xab82d9ee -//.word 0x5464db33 -//.word 0xe7c7a348 -//.word 0x9819b43a -//.word 0x98e052c9 -//.word 0xf1078a60 -//.word 0xb175724a -//.word 0x4ae5b222 -//.word 0x39f1438b -//.word 0xe66f7722 -//.word 0xcb013ab1 -//.word 0xd9e897a6 -//.word 0x17197ec3 -//.word 0x8d93c416 -//.word 0x60ef6b2c -//.word 0x3e392482 -//.word 0xfcfe123c -//.word 0x7ea6d119 -//.word 0xd804b7a7 -//.word 0xb22c59b3 -//.word 0xf1855104 -//.word 0x941f3f49 -//.word 0xdb460e4f -//.word 0xaf577977 -//.word 0x3ed2cd68 -//.word 0xe6b1f001 -//.word 0x54f8a291 -//.word 0xed8e034b -//.word 0x6c4b55f4 -//.word 0xcd5204df -//.word 0x6ba1e31b -//.word 0x65e6b9eb -//.word 0x4594fc76 -//.word 0xe437dcc0 -//.word 0x880584d9 -//.word 0x50b59c55 -//.word 0xd29412fb -//.word 0x02d51ac2 -//.word 0x562873f9 -//.word 0x278fecc5 -//.word 0x5b6d28d0 -//.word 0x41e09e40 -//.word 0xbc51e3e6 -//.word 0xa44a2cb8 -//.word 0x69870f82 -//.word 0xf94f89d8 -//.word 0xe405454f -//.word 0xbefa1bed -//.word 0xc685d8dd -//.word 0xc4563d67 -//.word 0x38074a20 -//.word 0xb0f4bc5e -//.word 0x7a4dd4ef -//.word 0x7b695a0b -//.word 0x5f5de286 -//.word 0xf3ce4e4a -//.word 0xce039405 -//.word 0x373ec11f -//.word 0x434d3eef -//.word 0x3e5c522e -//.word 0x4c0de9ac -//.word 0x50cb9441 -//.word 0x0d5bd007 -//.word 0x8cb38bc6 -//.word 0xbd10e4b0 -//.word 0x6043334f -//.word 0x264b49bb -//.word 0x1429f910 -//.word 0x29f0d71f -//.word 0x401c3f64 -//.word 0x38249939 -//.word 0x5153dc48 -//.word 0xd9d35146 -//.word 0x090b9adf -//.word 0x2a2bf2ec -//.word 0xfb04b6ec -//.word 0x571e25b2 -//.word 0x1304645b -//.word 0x26e3c483 -//.word 0x0c5348b9 -//.word 0x6c75622f -//.word 0xf83efeb6 -//.word 0x9412c1ea -//.word 0xbb9593aa -//.word 0x1fbe5bcc -//.word 0x902d090e -//.word 0x1fbeda4f -//.word 0x835ed7ff -//.word 0xbc1da0d4 -//.word 0xf68567be -//.word 0xaf2a3f1e -//.word 0x1c839733 -//.word 0xc9f801d4 -//.word 0x813c3965 -//.word 0x6ddd6204 -//.word 0x7f1a9203 -//.word 0x12f4919b -//.word 0xca88dede -//.word 0xc29bf3ee -//.word 0xe677ca6d -//.word 0x9df6a034 -//.word 0xacdcf948 -//.word 0x5769e409 -//.word 0xc82f80ad -//.word 0xb522bfed -//.word 0x3eee6afe -//.word 0x148d66c3 -//.word 0xe0183541 -//.word 0xe3ddbf53 -//.word 0xd9b3539f -//.word 0x248ae9c8 -//.word 0x2646aae6 -//.word 0xefceb233 -//.word 0x185f1406 -//.word 0xee271e06 -//.word 0xd40fdf97 -//.word 0xe2d8e799 -//.word 0xd2694e52 -//.word 0x1d67f8a8 -//.word 0x61071694 -//.word 0x0620f0d3 -//.word 0x2185e3df -//.word 0x9891a51d -//.word 0x8803d158 -//.word 0xe30c9f6e -//.word 0x5ea7f249 -//.word 0x8a299911 -//.word 0x4019cea0 -//.word 0x43410337 -//.word 0x2105df6f -//.word 0x5af48372 -//.word 0xc49d116a -//.word 0x2ea46f3a -//.word 0x4415486d -//.word 0xb3f7546b -//.word 0x8d25daf3 -//.word 0xee5973c5 -//.word 0xe08a109f -//.word 0x7c783e6b -//.word 0x5285a9b7 -//.word 0x0bc6df65 -//.word 0x4d5a57a4 -//.word 0xdffab21f -//.word 0x0ed24074 -//.word 0x4f8fc6e7 -//.word 0x25ba7f58 -//.word 0x45446072 -//.word 0xf962a026 -//.word 0xc29b7857 -//.word 0x411e28d7 -//.word 0x575a3a93 -//.word 0x8cc90a0a -//.word 0xad0c8604 -//.word 0xb93d3380 -//.word 0xff8171ee -//.word 0x80dcff9e -//.word 0x9a4ac179 -//.word 0xe80bc1ef -//.word 0x643e7530 -//.word 0xceb1409f -//.word 0x52f83a83 -//.word 0x65bc3400 -//.word 0xf056f747 -//.word 0xb09ccd09 -//.word 0xdcfb4331 -//.word 0x09c72cd2 -//.word 0x4ccee95e -//.word 0x9e33e81a -//.word 0x847a6bce -//.word 0xefdf8bc1 -//.word 0x60ec7ce4 -//.word 0x514a124e -//.word 0xd1d884e8 -//.word 0x6efa716a -//.word 0x57342086 -//.word 0xc2f70c62 -//.word 0x8cbaa04c -//.word 0x1f4d3faa -//.word 0x996a872f -//.word 0x2b8ed755 -//.word 0xbe060e07 -//.word 0xdd4d969d -//.word 0xcf95a20e -//.word 0x03a4b361 -//.word 0xb2e16165 -//.word 0xbfaf58a2 -//.word 0xe2f9a18f -//.word 0x050e2306 -//.word 0xeeb069f4 -//.word 0x1f67a555 -//.word 0xfa1cf560 -//.word 0x29e2e6fe -//.word 0x3d173781 -//.word 0x95acdf93 -//.word 0x82c1506c -//.word 0xa875fe49 -//.word 0xa8fc1b19 -//.word 0xfcf2a579 -//.word 0x22eea3e2 -//.word 0xfc5bac21 -//.word 0x7783a808 -//.word 0x6beddb64 -//.word 0xc2e91f2f -//.word 0xdd697006 -//.word 0x3312aedd -//.word 0x3b939ff1 -//.word 0x8d3634fe -//.word 0x44b40db2 -//.word 0xa64e3e62 -//.word 0x071954fd -//.word 0xea9a933e -//.word 0x6a928225 -//.word 0xd81baaa7 -//.word 0xa6f49aa5 -//.word 0x831a2e1b -//.word 0xc898119a -//.word 0x139f81f8 -//.word 0x31d95246 -//.word 0x42fb3602 -//.word 0x179a3b8e -//.word 0xdf3f95e1 -//.word 0x03bd9e7d -//.word 0x4ec21ba0 -//.word 0x51adc1bf -//.word 0x069ff830 -//.word 0xb3d5de27 -//.word 0x11358fe3 -//.word 0xae26a429 -//.word 0x90a5f9f2 -//.word 0x1b96b461 -//.word 0x355782f7 -//.word 0xa79b240a -//.word 0xc6762b73 -//.word 0x54b4ff88 -//.word 0xa16f264a -//.word 0xf5e1c3df -//.word 0x32765d42 -//.word 0xb625e239 -//.word 0x7f01ec87 -//.word 0x920b4263 -//.word 0x9d4ba22a -//.word 0xdb1fbe51 -//.word 0x38d2849d -//.word 0xb670a296 -//.word 0x0fd94a39 -//.word 0x9c1532ed -//.word 0x75e78000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00017D70 -//// expected output -//.word 0xb8f33fc3 -//.word 0x94687880 -//.word 0xf8d658c2 -//.word 0x4c4ef826 -//.word 0xcc1fa038 -//.word 0x7545762e -//.word 0xfdb7a546 -//.word 0xeef91283 -//.word 0x07f5ae8e -//.word 0xe7b8ba58 -//.word 0x17b0e492 -//.word 0xaeca1614 -//.word 0x9953b455 -//.word 0x7beb7211 -//.word 0x7647968e -//.word 0x8f12874e -//// SHA512LongMsgvector_123 -//// vector length -//.word 0x00018088 -//// input message -//.word 0xf34105a0 -//.word 0x4a4a02a1 -//.word 0xa07e020a -//.word 0x6a4f4176 -//.word 0xe9c92bf4 -//.word 0x0018ccac -//.word 0x434988c6 -//.word 0x50550c87 -//.word 0x625b84bd -//.word 0x232d0e5e -//.word 0xc20e6f6c -//.word 0x46ba061b -//.word 0x22a7fe36 -//.word 0x098bc7bf -//.word 0x031ec6d6 -//.word 0xc1214bdb -//.word 0x2d9fc4d7 -//.word 0x46733118 -//.word 0x2b0ad81c -//.word 0x756a3ab1 -//.word 0xca734559 -//.word 0xb065cbf3 -//.word 0x9ea33398 -//.word 0x59b76fc4 -//.word 0x7e952eb6 -//.word 0x5a245219 -//.word 0x02faa4e3 -//.word 0xa067c67e -//.word 0x0cb66a26 -//.word 0x9cafc292 -//.word 0x3c6137d6 -//.word 0xc11e5e88 -//.word 0x7ac62821 -//.word 0x084959a7 -//.word 0x70673b89 -//.word 0x6fba93cb -//.word 0x0ef7d462 -//.word 0x757193e2 -//.word 0x04de3b56 -//.word 0xa05e026f -//.word 0x4bb91be2 -//.word 0xf8e82d0b -//.word 0x9dd805d6 -//.word 0x896a88df -//.word 0xf8beebd8 -//.word 0xe5b1262c -//.word 0x1fa4a5e1 -//.word 0x9f8041c3 -//.word 0x19f670bf -//.word 0xd10cb88d -//.word 0xb0d56a92 -//.word 0x977f8c04 -//.word 0xf394174f -//.word 0x927963b7 -//.word 0xb53bdf3f -//.word 0x668a05ca -//.word 0x0b068d81 -//.word 0x3cbae174 -//.word 0xd2e6d284 -//.word 0x40028980 -//.word 0x27ffc08e -//.word 0x24d032cd -//.word 0xed294f38 -//.word 0x9c8735ce -//.word 0x4a70dcf0 -//.word 0xe0fc900a -//.word 0x2a94a575 -//.word 0x2dfa669c -//.word 0xbb894e5e -//.word 0x44bf7bb4 -//.word 0xeff85f94 -//.word 0xe97cb915 -//.word 0xfdbcc3d3 -//.word 0x66d9ad95 -//.word 0xe1664b2d -//.word 0x066f0ba0 -//.word 0xd7ba2987 -//.word 0x9a4c26b5 -//.word 0xe42f761a -//.word 0xf77379e7 -//.word 0x4d73acf3 -//.word 0x755a215e -//.word 0x1ee52c74 -//.word 0x726a60d4 -//.word 0xa519b9d1 -//.word 0xcd821b18 -//.word 0xf457fb93 -//.word 0x6b735c8e -//.word 0x621cfe19 -//.word 0xb685d2ad -//.word 0x0a97b012 -//.word 0x19f14c7f -//.word 0x4a2e6704 -//.word 0x86664225 -//.word 0x46f758c8 -//.word 0xf0854c51 -//.word 0x633f210b -//.word 0xd064a9ca -//.word 0xcd0640ce -//.word 0xa40fbaeb -//.word 0xf18199e7 -//.word 0x6c028324 -//.word 0x0397f47e -//.word 0x2cb03177 -//.word 0x79657d92 -//.word 0x6cff8efc -//.word 0x8eba4271 -//.word 0xbbc98f5e -//.word 0xc09bb843 -//.word 0x285dc75c -//.word 0x52c03780 -//.word 0xc7fcf149 -//.word 0xcb157a75 -//.word 0x325c6a8c -//.word 0x753a20c3 -//.word 0x0529b421 -//.word 0xdf032de0 -//.word 0x617ff416 -//.word 0x5cf88995 -//.word 0x6a71750f -//.word 0x82d7807e -//.word 0xc98523c2 -//.word 0xab0e408c -//.word 0x2b36117c -//.word 0x77415f86 -//.word 0xc071f49a -//.word 0x48ca5284 -//.word 0xbd18a511 -//.word 0xc533f773 -//.word 0xda82a3e6 -//.word 0x58be0c94 -//.word 0xd4f88eb6 -//.word 0xb0deb5fd -//.word 0xec3aad30 -//.word 0x3fbbfa16 -//.word 0x67f86996 -//.word 0xbdb2471d -//.word 0x0c59d040 -//.word 0xa3d2eaa3 -//.word 0xa9781419 -//.word 0xb161990c -//.word 0x8ee20920 -//.word 0x6955e913 -//.word 0x1119aae8 -//.word 0x91dbd844 -//.word 0x08149418 -//.word 0xb5d34480 -//.word 0x52bd89eb -//.word 0xa352727d -//.word 0x4e72efb1 -//.word 0xed1f8843 -//.word 0x62844e4d -//.word 0x6a3612b0 -//.word 0x76bbd6b5 -//.word 0xb64981f4 -//.word 0x76cfd775 -//.word 0xad3aa716 -//.word 0xd3f1462c -//.word 0xf4a13d6d -//.word 0x03403f0e -//.word 0x704c5e28 -//.word 0xfc547e60 -//.word 0xcdba09c7 -//.word 0xbdb7e4ff -//.word 0xf89fa2a0 -//.word 0xc667f8d9 -//.word 0xa564715b -//.word 0x9b556372 -//.word 0xcaa42275 -//.word 0x45e97361 -//.word 0x22b044c1 -//.word 0xd17c9ad1 -//.word 0xac0ccae2 -//.word 0xcedcec00 -//.word 0x29ef8dd3 -//.word 0xd3cca4c3 -//.word 0xa1c7c75f -//.word 0xf7819f00 -//.word 0xdeb29aa9 -//.word 0x5726df32 -//.word 0xf00687a6 -//.word 0x94590ae9 -//.word 0xa7caf79e -//.word 0x53ace947 -//.word 0x1c3bb6ae -//.word 0xbb25e985 -//.word 0x29497349 -//.word 0xfabe9d6c -//.word 0xec1741b2 -//.word 0xc0e53adc -//.word 0x487e1984 -//.word 0xc2fd1948 -//.word 0x648a562a -//.word 0x38dc3937 -//.word 0x2afb3767 -//.word 0x604bbbc5 -//.word 0xc9c660cf -//.word 0xf9896420 -//.word 0x34925a4c -//.word 0xc8c81e0c -//.word 0xa03b0e9b -//.word 0x17ae775f -//.word 0x0a534ecc -//.word 0x31d52186 -//.word 0xaf9b4cc5 -//.word 0xe74c70fe -//.word 0x928e21c0 -//.word 0x0e14dfdc -//.word 0xf9d748c8 -//.word 0xffa38b45 -//.word 0xf0d62040 -//.word 0x1665b7f6 -//.word 0xc51f6e5c -//.word 0x333646be -//.word 0x8afbd8a6 -//.word 0x3ce944ff -//.word 0x97e56b7a -//.word 0x99c45e31 -//.word 0x050e158b -//.word 0xb601655f -//.word 0x34d92c5c -//.word 0x854fcfa8 -//.word 0x4660e6c7 -//.word 0xfa4f35bf -//.word 0xa1eddf79 -//.word 0x8d18d66b -//.word 0x71829674 -//.word 0xbbb41307 -//.word 0x2352ef8c -//.word 0x84a0f103 -//.word 0xeb45b3eb -//.word 0xee4f9a62 -//.word 0x40780b8d -//.word 0x82a7dc3a -//.word 0x5bba09c4 -//.word 0xca83a937 -//.word 0xbb1020b5 -//.word 0xd9309519 -//.word 0xa432a7d9 -//.word 0xc3f05b31 -//.word 0x9b0d597e -//.word 0x207a59e8 -//.word 0xeb3fd843 -//.word 0x8e780f37 -//.word 0x249d259f -//.word 0x2c07a430 -//.word 0x97b02a5b -//.word 0x1f3b6174 -//.word 0xdb343013 -//.word 0x109833bb -//.word 0x4b9869b9 -//.word 0xac9a2d4f -//.word 0x85816812 -//.word 0x242e0491 -//.word 0xec46a437 -//.word 0xab369273 -//.word 0x2775f815 -//.word 0xfa0954fc -//.word 0xa04d26ee -//.word 0xcff1ebc7 -//.word 0x06424fd6 -//.word 0x69ac9f84 -//.word 0xcc7d7d36 -//.word 0x0eebd775 -//.word 0xa8591a4d -//.word 0x85d6a2f2 -//.word 0x15e776aa -//.word 0x9d8632e6 -//.word 0xd16a44b2 -//.word 0xa4895b50 -//.word 0x5fdc1d20 -//.word 0xf06219c4 -//.word 0x8567fc80 -//.word 0x5a0607e7 -//.word 0xcfedc0b4 -//.word 0xbe60e8f6 -//.word 0x0b81ae70 -//.word 0x7dce223f -//.word 0xccebecbd -//.word 0xfba23ea6 -//.word 0xe7280779 -//.word 0x21a16a21 -//.word 0xf9e76ed5 -//.word 0xdb87f73d -//.word 0xdf0df5d6 -//.word 0x9b82db97 -//.word 0x3c3253d5 -//.word 0xd5b32f64 -//.word 0xf622a3ff -//.word 0x81b0b2e9 -//.word 0xb95de7d5 -//.word 0x9c044504 -//.word 0x739880ad -//.word 0xa7ad6ea1 -//.word 0xd63ab82f -//.word 0x269dd545 -//.word 0xd9df39d9 -//.word 0x223ac987 -//.word 0x37d8937c -//.word 0xa8debc92 -//.word 0xefa9b9bc -//.word 0x4857c2a5 -//.word 0xc38a8494 -//.word 0x97681793 -//.word 0xb9e72fd0 -//.word 0xad479643 -//.word 0x9de0da91 -//.word 0xa81d4331 -//.word 0x7cc907cd -//.word 0x2789c1eb -//.word 0x2aaa20cc -//.word 0xcf1ddc94 -//.word 0xbdc0efac -//.word 0xcae00165 -//.word 0x10fb24de -//.word 0x43cac127 -//.word 0x427ed2a6 -//.word 0xeb4b52ba -//.word 0x3423f29f -//.word 0x77c40e92 -//.word 0x0ef4df35 -//.word 0x200bf234 -//.word 0xbab3d929 -//.word 0x22ec20bd -//.word 0x68538310 -//.word 0x3da35d5c -//.word 0x087c64d5 -//.word 0x376394d3 -//.word 0xd30b6932 -//.word 0x58d251f9 -//.word 0xc38f613b -//.word 0xec8b473b -//.word 0x16cd80d3 -//.word 0xc59bcb17 -//.word 0xd03ddd35 -//.word 0xb60456a0 -//.word 0x358bf46d -//.word 0x193d06fd -//.word 0x531724dc -//.word 0x4aaf1ee9 -//.word 0x767632b7 -//.word 0x2a3a8234 -//.word 0xb1efc588 -//.word 0x9dae3c40 -//.word 0x5cfee7ac -//.word 0x0c53fa85 -//.word 0x90d48bd3 -//.word 0xe4618d0e -//.word 0xadd50184 -//.word 0x15886bfa -//.word 0xd5198396 -//.word 0x936a2efd -//.word 0x6febacb8 -//.word 0xd91c13dc -//.word 0xa54dfcea -//.word 0x61a87cf4 -//.word 0xe6725601 -//.word 0x2d8e6eb3 -//.word 0x64438127 -//.word 0x413f141d -//.word 0x97dbaa59 -//.word 0x27a03a49 -//.word 0xb80ae0e7 -//.word 0x6a8dd3e1 -//.word 0x47d697f7 -//.word 0x1b5374a5 -//.word 0x85f52603 -//.word 0x4f35d6e9 -//.word 0xfb554956 -//.word 0x9ee85813 -//.word 0xf294a093 -//.word 0xa6177a1e -//.word 0xf8882e2f -//.word 0x86df631a -//.word 0x61b8daf1 -//.word 0x64545ca9 -//.word 0xc4e1f179 -//.word 0xe7fb5383 -//.word 0x7a72a2b6 -//.word 0xbe4e59f3 -//.word 0x2210816e -//.word 0x173b2558 -//.word 0x201305bb -//.word 0x28a58ea5 -//.word 0x19070a88 -//.word 0xaae115e1 -//.word 0x792c5018 -//.word 0x593a59a7 -//.word 0xedf7fa7f -//.word 0x766ea0a7 -//.word 0xe98f0f27 -//.word 0x452f5524 -//.word 0x2350fc4c -//.word 0x8ea38475 -//.word 0x164b1180 -//.word 0x20e46084 -//.word 0x80c4ff29 -//.word 0x4a80be51 -//.word 0xe4b261fe -//.word 0x60fa9770 -//.word 0x0943308d -//.word 0x3c488a86 -//.word 0x7a564cb8 -//.word 0xba5357d0 -//.word 0x04fffa33 -//.word 0x3b7a659d -//.word 0x3b076107 -//.word 0x240f3ecf -//.word 0xf4690c13 -//.word 0x5cd80e5d -//.word 0xccd56b86 -//.word 0xd18f27d4 -//.word 0xa0315266 -//.word 0xf3637fd2 -//.word 0x1313780c -//.word 0x3675308a -//.word 0x0c48f9a5 -//.word 0x955cf743 -//.word 0x3551d5b3 -//.word 0x0aa1b6d8 -//.word 0x7de16f8a -//.word 0x1743f339 -//.word 0x97600ed3 -//.word 0x413457e8 -//.word 0x786a600d -//.word 0x8fda2f7e -//.word 0xdd51f207 -//.word 0x0f90ee24 -//.word 0xc297b967 -//.word 0x5223a91a -//.word 0xec758c26 -//.word 0xeb559933 -//.word 0x6157a711 -//.word 0xf35d9d56 -//.word 0xeb5d2a49 -//.word 0x8864b6ff -//.word 0x98db98c4 -//.word 0x490a89bd -//.word 0x3dda58cb -//.word 0xdcdfe0b1 -//.word 0xee95387a -//.word 0x69ea2915 -//.word 0x87fde543 -//.word 0x1c26f5b3 -//.word 0x2736746a -//.word 0xa7007b69 -//.word 0xb018dc8a -//.word 0xbdda13ac -//.word 0x48ae790f -//.word 0x988bbb01 -//.word 0xdbba8bbb -//.word 0x74dd9586 -//.word 0x962fb522 -//.word 0x120d6767 -//.word 0x6db67f2d -//.word 0x364f1a6a -//.word 0x962ad49a -//.word 0x29473b64 -//.word 0x0c1b847a -//.word 0x38917dc1 -//.word 0x0e4fc3b2 -//.word 0x323a3500 -//.word 0x9d3ca87a -//.word 0xee45dd34 -//.word 0x018fb0e1 -//.word 0xc3279184 -//.word 0x45a93848 -//.word 0x0f4a95ab -//.word 0xb61c06e2 -//.word 0xb18ecd79 -//.word 0x6832c13b -//.word 0x8ec44351 -//.word 0xb16774ae -//.word 0x0f31a6aa -//.word 0xacea10ec -//.word 0xa111c58e -//.word 0xb720e77c -//.word 0x3412171d -//.word 0xf5213136 -//.word 0xbdd4360b -//.word 0xcd398ac7 -//.word 0xb56f601d -//.word 0x69687230 -//.word 0x97edf5b0 -//.word 0x38e3cc46 -//.word 0x66ccfc33 -//.word 0x6d916034 -//.word 0x247e9ea8 -//.word 0x7e8e59f4 -//.word 0x5ce9a827 -//.word 0xa5abc7da -//.word 0x99e70d5b -//.word 0x62ec1e0a -//.word 0xecc66202 -//.word 0xf708b6fc -//.word 0x6bc96171 -//.word 0xebed49ff -//.word 0xaca6670e -//.word 0x883978b3 -//.word 0x4e06f5d5 -//.word 0x5dc3468e -//.word 0x710833d3 -//.word 0xbc109b58 -//.word 0x39be68ae -//.word 0x3ddec2ae -//.word 0x4fae831b -//.word 0x399ceb83 -//.word 0x5f529666 -//.word 0x50f0aa9b -//.word 0x9b9855ee -//.word 0xe430770e -//.word 0x36639ba7 -//.word 0x9be92ccb -//.word 0xea09e696 -//.word 0xe15c8a12 -//.word 0x73d3d658 -//.word 0x63fbb4f8 -//.word 0x1280b29b -//.word 0x96f1b2e7 -//.word 0x0bc2e2a3 -//.word 0x2e97ef1c -//.word 0x28c076c7 -//.word 0xa7ffbc27 -//.word 0x33929ef1 -//.word 0xc06dcb6f -//.word 0x7fc83022 -//.word 0xfad9b4ab -//.word 0x60e326ec -//.word 0x1d6f736a -//.word 0xaed91df5 -//.word 0xb40fe88c -//.word 0x4796d77b -//.word 0x8cce56c6 -//.word 0x8a76b9ca -//.word 0x3972e522 -//.word 0xdccc4dc8 -//.word 0x91fa217c -//.word 0x275fc16a -//.word 0x2f147807 -//.word 0x56e7673c -//.word 0xf2a4bfc6 -//.word 0xda9434dd -//.word 0x7b44ae13 -//.word 0x28874180 -//.word 0xb2be5f1c -//.word 0x39574c6c -//.word 0x4194d361 -//.word 0x088e387d -//.word 0x18796d37 -//.word 0x182988a1 -//.word 0xe7d57548 -//.word 0xec1ce85b -//.word 0xa7459610 -//.word 0x8ccba544 -//.word 0x12196162 -//.word 0x07923085 -//.word 0x26d4c8e1 -//.word 0xeb3e9f5f -//.word 0xa6b0a387 -//.word 0xcf912ca3 -//.word 0x99172f21 -//.word 0xc9c2b43a -//.word 0xc92a8ad1 -//.word 0xf8fb399e -//.word 0x453e388b -//.word 0xfcda605e -//.word 0xdf5aa199 -//.word 0x79f0f49e -//.word 0xafba9017 -//.word 0x98456195 -//.word 0x8f50b677 -//.word 0x86d23a0e -//.word 0x9d3e25ff -//.word 0xf305b3e8 -//.word 0xbb5cd646 -//.word 0x93412796 -//.word 0x12b823ba -//.word 0xa05b949f -//.word 0x8b114d1d -//.word 0x571e1a1e -//.word 0x555cf703 -//.word 0x77c78043 -//.word 0x623fa955 -//.word 0xc58aafd1 -//.word 0xe9994fd2 -//.word 0x8a0c359e -//.word 0xe6f8b789 -//.word 0x13e7c316 -//.word 0x95201660 -//.word 0x3029afb8 -//.word 0xfb8b8490 -//.word 0xb6d57398 -//.word 0x5de37b26 -//.word 0xfd602cdb -//.word 0xc78a5c84 -//.word 0x63351c3e -//.word 0x8713ebde -//.word 0xc732298f -//.word 0xafc6cebd -//.word 0x0f295b32 -//.word 0x9620117f -//.word 0xa260619e -//.word 0x5751a5d5 -//.word 0xef110ddd -//.word 0x50bcdc44 -//.word 0xe4ebd410 -//.word 0xa57aeea5 -//.word 0x778f4fe9 -//.word 0xbbd778a5 -//.word 0x2113bd2f -//.word 0xbdd4f846 -//.word 0x5e827e3d -//.word 0x1ba3525c -//.word 0x2e5a9983 -//.word 0x062e4e10 -//.word 0x970d3703 -//.word 0xf5911860 -//.word 0x218226d5 -//.word 0x229bbe9d -//.word 0x589157a4 -//.word 0x0e51b6ec -//.word 0x4e89612f -//.word 0xf96b55c6 -//.word 0x17aefbc9 -//.word 0x6bd55978 -//.word 0x4ab385d9 -//.word 0xae2f60a3 -//.word 0x8745805b -//.word 0x514d6ebd -//.word 0xeb80125d -//.word 0xa7b86b8e -//.word 0x9e778483 -//.word 0x462ba3b4 -//.word 0x46b0c383 -//.word 0x88174420 -//.word 0x90a6e2aa -//.word 0x0d1fe497 -//.word 0xae469555 -//.word 0x379df831 -//.word 0xd472b879 -//.word 0xad1b5edd -//.word 0xba81c61b -//.word 0xd9dbd4dc -//.word 0x1ebc63d8 -//.word 0x6a507e41 -//.word 0x3fe2d35f -//.word 0xd2a26478 -//.word 0x62a680f2 -//.word 0xc92ef2bb -//.word 0x512c78e9 -//.word 0xc804779e -//.word 0xd790ec2f -//.word 0x8f67a685 -//.word 0x455fb3c3 -//.word 0xa0501828 -//.word 0xf01bc538 -//.word 0xc1ebc716 -//.word 0xb1bbc035 -//.word 0x7e19942f -//.word 0x632966f5 -//.word 0xa5ecc329 -//.word 0x69c21cc8 -//.word 0xc82e7a0c -//.word 0x25da6d91 -//.word 0xbedb45b6 -//.word 0x82358546 -//.word 0x23a29558 -//.word 0x6b8fb773 -//.word 0xd3683cf6 -//.word 0x5215f8b7 -//.word 0x73c5f3eb -//.word 0xaaea6146 -//.word 0xe884d563 -//.word 0x6da3b165 -//.word 0xde27e1df -//.word 0x97cbc9f1 -//.word 0x42627bb4 -//.word 0xa8602ed8 -//.word 0xc89bec8c -//.word 0x26538a9e -//.word 0x6670dde4 -//.word 0x190c2bda -//.word 0xd731e08c -//.word 0x8ee482b7 -//.word 0x1962e72b -//.word 0x15a9a673 -//.word 0xf03acbb8 -//.word 0x421ecfe3 -//.word 0x6127c702 -//.word 0x3078dbed -//.word 0x3747fa29 -//.word 0xf9e2cc0c -//.word 0x81f0e822 -//.word 0x3ffa48d0 -//.word 0x122af937 -//.word 0xa652175b -//.word 0x002ff985 -//.word 0x57f0a9e6 -//.word 0x26f2977c -//.word 0x7fce8e3a -//.word 0xa295e663 -//.word 0xce5afc37 -//.word 0x57f1dfd1 -//.word 0xf9f74c50 -//.word 0x6c12dd35 -//.word 0x387a7d0c -//.word 0xcbb91f4f -//.word 0xc9afb087 -//.word 0xa3d849b4 -//.word 0x6bd2aaef -//.word 0xe719e44e -//.word 0xe4165508 -//.word 0xcc58d9d9 -//.word 0x7b213fa8 -//.word 0x4f24fa68 -//.word 0x7e8d193c -//.word 0xad427ade -//.word 0xbe683a41 -//.word 0xe92a6f75 -//.word 0x0eb51acc -//.word 0x4987573b -//.word 0xc8ead702 -//.word 0xd9bb908f -//.word 0x4770b3a0 -//.word 0xe75adfa9 -//.word 0x6e269475 -//.word 0x85aaea0f -//.word 0x20df83e3 -//.word 0x0b29be21 -//.word 0xc5df2d62 -//.word 0x92074a8e -//.word 0xcc6165fd -//.word 0x7aa8e1dc -//.word 0x2414a0d3 -//.word 0xe523bce4 -//.word 0xc1997897 -//.word 0x39c57654 -//.word 0x1d072a10 -//.word 0xa28f8e2c -//.word 0xb4671799 -//.word 0x8db4e841 -//.word 0x873947a2 -//.word 0x2e1c4dbc -//.word 0x9aede12e -//.word 0xfce4e79c -//.word 0x766ab453 -//.word 0x30dbc530 -//.word 0xa88bb1be -//.word 0x49075d9e -//.word 0x409d6f2c -//.word 0x8b1e055f -//.word 0x52e2a6f1 -//.word 0x7b0d79c0 -//.word 0x7911b475 -//.word 0x64745863 -//.word 0x4fd41cb2 -//.word 0xd628a6bc -//.word 0xf64801b7 -//.word 0x22b04c95 -//.word 0x9280af28 -//.word 0xdfc8948a -//.word 0xcd0313bc -//.word 0x67e1ad8d -//.word 0x524a3ebd -//.word 0x5b9f2d63 -//.word 0x5243e68c -//.word 0x1b5a8a25 -//.word 0x02d0e41b -//.word 0x4f9da0c0 -//.word 0x1a48b771 -//.word 0x61aa2e76 -//.word 0x58f50029 -//.word 0x00f5595a -//.word 0xfb9504f3 -//.word 0x9fa427d8 -//.word 0x49d92e11 -//.word 0xf415052b -//.word 0x0ae98adb -//.word 0x795842e5 -//.word 0x0ade4a3c -//.word 0xefb1916b -//.word 0x9a464533 -//.word 0xd6178b76 -//.word 0x10a47354 -//.word 0xf5b72b93 -//.word 0x43ed7344 -//.word 0xd87250a3 -//.word 0x100c0540 -//.word 0x4d5b3f5c -//.word 0xd75f9096 -//.word 0xe73a1ec7 -//.word 0xfe379d2a -//.word 0x7b0c7ac0 -//.word 0x6d5c59f2 -//.word 0xa680c279 -//.word 0x1187177b -//.word 0x457bcaf6 -//.word 0x59e6cc62 -//.word 0xfa954992 -//.word 0xbc9c92dc -//.word 0xae9b5b79 -//.word 0x313f262e -//.word 0x0a0bff2c -//.word 0xb5586a36 -//.word 0xfc9a9a01 -//.word 0xc9e6e3e0 -//.word 0x39b172a1 -//.word 0xf1db3cb1 -//.word 0xb5ec3487 -//.word 0x379dc140 -//.word 0x2c9a6f87 -//.word 0xa586e5b8 -//.word 0x9d3f1745 -//.word 0xce64bc58 -//.word 0xca1503ba -//.word 0x46fa81f3 -//.word 0xb9876eb3 -//.word 0x267e1270 -//.word 0x35b57a51 -//.word 0x89196f4b -//.word 0x4ef3a98a -//.word 0x116a3f12 -//.word 0xd54962a6 -//.word 0x63034be8 -//.word 0xe1f572c3 -//.word 0xa6ea0106 -//.word 0x4de48851 -//.word 0x081af235 -//.word 0x373db897 -//.word 0x3aff5455 -//.word 0x83d6f92d -//.word 0xeffd81da -//.word 0x56bda77f -//.word 0x61ea7649 -//.word 0x9bb00150 -//.word 0xcb9055bf -//.word 0x82a5ac35 -//.word 0xf02ce36b -//.word 0xfb432e16 -//.word 0x93f10b0f -//.word 0x3f6774b1 -//.word 0xfc855982 -//.word 0x48a04d16 -//.word 0x7a838031 -//.word 0x54b3ed2c -//.word 0xdbf8d49a -//.word 0x66186b2b -//.word 0xf6e6d1d0 -//.word 0xc57b431f -//.word 0x22c492fa -//.word 0x7b3dd46b -//.word 0xbcfb5ad3 -//.word 0xd8f0e344 -//.word 0xa46b0f2b -//.word 0xecde1732 -//.word 0xc1e4ba64 -//.word 0x10827b92 -//.word 0x79ad09f6 -//.word 0x5d0dff17 -//.word 0x3901cdec -//.word 0x33e3f644 -//.word 0xf38d7d66 -//.word 0xb41c99f4 -//.word 0x9bf4b015 -//.word 0x470483d2 -//.word 0xa94ba7c1 -//.word 0x169a34e1 -//.word 0x9a9cc1c6 -//.word 0x90158ff6 -//.word 0x6f670492 -//.word 0xe75a5b39 -//.word 0x2d1c9b29 -//.word 0x9387c5a7 -//.word 0x5ba352a2 -//.word 0xcd6cdc93 -//.word 0x87d51ca7 -//.word 0x150c1420 -//.word 0xc1008df8 -//.word 0xac21c4c8 -//.word 0x1e6661e9 -//.word 0x1b95a8d9 -//.word 0x37bff3e0 -//.word 0xab0960f3 -//.word 0xa7b3c7d8 -//.word 0xea52ef8b -//.word 0x916001e1 -//.word 0x2cf73c6b -//.word 0x17daeb9d -//.word 0x08b5942f -//.word 0xe4a673c4 -//.word 0xd7fb26ca -//.word 0xa33eaaa1 -//.word 0x386f86ff -//.word 0x86904693 -//.word 0x8f672be8 -//.word 0xc07f218d -//.word 0x8170f173 -//.word 0x0b60b896 -//.word 0x79ca98df -//.word 0x227ead49 -//.word 0x27e94344 -//.word 0x48974657 -//.word 0xfcf6f908 -//.word 0xc05deb00 -//.word 0xaf4c286b -//.word 0x53f6ac9e -//.word 0xbbfc1dfc -//.word 0xcd7cb91a -//.word 0xde4a8d21 -//.word 0x807de774 -//.word 0x9b2e0f93 -//.word 0xc07c3240 -//.word 0xb9d39fe0 -//.word 0x656f3623 -//.word 0xc31b1ce7 -//.word 0x4c3fb45a -//.word 0x8619cb5f -//.word 0xd64b1334 -//.word 0x9596d351 -//.word 0x67e5dc93 -//.word 0xc88dbf99 -//.word 0xe8d33d6f -//.word 0xb9afff69 -//.word 0x46cf8852 -//.word 0x46df67c6 -//.word 0xf108b1dd -//.word 0x12b6ae0a -//.word 0x5e9fd342 -//.word 0x0401f060 -//.word 0x852aabc8 -//.word 0xc63e2d4a -//.word 0x64351b4a -//.word 0x4723c81e -//.word 0x7abca9b8 -//.word 0x39170985 -//.word 0x4cb2fd94 -//.word 0x94b79bfb -//.word 0xe47d6777 -//.word 0x12520e52 -//.word 0x4d78578a -//.word 0xb06d562f -//.word 0x186fe30d -//.word 0x33404a8b -//.word 0xda2744d3 -//.word 0xa1372633 -//.word 0xacd359c3 -//.word 0xc4720a49 -//.word 0xa9a02259 -//.word 0xaa4679c1 -//.word 0x742a4624 -//.word 0x28b9dbe4 -//.word 0xb0058f45 -//.word 0x520afbd0 -//.word 0x853569f6 -//.word 0x042789f6 -//.word 0x22b66601 -//.word 0x5d34999b -//.word 0x35f4bc44 -//.word 0x3f0b2258 -//.word 0x7554c534 -//.word 0xd0b7809a -//.word 0x19aa7f57 -//.word 0xfcf7f322 -//.word 0x5ec00ac8 -//.word 0xf0c11e86 -//.word 0x04d62db6 -//.word 0xa0bd89af -//.word 0xd11cd0e6 -//.word 0x42c61f59 -//.word 0x0d3a832d -//.word 0xd16db095 -//.word 0x05c9f6f7 -//.word 0x8c75704a -//.word 0x89d77fc3 -//.word 0x745776b0 -//.word 0x6e6697a4 -//.word 0xd1bf3fd4 -//.word 0x0ced5dc1 -//.word 0xae0e2817 -//.word 0xc0d612d5 -//.word 0x58d7f7af -//.word 0x6bff9bb1 -//.word 0xe3625324 -//.word 0xf13902b5 -//.word 0xa52b47d4 -//.word 0xbcccf55b -//.word 0xb964c470 -//.word 0x37f146ac -//.word 0x7d6f1c7d -//.word 0x535669c8 -//.word 0x146587d3 -//.word 0x059ef963 -//.word 0xe592a121 -//.word 0xc5de3342 -//.word 0x1af6ea67 -//.word 0x11217ac2 -//.word 0x22c5457b -//.word 0xe8e5d152 -//.word 0x30e87a85 -//.word 0x509c64f4 -//.word 0xba7ab483 -//.word 0xd02c00c0 -//.word 0xfa4c03c6 -//.word 0xf66f9661 -//.word 0x7062dc72 -//.word 0xd3b3bc95 -//.word 0x5e739402 -//.word 0x7a3b2bb1 -//.word 0x4b6de8c2 -//.word 0x85bc421b -//.word 0x81ef7853 -//.word 0x90e182cf -//.word 0x8fcd472a -//.word 0xbbc810da -//.word 0xc78f3d11 -//.word 0x2c8337e2 -//.word 0xc1f2a5a5 -//.word 0x8b98e39c -//.word 0xd666afd7 -//.word 0x84822654 -//.word 0xa68ef06b -//.word 0x492db769 -//.word 0x92c3dd7c -//.word 0x0e7d6ecf -//.word 0x439253f5 -//.word 0x8bc8c98b -//.word 0x22391219 -//.word 0x7d576a3a -//.word 0xdd2e3dfd -//.word 0x25e9978a -//.word 0xe898dc09 -//.word 0xc730b9bf -//.word 0xfad35a7a -//.word 0x2c52de30 -//.word 0x8cf108e3 -//.word 0x216a37c7 -//.word 0x5d3498a7 -//.word 0xf6049a85 -//.word 0xf195a281 -//.word 0x00a501fc -//.word 0x0d4023fc -//.word 0x174008d2 -//.word 0x3d15f8fb -//.word 0x18c27345 -//.word 0x4e286832 -//.word 0x6487a7a1 -//.word 0xd44297ab -//.word 0x60e22ccc -//.word 0xa55e1443 -//.word 0xf39a31bb -//.word 0x5c2d4c2a -//.word 0x0b6708fa -//.word 0xd8931467 -//.word 0x1979a528 -//.word 0xba272451 -//.word 0x90f12378 -//.word 0xeab79616 -//.word 0x69664031 -//.word 0x12c16b38 -//.word 0xa262dc2f -//.word 0x21fb060b -//.word 0xbae27e60 -//.word 0xcacdaf39 -//.word 0x37dacf47 -//.word 0x03d2123f -//.word 0x21ae1d7d -//.word 0x875abded -//.word 0x84bad92b -//.word 0x54eba5e9 -//.word 0xf2cb1992 -//.word 0x2dbba22c -//.word 0xfea31783 -//.word 0x1937ee84 -//.word 0xc279b0e7 -//.word 0xe27faa11 -//.word 0x5a77e638 -//.word 0x97e859c8 -//.word 0x663b5e05 -//.word 0x0a7963f2 -//.word 0x8d56e272 -//.word 0x536f94ae -//.word 0xf5d0e1b6 -//.word 0x4cb99a6b -//.word 0xcba2ea9c -//.word 0x127c8a6f -//.word 0xc13a3503 -//.word 0x8a905c53 -//.word 0x8bfa1a5e -//.word 0xda016a85 -//.word 0x61ba9834 -//.word 0xec8ff5c4 -//.word 0x8041cfa0 -//.word 0xef2ea0a7 -//.word 0xa9d086d2 -//.word 0xd587f317 -//.word 0xa098a68d -//.word 0xd575dad0 -//.word 0xaf3fbda7 -//.word 0xeb8923e4 -//.word 0x205f7c8c -//.word 0x53860338 -//.word 0xc60639bb -//.word 0x12e69205 -//.word 0x75376e48 -//.word 0x6d544a59 -//.word 0x86673858 -//.word 0x702f8c93 -//.word 0x5401d9a8 -//.word 0x680d1cea -//.word 0xc2e33606 -//.word 0x6a36a0e7 -//.word 0xb2df5ad6 -//.word 0xca2424e6 -//.word 0x8f3bf18f -//.word 0xa40a9999 -//.word 0xc431ce3b -//.word 0x564a5185 -//.word 0x426f65fb -//.word 0x04fd8583 -//.word 0xff985281 -//.word 0x1370cf40 -//.word 0x71c2d094 -//.word 0xaea1b0bd -//.word 0x17f6438f -//.word 0x45c60bd0 -//.word 0xf1b3afe2 -//.word 0x09c6a8a1 -//.word 0x026b3e8f -//.word 0x71bdb32f -//.word 0xd504beae -//.word 0xb77c3bc8 -//.word 0xf65920ea -//.word 0x5c07b394 -//.word 0x74b6fa02 -//.word 0xa016730b -//.word 0x665f0649 -//.word 0x0b95387a -//.word 0x630aa126 -//.word 0xe724a083 -//.word 0x08604d95 -//.word 0xc397af99 -//.word 0x768130a4 -//.word 0xf2774d88 -//.word 0xd17d92f7 -//.word 0x0a7fc6eb -//.word 0xc2db6344 -//.word 0x652049b3 -//.word 0xf615b2d8 -//.word 0xa3fe69a7 -//.word 0x9d1a3710 -//.word 0x26709edf -//.word 0xeccccae1 -//.word 0x9504c548 -//.word 0x9b7fea50 -//.word 0x5af89c23 -//.word 0x678038fa -//.word 0x24c24786 -//.word 0x918bf98e -//.word 0x658acfd9 -//.word 0x5e54974e -//.word 0xd5aa9d5a -//.word 0x95ff2092 -//.word 0xed35039a -//.word 0x04a8c545 -//.word 0x6d6db3fd -//.word 0xfbdc5c66 -//.word 0xd74b463e -//.word 0xcf1ddf88 -//.word 0xf1fcb6e9 -//.word 0x5962eb52 -//.word 0x475ee5df -//.word 0x759542ff -//.word 0xa78714d6 -//.word 0x83134adf -//.word 0xa33d6cd6 -//.word 0xe9308cd5 -//.word 0x127f79bd -//.word 0x8eb035d7 -//.word 0x8ffba9bb -//.word 0x614f9871 -//.word 0xf996d2d7 -//.word 0xd03aaa42 -//.word 0xf2e8a968 -//.word 0x5194847e -//.word 0x60bd4c9d -//.word 0xddf2e56a -//.word 0xee95b9f6 -//.word 0x70dfade3 -//.word 0x8c2455c9 -//.word 0x8b5863d7 -//.word 0xebd366be -//.word 0xb251b1ca -//.word 0x023d9852 -//.word 0xee2fe353 -//.word 0x8cb37c58 -//.word 0x4b4c6b9d -//.word 0x87b80473 -//.word 0x5b765fe6 -//.word 0xb786099e -//.word 0xb270f903 -//.word 0x2187c6a5 -//.word 0x686f17da -//.word 0x90dd5aa9 -//.word 0x9a9eb9e6 -//.word 0x13db499f -//.word 0xe99b85b7 -//.word 0x7d89fcd1 -//.word 0xf9f8466f -//.word 0xe4243c5b -//.word 0xf4ba6947 -//.word 0x239bbbb0 -//.word 0x04dd7e08 -//.word 0x58138b13 -//.word 0xddcfbd92 -//.word 0x6665a51f -//.word 0x30f17f58 -//.word 0x749b643f -//.word 0x3919c1e1 -//.word 0x6c760736 -//.word 0x3212a449 -//.word 0x7deb3398 -//.word 0xde1aefbe -//.word 0x9aa16e4f -//.word 0xff638c04 -//.word 0xf874a518 -//.word 0xe09307f1 -//.word 0x94f5a603 -//.word 0xcc4512f2 -//.word 0xabe8a7f6 -//.word 0x94850384 -//.word 0x40c5be2b -//.word 0x0d5755bc -//.word 0x993866ad -//.word 0x903123bf -//.word 0xc2a101df -//.word 0x797cb04a -//.word 0x099450f5 -//.word 0xa817e22c -//.word 0x8059fc79 -//.word 0x03d4c1c7 -//.word 0x7f6e11c7 -//.word 0xf2fafd93 -//.word 0x1f007e92 -//.word 0xe1c1669b -//.word 0xc076965d -//.word 0xc2d972fe -//.word 0x83e69202 -//.word 0x88e3ba6f -//.word 0xd19e0d2e -//.word 0xadf67db5 -//.word 0xd39c86e3 -//.word 0xad1b1c2b -//.word 0xf716e2f5 -//.word 0x89d19c41 -//.word 0x71f4e78e -//.word 0x458b28fa -//.word 0xb850c2aa -//.word 0x6a2d8c6c -//.word 0x05fd829b -//.word 0x8593ba44 -//.word 0xd7fd9a86 -//.word 0xa609493f -//.word 0x720963e5 -//.word 0xe2d4f1b1 -//.word 0x5b0d9803 -//.word 0xd1a81002 -//.word 0xdda9d882 -//.word 0x102f282c -//.word 0x88b228d8 -//.word 0xc0895f3e -//.word 0xacaf6ece -//.word 0x06c6fedc -//.word 0xe35cf700 -//.word 0x896ef2bd -//.word 0x842af260 -//.word 0xf7f94e2b -//.word 0x31bdf2b3 -//.word 0x8057c887 -//.word 0x4a6d7012 -//.word 0x596a37c3 -//.word 0x77c6476b -//.word 0x3b871be6 -//.word 0x220836fd -//.word 0xe1f9158b -//.word 0xfaa762df -//.word 0x8e7d6a62 -//.word 0x72cbd179 -//.word 0x85c784ad -//.word 0x40d2f00a -//.word 0x8efc72c4 -//.word 0xdec90e21 -//.word 0x77366392 -//.word 0x0cf7de23 -//.word 0x91032f16 -//.word 0x4d52f9cb -//.word 0x2fe5cee4 -//.word 0x65085aa6 -//.word 0x2bd4dea1 -//.word 0xe1f7e193 -//.word 0x61b8228a -//.word 0x8f35d049 -//.word 0x32effded -//.word 0x028951d0 -//.word 0x01cdfbae -//.word 0x0ff0ed06 -//.word 0xb91749c3 -//.word 0x5319161c -//.word 0x468738b9 -//.word 0xaaea9f17 -//.word 0x184bbe2d -//.word 0xb9f93f50 -//.word 0xa386f554 -//.word 0x661312f4 -//.word 0xe1cd9a73 -//.word 0x5bb81784 -//.word 0xcfac8f68 -//.word 0x869db356 -//.word 0xeb1f591f -//.word 0x9c282c12 -//.word 0xbd18a21d -//.word 0x91f82f36 -//.word 0x4bffb9f9 -//.word 0x215b4b93 -//.word 0xa32e0dde -//.word 0x4bd674cd -//.word 0x5571b60b -//.word 0xd0a081df -//.word 0xf68cec53 -//.word 0xb927ae95 -//.word 0x9eb58d9d -//.word 0xce8a1a10 -//.word 0x6b159c65 -//.word 0x201d4a46 -//.word 0xfc4bbd39 -//.word 0x80e9a47f -//.word 0xf6e9ba3c -//.word 0x0529f5d9 -//.word 0x83f500a7 -//.word 0x8aceecc5 -//.word 0xce692343 -//.word 0x2dfb9d87 -//.word 0x88b456f0 -//.word 0xd289ffba -//.word 0x6637f322 -//.word 0x9e856eca -//.word 0xa1c9f95e -//.word 0x7cad2978 -//.word 0x753389c1 -//.word 0x9bf7d55a -//.word 0xa2b5697a -//.word 0xee0af858 -//.word 0xee7f814b -//.word 0xabc37f2f -//.word 0xa138610c -//.word 0xcdb139f2 -//.word 0x077bb827 -//.word 0x929a5a85 -//.word 0xf254de1d -//.word 0xfdf4f920 -//.word 0x35c84b00 -//.word 0x556c92d2 -//.word 0x2a4a1ef7 -//.word 0xa46285fb -//.word 0x2d4797bd -//.word 0x396a94d0 -//.word 0x1f9b9d22 -//.word 0x27cd69db -//.word 0xe41a3988 -//.word 0xc4070e79 -//.word 0xe5081967 -//.word 0x2a47735b -//.word 0x8fa10eca -//.word 0xb9f1ec05 -//.word 0xd2928ed1 -//.word 0x931fb051 -//.word 0xa27d332d -//.word 0x1f1c5bed -//.word 0x79793aa6 -//.word 0x87e86cd9 -//.word 0xd4900598 -//.word 0x3ab7c8ea -//.word 0xb2409a71 -//.word 0x6a71364a -//.word 0x18fa2135 -//.word 0x8f33e1f6 -//.word 0x8fa66afb -//.word 0xe2cdd93e -//.word 0xa41d646d -//.word 0xe3439149 -//.word 0x68ada74c -//.word 0xd34c628e -//.word 0xee98ebe9 -//.word 0x3bd5075b -//.word 0xcf958fad -//.word 0x637f2052 -//.word 0xa94e1392 -//.word 0xdc1db0e8 -//.word 0x9be19ea8 -//.word 0xf7379ee4 -//.word 0xcb607a91 -//.word 0x4c8937e6 -//.word 0xe0509205 -//.word 0x3485abdd -//.word 0x882dfb4f -//.word 0x4ecd8b8f -//.word 0xf4e568ce -//.word 0xfeba5216 -//.word 0x5758b475 -//.word 0xe9d8d95d -//.word 0x6bdf5c4b -//.word 0x7a67e0a7 -//.word 0xecc202eb -//.word 0x61db8c08 -//.word 0x1ac0eb06 -//.word 0x0f5de4ea -//.word 0x3b8a82dc -//.word 0x3b495389 -//.word 0x1748d4c7 -//.word 0x60ae2977 -//.word 0x7b1411b0 -//.word 0x3cd01a1a -//.word 0xb77a1197 -//.word 0x52a9bd29 -//.word 0x1ffecd10 -//.word 0x69640e32 -//.word 0x8d95e1c0 -//.word 0x0be1ed17 -//.word 0xdd2b11e4 -//.word 0x08349c8c -//.word 0x701cc1cb -//.word 0xf025459b -//.word 0xaabb7b57 -//.word 0x9cb17220 -//.word 0x75ce6d80 -//.word 0xa688934d -//.word 0xbb0fe8d0 -//.word 0xec8d7c27 -//.word 0xeface3e8 -//.word 0x115ae407 -//.word 0x85c975fa -//.word 0xfcb9e81a -//.word 0x76f95f4d -//.word 0x572b85e2 -//.word 0xbdc980bc -//.word 0x116521b3 -//.word 0xdc355e37 -//.word 0xdcce0336 -//.word 0x5830a440 -//.word 0xb003d6ea -//.word 0x38209f70 -//.word 0x46532a9e -//.word 0x8a5fbff0 -//.word 0x9e43f3f8 -//.word 0xdebc1c00 -//.word 0x7a0b08f1 -//.word 0xcaf8ef73 -//.word 0xe117a556 -//.word 0x644a1431 -//.word 0x9d87ea48 -//.word 0xcbdc8fb3 -//.word 0xbcb05abd -//.word 0x9e4b048b -//.word 0x13995dfe -//.word 0x832a3dd9 -//.word 0xb67ebe27 -//.word 0xa280a8d7 -//.word 0x81502daa -//.word 0x2745d74f -//.word 0x9333becc -//.word 0xc4e9fe1f -//.word 0xcefe6825 -//.word 0x2cce78bc -//.word 0x58bf8724 -//.word 0x99c942ac -//.word 0x1c355b8a -//.word 0x47a47f0a -//.word 0x4a5487eb -//.word 0xf79ff205 -//.word 0xd3c49330 -//.word 0x6dea8762 -//.word 0xee626a17 -//.word 0xf22dcaf6 -//.word 0x96bedcb1 -//.word 0xd2006e2d -//.word 0x0a9b1de3 -//.word 0xdf74c886 -//.word 0x4b7245e5 -//.word 0xed885214 -//.word 0xa1f0cec6 -//.word 0x54b429fe -//.word 0x177319e7 -//.word 0x71628eff -//.word 0xfa91e97b -//.word 0x257068e8 -//.word 0x5e91e50e -//.word 0x55afc119 -//.word 0x99f01bfb -//.word 0x6867450c -//.word 0xc6dd78f3 -//.word 0xccd1c6ca -//.word 0x43bd517d -//.word 0x719bbb73 -//.word 0x33a8dd71 -//.word 0x4c68bcbb -//.word 0xfdeab87c -//.word 0xd64d0767 -//.word 0xcb83629f -//.word 0x8a55fed4 -//.word 0x0ca7beaf -//.word 0x6afea771 -//.word 0xf33f94d7 -//.word 0x7bba2b40 -//.word 0xf5660f11 -//.word 0x456e5759 -//.word 0x4fed40b1 -//.word 0x54f61e67 -//.word 0x7ed899db -//.word 0xb9a01528 -//.word 0xc5df7207 -//.word 0x89adf6f1 -//.word 0xabed8784 -//.word 0x5dd31e28 -//.word 0x7aa478f2 -//.word 0xd1bd0fc9 -//.word 0xc1d748c7 -//.word 0x0689eee1 -//.word 0xd20edfcb -//.word 0x1f490516 -//.word 0x4406889c -//.word 0xc783421d -//.word 0x732f742a -//.word 0xaab1b742 -//.word 0xfc2c353c -//.word 0xf8c218e4 -//.word 0x415743e9 -//.word 0xe59740f7 -//.word 0xeb3a7a20 -//.word 0x2b86ad80 -//.word 0x63169a21 -//.word 0x86dbff1c -//.word 0x5760c601 -//.word 0x37527d79 -//.word 0x3b3f062a -//.word 0x829e90db -//.word 0xc610c6d9 -//.word 0x30e54599 -//.word 0x71e2549e -//.word 0x0e41cf9d -//.word 0xfbfa65e0 -//.word 0x6c4104e8 -//.word 0xe8509056 -//.word 0x9f66db0c -//.word 0xfd10d28f -//.word 0x7fa7f4af -//.word 0xc61a096b -//.word 0xeaed100f -//.word 0x1082799f -//.word 0x3f989478 -//.word 0x6f114a35 -//.word 0xe3f80bd0 -//.word 0xb9c20709 -//.word 0xc0d4a10c -//.word 0x8946204e -//.word 0xc1e7a8b8 -//.word 0xbd816a07 -//.word 0x575e1773 -//.word 0xf90a9a8e -//.word 0xf75b0670 -//.word 0x22afcd11 -//.word 0x9a7534f6 -//.word 0xe3ef0310 -//.word 0x3b3581e1 -//.word 0x2b7e9fe0 -//.word 0x5d9b741f -//.word 0xadc4e92b -//.word 0x8297b633 -//.word 0x5f5e8d6d -//.word 0xb59194b6 -//.word 0xfc9c1979 -//.word 0x01e182d1 -//.word 0x820182f2 -//.word 0xf85793c5 -//.word 0xb4c6a0d2 -//.word 0x2db50163 -//.word 0x9957ade6 -//.word 0xba30ab94 -//.word 0xfbd5ca50 -//.word 0xbbf392d2 -//.word 0xe9927a04 -//.word 0xd19b5cac -//.word 0x3598254c -//.word 0xa0bcd146 -//.word 0xf7239744 -//.word 0x515a60d7 -//.word 0x08227e5f -//.word 0x11719b2a -//.word 0x88baefe0 -//.word 0x8f6eb71e -//.word 0x59c3e261 -//.word 0x82b40d26 -//.word 0xa249b14f -//.word 0x21189bc9 -//.word 0x4d0c9d6c -//.word 0xa9658422 -//.word 0x8800494c -//.word 0xdbd98c61 -//.word 0x48ce3dd8 -//.word 0x7ca69d49 -//.word 0xc15165cf -//.word 0xd37144b0 -//.word 0xef1a8f40 -//.word 0x2ed63502 -//.word 0x11edf111 -//.word 0x5de3c3be -//.word 0x2941a07b -//.word 0x359969f8 -//.word 0x7dc41a8b -//.word 0x0e6e44d5 -//.word 0x19d5bda3 -//.word 0x46cd9512 -//.word 0x4a084df7 -//.word 0xbc94447d -//.word 0x24a57210 -//.word 0x5695587a -//.word 0xfe29374c -//.word 0x7b168180 -//.word 0xf1c38d5c -//.word 0x99518e9a -//.word 0x5cd9c6c5 -//.word 0xa1f4f7e6 -//.word 0x63811b60 -//.word 0x86a25419 -//.word 0x6b0826da -//.word 0xc271e4f9 -//.word 0x9f6e6835 -//.word 0xd06a07e1 -//.word 0x6fe8c545 -//.word 0xb30cc441 -//.word 0x0b5d0333 -//.word 0x6ec9451b -//.word 0xecea4efd -//.word 0x8a875587 -//.word 0x4c5eb7f4 -//.word 0x9320e930 -//.word 0xa9beb03d -//.word 0x9be394d5 -//.word 0x47c19251 -//.word 0xb51111c9 -//.word 0xab55177d -//.word 0x7b61bd73 -//.word 0x2019e062 -//.word 0x897c1acf -//.word 0x35e2f076 -//.word 0x00814deb -//.word 0x3d363081 -//.word 0x0483a16b -//.word 0xcdd4e921 -//.word 0x3e060206 -//.word 0x42294d47 -//.word 0x5b858306 -//.word 0x39dceeb8 -//.word 0x8befd9cb -//.word 0x1543458c -//.word 0x0325dd49 -//.word 0x7dec2cb2 -//.word 0x7b7e0e85 -//.word 0xdb16646b -//.word 0xb1440c1d -//.word 0xde3511ca -//.word 0xe4341ebd -//.word 0xf871393b -//.word 0x5901adaa -//.word 0xe12748f9 -//.word 0xd9d2c73b -//.word 0x12668f95 -//.word 0x31bf9e5b -//.word 0x4b74c076 -//.word 0xb2580609 -//.word 0x0e477454 -//.word 0xaf1ffad8 -//.word 0x210ca6bb -//.word 0x0109176f -//.word 0x10a3358f -//.word 0x86001f09 -//.word 0xa9216582 -//.word 0x9d6478f6 -//.word 0x7e4d5e9f -//.word 0xac85aa19 -//.word 0x6623acc3 -//.word 0x9b2be568 -//.word 0xfc54bd1f -//.word 0x560f796f -//.word 0x1fc467b7 -//.word 0x4f5f5bcd -//.word 0x710b5fe6 -//.word 0xf93da7b6 -//.word 0xd8f5c3d8 -//.word 0x4e41186f -//.word 0xff02910e -//.word 0x4af292d5 -//.word 0xd6e62edd -//.word 0x6d5199d7 -//.word 0x0e0ae0ef -//.word 0x3d4fd7f7 -//.word 0x9e0953c1 -//.word 0xc2519acc -//.word 0x41341823 -//.word 0x09b35483 -//.word 0xf50e22bc -//.word 0xa2431959 -//.word 0x7ed14783 -//.word 0x21c12423 -//.word 0xe1e7c547 -//.word 0xa06652c7 -//.word 0xe972ba28 -//.word 0x3c5aa5c0 -//.word 0xa5c5ab1b -//.word 0x933bc39e -//.word 0xe8e8fe6a -//.word 0x4d9d7584 -//.word 0xc8187f32 -//.word 0x908528a8 -//.word 0x2045dfe3 -//.word 0x8aed6fd6 -//.word 0x0e9231c4 -//.word 0xeb447fed -//.word 0x75d86b6c -//.word 0x68ebb160 -//.word 0x7c23eb4a -//.word 0x39b804b6 -//.word 0x0d33ef1e -//.word 0x9c76990b -//.word 0x57fd1c7d -//.word 0x5063358d -//.word 0x4c28f851 -//.word 0x1ab1c200 -//.word 0x24907056 -//.word 0x4406ce3a -//.word 0xd9c6529f -//.word 0x19fc0ba8 -//.word 0xa98ed40f -//.word 0x6ba2cdc7 -//.word 0x97600ce0 -//.word 0x0df98fac -//.word 0xe9e87520 -//.word 0x58786e7c -//.word 0xab86712f -//.word 0xaa88adf4 -//.word 0x2bcec142 -//.word 0xe3082fe3 -//.word 0x7b090ee2 -//.word 0xe6ca00ab -//.word 0xf3b2646e -//.word 0x1e14cdc4 -//.word 0xacfab295 -//.word 0xf7216739 -//.word 0x06444bdd -//.word 0x609d4429 -//.word 0x22aa6820 -//.word 0x502dfd47 -//.word 0x6976a409 -//.word 0x3ee4d15a -//.word 0x03aa7e9b -//.word 0xa7cf21bd -//.word 0x6179dbaa -//.word 0x8c6af2e0 -//.word 0xb4cb815f -//.word 0xf1286ec6 -//.word 0x73bd9db9 -//.word 0x5ff06385 -//.word 0xda1e3e07 -//.word 0x629ac3ca -//.word 0x65f3d76f -//.word 0x0c762252 -//.word 0x58f4c16a -//.word 0x71c63b71 -//.word 0x3b0db745 -//.word 0x293e6c8f -//.word 0x56df58a2 -//.word 0xd28b35a6 -//.word 0x393ca9f5 -//.word 0x8bcabdc5 -//.word 0x37ae9008 -//.word 0x790c4d90 -//.word 0xe6f15a77 -//.word 0x46d9d2be -//.word 0xa1743634 -//.word 0x9da95f99 -//.word 0x07dcb704 -//.word 0xaf6ca982 -//.word 0x79805600 -//.word 0xb1048a6b -//.word 0x9feeee15 -//.word 0x5bc67f5b -//.word 0xe3653e85 -//.word 0x6bfd29ed -//.word 0xf4596b64 -//.word 0x2066d0d1 -//.word 0x45f37b1b -//.word 0xc0b5db49 -//.word 0x8c8edbe8 -//.word 0x130e59ad -//.word 0x433bda5c -//.word 0xe58d7ce8 -//.word 0x2a3d2cdc -//.word 0x87c018f9 -//.word 0xc38e6721 -//.word 0x4f272874 -//.word 0xd55889b8 -//.word 0x13ba4afe -//.word 0xea7d7182 -//.word 0xb2633ed4 -//.word 0xd10f6135 -//.word 0x8c806b44 -//.word 0x1dd983da -//.word 0x05635a32 -//.word 0xa3d4614d -//.word 0x06d23994 -//.word 0x00b36ac0 -//.word 0x7b8759f7 -//.word 0x10587437 -//.word 0xd6b0b0f8 -//.word 0x785c350d -//.word 0x8b7057cc -//.word 0x1e8bc96e -//.word 0x925c0db9 -//.word 0xac652fdc -//.word 0xe8ffb39a -//.word 0x109fccaa -//.word 0x0e57cf5e -//.word 0xffa0e684 -//.word 0x8856098a -//.word 0x6d042ae5 -//.word 0x5f62b0b2 -//.word 0x161c279e -//.word 0xa0d53604 -//.word 0xf96cd156 -//.word 0xdb7eafbe -//.word 0xd72cff05 -//.word 0xa51e57b3 -//.word 0xb9c7ed78 -//.word 0x16eb09ca -//.word 0x675fbad0 -//.word 0x4c11c97f -//.word 0xf248eb03 -//.word 0xe62c3a60 -//.word 0x2b88e659 -//.word 0x8acf2891 -//.word 0x295d78f0 -//.word 0x5f000048 -//.word 0xc7b75038 -//.word 0x93b95351 -//.word 0x23b98278 -//.word 0xd769578b -//.word 0x213d0548 -//.word 0xde71666a -//.word 0xe64d3514 -//.word 0xe1a87d73 -//.word 0x5dab51a0 -//.word 0x1ed7bec3 -//.word 0xb549fe7e -//.word 0x553dee89 -//.word 0xe1d2c399 -//.word 0x490df887 -//.word 0x171f8aae -//.word 0x45eb6895 -//.word 0x52c325ce -//.word 0x9572f11d -//.word 0xd080c7dd -//.word 0x08b1e8a0 -//.word 0x94cf8716 -//.word 0x75a9c630 -//.word 0xe55ce184 -//.word 0x32d1a9f4 -//.word 0xcd87358a -//.word 0x9e93d4a7 -//.word 0x9be5455d -//.word 0x99cc2b19 -//.word 0x62bdbb85 -//.word 0x0750b8ac -//.word 0x788ba160 -//.word 0x516329d8 -//.word 0xf780e79e -//.word 0xe4414fa9 -//.word 0x3f00e1c5 -//.word 0xb097a03c -//.word 0x7222c6af -//.word 0xaa07b645 -//.word 0xf7343208 -//.word 0x4aa8ce8b -//.word 0xf835a4d0 -//.word 0x0d844a6a -//.word 0xe45901df -//.word 0xf4182f50 -//.word 0xed89105c -//.word 0x04d8a841 -//.word 0x8ae0fc44 -//.word 0xc4a88154 -//.word 0xf72ed5ea -//.word 0xc264ad33 -//.word 0xb0790f71 -//.word 0x0e59c19f -//.word 0xfa770153 -//.word 0xbdca76e9 -//.word 0x5b1567de -//.word 0x686c2b7a -//.word 0x1cf4e0b2 -//.word 0xaaea604c -//.word 0xcee77144 -//.word 0xa5623c6f -//.word 0xc276015e -//.word 0x7ee50885 -//.word 0x8f5edb9c -//.word 0xddfbb246 -//.word 0x910e2ff1 -//.word 0x6e1d4bfd -//.word 0x642b9120 -//.word 0x62398a09 -//.word 0x6d0d7843 -//.word 0xef32465d -//.word 0x5140c048 -//.word 0xcb5e0000 -//.word 0x7b04286e -//.word 0xb506578e -//.word 0x9bced5cd -//.word 0xede891b5 -//.word 0x22c5cecb -//.word 0xb7b819b8 -//.word 0xc7457ea8 -//.word 0xdc9bfbf0 -//.word 0x055f35f3 -//.word 0x28ab6a46 -//.word 0x9a57a712 -//.word 0xed773bba -//.word 0x09246bbe -//.word 0x7e8067e0 -//.word 0x19f47d85 -//.word 0xb6bc8d5d -//.word 0x54a6bd46 -//.word 0x6f166d6e -//.word 0x8a4e6eb8 -//.word 0x0bec6e62 -//.word 0x4bb4b7e4 -//.word 0xee901a1b -//.word 0x70d525a6 -//.word 0x01c89d91 -//.word 0x93612830 -//.word 0x314f494e -//.word 0x923b9188 -//.word 0xee5114f3 -//.word 0x10fd1b05 -//.word 0xadf218b2 -//.word 0xf471dfd5 -//.word 0x66c812d2 -//.word 0xe819dd79 -//.word 0x165ce42e -//.word 0xdba77a47 -//.word 0x3ead14b6 -//.word 0x7f86fde8 -//.word 0x63ae4bed -//.word 0xcc4f11d8 -//.word 0x8cc3d669 -//.word 0x7b5446e9 -//.word 0xc8472856 -//.word 0x8c1a90c0 -//.word 0xa50956f3 -//.word 0xc1d7c656 -//.word 0xb9ca9913 -//.word 0x21f82578 -//.word 0x1dc1d09e -//.word 0x759dca48 -//.word 0xec18fc0d -//.word 0xce1a3bba -//.word 0xc96cc2f2 -//.word 0xfd78df17 -//.word 0x5650ec6e -//.word 0x1af2817d -//.word 0xbecbe8b8 -//.word 0xfe79d15d -//.word 0x2dd5479d -//.word 0xc931e3fc -//.word 0x52de40fa -//.word 0x5cf2aef3 -//.word 0xe4472b44 -//.word 0xe0c78faf -//.word 0x19e70601 -//.word 0x3d72c3f1 -//.word 0x3088f34c -//.word 0xa4e6f04f -//.word 0xe968b854 -//.word 0x06cb9db2 -//.word 0x08b83ede -//.word 0x9afeb5d6 -//.word 0xd62012bf -//.word 0x5b0f09cc -//.word 0xa038e763 -//.word 0x88c1ca7b -//.word 0x36101249 -//.word 0x228e131b -//.word 0x6caa0c84 -//.word 0x71205db9 -//.word 0x9d7bf43b -//.word 0x80d809b6 -//.word 0x23ee0b29 -//.word 0x9c4bda48 -//.word 0xe0e0361f -//.word 0xd9c078f7 -//.word 0xb8257f7d -//.word 0x8db4ee21 -//.word 0x140295bd -//.word 0xd2562c77 -//.word 0x61b147e8 -//.word 0x090b867e -//.word 0x90e00c1e -//.word 0x52eb330e -//.word 0x94327e13 -//.word 0x1542d0d6 -//.word 0xe6bcdb8c -//.word 0x7c10dad6 -//.word 0x048983e6 -//.word 0xf68a37e4 -//.word 0xed177d90 -//.word 0xb696ae28 -//.word 0xa6d7f28c -//.word 0x31536aa0 -//.word 0xb9b1aff2 -//.word 0xa48f7c9d -//.word 0xb17ea76d -//.word 0x8c4e5643 -//.word 0xa08d6fbb -//.word 0x2c4a500d -//.word 0x991ec131 -//.word 0x0b6e2647 -//.word 0x36eafa35 -//.word 0x73597892 -//.word 0x12999bc3 -//.word 0xf2e14963 -//.word 0x504acbe9 -//.word 0xdd8e8184 -//.word 0x130fd44a -//.word 0xc81b6b92 -//.word 0x046ea29e -//.word 0x10f8387e -//.word 0xcfe14730 -//.word 0x51cb7a0c -//.word 0xa6577a60 -//.word 0xf0eaa957 -//.word 0xbcb1131f -//.word 0x93e2a24a -//.word 0xcb459175 -//.word 0xa3f42228 -//.word 0x905f94fe -//.word 0xd1924f06 -//.word 0x49bb6368 -//.word 0x8ee6304c -//.word 0x3e0c66f7 -//.word 0x924c3137 -//.word 0x3578ad02 -//.word 0x56d3a05a -//.word 0xfc196873 -//.word 0x99c03218 -//.word 0xe37e6d4b -//.word 0xdf0b7f2c -//.word 0x3e28b61c -//.word 0xede08121 -//.word 0xe80ee08c -//.word 0x4f1f19da -//.word 0xbb19add9 -//.word 0xd2dc8a0c -//.word 0x19a9824f -//.word 0x0ae0fcbe -//.word 0x670ee9d4 -//.word 0xcd26fad0 -//.word 0x8c0f105d -//.word 0xb65ff571 -//.word 0x76674976 -//.word 0xa36fbfa8 -//.word 0x954289be -//.word 0x38ee10cc -//.word 0x5ec5e968 -//.word 0x5aa7040c -//.word 0xca8427bb -//.word 0xb41c9be7 -//.word 0xd5092693 -//.word 0x350039b5 -//.word 0xff5469de -//.word 0x90bb231c -//.word 0xce559c20 -//.word 0xbbea089c -//.word 0x4a740cef -//.word 0x71dd7504 -//.word 0x7f092a77 -//.word 0xb0175ffa -//.word 0xfee40cf8 -//.word 0x3bd19e78 -//.word 0x5dc7ec43 -//.word 0x19786c49 -//.word 0xb3e7a741 -//.word 0x142aea90 -//.word 0x1d6e3f6c -//.word 0x3b3d9b41 -//.word 0x3bfc5953 -//.word 0x60b8e7a6 -//.word 0xb322c01b -//.word 0x9bd79adb -//.word 0xade5e0f8 -//.word 0xc58b6252 -//.word 0x56414cb8 -//.word 0xfef85450 -//.word 0x5ea33839 -//.word 0x28f6686e -//.word 0x796effee -//.word 0x6a91f81a -//.word 0xe2779f5e -//.word 0xae894513 -//.word 0xd38938a4 -//.word 0x22d3f3f0 -//.word 0x0ee291f0 -//.word 0xbb15889a -//.word 0x57b39305 -//.word 0xad2ef0cd -//.word 0xf7a4ccb9 -//.word 0xf4abfc9b -//.word 0x3b4eed78 -//.word 0xcf53dee9 -//.word 0xf3c04cc1 -//.word 0x409daef0 -//.word 0xf4fa63a8 -//.word 0x8d34e9be -//.word 0x97754f52 -//.word 0xc27aedb2 -//.word 0x3799527c -//.word 0x2c027e03 -//.word 0xb64552f4 -//.word 0xdf14443a -//.word 0xf94a571e -//.word 0x322d4bb3 -//.word 0x68f01071 -//.word 0x3e7d8120 -//.word 0x6f714ff8 -//.word 0x62673b06 -//.word 0xff7989d1 -//.word 0xc204b13e -//.word 0x0dac57b1 -//.word 0xc3a07d75 -//.word 0x121ff85e -//.word 0x903c20ac -//.word 0x8adecc33 -//.word 0x980a7eb9 -//.word 0x7565daa0 -//.word 0x0ef45dc5 -//.word 0xd9274ba7 -//.word 0x6816e9cc -//.word 0x3e0aed60 -//.word 0xe13f3320 -//.word 0x31e8b176 -//.word 0xf774ade5 -//.word 0xc1102da8 -//.word 0xee6db096 -//.word 0x05c31b49 -//.word 0x4b16f67f -//.word 0x94b8d8c0 -//.word 0x590f2042 -//.word 0x0b98e609 -//.word 0xa72c3252 -//.word 0x8b826b32 -//.word 0x88f6127b -//.word 0x3888b0df -//.word 0x91280c58 -//.word 0xbb31a2c7 -//.word 0x1f3351db -//.word 0xc1f55434 -//.word 0xcfba73c8 -//.word 0x7ac47a86 -//.word 0x0417eb3a -//.word 0x1a7ff0b1 -//.word 0x65d4931d -//.word 0x5c7d31ba -//.word 0x5c332cb2 -//.word 0xfa07e13f -//.word 0x98a7da0f -//.word 0x36dd44ec -//.word 0x8b58a39c -//.word 0x54afc406 -//.word 0xeda3f397 -//.word 0x1ea56fe4 -//.word 0x37981b91 -//.word 0x5fd77671 -//.word 0x297acdee -//.word 0x68d5b0ac -//.word 0x4542a269 -//.word 0x8e211428 -//.word 0x511c958e -//.word 0xaab0438c -//.word 0xd9e8853e -//.word 0x976cfc13 -//.word 0xabbbb62f -//.word 0xb8b5a50d -//.word 0x595c5069 -//.word 0x6fdbc95d -//.word 0xbac8dfca -//.word 0xa7a694f9 -//.word 0x69aed282 -//.word 0x4bcf596d -//.word 0x45f3fc98 -//.word 0xcd840d58 -//.word 0xef2e1663 -//.word 0xa0e7c9ee -//.word 0x502d3a12 -//.word 0xbe8f4c74 -//.word 0x106f6925 -//.word 0x230677c7 -//.word 0x20a907f2 -//.word 0x504acfd6 -//.word 0x31415a21 -//.word 0xc94dfe23 -//.word 0x3ad50f2f -//.word 0x97745245 -//.word 0xf6b5b4ef -//.word 0xc61b3c69 -//.word 0x63653f04 -//.word 0xe80fd3cc -//.word 0x451c8569 -//.word 0x91134f43 -//.word 0xa148c4ea -//.word 0xd95c8eb4 -//.word 0x42071aa8 -//.word 0xdd15929a -//.word 0x37af0c98 -//.word 0x3edc0185 -//.word 0x53480004 -//.word 0xa043a398 -//.word 0xac0cc309 -//.word 0x2c50e809 -//.word 0x1dee0317 -//.word 0x0ffd60a4 -//.word 0xc410d674 -//.word 0xf9b84148 -//.word 0x844b32ba -//.word 0x9fe4e468 -//.word 0x84ab7254 -//.word 0x3a57488b -//.word 0xaef1d705 -//.word 0x05da8ecd -//.word 0x310f0561 -//.word 0xc2ac7b5c -//.word 0xffaf8252 -//.word 0x36fff9fc -//.word 0x50ad3b95 -//.word 0xa8799683 -//.word 0x1e98ff3a -//.word 0x67b4035e -//.word 0xa7350127 -//.word 0x41bf970a -//.word 0xedfb5a96 -//.word 0x0c9bca9c -//.word 0x39988592 -//.word 0x21beba39 -//.word 0x946be17e -//.word 0xdc94a99e -//.word 0x4d08328e -//.word 0x1df97d9a -//.word 0x76b8214c -//.word 0xcac03f8f -//.word 0x67f6b714 -//.word 0x4b2f9cf5 -//.word 0x39f3e699 -//.word 0x0c8167d7 -//.word 0x4c12015e -//.word 0xff621554 -//.word 0xc16d3e3d -//.word 0x1776401f -//.word 0x014e3be3 -//.word 0xced325ff -//.word 0x34b77652 -//.word 0xa083254f -//.word 0xcbdbd45e -//.word 0x8e03487f -//.word 0xf7a21b31 -//.word 0x9cc6b592 -//.word 0x2f2978c7 -//.word 0x53b33b9e -//.word 0xae3ffa72 -//.word 0x40a2cb50 -//.word 0xf3e91457 -//.word 0x73e3fc65 -//.word 0x3fe01ff0 -//.word 0x01b78631 -//.word 0x1b0ed688 -//.word 0x82d5c71c -//.word 0xcf14d8c2 -//.word 0x93e74220 -//.word 0xebc62a12 -//.word 0x550a1a4c -//.word 0xc2adb241 -//.word 0xed529b44 -//.word 0xea85bded -//.word 0x0243b2bf -//.word 0xbebd7a07 -//.word 0x42597007 -//.word 0xdcfa7c54 -//.word 0xdd818b7d -//.word 0xa8943ced -//.word 0x089edc13 -//.word 0xc71695c0 -//.word 0x7c05e2d0 -//.word 0xa4c2460c -//.word 0xf4003e4f -//.word 0xee0b74e8 -//.word 0xb34f3540 -//.word 0x181a25bd -//.word 0xfba332e5 -//.word 0xd84ac6c7 -//.word 0x97214196 -//.word 0xa8aca698 -//.word 0x52e5943e -//.word 0x48837995 -//.word 0x7e7c02dd -//.word 0x3ac9d676 -//.word 0x6e698304 -//.word 0x45a8b8cb -//.word 0xfca1b65b -//.word 0xf3020172 -//.word 0x040f5b1e -//.word 0x13eaf222 -//.word 0xe611d99b -//.word 0x3728b5e3 -//.word 0x08f9b9b6 -//.word 0x37b9d493 -//.word 0x528c2865 -//.word 0xac4cbf63 -//.word 0xb1867935 -//.word 0x76c64958 -//.word 0x9515a1c3 -//.word 0x37bf2bcb -//.word 0x725aba44 -//.word 0xd60380e9 -//.word 0x42eb81fe -//.word 0xfc134733 -//.word 0x0153d8cc -//.word 0x9aa1e5ff -//.word 0x3090449d -//.word 0x6117a1f5 -//.word 0x549470f6 -//.word 0x49102593 -//.word 0x74c5a86c -//.word 0x0bdd03aa -//.word 0x9e7d5e2a -//.word 0xa7022edf -//.word 0x628ba971 -//.word 0xdeb77d2a -//.word 0x54b0c113 -//.word 0xb9682c5a -//.word 0x8f2285f7 -//.word 0x00355a8f -//.word 0x2d0cf599 -//.word 0xc4728cbf -//.word 0xd00cb887 -//.word 0xd6272832 -//.word 0x1db597e5 -//.word 0x4d91fb06 -//.word 0x3c0b00e9 -//.word 0x04a0b4ac -//.word 0x5909845f -//.word 0x19786768 -//.word 0x251e5926 -//.word 0x70f00bd5 -//.word 0x55abd9b2 -//.word 0x2e15fc5f -//.word 0x22860188 -//.word 0x3ea879c7 -//.word 0xc77bf3c5 -//.word 0xcf9c27a3 -//.word 0x07c67498 -//.word 0xd4998ddb -//.word 0xa59a6fc3 -//.word 0x837c962c -//.word 0xea9e701e -//.word 0xd7d412a9 -//.word 0x226a2a13 -//.word 0x0e663436 -//.word 0x1f0ef123 -//.word 0x2baa150b -//.word 0xb48b4060 -//.word 0x754c3037 -//.word 0x3b5835f1 -//.word 0xf6ace51a -//.word 0x10df1091 -//.word 0xfd5ff7e9 -//.word 0x14fdb810 -//.word 0x9dac0d2e -//.word 0x2b8536d0 -//.word 0x2c0f3446 -//.word 0xbebe3849 -//.word 0xc4b95be2 -//.word 0x39e08f87 -//.word 0xc50ed686 -//.word 0x8e9bb2a7 -//.word 0x5126dc0c -//.word 0xb191385d -//.word 0xcf4c0922 -//.word 0x1ad76270 -//.word 0x6982ddc8 -//.word 0x47788e3c -//.word 0x8dfb3ad3 -//.word 0x37f1c52f -//.word 0x70a0ea6d -//.word 0xefb62f4d -//.word 0x868c1793 -//.word 0xf8ab99ad -//.word 0x0c90d195 -//.word 0xdfacf6f9 -//.word 0x7eaf8c9a -//.word 0xb406daf2 -//.word 0x21a29f19 -//.word 0x8cfc01e9 -//.word 0x7b56c661 -//.word 0x0043c647 -//.word 0xd569a011 -//.word 0xab86ad06 -//.word 0xc0b132a1 -//.word 0xb0e3da36 -//.word 0x8db563d7 -//.word 0x316b9779 -//.word 0xd3327e53 -//.word 0xd9a6d287 -//.word 0xed97b304 -//.word 0x530d9cab -//.word 0x7a8996b1 -//.word 0xd18eab44 -//.word 0xdb609e71 -//.word 0x860cd945 -//.word 0xb9a8a732 -//.word 0x2cdca3b5 -//.word 0x7ca27136 -//.word 0x7f49ab30 -//.word 0xd5c01e91 -//.word 0xbf113764 -//.word 0x342cb8ad -//.word 0x32e6af94 -//.word 0x5341a9c6 -//.word 0xa0ee2319 -//.word 0xa910416f -//.word 0xd643c3dc -//.word 0xf8dd340b -//.word 0x237464dd -//.word 0xc0a01954 -//.word 0xde0102b0 -//.word 0xc984ecd7 -//.word 0xdee338fa -//.word 0x9d6b8d76 -//.word 0x0002caf8 -//.word 0x0b683fe5 -//.word 0xa5bd1cf9 -//.word 0xa644292e -//.word 0x3166b8df -//.word 0x44fad92d -//.word 0x8dc3cca2 -//.word 0x803abc14 -//.word 0xa68eaacc -//.word 0x38eaa7e8 -//.word 0xecf646fe -//.word 0x0fa05102 -//.word 0xd41cbb6a -//.word 0xec29d68f -//.word 0x5697c657 -//.word 0x79063611 -//.word 0x70f049a0 -//.word 0xa5ead3dc -//.word 0xa126ca35 -//.word 0x223df79a -//.word 0x6e2bf199 -//.word 0xe89b4cc7 -//.word 0xe1660e62 -//.word 0xb0566235 -//.word 0x052f91bc -//.word 0x7af02d89 -//.word 0x6b5690e6 -//.word 0x08a285bc -//.word 0xa89c44b3 -//.word 0x61d8a49b -//.word 0xd5388c0b -//.word 0x4eb2aa47 -//.word 0x0e536867 -//.word 0xe0841cb6 -//.word 0xf38d7f59 -//.word 0xe8576131 -//.word 0x2a769b02 -//.word 0x7e6644d4 -//.word 0xdb152899 -//.word 0x7ba27511 -//.word 0x3265b8eb -//.word 0xff2f082d -//.word 0xe1d381d5 -//.word 0xebe5f5c0 -//.word 0x9bc1ddcc -//.word 0x68cf963a -//.word 0x9a06ca56 -//.word 0x5eaf2c59 -//.word 0x1a6c688e -//.word 0xfe7859b4 -//.word 0xdc307da4 -//.word 0x39d3a733 -//.word 0xa486f45a -//.word 0x469b0094 -//.word 0xbb125a88 -//.word 0x206035e8 -//.word 0x6d706099 -//.word 0x05e87814 -//.word 0x8cad5c0c -//.word 0xf9a9e151 -//.word 0xecccc7f4 -//.word 0x4150ecac -//.word 0xe542c078 -//.word 0xe83ef986 -//.word 0xd47a8854 -//.word 0x3e05cb15 -//.word 0x9a510456 -//.word 0x54f00ae1 -//.word 0x1c9b3ee1 -//.word 0x8178c148 -//.word 0xc19de46e -//.word 0xdfd0e0fa -//.word 0xf790c806 -//.word 0xcf5abb7e -//.word 0xae255ec9 -//.word 0x712f89ac -//.word 0xdbfb416b -//.word 0x2d9ae731 -//.word 0xf62baeb1 -//.word 0x2d9e530e -//.word 0x7dbd08f8 -//.word 0xe06cb119 -//.word 0x6f2f52af -//.word 0x79eec87a -//.word 0xd2f5b8d8 -//.word 0x6d3fc62f -//.word 0x2df4078b -//.word 0xf930b888 -//.word 0x0f063073 -//.word 0x9ac513ac -//.word 0x8679c94e -//.word 0x93b52e12 -//.word 0xa8908b71 -//.word 0x6beec609 -//.word 0x0e01d542 -//.word 0x6b0f7831 -//.word 0x547528bd -//.word 0x24ec4a00 -//.word 0x9a0ba9f0 -//.word 0xe80d233e -//.word 0x06d5a37e -//.word 0x4c2f4f89 -//.word 0x4059021f -//.word 0xadc2fcd1 -//.word 0xf511d81e -//.word 0xa769bfdd -//.word 0x54ebdcdb -//.word 0x9f7d0fc4 -//.word 0x94cae647 -//.word 0x3b8ac975 -//.word 0x6c04746a -//.word 0xe4d1ab30 -//.word 0x99e228e0 -//.word 0x4bc5d90a -//.word 0x5c234857 -//.word 0xe18e5b6d -//.word 0xf9793d13 -//.word 0x5e889c96 -//.word 0x390b156b -//.word 0x3bc5ec15 -//.word 0xe9f1014a -//.word 0x3787ff51 -//.word 0x59bbd7ae -//.word 0xd6c66d01 -//.word 0xdeea902c -//.word 0xddb030b4 -//.word 0x5075cb6a -//.word 0xd824294a -//.word 0x8c4549a3 -//.word 0x94379b78 -//.word 0xf4b97026 -//.word 0xa5b0ae48 -//.word 0xea24c8d8 -//.word 0xe18bed97 -//.word 0x584a80ae -//.word 0xe379c995 -//.word 0x2be6ea34 -//.word 0x895d1448 -//.word 0xd427fa09 -//.word 0x77d1860a -//.word 0xc62fcb60 -//.word 0x929f3c06 -//.word 0xfa921b80 -//.word 0x854934bf -//.word 0x6eddca45 -//.word 0x3f82d289 -//.word 0xa10c5f9d -//.word 0x73b35e0e -//.word 0x1913830c -//.word 0x177783ca -//.word 0xde568428 -//.word 0xe51ed190 -//.word 0xfc31d31d -//.word 0xde2d3d03 -//.word 0x0571862b -//.word 0xc2dd9c1d -//.word 0x8cd8d723 -//.word 0x99982bab -//.word 0xab9ea3ee -//.word 0x2d7f0acf -//.word 0x7eeaeb06 -//.word 0x8de7bd7d -//.word 0xa65d57fa -//.word 0x8bd7aaff -//.word 0xc787aeef -//.word 0x3f8c9d71 -//.word 0x0a706019 -//.word 0x82f54646 -//.word 0x9b11fc46 -//.word 0x7437bac1 -//.word 0x2cd8ba54 -//.word 0xf72aee7c -//.word 0x7128f2b6 -//.word 0x32da40e4 -//.word 0xa2d6a3f3 -//.word 0x0e07eebb -//.word 0xfcaded26 -//.word 0xbca59c95 -//.word 0x40eb977f -//.word 0x2e5dd25b -//.word 0x32c18ac1 -//.word 0x990a7bcc -//.word 0x1cd754c2 -//.word 0xf93d68f7 -//.word 0x49c6a6ee -//.word 0x8db9cbc2 -//.word 0x8a9cd6c4 -//.word 0x57f8bc66 -//.word 0xb45c5e58 -//.word 0x9da4b8f0 -//.word 0x1f7b5bcf -//.word 0x6b1f1dc2 -//.word 0x29650fe6 -//.word 0x0efcaf10 -//.word 0xb1f55f6b -//.word 0x9a831663 -//.word 0x9c0056c2 -//.word 0x66315e19 -//.word 0x54cba062 -//.word 0x8b3675e3 -//.word 0x44901056 -//.word 0x68f5b046 -//.word 0x5efe1abc -//.word 0x2087471b -//.word 0x95b65a49 -//.word 0x1b39d50f -//.word 0x62ce0bc3 -//.word 0x8109d924 -//.word 0x43529185 -//.word 0xc22d372e -//.word 0x38bef0ff -//.word 0x118cb756 -//.word 0x45855233 -//.word 0xe442849a -//.word 0xf38d8539 -//.word 0x7620af4b -//.word 0xceb07abc -//.word 0x452aaa8e -//.word 0xe83dc77b -//.word 0x9518cedc -//.word 0x547526c9 -//.word 0xead6d582 -//.word 0xac0ef40d -//.word 0x92046021 -//.word 0x8cb4b343 -//.word 0x1976732f -//.word 0x15838979 -//.word 0xd2b5f474 -//.word 0x6b8ebe53 -//.word 0x557c2f8e -//.word 0x375b4288 -//.word 0xfc3c556e -//.word 0x26652462 -//.word 0x6599f8d9 -//.word 0x68991c41 -//.word 0xf3ea91e8 -//.word 0x32d90219 -//.word 0x4dbdfa88 -//.word 0x3c7c55ef -//.word 0xdd50f5fa -//.word 0x43cbb661 -//.word 0x5119a353 -//.word 0x88866a1b -//.word 0x1e3f0dfe -//.word 0x505ddb62 -//.word 0xf91f9f36 -//.word 0x6277178d -//.word 0x5cc9a78c -//.word 0x8cef4f87 -//.word 0x0780db67 -//.word 0x1f52594f -//.word 0x7c3dd07f -//.word 0x6e222f78 -//.word 0x812c8460 -//.word 0x52566ea9 -//.word 0xa22ed5ee -//.word 0xa9d8d81d -//.word 0xac5507db -//.word 0xd206d324 -//.word 0x346b4232 -//.word 0x3331e8a1 -//.word 0x0e6c12d0 -//.word 0xb421448a -//.word 0xd607e6e6 -//.word 0x418e3a6b -//.word 0x6b219178 -//.word 0x4ba8bfe3 -//.word 0x6e52cce1 -//.word 0x4891ec26 -//.word 0xc866b14d -//.word 0x2fde8079 -//.word 0x21dd423d -//.word 0xfc1a5bb9 -//.word 0x6a6be006 -//.word 0x324304d5 -//.word 0x5478d452 -//.word 0x544a254f -//.word 0xd6a2ca9e -//.word 0x6b970abe -//.word 0xab3651bb -//.word 0x8483254f -//.word 0xd1bb5c4d -//.word 0x2edc8c3f -//.word 0x0b67c44e -//.word 0x00657963 -//.word 0x60a8c38c -//.word 0x1153caa1 -//.word 0x9b9d7a27 -//.word 0x7ed17f74 -//.word 0xc9996d14 -//.word 0xe87d3e6c -//.word 0xbea7029d -//.word 0xf4e9d2ac -//.word 0x900106df -//.word 0xc91ba86a -//.word 0x1997284a -//.word 0x950d5072 -//.word 0x7a8e7b25 -//.word 0x082d02a3 -//.word 0x93bef807 -//.word 0xd7de1770 -//.word 0x8c34f95f -//.word 0x3af68c60 -//.word 0x4faec0ed -//.word 0x6f3e828f -//.word 0x0b21ee46 -//.word 0x35f5c02b -//.word 0xb2360c54 -//.word 0x514d30f8 -//.word 0x7cc906d3 -//.word 0x0dec5ecc -//.word 0x6369abd6 -//.word 0xb46cfc14 -//.word 0xa4db2e40 -//.word 0x17db604d -//.word 0x4497a84b -//.word 0x0c3d048c -//.word 0x89489405 -//.word 0xe90506f6 -//.word 0x7d5051ce -//.word 0x0d9fa649 -//.word 0x6f43a3db -//.word 0x57eacb51 -//.word 0x716733b6 -//.word 0xadb67d73 -//.word 0xdb3a0abb -//.word 0x774a6c26 -//.word 0xc6ec1a9c -//.word 0x22e06875 -//.word 0x91e1b6de -//.word 0x9d27e77f -//.word 0x6030155b -//.word 0xdfc082f7 -//.word 0x9927d2be -//.word 0x5fc278a4 -//.word 0x65c46f0a -//.word 0x9a362ae1 -//.word 0x353dcd13 -//.word 0x909c9d1e -//.word 0x3a79b502 -//.word 0x4864fc5e -//.word 0xeb9553d6 -//.word 0x487513b7 -//.word 0x8361b6de -//.word 0x1daad4d6 -//.word 0x81e05240 -//.word 0xd950d678 -//.word 0x26cb7d75 -//.word 0x90a9d1f1 -//.word 0xfa0ef5ca -//.word 0xda6c23a9 -//.word 0x484959e1 -//.word 0x55434e9a -//.word 0x9d51ab2e -//.word 0x204b78d3 -//.word 0x4dadd47b -//.word 0x6098eaf8 -//.word 0xee192064 -//.word 0xbeae91c0 -//.word 0xdb06bedb -//.word 0xe7098075 -//.word 0xb21842a5 -//.word 0x0c966c78 -//.word 0xd7a722db -//.word 0x60372fbb -//.word 0xef3f3c6a -//.word 0x9c434645 -//.word 0x65204f94 -//.word 0x7e0453b1 -//.word 0xe8be7d6d -//.word 0x45389baf -//.word 0xeb41d05e -//.word 0x37908881 -//.word 0x2306b1a5 -//.word 0x1b34297f -//.word 0x0d1d72d3 -//.word 0xc03dad95 -//.word 0x66cac64d -//.word 0x7439ecc0 -//.word 0xb10444cc -//.word 0x8dabde94 -//.word 0xb5f9e8dd -//.word 0xe48821b8 -//.word 0xfc879162 -//.word 0x55bb7868 -//.word 0x55c4840e -//.word 0x41a246f2 -//.word 0x5277e7ed -//.word 0x0c8e173a -//.word 0xcb9d47da -//.word 0x9f471836 -//.word 0x59e51307 -//.word 0xe6869a73 -//.word 0xdc341e78 -//.word 0x537a938e -//.word 0xf6232188 -//.word 0x5a431dbc -//.word 0x8e7c3763 -//.word 0xf37af543 -//.word 0x4dc0608b -//.word 0x1ba7fdfe -//.word 0x24a3fe53 -//.word 0x53c9badc -//.word 0xc48e5b67 -//.word 0x1fd2d662 -//.word 0x251d2142 -//.word 0x8828a025 -//.word 0x009fe0b5 -//.word 0x9b258750 -//.word 0x55998b67 -//.word 0xe897a324 -//.word 0xe542fb50 -//.word 0x04412c73 -//.word 0xb8086b3d -//.word 0x07590024 -//.word 0x990afb4f -//.word 0x0f0822b3 -//.word 0x969c2d7c -//.word 0xbbed36ae -//.word 0x81c76b0c -//.word 0xb09a0639 -//.word 0x71c67f1d -//.word 0x1815ff8a -//.word 0x4189191f -//.word 0x1e59b56d -//.word 0x0f364c59 -//.word 0x73d25bc1 -//.word 0xbfa31163 -//.word 0xcde54bfa -//.word 0x76dec3a9 -//.word 0x6265849d -//.word 0x1fa5a2ef -//.word 0x711f27c7 -//.word 0xe9ee50c7 -//.word 0xb94ffaa7 -//.word 0xc760571c -//.word 0x0028e5ff -//.word 0xefd8a1ab -//.word 0x8e5078a7 -//.word 0x5ce5fe85 -//.word 0xaf626209 -//.word 0x4c4ca28e -//.word 0x356bfba6 -//.word 0xc285a401 -//.word 0xf36dbb90 -//.word 0x053d80e9 -//.word 0x43dfc1ee -//.word 0x1fd295a9 -//.word 0x812a4d7b -//.word 0x5fd9a876 -//.word 0x8e2e4607 -//.word 0xd89b5fd8 -//.word 0x4ebbb5f4 -//.word 0xdf93c72d -//.word 0x2a1948bb -//.word 0x91f2cf25 -//.word 0x8f80d065 -//.word 0x4b1ccb47 -//.word 0x6da0c312 -//.word 0x3029f26a -//.word 0xb81bbb75 -//.word 0xa765e03d -//.word 0xeb06f555 -//.word 0xd9d015c0 -//.word 0x806bd30e -//.word 0x379e73c8 -//.word 0x79ca5b0e -//.word 0xf3b7c47f -//.word 0xda93b559 -//.word 0x823832e1 -//.word 0x2daeb106 -//.word 0x21f1cd41 -//.word 0xfdf43ebf -//.word 0x4ce509c2 -//.word 0x5bb3f445 -//.word 0x48ce3ddf -//.word 0x5c2e8be9 -//.word 0x9a9625e3 -//.word 0x981a6214 -//.word 0x8edf6171 -//.word 0xad22f9c0 -//.word 0xb27bf3fd -//.word 0xba6377fd -//.word 0x58f5c551 -//.word 0xe5f1266d -//.word 0x1706210a -//.word 0xd551f1c8 -//.word 0x4a213718 -//.word 0x39fded59 -//.word 0x90e89b41 -//.word 0x3fe3cd7f -//.word 0x4ab4c49e -//.word 0x1de66c2d -//.word 0x21118e1d -//.word 0x8c5b476a -//.word 0x7d3fb9fe -//.word 0x488d00d2 -//.word 0x0eb26756 -//.word 0x923adc13 -//.word 0x4793a28e -//.word 0xae144670 -//.word 0xde3dd4e5 -//.word 0x64414a42 -//.word 0x4ec14dea -//.word 0x83db1b72 -//.word 0x5663c103 -//.word 0x5a708e00 -//.word 0x771bc7e9 -//.word 0x3d839c80 -//.word 0x79155b2a -//.word 0x060ae497 -//.word 0xe6305da5 -//.word 0x91ee2782 -//.word 0x8d821011 -//.word 0x3f8eca90 -//.word 0x01d39c77 -//.word 0x753c57a3 -//.word 0x181e8cb3 -//.word 0x1abefcb3 -//.word 0x6d1450f8 -//.word 0x1cce0a4a -//.word 0xde98bc49 -//.word 0xeb9b7709 -//.word 0x0e438700 -//.word 0xfb465d22 -//.word 0xe4e2cd4a -//.word 0x47667adc -//.word 0x0af38ea8 -//.word 0xc984ae12 -//.word 0x6f2c2d70 -//.word 0x039f7fb4 -//.word 0xc5f4f14b -//.word 0x7aa99845 -//.word 0x04e887b5 -//.word 0x3508455b -//.word 0xe5577f80 -//.word 0x4217f922 -//.word 0x68c6ca51 -//.word 0x32a3c9d9 -//.word 0x4f6d4321 -//.word 0x986eef53 -//.word 0xa0b823bd -//.word 0x8daf4778 -//.word 0x27c78b47 -//.word 0x2f8fd5c1 -//.word 0xf2effdb3 -//.word 0x1ead3dc0 -//.word 0xd336e34a -//.word 0xfd9c4996 -//.word 0xe2db072a -//.word 0xf760677a -//.word 0xf8cc1ac4 -//.word 0x37f52939 -//.word 0x352d2e5d -//.word 0x6fc8c3b0 -//.word 0x7ad83b8e -//.word 0x523b9054 -//.word 0xf0d89dc4 -//.word 0x1a258dab -//.word 0x7fed94c0 -//.word 0x0350ddd0 -//.word 0x580bc318 -//.word 0xcef943f3 -//.word 0x6cdab1b5 -//.word 0x3f54abd6 -//.word 0xf2374c53 -//.word 0x9f05a151 -//.word 0xe5b26103 -//.word 0x3ba8d8cf -//.word 0x830e25ac -//.word 0xe34aa5cf -//.word 0xd0c4af86 -//.word 0x6bed8264 -//.word 0x11817b9e -//.word 0x2d098cb5 -//.word 0x51a3e955 -//.word 0x8605047e -//.word 0xe0c0bce1 -//.word 0x55c2d18d -//.word 0xce1f9cca -//.word 0x7f11fd45 -//.word 0x743d946e -//.word 0x6d37341f -//.word 0xec49947e -//.word 0x8c704824 -//.word 0x94a8f07f -//.word 0xcc69b074 -//.word 0x9072e049 -//.word 0x22c504c3 -//.word 0x45f3fe8b -//.word 0x079982d6 -//.word 0xde2bcb45 -//.word 0xf6f08c0a -//.word 0xca4e2a4d -//.word 0xf24828ce -//.word 0x3b45e3cb -//.word 0xfd137f24 -//.word 0xa92b21bd -//.word 0xa2375e24 -//.word 0x4ed1f474 -//.word 0x6c8eb879 -//.word 0xa83bd014 -//.word 0x6c6622e1 -//.word 0xfa210c18 -//.word 0xb80256b1 -//.word 0xca6e65cc -//.word 0xe617b14f -//.word 0x64c479d1 -//.word 0x9551b5b7 -//.word 0x56f64c9c -//.word 0xe5cc87f7 -//.word 0xf38cc5f7 -//.word 0xfa9a71b2 -//.word 0xd043327f -//.word 0x7d4361a0 -//.word 0x4a8bc025 -//.word 0x1a41690c -//.word 0xfd0704ad -//.word 0x03803d56 -//.word 0x4e107632 -//.word 0x6be4b86f -//.word 0xe333f09f -//.word 0x0cc3585f -//.word 0x25ae3337 -//.word 0xa266bdc2 -//.word 0xc5800000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00018088 -//// expected output -//.word 0x095cd23a -//.word 0x91a9b799 -//.word 0x1155c638 -//.word 0x52ea124e -//.word 0x6bf16af4 -//.word 0x01ff3845 -//.word 0x011a428c -//.word 0xfafdcfc2 -//.word 0xdabb8b6c -//.word 0xabeb9ed9 -//.word 0xb7027126 -//.word 0xfd7d2cbf -//.word 0x603268ea -//.word 0xcfab776c -//.word 0x8ae48586 -//.word 0xfae3c093 -//// SHA512LongMsgvector_124 -//// vector length -//.word 0x000183A0 -//// input message -//.word 0xc4ff5c87 -//.word 0xf2dcce57 -//.word 0x509b470b -//.word 0x16e2e41b -//.word 0x6b8d23e0 -//.word 0xd950f554 -//.word 0xfe9e151a -//.word 0x84ca97be -//.word 0x536dc43d -//.word 0x040725c8 -//.word 0x99e9dec5 -//.word 0x6c523e17 -//.word 0x66d8939f -//.word 0x71094302 -//.word 0x305318ad -//.word 0xed21dc17 -//.word 0xd3472646 -//.word 0x5da07395 -//.word 0x0ef578b4 -//.word 0x6321b7f0 -//.word 0x067351b5 -//.word 0x44541b51 -//.word 0xc12af3fa -//.word 0x6a7c5513 -//.word 0xac5629ab -//.word 0xe3efdf47 -//.word 0x1689bee1 -//.word 0xe1997930 -//.word 0xb228042a -//.word 0x3979a5c8 -//.word 0x19ec4e09 -//.word 0xe4222a39 -//.word 0x46627673 -//.word 0x803b9265 -//.word 0x186b5853 -//.word 0xcf00ac5e -//.word 0xd4bd5407 -//.word 0x37bf0bef -//.word 0xa061d0e0 -//.word 0x415c8411 -//.word 0x0933b4a6 -//.word 0x1bceb477 -//.word 0x7e64ed12 -//.word 0x169f7703 -//.word 0xd3fbeb53 -//.word 0x2870724e -//.word 0xbf502289 -//.word 0x6b728b24 -//.word 0x5e908c4d -//.word 0x9cee6c05 -//.word 0xaf3c2527 -//.word 0x9cbe03a6 -//.word 0x17aa6e16 -//.word 0xf3d2046e -//.word 0xdc82ec0c -//.word 0x48ac66f9 -//.word 0xab42a66f -//.word 0xeae4e298 -//.word 0x13bbaa99 -//.word 0x4ba578cf -//.word 0x08928858 -//.word 0x802ee9d6 -//.word 0x61c0d56f -//.word 0xc2513e19 -//.word 0x5912a914 -//.word 0xeff83fb7 -//.word 0x12a92170 -//.word 0x0a9bfd07 -//.word 0x0e7adf22 -//.word 0xb7cb490e -//.word 0xb4d085bc -//.word 0xc0ab3a0a -//.word 0xd1c53e44 -//.word 0x9271abeb -//.word 0x14cd35b5 -//.word 0xc0e9bad4 -//.word 0x912c1b7b -//.word 0x80f34b9f -//.word 0x3f7aa5fb -//.word 0x29008356 -//.word 0x7a260c08 -//.word 0xbb994dbb -//.word 0x81f08c6f -//.word 0x57d8d8c1 -//.word 0xf96ee56c -//.word 0xc3ec1710 -//.word 0x6888dd32 -//.word 0xe7994084 -//.word 0xbbfcbc67 -//.word 0x52b64eaf -//.word 0xc1dacea6 -//.word 0xb6ae7f53 -//.word 0xae09e5fc -//.word 0x68ffd6e9 -//.word 0x99c0d46b -//.word 0xe1be9a1d -//.word 0xfe0ef56a -//.word 0x4011d54f -//.word 0x3c53a462 -//.word 0xc5b3d614 -//.word 0x18c5c233 -//.word 0x5774b0b3 -//.word 0x39ec33ad -//.word 0xffb7b9a8 -//.word 0xaa256018 -//.word 0x6bf20b24 -//.word 0x5b23b6ac -//.word 0x6c31068b -//.word 0x9f692419 -//.word 0x7893ccf4 -//.word 0xb0d2a101 -//.word 0x29cbc4ad -//.word 0x2709a479 -//.word 0xbca018b5 -//.word 0x8411ab8b -//.word 0x936e3640 -//.word 0xacbfb5b7 -//.word 0xb3a35337 -//.word 0x653bc76d -//.word 0x4743e3b5 -//.word 0xdc826a95 -//.word 0x1b65238a -//.word 0x20e72b08 -//.word 0x22b38fbc -//.word 0xa58d1a14 -//.word 0xf1ee6c01 -//.word 0xc2ee4cfc -//.word 0x41674047 -//.word 0x33585a75 -//.word 0x7187542c -//.word 0x986be02a -//.word 0x01483986 -//.word 0xf49cfe38 -//.word 0x18ba40dc -//.word 0x2eb5dab3 -//.word 0xff7f00eb -//.word 0x93521b20 -//.word 0xa44fd422 -//.word 0x52666ff9 -//.word 0x19755b26 -//.word 0xffb4072c -//.word 0x1250f74f -//.word 0x1156169c -//.word 0x6ad34e29 -//.word 0x643a569e -//.word 0x9e05cbf4 -//.word 0xb89f837d -//.word 0x50821e25 -//.word 0x309cddf7 -//.word 0xc5f8b8e3 -//.word 0xd49aaabe -//.word 0x68ab508a -//.word 0x0fd6b2f8 -//.word 0x45f1612b -//.word 0x31e0c2bf -//.word 0x8fb6a90a -//.word 0xee1e29a1 -//.word 0x1bfaab1e -//.word 0xdd493e21 -//.word 0xe24e2e95 -//.word 0xfaefd835 -//.word 0x835bbc4e -//.word 0x24efd4c6 -//.word 0xbf5b255d -//.word 0xa0009333 -//.word 0xfb9df98b -//.word 0x952b79ce -//.word 0xc10511d3 -//.word 0x8e4c6f5d -//.word 0x3f8a07e5 -//.word 0xfb95629a -//.word 0xc6b7b9a7 -//.word 0xb00bc2b4 -//.word 0x4c2acaaf -//.word 0x640704cc -//.word 0xeb1821ca -//.word 0x33b72079 -//.word 0x61c76879 -//.word 0x1d9a1444 -//.word 0x8e128e6e -//.word 0x85075f2c -//.word 0xf8e94514 -//.word 0xb3a78623 -//.word 0x4acf8504 -//.word 0x52f6938f -//.word 0xd05a0791 -//.word 0xf2c691cb -//.word 0xfdb6cb3d -//.word 0x87bc11a4 -//.word 0xe6229341 -//.word 0xe8d1a8dc -//.word 0xc5716609 -//.word 0x51d26faa -//.word 0x768b0db5 -//.word 0xe2e18237 -//.word 0xfdea9999 -//.word 0x1ef28122 -//.word 0xfe1ddbbe -//.word 0x6d4e12fe -//.word 0x4348eb5f -//.word 0x9a135dcf -//.word 0x3aa2a26d -//.word 0x55b28e91 -//.word 0x75f5200c -//.word 0xb27057b1 -//.word 0x28214614 -//.word 0xa8e66b91 -//.word 0xae9a3d90 -//.word 0x93810408 -//.word 0x04e6ed42 -//.word 0xb3025ee0 -//.word 0x4c20871d -//.word 0xabff3a56 -//.word 0x4c78fcca -//.word 0x03605c9e -//.word 0xedb08324 -//.word 0xa6e30d5c -//.word 0xbca017bb -//.word 0x6499992c -//.word 0x6cb3f755 -//.word 0x7167d21b -//.word 0x52682468 -//.word 0xe4868c2b -//.word 0xe8d2e6a1 -//.word 0x3a031fd4 -//.word 0x4b184761 -//.word 0xd03fe87d -//.word 0xbcf6973a -//.word 0x6c70c807 -//.word 0x223ae776 -//.word 0xb51ea443 -//.word 0x87488e91 -//.word 0xb6a7e376 -//.word 0x9796a6ba -//.word 0x60bcf3dc -//.word 0x24309056 -//.word 0x05e1c422 -//.word 0xa5366c7d -//.word 0xddf14beb -//.word 0xb259a27b -//.word 0x8498004c -//.word 0x89625c50 -//.word 0x7ad76150 -//.word 0x8cab0931 -//.word 0xa2846d75 -//.word 0xc1a3dc05 -//.word 0xc4c72a2d -//.word 0x514e4ae8 -//.word 0x0b9e1f5e -//.word 0x09c390ab -//.word 0x8859dbe2 -//.word 0xdcad2b51 -//.word 0xad1f6c07 -//.word 0x5fcb5e94 -//.word 0xd268e810 -//.word 0x4c6fb05f -//.word 0xb380e8b2 -//.word 0x00036b51 -//.word 0xf00b0899 -//.word 0xfc7f1d40 -//.word 0x8c7b68e1 -//.word 0x68f41bb4 -//.word 0x6f9b2e9c -//.word 0x8b04f968 -//.word 0xe4080252 -//.word 0x546814cc -//.word 0x1cb2917d -//.word 0xd5690886 -//.word 0xa9600a09 -//.word 0xc2673aec -//.word 0x0329a4da -//.word 0xf655508b -//.word 0x06fc1646 -//.word 0xef3bb3a4 -//.word 0x72191d96 -//.word 0x4db214a9 -//.word 0x6a96fa89 -//.word 0x576ce4c4 -//.word 0xf6dbf1d1 -//.word 0x76aadb51 -//.word 0x8125cb94 -//.word 0xb7c3725f -//.word 0x5c0755ed -//.word 0x4da46833 -//.word 0x39e4df69 -//.word 0x0d4a41c5 -//.word 0xb077be8a -//.word 0xf14ac241 -//.word 0xbe4bca46 -//.word 0x964a7787 -//.word 0x4043e089 -//.word 0xbe852dac -//.word 0x7d1362af -//.word 0xce4b7876 -//.word 0x9ac5b20b -//.word 0x507e2ee4 -//.word 0x2336bb64 -//.word 0x7316eaa3 -//.word 0x88966872 -//.word 0x869e8a9a -//.word 0x9deb2a65 -//.word 0x81b5b260 -//.word 0x1a8f765e -//.word 0x7c8e47c0 -//.word 0x19ad44f4 -//.word 0x3570f43c -//.word 0x9bc892b1 -//.word 0x8f37a887 -//.word 0x0334e092 -//.word 0x0ed11609 -//.word 0x999bb18b -//.word 0x5cc2345f -//.word 0x097a1000 -//.word 0xc6a0bdd9 -//.word 0xe1a1084d -//.word 0xbf98affa -//.word 0x16b62b3f -//.word 0x5ce7cdfb -//.word 0x80b20c98 -//.word 0xd7611e49 -//.word 0x5963c58f -//.word 0x0dee6c02 -//.word 0xc2e9724e -//.word 0x0008c67c -//.word 0x3e39b473 -//.word 0x553ffebe -//.word 0x359c2f8f -//.word 0xd7b52c04 -//.word 0x73310caa -//.word 0xf2a22940 -//.word 0xa66777bd -//.word 0x39d11594 -//.word 0xe3842236 -//.word 0xe020d2d8 -//.word 0x2221c177 -//.word 0x4304871a -//.word 0xbdac8c58 -//.word 0x5d031e19 -//.word 0xf5e4c0a1 -//.word 0x5239c5ca -//.word 0x6d601e90 -//.word 0xe5d471d3 -//.word 0xad096b59 -//.word 0x02975613 -//.word 0xa19beea1 -//.word 0x365a7017 -//.word 0x1728f502 -//.word 0x3289fea6 -//.word 0x4595508a -//.word 0x4da10237 -//.word 0x401bd43c -//.word 0xfeb6c275 -//.word 0x85c7d98d -//.word 0x65ef4ac2 -//.word 0x75fbbde8 -//.word 0xc308e7b1 -//.word 0xd1eb5f2b -//.word 0xfed0ad8a -//.word 0x4220a428 -//.word 0x1ea9f3ca -//.word 0xd3f9f625 -//.word 0xd30ad2a1 -//.word 0x7525c05c -//.word 0xec00a972 -//.word 0x7a2af47c -//.word 0xe1a89c56 -//.word 0x1be18526 -//.word 0x4ab71099 -//.word 0xf2f7ed70 -//.word 0x66f3303c -//.word 0x806da765 -//.word 0x95b76b71 -//.word 0xa819b683 -//.word 0xde73f422 -//.word 0x32231d3c -//.word 0x6a29416b -//.word 0x4a896576 -//.word 0x07f18d1b -//.word 0xff9c1a0c -//.word 0xa6765637 -//.word 0xc4814e4a -//.word 0xde77e077 -//.word 0xf1b11475 -//.word 0x6747b0c7 -//.word 0x43790640 -//.word 0x9f4e11c7 -//.word 0x587ac058 -//.word 0x0885924b -//.word 0x342a63d9 -//.word 0xc7fe86dc -//.word 0xbf5213d6 -//.word 0x27598235 -//.word 0x458e79d5 -//.word 0x1450e3c7 -//.word 0xf5cf4251 -//.word 0xa12c4635 -//.word 0x62dc9e36 -//.word 0x834e0ed9 -//.word 0x04cdc269 -//.word 0x93a7e23d -//.word 0xb88f663e -//.word 0x50402ca3 -//.word 0x3c6347ff -//.word 0x5ab39b7e -//.word 0xb45fa76b -//.word 0xf8afa1f6 -//.word 0x29ebc835 -//.word 0x9379f668 -//.word 0x04457481 -//.word 0x396613e4 -//.word 0x97fe786b -//.word 0x1c61b8ad -//.word 0x947a2580 -//.word 0x106b67bc -//.word 0x9474ce42 -//.word 0x1016e63d -//.word 0x91784ca8 -//.word 0xb909c111 -//.word 0x6d677d9c -//.word 0xcd80c54a -//.word 0x69f7c07b -//.word 0xb1c987b2 -//.word 0xae307b99 -//.word 0xf0c7db45 -//.word 0xc8ef96ba -//.word 0xb7725db2 -//.word 0x2567fd9a -//.word 0x5656ecde -//.word 0x9b9c2166 -//.word 0xc5102961 -//.word 0xdfe67841 -//.word 0x1dd4fd06 -//.word 0x0f74f9c0 -//.word 0x1aea104f -//.word 0x29c6a16e -//.word 0xa02c53f0 -//.word 0x9232f048 -//.word 0x3389774f -//.word 0x90606c42 -//.word 0x7d85730a -//.word 0xcfcd1dc1 -//.word 0xccb70271 -//.word 0xe04c101f -//.word 0x92492208 -//.word 0xb580d42a -//.word 0xe37c9606 -//.word 0x276400a5 -//.word 0xfa2166d9 -//.word 0x71c3abc5 -//.word 0xb4215a9f -//.word 0xb2c0f2b5 -//.word 0x13f782ae -//.word 0x6e507613 -//.word 0xbd30b10e -//.word 0x0ebbdc71 -//.word 0x7bf2fdf9 -//.word 0x5b1e4bd5 -//.word 0xba724162 -//.word 0x07ecf139 -//.word 0x0d7c9b6b -//.word 0x25687e0b -//.word 0xa9efeeed -//.word 0xab2da7ae -//.word 0xe73e61f4 -//.word 0xf7a6a4f7 -//.word 0xc6f0de41 -//.word 0x4796b3b2 -//.word 0x672194c6 -//.word 0x4091931b -//.word 0x8fff752d -//.word 0x68810964 -//.word 0x284eb952 -//.word 0xac235f35 -//.word 0xc0e55ac4 -//.word 0xda87e028 -//.word 0x092e9548 -//.word 0x28935d49 -//.word 0x57a96f55 -//.word 0xac81ac9c -//.word 0x256a2e99 -//.word 0xe15c2397 -//.word 0x9097dc73 -//.word 0x298721a3 -//.word 0xdbebc877 -//.word 0x4536869f -//.word 0xe93504ee -//.word 0xdef3355e -//.word 0xc6dae853 -//.word 0x001a9924 -//.word 0x1f4f8dd7 -//.word 0x9a5e1e2c -//.word 0xc49f53de -//.word 0xff42b325 -//.word 0x2deb5b7f -//.word 0x68a04fb0 -//.word 0xf3e50e07 -//.word 0x702569e4 -//.word 0x53549477 -//.word 0x96d37eca -//.word 0xaf945e02 -//.word 0xbf7e8ee2 -//.word 0x0c139d90 -//.word 0xb150a09c -//.word 0x94d4c83e -//.word 0x99453adf -//.word 0x15f01adb -//.word 0x86afe986 -//.word 0x8110126d -//.word 0xebb3bfde -//.word 0x6cf4f1aa -//.word 0x21cad029 -//.word 0x91ef407f -//.word 0xe342b41e -//.word 0x4e69478c -//.word 0xd0ba0967 -//.word 0x235c96a6 -//.word 0xeda9ee21 -//.word 0x37d78054 -//.word 0x20d8885f -//.word 0xd27e9b52 -//.word 0xb6e380a8 -//.word 0xe4084211 -//.word 0xdebc8375 -//.word 0x7dc01335 -//.word 0x2b28c2b4 -//.word 0x53047216 -//.word 0x16407047 -//.word 0x40c9043f -//.word 0x7af14685 -//.word 0xc11534f2 -//.word 0x167d02b8 -//.word 0x7783b1a3 -//.word 0x0ff8e39e -//.word 0xaac3ee78 -//.word 0x6bcb2fe8 -//.word 0xc118a1cf -//.word 0x9735adbe -//.word 0xcbd844b8 -//.word 0xe2c42c39 -//.word 0xfaef9776 -//.word 0xffe0fae7 -//.word 0x225c1c03 -//.word 0x87416e4b -//.word 0x3eb29a89 -//.word 0x75745e5a -//.word 0xec989bea -//.word 0xa95ba9ff -//.word 0xec4aee39 -//.word 0x65aaaf98 -//.word 0xa516253e -//.word 0xd36ad476 -//.word 0xa0e018f6 -//.word 0x7c790161 -//.word 0x0b9f6010 -//.word 0xd2082212 -//.word 0x37dddd71 -//.word 0xa81ca9b7 -//.word 0x1a3b31b1 -//.word 0xb50e0a73 -//.word 0xcdea439c -//.word 0x150b3ddc -//.word 0x0f33bcb3 -//.word 0xc7943f7b -//.word 0xc1f08da8 -//.word 0x30ff914f -//.word 0x681167e5 -//.word 0x96f4b74a -//.word 0xaf184205 -//.word 0xa6f1bad2 -//.word 0xe29dd75a -//.word 0xefc7a741 -//.word 0x74cb2665 -//.word 0x651a0e65 -//.word 0x79e1f061 -//.word 0xdfe58401 -//.word 0x2db13eb9 -//.word 0x99f4214b -//.word 0x6b25d88d -//.word 0xb268036c -//.word 0x36b5cf31 -//.word 0xaf37c903 -//.word 0x34f2f4ad -//.word 0xf6a918a2 -//.word 0x2eff5e3e -//.word 0x54dc1a4f -//.word 0x9212e8d4 -//.word 0x7841fa05 -//.word 0xf1f8b093 -//.word 0x761c6930 -//.word 0x818e9a52 -//.word 0x45081d34 -//.word 0x9c48cb1e -//.word 0x41714ce7 -//.word 0x3fae2eb8 -//.word 0xa9183512 -//.word 0x8cdaf213 -//.word 0x229297f5 -//.word 0x48fb0ad7 -//.word 0x32ca38c0 -//.word 0x5ed5ace1 -//.word 0xc67a601a -//.word 0x5a3fd3c0 -//.word 0xadb65b9e -//.word 0xefa4bd39 -//.word 0x1b61fb59 -//.word 0x71826dc4 -//.word 0x27b6134d -//.word 0x5cee2a0d -//.word 0x4dc1fdf1 -//.word 0xcb0efe75 -//.word 0xede315ae -//.word 0x029d388e -//.word 0xc9513c64 -//.word 0xe56beba2 -//.word 0x8b9556e3 -//.word 0x7edb6d2c -//.word 0x3d0ccc72 -//.word 0x7a63d85d -//.word 0xcf660b4c -//.word 0xad0f8c99 -//.word 0x952a031e -//.word 0x8afeabf8 -//.word 0xc62fa98a -//.word 0xace39cc5 -//.word 0xfe2475a7 -//.word 0x50868902 -//.word 0xbc09e47f -//.word 0xd840e0e2 -//.word 0xe5b3f790 -//.word 0x4983d64e -//.word 0x404cb24b -//.word 0xce4fdf61 -//.word 0xf8d19f98 -//.word 0x33be38ec -//.word 0x1d924950 -//.word 0x6b795df2 -//.word 0x22b5c1c1 -//.word 0x0b41932d -//.word 0x60b41c2d -//.word 0xcc676087 -//.word 0x93daf24c -//.word 0x0c540da1 -//.word 0x58cae1c5 -//.word 0x4e022b50 -//.word 0xb5f908b9 -//.word 0xb6810b1b -//.word 0x902e8d39 -//.word 0x8e7344bf -//.word 0x370918cb -//.word 0xc49031ab -//.word 0xd77955e9 -//.word 0x69237184 -//.word 0x04447581 -//.word 0x338b65a2 -//.word 0x3884ad76 -//.word 0xfcbbb692 -//.word 0x4c24b61d -//.word 0x41bacc92 -//.word 0x00674cc1 -//.word 0xa4245817 -//.word 0x7961b020 -//.word 0x6ba7ca4a -//.word 0xbe7c26ec -//.word 0xff87dc86 -//.word 0x3af4774b -//.word 0x6d1a05dc -//.word 0x3d5b6f57 -//.word 0xe84c0790 -//.word 0x7b16609e -//.word 0x451d629a -//.word 0x8bdf9da3 -//.word 0x7d1ede25 -//.word 0x6941005b -//.word 0x2ff80513 -//.word 0xf51f66b2 -//.word 0x1be5a677 -//.word 0x712d2d04 -//.word 0xa834541a -//.word 0x0774bda4 -//.word 0x5fc9e5f7 -//.word 0x41d3fc58 -//.word 0x6e9bf4be -//.word 0x8f79d8da -//.word 0x27355f55 -//.word 0xc56cc159 -//.word 0x7e35c952 -//.word 0x9a052bf6 -//.word 0x8ed01983 -//.word 0x2b711147 -//.word 0x144cf966 -//.word 0x75326dd8 -//.word 0xf28558b1 -//.word 0xde9cc1a5 -//.word 0xae68e8cb -//.word 0xad5892a1 -//.word 0xf17ba151 -//.word 0x8de5e732 -//.word 0x08533c92 -//.word 0x0e12ceb3 -//.word 0x661cb913 -//.word 0x2485d8f0 -//.word 0x2015da0c -//.word 0xa63798ae -//.word 0x6f11a5e9 -//.word 0xd0f52720 -//.word 0x32f8e6ca -//.word 0xc2e0a373 -//.word 0x6a44ab03 -//.word 0xffeeac43 -//.word 0xbc84c69d -//.word 0xef68e524 -//.word 0xf2dc4fd4 -//.word 0x5d6a791a -//.word 0x7a831f97 -//.word 0xf9669321 -//.word 0xe543560a -//.word 0xd7a0e5a5 -//.word 0x6afdd507 -//.word 0xeeb3220b -//.word 0x6122c599 -//.word 0x9b0b8427 -//.word 0xc83b0e7f -//.word 0x1b6a47c3 -//.word 0xc162e1af -//.word 0x14642c1f -//.word 0x12c72fd1 -//.word 0x0de2f76b -//.word 0xa32c2fc0 -//.word 0xf1a2f14f -//.word 0x0469dc0c -//.word 0x90b56764 -//.word 0xe5e9747b -//.word 0x1e0029b8 -//.word 0x9c2bfb83 -//.word 0xb3bb0b4d -//.word 0xa242b6d1 -//.word 0xc9f5679a -//.word 0x1655b0c6 -//.word 0xc10f9a09 -//.word 0x392039f5 -//.word 0x5e3c8378 -//.word 0xf07162a6 -//.word 0x470807b8 -//.word 0x45ac8255 -//.word 0x8ace8f11 -//.word 0xe647b334 -//.word 0x143f88bc -//.word 0xa54e55a5 -//.word 0x3ae2e267 -//.word 0xf6e18bc1 -//.word 0x338f92b5 -//.word 0x74b1bad4 -//.word 0x9bf311bb -//.word 0x5d870dde -//.word 0xf20fda84 -//.word 0x11bdf313 -//.word 0x1bb8f08e -//.word 0x97c29e5c -//.word 0xde19554b -//.word 0x179a86d4 -//.word 0x662c94a1 -//.word 0x615ce54c -//.word 0xc445386a -//.word 0x65b339c8 -//.word 0x6a8852f4 -//.word 0xb95ec5ff -//.word 0xb06df882 -//.word 0x17af0fdf -//.word 0x5243c0c9 -//.word 0xdb106307 -//.word 0xf0aa4974 -//.word 0x89794f4b -//.word 0x8d18b3a1 -//.word 0x45fb2633 -//.word 0x11552262 -//.word 0x5a387d7c -//.word 0xc7fe3f3d -//.word 0xb4e9b196 -//.word 0xe006b6ac -//.word 0x65575e24 -//.word 0xee30b99e -//.word 0x24e2e97f -//.word 0x69977bf4 -//.word 0xc97df834 -//.word 0x2d27b605 -//.word 0xd230f481 -//.word 0xfa21261a -//.word 0xe2948edc -//.word 0xf39a0cf2 -//.word 0x3c5b376c -//.word 0x20fcac3f -//.word 0x4cc6a78d -//.word 0xed84d027 -//.word 0x1f2c5751 -//.word 0xa8c242c5 -//.word 0xe67a06fa -//.word 0x061d55a5 -//.word 0x77ad3881 -//.word 0x9e4c5d4b -//.word 0xcc5ab211 -//.word 0x6dde33ad -//.word 0x8227ff8d -//.word 0x51b3b2b5 -//.word 0x5a4fef06 -//.word 0x8e803cc0 -//.word 0xbc221346 -//.word 0x4c4f3521 -//.word 0x2f824248 -//.word 0x16fc879e -//.word 0xe26717bd -//.word 0x5cba1df2 -//.word 0x275c7088 -//.word 0xf38c684a -//.word 0xf200f143 -//.word 0x90ccddc8 -//.word 0x5f867fb9 -//.word 0x50a87503 -//.word 0x2935c569 -//.word 0x33a02c85 -//.word 0x33e9b209 -//.word 0x9c09824b -//.word 0x0390f901 -//.word 0xd38dfd48 -//.word 0x42ae90ec -//.word 0x84a8a4e3 -//.word 0x3ed9311a -//.word 0x3d2c8675 -//.word 0x683edd11 -//.word 0xf3bf31cc -//.word 0xd61a5407 -//.word 0x7e583caa -//.word 0xc2419d69 -//.word 0x18c5be46 -//.word 0x099b8557 -//.word 0xe228d3ca -//.word 0xada21826 -//.word 0x5f751ed3 -//.word 0x53e629dd -//.word 0xf7f642f5 -//.word 0xc689d0b9 -//.word 0x76c76835 -//.word 0x72c3e6a9 -//.word 0x8a5abd8c -//.word 0xe95f8bd2 -//.word 0x48f5f16b -//.word 0x623ba10c -//.word 0xa82fb831 -//.word 0x35cc4f63 -//.word 0x04764cb6 -//.word 0x61987e97 -//.word 0x9d8ceac4 -//.word 0x06bb5f9c -//.word 0x16055199 -//.word 0xeb63e41b -//.word 0xf7ca4667 -//.word 0xf95342ef -//.word 0x2c9a12d4 -//.word 0xbe6375a9 -//.word 0x8384027a -//.word 0xebffbc0c -//.word 0x326ee667 -//.word 0xd6a41992 -//.word 0x4e91939e -//.word 0xf966d2e5 -//.word 0x55fa6294 -//.word 0x716cf367 -//.word 0xa50baeb4 -//.word 0x8072c9ab -//.word 0x02f759dc -//.word 0x0b4768fa -//.word 0x144a48de -//.word 0x1d4d26ce -//.word 0xe65fe200 -//.word 0x62fb1f5a -//.word 0x69e8967c -//.word 0xad5eaf00 -//.word 0xef6a5200 -//.word 0x7393fad9 -//.word 0xb1be0c2f -//.word 0x4d4f6832 -//.word 0x49913d1f -//.word 0x7a582109 -//.word 0x38e561d9 -//.word 0x5a099594 -//.word 0x628e78dc -//.word 0xf4d2f7ba -//.word 0x8db5889a -//.word 0x71b5bd97 -//.word 0xe55819f9 -//.word 0x9fcb22fc -//.word 0x7bc8b7d4 -//.word 0x6fbca4ed -//.word 0xc12a7477 -//.word 0x774a8722 -//.word 0x10f76426 -//.word 0x71c84f87 -//.word 0x227c1f97 -//.word 0xba9b4abc -//.word 0x985a4273 -//.word 0xd4bf0495 -//.word 0x7507edda -//.word 0xe545d09b -//.word 0xa24b47dc -//.word 0x35cd4689 -//.word 0x68c4f600 -//.word 0xb411c0d0 -//.word 0xf963a7c0 -//.word 0x725adc14 -//.word 0xe7ed8c0b -//.word 0x2409fdac -//.word 0xab7ad9c2 -//.word 0xa60fca26 -//.word 0x1ff9463c -//.word 0x7375adc0 -//.word 0x04ab91c3 -//.word 0x2fd554f0 -//.word 0x7ea3f914 -//.word 0x1ede34de -//.word 0x934dc3e3 -//.word 0xaad501e4 -//.word 0xafe3b954 -//.word 0xe10f3815 -//.word 0x23f9a683 -//.word 0xf47796b3 -//.word 0xa1f3dbfc -//.word 0xb90e9db7 -//.word 0xc289ad44 -//.word 0x2a66164e -//.word 0x814af54f -//.word 0xe5268a56 -//.word 0xbd168e08 -//.word 0xaa8ac7e4 -//.word 0xbaa3dbcc -//.word 0xdfe062c1 -//.word 0xa0f93eef -//.word 0x0f0b2fe9 -//.word 0xfbf6a235 -//.word 0x6603ca0b -//.word 0x39cbf25a -//.word 0x3754120c -//.word 0x307ca08b -//.word 0x779ba884 -//.word 0x96641feb -//.word 0x3f0c753f -//.word 0x86af690f -//.word 0x4eef21bd -//.word 0x01de7a82 -//.word 0x851e9db2 -//.word 0x6b46d341 -//.word 0x69889a87 -//.word 0x0a91f840 -//.word 0xa4b10fd7 -//.word 0x8b3cf2e4 -//.word 0x8430b7f3 -//.word 0x7c17cd87 -//.word 0x7a2f905e -//.word 0xd3c91bf7 -//.word 0x9def5d52 -//.word 0x654970f7 -//.word 0x25422539 -//.word 0x7066e4bc -//.word 0xf00eb335 -//.word 0x12409471 -//.word 0x00d11499 -//.word 0xd0cc21b4 -//.word 0xfa181c6d -//.word 0x10542f16 -//.word 0xa906e1ee -//.word 0x9ff5e79f -//.word 0x7ad33d0b -//.word 0x2b1f7648 -//.word 0xfe4a51e9 -//.word 0xca198c80 -//.word 0x6a4afd61 -//.word 0x717adea8 -//.word 0x1a46697d -//.word 0x7eb1a596 -//.word 0x0ac57ffe -//.word 0x2f7e1c15 -//.word 0x5be36ed9 -//.word 0x29760563 -//.word 0xd5ce28b4 -//.word 0xf28325b2 -//.word 0x5f4ae56e -//.word 0x7761c3a8 -//.word 0x882e9e95 -//.word 0x86232de0 -//.word 0x01e493ee -//.word 0x55ac3466 -//.word 0x21edc6f1 -//.word 0xfa36ab3e -//.word 0x605a7e4a -//.word 0xf0cfecde -//.word 0xdc54c559 -//.word 0x99d652af -//.word 0xd795eab2 -//.word 0xb683c090 -//.word 0x37ecff9d -//.word 0xf05c1953 -//.word 0x05be5b97 -//.word 0x53c1c63e -//.word 0xee801ad0 -//.word 0xce61338c -//.word 0xc53d98ac -//.word 0xb4c252ea -//.word 0xff16fa42 -//.word 0x3ebd16fa -//.word 0x36bda6e0 -//.word 0x0700f9d3 -//.word 0xa6f9c584 -//.word 0x8e8b777e -//.word 0xb326c864 -//.word 0xb833917a -//.word 0x61b2e067 -//.word 0x4b214b3a -//.word 0xdba084aa -//.word 0x74542ea2 -//.word 0xed09effd -//.word 0x421bc78e -//.word 0x8996a063 -//.word 0x289c264a -//.word 0x4607d895 -//.word 0x7f505f1b -//.word 0xdcb01f7f -//.word 0x02840db5 -//.word 0xa9f6c0c1 -//.word 0x50dacac2 -//.word 0x2fd64830 -//.word 0x6ec6b862 -//.word 0x945e0b53 -//.word 0x4211fba5 -//.word 0x21329fe6 -//.word 0x195a3d13 -//.word 0xc4095f5a -//.word 0x22902924 -//.word 0x8e2ee953 -//.word 0xf079f0c8 -//.word 0x35ffa129 -//.word 0xfc2ec7e1 -//.word 0x92712c68 -//.word 0x219c67c4 -//.word 0x248af550 -//.word 0x1e048bbc -//.word 0x8ce5ab55 -//.word 0x187c7686 -//.word 0x0f32c19f -//.word 0x156d6ad6 -//.word 0x18b4ec8c -//.word 0x821332d1 -//.word 0xb3c1a929 -//.word 0xae009990 -//.word 0x1245b5bd -//.word 0x4d99f1a4 -//.word 0x0c3f933e -//.word 0xf5978d8c -//.word 0x99420ada -//.word 0xa4874741 -//.word 0x57f5a46f -//.word 0x394afbab -//.word 0x09943013 -//.word 0xf6960928 -//.word 0x136d408d -//.word 0x0574d70c -//.word 0xfe64acda -//.word 0xf0c04d1c -//.word 0xfa700da9 -//.word 0x27ab5812 -//.word 0x571b43e0 -//.word 0x7d3c671c -//.word 0x0b06f015 -//.word 0xabcbf15d -//.word 0x3062fb15 -//.word 0xcc85ed6a -//.word 0x83780d60 -//.word 0xdfeb58cf -//.word 0xe62217aa -//.word 0x4953b387 -//.word 0xde50ca5c -//.word 0x50658287 -//.word 0x16841e12 -//.word 0xa19fcf34 -//.word 0xda56cc1b -//.word 0xcbd2a4e8 -//.word 0x9cf1d3fc -//.word 0xc2a39472 -//.word 0x7394f7ec -//.word 0x5d0b3393 -//.word 0x97123d59 -//.word 0xd8d79a82 -//.word 0xe7527162 -//.word 0x5228e468 -//.word 0x63cfa05b -//.word 0x50f3b3e4 -//.word 0xb2199f4d -//.word 0x3883ac88 -//.word 0x9d538273 -//.word 0xd7f3f65a -//.word 0x92b325bd -//.word 0xdcb4bf54 -//.word 0x2206a651 -//.word 0x5b0db8e5 -//.word 0x8329e805 -//.word 0x4b95946e -//.word 0x0f9013e7 -//.word 0x08bb8dc6 -//.word 0xc3c30fb5 -//.word 0xd13fdeb6 -//.word 0xc1dc0c65 -//.word 0x4bb74a7d -//.word 0xce0afd9e -//.word 0xfd0b944e -//.word 0xd411183d -//.word 0xd2f904cd -//.word 0x62c858d1 -//.word 0x9a91e995 -//.word 0x279afb20 -//.word 0x88ba11b5 -//.word 0x7b0504a0 -//.word 0xb5ac532f -//.word 0xd61ebafe -//.word 0x9c730677 -//.word 0x570b279a -//.word 0x9d7287fa -//.word 0x3e879a08 -//.word 0x7adeb794 -//.word 0x72622691 -//.word 0xdd3f7a19 -//.word 0xfcff20b1 -//.word 0xd0f239cd -//.word 0x8ad4a597 -//.word 0x43aa60ec -//.word 0xeded12a7 -//.word 0x8aeae123 -//.word 0x9c698afb -//.word 0xdc8db014 -//.word 0x2efb74de -//.word 0xd53e45d6 -//.word 0xe36bf950 -//.word 0xf4001d73 -//.word 0x1c128a85 -//.word 0x1ea83969 -//.word 0xdf625965 -//.word 0x1a5e9e29 -//.word 0x545bdb0d -//.word 0x131fd39b -//.word 0x4b174d4d -//.word 0x193e6697 -//.word 0xb33f2b28 -//.word 0xa0de676e -//.word 0x2494ba58 -//.word 0xff79eb5f -//.word 0x57687fc7 -//.word 0xf25d8b22 -//.word 0xa821c617 -//.word 0x182ae261 -//.word 0x9bbc1d1a -//.word 0x7655133a -//.word 0x5448d65b -//.word 0xf3a840bf -//.word 0x1d678893 -//.word 0xdabf1475 -//.word 0xe4d18e35 -//.word 0x5b8d3ad8 -//.word 0xbad187e3 -//.word 0x0ad5e4d6 -//.word 0x55c6d4f6 -//.word 0x5eb1454f -//.word 0x8fa31efa -//.word 0x330f179c -//.word 0xe56fcd2f -//.word 0x482e1605 -//.word 0xf9c69109 -//.word 0xc2268249 -//.word 0x1156ddb1 -//.word 0xa85da119 -//.word 0x95636783 -//.word 0x65133b9d -//.word 0x9543aa8e -//.word 0x49d71cee -//.word 0x40e26516 -//.word 0x080f969b -//.word 0x6e401915 -//.word 0x3974fd25 -//.word 0x18ee8eb6 -//.word 0xd8942982 -//.word 0xda954ed8 -//.word 0xc54ef79d -//.word 0x786f2892 -//.word 0x4359c8d4 -//.word 0x56cbafa9 -//.word 0x79be0079 -//.word 0xfe8db91b -//.word 0xf4598853 -//.word 0x9eace198 -//.word 0x245c4d1a -//.word 0x87b30503 -//.word 0xdaccbffd -//.word 0xb040c8f5 -//.word 0xd103531f -//.word 0x3188113b -//.word 0x222c0116 -//.word 0xc8d18a53 -//.word 0xcdc9c76b -//.word 0x57f722f3 -//.word 0x3730241e -//.word 0x64e78b82 -//.word 0xa70a9d1f -//.word 0x9727bd9d -//.word 0xc8d33cd5 -//.word 0x404c7193 -//.word 0x2a5d0c9a -//.word 0xcf82a7e9 -//.word 0xc14d9e3d -//.word 0x590821d7 -//.word 0x649c877f -//.word 0x1ab2e5c9 -//.word 0x5017e097 -//.word 0xee65bfdf -//.word 0xa2e0c5af -//.word 0xd69ebd6e -//.word 0xe0ebd664 -//.word 0x79ebb17d -//.word 0x7181b949 -//.word 0xa170b348 -//.word 0x20c09565 -//.word 0xba649cc0 -//.word 0x9d1999b0 -//.word 0x56918c09 -//.word 0xfcd1739a -//.word 0xabd864fa -//.word 0x3481da85 -//.word 0x13aa4da1 -//.word 0xa2960546 -//.word 0x8c902fbd -//.word 0x83d131a7 -//.word 0x36a43b42 -//.word 0x7dc81ee8 -//.word 0xd71662d8 -//.word 0x17639239 -//.word 0x5aa8db5c -//.word 0x3c61d642 -//.word 0x4c32a15e -//.word 0xbdd0349b -//.word 0x5e1ff2a1 -//.word 0xcc987f54 -//.word 0xe5eed29e -//.word 0x81f18b6f -//.word 0x5db28602 -//.word 0x58e8b061 -//.word 0xe292192b -//.word 0xb1de4b95 -//.word 0xb54adbaf -//.word 0x4f093de9 -//.word 0xbea8dcd5 -//.word 0xdaf16a2e -//.word 0x0410751a -//.word 0x5df43cac -//.word 0x36f8c0ad -//.word 0xc8c31e9c -//.word 0x256c1bf3 -//.word 0x6fe201ac -//.word 0x488caa04 -//.word 0x892cda7f -//.word 0x3709d22c -//.word 0xb34d212a -//.word 0x30acbe6b -//.word 0x6a4654b8 -//.word 0x96cfddf5 -//.word 0x94ed72a7 -//.word 0x6ce161b3 -//.word 0xf86a8168 -//.word 0xdee6c2c0 -//.word 0xc2bb08e3 -//.word 0xb9f53aed -//.word 0x003195f1 -//.word 0xeeb9473e -//.word 0x27f039e1 -//.word 0x13f12c6b -//.word 0x8e7307f4 -//.word 0xe1f06f5f -//.word 0xf10699e0 -//.word 0xb71d5cbc -//.word 0xf04a8b50 -//.word 0x16738155 -//.word 0x8eb4fd62 -//.word 0x230231b2 -//.word 0xb30e1528 -//.word 0x286c0190 -//.word 0xaaf57b28 -//.word 0x146a4e5f -//.word 0xa45adcdc -//.word 0xf645b4c2 -//.word 0x33016733 -//.word 0x865d9813 -//.word 0xcf05530e -//.word 0x9ca5a0dc -//.word 0x555157c3 -//.word 0xb625355e -//.word 0x8228309e -//.word 0x7676080e -//.word 0x7c9f1f5b -//.word 0x224a8a13 -//.word 0x4a1e68ad -//.word 0x23e272ca -//.word 0x58e2d4ba -//.word 0x87953c42 -//.word 0xf47e309c -//.word 0x7f50a4c0 -//.word 0xd355cce2 -//.word 0xe1102f3c -//.word 0x8d22fd0d -//.word 0xa66aa2e2 -//.word 0x1c709b14 -//.word 0x6d048892 -//.word 0x612283e0 -//.word 0xf719b160 -//.word 0x9fec16d1 -//.word 0xa9f9ae15 -//.word 0xfed8b937 -//.word 0x0e8656ac -//.word 0x09c353d9 -//.word 0x52b844d6 -//.word 0x31ddd272 -//.word 0xc81a5677 -//.word 0x482da72f -//.word 0x644b2f26 -//.word 0x060a4532 -//.word 0x417eb7b1 -//.word 0x88a2a512 -//.word 0x1dfa9697 -//.word 0xcb77c558 -//.word 0xd89bbc8c -//.word 0x36dd2404 -//.word 0xf94fdcf8 -//.word 0x0e7e4806 -//.word 0x299aec78 -//.word 0xffd739c6 -//.word 0xb612a65b -//.word 0x99b8039c -//.word 0x11e40a27 -//.word 0xd0c73858 -//.word 0x504ddb12 -//.word 0x7cfd6bbc -//.word 0xad221d89 -//.word 0xd728b6fd -//.word 0x05489dad -//.word 0x02683546 -//.word 0x593c69d0 -//.word 0x80b28934 -//.word 0x518d54fc -//.word 0xb94f565b -//.word 0xb45d746d -//.word 0x795ec5bf -//.word 0xf1e4a312 -//.word 0x6e4e025c -//.word 0x9aed0110 -//.word 0xae65bf9f -//.word 0xe456703f -//.word 0x2e3cb0eb -//.word 0x289416ab -//.word 0x4b410d15 -//.word 0x642ddf14 -//.word 0x453313e8 -//.word 0xbb3df96e -//.word 0xc0a983a2 -//.word 0xf1f25662 -//.word 0x428c2175 -//.word 0xf00f2ecb -//.word 0xb7983706 -//.word 0x466c7a3a -//.word 0xf0df0ff1 -//.word 0xa4757a73 -//.word 0x1f467d44 -//.word 0x60a730ed -//.word 0x5c0653ff -//.word 0xf416e256 -//.word 0x242dea9b -//.word 0x7dea9c0c -//.word 0xd51a9f80 -//.word 0x3ddcaba5 -//.word 0x3304548d -//.word 0x19be2369 -//.word 0xe674eb94 -//.word 0x1cf15ad3 -//.word 0xfac6cfdb -//.word 0xf2ec6b13 -//.word 0x5dac6b9c -//.word 0x6ebcb58f -//.word 0x64abb085 -//.word 0x047e595d -//.word 0x479c9439 -//.word 0x50e7bfca -//.word 0xa02c8dce -//.word 0x8dbd12d6 -//.word 0xf05c1a4d -//.word 0x1f5bbfb6 -//.word 0x1b023b35 -//.word 0x0a31fa51 -//.word 0xe746f4f8 -//.word 0x784139c3 -//.word 0x8027cd7c -//.word 0x37a4b7de -//.word 0xf7f3559b -//.word 0x3803f2a4 -//.word 0xbed29aa4 -//.word 0x111d2dcd -//.word 0x2e3cb3d8 -//.word 0x7c48ef47 -//.word 0x017e37ee -//.word 0xd6e883b1 -//.word 0xd83ac38f -//.word 0xa1fa76e0 -//.word 0xb7e378da -//.word 0x028c1b5a -//.word 0x84457ae2 -//.word 0x44410add -//.word 0x8bfb722b -//.word 0x53d29dd9 -//.word 0xfdf60d30 -//.word 0x428872f2 -//.word 0x6cfd7be0 -//.word 0xc6c4ec7f -//.word 0x5128f11c -//.word 0xb877b10e -//.word 0x8664273b -//.word 0x97aa2dde -//.word 0xccf2da87 -//.word 0x03f70e63 -//.word 0x47e84bbd -//.word 0x430ec7c5 -//.word 0xfdaebf90 -//.word 0xc1310d61 -//.word 0x5a82fd27 -//.word 0x89b85d46 -//.word 0xaff5d39a -//.word 0xcd8d74b9 -//.word 0xae6b9179 -//.word 0x63b1d4b3 -//.word 0xf09f8c46 -//.word 0x45b6465e -//.word 0x701d9df6 -//.word 0x1043539b -//.word 0x0dc6a073 -//.word 0x8694c97f -//.word 0x0b50f51d -//.word 0x0df73dd1 -//.word 0x92c30244 -//.word 0x2d4f838d -//.word 0x2efdaeb0 -//.word 0x16953764 -//.word 0x4e2ee81a -//.word 0x1852383a -//.word 0xc55d1eb0 -//.word 0x292627a7 -//.word 0x4ce1c794 -//.word 0x6244ec77 -//.word 0xfde9d95e -//.word 0x82f4322a -//.word 0xd9f55395 -//.word 0x6910e674 -//.word 0x445bb53a -//.word 0x9e87bcbe -//.word 0x84c3833e -//.word 0xcbddaba3 -//.word 0x46aac606 -//.word 0x3ca96c74 -//.word 0x18e38bee -//.word 0x6315feb4 -//.word 0xf01161c4 -//.word 0x5662249d -//.word 0xa32fdf48 -//.word 0x4f62e599 -//.word 0x6f081cb3 -//.word 0x2bfb0cca -//.word 0x72bf352d -//.word 0xedaba683 -//.word 0x3149cb54 -//.word 0x38ff87cc -//.word 0x12ee82bc -//.word 0xd81ac5e2 -//.word 0xe2cb846a -//.word 0x39343ab4 -//.word 0x4f53fc58 -//.word 0xee180668 -//.word 0x6fc99bf5 -//.word 0x2ca50cd4 -//.word 0x38c816a1 -//.word 0x4d4e7005 -//.word 0x05bba535 -//.word 0x4d9b20bb -//.word 0x17658579 -//.word 0x50a548eb -//.word 0x125a78ac -//.word 0x1a9ddb3c -//.word 0x7c844000 -//.word 0x9546118a -//.word 0x42a0281b -//.word 0x4f77e366 -//.word 0x33be7b97 -//.word 0xfa9a9194 -//.word 0x82c40a83 -//.word 0xea301d8c -//.word 0x48ecaae0 -//.word 0x9a4acefa -//.word 0x0041b425 -//.word 0x2811ae3e -//.word 0x092684bb -//.word 0xd43f0cec -//.word 0x27cffa81 -//.word 0x84a3fa4d -//.word 0x03c6fc49 -//.word 0x43a2cfdc -//.word 0xa667f259 -//.word 0xbeb1a7ca -//.word 0x026548ec -//.word 0xc6dbde7a -//.word 0x6a43f0ae -//.word 0xd1419906 -//.word 0x14dbdd44 -//.word 0x78953db8 -//.word 0x9eda89c1 -//.word 0xfa9ef692 -//.word 0x86427132 -//.word 0xb8b832c6 -//.word 0xb1e79313 -//.word 0xb751233f -//.word 0xe5f3f6d7 -//.word 0x216c4017 -//.word 0x4f622265 -//.word 0xc422c41e -//.word 0xfe86a495 -//.word 0x921c2e59 -//.word 0x65848cb7 -//.word 0x1f1abf80 -//.word 0xddd6ef0d -//.word 0x2770ff7f -//.word 0x21c7654b -//.word 0x058339f7 -//.word 0xd0f98b1e -//.word 0x3c50faba -//.word 0xefe282a3 -//.word 0xf2e59652 -//.word 0x644b6feb -//.word 0x70e6a37b -//.word 0x7cd0f97d -//.word 0xa30a7ca4 -//.word 0x6663ced4 -//.word 0x9e9cbf71 -//.word 0xb5c91edd -//.word 0x16fad03c -//.word 0xe21b1e7b -//.word 0xe5195390 -//.word 0xc8478703 -//.word 0x88ffb6ad -//.word 0x278c15c0 -//.word 0xa147a507 -//.word 0x2101086f -//.word 0x75a194c7 -//.word 0xbf0ea6c4 -//.word 0x6e503848 -//.word 0x6df2b6e3 -//.word 0x9aaa0e9b -//.word 0x7a3c07e8 -//.word 0x2b9bd303 -//.word 0x9a51e760 -//.word 0xf6220a79 -//.word 0x64ecacce -//.word 0xf4d27a2a -//.word 0xd3992f27 -//.word 0xc352adf4 -//.word 0xc93a4c56 -//.word 0x25de72ed -//.word 0x878364b9 -//.word 0x80c45bdd -//.word 0x377ddba2 -//.word 0x5de840be -//.word 0x63069ad7 -//.word 0xea41ba43 -//.word 0x7b4f8d12 -//.word 0x7859a94e -//.word 0x525d2681 -//.word 0xfdd1af78 -//.word 0xa189d847 -//.word 0x93dab28d -//.word 0x83009ef9 -//.word 0xf7bd5e0d -//.word 0xf8437222 -//.word 0x0a54a1ad -//.word 0x62a8d6c0 -//.word 0x548f2dd4 -//.word 0x0bd74ec5 -//.word 0x7cf0fa1e -//.word 0x9c4ee397 -//.word 0xd10fc1dc -//.word 0xa7dea290 -//.word 0xc5178192 -//.word 0x1f2b1b7f -//.word 0x6d47fe78 -//.word 0xdb30e325 -//.word 0x02723df9 -//.word 0x17b912b8 -//.word 0x627f0a37 -//.word 0xf2e7c664 -//.word 0x90e97285 -//.word 0xf1b09ec5 -//.word 0x304049ec -//.word 0x7b5c3f6e -//.word 0x0ca7a6a7 -//.word 0x5a09d365 -//.word 0x915462a7 -//.word 0x402885a4 -//.word 0x52149c0f -//.word 0x40fd069a -//.word 0x85c437b9 -//.word 0x51230ba8 -//.word 0x81d85aaf -//.word 0xcf06cda5 -//.word 0x46d8f0b3 -//.word 0xfa67885a -//.word 0xf5de26b7 -//.word 0x74dcfc06 -//.word 0x5419f066 -//.word 0xc74defdb -//.word 0x4b4d8499 -//.word 0xdd77a980 -//.word 0x6951dde3 -//.word 0x866d768d -//.word 0x60903906 -//.word 0xf5122812 -//.word 0x85889b7b -//.word 0x43a19210 -//.word 0x514e4aee -//.word 0xeb260efe -//.word 0xe30850bf -//.word 0x4d02f846 -//.word 0x7b71fc83 -//.word 0x2c6a31c5 -//.word 0x00596180 -//.word 0x2fe89d4f -//.word 0x7b23d435 -//.word 0x63d9a528 -//.word 0x9a4572d0 -//.word 0xb7edb68c -//.word 0x2ecb98b6 -//.word 0x7fabc028 -//.word 0xadd469fe -//.word 0xf2eab79e -//.word 0xb1134bf6 -//.word 0xac591605 -//.word 0x77506a9d -//.word 0x2df85767 -//.word 0x61e43427 -//.word 0x579c7c41 -//.word 0x7441dc7d -//.word 0xf46f8907 -//.word 0xdb67d7ba -//.word 0x2e6e089d -//.word 0x627061ae -//.word 0x15e984df -//.word 0xfc06f95f -//.word 0x1d070e1a -//.word 0x3ee7e183 -//.word 0x9d3fbb91 -//.word 0xe1689f07 -//.word 0x51df23f9 -//.word 0x44ee7f8c -//.word 0xd889e4fd -//.word 0xe7770fe5 -//.word 0x37b21dbb -//.word 0xf10fa19a -//.word 0x5521f444 -//.word 0xab5bcc68 -//.word 0x7d761020 -//.word 0x0312ebbe -//.word 0xdfa020c8 -//.word 0x0b7f9d41 -//.word 0x0f65522a -//.word 0x77014349 -//.word 0x84dfdc29 -//.word 0x228b8562 -//.word 0x1af9771a -//.word 0x8924cecc -//.word 0x91f6df49 -//.word 0x4e68cbfc -//.word 0x0bea5571 -//.word 0xb605f019 -//.word 0x923f1c47 -//.word 0x2c3ff37f -//.word 0x9031fff0 -//.word 0xbc6c4f3f -//.word 0x5552ca86 -//.word 0x9978c39d -//.word 0x9508cd98 -//.word 0x9863d090 -//.word 0xe70a5ca7 -//.word 0xb2be3e46 -//.word 0x47e651a9 -//.word 0x8632979e -//.word 0x957e8889 -//.word 0xd5f9aaac -//.word 0x148662a5 -//.word 0x04620a38 -//.word 0xeb07434f -//.word 0x9d518d3f -//.word 0xa8e0154d -//.word 0xcebdcd71 -//.word 0xb840c25a -//.word 0xe831abb1 -//.word 0xf02dbda2 -//.word 0xe14bc799 -//.word 0x07007a49 -//.word 0xd34008f3 -//.word 0x19e6f2e5 -//.word 0x7c561a41 -//.word 0x266120ff -//.word 0xbc69eb35 -//.word 0x90c58696 -//.word 0x19662e39 -//.word 0xa1bba99d -//.word 0x3ed3d9e9 -//.word 0x03c29078 -//.word 0x7745a694 -//.word 0x46a94982 -//.word 0x37e895c0 -//.word 0x5e16648a -//.word 0x93fb68a2 -//.word 0x23027751 -//.word 0xc55225a9 -//.word 0xcf3a980e -//.word 0xa9d298f5 -//.word 0x82dfe6ea -//.word 0x43f8cfd8 -//.word 0xc1e70085 -//.word 0x37529c5c -//.word 0xf39b8c6f -//.word 0x4f0417bc -//.word 0xe317b2af -//.word 0xf94519e9 -//.word 0x41cd9e40 -//.word 0xc7dfc107 -//.word 0x2101028f -//.word 0xedb3f3ed -//.word 0x7b4e91fe -//.word 0xc632d4a9 -//.word 0xa9208564 -//.word 0x4fe550fa -//.word 0xec391a8b -//.word 0xaae695d4 -//.word 0xe72d11b0 -//.word 0x9d6595df -//.word 0x21e52e07 -//.word 0x112487f8 -//.word 0x871fba34 -//.word 0x93fb66af -//.word 0xe9ec02d3 -//.word 0xd65570c7 -//.word 0x7931d5f1 -//.word 0x2fb1a9ba -//.word 0x4f260a91 -//.word 0x18225632 -//.word 0xe7daf828 -//.word 0xadcf8290 -//.word 0xa1aefd21 -//.word 0x32747c69 -//.word 0x40d5f859 -//.word 0x8bdf5704 -//.word 0x6cdbcea4 -//.word 0xc37469de -//.word 0x301be847 -//.word 0x86a9cd26 -//.word 0x7c46b37c -//.word 0xa68ae141 -//.word 0xa4e31ff1 -//.word 0x9a37c947 -//.word 0xe0ca2148 -//.word 0xfa61e984 -//.word 0xcaa83299 -//.word 0x04d16ff8 -//.word 0xe37ecdec -//.word 0x1ae1c7d8 -//.word 0x0e21f4c0 -//.word 0x4200240a -//.word 0x12bcac86 -//.word 0xa532fead -//.word 0x1d497d26 -//.word 0x108e8f8f -//.word 0x3c1cf379 -//.word 0x76bf55b4 -//.word 0xe4591fce -//.word 0x6c8493d6 -//.word 0x6c781765 -//.word 0xac30cfe0 -//.word 0x91c871f7 -//.word 0x932a5571 -//.word 0xf0e9cc2c -//.word 0xa26db35f -//.word 0x8f514823 -//.word 0x01093c32 -//.word 0x55c809ee -//.word 0xf7a085a5 -//.word 0x8eecb713 -//.word 0x73ebea28 -//.word 0x68ad010c -//.word 0x87330a61 -//.word 0x78d216c8 -//.word 0xe7d847a6 -//.word 0x35722a28 -//.word 0x6ecd4784 -//.word 0x7c7cf782 -//.word 0x9a1a763c -//.word 0x0b303921 -//.word 0x0b588240 -//.word 0x06a331c4 -//.word 0x0839ddba -//.word 0x753f231b -//.word 0xfafe3e06 -//.word 0xc341d84d -//.word 0xeefe2033 -//.word 0x40391d74 -//.word 0x17264286 -//.word 0xa08e421f -//.word 0x4a7326f7 -//.word 0x7bf79ccf -//.word 0x817a92b2 -//.word 0xcb03037b -//.word 0x59e11197 -//.word 0x7192550c -//.word 0x94e373ba -//.word 0xb059f1e1 -//.word 0x97d049e4 -//.word 0xb0623c4d -//.word 0xec8a6a10 -//.word 0xfc892014 -//.word 0xc20971ef -//.word 0x050188f2 -//.word 0x68d83c65 -//.word 0x9dcde513 -//.word 0xd6966e0a -//.word 0x7c47ac9c -//.word 0x2476eea9 -//.word 0xbf9dd621 -//.word 0x10bf67c4 -//.word 0x644f5e2c -//.word 0x7d4dc60e -//.word 0xcfb2c7bd -//.word 0xef0ebfef -//.word 0x487094c4 -//.word 0x10864804 -//.word 0x7a05cda8 -//.word 0x2d4b1b9d -//.word 0xf64481c4 -//.word 0xb98a383d -//.word 0xaed03ee5 -//.word 0xc980611d -//.word 0x7aa39ace -//.word 0x97029daa -//.word 0x978aaeb4 -//.word 0x00f5b602 -//.word 0x22a796c1 -//.word 0x06d6bb7b -//.word 0xa2eef395 -//.word 0x4e347f1c -//.word 0x7ca969c1 -//.word 0xa3311821 -//.word 0x7cf4214a -//.word 0x7105607b -//.word 0x5342482c -//.word 0x4b7b774e -//.word 0x13d68dd4 -//.word 0x65713f72 -//.word 0xb44aa7a5 -//.word 0x1b5cdef3 -//.word 0x930bcd74 -//.word 0x68c24091 -//.word 0xeedb3c0c -//.word 0x70bf9341 -//.word 0x694eb5ab -//.word 0xf681c9a9 -//.word 0x8c4dfd82 -//.word 0xe6cb1aa7 -//.word 0x42975b39 -//.word 0xcd767fcb -//.word 0x5c3b1d69 -//.word 0x5ceb38d9 -//.word 0x0c1f1320 -//.word 0xeaaa4649 -//.word 0x6a7c1261 -//.word 0xeec6f2c6 -//.word 0xf35f72a2 -//.word 0x886744b2 -//.word 0x052a914c -//.word 0xf9468da0 -//.word 0x64114e3e -//.word 0x2735ded8 -//.word 0xb89d8f49 -//.word 0x1a958ed7 -//.word 0x0d2cbbb5 -//.word 0x82ddb8cc -//.word 0x516f40bc -//.word 0x2e1abb1d -//.word 0xdaeb0f0a -//.word 0x966ab8e0 -//.word 0xdd791b43 -//.word 0x527f1762 -//.word 0xf8c6de7c -//.word 0xa12203a4 -//.word 0xa9d4d4c1 -//.word 0xe3ade9d8 -//.word 0xd477fd8e -//.word 0x1f90fde8 -//.word 0x41d85f56 -//.word 0x7ecdb5f0 -//.word 0x1bf582ff -//.word 0xce7d4cbf -//.word 0x731ff263 -//.word 0x0049405a -//.word 0xbb7bc1d1 -//.word 0xabf0d479 -//.word 0x4c82028a -//.word 0x87c88f08 -//.word 0xe0814f45 -//.word 0xf235bba7 -//.word 0x181944ab -//.word 0x6e34e82a -//.word 0xf8c002db -//.word 0x20d3661a -//.word 0x663eade7 -//.word 0x53b5ce32 -//.word 0xae31ef56 -//.word 0xf3937ae3 -//.word 0x018a72a0 -//.word 0x13b608d0 -//.word 0xf10e69b5 -//.word 0x687fdb53 -//.word 0xf7d50876 -//.word 0xcbdf99f6 -//.word 0xeece073a -//.word 0xbbdfaefb -//.word 0x953a244a -//.word 0xd819c8d5 -//.word 0x102c9e66 -//.word 0x693d5aac -//.word 0x6710ba3e -//.word 0xd78d19dd -//.word 0x062042f9 -//.word 0x30618277 -//.word 0x3bf001b2 -//.word 0xa5a351c0 -//.word 0xbce448f6 -//.word 0x0d540bae -//.word 0x1eb56c47 -//.word 0x6006766e -//.word 0x5fef459c -//.word 0x3c601ce0 -//.word 0x5d76b1df -//.word 0x639ecb19 -//.word 0x5cfc0f6e -//.word 0x3a0e17e0 -//.word 0x858cc59a -//.word 0x4c93d732 -//.word 0x6103bb2b -//.word 0xc626a4be -//.word 0x6292ddd9 -//.word 0xf8505e69 -//.word 0x5a3d9dd5 -//.word 0xdab1a6ca -//.word 0x025f6e3e -//.word 0x857c64af -//.word 0x74244aac -//.word 0xb5f94397 -//.word 0xb20d2da9 -//.word 0x4e023036 -//.word 0x1d6f9733 -//.word 0xd486dff5 -//.word 0xfef40e3b -//.word 0xf109476f -//.word 0x01199a29 -//.word 0xf32220f5 -//.word 0xb5ae4856 -//.word 0x4cfb6c0b -//.word 0x0d5aa890 -//.word 0x10d5ebe8 -//.word 0xe2144e9a -//.word 0x7a82a5fa -//.word 0x6eab54a9 -//.word 0x67e8655f -//.word 0xd33fd7e8 -//.word 0xd985386d -//.word 0x92c576f5 -//.word 0x76e6f22b -//.word 0x1487d662 -//.word 0x072ea9d6 -//.word 0x25a22035 -//.word 0xf995375e -//.word 0x74868168 -//.word 0xdfe6bce6 -//.word 0x147aa969 -//.word 0xee001b47 -//.word 0xfe154d9b -//.word 0x7f56788d -//.word 0x8cc6a5d4 -//.word 0x9170c079 -//.word 0x004defdd -//.word 0x456722fd -//.word 0xfb3feaf5 -//.word 0x606c8ec3 -//.word 0x06865c4e -//.word 0xcc423da7 -//.word 0x0dde8c8e -//.word 0x17c02838 -//.word 0xdf5ac84f -//.word 0xf3508f3b -//.word 0xafdde1a0 -//.word 0xb4737427 -//.word 0x96a1aa82 -//.word 0xd53a1eaa -//.word 0x0fb47c6b -//.word 0x73ce9723 -//.word 0x7975b5c7 -//.word 0xd0e92d26 -//.word 0x981c3572 -//.word 0xd25bf5fc -//.word 0x152fe03f -//.word 0x82864320 -//.word 0xfa0e1e74 -//.word 0x8ee234c3 -//.word 0x36685e4b -//.word 0xc6792448 -//.word 0x1fc38e73 -//.word 0xa26c38c9 -//.word 0xebf8a58d -//.word 0xbb6dd590 -//.word 0x35b51ab0 -//.word 0x4e43279f -//.word 0x7ffa6ae6 -//.word 0xbc4a9c29 -//.word 0xaa9c96ac -//.word 0x0df06616 -//.word 0x7fc4a275 -//.word 0x6838fc83 -//.word 0x2a711728 -//.word 0x9c3b993f -//.word 0xbaf2829d -//.word 0x9ba2bc4f -//.word 0xa36df224 -//.word 0xf92da66c -//.word 0x3b5b7efe -//.word 0x7130df80 -//.word 0x4009bde2 -//.word 0x6110b22c -//.word 0x51194d7a -//.word 0x49caac44 -//.word 0x70ff4de3 -//.word 0x506c2151 -//.word 0x8685e231 -//.word 0xbe9aa70f -//.word 0xdf47b6e8 -//.word 0x830b99ed -//.word 0xaa377484 -//.word 0xaf0a9590 -//.word 0x7b1a4df2 -//.word 0xf8f5fe50 -//.word 0xc8097614 -//.word 0x38c17bb8 -//.word 0x6ff1a742 -//.word 0xec74770a -//.word 0x2f149ec3 -//.word 0xb5a99fb9 -//.word 0x2a859a58 -//.word 0xdb1066ee -//.word 0x6ab0e1b2 -//.word 0xc5ec8404 -//.word 0x58d03bf6 -//.word 0x8293730c -//.word 0x46777440 -//.word 0x44f1f149 -//.word 0xe70add1d -//.word 0xdf0581b5 -//.word 0xd242cc10 -//.word 0x4e62ea7a -//.word 0x03ac180e -//.word 0x2fafb67a -//.word 0x59299d02 -//.word 0x4228b4c8 -//.word 0x196fbe4a -//.word 0xee1b762c -//.word 0x6987de38 -//.word 0xbc6cd4a3 -//.word 0xd64de691 -//.word 0xd91267dc -//.word 0xcff3c211 -//.word 0x99970fbc -//.word 0x277de4e6 -//.word 0xef9c6edb -//.word 0x9746c031 -//.word 0xf5526a05 -//.word 0x3a7a4e88 -//.word 0x6a02afbb -//.word 0x109b8b76 -//.word 0x2f862baf -//.word 0x7bfcf8f9 -//.word 0xc9ce904b -//.word 0xc5491903 -//.word 0xe35cd62a -//.word 0x98fdf7fa -//.word 0xc9c8b69d -//.word 0x84e99f38 -//.word 0xee3d2f28 -//.word 0x7cb4a18c -//.word 0x66fa0503 -//.word 0x595692b7 -//.word 0x6dd23d9a -//.word 0x569c8bef -//.word 0xdeaca30d -//.word 0x93a7a75f -//.word 0xbc0344b0 -//.word 0x926d88a5 -//.word 0xad67f48b -//.word 0xbd36d353 -//.word 0x7afbcadb -//.word 0xde20af70 -//.word 0x91f59e90 -//.word 0xa59b4af4 -//.word 0x832292ce -//.word 0x25ee554f -//.word 0x865f866c -//.word 0x57b183e2 -//.word 0xf420a277 -//.word 0x96500d83 -//.word 0xcaedd1b0 -//.word 0x228e31fe -//.word 0x2ae0400a -//.word 0x9d00af8f -//.word 0xd928e32d -//.word 0x918e4a69 -//.word 0xc289f0f6 -//.word 0xe8f64d33 -//.word 0x71da62f4 -//.word 0x72490485 -//.word 0x998677ec -//.word 0x636b3e6f -//.word 0x8e0b3256 -//.word 0xd297d2f2 -//.word 0xcc7edade -//.word 0x3bd81785 -//.word 0x6e0579e4 -//.word 0xfd916a92 -//.word 0xb85b5efd -//.word 0xddf7abf6 -//.word 0x8e509c70 -//.word 0x8192c084 -//.word 0xfa4788b9 -//.word 0xf6c01183 -//.word 0xa9b63f09 -//.word 0x2b310b2b -//.word 0x6fa91ec4 -//.word 0x746b9e2c -//.word 0xbf3f4802 -//.word 0x0848bf28 -//.word 0x342b230e -//.word 0x8374e634 -//.word 0x0b35dbea -//.word 0x65ef905b -//.word 0xa6b6dec9 -//.word 0x9091be1a -//.word 0x0a205e94 -//.word 0xce8175e5 -//.word 0x6273d366 -//.word 0x49bc3ca0 -//.word 0x7ac97610 -//.word 0x1195a127 -//.word 0x45ccc795 -//.word 0x9a2fb4c7 -//.word 0x573a08ae -//.word 0x3b048ac3 -//.word 0x6c68bf48 -//.word 0xb062bcd0 -//.word 0xdfbb3801 -//.word 0x99e9e599 -//.word 0x343101af -//.word 0xf80e273c -//.word 0x8fd66cd9 -//.word 0xb79ba7ca -//.word 0x3a4f103c -//.word 0x202c0dcb -//.word 0x23534847 -//.word 0x63b405b8 -//.word 0x5b2db39f -//.word 0x14f6c07f -//.word 0x983cb29c -//.word 0xaa0c7403 -//.word 0xb473edca -//.word 0x01e4d799 -//.word 0x2cd9cf6a -//.word 0xd9bda88c -//.word 0xa20a05ee -//.word 0x55af279a -//.word 0x5cb40380 -//.word 0x7c209875 -//.word 0xc31b7f7b -//.word 0xbb50c443 -//.word 0xe495f4f0 -//.word 0x61ce771e -//.word 0xf20e2023 -//.word 0x22000394 -//.word 0xc286870c -//.word 0x959fbc28 -//.word 0x4d8eeed6 -//.word 0xb6397ad0 -//.word 0x32cfe063 -//.word 0x65ad1a75 -//.word 0x31832cc6 -//.word 0xe5b2fd76 -//.word 0xb1f965c8 -//.word 0x5e518725 -//.word 0x3b156164 -//.word 0x5b66a148 -//.word 0xfdceba4a -//.word 0x4c233899 -//.word 0x49af5060 -//.word 0x058dbc47 -//.word 0x1356c63c -//.word 0x3dfea273 -//.word 0x76f800ab -//.word 0x10a1e2b4 -//.word 0x2fdbab2e -//.word 0x7ef87993 -//.word 0x20dbb578 -//.word 0xea59e90f -//.word 0xcfe5d1f1 -//.word 0x9b6db41a -//.word 0xe57ff435 -//.word 0x3eb0e51b -//.word 0xaf3edb96 -//.word 0x63f4876a -//.word 0xa04e8396 -//.word 0xfcde2bd7 -//.word 0xcdeeaf6e -//.word 0xe1676623 -//.word 0x6ff2658a -//.word 0x4e5c5185 -//.word 0x653f710a -//.word 0x63df0726 -//.word 0xb052e142 -//.word 0xa3e42ba6 -//.word 0xf5b9873b -//.word 0x75b46095 -//.word 0xfe987a30 -//.word 0xa66dcefa -//.word 0x39269612 -//.word 0xe680a4d0 -//.word 0x372df705 -//.word 0x47329084 -//.word 0x2f8e82e1 -//.word 0xc11c4978 -//.word 0x79ba5cb1 -//.word 0xb0ab0683 -//.word 0x133a7137 -//.word 0x54a0046f -//.word 0x1f28ee66 -//.word 0x50910379 -//.word 0x63b4c8e7 -//.word 0x2b67c9d5 -//.word 0xc7a03395 -//.word 0xd3de9e27 -//.word 0xdbc42b00 -//.word 0x1507cf0b -//.word 0x4f8beeee -//.word 0x26c92c8e -//.word 0x797480d5 -//.word 0x1d5c8ab3 -//.word 0xd2922662 -//.word 0x76cd41ef -//.word 0x790cebf6 -//.word 0x917daead -//.word 0xaf9e1e23 -//.word 0x31a2b2ca -//.word 0x5916d234 -//.word 0xfec4311a -//.word 0x81d85da2 -//.word 0x034195e1 -//.word 0xd55ada9f -//.word 0x30ca485b -//.word 0x27a9a78f -//.word 0xd9e43e36 -//.word 0xebe2e78a -//.word 0x36676912 -//.word 0xbcb901dc -//.word 0xe1024208 -//.word 0xd8f62086 -//.word 0x5bb5471f -//.word 0x9ff3b1ba -//.word 0x875677d8 -//.word 0x181fe762 -//.word 0x2d0dd8a4 -//.word 0x6b7e3a99 -//.word 0x78d8f169 -//.word 0x6827e430 -//.word 0x78085001 -//.word 0xffc5632b -//.word 0xa1c106ba -//.word 0xc617fa41 -//.word 0x4a7e26d7 -//.word 0x77702f60 -//.word 0x308b4a0e -//.word 0x6e374e27 -//.word 0xf1890e08 -//.word 0x2f67e56a -//.word 0x91ed92e4 -//.word 0xde1046b1 -//.word 0xf781fcb4 -//.word 0xc6d409b9 -//.word 0x71e2f4fe -//.word 0xd36c87f2 -//.word 0x2c01263c -//.word 0x172160ff -//.word 0xbda2c45c -//.word 0x4953f639 -//.word 0x9ce00241 -//.word 0x41f5ef2c -//.word 0xa3a69841 -//.word 0x7d0fb719 -//.word 0x933743a5 -//.word 0xa03bfc73 -//.word 0x8fa8442c -//.word 0xed283062 -//.word 0x9f61df88 -//.word 0xd01a0a42 -//.word 0x2e9fdde0 -//.word 0x56670524 -//.word 0x8cf50b4c -//.word 0xb0fce04c -//.word 0x6dc6b95c -//.word 0xb4d61cb2 -//.word 0x69cd3b91 -//.word 0x5c8a8282 -//.word 0x7a956ce2 -//.word 0x45be9a9c -//.word 0x81012638 -//.word 0x30ad3515 -//.word 0xc1c6cbf2 -//.word 0x85a7e4b3 -//.word 0x62ebc062 -//.word 0xcb8e7e75 -//.word 0xef50ec4f -//.word 0x315a9e09 -//.word 0xd9243d71 -//.word 0x09962253 -//.word 0xf26e23f8 -//.word 0x47e1aded -//.word 0xf2851405 -//.word 0x076e26a1 -//.word 0xf697062f -//.word 0x048438f1 -//.word 0xfc26f800 -//.word 0x21ffd090 -//.word 0x68876975 -//.word 0xe4cda2e7 -//.word 0x8261df82 -//.word 0xf672a390 -//.word 0xf534628b -//.word 0xa58490de -//.word 0x52cffeec -//.word 0x62306653 -//.word 0x8bd84572 -//.word 0x43b3e829 -//.word 0x7849cadf -//.word 0x82e21dca -//.word 0x56eda76a -//.word 0xfca2cf57 -//.word 0x43e7f83d -//.word 0xb3700d25 -//.word 0xc32b5df6 -//.word 0x4cdbaa3b -//.word 0x3e027c26 -//.word 0x9205bbd5 -//.word 0x7f8b7dd5 -//.word 0xf1261de5 -//.word 0x37358dfc -//.word 0xfb09ed8d -//.word 0x78465c09 -//.word 0xe78c0ea6 -//.word 0x3a579e5f -//.word 0x0d24a63b -//.word 0xdad68ed3 -//.word 0x6c57a10e -//.word 0x96826630 -//.word 0x24412d13 -//.word 0x12f2e8b3 -//.word 0xfc103cf1 -//.word 0xd60fd890 -//.word 0xdd870684 -//.word 0xcd957f6c -//.word 0x557f845d -//.word 0xc8962ae1 -//.word 0x1561f63f -//.word 0xf9f7a9fd -//.word 0x73ad5da4 -//.word 0x79f1d1c3 -//.word 0xe9760236 -//.word 0xc292fba8 -//.word 0x94e4ed57 -//.word 0x35398217 -//.word 0xb6b06f9a -//.word 0x951d49ee -//.word 0x34ac9947 -//.word 0x8ac732ff -//.word 0x1939c2db -//.word 0x2093a890 -//.word 0x11ce0586 -//.word 0x453316db -//.word 0xef78c1ab -//.word 0x4f2c6d8f -//.word 0x28551763 -//.word 0x7357a24d -//.word 0x55176ffa -//.word 0x4f612e2b -//.word 0xb587f471 -//.word 0x614b8d34 -//.word 0xa8ff13fa -//.word 0x8debbfe6 -//.word 0x35ef007f -//.word 0x9b6acab4 -//.word 0x855a311c -//.word 0xb7c43682 -//.word 0x6656e1a0 -//.word 0xef4b902b -//.word 0xc98f8e10 -//.word 0xb823e7fe -//.word 0x44c47b24 -//.word 0x6ac7523c -//.word 0x91482fc8 -//.word 0xc083689b -//.word 0x0d82f49c -//.word 0x59f9c6c7 -//.word 0x3a6e5974 -//.word 0x399c8ddc -//.word 0x3e1ab1d9 -//.word 0x4838e1ed -//.word 0x612a9286 -//.word 0xd2686b80 -//.word 0x935457ec -//.word 0x051dd810 -//.word 0xe3e49eae -//.word 0x761e588a -//.word 0x093aca26 -//.word 0x9d831fd0 -//.word 0xde4781de -//.word 0x5539e839 -//.word 0xde142f18 -//.word 0x5d816d0e -//.word 0xad3b8247 -//.word 0xd971f00f -//.word 0x8f6ced93 -//.word 0xd171b6ec -//.word 0xeee92559 -//.word 0xb1bf86cc -//.word 0xd80aa7a9 -//.word 0xc7ec2eca -//.word 0x7eb92fc6 -//.word 0xc95cfe73 -//.word 0xb6f742a9 -//.word 0x4cca4b49 -//.word 0x7a56a67e -//.word 0x4ec2ee43 -//.word 0x687de426 -//.word 0xad25c24b -//.word 0x40a8cdb3 -//.word 0xaea92abe -//.word 0x6825f2ef -//.word 0x775689f0 -//.word 0x6bd72bd6 -//.word 0x940ac7a5 -//.word 0x75b71117 -//.word 0x76f5d399 -//.word 0xd94e8397 -//.word 0xef1e1bf9 -//.word 0x8c3c25ee -//.word 0xb8dc15e8 -//.word 0xa7b4dce8 -//.word 0xec5ebafb -//.word 0xe9fe5404 -//.word 0x8a2406bd -//.word 0x33f47af9 -//.word 0xf6847a2c -//.word 0x0a85022c -//.word 0x78269a39 -//.word 0x1835e23c -//.word 0xbc876f4c -//.word 0xab9bd576 -//.word 0x517a05be -//.word 0x34e1da61 -//.word 0x2aa2ee5d -//.word 0xca48b233 -//.word 0x20fabeec -//.word 0xa5a2655a -//.word 0x6d4e8da0 -//.word 0xa3d6bdf5 -//.word 0x33bf78a4 -//.word 0xc65fca57 -//.word 0xf3422096 -//.word 0xb3cd5d8b -//.word 0x16212908 -//.word 0x35428ccb -//.word 0x6879bd00 -//.word 0xb9f63407 -//.word 0x98ba0678 -//.word 0xd0b47264 -//.word 0xb92ab7de -//.word 0xaf5b29ba -//.word 0xc4638495 -//.word 0xb25e8016 -//.word 0x14d0a672 -//.word 0xd5456136 -//.word 0xe8345841 -//.word 0x3929fb0f -//.word 0xe4235c3e -//.word 0xa63b414a -//.word 0x9087779c -//.word 0x033e69c3 -//.word 0xd81df101 -//.word 0xdf096d09 -//.word 0x8bf51607 -//.word 0xeb068de1 -//.word 0xdcf5b7bc -//.word 0x7eb6cbc3 -//.word 0xe457a923 -//.word 0x102a6e5a -//.word 0x1e2645b2 -//.word 0xbf8b8008 -//.word 0xe9c5e7d2 -//.word 0xcd934f61 -//.word 0x0a686f63 -//.word 0x2012f0ab -//.word 0x2799c335 -//.word 0xc16ab764 -//.word 0x4db44b8f -//.word 0x5d13c0bc -//.word 0x6a6c73ab -//.word 0xc7186a17 -//.word 0xd4442d38 -//.word 0x7497d78c -//.word 0xc1166cd7 -//.word 0xfe456d69 -//.word 0xcc8faa9f -//.word 0xa1e858ac -//.word 0x77b16399 -//.word 0xc1dc068b -//.word 0xa3509845 -//.word 0x628fa9ed -//.word 0x1a964d13 -//.word 0xaf05b8ef -//.word 0x057f0bea -//.word 0x74546e61 -//.word 0x765d5fa5 -//.word 0xa3284946 -//.word 0xe0555991 -//.word 0xd3408d57 -//.word 0x9ae10ef0 -//.word 0xbcf0bf80 -//.word 0x5f4c1679 -//.word 0xbc9d2b61 -//.word 0xd1380ed6 -//.word 0x55445ecf -//.word 0xf11b1724 -//.word 0xadf3ac51 -//.word 0xa9be5677 -//.word 0x0d4faba3 -//.word 0x42bd7253 -//.word 0x630cb636 -//.word 0xee0a1934 -//.word 0xc0786bae -//.word 0x406a7b07 -//.word 0xdaf12d63 -//.word 0xaff6cdae -//.word 0x8a69a3e1 -//.word 0x169cc880 -//.word 0x4fe93867 -//.word 0x379b27c7 -//.word 0xca0c996c -//.word 0x330a2d41 -//.word 0x407f3915 -//.word 0x14511c9f -//.word 0x1c88d0c0 -//.word 0x44afbf09 -//.word 0x6a7cd87d -//.word 0x12b3e198 -//.word 0x5c470f90 -//.word 0x34c2d4da -//.word 0xc9e8f8f0 -//.word 0x4097eb52 -//.word 0xa9f25aca -//.word 0x32bf00f5 -//.word 0x9a0cbfff -//.word 0xe919efae -//.word 0x5f72f6a2 -//.word 0xaa5c18db -//.word 0x5c72917b -//.word 0x9b90e1cd -//.word 0x1af06887 -//.word 0x4993324c -//.word 0xc9e31475 -//.word 0x2396f811 -//.word 0xb9d5752a -//.word 0xfd9ea34b -//.word 0xe0672d3e -//.word 0x8e04a71a -//.word 0x58ca227e -//.word 0xf1f5fe17 -//.word 0xde470068 -//.word 0x28f2a4ca -//.word 0x54b8b5b1 -//.word 0x94511a32 -//.word 0x3f0df3c2 -//.word 0x7fbae541 -//.word 0x4ac8b137 -//.word 0x93ab0c5d -//.word 0xc181ab5f -//.word 0x60f59de0 -//.word 0x1663ddbe -//.word 0xd93d2898 -//.word 0x60ad0c8e -//.word 0xd77b4248 -//.word 0xd7323d3a -//.word 0x957e0326 -//.word 0x5ad93ce2 -//.word 0x3366885b -//.word 0xe91d16da -//.word 0x33297386 -//.word 0x2b8e9f2b -//.word 0xff0f6639 -//.word 0xe94fed10 -//.word 0x61368c7a -//.word 0x9196db79 -//.word 0x090f1044 -//.word 0xb430888c -//.word 0x0adea303 -//.word 0x88fad51f -//.word 0x5d3efa1b -//.word 0x6768ea40 -//.word 0x5d9b4e62 -//.word 0x4e02b2ad -//.word 0x4ab6dba2 -//.word 0x5fe25a5c -//.word 0xc7256118 -//.word 0x5f37d6f4 -//.word 0x5bd0a6f7 -//.word 0x38c55c52 -//.word 0xf374f2e5 -//.word 0x7963e605 -//.word 0x5e24917d -//.word 0xd17cb5d2 -//.word 0xd0c455cc -//.word 0x988ec931 -//.word 0x608c11d4 -//.word 0x46ae6ace -//.word 0x8a8b1f0c -//.word 0xfa02a20a -//.word 0xad21dbdd -//.word 0xf445c077 -//.word 0x8e832627 -//.word 0x1b47d65f -//.word 0xd33be4ba -//.word 0x786b3c3d -//.word 0x89a67ede -//.word 0xb9270c42 -//.word 0xa07561cb -//.word 0xaf87a4d2 -//.word 0x692c7c31 -//.word 0xd0aa2705 -//.word 0x1ea5c6b2 -//.word 0xb643fb27 -//.word 0x5a8eb663 -//.word 0x9e1a4c37 -//.word 0x9de7ca4e -//.word 0xea88886c -//.word 0xca8501f3 -//.word 0xa0ffe1ab -//.word 0xa89260c2 -//.word 0xe880cf12 -//.word 0x640b70a3 -//.word 0x92228b71 -//.word 0x0d40be6f -//.word 0x8d9295cb -//.word 0x17585b74 -//.word 0x718d2fda -//.word 0xd9ca5af5 -//.word 0xf668df88 -//.word 0x0fe554a7 -//.word 0x7b88f177 -//.word 0x5948e735 -//.word 0x81ebf279 -//.word 0xba6b32bc -//.word 0x2d9d3718 -//.word 0x19145b50 -//.word 0xc9445410 -//.word 0xc3e30976 -//.word 0x4395a5d0 -//.word 0xe7c7eaa8 -//.word 0xacdbc9fe -//.word 0x19862fd4 -//.word 0xba7721f0 -//.word 0xd03a0bdd -//.word 0x475b5533 -//.word 0xe8ce3818 -//.word 0xd08ed007 -//.word 0x218572d0 -//.word 0xf7ac3fe0 -//.word 0x9e73f9c3 -//.word 0x026316e7 -//.word 0x660213a3 -//.word 0x59f70b77 -//.word 0xe66e8896 -//.word 0x0cbe99a1 -//.word 0x6e4925b6 -//.word 0x4aa47ea9 -//.word 0xaff93991 -//.word 0xeba93e87 -//.word 0x43351baa -//.word 0xe85e9e67 -//.word 0x268ba2f7 -//.word 0xdd6c2928 -//.word 0x35ddab61 -//.word 0x8e0daee0 -//.word 0xb6df9747 -//.word 0x5f90c057 -//.word 0xd09bcafb -//.word 0xdad93588 -//.word 0x0eed2d43 -//.word 0x2ddfa724 -//.word 0xe007add9 -//.word 0xa92df60e -//.word 0x1aeebaec -//.word 0x4561c4df -//.word 0x73fbc99d -//.word 0x19b0f864 -//.word 0x075bd282 -//.word 0xe3603c1b -//.word 0xd690d327 -//.word 0x854d7fba -//.word 0x43ee4b88 -//.word 0x846574a8 -//.word 0x951ebf98 -//.word 0x8b2b1082 -//.word 0x7a9f39bd -//.word 0xe7371097 -//.word 0x7f40c452 -//.word 0x09b4716c -//.word 0x99a7f124 -//.word 0x06e1f639 -//.word 0x9fcd55f5 -//.word 0x1a92a56a -//.word 0xcd7f09fc -//.word 0x21ac4a1f -//.word 0x43de2962 -//.word 0x1cacf3ad -//.word 0x84e055c6 -//.word 0xb220721a -//.word 0xf7ce33bb -//.word 0xad2cdea5 -//.word 0x6ac4eb45 -//.word 0x7907133c -//.word 0x8a34a960 -//.word 0xa87b2d03 -//.word 0x6c631f79 -//.word 0x706911d4 -//.word 0x07e900f2 -//.word 0x2b42e4ba -//.word 0xb73686a2 -//.word 0xd78f9274 -//.word 0xbc08ed53 -//.word 0x946a48f9 -//.word 0xb9f6f642 -//.word 0x2803faee -//.word 0x36e865a2 -//.word 0x7e1cdf31 -//.word 0x1e9c831a -//.word 0x238df052 -//.word 0x41239c43 -//.word 0xc8c16c14 -//.word 0xd362822b -//.word 0xc23757f0 -//.word 0xeb9109d4 -//.word 0x8d02f693 -//.word 0x05bf89b5 -//.word 0x4549545b -//.word 0x814d5f38 -//.word 0x2bc8c0de -//.word 0x226e6c3b -//.word 0x274d4d63 -//.word 0x90ae9590 -//.word 0x403c5166 -//.word 0xd668417c -//.word 0x250be719 -//.word 0xe54dde3b -//.word 0xa7c76dde -//.word 0x0fe45c7a -//.word 0x3d8d06ce -//.word 0x8c05b0dc -//.word 0x7f111935 -//.word 0xf85d5276 -//.word 0xab1bd013 -//.word 0xd3edc053 -//.word 0x23059a9c -//.word 0x008af9f1 -//.word 0xed3eaab9 -//.word 0x475f03c2 -//.word 0x32cb7685 -//.word 0xd36766ac -//.word 0xc0c038d1 -//.word 0xb4f3ae89 -//.word 0x88cb70a1 -//.word 0x5e2aeca7 -//.word 0x20aa60ac -//.word 0x29833549 -//.word 0x41b08fe0 -//.word 0xcf4d2224 -//.word 0x4a4447dc -//.word 0xf1284fe4 -//.word 0xbc611774 -//.word 0x928adca4 -//.word 0xbc175130 -//.word 0x9a3bef79 -//.word 0x94098dcd -//.word 0x54d930e8 -//.word 0x32ed24bb -//.word 0xf0544c6c -//.word 0xa80fb69d -//.word 0x027372f1 -//.word 0xaacea5cc -//.word 0x024dd95b -//.word 0x141d97d5 -//.word 0xcad13800 -//.word 0x6104f8f6 -//.word 0x1b3f4c29 -//.word 0x341d76a5 -//.word 0x18ac5695 -//.word 0xd3178309 -//.word 0xc9829af6 -//.word 0xa736d67e -//.word 0x99fee172 -//.word 0xbed0ea16 -//.word 0xd9b0f824 -//.word 0x49d27e13 -//.word 0x3bff2f98 -//.word 0x1e39136e -//.word 0x57a2db53 -//.word 0x369a7253 -//.word 0x2928d448 -//.word 0x309b23a2 -//.word 0x9171f864 -//.word 0xcd77f76f -//.word 0xd232a603 -//.word 0x727e7f83 -//.word 0x14754378 -//.word 0xaa9292d9 -//.word 0xe316b98a -//.word 0xa1abcb22 -//.word 0xad48f3f1 -//.word 0xaa540842 -//.word 0x470e62dd -//.word 0xb92cecd0 -//.word 0x69c27b6f -//.word 0xe9665e9a -//.word 0x2d92373e -//.word 0xf84a091e -//.word 0x94fe91d4 -//.word 0xc6b1da12 -//.word 0x015b0c2e -//.word 0xda8c84de -//.word 0xbc532a40 -//.word 0xdd5eff1d -//.word 0x7062f66e -//.word 0x1dbe051f -//.word 0xae5b7b14 -//.word 0x0bd6946a -//.word 0x68e14bff -//.word 0xbde66f34 -//.word 0x76eef9f1 -//.word 0x6cc29dea -//.word 0x154f9f21 -//.word 0xf74fe8ac -//.word 0x632659b9 -//.word 0x5f0a5fcf -//.word 0xe467c857 -//.word 0x4a82d55a -//.word 0x005c908c -//.word 0x80d95f8a -//.word 0x8221da60 -//.word 0x7047da4e -//.word 0x1b29d2cc -//.word 0xac9763cb -//.word 0xddb72a3e -//.word 0x69a7ddd9 -//.word 0xc0659618 -//.word 0x00ec6e84 -//.word 0x21a04e32 -//.word 0x6fec028c -//.word 0x3e2a8f53 -//.word 0xd9c3c7e5 -//.word 0xbb971abc -//.word 0x029faf38 -//.word 0x20d0b49e -//.word 0xd443f260 -//.word 0x5994a49f -//.word 0xdd8889ee -//.word 0x34f23859 -//.word 0xced7b4a6 -//.word 0xe6d040da -//.word 0xfdb074ff -//.word 0x87679125 -//.word 0xe42612a7 -//.word 0x91c483af -//.word 0xa06196fc -//.word 0x654974e3 -//.word 0x731a5194 -//.word 0xc72a439f -//.word 0x422354b7 -//.word 0x5df0d6b5 -//.word 0x18ddf6e0 -//.word 0x33f9946b -//.word 0xa1bf523f -//.word 0x3af6ebfb -//.word 0xb0d6c739 -//.word 0xc46ccc14 -//.word 0xb94076e7 -//.word 0x09342a56 -//.word 0x58afc793 -//.word 0xa6fb7fda -//.word 0xc8ece53e -//.word 0x19c346a8 -//.word 0x6d513d1d -//.word 0x4660823f -//.word 0x4b4e0317 -//.word 0xf5fb3611 -//.word 0x8ce6ad48 -//.word 0x5292eb04 -//.word 0xfe2f7681 -//.word 0x6b762df3 -//.word 0x92d5dcc6 -//.word 0xb6cc0e2a -//.word 0xde9722cf -//.word 0x880da1ed -//.word 0x9cc8cf88 -//.word 0x9f8680f2 -//.word 0x29cf2d91 -//.word 0x99d847e2 -//.word 0x07a8cbbe -//.word 0x7a7917dd -//.word 0x5b61fc98 -//.word 0x2a3114f3 -//.word 0x709e56da -//.word 0xf59ee7ab -//.word 0x321533f5 -//.word 0x09b13d80 -//.word 0xb412338d -//.word 0xfc2f465e -//.word 0xabf5b9f9 -//.word 0x4331372a -//.word 0xf0af69c7 -//.word 0xbca3c837 -//.word 0x0249b035 -//.word 0x25c9b6d2 -//.word 0x815d3cb9 -//.word 0xa2b543b7 -//.word 0xb49b807b -//.word 0x3bd3b19a -//.word 0x054531d6 -//.word 0x5c5eca9f -//.word 0x80b3cbda -//.word 0x54e75be2 -//.word 0x57cf0dcc -//.word 0xd6d5b5f0 -//.word 0x609a79a4 -//.word 0x7be02b4b -//.word 0x95a6d68f -//.word 0x3d9496ea -//.word 0x939aad6b -//.word 0xfdd5d4b7 -//.word 0x1cb2cf4e -//.word 0xff55440f -//.word 0x963ccdff -//.word 0x691f4c46 -//.word 0x891b7f7a -//.word 0xc710d420 -//.word 0x25487e70 -//.word 0x8a59c859 -//.word 0xba4ca9c5 -//.word 0x84fe991e -//.word 0x3ec7a411 -//.word 0x6e5abd92 -//.word 0xcaec5420 -//.word 0x63992b4a -//.word 0x1d036572 -//.word 0x623ce0d1 -//.word 0x17e6c4bb -//.word 0xcf985c24 -//.word 0x3f842564 -//.word 0xf3572537 -//.word 0x3f617e08 -//.word 0x77f6436f -//.word 0x62148af8 -//.word 0xed45c326 -//.word 0x1dc748b7 -//.word 0x47eb352a -//.word 0x83bb797f -//.word 0x5edf2d3e -//.word 0xcfc225ba -//.word 0x6df0c597 -//.word 0xdec3168a -//.word 0x933e1960 -//.word 0xb2395c42 -//.word 0x54beca37 -//.word 0xf1b4c7ea -//.word 0x18ba7dae -//.word 0x645670bf -//.word 0xab4f59ca -//.word 0x785731b0 -//.word 0xbced8c88 -//.word 0xc08228e3 -//.word 0x5edbc653 -//.word 0x71b6382e -//.word 0x8ab0bc8f -//.word 0xe566889e -//.word 0x9bdba611 -//.word 0x181a02f3 -//.word 0xd01cc2a4 -//.word 0x2eebd522 -//.word 0xcd08cf86 -//.word 0xeb0af4d2 -//.word 0x1b8992e9 -//.word 0x393a95df -//.word 0xa35b5573 -//.word 0xa652b2da -//.word 0x379163bf -//.word 0xe4bc8b87 -//.word 0x0a0e8dd9 -//.word 0x47f9225e -//.word 0x320ca9c5 -//.word 0x4a1abe0b -//.word 0x2d990df9 -//.word 0x0b4868ee -//.word 0x591518de -//.word 0xca3d719b -//.word 0x7bb5aa53 -//.word 0x6dc9eb5a -//.word 0x3903a62a -//.word 0xff4e2ba9 -//.word 0xa05b77aa -//.word 0x2d444db5 -//.word 0x9f6f890b -//.word 0xc8b6b0e5 -//.word 0x89c4cbfd -//.word 0x46c2764f -//.word 0x97343421 -//.word 0x401d0541 -//.word 0x646a3b8e -//.word 0xf58d89b9 -//.word 0x6f695d4d -//.word 0xc66e6fed -//.word 0x9c059add -//.word 0xb82eecc5 -//.word 0xb467f9b1 -//.word 0xf5d1745b -//.word 0xe18e00ad -//.word 0x4b6d4382 -//.word 0x32c93cad -//.word 0xacaed73c -//.word 0x1d3ebffe -//.word 0xac537442 -//.word 0xf8669de2 -//.word 0x06b09f80 -//.word 0x7f8e6e10 -//.word 0x182aa496 -//.word 0x5158d031 -//.word 0x62be1059 -//.word 0x7238e265 -//.word 0x0b7b3750 -//.word 0xcbf8c9bc -//.word 0x5c03af37 -//.word 0xa6342ebe -//.word 0x420dd37f -//.word 0x32debee3 -//.word 0xd0e641cc -//.word 0x05bbaa1c -//.word 0xbbec5c76 -//.word 0x95e42548 -//.word 0xdd11cb09 -//.word 0xbe46e8bf -//.word 0xb35ef8c5 -//.word 0x3f23b1cb -//.word 0xdf6e931e -//.word 0x3d8fbf2a -//.word 0xa6ee0c3d -//.word 0xbef3588d -//.word 0x72241c7d -//.word 0x2f8d431c -//.word 0x51653dee -//.word 0xdfee4ff0 -//.word 0x759d2dd6 -//.word 0x817bca97 -//.word 0x80000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x000183A0 -//// expected output -//.word 0x24735a57 -//.word 0x531628f9 -//.word 0x49140082 -//.word 0x8455cb7c -//.word 0x7756b74d -//.word 0xc997b407 -//.word 0x28961c27 -//.word 0x5d324512 -//.word 0x8fec89df -//.word 0xc189ba7c -//.word 0xde92e849 -//.word 0x311e6626 -//.word 0x04eec6d8 -//.word 0xe5e85346 -//.word 0xb43b1b35 -//.word 0xe859ec33 -//// SHA512LongMsgvector_125 -//// vector length -//.word 0x000186B8 -//// input message -//.word 0xf0405053 -//.word 0x26c87eba -//.word 0x5d23b28c -//.word 0xdb0c0f71 -//.word 0x778ec0f7 -//.word 0x5cbcdee2 -//.word 0x0ba394c4 -//.word 0x9f7d81cd -//.word 0x55285de3 -//.word 0x4bd6e0f5 -//.word 0x8805df8d -//.word 0x3db2b9a5 -//.word 0x4ac9f1bc -//.word 0x04e11c29 -//.word 0x3626feae -//.word 0x6696f050 -//.word 0x59718466 -//.word 0xd9ea6cf1 -//.word 0xb523982b -//.word 0x0a589f63 -//.word 0xc15b6007 -//.word 0x5940e903 -//.word 0xe6599849 -//.word 0x5a657fb1 -//.word 0x04040d04 -//.word 0x566eeb53 -//.word 0xeb65258e -//.word 0xc9688a52 -//.word 0xe32a5501 -//.word 0xe2420d18 -//.word 0x2424a9bd -//.word 0x0550f898 -//.word 0x5ec940e4 -//.word 0x4cc926c6 -//.word 0x33b3cddd -//.word 0x0249421a -//.word 0xb81f18d2 -//.word 0x274f4f11 -//.word 0xf76f7b32 -//.word 0xefc021ac -//.word 0x70a8652f -//.word 0x4263e2f0 -//.word 0x94f5da41 -//.word 0x3d638f64 -//.word 0x4822f0a1 -//.word 0xb0d07896 -//.word 0x682254cf -//.word 0x9e1ec496 -//.word 0x418ac30c -//.word 0xc1a4ea79 -//.word 0x161392e1 -//.word 0x031e39d8 -//.word 0x9c1c2796 -//.word 0x062b504e -//.word 0x7e257dbc -//.word 0x9cd0a7fe -//.word 0xd955a3a4 -//.word 0x50f4050a -//.word 0xc1f53ee6 -//.word 0xdbe2071d -//.word 0xbbf303db -//.word 0xb0ca9fe2 -//.word 0x41603e22 -//.word 0x7140938a -//.word 0x41f34d1f -//.word 0x77bbfa4b -//.word 0x9e842577 -//.word 0x4e17c2dc -//.word 0xad91cd95 -//.word 0x36132df9 -//.word 0xb9bcde29 -//.word 0xa3d44fe5 -//.word 0x804a09a4 -//.word 0xbe6192e3 -//.word 0xb4a691bd -//.word 0xe32532bc -//.word 0x7bdcccef -//.word 0x2170c23c -//.word 0xef1fa7f8 -//.word 0xbcf6a5b5 -//.word 0x9e441f5b -//.word 0xae4e957b -//.word 0x0b44c8df -//.word 0x22741f66 -//.word 0x2cbe4a0f -//.word 0xf7482553 -//.word 0xea73dfb8 -//.word 0x440d5ba3 -//.word 0xa4c8d66d -//.word 0xceeacbba -//.word 0xac471306 -//.word 0x936c5181 -//.word 0xc81e8d1d -//.word 0x43031fe5 -//.word 0xb29ecf90 -//.word 0xc1813a56 -//.word 0x99bd7802 -//.word 0xa69efb49 -//.word 0x9e95ba5a -//.word 0xbf768fb6 -//.word 0x58e3de42 -//.word 0x8a08789a -//.word 0x508abfa9 -//.word 0xbdb90a77 -//.word 0x850d4b41 -//.word 0xbfd0efcf -//.word 0xe9180502 -//.word 0x2df8a3ad -//.word 0xe2f785a5 -//.word 0x56c1f81c -//.word 0xcb1df62a -//.word 0xbf1f93ad -//.word 0x719f9853 -//.word 0xa0ea6df5 -//.word 0x96b63c27 -//.word 0x655c530d -//.word 0x7141ca70 -//.word 0x2e956610 -//.word 0x2b41be3c -//.word 0x501a9ca1 -//.word 0x645ba660 -//.word 0xd1523e63 -//.word 0xac59a6f0 -//.word 0xf008687e -//.word 0x0aa9f5c8 -//.word 0x9bec8c21 -//.word 0x79dd5d07 -//.word 0xf712effa -//.word 0x6629bf8f -//.word 0xdb722ac0 -//.word 0x33e88c86 -//.word 0x5566aaaa -//.word 0xb7174dd7 -//.word 0x242f30f5 -//.word 0xbcd81cb2 -//.word 0x3c6f5261 -//.word 0x7ff12908 -//.word 0x45b0f8b4 -//.word 0x344b3610 -//.word 0x1cdce036 -//.word 0x7f731bc5 -//.word 0x51c41b34 -//.word 0xfc1c4366 -//.word 0xa79a8e7e -//.word 0xb89b2df4 -//.word 0x977672e9 -//.word 0xb56aecb7 -//.word 0xced4d4cd -//.word 0x6ba5a7ba -//.word 0xaa141587 -//.word 0x41901a4a -//.word 0xc1f96bf8 -//.word 0x180f137b -//.word 0x5a2b5e04 -//.word 0xc12df6a3 -//.word 0xf2b54c15 -//.word 0x819639dd -//.word 0xb887e696 -//.word 0x941ce987 -//.word 0x11f5b078 -//.word 0xa73623c4 -//.word 0x153685b0 -//.word 0x5d7c9bfb -//.word 0x10e711b6 -//.word 0xcb2c1956 -//.word 0x02865508 -//.word 0xfca8f744 -//.word 0x1ff727a5 -//.word 0x6ef6a5f8 -//.word 0x5001af93 -//.word 0x933f25e8 -//.word 0xb0d2eb59 -//.word 0x51508f4e -//.word 0x10772b85 -//.word 0x821c8daa -//.word 0x74659628 -//.word 0x7438e03e -//.word 0x94f3a355 -//.word 0x6a5eda91 -//.word 0x5bdea1a6 -//.word 0x1aebe2ed -//.word 0x6bc330b7 -//.word 0x2d60f3e1 -//.word 0x97a8c6a8 -//.word 0xc2e51dbf -//.word 0x67742b9f -//.word 0xebc1031f -//.word 0x9873fd44 -//.word 0x2ee35b5a -//.word 0x9ad32c43 -//.word 0x055d7110 -//.word 0x10297fce -//.word 0x5ee3a4a2 -//.word 0x54ec0d19 -//.word 0x1c50e7b9 -//.word 0xf0f9c5dc -//.word 0x952242be -//.word 0x250ee7d4 -//.word 0x12f94f5f -//.word 0x684f8842 -//.word 0x521cbd10 -//.word 0xe0c3126a -//.word 0x07f4d088 -//.word 0xead8c215 -//.word 0x578edf40 -//.word 0x95db2810 -//.word 0x5d1dd4f7 -//.word 0x2681abab -//.word 0xa676b031 -//.word 0x9562023a -//.word 0xb49304b3 -//.word 0x0e78bc98 -//.word 0x7d117909 -//.word 0x71a4b99f -//.word 0xedb24900 -//.word 0xd229aeb1 -//.word 0x60dbc42c -//.word 0xfa2fa533 -//.word 0x2916cc63 -//.word 0xe4417b0c -//.word 0x0f925940 -//.word 0x41d0602a -//.word 0xca9ef6a1 -//.word 0xf5ae5afd -//.word 0x8a32422a -//.word 0x9793c3fb -//.word 0x706670c0 -//.word 0xf59cc61a -//.word 0x13f8c80e -//.word 0x8ec7e659 -//.word 0xfdcb2303 -//.word 0x16787737 -//.word 0x2b637252 -//.word 0xf5f7233a -//.word 0x916938f1 -//.word 0xc8ef666a -//.word 0x932d0c9b -//.word 0xdef013d3 -//.word 0x8d1f184e -//.word 0xbdefcd07 -//.word 0x4c559ccd -//.word 0x9bc18e99 -//.word 0x92096c1f -//.word 0xe5a324a3 -//.word 0x96186d0e -//.word 0xbcb5ae41 -//.word 0x82841ca9 -//.word 0x727b2313 -//.word 0xf4f208c2 -//.word 0x115bccbf -//.word 0x7d2d5371 -//.word 0xd521c66d -//.word 0x25a1358f -//.word 0xad7d814a -//.word 0xe5e1793c -//.word 0xbe844306 -//.word 0x2b21fe5a -//.word 0xe02ba556 -//.word 0x59bd3610 -//.word 0x1fd01472 -//.word 0x47b0aa48 -//.word 0x3bb15297 -//.word 0xbd1d7530 -//.word 0x2872f386 -//.word 0xf9cac5bd -//.word 0x8f9be103 -//.word 0x2fa05d23 -//.word 0x4b17d857 -//.word 0x042d165e -//.word 0xedb7eacf -//.word 0x122259ad -//.word 0x39adfc3b -//.word 0x67d5a612 -//.word 0xa6114770 -//.word 0x06c010d3 -//.word 0xe260d8c7 -//.word 0x6400bffc -//.word 0x4bf8119b -//.word 0xecd76dda -//.word 0x779d26cf -//.word 0x7c2be981 -//.word 0xaef7a045 -//.word 0xe6049748 -//.word 0x6b12dd68 -//.word 0x7012ee48 -//.word 0xdedc8ea3 -//.word 0x5424f8e0 -//.word 0x6caa38e7 -//.word 0x41b2d634 -//.word 0x2eb4b429 -//.word 0xd85439a9 -//.word 0x6e94afe2 -//.word 0x2f49ea6a -//.word 0x2dcc2b8e -//.word 0x51f144e7 -//.word 0xa03dfc2e -//.word 0xbc53b450 -//.word 0xaeb04bc5 -//.word 0xe298401e -//.word 0x735016de -//.word 0xaa8efd8b -//.word 0xc12eae05 -//.word 0xec269716 -//.word 0x9abc3849 -//.word 0xf7f7cd00 -//.word 0xb6532dc1 -//.word 0x0fb8f2d1 -//.word 0x03adda04 -//.word 0xe7ca6dd3 -//.word 0x206be0af -//.word 0x2cac3a95 -//.word 0xe291b5e3 -//.word 0xfa84676a -//.word 0xcf0521c4 -//.word 0x649d98e7 -//.word 0xa513c2fb -//.word 0xf0e38369 -//.word 0xd4ec8935 -//.word 0x1969758d -//.word 0x00223ba2 -//.word 0xcbe4cbb6 -//.word 0x802ef176 -//.word 0xeb2d798b -//.word 0xe2ea986c -//.word 0xcdc38776 -//.word 0x6518713e -//.word 0xbb468f26 -//.word 0x7cd9922e -//.word 0x74fd410d -//.word 0x52366381 -//.word 0xab51dfe3 -//.word 0x419b22fe -//.word 0x8450c121 -//.word 0x59565f73 -//.word 0x1b2bd287 -//.word 0xdf1d8130 -//.word 0xfdb91097 -//.word 0xcc85408a -//.word 0xacf21017 -//.word 0x4a8c295a -//.word 0x1f747893 -//.word 0x3a101d7b -//.word 0x400184d9 -//.word 0xb155d150 -//.word 0x6cfe827b -//.word 0x76834f3c -//.word 0xf7f65550 -//.word 0x85267427 -//.word 0xa515f6f3 -//.word 0x8fad7100 -//.word 0x32aeee43 -//.word 0x78eb4a35 -//.word 0xcbb6dde2 -//.word 0xd8995a3c -//.word 0x9347f6b6 -//.word 0x7bd1cd0e -//.word 0x1f1d816a -//.word 0xe19524a7 -//.word 0xfa1c58ee -//.word 0xbe46b488 -//.word 0x21c86af3 -//.word 0x7b2d2735 -//.word 0x88cb3b70 -//.word 0xb3f6fab7 -//.word 0x94736220 -//.word 0xb72ffe1a -//.word 0x9f310901 -//.word 0x0aced7f0 -//.word 0x771c71d7 -//.word 0xe6a980cd -//.word 0xdf6c6ca7 -//.word 0xb5fbc4c9 -//.word 0x0cffe13c -//.word 0x99e5c601 -//.word 0x29d74ba5 -//.word 0xe5eb7b16 -//.word 0xd49a3ab5 -//.word 0xa1732bac -//.word 0x9f10d082 -//.word 0x0a4af3ed -//.word 0x90a945e7 -//.word 0x0f1e4603 -//.word 0xa1f56402 -//.word 0xd60567a1 -//.word 0x402a0cb6 -//.word 0x35f5f07b -//.word 0xd0a1b02a -//.word 0x39494fca -//.word 0x2659d848 -//.word 0xa24344c9 -//.word 0x0e739d3f -//.word 0x6584643a -//.word 0xc4b43102 -//.word 0x299599e2 -//.word 0x7a0654c6 -//.word 0xca629f09 -//.word 0xd9f7e088 -//.word 0xd9ba89fb -//.word 0x78383e85 -//.word 0x1ad03a89 -//.word 0x6620efc0 -//.word 0x05bdec88 -//.word 0xa627047f -//.word 0x46fcad51 -//.word 0xae6ba6ce -//.word 0x3decdd40 -//.word 0xe72e8ffb -//.word 0x7e51b135 -//.word 0x30568f18 -//.word 0x52d4b316 -//.word 0x5cec087d -//.word 0x347e3f4b -//.word 0xaf9d7243 -//.word 0x55410740 -//.word 0x643cd8ca -//.word 0x187090e7 -//.word 0x2a3e5833 -//.word 0x9642b433 -//.word 0xa23da7e7 -//.word 0x1c521e9e -//.word 0xe3768c0e -//.word 0xa922d1a4 -//.word 0xf64a6019 -//.word 0x7093a146 -//.word 0x5bc19439 -//.word 0x5c6eb888 -//.word 0x82022be5 -//.word 0x86df12f3 -//.word 0x52dc3b59 -//.word 0xc1f50114 -//.word 0xa6417011 -//.word 0x0f24aafb -//.word 0xcbc58952 -//.word 0x29c286bd -//.word 0x0323daa1 -//.word 0xfb8de3f2 -//.word 0x05b8c849 -//.word 0x26236037 -//.word 0x7b0750da -//.word 0x7c8974ad -//.word 0x823381a4 -//.word 0x87a5e879 -//.word 0x2d88fd40 -//.word 0x02c45842 -//.word 0x03f37b08 -//.word 0x5f15b6b6 -//.word 0x7d85489b -//.word 0x3f2cc705 -//.word 0x89f4c25a -//.word 0xfd7fa464 -//.word 0x091adbed -//.word 0x24ec3a8c -//.word 0x54739cbe -//.word 0xf432cb38 -//.word 0xb4a3a07c -//.word 0xe1736bab -//.word 0xe7ee949a -//.word 0x14b98327 -//.word 0x9ebfbece -//.word 0xe86d5177 -//.word 0x01227392 -//.word 0x6de16666 -//.word 0x294a9fa6 -//.word 0xe9c82746 -//.word 0xa40b418c -//.word 0x52b94d6a -//.word 0xf560ec0b -//.word 0xd6b065ac -//.word 0x11e748ad -//.word 0x538c51e8 -//.word 0xe3608e41 -//.word 0xdf92c47e -//.word 0xc932105a -//.word 0x42e8cad4 -//.word 0x14e6aecd -//.word 0x761b3ed2 -//.word 0x8ca96237 -//.word 0x2e9a5265 -//.word 0xeaceb574 -//.word 0x4c380bfd -//.word 0x5c4b4829 -//.word 0x69aec10e -//.word 0x05374c3c -//.word 0x5117a392 -//.word 0x7b520a57 -//.word 0x84733286 -//.word 0x477d5c68 -//.word 0xb724c168 -//.word 0x683d3224 -//.word 0x5174fcc0 -//.word 0xd03d0e7f -//.word 0xee0d5e94 -//.word 0xe5c98835 -//.word 0xdf7fb8f2 -//.word 0x0154cb45 -//.word 0xa8bdb16a -//.word 0xf2f21670 -//.word 0x81a04191 -//.word 0x7bde3cbf -//.word 0xd563357f -//.word 0xd2f624fa -//.word 0xc625ae51 -//.word 0x203a4932 -//.word 0xa76ba2a9 -//.word 0x04513c38 -//.word 0x819c5929 -//.word 0x10041d23 -//.word 0x8f83f1fc -//.word 0x4ac126ce -//.word 0xc2d0da4d -//.word 0xad192057 -//.word 0x3d965bcd -//.word 0xa542eba2 -//.word 0xdace0c31 -//.word 0x9696fad4 -//.word 0xa3d35ab2 -//.word 0x5612d5d8 -//.word 0x5ae5068c -//.word 0xaed896dd -//.word 0xf1a6a57f -//.word 0xdead6cd6 -//.word 0x13a02151 -//.word 0x167c1bf9 -//.word 0x99bd374a -//.word 0xfdd17a41 -//.word 0x16cdf8b6 -//.word 0x2e5ff4ec -//.word 0x4c034867 -//.word 0xb67a08fd -//.word 0xb4796230 -//.word 0x979ec8bb -//.word 0xfaa7526b -//.word 0x48e65d30 -//.word 0x7ef07974 -//.word 0x329682ab -//.word 0xd5160c2c -//.word 0x3592043f -//.word 0x45c09577 -//.word 0x21e44942 -//.word 0x4dfb71be -//.word 0x3d39c6ce -//.word 0x1bb6506e -//.word 0xc4658743 -//.word 0x1445b976 -//.word 0x63dbabc3 -//.word 0x4fdf83cd -//.word 0xbc36e5b5 -//.word 0x1a205dea -//.word 0xe7b3fd43 -//.word 0x7488474b -//.word 0xebb44ddc -//.word 0x91f916ef -//.word 0x493e44b2 -//.word 0x5a3df4db -//.word 0x717ce63c -//.word 0xea7ede98 -//.word 0x4b3a49b6 -//.word 0x11cc24b3 -//.word 0xb06b1a9c -//.word 0xd59bec3d -//.word 0xeea31633 -//.word 0xec42b049 -//.word 0x479e9201 -//.word 0x437dbb70 -//.word 0x73b7f44f -//.word 0x7becb050 -//.word 0x197237ae -//.word 0x67910308 -//.word 0x5af36a6f -//.word 0x8f567ebe -//.word 0x47843229 -//.word 0xb085be19 -//.word 0x66134438 -//.word 0x394eb3c7 -//.word 0x31b1ec38 -//.word 0xcf4523f9 -//.word 0x9614888e -//.word 0xcae127e2 -//.word 0x78160ddf -//.word 0xb6fead3c -//.word 0x2c348296 -//.word 0xd35cf5c3 -//.word 0xfd108063 -//.word 0x961d14b7 -//.word 0xa9f0b8b7 -//.word 0x254b745e -//.word 0xe23d6d49 -//.word 0xdf505180 -//.word 0xce04f594 -//.word 0xd27c3dea -//.word 0x87783d56 -//.word 0x43839deb -//.word 0x9b6e4212 -//.word 0x29fc2ada -//.word 0x8ddf988f -//.word 0xb2e3728e -//.word 0x536ae757 -//.word 0xbd1854e4 -//.word 0xd6cf693a -//.word 0x5ede883d -//.word 0x75756dc8 -//.word 0x5d5d14fd -//.word 0x82e5d7da -//.word 0xb720d80d -//.word 0xc34d9e0a -//.word 0x1c97035a -//.word 0xf2ff4d36 -//.word 0x6f969b54 -//.word 0x3eef8301 -//.word 0x4ad4f970 -//.word 0xc8387252 -//.word 0x776d4aa6 -//.word 0x269763d3 -//.word 0x786110f4 -//.word 0xe4ee3173 -//.word 0xff139fd9 -//.word 0xfec3cae4 -//.word 0x76caa0db -//.word 0x67beb11e -//.word 0x79339101 -//.word 0x852f7eda -//.word 0x57de4359 -//.word 0xb3865c18 -//.word 0x95bc5b73 -//.word 0xbdd98b9a -//.word 0x6ba8d2e4 -//.word 0x6861dc67 -//.word 0x45db75c5 -//.word 0xe7fd3748 -//.word 0x44766632 -//.word 0x67ad184e -//.word 0xbafb99cb -//.word 0x84190d4a -//.word 0xb1d45736 -//.word 0xd2083a54 -//.word 0x64cbbe9b -//.word 0x55e9d645 -//.word 0xc4913f26 -//.word 0x094dab3d -//.word 0xf5371f89 -//.word 0x5a6b9a1d -//.word 0xceb8f777 -//.word 0xad9b140e -//.word 0x5d6d342a -//.word 0xd6dba2f8 -//.word 0x619798de -//.word 0x9f4d5e0c -//.word 0xced9b654 -//.word 0x48b7783b -//.word 0x4cba7a50 -//.word 0x0101b2bc -//.word 0xb8289f1b -//.word 0x72bbe48a -//.word 0xa2f03701 -//.word 0x349579e4 -//.word 0xcd4726d4 -//.word 0x55e5f0cb -//.word 0xb344a768 -//.word 0xd7245c87 -//.word 0xfe63c615 -//.word 0x3171e523 -//.word 0x0f04e438 -//.word 0xcd0d44ec -//.word 0x7bea37b2 -//.word 0x89dd4af6 -//.word 0x89bd4768 -//.word 0x36eb5a97 -//.word 0xb68872c1 -//.word 0x1ce5eae9 -//.word 0x313b692b -//.word 0x749d074d -//.word 0x5f2ab196 -//.word 0xec87cee3 -//.word 0x588d22f7 -//.word 0x273ef313 -//.word 0x68fe6bc6 -//.word 0x3a003e07 -//.word 0x8ffe8d81 -//.word 0x302d092e -//.word 0x02705b27 -//.word 0x87cbc4bb -//.word 0xa71b00be -//.word 0xb1057123 -//.word 0x9d2d79ce -//.word 0x94a828a3 -//.word 0xb2b317e3 -//.word 0x0aa593b8 -//.word 0xea22fe0e -//.word 0x619273a5 -//.word 0xffd1a964 -//.word 0xdc281af1 -//.word 0xdb7d647e -//.word 0x30c6efe6 -//.word 0x20c4d0f8 -//.word 0x08eded12 -//.word 0xa1aa62f3 -//.word 0x82c224ca -//.word 0xe716e492 -//.word 0xb09037a2 -//.word 0xad56f380 -//.word 0x1843dcf7 -//.word 0x63978069 -//.word 0x35ed5f66 -//.word 0xaf6e4f7c -//.word 0xf3451f51 -//.word 0xe7527bf0 -//.word 0x36230f61 -//.word 0x9820f07c -//.word 0x540537fe -//.word 0x0396efdd -//.word 0x968e31d9 -//.word 0x9ad88d54 -//.word 0xbb01ac63 -//.word 0x87ee3425 -//.word 0x75caec54 -//.word 0x26432119 -//.word 0xeaf64825 -//.word 0x8627e4fd -//.word 0x35b6aa95 -//.word 0xec4ee321 -//.word 0xe2e01328 -//.word 0x5050d8da -//.word 0x756e14a3 -//.word 0xde274e00 -//.word 0xe4fd5692 -//.word 0x76b42871 -//.word 0x194e13c2 -//.word 0x2c3a1b8c -//.word 0x71c99bc7 -//.word 0xc9e12fb6 -//.word 0x3ff5d077 -//.word 0x483441d9 -//.word 0x4901ab6d -//.word 0x5aa484e0 -//.word 0x4a3fb487 -//.word 0xe303fb3c -//.word 0x6fa38d69 -//.word 0x7b090062 -//.word 0xda4968f8 -//.word 0xedd3c14b -//.word 0x22ec8ddf -//.word 0xbb5fbdf2 -//.word 0xd16fd50d -//.word 0x98114cda -//.word 0xe4583135 -//.word 0xec311585 -//.word 0x4e50244d -//.word 0x546a95fe -//.word 0x76a54510 -//.word 0x204d9e50 -//.word 0xb5c8be7c -//.word 0xd3ccd50d -//.word 0xd9cfcf54 -//.word 0xa6bf34c8 -//.word 0xa4f44c9f -//.word 0x0663869b -//.word 0x4d141a27 -//.word 0x11d6eea2 -//.word 0xfe31b7fb -//.word 0x1d9c607e -//.word 0x54f0afed -//.word 0x311d26d3 -//.word 0xe31b2715 -//.word 0x89245cca -//.word 0xb021564c -//.word 0x1662748f -//.word 0xb49107b2 -//.word 0xfce9b3d4 -//.word 0x60a31929 -//.word 0x13b1b24d -//.word 0x13affed8 -//.word 0x6717df32 -//.word 0xa5b43fa9 -//.word 0xb859f9c0 -//.word 0xe0d2f7ca -//.word 0xfa1b98b8 -//.word 0x02d05430 -//.word 0xd6e5a2df -//.word 0x3d97190f -//.word 0x27a2d67c -//.word 0x37b51f63 -//.word 0x7e2345dd -//.word 0x8adbcf6b -//.word 0x9f9ad4d2 -//.word 0x445fa929 -//.word 0x0120bd30 -//.word 0x68bbc0e3 -//.word 0x522f0b4f -//.word 0x6b0c3ca5 -//.word 0xf128208d -//.word 0xb894d7bc -//.word 0x72ce32c9 -//.word 0x2d38603c -//.word 0x1dc9cae9 -//.word 0x9c033b7c -//.word 0x6f254454 -//.word 0x4ba1df95 -//.word 0x97d05278 -//.word 0x74e556e6 -//.word 0xfb207946 -//.word 0xc544c193 -//.word 0xb14a92b1 -//.word 0xe157d101 -//.word 0x06ec4a33 -//.word 0xde5c4f5b -//.word 0xfb84a247 -//.word 0xc5b69610 -//.word 0xc2f670f0 -//.word 0x15691353 -//.word 0x450add31 -//.word 0x409fcc9a -//.word 0xa0ece593 -//.word 0x2c26d620 -//.word 0xa2aadaa2 -//.word 0xb4efdd63 -//.word 0x50b9e170 -//.word 0x2490a0a7 -//.word 0x62717210 -//.word 0xc0c37271 -//.word 0xc48cdc1c -//.word 0x3ee5ba0c -//.word 0x16acc030 -//.word 0x47787407 -//.word 0x2cd2926d -//.word 0xfba2aeb5 -//.word 0x8fe71bf7 -//.word 0x6aab0cab -//.word 0xfa37f977 -//.word 0x1b834446 -//.word 0xdef01d9a -//.word 0x8839a323 -//.word 0xdea74b90 -//.word 0xa08586a5 -//.word 0x54d49e8e -//.word 0x4440e173 -//.word 0xca52024c -//.word 0xcbe6bcf7 -//.word 0x82e0b887 -//.word 0x7f1bb1e0 -//.word 0xefa2d681 -//.word 0x1d2370a0 -//.word 0x39a0c47c -//.word 0x59683bef -//.word 0xbd46c042 -//.word 0x57f86a46 -//.word 0x8ae25ba0 -//.word 0x3304e865 -//.word 0xe62afae7 -//.word 0x7a62b3ce -//.word 0xc7b3556a -//.word 0xae0c6047 -//.word 0x5a7bfb02 -//.word 0xc69f955c -//.word 0x7f60cc8d -//.word 0xacdd8edb -//.word 0x4ba67e6a -//.word 0xbd2c9956 -//.word 0x857619ff -//.word 0x4d1599a4 -//.word 0x29597b34 -//.word 0x20c58760 -//.word 0xe9c1d4f5 -//.word 0xf28fec69 -//.word 0xa7802bb3 -//.word 0xf0686860 -//.word 0xfb4fd8e4 -//.word 0x3d692e2e -//.word 0xb349077f -//.word 0x6e51867b -//.word 0x4e6d3b81 -//.word 0x0e014a38 -//.word 0x801fc96a -//.word 0x1afe6916 -//.word 0xb2a759c0 -//.word 0x86f2670c -//.word 0x7fb1698b -//.word 0xb72bdbd5 -//.word 0x38ccc9d8 -//.word 0x071af06f -//.word 0x61eb2037 -//.word 0x44d5e49e -//.word 0x31e7653c -//.word 0x31968c67 -//.word 0x16fa6701 -//.word 0x033bce95 -//.word 0x2e4646a2 -//.word 0xe5c42537 -//.word 0xcf4cf7c0 -//.word 0x75d72120 -//.word 0x0075c400 -//.word 0x443fe466 -//.word 0xfe8dca89 -//.word 0x5a69a6e4 -//.word 0xb9437989 -//.word 0xb0e632b8 -//.word 0x54aa17b0 -//.word 0xb5eb67c5 -//.word 0xa8bb3eb3 -//.word 0xcad4b832 -//.word 0xc1d059ca -//.word 0xc59dade9 -//.word 0x602b2b33 -//.word 0x71675f19 -//.word 0x776d49ad -//.word 0x0cf900b4 -//.word 0xb01f9afd -//.word 0xc83d50f2 -//.word 0xe62dde6d -//.word 0x4bbf29cd -//.word 0xab662448 -//.word 0x3031f483 -//.word 0xc1fd535f -//.word 0x83ea3216 -//.word 0xa00ba288 -//.word 0x4862f4cf -//.word 0xf60b1f19 -//.word 0xf5b763b7 -//.word 0x225c2c71 -//.word 0xf32b391d -//.word 0xb8c3fd70 -//.word 0x21a44613 -//.word 0x01e61cf9 -//.word 0x512becf1 -//.word 0x78d2e677 -//.word 0xca6da3d0 -//.word 0x4e750b56 -//.word 0xc43d7610 -//.word 0xe6251185 -//.word 0xef1084d2 -//.word 0x5a18d1fb -//.word 0xec807f7f -//.word 0xf4e9f92f -//.word 0xd2c9313f -//.word 0xb61a889e -//.word 0xaa4ff283 -//.word 0xd38c5549 -//.word 0xf316337c -//.word 0x33098934 -//.word 0x2049f7a1 -//.word 0xf3ba20e8 -//.word 0x15b4542d -//.word 0xe2b16df1 -//.word 0xae49f69f -//.word 0x05619361 -//.word 0x379f9c38 -//.word 0x14210c4c -//.word 0xf56e9a81 -//.word 0xfcac254a -//.word 0x9c1455c2 -//.word 0x5ba480f9 -//.word 0xd613ca8b -//.word 0x060a9178 -//.word 0xc391082f -//.word 0x86c821ec -//.word 0x73d7b144 -//.word 0x9727cfff -//.word 0x6ed37c25 -//.word 0xa8598a5b -//.word 0x2c96b670 -//.word 0x5ef11834 -//.word 0x9dd6bd89 -//.word 0x106692bc -//.word 0xa36c8315 -//.word 0x4c93e5ac -//.word 0x93d7117f -//.word 0x513a52c2 -//.word 0xb8b80276 -//.word 0x937cef3d -//.word 0xcf54046d -//.word 0x3b632563 -//.word 0x8c165a1a -//.word 0xa45930fc -//.word 0x140a5cf7 -//.word 0xdfada2d4 -//.word 0x8162f5c4 -//.word 0x2f15e03c -//.word 0x61f52403 -//.word 0x8e27a38a -//.word 0x36bb7c7b -//.word 0x26df7894 -//.word 0xf852a5b6 -//.word 0xd91c4039 -//.word 0x8f7dd883 -//.word 0xba23b1d9 -//.word 0x599f6774 -//.word 0x911ad3d8 -//.word 0xaa443261 -//.word 0x5b8e841f -//.word 0x479933e4 -//.word 0xc7eef59a -//.word 0xeaeff3da -//.word 0xba0e2bbb -//.word 0xc13c13e8 -//.word 0xcca47ff6 -//.word 0xef9ac4f4 -//.word 0xc9ce1e43 -//.word 0x09c64fa8 -//.word 0x318b899f -//.word 0x9ba28ef2 -//.word 0xb93d168b -//.word 0xa0b37186 -//.word 0xc82e6d8b -//.word 0x0da37a5b -//.word 0xfa080ca8 -//.word 0x47c1412a -//.word 0xa05bc4ef -//.word 0xa97cf1f3 -//.word 0x3e1a3af0 -//.word 0xffecc977 -//.word 0x0c1e6640 -//.word 0x0d499cbf -//.word 0x76a217f7 -//.word 0x09725193 -//.word 0x9cc66e33 -//.word 0x1c676404 -//.word 0xd20c5e93 -//.word 0xe5cf63e3 -//.word 0x20de32bd -//.word 0xf6737147 -//.word 0xc30607d8 -//.word 0x55c1c70b -//.word 0xab344e12 -//.word 0xfc4a2e4d -//.word 0xfc7b4c1b -//.word 0x5a4486f1 -//.word 0x8dd499a9 -//.word 0xd009421c -//.word 0x6b9aa4f2 -//.word 0x3596eab9 -//.word 0x570d2d35 -//.word 0x520c98f7 -//.word 0x44cfca31 -//.word 0x67337bc9 -//.word 0xda6a63ac -//.word 0xa4f25765 -//.word 0xf6c8b6ee -//.word 0xb0d903c6 -//.word 0x27b9d343 -//.word 0x2597ea2a -//.word 0x3271a17d -//.word 0x12848b94 -//.word 0x8f07576f -//.word 0x7918f84b -//.word 0xeaf70473 -//.word 0xce725a59 -//.word 0xa3a008e5 -//.word 0x7ed26c0d -//.word 0x4fc799a6 -//.word 0x651ffb7a -//.word 0x35123f9a -//.word 0x57626df6 -//.word 0xd18e572a -//.word 0x9849379b -//.word 0x542a94c3 -//.word 0x64a565c9 -//.word 0x223a7955 -//.word 0x68ec16a2 -//.word 0x53f5e1d5 -//.word 0x46b8fd8d -//.word 0x32f777bb -//.word 0x1546e2b4 -//.word 0xc1c03e84 -//.word 0xdff81f85 -//.word 0x33330b31 -//.word 0x22d42335 -//.word 0x711705c6 -//.word 0x4f02f238 -//.word 0x96992ccd -//.word 0x4e52a2cb -//.word 0x73c8cfd1 -//.word 0xf7b3e06a -//.word 0x0b1815e3 -//.word 0x9bbd695a -//.word 0x17e07518 -//.word 0x79289221 -//.word 0x84dc3e08 -//.word 0x4953c108 -//.word 0xf0ac1051 -//.word 0xb5bff1a0 -//.word 0x31526012 -//.word 0xdb91313a -//.word 0xceb8f871 -//.word 0xcd13266d -//.word 0x84287416 -//.word 0x10338594 -//.word 0xc2d2c6ad -//.word 0x20029a4e -//.word 0x2d4ab467 -//.word 0xeb36c3fc -//.word 0x1d07557a -//.word 0x51a9f547 -//.word 0x1ee5979c -//.word 0xabd83797 -//.word 0x70a4bc8c -//.word 0x4165229d -//.word 0x8867d88a -//.word 0xd29667ca -//.word 0x8d3555da -//.word 0x0fd349d5 -//.word 0xdb7b6f45 -//.word 0x202c1e38 -//.word 0x8388b997 -//.word 0x1ed0d3b4 -//.word 0xc9109622 -//.word 0x989765c9 -//.word 0xa5aac039 -//.word 0x0f7a683f -//.word 0x4253c4b6 -//.word 0x791584a0 -//.word 0x82e88476 -//.word 0xc12cf3bc -//.word 0x78afb4d7 -//.word 0x46230423 -//.word 0xedcf5e41 -//.word 0x58849bae -//.word 0xdcd35e9a -//.word 0xbe7daff7 -//.word 0xf52be6d0 -//.word 0x325fcbdc -//.word 0x1eabfb53 -//.word 0xe2218e00 -//.word 0xed0af698 -//.word 0xf1db2a4a -//.word 0x2f640597 -//.word 0xf54be864 -//.word 0x65b9a74d -//.word 0x7753a33d -//.word 0x426c333b -//.word 0x77784987 -//.word 0x2ec452e6 -//.word 0xe5655d3a -//.word 0xc56f8055 -//.word 0x2867770f -//.word 0x59fa8f96 -//.word 0x9aeec306 -//.word 0x6c5a243a -//.word 0x0a127ee1 -//.word 0x376638d4 -//.word 0x390c7ca7 -//.word 0x265a987d -//.word 0x5eb8a421 -//.word 0x59566553 -//.word 0xa31a7260 -//.word 0x24dd95f6 -//.word 0xa5d67435 -//.word 0x90567109 -//.word 0xf7b6ceb8 -//.word 0xd88e15b7 -//.word 0xa028b7c2 -//.word 0xed35f32b -//.word 0x98bef973 -//.word 0xf35d5017 -//.word 0x4fac75ac -//.word 0xc2fec52e -//.word 0x274d9c96 -//.word 0x6574bfaa -//.word 0xf59ef719 -//.word 0x9effffc7 -//.word 0x83c2a066 -//.word 0x60421b46 -//.word 0x117cc76e -//.word 0x54c5fbeb -//.word 0xcfb82e68 -//.word 0x55735dff -//.word 0x6503ae4f -//.word 0xf31c52cf -//.word 0x6b0daf61 -//.word 0xf4f4bf2b -//.word 0xf22eb3a2 -//.word 0xce12dde7 -//.word 0xf9dfcc57 -//.word 0x2ef2b95e -//.word 0xf83d228b -//.word 0x75f4b4ea -//.word 0x59896e8e -//.word 0x35db046d -//.word 0xfaab8171 -//.word 0xb94f31cb -//.word 0xacaabe8b -//.word 0x7a5b996d -//.word 0xb7359bf6 -//.word 0xaaefedc0 -//.word 0x541d2513 -//.word 0xad5fb1b4 -//.word 0x31d97902 -//.word 0x9be3c03e -//.word 0xf1014b2b -//.word 0xc015c6d7 -//.word 0xa9d363b8 -//.word 0x1c76c4fa -//.word 0x64b11b18 -//.word 0xe4e990aa -//.word 0xa0a1e37e -//.word 0xff3652e9 -//.word 0xcfccbd5f -//.word 0x89880842 -//.word 0xd600c1f8 -//.word 0x53ef0240 -//.word 0x912e99c6 -//.word 0x61df67f5 -//.word 0x4eeb060c -//.word 0x6ab0af74 -//.word 0x4ef35a51 -//.word 0x5c1c2657 -//.word 0x47a2fcde -//.word 0xd6c46f39 -//.word 0xe47ae744 -//.word 0xacabff3d -//.word 0x43a02bd5 -//.word 0x66b99e86 -//.word 0x765e6b26 -//.word 0xc139eabd -//.word 0x03a25d94 -//.word 0x2d5bd38e -//.word 0x647e4dbb -//.word 0x4db3202b -//.word 0x88a69a00 -//.word 0x7ab9e8c7 -//.word 0x50f63709 -//.word 0x40471a1c -//.word 0x12e92c3f -//.word 0xe01ef6e7 -//.word 0x1a221353 -//.word 0xcc619166 -//.word 0x24e79bb6 -//.word 0x2f1855e1 -//.word 0xe3a10820 -//.word 0x62ae7f1e -//.word 0x7d5eb10a -//.word 0x7773a0ea -//.word 0x0c4f8033 -//.word 0xb21c1c97 -//.word 0x1f4a761f -//.word 0x0b3ead79 -//.word 0x37482493 -//.word 0xaed6e169 -//.word 0x4be8331b -//.word 0x7bc49842 -//.word 0x44ebdd84 -//.word 0x874b8766 -//.word 0x82b67262 -//.word 0x9893b83a -//.word 0x55d4d48b -//.word 0xad2808a5 -//.word 0x8471fc9a -//.word 0x7478a795 -//.word 0xcadf726d -//.word 0xd1589b7a -//.word 0x5415d8a8 -//.word 0x5e803ec9 -//.word 0x442b6030 -//.word 0xe50abb7b -//.word 0x31e052b0 -//.word 0xe8f7958c -//.word 0xa4148717 -//.word 0x1aaa207c -//.word 0x9d4ef018 -//.word 0xe46b06d1 -//.word 0x0c3710a9 -//.word 0xe0e5c492 -//.word 0x591d7e85 -//.word 0x61a92ace -//.word 0xdc7164aa -//.word 0xe9a9de13 -//.word 0x654902db -//.word 0xb2bdd9f8 -//.word 0xb6de2c1f -//.word 0x2622e994 -//.word 0x040fc740 -//.word 0x66f62d04 -//.word 0x7add514d -//.word 0xc7bd9de8 -//.word 0xb5ee5618 -//.word 0x50df7fe6 -//.word 0x490afbb9 -//.word 0x3d27f326 -//.word 0x3aa07709 -//.word 0x804668d5 -//.word 0x84429528 -//.word 0x3b4e24a3 -//.word 0x942534f8 -//.word 0x4737c044 -//.word 0xcda2c6a0 -//.word 0xaf5ea9f2 -//.word 0x04b7d50a -//.word 0x3501a1ea -//.word 0x04877964 -//.word 0xcdc43ceb -//.word 0x0bd6e3a3 -//.word 0x1d2f64ba -//.word 0x4b8ed5fb -//.word 0x042dd5a0 -//.word 0x693c2868 -//.word 0x108fa1ea -//.word 0x01944529 -//.word 0x0587ad68 -//.word 0x21e9ac40 -//.word 0x5d2e32ef -//.word 0xc9b670f3 -//.word 0xc2fe3dd8 -//.word 0x7218b94e -//.word 0x9658307e -//.word 0x8451419e -//.word 0x6cff3fc3 -//.word 0xde46d7f7 -//.word 0x8c9bf38c -//.word 0x5202dfb0 -//.word 0x7338aa41 -//.word 0x2631d0e2 -//.word 0x51c5154e -//.word 0x94a6b4ec -//.word 0x8995b9a4 -//.word 0x4ad5acf2 -//.word 0x34e06f38 -//.word 0xeb5a6959 -//.word 0x9e43e583 -//.word 0x8d70b44c -//.word 0xc83c1a01 -//.word 0x397be83a -//.word 0xe4afe5b2 -//.word 0x6e7f7256 -//.word 0xdc646e9c -//.word 0x9ea65816 -//.word 0xcc87b347 -//.word 0xafbdafb5 -//.word 0x8326053f -//.word 0x7bb823b1 -//.word 0x06b78996 -//.word 0x512a734e -//.word 0x0d8fb860 -//.word 0x72cef211 -//.word 0x846cdf35 -//.word 0x95010745 -//.word 0x0bec9fb2 -//.word 0x6345ae79 -//.word 0x76136ef8 -//.word 0xfbbff5ff -//.word 0x4ec9142b -//.word 0x70ba806f -//.word 0x4e5a2ff4 -//.word 0x46220523 -//.word 0xe7f4b000 -//.word 0xf80ad1b9 -//.word 0xbc2d5c7e -//.word 0x75274194 -//.word 0x277a4ca5 -//.word 0x9e52495b -//.word 0xb2b96d2d -//.word 0xca0af178 -//.word 0x9fa800d1 -//.word 0x43efd39a -//.word 0x616b1bd3 -//.word 0xc6489f33 -//.word 0x200a2677 -//.word 0x067f97fb -//.word 0x39f15f87 -//.word 0x2a9f136b -//.word 0xbc6f56ce -//.word 0x4addfe43 -//.word 0xec37729d -//.word 0xf60c5605 -//.word 0xc2e26b49 -//.word 0xb027b077 -//.word 0x6a6aceab -//.word 0x6dcbb225 -//.word 0xc5b07c9e -//.word 0x17ba98dc -//.word 0xe5f82a85 -//.word 0x0e5ab031 -//.word 0x9468e3c2 -//.word 0xa233ddf8 -//.word 0xce8c8140 -//.word 0x9b7518cd -//.word 0x42d538ea -//.word 0xb270ea8f -//.word 0xd5150b32 -//.word 0x1519f3df -//.word 0x1f05558b -//.word 0xe68c66a6 -//.word 0xebc042ef -//.word 0xbd858b8c -//.word 0xbb45535a -//.word 0x21e53c82 -//.word 0x43f8dd4d -//.word 0x13336839 -//.word 0xe9218a4c -//.word 0x841893a8 -//.word 0x4c6cd760 -//.word 0xd9e2548a -//.word 0xb9689595 -//.word 0x6e03d6dd -//.word 0xb708687d -//.word 0x118f5764 -//.word 0x7c254bac -//.word 0x82c1ac27 -//.word 0x76fa093a -//.word 0xfa76bbee -//.word 0xc3a6c544 -//.word 0xa1b0ffc9 -//.word 0xb9ad746b -//.word 0x1515088b -//.word 0x60775e53 -//.word 0xea6ef84a -//.word 0xf3d0a025 -//.word 0x252807e1 -//.word 0x6267ad0e -//.word 0xc0d6006e -//.word 0xd24fc8be -//.word 0x2aadc2d4 -//.word 0x1b818bea -//.word 0xc407c03a -//.word 0x495864cb -//.word 0x64e0828a -//.word 0x1d13139c -//.word 0xd55c21f3 -//.word 0x89562d1f -//.word 0x553fcf67 -//.word 0x37aa9c19 -//.word 0x16734c1e -//.word 0x03f81dd1 -//.word 0xbe867212 -//.word 0x7c12c095 -//.word 0xe72aaa80 -//.word 0x672b6b36 -//.word 0xa0b3756d -//.word 0x3c595787 -//.word 0xea9ce41f -//.word 0xa61a92e2 -//.word 0x3c0320a0 -//.word 0x07cc7ca2 -//.word 0xff28e33f -//.word 0xf3344aaa -//.word 0x12f1fd0e -//.word 0xb0f886dd -//.word 0x4769d065 -//.word 0xbc258ca4 -//.word 0xe43dd45d -//.word 0x47aa0e6b -//.word 0x243e1456 -//.word 0xb5da9224 -//.word 0xb3e2af71 -//.word 0x1deeefc2 -//.word 0x36c25717 -//.word 0xcd81d3bf -//.word 0xc01dd670 -//.word 0xc3124097 -//.word 0x5e5484ed -//.word 0x35850a4b -//.word 0x8c6cd2bf -//.word 0x0aa35bdf -//.word 0xbd8fc35d -//.word 0x5f952fdc -//.word 0xd88b6d02 -//.word 0x036dd8cf -//.word 0xb5527c2d -//.word 0xfc9e7bc8 -//.word 0xa478b01f -//.word 0x007f91dc -//.word 0xe7b85a60 -//.word 0xfccb68a3 -//.word 0x3270e23b -//.word 0x90249fba -//.word 0x3220443d -//.word 0x918bad42 -//.word 0x04ef8fba -//.word 0x86ea5b60 -//.word 0xb9266548 -//.word 0x2b8a45bb -//.word 0xd8b27d42 -//.word 0xf19d5d01 -//.word 0xdca62446 -//.word 0x7cb66862 -//.word 0xb2b7b8b8 -//.word 0x244c7f13 -//.word 0x3dbf2b3d -//.word 0x753b8fcd -//.word 0xd23b8640 -//.word 0xae42da4b -//.word 0xbccd6470 -//.word 0x468574d0 -//.word 0xb8ba7340 -//.word 0x620dc69e -//.word 0x7a6cf666 -//.word 0x60440e80 -//.word 0x26f1455c -//.word 0x507add41 -//.word 0xd87b4be2 -//.word 0x76629833 -//.word 0x1ede077a -//.word 0xc995f8a9 -//.word 0x78160ceb -//.word 0x760e8a7d -//.word 0xdebe02bf -//.word 0x5eac308b -//.word 0x3a9922c5 -//.word 0x94b49d33 -//.word 0xea0dbe8f -//.word 0xe04cdddb -//.word 0x40a3b6f5 -//.word 0x3f01cb6b -//.word 0x02890490 -//.word 0x604299d0 -//.word 0xea103140 -//.word 0x28e34c79 -//.word 0x262edea7 -//.word 0x2f9b3cdd -//.word 0xd9fd3cac -//.word 0x428598f3 -//.word 0x983a94f8 -//.word 0xdfa3e1b8 -//.word 0xeec6c07c -//.word 0xbb576bad -//.word 0xd929b0e9 -//.word 0x3fe8df56 -//.word 0x4b0ae637 -//.word 0x0703bbbd -//.word 0xaab8fa1f -//.word 0x6237d0ed -//.word 0x50a517a1 -//.word 0xd477c277 -//.word 0x0ce67c7e -//.word 0x979c8cef -//.word 0x9fb4fcbe -//.word 0x16e1fa70 -//.word 0x3fed7e2c -//.word 0x71662d14 -//.word 0x18947ed6 -//.word 0xfcad1b7d -//.word 0xc64c8a8e -//.word 0xc0200c50 -//.word 0xdce1c56b -//.word 0xf8891eb4 -//.word 0x60c06848 -//.word 0x9498c2d8 -//.word 0x4c7a3c43 -//.word 0xba613c6a -//.word 0x0f452140 -//.word 0x40db2720 -//.word 0x0a7b8a64 -//.word 0x3461ef33 -//.word 0x1419ff9a -//.word 0x543555de -//.word 0xf6419a11 -//.word 0x96f9eee4 -//.word 0xefb98abc -//.word 0xa134a408 -//.word 0x326993d1 -//.word 0x52d33492 -//.word 0x63e08c4b -//.word 0x38a5afd1 -//.word 0x1dd0e068 -//.word 0x18def993 -//.word 0x6f8e0e2b -//.word 0x6a954daf -//.word 0x5a9328db -//.word 0xda46b77c -//.word 0x55fd5782 -//.word 0xc9509857 -//.word 0xca0f566f -//.word 0xc9782521 -//.word 0x96adf3b5 -//.word 0x2465e8be -//.word 0x8de191aa -//.word 0x55223e97 -//.word 0xf359a868 -//.word 0x8d9fd718 -//.word 0x04e6434f -//.word 0x302f3a33 -//.word 0x6dfe8181 -//.word 0x560b3edc -//.word 0xd03b1565 -//.word 0x4bce928b -//.word 0x44dac725 -//.word 0x0ef836be -//.word 0xd33df12f -//.word 0xd66cff74 -//.word 0xfa6902b8 -//.word 0x88f117b2 -//.word 0x2d89fe34 -//.word 0x42b47b01 -//.word 0x5069fbe0 -//.word 0xd4c47bee -//.word 0x3ffca638 -//.word 0x41953d89 -//.word 0x47d7bc81 -//.word 0x437e3be7 -//.word 0xabb39240 -//.word 0xc43bc0a1 -//.word 0x20ef8ec1 -//.word 0x656c6f52 -//.word 0x510bab92 -//.word 0xfb14bc1d -//.word 0x5c2ef805 -//.word 0x0d1a7124 -//.word 0x52a11ab1 -//.word 0x58cb2b12 -//.word 0xbb52c6f1 -//.word 0x4b56da92 -//.word 0x10524864 -//.word 0x8c4f44d6 -//.word 0x3f58fe6b -//.word 0x712d8211 -//.word 0x2b3cddaf -//.word 0x87cc82fd -//.word 0x297cec98 -//.word 0x0eec8456 -//.word 0x85bac4d6 -//.word 0x7ab09d5c -//.word 0xfa3b16dc -//.word 0xf41f3755 -//.word 0x3d6a2561 -//.word 0xd7a68e09 -//.word 0x735347dd -//.word 0x34953445 -//.word 0xb6296912 -//.word 0x4f9d8e58 -//.word 0x95c18880 -//.word 0x20595699 -//.word 0x911438ef -//.word 0xd2c217df -//.word 0xa0c121e9 -//.word 0x47b8b407 -//.word 0xad887d3d -//.word 0x9280e172 -//.word 0x16d19b7e -//.word 0x7c41a784 -//.word 0x2d235f82 -//.word 0x0086e526 -//.word 0xb8adc0e4 -//.word 0xcfbfca45 -//.word 0x72c04982 -//.word 0xccc05c51 -//.word 0x875299ff -//.word 0x9040f4bf -//.word 0x1b7de242 -//.word 0xe85bbf87 -//.word 0xc4fe6df5 -//.word 0x52113fa7 -//.word 0x0bb71507 -//.word 0x84c5c89e -//.word 0xef2ec82a -//.word 0xe5bf03f1 -//.word 0x630c0956 -//.word 0x12aa6eaa -//.word 0xcb9e7044 -//.word 0x5a16dad4 -//.word 0x825729f4 -//.word 0x42f7ec00 -//.word 0x574c7128 -//.word 0x02249dc3 -//.word 0x0bb61ce6 -//.word 0x06d9bb36 -//.word 0xd57411fa -//.word 0x6e366575 -//.word 0xdf87cc72 -//.word 0x8fbe9220 -//.word 0xc694db20 -//.word 0x6fd88add -//.word 0x1d65621c -//.word 0x4d526bd4 -//.word 0xeb68983f -//.word 0x17d9a631 -//.word 0x282e47a9 -//.word 0xf18280a5 -//.word 0x44ee503b -//.word 0xb54492e6 -//.word 0xa000241e -//.word 0x6e7b492b -//.word 0x13624c3a -//.word 0xdb6767b1 -//.word 0x6736e2c0 -//.word 0xf2ab7f38 -//.word 0xda4216a1 -//.word 0x5bcf7d87 -//.word 0x9d6faa14 -//.word 0xf1be1ce4 -//.word 0x574a7714 -//.word 0x45486e9c -//.word 0xa386e5df -//.word 0x1aa15781 -//.word 0x8e787679 -//.word 0xe9e01267 -//.word 0x1b9a3c27 -//.word 0x5f82aba6 -//.word 0xbf085ff4 -//.word 0xdae4839b -//.word 0xe5069830 -//.word 0xf0ccd027 -//.word 0x6a78b8eb -//.word 0xe8e11a2f -//.word 0x2269227e -//.word 0x3e2ebf1a -//.word 0x52854c03 -//.word 0x24a47056 -//.word 0x349e43d8 -//.word 0xfc95b2d3 -//.word 0x762a2421 -//.word 0xdf395e86 -//.word 0xbbc4a343 -//.word 0x192c20e7 -//.word 0x18a78869 -//.word 0xaaeefc74 -//.word 0x98362d02 -//.word 0xc662c42c -//.word 0xb9770240 -//.word 0x5650a315 -//.word 0xec93099b -//.word 0x75e396b6 -//.word 0x19575a4d -//.word 0xf42bee9e -//.word 0x19b69fd4 -//.word 0xd79ccfdb -//.word 0x3b459973 -//.word 0xd58eb483 -//.word 0xbfbe9ab0 -//.word 0xdcbbe92f -//.word 0x5e7e09d7 -//.word 0x8bc40f7b -//.word 0xc006e176 -//.word 0xb6ac9b87 -//.word 0x047e32e0 -//.word 0xe55b5879 -//.word 0x3c2d9faa -//.word 0xd51ce0f9 -//.word 0xee02de31 -//.word 0xf61f27b4 -//.word 0x940f3b11 -//.word 0xebf8f0d9 -//.word 0x1d0815af -//.word 0x0d1f569f -//.word 0x6ac85fb1 -//.word 0xe96e45bd -//.word 0xd1cd2180 -//.word 0xbda6fef0 -//.word 0x9db7f5cd -//.word 0xffea9679 -//.word 0x8dcd8a09 -//.word 0xd642779c -//.word 0x517824eb -//.word 0x9e19de22 -//.word 0x10c51aef -//.word 0x69c05bd8 -//.word 0xe4e756d1 -//.word 0x79e9540e -//.word 0x5cb3d916 -//.word 0xc72c8319 -//.word 0xf9233483 -//.word 0x7f8574d1 -//.word 0xb2d410a3 -//.word 0x81d40713 -//.word 0x7088a746 -//.word 0xe15cf440 -//.word 0x92a449fd -//.word 0x684542bd -//.word 0x6bb2d89f -//.word 0x111bce71 -//.word 0xbfe14dc7 -//.word 0x8d4ccb4a -//.word 0x4a803153 -//.word 0xc0ad3cb9 -//.word 0x388723e7 -//.word 0x41f67b31 -//.word 0xae0e5868 -//.word 0xde41b6ab -//.word 0x40d31781 -//.word 0x158f6d25 -//.word 0x78b93921 -//.word 0x9c43f51e -//.word 0x5643b0fb -//.word 0xdba5f81c -//.word 0xca1dfc05 -//.word 0x6d60f227 -//.word 0x3c94b7f9 -//.word 0xa205b54b -//.word 0x04190ad8 -//.word 0x0086e71a -//.word 0xf2c23562 -//.word 0xbdbc7f27 -//.word 0xc8c90c9e -//.word 0x46e14b8c -//.word 0xbb0b7559 -//.word 0xbb166d65 -//.word 0xf58aeb9f -//.word 0x71ded953 -//.word 0x16ebfd43 -//.word 0x6fa1d9fa -//.word 0xaff9cf5d -//.word 0xf22a8983 -//.word 0xc52098c6 -//.word 0xe92a5b1a -//.word 0x54f3239e -//.word 0x79b39471 -//.word 0xc9a64fc7 -//.word 0x7abece3c -//.word 0x87958e68 -//.word 0xf8a574b3 -//.word 0x63bb6a6a -//.word 0xb3a94913 -//.word 0x283bfbfe -//.word 0x9f6de11d -//.word 0x14db7215 -//.word 0x65792595 -//.word 0x588491e7 -//.word 0xe0b9d3c5 -//.word 0x9cc4316d -//.word 0xa1fbfdf8 -//.word 0x794cbbe7 -//.word 0x6b7486ff -//.word 0xfd72af57 -//.word 0xb83ca8af -//.word 0x2bb02003 -//.word 0x33cd7060 -//.word 0x792336f7 -//.word 0x3b883f70 -//.word 0x500dab80 -//.word 0x66314bbe -//.word 0x8f544eb2 -//.word 0xfc6e1d2f -//.word 0x070083e3 -//.word 0x774b112d -//.word 0x00c1c12e -//.word 0x0ab9d923 -//.word 0xb46612f2 -//.word 0x170afa02 -//.word 0xcf679750 -//.word 0xb8764dc0 -//.word 0xf55c01b1 -//.word 0x379a7fd3 -//.word 0x3b84193d -//.word 0x95f491ba -//.word 0xad3f3a64 -//.word 0x07685975 -//.word 0xc794d159 -//.word 0x74be0008 -//.word 0xfcace492 -//.word 0xf82282fb -//.word 0x3255884a -//.word 0x64a231dd -//.word 0x438069ff -//.word 0xbcb432bd -//.word 0x7ec446f5 -//.word 0xb8adfdaf -//.word 0x24d872b0 -//.word 0x444be14d -//.word 0xec1d547e -//.word 0x002c7f33 -//.word 0x7f12e8eb -//.word 0xc0544b82 -//.word 0xfcdd3c4a -//.word 0x0dab0e5e -//.word 0x75c9f433 -//.word 0xa27d6670 -//.word 0x71c2c600 -//.word 0xf0f84465 -//.word 0x68dbff4f -//.word 0x9bb26c6d -//.word 0x4ac8fc83 -//.word 0xfa20f9bd -//.word 0xf865b143 -//.word 0x9b20d70d -//.word 0xc92e26f9 -//.word 0xbc70471a -//.word 0x06c4f553 -//.word 0xd3345f25 -//.word 0x6f6ecec6 -//.word 0x08748773 -//.word 0xb495f306 -//.word 0xb69cfdcb -//.word 0xfd47bc90 -//.word 0xedfb52fb -//.word 0x62b51421 -//.word 0xf244eb53 -//.word 0x73b6f93b -//.word 0xbd108029 -//.word 0xb14200a7 -//.word 0x7b59a053 -//.word 0x13f7cfee -//.word 0x0a002bb0 -//.word 0x8397a2de -//.word 0x8049d79f -//.word 0x5f87c70c -//.word 0xa45aac86 -//.word 0xf852224c -//.word 0x72c0884c -//.word 0x1624a93a -//.word 0x9be99be0 -//.word 0x7250e8b5 -//.word 0x03abecb0 -//.word 0x3acb7e5e -//.word 0x42bbd333 -//.word 0x90af9e1e -//.word 0x24377c5f -//.word 0x0bb8909d -//.word 0x291d6a33 -//.word 0x35ca2ecc -//.word 0x05d1f22f -//.word 0x0c69675c -//.word 0x219cbcd7 -//.word 0x813fbf44 -//.word 0x18274634 -//.word 0xfc9acd3f -//.word 0x3b046053 -//.word 0xd6ebbc4b -//.word 0x0d25b1c3 -//.word 0xdd49ca2b -//.word 0xc863301b -//.word 0xd4eccce6 -//.word 0xd6f9ac72 -//.word 0xf0b2a847 -//.word 0x590645e5 -//.word 0x5c9dd95b -//.word 0xa40ef015 -//.word 0xb653eff6 -//.word 0xbf7af7a7 -//.word 0x909c0c2e -//.word 0xe71377c2 -//.word 0xf0e868dd -//.word 0x0b8be094 -//.word 0xd0c7ce24 -//.word 0x50f479cd -//.word 0x9e6f1de3 -//.word 0x8f47d922 -//.word 0xbd39c842 -//.word 0xd2df6fcb -//.word 0x0324572b -//.word 0xdafbfa05 -//.word 0x3951e4cd -//.word 0x9c3f1292 -//.word 0x9e859e1a -//.word 0xbf349e34 -//.word 0x64aa494a -//.word 0x1fc35b36 -//.word 0x314ebb56 -//.word 0x4dbe5be3 -//.word 0x9f22607e -//.word 0x0d58840c -//.word 0xbd7db8c4 -//.word 0xd7a70d86 -//.word 0x8cd7d46f -//.word 0x572904aa -//.word 0x824edd89 -//.word 0xed3ccbd4 -//.word 0x0b248d61 -//.word 0x2da596e4 -//.word 0x033fb409 -//.word 0x5f0aefc0 -//.word 0x3da8b4d8 -//.word 0x017833d0 -//.word 0xff0c05ea -//.word 0x40de1280 -//.word 0x833eb29b -//.word 0x838f12c2 -//.word 0x78b3da10 -//.word 0xe0c40c8a -//.word 0x7f052faf -//.word 0xa518ae50 -//.word 0xaf717ba1 -//.word 0xd00af791 -//.word 0x12581657 -//.word 0x977fbe4d -//.word 0x25c27102 -//.word 0xe23d2c8a -//.word 0x5bd68f19 -//.word 0xcb713dd1 -//.word 0x9b6386d7 -//.word 0x252944ac -//.word 0xbd5b02bb -//.word 0xf2db642e -//.word 0x1152c306 -//.word 0xebdd176b -//.word 0xd8031a40 -//.word 0xfcebaafb -//.word 0xc9cb6fb4 -//.word 0xc5a4bf7b -//.word 0x8e2dbeef -//.word 0x1b0cca0d -//.word 0x444c1645 -//.word 0x850c94d3 -//.word 0xff74194c -//.word 0xbfeebc77 -//.word 0x43927f5f -//.word 0x3ae131a6 -//.word 0x8cb7921c -//.word 0x9a7bb990 -//.word 0xc799b3e7 -//.word 0x37326d6b -//.word 0xd712d365 -//.word 0x9de23aed -//.word 0x119efb01 -//.word 0x0c4a61d5 -//.word 0xbfe1c66a -//.word 0xf88ff862 -//.word 0xa11fe213 -//.word 0x89b768da -//.word 0x68c392b1 -//.word 0x1d2fed04 -//.word 0x39d92ec1 -//.word 0xc14619af -//.word 0x3094a100 -//.word 0xbcaf5129 -//.word 0xdac8eaf1 -//.word 0x04034ec8 -//.word 0xba709c5b -//.word 0xc73d9d65 -//.word 0xc52a5fc8 -//.word 0xe33c1fdc -//.word 0xe6b66c07 -//.word 0x6e458a8e -//.word 0x7b7b15aa -//.word 0x2f7ee6df -//.word 0xd6023b89 -//.word 0x237411b8 -//.word 0xbc78d53d -//.word 0xfa963c05 -//.word 0xe93070a6 -//.word 0x97b86c38 -//.word 0x8b20a966 -//.word 0x9391fac4 -//.word 0xc35fb464 -//.word 0xba3d13a4 -//.word 0x27add949 -//.word 0x8cbb38d2 -//.word 0x42ebf206 -//.word 0xbe70bfd0 -//.word 0x129eef4c -//.word 0xb6a25022 -//.word 0x89715213 -//.word 0x13fe69d1 -//.word 0x0db0b314 -//.word 0x2313dbea -//.word 0xf8ce3d4e -//.word 0x6bd54bfd -//.word 0x19df2f85 -//.word 0x221bb29f -//.word 0x311e5cbe -//.word 0xb620dce8 -//.word 0x7669abc5 -//.word 0x4606edf6 -//.word 0x13c098a7 -//.word 0x264fd768 -//.word 0xa6cab138 -//.word 0x5f62e6e3 -//.word 0xc150198f -//.word 0x2c0c3491 -//.word 0x6bc00985 -//.word 0x7efc359d -//.word 0x9cab4a39 -//.word 0x78462db8 -//.word 0xc447bc8e -//.word 0xf3e1b497 -//.word 0x44eed2ac -//.word 0xfc293973 -//.word 0xf29d147b -//.word 0x515d7c88 -//.word 0x9a769c2b -//.word 0xe8221396 -//.word 0x783e99af -//.word 0x68fee663 -//.word 0xbfe0d03d -//.word 0xaedeb337 -//.word 0x16e815d0 -//.word 0x49918a5e -//.word 0x1509d6a6 -//.word 0xff4b52aa -//.word 0xcc9791c2 -//.word 0x462342ee -//.word 0x3c0e586b -//.word 0xcb956984 -//.word 0xdc8954ab -//.word 0xee0027c8 -//.word 0x164c40d1 -//.word 0x4329b29b -//.word 0xc73aeaf0 -//.word 0x13b792e1 -//.word 0xc260b55d -//.word 0xdab52403 -//.word 0x4e681935 -//.word 0xc7131b6e -//.word 0xa32721d5 -//.word 0x3e24fa12 -//.word 0x7110ec60 -//.word 0x59229ce3 -//.word 0x5abe2d3d -//.word 0x63a6ac5c -//.word 0x736eac95 -//.word 0x5c302df7 -//.word 0xc782c3d9 -//.word 0x78a5f4b6 -//.word 0xd3ffe13b -//.word 0x9fcb299d -//.word 0x0b100a30 -//.word 0xeecfc936 -//.word 0x538154f4 -//.word 0x35c1270c -//.word 0x87456c06 -//.word 0x78126630 -//.word 0xf4f00fa8 -//.word 0x6e1c00b7 -//.word 0xdd3e9260 -//.word 0x049a4339 -//.word 0xf78a5b7a -//.word 0xdb2ccf54 -//.word 0xed586584 -//.word 0xc6d51927 -//.word 0xddccbfd0 -//.word 0x4d7cebd8 -//.word 0xd8300ef5 -//.word 0x2c6ee10e -//.word 0x6672074e -//.word 0xd5dbee78 -//.word 0x00a3f67a -//.word 0xea54d544 -//.word 0x94793ada -//.word 0xc453b0a8 -//.word 0x05cec517 -//.word 0xefb36c5d -//.word 0xa81fa199 -//.word 0xab344b1f -//.word 0xc80e6610 -//.word 0x6cf9612f -//.word 0x23e1c5ef -//.word 0x5b0a18d1 -//.word 0x6b0101ec -//.word 0xd4d2adcd -//.word 0xc67b7082 -//.word 0xe6a1b0f2 -//.word 0x4e82ff70 -//.word 0xd52b878f -//.word 0x91eaab37 -//.word 0x9b07ebf8 -//.word 0x12af089f -//.word 0x63316907 -//.word 0xc76dbe32 -//.word 0x0d88e398 -//.word 0x99e507bf -//.word 0xad510d0c -//.word 0xe77e32d9 -//.word 0x0bb3f1c8 -//.word 0x03c12456 -//.word 0x24396bb3 -//.word 0xb3dcd1d1 -//.word 0xa853adba -//.word 0xb121c728 -//.word 0x7ad5bc4f -//.word 0x2c84a4fe -//.word 0x3476f1e6 -//.word 0x45209a39 -//.word 0xa0527a78 -//.word 0x93b2f386 -//.word 0x3f69d600 -//.word 0x9f1c87d1 -//.word 0xc61e5c00 -//.word 0x68e447cd -//.word 0x9cb9b5fd -//.word 0xe0b2b572 -//.word 0x5ee55dfe -//.word 0x6ed66979 -//.word 0x5b322611 -//.word 0x6ac08fe2 -//.word 0x1894b5c7 -//.word 0xa486646f -//.word 0xcde203b3 -//.word 0xdd61bc26 -//.word 0xe658ddee -//.word 0x4c307ed3 -//.word 0x83166596 -//.word 0x1af32684 -//.word 0xf99f8e4a -//.word 0xe752420b -//.word 0x4f5ba4b0 -//.word 0x4314f680 -//.word 0xc115c2f0 -//.word 0x35a879bc -//.word 0x407d5a36 -//.word 0xb89f95de -//.word 0xf0a7b134 -//.word 0x39302bca -//.word 0xa88a609d -//.word 0x1ab3aca5 -//.word 0x7682d4ab -//.word 0x3226a15b -//.word 0x19cfce9a -//.word 0x4bab251a -//.word 0x8514e42b -//.word 0xa20865d4 -//.word 0x62d9fe22 -//.word 0x6b2527c0 -//.word 0x8d09dac8 -//.word 0x4a9240d9 -//.word 0x9674896a -//.word 0xdbff1b5d -//.word 0x404ef0d7 -//.word 0x2bc23950 -//.word 0x04af48e6 -//.word 0x3d54acf7 -//.word 0x8f119eee -//.word 0x86d49c5d -//.word 0x3fd5534d -//.word 0x7183c2d2 -//.word 0xaabd9de2 -//.word 0xdb46ef66 -//.word 0x17730492 -//.word 0x98278672 -//.word 0x0301e6c6 -//.word 0xecd4fd10 -//.word 0x9d58f4eb -//.word 0x131f619e -//.word 0x4acab2f1 -//.word 0xbb7ccf40 -//.word 0x228ffbcd -//.word 0x8486fb5a -//.word 0x71437bf8 -//.word 0x877bad1a -//.word 0x376633ed -//.word 0xccbb3fec -//.word 0xa8dbf9af -//.word 0xd14c2103 -//.word 0xad6af540 -//.word 0x0a5955d7 -//.word 0x613e252b -//.word 0x5caff3a2 -//.word 0x9568d9fb -//.word 0xa13fa5e2 -//.word 0x4d5a38c1 -//.word 0x279f2cda -//.word 0x416cba93 -//.word 0x3188da10 -//.word 0x5c5aab07 -//.word 0x755916d0 -//.word 0x40c4aebc -//.word 0x9c93dba8 -//.word 0xc0ad38d2 -//.word 0xc55b39eb -//.word 0x65fd116d -//.word 0x02fcd32e -//.word 0xe9ffd736 -//.word 0xd9625fcd -//.word 0xbfe47ad9 -//.word 0xc49f2967 -//.word 0x893ec188 -//.word 0xb16a905e -//.word 0xa185c376 -//.word 0x839b8758 -//.word 0x91956f5d -//.word 0x90b016c1 -//.word 0x9a2e05f9 -//.word 0x214cd747 -//.word 0x31739b8b -//.word 0xf5b2795c -//.word 0x7d6c9957 -//.word 0xbe4e40b7 -//.word 0xdb843c27 -//.word 0xa32d83d4 -//.word 0x5a0c17c5 -//.word 0xbc802c6f -//.word 0x3fb68d84 -//.word 0x991d3c0d -//.word 0x821a58b8 -//.word 0xbbfe4473 -//.word 0x4f350639 -//.word 0x19bfed2c -//.word 0x86e577e5 -//.word 0x9c247108 -//.word 0x3b6e601b -//.word 0xa3922098 -//.word 0x37f8cb40 -//.word 0x8191ddb3 -//.word 0x750e953e -//.word 0xfa509ef4 -//.word 0xa620ee00 -//.word 0xc921ef39 -//.word 0xae02dcf7 -//.word 0x1df86e25 -//.word 0x246cb998 -//.word 0x18f1509f -//.word 0xd678b0dc -//.word 0x4ec7dc52 -//.word 0x432744be -//.word 0x4c5deb2b -//.word 0x1fdcc9c1 -//.word 0x0e396fde -//.word 0xd2dfe968 -//.word 0x8804e861 -//.word 0xf9dc21bb -//.word 0x1e0cf06e -//.word 0xe46141c9 -//.word 0x2cc2b005 -//.word 0x1663ef20 -//.word 0x7f3c68e9 -//.word 0xc8ba2457 -//.word 0xd9b4ec1e -//.word 0x66a0ae84 -//.word 0x71072271 -//.word 0x1136acc6 -//.word 0x713785f0 -//.word 0x1bff16bd -//.word 0x77e9a46e -//.word 0x8e63320d -//.word 0x14e7a301 -//.word 0xa62e20df -//.word 0x50a0b983 -//.word 0x520e4f60 -//.word 0x24a3b114 -//.word 0xb718053f -//.word 0xfe286a96 -//.word 0xad44db33 -//.word 0x4187562f -//.word 0x40ec3e73 -//.word 0xc2bfffcb -//.word 0x3051f03d -//.word 0x4cf07d98 -//.word 0x7116854f -//.word 0x1ce10188 -//.word 0xacc3e771 -//.word 0x667b4ed3 -//.word 0xbc44d2e9 -//.word 0xcf4c3a72 -//.word 0x32675805 -//.word 0xf10531a5 -//.word 0xd2625e95 -//.word 0xdafcb26d -//.word 0x134a1d6e -//.word 0x8dabd013 -//.word 0xa39da2e8 -//.word 0x7f2fb39f -//.word 0xe1b94f61 -//.word 0x1bca1562 -//.word 0x616258b8 -//.word 0x3f61c56d -//.word 0x6b4046d3 -//.word 0xbdff2717 -//.word 0x7c5e7819 -//.word 0xdb50b27b -//.word 0xc3ad9df9 -//.word 0xd32770f8 -//.word 0xa67f3a61 -//.word 0x54f982af -//.word 0x3b0d2a47 -//.word 0xff5f9a08 -//.word 0xcff11a24 -//.word 0xea977e2e -//.word 0x62ac0974 -//.word 0x20048c8e -//.word 0x2921ce37 -//.word 0x20aa305c -//.word 0x0b189173 -//.word 0x5ab3700e -//.word 0x25bd50b0 -//.word 0xb5ed61df -//.word 0x461f5c7a -//.word 0x0b49af4d -//.word 0x73b1dae3 -//.word 0xab5d199b -//.word 0x64cb43fe -//.word 0xd6e3f250 -//.word 0x042ae465 -//.word 0x4238a1b7 -//.word 0xf56c5eb5 -//.word 0x9bde225d -//.word 0x0b95270c -//.word 0xfdfb8395 -//.word 0xcc8d0791 -//.word 0x7bd768f7 -//.word 0xf7a09ced -//.word 0x9b6287dd -//.word 0xf9fdd7ca -//.word 0xd8ab2de5 -//.word 0x79377d5b -//.word 0x1f6ab772 -//.word 0xcdc7a7d4 -//.word 0x52781a2a -//.word 0x838742ed -//.word 0xc8515b79 -//.word 0xda388f64 -//.word 0xca99170d -//.word 0x46fea478 -//.word 0x1894fd59 -//.word 0xefdfe96e -//.word 0x62ac4f12 -//.word 0x32479c10 -//.word 0xcfef65b5 -//.word 0x1e874e29 -//.word 0x7a8e2aff -//.word 0xf951630a -//.word 0xf05f9c72 -//.word 0xb93e9608 -//.word 0xb35c50d7 -//.word 0x8b4873fb -//.word 0xba22ecb7 -//.word 0x4f51dbc1 -//.word 0xef73ace0 -//.word 0x1a9a83b9 -//.word 0xafb5dee6 -//.word 0xb34c7649 -//.word 0x4e7166a0 -//.word 0x16f38e59 -//.word 0x91d43aa7 -//.word 0xf4fdffd5 -//.word 0x3131e6db -//.word 0x3140cd2f -//.word 0x5e7d09dd -//.word 0x657150da -//.word 0x3ad1d795 -//.word 0x5caeb7d0 -//.word 0x5aec95ae -//.word 0x96f5820d -//.word 0x49ae2015 -//.word 0xc7ab0611 -//.word 0x059f667e -//.word 0x5816ed62 -//.word 0x7f66ebe0 -//.word 0xe4e2b408 -//.word 0x1f5246f4 -//.word 0xbca02c10 -//.word 0x3ed4a2b9 -//.word 0x6342f90a -//.word 0xaa023df2 -//.word 0x13a1168a -//.word 0x2616eca6 -//.word 0x36f84eab -//.word 0xe7ee95a0 -//.word 0xee66c487 -//.word 0x188ab3ed -//.word 0x8e6f6dc0 -//.word 0x5790d661 -//.word 0x1e7c91fa -//.word 0x36cb2012 -//.word 0xdb564d5e -//.word 0xbba8c9da -//.word 0xb5af1419 -//.word 0xe0b79cd9 -//.word 0xcf9a29db -//.word 0x133078f2 -//.word 0x020d2659 -//.word 0xb76cd149 -//.word 0x5a6679cb -//.word 0xa2682ccc -//.word 0x97e3e26f -//.word 0x9d45a6a7 -//.word 0xae29f604 -//.word 0xe7ca6dcd -//.word 0x46be9f50 -//.word 0xb2e14576 -//.word 0x3b8f9a9a -//.word 0xa416049b -//.word 0x1e6af730 -//.word 0x571b167c -//.word 0xb3859ce3 -//.word 0xd947fb1b -//.word 0x72f6c386 -//.word 0x2d12c4bf -//.word 0x07387773 -//.word 0xc99a9a72 -//.word 0xd2ad1b05 -//.word 0x16213783 -//.word 0x6716e31f -//.word 0xf48d6b04 -//.word 0x0f1c59a4 -//.word 0x33e7984c -//.word 0x45cbd9fc -//.word 0x1adc3677 -//.word 0x3a121596 -//.word 0xe33f50e1 -//.word 0x51449360 -//.word 0x3d8505af -//.word 0xa49a2a51 -//.word 0xc9480846 -//.word 0x7daf88e0 -//.word 0x9ec420d2 -//.word 0xde02af8a -//.word 0xc55da8c1 -//.word 0xfa787350 -//.word 0xbe171045 -//.word 0xb9d7fe36 -//.word 0xf91d5bd5 -//.word 0x384c4cc5 -//.word 0x5d3b9fac -//.word 0x46e6af8a -//.word 0xc5638849 -//.word 0xe8184c95 -//.word 0x7e2cd6ed -//.word 0xd63b9cfa -//.word 0xca4eda20 -//.word 0xfc0aed54 -//.word 0x6027fc2d -//.word 0xfb24de3d -//.word 0xea3938a1 -//.word 0xa58ee6d7 -//.word 0x85aa9dd0 -//.word 0x842ece46 -//.word 0x45c3cd50 -//.word 0x54513234 -//.word 0xae72807c -//.word 0x8426044c -//.word 0x3cc800f2 -//.word 0xb94009bf -//.word 0xdc7bae15 -//.word 0x4a185ac2 -//.word 0x70647c8c -//.word 0xc589e40d -//.word 0x4f0270c2 -//.word 0x6952e95e -//.word 0xc3f62864 -//.word 0xaa987df4 -//.word 0x8a8551e5 -//.word 0xb1610915 -//.word 0x551a2efd -//.word 0xd91acb89 -//.word 0x4cc11726 -//.word 0x3312541c -//.word 0x88acf71e -//.word 0x02fc091f -//.word 0x97b2cd68 -//.word 0x4071a3e8 -//.word 0xfccb2ccb -//.word 0x176caf4e -//.word 0xac95bcd1 -//.word 0x69cd0f2d -//.word 0x92d3b649 -//.word 0x48d677e8 -//.word 0x0ce86cc5 -//.word 0x7fb1f0e2 -//.word 0x6b60bf1d -//.word 0x07e75804 -//.word 0x7768a6ea -//.word 0x93eae03b -//.word 0xe951ae0c -//.word 0x058d8df6 -//.word 0xf0117425 -//.word 0xf687b8ac -//.word 0xacc22d1b -//.word 0x32f48e54 -//.word 0xb6211e9a -//.word 0x39d390eb -//.word 0x96102490 -//.word 0xc08914f2 -//.word 0x4b142eaf -//.word 0x2e5cc2ed -//.word 0xc7d7beef -//.word 0x1ff918e6 -//.word 0x70a86c09 -//.word 0xe4efe7e7 -//.word 0xa0f663fc -//.word 0x0132d383 -//.word 0x25d9e28c -//.word 0xae99d74e -//.word 0xc289bcbe -//.word 0x5660bf61 -//.word 0xade5d85e -//.word 0x1ba6acd7 -//.word 0x0fedb279 -//.word 0x51f09452 -//.word 0x8748d8e3 -//.word 0xfea4bf77 -//.word 0xa7bf6db3 -//.word 0x608f4b6d -//.word 0x75c0aac2 -//.word 0x6760a962 -//.word 0xecdc582f -//.word 0x362b1d07 -//.word 0x784957dd -//.word 0xa7e7420f -//.word 0x7e611bf3 -//.word 0xc4f084b3 -//.word 0xd121295c -//.word 0x4f85a431 -//.word 0x3eaa9e45 -//.word 0x3a4b3749 -//.word 0x01c4a8a2 -//.word 0x30c827bf -//.word 0x4d560ca9 -//.word 0x0ae931db -//.word 0xc8f09e55 -//.word 0x5b7d66ec -//.word 0x0d41cce4 -//.word 0xe5b8aac0 -//.word 0x29a11459 -//.word 0x21b1382e -//.word 0x1e8888fb -//.word 0xbbe41c8d -//.word 0x631551d4 -//.word 0x13b1b73a -//.word 0x61882a33 -//.word 0xbeda3e15 -//.word 0xf8c8e12b -//.word 0x03093b04 -//.word 0xf8ded911 -//.word 0x5e480b70 -//.word 0xa9788a02 -//.word 0x00875ec3 -//.word 0x4367ff5b -//.word 0x4d1abbf0 -//.word 0x7621573f -//.word 0x5c38f9eb -//.word 0xe4404614 -//.word 0x7b7dc72c -//.word 0xa2019106 -//.word 0xa9682530 -//.word 0xbac69583 -//.word 0x1adee8f8 -//.word 0xac95c0be -//.word 0xb7a63a89 -//.word 0xe896162c -//.word 0x9beb186a -//.word 0x5699ad09 -//.word 0x96bdd229 -//.word 0xcf8d32d4 -//.word 0xae8f8ed6 -//.word 0xa10a62cf -//.word 0x99bbc686 -//.word 0x0fc89280 -//.word 0x45fac5d2 -//.word 0xce262833 -//.word 0x50ec2e55 -//.word 0x89a41f76 -//.word 0x90967532 -//.word 0x5d69879b -//.word 0x8cdf648b -//.word 0x5ebf0239 -//.word 0x0112980b -//.word 0x119148ab -//.word 0x5e5f015d -//.word 0xf0f4a490 -//.word 0x485965b2 -//.word 0xe99b7549 -//.word 0x177ade40 -//.word 0xdf61ae7e -//.word 0x579b57be -//.word 0x27c3569a -//.word 0x487c13e8 -//.word 0x0c63084a -//.word 0x5f422601 -//.word 0x4c877402 -//.word 0xc3f4fa4c -//.word 0x9997dd78 -//.word 0xd0fdcb92 -//.word 0x19a39927 -//.word 0x97ad2b9f -//.word 0xe6da95cd -//.word 0x5cb87fc5 -//.word 0x8e14ceee -//.word 0x16b58158 -//.word 0x944ad84f -//.word 0xf3a0bc30 -//.word 0xee185b7b -//.word 0xd259132a -//.word 0x85429141 -//.word 0xc7223aa7 -//.word 0xb82cc934 -//.word 0x9a253a0b -//.word 0xd960e82a -//.word 0x48ecf23f -//.word 0xae0ce2bd -//.word 0x81e79130 -//.word 0xf18145ce -//.word 0x29ea1d4e -//.word 0xd1b6affd -//.word 0xd7acef0e -//.word 0x6fc35331 -//.word 0x584a3468 -//.word 0x61667816 -//.word 0x2dc16e59 -//.word 0x3381f99a -//.word 0x0877f163 -//.word 0xe199c670 -//.word 0x54b36608 -//.word 0x5e59618e -//.word 0xaa204b53 -//.word 0x100e63ae -//.word 0x5d4e714f -//.word 0x5228f5d0 -//.word 0xef317d8d -//.word 0xf1bf57b6 -//.word 0x99a068a2 -//.word 0xaf0c5c66 -//.word 0xc7d700a7 -//.word 0xc3ebebac -//.word 0x99f664b7 -//.word 0x56608096 -//.word 0x63808b75 -//.word 0x070fa9f6 -//.word 0x2eddbd84 -//.word 0x69c28ae4 -//.word 0x35d8190c -//.word 0x80e75a39 -//.word 0x69210d3c -//.word 0x4810e314 -//.word 0xeecce1c2 -//.word 0x2e710659 -//.word 0x9cd02d55 -//.word 0x9465352d -//.word 0x7e8a5e2c -//.word 0x51e9f67c -//.word 0x56373684 -//.word 0x2f206774 -//.word 0x177d481d -//.word 0x6bcdb407 -//.word 0x6ae380bd -//.word 0x39dca36c -//.word 0x295499ac -//.word 0x3dda099e -//.word 0xe7a0a537 -//.word 0x137751db -//.word 0x66fb882e -//.word 0xc80bfc27 -//.word 0x207d7d66 -//.word 0x5e0f1cc7 -//.word 0xbfa09037 -//.word 0x4ca0d9c6 -//.word 0xa5c523fe -//.word 0xfcffec73 -//.word 0x64af699c -//.word 0x4c1426e1 -//.word 0x4605eef5 -//.word 0x0ee6ea66 -//.word 0xc7d50c73 -//.word 0x8724af1d -//.word 0x160c7781 -//.word 0xf39f7f64 -//.word 0x98ffb310 -//.word 0xffce7a5f -//.word 0x65e59915 -//.word 0x4e495472 -//.word 0xc95ad508 -//.word 0xf54ed2cb -//.word 0xc4de6b67 -//.word 0xff3f51d6 -//.word 0x8b542d31 -//.word 0xea2240c6 -//.word 0x0484466c -//.word 0x2820a113 -//.word 0x4e99b39f -//.word 0x9f078cf7 -//.word 0x37a4c558 -//.word 0x29c7abf0 -//.word 0xc317a1a8 -//.word 0x14f8bf41 -//.word 0xac4abfa2 -//.word 0xa3531a70 -//.word 0xddf96ee0 -//.word 0x8b3523c9 -//.word 0xf5c44efe -//.word 0x7820d5da -//.word 0xcaaed51c -//.word 0x863940f5 -//.word 0xe49fcb60 -//.word 0xc7ca07b2 -//.word 0xfee2cd72 -//.word 0xc3c1e06a -//.word 0x88a8cefe -//.word 0xf43017bd -//.word 0x28839136 -//.word 0x46cb0b0d -//.word 0x34eb314e -//.word 0x9d6eb000 -//.word 0x39bc9afe -//.word 0x4f940b02 -//.word 0x78b60d03 -//.word 0xa5e0b9c1 -//.word 0x63fc9f9e -//.word 0x5e9868af -//.word 0x2496ba13 -//.word 0x2c255c83 -//.word 0x17f09b2b -//.word 0x3595ecb8 -//.word 0x4b58d2b3 -//.word 0x9419020d -//.word 0x0583c6fb -//.word 0xd5879f04 -//.word 0x3d082e57 -//.word 0x7dd85463 -//.word 0x1fe499a2 -//.word 0x7fabcab5 -//.word 0x8bf5e6b6 -//.word 0xc8c13cca -//.word 0x967fcdf5 -//.word 0xb47ff733 -//.word 0x06aa55c4 -//.word 0x9670e1c7 -//.word 0xda015b0a -//.word 0x35c0ef21 -//.word 0xbff412b5 -//.word 0x49c1ad1f -//.word 0x9c587d35 -//.word 0x026ab964 -//.word 0x08e2f600 -//.word 0x81d349d7 -//.word 0xceafab0c -//.word 0x5dbba123 -//.word 0x70bf1c58 -//.word 0x20029d35 -//.word 0xa1759e63 -//.word 0xc72f2ec1 -//.word 0xc919dbb3 -//.word 0x46ebd4bd -//.word 0x85574f50 -//.word 0x018329e3 -//.word 0x25bdcc46 -//.word 0x546b5633 -//.word 0x2c40f827 -//.word 0x0cb69b6f -//.word 0xd3b8ca86 -//.word 0xeb9ecc9e -//.word 0x875f107d -//.word 0x2802cf8a -//.word 0x6656ec28 -//.word 0xede31f42 -//.word 0xc6205227 -//.word 0xd8e74b99 -//.word 0xae258c20 -//.word 0x7ad677a5 -//.word 0x5a31b63b -//.word 0xdb1fda40 -//.word 0xbcf242a5 -//.word 0xf4543f8a -//.word 0xf57d750e -//.word 0x33aa8565 -//.word 0xe0cae92b -//.word 0xfa7a1ff7 -//.word 0x88330934 -//.word 0x21c2942c -//.word 0xadf99866 -//.word 0x70a5ff32 -//.word 0x44c02a82 -//.word 0x25e790fb -//.word 0xf30ea84c -//.word 0x74720abf -//.word 0x99cfd10d -//.word 0x02d34377 -//.word 0xc3d3b412 -//.word 0x69bea763 -//.word 0x384f372b -//.word 0xb786b584 -//.word 0x6f58932d -//.word 0xefa68023 -//.word 0x136cd571 -//.word 0x863b3048 -//.word 0x86e95e52 -//.word 0xe7877f44 -//.word 0x5b9364b3 -//.word 0xf06f3c28 -//.word 0xda127076 -//.word 0x73fecb4b -//.word 0x8071de06 -//.word 0xb6e0a3c8 -//.word 0x7da160ce -//.word 0xf3e8cefe -//.word 0x34f47bbf -//.word 0xd98a6d0e -//.word 0xbea308cf -//.word 0x09623260 -//.word 0x6748b474 -//.word 0x99abe31f -//.word 0x3064812d -//.word 0x94c9deb8 -//.word 0x4bdb42fa -//.word 0x78c08f5f -//.word 0xa27323de -//.word 0xb7bafc8a -//.word 0x51581f64 -//.word 0x37843a74 -//.word 0x279b8818 -//.word 0xd312f59b -//.word 0x29ae8309 -//.word 0xd7f7ec42 -//.word 0x0fea894e -//.word 0x87ee72f0 -//.word 0xc509e77e -//.word 0x9954eeef -//.word 0xebac3e36 -//.word 0xb6ab5ccf -//.word 0x55d60497 -//.word 0xfe18cae0 -//.word 0x8c7001c5 -//.word 0x81e6dcbb -//.word 0x4bc3d369 -//.word 0xc60148ba -//.word 0x03016b30 -//.word 0x487c5b7b -//.word 0x57bc8e4a -//.word 0xf30c7261 -//.word 0xa16d54eb -//.word 0xac8a8212 -//.word 0x6beeacce -//.word 0xc67590fa -//.word 0xf700d7ad -//.word 0x8e6d39c7 -//.word 0xb8c7e8ca -//.word 0xc0b92cec -//.word 0xd6494a6a -//.word 0x10c3ab1e -//.word 0xaef23a54 -//.word 0xa2960eda -//.word 0x50134956 -//.word 0x926740dc -//.word 0xff5edcc0 -//.word 0x6d0940a9 -//.word 0xb46cabe7 -//.word 0xb577a007 -//.word 0x9b3845a4 -//.word 0x614e0a80 -//.word 0x95a18ad3 -//.word 0x5b50b6e2 -//.word 0xb4eb30d4 -//.word 0x00e3f5c1 -//.word 0xc23e3f0d -//.word 0xa48faaf4 -//.word 0xbb269565 -//.word 0x0b84cb14 -//.word 0x4e1263cb -//.word 0xf112e400 -//.word 0x60d5adad -//.word 0x832e945c -//.word 0x8828ce81 -//.word 0xe4f40f0d -//.word 0x9425f140 -//.word 0xa9209abf -//.word 0x03cd99e6 -//.word 0x5d93125f -//.word 0x8a841bf4 -//.word 0xfdd465a1 -//.word 0x8f901fee -//.word 0x7d8c177c -//.word 0xb09e23dd -//.word 0x4209bfa8 -//.word 0x3d3cf7cd -//.word 0xa6bd8827 -//.word 0xba604250 -//.word 0x77bcb0b9 -//.word 0x5edffbfa -//.word 0x78410c66 -//.word 0x97f7f1e3 -//.word 0xde2982f9 -//.word 0x83c64428 -//.word 0xd4768d7f -//.word 0x78d1e96a -//.word 0xf8cebdcc -//.word 0x7e7e2a4d -//.word 0xdcfa34f6 -//.word 0xcf9a24fb -//.word 0x85672ad7 -//.word 0x5ed3479e -//.word 0xf0a86a8f -//.word 0x4d3fdae9 -//.word 0x88f2d301 -//.word 0x75d37490 -//.word 0xb19fd951 -//.word 0xe2ed84cc -//.word 0x40ab016c -//.word 0x55cbc9d8 -//.word 0x003a6880 -//.word 0xc012db76 -//.word 0x2f103c80 -//.word 0xcd48a16b -//.word 0xff1741a2 -//.word 0x585ad8ff -//.word 0x16dd4de0 -//.word 0xf017927e -//.word 0x0f14cd7a -//.word 0x5ab2b5b9 -//.word 0xf6103e72 -//.word 0x0d447885 -//.word 0xcf4cb40f -//.word 0xb747ea3b -//.word 0x10e6575b -//.word 0xb71d6a37 -//.word 0x221ee1a4 -//.word 0xa1873059 -//.word 0xe4da22ff -//.word 0xbe2fc287 -//.word 0x28257cc0 -//.word 0x891e8029 -//.word 0x35ac6704 -//.word 0x334619ab -//.word 0x4340ee27 -//.word 0x1ffa13ff -//.word 0x0257304e -//.word 0x67704718 -//.word 0x138ae0de -//.word 0x55466370 -//.word 0x8d18c503 -//.word 0xebfa6683 -//.word 0x79623a2b -//.word 0x5c712852 -//.word 0x576daf88 -//.word 0x9071cfe1 -//.word 0x97632791 -//.word 0xa4275bb9 -//.word 0x2012b881 -//.word 0x67a21b67 -//.word 0xcd6c0ed7 -//.word 0xdf5535fb -//.word 0xeb05e9d4 -//.word 0xc299228a -//.word 0xbc989a00 -//.word 0xfd292fac -//.word 0xf78389a6 -//.word 0x30a4fefe -//.word 0x4546b253 -//.word 0x300f03a1 -//.word 0xc608245b -//.word 0x835007ba -//.word 0x8a128154 -//.word 0xe8b4a9f0 -//.word 0x19518199 -//.word 0xcd6ad8f1 -//.word 0xecd86ec8 -//.word 0xd7055aed -//.word 0xf15ca944 -//.word 0x5efe4819 -//.word 0x0ab724b4 -//.word 0xed308f2e -//.word 0x8e66e683 -//.word 0xc65a70e7 -//.word 0xc70b8a5e -//.word 0x5ca10187 -//.word 0x73ebc0b8 -//.word 0xd80bab50 -//.word 0x4370ca49 -//.word 0x9505aa0d -//.word 0x5fa8008b -//.word 0xa4de9089 -//.word 0xe0c54d3c -//.word 0x484ac216 -//.word 0x549bb0df -//.word 0x7be0f907 -//.word 0x3d26bc3b -//.word 0x679bc236 -//.word 0x930119da -//.word 0xee5dfe7f -//.word 0x3eef018b -//.word 0x23676342 -//.word 0x9c56c3e0 -//.word 0xcee3f9e5 -//.word 0x01bf43b1 -//.word 0xec5b9f50 -//.word 0x32587797 -//.word 0x2c3f8370 -//.word 0xe972ec72 -//.word 0x7362adb5 -//.word 0x54033fe4 -//.word 0x597d7593 -//.word 0x9625a5d3 -//.word 0xaaab0804 -//.word 0x459463eb -//.word 0xe7ebe705 -//.word 0xea34561a -//.word 0xc2a26814 -//.word 0x848a6d12 -//.word 0xa51633b9 -//.word 0x043e2aca -//.word 0x2bf4c6fa -//.word 0xd29f25fe -//.word 0xa5cbf2e5 -//.word 0x481f89aa -//.word 0x978f5c0a -//.word 0x32d39593 -//.word 0x3917fdfe -//.word 0x54f41cbe -//.word 0xf79fa2d9 -//.word 0xe46005f7 -//.word 0xf1466cb8 -//.word 0x0b1acc4b -//.word 0x7b91503d -//.word 0x68c5ff8e -//.word 0x9de6990a -//.word 0x8d2dc1d6 -//.word 0x9412614a -//.word 0x80bf4bfe -//.word 0x50c41c28 -//.word 0x3c0c6625 -//.word 0xf5100e55 -//.word 0x2d4af22c -//.word 0x5aedcf86 -//.word 0xb7d3633b -//.word 0x8cb7cef4 -//.word 0xb0a43e3d -//.word 0x4cadcbdb -//.word 0xe1dfa05f -//.word 0x8d745cfb -//.word 0x8a49b895 -//.word 0xf793691a -//.word 0xdbcd4815 -//.word 0x67f5b080 -//.word 0x7bf727d9 -//.word 0x6c6a4179 -//.word 0x057ac222 -//.word 0xcb2503d7 -//.word 0x85ab97f0 -//.word 0xfc3f2d6d -//.word 0x0003b88b -//.word 0xab33ce95 -//.word 0xeaa04efd -//.word 0x386146ab -//.word 0xadc51495 -//.word 0x388ccb90 -//.word 0x2956d865 -//.word 0xf25be528 -//.word 0x2e5dfdc5 -//.word 0xe2dbf1dc -//.word 0x0388fbcf -//.word 0x39fba219 -//.word 0xe3a8dde1 -//.word 0x5b0f7bce -//.word 0x7b33c21e -//.word 0x604e57f2 -//.word 0x6dc35eec -//.word 0x9354e1fc -//.word 0xd0957677 -//.word 0xf6a01c6a -//.word 0xae0b672d -//.word 0xbc17dd3b -//.word 0x852a9f40 -//.word 0xce804c74 -//.word 0xc61d2228 -//.word 0x4706669e -//.word 0x59b0061e -//.word 0xf8b97e46 -//.word 0x17d6f8a2 -//.word 0xe40db77d -//.word 0x4e24b5f6 -//.word 0xc4598b56 -//.word 0x405392a0 -//.word 0x8559486a -//.word 0xa5c2f5ec -//.word 0xc5ac8e80 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x000186B8 -//// expected output -//.word 0xc51b6cba -//.word 0xe292fa00 -//.word 0x9679f7a0 -//.word 0xfde52d8e -//.word 0xee0f40b6 -//.word 0xa2f33398 -//.word 0x9a493097 -//.word 0xead9ef6e -//.word 0x9d95bd20 -//.word 0xdd54caec -//.word 0x38002f42 -//.word 0x8b828526 -//.word 0xed5a9286 -//.word 0x3b15524a -//.word 0x134f6ed8 -//.word 0x5219236b -//// SHA512LongMsgvector_126 -//// vector length -//.word 0x000189D0 -//// input message -//.word 0x095fae3b -//.word 0xd3408b63 -//.word 0x60cb9972 -//.word 0xcef30a9e -//.word 0x0943535c -//.word 0x427c3b26 -//.word 0x9d80327c -//.word 0x2a6ee529 -//.word 0x170f0fc7 -//.word 0x24719285 -//.word 0x56d1c628 -//.word 0xf0be1150 -//.word 0x9f7cb8fd -//.word 0xf5a7f451 -//.word 0x18184998 -//.word 0xbc0d1385 -//.word 0x4e8362be -//.word 0x72e7079c -//.word 0xb0eeef2b -//.word 0x6ac2b079 -//.word 0x125e620d -//.word 0x9a3bb0b5 -//.word 0x2b2c2e85 -//.word 0x1986ee1c -//.word 0x17854e29 -//.word 0xa7eb132e -//.word 0xd5eabc84 -//.word 0x254410a0 -//.word 0xcab1fa94 -//.word 0x188196d8 -//.word 0x3c828c4b -//.word 0x2b249d75 -//.word 0xd8db7b0f -//.word 0xaac5dec5 -//.word 0x2d8dd43a -//.word 0x088f584d -//.word 0x2f3d279b -//.word 0x59c1cf44 -//.word 0xb5e409f3 -//.word 0xd82e4818 -//.word 0xfa4e9278 -//.word 0x63bd8fe8 -//.word 0x209fe055 -//.word 0xfaeab108 -//.word 0xa9c99228 -//.word 0x44438281 -//.word 0xfc184d83 -//.word 0x0aeb198e -//.word 0xe6a63b6d -//.word 0xba1b4f20 -//.word 0x16e787de -//.word 0xe59c435a -//.word 0xa01fe246 -//.word 0xc14ed815 -//.word 0x7be60106 -//.word 0xa8a4365e -//.word 0x03ab1df4 -//.word 0x972645f3 -//.word 0x772e72dc -//.word 0xb0ee35ca -//.word 0x7c05c0fa -//.word 0xb82bf98a -//.word 0x9818cd81 -//.word 0x9aa2c710 -//.word 0xb825e118 -//.word 0xe2279aeb -//.word 0xab3c4857 -//.word 0x4328b0e1 -//.word 0xa544d44e -//.word 0x11230c68 -//.word 0xbd7458fe -//.word 0xc82af52d -//.word 0x6fdb2ede -//.word 0x83667590 -//.word 0x1ad9b258 -//.word 0x8692db25 -//.word 0x83a4c549 -//.word 0xb47c3a35 -//.word 0x51c44b84 -//.word 0x1a87e73c -//.word 0x8f96ad50 -//.word 0x622bff69 -//.word 0x2dcd58e5 -//.word 0x6173df20 -//.word 0x7eec3cf3 -//.word 0x8a7eaa7b -//.word 0xbcce4d1c -//.word 0x78ffc7c5 -//.word 0x801e0675 -//.word 0x68be5ffe -//.word 0x4adfe109 -//.word 0xbc15e35a -//.word 0xffe6e055 -//.word 0x797385c1 -//.word 0x655b07cd -//.word 0xcadcba50 -//.word 0xa93be055 -//.word 0x7b66bed7 -//.word 0xdbd9f6c9 -//.word 0x7fbe105a -//.word 0x6c585a76 -//.word 0x6aa1f290 -//.word 0xb632219f -//.word 0xf864ea66 -//.word 0x74b5e3f9 -//.word 0x846d447d -//.word 0x46813e2f -//.word 0x92b78ea8 -//.word 0x2f0b515f -//.word 0x46511a6f -//.word 0x161d429a -//.word 0xeae07f8e -//.word 0x4853b868 -//.word 0x6c191877 -//.word 0xf5a06242 -//.word 0xdd4884cc -//.word 0xaec76e16 -//.word 0xf3cc24e6 -//.word 0xede212c7 -//.word 0x8897a151 -//.word 0x8dde07aa -//.word 0x19b3634d -//.word 0x4efd090a -//.word 0x48b81a4e -//.word 0x535359a5 -//.word 0x5b57397d -//.word 0xa44a3b2d -//.word 0xbbd37636 -//.word 0xac1f77c8 -//.word 0x75824c88 -//.word 0xbb62dc90 -//.word 0xbc517ab7 -//.word 0x8579b913 -//.word 0x643d81bd -//.word 0xa11d62d4 -//.word 0x69da29c5 -//.word 0x0bdbb1c9 -//.word 0x67d0fcaf -//.word 0xa29582db -//.word 0x1f59c98f -//.word 0xabff3669 -//.word 0xf8c4232d -//.word 0x4d2332c5 -//.word 0x7bf6e086 -//.word 0x13dd5db5 -//.word 0xd6e39b4a -//.word 0x6d5fa4f3 -//.word 0x5b19325c -//.word 0x2fae79ae -//.word 0xfe364856 -//.word 0x10235007 -//.word 0xda6cc302 -//.word 0x2cec2295 -//.word 0xac0550e1 -//.word 0x8388eae1 -//.word 0x56d9dba8 -//.word 0x784e2aea -//.word 0x5ed917be -//.word 0x53e767a2 -//.word 0x6c87fcc0 -//.word 0xbfcfa870 -//.word 0xd07b43fd -//.word 0x4cd8fbac -//.word 0xfae1ecfa -//.word 0xeea7f126 -//.word 0x00f6b9ef -//.word 0x7c351d9f -//.word 0x1b8eb048 -//.word 0x324f984e -//.word 0x2a909d25 -//.word 0x3017805c -//.word 0x2d788edb -//.word 0xf9807469 -//.word 0xccd45571 -//.word 0xf5d61a05 -//.word 0xcec80a23 -//.word 0xef349a37 -//.word 0xa28b86e2 -//.word 0x970c20fa -//.word 0xd9e7e8d2 -//.word 0x01a35ebb -//.word 0xaabd14ca -//.word 0x249207dc -//.word 0x6d7e2fd8 -//.word 0x5c465534 -//.word 0x20b325bb -//.word 0xe980848d -//.word 0xe5772467 -//.word 0x6ed65524 -//.word 0x82f71e84 -//.word 0x73308c2d -//.word 0xdff94aef -//.word 0xe34c724c -//.word 0x8c52a338 -//.word 0x8e3b541d -//.word 0x396d6722 -//.word 0xa8e201ad -//.word 0x3ccb9a26 -//.word 0x497a50ff -//.word 0x0e7e81f1 -//.word 0xeb109888 -//.word 0xceae27e1 -//.word 0xef0537b3 -//.word 0xbd14dc8c -//.word 0x178f0c5d -//.word 0xc081b039 -//.word 0x0d36fc5a -//.word 0xe158fc65 -//.word 0xdb5870ee -//.word 0xce0fda3f -//.word 0x72a6d555 -//.word 0x59b3a82c -//.word 0x24a41b3d -//.word 0xf6618a44 -//.word 0x292d3746 -//.word 0x40cde4d3 -//.word 0x1deda289 -//.word 0x75bfe4d9 -//.word 0x80e5d70e -//.word 0xf591f68a -//.word 0x35ebd953 -//.word 0xc6b34dcf -//.word 0x0427aacc -//.word 0x132761c3 -//.word 0x1897d55e -//.word 0xa9056c37 -//.word 0x828be5e3 -//.word 0x79f7ec2f -//.word 0xb42aeba9 -//.word 0x19be2463 -//.word 0x06ecfdf3 -//.word 0x42ac9abe -//.word 0x341db177 -//.word 0x53289ae2 -//.word 0xde60a6de -//.word 0xcd2db2a2 -//.word 0x072afc47 -//.word 0xd5cb3587 -//.word 0x9743d7c4 -//.word 0xb6a5b84b -//.word 0xd949e0db -//.word 0x5c719761 -//.word 0xfe2cc306 -//.word 0xd97b716b -//.word 0x98b3b233 -//.word 0xe422a8c3 -//.word 0x1ff5e045 -//.word 0x5559e2f3 -//.word 0x6fe10792 -//.word 0xaa288b3c -//.word 0x48b7e363 -//.word 0x86295113 -//.word 0xcd8db577 -//.word 0x2c0ba69f -//.word 0x06cbc180 -//.word 0x0812413d -//.word 0x5eaed1a5 -//.word 0x27959efc -//.word 0x26c9affe -//.word 0xba7e7921 -//.word 0x107fae1b -//.word 0x97ce57a4 -//.word 0xb48a227d -//.word 0xb816fdb1 -//.word 0x0f78e31b -//.word 0xb9fff628 -//.word 0xff29cfde -//.word 0x5ec3121d -//.word 0xc8524525 -//.word 0x0cb2e259 -//.word 0x92fdaa43 -//.word 0x4baf3dd7 -//.word 0xe807e8fc -//.word 0x4ab0be48 -//.word 0x3aa0ea0b -//.word 0x5b414390 -//.word 0x5cce219f -//.word 0x72006f46 -//.word 0x06eb02da -//.word 0xab222938 -//.word 0x52228650 -//.word 0xc1ee1ce5 -//.word 0x41f6a88e -//.word 0x973d3501 -//.word 0x36bbeb90 -//.word 0xb30128f4 -//.word 0x791bd24a -//.word 0xbebaeb5b -//.word 0xb6936520 -//.word 0x06023886 -//.word 0x7bf3b36e -//.word 0xfc020ff8 -//.word 0xbde14a01 -//.word 0xb6fa33ea -//.word 0x5456c19b -//.word 0x6ebea8c8 -//.word 0x7a202e73 -//.word 0x01343bb3 -//.word 0x505eb0b3 -//.word 0x71d7fafd -//.word 0x5908e7f9 -//.word 0x6336b8b0 -//.word 0xfd6477d6 -//.word 0xa1758b08 -//.word 0x08928952 -//.word 0x9acb4df4 -//.word 0x28014a66 -//.word 0xdd031e99 -//.word 0x72f76980 -//.word 0xa2fce0cf -//.word 0xde0d9d03 -//.word 0x4128b9a2 -//.word 0xc6b01dc4 -//.word 0xb91195d2 -//.word 0x6ba2278e -//.word 0x2acfa253 -//.word 0x7077799e -//.word 0x5b93d2ce -//.word 0x5d19db28 -//.word 0x35205d1e -//.word 0x1e4493d1 -//.word 0x464c3cd4 -//.word 0x810aef33 -//.word 0x3f83afb4 -//.word 0xbc50bf5c -//.word 0x7644b735 -//.word 0xe44fd84f -//.word 0x65a29d05 -//.word 0x77149281 -//.word 0x29c56983 -//.word 0xd3014b5d -//.word 0x04676c43 -//.word 0xbc4ae2c1 -//.word 0xdb57b78d -//.word 0xda783d7f -//.word 0xb9f9a1de -//.word 0x38eac3dd -//.word 0x4ac44565 -//.word 0xc74fe315 -//.word 0x61c20288 -//.word 0xd92c8bd6 -//.word 0x7314f95d -//.word 0xa75cb1c1 -//.word 0x196c9231 -//.word 0xcb8cceec -//.word 0x9190f804 -//.word 0xc6bb5e62 -//.word 0x3ede980b -//.word 0x7bc061a2 -//.word 0x24c2a62d -//.word 0xb2c3dd1c -//.word 0x6d429887 -//.word 0x97c25ab7 -//.word 0xe773a9e8 -//.word 0x390e644d -//.word 0x83015755 -//.word 0x0bcc0d2d -//.word 0xd7abe586 -//.word 0x65756898 -//.word 0x9dc4da66 -//.word 0x04560f44 -//.word 0x32b38197 -//.word 0x86109fdd -//.word 0x187467ed -//.word 0xef19367f -//.word 0x7515dfee -//.word 0x2739fb3d -//.word 0x913a8159 -//.word 0x7a0e979d -//.word 0x5c99a79b -//.word 0x1789b41a -//.word 0xe57fef5b -//.word 0x916f85a1 -//.word 0xe449bcef -//.word 0x61d93e14 -//.word 0x32ecb4e5 -//.word 0x61b497ca -//.word 0x4b6d437c -//.word 0x52414e0c -//.word 0xd3691728 -//.word 0x5896a29a -//.word 0x0e8fa311 -//.word 0x791bd824 -//.word 0x66219c94 -//.word 0x210ebad1 -//.word 0xe9777fc0 -//.word 0xa10013bc -//.word 0xc87c09db -//.word 0xab553472 -//.word 0xd92ebcdb -//.word 0xd8c87275 -//.word 0x162261ed -//.word 0x22e5a5bc -//.word 0x1cfe81f1 -//.word 0x6b8dab31 -//.word 0xadfeeafc -//.word 0xf475e331 -//.word 0x2f7030d5 -//.word 0xe6a8b310 -//.word 0x2b382a78 -//.word 0xcd000393 -//.word 0xce4c7196 -//.word 0x17b1bf73 -//.word 0x6b38e513 -//.word 0x9abf59e0 -//.word 0xf79b2787 -//.word 0x0b8244fc -//.word 0x8ba91fbe -//.word 0x88297a5c -//.word 0xe6a77838 -//.word 0x0f34f78b -//.word 0xe8721fa9 -//.word 0x05f83b87 -//.word 0x19f8c87a -//.word 0xb01fcc41 -//.word 0x20bd6a46 -//.word 0xbc26b221 -//.word 0x4c58be5e -//.word 0xbadefa80 -//.word 0x0ef4c345 -//.word 0x9ceb342c -//.word 0x7ccf3c35 -//.word 0x3b48f4e8 -//.word 0xd0be3098 -//.word 0xd2c055e9 -//.word 0xe8a76a90 -//.word 0x8076715a -//.word 0xc405f770 -//.word 0xc95fead9 -//.word 0x0a68ab40 -//.word 0x16c364f8 -//.word 0x85f29c3d -//.word 0x30bf08bd -//.word 0xa2dba457 -//.word 0xc9c60322 -//.word 0xf1eee3b1 -//.word 0xf41b0595 -//.word 0xaa0a3c24 -//.word 0xa758c379 -//.word 0x26a3d3bc -//.word 0x40eb75a4 -//.word 0x623e9639 -//.word 0xfd9459df -//.word 0x7ff8b190 -//.word 0x83e82e69 -//.word 0x44ff1768 -//.word 0x58d1ba74 -//.word 0x9b17009d -//.word 0x690c44a6 -//.word 0x101665c0 -//.word 0x84a91a99 -//.word 0x55688695 -//.word 0xdf8e0d5b -//.word 0xc18d6594 -//.word 0x90f5f0ef -//.word 0xcc964969 -//.word 0x12e91dcb -//.word 0x94ac3c74 -//.word 0xc7cdef58 -//.word 0x5b898d49 -//.word 0x70d54976 -//.word 0x07fd4e31 -//.word 0xb68b0ef5 -//.word 0xa16ad6a7 -//.word 0xa54ba61c -//.word 0xd64841dc -//.word 0x2cc78025 -//.word 0x79a2eb33 -//.word 0x9e858abf -//.word 0xff97f9c6 -//.word 0x345cbb8b -//.word 0x02dad0df -//.word 0x89fa8aa0 -//.word 0xbe329c80 -//.word 0x1c617407 -//.word 0x97facbdc -//.word 0xd2657a40 -//.word 0x91a28fdb -//.word 0x7130a0bb -//.word 0xd72d5f9a -//.word 0x26be6f5f -//.word 0x35b176e8 -//.word 0x00617407 -//.word 0x9dda53ca -//.word 0x723ebf00 -//.word 0xa66837f8 -//.word 0xd5ce648c -//.word 0x08acaa5e -//.word 0xe45ffe62 -//.word 0x210ef79d -//.word 0x3e90272c -//.word 0x738aab87 -//.word 0xe8d80107 -//.word 0x242f1aa6 -//.word 0xc800b007 -//.word 0x7d9fdab6 -//.word 0x2ba4deb0 -//.word 0x6c924626 -//.word 0x40b6367e -//.word 0x0252fc9b -//.word 0x9afbe95e -//.word 0xf5405f6c -//.word 0xb28c2c32 -//.word 0x1e4e1627 -//.word 0x6356b751 -//.word 0xfc828c0b -//.word 0x6c9b4805 -//.word 0x307a6e8c -//.word 0xf26f1e0c -//.word 0xffe32fd3 -//.word 0xfb3b7f17 -//.word 0xd400873b -//.word 0xf43d334e -//.word 0xbb29f0d5 -//.word 0x2c0606ca -//.word 0xe64928e4 -//.word 0x56fb4919 -//.word 0x2c5fb262 -//.word 0x0bd552be -//.word 0x85fe5579 -//.word 0x4621f8ae -//.word 0x8fce9b0b -//.word 0xe7c117d4 -//.word 0x0d08532a -//.word 0x3069128e -//.word 0x62fe0fa1 -//.word 0x4b224c2d -//.word 0x1a91a769 -//.word 0xc1caae79 -//.word 0x62b8b435 -//.word 0x0492252b -//.word 0x8b0016e7 -//.word 0xe77f2072 -//.word 0x8b066f18 -//.word 0x21ea166e -//.word 0x7cffa594 -//.word 0xce00feb8 -//.word 0x1b3064db -//.word 0xed42d5d8 -//.word 0x4a769aa2 -//.word 0xe3061ccd -//.word 0x8ec0f950 -//.word 0xf6f45789 -//.word 0x91907981 -//.word 0xd38a9072 -//.word 0xa27ed386 -//.word 0x0999d1e2 -//.word 0x30b506e3 -//.word 0x8cc5ada7 -//.word 0x5374d6d0 -//.word 0x3309b884 -//.word 0x438e48b8 -//.word 0x3a310baf -//.word 0xdfea28bd -//.word 0xc05ec151 -//.word 0x27048333 -//.word 0x4a867c09 -//.word 0xc26a2d20 -//.word 0x3ef1e169 -//.word 0x793f3dc2 -//.word 0x69bd1777 -//.word 0xbabc8c09 -//.word 0x7a5b4c2e -//.word 0x16aa3918 -//.word 0x850f31fa -//.word 0xc3e927c9 -//.word 0x81747940 -//.word 0x1bed7d26 -//.word 0xcaf65dd3 -//.word 0x1b3b26f1 -//.word 0x9f561b80 -//.word 0xe4f04f1c -//.word 0xa5297383 -//.word 0x3e3aec52 -//.word 0x6259290f -//.word 0x10de336c -//.word 0xc3a385ca -//.word 0xeab01ffd -//.word 0x9718d64f -//.word 0x7b1eeec7 -//.word 0x129ceaab -//.word 0x1ba6a343 -//.word 0x4b6a98e0 -//.word 0x425a851d -//.word 0xbe8e3765 -//.word 0x0f639eb5 -//.word 0xcb6924a3 -//.word 0xc27c3da0 -//.word 0x34303f7a -//.word 0x42737525 -//.word 0xa36d6eba -//.word 0x98ab9bc0 -//.word 0x227d1aab -//.word 0x729ccca2 -//.word 0xa110ad85 -//.word 0xa151652f -//.word 0x74ad1af8 -//.word 0x9be9897e -//.word 0xd22b55a6 -//.word 0xfa189edd -//.word 0x5739d6a4 -//.word 0xfba3d04b -//.word 0x82d71afc -//.word 0x00e78dfc -//.word 0x38da222e -//.word 0x0f5208d9 -//.word 0x406cf3aa -//.word 0x50e8b6fd -//.word 0xc58a1458 -//.word 0x93bfd338 -//.word 0xd7841311 -//.word 0xc784de90 -//.word 0xe9800023 -//.word 0x84f419bb -//.word 0x55f8f0d1 -//.word 0x82640aa7 -//.word 0xd4377cd0 -//.word 0x203afdf2 -//.word 0x06e03fcb -//.word 0xde718072 -//.word 0xf0675cdf -//.word 0xe319e5ae -//.word 0x7996f520 -//.word 0x79d4c363 -//.word 0xec0ab513 -//.word 0x8b5a7500 -//.word 0x79b34732 -//.word 0x2ef69a2a -//.word 0xb357dc6b -//.word 0x15079339 -//.word 0x1410aaa1 -//.word 0x1b8008b9 -//.word 0x75c96829 -//.word 0xbd6864ea -//.word 0x96c5d24e -//.word 0x9d5a5441 -//.word 0x9c182bce -//.word 0x01064ce5 -//.word 0x8e2cb65b -//.word 0x51af0232 -//.word 0xd73d3c1b -//.word 0x9dabf139 -//.word 0xc7dd8928 -//.word 0x14e7d73e -//.word 0x1271ef10 -//.word 0x8e603838 -//.word 0x4fb3c256 -//.word 0x04aad955 -//.word 0x7a2edaf0 -//.word 0x126d4574 -//.word 0x73c514c7 -//.word 0x7ce34ba9 -//.word 0x7c2cd13a -//.word 0xa65b7ebc -//.word 0xbf6c759b -//.word 0x1abab4aa -//.word 0xc664e9b0 -//.word 0x06f48723 -//.word 0x01431a33 -//.word 0xbb97d80b -//.word 0x440f7853 -//.word 0x304147f9 -//.word 0x46217831 -//.word 0x7d25bbba -//.word 0x24a61263 -//.word 0x608ae0cf -//.word 0xdb204375 -//.word 0xbb4ba4ea -//.word 0xd1e38d63 -//.word 0x1358ba76 -//.word 0x4d987220 -//.word 0x1333180c -//.word 0xfabdfd12 -//.word 0x087578ff -//.word 0x68233994 -//.word 0x6247dad1 -//.word 0x8b6fb773 -//.word 0x39e900bb -//.word 0x3a9a0c71 -//.word 0xc62ef029 -//.word 0xb17251c5 -//.word 0xe5fd763b -//.word 0x1016a198 -//.word 0x9ad2a045 -//.word 0xda7d9f89 -//.word 0x893b4050 -//.word 0x77efee2b -//.word 0x7c5c6e97 -//.word 0xb28bb682 -//.word 0xe16c030b -//.word 0x3bbf268a -//.word 0x4a351ed0 -//.word 0x26d3ecb0 -//.word 0xeb98a3be -//.word 0x6a5fbf56 -//.word 0x1f07b7e0 -//.word 0x64d0d653 -//.word 0xe30846f8 -//.word 0x51e86e71 -//.word 0x5ab97ef9 -//.word 0xd73a47ed -//.word 0x4746518c -//.word 0x7db227fb -//.word 0x9675f68b -//.word 0x2e0b563f -//.word 0xd41b6889 -//.word 0xba572155 -//.word 0xb1a3e548 -//.word 0x557a584a -//.word 0x858e7142 -//.word 0x17afd020 -//.word 0xc9ee5121 -//.word 0x7a02e14e -//.word 0x9aeb9047 -//.word 0xdfd5e83e -//.word 0x393e7d46 -//.word 0x095bc6ce -//.word 0x8eb82b68 -//.word 0x9f205fd0 -//.word 0xa0bcf029 -//.word 0xaf7e1d89 -//.word 0x1ec1e7b8 -//.word 0x26296b35 -//.word 0xd9d16e7a -//.word 0x59a53a81 -//.word 0x480ca987 -//.word 0x7fcb7f10 -//.word 0x0326fc2b -//.word 0x3447b2f7 -//.word 0x48e49566 -//.word 0xf81d5141 -//.word 0x79a3e06d -//.word 0xae1f5b6c -//.word 0x9cd21026 -//.word 0x1e78d6ea -//.word 0xda739db0 -//.word 0x732549a1 -//.word 0x019ec1d9 -//.word 0xbe77426b -//.word 0x01fdfaa5 -//.word 0x7193d296 -//.word 0x72518bce -//.word 0xe4f10c65 -//.word 0x0decfa3f -//.word 0xd3e08a8d -//.word 0x2f359397 -//.word 0xde00e8ba -//.word 0x5a27e4ac -//.word 0x08c74608 -//.word 0xb3d23f06 -//.word 0x39fdca89 -//.word 0x84d93c60 -//.word 0xbc3f1cc5 -//.word 0xbbf2342a -//.word 0xc280e836 -//.word 0x6a69c70a -//.word 0xdd8360c8 -//.word 0x459d5756 -//.word 0x8563b85f -//.word 0x28828a9b -//.word 0x960ca851 -//.word 0x8e1dcc1a -//.word 0xd0bfede7 -//.word 0x1a0bcb45 -//.word 0x5691c8e0 -//.word 0x12faf946 -//.word 0x30ec7dee -//.word 0xdf2e0d79 -//.word 0xca0dd537 -//.word 0x8ffe82ed -//.word 0x72849dd6 -//.word 0x535417e7 -//.word 0xddb82557 -//.word 0x01314e5f -//.word 0xa260c13f -//.word 0x9226ed81 -//.word 0xbe0b4c81 -//.word 0xa5dc7f2d -//.word 0x0f98a00a -//.word 0xfb8ed478 -//.word 0xd9bf1f36 -//.word 0xf9897d28 -//.word 0x44872e58 -//.word 0x2ab3513c -//.word 0xdbcdb437 -//.word 0xba01eb61 -//.word 0x0ec49f8b -//.word 0xfbff297e -//.word 0xb26f5f84 -//.word 0xe44bae2a -//.word 0x7c286a43 -//.word 0x8d1b6130 -//.word 0x891db65f -//.word 0xb5b3ed12 -//.word 0xd9ce4262 -//.word 0x3cef3f83 -//.word 0xcf908d49 -//.word 0xa9c00beb -//.word 0xb30d1d08 -//.word 0xa5a647e7 -//.word 0x31c1fa03 -//.word 0x7d3badc7 -//.word 0xd77e3096 -//.word 0xa5a83d0e -//.word 0x9aea518e -//.word 0x302db9f5 -//.word 0x52fcf0ad -//.word 0x589e28e9 -//.word 0x3982272a -//.word 0xfce15408 -//.word 0x709e122f -//.word 0x1d714ca8 -//.word 0x7a44515a -//.word 0x61dde3d0 -//.word 0xbfbe8a3c -//.word 0x90492fbc -//.word 0x0b28e5dd -//.word 0x19ec0a5e -//.word 0x0cf48f36 -//.word 0x8e9194d7 -//.word 0xd76738b5 -//.word 0x2417af02 -//.word 0x641b95bc -//.word 0x34f181ea -//.word 0x0d7bde23 -//.word 0xbca6f64f -//.word 0x134a50b2 -//.word 0xdf513c26 -//.word 0x1a1caca7 -//.word 0x61224515 -//.word 0xa8dab636 -//.word 0x2cdc49fb -//.word 0xa943b704 -//.word 0xcd554165 -//.word 0xed66fcab -//.word 0xf8f96d1a -//.word 0xa9295539 -//.word 0x0047ce91 -//.word 0xf2c597b1 -//.word 0x6052ad75 -//.word 0x46471b88 -//.word 0x35421228 -//.word 0x03103c29 -//.word 0xc1d14e3d -//.word 0xed56dd72 -//.word 0xe9ce72fc -//.word 0xaca2e035 -//.word 0xb89dd5e2 -//.word 0x4b50b0b8 -//.word 0xdab5921f -//.word 0xbb12b835 -//.word 0x22200816 -//.word 0x4e6de95b -//.word 0x04ff58e0 -//.word 0x3d3a39cb -//.word 0x1c04eac9 -//.word 0x22261e9b -//.word 0xa5f5e9d2 -//.word 0x7e3317d6 -//.word 0x0330c22d -//.word 0x353424fa -//.word 0x3a21a9c4 -//.word 0x0d554879 -//.word 0x74ce14b3 -//.word 0x32910e39 -//.word 0x7e4c3ec9 -//.word 0xb53a0215 -//.word 0x4c47a50b -//.word 0x08753359 -//.word 0x717e8c31 -//.word 0x84bbb849 -//.word 0xa8447a27 -//.word 0xe359289b -//.word 0x4e00b98d -//.word 0xc6f020f8 -//.word 0xe5aed937 -//.word 0x30f6c180 -//.word 0x925c2aae -//.word 0x0a332f43 -//.word 0xa0ae45ad -//.word 0x9d4513c8 -//.word 0xfb5a84a5 -//.word 0x1b1d1a8a -//.word 0xb6ad8539 -//.word 0x16807475 -//.word 0x8604abc3 -//.word 0x0786556e -//.word 0x44549ccd -//.word 0xc81e78c8 -//.word 0x6fa2c499 -//.word 0x1a8997d0 -//.word 0xa78bd19a -//.word 0x21daf442 -//.word 0x33be36f8 -//.word 0xe37cd4d2 -//.word 0x7d7da810 -//.word 0xccacfea4 -//.word 0x9020a4f2 -//.word 0x2dfb40d4 -//.word 0xa192e6e1 -//.word 0xb8ceeaef -//.word 0x83d2f3d6 -//.word 0x06dd5177 -//.word 0x317291fd -//.word 0x12b74e63 -//.word 0x481c4a37 -//.word 0xbb3cbd9d -//.word 0x8a08ec96 -//.word 0x4522fe82 -//.word 0x5d870be4 -//.word 0xd8717766 -//.word 0x497c7e1d -//.word 0x00070f0d -//.word 0x7edddef0 -//.word 0x2c15b533 -//.word 0x4c360a42 -//.word 0x2f9fd705 -//.word 0xa826a6aa -//.word 0xc200eba6 -//.word 0xaee197f6 -//.word 0xff63eaab -//.word 0x1aac89a5 -//.word 0xe74bd09f -//.word 0xcd64696c -//.word 0xde0d1e7f -//.word 0x4ef7ebb1 -//.word 0x2a51583f -//.word 0x46e90612 -//.word 0x78958744 -//.word 0x03d172df -//.word 0x56a9b7e8 -//.word 0xf7da319c -//.word 0xba347af9 -//.word 0x36420380 -//.word 0x792d643a -//.word 0xfbdef0f9 -//.word 0xd1638de0 -//.word 0x2394c325 -//.word 0xe0f61216 -//.word 0xb0df895a -//.word 0x2bdb947a -//.word 0x484f16a0 -//.word 0x185cb79e -//.word 0xb4068031 -//.word 0x7496a587 -//.word 0x613ca100 -//.word 0xedf98832 -//.word 0xe2bc992f -//.word 0x99cc130a -//.word 0x6c654b97 -//.word 0x6da6fa73 -//.word 0x59abdb44 -//.word 0xc7f67642 -//.word 0xa51336f7 -//.word 0xe57bc242 -//.word 0x74ba8aa2 -//.word 0x6ccda0b1 -//.word 0x8acecaef -//.word 0xe2d3d5c1 -//.word 0xd1132cba -//.word 0x344aa918 -//.word 0xd75faa92 -//.word 0x31446851 -//.word 0x4e1f843c -//.word 0x0ca7e378 -//.word 0x8ad0bc2f -//.word 0xdeaaef91 -//.word 0x06869919 -//.word 0x215ce512 -//.word 0xe0692559 -//.word 0x371c2164 -//.word 0x5833ae83 -//.word 0xe1228366 -//.word 0x54b449e0 -//.word 0xc9f4f1ea -//.word 0xdf4e4aeb -//.word 0xf8f2d337 -//.word 0xa679ced5 -//.word 0x60cb9585 -//.word 0x7a403101 -//.word 0x54052984 -//.word 0xd1c29889 -//.word 0x0a7982d5 -//.word 0x44b268b7 -//.word 0x20d51a8f -//.word 0x12d7cd8d -//.word 0x14186dbb -//.word 0x9c8c353e -//.word 0xcb1a7cd9 -//.word 0xe741d2b2 -//.word 0x0b014b59 -//.word 0x1df91b06 -//.word 0x01cd6322 -//.word 0x0cca4b09 -//.word 0xbccd510f -//.word 0xa660e1c1 -//.word 0xaf27256d -//.word 0x7f7b1ee4 -//.word 0x3354f47e -//.word 0x526c8a5f -//.word 0x03a156f9 -//.word 0x7d9b70d2 -//.word 0xbeb0e887 -//.word 0x80045d12 -//.word 0x69f5cb48 -//.word 0x82b6a5a5 -//.word 0xea39244c -//.word 0xcc53de4a -//.word 0x8e1b9a1b -//.word 0x4b93636f -//.word 0x848adb2e -//.word 0x12c0d2b9 -//.word 0x5f4c1773 -//.word 0xd63b8e80 -//.word 0x987a83cc -//.word 0x71f63e4f -//.word 0x0a01d890 -//.word 0x60f84d68 -//.word 0x7422d109 -//.word 0x45dc683e -//.word 0xfbf3b1f5 -//.word 0x655202fa -//.word 0xa5ddba05 -//.word 0x2a9cd3f7 -//.word 0xdf1cb761 -//.word 0xa2125546 -//.word 0xf8427322 -//.word 0xff9f462a -//.word 0xa4b440d6 -//.word 0x1542299d -//.word 0x7a2b71ff -//.word 0xe08ec5c9 -//.word 0x7534e095 -//.word 0xfb2ba490 -//.word 0x77b06980 -//.word 0x29539505 -//.word 0xc1556c1e -//.word 0xd0552af0 -//.word 0x7d2b4fc3 -//.word 0x79153b4e -//.word 0x3511fa34 -//.word 0x528961ce -//.word 0x59355a2b -//.word 0xac3e7c55 -//.word 0xbc9fdfd6 -//.word 0x7dd12e7b -//.word 0x17a7fd58 -//.word 0xdf775d0c -//.word 0x857aae47 -//.word 0x8e75b589 -//.word 0x0599ef2c -//.word 0x6ea824a4 -//.word 0xfc5a3e06 -//.word 0x04ff5cc7 -//.word 0xb06523c6 -//.word 0xf8fc548d -//.word 0xce38a4d4 -//.word 0x9937c847 -//.word 0xe5a4cf8a -//.word 0x59dbb479 -//.word 0xe94e34b4 -//.word 0x4d27dd5b -//.word 0xb12f6816 -//.word 0xaeee4859 -//.word 0x791483e6 -//.word 0x5a17c193 -//.word 0x601ea24d -//.word 0x541e555d -//.word 0xeb4267ea -//.word 0x3f91d8bf -//.word 0x80cb744f -//.word 0xe79360f6 -//.word 0xecd3f482 -//.word 0xb95dc8f2 -//.word 0xdece127e -//.word 0x46b82fd7 -//.word 0x6a007faf -//.word 0xc484767c -//.word 0x8701f079 -//.word 0x8d35c5ee -//.word 0x91409eb2 -//.word 0x9e5007ee -//.word 0xc77dc523 -//.word 0x19f2696f -//.word 0xce4e250c -//.word 0xc34adf19 -//.word 0x2d9b849d -//.word 0x871a9fc9 -//.word 0xcf222a7d -//.word 0xf139a30e -//.word 0x84f36347 -//.word 0xb4142cad -//.word 0x7ff50107 -//.word 0x25293a1e -//.word 0xd95fd7c2 -//.word 0xbd8a150d -//.word 0x0d403fec -//.word 0x9a60c7da -//.word 0x7bf895ef -//.word 0xff669f1a -//.word 0xe6bdbaab -//.word 0xd06aaf14 -//.word 0xf51792f0 -//.word 0x17cf4f44 -//.word 0xb5638605 -//.word 0x820d99db -//.word 0x15540325 -//.word 0xe22feb3d -//.word 0x696df8fd -//.word 0xad546882 -//.word 0xe8895c2f -//.word 0x7d3076f5 -//.word 0x2e53a6d2 -//.word 0x8f884198 -//.word 0xbace54f0 -//.word 0x45b9379e -//.word 0x71cf6507 -//.word 0xa4318af0 -//.word 0x1a7ede88 -//.word 0xd7f4b2a9 -//.word 0xe0d8485b -//.word 0xaa18e89a -//.word 0xd3303059 -//.word 0x104aacc6 -//.word 0x67a9a7d0 -//.word 0x9e4740e6 -//.word 0xf3bdc002 -//.word 0x0d642ae7 -//.word 0x33ba14a7 -//.word 0xbc07b667 -//.word 0xc6404166 -//.word 0x2b2b723c -//.word 0xb1c46660 -//.word 0x81e0b0ed -//.word 0xdb10a9a6 -//.word 0x07c80737 -//.word 0x8fc0b1be -//.word 0xab9bd289 -//.word 0xfdc72c21 -//.word 0x7ea4b088 -//.word 0xb9e84bc0 -//.word 0x3742028c -//.word 0x3a3d417b -//.word 0xae687021 -//.word 0x5cb4c8a8 -//.word 0x611d6588 -//.word 0xde8c9c92 -//.word 0xf2fc8e33 -//.word 0xe5dcfdf7 -//.word 0xa6b55f4c -//.word 0x780d3189 -//.word 0xe88b8e2e -//.word 0x025c006d -//.word 0xc4d496ea -//.word 0xd35937c0 -//.word 0x6d7d35c4 -//.word 0x9f6a250d -//.word 0xb883efb4 -//.word 0xfd4821d8 -//.word 0x9e7a89e5 -//.word 0xe9800216 -//.word 0xbe0a8e39 -//.word 0x43f4a5b3 -//.word 0xd86dcdc3 -//.word 0x4e586b0b -//.word 0x53f2d94c -//.word 0x31b6b871 -//.word 0xb97e88cf -//.word 0x79ea76ab -//.word 0x360574fc -//.word 0x96268f73 -//.word 0x1c157db9 -//.word 0x596f76f8 -//.word 0x614c469c -//.word 0x7d1e9f5b -//.word 0x1fddb372 -//.word 0x1b610232 -//.word 0x130f71bc -//.word 0x33b79d09 -//.word 0x1fbd6e2d -//.word 0x2a77efdc -//.word 0xc9d75d2d -//.word 0x474a7e9e -//.word 0xbadf3358 -//.word 0x35ac51b5 -//.word 0x3f6ead00 -//.word 0x846f767c -//.word 0xcbadc8a7 -//.word 0x28387dbf -//.word 0x73dc4786 -//.word 0xf800fc43 -//.word 0x70ce3009 -//.word 0x3194093b -//.word 0xa16a4f50 -//.word 0xf016c3d4 -//.word 0x072cb2af -//.word 0xbb7ac9aa -//.word 0x47a22b2f -//.word 0xf909c150 -//.word 0x2bf0d10c -//.word 0x75e1d3cd -//.word 0x214d8034 -//.word 0xdf732b19 -//.word 0xba8354ce -//.word 0x4b047ba4 -//.word 0x2d7332b1 -//.word 0xb12d76d0 -//.word 0xd28f3fe8 -//.word 0x6b5b5672 -//.word 0xa75d6735 -//.word 0xb94f5754 -//.word 0xcefbd78b -//.word 0x409f3ab6 -//.word 0x0d958393 -//.word 0x8733c3c8 -//.word 0x4df1a228 -//.word 0x79c93b32 -//.word 0x1be42dda -//.word 0xe772ee8d -//.word 0x2ada636f -//.word 0x0313aee7 -//.word 0xcf51485d -//.word 0xe5e54f42 -//.word 0x845e2151 -//.word 0x09f52915 -//.word 0x6528f9ac -//.word 0xcfa499ca -//.word 0xb6681f01 -//.word 0xfa28803f -//.word 0x5befa698 -//.word 0x3209c345 -//.word 0x5f20e4ed -//.word 0x82a5c924 -//.word 0x6e72f432 -//.word 0xdaad0015 -//.word 0x5aef34c9 -//.word 0x8ea558c6 -//.word 0x99b7c7cb -//.word 0xd568c6da -//.word 0xc67e1483 -//.word 0x4ca2c366 -//.word 0x1c0945f4 -//.word 0x7054ca75 -//.word 0xfeb5ca4f -//.word 0x2754dd85 -//.word 0x72f1d37e -//.word 0x38ca0108 -//.word 0xa1bfd99c -//.word 0xcfb4bee4 -//.word 0x5837167a -//.word 0xfa62a0f3 -//.word 0x8a03071c -//.word 0x2efbb883 -//.word 0xcce4f139 -//.word 0xc2f71bd7 -//.word 0xd82c5abf -//.word 0x72a262a4 -//.word 0x0b428c4d -//.word 0xdea02995 -//.word 0xe62116b7 -//.word 0x096391c8 -//.word 0x91d94a85 -//.word 0xdbb6bd4f -//.word 0x530dc074 -//.word 0xa03658b0 -//.word 0x1b73d1f4 -//.word 0x86d30e65 -//.word 0xfb571da8 -//.word 0x22540e5d -//.word 0xa71806e9 -//.word 0xebd08f79 -//.word 0xfaaa3244 -//.word 0xbe364810 -//.word 0x72120df7 -//.word 0x58c6f66b -//.word 0xafed4578 -//.word 0xe096da49 -//.word 0xf8e94cee -//.word 0x5a0e385c -//.word 0xb64ad9b5 -//.word 0x356bd9ca -//.word 0xf66767df -//.word 0xbe408aae -//.word 0xeb2ab5ae -//.word 0xaaf09b94 -//.word 0x6a94441a -//.word 0x91366100 -//.word 0x6d36dd51 -//.word 0x6d9db4e8 -//.word 0x91b90832 -//.word 0x1f087236 -//.word 0x985896d2 -//.word 0xea2bfa47 -//.word 0xe76018f8 -//.word 0xf610b16e -//.word 0x08b765a0 -//.word 0xce948171 -//.word 0x2a52187b -//.word 0xe3e7550b -//.word 0x9cbd0f6c -//.word 0x070f9e69 -//.word 0x5697ed0d -//.word 0xf266d1ad -//.word 0x70139929 -//.word 0xc117e76e -//.word 0xa878be3f -//.word 0x71a5db36 -//.word 0xe1a14905 -//.word 0x69643002 -//.word 0x9e7feee3 -//.word 0xeefe68c5 -//.word 0x8b92a274 -//.word 0xacf08ee6 -//.word 0xf5742208 -//.word 0x330aadbe -//.word 0x4d4e6b24 -//.word 0x78f2571b -//.word 0xa9604001 -//.word 0x50a11fbf -//.word 0x437ea809 -//.word 0xf8e51fe1 -//.word 0xf88e6d5d -//.word 0x90dd73ab -//.word 0xca0b9e52 -//.word 0x9c81bcba -//.word 0x5e840eef -//.word 0x81179ea2 -//.word 0x7f1dd271 -//.word 0x0ebf4268 -//.word 0x990dc7c7 -//.word 0xf0e8d405 -//.word 0x3f1f0a16 -//.word 0x3dd806ea -//.word 0xa5327e36 -//.word 0xea288c76 -//.word 0x27b94933 -//.word 0x54459e81 -//.word 0xc03b57cd -//.word 0xbbf179d5 -//.word 0x93d3d6f8 -//.word 0xc3c0deb0 -//.word 0x66b1b85d -//.word 0xf29c9244 -//.word 0x229835d7 -//.word 0x3441dc37 -//.word 0x555e46f7 -//.word 0x5ac10a23 -//.word 0xb06f2b80 -//.word 0x9601ec16 -//.word 0x894ae5ec -//.word 0x003a5713 -//.word 0x5a02bde5 -//.word 0x1579a38f -//.word 0x40bfbbcd -//.word 0x33202ef5 -//.word 0x7d3b3037 -//.word 0x1e63d723 -//.word 0xf7452d6b -//.word 0x7ecb84eb -//.word 0xb64109e6 -//.word 0x5fb79c93 -//.word 0x69a6dfd8 -//.word 0xafd68d55 -//.word 0xe27e0ea4 -//.word 0xc3ae48df -//.word 0x96eab763 -//.word 0xd317c0d4 -//.word 0x1e9c4262 -//.word 0x79c16f4a -//.word 0xb95ada9f -//.word 0x36aad04a -//.word 0xc782ec50 -//.word 0xeea9e653 -//.word 0x4f80ac5c -//.word 0x67e6b4d7 -//.word 0x7a5a90df -//.word 0xcd5fc3bc -//.word 0x1625d3aa -//.word 0x31659fdc -//.word 0x148df3c1 -//.word 0x051d5a86 -//.word 0x0b5133dc -//.word 0xa20007fb -//.word 0xb2c41ae7 -//.word 0xc25b40f2 -//.word 0x694df282 -//.word 0x06cfa114 -//.word 0xb1e84a81 -//.word 0x72d24b80 -//.word 0xb0a3756d -//.word 0xec2d6249 -//.word 0xaf220901 -//.word 0xc07c8ff3 -//.word 0x9b1b61ae -//.word 0x1fb07ff9 -//.word 0x87db1b18 -//.word 0x9b90624a -//.word 0x27bf9a96 -//.word 0xad346dc7 -//.word 0x57bc84b6 -//.word 0x2f8958c7 -//.word 0x92d745b6 -//.word 0xe2d0e194 -//.word 0x7cad8b0c -//.word 0xea1f47eb -//.word 0x59edc9e0 -//.word 0x4ddecf7f -//.word 0x93d9b48c -//.word 0x784b4277 -//.word 0x38c9c923 -//.word 0xb9f76deb -//.word 0x79a8c4e7 -//.word 0xc546a16b -//.word 0x2d752ad1 -//.word 0x34f33179 -//.word 0x4cc2c10d -//.word 0x018af60a -//.word 0x7439127c -//.word 0x0becce09 -//.word 0x6712ee30 -//.word 0x96ce18d3 -//.word 0x8a9ee6f3 -//.word 0xca3b3abc -//.word 0x68c0d2c1 -//.word 0x330d1c88 -//.word 0x2d6e4b49 -//.word 0x4078aaf3 -//.word 0x2c343070 -//.word 0xc480552a -//.word 0x5ab125ce -//.word 0x787d9350 -//.word 0xd1190f2f -//.word 0x769e5bfa -//.word 0x4db19a13 -//.word 0xc063aab3 -//.word 0xb256b32e -//.word 0xb7220078 -//.word 0x84f60ee8 -//.word 0xa483e33d -//.word 0x6d15a1df -//.word 0x33035b67 -//.word 0xbb4a2760 -//.word 0xf275754f -//.word 0xdfc09ff2 -//.word 0xd77cc1c6 -//.word 0xf0b5cacb -//.word 0xb813d38b -//.word 0x26feb059 -//.word 0xd005c5d7 -//.word 0x5f811bbb -//.word 0x4075b4d2 -//.word 0x9db91b45 -//.word 0x8c583e1b -//.word 0x863680ff -//.word 0x1af60b43 -//.word 0xe21a6326 -//.word 0xb76c4152 -//.word 0x219d9ea9 -//.word 0x112d0e41 -//.word 0xd38a4fad -//.word 0x3e7c227f -//.word 0x2ec0590a -//.word 0x34f4326d -//.word 0x8bb3e3cd -//.word 0x4e0076e1 -//.word 0xe9e8d7b4 -//.word 0xce632ca6 -//.word 0x697c64b4 -//.word 0x55b113fa -//.word 0xd09d7d76 -//.word 0x6cd4f00f -//.word 0x080f58d6 -//.word 0xff890d8b -//.word 0x9fa8ef63 -//.word 0xdde0b508 -//.word 0x46d582e2 -//.word 0x39bfb995 -//.word 0x541313cb -//.word 0x2c60ef33 -//.word 0x4176e9ca -//.word 0x31cead59 -//.word 0x2b260e3e -//.word 0xa76c5270 -//.word 0x54ddd0be -//.word 0x526ebe57 -//.word 0xa26b448f -//.word 0xdb5ed4e0 -//.word 0x1e32be2f -//.word 0x4b98ff51 -//.word 0x75aa5ace -//.word 0x94ceabe5 -//.word 0x7ade77d0 -//.word 0x0986c749 -//.word 0xa2ed374c -//.word 0xe0974a1f -//.word 0x878a0090 -//.word 0xb7afab7e -//.word 0x667cfe9a -//.word 0x0dd0676f -//.word 0xa01e9fa0 -//.word 0xc4ce7f71 -//.word 0x3de01589 -//.word 0xa5d3f7f7 -//.word 0x64c5d772 -//.word 0xdcdb58e5 -//.word 0xe4e3202b -//.word 0x78382e16 -//.word 0xaee66eb7 -//.word 0xec0f8bd9 -//.word 0x598e05cf -//.word 0x91d98370 -//.word 0x9d2c6a5f -//.word 0x22e4ae90 -//.word 0xd829e907 -//.word 0x3ecfaae3 -//.word 0x8d7e0f9c -//.word 0xea119689 -//.word 0xdf3d30a5 -//.word 0x0c739792 -//.word 0x1a07e2de -//.word 0xf1915786 -//.word 0x2b9480b8 -//.word 0xc85d81dd -//.word 0x232ea8d7 -//.word 0x249c4687 -//.word 0xb836bd93 -//.word 0x7e67db66 -//.word 0xc49e6678 -//.word 0xb1abf8cf -//.word 0xc36d0dc6 -//.word 0x7daa5b0d -//.word 0x593e62f1 -//.word 0x047843dd -//.word 0xcac1d521 -//.word 0x4f7ef6f3 -//.word 0x81381fb3 -//.word 0xcafa3c74 -//.word 0x8afbbab7 -//.word 0xc47de179 -//.word 0x18f56471 -//.word 0xf16c3693 -//.word 0xff25a0d8 -//.word 0xe8809141 -//.word 0x3a1e351a -//.word 0xa546c87c -//.word 0x6788ad15 -//.word 0x07a0ba2b -//.word 0x469dd7df -//.word 0x5342c7af -//.word 0x3eac453f -//.word 0xaf355359 -//.word 0xd899cf32 -//.word 0xa85747ef -//.word 0x415a0e67 -//.word 0xadd98f2b -//.word 0xcc7ce2c4 -//.word 0x91c09d3b -//.word 0x6e9ceddf -//.word 0x0d65e542 -//.word 0x41ef1585 -//.word 0x3cf55fd5 -//.word 0x02ba0636 -//.word 0x1ef1087f -//.word 0x93daaea6 -//.word 0x15af613e -//.word 0x793ebf3e -//.word 0x6bd7ee04 -//.word 0x5f68309a -//.word 0xcae7b837 -//.word 0x91f0bd09 -//.word 0xc1b0cc31 -//.word 0x82016210 -//.word 0x46d6bac1 -//.word 0x46dae4e6 -//.word 0x2f5417a8 -//.word 0x184e48f9 -//.word 0xb8f6fb1c -//.word 0xd6445a68 -//.word 0x00dd8449 -//.word 0x80382787 -//.word 0x8cff51cb -//.word 0xbdb8835f -//.word 0xc3a40835 -//.word 0x56e7842b -//.word 0x6fead08d -//.word 0xb9fe05db -//.word 0x4242d7cd -//.word 0x77c62595 -//.word 0x4ff0cd64 -//.word 0xc61fc52f -//.word 0x8d8f68b3 -//.word 0x007d0db7 -//.word 0x588bde91 -//.word 0x2265e8eb -//.word 0xf0a56ec7 -//.word 0x4ef483c1 -//.word 0xf772d894 -//.word 0x4959d2e0 -//.word 0xf7dddf2b -//.word 0xfe560b25 -//.word 0xdaa0ce30 -//.word 0xf9c2281f -//.word 0x70cff03e -//.word 0xed0a6a93 -//.word 0xec4d1764 -//.word 0x2eacd1fa -//.word 0x675517a4 -//.word 0x38baa5fe -//.word 0x5cf34772 -//.word 0x265df000 -//.word 0x2b88063b -//.word 0x3c500194 -//.word 0x974934db -//.word 0x5d61ea03 -//.word 0x47c0b526 -//.word 0x95f303c8 -//.word 0x484af260 -//.word 0x917e6615 -//.word 0x899758c5 -//.word 0x220d714b -//.word 0x5e2ed702 -//.word 0xbfbf4785 -//.word 0xfee664b9 -//.word 0x00484e0e -//.word 0x056e7701 -//.word 0x236db2e6 -//.word 0xf3c68de4 -//.word 0x8a8be141 -//.word 0xaac3a7df -//.word 0x3a100d07 -//.word 0xf48fca66 -//.word 0x5e00ae55 -//.word 0xfb277d5e -//.word 0xc271fdfb -//.word 0xcfdb4ea0 -//.word 0x59107afc -//.word 0xe4d14d7d -//.word 0xb79a6712 -//.word 0x91838f34 -//.word 0x98644a27 -//.word 0x923cac7d -//.word 0x57d46fdd -//.word 0x869f4202 -//.word 0x78e56306 -//.word 0x722070e1 -//.word 0x1fa77b2d -//.word 0x3d895c2c -//.word 0x96bc4b0b -//.word 0x3277ae68 -//.word 0xcbdc2f13 -//.word 0x81da1211 -//.word 0xcf52c5e7 -//.word 0xbe78b915 -//.word 0x587d71e0 -//.word 0x606bd954 -//.word 0x4050d88a -//.word 0x439e2827 -//.word 0x04d26625 -//.word 0x275465d6 -//.word 0x469ec825 -//.word 0x2ea1d020 -//.word 0x4c6472b3 -//.word 0x62efadb6 -//.word 0x7e671a2b -//.word 0x2d7ac5c0 -//.word 0xecfe3b9c -//.word 0xdfd4e457 -//.word 0xc613934a -//.word 0x2c625c0a -//.word 0xe1a6a62f -//.word 0xabde805a -//.word 0x394a3976 -//.word 0x58d32a3d -//.word 0x6aa7d7fe -//.word 0x1324379e -//.word 0x35f74fde -//.word 0x1f8506db -//.word 0x018a34db -//.word 0xa3fffc46 -//.word 0x57425cf3 -//.word 0x2d7102a5 -//.word 0x651661d6 -//.word 0x2a0a05b3 -//.word 0x7d932367 -//.word 0x6fd0759c -//.word 0x9357443f -//.word 0xb31cc784 -//.word 0xc295ab2b -//.word 0x121bf301 -//.word 0xc79402a9 -//.word 0x8c4ff69c -//.word 0x842f386f -//.word 0x830c5155 -//.word 0x7f5600e4 -//.word 0x41fb891c -//.word 0x608b4fa5 -//.word 0x709ba558 -//.word 0x7767e201 -//.word 0xa0bbb363 -//.word 0x3413b67d -//.word 0xc501440c -//.word 0xadcf8e51 -//.word 0xb765eb14 -//.word 0x1b6e70e9 -//.word 0xb0b7c2b2 -//.word 0x5dd72865 -//.word 0xd015e410 -//.word 0x7386c41a -//.word 0x9c76f4cb -//.word 0x0509160e -//.word 0x7b229476 -//.word 0xda843580 -//.word 0x3838ef18 -//.word 0x612efd5e -//.word 0x842731a9 -//.word 0x2bd18acc -//.word 0x70340999 -//.word 0x6e4ec1a4 -//.word 0xf7fa2e4a -//.word 0x8517c7f1 -//.word 0x72e5d690 -//.word 0x6bb28873 -//.word 0x22b74038 -//.word 0x433d311e -//.word 0xaa042c7f -//.word 0xd3e4b69a -//.word 0x91b55e96 -//.word 0x036d4ec4 -//.word 0xc4881f25 -//.word 0x63adf22c -//.word 0x138ebcc4 -//.word 0xa310e195 -//.word 0xb0ac0583 -//.word 0x19141e78 -//.word 0xb31ace64 -//.word 0x3ecef182 -//.word 0x98e772dc -//.word 0x31656211 -//.word 0xbf744b56 -//.word 0x3392c1bb -//.word 0xebf43bb0 -//.word 0x292621c7 -//.word 0xc4f326bb -//.word 0x1d84d8b2 -//.word 0x55cc75bf -//.word 0xbd2301ab -//.word 0x8e3095f5 -//.word 0xdb0dfa17 -//.word 0xc3a6770b -//.word 0xeb62e60e -//.word 0x2c060da4 -//.word 0x88d62cdc -//.word 0x63fdd3d5 -//.word 0xef2ef681 -//.word 0xe98c43a9 -//.word 0x83c7b331 -//.word 0xa188609e -//.word 0x471096d5 -//.word 0x521c2c25 -//.word 0x670b1588 -//.word 0x2a423226 -//.word 0xb0d06a1b -//.word 0x364efd7a -//.word 0x13091592 -//.word 0xeb649f70 -//.word 0x267758a5 -//.word 0xa0fc2b49 -//.word 0xa26cba3f -//.word 0x12653bbb -//.word 0xe64f8502 -//.word 0xde3f6a71 -//.word 0x731b48c1 -//.word 0x0b00db89 -//.word 0x6ee05504 -//.word 0x7d70b115 -//.word 0x22414488 -//.word 0x832c959b -//.word 0x7bf46ebd -//.word 0x4a273395 -//.word 0x8b457346 -//.word 0x6724bdf2 -//.word 0x0993b57d -//.word 0x513e6693 -//.word 0xcdd2daec -//.word 0xe561e8ce -//.word 0x55074ed4 -//.word 0xe1ce00ef -//.word 0x43cfbfaa -//.word 0x699aecb2 -//.word 0xddd89f95 -//.word 0x852ff4ca -//.word 0x8c66a5f2 -//.word 0xa0cade5d -//.word 0x5ed04cd0 -//.word 0x0afb7885 -//.word 0x84005374 -//.word 0x772911d1 -//.word 0xd4f73bd6 -//.word 0x7f0b00c2 -//.word 0x4846cd22 -//.word 0x1c301d4f -//.word 0x7c969138 -//.word 0x2f784361 -//.word 0x3422582c -//.word 0xfb98d458 -//.word 0xd537b2c7 -//.word 0xa89a3584 -//.word 0xe7bb7904 -//.word 0xc15a4dac -//.word 0x99a34594 -//.word 0xb70b0a8b -//.word 0x3d7bf55b -//.word 0x5cb0dc4e -//.word 0xc7e22cf0 -//.word 0x68a33817 -//.word 0x530bd121 -//.word 0xf812177d -//.word 0x9c3d8e6d -//.word 0x0a7d7509 -//.word 0x85545388 -//.word 0x0239d2bb -//.word 0x943ed0da -//.word 0x28f0b483 -//.word 0x727efe00 -//.word 0x271e23c9 -//.word 0x6dad9749 -//.word 0x90952be5 -//.word 0xf6f4993b -//.word 0x55fb5da7 -//.word 0x2394c70c -//.word 0x4e474fd1 -//.word 0x2e5e2829 -//.word 0xb8471898 -//.word 0xf43b86b3 -//.word 0xb11dd527 -//.word 0x77a5f0fc -//.word 0xbdbd261b -//.word 0x5c2b390e -//.word 0x4471b108 -//.word 0x6df17625 -//.word 0x11559ef2 -//.word 0x192e8430 -//.word 0xd5db1ad5 -//.word 0xefad8054 -//.word 0xa249d51e -//.word 0x274d4d69 -//.word 0x70368330 -//.word 0x1981117b -//.word 0x9c105fe0 -//.word 0xc4d0b84a -//.word 0x6499a3f9 -//.word 0x485570ca -//.word 0x6c6511b9 -//.word 0x6c402ba4 -//.word 0x3c5d6d52 -//.word 0x195421b3 -//.word 0xbf400069 -//.word 0xdd674b88 -//.word 0xc61d179a -//.word 0x69e5e9e7 -//.word 0x83da82f3 -//.word 0x134dfc47 -//.word 0x0fb01674 -//.word 0x55b2cd56 -//.word 0xe4ac2c96 -//.word 0x4c3c6472 -//.word 0x632f1fc1 -//.word 0x3aa51231 -//.word 0x4f6fd1d4 -//.word 0x04bce8db -//.word 0x50f527a1 -//.word 0xb5e53deb -//.word 0x721d896e -//.word 0xf9972c91 -//.word 0xa3996375 -//.word 0xa3dc1432 -//.word 0x39eea664 -//.word 0x28d516e7 -//.word 0x69f547de -//.word 0x21349afa -//.word 0xd15bbff9 -//.word 0xccbfcb6c -//.word 0xef228abe -//.word 0x8cd41672 -//.word 0xa71da8ac -//.word 0x65e0aff3 -//.word 0xc1781f35 -//.word 0x81e60c0b -//.word 0x682e773f -//.word 0xaefe688c -//.word 0xad913da4 -//.word 0xddd34178 -//.word 0x02c680b3 -//.word 0xa424da87 -//.word 0xc04657ad -//.word 0xbd44baa7 -//.word 0xa15e5949 -//.word 0x859a2b77 -//.word 0x47af2330 -//.word 0x7e22bccc -//.word 0xb3afd681 -//.word 0xceeac02c -//.word 0xce26964e -//.word 0xbd96cd55 -//.word 0xe3b20c1e -//.word 0x3bdc3db7 -//.word 0x2344e569 -//.word 0x5709b0f6 -//.word 0x20a1511f -//.word 0xc97a8869 -//.word 0x53e18421 -//.word 0x6a246c9e -//.word 0x97f339c6 -//.word 0xb60cc6d4 -//.word 0xab182a58 -//.word 0x51cf457e -//.word 0xb3639994 -//.word 0x7f1c5bc7 -//.word 0xb73fca2d -//.word 0xaa35c009 -//.word 0x23e9874a -//.word 0xe072ed54 -//.word 0x45f29b03 -//.word 0x52bea2ed -//.word 0xd3bf57e8 -//.word 0xd61861cd -//.word 0x6208107b -//.word 0x6612f11e -//.word 0xf05c9fb1 -//.word 0x9f56dbc1 -//.word 0x5b9bdf74 -//.word 0x431cf0cb -//.word 0xe77b3324 -//.word 0xb8b5c103 -//.word 0xbd04fd11 -//.word 0x87042665 -//.word 0x66142803 -//.word 0xddffb8a2 -//.word 0x54dc9fb3 -//.word 0x0d32569e -//.word 0x5960d44f -//.word 0x0c3ca4f1 -//.word 0x2efb3af9 -//.word 0xf3518767 -//.word 0xedd8cb48 -//.word 0x81b6ab80 -//.word 0x987b83c6 -//.word 0x9648fdf0 -//.word 0x9036e371 -//.word 0xbaf53120 -//.word 0x1eb46f3b -//.word 0x94413dab -//.word 0xee723089 -//.word 0x73c3dce2 -//.word 0x8f4032b7 -//.word 0xc8a60d48 -//.word 0xf4c50793 -//.word 0xa9289117 -//.word 0xf6f843dd -//.word 0x501e70b9 -//.word 0xcfa8fece -//.word 0x9b6e7450 -//.word 0xa1f5558e -//.word 0x8a93ad2f -//.word 0xedd4e9bb -//.word 0xc31deb5e -//.word 0x1c8f5ee9 -//.word 0x112e471a -//.word 0xfa43dd1d -//.word 0xe1ff9b52 -//.word 0x36609351 -//.word 0xc359052c -//.word 0xe32d30f4 -//.word 0xef1c687e -//.word 0xfa416966 -//.word 0xbebbeb55 -//.word 0xd50b7780 -//.word 0x2dbd7871 -//.word 0xb64b950a -//.word 0x5d3e3ec7 -//.word 0x3e968543 -//.word 0x156c30fe -//.word 0xf6d60c5d -//.word 0x3f0b84f2 -//.word 0xcac771fe -//.word 0x67f13434 -//.word 0x897c03c0 -//.word 0x3f8b8088 -//.word 0x66d890b2 -//.word 0x1e566a66 -//.word 0x7a15eed5 -//.word 0x7c66397a -//.word 0x4041769f -//.word 0x77e3f624 -//.word 0x17bb847c -//.word 0x5187f2f8 -//.word 0xc4bbf848 -//.word 0xf0223f3f -//.word 0xedc7b8d6 -//.word 0x5c163274 -//.word 0x9f3f2c6c -//.word 0x45dbe7c7 -//.word 0xc8d2c045 -//.word 0x7b7cbd9e -//.word 0xbe06660d -//.word 0x7418d60f -//.word 0xb7b41169 -//.word 0xca629868 -//.word 0x4e8a3b6c -//.word 0xb9212fa8 -//.word 0x05876023 -//.word 0xa5b00802 -//.word 0xbd83810a -//.word 0x927f5861 -//.word 0x40a4a294 -//.word 0xab9193de -//.word 0xb7ea4ca8 -//.word 0xbcfcf54c -//.word 0x34a40c1e -//.word 0xb76cfcad -//.word 0x2af8f246 -//.word 0x33a1ecba -//.word 0xef5f1361 -//.word 0xe8ec4a5f -//.word 0x41260726 -//.word 0x34b6613d -//.word 0xbfef6b3f -//.word 0x99f8c126 -//.word 0x6b2e60c9 -//.word 0x3dc4bba4 -//.word 0x2eac0bd8 -//.word 0x69bbe672 -//.word 0x540813f0 -//.word 0x0b959d02 -//.word 0x0c31268d -//.word 0x349c7ef5 -//.word 0xeaed749c -//.word 0x9a31eca6 -//.word 0x65553200 -//.word 0x16468ea0 -//.word 0x5856190e -//.word 0x27e2ce23 -//.word 0x8531e410 -//.word 0x6ea05ca3 -//.word 0x0dfcd6c6 -//.word 0x3030a849 -//.word 0xfa2031e1 -//.word 0xd7d46b70 -//.word 0xb5d9c086 -//.word 0x72e41f28 -//.word 0x90b94ed1 -//.word 0x304b82b7 -//.word 0x3e252d4f -//.word 0xe9081713 -//.word 0x56d6b083 -//.word 0x95aea56a -//.word 0xd459b162 -//.word 0xd2e5b69a -//.word 0x978f0cd7 -//.word 0x63e718b9 -//.word 0xe42e2140 -//.word 0xab03608e -//.word 0xe13f56ef -//.word 0x361d6316 -//.word 0x1b9e93aa -//.word 0x312bbb01 -//.word 0x017cc52b -//.word 0xedba4832 -//.word 0x66e05ca0 -//.word 0x6067ac42 -//.word 0x0322cc2c -//.word 0xa467cdfd -//.word 0xf36f0f64 -//.word 0x76ff57e3 -//.word 0x364821d3 -//.word 0xb80d38a9 -//.word 0x2e038377 -//.word 0xef7d22b6 -//.word 0x2548ba42 -//.word 0xc5d40ca6 -//.word 0xc595cd9a -//.word 0x89a9b1ca -//.word 0x9ebbcad9 -//.word 0xaa2710a6 -//.word 0xa35f41ce -//.word 0x408deb72 -//.word 0xad7ac63a -//.word 0x83ae4899 -//.word 0xf7d97453 -//.word 0x5271f33d -//.word 0xa19d6544 -//.word 0xad52f9b1 -//.word 0x2dbb3bac -//.word 0x3bdf2efe -//.word 0x057e9b1b -//.word 0xc53ba85f -//.word 0xf301ac98 -//.word 0xb89f42c5 -//.word 0xa7b59d1d -//.word 0xa8d41b53 -//.word 0x34e11c19 -//.word 0xc8ba14e3 -//.word 0x931cdfed -//.word 0x72c5557f -//.word 0x1fd51f70 -//.word 0xa67ac9e9 -//.word 0x18cc176b -//.word 0x82f69d13 -//.word 0x20978a1d -//.word 0xcf68c5a8 -//.word 0xc11e3bb8 -//.word 0x74927781 -//.word 0xe51f73e3 -//.word 0x014bad31 -//.word 0x5caa7e36 -//.word 0x2500a77a -//.word 0x5aa62dc1 -//.word 0x382f68d5 -//.word 0xf64a5685 -//.word 0xb2ea35ee -//.word 0xaca550f9 -//.word 0xb25a1925 -//.word 0xdb177887 -//.word 0x783a630f -//.word 0x48d6af0c -//.word 0xeb5825f2 -//.word 0x996ad95b -//.word 0x1417b74d -//.word 0xdb305fbb -//.word 0xa1ef334e -//.word 0xfddbad65 -//.word 0x63ebf75a -//.word 0x53eeb507 -//.word 0xd02a2588 -//.word 0x14446b43 -//.word 0x82602626 -//.word 0xdc884730 -//.word 0xb6522333 -//.word 0x2bbdc7d8 -//.word 0xce5d8be3 -//.word 0xe3b8eab8 -//.word 0xd0ef901e -//.word 0xcea1b544 -//.word 0xe40caa02 -//.word 0x1675b160 -//.word 0xdaca125c -//.word 0xcb876be8 -//.word 0xa1d64833 -//.word 0x61faf329 -//.word 0xd1ed8e3d -//.word 0x2f485e66 -//.word 0x22646a67 -//.word 0xf1bf4554 -//.word 0xf3a12852 -//.word 0x47ff439e -//.word 0xc49f55d1 -//.word 0x337d7b62 -//.word 0xbc6e456c -//.word 0x9f030fb1 -//.word 0x25b08fe0 -//.word 0xd52daa13 -//.word 0xea1d8c9c -//.word 0x05eef701 -//.word 0x2000db45 -//.word 0xc3092869 -//.word 0x7ab8e033 -//.word 0x8698702e -//.word 0xd33840f2 -//.word 0x2a8989a5 -//.word 0xa88767c2 -//.word 0x6f1b2f19 -//.word 0x9b400218 -//.word 0x7866a248 -//.word 0xf213851a -//.word 0x4cd028e4 -//.word 0x1543a627 -//.word 0x58998913 -//.word 0x1427e04d -//.word 0xeb5092ef -//.word 0x1ea9f1d1 -//.word 0xb95b9207 -//.word 0x0bc95daa -//.word 0x5973e0dc -//.word 0xd41ae806 -//.word 0xc7265364 -//.word 0x154420c4 -//.word 0xe353c88a -//.word 0x9281d1f8 -//.word 0xf0b1a0ac -//.word 0xaf218f6a -//.word 0x16493f1c -//.word 0xf6063017 -//.word 0xe0f78ea0 -//.word 0x95274eaf -//.word 0xbeed7af3 -//.word 0xdd11c915 -//.word 0x84307341 -//.word 0xc56243e3 -//.word 0xe919eeae -//.word 0x644da3e3 -//.word 0x09d6e3d0 -//.word 0x7b199397 -//.word 0xe4e65030 -//.word 0xe9a102b1 -//.word 0xdda0b4cd -//.word 0x34d5a39b -//.word 0x3bad9499 -//.word 0x07376bf1 -//.word 0xab89fafb -//.word 0xaf601702 -//.word 0xbd06f14b -//.word 0x9c79a453 -//.word 0x63c90a59 -//.word 0xe6c2d41c -//.word 0x75cbdae6 -//.word 0xc60eb0c9 -//.word 0x2fd97a29 -//.word 0x1844017b -//.word 0xb115064b -//.word 0xe0e0d684 -//.word 0x7e731eec -//.word 0xc27101ee -//.word 0xfd3c689c -//.word 0x881899f4 -//.word 0xfb8e0c62 -//.word 0xa00f7987 -//.word 0x28da3639 -//.word 0x9c20c0cb -//.word 0x9665988e -//.word 0xb0295097 -//.word 0x3dc8e5c3 -//.word 0x379f4ff9 -//.word 0x797057af -//.word 0x2e07a9b0 -//.word 0x8a1e2a1c -//.word 0xb87f8bb0 -//.word 0x13681f47 -//.word 0x9833e9a1 -//.word 0x9b36fa64 -//.word 0xbae9fa60 -//.word 0x10460417 -//.word 0xab76b77d -//.word 0x3fa989fc -//.word 0x1b465fbb -//.word 0x5d445b20 -//.word 0x62d7f594 -//.word 0x81504e86 -//.word 0xf93ec0b2 -//.word 0x27dabaa3 -//.word 0xfda2cb76 -//.word 0xaf43fce2 -//.word 0xafbc6375 -//.word 0xdcc1f520 -//.word 0xf75d9cf6 -//.word 0x56dc8a31 -//.word 0xdce8cc76 -//.word 0x28f2225a -//.word 0x0dd40e24 -//.word 0x42b42bd4 -//.word 0x5b2bc065 -//.word 0xf8a69550 -//.word 0x3d0d0551 -//.word 0x82a3556d -//.word 0x4b2e4434 -//.word 0x7a57e344 -//.word 0xc353a70e -//.word 0x61c3bddd -//.word 0x07d99d14 -//.word 0x1abde2b6 -//.word 0x1d2f592c -//.word 0x6d6d5843 -//.word 0x2e575175 -//.word 0x85d1a669 -//.word 0x0769bfbd -//.word 0x723a5b02 -//.word 0x9b0f2308 -//.word 0xa8cc855c -//.word 0x7f0abf10 -//.word 0x7f023aba -//.word 0x6dac1abf -//.word 0xb12813d2 -//.word 0xc25c7eb7 -//.word 0xdfdfac4d -//.word 0x00157acb -//.word 0x0c9c254a -//.word 0x4ce76084 -//.word 0x2029a4db -//.word 0xf075c89d -//.word 0x6623d186 -//.word 0xda750b86 -//.word 0x0e7b59c5 -//.word 0x1c33c9e5 -//.word 0xacf56b87 -//.word 0x6a0e6410 -//.word 0xb8ac3ead -//.word 0x9ffa8294 -//.word 0x0c8b898d -//.word 0x39fc8fb1 -//.word 0x69d50972 -//.word 0xd8b138dc -//.word 0xf29fff1b -//.word 0xc3c7f23c -//.word 0xaf51af38 -//.word 0x6382712e -//.word 0x0b28e2f0 -//.word 0xc53931c1 -//.word 0x56b7655d -//.word 0x1dd6f13a -//.word 0x4561880e -//.word 0x3e5a3291 -//.word 0x6de1a084 -//.word 0x2256bcf2 -//.word 0xcbc285b6 -//.word 0x68731a3d -//.word 0x3fe7148d -//.word 0xd1ec1986 -//.word 0x0c04af68 -//.word 0xc20e4d96 -//.word 0x5a23b89a -//.word 0xc6bf8d68 -//.word 0xb52119e7 -//.word 0x09f471ad -//.word 0x8b2ebf0a -//.word 0xdd39db49 -//.word 0xb1511b32 -//.word 0x392d6bd4 -//.word 0xdee1a081 -//.word 0x35030919 -//.word 0x2f0c478c -//.word 0x90025f9a -//.word 0xa2540edd -//.word 0x2a065d0a -//.word 0x9b0d7474 -//.word 0x8afdb3d1 -//.word 0x62e1ff41 -//.word 0x596a5a8c -//.word 0xa24db7ab -//.word 0xe4e60c8b -//.word 0xec21a80d -//.word 0x9f9ac751 -//.word 0x32036434 -//.word 0x9dc74e17 -//.word 0x4cec7ee3 -//.word 0x183ea849 -//.word 0x77aa104f -//.word 0xefe89f08 -//.word 0xd15d36a2 -//.word 0x233f42a7 -//.word 0xdefa917c -//.word 0x5ad2642e -//.word 0x06cac56d -//.word 0x5cc51ad9 -//.word 0x14ecfb7d -//.word 0x984f4199 -//.word 0xb9cf5fa5 -//.word 0xa03bf692 -//.word 0x07b9a353 -//.word 0xa9681c9c -//.word 0xf6437bea -//.word 0x0c49d9c3 -//.word 0xe3db1f3f -//.word 0xc76519c7 -//.word 0x0c40cc1d -//.word 0xfdd70a9c -//.word 0x150943c2 -//.word 0x72cf9eeb -//.word 0x861f485f -//.word 0x10100c8f -//.word 0x4a3e259c -//.word 0x64705019 -//.word 0x32782512 -//.word 0x225ba64d -//.word 0x70b219cf -//.word 0x9d5013a2 -//.word 0x1d25d6d6 -//.word 0x5062dcc6 -//.word 0xb3deb49d -//.word 0x58b90d18 -//.word 0x933f118d -//.word 0xf70ff42c -//.word 0x807ccc85 -//.word 0x1233a34a -//.word 0x221eca56 -//.word 0xb38971ef -//.word 0x85847548 -//.word 0x8988794a -//.word 0x975d3894 -//.word 0x633a19c1 -//.word 0xae2f05e9 -//.word 0xb9c0756a -//.word 0xffd3cfe8 -//.word 0x23ccf292 -//.word 0x28f60fa7 -//.word 0xe025bc39 -//.word 0xa7994332 -//.word 0x51264094 -//.word 0x60926b05 -//.word 0x7a3fb28a -//.word 0x1b098b93 -//.word 0x88728838 -//.word 0x04fd2bc2 -//.word 0x45d7fd6d -//.word 0x29bcda6c -//.word 0xa6198f2e -//.word 0xff6ea7e0 -//.word 0x3ef78133 -//.word 0xde8ba65f -//.word 0xc8c45a68 -//.word 0x8160719f -//.word 0xa1e7646d -//.word 0x878ea44c -//.word 0x4b5c2e16 -//.word 0xf48b6082 -//.word 0xeb310beb -//.word 0xb020c954 -//.word 0xcc0a91aa -//.word 0x07e98848 -//.word 0xda9d1ac1 -//.word 0x27d74ad9 -//.word 0x283746d4 -//.word 0xa6b13ff4 -//.word 0x6b35773d -//.word 0xf98f9c7b -//.word 0x7c8c5486 -//.word 0xfe5e19c5 -//.word 0xda4147f1 -//.word 0x735f731b -//.word 0x25f1fff1 -//.word 0x7ca8eb3d -//.word 0xa44beeae -//.word 0x21a1c6db -//.word 0xc091cc85 -//.word 0xce88cb1c -//.word 0x871b1285 -//.word 0xd1eec81b -//.word 0x2bd480f4 -//.word 0xe0370d65 -//.word 0x80bb98c8 -//.word 0x901ef07c -//.word 0x8163202e -//.word 0xdf2f4757 -//.word 0xcb73a406 -//.word 0xab4bf1e0 -//.word 0x2026f265 -//.word 0x39284d75 -//.word 0xe6cc9c12 -//.word 0xafcec167 -//.word 0xa5487909 -//.word 0x991b357e -//.word 0x8d9025fc -//.word 0x683f9572 -//.word 0xee307ccd -//.word 0xee415274 -//.word 0xbdc72314 -//.word 0xe478e2a3 -//.word 0x1689ff9f -//.word 0x65133b97 -//.word 0xb5bbbced -//.word 0x70925cda -//.word 0x7b3a47b2 -//.word 0x694bc56a -//.word 0xeff45457 -//.word 0x98e6fa38 -//.word 0xba6dd977 -//.word 0xa9e004ac -//.word 0x2a3c9163 -//.word 0x2b0cf01f -//.word 0xb18c7b9f -//.word 0x110d4d5f -//.word 0x639b5862 -//.word 0x34deb22f -//.word 0x7b3e301a -//.word 0xce4a36c4 -//.word 0xd65bcde5 -//.word 0x0174f649 -//.word 0x766d3f19 -//.word 0x4e51935c -//.word 0x010456bd -//.word 0x1e29b28f -//.word 0x40422b0e -//.word 0x3d197ae8 -//.word 0xa06098fc -//.word 0x5a941961 -//.word 0xb427bbaa -//.word 0x88dd3f68 -//.word 0xb17777f1 -//.word 0xc08fa160 -//.word 0xf0c3f3dd -//.word 0x5d15771f -//.word 0x7092192e -//.word 0x9e32ff6e -//.word 0x520018d9 -//.word 0x277af88c -//.word 0x5b3be385 -//.word 0x81d727ab -//.word 0x7507af0e -//.word 0x9506d671 -//.word 0x2e3a7906 -//.word 0x35175078 -//.word 0x38417e2e -//.word 0x93f066cf -//.word 0xe799c101 -//.word 0xc8cbed77 -//.word 0xb657882a -//.word 0x4fb33ee6 -//.word 0xc2a0df09 -//.word 0x870bb588 -//.word 0x4e311432 -//.word 0x35073239 -//.word 0x3dd939ee -//.word 0xff319bcc -//.word 0x9bfaa6b8 -//.word 0xf2e55887 -//.word 0x150c74c1 -//.word 0xfcd6d5a4 -//.word 0x7c1a036c -//.word 0x738704d2 -//.word 0x464375d3 -//.word 0x8dd2d9b2 -//.word 0x0c3a3040 -//.word 0xe664cc5b -//.word 0x0dc660b5 -//.word 0xfd3f5ad7 -//.word 0xaa427265 -//.word 0xb63783a3 -//.word 0xe81e9a38 -//.word 0xda764d32 -//.word 0xf15d4f4b -//.word 0x92f8416a -//.word 0x9315ca6d -//.word 0xf00fe926 -//.word 0xc0f28aa3 -//.word 0x67e058b3 -//.word 0x0cb4d3a5 -//.word 0x4ee4a253 -//.word 0x32ac2a60 -//.word 0x60695fbd -//.word 0x9043da72 -//.word 0x3f0e2d9b -//.word 0xa67273b0 -//.word 0xec4a2b0a -//.word 0x9b4b46a3 -//.word 0x51e67e1e -//.word 0xb86fea07 -//.word 0xb77ecf5b -//.word 0xea96ba4b -//.word 0x5004cb3d -//.word 0x440a5414 -//.word 0xaf3da3b1 -//.word 0x7b2c1bb9 -//.word 0x4b428a99 -//.word 0x69eeb6c8 -//.word 0xff00394c -//.word 0x8b578f80 -//.word 0x8db96e14 -//.word 0x82025555 -//.word 0x168168af -//.word 0x969f7b70 -//.word 0xa4c16dce -//.word 0x2e70b72c -//.word 0xa1b84499 -//.word 0x59cd849a -//.word 0x5df5bc29 -//.word 0x49a1a0fd -//.word 0x8bdd230c -//.word 0xd2eb8e4f -//.word 0xc42bcfc5 -//.word 0xf03f14ba -//.word 0x036b9949 -//.word 0x3e42be20 -//.word 0x277f5d83 -//.word 0x7f315a94 -//.word 0x751b7cd1 -//.word 0x195a7bde -//.word 0x13485a85 -//.word 0x95a1f6fb -//.word 0x8ee4e064 -//.word 0x21fc689a -//.word 0x5520fa2a -//.word 0x0ef8aea0 -//.word 0x3c011a05 -//.word 0x52326ba5 -//.word 0xfae0b416 -//.word 0x06df8575 -//.word 0xaaeac0f3 -//.word 0xe944a890 -//.word 0x4ea03b27 -//.word 0xdc3fc2ab -//.word 0x4758a6b0 -//.word 0x65bc852d -//.word 0xdfba8580 -//.word 0x2c40e8b2 -//.word 0xc044e1fd -//.word 0x8062a68b -//.word 0x7ac7c781 -//.word 0xd34dbe3c -//.word 0x00e7c7da -//.word 0x3940f2fd -//.word 0x2b9f76cb -//.word 0xee0e483a -//.word 0x36bbec8a -//.word 0xcd9e8c13 -//.word 0x415c4740 -//.word 0xda6ccbdc -//.word 0xce78268c -//.word 0xb806d99d -//.word 0x47572e00 -//.word 0x338fcc93 -//.word 0x761789a3 -//.word 0xb8407fae -//.word 0x0b29626d -//.word 0xd8e21111 -//.word 0x19d16ace -//.word 0xc9556396 -//.word 0x99aa5627 -//.word 0xe50d9d47 -//.word 0xe6205f4e -//.word 0x298fa9e6 -//.word 0x40f4c10f -//.word 0xb7f8b766 -//.word 0x4abb3ca6 -//.word 0x5477b76f -//.word 0x8b609646 -//.word 0xebcee2de -//.word 0xf09d1795 -//.word 0x08d43242 -//.word 0x48860b2e -//.word 0x5ef6e560 -//.word 0xc7fe441e -//.word 0x42b2ffb0 -//.word 0x84409567 -//.word 0x2d1bc4de -//.word 0xfb585880 -//.word 0x3d58424a -//.word 0x8ba7e9d2 -//.word 0xb524c589 -//.word 0xf962293d -//.word 0x794f60e2 -//.word 0xec13fc91 -//.word 0x933b6bd1 -//.word 0x6e17cb16 -//.word 0xb160ff87 -//.word 0x721e0304 -//.word 0xa4c97c68 -//.word 0x48af940b -//.word 0xe295048c -//.word 0x2aa172cd -//.word 0x0578fe3e -//.word 0xb3a3185f -//.word 0x4a379480 -//.word 0x63b500cb -//.word 0x132f3585 -//.word 0x1dac2c91 -//.word 0x65ce1336 -//.word 0xa8b2a022 -//.word 0x6b18a6ae -//.word 0x31c4e663 -//.word 0xf12427bd -//.word 0xc7328930 -//.word 0xea9c1669 -//.word 0xde229ad6 -//.word 0xeb40b468 -//.word 0xcd0e2e98 -//.word 0xad648aa8 -//.word 0x5041dd2b -//.word 0x8f6ee1c7 -//.word 0x075e453a -//.word 0x1159479b -//.word 0xf5da85e2 -//.word 0x5a3510ab -//.word 0x017cc337 -//.word 0xb3a4d3b4 -//.word 0x78e4a6be -//.word 0x0a5ee925 -//.word 0x8901ddf1 -//.word 0x70aef1a3 -//.word 0xc89996be -//.word 0x9cf34f86 -//.word 0xacc60708 -//.word 0x6520a85a -//.word 0x1173e924 -//.word 0x4c3c685f -//.word 0xb7e3f85d -//.word 0xf0e23c0a -//.word 0xc12a7571 -//.word 0x97c29882 -//.word 0x36b2a412 -//.word 0xac1f3223 -//.word 0x83b74d66 -//.word 0x3b5085fe -//.word 0xf8cb3f87 -//.word 0x773f4f57 -//.word 0x4654c903 -//.word 0x35ec1325 -//.word 0x08093f5d -//.word 0x6eeb9896 -//.word 0x37787b8b -//.word 0xc1e16989 -//.word 0xb3835976 -//.word 0xee0b5312 -//.word 0xc1de3a7d -//.word 0x5cb8eafa -//.word 0x889283f2 -//.word 0x95ca033c -//.word 0x937e1b9b -//.word 0xc5383b88 -//.word 0x52d1f032 -//.word 0x3e8f6fc4 -//.word 0x999172e6 -//.word 0xf66d4286 -//.word 0x1f1715d8 -//.word 0x07059b9b -//.word 0x0090d49f -//.word 0x2e9e2484 -//.word 0x3c7ea9c4 -//.word 0x4d13ccf4 -//.word 0x36351646 -//.word 0xea544653 -//.word 0x355ea017 -//.word 0xaee3873d -//.word 0xe7784e9d -//.word 0xe6594c04 -//.word 0xd9522e33 -//.word 0x05df912a -//.word 0x0092d1a6 -//.word 0x20b51be8 -//.word 0x3331cab8 -//.word 0x70aef0aa -//.word 0xaefc32a0 -//.word 0xd4b1da90 -//.word 0x91142787 -//.word 0x4d3ae7ee -//.word 0x5f6f480d -//.word 0x80d8eccd -//.word 0x7f563bc2 -//.word 0x37acfd68 -//.word 0xbfe528ad -//.word 0xe0f0f6b0 -//.word 0xcc8e3bc9 -//.word 0x0c6ef6c9 -//.word 0xbb952683 -//.word 0xf204df8b -//.word 0x83959c3d -//.word 0xea27d701 -//.word 0x80fad7ce -//.word 0xf25ccaed -//.word 0xf2861300 -//.word 0x2cc1e542 -//.word 0x7ccd1110 -//.word 0x5e821ca9 -//.word 0xa6b89532 -//.word 0x7165a5fd -//.word 0x5b05e80a -//.word 0xf23f7bce -//.word 0x6bc55734 -//.word 0x947cdde2 -//.word 0x0addb1bd -//.word 0xac9bccaf -//.word 0x4f85cda8 -//.word 0xb4af90e2 -//.word 0xb7cc026a -//.word 0xc8df34dc -//.word 0x9f13ae6d -//.word 0x2ce6052f -//.word 0xcd8db091 -//.word 0xc4941725 -//.word 0xe8c6eda7 -//.word 0x9a4cc03a -//.word 0xfb19cef4 -//.word 0x5d851b9d -//.word 0xf737c0b4 -//.word 0xdc4986b3 -//.word 0x2ea7b395 -//.word 0x8eb82494 -//.word 0xd8419c37 -//.word 0x0d865c8c -//.word 0x91b2f4b2 -//.word 0x9778589b -//.word 0xd9fb3610 -//.word 0x8ceb87f6 -//.word 0x93f165cf -//.word 0xf34e1c84 -//.word 0x87bf8361 -//.word 0xf5a38d61 -//.word 0xe05f1bac -//.word 0x5f02145e -//.word 0xae25b88a -//.word 0x2416317f -//.word 0x65356b49 -//.word 0xd99d267b -//.word 0x5d074a2c -//.word 0x38ec7a40 -//.word 0x50eaebe9 -//.word 0x9e69776c -//.word 0xdf7eed29 -//.word 0x8c10acd6 -//.word 0x0d39700b -//.word 0x2aee6b03 -//.word 0xc2e398a1 -//.word 0xbfa94cb1 -//.word 0x49190e71 -//.word 0x3af6a84f -//.word 0xd2ce7ef5 -//.word 0xad211f83 -//.word 0xf1c61a1b -//.word 0xcc8913a3 -//.word 0x1e1915c6 -//.word 0x72222a3c -//.word 0x33b6294c -//.word 0x1df1d08f -//.word 0xf1dd12f6 -//.word 0x6d93b20e -//.word 0x7ba31183 -//.word 0xa9b645e4 -//.word 0xd9726aa5 -//.word 0x399e3d6a -//.word 0x7687e783 -//.word 0x2da216b2 -//.word 0xa3725235 -//.word 0xb5ac8f00 -//.word 0x129afe4b -//.word 0xa7bd294c -//.word 0x5bb63f46 -//.word 0xfd67acc2 -//.word 0x7a55ed1c -//.word 0x5450a342 -//.word 0x4f57e6b9 -//.word 0x6eb6dbe1 -//.word 0x1d718979 -//.word 0xb0e5e865 -//.word 0x0cad3baf -//.word 0xa4c3a0cd -//.word 0xa8e7e622 -//.word 0x78459ec7 -//.word 0x5f52758a -//.word 0x7ef7c137 -//.word 0x06f15917 -//.word 0xab78aab7 -//.word 0x551e07ea -//.word 0x18fb4111 -//.word 0x6607789a -//.word 0x83c730c7 -//.word 0x3a2ca7b1 -//.word 0xcfb8678c -//.word 0x34e2172c -//.word 0x7fbc96c8 -//.word 0x9cd34bff -//.word 0x3f56b618 -//.word 0x1d7b4b8e -//.word 0x5c1f81cc -//.word 0x48ad2635 -//.word 0x4740f567 -//.word 0x0f0c6ac1 -//.word 0x16fad523 -//.word 0x4a92aef4 -//.word 0x031e286a -//.word 0x360c0805 -//.word 0xeb95b85d -//.word 0xf19c971e -//.word 0xd0d99451 -//.word 0xff36fbdd -//.word 0x57798e4d -//.word 0xc824d8d3 -//.word 0x4b99be8d -//.word 0x17825708 -//.word 0x1870fe03 -//.word 0x9dc2a575 -//.word 0x51c96cd1 -//.word 0x6c2a7288 -//.word 0x2a83eacf -//.word 0x7d5172a4 -//.word 0xfe11a10b -//.word 0x2aa5df9e -//.word 0xcbfa7a44 -//.word 0xb4e8f641 -//.word 0xb159a46f -//.word 0xbeae76ca -//.word 0x775e1132 -//.word 0xd0e0246d -//.word 0x06ccf86c -//.word 0xd63d49cf -//.word 0xec7955ab -//.word 0x9ed4328a -//.word 0xdad164b3 -//.word 0x5d8bafac -//.word 0x26532afe -//.word 0x2b9b9538 -//.word 0x4a13ec36 -//.word 0x82113ca3 -//.word 0x6336b6bd -//.word 0xc34f0258 -//.word 0xb379d626 -//.word 0xb289c635 -//.word 0x20aa5eb9 -//.word 0xf5486e0c -//.word 0xb22da5f3 -//.word 0x98ea6123 -//.word 0x1879c604 -//.word 0x8c200eb4 -//.word 0x24981f4f -//.word 0x236f636e -//.word 0x4babd4ed -//.word 0x95b056f2 -//.word 0x26644a2a -//.word 0x7f906056 -//.word 0xf48aac07 -//.word 0x5f11fda5 -//.word 0x15786ab6 -//.word 0x19072d5d -//.word 0x909eb521 -//.word 0x759bf6f0 -//.word 0x8efe0464 -//.word 0x9fcbe045 -//.word 0xddb0914e -//.word 0xa5e87734 -//.word 0x6e5fdde4 -//.word 0xfd17cd0c -//.word 0xd8ca28de -//.word 0xfcd1f611 -//.word 0xd244fa28 -//.word 0x606389f6 -//.word 0xbc349d62 -//.word 0xc76e2668 -//.word 0x1796a060 -//.word 0x3568ea83 -//.word 0x097856ab -//.word 0x9219fd5a -//.word 0xdb7e55fe -//.word 0x2a1f0573 -//.word 0x7a5ef7ca -//.word 0x2b6baf49 -//.word 0xf965dcb2 -//.word 0x2bc22dc9 -//.word 0x0cf06610 -//.word 0x9f3cb3d5 -//.word 0x8ff43c6e -//.word 0x65c8f9c4 -//.word 0xfd76c80e -//.word 0x3ba7bddf -//.word 0xfa13b963 -//.word 0x45ec3ee5 -//.word 0xca7a8195 -//.word 0x8b03c189 -//.word 0xd7edd801 -//.word 0x792610ef -//.word 0x2fc437b7 -//.word 0x5ee9f633 -//.word 0x03ea5efa -//.word 0xedb0c4e2 -//.word 0x2a5ecfc3 -//.word 0xbf33cf7e -//.word 0x9cb3503e -//.word 0xce01f0fe -//.word 0xf7906d4c -//.word 0xfbfa024c -//.word 0xfd30f4ff -//.word 0x8ad468c5 -//.word 0x13e37721 -//.word 0xa19784bd -//.word 0xc48ccdae -//.word 0xcc2141f8 -//.word 0x3c219255 -//.word 0x7ca38a32 -//.word 0xce2ea2fb -//.word 0x8321d198 -//.word 0x6f52a238 -//.word 0x9af6894d -//.word 0x38c177d7 -//.word 0xdc4eace6 -//.word 0xe8c0cd5a -//.word 0x48aa36ee -//.word 0x602c9175 -//.word 0x425fa763 -//.word 0x25f3778e -//.word 0x13178536 -//.word 0xe1997543 -//.word 0x644fd8cf -//.word 0xe2b546e4 -//.word 0xc7d7ad87 -//.word 0x9972e8f5 -//.word 0x2e56942c -//.word 0x1d0e1fad -//.word 0x72c32181 -//.word 0xa65ef07a -//.word 0xceed6fbb -//.word 0x1248267a -//.word 0x61f49805 -//.word 0x6347d003 -//.word 0xafcd3efd -//.word 0x3febc11d -//.word 0x20c20535 -//.word 0x6e560f02 -//.word 0x80f016b3 -//.word 0x60c195a5 -//.word 0x7ec79e71 -//.word 0xa5f57128 -//.word 0x2d8e4ddd -//.word 0x73d28664 -//.word 0x86dcd85a -//.word 0x23cbfb65 -//.word 0xe42077bd -//.word 0xb467baec -//.word 0x861a68d2 -//.word 0x47c2f2eb -//.word 0x105f6ad5 -//.word 0xa10a960c -//.word 0x0bd943f9 -//.word 0xac03db2b -//.word 0x60443ae4 -//.word 0xf683bed7 -//.word 0xe1b39d30 -//.word 0x30f77cd5 -//.word 0xc1093deb -//.word 0xb1dc189d -//.word 0x1680ed18 -//.word 0xf147d8da -//.word 0x5e26072d -//.word 0x0e5dc8ee -//.word 0xf75ae693 -//.word 0x4adb366d -//.word 0xa6546d29 -//.word 0x8b90349d -//.word 0x119a7fc2 -//.word 0xdade1afc -//.word 0x458c84a2 -//.word 0xe43d01ba -//.word 0x31d9eb04 -//.word 0x7cb8493b -//.word 0x2807a397 -//.word 0x176e1496 -//.word 0x63efa0fc -//.word 0x4f12c818 -//.word 0x7d3f5c4a -//.word 0x616b91c2 -//.word 0xf5f7538a -//.word 0xaed4dcc7 -//.word 0xafec863c -//.word 0x3ebddd0f -//.word 0x7447f9d0 -//.word 0x38290bb7 -//.word 0x6e07352d -//.word 0x6b2e9f8e -//.word 0xac7bc72e -//.word 0xc879189a -//.word 0xa4c9bf20 -//.word 0xe6c7ba91 -//.word 0xac6a3145 -//.word 0x7d6c0a60 -//.word 0x80abb854 -//.word 0xebd053a7 -//.word 0xbf2eeef7 -//.word 0xb3ed253b -//.word 0x6d67f54b -//.word 0xf8d2d1a3 -//.word 0x7320f163 -//.word 0x0623ee9b -//.word 0x1bf58cc6 -//.word 0xca97d694 -//.word 0x94d871ed -//.word 0x55782a32 -//.word 0x748ed1c6 -//.word 0x5d274acd -//.word 0x3130e133 -//.word 0xbb96def0 -//.word 0xa7ab598b -//.word 0xeecc50dd -//.word 0x9541f718 -//.word 0x97644f08 -//.word 0x2005fa98 -//.word 0xfb0e4e97 -//.word 0x4e63a8bc -//.word 0x850c03e8 -//.word 0x8c96c9ac -//.word 0x41b6e80b -//.word 0x29302981 -//.word 0x61f7be44 -//.word 0xd89619c9 -//.word 0xbcce058a -//.word 0x3281ef07 -//.word 0x4acf840a -//.word 0x327e8230 -//.word 0xaa9fc7a5 -//.word 0xb76eaf2f -//.word 0x9c7b9c6e -//.word 0x0607d662 -//.word 0x87b1962d -//.word 0x45525d1a -//.word 0xf4258adf -//.word 0x012b2c1f -//.word 0x10cd1533 -//.word 0xa9c4302a -//.word 0x2e36140e -//.word 0x1121d869 -//.word 0x43fd2908 -//.word 0xf09d9bff -//.word 0x69573dee -//.word 0x62647082 -//.word 0x5d89f93e -//.word 0x66f7547b -//.word 0x01714bad -//.word 0x61acc8e9 -//.word 0xdafbe8a4 -//.word 0x992c50be -//.word 0x93acc4bf -//.word 0xbbf2f660 -//.word 0x781b9b4d -//.word 0x56d2c429 -//.word 0xfc736cd2 -//.word 0x5e704de7 -//.word 0x33f3f988 -//.word 0xaac5255d -//.word 0x586e48da -//.word 0x759e65c1 -//.word 0x49cb24e8 -//.word 0xe11c283c -//.word 0x06869d06 -//.word 0x7035106d -//.word 0x362d843c -//.word 0x8931c2e6 -//.word 0xa2e3f0c8 -//.word 0xf92e65ad -//.word 0xb8e1bc97 -//.word 0x6f9c27bd -//.word 0x09f006d0 -//.word 0xffc2b982 -//.word 0xcbf0b249 -//.word 0xa038ce60 -//.word 0x5855e510 -//.word 0xae6aa02d -//.word 0xada48ae3 -//.word 0x681b6ab3 -//.word 0xecfad1b8 -//.word 0x73e0ef2f -//.word 0xda86aa36 -//.word 0x55a1f2d4 -//.word 0x620a4e3a -//.word 0xfb1cbb48 -//.word 0x105db753 -//.word 0x34619926 -//.word 0x97ec2346 -//.word 0x34575a7b -//.word 0x4b35958b -//.word 0x1236d549 -//.word 0xa84b54ce -//.word 0x4a0a6107 -//.word 0xc9556a70 -//.word 0x3b365b1e -//.word 0xf10e2703 -//.word 0xaaefa36e -//.word 0x06469bd1 -//.word 0x3ebd8000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x000189D0 -//// expected output -//.word 0x2ab21ec8 -//.word 0xd42db385 -//.word 0xb3ee428e -//.word 0xaf71aa18 -//.word 0xa9c7e2a6 -//.word 0x6a462125 -//.word 0xed710500 -//.word 0xe71049bc -//.word 0x448d6dad -//.word 0x35b66eda -//.word 0xec37ff39 -//.word 0x997a052e -//.word 0x98dd6ae7 -//.word 0x8c141fcd -//.word 0x4a23f446 -//.word 0x9a57fab0 -//// SHA512LongMsgvector_127 -//// vector length -//.word 0x00018CE8 -//// input message -//.word 0xcd367203 -//.word 0x71f56dac -//.word 0xe87c59a7 -//.word 0xfa7eec63 -//.word 0xaa03de45 -//.word 0x17bcf09e -//.word 0xa4932dda -//.word 0x578770fa -//.word 0x7fb72644 -//.word 0x9abc5538 -//.word 0x753cdec7 -//.word 0x95bcffc0 -//.word 0xd6b61b8b -//.word 0x52ecbe19 -//.word 0x84fbdc1b -//.word 0xae335972 -//.word 0x77a6cee7 -//.word 0xd97f8b1d -//.word 0x3a96d8c3 -//.word 0xd941810e -//.word 0x6c6c9167 -//.word 0x08ec5d61 -//.word 0x4010c4ed -//.word 0x9179b6d1 -//.word 0xfe2cf356 -//.word 0xf7e61541 -//.word 0x7fb0d105 -//.word 0x8eb27a37 -//.word 0xb44cc642 -//.word 0x0063d55c -//.word 0x20f96fb9 -//.word 0xc9018efe -//.word 0x5a711cf8 -//.word 0xbc98fd8e -//.word 0x8cb250f4 -//.word 0x7cbaf222 -//.word 0xf67f4485 -//.word 0x03fa2ff4 -//.word 0x6cdf65e5 -//.word 0x1f72e9e1 -//.word 0xd39cd135 -//.word 0xef3e4beb -//.word 0xa8c5def8 -//.word 0x6afff2b7 -//.word 0x7a2d9396 -//.word 0xd9597210 -//.word 0x6be92cdb -//.word 0x5875cf62 -//.word 0xb3d69b75 -//.word 0x5a7f053f -//.word 0x1d110279 -//.word 0x222981de -//.word 0x877c39df -//.word 0x4a27a697 -//.word 0x66404e01 -//.word 0x3fb14969 -//.word 0x40460020 -//.word 0xc3043574 -//.word 0x31bd44df -//.word 0x6ae1a87f -//.word 0x6797c0c6 -//.word 0x1e0cd373 -//.word 0xa50b53c1 -//.word 0x9bcf5ede -//.word 0xc4158a9e -//.word 0xf375e271 -//.word 0x2df12c93 -//.word 0x0bcf6e82 -//.word 0x60a4b0b5 -//.word 0x1cb2028b -//.word 0x7073c182 -//.word 0x337617a9 -//.word 0x856ac158 -//.word 0xb279151e -//.word 0x59d743fb -//.word 0xcd9adbcf -//.word 0xbbcc8f13 -//.word 0x0dbe3bc7 -//.word 0x0fa022ab -//.word 0xd04f7ab2 -//.word 0xcc6e2cb4 -//.word 0xc7b8d563 -//.word 0xfc941080 -//.word 0x77eaf74f -//.word 0xc036e748 -//.word 0xb9db840f -//.word 0xc9b9fda6 -//.word 0x3a0192e2 -//.word 0xe048531b -//.word 0xfcdb2a28 -//.word 0x5f531b8a -//.word 0xd369cbe8 -//.word 0xb60b3fbc -//.word 0xe8afe74b -//.word 0xe8e7dbda -//.word 0x3935641f -//.word 0x0b21bef6 -//.word 0x178a1c55 -//.word 0xcb3aed82 -//.word 0xa7bd5e83 -//.word 0xe77220d7 -//.word 0x62e26b63 -//.word 0xb25143af -//.word 0x9593fa52 -//.word 0x9321f6ab -//.word 0xe16cb4d2 -//.word 0x86710dce -//.word 0xbc8eb809 -//.word 0x99941101 -//.word 0xee1d183f -//.word 0x7020bd8d -//.word 0x15c25b64 -//.word 0xc16f82a4 -//.word 0x222af987 -//.word 0xd82103d8 -//.word 0xda85e260 -//.word 0x15989aa2 -//.word 0x5608f7c8 -//.word 0x697bd1dc -//.word 0x836b8f3b -//.word 0xdd34ea47 -//.word 0xa26bf45d -//.word 0x0b725807 -//.word 0xc849e372 -//.word 0xa3a74322 -//.word 0x604a0fe4 -//.word 0xe78b0804 -//.word 0xa5359fc1 -//.word 0x2f97b7fe -//.word 0x28d8ab3a -//.word 0x668b93c2 -//.word 0x5083c325 -//.word 0x8ae995e9 -//.word 0xd58b697c -//.word 0x3077e96d -//.word 0x43c992dc -//.word 0xfec17030 -//.word 0x7e192808 -//.word 0x30953c73 -//.word 0x38db8b63 -//.word 0x1485175f -//.word 0x7c750b79 -//.word 0x8d68fd80 -//.word 0x27ce7076 -//.word 0x94da9d44 -//.word 0x6ad573ad -//.word 0xb2b7dc81 -//.word 0x49f84213 -//.word 0x87a452ec -//.word 0x1faeffc1 -//.word 0x4686caa3 -//.word 0x18ed4176 -//.word 0x3709c6a4 -//.word 0xb5b49213 -//.word 0x341afa54 -//.word 0x4b83f01d -//.word 0x2c6dccf9 -//.word 0x84de4d3e -//.word 0xa3f8da3f -//.word 0xddce0ec4 -//.word 0x307674b7 -//.word 0x27608f20 -//.word 0xfde51e54 -//.word 0x06239d68 -//.word 0x4b090fec -//.word 0x74aefbd6 -//.word 0xece7b5bd -//.word 0x3f18de48 -//.word 0xc74a2ee5 -//.word 0x877e71be -//.word 0x5741d0e9 -//.word 0x428152de -//.word 0x2c9fa32f -//.word 0xb7c51373 -//.word 0x687ae183 -//.word 0x0674baea -//.word 0x43ad7d96 -//.word 0x9fb941d4 -//.word 0x8856997b -//.word 0xc6451766 -//.word 0x16580e28 -//.word 0x15cd9cfc -//.word 0x60dae8fb -//.word 0xfa89a992 -//.word 0xeec6e832 -//.word 0x35b60649 -//.word 0xd94b0072 -//.word 0x5b16f2e8 -//.word 0x535cda41 -//.word 0x566b9f59 -//.word 0x1c2e528c -//.word 0xe200b328 -//.word 0x0ebef721 -//.word 0x1220c807 -//.word 0x92498e36 -//.word 0xc99ced4d -//.word 0x29d28ee1 -//.word 0x41492372 -//.word 0xe49fa59d -//.word 0x8880e094 -//.word 0xecbc32cc -//.word 0xfe9d90f5 -//.word 0xfb77c92f -//.word 0xd8800f7b -//.word 0xe1e2b36f -//.word 0xa00f302f -//.word 0x00556b98 -//.word 0xb2b239be -//.word 0xd0e92299 -//.word 0xc0d565fb -//.word 0x5cfe3bc5 -//.word 0x4f6a605b -//.word 0xc2b6d055 -//.word 0x3965ce78 -//.word 0xb7772be4 -//.word 0x293dc58e -//.word 0x016d4ef1 -//.word 0x22724f01 -//.word 0xfc056c61 -//.word 0xf801e9d5 -//.word 0x16736dfa -//.word 0xd4f10635 -//.word 0x532e6ee9 -//.word 0xb5cb8ded -//.word 0xc96f3e3d -//.word 0xea1956ef -//.word 0x24b5e369 -//.word 0x99eeb1d2 -//.word 0x234413c6 -//.word 0x3b5edf4e -//.word 0x1aa1bb0f -//.word 0x1d0197c1 -//.word 0x6e177be3 -//.word 0xe17483ad -//.word 0x1c362847 -//.word 0xfbd9c038 -//.word 0x334f4821 -//.word 0x355262ab -//.word 0x55f99abe -//.word 0x2b89edf4 -//.word 0x398e8c4d -//.word 0xcf2bdd24 -//.word 0x2cafc361 -//.word 0xe6681ff1 -//.word 0x8cbc9773 -//.word 0x89759634 -//.word 0x4b5d935e -//.word 0xa50b976c -//.word 0x72fcf9e1 -//.word 0x7ce66c3a -//.word 0x9c483d21 -//.word 0x2246d5e3 -//.word 0x76b48524 -//.word 0x007183d2 -//.word 0x46f62f57 -//.word 0x542e9b13 -//.word 0x61894b09 -//.word 0xaf4c39d8 -//.word 0xb32b1cee -//.word 0x7619eaf8 -//.word 0x3b5f9c9c -//.word 0x62eb316b -//.word 0x8cebf511 -//.word 0x009b03cf -//.word 0x4e5b092c -//.word 0x32054be7 -//.word 0xba7deb2f -//.word 0xab8a6716 -//.word 0x22e46344 -//.word 0x778ea9e8 -//.word 0x66656ef5 -//.word 0x71fad78a -//.word 0x809dbbb1 -//.word 0xcbbaab4d -//.word 0xf9692f4e -//.word 0x89405327 -//.word 0x726b6282 -//.word 0x06fff232 -//.word 0x1c8c2069 -//.word 0x6ef21d2b -//.word 0x4075ea02 -//.word 0x43135ff4 -//.word 0xb81472b2 -//.word 0xd8e4b612 -//.word 0x741e22bf -//.word 0xd9e9142f -//.word 0xf68795d6 -//.word 0xc12bdf9a -//.word 0xd60b1d86 -//.word 0x61b771c2 -//.word 0x3fa93bc3 -//.word 0x601d99bf -//.word 0x70232a64 -//.word 0xb6f218c9 -//.word 0x3c7f55a5 -//.word 0x304e24bf -//.word 0x8a88dca5 -//.word 0xef4fe8a1 -//.word 0xd54e13e9 -//.word 0xe9940316 -//.word 0xada202d7 -//.word 0x66c205e7 -//.word 0x359be63c -//.word 0x8403f582 -//.word 0xa314afc7 -//.word 0xb382cd78 -//.word 0xc42b818c -//.word 0x3af0fcff -//.word 0x75c43382 -//.word 0xb102e371 -//.word 0x2a04d205 -//.word 0x84f159cb -//.word 0x6bd61f54 -//.word 0x77f9272e -//.word 0x526a0d14 -//.word 0x1cda8c62 -//.word 0x0eb044cc -//.word 0x5e5aba4e -//.word 0x63e1a166 -//.word 0xfac15882 -//.word 0x28f7b3b4 -//.word 0x015bfead -//.word 0xc8303fe9 -//.word 0x57fabc27 -//.word 0xc18fbd1c -//.word 0x37719368 -//.word 0x285bd9c9 -//.word 0xac1afa8f -//.word 0x239ef450 -//.word 0x19515bdc -//.word 0x6ea8a073 -//.word 0xb3f79336 -//.word 0xd68927dc -//.word 0x02f075a6 -//.word 0xc19a0495 -//.word 0x64a548da -//.word 0xa4f4688e -//.word 0x898345a3 -//.word 0x8bf7b71b -//.word 0xf87a1977 -//.word 0x95c50973 -//.word 0x887e69f0 -//.word 0x75c5a932 -//.word 0xe80a494b -//.word 0xf32199d7 -//.word 0x1898c4ea -//.word 0x68480c47 -//.word 0xed2a57d3 -//.word 0x466ceb49 -//.word 0x91c4762e -//.word 0x8e055108 -//.word 0x00f005cb -//.word 0x574c0f94 -//.word 0x8d39e099 -//.word 0x4ec12860 -//.word 0x5bb05430 -//.word 0x30a555c6 -//.word 0xe56aa448 -//.word 0x5281837f -//.word 0x76ff8540 -//.word 0x1a9e502b -//.word 0xb10da299 -//.word 0x838a92cf -//.word 0x0ab31978 -//.word 0x9c99d052 -//.word 0x4b17fb27 -//.word 0x0a62c7ff -//.word 0x11e0d094 -//.word 0x823ee606 -//.word 0x4cbd11d0 -//.word 0x4fccd2fb -//.word 0xc2dcac91 -//.word 0xd270e355 -//.word 0x8c7384b1 -//.word 0xfdcfa5f0 -//.word 0x983beead -//.word 0xd854598b -//.word 0x26f03527 -//.word 0xfcaf714b -//.word 0x4bd31765 -//.word 0x1a511737 -//.word 0x702746cf -//.word 0x75f1a6ba -//.word 0xd4b7e875 -//.word 0x630a2f24 -//.word 0x064f1786 -//.word 0xd15af629 -//.word 0x6c3f62da -//.word 0xbc64f360 -//.word 0xbfdb496a -//.word 0xb8ef51c5 -//.word 0x8dfdc5d2 -//.word 0x6d86f238 -//.word 0xb581bed6 -//.word 0x15f6e9fc -//.word 0xefc893da -//.word 0xffd3ff38 -//.word 0x41369668 -//.word 0x0ff22f79 -//.word 0x8ab58dae -//.word 0x3cf0292e -//.word 0xfc2f32fd -//.word 0x11aad32b -//.word 0x9a17b44c -//.word 0x2dc3c328 -//.word 0xbee134b3 -//.word 0xc222c63f -//.word 0x958649f0 -//.word 0x19715d70 -//.word 0xa1017ce5 -//.word 0x0d9f3b20 -//.word 0x36d4cc17 -//.word 0x8c5ec896 -//.word 0xfd842b31 -//.word 0x19a6a17d -//.word 0x74180080 -//.word 0x4c311565 -//.word 0x6c9ea374 -//.word 0x50fca942 -//.word 0x8aa7e425 -//.word 0x65cc95eb -//.word 0xc7c684cc -//.word 0x5ca7459c -//.word 0xf014ba46 -//.word 0x1d57d975 -//.word 0x27afaf94 -//.word 0x24eaa5f9 -//.word 0x6036035d -//.word 0xff35b290 -//.word 0xe44f466a -//.word 0xd24c3c05 -//.word 0xd1227f29 -//.word 0xd40b3108 -//.word 0x98dba92c -//.word 0xcf91b8ad -//.word 0x7e2c31a7 -//.word 0xa4c0a8eb -//.word 0x1cc879f5 -//.word 0xc4be0d1f -//.word 0xdfe95814 -//.word 0xb877a686 -//.word 0x89cb9824 -//.word 0x9a1869c6 -//.word 0xad2f76eb -//.word 0x9a95fe66 -//.word 0x37d92654 -//.word 0x7a244051 -//.word 0xe2124cec -//.word 0x12c0bf58 -//.word 0xc0278464 -//.word 0xcda841ac -//.word 0xb5e7db11 -//.word 0x2add3c68 -//.word 0xfc29546f -//.word 0x3ca75d05 -//.word 0xa144649a -//.word 0x2a1105e4 -//.word 0x059676d3 -//.word 0xb068c7c8 -//.word 0x5efe6702 -//.word 0x9cc0eb58 -//.word 0x34610b2e -//.word 0x526feda2 -//.word 0xe528a706 -//.word 0x4890ff93 -//.word 0x22c0745b -//.word 0x8b818380 -//.word 0x701923a4 -//.word 0x386592a0 -//.word 0xa7285379 -//.word 0x03a37890 -//.word 0x76661d18 -//.word 0xb46535cd -//.word 0xdd4e89e3 -//.word 0xa51afd3d -//.word 0xb2e315e0 -//.word 0x46f5b9a7 -//.word 0x1d273538 -//.word 0x996c8436 -//.word 0x1ca5ceb9 -//.word 0xb5b92ffb -//.word 0x00e8ba54 -//.word 0x475cbe68 -//.word 0xed01479f -//.word 0x0d97e8d5 -//.word 0x5e06b853 -//.word 0x5af19bfe -//.word 0x9f8dc3cf -//.word 0x95b47683 -//.word 0x51351194 -//.word 0xb96f4d67 -//.word 0xe91ec1c7 -//.word 0xd674a892 -//.word 0x316ce5b2 -//.word 0x8f5b444f -//.word 0xc6c70343 -//.word 0x9a7d91cf -//.word 0x99de958c -//.word 0x437a32a4 -//.word 0x6ee08941 -//.word 0xe9b38046 -//.word 0x6001c23e -//.word 0x7fd10891 -//.word 0x5afb96fe -//.word 0x0d3d0845 -//.word 0x9f8a4e24 -//.word 0x2da5f685 -//.word 0x44efa9f6 -//.word 0x8e7ef959 -//.word 0xb16e5add -//.word 0x747c6d2d -//.word 0x24d085e7 -//.word 0x361b644f -//.word 0x2de24545 -//.word 0xbe1a2074 -//.word 0x32f429cd -//.word 0x0dfa9934 -//.word 0xed5bb278 -//.word 0xb483fd89 -//.word 0xe9efd7e5 -//.word 0x5c402b54 -//.word 0x098e81d5 -//.word 0x3ffe38d8 -//.word 0x02970fad -//.word 0xad51eb3d -//.word 0xdc6fd4f8 -//.word 0x880f400e -//.word 0x740094e2 -//.word 0xc8d3e8bc -//.word 0xfc350abd -//.word 0xf87cc619 -//.word 0x7a7f6580 -//.word 0xb7ab74dd -//.word 0x4553c743 -//.word 0x3848bd24 -//.word 0x8caac4c5 -//.word 0xc3fd20ee -//.word 0xce7fe9e6 -//.word 0x31b9539f -//.word 0x6355332d -//.word 0x732fbe7c -//.word 0xf1af9343 -//.word 0x0c55fc34 -//.word 0xf8957076 -//.word 0x93e65d54 -//.word 0x47162537 -//.word 0x32e066d1 -//.word 0x84c07f9c -//.word 0x29065083 -//.word 0xa92a41de -//.word 0x4c5f85a4 -//.word 0x816aa0dc -//.word 0x80b52655 -//.word 0x2f9fc697 -//.word 0x42178819 -//.word 0xa76953b5 -//.word 0x2157b258 -//.word 0x336cd7fe -//.word 0x3f8de1de -//.word 0xefd15ae1 -//.word 0xd4930459 -//.word 0x4dc5d5f0 -//.word 0xab8640de -//.word 0x92f7b660 -//.word 0xa24b6d65 -//.word 0x571e608a -//.word 0x2e089748 -//.word 0x0a71a86c -//.word 0xd5a77ec8 -//.word 0x6a2d5929 -//.word 0xb3571689 -//.word 0x0e13b185 -//.word 0xf60a0811 -//.word 0xdfe8e16a -//.word 0x61f72f4c -//.word 0x99f39166 -//.word 0xcd1a1c0b -//.word 0x4e825a2a -//.word 0xa3af9280 -//.word 0xe3654a0c -//.word 0x63bb0bc3 -//.word 0x91716486 -//.word 0x20833151 -//.word 0x66fe1eb5 -//.word 0x02136688 -//.word 0xc16ae1db -//.word 0xc3b93d2c -//.word 0xd9948bdd -//.word 0x3287fee5 -//.word 0x3762f0c6 -//.word 0xb3d426bf -//.word 0x373b5542 -//.word 0xbdbbe5a8 -//.word 0x8b8df424 -//.word 0x5a9a9ef5 -//.word 0xb8497ce0 -//.word 0xab956ade -//.word 0x97628e12 -//.word 0x611196fd -//.word 0xd55240f5 -//.word 0x453920d3 -//.word 0x73959eed -//.word 0xb27d3e44 -//.word 0x472b24fe -//.word 0x150ed716 -//.word 0x7a1a4552 -//.word 0x74630775 -//.word 0x08eae7b6 -//.word 0xe4b69f72 -//.word 0x4327e41e -//.word 0x1188a37f -//.word 0x4fe38b1d -//.word 0xba19cbf5 -//.word 0xa7311d6e -//.word 0x32f1038e -//.word 0x97ab506e -//.word 0xe05aebeb -//.word 0xc1eed09f -//.word 0xc0e35710 -//.word 0x9818b926 -//.word 0xe0dfd0e3 -//.word 0xe8501e4e -//.word 0xe4e411b0 -//.word 0x4c3f8503 -//.word 0x824c8ba8 -//.word 0xb68f6958 -//.word 0x07b7e25d -//.word 0xea73b702 -//.word 0xd0876d48 -//.word 0x031f51da -//.word 0xd163ba43 -//.word 0xed4b8e5f -//.word 0x12b5070f -//.word 0xe9b5b731 -//.word 0x2d2ccad0 -//.word 0x0d9c8c97 -//.word 0xd23a2b8c -//.word 0xc145bdfb -//.word 0x439784af -//.word 0x437a7168 -//.word 0xd8bce88a -//.word 0x2406c313 -//.word 0x7c6999cf -//.word 0xc83a40cf -//.word 0x2d209017 -//.word 0xea6b6a97 -//.word 0x80a7f95d -//.word 0x16713808 -//.word 0x1b8ab580 -//.word 0x2d2a94e4 -//.word 0x3a97d6c4 -//.word 0xe5f5dc91 -//.word 0x2b602651 -//.word 0x46386197 -//.word 0xd1bca1b3 -//.word 0x2edbeb26 -//.word 0x2546f659 -//.word 0xcdca328e -//.word 0xb0dd0a16 -//.word 0x2a7766c4 -//.word 0x122375a3 -//.word 0x9c55a9e4 -//.word 0x7efe031a -//.word 0x525e90aa -//.word 0x3c19347c -//.word 0xcc8ea6f7 -//.word 0x2664bc2d -//.word 0x6065e952 -//.word 0x2b900473 -//.word 0xb6694a64 -//.word 0xcf94a7fb -//.word 0x4ca2317b -//.word 0xa92bf553 -//.word 0xf21df709 -//.word 0xe3537471 -//.word 0x4f6a6a22 -//.word 0xbed05b2a -//.word 0x5a1d4d01 -//.word 0x0ca715bc -//.word 0xe250d583 -//.word 0xb4a3c445 -//.word 0x07202daa -//.word 0x31d3bb4a -//.word 0xbe2cf31c -//.word 0x130a0231 -//.word 0x5119b9a2 -//.word 0x7c5ed6c7 -//.word 0xdd1085a9 -//.word 0xa4aa26ba -//.word 0xd23e51c4 -//.word 0x560c1720 -//.word 0x76538b28 -//.word 0x716782ee -//.word 0x6304962f -//.word 0x68e27182 -//.word 0x048948d5 -//.word 0xc367a51a -//.word 0x1c206a3e -//.word 0x9b25135b -//.word 0x40883b2e -//.word 0x220f61cb -//.word 0x5787ed8f -//.word 0x185a6e57 -//.word 0x216426ef -//.word 0x5703c8ce -//.word 0xad6d8000 -//.word 0x48473463 -//.word 0xe2730a16 -//.word 0x6c292a2f -//.word 0xf749c5ac -//.word 0xd4ef56ad -//.word 0xfa4827e0 -//.word 0xa9a5173c -//.word 0x4dce9cf2 -//.word 0xa59904a0 -//.word 0x24bb00c8 -//.word 0x98dd6282 -//.word 0x09f3266d -//.word 0xe4c9afeb -//.word 0x59de548e -//.word 0x01761bcd -//.word 0xc4ebc4fc -//.word 0xfa440a7b -//.word 0xd008252d -//.word 0xed55932b -//.word 0x562c18ba -//.word 0x8f0f047b -//.word 0x04ceb4e2 -//.word 0xa79e5be9 -//.word 0xd96b0306 -//.word 0x8e6fce5a -//.word 0xac04822b -//.word 0xb5b64494 -//.word 0xa69da47b -//.word 0x1feadac4 -//.word 0xc3bf4fc4 -//.word 0xe24460f9 -//.word 0x56f75ef8 -//.word 0xaa43d9a6 -//.word 0x82551eab -//.word 0x362bfe24 -//.word 0xc1edd198 -//.word 0xda81bb2e -//.word 0x605a2e1d -//.word 0xfb90b063 -//.word 0x0136dfba -//.word 0x96e8b2c8 -//.word 0x18a30196 -//.word 0xbad94843 -//.word 0x6ec5a8fa -//.word 0x09fd2e21 -//.word 0xa14658d3 -//.word 0x3aabd591 -//.word 0xa2d18d34 -//.word 0x9a85e126 -//.word 0x369734d2 -//.word 0x87ebaa59 -//.word 0x77cd2f87 -//.word 0xf385bc05 -//.word 0x502bd5d0 -//.word 0xe7bd57e9 -//.word 0x036f704f -//.word 0xfe42ef2a -//.word 0xa6d8be49 -//.word 0xe587acce -//.word 0xa2ac7028 -//.word 0xe242eb42 -//.word 0x33b3aefa -//.word 0x4aedbcd5 -//.word 0xebb991f1 -//.word 0x0948633b -//.word 0x2f0fa7e1 -//.word 0x1ed6d70b -//.word 0xb80b73c6 -//.word 0x1c5b4640 -//.word 0x1384ea3b -//.word 0xab648ebc -//.word 0x2156f703 -//.word 0x04bfc5c0 -//.word 0x98e4f884 -//.word 0x79ffb276 -//.word 0x80913e47 -//.word 0xeaf95268 -//.word 0xb746917a -//.word 0x514a5406 -//.word 0x6eefaa6e -//.word 0x37cf9e23 -//.word 0xaafeb819 -//.word 0x3d2ac678 -//.word 0xc4e7db95 -//.word 0x94449920 -//.word 0xe9a2ac9f -//.word 0x85c6971a -//.word 0x9a2cb318 -//.word 0xea9e74cb -//.word 0x2d06ef88 -//.word 0xb381997a -//.word 0x4ab45296 -//.word 0x6263a2d1 -//.word 0x6f3f4291 -//.word 0x8f00de62 -//.word 0x6db419eb -//.word 0x6557d220 -//.word 0xe9a3a5b9 -//.word 0x2329b5e2 -//.word 0xdba1a934 -//.word 0x9c7ff5e4 -//.word 0x12c75b3a -//.word 0xb721b145 -//.word 0xaf30e4ce -//.word 0xef203d8a -//.word 0xa57ee393 -//.word 0xd44da219 -//.word 0x3f56ea55 -//.word 0x89bf1bbf -//.word 0x9adfff81 -//.word 0x4551982b -//.word 0x27471da8 -//.word 0xd2213f71 -//.word 0x2b3fb000 -//.word 0x1013e688 -//.word 0x3e7a1de3 -//.word 0x724c9bcc -//.word 0xcf31374e -//.word 0x80b71c7c -//.word 0x9ea2cb63 -//.word 0x54845f3d -//.word 0x418d15e8 -//.word 0x1da30b96 -//.word 0xa0b548c5 -//.word 0x9f4dfd72 -//.word 0x79650a89 -//.word 0xb17cc4a1 -//.word 0xdce9f6e6 -//.word 0xbe6e2656 -//.word 0xb0101931 -//.word 0x442699aa -//.word 0x2cb175e3 -//.word 0x58ebca18 -//.word 0x5f23811b -//.word 0x20c71900 -//.word 0xa9c3a619 -//.word 0x58091a25 -//.word 0x3f71c4c4 -//.word 0xcdc4162e -//.word 0xab13ab25 -//.word 0xe54e8928 -//.word 0x4a12a3ea -//.word 0x15c1a202 -//.word 0xcdd8e4e4 -//.word 0x697dc510 -//.word 0xb8581e89 -//.word 0x00a40c89 -//.word 0xe686f373 -//.word 0x8d9dc209 -//.word 0x02da78df -//.word 0xd892e70f -//.word 0x0fd1b72f -//.word 0x3bf2af80 -//.word 0xe16c3068 -//.word 0x25ef0223 -//.word 0xa2b054b5 -//.word 0x9a01fd23 -//.word 0x4f2408e2 -//.word 0xb0617090 -//.word 0x385628e2 -//.word 0x148f5ede -//.word 0x8456014a -//.word 0x83cc8164 -//.word 0xaa39d6d3 -//.word 0x52a1c3de -//.word 0xf9985cdc -//.word 0xe756c6eb -//.word 0x100e3ee5 -//.word 0x3d7c5c90 -//.word 0x67be9915 -//.word 0x636410b4 -//.word 0xc5ca81b5 -//.word 0xfea69ba2 -//.word 0xc7dd7bb3 -//.word 0xc39b708a -//.word 0x5fa20120 -//.word 0xfee23100 -//.word 0x534a01b3 -//.word 0x0ddf377b -//.word 0xba0b5e44 -//.word 0xe5370ed7 -//.word 0x829c6d51 -//.word 0x8d55f6d3 -//.word 0xedb9797c -//.word 0x9ee96394 -//.word 0x0fa5400a -//.word 0xc9647e21 -//.word 0x52a37466 -//.word 0x517da3e5 -//.word 0xf27c3b9c -//.word 0x8cafe130 -//.word 0x82fcafdf -//.word 0x67b87cb6 -//.word 0x65755e04 -//.word 0xdf1b6e0e -//.word 0x553bcb04 -//.word 0x889fe234 -//.word 0xdf26ec7e -//.word 0x0acfb708 -//.word 0xe513aa33 -//.word 0x9f7804cd -//.word 0x1b636488 -//.word 0x962d8eaa -//.word 0x8b7a6c07 -//.word 0xd3c6532c -//.word 0x114188de -//.word 0x4ddd03c3 -//.word 0xdfa5725e -//.word 0x8f508141 -//.word 0xfa16597d -//.word 0x38c2665e -//.word 0xbb095e55 -//.word 0x7a1a7f36 -//.word 0x4f7618a3 -//.word 0x9e024ac8 -//.word 0x385a104a -//.word 0x7f697d79 -//.word 0xca3745cd -//.word 0x0b017f90 -//.word 0xaf8fa9d8 -//.word 0xc5c2edb8 -//.word 0x636da2b7 -//.word 0x45651681 -//.word 0xb8dc8bdd -//.word 0xb6ea7fdf -//.word 0x536d315f -//.word 0x581360aa -//.word 0x2db55676 -//.word 0xfce7251c -//.word 0x13cd3101 -//.word 0x8a30ee55 -//.word 0x26d0eb01 -//.word 0x7efc10da -//.word 0x5c61241b -//.word 0x66209112 -//.word 0xfe236c19 -//.word 0x66b0b0c8 -//.word 0x283eca69 -//.word 0xb5885bac -//.word 0x4ce1399d -//.word 0x1dc7b7d2 -//.word 0xafba26e9 -//.word 0x7f4f9b32 -//.word 0xea80f3a8 -//.word 0x4c461526 -//.word 0x6a6a77d7 -//.word 0x0d97e4ef -//.word 0xf0b57c98 -//.word 0xdc72fc2f -//.word 0x12213fb1 -//.word 0xe9c80570 -//.word 0xb874f40b -//.word 0xf6d0dc9c -//.word 0xa0f63f33 -//.word 0xdb851184 -//.word 0xdbf4bcdc -//.word 0x0326675a -//.word 0x4e3e785b -//.word 0xedb45736 -//.word 0x32a9752a -//.word 0xac778e94 -//.word 0x948d2b65 -//.word 0x677a6ad4 -//.word 0xd5470150 -//.word 0xda0a81b9 -//.word 0x2bb8d8cf -//.word 0xd33b1aeb -//.word 0x1ec481ed -//.word 0xb663b275 -//.word 0x0cd54156 -//.word 0xf99d7847 -//.word 0xa65654dc -//.word 0xa947d1b5 -//.word 0x703867f6 -//.word 0xe384d5f6 -//.word 0x45701d3c -//.word 0x5bbbd0a7 -//.word 0xd1768bec -//.word 0xd916c246 -//.word 0x15c8bc68 -//.word 0xb704dfb7 -//.word 0xe7652eb6 -//.word 0x65b810c1 -//.word 0x6f5353ff -//.word 0xe5a87092 -//.word 0xab191110 -//.word 0x4f0ed037 -//.word 0xeb4542dc -//.word 0x4d6a3425 -//.word 0x56e834f8 -//.word 0xa0fe54b3 -//.word 0x63152a1e -//.word 0x9a511b9e -//.word 0x6166daab -//.word 0xa2ad2b83 -//.word 0xf077ed20 -//.word 0xb3a15768 -//.word 0x866882a5 -//.word 0xdd7f2734 -//.word 0xeb5fab81 -//.word 0xc3df5833 -//.word 0xbd04eea3 -//.word 0x1b1a5a93 -//.word 0xec03c51d -//.word 0x31d0d0e9 -//.word 0x3f8e1ea3 -//.word 0x646214ac -//.word 0xcdd9dc10 -//.word 0xa779b0b9 -//.word 0x859c55e2 -//.word 0x027ee5ce -//.word 0xa794d2b9 -//.word 0x0f1f280f -//.word 0x480212dc -//.word 0x7dd0a083 -//.word 0xd22ac7b4 -//.word 0x9048aa98 -//.word 0x82d5174e -//.word 0x9f00559b -//.word 0xe8d01ddd -//.word 0x94b7e641 -//.word 0x6b6b6636 -//.word 0x70f15522 -//.word 0xc2fa7453 -//.word 0xc473ce38 -//.word 0x7c583dd1 -//.word 0x39c93164 -//.word 0x795fad72 -//.word 0x09c092e9 -//.word 0x6e71209b -//.word 0x84ecbaef -//.word 0x65f3e9d6 -//.word 0x8c23a401 -//.word 0x3bcccf52 -//.word 0x19000190 -//.word 0x20ea8a5e -//.word 0xb661b56e -//.word 0x1abd4af2 -//.word 0x02ea5753 -//.word 0x83bb3026 -//.word 0x3080b55c -//.word 0x86dad3b8 -//.word 0x88ce4e87 -//.word 0xa619bd8b -//.word 0xe3c3d638 -//.word 0x37f7eb23 -//.word 0x3212b5b7 -//.word 0xe3fa5129 -//.word 0xf8b188af -//.word 0x262a53ed -//.word 0xcc5b9eb0 -//.word 0xd3934ddf -//.word 0xd80e7daf -//.word 0x8dc70c15 -//.word 0x5c8d5b81 -//.word 0x4e5952c9 -//.word 0x2cdfa563 -//.word 0xe46356d8 -//.word 0x2dce7c75 -//.word 0x6e014244 -//.word 0xdc69323b -//.word 0xe3d3b4b2 -//.word 0xc882d11b -//.word 0x8c7f3ded -//.word 0x133195e1 -//.word 0x862de561 -//.word 0xf54f6d3d -//.word 0x410aa5a1 -//.word 0x39fc7e44 -//.word 0x03c6ebe1 -//.word 0xbe1aa0eb -//.word 0x6516197d -//.word 0xf6d0df90 -//.word 0xd4320770 -//.word 0x6a08fb71 -//.word 0x12577ddd -//.word 0x35f0e832 -//.word 0xb346b98a -//.word 0x857d4f5b -//.word 0xa1c3ef60 -//.word 0x1de30bd7 -//.word 0x9817c4ed -//.word 0xd61ead77 -//.word 0xaa8fd2e2 -//.word 0x196df96d -//.word 0xbcfb2795 -//.word 0x66d266d1 -//.word 0x0730c680 -//.word 0xd093a220 -//.word 0x988724c0 -//.word 0x7fbc0bb8 -//.word 0xd15bac97 -//.word 0x2d9a375d -//.word 0xe68f3ceb -//.word 0xa9416eb7 -//.word 0x6005a6c4 -//.word 0x57082bd2 -//.word 0x9d2830d2 -//.word 0xae089e9c -//.word 0x4e6314e4 -//.word 0xb8a02c6a -//.word 0xf8a70172 -//.word 0x96f4ee74 -//.word 0x74e99814 -//.word 0xf9692e54 -//.word 0x6fa2ef09 -//.word 0xaa2aed8c -//.word 0xeb4e11b1 -//.word 0x04a760fd -//.word 0xbcee7c13 -//.word 0x74106e70 -//.word 0x0b85a258 -//.word 0x00de3310 -//.word 0xd69e6a4e -//.word 0xbd4b81ee -//.word 0x6ec5ace6 -//.word 0x57d65a7c -//.word 0xf809b7b7 -//.word 0x8dc07613 -//.word 0xed81cf78 -//.word 0xb291c36d -//.word 0x9ac4a78a -//.word 0x2d93e02b -//.word 0xa06fec6c -//.word 0xfa55a251 -//.word 0x75a3ba44 -//.word 0x272a8fc5 -//.word 0xe184245d -//.word 0x58a765d3 -//.word 0x82bbb0a3 -//.word 0x432994ac -//.word 0x49f5d929 -//.word 0x354dc0e2 -//.word 0xfb628ba4 -//.word 0x8b7640ee -//.word 0xb136abed -//.word 0x394ba2aa -//.word 0x582c8d83 -//.word 0x473625d8 -//.word 0x31fe7b06 -//.word 0x4fe63c99 -//.word 0x52ee34bd -//.word 0x01cd12f6 -//.word 0x23416b11 -//.word 0x9fa3015b -//.word 0xe2be4410 -//.word 0x81e11916 -//.word 0x1f33dbeb -//.word 0x92479fdd -//.word 0x41f0bd79 -//.word 0xd0578c45 -//.word 0x004a6cb2 -//.word 0xd0d70a4c -//.word 0xe91adf34 -//.word 0x3853fad0 -//.word 0xdd3b00c1 -//.word 0x44997115 -//.word 0x91102cbe -//.word 0x423b3643 -//.word 0x0ffcb7b6 -//.word 0x151045e6 -//.word 0x34e765d5 -//.word 0xb6b34f6d -//.word 0x31c0f26e -//.word 0xae0338ab -//.word 0x0af58b76 -//.word 0x9da29859 -//.word 0x1afc5307 -//.word 0xb6763b91 -//.word 0x8dcedfdd -//.word 0x412aa155 -//.word 0xe467badc -//.word 0x18ae7e06 -//.word 0x7448e188 -//.word 0x2ab33bed -//.word 0xe7f5488b -//.word 0xfb3073b6 -//.word 0xba775433 -//.word 0x22e077ef -//.word 0xbeda5ff1 -//.word 0xc9c1ca8e -//.word 0x97b037dc -//.word 0x3197a669 -//.word 0x408d9f2c -//.word 0x2c6775bb -//.word 0x8489ccbf -//.word 0xa1fc59a5 -//.word 0x86c1e997 -//.word 0x0b65a5ab -//.word 0x3bd6945a -//.word 0xfa756133 -//.word 0xeb6c5fd0 -//.word 0x9042ca0a -//.word 0xb3ad5069 -//.word 0x05a7cfde -//.word 0x06c361b5 -//.word 0x24c296c5 -//.word 0x276100ea -//.word 0xcc76f5b5 -//.word 0xb03b9061 -//.word 0x70eaf909 -//.word 0x0f8ae619 -//.word 0x98086203 -//.word 0x0489ce33 -//.word 0x5dff2544 -//.word 0x24fa8474 -//.word 0xf1c2e955 -//.word 0x59a23ac6 -//.word 0x14868a22 -//.word 0x5fc999b7 -//.word 0xa048997a -//.word 0x49bb38f8 -//.word 0xfe45da90 -//.word 0xfa4926e0 -//.word 0xaf80c57d -//.word 0xac4866e7 -//.word 0xc43f06bc -//.word 0x6d116e2b -//.word 0x668efdac -//.word 0x9d00a7ee -//.word 0x4fbb3e11 -//.word 0x71f5f016 -//.word 0x4fd81294 -//.word 0x73d61cac -//.word 0xc83df43e -//.word 0xff0b6f5d -//.word 0x32031501 -//.word 0xc70024fc -//.word 0x988ad830 -//.word 0x50a7eafe -//.word 0x18f35602 -//.word 0x74f362fd -//.word 0x67a7dc12 -//.word 0xde5ea336 -//.word 0x4cce69e2 -//.word 0x9164b60a -//.word 0x20d93053 -//.word 0x61061b81 -//.word 0x54f91c2e -//.word 0x784842c2 -//.word 0xeba5469f -//.word 0xd2b3129c -//.word 0xfb1981b5 -//.word 0xc1d46601 -//.word 0x30d1cfe4 -//.word 0x6abb8b85 -//.word 0x4912e982 -//.word 0x467dc3e3 -//.word 0x9a61bb4d -//.word 0xa3b2c578 -//.word 0x8809e6e3 -//.word 0x20f73bc7 -//.word 0x109a3c49 -//.word 0x346d42f3 -//.word 0x41644765 -//.word 0xa839ed48 -//.word 0xbd00c284 -//.word 0x1802c3b3 -//.word 0x3bc81fd5 -//.word 0x76763d45 -//.word 0x085bffec -//.word 0x87c549b4 -//.word 0x821abd3f -//.word 0x6424c9da -//.word 0x9bade4ac -//.word 0xfa4c1433 -//.word 0x5c7eb4f2 -//.word 0x8bf87463 -//.word 0x603ca133 -//.word 0x2b6ba7ae -//.word 0x545ad479 -//.word 0x43e75e7f -//.word 0x7e8ea82d -//.word 0x1137c1e2 -//.word 0x33522da1 -//.word 0x2626e90a -//.word 0x5f66a988 -//.word 0xe70664cb -//.word 0x014c1279 -//.word 0x0d2ab520 -//.word 0xaccb9670 -//.word 0x256cd1a7 -//.word 0x086d134c -//.word 0x11a8a320 -//.word 0x4e019f52 -//.word 0x843e89f2 -//.word 0xd01a02a8 -//.word 0x8a94d4a6 -//.word 0x6e8d36db -//.word 0xfe924c69 -//.word 0x22f7ee5a -//.word 0x1225aa8e -//.word 0x75340cf8 -//.word 0xcbbd1c0b -//.word 0x08e9296e -//.word 0x81cec5f7 -//.word 0x0cfc11d7 -//.word 0x63523b12 -//.word 0xca174433 -//.word 0xf246073d -//.word 0x1c2877e4 -//.word 0x812828fd -//.word 0xf2e41134 -//.word 0xbc8090fd -//.word 0xce3faecd -//.word 0x1e54a589 -//.word 0x48f59f3f -//.word 0x78b2c114 -//.word 0x8b05687d -//.word 0x712ab2b2 -//.word 0xd6304160 -//.word 0x01513b9e -//.word 0xfc7f9523 -//.word 0xf53f92b6 -//.word 0xe4ba86e5 -//.word 0x6e11e0fa -//.word 0x09f2672b -//.word 0x6269c411 -//.word 0xfcf8415c -//.word 0x19e9d0c4 -//.word 0xdde34f43 -//.word 0xb1bc0a81 -//.word 0xe68e8290 -//.word 0x9a0d6dd9 -//.word 0xe017fd56 -//.word 0x1b8d6502 -//.word 0xab629a8e -//.word 0xccf15656 -//.word 0xba946393 -//.word 0x1a7216d2 -//.word 0x95981aa5 -//.word 0xc64c6e98 -//.word 0x569db166 -//.word 0x653f9e6d -//.word 0x2c96d360 -//.word 0xe111d63c -//.word 0xdbb9597d -//.word 0xf70abd91 -//.word 0x3a01d68d -//.word 0xb876ee1f -//.word 0xb4ac0cc3 -//.word 0x0827763a -//.word 0xc8bd7439 -//.word 0x22f0575e -//.word 0x887bba67 -//.word 0x122b08a6 -//.word 0x1df03eb0 -//.word 0x3934f256 -//.word 0x426b95d6 -//.word 0xccecf552 -//.word 0xc4ff0580 -//.word 0x5537e1a4 -//.word 0x09020dbb -//.word 0x317efdf9 -//.word 0x868edb76 -//.word 0x102e8425 -//.word 0x4703d405 -//.word 0x7936239b -//.word 0x6b830f9f -//.word 0x438d7cf6 -//.word 0xa575dae0 -//.word 0x1daaa773 -//.word 0xbd033448 -//.word 0x070bab74 -//.word 0x0d9c51b9 -//.word 0xd6af09fe -//.word 0x04721afd -//.word 0xb49b313c -//.word 0xa6fcaa3e -//.word 0x9e580bfa -//.word 0x0976d18c -//.word 0xe473702b -//.word 0xda5c955b -//.word 0xacfdae63 -//.word 0xd6f3ac02 -//.word 0x7009075e -//.word 0x52c1033d -//.word 0x7b303377 -//.word 0xb40f3bac -//.word 0x7010d932 -//.word 0xf76e2751 -//.word 0xc3c81ab3 -//.word 0x2a2f4f16 -//.word 0x3e7e0744 -//.word 0xf2e97045 -//.word 0x7ed926d3 -//.word 0x04f8f90e -//.word 0x7387f171 -//.word 0xacf88f05 -//.word 0xe3b956d4 -//.word 0x484e8aa1 -//.word 0xe7a238d6 -//.word 0xcd9f76be -//.word 0x6dfcecf4 -//.word 0x4256931c -//.word 0xb583bdd0 -//.word 0x402356dd -//.word 0xd47769b0 -//.word 0x7877e50b -//.word 0x341ea2fd -//.word 0x2d099f10 -//.word 0x11408ec4 -//.word 0xb554923c -//.word 0xfdaa4738 -//.word 0xfd160343 -//.word 0x5dab5b2e -//.word 0x02d2e9bc -//.word 0xea9a4d9f -//.word 0x584f72a3 -//.word 0x324e132a -//.word 0xa7177dd8 -//.word 0x14a4968f -//.word 0x29fa1e9e -//.word 0x48fd3535 -//.word 0x2d881d1d -//.word 0xd4bd42a5 -//.word 0x979a77e0 -//.word 0x98cd830d -//.word 0x5ecadc57 -//.word 0xc31ab2bf -//.word 0x0df62f56 -//.word 0x5b14feaf -//.word 0x43c10a94 -//.word 0xb93088f8 -//.word 0x3212372d -//.word 0x0a66e657 -//.word 0x23933821 -//.word 0xd0b4a4ae -//.word 0xf133bfd3 -//.word 0x5f99be83 -//.word 0x8aa4368a -//.word 0x609b277e -//.word 0x71de39f3 -//.word 0x51c145ef -//.word 0x3e9a179e -//.word 0x03197346 -//.word 0x1cd8557c -//.word 0x1b337d99 -//.word 0x4b5a2b68 -//.word 0x92a42821 -//.word 0x9c27059b -//.word 0x3585a7bd -//.word 0xf7080436 -//.word 0x26f2276d -//.word 0xd80e7abb -//.word 0x598b44d9 -//.word 0xcd0a7194 -//.word 0x17f692c8 -//.word 0xfa14248b -//.word 0x7e5b15a9 -//.word 0x96058451 -//.word 0xffe6c90d -//.word 0x6bfdb5f7 -//.word 0xdf491a2b -//.word 0x5add8e78 -//.word 0xb7376d5b -//.word 0xd4ce1d2d -//.word 0xf4ea969b -//.word 0x62b82157 -//.word 0x589e5f0d -//.word 0x1ecc8e99 -//.word 0x76140877 -//.word 0x38fb0c7a -//.word 0x3a10c1c1 -//.word 0x727c78e8 -//.word 0x5fdb327b -//.word 0xa44a62b0 -//.word 0xf7c1f455 -//.word 0x39a48d07 -//.word 0xe69415a5 -//.word 0xb08b7304 -//.word 0x672897e4 -//.word 0x1c47be23 -//.word 0x86d5f131 -//.word 0xa5e3cfc4 -//.word 0xa4f88dcd -//.word 0x04ac3baa -//.word 0xf772499d -//.word 0x0ab6497d -//.word 0x0728f6ab -//.word 0x1a577648 -//.word 0x3281dca5 -//.word 0xaaa9f1fb -//.word 0x29eb345d -//.word 0xc70d1fea -//.word 0x7156ac47 -//.word 0x8ea3184d -//.word 0xe2b7e7fe -//.word 0xb3d328be -//.word 0x2b86fac0 -//.word 0xfec74fbe -//.word 0x4d41f0ed -//.word 0xc9eec230 -//.word 0x1be7478b -//.word 0x847b67db -//.word 0xc07e71c5 -//.word 0x31e35ded -//.word 0x398e5468 -//.word 0xe8637273 -//.word 0xd7a3ca65 -//.word 0x5378aae2 -//.word 0xbece2152 -//.word 0x3365bf91 -//.word 0x69249ce8 -//.word 0xdab19b3d -//.word 0x243ef086 -//.word 0xafa6e084 -//.word 0x90b8c8ad -//.word 0xadd2616a -//.word 0x22b34282 -//.word 0xe48aa7d6 -//.word 0xa4527050 -//.word 0xf7626d16 -//.word 0xb340d803 -//.word 0x9cb72357 -//.word 0x4029f5ad -//.word 0x1f266f2e -//.word 0x0f3cb305 -//.word 0xdf11a712 -//.word 0x3bb0f6e3 -//.word 0xcf2158e0 -//.word 0xb03c14c5 -//.word 0xf7bec356 -//.word 0xaf9d564e -//.word 0xf1995a98 -//.word 0x4d147bc1 -//.word 0x6c2347ae -//.word 0xf4e5358a -//.word 0xac14e603 -//.word 0xe1d9aab6 -//.word 0x08e546e7 -//.word 0xa4bdf576 -//.word 0x6a55ac0e -//.word 0xa3e1a2a0 -//.word 0xd3e81010 -//.word 0x989a352e -//.word 0xd4639ee7 -//.word 0x0ec0a4bd -//.word 0x16523674 -//.word 0xe831d90e -//.word 0xd382ecfa -//.word 0xdb4c3189 -//.word 0x5b8789a1 -//.word 0xef76ffb5 -//.word 0x903708f4 -//.word 0x019909c1 -//.word 0x6b2d1a64 -//.word 0x44a00aff -//.word 0x7447a3c3 -//.word 0xbbfc2f63 -//.word 0x4d293bc9 -//.word 0xc0229a09 -//.word 0x28b8ad93 -//.word 0x810be2ac -//.word 0x4d9f7b1f -//.word 0x7db2912f -//.word 0x95cd58d1 -//.word 0x0c9aa418 -//.word 0xf1f5acf1 -//.word 0xd5450e10 -//.word 0xe40d142a -//.word 0x55be3665 -//.word 0x05d0e00d -//.word 0x5e107588 -//.word 0x7e3c938c -//.word 0x95cd998f -//.word 0x8f14667f -//.word 0xf48864b4 -//.word 0x0c5fc623 -//.word 0x465b0dd4 -//.word 0xdae7d196 -//.word 0xae62bef1 -//.word 0x77bbdd5c -//.word 0x203e14b0 -//.word 0x6fadf1dd -//.word 0xe693a3db -//.word 0xe7d549e4 -//.word 0x1c8a70e1 -//.word 0x160cd622 -//.word 0x344f7451 -//.word 0xc772bca9 -//.word 0x73942063 -//.word 0xd9e9d371 -//.word 0x720dd36f -//.word 0xbe9827d7 -//.word 0x9ff26574 -//.word 0xff697819 -//.word 0xb980a092 -//.word 0xb78abadb -//.word 0x5878c290 -//.word 0x14f096a5 -//.word 0x629ffd57 -//.word 0xd9cfe762 -//.word 0x963cf775 -//.word 0xdf233ee3 -//.word 0x059d4a9b -//.word 0x8f2b5f5a -//.word 0x9492041f -//.word 0x69e9c1e0 -//.word 0x7df0287b -//.word 0x80a312ef -//.word 0xcb0f2bcc -//.word 0xfc65b1e8 -//.word 0xe04d7854 -//.word 0x977c328e -//.word 0xf289edf8 -//.word 0x20fcdd89 -//.word 0x8aa95cc3 -//.word 0xfb3c2fe5 -//.word 0x04140b61 -//.word 0x9f555790 -//.word 0x123834a5 -//.word 0x16a6bbe0 -//.word 0x39068504 -//.word 0x8153710a -//.word 0x5271a117 -//.word 0x91c1c6ac -//.word 0x0af39e1c -//.word 0x0f1bbb44 -//.word 0x62078576 -//.word 0x56d082b6 -//.word 0x30b0d529 -//.word 0xd31305ca -//.word 0x9df1005f -//.word 0x8c5a60ac -//.word 0xa553ece6 -//.word 0x96e0626a -//.word 0x9a6274af -//.word 0x9d231079 -//.word 0xa130e450 -//.word 0x60672231 -//.word 0x32d08083 -//.word 0x3231844c -//.word 0x9cdcfea5 -//.word 0x7accd66c -//.word 0x80f00738 -//.word 0x34c7ec92 -//.word 0x522dbb62 -//.word 0x6e754fa7 -//.word 0xdbb72a6b -//.word 0xcc6bbaf7 -//.word 0xb937db43 -//.word 0x04069eb0 -//.word 0xdd5a48f9 -//.word 0x63e39e67 -//.word 0x0b506045 -//.word 0x46651494 -//.word 0x5e4e0400 -//.word 0xa1338a12 -//.word 0xc20c8ba6 -//.word 0x7cb742a0 -//.word 0x78473fdb -//.word 0x71a0af62 -//.word 0x9641dde3 -//.word 0x3060f960 -//.word 0x843c1928 -//.word 0xfbaf7d06 -//.word 0x800217b8 -//.word 0x2a064aa2 -//.word 0x1b60f3c4 -//.word 0xa825a6ea -//.word 0xbaa73a22 -//.word 0x738e8773 -//.word 0x152a6ecc -//.word 0x20071a3b -//.word 0xbbc2865f -//.word 0x551c3f20 -//.word 0x8c4d6c9d -//.word 0x4e9b0b66 -//.word 0x3e2a7dec -//.word 0x59164536 -//.word 0xd9bf0dd5 -//.word 0x5964e919 -//.word 0x3bf4e085 -//.word 0x4720a981 -//.word 0x94b5b24f -//.word 0xac296740 -//.word 0xeb73b028 -//.word 0x2820bb0f -//.word 0x98a4fd29 -//.word 0xeeee7309 -//.word 0xc73f2e11 -//.word 0x463b0e2d -//.word 0xfb41cec1 -//.word 0x0af840df -//.word 0x892adabe -//.word 0x29d67267 -//.word 0x198046b2 -//.word 0x27cc3f71 -//.word 0x294b77eb -//.word 0x9b95f88c -//.word 0x8998c7da -//.word 0xb02f21ab -//.word 0xe0f70495 -//.word 0xa45ef1a7 -//.word 0x25fcf156 -//.word 0x4c27d6ba -//.word 0x27c1c3fb -//.word 0x8e55ee06 -//.word 0x0662a584 -//.word 0xe5f78f0c -//.word 0xb7803597 -//.word 0xe1e0c035 -//.word 0x84c004ff -//.word 0xa426be4d -//.word 0x8a491a29 -//.word 0x66a47903 -//.word 0x394970a6 -//.word 0xf278146a -//.word 0xd77075ab -//.word 0x2785687b -//.word 0xfe738a94 -//.word 0x78f28190 -//.word 0x198a855d -//.word 0x6da920eb -//.word 0xebf33127 -//.word 0x1fd9372d -//.word 0x096dccb9 -//.word 0xc07470df -//.word 0x5abd88fd -//.word 0x10b2a6ed -//.word 0x9e2d0b7f -//.word 0xe98d6b26 -//.word 0xe408f0f1 -//.word 0xb44381bd -//.word 0x131f43aa -//.word 0xf2d660cb -//.word 0x62480822 -//.word 0xb48fb6cb -//.word 0xdfd9b577 -//.word 0x2377e21c -//.word 0xec31b3eb -//.word 0xf9dd7883 -//.word 0xbd30e164 -//.word 0x06d3c1a6 -//.word 0xdcb911eb -//.word 0xacb13892 -//.word 0xa6378a2d -//.word 0x63900e35 -//.word 0xcb1684fd -//.word 0x36d0a6e5 -//.word 0xd145afd0 -//.word 0x44921ad8 -//.word 0x91bbac40 -//.word 0x3f3fb4a9 -//.word 0xb9ef9289 -//.word 0xf1ff76da -//.word 0x485e6a0f -//.word 0xb243934c -//.word 0x1509b3d6 -//.word 0xf33cf3c9 -//.word 0x49f4e009 -//.word 0xb761b37a -//.word 0xe0a8d574 -//.word 0x14eda271 -//.word 0x2db16e09 -//.word 0xb65fc521 -//.word 0x5321f75f -//.word 0x5cf8d4e1 -//.word 0xcc0cb52e -//.word 0x5a41bc6c -//.word 0xe50a5cd4 -//.word 0x15821b64 -//.word 0x40b996d3 -//.word 0x8a4bc6ca -//.word 0x51388351 -//.word 0xc8ef4688 -//.word 0xe1ac3397 -//.word 0x710457e7 -//.word 0x8fbf2e93 -//.word 0x3ce56819 -//.word 0x4a1bec56 -//.word 0x76301eb1 -//.word 0xd8f45d96 -//.word 0x7d49d026 -//.word 0x527c632c -//.word 0x43d50c53 -//.word 0xa56c5397 -//.word 0xd13f11fa -//.word 0x12827878 -//.word 0xc236533c -//.word 0xaffd8f14 -//.word 0xc42dfb23 -//.word 0xe5234cd6 -//.word 0x1ada6419 -//.word 0xf0bcd4ca -//.word 0x1cb79f6d -//.word 0x62944122 -//.word 0xb584efd5 -//.word 0xa0fc21b5 -//.word 0xe4c34ee7 -//.word 0x634af67b -//.word 0x3c3be69f -//.word 0x3854b812 -//.word 0x657699dc -//.word 0x00f94f3d -//.word 0x98437ae3 -//.word 0x7199195f -//.word 0x273451da -//.word 0x93986a04 -//.word 0xf2211b4e -//.word 0x44df0759 -//.word 0xf3a487ae -//.word 0xb55aaaaf -//.word 0xb39a7ace -//.word 0xeb7b81fc -//.word 0xd3a88c64 -//.word 0x3fb6af5a -//.word 0x84b4898e -//.word 0xde03c986 -//.word 0x0f68f14b -//.word 0x495f5b62 -//.word 0x4eb279fd -//.word 0xd64b6073 -//.word 0x314688ee -//.word 0x2d4bcd63 -//.word 0x3a1bbac8 -//.word 0xcc680781 -//.word 0x01ea601b -//.word 0x84af693c -//.word 0xb1b3feda -//.word 0xfab0bfac -//.word 0x8937ccde -//.word 0x2600cd09 -//.word 0x5c7f3662 -//.word 0xd7b7c932 -//.word 0x11535c86 -//.word 0x2ef3dc27 -//.word 0x24c492cc -//.word 0x1e53a58f -//.word 0x23a3e09e -//.word 0xf27db633 -//.word 0x310783c6 -//.word 0xc7981581 -//.word 0x87cb6bf4 -//.word 0x0ed2bc0a -//.word 0xee0dbc3b -//.word 0x0cdb1a04 -//.word 0x46b14d94 -//.word 0x596990c9 -//.word 0x02dc2b5a -//.word 0x64b2f556 -//.word 0xaa7917cd -//.word 0xedf512cc -//.word 0x58b7048f -//.word 0x8af127f3 -//.word 0x3b899a2a -//.word 0x236c64b2 -//.word 0x1725b688 -//.word 0x76ae7099 -//.word 0xc386e779 -//.word 0x9303e557 -//.word 0xaaeaf231 -//.word 0x613dd244 -//.word 0x4b544fc7 -//.word 0x172f39d8 -//.word 0xb80baab7 -//.word 0xc4338e32 -//.word 0x1a196360 -//.word 0xc8a53e92 -//.word 0x2ccd0f87 -//.word 0x596625df -//.word 0xbb3af5d2 -//.word 0xff5a1722 -//.word 0x2db6914e -//.word 0x17ea5809 -//.word 0xf75b14ea -//.word 0x54832465 -//.word 0x2589e2fa -//.word 0x391528ac -//.word 0xd66213b5 -//.word 0xa1950678 -//.word 0xbd4df2b7 -//.word 0x377bd506 -//.word 0xa2748180 -//.word 0xfe449fb8 -//.word 0xdf45f3f3 -//.word 0xcbf1e294 -//.word 0xe3f531d7 -//.word 0xc5860fc2 -//.word 0xb2f85659 -//.word 0xec8d0e12 -//.word 0x628b3388 -//.word 0x8f91b773 -//.word 0xa02acbd8 -//.word 0xd5a35b7d -//.word 0x291ad7a0 -//.word 0x35d839e8 -//.word 0x52e1449c -//.word 0xfec80913 -//.word 0x81c8b06c -//.word 0xd011757f -//.word 0xb160f112 -//.word 0x20d29b51 -//.word 0xf1fa8e78 -//.word 0xb8318dd3 -//.word 0xe62d44e8 -//.word 0x34d6d0f3 -//.word 0x45548292 -//.word 0x866de0c2 -//.word 0x5a0eed0a -//.word 0x7427abf6 -//.word 0x83bcddc7 -//.word 0x153a1169 -//.word 0xb507dea5 -//.word 0x575c6b98 -//.word 0xf7573064 -//.word 0x7c4c0125 -//.word 0xe25d4827 -//.word 0x984a9256 -//.word 0x278a4df5 -//.word 0x159acf93 -//.word 0x09959b3b -//.word 0x2f05e0ec -//.word 0xdef84348 -//.word 0x7957de90 -//.word 0x937489d0 -//.word 0x56e25857 -//.word 0x2589656a -//.word 0x80f9cf3a -//.word 0x28ff0213 -//.word 0x847639d5 -//.word 0x446042a8 -//.word 0x443681ec -//.word 0xb37c386f -//.word 0x749706e3 -//.word 0xc4e3ad8f -//.word 0x1e011844 -//.word 0x5b6e9c93 -//.word 0x1e5a7e3d -//.word 0x6fb7b5eb -//.word 0xa690f21f -//.word 0x8b9cde6b -//.word 0xbb13a2e1 -//.word 0x4ec0adca -//.word 0xb658b19b -//.word 0xea0aef24 -//.word 0xc557b50b -//.word 0xa8242579 -//.word 0x670d3713 -//.word 0x63fd022c -//.word 0xf3fb3738 -//.word 0x0947ee84 -//.word 0x12a6a525 -//.word 0x1dfa852f -//.word 0x4015e827 -//.word 0x37cf19ba -//.word 0x4f565aae -//.word 0x83c62c1a -//.word 0xe4facad2 -//.word 0x3ea1f726 -//.word 0xf894f9cc -//.word 0x3c67e61a -//.word 0x583d1e78 -//.word 0x64e11916 -//.word 0x251363da -//.word 0x3220e49d -//.word 0x55b66596 -//.word 0x34f55016 -//.word 0x31c9b776 -//.word 0x8e78984e -//.word 0xd57760e8 -//.word 0x7782adf5 -//.word 0xb3eb587e -//.word 0xb933b31d -//.word 0x10d70f6c -//.word 0x356c82be -//.word 0x85eee70d -//.word 0x5c562534 -//.word 0x7f6ab55e -//.word 0xb7d95ebf -//.word 0xbf874382 -//.word 0x60262002 -//.word 0xdb06d13c -//.word 0x872e1485 -//.word 0xbbab8f78 -//.word 0xee281533 -//.word 0x1dbf25c3 -//.word 0x6e0fb3dc -//.word 0x128f2bcd -//.word 0x6f21b4b4 -//.word 0x7febb2ee -//.word 0x73628ed2 -//.word 0x9da7b99f -//.word 0x8c17eeb2 -//.word 0x791eb8fd -//.word 0xe24b35b4 -//.word 0x74aa1949 -//.word 0x2e4ef59b -//.word 0xc42dba6b -//.word 0x4131790f -//.word 0xf18b6c6a -//.word 0x7e4b3a1b -//.word 0x592d77f5 -//.word 0x5bb66aaf -//.word 0xad8014dd -//.word 0xe5d36d1f -//.word 0x7174f199 -//.word 0x39c25ba3 -//.word 0x80feb1c1 -//.word 0x0beb80d5 -//.word 0x86976993 -//.word 0x2378dc36 -//.word 0x84ba2471 -//.word 0xdbd8a4a9 -//.word 0x506a6061 -//.word 0xa33ebff6 -//.word 0x12a98f8c -//.word 0x7d1f4948 -//.word 0xc80296c0 -//.word 0x81b813af -//.word 0xc20051ee -//.word 0x5986219f -//.word 0x27b50eab -//.word 0xc6cc2a70 -//.word 0x6f340eb3 -//.word 0x1a111cdc -//.word 0xe6170762 -//.word 0xbc9e9684 -//.word 0x2ff9a43a -//.word 0xa7046c6b -//.word 0xbffd0360 -//.word 0xeb952679 -//.word 0x5e46361e -//.word 0x2be681f9 -//.word 0xaa7dc362 -//.word 0x1d54ed1b -//.word 0x934e243e -//.word 0x0d7b0d73 -//.word 0xe0eb4866 -//.word 0x5ac03a79 -//.word 0xa88710b6 -//.word 0xf7c90007 -//.word 0xdadcd2a9 -//.word 0xecffa0de -//.word 0xb6a7dae2 -//.word 0xd3138c21 -//.word 0x5126e4a7 -//.word 0x5b76efd8 -//.word 0x15a1a361 -//.word 0xc8e0226e -//.word 0x3fde3d1e -//.word 0x71ca3733 -//.word 0x60aacc0f -//.word 0x40f372dc -//.word 0xdc57df0a -//.word 0x36dfcbfe -//.word 0x6d39f708 -//.word 0xe4536e96 -//.word 0xa1290ba8 -//.word 0xf3db3b84 -//.word 0x580204ab -//.word 0x9d44470b -//.word 0x47264276 -//.word 0x32225853 -//.word 0x78fa1594 -//.word 0x944b6de8 -//.word 0xc8654431 -//.word 0xbc5a3438 -//.word 0x67558a9f -//.word 0x322d9118 -//.word 0x5b3a14d5 -//.word 0x98681e40 -//.word 0xfe8904eb -//.word 0x20f0a5ca -//.word 0x7b3bf1a0 -//.word 0x1270a8b7 -//.word 0x554c64d4 -//.word 0x47d7da6a -//.word 0xe03c5d0e -//.word 0xb0d8a42b -//.word 0xc691ccf7 -//.word 0xd069a0a5 -//.word 0x845219dd -//.word 0x3e452169 -//.word 0xea8e9c31 -//.word 0x246aa969 -//.word 0x9ed32509 -//.word 0xc29b727d -//.word 0x99b8769e -//.word 0xecdfe6e2 -//.word 0xa954c4cf -//.word 0x870026b6 -//.word 0xedc43a9d -//.word 0x110d877d -//.word 0x5da875ae -//.word 0x16d8109f -//.word 0x3fa609ca -//.word 0xbb79fde7 -//.word 0xb3e6fa60 -//.word 0x37c94006 -//.word 0x28954402 -//.word 0x55e8fb0e -//.word 0xe46354e5 -//.word 0xf4b807f7 -//.word 0x80048d62 -//.word 0x86606f1e -//.word 0x69b2c477 -//.word 0x95caf5c1 -//.word 0x61aac447 -//.word 0x39248d84 -//.word 0xfcabcb96 -//.word 0xa363ddef -//.word 0x247a0b4e -//.word 0x95bbc4ed -//.word 0x956029fc -//.word 0xe828d04f -//.word 0x61aac154 -//.word 0x05e9c547 -//.word 0x6d28e1a9 -//.word 0x6c001dee -//.word 0xf2af8976 -//.word 0x30b382be -//.word 0xfd9832d8 -//.word 0x790e5618 -//.word 0xf03e4411 -//.word 0x015e2cbf -//.word 0xff839e06 -//.word 0x97b74c5b -//.word 0xb34c12c2 -//.word 0x9f7033f8 -//.word 0x6a01e6f1 -//.word 0x90a21185 -//.word 0xd50e5466 -//.word 0x74ac4955 -//.word 0x79640a95 -//.word 0x6cb2f4a0 -//.word 0x2ff8ab1a -//.word 0x29195e03 -//.word 0xa5434d30 -//.word 0x740c88fc -//.word 0xdac1f93b -//.word 0xa8faa46f -//.word 0xa5722e3f -//.word 0x32169c24 -//.word 0x2e5c5e66 -//.word 0x18d68c47 -//.word 0x73076f7d -//.word 0x6f7543e6 -//.word 0xc5ff3b78 -//.word 0xe371c677 -//.word 0x495611ea -//.word 0x330ecd4f -//.word 0x7820328e -//.word 0xb2d1442c -//.word 0x9ff555c1 -//.word 0xc705cbac -//.word 0x5f722305 -//.word 0x6e3936d3 -//.word 0x2eb8bb7f -//.word 0xb5bf0e89 -//.word 0xd4eb307a -//.word 0x402f0e1a -//.word 0xefb406e2 -//.word 0xc5e3a7b4 -//.word 0x70c0b8ca -//.word 0x91797ced -//.word 0x1c3e35e7 -//.word 0x0154e73a -//.word 0x0c655e12 -//.word 0x091b7279 -//.word 0x2ded8aca -//.word 0xb1385f68 -//.word 0xc09103af -//.word 0x935a212b -//.word 0xdb938608 -//.word 0x5ff3e0ca -//.word 0xe637c63f -//.word 0x57bbf9b1 -//.word 0x1f47ea5f -//.word 0xd32b7c2f -//.word 0x168e0a9d -//.word 0xbe03acf7 -//.word 0x325db6cc -//.word 0x16c582a2 -//.word 0x2b0970e7 -//.word 0x70372a2a -//.word 0x8e6b2d8b -//.word 0x72e58570 -//.word 0x3c5ed77a -//.word 0x589ca5b8 -//.word 0xea45ce1a -//.word 0x70f15428 -//.word 0xa38262f3 -//.word 0x9db88e4c -//.word 0x41005b35 -//.word 0xd88d0295 -//.word 0xf8aa7230 -//.word 0xaa4f95d5 -//.word 0xcbf2d5d9 -//.word 0xb39fdfc5 -//.word 0x154ba64c -//.word 0x2666ab80 -//.word 0x02af7d45 -//.word 0x4b4c7b05 -//.word 0x131ae1a5 -//.word 0xfc4203b8 -//.word 0x9d0dd3f3 -//.word 0x28f9a9e1 -//.word 0x4a0c44d8 -//.word 0x53680c2c -//.word 0x972099a2 -//.word 0x144a7928 -//.word 0x55552ec3 -//.word 0x969d77c8 -//.word 0x283dd14f -//.word 0x17243ce5 -//.word 0x0b6c4281 -//.word 0x6ce736ba -//.word 0xc9faba36 -//.word 0x7bae8366 -//.word 0x85046170 -//.word 0xbf89796d -//.word 0x342bd5d5 -//.word 0xc84b2037 -//.word 0x1e13aa2e -//.word 0xb80ab390 -//.word 0x60e5e5e8 -//.word 0xc7a12227 -//.word 0x6dce8096 -//.word 0xc02e920f -//.word 0x887eea6d -//.word 0x8294db41 -//.word 0x4baa84c7 -//.word 0x80fa0918 -//.word 0x248b24a0 -//.word 0x424addd3 -//.word 0xd35c951c -//.word 0xe1b34916 -//.word 0xeddf15ff -//.word 0x8f27f76a -//.word 0x5cd9d633 -//.word 0x0cdec3b8 -//.word 0xdd917e46 -//.word 0x32d23cd2 -//.word 0x8055a7ea -//.word 0x6a4027eb -//.word 0x2bf66073 -//.word 0x352dfc19 -//.word 0x1747aa5c -//.word 0xa4df66da -//.word 0x52a2fcc3 -//.word 0xe060c78c -//.word 0x3c62bfe8 -//.word 0xa3ffb3f4 -//.word 0x0a6ad2b1 -//.word 0xbdce70b8 -//.word 0x469d0729 -//.word 0x90257ce5 -//.word 0x4c64a4fd -//.word 0x941d076a -//.word 0xce2be4fe -//.word 0xd416759a -//.word 0x52e473a2 -//.word 0x6f31ddae -//.word 0xaf82f682 -//.word 0x17d78d41 -//.word 0x937f80dd -//.word 0x963083d2 -//.word 0x00571e14 -//.word 0x44adf545 -//.word 0xca0b4c2c -//.word 0x927fca63 -//.word 0x1b9f7d4f -//.word 0x831d1f55 -//.word 0xef9c984b -//.word 0x2dc2c32d -//.word 0x988f7512 -//.word 0x3cedbc5e -//.word 0x3b886438 -//.word 0x70dfc03f -//.word 0x519ca778 -//.word 0x1a20bc8b -//.word 0x2863f230 -//.word 0xa2fb50e4 -//.word 0x5f7af2e0 -//.word 0x04fd514b -//.word 0x6d02c4af -//.word 0x4f7a46aa -//.word 0x1b2079e6 -//.word 0x2508eb4a -//.word 0x057b9872 -//.word 0x3d02b15d -//.word 0x1dc19c66 -//.word 0xe4063c76 -//.word 0x28227277 -//.word 0x7878e40c -//.word 0x3fd3fd7f -//.word 0xebfd35fb -//.word 0x4f8d92fb -//.word 0x46006e02 -//.word 0x9a0b7c8d -//.word 0x24300645 -//.word 0x3490787a -//.word 0x330022cd -//.word 0x865e3a2c -//.word 0xb6262004 -//.word 0xce40e6b1 -//.word 0x051c103a -//.word 0x9d01983b -//.word 0x0ba23622 -//.word 0x58f3de9e -//.word 0xc73a8955 -//.word 0xb86938d6 -//.word 0xccab36ce -//.word 0x4a3d9e7e -//.word 0xc27f1e6c -//.word 0xf04bfa59 -//.word 0xe2855474 -//.word 0x5df3aacd -//.word 0x7e4fa00c -//.word 0x9d9b0063 -//.word 0x76b5ffc1 -//.word 0x8b2bc249 -//.word 0xc4502002 -//.word 0x5990aad0 -//.word 0xf100e8a3 -//.word 0x0c39e6ee -//.word 0x9e67ef5b -//.word 0xfc9d99bd -//.word 0xfc6c0245 -//.word 0x58b358fa -//.word 0x54b89f63 -//.word 0xa178ae86 -//.word 0x803c7b17 -//.word 0x2b6d99e9 -//.word 0x70a9ffa8 -//.word 0x9f160bca -//.word 0xa6f7c7c3 -//.word 0x7b7d6a78 -//.word 0xbadf22f7 -//.word 0x90ad1065 -//.word 0xd7619437 -//.word 0x8237cca6 -//.word 0x3c3e575c -//.word 0x4caf5f74 -//.word 0xbc7ed6a1 -//.word 0xba30ffad -//.word 0x3eec3126 -//.word 0xedd4d854 -//.word 0x3e96bc6d -//.word 0xdb3d860c -//.word 0x4a4e80e0 -//.word 0xcc109ca1 -//.word 0x852bb849 -//.word 0xde742080 -//.word 0x28085458 -//.word 0x82980c3a -//.word 0xfc037a21 -//.word 0xfc2acf05 -//.word 0xe100009b -//.word 0xe7e0ca3b -//.word 0x4a24f421 -//.word 0xaff3d4d9 -//.word 0xbf5a14f5 -//.word 0x159eb601 -//.word 0x5ad156b9 -//.word 0xaea4af79 -//.word 0x4a7c61f4 -//.word 0x64c8f229 -//.word 0x53911293 -//.word 0xf45223a0 -//.word 0x4c0bf865 -//.word 0x6f91dd90 -//.word 0xa028d89e -//.word 0xb9532f4e -//.word 0xceeb2a55 -//.word 0x0d6f1a53 -//.word 0xe89b9a06 -//.word 0x773c15bd -//.word 0x17428910 -//.word 0x58178acf -//.word 0x162f8938 -//.word 0xe5e1566d -//.word 0xb375e425 -//.word 0xa87e4da1 -//.word 0x516a15e2 -//.word 0xfe57b319 -//.word 0x68284d5f -//.word 0x97d8c4a6 -//.word 0x030ff0ef -//.word 0xfaf32dbe -//.word 0x414116cb -//.word 0xfe9c90fb -//.word 0xd5250b8e -//.word 0x524b049a -//.word 0x87e5ceb8 -//.word 0xf67e93fd -//.word 0xb1ef962c -//.word 0xbf34ba29 -//.word 0xc27848b1 -//.word 0xd772ed49 -//.word 0xbef40274 -//.word 0x3bc11029 -//.word 0xbba09484 -//.word 0x3baeffbc -//.word 0x66f80155 -//.word 0xfd490797 -//.word 0x7c41033e -//.word 0xfba76b73 -//.word 0x520084fb -//.word 0x8061e0af -//.word 0x4e81252c -//.word 0x2f1211cb -//.word 0x6b52bbd4 -//.word 0x7cdd1cee -//.word 0xb8c5cdda -//.word 0x31e41261 -//.word 0xda71188b -//.word 0xebd27b12 -//.word 0x86b10b16 -//.word 0x9a52d012 -//.word 0x08244c0f -//.word 0x0496ff18 -//.word 0xbe2b31ed -//.word 0x42d1ebfc -//.word 0x9d6f478c -//.word 0x42bde93c -//.word 0xac58ceac -//.word 0x4416457a -//.word 0x84963a70 -//.word 0x5d1cbafb -//.word 0xd69cb4df -//.word 0xf715fd2a -//.word 0xe5219766 -//.word 0x4ec93313 -//.word 0x079df455 -//.word 0xf40576e9 -//.word 0x29d20f5d -//.word 0x4e185581 -//.word 0x4840e019 -//.word 0x165951d4 -//.word 0xf8af9282 -//.word 0xd79f6081 -//.word 0xe1a90778 -//.word 0x74c76d48 -//.word 0x3dfd5240 -//.word 0xa132d691 -//.word 0x5b3e3c01 -//.word 0x6744ede3 -//.word 0x1f42c046 -//.word 0xa5e6786d -//.word 0x80a48f7f -//.word 0x8a053280 -//.word 0x09428c80 -//.word 0x1c114712 -//.word 0x59bf5000 -//.word 0xb47fdb3d -//.word 0xa202a81b -//.word 0x7f4784be -//.word 0x2db512d1 -//.word 0xff67cb77 -//.word 0xd5c74485 -//.word 0x885eafee -//.word 0x88eaa57f -//.word 0xc3b123cc -//.word 0xc916d26a -//.word 0x2e6a8b5e -//.word 0x30041ad6 -//.word 0x9a944217 -//.word 0xe9b402b7 -//.word 0xacc0170c -//.word 0x31e8c2e4 -//.word 0x5d83cb76 -//.word 0xdca6c699 -//.word 0x7bf69534 -//.word 0xd1ba2ef6 -//.word 0x25359f47 -//.word 0x8c324f7e -//.word 0x52e08654 -//.word 0x9be02f98 -//.word 0x4a9ddd25 -//.word 0x22dc0d12 -//.word 0x2b94ab28 -//.word 0x58ffd799 -//.word 0x66f1e8ee -//.word 0x0769b142 -//.word 0x406504ae -//.word 0x10fb7504 -//.word 0x52a660c0 -//.word 0xe4de2e3b -//.word 0x09ebd322 -//.word 0x0cfa9b27 -//.word 0x277127f6 -//.word 0xa280b26b -//.word 0x3ff89a02 -//.word 0xd6611b8f -//.word 0x3d475d2f -//.word 0x6ad4b17e -//.word 0xdca4170a -//.word 0x37d40508 -//.word 0x2e5c6346 -//.word 0xa59fda61 -//.word 0x17414e38 -//.word 0x3639a9a0 -//.word 0xd227db5a -//.word 0xfce71f42 -//.word 0x6b667fc8 -//.word 0x1fb49aa4 -//.word 0x435ba5c6 -//.word 0x58f0b08c -//.word 0x90e72a38 -//.word 0x78aba8a1 -//.word 0xdaefe229 -//.word 0xe23efeee -//.word 0x7fda1245 -//.word 0x0cc3e464 -//.word 0x3016f45e -//.word 0x0398bc55 -//.word 0x729336ea -//.word 0xe4e19ff9 -//.word 0x1e467b84 -//.word 0x6303d9ec -//.word 0xe0a7d867 -//.word 0x48296aae -//.word 0xbc3458f6 -//.word 0xedc28622 -//.word 0x84ec7937 -//.word 0xc2001610 -//.word 0x63d5ac53 -//.word 0xc95b35a3 -//.word 0x5676d917 -//.word 0x1a0db4eb -//.word 0xae5ed976 -//.word 0x5f94975c -//.word 0x8f9bfb05 -//.word 0x5933954e -//.word 0x74437f7e -//.word 0x5a709c7b -//.word 0xa9ef1e3e -//.word 0xc9974b84 -//.word 0xcf3b80c6 -//.word 0xa136766c -//.word 0x5b47c43e -//.word 0xf2a0a51b -//.word 0x1839fced -//.word 0x5f6a95dc -//.word 0xa0b9aec2 -//.word 0x9ef1b6df -//.word 0xe77454cf -//.word 0xfbd1abb8 -//.word 0xb099ddc8 -//.word 0xd56fcddf -//.word 0x165f2a88 -//.word 0x1f71a92e -//.word 0x057d918d -//.word 0xe1407d66 -//.word 0xbeb05d77 -//.word 0xb58dbfaa -//.word 0x56394d8d -//.word 0x4ac99602 -//.word 0x375c1138 -//.word 0xe4ab5ed9 -//.word 0x9ee2d085 -//.word 0xdaaf2980 -//.word 0x1b98a4a7 -//.word 0x169139a9 -//.word 0x14ce1c73 -//.word 0x99d687ec -//.word 0x43d9b9e3 -//.word 0xf4433f45 -//.word 0x34917294 -//.word 0xd0634194 -//.word 0xc7d33048 -//.word 0x6706a11c -//.word 0xb4005264 -//.word 0x09bd2805 -//.word 0x027d2b72 -//.word 0x985fd1db -//.word 0x8e317fa1 -//.word 0x0d874d0c -//.word 0x8b0a0a40 -//.word 0xf113806d -//.word 0xfc79f847 -//.word 0xe3a701b6 -//.word 0x3bf16ece -//.word 0x18289e01 -//.word 0x766b0093 -//.word 0xd741d54f -//.word 0x2de53879 -//.word 0xf9e15c03 -//.word 0xb5de1603 -//.word 0x70bb9b65 -//.word 0xb8dc8add -//.word 0xbcc52d20 -//.word 0xb2e7fc54 -//.word 0x77b962c5 -//.word 0x750bc4d9 -//.word 0xca98c046 -//.word 0xa7dab282 -//.word 0xf5227d7c -//.word 0x3fe78889 -//.word 0xcc5e06a1 -//.word 0x0b4c7bcb -//.word 0x35197bd6 -//.word 0x2d25b54a -//.word 0xab5f319e -//.word 0x9913d6ab -//.word 0xbd032f61 -//.word 0x99ba6fb9 -//.word 0x8f1db2ea -//.word 0x494385e0 -//.word 0x5886a9ea -//.word 0x1bda14b3 -//.word 0xe35e3973 -//.word 0x54318966 -//.word 0x0f873a7e -//.word 0x8efc4755 -//.word 0x4e28b865 -//.word 0x3473237b -//.word 0x2a2a7369 -//.word 0x09d3e8fb -//.word 0xbbbe5f2d -//.word 0xa1ddd49b -//.word 0x32d52539 -//.word 0xe5551844 -//.word 0x51a7a079 -//.word 0x93855c84 -//.word 0xf12d61bb -//.word 0xbdb8390c -//.word 0x7ba72b34 -//.word 0x46bfbd32 -//.word 0x6f1778fc -//.word 0x686feb70 -//.word 0xe0c3f38d -//.word 0x302039e3 -//.word 0xf6b7fb48 -//.word 0xff3010cd -//.word 0x6b4026f1 -//.word 0x0b7e4f14 -//.word 0x0e72bc2e -//.word 0xddefc7c0 -//.word 0x43a3370b -//.word 0xd1edc081 -//.word 0x81eeca79 -//.word 0x99e37426 -//.word 0xd2b2d7ca -//.word 0xbac28f27 -//.word 0x57107836 -//.word 0x0d80b51c -//.word 0xc171f75a -//.word 0x3f93fb44 -//.word 0xd9fd55b4 -//.word 0x517a6dff -//.word 0xfa24c728 -//.word 0x19358754 -//.word 0x9119347e -//.word 0xc0c8bc6c -//.word 0xa452b8e2 -//.word 0x42bbf215 -//.word 0x480a2462 -//.word 0xf19d0340 -//.word 0x29bf7c74 -//.word 0xf27d3e84 -//.word 0x06b5786d -//.word 0xbd6fe498 -//.word 0x3270040b -//.word 0xa10dacdd -//.word 0x143ec0ec -//.word 0x3ff33fd2 -//.word 0xa8ab8014 -//.word 0x0b42bc9d -//.word 0xfc0acd6b -//.word 0xce1e3589 -//.word 0xb4f3623d -//.word 0x26303182 -//.word 0x86c0b0b8 -//.word 0x0425289b -//.word 0xbf0f5b72 -//.word 0x2c2d0a88 -//.word 0xbc43bae0 -//.word 0xb97db825 -//.word 0x71035be0 -//.word 0x97cd89ee -//.word 0xe6b97c30 -//.word 0x07dac684 -//.word 0xb51393f4 -//.word 0x1fe52f2e -//.word 0x8e86c834 -//.word 0x47337455 -//.word 0xb3c6765c -//.word 0xbd8bbd07 -//.word 0x7c50adbb -//.word 0x12bb2275 -//.word 0xd4e1b204 -//.word 0xab133376 -//.word 0xb9fb7dd0 -//.word 0x40e97102 -//.word 0xc0673b19 -//.word 0x6013d3b7 -//.word 0x8faecac0 -//.word 0xeb704357 -//.word 0x629e4009 -//.word 0x975f1f47 -//.word 0x87cc641a -//.word 0x6c46b812 -//.word 0xe20c3280 -//.word 0x480cd6e4 -//.word 0x69fa5ba9 -//.word 0x5ba03210 -//.word 0xa875c36b -//.word 0xac70fa8b -//.word 0x3e1e027b -//.word 0x93f3506f -//.word 0x5edee4f7 -//.word 0x3c1fcb78 -//.word 0x505de9dd -//.word 0x2af3f58a -//.word 0xee8cc591 -//.word 0xb2efcc29 -//.word 0x271ce15c -//.word 0x7c9741ff -//.word 0x7f04d8e7 -//.word 0x06f4bc5a -//.word 0x8dfffbc4 -//.word 0x201396ab -//.word 0x7c0bcde5 -//.word 0x71839d09 -//.word 0x8aeb8823 -//.word 0xf0db94ac -//.word 0x8ca696b9 -//.word 0x6c32b072 -//.word 0x680719c6 -//.word 0x05a51c5d -//.word 0x991b64ce -//.word 0xb0d57613 -//.word 0xafb67f3a -//.word 0xb767505c -//.word 0xcceea7d3 -//.word 0x3782b0a8 -//.word 0x289dcb4b -//.word 0xa0549087 -//.word 0x8ee410b4 -//.word 0x398d5e2f -//.word 0xdda34f07 -//.word 0x99e27df9 -//.word 0x8802929f -//.word 0x2f8bc3e4 -//.word 0x17eb9abb -//.word 0xbac5f911 -//.word 0xa48d5cff -//.word 0xd2525e45 -//.word 0x5eda7ff4 -//.word 0x5ef4246a -//.word 0x090adf83 -//.word 0x1bf6f10e -//.word 0x7b160d7e -//.word 0x1ba35fe2 -//.word 0x203ecd18 -//.word 0x44cc7d3d -//.word 0x78849767 -//.word 0xcd464c97 -//.word 0x942f17e9 -//.word 0xc46a420e -//.word 0x9d49adfc -//.word 0x8b94cbe4 -//.word 0x4d21ed65 -//.word 0x56a4c3ff -//.word 0x74c91fca -//.word 0xaf80fd68 -//.word 0x7498c138 -//.word 0xf390bfcc -//.word 0xc5aa009e -//.word 0xd24043fe -//.word 0x725b434f -//.word 0xd2823873 -//.word 0x9ad0a084 -//.word 0xcc4a3fc5 -//.word 0xef6f65d8 -//.word 0x6e106f31 -//.word 0x3b6190ca -//.word 0xb751d218 -//.word 0xd617573f -//.word 0x7e0de582 -//.word 0x31c2a2fd -//.word 0xec4a1b96 -//.word 0x4fd98b31 -//.word 0xfd915b23 -//.word 0x4697e5e9 -//.word 0x046c7d1b -//.word 0xc27bb29b -//.word 0x24eed112 -//.word 0x83c6ab9d -//.word 0xd72b98c3 -//.word 0xda00bcab -//.word 0x6abb898b -//.word 0x2f748564 -//.word 0x7f3b4eed -//.word 0x7eafdbcc -//.word 0x8acd040c -//.word 0xd60545cc -//.word 0x5493bf34 -//.word 0xd90c7fae -//.word 0x7c370352 -//.word 0x3f1ffaa1 -//.word 0xf1664c77 -//.word 0x52dc5a3b -//.word 0x79508759 -//.word 0x73a7f7f2 -//.word 0x2d2b97d2 -//.word 0x93255da2 -//.word 0xfaadd15e -//.word 0xbbc1cc0a -//.word 0x21957fa1 -//.word 0x862ab84f -//.word 0xb82261df -//.word 0xa2d34977 -//.word 0x289a2883 -//.word 0x5271ddef -//.word 0xadc4f999 -//.word 0xee818106 -//.word 0xd96ff054 -//.word 0x61c07c6f -//.word 0x11e99a88 -//.word 0xaab1c4c3 -//.word 0x0e887a30 -//.word 0x5c1b87fd -//.word 0x5d2585ea -//.word 0x1f88a3fc -//.word 0xdf9ca676 -//.word 0x2cc72e05 -//.word 0x4a4e3b3b -//.word 0xd56aef3e -//.word 0xa69f96c2 -//.word 0xfb49e334 -//.word 0xd1787c38 -//.word 0x95fdba56 -//.word 0xfcc5a9f0 -//.word 0x30665778 -//.word 0x2cf84be0 -//.word 0x69265351 -//.word 0xba84831f -//.word 0x74247afd -//.word 0xd364e76d -//.word 0x99094c7b -//.word 0xf89202ab -//.word 0xb2c67e30 -//.word 0x7f90d25e -//.word 0xaf0c7662 -//.word 0x10e24931 -//.word 0x12d3d3be -//.word 0x2991cd70 -//.word 0x73d4e3d3 -//.word 0x9baab88e -//.word 0xfd0e2b95 -//.word 0x0bbdd99f -//.word 0xef45e2db -//.word 0x725ff1de -//.word 0x1c7e76e0 -//.word 0x9ca83629 -//.word 0x6b8506c6 -//.word 0xadb6d380 -//.word 0x5867e60f -//.word 0x9728668a -//.word 0x71f81f22 -//.word 0xa6a38110 -//.word 0xd94feccc -//.word 0xf4512b80 -//.word 0xc9453ebc -//.word 0xf55d5c6b -//.word 0x0af93806 -//.word 0xed788407 -//.word 0x7c4eb3a1 -//.word 0x745704ae -//.word 0x926cbce9 -//.word 0xf933b25d -//.word 0xd43b111d -//.word 0x3c485a36 -//.word 0x5ceba8e2 -//.word 0xd35638fe -//.word 0x596f28be -//.word 0xa6237fa0 -//.word 0x90fd6e9e -//.word 0x73f7d6a8 -//.word 0xd5900951 -//.word 0x4a1ed5c9 -//.word 0x9666bf0b -//.word 0x126a8c57 -//.word 0x518206e3 -//.word 0x02aefcce -//.word 0x182b8b55 -//.word 0x29449c49 -//.word 0x146baec0 -//.word 0xe788d60c -//.word 0x009103e9 -//.word 0x725b87fa -//.word 0xaab0d377 -//.word 0x52a18220 -//.word 0x751d9a75 -//.word 0xe4c30e28 -//.word 0xd9f587d3 -//.word 0xdb2e63e7 -//.word 0xe195fee4 -//.word 0xbad231d0 -//.word 0xac2019e2 -//.word 0x5ca31a7e -//.word 0xedfd2366 -//.word 0x6c1c332e -//.word 0x6c551cf0 -//.word 0xedb78742 -//.word 0x83993865 -//.word 0xb47693bf -//.word 0xa1fb5f8b -//.word 0xe95dcbd0 -//.word 0xcaf0ae8f -//.word 0x89f61341 -//.word 0x14b4f581 -//.word 0xe7cc4705 -//.word 0x2cc638d2 -//.word 0x26f0b4b0 -//.word 0xcf682edc -//.word 0xc0779dfe -//.word 0x5220c45a -//.word 0x03f9b74a -//.word 0x1b3a9bec -//.word 0x8f14ad18 -//.word 0x25448695 -//.word 0xd9e79d8c -//.word 0x7f900d3c -//.word 0xab9898f0 -//.word 0xceb5ec2e -//.word 0xa1ce2632 -//.word 0xc70e959b -//.word 0xae38c063 -//.word 0xb63aaa14 -//.word 0x95045439 -//.word 0xfa9a8413 -//.word 0x7068c58e -//.word 0x85d7af73 -//.word 0x2c1d68df -//.word 0x61596bf4 -//.word 0x0bdf88ce -//.word 0x26d02cb9 -//.word 0x21efe3a1 -//.word 0x85af1bca -//.word 0xd8912bc1 -//.word 0xc1ac9492 -//.word 0x6d8d863b -//.word 0x3042a661 -//.word 0x70b20e42 -//.word 0xbf3095eb -//.word 0x474f51aa -//.word 0x6bf75bc7 -//.word 0xabb8d26f -//.word 0xc85f23f1 -//.word 0x29c7872d -//.word 0x7ef2cd48 -//.word 0xa35859a5 -//.word 0xc77f6d11 -//.word 0xcdcca73e -//.word 0xf299cb73 -//.word 0xb188c381 -//.word 0xe416e4f9 -//.word 0x2b73739c -//.word 0x91916813 -//.word 0x6d7a71e1 -//.word 0x87e83a95 -//.word 0x7c0fec44 -//.word 0x64bef436 -//.word 0xb1a605e0 -//.word 0x5af96012 -//.word 0x3a385372 -//.word 0xb346ff29 -//.word 0x96c05fdc -//.word 0x479186de -//.word 0x1cc028a4 -//.word 0x078d5c79 -//.word 0x75bda072 -//.word 0x75321ea5 -//.word 0x1dbe2e96 -//.word 0x29391bf2 -//.word 0xe6d12a80 -//.word 0x4fa2d854 -//.word 0x75876446 -//.word 0x242f8da2 -//.word 0xc3739d21 -//.word 0x7ce6a618 -//.word 0x9dae0cf0 -//.word 0x3e9343d6 -//.word 0x2556dab3 -//.word 0xe644b95f -//.word 0x4e0aa712 -//.word 0x02cb0f1b -//.word 0x647003d4 -//.word 0xb64081d5 -//.word 0x82b0f568 -//.word 0x397c003d -//.word 0x1af6785f -//.word 0x559eb067 -//.word 0x71f4f9f0 -//.word 0xeb8a684a -//.word 0x205dda73 -//.word 0x6c653642 -//.word 0x946bf2e6 -//.word 0x611bd98f -//.word 0x8e5a0b6b -//.word 0xe5da45d4 -//.word 0xa4eb62c8 -//.word 0x25942299 -//.word 0xbee22be5 -//.word 0xe7804dc9 -//.word 0x9a880a52 -//.word 0x00995634 -//.word 0x492a9bbf -//.word 0xdb1d000e -//.word 0xb097eb82 -//.word 0xf910c46f -//.word 0x08a6fd14 -//.word 0x6cb74fd1 -//.word 0x5eae4694 -//.word 0x5c1dff95 -//.word 0x130d3143 -//.word 0x82926a7d -//.word 0x5da29b06 -//.word 0xaf26d733 -//.word 0xc45258e7 -//.word 0x4632c3c1 -//.word 0xa686ac94 -//.word 0xbdd05d18 -//.word 0xb4abd3df -//.word 0x215e0a8a -//.word 0x72b17b3c -//.word 0x8f00e24f -//.word 0xbb8d4446 -//.word 0xbb1a3103 -//.word 0x3bb8473b -//.word 0x6ddaf726 -//.word 0xf3ad8c7b -//.word 0xffac689b -//.word 0xb96f910c -//.word 0xe1c36d2a -//.word 0xb500ca19 -//.word 0x159721fe -//.word 0xe5eb1c6f -//.word 0xb3625528 -//.word 0x99bb61ff -//.word 0x65a20d1a -//.word 0xf881e75f -//.word 0xec9a012c -//.word 0x7a53f148 -//.word 0x9ad01c1a -//.word 0x6bc73519 -//.word 0xd6900084 -//.word 0x6e7c5c53 -//.word 0x9b68806d -//.word 0xf892851b -//.word 0xf9ab25bd -//.word 0xd12dc2bc -//.word 0x93eea9bf -//.word 0x97f69922 -//.word 0x1f8d7fa4 -//.word 0x3a99845f -//.word 0xe92749fe -//.word 0x8148712a -//.word 0x501e6145 -//.word 0x8336435b -//.word 0x47185155 -//.word 0x2f1d5070 -//.word 0xd6815aee -//.word 0xc5b9e10c -//.word 0x9707f133 -//.word 0x5b4bb572 -//.word 0x391c3d2c -//.word 0x59177e0e -//.word 0x00779b44 -//.word 0xfce763ed -//.word 0x43941acc -//.word 0xd7857c40 -//.word 0xec2fff76 -//.word 0x4d4459dd -//.word 0xfccd42da -//.word 0x18787bbe -//.word 0x04330ff5 -//.word 0xc6f9d97f -//.word 0xadec46a5 -//.word 0x37a55ce4 -//.word 0x31c8fb2e -//.word 0x20db6352 -//.word 0xe058f7b8 -//.word 0x8b004151 -//.word 0x9d7335ce -//.word 0x55feba10 -//.word 0x5eb466e0 -//.word 0xaec089e1 -//.word 0xaff96ec2 -//.word 0x9cb7ddb8 -//.word 0x2ee5e42c -//.word 0x7958d8b1 -//.word 0x105f9638 -//.word 0x709c0e87 -//.word 0x9c1203e7 -//.word 0x047e0c1d -//.word 0xabebdf9c -//.word 0x8981cef9 -//.word 0x2f9e929f -//.word 0xa92848c4 -//.word 0xa821b99c -//.word 0xe17bdecc -//.word 0xb02ea421 -//.word 0x0189ec82 -//.word 0x70c5d623 -//.word 0xafe03ffc -//.word 0x28a9887a -//.word 0xe4179974 -//.word 0xacde2660 -//.word 0x6e4431c7 -//.word 0xe231d1f6 -//.word 0x6c8631f7 -//.word 0x45b0dbbf -//.word 0xd67d37a9 -//.word 0x642e4e23 -//.word 0xf2cdd4a7 -//.word 0x63c166ee -//.word 0xe09f1060 -//.word 0x794312ce -//.word 0x0f20e463 -//.word 0x71d477d8 -//.word 0xc5ffbee8 -//.word 0x2a566d04 -//.word 0x9bf30147 -//.word 0x16ef00ac -//.word 0xfe33827f -//.word 0xbf8bf011 -//.word 0xb0fd0cb0 -//.word 0x3d5831d6 -//.word 0x450fdca1 -//.word 0xc1486c83 -//.word 0xa731263b -//.word 0x0e937c04 -//.word 0x92a98f0c -//.word 0xfa32f227 -//.word 0x18c5b1c5 -//.word 0xf1659222 -//.word 0x1e559abc -//.word 0x722dd30a -//.word 0xdd2e4d6b -//.word 0x90d3635d -//.word 0x62a83fef -//.word 0x735fa179 -//.word 0x0f21db8a -//.word 0xd5222122 -//.word 0x1878ff21 -//.word 0x852d2b00 -//.word 0x06937dbf -//.word 0xe7d73c1e -//.word 0x38d99b10 -//.word 0x723b836d -//.word 0x5db993e7 -//.word 0x30b8663f -//.word 0xfa2114b9 -//.word 0x426ffbcd -//.word 0xea07bf1f -//.word 0x5ac88fb1 -//.word 0xdae4aa57 -//.word 0x3eee226c -//.word 0xc934e0c4 -//.word 0x4c4ee9e1 -//.word 0x8ef7e06a -//.word 0xf01ccbd8 -//.word 0x51331a73 -//.word 0x30cee57d -//.word 0x107075ad -//.word 0x219f06df -//.word 0x1c3acb09 -//.word 0x6f0d3371 -//.word 0x9aa36b1d -//.word 0xd95b248b -//.word 0x03be96a3 -//.word 0xb210c4ea -//.word 0xa4800000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00018CE8 -//// expected output -//.word 0x061e0be7 -//.word 0xfa3c164f -//.word 0x342ce812 -//.word 0x95dbafdc -//.word 0xc5fbc474 -//.word 0x86f2c824 -//.word 0x0d8f9e30 -//.word 0x399973c9 -//.word 0x59b57f7c -//.word 0xc6ea4b93 -//.word 0xa5f2d035 -//.word 0x4717eea8 -//.word 0x64119153 -//.word 0x9c47f736 -//.word 0xdcaf4648 -//.word 0x7f7390c0 -//// SHA512LongMsgvector_128 -//// vector length -//.word 0x00019000 -//// input message -//.word 0xa1ed9fbb -//.word 0x03c366c3 -//.word 0x0f7513bc -//.word 0x64f45ad9 -//.word 0x79ad8880 -//.word 0x31c6bba8 -//.word 0xafa55386 -//.word 0x6bb3a468 -//.word 0x855fede1 -//.word 0x5a658e26 -//.word 0x565075b8 -//.word 0x093dda43 -//.word 0x7ce32cc6 -//.word 0xc5d04bf5 -//.word 0xd9f5f7dc -//.word 0xa26589c4 -//.word 0x515ae05a -//.word 0xf6799f0e -//.word 0x4d5796ba -//.word 0xdb3b7d84 -//.word 0x3a26e805 -//.word 0xb21077ab -//.word 0x09754d5b -//.word 0x9b10c45b -//.word 0xade75f70 -//.word 0xfe870143 -//.word 0x9f915c09 -//.word 0x0575ab63 -//.word 0x5d7ea483 -//.word 0x1f0fa891 -//.word 0xe62c3e4d -//.word 0x7f3bbff5 -//.word 0x3f0c5369 -//.word 0x9a181b8d -//.word 0xf206b0ef -//.word 0xad74cdaa -//.word 0x8af3488a -//.word 0x35534770 -//.word 0x1922b0f8 -//.word 0x756fe15a -//.word 0xb2d3a28e -//.word 0xf4b357b4 -//.word 0xefbf7bb2 -//.word 0xfcbe491f -//.word 0x6b8ebc60 -//.word 0x1b66ba10 -//.word 0x495f8ca6 -//.word 0xa6339251 -//.word 0xac443527 -//.word 0x31e01c7f -//.word 0x3dc3a39b -//.word 0x19dd898b -//.word 0xa856e84d -//.word 0xfad06b39 -//.word 0x1fecbb9d -//.word 0x390f3aa4 -//.word 0xd566f47c -//.word 0x7c27d3b7 -//.word 0x841a12f2 -//.word 0x2c59f3b5 -//.word 0xe954b59b -//.word 0xfa17c0b3 -//.word 0x42d02425 -//.word 0x578b4119 -//.word 0xd741c7d4 -//.word 0xfb11e224 -//.word 0x6ecdaeff -//.word 0x5fb8f167 -//.word 0xd58e0990 -//.word 0x42c52345 -//.word 0x5c13ae88 -//.word 0x28301079 -//.word 0x57dd9779 -//.word 0xd625b28e -//.word 0xa1e36109 -//.word 0xd884ea67 -//.word 0x140ece76 -//.word 0xfb61fbb9 -//.word 0x12be430c -//.word 0xd3850d8b -//.word 0x00434ab1 -//.word 0x36ebabbd -//.word 0xc564115a -//.word 0xbf44467e -//.word 0x4fdcea93 -//.word 0x4c74b0d5 -//.word 0x0ed7cafb -//.word 0x8113a119 -//.word 0x777acac5 -//.word 0x43ec3579 -//.word 0x8359a838 -//.word 0x3d816c74 -//.word 0x2efe4730 -//.word 0x5e85aa62 -//.word 0xf8692a9b -//.word 0x596034e9 -//.word 0x678afdfd -//.word 0x24afb989 -//.word 0x83c90dec -//.word 0x7ac2c611 -//.word 0x587ecb94 -//.word 0x591c5027 -//.word 0x77794d35 -//.word 0x84f62fc5 -//.word 0x767ccda0 -//.word 0x02bd9db6 -//.word 0x6cbc28be -//.word 0x9d8fbb1d -//.word 0x76636009 -//.word 0x64c20cee -//.word 0x34111a10 -//.word 0x295df873 -//.word 0x4c5721f8 -//.word 0x049c4bc8 -//.word 0xe63ae1f5 -//.word 0xce70b35f -//.word 0x2fb6edd5 -//.word 0xa7fd457d -//.word 0xd7387976 -//.word 0x711bf9bb -//.word 0x9223e04b -//.word 0x53d62987 -//.word 0x9b4c20db -//.word 0x37ee16a0 -//.word 0x2c7e5941 -//.word 0x4b58649d -//.word 0x07f752ad -//.word 0x84ba9967 -//.word 0xf0e8f4e2 -//.word 0x16f3a1ba -//.word 0x30f9cdb6 -//.word 0xfd904da8 -//.word 0x14c38e95 -//.word 0x7858cf16 -//.word 0x6c558dfe -//.word 0x89c23f3d -//.word 0x0daf4405 -//.word 0x76791a2b -//.word 0x504ad0cf -//.word 0x4bdfbe3f -//.word 0x908e7319 -//.word 0x5587efb0 -//.word 0xaf5a13b1 -//.word 0xa8b95507 -//.word 0x927fb8fb -//.word 0x9bf2fca0 -//.word 0xa145116e -//.word 0x4762d22d -//.word 0x48e6f015 -//.word 0x0b6c2c33 -//.word 0x780eca0e -//.word 0x0b29428b -//.word 0x2661380e -//.word 0xace5aee2 -//.word 0xcbf479db -//.word 0x19a1f139 -//.word 0xe3d3edd0 -//.word 0xc18fef66 -//.word 0x6e7a9b5d -//.word 0xd7996e92 -//.word 0x725cac84 -//.word 0xd1db9ab9 -//.word 0x775fee5d -//.word 0xea24842d -//.word 0x0a5d5293 -//.word 0xa0799e12 -//.word 0x3aa56ee5 -//.word 0x379241e3 -//.word 0x1e78fca6 -//.word 0x345b27ec -//.word 0x4d8d593d -//.word 0xe274f1cf -//.word 0x648d07a6 -//.word 0xd0b1a3ff -//.word 0x84972cef -//.word 0x519b2348 -//.word 0xd1bd11bc -//.word 0xfaedbd45 -//.word 0xf486a3c4 -//.word 0x2818a2e8 -//.word 0x9a6af551 -//.word 0x78bf64f5 -//.word 0xf359bbc3 -//.word 0x4d3c7c87 -//.word 0x3334d10e -//.word 0x4e19c48a -//.word 0x1552b237 -//.word 0xe598fd3f -//.word 0x53fc02dc -//.word 0xc12c4bbc -//.word 0x2ff205a9 -//.word 0x54fdb469 -//.word 0xede425e3 -//.word 0x5668a484 -//.word 0x57fa70e1 -//.word 0x407d6c9e -//.word 0x384c178e -//.word 0xd27fbe1b -//.word 0xe16af1e9 -//.word 0x8e6733b6 -//.word 0xa7d6f585 -//.word 0x3a61c6fb -//.word 0x6385c409 -//.word 0x624d56cb -//.word 0xf0611db0 -//.word 0xd44027dc -//.word 0xb1ca66ca -//.word 0x22016136 -//.word 0x08102a3a -//.word 0x238d90b7 -//.word 0xe0fb95f6 -//.word 0x7293238f -//.word 0x2444fa8a -//.word 0xeef8edc5 -//.word 0x46194e95 -//.word 0x3853a7b0 -//.word 0xb99caa4b -//.word 0x39726b7f -//.word 0x7764cdf1 -//.word 0x99d43ab2 -//.word 0x7cfb9864 -//.word 0x492e789f -//.word 0x495f9093 -//.word 0xfae66bee -//.word 0x62825f00 -//.word 0xa39ac01c -//.word 0xd0c95342 -//.word 0xff9a05fc -//.word 0x9f90dd86 -//.word 0x0c6a3031 -//.word 0x61a41409 -//.word 0x8e4116b6 -//.word 0xaac830a0 -//.word 0x8a8df557 -//.word 0x92310f31 -//.word 0xcb6ceb35 -//.word 0x360ab337 -//.word 0x60347d45 -//.word 0x37f1c242 -//.word 0x1ced11d1 -//.word 0x39780475 -//.word 0x15d174f6 -//.word 0x65a5e906 -//.word 0x26d35424 -//.word 0xe87201c1 -//.word 0x6d15c7a1 -//.word 0x724d8285 -//.word 0xcd70c307 -//.word 0xb899c5c5 -//.word 0x6df0a3c1 -//.word 0xf32cc908 -//.word 0x3756a892 -//.word 0x5ecfaf6a -//.word 0x5a94760e -//.word 0xbbc13c19 -//.word 0xc854931f -//.word 0xcf345ad9 -//.word 0xb972ec82 -//.word 0xe1ce9780 -//.word 0x277d5047 -//.word 0x4029a47b -//.word 0x503af254 -//.word 0xba54d847 -//.word 0x3620ebe3 -//.word 0x2550abf9 -//.word 0x22ddb6ff -//.word 0xda933bb6 -//.word 0x1dd0b20b -//.word 0x3589ca3b -//.word 0x768da33b -//.word 0x160e3e57 -//.word 0x3f5d3219 -//.word 0x63f5a06c -//.word 0xd0bb6801 -//.word 0x84849df2 -//.word 0x42d837a6 -//.word 0xe5f608f4 -//.word 0xf517f28b -//.word 0x78f75691 -//.word 0x0a92cf8a -//.word 0x302b217c -//.word 0xea936c50 -//.word 0x87a8a67c -//.word 0xbd1c47df -//.word 0xf97846ec -//.word 0xf460450b -//.word 0x8718093c -//.word 0xc0472cfe -//.word 0x35fb166f -//.word 0x98ee29b4 -//.word 0x8c083c9b -//.word 0xb7244b7f -//.word 0x19176c6d -//.word 0x9cee0584 -//.word 0xec783da2 -//.word 0x8805b03d -//.word 0x1a6c678e -//.word 0x045307f5 -//.word 0x3baa4899 -//.word 0x5879a94f -//.word 0xecdc63bd -//.word 0x144b9bbf -//.word 0x4e1fdb09 -//.word 0x8b52c30e -//.word 0x8687fc21 -//.word 0x534a6eda -//.word 0x3b98b3bc -//.word 0xc7a2cb14 -//.word 0x1bce1124 -//.word 0x85ff6d81 -//.word 0x5616ccba -//.word 0xf1b9cd3a -//.word 0x2153bd70 -//.word 0xb05bc62d -//.word 0x35da634d -//.word 0x2d271799 -//.word 0x4df55fec -//.word 0x1790e595 -//.word 0xac64f6fd -//.word 0xe1bf368a -//.word 0x94d893c2 -//.word 0x410f77b4 -//.word 0xd0764293 -//.word 0xb191f7a5 -//.word 0x2b5a355b -//.word 0xf1886ac2 -//.word 0xf711431a -//.word 0x83ee67c3 -//.word 0x871e6461 -//.word 0x2eede938 -//.word 0xb57637d8 -//.word 0x7c67d2ff -//.word 0x5d047cbb -//.word 0x3c6f63cf -//.word 0xdf269a58 -//.word 0x00cdc6b0 -//.word 0xa12e1a93 -//.word 0xa07e8580 -//.word 0x8be12962 -//.word 0xb5311070 -//.word 0x8afb1a52 -//.word 0x1fcb3a85 -//.word 0x0eaae200 -//.word 0x80e4bc18 -//.word 0x8b0f9ba1 -//.word 0xbf48b156 -//.word 0xfbc0027b -//.word 0x857818c0 -//.word 0x5a48f969 -//.word 0xc32656ac -//.word 0x29a5055a -//.word 0x2abcb2c2 -//.word 0xedc9d1d3 -//.word 0xb2d5d680 -//.word 0xad1aa969 -//.word 0x14c254b7 -//.word 0x77f2ff47 -//.word 0x50071f0c -//.word 0xdb20eaae -//.word 0x27dc0e77 -//.word 0x6d65a270 -//.word 0xa2ad5dc7 -//.word 0x48f70674 -//.word 0x899a2b1c -//.word 0x86011636 -//.word 0xedf7fd6c -//.word 0xc9217944 -//.word 0x9fcc39ff -//.word 0xb6eaf8c2 -//.word 0xb656acf3 -//.word 0x756001e6 -//.word 0x0d8505b9 -//.word 0x327e257c -//.word 0xc27d5895 -//.word 0x9eb39a63 -//.word 0xb9159c22 -//.word 0x6e60ba0f -//.word 0x175a2dcc -//.word 0xdb5b8205 -//.word 0xc70d4a54 -//.word 0x20701462 -//.word 0xf8219850 -//.word 0x00db3555 -//.word 0x9d3e9ea8 -//.word 0x3ecfd0a0 -//.word 0xec414719 -//.word 0x23f3711b -//.word 0xe0b963b6 -//.word 0xfbdfcb30 -//.word 0xb76b2563 -//.word 0x98a33260 -//.word 0x74cfa658 -//.word 0xcd4021bd -//.word 0x5e9161a4 -//.word 0xf42db66e -//.word 0x7f11b6a7 -//.word 0x69d4312e -//.word 0x26e46896 -//.word 0x0d1279cd -//.word 0x66511efb -//.word 0xc4ba97ad -//.word 0x95d4e533 -//.word 0xf7133946 -//.word 0xcd9eacef -//.word 0x125530a4 -//.word 0x6e13c7b3 -//.word 0x0730f3e4 -//.word 0x9a4b6d59 -//.word 0xca4619ba -//.word 0xb8913a8f -//.word 0xd3ace3ed -//.word 0xf2e7ae55 -//.word 0xa06dafd9 -//.word 0xb680ab80 -//.word 0x300686ec -//.word 0x3945fb3a -//.word 0x88eb902a -//.word 0xef51c880 -//.word 0x31009aaa -//.word 0x157522a2 -//.word 0xb8219716 -//.word 0x27b47dc7 -//.word 0x2d9b1b2f -//.word 0x6ac73066 -//.word 0xa5b1e246 -//.word 0x649bf7ce -//.word 0xb91847c4 -//.word 0x5ece719e -//.word 0x047bcea3 -//.word 0xe936a34e -//.word 0xa9f89bf3 -//.word 0x565a74a4 -//.word 0xcaa0f856 -//.word 0x3cf72f40 -//.word 0x12fbd384 -//.word 0xf67c0411 -//.word 0x2c823dc8 -//.word 0x238e87de -//.word 0x4a23ec81 -//.word 0x24852fbe -//.word 0x9fc1baa2 -//.word 0xa2edd89f -//.word 0xe5b12432 -//.word 0x050742c3 -//.word 0xd83ecccd -//.word 0xfe458f3e -//.word 0xb826f821 -//.word 0xfdd1c97a -//.word 0xcb1b1071 -//.word 0xbc065ab3 -//.word 0xd9432416 -//.word 0xb2f5927c -//.word 0xafb864f9 -//.word 0xa1e22538 -//.word 0x9c09a51a -//.word 0x09c5aaa1 -//.word 0xf7b6e30d -//.word 0xb2c91d44 -//.word 0x97b8b977 -//.word 0x26d05e03 -//.word 0x59f7eb95 -//.word 0x34edb092 -//.word 0x9ed2ddb6 -//.word 0x6fe93afb -//.word 0xca9b19bc -//.word 0xadbf8a1a -//.word 0xc618cd9f -//.word 0x891f0d21 -//.word 0x7f034be9 -//.word 0xe1ef9815 -//.word 0x658b873b -//.word 0x58c5e24f -//.word 0xedd19cc7 -//.word 0xd56e07fc -//.word 0x0f6c47d4 -//.word 0x026b079e -//.word 0xc9e56a3d -//.word 0xce6f4489 -//.word 0x9a3b8bf2 -//.word 0xebe20867 -//.word 0x07605276 -//.word 0x5160fdb4 -//.word 0x1abb0f5f -//.word 0xb93bb342 -//.word 0xdea432d9 -//.word 0x23f51eb6 -//.word 0xe4ebd123 -//.word 0x51c71609 -//.word 0xc1512510 -//.word 0x4a1dd508 -//.word 0x8e0d0d88 -//.word 0xd7177bd4 -//.word 0x67488904 -//.word 0x09098d63 -//.word 0xeca24016 -//.word 0xb1fc72fe -//.word 0xc3abfcdf -//.word 0xe72bf5c1 -//.word 0x146a2996 -//.word 0x8487c61e -//.word 0x0bda5908 -//.word 0xa834f95a -//.word 0x5a68c212 -//.word 0x340a860d -//.word 0xb476be29 -//.word 0x5114c7a7 -//.word 0x53db4bd3 -//.word 0xe714fde6 -//.word 0x7361892b -//.word 0x27fdca61 -//.word 0xd5453e61 -//.word 0x0278b800 -//.word 0x3dbb5537 -//.word 0xaf60b181 -//.word 0xf4675b85 -//.word 0x294586f5 -//.word 0x46e501b6 -//.word 0xaeed6941 -//.word 0x05429d49 -//.word 0x42ce729e -//.word 0x0581a851 -//.word 0x2a951d19 -//.word 0x9e1741f5 -//.word 0x71a3ca13 -//.word 0x2d6fa9f1 -//.word 0x678a3cc2 -//.word 0x9366c513 -//.word 0x1d951bae -//.word 0xb5d09fbe -//.word 0xea3d7235 -//.word 0xfaf2e56b -//.word 0xe8b53107 -//.word 0xd0056923 -//.word 0x785facab -//.word 0x27ba9f06 -//.word 0xba541af9 -//.word 0xf4b022c8 -//.word 0x16df189e -//.word 0xaf002f2e -//.word 0xb603249b -//.word 0xd6b22995 -//.word 0x09f122c6 -//.word 0x6844136c -//.word 0x4293d947 -//.word 0x6b2a19b5 -//.word 0xd604771c -//.word 0x66490888 -//.word 0x02150995 -//.word 0xe87bd190 -//.word 0x43ca04d9 -//.word 0xff0e0a8b -//.word 0xdcdabf5f -//.word 0xc1456cce -//.word 0x5433f776 -//.word 0xc7d656bf -//.word 0xf47449be -//.word 0xad6a495a -//.word 0x4d71bbad -//.word 0x93206aad -//.word 0xb1b2340b -//.word 0x9f0a045b -//.word 0xb5f40076 -//.word 0x79ae031c -//.word 0xb6a74dde -//.word 0xce86793b -//.word 0x506eb00a -//.word 0xcd801d18 -//.word 0xe8a2a011 -//.word 0xad7fc7a4 -//.word 0x24cffae2 -//.word 0x25d9f5e7 -//.word 0x6d367cbd -//.word 0xf2d7497d -//.word 0x744a4ab7 -//.word 0x55380914 -//.word 0xaa336c3a -//.word 0x92ae9ef0 -//.word 0xc74d4d83 -//.word 0x72601668 -//.word 0x44aa3d22 -//.word 0xc266a267 -//.word 0xe08cf07e -//.word 0xd25018eb -//.word 0x1febfe4e -//.word 0xf79f7189 -//.word 0xc6f56121 -//.word 0x094a4ce7 -//.word 0x6189fad7 -//.word 0xe53a6a40 -//.word 0xbdbc0c25 -//.word 0xedce31e3 -//.word 0x6e55bf15 -//.word 0x835929b5 -//.word 0x4a509e84 -//.word 0x919f81ab -//.word 0xec5e1aa2 -//.word 0x045b8b51 -//.word 0x32620575 -//.word 0x4dbc3b46 -//.word 0xc0f61757 -//.word 0xdfe4acbd -//.word 0x7be46d73 -//.word 0xb3679cfd -//.word 0x0eae054c -//.word 0xc7d2ebe2 -//.word 0x68074336 -//.word 0x9a21205a -//.word 0x3c586fdb -//.word 0xb248e4e9 -//.word 0x803c34b7 -//.word 0x17ab8525 -//.word 0xee03229d -//.word 0xd5a6743a -//.word 0x87322e30 -//.word 0x7e06c768 -//.word 0x0b022d6a -//.word 0xa58db880 -//.word 0x82dd5c18 -//.word 0x6473246b -//.word 0xb6e4db5c -//.word 0xd7df0ca3 -//.word 0xb66c2e2a -//.word 0x9f7218b7 -//.word 0x547cbbcc -//.word 0x60bc0fcc -//.word 0xa8514e5e -//.word 0x43c56116 -//.word 0x8bda9753 -//.word 0x74869d63 -//.word 0x1d3cabee -//.word 0xa56dfb91 -//.word 0x404f7fc9 -//.word 0x8addd313 -//.word 0x1b1f7151 -//.word 0x5bab2470 -//.word 0x976cbf48 -//.word 0x55a20ec3 -//.word 0xe52a0d42 -//.word 0x3900583c -//.word 0xf702e328 -//.word 0xcbf6eb9e -//.word 0x02cf2cb9 -//.word 0x552c55bf -//.word 0x0222b904 -//.word 0x223b470b -//.word 0x36bebcef -//.word 0x03311701 -//.word 0xa01d4db3 -//.word 0xcd113fb5 -//.word 0x86e9e95d -//.word 0xd850dc4c -//.word 0xf484ee4f -//.word 0x825a3083 -//.word 0x378120bd -//.word 0xaa0a2028 -//.word 0x63282730 -//.word 0x3535b79f -//.word 0xcff60f06 -//.word 0x8d20a15f -//.word 0x941bc6f0 -//.word 0x1d05b173 -//.word 0x11faa173 -//.word 0xd7935bf9 -//.word 0x69acd868 -//.word 0xae6b3ba6 -//.word 0x047e067c -//.word 0x1ba38c40 -//.word 0x0a6eaab1 -//.word 0x9c47b222 -//.word 0xebb2a8db -//.word 0x31d3b1bc -//.word 0xda31c823 -//.word 0xdebab310 -//.word 0x4d073587 -//.word 0x2ce28636 -//.word 0x7f050058 -//.word 0xa7251bd9 -//.word 0xee2f9bbb -//.word 0x61d208b8 -//.word 0xde3d5f29 -//.word 0x6d2a0726 -//.word 0xd31b06ef -//.word 0x65e3758a -//.word 0x1b6931ae -//.word 0xe5a9d4e0 -//.word 0x42fbe4dc -//.word 0x0e984a36 -//.word 0x9b5a0541 -//.word 0x04c31f30 -//.word 0xbe41e07b -//.word 0x70b04385 -//.word 0x0521a67b -//.word 0xffdac57f -//.word 0x0e9ee906 -//.word 0xe12e5d7e -//.word 0x3c0f2235 -//.word 0x4b8ee376 -//.word 0x36022bf5 -//.word 0xf551d66c -//.word 0x66b5c687 -//.word 0x9cc0d7fe -//.word 0x7a9e1400 -//.word 0x819b2bd8 -//.word 0xe7e41ecb -//.word 0xe9923c3f -//.word 0x62e45023 -//.word 0x9bcc188a -//.word 0x65aef899 -//.word 0x6564f0a4 -//.word 0xb085cc94 -//.word 0x98e79a8c -//.word 0xc56261cc -//.word 0x87d710d5 -//.word 0x6a71b5cd -//.word 0x0b2bef26 -//.word 0x2b93a67b -//.word 0x02cdf9ba -//.word 0xd5da7888 -//.word 0xcb1b94e1 -//.word 0xfd1053ff -//.word 0xcc66497e -//.word 0x7731c3bd -//.word 0xed764587 -//.word 0xdfec37f3 -//.word 0x1a03db88 -//.word 0x142682a5 -//.word 0xc43d0020 -//.word 0xb7775d2e -//.word 0x6146cd83 -//.word 0xb1abe2ba -//.word 0xe8b301f6 -//.word 0xaa4213ca -//.word 0x550f7c56 -//.word 0x93f051b3 -//.word 0x2b58c592 -//.word 0x1d1de51f -//.word 0xed7f862c -//.word 0x3f677b8b -//.word 0xa4ec0bbb -//.word 0xb41ba2c8 -//.word 0x5df8c66c -//.word 0x7ac04d7a -//.word 0xa771cd7c -//.word 0x548c559b -//.word 0x191a5ac0 -//.word 0x49edf4f9 -//.word 0xca284b1e -//.word 0x24024bb4 -//.word 0xd7c6a011 -//.word 0xf21edec1 -//.word 0xe192ff29 -//.word 0x874c136a -//.word 0x8d1e3389 -//.word 0xf9c6b7cc -//.word 0x0270a967 -//.word 0x227c7957 -//.word 0x6e82f18f -//.word 0x23936c52 -//.word 0x81c243e0 -//.word 0xdce38954 -//.word 0xf093f8cd -//.word 0x75792acc -//.word 0xf3cb0ddd -//.word 0xd813917a -//.word 0xc833a32c -//.word 0x34a65ff3 -//.word 0x2e0a81e8 -//.word 0x7bdb1d21 -//.word 0xea8291d5 -//.word 0xe58eb7c0 -//.word 0x46415fc9 -//.word 0x6c4efce3 -//.word 0x8de19d31 -//.word 0x4de01f6d -//.word 0x9070a18a -//.word 0x8dbc3998 -//.word 0x25f2e5e9 -//.word 0x728dc572 -//.word 0xa2da8773 -//.word 0x06b5225b -//.word 0x6694c7e6 -//.word 0x98c81488 -//.word 0x50ff8c0e -//.word 0x3a0c4483 -//.word 0x46ebde50 -//.word 0x44ffbba8 -//.word 0xb09f6d23 -//.word 0xcfd16ba9 -//.word 0xfb550992 -//.word 0x3ae6a70b -//.word 0x16bc28bc -//.word 0xa955a6a8 -//.word 0xf8756354 -//.word 0x826c032b -//.word 0x1897f921 -//.word 0xee294097 -//.word 0xf32b4b7e -//.word 0x5ec23ec0 -//.word 0x89b15edb -//.word 0x031ec6cf -//.word 0xe1995d3b -//.word 0x545a04c3 -//.word 0x81ca14b4 -//.word 0x8c4607eb -//.word 0xf61f75f3 -//.word 0x2ae5436d -//.word 0x52e517b5 -//.word 0x6ff00ec2 -//.word 0xa95eb24e -//.word 0xe3532637 -//.word 0x9341a426 -//.word 0xd1ae2a6e -//.word 0xae386f37 -//.word 0xc6d61cdb -//.word 0x19603990 -//.word 0x1652e548 -//.word 0xf9cd4bd5 -//.word 0x57ded151 -//.word 0xf70392bd -//.word 0xe4eb0fe8 -//.word 0xc07e2192 -//.word 0x5b1d33d2 -//.word 0x852badb5 -//.word 0x20ccb328 -//.word 0x79ec1018 -//.word 0xd8846dd7 -//.word 0x5518c7c2 -//.word 0xee852021 -//.word 0xd7f9744e -//.word 0x1143ee1a -//.word 0x3e4d5c6c -//.word 0xb4e6e12b -//.word 0xd0c5e95e -//.word 0x8ccb6292 -//.word 0x54892a7c -//.word 0x1602c3e0 -//.word 0x99b24eb2 -//.word 0x0fcfb77a -//.word 0xedce2dfd -//.word 0xfa29d519 -//.word 0xa660bff1 -//.word 0x9e3e194a -//.word 0x9d5da235 -//.word 0x85ec62ef -//.word 0xaeb09905 -//.word 0x7e49f5bb -//.word 0x3ab707af -//.word 0x1b1cf8ba -//.word 0xa5c37817 -//.word 0x3462f8c7 -//.word 0xd89c1933 -//.word 0x62ca6414 -//.word 0xbffb3b90 -//.word 0x85390fa5 -//.word 0xcc0fd4cb -//.word 0x3f48b2d5 -//.word 0x73f8fe19 -//.word 0x77c168d0 -//.word 0xac4f76c0 -//.word 0xd6253118 -//.word 0x749c1e9b -//.word 0x4d286f00 -//.word 0x4cde7b99 -//.word 0x8d336c34 -//.word 0xb807373f -//.word 0x8ee2d22f -//.word 0xc17da122 -//.word 0x098431c2 -//.word 0x749a286d -//.word 0xfe9e7c94 -//.word 0x612ce461 -//.word 0x2e678c9d -//.word 0x1df60dd0 -//.word 0xa14d9caa -//.word 0xc02e81a1 -//.word 0x226fccdc -//.word 0x68fd4350 -//.word 0xbf219e29 -//.word 0xb402f76b -//.word 0x4a6c7cd9 -//.word 0x49cf6716 -//.word 0xda8b300a -//.word 0x516a0087 -//.word 0x4a6e6a2c -//.word 0xf7ce568a -//.word 0xb83b3d86 -//.word 0xec679cfe -//.word 0x08c8a2b0 -//.word 0xe69a2c57 -//.word 0x5f23f416 -//.word 0x1b3a051a -//.word 0xa80a737c -//.word 0xca144864 -//.word 0x1273c174 -//.word 0xb264bb64 -//.word 0x900568e9 -//.word 0x995d46dc -//.word 0x589d5298 -//.word 0xc7a579a4 -//.word 0x65ca4f92 -//.word 0x88d70326 -//.word 0xf55193bb -//.word 0xae003ce3 -//.word 0x0baa354e -//.word 0x0c229ced -//.word 0xee82b156 -//.word 0xfcb4426b -//.word 0xa8376636 -//.word 0xda1f6e18 -//.word 0x885e1923 -//.word 0x874307c4 -//.word 0xa14070a5 -//.word 0xe7f016d1 -//.word 0x4858781a -//.word 0x636e49b8 -//.word 0x9ad72032 -//.word 0x68f57182 -//.word 0xf421bc74 -//.word 0xe635044f -//.word 0x794e83b7 -//.word 0xd1d09cd2 -//.word 0x90aa11aa -//.word 0xa4db76d2 -//.word 0x6235e64d -//.word 0xd960f4ab -//.word 0x6023e475 -//.word 0x72df1ccb -//.word 0xbc5cd54c -//.word 0x73c81636 -//.word 0xebfde3ce -//.word 0x6603b203 -//.word 0x2ad61e4e -//.word 0xd669dfdc -//.word 0xf5eafaef -//.word 0xd4483582 -//.word 0x91f3ce2c -//.word 0x75e36c46 -//.word 0x83db5650 -//.word 0x51efe391 -//.word 0x174432fe -//.word 0x06171a5d -//.word 0xdb0064aa -//.word 0xb37838ba -//.word 0x219ad61e -//.word 0x7e26874a -//.word 0x80cbd2f7 -//.word 0x0ea6f2c5 -//.word 0x53068825 -//.word 0x12728e76 -//.word 0x39ed8c6e -//.word 0xb8780ebc -//.word 0x93d955eb -//.word 0x369b4d8a -//.word 0x0a56bf8a -//.word 0x4530c8e7 -//.word 0x06a48a8b -//.word 0xa182216f -//.word 0x3737d803 -//.word 0x8b4f9dd0 -//.word 0x1038b35b -//.word 0x4749a74d -//.word 0x470285d2 -//.word 0x9d964b3f -//.word 0x57a69ef7 -//.word 0x5c50bc8f -//.word 0xff68b230 -//.word 0xd305cf3d -//.word 0xc0405836 -//.word 0x56387ddd -//.word 0x625a8c97 -//.word 0xbfdf6514 -//.word 0x6f952e32 -//.word 0xeae3481f -//.word 0xb60781be -//.word 0x38a38b4d -//.word 0xca78ad44 -//.word 0x0e71b880 -//.word 0x81e33da0 -//.word 0x5313fdb0 -//.word 0x76f9a105 -//.word 0xf543ab67 -//.word 0x879dad76 -//.word 0x6430b846 -//.word 0x5768184d -//.word 0x14fb3e7f -//.word 0xcd27feb7 -//.word 0x003bfb59 -//.word 0x93585f35 -//.word 0x2279cfaf -//.word 0x98b19e1d -//.word 0xfcb44071 -//.word 0x8e990218 -//.word 0x13def922 -//.word 0x6dad38a2 -//.word 0x6e5d4658 -//.word 0xee3cd08d -//.word 0x1b8c9a3f -//.word 0x11cbbb7e -//.word 0xab380a16 -//.word 0x9892d46e -//.word 0xb123d0b0 -//.word 0x89fd542a -//.word 0x4684c8f5 -//.word 0xb02c5cd4 -//.word 0x8884f65e -//.word 0x1b746e60 -//.word 0x17c2fe7d -//.word 0x9cdbf417 -//.word 0x96d1aa73 -//.word 0x4ba0b817 -//.word 0x30b56877 -//.word 0x01b16bd1 -//.word 0x106aca56 -//.word 0xde321f8a -//.word 0xe85d04ed -//.word 0xc3fdccdb -//.word 0x6bf071b1 -//.word 0xd91dce31 -//.word 0xd3fa0e28 -//.word 0x0852654d -//.word 0x5c45fe6d -//.word 0x819034c5 -//.word 0xc70e04b0 -//.word 0x357fc282 -//.word 0xd8890cb3 -//.word 0x5bfcfd40 -//.word 0xd85aa24e -//.word 0xee97b210 -//.word 0x141d79ec -//.word 0x2c1316d9 -//.word 0x5cdfe60c -//.word 0x19e940d3 -//.word 0x84a263c1 -//.word 0xfac6ac0b -//.word 0xe6de0d32 -//.word 0xda08bae2 -//.word 0xdffa251b -//.word 0x09452d8e -//.word 0x4ed7924a -//.word 0x97c4ad97 -//.word 0x18465e22 -//.word 0xdd02455b -//.word 0xa68c351c -//.word 0xf52ee58b -//.word 0x65e5e941 -//.word 0x3dade1ac -//.word 0x45fef1b1 -//.word 0xd9977196 -//.word 0x3b7ae520 -//.word 0x2e382ff8 -//.word 0xc06e0353 -//.word 0x67909cd2 -//.word 0x4fe5ada7 -//.word 0xf3d39bfa -//.word 0xeb5de98b -//.word 0x04eaf498 -//.word 0x9648e001 -//.word 0x12f0d2aa -//.word 0xdb8c5f21 -//.word 0x57b64581 -//.word 0x45035996 -//.word 0x5140c141 -//.word 0xe5fb631e -//.word 0x43469d65 -//.word 0xd1b7370e -//.word 0xb3b39639 -//.word 0x9fec32cc -//.word 0xed294a5e -//.word 0xee46d654 -//.word 0x7f7bbd49 -//.word 0xdee148b4 -//.word 0xbc31d6c4 -//.word 0x93cfd28f -//.word 0x3908e36c -//.word 0xb698629d -//.word 0x53701132 -//.word 0xf3b60a29 -//.word 0xa60cf5da -//.word 0x7c157e93 -//.word 0x9735077f -//.word 0x849999cc -//.word 0xcc78210c -//.word 0xc598d9dc -//.word 0xae1304c4 -//.word 0xfb5bde5f -//.word 0xee7cd3bc -//.word 0x67a1ef03 -//.word 0xfdda965c -//.word 0x4d1c750c -//.word 0x928ab8e1 -//.word 0x77f27dd1 -//.word 0x299b89de -//.word 0xaf3e3a3d -//.word 0x7e52bdb6 -//.word 0x488c814e -//.word 0x16a7ec24 -//.word 0x96614c99 -//.word 0xb6c610b3 -//.word 0x71b038c4 -//.word 0xe98f0a46 -//.word 0xb766070a -//.word 0x7f161d92 -//.word 0xc7df1ebb -//.word 0x0924719e -//.word 0x066e08b9 -//.word 0x5eb4914a -//.word 0x5edaf1fc -//.word 0x1977eec5 -//.word 0xbadb2b0f -//.word 0x18515a16 -//.word 0x8ba1ad91 -//.word 0xffd98d94 -//.word 0x464d8fb5 -//.word 0xb3dda46e -//.word 0xe47690c2 -//.word 0xdfdc9d23 -//.word 0x61a69094 -//.word 0x728adc0b -//.word 0x3dda1619 -//.word 0x1f4fa9cc -//.word 0xfe06cbd5 -//.word 0xdcc8afe6 -//.word 0xab8efc5e -//.word 0x63447f28 -//.word 0x53ce1ce0 -//.word 0xb4490b38 -//.word 0x8493419b -//.word 0x920d2b10 -//.word 0xd59fa260 -//.word 0x01fd1c7b -//.word 0x5c291f18 -//.word 0xce3afc9c -//.word 0x385bb93d -//.word 0x07164f67 -//.word 0x09d3165e -//.word 0x7f9b7d26 -//.word 0x7322fea0 -//.word 0x4c0551f5 -//.word 0x9f50e037 -//.word 0x48437c46 -//.word 0xba564ef1 -//.word 0x937a105e -//.word 0x74a27dac -//.word 0x0f8205d6 -//.word 0x8196c6db -//.word 0xe367b81c -//.word 0x1b0a2705 -//.word 0xf8e967ef -//.word 0x7fc6c345 -//.word 0x7ffcb6e6 -//.word 0x6c085ecb -//.word 0x69492dea -//.word 0xa704e25a -//.word 0xeeabb7b7 -//.word 0x795fdcc8 -//.word 0x07b3255f -//.word 0x2fb30081 -//.word 0xf425a9c7 -//.word 0x990ea104 -//.word 0xb7785c28 -//.word 0x8c733965 -//.word 0x965ab890 -//.word 0x6057e8c9 -//.word 0x9d291e5e -//.word 0x7325eced -//.word 0x197b51c9 -//.word 0xa4bb2e9f -//.word 0x1e98f95a -//.word 0xd9ebb543 -//.word 0x02fb226d -//.word 0x79fb3150 -//.word 0xe0d4bab4 -//.word 0xf32571d1 -//.word 0x178817b4 -//.word 0x3518ede4 -//.word 0xc8306e46 -//.word 0x35753d3e -//.word 0x5c165d17 -//.word 0x6c52a0a5 -//.word 0xfb3b6228 -//.word 0x56ba7674 -//.word 0x15d4614f -//.word 0xf32bc61b -//.word 0xddc822b5 -//.word 0x4917ba9c -//.word 0xc933d156 -//.word 0xe0641d0f -//.word 0x14e77c84 -//.word 0x44ede41f -//.word 0x3ce59863 -//.word 0x87fea28b -//.word 0x84e87d6e -//.word 0xbddb12a6 -//.word 0x73dbe6f1 -//.word 0x7e3a91d7 -//.word 0x545e728e -//.word 0x67c5a11a -//.word 0xb44525b8 -//.word 0x9899677d -//.word 0xe619e73b -//.word 0x38c92ea4 -//.word 0x829504b2 -//.word 0xeddbe246 -//.word 0xe22aaa0f -//.word 0x644a96ad -//.word 0xa47c6e16 -//.word 0xcf02ff39 -//.word 0x2be2c8e2 -//.word 0x62e8f6de -//.word 0x1eea935f -//.word 0xd54ffaa2 -//.word 0xe7d28ece -//.word 0xe684ab20 -//.word 0x3410dd45 -//.word 0xd4435007 -//.word 0x7acc882c -//.word 0xe440529b -//.word 0x6d61fbc1 -//.word 0xe09fbf33 -//.word 0x8adf8495 -//.word 0x937cc9ba -//.word 0x8e8bd90c -//.word 0x4e64442f -//.word 0xfb5e8fe1 -//.word 0x66d92b25 -//.word 0x9a82a4a0 -//.word 0xb4d21b43 -//.word 0xf4d8f62a -//.word 0x1339d6c4 -//.word 0xd775c935 -//.word 0xe66bc2f8 -//.word 0xd82046c9 -//.word 0x8fbc67c2 -//.word 0xcbd5f6c4 -//.word 0xf9f0f518 -//.word 0x4c454b56 -//.word 0x0fc3bb86 -//.word 0x3a541786 -//.word 0x4362b1ac -//.word 0x369a13ab -//.word 0x08f0f0bb -//.word 0x29e35af4 -//.word 0x580234fb -//.word 0xbbafebe1 -//.word 0x2f236148 -//.word 0xddb22ac8 -//.word 0x0e50fb91 -//.word 0x40555f51 -//.word 0x787dac58 -//.word 0xdb3336fa -//.word 0x780fc234 -//.word 0x699d3e93 -//.word 0x1a60af52 -//.word 0xe8166ac2 -//.word 0xee3e87ef -//.word 0x1bd89381 -//.word 0x886c85e0 -//.word 0x094df39c -//.word 0x031f860b -//.word 0x7d97ac34 -//.word 0x79828ceb -//.word 0x84093f3e -//.word 0x8c333d10 -//.word 0xf2ab1504 -//.word 0xe0c4629d -//.word 0xddbafaa3 -//.word 0x9e3b68c8 -//.word 0x1f259d8b -//.word 0xf392e25d -//.word 0xd9121102 -//.word 0x8f37053b -//.word 0xeb574fa2 -//.word 0x278d2ad5 -//.word 0x7d01b2d6 -//.word 0xf36950b2 -//.word 0x79d07961 -//.word 0x319698ee -//.word 0x0eb948d8 -//.word 0xa052c7b7 -//.word 0x2e63a722 -//.word 0x06cfc7d1 -//.word 0x11aa82ff -//.word 0xaab32612 -//.word 0xb01fa87e -//.word 0xda9996e7 -//.word 0x4b864c86 -//.word 0x678d6bcd -//.word 0xe457874e -//.word 0x249320d9 -//.word 0xc23ed4e4 -//.word 0x6b21d230 -//.word 0xef9b92aa -//.word 0x97a0c490 -//.word 0xba0286d4 -//.word 0x8befd9c5 -//.word 0x35bc56ec -//.word 0x2ae01d34 -//.word 0xb7440f4f -//.word 0xddba3d54 -//.word 0x5cca9fad -//.word 0x10b50a30 -//.word 0x80b45c8c -//.word 0xb581fae7 -//.word 0x48187cc5 -//.word 0xbfbfa62c -//.word 0x1a449a06 -//.word 0xa8864dc6 -//.word 0x1f36384e -//.word 0xecdf5010 -//.word 0xc8243774 -//.word 0x8c4ab47a -//.word 0x46f661a1 -//.word 0x8c37a307 -//.word 0x10c6dfd1 -//.word 0x758debcd -//.word 0x6167c356 -//.word 0xd4277e79 -//.word 0xb8db8056 -//.word 0xb952f0c8 -//.word 0x56db6d48 -//.word 0x3850fc0e -//.word 0xc353457a -//.word 0xecd800b3 -//.word 0x4ae4aa8e -//.word 0x6f937cb1 -//.word 0x78609df8 -//.word 0xe3a19717 -//.word 0xa1510881 -//.word 0x6c129a89 -//.word 0x5b7234c7 -//.word 0xb46e72be -//.word 0x013553bb -//.word 0x662e3200 -//.word 0x313bf822 -//.word 0xb3408fb0 -//.word 0x4fdf9a15 -//.word 0xd08663c0 -//.word 0xffac1482 -//.word 0x76572b37 -//.word 0xafe228a8 -//.word 0x60fd88b0 -//.word 0x0bf5f79e -//.word 0xd036c2db -//.word 0x870e8bcd -//.word 0x0bb340fa -//.word 0xd8884e71 -//.word 0xd99c1166 -//.word 0x7b738f1c -//.word 0x060a6708 -//.word 0x2d150433 -//.word 0xe48b16e0 -//.word 0x7164436f -//.word 0xc6a21981 -//.word 0x0e8e485d -//.word 0x86440e92 -//.word 0x8e71f2de -//.word 0x005cb54f -//.word 0xc02386a8 -//.word 0x94477506 -//.word 0x366b2ac3 -//.word 0xa859d79b -//.word 0xc8466b0d -//.word 0x24570904 -//.word 0x0f64b8b7 -//.word 0xf5fb5cce -//.word 0xeba8e5c6 -//.word 0x8a73c696 -//.word 0xfeaba893 -//.word 0x5ae26091 -//.word 0x2e391f4b -//.word 0x5cdee905 -//.word 0x27d2496f -//.word 0x8df042cd -//.word 0xd72b8855 -//.word 0x6e17f1d8 -//.word 0xf0ab26a5 -//.word 0x83459eab -//.word 0x6aeecddd -//.word 0xd6df98db -//.word 0xfe450dce -//.word 0x71425193 -//.word 0xab34d91d -//.word 0xe739dd14 -//.word 0x35f30ac2 -//.word 0xcc887830 -//.word 0xa1eddb8c -//.word 0x3965fdce -//.word 0xbb446c9c -//.word 0x49f96f6a -//.word 0x904b3fe5 -//.word 0x9ee37492 -//.word 0xf40bbeb2 -//.word 0xddb5d56a -//.word 0xfebfb320 -//.word 0x2d750028 -//.word 0x8758cea0 -//.word 0xbc1e8698 -//.word 0xaef92277 -//.word 0x3b1c9d99 -//.word 0x567ca83d -//.word 0x5dd39f9f -//.word 0xa6ebbb61 -//.word 0x5c19892f -//.word 0x89079ba3 -//.word 0x73b77d66 -//.word 0x2cc5ea99 -//.word 0x65ed4073 -//.word 0x83cc322b -//.word 0xf5ebbd18 -//.word 0xc4f95d17 -//.word 0x6b58802d -//.word 0xeadc3b6d -//.word 0x16cf3c1c -//.word 0x33380014 -//.word 0xc45c4666 -//.word 0xa286c343 -//.word 0x4c04171d -//.word 0x7e720009 -//.word 0x053bcd68 -//.word 0xd15c16c6 -//.word 0x4c6bab02 -//.word 0xead8caaf -//.word 0x017495bb -//.word 0xdc2fc24e -//.word 0x0b2695f5 -//.word 0xfcdd0b00 -//.word 0xd0c85929 -//.word 0x67119476 -//.word 0xbd95b260 -//.word 0x7a30b134 -//.word 0xc43a16ba -//.word 0x58519915 -//.word 0xd9591fea -//.word 0x67c2e8c4 -//.word 0x74090ab7 -//.word 0xd3821e44 -//.word 0x1254397d -//.word 0x0ac51e69 -//.word 0xb4b8b1aa -//.word 0x3f73af5d -//.word 0x5fa69d42 -//.word 0xe7a9fe1d -//.word 0x9a06c95c -//.word 0x3e371af9 -//.word 0xf3b128a2 -//.word 0xc3217718 -//.word 0x7af54fd5 -//.word 0xb81e6cf1 -//.word 0x4414f746 -//.word 0xa31bb5d3 -//.word 0xeac67f5e -//.word 0xd0b9f25d -//.word 0x07b26717 -//.word 0xcdcb2507 -//.word 0xbef9d681 -//.word 0xecd93898 -//.word 0x31ac153e -//.word 0xc49f75ad -//.word 0x0b511206 -//.word 0xb08f0c38 -//.word 0xf762de24 -//.word 0x4f4b91ff -//.word 0x27cd30f7 -//.word 0x022c7b19 -//.word 0xce75df72 -//.word 0x71bea674 -//.word 0xa6af6c9c -//.word 0x0741d252 -//.word 0x6ac67611 -//.word 0x712a22c7 -//.word 0x5d78437f -//.word 0x239f9d3d -//.word 0xc2773e29 -//.word 0xd3ffb0f0 -//.word 0x62e97368 -//.word 0xfc58aa73 -//.word 0x09e81525 -//.word 0x5def3f29 -//.word 0x0902f960 -//.word 0x77bb06cc -//.word 0xb6ba18ad -//.word 0x12eafce9 -//.word 0xe80511b1 -//.word 0xb85bfe62 -//.word 0x7ccfa4a9 -//.word 0x382252eb -//.word 0xd37438e4 -//.word 0x25071f8e -//.word 0x51475744 -//.word 0x5507f027 -//.word 0xdf0e2dc1 -//.word 0x63d235e8 -//.word 0x6a830ce5 -//.word 0x2d4bc2d6 -//.word 0x62d5ea51 -//.word 0x560c4e4a -//.word 0x3c25e137 -//.word 0xc4dff571 -//.word 0xf009aede -//.word 0x2445b7cd -//.word 0x7c0d3321 -//.word 0x61f3f7b2 -//.word 0x5f2df6f0 -//.word 0x3150fcca -//.word 0x1e5ca0ce -//.word 0x89f97491 -//.word 0xc3007e51 -//.word 0x233decd9 -//.word 0x597403a5 -//.word 0xffa15947 -//.word 0x71844409 -//.word 0xdf5d92d4 -//.word 0xa0f57a50 -//.word 0xc9ddd34d -//.word 0xfffa8462 -//.word 0x89423cd3 -//.word 0xa9c063b8 -//.word 0x2dde505c -//.word 0x41e3bce4 -//.word 0x87bb7631 -//.word 0x6af75907 -//.word 0xaf147c6e -//.word 0x4c00a858 -//.word 0x7eda0f85 -//.word 0x16f93aa4 -//.word 0x133144bb -//.word 0x765146c8 -//.word 0x52f012a9 -//.word 0x236a2439 -//.word 0x6025d5bc -//.word 0x5419d27d -//.word 0x298fcdb5 -//.word 0x462872af -//.word 0xdb229d2a -//.word 0xb9d7caff -//.word 0x6886cd03 -//.word 0x7356c32f -//.word 0x079848fe -//.word 0xbc4dea17 -//.word 0xb3e8de2c -//.word 0xe155f222 -//.word 0xaa39c372 -//.word 0xb27c30cf -//.word 0xf0050e09 -//.word 0x04c41d31 -//.word 0xcaf63bfe -//.word 0x2fa4d86f -//.word 0x436daab2 -//.word 0x9086a245 -//.word 0xabff1e5b -//.word 0x08486081 -//.word 0x12f33f81 -//.word 0x7bbb1c86 -//.word 0xd1c61882 -//.word 0x532784cd -//.word 0x02a79a0f -//.word 0xfbc56a5f -//.word 0x03fb16ac -//.word 0x6443425c -//.word 0xf8dac734 -//.word 0x8344a778 -//.word 0x45904653 -//.word 0xd0ddd778 -//.word 0x181d140a -//.word 0xc91932ba -//.word 0xddb6142f -//.word 0x6d76bfaa -//.word 0xc7410eea -//.word 0xc266a64d -//.word 0x4edd2d39 -//.word 0x4fcfb7ba -//.word 0xac57816c -//.word 0xa28be29c -//.word 0x5fb67eaa -//.word 0xcce8bdb1 -//.word 0xaab17c6a -//.word 0xe029024e -//.word 0x133335fb -//.word 0x78030dd9 -//.word 0xe6de4afd -//.word 0x3021624e -//.word 0xb185bee6 -//.word 0x28a125bb -//.word 0xc7b1797e -//.word 0x8695a1c3 -//.word 0xbd1dc663 -//.word 0xf283c21e -//.word 0xef39d585 -//.word 0x18e59a18 -//.word 0xfcab3aab -//.word 0x2aaae00e -//.word 0x46c96dec -//.word 0x5cb36cf4 -//.word 0x73204837 -//.word 0x6657bcd1 -//.word 0xeff08ccc -//.word 0x05df7341 -//.word 0x68ae5cc0 -//.word 0x7a0ad5f2 -//.word 0x5081c07d -//.word 0x098a4b28 -//.word 0x5ec62340 -//.word 0x7b85e53a -//.word 0x0d8cd699 -//.word 0x9d16d313 -//.word 0x1c188bef -//.word 0xbfc9ebb1 -//.word 0x0d62daf9 -//.word 0x362227a9 -//.word 0xa696bf46 -//.word 0xda1724a1 -//.word 0x72941ab6 -//.word 0x8892a4d4 -//.word 0x41702efe -//.word 0xa1f00c92 -//.word 0xa4f32328 -//.word 0x8a84e6bd -//.word 0x72188511 -//.word 0x2a14604d -//.word 0x4690c2e9 -//.word 0x6f5bcccd -//.word 0xfe3fafb6 -//.word 0xca861fdc -//.word 0x3dbc04d2 -//.word 0xaeb772ad -//.word 0xead5db68 -//.word 0x14858387 -//.word 0xb00935fb -//.word 0xfa7a3546 -//.word 0x7c0c75df -//.word 0xdf930bd8 -//.word 0x0246e3be -//.word 0x49c3b1c1 -//.word 0x38542a14 -//.word 0x40717497 -//.word 0xd886dbb4 -//.word 0xd0f6c586 -//.word 0xe25fe841 -//.word 0x8b20bace -//.word 0x191829b5 -//.word 0x04b18d40 -//.word 0x811ddbde -//.word 0x55e01bc5 -//.word 0xe78f1cdb -//.word 0x9ad766d7 -//.word 0x59c070a3 -//.word 0x74331305 -//.word 0xaabb3f7f -//.word 0x8788ed74 -//.word 0xf0b9548b -//.word 0xfcdb6059 -//.word 0x05ac603a -//.word 0xff25ff7f -//.word 0x09b875cf -//.word 0x42d7fec7 -//.word 0xdeb58be4 -//.word 0x7950b8a3 -//.word 0xaaafffe6 -//.word 0xdc682b9a -//.word 0x59660f97 -//.word 0xa8e977c7 -//.word 0x19ce5f8b -//.word 0x9e11635a -//.word 0xdc9077ac -//.word 0x8212d816 -//.word 0xda8743b6 -//.word 0x9e9264d1 -//.word 0x0c4491bb -//.word 0x3c2bb8f7 -//.word 0xb28b96a0 -//.word 0x30eb2a07 -//.word 0xcdd36a9e -//.word 0x4bd53415 -//.word 0xa6ca87c2 -//.word 0xe95ef346 -//.word 0x45cf4e6e -//.word 0x64f1a957 -//.word 0xfb7682d6 -//.word 0x9f6c3c16 -//.word 0xd907cc83 -//.word 0x7ca1b4e7 -//.word 0x36ff35d3 -//.word 0x66d6c041 -//.word 0x2d8daf77 -//.word 0xc845322f -//.word 0x1d178cf4 -//.word 0x939c7fcf -//.word 0x27b30423 -//.word 0xbd7e40d6 -//.word 0xb3aeb4b1 -//.word 0xbc01b40a -//.word 0xec081aa0 -//.word 0x0f2e3bc6 -//.word 0x3ff61ac4 -//.word 0xb684dc7a -//.word 0xe05f7c46 -//.word 0xb475c028 -//.word 0x45606c24 -//.word 0x94e7b5e8 -//.word 0xa9c8f8af -//.word 0xe2b5ac65 -//.word 0x8a9c960c -//.word 0xad2b3b5e -//.word 0x2b949bb4 -//.word 0x0c8d1c26 -//.word 0x139bc5f4 -//.word 0x9691ac25 -//.word 0x8d53b26d -//.word 0xe8e06d54 -//.word 0x26906695 -//.word 0x239a85c4 -//.word 0x31d8c934 -//.word 0x6bcf3c18 -//.word 0x46ea27e8 -//.word 0x69068207 -//.word 0xbf33aea2 -//.word 0xcab967db -//.word 0x3a5af427 -//.word 0xbed7a0f4 -//.word 0x1ab66e90 -//.word 0x7a410946 -//.word 0x05d2faca -//.word 0xb64e1dd7 -//.word 0x67f05616 -//.word 0x2f488042 -//.word 0xee83a68a -//.word 0x26ec7636 -//.word 0x0db3f28e -//.word 0xe0ed69f7 -//.word 0x79dda660 -//.word 0x247267dc -//.word 0xaf101190 -//.word 0xc094a1d0 -//.word 0x6b92e685 -//.word 0x04e0eed2 -//.word 0x3259bef7 -//.word 0x45db4575 -//.word 0xca929373 -//.word 0x5c794760 -//.word 0xbd1d46da -//.word 0x25a5b3ce -//.word 0xd90f1be1 -//.word 0x00bcef0f -//.word 0xb22f3892 -//.word 0x53128606 -//.word 0x1f7929ca -//.word 0x056ba4a9 -//.word 0xb99f5fba -//.word 0x05839c84 -//.word 0x6082ac66 -//.word 0xc1876337 -//.word 0xb5bdc929 -//.word 0xb09a12f3 -//.word 0xa01bd12f -//.word 0xc8516800 -//.word 0xcc1cc3f9 -//.word 0x0837463a -//.word 0x267403dc -//.word 0xf0493190 -//.word 0x628cd982 -//.word 0x047bd384 -//.word 0x77fff168 -//.word 0x4d327aad -//.word 0x1e1eda5f -//.word 0xd7c89738 -//.word 0x566d870b -//.word 0x340b4163 -//.word 0xe223d167 -//.word 0xf8bdb000 -//.word 0xc9aef33e -//.word 0x3b16c2f8 -//.word 0xd62c0cb3 -//.word 0x1a3e79c5 -//.word 0x16f3a0bb -//.word 0x36d47bf7 -//.word 0x5d0a179e -//.word 0x336990b1 -//.word 0xc1ae3d79 -//.word 0x3b052829 -//.word 0x1ccfc1bf -//.word 0x78a1d32b -//.word 0x8e90b6b3 -//.word 0x9eacc796 -//.word 0xfaca15ef -//.word 0x5e875ddd -//.word 0x848939e1 -//.word 0xf4089487 -//.word 0x1a8d6149 -//.word 0x9afa8cb0 -//.word 0xe8cb31bc -//.word 0x139b0d86 -//.word 0xe1ea3224 -//.word 0x211dfecd -//.word 0x3dc64d3d -//.word 0x0f26ee5b -//.word 0xf5f1541a -//.word 0x28508e9d -//.word 0x492c7a9e -//.word 0x3daa3510 -//.word 0x3bf2d503 -//.word 0x23355bc9 -//.word 0x12eee357 -//.word 0x33681eed -//.word 0xd88002fa -//.word 0xc9acc03a -//.word 0xdb3cf721 -//.word 0xc5e0277c -//.word 0x306b6856 -//.word 0x0dd65c18 -//.word 0x2b8862f5 -//.word 0x09d40c85 -//.word 0xe9c4d4b0 -//.word 0x25150ace -//.word 0xc682110c -//.word 0x5346cb12 -//.word 0xe7dc52e3 -//.word 0x8609e904 -//.word 0xb11c32e0 -//.word 0x3875a16b -//.word 0x50443006 -//.word 0xe59354a3 -//.word 0x32873029 -//.word 0x8ee2091a -//.word 0x89cdfb73 -//.word 0x37d5ead3 -//.word 0xcc33bbe0 -//.word 0x6950c3e6 -//.word 0x36887fc2 -//.word 0xb12e86ff -//.word 0x46d1bd3e -//.word 0x1fbecadb -//.word 0x3dc6cbcd -//.word 0xc84247ce -//.word 0xa35464bd -//.word 0x446f5b40 -//.word 0xc3192aad -//.word 0x30ef892b -//.word 0x2aea1e14 -//.word 0xade2f49e -//.word 0x2c502abb -//.word 0xe058e83d -//.word 0x5f07973e -//.word 0x70d952bf -//.word 0x1e7e978f -//.word 0x0bdd436f -//.word 0x075abd73 -//.word 0xe15471ab -//.word 0x7df28003 -//.word 0x2720b568 -//.word 0x27d4bc2c -//.word 0x96968eac -//.word 0x703f3030 -//.word 0xea019d12 -//.word 0x05a70123 -//.word 0x631e274a -//.word 0x5935356e -//.word 0x47a19796 -//.word 0x2444394f -//.word 0x5daff94f -//.word 0xe0e55c57 -//.word 0x73617f5e -//.word 0x4b5b51eb -//.word 0xda4800c3 -//.word 0xe8a0b1c4 -//.word 0xe5e37411 -//.word 0x7ede776f -//.word 0x6e2b7aef -//.word 0x97f782ce -//.word 0x5107d299 -//.word 0x02fd1794 -//.word 0xefd8e35d -//.word 0x51bb5ccd -//.word 0xacef361f -//.word 0x5c2ade54 -//.word 0x7012f8d5 -//.word 0xbcfd0c5b -//.word 0x2afb7c0c -//.word 0x5116bae7 -//.word 0x49d8b761 -//.word 0xbd0e9f50 -//.word 0x41ccc309 -//.word 0xe6b1d7c5 -//.word 0x0c6c5d4a -//.word 0x787f61c7 -//.word 0xa74367ff -//.word 0x612da2a9 -//.word 0x914f6617 -//.word 0x5322e017 -//.word 0x4f820517 -//.word 0x46fac88c -//.word 0xea429094 -//.word 0xf306e9d9 -//.word 0x6fe979b9 -//.word 0x59ca37a5 -//.word 0x6e46d7c7 -//.word 0x3c7e88e8 -//.word 0x7c1ae290 -//.word 0xa18e1a6f -//.word 0xb19b79fb -//.word 0x54190c5b -//.word 0x2bf59c84 -//.word 0x6276e0a2 -//.word 0x89c4f2b9 -//.word 0x9faa008c -//.word 0x709b44be -//.word 0x22f33637 -//.word 0x0a8000c9 -//.word 0xc4413213 -//.word 0x826db7a6 -//.word 0xa4b70867 -//.word 0x89d19f35 -//.word 0xa52fafcb -//.word 0xd40d12e7 -//.word 0xeeb382ac -//.word 0x9cf80d44 -//.word 0x6a05c3cb -//.word 0x1d5bb268 -//.word 0x461814bd -//.word 0x1775c682 -//.word 0x7694fc6c -//.word 0x50793454 -//.word 0x30566895 -//.word 0x100b88b6 -//.word 0x6fed2749 -//.word 0xa3c67512 -//.word 0x711e6d6c -//.word 0xdbb94fe9 -//.word 0x39615139 -//.word 0x8be6914d -//.word 0x0e624fbb -//.word 0x0dc15965 -//.word 0xfa81c656 -//.word 0xbdb7e7ec -//.word 0x4c537b3c -//.word 0x7ca422b2 -//.word 0x171f15f8 -//.word 0x2e5c1319 -//.word 0xb0619fe7 -//.word 0x3c23689a -//.word 0x344a09b9 -//.word 0x1335f23e -//.word 0x003ea6f5 -//.word 0xa33f2825 -//.word 0x3755af72 -//.word 0xe0e3a102 -//.word 0x3fdabfdf -//.word 0x44389d9c -//.word 0x44cf563c -//.word 0x4c487d4f -//.word 0xb467575e -//.word 0xf7914789 -//.word 0xc28b896f -//.word 0x4a84234e -//.word 0xe356196b -//.word 0xcf09e1b5 -//.word 0x539816a5 -//.word 0x10f87168 -//.word 0x9157f440 -//.word 0x21a26828 -//.word 0xdf490ab7 -//.word 0x14468246 -//.word 0xc35c1455 -//.word 0x829c1a2b -//.word 0x892eb2bd -//.word 0x094eb4d1 -//.word 0xbf95e763 -//.word 0xc87a7448 -//.word 0xb7189a11 -//.word 0xe532a432 -//.word 0x08741864 -//.word 0x07fb3247 -//.word 0x0d18904c -//.word 0xdd512fd2 -//.word 0x65a9968f -//.word 0x95225132 -//.word 0x717fa146 -//.word 0x654e725a -//.word 0xd9268d5f -//.word 0x062e0f51 -//.word 0x08de1a1a -//.word 0x340acab3 -//.word 0xab1c6b8c -//.word 0x2fa1e92e -//.word 0x3607871f -//.word 0x3da4d405 -//.word 0x5ffbdc0f -//.word 0x263b9b91 -//.word 0xa109b7ee -//.word 0xb77f6ebb -//.word 0xba75cc21 -//.word 0x40ff2283 -//.word 0x2e36b561 -//.word 0x153cb37d -//.word 0xc27a6b3c -//.word 0x102cbc4e -//.word 0x0120ce91 -//.word 0x0dba0133 -//.word 0xba3c2318 -//.word 0x6d44e67b -//.word 0x809791d7 -//.word 0x941cf508 -//.word 0x292ca3ad -//.word 0x6c095cd2 -//.word 0x4fabc9cc -//.word 0xdfc36c63 -//.word 0xd3fad737 -//.word 0x60791c5c -//.word 0x55af8448 -//.word 0x634e84ef -//.word 0xbc97ec2c -//.word 0xe1d86263 -//.word 0xb4330f65 -//.word 0xd5a09893 -//.word 0x2b355047 -//.word 0xc1a6ac6f -//.word 0xd408f77b -//.word 0x2ada467a -//.word 0xa545af7f -//.word 0x17a3b64a -//.word 0x583f0824 -//.word 0x965b6c0b -//.word 0xed78f60f -//.word 0x37d17dfc -//.word 0x26295039 -//.word 0x90c625f0 -//.word 0x09be526f -//.word 0xb77140cf -//.word 0x62571cd3 -//.word 0xcbfccf12 -//.word 0x3f483159 -//.word 0x6b04794b -//.word 0x729af94a -//.word 0x3d1c089b -//.word 0x13883fc4 -//.word 0x694be839 -//.word 0xfb03b338 -//.word 0x1b89abf2 -//.word 0x492f69eb -//.word 0x054687a3 -//.word 0xe1e45876 -//.word 0xdae4d6c1 -//.word 0xe82ddc46 -//.word 0xd43896d2 -//.word 0x4acc351d -//.word 0x2f0ce7f1 -//.word 0x34b4068e -//.word 0xaca08f4e -//.word 0x9b8ed785 -//.word 0x0f2479ab -//.word 0xb33593bd -//.word 0xa14032e0 -//.word 0x78390a48 -//.word 0xae8c6b58 -//.word 0x2860700a -//.word 0x08187a92 -//.word 0xc720dc3e -//.word 0x83e6d8a1 -//.word 0x9a26cbf0 -//.word 0x776ba4ac -//.word 0xacd39a81 -//.word 0x41121f6f -//.word 0x4cb90f27 -//.word 0xc2b92eb8 -//.word 0x8d22d16a -//.word 0xdf31dbea -//.word 0xc58aeba8 -//.word 0xffc2d47e -//.word 0x0f204e92 -//.word 0x90a5eb7d -//.word 0xc9494cad -//.word 0x82889407 -//.word 0x161d1dd1 -//.word 0xca0e6ad0 -//.word 0x5de85dad -//.word 0xe14caa9e -//.word 0xc9aa8c42 -//.word 0x424db7cc -//.word 0xc7988d63 -//.word 0xef8f94c9 -//.word 0x8a99283b -//.word 0xed836d99 -//.word 0x8ac988c7 -//.word 0xc4110f53 -//.word 0x01f9bd58 -//.word 0x00126ba2 -//.word 0x6d2c3b12 -//.word 0xb2d51744 -//.word 0x111c5a70 -//.word 0xef9bcc8e -//.word 0x73b4d4be -//.word 0x501ae9e6 -//.word 0xdf934a9d -//.word 0x71fdef48 -//.word 0xe38fbf82 -//.word 0x736203c2 -//.word 0xd1301b37 -//.word 0x7a5b6ff7 -//.word 0x4131a959 -//.word 0x2e6e229f -//.word 0x8c0299d9 -//.word 0x3e152b06 -//.word 0x52497f7b -//.word 0xd93f4289 -//.word 0xf55cd35a -//.word 0x33cd3f1c -//.word 0x1bc86f61 -//.word 0x0615a0c6 -//.word 0x30ce14d3 -//.word 0x0e630723 -//.word 0xe2e0e5c5 -//.word 0x8c73bae1 -//.word 0xa329ea9f -//.word 0xc4f82244 -//.word 0x2a028e9f -//.word 0x7f184da3 -//.word 0xf27d2255 -//.word 0x8aed6ce9 -//.word 0xbade5827 -//.word 0x35065514 -//.word 0x031dc8cf -//.word 0xd5e401b9 -//.word 0x96666ed8 -//.word 0x427e0f7e -//.word 0xfb992a25 -//.word 0x5abd409e -//.word 0x03cb3f6b -//.word 0x7c01f969 -//.word 0x3fc2d5b2 -//.word 0x0d9ac5c1 -//.word 0x867d78d7 -//.word 0xf74fd09e -//.word 0x73aa960c -//.word 0x25db6d8b -//.word 0xe42d0457 -//.word 0x086b9027 -//.word 0x7ca07a0f -//.word 0x152154a5 -//.word 0x22cd1263 -//.word 0x4594774c -//.word 0x8136cdd2 -//.word 0x934dd9f8 -//.word 0x868e0eb4 -//.word 0x824c0197 -//.word 0xe53d1daf -//.word 0x948198ad -//.word 0x94e0a543 -//.word 0xd454ecd0 -//.word 0x4dc7373f -//.word 0x4d1d6e2c -//.word 0x1075c549 -//.word 0x91ac3401 -//.word 0x9f23285b -//.word 0x33c37820 -//.word 0x013e9a40 -//.word 0x4d971772 -//.word 0x00e43c1b -//.word 0xfb531271 -//.word 0xab6b91e0 -//.word 0xde9411ad -//.word 0xd5da01d9 -//.word 0x9aeedb48 -//.word 0x946d5722 -//.word 0x5865e07a -//.word 0xc216442d -//.word 0x45f5af0d -//.word 0x7ff7da3f -//.word 0x100b80e2 -//.word 0xade812f1 -//.word 0x700aab6b -//.word 0x72f746b1 -//.word 0x9cc72f2f -//.word 0xbae3b73e -//.word 0xd10d2c49 -//.word 0xb3a1082f -//.word 0xd01a69e9 -//.word 0x4fd7c16d -//.word 0x5e20cfd2 -//.word 0xc664ceb4 -//.word 0xc2c4ecda -//.word 0x11d6fd16 -//.word 0x4aa2716d -//.word 0x70f18378 -//.word 0xc6c8b40a -//.word 0xe42f7814 -//.word 0x0b362fc5 -//.word 0xb63a56f5 -//.word 0x7165ffc3 -//.word 0xee747e7d -//.word 0x56bd66c1 -//.word 0xdd70b4e2 -//.word 0x991d498d -//.word 0x94769ead -//.word 0x2057b38b -//.word 0x6a03483a -//.word 0x52b15032 -//.word 0x7a47a33b -//.word 0x9d65f38d -//.word 0x23a50135 -//.word 0xf22110ba -//.word 0x86369a01 -//.word 0x4488436e -//.word 0x0b460b4c -//.word 0x0db0c76f -//.word 0xddd6d217 -//.word 0xc8a20018 -//.word 0x6918d338 -//.word 0x78ddf2d9 -//.word 0xe3f6d6d8 -//.word 0x20d3c7b4 -//.word 0xc18c07f3 -//.word 0x496a4dc1 -//.word 0x3ea974db -//.word 0x7f7c75ab -//.word 0xd85293b4 -//.word 0xd458d531 -//.word 0xd23fb9f9 -//.word 0x5b3f27a6 -//.word 0xb35ca4f6 -//.word 0xaee8c872 -//.word 0xc549f24d -//.word 0x69fc3a8e -//.word 0x98daa772 -//.word 0xad9aa30b -//.word 0x7c98ab2e -//.word 0x9ed44b8c -//.word 0x0a3e4a1f -//.word 0xe53122c8 -//.word 0x9c3db236 -//.word 0x2f293709 -//.word 0xd0387937 -//.word 0xacac42af -//.word 0x0989143d -//.word 0x919b1bae -//.word 0xedba6134 -//.word 0x964d410c -//.word 0xe80d1e5d -//.word 0x790c5564 -//.word 0xa8f56fce -//.word 0x79959c65 -//.word 0xa09a5def -//.word 0xdb9b8053 -//.word 0x855951fe -//.word 0x69450f85 -//.word 0xd4429d8c -//.word 0xeeab7ae6 -//.word 0x4998f3fe -//.word 0xbb5d9775 -//.word 0x6954ec0c -//.word 0x25dd60c5 -//.word 0xfaa28245 -//.word 0x0420727d -//.word 0x85639689 -//.word 0x36108fd8 -//.word 0xdba96c8e -//.word 0x1a0d1d26 -//.word 0x8d3e2a5c -//.word 0x1667a54a -//.word 0x731e5dd1 -//.word 0x12e6543a -//.word 0x26f8731d -//.word 0xfa437d82 -//.word 0x85b14247 -//.word 0x40ac15c2 -//.word 0x34e17fa6 -//.word 0x5743352b -//.word 0x18534869 -//.word 0x399f9c05 -//.word 0xdd899b10 -//.word 0xe24a2a2c -//.word 0x7037dcf1 -//.word 0xd242668f -//.word 0x85c354b4 -//.word 0x8f79fab0 -//.word 0x12cbacd7 -//.word 0x21543226 -//.word 0xd29f762a -//.word 0x952f801e -//.word 0xc4c3a454 -//.word 0x7bd8fad6 -//.word 0xa96e0f4c -//.word 0x670fda20 -//.word 0x890ef2e1 -//.word 0x730dfee5 -//.word 0x2fc16c33 -//.word 0xbcfa669f -//.word 0xa8dd0137 -//.word 0xe174b8de -//.word 0xc86a1a37 -//.word 0x870fbfc5 -//.word 0xa4a28050 -//.word 0xd7d0e78a -//.word 0x1978e5f2 -//.word 0xfeb1c3f9 -//.word 0x440e5b63 -//.word 0xac2188f1 -//.word 0x083ddb3d -//.word 0x968090e5 -//.word 0x8c11c0eb -//.word 0xf4a7d85c -//.word 0xba4b4930 -//.word 0x045e8172 -//.word 0xc1dd1ba1 -//.word 0x85e45255 -//.word 0x9471bc25 -//.word 0x3d6b35c9 -//.word 0x69e3187c -//.word 0x7399b6a4 -//.word 0x3ac200b5 -//.word 0x75088753 -//.word 0x47d3a7b7 -//.word 0x14c7fe53 -//.word 0x928e23b9 -//.word 0x23d795b9 -//.word 0x629ef2c9 -//.word 0xfbae6aab -//.word 0xc1657249 -//.word 0xfab8bde4 -//.word 0xfd76686d -//.word 0x00d17533 -//.word 0x2b1a7abf -//.word 0xf1cc9afc -//.word 0x9fccb59c -//.word 0x35efdcb6 -//.word 0x76bd08b4 -//.word 0x3b750b6c -//.word 0x0c51c68d -//.word 0xf10a9d3d -//.word 0x869f2800 -//.word 0x4e532bdc -//.word 0x49f4c9bb -//.word 0xc963f410 -//.word 0x815128bd -//.word 0xdf475935 -//.word 0x9ce92add -//.word 0x917b5fb9 -//.word 0xcca49544 -//.word 0xe372309f -//.word 0x889f96ee -//.word 0x5e139b00 -//.word 0x0ba93b2e -//.word 0x8f368f85 -//.word 0xd4c8fa27 -//.word 0x852ba4ee -//.word 0x24b22953 -//.word 0x5733928e -//.word 0x835484ff -//.word 0x9c05b7cd -//.word 0x3c4eaacd -//.word 0xf24b95a5 -//.word 0xdc75a031 -//.word 0x78225225 -//.word 0xb7504cf4 -//.word 0x539e37f1 -//.word 0x639bfbb4 -//.word 0x2d4331c0 -//.word 0x3bc7dc63 -//.word 0xb18d53dd -//.word 0xdd7882c4 -//.word 0x106952a6 -//.word 0xac0666f1 -//.word 0x7fba0810 -//.word 0x4ffc63d7 -//.word 0xb6d5f221 -//.word 0x319c38b7 -//.word 0x7305b274 -//.word 0xff5a0aa7 -//.word 0xf5078db9 -//.word 0x2c5cdf10 -//.word 0x828fed32 -//.word 0x7000242e -//.word 0xe2c1e138 -//.word 0x45562893 -//.word 0xe1b998b4 -//.word 0x69a29ea4 -//.word 0xd004eaa6 -//.word 0x5fdb1f1a -//.word 0x0525cfa1 -//.word 0xee2ea682 -//.word 0x5611e54c -//.word 0xa07c12bd -//.word 0xa2b3eee3 -//.word 0x44d8a881 -//.word 0x496950b4 -//.word 0x6c0a8ed6 -//.word 0xaf8594a3 -//.word 0xf00f519a -//.word 0xbdcde8a6 -//.word 0x699660fe -//.word 0x5ffb9d4a -//.word 0xb7848f07 -//.word 0x073da92c -//.word 0x7c71950e -//.word 0x29b62681 -//.word 0x9e298e40 -//.word 0xbdfbd18f -//.word 0xc92d791e -//.word 0xc0978c31 -//.word 0xeb2fbbfe -//.word 0xb388dc56 -//.word 0xb6999a88 -//.word 0x1ac06b83 -//.word 0x2107c33a -//.word 0xfea5884d -//.word 0xe8c8c5e5 -//.word 0x6c91a2df -//.word 0x0760942e -//.word 0xf453d17a -//.word 0x4309070d -//.word 0x2bac4df0 -//.word 0xa12e5a51 -//.word 0x29d2f428 -//.word 0xedefac1b -//.word 0x0cf1c99e -//.word 0x34a0825e -//.word 0x73a570e0 -//.word 0x4a494265 -//.word 0x0481b312 -//.word 0x4528b94d -//.word 0xe68bff6a -//.word 0x002a9687 -//.word 0x47bde8b4 -//.word 0x9a76ed58 -//.word 0xd886a1d0 -//.word 0xf4e2b558 -//.word 0x4c47842f -//.word 0x367b4af6 -//.word 0xdcd79059 -//.word 0x4b02ebf2 -//.word 0xc6ffe66a -//.word 0x606a3de2 -//.word 0xcafe4c91 -//.word 0x695bc6ae -//.word 0xab06aa90 -//.word 0x9cb27314 -//.word 0xb4be903f -//.word 0xf3fe1324 -//.word 0x31bead08 -//.word 0xaf04dac5 -//.word 0xf116596c -//.word 0xd03cdf2e -//.word 0xcbc70c7d -//.word 0x9e529e6e -//.word 0x1648e562 -//.word 0x23a777e5 -//.word 0x2f0324d6 -//.word 0xaecd2cc9 -//.word 0xf6d5b0a9 -//.word 0x510e67a2 -//.word 0x5191923d -//.word 0x64e532cd -//.word 0xa87e780b -//.word 0x01837dfd -//.word 0x68d5331c -//.word 0x864c9cb5 -//.word 0x81443990 -//.word 0x1658c6d0 -//.word 0xe86d241a -//.word 0x17f397f9 -//.word 0x15673181 -//.word 0xb51c8e33 -//.word 0x853cc221 -//.word 0x5e099053 -//.word 0x3969dd68 -//.word 0x44a26380 -//.word 0x3662aa5a -//.word 0xdf0234ba -//.word 0x030bf80e -//.word 0x68fa1350 -//.word 0x2e40b92e -//.word 0x5f8d7169 -//.word 0xc74e827b -//.word 0x0675a87c -//.word 0xe3780c46 -//.word 0xe39c73d8 -//.word 0x1b73b6f8 -//.word 0x42a3721d -//.word 0x0aea008b -//.word 0xb05fa8c0 -//.word 0xd2fb110f -//.word 0x8257fc8b -//.word 0x98b73226 -//.word 0x4c48bb1a -//.word 0x04a65188 -//.word 0x6aa1155f -//.word 0xc2418080 -//.word 0x7b089b20 -//.word 0x0376736d -//.word 0xe0d3c774 -//.word 0xfd280542 -//.word 0x418f7549 -//.word 0x66acb306 -//.word 0x097c62e1 -//.word 0xfd4d1f55 -//.word 0xe50eb450 -//.word 0x02c98edd -//.word 0x496e7200 -//.word 0xb9d26be1 -//.word 0xebf7072d -//.word 0xeb8ec2ba -//.word 0x46bac36a -//.word 0x6417c651 -//.word 0x18fb5a1a -//.word 0x76fc4ca6 -//.word 0xe5b263f7 -//.word 0x75be4d4d -//.word 0x720ada8e -//.word 0x395368eb -//.word 0x4ae59fc1 -//.word 0x9fa65ebd -//.word 0x3c56f444 -//.word 0x08159412 -//.word 0xdb260321 -//.word 0xd8f294cc -//.word 0xfd505634 -//.word 0xf8038ce3 -//.word 0x3c845daf -//.word 0x5503cde1 -//.word 0x78a8ec97 -//.word 0x5f1e4d67 -//.word 0x5452ba45 -//.word 0x8b7826a7 -//.word 0xb450e3e7 -//.word 0xd1a716e8 -//.word 0x452067fc -//.word 0x2e34fd05 -//.word 0xf578a9db -//.word 0x241e61ee -//.word 0x77bff12d -//.word 0x3558ed26 -//.word 0xc092ea6e -//.word 0x6b46ed43 -//.word 0x8d402470 -//.word 0xd443d471 -//.word 0xdb4e93d8 -//.word 0xfe1eb7ef -//.word 0x6df40e9f -//.word 0x7f98d090 -//.word 0x499ed192 -//.word 0x70e8fb3c -//.word 0x3b6cfcd2 -//.word 0xec373c6c -//.word 0x51b21255 -//.word 0x962537b2 -//.word 0x5d797b64 -//.word 0x1042b62f -//.word 0x76fd021b -//.word 0x8595271a -//.word 0x782d57ec -//.word 0x21191c40 -//.word 0x7f2d8e1c -//.word 0x933bc97e -//.word 0x70d79e44 -//.word 0x925d8949 -//.word 0x7036e3d1 -//.word 0x54565927 -//.word 0x6b099d84 -//.word 0x18f05b33 -//.word 0x8e466ff3 -//.word 0x9e68559d -//.word 0xcd95e106 -//.word 0xaaf23027 -//.word 0x5fd1de7b -//.word 0x853279a9 -//.word 0x3d8a3663 -//.word 0x7cc4e38e -//.word 0xa6861da3 -//.word 0x5fb5c355 -//.word 0x9e3bab74 -//.word 0x02089311 -//.word 0x6a565ae3 -//.word 0xc03270e9 -//.word 0x15388b51 -//.word 0xf39e9b99 -//.word 0xee7401f4 -//.word 0x7d29fbef -//.word 0x08526354 -//.word 0x42a79a4e -//.word 0xb94ebfcf -//.word 0xac5d242f -//.word 0x1c9a0216 -//.word 0x25856b9b -//.word 0x8f9881ad -//.word 0xa1cde6b2 -//.word 0x3561736f -//.word 0x12d72d28 -//.word 0x75417408 -//.word 0xf1bb7ec3 -//.word 0x79380479 -//.word 0xbc813bde -//.word 0xb17a0698 -//.word 0x72a76ae8 -//.word 0x4df0428d -//.word 0x18a134e5 -//.word 0xc6b5e356 -//.word 0x385466ec -//.word 0x559afa43 -//.word 0x5d9af3a8 -//.word 0x7aa3f97b -//.word 0x99c270d7 -//.word 0x77873876 -//.word 0xff0c97ce -//.word 0xd3347380 -//.word 0x2931c5f3 -//.word 0xd8494a3c -//.word 0xb2d97c42 -//.word 0x159ac01f -//.word 0xbd23e1c9 -//.word 0xdcafbdf1 -//.word 0x6d213e2b -//.word 0xc5458c50 -//.word 0x6b598120 -//.word 0x29cc5e2c -//.word 0x6345bcf4 -//.word 0xa8e7c54c -//.word 0x87d4a304 -//.word 0xa4ef39c7 -//.word 0x0be71144 -//.word 0xc371968c -//.word 0xa7d484bb -//.word 0x71ab9cdb -//.word 0x18e69c05 -//.word 0x5c136ec9 -//.word 0x9edca0d1 -//.word 0xf6d014c0 -//.word 0x8066f960 -//.word 0xf63ef9fd -//.word 0x84abb40c -//.word 0xd76f6e11 -//.word 0x78c504bf -//.word 0x58a52560 -//.word 0xac43be77 -//.word 0xfad9b6a4 -//.word 0x74a6dcc9 -//.word 0x86361e6b -//.word 0xabe5fb5b -//.word 0x849f3b95 -//.word 0x2be9dd68 -//.word 0xc52551d7 -//.word 0x5611e740 -//.word 0xda92883b -//.word 0x91b0a4c5 -//.word 0x9ae16b9e -//.word 0xc38a40ef -//.word 0xa0c36a30 -//.word 0xda5b0d49 -//.word 0xca1b59f7 -//.word 0x464f0272 -//.word 0xbb83f04d -//.word 0x7c8b379d -//.word 0x5ac6495d -//.word 0x75a36b11 -//.word 0x526365aa -//.word 0x2d217eaa -//.word 0x9010a788 -//.word 0x2405f756 -//.word 0xc83557a1 -//.word 0xe03f7f99 -//.word 0xef6d2171 -//.word 0x69366309 -//.word 0xc20893cb -//.word 0xcb4516d3 -//.word 0x3e8ca252 -//.word 0x9739ae34 -//.word 0x262f2600 -//.word 0x63d56200 -//.word 0x815e59a3 -//.word 0x464e121f -//.word 0x19395c5a -//.word 0x5dcebf0b -//.word 0xfd15b21c -//.word 0x48f50e54 -//.word 0x00f9c332 -//.word 0xad54ca1c -//.word 0x37225bb9 -//.word 0xb4f05f9b -//.word 0x7f7f2821 -//.word 0x8ac5609b -//.word 0xf5353fb0 -//.word 0xdf4001fd -//.word 0x7c1c98ff -//.word 0x67c49e33 -//.word 0x3a408d7b -//.word 0x5d2632c4 -//.word 0x1b615fe6 -//.word 0xfb31e1cb -//.word 0x4d73b1d4 -//.word 0x03236f78 -//.word 0xc21f0b2f -//.word 0x392dc68e -//.word 0xb24059b3 -//.word 0xe6f773e3 -//.word 0x16676972 -//.word 0x571a29e3 -//.word 0x2e577151 -//.word 0x5ca43e0e -//.word 0xfb8a8689 -//.word 0xca982975 -//.word 0xc6ab2627 -//.word 0xfa6c0a40 -//.word 0x9719af8d -//.word 0x4789222b -//.word 0xbf6ae5ef -//.word 0x93ce5704 -//.word 0x4fe670d6 -//.word 0xc30cb12f -//.word 0x9e075ba0 -//.word 0x3f8be023 -//.word 0xc70097fe -//.word 0x7384b3eb -//.word 0x29337675 -//.word 0x50a6a2a5 -//.word 0xe5b931de -//.word 0xcb924506 -//.word 0x63df62e6 -//.word 0x5d5edbd4 -//.word 0xcea38a8f -//.word 0x8216c46a -//.word 0x933b8cad -//.word 0x3a360738 -//.word 0xe68e3169 -//.word 0x8b31cd40 -//.word 0x3db8a2c1 -//.word 0xfdede49a -//.word 0xd38af106 -//.word 0x1d443ef1 -//.word 0x2608905d -//.word 0xfa856f04 -//.word 0x79ead73f -//.word 0xabf13226 -//.word 0x531c83f9 -//.word 0xc73ee4bf -//.word 0xfe3e322c -//.word 0xeb1807c8 -//.word 0x0924e84e -//.word 0x389bc052 -//.word 0xc7578d27 -//.word 0xd2da5a00 -//.word 0xce926d55 -//.word 0x625cc189 -//.word 0x7846b7c9 -//.word 0x95990837 -//.word 0x6517fe48 -//.word 0x9b81e46a -//.word 0xf85cbbeb -//.word 0xa8f52e16 -//.word 0xd5a3c89f -//.word 0x774c6541 -//.word 0x692ae6a5 -//.word 0xc2cf2986 -//.word 0x62673913 -//.word 0xcb3ec194 -//.word 0x3382c751 -//.word 0xd74996af -//.word 0x91d5fc9d -//.word 0xad17b62e -//.word 0xf9732987 -//.word 0x1bc353fc -//.word 0x279e0076 -//.word 0x71da4118 -//.word 0xa04f1a22 -//.word 0x04de7b15 -//.word 0x2ab37118 -//.word 0xadc69e9a -//.word 0x4ea8e739 -//.word 0x477c6ce2 -//.word 0xdd43bd3a -//.word 0x355e4b3d -//.word 0x684d1c25 -//.word 0xd9bdc38e -//.word 0xc7c290d7 -//.word 0x1e6104cb -//.word 0x93518781 -//.word 0xef025d80 -//.word 0xabdfd727 -//.word 0xbed1c64d -//.word 0xb3043524 -//.word 0xfeed5863 -//.word 0x908cbfa4 -//.word 0xa9eecf0a -//.word 0xeef77328 -//.word 0xbb5e0f1e -//.word 0xbaf9b605 -//.word 0xb53b9c8e -//.word 0xa8fbcee5 -//.word 0x1b7620dc -//.word 0xae986745 -//.word 0xf677e99f -//.word 0x872112f6 -//.word 0x52976904 -//.word 0x3219c29c -//.word 0xc1a4b449 -//.word 0x70ba4d32 -//.word 0xd7610540 -//.word 0x496ef183 -//.word 0xac0339d2 -//.word 0x8757ccb2 -//.word 0x5db5527a -//.word 0x3ac863b4 -//.word 0x8b15f6c5 -//.word 0x32c91cd1 -//.word 0xdab5eed9 -//.word 0x8897c326 -//.word 0x739ba7eb -//.word 0x16210926 -//.word 0x83c1b4c7 -//.word 0xfa8c0114 -//.word 0xba954a4c -//.word 0x17b1a18a -//.word 0xcd7ac2ed -//.word 0x949a47f6 -//.word 0xf5461b31 -//.word 0x5b083118 -//.word 0x6dc27634 -//.word 0x9bf00485 -//.word 0xf72d9824 -//.word 0x47f94627 -//.word 0x58b96bc5 -//.word 0x95ffe4bb -//.word 0xd70c7ded -//.word 0x7f93ac51 -//.word 0xc3c08009 -//.word 0x4579d4cf -//.word 0xeae4c896 -//.word 0xe929726e -//.word 0x2279d0a9 -//.word 0xb24f013c -//.word 0xc4f5b568 -//.word 0xa94be399 -//.word 0x2cc4ba8e -//.word 0x1fb1d9ba -//.word 0x3ac2c2ea -//.word 0x26c98c29 -//.word 0xd4c2d9e0 -//.word 0x13110842 -//.word 0x620aace7 -//.word 0x02b63cb7 -//.word 0x50d40c0a -//.word 0x521f7b0e -//.word 0x90cf6e68 -//.word 0x2562fe1e -//.word 0x159c6eb4 -//.word 0xe1cd6095 -//.word 0x595248b5 -//.word 0xb25e2075 -//.word 0xd8fb5ec7 -//.word 0x054b2392 -//.word 0x9314b558 -//.word 0x0f7b2f16 -//.word 0x8e10776b -//.word 0x440b71fd -//.word 0x52d57219 -//.word 0xe0cbf899 -//.word 0x6c3e980b -//.word 0x61be370f -//.word 0xec987d01 -//.word 0x0b9d87d8 -//.word 0xe725dc4e -//.word 0x6354a342 -//.word 0xf59c135a -//.word 0xb5832aec -//.word 0xb3a7a21f -//.word 0x8eff214d -//.word 0x4263b0ac -//.word 0x424f6e2e -//.word 0xc7e485a5 -//.word 0x672f5e2b -//.word 0xe9ae11c1 -//.word 0x58102036 -//.word 0x563d644b -//.word 0xb3964714 -//.word 0x3e7e34a1 -//.word 0xdb194cde -//.word 0xd6535bb8 -//.word 0x77250a81 -//.word 0xd7145696 -//.word 0xf1fa403f -//.word 0xfc08c6d6 -//.word 0xf90c132c -//.word 0x88f0f328 -//.word 0xff8389b1 -//.word 0xbd7d44ce -//.word 0xbcbd0f0c -//.word 0x66d4c821 -//.word 0xaac7f4ce -//.word 0x4e11b10a -//.word 0x87e8eb5c -//.word 0xc7c1d389 -//.word 0xd6168d6f -//.word 0x24672931 -//.word 0x5e7fd594 -//.word 0x3ff851a9 -//.word 0xa901a3ad -//.word 0xf45f0b2d -//.word 0x86b2396d -//.word 0xa3fabe0b -//.word 0x8759c1e0 -//.word 0xb21bf327 -//.word 0x84f3c5e1 -//.word 0x0987d878 -//.word 0x162fb4a2 -//.word 0x95fabe88 -//.word 0x1df36428 -//.word 0xc6a29bf7 -//.word 0x3bd58bcb -//.word 0x10a088f9 -//.word 0x56a245ba -//.word 0x6d8a44d4 -//.word 0x1ada9176 -//.word 0xd9ebb063 -//.word 0x7531d452 -//.word 0xd5c15295 -//.word 0x191054fa -//.word 0xe6fed2ef -//.word 0xfd13bee9 -//.word 0x13087f06 -//.word 0xdd89a1f1 -//.word 0x6a39cb06 -//.word 0xb5f7f1b6 -//.word 0x7b60ca2d -//.word 0x4a948533 -//.word 0xdb3db850 -//.word 0xa1ce9934 -//.word 0xa2097055 -//.word 0x86c44cda -//.word 0xedecf5b8 -//.word 0x06ca231b -//.word 0x5e85ed07 -//.word 0xf5e9843f -//.word 0x97662166 -//.word 0x695c3c64 -//.word 0xc396ff0b -//.word 0x3d14fafb -//.word 0x0d0d18c2 -//.word 0x9034d248 -//.word 0x263ba26b -//.word 0x4395bbe6 -//.word 0xc381f777 -//.word 0x7e441141 -//.word 0x1db5146f -//.word 0x2cff131a -//.word 0x70a31b6c -//.word 0x7abc6606 -//.word 0x7c87d1a0 -//.word 0x5c2290ef -//.word 0x079421cc -//.word 0x080e7e92 -//.word 0x597197c8 -//.word 0x780fff00 -//.word 0xbeb6e6fe -//.word 0xedeb471d -//.word 0x087362ef -//.word 0x67186d24 -//.word 0x0aa987ad -//.word 0x2e43ed21 -//.word 0x1ecf705f -//.word 0x4ccc2775 -//.word 0xa04f61c0 -//.word 0x1047dd55 -//.word 0x71063ea0 -//.word 0x8cfdb94b -//.word 0x75c71161 -//.word 0x186ac5b4 -//.word 0x15d9887c -//.word 0xcebdf140 -//.word 0xbd7474fa -//.word 0x0c5a9176 -//.word 0x5f484bfb -//.word 0xf55bdc2d -//.word 0xeff7a732 -//.word 0xef0b6e14 -//.word 0xe596c566 -//.word 0x266ac62b -//.word 0xbf3007f3 -//.word 0x08acc947 -//.word 0x7c427247 -//.word 0xc7b93e92 -//.word 0x21403166 -//.word 0xdbae5009 -//.word 0x370e1067 -//.word 0x7d5b0ffc -//.word 0x4b8802f4 -//.word 0x2dc3ee91 -//.word 0x6dfb9cce -//.word 0x2da04742 -//.word 0xb2aa9746 -//.word 0x03dcd35a -//.word 0xb34a52c5 -//.word 0xfb19327c -//.word 0x0c864d45 -//.word 0xa229691c -//.word 0xdd7bafd6 -//.word 0x4d975f04 -//.word 0x4b3dc11a -//.word 0x901c5fd1 -//.word 0x005171c9 -//.word 0xc72b9973 -//.word 0xa731d02e -//.word 0x9066a0b0 -//.word 0x72cb95a8 -//.word 0x4f26eea1 -//.word 0x9402972a -//.word 0xa9f75c34 -//.word 0xc72b57bb -//.word 0x0a19aaa9 -//.word 0xc79174f7 -//.word 0x1f00fd15 -//.word 0xd4f2348c -//.word 0x5cd55ce2 -//.word 0x340002bd -//.word 0x77f4324c -//.word 0xafe1eae3 -//.word 0xeb6ccfe5 -//.word 0x12af1fe7 -//.word 0x7681e712 -//.word 0xacf876c9 -//.word 0x9c2d118c -//.word 0xd43fe81d -//.word 0x229b49e1 -//.word 0x617a1488 -//.word 0x93ab6ff1 -//.word 0x3092ba47 -//.word 0xbe71c671 -//.word 0xa2e641a9 -//.word 0x36b5756a -//.word 0x1bc83390 -//.word 0xd17409bb -//.word 0x84febbf4 -//.word 0x295ef193 -//.word 0xca422e5f -//.word 0x1e5601f8 -//.word 0x5dc37f72 -//.word 0x52f5f043 -//.word 0xb2a2c95f -//.word 0xac08dba1 -//.word 0xc176c96d -//.word 0xd60dbf94 -//.word 0x88c86177 -//.word 0xbfba0270 -//.word 0x8697176d -//.word 0x1a76ebde -//.word 0x40d594d2 -//.word 0xdcde255c -//.word 0xc0e9253c -//.word 0xc24140bb -//.word 0x112b3dd7 -//.word 0xc92430a0 -//.word 0xc46bf1e2 -//.word 0xb4bfcc04 -//.word 0x6e6a7a30 -//.word 0x897e50b5 -//.word 0x285fb7a9 -//.word 0x1481dcd2 -//.word 0x0e73a9c7 -//.word 0x631df352 -//.word 0xc046f519 -//.word 0x4859fd7d -//.word 0xe46865c3 -//.word 0xda71c571 -//.word 0xa2e067fb -//.word 0xf556fb9f -//.word 0x26a98c8e -//.word 0xb52cb34c -//.word 0x22300b59 -//.word 0xffcae411 -//.word 0x49d73cd1 -//.word 0xf83eeb5b -//.word 0xd5751d7c -//.word 0x8c4705ec -//.word 0x02d4d075 -//.word 0xe8d9d857 -//.word 0x91311bec -//.word 0x009ceb88 -//.word 0x46c0e7a3 -//.word 0x0b6d293a -//.word 0x6a25c172 -//.word 0x02dc627f -//.word 0x49fc5cc4 -//.word 0x24acca3b -//.word 0xb5520d18 -//.word 0x745679a9 -//.word 0x822a4d81 -//.word 0x3a87e9d5 -//.word 0x08f93b26 -//.word 0x7e9d7b20 -//.word 0xa42918c3 -//.word 0x902ef2c0 -//.word 0x379ac926 -//.word 0x8381f53d -//.word 0xa61d58b2 -//.word 0xad1392f5 -//.word 0x58f773e0 -//.word 0x2913b699 -//.word 0xbb64ecb9 -//.word 0x55e6b6ae -//.word 0xbf12375e -//.word 0x54a4c90c -//.word 0x59a1ef80 -//.word 0x8d998c62 -//.word 0x012952e8 -//.word 0x2ac57cb1 -//.word 0x35b4c0f0 -//.word 0x9a5c7fcc -//.word 0xf4c04007 -//.word 0x10475cde -//.word 0x44bffa31 -//.word 0x02a13ee4 -//.word 0xac97be85 -//.word 0xaa3b362f -//.word 0xbb227cae -//.word 0x8819b6e3 -//.word 0x7faeca6a -//.word 0xdef3167b -//.word 0x0e7e620e -//.word 0x33b41243 -//.word 0x0148a000 -//.word 0xd1fe4adc -//.word 0xf4b5083c -//.word 0x47a4c1bb -//.word 0x07e4bed0 -//.word 0xe72e5fab -//.word 0x60e70d5f -//.word 0x49596f46 -//.word 0xa744e1a1 -//.word 0xc6952280 -//.word 0x89754ce2 -//.word 0xfe850a1c -//.word 0x3568057f -//.word 0x53839f35 -//.word 0xe200e46c -//.word 0x6b19bdb7 -//.word 0x479367b0 -//.word 0xb28824e3 -//.word 0x216a31e7 -//.word 0xd645f7ce -//.word 0xb14485c0 -//.word 0x49773ee2 -//.word 0x3bd3cf7c -//.word 0xc27b655c -//.word 0x883e1c75 -//.word 0xbc60bacc -//.word 0x659d9d95 -//.word 0xf66bf298 -//.word 0x228028da -//.word 0xf194a47a -//.word 0x1468b7d9 -//.word 0x7607cdfd -//.word 0x134be738 -//.word 0x0da44b04 -//.word 0xfc157932 -//.word 0x867f6244 -//.word 0x3122d517 -//.word 0x74613ac5 -//.word 0x14c582c9 -//.word 0xae455e64 -//.word 0x8fc5af40 -//.word 0xccdc3e54 -//.word 0x90daae07 -//.word 0xb00aaf98 -//.word 0x853474bd -//.word 0xfa66668a -//.word 0xe4f41a95 -//.word 0x92be8058 -//.word 0xa5b15ed6 -//.word 0x2291fd82 -//.word 0xc6f5235c -//.word 0x9a93405d -//.word 0xc7bdec15 -//.word 0xaa2c9193 -//.word 0x2bfd6585 -//.word 0x4bf99ca0 -//.word 0xfd19db42 -//.word 0x3749ef56 -//.word 0x486dbf79 -//.word 0x6ca27f5a -//.word 0x9ec62767 -//.word 0xad3a24a6 -//.word 0x92e64de0 -//.word 0x017e1805 -//.word 0x3e040ecc -//.word 0x328f7c9a -//.word 0xbe4a6ca5 -//.word 0x4fbfd359 -//.word 0xb3560cfb -//.word 0x2b18858c -//.word 0xc1b9b9f0 -//.word 0xdbd65e4f -//.word 0x117bdfbc -//.word 0x3ce80c14 -//.word 0xcf951129 -//.word 0x6b73a420 -//.word 0xad758318 -//.word 0x4b4f1e0d -//.word 0x5f7e90fb -//.word 0x0288d446 -//.word 0x1d853659 -//.word 0x7cde078d -//.word 0x2455954d -//.word 0xe7455b79 -//.word 0x352b7407 -//.word 0x356656f0 -//.word 0x80000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00000000 -//.word 0x00019000 -//// expected output -//.word 0x26263445 -//.word 0x024bbdbd -//.word 0x0518b331 -//.word 0xa7ab88e7 -//.word 0xbdc8d834 -//.word 0x4a3480d1 -//.word 0xc19ad0e7 -//.word 0xc7cb2244 -//.word 0x7cf88e53 -//.word 0xd2536fd2 -//.word 0x15e25c51 -//.word 0x58dbc52e -//.word 0xf56585f7 -//.word 0xab5b7713 -//.word 0x87811a9f -//.word 0x9afbdb7f diff --git a/src/integration/test_suites/smoke_test_sha_accel/caliptra_isr.h b/src/integration/test_suites/smoke_test_sha_accel/caliptra_isr.h index 0193842cc..841da2048 100644 --- a/src/integration/test_suites/smoke_test_sha_accel/caliptra_isr.h +++ b/src/integration/test_suites/smoke_test_sha_accel/caliptra_isr.h @@ -32,6 +32,34 @@ #include #include "printf.h" +/* --------------- symbols/typedefs --------------- */ +//TODO: Fix this since ISR is not currently populating these variables. +typedef struct { + uint32_t doe_error; + uint32_t doe_notif; + uint32_t ecc_error; + uint32_t ecc_notif; + uint32_t hmac_error; + uint32_t hmac_notif; + uint32_t kv_error; + uint32_t kv_notif; + uint32_t sha512_error; + uint32_t sha512_notif; + uint32_t sha256_error; + uint32_t sha256_notif; + uint32_t qspi_error; + uint32_t qspi_notif; + uint32_t uart_error; + uint32_t uart_notif; + uint32_t i3c_error; + uint32_t i3c_notif; + uint32_t soc_ifc_error; + uint32_t soc_ifc_notif; + uint32_t sha512_acc_error; + uint32_t sha512_acc_notif; +} caliptra_intr_received_s; +extern volatile caliptra_intr_received_s cptra_intr_rcv; + extern volatile uint32_t sha_intr_status; ////////////////////////////////////////////////////////////////////////////// diff --git a/src/integration/test_suites/smoke_test_sha_accel/smoke_test_sha_accel.s b/src/integration/test_suites/smoke_test_sha_accel/smoke_test_sha_accel.s index c79d4f721..fffd13cd1 100644 --- a/src/integration/test_suites/smoke_test_sha_accel/smoke_test_sha_accel.s +++ b/src/integration/test_suites/smoke_test_sha_accel/smoke_test_sha_accel.s @@ -48,12 +48,20 @@ _start: // Call interrupt init call init_interrupts - //Acquire SHA lock - li x3, CLP_SHA512_ACC_CSR_LOCK - lock_poll_loop0: - lw x5, 0(x3) - andi x5, x5, SHA512_ACC_CSR_LOCK_LOCK_MASK - bne x5, x0, lock_poll_loop0 + + //For FIPS, SHA starts of in a locked mode for uController + //Release SHA lock - although this step is NOT explicitly required if uC wants to just go ahead and use it directly + // Note that this case was also tested by commenting out the unlocking & relocking code below as a directed test case during the design + li x3, CLP_SHA512_ACC_CSR_LOCK + li x1, SHA512_ACC_CSR_LOCK_LOCK_MASK + sw x1, 0(x3) + + //Acquire SHA lock + li x3, CLP_SHA512_ACC_CSR_LOCK + lock_poll_loop0: + lw x5, 0(x3) + andi x5, x5, SHA512_ACC_CSR_LOCK_LOCK_MASK + bne x5, x0, lock_poll_loop0 //Set to Streaming SHA512 Mode li x3, CLP_SHA512_ACC_CSR_MODE @@ -402,6 +410,8 @@ verbosity_g: .word 2 // FW polls this variable instead of the SHA reg.... .global sha_intr_status sha_intr_status: .word 0 +.global cptra_intr_rcv +cptra_intr_rcv: .word 0 print_data: .ascii "----------------------------------------\n" .ascii "Running SHA Accelerator Smoke Test !!\n" diff --git a/src/integration/test_suites/smoke_test_sram_ecc/caliptra_isr.h b/src/integration/test_suites/smoke_test_sram_ecc/caliptra_isr.h index 1e2d2ac27..8f5779e04 100644 --- a/src/integration/test_suites/smoke_test_sram_ecc/caliptra_isr.h +++ b/src/integration/test_suites/smoke_test_sram_ecc/caliptra_isr.h @@ -26,12 +26,39 @@ #ifndef CALIPTRA_ISR_H #define CALIPTRA_ISR_H -#define EN_ISR_PRINTS 0 +#define EN_ISR_PRINTS 1 -#include "caliptra_reg.h" +#include "caliptra_defines.h" #include #include "printf.h" +/* --------------- symbols/typedefs --------------- */ +typedef struct { + uint32_t doe_error; + uint32_t doe_notif; + uint32_t ecc_error; + uint32_t ecc_notif; + uint32_t hmac_error; + uint32_t hmac_notif; + uint32_t kv_error; + uint32_t kv_notif; + uint32_t sha512_error; + uint32_t sha512_notif; + uint32_t sha256_error; + uint32_t sha256_notif; + uint32_t qspi_error; + uint32_t qspi_notif; + uint32_t uart_error; + uint32_t uart_notif; + uint32_t i3c_error; + uint32_t i3c_notif; + uint32_t soc_ifc_error; + uint32_t soc_ifc_notif; + uint32_t sha512_acc_error; + uint32_t sha512_acc_notif; +} caliptra_intr_received_s; +extern volatile caliptra_intr_received_s cptra_intr_rcv; + ////////////////////////////////////////////////////////////////////////////// // Function Declarations // @@ -42,21 +69,86 @@ void init_interrupts(void); // These inline functions are used to insert event-specific functionality into the // otherwise generic ISR that gets laid down by the parameterized macro "nonstd_veer_isr" inline void service_doe_error_intr() {return;} -inline void service_doe_notif_intr() {return;} +inline void service_doe_notif_intr() { + uint32_t * reg = (uint32_t *) (CLP_DOE_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R); + uint32_t sts = *reg; + /* Write 1 to Clear the pending interrupt */ + if (sts & DOE_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK) { + *reg = DOE_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + cptra_intr_rcv.doe_notif |= DOE_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + } + if (sts == 0) { + VPRINTF(ERROR,"bad doe_notif_intr sts:%x\n", sts); + SEND_STDOUT_CTRL(0x1); + while(1); + } +} inline void service_ecc_error_intr() {return;} -inline void service_ecc_notif_intr() {return;} +inline void service_ecc_notif_intr() { + uint32_t * reg = (uint32_t *) (CLP_ECC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R); + uint32_t sts = *reg; + /* Write 1 to Clear the pending interrupt */ + if (sts & ECC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK) { + *reg = ECC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + cptra_intr_rcv.ecc_notif |= ECC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + } + if (sts == 0) { + VPRINTF(ERROR,"bad ecc_notif_intr sts:%x\n", sts); + SEND_STDOUT_CTRL(0x1); + while(1); + } +} inline void service_hmac_error_intr() {return;} -inline void service_hmac_notif_intr() {return;} +inline void service_hmac_notif_intr() { + uint32_t * reg = (uint32_t *) (CLP_HMAC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R); + uint32_t sts = *reg; + /* Write 1 to Clear the pending interrupt */ + if (sts & HMAC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK) { + *reg = HMAC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + cptra_intr_rcv.hmac_notif |= HMAC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + } + if (sts == 0) { + VPRINTF(ERROR,"bad hmac_notif_intr sts:%x\n", sts); + SEND_STDOUT_CTRL(0x1); + while(1); + } +} inline void service_kv_error_intr() {return;} inline void service_kv_notif_intr() {return;} inline void service_sha512_error_intr() {return;} -inline void service_sha512_notif_intr() {return;} +inline void service_sha512_notif_intr() { + uint32_t * reg = (uint32_t *) (CLP_SHA512_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R); + uint32_t sts = *reg; + /* Write 1 to Clear the pending interrupt */ + if (sts & SHA512_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK) { + *reg = SHA512_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + cptra_intr_rcv.sha512_notif |= SHA512_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + } + if (sts == 0) { + VPRINTF(ERROR,"bad sha512_notif_intr sts:%x\n", sts); + SEND_STDOUT_CTRL(0x1); + while(1); + } +} inline void service_sha256_error_intr() {return;} -inline void service_sha256_notif_intr() {return;} +inline void service_sha256_notif_intr() { + uint32_t * reg = (uint32_t *) (CLP_SHA256_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R); + uint32_t sts = *reg; + /* Write 1 to Clear the pending interrupt */ + if (sts & SHA256_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK) { + *reg = SHA256_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + cptra_intr_rcv.sha256_notif |= SHA256_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + } + if (sts == 0) { + VPRINTF(ERROR,"bad sha256_notif_intr sts:%x\n", sts); + SEND_STDOUT_CTRL(0x1); + while(1); + } +} inline void service_qspi_error_intr() {return;} inline void service_qspi_notif_intr() {return;} @@ -71,25 +163,32 @@ inline void service_soc_ifc_error_intr() { /* Write 1 to Clear the pending interrupt */ if (sts & SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_INTERNAL_STS_MASK) { *reg = SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_INTERNAL_STS_MASK; + cptra_intr_rcv.soc_ifc_error |= SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_INTERNAL_STS_MASK; } if (sts & SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_INV_DEV_STS_MASK) { *reg = SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_INV_DEV_STS_MASK; + cptra_intr_rcv.soc_ifc_error |= SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_INV_DEV_STS_MASK; } if (sts & SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_CMD_FAIL_STS_MASK) { *reg = SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_CMD_FAIL_STS_MASK; + cptra_intr_rcv.soc_ifc_error |= SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_CMD_FAIL_STS_MASK; } if (sts & SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_BAD_FUSE_STS_MASK) { *reg = SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_BAD_FUSE_STS_MASK; + cptra_intr_rcv.soc_ifc_error |= SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_BAD_FUSE_STS_MASK; } if (sts & SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_ICCM_BLOCKED_STS_MASK) { *reg = SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_ICCM_BLOCKED_STS_MASK; + cptra_intr_rcv.soc_ifc_error |= SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_ICCM_BLOCKED_STS_MASK; } if (sts & SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_MBOX_ECC_UNC_STS_MASK) { *reg = SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_MBOX_ECC_UNC_STS_MASK; + cptra_intr_rcv.soc_ifc_error |= SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_MBOX_ECC_UNC_STS_MASK; } if (sts == 0) { - printf("bad soc_ifc_error_intr sts:%x\n", sts); - printf("%c", 0x1); + VPRINTF(ERROR,"bad soc_ifc_error_intr sts:%x\n", sts); + SEND_STDOUT_CTRL(0x1); + while(1); } } @@ -99,16 +198,32 @@ inline void service_soc_ifc_notif_intr () { /* Write 1 to Clear the pending interrupt */ if (sts & SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_AVAIL_STS_MASK) { *reg = SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_AVAIL_STS_MASK; + cptra_intr_rcv.soc_ifc_notif |= SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_AVAIL_STS_MASK; } if (sts & SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_MBOX_ECC_COR_STS_MASK) { *reg = SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_MBOX_ECC_COR_STS_MASK; + cptra_intr_rcv.soc_ifc_notif |= SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_MBOX_ECC_COR_STS_MASK; } if (sts & SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_DEBUG_LOCKED_STS_MASK) { *reg = SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_DEBUG_LOCKED_STS_MASK; + cptra_intr_rcv.soc_ifc_notif |= SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_DEBUG_LOCKED_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_SCAN_MODE_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_SCAN_MODE_STS_MASK; + cptra_intr_rcv.soc_ifc_notif |= SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_SCAN_MODE_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_SOC_REQ_LOCK_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_SOC_REQ_LOCK_STS_MASK; + cptra_intr_rcv.soc_ifc_notif |= SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_SOC_REQ_LOCK_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_GEN_IN_TOGGLE_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_GEN_IN_TOGGLE_STS_MASK; + cptra_intr_rcv.soc_ifc_notif |= SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_GEN_IN_TOGGLE_STS_MASK; } if (sts == 0) { - printf("bad soc_ifc_notif_intr sts:%x\n", sts); - printf("%c", 0x1); + VPRINTF(ERROR,"bad soc_ifc_notif_intr sts:%x\n", sts); + SEND_STDOUT_CTRL(0x1); + while(1); } } @@ -119,10 +234,12 @@ inline void service_sha512_acc_notif_intr() { /* Write 1 to Clear the pending interrupt */ if (sts & SHA512_ACC_CSR_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK) { *reg = SHA512_ACC_CSR_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + cptra_intr_rcv.sha512_acc_notif |= SHA512_ACC_CSR_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; } if (sts == 0) { - printf("bad sha512_acc_notif_intr sts:%x\n", sts); - printf("%c", 0x1); + VPRINTF(ERROR,"bad sha512_acc_notif_intr sts:%x\n", sts); + SEND_STDOUT_CTRL(0x1); + while(1); } } diff --git a/src/integration/test_suites/smoke_test_sram_ecc/smoke_test_sram_ecc.c b/src/integration/test_suites/smoke_test_sram_ecc/smoke_test_sram_ecc.c index 9702e2464..f9c3ceb44 100644 --- a/src/integration/test_suites/smoke_test_sram_ecc/smoke_test_sram_ecc.c +++ b/src/integration/test_suites/smoke_test_sram_ecc/smoke_test_sram_ecc.c @@ -30,6 +30,31 @@ volatile uint32_t intr_count; enum printf_verbosity verbosity_g = LOW; #endif +volatile caliptra_intr_received_s cptra_intr_rcv = { + .doe_error = 0, + .doe_notif = 0, + .ecc_error = 0, + .ecc_notif = 0, + .hmac_error = 0, + .hmac_notif = 0, + .kv_error = 0, + .kv_notif = 0, + .sha512_error = 0, + .sha512_notif = 0, + .sha256_error = 0, + .sha256_notif = 0, + .qspi_error = 0, + .qspi_notif = 0, + .uart_error = 0, + .uart_notif = 0, + .i3c_error = 0, + .i3c_notif = 0, + .soc_ifc_error = 0, + .soc_ifc_notif = 0, + .sha512_acc_error = 0, + .sha512_acc_notif = 0, +}; + enum ecc_error_mode_type { NONE, SINGLE, @@ -131,7 +156,6 @@ void main(void) { sts = test_mbox_sram_ecc(); // Enable Random ECC double-bit error injection - SEND_STDOUT_CTRL( 0xfd); SEND_STDOUT_CTRL( 0xfe); ecc_error_mode = DOUBLE; @@ -142,7 +166,7 @@ void main(void) { // TODO Test SRAM single-bit errors corrected during a mailbox protocol operation // Disable Random ECC double-bit error injection - SEND_STDOUT_CTRL( 0xfe); + SEND_STDOUT_CTRL( 0x0); ecc_error_mode = NONE; // Disable interrutps diff --git a/src/integration/test_suites/smoke_test_trng/caliptra_isr.h b/src/integration/test_suites/smoke_test_trng/caliptra_isr.h index 48879dc68..8f5779e04 100644 --- a/src/integration/test_suites/smoke_test_trng/caliptra_isr.h +++ b/src/integration/test_suites/smoke_test_trng/caliptra_isr.h @@ -32,39 +32,216 @@ #include #include "printf.h" -//extern volatile uint32_t hmac_intr_status; +/* --------------- symbols/typedefs --------------- */ +typedef struct { + uint32_t doe_error; + uint32_t doe_notif; + uint32_t ecc_error; + uint32_t ecc_notif; + uint32_t hmac_error; + uint32_t hmac_notif; + uint32_t kv_error; + uint32_t kv_notif; + uint32_t sha512_error; + uint32_t sha512_notif; + uint32_t sha256_error; + uint32_t sha256_notif; + uint32_t qspi_error; + uint32_t qspi_notif; + uint32_t uart_error; + uint32_t uart_notif; + uint32_t i3c_error; + uint32_t i3c_notif; + uint32_t soc_ifc_error; + uint32_t soc_ifc_notif; + uint32_t sha512_acc_error; + uint32_t sha512_acc_notif; +} caliptra_intr_received_s; +extern volatile caliptra_intr_received_s cptra_intr_rcv; ////////////////////////////////////////////////////////////////////////////// // Function Declarations // + // Performs all the CSR setup to configure and enable vectored external interrupts void init_interrupts(void); // These inline functions are used to insert event-specific functionality into the // otherwise generic ISR that gets laid down by the parameterized macro "nonstd_veer_isr" -inline void service_doe_error_intr() {printf("ERROR");} -inline void service_doe_notif_intr() {printf("ERROR");} -inline void service_ecc_error_intr () {printf("ERROR");} -inline void service_ecc_notif_intr () {printf("ERROR");} -inline void service_hmac_error_intr () {printf("ERROR");} -inline void service_hmac_notif_intr () {printf("ERROR");} - -inline void service_kv_error_intr () {printf("ERROR");} -inline void service_kv_notif_intr () {printf("ERROR");} -inline void service_sha512_error_intr() {printf("ERROR");} -inline void service_sha512_notif_intr() {printf("ERROR");} -inline void service_sha256_error_intr() {printf("ERROR");} -inline void service_sha256_notif_intr() {printf("ERROR");} -inline void service_qspi_error_intr () {printf("ERROR");} -inline void service_qspi_notif_intr () {printf("ERROR");} -inline void service_uart_error_intr () {printf("ERROR");} -inline void service_uart_notif_intr () {printf("ERROR");} -inline void service_i3c_error_intr () {printf("ERROR");} -inline void service_i3c_notif_intr () {printf("ERROR");} -inline void service_soc_ifc_error_intr () {printf("ERROR");} -inline void service_soc_ifc_notif_intr () {printf("ERROR");} -inline void service_sha512_acc_error_intr() {printf("ERROR");} -inline void service_sha512_acc_notif_intr() {printf("ERROR");} +inline void service_doe_error_intr() {return;} +inline void service_doe_notif_intr() { + uint32_t * reg = (uint32_t *) (CLP_DOE_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R); + uint32_t sts = *reg; + /* Write 1 to Clear the pending interrupt */ + if (sts & DOE_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK) { + *reg = DOE_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + cptra_intr_rcv.doe_notif |= DOE_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + } + if (sts == 0) { + VPRINTF(ERROR,"bad doe_notif_intr sts:%x\n", sts); + SEND_STDOUT_CTRL(0x1); + while(1); + } +} + +inline void service_ecc_error_intr() {return;} +inline void service_ecc_notif_intr() { + uint32_t * reg = (uint32_t *) (CLP_ECC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R); + uint32_t sts = *reg; + /* Write 1 to Clear the pending interrupt */ + if (sts & ECC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK) { + *reg = ECC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + cptra_intr_rcv.ecc_notif |= ECC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + } + if (sts == 0) { + VPRINTF(ERROR,"bad ecc_notif_intr sts:%x\n", sts); + SEND_STDOUT_CTRL(0x1); + while(1); + } +} + +inline void service_hmac_error_intr() {return;} +inline void service_hmac_notif_intr() { + uint32_t * reg = (uint32_t *) (CLP_HMAC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R); + uint32_t sts = *reg; + /* Write 1 to Clear the pending interrupt */ + if (sts & HMAC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK) { + *reg = HMAC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + cptra_intr_rcv.hmac_notif |= HMAC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + } + if (sts == 0) { + VPRINTF(ERROR,"bad hmac_notif_intr sts:%x\n", sts); + SEND_STDOUT_CTRL(0x1); + while(1); + } +} + +inline void service_kv_error_intr() {return;} +inline void service_kv_notif_intr() {return;} +inline void service_sha512_error_intr() {return;} +inline void service_sha512_notif_intr() { + uint32_t * reg = (uint32_t *) (CLP_SHA512_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R); + uint32_t sts = *reg; + /* Write 1 to Clear the pending interrupt */ + if (sts & SHA512_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK) { + *reg = SHA512_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + cptra_intr_rcv.sha512_notif |= SHA512_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + } + if (sts == 0) { + VPRINTF(ERROR,"bad sha512_notif_intr sts:%x\n", sts); + SEND_STDOUT_CTRL(0x1); + while(1); + } +} + +inline void service_sha256_error_intr() {return;} +inline void service_sha256_notif_intr() { + uint32_t * reg = (uint32_t *) (CLP_SHA256_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R); + uint32_t sts = *reg; + /* Write 1 to Clear the pending interrupt */ + if (sts & SHA256_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK) { + *reg = SHA256_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + cptra_intr_rcv.sha256_notif |= SHA256_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + } + if (sts == 0) { + VPRINTF(ERROR,"bad sha256_notif_intr sts:%x\n", sts); + SEND_STDOUT_CTRL(0x1); + while(1); + } +} + +inline void service_qspi_error_intr() {return;} +inline void service_qspi_notif_intr() {return;} +inline void service_uart_error_intr() {return;} +inline void service_uart_notif_intr() {return;} +inline void service_i3c_error_intr() {return;} +inline void service_i3c_notif_intr() {return;} + +inline void service_soc_ifc_error_intr() { + uint32_t * reg = (uint32_t *) (CLP_SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R); + uint32_t sts = *reg; + /* Write 1 to Clear the pending interrupt */ + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_INTERNAL_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_INTERNAL_STS_MASK; + cptra_intr_rcv.soc_ifc_error |= SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_INTERNAL_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_INV_DEV_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_INV_DEV_STS_MASK; + cptra_intr_rcv.soc_ifc_error |= SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_INV_DEV_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_CMD_FAIL_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_CMD_FAIL_STS_MASK; + cptra_intr_rcv.soc_ifc_error |= SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_CMD_FAIL_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_BAD_FUSE_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_BAD_FUSE_STS_MASK; + cptra_intr_rcv.soc_ifc_error |= SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_BAD_FUSE_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_ICCM_BLOCKED_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_ICCM_BLOCKED_STS_MASK; + cptra_intr_rcv.soc_ifc_error |= SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_ICCM_BLOCKED_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_MBOX_ECC_UNC_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_MBOX_ECC_UNC_STS_MASK; + cptra_intr_rcv.soc_ifc_error |= SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_MBOX_ECC_UNC_STS_MASK; + } + if (sts == 0) { + VPRINTF(ERROR,"bad soc_ifc_error_intr sts:%x\n", sts); + SEND_STDOUT_CTRL(0x1); + while(1); + } +} + +inline void service_soc_ifc_notif_intr () { + uint32_t * reg = (uint32_t *) (CLP_SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R); + uint32_t sts = *reg; + /* Write 1 to Clear the pending interrupt */ + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_AVAIL_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_AVAIL_STS_MASK; + cptra_intr_rcv.soc_ifc_notif |= SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_AVAIL_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_MBOX_ECC_COR_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_MBOX_ECC_COR_STS_MASK; + cptra_intr_rcv.soc_ifc_notif |= SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_MBOX_ECC_COR_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_DEBUG_LOCKED_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_DEBUG_LOCKED_STS_MASK; + cptra_intr_rcv.soc_ifc_notif |= SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_DEBUG_LOCKED_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_SCAN_MODE_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_SCAN_MODE_STS_MASK; + cptra_intr_rcv.soc_ifc_notif |= SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_SCAN_MODE_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_SOC_REQ_LOCK_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_SOC_REQ_LOCK_STS_MASK; + cptra_intr_rcv.soc_ifc_notif |= SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_SOC_REQ_LOCK_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_GEN_IN_TOGGLE_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_GEN_IN_TOGGLE_STS_MASK; + cptra_intr_rcv.soc_ifc_notif |= SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_GEN_IN_TOGGLE_STS_MASK; + } + if (sts == 0) { + VPRINTF(ERROR,"bad soc_ifc_notif_intr sts:%x\n", sts); + SEND_STDOUT_CTRL(0x1); + while(1); + } +} + +inline void service_sha512_acc_error_intr() {return;} +inline void service_sha512_acc_notif_intr() { + uint32_t * reg = (uint32_t *) (CLP_SHA512_ACC_CSR_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R); + uint32_t sts = *reg; + /* Write 1 to Clear the pending interrupt */ + if (sts & SHA512_ACC_CSR_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK) { + *reg = SHA512_ACC_CSR_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + cptra_intr_rcv.sha512_acc_notif |= SHA512_ACC_CSR_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + } + if (sts == 0) { + VPRINTF(ERROR,"bad sha512_acc_notif_intr sts:%x\n", sts); + SEND_STDOUT_CTRL(0x1); + while(1); + } +} #endif //CALIPTRA_ISR_H diff --git a/src/integration/test_suites/smoke_test_trng/smoke_test_trng.c b/src/integration/test_suites/smoke_test_trng/smoke_test_trng.c index 97c43b9a2..e0e34369f 100644 --- a/src/integration/test_suites/smoke_test_trng/smoke_test_trng.c +++ b/src/integration/test_suites/smoke_test_trng/smoke_test_trng.c @@ -31,6 +31,31 @@ enum printf_verbosity verbosity_g = CPT_VERBOSITY; enum printf_verbosity verbosity_g = LOW; #endif +volatile caliptra_intr_received_s cptra_intr_rcv = { + .doe_error = 0, + .doe_notif = 0, + .ecc_error = 0, + .ecc_notif = 0, + .hmac_error = 0, + .hmac_notif = 0, + .kv_error = 0, + .kv_notif = 0, + .sha512_error = 0, + .sha512_notif = 0, + .sha256_error = 0, + .sha256_notif = 0, + .qspi_error = 0, + .qspi_notif = 0, + .uart_error = 0, + .uart_notif = 0, + .i3c_error = 0, + .i3c_notif = 0, + .soc_ifc_error = 0, + .soc_ifc_notif = 0, + .sha512_acc_error = 0, + .sha512_acc_notif = 0, +}; + // read data and compare against expected value. If there is no error, return 0 int read_and_compare(uint32_t addr, uint32_t exp_data) { uint32_t act_data; diff --git a/src/integration/test_suites/smoke_test_uart/caliptra_isr.h b/src/integration/test_suites/smoke_test_uart/caliptra_isr.h index 23b511c4b..fca82fef0 100644 --- a/src/integration/test_suites/smoke_test_uart/caliptra_isr.h +++ b/src/integration/test_suites/smoke_test_uart/caliptra_isr.h @@ -32,39 +32,212 @@ #include #include "printf.h" -//extern volatile uint32_t hmac_intr_status; +/* --------------- symbols/typedefs --------------- */ +typedef struct { + uint32_t doe_error; + uint32_t doe_notif; + uint32_t ecc_error; + uint32_t ecc_notif; + uint32_t hmac_error; + uint32_t hmac_notif; + uint32_t kv_error; + uint32_t kv_notif; + uint32_t sha512_error; + uint32_t sha512_notif; + uint32_t sha256_error; + uint32_t sha256_notif; + uint32_t qspi_error; + uint32_t qspi_notif; + uint32_t uart_error; + uint32_t uart_notif; + uint32_t i3c_error; + uint32_t i3c_notif; + uint32_t soc_ifc_error; + uint32_t soc_ifc_notif; + uint32_t sha512_acc_error; + uint32_t sha512_acc_notif; +} caliptra_intr_received_s; +extern volatile caliptra_intr_received_s cptra_intr_rcv; ////////////////////////////////////////////////////////////////////////////// // Function Declarations // + // Performs all the CSR setup to configure and enable vectored external interrupts void init_interrupts(void); // These inline functions are used to insert event-specific functionality into the -// otherwise generic ISR that gets laid down by the parameterized macro "nonstd_swerv_isr" -inline void service_doe_error_intr() {printf("ERROR");} -inline void service_doe_notif_intr() {printf("ERROR");} -inline void service_ecc_error_intr () {printf("ERROR");} -inline void service_ecc_notif_intr () {printf("ERROR");} -inline void service_hmac_error_intr () {printf("ERROR");} -inline void service_hmac_notif_intr () {printf("ERROR");} - -inline void service_kv_error_intr () {printf("ERROR");} -inline void service_kv_notif_intr () {printf("ERROR");} -inline void service_sha512_error_intr() {printf("ERROR");} -inline void service_sha512_notif_intr() {printf("ERROR");} -inline void service_sha256_error_intr() {printf("ERROR");} -inline void service_sha256_notif_intr() {printf("ERROR");} -inline void service_qspi_error_intr () {printf("ERROR");} -inline void service_qspi_notif_intr () {printf("ERROR");} -inline void service_uart_error_intr () {printf("ERROR");} -inline void service_uart_notif_intr () {printf("ERROR");} -inline void service_i3c_error_intr () {printf("ERROR");} -inline void service_i3c_notif_intr () {printf("ERROR");} -inline void service_soc_ifc_error_intr () {printf("ERROR");} -inline void service_soc_ifc_notif_intr () {printf("ERROR");} -inline void service_sha512_acc_error_intr() {printf("ERROR");} -inline void service_sha512_acc_notif_intr() {printf("ERROR");} +// otherwise generic ISR that gets laid down by the parameterized macro "nonstd_veer_isr" +inline void service_doe_error_intr() {return;} +inline void service_doe_notif_intr() { + uint32_t * reg = (uint32_t *) (CLP_DOE_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R); + uint32_t sts = *reg; + /* Write 1 to Clear the pending interrupt */ + if (sts & DOE_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK) { + *reg = DOE_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + cptra_intr_rcv.doe_notif |= DOE_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + } + if (sts == 0) { + VPRINTF(ERROR,"bad doe_notif_intr sts:%x\n", sts); + SEND_STDOUT_CTRL(0x1); + while(1); + } +} + +inline void service_ecc_error_intr() {return;} +inline void service_ecc_notif_intr() { + uint32_t * reg = (uint32_t *) (CLP_ECC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R); + uint32_t sts = *reg; + /* Write 1 to Clear the pending interrupt */ + if (sts & ECC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK) { + *reg = ECC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + cptra_intr_rcv.ecc_notif |= ECC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + } + if (sts == 0) { + VPRINTF(ERROR,"bad ecc_notif_intr sts:%x\n", sts); + SEND_STDOUT_CTRL(0x1); + while(1); + } +} + +inline void service_hmac_error_intr() {return;} +inline void service_hmac_notif_intr() { + uint32_t * reg = (uint32_t *) (CLP_HMAC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R); + uint32_t sts = *reg; + /* Write 1 to Clear the pending interrupt */ + if (sts & HMAC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK) { + *reg = HMAC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + cptra_intr_rcv.hmac_notif |= HMAC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + } + if (sts == 0) { + VPRINTF(ERROR,"bad hmac_notif_intr sts:%x\n", sts); + SEND_STDOUT_CTRL(0x1); + while(1); + } +} + +inline void service_kv_error_intr() {return;} +inline void service_kv_notif_intr() {return;} +inline void service_sha512_error_intr() {return;} +inline void service_sha512_notif_intr() { + uint32_t * reg = (uint32_t *) (CLP_SHA512_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R); + uint32_t sts = *reg; + /* Write 1 to Clear the pending interrupt */ + if (sts & SHA512_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK) { + *reg = SHA512_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + cptra_intr_rcv.sha512_notif |= SHA512_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + } + if (sts == 0) { + VPRINTF(ERROR,"bad sha512_notif_intr sts:%x\n", sts); + SEND_STDOUT_CTRL(0x1); + while(1); + } +} + +inline void service_sha256_error_intr() {return;} +inline void service_sha256_notif_intr() { + uint32_t * reg = (uint32_t *) (CLP_SHA256_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R); + uint32_t sts = *reg; + /* Write 1 to Clear the pending interrupt */ + if (sts & SHA256_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK) { + *reg = SHA256_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + cptra_intr_rcv.sha256_notif |= SHA256_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + } + if (sts == 0) { + VPRINTF(ERROR,"bad sha256_notif_intr sts:%x\n", sts); + SEND_STDOUT_CTRL(0x1); + while(1); + } +} + +inline void service_qspi_error_intr() {return;} +inline void service_qspi_notif_intr() {return;} +inline void service_uart_error_intr() {return;} +inline void service_uart_notif_intr() {return;} +inline void service_i3c_error_intr() {return;} +inline void service_i3c_notif_intr() {return;} + +inline void service_soc_ifc_error_intr() { + uint32_t * reg = (uint32_t *) (CLP_SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R); + uint32_t sts = *reg; + /* Write 1 to Clear the pending interrupt */ + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_INTERNAL_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_INTERNAL_STS_MASK; + cptra_intr_rcv.soc_ifc_error |= SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_INTERNAL_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_INV_DEV_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_INV_DEV_STS_MASK; + cptra_intr_rcv.soc_ifc_error |= SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_INV_DEV_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_CMD_FAIL_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_CMD_FAIL_STS_MASK; + cptra_intr_rcv.soc_ifc_error |= SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_CMD_FAIL_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_BAD_FUSE_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_BAD_FUSE_STS_MASK; + cptra_intr_rcv.soc_ifc_error |= SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_BAD_FUSE_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_ICCM_BLOCKED_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_ICCM_BLOCKED_STS_MASK; + cptra_intr_rcv.soc_ifc_error |= SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_ICCM_BLOCKED_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_MBOX_ECC_UNC_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_MBOX_ECC_UNC_STS_MASK; + cptra_intr_rcv.soc_ifc_error |= SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_MBOX_ECC_UNC_STS_MASK; + } + if (sts == 0) { + VPRINTF(ERROR,"bad soc_ifc_error_intr sts:%x\n", sts); + SEND_STDOUT_CTRL(0x1); + while(1); + } +} + +inline void service_soc_ifc_notif_intr () { + uint32_t * reg = (uint32_t *) (CLP_SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R); + uint32_t sts = *reg; + /* Write 1 to Clear the pending interrupt */ + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_AVAIL_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_AVAIL_STS_MASK; + cptra_intr_rcv.soc_ifc_notif |= SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_AVAIL_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_MBOX_ECC_COR_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_MBOX_ECC_COR_STS_MASK; + cptra_intr_rcv.soc_ifc_notif |= SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_MBOX_ECC_COR_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_DEBUG_LOCKED_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_DEBUG_LOCKED_STS_MASK; + cptra_intr_rcv.soc_ifc_notif |= SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_DEBUG_LOCKED_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_SOC_REQ_LOCK_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_SOC_REQ_LOCK_STS_MASK; + cptra_intr_rcv.soc_ifc_notif |= SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_SOC_REQ_LOCK_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_GEN_IN_TOGGLE_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_GEN_IN_TOGGLE_STS_MASK; + cptra_intr_rcv.soc_ifc_notif |= SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_GEN_IN_TOGGLE_STS_MASK; + } + if (sts == 0) { + VPRINTF(ERROR,"bad soc_ifc_notif_intr sts:%x\n", sts); + SEND_STDOUT_CTRL(0x1); + while(1); + } +} + +inline void service_sha512_acc_error_intr() {return;} +inline void service_sha512_acc_notif_intr() { + uint32_t * reg = (uint32_t *) (CLP_SHA512_ACC_CSR_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R); + uint32_t sts = *reg; + /* Write 1 to Clear the pending interrupt */ + if (sts & SHA512_ACC_CSR_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK) { + *reg = SHA512_ACC_CSR_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + cptra_intr_rcv.sha512_acc_notif |= SHA512_ACC_CSR_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + } + if (sts == 0) { + VPRINTF(ERROR,"bad sha512_acc_notif_intr sts:%x\n", sts); + SEND_STDOUT_CTRL(0x1); + while(1); + } +} #endif //CALIPTRA_ISR_H diff --git a/src/integration/test_suites/smoke_test_uart/smoke_test_uart.c b/src/integration/test_suites/smoke_test_uart/smoke_test_uart.c index b5c97eb38..c0918a194 100644 --- a/src/integration/test_suites/smoke_test_uart/smoke_test_uart.c +++ b/src/integration/test_suites/smoke_test_uart/smoke_test_uart.c @@ -31,6 +31,31 @@ enum printf_verbosity verbosity_g = CPT_VERBOSITY; enum printf_verbosity verbosity_g = LOW; #endif +volatile caliptra_intr_received_s cptra_intr_rcv = { + .doe_error = 0, + .doe_notif = 0, + .ecc_error = 0, + .ecc_notif = 0, + .hmac_error = 0, + .hmac_notif = 0, + .kv_error = 0, + .kv_notif = 0, + .sha512_error = 0, + .sha512_notif = 0, + .sha256_error = 0, + .sha256_notif = 0, + .qspi_error = 0, + .qspi_notif = 0, + .uart_error = 0, + .uart_notif = 0, + .i3c_error = 0, + .i3c_notif = 0, + .soc_ifc_error = 0, + .soc_ifc_notif = 0, + .sha512_acc_error = 0, + .sha512_acc_notif = 0, +}; + void end_sim_if_uart_disabled() { uint32_t hw_cfg; hw_cfg = lsu_read_32(CLP_SOC_IFC_REG_CPTRA_HW_CONFIG); diff --git a/src/integration/test_suites/smoke_test_veer/caliptra_isr.h b/src/integration/test_suites/smoke_test_veer/caliptra_isr.h new file mode 100644 index 000000000..8f5779e04 --- /dev/null +++ b/src/integration/test_suites/smoke_test_veer/caliptra_isr.h @@ -0,0 +1,247 @@ +// SPDX-License-Identifier: Apache-2.0 +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// --------------------------------------------------------------------- +// File: caliptra_isr.h +// Description: +// Provides function declarations for use by external test files, so +// that the ISR functionality may behave like a library. +// TODO: +// This header file includes inline function definitions for event and +// test specific interrupt service behavior, so it should be copied and +// modified for each test. +// --------------------------------------------------------------------- + +#ifndef CALIPTRA_ISR_H + #define CALIPTRA_ISR_H + +#define EN_ISR_PRINTS 1 + +#include "caliptra_defines.h" +#include +#include "printf.h" + +/* --------------- symbols/typedefs --------------- */ +typedef struct { + uint32_t doe_error; + uint32_t doe_notif; + uint32_t ecc_error; + uint32_t ecc_notif; + uint32_t hmac_error; + uint32_t hmac_notif; + uint32_t kv_error; + uint32_t kv_notif; + uint32_t sha512_error; + uint32_t sha512_notif; + uint32_t sha256_error; + uint32_t sha256_notif; + uint32_t qspi_error; + uint32_t qspi_notif; + uint32_t uart_error; + uint32_t uart_notif; + uint32_t i3c_error; + uint32_t i3c_notif; + uint32_t soc_ifc_error; + uint32_t soc_ifc_notif; + uint32_t sha512_acc_error; + uint32_t sha512_acc_notif; +} caliptra_intr_received_s; +extern volatile caliptra_intr_received_s cptra_intr_rcv; + +////////////////////////////////////////////////////////////////////////////// +// Function Declarations +// + +// Performs all the CSR setup to configure and enable vectored external interrupts +void init_interrupts(void); + +// These inline functions are used to insert event-specific functionality into the +// otherwise generic ISR that gets laid down by the parameterized macro "nonstd_veer_isr" +inline void service_doe_error_intr() {return;} +inline void service_doe_notif_intr() { + uint32_t * reg = (uint32_t *) (CLP_DOE_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R); + uint32_t sts = *reg; + /* Write 1 to Clear the pending interrupt */ + if (sts & DOE_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK) { + *reg = DOE_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + cptra_intr_rcv.doe_notif |= DOE_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + } + if (sts == 0) { + VPRINTF(ERROR,"bad doe_notif_intr sts:%x\n", sts); + SEND_STDOUT_CTRL(0x1); + while(1); + } +} + +inline void service_ecc_error_intr() {return;} +inline void service_ecc_notif_intr() { + uint32_t * reg = (uint32_t *) (CLP_ECC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R); + uint32_t sts = *reg; + /* Write 1 to Clear the pending interrupt */ + if (sts & ECC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK) { + *reg = ECC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + cptra_intr_rcv.ecc_notif |= ECC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + } + if (sts == 0) { + VPRINTF(ERROR,"bad ecc_notif_intr sts:%x\n", sts); + SEND_STDOUT_CTRL(0x1); + while(1); + } +} + +inline void service_hmac_error_intr() {return;} +inline void service_hmac_notif_intr() { + uint32_t * reg = (uint32_t *) (CLP_HMAC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R); + uint32_t sts = *reg; + /* Write 1 to Clear the pending interrupt */ + if (sts & HMAC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK) { + *reg = HMAC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + cptra_intr_rcv.hmac_notif |= HMAC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + } + if (sts == 0) { + VPRINTF(ERROR,"bad hmac_notif_intr sts:%x\n", sts); + SEND_STDOUT_CTRL(0x1); + while(1); + } +} + +inline void service_kv_error_intr() {return;} +inline void service_kv_notif_intr() {return;} +inline void service_sha512_error_intr() {return;} +inline void service_sha512_notif_intr() { + uint32_t * reg = (uint32_t *) (CLP_SHA512_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R); + uint32_t sts = *reg; + /* Write 1 to Clear the pending interrupt */ + if (sts & SHA512_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK) { + *reg = SHA512_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + cptra_intr_rcv.sha512_notif |= SHA512_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + } + if (sts == 0) { + VPRINTF(ERROR,"bad sha512_notif_intr sts:%x\n", sts); + SEND_STDOUT_CTRL(0x1); + while(1); + } +} + +inline void service_sha256_error_intr() {return;} +inline void service_sha256_notif_intr() { + uint32_t * reg = (uint32_t *) (CLP_SHA256_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R); + uint32_t sts = *reg; + /* Write 1 to Clear the pending interrupt */ + if (sts & SHA256_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK) { + *reg = SHA256_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + cptra_intr_rcv.sha256_notif |= SHA256_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + } + if (sts == 0) { + VPRINTF(ERROR,"bad sha256_notif_intr sts:%x\n", sts); + SEND_STDOUT_CTRL(0x1); + while(1); + } +} + +inline void service_qspi_error_intr() {return;} +inline void service_qspi_notif_intr() {return;} +inline void service_uart_error_intr() {return;} +inline void service_uart_notif_intr() {return;} +inline void service_i3c_error_intr() {return;} +inline void service_i3c_notif_intr() {return;} + +inline void service_soc_ifc_error_intr() { + uint32_t * reg = (uint32_t *) (CLP_SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R); + uint32_t sts = *reg; + /* Write 1 to Clear the pending interrupt */ + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_INTERNAL_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_INTERNAL_STS_MASK; + cptra_intr_rcv.soc_ifc_error |= SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_INTERNAL_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_INV_DEV_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_INV_DEV_STS_MASK; + cptra_intr_rcv.soc_ifc_error |= SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_INV_DEV_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_CMD_FAIL_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_CMD_FAIL_STS_MASK; + cptra_intr_rcv.soc_ifc_error |= SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_CMD_FAIL_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_BAD_FUSE_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_BAD_FUSE_STS_MASK; + cptra_intr_rcv.soc_ifc_error |= SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_BAD_FUSE_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_ICCM_BLOCKED_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_ICCM_BLOCKED_STS_MASK; + cptra_intr_rcv.soc_ifc_error |= SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_ICCM_BLOCKED_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_MBOX_ECC_UNC_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_MBOX_ECC_UNC_STS_MASK; + cptra_intr_rcv.soc_ifc_error |= SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_MBOX_ECC_UNC_STS_MASK; + } + if (sts == 0) { + VPRINTF(ERROR,"bad soc_ifc_error_intr sts:%x\n", sts); + SEND_STDOUT_CTRL(0x1); + while(1); + } +} + +inline void service_soc_ifc_notif_intr () { + uint32_t * reg = (uint32_t *) (CLP_SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R); + uint32_t sts = *reg; + /* Write 1 to Clear the pending interrupt */ + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_AVAIL_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_AVAIL_STS_MASK; + cptra_intr_rcv.soc_ifc_notif |= SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_AVAIL_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_MBOX_ECC_COR_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_MBOX_ECC_COR_STS_MASK; + cptra_intr_rcv.soc_ifc_notif |= SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_MBOX_ECC_COR_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_DEBUG_LOCKED_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_DEBUG_LOCKED_STS_MASK; + cptra_intr_rcv.soc_ifc_notif |= SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_DEBUG_LOCKED_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_SCAN_MODE_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_SCAN_MODE_STS_MASK; + cptra_intr_rcv.soc_ifc_notif |= SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_SCAN_MODE_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_SOC_REQ_LOCK_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_SOC_REQ_LOCK_STS_MASK; + cptra_intr_rcv.soc_ifc_notif |= SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_SOC_REQ_LOCK_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_GEN_IN_TOGGLE_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_GEN_IN_TOGGLE_STS_MASK; + cptra_intr_rcv.soc_ifc_notif |= SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_GEN_IN_TOGGLE_STS_MASK; + } + if (sts == 0) { + VPRINTF(ERROR,"bad soc_ifc_notif_intr sts:%x\n", sts); + SEND_STDOUT_CTRL(0x1); + while(1); + } +} + +inline void service_sha512_acc_error_intr() {return;} +inline void service_sha512_acc_notif_intr() { + uint32_t * reg = (uint32_t *) (CLP_SHA512_ACC_CSR_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R); + uint32_t sts = *reg; + /* Write 1 to Clear the pending interrupt */ + if (sts & SHA512_ACC_CSR_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK) { + *reg = SHA512_ACC_CSR_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + cptra_intr_rcv.sha512_acc_notif |= SHA512_ACC_CSR_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + } + if (sts == 0) { + VPRINTF(ERROR,"bad sha512_acc_notif_intr sts:%x\n", sts); + SEND_STDOUT_CTRL(0x1); + while(1); + } +} + + +#endif //CALIPTRA_ISR_H diff --git a/src/integration/test_suites/smoke_test_veer/smoke_test_veer.s b/src/integration/test_suites/smoke_test_veer/smoke_test_veer.s index cfa976142..13b673627 100644 --- a/src/integration/test_suites/smoke_test_veer/smoke_test_veer.s +++ b/src/integration/test_suites/smoke_test_veer/smoke_test_veer.s @@ -39,6 +39,9 @@ _start: li x1, 0xaaaaaaaa csrw 0x7c0, x1 + // Call interrupt init + call init_interrupts + // Load string from hw_data // and write to stdout address @@ -66,6 +69,11 @@ _finish: stdout: .word STDOUT .global verbosity_g verbosity_g: .word 2 +// FW polls this variable for intr +.global intr_count +intr_count: .word 0 +.global cptra_intr_rcv +cptra_intr_rcv: .word 0 hw_data: .ascii "----------------------------------\n" .ascii "Hello World from VeeR EL2 !!\n" diff --git a/src/integration/test_suites/smoke_test_wdt/caliptra_isr.h b/src/integration/test_suites/smoke_test_wdt/caliptra_isr.h index c53e94942..bb60f9fb2 100644 --- a/src/integration/test_suites/smoke_test_wdt/caliptra_isr.h +++ b/src/integration/test_suites/smoke_test_wdt/caliptra_isr.h @@ -34,6 +34,33 @@ //extern volatile uint32_t hmac_intr_status; +/* --------------- symbols/typedefs --------------- */ +typedef struct { + uint32_t doe_error; + uint32_t doe_notif; + uint32_t ecc_error; + uint32_t ecc_notif; + uint32_t hmac_error; + uint32_t hmac_notif; + uint32_t kv_error; + uint32_t kv_notif; + uint32_t sha512_error; + uint32_t sha512_notif; + uint32_t sha256_error; + uint32_t sha256_notif; + uint32_t qspi_error; + uint32_t qspi_notif; + uint32_t uart_error; + uint32_t uart_notif; + uint32_t i3c_error; + uint32_t i3c_notif; + uint32_t soc_ifc_error; + uint32_t soc_ifc_notif; + uint32_t sha512_acc_error; + uint32_t sha512_acc_notif; +} caliptra_intr_received_s; +extern volatile caliptra_intr_received_s cptra_intr_rcv; + ////////////////////////////////////////////////////////////////////////////// // Function Declarations // diff --git a/src/integration/test_suites/smoke_test_wdt/smoke_test_wdt.c b/src/integration/test_suites/smoke_test_wdt/smoke_test_wdt.c index 9e2fe497d..2dae66c8d 100644 --- a/src/integration/test_suites/smoke_test_wdt/smoke_test_wdt.c +++ b/src/integration/test_suites/smoke_test_wdt/smoke_test_wdt.c @@ -43,6 +43,31 @@ volatile uint32_t * wdt_timer2_period_1 = (uint32_t *) CLP_SOC_IFC_REG_CPTRA_WDT volatile uint32_t * hw_error_fatal = (uint32_t *) CLP_SOC_IFC_REG_CPTRA_HW_ERROR_FATAL; +volatile caliptra_intr_received_s cptra_intr_rcv = { + .doe_error = 0, + .doe_notif = 0, + .ecc_error = 0, + .ecc_notif = 0, + .hmac_error = 0, + .hmac_notif = 0, + .kv_error = 0, + .kv_notif = 0, + .sha512_error = 0, + .sha512_notif = 0, + .sha256_error = 0, + .sha256_notif = 0, + .qspi_error = 0, + .qspi_notif = 0, + .uart_error = 0, + .uart_notif = 0, + .i3c_error = 0, + .i3c_notif = 0, + .soc_ifc_error = 0, + .soc_ifc_notif = 0, + .sha512_acc_error = 0, + .sha512_acc_notif = 0, +}; + void main() { VPRINTF(LOW, "---------------------------\n"); VPRINTF(LOW, " WDT Smoke Test !!\n"); @@ -99,6 +124,11 @@ void main() { } else { //Write 1 to clear HW fatal error register - *hw_error_fatal = 0x00000001; + if ((*hw_error_fatal && SOC_IFC_REG_CPTRA_HW_ERROR_FATAL_NMI_PIN_MASK) == 1) { + *hw_error_fatal = SOC_IFC_REG_CPTRA_HW_ERROR_FATAL_NMI_PIN_MASK; + } + else { + VPRINTF(ERROR, "Did not see expected hw fatal error!"); + } } } diff --git a/src/integration/test_suites/smoke_test_zeroize_crypto/caliptra_isr.h b/src/integration/test_suites/smoke_test_zeroize_crypto/caliptra_isr.h new file mode 100644 index 000000000..8f5779e04 --- /dev/null +++ b/src/integration/test_suites/smoke_test_zeroize_crypto/caliptra_isr.h @@ -0,0 +1,247 @@ +// SPDX-License-Identifier: Apache-2.0 +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// --------------------------------------------------------------------- +// File: caliptra_isr.h +// Description: +// Provides function declarations for use by external test files, so +// that the ISR functionality may behave like a library. +// TODO: +// This header file includes inline function definitions for event and +// test specific interrupt service behavior, so it should be copied and +// modified for each test. +// --------------------------------------------------------------------- + +#ifndef CALIPTRA_ISR_H + #define CALIPTRA_ISR_H + +#define EN_ISR_PRINTS 1 + +#include "caliptra_defines.h" +#include +#include "printf.h" + +/* --------------- symbols/typedefs --------------- */ +typedef struct { + uint32_t doe_error; + uint32_t doe_notif; + uint32_t ecc_error; + uint32_t ecc_notif; + uint32_t hmac_error; + uint32_t hmac_notif; + uint32_t kv_error; + uint32_t kv_notif; + uint32_t sha512_error; + uint32_t sha512_notif; + uint32_t sha256_error; + uint32_t sha256_notif; + uint32_t qspi_error; + uint32_t qspi_notif; + uint32_t uart_error; + uint32_t uart_notif; + uint32_t i3c_error; + uint32_t i3c_notif; + uint32_t soc_ifc_error; + uint32_t soc_ifc_notif; + uint32_t sha512_acc_error; + uint32_t sha512_acc_notif; +} caliptra_intr_received_s; +extern volatile caliptra_intr_received_s cptra_intr_rcv; + +////////////////////////////////////////////////////////////////////////////// +// Function Declarations +// + +// Performs all the CSR setup to configure and enable vectored external interrupts +void init_interrupts(void); + +// These inline functions are used to insert event-specific functionality into the +// otherwise generic ISR that gets laid down by the parameterized macro "nonstd_veer_isr" +inline void service_doe_error_intr() {return;} +inline void service_doe_notif_intr() { + uint32_t * reg = (uint32_t *) (CLP_DOE_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R); + uint32_t sts = *reg; + /* Write 1 to Clear the pending interrupt */ + if (sts & DOE_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK) { + *reg = DOE_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + cptra_intr_rcv.doe_notif |= DOE_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + } + if (sts == 0) { + VPRINTF(ERROR,"bad doe_notif_intr sts:%x\n", sts); + SEND_STDOUT_CTRL(0x1); + while(1); + } +} + +inline void service_ecc_error_intr() {return;} +inline void service_ecc_notif_intr() { + uint32_t * reg = (uint32_t *) (CLP_ECC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R); + uint32_t sts = *reg; + /* Write 1 to Clear the pending interrupt */ + if (sts & ECC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK) { + *reg = ECC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + cptra_intr_rcv.ecc_notif |= ECC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + } + if (sts == 0) { + VPRINTF(ERROR,"bad ecc_notif_intr sts:%x\n", sts); + SEND_STDOUT_CTRL(0x1); + while(1); + } +} + +inline void service_hmac_error_intr() {return;} +inline void service_hmac_notif_intr() { + uint32_t * reg = (uint32_t *) (CLP_HMAC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R); + uint32_t sts = *reg; + /* Write 1 to Clear the pending interrupt */ + if (sts & HMAC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK) { + *reg = HMAC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + cptra_intr_rcv.hmac_notif |= HMAC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + } + if (sts == 0) { + VPRINTF(ERROR,"bad hmac_notif_intr sts:%x\n", sts); + SEND_STDOUT_CTRL(0x1); + while(1); + } +} + +inline void service_kv_error_intr() {return;} +inline void service_kv_notif_intr() {return;} +inline void service_sha512_error_intr() {return;} +inline void service_sha512_notif_intr() { + uint32_t * reg = (uint32_t *) (CLP_SHA512_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R); + uint32_t sts = *reg; + /* Write 1 to Clear the pending interrupt */ + if (sts & SHA512_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK) { + *reg = SHA512_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + cptra_intr_rcv.sha512_notif |= SHA512_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + } + if (sts == 0) { + VPRINTF(ERROR,"bad sha512_notif_intr sts:%x\n", sts); + SEND_STDOUT_CTRL(0x1); + while(1); + } +} + +inline void service_sha256_error_intr() {return;} +inline void service_sha256_notif_intr() { + uint32_t * reg = (uint32_t *) (CLP_SHA256_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R); + uint32_t sts = *reg; + /* Write 1 to Clear the pending interrupt */ + if (sts & SHA256_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK) { + *reg = SHA256_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + cptra_intr_rcv.sha256_notif |= SHA256_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + } + if (sts == 0) { + VPRINTF(ERROR,"bad sha256_notif_intr sts:%x\n", sts); + SEND_STDOUT_CTRL(0x1); + while(1); + } +} + +inline void service_qspi_error_intr() {return;} +inline void service_qspi_notif_intr() {return;} +inline void service_uart_error_intr() {return;} +inline void service_uart_notif_intr() {return;} +inline void service_i3c_error_intr() {return;} +inline void service_i3c_notif_intr() {return;} + +inline void service_soc_ifc_error_intr() { + uint32_t * reg = (uint32_t *) (CLP_SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R); + uint32_t sts = *reg; + /* Write 1 to Clear the pending interrupt */ + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_INTERNAL_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_INTERNAL_STS_MASK; + cptra_intr_rcv.soc_ifc_error |= SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_INTERNAL_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_INV_DEV_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_INV_DEV_STS_MASK; + cptra_intr_rcv.soc_ifc_error |= SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_INV_DEV_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_CMD_FAIL_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_CMD_FAIL_STS_MASK; + cptra_intr_rcv.soc_ifc_error |= SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_CMD_FAIL_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_BAD_FUSE_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_BAD_FUSE_STS_MASK; + cptra_intr_rcv.soc_ifc_error |= SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_BAD_FUSE_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_ICCM_BLOCKED_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_ICCM_BLOCKED_STS_MASK; + cptra_intr_rcv.soc_ifc_error |= SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_ICCM_BLOCKED_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_MBOX_ECC_UNC_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_MBOX_ECC_UNC_STS_MASK; + cptra_intr_rcv.soc_ifc_error |= SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_MBOX_ECC_UNC_STS_MASK; + } + if (sts == 0) { + VPRINTF(ERROR,"bad soc_ifc_error_intr sts:%x\n", sts); + SEND_STDOUT_CTRL(0x1); + while(1); + } +} + +inline void service_soc_ifc_notif_intr () { + uint32_t * reg = (uint32_t *) (CLP_SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R); + uint32_t sts = *reg; + /* Write 1 to Clear the pending interrupt */ + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_AVAIL_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_AVAIL_STS_MASK; + cptra_intr_rcv.soc_ifc_notif |= SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_AVAIL_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_MBOX_ECC_COR_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_MBOX_ECC_COR_STS_MASK; + cptra_intr_rcv.soc_ifc_notif |= SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_MBOX_ECC_COR_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_DEBUG_LOCKED_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_DEBUG_LOCKED_STS_MASK; + cptra_intr_rcv.soc_ifc_notif |= SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_DEBUG_LOCKED_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_SCAN_MODE_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_SCAN_MODE_STS_MASK; + cptra_intr_rcv.soc_ifc_notif |= SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_SCAN_MODE_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_SOC_REQ_LOCK_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_SOC_REQ_LOCK_STS_MASK; + cptra_intr_rcv.soc_ifc_notif |= SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_SOC_REQ_LOCK_STS_MASK; + } + if (sts & SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_GEN_IN_TOGGLE_STS_MASK) { + *reg = SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_GEN_IN_TOGGLE_STS_MASK; + cptra_intr_rcv.soc_ifc_notif |= SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_GEN_IN_TOGGLE_STS_MASK; + } + if (sts == 0) { + VPRINTF(ERROR,"bad soc_ifc_notif_intr sts:%x\n", sts); + SEND_STDOUT_CTRL(0x1); + while(1); + } +} + +inline void service_sha512_acc_error_intr() {return;} +inline void service_sha512_acc_notif_intr() { + uint32_t * reg = (uint32_t *) (CLP_SHA512_ACC_CSR_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R); + uint32_t sts = *reg; + /* Write 1 to Clear the pending interrupt */ + if (sts & SHA512_ACC_CSR_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK) { + *reg = SHA512_ACC_CSR_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + cptra_intr_rcv.sha512_acc_notif |= SHA512_ACC_CSR_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK; + } + if (sts == 0) { + VPRINTF(ERROR,"bad sha512_acc_notif_intr sts:%x\n", sts); + SEND_STDOUT_CTRL(0x1); + while(1); + } +} + + +#endif //CALIPTRA_ISR_H diff --git a/src/integration/test_suites/smoke_test_zeroize_crypto/smoke_test_zeroize_crypto.c b/src/integration/test_suites/smoke_test_zeroize_crypto/smoke_test_zeroize_crypto.c new file mode 100644 index 000000000..5d2305faf --- /dev/null +++ b/src/integration/test_suites/smoke_test_zeroize_crypto/smoke_test_zeroize_crypto.c @@ -0,0 +1,203 @@ +// SPDX-License-Identifier: Apache-2.0 +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +#include "caliptra_defines.h" +#include "caliptra_isr.h" +#include "riscv_hw_if.h" +#include "riscv-csr.h" +#include +#include +#include +#include "printf.h" +#include "hmac.h" + +volatile char* stdout = (char *)STDOUT; +volatile uint32_t intr_count = 0; + +#ifdef CPT_VERBOSITY + enum printf_verbosity verbosity_g = CPT_VERBOSITY; +#else + enum printf_verbosity verbosity_g = LOW; +#endif + +volatile caliptra_intr_received_s cptra_intr_rcv = { + .doe_error = 0, + .doe_notif = 0, + .ecc_error = 0, + .ecc_notif = 0, + .hmac_error = 0, + .hmac_notif = 0, + .kv_error = 0, + .kv_notif = 0, + .sha512_error = 0, + .sha512_notif = 0, + .sha256_error = 0, + .sha256_notif = 0, + .qspi_error = 0, + .qspi_notif = 0, + .uart_error = 0, + .uart_notif = 0, + .i3c_error = 0, + .i3c_notif = 0, + .soc_ifc_error = 0, + .soc_ifc_notif = 0, + .sha512_acc_error = 0, + .sha512_acc_notif = 0, +}; + + +/* HMAC384 test vector + KEY = 0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b + BLOCK = 4869205468657265800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000440 + LFSR_SEED = C8F518D4F3AA1BD46ED56C1C3C9E16FB800AF504 + TAG = b6a8d5636f5c6a7224f9977dcf7ee6c7fb6d0c48cbdee9737a959796489bddbc4c5df61d5b3297b4fb68dab9f1b582c2 +*/ + + + + +void main() { + printf("----------------------------------\n"); + printf(" Smoke Test With Crypto Zeroize !!\n"); + printf("----------------------------------\n"); + + //Call interrupt init + init_interrupts(); + + uint32_t block[32] = {0x48692054, + 0x68657265, + 0x80000000, + 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, + 0x00000440}; + + //this is a random lfsr_seed 160-bit + uint32_t lfsr_seed_data[5] = {0xC8F518D4, + 0xF3AA1BD4, + 0x6ED56C1C, + 0x3C9E16FB, + 0x800AF504}; + + uint32_t expected_tag[12] = {0xb6a8d563, + 0x6f5c6a72, + 0x24f9977d, + 0xcf7ee6c7, + 0xfb6d0c48, + 0xcbdee973, + 0x7a959796, + 0x489bddbc, + 0x4c5df61d, + 0x5b3297b4, + 0xfb68dab9, + 0xf1b582c2}; + + + uint8_t hmackey_kv_id = 0x2; + uint8_t tag_kv_id = 0x0; + uint8_t offset; + volatile uint32_t * reg_ptr; + uint8_t fail_cmd = 0x1; + uint32_t check_data; + + //inject hmac_key to kv key reg (in RTL) + uint8_t key_inject_cmd = 0xa0 + (hmackey_kv_id & 0x7); + printf("%c", key_inject_cmd); + + // wait for HMAC to be ready + while((lsu_read_32(CLP_HMAC_REG_HMAC384_STATUS) & HMAC_REG_HMAC384_STATUS_READY_MASK) == 0); + + + // Program KEY Read with 12 dwords from key_kv_id + lsu_write_32(CLP_HMAC_REG_HMAC384_KV_RD_KEY_CTRL, HMAC_REG_HMAC384_KV_RD_KEY_CTRL_READ_EN_MASK | + ((hmackey_kv_id << HMAC_REG_HMAC384_KV_RD_KEY_CTRL_READ_ENTRY_LOW) & HMAC_REG_HMAC384_KV_RD_KEY_CTRL_READ_ENTRY_MASK)); + + // Check that HMAC KEY is loaded + while((lsu_read_32(CLP_HMAC_REG_HMAC384_KV_RD_KEY_STATUS) & HMAC_REG_HMAC384_KV_RD_KEY_STATUS_VALID_MASK) == 0); + + + + reg_ptr = (uint32_t*) CLP_HMAC_REG_HMAC384_BLOCK_0; + offset = 0; + while (reg_ptr <= (uint32_t*) CLP_HMAC_REG_HMAC384_BLOCK_31) { + *reg_ptr++ = block[offset++]; + } + + + // Program LFSR_SEED + reg_ptr = (uint32_t*) CLP_HMAC_REG_HMAC384_LFSR_SEED_0; + offset = 0; + while (reg_ptr <= (uint32_t*) CLP_HMAC_REG_HMAC384_LFSR_SEED_4) { + *reg_ptr++ = lfsr_seed_data[offset++]; + } + + // if we want to store the results into kv + // set tag DEST to write + + lsu_write_32(CLP_HMAC_REG_HMAC384_KV_WR_CTRL, HMAC_REG_HMAC384_KV_WR_CTRL_WRITE_EN_MASK | + HMAC_REG_HMAC384_KV_WR_CTRL_HMAC_KEY_DEST_VALID_MASK | + HMAC_REG_HMAC384_KV_WR_CTRL_HMAC_BLOCK_DEST_VALID_MASK| + HMAC_REG_HMAC384_KV_WR_CTRL_SHA_BLOCK_DEST_VALID_MASK | + HMAC_REG_HMAC384_KV_WR_CTRL_ECC_PKEY_DEST_VALID_MASK | + HMAC_REG_HMAC384_KV_WR_CTRL_ECC_SEED_DEST_VALID_MASK | + ((tag_kv_id << HMAC_REG_HMAC384_KV_WR_CTRL_WRITE_ENTRY_LOW) & HMAC_REG_HMAC384_KV_WR_CTRL_WRITE_ENTRY_MASK)); + + + //inject zeroize command (in RTL) + SEND_STDOUT_CTRL(0x99); + + // Enable HMAC core + lsu_write_32(CLP_HMAC_REG_HMAC384_CTRL, HMAC_REG_HMAC384_CTRL_INIT_MASK); + + // wait for HMAC to be ready + while((lsu_read_32(CLP_HMAC_REG_HMAC384_STATUS) & HMAC_REG_HMAC384_STATUS_READY_MASK) == 0); + + // check that dest valid bits are 0 since the key generation was interrupted + check_data = lsu_read_32(CLP_KV_REG_KEY_CTRL_0); + if ((check_data & (KV_REG_KEY_CTRL_0_DEST_VALID_MASK)) != 0) { + VPRINTF(ERROR, "ERROR: Dest valid mismatch actual (0x%x) expected (0x00000000)\n", check_data); + SEND_STDOUT_CTRL(0x1); + while(1); + } else { + SEND_STDOUT_CTRL(0xff); //End the test + } + + +} diff --git a/src/integration/test_suites/smoke_test_zeroize_crypto/smoke_test_zeroize_crypto.yml b/src/integration/test_suites/smoke_test_zeroize_crypto/smoke_test_zeroize_crypto.yml new file mode 100644 index 000000000..fe168f04a --- /dev/null +++ b/src/integration/test_suites/smoke_test_zeroize_crypto/smoke_test_zeroize_crypto.yml @@ -0,0 +1,17 @@ +# SPDX-License-Identifier: Apache-2.0 +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +--- +seed: 1 +testname: smoke_test_zeroize_crypto \ No newline at end of file diff --git a/src/integration/testplan/caliptra_top.hvp b/src/integration/testplan/caliptra_top.hvp new file mode 100644 index 000000000..fb0e9f90c --- /dev/null +++ b/src/integration/testplan/caliptra_top.hvp @@ -0,0 +1,16 @@ + +plan "CAPI Coverage"; + + + feature "Design coverage"; + measure Line, Cond, FSM, Toggle, Branch, Assert CodeCov; + source = "tree: *"; + endmeasure + endfeature + feature "Functional Coverage"; + measure Group, Group.count, Group.covered_count, Group.uncovered_count FuncCov; + source = "group: *", "group instance: *"; + endmeasure + endfeature +endplan + diff --git a/src/integration/uvmf_caliptra_top/config/compile.yml b/src/integration/uvmf_caliptra_top/config/compile.yml index 40f56d2ac..a6eaa74e2 100644 --- a/src/integration/uvmf_caliptra_top/config/compile.yml +++ b/src/integration/uvmf_caliptra_top/config/compile.yml @@ -16,6 +16,11 @@ schema_version: 2.4.0 requires: - uvmf_caliptra_top_vip - caliptra_top + - sha512_coverage + - sha256_coverage + - hmac_coverage + - ecc_coverage + - soc_ifc_coverage targets: tb: directories: @@ -28,24 +33,21 @@ targets: - ${COMPILE_ROOT}/uvmf_template_output/project_benches/caliptra_top/tb/parameters/caliptra_top_parameters_pkg.sv - ${COMPILE_ROOT}/uvmf_template_output/project_benches/caliptra_top/tb/sequences/caliptra_top_sequences_pkg.sv - ${COMPILE_ROOT}/uvmf_template_output/project_benches/caliptra_top/tb/tests/caliptra_top_tests_pkg.sv - - ${COMPILE_ROOT}/../tb/caliptra_veer_sram_export.sv - ${COMPILE_ROOT}/../tb/caliptra_top_tb_pkg.sv + - ${COMPILE_ROOT}/../tb/caliptra_veer_sram_export.sv - ${COMPILE_ROOT}/../tb/caliptra_top_tb_services.sv + - ${COMPILE_ROOT}/../coverage/caliptra_top_cov_if.sv + - ${COMPILE_ROOT}/../coverage/caliptra_top_cov_bind.sv - ${COMPILE_ROOT}/uvmf_template_output/project_benches/caliptra_top/tb/testbench/hdl_top.sv - ${COMPILE_ROOT}/uvmf_template_output/project_benches/caliptra_top/tb/testbench/hvl_top.sv tops: - hdl_top - hvl_top sim: - # TODO: Eventually we will load caliptra_fmc/rt hexfiles to mailbox in the TB logic instead - # of preloading here with this rename approach pre_exec: | echo "[PRE-EXEC] Copying SHA512 Vectors to $(pwd)" cp ${COMPILE_ROOT}/../tb/vectors/SHA*.rsp . - make -f ${CALIPTRA_ROOT}/tools/scripts/Makefile TESTNAME=caliptra_top program.hex - make -f ${CALIPTRA_ROOT}/tools/scripts/Makefile TESTNAME=caliptra_fmc caliptra_fmc.hex - make -f ${CALIPTRA_ROOT}/tools/scripts/Makefile TESTNAME=caliptra_rt caliptra_rt.hex - cp caliptra_fmc.hex mailbox.hex + $TOOLS/scripts/run_test_makefile global: tool: vcs: @@ -76,3 +78,44 @@ global: - '-sv_lib libapb3_IN_SystemVerilog_VCS_full' # Report "MVC_ERROR" as "UVM_ERROR" - '+QVIP_UVM_REPORTING' +--- +provides: [uvmf_caliptra_top_itrng] +schema_version: 2.4.0 +requires: + - uvmf_caliptra_top +targets: + tb: + tops: + - hdl_top + - hvl_top + sim: + pre_exec: | + echo "[PRE-EXEC] Copying SHA512 Vectors to $(pwd)" + cp ${COMPILE_ROOT}/../tb/vectors/SHA*.rsp . + $TOOLS/scripts/run_test_makefile +global: + tool: + vcs: + default: + - '-assert svaext' + - +define+CLP_ASSERT_ON + - '-noinherit_timescale=1ns/1ps' + - '+define+CALIPTRA_INTERNAL_TRNG' + # Suppress a warning due to calling $fgets as task instead of function + # i.e. discarding the return value. This is in auto-generated code. + - '+warn=noRVOSFD' + # Suppress NOTE about repeated package imports within the same + # package (each .svh file included in the auto-generated UVM _pkg.sv + # files imports the same dependencies) + - '-suppress=SV-LCM-PPWI' + elab: + # Suppress warnings about too few port connections - auto-generated interfaces + # declare all signals as inout, but are driven at a lower layer than the + # instantiation, so they will always flag this + - '-suppress=TFIPC' + sim: + - '-sv_root $QUESTA_MVC_HOME/questa_mvc_core/linux_x86_64_gcc-6.2.0_vcs' + - '-sv_lib libahb_IN_SystemVerilog_VCS_full' + - '-sv_lib libapb3_IN_SystemVerilog_VCS_full' + # Report "MVC_ERROR" as "UVM_ERROR" + - '+QVIP_UVM_REPORTING' diff --git a/src/integration/uvmf_caliptra_top/uvmf_template_output/project_benches/caliptra_top/tb/parameters/caliptra_top_parameters_pkg.sv b/src/integration/uvmf_caliptra_top/uvmf_template_output/project_benches/caliptra_top/tb/parameters/caliptra_top_parameters_pkg.sv index 5652f4e6b..514477d8f 100644 --- a/src/integration/uvmf_caliptra_top/uvmf_template_output/project_benches/caliptra_top/tb/parameters/caliptra_top_parameters_pkg.sv +++ b/src/integration/uvmf_caliptra_top/uvmf_template_output/project_benches/caliptra_top/tb/parameters/caliptra_top_parameters_pkg.sv @@ -45,6 +45,7 @@ package caliptra_top_parameters_pkg; parameter string soc_ifc_subenv_cptra_ctrl_agent_BFM = "soc_ifc_subenv_cptra_ctrl_agent_BFM"; /* [3] */ parameter string soc_ifc_subenv_soc_ifc_status_agent_BFM = "soc_ifc_subenv_soc_ifc_status_agent_BFM"; /* [4] */ parameter string soc_ifc_subenv_cptra_status_agent_BFM = "soc_ifc_subenv_cptra_status_agent_BFM"; /* [5] */ + parameter string soc_ifc_subenv_mbox_sram_agent_BFM = "soc_ifc_subenv_mbox_sram_agent_BFM"; /* [6] */ // pragma uvmf custom package_item_additional begin // pragma uvmf custom package_item_additional end diff --git a/src/integration/uvmf_caliptra_top/uvmf_template_output/project_benches/caliptra_top/tb/sequences/caliptra_top_sequences_pkg.sv b/src/integration/uvmf_caliptra_top/uvmf_template_output/project_benches/caliptra_top/tb/sequences/caliptra_top_sequences_pkg.sv index 9f12b1fc2..e890eda40 100644 --- a/src/integration/uvmf_caliptra_top/uvmf_template_output/project_benches/caliptra_top/tb/sequences/caliptra_top_sequences_pkg.sv +++ b/src/integration/uvmf_caliptra_top/uvmf_template_output/project_benches/caliptra_top/tb/sequences/caliptra_top_sequences_pkg.sv @@ -47,6 +47,8 @@ package caliptra_top_sequences_pkg; import soc_ifc_status_pkg_hdl::*; import cptra_status_pkg::*; import cptra_status_pkg_hdl::*; + import mbox_sram_pkg::*; + import mbox_sram_pkg_hdl::*; import caliptra_top_parameters_pkg::*; import caliptra_top_env_pkg::*; import qvip_ahb_lite_slave_params_pkg::*; @@ -68,9 +70,10 @@ package caliptra_top_sequences_pkg; // compiled as part of the sequence package. Be sure to place // the new sequence after any base sequences of the new sequence. `include "src/caliptra_top_rand_sequence.svh" - `include "src/caliptra_top_fw_update_sequence.svh" - `include "src/caliptra_top_reg_access_sequence.svh" `include "src/caliptra_top_cmdline_sequence.svh" + `include "src/caliptra_top_rom_sequence.svh" + `include "src/caliptra_top_wdt_sequence.svh" + `include "src/caliptra_top_wdt_independent_sequence.svh" // pragma uvmf custom package_item_additional end endpackage diff --git a/src/integration/uvmf_caliptra_top/uvmf_template_output/project_benches/caliptra_top/tb/sequences/src/caliptra_top_bench_sequence_base.svh b/src/integration/uvmf_caliptra_top/uvmf_template_output/project_benches/caliptra_top/tb/sequences/src/caliptra_top_bench_sequence_base.svh index d0303bd74..cf13af914 100644 --- a/src/integration/uvmf_caliptra_top/uvmf_template_output/project_benches/caliptra_top/tb/sequences/src/caliptra_top_bench_sequence_base.svh +++ b/src/integration/uvmf_caliptra_top/uvmf_template_output/project_benches/caliptra_top/tb/sequences/src/caliptra_top_bench_sequence_base.svh @@ -57,6 +57,8 @@ rand soc_ifc_env_sequence_base_t soc_ifc_env_seq; soc_ifc_subenv_soc_ifc_ctrl_agent_random_seq_t soc_ifc_subenv_soc_ifc_ctrl_agent_random_seq; typedef soc_ifc_status_responder_sequence soc_ifc_subenv_soc_ifc_status_agent_responder_seq_t; soc_ifc_subenv_soc_ifc_status_agent_responder_seq_t soc_ifc_subenv_soc_ifc_status_agent_responder_seq; + typedef mbox_sram_responder_sequence soc_ifc_subenv_mbox_sram_agent_responder_seq_t; + soc_ifc_subenv_mbox_sram_agent_responder_seq_t soc_ifc_subenv_mbox_sram_agent_responder_seq; // pragma uvmf custom sequences end // Sequencer handles for each active interface in the environment @@ -64,6 +66,8 @@ rand soc_ifc_env_sequence_base_t soc_ifc_env_seq; uvm_sequencer #(soc_ifc_subenv_soc_ifc_ctrl_agent_transaction_t) soc_ifc_subenv_soc_ifc_ctrl_agent_sequencer; typedef soc_ifc_status_transaction soc_ifc_subenv_soc_ifc_status_agent_transaction_t; uvm_sequencer #(soc_ifc_subenv_soc_ifc_status_agent_transaction_t) soc_ifc_subenv_soc_ifc_status_agent_sequencer; + typedef mbox_sram_transaction soc_ifc_subenv_mbox_sram_agent_transaction_t; + uvm_sequencer #(soc_ifc_subenv_mbox_sram_agent_transaction_t) soc_ifc_subenv_mbox_sram_agent_sequencer; // Sequencer handles for each QVIP interface mvc_sequencer uvm_test_top_environment_soc_ifc_subenv_qvip_ahb_lite_slave_subenv_ahb_lite_slave_0_sqr; @@ -77,6 +81,7 @@ rand soc_ifc_env_sequence_base_t soc_ifc_env_seq; cptra_ctrl_configuration soc_ifc_subenv_cptra_ctrl_agent_config; soc_ifc_status_configuration soc_ifc_subenv_soc_ifc_status_agent_config; cptra_status_configuration soc_ifc_subenv_cptra_status_agent_config; + mbox_sram_configuration soc_ifc_subenv_mbox_sram_agent_config; // pragma uvmf custom class_item_additional begin // pragma uvmf custom class_item_additional end @@ -101,10 +106,13 @@ rand soc_ifc_env_sequence_base_t soc_ifc_env_seq; `uvm_fatal("CFG" , "uvm_config_db #( soc_ifc_status_configuration )::get cannot find resource soc_ifc_subenv_soc_ifc_status_agent_BFM" ) if( !uvm_config_db #( cptra_status_configuration )::get( null , UVMF_CONFIGURATIONS , soc_ifc_subenv_cptra_status_agent_BFM , soc_ifc_subenv_cptra_status_agent_config ) ) `uvm_fatal("CFG" , "uvm_config_db #( cptra_status_configuration )::get cannot find resource soc_ifc_subenv_cptra_status_agent_BFM" ) + if( !uvm_config_db #( mbox_sram_configuration )::get( null , UVMF_CONFIGURATIONS , soc_ifc_subenv_mbox_sram_agent_BFM , soc_ifc_subenv_mbox_sram_agent_config ) ) + `uvm_fatal("CFG" , "uvm_config_db #( mbox_sram_configuration )::get cannot find resource soc_ifc_subenv_mbox_sram_agent_BFM" ) // Assign the sequencer handles from the handles within agent configurations soc_ifc_subenv_soc_ifc_ctrl_agent_sequencer = soc_ifc_subenv_soc_ifc_ctrl_agent_config.get_sequencer(); soc_ifc_subenv_soc_ifc_status_agent_sequencer = soc_ifc_subenv_soc_ifc_status_agent_config.get_sequencer(); + soc_ifc_subenv_mbox_sram_agent_sequencer = soc_ifc_subenv_mbox_sram_agent_config.get_sequencer(); // Retrieve QVIP sequencer handles from the uvm_config_db if( !uvm_config_db #(mvc_sequencer)::get( null,UVMF_SEQUENCERS,"uvm_test_top.environment.soc_ifc_subenv.qvip_apb5_slave_subenv.apb5_master_0", uvm_test_top_environment_soc_ifc_subenv_qvip_apb5_slave_subenv_apb5_master_0_sqr) ) @@ -124,17 +132,20 @@ rand soc_ifc_env_sequence_base_t soc_ifc_env_seq; caliptra_top_env_seq = caliptra_top_env_sequence_base_t::type_id::create("caliptra_top_env_seq"); - soc_ifc_subenv_soc_ifc_ctrl_agent_random_seq = soc_ifc_subenv_soc_ifc_ctrl_agent_random_seq_t::type_id::create("soc_ifc_subenv_soc_ifc_ctrl_agent_random_seq"); - soc_ifc_subenv_soc_ifc_status_agent_responder_seq = soc_ifc_subenv_soc_ifc_status_agent_responder_seq_t::type_id::create("soc_ifc_subenv_soc_ifc_status_agent_responder_seq"); + soc_ifc_subenv_soc_ifc_ctrl_agent_random_seq = soc_ifc_subenv_soc_ifc_ctrl_agent_random_seq_t::type_id::create("soc_ifc_subenv_soc_ifc_ctrl_agent_random_seq"); + soc_ifc_subenv_soc_ifc_status_agent_responder_seq = soc_ifc_subenv_soc_ifc_status_agent_responder_seq_t::type_id::create("soc_ifc_subenv_soc_ifc_status_agent_responder_seq"); + soc_ifc_subenv_mbox_sram_agent_responder_seq = soc_ifc_subenv_mbox_sram_agent_responder_seq_t::type_id::create("soc_ifc_subenv_mbox_sram_agent_responder_seq"); fork soc_ifc_subenv_soc_ifc_ctrl_agent_config.wait_for_reset(); soc_ifc_subenv_cptra_ctrl_agent_config.wait_for_reset(); soc_ifc_subenv_soc_ifc_status_agent_config.wait_for_reset(); soc_ifc_subenv_cptra_status_agent_config.wait_for_reset(); + soc_ifc_subenv_mbox_sram_agent_config.wait_for_reset(); join // Start RESPONDER sequences here fork soc_ifc_subenv_soc_ifc_status_agent_responder_seq.start(soc_ifc_subenv_soc_ifc_status_agent_sequencer); + soc_ifc_subenv_mbox_sram_agent_responder_seq.start(soc_ifc_subenv_mbox_sram_agent_sequencer); join_none // Start INITIATOR sequences here fork @@ -151,6 +162,7 @@ caliptra_top_env_seq.start(top_configuration.vsqr); soc_ifc_subenv_cptra_ctrl_agent_config.wait_for_num_clocks(400); soc_ifc_subenv_soc_ifc_status_agent_config.wait_for_num_clocks(400); soc_ifc_subenv_cptra_status_agent_config.wait_for_num_clocks(400); + soc_ifc_subenv_mbox_sram_agent_config.wait_for_num_clocks(400); join // pragma uvmf custom body end diff --git a/src/integration/uvmf_caliptra_top/uvmf_template_output/project_benches/caliptra_top/tb/sequences/src/caliptra_top_cmdline_sequence.svh b/src/integration/uvmf_caliptra_top/uvmf_template_output/project_benches/caliptra_top/tb/sequences/src/caliptra_top_cmdline_sequence.svh index 2a2d567ca..7b45d983f 100644 --- a/src/integration/uvmf_caliptra_top/uvmf_template_output/project_benches/caliptra_top/tb/sequences/src/caliptra_top_cmdline_sequence.svh +++ b/src/integration/uvmf_caliptra_top/uvmf_template_output/project_benches/caliptra_top/tb/sequences/src/caliptra_top_cmdline_sequence.svh @@ -49,21 +49,21 @@ class caliptra_top_cmdline_sequence extends caliptra_top_bench_sequence_base; bit ready_for_rt = 0; while (!ready_for_fw) begin while(!sts_rsp_count)soc_ifc_subenv_soc_ifc_ctrl_agent_config.wait_for_num_clocks(1); // Wait for new status updates - `uvm_info("CALIPTRA_TOP_RAND_TEST", "Observed status response, checking contents", UVM_DEBUG) + `uvm_info("CALIPTRA_TOP_CMDLINE_TEST", "Observed status response, checking contents", UVM_DEBUG) sts_rsp_count = 0; // We only care about the latest rsp, so even if count > 1, reset back to 0 ready_for_fw = soc_ifc_subenv_soc_ifc_status_agent_responder_seq.rsp.ready_for_fw_push; end if (!fmc_seq.randomize() with { fmc_seq.mbox_op_rand.cmd == mbox_cmd_e'(MBOX_CMD_FMC_UPDATE); }) - `uvm_fatal("CALIPTRA_TOP_RAND_TEST", "caliptra_top_rand_sequence::body() - fmc_seq randomization failed") + `uvm_fatal("CALIPTRA_TOP_CMDLINE_TEST", "caliptra_top_rand_sequence::body() - fmc_seq randomization failed") fmc_seq.start(top_configuration.soc_ifc_subenv_config.vsqr); if (!rt_seq.randomize() with { rt_seq.mbox_op_rand.cmd == mbox_cmd_e'(MBOX_CMD_RT_UPDATE); }) - `uvm_fatal("CALIPTRA_TOP_RAND_TEST", "caliptra_top_rand_sequence::body() - rt_seq randomization failed") + `uvm_fatal("CALIPTRA_TOP_CMDLINE_TEST", "caliptra_top_rand_sequence::body() - rt_seq randomization failed") rt_seq.start(top_configuration.soc_ifc_subenv_config.vsqr); // Wait for RT image to set the ready_for_rt bit while (!ready_for_rt) begin while(!sts_rsp_count)soc_ifc_subenv_soc_ifc_ctrl_agent_config.wait_for_num_clocks(1); // Wait for new status updates - `uvm_info("CALIPTRA_TOP_RAND_TEST", "Observed status response, checking contents", UVM_DEBUG) + `uvm_info("CALIPTRA_TOP_CMDLINE_TEST", "Observed status response, checking contents", UVM_DEBUG) sts_rsp_count = 0; // We only care about the latest rsp, so even if count > 1, reset back to 0 ready_for_rt = soc_ifc_subenv_soc_ifc_status_agent_responder_seq.rsp.ready_for_runtime; end @@ -85,6 +85,7 @@ class caliptra_top_cmdline_sequence extends caliptra_top_bench_sequence_base; soc_ifc_subenv_soc_ifc_ctrl_agent_random_seq = soc_ifc_subenv_soc_ifc_ctrl_agent_random_seq_t::type_id::create("soc_ifc_subenv_soc_ifc_ctrl_agent_random_seq"); soc_ifc_subenv_soc_ifc_status_agent_responder_seq = soc_ifc_subenv_soc_ifc_status_agent_responder_seq_t::type_id::create("soc_ifc_subenv_soc_ifc_status_agent_responder_seq"); + soc_ifc_subenv_mbox_sram_agent_responder_seq = soc_ifc_subenv_mbox_sram_agent_responder_seq_t::type_id::create("soc_ifc_subenv_mbox_sram_agent_responder_seq"); // Handle to the responder sequence for getting response transactions soc_ifc_env_bringup_seq.soc_ifc_status_agent_rsp_seq = soc_ifc_subenv_soc_ifc_status_agent_responder_seq; @@ -95,6 +96,7 @@ class caliptra_top_cmdline_sequence extends caliptra_top_bench_sequence_base; // Start RESPONDER sequences here fork soc_ifc_subenv_soc_ifc_status_agent_responder_seq.start(soc_ifc_subenv_soc_ifc_status_agent_sequencer); + soc_ifc_subenv_mbox_sram_agent_responder_seq.start(soc_ifc_subenv_mbox_sram_agent_sequencer); join_none fork @@ -103,7 +105,7 @@ class caliptra_top_cmdline_sequence extends caliptra_top_bench_sequence_base; // Start INITIATOR sequences here if(!soc_ifc_env_bringup_seq.randomize()) - `uvm_fatal("CALIPTRA_TOP_RAND_TEST", "caliptra_top_rand_sequence::body() - soc_ifc_env_bringup_seq randomization failed") + `uvm_fatal("CALIPTRA_TOP_CMDLINE_TEST", "caliptra_top_rand_sequence::body() - soc_ifc_env_bringup_seq randomization failed") soc_ifc_env_bringup_seq.start(top_configuration.soc_ifc_subenv_config.vsqr); `uvm_info("CALIPTRA_TOP_BRINGUP", "SoC completed poweron and observed reset deassertion to system", UVM_LOW) @@ -113,7 +115,7 @@ class caliptra_top_cmdline_sequence extends caliptra_top_bench_sequence_base; // Run cmdline provided env sequences clp = uvm_cmdline_processor::get_inst(); if (!clp.get_arg_values("+CLP_SEQ=", seq_names)) - `uvm_fatal("SOC_IFC_CMDLINE_TEST", "No cmdline sequence name arguments provided to cmdline test!") + `uvm_fatal("CALIPTRA_TOP_CMDLINE_TEST", "No cmdline sequence name arguments provided to cmdline test!") else soc_ifc_env_seq_ii = new[seq_names.size()]; @@ -151,6 +153,7 @@ class caliptra_top_cmdline_sequence extends caliptra_top_bench_sequence_base; soc_ifc_subenv_cptra_ctrl_agent_config.wait_for_num_clocks(400); soc_ifc_subenv_soc_ifc_status_agent_config.wait_for_num_clocks(400); soc_ifc_subenv_cptra_status_agent_config.wait_for_num_clocks(400); + soc_ifc_subenv_mbox_sram_agent_config.wait_for_num_clocks(400); join // pragma uvmf custom body end diff --git a/src/integration/uvmf_caliptra_top/uvmf_template_output/project_benches/caliptra_top/tb/sequences/src/caliptra_top_fw_update_sequence.svh b/src/integration/uvmf_caliptra_top/uvmf_template_output/project_benches/caliptra_top/tb/sequences/src/caliptra_top_fw_update_sequence.svh deleted file mode 100644 index 50a0dbb23..000000000 --- a/src/integration/uvmf_caliptra_top/uvmf_template_output/project_benches/caliptra_top/tb/sequences/src/caliptra_top_fw_update_sequence.svh +++ /dev/null @@ -1,203 +0,0 @@ -//---------------------------------------------------------------------- -// Created with uvmf_gen version 2022.3 -//---------------------------------------------------------------------- -// SPDX-License-Identifier: Apache-2.0 -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -// pragma uvmf custom header begin -// pragma uvmf custom header end -//---------------------------------------------------------------------- -// -//---------------------------------------------------------------------- -// -// DESCRIPTION: This file contains the top level sequence used in caliptra_top_rand_test. -// -//---------------------------------------------------------------------- -//---------------------------------------------------------------------- -// - -class caliptra_top_fw_update_sequence extends caliptra_top_bench_sequence_base; - - `uvm_object_utils( caliptra_top_fw_update_sequence ); - - typedef soc_ifc_env_bringup_sequence soc_ifc_env_bringup_sequence_t; - rand soc_ifc_env_bringup_sequence_t soc_ifc_env_bringup_seq; - // Local handle to register model for convenience - soc_ifc_reg_model_top reg_model; - - function new(string name = "" ); - super.new(name); - reg_model = top_configuration.soc_ifc_subenv_config.soc_ifc_rm; - endfunction - - // **************************************************************************** - virtual task body(); - // pragma uvmf custom body begin - int sts_rsp_count = 0; - bit mailbox_locked = 1'b1; - bit ready_for_fw = 1'b0; - bit ready_for_rt = 1'b0; - bit [7:0] rt_fw [32768][3:0]; - int firmware_iccm_length; - int firmware_dccm_length; - int firmware_iccm_end; - int firmware_end; - int fw_rd_ptr; - uvm_status_e sts; - uvm_reg_data_t rdata; - uvm_reg_data_t wdata; - // Construct sequences here - - caliptra_top_env_seq = caliptra_top_env_sequence_base_t::type_id::create("caliptra_top_env_seq"); - soc_ifc_env_bringup_seq = soc_ifc_env_bringup_sequence_t::type_id::create("soc_ifc_env_bringup_seq"); - - soc_ifc_subenv_soc_ifc_ctrl_agent_random_seq = soc_ifc_subenv_soc_ifc_ctrl_agent_random_seq_t::type_id::create("soc_ifc_subenv_soc_ifc_ctrl_agent_random_seq"); - soc_ifc_subenv_soc_ifc_status_agent_responder_seq = soc_ifc_subenv_soc_ifc_status_agent_responder_seq_t::type_id::create("soc_ifc_subenv_soc_ifc_status_agent_responder_seq"); - - // Handle to the responder sequence for getting response transactions - soc_ifc_env_bringup_seq.soc_ifc_status_agent_rsp_seq = soc_ifc_subenv_soc_ifc_status_agent_responder_seq; - -// fork -// soc_ifc_subenv_soc_ifc_ctrl_agent_config.wait_for_reset(); -// soc_ifc_subenv_cptra_ctrl_agent_config.wait_for_reset(); -// soc_ifc_subenv_soc_ifc_status_agent_config.wait_for_reset(); -// soc_ifc_subenv_cptra_status_agent_config.wait_for_reset(); -// join - reg_model.reset(); - // Start RESPONDER sequences here - fork - soc_ifc_subenv_soc_ifc_status_agent_responder_seq.start(soc_ifc_subenv_soc_ifc_status_agent_sequencer); - join_none - - if (soc_ifc_subenv_soc_ifc_status_agent_responder_seq == null) - `uvm_error("FW_UPD_SEQ", "SOC_IFC ENV bringup sequence expected a handle to the soc_ifc status agent responder sequence (from bench-level sequence) but got null!") - fork - forever begin - @(soc_ifc_subenv_soc_ifc_status_agent_responder_seq.new_rsp) sts_rsp_count++; - end - join_none - - `uvm_info("FW_UPD_SEQ", "Starting soc_ifc_env_bringup_seq", UVM_LOW) - - soc_ifc_env_bringup_seq.start(top_configuration.soc_ifc_subenv_config.vsqr); -// caliptra_top_env_seq.start(top_configuration.vsqr); - - `uvm_info("FW_UPD_SEQ", "SoC completed poweron and observed reset deassertion to system", UVM_LOW) - - `uvm_info("FW_UPD_SEQ", "Waiting for ready for fw to assert", UVM_MEDIUM) - - //Wait for ready for fw to be asserted - while(!ready_for_fw) begin - wait (sts_rsp_count > 0); - `uvm_info("FW_UPD_SEQ", "Received response from status agent", UVM_MEDIUM) - ready_for_fw = soc_ifc_subenv_soc_ifc_status_agent_responder_seq.rsp.ready_for_fw_push; - `uvm_info("FW_UPD_SEQ", $sformatf("Ready for FW bit set to: %h", ready_for_fw), UVM_MEDIUM) - sts_rsp_count--; - end - `uvm_info("FW_UPD_SEQ", "Ready for FW asserted, begin FW push", UVM_LOW) - - //Step through the mailbox state machine to trigger interrupt - //Acquire the mailbox lock - while(mailbox_locked) begin - soc_ifc_subenv_soc_ifc_ctrl_agent_config.wait_for_num_clocks(50); - reg_model.mbox_csr_rm.mbox_lock.read(sts, rdata, UVM_FRONTDOOR, reg_model.soc_ifc_APB_map, this); - mailbox_locked = rdata[0]; - end - //Mark the mailbox locked now that we acquired it - mailbox_locked = 1'b1; - reg_model.mbox_csr_rm.mbox_cmd.write(sts, `UVM_REG_DATA_WIDTH'(32'hba5eba11), UVM_FRONTDOOR, reg_model.soc_ifc_APB_map, this); - reg_model.mbox_csr_rm.mbox_dlen.write(sts, `UVM_REG_DATA_WIDTH'(32'hFFFF), UVM_FRONTDOOR, reg_model.soc_ifc_APB_map, this); - reg_model.mbox_csr_rm.mbox_execute.write(sts, `UVM_REG_DATA_WIDTH'(1), UVM_FRONTDOOR, reg_model.soc_ifc_APB_map, this); - //This only works because FW is pre-loaded. Otherwise we need to actually read the .hex and write it to mailbox - - //read FW from file and write to mailbox - $readmemh("caliptra_rt.hex", rt_fw); - //Read the first dword, that's the length of ICCM location - firmware_iccm_length = int'(rt_fw[0][3:0]); - firmware_iccm_end = firmware_iccm_length + 32'd16; - //DCCM length is printed at end of ICCM - firmware_dccm_length = int'(rt_fw[firmware_iccm_end>>2][3:0]); - //firmware end is after ICCM, DCCM and the two lines (16 bytes) of length encodings - firmware_end = firmware_iccm_end + firmware_dccm_length + 32'd16; - - `uvm_info("FW_UPD_SEQ", $sformatf("Firmware ICCM length: %h", int'(firmware_iccm_length)), UVM_MEDIUM); - `uvm_info("FW_UPD_SEQ", $sformatf("Firmware ICCM end: %h", firmware_iccm_end), UVM_MEDIUM); - `uvm_info("FW_UPD_SEQ", $sformatf("Firmware DCCM length: %h", int'(firmware_dccm_length)), UVM_MEDIUM); - `uvm_info("FW_UPD_SEQ", $sformatf("Firmware end: %h", firmware_end), UVM_MEDIUM); - - //Mailbox API to send RT FW - //Acquire the mailbox lock - while(mailbox_locked) begin - soc_ifc_subenv_soc_ifc_ctrl_agent_config.wait_for_num_clocks(50); - reg_model.mbox_csr_rm.mbox_lock.read(sts, rdata, UVM_FRONTDOOR, reg_model.soc_ifc_APB_map, this); - mailbox_locked = rdata[0]; - end - //Mark the mailbox locked now that we acquired it - mailbox_locked = 1'b1; - reg_model.mbox_csr_rm.mbox_cmd.write(sts, `UVM_REG_DATA_WIDTH'(32'hbabecafe), UVM_FRONTDOOR, reg_model.soc_ifc_APB_map, this); - reg_model.mbox_csr_rm.mbox_dlen.write(sts, `UVM_REG_DATA_WIDTH'(firmware_end), UVM_FRONTDOOR, reg_model.soc_ifc_APB_map, this); - - for (fw_rd_ptr = 0; fw_rd_ptr < firmware_end; fw_rd_ptr++) begin - wdata = uvm_reg_data_t'({rt_fw[fw_rd_ptr][3],rt_fw[fw_rd_ptr][2],rt_fw[fw_rd_ptr][1],rt_fw[fw_rd_ptr][0]}); - reg_model.mbox_csr_rm.mbox_datain.write(sts, wdata, UVM_FRONTDOOR, reg_model.soc_ifc_APB_map, this); - end - reg_model.mbox_csr_rm.mbox_execute.write(sts, `UVM_REG_DATA_WIDTH'(1), UVM_FRONTDOOR, reg_model.soc_ifc_APB_map, this); - - //Wait for ready for rt to be asserted - while(!ready_for_rt) begin - wait (sts_rsp_count > 0); - `uvm_info("FW_UPD_SEQ", "Received response from status agent", UVM_MEDIUM) - ready_for_rt = soc_ifc_subenv_soc_ifc_status_agent_responder_seq.rsp.ready_for_runtime; - `uvm_info("FW_UPD_SEQ", $sformatf("Ready for RT bit set to: %h", ready_for_rt), UVM_MEDIUM) - sts_rsp_count--; - end - - //Sending RT firmware again to trigger the firmware update reset - - //Mailbox API to send RT FW - //Acquire the mailbox lock - while(mailbox_locked) begin - soc_ifc_subenv_soc_ifc_ctrl_agent_config.wait_for_num_clocks(50); - reg_model.mbox_csr_rm.mbox_lock.read(sts, rdata, UVM_FRONTDOOR, reg_model.soc_ifc_APB_map, this); - mailbox_locked = rdata[0]; - end - //Mark the mailbox locked now that we acquired it - mailbox_locked = 1'b1; - reg_model.mbox_csr_rm.mbox_cmd.write(sts, `UVM_REG_DATA_WIDTH'(32'hbabecafe), UVM_FRONTDOOR, reg_model.soc_ifc_APB_map, this); - reg_model.mbox_csr_rm.mbox_dlen.write(sts, `UVM_REG_DATA_WIDTH'(firmware_end), UVM_FRONTDOOR, reg_model.soc_ifc_APB_map, this); - - for (fw_rd_ptr = 0; fw_rd_ptr < firmware_end; fw_rd_ptr++) begin - wdata = uvm_reg_data_t'({rt_fw[fw_rd_ptr][3],rt_fw[fw_rd_ptr][2],rt_fw[fw_rd_ptr][1],rt_fw[fw_rd_ptr][0]}); - reg_model.mbox_csr_rm.mbox_datain.write(sts, wdata, UVM_FRONTDOOR, reg_model.soc_ifc_APB_map, this); - end - reg_model.mbox_csr_rm.mbox_execute.write(sts, `UVM_REG_DATA_WIDTH'(1), UVM_FRONTDOOR, reg_model.soc_ifc_APB_map, this); - - // UVMF_CHANGE_ME : Extend the simulation XXX number of clocks after - // the last sequence to allow for the last sequence item to flow - // through the design. - fork - soc_ifc_subenv_soc_ifc_ctrl_agent_config.wait_for_num_clocks(80000); - soc_ifc_subenv_cptra_ctrl_agent_config.wait_for_num_clocks(80000); - soc_ifc_subenv_soc_ifc_status_agent_config.wait_for_num_clocks(80000); - soc_ifc_subenv_cptra_status_agent_config.wait_for_num_clocks(80000); - join - - // pragma uvmf custom body end - endtask - -endclass - -// pragma uvmf custom external begin -// pragma uvmf custom external end - diff --git a/src/integration/uvmf_caliptra_top/uvmf_template_output/project_benches/caliptra_top/tb/sequences/src/caliptra_top_rand_sequence.svh b/src/integration/uvmf_caliptra_top/uvmf_template_output/project_benches/caliptra_top/tb/sequences/src/caliptra_top_rand_sequence.svh index 168d6393a..b09954f4e 100644 --- a/src/integration/uvmf_caliptra_top/uvmf_template_output/project_benches/caliptra_top/tb/sequences/src/caliptra_top_rand_sequence.svh +++ b/src/integration/uvmf_caliptra_top/uvmf_template_output/project_benches/caliptra_top/tb/sequences/src/caliptra_top_rand_sequence.svh @@ -49,15 +49,38 @@ class caliptra_top_rand_sequence extends caliptra_top_bench_sequence_base; IDX_SOC_IFC_ENV_MBOX_RAND_SMALL, IDX_SOC_IFC_ENV_MBOX_RAND_MEDIUM, IDX_SOC_IFC_ENV_MBOX_RAND_LARGE, + IDX_SOC_IFC_ENV_MBOX_MIN, + IDX_SOC_IFC_ENV_MBOX_MAX, IDX_SOC_IFC_ENV_MBOX_RAND_PAUSER_SMALL, IDX_SOC_IFC_ENV_MBOX_RAND_PAUSER_MEDIUM, + IDX_SOC_IFC_ENV_MBOX_RAND_PAUSER_LARGE, + IDX_SOC_IFC_ENV_MBOX_RAND_DELAY_SMALL, + IDX_SOC_IFC_ENV_MBOX_RAND_DELAY_MEDIUM, + IDX_SOC_IFC_ENV_MBOX_RAND_DELAY_LARGE, + IDX_SOC_IFC_ENV_MBOX_RAND_MEDIUM_INTERFERENCE, + IDX_SOC_IFC_ENV_MBOX_DLEN_INVALID, + IDX_SOC_IFC_ENV_MBOX_DLEN_OVERFLOW_SMALL, + IDX_SOC_IFC_ENV_MBOX_DLEN_OVERFLOW_MEDIUM, + IDX_SOC_IFC_ENV_MBOX_DLEN_OVERFLOW_LARGE, + IDX_SOC_IFC_ENV_MBOX_DLEN_UNDERFLOW_SMALL, + IDX_SOC_IFC_ENV_MBOX_DLEN_UNDERFLOW_MEDIUM, + IDX_SOC_IFC_ENV_MBOX_DLEN_UNDERFLOW_LARGE, + IDX_SOC_IFC_ENV_MBOX_REG_AXS_INV_SMALL, + IDX_SOC_IFC_ENV_MBOX_REG_AXS_INV_MEDIUM, + IDX_SOC_IFC_ENV_MBOX_REG_AXS_INV_LARGE, + IDX_SOC_IFC_ENV_MBOX_2BIT_FLIP_SMALL, + IDX_SOC_IFC_ENV_MBOX_2BIT_FLIP_MEDIUM, + IDX_SOC_IFC_ENV_MBOX_2BIT_FLIP_LARGE, IDX_SOC_IFC_ENV_MBOX_MULTI_AGENT, IDX_SOC_IFC_ENV_RST_WARM, IDX_SOC_IFC_ENV_RST_COLD, IDX_SOC_IFC_ENV_MBOX_RST_WARM_RAND_MEDIUM, IDX_SOC_IFC_ENV_MBOX_RST_COLD_RAND_MEDIUM, IDX_SOC_IFC_ENV_MBOX_SHA_ACCEL, - IDX_SOC_IFC_ENV_SHA_ACCEL + IDX_SOC_IFC_ENV_SHA_ACCEL, + IDX_SOC_IFC_ENV_FW_UPD, + IDX_SOC_IFC_ENV_MBOX_UC_REG_ACCESS, + IDX_SOC_IFC_ENV_MBOX_DIR_READ } rand_seq_idx; rand int iteration_count; @@ -66,32 +89,82 @@ class caliptra_top_rand_sequence extends caliptra_top_bench_sequence_base; // Choose rand weights for each sequence to determine run frequency constraint avail_env_seqs_c { rand_seq_idx dist { - //IDX_SOC_IFC_ENV_MBOX_RAND_FW := 0, - IDX_SOC_IFC_ENV_MBOX_RAND_SMALL := 125, - IDX_SOC_IFC_ENV_MBOX_RAND_MEDIUM := 100, - IDX_SOC_IFC_ENV_MBOX_RAND_LARGE := 1, - IDX_SOC_IFC_ENV_MBOX_RAND_PAUSER_SMALL := 125, - IDX_SOC_IFC_ENV_MBOX_RAND_PAUSER_MEDIUM := 100, - IDX_SOC_IFC_ENV_MBOX_MULTI_AGENT := 100, - IDX_SOC_IFC_ENV_RST_WARM := 100, - IDX_SOC_IFC_ENV_RST_COLD := 100, - IDX_SOC_IFC_ENV_MBOX_RST_WARM_RAND_MEDIUM := 100, - IDX_SOC_IFC_ENV_MBOX_RST_COLD_RAND_MEDIUM := 100, - IDX_SOC_IFC_ENV_MBOX_SHA_ACCEL := 100, - IDX_SOC_IFC_ENV_SHA_ACCEL := 100 + //IDX_SOC_IFC_ENV_MBOX_RAND_FW := 0, + IDX_SOC_IFC_ENV_MBOX_RAND_SMALL := 20, + IDX_SOC_IFC_ENV_MBOX_RAND_MEDIUM := 20, + IDX_SOC_IFC_ENV_MBOX_RAND_LARGE := 2, + IDX_SOC_IFC_ENV_MBOX_MIN := 100, + IDX_SOC_IFC_ENV_MBOX_MAX := 10, + IDX_SOC_IFC_ENV_MBOX_RAND_PAUSER_SMALL := 100, + IDX_SOC_IFC_ENV_MBOX_RAND_PAUSER_MEDIUM := 100, + IDX_SOC_IFC_ENV_MBOX_RAND_PAUSER_LARGE := 10, + IDX_SOC_IFC_ENV_MBOX_RAND_DELAY_SMALL := 100, + IDX_SOC_IFC_ENV_MBOX_RAND_DELAY_MEDIUM := 100, + IDX_SOC_IFC_ENV_MBOX_RAND_DELAY_LARGE := 5, + IDX_SOC_IFC_ENV_MBOX_RAND_MEDIUM_INTERFERENCE := 100, + IDX_SOC_IFC_ENV_MBOX_DLEN_INVALID := 10, + IDX_SOC_IFC_ENV_MBOX_DLEN_OVERFLOW_SMALL := 100, + IDX_SOC_IFC_ENV_MBOX_DLEN_OVERFLOW_MEDIUM := 100, + IDX_SOC_IFC_ENV_MBOX_DLEN_OVERFLOW_LARGE := 10, + IDX_SOC_IFC_ENV_MBOX_DLEN_UNDERFLOW_SMALL := 100, + IDX_SOC_IFC_ENV_MBOX_DLEN_UNDERFLOW_MEDIUM := 100, + IDX_SOC_IFC_ENV_MBOX_DLEN_UNDERFLOW_LARGE := 10, + IDX_SOC_IFC_ENV_MBOX_REG_AXS_INV_SMALL := 200, + IDX_SOC_IFC_ENV_MBOX_REG_AXS_INV_MEDIUM := 200, + IDX_SOC_IFC_ENV_MBOX_REG_AXS_INV_LARGE := 20, + IDX_SOC_IFC_ENV_MBOX_2BIT_FLIP_SMALL := 200, + IDX_SOC_IFC_ENV_MBOX_2BIT_FLIP_MEDIUM := 200, + IDX_SOC_IFC_ENV_MBOX_2BIT_FLIP_LARGE := 10, + IDX_SOC_IFC_ENV_MBOX_MULTI_AGENT := 200, + IDX_SOC_IFC_ENV_RST_WARM := 100, + IDX_SOC_IFC_ENV_RST_COLD := 100, + IDX_SOC_IFC_ENV_MBOX_RST_WARM_RAND_MEDIUM := 100, + IDX_SOC_IFC_ENV_MBOX_RST_COLD_RAND_MEDIUM := 100, + IDX_SOC_IFC_ENV_MBOX_SHA_ACCEL := 100, + IDX_SOC_IFC_ENV_SHA_ACCEL := 100, + IDX_SOC_IFC_ENV_FW_UPD := 10, + IDX_SOC_IFC_ENV_MBOX_UC_REG_ACCESS := 100, + IDX_SOC_IFC_ENV_MBOX_DIR_READ := 100 }; } + constraint disable_long_env_seqs_c { + !(rand_seq_idx inside {IDX_SOC_IFC_ENV_MBOX_RAND_LARGE, + IDX_SOC_IFC_ENV_MBOX_MAX, + IDX_SOC_IFC_ENV_MBOX_RAND_PAUSER_LARGE, + IDX_SOC_IFC_ENV_MBOX_RAND_DELAY_MEDIUM, + IDX_SOC_IFC_ENV_MBOX_RAND_DELAY_LARGE, + IDX_SOC_IFC_ENV_MBOX_DLEN_INVALID, + IDX_SOC_IFC_ENV_MBOX_DLEN_OVERFLOW_LARGE, + IDX_SOC_IFC_ENV_MBOX_DLEN_UNDERFLOW_LARGE, + IDX_SOC_IFC_ENV_MBOX_REG_AXS_INV_LARGE, + IDX_SOC_IFC_ENV_MBOX_2BIT_FLIP_LARGE, + IDX_SOC_IFC_ENV_MBOX_MULTI_AGENT}); + } constraint iter_count_c { iteration_count inside {[1:10]}; } + constraint iter_count_short_c { + iteration_count < 5; + } function new(string name = "" ); super.new(name); reg_model = top_configuration.soc_ifc_subenv_config.soc_ifc_rm; + // The short test suite is used in promote pipeline to quickly check for UVM issues + if ($test$plusargs("CLP_SHORT_SUITE")) begin + this.disable_long_env_seqs_c.constraint_mode(1); + this.iter_count_short_c.constraint_mode(1); + end + else begin + this.disable_long_env_seqs_c.constraint_mode(0); + this.iter_count_short_c.constraint_mode(0); + end + // Users can manually override the number of random iterations to any desired value if ($value$plusargs("CALIPTRA_TOP_RAND_ITER=%0d", iteration_count)) begin `uvm_info("CALIPTRA_TOP_RAND_TEST", $sformatf("Received Command Line Iteration Count Argument of %0d", iteration_count), UVM_LOW); iteration_count.rand_mode(0); this.iter_count_c.constraint_mode(0); + this.iter_count_short_c.constraint_mode(0); end else begin if (!this.randomize(iteration_count)) @@ -135,6 +208,8 @@ class caliptra_top_rand_sequence extends caliptra_top_bench_sequence_base; bit pauser_valid_initialized = 1'b0; uvm_object obj; int ii; + int unsigned mbox_ecc_single_error_burst; + int unsigned mbox_ecc_single_error_delay_clocks; caliptra_top_env_seq = caliptra_top_env_sequence_base_t::type_id::create("caliptra_top_env_seq"); soc_ifc_env_bringup_seq = soc_ifc_env_bringup_sequence_t::type_id::create("soc_ifc_env_bringup_seq"); @@ -144,6 +219,7 @@ class caliptra_top_rand_sequence extends caliptra_top_bench_sequence_base; soc_ifc_subenv_soc_ifc_ctrl_agent_random_seq = soc_ifc_subenv_soc_ifc_ctrl_agent_random_seq_t::type_id::create("soc_ifc_subenv_soc_ifc_ctrl_agent_random_seq"); soc_ifc_subenv_soc_ifc_status_agent_responder_seq = soc_ifc_subenv_soc_ifc_status_agent_responder_seq_t::type_id::create("soc_ifc_subenv_soc_ifc_status_agent_responder_seq"); + soc_ifc_subenv_mbox_sram_agent_responder_seq = soc_ifc_subenv_mbox_sram_agent_responder_seq_t::type_id::create("soc_ifc_subenv_mbox_sram_agent_responder_seq"); // Handle to the responder sequence for getting response transactions soc_ifc_env_bringup_seq.soc_ifc_status_agent_rsp_seq = soc_ifc_subenv_soc_ifc_status_agent_responder_seq; @@ -161,11 +237,27 @@ class caliptra_top_rand_sequence extends caliptra_top_bench_sequence_base; // Start RESPONDER sequences here fork soc_ifc_subenv_soc_ifc_status_agent_responder_seq.start(soc_ifc_subenv_soc_ifc_status_agent_sequencer); + soc_ifc_subenv_mbox_sram_agent_responder_seq.start(soc_ifc_subenv_mbox_sram_agent_sequencer); join_none // // Start INITIATOR sequences here // fork // repeat (25) soc_ifc_subenv_soc_ifc_ctrl_agent_random_seq.start(soc_ifc_subenv_soc_ifc_ctrl_agent_sequencer); // join + fork + forever begin + if (!std::randomize(mbox_ecc_single_error_burst,mbox_ecc_single_error_delay_clocks) with {mbox_ecc_single_error_burst dist {1 :/ 10000, [2:5] :/ 2000, [6:31] :/ 200, [32:1023] :/ 10, [1024:131071] :/ 2, [131072:524288] :/ 1}; + mbox_ecc_single_error_delay_clocks dist {1 :/ 1, [2:31] :/ 3, [32:127] :/ 5, [128:1023] :/ 3, [1024:131072] :/ 1}; }) + `uvm_fatal("CALIPTRA_TOP_RAND_TEST", "Failed to randomize mbox ecc bit flip injection parameters") + else + `uvm_info("CALIPTRA_TOP_RAND_TEST", $sformatf("Randomized mbox ecc bit flip injection parameters: burst [%0d] delay [%0d clocks]", mbox_ecc_single_error_burst, mbox_ecc_single_error_delay_clocks), UVM_FULL) + soc_ifc_subenv_soc_ifc_ctrl_agent_config.wait_for_num_clocks(mbox_ecc_single_error_delay_clocks); + `uvm_info("CALIPTRA_TOP_RAND_TEST", $sformatf("Injecting mbox ecc error with burst [%0d]", mbox_ecc_single_error_burst), UVM_DEBUG) + repeat(mbox_ecc_single_error_burst) begin + soc_ifc_subenv_mbox_sram_agent_config.inject_ecc_error |= 2'b01; + @soc_ifc_subenv_mbox_sram_agent_responder_seq.new_rsp; + end + end + join_none fork forever @(soc_ifc_subenv_soc_ifc_status_agent_responder_seq.new_rsp) sts_rsp_count++; join_none @@ -193,6 +285,10 @@ class caliptra_top_rand_sequence extends caliptra_top_bench_sequence_base; obj = soc_ifc_env_mbox_rand_medium_sequence_t::get_type().create_object($sformatf("soc_ifc_env_seq_ii[%0d]",ii)); IDX_SOC_IFC_ENV_MBOX_RAND_LARGE: obj = soc_ifc_env_mbox_rand_large_sequence_t::get_type().create_object($sformatf("soc_ifc_env_seq_ii[%0d]",ii)); + IDX_SOC_IFC_ENV_MBOX_MIN: + obj = soc_ifc_env_mbox_min_sequence_t::get_type().create_object($sformatf("soc_ifc_env_seq_ii[%0d]",ii)); + IDX_SOC_IFC_ENV_MBOX_MAX: + obj = soc_ifc_env_mbox_max_sequence_t::get_type().create_object($sformatf("soc_ifc_env_seq_ii[%0d]",ii)); IDX_SOC_IFC_ENV_MBOX_RAND_PAUSER_SMALL: begin if (!pauser_valid_initialized) begin if(!soc_ifc_env_pauser_init_seq.randomize()) @@ -215,6 +311,54 @@ class caliptra_top_rand_sequence extends caliptra_top_bench_sequence_base; end obj = soc_ifc_env_mbox_rand_pauser_medium_sequence_t::get_type().create_object($sformatf("soc_ifc_env_seq_ii[%0d]",ii)); end + IDX_SOC_IFC_ENV_MBOX_RAND_PAUSER_LARGE: begin + if (!pauser_valid_initialized) begin + if(!soc_ifc_env_pauser_init_seq.randomize()) + `uvm_fatal("CALIPTRA_TOP_RAND_TEST", "caliptra_top_rand_sequence::body() - soc_ifc_env_pauser_init_seq randomization failed") + soc_ifc_env_pauser_init_seq.start(top_configuration.soc_ifc_subenv_config.vsqr); + + `uvm_info("CALIPTRA_TOP_RAND_TEST", "SoC completed PAUSER VALID initialization", UVM_LOW) + pauser_valid_initialized = 1'b1; + end + obj = soc_ifc_env_mbox_rand_pauser_large_sequence_t::get_type().create_object($sformatf("soc_ifc_env_seq_ii[%0d]",ii)); + end + IDX_SOC_IFC_ENV_MBOX_RAND_DELAY_SMALL: begin + obj = soc_ifc_env_mbox_rand_delay_small_sequence_t::get_type().create_object($sformatf("soc_ifc_env_seq_ii[%0d]",ii)); + end + IDX_SOC_IFC_ENV_MBOX_RAND_DELAY_MEDIUM: begin + obj = soc_ifc_env_mbox_rand_delay_medium_sequence_t::get_type().create_object($sformatf("soc_ifc_env_seq_ii[%0d]",ii)); + end + IDX_SOC_IFC_ENV_MBOX_RAND_DELAY_LARGE: begin + obj = soc_ifc_env_mbox_rand_delay_large_sequence_t::get_type().create_object($sformatf("soc_ifc_env_seq_ii[%0d]",ii)); + end + IDX_SOC_IFC_ENV_MBOX_RAND_MEDIUM_INTERFERENCE: + obj = soc_ifc_env_mbox_rand_medium_interference_sequence_t::get_type().create_object($sformatf("soc_ifc_env_seq_ii[%0d]",ii)); + IDX_SOC_IFC_ENV_MBOX_DLEN_INVALID: + obj = soc_ifc_env_mbox_dlen_invalid_sequence_t::get_type().create_object($sformatf("soc_ifc_env_seq_ii[%0d]",ii)); + IDX_SOC_IFC_ENV_MBOX_DLEN_OVERFLOW_SMALL: + obj = soc_ifc_env_mbox_dlen_overflow_small_sequence_t::get_type().create_object($sformatf("soc_ifc_env_seq_ii[%0d]",ii)); + IDX_SOC_IFC_ENV_MBOX_DLEN_OVERFLOW_MEDIUM: + obj = soc_ifc_env_mbox_dlen_overflow_medium_sequence_t::get_type().create_object($sformatf("soc_ifc_env_seq_ii[%0d]",ii)); + IDX_SOC_IFC_ENV_MBOX_DLEN_OVERFLOW_LARGE: + obj = soc_ifc_env_mbox_dlen_overflow_large_sequence_t::get_type().create_object($sformatf("soc_ifc_env_seq_ii[%0d]",ii)); + IDX_SOC_IFC_ENV_MBOX_DLEN_UNDERFLOW_SMALL: + obj = soc_ifc_env_mbox_dlen_underflow_small_sequence_t::get_type().create_object($sformatf("soc_ifc_env_seq_ii[%0d]",ii)); + IDX_SOC_IFC_ENV_MBOX_DLEN_UNDERFLOW_MEDIUM: + obj = soc_ifc_env_mbox_dlen_underflow_medium_sequence_t::get_type().create_object($sformatf("soc_ifc_env_seq_ii[%0d]",ii)); + IDX_SOC_IFC_ENV_MBOX_DLEN_UNDERFLOW_LARGE: + obj = soc_ifc_env_mbox_dlen_underflow_large_sequence_t::get_type().create_object($sformatf("soc_ifc_env_seq_ii[%0d]",ii)); + IDX_SOC_IFC_ENV_MBOX_REG_AXS_INV_SMALL: + obj = soc_ifc_env_mbox_reg_axs_invalid_small_sequence_t::get_type().create_object($sformatf("soc_ifc_env_seq_ii[%0d]",ii)); + IDX_SOC_IFC_ENV_MBOX_REG_AXS_INV_MEDIUM: + obj = soc_ifc_env_mbox_reg_axs_invalid_medium_sequence_t::get_type().create_object($sformatf("soc_ifc_env_seq_ii[%0d]",ii)); + IDX_SOC_IFC_ENV_MBOX_REG_AXS_INV_LARGE: + obj = soc_ifc_env_mbox_reg_axs_invalid_large_sequence_t::get_type().create_object($sformatf("soc_ifc_env_seq_ii[%0d]",ii)); + IDX_SOC_IFC_ENV_MBOX_2BIT_FLIP_SMALL: + obj = soc_ifc_env_mbox_sram_double_bit_flip_small_sequence_t::get_type().create_object($sformatf("soc_ifc_env_seq_ii[%0d]",ii)); + IDX_SOC_IFC_ENV_MBOX_2BIT_FLIP_MEDIUM: + obj = soc_ifc_env_mbox_sram_double_bit_flip_medium_sequence_t::get_type().create_object($sformatf("soc_ifc_env_seq_ii[%0d]",ii)); + IDX_SOC_IFC_ENV_MBOX_2BIT_FLIP_LARGE: + obj = soc_ifc_env_mbox_sram_double_bit_flip_large_sequence_t::get_type().create_object($sformatf("soc_ifc_env_seq_ii[%0d]",ii)); IDX_SOC_IFC_ENV_MBOX_MULTI_AGENT: // TODO PAUSER init first? obj = soc_ifc_env_mbox_rand_multi_agent_sequence_t::get_type().create_object($sformatf("soc_ifc_env_seq_ii[%0d]",ii)); @@ -230,6 +374,12 @@ class caliptra_top_rand_sequence extends caliptra_top_bench_sequence_base; obj = soc_ifc_env_mbox_sha_accel_sequence_t::get_type().create_object($sformatf("soc_ifc_env_seq_ii[%0d]",ii)); IDX_SOC_IFC_ENV_SHA_ACCEL: obj = soc_ifc_env_sha_accel_sequence_t::get_type().create_object($sformatf("soc_ifc_env_seq_ii[%0d]",ii)); + IDX_SOC_IFC_ENV_FW_UPD: + obj = soc_ifc_env_mbox_fw_upd_sequence_t::get_type().create_object($sformatf("soc_ifc_env_seq_ii[%0d]",ii)); + IDX_SOC_IFC_ENV_MBOX_UC_REG_ACCESS: + obj = soc_ifc_env_mbox_uc_reg_access_sequence_t::get_type().create_object($sformatf("soc_ifc_env_seq_ii[%0d]",ii)); + IDX_SOC_IFC_ENV_MBOX_DIR_READ: + obj = soc_ifc_env_mbox_dir_read_sequence_t::get_type().create_object($sformatf("soc_ifc_env_seq_ii[%0d]",ii)); default: `uvm_error("CALIPTRA_TOP_RAND_TEST", $sformatf("rand_seq_idx randomized to illegal value: %p", rand_seq_idx)) endcase @@ -267,10 +417,11 @@ class caliptra_top_rand_sequence extends caliptra_top_bench_sequence_base; // the last sequence to allow for the last sequence item to flow // through the design. fork - soc_ifc_subenv_soc_ifc_ctrl_agent_config.wait_for_num_clocks(400); - soc_ifc_subenv_cptra_ctrl_agent_config.wait_for_num_clocks(400); - soc_ifc_subenv_soc_ifc_status_agent_config.wait_for_num_clocks(400); - soc_ifc_subenv_cptra_status_agent_config.wait_for_num_clocks(400); + soc_ifc_subenv_soc_ifc_ctrl_agent_config.wait_for_num_clocks(4000); + soc_ifc_subenv_cptra_ctrl_agent_config.wait_for_num_clocks(4000); + soc_ifc_subenv_soc_ifc_status_agent_config.wait_for_num_clocks(4000); + soc_ifc_subenv_cptra_status_agent_config.wait_for_num_clocks(4000); + soc_ifc_subenv_mbox_sram_agent_config.wait_for_num_clocks(4000); join // pragma uvmf custom body end diff --git a/src/integration/uvmf_caliptra_top/uvmf_template_output/project_benches/caliptra_top/tb/sequences/src/caliptra_top_rom_sequence.svh b/src/integration/uvmf_caliptra_top/uvmf_template_output/project_benches/caliptra_top/tb/sequences/src/caliptra_top_rom_sequence.svh new file mode 100644 index 000000000..9182b23a6 --- /dev/null +++ b/src/integration/uvmf_caliptra_top/uvmf_template_output/project_benches/caliptra_top/tb/sequences/src/caliptra_top_rom_sequence.svh @@ -0,0 +1,135 @@ +//---------------------------------------------------------------------- +// Created with uvmf_gen version 2022.3 +//---------------------------------------------------------------------- +// SPDX-License-Identifier: Apache-2.0 +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +//---------------------------------------------------------------------- +// +//---------------------------------------------------------------------- +// +// DESCRIPTION: This file contains the top level sequence used in caliptra_top_rom_test. +// +//---------------------------------------------------------------------- +//---------------------------------------------------------------------- +// + +class caliptra_top_rom_sequence extends caliptra_top_bench_sequence_base; + + `uvm_object_utils( caliptra_top_rom_sequence ); + + rand soc_ifc_env_rom_bringup_sequence_t soc_ifc_env_bringup_seq; + rand soc_ifc_env_trng_write_data_sequence_t soc_ifc_env_trng_write_data_seq; + rand soc_ifc_env_mbox_rom_fw_sequence_t soc_ifc_env_mbox_rom_seq; + rand soc_ifc_env_sequence_base_t soc_ifc_env_seq_ii[]; + // Local handle to register model for convenience + soc_ifc_reg_model_top reg_model; + + int sts_rsp_count = 0; + + function new(string name = "" ); + super.new(name); + reg_model = top_configuration.soc_ifc_subenv_config.soc_ifc_rm; + endfunction + + // **************************************************************************** + virtual task run_firmware_init(soc_ifc_env_mbox_rom_fw_sequence_t rom_seq); + bit ready_for_fw = 0; + bit ready_for_rt = 0; + while (!ready_for_fw) begin + while(!sts_rsp_count)soc_ifc_subenv_soc_ifc_ctrl_agent_config.wait_for_num_clocks(1); // Wait for new status updates + `uvm_info("CALIPTRA_TOP_ROM_TEST", "Observed status response, checking contents", UVM_DEBUG) + sts_rsp_count = 0; // We only care about the latest rsp, so even if count > 1, reset back to 0 + ready_for_fw = soc_ifc_subenv_soc_ifc_status_agent_responder_seq.rsp.ready_for_fw_push; + end + if (!rom_seq.randomize()) + `uvm_fatal("CALIPTRA_TOP_ROM_TEST", "caliptra_top_rom_sequence::body() - rom_seq randomization failed") + rom_seq.start(top_configuration.soc_ifc_subenv_config.vsqr); + + endtask + + // **************************************************************************** + virtual task body(); + // pragma uvmf custom body begin + // Construct sequences here + uvm_object obj; + + caliptra_top_env_seq = caliptra_top_env_sequence_base_t::type_id::create("caliptra_top_env_seq"); + soc_ifc_env_bringup_seq = soc_ifc_env_rom_bringup_sequence_t::type_id::create("soc_ifc_env_bringup_seq"); + soc_ifc_env_mbox_rom_seq = soc_ifc_env_mbox_rom_fw_sequence_t::type_id::create("soc_ifc_env_mbox_rom_seq"); + + soc_ifc_subenv_soc_ifc_ctrl_agent_random_seq = soc_ifc_subenv_soc_ifc_ctrl_agent_random_seq_t::type_id::create("soc_ifc_subenv_soc_ifc_ctrl_agent_random_seq"); + soc_ifc_subenv_soc_ifc_status_agent_responder_seq = soc_ifc_subenv_soc_ifc_status_agent_responder_seq_t::type_id::create("soc_ifc_subenv_soc_ifc_status_agent_responder_seq"); + soc_ifc_subenv_mbox_sram_agent_responder_seq = soc_ifc_subenv_mbox_sram_agent_responder_seq_t::type_id::create("soc_ifc_subenv_mbox_sram_agent_responder_seq"); + + // Handle to the responder sequence for getting response transactions + soc_ifc_env_bringup_seq.soc_ifc_status_agent_rsp_seq = soc_ifc_subenv_soc_ifc_status_agent_responder_seq; + soc_ifc_env_mbox_rom_seq.soc_ifc_status_agent_rsp_seq = soc_ifc_subenv_soc_ifc_status_agent_responder_seq; + + reg_model.reset(); + // Start RESPONDER sequences here + fork + soc_ifc_subenv_soc_ifc_status_agent_responder_seq.start(soc_ifc_subenv_soc_ifc_status_agent_sequencer); + soc_ifc_subenv_mbox_sram_agent_responder_seq.start(soc_ifc_subenv_mbox_sram_agent_sequencer); + join_none + + fork + forever @(soc_ifc_subenv_soc_ifc_status_agent_responder_seq.new_rsp) sts_rsp_count++; + join_none + + // Start INITIATOR sequences here + if(!soc_ifc_env_bringup_seq.randomize()) + `uvm_fatal("CALIPTRA_TOP_ROM_TEST", "caliptra_top_rom_sequence::body() - soc_ifc_env_bringup_seq randomization failed") + soc_ifc_env_bringup_seq.start(top_configuration.soc_ifc_subenv_config.vsqr); + + `uvm_info("CALIPTRA_TOP_BRINGUP", "SoC completed poweron and observed reset deassertion to system", UVM_LOW) + +`ifndef CALIPTRA_INTERNAL_TRNG + `uvm_info("CALIPTRA_TOP_ROM_TEST", "Initiating TRNG responder sequence in an infinite loop to handle ROM TRNG requests", UVM_LOW) + fork + forever begin + soc_ifc_env_trng_write_data_seq = soc_ifc_env_trng_write_data_sequence_t::type_id::create("soc_ifc_env_trng_write_data_seq"); + soc_ifc_env_trng_write_data_seq.soc_ifc_status_agent_rsp_seq = soc_ifc_subenv_soc_ifc_status_agent_responder_seq; + if (!soc_ifc_env_trng_write_data_seq.randomize()) + `uvm_fatal("CALIPTRA_TOP_ROM_TEST", $sformatf("caliptra_top_rom_sequence::body() - %s randomization failed", soc_ifc_env_trng_write_data_seq.get_type_name())); + soc_ifc_env_trng_write_data_seq.start(top_configuration.soc_ifc_subenv_config.vsqr); + end + join_none +`else + `uvm_info("CALIPTRA_TOP_ROM_TEST", "Not initiating TRNG responder sequence to handle ROM TRNG requests because INTERNAL TRNG is enabled", UVM_LOW) +`endif + + run_firmware_init(soc_ifc_env_mbox_rom_seq); + + // After firmware init, wait for generic_output_wires write to 0xFF + while(soc_ifc_subenv_soc_ifc_status_agent_responder_seq.rsp.generic_output_val[31:0] != 32'hff) begin + sts_rsp_count = 0; + while(!sts_rsp_count) soc_ifc_subenv_soc_ifc_ctrl_agent_config.wait_for_num_clocks(1); // Wait for new status updates + end + + // UVMF_CHANGE_ME : Extend the simulation XXX number of clocks after + // the last sequence to allow for the last sequence item to flow + // through the design. + fork + soc_ifc_subenv_soc_ifc_ctrl_agent_config.wait_for_num_clocks(400); + soc_ifc_subenv_cptra_ctrl_agent_config.wait_for_num_clocks(400); + soc_ifc_subenv_soc_ifc_status_agent_config.wait_for_num_clocks(400); + soc_ifc_subenv_cptra_status_agent_config.wait_for_num_clocks(400); + soc_ifc_subenv_mbox_sram_agent_config.wait_for_num_clocks(400); + join + + // pragma uvmf custom body end + endtask + +endclass diff --git a/src/integration/uvmf_caliptra_top/uvmf_template_output/project_benches/caliptra_top/tb/sequences/src/caliptra_top_reg_access_sequence.svh b/src/integration/uvmf_caliptra_top/uvmf_template_output/project_benches/caliptra_top/tb/sequences/src/caliptra_top_wdt_independent_sequence.svh similarity index 58% rename from src/integration/uvmf_caliptra_top/uvmf_template_output/project_benches/caliptra_top/tb/sequences/src/caliptra_top_reg_access_sequence.svh rename to src/integration/uvmf_caliptra_top/uvmf_template_output/project_benches/caliptra_top/tb/sequences/src/caliptra_top_wdt_independent_sequence.svh index 44cfc04e9..426616a3a 100644 --- a/src/integration/uvmf_caliptra_top/uvmf_template_output/project_benches/caliptra_top/tb/sequences/src/caliptra_top_reg_access_sequence.svh +++ b/src/integration/uvmf_caliptra_top/uvmf_template_output/project_benches/caliptra_top/tb/sequences/src/caliptra_top_wdt_independent_sequence.svh @@ -21,137 +21,133 @@ // //---------------------------------------------------------------------- // -// DESCRIPTION: This file contains the top level sequence used in CALIPTRA_TOP_REG_ACCESS_TEST. +// DESCRIPTION: This file contains the top level sequence used in caliptra_top_wdt_test. // //---------------------------------------------------------------------- //---------------------------------------------------------------------- // -class caliptra_top_reg_access_sequence extends caliptra_top_bench_sequence_base; +class caliptra_top_wdt_independent_sequence extends caliptra_top_bench_sequence_base; - `uvm_object_utils( caliptra_top_reg_access_sequence ); + `uvm_object_utils( caliptra_top_wdt_independent_sequence ); rand soc_ifc_env_bringup_sequence_t soc_ifc_env_bringup_seq; rand soc_ifc_env_pauser_init_sequence_t soc_ifc_env_pauser_init_seq; rand soc_ifc_env_mbox_real_fw_sequence_t soc_ifc_env_mbox_fmc_seq; rand soc_ifc_env_mbox_real_fw_sequence_t soc_ifc_env_mbox_rt_seq; - rand soc_ifc_env_sequence_base_t soc_ifc_env_seq_ii[]; + rand soc_ifc_env_reset_warm_sequence_t soc_ifc_env_reset_warm_seq; + rand soc_ifc_env_reset_cold_sequence_t soc_ifc_env_reset_cold_seq; + rand soc_ifc_env_cptra_wdt_independent_sequence_t soc_ifc_env_wdt_indep_seq; + rand soc_ifc_env_cptra_wdt_cascade_sequence_t soc_ifc_env_wdt_cascade_seq; // Local handle to register model for convenience soc_ifc_reg_model_top reg_model; - // TODO: To add new sequences to the randomized portion of this test: - // - Update rand_seq_idx enum definition - // - Update avail_env_seqs_c definition - // - Add instantiation logic in the RAND_LOOP below rand int iteration_count; + int sts_rsp_count = 0; + int rsp_count = 0; - constraint iter_count_c { - iteration_count inside {[1:10]}; - } function new(string name = "" ); super.new(name); reg_model = top_configuration.soc_ifc_subenv_config.soc_ifc_rm; - if ($value$plusargs("CALIPTRA_TOP_RAND_ITER=%d", iteration_count)) begin - `uvm_info("CALIPTRA_TOP_REG_ACCESS_TEST", $sformatf("Received Command Line Iteration Count Argument of %d", iteration_count), UVM_LOW); - iteration_count.rand_mode(0); - this.iter_count_c.constraint_mode(0); + endfunction + + // **************************************************************************** + virtual task run_firmware_init(soc_ifc_env_mbox_real_fw_sequence_t fmc_seq, soc_ifc_env_mbox_real_fw_sequence_t rt_seq); + bit ready_for_fw = 0; + bit ready_for_rt = 0; + while (!ready_for_fw) begin + while(!sts_rsp_count)soc_ifc_subenv_soc_ifc_ctrl_agent_config.wait_for_num_clocks(1); // Wait for new status updates + `uvm_info("CALIPTRA_TOP_WDT_INDEP_TEST", "Observed status response, checking contents", UVM_DEBUG) + sts_rsp_count = 0; // We only care about the latest rsp, so even if count > 1, reset back to 0 + ready_for_fw = soc_ifc_subenv_soc_ifc_status_agent_responder_seq.rsp.ready_for_fw_push; end - else begin - if (!this.randomize(iteration_count)) - `uvm_fatal("CALIPTRA_TOP_REG_ACCESS_TEST", "Failed to randomize iteration_count after receiving no command line override") - else - `uvm_info("CALIPTRA_TOP_REG_ACCESS_TEST", $sformatf("Did not receive Command Line Iteration Count Argument with +CALIPTRA_TOP_RAND_ITER, defaulting to %d", iteration_count), UVM_LOW); + if (!fmc_seq.randomize() with { fmc_seq.mbox_op_rand.cmd == mbox_cmd_e'(MBOX_CMD_FMC_UPDATE); }) + `uvm_fatal("CALIPTRA_TOP_WDT_INDEP_TEST", "caliptra_top_wdt_independent_sequence::body() - fmc_seq randomization failed") + fmc_seq.start(top_configuration.soc_ifc_subenv_config.vsqr); + if (!rt_seq.randomize() with { rt_seq.mbox_op_rand.cmd == mbox_cmd_e'(MBOX_CMD_RT_UPDATE); }) + `uvm_fatal("CALIPTRA_TOP_WDT_INDEP_TEST", "caliptra_top_wdt_independent_sequence::body() - rt_seq randomization failed") + rt_seq.start(top_configuration.soc_ifc_subenv_config.vsqr); + + // Wait for RT image to set the ready_for_rt bit + while (!ready_for_rt) begin + while(!sts_rsp_count)soc_ifc_subenv_soc_ifc_ctrl_agent_config.wait_for_num_clocks(1); // Wait for new status updates + `uvm_info("CALIPTRA_TOP_WDT_INDEP_TEST", "Observed status response, checking contents", UVM_DEBUG) + sts_rsp_count = 0; // We only care about the latest rsp, so even if count > 1, reset back to 0 + ready_for_rt = soc_ifc_subenv_soc_ifc_status_agent_responder_seq.rsp.ready_for_runtime; end - soc_ifc_env_seq_ii = new[iteration_count]; - endfunction + endtask // **************************************************************************** virtual task body(); // pragma uvmf custom body begin // Construct sequences here - int sts_rsp_count = 0; - bit ready_for_fw = 0; - bit ready_for_rt = 0; bit pauser_valid_initialized = 1'b0; uvm_object obj; int ii; + bit nmi_intr; + bit hw_error_fatal; + uvm_status_e reg_sts; + uvm_reg_data_t wdt_status_data; caliptra_top_env_seq = caliptra_top_env_sequence_base_t::type_id::create("caliptra_top_env_seq"); soc_ifc_env_bringup_seq = soc_ifc_env_bringup_sequence_t::type_id::create("soc_ifc_env_bringup_seq"); soc_ifc_env_pauser_init_seq = soc_ifc_env_pauser_init_sequence_t::type_id::create("soc_ifc_env_pauser_init_seq"); soc_ifc_env_mbox_fmc_seq = soc_ifc_env_mbox_real_fw_sequence_t::type_id::create("soc_ifc_env_mbox_fmc_seq"); soc_ifc_env_mbox_rt_seq = soc_ifc_env_mbox_real_fw_sequence_t::type_id::create("soc_ifc_env_mbox_rt_seq"); - + soc_ifc_env_reset_warm_seq = soc_ifc_env_reset_warm_sequence_t::type_id::create("soc_ifc_env_reset_warm_seq"); + soc_ifc_env_reset_cold_seq = soc_ifc_env_reset_cold_sequence_t::type_id::create("soc_ifc_env_reset_cold_seq"); + soc_ifc_env_wdt_indep_seq = soc_ifc_env_cptra_wdt_independent_sequence_t::type_id::create("soc_ifc_env_wdt_indep_seq"); + soc_ifc_env_wdt_cascade_seq = soc_ifc_env_cptra_wdt_cascade_sequence_t::type_id::create("soc_ifc_env_wdt_cascade_seq"); + soc_ifc_subenv_soc_ifc_ctrl_agent_random_seq = soc_ifc_subenv_soc_ifc_ctrl_agent_random_seq_t::type_id::create("soc_ifc_subenv_soc_ifc_ctrl_agent_random_seq"); soc_ifc_subenv_soc_ifc_status_agent_responder_seq = soc_ifc_subenv_soc_ifc_status_agent_responder_seq_t::type_id::create("soc_ifc_subenv_soc_ifc_status_agent_responder_seq"); + soc_ifc_subenv_mbox_sram_agent_responder_seq = soc_ifc_subenv_mbox_sram_agent_responder_seq_t::type_id::create("soc_ifc_subenv_mbox_sram_agent_responder_seq"); // Handle to the responder sequence for getting response transactions soc_ifc_env_bringup_seq.soc_ifc_status_agent_rsp_seq = soc_ifc_subenv_soc_ifc_status_agent_responder_seq; soc_ifc_env_pauser_init_seq.soc_ifc_status_agent_rsp_seq = soc_ifc_subenv_soc_ifc_status_agent_responder_seq; soc_ifc_env_mbox_fmc_seq.soc_ifc_status_agent_rsp_seq = soc_ifc_subenv_soc_ifc_status_agent_responder_seq; soc_ifc_env_mbox_rt_seq.soc_ifc_status_agent_rsp_seq = soc_ifc_subenv_soc_ifc_status_agent_responder_seq; + soc_ifc_env_reset_warm_seq.soc_ifc_status_agent_rsp_seq = soc_ifc_subenv_soc_ifc_status_agent_responder_seq; + soc_ifc_env_reset_cold_seq.soc_ifc_status_agent_rsp_seq = soc_ifc_subenv_soc_ifc_status_agent_responder_seq; + soc_ifc_env_wdt_indep_seq.soc_ifc_status_agent_rsp_seq = soc_ifc_subenv_soc_ifc_status_agent_responder_seq; + soc_ifc_env_wdt_cascade_seq.soc_ifc_status_agent_rsp_seq = soc_ifc_subenv_soc_ifc_status_agent_responder_seq; reg_model.reset(); // Start RESPONDER sequences here fork soc_ifc_subenv_soc_ifc_status_agent_responder_seq.start(soc_ifc_subenv_soc_ifc_status_agent_sequencer); + soc_ifc_subenv_mbox_sram_agent_responder_seq.start(soc_ifc_subenv_mbox_sram_agent_sequencer); join_none -// // Start INITIATOR sequences here -// fork -// repeat (25) soc_ifc_subenv_soc_ifc_ctrl_agent_random_seq.start(soc_ifc_subenv_soc_ifc_ctrl_agent_sequencer); -// join + fork - forever @(soc_ifc_subenv_soc_ifc_status_agent_responder_seq.new_rsp) sts_rsp_count++; + forever @(soc_ifc_subenv_soc_ifc_status_agent_responder_seq.new_rsp) begin + sts_rsp_count++; + rsp_count++; + end join_none if(!soc_ifc_env_bringup_seq.randomize()) - `uvm_fatal("CALIPTRA_TOP_REG_ACCESS_TEST", "caliptra_top_reg_access_sequence::body() - soc_ifc_env_bringup_seq randomization failed") + `uvm_fatal("CALIPTRA_TOP_WDT_INDEP_TEST", "caliptra_top_wdt_independent_sequence::body() - soc_ifc_env_bringup_seq randomization failed") soc_ifc_env_bringup_seq.start(top_configuration.soc_ifc_subenv_config.vsqr); `uvm_info("CALIPTRA_TOP_BRINGUP", "SoC completed poweron and observed reset deassertion to system", UVM_LOW) - - while (!ready_for_fw) begin - while(!sts_rsp_count)soc_ifc_subenv_soc_ifc_ctrl_agent_config.wait_for_num_clocks(1); // Wait for new status updates - `uvm_info("CALIPTRA_TOP_REG_ACCESS_TEST", "Observed status response, checking contents", UVM_DEBUG) - sts_rsp_count = 0; // We only care about the latest rsp, so even if count > 1, reset back to 0 - ready_for_fw = soc_ifc_subenv_soc_ifc_status_agent_responder_seq.rsp.ready_for_fw_push; - end - if (!soc_ifc_env_mbox_fmc_seq.randomize() with { soc_ifc_env_mbox_fmc_seq.mbox_op_rand.cmd == 32'hba5eba11; }) - `uvm_fatal("CALIPTRA_TOP_REG_ACCESS_TEST", "caliptra_top_reg_access_sequence::body() - soc_ifc_env_mbox_fmc_seq randomization failed") - soc_ifc_env_mbox_fmc_seq.start(top_configuration.soc_ifc_subenv_config.vsqr); - if (!soc_ifc_env_mbox_rt_seq.randomize() with { soc_ifc_env_mbox_rt_seq.mbox_op_rand.cmd == 32'hbabecafe; }) - `uvm_fatal("CALIPTRA_TOP_REG_ACCESS_TEST", "caliptra_top_reg_access_sequence::body() - soc_ifc_env_mbox_rt_seq randomization failed") - soc_ifc_env_mbox_rt_seq.start(top_configuration.soc_ifc_subenv_config.vsqr); - // Wait for RT image to set the ready_for_rt bit - while (!ready_for_rt) begin - while(!sts_rsp_count)soc_ifc_subenv_soc_ifc_ctrl_agent_config.wait_for_num_clocks(1); // Wait for new status updates - `uvm_info("CALIPTRA_TOP_REG_ACCESS_TEST", "Observed status response, checking contents", UVM_DEBUG) - sts_rsp_count = 0; // We only care about the latest rsp, so even if count > 1, reset back to 0 - ready_for_rt = soc_ifc_subenv_soc_ifc_status_agent_responder_seq.rsp.ready_for_runtime; - end - - // In this loop, randomly select a sequence to run (from the list of available - // ENV level sequences), randomize the sequence object, and kick it off - for (ii = 0; ii < iteration_count; ii++) begin: RAND_LOOP - obj = soc_ifc_env_mbox_uc_reg_access_sequence_t::get_type().create_object($sformatf("soc_ifc_env_seq_ii[%d]",ii)); - - // Randomize and run the sequence - if(!$cast(soc_ifc_env_seq_ii[ii],obj)) `uvm_fatal("CALIPTRA_TOP_REG_ACCESS_TEST", "caliptra_top_reg_access_sequence::body() - .create_object() failed") - `uvm_info("CALIPTRA_TOP_REG_ACCESS_TEST", $sformatf("rand_seq randomized to: %s", soc_ifc_env_seq_ii[ii].get_type_name()), UVM_LOW) - if(!soc_ifc_env_seq_ii[ii].randomize()) - `uvm_fatal("CALIPTRA_TOP_REG_ACCESS_TEST", $sformatf("caliptra_top_reg_access_sequence::body() - %s randomization failed", soc_ifc_env_seq_ii[ii].get_type_name())); - soc_ifc_env_seq_ii[ii].soc_ifc_status_agent_rsp_seq = soc_ifc_subenv_soc_ifc_status_agent_responder_seq; - soc_ifc_env_seq_ii[ii].start(top_configuration.soc_ifc_subenv_config.vsqr); - end + run_firmware_init(soc_ifc_env_mbox_fmc_seq,soc_ifc_env_mbox_rt_seq); + soc_ifc_env_wdt_indep_seq.start(top_configuration.soc_ifc_subenv_config.vsqr); + + // UVMF_CHANGE_ME : Extend the simulation XXX number of clocks after + // the last sequence to allow for the last sequence item to flow + // through the design. fork - soc_ifc_subenv_soc_ifc_ctrl_agent_config.wait_for_num_clocks(400); - soc_ifc_subenv_cptra_ctrl_agent_config.wait_for_num_clocks(400); - soc_ifc_subenv_soc_ifc_status_agent_config.wait_for_num_clocks(400); - soc_ifc_subenv_cptra_status_agent_config.wait_for_num_clocks(400); + soc_ifc_subenv_soc_ifc_ctrl_agent_config.wait_for_num_clocks(10000); + soc_ifc_subenv_cptra_ctrl_agent_config.wait_for_num_clocks(10000); + soc_ifc_subenv_soc_ifc_status_agent_config.wait_for_num_clocks(10000); + soc_ifc_subenv_cptra_status_agent_config.wait_for_num_clocks(10000); + soc_ifc_subenv_mbox_sram_agent_config.wait_for_num_clocks(10000); join // pragma uvmf custom body end diff --git a/src/integration/uvmf_caliptra_top/uvmf_template_output/project_benches/caliptra_top/tb/sequences/src/caliptra_top_wdt_sequence.svh b/src/integration/uvmf_caliptra_top/uvmf_template_output/project_benches/caliptra_top/tb/sequences/src/caliptra_top_wdt_sequence.svh new file mode 100644 index 000000000..a06e803c8 --- /dev/null +++ b/src/integration/uvmf_caliptra_top/uvmf_template_output/project_benches/caliptra_top/tb/sequences/src/caliptra_top_wdt_sequence.svh @@ -0,0 +1,184 @@ +//---------------------------------------------------------------------- +// Created with uvmf_gen version 2022.3 +//---------------------------------------------------------------------- +// SPDX-License-Identifier: Apache-2.0 +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// pragma uvmf custom header begin +// pragma uvmf custom header end +//---------------------------------------------------------------------- +// +//---------------------------------------------------------------------- +// +// DESCRIPTION: This file contains the top level sequence used in caliptra_top_wdt_test. +// +//---------------------------------------------------------------------- +//---------------------------------------------------------------------- +// + +class caliptra_top_wdt_sequence extends caliptra_top_bench_sequence_base; + + `uvm_object_utils( caliptra_top_wdt_sequence ); + + rand soc_ifc_env_bringup_sequence_t soc_ifc_env_bringup_seq; + rand soc_ifc_env_pauser_init_sequence_t soc_ifc_env_pauser_init_seq; + rand soc_ifc_env_mbox_real_fw_sequence_t soc_ifc_env_mbox_fmc_seq; + rand soc_ifc_env_mbox_real_fw_sequence_t soc_ifc_env_mbox_rt_seq; + rand soc_ifc_env_reset_warm_sequence_t soc_ifc_env_reset_warm_seq; + rand soc_ifc_env_reset_cold_sequence_t soc_ifc_env_reset_cold_seq; + rand soc_ifc_env_cptra_wdt_independent_sequence_t soc_ifc_env_wdt_indep_seq; + rand soc_ifc_env_cptra_wdt_cascade_sequence_t soc_ifc_env_wdt_cascade_seq; + // Local handle to register model for convenience + soc_ifc_reg_model_top reg_model; + + + rand int iteration_count; + int sts_rsp_count = 0; + int rsp_count = 0; + + + function new(string name = "" ); + super.new(name); + reg_model = top_configuration.soc_ifc_subenv_config.soc_ifc_rm; + endfunction + + // **************************************************************************** + virtual task run_firmware_init(soc_ifc_env_mbox_real_fw_sequence_t fmc_seq, soc_ifc_env_mbox_real_fw_sequence_t rt_seq); + bit ready_for_fw = 0; + bit ready_for_rt = 0; + while (!ready_for_fw) begin + while(!sts_rsp_count)soc_ifc_subenv_soc_ifc_ctrl_agent_config.wait_for_num_clocks(1); // Wait for new status updates + `uvm_info("CALIPTRA_TOP_WDT_TEST", "Observed status response, checking contents", UVM_DEBUG) + sts_rsp_count = 0; // We only care about the latest rsp, so even if count > 1, reset back to 0 + ready_for_fw = soc_ifc_subenv_soc_ifc_status_agent_responder_seq.rsp.ready_for_fw_push; + end + if (!fmc_seq.randomize() with { fmc_seq.mbox_op_rand.cmd == mbox_cmd_e'(MBOX_CMD_FMC_UPDATE); }) + `uvm_fatal("CALIPTRA_TOP_WDT_TEST", "caliptra_top_wdt_sequence::body() - fmc_seq randomization failed") + fmc_seq.start(top_configuration.soc_ifc_subenv_config.vsqr); + if (!rt_seq.randomize() with { rt_seq.mbox_op_rand.cmd == mbox_cmd_e'(MBOX_CMD_RT_UPDATE); }) + `uvm_fatal("CALIPTRA_TOP_WDT_TEST", "caliptra_top_wdt_sequence::body() - rt_seq randomization failed") + rt_seq.start(top_configuration.soc_ifc_subenv_config.vsqr); + + // Wait for RT image to set the ready_for_rt bit + while (!ready_for_rt) begin + while(!sts_rsp_count)soc_ifc_subenv_soc_ifc_ctrl_agent_config.wait_for_num_clocks(1); // Wait for new status updates + `uvm_info("CALIPTRA_TOP_WDT_TEST", "Observed status response, checking contents", UVM_DEBUG) + sts_rsp_count = 0; // We only care about the latest rsp, so even if count > 1, reset back to 0 + ready_for_rt = soc_ifc_subenv_soc_ifc_status_agent_responder_seq.rsp.ready_for_runtime; + end + endtask + + // **************************************************************************** + virtual task body(); + // pragma uvmf custom body begin + // Construct sequences here + bit pauser_valid_initialized = 1'b0; + uvm_object obj; + int ii; + bit nmi_intr; + bit hw_error_fatal; + uvm_status_e reg_sts; + uvm_reg_data_t wdt_status_data; + + caliptra_top_env_seq = caliptra_top_env_sequence_base_t::type_id::create("caliptra_top_env_seq"); + soc_ifc_env_bringup_seq = soc_ifc_env_bringup_sequence_t::type_id::create("soc_ifc_env_bringup_seq"); + soc_ifc_env_pauser_init_seq = soc_ifc_env_pauser_init_sequence_t::type_id::create("soc_ifc_env_pauser_init_seq"); + soc_ifc_env_mbox_fmc_seq = soc_ifc_env_mbox_real_fw_sequence_t::type_id::create("soc_ifc_env_mbox_fmc_seq"); + soc_ifc_env_mbox_rt_seq = soc_ifc_env_mbox_real_fw_sequence_t::type_id::create("soc_ifc_env_mbox_rt_seq"); + soc_ifc_env_reset_warm_seq = soc_ifc_env_reset_warm_sequence_t::type_id::create("soc_ifc_env_reset_warm_seq"); + soc_ifc_env_reset_cold_seq = soc_ifc_env_reset_cold_sequence_t::type_id::create("soc_ifc_env_reset_cold_seq"); + soc_ifc_env_wdt_indep_seq = soc_ifc_env_cptra_wdt_independent_sequence_t::type_id::create("soc_ifc_env_wdt_indep_seq"); + soc_ifc_env_wdt_cascade_seq = soc_ifc_env_cptra_wdt_cascade_sequence_t::type_id::create("soc_ifc_env_wdt_cascade_seq"); + + soc_ifc_subenv_soc_ifc_ctrl_agent_random_seq = soc_ifc_subenv_soc_ifc_ctrl_agent_random_seq_t::type_id::create("soc_ifc_subenv_soc_ifc_ctrl_agent_random_seq"); + soc_ifc_subenv_soc_ifc_status_agent_responder_seq = soc_ifc_subenv_soc_ifc_status_agent_responder_seq_t::type_id::create("soc_ifc_subenv_soc_ifc_status_agent_responder_seq"); + soc_ifc_subenv_mbox_sram_agent_responder_seq = soc_ifc_subenv_mbox_sram_agent_responder_seq_t::type_id::create("soc_ifc_subenv_mbox_sram_agent_responder_seq"); + + // Handle to the responder sequence for getting response transactions + soc_ifc_env_bringup_seq.soc_ifc_status_agent_rsp_seq = soc_ifc_subenv_soc_ifc_status_agent_responder_seq; + soc_ifc_env_pauser_init_seq.soc_ifc_status_agent_rsp_seq = soc_ifc_subenv_soc_ifc_status_agent_responder_seq; + soc_ifc_env_mbox_fmc_seq.soc_ifc_status_agent_rsp_seq = soc_ifc_subenv_soc_ifc_status_agent_responder_seq; + soc_ifc_env_mbox_rt_seq.soc_ifc_status_agent_rsp_seq = soc_ifc_subenv_soc_ifc_status_agent_responder_seq; + soc_ifc_env_reset_warm_seq.soc_ifc_status_agent_rsp_seq = soc_ifc_subenv_soc_ifc_status_agent_responder_seq; + soc_ifc_env_reset_cold_seq.soc_ifc_status_agent_rsp_seq = soc_ifc_subenv_soc_ifc_status_agent_responder_seq; + soc_ifc_env_wdt_indep_seq.soc_ifc_status_agent_rsp_seq = soc_ifc_subenv_soc_ifc_status_agent_responder_seq; + soc_ifc_env_wdt_cascade_seq.soc_ifc_status_agent_rsp_seq = soc_ifc_subenv_soc_ifc_status_agent_responder_seq; + + reg_model.reset(); + // Start RESPONDER sequences here + fork + soc_ifc_subenv_soc_ifc_status_agent_responder_seq.start(soc_ifc_subenv_soc_ifc_status_agent_sequencer); + soc_ifc_subenv_mbox_sram_agent_responder_seq.start(soc_ifc_subenv_mbox_sram_agent_sequencer); + join_none + + fork + forever @(soc_ifc_subenv_soc_ifc_status_agent_responder_seq.new_rsp) begin + sts_rsp_count++; + rsp_count++; + end + join_none + + if(!soc_ifc_env_bringup_seq.randomize()) + `uvm_fatal("CALIPTRA_TOP_WDT_TEST", "caliptra_top_wdt_sequence::body() - soc_ifc_env_bringup_seq randomization failed") + soc_ifc_env_bringup_seq.start(top_configuration.soc_ifc_subenv_config.vsqr); + + `uvm_info("CALIPTRA_TOP_BRINGUP", "SoC completed poweron and observed reset deassertion to system", UVM_LOW) + + run_firmware_init(soc_ifc_env_mbox_fmc_seq,soc_ifc_env_mbox_rt_seq); + + soc_ifc_env_wdt_cascade_seq.start(top_configuration.soc_ifc_subenv_config.vsqr); + + //-------------------------------- + //Wait for NMI to occur + while (!hw_error_fatal) begin + while(!rsp_count)soc_ifc_subenv_soc_ifc_ctrl_agent_config.wait_for_num_clocks(1); // Wait for new status updates + `uvm_info("CALIPTRA_TOP_WDT_TEST", "Observed status response, checking contents", UVM_MEDIUM) + `uvm_info("CALIPTRA_TOP_WDT_TEST", soc_ifc_subenv_soc_ifc_status_agent_responder_seq.rsp.convert2string(), UVM_MEDIUM) + rsp_count = 0; // We only care about the latest rsp, so even if count > 1, reset back to 0 + hw_error_fatal = soc_ifc_subenv_soc_ifc_status_agent_responder_seq.rsp.cptra_error_fatal_intr_pending; + end + + //Check that NMI bit was set in the fatal error reg + if (reg_model.soc_ifc_reg_rm.CPTRA_HW_ERROR_FATAL.nmi_pin.get_mirrored_value()) begin + `uvm_info("CALIPTRA_TOP_WDT_TEST", "Encountered NMI, issuing reset", UVM_MEDIUM); + + //Issue warm reset + if(!soc_ifc_env_reset_warm_seq.randomize()) + `uvm_fatal("CALIPTRA_TOP_WDT_TEST", "caliptra_top_wdt_sequence::body() - soc_ifc_env_reset_warm_seq randomization failed") + soc_ifc_env_reset_warm_seq.start(top_configuration.soc_ifc_subenv_config.vsqr); + // //-------------------------------- + end + else begin + `uvm_error("CALIPTRA_TOP_WDT_TEST", "Did not see expected NMI interrupt") + end + + // UVMF_CHANGE_ME : Extend the simulation XXX number of clocks after + // the last sequence to allow for the last sequence item to flow + // through the design. + fork + soc_ifc_subenv_soc_ifc_ctrl_agent_config.wait_for_num_clocks(10000); + soc_ifc_subenv_cptra_ctrl_agent_config.wait_for_num_clocks(10000); + soc_ifc_subenv_soc_ifc_status_agent_config.wait_for_num_clocks(10000); + soc_ifc_subenv_cptra_status_agent_config.wait_for_num_clocks(10000); + soc_ifc_subenv_mbox_sram_agent_config.wait_for_num_clocks(10000); + join + + // pragma uvmf custom body end + endtask + +endclass + +// pragma uvmf custom external begin +// pragma uvmf custom external end + diff --git a/src/integration/uvmf_caliptra_top/uvmf_template_output/project_benches/caliptra_top/tb/testbench/hdl_top.sv b/src/integration/uvmf_caliptra_top/uvmf_template_output/project_benches/caliptra_top/tb/testbench/hdl_top.sv index 302144da3..3084672f4 100644 --- a/src/integration/uvmf_caliptra_top/uvmf_template_output/project_benches/caliptra_top/tb/testbench/hdl_top.sv +++ b/src/integration/uvmf_caliptra_top/uvmf_template_output/project_benches/caliptra_top/tb/testbench/hdl_top.sv @@ -86,6 +86,7 @@ import uvmf_base_pkg_hdl::*; // Custom Signal Declarations //=========================================================================- import soc_ifc_pkg::*; + import caliptra_top_tb_pkg::*; `include "config_defines.svh" @@ -99,6 +100,7 @@ import uvmf_base_pkg_hdl::*; int cycleCnt; bit int_flag; bit cycleCnt_smpl_en; + ras_test_ctrl_t ras_test_ctrl; //jtag interface logic jtag_tck = '0; // JTAG clk @@ -107,16 +109,22 @@ import uvmf_base_pkg_hdl::*; logic jtag_trst_n = '0; // JTAG Reset logic jtag_tdo; // JTAG TDO - logic mbox_sram_cs; - logic mbox_sram_we; - logic [14:0] mbox_sram_addr; - logic [MBOX_DATA_AND_ECC_W-1:0] mbox_sram_wdata; - logic [MBOX_DATA_AND_ECC_W-1:0] mbox_sram_rdata; + mbox_sram_req_t mbox_sram_req; + mbox_sram_resp_t mbox_sram_resp; + logic mbox_sram_cs_stub_inactive; + logic mbox_sram_we_stub_inactive; + logic [14:0] mbox_sram_addr_stub_inactive; + logic [MBOX_DATA_AND_ECC_W-1:0] mbox_sram_wdata_stub_inactive; + logic [MBOX_DATA_AND_ECC_W-1:0] mbox_sram_rdata_stub_inactive; logic imem_cs; logic [`CALIPTRA_IMEM_ADDR_WIDTH-1:0] imem_addr; logic [`CALIPTRA_IMEM_DATA_WIDTH-1:0] imem_rdata; + logic etrng_req; + logic [3:0] itrng_data; + logic itrng_valid; + //device lifecycle security_state_t security_state_stub_inactive; @@ -151,19 +159,26 @@ import uvmf_base_pkg_hdl::*; .clk(clk), .dummy(1'b1) // pragma uvmf custom soc_ifc_subenv_cptra_status_agent_bus_connections end ); + mbox_sram_if soc_ifc_subenv_mbox_sram_agent_bus( + // pragma uvmf custom soc_ifc_subenv_mbox_sram_agent_bus_connections begin + .clk(clk), .dummy(1'b1) + // pragma uvmf custom soc_ifc_subenv_mbox_sram_agent_bus_connections end + ); soc_ifc_ctrl_monitor_bfm soc_ifc_subenv_soc_ifc_ctrl_agent_mon_bfm(soc_ifc_subenv_soc_ifc_ctrl_agent_bus.monitor_port); cptra_ctrl_monitor_bfm soc_ifc_subenv_cptra_ctrl_agent_mon_bfm(soc_ifc_subenv_cptra_ctrl_agent_bus.monitor_port); soc_ifc_status_monitor_bfm soc_ifc_subenv_soc_ifc_status_agent_mon_bfm(soc_ifc_subenv_soc_ifc_status_agent_bus.monitor_port); cptra_status_monitor_bfm soc_ifc_subenv_cptra_status_agent_mon_bfm(soc_ifc_subenv_cptra_status_agent_bus.monitor_port); + mbox_sram_monitor_bfm soc_ifc_subenv_mbox_sram_agent_mon_bfm(soc_ifc_subenv_mbox_sram_agent_bus.monitor_port); soc_ifc_ctrl_driver_bfm soc_ifc_subenv_soc_ifc_ctrl_agent_drv_bfm(soc_ifc_subenv_soc_ifc_ctrl_agent_bus.initiator_port); soc_ifc_status_driver_bfm soc_ifc_subenv_soc_ifc_status_agent_drv_bfm(soc_ifc_subenv_soc_ifc_status_agent_bus.responder_port); + mbox_sram_driver_bfm soc_ifc_subenv_mbox_sram_agent_drv_bfm(soc_ifc_subenv_mbox_sram_agent_bus.responder_port); // pragma uvmf custom dut_instantiation begin // AHB Clock/reset assign uvm_test_top_environment_soc_ifc_subenv_qvip_ahb_lite_slave_subenv_qvip_hdl.default_clk_gen_CLK = clk; assign uvm_test_top_environment_soc_ifc_subenv_qvip_ahb_lite_slave_subenv_qvip_hdl.default_reset_gen_RESET = caliptra_top_dut.cptra_noncore_rst_b; assign uvm_test_top_environment_soc_ifc_subenv_qvip_apb5_slave_subenv_qvip_hdl.default_clk_gen_CLK = clk; - assign uvm_test_top_environment_soc_ifc_subenv_qvip_apb5_slave_subenv_qvip_hdl.default_reset_gen_RESET = soc_ifc_subenv_soc_ifc_ctrl_agent_bus.cptra_rst_b; + assign uvm_test_top_environment_soc_ifc_subenv_qvip_apb5_slave_subenv_qvip_hdl.default_reset_gen_RESET = caliptra_top_dut.cptra_noncore_rst_b; //=========================================================================- @@ -193,21 +208,23 @@ import uvmf_base_pkg_hdl::*; .PWDATA (uvm_test_top_environment_soc_ifc_subenv_qvip_apb5_slave_subenv_qvip_hdl.apb5_master_0_PWDATA ), .PWRITE (uvm_test_top_environment_soc_ifc_subenv_qvip_apb5_slave_subenv_qvip_hdl.apb5_master_0_PWRITE ), - .qspi_clk_o(/*TODO*/), - .qspi_cs_no(/*TODO*/), - .qspi_d_io (/*TODO*/), + .qspi_clk_o (/*TODO*/), + .qspi_cs_no (/*TODO*/), + .qspi_d_i (/*TODO*/), + .qspi_d_o (/*TODO*/), + .qspi_d_en_o (/*TODO*/), - .el2_mem_export(el2_mem_export), + .el2_mem_export(el2_mem_export.veer_sram_src), .ready_for_fuses (soc_ifc_subenv_soc_ifc_status_agent_bus.ready_for_fuses ), .ready_for_fw_push(soc_ifc_subenv_soc_ifc_status_agent_bus.ready_for_fw_push ), .ready_for_runtime(soc_ifc_subenv_soc_ifc_status_agent_bus.ready_for_runtime ), - .mbox_sram_cs (mbox_sram_cs ), - .mbox_sram_we (mbox_sram_we ), - .mbox_sram_addr (mbox_sram_addr ), - .mbox_sram_wdata(mbox_sram_wdata), - .mbox_sram_rdata(mbox_sram_rdata), + .mbox_sram_cs (mbox_sram_req.cs ), + .mbox_sram_we (mbox_sram_req.we ), + .mbox_sram_addr (mbox_sram_req.addr ), + .mbox_sram_wdata(mbox_sram_req.wdata), + .mbox_sram_rdata(mbox_sram_resp.rdata), .imem_cs (imem_cs ), .imem_addr (imem_addr ), @@ -221,16 +238,23 @@ import uvmf_base_pkg_hdl::*; .cptra_error_fatal (soc_ifc_subenv_soc_ifc_status_agent_bus.cptra_error_fatal), .cptra_error_non_fatal(soc_ifc_subenv_soc_ifc_status_agent_bus.cptra_error_non_fatal), // External TRNG +`ifdef CALIPTRA_INTERNAL_TRNG + .etrng_req (etrng_req), + // Internal TRNG + .itrng_data (itrng_data ), + .itrng_valid (itrng_valid), +`else .etrng_req (soc_ifc_subenv_soc_ifc_status_agent_bus.trng_req), // Internal TRNG - .itrng_data (4'h0), // TODO - .itrng_valid (1'b0), // TODO + .itrng_data (4'h0), + .itrng_valid (1'b0), +`endif .generic_input_wires (soc_ifc_subenv_soc_ifc_ctrl_agent_bus.generic_input_wires), .generic_output_wires(soc_ifc_subenv_soc_ifc_status_agent_bus.generic_output_wires), .security_state(soc_ifc_subenv_soc_ifc_ctrl_agent_bus.security_state), - .scan_mode (1'b0) + .scan_mode (1'b0) // TODO ); assign uvm_test_top_environment_soc_ifc_subenv_qvip_apb5_slave_subenv_qvip_hdl.apb5_master_0_PWUSER = 0; assign uvm_test_top_environment_soc_ifc_subenv_qvip_apb5_slave_subenv_qvip_hdl.apb5_master_0_PRUSER = 0; @@ -278,17 +302,38 @@ import uvmf_base_pkg_hdl::*; assign soc_ifc_subenv_cptra_status_agent_bus.cptra_noncore_rst_b = caliptra_top_dut.cptra_noncore_rst_b; assign soc_ifc_subenv_cptra_status_agent_bus.cptra_obf_key_reg = caliptra_top_dut.cptra_obf_key_reg; assign soc_ifc_subenv_cptra_status_agent_bus.cptra_uc_rst_b = caliptra_top_dut.cptra_uc_rst_b; + assign soc_ifc_subenv_cptra_status_agent_bus.fw_update_rst_window = caliptra_top_dut.fw_update_rst_window; assign soc_ifc_subenv_cptra_status_agent_bus.iccm_lock = caliptra_top_dut.iccm_lock; assign soc_ifc_subenv_cptra_status_agent_bus.nmi_vector = caliptra_top_dut.nmi_vector; + assign soc_ifc_subenv_cptra_status_agent_bus.nmi_intr = caliptra_top_dut.nmi_int; assign soc_ifc_subenv_cptra_status_agent_bus.obf_field_entropy = caliptra_top_dut.obf_field_entropy; assign soc_ifc_subenv_cptra_status_agent_bus.obf_uds_seed = caliptra_top_dut.obf_uds_seed; assign soc_ifc_subenv_cptra_status_agent_bus.sha_error_intr = caliptra_top_dut.sha_error_intr; assign soc_ifc_subenv_cptra_status_agent_bus.sha_notif_intr = caliptra_top_dut.sha_notif_intr; assign soc_ifc_subenv_cptra_status_agent_bus.soc_ifc_error_intr = caliptra_top_dut.soc_ifc_error_intr; assign soc_ifc_subenv_cptra_status_agent_bus.soc_ifc_notif_intr = caliptra_top_dut.soc_ifc_notif_intr; + assign soc_ifc_subenv_cptra_status_agent_bus.timer_intr = caliptra_top_dut.timer_int; assign soc_ifc_subenv_cptra_ctrl_agent_bus.clear_obf_secrets = caliptra_top_dut.clear_obf_secrets_debugScanQ; assign soc_ifc_subenv_cptra_ctrl_agent_bus.iccm_axs_blocked = caliptra_top_dut.ahb_lite_resp_access_blocked[`CALIPTRA_SLAVE_SEL_IDMA]; + assign soc_ifc_subenv_cptra_ctrl_agent_bus.rv_ecc_sts = caliptra_top_dut.rv_ecc_sts; + + assign soc_ifc_subenv_mbox_sram_agent_bus.mbox_sram_req = mbox_sram_req; + assign mbox_sram_resp = soc_ifc_subenv_mbox_sram_agent_bus.mbox_sram_resp; + +`ifdef CALIPTRA_INTERNAL_TRNG + //=========================================================================- + // Physical RNG used for Internal TRNG + //=========================================================================- + physical_rng physical_rng_i ( + .clk (clk), + .enable (etrng_req), + .data (itrng_data), + .valid (itrng_valid) + ); + + assign soc_ifc_subenv_soc_ifc_status_agent_bus.trng_req = 1'b0; +`endif //=========================================================================- // Services for SRAM exports, STDOUT, etc @@ -301,14 +346,14 @@ import uvmf_base_pkg_hdl::*; .cptra_rst_b(soc_ifc_subenv_soc_ifc_ctrl_agent_bus.cptra_rst_b ), // Caliptra Memory Export Interface - .el2_mem_export (el2_mem_export), + .el2_mem_export (el2_mem_export.veer_sram_sink), //SRAM interface for mbox - .mbox_sram_cs (mbox_sram_cs ), - .mbox_sram_we (mbox_sram_we ), - .mbox_sram_addr (mbox_sram_addr ), - .mbox_sram_wdata(mbox_sram_wdata), - .mbox_sram_rdata(mbox_sram_rdata), + .mbox_sram_cs (mbox_sram_cs_stub_inactive ), + .mbox_sram_we (mbox_sram_we_stub_inactive ), + .mbox_sram_addr (mbox_sram_addr_stub_inactive ), + .mbox_sram_wdata(mbox_sram_wdata_stub_inactive), + .mbox_sram_rdata(mbox_sram_rdata_stub_inactive), //SRAM interface for imem .imem_cs (imem_cs ), @@ -319,6 +364,7 @@ import uvmf_base_pkg_hdl::*; .security_state(security_state_stub_inactive), // TB Controls + .ras_test_ctrl(ras_test_ctrl), .cycleCnt(cycleCnt), .cycleCnt_smpl_en(cycleCnt_smpl_en), @@ -338,8 +384,10 @@ import uvmf_base_pkg_hdl::*; uvm_config_db #( virtual cptra_ctrl_monitor_bfm )::set( null , UVMF_VIRTUAL_INTERFACES , soc_ifc_subenv_cptra_ctrl_agent_BFM , soc_ifc_subenv_cptra_ctrl_agent_mon_bfm ); uvm_config_db #( virtual soc_ifc_status_monitor_bfm )::set( null , UVMF_VIRTUAL_INTERFACES , soc_ifc_subenv_soc_ifc_status_agent_BFM , soc_ifc_subenv_soc_ifc_status_agent_mon_bfm ); uvm_config_db #( virtual cptra_status_monitor_bfm )::set( null , UVMF_VIRTUAL_INTERFACES , soc_ifc_subenv_cptra_status_agent_BFM , soc_ifc_subenv_cptra_status_agent_mon_bfm ); + uvm_config_db #( virtual mbox_sram_monitor_bfm )::set( null , UVMF_VIRTUAL_INTERFACES , soc_ifc_subenv_mbox_sram_agent_BFM , soc_ifc_subenv_mbox_sram_agent_mon_bfm ); uvm_config_db #( virtual soc_ifc_ctrl_driver_bfm )::set( null , UVMF_VIRTUAL_INTERFACES , soc_ifc_subenv_soc_ifc_ctrl_agent_BFM , soc_ifc_subenv_soc_ifc_ctrl_agent_drv_bfm ); uvm_config_db #( virtual soc_ifc_status_driver_bfm )::set( null , UVMF_VIRTUAL_INTERFACES , soc_ifc_subenv_soc_ifc_status_agent_BFM , soc_ifc_subenv_soc_ifc_status_agent_drv_bfm ); + uvm_config_db #( virtual mbox_sram_driver_bfm )::set( null , UVMF_VIRTUAL_INTERFACES , soc_ifc_subenv_mbox_sram_agent_BFM , soc_ifc_subenv_mbox_sram_agent_drv_bfm ); end endmodule diff --git a/src/integration/uvmf_caliptra_top/uvmf_template_output/project_benches/caliptra_top/tb/tests/caliptra_top_tests_pkg.sv b/src/integration/uvmf_caliptra_top/uvmf_template_output/project_benches/caliptra_top/tb/tests/caliptra_top_tests_pkg.sv index f01a3b95a..751ca96c5 100644 --- a/src/integration/uvmf_caliptra_top/uvmf_template_output/project_benches/caliptra_top/tb/tests/caliptra_top_tests_pkg.sv +++ b/src/integration/uvmf_caliptra_top/uvmf_template_output/project_benches/caliptra_top/tb/tests/caliptra_top_tests_pkg.sv @@ -65,9 +65,10 @@ package caliptra_top_tests_pkg; `include "src/register_test.svh" `include "src/example_derived_test.svh" `include "src/caliptra_top_rand_test.svh" - `include "src/caliptra_top_fw_update_test.svh" - `include "src/caliptra_top_reg_access_test.svh" + `include "src/caliptra_top_wdt_test.svh" + `include "src/caliptra_top_wdt_independent_test.svh" `include "src/caliptra_top_cmdline_test.svh" + `include "src/caliptra_top_rom_test.svh" // pragma uvmf custom package_item_additional begin // UVMF_CHANGE_ME : When adding new tests to the src directory diff --git a/src/integration/uvmf_caliptra_top/uvmf_template_output/project_benches/caliptra_top/tb/tests/src/caliptra_top_fw_update_test.yml b/src/integration/uvmf_caliptra_top/uvmf_template_output/project_benches/caliptra_top/tb/tests/src/caliptra_top_fw_update_test.yml deleted file mode 100644 index c630b96ee..000000000 --- a/src/integration/uvmf_caliptra_top/uvmf_template_output/project_benches/caliptra_top/tb/tests/src/caliptra_top_fw_update_test.yml +++ /dev/null @@ -1,6 +0,0 @@ ---- -# Random seed desired... -seed: ${PLAYBOOK_RANDOM_SEED} -plusargs: -- '+UVM_TESTNAME=caliptra_top_fw_update_test' -testname: caliptra_top_fw_update_test diff --git a/src/integration/uvmf_caliptra_top/uvmf_template_output/project_benches/caliptra_top/tb/tests/src/caliptra_top_reg_access_test.yml b/src/integration/uvmf_caliptra_top/uvmf_template_output/project_benches/caliptra_top/tb/tests/src/caliptra_top_reg_access_test.yml deleted file mode 100644 index fda0cf23f..000000000 --- a/src/integration/uvmf_caliptra_top/uvmf_template_output/project_benches/caliptra_top/tb/tests/src/caliptra_top_reg_access_test.yml +++ /dev/null @@ -1,6 +0,0 @@ ---- -# Random seed desired... -seed: ${PLAYBOOK_RANDOM_SEED} -plusargs: -- '+UVM_TESTNAME=caliptra_top_reg_access_test' -testname: caliptra_top_reg_access_test diff --git a/src/integration/uvmf_caliptra_top/uvmf_template_output/project_benches/caliptra_top/tb/tests/src/caliptra_top_rom_test.svh b/src/integration/uvmf_caliptra_top/uvmf_template_output/project_benches/caliptra_top/tb/tests/src/caliptra_top_rom_test.svh new file mode 100644 index 000000000..30926d48e --- /dev/null +++ b/src/integration/uvmf_caliptra_top/uvmf_template_output/project_benches/caliptra_top/tb/tests/src/caliptra_top_rom_test.svh @@ -0,0 +1,82 @@ +//---------------------------------------------------------------------- +// Created with uvmf_gen version 2022.3 +//---------------------------------------------------------------------- +// SPDX-License-Identifier: Apache-2.0 +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// pragma uvmf custom header begin +// pragma uvmf custom header end +//---------------------------------------------------------------------- +//---------------------------------------------------------------------- +// +// DESCRIPTION: This test extends test_top and makes +// changes to test_top using the UVM factory type_override: +// +// Test scenario: +// Load the FW-team ROM image and use it to boot a subsequent FW image. +// +//---------------------------------------------------------------------- +//---------------------------------------------------------------------- +// + +class caliptra_top_rom_test extends test_top; + + `uvm_component_utils( caliptra_top_rom_test ); + + function new( string name = "", uvm_component parent = null ); + super.new( name, parent ); + endfunction + + virtual function void build_phase(uvm_phase phase); + // The factory override below is an example of how to replace the caliptra_top_bench_sequence_base + // sequence with the example_derived_test_sequence. + caliptra_top_bench_sequence_base::type_id::set_type_override(caliptra_top_rom_sequence::get_type()); + // Execute the build_phase of test_top AFTER all factory overrides have been created. + super.build_phase(phase); + // pragma uvmf custom configuration_settings_post_randomize begin + // UVMF_CHANGE_ME Test specific configuration values can be set here. + // The configuration structure has already been randomized. + // pragma uvmf custom configuration_settings_post_randomize end + endfunction + + virtual function void start_of_simulation_phase(uvm_phase phase); + super.start_of_simulation_phase(phase); + if ($test$plusargs("CLP_REGRESSION")) begin + uvm_top.set_report_verbosity_level_hier(UVM_LOW); +// this.environment.soc_ifc_subenv.soc_ifc_pred.set_report_severity_action(UVM_WARNING,UVM_NO_ACTION); +// this.environment.soc_ifc_subenv.soc_ifc_sb.set_report_severity_action(UVM_WARNING,UVM_NO_ACTION); + // Since en_sb is recently set to 0, this is unavailable and gives null-object + //this.environment.soc_ifc_subenv.qvip_apb5_slave_subenv.apb5_master_0.get_analysis_component("checker").set_report_severity_id_action(UVM_WARNING,"scoreboard_debug",UVM_NO_ACTION); + end + endfunction + +// FUNCTION: run_phase +// This task manages the test objection and starts the top level sequence. + virtual task run_phase( uvm_phase phase ); + int fd; + string system_time; + fork + forever begin + configuration.soc_ifc_subenv_config.soc_ifc_ctrl_agent_config.wait_for_num_clocks(10000); // Report time every 100us + $system("date | tr -d '\\n' > curdate"); + fd = $fopen("curdate", "r"); + assert($fgets(system_time, fd) != 0); + $fclose(fd); + `uvm_info("ROM_TEST_HEARTBEAT",$sformatf("system time is [%s]", system_time),UVM_LOW); + end + join_none + super.run_phase(phase); + endtask + +endclass diff --git a/src/integration/uvmf_caliptra_top/uvmf_template_output/project_benches/caliptra_top/tb/tests/src/caliptra_top_rom_test.yml b/src/integration/uvmf_caliptra_top/uvmf_template_output/project_benches/caliptra_top/tb/tests/src/caliptra_top_rom_test.yml new file mode 100644 index 000000000..bf1f60e7c --- /dev/null +++ b/src/integration/uvmf_caliptra_top/uvmf_template_output/project_benches/caliptra_top/tb/tests/src/caliptra_top_rom_test.yml @@ -0,0 +1,6 @@ +--- +# Random seed desired... +seed: ${PLAYBOOK_RANDOM_SEED} +plusargs: +- '+UVM_TESTNAME=caliptra_top_rom_test' +testname: caliptra_top_rom_test diff --git a/src/integration/uvmf_caliptra_top/uvmf_template_output/project_benches/caliptra_top/tb/tests/src/caliptra_top_reg_access_test.svh b/src/integration/uvmf_caliptra_top/uvmf_template_output/project_benches/caliptra_top/tb/tests/src/caliptra_top_wdt_independent_test.svh similarity index 64% rename from src/integration/uvmf_caliptra_top/uvmf_template_output/project_benches/caliptra_top/tb/tests/src/caliptra_top_reg_access_test.svh rename to src/integration/uvmf_caliptra_top/uvmf_template_output/project_benches/caliptra_top/tb/tests/src/caliptra_top_wdt_independent_test.svh index 3d8d93533..b1138994a 100644 --- a/src/integration/uvmf_caliptra_top/uvmf_template_output/project_benches/caliptra_top/tb/tests/src/caliptra_top_reg_access_test.svh +++ b/src/integration/uvmf_caliptra_top/uvmf_template_output/project_benches/caliptra_top/tb/tests/src/caliptra_top_wdt_independent_test.svh @@ -24,15 +24,15 @@ // changes to test_top using the UVM factory type_override: // // Test scenario: -// Randomized activity to mailbox +// Randomized activity to Caliptra // //---------------------------------------------------------------------- //---------------------------------------------------------------------- // -class caliptra_top_reg_access_test extends test_top; +class caliptra_top_wdt_independent_test extends test_top; - `uvm_component_utils( caliptra_top_reg_access_test ); + `uvm_component_utils( caliptra_top_wdt_independent_test ); function new( string name = "", uvm_component parent = null ); super.new( name, parent ); @@ -41,7 +41,7 @@ class caliptra_top_reg_access_test extends test_top; virtual function void build_phase(uvm_phase phase); // The factory override below is an example of how to replace the caliptra_top_bench_sequence_base // sequence with the example_derived_test_sequence. - caliptra_top_bench_sequence_base::type_id::set_type_override(caliptra_top_reg_access_sequence::get_type()); + caliptra_top_bench_sequence_base::type_id::set_type_override(caliptra_top_wdt_independent_sequence::get_type()); // Execute the build_phase of test_top AFTER all factory overrides have been created. super.build_phase(phase); // pragma uvmf custom configuration_settings_post_randomize begin @@ -50,6 +50,20 @@ class caliptra_top_reg_access_test extends test_top; // pragma uvmf custom configuration_settings_post_randomize end endfunction + // FIXME this disables uvm_warning messages! We should fix the warnings, but for + // now this reduces sim.log (for regressions) to a manageable level + // NOTE: UVM_WARNING now re-enabled, need to clean this up after some regression cycles + virtual function void start_of_simulation_phase(uvm_phase phase); + super.start_of_simulation_phase(phase); + if ($test$plusargs("CLP_REGRESSION")) begin + uvm_top.set_report_verbosity_level_hier(UVM_NONE); +// this.environment.soc_ifc_subenv.soc_ifc_pred.set_report_severity_action(UVM_WARNING,UVM_NO_ACTION); +// this.environment.soc_ifc_subenv.soc_ifc_sb.set_report_severity_action(UVM_WARNING,UVM_NO_ACTION); + // Since en_sb is recently set to 0, this is unavailable and gives null-object + //this.environment.soc_ifc_subenv.qvip_apb5_slave_subenv.apb5_master_0.get_analysis_component("checker").set_report_severity_id_action(UVM_WARNING,"scoreboard_debug",UVM_NO_ACTION); + end + endfunction + endclass // pragma uvmf custom external begin diff --git a/src/integration/uvmf_caliptra_top/uvmf_template_output/project_benches/caliptra_top/tb/tests/src/caliptra_top_wdt_independent_test.yml b/src/integration/uvmf_caliptra_top/uvmf_template_output/project_benches/caliptra_top/tb/tests/src/caliptra_top_wdt_independent_test.yml new file mode 100644 index 000000000..1be3f550b --- /dev/null +++ b/src/integration/uvmf_caliptra_top/uvmf_template_output/project_benches/caliptra_top/tb/tests/src/caliptra_top_wdt_independent_test.yml @@ -0,0 +1,6 @@ +--- +# Random seed desired... +seed: ${PLAYBOOK_RANDOM_SEED} +plusargs: +- '+UVM_TESTNAME=caliptra_top_wdt_independent_test' +testname: caliptra_top_wdt_independent_test diff --git a/src/integration/uvmf_caliptra_top/uvmf_template_output/project_benches/caliptra_top/tb/tests/src/caliptra_top_fw_update_test.svh b/src/integration/uvmf_caliptra_top/uvmf_template_output/project_benches/caliptra_top/tb/tests/src/caliptra_top_wdt_test.svh similarity index 64% rename from src/integration/uvmf_caliptra_top/uvmf_template_output/project_benches/caliptra_top/tb/tests/src/caliptra_top_fw_update_test.svh rename to src/integration/uvmf_caliptra_top/uvmf_template_output/project_benches/caliptra_top/tb/tests/src/caliptra_top_wdt_test.svh index 465e52581..504820b6c 100644 --- a/src/integration/uvmf_caliptra_top/uvmf_template_output/project_benches/caliptra_top/tb/tests/src/caliptra_top_fw_update_test.svh +++ b/src/integration/uvmf_caliptra_top/uvmf_template_output/project_benches/caliptra_top/tb/tests/src/caliptra_top_wdt_test.svh @@ -24,15 +24,15 @@ // changes to test_top using the UVM factory type_override: // // Test scenario: -// Randomized activity to mailbox +// Randomized activity to Caliptra // //---------------------------------------------------------------------- //---------------------------------------------------------------------- // -class caliptra_top_fw_update_test extends test_top; +class caliptra_top_wdt_test extends test_top; - `uvm_component_utils( caliptra_top_fw_update_test ); + `uvm_component_utils( caliptra_top_wdt_test ); function new( string name = "", uvm_component parent = null ); super.new( name, parent ); @@ -41,7 +41,7 @@ class caliptra_top_fw_update_test extends test_top; virtual function void build_phase(uvm_phase phase); // The factory override below is an example of how to replace the caliptra_top_bench_sequence_base // sequence with the example_derived_test_sequence. - caliptra_top_bench_sequence_base::type_id::set_type_override(caliptra_top_fw_update_sequence::get_type()); + caliptra_top_bench_sequence_base::type_id::set_type_override(caliptra_top_wdt_sequence::get_type()); // Execute the build_phase of test_top AFTER all factory overrides have been created. super.build_phase(phase); // pragma uvmf custom configuration_settings_post_randomize begin @@ -50,6 +50,20 @@ class caliptra_top_fw_update_test extends test_top; // pragma uvmf custom configuration_settings_post_randomize end endfunction + // FIXME this disables uvm_warning messages! We should fix the warnings, but for + // now this reduces sim.log (for regressions) to a manageable level + // NOTE: UVM_WARNING now re-enabled, need to clean this up after some regression cycles + virtual function void start_of_simulation_phase(uvm_phase phase); + super.start_of_simulation_phase(phase); + if ($test$plusargs("CLP_REGRESSION")) begin + uvm_top.set_report_verbosity_level_hier(UVM_NONE); +// this.environment.soc_ifc_subenv.soc_ifc_pred.set_report_severity_action(UVM_WARNING,UVM_NO_ACTION); +// this.environment.soc_ifc_subenv.soc_ifc_sb.set_report_severity_action(UVM_WARNING,UVM_NO_ACTION); + // Since en_sb is recently set to 0, this is unavailable and gives null-object + //this.environment.soc_ifc_subenv.qvip_apb5_slave_subenv.apb5_master_0.get_analysis_component("checker").set_report_severity_id_action(UVM_WARNING,"scoreboard_debug",UVM_NO_ACTION); + end + endfunction + endclass // pragma uvmf custom external begin diff --git a/src/integration/uvmf_caliptra_top/uvmf_template_output/project_benches/caliptra_top/tb/tests/src/caliptra_top_wdt_test.yml b/src/integration/uvmf_caliptra_top/uvmf_template_output/project_benches/caliptra_top/tb/tests/src/caliptra_top_wdt_test.yml new file mode 100644 index 000000000..1f1af25ad --- /dev/null +++ b/src/integration/uvmf_caliptra_top/uvmf_template_output/project_benches/caliptra_top/tb/tests/src/caliptra_top_wdt_test.yml @@ -0,0 +1,6 @@ +--- +# Random seed desired... +seed: ${PLAYBOOK_RANDOM_SEED} +plusargs: +- '+UVM_TESTNAME=caliptra_top_wdt_test' +testname: caliptra_top_wdt_test diff --git a/src/integration/uvmf_caliptra_top/uvmf_template_output/project_benches/caliptra_top/tb/tests/src/test_top.svh b/src/integration/uvmf_caliptra_top/uvmf_template_output/project_benches/caliptra_top/tb/tests/src/test_top.svh index d7b840b4a..1d0b78285 100644 --- a/src/integration/uvmf_caliptra_top/uvmf_template_output/project_benches/caliptra_top/tb/tests/src/test_top.svh +++ b/src/integration/uvmf_caliptra_top/uvmf_template_output/project_benches/caliptra_top/tb/tests/src/test_top.svh @@ -52,7 +52,8 @@ qvip_memory_message_handler message_handler; soc_ifc_subenv_soc_ifc_ctrl_agent_BFM /* soc_ifc_subenv_soc_ifc_ctrl_agent [2] */ , soc_ifc_subenv_cptra_ctrl_agent_BFM /* soc_ifc_subenv_cptra_ctrl_agent [3] */ , soc_ifc_subenv_soc_ifc_status_agent_BFM /* soc_ifc_subenv_soc_ifc_status_agent [4] */ , - soc_ifc_subenv_cptra_status_agent_BFM /* soc_ifc_subenv_cptra_status_agent [5] */ + soc_ifc_subenv_cptra_status_agent_BFM /* soc_ifc_subenv_cptra_status_agent [5] */ , + soc_ifc_subenv_mbox_sram_agent_BFM /* soc_ifc_subenv_mbox_sram_agent [6] */ }; uvmf_active_passive_t interface_activities[] = { @@ -61,7 +62,8 @@ uvmf_active_passive_t interface_activities[] = { ACTIVE /* soc_ifc_subenv_soc_ifc_ctrl_agent [2] */ , PASSIVE /* soc_ifc_subenv_cptra_ctrl_agent [3] */ , ACTIVE /* soc_ifc_subenv_soc_ifc_status_agent [4] */ , - PASSIVE /* soc_ifc_subenv_cptra_status_agent [5] */ }; + PASSIVE /* soc_ifc_subenv_cptra_status_agent [5] */ , + ACTIVE /* soc_ifc_subenv_mbox_sram_agent [6] */ }; // pragma uvmf custom class_item_additional begin // pragma uvmf custom class_item_additional end diff --git a/src/integration/uvmf_caliptra_top/uvmf_template_output/verification_ip/environment_packages/caliptra_top_env_pkg/src/caliptra_top_env_configuration.svh b/src/integration/uvmf_caliptra_top/uvmf_template_output/verification_ip/environment_packages/caliptra_top_env_pkg/src/caliptra_top_env_configuration.svh index 8c57ff4c2..52763e73d 100644 --- a/src/integration/uvmf_caliptra_top/uvmf_template_output/verification_ip/environment_packages/caliptra_top_env_pkg/src/caliptra_top_env_configuration.svh +++ b/src/integration/uvmf_caliptra_top/uvmf_template_output/verification_ip/environment_packages/caliptra_top_env_pkg/src/caliptra_top_env_configuration.svh @@ -130,11 +130,11 @@ rand soc_ifc_subenv_config_t soc_ifc_subenv_config; super.initialize(sim_level, environment_path, interface_names, register_model, interface_activity); // Interface initialization for sub-environments - soc_ifc_subenv_interface_names = new[6]; - soc_ifc_subenv_interface_activity = new[6]; + soc_ifc_subenv_interface_names = new[7]; + soc_ifc_subenv_interface_activity = new[7]; - soc_ifc_subenv_interface_names = interface_names[0:5]; - soc_ifc_subenv_interface_activity = interface_activity[0:5]; + soc_ifc_subenv_interface_names = interface_names[0:6]; + soc_ifc_subenv_interface_activity = interface_activity[0:6]; diff --git a/src/keyvault/config/compile.yml b/src/keyvault/config/compile.yml index 68cb53727..e0d516e0e 100644 --- a/src/keyvault/config/compile.yml +++ b/src/keyvault/config/compile.yml @@ -21,6 +21,17 @@ targets: files: - $COMPILE_ROOT/rtl/kv_reg_uvm.sv --- +provides: [keyvault_cov] +schema_version: 2.4.0 +targets: + tb: + directories: + - $COMPILE_ROOT/coverage + files: + - $COMPILE_ROOT/coverage/keyvault_cov_if.sv + - $COMPILE_ROOT/coverage/keyvault_cov_props.sv + - $COMPILE_ROOT/coverage/keyvault_cov_bind.sv +--- provides: [keyvault] schema_version: 2.4.0 requires: diff --git a/src/keyvault/config/keyvault.vf b/src/keyvault/config/keyvault.vf index 825fd9d1c..40ef426e3 100644 --- a/src/keyvault/config/keyvault.vf +++ b/src/keyvault/config/keyvault.vf @@ -12,6 +12,7 @@ ${CALIPTRA_ROOT}/src/libs/rtl/apb_slv_sif.sv ${CALIPTRA_ROOT}/src/libs/rtl/ahb_slv_sif.sv ${CALIPTRA_ROOT}/src/libs/rtl/caliptra_icg.sv ${CALIPTRA_ROOT}/src/libs/rtl/clk_gate.sv +${CALIPTRA_ROOT}/src/libs/rtl/caliptra_2ff_sync.sv ${CALIPTRA_ROOT}/src/keyvault/rtl/kv_defines_pkg.sv ${CALIPTRA_ROOT}/src/keyvault/rtl/kv_macros.svh ${CALIPTRA_ROOT}/src/libs/rtl/ahb_to_reg_adapter.sv diff --git a/src/keyvault/config/keyvault_cov.vf b/src/keyvault/config/keyvault_cov.vf new file mode 100644 index 000000000..b5d6ed794 --- /dev/null +++ b/src/keyvault/config/keyvault_cov.vf @@ -0,0 +1,4 @@ ++incdir+${CALIPTRA_ROOT}/src/keyvault/coverage +${CALIPTRA_ROOT}/src/keyvault/coverage/keyvault_cov_if.sv +${CALIPTRA_ROOT}/src/keyvault/coverage/keyvault_cov_props.sv +${CALIPTRA_ROOT}/src/keyvault/coverage/keyvault_cov_bind.sv \ No newline at end of file diff --git a/src/keyvault/coverage/keyvault_cov_bind.sv b/src/keyvault/coverage/keyvault_cov_bind.sv new file mode 100644 index 000000000..7e2311508 --- /dev/null +++ b/src/keyvault/coverage/keyvault_cov_bind.sv @@ -0,0 +1,21 @@ +// SPDX-License-Identifier: Apache-2.0 +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + + +module keyvault_cov_bind; + //`ifdef FCOV + bind dut keyvault_cov_if i_keyvault_cov_if(.*); + bind dut keyvault_cov_props i_keyvault_cov_props(.*); + //`endif +endmodule diff --git a/src/keyvault/coverage/keyvault_cov_if.sv b/src/keyvault/coverage/keyvault_cov_if.sv new file mode 100644 index 000000000..f896c3d02 --- /dev/null +++ b/src/keyvault/coverage/keyvault_cov_if.sv @@ -0,0 +1,143 @@ +// SPDX-License-Identifier: Apache-2.0 +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// This file contains cross coverage for keyvault at the dut level +// This interface is instantiated in uvmf_kv for coverage during randomized UVM tests + +`ifndef VERILATOR + +interface keyvault_cov_if + import kv_defines_pkg::*; + ( + //Keyvault IO + input logic clk, + input logic rst_b, + input logic core_only_rst_b, + input logic cptra_pwrgood, + input logic debugUnlock_or_scan_mode_switch +); + + //Intermediate wires + logic [KV_NUM_KEYS-1:0] key_ctrl_lock_wr; + logic [KV_NUM_KEYS-1:0] key_ctrl_lock_use; + logic [KV_NUM_KEYS-1:0] key_ctrl_clear; + + logic clear_secrets_wr; + logic clear_secrets_sel; + logic [KV_NUM_WRITE-1:0] kv_write_en; + logic ahb_write, ahb_read; + + //Assign clear and locks of each KEY_CTRL reg to corresponding bit in the intermediate bus + generate + for(genvar i = 0; i < KV_NUM_KEYS; i++) begin + assign key_ctrl_lock_wr[i] = dut.kv_reg_hwif_out.KEY_CTRL[i].lock_wr; + assign key_ctrl_lock_use[i] = dut.kv_reg_hwif_out.KEY_CTRL[i].lock_use; + assign key_ctrl_clear[i] = dut.kv_reg_hwif_out.KEY_CTRL[i].clear; + end + endgenerate + + //CLEAR_SECRETS + assign clear_secrets_wr = dut.kv_reg_hwif_out.CLEAR_SECRETS.wr_debug_values; + assign clear_secrets_sel = dut.kv_reg_hwif_out.CLEAR_SECRETS.sel_debug_value; + + //Crypto interface write_en + generate + for(genvar client = 0; client < KV_NUM_WRITE; client++) begin + assign kv_write_en[client] = dut.kv_write[client].write_en; + end + endgenerate + + //AHB signals + assign ahb_write = dut.kv_ahb_slv1.dv & dut.kv_ahb_slv1.write; + assign ahb_read = dut.kv_ahb_slv1.dv & ~dut.kv_ahb_slv1.write; + + covergroup keyvault_top_cov_grp @(posedge clk); + option.per_instance = 1; + debug: coverpoint debugUnlock_or_scan_mode_switch; + + //Note: Bit transitions and values for lock_wr, lock_use and clear are covered + //in UVM reg coverage. This coverpoint bins the 32-bit lock/clear bus so that + //they can be used to cross with other signals + lock_wr: coverpoint key_ctrl_lock_wr { + bins bin0 = {[0:'hFFFF]}; + bins bin1 = {['h1_0000:'hF_FFFF]}; + bins bin2 = {['h10_0000:'hFF_FFFF]}; + bins bin3 = {['h100_0000:'hFFF_FFFF]}; + bins bin4 = {['h1000_0000: 'hFFFF_FFFF]}; + } + lock_use: coverpoint key_ctrl_lock_use { + bins bin0 = {[0:'hFFFF]}; + bins bin1 = {['h1_0000:'hF_FFFF]}; + bins bin2 = {['h10_0000:'hFF_FFFF]}; + bins bin3 = {['h100_0000:'hFFF_FFFF]}; + bins bin4 = {['h1000_0000: 'hFFFF_FFFF]}; + } + clear: coverpoint key_ctrl_clear { + bins bin0 = {[0:'hFFFF]}; + bins bin1 = {['h1_0000:'hF_FFFF]}; + bins bin2 = {['h10_0000:'hFF_FFFF]}; + bins bin3 = {['h100_0000:'hFFF_FFFF]}; + bins bin4 = {['h1000_0000: 'hFFFF_FFFF]}; + } + cp_clear_secrets_sel: coverpoint clear_secrets_sel; + cp_clear_secrets_wr : coverpoint clear_secrets_wr; + cp_ahb_write : coverpoint ahb_write; + cp_ahb_read : coverpoint ahb_read; + + //Cover debug mode unlocked while regs are locked/cleared + debugXlock_wr: cross debug, lock_wr; + debugXlock_use: cross debug, lock_use; + debugXclear: cross debug, clear; + debugXlock_wrXlock_useXclear: cross debug, lock_wr, lock_use, clear; + debugXclear_secrets: cross debug, cp_clear_secrets_wr, cp_clear_secrets_sel; + + //Cover warm reset assertion while regs are locked/cleared + lock_wrXwarm_rst: cross lock_wr, rst_b; + lock_useXwarm_rst: cross lock_use, rst_b; + clearXwarm_rst: cross clear, rst_b; + + //Cover cold reset while regs are locked/cleared + lock_wrXcold_rst: cross lock_wr, cptra_pwrgood; + lock_useXcold_rst: cross lock_use, cptra_pwrgood; + clearXcold_rst: cross clear, cptra_pwrgood; + + //Cover core reset while regs are locked/cleared + lock_wrXcore_rst: cross lock_wr, core_only_rst_b; + lock_useXcore_rst: cross lock_use, core_only_rst_b; + clearXcore_rst: cross clear, core_only_rst_b; + + //Cover simultaneous locks/clear settings + lock_wrXlock_useXclearXclear_secrets: cross lock_wr, lock_use, clear, cp_clear_secrets_wr, cp_clear_secrets_sel; + + //Cross with crypto write. There's no cross with read since reads are async + //Due to this, at any given time, all signals are by default crossed with read IF + lock_wrXkv_write: cross lock_wr, kv_write_en; + lock_useXkv_write: cross lock_use, kv_write_en; + clearXkv_write: cross clear, kv_write_en; + + clear_secretsXkv_write: cross kv_write_en, cp_clear_secrets_wr, cp_clear_secrets_sel; + + //Cover ahb write/read during crypto write and debug mode unlocked + ahbXkv_write: cross cp_ahb_write, cp_ahb_read, kv_write_en; + ahbXdebug: cross cp_ahb_write, cp_ahb_read, debug; //TODO: maybe not a real use case - revisit + + + endgroup + + + keyvault_top_cov_grp keyvault_top_cov_grp1 = new(); + +endinterface + +`endif \ No newline at end of file diff --git a/src/keyvault/coverage/keyvault_cov_props.sv b/src/keyvault/coverage/keyvault_cov_props.sv new file mode 100644 index 000000000..f1ea9b9b7 --- /dev/null +++ b/src/keyvault/coverage/keyvault_cov_props.sv @@ -0,0 +1,56 @@ +// SPDX-License-Identifier: Apache-2.0 +// Copyright 2019 Western Digital Corporation or its affiliates. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +// This file contains properties that define various sequences of events in KV + +module keyvault_cov_props + import kv_defines_pkg::*; + (); + + `ifndef VERILATOR + + //clear_secrets followed by warm reset in the next clk + //Expectation: Keys cleared before warm reset + property cover_prop_clear_secr_warm_rst; + @(posedge dut.clk) + (dut.kv_reg_hwif_out.CLEAR_SECRETS.wr_debug_values |-> ##[1:$] !dut.rst_b); + endproperty + covprop_clear_secr_warmrst: cover property(cover_prop_clear_secr_warm_rst); + + generate + for(genvar i = 0; i < KV_NUM_KEYS; i++) begin + + //lock write => clear secrets => warm reset in next clk + //Expectation: Keys will be flushed since reset is not seen until next clk, locks are reset + property cover_prop_locks_clear_secr_warm_rst; + @(posedge dut.clk) + (dut.kv_reg_hwif_out.KEY_CTRL[i].lock_wr && dut.kv_reg_hwif_out.CLEAR_SECRETS.wr_debug_values |-> ##[1:$] !dut.rst_b); + endproperty + covprop_lock_clear_secr_warmrst: cover property(cover_prop_locks_clear_secr_warm_rst); + + //lock write => clear secrets => cold reset in next clk + //Expectation: Keys will be flushed since reset is not seen until next clk, locks and keys are reset once cold reset happens + property cover_prop_locks_clear_secr_cold_rst; + @(posedge dut.clk) + (dut.kv_reg_hwif_out.KEY_CTRL[i].lock_wr && dut.kv_reg_hwif_out.CLEAR_SECRETS.wr_debug_values |-> ##[1:$] !dut.cptra_pwrgood); + endproperty + covprop_lock_clear_secr_coldrst: cover property(cover_prop_locks_clear_secr_cold_rst); + end + endgenerate + + `endif + +endmodule \ No newline at end of file diff --git a/src/keyvault/rtl/kv.sv b/src/keyvault/rtl/kv.sv index 541d8f7de..4188fde2f 100644 --- a/src/keyvault/rtl/kv.sv +++ b/src/keyvault/rtl/kv.sv @@ -29,7 +29,8 @@ module kv input logic rst_b, input logic core_only_rst_b, input logic cptra_pwrgood, - + input logic fw_update_rst_window, + input logic cptra_in_debug_scan_mode, input logic debugUnlock_or_scan_mode_switch, //uC AHB Lite Interface @@ -61,8 +62,6 @@ logic kv_reg_read_error, kv_reg_write_error; logic [AHB_ADDR_WIDTH-1:0] uc_req_addr; kv_uc_req_t uc_req; -logic debug_locked_f; -logic debug_unlocked; logic flush_keyvault; logic [31:0] debug_value; @@ -72,10 +71,13 @@ logic [KV_NUM_KEYS-1:0] key_entry_ctrl_we; logic [KV_NUM_KEYS-1:0][KV_NUM_DWORDS-1:0][31:0] key_entry_next; logic [KV_NUM_KEYS-1:0][KV_NUM_READ-1:0] key_entry_dest_valid_next; logic [KV_NUM_KEYS-1:0][KV_ENTRY_SIZE_W-1:0] key_entry_last_dword_next; - +logic [KV_NUM_KEYS-1:0] lock_wr_q; +logic [KV_NUM_KEYS-1:0] lock_use_q; kv_reg__in_t kv_reg_hwif_in; kv_reg__out_t kv_reg_hwif_out; +logic [KV_NUM_KEYS-1:0] key_entry_clear; + ahb_slv_sif #( .AHB_ADDR_WIDTH(AHB_ADDR_WIDTH), .AHB_DATA_WIDTH(AHB_DATA_WIDTH), @@ -114,7 +116,8 @@ always_comb uc_req_error = kv_reg_read_error | kv_reg_write_error; always_comb uc_req_hold = '0; //Flush the keyvault with the debug value when FW pokes the register or we detect debug mode unlocking -always_comb flush_keyvault = debugUnlock_or_scan_mode_switch | kv_reg_hwif_out.CLEAR_SECRETS.wr_debug_values.value; +always_comb flush_keyvault = debugUnlock_or_scan_mode_switch | + (cptra_in_debug_scan_mode & kv_reg_hwif_out.CLEAR_SECRETS.wr_debug_values.value); //Pick between keyvault debug mode 0 or 1 always_comb debug_value = kv_reg_hwif_out.CLEAR_SECRETS.sel_debug_value.value ? CLP_DEBUG_MODE_KV_1 : CLP_DEBUG_MODE_KV_0; @@ -124,28 +127,52 @@ always_comb begin : keyvault_pcr_signing end end +//Generate clear signal for each key entry +//don't clear when writes are locked +//hold the clear when writes are in progress +generate + for (genvar g_entry = 0; g_entry < KV_NUM_KEYS; g_entry++) begin + always_ff@(posedge clk or negedge rst_b) begin + if(~rst_b) begin + key_entry_clear[g_entry] <= '0; + end + else begin + key_entry_clear[g_entry] <= (kv_reg_hwif_out.KEY_CTRL[g_entry].clear.value & ~lock_wr_q[g_entry] & ~lock_use_q[g_entry]) | + (key_entry_clear[g_entry] & key_entry_ctrl_we[g_entry]); + end + end + end +endgenerate + always_comb begin : keyvault_ctrl //keyvault control registers for (int entry = 0; entry < KV_NUM_KEYS; entry++) begin - //once lock is set, only reset can unset it - kv_reg_hwif_in.KEY_CTRL[entry].lock_wr.swwel = kv_reg_hwif_out.KEY_CTRL[entry].lock_wr.value; - kv_reg_hwif_in.KEY_CTRL[entry].lock_use.swwel = kv_reg_hwif_out.KEY_CTRL[entry].lock_use.value; - //clear dest valid and last dword - kv_reg_hwif_in.KEY_CTRL[entry].dest_valid.hwclr = kv_reg_hwif_out.KEY_CTRL[entry].clear.value & ~kv_reg_hwif_out.KEY_CTRL[entry].lock_wr.value & ~kv_reg_hwif_out.KEY_CTRL[entry].lock_use.value; - kv_reg_hwif_in.KEY_CTRL[entry].last_dword.hwclr = kv_reg_hwif_out.KEY_CTRL[entry].clear.value & ~kv_reg_hwif_out.KEY_CTRL[entry].lock_wr.value & ~kv_reg_hwif_out.KEY_CTRL[entry].lock_use.value; //init for AND-OR key_entry_ctrl_we[entry] = '0; key_entry_dest_valid_next[entry] = '0; key_entry_last_dword_next[entry] = '0; + + //Qualify lock signals as they are on fw upd reset and create RDC violations if allowed to reset asynchronously + lock_wr_q[entry] = kv_reg_hwif_out.KEY_CTRL[entry].lock_wr.value & ~fw_update_rst_window; + lock_use_q[entry] = kv_reg_hwif_out.KEY_CTRL[entry].lock_use.value & ~fw_update_rst_window; + for (int client = 0; client < KV_NUM_WRITE; client++) begin - key_entry_ctrl_we[entry] |= (kv_write[client].write_entry == entry) & kv_write[client].write_en; - key_entry_dest_valid_next[entry] |= kv_write[client].write_en & (kv_write[client].write_entry == entry) ? kv_write[client].write_dest_valid : '0; + key_entry_ctrl_we[entry] |= (kv_write[client].write_entry == entry) & kv_write[client].write_en & + ~lock_wr_q[entry] & ~lock_use_q[entry]; + key_entry_dest_valid_next[entry] |= (kv_write[client].write_entry == entry) & kv_write[client].write_en ? kv_write[client].write_dest_valid : '0; //store the final offset on the last write cycle, we'll use that to signal last dword on reads - key_entry_last_dword_next[entry] |= kv_write[client].write_en & (kv_write[client].write_entry == entry) ? kv_write[client].write_offset : '0; + key_entry_last_dword_next[entry] |= (kv_write[client].write_entry == entry) & kv_write[client].write_en ? kv_write[client].write_offset : '0; end - kv_reg_hwif_in.KEY_CTRL[entry].dest_valid.we = key_entry_ctrl_we[entry]; + //once lock is set, only reset can unset it + kv_reg_hwif_in.KEY_CTRL[entry].lock_wr.swwel = lock_wr_q[entry]; + kv_reg_hwif_in.KEY_CTRL[entry].lock_use.swwel = lock_use_q[entry]; + //clear dest valid and last dword + kv_reg_hwif_in.KEY_CTRL[entry].dest_valid.hwclr = key_entry_clear[entry]; + kv_reg_hwif_in.KEY_CTRL[entry].last_dword.hwclr = key_entry_clear[entry]; + + kv_reg_hwif_in.KEY_CTRL[entry].dest_valid.we = key_entry_ctrl_we[entry] & ~key_entry_clear[entry]; kv_reg_hwif_in.KEY_CTRL[entry].dest_valid.next = key_entry_dest_valid_next[entry]; - kv_reg_hwif_in.KEY_CTRL[entry].last_dword.we = key_entry_ctrl_we[entry]; + kv_reg_hwif_in.KEY_CTRL[entry].last_dword.we = key_entry_ctrl_we[entry] & ~key_entry_clear[entry]; kv_reg_hwif_in.KEY_CTRL[entry].last_dword.next = key_entry_last_dword_next[entry]; end @@ -161,15 +188,13 @@ always_comb begin : keyvault_ctrl for (int client = 0; client < KV_NUM_WRITE; client++) begin key_entry_we[entry][dword] |= ((((kv_write[client].write_entry == entry) & (kv_write[client].write_offset == dword) & kv_write[client].write_en) | flush_keyvault) & - ~kv_reg_hwif_out.KEY_CTRL[entry].lock_wr.value & - ~kv_reg_hwif_out.KEY_CTRL[entry].lock_use.value | debugUnlock_or_scan_mode_switch); + ((~lock_wr_q[entry] & ~lock_use_q[entry]) | debugUnlock_or_scan_mode_switch)); key_entry_next[entry][dword] |= flush_keyvault ? debug_value : kv_write[client].write_en & (kv_write[client].write_entry == entry) ? kv_write[client].write_data : '0; end - kv_reg_hwif_in.KEY_ENTRY[entry][dword].data.we = key_entry_we[entry][dword]; + kv_reg_hwif_in.KEY_ENTRY[entry][dword].data.we = key_entry_we[entry][dword] & ~key_entry_clear[entry]; kv_reg_hwif_in.KEY_ENTRY[entry][dword].data.next = key_entry_next[entry][dword]; - //don't clear when writes are locked - kv_reg_hwif_in.KEY_ENTRY[entry][dword].data.hwclr = kv_reg_hwif_out.KEY_CTRL[entry].clear.value & ~kv_reg_hwif_out.KEY_CTRL[entry].lock_wr.value & ~kv_reg_hwif_out.KEY_CTRL[entry].lock_use.value; + kv_reg_hwif_in.KEY_ENTRY[entry][dword].data.hwclr = key_entry_clear[entry]; end end end @@ -186,25 +211,24 @@ always_comb begin : keyvault_readmux for (int entry = 0; entry < KV_NUM_KEYS; entry++) begin for (int dword = 0; dword < KV_NUM_DWORDS; dword++) begin kv_rd_resp[client].read_data |= (kv_read[client].read_entry == entry) & (kv_read[client].read_offset == dword) & - ~kv_reg_hwif_out.KEY_CTRL[entry].lock_use.value & kv_reg_hwif_out.KEY_CTRL[entry].dest_valid.value[client] ? + ~lock_use_q[entry] & kv_reg_hwif_out.KEY_CTRL[entry].dest_valid.value[client] ? kv_reg_hwif_out.KEY_ENTRY[entry][dword].data.value : '0; end //signal last when reading the last dword kv_rd_resp[client].last |= (kv_read[client].read_entry == entry) & (kv_read[client].read_offset == kv_reg_hwif_out.KEY_CTRL[entry].last_dword); kv_rd_resp[client].error |= (kv_read[client].read_entry == entry) & - (kv_reg_hwif_out.KEY_CTRL[entry].lock_use.value | ~kv_reg_hwif_out.KEY_CTRL[entry].dest_valid.value[client]); + (lock_use_q[entry] | ~kv_reg_hwif_out.KEY_CTRL[entry].dest_valid.value[client]); end end end -//Write error when attempting to write to entry that is locked for writes +//Write error when attempting to write to entry that is locked for writes, use, or is being cleared always_comb begin : keyvault_write_resp for (int client = 0 ; client < KV_NUM_WRITE; client++) begin kv_wr_resp[client].error = '0; for (int entry = 0; entry < KV_NUM_KEYS; entry++) begin kv_wr_resp[client].error |= (kv_write[client].write_entry == entry) & kv_write[client].write_en & - kv_reg_hwif_out.KEY_CTRL[entry].lock_wr.value & - kv_reg_hwif_out.KEY_CTRL[entry].lock_use.value; + (key_entry_clear[entry] | lock_wr_q[entry] | lock_use_q[entry]); end end end diff --git a/src/keyvault/rtl/kv_fsm.sv b/src/keyvault/rtl/kv_fsm.sv index 4cffedd11..d0c770834 100644 --- a/src/keyvault/rtl/kv_fsm.sv +++ b/src/keyvault/rtl/kv_fsm.sv @@ -25,6 +25,7 @@ module kv_fsm ( input logic clk, input logic rst_b, + input logic zeroize, input logic start, input logic last, @@ -37,6 +38,7 @@ module kv_fsm output logic [OFFSET_W-1:0] write_offset, output logic write_pad, output logic [31:0] pad_data, + output logic write_last, output logic ready, @@ -95,6 +97,7 @@ always_comb arc_KV_LENGTH_KV_DONE = kv_fsm_ps == KV_LENGTH; always_comb arc_KV_DONE_KV_IDLE = '1; always_comb offset_rst = arc_KV_RW_KV_DONE | arc_KV_LENGTH_KV_DONE; +always_comb write_last = arc_KV_RW_KV_DONE | arc_KV_LENGTH_KV_DONE; always_comb begin : kv_fsm_comb kv_fsm_ns = kv_fsm_ps; @@ -154,6 +157,11 @@ always_ff @(posedge clk or negedge rst_b) begin offset <= '0; num_dwords_data <= '0; end + else if (zeroize) begin + kv_fsm_ps <= KV_IDLE; + offset <= '0; + num_dwords_data <= '0; + end else begin kv_fsm_ps <= kv_fsm_ns; offset <= offset_rst ? '0 : diff --git a/src/keyvault/rtl/kv_read_client.sv b/src/keyvault/rtl/kv_read_client.sv index 810d394a0..a556604b1 100644 --- a/src/keyvault/rtl/kv_read_client.sv +++ b/src/keyvault/rtl/kv_read_client.sv @@ -26,6 +26,7 @@ module kv_read_client ( input logic clk, input logic rst_b, + input logic zeroize, //client control register input kv_read_ctrl_reg_t read_ctrl_reg, @@ -58,6 +59,7 @@ kv_read_fsm ( .clk(clk), .rst_b(rst_b), + .zeroize(zeroize), .start(read_ctrl_reg.read_en), .last (kv_resp.last), .pcr_hash_extend(read_ctrl_reg.pcr_hash_extend), @@ -65,6 +67,7 @@ kv_read_fsm .write_en(write_en), .write_offset(write_offset), .write_pad(write_pad), + .write_last(), .pad_data(pad_data), .ready(kv_ready), .done(read_done) @@ -79,6 +82,9 @@ always_ff @(posedge clk or negedge rst_b) begin if (!rst_b) begin error_code <= KV_SUCCESS; end + else if (zeroize) begin + error_code <= KV_SUCCESS; + end else begin error_code <= read_ctrl_reg.read_en & kv_resp.error ? KV_READ_FAIL : read_ctrl_reg.read_en & ~kv_resp.error ? KV_SUCCESS : error_code; diff --git a/src/keyvault/rtl/kv_reg.rdl b/src/keyvault/rtl/kv_reg.rdl index 330d9a20b..ee721eb61 100644 --- a/src/keyvault/rtl/kv_reg.rdl +++ b/src/keyvault/rtl/kv_reg.rdl @@ -26,9 +26,9 @@ addrmap kv_reg { reg kvCtrl { desc="Controls for each keyvault and pcr entry"; field {desc="Lock writes to this entry. Writes will be suppressed and an error will be recorded."; - sw=rw; swwel=true; hw=r; resetsignal=core_only_rst_b;} lock_wr=0; //warm reset + sw=rw; swwel=true; hw=r; resetsignal=core_only_rst_b;} lock_wr=0; //fw upd reset field {desc="Lock use of this entry. Reads will be suppressed and an error will be recorded."; - sw=rw; swwel=true; hw=r; resetsignal=core_only_rst_b;} lock_use=0; //warm reset + sw=rw; swwel=true; hw=r; resetsignal=core_only_rst_b;} lock_use=0; //fw upd reset field {desc="Clear the data stored in this entry. Lock write will prevent this clear."; sw=rw; hw=r; singlepulse;} clear=0; field {desc="Reserved"; diff --git a/src/keyvault/rtl/kv_reg_covergroups.svh b/src/keyvault/rtl/kv_reg_covergroups.svh new file mode 100644 index 000000000..a05ec2fe6 --- /dev/null +++ b/src/keyvault/rtl/kv_reg_covergroups.svh @@ -0,0 +1,97 @@ +// SPDX-License-Identifier: Apache-2.0 +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +`ifndef KV_REG_COVERGROUPS + `define KV_REG_COVERGROUPS + + /*----------------------- KV_REG__KVCTRL COVERGROUPS -----------------------*/ + covergroup kv_reg__kvCtrl_bit_cg with function sample(input bit reg_bit); + option.per_instance = 1; + reg_bit_cp : coverpoint reg_bit { + bins value[2] = {0,1}; + } + reg_bit_edge_cp : coverpoint reg_bit { + bins rise = (0 => 1); + bins fall = (1 => 0); + } + + endgroup + covergroup kv_reg__kvCtrl_fld_cg with function sample( + input bit [1-1:0] lock_wr, + input bit [1-1:0] lock_use, + input bit [1-1:0] clear, + input bit [1-1:0] rsvd0, + input bit [5-1:0] rsvd1, + input bit [8-1:0] dest_valid, + input bit [4-1:0] last_dword + ); + option.per_instance = 1; + lock_wr_cp : coverpoint lock_wr; + lock_use_cp : coverpoint lock_use; + clear_cp : coverpoint clear; + // rsvd0_cp : coverpoint rsvd0; + // rsvd1_cp : coverpoint rsvd1; + dest_valid_cp : coverpoint dest_valid { + illegal_bins dest_valid_bit5to7 = {['d32:'d255]}; + } + last_dword_cp : coverpoint last_dword { + illegal_bins last_dword_12to15 = {['d12:'d15]}; + } + wrXuseXclear: cross lock_wr_cp, lock_use_cp, clear_cp; + + endgroup + + /*----------------------- KV_REG__KEYREG COVERGROUPS -----------------------*/ + covergroup kv_reg__keyReg_bit_cg with function sample(input bit reg_bit); + option.per_instance = 1; + reg_bit_cp : coverpoint reg_bit { + bins value[2] = {0,1}; + } + reg_bit_edge_cp : coverpoint reg_bit { + bins rise = (0 => 1); + bins fall = (1 => 0); + } + + endgroup + covergroup kv_reg__keyReg_fld_cg with function sample( + input bit [32-1:0] data + ); + option.per_instance = 1; + data_cp : coverpoint data; + + endgroup + + /*----------------------- KV_REG__CLEAR_SECRETS COVERGROUPS -----------------------*/ + covergroup kv_reg__CLEAR_SECRETS_bit_cg with function sample(input bit reg_bit); + option.per_instance = 1; + reg_bit_cp : coverpoint reg_bit { + bins value[2] = {0,1}; + } + reg_bit_edge_cp : coverpoint reg_bit { + bins rise = (0 => 1); + bins fall = (1 => 0); + } + + endgroup + covergroup kv_reg__CLEAR_SECRETS_fld_cg with function sample( + input bit [1-1:0] wr_debug_values, + input bit [1-1:0] sel_debug_value + ); + option.per_instance = 1; + wr_debug_values_cp : coverpoint wr_debug_values; + sel_debug_value_cp : coverpoint sel_debug_value; + + endgroup + +`endif \ No newline at end of file diff --git a/src/keyvault/rtl/kv_reg_sample.svh b/src/keyvault/rtl/kv_reg_sample.svh new file mode 100644 index 000000000..1ab285ca2 --- /dev/null +++ b/src/keyvault/rtl/kv_reg_sample.svh @@ -0,0 +1,107 @@ +// SPDX-License-Identifier: Apache-2.0 +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +`ifndef KV_REG_SAMPLE + `define KV_REG_SAMPLE + + /*----------------------- KV_REG__KVCTRL SAMPLE FUNCTIONS -----------------------*/ + function void kv_reg__kvCtrl::sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); + m_current = get(); + m_data = data; + m_is_read = is_read; + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(lock_wr_bit_cg[bt]) this.lock_wr_bit_cg[bt].sample(data[0 + bt]); + foreach(lock_use_bit_cg[bt]) this.lock_use_bit_cg[bt].sample(data[1 + bt]); + foreach(clear_bit_cg[bt]) this.clear_bit_cg[bt].sample(data[2 + bt]); + foreach(rsvd0_bit_cg[bt]) this.rsvd0_bit_cg[bt].sample(data[3 + bt]); + foreach(rsvd1_bit_cg[bt]) this.rsvd1_bit_cg[bt].sample(data[4 + bt]); + foreach(dest_valid_bit_cg[bt]) this.dest_valid_bit_cg[bt].sample(data[9 + bt]); + foreach(last_dword_bit_cg[bt]) this.last_dword_bit_cg[bt].sample(data[17 + bt]); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( data[0:0]/*lock_wr*/ , data[1:1]/*lock_use*/ , data[2:2]/*clear*/ , data[3:3]/*rsvd0*/ , data[8:4]/*rsvd1*/ , data[16:9]/*dest_valid*/ , data[20:17]/*last_dword*/ ); + end + endfunction + + function void kv_reg__kvCtrl::sample_values(); + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(lock_wr_bit_cg[bt]) this.lock_wr_bit_cg[bt].sample(lock_wr.get_mirrored_value() >> bt); + foreach(lock_use_bit_cg[bt]) this.lock_use_bit_cg[bt].sample(lock_use.get_mirrored_value() >> bt); + foreach(clear_bit_cg[bt]) this.clear_bit_cg[bt].sample(clear.get_mirrored_value() >> bt); + foreach(rsvd0_bit_cg[bt]) this.rsvd0_bit_cg[bt].sample(rsvd0.get_mirrored_value() >> bt); + foreach(rsvd1_bit_cg[bt]) this.rsvd1_bit_cg[bt].sample(rsvd1.get_mirrored_value() >> bt); + foreach(dest_valid_bit_cg[bt]) this.dest_valid_bit_cg[bt].sample(dest_valid.get_mirrored_value() >> bt); + foreach(last_dword_bit_cg[bt]) this.last_dword_bit_cg[bt].sample(last_dword.get_mirrored_value() >> bt); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( lock_wr.get_mirrored_value() , lock_use.get_mirrored_value() , clear.get_mirrored_value() , rsvd0.get_mirrored_value() , rsvd1.get_mirrored_value() , dest_valid.get_mirrored_value() , last_dword.get_mirrored_value() ); + end + endfunction + + /*----------------------- KV_REG__KEYREG SAMPLE FUNCTIONS -----------------------*/ + function void kv_reg__keyReg::sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); + m_current = get(); + m_data = data; + m_is_read = is_read; + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(data_bit_cg[bt]) this.data_bit_cg[bt].sample(data[0 + bt]); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( data[31:0]/*data*/ ); + end + endfunction + + function void kv_reg__keyReg::sample_values(); + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(data_bit_cg[bt]) this.data_bit_cg[bt].sample(data.get_mirrored_value() >> bt); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( data.get_mirrored_value() ); + end + endfunction + + /*----------------------- KV_REG__CLEAR_SECRETS SAMPLE FUNCTIONS -----------------------*/ + function void kv_reg__CLEAR_SECRETS::sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); + m_current = get(); + m_data = data; + m_is_read = is_read; + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(wr_debug_values_bit_cg[bt]) this.wr_debug_values_bit_cg[bt].sample(data[0 + bt]); + foreach(sel_debug_value_bit_cg[bt]) this.sel_debug_value_bit_cg[bt].sample(data[1 + bt]); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( data[0:0]/*wr_debug_values*/ , data[1:1]/*sel_debug_value*/ ); + end + endfunction + + function void kv_reg__CLEAR_SECRETS::sample_values(); + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(wr_debug_values_bit_cg[bt]) this.wr_debug_values_bit_cg[bt].sample(wr_debug_values.get_mirrored_value() >> bt); + foreach(sel_debug_value_bit_cg[bt]) this.sel_debug_value_bit_cg[bt].sample(sel_debug_value.get_mirrored_value() >> bt); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( wr_debug_values.get_mirrored_value() , sel_debug_value.get_mirrored_value() ); + end + endfunction + +`endif \ No newline at end of file diff --git a/src/keyvault/rtl/kv_reg_uvm.sv b/src/keyvault/rtl/kv_reg_uvm.sv index 2d4b86f00..39166e179 100644 --- a/src/keyvault/rtl/kv_reg_uvm.sv +++ b/src/keyvault/rtl/kv_reg_uvm.sv @@ -3,9 +3,21 @@ package kv_reg_uvm; `include "uvm_macros.svh" import uvm_pkg::*; - + `include "kv_reg_covergroups.svh" // Reg - kv_reg::kvCtrl class kv_reg__kvCtrl extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + kv_reg__kvCtrl_bit_cg lock_wr_bit_cg[1]; + kv_reg__kvCtrl_bit_cg lock_use_bit_cg[1]; + kv_reg__kvCtrl_bit_cg clear_bit_cg[1]; + kv_reg__kvCtrl_bit_cg rsvd0_bit_cg[1]; + kv_reg__kvCtrl_bit_cg rsvd1_bit_cg[5]; + kv_reg__kvCtrl_bit_cg dest_valid_bit_cg[8]; + kv_reg__kvCtrl_bit_cg last_dword_bit_cg[4]; + kv_reg__kvCtrl_fld_cg fld_cg; rand uvm_reg_field lock_wr; rand uvm_reg_field lock_use; rand uvm_reg_field clear; @@ -15,8 +27,13 @@ package kv_reg_uvm; rand uvm_reg_field last_dword; function new(string name = "kv_reg__kvCtrl"); - super.new(name, 32, UVM_NO_COVERAGE); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); virtual function void build(); this.lock_wr = new("lock_wr"); @@ -33,37 +50,82 @@ package kv_reg_uvm; this.dest_valid.configure(this, 8, 9, "RO", 1, 'h0, 1, 1, 0); this.last_dword = new("last_dword"); this.last_dword.configure(this, 4, 17, "RO", 1, 'h0, 1, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(lock_wr_bit_cg[bt]) lock_wr_bit_cg[bt] = new(); + foreach(lock_use_bit_cg[bt]) lock_use_bit_cg[bt] = new(); + foreach(clear_bit_cg[bt]) clear_bit_cg[bt] = new(); + foreach(rsvd0_bit_cg[bt]) rsvd0_bit_cg[bt] = new(); + foreach(rsvd1_bit_cg[bt]) rsvd1_bit_cg[bt] = new(); + foreach(dest_valid_bit_cg[bt]) dest_valid_bit_cg[bt] = new(); + foreach(last_dword_bit_cg[bt]) last_dword_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); endfunction : build endclass : kv_reg__kvCtrl // Reg - kv_reg::keyReg class kv_reg__keyReg extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + kv_reg__keyReg_bit_cg data_bit_cg[32]; + kv_reg__keyReg_fld_cg fld_cg; rand uvm_reg_field data; function new(string name = "kv_reg__keyReg"); - super.new(name, 32, UVM_NO_COVERAGE); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); virtual function void build(); this.data = new("data"); this.data.configure(this, 32, 0, "WO", 1, 'h0, 1, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(data_bit_cg[bt]) data_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); endfunction : build endclass : kv_reg__keyReg // Reg - kv_reg::CLEAR_SECRETS class kv_reg__CLEAR_SECRETS extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + kv_reg__CLEAR_SECRETS_bit_cg wr_debug_values_bit_cg[1]; + kv_reg__CLEAR_SECRETS_bit_cg sel_debug_value_bit_cg[1]; + kv_reg__CLEAR_SECRETS_fld_cg fld_cg; rand uvm_reg_field wr_debug_values; rand uvm_reg_field sel_debug_value; function new(string name = "kv_reg__CLEAR_SECRETS"); - super.new(name, 32, UVM_NO_COVERAGE); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); virtual function void build(); this.wr_debug_values = new("wr_debug_values"); this.wr_debug_values.configure(this, 1, 0, "RW", 0, 'h0, 1, 1, 0); this.sel_debug_value = new("sel_debug_value"); this.sel_debug_value.configure(this, 1, 1, "RW", 0, 'h0, 1, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(wr_debug_values_bit_cg[bt]) wr_debug_values_bit_cg[bt] = new(); + foreach(sel_debug_value_bit_cg[bt]) sel_debug_value_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); endfunction : build endclass : kv_reg__CLEAR_SECRETS @@ -101,4 +163,5 @@ package kv_reg_uvm; endfunction : build endclass : kv_reg + `include "kv_reg_sample.svh" endpackage: kv_reg_uvm diff --git a/src/keyvault/rtl/kv_write_client.sv b/src/keyvault/rtl/kv_write_client.sv index 2211cd1a7..f8a2ca670 100644 --- a/src/keyvault/rtl/kv_write_client.sv +++ b/src/keyvault/rtl/kv_write_client.sv @@ -26,6 +26,7 @@ module kv_write_client ( input logic clk, input logic rst_b, + input logic zeroize, //client control register input kv_write_ctrl_reg_t write_ctrl_reg, @@ -49,6 +50,7 @@ logic [DATA_OFFSET_W-1:0] dest_write_offset; logic dest_write_en; logic [31:0] pad_data; logic write_pad; +logic write_last; //dest write block kv_fsm #( @@ -59,6 +61,7 @@ kv_dest_write_fsm ( .clk(clk), .rst_b(rst_b), + .zeroize(zeroize), .start(dest_data_avail & write_ctrl_reg.write_en), .last('0), .pcr_hash_extend(1'b0), @@ -66,6 +69,7 @@ kv_dest_write_fsm .write_en(dest_write_en), .write_offset(dest_write_offset), .write_pad(write_pad), + .write_last(write_last), .pad_data(pad_data), .ready(kv_ready), .done(dest_done) @@ -77,13 +81,16 @@ always_comb kv_write.write_entry = write_ctrl_reg.write_entry; always_comb kv_write.write_offset = dest_write_offset; always_comb kv_write.write_en = dest_write_en; always_comb kv_write.write_data = dest_data[(DATA_NUM_DWORDS-1) - dest_read_offset]; - -always_comb kv_write.write_dest_valid = write_ctrl_reg.write_dest_vld; +//write zeroes here until last cycle +always_comb kv_write.write_dest_valid = write_last ? write_ctrl_reg.write_dest_vld : '0; always_ff @(posedge clk or negedge rst_b) begin if (!rst_b) begin error_code <= KV_SUCCESS; end + else if (zeroize) begin + error_code <= KV_SUCCESS; + end else begin error_code <= dest_write_en & kv_resp.error ? KV_WRITE_FAIL : dest_write_en & ~kv_resp.error ? KV_SUCCESS : error_code; diff --git a/src/keyvault/uvmf_kv/config/compile.yml b/src/keyvault/uvmf_kv/config/compile.yml index 820820338..56dca109a 100644 --- a/src/keyvault/uvmf_kv/config/compile.yml +++ b/src/keyvault/uvmf_kv/config/compile.yml @@ -6,6 +6,7 @@ requires: - kv_uvm_pkg - keyvault - caliptra_top_defines + - keyvault_cov targets: tb: directories: diff --git a/src/keyvault/uvmf_kv/coverage/uvmf_kv_cm_hier.cfg b/src/keyvault/uvmf_kv/coverage/uvmf_kv_cm_hier.cfg new file mode 100644 index 000000000..f8b1e528f --- /dev/null +++ b/src/keyvault/uvmf_kv/coverage/uvmf_kv_cm_hier.cfg @@ -0,0 +1,4 @@ +begin line+tgl+fsm+cond+branch + +tree hdl_top.dut 0 +end + diff --git a/src/keyvault/uvmf_kv/kv_interfaces.yaml b/src/keyvault/uvmf_kv/kv_interfaces.yaml index e86ace813..49130c75c 100644 --- a/src/keyvault/uvmf_kv/kv_interfaces.yaml +++ b/src/keyvault/uvmf_kv/kv_interfaces.yaml @@ -28,6 +28,9 @@ uvmf: - name: debug_locked dir: output width: '1' + - name: cptra_in_debug_scan_mode + dir: output + width: '1' transaction_constraints: - name: wait_cycles_c @@ -54,6 +57,10 @@ uvmf: type: bit iscompare: 'False' isrand: 'False' + - name: scan_mode + type: bit + iscompare: 'False' + isrand: 'False' #################### WRITE #################### kv_write: diff --git a/src/keyvault/uvmf_kv/uvmf_template_output/project_benches/kv/tb/sequences/src/kv_rand_debug_test_sequence.svh b/src/keyvault/uvmf_kv/uvmf_template_output/project_benches/kv/tb/sequences/src/kv_rand_debug_test_sequence.svh index 9f09815a9..15d6b3fbf 100644 --- a/src/keyvault/uvmf_kv/uvmf_template_output/project_benches/kv/tb/sequences/src/kv_rand_debug_test_sequence.svh +++ b/src/keyvault/uvmf_kv/uvmf_template_output/project_benches/kv/tb/sequences/src/kv_rand_debug_test_sequence.svh @@ -68,6 +68,9 @@ class kv_rand_debug_test_sequence extends kv_bench_sequence_base; typedef kv_wr_rd_debug_lock_sequence #(.CONFIG_T(kv_env_configuration_t)) kv_wr_rd_debug_lock_sequence_t; rand kv_wr_rd_debug_lock_sequence_t kv_wr_rd_debug_lock_seq; + typedef kv_wr_rd_debug_lock_clear_rst_sequence #(.CONFIG_T(kv_env_configuration_t)) kv_wr_rd_debug_lock_clear_rst_sequence_t; + rand kv_wr_rd_debug_lock_clear_rst_sequence_t kv_wr_rd_debug_lock_clear_rst_seq; + typedef kv_wr_rd_debug_warm_rst_sequence #(.CONFIG_T(kv_env_configuration_t)) kv_wr_rd_debug_warm_rst_sequence_t; rand kv_wr_rd_debug_warm_rst_sequence_t kv_wr_rd_debug_warm_rst_seq; @@ -97,6 +100,7 @@ class kv_rand_debug_test_sequence extends kv_bench_sequence_base; kv_wr_rd_lock_core_rst_seq = kv_wr_rd_lock_core_rst_sequence_t::type_id::create("kv_wr_rd_lock_core_rst_seq"); kv_wr_rd_debug_seq = kv_wr_rd_debug_sequence_t::type_id::create("kv_wr_rd_debug_seq"); kv_wr_rd_debug_lock_seq = kv_wr_rd_debug_lock_sequence_t::type_id::create("kv_wr_rd_debug_lock_seq"); + kv_wr_rd_debug_lock_clear_rst_seq = kv_wr_rd_debug_lock_clear_rst_sequence_t::type_id::create("kv_wr_rd_debug_lock_clear_rst_seq"); kv_wr_rd_debug_warm_rst_seq = kv_wr_rd_debug_warm_rst_sequence_t::type_id::create("kv_wr_rd_debug_warm_rst_seq"); kv_wr_rd_debug_cold_rst_seq = kv_wr_rd_debug_cold_rst_sequence_t::type_id::create("kv_wr_rd_debug_cold_rst_seq"); kv_wr_rd_debug_core_rst_seq = kv_wr_rd_debug_core_rst_sequence_t::type_id::create("kv_wr_rd_debug_core_rst_seq"); @@ -124,6 +128,9 @@ class kv_rand_debug_test_sequence extends kv_bench_sequence_base; kv_wr_rd_debug_cold_rst_seq.start(top_configuration.vsqr); `uvm_info("TOP", "DEBUG core rst sequence",UVM_MEDIUM); kv_wr_rd_debug_core_rst_seq.start(top_configuration.vsqr); + + `uvm_info("TOP", "DEBUG lock clear rst sequence",UVM_MEDIUM); + kv_wr_rd_debug_lock_clear_rst_seq.start(top_configuration.vsqr); if(1) $display("** TESTCASE PASSED"); diff --git a/src/keyvault/uvmf_kv/uvmf_template_output/project_benches/kv/tb/sequences/src/kv_rand_wr_rd_test_sequence.svh b/src/keyvault/uvmf_kv/uvmf_template_output/project_benches/kv/tb/sequences/src/kv_rand_wr_rd_test_sequence.svh index c7c7f5636..897bce4e1 100644 --- a/src/keyvault/uvmf_kv/uvmf_template_output/project_benches/kv/tb/sequences/src/kv_rand_wr_rd_test_sequence.svh +++ b/src/keyvault/uvmf_kv/uvmf_template_output/project_benches/kv/tb/sequences/src/kv_rand_wr_rd_test_sequence.svh @@ -77,6 +77,9 @@ class kv_rand_wr_rd_test_sequence extends kv_bench_sequence_base; typedef kv_wr_rd_debug_core_rst_sequence #(.CONFIG_T(kv_env_configuration_t)) kv_wr_rd_debug_core_rst_sequence_t; rand kv_wr_rd_debug_core_rst_sequence_t kv_wr_rd_debug_core_rst_seq; + typedef kv_ahb_sequence #(.CONFIG_T(kv_env_configuration_t)) kv_ahb_sequence_t; + rand kv_ahb_sequence_t kv_ahb_seq; + //Responder sequences: typedef kv_read_responder_sequence kv_hmac_key_read_agent_responder_seq_t; kv_hmac_key_read_agent_responder_seq_t kv_hmac_key_read_agent_responder_seq; @@ -100,6 +103,7 @@ class kv_rand_wr_rd_test_sequence extends kv_bench_sequence_base; kv_wr_rd_debug_warm_rst_seq = kv_wr_rd_debug_warm_rst_sequence_t::type_id::create("kv_wr_rd_debug_warm_rst_seq"); kv_wr_rd_debug_cold_rst_seq = kv_wr_rd_debug_cold_rst_sequence_t::type_id::create("kv_wr_rd_debug_cold_rst_seq"); kv_wr_rd_debug_core_rst_seq = kv_wr_rd_debug_core_rst_sequence_t::type_id::create("kv_wr_rd_debug_core_rst_seq"); + kv_ahb_seq = kv_ahb_sequence_t::type_id::create("kv_ahb_seq"); if(!kv_wr_rd_seq.randomize()) `uvm_fatal("KV WR RD SEQ", "kv_rand_wr_rd_test_sequence::body() - kv_wr_rd_seq randomization failed"); @@ -111,6 +115,8 @@ class kv_rand_wr_rd_test_sequence extends kv_bench_sequence_base; `uvm_fatal("KV WR RD COLD RST SEQ", "kv_rand_wr_rd_test_sequence::body() - kv_wr_rd_cold_rst_seq randomization failed"); if(!kv_wr_rd_lock_seq.randomize()) `uvm_fatal("KV_WR_RD_LOCK_SEQ", "kv_rand_wr_rd_test_sequence::body() - kv_wr_rd_lock_seq randomization failed"); + if(!kv_ahb_seq.randomize()) + `uvm_fatal("KV_AHB_SEQ", "kv_ahb_sequence::body() - kv_ahb_seq randomization failed"); reg_model.reset(); @@ -123,6 +129,8 @@ class kv_rand_wr_rd_test_sequence extends kv_bench_sequence_base; kv_wr_rd_rst_seq.start(top_configuration.vsqr); `uvm_info("TOP", "wr rd cold rst sequence",UVM_MEDIUM); kv_wr_rd_cold_rst_seq.start(top_configuration.vsqr); + `uvm_info("TOP", "AHB sequence", UVM_MEDIUM); + kv_ahb_seq.start(top_configuration.vsqr); if(1) $display("** TESTCASE PASSED"); diff --git a/src/keyvault/uvmf_kv/uvmf_template_output/project_benches/kv/tb/testbench/hdl_top.sv b/src/keyvault/uvmf_kv/uvmf_template_output/project_benches/kv/tb/testbench/hdl_top.sv index aa8a24f97..7fdc017ce 100644 --- a/src/keyvault/uvmf_kv/uvmf_template_output/project_benches/kv/tb/testbench/hdl_top.sv +++ b/src/keyvault/uvmf_kv/uvmf_template_output/project_benches/kv/tb/testbench/hdl_top.sv @@ -203,7 +203,7 @@ import uvmf_base_pkg_hdl::*; .rst_b (kv_rst_agent_bus.rst_b ), .core_only_rst_b (kv_rst_agent_bus.core_only_rst_b), .cptra_pwrgood (kv_rst_agent_bus.cptra_pwrgood), - + .cptra_in_debug_scan_mode (kv_rst_agent_bus.cptra_in_debug_scan_mode), .debugUnlock_or_scan_mode_switch (kv_rst_agent_bus.debug_locked), //uC AHB Lite Interface @@ -219,13 +219,16 @@ import uvmf_base_pkg_hdl::*; .hresp_o (uvm_test_top_environment_qvip_ahb_lite_slave_subenv_qvip_hdl.ahb_lite_slave_0_HRESP ), .hreadyout_o(uvm_test_top_environment_qvip_ahb_lite_slave_subenv_qvip_hdl.ahb_lite_slave_0_HREADY ), .hrdata_o (uvm_test_top_environment_qvip_ahb_lite_slave_subenv_qvip_hdl.ahb_lite_slave_0_HRDATA ), - + .fw_update_rst_window(kv_rst_agent_bus.fw_update_rst_window), .kv_read (kv_read ), .kv_write(kv_write), .kv_rd_resp(kv_rd_resp), .kv_wr_resp(kv_wr_resp), .pcr_signing_key() //TODO ); + + keyvault_cov_bind i_keyvault_cov_bind(); + assign uvm_test_top_environment_qvip_ahb_lite_slave_subenv_qvip_hdl.ahb_lite_slave_0_HBURST = 3'b0; assign uvm_test_top_environment_qvip_ahb_lite_slave_subenv_qvip_hdl.ahb_lite_slave_0_HPROT = 7'b0; assign uvm_test_top_environment_qvip_ahb_lite_slave_subenv_qvip_hdl.ahb_lite_slave_0_HMASTLOCK = 1'b0; @@ -268,6 +271,8 @@ import uvmf_base_pkg_hdl::*; uvm_config_db #( virtual kv_read_driver_bfm )::set( null , UVMF_VIRTUAL_INTERFACES , kv_ecc_seed_read_agent_BFM , kv_ecc_seed_read_agent_drv_bfm ); end + + endmodule // pragma uvmf custom external begin diff --git a/src/keyvault/uvmf_kv/uvmf_template_output/verification_ip/environment_packages/kv_env_pkg/kv_env_pkg.sv b/src/keyvault/uvmf_kv/uvmf_template_output/verification_ip/environment_packages/kv_env_pkg/kv_env_pkg.sv index 4fb6c72f0..afa6d0c14 100644 --- a/src/keyvault/uvmf_kv/uvmf_template_output/verification_ip/environment_packages/kv_env_pkg/kv_env_pkg.sv +++ b/src/keyvault/uvmf_kv/uvmf_template_output/verification_ip/environment_packages/kv_env_pkg/kv_env_pkg.sv @@ -117,9 +117,11 @@ package kv_env_pkg; `include "src/kv_wr_rd_lock_core_rst_sequence.svh" `include "src/kv_wr_rd_debug_sequence.svh" `include "src/kv_wr_rd_debug_lock_sequence.svh" + `include "src/kv_wr_rd_debug_lock_clear_rst_sequence.svh" `include "src/kv_wr_rd_debug_warm_rst_sequence.svh" `include "src/kv_wr_rd_debug_cold_rst_sequence.svh" `include "src/kv_wr_rd_debug_core_rst_sequence.svh" + `include "src/kv_ahb_sequence.svh" // pragma uvmf custom package_item_additional begin // UVMF_CHANGE_ME : When adding new environment level sequences to the src directory diff --git a/src/keyvault/uvmf_kv/uvmf_template_output/verification_ip/environment_packages/kv_env_pkg/registers/kv_reg_model_top_pkg.sv b/src/keyvault/uvmf_kv/uvmf_template_output/verification_ip/environment_packages/kv_env_pkg/registers/kv_reg_model_top_pkg.sv index 7fb4613b5..0132574a6 100644 --- a/src/keyvault/uvmf_kv/uvmf_template_output/verification_ip/environment_packages/kv_env_pkg/registers/kv_reg_model_top_pkg.sv +++ b/src/keyvault/uvmf_kv/uvmf_template_output/verification_ip/environment_packages/kv_env_pkg/registers/kv_reg_model_top_pkg.sv @@ -169,11 +169,12 @@ package kv_reg_model_top_pkg; rand uvm_reg_field debug_mode_unlocked; rand uvm_reg_field clear_secrets_bit; + rand uvm_reg_field cptra_in_debug_scan_mode; // Function: new // function new(string name = "kv_val_reg"); - super.new(name, 2, UVM_NO_COVERAGE); + super.new(name, 3, UVM_NO_COVERAGE); endfunction @@ -185,6 +186,10 @@ package kv_reg_model_top_pkg; clear_secrets_bit = uvm_reg_field::type_id::create("clear_secrets_bit"); clear_secrets_bit.configure(this, 1, 1, "RW", 0, 1'b0, 1, 1, 1); + + cptra_in_debug_scan_mode = uvm_reg_field::type_id::create("cptra_in_debug_scan_mode"); + cptra_in_debug_scan_mode.configure(this, 1, 2, "RW", 0, 1'b0, 1, 1, 1); + endfunction endclass @@ -213,6 +218,26 @@ package kv_reg_model_top_pkg; clear.configure(this, 32, 0, "RW", 0, 32'b0, 1, 1, 1); endfunction endclass + + class kv_val_ctrl_derived extends uvm_reg; + `uvm_object_utils(kv_val_ctrl_derived) + + rand uvm_reg_field clear_derived; //32 bits, one for each KEY_CTRL + + // Function: new + // + function new(string name = "kv_val_ctrl_derived"); + super.new(name, 32, UVM_NO_COVERAGE); + endfunction + + + // Function: build + // + virtual function void build(); + clear_derived = uvm_reg_field::type_id::create("clear_derived"); + clear_derived.configure(this, 32, 0, "RW", 0, 32'b0, 1, 1, 1); + endfunction + endclass // pragma uvmf custom define_register_classes end // pragma uvmf custom define_block_map_coverage_class begin @@ -221,37 +246,37 @@ package kv_reg_model_top_pkg; // // Coverage for the 'ahb_map' in 'kv_reg_model' //-------------------------------------------------------------------- - class kv_ahb_map_coverage extends uvm_object; - `uvm_object_utils(kv_ahb_map_coverage) + // class kv_ahb_map_coverage extends uvm_object; + // `uvm_object_utils(kv_ahb_map_coverage) - covergroup ra_cov(string name) with function sample(uvm_reg_addr_t addr, bit is_read); + // covergroup ra_cov(string name) with function sample(uvm_reg_addr_t addr, bit is_read); - option.per_instance = 1; - option.name = name; + // option.per_instance = 1; + // option.name = name; - ADDR: coverpoint addr { - bins example_reg0 = {'h0}; - bins example_reg1 = {'h1}; - } + // ADDR: coverpoint addr { + // bins example_reg0 = {'h0}; + // bins example_reg1 = {'h1}; + // } - RW: coverpoint is_read { - bins RD = {1}; - bins WR = {0}; - } + // RW: coverpoint is_read { + // bins RD = {1}; + // bins WR = {0}; + // } - ACCESS: cross ADDR, RW; + // ACCESS: cross ADDR, RW; - endgroup: ra_cov + // endgroup: ra_cov - function new(string name = "kv_ahb_map_coverage"); - ra_cov = new(name); - endfunction: new + // function new(string name = "kv_ahb_map_coverage"); + // ra_cov = new(name); + // endfunction: new - function void sample(uvm_reg_addr_t offset, bit is_read); - ra_cov.sample(offset, is_read); - endfunction: sample + // function void sample(uvm_reg_addr_t offset, bit is_read); + // ra_cov.sample(offset, is_read); + // endfunction: sample - endclass: kv_ahb_map_coverage + // endclass: kv_ahb_map_coverage // pragma uvmf custom define_block_map_coverage_class end //TODO: Add coverage classes for each of the maps @@ -270,6 +295,7 @@ package kv_reg_model_top_pkg; rand kv_val_reg val_reg; rand kv_val_ctrl val_ctrl; + rand kv_val_ctrl_derived val_ctrl_derived; // pragma uvmf custom instantiate_registers_within_block end uvm_reg_map default_map; @@ -291,7 +317,7 @@ package kv_reg_model_top_pkg; uvm_reg_map kv_ecc_seed_read_map; //TODO add coverage for the other maps - kv_ahb_map_coverage ahb_map_cg; + // kv_ahb_map_coverage ahb_map_cg; // Function: new // @@ -303,20 +329,20 @@ package kv_reg_model_top_pkg; // virtual function void build(); ahb_map = create_map("ahb_map", 0, 4, UVM_LITTLE_ENDIAN); - if(has_coverage(UVM_CVR_ADDR_MAP)) begin - ahb_map_cg = kv_ahb_map_coverage::type_id::create("ahb_map_cg"); - ahb_map_cg.ra_cov.set_inst_name(this.get_full_name()); - void'(set_coverage(UVM_CVR_ADDR_MAP)); - end + // if(has_coverage(UVM_CVR_ADDR_MAP)) begin + // ahb_map_cg = kv_ahb_map_coverage::type_id::create("ahb_map_cg"); + // ahb_map_cg.ra_cov.set_inst_name(this.get_full_name()); + // void'(set_coverage(UVM_CVR_ADDR_MAP)); + // end // pragma uvmf custom construct_configure_build_registers_within_block begin - example_reg0 = kv_example_reg0::type_id::create("example_reg0"); - example_reg0.configure(this, null, "example_reg0"); - example_reg0.build(); - example_reg1 = kv_example_reg1::type_id::create("example_reg1"); - example_reg1.configure(this, null, "example_reg1"); - example_reg1.build(); + // example_reg0 = kv_example_reg0::type_id::create("example_reg0"); + // example_reg0.configure(this, null, "example_reg0"); + // example_reg0.build(); + // example_reg1 = kv_example_reg1::type_id::create("example_reg1"); + // example_reg1.configure(this, null, "example_reg1"); + // example_reg1.build(); val_reg = kv_val_reg::type_id::create("val_reg"); val_reg.configure(this,null,"val_reg"); @@ -325,6 +351,10 @@ package kv_reg_model_top_pkg; val_ctrl = kv_val_ctrl::type_id::create("val_ctrl"); val_ctrl.configure(this,null,"val_ctrl"); val_ctrl.build(); + + val_ctrl_derived = kv_val_ctrl_derived::type_id::create("val_ctrl_derived"); + val_ctrl_derived.configure(this,null,"val_ctrl_derived"); + val_ctrl_derived.build(); // pragma uvmf custom construct_configure_build_registers_within_block end // pragma uvmf custom add_registers_to_block_map begin //ahb_map.add_reg(example_reg0, 'h0, "RW"); @@ -358,6 +388,7 @@ package kv_reg_model_top_pkg; //Add debug_mode reg to all maps (only for TB purposes) default_map.add_reg(val_reg, 'h1_0000, "RW"); default_map.add_reg(val_ctrl, 'h1_0004, "RW"); + default_map.add_reg(val_ctrl_derived, 'h1_0008, "RW"); kv_hmac_write_map.add_reg(val_reg, 'h1_0000, "RW"); kv_sha512_write_map.add_reg(val_reg, 'h1_0000, "RW"); @@ -369,8 +400,14 @@ package kv_reg_model_top_pkg; kv_ecc_write_map.add_reg (val_ctrl, 'h1_0004, "RW"); kv_doe_write_map.add_reg (val_ctrl, 'h1_0004, "RW"); + kv_hmac_write_map.add_reg (val_ctrl_derived, 'h1_0008, "RW"); + kv_sha512_write_map.add_reg(val_ctrl_derived, 'h1_0008, "RW"); + kv_ecc_write_map.add_reg (val_ctrl_derived, 'h1_0008, "RW"); + kv_doe_write_map.add_reg (val_ctrl_derived, 'h1_0008, "RW"); + kv_AHB_map.add_reg(val_reg, 'h1_0000, "RW"); kv_AHB_map.add_reg(val_ctrl, 'h1_0004, "RW"); + kv_AHB_map.add_reg(val_ctrl_derived, 'h1_0008, "RW"); kv_hmac_key_read_map.add_reg(val_reg, 'h1_0000, "RW"); kv_hmac_block_read_map.add_reg(val_reg, 'h1_0000, "RW"); @@ -383,6 +420,12 @@ package kv_reg_model_top_pkg; kv_sha512_block_read_map.add_reg(val_ctrl, 'h1_0004, "RW"); kv_ecc_privkey_read_map.add_reg (val_ctrl, 'h1_0004, "RW"); kv_ecc_seed_read_map.add_reg (val_ctrl, 'h1_0004, "RW"); + + kv_hmac_key_read_map.add_reg (val_ctrl_derived, 'h1_0008, "RW"); + kv_hmac_block_read_map.add_reg (val_ctrl_derived, 'h1_0008, "RW"); + kv_sha512_block_read_map.add_reg(val_ctrl_derived, 'h1_0008, "RW"); + kv_ecc_privkey_read_map.add_reg (val_ctrl_derived, 'h1_0008, "RW"); + kv_ecc_seed_read_map.add_reg (val_ctrl_derived, 'h1_0008, "RW"); endfunction @@ -407,17 +450,19 @@ package kv_reg_model_top_pkg; this.kv_ecc_privkey_read_map.add_submap (this.kv_reg_rm.kv_reg_ecc_privkey_read_map, 'h0); this.kv_ecc_seed_read_map.add_submap (this.kv_reg_rm.kv_reg_ecc_seed_read_map, 'h0); + void'(set_coverage(get_coverage() | UVM_CVR_REG_BITS | UVM_CVR_FIELD_VALS)); + endfunction // Function: sample // - function void sample(uvm_reg_addr_t offset, bit is_read, uvm_reg_map map); - if(get_coverage(UVM_CVR_ADDR_MAP)) begin - if(map.get_name() == "ahb_map_cg") begin - ahb_map_cg.sample(offset, is_read); - end - end - endfunction: sample + // function void sample(uvm_reg_addr_t offset, bit is_read, uvm_reg_map map); + // if(get_coverage(UVM_CVR_ADDR_MAP)) begin + // if(map.get_name() == "ahb_map_cg") begin + // ahb_map_cg.sample(offset, is_read); + // end + // end + // endfunction: sample endclass diff --git a/src/keyvault/uvmf_kv/uvmf_template_output/verification_ip/environment_packages/kv_env_pkg/src/kv_ahb_sequence.svh b/src/keyvault/uvmf_kv/uvmf_template_output/verification_ip/environment_packages/kv_env_pkg/src/kv_ahb_sequence.svh new file mode 100644 index 000000000..3867b3b62 --- /dev/null +++ b/src/keyvault/uvmf_kv/uvmf_template_output/verification_ip/environment_packages/kv_env_pkg/src/kv_ahb_sequence.svh @@ -0,0 +1,82 @@ +// SPDX-License-Identifier: Apache-2.0 +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// pragma uvmf custom header begin +// pragma uvmf custom header end +//---------------------------------------------------------------------- +//---------------------------------------------------------------------- +// +// DESCRIPTION: Simple KV write/read sequence that writes random data +// to all entries and all dwords in order and then reads from them in order +//---------------------------------------------------------------------- +//---------------------------------------------------------------------- +// + +class kv_ahb_sequence #( + type CONFIG_T +) extends kv_env_sequence_base #(.CONFIG_T(CONFIG_T)); + + `uvm_object_param_utils(kv_ahb_sequence #(CONFIG_T)); + + typedef kv_rst_poweron_sequence kv_rst_agent_poweron_sequence_t; + kv_rst_agent_poweron_sequence_t kv_rst_agent_poweron_seq; + + rand int unsigned iter; + + function new(string name = ""); + super.new(name); + kv_rst_agent_poweron_seq = kv_rst_agent_poweron_sequence_t::type_id::create("kv_rst_agent_poweron_seq"); + if(!this.randomize()) `uvm_error("KV AHB", "Failed to randomize KV RST poweron seq"); + endfunction + + virtual task body(); + uvm_status_e sts; + int offset; + int entry; + int i; + reg [KV_DATA_W-1:0] wr_data, rd_data; + + reg_model = configuration.kv_rm; + // std::randomize(iter) with { + // 1 <= iter <= 5; + // }; + iter = 1; + //Issue reset + if(configuration.kv_rst_agent_config.sequencer != null) + kv_rst_agent_poweron_seq.start(configuration.kv_rst_agent_config.sequencer); + else + `uvm_error("KV AHB", "kv_rst_agent_config.sequencer is null!") + + //KEY ENTRY reg writes + for (i = 0; i < iter; i++) begin + for(entry = 0; entry < KV_NUM_KEYS; entry++) begin + for (offset = 0; offset < KV_NUM_DWORDS; offset++) begin + std::randomize(wr_data); + reg_model.kv_reg_rm.KEY_ENTRY[entry][offset].write(sts, wr_data, UVM_FRONTDOOR, reg_model.kv_AHB_map, this); + assert(sts == UVM_IS_OK) else `uvm_error("KV AHB", $sformatf("Failed when writing to KEY[%d][%d] entry",entry, offset)) + end + end + end + + //KEY ENTRY reg reads + for(entry = 0; entry < KV_NUM_KEYS; entry++) begin + for (offset = 0; offset < KV_NUM_DWORDS; offset++) begin + reg_model.kv_reg_rm.KEY_ENTRY[entry][offset].read(sts, rd_data, UVM_FRONTDOOR, reg_model.kv_AHB_map, this); + assert(sts == UVM_IS_OK) else `uvm_error("KV AHB", $sformatf("Failed when reading from KEY[%d][%d] entry",entry, offset)) + end + end + endtask + + +endclass \ No newline at end of file diff --git a/src/keyvault/uvmf_kv/uvmf_template_output/verification_ip/environment_packages/kv_env_pkg/src/kv_env_configuration.svh b/src/keyvault/uvmf_kv/uvmf_template_output/verification_ip/environment_packages/kv_env_pkg/src/kv_env_configuration.svh index c9c0f8a8f..5c69a35cf 100644 --- a/src/keyvault/uvmf_kv/uvmf_template_output/verification_ip/environment_packages/kv_env_pkg/src/kv_env_configuration.svh +++ b/src/keyvault/uvmf_kv/uvmf_template_output/verification_ip/environment_packages/kv_env_pkg/src/kv_env_configuration.svh @@ -110,7 +110,7 @@ extends uvmf_environment_configuration_base; qvip_ahb_lite_slave_subenv_config = qvip_ahb_lite_slave_env_configuration::type_id::create("qvip_ahb_lite_slave_subenv_config"); kv_configuration_cg=new; - `uvm_warning("COVERAGE_MODEL_REVIEW", "A covergroup has been constructed which may need review because of either generation or re-generation with merging. Please note that configuration variables added as a result of re-generation and merging are not automatically added to the covergroup. Remove this warning after the covergroup has been reviewed.") + `uvm_info("COVERAGE_MODEL_REVIEW", "TODO: A covergroup has been constructed which may need review because of either generation or re-generation with merging. Please note that configuration variables added as a result of re-generation and merging are not automatically added to the covergroup. Remove this warning after the covergroup has been reviewed.", UVM_MEDIUM) // pragma uvmf custom new begin // pragma uvmf custom new end @@ -222,8 +222,13 @@ extends uvmf_environment_configuration_base; // pragma uvmf custom reg_model_config_initialize begin // Register model creation and configuation if (register_model == null) begin + uvm_reg::include_coverage("*", UVM_CVR_ALL); // Register coverage config with resource DB, used later by build_coverage() kv_rm = kv_reg_model_top::type_id::create("kv_rm"); + //Turn on addr_map_coverage for kv_reg_model + kv_rm.set_coverage(UVM_CVR_ADDR_MAP); + uvm_reg::include_coverage("*", UVM_CVR_ALL); kv_rm.build(); + kv_rm.set_coverage(UVM_CVR_ALL); kv_rm.lock_model(); kv_rm.build_ext_maps(); enable_reg_adaptation = 1; diff --git a/src/keyvault/uvmf_kv/uvmf_template_output/verification_ip/environment_packages/kv_env_pkg/src/kv_predictor.svh b/src/keyvault/uvmf_kv/uvmf_template_output/verification_ip/environment_packages/kv_env_pkg/src/kv_predictor.svh index eccc290f4..7b9db72bf 100644 --- a/src/keyvault/uvmf_kv/uvmf_template_output/verification_ip/environment_packages/kv_env_pkg/src/kv_predictor.svh +++ b/src/keyvault/uvmf_kv/uvmf_template_output/verification_ip/environment_packages/kv_env_pkg/src/kv_predictor.svh @@ -301,11 +301,12 @@ class kv_predictor #( last_dword_written[entry] = 'h0; //Clear last dword on hard rst end end - else if (t.debug_mode) begin + else if (t.debug_mode | t.scan_mode) begin //Set val_reg to 1 for use in reg predictor p_kv_rm.val_reg.debug_mode_unlocked.set(1'b1); + p_kv_rm.val_reg.cptra_in_debug_scan_mode.set(1'b1); - if (clear_secrets_data[1] == 'h1) begin + if (clear_secrets_data[p_kv_rm.kv_reg_rm.CLEAR_SECRETS.sel_debug_value.get_lsb_pos()] == 'h1) begin for(entry = 0; entry < KV_NUM_KEYS; entry++) begin //Debug mode should flush all regs inspite of locks for(offset = 0; offset < KV_NUM_DWORDS; offset++) begin @@ -351,8 +352,13 @@ class kv_predictor #( end //If debug mode was unlocked, set a val register to let reg predictor know - if (!t.debug_mode) + if (!t.debug_mode) begin p_kv_rm.val_reg.debug_mode_unlocked.set(1'b0); + //TODO: resetting debug_scan_mode needed? + if (!t.scan_mode) begin + p_kv_rm.val_reg.cptra_in_debug_scan_mode.set(1'b0); + end + end // Code for sending output transaction out through kv_sb_ap // Please note that each broadcasted transaction should be a different object than previously @@ -586,8 +592,8 @@ class kv_predictor #( string reg_name; reg [KV_DATA_W-1:0] data_active; reg [ahb_lite_slave_0_params::AHB_WDATA_WIDTH-1:0] address_aligned; - uvm_reg val_ctrl; - uvm_reg_data_t val_ctrl_data; + uvm_reg val_ctrl, val_reg, val_ctrl_derived; + uvm_reg_data_t val_ctrl_data, val_reg_data, val_ctrl_derived_data; ahb_slave_0_ae_debug = t; `uvm_info("PRED", "Transaction Received through ahb_slave_0_ae", UVM_MEDIUM) @@ -604,30 +610,40 @@ class kv_predictor #( //Copy txn and modify required fields later kv_sb_ahb_ap_output_transaction.copy(ahb_txn); - if (ahb_txn.address == `KV_REG_CLEAR_SECRETS) begin - p_kv_rm.val_reg.clear_secrets_bit.set(1'b1); - if (data_active[1:0] == 'h1) begin - for(entry = 0; entry < KV_NUM_KEYS; entry++) begin - //Read locks before clearing - do not clear if locked - kv_reg = p_kv_rm.get_reg_by_name($sformatf("KEY_CTRL[%0d]",entry)); - kv_reg_data = kv_reg.get_mirrored_value(); - if(kv_reg_data[1:0] == 2'b00) begin - for(offset = 0; offset < KV_NUM_DWORDS; offset++) begin - p_kv_rm.kv_reg_rm.KEY_ENTRY[entry][offset].predict(CLP_DEBUG_MODE_KV_0); - p_kv_rm.kv_reg_rm.KEY_ENTRY[entry][offset].set(CLP_DEBUG_MODE_KV_0); + //Read val reg to determine if we're in debug mode + val_reg = p_kv_rm.get_reg_by_name("val_reg"); + val_reg_data = val_reg.get(); + + //Only allow clear_secrets during debug mode + if ((ahb_txn.address == `KV_REG_CLEAR_SECRETS) ) begin + //Update val register with CLEAR_SECRETS wr_debug_values field + p_kv_rm.val_reg.clear_secrets_bit.set(data_active[p_kv_rm.kv_reg_rm.CLEAR_SECRETS.wr_debug_values.get_lsb_pos()]); + + if (val_reg_data[p_kv_rm.val_reg.cptra_in_debug_scan_mode.get_lsb_pos()]) begin //[2]) begin + //Only allow clear operation if in debug mode + if (data_active[1:0] == 'h1) begin + for(entry = 0; entry < KV_NUM_KEYS; entry++) begin + //Read locks before clearing - do not clear if locked + kv_reg = p_kv_rm.get_reg_by_name($sformatf("KEY_CTRL[%0d]",entry)); + kv_reg_data = kv_reg.get_mirrored_value(); + if(kv_reg_data[1:0] == 2'b00) begin + for(offset = 0; offset < KV_NUM_DWORDS; offset++) begin + p_kv_rm.kv_reg_rm.KEY_ENTRY[entry][offset].predict(CLP_DEBUG_MODE_KV_0); + p_kv_rm.kv_reg_rm.KEY_ENTRY[entry][offset].set(CLP_DEBUG_MODE_KV_0); + end end end end - end - else if(data_active[1:0] == 'h3) begin - for(entry = 0; entry < KV_NUM_KEYS; entry++) begin - //Read locks before clearing - kv_reg = p_kv_rm.get_reg_by_name($sformatf("KEY_CTRL[%0d]",entry)); - kv_reg_data = kv_reg.get_mirrored_value(); - if(kv_reg_data[1:0] == 2'b00) begin - for(offset = 0; offset < KV_NUM_DWORDS; offset++) begin - p_kv_rm.kv_reg_rm.KEY_ENTRY[entry][offset].predict(CLP_DEBUG_MODE_KV_1); - p_kv_rm.kv_reg_rm.KEY_ENTRY[entry][offset].set(CLP_DEBUG_MODE_KV_1); + else if(data_active[1:0] == 'h3) begin + for(entry = 0; entry < KV_NUM_KEYS; entry++) begin + //Read locks before clearing + kv_reg = p_kv_rm.get_reg_by_name($sformatf("KEY_CTRL[%0d]",entry)); + kv_reg_data = kv_reg.get_mirrored_value(); + if(kv_reg_data[1:0] == 2'b00) begin + for(offset = 0; offset < KV_NUM_DWORDS; offset++) begin + p_kv_rm.kv_reg_rm.KEY_ENTRY[entry][offset].predict(CLP_DEBUG_MODE_KV_1); + p_kv_rm.kv_reg_rm.KEY_ENTRY[entry][offset].set(CLP_DEBUG_MODE_KV_1); + end end end end @@ -646,8 +662,13 @@ class kv_predictor #( if(data_active[2] && !kv_reg_data[0] && !kv_reg_data[1]) begin val_ctrl_data[entry] = 'b1; //In design, clear is a single pulse reg. This val_ctrl[*] will be reset in kv_reg_predictor + val_ctrl_derived_data[entry] = 'b1; //p_kv_rm.kv_reg_rm.kv_val_ctrl.predict(val_ctrl_data); + `uvm_info("PRED", "Setting clear field of val_ctrl register", UVM_MEDIUM) p_kv_rm.val_ctrl.set(val_ctrl_data); + + `uvm_info("PRED", "Setting clear field of val_ctrl_derived register", UVM_MEDIUM) + p_kv_rm.val_ctrl_derived.set(val_ctrl_derived_data); //Clear the entry that is being accessed for(offset = 0; offset < KV_NUM_DWORDS; offset++) begin p_kv_rm.kv_reg_rm.KEY_ENTRY[entry][offset].predict('h0); @@ -733,8 +754,9 @@ endclass t_expected.error = 'b0; end - if (val_ctrl_data[t_received.read_entry]) + if (val_ctrl_data[t_received.read_entry]) begin last_dword_written[t_received.read_entry] = 'h0; + end t_expected.last = (last_dword_written[t_received.read_entry] == t_received.read_offset); t_expected.read_entry = t_received.read_entry; @@ -742,10 +764,11 @@ endclass endfunction function void kv_predictor::populate_expected_kv_write_txn (ref kv_sb_ap_output_transaction_write_t t_expected, kv_write_transaction t_received); - uvm_reg kv_reg; - uvm_reg_data_t kv_reg_data; + uvm_reg kv_reg, val_ctrl_derived; + uvm_reg_data_t kv_reg_data, val_ctrl_derived_data; logic lock_use; logic lock_wr; + logic clear; //TODO: This logic takes advantage of the fact that reg model writes happen without a 1 clk delay. //So when predictor reads the CTRL reg, the lock info is already up to date @@ -756,16 +779,38 @@ endclass lock_wr = kv_reg_data[0]; lock_use = kv_reg_data[1]; - //Copy received txn - t_expected = t_received; + val_ctrl_derived = p_kv_rm.get_reg_by_name("val_ctrl_derived"); + val_ctrl_derived_data = val_ctrl_derived.get(); - //Error should be set when writing to locked regs - if(lock_wr || lock_use) - t_expected.error = 'b1; + //Copy received txn + // t_expected = t_received; + t_expected.write_en = t_received.write_en; + t_expected.write_entry = t_received.write_entry; + t_expected.write_offset = t_received.write_offset; + t_expected.write_data = t_received.write_data; + t_expected.write_dest_valid = t_received.write_dest_valid; + + //Error should be set when writing to locked regs //TODO: error when entry is being cleared during write + if (t_received.write_en) begin + if(lock_wr || lock_use) begin + t_expected.error = 1'b1; + `uvm_info("PRED", "Trying to write to a locked reg", UVM_MEDIUM) + end + else if (/*this.write_in_progress[t_received.write_entry] &&*/ val_ctrl_derived_data[t_received.write_entry]) begin + t_expected.error = 1'b1; + `uvm_info("PRED","Attempts to clear a reg while write is in progress results in an error", UVM_MEDIUM) + `uvm_info("PRED", $sformatf("Write entry = %0d, val_ctrl_derived_data = %b", t_received.write_entry, val_ctrl_derived_data), UVM_MEDIUM) + end + else begin + t_expected.error = 1'b0; + //Keep track of last dword written + last_dword_written[t_received.write_entry] = t_received.write_offset; + end + end + else begin + t_expected.error = 1'b0; + end - //Keep track of last dword written - last_dword_written[t_received.write_entry] = t_received.write_offset; - endfunction // pragma uvmf custom external end diff --git a/src/keyvault/uvmf_kv/uvmf_template_output/verification_ip/environment_packages/kv_env_pkg/src/kv_reg_predictor.svh b/src/keyvault/uvmf_kv/uvmf_template_output/verification_ip/environment_packages/kv_env_pkg/src/kv_reg_predictor.svh index 1ad9f9d8e..de58e86f4 100644 --- a/src/keyvault/uvmf_kv/uvmf_template_output/verification_ip/environment_packages/kv_env_pkg/src/kv_reg_predictor.svh +++ b/src/keyvault/uvmf_kv/uvmf_template_output/verification_ip/environment_packages/kv_env_pkg/src/kv_reg_predictor.svh @@ -33,6 +33,8 @@ class kv_reg_predictor#(type BUSTYPE=int) extends uvm_reg_predictor #(.BUSTYPE(B uvm_reg_adapter adapter; + extern function logic [(KV_NUM_READ + $clog2(KV_NUM_DWORDS))-1 :0] parse_wr_transaction(uvm_sequence_item bus_item); + //Create new instance of this type function new (string name, uvm_component parent); super.new(name, parent); @@ -63,14 +65,19 @@ class kv_reg_predictor#(type BUSTYPE=int) extends uvm_reg_predictor #(.BUSTYPE(B uvm_reg_data_t val_reg_data; uvm_reg_item val_reg_item; - uvm_reg val_ctrl; - uvm_reg_data_t val_ctrl_data; + uvm_reg val_ctrl, val_ctrl_derived; + uvm_reg_data_t val_ctrl_data, val_ctrl_derived_data; uvm_reg_item val_ctrl_item; logic lock_wr; logic lock_use; logic clear; + logic [KV_NUM_READ-1:0] write_dest_valid; + logic [$clog2(KV_NUM_DWORDS)-1:0] last_dword; + + uvm_reg rg; + //Pass variables to parent super.reg_ap = reg_ap_local; super.map = map; @@ -78,56 +85,51 @@ class kv_reg_predictor#(type BUSTYPE=int) extends uvm_reg_predictor #(.BUSTYPE(B //Convert bus txn to reg model txn adapter.bus2reg(tr,rw); - + //----------------------------------------------- //rw contains KEY entry info. Below steps are to //derive corresponding CTRL reg info //----------------------------------------------- if (rw.kind == UVM_WRITE) begin + //Get write_dest_valid and last_dword data from tx + {write_dest_valid, last_dword} = parse_wr_transaction(tr); + //Convert reg addr to entry/offset entry_offset = convert_addr_to_kv(rw.addr); //Calculate CTRL addr based on entry info addr = convert_kv_to_ctrl_addr(entry_offset); - //Build rw_ctrl (reg model txn for CTRL reg) - rw_ctrl = rw; - rw_ctrl.addr = uvm_reg_addr_t'(addr); - - //----------------------------------------------- - //Read val reg first - //----------------------------------------------- - val_reg = map.get_reg_by_offset('h1_0000); - val_reg_data = val_reg.get(); - - val_ctrl = map.get_reg_by_offset('h1_0004); - val_ctrl_data = val_ctrl.get(); //----------------------------------------------- //Below steps are to read CTRL reg data from reg model //and append dest valid to it (we want to keep lock bits same) //----------------------------------------------- + //Build rw_ctrl (reg model txn for CTRL reg) + rw_ctrl = rw; + rw_ctrl.addr = uvm_reg_addr_t'(addr); + kv_reg = map.get_reg_by_offset(rw.addr, (rw.kind == UVM_READ)); kv_reg_ctrl = map.get_reg_by_offset(rw_ctrl.addr, (rw_ctrl.kind == UVM_READ)); - + //TODO: reg null check? //Read CTRL reg data kv_reg_ctrl_data = kv_reg_ctrl.get_mirrored_value(); //Append dest valid to it - kv_reg_ctrl_data = {kv_reg_ctrl_data[31:14], 5'h1F, kv_reg_ctrl_data[8:0]}; + kv_reg_ctrl_data = {kv_reg_ctrl_data[31:21], last_dword, kv_reg_ctrl_data[16:14], /*5'h1F*/write_dest_valid, kv_reg_ctrl_data[8:0]}; rw_ctrl.data = kv_reg_ctrl_data; + //----------------------------------------------- - //Predict ctrl reg data so it gets updated in reg model + //Read val reg first //----------------------------------------------- - kv_reg_ctrl_item = new; - kv_reg_ctrl_item.element_kind = UVM_REG; - kv_reg_ctrl_item.element = kv_reg_ctrl; - kv_reg_ctrl_item.path = UVM_PREDICT; - kv_reg_ctrl_item.map = map; - kv_reg_ctrl_item.kind = UVM_WRITE; - kv_reg_ctrl_item.value[0] |= kv_reg_ctrl_data; + val_reg = map.get_reg_by_offset('h1_0000); + val_reg_data = val_reg.get(); + + val_ctrl = map.get_reg_by_offset('h1_0004); + val_ctrl_data = val_ctrl.get(); + + val_ctrl_derived = map.get_reg_by_offset('h1_0008); + val_ctrl_derived_data = val_ctrl_derived.get(); - //Update CTRL reg - kv_reg_ctrl.do_predict(kv_reg_ctrl_item, UVM_PREDICT_DIRECT); //----------------------------------------------- //Update val_ctrl reg to reset clear bit for the entry that is being written @@ -145,6 +147,25 @@ class kv_reg_predictor#(type BUSTYPE=int) extends uvm_reg_predictor #(.BUSTYPE(B //Update CTRL reg val_ctrl.do_predict(val_ctrl_item, UVM_PREDICT_DIRECT); + //----------------------------------------------- + //Update val_ctrl_derived reg to reset clear bits for all other entries except current one + //This will be used to hold the clear until writes are finished to current entry + //----------------------------------------------- + for (int i = 0; i < KV_NUM_KEYS; i++) begin + val_ctrl_derived_data[i] /*[entry_offset[4:0]]*/ = (val_ctrl_derived_data[i] & (i == entry_offset[4:0])); //'b0; //Reset clear bit of current entry + end + + val_ctrl_item = new; + val_ctrl_item.element_kind = UVM_REG; + val_ctrl_item.element = val_ctrl_derived; + val_ctrl_item.path = UVM_PREDICT; + val_ctrl_item.map = map; + val_ctrl_item.kind = UVM_WRITE; + val_ctrl_item.value[0] |= val_ctrl_derived_data; + + //Update CTRL reg + val_ctrl_derived.do_predict(val_ctrl_item, UVM_PREDICT_DIRECT); + //----------------------------------------------- //Check clear secrets and lock_wr/use before writing //----------------------------------------------- @@ -159,14 +180,38 @@ class kv_reg_predictor#(type BUSTYPE=int) extends uvm_reg_predictor #(.BUSTYPE(B //If lock_wr, lock_use, debug mode or clear secrets is enabled, do not write to reg model //TODO: Revisit lock and clear condition - if (!lock_wr && !lock_use && !clear_secrets_data[0] && !val_reg_data[0])begin // && !val_reg_data[1]) begin + //TODO: Can write to regs during debug mode. Remove check after updating sequences + `uvm_info("KV_REG_PRED", $sformatf("OUTSIDE, lock_wr = %0d, lock_use = %0d, clear_secrets_wren = %0d, val_reg_data = %b", lock_wr, lock_use, clear_secrets_data[0], val_reg_data), UVM_FULL) + if (!lock_wr && !lock_use && !(clear_secrets_data[0] && val_reg_data[2]) && !val_reg_data[0]) begin + `uvm_info("KV_REG_PRED", "Writing to KEY_ENTRY", UVM_FULL) super.write(tr); + + `uvm_info("KV_REG_PRED", "Updating KEY_CTRL", UVM_FULL) + + //----------------------------------------------- + //Predict ctrl reg data so it gets updated in reg model + //----------------------------------------------- + kv_reg_ctrl_item = new; + kv_reg_ctrl_item.element_kind = UVM_REG; + kv_reg_ctrl_item.element = kv_reg_ctrl; + kv_reg_ctrl_item.path = UVM_PREDICT; + kv_reg_ctrl_item.map = map; + kv_reg_ctrl_item.kind = UVM_WRITE; + kv_reg_ctrl_item.value[0] |= kv_reg_ctrl_data; + + //Update CTRL reg + kv_reg_ctrl.do_predict(kv_reg_ctrl_item, UVM_PREDICT_DIRECT); + end + else begin + `uvm_info("KV_REG_PRED", "Skipping write to KEY_ENTRY", UVM_FULL) + `uvm_info("KV_REG_PRED", $sformatf("lock_wr = %0d, lock_use = %0d, clear_secrets_data = %0d, val_reg_data = %b", lock_wr, lock_use, clear_secrets_data[0], val_reg_data), UVM_FULL) end //----------------------------------------------- //Clear secrets wren bit back to 0 (single pulse behv) - do this if clear_secrets reg is not being written to in the same cycle //----------------------------------------------- if(val_reg_data[1]) begin + `uvm_info("KV_REG_PRED", "Clear_secrets bit is reset after a single pulse", UVM_FULL) clear_secrets_item = new; clear_secrets_item.element_kind = UVM_REG; clear_secrets_item.element = clear_secrets_reg; @@ -186,7 +231,7 @@ class kv_reg_predictor#(type BUSTYPE=int) extends uvm_reg_predictor #(.BUSTYPE(B val_reg_item.path = UVM_PREDICT; val_reg_item.map = map; val_reg_item.kind = UVM_WRITE; - val_reg_item.value[0] |= {1'b0,val_reg_data[0]}; //Clear and clear_secrets_bit are single pulse, so make them 0. Keep debug_mode as is + val_reg_item.value[0] |= {val_reg_data[2],1'b0,val_reg_data[0]}; //Clear and clear_secrets_bit are single pulse, so make them 0. Keep debug_mode as is val_reg.do_predict(val_reg_item, UVM_PREDICT_DIRECT); @@ -195,7 +240,28 @@ class kv_reg_predictor#(type BUSTYPE=int) extends uvm_reg_predictor #(.BUSTYPE(B super.write(tr); end + rg = map.get_reg_by_offset(rw.addr, (rw.kind == UVM_READ)); + rg.sample_values(); + rg = map.get_reg_by_offset(rw_ctrl.addr, (rw_ctrl.kind == UVM_READ)); + rg.sample_values(); + endfunction -endclass \ No newline at end of file +endclass + +function logic [(KV_NUM_READ + $clog2(KV_NUM_DWORDS))-1 :0] kv_reg_predictor::parse_wr_transaction(uvm_sequence_item bus_item); + kv_write_transaction #( + .KV_WRITE_REQUESTOR("HMAC") + ) + trans_h; + + if (!$cast(trans_h, bus_item)) begin + `uvm_fatal("ADAPT","Provided bus_item is not of the correct type") + // return; + end + // pragma uvmf custom bus2reg begin + parse_wr_transaction = {trans_h.write_dest_valid, trans_h.write_offset}; + // pragma uvmf custom bus2reg end + +endfunction: parse_wr_transaction \ No newline at end of file diff --git a/src/keyvault/uvmf_kv/uvmf_template_output/verification_ip/environment_packages/kv_env_pkg/src/kv_wr_rd_debug_cold_rst_sequence.svh b/src/keyvault/uvmf_kv/uvmf_template_output/verification_ip/environment_packages/kv_env_pkg/src/kv_wr_rd_debug_cold_rst_sequence.svh index 34c908a9e..22b62fac4 100644 --- a/src/keyvault/uvmf_kv/uvmf_template_output/verification_ip/environment_packages/kv_env_pkg/src/kv_wr_rd_debug_cold_rst_sequence.svh +++ b/src/keyvault/uvmf_kv/uvmf_template_output/verification_ip/environment_packages/kv_env_pkg/src/kv_wr_rd_debug_cold_rst_sequence.svh @@ -153,6 +153,8 @@ class kv_wr_rd_debug_cold_rst_sequence #( //Issue cold reset before reading kv_rst_agent_cold_rst_seq.start(configuration.kv_rst_agent_config.sequencer); + //Wait for cold reset to finish + configuration.kv_rst_agent_config.wait_for_num_clocks(10); //Read all entries for (read_entry = 0; read_entry < KV_NUM_KEYS; read_entry++) begin diff --git a/src/keyvault/uvmf_kv/uvmf_template_output/verification_ip/environment_packages/kv_env_pkg/src/kv_wr_rd_debug_lock_clear_rst_sequence.svh b/src/keyvault/uvmf_kv/uvmf_template_output/verification_ip/environment_packages/kv_env_pkg/src/kv_wr_rd_debug_lock_clear_rst_sequence.svh new file mode 100644 index 000000000..48cfbaf03 --- /dev/null +++ b/src/keyvault/uvmf_kv/uvmf_template_output/verification_ip/environment_packages/kv_env_pkg/src/kv_wr_rd_debug_lock_clear_rst_sequence.svh @@ -0,0 +1,230 @@ +//---------------------------------------------------------------------- +// Created with uvmf_gen version 2022.3 +//---------------------------------------------------------------------- +// SPDX-License-Identifier: Apache-2.0 +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// pragma uvmf custom header begin +// pragma uvmf custom header end +//---------------------------------------------------------------------- +//---------------------------------------------------------------------- +// +// DESCRIPTION: Sets all KEY_CTRL lock_wr/use/clear bits randomly. Then +// executes writes and reads in parallel while randomly unlocking debug +// mode via input pin or CLEAR_SECRETS reg +//---------------------------------------------------------------------- +//---------------------------------------------------------------------- +// + +class kv_wr_rd_debug_lock_clear_rst_sequence #( + type CONFIG_T +) extends kv_env_sequence_base #(.CONFIG_T(CONFIG_T)); + + `uvm_object_param_utils(kv_wr_rd_debug_lock_clear_rst_sequence #(CONFIG_T)); + + typedef kv_rst_poweron_sequence kv_rst_agent_poweron_sequence_t; + kv_rst_agent_poweron_sequence_t kv_rst_agent_poweron_seq; + kv_rst_agent_poweron_sequence_t kv_rst_agent_poweron_seq_2; + + typedef kv_rst_warm_rst_sequence kv_rst_agent_warm_rst_sequence_t; + kv_rst_agent_warm_rst_sequence_t kv_warm_rst_seq; + + typedef kv_rst_cold_rst_sequence kv_rst_agent_cold_rst_sequence_t; + kv_rst_agent_cold_rst_sequence_t kv_cold_rst_seq; + + typedef kv_rst_debug_sequence kv_rst_agent_debug_sequence_t; + kv_rst_agent_debug_sequence_t kv_rst_agent_debug_seq; + + typedef kv_write_key_entry_sequence kv_write_agent_key_entry_sequence_t; + kv_write_agent_key_entry_sequence_t hmac_write_seq; + kv_write_agent_key_entry_sequence_t sha512_write_seq; + kv_write_agent_key_entry_sequence_t ecc_write_seq; + kv_write_agent_key_entry_sequence_t doe_write_seq; + + typedef kv_read_key_entry_sequence kv_read_agent_key_entry_sequence_t; + kv_read_agent_key_entry_sequence_t hmac_key_read_seq; + kv_read_agent_key_entry_sequence_t hmac_block_read_seq; + kv_read_agent_key_entry_sequence_t sha512_block_read_seq; + kv_read_agent_key_entry_sequence_t ecc_privkey_read_seq; + kv_read_agent_key_entry_sequence_t ecc_seed_read_seq; + + rand reg [KV_ENTRY_ADDR_W-1:0] hmac_write_entry, sha512_write_entry, ecc_write_entry, doe_write_entry; + rand int unsigned wait_cycles_from_seq; + rand bit debug_type; + rand bit reset_type; + rand reg [1:0] clear_secrets_data; + rand reg [2:0] lock_data; + + typedef enum {SECURITY_STATE, CLEAR_SECRETS} debug_inputs; + typedef enum {WARM_RESET, COLD_RESET} reset_inputs; + + function new(string name = ""); + super.new(name); + kv_rst_agent_poweron_seq = kv_rst_agent_poweron_sequence_t::type_id::create("kv_rst_agent_poweron_seq"); + if(!this.randomize()) `uvm_error("KV WR RD", "Failed to randomize KV RST poweron seq"); + kv_rst_agent_poweron_seq_2 = kv_rst_agent_poweron_sequence_t::type_id::create("kv_rst_agent_poweron_seq_2"); + if(!this.randomize()) `uvm_error("KV WR RD", "Failed to randomize KV RST poweron seq"); + kv_warm_rst_seq = kv_rst_agent_warm_rst_sequence_t::type_id::create("kv_warm_rst_seq"); + if(!this.randomize()) `uvm_error("KV WR RD", "Failed to randomize KV_RST warm rst seq"); + kv_cold_rst_seq = kv_rst_agent_cold_rst_sequence_t::type_id::create("kv_cold_rst_seq"); + if(!this.randomize()) `uvm_error("KV WR RD", "Failed to randomize KV_RST cold rst seq"); + + kv_rst_agent_debug_seq = kv_rst_agent_debug_sequence_t::type_id::create("kv_rst_agent_debug_seq"); + if(!this.randomize()) `uvm_error("KV WR RD", "Failed to randomize KV RST debug seq"); + + hmac_write_seq = kv_write_agent_key_entry_sequence_t::type_id::create("hmac_write_seq"); + if(!this.randomize()) `uvm_error("KV WR RD", "Failed to randomize KV WRITE seq"); + sha512_write_seq = kv_write_agent_key_entry_sequence_t::type_id::create("sha512_write_seq"); + if(!this.randomize()) `uvm_error("KV WR RD", "Failed to randomize KV WRITE seq"); + ecc_write_seq = kv_write_agent_key_entry_sequence_t::type_id::create("ecc_write_seq"); + if(!this.randomize()) `uvm_error("KV WR RD", "Failed to randomize KV WRITE seq"); + doe_write_seq = kv_write_agent_key_entry_sequence_t::type_id::create("doe_write_seq"); + if(!this.randomize()) `uvm_error("KV WR RD", "Failed to randomize KV WRITE seq"); + + hmac_key_read_seq = kv_read_agent_key_entry_sequence_t::type_id::create("hmac_key_read_seq"); + if(!this.randomize()) `uvm_error("KV WR RD", "Failed to randomize KV READ seq"); + hmac_block_read_seq = kv_read_agent_key_entry_sequence_t::type_id::create("hmac_block_read_seq"); + if(!this.randomize()) `uvm_error("KV WR RD", "Failed to randomize KV READ seq"); + sha512_block_read_seq = kv_read_agent_key_entry_sequence_t::type_id::create("sha512_block_read_seq"); + if(!this.randomize()) `uvm_error("KV WR RD", "Failed to randomize KV READ seq"); + ecc_privkey_read_seq = kv_read_agent_key_entry_sequence_t::type_id::create("ecc_privkey_read_seq"); + if(!this.randomize()) `uvm_error("KV WR RD", "Failed to randomize KV READ seq"); + ecc_seed_read_seq = kv_read_agent_key_entry_sequence_t::type_id::create("ecc_seed_read_seq"); + if(!this.randomize()) `uvm_error("KV WR RD", "Failed to randomize KV READ seq"); + //kv_rst_agent_poweron_seq_2 = kv_rst_agent_poweron_sequence_t::type_id::create("kv_rst_agent_poweron_seq_2"); + + endfunction + + virtual task body(); + uvm_status_e sts; + //uvm_reg_data_t rd_data; + int write_entry = 0; + int write_offset = 0; + int read_entry = 0; + int read_offset = 0; + reg [31:0] wr_data, rd_data; + reg_model = configuration.kv_rm; + + + //Issue and wait for reset + if(configuration.kv_rst_agent_config.sequencer != null) + kv_rst_agent_poweron_seq.start(configuration.kv_rst_agent_config.sequencer); + else + `uvm_error("KV WR RD", "kv_rst_agent_config.sequencer is null!") + + //Write to all entries + for (write_entry = 0; write_entry < KV_NUM_KEYS; write_entry++) begin + for(write_offset = 0; write_offset < KV_NUM_DWORDS; write_offset++) begin + uvm_config_db#(reg [KV_ENTRY_ADDR_W-1:0])::set(null, "uvm_test_top.environment.kv_sha512_write_agent.sequencer.sha512_write_seq", "local_write_entry",write_entry); + uvm_config_db#(reg [KV_ENTRY_SIZE_W-1:0])::set(null, "uvm_test_top.environment.kv_sha512_write_agent.sequencer.sha512_write_seq", "local_write_offset",write_offset); + sha512_write_seq.start(configuration.kv_sha512_write_agent_config.sequencer); + end + end + + //Set each CTRL reg with random lock data + for(write_entry = 0; write_entry < KV_NUM_KEYS; write_entry++) begin + // Construct the transaction + lock_data = 'h3; //$urandom_range(1,7); //Can set one of lock_wr, lock_use, clear or all together + reg_model.kv_reg_rm.KEY_CTRL[write_entry].write(sts, lock_data, UVM_FRONTDOOR, reg_model.kv_AHB_map, this); + assert(sts == UVM_IS_OK) else `uvm_error("AHB_LOCK_SET", $sformatf("Failed when writing to KEY_CTRL[%d]",write_entry)) + end + + + //Unlock debug mode or clear secrets randomly + + std::randomize(debug_type); //0 - security state, 1 - clear secrets + + std::randomize(wait_cycles_from_seq) with { + wait_cycles_from_seq >= 5; + wait_cycles_from_seq <= 100; + }; + + std::randomize(clear_secrets_data); //wren, debug_value0/1 + + //Wait for random delay before starting debug txn + configuration.kv_rst_agent_config.wait_for_num_clocks(wait_cycles_from_seq); + + case(debug_type) + SECURITY_STATE: begin + //start debug seq on rst agent + kv_rst_agent_debug_seq.start(configuration.kv_rst_agent_config.sequencer); + end + CLEAR_SECRETS: begin + reg_model.kv_reg_rm.CLEAR_SECRETS.write(sts, clear_secrets_data, UVM_FRONTDOOR, reg_model.kv_AHB_map, this); + assert(sts == UVM_IS_OK) else `uvm_error("AHB_CLEAR_SECRETS_SET", "Failed when writing to CLEAR_SECRETS reg!") + end + endcase + + std::randomize(reset_type); + + case(reset_type) + WARM_RESET: begin + kv_warm_rst_seq.start(configuration.kv_rst_agent_config.sequencer); //locks cleared + end + COLD_RESET: begin + kv_cold_rst_seq.start(configuration.kv_rst_agent_config.sequencer); + end + endcase + + //Clear secrets again + warm rst, no locks this time + std::randomize(debug_type); + //debug_type = 1; + + std::randomize(wait_cycles_from_seq) with { + wait_cycles_from_seq >= 5; + wait_cycles_from_seq <= 100; + }; + + std::randomize(clear_secrets_data); //wren, debug_value0/1 + // clear_secrets_data = 'h3; + + //Wait for random delay before starting debug txn + configuration.kv_rst_agent_config.wait_for_num_clocks(wait_cycles_from_seq); + + case(debug_type) + SECURITY_STATE: begin + //start debug seq on rst agent + kv_rst_agent_debug_seq.start(configuration.kv_rst_agent_config.sequencer); + end + CLEAR_SECRETS: begin + reg_model.kv_reg_rm.CLEAR_SECRETS.write(sts, clear_secrets_data, UVM_FRONTDOOR, reg_model.kv_AHB_map, this); + assert(sts == UVM_IS_OK) else `uvm_error("AHB_CLEAR_SECRETS_SET", "Failed when writing to CLEAR_SECRETS reg!") + end + endcase + kv_warm_rst_seq.start(configuration.kv_rst_agent_config.sequencer); + + fork + // begin + // //Write to all entries + // for (write_entry = 0; write_entry < KV_NUM_KEYS; write_entry++) begin + // for(write_offset = 0; write_offset < KV_NUM_DWORDS; write_offset++) begin + // uvm_config_db#(reg [KV_ENTRY_ADDR_W-1:0])::set(null, "uvm_test_top.environment.kv_sha512_write_agent.sequencer.sha512_write_seq", "local_write_entry",write_entry); + // uvm_config_db#(reg [KV_ENTRY_SIZE_W-1:0])::set(null, "uvm_test_top.environment.kv_sha512_write_agent.sequencer.sha512_write_seq", "local_write_offset",write_offset); + // sha512_write_seq.start(configuration.kv_sha512_write_agent_config.sequencer); + // end + // end + // end + begin + //Read all entries + for (read_entry = 0; read_entry < KV_NUM_KEYS; read_entry++) begin + for (read_offset = 0; read_offset < KV_NUM_DWORDS; read_offset++) begin + uvm_config_db#(reg [KV_ENTRY_ADDR_W-1:0])::set(null, "uvm_test_top.environment.kv_sha512_block_read_agent.sequencer.sha512_block_read_seq", "local_read_entry",read_entry); + uvm_config_db#(reg [KV_ENTRY_SIZE_W-1:0])::set(null, "uvm_test_top.environment.kv_sha512_block_read_agent.sequencer.sha512_block_read_seq", "local_read_offset",read_offset); + sha512_block_read_seq.start(configuration.kv_sha512_block_read_agent_config.sequencer); + end + end + end + join + endtask +endclass \ No newline at end of file diff --git a/src/keyvault/uvmf_kv/uvmf_template_output/verification_ip/environment_packages/kv_env_pkg/src/kv_wr_rd_debug_warm_rst_sequence.svh b/src/keyvault/uvmf_kv/uvmf_template_output/verification_ip/environment_packages/kv_env_pkg/src/kv_wr_rd_debug_warm_rst_sequence.svh index 90eff5461..0f85dabf9 100644 --- a/src/keyvault/uvmf_kv/uvmf_template_output/verification_ip/environment_packages/kv_env_pkg/src/kv_wr_rd_debug_warm_rst_sequence.svh +++ b/src/keyvault/uvmf_kv/uvmf_template_output/verification_ip/environment_packages/kv_env_pkg/src/kv_wr_rd_debug_warm_rst_sequence.svh @@ -157,6 +157,8 @@ class kv_wr_rd_debug_warm_rst_sequence #( //Issue warm reset before reading kv_rst_agent_warm_rst_seq.start(configuration.kv_rst_agent_config.sequencer); + //Wait for warm reset to finish + configuration.kv_rst_agent_config.wait_for_num_clocks(10); //Read all entries for (read_entry = 0; read_entry < KV_NUM_KEYS; read_entry++) begin diff --git a/src/keyvault/uvmf_kv/uvmf_template_output/verification_ip/environment_packages/kv_env_pkg/src/kv_wr_rd_lock_sequence.svh b/src/keyvault/uvmf_kv/uvmf_template_output/verification_ip/environment_packages/kv_env_pkg/src/kv_wr_rd_lock_sequence.svh index 76791e6c6..37b51bb32 100644 --- a/src/keyvault/uvmf_kv/uvmf_template_output/verification_ip/environment_packages/kv_env_pkg/src/kv_wr_rd_lock_sequence.svh +++ b/src/keyvault/uvmf_kv/uvmf_template_output/verification_ip/environment_packages/kv_env_pkg/src/kv_wr_rd_lock_sequence.svh @@ -198,6 +198,47 @@ class kv_wr_rd_lock_sequence #( end end + //TODO: this needs env clean up! (Emulate 1 clk delay between key_entry_clear and wr_resp_error) + // //clear x write + // // fork + + // //Issue and wait for reset + // if(configuration.kv_rst_agent_config.sequencer != null) + // kv_rst_agent_poweron_seq.start(configuration.kv_rst_agent_config.sequencer); + // else + // `uvm_error("KV_WR_RD_LOCK", "kv_rst_agent_config.sequencer is null!") + + // // begin + // //Set each CTRL reg with random lock data + // for(int write_entry_temp = 0; write_entry_temp < KV_NUM_KEYS; write_entry_temp++) begin + // // if (write_entry_temp < KV_NUM_KEYS-1) begin + // // lock_data = $urandom_range(1,7); //Can set one of lock_wr, lock_use, clear or all together + // reg_model.kv_reg_rm.KEY_CTRL[write_entry_temp].write(sts, 'h4, UVM_FRONTDOOR, reg_model.kv_AHB_map, this); + // `uvm_info("KNU_LOCK", $sformatf("Setting KEY CTRL: %d", write_entry_temp), UVM_MEDIUM) + // assert(sts == UVM_IS_OK) else `uvm_error("AHB_LOCK_SET", $sformatf("Failed when writing to KEY_CTRL[%d]",write_entry_temp)) + // // end + + // for (int write_offset_temp = 0; write_offset_temp < KV_NUM_DWORDS; write_offset_temp++) begin + // // Construct the transaction + // uvm_config_db#(reg [KV_ENTRY_ADDR_W-1:0])::set(null, "uvm_test_top.environment.kv_hmac_write_agent.sequencer.hmac_write_seq", "local_write_entry",write_entry_temp); + // uvm_config_db#(reg [KV_ENTRY_SIZE_W-1:0])::set(null, "uvm_test_top.environment.kv_hmac_write_agent.sequencer.hmac_write_seq", "local_write_offset",write_offset_temp); + // `uvm_info("KNU_WRITE", $sformatf("Writing to entry: %0d, offset: %0d", write_entry_temp, write_offset_temp), UVM_MEDIUM) + // hmac_write_seq.start(configuration.kv_hmac_write_agent_config.sequencer); + // end + + + // end + // // end + + // // begin + // //Write to all entries, random offsets + // // for (int write_entry_temp = 0; write_entry_temp < KV_NUM_KEYS; write_entry_temp++) begin + + // // end + + // // end + // // join + endtask endclass \ No newline at end of file diff --git a/src/keyvault/uvmf_kv/uvmf_template_output/verification_ip/interface_packages/kv_read_pkg/src/kv_read_monitor_bfm.sv b/src/keyvault/uvmf_kv/uvmf_template_output/verification_ip/interface_packages/kv_read_pkg/src/kv_read_monitor_bfm.sv index 8f13af637..ff0275138 100644 --- a/src/keyvault/uvmf_kv/uvmf_template_output/verification_ip/interface_packages/kv_read_pkg/src/kv_read_monitor_bfm.sv +++ b/src/keyvault/uvmf_kv/uvmf_template_output/verification_ip/interface_packages/kv_read_pkg/src/kv_read_monitor_bfm.sv @@ -221,6 +221,7 @@ end kv_read_monitor_struct.error = kv_rd_resp_i[33]; kv_read_monitor_struct.last = kv_rd_resp_i[32]; kv_read_monitor_struct.read_data = kv_rd_resp_i[31:0]; + // pragma uvmf custom do_monitor end endtask diff --git a/src/keyvault/uvmf_kv/uvmf_template_output/verification_ip/interface_packages/kv_read_pkg/src/kv_read_transaction.svh b/src/keyvault/uvmf_kv/uvmf_template_output/verification_ip/interface_packages/kv_read_pkg/src/kv_read_transaction.svh index e53230806..1642ac4e6 100644 --- a/src/keyvault/uvmf_kv/uvmf_template_output/verification_ip/interface_packages/kv_read_pkg/src/kv_read_transaction.svh +++ b/src/keyvault/uvmf_kv/uvmf_template_output/verification_ip/interface_packages/kv_read_pkg/src/kv_read_transaction.svh @@ -124,7 +124,7 @@ class kv_read_transaction #( virtual function string convert2string(); // pragma uvmf custom convert2string begin // UVMF_CHANGE_ME : Customize format if desired. - return $sformatf("read_entry:0x%x read_offset:0x%x error: 0x%x last_dword: 0x%x read_data:0x%x ",read_entry,read_offset,error,last,read_data); + return $sformatf("read_entry:0x%x read_offset:0x%x read_resp_err: 0x%x last_dword: 0x%x read_data:0x%x ",read_entry,read_offset,error,last,read_data); // pragma uvmf custom convert2string end endfunction diff --git a/src/keyvault/uvmf_kv/uvmf_template_output/verification_ip/interface_packages/kv_read_pkg/src/kv_read_transaction_coverage.svh b/src/keyvault/uvmf_kv/uvmf_template_output/verification_ip/interface_packages/kv_read_pkg/src/kv_read_transaction_coverage.svh index e7e5e9255..83a9258f0 100644 --- a/src/keyvault/uvmf_kv/uvmf_template_output/verification_ip/interface_packages/kv_read_pkg/src/kv_read_transaction_coverage.svh +++ b/src/keyvault/uvmf_kv/uvmf_template_output/verification_ip/interface_packages/kv_read_pkg/src/kv_read_transaction_coverage.svh @@ -28,6 +28,17 @@ //---------------------------------------------------------------------- //---------------------------------------------------------------------- // +// + +covergroup rd_data(input logic rd_data_bit); + option.per_instance = 1; + value: coverpoint rd_data_bit; + transition: coverpoint rd_data_bit { + bins bin01 = (0 => 1); + bins bin10 = (1 => 0); + } +endgroup + class kv_read_transaction_coverage #( string KV_READ_REQUESTOR = "HMAC_KEY" ) @@ -44,6 +55,7 @@ class kv_read_transaction_coverage #( T coverage_trans; // pragma uvmf custom class_item_additional begin + rd_data rd_data_bus[KV_DATA_W]; // pragma uvmf custom class_item_additional end // **************************************************************************** @@ -58,7 +70,9 @@ class kv_read_transaction_coverage #( } error: coverpoint coverage_trans.error; last: coverpoint coverage_trans.last; - //read_data: coverpoint coverage_trans.read_data; + //read_data: coverpoint coverage_trans.read_data; --> tgl coverage here + //cross last with diff offsets + lastXoffset: cross last, read_offset; // pragma uvmf custom covergroup end endgroup @@ -89,7 +103,12 @@ class kv_read_transaction_coverage #( virtual function void write (T t); `uvm_info("COV","Received transaction",UVM_HIGH); coverage_trans = t; + + foreach(rd_data_bus[i]) rd_data_bus[i] = new(coverage_trans.read_data[i]); + foreach(rd_data_bus[i]) rd_data_bus[i].set_inst_name($sformatf("rd_data_bus[%0d]_%s",i,get_full_name())); + kv_read_transaction_cg.sample(); + foreach(rd_data_bus[i]) rd_data_bus[i].sample(); endfunction endclass diff --git a/src/keyvault/uvmf_kv/uvmf_template_output/verification_ip/interface_packages/kv_rst_pkg/src/kv_rst_cold_rst_sequence.svh b/src/keyvault/uvmf_kv/uvmf_template_output/verification_ip/interface_packages/kv_rst_pkg/src/kv_rst_cold_rst_sequence.svh index 99bfe2ea9..80d5f746a 100644 --- a/src/keyvault/uvmf_kv/uvmf_template_output/verification_ip/interface_packages/kv_rst_pkg/src/kv_rst_cold_rst_sequence.svh +++ b/src/keyvault/uvmf_kv/uvmf_template_output/verification_ip/interface_packages/kv_rst_pkg/src/kv_rst_cold_rst_sequence.svh @@ -57,6 +57,7 @@ class kv_rst_cold_rst_sequence extends kv_rst_sequence_base; req.assert_rst = 1'b1; req.assert_core_rst = 1'b1; req.debug_mode = 1'b0; + req.scan_mode = 1'b0; finish_item(req); `uvm_info("KV_RST_COLD_RST", {"Response:",req.convert2string()},UVM_MEDIUM) @@ -71,6 +72,7 @@ class kv_rst_cold_rst_sequence extends kv_rst_sequence_base; req.assert_rst = 1'b1; req.assert_core_rst = 1'b1; req.debug_mode = 1'b0; + req.scan_mode = 1'b0; finish_item(req); `uvm_info("KV_RST_COLD_RST", {"Response:",req.convert2string()},UVM_MEDIUM) @@ -85,6 +87,7 @@ class kv_rst_cold_rst_sequence extends kv_rst_sequence_base; req.assert_rst = 1'b0; req.assert_core_rst = 1'b0; req.debug_mode = 1'b0; + req.scan_mode = 1'b0; finish_item(req); `uvm_info("KV_RST_COLD_RST", {"Response:",req.convert2string()},UVM_MEDIUM) diff --git a/src/keyvault/uvmf_kv/uvmf_template_output/verification_ip/interface_packages/kv_rst_pkg/src/kv_rst_core_rst_sequence.svh b/src/keyvault/uvmf_kv/uvmf_template_output/verification_ip/interface_packages/kv_rst_pkg/src/kv_rst_core_rst_sequence.svh index 1b3aa73d2..770007363 100644 --- a/src/keyvault/uvmf_kv/uvmf_template_output/verification_ip/interface_packages/kv_rst_pkg/src/kv_rst_core_rst_sequence.svh +++ b/src/keyvault/uvmf_kv/uvmf_template_output/verification_ip/interface_packages/kv_rst_pkg/src/kv_rst_core_rst_sequence.svh @@ -56,6 +56,7 @@ class kv_rst_core_rst_sequence extends kv_rst_sequence_base; req.assert_rst = 1'b0; req.assert_core_rst = 1'b1; req.debug_mode = 1'b0; + req.scan_mode = 1'b0; finish_item(req); `uvm_info("KV_RST_CORE_RST", {"Response:",req.convert2string()},UVM_MEDIUM) @@ -70,6 +71,7 @@ class kv_rst_core_rst_sequence extends kv_rst_sequence_base; req.assert_rst = 1'b0; req.assert_core_rst = 1'b0; req.debug_mode = 1'b0; + req.scan_mode = 1'b0; finish_item(req); `uvm_info("KV_RST_CORE_RST", {"Response:",req.convert2string()},UVM_MEDIUM) diff --git a/src/keyvault/uvmf_kv/uvmf_template_output/verification_ip/interface_packages/kv_rst_pkg/src/kv_rst_debug_sequence.svh b/src/keyvault/uvmf_kv/uvmf_template_output/verification_ip/interface_packages/kv_rst_pkg/src/kv_rst_debug_sequence.svh index 09869a7b7..129d9fc8b 100644 --- a/src/keyvault/uvmf_kv/uvmf_template_output/verification_ip/interface_packages/kv_rst_pkg/src/kv_rst_debug_sequence.svh +++ b/src/keyvault/uvmf_kv/uvmf_template_output/verification_ip/interface_packages/kv_rst_pkg/src/kv_rst_debug_sequence.svh @@ -56,6 +56,7 @@ class kv_rst_debug_sequence extends kv_rst_sequence_base; req.assert_rst = 1'b0; req.assert_core_rst = 1'b0; req.debug_mode = 1'b1; + req.scan_mode = 1'b0; finish_item(req); `uvm_info("KV_RST_DEBUG", {"Response:",req.convert2string()},UVM_MEDIUM) @@ -70,6 +71,7 @@ class kv_rst_debug_sequence extends kv_rst_sequence_base; req.assert_rst = 1'b0; req.assert_core_rst = 1'b0; req.debug_mode = 1'b0; + req.scan_mode = 1'b0; finish_item(req); `uvm_info("KV_RST_DEBUG", {"Response:",req.convert2string()},UVM_MEDIUM) diff --git a/src/keyvault/uvmf_kv/uvmf_template_output/verification_ip/interface_packages/kv_rst_pkg/src/kv_rst_driver_bfm.sv b/src/keyvault/uvmf_kv/uvmf_template_output/verification_ip/interface_packages/kv_rst_pkg/src/kv_rst_driver_bfm.sv index 961f86bfd..8e81c2500 100644 --- a/src/keyvault/uvmf_kv/uvmf_template_output/verification_ip/interface_packages/kv_rst_pkg/src/kv_rst_driver_bfm.sv +++ b/src/keyvault/uvmf_kv/uvmf_template_output/verification_ip/interface_packages/kv_rst_pkg/src/kv_rst_driver_bfm.sv @@ -112,8 +112,12 @@ end reg rst_b_o = 'bz; tri core_only_rst_b_i; reg core_only_rst_b_o = 'bz; + tri fw_update_rst_window_i; + reg fw_update_rst_window_o = 'bz; tri debug_locked_i; reg debug_locked_o = 'bz; + tri cptra_in_debug_scan_mode_i; + reg cptra_in_debug_scan_mode_o = 'bz; // Bi-directional signals @@ -133,8 +137,12 @@ end assign rst_b_i = bus.rst_b; assign bus.core_only_rst_b = (initiator_responder == INITIATOR) ? core_only_rst_b_o : 'bz; assign core_only_rst_b_i = bus.core_only_rst_b; + assign bus.fw_update_rst_window = (initiator_responder == INITIATOR) ? fw_update_rst_window_o : 'bz; + assign fw_update_rst_window_i = bus.fw_update_rst_window; assign bus.debug_locked = (initiator_responder == INITIATOR) ? debug_locked_o : 'bz; assign debug_locked_i = bus.debug_locked; + assign bus.cptra_in_debug_scan_mode = (initiator_responder == INITIATOR) ? cptra_in_debug_scan_mode_o : 'bz; + assign cptra_in_debug_scan_mode_i = bus.cptra_in_debug_scan_mode; // Proxy handle to UVM driver kv_rst_pkg::kv_rst_driver proxy; @@ -169,7 +177,9 @@ end cptra_pwrgood_o <= 'bz; rst_b_o <= 'bz; core_only_rst_b_o <= 'bz; + fw_update_rst_window_o <= 'bz; debug_locked_o <= 'b1; + cptra_in_debug_scan_mode_o <= 'b0; // Bi-directional signals end @@ -244,12 +254,19 @@ end if (initiator_struct.assert_rst) rst_b_o <= 1'b0; + if (initiator_struct.assert_core_rst) + fw_update_rst_window_o <= 1'b1; if (initiator_struct.assert_core_rst) core_only_rst_b_o <= 1'b0; if (!initiator_struct.set_pwrgood) cptra_pwrgood_o <= 1'b0; if (initiator_struct.debug_mode) debug_locked_o <= 1'b1; + if (initiator_struct.debug_mode | initiator_struct.scan_mode) + cptra_in_debug_scan_mode_o <= 1'b1; + else + cptra_in_debug_scan_mode_o <= 1'b0; + // Wait for the responder to complete the transfer then place the responder data into // kv_rst_responder_struct. @@ -257,6 +274,8 @@ end @(posedge clk_i); if (!initiator_struct.assert_rst) rst_b_o <= 1'b1; + if (!initiator_struct.assert_core_rst) + fw_update_rst_window_o <= 1'b0; if (!initiator_struct.assert_core_rst) core_only_rst_b_o <= 1'b1; if (initiator_struct.set_pwrgood) @@ -270,6 +289,7 @@ end kv_rst_responder_struct.assert_rst = !rst_b_i; kv_rst_responder_struct.assert_core_rst = !core_only_rst_b_i; kv_rst_responder_struct.debug_mode = debug_locked_i; + kv_rst_responder_struct.scan_mode = cptra_in_debug_scan_mode_i & !debug_locked_i; responder_struct = kv_rst_responder_struct; endtask // pragma uvmf custom initiate_and_get_response end diff --git a/src/keyvault/uvmf_kv/uvmf_template_output/verification_ip/interface_packages/kv_rst_pkg/src/kv_rst_if.sv b/src/keyvault/uvmf_kv/uvmf_template_output/verification_ip/interface_packages/kv_rst_pkg/src/kv_rst_if.sv index 3073307be..e9fc3aafd 100644 --- a/src/keyvault/uvmf_kv/uvmf_template_output/verification_ip/interface_packages/kv_rst_pkg/src/kv_rst_if.sv +++ b/src/keyvault/uvmf_kv/uvmf_template_output/verification_ip/interface_packages/kv_rst_pkg/src/kv_rst_if.sv @@ -37,6 +37,7 @@ // .dut_signal_port(kv_rst_bus.rst_b), // Agent output // .dut_signal_port(kv_rst_bus.core_only_rst_b), // Agent output // .dut_signal_port(kv_rst_bus.debug_locked), // Agent output +// .dut_signal_port(kv_rst_bus.cptra_in_debug_scan_mode), // Agent output import uvmf_base_pkg_hdl::*; import kv_rst_pkg_hdl::*; @@ -49,7 +50,9 @@ interface kv_rst_if inout tri cptra_pwrgood, inout tri rst_b, inout tri core_only_rst_b, - inout tri debug_locked + inout tri fw_update_rst_window, + inout tri debug_locked, + inout tri cptra_in_debug_scan_mode ); modport monitor_port @@ -59,7 +62,9 @@ modport monitor_port input cptra_pwrgood, input rst_b, input core_only_rst_b, - input debug_locked + input fw_update_rst_window, + input debug_locked, + input cptra_in_debug_scan_mode ); modport initiator_port @@ -69,7 +74,9 @@ modport initiator_port output cptra_pwrgood, output rst_b, output core_only_rst_b, - output debug_locked + output fw_update_rst_window, + output debug_locked, + output cptra_in_debug_scan_mode ); modport responder_port @@ -79,7 +86,9 @@ modport responder_port input cptra_pwrgood, input rst_b, input core_only_rst_b, - input debug_locked + input fw_update_rst_window, + input debug_locked, + input cptra_in_debug_scan_mode ); diff --git a/src/keyvault/uvmf_kv/uvmf_template_output/verification_ip/interface_packages/kv_rst_pkg/src/kv_rst_macros.svh b/src/keyvault/uvmf_kv/uvmf_template_output/verification_ip/interface_packages/kv_rst_pkg/src/kv_rst_macros.svh index 51aa84b58..2cdcba5c9 100644 --- a/src/keyvault/uvmf_kv/uvmf_template_output/verification_ip/interface_packages/kv_rst_pkg/src/kv_rst_macros.svh +++ b/src/keyvault/uvmf_kv/uvmf_template_output/verification_ip/interface_packages/kv_rst_pkg/src/kv_rst_macros.svh @@ -68,6 +68,7 @@ typedef struct packed { \ bit assert_core_rst ; \ int unsigned wait_cycles ; \ bit debug_mode ; \ + bit scan_mode ; \ } kv_rst_monitor_s; `define kv_rst_TO_MONITOR_STRUCT_FUNCTION \ @@ -78,7 +79,8 @@ typedef struct packed { \ this.assert_rst , \ this.assert_core_rst , \ this.wait_cycles , \ - this.debug_mode \ + this.debug_mode , \ + this.scan_mode \ };\ return ( kv_rst_monitor_struct);\ endfunction\ @@ -90,7 +92,8 @@ typedef struct packed { \ this.assert_rst , \ this.assert_core_rst , \ this.wait_cycles , \ - this.debug_mode \ + this.debug_mode , \ + this.scan_mode \ } = kv_rst_monitor_struct;\ endfunction @@ -105,6 +108,7 @@ typedef struct packed { \ bit assert_core_rst ; \ int unsigned wait_cycles ; \ bit debug_mode ; \ + bit scan_mode ; \ } kv_rst_initiator_s; `define kv_rst_TO_INITIATOR_STRUCT_FUNCTION \ @@ -115,7 +119,8 @@ typedef struct packed { \ this.assert_rst , \ this.assert_core_rst , \ this.wait_cycles , \ - this.debug_mode \ + this.debug_mode , \ + this.scan_mode \ };\ return ( kv_rst_initiator_struct);\ endfunction @@ -127,7 +132,8 @@ typedef struct packed { \ this.assert_rst , \ this.assert_core_rst , \ this.wait_cycles , \ - this.debug_mode \ + this.debug_mode , \ + this.scan_mode \ } = kv_rst_initiator_struct;\ endfunction @@ -142,6 +148,7 @@ typedef struct packed { \ bit assert_core_rst ; \ int unsigned wait_cycles ; \ bit debug_mode ; \ + bit scan_mode ; \ } kv_rst_responder_s; `define kv_rst_TO_RESPONDER_STRUCT_FUNCTION \ @@ -152,7 +159,8 @@ typedef struct packed { \ this.assert_rst , \ this.assert_core_rst , \ this.wait_cycles , \ - this.debug_mode \ + this.debug_mode , \ + this.scan_mode \ };\ return ( kv_rst_responder_struct);\ endfunction @@ -164,7 +172,8 @@ typedef struct packed { \ this.assert_rst , \ this.assert_core_rst , \ this.wait_cycles , \ - this.debug_mode \ + this.debug_mode , \ + this.scan_mode \ } = kv_rst_responder_struct;\ endfunction // pragma uvmf custom additional begin diff --git a/src/keyvault/uvmf_kv/uvmf_template_output/verification_ip/interface_packages/kv_rst_pkg/src/kv_rst_monitor_bfm.sv b/src/keyvault/uvmf_kv/uvmf_template_output/verification_ip/interface_packages/kv_rst_pkg/src/kv_rst_monitor_bfm.sv index 5d17716e2..2d27cd624 100644 --- a/src/keyvault/uvmf_kv/uvmf_template_output/verification_ip/interface_packages/kv_rst_pkg/src/kv_rst_monitor_bfm.sv +++ b/src/keyvault/uvmf_kv/uvmf_template_output/verification_ip/interface_packages/kv_rst_pkg/src/kv_rst_monitor_bfm.sv @@ -86,13 +86,17 @@ end tri cptra_pwrgood_i; tri rst_b_i; tri core_only_rst_b_i; + tri fw_update_rst_window_i; tri debug_locked_i; + tri cptra_in_debug_scan_mode_i; assign clk_i = bus.clk; assign dummy_i = bus.dummy; assign cptra_pwrgood_i = bus.cptra_pwrgood; assign rst_b_i = bus.rst_b; assign core_only_rst_b_i = bus.core_only_rst_b; + assign fw_update_rst_window_i = bus.fw_update_rst_window; assign debug_locked_i = bus.debug_locked; + assign cptra_in_debug_scan_mode_i = bus.cptra_in_debug_scan_mode; // Proxy handle to UVM monitor kv_rst_pkg::kv_rst_monitor proxy; @@ -102,14 +106,18 @@ end reg cptra_pwrgood_o = 'b0; reg rst_b_o = 'b0; reg core_only_rst_b_o = 'b0; + reg fw_update_rst_window_o = 'b0; reg debug_locked_o = 'b0; + reg cptra_in_debug_scan_mode_o = 'b0; function bit any_signal_changed(); return |(cptra_pwrgood_i ^ cptra_pwrgood_o) || |(rst_b_i ^ rst_b_o) || |(core_only_rst_b_i ^ core_only_rst_b_o) || - |(debug_locked_i ^ debug_locked_o); + |(fw_update_rst_window_i ^ fw_update_rst_window_o) || + |(debug_locked_i ^ debug_locked_o) || + |(cptra_in_debug_scan_mode_i ^ cptra_in_debug_scan_mode_o); endfunction @@ -191,7 +199,8 @@ end // kv_rst_monitor_struct.xyz = cptra_pwrgood_i; // // kv_rst_monitor_struct.xyz = rst_b_i; // // kv_rst_monitor_struct.xyz = core_only_rst_b_i; // - // kv_rst_monitor_struct.xyz = debug_locked_i; // + // kv_rst_monitor_struct.xyz = debug_locked_i; // + // kv_rst_monitor_struct.xyz = cptra_in_debug_scan_mode_i; // // pragma uvmf custom do_monitor begin // UVMF_CHANGE_ME : Implement protocol monitoring. The commented reference code // below are examples of how to capture signal values and assign them to @@ -202,16 +211,19 @@ end // the next transfer. One clock cycle is consumed between calls to do_monitor. while (!any_signal_changed()) @(posedge clk_i); - cptra_pwrgood_o <= cptra_pwrgood_i; - rst_b_o <= rst_b_i; - core_only_rst_b_o <= core_only_rst_b_i; - debug_locked_o <= debug_locked_i; + cptra_pwrgood_o <= cptra_pwrgood_i; + rst_b_o <= rst_b_i; + core_only_rst_b_o <= core_only_rst_b_i; + fw_update_rst_window_o <= fw_update_rst_window_i; + debug_locked_o <= debug_locked_i; + cptra_in_debug_scan_mode_o <= cptra_in_debug_scan_mode_i; kv_rst_monitor_struct.set_pwrgood = cptra_pwrgood_i; kv_rst_monitor_struct.assert_rst = !rst_b_i; kv_rst_monitor_struct.assert_core_rst = !core_only_rst_b_i; kv_rst_monitor_struct.wait_cycles = 0; kv_rst_monitor_struct.debug_mode = debug_locked_i; + kv_rst_monitor_struct.scan_mode = cptra_in_debug_scan_mode_i & !debug_locked_i; // pragma uvmf custom do_monitor end endtask diff --git a/src/keyvault/uvmf_kv/uvmf_template_output/verification_ip/interface_packages/kv_rst_pkg/src/kv_rst_poweron_sequence.svh b/src/keyvault/uvmf_kv/uvmf_template_output/verification_ip/interface_packages/kv_rst_pkg/src/kv_rst_poweron_sequence.svh index 66f53ec66..8d0fa8c15 100644 --- a/src/keyvault/uvmf_kv/uvmf_template_output/verification_ip/interface_packages/kv_rst_pkg/src/kv_rst_poweron_sequence.svh +++ b/src/keyvault/uvmf_kv/uvmf_template_output/verification_ip/interface_packages/kv_rst_pkg/src/kv_rst_poweron_sequence.svh @@ -56,6 +56,7 @@ class kv_rst_poweron_sequence extends kv_rst_sequence_base; req.assert_rst = 1'b1; req.assert_core_rst = 1'b1; req.debug_mode = 1'b0; + req.scan_mode = 1'b0; finish_item(req); `uvm_info("KV_RST_POWERON", {"Response:",req.convert2string()},UVM_MEDIUM) @@ -69,6 +70,7 @@ class kv_rst_poweron_sequence extends kv_rst_sequence_base; req.assert_rst = 1'b1; req.assert_core_rst = 1'b1; req.debug_mode = 1'b0; + req.scan_mode = 1'b0; finish_item(req); `uvm_info("KV_RST_POWERON", {"Response:",req.convert2string()},UVM_MEDIUM) @@ -82,6 +84,7 @@ class kv_rst_poweron_sequence extends kv_rst_sequence_base; req.assert_rst = 1'b0; req.assert_core_rst = 1'b0; req.debug_mode = 1'b0; + req.scan_mode = 1'b0; finish_item(req); `uvm_info("KV_RST_POWERON", {"Response:",req.convert2string()},UVM_MEDIUM) diff --git a/src/keyvault/uvmf_kv/uvmf_template_output/verification_ip/interface_packages/kv_rst_pkg/src/kv_rst_transaction.svh b/src/keyvault/uvmf_kv/uvmf_template_output/verification_ip/interface_packages/kv_rst_pkg/src/kv_rst_transaction.svh index 0ed69e68e..fdbcca661 100644 --- a/src/keyvault/uvmf_kv/uvmf_template_output/verification_ip/interface_packages/kv_rst_pkg/src/kv_rst_transaction.svh +++ b/src/keyvault/uvmf_kv/uvmf_template_output/verification_ip/interface_packages/kv_rst_pkg/src/kv_rst_transaction.svh @@ -37,6 +37,7 @@ class kv_rst_transaction extends uvmf_transaction_base; bit assert_core_rst ; rand int unsigned wait_cycles ; rand bit debug_mode ; + rand bit scan_mode ; //Constraints for the transaction variables: constraint wait_cycles_c { wait_cycles dist {[1:25] := 80, [25:100] := 15, [100:500] := 5}; } @@ -120,7 +121,7 @@ class kv_rst_transaction extends uvmf_transaction_base; virtual function string convert2string(); // pragma uvmf custom convert2string begin // UVMF_CHANGE_ME : Customize format if desired. - return $sformatf("set_pwrgood:0x%x assert_rst:0x%x assert_core_rst:0x%x wait_cycles:0x%x debug_mode:0x%x",set_pwrgood,assert_rst,assert_core_rst,wait_cycles,debug_mode); + return $sformatf("set_pwrgood:0x%x assert_rst:0x%x assert_core_rst:0x%x wait_cycles:0x%x debug_mode:0x%x scan_mode: 0x%x",set_pwrgood,assert_rst,assert_core_rst,wait_cycles,debug_mode,scan_mode); // pragma uvmf custom convert2string end endfunction @@ -167,6 +168,7 @@ class kv_rst_transaction extends uvmf_transaction_base; this.assert_core_rst = RHS.assert_core_rst; this.wait_cycles = RHS.wait_cycles; this.debug_mode = RHS.debug_mode; + this.scan_mode = RHS.scan_mode; // pragma uvmf custom do_copy end endfunction diff --git a/src/keyvault/uvmf_kv/uvmf_template_output/verification_ip/interface_packages/kv_rst_pkg/src/kv_rst_transaction_coverage.svh b/src/keyvault/uvmf_kv/uvmf_template_output/verification_ip/interface_packages/kv_rst_pkg/src/kv_rst_transaction_coverage.svh index 48c717306..025bfaad1 100644 --- a/src/keyvault/uvmf_kv/uvmf_template_output/verification_ip/interface_packages/kv_rst_pkg/src/kv_rst_transaction_coverage.svh +++ b/src/keyvault/uvmf_kv/uvmf_template_output/verification_ip/interface_packages/kv_rst_pkg/src/kv_rst_transaction_coverage.svh @@ -48,10 +48,15 @@ class kv_rst_transaction_coverage extends uvm_subscriber #(.T(kv_rst_transactio assert_core_rst: coverpoint coverage_trans.assert_core_rst; //wait_cycles: coverpoint coverage_trans.wait_cycles; debug_mode: coverpoint coverage_trans.debug_mode; + // scan_mode: coverpoint coverage_trans.scan_mode; warm_rstXdbg: cross assert_rst, debug_mode; cold_rstXdbg: cross set_pwrgood, debug_mode; core_rstXdbg: cross assert_core_rst, debug_mode; + + // warm_rstXscan: cross assert_rst, scan_mode; + // cold_rstXscan: cross set_pwrgood, scan_mode; + // core_rstXscan: cross assert_core_rst, scan_mode; // pragma uvmf custom covergroup end endgroup diff --git a/src/keyvault/uvmf_kv/uvmf_template_output/verification_ip/interface_packages/kv_rst_pkg/src/kv_rst_warm_rst_sequence.svh b/src/keyvault/uvmf_kv/uvmf_template_output/verification_ip/interface_packages/kv_rst_pkg/src/kv_rst_warm_rst_sequence.svh index 4dc4e3f7b..8bc89e23d 100644 --- a/src/keyvault/uvmf_kv/uvmf_template_output/verification_ip/interface_packages/kv_rst_pkg/src/kv_rst_warm_rst_sequence.svh +++ b/src/keyvault/uvmf_kv/uvmf_template_output/verification_ip/interface_packages/kv_rst_pkg/src/kv_rst_warm_rst_sequence.svh @@ -56,6 +56,7 @@ class kv_rst_warm_rst_sequence extends kv_rst_sequence_base; req.assert_rst = 1'b1; req.assert_core_rst = 1'b1; req.debug_mode = 1'b0; + req.scan_mode = 1'b0; finish_item(req); `uvm_info("KV_RST_WARM_RST", {"Response:",req.convert2string()},UVM_MEDIUM) @@ -70,6 +71,7 @@ class kv_rst_warm_rst_sequence extends kv_rst_sequence_base; req.assert_rst = 1'b0; req.assert_core_rst = 1'b0; req.debug_mode = 1'b0; + req.scan_mode = 1'b0; finish_item(req); `uvm_info("KV_RST_WARM_RST", {"Response:",req.convert2string()},UVM_MEDIUM) diff --git a/src/keyvault/uvmf_kv/uvmf_template_output/verification_ip/interface_packages/kv_rst_pkg/yaml/kv_rst_interface.yaml b/src/keyvault/uvmf_kv/uvmf_template_output/verification_ip/interface_packages/kv_rst_pkg/yaml/kv_rst_interface.yaml index 0fcb48a9d..977f71987 100644 --- a/src/keyvault/uvmf_kv/uvmf_template_output/verification_ip/interface_packages/kv_rst_pkg/yaml/kv_rst_interface.yaml +++ b/src/keyvault/uvmf_kv/uvmf_template_output/verification_ip/interface_packages/kv_rst_pkg/yaml/kv_rst_interface.yaml @@ -28,6 +28,10 @@ uvmf: name: debug_locked reset_value: '''bz' width: '1' + - dir: output + name: cptra_in_debug_scan_mode + reset_value: '''bz' + width: '1' reset: dummy reset_assertion_level: 'False' transaction_constraints: @@ -65,4 +69,10 @@ uvmf: name: debug_mode type: bit unpacked_dimension: '' + - comment: '' + iscompare: 'False' + isrand: 'False' + name: scan_mode + type: bit + unpacked_dimension: '' use_dpi_link: 'False' diff --git a/src/keyvault/uvmf_kv/uvmf_template_output/verification_ip/interface_packages/kv_write_pkg/src/kv_write_monitor_bfm.sv b/src/keyvault/uvmf_kv/uvmf_template_output/verification_ip/interface_packages/kv_write_pkg/src/kv_write_monitor_bfm.sv index 72e944f66..8fd65c003 100644 --- a/src/keyvault/uvmf_kv/uvmf_template_output/verification_ip/interface_packages/kv_write_pkg/src/kv_write_monitor_bfm.sv +++ b/src/keyvault/uvmf_kv/uvmf_template_output/verification_ip/interface_packages/kv_write_pkg/src/kv_write_monitor_bfm.sv @@ -234,7 +234,6 @@ end kv_write_monitor_struct.write_dest_valid = write_dest_valid_o; //kv_write_i[46:41]; kv_write_monitor_struct.error = error_o; - // pragma uvmf custom do_monitor end endtask diff --git a/src/keyvault/uvmf_kv/uvmf_template_output/verification_ip/interface_packages/kv_write_pkg/src/kv_write_transaction.svh b/src/keyvault/uvmf_kv/uvmf_template_output/verification_ip/interface_packages/kv_write_pkg/src/kv_write_transaction.svh index 3a79a1432..3744645df 100644 --- a/src/keyvault/uvmf_kv/uvmf_template_output/verification_ip/interface_packages/kv_write_pkg/src/kv_write_transaction.svh +++ b/src/keyvault/uvmf_kv/uvmf_template_output/verification_ip/interface_packages/kv_write_pkg/src/kv_write_transaction.svh @@ -44,7 +44,7 @@ class kv_write_transaction #( logic error; //Constraints for the transaction variables: - constraint dest_valid_c { if (KV_WRITE_REQUESTOR inside {"ECC", "HMAC", "DOE", "SHA512"}) write_dest_valid == 31; } + constraint dest_valid_c {0 <= write_dest_valid <= 31;} //{ if (KV_WRITE_REQUESTOR inside {"ECC", "HMAC", "DOE", "SHA512"}) write_dest_valid == 31; } constraint write_en_c {write_en == 1'b1;} constraint write_offset_c {write_offset >= 0; write_offset < 12;} // pragma uvmf custom class_item_additional begin @@ -126,7 +126,7 @@ class kv_write_transaction #( virtual function string convert2string(); // pragma uvmf custom convert2string begin // UVMF_CHANGE_ME : Customize format if desired. - return $sformatf("write_en:0x%x write_entry:0x%x write_offset: 0x%x write_data:0x%x write_dest_valid:0x%x error:0x%x",write_en,write_entry,write_offset,write_data,write_dest_valid,error); + return $sformatf("write_en:0x%x write_entry:0x%x write_offset: 0x%x write_data:0x%x write_dest_valid:0x%x write_resp_err:0x%x",write_en,write_entry,write_offset,write_data,write_dest_valid,error); // pragma uvmf custom convert2string end endfunction diff --git a/src/keyvault/uvmf_kv/uvmf_template_output/verification_ip/interface_packages/kv_write_pkg/src/kv_write_transaction_coverage.svh b/src/keyvault/uvmf_kv/uvmf_template_output/verification_ip/interface_packages/kv_write_pkg/src/kv_write_transaction_coverage.svh index 25bf94115..4ab8d7496 100644 --- a/src/keyvault/uvmf_kv/uvmf_template_output/verification_ip/interface_packages/kv_write_pkg/src/kv_write_transaction_coverage.svh +++ b/src/keyvault/uvmf_kv/uvmf_template_output/verification_ip/interface_packages/kv_write_pkg/src/kv_write_transaction_coverage.svh @@ -28,6 +28,16 @@ //---------------------------------------------------------------------- //---------------------------------------------------------------------- // + +// covergroup data_bit_cg(input logic data_bit); +// option.per_instance = 1; +// value: coverpoint data_bit; +// transition: coverpoint data_bit { +// bins bin01 = (0 => 1); +// bins bin10 = (1 => 0); +// } +// endgroup + class kv_write_transaction_coverage #( string KV_WRITE_REQUESTOR = "HMAC" ) @@ -42,8 +52,12 @@ class kv_write_transaction_coverage #( ) T coverage_trans; + // pragma uvmf custom class_item_additional begin + // data_bit_cg wr_data_bus[KV_DATA_W]; + // data_bit_cg dest_valid_bus[KV_NUM_READ]; + // pragma uvmf custom class_item_additional end // **************************************************************************** @@ -54,11 +68,9 @@ class kv_write_transaction_coverage #( option.per_instance=1; write_en: coverpoint coverage_trans.write_en; write_entry: coverpoint coverage_trans.write_entry; - //write_data: coverpoint coverage_trans.write_data; write_offset: coverpoint coverage_trans.write_offset { illegal_bins wr_offset_12_15 = {['d12:'d15]}; } - //write_dest_valid: coverpoint coverage_trans.write_dest_valid; //TODO error: coverpoint coverage_trans.error; // pragma uvmf custom covergroup end endgroup @@ -70,16 +82,11 @@ class kv_write_transaction_coverage #( function new(string name="", uvm_component parent=null); super.new(name,parent); kv_write_transaction_cg=new; + // key_ctrl_cg = new; //`uvm_warning("COVERAGE_MODEL_REVIEW", "A covergroup has been constructed which may need review because of either generation or re-generation with merging. Please note that transaction variables added as a result of re-generation and merging are not automatically added to the covergroup. Remove this warning after the covergroup has been reviewed.") endfunction - // **************************************************************************** - // FUNCTION : build_phase() - // This function is the standard UVM build_phase. - // - function void build_phase(uvm_phase phase); - kv_write_transaction_cg.set_inst_name($sformatf("kv_write_transaction_cg_%s",get_full_name())); - endfunction + // **************************************************************************** // FUNCTION: write (T t) @@ -90,7 +97,25 @@ class kv_write_transaction_coverage #( virtual function void write (T t); `uvm_info("COV","Received transaction",UVM_HIGH); coverage_trans = t; + + // foreach(wr_data_bus[i]) wr_data_bus[i] = new(coverage_trans.write_data[i]); + // foreach(wr_data_bus[i]) wr_data_bus[i].set_inst_name($sformatf("wr_data_bus[%0d]_%s",i,get_full_name())); + + // foreach(dest_valid_bus[i]) dest_valid_bus[i] = new(coverage_trans.write_dest_valid[i]); + // foreach(dest_valid_bus[i]) dest_valid_bus[i].set_inst_name($sformatf("dest_valid_bus[%0d]_%s",i,get_full_name())); + kv_write_transaction_cg.sample(); + // foreach(wr_data_bus[i]) wr_data_bus[i].sample(); + // foreach(dest_valid_bus[i]) dest_valid_bus[i].sample(); + + endfunction + + // **************************************************************************** + // FUNCTION : build_phase() + // This function is the standard UVM build_phase. + // + function void build_phase(uvm_phase phase); + kv_write_transaction_cg.set_inst_name($sformatf("kv_write_transaction_cg_%s",get_full_name())); endfunction endclass diff --git a/src/kmac/config/compile.yml b/src/kmac/config/compile.yml index c6205ec1d..7280c6a78 100644 --- a/src/kmac/config/compile.yml +++ b/src/kmac/config/compile.yml @@ -11,7 +11,7 @@ provides: [kmac] schema_version: 2.4.0 requires: - kmac_pkg - - prim_pkg + - caliptra_prim_pkg - lc_ctrl_pkg targets: rtl: diff --git a/src/kmac/config/kmac.vf b/src/kmac/config/kmac.vf index 03fb36cc7..21bfb92e0 100644 --- a/src/kmac/config/kmac.vf +++ b/src/kmac/config/kmac.vf @@ -1,12 +1,13 @@ -+incdir+${CALIPTRA_ROOT}/src/prim/rtl ++incdir+${CALIPTRA_ROOT}/src/caliptra_prim/rtl +incdir+${CALIPTRA_ROOT}/src/lc_ctrl/rtl +incdir+${CALIPTRA_ROOT}/src/kmac/rtl -${CALIPTRA_ROOT}/src/prim/rtl/prim_util_pkg.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_alert_pkg.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_subreg_pkg.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_mubi_pkg.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_cipher_pkg.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_pkg.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_util_pkg.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_alert_pkg.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_subreg_pkg.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_mubi_pkg.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_cipher_pkg.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_pkg.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_sparse_fsm_pkg.sv ${CALIPTRA_ROOT}/src/lc_ctrl/rtl/lc_ctrl_reg_pkg.sv ${CALIPTRA_ROOT}/src/lc_ctrl/rtl/lc_ctrl_state_pkg.sv ${CALIPTRA_ROOT}/src/lc_ctrl/rtl/lc_ctrl_pkg.sv diff --git a/src/kmac/rtl/keccak_2share.sv b/src/kmac/rtl/keccak_2share.sv index e71d6193c..e93d83f08 100644 --- a/src/kmac/rtl/keccak_2share.sv +++ b/src/kmac/rtl/keccak_2share.sv @@ -5,10 +5,10 @@ // This module is the single round keccak permutation module // It supports Keccak with up to 1600b of state -`include "prim_assert.sv" +`include "caliptra_prim_assert.sv" module keccak_2share - import prim_mubi_pkg::*; + import caliptra_prim_mubi_pkg::*; #( parameter int Width = 1600, // b= {25, 50, 100, 200, 400, 800, 1600} @@ -315,7 +315,7 @@ module keccak_2share assign in_prd[x] = in_rand_ext ? rand_i[x * WSheetHalf +: WSheetHalf] : out_prd[rot_int(x, 5)]; - prim_dom_and_2share #( + caliptra_prim_dom_and_2share #( .DW (WSheetHalf), // a half sheet .Pipeline(1) // Process the full sheet in 3 clock cycles. This reduces // SCA leakage. diff --git a/src/kmac/rtl/keccak_round.sv b/src/kmac/rtl/keccak_round.sv index 0e91f2f2e..3fd223d9a 100644 --- a/src/kmac/rtl/keccak_round.sv +++ b/src/kmac/rtl/keccak_round.sv @@ -5,10 +5,10 @@ // Keccak full round logic based on given input `Width` // e.g. Width 800 requires 22 rounds -`include "prim_assert.sv" +`include "caliptra_prim_assert.sv" module keccak_round - import prim_mubi_pkg::*; + import caliptra_prim_mubi_pkg::*; #( parameter int Width = 1600, // b= {25, 50, 100, 200, 400, 800, 1600} @@ -55,13 +55,13 @@ module keccak_round // Errors: // sparse_fsm_error: Checking if FSM state falls into unknown value output logic sparse_fsm_error_o, - // round_count_error: prim_count checks round value consistency + // round_count_error: caliptra_prim_count checks round value consistency output logic round_count_error_o, // rst_storage_error: check if reset signal asserted out of the // permitted window output logic rst_storage_error_o, - input prim_mubi_pkg::mubi4_t clear_i // Clear internal state to '0 + input caliptra_prim_mubi_pkg::mubi4_t clear_i // Clear internal state to '0 ); ///////////////////// @@ -188,7 +188,7 @@ module keccak_round StTerminalError = 6'b110110 } keccak_st_e; keccak_st_e keccak_st, keccak_st_d; - `PRIM_FLOP_SPARSE_FSM(u_state_regs, keccak_st_d, keccak_st, keccak_st_e, StIdle) + `CALIPTRA_PRIM_FLOP_SPARSE_FSM(u_state_regs, keccak_st_d, keccak_st, keccak_st_e, StIdle) // Next state logic and output logic // SEC_CM: FSM.SPARSE @@ -220,7 +220,7 @@ module keccak_round xor_message = 1'b 1; update_storage = 1'b 1; - end else if (prim_mubi_pkg::mubi4_test_true_strict(clear_i)) begin + end else if (caliptra_prim_mubi_pkg::mubi4_test_true_strict(clear_i)) begin // Opt1. State machine allows resetting the storage only in Idle // Opt2. storage resets regardless of states but clear_i // Both are added in the design at this time. Will choose the @@ -368,9 +368,9 @@ module keccak_round // SEC_CM: LOGIC.INTEGRITY logic rst_n; - prim_sec_anchor_buf #( + caliptra_prim_sec_anchor_buf #( .Width(1) - ) u_prim_sec_anchor_buf ( + ) u_caliptra_prim_sec_anchor_buf ( .in_i(rst_ni), .out_o(rst_n) ); @@ -422,7 +422,7 @@ module keccak_round if (rst_storage) begin // FSM should be in StIdle and clear_i should be high if ((keccak_st != StIdle) || - prim_mubi_pkg::mubi4_test_false_loose(clear_i)) begin + caliptra_prim_mubi_pkg::mubi4_test_false_loose(clear_i)) begin rst_storage_error = 1'b 1; end end @@ -460,7 +460,7 @@ module keccak_round // Round number // This primitive is used to place a hardened counter // SEC_CM: CTR.REDUN - prim_count #( + caliptra_prim_count #( .Width(RndW) ) u_round_count ( .clk_i, @@ -503,7 +503,7 @@ module keccak_round // clear_i is assumed to be asserted in Idle state `CALIPTRA_ASSUME(ClearAssertStIdle_A, - prim_mubi_pkg::mubi4_test_true_strict(clear_i) + caliptra_prim_mubi_pkg::mubi4_test_true_strict(clear_i) |-> keccak_st == StIdle, clk_i, !rst_ni) // EnMasking controls the valid states diff --git a/src/kmac/rtl/sha3.sv b/src/kmac/rtl/sha3.sv index 82f6afdd1..3abc5e824 100644 --- a/src/kmac/rtl/sha3.sv +++ b/src/kmac/rtl/sha3.sv @@ -6,7 +6,7 @@ // // It instantiates a keccak_round with 1600 bits of the state. -`include "prim_assert.sv" +`include "caliptra_prim_assert.sv" module sha3 import sha3_pkg::*; @@ -47,9 +47,9 @@ module sha3 // It is used to run additional keccak_f after sponge absorbing is completed. // See `keccak_run` signal input run_i, - input prim_mubi_pkg::mubi4_t done_i, // see sha3pad for details + input caliptra_prim_mubi_pkg::mubi4_t done_i, // see sha3pad for details - output prim_mubi_pkg::mubi4_t absorbed_o, + output caliptra_prim_mubi_pkg::mubi4_t absorbed_o, output logic squeezing_o, // Indicate of one block processed. KMAC main state tracks the progression @@ -106,7 +106,7 @@ module sha3 // absorbed is a pulse signal that indicates sponge absorbing is done. // After this, sha3 core allows software to manually run until squeezing // is completed, which is the `done_i` pulse signal. - prim_mubi_pkg::mubi4_t absorbed; + caliptra_prim_mubi_pkg::mubi4_t absorbed; // `squeezing` is a status indicator that SHA3 core is in sponge squeezing // stage. In this stage, the state output is valid, and software can manually @@ -124,7 +124,7 @@ module sha3 // Keccak control signal (filtered by State Machine) logic keccak_start, keccak_process; - prim_mubi_pkg::mubi4_t keccak_done; + caliptra_prim_mubi_pkg::mubi4_t keccak_done; // alert signals logic round_count_error, msg_count_error; @@ -163,7 +163,7 @@ module sha3 // `absorbed` signal. When this signal goes out, the state is still in // `StAbsorb`. Next state is `StSqueeze`. always_ff @(posedge clk_i or negedge rst_ni) begin - if (!rst_ni) absorbed_o <= prim_mubi_pkg::MuBi4False; + if (!rst_ni) absorbed_o <= caliptra_prim_mubi_pkg::MuBi4False; else absorbed_o <= absorbed; end @@ -174,7 +174,7 @@ module sha3 always_ff @(posedge clk_i or negedge rst_ni) begin if (!rst_ni) processing <= 1'b 0; else if (process_i) processing <= 1'b 1; - else if (prim_mubi_pkg::mubi4_test_true_strict(absorbed)) begin + else if (caliptra_prim_mubi_pkg::mubi4_test_true_strict(absorbed)) begin processing <= 1'b 0; end end @@ -192,7 +192,7 @@ module sha3 /////////////////// // State Register - `PRIM_FLOP_SPARSE_FSM(u_state_regs, st_d, st, sha3_st_sparse_e, StIdle_sparse) + `CALIPTRA_PRIM_FLOP_SPARSE_FSM(u_state_regs, st_d, st, sha3_st_sparse_e, StIdle_sparse) // Next State and Output Logic @@ -208,7 +208,7 @@ module sha3 keccak_start = 1'b 0; keccak_process = 1'b 0; sw_keccak_run = 1'b 0; - keccak_done = prim_mubi_pkg::MuBi4False; + keccak_done = caliptra_prim_mubi_pkg::MuBi4False; squeezing = 1'b 0; @@ -233,7 +233,7 @@ module sha3 st_d = StAbsorb_sparse; keccak_process = 1'b 1; - end else if (prim_mubi_pkg::mubi4_test_true_strict(absorbed)) begin + end else if (caliptra_prim_mubi_pkg::mubi4_test_true_strict(absorbed)) begin st_d = StSqueeze_sparse; end else begin st_d = StAbsorb_sparse; @@ -250,7 +250,7 @@ module sha3 st_d = StManualRun_sparse; sw_keccak_run = 1'b 1; - end else if (prim_mubi_pkg::mubi4_test_true_strict(done_i)) begin + end else if (caliptra_prim_mubi_pkg::mubi4_test_true_strict(done_i)) begin st_d = StFlush_sparse; keccak_done = done_i; @@ -319,7 +319,7 @@ module sha3 unique case (st) StIdle_sparse: begin if (process_i || run_i || - prim_mubi_pkg::mubi4_test_true_loose(done_i)) begin + caliptra_prim_mubi_pkg::mubi4_test_true_loose(done_i)) begin error_o = '{ valid: 1'b 1, code: ErrSha3SwControl, @@ -329,7 +329,7 @@ module sha3 end StAbsorb_sparse: begin - if (start_i || run_i || prim_mubi_pkg::mubi4_test_true_loose(done_i) + if (start_i || run_i || caliptra_prim_mubi_pkg::mubi4_test_true_loose(done_i) || (process_i && processing)) begin error_o = '{ valid: 1'b 1, @@ -351,7 +351,7 @@ module sha3 StManualRun_sparse: begin if (start_i || process_i || run_i || - prim_mubi_pkg::mubi4_test_true_loose(done_i)) begin + caliptra_prim_mubi_pkg::mubi4_test_true_loose(done_i)) begin error_o = '{ valid: 1'b 1, code: ErrSha3SwControl, @@ -362,7 +362,7 @@ module sha3 StFlush_sparse: begin if (start_i || process_i || run_i || - prim_mubi_pkg::mubi4_test_true_loose(done_i)) begin + caliptra_prim_mubi_pkg::mubi4_test_true_loose(done_i)) begin error_o = '{ valid: 1'b 1, code: ErrSha3SwControl, diff --git a/src/kmac/rtl/sha3pad.sv b/src/kmac/rtl/sha3pad.sv index 9eb0e69f4..a8c488858 100644 --- a/src/kmac/rtl/sha3pad.sv +++ b/src/kmac/rtl/sha3pad.sv @@ -4,7 +4,7 @@ // // SHA3 padding logic -`include "prim_assert.sv" +`include "caliptra_prim_assert.sv" module sha3pad import sha3_pkg::*; @@ -55,12 +55,12 @@ module sha3pad // done_i is a pulse signal to make the pad logic to clear internal variables // and to move back to the Idle state for next hashing process. // done_i may not needed if sw controls the keccak_round directly. - input prim_mubi_pkg::mubi4_t done_i, + input caliptra_prim_mubi_pkg::mubi4_t done_i, // Indication of the Keccak Sponge Absorbing is complete, it is time for SW to // control the Keccak-round if it needs more digest, or complete by asserting // `done_i` - output prim_mubi_pkg::mubi4_t absorbed_o, + output caliptra_prim_mubi_pkg::mubi4_t absorbed_o, // Life cycle input lc_ctrl_pkg::lc_tx_t lc_escalate_en_i, @@ -105,7 +105,7 @@ module sha3pad // (SHA3, SHAKE), sending prefix is not needed. FSM moves from Idle to // Message directly in that case. // - // As prim_slicer is instantiated, zerofill after the actual prefix is done + // As caliptra_prim_slicer is instantiated, zerofill after the actual prefix is done // by the module. StPrefix = 7'b0111100, StPrefixWait =7'b1001100, @@ -188,7 +188,7 @@ module sha3pad // This primitive is used to place a hardened counter // SEC_CM: CTR.REDUN - prim_count #( + caliptra_prim_count #( .Width(KeccakCountW) ) u_sentmsg_count ( .clk_i, @@ -267,7 +267,7 @@ module sha3pad process_latched <= 1'b 0; end else if (process_i) begin process_latched <= 1'b 1; - end else if (prim_mubi_pkg::mubi4_test_true_strict(done_i)) begin + end else if (caliptra_prim_mubi_pkg::mubi4_test_true_strict(done_i)) begin process_latched <= 1'b0; end end @@ -275,7 +275,7 @@ module sha3pad // State Register =========================================================== pad_st_e st, st_d; - `PRIM_FLOP_SPARSE_FSM(u_state_regs, st_d, st, pad_st_e, StPadIdle) + `CALIPTRA_PRIM_FLOP_SPARSE_FSM(u_state_regs, st_d, st, pad_st_e, StPadIdle) // `end_of_block` indicates current beat is end of the block // It shall set when the address reaches to the end of the block. End address @@ -287,9 +287,9 @@ module sha3pad // Next logic and output logic ============================================== // SEC_CM: ABSORBED.CTRL.MUBI - prim_mubi_pkg::mubi4_t absorbed_d; + caliptra_prim_mubi_pkg::mubi4_t absorbed_d; always_ff @(posedge clk_i or negedge rst_ni) begin - if (!rst_ni) absorbed_o <= prim_mubi_pkg::MuBi4False; + if (!rst_ni) absorbed_o <= caliptra_prim_mubi_pkg::MuBi4False; else absorbed_o <= absorbed_d; end @@ -308,7 +308,7 @@ module sha3pad en_msgbuf = 1'b 0; clr_msgbuf = 1'b 0; - absorbed_d = prim_mubi_pkg::MuBi4False; + absorbed_d = caliptra_prim_mubi_pkg::MuBi4False; sparse_fsm_error_o = 1'b 0; @@ -468,7 +468,7 @@ module sha3pad if (keccak_complete_i) begin st_d = StPadIdle; - absorbed_d = prim_mubi_pkg::MuBi4True; + absorbed_d = caliptra_prim_mubi_pkg::MuBi4True; end else begin st_d = StPadFlush; end @@ -521,7 +521,7 @@ module sha3pad logic [MsgWidth-1:0] prefix_sliced; logic [MsgWidth-1:0] prefix_data [Share]; - prim_slicer #( + caliptra_prim_slicer #( .InW (PrefixSize*8), .IndexW(KeccakMsgAddrW), .OutW(MsgWidth) @@ -622,19 +622,19 @@ module sha3pad endcase end - // prim_packer : packing to 64bit to update keccak storage - // two prim_packer in this module are used to pack the data received from + // caliptra_prim_packer : packing to 64bit to update keccak storage + // two caliptra_prim_packer in this module are used to pack the data received from // upper layer (KMAC core) and also the 5bit padding bits. // It is assumed that the message from upper layer could be partial at the // end of the message. Then the 2 or 4bit padding is required. It can be - // handled by some custom logic or could be done by prim_packer. - // If packer is used, the MSG_FIFO doesn't have to have another prim_packer + // handled by some custom logic or could be done by caliptra_prim_packer. + // If packer is used, the MSG_FIFO doesn't have to have another caliptra_prim_packer // in front of the FIFO. This logic can handle the partial writes from the // software. // - // If a custom logic is implemented here, prim_packer is necessary in front + // If a custom logic is implemented here, caliptra_prim_packer is necessary in front // of the FIFO, as this logic only appends at the end of the message when - // `process_i` is asserted. Also, in this case, even prim_packer is not + // `process_i` is asserted. Also, in this case, even caliptra_prim_packer is not // needed, still 64bit registers to latch the partial write is required. // If not, the logic has to delay the acceptance of the incoming write // accesses. It may trigger the back-pressuring in some case which may result @@ -747,13 +747,13 @@ module sha3pad `CALIPTRA_ASSUME(StartPulse_A, start_i |=> !start_i) `CALIPTRA_ASSUME(ProcessPulse_A, process_i |=> !process_i) `CALIPTRA_ASSUME(DonePulse_A, - prim_mubi_pkg::mubi4_test_true_strict(done_i) |=> - prim_mubi_pkg::mubi4_test_false_strict(done_i)) + caliptra_prim_mubi_pkg::mubi4_test_true_strict(done_i) |=> + caliptra_prim_mubi_pkg::mubi4_test_false_strict(done_i)) // CALIPTRA_ASSERT output pulse signals: absorbed_o, keccak_run_o `CALIPTRA_ASSERT(AbsorbedPulse_A, - prim_mubi_pkg::mubi4_test_true_strict(absorbed_o) |=> - prim_mubi_pkg::mubi4_test_false_strict(absorbed_o)) + caliptra_prim_mubi_pkg::mubi4_test_true_strict(absorbed_o) |=> + caliptra_prim_mubi_pkg::mubi4_test_false_strict(absorbed_o)) `CALIPTRA_ASSERT(KeccakRunPulse_A, keccak_run_o |=> !keccak_run_o) // start_i, done_i, process_i cannot set high at the same time @@ -761,7 +761,7 @@ module sha3pad $onehot0({ start_i, process_i, - prim_mubi_pkg::mubi4_test_true_loose(done_i) + caliptra_prim_mubi_pkg::mubi4_test_true_loose(done_i) })) // Sequence, start_i --> process_i --> absorbed_o --> done_i @@ -779,7 +779,7 @@ module sha3pad start_valid <= 1'b 1; end else if (start_i) begin start_valid <= 1'b 0; - end else if (prim_mubi_pkg::mubi4_test_true_strict(done_i)) begin + end else if (caliptra_prim_mubi_pkg::mubi4_test_true_strict(done_i)) begin start_valid <= 1'b 1; end end @@ -796,9 +796,9 @@ module sha3pad always_ff @(posedge clk_i or negedge rst_ni) begin if (!rst_ni) begin done_valid <= 1'b 0; - end else if (prim_mubi_pkg::mubi4_test_true_strict(absorbed_o)) begin + end else if (caliptra_prim_mubi_pkg::mubi4_test_true_strict(absorbed_o)) begin done_valid <= 1'b 1; - end else if (prim_mubi_pkg::mubi4_test_true_strict(done_i)) begin + end else if (caliptra_prim_mubi_pkg::mubi4_test_true_strict(done_i)) begin done_valid <= 1'b 0; end end @@ -812,7 +812,7 @@ module sha3pad `CALIPTRA_ASSUME(ProcessCondition_M, process_i |-> process_valid) `CALIPTRA_ASSUME(StartCondition_M, start_i |-> start_valid) `CALIPTRA_ASSUME(DoneCondition_M, - prim_mubi_pkg::mubi4_test_true_strict(done_i) |-> done_valid) + caliptra_prim_mubi_pkg::mubi4_test_true_strict(done_i) |-> done_valid) // Assume mode_i and strength_i are stable during the operation // This will be guarded at the kmac top level diff --git a/src/lc_ctrl/config/compile.yml b/src/lc_ctrl/config/compile.yml index 2be1b0d93..eff0a412e 100644 --- a/src/lc_ctrl/config/compile.yml +++ b/src/lc_ctrl/config/compile.yml @@ -2,7 +2,7 @@ provides: [lc_ctrl_pkg] schema_version: 2.4.0 requires: - - prim_pkg + - caliptra_prim_pkg targets: rtl: directories: [$COMPILE_ROOT/rtl] diff --git a/src/lc_ctrl/config/lc_ctrl_pkg.vf b/src/lc_ctrl/config/lc_ctrl_pkg.vf index b314749ea..e41a7f442 100644 --- a/src/lc_ctrl/config/lc_ctrl_pkg.vf +++ b/src/lc_ctrl/config/lc_ctrl_pkg.vf @@ -1,11 +1,12 @@ -+incdir+${CALIPTRA_ROOT}/src/prim/rtl ++incdir+${CALIPTRA_ROOT}/src/caliptra_prim/rtl +incdir+${CALIPTRA_ROOT}/src/lc_ctrl/rtl -${CALIPTRA_ROOT}/src/prim/rtl/prim_util_pkg.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_alert_pkg.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_subreg_pkg.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_mubi_pkg.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_cipher_pkg.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_pkg.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_util_pkg.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_alert_pkg.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_subreg_pkg.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_mubi_pkg.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_cipher_pkg.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_pkg.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_sparse_fsm_pkg.sv ${CALIPTRA_ROOT}/src/lc_ctrl/rtl/lc_ctrl_reg_pkg.sv ${CALIPTRA_ROOT}/src/lc_ctrl/rtl/lc_ctrl_state_pkg.sv ${CALIPTRA_ROOT}/src/lc_ctrl/rtl/lc_ctrl_pkg.sv diff --git a/src/lc_ctrl/rtl/lc_ctrl_pkg.sv b/src/lc_ctrl/rtl/lc_ctrl_pkg.sv index e67e1bf43..8793c5dbe 100644 --- a/src/lc_ctrl/rtl/lc_ctrl_pkg.sv +++ b/src/lc_ctrl/rtl/lc_ctrl_pkg.sv @@ -3,11 +3,11 @@ // SPDX-License-Identifier: Apache-2.0 // -`include "prim_assert.sv" +`include "caliptra_prim_assert.sv" package lc_ctrl_pkg; - import prim_util_pkg::vbits; + import caliptra_prim_util_pkg::vbits; import lc_ctrl_state_pkg::*; /////////////////////////////////////// @@ -65,31 +65,31 @@ package lc_ctrl_pkg; // This is a prerequisite for the multibit functions below to work. `CALIPTRA_ASSERT_STATIC_IN_PACKAGE(CheckLcTxValsComplementary_A, On == ~Off) // Check for bit-width matching between lc_tx_t and mubi4_t - `CALIPTRA_ASSERT_STATIC_IN_PACKAGE(LcMuBiWidthCheck_A, $bits(TxWidth) == $bits(prim_mubi_pkg::MuBi4Width)) + `CALIPTRA_ASSERT_STATIC_IN_PACKAGE(LcMuBiWidthCheck_A, $bits(TxWidth) == $bits(caliptra_prim_mubi_pkg::MuBi4Width)) // Convert a life cycle signal to mubi4 // If in the future other versions are desired, this should really be - // moved to prim_mubi_pkg + // moved to caliptra_prim_mubi_pkg // // The On ^ MuBi4True determines the bit differences between - // an lc_ctrl_pkg::On and prim_mubi_pkg::MuBi4True. + // an lc_ctrl_pkg::On and caliptra_prim_mubi_pkg::MuBi4True. // Once the required inversions are determined, it is then applied // to the incoming value. If the incoming value is true, it will // appropriately flip to the correct MuBiValue. // Since the false value is always complement of the true value, // this mechanism will also work for the other polarity. - function automatic prim_mubi_pkg::mubi4_t lc_to_mubi4(lc_tx_t val); - return prim_mubi_pkg::mubi4_t'(val ^ (On ^ prim_mubi_pkg::MuBi4True)); + function automatic caliptra_prim_mubi_pkg::mubi4_t lc_to_mubi4(lc_tx_t val); + return caliptra_prim_mubi_pkg::mubi4_t'(val ^ (On ^ caliptra_prim_mubi_pkg::MuBi4True)); endfunction : lc_to_mubi4 - function automatic lc_tx_t mubi4_to_lc(prim_mubi_pkg::mubi4_t val); - return lc_tx_t'(val ^ (prim_mubi_pkg::MuBi4True ^ On)); + function automatic lc_tx_t mubi4_to_lc(caliptra_prim_mubi_pkg::mubi4_t val); + return lc_tx_t'(val ^ (caliptra_prim_mubi_pkg::MuBi4True ^ On)); endfunction : mubi4_to_lc // same function as above, but for an input that is MuBi4True, return Off // for an input that is MuBi4False, return On - function automatic lc_tx_t mubi4_to_lc_inv(prim_mubi_pkg::mubi4_t val); - return lc_tx_t'(val ^ (prim_mubi_pkg::MuBi4True ^ Off)); + function automatic lc_tx_t mubi4_to_lc_inv(caliptra_prim_mubi_pkg::mubi4_t val); + return lc_tx_t'(val ^ (caliptra_prim_mubi_pkg::MuBi4True ^ Off)); endfunction : mubi4_to_lc_inv // Test whether the value is supplied is one of the valid enumerations @@ -145,7 +145,7 @@ package lc_ctrl_pkg; // Note: due to the nature of the lc_tx_or() function, it is possible that two // non-strictly "act" values may produce a strictly "act" value. If this is // of concern, e.g. if the output is consumed with a strict check on "act", - // consider using the prim_lc_or_hardened primitive instead. + // consider using the caliptra_prim_lc_or_hardened primitive instead. function automatic lc_tx_t lc_tx_or(lc_tx_t a, lc_tx_t b, lc_tx_t act); logic [TxWidth-1:0] a_in, b_in, act_in, out; a_in = a; @@ -176,7 +176,7 @@ package lc_ctrl_pkg; // that the lc_tx_or function above does, since only one output value in the // truth table is strictly "act". It can hence be used in most scenarios without issues. // If however the lc_tx_and() function should be strictly rectifying (i.e., only - // output "act" or ~"act"), the prim_lc_and_hardened can be used. + // output "act" or ~"act"), the caliptra_prim_lc_and_hardened can be used. function automatic lc_tx_t lc_tx_and(lc_tx_t a, lc_tx_t b, lc_tx_t act); logic [TxWidth-1:0] a_in, b_in, act_in, out; a_in = a; diff --git a/src/lc_ctrl/rtl/lc_ctrl_state_pkg.sv b/src/lc_ctrl/rtl/lc_ctrl_state_pkg.sv index 16897b61f..100e62077 100644 --- a/src/lc_ctrl/rtl/lc_ctrl_state_pkg.sv +++ b/src/lc_ctrl/rtl/lc_ctrl_state_pkg.sv @@ -10,7 +10,7 @@ // package lc_ctrl_state_pkg; - import prim_util_pkg::vbits; + import caliptra_prim_util_pkg::vbits; /////////////////////////////// // General size declarations // diff --git a/src/libs/config/compile.yml b/src/libs/config/compile.yml index 3569036ed..c15f5de4b 100644 --- a/src/libs/config/compile.yml +++ b/src/libs/config/compile.yml @@ -16,6 +16,7 @@ targets: - $COMPILE_ROOT/rtl/ahb_slv_sif.sv - $COMPILE_ROOT/rtl/caliptra_icg.sv - $COMPILE_ROOT/rtl/clk_gate.sv + - $COMPILE_ROOT/rtl/caliptra_2ff_sync.sv rtl: directories: [$COMPILE_ROOT/rtl] files: @@ -28,6 +29,7 @@ targets: - $COMPILE_ROOT/rtl/ahb_slv_sif.sv - $COMPILE_ROOT/rtl/caliptra_icg.sv - $COMPILE_ROOT/rtl/clk_gate.sv + - $COMPILE_ROOT/rtl/caliptra_2ff_sync.sv - $COMPILE_ROOT/rtl/ahb_to_reg_adapter.sv --- provides: [uvm_lib] diff --git a/src/libs/config/libs.vf b/src/libs/config/libs.vf index 89d3b44e4..7c0d4c77b 100644 --- a/src/libs/config/libs.vf +++ b/src/libs/config/libs.vf @@ -11,4 +11,5 @@ ${CALIPTRA_ROOT}/src/libs/rtl/apb_slv_sif.sv ${CALIPTRA_ROOT}/src/libs/rtl/ahb_slv_sif.sv ${CALIPTRA_ROOT}/src/libs/rtl/caliptra_icg.sv ${CALIPTRA_ROOT}/src/libs/rtl/clk_gate.sv +${CALIPTRA_ROOT}/src/libs/rtl/caliptra_2ff_sync.sv ${CALIPTRA_ROOT}/src/libs/rtl/ahb_to_reg_adapter.sv \ No newline at end of file diff --git a/src/libs/rtl/ahb_slv_sif.sv b/src/libs/rtl/ahb_slv_sif.sv index 12fbfceb1..972b58381 100644 --- a/src/libs/rtl/ahb_slv_sif.sv +++ b/src/libs/rtl/ahb_slv_sif.sv @@ -147,6 +147,20 @@ always_comb begin : response_block end end -//bypass lint err //FIXME when lint rule is removed +//Coverage +`ifndef VERILATOR +`ifdef FCOV + +covergroup ahb_slv_sif_cov_grp @(posedge hclk); + option.per_instance = 1; + + ahb_read_cp: coverpoint (dv & ~write) {option.comment = "AHB read transaction";} + ahb_write_cp: coverpoint (dv & write) {option.comment = "AHB write transaction";} +endgroup + +ahb_slv_sif_cov_grp ahb_slv_sif_cov_grp1 = new(); + +`endif +`endif endmodule diff --git a/src/libs/rtl/apb_slv_sif.sv b/src/libs/rtl/apb_slv_sif.sv index e0c0d3f4f..eb791e381 100644 --- a/src/libs/rtl/apb_slv_sif.sv +++ b/src/libs/rtl/apb_slv_sif.sv @@ -77,12 +77,11 @@ end always_comb access_phase = PSEL & PENABLE; //drive ready if no hold from component -always_comb PREADY = (dv & access_phase) ? ~req_hold : '1; +always_comb PREADY = dv ? ~req_hold : '1; //drive read data from component -always_comb PRDATA = (dv & access_phase) ? rdata : '0; +always_comb PRDATA = rdata; //drive error from component for valid access, drive error for invalid access phase -always_comb PSLVERR = (dv & access_phase) ? slverr : - access_phase ? '1 : '0; +always_comb PSLVERR = slverr; diff --git a/src/libs/rtl/caliptra_2ff_sync.sv b/src/libs/rtl/caliptra_2ff_sync.sv new file mode 100644 index 000000000..9124daa92 --- /dev/null +++ b/src/libs/rtl/caliptra_2ff_sync.sv @@ -0,0 +1,39 @@ +// SPDX-License-Identifier: Apache-2.0 +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +module caliptra_2ff_sync #( parameter WIDTH=1, + parameter RST_VAL=0) + ( + input logic clk, + input logic rst_b, + input logic [WIDTH-1:0] din, + output logic [WIDTH-1:0] dout + +); + +logic din_ff; + +always_ff@(posedge clk or negedge rst_b) begin + if(!rst_b) begin + dout <= RST_VAL; + din_ff <= RST_VAL; + end + else begin + din_ff <= din; + dout <= din_ff; + end +end + + +endmodule \ No newline at end of file diff --git a/src/libs/rtl/clk_gate.sv b/src/libs/rtl/clk_gate.sv index 483b8ee3c..73e9ba1bd 100644 --- a/src/libs/rtl/clk_gate.sv +++ b/src/libs/rtl/clk_gate.sv @@ -17,18 +17,25 @@ module clk_gate ( input logic cptra_rst_b, input logic psel, input logic clk_gate_en, + input logic rdc_clk_dis, + input logic rdc_clk_dis_uc, input logic cpu_halt_status, input logic [63:0] generic_input_wires, + input logic cptra_error_fatal, + input logic cptra_in_debug_scan_mode, output logic clk_cg, - output logic soc_ifc_clk_cg + output logic soc_ifc_clk_cg, + output logic rdc_clk_cg, + output logic uc_clk_cg, + input logic cptra_dmi_reg_en_preQ //JTAG access ); logic disable_clk; logic disable_soc_ifc_clk; -logic disable_clk_lat; -logic disable_soc_ifc_clk_lat; +logic disable_uc_clk; logic [63:0] generic_input_wires_f; logic change_in_generic_wires; +logic sleep_condition; /********************************************************************** @@ -64,17 +71,23 @@ end //Generate clk disable signal always_comb begin change_in_generic_wires = ((generic_input_wires ^ generic_input_wires_f) != 'h0); - disable_clk = clk_gate_en && (cpu_halt_status && !change_in_generic_wires); - disable_soc_ifc_clk = clk_gate_en && (cpu_halt_status && !psel && !change_in_generic_wires); + sleep_condition = (cpu_halt_status && !change_in_generic_wires && !cptra_error_fatal && !cptra_in_debug_scan_mode && !cptra_dmi_reg_en_preQ); + disable_clk = (clk_gate_en && sleep_condition) | rdc_clk_dis; + disable_soc_ifc_clk = (clk_gate_en && (sleep_condition && !psel)) | rdc_clk_dis; + disable_uc_clk = (rdc_clk_dis | rdc_clk_dis_uc); end `ifdef TECH_SPECIFIC_ICG `USER_ICG user_icg (.clk(clk), .en(!disable_clk), .clk_cg(clk_cg)); `USER_ICG user_soc_ifc_icg (.clk(clk), .en(!disable_soc_ifc_clk), .clk_cg(soc_ifc_clk_cg)); + `USER_ICG user_rdc_icg (.clk(clk), .en(!rdc_clk_dis), .clk_cg(rdc_clk_cg)); + `USER_ICG user_rdc_uc_icg (.clk(clk), .en(!disable_uc_clk), .clk_cg(uc_clk_cg)); `else `CALIPTRA_ICG caliptra_icg (.clk(clk), .en(!disable_clk), .clk_cg(clk_cg)); `CALIPTRA_ICG caliptra_soc_ifc_icg (.clk(clk), .en(!disable_soc_ifc_clk), .clk_cg(soc_ifc_clk_cg)); + `CALIPTRA_ICG caliptra_rdc_icg (.clk(clk), .en(!rdc_clk_dis), .clk_cg(rdc_clk_cg)); + `CALIPTRA_ICG caliptra_rdc_uc_icg (.clk(clk), .en(!disable_uc_clk), .clk_cg(uc_clk_cg)); `endif endmodule diff --git a/src/libs/uvmf/qvip_ahb_lite_slave_dir/config_policies/ahb_lite_slave_0_config_policy.svh b/src/libs/uvmf/qvip_ahb_lite_slave_dir/config_policies/ahb_lite_slave_0_config_policy.svh index fb370d55f..1e4a139eb 100644 --- a/src/libs/uvmf/qvip_ahb_lite_slave_dir/config_policies/ahb_lite_slave_0_config_policy.svh +++ b/src/libs/uvmf/qvip_ahb_lite_slave_dir/config_policies/ahb_lite_slave_0_config_policy.svh @@ -121,7 +121,7 @@ class ahb_lite_slave_0_config_policy; // // If true, drives previous address when bus is IDLE // cfg.m_bfm.config_address_on_idle = 1'b0; // // Maximum number of successive wait states - // cfg.m_bfm.config_max_wait_states_count = 16; + cfg.m_bfm.config_max_wait_states_count = 20; // // Data endianness // cfg.m_bfm.config_endianness = AHB_LITTLE_ENDIAN; // // Sets the domain diff --git a/src/pcrvault/config/compile.yml b/src/pcrvault/config/compile.yml index 352818c78..8e17ba963 100644 --- a/src/pcrvault/config/compile.yml +++ b/src/pcrvault/config/compile.yml @@ -1,6 +1,7 @@ provides: [pv_defines_pkg] schema_version: 2.4.0 -requires: [] +requires: + - libs targets: rtl: directories: [$COMPILE_ROOT/rtl] @@ -23,6 +24,17 @@ targets: files: - $COMPILE_ROOT/rtl/pv_reg_uvm.sv --- +provides: [pcrvault_cov] +schema_version: 2.4.0 +targets: + tb: + directories: + - $COMPILE_ROOT/coverage + files: + - $COMPILE_ROOT/coverage/pcrvault_cov_if.sv + - $COMPILE_ROOT/coverage/pcrvault_cov_props.sv + - $COMPILE_ROOT/coverage/pcrvault_cov_bind.sv +--- provides: [pcrvault] schema_version: 2.4.0 requires: diff --git a/src/pcrvault/config/pcrvault.vf b/src/pcrvault/config/pcrvault.vf index a7a532662..5e59b1772 100644 --- a/src/pcrvault/config/pcrvault.vf +++ b/src/pcrvault/config/pcrvault.vf @@ -12,6 +12,7 @@ ${CALIPTRA_ROOT}/src/libs/rtl/apb_slv_sif.sv ${CALIPTRA_ROOT}/src/libs/rtl/ahb_slv_sif.sv ${CALIPTRA_ROOT}/src/libs/rtl/caliptra_icg.sv ${CALIPTRA_ROOT}/src/libs/rtl/clk_gate.sv +${CALIPTRA_ROOT}/src/libs/rtl/caliptra_2ff_sync.sv ${CALIPTRA_ROOT}/src/pcrvault/rtl/pv_defines_pkg.sv ${CALIPTRA_ROOT}/src/pcrvault/rtl/pv_macros.svh ${CALIPTRA_ROOT}/src/pcrvault/rtl/pv_gen_hash.sv diff --git a/src/pcrvault/config/pcrvault_cov.vf b/src/pcrvault/config/pcrvault_cov.vf new file mode 100644 index 000000000..e8172adeb --- /dev/null +++ b/src/pcrvault/config/pcrvault_cov.vf @@ -0,0 +1,4 @@ ++incdir+${CALIPTRA_ROOT}/src/pcrvault/coverage +${CALIPTRA_ROOT}/src/pcrvault/coverage/pcrvault_cov_if.sv +${CALIPTRA_ROOT}/src/pcrvault/coverage/pcrvault_cov_props.sv +${CALIPTRA_ROOT}/src/pcrvault/coverage/pcrvault_cov_bind.sv \ No newline at end of file diff --git a/src/pcrvault/config/pv_defines_pkg.vf b/src/pcrvault/config/pv_defines_pkg.vf index dd59d584e..ab7aa0fd0 100644 --- a/src/pcrvault/config/pv_defines_pkg.vf +++ b/src/pcrvault/config/pv_defines_pkg.vf @@ -1,5 +1,20 @@ ++incdir+${CALIPTRA_ROOT}/src/integration/rtl ++incdir+${CALIPTRA_ROOT}/src/libs/rtl +incdir+${CALIPTRA_ROOT}/src/pcrvault/rtl +${CALIPTRA_ROOT}/src/integration/rtl/config_defines.svh +${CALIPTRA_ROOT}/src/integration/rtl/caliptra_reg_defines.svh +${CALIPTRA_ROOT}/src/libs/rtl/caliptra_sva.svh +${CALIPTRA_ROOT}/src/libs/rtl/caliptra_macros.svh +${CALIPTRA_ROOT}/src/libs/rtl/caliptra_sram.sv +${CALIPTRA_ROOT}/src/libs/rtl/ahb_defines_pkg.sv +${CALIPTRA_ROOT}/src/libs/rtl/caliptra_ahb_srom.sv +${CALIPTRA_ROOT}/src/libs/rtl/apb_slv_sif.sv +${CALIPTRA_ROOT}/src/libs/rtl/ahb_slv_sif.sv +${CALIPTRA_ROOT}/src/libs/rtl/caliptra_icg.sv +${CALIPTRA_ROOT}/src/libs/rtl/clk_gate.sv +${CALIPTRA_ROOT}/src/libs/rtl/caliptra_2ff_sync.sv ${CALIPTRA_ROOT}/src/pcrvault/rtl/pv_defines_pkg.sv ${CALIPTRA_ROOT}/src/pcrvault/rtl/pv_macros.svh ${CALIPTRA_ROOT}/src/pcrvault/rtl/pv_gen_hash.sv +${CALIPTRA_ROOT}/src/libs/rtl/ahb_to_reg_adapter.sv ${CALIPTRA_ROOT}/src/pcrvault/rtl/pv_gen_hash.sv \ No newline at end of file diff --git a/src/pcrvault/coverage/pcrvault_cov_bind.sv b/src/pcrvault/coverage/pcrvault_cov_bind.sv new file mode 100644 index 000000000..09251cf44 --- /dev/null +++ b/src/pcrvault/coverage/pcrvault_cov_bind.sv @@ -0,0 +1,21 @@ +// SPDX-License-Identifier: Apache-2.0 +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + + +module pcrvault_cov_bind; + //`ifdef FCOV + bind dut pcrvault_cov_if i_pcrvault_cov_if(.*); + bind dut pcrvault_cov_props i_pcrvault_cov_props(.*); + //`endif +endmodule diff --git a/src/pcrvault/coverage/pcrvault_cov_if.sv b/src/pcrvault/coverage/pcrvault_cov_if.sv new file mode 100644 index 000000000..c14ec311a --- /dev/null +++ b/src/pcrvault/coverage/pcrvault_cov_if.sv @@ -0,0 +1,95 @@ +// SPDX-License-Identifier: Apache-2.0 +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +`ifndef VERILATOR + +interface pcrvault_cov_if + import pv_defines_pkg::*; + ( + input logic clk, + input logic rst_b, + input logic cptra_pwrgood +); + + logic [PV_NUM_PCR-1:0] pcr_ctrl_lock; + logic [PV_NUM_PCR-1:0] pcr_ctrl_clear; + + logic [PV_NUM_WRITE-1:0] pv_write_en; + logic ahb_write, ahb_read; + + //Assign clear and locks of each PCR_CTRL reg to corresponding bit in the intermediate bus + generate + for(genvar i = 0; i < PV_NUM_PCR; i++) begin + assign pcr_ctrl_lock[i] = dut.pv_reg_hwif_out.PCR_CTRL[i].lock; + end + endgenerate + + generate + for(genvar client = 0; client < PV_NUM_WRITE; client++) begin + assign pv_write_en[client] = dut.pv_write[client].write_en; + end + endgenerate + + //AHB signals + assign ahb_write = dut.pv_ahb_slv1.dv & dut.pv_ahb_slv1.write; + assign ahb_read = dut.pv_ahb_slv1.dv & ~dut.pv_ahb_slv1.write; + + covergroup pcrvault_top_cov_grp @(posedge clk); + option.per_instance = 1; + + //Note: Bit transitions and values for lock and clear are covered + //in UVM reg coverage. This coverpoint bins the 32-bit lock/clear bus so that + //they can be used to cross with other signals + lock: coverpoint pcr_ctrl_lock { + bins bin0 = {[0:'hFFFF]}; + bins bin1 = {['h1_0000:'hF_FFFF]}; + bins bin2 = {['h10_0000:'hFF_FFFF]}; + bins bin3 = {['h100_0000:'hFFF_FFFF]}; + bins bin4 = {['h1000_0000: 'hFFFF_FFFF]}; + } + clear: coverpoint pcr_ctrl_clear { + bins bin0 = {[0:'hFFFF]}; + bins bin1 = {['h1_0000:'hF_FFFF]}; + bins bin2 = {['h10_0000:'hFF_FFFF]}; + bins bin3 = {['h100_0000:'hFFF_FFFF]}; + bins bin4 = {['h1000_0000: 'hFFFF_FFFF]}; + } + + //Cover warm reset assertion while regs are locked/cleared + lockXwarm_rst: cross lock, rst_b; + clearXwarm_rst: cross clear, rst_b; + + //Cover cold reset assertion while regs are locked/cleared + lockXcold_rst: cross lock, cptra_pwrgood; + clearXcold_rst: cross clear, cptra_pwrgood; + + // lockXcore_rst: cross lock, core_only_rst_b; + // clearXcore_rst: cross clear, core_only_rst_b; + + //Cover crypto writes to locked/cleared regs + lockXpv_write: cross lock, pv_write_en; + clearXpv_write: cross clear, pv_write_en; + + //Cover ahb write and read when crypto writes are happening + ahbXpv_write: cross ahb_write, ahb_read, pv_write_en; + + + endgroup + + + pcrvault_top_cov_grp pcrvault_top_cov_grp1 = new(); + +endinterface + +`endif \ No newline at end of file diff --git a/src/pcrvault/coverage/pcrvault_cov_props.sv b/src/pcrvault/coverage/pcrvault_cov_props.sv new file mode 100644 index 000000000..ba63232e7 --- /dev/null +++ b/src/pcrvault/coverage/pcrvault_cov_props.sv @@ -0,0 +1,54 @@ +// SPDX-License-Identifier: Apache-2.0 +// Copyright 2019 Western Digital Corporation or its affiliates. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +module pcrvault_cov_props + import pv_defines_pkg::*; + (); + + `ifndef VERILATOR + + generate + for(genvar i = 0; i < PV_NUM_PCR; i++) begin + + //clear followed by warm reset in the next clk + //Expectation: PCRs cleared before warm reset + property cover_prop_clear_warm_rst; + @(posedge dut.clk) + (dut.pv_reg_hwif_out.PCR_CTRL[i].clear |-> ##[1:$] !dut.rst_b); + endproperty + covprop_clear_warmrst: cover property(cover_prop_clear_warm_rst); + + //locks, followed by clear, followed by warm reset in the next clk + //Expectation: Unlocked PCRs cleared before warm reset, locks cleared on warm reset + property cover_prop_lock_clear_warm_rst; + @(posedge dut.clk) + (dut.pv_reg_hwif_out.PCR_CTRL[i].lock |-> ##[0:$] dut.pv_reg_hwif_out.PCR_CTRL[i].clear |-> ##[1:$] !dut.rst_b); + endproperty + covprop_lock_clear_warmrst: cover property(cover_prop_lock_clear_warm_rst); + + //locks, followed by clear, followed by cold reset in the next clk + //Expectation: Unlocked PCRs cleared before cold reset, everything cleared on cold reset + property cover_prop_lock_clear_cold_rst; + @(posedge dut.clk) + (dut.pv_reg_hwif_out.PCR_CTRL[i].lock |-> ##[0:$] dut.pv_reg_hwif_out.PCR_CTRL[i].clear |-> ##[1:$] !dut.cptra_pwrgood); + endproperty + covprop_lock_clear_coldrst: cover property(cover_prop_lock_clear_cold_rst); + end + endgenerate + + `endif + +endmodule \ No newline at end of file diff --git a/src/pcrvault/rtl/pv.sv b/src/pcrvault/rtl/pv.sv index 264320535..1a0a1fff8 100644 --- a/src/pcrvault/rtl/pv.sv +++ b/src/pcrvault/rtl/pv.sv @@ -27,7 +27,9 @@ module pv ( input logic clk, input logic rst_b, + input logic core_only_rst_b, input logic cptra_pwrgood, + input logic fw_update_rst_window, //uC AHB Lite Interface //from SLAVES PORT @@ -103,9 +105,10 @@ always_comb uc_req_hold = '0; always_comb begin : keyvault_ctrl for (int entry = 0; entry < PV_NUM_PCR; entry++) begin - //once lock is set, only hard reset can unset it - pv_reg_hwif_in.PCR_CTRL[entry].lock.swwel = pv_reg_hwif_out.PCR_CTRL[entry].lock.value; - pv_reg_hwif_in.PCR_CTRL[entry].clear.swwel = pv_reg_hwif_out.PCR_CTRL[entry].lock.value; + //once lock is set, any reset can unset it + //During a fw update reset we'll be de-asserting locks - avoid RDC violation by synchronously de-asserting + pv_reg_hwif_in.PCR_CTRL[entry].lock.swwel = pv_reg_hwif_out.PCR_CTRL[entry].lock.value & ~fw_update_rst_window; + pv_reg_hwif_in.PCR_CTRL[entry].clear.swwel = pv_reg_hwif_out.PCR_CTRL[entry].lock.value & ~fw_update_rst_window; end //pcrvault storage @@ -167,6 +170,7 @@ end always_comb pv_reg_hwif_in.hard_reset_b = cptra_pwrgood; always_comb pv_reg_hwif_in.reset_b = rst_b; +always_comb pv_reg_hwif_in.core_only_rst_b = core_only_rst_b; //Note that this signal will also reset when rst_b is asserted pv_reg pv_reg1 ( .clk(clk), diff --git a/src/pcrvault/rtl/pv_defines_pkg.sv b/src/pcrvault/rtl/pv_defines_pkg.sv index 93c9f23a5..b69c43b18 100644 --- a/src/pcrvault/rtl/pv_defines_pkg.sv +++ b/src/pcrvault/rtl/pv_defines_pkg.sv @@ -25,7 +25,7 @@ parameter PV_ENTRY_ADDR_W = $clog2(PV_NUM_PCR); parameter PV_ENTRY_SIZE_WIDTH = $clog2(PV_NUM_DWORDS); parameter PV_NUM_READ = 1; parameter PV_NUM_WRITE = 1; -parameter PV_SIZE_OF_NONCE = 32; +parameter PV_SIZE_OF_NONCE = 256; typedef struct packed { diff --git a/src/pcrvault/rtl/pv_gen_hash.sv b/src/pcrvault/rtl/pv_gen_hash.sv index e007f3824..5ce7fb8b2 100644 --- a/src/pcrvault/rtl/pv_gen_hash.sv +++ b/src/pcrvault/rtl/pv_gen_hash.sv @@ -23,6 +23,8 @@ module pv_gen_hash ,parameter DATA_W = 32 ,localparam BLOCK_NO = BLOCK_W/DATA_W ,localparam BLOCK_OFFSET_W = $clog2(BLOCK_NO) + ,localparam NONCE_LEN_DWORD = PV_SIZE_OF_NONCE/DATA_W + ,localparam NONCE_OFFSET_W = $clog2(NONCE_LEN_DWORD) ) ( input logic clk, @@ -31,7 +33,7 @@ module pv_gen_hash input logic start, input logic core_ready, input logic core_digest_valid, - input [PV_SIZE_OF_NONCE-1:0] nonce, + input [NONCE_LEN_DWORD-1:0][DATA_W-1:0] nonce, output logic gen_hash_ip, output logic gen_hash_init_reg, @@ -88,6 +90,8 @@ logic [PV_ENTRY_SIZE_WIDTH-1:0] read_offset, read_offset_nxt; logic inc_rd_ptr; logic rst_rd_ptr; +logic [NONCE_OFFSET_W-1:0] nonce_offset_i, nonce_offset_nxt; + assign gen_hash_ip = (gen_hash_fsm_ps != GEN_HASH_IDLE); assign gen_hash_init_reg = arc_GEN_HASH_BLOCK_0_GEN_HASH_BLOCK_N; @@ -116,6 +120,10 @@ assign block_offset = block_offset_i[BLOCK_OFFSET_W-1:0]; always_comb inc_rd_ptr = gen_hash_fsm_ps inside {GEN_HASH_BLOCK_0, GEN_HASH_BLOCK_N} & ~block_full; always_comb rst_rd_ptr = arc_GEN_HASH_BLOCK_0_GEN_HASH_NONCE | arc_GEN_HASH_BLOCK_N_GEN_HASH_NONCE; + + always_comb nonce_offset_nxt = (gen_hash_fsm_ps != GEN_HASH_NONCE) ? '0 : + (block_we ? nonce_offset_i + 'd1 : nonce_offset_i); + //State Machine //Start processing always_comb arc_GEN_HASH_IDLE_GEN_HASH_BLOCK_0 = (gen_hash_fsm_ps == GEN_HASH_IDLE) & start; @@ -126,7 +134,7 @@ assign block_offset = block_offset_i[BLOCK_OFFSET_W-1:0]; //Finished reading, start padding - wait for block to process if we need to start a new block always_comb arc_GEN_HASH_BLOCK_0_GEN_HASH_NONCE = (gen_hash_fsm_ps == GEN_HASH_BLOCK_0) & ~block_full & last_dword_wr; always_comb arc_GEN_HASH_BLOCK_N_GEN_HASH_NONCE = (gen_hash_fsm_ps == GEN_HASH_BLOCK_N) & ~block_full & last_dword_wr; - always_comb arc_GEN_HASH_NONCE_GEN_HASH_PAD_LD1 = (gen_hash_fsm_ps == GEN_HASH_NONCE) & ~block_full; + always_comb arc_GEN_HASH_NONCE_GEN_HASH_PAD_LD1 = (gen_hash_fsm_ps == GEN_HASH_NONCE) & ~block_full & (nonce_offset_i == NONCE_LEN_DWORD-1); always_comb arc_GEN_HASH_PAD_LD1_GEN_HASH_PAD_0S = (gen_hash_fsm_ps == GEN_HASH_PAD_LD1) & ~block_full; //Switch from padding zeros to padding the length always_comb arc_GEN_HASH_PAD_0S_GEN_HASH_PAD_LEN = (gen_hash_fsm_ps == GEN_HASH_PAD_0S) & ~block_full & (block_offset_i == PAD_LEN_DWORD-1); @@ -157,7 +165,7 @@ assign block_offset = block_offset_i[BLOCK_OFFSET_W-1:0]; end GEN_HASH_NONCE: begin if (arc_GEN_HASH_NONCE_GEN_HASH_PAD_LD1) gen_hash_fsm_ns = GEN_HASH_PAD_LD1; - block_wr_data = nonce; + block_wr_data = nonce[NONCE_LEN_DWORD-1-nonce_offset_i]; end GEN_HASH_PAD_LD1: begin if (arc_GEN_HASH_PAD_LD1_GEN_HASH_PAD_0S) gen_hash_fsm_ns = GEN_HASH_PAD_0S; @@ -197,6 +205,7 @@ assign block_offset = block_offset_i[BLOCK_OFFSET_W-1:0]; else begin gen_hash_fsm_ps <= gen_hash_fsm_ns; block_offset_i <= block_offset_nxt; + nonce_offset_i <= nonce_offset_nxt; read_entry <= read_entry_nxt; read_offset <= read_offset_nxt; end diff --git a/src/pcrvault/rtl/pv_reg.rdl b/src/pcrvault/rtl/pv_reg.rdl index 9dbdcec4a..7a9a05e37 100644 --- a/src/pcrvault/rtl/pv_reg.rdl +++ b/src/pcrvault/rtl/pv_reg.rdl @@ -15,6 +15,7 @@ addrmap pv_reg { desc="address map for pcrvault"; signal {activelow; async; cpuif_reset; field_reset;} reset_b; + signal {activelow; async;} core_only_rst_b; signal {activelow; async;} hard_reset_b; //PCR are sw read only @@ -26,7 +27,7 @@ addrmap pv_reg { reg pvCtrl { desc="Controls for each pcr entry"; field {desc="Lock the PCR from being cleared"; - sw=rw; swwel=true; hw=r; resetsignal = hard_reset_b;} lock=0; + sw=rw; swwel=true; hw=r; resetsignal = core_only_rst_b;} lock=0; field {desc="Clear the data stored in this entry. Lock will prevent this clear."; sw=rw; swwel=true; hw=r; singlepulse;} clear=0; field {desc="Reserved"; diff --git a/src/pcrvault/rtl/pv_reg.sv b/src/pcrvault/rtl/pv_reg.sv index 74e1dd8c0..d8483f2b2 100644 --- a/src/pcrvault/rtl/pv_reg.sv +++ b/src/pcrvault/rtl/pv_reg.sv @@ -160,8 +160,8 @@ module pv_reg ( field_combo.PCR_CTRL[i0].lock.next = next_c; field_combo.PCR_CTRL[i0].lock.load_next = load_next_c; end - always_ff @(posedge clk or negedge hwif_in.hard_reset_b) begin - if(~hwif_in.hard_reset_b) begin + always_ff @(posedge clk or negedge hwif_in.core_only_rst_b) begin + if(~hwif_in.core_only_rst_b) begin field_storage.PCR_CTRL[i0].lock.value <= 'h0; end else if(field_combo.PCR_CTRL[i0].lock.load_next) begin field_storage.PCR_CTRL[i0].lock.value <= field_combo.PCR_CTRL[i0].lock.next; diff --git a/src/pcrvault/rtl/pv_reg_covergroups.svh b/src/pcrvault/rtl/pv_reg_covergroups.svh new file mode 100644 index 000000000..63f50e1c5 --- /dev/null +++ b/src/pcrvault/rtl/pv_reg_covergroups.svh @@ -0,0 +1,65 @@ +// SPDX-License-Identifier: Apache-2.0 +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +`ifndef PV_REG_COVERGROUPS + `define PV_REG_COVERGROUPS + + /*----------------------- PV_REG__PVCTRL COVERGROUPS -----------------------*/ + covergroup pv_reg__pvCtrl_bit_cg with function sample(input bit reg_bit); + option.per_instance = 1; + reg_bit_cp : coverpoint reg_bit { + bins value[2] = {0,1}; + } + reg_bit_edge_cp : coverpoint reg_bit { + bins rise = (0 => 1); + bins fall = (1 => 0); + } + + endgroup + covergroup pv_reg__pvCtrl_fld_cg with function sample( + input bit [1-1:0] lock, + input bit [1-1:0] clear, + input bit [1-1:0] rsvd0, + input bit [5-1:0] rsvd1 + ); + option.per_instance = 1; + lock_cp : coverpoint lock; + clear_cp : coverpoint clear; + rsvd0_cp : coverpoint rsvd0; + rsvd1_cp : coverpoint rsvd1; + lockXclear: cross lock_cp, clear_cp; + + endgroup + + /*----------------------- PV_REG__PCRREG COVERGROUPS -----------------------*/ + covergroup pv_reg__pcrReg_bit_cg with function sample(input bit reg_bit); + option.per_instance = 1; + reg_bit_cp : coverpoint reg_bit { + bins value[2] = {0,1}; + } + reg_bit_edge_cp : coverpoint reg_bit { + bins rise = (0 => 1); + bins fall = (1 => 0); + } + + endgroup + covergroup pv_reg__pcrReg_fld_cg with function sample( + input bit [32-1:0] data + ); + option.per_instance = 1; + data_cp : coverpoint data; + + endgroup + +`endif \ No newline at end of file diff --git a/src/pcrvault/rtl/pv_reg_pkg.sv b/src/pcrvault/rtl/pv_reg_pkg.sv index f61581c70..e0201b175 100644 --- a/src/pcrvault/rtl/pv_reg_pkg.sv +++ b/src/pcrvault/rtl/pv_reg_pkg.sv @@ -32,6 +32,7 @@ package pv_reg_pkg; typedef struct packed{ logic reset_b; + logic core_only_rst_b; logic hard_reset_b; pv_reg__pvCtrl__in_t [32-1:0]PCR_CTRL; pv_reg__pcrReg__in_t [32-1:0][12-1:0]PCR_ENTRY; diff --git a/src/pcrvault/rtl/pv_reg_sample.svh b/src/pcrvault/rtl/pv_reg_sample.svh new file mode 100644 index 000000000..8f7d16443 --- /dev/null +++ b/src/pcrvault/rtl/pv_reg_sample.svh @@ -0,0 +1,74 @@ +// SPDX-License-Identifier: Apache-2.0 +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +`ifndef PV_REG_SAMPLE + `define PV_REG_SAMPLE + + /*----------------------- PV_REG__PVCTRL SAMPLE FUNCTIONS -----------------------*/ + function void pv_reg__pvCtrl::sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); + m_current = get(); + m_data = data; + m_is_read = is_read; + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(lock_bit_cg[bt]) this.lock_bit_cg[bt].sample(data[0 + bt]); + foreach(clear_bit_cg[bt]) this.clear_bit_cg[bt].sample(data[1 + bt]); + foreach(rsvd0_bit_cg[bt]) this.rsvd0_bit_cg[bt].sample(data[2 + bt]); + foreach(rsvd1_bit_cg[bt]) this.rsvd1_bit_cg[bt].sample(data[3 + bt]); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( data[0:0]/*lock*/ , data[1:1]/*clear*/ , data[2:2]/*rsvd0*/ , data[7:3]/*rsvd1*/ ); + end + endfunction + + function void pv_reg__pvCtrl::sample_values(); + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(lock_bit_cg[bt]) this.lock_bit_cg[bt].sample(lock.get_mirrored_value() >> bt); + foreach(clear_bit_cg[bt]) this.clear_bit_cg[bt].sample(clear.get_mirrored_value() >> bt); + foreach(rsvd0_bit_cg[bt]) this.rsvd0_bit_cg[bt].sample(rsvd0.get_mirrored_value() >> bt); + foreach(rsvd1_bit_cg[bt]) this.rsvd1_bit_cg[bt].sample(rsvd1.get_mirrored_value() >> bt); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( lock.get_mirrored_value() , clear.get_mirrored_value() , rsvd0.get_mirrored_value() , rsvd1.get_mirrored_value() ); + end + endfunction + + /*----------------------- PV_REG__PCRREG SAMPLE FUNCTIONS -----------------------*/ + function void pv_reg__pcrReg::sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); + m_current = get(); + m_data = data; + m_is_read = is_read; + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(data_bit_cg[bt]) this.data_bit_cg[bt].sample(data[0 + bt]); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( data[31:0]/*data*/ ); + end + endfunction + + function void pv_reg__pcrReg::sample_values(); + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(data_bit_cg[bt]) this.data_bit_cg[bt].sample(data.get_mirrored_value() >> bt); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( data.get_mirrored_value() ); + end + endfunction + +`endif \ No newline at end of file diff --git a/src/pcrvault/rtl/pv_reg_uvm.sv b/src/pcrvault/rtl/pv_reg_uvm.sv index ccc1af0d6..dc21effeb 100644 --- a/src/pcrvault/rtl/pv_reg_uvm.sv +++ b/src/pcrvault/rtl/pv_reg_uvm.sv @@ -3,17 +3,31 @@ package pv_reg_uvm; `include "uvm_macros.svh" import uvm_pkg::*; - + `include "pv_reg_covergroups.svh" // Reg - pv_reg::pvCtrl class pv_reg__pvCtrl extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + pv_reg__pvCtrl_bit_cg lock_bit_cg[1]; + pv_reg__pvCtrl_bit_cg clear_bit_cg[1]; + pv_reg__pvCtrl_bit_cg rsvd0_bit_cg[1]; + pv_reg__pvCtrl_bit_cg rsvd1_bit_cg[5]; + pv_reg__pvCtrl_fld_cg fld_cg; rand uvm_reg_field lock; rand uvm_reg_field clear; rand uvm_reg_field rsvd0; rand uvm_reg_field rsvd1; function new(string name = "pv_reg__pvCtrl"); - super.new(name, 32, UVM_NO_COVERAGE); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); virtual function void build(); this.lock = new("lock"); @@ -24,20 +38,44 @@ package pv_reg_uvm; this.rsvd0.configure(this, 1, 2, "RW", 1, 'h0, 1, 1, 0); this.rsvd1 = new("rsvd1"); this.rsvd1.configure(this, 5, 3, "RW", 0, 'h0, 1, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(lock_bit_cg[bt]) lock_bit_cg[bt] = new(); + foreach(clear_bit_cg[bt]) clear_bit_cg[bt] = new(); + foreach(rsvd0_bit_cg[bt]) rsvd0_bit_cg[bt] = new(); + foreach(rsvd1_bit_cg[bt]) rsvd1_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); endfunction : build endclass : pv_reg__pvCtrl // Reg - pv_reg::pcrReg class pv_reg__pcrReg extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + pv_reg__pcrReg_bit_cg data_bit_cg[32]; + pv_reg__pcrReg_fld_cg fld_cg; rand uvm_reg_field data; function new(string name = "pv_reg__pcrReg"); - super.new(name, 32, UVM_NO_COVERAGE); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); virtual function void build(); this.data = new("data"); this.data.configure(this, 32, 0, "RO", 1, 'h0, 1, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(data_bit_cg[bt]) data_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); endfunction : build endclass : pv_reg__pcrReg @@ -69,4 +107,5 @@ package pv_reg_uvm; endfunction : build endclass : pv_reg + `include "pv_reg_sample.svh" endpackage: pv_reg_uvm diff --git a/src/pcrvault/uvmf_pv/config/compile.yml b/src/pcrvault/uvmf_pv/config/compile.yml index 82026006e..e8c5fc186 100644 --- a/src/pcrvault/uvmf_pv/config/compile.yml +++ b/src/pcrvault/uvmf_pv/config/compile.yml @@ -6,6 +6,7 @@ requires: - pv_uvm_pkg - pcrvault - caliptra_top_defines + - pcrvault_cov targets: tb: directories: diff --git a/src/pcrvault/uvmf_pv/uvmf_template_output/project_benches/pv/tb/testbench/hdl_top.sv b/src/pcrvault/uvmf_pv/uvmf_template_output/project_benches/pv/tb/testbench/hdl_top.sv index a1c2d9779..ccb7091e0 100644 --- a/src/pcrvault/uvmf_pv/uvmf_template_output/project_benches/pv/tb/testbench/hdl_top.sv +++ b/src/pcrvault/uvmf_pv/uvmf_template_output/project_benches/pv/tb/testbench/hdl_top.sv @@ -133,6 +133,8 @@ import uvmf_base_pkg_hdl::*; .clk (clk), .rst_b (pv_rst_agent_bus.rst_b), .cptra_pwrgood (pv_rst_agent_bus.cptra_pwrgood), + .core_only_rst_b(pv_rst_agent_bus.core_only_rst_b), + .fw_update_rst_window(pv_rst_agent_bus.fw_update_rst_window), .haddr_i (uvm_test_top_environment_qvip_ahb_lite_slave_subenv_qvip_hdl.ahb_lite_slave_0_HADDR[14:0]), .hwdata_i (uvm_test_top_environment_qvip_ahb_lite_slave_subenv_qvip_hdl.ahb_lite_slave_0_HWDATA ), .hsel_i (1'b1), @@ -149,6 +151,9 @@ import uvmf_base_pkg_hdl::*; .pv_rd_resp (pv_rd_resp), .pv_wr_resp (pv_wr_resp) ); + + pcrvault_cov_bind i_pcrvault_cov_bind(); + assign uvm_test_top_environment_qvip_ahb_lite_slave_subenv_qvip_hdl.ahb_lite_slave_0_HBURST = 3'b0; assign uvm_test_top_environment_qvip_ahb_lite_slave_subenv_qvip_hdl.ahb_lite_slave_0_HPROT = 7'b0; assign uvm_test_top_environment_qvip_ahb_lite_slave_subenv_qvip_hdl.ahb_lite_slave_0_HMASTLOCK = 1'b0; diff --git a/src/pcrvault/uvmf_pv/uvmf_template_output/verification_ip/interface_packages/pv_read_pkg/src/pv_read_transaction_coverage.svh b/src/pcrvault/uvmf_pv/uvmf_template_output/verification_ip/interface_packages/pv_read_pkg/src/pv_read_transaction_coverage.svh index 2cfac498b..382f34f70 100644 --- a/src/pcrvault/uvmf_pv/uvmf_template_output/verification_ip/interface_packages/pv_read_pkg/src/pv_read_transaction_coverage.svh +++ b/src/pcrvault/uvmf_pv/uvmf_template_output/verification_ip/interface_packages/pv_read_pkg/src/pv_read_transaction_coverage.svh @@ -28,6 +28,15 @@ //---------------------------------------------------------------------- //---------------------------------------------------------------------- // +covergroup rd_data(input logic rd_data_bit); + //option.per_instance = 1; + value: coverpoint rd_data_bit; + transition: coverpoint rd_data_bit { + bins bin01 = (0 => 1); + bins bin10 = (1 => 0); + } +endgroup + class pv_read_transaction_coverage #( string PV_READ_REQUESTOR = "SHA512_BLOCK" ) @@ -44,6 +53,7 @@ class pv_read_transaction_coverage #( T coverage_trans; // pragma uvmf custom class_item_additional begin + rd_data rd_data_bus[PV_DATA_W]; // pragma uvmf custom class_item_additional end // **************************************************************************** @@ -60,7 +70,7 @@ class pv_read_transaction_coverage #( ignore_bins error1 = {'d1}; } last: coverpoint coverage_trans.last; - //read_data: coverpoint coverage_trans.read_data; + lastXoffset: cross last, read_offset; // pragma uvmf custom covergroup end endgroup @@ -90,7 +100,12 @@ class pv_read_transaction_coverage #( virtual function void write (T t); `uvm_info("COV","Received transaction",UVM_HIGH); coverage_trans = t; + + foreach(rd_data_bus[i]) rd_data_bus[i] = new(coverage_trans.read_data[i]); + foreach(rd_data_bus[i]) rd_data_bus[i].set_inst_name($sformatf("rd_data_bus[%0d]_%s",i,get_full_name())); + pv_read_transaction_cg.sample(); + foreach(rd_data_bus[i]) rd_data_bus[i].sample(); endfunction endclass diff --git a/src/pcrvault/uvmf_pv/uvmf_template_output/verification_ip/interface_packages/pv_rst_pkg/pv_rst_pkg.sv b/src/pcrvault/uvmf_pv/uvmf_template_output/verification_ip/interface_packages/pv_rst_pkg/pv_rst_pkg.sv index 1a30f2ecd..163f5dfa8 100644 --- a/src/pcrvault/uvmf_pv/uvmf_template_output/verification_ip/interface_packages/pv_rst_pkg/pv_rst_pkg.sv +++ b/src/pcrvault/uvmf_pv/uvmf_template_output/verification_ip/interface_packages/pv_rst_pkg/pv_rst_pkg.sv @@ -73,6 +73,7 @@ package pv_rst_pkg; `include "src/pv_rst_random_sequence.svh" `include "src/pv_rst_cold_rst_sequence.svh" `include "src/pv_rst_warm_rst_sequence.svh" + `include "src/pv_rst_core_rst_sequence.svh" `include "src/pv_rst_poweron_sequence.svh" `include "src/pv_rst_responder_sequence.svh" diff --git a/src/pcrvault/uvmf_pv/uvmf_template_output/verification_ip/interface_packages/pv_rst_pkg/src/pv_rst_cold_rst_sequence.svh b/src/pcrvault/uvmf_pv/uvmf_template_output/verification_ip/interface_packages/pv_rst_pkg/src/pv_rst_cold_rst_sequence.svh index a9cb3b752..f7b5ec767 100644 --- a/src/pcrvault/uvmf_pv/uvmf_template_output/verification_ip/interface_packages/pv_rst_pkg/src/pv_rst_cold_rst_sequence.svh +++ b/src/pcrvault/uvmf_pv/uvmf_template_output/verification_ip/interface_packages/pv_rst_pkg/src/pv_rst_cold_rst_sequence.svh @@ -55,6 +55,7 @@ class pv_rst_cold_rst_sequence extends pv_rst_sequence_base; `uvm_info("PV_RST_COLD_RST", "Asserting reset, pwrgood low", UVM_MEDIUM) req.set_pwrgood = 1'b0; req.assert_rst = 1'b1; + req.assert_core_rst = 1'b1; finish_item(req); `uvm_info("PV_RST_COLD_RST", {"Response:",req.convert2string()},UVM_MEDIUM) @@ -67,6 +68,7 @@ class pv_rst_cold_rst_sequence extends pv_rst_sequence_base; `uvm_info("PV_RST_COLD_RST", "Asserting reset, pwrgood high", UVM_MEDIUM) req.set_pwrgood = 1'b1; req.assert_rst = 1'b1; + req.assert_core_rst = 1'b1; finish_item(req); `uvm_info("PV_RST_COLD_RST", {"Response:",req.convert2string()},UVM_MEDIUM) @@ -79,6 +81,7 @@ class pv_rst_cold_rst_sequence extends pv_rst_sequence_base; `uvm_info("PV_RST_COLD_RST", "Asserting reset, pwrgood high", UVM_MEDIUM) req.set_pwrgood = 1'b1; req.assert_rst = 1'b0; + req.assert_core_rst = 1'b0; finish_item(req); `uvm_info("PV_RST_COLD_RST", {"Response:",req.convert2string()},UVM_MEDIUM) @@ -87,4 +90,4 @@ class pv_rst_cold_rst_sequence extends pv_rst_sequence_base; endtask -endclass \ No newline at end of file +endclass diff --git a/src/pcrvault/uvmf_pv/uvmf_template_output/verification_ip/interface_packages/pv_rst_pkg/src/pv_rst_core_rst_sequence.svh b/src/pcrvault/uvmf_pv/uvmf_template_output/verification_ip/interface_packages/pv_rst_pkg/src/pv_rst_core_rst_sequence.svh new file mode 100644 index 000000000..52514ba80 --- /dev/null +++ b/src/pcrvault/uvmf_pv/uvmf_template_output/verification_ip/interface_packages/pv_rst_pkg/src/pv_rst_core_rst_sequence.svh @@ -0,0 +1,79 @@ +//---------------------------------------------------------------------- +// Created with uvmf_gen version 2022.3 +//---------------------------------------------------------------------- +// SPDX-License-Identifier: Apache-2.0 +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// pragma uvmf custom header begin +// pragma uvmf custom header end +//---------------------------------------------------------------------- +//---------------------------------------------------------------------- +// +// DESCRIPTION: +// This sequences randomizes the soc_ifc_ctrl transaction and sends it +// to the UVM driver. +// +// This sequence constructs and randomizes a soc_ifc_ctrl_transaction. +// +//---------------------------------------------------------------------- +//---------------------------------------------------------------------- +// +class pv_rst_core_rst_sequence extends pv_rst_sequence_base; + + `uvm_object_utils( pv_rst_core_rst_sequence ) + + //***************************************************************** + function new(string name = ""); + super.new(name); + endfunction: new + + // **************************************************************************** + // TASK : body() + // This task is automatically executed when this sequence is started using the + // start(sequencerHandle) task. + // + + task body(); + + // Assert core reset + req=pv_rst_transaction::type_id::create("pwr_req"); + start_item(req); + // Randomize the transaction + if(!req.randomize()) `uvm_fatal("PV_RST_CORE_RST", "pv_rst_core_rst_sequence::body()-pv_rst_transaction randomization failed") + `uvm_info("PV_RST_CORE_RST", "Asserting core reset", UVM_MEDIUM) + req.set_pwrgood = 1'b1; + req.assert_rst = 1'b0; + req.assert_core_rst = 1'b1; + + finish_item(req); + `uvm_info("PV_RST_CORE_RST", {"Response:",req.convert2string()},UVM_MEDIUM) + + // Deassert core reset + req=pv_rst_transaction::type_id::create("rst_req"); + start_item(req); + // Randomize the transaction + if(!req.randomize()) `uvm_fatal("PV_RST_CORE_RST", "pv_rst_core_rst_sequence::body()-pv_rst_transaction randomization failed") + `uvm_info("PV_RST_CORE_RST", "Deasserting core reset", UVM_MEDIUM) + req.set_pwrgood = 1'b1; + req.assert_rst = 1'b0; + req.assert_core_rst = 1'b0; + + finish_item(req); + `uvm_info("PV_RST_CORE_RST", {"Response:",req.convert2string()},UVM_MEDIUM) + + + +endtask + +endclass diff --git a/src/pcrvault/uvmf_pv/uvmf_template_output/verification_ip/interface_packages/pv_rst_pkg/src/pv_rst_driver_bfm.sv b/src/pcrvault/uvmf_pv/uvmf_template_output/verification_ip/interface_packages/pv_rst_pkg/src/pv_rst_driver_bfm.sv index 2a16dc139..ddc3fad6e 100644 --- a/src/pcrvault/uvmf_pv/uvmf_template_output/verification_ip/interface_packages/pv_rst_pkg/src/pv_rst_driver_bfm.sv +++ b/src/pcrvault/uvmf_pv/uvmf_template_output/verification_ip/interface_packages/pv_rst_pkg/src/pv_rst_driver_bfm.sv @@ -110,6 +110,10 @@ end reg cptra_pwrgood_o = 'bz; tri rst_b_i; reg rst_b_o = 'bz; + tri core_only_rst_b_i; + reg core_only_rst_b_o = 'bz; + tri fw_update_rst_window_i; + reg fw_update_rst_window_o = 'bz; // Bi-directional signals @@ -127,6 +131,10 @@ end assign cptra_pwrgood_i = bus.cptra_pwrgood; assign bus.rst_b = (initiator_responder == INITIATOR) ? rst_b_o : 'bz; assign rst_b_i = bus.rst_b; + assign bus.core_only_rst_b = (initiator_responder == INITIATOR) ? core_only_rst_b_o : 'bz; + assign core_only_rst_b_i = bus.core_only_rst_b; + assign bus.fw_update_rst_window = (initiator_responder == INITIATOR) ? fw_update_rst_window_o : 'bz; + assign fw_update_rst_window_i = bus.fw_update_rst_window; // Proxy handle to UVM driver pv_rst_pkg::pv_rst_driver proxy; @@ -160,6 +168,8 @@ end // INITIATOR mode output signals cptra_pwrgood_o <= 'bz; rst_b_o <= 'bz; + core_only_rst_b_o <= 'bz; + fw_update_rst_window_o <= 'bz; // Bi-directional signals end @@ -201,10 +211,12 @@ end // Members within the pv_rst_initiator_struct: // bit set_pwrgood ; // bit assert_rst ; + // bit assert_core_rst ; // int unsigned wait_cycles ; // Members within the pv_rst_responder_struct: // bit set_pwrgood ; // bit assert_rst ; + // bit assert_core_rst ; // int unsigned wait_cycles ; initiator_struct = pv_rst_initiator_struct; // @@ -222,6 +234,7 @@ end // Initiator output signals // cptra_pwrgood_o <= pv_rst_initiator_struct.xyz; // // rst_b_o <= pv_rst_initiator_struct.xyz; // + // core_rst_b_o <= pv_rst_initiator_struct.xyz; // // Initiator inout signals // Initiate a transfer using the data received. @(posedge clk_i); @@ -229,8 +242,13 @@ end if (initiator_struct.assert_rst) rst_b_o <= 1'b0; + if (initiator_struct.assert_core_rst) + fw_update_rst_window_o <= 1'b1; + if (initiator_struct.assert_core_rst) + core_only_rst_b_o <= 1'b0; if (!initiator_struct.set_pwrgood) cptra_pwrgood_o <= 1'b0; + // Wait for the responder to complete the transfer then place the responder data into // pv_rst_responder_struct. @(posedge clk_i); @@ -238,14 +256,18 @@ end if (!initiator_struct.assert_rst) rst_b_o <= 1'b1; + if (!initiator_struct.assert_core_rst) + fw_update_rst_window_o <= 1'b0; + if (!initiator_struct.assert_core_rst) + core_only_rst_b_o <= 1'b1; if (initiator_struct.set_pwrgood) cptra_pwrgood_o <= 1'b1; repeat(initiator_struct.wait_cycles) @(posedge clk_i); - pv_rst_responder_struct.set_pwrgood = cptra_pwrgood_i; pv_rst_responder_struct.assert_rst = !rst_b_i; + pv_rst_responder_struct.assert_core_rst = !core_only_rst_b_i; responder_struct = pv_rst_responder_struct; endtask // pragma uvmf custom initiate_and_get_response end @@ -285,6 +307,7 @@ bit first_transfer=1; // Responder input signals // pv_rst_responder_struct.xyz = cptra_pwrgood_i; // // pv_rst_responder_struct.xyz = rst_b_i; // + // pv_rst_responder_struct.xyz = core_rst_b_i; // // Responder inout signals // How to assign a signal, named xyz, from an initiator struct member. // All available responder output and inout signals listed. diff --git a/src/pcrvault/uvmf_pv/uvmf_template_output/verification_ip/interface_packages/pv_rst_pkg/src/pv_rst_if.sv b/src/pcrvault/uvmf_pv/uvmf_template_output/verification_ip/interface_packages/pv_rst_pkg/src/pv_rst_if.sv index 5f2c7212b..cace82312 100644 --- a/src/pcrvault/uvmf_pv/uvmf_template_output/verification_ip/interface_packages/pv_rst_pkg/src/pv_rst_if.sv +++ b/src/pcrvault/uvmf_pv/uvmf_template_output/verification_ip/interface_packages/pv_rst_pkg/src/pv_rst_if.sv @@ -35,6 +35,8 @@ // // .dut_signal_port(pv_rst_bus.cptra_pwrgood), // Agent output // .dut_signal_port(pv_rst_bus.rst_b), // Agent output +// .dut_signal_port(pv_rst_bus.core_only_rst_b), // Agent output +// .dut_signal_port(pv_rst_bus.debug_locked), // Agent output import uvmf_base_pkg_hdl::*; import pv_rst_pkg_hdl::*; @@ -45,7 +47,9 @@ interface pv_rst_if input tri clk, input tri dummy, inout tri cptra_pwrgood, - inout tri rst_b + inout tri rst_b, + inout tri core_only_rst_b, + inout tri fw_update_rst_window ); modport monitor_port @@ -53,7 +57,9 @@ modport monitor_port input clk, input dummy, input cptra_pwrgood, - input rst_b + input rst_b, + input core_only_rst_b, + input fw_update_rst_window ); modport initiator_port @@ -61,7 +67,9 @@ modport initiator_port input clk, input dummy, output cptra_pwrgood, - output rst_b + output rst_b, + output core_only_rst_b, + output fw_update_rst_window ); modport responder_port @@ -69,7 +77,9 @@ modport responder_port input clk, input dummy, input cptra_pwrgood, - input rst_b + input rst_b, + input core_only_rst_b, + input fw_update_rst_window ); diff --git a/src/pcrvault/uvmf_pv/uvmf_template_output/verification_ip/interface_packages/pv_rst_pkg/src/pv_rst_macros.svh b/src/pcrvault/uvmf_pv/uvmf_template_output/verification_ip/interface_packages/pv_rst_pkg/src/pv_rst_macros.svh index 59f50d1e4..b55b0f361 100644 --- a/src/pcrvault/uvmf_pv/uvmf_template_output/verification_ip/interface_packages/pv_rst_pkg/src/pv_rst_macros.svh +++ b/src/pcrvault/uvmf_pv/uvmf_template_output/verification_ip/interface_packages/pv_rst_pkg/src/pv_rst_macros.svh @@ -65,6 +65,7 @@ typedef struct packed { \ `define pv_rst_MONITOR_STRUCT typedef struct packed { \ bit set_pwrgood ; \ bit assert_rst ; \ + bit assert_core_rst ; \ int unsigned wait_cycles ; \ } pv_rst_monitor_s; @@ -74,6 +75,7 @@ typedef struct packed { \ { \ this.set_pwrgood , \ this.assert_rst , \ + this.assert_core_rst , \ this.wait_cycles \ };\ return ( pv_rst_monitor_struct);\ @@ -84,6 +86,7 @@ typedef struct packed { \ {\ this.set_pwrgood , \ this.assert_rst , \ + this.assert_core_rst , \ this.wait_cycles \ } = pv_rst_monitor_struct;\ endfunction @@ -96,6 +99,7 @@ typedef struct packed { \ `define pv_rst_INITIATOR_STRUCT typedef struct packed { \ bit set_pwrgood ; \ bit assert_rst ; \ + bit assert_core_rst ; \ int unsigned wait_cycles ; \ } pv_rst_initiator_s; @@ -105,6 +109,7 @@ typedef struct packed { \ {\ this.set_pwrgood , \ this.assert_rst , \ + this.assert_core_rst , \ this.wait_cycles \ };\ return ( pv_rst_initiator_struct);\ @@ -115,6 +120,7 @@ typedef struct packed { \ {\ this.set_pwrgood , \ this.assert_rst , \ + this.assert_core_rst , \ this.wait_cycles \ } = pv_rst_initiator_struct;\ endfunction @@ -127,6 +133,7 @@ typedef struct packed { \ `define pv_rst_RESPONDER_STRUCT typedef struct packed { \ bit set_pwrgood ; \ bit assert_rst ; \ + bit assert_core_rst ; \ int unsigned wait_cycles ; \ } pv_rst_responder_s; @@ -136,6 +143,7 @@ typedef struct packed { \ {\ this.set_pwrgood , \ this.assert_rst , \ + this.assert_core_rst , \ this.wait_cycles \ };\ return ( pv_rst_responder_struct);\ @@ -146,6 +154,7 @@ typedef struct packed { \ {\ this.set_pwrgood , \ this.assert_rst , \ + this.assert_core_rst , \ this.wait_cycles \ } = pv_rst_responder_struct;\ endfunction diff --git a/src/pcrvault/uvmf_pv/uvmf_template_output/verification_ip/interface_packages/pv_rst_pkg/src/pv_rst_monitor_bfm.sv b/src/pcrvault/uvmf_pv/uvmf_template_output/verification_ip/interface_packages/pv_rst_pkg/src/pv_rst_monitor_bfm.sv index 5bba0d474..b3dc8321e 100644 --- a/src/pcrvault/uvmf_pv/uvmf_template_output/verification_ip/interface_packages/pv_rst_pkg/src/pv_rst_monitor_bfm.sv +++ b/src/pcrvault/uvmf_pv/uvmf_template_output/verification_ip/interface_packages/pv_rst_pkg/src/pv_rst_monitor_bfm.sv @@ -85,23 +85,31 @@ end tri dummy_i; tri cptra_pwrgood_i; tri rst_b_i; + tri core_only_rst_b_i; + tri fw_update_rst_window_i; assign clk_i = bus.clk; assign dummy_i = bus.dummy; assign cptra_pwrgood_i = bus.cptra_pwrgood; assign rst_b_i = bus.rst_b; + assign core_only_rst_b_i = bus.core_only_rst_b; + assign fw_update_rst_window_i = bus.fw_update_rst_window; // Proxy handle to UVM monitor pv_rst_pkg::pv_rst_monitor proxy; // pragma tbx oneway proxy.notify_transaction // pragma uvmf custom interface_item_additional begin - reg cptra_pwrgood_o = 'b0; - reg rst_b_o = 'b0; + reg cptra_pwrgood_o = 'b0; + reg rst_b_o = 'b0; + reg core_only_rst_b_o = 'b0; + reg fw_update_rst_window_o = 'b0; function bit any_signal_changed(); - return |(cptra_pwrgood_i ^ cptra_pwrgood_o) || - |(rst_b_i ^ rst_b_o); + return |(cptra_pwrgood_i ^ cptra_pwrgood_o) || + |(rst_b_i ^ rst_b_o) || + |(core_only_rst_b_i ^ core_only_rst_b_o) || + |(fw_update_rst_window_i ^ fw_update_rst_window_o); endfunction // pragma uvmf custom interface_item_additional end diff --git a/src/pcrvault/uvmf_pv/uvmf_template_output/verification_ip/interface_packages/pv_rst_pkg/src/pv_rst_poweron_sequence.svh b/src/pcrvault/uvmf_pv/uvmf_template_output/verification_ip/interface_packages/pv_rst_pkg/src/pv_rst_poweron_sequence.svh index c29898b8b..2ecb8e93a 100644 --- a/src/pcrvault/uvmf_pv/uvmf_template_output/verification_ip/interface_packages/pv_rst_pkg/src/pv_rst_poweron_sequence.svh +++ b/src/pcrvault/uvmf_pv/uvmf_template_output/verification_ip/interface_packages/pv_rst_pkg/src/pv_rst_poweron_sequence.svh @@ -54,6 +54,7 @@ class pv_rst_poweron_sequence extends pv_rst_sequence_base; `uvm_info("PV_RST_POWERON", "Asserting reset, pwrgood low", UVM_MEDIUM) req.set_pwrgood = 1'b0; req.assert_rst = 1'b1; + req.assert_core_rst = 1'b1; finish_item(req); `uvm_info("PV_RST_POWERON", {"Response:",req.convert2string()},UVM_MEDIUM) @@ -65,6 +66,7 @@ class pv_rst_poweron_sequence extends pv_rst_sequence_base; `uvm_info("PV_RST_POWERON", "Asserting reset, pwrgood high", UVM_MEDIUM) req.set_pwrgood = 1'b1; req.assert_rst = 1'b1; + req.assert_core_rst = 1'b1; finish_item(req); `uvm_info("PV_RST_POWERON", {"Response:",req.convert2string()},UVM_MEDIUM) @@ -76,9 +78,10 @@ class pv_rst_poweron_sequence extends pv_rst_sequence_base; `uvm_info("PV_RST_POWERON", "Deasserting reset, reset phase done", UVM_MEDIUM) req.set_pwrgood = 1'b1; req.assert_rst = 1'b0; + req.assert_core_rst = 1'b0; finish_item(req); `uvm_info("PV_RST_POWERON", {"Response:",req.convert2string()},UVM_MEDIUM) endtask -endclass \ No newline at end of file +endclass diff --git a/src/pcrvault/uvmf_pv/uvmf_template_output/verification_ip/interface_packages/pv_rst_pkg/src/pv_rst_transaction.svh b/src/pcrvault/uvmf_pv/uvmf_template_output/verification_ip/interface_packages/pv_rst_pkg/src/pv_rst_transaction.svh index 952e04a3f..63d478dd3 100644 --- a/src/pcrvault/uvmf_pv/uvmf_template_output/verification_ip/interface_packages/pv_rst_pkg/src/pv_rst_transaction.svh +++ b/src/pcrvault/uvmf_pv/uvmf_template_output/verification_ip/interface_packages/pv_rst_pkg/src/pv_rst_transaction.svh @@ -34,6 +34,7 @@ class pv_rst_transaction extends uvmf_transaction_base; bit set_pwrgood ; bit assert_rst ; + bit assert_core_rst ; rand int unsigned wait_cycles ; //Constraints for the transaction variables: @@ -118,7 +119,7 @@ class pv_rst_transaction extends uvmf_transaction_base; virtual function string convert2string(); // pragma uvmf custom convert2string begin // UVMF_CHANGE_ME : Customize format if desired. - return $sformatf("set_pwrgood:0x%x assert_rst:0x%x wait_cycles:0x%x ",set_pwrgood,assert_rst,wait_cycles); + return $sformatf("set_pwrgood:0x%x assert_rst:0x%x assert_core_rst:0x%x wait_cycles:0x%x",set_pwrgood,assert_rst,assert_core_rst,wait_cycles); // pragma uvmf custom convert2string end endfunction @@ -162,6 +163,7 @@ class pv_rst_transaction extends uvmf_transaction_base; super.do_copy(rhs); this.set_pwrgood = RHS.set_pwrgood; this.assert_rst = RHS.assert_rst; + this.assert_core_rst = RHS.assert_core_rst; this.wait_cycles = RHS.wait_cycles; // pragma uvmf custom do_copy end endfunction @@ -188,6 +190,7 @@ class pv_rst_transaction extends uvmf_transaction_base; // UVMF_CHANGE_ME : Eliminate transaction variables not wanted in transaction viewing in the waveform viewer $add_attribute(transaction_view_h,set_pwrgood,"set_pwrgood"); $add_attribute(transaction_view_h,assert_rst,"assert_rst"); + $add_attribute(transaction_view_h,assert_core_rst,"assert_core_rst"); $add_attribute(transaction_view_h,wait_cycles,"wait_cycles"); // pragma uvmf custom add_to_wave end $end_transaction(transaction_view_h,end_time); diff --git a/src/pcrvault/uvmf_pv/uvmf_template_output/verification_ip/interface_packages/pv_rst_pkg/src/pv_rst_warm_rst_sequence.svh b/src/pcrvault/uvmf_pv/uvmf_template_output/verification_ip/interface_packages/pv_rst_pkg/src/pv_rst_warm_rst_sequence.svh index 1b2bc9229..fe69382bd 100644 --- a/src/pcrvault/uvmf_pv/uvmf_template_output/verification_ip/interface_packages/pv_rst_pkg/src/pv_rst_warm_rst_sequence.svh +++ b/src/pcrvault/uvmf_pv/uvmf_template_output/verification_ip/interface_packages/pv_rst_pkg/src/pv_rst_warm_rst_sequence.svh @@ -54,6 +54,7 @@ class pv_rst_warm_rst_sequence extends pv_rst_sequence_base; `uvm_info("PV_RST_WARM_RST", "Asserting reset, pwrgood low", UVM_MEDIUM) req.set_pwrgood = 1'b1; req.assert_rst = 1'b1; + req.assert_core_rst = 1'b1; finish_item(req); `uvm_info("PV_RST_WARM_RST", {"Response:",req.convert2string()},UVM_MEDIUM) @@ -66,6 +67,7 @@ class pv_rst_warm_rst_sequence extends pv_rst_sequence_base; `uvm_info("PV_RST_WARM_RST", "Asserting reset, pwrgood high", UVM_MEDIUM) req.set_pwrgood = 1'b1; req.assert_rst = 1'b0; + req.assert_core_rst = 1'b0; finish_item(req); `uvm_info("PV_RST_WARM_RST", {"Response:",req.convert2string()},UVM_MEDIUM) @@ -74,4 +76,4 @@ class pv_rst_warm_rst_sequence extends pv_rst_sequence_base; endtask -endclass \ No newline at end of file +endclass diff --git a/src/pcrvault/uvmf_pv/uvmf_template_output/verification_ip/interface_packages/pv_write_pkg/src/pv_write_transaction_coverage.svh b/src/pcrvault/uvmf_pv/uvmf_template_output/verification_ip/interface_packages/pv_write_pkg/src/pv_write_transaction_coverage.svh index ced39224e..56d90ec39 100644 --- a/src/pcrvault/uvmf_pv/uvmf_template_output/verification_ip/interface_packages/pv_write_pkg/src/pv_write_transaction_coverage.svh +++ b/src/pcrvault/uvmf_pv/uvmf_template_output/verification_ip/interface_packages/pv_write_pkg/src/pv_write_transaction_coverage.svh @@ -28,6 +28,15 @@ //---------------------------------------------------------------------- //---------------------------------------------------------------------- // +covergroup wr_data(input logic wr_data_bit); + //option.per_instance = 1; + value: coverpoint wr_data_bit; + transition: coverpoint wr_data_bit { + bins bin01 = (0 => 1); + bins bin10 = (1 => 0); + } +endgroup + class pv_write_transaction_coverage #( string PV_WRITE_REQUESTOR = "SHA512" ) @@ -44,6 +53,7 @@ class pv_write_transaction_coverage #( T coverage_trans; // pragma uvmf custom class_item_additional begin + wr_data wr_data_bus[PV_DATA_W]; // pragma uvmf custom class_item_additional end // **************************************************************************** @@ -57,7 +67,6 @@ class pv_write_transaction_coverage #( write_offset: coverpoint coverage_trans.write_offset { illegal_bins wr_offset_12_15 = {['d12:'d15]}; } - //write_data: coverpoint coverage_trans.write_data; error: coverpoint coverage_trans.error { ignore_bins error1 = {'d1}; } @@ -90,7 +99,13 @@ class pv_write_transaction_coverage #( virtual function void write (T t); `uvm_info("COV","Received transaction",UVM_HIGH); coverage_trans = t; + + foreach(wr_data_bus[i]) wr_data_bus[i] = new(coverage_trans.write_data[i]); + foreach(wr_data_bus[i]) wr_data_bus[i].set_inst_name($sformatf("wr_data_bus[%0d]_%s",i,get_full_name())); + pv_write_transaction_cg.sample(); + foreach(wr_data_bus[i]) wr_data_bus[i].sample(); + endfunction endclass diff --git a/src/prim/config/compile.yml b/src/prim/config/compile.yml deleted file mode 100644 index ae69e7735..000000000 --- a/src/prim/config/compile.yml +++ /dev/null @@ -1,71 +0,0 @@ ---- -provides: [prim_pkg] -schema_version: 2.4.0 -targets: - rtl: - directories: [$COMPILE_ROOT/rtl] - files: - - $COMPILE_ROOT/rtl/prim_util_pkg.sv - - $COMPILE_ROOT/rtl/prim_alert_pkg.sv - - $COMPILE_ROOT/rtl/prim_subreg_pkg.sv - - $COMPILE_ROOT/rtl/prim_mubi_pkg.sv - - $COMPILE_ROOT/rtl/prim_cipher_pkg.sv - - $COMPILE_ROOT/rtl/prim_pkg.sv - tb: - directories: [$COMPILE_ROOT/rtl] - files: - - $COMPILE_ROOT/rtl/prim_util_pkg.sv - - $COMPILE_ROOT/rtl/prim_alert_pkg.sv - - $COMPILE_ROOT/rtl/prim_subreg_pkg.sv - - $COMPILE_ROOT/rtl/prim_mubi_pkg.sv - - $COMPILE_ROOT/rtl/prim_cipher_pkg.sv - - $COMPILE_ROOT/rtl/prim_pkg.sv ---- -provides: [prim] -schema_version: 2.4.0 -requires: - - libs - - lc_ctrl_pkg - - prim_pkg - - prim_generic -targets: - rtl: - directories: [$COMPILE_ROOT/rtl] - files: -# - $COMPILE_ROOT/rtl/prim_flop_macros.sv - - $COMPILE_ROOT/rtl/prim_flop_en.sv - - $COMPILE_ROOT/rtl/prim_flop_2sync.sv - - $COMPILE_ROOT/rtl/prim_lfsr.sv - - $COMPILE_ROOT/rtl/prim_mubi4_sync.sv - - $COMPILE_ROOT/rtl/prim_diff_decode.sv - - $COMPILE_ROOT/rtl/prim_sec_anchor_buf.sv - - $COMPILE_ROOT/rtl/prim_slicer.sv -# - $COMPILE_ROOT/rtl/prim_assert_dummy_macros.svh - - $COMPILE_ROOT/rtl/prim_count.sv -# - $COMPILE_ROOT/rtl/prim_assert_yosys_macros.svh - - $COMPILE_ROOT/rtl/prim_sparse_fsm_flop.sv - - $COMPILE_ROOT/rtl/prim_dom_and_2share.sv - - $COMPILE_ROOT/rtl/prim_sec_anchor_flop.sv - - $COMPILE_ROOT/rtl/prim_reg_we_check.sv - - $COMPILE_ROOT/rtl/prim_packer_fifo.sv - - $COMPILE_ROOT/rtl/prim_max_tree.sv - - $COMPILE_ROOT/rtl/prim_subreg_arb.sv - - $COMPILE_ROOT/rtl/prim_subreg.sv - - $COMPILE_ROOT/rtl/prim_intr_hw.sv - - $COMPILE_ROOT/rtl/prim_onehot_check.sv - - $COMPILE_ROOT/rtl/prim_mubi8_sync.sv - - $COMPILE_ROOT/rtl/prim_fifo_sync_cnt.sv - - $COMPILE_ROOT/rtl/prim_buf.sv - - $COMPILE_ROOT/rtl/prim_lc_sync.sv - - $COMPILE_ROOT/rtl/prim_alert_receiver.sv -# - $COMPILE_ROOT/rtl/prim_assert_standard_macros.svh - - $COMPILE_ROOT/rtl/prim_flop.sv - - $COMPILE_ROOT/rtl/prim_alert_sender.sv - - $COMPILE_ROOT/rtl/prim_fifo_sync.sv - - $COMPILE_ROOT/rtl/prim_arbiter_ppc.sv -# - $COMPILE_ROOT/rtl/prim_assert.sv -# - $COMPILE_ROOT/rtl/prim_assert_sec_cm.svh - - $COMPILE_ROOT/rtl/prim_sum_tree.sv - - $COMPILE_ROOT/rtl/prim_subreg_ext.sv - - $COMPILE_ROOT/rtl/prim_edge_detector.sv - tops: [prim] diff --git a/src/prim/config/prim.vf b/src/prim/config/prim.vf deleted file mode 100644 index e87eac6c4..000000000 --- a/src/prim/config/prim.vf +++ /dev/null @@ -1,58 +0,0 @@ -+incdir+${CALIPTRA_ROOT}/src/integration/rtl -+incdir+${CALIPTRA_ROOT}/src/libs/rtl -+incdir+${CALIPTRA_ROOT}/src/prim/rtl -+incdir+${CALIPTRA_ROOT}/src/lc_ctrl/rtl -+incdir+${CALIPTRA_ROOT}/src/prim_generic/rtl -${CALIPTRA_ROOT}/src/integration/rtl/config_defines.svh -${CALIPTRA_ROOT}/src/integration/rtl/caliptra_reg_defines.svh -${CALIPTRA_ROOT}/src/libs/rtl/caliptra_sva.svh -${CALIPTRA_ROOT}/src/libs/rtl/caliptra_macros.svh -${CALIPTRA_ROOT}/src/libs/rtl/caliptra_sram.sv -${CALIPTRA_ROOT}/src/libs/rtl/ahb_defines_pkg.sv -${CALIPTRA_ROOT}/src/libs/rtl/caliptra_ahb_srom.sv -${CALIPTRA_ROOT}/src/libs/rtl/apb_slv_sif.sv -${CALIPTRA_ROOT}/src/libs/rtl/ahb_slv_sif.sv -${CALIPTRA_ROOT}/src/libs/rtl/caliptra_icg.sv -${CALIPTRA_ROOT}/src/libs/rtl/clk_gate.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_util_pkg.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_alert_pkg.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_subreg_pkg.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_mubi_pkg.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_cipher_pkg.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_pkg.sv -${CALIPTRA_ROOT}/src/lc_ctrl/rtl/lc_ctrl_reg_pkg.sv -${CALIPTRA_ROOT}/src/lc_ctrl/rtl/lc_ctrl_state_pkg.sv -${CALIPTRA_ROOT}/src/lc_ctrl/rtl/lc_ctrl_pkg.sv -${CALIPTRA_ROOT}/src/libs/rtl/ahb_to_reg_adapter.sv -${CALIPTRA_ROOT}/src/prim_generic/rtl/prim_generic_flop.sv -${CALIPTRA_ROOT}/src/prim_generic/rtl/prim_generic_buf.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_flop_en.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_flop_2sync.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_lfsr.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_mubi4_sync.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_diff_decode.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_sec_anchor_buf.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_slicer.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_count.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_sparse_fsm_flop.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_dom_and_2share.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_sec_anchor_flop.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_reg_we_check.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_packer_fifo.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_max_tree.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_subreg_arb.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_subreg.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_intr_hw.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_onehot_check.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_mubi8_sync.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_fifo_sync_cnt.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_buf.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_lc_sync.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_alert_receiver.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_flop.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_alert_sender.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_fifo_sync.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_arbiter_ppc.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_sum_tree.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_subreg_ext.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_edge_detector.sv diff --git a/src/prim/config/prim_pkg.vf b/src/prim/config/prim_pkg.vf deleted file mode 100644 index 9cf040afb..000000000 --- a/src/prim/config/prim_pkg.vf +++ /dev/null @@ -1,8 +0,0 @@ -+incdir+${CALIPTRA_ROOT}/src/prim/rtl -${CALIPTRA_ROOT}/src/prim/rtl/prim_util_pkg.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_alert_pkg.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_subreg_pkg.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_mubi_pkg.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_cipher_pkg.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_pkg.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_pkg.sv \ No newline at end of file diff --git a/src/prim/lint/prim_arbiter.vlt b/src/prim/lint/prim_arbiter.vlt deleted file mode 100644 index 42e44b2ba..000000000 --- a/src/prim/lint/prim_arbiter.vlt +++ /dev/null @@ -1,45 +0,0 @@ -// Copyright lowRISC contributors. -// Licensed under the Apache License, Version 2.0, see LICENSE for details. -// SPDX-License-Identifier: Apache-2.0 - -`verilator_config - -// Tell the Verilator scheduler to split up these variables into -// separate pieces when it's figuring out process scheduling. This -// avoids spurious UNOPTFLAT warnings caused by the fact that the -// arrays feed into themselves (with different bits for different -// positions in the tree). -split_var -module "prim_arbiter_fixed" -var "data_tree" -split_var -module "prim_arbiter_fixed" -var "gnt_tree" -split_var -module "prim_arbiter_fixed" -var "idx_tree" -split_var -module "prim_arbiter_fixed" -var "req_tree" - -split_var -module "prim_arbiter_tree" -var "req_tree" -split_var -module "prim_arbiter_tree" -var "prio_tree" -split_var -module "prim_arbiter_tree" -var "sel_tree" -split_var -module "prim_arbiter_tree" -var "mask_tree" -split_var -module "prim_arbiter_tree" -var "idx_tree" -split_var -module "prim_arbiter_tree" -var "data_tree" - -// Waive ALWCOMBORDER warnings about the tree variables. We've got -// lines like "req_tree[Pa] = req_tree[C0] | req_tree[C1];" and it -// seems that the ALWCOMBORDER warning isn't affected by the split_var -// rules above. -lint_off -rule ALWCOMBORDER -file "*/rtl/prim_arbiter_fixed.sv" -match "*data_tree*" -lint_off -rule ALWCOMBORDER -file "*/rtl/prim_arbiter_fixed.sv" -match "*gnt_tree*" -lint_off -rule ALWCOMBORDER -file "*/rtl/prim_arbiter_fixed.sv" -match "*idx_tree*" -lint_off -rule ALWCOMBORDER -file "*/rtl/prim_arbiter_fixed.sv" -match "*req_tree*" - -lint_off -rule ALWCOMBORDER -file "*/rtl/prim_arbiter_tree.sv" -match "*req_tree*" -lint_off -rule ALWCOMBORDER -file "*/rtl/prim_arbiter_tree.sv" -match "*prio_tree*" -lint_off -rule ALWCOMBORDER -file "*/rtl/prim_arbiter_tree.sv" -match "*sel_tree*" -lint_off -rule ALWCOMBORDER -file "*/rtl/prim_arbiter_tree.sv" -match "*mask_tree*" -lint_off -rule ALWCOMBORDER -file "*/rtl/prim_arbiter_tree.sv" -match "*idx_tree*" -lint_off -rule ALWCOMBORDER -file "*/rtl/prim_arbiter_tree.sv" -match "*data_tree*" - -lint_off -rule ALWCOMBORDER -file "*/rtl/prim_arbiter_ppc.sv" -match "*ppc_out*" - -// Waive unused clk and reset signals: they're just used for -// assertions (which Verilator doesn't see) -lint_off -rule UNUSED -file "*/rtl/prim_arbiter_fixed.sv" -match "*clk_i*" -lint_off -rule UNUSED -file "*/rtl/prim_arbiter_fixed.sv" -match "*rst_ni*" diff --git a/src/prim/lint/prim_arbiter.waiver b/src/prim/lint/prim_arbiter.waiver deleted file mode 100644 index 278740cad..000000000 --- a/src/prim/lint/prim_arbiter.waiver +++ /dev/null @@ -1,13 +0,0 @@ -# Copyright lowRISC contributors. -# Licensed under the Apache License, Version 2.0, see LICENSE for details. -# SPDX-License-Identifier: Apache-2.0 -# -# waiver file for prim_arbiter - -waive -rules PARTIAL_CONST_ASSIGN -location {prim_arbiter_*.sv} -regexp {'mask.0.' is conditionally assigned a constant} \ - -comment "makes the code more readable" -waive -rules CONST_FF -location {prim_arbiter_*.sv} -regexp {Flip-flop 'mask.0.' is driven by constant} \ - -comment "makes the code more readable" - -waive -rules {HIER_BRANCH_NOT_READ INPUT_NOT_READ} -location {prim_arbiter_fixed.sv} -regexp {.*'(clk_i|rst_ni)' is not read from in module 'prim_arbiter_fixed'.*} \ - -comment "clk_ and rst_ni are only used for assertions in this module." diff --git a/src/prim/lint/prim_onehot_check.waiver b/src/prim/lint/prim_onehot_check.waiver deleted file mode 100644 index 65d5b0b33..000000000 --- a/src/prim/lint/prim_onehot_check.waiver +++ /dev/null @@ -1,11 +0,0 @@ -# Copyright lowRISC contributors. -# Licensed under the Apache License, Version 2.0, see LICENSE for details. -# SPDX-License-Identifier: Apache-2.0 -# -# waiver file for prim_onehot_check - -waive -rules {HIER_BRANCH_NOT_READ INPUT_NOT_READ} -location {prim_onehot_check.sv} -regexp {.*'(clk_i|rst_ni)' is not read from in module 'prim_onehot_check'.*} \ - -comment "clk_ and rst_ni are only used for assertions in this module." - -waive -rules {PARAM_NOT_USED} -location {prim_onehot_check.sv} -regexp {.*EnableAlertTriggerSVA.*} \ - -comment "The disable parameter is used only during DV / FPV." diff --git a/src/prim/rtl/prim_assert_sec_cm.svh b/src/prim/rtl/prim_assert_sec_cm.svh deleted file mode 100644 index b4d132bac..000000000 --- a/src/prim/rtl/prim_assert_sec_cm.svh +++ /dev/null @@ -1,65 +0,0 @@ -// Copyright lowRISC contributors. -// Licensed under the Apache License, Version 2.0, see LICENSE for details. -// SPDX-License-Identifier: Apache-2.0 - -// // Macros and helper code for security countermeasures. - -`ifndef PRIM_ASSERT_SEC_CM_SVH -`define PRIM_ASSERT_SEC_CM_SVH - -`define _SEC_CM_ALERT_MAX_CYC 30 - -// Helper macros -`define CALIPTRA_ASSERT_ERROR_TRIGGER_ALERT(NAME_, PRIM_HIER_, ALERT_, GATE_, MAX_CYCLES_, ERR_NAME_) \ - `CALIPTRA_ASSERT(FpvSecCm``NAME_``, \ - $rose(PRIM_HIER_.ERR_NAME_) && !(GATE_) \ - |-> ##[0:MAX_CYCLES_] (ALERT_.alert_p)) \ - `ifdef INC_ASSERT \ - assign PRIM_HIER_.unused_assert_connected = 1'b1; \ - `endif \ - `CALIPTRA_ASSUME_FPV(``NAME_``TriggerAfterAlertInit_S, $stable(rst_ni) == 0 |-> \ - PRIM_HIER_.ERR_NAME_ == 0 [*10]) - -`define CALIPTRA_ASSERT_ERROR_TRIGGER_ERR(NAME_, PRIM_HIER_, ERR_, GATE_, MAX_CYCLES_, ERR_NAME_, CLK_, RST_) \ - `CALIPTRA_ASSERT(FpvSecCm``NAME_``, \ - $rose(PRIM_HIER_.ERR_NAME_) && !(GATE_) \ - |-> ##[0:MAX_CYCLES_] (ERR_), CLK_, RST_) \ - `ifdef INC_ASSERT \ - assign PRIM_HIER_.unused_assert_connected = 1'b1; \ - `endif - -// macros for security countermeasures that will trigger alert -`define CALIPTRA_ASSERT_PRIM_COUNT_ERROR_TRIGGER_ALERT(NAME_, PRIM_HIER_, ALERT_, GATE_ = 0, MAX_CYCLES_ = `_SEC_CM_ALERT_MAX_CYC) \ - `CALIPTRA_ASSERT_ERROR_TRIGGER_ALERT(NAME_, PRIM_HIER_, ALERT_, GATE_, MAX_CYCLES_, err_o) - -`define CALIPTRA_ASSERT_PRIM_DOUBLE_LFSR_ERROR_TRIGGER_ALERT(NAME_, PRIM_HIER_, ALERT_, GATE_ = 0, MAX_CYCLES_ = `_SEC_CM_ALERT_MAX_CYC) \ - `CALIPTRA_ASSERT_ERROR_TRIGGER_ALERT(NAME_, PRIM_HIER_, ALERT_, GATE_, MAX_CYCLES_, err_o) - -`define CALIPTRA_ASSERT_PRIM_FSM_ERROR_TRIGGER_ALERT(NAME_, PRIM_HIER_, ALERT_, GATE_ = 0, MAX_CYCLES_ = `_SEC_CM_ALERT_MAX_CYC) \ - `CALIPTRA_ASSERT_ERROR_TRIGGER_ALERT(NAME_, PRIM_HIER_, ALERT_, GATE_, MAX_CYCLES_, unused_err_o) - -`define CALIPTRA_ASSERT_PRIM_ONEHOT_ERROR_TRIGGER_ALERT(NAME_, PRIM_HIER_, ALERT_, GATE_ = 0, MAX_CYCLES_ = `_SEC_CM_ALERT_MAX_CYC) \ - `CALIPTRA_ASSERT_ERROR_TRIGGER_ALERT(NAME_, PRIM_HIER_, ALERT_, GATE_, MAX_CYCLES_, err_o) - -`define CALIPTRA_ASSERT_PRIM_REG_WE_ONEHOT_ERROR_TRIGGER_ALERT(NAME_, REG_TOP_HIER_, ALERT_, GATE_ = 0, MAX_CYCLES_ = `_SEC_CM_ALERT_MAX_CYC) \ - `CALIPTRA_ASSERT_PRIM_ONEHOT_ERROR_TRIGGER_ALERT(NAME_, \ - REG_TOP_HIER_.u_prim_reg_we_check.u_prim_onehot_check, ALERT_, GATE_, MAX_CYCLES_) - -// macros for security countermeasures that will trigger other errors -`define CALIPTRA_ASSERT_PRIM_FSM_ERROR_TRIGGER_ERR(NAME_, PRIM_HIER_, ERR_, GATE_ = 0, MAX_CYCLES_ = 2, CLK_ = clk_i, RST_ = !rst_ni) \ - `CALIPTRA_ASSERT_ERROR_TRIGGER_ERR(NAME_, PRIM_HIER_, ERR_, GATE_, MAX_CYCLES_, unused_err_o, CLK_, RST_) - -`define CALIPTRA_ASSERT_PRIM_COUNT_ERROR_TRIGGER_ERR(NAME_, PRIM_HIER_, ERR_, GATE_ = 0, MAX_CYCLES_ = 2, CLK_ = clk_i, RST_ = !rst_ni) \ - `CALIPTRA_ASSERT_ERROR_TRIGGER_ERR(NAME_, PRIM_HIER_, ERR_, GATE_, MAX_CYCLES_, err_o, CLK_, RST_) - -`define CALIPTRA_ASSERT_PRIM_DOUBLE_LFSR_ERROR_TRIGGER_ERR(NAME_, PRIM_HIER_, ERR_, GATE_ = 0, MAX_CYCLES_ = 2, CLK_ = clk_i, RST_ = !rst_ni) \ - `CALIPTRA_ASSERT_ERROR_TRIGGER_ERR(NAME_, PRIM_HIER_, ERR_, GATE_, MAX_CYCLES_, err_o, CLK_, RST_) - -`define CALIPTRA_ASSERT_PRIM_ONEHOT_ERROR_TRIGGER_ERR(NAME_, PRIM_HIER_, ERR_, GATE_ = 0, MAX_CYCLES_ = `_SEC_CM_ALERT_MAX_CYC, CLK_ = clk_i, RST_ = !rst_ni) \ - `CALIPTRA_ASSERT_ERROR_TRIGGER_ERR(NAME_, PRIM_HIER_, ERR_, GATE_, MAX_CYCLES_, err_o, CLK_, RST_) - -`define CALIPTRA_ASSERT_PRIM_REG_WE_ONEHOT_ERROR_TRIGGER_ERR(NAME_, REG_TOP_HIER_, ERR_, GATE_ = 0, MAX_CYCLES_ = `_SEC_CM_ALERT_MAX_CYC, CLK_ = clk_i, RST_ = !rst_ni) \ - `CALIPTRA_ASSERT_PRIM_ONEHOT_ERROR_TRIGGER_ERR(NAME_, \ - REG_TOP_HIER_.u_prim_reg_we_check.u_prim_onehot_check, ERR_, GATE_, MAX_CYCLES_, CLK_, RST_) - -`endif // PRIM_ASSERT_SEC_CM_SVH diff --git a/src/prim_generic/config/compile.yml b/src/prim_generic/config/compile.yml deleted file mode 100644 index 16a806228..000000000 --- a/src/prim_generic/config/compile.yml +++ /dev/null @@ -1,10 +0,0 @@ ---- -provides: [prim_generic] -schema_version: 2.4.0 -targets: - rtl: - directories: [$COMPILE_ROOT/rtl] - files: - - $COMPILE_ROOT/rtl/prim_generic_flop_en.sv - - $COMPILE_ROOT/rtl/prim_generic_flop.sv - - $COMPILE_ROOT/rtl/prim_generic_buf.sv diff --git a/src/prim_generic/config/prim_generic.vf b/src/prim_generic/config/prim_generic.vf deleted file mode 100644 index 844abb8b8..000000000 --- a/src/prim_generic/config/prim_generic.vf +++ /dev/null @@ -1,4 +0,0 @@ -+incdir+${CALIPTRA_ROOT}/src/prim_generic/rtl -${CALIPTRA_ROOT}/src/prim_generic/rtl/prim_generic_flop_en.sv -${CALIPTRA_ROOT}/src/prim_generic/rtl/prim_generic_flop.sv -${CALIPTRA_ROOT}/src/prim_generic/rtl/prim_generic_buf.sv diff --git a/src/riscv_core/veer_el2/config/compile.yml b/src/riscv_core/veer_el2/config/compile.yml index dc78b734e..ee025269a 100755 --- a/src/riscv_core/veer_el2/config/compile.yml +++ b/src/riscv_core/veer_el2/config/compile.yml @@ -24,6 +24,8 @@ targets: rtl: directories: [$COMPILE_ROOT/rtl] files: + - $COMPILE_ROOT/rtl/pic_map_auto.h + - $COMPILE_ROOT/rtl/el2_param.vh - $COMPILE_ROOT/rtl/el2_mem.sv - $COMPILE_ROOT/rtl/el2_dma_ctrl.sv - $COMPILE_ROOT/rtl/el2_pic_ctrl.sv @@ -82,6 +84,7 @@ global: provides: [el2_veer_wrapper_tb] schema_version: 2.4.0 requires: + - caliptra_top_defines - el2_veer_pkg - el2_veer_wrapper targets: diff --git a/src/riscv_core/veer_el2/config/el2_veer_pkg.vf b/src/riscv_core/veer_el2/config/el2_veer_pkg.vf index db6fc435e..3e3824be2 100644 --- a/src/riscv_core/veer_el2/config/el2_veer_pkg.vf +++ b/src/riscv_core/veer_el2/config/el2_veer_pkg.vf @@ -1,10 +1,7 @@ +incdir+${CALIPTRA_ROOT}/src/soc_ifc/rtl -+incdir+${CALIPTRA_ROOT}/src/soc_ifc/coverage +incdir+${CALIPTRA_ROOT}/src/riscv_core/veer_el2/rtl ${CALIPTRA_ROOT}/src/soc_ifc/rtl/soc_ifc_pkg.sv ${CALIPTRA_ROOT}/src/soc_ifc/rtl/soc_ifc_reg_pkg.sv -${CALIPTRA_ROOT}/src/soc_ifc/coverage/soc_ifc_cov_if.sv -${CALIPTRA_ROOT}/src/soc_ifc/coverage/soc_ifc_cov_bind.sv ${CALIPTRA_ROOT}/src/riscv_core/veer_el2/rtl/el2_pdef.vh ${CALIPTRA_ROOT}/src/riscv_core/veer_el2/rtl/include/el2_def.sv ${CALIPTRA_ROOT}/src/riscv_core/veer_el2/rtl/common_defines.sv diff --git a/src/riscv_core/veer_el2/config/el2_veer_wrapper.vf b/src/riscv_core/veer_el2/config/el2_veer_wrapper.vf index 23603bcfb..da326a7e7 100644 --- a/src/riscv_core/veer_el2/config/el2_veer_wrapper.vf +++ b/src/riscv_core/veer_el2/config/el2_veer_wrapper.vf @@ -1,10 +1,7 @@ +incdir+${CALIPTRA_ROOT}/src/soc_ifc/rtl -+incdir+${CALIPTRA_ROOT}/src/soc_ifc/coverage +incdir+${CALIPTRA_ROOT}/src/riscv_core/veer_el2/rtl ${CALIPTRA_ROOT}/src/soc_ifc/rtl/soc_ifc_pkg.sv ${CALIPTRA_ROOT}/src/soc_ifc/rtl/soc_ifc_reg_pkg.sv -${CALIPTRA_ROOT}/src/soc_ifc/coverage/soc_ifc_cov_if.sv -${CALIPTRA_ROOT}/src/soc_ifc/coverage/soc_ifc_cov_bind.sv ${CALIPTRA_ROOT}/src/riscv_core/veer_el2/rtl/el2_pdef.vh ${CALIPTRA_ROOT}/src/riscv_core/veer_el2/rtl/include/el2_def.sv ${CALIPTRA_ROOT}/src/riscv_core/veer_el2/rtl/common_defines.sv diff --git a/src/riscv_core/veer_el2/config/el2_veer_wrapper_tb.vf b/src/riscv_core/veer_el2/config/el2_veer_wrapper_tb.vf index ab92b3fa9..146b42520 100644 --- a/src/riscv_core/veer_el2/config/el2_veer_wrapper_tb.vf +++ b/src/riscv_core/veer_el2/config/el2_veer_wrapper_tb.vf @@ -1,11 +1,11 @@ ++incdir+${CALIPTRA_ROOT}/src/integration/rtl +incdir+${CALIPTRA_ROOT}/src/soc_ifc/rtl -+incdir+${CALIPTRA_ROOT}/src/soc_ifc/coverage +incdir+${CALIPTRA_ROOT}/src/riscv_core/veer_el2/rtl +incdir+${CALIPTRA_ROOT}/src/riscv_core/veer_el2/tb +${CALIPTRA_ROOT}/src/integration/rtl/config_defines.svh +${CALIPTRA_ROOT}/src/integration/rtl/caliptra_reg_defines.svh ${CALIPTRA_ROOT}/src/soc_ifc/rtl/soc_ifc_pkg.sv ${CALIPTRA_ROOT}/src/soc_ifc/rtl/soc_ifc_reg_pkg.sv -${CALIPTRA_ROOT}/src/soc_ifc/coverage/soc_ifc_cov_if.sv -${CALIPTRA_ROOT}/src/soc_ifc/coverage/soc_ifc_cov_bind.sv ${CALIPTRA_ROOT}/src/riscv_core/veer_el2/rtl/el2_pdef.vh ${CALIPTRA_ROOT}/src/riscv_core/veer_el2/rtl/include/el2_def.sv ${CALIPTRA_ROOT}/src/riscv_core/veer_el2/rtl/common_defines.sv diff --git a/src/riscv_core/veer_el2/rtl/common_defines.sv b/src/riscv_core/veer_el2/rtl/common_defines.sv index 702abf75b..afcbaa9a1 100644 --- a/src/riscv_core/veer_el2/rtl/common_defines.sv +++ b/src/riscv_core/veer_el2/rtl/common_defines.sv @@ -157,9 +157,11 @@ `define RV_LDERR_ROLLBACK 1 `define CPU_TOP `RV_TOP.veer `define RV_EXT_DATAWIDTH 64 +`ifndef SYNTHESIS `ifndef VERILATOR `define RV_ASSERT_ON `endif +`endif `define RV_EXT_ADDRWIDTH 32 `define RV_BTB_ENABLE 1 `define RV_BTB_BTAG_FOLD 0 diff --git a/src/riscv_core/veer_el2/rtl/el2_mem.sv b/src/riscv_core/veer_el2/rtl/el2_mem.sv index 80e770c5c..605b3120f 100644 --- a/src/riscv_core/veer_el2/rtl/el2_mem.sv +++ b/src/riscv_core/veer_el2/rtl/el2_mem.sv @@ -79,7 +79,7 @@ import el2_pkg::*; output logic [pt.ICACHE_NUM_WAYS-1:0] ic_rd_hit, output logic ic_tag_perr, // Icache Tag parity error - el2_mem_if mem_export, + el2_mem_if.veer_sram_src mem_export, input logic scan_mode @@ -87,13 +87,29 @@ import el2_pkg::*; ); logic active_clk; + el2_mem_if mem_export_local (); rvoclkhdr active_cg ( .en(1'b1), .l1clk(active_clk), .* ); + assign mem_export .clk = clk; + assign mem_export_local.clk = clk; + + assign mem_export .iccm_clken = mem_export_local.iccm_clken; + assign mem_export .iccm_wren_bank = mem_export_local.iccm_wren_bank; + assign mem_export .iccm_addr_bank = mem_export_local.iccm_addr_bank; + assign mem_export .iccm_bank_wr_data = mem_export_local.iccm_bank_wr_data; + assign mem_export_local.iccm_bank_dout = mem_export. iccm_bank_dout; + + assign mem_export .dccm_clken = mem_export_local.dccm_clken; + assign mem_export .dccm_wren_bank = mem_export_local.dccm_wren_bank; + assign mem_export .dccm_addr_bank = mem_export_local.dccm_addr_bank; + assign mem_export .dccm_wr_data_bank = mem_export_local.dccm_wr_data_bank; + assign mem_export_local.dccm_bank_dout = mem_export .dccm_bank_dout; + // DCCM Instantiation if (pt.DCCM_ENABLE == 1) begin: Gen_dccm_enable el2_lsu_dccm_mem #(.pt(pt)) dccm ( .clk_override(dccm_clk_override), - .dccm_mem_export(mem_export.veer_dccm), + .dccm_mem_export(mem_export_local.veer_dccm), .* ); end else begin: Gen_dccm_disable @@ -121,7 +137,7 @@ if (pt.ICCM_ENABLE) begin : iccm .clk_override(icm_clk_override), .iccm_rw_addr(iccm_rw_addr[pt.ICCM_BITS-1:1]), .iccm_rd_data(iccm_rd_data[63:0]), - .iccm_mem_export(mem_export.veer_iccm) + .iccm_mem_export(mem_export_local.veer_iccm) ); end else begin diff --git a/src/riscv_core/veer_el2/rtl/el2_veer.sv b/src/riscv_core/veer_el2/rtl/el2_veer.sv index 56dc893c7..1ade17502 100644 --- a/src/riscv_core/veer_el2/rtl/el2_veer.sv +++ b/src/riscv_core/veer_el2/rtl/el2_veer.sv @@ -377,6 +377,12 @@ import el2_pkg::*; input logic [31:0] dmi_reg_wdata, // write data output logic [31:0] dmi_reg_rdata, + // Caliptra ECC status signals + output logic cptra_iccm_ecc_single_error, + output logic cptra_iccm_ecc_double_error, + output logic cptra_dccm_ecc_single_error, + output logic cptra_dccm_ecc_double_error, + input logic [pt.PIC_TOTAL_INT:1] extintsrc_req, input logic timer_int, input logic soft_int, @@ -394,6 +400,7 @@ import el2_pkg::*; logic ifu_pmu_instr_aligned; logic ifu_ic_error_start; logic ifu_iccm_rd_ecc_single_err; + logic cptra_iccm_rd_ecc_double_err; logic lsu_axi_awready_ahb; logic lsu_axi_wready_ahb; @@ -857,6 +864,7 @@ import el2_pkg::*; // ----------------- DEBUG END ----------------------------- assign core_rst_l = rst_l & (dbg_core_rst_l | scan_mode); + // fetch el2_ifu #(.pt(pt)) ifu ( .clk(active_l2clk), @@ -876,6 +884,8 @@ import el2_pkg::*; .* ); + assign cptra_iccm_ecc_single_error = ifu_iccm_rd_ecc_single_err; + assign cptra_iccm_ecc_double_error = cptra_iccm_rd_ecc_double_err; el2_dec #(.pt(pt)) dec ( diff --git a/src/riscv_core/veer_el2/rtl/el2_veer_wrapper.sv b/src/riscv_core/veer_el2/rtl/el2_veer_wrapper.sv index a97e7de9d..cec4d24cf 100755 --- a/src/riscv_core/veer_el2/rtl/el2_veer_wrapper.sv +++ b/src/riscv_core/veer_el2/rtl/el2_veer_wrapper.sv @@ -314,11 +314,18 @@ import soc_ifc_pkg::*; output logic [6:0] cptra_uncore_dmi_reg_addr, output logic [31:0] cptra_uncore_dmi_reg_wdata, input security_state_t cptra_security_state_Latched, + output logic cptra_dmi_reg_en_preQ, input logic [31:4] core_id, // Caliptra Memory Export Interface - el2_mem_if el2_mem_export, + el2_mem_if.veer_sram_src el2_mem_export, + + // Caliptra ECC status signals + output logic cptra_iccm_ecc_single_error, + output logic cptra_iccm_ecc_double_error, + output logic cptra_dccm_ecc_single_error, + output logic cptra_dccm_ecc_double_error, // external MPC halt/run interface input logic mpc_debug_halt_req, // Async halt request @@ -703,7 +710,6 @@ import soc_ifc_pkg::*; .mem_export(el2_mem_export), .* ); - assign el2_mem_export.clk = active_l2clk; // JTAG/DMI instance @@ -741,6 +747,7 @@ import soc_ifc_pkg::*; assign cptra_dmi_reg_en_jtag_acccess_allowed = dmi_reg_en_preQ & cptra_jtag_access_allowed; assign cptra_dmi_reg_wr_en_jtag_acccess_allowed = dmi_reg_wr_en_preQ & cptra_jtag_access_allowed; + assign cptra_dmi_reg_en_preQ = dmi_reg_en_preQ; // Driving core vs uncore enables based on the right aperture assign dmi_reg_en = cptra_uncore_tap_aperture ? '0 : cptra_dmi_reg_en_jtag_acccess_allowed; diff --git a/src/riscv_core/veer_el2/rtl/ifu/el2_ifu.sv b/src/riscv_core/veer_el2/rtl/ifu/el2_ifu.sv index d36cd68bd..ddd429b1d 100644 --- a/src/riscv_core/veer_el2/rtl/ifu/el2_ifu.sv +++ b/src/riscv_core/veer_el2/rtl/ifu/el2_ifu.sv @@ -150,6 +150,7 @@ import el2_pkg::*; input logic [77:0] iccm_rd_data_ecc, // Data + ECC read from ICCM. output logic ifu_iccm_rd_ecc_single_err, // This fetch has a single ICCM ecc error. + output logic cptra_iccm_rd_ecc_double_err, // Output added for Caliptra reporting // Perf counter sigs output logic ifu_pmu_ic_miss, // ic miss @@ -281,7 +282,7 @@ import el2_pkg::*; assign ifu_bp_inst_mask_f = 1'b1; end - + assign cptra_iccm_rd_ecc_double_err = |iccm_rd_ecc_double_err; // aligner diff --git a/src/riscv_core/veer_el2/rtl/lib/beh_lib.sv b/src/riscv_core/veer_el2/rtl/lib/beh_lib.sv index a36e86fff..a1d1c9793 100644 --- a/src/riscv_core/veer_el2/rtl/lib/beh_lib.sv +++ b/src/riscv_core/veer_el2/rtl/lib/beh_lib.sv @@ -291,7 +291,7 @@ endmodule // special power flop for predict packet // format: { LEFT, RIGHT==31 } // LEFT # of bits will be done with rvdffe; RIGHT is enabled by LEFT[LSB] & en -module rvdffppe #( parameter WIDTH=32 ) +module rvdffppe #( parameter integer WIDTH = 39 ) ( input logic [WIDTH-1:0] din, input logic clk, @@ -301,13 +301,13 @@ module rvdffppe #( parameter WIDTH=32 ) output logic [WIDTH-1:0] dout ); - localparam RIGHT = 31; - localparam LEFT = WIDTH - RIGHT; + localparam integer RIGHT = 31; + localparam integer LEFT = WIDTH - RIGHT; - localparam LMSB = WIDTH-1; - localparam LLSB = LMSB-LEFT+1; - localparam RMSB = LLSB-1; - localparam RLSB = LLSB-RIGHT; + localparam integer LMSB = WIDTH-1; + localparam integer LLSB = LMSB-LEFT+1; + localparam integer RMSB = LLSB-1; + localparam integer RLSB = LLSB-RIGHT; `ifndef RV_PHYSICAL @@ -748,7 +748,7 @@ module rvecc_decode_64 ( endmodule // rvecc_decode_64 - +`ifndef TECH_SPECIFIC_EC_RV_ICG module `TEC_RV_ICG ( input logic SE, EN, CK, @@ -773,6 +773,7 @@ module `TEC_RV_ICG assign Q = CK & en_ff; endmodule +`endif `ifndef RV_FPGA_OPTIMIZE module rvclkhdr @@ -786,7 +787,11 @@ module rvclkhdr logic SE; assign SE = 0; +`ifdef TECH_SPECIFIC_EC_RV_ICG + `USER_EC_RV_ICG clkhdr ( .*, .EN(en), .CK(clk), .Q(l1clk)); +`else `TEC_RV_ICG clkhdr ( .*, .EN(en), .CK(clk), .Q(l1clk)); +`endif endmodule // rvclkhdr `endif @@ -805,7 +810,11 @@ module rvoclkhdr `ifdef RV_FPGA_OPTIMIZE assign l1clk = clk; `else - `TEC_RV_ICG clkhdr ( .*, .EN(en), .CK(clk), .Q(l1clk)); + `ifdef TECH_SPECIFIC_EC_RV_ICG + `USER_EC_RV_ICG clkhdr ( .*, .EN(en), .CK(clk), .Q(l1clk)); + `else + `TEC_RV_ICG clkhdr ( .*, .EN(en), .CK(clk), .Q(l1clk)); + `endif `endif endmodule diff --git a/src/riscv_core/veer_el2/rtl/lib/el2_mem_if.sv b/src/riscv_core/veer_el2/rtl/lib/el2_mem_if.sv index 2f6b22a75..1d0a83723 100644 --- a/src/riscv_core/veer_el2/rtl/lib/el2_mem_if.sv +++ b/src/riscv_core/veer_el2/rtl/lib/el2_mem_if.sv @@ -85,7 +85,17 @@ modport veer_dccm ( input dccm_bank_dout ); -modport top ( +modport veer_sram_src ( + output clk, + // ICCM + output iccm_clken, iccm_wren_bank, iccm_addr_bank, iccm_bank_wr_data, + input iccm_bank_dout, + // DCCM + output dccm_clken, dccm_wren_bank, dccm_addr_bank, dccm_wr_data_bank, + input dccm_bank_dout +); + +modport veer_sram_sink ( input clk, // ICCM input iccm_clken, iccm_wren_bank, iccm_addr_bank, iccm_bank_wr_data, diff --git a/src/riscv_core/veer_el2/rtl/lsu/el2_lsu.sv b/src/riscv_core/veer_el2/rtl/lsu/el2_lsu.sv index 06bd86907..40410c100 100644 --- a/src/riscv_core/veer_el2/rtl/lsu/el2_lsu.sv +++ b/src/riscv_core/veer_el2/rtl/lsu/el2_lsu.sv @@ -174,6 +174,10 @@ import el2_pkg::*; output logic [63:0] dccm_dma_rdata, // lsu data for DMA dccm read output logic dccm_ready, // lsu ready for DMA access + // Caliptra ECC status signals + output logic cptra_dccm_ecc_single_error, + output logic cptra_dccm_ecc_double_error, + input logic scan_mode, // scan mode input logic clk, // Clock only while core active. Through one clock header. For flops with second clock header built in. Connected to ACTIVE_L2CLK. input logic active_clk, // Clock only while core active. Through two clock headers. For flops without second clock header built in. @@ -357,6 +361,9 @@ import el2_pkg::*; .* ); + assign cptra_dccm_ecc_single_error = lsu_single_ecc_error_r; + assign cptra_dccm_ecc_double_error = lsu_double_ecc_error_r; + el2_lsu_trigger #(.pt(pt)) trigger ( .store_data_m(store_data_m[31:0]), .* diff --git a/src/riscv_core/veer_el2/tb/dasm.svi b/src/riscv_core/veer_el2/tb/dasm.svi index ef7017d10..bdca6797a 100755 --- a/src/riscv_core/veer_el2/tb/dasm.svi +++ b/src/riscv_core/veer_el2/tb/dasm.svi @@ -23,7 +23,7 @@ bit[31:0] [31:0] gpr[`RV_NUM_THREADS]; // main DASM function -function string dasm(input[31:0] opcode, input[31:0] pc, input[4:0] regn, input[31:0] regv, input tid=0); +function static string dasm(input[31:0] opcode, input[31:0] pc, input[4:0] regn, input[31:0] regv, input tid=0); dasm = (opcode[1:0] == 2'b11) ? dasm32(opcode, pc, tid) : dasm16(opcode, pc, tid); if(regn) gpr[tid][regn] = regv; endfunction @@ -31,7 +31,7 @@ endfunction ///////////////// 16 bits instructions /////////////////////// -function string dasm16( input[31:0] opcode, input[31:0] pc, input tid=0); +function static string dasm16( input[31:0] opcode, input[31:0] pc, input tid=0); case(opcode[1:0]) 0: return dasm16_0(opcode, tid); 1: return dasm16_1(opcode, pc); @@ -40,7 +40,7 @@ function string dasm16( input[31:0] opcode, input[31:0] pc, input tid=0); return $sformatf(".short 0x%h", opcode[15:0]); endfunction -function string dasm16_0( input[31:0] opcode, tid); +function static string dasm16_0( input[31:0] opcode, tid); case(opcode[15:13]) 3'b000: return dasm16_ciw(opcode); 3'b001: return {"c.fld ", dasm16_cl(opcode, tid)}; @@ -53,7 +53,7 @@ function string dasm16_0( input[31:0] opcode, tid); return $sformatf(".short 0x%h", opcode[15:0]); endfunction -function string dasm16_ciw( input[31:0] opcode); +function static string dasm16_ciw( input[31:0] opcode); int imm; imm=0; if(opcode[15:0] == 0) return ".short 0"; @@ -61,7 +61,7 @@ int imm; return $sformatf("c.addi4spn %s,0x%0h", abi_reg[opcode[4:2]+8], imm); endfunction -function string dasm16_cl( input[31:0] opcode, input tid=0); +function static string dasm16_cl( input[31:0] opcode, input tid=0); int imm; imm=0; imm[5:3] = opcode[12:10]; @@ -70,7 +70,7 @@ int imm; return $sformatf(" %s,%0d(%s) [%h]", abi_reg[opcode[4:2]+8], imm, abi_reg[opcode[9:7]+8], gpr[tid][opcode[9:7]+8]+imm); endfunction -function string dasm16_1( input[31:0] opcode, input[31:0] pc); +function static string dasm16_1( input[31:0] opcode, input[31:0] pc); case(opcode[15:13]) 3'b000: return opcode[11:7]==0 ? "c.nop" : {"c.addi ",dasm16_ci(opcode)}; 3'b001: return {"c.jal ", dasm16_cj(opcode, pc)}; @@ -83,7 +83,7 @@ function string dasm16_1( input[31:0] opcode, input[31:0] pc); endcase endfunction -function string dasm16_ci( input[31:0] opcode); +function static string dasm16_ci( input[31:0] opcode); int imm; imm=0; imm[4:0] = opcode[6:2]; @@ -91,7 +91,7 @@ int imm; return $sformatf("%s,%0d", abi_reg[opcode[11:7]], imm); endfunction -function string dasm16_cj( input[31:0] opcode, input[31:0] pc); +function static string dasm16_cj( input[31:0] opcode, input[31:0] pc); bit[31:0] imm; imm=0; {imm[11],imm[4],imm[9:8],imm[10],imm[6], imm[7],imm[3:1], imm[5]} = opcode[12:2]; @@ -99,7 +99,7 @@ bit[31:0] imm; return $sformatf("0x%0h", imm+pc); endfunction -function string dasm16_cb( input[31:0] opcode, input[31:0] pc); +function static string dasm16_cb( input[31:0] opcode, input[31:0] pc); bit[31:0] imm; imm=0; {imm[8],imm[4:3]} = opcode[12:10]; @@ -108,7 +108,7 @@ bit[31:0] imm; return $sformatf("%s,0x%0h",abi_reg[opcode[9:7]+8], imm+pc); endfunction -function string dasm16_cr( input[31:0] opcode); +function static string dasm16_cr( input[31:0] opcode); bit[31:0] imm; imm = 0; @@ -128,7 +128,7 @@ bit[31:0] imm; endcase endfunction -function string dasm16_1_3( input[31:0] opcode); +function static string dasm16_1_3( input[31:0] opcode); int imm; imm=0; @@ -145,7 +145,7 @@ int imm; end endfunction -function string dasm16_2( input[31:0] opcode, input tid=0); +function static string dasm16_2( input[31:0] opcode, input tid=0); case(opcode[15:13]) 3'b000: return {"c.slli ", dasm16_ci(opcode)}; 3'b001: return {"c.fldsp ", dasm16_cls(opcode,1,tid)}; @@ -167,7 +167,7 @@ function string dasm16_2( input[31:0] opcode, input tid=0); endfunction -function string dasm16_cls( input[31:0] opcode, input sh1=0, tid=0); +function static string dasm16_cls( input[31:0] opcode, input sh1=0, tid=0); bit[31:0] imm; imm=0; if(sh1) {imm[4:3],imm[8:6]} = opcode[6:2]; @@ -176,7 +176,7 @@ bit[31:0] imm; return $sformatf("%s,0x%0h [%h]", abi_reg[opcode[11:7]], imm, gpr[tid][2]+imm); endfunction -function string dasm16_css( input[31:0] opcode, input sh1=0, tid=0); +function static string dasm16_css( input[31:0] opcode, input sh1=0, tid=0); bit[31:0] imm; imm=0; if(sh1) {imm[5:3],imm[8:6]} = opcode[12:7]; @@ -186,7 +186,7 @@ endfunction ///////////////// 32 bit instructions /////////////////////// -function string dasm32( input[31:0] opcode, input[31:0] pc, input tid=0); +function static string dasm32( input[31:0] opcode, input[31:0] pc, input tid=0); case(opcode[6:0]) 7'b0110111: return {"lui ", dasm32_u(opcode)}; 7'b0010111: return {"auipc ", dasm32_u(opcode)}; @@ -205,14 +205,14 @@ function string dasm32( input[31:0] opcode, input[31:0] pc, input tid=0); return $sformatf(".long 0x%h", opcode); endfunction -function string dasm32_u( input[31:0] opcode); +function static string dasm32_u( input[31:0] opcode); bit[31:0] imm; imm=0; imm[31:12] = opcode[31:12]; return $sformatf("%s,0x%0h", abi_reg[opcode[11:7]], imm); endfunction -function string dasm32_j( input[31:0] opcode, input[31:0] pc); +function static string dasm32_j( input[31:0] opcode, input[31:0] pc); int imm; imm=0; {imm[20], imm[10:1], imm[11], imm[19:12]} = opcode[31:12]; @@ -220,7 +220,7 @@ int imm; return $sformatf("%s,0x%0h",abi_reg[opcode[11:7]], imm+pc); endfunction -function string dasm32_jr( input[31:0] opcode, input[31:0] pc); +function static string dasm32_jr( input[31:0] opcode, input[31:0] pc); int imm; imm=0; imm[11:1] = opcode[31:19]; @@ -228,7 +228,7 @@ int imm; return $sformatf("%s,%s,0x%0h",abi_reg[opcode[11:7]], abi_reg[opcode[19:15]], imm+pc); endfunction -function string dasm32_b( input[31:0] opcode, input[31:0] pc); +function static string dasm32_b( input[31:0] opcode, input[31:0] pc); int imm; string mn; imm=0; @@ -247,7 +247,7 @@ string mn; return $sformatf("%s%s,%s,0x%0h", mn, abi_reg[opcode[19:15]], abi_reg[opcode[24:20]], imm+pc); endfunction -function string dasm32_l( input[31:0] opcode, input tid=0); +function static string dasm32_l( input[31:0] opcode, input tid=0); int imm; string mn; imm=0; @@ -264,7 +264,7 @@ string mn; return $sformatf("%s%s,%0d(%s) [%h]", mn, abi_reg[opcode[11:7]], imm, abi_reg[opcode[19:15]], imm+gpr[tid][opcode[19:15]]); endfunction -function string dasm32_s( input[31:0] opcode, input tid=0); +function static string dasm32_s( input[31:0] opcode, input tid=0); int imm; string mn; imm=0; @@ -280,7 +280,7 @@ string mn; return $sformatf("%s%s,%0d(%s) [%h]", mn, abi_reg[opcode[24:20]], imm, abi_reg[opcode[19:15]], imm+gpr[tid][opcode[19:15]]); endfunction -function string dasm32_ai( input[31:0] opcode); +function static string dasm32_ai( input[31:0] opcode); int imm; string mn; imm=0; @@ -299,13 +299,13 @@ endcase return $sformatf("%s%s,%s,%0d", mn, abi_reg[opcode[11:7]], abi_reg[opcode[19:15]], imm); endfunction -function string dasm32_si( input[31:0] opcode); +function static string dasm32_si( input[31:0] opcode); int imm; string mn; imm = opcode[24:20]; case(opcode[14:12]) 1: mn = "slli"; - 5: mn = opcode[30] ? "srli": "srai"; + 5: mn = opcode[30] ? "srai": "srli"; endcase return $sformatf("%s %s,%s,%0d", mn, abi_reg[opcode[11:7]], abi_reg[opcode[19:15]], imm); @@ -313,7 +313,7 @@ endfunction -function string dasm32_ar( input[31:0] opcode); +function static string dasm32_ar( input[31:0] opcode); string mn; if(opcode[25]) case(opcode[14:12]) @@ -340,11 +340,11 @@ string mn; return $sformatf("%s%s,%s,%s", mn, abi_reg[opcode[11:7]], abi_reg[opcode[19:15]], abi_reg[opcode[24:20]]); endfunction -function string dasm32_fence( input[31:0] opcode); +function static string dasm32_fence( input[31:0] opcode); return opcode[12] ? ".i" : ""; endfunction -function string dasm32_e(input[31:0] opcode); +function static string dasm32_e(input[31:0] opcode); if(opcode[31:7] == 0) return "ecall"; else if({opcode[31:21],opcode [19:7]} == 0) return "ebreak"; else @@ -360,7 +360,7 @@ function string dasm32_e(input[31:0] opcode); endfunction -function string dasm32_csr(input[31:0] opcode, input im=0); +function static string dasm32_csr(input[31:0] opcode, input im=0); bit[11:0] csr; csr = opcode[31:20]; if(im) begin @@ -373,7 +373,7 @@ bit[11:0] csr; endfunction //atomics -function string dasm32_a(input[31:0] opcode, input tid=0); +function static string dasm32_a(input[31:0] opcode, input tid=0); case(opcode[31:27]) 'b00010: return $sformatf("lr.w %s,(%s) [%h]", abi_reg[opcode[11:7]], abi_reg[opcode[19:15]], gpr[tid][opcode[19:15]]); 'b00011: return $sformatf("sc.w %s,%s,(%s) [%h]", abi_reg[opcode[11:7]], abi_reg[opcode[24:20]], abi_reg[opcode[19:15]], gpr[tid][opcode[19:15]]); @@ -390,6 +390,6 @@ function string dasm32_a(input[31:0] opcode, input tid=0); return $sformatf(".long 0x%h", opcode); endfunction -function string dasm32_amo( input[31:0] opcode, input tid=0); +function static string dasm32_amo( input[31:0] opcode, input tid=0); return $sformatf(" %s,%s,(%s) [%h]", abi_reg[opcode[11:7]], abi_reg[opcode[24:20]], abi_reg[opcode[19:15]], gpr[tid][opcode[19:15]]); endfunction diff --git a/src/sha256/config/compile.yml b/src/sha256/config/compile.yml index a753b68fc..03ecae0e0 100755 --- a/src/sha256/config/compile.yml +++ b/src/sha256/config/compile.yml @@ -8,9 +8,9 @@ targets: directories: [$COMPILE_ROOT/rtl] files: - $COMPILE_ROOT/rtl/sha256_reg_pkg.sv + - $COMPILE_ROOT/rtl/sha256_params_pkg.sv - $COMPILE_ROOT/rtl/sha256_ctrl.sv - $COMPILE_ROOT/rtl/sha256.sv - - $COMPILE_ROOT/rtl/sha256_param.sv - $COMPILE_ROOT/rtl/sha256_core.v - $COMPILE_ROOT/rtl/sha256_k_constants.v - $COMPILE_ROOT/rtl/sha256_w_mem.v @@ -28,6 +28,7 @@ provides: [sha256_ctrl_tb] schema_version: 2.4.0 requires: - sha256_ctrl + - sha256_coverage targets: tb: directories: @@ -36,11 +37,24 @@ targets: - $COMPILE_ROOT/tb/sha256_ctrl_tb.sv tops: [sha256_ctrl_tb] --- +provides: [sha256_coverage] +schema_version: 2.4.0 +requires: + - sha256_ctrl +targets: + tb: + directories: + - $COMPILE_ROOT/coverage + files: + - $COMPILE_ROOT/coverage/sha256_ctrl_cov_if.sv + - $COMPILE_ROOT/coverage/sha256_ctrl_cov_bind.sv +--- provides: [sha256_random_test] schema_version: 2.4.0 requires: - sha256_ctrl - caliptra_top_defines + - sha256_coverage targets: tb: directories: diff --git a/src/sha256/config/sha256_coverage.vf b/src/sha256/config/sha256_coverage.vf new file mode 100644 index 000000000..d85e65af0 --- /dev/null +++ b/src/sha256/config/sha256_coverage.vf @@ -0,0 +1,26 @@ ++incdir+${CALIPTRA_ROOT}/src/integration/rtl ++incdir+${CALIPTRA_ROOT}/src/libs/rtl ++incdir+${CALIPTRA_ROOT}/src/sha256/coverage ++incdir+${CALIPTRA_ROOT}/src/sha256/rtl +${CALIPTRA_ROOT}/src/integration/rtl/config_defines.svh +${CALIPTRA_ROOT}/src/integration/rtl/caliptra_reg_defines.svh +${CALIPTRA_ROOT}/src/libs/rtl/caliptra_sva.svh +${CALIPTRA_ROOT}/src/libs/rtl/caliptra_macros.svh +${CALIPTRA_ROOT}/src/libs/rtl/caliptra_sram.sv +${CALIPTRA_ROOT}/src/libs/rtl/ahb_defines_pkg.sv +${CALIPTRA_ROOT}/src/libs/rtl/caliptra_ahb_srom.sv +${CALIPTRA_ROOT}/src/libs/rtl/apb_slv_sif.sv +${CALIPTRA_ROOT}/src/libs/rtl/ahb_slv_sif.sv +${CALIPTRA_ROOT}/src/libs/rtl/caliptra_icg.sv +${CALIPTRA_ROOT}/src/libs/rtl/clk_gate.sv +${CALIPTRA_ROOT}/src/sha256/coverage/sha256_ctrl_cov_if.sv +${CALIPTRA_ROOT}/src/sha256/coverage/sha256_ctrl_cov_bind.sv +${CALIPTRA_ROOT}/src/libs/rtl/ahb_to_reg_adapter.sv +${CALIPTRA_ROOT}/src/sha256/rtl/sha256_reg_pkg.sv +${CALIPTRA_ROOT}/src/sha256/rtl/sha256_params_pkg.sv +${CALIPTRA_ROOT}/src/sha256/rtl/sha256_ctrl.sv +${CALIPTRA_ROOT}/src/sha256/rtl/sha256.sv +${CALIPTRA_ROOT}/src/sha256/rtl/sha256_core.v +${CALIPTRA_ROOT}/src/sha256/rtl/sha256_k_constants.v +${CALIPTRA_ROOT}/src/sha256/rtl/sha256_w_mem.v +${CALIPTRA_ROOT}/src/sha256/rtl/sha256_reg.sv \ No newline at end of file diff --git a/src/sha256/config/sha256_ctrl.vf b/src/sha256/config/sha256_ctrl.vf index e64586dd5..1a53cf1eb 100644 --- a/src/sha256/config/sha256_ctrl.vf +++ b/src/sha256/config/sha256_ctrl.vf @@ -12,11 +12,12 @@ ${CALIPTRA_ROOT}/src/libs/rtl/apb_slv_sif.sv ${CALIPTRA_ROOT}/src/libs/rtl/ahb_slv_sif.sv ${CALIPTRA_ROOT}/src/libs/rtl/caliptra_icg.sv ${CALIPTRA_ROOT}/src/libs/rtl/clk_gate.sv +${CALIPTRA_ROOT}/src/libs/rtl/caliptra_2ff_sync.sv ${CALIPTRA_ROOT}/src/libs/rtl/ahb_to_reg_adapter.sv ${CALIPTRA_ROOT}/src/sha256/rtl/sha256_reg_pkg.sv +${CALIPTRA_ROOT}/src/sha256/rtl/sha256_params_pkg.sv ${CALIPTRA_ROOT}/src/sha256/rtl/sha256_ctrl.sv ${CALIPTRA_ROOT}/src/sha256/rtl/sha256.sv -${CALIPTRA_ROOT}/src/sha256/rtl/sha256_param.sv ${CALIPTRA_ROOT}/src/sha256/rtl/sha256_core.v ${CALIPTRA_ROOT}/src/sha256/rtl/sha256_k_constants.v ${CALIPTRA_ROOT}/src/sha256/rtl/sha256_w_mem.v diff --git a/src/sha256/config/sha256_ctrl_tb.vf b/src/sha256/config/sha256_ctrl_tb.vf index af937e6f6..7889eaad5 100644 --- a/src/sha256/config/sha256_ctrl_tb.vf +++ b/src/sha256/config/sha256_ctrl_tb.vf @@ -1,5 +1,6 @@ +incdir+${CALIPTRA_ROOT}/src/integration/rtl +incdir+${CALIPTRA_ROOT}/src/libs/rtl ++incdir+${CALIPTRA_ROOT}/src/sha256/coverage +incdir+${CALIPTRA_ROOT}/src/sha256/tb +incdir+${CALIPTRA_ROOT}/src/sha256/rtl ${CALIPTRA_ROOT}/src/integration/rtl/config_defines.svh @@ -13,12 +14,15 @@ ${CALIPTRA_ROOT}/src/libs/rtl/apb_slv_sif.sv ${CALIPTRA_ROOT}/src/libs/rtl/ahb_slv_sif.sv ${CALIPTRA_ROOT}/src/libs/rtl/caliptra_icg.sv ${CALIPTRA_ROOT}/src/libs/rtl/clk_gate.sv +${CALIPTRA_ROOT}/src/libs/rtl/caliptra_2ff_sync.sv +${CALIPTRA_ROOT}/src/sha256/coverage/sha256_ctrl_cov_if.sv +${CALIPTRA_ROOT}/src/sha256/coverage/sha256_ctrl_cov_bind.sv ${CALIPTRA_ROOT}/src/sha256/tb/sha256_ctrl_tb.sv ${CALIPTRA_ROOT}/src/libs/rtl/ahb_to_reg_adapter.sv ${CALIPTRA_ROOT}/src/sha256/rtl/sha256_reg_pkg.sv +${CALIPTRA_ROOT}/src/sha256/rtl/sha256_params_pkg.sv ${CALIPTRA_ROOT}/src/sha256/rtl/sha256_ctrl.sv ${CALIPTRA_ROOT}/src/sha256/rtl/sha256.sv -${CALIPTRA_ROOT}/src/sha256/rtl/sha256_param.sv ${CALIPTRA_ROOT}/src/sha256/rtl/sha256_core.v ${CALIPTRA_ROOT}/src/sha256/rtl/sha256_k_constants.v ${CALIPTRA_ROOT}/src/sha256/rtl/sha256_w_mem.v diff --git a/src/sha256/config/sha256_random_test.vf b/src/sha256/config/sha256_random_test.vf index b8665fcb4..1d5ed66c8 100644 --- a/src/sha256/config/sha256_random_test.vf +++ b/src/sha256/config/sha256_random_test.vf @@ -1,5 +1,6 @@ +incdir+${CALIPTRA_ROOT}/src/integration/rtl +incdir+${CALIPTRA_ROOT}/src/libs/rtl ++incdir+${CALIPTRA_ROOT}/src/sha256/coverage +incdir+${CALIPTRA_ROOT}/src/sha256/tb +incdir+${CALIPTRA_ROOT}/src/sha256/rtl ${CALIPTRA_ROOT}/src/integration/rtl/config_defines.svh @@ -13,12 +14,15 @@ ${CALIPTRA_ROOT}/src/libs/rtl/apb_slv_sif.sv ${CALIPTRA_ROOT}/src/libs/rtl/ahb_slv_sif.sv ${CALIPTRA_ROOT}/src/libs/rtl/caliptra_icg.sv ${CALIPTRA_ROOT}/src/libs/rtl/clk_gate.sv +${CALIPTRA_ROOT}/src/libs/rtl/caliptra_2ff_sync.sv +${CALIPTRA_ROOT}/src/sha256/coverage/sha256_ctrl_cov_if.sv +${CALIPTRA_ROOT}/src/sha256/coverage/sha256_ctrl_cov_bind.sv ${CALIPTRA_ROOT}/src/sha256/tb/sha256_random_test.sv ${CALIPTRA_ROOT}/src/libs/rtl/ahb_to_reg_adapter.sv ${CALIPTRA_ROOT}/src/sha256/rtl/sha256_reg_pkg.sv +${CALIPTRA_ROOT}/src/sha256/rtl/sha256_params_pkg.sv ${CALIPTRA_ROOT}/src/sha256/rtl/sha256_ctrl.sv ${CALIPTRA_ROOT}/src/sha256/rtl/sha256.sv -${CALIPTRA_ROOT}/src/sha256/rtl/sha256_param.sv ${CALIPTRA_ROOT}/src/sha256/rtl/sha256_core.v ${CALIPTRA_ROOT}/src/sha256/rtl/sha256_k_constants.v ${CALIPTRA_ROOT}/src/sha256/rtl/sha256_w_mem.v diff --git a/src/sha256/coverage/sha256_ctrl_cov_bind.sv b/src/sha256/coverage/sha256_ctrl_cov_bind.sv new file mode 100644 index 000000000..77ffe590d --- /dev/null +++ b/src/sha256/coverage/sha256_ctrl_cov_bind.sv @@ -0,0 +1,20 @@ +// SPDX-License-Identifier: Apache-2.0 +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + + +module sha256_ctrl_cov_bind; + `ifdef FCOV + bind sha256_ctrl sha256_ctrl_cov_if i_sha256_ctrl_cov_if(.*); + `endif +endmodule diff --git a/src/sha256/coverage/sha256_ctrl_cov_if.sv b/src/sha256/coverage/sha256_ctrl_cov_if.sv new file mode 100644 index 000000000..5528ca767 --- /dev/null +++ b/src/sha256/coverage/sha256_ctrl_cov_if.sv @@ -0,0 +1,70 @@ +// SPDX-License-Identifier: Apache-2.0 +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +`ifndef VERILATOR + +interface sha256_ctrl_cov_if + ( + input logic clk, + input logic reset_n, + input logic cptra_pwrgood + +); + + logic init; + logic next; + logic mode; + logic zeroize; + logic ready; + logic valid; + + + logic [1 : 0] hash_cmd; + + assign init = sha256_ctrl.sha256_inst.init_reg; + assign next = sha256_ctrl.sha256_inst.next_reg; + assign mode = sha256_ctrl.sha256_inst.mode_reg; + assign zeroize = sha256_ctrl.sha256_inst.zeroize_reg; + assign ready = sha256_ctrl.sha256_inst.ready_reg; + assign valid = sha256_ctrl.sha256_inst.digest_valid_reg; + + assign hash_cmd = {next, init}; + + covergroup sha256_ctrl_cov_grp @(posedge clk); + reset_cp: coverpoint reset_n; + cptra_pwrgood_cp: coverpoint cptra_pwrgood; + + init_cp: coverpoint init; + next_cp: coverpoint next; + mode_cp: coverpoint mode; + zeroize_cp: coverpoint zeroize; + ready_cp: coverpoint ready; + valid_cp: coverpoint valid; + + hash_cmd_cp: coverpoint hash_cmd {bins cmd[] = (0, 0 => 1, 2 => 0, 0);} + + init_ready_cp: cross ready, init; + next_ready_cp: cross ready, next; + zeroize_ready_cp: cross ready, zeroize; + mode_ready_cp: cross ready, mode; + zeroize_init_cp: cross zeroize, init; + zeroize_next_cp: cross zeroize, next; + + endgroup + + sha256_ctrl_cov_grp sha256_ctrl_cov_grp1 = new(); + +endinterface + +`endif \ No newline at end of file diff --git a/src/sha256/rtl/sha256.sv b/src/sha256/rtl/sha256.sv index 0baca4150..991a6d089 100644 --- a/src/sha256/rtl/sha256.sv +++ b/src/sha256/rtl/sha256.sv @@ -2,7 +2,7 @@ // // Updated by Caliptra team to modify data access width // -// sha256.v +// sha256.sv // -------- // Top level wrapper for the SHA-256 hash function providing // a simple memory like interface with 32 bit data access. @@ -41,6 +41,7 @@ module sha256 import sha256_reg_pkg::*; + import sha256_params_pkg::*; #( parameter ADDR_WIDTH = 32, parameter DATA_WIDTH = 32 @@ -63,14 +64,10 @@ module sha256 // Interrupts output wire error_intr, - output wire notif_intr + output wire notif_intr, + input logic debugUnlock_or_scan_mode_switch ); - //---------------------------------------------------------------- - // Internal constant and parameter definitions. - //---------------------------------------------------------------- - `include "sha256_param.sv" - //---------------------------------------------------------------- // Registers including update variables and write enable. //---------------------------------------------------------------- @@ -171,7 +168,7 @@ module sha256 init_reg = hwif_out.SHA256_CTRL.INIT.value; next_reg = hwif_out.SHA256_CTRL.NEXT.value; mode_reg = hwif_out.SHA256_CTRL.MODE.value; - zeroize_reg = hwif_out.SHA256_CTRL.ZEROIZE.value; + zeroize_reg = hwif_out.SHA256_CTRL.ZEROIZE.value || debugUnlock_or_scan_mode_switch; hwif_in.SHA256_STATUS.READY.next = ready_reg; hwif_in.SHA256_STATUS.VALID.next = digest_valid_reg; diff --git a/src/sha256/rtl/sha256_ctrl.sv b/src/sha256/rtl/sha256_ctrl.sv index 57a09de6b..1932b70d2 100644 --- a/src/sha256/rtl/sha256_ctrl.sv +++ b/src/sha256/rtl/sha256_ctrl.sv @@ -46,7 +46,8 @@ module sha256_ctrl #( // Interrupt output logic error_intr, - output logic notif_intr + output logic notif_intr, + input logic debugUnlock_or_scan_mode_switch ); //---------------------------------------------------------------- @@ -73,7 +74,8 @@ module sha256_ctrl #( .read_data(sha256_read_data), .err(sha256_err), .error_intr(error_intr), - .notif_intr(notif_intr) + .notif_intr(notif_intr), + .debugUnlock_or_scan_mode_switch(debugUnlock_or_scan_mode_switch) ); diff --git a/src/sha256/rtl/sha256_param.sv b/src/sha256/rtl/sha256_params_pkg.sv similarity index 50% rename from src/sha256/rtl/sha256_param.sv rename to src/sha256/rtl/sha256_params_pkg.sv index 8c567d4db..00c36b596 100644 --- a/src/sha256/rtl/sha256_param.sv +++ b/src/sha256/rtl/sha256_params_pkg.sv @@ -12,31 +12,9 @@ // See the License for the specific language governing permissions and // limitations under the License. // - //---------------------------------------------------------------- - // Internal constant and parameter definitions. - //---------------------------------------------------------------- - localparam SHA256_ADDR_NAME0 = 32'h00000000; - localparam SHA256_ADDR_NAME1 = 32'h00000004; - localparam SHA256_ADDR_VERSION0 = 32'h00000008; - localparam SHA256_ADDR_VERSION1 = 32'h0000000c; - - localparam SHA256_ADDR_CTRL = 32'h00000010; - localparam SHA256_CTRL_INIT_BIT = 0; - localparam SHA256_CTRL_NEXT_BIT = 1; - localparam SHA256_CTRL_MODE_BIT = 2; - - localparam SHA256_ADDR_STATUS = 32'h00000018; - //localparam STATUS_READY_BIT = 0; - //localparam STATUS_VALID_BIT = 1; - - localparam SHA256_ADDR_BLOCK_START = 32'h00000080; - localparam SHA256_ADDR_BLOCK_END = 32'h000000bf; - - localparam SHA256_ADDR_DIGEST_START = 32'h00000100; - localparam SHA256_ADDR_DIGEST_END = 32'h0000011f; +// - localparam SHA256_ADDR_INTR_START = 32'h00000800; - localparam SHA256_ADDR_INTR_END = 32'h00000BFC; +package sha256_params_pkg; localparam SHA256_CORE_NAME0 = 32'h61327368; // "sha2" localparam SHA256_CORE_NAME1 = 32'h35362d32; // "-256" @@ -46,6 +24,7 @@ localparam SHA256_MODE_SHA_224 = 1'h0; localparam SHA256_MODE_SHA_256 = 1'h1; +endpackage //====================================================================== -// EOF sha256_param.sv +// EOF sha256_params_pkg.sv //====================================================================== diff --git a/src/sha256/rtl/sha256_reg_uvm.sv b/src/sha256/rtl/sha256_reg_uvm.sv index 350815f38..c9063ea10 100644 --- a/src/sha256/rtl/sha256_reg_uvm.sv +++ b/src/sha256/rtl/sha256_reg_uvm.sv @@ -3,45 +3,91 @@ package sha256_reg_uvm; `include "uvm_macros.svh" import uvm_pkg::*; - + `include "sha256_reg_covergroups.svh" // Reg - sha256_reg::SHA256_NAME class sha256_reg__SHA256_NAME extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + sha256_reg__SHA256_NAME_bit_cg NAME_bit_cg[32]; + sha256_reg__SHA256_NAME_fld_cg fld_cg; rand uvm_reg_field NAME; function new(string name = "sha256_reg__SHA256_NAME"); - super.new(name, 32, UVM_NO_COVERAGE); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); virtual function void build(); this.NAME = new("NAME"); this.NAME.configure(this, 32, 0, "RO", 1, 'h0, 0, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(NAME_bit_cg[bt]) NAME_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); endfunction : build endclass : sha256_reg__SHA256_NAME // Reg - sha256_reg::SHA256_VERSION class sha256_reg__SHA256_VERSION extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + sha256_reg__SHA256_VERSION_bit_cg VERSION_bit_cg[32]; + sha256_reg__SHA256_VERSION_fld_cg fld_cg; rand uvm_reg_field VERSION; function new(string name = "sha256_reg__SHA256_VERSION"); - super.new(name, 32, UVM_NO_COVERAGE); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); virtual function void build(); this.VERSION = new("VERSION"); this.VERSION.configure(this, 32, 0, "RO", 1, 'h0, 0, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(VERSION_bit_cg[bt]) VERSION_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); endfunction : build endclass : sha256_reg__SHA256_VERSION // Reg - sha256_reg::SHA256_CTRL class sha256_reg__SHA256_CTRL extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + sha256_reg__SHA256_CTRL_bit_cg INIT_bit_cg[1]; + sha256_reg__SHA256_CTRL_bit_cg NEXT_bit_cg[1]; + sha256_reg__SHA256_CTRL_bit_cg MODE_bit_cg[1]; + sha256_reg__SHA256_CTRL_bit_cg ZEROIZE_bit_cg[1]; + sha256_reg__SHA256_CTRL_fld_cg fld_cg; rand uvm_reg_field INIT; rand uvm_reg_field NEXT; rand uvm_reg_field MODE; rand uvm_reg_field ZEROIZE; function new(string name = "sha256_reg__SHA256_CTRL"); - super.new(name, 32, UVM_NO_COVERAGE); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); virtual function void build(); this.INIT = new("INIT"); @@ -52,81 +98,171 @@ package sha256_reg_uvm; this.MODE.configure(this, 1, 2, "WO", 0, 'h1, 1, 1, 0); this.ZEROIZE = new("ZEROIZE"); this.ZEROIZE.configure(this, 1, 3, "WO", 0, 'h0, 1, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(INIT_bit_cg[bt]) INIT_bit_cg[bt] = new(); + foreach(NEXT_bit_cg[bt]) NEXT_bit_cg[bt] = new(); + foreach(MODE_bit_cg[bt]) MODE_bit_cg[bt] = new(); + foreach(ZEROIZE_bit_cg[bt]) ZEROIZE_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); endfunction : build endclass : sha256_reg__SHA256_CTRL // Reg - sha256_reg::SHA256_STATUS class sha256_reg__SHA256_STATUS extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + sha256_reg__SHA256_STATUS_bit_cg READY_bit_cg[1]; + sha256_reg__SHA256_STATUS_bit_cg VALID_bit_cg[1]; + sha256_reg__SHA256_STATUS_fld_cg fld_cg; rand uvm_reg_field READY; rand uvm_reg_field VALID; function new(string name = "sha256_reg__SHA256_STATUS"); - super.new(name, 32, UVM_NO_COVERAGE); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); virtual function void build(); this.READY = new("READY"); this.READY.configure(this, 1, 0, "RO", 1, 'h0, 1, 1, 0); this.VALID = new("VALID"); this.VALID.configure(this, 1, 1, "RO", 1, 'h0, 1, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(READY_bit_cg[bt]) READY_bit_cg[bt] = new(); + foreach(VALID_bit_cg[bt]) VALID_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); endfunction : build endclass : sha256_reg__SHA256_STATUS // Reg - sha256_reg::SHA256_BLOCK class sha256_reg__SHA256_BLOCK extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + sha256_reg__SHA256_BLOCK_bit_cg BLOCK_bit_cg[32]; + sha256_reg__SHA256_BLOCK_fld_cg fld_cg; rand uvm_reg_field BLOCK; function new(string name = "sha256_reg__SHA256_BLOCK"); - super.new(name, 32, UVM_NO_COVERAGE); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); virtual function void build(); this.BLOCK = new("BLOCK"); this.BLOCK.configure(this, 32, 0, "WO", 1, 'h0, 1, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(BLOCK_bit_cg[bt]) BLOCK_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); endfunction : build endclass : sha256_reg__SHA256_BLOCK // Reg - sha256_reg::SHA256_DIGEST class sha256_reg__SHA256_DIGEST extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + sha256_reg__SHA256_DIGEST_bit_cg DIGEST_bit_cg[32]; + sha256_reg__SHA256_DIGEST_fld_cg fld_cg; rand uvm_reg_field DIGEST; function new(string name = "sha256_reg__SHA256_DIGEST"); - super.new(name, 32, UVM_NO_COVERAGE); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); virtual function void build(); this.DIGEST = new("DIGEST"); this.DIGEST.configure(this, 32, 0, "RO", 1, 'h0, 1, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(DIGEST_bit_cg[bt]) DIGEST_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); endfunction : build endclass : sha256_reg__SHA256_DIGEST // Reg - sha256_reg::global_intr_en_t class sha256_reg__global_intr_en_t extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + sha256_reg__global_intr_en_t_bit_cg error_en_bit_cg[1]; + sha256_reg__global_intr_en_t_bit_cg notif_en_bit_cg[1]; + sha256_reg__global_intr_en_t_fld_cg fld_cg; rand uvm_reg_field error_en; rand uvm_reg_field notif_en; function new(string name = "sha256_reg__global_intr_en_t"); - super.new(name, 32, UVM_NO_COVERAGE); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); virtual function void build(); this.error_en = new("error_en"); this.error_en.configure(this, 1, 0, "RW", 0, 'h0, 1, 1, 0); this.notif_en = new("notif_en"); this.notif_en.configure(this, 1, 1, "RW", 0, 'h0, 1, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(error_en_bit_cg[bt]) error_en_bit_cg[bt] = new(); + foreach(notif_en_bit_cg[bt]) notif_en_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); endfunction : build endclass : sha256_reg__global_intr_en_t // Reg - sha256_reg::error_intr_en_t class sha256_reg__error_intr_en_t extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + sha256_reg__error_intr_en_t_bit_cg error0_en_bit_cg[1]; + sha256_reg__error_intr_en_t_bit_cg error1_en_bit_cg[1]; + sha256_reg__error_intr_en_t_bit_cg error2_en_bit_cg[1]; + sha256_reg__error_intr_en_t_bit_cg error3_en_bit_cg[1]; + sha256_reg__error_intr_en_t_fld_cg fld_cg; rand uvm_reg_field error0_en; rand uvm_reg_field error1_en; rand uvm_reg_field error2_en; rand uvm_reg_field error3_en; function new(string name = "sha256_reg__error_intr_en_t"); - super.new(name, 32, UVM_NO_COVERAGE); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); virtual function void build(); this.error0_en = new("error0_en"); @@ -137,61 +273,131 @@ package sha256_reg_uvm; this.error2_en.configure(this, 1, 2, "RW", 0, 'h0, 1, 1, 0); this.error3_en = new("error3_en"); this.error3_en.configure(this, 1, 3, "RW", 0, 'h0, 1, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(error0_en_bit_cg[bt]) error0_en_bit_cg[bt] = new(); + foreach(error1_en_bit_cg[bt]) error1_en_bit_cg[bt] = new(); + foreach(error2_en_bit_cg[bt]) error2_en_bit_cg[bt] = new(); + foreach(error3_en_bit_cg[bt]) error3_en_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); endfunction : build endclass : sha256_reg__error_intr_en_t // Reg - sha256_reg::notif_intr_en_t class sha256_reg__notif_intr_en_t extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + sha256_reg__notif_intr_en_t_bit_cg notif_cmd_done_en_bit_cg[1]; + sha256_reg__notif_intr_en_t_fld_cg fld_cg; rand uvm_reg_field notif_cmd_done_en; function new(string name = "sha256_reg__notif_intr_en_t"); - super.new(name, 32, UVM_NO_COVERAGE); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); virtual function void build(); this.notif_cmd_done_en = new("notif_cmd_done_en"); this.notif_cmd_done_en.configure(this, 1, 0, "RW", 0, 'h0, 1, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(notif_cmd_done_en_bit_cg[bt]) notif_cmd_done_en_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); endfunction : build endclass : sha256_reg__notif_intr_en_t // Reg - sha256_reg::global_intr_t_agg_sts_dd3dcf0a class sha256_reg__global_intr_t_agg_sts_dd3dcf0a extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + sha256_reg__global_intr_t_agg_sts_dd3dcf0a_bit_cg agg_sts_bit_cg[1]; + sha256_reg__global_intr_t_agg_sts_dd3dcf0a_fld_cg fld_cg; rand uvm_reg_field agg_sts; function new(string name = "sha256_reg__global_intr_t_agg_sts_dd3dcf0a"); - super.new(name, 32, UVM_NO_COVERAGE); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); virtual function void build(); this.agg_sts = new("agg_sts"); this.agg_sts.configure(this, 1, 0, "RO", 1, 'h0, 1, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(agg_sts_bit_cg[bt]) agg_sts_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); endfunction : build endclass : sha256_reg__global_intr_t_agg_sts_dd3dcf0a // Reg - sha256_reg::global_intr_t_agg_sts_e6399b4a class sha256_reg__global_intr_t_agg_sts_e6399b4a extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + sha256_reg__global_intr_t_agg_sts_e6399b4a_bit_cg agg_sts_bit_cg[1]; + sha256_reg__global_intr_t_agg_sts_e6399b4a_fld_cg fld_cg; rand uvm_reg_field agg_sts; function new(string name = "sha256_reg__global_intr_t_agg_sts_e6399b4a"); - super.new(name, 32, UVM_NO_COVERAGE); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); virtual function void build(); this.agg_sts = new("agg_sts"); this.agg_sts.configure(this, 1, 0, "RO", 1, 'h0, 1, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(agg_sts_bit_cg[bt]) agg_sts_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); endfunction : build endclass : sha256_reg__global_intr_t_agg_sts_e6399b4a // Reg - sha256_reg::error_intr_t_error0_sts_28545624_error1_sts_40e0d3e1_error2_sts_b1cf2205_error3_sts_74a35378 class sha256_reg__error_intr_t_error0_sts_28545624_error1_sts_40e0d3e1_error2_sts_b1cf2205_error3_sts_74a35378 extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + sha256_reg__error_intr_t_error0_sts_28545624_error1_sts_40e0d3e1_error2_sts_b1cf2205_error3_sts_74a35378_bit_cg error0_sts_bit_cg[1]; + sha256_reg__error_intr_t_error0_sts_28545624_error1_sts_40e0d3e1_error2_sts_b1cf2205_error3_sts_74a35378_bit_cg error1_sts_bit_cg[1]; + sha256_reg__error_intr_t_error0_sts_28545624_error1_sts_40e0d3e1_error2_sts_b1cf2205_error3_sts_74a35378_bit_cg error2_sts_bit_cg[1]; + sha256_reg__error_intr_t_error0_sts_28545624_error1_sts_40e0d3e1_error2_sts_b1cf2205_error3_sts_74a35378_bit_cg error3_sts_bit_cg[1]; + sha256_reg__error_intr_t_error0_sts_28545624_error1_sts_40e0d3e1_error2_sts_b1cf2205_error3_sts_74a35378_fld_cg fld_cg; rand uvm_reg_field error0_sts; rand uvm_reg_field error1_sts; rand uvm_reg_field error2_sts; rand uvm_reg_field error3_sts; function new(string name = "sha256_reg__error_intr_t_error0_sts_28545624_error1_sts_40e0d3e1_error2_sts_b1cf2205_error3_sts_74a35378"); - super.new(name, 32, UVM_NO_COVERAGE); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); virtual function void build(); this.error0_sts = new("error0_sts"); @@ -202,33 +408,71 @@ package sha256_reg_uvm; this.error2_sts.configure(this, 1, 2, "W1C", 1, 'h0, 1, 1, 0); this.error3_sts = new("error3_sts"); this.error3_sts.configure(this, 1, 3, "W1C", 1, 'h0, 1, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(error0_sts_bit_cg[bt]) error0_sts_bit_cg[bt] = new(); + foreach(error1_sts_bit_cg[bt]) error1_sts_bit_cg[bt] = new(); + foreach(error2_sts_bit_cg[bt]) error2_sts_bit_cg[bt] = new(); + foreach(error3_sts_bit_cg[bt]) error3_sts_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); endfunction : build endclass : sha256_reg__error_intr_t_error0_sts_28545624_error1_sts_40e0d3e1_error2_sts_b1cf2205_error3_sts_74a35378 // Reg - sha256_reg::notif_intr_t_notif_cmd_done_sts_1c68637e class sha256_reg__notif_intr_t_notif_cmd_done_sts_1c68637e extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + sha256_reg__notif_intr_t_notif_cmd_done_sts_1c68637e_bit_cg notif_cmd_done_sts_bit_cg[1]; + sha256_reg__notif_intr_t_notif_cmd_done_sts_1c68637e_fld_cg fld_cg; rand uvm_reg_field notif_cmd_done_sts; function new(string name = "sha256_reg__notif_intr_t_notif_cmd_done_sts_1c68637e"); - super.new(name, 32, UVM_NO_COVERAGE); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); virtual function void build(); this.notif_cmd_done_sts = new("notif_cmd_done_sts"); this.notif_cmd_done_sts.configure(this, 1, 0, "W1C", 1, 'h0, 1, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(notif_cmd_done_sts_bit_cg[bt]) notif_cmd_done_sts_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); endfunction : build endclass : sha256_reg__notif_intr_t_notif_cmd_done_sts_1c68637e // Reg - sha256_reg::error_intr_trig_t class sha256_reg__error_intr_trig_t extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + sha256_reg__error_intr_trig_t_bit_cg error0_trig_bit_cg[1]; + sha256_reg__error_intr_trig_t_bit_cg error1_trig_bit_cg[1]; + sha256_reg__error_intr_trig_t_bit_cg error2_trig_bit_cg[1]; + sha256_reg__error_intr_trig_t_bit_cg error3_trig_bit_cg[1]; + sha256_reg__error_intr_trig_t_fld_cg fld_cg; rand uvm_reg_field error0_trig; rand uvm_reg_field error1_trig; rand uvm_reg_field error2_trig; rand uvm_reg_field error3_trig; function new(string name = "sha256_reg__error_intr_trig_t"); - super.new(name, 32, UVM_NO_COVERAGE); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); virtual function void build(); this.error0_trig = new("error0_trig"); @@ -239,160 +483,344 @@ package sha256_reg_uvm; this.error2_trig.configure(this, 1, 2, "W1S", 0, 'h0, 1, 1, 0); this.error3_trig = new("error3_trig"); this.error3_trig.configure(this, 1, 3, "W1S", 0, 'h0, 1, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(error0_trig_bit_cg[bt]) error0_trig_bit_cg[bt] = new(); + foreach(error1_trig_bit_cg[bt]) error1_trig_bit_cg[bt] = new(); + foreach(error2_trig_bit_cg[bt]) error2_trig_bit_cg[bt] = new(); + foreach(error3_trig_bit_cg[bt]) error3_trig_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); endfunction : build endclass : sha256_reg__error_intr_trig_t // Reg - sha256_reg::notif_intr_trig_t class sha256_reg__notif_intr_trig_t extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + sha256_reg__notif_intr_trig_t_bit_cg notif_cmd_done_trig_bit_cg[1]; + sha256_reg__notif_intr_trig_t_fld_cg fld_cg; rand uvm_reg_field notif_cmd_done_trig; function new(string name = "sha256_reg__notif_intr_trig_t"); - super.new(name, 32, UVM_NO_COVERAGE); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); virtual function void build(); this.notif_cmd_done_trig = new("notif_cmd_done_trig"); this.notif_cmd_done_trig.configure(this, 1, 0, "W1S", 0, 'h0, 1, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(notif_cmd_done_trig_bit_cg[bt]) notif_cmd_done_trig_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); endfunction : build endclass : sha256_reg__notif_intr_trig_t // Reg - sha256_reg::intr_count_t_cnt_35ace267 class sha256_reg__intr_count_t_cnt_35ace267 extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + sha256_reg__intr_count_t_cnt_35ace267_bit_cg cnt_bit_cg[32]; + sha256_reg__intr_count_t_cnt_35ace267_fld_cg fld_cg; rand uvm_reg_field cnt; function new(string name = "sha256_reg__intr_count_t_cnt_35ace267"); - super.new(name, 32, UVM_NO_COVERAGE); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); virtual function void build(); this.cnt = new("cnt"); this.cnt.configure(this, 32, 0, "RW", 1, 'h0, 1, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(cnt_bit_cg[bt]) cnt_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); endfunction : build endclass : sha256_reg__intr_count_t_cnt_35ace267 // Reg - sha256_reg::intr_count_t_cnt_73c42c28 class sha256_reg__intr_count_t_cnt_73c42c28 extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + sha256_reg__intr_count_t_cnt_73c42c28_bit_cg cnt_bit_cg[32]; + sha256_reg__intr_count_t_cnt_73c42c28_fld_cg fld_cg; rand uvm_reg_field cnt; function new(string name = "sha256_reg__intr_count_t_cnt_73c42c28"); - super.new(name, 32, UVM_NO_COVERAGE); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); virtual function void build(); this.cnt = new("cnt"); this.cnt.configure(this, 32, 0, "RW", 1, 'h0, 1, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(cnt_bit_cg[bt]) cnt_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); endfunction : build endclass : sha256_reg__intr_count_t_cnt_73c42c28 // Reg - sha256_reg::intr_count_t_cnt_d8af96ff class sha256_reg__intr_count_t_cnt_d8af96ff extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + sha256_reg__intr_count_t_cnt_d8af96ff_bit_cg cnt_bit_cg[32]; + sha256_reg__intr_count_t_cnt_d8af96ff_fld_cg fld_cg; rand uvm_reg_field cnt; function new(string name = "sha256_reg__intr_count_t_cnt_d8af96ff"); - super.new(name, 32, UVM_NO_COVERAGE); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); virtual function void build(); this.cnt = new("cnt"); this.cnt.configure(this, 32, 0, "RW", 1, 'h0, 1, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(cnt_bit_cg[bt]) cnt_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); endfunction : build endclass : sha256_reg__intr_count_t_cnt_d8af96ff // Reg - sha256_reg::intr_count_t_cnt_9bd7f809 class sha256_reg__intr_count_t_cnt_9bd7f809 extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + sha256_reg__intr_count_t_cnt_9bd7f809_bit_cg cnt_bit_cg[32]; + sha256_reg__intr_count_t_cnt_9bd7f809_fld_cg fld_cg; rand uvm_reg_field cnt; function new(string name = "sha256_reg__intr_count_t_cnt_9bd7f809"); - super.new(name, 32, UVM_NO_COVERAGE); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); virtual function void build(); this.cnt = new("cnt"); this.cnt.configure(this, 32, 0, "RW", 1, 'h0, 1, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(cnt_bit_cg[bt]) cnt_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); endfunction : build endclass : sha256_reg__intr_count_t_cnt_9bd7f809 // Reg - sha256_reg::intr_count_t_cnt_be67d6d5 class sha256_reg__intr_count_t_cnt_be67d6d5 extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + sha256_reg__intr_count_t_cnt_be67d6d5_bit_cg cnt_bit_cg[32]; + sha256_reg__intr_count_t_cnt_be67d6d5_fld_cg fld_cg; rand uvm_reg_field cnt; function new(string name = "sha256_reg__intr_count_t_cnt_be67d6d5"); - super.new(name, 32, UVM_NO_COVERAGE); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); virtual function void build(); this.cnt = new("cnt"); this.cnt.configure(this, 32, 0, "RW", 1, 'h0, 1, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(cnt_bit_cg[bt]) cnt_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); endfunction : build endclass : sha256_reg__intr_count_t_cnt_be67d6d5 // Reg - sha256_reg::intr_count_incr_t_pulse_37026c97 class sha256_reg__intr_count_incr_t_pulse_37026c97 extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + sha256_reg__intr_count_incr_t_pulse_37026c97_bit_cg pulse_bit_cg[1]; + sha256_reg__intr_count_incr_t_pulse_37026c97_fld_cg fld_cg; rand uvm_reg_field pulse; function new(string name = "sha256_reg__intr_count_incr_t_pulse_37026c97"); - super.new(name, 32, UVM_NO_COVERAGE); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); virtual function void build(); this.pulse = new("pulse"); this.pulse.configure(this, 1, 0, "RO", 1, 'h0, 1, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(pulse_bit_cg[bt]) pulse_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); endfunction : build endclass : sha256_reg__intr_count_incr_t_pulse_37026c97 // Reg - sha256_reg::intr_count_incr_t_pulse_d860d977 class sha256_reg__intr_count_incr_t_pulse_d860d977 extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + sha256_reg__intr_count_incr_t_pulse_d860d977_bit_cg pulse_bit_cg[1]; + sha256_reg__intr_count_incr_t_pulse_d860d977_fld_cg fld_cg; rand uvm_reg_field pulse; function new(string name = "sha256_reg__intr_count_incr_t_pulse_d860d977"); - super.new(name, 32, UVM_NO_COVERAGE); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); virtual function void build(); this.pulse = new("pulse"); this.pulse.configure(this, 1, 0, "RO", 1, 'h0, 1, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(pulse_bit_cg[bt]) pulse_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); endfunction : build endclass : sha256_reg__intr_count_incr_t_pulse_d860d977 // Reg - sha256_reg::intr_count_incr_t_pulse_87b45fe7 class sha256_reg__intr_count_incr_t_pulse_87b45fe7 extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + sha256_reg__intr_count_incr_t_pulse_87b45fe7_bit_cg pulse_bit_cg[1]; + sha256_reg__intr_count_incr_t_pulse_87b45fe7_fld_cg fld_cg; rand uvm_reg_field pulse; function new(string name = "sha256_reg__intr_count_incr_t_pulse_87b45fe7"); - super.new(name, 32, UVM_NO_COVERAGE); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); virtual function void build(); this.pulse = new("pulse"); this.pulse.configure(this, 1, 0, "RO", 1, 'h0, 1, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(pulse_bit_cg[bt]) pulse_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); endfunction : build endclass : sha256_reg__intr_count_incr_t_pulse_87b45fe7 // Reg - sha256_reg::intr_count_incr_t_pulse_c1689ee6 class sha256_reg__intr_count_incr_t_pulse_c1689ee6 extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + sha256_reg__intr_count_incr_t_pulse_c1689ee6_bit_cg pulse_bit_cg[1]; + sha256_reg__intr_count_incr_t_pulse_c1689ee6_fld_cg fld_cg; rand uvm_reg_field pulse; function new(string name = "sha256_reg__intr_count_incr_t_pulse_c1689ee6"); - super.new(name, 32, UVM_NO_COVERAGE); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); virtual function void build(); this.pulse = new("pulse"); this.pulse.configure(this, 1, 0, "RO", 1, 'h0, 1, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(pulse_bit_cg[bt]) pulse_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); endfunction : build endclass : sha256_reg__intr_count_incr_t_pulse_c1689ee6 // Reg - sha256_reg::intr_count_incr_t_pulse_6173128e class sha256_reg__intr_count_incr_t_pulse_6173128e extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + sha256_reg__intr_count_incr_t_pulse_6173128e_bit_cg pulse_bit_cg[1]; + sha256_reg__intr_count_incr_t_pulse_6173128e_fld_cg fld_cg; rand uvm_reg_field pulse; function new(string name = "sha256_reg__intr_count_incr_t_pulse_6173128e"); - super.new(name, 32, UVM_NO_COVERAGE); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); virtual function void build(); this.pulse = new("pulse"); this.pulse.configure(this, 1, 0, "RO", 1, 'h0, 1, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(pulse_bit_cg[bt]) pulse_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); endfunction : build endclass : sha256_reg__intr_count_incr_t_pulse_6173128e @@ -583,4 +1011,5 @@ package sha256_reg_uvm; endfunction : build endclass : sha256_reg + `include "sha256_reg_sample.svh" endpackage: sha256_reg_uvm diff --git a/src/sha256/tb/sha256_ctrl_tb.sv b/src/sha256/tb/sha256_ctrl_tb.sv index 77ce87be5..fe99b8290 100644 --- a/src/sha256/tb/sha256_ctrl_tb.sv +++ b/src/sha256/tb/sha256_ctrl_tb.sv @@ -39,9 +39,8 @@ module sha256_ctrl_tb(); parameter ADDR_VERSION1 = 32'h0000000c; parameter ADDR_CTRL = 32'h00000010; - parameter CTRL_INIT_VALUE = 8'h01; - parameter CTRL_NEXT_VALUE = 8'h02; - parameter CTRL_MODE_VALUE = 8'h04; + parameter CTRL_INIT_VALUE = 2'h1; + parameter CTRL_NEXT_VALUE = 2'h2; parameter ADDR_STATUS = 32'h00000018; parameter STATUS_READY_BIT = 0; @@ -93,6 +92,7 @@ module sha256_ctrl_tb(); reg clk_tb; reg reset_n_tb; + reg cptra_pwrgood_tb; reg [AHB_ADDR_WIDTH-1:0] haddr_i_tb; reg [AHB_DATA_WIDTH-1:0] hwdata_i_tb; @@ -109,6 +109,9 @@ module sha256_ctrl_tb(); reg [31 : 0] read_data; reg [255 : 0] digest_data; + //bind coverage file + sha256_ctrl_cov_bind i_sha256_ctrl_cov_bind(); + //---------------------------------------------------------------- // Device Under Test. //---------------------------------------------------------------- @@ -119,7 +122,7 @@ module sha256_ctrl_tb(); dut ( .clk(clk_tb), .reset_n(reset_n_tb), - .cptra_pwrgood(reset_n_tb), + .cptra_pwrgood(cptra_pwrgood_tb), .haddr_i(haddr_i_tb), .hwdata_i(hwdata_i_tb), @@ -134,7 +137,8 @@ module sha256_ctrl_tb(); .hrdata_o(hrdata_o_tb), .error_intr(), - .notif_intr() + .notif_intr(), + .debugUnlock_or_scan_mode_switch('0) ); @@ -171,17 +175,14 @@ module sha256_ctrl_tb(); task reset_dut; begin $display("*** Toggle reset."); + cptra_pwrgood_tb = '0; reset_n_tb = 0; #(2 * CLK_PERIOD); - - @(posedge clk_tb); - reset_n_tb = 1; + cptra_pwrgood_tb = 1; #(2 * CLK_PERIOD); - - @(posedge clk_tb); - $display(""); + reset_n_tb = 1; end endtask // reset_dut @@ -200,6 +201,7 @@ module sha256_ctrl_tb(); clk_tb = 0; reset_n_tb = 0; + cptra_pwrgood_tb = 0; haddr_i_tb = 0; hwdata_i_tb = 0; @@ -246,8 +248,10 @@ module sha256_ctrl_tb(); //---------------------------------------------------------------- task wait_ready; begin - read_single_word(ADDR_STATUS); - while (hrdata_o_tb == 0) + read_data = 0; + #(CLK_PERIOD); + + while (read_data == 0) begin read_single_word(ADDR_STATUS); end @@ -264,22 +268,18 @@ module sha256_ctrl_tb(); task write_single_word(input [31 : 0] address, input [31 : 0] word); begin - hsel_i_tb <= 1; - haddr_i_tb <= address; - hwrite_i_tb <= 1; - hready_i_tb <= 1; - htrans_i_tb <= AHB_HTRANS_NONSEQ; - hsize_i_tb <= 3'b010; - - @(posedge clk_tb); - haddr_i_tb <= 'Z; - hwdata_i_tb <= word; - hwrite_i_tb <= 0; - htrans_i_tb <= AHB_HTRANS_IDLE; - wait(hreadyout_o_tb == 1'b1); - - @(posedge clk_tb); - hsel_i_tb <= 0; + hsel_i_tb = 1; + haddr_i_tb = address; + hwrite_i_tb = 1; + hready_i_tb = 1; + htrans_i_tb = AHB_HTRANS_NONSEQ; + hsize_i_tb = 3'b010; + #(CLK_PERIOD); + + haddr_i_tb = 'Z; + hwdata_i_tb = word; + hwrite_i_tb = 0; + htrans_i_tb = AHB_HTRANS_IDLE; end endtask // write_single_word @@ -321,21 +321,18 @@ module sha256_ctrl_tb(); //---------------------------------------------------------------- task read_single_word(input [31 : 0] address); begin - hsel_i_tb <= 1; - haddr_i_tb <= address; - hwrite_i_tb <= 0; - hready_i_tb <= 1; - htrans_i_tb <= AHB_HTRANS_NONSEQ; - hsize_i_tb <= 3'b010; + hsel_i_tb = 1; + haddr_i_tb = address; + hwrite_i_tb = 0; + hready_i_tb = 1; + htrans_i_tb = AHB_HTRANS_NONSEQ; + hsize_i_tb = 3'b010; + #(CLK_PERIOD); - @(posedge clk_tb); - hwdata_i_tb <= 0; - haddr_i_tb <= 'Z; - htrans_i_tb <= AHB_HTRANS_IDLE; - wait(hreadyout_o_tb == 1'b1); - - @(posedge clk_tb); - hsel_i_tb <= 0; + hwdata_i_tb = 0; + haddr_i_tb = 'Z; + htrans_i_tb = AHB_HTRANS_IDLE; + read_data = hrdata_o_tb; end endtask // read_word @@ -421,22 +418,21 @@ module sha256_ctrl_tb(); write_block(block); - if (mode) - write_single_word(ADDR_CTRL, (CTRL_MODE_VALUE + CTRL_INIT_VALUE)); - else - write_single_word(ADDR_CTRL, CTRL_INIT_VALUE); - - start_time = cycle_ctr; - + write_single_word(ADDR_CTRL, {mode, CTRL_INIT_VALUE}); #CLK_PERIOD; hsel_i_tb = 0; #(CLK_PERIOD); + + start_time = cycle_ctr; + wait_ready(); end_time = cycle_ctr - start_time; $display("*** Single block test processing time = %01d cycles", end_time); read_digest(); + write_single_word(ADDR_CTRL, {28'h0, 1'b1, 3'b0}); //zeroize + // We need to ignore the LSW in SHA224 mode. if (mode == SHA224_MODE) digest_data[31 : 0] = 32'h0; @@ -477,10 +473,8 @@ module sha256_ctrl_tb(); // First block write_block(block0); - if (mode) - write_single_word(ADDR_CTRL, (CTRL_MODE_VALUE + CTRL_INIT_VALUE)); - else - write_single_word(ADDR_CTRL, CTRL_INIT_VALUE); + write_single_word(ADDR_CTRL, {mode, CTRL_INIT_VALUE}); + #CLK_PERIOD; hsel_i_tb = 0; @@ -507,10 +501,7 @@ module sha256_ctrl_tb(); // Final block write_block(block1); - if (mode) - write_single_word(ADDR_CTRL, (CTRL_MODE_VALUE + CTRL_NEXT_VALUE)); - else - write_single_word(ADDR_CTRL, CTRL_NEXT_VALUE); + write_single_word(ADDR_CTRL, {mode, CTRL_NEXT_VALUE}); #CLK_PERIOD; hsel_i_tb = 0; @@ -518,6 +509,8 @@ module sha256_ctrl_tb(); wait_ready(); read_digest(); + write_single_word(ADDR_CTRL, {28'h0, 1'b1, 3'b0}); //zeroize + // We need to ignore the LSW in SHA224 mode. if (mode == SHA224_MODE) digest_data[31 : 0] = 32'h0; @@ -540,6 +533,200 @@ module sha256_ctrl_tb(); endtask // double_block_test + //---------------------------------------------------------------- + // continuous_cmd_test() + // + // + // Perform test of a double block digest. + //---------------------------------------------------------------- + task continuous_cmd_test(input mode, + input [511 : 0] block0, + input [255 : 0] expected0, + input [511 : 0] block1, + input [255 : 0] expected1 + ); + reg [31 : 0] start_time; + reg [31 : 0] end_time; + + begin + $display("*** TC%01d - continuous command test started.", tc_ctr); + + start_time = cycle_ctr; + + // First block + write_block(block0); + + write_single_word(ADDR_CTRL, {mode, CTRL_INIT_VALUE}); + #CLK_PERIOD; + hsel_i_tb = 0; + + #(CLK_PERIOD); + + for (int i=0; i<10; i++) + begin + write_single_word(ADDR_CTRL, {29'h0, mode, CTRL_INIT_VALUE}); + #CLK_PERIOD; + write_single_word(ADDR_CTRL, {29'h0, mode, CTRL_NEXT_VALUE}); + #CLK_PERIOD; + end + + wait_ready(); + + // Final block + write_block(block1); + + write_single_word(ADDR_CTRL, {mode, CTRL_NEXT_VALUE}); + #CLK_PERIOD; + hsel_i_tb = 0; + + #(CLK_PERIOD); + + for (int i=0; i<10; i++) + begin + write_single_word(ADDR_CTRL, {29'h0, mode, CTRL_INIT_VALUE}); + #CLK_PERIOD; + write_single_word(ADDR_CTRL, {29'h0, mode, CTRL_NEXT_VALUE}); + #CLK_PERIOD; + end + + wait_ready(); + + read_digest(); + + end_time = cycle_ctr - start_time; + $display("*** processing time = %01d cycles", end_time); + if (digest_data == expected1) + begin + $display("TC%01d final block: OK.", tc_ctr); + end + else + begin + $display("TC%01d: ERROR in final digest", tc_ctr); + $display("TC%01d: Expected: 0x%064x", tc_ctr, expected1); + $display("TC%01d: Got: 0x%064x", tc_ctr, digest_data); + error_ctr = error_ctr + 1; + end + + $display("*** TC%01d - Continuous command test done.", tc_ctr); + tc_ctr = tc_ctr + 1; + end + endtask // continuous_cmd_test + + + //---------------------------------------------------------------- + // zeroize_test() + // + //---------------------------------------------------------------- + task zeroize_test(input mode, + input [511 : 0] block0, + input [255 : 0] expected0, + input [511 : 0] block1, + input [255 : 0] expected1 + ); + begin + + $display("*** TC%01d - zeroize test started.", tc_ctr); + + // First test: assert zeroize when engine is working + write_block(block0); + + write_single_word(ADDR_CTRL, {28'h0, 1'b0, mode, CTRL_INIT_VALUE}); + #(10 * CLK_PERIOD); + + write_single_word(ADDR_CTRL, {28'h0, 1'b1, 3'b0}); //zeroize + #CLK_PERIOD; + hsel_i_tb = 0; + + wait_ready(); + read_digest(); + if (digest_data == 0) + begin + $display("TC%01d final block: OK.", tc_ctr); + end + else + begin + $display("TC%01d: ERROR in final digest", tc_ctr); + $display("TC%01d: Expected: 0x%064x", tc_ctr, 0); + $display("TC%01d: Got: 0x%064x", tc_ctr, digest_data); + error_ctr = error_ctr + 1; + end + tc_ctr = tc_ctr + 1; + + // Second test: assert zeroize with INIT + write_block(block0); + + write_single_word(ADDR_CTRL, {28'h0, 1'b1, mode, CTRL_INIT_VALUE}); //zeroize + #CLK_PERIOD; + hsel_i_tb = 0; + #(CLK_PERIOD); + + wait_ready(); + read_digest(); + if (digest_data == 0) + begin + $display("TC%01d final block: OK.", tc_ctr); + end + else + begin + $display("TC%01d: ERROR in final digest", tc_ctr); + $display("TC%01d: Expected: 0x%064x", tc_ctr, 0); + $display("TC%01d: Got: 0x%064x", tc_ctr, digest_data); + error_ctr = error_ctr + 1; + end + tc_ctr = tc_ctr + 1; + + // Third test: assert zeroize with NEXT + write_block(block0); + + write_single_word(ADDR_CTRL, {28'h0, 1'b1, mode, CTRL_NEXT_VALUE}); //zeroize + #CLK_PERIOD; + hsel_i_tb = 0; + #(CLK_PERIOD); + + wait_ready(); + read_digest(); + if (digest_data == 0) + begin + $display("TC%01d final block: OK.", tc_ctr); + end + else + begin + $display("TC%01d: ERROR in final digest", tc_ctr); + $display("TC%01d: Expected: 0x%064x", tc_ctr, 0); + $display("TC%01d: Got: 0x%064x", tc_ctr, digest_data); + error_ctr = error_ctr + 1; + end + tc_ctr = tc_ctr + 1; + + // Forth test: assert zeroize after NEXT + write_block(block0); + + write_single_word(ADDR_CTRL, {mode, CTRL_NEXT_VALUE}); + #(10 * CLK_PERIOD); + + write_single_word(ADDR_CTRL, {28'h0, 1'b1, 3'b0}); //zeroize + #CLK_PERIOD; + hsel_i_tb = 0; + + wait_ready(); + read_digest(); + if (digest_data == 0) + begin + $display("TC%01d final block: OK.", tc_ctr); + end + else + begin + $display("TC%01d: ERROR in final digest", tc_ctr); + $display("TC%01d: Expected: 0x%064x", tc_ctr, 0); + $display("TC%01d: Got: 0x%064x", tc_ctr, digest_data); + error_ctr = error_ctr + 1; + end + + $display("*** TC%01d - zeroize test done.", tc_ctr); + tc_ctr = tc_ctr + 1; + end + endtask // zeroize_test + //---------------------------------------------------------------- // sha224_tests() // @@ -604,6 +791,10 @@ module sha256_ctrl_tb(); res1_1 = 256'h248D6A61D20638B8E5C026930C3E6039A33CE45964FF2167F6ECEDD419DB06C1; double_block_test(SHA256_MODE, tc1_0, res1_0, tc1_1, res1_1); + continuous_cmd_test(SHA256_MODE, tc1_0, res1_0, tc1_1, res1_1); + + zeroize_test(SHA256_MODE, tc1_0, res1_0, tc1_1, res1_1); + $display("*** Testcases for sha256 functionality completed."); end endtask // sha256_tests @@ -614,6 +805,7 @@ module sha256_ctrl_tb(); // issue_test() //---------------------------------------------------------------- task issue_test; + reg mode; reg [511 : 0] block0; reg [511 : 0] block1; reg [511 : 0] block2; @@ -625,6 +817,8 @@ module sha256_ctrl_tb(); reg [511 : 0] block8; reg [255 : 0] expected; begin : issue_test; + mode = SHA256_MODE; + block0 = 512'h6b900001_496e2074_68652061_72656120_6f662049_6f542028_496e7465_726e6574_206f6620_5468696e_6773292c_206d6f72_6520616e_64206d6f_7265626f_6f6d2c20; block1 = 512'h69742068_61732062_65656e20_6120756e_69766572_73616c20_636f6e73_656e7375_73207468_61742064_61746120_69732074_69732061_206e6577_20746563_686e6f6c; block2 = 512'h6f677920_74686174_20696e74_65677261_74657320_64656365_6e747261_6c697a61_74696f6e_2c496e20_74686520_61726561_206f6620_496f5420_28496e74_65726e65; @@ -640,7 +834,7 @@ module sha256_ctrl_tb(); $display("Running test for 9 block issue."); tc_ctr = tc_ctr + 1; write_block(block0); - write_single_word(ADDR_CTRL, (CTRL_MODE_VALUE + CTRL_INIT_VALUE)); + write_single_word(ADDR_CTRL, {mode, CTRL_INIT_VALUE}); #CLK_PERIOD; hsel_i_tb = 0; @@ -648,56 +842,56 @@ module sha256_ctrl_tb(); wait_ready(); write_block(block1); - write_single_word(ADDR_CTRL, (CTRL_MODE_VALUE + CTRL_NEXT_VALUE)); + write_single_word(ADDR_CTRL, {mode, CTRL_NEXT_VALUE}); #CLK_PERIOD; hsel_i_tb = 0; #(CLK_PERIOD); wait_ready(); write_block(block2); - write_single_word(ADDR_CTRL, (CTRL_MODE_VALUE + CTRL_NEXT_VALUE)); + write_single_word(ADDR_CTRL, {mode, CTRL_NEXT_VALUE}); #CLK_PERIOD; hsel_i_tb = 0; #(CLK_PERIOD); wait_ready(); write_block(block3); - write_single_word(ADDR_CTRL, (CTRL_MODE_VALUE + CTRL_NEXT_VALUE)); + write_single_word(ADDR_CTRL, {mode, CTRL_NEXT_VALUE}); #CLK_PERIOD; hsel_i_tb = 0; #(CLK_PERIOD); wait_ready(); write_block(block4); - write_single_word(ADDR_CTRL, (CTRL_MODE_VALUE + CTRL_NEXT_VALUE)); + write_single_word(ADDR_CTRL, {mode, CTRL_NEXT_VALUE}); #CLK_PERIOD; hsel_i_tb = 0; #(CLK_PERIOD); wait_ready(); write_block(block5); - write_single_word(ADDR_CTRL, (CTRL_MODE_VALUE + CTRL_NEXT_VALUE)); + write_single_word(ADDR_CTRL, {mode, CTRL_NEXT_VALUE}); #CLK_PERIOD; hsel_i_tb = 0; #(CLK_PERIOD); wait_ready(); write_block(block6); - write_single_word(ADDR_CTRL, (CTRL_MODE_VALUE + CTRL_NEXT_VALUE)); + write_single_word(ADDR_CTRL, {mode, CTRL_NEXT_VALUE}); #CLK_PERIOD; hsel_i_tb = 0; #(CLK_PERIOD); wait_ready(); write_block(block7); - write_single_word(ADDR_CTRL, (CTRL_MODE_VALUE + CTRL_NEXT_VALUE)); + write_single_word(ADDR_CTRL, {mode, CTRL_NEXT_VALUE}); #CLK_PERIOD; hsel_i_tb = 0; #(CLK_PERIOD); wait_ready(); write_block(block8); - write_single_word(ADDR_CTRL, (CTRL_MODE_VALUE + CTRL_NEXT_VALUE)); + write_single_word(ADDR_CTRL, {mode, CTRL_NEXT_VALUE}); #CLK_PERIOD; hsel_i_tb = 0; #(CLK_PERIOD); diff --git a/src/sha256/tb/sha256_random_test.sv b/src/sha256/tb/sha256_random_test.sv index 677a2d73a..b391bfe9f 100644 --- a/src/sha256/tb/sha256_random_test.sv +++ b/src/sha256/tb/sha256_random_test.sv @@ -71,6 +71,9 @@ module sha256_random_test(); reg [255 : 0] digest_data; reg [255 : 0] expected; + //bind coverage file + sha256_ctrl_cov_bind i_sha256_ctrl_cov_bind(); + //---------------------------------------------------------------- // Device Under Test. //---------------------------------------------------------------- @@ -96,7 +99,8 @@ module sha256_random_test(); .hrdata_o(hrdata_o_tb), .error_intr(), - .notif_intr() + .notif_intr(), + .debugUnlock_or_scan_mode_switch('0) ); diff --git a/src/sha256/tb/sha256_tb.v b/src/sha256/tb/sha256_tb.v index 43a72a504..7df65ef13 100644 --- a/src/sha256/tb/sha256_tb.v +++ b/src/sha256/tb/sha256_tb.v @@ -105,6 +105,7 @@ module sha256_tb(); sha256 dut( .clk(tb_clk), .reset_n(tb_reset_n), + .cptra_pwrgood(), .cs(tb_cs), .we(tb_we), @@ -113,7 +114,11 @@ module sha256_tb(); .address(tb_address), .write_data(tb_write_data), .read_data(tb_read_data), - .error(tb_error) + .err(tb_error) + + .error_intr(), + .notif_intr(), + .debugUnlock_or_scan_mode_switch('0) ); diff --git a/src/sha512/config/compile.yml b/src/sha512/config/compile.yml index 86435f294..690ae1c4a 100755 --- a/src/sha512/config/compile.yml +++ b/src/sha512/config/compile.yml @@ -10,9 +10,9 @@ targets: directories: [$COMPILE_ROOT/rtl] files: - $COMPILE_ROOT/rtl/sha512_reg_pkg.sv + - $COMPILE_ROOT/rtl/sha512_params_pkg.sv - $COMPILE_ROOT/rtl/sha512_ctrl.sv - $COMPILE_ROOT/rtl/sha512.sv - - $COMPILE_ROOT/rtl/sha512_param.sv - $COMPILE_ROOT/rtl/sha512_core.v - $COMPILE_ROOT/rtl/sha512_h_constants.v - $COMPILE_ROOT/rtl/sha512_k_constants.v @@ -31,6 +31,7 @@ provides: [sha512_ctrl_32bit_tb] schema_version: 2.4.0 requires: - sha512_ctrl + - sha512_coverage targets: tb: directories: @@ -38,6 +39,18 @@ targets: files: - $COMPILE_ROOT/tb/sha512_ctrl_32bit_tb.sv tops: [sha512_ctrl_32bit_tb] +--- +provides: [sha512_coverage] +schema_version: 2.4.0 +requires: + - sha512_ctrl +targets: + tb: + directories: + - $COMPILE_ROOT/coverage + files: + - $COMPILE_ROOT/coverage/sha512_ctrl_cov_if.sv + - $COMPILE_ROOT/coverage/sha512_ctrl_cov_bind.sv global: tool: vcs: diff --git a/src/sha512/config/sha512_coverage.vf b/src/sha512/config/sha512_coverage.vf new file mode 100644 index 000000000..4e7b74be1 --- /dev/null +++ b/src/sha512/config/sha512_coverage.vf @@ -0,0 +1,43 @@ ++incdir+${CALIPTRA_ROOT}/src/integration/rtl ++incdir+${CALIPTRA_ROOT}/src/libs/rtl ++incdir+${CALIPTRA_ROOT}/src/keyvault/rtl ++incdir+${CALIPTRA_ROOT}/src/pcrvault/rtl ++incdir+${CALIPTRA_ROOT}/src/sha512/coverage ++incdir+${CALIPTRA_ROOT}/src/sha512/rtl +${CALIPTRA_ROOT}/src/integration/rtl/config_defines.svh +${CALIPTRA_ROOT}/src/integration/rtl/caliptra_reg_defines.svh +${CALIPTRA_ROOT}/src/libs/rtl/caliptra_sva.svh +${CALIPTRA_ROOT}/src/libs/rtl/caliptra_macros.svh +${CALIPTRA_ROOT}/src/libs/rtl/caliptra_sram.sv +${CALIPTRA_ROOT}/src/libs/rtl/ahb_defines_pkg.sv +${CALIPTRA_ROOT}/src/libs/rtl/caliptra_ahb_srom.sv +${CALIPTRA_ROOT}/src/libs/rtl/apb_slv_sif.sv +${CALIPTRA_ROOT}/src/libs/rtl/ahb_slv_sif.sv +${CALIPTRA_ROOT}/src/libs/rtl/caliptra_icg.sv +${CALIPTRA_ROOT}/src/libs/rtl/clk_gate.sv +${CALIPTRA_ROOT}/src/keyvault/rtl/kv_defines_pkg.sv +${CALIPTRA_ROOT}/src/keyvault/rtl/kv_macros.svh +${CALIPTRA_ROOT}/src/pcrvault/rtl/pv_defines_pkg.sv +${CALIPTRA_ROOT}/src/pcrvault/rtl/pv_macros.svh +${CALIPTRA_ROOT}/src/pcrvault/rtl/pv_gen_hash.sv +${CALIPTRA_ROOT}/src/sha512/coverage/sha512_ctrl_cov_if.sv +${CALIPTRA_ROOT}/src/sha512/coverage/sha512_ctrl_cov_bind.sv +${CALIPTRA_ROOT}/src/libs/rtl/ahb_to_reg_adapter.sv +${CALIPTRA_ROOT}/src/keyvault/rtl/kv_reg_pkg.sv +${CALIPTRA_ROOT}/src/keyvault/rtl/kv_reg.sv +${CALIPTRA_ROOT}/src/keyvault/rtl/kv.sv +${CALIPTRA_ROOT}/src/keyvault/rtl/kv_fsm.sv +${CALIPTRA_ROOT}/src/keyvault/rtl/kv_read_client.sv +${CALIPTRA_ROOT}/src/keyvault/rtl/kv_write_client.sv +${CALIPTRA_ROOT}/src/pcrvault/rtl/pv_reg_pkg.sv +${CALIPTRA_ROOT}/src/pcrvault/rtl/pv_reg.sv +${CALIPTRA_ROOT}/src/pcrvault/rtl/pv.sv +${CALIPTRA_ROOT}/src/sha512/rtl/sha512_reg_pkg.sv +${CALIPTRA_ROOT}/src/sha512/rtl/sha512_params_pkg.sv +${CALIPTRA_ROOT}/src/sha512/rtl/sha512_ctrl.sv +${CALIPTRA_ROOT}/src/sha512/rtl/sha512.sv +${CALIPTRA_ROOT}/src/sha512/rtl/sha512_core.v +${CALIPTRA_ROOT}/src/sha512/rtl/sha512_h_constants.v +${CALIPTRA_ROOT}/src/sha512/rtl/sha512_k_constants.v +${CALIPTRA_ROOT}/src/sha512/rtl/sha512_w_mem.v +${CALIPTRA_ROOT}/src/sha512/rtl/sha512_reg.sv \ No newline at end of file diff --git a/src/sha512/config/sha512_ctrl.vf b/src/sha512/config/sha512_ctrl.vf index 85f207651..71a30643d 100644 --- a/src/sha512/config/sha512_ctrl.vf +++ b/src/sha512/config/sha512_ctrl.vf @@ -14,6 +14,7 @@ ${CALIPTRA_ROOT}/src/libs/rtl/apb_slv_sif.sv ${CALIPTRA_ROOT}/src/libs/rtl/ahb_slv_sif.sv ${CALIPTRA_ROOT}/src/libs/rtl/caliptra_icg.sv ${CALIPTRA_ROOT}/src/libs/rtl/clk_gate.sv +${CALIPTRA_ROOT}/src/libs/rtl/caliptra_2ff_sync.sv ${CALIPTRA_ROOT}/src/keyvault/rtl/kv_defines_pkg.sv ${CALIPTRA_ROOT}/src/keyvault/rtl/kv_macros.svh ${CALIPTRA_ROOT}/src/pcrvault/rtl/pv_defines_pkg.sv @@ -30,9 +31,9 @@ ${CALIPTRA_ROOT}/src/pcrvault/rtl/pv_reg_pkg.sv ${CALIPTRA_ROOT}/src/pcrvault/rtl/pv_reg.sv ${CALIPTRA_ROOT}/src/pcrvault/rtl/pv.sv ${CALIPTRA_ROOT}/src/sha512/rtl/sha512_reg_pkg.sv +${CALIPTRA_ROOT}/src/sha512/rtl/sha512_params_pkg.sv ${CALIPTRA_ROOT}/src/sha512/rtl/sha512_ctrl.sv ${CALIPTRA_ROOT}/src/sha512/rtl/sha512.sv -${CALIPTRA_ROOT}/src/sha512/rtl/sha512_param.sv ${CALIPTRA_ROOT}/src/sha512/rtl/sha512_core.v ${CALIPTRA_ROOT}/src/sha512/rtl/sha512_h_constants.v ${CALIPTRA_ROOT}/src/sha512/rtl/sha512_k_constants.v diff --git a/src/sha512/config/sha512_ctrl_32bit_tb.vf b/src/sha512/config/sha512_ctrl_32bit_tb.vf index 10b2319ca..621c83d2e 100644 --- a/src/sha512/config/sha512_ctrl_32bit_tb.vf +++ b/src/sha512/config/sha512_ctrl_32bit_tb.vf @@ -2,6 +2,7 @@ +incdir+${CALIPTRA_ROOT}/src/libs/rtl +incdir+${CALIPTRA_ROOT}/src/keyvault/rtl +incdir+${CALIPTRA_ROOT}/src/pcrvault/rtl ++incdir+${CALIPTRA_ROOT}/src/sha512/coverage +incdir+${CALIPTRA_ROOT}/src/sha512/tb +incdir+${CALIPTRA_ROOT}/src/sha512/rtl ${CALIPTRA_ROOT}/src/integration/rtl/config_defines.svh @@ -15,11 +16,14 @@ ${CALIPTRA_ROOT}/src/libs/rtl/apb_slv_sif.sv ${CALIPTRA_ROOT}/src/libs/rtl/ahb_slv_sif.sv ${CALIPTRA_ROOT}/src/libs/rtl/caliptra_icg.sv ${CALIPTRA_ROOT}/src/libs/rtl/clk_gate.sv +${CALIPTRA_ROOT}/src/libs/rtl/caliptra_2ff_sync.sv ${CALIPTRA_ROOT}/src/keyvault/rtl/kv_defines_pkg.sv ${CALIPTRA_ROOT}/src/keyvault/rtl/kv_macros.svh ${CALIPTRA_ROOT}/src/pcrvault/rtl/pv_defines_pkg.sv ${CALIPTRA_ROOT}/src/pcrvault/rtl/pv_macros.svh ${CALIPTRA_ROOT}/src/pcrvault/rtl/pv_gen_hash.sv +${CALIPTRA_ROOT}/src/sha512/coverage/sha512_ctrl_cov_if.sv +${CALIPTRA_ROOT}/src/sha512/coverage/sha512_ctrl_cov_bind.sv ${CALIPTRA_ROOT}/src/sha512/tb/sha512_ctrl_32bit_tb.sv ${CALIPTRA_ROOT}/src/libs/rtl/ahb_to_reg_adapter.sv ${CALIPTRA_ROOT}/src/keyvault/rtl/kv_reg_pkg.sv @@ -32,9 +36,9 @@ ${CALIPTRA_ROOT}/src/pcrvault/rtl/pv_reg_pkg.sv ${CALIPTRA_ROOT}/src/pcrvault/rtl/pv_reg.sv ${CALIPTRA_ROOT}/src/pcrvault/rtl/pv.sv ${CALIPTRA_ROOT}/src/sha512/rtl/sha512_reg_pkg.sv +${CALIPTRA_ROOT}/src/sha512/rtl/sha512_params_pkg.sv ${CALIPTRA_ROOT}/src/sha512/rtl/sha512_ctrl.sv ${CALIPTRA_ROOT}/src/sha512/rtl/sha512.sv -${CALIPTRA_ROOT}/src/sha512/rtl/sha512_param.sv ${CALIPTRA_ROOT}/src/sha512/rtl/sha512_core.v ${CALIPTRA_ROOT}/src/sha512/rtl/sha512_h_constants.v ${CALIPTRA_ROOT}/src/sha512/rtl/sha512_k_constants.v diff --git a/src/sha512/coverage/sha512_ctrl_cov_bind.sv b/src/sha512/coverage/sha512_ctrl_cov_bind.sv new file mode 100644 index 000000000..8917d105b --- /dev/null +++ b/src/sha512/coverage/sha512_ctrl_cov_bind.sv @@ -0,0 +1,20 @@ +// SPDX-License-Identifier: Apache-2.0 +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + + +module sha512_ctrl_cov_bind; + `ifdef FCOV + bind sha512_ctrl sha512_ctrl_cov_if i_sha512_ctrl_cov_if(.*); + `endif +endmodule diff --git a/src/sha512/coverage/sha512_ctrl_cov_if.sv b/src/sha512/coverage/sha512_ctrl_cov_if.sv new file mode 100644 index 000000000..9484d5608 --- /dev/null +++ b/src/sha512/coverage/sha512_ctrl_cov_if.sv @@ -0,0 +1,88 @@ +// SPDX-License-Identifier: Apache-2.0 +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +`ifndef VERILATOR + +interface sha512_ctrl_cov_if + ( + input logic clk, + input logic reset_n, + input logic cptra_pwrgood + +); + + logic init; + logic next; + logic [1 : 0] mode; + logic zeroize; + logic ready; + logic valid; + + logic pcr_sign_we; + logic gen_hash_start; + logic gen_hash_ip; + logic dest_data_avail; + + logic [1 : 0] hash_cmd; + + assign init = sha512_ctrl.sha512_inst.init_reg; + assign next = sha512_ctrl.sha512_inst.next_reg; + assign mode = sha512_ctrl.sha512_inst.mode_reg; + assign zeroize = sha512_ctrl.sha512_inst.zeroize_reg; + assign ready = sha512_ctrl.sha512_inst.ready_reg; + assign valid = sha512_ctrl.sha512_inst.digest_valid_reg; + + assign pcr_sign_we = sha512_ctrl.sha512_inst.pcr_sign_we; + assign gen_hash_start = sha512_ctrl.sha512_inst.gen_hash_start; + assign gen_hash_ip = sha512_ctrl.sha512_inst.gen_hash_ip; + assign dest_data_avail = sha512_ctrl.sha512_inst.dest_data_avail; + + assign hash_cmd = {next, init}; + + covergroup sha512_ctrl_cov_grp @(posedge clk); + reset_cp: coverpoint reset_n; + cptra_pwrgood_cp: coverpoint cptra_pwrgood; + + init_cp: coverpoint init; + next_cp: coverpoint next; + mode_cp: coverpoint mode; + zeroize_cp: coverpoint zeroize; + ready_cp: coverpoint ready; + valid_cp: coverpoint valid; + + pcr_sign_we_cp: coverpoint pcr_sign_we; + gen_hash_start_cp: coverpoint gen_hash_start; + gen_hash_ip_cp: coverpoint gen_hash_ip; + dest_data_avail_cp: coverpoint dest_data_avail; + + hash_cmd_cp: coverpoint hash_cmd {bins cmd[] = (0, 0 => 1, 2 => 0, 0);} + + init_ready_cp: cross ready, init; + next_ready_cp: cross ready, next; + zeroize_ready_cp: cross ready, zeroize; + mode_ready_cp: cross ready, mode; + pcr_ready_cp: cross ready, gen_hash_start; + pcr_init_cp: cross gen_hash_start, init; + pcr_next_cp: cross gen_hash_start, next; + zeroize_pcr_cp: cross zeroize, gen_hash_start; + zeroize_init_cp: cross zeroize, init; + zeroize_next_cp: cross zeroize, next; + + endgroup + + sha512_ctrl_cov_grp sha512_ctrl_cov_grp1 = new(); + +endinterface + +`endif \ No newline at end of file diff --git a/src/sha512/formal/model/PriniTestBench/sc_main.cpp b/src/sha512/formal/model/PriniTestBench/sc_main.cpp new file mode 100644 index 000000000..7bf012fe0 --- /dev/null +++ b/src/sha512/formal/model/PriniTestBench/sc_main.cpp @@ -0,0 +1,23 @@ +#include "systemc.h" +#include "../Interfaces/Interfaces.h" +#include "../sha512.h" +#include "tb.h" + + +int sc_main(int argc, char **argv) { + Blocking in_channel("in_channel"); + MasterSlave> out_channel("out_channel"); + + testbench tb("tb"); + tb.in_testdata(in_channel); + tb.out_testdata(out_channel); + + SHA512 dut("dut"); + dut.SHA_Input(in_channel); + dut.out(out_channel); + + + + sc_start(); + return 0; +} diff --git a/src/sha512/formal/model/PriniTestBench/tb.cpp b/src/sha512/formal/model/PriniTestBench/tb.cpp new file mode 100644 index 000000000..a4202ddf2 --- /dev/null +++ b/src/sha512/formal/model/PriniTestBench/tb.cpp @@ -0,0 +1,33 @@ +using namespace std; +#include +#include "systemc.h" +#include "../common/Interfaces.h" +#include "sha512.h" +#include "tb.h" + +int main() { + // Instantiate the DUT + // Instantiate the TB + SHA512 dut("dut"); + testbench tb("tb"); + + // Channels & connections + Blocking SHA_in("SHA_in"); + MasterSlave> hash("hash"); + + dut.SHA_Input(SHA_in); + tb.in_testdata(SHA_in); + dut.out(hash); + tb.out_testdata(hash); + + // Start the simulation + sc_start(); + return 0; +}; + + + + + + + diff --git a/src/sha512/formal/model/PriniTestBench/tb.h b/src/sha512/formal/model/PriniTestBench/tb.h new file mode 100644 index 000000000..14218adcd --- /dev/null +++ b/src/sha512/formal/model/PriniTestBench/tb.h @@ -0,0 +1,93 @@ +#ifndef TB_H +#define TB_H + + +#include "systemc.h" +#include "../Interfaces/Interfaces.h" +#include +#include +#include "../sha512.h" + +SC_MODULE(testbench) { +public: + SC_CTOR(testbench) { + // read_test_vectors(file_path); + SC_THREAD(tests) + } + + blocking_out in_testdata; + slave_in> out_testdata; + +private: + void tests() { + + wait(0, SC_PS); + + sc_biguint<512> test_result; + SHA_Args test_input; + sc_biguint<104000> MSG_raw; + sc_biguint<104000> MSG_padded; + sc_uint<32> MSG_Length; + sc_biguint<512> expected_result; + int num = 1; + int zero_pad_len, MSG_chnks,i; + bool success = false; + std::string line; + std::ifstream myfile; + + myfile.open ("./testvectors/512_long_msg.txt"); + + while (myfile) + { + myfile >> MSG_Length; + myfile >> std::hex >> MSG_raw; + myfile >> expected_result; + + zero_pad_len = (896 - MSG_Length - 1) % 1024; + MSG_chnks = static_cast ((MSG_Length + 1 + 128 + zero_pad_len) / 1024); + MSG_padded = static_cast> (static_cast> (MSG_raw << (1 + 128 + zero_pad_len)) + (static_cast> (8) << ((125 + zero_pad_len))) + static_cast> (MSG_Length)); + + test_input.SHA_Mode = 512; + test_input.init = 1; + test_input.next = 0; + + //To Do: use assert ( parsed.hasError == false ) instead + for (i=0; i >(MSG_padded >> (1024*(MSG_chnks-1))); + if (i>0) + test_input.next = 1; + in_testdata->write(test_input); + MSG_padded = static_cast> (MSG_padded << 1024); + test_input.init = 0; + success = false; + while(!success) + { + wait(0, SC_PS); + out_testdata->slave_read(test_result, success); + } + + }; + + if (test_result != expected_result){ + std::cout << "Test " << num++ << " Failed!" << std::endl; + std::cout << std::hex << "Output: " << test_result << std::endl; + std::cout << std::hex << "Expected: " << expected_result << std::endl; + //sc_stop(); + } + else { + std::cout << "Test " << num++ << " Passed!" << std::endl; + } + + + } + + myfile.close(); + sc_stop(); + + } +}; + + +#endif + diff --git a/src/sha512/formal/model/PriniTestBench/testvectors/224.txt b/src/sha512/formal/model/PriniTestBench/testvectors/224.txt new file mode 100644 index 000000000..46c5c6092 --- /dev/null +++ b/src/sha512/formal/model/PriniTestBench/testvectors/224.txt @@ -0,0 +1,388 @@ +0 +0x00 +0x6ed0dd02806fa89e25de060c19d3ac86cabb87d6a0ddd05c333b84f4 +8 +0xcf +0x4199239e87d47b6feda016802bf367fb6e8b5655eff6225cb2668f4a +16 +0xca2d +0x392b99b593b85e147f031986c2a9edfdb4ffd9f24c77c452d339c9fc +24 +0x497604 +0xa9c345d58a959af20a42c84e28523ba47e3bf8fad8e8c3f32b7a72ae +32 +0xc2eb0c88 +0xc5b97f1e46d91c3940be8cfef1e49baa77b475db943e49f00cddbe72 +40 +0xd28bc2aa3f +0xe79de552120a87585e7313e24ecd74139a3be9ba2812936c4b33ca23 +48 +0xb4142ca79f6d +0x2a0ed8eb0e18bc189f5c836dc6a5825baa6f7286fa5b9689b641bb3b +56 +0x8daedf3c420c8c +0x4edac91a8eba35a1431ef4d49705db12da382a786d15636774cbd708 +64 +0x6963446913771410 +0x21f6c373637e6a5e89d6e88811110c5c3fa12e497144912914c546e1 +72 +0x6f316ab2b40f096819 +0x5899542e9a78d1403929c4346993e213b83c32f91274bddbc63e4192 +80 +0x5819a77fa1a8f9c35d17 +0x2e944a5c534b80922f6c21e97277b4a01a4a0fa652d6d40b37fb0fc9 +88 +0x3c7e038401fa74c6c06e41 +0xa74af68819afe81bcdaceba64201c0d41f843e4b08e4002a375be761 +96 +0xe243b9f901855447fa2af302 +0x330c77ed20dc93cabf0df3442c620c9df5c7a02d7c79fc1d2ff7ff94 +104 +0xc5f942edc46407c6019cd926a0 +0xe180a0d83683cb7e79d812ab5d4288399c78895c6a918e99a2839155 +112 +0xe57d4c478ad6a64b8bf3352e75b6 +0x18b3e8f5a1fb603c67060c12a736e57c5ccc0b89fc62c90b02dd926b +120 +0x32d049928a583b5b954785805d8b26 +0x18f87e8e6b54ec4336442f76eda0b32dcb64d463c0be69e348f86c34 +128 +0x3b2542cb3fa560dd0d796d59ee151fee +0xdc4ab34db241b3fc2055c54f70a8fd304523d8c4202852f5f077644f +136 +0xecbe367959a91b15eb08048b33752ef76d +0xb76eaa7dde45ed50c07b5bafafbfdcc0959c1a64eca7adc391aba245 +144 +0x40bd7d47b636c2a749a247fdda75807c238b +0x087ed68f1db90ffb2fb4ff7dc4b17fe08100b64383850378ef543339 +152 +0x331c8939ef685ae0efcd4030378a8b0ab720c7 +0x97874d56296a28f8df280448f76a9e806605da257a6083598f232e4d +160 +0x26634d1eb3cc2793830c97f49674bda74743eb8f +0x8294b112588dfb9c553ac88fbd8441722cec6a1d435311fe72e0110c +168 +0x62ed23ab88c30fe1350f702f3b6d45253a0fc6aec1 +0x309db70638771e2eec309abfda219e5f13bac5fa9d5e84e727764bca +176 +0x827dbbe36fb2663c95eaf81c7ce441dca66405050ad8 +0x39e786a93dc90e96471e466950a5a0f7f142ca69c1251b932e8bbf45 +184 +0xa2ada61a95cf8fb6f93cbd0aa67b70e286dc853afa51f8 +0xe821247c7bc7ac8ef07fb31ac25fb48a3fbc50fde399a3cb5889545f +192 +0x5633ee7b8870002c01a3c6f68f7812f13adfe0bf6fa794bf +0xc34b467858b65202fd8c73ffac67cd8ee55118d12beb2b110b63ae43 +200 +0xda1dd1ebea3cc9474cf255dc23e35695026e86d6093abab251 +0xe650802f29ad20b900148cf3e9361399e6207d455257fbae3efee50c +208 +0x8f71c9344ce6a535d104803d22119f57b5f9477e253817a52afa +0x6b3a288bd84137cd7600ccf2d2ab9b797d0e87a18ccb468183396235 +216 +0xd668a21780594024db025dcb373ef3639bcd5743145527e24da67d +0x2b93446d3aa2f1f9ea858e47806cc472f40e33085b7c7a6522cf6548 +224 +0x03f8cf98035eac158ff18fd93b44cdb621597255d7c3d97a9e087989 +0xe1fc5f508deed8bf74883b6fdef8c3e0c86306e7f1d6300cce4d36dc +232 +0x2a1f57998360e9216f5040e8f75f5bffba4368eeedede54aa0bb058a43 +0xbdc91e679fc2f4e40af13f03eca3f61a7ba33ac2c613d948ed7fc0bc +240 +0xcd5fee5fde5e9aa2884b4f4882cfa7d5571f8fd572c5f9bf77a3d21fda35 +0x72b43417b071f4811833027731b0ca28549c0357530fe258ca00533e +248 +0xa9a73038a28e40feb374819df3a26db846fda284de7e88db01e2348c0ca38c +0xa5baddceed5b58614c95b8a621d58cd4b12559bd34795ef5be9cd603 +256 +0xbe4850f5be6cb68cdba5948e3b94dbbce82989aa75b97073e55139aac849a894 +0xc11eedaadc5249cefafc5a9fadf39e812db700bd2767b8de1cdd6099 +264 +0xced78bf0734a527f5c07ef6c8adf80ae252b8cff100d393ec1f8c01150721fcecd +0xd4237aa1956d37a6dcab7b07269f18228f7e3156c3555cf4d3d68c1a +272 +0xe400bc8994cff23eae189df3b1e7e440a6b5b1786197128105b5dfe2c6fe9d1ef31a +0x45351adffefcfb5e39085461f8bff5f5652a5aa5a0401f04d4f56452 +280 +0xf15284a11c61e129ea0606bd6531f2f1213776e01e253d1def530bed1c3c42b3c68caa +0xfa425bc732d6033566c073560b2c5fe322aa4fa22aaa3ec51154ffd8 +288 +0xd858eed942fe926b52bada623fb8d0f18458e4163332e1c18c581f38cedafbba4d908462 +0xb2b308db948d7169c8eebb4d7a19be96d5c4b5849593ec587d3865e6 +296 +0x78b8ad2372632398cf56717df3b141a4f38d5d83029bc1f02d07f52949a39917294141d414 +0x71be05862b44e9f57ad9be17f1de185471eabd111c1725e835e09625 +304 +0xfaff894c4a2ed70c4c9d6703b6bc3a3d2b2cba8f04769de350fc0cd01930056eea03fe688da1 +0x59f5a8c843b982989a08e6852e34f0c03397c99a87864dfb1bbafe1c +312 +0xe6065e1eb7cf901c3b08dba4aeca7d4673c3fdbe60391c1b5d4d09202d7dd4ea8b6d25d379e72e +0xea8564c988cb67e302bd40df21a5f796a0a116846493c86c3a1d080e +320 +0x029d14c5a4a57a649a86c5f2e022e6ee098f29c9d4606548ff2775296038ec0931af0585acb4d9a0 +0x716668cba7b1c0ddc1c4b3e6fe3f8917eada62506b6855e5af2b54e5 +328 +0xe3089c05ce1549c47a97785d82474c73cb096a27c5205de8ed9e3a8c971f7fa0eab741fd2c29879c40 +0x75a0fa978c45d268124d8cd9ef0a08ecabbbed53412cfc7cb1c00398 +336 +0x901db0f70f2d10626a8af408c5d15196693d49382178ad0de3b1c1d8b3ef3ff8c5a59e9ae286932d0c9a +0x1470a4199fe4c7bc330760c1197e79457b1644764e28a62d386a78b4 +344 +0x0431a7bfbbec1bb8116a62e1db7e1346862d31ad5110ff1bb9fa169a35dbb43a24e4575604ec8b18e41300 +0x1e7590e408c038b794e9820b25d011c262062b96d111dccc46dc6783 +352 +0xd141753cef2e1b442eb01708f46719cd8653b22e1d9709073d7ccf9242b875d03cf19c2bfc7dcd596f6c6a83 +0x0f357b8ca676a86ca63620b2239327accbd4252814a6b8c56895ea58 +360 +0xce94e0126b020d68115a5ea41083b4717a13d9c57a5b6d0ae7a3237c19b62dd2fca2f42062b90dfc9edb68e04e +0x935d391d626a135772319ec93fd652bd9fd5680107c987872ae67212 +368 +0xefc2d81b30043bb26c8d2c7a7d5bfe8ee579e463122d56a0e172b63060a83495d88bef7f0b625c9dba78ecb36ad0 +0xd9214789b7b736a7b28cebff8829a3999ff0c7496095b130c1e2e829 +376 +0x5b27d6fe9981d136b52157b839bb5b78d7844df5a397efbe80986435d89889939139892c3c13acf58f56704315b0db +0x4c792bb6b1e33a3a042dd4a69ada802e3ec0bd839daa88635b225efb +384 +0x4dbe1290524bd73d9db5f21f9d035e183dc285b85ba755057c769777be227c470e3679ea9a7355d889bb8191ea2ea7e2 +0x33a5a8d6119bb6dd7b2e72ece8e4d5d02aa99048c0459169ee9e6d04 +392 +0xbdfa173995a5b99fba74d8e255b711771731a8e1851d7dd693733b9d7567d3bab23229cd7a160cb8399c6c006c21c776b4 +0x33c934b5102063213e7b53675c47b19c397fc3a51fb37ab46e179b10 +400 +0x9463c563aa1fda894757398e11b04a4b4cee0dce9dab01ad134f449a673cfb388349f42e42728a7977cec90630c1d3803c72 +0x4cae18a39a5ca4512b959da06bc9d63d07168084e35aaf03c8ba5d8d +408 +0x2ee6e813ec84c2aded5800fc1cae94c09054e25d6bf0c4d10296d1e83e9adfb342a3c6364d016761e241ed4227fe53788cfa27 +0x89c6929b3c19a1472a4524e1427823768e46451e48faa7a7db7c8604 +416 +0x864833cb2912fa44929287bd0db7984968e5920d49f9725dc48707222d655f7f2b6e7fb40e80564263c7f450c53ef84df67247d7 +0x2c102a8349c4e362abd6a258217763229898e27c2e721c73bc880752 +424 +0xe4dfe69723d430834bdcda7fa138f1fd26f22674be71169d914acfe2b2599014ff11d15c48108374b3f699165e78c7b547b08a6c69 +0x52310bacf78ddd40d7e93eb321da4de541a7296f98f0ad9745915887 +432 +0x6a3000176d0b029992d921e102eeee94dfb9b029d4019e4af06f517db44d78036a8dce00b90d49dd771994ebbe32c049420d3707e1df +0x07de1ed3f8ea774a8e5e080669206c8572edbc3f165870913ab1e4f6 +440 +0x55cab876556079eff98bf7b90e318f8ff583c2be55de882c0defe6996d1bc225a51ef7127df2a5cc47f2ca26123f17e72163fc859c3406 +0x811fd907f3f74b9f214193048d70eda44f3a7465cdb882173bf79a0a +448 +0x5dab016d4feb42ea606123c0ac4c3259cc7177af9cc955a64177b29f6bfc584ad8ae9abb1a673ac1997a8a73dbebd20b03dff2f89851482e +0x340b5a71ed65407a686706b068edb92d0ad2a079c1c88bf78ad8a3a0 +456 +0x0921afb403afd31e8b0839dcc15ba2c0fc32bcc90fa78ff8ccd51960c78e357d5d4cc2c6f469008583923de75679b24f0bcaa8f0e161df9b32 +0xdd30882cda2144b31ab179e8f905460168b8758d8be8d8078dd610ab +464 +0xc0facb87b9283d87fdd02760e4fa437b896b13de28786ba0cb192f9f263e5e75bf664fa7526d3b2073a5fcde752914ec8b6ef1902d1b70c5bd1b +0x1e7adf0737572d1aaa5d4c917c94d05dc092d6e59059df659490f1c7 +472 +0xe0eafe1aed719fd7122a3edc9df7c4bedfbc1b0c3b1be6317c826f9c6b68e01ea2d3b7939b1e74c40cf9948c77b1c33afcb24e37734ad7e9b7af4c +0xc260130197dc7774313c75843dd820d589a68df59e1aef7cf347f565 +480 +0xc32ad1f821fbd8b5b7153ea8aa11055ea8fbde548660ecae28a8cb2ba2a6d1599c6e9305fb67abf6bea1b9db2568a88119193349c834a7da90b3ea13 +0xc91ee4c740a5663b3b19ed778a0516c01a3c0cbd3dfd6c09ef1afdb9 +488 +0x2657c625f5ea51f66b1375f479123d863ba0514d208430574c61ba963ad2f191a6b8005aaad37dc02790ebc566228353ffd4342afa9ee81d35f6097e05 +0x92f1334f253260e513d5e6f0d1a6af6ed2fbbcdb7fac85c39d6d4040 +496 +0x5655c3671fbd8288ea14944af925eaec653408f56233650fc4391018c22f9977facd2facb6c5062b6e3dfc6b8e837b3a78fca153cd5e9e32e91f5e27ac2e +0x58d6e83ba02833ba0e23fe3472d28e8f986398620f7464ff18e9f6ea +504 +0x350bd6018cbbed86e050b3e7e60683e1f619b73b4c2e764b74eecdbb00f4018d7ce9245da4ede7e6d439afc8bf03eb8964a2a4d93ef3551abbfbfe1ff0ce74 +0xc8ec854e632b2c132d505affe1bc00ddbe99452e5b59ba76a02dd838 +512 +0x4cd27324c28364873c6ddbc3e3a7e2cda9e8a72ad2f72201b262f874b8739f30ab60c34334c2e92f9d48533cd8ad2312c3e7c386aaa283b50dec844fa432d636 +0xced6081761ff5259f132aa831b7a1b432d093fc857da0eeeb82be71f +520 +0xa4f2063fe6ec17550d7aa831091952dc4dc041a283c488187ef9b75e701ab0a25d6ab6e5cf9cc702ccf02cec05a04e37507acbda58cec933938a8b4b75a4425ce4 +0xaf6b7fafcbe9cb25003c5702995fd656365a20e113c8e5b10312cdf0 +528 +0xc1d30f33ab4b410d0f8a809eb5cb681ec9153bde26693b20d440572cce350aa009fe8108b3a0fcaeb8e376b48b04885f23ab8bb6441cfd4cffb1255a7c88fa10f779 +0x408f4fae70d0fd745ae44ed66740bdf1fec0dd4e23db06920c6f8ec5 +536 +0x61b34b8aaae2e19e2d61924642351ade2baa6925f7a3a735a72e76b9905b775a004f0f7a24946b2529b3c144a205d9142ac6cdd74a6b0dca9d35a5563107c38a317573 +0x19658b285db6cb9dbb4ceabfe671434cf1b85455a8b4da385ead830c +544 +0x3413b09d3d12a333680f798c0e488776579d3f6a65f20412ced53c085060a6e1c061ed6a44b97e31c20297479875a1458e0ac08d08e0a8d281e0b2db349e2f831c7ffc05 +0x008a3c6ca57853adb1af5d44595e62016b7af47226492b9f3c1a9713 +552 +0xb6e690d17d9d7f07185502bf6d275c84e3ac4f5f77c3d4b30d8e106603be84410c11849a3c18ea305f3e0b568f06ea540694ac0a306f4cd6048590b895703cb4e4f78578f9 +0xf51dd594c7dfeccef95e3d4024bb00f931a9e9516958c32d2259f5ca +560 +0x13e6b1b4f021d610c81c97f0f952daba2766034d815b5dda4603bcf788ba60ee31541d5b4353b9f6645d96ad99ee90f6524b2963a7b7e476e1e8eeb83cbc0305eb29902a5d72 +0x09900c5ae3074fe73e6c4eef51f785e57947bafbe1d8dea38868e3d1 +568 +0x3a300f9c2dc3531917222034791824b49436be4dda760f67a21e54211fe77394935fd35cc08c71559fd231a2551672f46324e4081d4e9e725d566b9a788f6504713ec6d46d46fa +0xd71c18afd448113a45d06ba616a1945a567e26f336cb94a45c2519d7 +576 +0x81c64d2313dce3126ba16d3216c0f334910f063b00720be322fdd68285587baef66860ff3c2b971506e46bdd21793911ee1982fe14213d8a7241727558db04dff6abcf0b14adf262 +0xc85acd75ec4ddef1f179f98fdcf8e006a1d80afc14749310aa97599d +584 +0x09645b920bf81735d6b5caa43bb76dfda7497003a6595c2ca62ab7f5fe4928792ec2db426893275f50616eb6016a459c50bbd5a354a381b32667ca5de5376f6bfd61d8bca9c5b44fb7 +0x650e31a81dcc7f3498900d205d611b101e89d7243e1dd77551b6c422 +592 +0x3fd1d8fb9e7faf18a49a1bdc77fba093cbe09af00d461999e19aeee7cf9106e63955f7a491e1d9a8c9ae57c00a8f0500a8d9f50756c88584961e7af9740d53bf7457d74bc9b4f1afc774 +0xfb2589e942890fed8f99ecfe02d3a51683a5da582be9dadd25305d33 +600 +0x5af0eb316e793fa9ea9d5141fa26cdc3cfcf9852976163a8ac1d81a10b5af5fd096fd06141d3baa0d183ce39c6a4ab21d46ac7c24b38074346098d0a250ed27f3e98f413d0395182382654 +0x8f4c6a61321c6e500cf0dc2b7d7d97da9301f71420fac604feae19f2 +608 +0xb26d3233b551029077beea92859889691ac3853a9f972b2a6e8e55b8db40914f75927f1b892a7b1de8267c7aea0d3c19b3059a6cb5473c8e76d1788f945a750c068b8d02a46cf6e3ea1da2ea +0x4d8360f3692defa11eda027f94099b3054b841f809d2aeefc885d2b8 +616 +0x6fb0f3856dcc9addbd155916f0227630959f01c764acab99bc80dc435052ff4b1d7921639fd2baec4462caba213c2817e3a5170a09771bd951c30bcc70ba663406ceeaacd114639f21edc20a8c +0x71f8e09f911dc8ac67999c10c059c203af4af5e436eed8f8a97a6f2d +624 +0x8471e939d4531486c14c259aeec6f3c00dfdd6c050a8baa820db71cc122c4e0c1715ef55f3995a6bf02a4ce5d3cbcd790f72087939b05a9ebc93a905ceccf777a20d36eddfb55e5352afbe8ddf97 +0x065cb93bb2406003776440d9a02af1e4170e777c7d2c13a113262ce0 +632 +0xc87a7448b7189a11e532a4320874186407fb32470d18904cdd512fd265a9968f95225132717fa146654e725ad9268d5f062e0f5108de1a1a340acab3ab1c6b8c2fa1e92e3607871f3da4d4055ffbdc +0xa39c7c5eacdb22669587a1846c2975b41f9b74833d9979de2d7f11c2 +640 +0x26465ea06dbb61b4193a982c984a0358085fd6f14ca027ff60ede9fae9211d301194476691e51fc20ff68ae9ab37c864d528ef4861199816dd34d8e022be72ad299a4a1f200f1d53bdcb7009d327c605 +0x21afd5f923bc7bae234f14ffd662f174b4d179c7241ddb57576fe502 +648 +0x5dbf5c2711e26fba3423ecbff0d56eb8c934cb6f78ee8e96f6e2a8aad727621dd95096b3bdee1f2d55578e25dfa61e399103eb6b75255ec87714ec48bd3400f6367f35507612c9f1c1eb4f6d65f1a37d4d +0xec5a139936f2c42a1f4110e2c52bf7c3cd3bae49955c608fadfa163d +656 +0x25be46e3df2595aaaa9be9d21017aa2d64306720488c79b4719ce3eaaf867d4f276352d1e3ab46d18eedfc7978c4f650e106fe0b733ec5a7105dcbb4ceac7ef44005a624f843001a49f72910525dbe40378e +0x276a0dbb542fb69ed409a91994625f8469b051be25b5968b3a6fb0e3 +664 +0x2bf69b4b50312f07fcd68d466e329cea515af2bc9b78df5eb664ae82de74275aca94594f8e9996f6c0d2be40d9e0c1f1dfc85f534147322b0366efec1a4de92b1a5cd6530e78d69aa7a3b1339ad060c543f5d0 +0x45a66110f93ad7873923b97336c23e87642e79c7897d9011ddecf03a +672 +0xa81a32139d69fbd64000f8d4a6ee10290ccc83e8c9e77b6081a2e59e9c157e33f6fa3137d8caa08d28230169dc6d2b10b4bdf0df29f9ae8fa13e21b7e47e7b92d36eb703589f2ad699ea5b49711214cb20a5b903 +0x4143fa448de5ebc14aa204d934ee3971051c4e3074d4caaf0cc62af1 +680 +0x471e434b7ef39a0551b2ed9250006353ecd915c82b77649ea1768fe99b3585ae9d7ff7a40f6bb23b33802cde5a1d5c755818cf2f35a6f97e257bc963ba3280eb59eec2faeb42ed47d44eaba8292bc3901d8a35d5bd +0xa12a51a59f116f87f757f2fde30e11980d7d96ebc959774a734ede74 +688 +0x3e346c6aaf8f977620c3ac68fb608aef432d6cab296d1a93da6261949c10c07a19436414fad35793b827f434aff89e1f7557b18e69f2b9318f93e2d29be9b0354b8bf042fa3aef657366e93603f4c455d23ffe98725d +0x307467396d59103a897e6a5b16dbaa2a0dc365e22395465a035fd293 +696 +0x1ce1f01b46b4c9e04ce4b5e22fbbed4b025427c55848b03df98bbbe7d990f9834ab469de70d9729bf5512f33ffff0a3b5fb88ce60cef73cacf9205e73f2fa5e5f05ba49de85459db52e57462778a8f31e9d50605011009 +0x5ba94e26394485eb0a9e3f3d3d9a6083b35daed5f0c889bc78924c35 +704 +0xd624f63f53be3d6c0a20c12263e4436e462407d72e3d854280d361131c169d9531430e9c556d0c69d57d6ecd4978b6926c0088162b1e6139fc3e8579717b395c0d1d330f56604f4c2b78838058d1152e689b0b8ebb86e47b +0x37cdd523d922362ad463216f340f254e76aaaa0b45f6dffca30d55d0 +712 +0x7f601132a3833a3e2a33a0f1a058d6a2db06f11e39afec8829974b64ed89ffee9ec98ab070496353371f9cb62a37c23de745056cb8fe98b415885b8c6a2fb8c41a59ca16c3bcc5ffc4ce92cdfc7db9f8d52184b581af62c984 +0x10871c0e562e11aa59406eb4bcc832efe4942260ef08cfcf99e7db58 +720 +0x12bf3a3337d3b6d553bb8cea92c369b930048ed2902c81f088820324ff244330bb9351317472d5822d8b01dcc413c4c2c72f411c89b77f227539627ba341daa6a9d75a9ab44a8ca9d72c43aaa29eb157f7cedaf419bd48320646 +0x6f763886f273aa5f943ececf7b765d83ed1a78b43abef25907226b52 +728 +0x424f1d07b708e60cc4d00396cb0e90597f3977aea7904be61f0b74de1f918dd3bf6b0a78bbf91e4674a3dc1438139ce7c3a1a00b060ff7632777a2fdc881f6e98cd9414cd7e1b0b0d6a3709ec009146f5b50375fc1ba62e3648330 +0x7742c1511fc5a0297634fb3d928a058626518b7fb88db428e2a282ae +736 +0x87e1b9edc7c6576998ca27a41ecf90410327adb96db5e8a12d4eca2c3a6511f05de803ed2d6503cb3e716263964a778160bbf2e8e5406d97b76b444b2f86a7451a7aed4db0f02bf7c6b506254463c5cdd83eabfdec5c831cd6097c72 +0x4331fbe48d8a7fd2e69ab0279509131d44eb132427311724e2dc19cc +744 +0x8fd0705684ca323c8ace2e7791d407697d05d522357dd23bf64f5501eec905d706fa46d5ff72f8b5c04961f0ee636724bef103b9073bf2c49c9eae2bd8d09c0b7a6c8756b3aa4dc17e6dd8dd3084508350298f76a8ced6449c1abe6dbb +0x43ee3b234ea91228c05358fa56bb5072031fa413be371413a257a0da +752 +0xbdccba55407761a6b90ae88ecea8b95ce13ae66a34066d505184bb58a96c6e327b145fe9f7f9e016a49b4254ff8f9bf365cfc5f13254aa252be7bfbe1934cfecb720faddce5cfdeb9f3ab41481c0ddaacbfc1e4bf4964a14f9ace012ffd9 +0x21fa866d8695008099e400210d04a2013701887d7afa98e8324e96de +760 +0xa8aa236cde557d8d365e6ed356636ee9117f7ae9e6bfb772c9da59fb271cc36724a4efd927cf11c998f47758e852b4e0d246fdd0e1c2d3b733fae39e7c602a9b4dd35ca3971387a06b79f3c303e54e1c06f705680882f52a503d43fddfbc88 +0x102fb3632c675224b30ffaa5a322aef3354e1ff0183cdbfd06e5a17f +768 +0x44c6c75e377f21fc9cd7c164ca5c4cb82c5538a58dfb323992e6bcf588c61b246053706bf88725a09d0a8adfcdeec0db419cd7732b0e3386bc3f3407e9e016546f4d15c314bfd57e30c302926deb3342cbc315a1e706c5607c127de42a9a739b +0xb9b62986eebdb35c88b12e0257537a05394ef5a16fad01c2fec57d6f +776 +0xd3c4a0b17f46cc5653bbd8300dfb0df6d0af3fb7c7639a830bdc9f68c7ab69a09a0235083cc721d465e73481eaed9f0c29d34262a8177217f912fa5ae1865f29b97669c1133ade59a1d2910f537b9b23c080e963c753f7e676dcdafd2a118467f8 +0x49e4553a6c26e7a82cf70b15528037cdd658ae33653bf4ce8e86799b +784 +0xf6e3df95a4526aaf671b1ab9342db3ba0a6043da82b355c4a8d7664e09f29d5c0d9db601872e40e88b3d08f38061d521753b55b5b9b65895a58c3cf0bd0da823f81c7ede5b7a0a82cc4780ce26c5a5bb8960cca4f4eb04aa152d90575f9c97825e68 +0x4854cb2a3a9c9e3ec91b4e7d79a753f6e2240f4b6e2050590d6f1647 +792 +0xc472244bd3325a84d37220e7ca6ecd40e3f20e52677a811ce8987f5bc0963950ba5c06c30e95fb48930ebdc1305e932493ccbf7f266d0f393f8daf9a9850418dfe992fa54d2b405f9b0f6aa7b435e89dc75e8c985e38556b93cb44e881156ca3faf149 +0xd459400905f4c1eeff90decd9cc994b394b21430379d6328c03af436 +800 +0x8ff0520805a336aa768a1a75f2bec3ea876ac2246f2d496087bf3ebc03d88e3f604dc41a9b7cda2da1eb4ecd062c79c5f9041d9a78cc3d14c01631f90894f91c6e36d29632930754228a0ad25529c3251ccd283f368b0e6f43cf3e277b43cc02a0f3a405 +0x616fa8495f55e77a308c223afe470b42c0e1a014574aa36d01f484bb +808 +0x6a4cef9b8dca0ad7767515c8a61ac32c730b2894b60a106bc5699534a170f11370ff908f2d746a969ecf8fc1861503da1df2cd9cbda14bb9de11c8224440508277ebc30b746a2976a2d64545076c6d4cbc36996f9ee8b9ad47084c5e3d512eb8685ab198ca +0xd20490eb9633a321a69eb27d42dd619aceee533e850075fd16589bef +816 +0x9a4fd44a08d9f5e7731603ac92b18e3d880ff2d5b9d7cee6dbb2b7ff504f2df3b3abcd38b18fc98d1a5a96df3700e46e5f53d32cc581646594de2da53ee452d71078b0aa0b6f5b39ef514bea985d52968dcd51ebd75bac0f0f03fb86bb0b0356db41e469be84 +0xbf3a90e1e0e8b1a20b08331da3c1996c8395a1e3b835799f879cc7df +824 +0xafce173b057b48406e163584c8d8c1a93b15804612c2278dca34412b692a2470120e24b0d57806e9cbf4b8a563053f22f76af0b1a39fe35c56a7a5cb29092d69f01911c20f78fa2f90de56b672174c2c434cf59cf184c9eddd6a57be31513a95747548395b840c +0x373d08139139af96f22810c8e8443a781c88344b73b9b717a97f4a04 +832 +0x5421cbce307d2c89a27a7b0a1d515e6927002bb65d3f0990b8b452f3106a3c52de80b9e6461e9b4555adfc368748ddc48c6d0d914bf94d6d2853b12782e749a380d6012d0eebc60d22d2ea5c4484ca164d06ae706f53f06b759761a94c9de87fc38b6c4d8fcdf40a +0x5bc1dcf59342499195a61a0661af7a8e96097660a9f7e576572f3d0b +840 +0x5add9071d1d5d1799c0f9223109b761b7b9ee1c30aa20025ea300a2baea1c512f1314b1c3c550e852a4f1ab9c9ff9ac444fc9e0abfe31b3883ef337a5bcab7ef3da3eb5a2d81891a5fd7085c9c581d8fe60c83185fa4f847670b888a053d0de1885cf7926e01491e84 +0x0c370410dc8e22ee61c49d7a3bd3d7e80cc4f3f51acb26ae4ec5a3a1 +848 +0xe965ba8d1236a10b362cd75cacd0175cad0af65e13d9c57a6047b729029d470fd6d3d417ea4a8ec587be96c86f7661cf63bd5e9ee896d8614bac1d40e388e0339606dc189e0aba038d6f35d58f407c10f02bd7e9de328e9f6fa4070ce64c2e7a32e819b7b7dded6c5128 +0x175c4a7fa491e7dbe3a2c8604b07bab0e2a2e34b270e16b4392e9716 +856 +0x314158336fbf7845251e1a620613ad8c1a5996e512ae25cdd91ec84b6b837faeea4d9074ef7f7c6a1efa3115fdfe815106eed338fa531945792402b9d045703e124d2ccb6a8cd9c7af4d26713958487ff3bba805b2cad899c565ccb5ce79475dd0c9930188ef75a4019d60 +0xd6cd1901bbeaf4b69a7c211c50546fce3538a8388460ec29ff8166df +864 +0x2c2d86197b39c194c65a93bdadc72a9e590fa75fa8ae6b758adf9116abb2bbf0525e121a89d8884b7ea5614a29ecf1a52fcfa7a606fb4a835a7e83d5b0da9c4b4a5787a04a9d22ca1a81b9750a20ccaf3b2a13e5bd81c00ef403042640a3d4dedcbfed9207ae167b6298a526 +0x49dae21e7733ce09e392dd980ec3a0c2c54269376e231c19dcf5a774 +872 +0xbc106b071b53c4d855e1a3dda41db1a7a4460586b448a3fd9fd842747cbf532dd2763e7900f4ef2cdcc4914e9b5a9913f1a7070d78ebe8a156cb20b81ba366b6e81d90b0d60311da9551c03e548fdbb4e15d4b0e1250299363fc82afe05257e8462de814652733c9c8b1b71698 +0x3baff8bc1f4351fc62ca40904a002198b5ef6924afba1d1fc61d8ae1 +880 +0xf627848c4afecd8df33da19c606aff119a3762c61c0539c3e6a8961bcd6a2a111552717f41a62a792aae0a2d4fbbb10d6c68dd314e20def6e5e04aec9b3ef1efe4ab139316f5d1c67c10e2b0a51587de028bc1a0b1e6c1af934da013a4a050448cbad39071f3aabc10e991ee0c81 +0x2e0b5455cce69262066fdbf9390ad0dc56138b221b75d51298bb5b2e +888 +0x15cb777ef3e451b928dbf288e46a3627044ff5de42add884a9af6b424d6e7399381581a6a743c7a577b02bb5da149ada4e449f48d09e34df4ca8d8f259f4e14c23471475a8f97331289f564ad6e8bd8fd4c5e51d5ecd19dd46dfcb4ea009e385bea857725fd1fc6423f09ccf42af48 +0x9fa12561f1df9a2d793292e0f4df5327af529336b5b2118952f5c24e +896 +0xd24df75a00cf92677bb41a620fae519723937ebfe1f7b430970056505d76db4ff91acf16ff391a7a3d8085b655127a18acd80bfa831837f4644a6850c0273fbed6029449d65bb98a47b2ff1ca6997c50500d0b21a206936a5e4d8d56508ec01832ae4fddce5ef6ff62f1917c486adea6 +0x5cae12ea9652269ea2aafc656cb83424746ea1d5d491f9a159594b2a +904 +0x730963b1a462d234e8705db9278cc58dcb817bec6c9e62bcad0ad57c6158ec77f35bfb3d043c5c5355c96f2ae810de4e622d26e0b4605346fa630a21a3facd7fd3cb7b5305701622f5cbc9febd992ab83e4abc52c111b8b3de370d9e9eb4a5e5dc00eadaf1278907901c751fee4f303426 +0x46c7046aa633fb5bc4d6952f853e39c53e771009183b66961593a3cf +912 +0xc1460b2e1e385c0b5756e210bffaa8f1cb12ebc3c60e7105c5fd1ce0def2beae95ad2fba97779d46ab4e24d3e5429e9c1c1fbd649f4c577124f300d90162defc9fb2b9522ba652678ed5f623a00c524f98ee8955c8dd8447871e8a236e371056c79cd27e428b2274ea35808a581e6c1126c6 +0xd8402ee634e18c967d110bd7053a302da650ccb38f259cbee5a24715 +920 +0x48a84e3c4850a29e433c8a243bf4beb05b8a5bff38cc418158bfb968f1495cfff22e303e473e139b59cc5d22d561c1c8afb274fd66d09180899fbd777a8907bf72731181c5f0750668b562ccb04e86d95c0f314fd64cb741b6cd16c5887cd84acf613b2c4ad0908675e1e1485321d6896b87d9 +0x3748808c1a4d1dc1b82ebab4cffc9d8cf5c251d045dc8affd756dae3 +928 +0x41b2b071ee6a8e0bc62e9e03a8705f6da218e69b111c234c0a516520f981204f88bdef9bc3f4d58379c5c8bae59270d78dd62c4e6bb8569f4be0c8cd74899e128ad73ed1b36b96ccf936a597f08a3d4d987707818454c7773c9ce194e1fc1d140fa9a7fb07f75a4e0e283d8210814e3589a47f1c +0x8776f08070e38582d4604170a9e658fc17034cbde9e03a002e728131 +936 +0x54bf375944c002ccac87f55ff3eb58c45844f62d917ddd03b26b5fdb515d5ca6e8f5c4277a3657ab7addaff4e8f58176bda620c6894e424f5bd30747e13737e1d06ccbc4866ab0bdef80c7b0a5e730d55b9dc8207b70f0010e59914edd0c5d7ed5cd5717b0859569d215447d71eaee49f9d2f825af +0x0cd690736dd1f390694f65c3b89e0cc2269f3b8208c806929a8f8cb9 +944 +0xd924b16dfe2f612d923b25669b45d9117d30a3531d5d30ad477c41734da2677ff19b0a268581b06b518d7c73352ef53990580a83601f5215aa8498241c8f960df19e014715fcc69689b594820aa99a08ede0928f4e1dfe1e69b6b1cb48a292779fd49db8f4c72a17025b727c60df4fe65e6f435f3080 +0x304e38689250380e322505b4e23fff35b341e2d94cc62cfb44b51db5 +952 +0x7d2d12b351a70306230e7dcc7664ca3883928093395ba8d5828f1f76c8813d82b8bab5ec45efbc24f0316eeb47646d67acf2cb7258c12a38a0622101768be24b32c71a1c936c199600cd33cc14b266d45a053d1e55cef303c462dca123d601e775ba0aec41046285db4b9516e436fda814339d3c376c4d +0x40a7947aad6c1e73436d78672038fb99a4ed7cb145445e276643cf38 +960 +0x5fee687802a5aac1332917cc5d0a9439ad95c764219bce45e2743094d34413306a7db0c1bfa5059ce25ac9e87293a5ff6b28a1174095dd222afb81f3bf67f6a1c65757304a7a226eedb8341c7f72f44ecf0bce15c1a7e35aa132fe0db7a5ca801c84430dccab6bfffb4b3eb0ad30e7ee814534a3cd5948b5 +0xd6657f115db759444744a125e40ade361d8a40fd88c91187dc5a50b3 +968 +0x696730b7eca27066d541c4150a22e6a6b062c951f2177df6fd4254b14fff43b032ff8a418338972fb8db284f2287b1566ebcfded7292170827ab6b73f16629ad2755eafacff296b4a98d85e27089e40c5cc85b4deb64eca9e1a01fa18d1e5c054f52980a5736349caf3f21f57c90496f816f2a96e4f5c48235 +0x391d6c2b645d1eaa7a7dd68140fbb7c23dd4ac0347887a782e4c3442 +976 +0xc8995ce09a8d80b790789915b77e53cb2ba0b3974327f0a509468555edfb843fba362d75c83dbf07744f8ecdcd8756609004cf6a574781200ddcda0ca53d7e100bf3dea85bfe0c6f5277cee50274f16fc92cdf9f835c74b6ffe90e67b0c6e3dea5189801bb980ff6123980e5bd0ccbffbe600cbf312d706fc7b3 +0x3a6ad16c5957b54ee6691d227b2d2ecf9348b68435a50647a2cd55c9 +984 +0x247f8754b008acea234d3b5cab5c613a695af8febdbcf3e4c5bbfdfb20015d7cf8a91d5b3f666b1d38023fe93a0b3ee1b1c9dfb36572cc6affa18b8bc9055d5db5566688a18e0fe1d955a985ddbd5325652f1da0a3a66dd7c81aa2bdc940f8ad6370ab015de660e00d2ec0571dda66ab8f76fbeeffbe9fd1280e8b +0xfe66026c1c2410927fa442cc122d5aed90308273401d429fd1ac8f61 +992 +0x93dbada71b890e80d9b88a338a7df020a7bf9ffd9898536225fd3e8a2da25b589a18ff989438b188f5c53b96fd4d016c4850922afca57df2471866aa095858fdcd115da3fe554ce35840e3569cdc15ed8842a5350602f4daa4c5186b44312d5c140df051c1a68a9ae871a9f9cef1d5ac50db02a71d796122224c7c53 +0xf73154e76b5998e0792fb0ab1d721ee730b64a1b3a543061fc76cd17 +1000 +0x6178736ea6aff4b99e7da97dee000adf72b37069df8ad5bba63fdb7e1be6109ad6c871a9596e2dabf4fcabfbe6c1cd82c50b772a20404b95622ab710f99332c2b812c2297a24c2c8097ee2193ea26fc969b1d524f28062cf41ed4cb5dc74f643cffd6fd851f83b77a4ac57c03dcc771e254c92419f72a0cf0b30a3560a +0x33a7425316d2f6be1bdbb870d953132d55e29fdf8530463977940908 +1008 +0x1c21b5842312111a9e2782fe97917e946b8d65987c43c91b27ed0cc8f63b316c16f6ecb60be5fb3ba2edb9bc277bf1acd927f0ed9b91dedbec8f4e8b198b1354b126558f3a21e59c227ece26f9e22da7dd3e422e35aec660a2a27fbc323b1324d7f81a99189176470723e7c1738eda8d5e1b82e3b1632ab22f6ccae4a814 +0xdb43ca3dd7bca3d899648692e4ed8f03119628df313e1573723c58e9 +1016 +0x4b9895235cb4956aefffe815415252e7d6b21921bd7f675315eff071d0bbd429b718c774aee96f6c3a330d5d40d1601e1069c7a2a19ea5ca1e87097da2608ffb4180816e478b42c3c4e9edb748773935eb7ca0df90dec0eb6b960130c1617880efb80b39ae03d617950ace4ce0aca4d36fd3ed0112a77f5d03021eb1b42458 +0x9a9176e97aec99ab07f468f6a226876710d6d877021d27061d4d0132 +1024 +0x9e127870be2431bcb4f4eb4efd5c2a6c5870c55e7a5e3b7503994a4cb136be4ed396887801450f600b22cb772fc00f8b8f0d2690e231a29f69b9f13f24f531e4479e45b5e8bc2992fac782567e0d7a59f853ca3a20bf18dbdbf684ac69817e2de075daaed9532659692d3b73530a12df7b8cd9e49ed0463041962c1ce7a24c31 +0x7e2cf6226623535784c59cd6a7b27dac60ee23fdce8a804dbd6dfedd + diff --git a/src/sha512/formal/model/PriniTestBench/testvectors/256.txt b/src/sha512/formal/model/PriniTestBench/testvectors/256.txt new file mode 100644 index 000000000..e134f2816 --- /dev/null +++ b/src/sha512/formal/model/PriniTestBench/testvectors/256.txt @@ -0,0 +1,388 @@ +0 +0x00 +0xc672b8d1ef56ed28ab87c3622c5114069bdd3ad7b8f9737498d0c01ecef0967a +8 +0xfa +0xc4ef36923c64e51e875720e550298a5ab8a3f2f875b1e1a4c9b95babf7344fef +16 +0x74e4 +0x0c994228b8d3bd5ea5b5259157a9bba7a193118ad22817e6fbed2df1a32a4148 +24 +0x6f63b4 +0xa9e2427cec314b2814aaba87039485fc8d3ade992fa1d9acbb7f6769460a7317 +32 +0x2bf98e7f +0x97d455e6881adbb8bf26ddc3ef120df4abb330adf8ed2ac7a4b6cce4a1727068 +40 +0x77d2ee3fd1 +0x329d0ae26df3646fb7db0b322cf1f3488d5381f66eb376fee40f0596d6d9dc4b +48 +0x7dae8fc020d9 +0x447044f03bc30e2caa245d26ce4c72c1454f708cfcd9a215841a88cf5ecd2095 +56 +0x5b48b8b01a59d5 +0x1a86b4d34cd104c13b5b8d419784ce4c6d35594f2a9300e81468f4dc0634832a +64 +0xb4e2e8501f54be91 +0xd25265bf9cbc0dd2f108a2f5e8f69db7d15e5b8fe9100fe887dae20b6e054fe8 +72 +0x901db0f70f2d10626a +0xf84ce7a760c85e67872ffca1722b1b7741032d9139211077f963a32d9f84771b +80 +0xf24d98591ee3c732a172 +0xda234c1d6d18ad8f53070e4e5b9cff75385c13f3e44b014fc45c3509d0d06adb +88 +0xbfb272537f021ade9bb330 +0x7c49a59a3c3fd8e24de85854f68a3b7ec60c2031742a9a2dabf49199d88c2db5 +96 +0x0a5f7424babb5cb85715fb17 +0x5cd40c51502600f3a0eec7b3a3addbf6672eeecc50b3de2fd86dd1c0a47e8a3f +104 +0x57a10308aa2060aecad05adb2d +0xa5208ece1de1342d02ea9ab7cfe537a2c81fa0eaedb427a7b3cb6c291959a6a8 +112 +0x5e4674e97a257c231d8e91391d0a +0xa88d7cbb6e31e87a6c99734f599d1588cb9439979b8210800eca0aa2067cd556 +120 +0xba10b0da70e2a017cdc63f996dbc1b +0xf8a5aa22937453719eb40b1dcf68a346e202ba225f4d7acc87e5a736abed3423 +128 +0xa3481996c109c9efb6692b82173921b6 +0xfba0f0813ca5c513d0b547419a15e27a7097d3eb280a298c1c693b55e03d2d2c +136 +0x0877c20cddcc86b833f7bc2dcf7a709a2e +0xf4c3a2604e2725e4d179edd1b445ba489979f4ea5937e0c6b20b422c720d8bfa +144 +0x69445bd12f022f6a669bebe0467729f4dc7c +0x26bf709b3474554ab8dd12d9524faca43034118bd955fc52cb1f355c6df22391 +152 +0xf751f428a0af0b90a912a3be78daf12a765b43 +0x5e0f8a8739f556daba4da4e861f39d1edaaece0204963942a4e66a11ec1fcf13 +160 +0x19829a8c723c58ca9580cdf0dad2b6d38cdf60a5 +0x3aa791b396ab81df9107278b8dd1c46ee57579db4cf5f9b83c54b37b0a601fc9 +168 +0xae43132ac30de180c24dadb88602caea91366b8e51 +0xb9f0141ba006a3983972dbaa5e2bfe7152e38110e02475f03d84b0a3c743cda9 +176 +0x8d2782a7843aa477b8f3bca9f9f2bafb5813db4c8c43 +0x5424b31989031809b5fc8969b7c48b5dc0c233fc34ffb5b223cd5f3a9712a8d6 +184 +0x72321fffd7918d4f5cea105cb0b884a2356af11ebe1267 +0x17e3fb33e7f85b1ad5634fbbce9b5f9909f3329f4d74acad3dd0941c1531cf54 +192 +0xa7efce3e31433fe68d75145d84bb02960fb968871a3c2f7f +0x8ff0be0601e3ae9290715aed30634b13b8eb6f3c8b3294ee9b1fc342c260313e +200 +0xd4d022cf90e6437aa0bfdb89284244c16dee0b488bc345ab66 +0xcb3a62feb0484be0ff9b56ea92414c7083f2b5776e883508b3a61e57305ee83c +208 +0x95de55287ad3cff69efec6e97c812456e47be25e433470c3259b +0x41c7027d16e37259645d0173c86141f38d808e9e27dc2dfeeaf335ed7c99490c +216 +0x63d8cfd72768c44920d7b015460489ad578c063be19053889cb809 +0x876e59c8a64faf9d665f7cde5d42fbb331ba818ddcd284491ac51ed50e1613be +224 +0xbd2c5a9116bf0d75b3498ce2ee4ba2868e06e0c047ec40b181540896 +0xeb537df04d512c2fc844020f8ff32e043c04614b88cea0a4e05e0ff32ccffa06 +232 +0x37a45643a280a9d1a1c83e094e01173acd8aa16825252dee4eb3a3678c +0x80bca5ba3e632e8bad1589cd02d75d7d3e6a1aa9ff64c2b982d572f3d00d947d +240 +0xa7be84014e8d09d8d51657789c07f29f7da49c5b5c0f836fffc6baf8206d +0xc575b2ba075a63c4540084493636deabe9b8df61952f071559394d4dab810e08 +248 +0x93c45fb91dcba420820bd3fee334b48fdf7b73d7b431ebdba79b2310a7fe19 +0x98151839b8f3574e0a0b9f19e84afeb1c620fb2dcef248149c00613233337997 +256 +0x1b77c8dcfd2fc4b54617054fa6b14d6e9d09ce9185a34a7fd2b27923998aab99 +0x683b486861e598dabba740ac919522cf3b609c18205b6beca4ccbe6b0f6dc6db +264 +0x8d5cb933401b35dc34b15de0f5474d3c9b6aeb9057531b7f4b6b32599f0eaef7d1 +0x16c523d2b8830ea90dd6b6b1ca49e4b51673006ca30ff47a4dcd4e7b35ad4f62 +272 +0xd6a66d66bf546b97ebd033cbed3504931e45296334ae28f4178d3de6f03106aa8221 +0x3f607a5c7aef13fe98dc9f6b6a4b52979e7c68781ef5e12f69ded20c497eda47 +280 +0xce885ffb340fd7a43e2150699b3f98ef334270036794ec759aa01d29f087ed6b551549 +0x1071f8b57328b767209c15a43e1d8452763865ac93d58f93c840876c1a5b21e0 +288 +0xf2c28d685486be99afe87bf90c9f309357b44f60b688446a1918aa321180bf4fe5be1559 +0x35bd192cc10fa24bd7954e0e0ee20c09440efc6416e94ca25a47e765bf32ef1d +296 +0x96e8e30c75fec82bef4de7ec8e053ea661cb72bc4eb9c1c1aaa638df07a826794dd8d00f0d +0xb556798f76ef742cc1eb5d10732a925fd8208b4f079a6c0e1fe0d92fd87564a5 +304 +0x2915c9b58835f0ec1e011fe5e6db40ae3ef3d890e268934d1bb024a634394b202e503708b543 +0x3868885b4e3ae2172305acaad25ffe9094c72348ee9d7b0acc20029e26a7d013 +312 +0x673ccce2807cb47622b7e09ee8efd812b44faeef436c301505cc63cd2ca52db003e652c4827ba2 +0xc7752098c3b5fcea98425a180a5c96146b443aa8d76a0c79fdcf3716bdd2b906 +320 +0xc1a6ac69f48008db50958665df9d911b78dfe519d9f34366f6cd691f90f741d1081e592676d093c4 +0xbd18af5b2b24d769eade525c8fcd535212abf8e5df180d7f3e3d023033fce192 +328 +0x3cd123ae7bfd2b31613ecc5ee8b86e8e59a52ff46aeb2bcfa9f4fbe41eba7b2c2c21d0cab98aaa3f8f +0x7ce19714e1d3be680dde0e919d90157aabca76439df8f0979d19b3a686df6b28 +336 +0xa52dde5aea1f04399c5d91fb5c4e62da06b73a5d9bdc5a927fe85298e58e166187f154b69ac1057c01a7 +0x035d362a4265031434c3aa153ab4aef6b00d5176227197430bb62884a085c5fe +344 +0x381906808394c5f9385a06bc9b6e528095e6f6ac07f0fc755e13594768b7686766e897d662576178c2a17c +0x22ea5298af2aa311a5b53f8b2838dfc008ae470bf96d2bb6794735ea72108879 +352 +0xa04a5d5d613d23703ab8dd0093d354829c5449823bcf09eb49124183fdc014b5a83b6b93a3c78c1b86edefb9 +0x8ae688d5e9d0de9de834befe5c0829644def9c5da71ae0da4f79d1890487e25b +360 +0x175e1059931a94e6e37ea53c87e3c71d46be2f410b2131f8f285f810a3c679f9df6fa9275838eeb8c6cdd45737 +0x5641036ef6221e08e3c795b2ad566aac9a69f85df1a8d35b3ea2b780ced33421 +368 +0x3ce38a2e287fda13384cb306237e8c74357848818d340a9488e64a157ddc2975aba9016f6f82418ebbe878f0c388 +0xbc2041029b16895afb1f59f7280f8a8f09be5dd241c675343f7ad8d75b834b75 +376 +0x9628a195ca6e708cfccf9f434dbe6c5105327f0f28ee1cfd4a069d62a39f203366f67d364fa47b677b20439b7d8514 +0xdf6d891d2c204354b827f530c54652940cb483f58d6b433973752c1fd1d2f84d +384 +0xd85bdb2df5d72f2190e4b3d4fa5b6d848a088bfcf0af52b8c64c584a689ff3fc06e8f1b7f7f0892350489210b6d5f315 +0xeb2681edf92a1f5559d10177110ad21ffd3fc1296e3cc83ece32e42f56ef7ded +392 +0xd078a5dc6ec589117119ba3cfb9b11de57fccb563bade8b34a4fd2c7dd6b3f7c0363586cc7a81babb12efee78f1dd5b474 +0x0fc7046f02d070642d821c746785f209bb332690bb34335e6c6428051793e1a9 +400 +0xb7ae6037d9b452994fb755aa0cf57fbc687298060a471f9b0c3d8e9d5a9ae0ad5b3b4fa7d4e3628c09d327c0259bbd76db2f +0xcd1040a0d94382a6446a691c0a07c4f643edc11e3103e343608603b5bd101be3 +408 +0x62f016dfc38a4c70b7f95d669e2d475704909e13c997d3da7e96b6cd11d83aa3adef789ddc49f7bcef042b319f033b15f44208 +0x8aee50572b6b155cf40d6ed6c738bdbcaff2ade09bd4d8bc9c2f9a673373c44f +416 +0xbe890898b03f7cb52a9d4300ac2e8a80715102b1538fe37ce92c3165f2fc3e07f67870bd2a1144a395c593bd71ef1475d463234b +0xad156f2f416cceeb9a6a2520e79bba5295b584c59606fbdfda6ed13ed9d99af0 +424 +0xc12149eed4113efa31bb3c4b9aa933639a0e1ca716062ebe251e553a2217e07affe779cedb015bddd7d6bf44269c9780644e7f0e29 +0xb4941556b37c22c9d841bd0b1c4e5d8778b1c598d8b1ec55c4cff11cc7402d05 +432 +0xc579bffa9396172aa1d654b47930e65f95c0c74b6abda382a5ab3bd0b4d20bd588ee2a58992873de2b45e27bd01e40e92f5003d70334 +0x63f898b4fe7a7d8c7ac776ed7811a922052791406429318fd5386a8f7864cfc6 +440 +0x71b58f40e28bd9427f0f7821ece9c6e0f34b7f5cc924222692979a8e28ab1e0018445694ee52bfe0b3485011b3d05e3a84bcbdeb434028 +0x7614582f42d5a907d4ceba0025798ee61d38072485f54ba3d742f29503f1911f +448 +0x592335639cd4f2f9ae6624e895d6a729b5079ee1f45aba911b7fb98c7f8b2cafe24a7e4c94d63267dd686c25a06fb38138dff541a6cccb28 +0x68d64cb4331b71e72b42c88b8f6513f4bc17d995254f04dc2b7cac022ad5edfa +456 +0xe26e1dc893fdced833eae15ac04ed4624a07e3c89dc3d1d8205be44bfd63327782ff1bc2c8f7175c920eb22e7790d40d442b46349cff72f1e1 +0xe1470b2f44e3955d2b5496292679d9086b7c0aa94f0d516e53a142e486c6ded8 +464 +0x7def4d439a9b7a6c5700bb91688b1ca6c4ecdff263c6646446ab4d2ab947df80d5dbaac648ee6cd6593f339426fdc2c7303a36271a9ee9b6ae58 +0xa59591e28eb92dfbf290a06772bb145655979cd0fa0df15bf82aa27665abac03 +472 +0x283998b5e2394fb1ce1cee355b677e79f89a09aa28fa52d5d993c307f27ea7b32b60995321333c52aa492d2a658d36ca960dc53a31b59c81355dc9 +0x82f27f2abbe5fc2184b428eb92551e898a5177e997e337eebdc49320095c605e +480 +0x09f352d1ae807b258a9d49873a4c4aa4c63bfb52bf9180728ae7981bfb93d1f5262df8e2714cd4e4ee91143be8e785cdbc0888cbea44c4926c7e18cf +0xc30efcccacda26ded16e92b0f2f2e667dc98f289a754cac628dfcb421ecc7240 +488 +0xe6c2b24789348d646a263ffcdb6fcd511e1aac527b227a7a907aecf6e9500806d09394a566b3ce6cf3a85db47b3588fb926ea6897078d5524890ef1fd6 +0xbf9ae2941d2bb948d33ae2a822e8738f744b5a9d692997719bd1a118743a0731 +496 +0xb099e1b52348f93a6c22896c72854ab04f2dd3d1f94c5fad21ddd12e5b35f57c80db097150997c4e5cd3f5ac241897b57cf7849334149f29f77b97017433 +0x01d582c82ce6e6a8c0cfa81792110bc950fa55e31c101cc6f2df6b2aebc18925 +504 +0xac4065c8dcd58031b7475c3debe032168fa9f7ae5ad02d48134dfe3b48c58bf243af82383ab5eeb2c65d54ad96e8fb1b657b8bd7297cda318e3f02a6a2e2b7 +0x9fb9d7e6b81e86e441695ca5c762cf3b7735a75dbc4b2b1e3e5667848f6cdd73 +512 +0xd2bc0ce7217ff2e944e1ae47ad5873bf391f1b0cc07f6151eb4c50bb45b2fb6295326f716ce7e687fa0e3d5d25c5a8a8dd13a541a9292e8386e733f4f2a24728 +0x9c1fea5786702d027bb5b66b3fa92de34621a8626982ec21c0ecf8daa79dea05 +520 +0xa82aa079ad878cf1d699e9612fd3aef603df30c3e8904358fb18a2976d7b91c33f43c0da4976732581c5e00d7a06d8302be4aab4f2d545dbd94d9cd817324fe2da +0x46eb49bfc5b2ee3c97b91102525b6666d56bffaab4baa03059b89f24ec4b5622 +528 +0x72fee29494c25b119b6c5a600c468ec22e42af5ba93eb79452864ebe469a86f83632c85201800f3288b553f7bec649ddfe704920a27a8f65d13aa755985a238b3cdc +0xf7eeddf08d3c1ab524167c908bcd8613d581cb0d03520d7b6b64d181bf13bf1e +536 +0xfeb7a094dffb5c0cb6f723c1b5e7d764d4ab5f896b13e409005940a45defb3ebe67bd85e2a21d8d1b800de1434ffcbd2aac92aba211666dd742d3a575da66a32d375b1 +0x40cfd88d613bc7d105e178081d2e3c5a09cd629465821909dbc1e9b8cd04a266 +544 +0x8ce31ca2ab2e7cff5ff5bcbcee367463cd5eee65b80bdb010116446729d1c31ead8df2a3226024538425538accc35a0dc0b364a50fbca50d9d01480e1c3ea8e9dc4fc2f5 +0xd61fcf2c3178cbf34042a0fc02869f4670ea400ea384ccf04d8460806fe11dce +552 +0x4963a36af562e045ec25e39a0d9c2a035d4f6d62044fc975986d1eaa9eabb6344ef0275e97007a1f63aa8cef1c44b5da6f54a8d350909a4a3e09a701c8a3711b50c80a760f +0x69df54c0fbb35859b5fb247c92b5665ed27962f042a790519db8ce27343b9590 +560 +0x0663ac246f643427d7198feb54919f97f9e036864dc32c02fc87af50cd26dbeed4b48a18e9f96e9059605d9fdb10eb57c5583e1c7f501e6338bd4cb8d9361506378526138d50 +0xdb458a327dd21bb9c073bd5736a745e467538d9476b7647b74dcd17031bad72d +568 +0xe70df9ce76334cc2096c0e715d8c96652492b5b6637d3e801961c59421b9a66e59ff4a68047aa52d6d58036fcefc05dd6f99e64f120003448fb69b8fbc4ad34d8fe5fd1a872319 +0x229be9deedbd16e948eebf8aa5838d276e0e6e295570c49eadc9f27c0e2e5798 +576 +0xdddad5815834a99d79abf4ed36af74065b2e70e87cb8483b2ee250d877e8de8b8296a2179768367b4bf0f674f478124360e9e2b0c7eb794ffd4e7c02eca935bf4240e394672b54e8 +0x13b11a38ef74ab16bd65b84e83d34848bf3c56e6cab5c56cc0541e783df1d4b7 +584 +0x84617bcdea87420cb0e93feebfde3aabbf7cc7178065c81c99e333684f381563b82fd76420f7c024ab31bc733c485c2996011d60c153ede0b078ebdb20446fdbc3b64af89ecd4f4eaf +0x5bb51bcfeedc618a28ccf3bbd96be08972eeb1bc22d9bb64883dabdc6c3c6b54 +592 +0x970f5a9308f929c5de78e8119b96caf0ad9c4a06f182c73e75a9711c82cd694fda3524863e2c118533b57b78067bb0870e0763aa31354fbfa9e91dda08fe88dc7a7fbf474b1a0a50a9d1 +0x930a9c33e393ae8b1c39e072b08f972ad840db5401a4eded1f1fd14f8a0f68c6 +600 +0xf29ec443a7c4bf4fcbc2cc4e992f3b1e0c70ebf60a2019efdcb676c3e2617cd4853701706c8f0d53f3abe96dd99b78e6385dca60bb49ef7c0bad099f8ab4a5f6448c4cb723c754aa6202fc +0x36d1cb5d930d73f01999533b035313a54b1e2cc223f07af829424230b8405177 +608 +0x4913709a09e606f0034926f21ce0faeefc0483b5c0ade99fef950fd0b09a6bba3a6415e38b491de85d6d22c3562e20497fbf8af6f71299ede9fce33bbb942f5c88dc8800d1a3900f6fa917ea +0x0948d1dc7a0a0172d3dae4ae40d128444f2f6309b443ad6a8ab3849def606a7e +616 +0x3365dc87c7f29b50925f2d50b1e437a49ca995caac35fcb3db29dd19cc2e8c130b2ca1e795bd9f1f9be1d3df83f37f7530db383283868d782193e915774fbbcffce4d340b6cd0fe5008d38718a +0x579d6c492dcfb032b9272aa0f54d13ece0fb2276619dd7e75f86aef3f58bfaea +624 +0x45a899ee24ce1eb7ffe13aa5acb08cabe94ff003957153b72019c6664072d045e5fa096470e6e4331fc3cd44cc597452d8d468836226e7eabca7f5501ffeab349d45d2105868b0def2ce22db443c +0x5c088cd0c18bf699edf47ddbbd1e11c9caa9161b852a6024492e7ab7dd5745ee +632 +0x389d76c18d8d11eb5b7e6e80d79f93be52c784eb1101b7f35948c752c98f6c34ed05abdb0f964a4250b58700f8590a6e0b45170c1d8d08216656fba219ddc855f2bb36360e676e1a00fcaf92213c44 +0xb32d1b0acc097eddc13dbba91d2c144774f4bf1ba2275770b52858471de26ca1 +640 +0x120b80b44a2435d4783766416ede1784e00d3467c7ed1b6304e75b5846febb812d637fa6b043e693bce4f7ca1df07d75a211519e7cbdd7a2e854cbe30e683ebe285bdbbde6306f0d119ba932705a1ef9 +0x200818a7fa963423d0a90bd85475d67befdfa43bb49be7c026b9693743404dcd +648 +0x713705674e20066d61bfe9ca763a8705cb6ca1e8cf95c6d729507661fcc687156922c8975645e5f36eba8a3069eccb298e96c498767c7c741259107df0180d15b9461d51ffc8e65035c92fcbfff744eead +0x786ea368156477616fd76039f9b1caaa95763adcebc1cfdae8198f82a41182a9 +656 +0x123ccaec522c2983b6cc2e06b0900c331db49dc5d5809cdf80cb14aeacbe184b1ddab5de643c2509b4204584f0a54a0408d0af6286d271f9648e7f5021566cf914f568b8fff36ee8e714bf1b23228e01b4ec +0x91b3e2463558941d0626936a8d275722fe2e600bb24df78d7c46752675d1c4da +664 +0x75d040ddea0428d8231dce4fbc98cc4a2f578a5f47475379d740aed8ab2ceb59bf6cfcf8af7786936fc438f13ceb5c02d207ab68e05e6637b944a2f94c3ce4f65661edb2d604d7b6c2976193f8c9882577f357 +0x749bae9322af588495dbc0ce426debd9e9cc4c02f50c52ca246b5582840a86cb +672 +0x7c238aafde6aabab177f718e0cfe1386cb1421b4799b15788b862bf03a8072bb30d02303888032baf5be242341822095fa71487c68024aa0c1df31aaa08e82e4b4508440b549df9c9de26844146c3cb82c060cb0 +0x36ba7bf53f7d253738f590ee25c6120e0e89b1b89c2a0691db6d38b72c20055b +680 +0x470be1ab595f8bfcbe651aafbe58a90cd4d72dba54f3437a50872c16bdc81593d21c9caeb13091874944f9977bca59e77b3031847afac62e82132450a165643549a72b78f77673bc13a88e9e17dd67e8f4560c07b2 +0x8ef8d6472e09f566f70e17b454489c193d11fd99855f7e69c0eed389515df577 +688 +0x6973b2d5fd42e78a2245c76f25681d704ea194e2b578281e58c6db6f6bbda92fef28bd2c86f4e55186f044824cd147c7d379daad8579dbe950d4ce3ffd06d3a2bd44d69d050606f19cc38880f3fb6c69b47be0759ddd +0x226fa54ab31f5a78eab4f92b10972fcfc8ccad25e0ffa49365da83f27220f6cd +696 +0xc4d0d14c93058865d0fbe2e6e14e99f170cecd75c183f95343ef26bf65925fe9aab464dd005ea3a84eaa63bd4c3c43979711e39f0578e14f355d07986bcdc2819bb7d612c4f05170807abd49d8069a725cb70ccf7429d0 +0x88e183a794f478a850856966fdedd71b14d8aba72819fb26f14d2315c67f2deb +704 +0x73661799c7d2e24ea484299d8c8c1125739dce5cc307c327a3e5eaa879987757ad74b855b1b840fd3ec444bbe0864521b436ef3770434213a58defaa41d405e65870ccf92443f1f04aede48b5e3e7f4caaf1e8ce2b97b858 +0xad1affd1b194bc0afc389a2cb23281244a8d80a524262b2560d58f7f6d226f51 +712 +0xd49063453b779b18933d233369881617c987fef4b18eea6fc600c1a24672d5643e0dbbcbfd345bf0c86743f2cf68413e609c300d5bb3122ee68c5f0561529dd49dec3139489475f8acc50afb9a5b7097a0f6d311829f2861e8 +0x6768946a3a27f46288ddfd4cb7b5fc9e27cd3ba46ec959e6f3d0cb5bff68e226 +720 +0x905888121360fe46f86dddd119076195213443f339907f87e5a05b122864a5b7ef2b3c6badabd2a74251ef5f21d63938b213f4f6f516c5336975bb572ce28fc463002b51dc766afaf2411fd6b14e58493b48e47a6aaf1207b72a +0x145ff262e203957a88a875ef986ac484204b20d9c4be7d35ad59612764991d49 +728 +0xb752ac4adc97012119d895a800f318db6ae7e3c70344949d09e0f80550cc2fb48a860a41c570b8343581a261343b937487dd1ccce3d9378daf882af00c1daede13d851be5d7c198bc9026a29798f29f91ea422ab7694a753133c7a +0x2f399dc553da607b1c2d490e6461664a5a2c007f1800d76a2aaf7742a86b9617 +736 +0x1ef7001c52803938e937d93f5c853f661ce483b4262eac63d81a2389030368f841ec046289c2bfc100e012f512d9dfafc271608f3eec5e89b78ca38d6f55b1671413b4e44c9eb636915d12993f092b37ebb35d49f709348063d5dca3 +0x77e371349c466f6c331fac0284987537c15d0430e3f0cca8f1fe2aa7c794ef09 +744 +0x284bff3b6a683ff220f5cbfd3c2fb8a72bdb8506fcdd5b2dc50794a3422f7b14c084524739229a50c1e38e072078f1b8c1b9091ccb3aec888d1ffa651f31abe046318be2996c8243e28f593bc7bd7a19aadff737cd3bce2dba496c45e2 +0xbfaa54963521e6e1ac72b55ee4d654c041f62b73ad5a5305c58f47bb25db7cc2 +752 +0x081d08397e1353073f8df24675588ad215e4dc3615a59d2ad9b9815aeecb9a69fa37e036f36f115e909dbb02fd8a96cad3be182947e944e3a281c3cdf1ad35d4fd62c9417dcb0b3c8beffe8e558e6bab154b78ef43117c2808af1255f7c5 +0xea8fbe273cd2bb3ab9cc7f3640fb4e3153a028d8ba9a880b3b8219006c28281f +760 +0x1ed6244a5996d5a4423c0106a4b8e785d750c7313843f3dfd6ac272c6eaa1dbe9abe5dcd457453e26246a3dfddbdc140d2d9bca0feb35a7f73616a428f1a567b2e9af86b1fc8aec6d597b1b55f2aa2219b3b662fa6bd340796c0ecda6c96ab +0x8fc2263517c85d7ab8926595b8047b4b838a075a29b24da712303c3e6e597e49 +768 +0x63188781f4e9cbd1e89a54a65da053b93722e1106f00f024ad1582421ab919326f8a6e17536d6596e3cf413a9231141733e37aae540f8711cefafe489a87c4f2e6fd942f6809f3bef3076763487de48c2ee88733c5bc870617a668c6f01471ed +0x91a8e285029085e224987078066486b6c605cbac27e49e84f4639710ddd05d33 +776 +0x371171b626ccea8b2980dcd33bcbb849fe57d201000bc2443d830a9be6befa2a6117d13f9177252b57c8855159ad5c7c02701876ca3c8cd6b78c931923e3f7f4c1be91e9dbc6b119dd4bc05917ee2387bf9d631f35c58b098bc2d2b5459b7a6a5d +0xe68655149dc14bc5759b8cacb7c2d2a850456a64a87af41de84f567ffe9c5e60 +784 +0x9bf7c7d99059248589b18a3fd3b03f4a72d21d2aacd635b5cc71b86d2043180d440a6a62a2160f5c3afd93659f8fd5f1420c6857f3953adfa5e1731c7231a07cdf86111d60117fe21febf3c7f906e271c9649d0aea86e94bf728e9dad52b45d7f4d3 +0x385b95541558ad0a9a20cb91116eda03c5a694ca95eab1caf5c0d1501899d3bd +792 +0x1973263a26d4a418c691dd5f5ccb7dd7241ebcae24ccebbe60174c0f4eee279d89cc1a5bc9deb177136437e02d59cb065556b6e132b4fb340bf1301337548da3d5d44321bd370e25b6770e28e969d34495a0b73c059070bcbfefe5e2ff6141fc635346 +0x39d8740d56e58f027a6af13cce9b6484b23fa6b3693354175c034ac1778a1a75 +800 +0xec8ee65cef05452defe832e0a3a3ba6116a8d5d6a8638e2e566f63fd3c0aef8758c6c61a9182a1a2f899bb774d597a79c5b7525f0a40e74c845371a3d78e651dad865219b5bb0833eccb00171be5f898a081defc724eef9a606c20a899dcbd4e713550fe +0x3e7a652d89df9ed7cacf53d033997c87528b8cc37d59b8eafbedbe4e8e9c5c3b +808 +0xdf410a8b65f17139fc8eb8495df813b1f6f9f1b7471c7e628cc36d2e9c74f60311741a68a9972ef5ec5697060f22d3b719f8b90c4436016fa6ad066010f7cb68370a3c4e110eb78e826ccb07382840f4d470571d4a75524f8a7937096029d278982ef9a567 +0x294c8788036098f49c23016534d032939d5e9638e3e4e8474533f52b668f2da1 +816 +0x27c2ee5f63c114c1f61530685c19c21a4b7d47b3428e6b8265b87bf0884919628a773361e4a536f981e27e5ed1b312d619128ed20db6605ea09537bc1ba8b94c6cee75b0c1b3182c5612e3538bb95ce03aec44e247cdca1c79dafeab88b788e9772e9a922374 +0xcf027f6017618d970da83865d8da560f454ce2bd86af59624fb87c8e48beb208 +824 +0x2f510b72ad1a26fead669ccafe9ad0fe31ce0a12f3d06bee9a6c2750fdebee6d89daabdb910d71aee6e3b2e2a8cab3f95b063ce43daf9427d7f9ad39d3b99b290d244a87edd97182f322c24e937664c94443a25dd4ebe528fe0cdf5a3e050adfe4b6513f68870c +0x8969727f522ab392d11c3cfa7d02fa2f9b457a1de2afd360ac9b2b4fece84e32 +832 +0x2a81eb0e6f1d13df6544c69321c561a489ff9d77b9ae11d7a604f8a201fc35c25feb945f965753536a0de1df696ee59c130a82b43e70d951b943d0563091124e4f6158a12a8be60eddcd58556f1a9e34fd354695147ff9065e0e496981feaaed440cbd3df460d5f7 +0x3818a14b4abd900c823275d45afea6ed1df6cc659eb3ef387445f8ad3903623f +840 +0x9aa1fa540acb4d2a59a6a3aa8c2fdbcd0a4a17b6b55508e65a036cb34b68d4f64a50ab05a9d574e1b03153b03fd0cf6db4aad6de0fcf01c655431a5d320ddcfde18bf91e510862848090c2b72b034bb4aa69b6e216858547acad8cfc76d9afde28f9ed87488c9e7d91 +0xf9424b3dd79d555e2f5f8a185933f77db95864f4b597ee805d5b62fe0396673e +848 +0xccf2cc0cd223b80ebbd49db9ede7a22862812dbc4b1aa6c9fad07f8efe01716b9018084e2ea7616f85b7333d945c0c970f8cdd400130b98db67cda61d87ce55bd8f06e4e8f5abff22655d5d93328aca4249bbd76e10ac4a9adb7c6c04d64539d6d2209f53f6459006557 +0x06d1cd544f954160ade83a102eb935f7f948009591b3eadaf4765868c63450d8 +856 +0x5aa1b85ca84f24f487f69e796268826518154bd6a224583ef6c3f15c2bbb856bdd473599d32697badfefb33e06a55260e18b79a1433930751df0873c9e2bdb739e76562c3c83b5bbc67b4eb3da925111cbde4eb64669f71b36852840e45f24e563d722fd2b8f0860044276 +0xc760de5612ec9d047848727b261c8876b6c33b2c57ee1ac99da0890c009b9540 +864 +0xb613eebbad7a1860928ae7329a38cfe86f1174a579740ecc5cff1216c2470fe25accd5cc212cdd80e096e5d1f582db05579ffc73d50d3d519ecdeac706768d478729112106c627525860e99d05efbdde4c457d9a6744d5da104dec3a43fb463d4612e9e3e7b2be7e05d13bc1 +0x012499f4e6e2af3b530d264bce97e344405ffe59c04b31432e7f0446a6ef33ae +872 +0x823ef09a0a657d28ffe8173b6cf04bf4795a96b39b19339608d5323c6ed8cacfe42bf04121fc28d5eb439ce2d3a66bd42099437309c9326827bbb9fc29b02324cacd14bb0078650e76052f9d3d922620bf2f29c9f44317c9d82be3151c23eb6a1b6a858e11a1dbda8774faf512 +0x08042c79507268fdcebf12719610219d1364117e66916b9e0c1a2aedf5b4a8df +880 +0x9607cca45873add19a93dccf3d0f790e856ff30b84c8211ad69b8e628ffa142972ecac5264138423208c524c2b17e9250b780938b41d7cff43005eefeecfbdb53b4b62bf71eeedfe4cd028eaf5cb95c731dd4927d9cffdb18a1463209df4b68f5aea95f3684a11e9882605b28473 +0x73b4086d690ace6940c01912acb3a57bfc15c4a16c40a90b4329f1fa9f3085d2 +888 +0x5731f467c5b923c43af9c5fa849aad21ab8dd7db1ca1a687065571b705ea3ee4febdcd614ad4d98e16b79a4e09818ebb28367918f757ab06e1b481fbda822ef143adbb5b0e704d5d2222a73c0153ef14a817b5c9b7a2313fd115ccce4698e3f0efa9c73d5ab3089a27e3f3adb23759 +0xf5253b5c69db9c724aebf762ec51c221f8a4d4e2174a4b7f56e4d69aa44adfa3 +896 +0x92b23c0bc4d8d07d22e28812710dff06cb9bbecea2c960ac0200f480164fa2e1ee19926c7f0b095cec51d55c040aec990bf9501abd7d355490c366f93a3ae5127347d14dfc3b8d98e0821feefa1cd671b75230ba1da1fa6d0cfbb910c42f491da8a5c455424ea65886db2e735b2d07b9 +0x55a0597f11ff71c426201715beb585f254bb31c1dbade533f04e499c3391ff79 +904 +0xbcc51ea0a66564a171dabfa279e384f4d9fdcba38028215788ee7d78c3a2769596e6b2070a6fa2d1200d6ccb65e52900c7015154a70c736a2f562ac4e61f4c2c81116453fd0e63b9ea2c92cc0afecb541a16e90ef0c77d97c630c38cd675d4f027501ccea6c90f1f784118ed8fb5d2b97b +0xc16ca79c0ab44f39da1c65e8943ad2e90888c3d80b5e3b3b1bff59408b59d6f3 +912 +0x2183bf5465b18359a451cf3030bab07fa761d11926444c7dba88c0a01760a4ec8d32db8837f588da76de234a9d3bcd49ee9fe092c63fcbb0149c1dc10f62df792990276a3edaea82124c12d5fa2fd09cd930347e4ebffb0f2cb6a8972b3bd614dde7cc82e328525960e3c358ae5e6481505e +0x7e5b4bd808b900735c0fe665da9437dacaf85249df653c6ee72fb296e8a9b8bb +920 +0x959ba94b728a8adf53513521022558183a632e24ad82a3904b47b966c2372a8741524ffa82fe408507423d7aa4344dd43db52482d15b4a03b7af7a3328994965fe1808b1bb36ea90cd3c6aa61122e7de954991bca26d89effad544265ecc312553559b18261bd0272ea7834a51d56f5fc9893d +0x85c2f125e6d11f831807820ccf0a53932713dbcef3e23b0e3c0aad8f89139cc4 +928 +0x30d62ff4263a731a205069cf7c0a0db0b50d3db13f08c00fb24586862b7e31c5eff1d51f52b6fc83d851eeae99842f9fea67484b39baca933979917340b1467ced9327840dc60b9cbf02a042d7dbf8d881da445527d2df3b94718ec9591606716fe2ae8c1f12a74d1f8c0af3feb77043c190b836 +0x4543378ed5a054557889b4634d4aa77bd30726b797235010d6a4920bf9cc3b40 +936 +0x3761a4861249c4e0115b997c2c87e85e5ea2bcaf44aea31ae65c1975d5cf45a476a3e3ba9d2e82625d05ef7e1fc2f10df205365222b98e330c9957df30f238b388aa135f19813444c797cf216d2fa9ef2db2150905f72290a3c1130e7b890f59167e1abbadcb444ff61820ae3e5378cbb8b03f1c15 +0x088167f12e82a45698cad25b405da5e24a0f4515b28b915bfe799d0990723598 +944 +0x6e26e2b41b80f26b87cba9bf5e11b734611e89110c9210157634c5667a89eaca14a612190d42e3f3db0f1baec34bd1924091fe49a8f63b910d51cc3461dade3adef70d5da55229bda62f3ad5bffdc1ae282a41520e3cfe847e1e05ae85b76c1b96c1db662bd94c33afd20e1c9c4f10efe1915c16868d +0xad549004c75fa7818dfa6e906062a850589f7a8d17a1c411fc955168215e45cc +952 +0xfe8b3dca283022daf7022a88dfb8ff61847509c41e9cec4f22e652971fb2ea1ce59cb17ced5070e6f5a185d2ebd5e7ef0c43655d4d212e1dfa9796c69d17177921f196163722e8b0f96d953fcdaedc958d6af794e5aaa09dfc0ad34b560dd662f9b37702ce4e95214b91e1384feae63b4d1247cfade248 +0x37a89a63b4a30e6a21549a245a2633ee5fdb618e6749f60522f5ad03a34d4465 +960 +0x04c48b4c37a0dafe8ab2c517eeb472385661001376296ac5ca2aaf67db5c30dfbe0b59fcdd8b83c3fa271903705afa30bc421f6d3d517eeb38462e721f5bcb3d13c01c0ba749f373e7645578994ddb5dc28558bb6c80bcd0a79d391ace5ca4240bcc1da11d42f2b75950c19deff5dd686f12f3228c1dee1d +0x29a6b04353ea82f3f2a28503a125233f8afc5b601921637a0a24b83436abf9b5 +968 +0xbc43ae59c1bed74fd4eb61be97b0276ec5adda96c67c3b4680378e026f3b4baff82c16b4fa3af159a7a2b1729277ae4208a2bf9aa42866411eab47986434df7eec2f727248b745f7fb140e3d8b82a9fdd7340ca5ab997db592de0369ebb41a983f53aadcd2bf3af3784a6165aa5a7e67d96ca9000259ea6a83 +0x6e1244587179eff28881bb80b02d193908a4c4d014b4da5b7e93c09e2b2964f5 +976 +0xddad789728581044ff760f79099e01a2cfc94ba27a070e22de714e28b85f54eb34db50e6b355432bca981cfa8efc21920fdd9147224d88d5640622f47ba2e32c9f0f57eb5a3df5d58b19495bb1bf538f66eb2a362ab1e41f626fbab4a0ff68cf2531d3cfa578eeea4ae3dec5fb4f5d41dddc5c981a9decaae294 +0x6e3ff96f4e4a722c912392b3b5fa20ae762ccef244c011268720962184383a66 +984 +0x8c7214e14eb6e0ee14de3ca0edcb510aec5079b3d143ff48e5d3268d261b6c99a4f80f432b18d1d82254f80fb3409a3e2d0017cda65de7ebe41896817e7d0c643e3c12cfca75121083121e81ae5934bad2c1c105600563139978f3edad98c32c20e5246d72f42c00ffbfb6e0243fa9e8a33d7e434965fc25ce9c46 +0xb4b4e5edda4fb4f7c0e734cbcca3c78dbd6f2c9a997ae85a6394108cbc5c567d +992 +0x3b766fbba3339959b194163c36b4eb6505ac17e7b24e753e9916e3e1225da41b44d0031648213939d0fc91b3173dca587a60bdad3838403e76e449388600573368180d5091622084ecac74331f9382010ff6fde5a6aab57fd46fbbabd323c656b036d590075e16e30e8c07e3d41edb07cb561fb7850b9da6bb9e8162 +0xb450e083d9f3f58284ef80023e3bacb1826e560a22f6e6625d14ad1348df96b1 +1000 +0x6ed8a9f9f2baf57e659aed127833edee9025a8481cf61d772556c75826a714f01fbc1953e5e184c4bc1cd21d27b3c272ffee09f1c31e470c2fde3adb109931bb564dc43c6b8ec33ac3cd6c49b5dae15789a8d98cd2519575fe5916622b378d0c3c11137b2cc89a27a334235ec7b132e555da7fe2f094eff9b94fc2b61f +0x17312a26ef9b41ffebe31ee7ee51162704a2f05a5905ff8b692fd603942e9668 +1008 +0xdcb458193c4ba82a45bfdf028000841e4a8c671f8e2b841dd4dc2a3d7b0f5d86421478f00ed417bee7bf330e43058faf87095332cb13f744dd44633b89d055ee186702ca17f400225a8a63c7409b27d9376ccedc83c5490e3ced1cf896d6be4466943ecee1132cfea60ab754ff2b1344639d1e4540ab4225f8be9d9f2988 +0x9392ce14d344de05e4f87f634b457079343e270fff5b5c7b731e9fef137115dd +1016 +0x3e3a52d3261e1194249786d6c0e18d52d92f1c7639f079c26c51aa72d1032e5df13eea1d1006667002ad39de4099c29c3b4719b1f0904557bd2bb0a47374d869ac6b465b5f00c470b18ecb8c0ea53b5d790c4e832006cff534d587a0f77df95117ca4fd43a94935eda422228538d5e5d3a87a436f1db7e63785619ae86a6f9 +0xb34e72cefefb63d6e309bcfb4f0b1d350f2c5c582de3b93ad137f921a92a7e79 +1024 +0xbc8173c878ca60e9a0f823f9a589d4ff84547b389b117fb6bb1b614e7e75a9b1db0b21d9f73b42a73e94eccab3de5ae2845a54e5e24ba6c20fb4d245b964023b863040d6f080e953530d5fd944e8ffa525bf5364f65c88e06e6e22df4b8cee48e67738880a9f3f3406e9e6f001b0ac8f8e0ade7c814c0c5800d0b9e4ddf55622 +0xf691d01ee9ab675f3872313b77e6a4543c71e3e89aa94c48f91d6ee7fa1ab4fb + diff --git a/src/sha512/formal/model/PriniTestBench/testvectors/384.txt b/src/sha512/formal/model/PriniTestBench/testvectors/384.txt new file mode 100644 index 000000000..48258687f --- /dev/null +++ b/src/sha512/formal/model/PriniTestBench/testvectors/384.txt @@ -0,0 +1,388 @@ +0 +0x00 +0x38b060a751ac96384cd9327eb1b1e36a21fdb71114be07434c0cc7bf63f6e1da274edebfe76f65fbd51ad2f14898b95b +8 +0xc5 +0xb52b72da75d0666379e20f9b4a79c33a329a01f06a2fb7865c9062a28c1de860ba432edfd86b4cb1cb8a75b46076e3b1 +16 +0x6ece +0x53d4773da50d8be4145d8f3a7098ff3691a554a29ae6f652cc7121eb8bc96fd2210e06ae2fa2a36c4b3b3497341e70f0 +24 +0x1fa4d5 +0xe4ca4663dff189541cd026dcc056626419028774666f5b379b99f4887c7237bdbd3bea46d5388be0efc2d4b7989ab2c4 +32 +0x50e3853d +0x936a3c3991716ba4c413bc03de20f5ce1c63703b3a5bdb6ab558c9ff70d537e46eb4a15d9f2c85e68d8678de5682695e +40 +0x4b5fab61e0 +0xfb390aa5b70b068a54d6d5127df6a6227becc4d6f891fd3f6068b917a883c9b66f318fddb6384d10be8c7af0d3132f03 +48 +0xdad95a4b4d37 +0x3a2b40f453925bc3ce17d640757ee0e899390b4a8d984d0297c1bae6b60b9f2603bf71c323fd171011372335e5702e40 +56 +0x121835fe3700b7 +0x7bd06a94acba7beb3c5a9b9e8769c3da6691c482d78b1e5c7619b36630eba4e596d11c410a4c87006f4716b6f17bb9a0 +64 +0xde60275bdafce4b1 +0xa3d861d866c1362423eb21c6bec8e44b74ce993c55baa2b6640567560ebecdaeda07183dbbbd95e0f522caee5ddbdaf0 +72 +0x8d45a55d5ce1f928e6 +0xde76683575a050e2eb5ef95ee201f82416478a1d14bf3d96d1fd4efd52b1a28fed8dfee1830070001dc102a21f761d20 +80 +0x5c7dde9b3894d73cefe1 +0xf31b22115fa7178e78223e06aae870547ab93c6eb3c3910b0ee16e6106db55935d6c0eb820132a2078ece1067efc81c3 +88 +0x967fa34c07e4945a77051a +0xf8f24d81c4f8f23ecb42d76ed5d2b34c9cbc1f0a97234d1114804b5999759f3131c741d5768cc928163503c5f55f594b +96 +0x2209112ee779bf6d95711105 +0x09c54bf533a26c7447caa5783db2ec7ef5e55752da7f2a2c4e360982a94ec1ca2cb6a157d34eed28de978b4145e17ebc +104 +0x20442e1c3f3c88919c39978b78 +0x50bc95b036e0f54d833032a80d45c2ac38b3d29e9c7f72a2eb14781e9241d2a4b8e8dba6ee6f4c9e46a758d5712dbd39 +112 +0x4d43702be4f0530319555d7f1a33 +0x83c8f0bb762801eb26cc5115abebb657c18ff811de500b32b7a568a220a287e900b6c75224fe7429169fbd534cb588e1 +120 +0x5e2a79a544af85f150f7a9d209fd44 +0x8051ebc9cabb052cabe07e4023e2140808b77d25b07b96d2e3c22393f71b116c1a1e41bf62e57f73ff67871da7c93cf9 +128 +0xe1bb967b5d379a4aa39050274d09bd93 +0x3b04f96965ad2fbabd4df25d5d8c95589d069c312ee48539090b2d7b495d2446c31eb2b8f8ffb3012bdce065323d9f48 +136 +0xbb84a014cd17cc232c98ae8b0709917e9d +0x85227ae057f2082adf178cae996449100b6a3119e4c415a99e25be6ef20ba8c0eae818d60f71c5c83ff2d4c59aa75263 +144 +0xc3411a0592f1f4fa698815238997db356418 +0x233ac44170d9f452a1a0231622030b15c104ff8ecaa3fccdb9e9e5031fd5b4220186a8edd032849c8b93dc183a5c8627 +152 +0xe831b739e8eb9f787f63c0bb071ddcc9f44cab +0x91722d4b7aecc211bb8a5480c6855f3b71be4647e1dde0380c23afaa03f45c642606a24506e0317bf51506a483de28ac +160 +0xb8a7bbccde46e85f1223237d9353b78c3b19727b +0x28ba69dc05e6e29de91924114d6c9fc7612f6d2a68b07fa001df059bcf98f7aa85389caeb966eaa299c79fe1fd1e40e3 +168 +0xcf391b8aabec6f81288c8b7b92843be23d2e847574 +0x121e5ef697df491a53d7bae121416aa653d759a37db9d0b993031b18a0ef160ed98842a291e1ba2cea8b998bc5eee0b1 +176 +0x9d65d88bffed764c286f34894f991600d1a67d622382 +0x84b6e0d6a45329daf47a793418ed5dbde01336b4b9468bb69e5da61c42b691e6794e6ed0e8fb1b8e7d4cd3cbaadc520a +184 +0xbab6ea46fb717f73f0628132a2b96be383774f1e5d8b6d +0xe969aca1b50e928cad29a0d756457f6de8d7a4e589fd41e53a1e758c3b20f9b81b36bf098a49102fbf869651ca9a98b5 +192 +0x8853b00e869764adb527a07b073c85a24e6c208ba47eef4e +0x09ad44e85ac190e2d1c3ceb4efbea10ded34d0de961fe4ee268132c48e38660e6cf585bfffb8f7b00b0fad1514312b63 +200 +0x71fe1ba5d299495d2a56039c64032ec6263d437f55e3f5bedb +0xb41a5d3b4af6d4b9c349e0788538e9a0311086894df7b72cf5aaf4091a7e039e4e89cc77a123474e6d1bac438e5e9f88 +208 +0x4ebe07d03c93e849b4bbfe9f2d2294bf6ccab457f76d3f99cb64 +0xbeba464d7065185587fad89bfcea9635bf0ab775c3eb8c147b5b2bd8601db6dba0590b50dd1068733f20dc68e004a090 +216 +0x918ac0a97ec1632908489e5242ba284bc811aa7197242cf7226fcd +0xc4baf6397a4c6e26492b63a4aab7dffdd0051d8f51938ac24cfd8dae2f7afed1a4aa2430d7aeb0be2a72b21a6c50198c +224 +0x97477f7272d8a89e38e796c533e9f8a8ae4c92ccaa5d907ed26a1a15 +0xd1ad524ebe908d7c5aff50e6cb780fd3a70e87c914a36b93c4e35f5b2cb03850b122b480ef8587d4a44f22467f4c480c +232 +0x718e0cfe1386cb1421b4799b15788b862bf03a8072bb30d02303888032 +0x6d8b8a5bc7ea365ea07f11d3b12e95872a9633684752495cc431636caf1b273a35321044af31c974d8575d38711f56c6 +240 +0xd3b07f0fd5d4cd3188aead8dc8338de42056e2e8487eca51ec37ef2daf27 +0xadcc2e954c91db3db2d71d0dee1f030e723bee1a23816fe003ac5dc862a0872ef51ff386c18be6ebcaa493f32d1195b9 +248 +0x695b9efe1809abd5d44eae957ddf9c2cd3c75fae2f522855712a07c639c0b9 +0x3bb95d164d94595a1187f77fc26c280ffbb08e74ec7947aa3e5b38bec7c6f8115c4d880788c2402dbb3e5b94afd130ee +256 +0xbe01e520e69f04174ccf95455b1c81445298264d9adc4958574a52843d95b8ba +0xc5cf54b8e3105b1c7bf7a43754d915b0947f28b6dc94a019182929b5c848e11441c9e4e90c7449f4c3cd12954f0f5d99 +264 +0x98ef7301f957d73d4e821d5873e8a9b5970fbd219d5cf74ec2291b8381181391b4 +0xb2564bbb159c3aeadbae0e4a4437f7c5111020e9ad0f4eb508147a961ac22a01e1a26df046b14ee5e8a49d9ed22b8cd1 +272 +0x873ba7f8b71517ec50297b21cf94cdb7a58abbb8829206f0d3f328ff8a6939ac1d1d +0x7405fdd557d2b5d4f65e9e85f508d3791495f1820d37cabfc8dbb74d7b41df8613d995c612d378dd88337e00951d0280 +280 +0xe3bd4bc3a60cddd26c20aa86364bd44f4a07f3302825ad0ac127881de4eafbccf988cb +0x199d5423a0e26438f4cea0081a89e0b6c84ca93f7c3120c8104b51c6edc04e0f6a203bb77d59973a7411a0efbe93a09d +288 +0x8716e4b86deff9da2a8ed55baa43582a7586ec9cd38ac3a933156158cd8e5b7887585e91 +0x0d2306d9c0a8ce57bc7869b439376c07ce352a41d86ab6cf4a5654cccd5c724fe1b62b2c1101c986222f5264ab3fdd66 +296 +0xf8a503aaa25ef2cea25e31930c3a90db468cd3a862f4a93aab5de2777e82dc905cb03ee23c +0x773ee958fe93dfd1b73af24d27ddce33144a9249d5a671682a56df30d0bbf92b9327130022075185d396de752959304f +304 +0x669025175ea917cdd7a71ff4ec0c45bf1246d2a6f031c00b71de701e17939bfe92128b21911e +0x9ff6be3f02c7c5d0206f4b944c0843cb68bea8f9b7c8cc0b729503db5005c7cd5cb14e3457d8f5eabf733fca9084f16b +312 +0xb35fb2262edfa14938a0fba03eb2a25d377974b11f556491a781d0ba2b3c0ff3e42749925fef8b +0x835b05a4bf00c2594c3c8c13da6c273a0d9efdea0da72b71b19d326bf5ce968c2e577a7d99fc0f985afd23b46423129d +320 +0x9d86b45df8d7dae0cf6b0bc208666ee1163a39e6116d6d240c9dc1c3a3c1db1dd3b1c6680fe9a196 +0xa84c469c24696f81d7df4ee8cd76aa584f8c9960eaa9908d3e3ebc5eea7d0b50afdded39deb94fd59323a21a6539e93f +328 +0x414f5619f6dfd45853bbabd224cc305d77350ad253358910a74f3a4381a9b86680b3c4068c089849c4 +0x848d481e3bbf5dd726f625cf6a444d995b36262c9f80d583b77accf1707e3f49bb3dc480a560694d769aa1ce65d69428 +336 +0xe2658324821ae7b0faa0cdd63ee9efb9fcbe82092d04696feb3da92c82521dfdc98f6b41b3ef365d219a +0x3ea5d0799f1a4dcab9149a40ab74bec9c8d76d8e392c1e63e080ddec2ec535f80be9f00927be281ec97ac0c882bb0bbf +344 +0x7e80271bb5f2cc7ddae4158658e4e8d06e04a39385da0ecac1cb8e91d68a9bd21ddb7320e79d10e3110758 +0xfa00bc0359a642dcb3559656094eb2fd4f63bc57f0d34abff26df5c54cc63dbeb4eac75905296e7fb69f871e134083f6 +352 +0x43d2828e86f7856b78c66cfa3d602387c290975afd021a8b76af0918069cac35dec45de3cc52edc4ba14432e +0x6c9e367e066032ce47ba2575565932002cc786f533c5551656abfe7391e7dcb5f9d9e047adace23d32f8acedfd0cafc5 +360 +0x3f49bb645cced7530b8b82e6cf07fbf670f7ef0ba0583d16debafc639bdfbfc99b8417249f7f5a05410aa3a71f +0x2b301a14647a67429cc3e7da02c4093a739640f7b47a305251d2855e75e09e60e262b279a073077d1fb6d0f04788f2b8 +368 +0x31aac06a59b74bf478617c1637fa6c5593df168b8d58b1e923bf3e3d80e55d7170b16454160ab29ee1f7412ebc05 +0xddd245c9b29ceac60506fb6bd6e8037889cb73d6ecc669fd129060a8a8f58971ac572d3ec9b44404f81381d0fd35a649 +376 +0xc10b2852054d8034e07906c7fce3ce99402321a648bb881f13fb276afc224c6aecc64800cd767ed2429db94b95a9c3 +0xa44640fb4ce6dfd4a10290a0aecdb453054a9b54f2583e97bb7dc2b005e5fa2b4fda17b1f75902f51c18c0caad35833c +384 +0xb1eeef324b499f19eba322215fe3ce19c9f000b698d2b2dab7145015046cc86d049ee15ad59dcd1564f30112e06444cb +0x38742d18bfa6e918b888d68d1034e61f65dec0759172c2dbf08cf1e132b217eaf4ec29e15db7f4b07e08a70cc5662012 +392 +0x790dbba09965c9774dd60a32e010c50d6d518968a220141dc33e7410f2da6c08ad0419bd9864d5327d2c5c44914b2e83f9 +0x9174958bc8f4ed4731eced999bea2f63032f52bc8c46bcd903232f3fbc5046f0d6c203d43a078b822fc05101404f2635 +400 +0xf7b577f1396b23c27eb637e53d3d92460270b001cc612fd3b4d68bcdd09c2d50571ea4350636324cc2428a087e7bd8785f82 +0x80afe111e44ad9aff9e39c4cf9e6b4c520072b4550e62b1740160a04f8d530612dc098917a556b44977d0e73df518bee +408 +0x7370d9b453936955b9c9d336f4b283237986232de007bf412fb426ff5b4093c80c428c19a12e0b187484dc6d5f4746537fb1ed +0x6cd29159820d34e5706dd867e6363758d312660d4daca8d2abf677f234746e97a0a6224eb054066a0b74e18c70965368 +416 +0xe8620170f0f39328bdf8888148cfd17730f314ea68d8fea02d16d98a3cca61484139d3ee92b748091dc841dda08483f1184025ce +0x29c408a6a5045f397b56dfb5292c7c16028c63f068e699b86a891ff8501208ec9398dbaf463c00f39af7b2cbe45bac15 +424 +0x75d4216bad77943bfe82be216157843b0da0fd16eeee847153a00b43e707b2ffe2c898168081f0bdb3af58f214cf67b920c385aca1 +0x0170357385a20865a8d30c2df39406903ff88c7f70fa1a7a5aaa86711d64046c432a1b139668ae5abed637d1dc4107b7 +432 +0x2fa90c2210e3096caed122b74eb9559977120e5d9a97eeb3f99bcba6c19cf8cf791ac6c8a0a94ae49246611dace7f24eb05673a36b3e +0x6c2ced3fae94dbd92f4170b63f1ff6fcd8194f60937b22b4f3c95fc9e104b77148f9bc6c16a890de86d9ef1554c96fa0 +440 +0xa8de55170c6dc0d80de32f508bf49b7046aeea4b975a511b5ea3dc853bfa4b1e0138202d6785f6b3017914a86f824288d586dc0e8bc924 +0x2bc3b10c148200f7919b57afe1d7db773ffd235e04fec6897dd94f13ad9c437ef50900a40937f82a39daf2aa2b3dfd68 +448 +0xaccd9d05fb7ef3043470836137554af117440b3ccca7a280285494f90dfaea60dcbf40b230271932cd3875b1d3dca60d38865ff874180efa +0xb9e02df93e9254180d6a15288d77088b5a5ce517644109b4e2532be315f08dee43491608a1127dcdf69397406e23d231 +456 +0x32b835c180cc4006c11a61c65b03c099510e1d4f0a94b63d54bd6bd5a8ab207ab0f4639206564edc3fa6af03280a67744f68106dc51ee35723 +0xdf97a1c5dda6f9dde749f213e429db84f0dcd481d43bf58e6142968d629ecf05b262830a7dac87f67f4383975f3e821d +464 +0x9409f9efadbf190b253367629f8f368c9d5ac262e94ab86f3559f9a1fe1a9b44b64e313121b34d43001c430bedc62fc586ea398acd8f17c7cfa2 +0xe1a69388ee6b6d234108ec29402cd0afd74957d990c7bdb544cf11e8eb2ccd170b6b5a74431be70364d7a31b926ff53c +472 +0x289586baf8daced50db14c936529a0a6438eb5da8d3d469172b6a06f4ff3a956d4f9219563ac285cb8e70074cfcc152c02593a97733c36f4a9e97f +0x509e996c1e11611c243021b8b78f2ad90c5a9263bbf35910db7c8ec102aa7c518066fff8ce88562fec2cd6dfe04056ae +480 +0x156530cd6ed3baf1fd7232c7ff204f3c7d4d106016afa3bdff3786e84843ec556115626fdc84b2e874f1074e4f7d53e08079ee9fd01f80a8be7f20c0 +0x7b8a598029ca0ed475a72c0644ac81c63d72fd51305dada07b0ab4a29e47422f59e12643179269ca3d7d10446b372b2c +488 +0x30655a6b5a5965db992e7248d24141055e988d726abb8e729dc5c21ffcbaedbc0b1b5fea35b8751f6ec6625517312fff2234014176269b60959723787c +0xcfaf443e95deeb3cc1910771a2c0692a54b18b3633dc5414e71ae08877f0804818f67f7196c52e26b762dd12bb7a86ca +496 +0x345c3c022e20144e135604078762ef5c8a8f038cf1b1d6a91709b59dd068396a9e971ab628f74886e765384a23607c1a1e6e973f8fbb0ff55104c46f5db3 +0xbfb1d5ee3a0b629058ecc521c706c2f9241c48cda3dcfdba660a2601d832a7a872a2bb840f3b98d21c37e28f9041a5b2 +504 +0x0b94a0f43a92408963a59ded01a9338283a6ff1bfbacd9051a0104445c7f041e8037afde3b5a87d22d5a4796144cbc944091d6cc47b5ffd1f997ab1496ca31 +0x07a045c9590e9901d0598e604c4649554a823de996fa438cc81a634344eeb98e5f3c0c234ba30e2285a4d7ab568f2610 +512 +0x93035d3a13ae1b06dd033e764aca0124961da79c366c6c756bc4bcc11850a3a8d120854f34290fff7c8d6d83531dbdd1e81cc4ed4246e00bd4113ef451334daa +0x8d46cc84b6c2deb206aa5c861798798751a26ee74b1daf3a557c41aebd65adc027559f7cd92b255b374c83bd55568b45 +520 +0xbfb94dfbe0d9a509b78d164a722050054dad91c9a8e260545d037eb450321aac48ed4459fdd8a41572bd6c9c84d18b6ec339247482cc3ee52a1bbd6bd4ae918216 +0x13af0be02986ea3176e8c65534ec9f32c23b53c93a73b15c26b9ecbd8a1181ae184a372e9f5e0596cd6606849aeae8e0 +528 +0x1c8924a16fa7c602aff5ee961798bd44fe53798bf44c3d6b0d13ef837de07377651c1e94ed236eb79349f86ac31ba151a7e711c5407e65beb63824f6ec39754b58f3 +0x5be6482851ddafde582f2804071a702ae39bacb688741b7c37bbae99821ce4d3f47d5b097fd8eefa0ef9248a34f5d3ce +536 +0x184215145da49db417e8bdd573d6282de073e674c3dea86b6c78591d4947f5655a9d9eb0e5f4ed046b1d8642da9aefa80448a299504160a1b000c9b4d3c62ab69b3d96 +0x8995cd7fc0956e124075440686beece17a6256b282e7988a0c998f790e3995c974383179893477bcc32d1f114129b496 +544 +0xca7a63adf41f4da33142910c967706b5c8a093350eb3e6d3aabe69a46a2872f47a39bbe77cdc1160daa450225b0e8e36f506978ce3ac9ae5f75721ef30da46b28f07242c +0xb89cc12b11e3afa58908580c47b25407abbf584f8e8d4b5631e9f450464c7e53cfd7e9f9d3cf35e587a6f02957ce4c28 +552 +0x1da41a0af202b079521deb6109e312c2ade48544d2b498c07e91a102dd4650ce354f3f201b3ecab8e85e21d667959b43d08f4e90fa18dca2ccca8f6ff5e9a902dc8bf5c5da +0x5c297e20c307aab7f325939fd4e2883b034fd547f1dd17fb6b97ade8b148e06ebbf3ff60cbf469e4933d5f48f0166cb7 +560 +0xdece42c8849be40c78b8de6da96c2a8d7e940545b9f3f39aa1ca03ec60a85471aa84d8e29f095874f331b90a4c157da9eb048d2c8fd235399672707366c766f10bb833f02183 +0xbb509e33e9ffcc4c01233146226ee9364cdac5658132460a76edf617a035b197c86434ee889438581458102618769382 +568 +0x952008ebdedd480449bb96a025576c5f617bbb8307958a010767e0d736ffe5a196ea4467d8a5d3ba1f5476ff07b6410ae659dcef520a2c14e3902f8b399a289f41f5fdadb502dd +0x9b63d9145bc714a8253dcdb8341b2f5714eb58b9d4b22ce45aae07f51297a3dc9c5b691a8a3cd438dc5bd18be400af21 +576 +0x100132c315bfc9c4fb93023f5d3500d7208a68acb4d2c63096232c361a161c4c67c0a74bc3e4d72c11664b1d970321d405401924b3a0f6ce2b1a2899e7caa9a55ce725fc37f55d6a +0xb6ca04467ed3e623dba36f2e0248cefbe134cf555fdc14731175eaaf08e244ab0b15fca2f173a0ec98feaf359fb84a11 +584 +0x99cba4019f5478789e674e08fe5d6ceadd698b0757ca39c605457c22c3d3b8ffb797d2be8f12960f099a5606b908d47207b2636a779948282de3661bb08b1b37ee576590800a492730 +0xe5378c7c251ae96f0359a30b3134fd77d61d0db68c42a1a2aac293195a596df42f677e6cb98abec90d6722baac63fc86 +592 +0xbb327a0bcb2574df47080e8c0d8a45ee1c0424ae0414dc0a9b8717d9f27d8ac987c7c9ecbc946073884d1fb96dbdb583aa758186b16fa429dbf15b8d5bb48cca71469e7ce0ad8e7fa14d +0x0f75e65ff8494ae28d9a0a2e65959653275fc34b2fa27b9e10faafff07c45addef3b8f25953d5a2e54e31ebe6d429d26 +600 +0x7fd9eeb5ff368040d299fd17a943b21d65deb2eccf6128d18a33eb174693538935374c32c333a867821dba08636f20022c2ce01826c7b7e41640ad186f90ed0ac647d47086744867e5c54b +0x007251a2a577add048b1edc79d96c7df8fd5b5fa0d7264f122e4cb54c50bc316a8bc5f4f9dfd4469e29e9b030f563a6d +608 +0x7ca9e369e82186984d5fc729e111a7e5d8ec19c5d74e13b5ab22e4993b05c88ebba6ba72237389a6e0722e12c96c5d6a54515ab00ad80efb38665a76e831abab0fa5cf020807078441585de5 +0x3ee8c4184de9ceaecd0d3aea16271835f3d45c873358c93a515539c38e819414ea63b08d0a109346793d5e0f703125eb +616 +0x5b4d945d55dea22e37821ec396476a4bfb617d2f392ad93afe67bcfda9cd9b725bc4ccdf516a83fd71dbff5a22b005fc61c58e471240bd2193ce13539730e63232f70f80308be48dab7266a1dd +0xdf82d242e4cdc2eb40bf3db6a56e1aa0a66e553f1914bedc65c8cc6ad9564b6e85df59f4c443cbe4e0aee05986f7d690 +624 +0xe865f4a42bbbd0b73fe275b8ab90d3a9fb74ec5070192d38f60efef9564498b9adb716f31d50cf77c20ae4b2e85515307bb8d95fbeb9ad964001ac550dbc60cf213fd8a522edfaf54e5b1b93b2b2 +0x091fa9ae2184e2268ef9ef23c7c809efad244536e00aa9e8b3a6c228d90e31da051b40f268a13bd6f62e69c91ae8cd2d +632 +0x1d408c7b68e168f41bb46f9b2e9c8b04f968e4080252546814cc1cb2917dd5690886a9600a09c2673aec0329a4daf655508b06fc1646ef3bb3a472191d964db214a96a96fa89576ce4c4f6dbf1d176 +0x7e23472c03431925f3b4559d886e8d5d837b3d39b8efe1b7a91e61a13810c4dbc2439634d7c6ababfc66e9b18e6541db +640 +0x54ae030a4e27a05c1ea4a12e69c67544af9b4044cf157dc8cebbe8b2d49f9bc0779077603c90c5c55b891d3ac33b87b65e79e1b19695813718191b3bd8b7e42d5583f7cf1e60f84495b8f869f3719969 +0xcb65f823585773cb8802b6339182f13752a82864c898b445be5a11a969657ac2dc4a3bbeb87ac0abb232a2b124171096 +648 +0xf73cd386f73d0c6ade05771b33117117c602e52693f05b47e90032eacc39295f9793258fe6512eeab291baa0be222e143295a28e8697e42fa27ec02b44217f32a1edae2f4f35213562ca37b6d6cc5ef72d +0xf665c4d17a83d65a7ff16bfce279b58558250d76af68b8eb943753e411a57ceb31c1a131e54bcb7672584416e3d5719e +656 +0x1d259612e6867e7d788c71d03c5136864ad6d84f24eaf913a34e69333116f812395288d4dcee6665e6d7dabd005ffc6327e3ca305cab78569d1107a115e619fc90110436317925066726774d1da3639c31a6 +0x5dcf512e2b93d6ecdf7c3304534554ea79d22392e59bbe90df21e978c9fa3b34ff82e6dcfe8fe2236aa4af4e662e2a9d +664 +0xda8734414c45fc1d5a75a3cbacadb1bfb523d6fc391f882d0db0eef21f9ffd78b6a1e14cfad09e71b65cf7b05d7e8f2f4bae4e454e16068d65465639c729cfa92738563d37edc9676b7be604ffbc68ec3b6b72 +0x8b328a31adf67dc7aeb864a359628410d5814a2f0cc683303f61432ce32177e1f538feead7e5000343916c7042f8b3cd +672 +0xb228c75903d80fbc6d1cf629ff1d14a92ec4bf0e121fd97bd306ed265efe7a5d5c5d8fc764af98ed6f5978f88d7cd8bcd71cbef6a58261d201de3cb15b3161287e6a104cc2cf882d839f1da0d3f68b426cf08ab9 +0xfc92ba4eac9a1bf120a7b6c2cc30335b9615b1a98e55d14854ff872966e71040737401c6bc08db5842ceace14cb7e7ea +680 +0xc90d473a6fd30be9a98bf442a9ad65a697d4629c33cd517dbbed02710fa8ee991360bc8e557b0a0bf0b869e6b0c3a9457607580edec3859f2060c9c0340289d53a5d755918ca54876599045a86a9bcb8163795ea8c +0x807582b2520e990cfb74367343268b9148b2519b9e7cd9182edb3db9ae7afebedfe8ca118130e2ef9d31af9081da8222 +688 +0x6df8c5c28d1728975a0b766cd7de63bbe7f48c3db3e6fd5a4b8df6e3905cef0351f3d973b4f2a7eed80b0de5b85c877353fb9e930ad2679149ad4cbe69910e68d5500b096c5abdbf27d684fcfcf1a57f02769283d5a0 +0x7bda57d21a4434aada6758e282e612a4c0f41b242f9c790804d5bee25b81a821dc6f2a0ba56f1b3704802c9a6e153d85 +696 +0x2cfc76f88cb6fb90927b69526ad5f03d6bd335f4f75b52b6a3c21e8f989ab0d03acb1ebe07e68a87c1b5607acf17d976e10ac4a3d30a8561d49a5e7ec720edace9f5f632b4bd63e104f4894a79caad2e1c31c736453485 +0xe16670ea837c259e418d3c0e1eaad4948c3457e15b1573056e24da25bff5c66b7e95d24c6bc1b8d6c2b812f64adc9553 +704 +0x3f05108c2f33d39b3aa9e73efbad4b011b4e9e9fba409b7611e7e03956b2f3e5e0aa86f68c4bfada5f9223a66d574b08f9dd797cdda8f3c32d8e01921711f4870dec676027ecc56fc2010b496e95cfbf071c820f21edf25b +0xb272bab680f3ab27de72d94df384323f8555f1d17facd2588ac8648def2451f82f9b99c05ead8316fd181a2cfb97483a +712 +0x1ffbe1aff0a1e7fa3e68be31a74612a1519b59397e7007ef61fc015f316d55b57be528cebcc2f09a2f22e3c5e4a6ae9612776b17ae87cd763c1a9eabe6846c5bcb347ffc99f10e3b5e64b29a9bd71a5e9b3c01a802715de2a9 +0xf08bda9d6762607519d53fecb0bffbfd3ff2924854833a759d631e910c42ca86741fc2e290af42e94b94898609b91390 +720 +0xf755d6b5642378f2847893901d9aa91c54a4b7abb97c5c7184063e8f1e97aa2de4ad7ac927dd3cce770c906921e2d298f67cf9844e61bf104db803b265b86b821c5f4d901067d07b38764e3f6c95fd4f28e3cfe48d8a9694a8f3 +0xf85e98ea054455242280854e97c4ed399b85ee7bc5c5fc3d62910a76f3a9600c3d904c832b70b58d7d998db8dc978135 +728 +0x773577f3a642c4f13b1cb1f4103e9f6b2da86268a52f449cbb174c8349e3c0dc636ce85c373115a337eee26f7b70ba1060a79a1c76fd186399e6a5255db80f83b0be4a34ba876f7908840553ead380f3195507729d067ac2ee8eb4 +0xcc27869cd7e63695d19082446b068b77dde4e8604f8c0e9ce20a1b71aa9eff1460f32d5a54476275bdee8e7621491f46 +736 +0x651589927e17e1aef780690f3100a377f0179b18b31fd5b4418c84038573fc559b496a782beec3dcf6e9faf5aef676e10bbec34b1be5888fda49b91e02890d2524c5b369f8a54175f29dedf8156fff690cf186ec77104a798315033b +0xda846042fb908eee5f5defd1055ff3e57103708278d379a8681f58bedc6ef89670b9f957c4e0edcaa42dfd8cd49df6ea +744 +0x678652600eee42580f73623412e9c011cc02dec4d4cc1b79b27b6f9939695bf2185b2012ab0630f317d2e2de95dd69890e430783e99d7ed121c7c8da9ae70780b5aabf9022d1435cf5ed6da6fc6692c050c2b5f22b24fb1cf9135f9cb2 +0x8a6ae41c9bccc16eac4860bd5fa91205a86fbfd09692578f7f36b3c135d96f9e9001c192dbeda975f7375bd43a23ba68 +752 +0x416d3fb7b401fa5e78cd96d479d8860df147eef03adf13fce1c61131fb89cc2ebc63289745bd7db9bef14571a55318496572dbe52b9b349ef59f406cecd68909f364325380bb75f3aa62503c84f47a55aa6b9c9b199ebe414409ff3964cd +0xc5f20542e0c0ac1eb433de6229fe5baccfd4502e2c2275439385efda6374a1d0fc50cd9bba4233d470ad91a3356ea315 +760 +0x6f09e876c0b83c9934ffb777f006338c5142a31375e9b21cfea9a7de12998c4ea6708ff1fdf5a8ee6bb67c675ffd8209a10064e2d758a8734eb48f07f7cf3d43b09f1bfdc5d07a52b77079f23cec28bf863bed97c859276df7f7129fce71eb +0xb3c968f3025f87dbd5cd3d364bf673e62827c35889532431becd87cfbe2cc75b7ef45696d19cd3452d0e7c2b69d09544 +768 +0x0dc2b226b3431c69a76addc018fcbda22bd72c8ff01ed6549596798bd950f361c489a09c95cee2dcfd6401208ae6368d6630026b417cc4718ccb8b42e8872937de66895fd09142c42f066bf0ef3ab2b03803a8185fb65fc7148c376ddd4bf58a +0xaa645a4f8f602411260ace24d381f3f5dff0000c246343eb528e3dd027cd743815737906ac5c74ea83c2755e56b99509 +776 +0x8dc71c84c8772753c86ab6afd80e8d1df9b0d7e8d69ebe67fa883a82412c26738c3399cab95573b4d3c4367c85c81852d5a6564c0fc7caaafe16c05e62aa06cc9fa542ceb35c88fb6ab82c29d5dcd530f807d3f1c3bcb3974421101d1aa6ac112d +0x12239813097124e6248e7dbec985a6a25f622b1d07295cfcfbaff33b847df7fd94265e439fa535f3becbdb576922ac41 +784 +0x3df3edd9fc93be9960b5a632e2847b30b10187c8f83de5b45fcb2e3ed475569a8b2ed0784348f9dacce7b323c6b65071abd8b32d1022b1e12787bd4989d3c5ac329d576ccd7608dd336716532e9b4c7f825826fb2e343623ef85c6270619bf5e3b27 +0xf36590f5211a9cf84eeb0a3b2e5dc1164e813191cda7cb883f3f4a074605ce6780cf2f1a105658706fbd2829db8a2a58 +792 +0xced0ec6500cb891e6433d104ba5b1c1ebca397f3a5eeeaa0f0561729621ea50d4ae7ff1d0827178dccd84e4ca06d9891a90adbb7a9f4994ac947cf6296e71d2f49b826d64b123a7bf86f339fa4679caddbdf19cfed7d0206aa5f527a6b0cc00f52aa2b +0xc2c2d7d65d0b9108648e3233d15fc4e4cb62ed8fee9cdd18ab44b8486e2100fbe45ddcf74f46c15eb77fb1c893c12202 +800 +0xafa4a2c4fbaffe838dd149c78ea7851ea9396304b41806a093a90aae59c0c5bdb170cc9a7d22b90cbce52cc1b105108942df20c29ef3a913223b915e7ebc98ef135adefaa0f0a6441ea05920e868ce9d1ff6c8fe4dbec06a4849e5e55ad0627f9e09dfcb +0xcf6ef91d8567414f5c7f0b1f4ad09a976afc7c8327a382fca90f5a136b19be33100a664390a377f8d8a3015fb882125b +808 +0x00f65a485bfd381113d6e79bf9e0d5e518c891988c073ba198ac3a20f25c2c81619723e88a3c0ed3075075fbbafb6a7b61d3bc336a5e6d6f08d166c4861e6a3bdc2e49b2806b567e7e821a55cb674a6cd699f7dc61a7054a8ff3dec73eb667f59644346be2 +0x809c6b5d41da7cd10df90b02b193ac7d40cf2e46c139e9dbd208a988da2b25002cdbad1db2ecc1322da20b7d054e5fe6 +816 +0xb9ce382e1e82a873cc444248a3008c2cf64d18759057abe8f91c9d87f5dc83aa4eca0c51d30829b9a1d2712da1fac31f52942d77c9f20c2bf6d3751028d7d4f0d336d3dc92b27ec368caa4444b3180c1e37e98b58f25e647a9a6361f0b04cf78d17955766168 +0x18cd10b3ea907b3770e8eb91c974666e2da2525afe7020b872b3ec6689e5e1cd0059dd4fd49ce44d75dc4c8430c322d6 +824 +0x6778d82f3a98eecdfac55ddeebc52476a070094fbd65831801fdd60f837d80d23b90d472c5f4e5ca6273a50f40154ea8fb94013f6310ad18800433a1d379c84bdf799a99e8c7b676fbcd29cc2ed66552297de7a6e565179bb42b70d48299e0925a1d72ca2c792a +0x71f08d9333df5cb885fd23d6cbb1db84f9b55908d069df50fa4795cc713a18439bcab8daca078356f5c75a619f2f8782 +832 +0xba3a54a77d7c2b8ccec6d53136cd48827c87acdd1cd86ad1f56e862642ea2e1dcb4093f85d60f7bd77160738462e6c3fd3dd9d3a7c5cf7e2a1d60f489f84471902179f21f656ce0fff089278ea14441e04e7af71891622565f44c428044728fcc686212a32a5d809 +0x3cc154f0542d8e3cacf9d79f231416816178a7ef2275fb257a48a2f763ffa2e15a33c27b970a416a057925aa0412d268 +840 +0x7eec4f4f491b4eeaeb1cdbdb95e9511c2872372bf64a1f61cda1cd8032729c8beafd1edabf78036d80023c814ad8606106cb4e7f33f214c3e69c0f230e885474fd594f7f2444aa581e0c70ebf13073d89063eb81a43c5f608b2fc99fa1bcf5e2bfe62a6802e70c52ce +0x2f8c5682a07438043e55f0b7759fe7eea5d9bdfc8b0f89800ebcf777bc05a941ea7f3cac45d4659de0f505d814590b6b +848 +0xf3715b9e3ddd7862e15ee87aa23f1aaa0580591e55cff3fee9b49b42aa0c0cc8cfb8efa3eb96ffb72ab06b83d7b47b3d22a5772421cfc51214005150edf532af10138ad45758add459908601eccc3703e810002a2e4c6202e98d84281475d55d3de9f3d98809cce1f665 +0x04e7d55b0eb4bc3d3a21cfd2941dbb4dc44706588967186b40da54902aeea97b262c97f75e37ebe3cd60a804e7b9feca +856 +0xdfd7d792e162bf7a889109550a0fc4c415232af0c0d72dcbc2595299e1a1c2aeae549f7970e994c15e0ab02f113d740d38c32a4d8ec079cd099d37d954ab7ef2800902cdf7c7a19fb14b3c98aaf4c6ad93fe9a9bc7a61229828e55ad4d6270d1bdbca9975d450f9be91e56 +0x08e5ef57d0c2aa23edfc75cfae39e6bc1a43b5db08b2e27bc9823114edf760367db9cf3cd9c3779755f6d39e219b7079 +864 +0xffbc7c47f52e69f5c667f4ed578b46ff4592048f789081f3fb39321d0aa4627a6d4f261905649410a53a301c231fa787ae55c04f615a8f84196cecf2844d23007b44edd892649fc8ed10a2e855bf23fe8afd0b9edbb33296f5a7cf89f94634d9d1a2b8cac3b7f4e546f2329b +0xbe10c7baf94608408a0accfbc8ce95e159d08d8ca75dd6c273f935947a7ec3463e10a58d3ceaa0b2198b0887a3a24a29 +872 +0xa39f202d866e8e96765fbb53b6772537dec043322f4a7475247036d7495c987850cef2a46218d3fab36e3bcd595c0aca5e98b9db14fa484ca8c9772dfa3839f7ac3066727a50b0d5c933d82f82f1220720e8063f08bc283f199c8a4f85c70043df4fe55e751d0d71df36fa43d8 +0x3b2664ccb555a1b1f3ec996860146ea75ef7f3bd62028a19c26f63339399f4275a07f3c064d34766ebe8e4dd532f6629 +880 +0xb2c8261853e2218dfa135cb5387810352b8962e94e9fdc8695b41e7dba6ad122d14fdd0d2360dcc039ccce8b37fa0ead6ccc85bc26261d47cbaa78b925c6e380fef1856fed31dc616fe16b2039b1ac85cdee4ce04c0497998b41321868db08e35f358606585e0bb8c3da9a3be7a6 +0x45b286f49fd05c45c921b7bfdbe2cb024441c372e07394dcccae0de834cd541f13a79dbb3e5078896e88438542bd2f12 +888 +0xa04f390a9cc2effad05db80d9076a8d4b6cc8bba97b27b423670b290b8e69c2b187230011c1481ac88d090f39154659494db5e410851c6e8b2b8a93717cae76037e0881978124fe7e1a0929d8891491f4e99646cc94062dc82411fa66130eda46560e75b98048236439465125e737b +0xe7089d72945cef851e689b4409cfb63d135f0b5cdfb0dac6c3a292dd70371ab4b79da1997d7992906ac7213502662920 +896 +0xf419494c3c6d0727b3395a483a2167182a7252f4fd099c2d4b71b053f94bb8b3adf3b51e8460cfec084ce9415c95798fbae4975c208c544645b54c44d2b97f2ecfce5c805be61f5ba1d35dcc07afdd51a87baa990506668cf710e18be9b0ebf943f366fa29c69f7a6616de72a3353b66 +0xaead8688c58c6ba4e9cadb4756b465dce0fb06f1cfaa478197f2ea89414e47e9572034adfed160703c79b82b3fd7ab78 +904 +0xaaf7584d53006cbf2d2040e51b7feebd2bbf1e9f6d817cd8062a6a9680e7f10464eefeb50b07cb46b14b9b3fcb2caa3b9ab664490115d5919456613bf172b58c5388fd52646a5783535b88212717ef605314b70b8a085024d4ab1fcbe2be74609e4cbdec0730fabd3cd77151d647a3767b +0xe6e79d8c61d0ea9fc70dd4dec1fa432849c3396e717b170badbd87a4c7974efc590ab8c1183a6232beff14534f004b02 +912 +0xa467f77369730201f2812204fd63ad0d2757be580d937dfeb221a06b21ed3213531d936152a0c1f09f0ad5fed19fd11e80ad982c61203e86b2508279d91d99fa483e2e97a3d6a6ad2548a8da404dddb58344f4bdc1c9ea907088885e4f532d9c4c73cdfda43c3a9e4ce5a2809096593cfac1 +0x5a7508c2cc096bf65a4d4d337aea22008edb9a3bae869f94e09fb526a52c3368e9b28576fb950f078b7e43b5562120e6 +920 +0x01abc90e9180fc9bb8ea67a405073ed6848bf33048076566476c55836bcb19d3e55e9400c5cc657bc7a95f1d703c390f5a8687e7cd7fe9138ea3837bfcadad6258a3eb8d65121fa8319bfde532aec0e694961bddd2b673f284124be5781100f40381b6ff99db92ea9cc82a4372e53924dac398 +0x96b209d7cb2c2033b38350744767fa5c253e1bfdb99fe8418bff83804df02248140fe3b77b0bfd4a79b51f70405a434b +928 +0xb555d99056362bfc2bac2a1bbb71ba112d644e50b82b015e5a1ce3d9cd5e90b8b74b08d32119baa62abae251fc0015e400051ada4ecafce3681e5de727c20d47f5cadc663d46ac682022ca396a4b7ed1c413e0b72bd7eec4a0dfdc2a2185abb5d99afd50940528ca75ad89daeb9a1b61e15747f0 +0xabd39f79d72c6cd2e8e130f3603032fe3cef4177c3563930096df1f10b87e79cd4e2059cf1b9f8252184bb26f659a5da +936 +0x14fb01ae9d6015ecb3e56d6ecdfa4bc0533186adf8457f5e4a5c57c687895f3db395d06ae7ffbd67ec41452009550dfc1878eec0df2eeab09e8665f7e59f9148a86b2bc695b36521a55b2302f2e869aac83f14d6feafc9e587322c3c44f052ea1c0578884f84f56307bc6dde31ba48118a0f62b6fd +0xfc9b9a95a8ce1c157720cb63101a7594df24f4cc74baf735b0ccf6abb925478ad507cd048d30cde1c788806f43ed3a81 +944 +0x11ae0cbfee7bb3df90ce585f09b9cf8ff5bea69a68eeb6c22553f8ed118c9a61e7b752cc2c94f38766e63e1b891dfa05b23347b617d42fde3ec17eea6e76d3cb640bf8fa46586fb9dd5c4d9bfee04c4649571b781709f848ad7081afb6e2c746f071a551251050fd5df72ee65248ecdc24f2cbe74ed5 +0x3214b5feec925059149fa852e3ae285a6eb377df926504e2f824572a3aebd2050a20144e7bede7e7fe238ee83e69f72c +952 +0xa5c4a47a04f4714269d5d922ba4694060aa2df49193720c819fac93bb8787ec55a107ac9a6602f0045fd2cc8e66744bf863ced91eeabe60e7d2c1d80276ecf3bbe91f1757096cf589214f3569c2c48bd74be7f8befddb28395814780a47c180a58b0d0276a7e9873d682f473e27de7275c925ede23b6cc +0x6bd9e1303579d815f58e8c6c9855850133251778a632f7b312c4b3163b29b5ef6cb9511a08a31a237d9a7604afbfa056 +960 +0x75264774af69ec7ee3125e205bd6d1cb8fdb22f7ea6dbe72d1f2c0f7e2205902796d75e379c79b11498615c21c9f52b8761a885eecc69d132b2b48c63bc074c3055ee5cc13f51d6c987e8188b030b837e8f754d40122b451f15b28cd2bdd576920e1de5806593a36d8e1e89b9ef3caefee5acd80b3e9c9d1 +0xffa9e4e856d06227c1ccb959be558309cc10633173f4b66ceb382923b52b9150acfb08a7393500477a6ee4425a827e76 +968 +0x791a36d748695e62db5003a8ad367df1f051c1ac6a21d711823e8e069b546e3fa06ceeaae06de70a1de249e1dffd0d940edc6acac00c4c15504c02d4b0933658005423455f00023b01cdc5b681b6083379c24595518a47c654f5e1a10947df10c05a3d716b2a973faf98e1ee3b675816598bb8d4c2a3b06eb7 +0xf8d33369680524ed6c6a716d4c502de3eac891f340f40e82e37501be1a90fb61d26e5daafe92bc6ef5ec0ae431168842 +976 +0x74cd86bbed14d895301d8a54b2956b1c5cd1451eebab620b978d4ecef2cbdf7a14367381f5ee79281a773337740fb9f5853f4253c4b19f684341081d8f561b2ad773224151099588da90e04dddd565f67596c536d64c5b87e9480ad43601397507ad1b61ca0e349fb88f19feb48f770676fd562ee8259f50d0c9 +0x73ee8d29c30821dcdfa4441639f037fb6ba3a9ca596dc43428043785756608f6207d80b7f78e573174fb9dfd42f0b8cd +984 +0x46612e1a4d016c41700a3b5ccb38323353bd8da5b9942c9c9212df40b4bee06be362a15dad62c8b2924d789168b2d325fe35bd5100e1e29f1ac0fa7a60a94c9eee5a70cccbc75ac214b1946a5679cb523b378d5c690751b7a7a3b80d413712feae7024ce71d6295a3d5d16515c3622a052eb862ebdab81ca7fe3a0 +0xcac13a3784225be03d526f9abc1eb50a762e72c0e01172a15d578801089e5c9f26e53cc00ff755909453e2964d7df838 +992 +0x1a857c1f105d068ceab0b1e12494890ec196362a48b0200a0d75d712b18fb14bec6bb5b68a33b7e0b4fdc5b77142c29c6d9151b9f884f59551f476e5256986a653d4a468f28141ed954721f2cd02054df0438738194545ed70234173ac4988b7d62812de4f2feada14f68e3b41bc9948d4139f4fb4da5939f26c0261 +0xb75d92b5cd3772846f7b68064a3567ae43e5010099f2b649f35087e7592aeec176646fc8c2629288944261cd35b5fcba +1000 +0x9d36818d0c5a008be7904d1917aa3eccb5ef4f38cecb8c4e63c4b2e9b4b091a3bf25b4ed0332445f894c2a4c258b749afa17fad03cdd41713a869f899ba9a085e73fa9474a58db7a950d3a2386b60f79495d8bf73e72acaffdbf65e1989ff9cc206ba8c46a368d8512bac7c7c191d713aca949d45df297b1b6594a1a33 +0xa88da844579f3e3725d00daa8e1e287da4bfbb2d931ebe8d3b16021154be503341d6371d382ada744f86f5bbb56cdcfa +1008 +0x4ae50ed626ee60dc5ea556e3ce0d3c18b9e6225b5620814e8b9621acf8f939dd370ad9c7620d85e6d67a229f37f517d1b580acae8df0b5c9d29d756f6d5ebd3b63b554e556469b5b4f8e7113bad1559fb254ca827fcd00425d18b0be7f2b48c2544c48d90982ec624f490be65e893fa93ac9467f35a0a8e1b56d9a403748 +0xf8cd943f429333c7c8d30a8576827f92c92ae18e0dbcae770601b79687bccf8c23e9e589dfeb45c3b9bcafdd545e45e7 +1016 +0xdbed7612448d46cbe0a384d1c93233f02ffd1c984ba765299518656d3723b766c1658d4b1e7047cdc729459e366ef9349efc40cbd990f2a9a24db7a5045e1dea12dce8f9d9f2aaed933f93031e7b8959ac5e7bf6bbbdf30b48f7eb783f8fe292371a2f245c5c94b4acae160767a20ce7c0ea7723d97691d8eedda9efd1fe2d +0xfb531a1ed181c732311e56f4b56ed91dcacc0dd6bf1eb4a44be6f87dd7cb1ef9dfb0310f4a79eaaa3f32bf3914d8624e +1024 +0x3bf52cc5ee86b9a0190f390a5c0366a560b557000dbe5115fd9ee11630a62769011575f15881198f227876e8fe685a6939bc8b89fd48a34ec5e71e131462b2886794dffa68ccc6d564733e67ffef25e627c6f4b5460796e3bce67bf58ca6e8e555bc916a8531697ac948b90dc8616f25101db90b50c3d3dbc9e21e42ff387187 +0x12b6cb35eda92ee37356ddee77781a17b3d90e563824a984faffc6fdd1693bd7626039635563cfc3b9a2b00f9c65eefd + diff --git a/src/sha512/formal/model/PriniTestBench/testvectors/384_long_msg.txt b/src/sha512/formal/model/PriniTestBench/testvectors/384_long_msg.txt new file mode 100644 index 000000000..35e341b93 --- /dev/null +++ b/src/sha512/formal/model/PriniTestBench/testvectors/384_long_msg.txt @@ -0,0 +1,385 @@ +1816 +0x62c6a169b9be02b3d7b471a964fc0bcc72b480d26aecb2ed460b7f50016ddaf04c51218783f3aadfdff5a04ded030d7b3fb7376b61ba30b90e2da921a4470740d63fb99fa16cc8ed81abaf8ce4016e50df81da832070372c24a80890aa3a26fa675710b8fb718266249d496f313c55d0bada101f8f56eeccee4345a8f98f60a36662cfda794900d12f9414fcbdfdeb85388a814996b47e24d5c8086e7a8edcc53d299d0d033e6bb60c58b83d6e8b57f6c258d6081dd10eb942fdf8ec157ec3e75371235a8196eb9d22b1de3a2d30c2abbe0db7650cf6c7159bacbe29b3a93c92100508 +0x0730e184e7795575569f87030260bb8e54498e0e5d096b18285e988d245b6f3486d1f2447d5f85bcbe59d5689fc49425 +2608 +0xffd67890ff77f344ad4f067df2f4ff1db8f541c7a2bd9ae9fabad0faebbf7d00f0a71d568c3c66ac3c57d84faa4894ab2377710e4b4c4dae0f4da1eedc8658dd0e2ee2ffac8784515206f2876eb41f98afd4547cbbc68034212bcf0c8e4a7d1d43b3ed15c621f53bd8a57cada80148ec4652119b5af3da84169d81dc69d394c8767d662044d36272b77ca04abff7b6b0cf3bd1f3919a04a5d8ebdfe7d6e844e78fd576a68d6373ffd5d384e51b5e12ec32d5bb0ac685a59f4d5d12b43b533580750345310999cfe91cf2500624fe03a65769f86a627a667b5f3b42cb01da109e124ffa48203f1f3873202d35429f32e8263eaf9bce42ef40f5cc96b591467d464d00bd743a1b0af4c1a743fbdd0846b9879e092371a5e7f6f65937f9515e23820e60b83bbff73926f0cdb9df5d02e82262cf2e8cb26af6a64c2a4d1fabecab593db510281799 +0x1396fea95ce0c1c1c224b50a07dd7197f1d62b993c7fe9e1cc1a56101920d4b0fecef587fbcd56b854c8c9da95132f02 +3400 +0xbe105a6c585a766aa1f290b632219ff864ea6674b5e3f9846d447d46813e2f92b78ea82f0b515f46511a6f161d429aeae07f8e4853b8686c191877f5a06242dd4884ccaec76e16f3cc24e6ede212c78897a1518dde07aa19b3634d4efd090a48b81a4e535359a55b57397da44a3b2dbbd37636ac1f77c875824c88bb62dc90bc517ab78579b913643d81bda11d62d469da29c50bdbb1c967d0fcafa29582db1f59c98fabff3669f8c4232d4d2332c57bf6e08613dd5db5d6e39b4a6d5fa4f35b19325c2fae79aefe36485610235007da6cc3022cec2295ac0550e18388eae156d9dba8784e2aea5ed917be53e767a26c87fcc0bfcfa870d07b43fd4cd8fbacfae1ecfaeea7f12600f6b9ef7c351d9f1b8eb048324f984e2a909d253017805c2d788edbf9807469ccd45571f5d61a05cec80a23ef349a37a28b86e2970c20fad9e7e8d201a35ebbaabd14ca249207dc6d7e2fd85c46553420b325bbe980848de57724676ed6552482f71e8473308c2ddff94aefe34c724c8c52a3388e3b541d396d6722a8e201ad3ccb9a26497a50ff0e7e81f1eb109888ceae27e1ef0537b3bd14dc8c178f0c5dc081 +0x39cf9206d78cfb437000b100661753181b5f262b539c208b442e7a022cd3234c58751621ff0ee9e9d3607174e36aaa88 +4192 +0xb41ef4a2b31d3a47a5e8386925fb90fbe980ca2cf6ba34e814a3eca280d43b51e2a624b87e973debaeefbe0f90a3d861fc79487ab96d2bd1f0531481e0bf5c4cd422b9e05235125a969b92093fc2fc74470a3e9e382948889dce1ef8b7842c7972d9dba397c0619c4335dddf981fa33cb27ad420ddb533170559338f6eec55dfa515b088b601d1ba9f04c61a058476c2261334890fdb93850e3f7bcf6bbf7c86531c631715bd0bbb91527641ecb71c0d891b8361356110dba2c61d3f17c54c7765381ad81dbfb7a7006515dcb7813e25c5dbec2eb9105320a8384268dac56ab9c4aefd5436ce7c87d687ca73cdaa8413c09b957a02b0045c08db11d01d89815456c93612c9b10262fafdbd8f96fa95de64a3a6cc7809cb98aaf8b30146d7375105d0ea9a3c31f240541217b77a391a8e973a48ad83e24edb76d64f83bf7834b7b80a4475f916f429cc0d0074e12eba2c43a9a2a48b05382d54bf0edcee34218e57c0692a6628af264a359f4d33a21ebf4f39de39f8382f962cf918963dd2a6dfc93b8441ed2ecc3eb6d41dcad85dee4fa32f21f43244db1fe6cd9438131c6ab1f8c0bb43f5f2f27af830a1733927d1e527d6965ea1f1e6cf6a83aa4bd7d8160ccb9a36b7e53acae0f89154d1bcc86f87c37562feae06f5afa0638456f3cf51f82a0f1e2527cffc7b9f415e6bca0771405f53b05cbf4db3c570b547e1cec9c47efd699b1522792f50d387e6c9 +0x0f8ff0eee8ffdefb8b3151b7664ce9dcaaaf3f7af0b1e290ee49ba211b67863f63fa71202a534c0c42444a52bebf6c62 +4984 +0x52a6741b9ea02569dabf96ec0b3e2462866eea4a635bd7a42fad04f8e1cc45990f48ff2b627739634860f50ee8d7c0555bea883f197cae77b1305c50be891906164f9a474434dbf139b76f1e3e49155e2dae8b43e1a7a723ebcea31986c1b94dce82ef752c1e359c158dad22f4da4a0564849c5ea323ea2f434e825b23bd4df69eaba6bf027e6ceb44aa5625f2d387d2683263994739a023237aa01f7cc5fe8af090672dae9cab672ed6132c207cf64ea28087fbb531f188f218a66c7920f3902bfbd9c619c018963bd98c41661cbc007838b18dd65304e418f13b4b02185690b6b2a4922932db02d47a686bacfc04705320885690e602c2fdcd08c3fff34c12fb7d7199c7391d335f8250b3da65f4279c02b55ecc3412a70974b4dc58faff9f6126e8e4dc1f06b046baeb1fd89db4acb9a4dfad73835d1da4ade89ef67597be5073b07a4e2abd01efe7e2ba8eec6d8714ceaf4c6b1c0bab36414c12bfac3bf8302e726307a36baec4d4dc89e49c4741134acc429e4743da27f9873f9ce614d46a1dd5a8edd2373f2b488296c3f4696120dfe097f24c2d30df9b422e756d4ada64098250eafe4a3d8e0a7ce8113bfc6fa25490535172f237c6ef24e53387049287b92063e570cb3054e37187b8ba27f40172867fa202ba7744bfd66ebc7d6a853bf758eac571e39ee59b097c9eb91377a4016a23cd44ac77c2d1ffd1fa97a63ae989d2eb7447ba11a9faedcead7fe780f5c9e345b980f1bfa6ee4814d41cdd39f7383571d93a771008c8c585cb56cc975b919aef50feb0d75ade594131563a0bcfcc2981dc9443246acc38aae284ea453e233728790512484469d95ffb8be237d70d5825659b45d337cfef43d95268 +0x45d0bc363c4e0d5c1993570d7366847aae64ead4138d93acd843f28d3f719b02871736ba4905532e27f4bc8b5c2ced85 +5776 +0xcc990092fb16b6311fe4d66dd5c472215e807f82e71d34f60e58b32aa351eb5eab81bd04abf15d8a23aefc745878a4ad56ba631f36bfab819d22f9708586b5c240885917b9f2d6b0fe313485fb0a78918888ca71a739d72d069a7556cccf855192971ef2ae80e84db857c5c847e3b775fcd3fe9fc2f480a353a76e01ff9325b3a99752be12025a065a07f966c36b2900b98145d20f586e8b8c332e9ca6395b918d6e3ea26be2f585ea291687f80a95dbc77be83217ce688cb725fb4d492bf09347062ac74387817273a465526c29c4ae2eaa2ee661bc384ede651e3c71d0ac60dd455e542159c674fa622ef0a92e7f20f6f56117758ba47a08dadf93a59056a15a1521728ec08b34894ab98937838cd92843c7ecdca475b83e6e85776ed3b8fdc35dbd4911249a5a27444d449c8eb382cc7eaa8e1d6d72af87085a125301981d2205780032edb98ddd38334962b9bec3e88d5024c0506508eb90a48cdc82bfa87ef49bc07983b175b20eb4c1106b7343865802d74eb4146a72efac0d91bff547e0146db06f4f49bbaeae16d42f0b9cabadc707cf4e01497e250bbabcfb1e01a24f4c38f99bb74b07d901a1a94603ffa266c2a933489ecaec0bcd15c1a108ad60d38442c285247d003ced9f69ddba65d1b8312e2bc4f55f5b2c1d07450be6bf2a74a4d534b6ffa94fde5b563b7d9895dfabfcdfe14b6dd27391e4d670c21e00a73b953777b5ae959cc7340f48ac055975470b047a646eeadd4108cb694d1a38802f3db0b20a9b0a8e005e12b7f569773b9546e52198606e4144732e5934402f5c59858a0d3e2ccfcd90c3a7b1dd2cb8d89c96c9fc6eac2746a30b476700faace4bf550bb1d8cbae027f4a165eeeb6e4f564e1fa336eb8dd9565ba5dbc38af79c06b967dc660df6dd5d6daa6e5af70c339f611beef20ed57d69267ba7f64c65c97652e26735fd0d5ed9c5da16fa8c01c4d590c5e580db35fb033faa4d90da91e11b3074fe15c05aef3d9ba4d23620fb9d895bc +0x2d24f6afeef2af38849f29ebeae7012717d50f5a31561ebb9e5760b83766030d1d2394c8eb71e030226ecf0159efda87 +6568 +0x546a582d46de5b45d3f71166ef69aa0704848c0a3963b194f4674a1d9de4a9c3a6195de4c8669feb8fb9ed6a184af46a1a88b3ff2352de1f246b80b33028e5ef816cb7dfbcd667437539ce9df64d15883ca4d24b43df73ae8421e00dbbc45caaed4bac47aa987cf59060fe2710dbd40a75c0301921703aec1a71b250c61fd69df39e86441a13a6a8e514c42fee5dfa98cac4168f466ff97ef0443da7daa11b709a4d8bfd95afac047e3e67dd19394fd94598ccd53942790f0e80ca387eb2f2caeb41049ba2d458b362c7305a18d99b76ed249a14825382457a0fa12b3aba2453ec603845caea705a999567ce73a3a616ca51c874aa08dcc83ed70aa996217ab4a79371249459bda42c925461b3013862e5059d1c38cb4e4162c24dda1b4fb99524c3f560888a073622a43e395f5a180245296235b403a158ecb7b1e550adac9d6ad60e202ee316bb83b56f81ff150f9df2a660e6a7179db4e69d7ff2bda11a7581b6018c0fcdb1d957ac2d5f1c9ce5dbf562dc5898710afe575e002beb94cac5714919ceb2b1a238a771c1fb3d566266554721b20f78b0dd48e179b661ef853442799d0b9ff5af817aec737eeaab4de31a3c761d949457fac00e35bba718136afd2cd46e5f03a15cd9058a10ab0370fd4d2822c1b02dc6fcc7cd7b6346793c10aa4c071c79413f70cba450d809c6915af5f56ec5eaabc68c650692d5c578c8ce4fc07f407519536658b10bff8b5c79a21a8aa252cb771f52a3a1c33aac7f7e4bf6708100dcf2a3e5881404acba2ef07ec4cf068fdaf799f5888656ba84f52730a64458843533f99664b583081ca2be96fcace1a59f94fb1e1d9e937cd4428b2468244bf508461b21f37ccf3b3b21aa91c9097dbba2b60f7469cfc1a924cd72d043f8a17bde92d12d3e52326c9f147d1734ce20fa6cc69ba074022a68fd00a4db3fa8a33d3d7fe5624b1df2c4cee1ffd244e3138a842a6849462014e2e542e8ee641c9964b0751d6a24c7586a52f2f86701309e92724c3e18e80fc83f66fc08b1bb3dcb17bcdc43ead136ac86b3ad3081739e083abf93e5b561b98ea60894cacb4bf1807feb1c1d8d58543642777c6fc6a3139bacf26624c7b904ad3f5273f7e51c2101c4c49d74f8c3073dc428c67cde98789d0d93 +0x8103d79f14895bd39e568b4c8cec9a26f03966763c3b2a65174a5d2829ecae097a7c6971dfe182fd2a7a9ea6e329b6fa +7360 +0xb8727e619a77b72152a46d80efe1c1ad34f131b83e8f614967bd1b926b599482c9f1f13b6cd809c78b796d06ceeca6ebb2c7bde82e3701a7974f04fbc19fe7166709d7fcccd0d838a3f2c1cd2cb8886fa18bc0f3d00960050958c6193abafca45962398b0287abdb62b673bc536cf2a0c8e443c06c2e08c986816ad220d25b9268a51ed056240a1a8f6e8bba8a3169e6f17b4d374acd815dd672f710b90e8d495c7a8fb310cf7d5cf4c10fb1182f77a9e2f7e640b10f5127c1d275ba4f971932fd88931c77b28d0a57580988468da351640216c3eb1c02910f49edb8289587b4127832f3d4f2c18a81da80275c7475463f41e6a83e1b1c01878166f28c2f603665f174206fbaa2453af07d76a20b76f13b5e5dd7f33425e1f21fe84fc58d2a22bc9c628b9030b7a34942075c5f7b2db8200184395191a79818ce7bba1ad870dfe021031d7f7c880d787726c4ddeb2304b5d161b4a257298ec1342818d238b7d5992760bc83c79de98d38e2936284de3ec377ff312cb1342bb5f9f65236d4896cae567f51e6397fa0512c44b2376de8cc129a639939c54fd7bbc6ee508ed56d0ce9586ac5eef9b59b8cfc5309a4cfc9186ae397d20fbb02fa9d4316fa2262ec1d10d229fee430c741064f1880f0d2078893faa2c6f6bcd5fc2117783839a48d07ec6fc2e610053ef986ce9900659d2c8654868c5b38f0514510ea1cf31cc3d83245d43f64b9a1a02dd621e06f4959c07977305d7b1c7efd3d3166081114e65507e3aca75f282b7844bceff5b7e52d49c9c29f1e0de98e614d4e31467c67358dec8d9d03c1a6cc4ba601e0debe814251ddfe7bd7f9e84a06db2df3de1a5dd9074a0d4f5a7179aca3ba6d9da56e65c05f1ff36e8e2761d873519755d6d540fa4b8a296cb457e9f207eac7ce52add8cefcf6681e4d7f9b60301554fe389456bfe212aa991a5b40c7009ed91beb652394aeca26331be8e00bc6912c980c3fe951534c57809265c452153c692a7a7d8f3b0004f656014d7600bc2be7c858bd3fd8269efac9275dbfbcce2d40a606dd62eb770a9e2f0593a6689a4d4c3826f8a07be472591cde2b772cb3d92635986de4cb9d45e66532a3b86be95e25907dd75662142f3e1fc1b735cb4da8e27f37155f04f91d98a18d65f43030c638776642a8b63e3d6f7dd7e940c023033e2debbd19bd13fb7a8a20c1a2e0f7ec4e96e721dd9fea04b4dc28aae234bd5000e7bc4d5b1f744556c9f2a009a2c73a2e950b5c3e44a1ecd7e5bde0614fa4f8f154b3ad6d52a365f2050be8729f2617 +0x2ac3ab5299ffbac1c27300859a92a69a80f510a1f28b7054f131b43af74a0df5e298a9eab77e49ca81a578c309f5aec4 +8152 +0xf6b1cf75b5cfa4ab323cf04ff13b7a591b23d06ed25f3c04c1baf4c8f7da913cf509c2a5053c4224ce4d0723268cbdf2277672b285c493731ea81799d353fa8497baed70c59a4c99b7b950a39470863a69667ff67c9ec981ddb41ffb3d63dd9d034bb79d9df1a95214083199e4efbd770a7a5f005ef5c877236674b6dd1322d0624487f6344a43970ec014cbbd114af2313b7b98d4d2779d1b477e925a6ab165dc2ec74133ac01b0cd6b6003c8df15f3072f3988863cbe3aeadea6575d7072a49890de474120cbe478907d07ad6006c2b4e002971b3b8597bbb352cc8d2e4ed5bff234d007ad897d38b8d39f139c06a65fd63f8c3cd7b4fdb44febba93ab2b3f78dc31a42d5b23c1346aca95a29cfbe931975630901934b2fd39dae916f0f32becd73d8a5a3282f9952ecab00367cfd151adb14bc008ebfebff98621bf038ce1436ac04b363b8c6c828c3bb7de0568a7e7a0b6a573acc22b2218562a36eee0a9a41e22af6a7d2a64240d8573da7fb0b21df6cf05520ea1804d1db4cb22b9d5cb377acb7e9e004527a23810aca0dc8d3c1939633404357144699007ce2b6a558e2606238079cdc3fe25964429d824e98b03f0d9fb322918c09dfab6f9fa0b473c964a937da4eb8e31d5ad8ab42960abe804a49b2084f3803c12e22b1537a3921bb1cf813cc7628c08d90848133b97bb9b44dc106ba19a8fffefd0cde98a3b20749f1c5686893ba7cb5a2ce70fb7d101ecea20a0a632262f535d4c043f99dad88e88b97b23927dc5c17fa3d070451664231ef8b397dea0477e84df38dd0f88a2b3932f56db8b30d03371f46afe8c6fcf870aedb1084e0fbfc98b10d18c924d6629e80551761c5daf6957a71c8135e32761d38603bf2a7b7f7c9b683714ca320c39b0c3d3bbec0b4aab5a4450c0e77b55f9a44c0f8419ed6edfdb6ed33d613e7d2b13f24373a4428941a2546d844b3e4197a3c63e21c36b763a74aa0bcffc7a9f4738190b66eb0a5472565fdb950934d383f87cf85cd1007ed48da4489146ec5bd548c0925c6a6c93889feb01bbc865f404ccf6a6ffebb16ff64fe5f34ce49e9a1c6a6f401dc96f2ec9a48249be30da8a6447bdaed0b8882fe8e2f472c881984265c7af7d70af1c0d7e8eab1a65ea9a7ee990587a98e18ca7f26d592fcdc3e03cf88607b11fc47919ee84efdc799eadb9dcd04f701e0dc5bf5c189d90235280711dd10044f0b1913863afd4f8c3f31c22852e2bfa2ce53c606d0d47ff91d780c81ccd209fac1e69532336e4d40892eea02bd3727f8811f8706e71dfe3e1fae6283ca4f2281bb20b537742a7d913232b1d17e6af67fb3801d8a76feda4d962bc7bc67efb4804167e1ea7fba46fab4ddb80929067194d026081602cfaaa42b80aa80282c56730f2ca9efb8863ff97b807b1e2f924ff46191c52e1d38d5c +0x70a597d1f470d69d7b7d495531c3182704dd60db5c73429fd7108c8ee22d86ed5822adfe6352f28f93023f46cc8d60bb +8944 +0x102401c84a716ae72579c6ae79c359ea309ffd95abffae4c61884c03c9e99df77b6c92e492cacb7854445c0815efd283585071a43828c06b069148cd344a98ab71508c0116aecf60c1959f9e3fafd0ccb0b11468e53079d40db5330791139c833cf879869fc37f85b49516d6c1ab5cad7feb6d497cbce26fbe1b9718a9ecb267238de0ddf5b1e2d0746c4919628a7d0e0f2504b0c377012560ecfb68447be03f6d374a6de02100294b41c0d0e9f53cd7a68862038406e0dc3d4fe85f2a6b30f3631d3e9e28bbe2797f3c04611f939ff08d3c0eab8514877d9b6de5652262aa6b4d6844d894268fa659879c36cc0db1410c6890118f47fcf1c36e7ae2f508558f733fe483ed0b0f9a214710b5b80a77b26a34719c6947491efd792f3e6b0739481ccba707fb116b3b1fa7e948aa33fb2cf1c938b3ddbd76ee91b68de14c045e7c913414cd86e1aa739bcdae566b304495e74f6dc0b1518948c64e1b3360aacd141ba1b43b5622d429dce1e747c4a85ad795ed992aaeaa8c13e569619d6f9e8df9003a0dba327df2452b0c1c827a4346d843cc43599c718639362ee885408ba6118829a9b3e49a0baed075d67158aa0f823914f3b5434d80a101c637549c172146fd93108c3220274e13469c7b2585bdbbbeec31a66ae781338e59d7734bea057fa5a3c8afe5b84e0c3ba4f708a87b596d1b7c8694dbe691d7240e4e4815ad5aa4ca7e5b82c50989d092b96e80aa35e97f99ed79e75cf3b8750d0d263dc208289cb24f516f99bcdf825ead894cf35b78d97e679307b6b6fff58f7fe6b919a27851a53c30dc2b78590be8a8d0d24b940b6312115a5cb1d66d3ff38c1724e32451aaed6d823341e6fe5178d1cc7b7a88ac059f14584f14fc0b3c815b40e5e835bc8fd10bcedba4add63d565004af47e062a76b981546a9cfe0d28015e966f07ec0e8983e9d3c1c76e9b7c94e00d77c443631bfc418aa36f8f4ea3ae19b0ec3a7659d8b2d76be70e940a81af34959df5b2e8be3c0e9e4841e4f6df5e8dc452857b397f201e1c96aade2f69266669f39ce559d1fb5105a5beafa41fa513773e936b3bc15e166c5d06bd78b77d0df0f5144b050bbcb15768204fc5091453100cced6cf53bf68e1a6bca284d11583d13f166498afe29819fc3135d8001ec54559a24e62bad68e0300373dc26aa270712dfdc273432f8dc3ce4bf25bb946d27d81a822a44b45ee570600dfbfd8864c574e44d52379d5facb7aeb25de890f132f216b03f2a9600234049418eb9f43800a0c862d37987877b77e9910def3e9ffe0b54562dc39b77240987b79b4436cb3e0053c2b1e43a97d0e45d073bb8e6a0128c9e1bfdf90deb7034e3162d8596440afb4d15f45ffdb83466d1baf12ad01bf6dbbaa7b6b232838d27220749645ccbe9f97d05a5d117122e650f52362f4339336270a360d85468054c0f31f9c9cf8a6562ac38ca24d1cc4649dd7813ae892250888ab70452b9c2600a713d449c38a6059fa2566e3f730f047a04d48e90e8fdd5b4ce8aa908a9b824c80fd233c5df4a51162708960a4502f1614c0db2bba9f24b5006c5 +0x81a031db32d465202a2aba19ae6072148f3fcf6fe33fc8a843c0691cf845f9cb7bbeaaaa04ce2f1476bece682632e20f +9736 +0x98afae971df98e02fc3f503d0b12176c2ed77f4e7962de7194c7caa2646cdba8e763b13260f7390db5852d9a158eda80dd09269ebdfed1441750fba2a7dbe78069befe30b7fa17c1b23df576e4f8117624b79ac5b9b2bb73c29f1c14d5cbab70e6699c7b6a2aae87bd0eb1b8c17945b8c989e4adb5a723685e5c34df3466b0de250c93f9c1ae89c59ca06848f439fdad94260b3cf804918ab22f4ced0dd47d33ef4eec9404af2de4189c220ec55fc1bd4f37175cccf28d4188be6b25a73d9ad80cd7ae327a54244df9aae7f17c131950c06311f47799a0f5a6b4996f4cc890334450e1bd6cc6f5670771c0dc607f8eceb15300ec4220510ed5b7deb3429de6ae5f618e1c222c28990a9ab4b4bac8a7a0e8afec2c75b029f4dd6f43d9d2e524b024b1bc37e4af454dc9cccc62d219ed2c2d1ede9b5870af108686cfca44c8d3a05ce973f6fa77d5ea0db00fcef098e7db4a48dc2333896bc898a18b6ce06d7ae8cfb0bb41abab60d89eee85e05c6d1d1505d6f1ab4d22e585da6b7da8eefda1ef45af9d0041746c7e442d36815dc117432870221cef64a6b01589af67b59fd01d868e201b02f98346c7152b973dbc5ecb79bd795c617735af11a6298f7e7c90da59f44d7a37632c97ee4f6b0b42857917c166fd54eb821aec9668f10991bb688e88892a0627d9f0d98283fec6b545f08dc712b6ecd5addecd6c7711be3686e1a1d9f6c2a51c8455754c58edafde234c97556aad0d662208bc5a7c9195b502817c15e31a405c8be5d111773fad0448139c3116e99de70620202a1f77755559d38504f73cc0301728569c88fcaa70dbd00424bd7285a084ae61a207cd485fb35c256ddb2f0be050a56cb4322c8d6b050836f60751aed9c13be78bdd9bf51b37a6c41937fb0bb45de47c201dd83e3bee459c6f9e8dffdae84e19ac48e764d10e38cbd1b2a9a6f4676deca9f208a428bd0e9d57272e5fea1f7061cff1bb7dc95f9aa05bf43fc6e795c9261759c2a97c9beca1754d3db8538e2826ba7f1e284a5355ad7fa6c852d6107f9032f910347daf661092b5c1f15b5ffed1369b194d9e12f0590770493209ff1794c17bf92e75220453760ac2f24bb77ac80bedb2d40bc3f30bb9f9cc4ec88b19998e86867daa1b4ed0e9f249a36bc12574011cf3a5da8fe62d5fea588e5bdc0e075fc3bd0a65c3cdf0b3155cec02a2863de0d1e4a8539d5226bfeaf6da09197e45fddaa8bded41081b9b1d06b55a85268c6fb38cc6bd16bf5ea2a2ad1a1c6befbd30724f7e8cbe87ba6baf4ce6b9908bc7776bf3e56221b33dcfb98536daf9ebd6bf33b8368862d333e976386768eb3f58c0a021ee88e7b82b10d886168cecf9f874c7edcb2a5473f0de17d120afbfcaa512fb1fca788f55902ba7b9a2796ba28b15d3f627babdef57113d1ff9d534b2183524f45f7a4213d4e9cd25c3eb9f6cf76b02d93080c4d0d24c8e2bdb24718117f0c2a897d528785f12f3d25f28afe1a53ef9a0d0c3929dc855b2fcace29fbe0c0d7d4459d3680e996ec0c95f79c489fb566353eecd4edea1f5529a5658e5f25e52ffce8cba2b5debc4dd11ac2606eb627ae6f872e4211cc4f4160ebfce6ca47588ed511ad398ecbbdef1b22c779c8f43742a99435133dd9b1aa55fd18b5b5cb977f2d2ea66d8437282a5b5c9b4affd040ad83d4b5cabac8d2fa89572d9dba392e6b45be4bb12ea7979 +0xb31950d784b30bb1743918b99fbd6693b30fde41b0b9c2e154425f048827a161dbd4f3b163b5ea8b8d91bcdacf22e84f +10528 +0xaf4ae11114072bf854a76a1b8b673bb7cc9ee8fa66f0d4cd65c51af15cf9714d62d653865b3f5ed1792dfa0502603cf5534e0afc256080d90f5d93bd4c26f4a3bfa537e0340035fbe912afbe4d1b348d07b644f73a0cb58b074856ed544bd329cca0d84627b2791fac3cd26ef402ea2af0bfde132e5e3b8b576caba7fdced48693af7de1bdbdf2e4cb95aa3c7f7b2872174f1f7787bcd98007b3d913cd18c0621cbb6dd97d8968f34d04815177f0b40d834f504cd09059121d042a5b4e915e676daaf155f07ea3f33a709dd564c857a43ca8b9b98e4181eaa346e4a408a1783b9066517d9c056a8d9ac347efcc6bd9df4b40a2e74b371ab0a063501982b1d4868dd5d57a0b84876976e4c7c739410265b70153fd8edaeb0c1d42b6df44273cf16ae1c574c565c02ed5bb658632b29adf88d21324e092bea421cb5e21d66d752331716892500ede84c0306954402668f4c79a2c84c8c75923b4e68f05c1e94ac5ea6c07fd36e9a9153e2b1a58e905354d7b43e444cee1852fde7b93b38c05827f9bbceaddff5ce8865794c2bbb8b7c991acb4848d7a480a70a872b054bf28e4f84e48595931d165821353a7a432a4ec6962d553865564b09019b32f10e2b93ad90af89c9956afe6af7b50113ce134667da68e9b58e69e3f343a27580e7e224ac9d8b4fac6f55e34b596744aab4cd0fe747fc7a22ab55c7e0611b472771acadd71bf64bd089746173d6da59918fbde7ef7f668b2254b0736aea943c7723f19ba79c7f02b86c3cf56ef06cc45ab77c8acad125911702f082fd407bd9d287477ab88f8408d690161bb726bd2978e47f4503fdb820735e9c5311f35083dc1414c76465b3d2ad8d9640c6fa49dd7e6f3cc345459ccde9902a804373a0eef642e00e45df7cd4cfcd440128db7174dde04b61f95951ddcc601186fc51eb5fa39c4fbbd72d4d939fd795d9575ae27409b011cd8a9965f4be46e7d3c71e9e7a8698aa6c930fb4a3a0251235dce90b4fa487265283a6478711ad23e31e2a48b3f1c0967cf3c73069733e3fb314166a8c10bdff9d7ed08529791b4c517c157890879c7a7994144f798b9b74bda7637eade0cd140ad6c89d304719c79b5b508c94ba94ecfede5770485bc557c21140b629974d0a2725fefe502e112c2d567c13250d4264594d01314a56346f7ccc4ebf8396b6287ed6d436fd7099f083d7e89ae5e20d57356ab201141d71123a32ddd9408181157e73f8c58cc12cab3b6a36925beb8e5bffa1ea7e2a1403e6770f8ec1e4ca4647a287dd28a29241c2b087e677db9c2de934ad0ae6f0dc5552df9cc1d7e4e37e35878ce1dec36661cd9fbb68e9f956746560c6a40a0cd8edfdc07527a9c56f717599fda76663b01522357f4e3739acea7700993625d28c464db62310a60ab0f87e6644ae4e07f1d4672e3df70e11220884909f41e8e688f6a94d212d5b397a5bc6590c670424be0812f68203cd243847249d4357b1bd3167b6e1f9de47b60e23c40ebf52174e7758ac0ae5e4f2c7623ecd831fd82ecb2821ed110793ea24fed91dd3d80ff5f9b02e98f7d42b2d9f4247e5ee9f439e94cfadc256f4feb0eacef42a64e0e12e9afb027029d746cbf02b0b043c4c3aafbeba73bd302c6f4a9bf0fd801e64863fb6aa6cb83d59b85c8ebef0bef8a12dd08d5b1c54192876059cf76da58ccd6f97e150d5d79ef5f06dbf50816ca0388d8f9533f02d8e6393708264bd012c95fdc58f80c654cb16af6df6a24593df7cea5b7ad797900c885829d0ab74397a58b15735bcc6c63e4615dbe906a5dae2d8c4c292b88b222fe134800c4e2ba4f2804abb58674f92850ef435fb003a9866e69d3361594 +0xe35b64497f34c095a1135e65b6d417d69e8587fcb53cd700d10cb8a1c0ffdd97144b6cd1221b25169ad42d1826d10bac +11320 +0x542c8de3e29172313cf43085df75b41fd77a1eb8c9a4da1637020cdf008432ab26b2055cd49d9fb2a016e31a0d1f1ac7549fda04645a2cc9271fed8c07437559b14f772518f62860bd4aa4c92f2f8d86cd0ff574d3cf7ebc9502bfa7055deab37b6bace6b68255621ef6393a4b8c5684cb3237af20ed181709124ad703b9d9de0e6f6d46b42b6ee148846b146c20bde8d570675e539a41030bb756c5073f8a05f2c180ed1cd8ba04c55a02ff97d209db74314f2872c042a82459aa181cd7444eadcbad84f67182f41be2c6a5d68a84842fddb5b68746632ddb600f79476951e1c9f4beb348dd0ed8d5827fab3030740c8edc62af9914ecbab9354d9092ddf7e7cea379211c06a6d978a4f4bcaead229a19961ebcb1122579453e2c04041b7f884242a87779d3921f8eafee7e56e7d6575974b085d628569007e4747ea50c31ebaf38115c682c19d19f0b359932c7d86ad5dce2b1103ec627878feca57e9654399ced7d79eff98517311f91b64a356ffc15377ae9673cbe674ea85d2296a2329992c9b37619221c1ace55ca7da41ae435a2ee41d4e40a8677e3958f9cf619113418347dfaeb902702fd14a7954a5c7f3c0367ff1b8e906680cec04abca4e13a32b696a1ad6f29edf747c5f1a744e5883ac00c7c656eb7a6aa988f562aaae4f5baf457e838acd6b82032ce705a989b475662447f5b8a658d1cc86c7a8d100889f45bdf1a43aa80cea54898ec57506804b97076d2a5ec8364ffe6be7f8ddc3740097296ff75720d78af118b2d457433068a720c3bea9cfa737a7aed2ed318586021c1e55e770b67fe66140ffacd0ae496f2f16d83d2a0b002b60d614d07cb533263d13201f07d74a8f1d98d1d971c62fc1974017207028f59db2681a4d1fe10fef829e6ae89d11ebe78e86b5c4ab19780268330cf2eca7ec0104eb7fdd7b8760c08526a2eea0e4b8725ca13808ed26a6a42a66264f2fe647e7d0c6b1ec4016fa3bad22549ba3ce54c1e06eb510d86c3019466fff7f8a82bdc4be803d03ee1e30c36337ec6a264d3558b245d966cd58a8e454a6f51ebcfba22a26ae8dbed61b890a5fcdf6f498cfdea95acd01956c7a7597cdb1a3a717cf998a91b82077b88d7752fb6af0a58bf4b536427aca0716503aa629f697932b6d0858982391c8d5f2803fbe855607602a5d71f1d58f465b684c91f20c2d8d8852733692876e1ceec9384321a3b394c5ff3c0ee143edddbc213fddae68e1d08f1e6e872939f1fe339013efbd5c85d81dd1d54fa96c5227b929990bb7736116c03f5edcc4d1e9e774e587a7f9f6493be840bdc6b2a558dec2dfcc8eb5d207cacc23c8a9ede592630318280e50377a4ab5da69f695956e4d79b26ee9220b6267037a40610ccba7fb6ec659856866959ef6fd4e71ba930f0e3e5fd49d7465fd65f6813ab4ca1a770b287eb0afab2a37833c37efaa9a44c79b9126b23e3598256215f72bf77e48ac3cc08fb1df80e8bc91e5f8d213cd21047002a57c2dee1896c5f24aa8bbc1eca3eab797c1b79228a16594de7a4fcbae5216136a86fef64dbe1c1bda15741d6cfaaf8e1584aa47709258b9576cb10e434d0843d48723e6ce07cee34416b2e9401ce5a4976f3a2946ebf5d3d20dea0d8631d10471e13f48000078f91710eace1c8747ab8be5d9a0122ac774fcf24d61fdccdae5d129a3929a3484bda1889e3438c62ff3618d2b5478eb480d26ae6d84005ab05850c4e34ed3109cb192024fa44b56192cc6c981bed199f21cfd96ccec3487ebec9f4790e571210b6557027196cab39db80a2f8f37b2a34014d04fee1310c0d8031b261eeecae25b597f0da6a42d6b2815ca23a657a2b3cc954d3e43810b821f4c42f4efd366e1270e68885124e9f942d6854a69b71838020ed2e65fdebb682c18a518a63bcb89e8e4a206f3c186ca686aba184bae89ac5af1efdcb55476df8908b015c4706f590b8cba0e10e29a6b1352d6f1bed67d8d61df1285c +0x5a39dfdea913fcbcc5549e23b310c7ad76f392fdbea1ac188d529062b9961a2e32cef378f951c4d29eac03b3fed8e662 +12112 +0xed665d3f73bfd785c59814b4ca1737b2e0eac248b7cf08cc665ae6fdb8f3ae2ec71e64a7cdff2d48361d046ffa66af1c2973f153c80e02c2dbf13ca4c3d117e5ca9b5787fdfe84443a299b7589d60332af87c2bb010ff11677556dfa0155d0ec1e67a0a8aac4c6c2f746418d206f1b3c9aad9c470cdcbf11610de2c71b86c18bea0aa5d27d5ad90a98fb5e81673adf82126ee7c1917d52f8c2a102d3b86cd30a560ad0cc1dc7a76443d05a17053e384b3e500cef37f89416c19a34e58110ecb08cf1886034131618214e9d18a3830ce146dd7199a7576bb2877fe2c71e79f5c6b14634546747106d59fc8f4be812458a539d7f8989a2c1133bd8733f36afd794f0923e7160697cac1363997a7df2c98f8d179e8684df7d82062e4f1671bb78626f5c0d7fc784411e7909216b092b82381bd33757401887471007de1479a4c278562c0946439d4908b07891e735c656cc2559b0c56654c7aa80ee8700f3729c1dce8a9a8d7dbe7bb5e3384fb6a9ca2f95d53273989e9c25f37e68b5a38a2eed9bffff281e1deebf6c38cfc5a00c3ff4d951e5e6988ff7896934ffcdc6e4df9f3810121bbfca36fd74d7c7596d062e8de1c1fa738ce26ddb55c83a382fa98d993d294cdb392c9c1d16e9a875e4419ee1f54ef9813e3e0603ff62a15ea78240c3f27434d054ec2b089a96f880cf6297da5c206b77744ccbe9af2bbda7f51701059e165263d7b2e8a4480541e2f414215f605ed8bff7b4c375ad4a157ce30fd7478a3a2efa8c25ddda675f0a021bfd45594730c6c08f1df69040e832433712cb71ff0651ff39ee119341cbdc4a0ec50aae5abfbfe2032f6d20b22d9a66bacae46b43a242d8a7b58cb51c723e2194157947e1334a8d1d932f0e4940d74b34dc2a1d9e3789ef9e215729417cb8ef7495980c24b4f029a3f144434e4a715c6df3a5705aedafaae6da79d8f810d21d77ec71e56a68371e5ef0b5a60872eeff2cb55e4abeeb3b734689faa98956151165c20cbbfd7aaad51639891ec1e1d89e3bca5c95115ab5b187d6e3833b77083406c16f742310ceb49374c895bfbeb6a060dba7379c61a5cb71683b50579b34ee218fa4fa25532d249c487bf24c32116d6490481aa729942bcce80af725e91fa880d4b3334b6a4e8efb5da91dae65706d0e90462479da0a3860fd5860ed8a53c8e939a209dc7db958765c5afd2d7e5b082884a93f5c9b8d5af5502e73f7a658b825657b6322b6f7ecd6ed967c13a65aa678137a529694a7f9528893188a64b4defc024628633b8fb0e2b76681a604f6afc8e6c04470eedf7d404e9037f0ecf1a435b50942e834090e6463d1f530c1b68bdea483ff32d1bd4f874a2cb86f6796719a28ce98f9caee6d2298e0bef70423a282f6cb6a2464cad5ef236f8350fd2cacf1039c12dd24c434e6ff9ac544f6c35c7e84a16d8ed08d7840826180dbd53abf03ed7c98de6c16cd764007f25ebe212299f50cf0b73c8fa0410e0b9857184811988f741242c7699f9a022f2e8f86c25a9af215dbe8d156b6bb7074b10eeddf0a78918f68525f47121ced1b5f1d73306e4a22c31669b76c20764fa4b4467d86126a9ad283565c378ec3aad26e51aff2c4712e1e8a821559483a54a48a48efc5913752474996e6c27b56e15c44736290c6d7bd2e1d7b13a394cf277b195c6c24efa763f5a359236e419e39c2c7cbb392da4378fcb89bdbd46efc6f314bc91c2c948272e479e93ec648635b0be1a0cb816a7e068f442b92733d8ad4cf07d92664e9902a1db48c5d4ff96cef3f793cd2e5dd5111efa77363096942005c34d2b354549930a73a8ba993ba839c6777e5ef449b813e25cbbb741d5ae998e0bcfdea853e642f8af52e4919f46e0a89c2e44a280cd93738964bed37774a476486a2f47e10bacdcfccbc656910f6e2b044810c189820a430f26af7e02a2cb3ee7a09f8c73063b27da67f270c74e3cce1e4035d9da71d2c16c662ba9edb56848980791fe90827879c6dbdb5898afd6f268ab4643ea19978f1fa795dfcf091633a803c916bfecef43508bf3768b90c74861eda4a83ee5c30c975f8087fd2a5f80b629875d57c1fa04e5fcdd63268d7820a89be36f4f62efba62127e5b1e95aea030ed6f3b0 +0xc4d5e18acd6e425d4a1f03c23d7a48ccf313c4f987b9a1f4b4e3688c5ee4d7a97a3dd31fca20e8cf159e1feeb0df4e65 +12904 +0x8c9eabe871c6e9511194b48ebf9e9b031d8df7b9e1cecbb2d88bef792bda6efce1342c9ea528cc89c950d0418c85027f984f133ccf9f830c47c1c0ad938c92e045dcb677b042cab0f3f969c1331c96b427175e75da5cb92aac57b2c29aa3c7d1c07e939b1c7aaa6e9576c5363ccd1f4bd1cd1e8d896b36b30e340be0c887d5775b020931713a366db9af2cc730ff64eb9f599cac6435c2507642132ea4a0847c1d50616235e93452668ce89c95192e3d97a320f8f42224a9eb6814d5b6579c850f50e355f2ee6dc8a5f540def68545e9c494f29cc09b2665758e54fd8612e43d37ebd6332fb3a9757dd27bb5d8aa71962b1259be51068e2c1c9c1ccc9d3a25499f078423759faf01f60be248c5f07aecd6069f872dcc25a8e97bb46d823827544f8d334e4b1a49151888bdc044bf2795cc590a1ede56b37fe3116406bd72b2044d662cdb398c3d59ec325444de7f413615f1e3abec0b0059134774c0d7528e01a378b7f3c75d547479efeefd1998907abab87158dd52d3df7f062bc2573f82f459ad1bbe7ef6560fc7a8d4138073dc06c295fe4b3b95f6b83134d335c5a1588575eca263e5bd0bd1df464fad9876ed85356fd0ac8d3b2f8d31bab240aadfd65b011c920b851b3b63c8afa5f3eb0a8b9d1b3030a45cac47068581100c8c63c51f042734dde479ad6c8acd1e0e00987df67dbf665b2f4f06ca377037c0f694ec7887f4d0028c3d2a952e8604265f868c396204baf88e8e33824f6e6e856dda150f916baea105d17a86bbc49d62913d800ed3e774a301d098d5d365fc837b9d068b2a7415e3d59b65e6396e33eb1d26211cd750db86117efb6ccd3c2ae1a74588965af74ff08605b35db16c0ce98ba8360c762738c645fe25ee44db40c8793a63d52adca2efa0752b952aa67083642a8985b854d38e26b9de04412a865f7ae55ff2a10b5708a9559633ac03a9e12e16e030a6bff4043b17ed56cb1043cf31ac4495c86db5652b0cbce23f6efe2c74d304b54751e3500c811c8bea78c13f27f8d965a5e8062bad026548ecccb68cbbc9bdbba4f0e79b215d314ca64746d8e232e70b43659085b89f590dba061a288d60d2eac3854a0d0314f54008661bc1ecc0362ea7cd9d99d34b5fdab204722971000decaef952cd390f301017bd8823cd0c8e77db06738f866e4157daae06b6f01134666d3248044bb5aa63dc34d4260b7cb78ee6fa5a905970c52b3cec1df891fb1003061a74d9c26d2ae25db449f1307a781ad08f9cc4d5b9b4fee0a70017dc26696883981d7524a17a35a4232dadc46d9bc4a1af805281b1d57accc5f83a59fb0740eb938cfffcb86003b96bc9814dbde63362414d62e5c1f2450a304b8991e0b13147f50aa0cf1aa5f4a272659655d1220f1b2d4c1e8a4fd107a2ce412d0b3e31e39ea5dd80272e11b16922491463131702d25bc5acf7c53b699a89244e4f7e4d00f88b4dc68b5e6be21661bc2200ea8cb291b3ff34b489f812fc483a13e606ce2d5e8fa49b84127d2faf1907e8b2be4ac75f1c44df4a05d0acd0f3cda557407b14d699282699b00d3e3e31738f04f81aea4581dad4409f8bdc1c71232c2a921e5d6b91239052a1e4baca91463f7bfec2c349c70a3c1ec1f04ceaac84cfe8667db0225fdb00374dca495c21c81fa1390af976d71c3f6dd2c9a4418b3ab6182362b305eb999fd11c8693fbc94358fd11bc35d1995804b43adc8b2af68c0a423193111b1da494a777e241af71fd1117ef9e1e64f506b47b60f2aaabd5c1f3eef8d8706cde460841c4a4fb80013f7378397a5d36d46d764baed2a9cf102298a5e0fb790114c523286c9568776151a6a75916994f1cd673aa8b462f9b90f722ee51c2d3e1a96a0ce3d87d319b797bd12cb53a7bb8b789d3235f14e4193b88b852b3f72614837decfa6f24fef531051d90b7b0aa788bcebd3b93057250fa1c83586e601ca38c46eaf69851768b7236b15ac53fcf9782ed597c8de17e48b6fcab88eac65b95aa0c2f5ebdce41672258b61249ae921e832dd06db670b30a5571576a8ff08bf2c719e3ba456108912bb15341aac69a1475d84a967679b69dc1c1af87c6a855c3cab32c9398d3730f738ab16e504f90814234ee8036c63209e034dc66f5b4610f9b23356f1eeb29ebe42af721a3111b6dd18ae5b25c1dcd579c14068f86dd56de22b124d93f73d32d65db4ee20bd3e4e10a2157b452472f8edba7548bdfebdc3847a42256633118dbdde3de3af05f93e4d5436b0f7e0c01b68737efe1 +0xfbaea1239fb68417d5fc143c0a2386ea75d5ef93affb80108e6faeda4eaab7b30ad620538ab0589a91af34b78f06dcdd +13696 +0x98607bc257cf734d99999d757454cc0e781d32d38425d308de6d395d83cd6a16bc3b1769f24a1627c3f1139f568e82c0eb2ad77db6fffa76ed37f5d420f7f074c99c604924457bfb4091efd456aad3dd5b82de44d15cd701e28f4cb9af8687e3e60cbe2992c68a1138019adc1fafa9afefabadf07e4552f3e6faa6d6db8316a93b1299d2e7d82bb0d2ca7d7f57a5eb7cd02fae4964c0539220026bf149f5850ff136590dc98046223673ff85a794818d259648162cd8c228b92e04d3a4e4bc5d300066a0e1c8c3ad8d8487b5b685522a1766e2217d9287fbd806d7449259a2db1ff92953d6b78a9aff867fd82d7f489ace29e63000f88a53a6134d0cbb5a21d1e7a808f050558431b3004eb6b38b4a277166bb0c5c11b47a4bdccff2c9f22086af956c3df9ab97b9d27a5c17f1b0411728a6c97d3ae5ebb7eeeac3bf61268843a049be0476c0ac7c837c11c38ef613b31d70784b427d1851b7c3923b2d003f50e24b640b729dacc0ef8fd5813365a943754c303d1be02491cff1a52ed5872ef59c23c81b93487dce3d3a101b8806eb0f5bc2591c6e16f5bf5efc636001c33d7af75a50fb81cb09ee96062a5734e0c15ef55b5bb0e22875238b6a339958bd55261a776675e52e3667227a8bfee0fb147a6b9e9ec1201d8a047fc57fa0827c5c422d02714f6777ee83081e9bd83360caa9e6148b17cffd1eac6294ae3e28083c165a84d952aeb01888717ac3acd616cd348e43887998d118615b60283bf26adbeac784054663e09cbf84176944702503638ab5feb123a0606c92b0545f87a923069c8a5ff32d1062706a7cf766aa96567d03f256851772de15300c9c7190cdfab1021e4e20b54751e34a31d3db2c70adcc2080f6be1d4f7aa35dfc673bb4df4a3521c93a97a38d535f4dbf676a9dbbef960ae94824dc401c6040091e839ce6fad820128b1e9eea4f2e9bad19dda6800624e8b5b27efd4cac9202ba2712efeaf2e32782aa7e4e672e965b8353fbeec6d9bee36a9e96277c1282ca98ebb056f41a9e609ffd7f5c0bd6e0b6ca7c8b1e9550ab2392733203d73678c12ad224790a5a50f1f4ede870df3053d309fb56ddf55335cfb4991b386500bb0ff84538ff379a420206e38331e92439dbc83a24d4efcaa20f5978196f2e5995db8aaab29180c2bdbc5f451648339bd8f58fa0bcaa8a9d3b0d0878f3503b274c4d696a5bd6efba0746867c6a5cc57b7a4ae795e808cfb548ee490173829354298f1ceefb778b6a68c903f14716a5ae650157816e96c4f811dda47b5fae3ec674c62b9d5a1b5cba2a6d5f0b741edd1ae14368cd17fb734fdd00a24e807b4567751d1fde3f6b6b9394592131bb1b75a93838a0dfabe0e4a2f67fcae29e92af1d74ba7e1b740ebfdbedb6d1cde2b67342b0078a20f2ec1edaa283a59f819a84d2b8c5d3bbbfad607c7eabf746b296e1cc93d9abf8b4c829dd2a34b9eef03ccc6d8a67a326e9f0575c8f611c04f363c63127d58dd0b81b0d95d6b99135b42090d632c778c3ba7eab656700c76f6dc72b58b524b70ec78ed2e9ed3bb2dd95edd8f5f80fd9fcf900647d50af81efe768172984edb11ca9c981c0b9e1a64f5b4caab223644f38701d8b8e9096d1ec2bee928cde5904602673220480d4f4f2cee410f5fdf061e0e57e277f70de3fceff02a569099037440534bb9c8b3b242db65e11a6ccdb975a21cb403838af53fd2c4c56a84eb9d22e10b65670223fbe6ada61b5add94d790fecabdfa1303096e17a73af31f5fc5d880d9efa688c084b10039605f26c6d90670dc60aa2a08a8fe2b020b8ec468261b9c597b06c13bd5387f9a4085dcd6363cb4ec5cc23cfe4c76998fa78c28973662900477f64fd865c368435c7d743587aa175502a0c0667c4dcf8aaf79905f7f24086566f38938cf0876cee484617745e524b0e2e458d3b10a599d73d5b03348f661e6d88d01df796e17879959492de964798a8dfb6ac87332a432a53eecb55c4039234d314e3efd7ac727eb6a7f9bfaae724c54548ab73b3d5bd4a403ca580197fa85257ed2c9b395120a4b169973e2399b60e69e1d1291a0dd1e10c2bd9de174229701c41422346364a9490c0b38488c7182b526a67ceef394594c0a5ae9645b4dc352bfa6bb086c4baf65b9694b861d810c308ccb58dbbc3e20d62916dd02c3e8b4a8bfef06a8063377118d283033734677e94ed038c051270f4fdd65fb65246fc5644371978bc7c88add15cc88d9043e506fdb799f3558eb7f0965ec96d4136f8025f8b2d02c27576538d1cab7df76c51004b11beeb339f7eaa3710f620817447f6e3e476321bb8c90b55fa74fbf11a741787e2bc9c28ad8fcae7d42df5986ab1d9d8293a2e4eab497c30de6a3108b217f1b814d92dbb20b0f7af92b514107efe534742c2 +0x916864ec799cc0ccac4b6a806a8c02ac72fa2c3c9abce6231ae7a240d9f2f26b819a711de5480aa334638cae55cbe6f5 +14488 +0x2bac4a034d7a81b57495ca507b34097d79ea19f74ee305ed7c6b7ba839af7d6dc2c85aa5f1f5dd3b1228c446f3c573e83aa6ea75fb62f5d88acfa2338ec5f8c65725e612721a7a3e7a9f54b930425921ce27ac64994fda25b61a54613e0b235295ccd793f772c086530161f35d3322f1df75450a4f331b9aa7557878710a64d821c41370a88418da4657d53aa020362012999fb0469522000688f6c14e482422a61584f1aed8e803fba897d72192fd76119aa09da6fd561e7ab9b684fe4fccf6cac8115e31f699ca19fc8f120911dfbb8480321b96f31fbeacf29f09a9a7c21d35e4a1fe586794f5495ca532802344b612543c703e00e5a6433a9b9775d6705f90711e1a4cb2404c32cec181ad529430641da5e5c7ab109fe89a92778d663c8383786ffa355f04997d5dcb45b92537f122e357c2597d087143186af217df9053b5ff7ce63af64aa2d10eabc7cc2495c1f3ae394f1bfd36e4fbbf0c4e3cc7d395cf112d2683007930d7eb494f0cd816687f8733d436b300c0b99460d323a86d1278b36a013905f80b36fb8d24a4c823ad6f752d98d227cfcc24a14ecbf509c69259ef1bc1848b31fb97466090ba7d22596b810fe415e20cd1e5edbf7cd97346dd1acc28ac8b1c8bc8a2d5a8d9777d7d341ab2c1002a6b1d97a380992ff86d55ba6253790b773f6e39feaf4f4802529a0625102c34374a6ce60763c62d797f5bf2d98af6256f7d421854dc3b258483e39733a336c865085f86b99d2cbb8531c04d287b88449c5c702b4b6556b82499beafed74c803db2c603e6036b524440cec93f72e15ae26665e3b8c5186480b1b9515fb8acb2ec23ed6d8a43748aedd97478ceda986ac3423750fbea8b51f6091cf9204ed259141c6291a2fa7cca3795a3a00b3f6c486ee1a1d718a73ca834c84d4eeb0a6c074814dc0cda68e2b493fde2bb6f11db6847dd3bf2798b9adbdf77b0cf1a9bc821fa95a05b9b4f44ce958aa83774e2443ee09d6c1fa8f82461588fedf62943755d9e2765fa5ffe217caeb47ab0b7215550bb9ac8db218d67dd22795b50b1c2020ec5428365a2f5f7436213b093a06f7d324b6dc8917dabe3a3efec9f6b2e77ecb9e26f8f3a1ed744b73221007ccb2d3a48128ee1ff07e41659f32210a209d593d38816efc40e12884ca154d0c881db0b26a366ab607ab68e63eee26591de7b960018c13baffb2830783227b7f37f096e42708d9b5220a3aa563585e4c716da71b43706e95a8088dbce67321caa1d28e22ffc7c3860a42bf8a56985349e3d62a56445408f6018d4f8c3b2dc7548e6c9e543c9bae9087fcff7e5ed78db93cca4bf94e616743d4e7d05dc97bf685c666d16224ab243b61e00367c43d930544f311eda7be15e6e7be1819d98334c510672c350020acef5f95d22fd1f1ec93c3f6841897959a4502bb30a6b36d0c7c3617b9b31721cf144ac474bcca1c23cd817eac63680b7ccaef851fee9f620312fe1f7fc5b3d71312ea14f2f8fae5bd1a453192b6604a45db75c5edd7e58aa3ef312786541a6a0352072e53c9a87544e1d9b73dfac97a7ce25b23a34bcc0c737c97d6d7469501243a69b99f191bf3408c03b9b515e9c2aa466a4648319d10fb1ff7d579856cc40033d75edecf9c8837828cdf03f1094b566f6ad7e470a1c0c4411acb74f7e7dc1ea61bc519d3735cb32b3cd02e75703d08c5237d80f21d42554bc961d1864e7106f9fb95580de8963befda353e8868bf49b05ce1229e5cbe36a3ca3f9719e8aa41964077a165435f583630b53c1437f99f98dfabd55ca55df0b3e50cce97feb056e3b212fec3cbde906804f92f00261495e572829e143f460ae2e4717eead8abcd4a180f760fc93c6eed1fa81f347d38b0ffde0e87ae73a30c978d15b0f9bec22f313b15113185a0772d496b1497848c7a4eeaf8971389997f3caaa16cacf81d0202e4cdd8114733359149ea171383397a3b60e8d629c952ea3801bcb8ebcde5d124d9ded297571c2f7fe9cc2f8fc166382c06854dd97af6d5f35b0f9e9e874221ffe3f208acfc84ed60efba65f4873c3d8aa678030ce6acc8d57f4125ad6c5b7cfbc9ae80368093f89d245bc0281de310be066800a8539d4c4637fb5500c559698055bc441e2970d79c50584814cb82392eeffe4d960af1e8ae49e53780d96371f64dc45c4d404412c73b5805a0d942414428e2f1bf53cf25757ea6d213f2a21ac57a6dceaa0c363285ac0400b58e4aaf677bbbf40a755f8a039ee72fa2563eef55a460a41cd76fbe3d6d04403933c30bfeae325f5ebacb9fc0714f54164e5e750f9245e68de7173e5944ffcd1610d4de738aee39a56838ec15be874b55222a36590ec39ae486553a40fa9db0326da6ae2dd7988ac6c8d0fa684f361c491acbb99cde82ca09fa513b5a5787f077926006945dd75ba922bb5022ea05cdd87e698641cb2b7de38b34c80f226595cbc62b6b10e354b336be2176ac589c68ec952b26ae9d66bc5c83266ac725dea818532f670933b69a55e329f56c61a2f46ca83a204d1cda8e5b284ea8ea269b2f45 +0x5077b3d65d16446eeb06f10c73ee1128e29060ab1ca255c6cfec53af04edc2a665bc5dafa937164bed9d01d0316f0ffa +15280 +0x03b264be51e4b941864f9b70b4c958f5355aac294b4b87cb037f11f85f07eb57b3f0b895505fdd1160e184d811fce7d3f60acb3faa474a5eb628d66cb4ee7bd5b57c64a5e165a1405d4a28537263190aeb5b4684be61f284ef7cd969b21e7160d0fd70d84b1e8e3645328cca1e267502ddf624ded1c206a4782321d59fbf555fcb1be214d8b12b5be043ba265e6e832493826d3729910e2817c6b69ac4f8b03c6f7fc443ce470018f523b94d7a63ccd6d7a829760ff79377950da19e69f2095e84d11d4c760796d34e7a9129ba2cd7816f106183cb1c1cf9b99fe9cbd6d5e82dd2b8f617181a74f5b1f14ba165f22c8e24611d46a52731164d25960752c8d51120dd568cfca723e7e72fed9cc5dc5463be4363a7e5405a361746b13c26f3597237e8459369d72910b8dd82042013d66a05603d8ed29120c1e1ab41519b7ffbb8e080cc14a9d210d7eba30fc0bfbe3a0ac15db2e3b53f0a1f71fb4e2ef794444be14df1f702bf5fa64a289eb8ea0609aab9e5ca8ed675a1b88fdfe1bb8259bb9402f9be24bdc69fe49b1536d4e913cab4b69e8e777d596bf505ff00e086f7e8f90d293b83211157f8a711e0fc030c058f80300586f213f23c9a02b685499653e3c8876ffd78c50f4c36c5a318811943a3df4438a47cccbef615910892145c85bbfdbb6278080d504710d98710ab640a589b822db765ac558c3f5300ef2f7405e7726d1cdd1b0fa051fcf494ccc912e5167b91eea8f3da4164e0f1a584e2045bd1f044a615f7f38ad2c3bed334234e5945481a83606f7f0ae8c012ff39753510df3ee80707e4e293322de14b31013ef04dcac4f2c621c2367fa65f17f72f2eab7b2602479a2c0445da020204a9aa0a3196c93845c150cc4f905b7ff4a45a18b40c6e3a6fb8168027300acc078667dba4880d1d843b45c4dd85a81b9e2a3c1ab3fadf378548e97ec19d0de45bae80d9d28c5d1cb51b49d366c553db1e6f1d5d31ac41a29431ee289c8ad2f5080b3d2b420883dde249a22174b824667b5d4708b68c5c22a15d6da43f5d22a51783e5fa7c66450712ac98d58ec6e565bddb0144c801f760b6b3ad1a3280c59c8f00c26d090c6c424e2e75183d575c7fedd09239f173dc03da1bf8b3fe59838378691aad7064c0389db67f1107d3525d1226430eb84ad1b4167d94962a522402dba636e139d4088e072d00e977a290a734c45ceca5ef9f1b71c1caed3ed16fc0bf9e5e32edc60eef94793ec7122cdb045b9225fa41c80edff3d0e2ddc3402d662c3bdac813a198014d8382d462dafe1c9078e561133ee5a9a49024904006269b2a64f1ca33cd6f6c39331337ee12bf98da5ee648a4baee208dead82e3d8b2208c201ec60d6b25bd960723b193e3de820422c6ed87aa2efedb5c645de4237e955fbfb13b483b823f0cb2640a2dbc43f5bcfcac6381f5fb1b7240db4c9d8724229de38aeebc247915881386bf94c0d8df2892036921b5afc27e3a56d1786a4f72c71a105301bc76bba8a9104471982998c7817050bf4fa97e5f978b8efd535ce07be1e60a917a07abdef1753b3cb8a2dd2a5957dcd34a64c986e6ddd794c8d9062cd98067e3d3a860ab7b49f66e98c0f6c1783e40062c8e1e84b6b23df731405e4a4f540d815fd5748ea4f3288fbf20801d6ca83cb07c71f7f975cd446d233f4364d1f56df2852b42091d052408923e039eb50a257aa0bce025a2736d8f2502600d0fc90bafd9f663ab31e48b61c875fbe5dff89ccd3fcb61c9cb492bd5ad564e9337635921d4d363d58235c133b864d3534be7f510b029e7366eb2f1d9228749980748f8e0ec5e9d288c6d57f6f8871497974cd0ed88550afbfb4571f23b31eb9bfdde4d75a6e4aa04ceffd213ff594a0330bbc2cc5ed9279b0f750eb94dc2cf1f69b7d9488af2050ab861a2233357ee26a6a92d357a22d79409c63aa6d0d64e82f95a2ee21f23289ae7475a9d3b0f7b82679972a180ce956778bd88437ad904771b39b0dac9e49f45c9f56dfa8cfc7ca7020155a8f938db85dacf7a0782476b5c5ddaf18b11b2d38bdf004ec39f8b5bf4f47528a44a0e349fbe70727bbd9dfdb31fb2737b9d0a6fed94fc9f70e948b3fccd697e3c099b1ae5825524085369260c0f54b944b277ceeb9a5eb28b00c0ff4eeb52c8d8ae8c0927c4c1e1460a259ee77b36354ef8776af64d8b3a8a6c60a83bdcd59af2af3d89b7046b4cbd385fa2a601eb7a22d585eeae2d2699f782c4397410466722924c0713bf95c8c67483ebe821c8fa48e03fa463c795535afa584d683439afd0ee242bde54f5e7fa251ed52e596328299ee136c79b7bf90d29893e88a733f7961942427772f01cd0f09cf8d9275e965d7827003a173eedb696f39765e7a9b0daba42f56f8808e9e33d8ab18909ffc75ce27dbb4bd952b3cfd913e280842f6e272792bf3702c4d1998274b9ae7feb3d908461a27d304bedb15666aa58fb19a1f417be0a5e81a8667c55c75bca07955ba0d45f603eeaaefe139568596fbb1ceed9d121615663281af42e1f226c2f72c3f638e37f1136e0676f1c956a25529d97410a694ebf55c851a981c8a7f55627e919487a5984c384ac1c627a672a40004db219f23ce9a80dcd04e77047062a194d7289a07a1a0f004eb3fd83dadf020974b59658b665f86ccf8ec582aa0ef9cb63aa52e27b3187f7c1b +0x8f4d27faba49fe0bffa92f430faccd1990f9b745442d455a5c64eb39edbe7c9d95749a644ca8eeab63ad183cbc739c12 +16072 +0xd4281d9f6ac1860f5c6a4db1d04365bdee62de13e7c50acf368bde1e26649a519447ad30f663d2919c57802936a581a19764e0ecb83609d9007a2ce4c2c3e2520888137d8f1d176c12e11ba6cbbac74838be1e561b33a54fc4bac70492c778a9b854192d3dd79bc74771e8d298687eda59d75df716a424590bb377259e59a3802c1485e80879a8cbc16dad52a498f07e82176877b471cf215bcd03efec62adfced2e2058f9eb849f0a3f33d1f833635d3ce6067ffa83eecc3f70350c87c8dc47820cb2231715776daa4d42f59a1f209f0eacfeb7f2c0c9853c04d32174757989731403f16bdfcb5a2701a26694466f6b81d119c6a311a772dcf1a6d9bc4fcbe949b0da6bfb32c6900bc21acdee8e97e91cbd1f55155ed2bba69f76d968401c908b470038d1f4b237ddf773d2aee1e24367d9d80b5190908922770bcc802fb2a6c1403e01f50fd576260a751cde26969eea8b0b915e8d2a04d9df2c580a03d75273055a6e6d6978766d62e8548545fc252e3c828e443fe8535240a32510a6d0bc2afd1c2643ece25f3a679421ac255cfdba5503ab0c8d119f150336dc99ffe80d6d904ed27f7f5d581681412c5ab0fe51163c5790bd5eef0fab8eae25aef6666dc526b61927092f898718b61d97cd2947cb5b46e45f9cc8cc9b4bd2a756739103b9271ea44574a11b1794bc9b6b6427076019974ffb2ee5fd6da06c0b995eb3f8d1fb4c1be0a7fb364e5d1b4edf5e3eba5ddd147b97fc8ecbaaf742f87f9f1273950b0824018a8501b3db9bdffaa1b7884b11830d3eee0a5ed9b71e17111ff69d8ebd1c6aaf0587a5ce7703f6c516da98b01cadb0f5eca3dd8248c61056c4a99e437a4e93f200484a27971d3a46a5ee1317665a0ac6de9f702e12028a5677729d3cab6848d263111647a5af5487373d20055751c3b8ac4741637d9c2e1a2198c202b6303058162a34b50782eb90b20de804575c84d33ee375acf15aa3a9a864371c056ff48b01dbcaf9275ea86700a7939bce41f5207cbb378ed606910cf61e2112feec3b740d6c019c6b0b33160753485324c9bda64f16ad939466a249f10eab6d0b71ae19202400253d5033a5b1582fb2c1bc846e9d3eff4293437c6a837bfab493c4f584234cf01c04f6511ae40071420de2f47e507956233b64c77693af396ffeaeb7bdff2cf80927c6347f8a91368b7103b3e04e10dabff5932c7608f08e27b3f79cca9a0c4175108584db8a54a51453e6699c814bb29d27965271cc8721621c674eb5de34f2e826feeb37cc91e7651c54bfb8cf7107463b36e36fc6bc1baba0c67286b2eb34e8d1f80f9a3890230635155c3e22cc0040973b8479ded6a487a7dbb343fd7b2fff793a980cb698828004f1ea3561a2c615a56ddf95fc1fe380996fb6f6a92a0ab4868d2f962ef22c59f3b00ea6743c804ccb949cce08dd011ddf4a26a69d41ee8f60b97c3e88e7481c6919729842e2576e73776329ea5926e6df34a95cc10702197086260eacbdff4ecef5be13b5db730204dfdab08bdb786402f5e71ffdc66fd91cbcd60e82bc7879890c9a20b471fb90e694ac6ad1aa221eb0548af739c45c58cd223345f32edc240426acc528ea17a1805e7f5fa5104a9d521b37ec5d4bf21cec81e6bbe55952d8a60b9f0cf78ff1bc3c05fc98f05319674e10980751a158afdfa196784187031cd78219fd0aa8ae698150ca1c98bcb6060efc554ffd0eb799104aec85f0fe1678ff55c29f497d7930b80891f387934902f8a616cd4adc3760e5448fe9d906b474864a44fa9c55789a47f5fb26a320fce176d882871e51ff8ec85629ace3e90599d52a4416ec7ad32e97dfaebcd6aaf52def58418763b738aa204a5fd7f8ed306e52bc6dfc1f32b374108e52bd067b5c6dcbeffcd5ff54093d55e6db70ff5c5e7c66ca64b31fc640f51aca90321dd95a2a71655b77dc719bcecff34582df7cb649791ad443d27ea1381e5a1022020d17eb4b820577e05516e5f53844128296615ff47663b522a1ffc6820779959d5fba38c00ea3dcf54aa10b317f812acff186463da4b910f6798125b0997393d6166b9938d0dcaf029664c6ea8ea4d1aed74e84be6c7f5c354c50df0ed8a825957c54971b9159f7ee8288a1892e5410078ee1a3de985da1c963937c068bbd52c2d79ab9d219c1bca3563521742739eec25f662b04eefae899067382ff7c5d2345706888c330bd07085a92d01441fc73c89205a29a38ff388d7c187b61712e9e068fe48b579ef5df05d6c835d14445a7ff6fe892073c139a8d0fa9ee9333d8cdee7c364af62a104c8211fed814f7bb93503e3482b3c3df1581054e64ff8a04b8e37e874d099eb75667545d424323073ea34614fb06940bb151a731640c3d5a66cedeff1df6c091069ce70dfac890d1b0e1d0ae8468793e76e63d7776221681df98e5c541275947630a1235880906c0f2f0242aa54138206d260f4b22a9db222b27d8024102308075971dfe75704d7c0bba8ab1e6f99a5a9dfa64d3f10955e4536502dda6f10fe5452c4f8f48632cae03264a6bd0f867940f4a86376aab4c705e39aa7ff65bbc1ddab2f111894c6dfee31bab7feaa66775c9ffbba016f5886d548a170fbca800d13d0f4babc192d613b283f615bc6c61a6d5ff4c367b50d0843d4292b67d3fa3a9742da586779d309678457457cfb01fcf3b3481202325ed5d2248639cc38a6d4c89f247c933d5422e3d496a6baadb67970185a18796daa89f0a84d2e815f026638348789d7da2d6840a772379d65602a631d9f6925ad9c7f2fede27c3fcd995956b16822ade6cb23fe6b7e6aad988b8a5d21ac66af9 +0xcb7a6f63e6186009b6857157690ead10a5323917ef6035d41bc71c224b5bdb0ddacbdc2a59e6ad2b3731678b1848ae66 +16864 +0xe478a0f1531e1a79150904fd08f340a34bcd0693f4a836fe01d5ec5f924b5500554ac2c0413efb1587e6d64dc5b508197d793a4bc73a60df42654638502a6bad83221344523598bd11bb01d320e1d5be624e32fcf00719510f900c0d6055db8d5748bb04eeca987c9bcfac177f3d519be096132dd9d70a5d50a0676329944ca8b903e1897ec7a4570d6b00a24b9322b7e0970867e972da0aeddb7ec413b16707929cad5968f263584fd725fbeda9f01a4b9b3631889f3261cf8a7ab78672d3b1c85b48fe16137e86495b42aacb4764cd07e8c8131e28ba68dcf482c5eaa138ae4588da00eef49ce9e43f7f384f3725d7fec6e49513d31929fd63bf74a7044007ef6b8ae55a5c668a06ca052ce040dc40167fb340d069f8ac1b1d584f256491c3b04c8137c11283709845fc0ee5293111395a5c9bbbb1fef71c6b76dbcd88d3ea6f72e77d8bdf9ca383f88c67c8bbcb514e9e072f3d75d414ea9541a2053aaf851426e3401f8b592cad2bdbbdf0be53083d94de82bf7b210b6be3e02b3640cc9b86b09d07e7de61120026149bc5fa703eee84061ea78c8ee2899d7cfec963d434af583e5a4aa05d5d63305d86af36cbfc48b5aa8b5e70c3a32a0a3ca4246b6c587666eec1b098f416bd93de08163c0c493571f04f4def6756387349a4b1203e10c321d4c5818fcf44f895c1a862d2da2e9dfe00f4dbd122019a20ca86d74af2637ed219ed264d96effb7f2beffbc1ddb266a503026fdd9eae3859e8d3fdb0305a90c1e4c2059af01fae9946634ad0bedd79ae21ff73dc8064fa66cb128d1b9ffcdf365ecb873e85ddf92a3a8eb5c925b7be6181754e97732cc88e9acbee53e7515479af901400fe30c47c2ff8a572b9491d064ceb68d31d0d8a1b7e868820b161d7d1fe9915a90321f7d54c278395239a7fe4a9ea295b260f28539eccc34aa5355188736ff0013bb77a7eb9a5b5f80bb2ca44c1f9f9f6373a8a7f232407986ad4a8e438990fd04ffa35bf9ffaa564179ae86ebca0406bf89799e63417bcd3a946c62e729fd8dee6f211df26acb9a0f259bfaac1676683102d3bd2fa2c4ac3099491ad4c0ab5f3a9a8f42875455b7642f73940f8d7d306280459899ceb193033c5f3abec600dd64023c8e0b54df2acb07d3d778a77efbce725dc5443dc91e2cee1d36e7a2c4850526b73500d4ae60be3f2b2999fcf236cf697aa7b17881ba083f1183f1ff3cd298789dfc0a6c69e5b845e82ec5e68d5e0fc62ad463f761d34fafbac66023f06298984f277a74884643aca94b9f0c96fdea28fcbfde42e0164da0a762b4d975a17fd6496bf3959ffedae3dd0477d7a572f9025eee72d392df9cb235ed6258431bd8e32b2de848077c087bf1ee02c04f79b6d2cfd4d431e0bbb77504caeb48df4e1e2f52d1daf4554a36e5866ca25eeb5e9e1ade0774d650171839828fc223a094ca1b5f1c4e330ff5f0b11904e91c0fbe396ae7fad749779e59a04da089713d9c6747ae51b47cadebc05f184b49803304f313ac237e03bdadd629a4b1a3aa1cc17034df16a049a5a8105002b44613ebbf65d56915cb8d98c228364617a336b4b06f535fdf84128dc78b2476b4615f906a0c00cd46625f9f77ca66a0570abf9bc5cf23bf10e27fdca67b5cd2d01dbbd78140263739b4e2483b273b32043cad488e1a466b5f4dea08d17b59b5abedc10791ccc6456445ce1988e9147983cb783185db0be32f28d998e505bb7d8c53f7d717ec61565a876b99ed6a92e57a39b8ed398c14b4e505c7134d94f2b915e2d89c80397808911c533fd53627043c09d7e20597d16f25574afe67c38ff6bd1cebee773e7ada8c570d71dcd651646dae6da696a8c26074afddb0effbe39506549a3349660a2ab0da02d660c5928473a9d2a1591978373771e7e132b8ae32763c7c01834a8697b317dbe41d7e7ac2d29ebf78c9746362024001f5dc84404d8136f9efc14670afe792e1114f7b7ace2edf8c735444046f499cb46549e94a54abd6ac446ff468b1e2ddcae4835702f4dceeb257a5f2ebbd91da67b607420cd67a9dfba60bdecf6c294ae1e4657ba3e5616ec96c2b2b79eb6fab947e9149384161ff709b0160352d2f7cde875253fe0e50b25a4760384f672762d31574493d23f66da38a0d230a8359e60943c69a41de2f7bbd6fc1b3ccbf7da2ac212cdc8c0cac7afcf96b81dffd5d190ab05e994fd3520d9b4bdc288252c6ed7808277dc55a08a9e57fc91725f99d885b4376eb589c7cfa5c721bf100df9795df50f09749aa7f7d1573925d6d169fa663739c0afc87e4b479691dc7b8a4645e4a9224d3b95c8556d57b53cf25b2d815bbc75a72bc343dee8aa73df72a5fb1893232109d650ecee9ddfd89e6e08cdb38ecc52ebd180ffceb08930919c65013b92eb7606f0d3f90887780a12f1dd32d924ee385348099864c6bd31baa2d23ef60a89870c2f24d9ec53a9b36223e4423a48ab8fa93966f8e853cedd222bf49b902385bee33b4d72e22afb3b54ae24e620208ac0b34b9d05a27e429b90e0d4005304688252bd56ae3134f50ab137a507d1d413313a27b8a9d970a3d5ce68795685d6ba3a225d457323981f884069708b968dce4b0574becad75078f2a26deb836fc001501bc224abfe7f011ecbe98c5cb7734476dedbb852e2474a5ad594337159ebc72b0595fa3d0b102432186201607cadfc1b8b04ad28437da0742f8758068a7e9333a87dd01192740f2ef17ad8812d647ea0d596a534421902aa77ee622c4ca2eed0cc23ad0fdbd24a781cd918a511bf536f843aa95e2644f86377705acae57f5f6a382e991f2d535e7a6128c9b671e702ee6097bf8e39250b08f5b647c89e3c6e69b5479d29d21fd29a8a0ff39b950313873056f2acc1e5c2ffba68310dbf02a3350b16bf15105d2e425d359f3cc53c0fa1be1e47a007aba6b18e2d208390f88736024209cb3035fbd9a443d58149ba7d +0x082f8540fbf6774f3858ec103c57091ce84b1479a791f87495c44b3e85518993267eb2ac0cb44e089567c562aba69709 +17656 +0x99ed7aed36a1fad487d81b5c680a44e508bdb33d4a560a166b2f0ab7e6e99ef194041b5518acc6a47ad69787128c3c80a8856121d9f92f7cbcb312dac668c0b0eb4777ce06d185da7beb0efd1b320adc488e8dca590a4b3b40e35b7c69de3ba2e6df15c1cab8405ed23f0a264ba3b5e02f00bfa09230673d3ce56c0698f418b1cdf47d942a08ff18c7f9126a69884573a702800b4b148969fbe1cdde19525ec4e7ad38b1ef6ac8f0a242af313f88c37ff6bc56734e5ebca7c400076eb49f15c27d33cd7ee185a5ceaa4167e3934c36eb6557cc4061b505dfde69a11d33844595d7aec465c7029d9a281fc5e82e7ba69f3cfb67da4dc16ef9924623525ca8f7243d45a6cc6a88b83c64034ea8d8be1b82c3cfb1a9d92bfede28bc1677f9b43357f720f91d93c0ff9ca6168c8c58bd9e7e42fc3116cf9bbd74e8f501f3d04fff164c6848bf085179a2367f06fa781f367a00a96f87f5b8b4a419196c2eaa2265498645181a92e52f375b67445bfe8dec5f46fff465152bea57054fdf904ed46cd8ebdef396f82127415ff6cf18b3aec7135c264719f59b6773f2c0e381860e1cabc45c609b04af6ba988532e975f2bcf7f8a45f0095eb134e12994ff6918787eab58e6e8917c3703581fa7e942caab0c8b1885789f1715588af2f2bcb0cdb999bef1a511e02960f5356b198980bbd787204d0d6642ea6edb559402a1be6d7a76cdd5c166f0d3d34b27b6d295b8fc574724720642599d65c62959ee36fbc0621bc14d616c2a41380d1846fa955453d25481cf97954ef9a120f087db03d08d1a9280a1adadf43d3641ef65b811bb89f0b71dace9e588c6cbf19167f391a39e49e3f419ceb0b78d75f19459349255665a77e25123bd6fcc8a42f4415e67ddb9981403fdecfddcfa9e24ee6a979f8ab1b89cb6056ea26bd2871a015d440de7a7af2f97942e1dc94c59e3e7e209c1c234b12f8312f21ee4a26981a002cc0c2730353b9727bd97e84b4d356607b17f65b5ee3630bed6b84202d97fb97a1eeb071bd341ebfec1f3a0bf23225423b861dbfd17bca55243f9edbb7f1d340b6332ee3230487b6161ba586f82b2977c45ef8cd4d3c6ca1560674e950262f9fec36a443bf5582f98c5737a2413ee185a81b2e101ca5e8751568ccb570b57f09b651a70ffc979efea16a66da67eddbf079431404ea58bc44c4cf0cdcb4102022972cadc4655b4a3a17cdb99bd6a8775caa5f412810c5669506b19bdb74d6d15f21102efd8401033031e9b66317ff520eadc84c063a6c55ea3da9101e4d6a0123c6b4b117c33968759256d3cc9662ea9b06268b0bc1ce38b8dc2e0031a85a1e250a82caafcd64d87eab8da834ec73af9645f284c5415b5d8584b8c2920027a6b76ef2e221ed03d1c000069a3894922f74efa4dfbf23a452e4a9c1fddc0f43397f568d7e2abca6e2ce125a2043f95ed8ab55c5e2460339a73adde2186c003d24d173cb2506a6be9a0d64e0d0e3b53a39ce3ade33164a7bc91c738188be9d86175229344d5255cb56127a3332a442a4d141e146589c73fb46ee1d38e56031be7f65f9417daa244da561c4d9bbe21c2f2d9afb96b9450a289f442d70a4ed6746dba1668b2c5aacc6166fd74cd349bc49ad5dec57dbac9784309346b15db2989faa88f369dff059c517b113f52f27ad84deff2602363f86beb97fdb73665c60596a8112761f17b5bb27ca1d7b16286a5140f35b1e6f7a7218785e6e4f554738e49a2e5638502d4b18c50f56472ea86d4f61dede14dde9c4222bb371ada11f9cc1c7e54119199d748e8e1550d1ef4440cfc026317e180a077c12138806e0220691624a45a0d204ec5cd1609fa3ce786f62da4df7c28467a686e9f313f3890af0a407d1d6582feffd344d75854542b153a91eca838ac96f4bc301d697ec0237059a06f095b789bb218540c8c43ee28b97f30c20872f5d9d41b108329668f2429fe41e3ae63755f313c059debee9346396d130f45538978e32f14b9b91f2cf9a3a128c256a603b243e85f73be7ecaed5fad41b9a802f2d9e99d46a761d01f0ca6e95ff2474ba9fcafc46b744c1a1c85f1e7c2aa79a7b866ae10ae3669a2f1c4fa7eed5dc97bf0a53e773089dfeb1076b8c29fc8006c6186f92e534c18bc29886609dae9265e5e15b8aab69bbd192e287ce7dffd857777a0939f3dd2b7464fc2b3322e80a41b7db4e50406902fcbfe0305fe8a304ff0821e450c74b18e6aecd9a9a0f2098ddbd5eb8c2e27527d2909701aaea949a7000867d51d01cfe54e873510fc2e6c27c5ec2077cf21c7ef5cd6d5859f422fd5cf93e30b79eb16041aa83eb0ede891bb024cbc6c90fdd9cd8ced9b0c7a60cc2184aafab1c93a6d32f7d75c511c2a6090b97d283419c26f5ee0d72b78e70807d247d6148db4f6bbb90d9df7ba30fbc1f01305cb97117870eb811beb908d44c832429d9969e328eadf838177b4d2649c21386e0c5c2028c6bc9741451e151bf7879a8af10bfdd8e1ed810c4407aa6bd96c4f40554defd9581949d2a0e826967d1a7a22843bab0c882a31c4c67b5f1b601980010d3026930e4abf5564b869bb403308efbbc395cec7e0b93365d79a791970f53b9bce6d5ed0962252f8548694291a6c78fc6a6225865541e18ae5028fecb9d37569ef6a4386479a51c68424292016cf45b0f7bb1aadd3f2559b6b4064c23b4538de5ac84918a34edb3512eb800e7059df403347b324a0f3170232fb00813f710b62d92d796ef36777adc485a3d97131cd12e6affad3046daf2502dc6c130d7f765d3242d9717e0cae9664979a6b5e809790d79af7a34988a66ea38baf5eed9801372eae74078e660759b8cc6baa826dc621d0b1b17ab56b8244dcafd14c27e4355995194f19699d0a5c89c920802421e12c979c3042923fce0e76f0dbc4028a99292f2d749058d83f089e39c1d48bc3701bf6027ce1262b0f363af8d4adc7b2b610c48fea52a33f2fc5c1c2548d007cfb55b28b9e41ba58cf23ed6cc4f1bf8612771beab94992fb61fcb80ce395cb740b4296e09d4895ee953d5af7b3772f2b37c4fde4ea5b6d345d134cc075d334d2274a69a981e00114eaec483faa2762ccad61322583 +0x34136970bcf300d0b2553a049fb7d598acf9febaf3b79ff79264bf9a4b0b27474b6fc7c27c5b19f7242b7b8f594da916 +18448 +0x7a93d9486444b719f5ccb8915d64b968832eee56542ed5305a956855914697487793f59e6347b21b17eac91898407a273e13fbfa07326b8130ba07530794a04ffb3f4d83f5d05d4deb378fbfb2c3864813e97791224125a6cbd10f56ae8ee7dc2d2047bfc2e6a0f6963a735050f6c3132b36cae34c60ebe65262e8262e3b553735bd4c197391635f437bdb911ddf1ad0ae855bb82e99a58beef6f98b30a4d0a73c9ec55ab0d98ed11883304cbe8873c6c45b94d86ff33bdbc614ac4d5ccf41756a4c184a20c709923dd9db47def9b73e9342dc0bb877951f0344683359c691eae64eafb16c62bceadb05424b2339cc8046c19b18b12b9b9ecc0e9606d091a64cd92cf0573cb38f231a90cf1f354f9cd403613ac8011936a24afb9c8e68366ae36a6f450436c06b842101e98dbd460e82f2a81fe351494c71a492e393cabfc4f9c29e157f0593365419e0f75b632309d13d20b33148c1c654035bd3dd9d339bd40841c7914f34dadc29b66352cef0770b09515e798f8b8d938fdfd4338a9bd9bd65e1c502bda93d647a09943aa7b53f7681c28985cdaf88766fa54f5f39fe65fc0105769af6fc49333464f2db9578495acafb9a1bab339e45cc36aa27516427d903354220a335e4937e4ce5fc41437d010f84fb04d121b947cd184f547bd6079c93f9915e6b5af8ca804bd567521dc3b276e61208e680c0c59bd5a4ae5e5aed8cdbdacb1af7756c2163e82ae2710f03b427a849ee93599a075df513fca3fbc1f2005f581dee8d28e04fac4c36461f25504b5207807fb331553cfe0308f1be6b162d11a12ff9ab144f6b1da42b785711ce0a6cb38452966cf7607adc98f1add34088760c17c0d618b6e0c59888b0bfaf768b7fb7c3b60b3334f0f005754acfe2b83918029fea161c5cd52c9117955ee88ff7127a0551186e5615e9e867a52c7ec5697fec8d2073088a73d8f89ed03ca26375ae6411cbc805a3f6ecec35aacd90b1403130aa09f6c488e25333e60861c6382edaddb1cd20e164bc8179a900b901c2e5b838be4ea6389e4925acb7e6d63d574a1e4dabff2ae8e08e30f78950f8b741819c6a91968c4d14d0d4c9d812a2ed08f0021cc808ed03619582ce9e41939c763b6330ea8aaee931a1eaf41333cdc093480fb2d091711b2df8fe67b07c9197a83c97f193d116f53ee1ef942ef1609d3f7bcc788b41bf168de02d2887a8fa8f20abbf145214cc5a83bb6910f2f6626b55b1c2d4c1c1dedec975957aea6ed76e27b16403f0fbd6fe4855e2d227e7db141d11772f39b8d65929dec0c6a2762f1b03760d25352d3ecbd5d7e141956fd37fdfc475f2bccfb071f544367278670a7efc2142e2e8530ca8716aefc503345394e3f2448312ae730d74ce7de831ea707f5cdb8ca2d314467c663693c63bde623b70c16a4c03fc2714efa51f8e98a66a0669cb71cdbc19f631fa6255ac0316095cd05c71b35761d470aef0a4ce7444fffb6d1a7bcb6c0a23ae7616bde024844fdf49e9e122d5878308f9d8920f8c6b3846aeef3205ab8ed6db227c54c866cf3cac2491400046133cc4188573b8a9c41bcf75731de1404d16a045b9a1cd909fd8aca97b18b572b0058c521ece3393f6b37f09cdc4c8f5f0ebe528f82c576c9e2cc51fd0f0a92104e848f1cc2ce712aa053cb426af23901f5d92145f7ecfc0723fe0d0b751441bb7ece03bb6143cee881befbca66758da81758f4f161e9b55c319e60259c2ee2772193c79050e9aee37fc816a7473d19bbf3ac421469425f33ac3bdfeddcb0f0fdd7845f2e0a269dc60b0d806b95bf49b80b51ad41769d4617e444f0c6cf40f999f10e1f07059117eaa40ded89ca82ba16dec77afb0240f6938a482732ec6568e60eaf9b9dcbafa9cbeb3792746e1dd772ee9c5f93a4d40d110ec407d4ac84cb5ca0c76964d4e8d004311933ddf8e71e36ab4eafbdc6dce62ad237070e98359d883803ecfeb9b3071e26213608e3751aec953d0fdbf0b21e4b851fa95327de6bd334e3bacdd2b4cb643afe1d97b65e4a0f5d05d460aafa11fd87ec5344e40592d837c53754c864a980dffe5f0cf9f928093327b20e6e1b6dbb6b3bb9564541cf01a1470715f3290dfe95b07ecb26ec3184e8211d17b2ac8dffaf8c3ff9d3f95cea21d79e93fb988537eca2f174b59df2ecbc706a2f0113ff44b53c5bc218b2e8fc0a0562513a399bb755445b7c3e84e8bb50944db6e1f83e251ceaa1217bf4efa1ea4ef6d04762ae17501311541a379f7b251b2c41cdafc71b570584aa7645cd964312c093abca58b27dadb79ee13c6396aa638a523cc12681f41b8abfb01c2f23a4ff540dcfc718232e62b2af2bf9e1b8710bec5aa7d2e91364ab27f381ee70d4607325c13bff68e402e0a72742f6a63ae972c6dda74b6b2a3922f0c894433f43360cba3068c9c76f6b85e979cec90da89446ae5db3914940e21159c14f90e6ea763a85edeebcb04fe8e11e2937d7a48c01e6175d454aeff1d004e7501c8e0424a17b1d4c264ebfe00b8099b816a8e75fb2df765ed4eeebb7b36c0df79361139c684cf4fdb80642da33c300a8e3c3628e17a15fc50ad3b8fcecb5524a4cd091bc0b2e81550c69e5990246c77e07ad92b1a0ca48322fcfc44bfc8f38ba91431b0e3aae56f4abf024a6f78a729a2acde444fec8a428ec09ba2f534845bb093efbfd473afa5f1f1f6c7e73ec869fa5baf3c2820b181b9837f711917efdde3d3ac123e152cff6ce6e39aa080b77f100eb3da4cb2ff88cecc1079d27a1c59685bd16fc79946c5e426328943455cb30d4d52e864a95e9ef324b682c964f31667b3c49f1706e43e8037495d78969f4c19a0f42c170eb50d5012d953a5dd5c5e0964ef6ad764eeb369a392dde67a68945b9001700ee8eb1b0f1ee1b50fed3f7775f5b997afbb4b6cc6f273d336f99fd1fca4e17af03fea1155d03670af9d84aad4ee89f04614e5b1c0aa56050f1b2c4c2365fd12661c99374db1404c2cf4133f4ed8c93b4576a3ca7f55a23d1ae9f74df959bb021886e0d41c4868112ffad47e0a3ae04153ea6dfe2a7abf41ff6ae81ca60a8411ad85a731ed1d14865fb8b0af319c36ca19772b97eaa215d965a6e8005100c106ce21d697e6b9ad7465358d19ea86339e3f25c5dbe6540ccff4a6dd4323c1d8aa2263564c2fa39ca3e87a55055e813f846cfc241347180cea5571b12b43d733c552520d98f16348db918deebbb514c24548052e8634767df1300f4a01d9ca +0xa6f88871b9f52e19ce23dd00fe0162dd6a6bb39d66cdaf2ff84b55aa9ba5aec9d2d352b374097cb35f0e1b71867a3f6e +19240 +0xfbf0045f3bcdd6ecc9c0654cc6b8ef9283107787396f19aafbed9b75e87744e2a574f12e0ba865dd1c59e1fe3cb1f4b09e6495e5fc936f668bef7c182e21d57de96ac97d99862c67e3d7f1336bbffc0a464e3108b11dd14003790600e0c4bc57b019b3d54f2fd2920680bf71bbaaaca664157476c2d6e63e4bd360b76828a178e0cad8bd946a00666e9d70439439ae8ee10285b99586576b4b45b4c52c152ae963c55fbdd0015eec01752f2e5e36aacaa35d8c5994f5cbccec1727b0965302b11f52715d6cba932ba85222bc81674760946eb3dc25eaeb6b1490e3020ca9cfd8feb93626ce5e482b4c7a717465942e5a9b7c20ccb22e5f4facf91042f8e13a67e741d59f5fb524f5d33645de728707bf9fd1fbb0a28ace809d9ad5f9c1c1ea65c13377518786d09027cec683110779988ab36d115dc3e007cdbb5baecf1288da76d743c2af9bf3042e8a1beaa8db2cec436b9e764ba43eeb26a4cae98a9bbbcfed75627c3dba365ad2b26d9ca1ccc9c3b240b567d4f490348f9d49335a262c4a0e55fb079bac4199f98de31f62a2f826bf7cda6c607a7deaefed0012a7798256c1bf37e92f38bbc98d64a6fd5525601b5265370e57ffae1630dd1810d95e66f8eefa3eac63284df3757fddbde01caaad5345f1d4214bcbc039b5b9b5589a803a7d4f37d79e439e1e9926b1e86d517de1aa62334726267beef2bd0a888cf8772356064af347505752e1a14a05638a82c13f0523edce5866aa433c3411de3ff4bb6267a187c8181f973537cf9c2a906154fa75e95182a835fb147c5ed8b4369e0b87b9611b88639ff67d3268362a2bc1a2c4fcaef8a8e090ea4dc3b16677a71e1aae46b538eff87e76a1d83f5aca224ab483e09a6caac61e7dd65a554290581bf1c054c36565a1652089727990753fa591216ad434ee2388be978971f465113e96a32cb32a5224fcfa1e47416090487a4184e285d8debe75b579972e05609c2f134116ae0f1e4aea0f46a1bd53840670cd9690d4e0e0618e6962ceb3fce8c095708059dc9d31dbd864eac615f0b941303c3dbbead55ed27be23b742961644418b34a3f645bf49f6d03f3ff72bf97c1629663adee3fbfdae328edd2b7bd3ef161e6860e6ed1cd5e52f34794fc49874dade4efac09a46b416f445f308696dd8f18101c0f248825df2e3cd0cdda15efafb92dc901638ecacfc63d78d6bd77a9e6e53af38aac0765ebaae774f235ac38ad2f79d9f42384444c901b220b85e50abd6e6bf5c72ed6f34a6efa1d4a3494cb10b7d007cc720f417f77e64418066a68dd5eab090dd37e39c42180b21e00570e9ff83b3bd377b6293121a7c545678d2b0f5b0217a6c2869d206b7e1bb6c07c6b249bc15d4f5b01642a36668fdad1d7bb190d7908d824768928f6fe405a9d8c4965476b558945785a325f29891f6bce81c31e17c2ec21d764a267070952bf0e102ca5400bc95ea4731144fa9b5c5efce3d733e52e2ae030965769a25ee54d8a273f5d486757cd0c188e8ce0add8d1e94a1bf7e934d98a09870fa2d6275d6f89f866168b527abb38af73dfe4a7dced1b1f590f2dbd4246ea9f92baab4c004f92ea6b7812b27b50b1a286e70c71b0d91cc85726b9afae3d5c46a75a29b517122d65152de471a2b3fe57904962f49cbe74afdee293f46397e6e4182a594ae9e3e2d12bda0975370da73858b0ee16e8c4a93ab5ebc572aa7b11e1abd142f4c0e83a97762a8aa8828535aba8c2b7c0db1245d3a6ea5713ca1164a529f8ec99e249bc1dbec26ef0cb442f1a4627c5dbbed1d0e177874fbd0d82679859466022982ff1ccca4dbd3759721decfb88204dd928d0ccf169b75ab9f6a2220564a5782ac25f0c64717f64753687898f8dd1007440cffbdc3996d117949eacf3f9c381e029904652d6bd5f67b8f659cadddfdad74154d8009ef50a6f85e29cecaec327028d0ce05d257f107721f2c4742152c54a52e8ca2441dbed09f1f65cb82bac51d71559444d06cb5fed990132540032a8149b123912c950622cff63521f1786e7a8ea01d8ea20ab341047ad0b3323886a7e455a8d90df5d5121d7b0e8e91a5ad0bd338c06fc1c267729547db7d9315bf5d078482f672b08a231a26585dddd2ff65e1980354aa1441080e7f99e0ed3b430525b65855f545b3da1880b90c5080d40d3c467cc9d580ee75d29aa289ab19a034b1738f83f035e0abcb029736743fc96635bc835bde98be4084217be4472155605d349f1d1df18f2c94347958b3405e058062cd772fbc4f0c859c9c6d5bf2d11c6b821d6db9191db0f68ed5efb862f06f8ef1a1a8436bff1e79646aa163feb1dd7ee471026c0d1afd748a4367edf83f18c3b1a66ba4486d1ab2218d0cc9b5660809c43087a15e154690af385dbe807875b15b423ddca21765d25c6a2c27a77c308eb9e259e38c8b40dd863b3db48c5b1afa371b9b57396ca44c6d986bf85542eb902dfce5cd08eb50bd77b2846a7c558ce0dd8910ae4efb3aa2ed8e68a64f78ad90a8e6d7a853c41aa31c34de4af0e62017c7211a4c8341bd5854b29ecbe68bdb12a3469c101d83f340ec3887c06a7b99018c5a24bc56be90ef2bbb7ad3badb1898b582af9e96d96ef950442d8549b43c3085badc6839e059d9daff89584d04ca9548218eae8003024ef0de4be42efeae275bc98deabd456caafaf546b41d97858ae3a9b5ba49bf41a4366d4f777ad9434866ecc5be516c6dd504333f919ce1cdfc1091b16c545ca1bba987c4b9cdd2b0264fbb205d86b3c1da7f4fd05b5b92086b47600e1f4079a6d7c2a43815985969436ebb1a32ddba1d4dd491a58bda16b95af0ab285d9e84c59b0a4906355afbd3225c430ff8c6edb4819cbf2bad88fe754dc4b99ca1bf0c9277f8fcdb739628824591099df9b2dd3c18400edf3ae8a7b0b61c31d776227f71f10716146aca7dfb1f956530c051f7189467274cae89a0f0166faa7565896bf898cd5b4d85785aa232d1fc64e704c9ee786a9ed082ec78c7f14779d2da34409ac1a402e35e204d1c01ff25a6c85bd40226c2cc275271ad8cd92c269c5eb39bed1e33c3724f42c3cd1f4577730eb794083228359d97c9adc33096371e6d97ec4400e50376e3506d49dd7d685604a888752cd361cfcd55080f9a1e21f57141a0541c40596db4f997f6eeef8ecc54cf3fcd798cd71a6d842ad6681c8dae24515681c2de1bc33e7ed268a6144142797c18659a9d1c29e307a49c3d29d094d1478d418706e113ea80bb23a5943664ed3fa0f2228ca76ad83003d58bbe71661284a337eb634fec437fa09c6fe7b4801a9a77e783e3ef59b7ada726d653068e62a936c9626bae98c3fc215767776230ac0cfbba413b7a730bc12cf4af8ff67a4c15b67a8e9883b +0x240602789ea8f91535fed9ce15b79d6d3e6cb54cdd4cb55326ab03ea76e0f89d42202ef229a55351b13a1ec143c29711 +20032 +0x82b6d4fcee076404ec0e88251df98b0fc80488007c8f2d7ff774be4d47975d992fbf8873cca4e383784938fbef8bbccab1fa9413a7e997dd08c1560c7e9b5990850dacdc14439b998052b99c9dca2716268a120b5fd97e06f8b2420a355e54cb4c49471e0f0e12afcad413f26fdd545cf05c0cd2ed8769628fee8c31b40bd6b44c1a6223022bd22b20754fe4acedcb02d717894f991ce059951e3c6742c865b24c2904d238c2637748dd74599e211572a364926aaac06b53d1e9589628bd8b2d161d3513f8fc4bf90ab58a3b8ba2b9121cea2e0b6a9a93b80cf8eaa5af14cf8d709ffdce8900141b30a59a71bc973f4c0a52651a1fd3dff00ef2f97c1cf2b93b235765eb34f745448054aae37929308734433f7f1292d8639f808e03ba81d29df7ec7453410967dbc46bc5790a80122a6366c5228b000479874ab022d0e9a11cb30733ecf85d014ac291f01bb6c3709f5f63feecd145ed9b8df767c1a552af21214fa89fa01c9bf8436f35b1c61bcf4df0e1f3c32e881b2f7b2fbbc882e38212076ddd55836dbe4d0ead9b2382afb99cde88aa91e8f1159f179cb51fafc4a4582e08daf4e779f0b1edf22a5932a8b5f4f0012d3c48aa63512ae45cae741e9d5c5ec9a5651568bc8ca6e6eb3b1e2d4cbdeff484ad96d88daf7bafb95e1919f3855e5748915561a7460232e5b28e67045fa408b5cd1aa61b1fd4a6d215e5dc303af85ccb5fef8c3b47c97e21a4c97d6842d4e6ca831c3a960bfb70b1bc2190dbe5f27d34b62a12fff8c371a5fb1898fdcf4a36cab6e3bc86dab9b65e3c165c7ded15648d804f1b7bbfb7b47b9dc3e04d6ccd9fbe50b85571f4d620df7b09699dba29b9dea4a6ce38056fefab74127cdf8224c9ad38e32ce1c11a553e6345dec3b4f6232d0a7754bd33b1c93b664c953b7a185d9f56ac6b5da94dfe83db11e47843434b849a0ad592af46ea355dbb52eaba71039d925a376e1436c2b4cab4a342cfdad9ea3ca67840e3f6fba040a5dc73acf762add437bb9a6a9e4adb1a7742acc0817468d895654e3588a485f7535a5eb77123da04891c6c134d3effb2a2ea3b7e01c404561dc5440fc68ceb690df53442a9ed290a998569770b45297a7dc279712272c89e87c0abd8765cda801bd57bb76569a4ceaf1c1bfea007605a4ff3ed01ab26bc981b7d0af861bb5b23c421be7d6e3f523913090911d32dac3a62a41f976687e72d2025e9d74f52743a510282fc8c163b310c75bb166d5f1502fcfe9899193e5143e0dfd0dd08c92fae0a9f519c8696689fe388ba773744a49a6629df718df302c3a1d4487253c794653721b2c52668e06ce1698d9af68560eae84c7c858a4d0396ac2bd8fef9f4aa4820af2edf3234ab7e4b41bce975c952dbc98ff83fd8f45ba2490d09e9c3f9793f0d724c5273a1d2bf6c37d0ca7bb98053531bda063e9112d1bfa2629b767e093345919486b1585c168b7450a7cffdf43bcc18aa4185cc310a58116b7cdd2a630a11358ee4b401516aef1fc4e73a3cb67c7daef15a754cbe345a83acf5bfa68eaeb986c3d24343baa5e161b4f2841eccfcae0335b8d6bac4390e1fae6ce399920585abbab928c69eaea962a930754d40a5a74201c370bd4800bc0ef84a12ac78f9bccdfb022933056d8f492b09d46e1a5eaf91dae30bfe5471ac7712f814874771a8130f130f32f7cadb3fc0e56b2c600e0f184a806e24ef74258385dcb1d107548fa67d56a16a7dadd46bf22c002c1c9f1001d80262d822f1715ad860b133c08cbaadcd31a9849efec3f648465c1955f8f8710dd1afc2f4d0d62393ebdb547b007151880eed2763a5f0074a9b479914010f926f551d896df99d073fe4f8dd4098fcba355437fcd28aa3c78193895460a29f8c88f773d695550d2d63b5d075153ca20f5c6b4dabf696245d7497e9f441c3ee87e01d7b5075ca70bd87c52bc504d4ac7985bbf7dbd4afbaf2ac0d301ebf4c45aafd31fba014410ce1337cd1741448621f39acff3476beafaeaf5f267ce325ec1d6999bc6d7aa32bbff0428a2b4d800c2affa62c60e3ac49b807f393b6b4372b09acbf8660b0d6137f457f1d92b865f2c160114504235fd1393b333f743a684a964c092121bdc40c4abb9b53505cdd5c0de35513cb3fc18e58d486f25d7ea190ebd3e15457a9536048d9fef40e42d1913510da5e5a3eb9ca3e5953731987cb4731c9aee8aa7d6d55a02711c873702ada626f08ed5c282ecb1252048b515eccb58fb4d7a6c440f9357b2d3a9628f0ce7fbc89488a77050adbfd480002ad098e222e1ec6534afadf460074e228d4caa7c86ae500fb53de344027c2afa0d492f7d8358ee2bae7b307d15883724420049cfc950b9a0999ba9442b748792c6f00f11ecd8d93a24174591daae250b3b4a8946564847c7cf1a2122bd662c670255c633b1ea241d20044bd741f1ae63c37bd794900d7101c029d9641ab99fe329fad34784f555413cd2c1b1cdfb29ba9524c32f1908cbcb175b308ce5f74893b84fb4e1d892e342d50335b5e1132d6c1ac5ca7a53d2cea02f1ec5018197ccf537d4f9872f3b64ae830616582dd22014beef5c0ad2f3e01d81f5156680237394132b0fabeb674fc0c15be21d06c0b8310bf1f65508d4a69fba7e90305422f2dcf4a265c4bf9f0b360a9537790e675c4d8c8e37ed77fd8893330bd3d3900ec14c36eb9a65fe5b3d8ad9127500973e62c6ab048f38a2f71cb4862d3ed4a64f457e64572c043a244d1bb7842928439e823902057acb1c29c9601e735fc8197d15c007858933f572b085204ad274963021110c017919463e2532764eb5026c10b8dd9ae73059a2cf1e33add6ff5a017bd5eb337908b7b38ca688284fbd3810928513890ccff9e4a1dcc3aac90e6d17d9f72412eca80ad69dc3edaec6f6bd998b20fe7c56a6a91d9372a1c1919e123bf32b5824cce5a731fa03df7474e0278963131acf6562cbc00c865a6cb11cde002fe903e3aa3ff15829fcda13ba17fa42a2b1e50cb962f67e857e5a16b80944e718a693c9f5159dbb960579f706fcaa67c2a3e9beb3459dab96c11d4a06f1db5315ea94524e14e0ced6b41ba90c0cbc6b5b5f954ff37945c9a8f530913e4505f6d02b921715ac8f24549f5ba409d6a4bfd55b745aea8c736b34912066cea15934bffff982dc4aed3ea81d9672a0c8f7f7b90e034a18edab12d21b79452865498f3dbe5710027e8f8039b5788f61822a858f1dcea80f1b41330a0a87b6dc2f5b78e21d276948c5da9b920d6e74cc60b0fbbfd132ff2da3fa4e34c4e8366a5e03844562e6d8efaf72e3497be4ad22032fccd3eeeca9f4f62ae6fb01174e537fe633c04601f997a9dce9b88767a332d7fb6b63bd385305b0577fc515a159181357f9fb2d2545b1337d2167b683f15f5db879d7c2b264d031048b1b98f2f138a6ed694e9ebd47ccdae82cff9fb6021812cb5aa8a5f769d516c69b66f1a8a125b92ae44301366a5b0e826eb8997a7fed85c8907ecd53dc94cff2234fb61ee37fa8750d70fb2 +0x8e2dff705dffa8faab0e5e06375d8a188602a9084843866e4c991a450de4c4503ecbd3667ebe432b353df3181f9d9726 +20824 +0x512fcbc41f29ea7a02b8d81e0cf06803d95228537df0f150bbd2bce07897b7496e5f993925e932091ff9464253fd9b61deef51d7f47d72541c68ca459d2af99c33dbc6cf0755b623de97de2a9167f58abd3cad01bb5a43a6d33f5572ac3ef5fe076afb8eadb59f4fa65947ddac779d08e0fee5d8bbcf8ecf461f066d8e1cd3fa52d3e07f00511416e00829638e75bc63ad00a064da247855dfcf8540290cbc157ddf1ca9e6703efef26c2ec51da979218e0987ae01a02bc2051979f36755d8d9ee565815485c4591454dfc0a435afdcceae042bd198ccf9d1fc38b8c2f414ecd0e003bc90f5b505741733b3ae7d26feb284e789a08308b6f979662156816477945a46ecf21b687d74ea6945ef157f807b21bd14bb8d488bfd45aa795fc1dea66fc0c982f68b51399d5adae7d4832c0a7ef0ff7da0fc0ee153ed70115d29e601b99fe62efcb9f1c253c51339fd6abee5347f18f4ef73be4f93dd4199cd2e1d0208643731931bec904ed5ac8cc8209ab94228b44b0578f92f4391b9632e42d63fe29a375b4845843bd4e90170d34961ef0e8a3bb071602218d9a7221dff0cc403cece50dc9abb6b2d8c9bac869d49870f101029f5b1eddb94dc8a262acde04916236d3e55f8e203dddc5a283e94b58c81fd67096b5566881bb2c7300a0961e7bf96e33a57e15dd0c55aa0eef947f1e4f01cdb5481ca6eaa25f2caca4c401612888fecef52e283748c8dfc7b47259322c1f4f985f98f6ad44c13117f51e0517c0974d6c7b78af7419bcce957b8bc1db8801c5e280312ef78d6aa47a9cb98b866aaec3d5e26392dda6bbde3fece8a0628b30955b55f03711a8e1eb9e409a7cf84f56c8d0d0f8b9ba184c778fae90dc0f5c3329cb86dcf743bbae704b8acbbeb39716c426ee3e0c5396f8014b6a8b5f2a2492e7fabbfd57d4ef5a994821533b0069771f9fe33d74ef4945e43cc7e20ffb0ad639b09b5c3f0e6b6cd05faf3ad926ed00410357fdd7d859bd892a6e9cd6ca378686b4ce009837586c7c56d988826f4d39931af4871f54ede856dd06c19bded32a35cffdf24898dde204f649461d21aeaa7bac5fe232ac2d4db41c385a4680054ab0c9d03839792357d207a77c92853bdc62804316fa2842740cb0ac6dbef8f56f5e6aeedc512251534d519a30c9e31956b15f462c5d0f54e5c4620905ed8ecc20a77900e57ada905cdd9bcb6ca98373a0ce11102b45ab8a2946f8f727ba8ab2e6f3c0ad5c9bea08fceaafe2371cac6f43235e4a1b99420dc7f83a20dd0d33ce48aa059e489c9ae0badc53869a0aa735c6160e9c04411d054744f2292eced249ce34117ab16432411e1c505f9b59bdeeb111e8adef2484993291e6bd23e5af4a00faaceaa0ddfa52b1106e1645f233c28d7bb526e32cbef10e46df82c23b12fa67629d961bee3a3cfa2174539dbd54d8e0bc3daee940153666cda52015b643818ad5ae252d7f392682b72cbdada26759353c48ee0848cf90bf8d0040243f8906f1bca540db794039cf3b5cfd7c8ab36c11629e8e482d3526a3eeb88af5bf2eb1257d4b8e2fc2979c6b13cdbb125b813afe980635b1d58f21995894a5931c78abad8268b830438678dea9479e78ff19eb83464a8b4c2925a82a335e3a0340b01c1131c465e6e455f5ae64924eb55cc3a629d2303a20113ee4dce7dcf04e111d2cdaf4263e5a8e4b3a65ab7574d15cc79376a581e7357624fd3adcd7707d7909018f3258ea9327b1708ae8b9b8d5e66cdbf427043c943e1d1ac97b1661985fbac6b85220129998cfbea68226c1c8e1fca62bc083e144537263132a636ca5aa79a1debe475e75caed4d40e18438b237bd1ba2d9c47e4d9b6b019f528439ae448eba88dd95752ea45345e06d9bc49bcff863e1d891bab8004f1cf55c426fba14413a3e17d100cc0d49cd0f8e330e8c91f4a57027b03d8c6968db9eae65b6d202da4988d4c5a658ef160d53ac13bd8c65fb0ad82ce9b0d1bdfc6721b2b5b8fdf6a00eef7c3710d931032e372f047aa43353baa05106bb90e654e806cffa1a43d8dcb2fa77f0e657bb5858407fceeddbe345dc50fdcd05d0cbb885d66cfb87ac90d75c322eb8cfdb755db2f80439bd395d19997097083799546f6618f381a54107d6351d0756736b475965e6260d93c689171889897df8f369c3b454cb541c09232465456b947b12199698924e11168b508782223af5f1e7f2fa97125c3c950ccd081332c3388fd5d35a7485e20eef8f98b0fec41237ca7cd75d36db0e01b853eec9686a750b56be5dee21464cccc5da4bdbb5f6790d2abb0034ba36496a2ce56cb08b77ebd579d49f9ac65df21341754f50ce40d73db9aa56c74aac75409acb3105a4e18b5e9f1f81a58c533eab0b678e57722a94902054bf5d0fc4fa4ba90b2310dd2ebf6d71a8ec599aaf965bcab8ee38c93d18ce07be24403106405302af2c185ce8eecc9776c6fc19f964ec2671593afa00ccbf15f26eb6d7fab0204cbe336749967f41b891f9d730ba0f27c999b6a62efc162af3f783082929b07930411f43cdc1dc957c026b320878ffd15838edc48cb75fd949d54d7e501aa928563fdaf510f06c908dd00655c8be9cb57e57e5dc3dbb1092be94b35f745504f365c04bc439ab97f99003b08799114e9ae1fc883668908f1efa3d9cf5bc6327a306cd5afa707bc59a30a45311a3fb7d472932bd1a36bc4645a6d8f28651cb7c00e06cefdedfe65e3913bad63b0d039185fffe6ccfcfc99bce6a6b9c5b5b1569d19ca8f2b7ab76ca9fe14d214d00b2f21c0b6a7d9e5a3ff883ed0082bc01ca58e0e1864bceffb3729443661c8fa38e08d4f47dd9cfffa4c42ad89e8cf06b71b0f35810e36b0124bcdfe00baf491f213c75623f66aae882678cd24ea241c292d9d3a84da0d5d951114a6247c2c29bf3f4c6ffb90d763a6049718417acf52eb53b487a456b56b0c2da9b6e1f3d43408a999070f2b77d20c7d2a195019255d6633e1976012d34ae007d9baf9d08143570949b60f24a05c03e6ae3ae143ca9e3234a104388ccb8fa926412cac80b7da32d4baf75c2b057424d7900775992397c7ec7f38ae2322abd00f5c86aa82fc6b24728945769cfbbcf7c67c197d77d4ccafb1d8bf21845d21ed39a8435465a3689489211afef91788f549cebb796e32cf522b4a02431eff74692ba10d3a9751651b8f1f0255ddcd8a95c80497e9fae1f247bf4fac73516e35cc5bc32edd969ae311dacf760ba9a21451c7ba295f9c46e7f8f4660842da4dc89f40ab32bdf1c4652012def090eb29c8d1df6bda3ac0f612fe5109b0320802bf5a80b5a34c27826dcebdb9fc7620c91a7e6576351c1753f5c05bb74eb169218c76827f1b18a6496f6641ed143bd9048bb00085c473fe0522d78b0b0e517c2ea28bdc63e4940c7ddc8f35e4b25272608f2f16f702c2e37e0cbc5561a982cf8eb3f2e500ba5eb8b447b2003d614a8b61b7343f667a99762325e741479ad5c1c6135432d1e6c9397133773753ab84928c7677d0408658148900d0e5494cbb016953184c63f4740d39223751d3fba116455f628001c09f4d341001a7d349b2ececf5c7a8138defb270868ad61adc209520d47cb546b3cf8ea8f6020f721c4e02d57ddacc7d0d8cb7bbf2da3aa4b7737db3683ee67bda79675c055a82923ef +0xfa6f2bce66e628ee4638b8658e0cd36ca630c71c7e1d6da2189b4e8965a73573fdd137d23481ed07a8405c04b1c9e48b +21616 +0x2ea36a8deee36b8e22e1e40550d7bc92aa04c2179cf4e419a103a1695a1dc103e1c743365b639705ccaf0dce30908e29c70e8a13b09f314cb9a8e6fd7641f09e9039731760599f25bced28001181f63bb2e91deb70840f0b6bc1111f28e1eb18e3ffe478264eedb69aa31de41e335d8f169d65e7052be71f5f5409179886193981237ca1d4cae8800dd7d4c27c2d2cee9933484e971c1f513c6cb82defb7e2c813ac25d99353f84abe9334e256f7c920e3b2b06a4de02167aa0e05a955fdae8f40a3c6698b7385de55de278bd21a9eed9d22848150fe53295344d8d2f1dfe554b10f4799e3b1f70279c19506181d111d6f8bacdcc8fe1f61dc1519f1ece5efe00df88fb1c495b77fd242649c51888c7700f60fc3dc69ecd5f08ab04e6d9735fbfd6788f955a82b1d096c7d92a5e476c4f96a977db4c5214e35a986319d7e1d6c296219b9bf71bca3c644c8333bb737cc01f02b54799d2894537c81e2a42110fd38f42a382979d2dbb0d42dc63c8c3757c18fb38e5376686ff30b8aa8a9087774d322a4bfbc46d68b70239592cfe8dd2de14f187469da49a7bd5c8acdd4bcb89aa1f66d969f622e7cae39e6e01d5593150838404ee4503303587a67974ec43d374b776e05fb554476111f0af84e5ac1d9de531464eb618e4d6d6a0b4f3fa86c1378ad8f54f8a57f4141dce7228980cd3f0da77cfda793c24ba3355c3ccff1aff5d1a1b9cabddc46a4e77867a6f64d20103a3c6163407137c6a3e444a824266da7fd5ad2b073810368abfc71cbbe4b22130f1ba9dcdd805685147faad969cf0defa5e0c34e411d1d55346fecdb09023b12344b3eb1a64a85529f0c7518c475f996713c75ec5037fc332bd9c21cfef9d4d351d4062ac4562df3ec958fad5d9f98640875cfd2c85708ca3742dad7c6b853200dbfeb8e5f2cb731a221dfe05dd552201393b848d006a9e201b31c5388c722bf1013d4279e5589d469b94df9ec9f8f94399f1a9590ca4742303370da6dafa77803d8a83baa580da4eb64c13f3186b78623a0dc02312e4ab36dcbbeb29df74c158e175113abbdaa69cd2a23fb551132bf799ee6d7dbb71afd6082ee243f27785c58d7b6f7c80dc7eaba135b767fc96907e2a2205cb5ef1fe8b060e8787cc792170a20bf2e29cfcef0582852f5d834c22506b272d8e85dc13c066d94f67b60040c4bfa5402f78b26434f70eec388dca6e38ed9c4959b8969c009b2dbe665793504c46e5db95ac937ab48f31827b6497e07221cfed9f7fc7d3d6236a38f619b8dc61d83c29c791269f0ebbab9688b01b05a698508ed243d677bb801d63a984d741cfd426bf37ded24d9dfccb7cf2e8ea6a40c1bca1949d48d42b41c5a2f311752cc0cb141068de3d02fcd32fca4c778c6adb2e62ca48f4a595afe8e19b655818f9ff3db2a1cd27bd5ba5cf26e2f80457a3c04ef17d81d26318a3d5ff9172c14935d5ac50f7f743d9b423516f7b77f7f291baa3d71fb1cf07f9b1998e499dd57c7cee879d9759ab18b8fffa57e86ecad3a104bd82456b331aa563c40c18591d391b946fe6e476c600b6863a8eae2f05817e48fc916310b6f1a804b5f78236f0e5ae81c5cb83d13d1849709262514b307275f201731d44b3537e4f1fef0bba0928b21119b9e9eb78c5fe2982716635c42d248a3ca5b869c086949d42313954be78a2dcdc407b47f1a0212b9b4a51913928069c3eb7e90267218769cd9c8f99993c1d4f9dfddc59402d7ef13d3ba7d027d99882681813a10faac34f225f72eb22096dd3df2071a1ecc44404f8f3dd64e8d856e74944ccc83298d4b7e11887dbd16731240076dfb4401b3cf14ed166d224aade3562dc78ea6852383e7a4642ee2fbbf39ab25f7af2e288b620bf72e8aa43b77ae7352dac8a298d7a4d5e671894b59e21b25558d8005c934c2dbb46b74fce84c99750e6dc19eea0f75f2e098d51db74480579e17b4f16c16b72d2cb67553d9956a016668c2c30134bfe399c25c839e4d30e8087d94199a9908a968f8d3d197b8eac264b3133867af4a5319d564a39565f2819ba768a6da257ff66f17d79da91fe15d0f36fc26a4e6dee869bb36a524f48fca607d78bfb522e2bd49fdc9e09730177d6fdac5b53e43434a905a1ab2d362d06a5ee80b8db2f8faa5ff90f1c1ea5553c88d85b50cbf2d4022969c57f22b177a0a9dce6b38590f8f5798ba966929f55fe670201554af0c9f188467378cb37b58512619dee732cf697a1c6102ffdc77018020942db4944726d361a500a8f3f631e800afadc2c6a14fb7946f7bac8b45023ea6c74555f8489efc353dfb7074f1cc76337a20f29ceb0ab607cb4a98bfc629c709a3a55f6276ce3a0917700abdd2f2a4c8607e9f3c16631e7d5db7eaff6240c4510f95f95b398036e41ba79e57036b1ac64b11f02f8b1f98fe0d09cbd4810ddc87f25c4b6af97a98ce31e755c8eaff7f35221f0efcb109cb93c38a62c58b5ab8b236437e171e8507cf417a569af1767c1ecdf1212befe860436780d85ae8edffdac292baea10692bf033a6ca547f97b88833cf5045af83fe17e134541b018e5a077e91266c38eead38efb4d97ffb2bdc7b3e00c3d158a34e1519eeff913c0771425287eb24fcdc35b05decaaa2cffa8fffd5cea3575210f747f8f60043021feb9226be309ac5fa6a5e6695664562cc7a1de07f185f0492a2b5649380b9bc9d7100e27c1e57fc11f54cf0f834f11c6944dc485c4972d8f1f766460ea77cd04aaa936e0adde207e97d82e45e3d2c65999645f3ad5f1735f49d6287af9c13a8ee3f53b2b094c3504aab062b0da981a523185ecaba81d783653db10dbe8806aa51d74897b56c833dfc27e2ab4e9f7544d07131b5cad8392b0a7e5cc28392de403a1b7b03638ca938c6981e4e684792aa684ac69d278cc593ab09698d46e322d172b2f3df001cbda872a7c0fba5ca5f40b34a236817c403241285e3554ea25ac4c246b814d54648f5c6fbd29a4b50646c781a5200e3a87c46069bcf04e4f80f83f07cd3892a30d1868b3d5b12a3002a9781615b4bd361b7624ef33781500dc775c4fe4b254702e0c58814644df503382a94c844332e173cdeb33422b4da080d02087428d273e5fd198729f4328981168b7af7179f3ef19424fd079985ca12669282857377f701b1ea4e2313a9a6a14d24fb95dc764918469af413a3dc67525c8dfbda33fb1b7d83a1a7abc99a958b645cde4a99a298b4daaa5f0148a1faf1765c3c1b70482781fca458691fed9f68e39aedc0580a73ecd9bb087890bccb163d650aef32456337a25c29041c8a0a605348ee9c209621e8ca34b521841522ea371130fe82da17c50031e425c95a1e9a3bcdaa89fa2eecd1357f2fa42b954795eec874f167ef8a539b8c4f732c43253f2391e92decba1acfa2033ea88e22813eeaf3a070ea6c050afdd33497502e657693fc72300122f4099a28a9d5b3a51a0db1f87a221239d011ad7059383a04276814760f3b3e4ec2a8a4563ad4a407582bcd41cbb0e73f339133c986fff4abb33c2d6786f6ad27ccd349f5b74d692e84c0c6345ac1716476b218488593850d511b6737a008559359b3106de9e70804e5f3223bf1feb991e09be3531d9ef511492d494e251a3e7bb3708127984b8b70c5ed6bbd560fc6afba751c5415c54c9ee2995b14ddd371c8203124898c21f9596ad62822529ba0a44c674bb236b2939e668825f290dcf560e91e82fc8c105ba91dd5e2d1ad4a505ade9af9d5480dd2f81b21304e05dcd22d566022e962c0b847261220342fc6ddb7b836ad25137d0f944a8d03 +0x88a7ebe36ed445be23583ee13431e6291a08ce9a42b7ec012cad0fe205bfa04d84303e571f0df0803c76d7fca5a7d8e6 +22408 +0xfe6f4286f2ba2ca82b6c4221cbab60711d2ac0f8d75963c29cd9b3a4c533668861c9a5057a0d6e339bf037bd8e9ed4376a689ab2ce01c58e67ee1790b838c2341a64884501a421aa824fdd83128f8a75915a984187a37b9cadd1513baf70c52d3026336d0ee90db8e8707d9cdee74bd298e702cd8aa54e93766aa9cc32433618abf9eda62a43f903d63b5e2f7b0fdff689f91f7d6071061ccaa1666bc919dfa094c40018dc1aae335398ca656f6d0e8a6b77387a906d6bdeb25ed242fd5a866bf26fb2eaacd7f5f1686f0766446ba036474895eca203448235893376556ef421cde14c4522e094e51ca85e5981705ca124567efa1e9a5baf5c0ad2325abdf16b2d041550c79e53b6772b1766afe30b740a883bcc8d99760e2ec9f79c92b045f11bbf57342279fc0c81e07ab7552e755602c6138b776a5e46b3aeeadc87adb75a9efa5818bcda559143b0cf71fbb862f012f8505f6274db00f3a2f21bc11d104ebf9d62251b2728ebc4815dbf2ae99aea4506386fd81fb5e4f78b5881c76918778591bb82c9ca3bc20c3d6dc76829e4eba0d914e460d3b399c653653520f7977af8bcab594e2956bf24ca47b140e00a9b2d572be583f89ec868e05e605731550220077ccf30ae4389131233a63776d2a3f369c79bc7f63e18e61c8e29f17e19b5065a740ef9bfc9c9e1fb79ced75305abfaf82e2eb7365b3247ed3cb97845ad3bb19edd3e30c6af27976f6050a7e06b5a4beaa9c5d81ebdbd933daf3774f0d73d29b9fd865e2abe4a3c5531542f83cb59ed298088b4172b62d2f330cc6be6606377951d0f0a53bedbd8943504f8a5ee4fe89bfba0d28a6fc90df707a0e78f1054a2198401bca977817416b18689af9de5452a6235badd4f994c317cda6f53aeb9b22c7c83fd94b0e516c2f0026a079ec30bbdfc6ef57a947b9589d7a38c9a0439b0b84bbd537c33afc98039a12417b990423b12740ac70616f2e75f22c4ccd87da3a43ad849c9c6869238d38a3e46b8f5f28eec6f812e6c136a335d80a251f32c93d891fc64e332127bd207e740fb6199249dd286e3158f19055519e4ab911def883b98502e323efc8b371dddb3a07e25e0500ce1b6e638d1cc35db7769f51d6e8bb797fd2e1fb4ecca4d5d961e9cd5402c8fe1a985082de2c6bbeb6063e3bd50a333d52aec105a8941fd0e3a09572f9312429b06d5e337f6fcd090c821c4c33ed9989b00f16efa7cf7307af0fc3953c59951801f30df1db2745a14d72c01f8df34cc31a7c4a25a6cf4cce7e180aa0b7fc9a4d91d1d64a9c03842bdb40b0024dcbcb8df46ed12430241ba9e351c121d69ab24ed2725daa1c85071d488462b0fdc7944ed06f5287ce6e5e3e71359d9522a46b70666cea9ce71c2cea07a66e980887459a20e634bcfbfe82e09a3be67726ba3466a02a339f86498406bb3f2a14188b4dd4787bfe2023653824e0fd32445d3c8ba622229f3e649dab17b5b72bd188341ba24989257def22dc9fc7c2079920bbff936eeea3d62c78e081a996ea4ce2124d6816a62112b9c7eea5c142ecc23ba90ed2e8f6d803286be2d8e956fbe2b0b641ba624ba78b1db4fcdb6ff8486be89417c922d3a251f2f71071f78fc73f6e9096fdaef1ff43758a75a5265aa102c20dc90a9efda92f16ab080176a9e2bf9621cbc67f31bed87ba8e79776d29d035266810bcfed43170de827fbc92dc4efa1fa3e9935735cb67aa0c126f3f8830a044eee41382b0696434efed58193e44c2c8a9dea744f6f6a0d02a0d80044f97372175f4f6a2f7a19413ffb031264c7519043383eae1e4d7fad3ef52f3e4076dc0660528ad863043c924bbb18fe28f4ac67b4bc0a65789d43c5c64c91006371904baa6687f57e3b6cb0f2ad8bc758e2993d6f87d21cd6d5630128f5b1e936705cbc6619cb63d9862627b540eff06d17b46bd43a2a56c16c69c9e7aee67b21f98dd313dac985fd8af561042399fbde1a9a8d73217785b0e8a49a72d6b318ce83a01a443806ee62a056e77fb42e5c3451981cdd0c4e2c3dd0cffd6aebbc549495301c77a007ff917cc7358871219408535994622912dcc09b285d307c46b10cb4ba341ea1515c1266c2e5aef90835b2a64b7eb32679f9d1ce6a54540706a09f48bb0bb9ba57666df4d64263aa36a3dbb0da564072c825f9e0f25d45fa60c5d4f79efdc9699eb0fcad7e0647035180ec09a2958a9ca1c391594ce296e4e9734617e2a4de2dabce4707369bb9a2dd3f5c2720c702127b6540bdf68ec744f54b5b40327b5874f310e5887c6d3bf72e41a48fd1553762d97d80757bbc57a938b09cf6eafbd8edf92b50a7dc055e7ee93a6daa30ea9b0c209ec92648e5a870184573a288a0dfe7426000fbb1fe91a8827c100ccbd1cd8d052b8336eab56a38186c87e9a804cdff53618eeabab366128ea9243e0ec52f43ebb6572ddd85fd6fbda84222b592239490a252fb32be5c3b622422a4761f30ff48c1bd71ade1d2957c9b2ae42dc39155aea4e5b3d699d491b18f83e69e5a82eda0d01eb8b853aa37d997baa49d3367a0f1ebbf9b02b07fa3d14dd05af3f195bd886403599945b4d5692069fa704c47150ed9591743acbde055d19097f39ed9dd63eff3dacd52a2dc8fe7c15c437890105a104abf15e90fd5b3dd3d24299ccfdbc7e678c2d0e4f4ebc23049208362d3216802fd08f5efe6028fa34e661286081728ea0a9820872b51b4bc7a0dbc8590c6cd33f87b604be0e52dd63cf42ae4e33e0b6d11c158b3a6ccbbcecc6a5b4b598ede15b59ce16780fc32e88154ff3411bef3e236e4d5f4f7ab6be9c8dcec3e8dd82f4accd3f5dd36c6135cd3eefbedf40856dbd26914b5ae7c29bff7bbebd9be314525a6b71a1782c163a58d489d8d0aa8b8cc7cc4b1803bbd9993c1add6a75b389448cbbccaa0f57c984515f870abd61eae36be9e28ef1ffe2027cf294911f54cb126a46b93f3ff6625ce165501a4e6e88bacf04be75cdbbc51ce68949fc40cec0041d939e2ab00fc80a30704cd02ad84f591ba547953ef56a30a3696571812a5262cd2ae4310bade5d66507e3f6faa726077854e5b6edb7b985da1a51b98a6f6873a194f41df8d5a007a8b37d5265e3f40e0e9a009f81089a65b422749c02a5e980c25834b51e91e1e723fa82ae1495a3b404fe0019a3f1f516590b35e191d5bfd158fe0ec326e890bcfb675ad0aec51a4282094decfb78b2e1f05dfe52e006d1ae8a0fe90db7e396cf5b7f6d80dc7941ffb2414fe030a8b90ea19e36b59740075f80122d5d7a88d96869cc248846bb0035ba306ebceb86f2e5965844d35e8b492b638f417917e142cf4dd5e5af93923f2ac25e134ad31c45aef4129274dbf07f5c5b0e8f2935f6b94b302219bc6c07e628f352a45091719bb0e655875fb97691388f187e377ccd27253a3c29787820dd7574948b97cc8dda3492a88b5e9e26670828347669967072a692aa7bab60e70c596eac2ee72d79ec82209306373306ea134debdf8928e7841361f4791ccb645c1e0923f7085c3cb7e2b99e60b31f2100a327c4225ddd3843b7cea38a95629eb30a6c7f4dc100de259c8552029a0a7c92fede47a5ae5a6d99d9023e15dccd9dfb67c04b97dbc1681df7ab3652b49e21896d99fcd1434a8e6dc0244d84bbb3691a7b2c0c3f1f49e1863c53d3b9c98017cb38806c0ee653a1a6b55d583ef7bc0bfa8fd94cac523d514ab4a7afa0a05b6642a7bc1ec55d1db02e00d5e8ab5b918a81eaef92463f48c050a4cc546d02d517d402759a5c7151c2ece9b38433aedaee99d6956775ad10378057ed4a8ab796306b90d2693dea97e0c8b820b53eb73e3f2999f352a1633dbdc21430175d8747bcee9afc12ce909611aab44302343f6686187c32db322a785bfe22bd45503a90c045681b1d792bf75d7a2645f37d0efacb50c77a8a90ca69181ccabd5cc9971846 +0x4e7fae296c6d80c6508379f94e01d80cf3bf9e057f579ee91df6d0f7c1fb85e4fac45194b91d0b1a9bcb756bff848a30 +23200 +0x8a981033d7b4eb4cc9648ba26ad9679c1550dcf32df17fb80ef6b299440f7560fc057fbcb79e8e4446c2fbb9f2db918bfb829f9f44574c504c302bb460770f200fcd21eedff32f7d3eeb477abb5a855e76312938d58cecad79db953d713fc7c8ad371d50b57b79009b28986d2d1eea1d70a6a1464a5908d77f3d17bcdf30445ebd8a9b6aa2fe11d443c1161bb1ee69ced02a304f0a8448d7449edaba11122fed260fc5c50f43a20120fee80bad94aa7b7e03fedd7dd553b4b24805bf71ad2f7ad20ec1e86213d290182637c58bd6542b617932770b16d276b082c15166c8ed0fa8ceb75b0536498815832ad2b17d0fe763d6f5a61c0d6c26259336fa582d10b39099d0a75e74b0f1fe5beab9895185b66b606ef01883cacbfbc48b41afa2416f72b53353d795afd4bbf79e0279195ba06261c6e06741946d195de9aed4f0284a366b0ae7d660ed38339f6f36eb9f3cad2e1f24fb710c711467a677ca2ddf6c4cc5037aecc59e1325509b85dc46a9cee6b8e3b1cb9faf09c9cde65e1c2336b67d05c5ade90b17c8a3f932077cf200b952e8f494d757f005933367c52d1fbfade6dff9cb661093b5bb16ad1d9f576ca6f9a79cf6a702990d7b816fd5838740fa8e3be6fbeb3cda82749054f1ccddb43de4db21ffc40970c8889f47b5a8c482447d02d56601f7b3d6d74d6fa88beca2251a6dccd6b5d23edfc275378f243f4d34bc1a0e342fa9e859ea36466d64ecfc07a346e5a402c7caf931ec86887d5f6872526dd98cfeba3fb4b7332166e0458b8a884cb490344fdebfdeea7eca3d8b9da547e27e96f592818f462d47bb865f1757d06980c3d2d140d9d058657deb2db275a460447c9c9976919d0a0195dea268158384936564b7b9ee0f1f84c810ac708c70d175637b38e563c6b4971c7177456daa85339d726811a6a42523d433709f8fb31c57751bd597adc9115177c64477074c53a993854c10ab96548ac9dce10729752933da03da5516ac0b76cf6672c78a71d83d7024cb7ea2ed9300ce94676f00bfe050babbade5467989504bd76afa9f21fb365cd84d2236b2c9ce0be16aa1bc9829f83cccb80fe638722514a393dbed65a4de7e283ac50dece03da94e52630609ec7188bd619d9eefb03e515154311d44bb7bff9cfa2fcfa3bf93d060877e86191104c716125515a82ae32b6a17c3d6c7295606bcf52825df4e18a7a171bae3d080f921603201f46ac85cca75435ac1f5d4b7bc119478b7a97516579878dec5362198bd212967e23e72f055fa40be85d6a5e549223de62c081cd307cd05b4d654dc28c4e45e50882a10e8f48275b7cb72842ad477593c2c052b98e0c97e02bb319af35d2e3b838d398a8cd1944c0d3bd25acc8599514061a78aad0a134d911fd5413fb18927ca9b70c82411b82c877cfd0d14850f8bbb70f6225aac33d829a849bb55e87c8aeb57d9b3f8df767def37fb874afc61717404fad9e7efb28991fe94ee7d2990cdaf6b7b31506157a80b13d5aeb612186a35c3bc989bfa17c793cabec4ff9c4b56de7f5e2b73bfe213a4b9926ca0edbbddc4554348c0f6eaf9f5b4d024226a388e403a8b8aaa22a02781d03aa84fb8d234ea6397cf9c0ab4898063d1f52fbbdcdd9c4509343db2174c6c01d64a0c99e6d66f95c117775ffbdefc80c9216eb6c1acbc47e0137496d1eb2bf46c391fb87e2b1b92c8069b1c4a6031b2c18f27846e6166e9190e96f7566a8750075fd03e229bb603b4864f6a2677e7a2bf27a24c6b6663d3bb0cedfc2c3348beaca367535a8e078f8e7eda71198be5f8ced1263741217baccef7bfceddac36e565ed2b1eaf6cd7df5dd58558aa04f45bf375fd6d77fc751d5bb65594f13f186e392565c8a89dee9a29759848624adc7338fb6d15955d1bcd6831f777ee53b80031345d78ce891469fa455b68c7c565e9a44bbf5823ae33650050ed9f5e4fdc4453005b57a79911f4d92d15e163de56653f4e3b5daa56868c28fb7e33c89d4de1a972a78dbd33ace2cd1510dabefb798e12ea284db2bddcebea1af35bb5a4d3803b72884198c1aedcdfe5927c5e86940d2408d04fc14bfd294d959441accc35c90fe9489cbea9e0891685e4eecde570897e91798c6168b0ef5954a90a357d3d632fbd2dc5b95507927ade4e599382d5ab266b6c2b197cbee5173f7ae1d81fb1f7a3d880e4112bee9e13d617e536c38b1b2680f15571eff0b28e3f4fec1e1a5a2c712088234c955c56ea5689b94012598086b64f32f2290cffc73a6f538ed700aba37f8fa8f4f918610647eafe39d608834cf7d0e92393da73c819233fb1bc6b1c41dcdb9b90c1eb696f8f83dba77660cb822abaa38d9324b79bc5b3d80d326225511eb525a9549d132e189c79145c29012f375687b692b072482567452ca2af71dd2f656ec61af6094ac87d0007ef2bcc5c05ecbe28f9474dd52086af967218a6ecf6339d6f7bbef3cb896d9709972ed5107ec46f6b2eb1f04ca05a3dd10c666d875b67da2ddfbc78ba42b666a1bcf9c3538925c3059bb602b48c291867d6616db546484f86aeb9411edb9e9657c6553f2d0e59e280a61e2c16cb3c67e03ad04f7e9f1f2104507df6ff3b6e4fb31e0af1a7f6a6f364b9b0157947db53c29e7cbaea4e347b2f2ed03e654c6db83e2ae080c827551e373b3565e5e74e04976c2e57023ccf838eae7ac159f5e5fa7f539f95998aad8d839476c66393dca1e60baccecd4f3861a9394228e21e1c3cfe010ed72007f865cf2b38def933ce5238e3bec65370b63e0838f11b09af5ba7449df6ef67877cd1a46a4655b2b06c41145c2ee79d88934234114f41d591ea63d88d1f8476f083f789b867d493f0fe9302dec3dab27d1594b42e24434eaa1197423b513f532c53ff067d6203a6dccc738ad144479b39855d10f538c87ce3186c0b0d54c808213412a3220089f25c1e07359d7ad55ea22bc4d1d0537968254609ba6defc69db97058e90d090f7f593b778aaa2d2d05a24ef27e263cfe1956e596d7c2ece118da4ef85fa7453c56b96cec126124f79720370e9f5ebcfe975f3b3deb7411c2836e151a8e587bb97e66f98e532829da1d032f41bce29b22eb2991247deb2711e55c0ee8fc89752dff462a84d768027e9e357cb35e19a1111c9b2e73158ef575478c818733a0f941e24346f7268a788c229d668b0c6b9573329c5c533bc74597b0e6b522bb07d09d2e44970ec6f453acb22337f24f4041f2361661ec78fedd1f2852f4df1a24c2e8eb3063f241105b8554af350fae006b342ff08665539986b4b8b884e6da6196ca21f1f3ca1f4558c01229aa0bb113dce1251213e6550108fe6600ae60822516edd96e8fbfe6fa1104f479dc0de0e25ca220645099049e2ba73c12ba759bd708f61b8f7ff920994ffa0188143ec4d3b31f29cd84a4ebd8b75442d6f04cace13590ed3c0a9f5489da4a413c99c5e44fa8ff4738f92f8f1873af7f35980e3daa6561595d79d90b327a9bbc7eb5cbc8bf04ea838af5637ac42860fb15f9e2d79a5f1166da14d1ccfcf7957b37ae78f9898f8ae4acc16733469e0fbe605cf10119ed491c9b23ac1f4f18e1854dcdf3fe1711847286a56442049d63d1fc0963438fd5b18489ee958c93a627e2aa5a655fcf52833500e8823068ed043bd3485f2564e0f0a58abdb29c306a0e9b349df5a51b192d3603d4e883d8559b04cb610d3000d6af8887d72bd68e293fb7d5ddcc5762302a7c75afbfc6be9fd035ce9b96ebcc7f9533698529c315ae623e746411fd0b5d230f40c22e7e81914ad4c34022de2ea34bb0160fd4e92ec01e39f878ed208069c0f84a555e3589f4b2ec9196d8928f09780778bd53d23f261baf4b628847281ca83e7db077723e8faf8222e6e18e587ac53e76d6cf06b2a902a8546a09fa6b3d84e9bf1aa0be082ceaa05d77655aefbed95ff7a46f0bed117b2cfbd799c1b196fb02fadd01a04f910a4d2a938b7fbe9d5e71e56d5c6b5a262d4428f35f2562edb68f153fc3a07b87b89271807b842bdff97d277abdae5fafc1f7c30484ade60b5c9bf8890e46f4d69c761a875ef1a04b548aa513bb5a6676de4eb4532fe2 +0xb77fd3d5f25b7a3c0e42c707a9bdf225a8e842582308a73526ef4768f497f47776c4ea0ac5c6d1933946b14907e58dee +23992 +0x003132645e3026f6a2b9d0644c16e5e4d1bf8b53a51f0e1b999bd45a67d193418b1dc1ba55624c4d3d078c44763f760dc68e12e194892fa343dd550bbe92fb035491fa51c76442779f3ecbd7c43bcf1b4ce837d492065361888bcd134eeae08f0394c573dbbf6e3c716677675f915ad60dd6e276c620e21f11af26bb3e60aaab3f2f0a66b9fa3a635b88773a6fc97d06ae5ffb0d595e44a38550474bb77dc120b069b1738a9d0db604aab3981b6ca272da8c6ae27248e1b58d77180be0c78db5ff4aa2e276314efb15d713cb8b0130e33764173d3a67211fd12b8142e2c87734d4dac6fba43d67fb35147f1ae8108f216defea65d9426da8f8746a3ae408e563d62203063d49bf7e0d6bdfcc5a2126f42535cca476622b17ab5abb390f0e400cae29424a68ddbe4c45e31b2a08bd5f24073fa340394dc53591e65c888a62f1f504f76c104e82cc2c84841b7c1b6ba178ba1459824b8da1ca531f356f7e8c5ee77f9567a016bf51e77257c80abab455b9e7bcd4b2d4aa299e980e2f351314f1a9c70a1d42e91db545b863081b0e1fe1af3540fe18fb2ac37809b9302470831105855e743eef23600efeb1c4f83f34ae224da7bdfce997d9214d2a2182be6125c1619a56db4f59bb0aeb47e5ea747b24dad6f9fba5c678d2620d69eb98243497a602c5aa6232472c01282f5137d57dab9e793e9f5cb9561601f17c74aecb86ce7c11e7581bbf761cba5d71f2278bc1ac38de7f9169eab80dc6a06da60cdbde320b3509474e1f6df4fe3113ae04becf8d6eacc4b91482261f7bc34468f97bc52b1a1731614379b41a954c1f6f149530b8098b13ffa5a928b4e60107a1bfd3c221735e6a8d42f6d4f847579c1ca1396b93d125764b63864734d103c03ba40c5d7cdcb3b9b392be54f4dcfa939df1d208888d1ff48597420a070271761df14e1ea41ebe28bc7cf8bc781bdc0bda4c8790fe072495958904fa9541f2322fedc08e020126be8e48cd95ebcda60cbafc808a5d05da626381f59d46582efb59e28b34fc4c9483123e6465b5baff9f2848e67e0c50e962d7c73d7e830dced98316d698fbc9af8030a5e6b73eaa90ca0977e1f475b0fa9edaa20322b22a7ad495d2ca43683e20bcd1c77a10ed65019746d29875ffecb51c525c6f133d75d9f5775e8fbca9748e3fdbea49fa2cb2f90ec7a1348812cec1e6293babd88ab7944312024c8b2833a21238577afc635b2036742cdcb6161cc7044588dcf903b752c64c062a394b42043cce56369ff8261f1735bab986739f6e7c908a2dfe0e3fbc870eb1504d7c6b5bc5872ea56954dc9eb9f394f380921f5f58f08bc47015157a8d414de64f22744fb64929eee4df4544259403b12cd96441a04fd1c9d77f0233e1cb2016c8a4268a16fe8d3a980128ba62024d1b13b135bd5a94a565b9b4ce8f899673063f6c49b1ed8da3b00c234ea87823ba5abc835b7b90a74fbfa01c41388f888dde3ce1a56f44deb379c8ab80b470e19496afb59f2249701701131f23d3fa8bb8c7476b016922d905bc54038489512321f675b1c75a8ed645509b253b0bd3863ae9e972274a8f66e0a2399122cd23d0aba395dd9bcd66c420d7bf96528521605c6ba95eddb8936d8e53febf2429eed278c597a3e521d91ff1bb07da30ecec0366751098ec5b37d655f62bf45044bb10d083046a6bfeefd00027fb599de63d56a031a5861cdd82897eb3489770c79172fd056399f60db1bf9541247b611b1b4151c5f09134e37d6e50b3de124a5979e046743c9a4ef526d4f83109a943358eacc3597921fe182e6e151e74cca7a37a42f2f818d43b5f56f8702032490dd99e7f3c16c99f40219f6f131c932d4e4c9c804ab87daf85f34a11473628c585b154a205236771c3a9d85a94d3c29d09fde78396ddf693f3580908c39a72837465b7fe66a9db014f56df18de6e89849e5e64311e8e08e84f379bc62d7598eda19dcf79a6d0aeb6acd0be903913704ad6161a7329f43d165f370932cdee2369d600a5fc0fbf67f7a1c07da9efeb005779ce123200361c85ec015a33ea2e9a61d9364070e79f8e2ef7ce224d471dc0144f2d5254ec7e2d9ebd3c96b3cd5c853c73e8a9bb7797abc276a1b76388d139e71fdce4c233f1f9c79c91c699bfa16d626cbee6c707d0471be6e243d2fb31f139b382cf651db907694fa8f1cd0625d83b8c5f017adf72e9a10f38cf84e8627273d1c81c24f4fedfed9f281f36ea0f512f9b7401be46a41abcb94c6260978f44fb4256d2e6fee70ab954ba58beb5875da660a4ef7a868e61d4abc6044e4fdeed3bced3f995859d0f373605a54cadb78608a498d296e5594651ae4dbd365977f7993ce89a18cf4876ce0cb20dc91cc553bd2ff7b2f9ac2d519b8a899600fd83ea7f563cbc57240ec8e5a068991b48d94c2dc96a988d22310b1a07239695832a4c54e278673ace1a8ce6b8d0502b7a1cfac03a998a39918efb36ecc3c6db3393a780a943a3a914924a381d913ae1f9b5e4df492b93e53f6baa5803102cbb55e7826b7346798c3d9f8b4397545f250fcd93f0c0c9b87975f19ee612b3d21d304d667d0828f0cb9268d56feec1c8e0028c8d5d651a03de7b48614ae253c0ea0deeda1e2f92114e5b16b324e97f7cf81b195c8c01c77bfa99977bea3b99fd0834f266b6b22ce3fde0d0aaca51378357a29d87e75b7728b617067230e52d9161ed8092ad579d6ec168bf44c9ee90e6e3df3f97d43dd313fb3cbfd083a7b684dc80c0e76be78eba803c0a08898833ac86192813bd6d8243af52e71c4a4addde6034dbec5829a6d024a5db7e73e7c7dd279a7f8309b42dc0bb9fa9dfef9749a8d753f92adce78eb793e9572fedd2f582aea86d7020da7c93086c2ba0d953a2ea2823412760e7ed77b750a8a2601365a1028c1a616aa716c37d0095e7704992aa3beddc6d4af26c197624f65f3570be450d8eadde4fe3a45801a5103d1c40bff2f8f8f28404d0b3a3baab68efd2b2a973b6f54f6f3755cd5b7ea1c42845ffd1c9478eaaf2f44969206a2f27d9a1a1cd35e50b279d8ac63ad3db3dd832534f713810f52c41842536956ef65aa50804d39282165eefb0fe93c800c174e3aef847453b76a1f81b2bc40cae482adc71a46293765f1bee11c57f43d575c2c2bec2fafbb05931a02024b88c116fbf05434a233ea72e872015e3a64a41a0e757ec75335f57e603c0fdd9bd1e81b240a8e6bcbd9dfecbca0f251fb1e82f8c0e2a9ed8997b186540e0190f79c9e658d64ec2c3d9b8637d0b43a7424822847f5dc43db4d556dc1d0f89dc91949526aaa87e3f261f95bf8d72430514120229c2fcac32d18ef889579941ae26b78a2af0dfc0c5af363ef8432897a55db88f069d146ae4f76d6a095b0593f7958ab1da72a29cbc24c7bbf8e755c7f1e5e1d10357cd87baee19b342717c041fa7b4111e771a9b8c4e7912a5c1205b4f7436d1093a4e8a1e7d3bdb1ee1261e8e24deb2df496e449df5f54de919b2dc29d15f96fe8cc0fb776e7beb84f22a68add4af9d032ec71f57e1e374ab3633d2e6c50328cc964a632c8780ea5bedb16ae27ed0d9746f4db523d9e98dd361cac3ee18ca9059a01548a791f3e08d1ae2ad96ece86e1853278d67a6b2a248e29f39a9925ed58ff249354f537bd501c1e6b832e4a065d9247e308c10e4baf401dbbb7ffa64ff54d30daf8c97c1d29f2ae4131c2fa0c59e287924fbdf28debe06a6d2d81a8717928d8940c6236dde4f9d0547be958f964ea941f31bdb25158e3827041cb86d243066e66f65c02602f96171db7fdd15e1d3edfd2453cc84674ce087dcb39dbe2e16a74cc4d136944585bf4f57c6d1dbad143dd6400d79ecdce046eddf0591233e2c97e2c8734d60afdbffc744fd378902f9e0f4ceb0ab067d33b282977a5c435a5a80d102b1cd3248e46903298bd8c7e86a207e56a42a7a512b6c6e8b7bc5c88d88a840fbf47db1198644288ed87c3b684f439d6150beef60b1bbd8436e9557dc9e585839a5268629aada61fb4cea9089909278761e2f0db3aee9e848bd949b5184d841462a9059803971d4f94fec6c541655381d75447d51083cc821ce8a39f3227022aaed83d1271952a90f494878cfc7d404debdc6e742a9fd9d560b3fdcca606823eb54c7962534c509c6a2c75b048c5605425f7ef28f77739270db7b2adf27076e93c923518270111ca5c231bdfb4e2562d0c131473f5ce8ccf6a5 +0x1c471b3e2b5d06a6382569b12bd43c6ba3c1c7e47ff0aafd51d896fab41a58e00b14250aa556a842161df9f649327f64 +24784 +0x2b23382c218197e4c48025da42212e39effa3e73452f40d5299de360705842d4a258c30dfe6f3f92be7e646c9ce9583494489f70ec603f20725122930510bb7f5618ed51f05d28c27682d5ab2c4bf41ab95503a52c0522fe3cbe76c8d457cba9cfcc7da10033989a75f23e40fc304912e78932b90d063299114ca6a7e713b87a93da3ca434d9d842423868d2147ea045a54cf355974bb41978637cd7452ecb192cacf203963830e365ba1b0a7a1f41db7b061021d3bcf3a6fa6bbe01f68e4caf22a866652e36e7a567e21e9038f974fbf11f4fc4c84236661ecc35cc031d8363fb38627302bc47afcf173b0b56f681cd90ff79e77ec3c4846ceea9e173c1b75e41c3acd51db3962a25c03823dafdaf7adf0f5631fe28e6266c3ae2e74e6432c77bb10d3284011d3df247de81cef5482a67b5ad4b4f5ae475a716a7879ced3ac732694d3241902411bc13f5cd39c89204ae5a47dc79400698a4ebc16966441886ed55347e5a46f3cd0e8c45ae245dd6313e67ed8d85c194b7eb22f934b451142b34dc8abeda0dd19a6d1a95cd969c5bd99f4265067ac7d5fc052115908cfc75df8f661699c6cc08a06325afd2976d6b22575577ee6039128d7952dd27f82d85c9875ba1b8286bde06771559642fb84c37f007edee40fe9392cf1c1b9effcc8a12a324f3c307d19cf532525c2b6765473ef2bf8ead2100a03490e695a0a9c1cde16c27d4616ce889941a4480d1465ca460e3e721d40b26819a431a14d3fff4965f69cd0c3a5e97ef0cb9548cfbd586abc44de66f0a06587dee701f60df084d2db3227e62f7e5c6148497e84a531bc9a493b72440f81b7edd559f5d416dcdb5d9071fa3a040095d41253a6a8081200ed6f4aa095b455181eaf9593c7f255412e380e9a28cbcd345be172c40f72dec3e8a10adfd8a9ab147e9022524e1aea74e934807e5ef144a64d381f5d477fe883f080e4868939f41b925988c7d31b1ce4f318701d290f077a3c88b1b8cc89cfbfb981703b23ffb0bbfe5e115af35d5cfff056460d339f660eae45f28d2b1b04d58825367435657174270084822b6c3b4445708aa4fb0d10f227122a40dfbe286400de9fb83a05a6b280f33ad3e7b2285086e9b6aaebe278c31b5ff15a46ed9af9a820247dbe5ad115b0a8bcd6c4e9b4832934425572ba1dd01f91c0501d23ed04e29c5d4b1ecf711c1a9372f12f5d607aa0e2b65b4bfe60c7984a1fb8befb8ef434a5b296e7ee17144345f5b9a397ac9582779b12c429f2180a0b780aa8df016632debcf7b63133bcbf22dda6ae22f9724265692277b73220093861bc6738d4c951a9e4c3e6334773d2cc733ecb89f78f652e98f0d330b19e0a63554476a389ac1589c2a2145ec2b842a55ee86837074b6f45b3047320e0d0821ecb3963a9906cf300cf08bd3e56187340094a20a4a934c54d3fd3b4025075f4cd5c119ab579ba8ea1627e4d3c4202e92efaca716d6dea0ba7a7f5225f80ecf6e150539841b5e32cee456930e3471618b4cbefd6fbb5c9a6e783df4a82e2a40d1d7075e8f8c5956239b05024cdb5a08683c520cdda21523b7f4bf8a936f6398bb4150f1925393fd3366bd985561e60b72e9f13b28331221df168e7aac65c2c0757b67585617140d446b04bdf06f1a52ee7b22f417155a7e2c08312ebcb64ea047aed4fda381e5709fd265d9e7ad00c6271a6e9f73f1f520e7ef300c8a0a10207802204641390d0c8cc4655400c29f4d64ec5ca2046eecf157f6147ee00a0e29529ed29df7e694cb52698e970457ffd0ec1c7466923546d7c64264eb845d52a11bab72698e3083933be86708ba13293808d03e53e5ed0bbc7afea8bb3face4721c508912cfc1e14e8d697810ec9f246b003143d2c43f4487bc506955d99fca829db69e007f3eb6e391164a1860a2f8531c660a49f9d3f820d4602d231add0ebbe604399a69520a3a8f156486dfc5aed7a4971b214a502f6f0a577f8cca0fb8033e63e24a54a3e63bcf8e4ec331b04ddedfeeffc3805ff15ba65de4f8b0dcce44effb227807d951ce98aa91381e0add5216903d9563a747ceef99e6cf95ed5a653ff3808a4b9d54db3490b44c6e7b671a91a85d01bad138b02e340c7a41e9634e777485e9e897f64ae96a3f66e8adf11e985ce86e4f84cde7ac56de5f7c79f2e7dea5b7fda66e3f03005dbbf05645864673d46544e8690d5cae25e5e70e450e18beafa12e4dca37eec093af517eee2b7a69395cea4e2700f77fcca87abef4bfc95db9c8e5a455e7f47334a3f1284eeaa2c3b355ca4967aea16671b081552f0de205ecb68874b456fb5f671f381e0dcaa6ca69d94ba0d12040aa3d83629c9d014bfc70f28185928cecce55ac8e27d4d46ec3846fd51d0c5dbd9457ab8758e7a2ec8a6c04369f9592b00626d15b0a4b0ee2f92ba0d086c16d016ce7b05654b4f9adf90875118a656f2d50011707901982ebb387f3a4a49759f37a17183957ad0c778f6ecb780dab2b4df30e05fa81e6386f38c0f0ba3f37287a050d6d97287ae53096c391d5f20fcff73977239ca55c3657d1fd1f781f48e28057f136d890c28cc254324c8fff3862136861f956c321868cc66609470b7390ecb6ecfc63572d071312e0860efdcfec88c9f6108ea5dd30f55f253590cc6038a66b2646a24565600d17f8c6bab37b7640a45eefad11393a79e45f2bb92ab6e595bdc69cfc210f9f97ada095fbebe5062241c11e1cd0dcae029c3f742ced1e9ca3f6f486d9b5d6ca981a007a396bb5a716e7462642aa709377d0ea974fdd3f67b75dda8da1c75febfaa742fddcfc925e04df158e86669af2bfc88b1c8cc2c24db9399d38bd205509a49c8ba64c662435d47257de52ce04d2c4cc488c4a634e5792d3681093885e2d7e4106fef17114336ee5349f0da8563b6d24496ef0898c8b2873619c8cc7225e70ddd88c34e50a60bb83d3581ebd3736a217b74ae8fc23f36460b06410a44ba462ba2cd87b89adc5a1935d91efd550c94beebaa99984bc972ee47ef088e87e073c1e286b2f26a669095cf9d2e7b849ff51f279116be9ff7d6f45f3c95a5b6590e652f4ccb9849c55dc27d0a46e2dc9dd9a681d0dc6f293af0dcc3676f0c5a846489eb9837f6b388f003c0a8eecfd786d0f9bcd2212692135f2c1707fb1eeef324b499f19eba322215fe3ce19c9f000b698d2b2dab7145015046cc86d049ee15ad59dcd1564f30112e06444cb6ece06c01e54f4bc1dbbc9592d1467c6539c26c8cfe06cff51257e6b6a06952f415f3594876aba50ad2834095403741505b16784225ba3601cff4033e713e9caab6b3239bd5c2c1fcd22382b617f18df82a54c94b4569bbf2c4af0723ed1672615b9a8b7a67274b0e6707dc93bd17bae31407c026f197ba4e9cd3531578938cae5123d172cf4b78b61dbaceacc41c4097c49a0d63aeb6c97bb52b8771a82833e853e996036292039a42b6d97fb161c79ca8a5f16fc1696210a9f204c6f06710b5b05659aab5ad441192867d7b09aaa8584c962cc9fe020c93e7e16b83e5b2ab8d12f49cd75cffe2b279943b2d31397b510cf50ff0a923318bfb442c46fcad5cd4d83ec027bd0c4803548a8304dca0a91d764d2b82573f695f60c4b77ea9b9bd239caf741a5a54ec7adfb3f5a04072ca2414f90fed8cd92c8494ddada9716a350fccc1190db95c588f67bb037e112246fb75a31d90be62e39213e96f35e8316cffe51e3f905e9514c7890a2cfcc321b809f4b5e51a608f371e7a928cc28291bd5a72115830bea19999b01bd2baeb0395e62ebbe6f917909f70154376ddb51dbec5f034e36d5dd46fac798aa526dd4a5906902fa3ab5819753d9076cdc61437d9b8ec1361b4c0dfff4641b114cf3e6889e1b58b9bbf86ac50ed58c6f23a0472a6b9c21763956c16d11da539922262e0911dfb4a4f8437abdaf5faae74a82a50ae2f1ecb699dc40b8d89108ebdbf0f451701fe062fb7ffba4bede287c57eea4448af5e99d41c7d307d1f202af7f387f874342a29ccc9233a5c3bacfd754cb8d01eb11e2d43bfdc2828563088c17e618d413b0c3fa71666be5475a67a04803a8688bab9d038f6855537b4de42aaae1076066d00b23f4e1ea8fd228b87e3c7d3da2f42de4d143efd49f3b195c3240139452c70c41c05cedfac9ea8b891a372194d6aefd7de6617986914e2d394ce16307d3bbcb2f78b271e1bb19eba31c41d7f52d3f8530ebf0f0b44e3bf3421f96b9a70acc769bf4fd54e88fe6b1cf2b6287a7cf312bc788f93ba6018ad1415466fdbd2081734edc4580576ad943d3efa319f3e30c5908648342a4d0c431fc925a17913c622b10d793dc76767b0a77120b7521915676bd2896edf6e3707a +0x4d241b96609427aff41b2d90417050e2201b9ff5d7cb32852ba2f51178f7d4f6091c89a004c1a11a90f65d24324e1772 +25576 +0x79cb0302813f43ae79a950e0167832923a97743075e4cca8cde4fec1bab5fdad754453e172c0c4242b4e2ee620feb4d41cfd1ba9b90d74472633fc0628af404c5f31855ecb4a66758f21bf15f467ca9ab08d88146934635475e51147e402bb83c0fc5f2093c773c92a8bcb12999dbc0c7fad82188b41dff83f62052cf494b67b1f0caad0d21e314786f519881786d25410c6d05d291b315b0e11a05c624f795b04c92d159137e9182ac5721d770c5497eb413b8c4aaca1a4695ca980361a4b4cf79bb298d7fae2639e659e79c016890099848b4df7db76fcd9aaea3f76dc767681eaff00ac4f66516b3b6545fa8bbab4a1f988473790fa8ae56429422c7f4000291edef6181ebb0a18b18f292d552fde8b07f92312b3737715f02f305feaf213789f1422244f2ab52d2de3cc625b30a4e015a888902d2aeaf1b7c4b21805d3d6f5d66c2bd7cafb7b32192ad7a185052e278d5b1fbae4670c0221af705eb82d722829adba3a777683b0dc2cf1f0bbf5a5e8d6db9097c17204cf97ba1139eb460e99019e76533ee3f62fdeb1c359e54931ac58f0822fac92fbe07fab3eb18668d3d1c709082c0889fb358781f5e3eb4af9f97b619d8b8e1019be424b9ecf71d9e957e1b417cdbbb1bb4c3f632e96b53d265aa7f88ab24d3485f04962da9a95e177b3b9674c3c41a35dfb6e21167b2c6ddf54447bf1acd34668fefbb8991bd8caa56eb5ec4f8380a70acb7c81569936214d71bab37982068ee971bf14845823da9d0f3f0ac7aa6205ea42d14c96f9bca098387168cb3bd05431d0ff40425b5f5b841ebe885cb7ce0424ead5497da1a733e731d2628fdf18df67a322027c2c729385239a2fb7b4abede14bf142b49bdd2262e543686c77c678b4739023dad146cbc5a73ac780a8e30848eb8bfde3ef48b533db2d440a0ac16740c6b06b0354c14a6f3208185e9c5d9d82540d44b1a3cf347f9bf9bc12a0f3f43227eca1a0bccd5aa94a6be9fa9701f4b60eddddc6c159e671ae0d992c414367b31bab8f581251419b79cb03fca1b7550d9f6590cb50d0142e9bd3a2fff69907ea2c56fbd45d34486f46912f0bc26707af910b2768591b06e1eab1a134c6dd1d00e153aebca560b74a392333cf03f953c36c396844e32204b024115c72baf7f11cc20b70b7f3bcd656dbead7f26b558171b6561d08f6cd56c3d05a9d62d9d0cb6758e6086d4e30ecbbb34ee5190364d9e3f9ca0c5b9a04434376f42aac2b4ef3092a4d4087bea443a14ab823eed20ca23ebcfcfee6d8af14589f47cbf7b85ab029c1a6dead4b00212f268e5b19e03626ad8856ba51b7b61229d2bb4aeb89dd4cefa35aab86fe2ccf8dd139534235cbab56e43f0a43400182df97b86e31a5bd0d845ad26fbbde1195e4d322d410dab17a61581fb4647a78afa176a6fe7114e43c106e75f2f3f395ba5cb2b0a52bd6d2dbf76c5f815d6d04e098f8edc352df3820ba65aafbd746a1881cf84a903c31141540a96539d6218b5ceca4f5857d0da303abc9db540fde1e454d2c5a5bebf3617263969aa4769ff66cc402260b9aa60c2b0b216fc342c4f23a16d747cfdf25a03888bc6689e6ee2e58489be91f50b35ae101f6ce1118fe07afa08079b4c1cfb9b0d9a132b2ce161a68a2f6a487473a776db5cf60063b9643ec12af58d238f793227bcf64e5d420a1e4f79cc10c28464a1750348c695093903895ed4cf0eda718d699ce66eba313ad137213a6769bdcbb27faadbd0402fed5dd51c0bdd887e62f1359249e8ce1f7253e38e5bd8d4706b2e4dac3589df6defa216db31350afbdc023e35b768f37d4f0ad74996c19d5cb179819fdc6fdd73be64d124bb6210d32b44c60fb54be4cb3f8a84cb81de1ec34d289dee46fec4b1e83a867120e134850f1d7f88aa2dfc99b2477e8c937ae3547ccff52febb31fa8eb87c958f84ed091c600cd292c7bb55955c6171542248580eeb449dd613968e936d0fc34a7e79f7a0e932179a2b1a99a888af0fe24577fc91189fe6f1dde1ac358aab1acc657dbbe37592ee2b36c43cdc91aae9fa0a03c9d73c5755d982dbfe7df896c29ca2c2fcedea7580cc5080e7395d972824d8b369e83db514156b4c2c729d18e2429b1063c73221f505e11742c8d5c1f3e8185081cc0501482dfffcde1c627ba247ba2e987833df745e5152f490e16f73cf30a2bc8b7a831ca9a5b2bb842f052b3266e64208d7f6256008f7a6996ae8d0608971bf2e8682b612c7386bb1ed00a58b06fe098004b031926fceffec567531248b8535bd10483ef0cc5497ab82b238db043f97e7a453c07ceca1a8908f5ebea19ea6c43eff1bddc91ccfe77bd8640aa8c77191459e28f9a7e836488dfbeba1612b9b14bb3d44ba271f700228d65d467db75ca2a2da77059acc5688ec8464ffec982dce3bb10aff913d0191ba63e712df3cc7700740880cddfec910b4111003c84f249ac743b7d190de483b3a69489658be7ca37bb8a235f9e85787ed8938d27fb6481f66db925aab6a0fa9afcfc9fc6fa541e4072a0ea875f0c896a0d62497993760062061e2c26a491c82217db269ad59dfdbb27e158ed980e3e4d4df1c789c3936f6fdbdf03155e3376f995a4b0798421e2f849cfd0faeff711a918c689d1224909806d804cef5a02a181d50dbfebac9c588856c0e527bd53adfdfc54f2f825f3794429865c1d1e9bc24b846ac769b549e90bed79280c86906dcc7721a567554f391bae65d337124b43c6f250496c14d6fec36c3cfc01e259db8507b1239726a8b3774ab324c5ebbdb074cd32c86b61a0147f51a0e3b0370c71c83c87c010109c9307acd2d331f14f92e56396c6f02251c4704c2971802b24bb06642a3d5aa997321d43696113c99d658953f0b792bd487946aa5b280a054f21b04cfcedef68252b588ccb50d3eb0392e12ce53cbbb910cd72fa9a79b67bc8406625844446c2d2e92a079d150acc3eb57d4cc8a8e3ac371b85cb8bd90de53c9188ac64e2e9500cf60232334010e39b57ce323f9e92ed17fdef8b93e888d8188fa83ff34c4f764fcc81ab42449ed7a5d4548b9e8052125fef20b9370aafdaf8b5355ed3e301cc27f718c13ea50cfeeab590a789f099a26b69b9e309c1fb54398cc0977b4978c801e058128ce3d3ffd69613146651e223c6f82b777090e3da7780da584dd24cd08a22902db1738c20f5d04c60d846c40cff04f615001a01e41f3bd34fe02fc69c0d28715140f6be28c50ebd0b4421a7c4702a9a1a3cafddf7bd084bbcc6b4ae81278c7c5bbfcfc26dc0bbe5723e8515e0d6d388158ad4c08bcd90c44d66034d0655a9117b82713166753246442bd386f87f9a50858f2b6226bd4fad60429e2ab20428b15f3d8d93b95f3c5fdf90bf8361e6d983e89e162b4f28af97a3e0d7d00adf660c65557751ccfb14a2d3018b83b3a93b82cd4c27846b8c3af376c552d58733eb632c4eb10427b575bf9cf2ea1074431aed921dc22602546c415764a193adae4366229ddd23303ab9f6bbe93db21a210214e5978868ba1dde11c44316a2e4aae875d6d75e279cd76bf8ae58f8d11bef8ba9162decc4e944eae55be5547bc2b66512b76fb699c437f625e2c6cdf60ffb121ac26561d326662d2c7cdfdd96de5d23ed52eb78e22cb9031f07c70fa95cc02fda68c28a1be7fe1f67a577048c8e0bbf4627cf17a95cf6fd447bbe506388fb4f7887b9b7f7a4893c17745f7bb5685e81bda47f0547cb6e5f26bd3112ad2af8fb659ddf8e0ee2740dcc580da5a9d3a235c4679fd4560e8ba3365aa3d8fea945be3219987eba385afee6cef614e2768325fadf96075c8cdb6413c2ab05d08a6e025e99790c920cba9a07579d4bf7c78decb17af610b3ccda1c1f83ab4bbb44de625b8bf5ba1ed5ff69ae7087ad422d0ef488c8348304450425ea2c18fd177f1348a96f9309c93ab5e83ca839cb6a3da2d80155d5c0b69be62be41a98ac8d8fa93fd8b2d56e29915a90327d1828d87fd6018b925e6c5327fc989ddd9edc860d0cb26a043169a87079ec405dc748054a04fbb81c32e8528fb3f687f3900f895dba4acdc23b8ece6e8066b6c8bbab7942dc30f731f7c74d19a8c022db10b810183e63848b584013c20a9a364c69b5bce0b84bc9a2218bab8c57701f129558b2c315871eae2c10114174f12f67560948ba25a6bfbb2497e62e2ca0ad389273d9d4bc300cc90b914f334c06029815289525a0dc4a0b859e8595b4bc8dab9c9bfdc3bef8cf6a8b26063e1c33606d0b663ab9b646e901d8e212496c3e00ea1833a7167a4be6e13f510eb86223c934bd7491ecd2812d3c731514bfdf9fd772a9dd6e539aa3e3eb7ca4a1489a319dadafc643458215772a0899f56f6b7c51e3a5ebabe17c8b36e7e783664530f75e3666cdc74a417e6748fe034ceebc3e00aba0f0f876bc8c5044f49fe654c2dfab4d570d86719d266e17b7c383b43e6f74393f8fcc59c701d0a1183c79fdcc74e5711508093201980c14ea6d22366e8b2d2 +0x1405434caf2b81a133c800119e1016be5f57ea1baf92d681cccef9d27e1a954a2df60748a19243ade40d0b99554dbd81 +26368 +0xcf2aa6385f84bbcf589e9beb147d02e5d56de17fa8505dd38f371b89de2fbb4de65ea280d14efd2ecd8802416d6579f44b217c8af3317b3ffcd6837f78f3bf568f1c3f2866eff8a246a70cf0faee4c3078f3fb27c4bdd53312bf50812bac2280118c0396e610b4110a22406084c18283a30ce7c0e49c769817170df9be02edb5b6d7783319583a65622227f9d28523d41393c8bc1c77635454093f4efa9f27dcc4252667c670918496cf4724aee3380a11b1248332f6a55111ba70e8a728d8dd849d949bb7ffc158ee502b47de83c80fe58e857deec045759655272f8d4808a03e684a35b2aed3c7b1ce58cc2b0cdbcad75172121a7e4baa2a00ed8b73a5c00c3aadd09f8025cebb297058195d2779232f2374aa7cd7bdd716e3496422e7070bbf95af3fe90bba1b9c5fb1983c7bab02342b12adde74a5e4a328c32263b7e68516486e7fb408a0cf53c2eeaf8fb1784f2f92d48306fc0ab816f4e32dfcbd646088ed95c6abc687be96c294c82070e9f2687f4294bc18f53dba7232edb5a089855badac7b94ea77d2ad872d4ab56105d4271be548ca706d5ad6c737cb58085ddcd7af3c08381f78f2df38419d172bd4dbb48d4408f7ab7af7b11e7a2dab9fe94d461cccd45f0b930675fe56290e775ef056fee73a0a7224fd949d847c780a34c1ee1be547d056cff7b700f65562edacfc57965748cc6c7452c76cdc2185f4461e19d50ec955a935abed67a88bda34c5e5fd7c1b98054271df92b40a829a03284e0d71cfc2b4accb0b5f5af5333ff5b19591d9bb947c9b248c3d9d970981dfe1371218b09ab6069bff550263b359d779f25ad4c0a2fb2093420f4e0a1d013179c372f23ab9235fad7016867c74f08324e6a296b12c4879c8e751f0eb25e1a1f9d97326f488c3610744eb0fc8decca0ba58af4716992c4dcb644caac38bead668605fdd676d5eb2b3651cc5ce5ab4d7442fcb0d78516f44a2a245a519b6e479ce427c3e19d1bbfab9b9f1cf164e72d0c8553c135dbcd90757888708750e973134661372941da3e21f2ab1562823cc3251b14a7f5042323ef2fd59fc5ffbcaa7a1b46ba060b7de11ef9fa6818d428ba6e42b3f7ad64b419179eb02a960e547831d14cef10309343131ff1679cc1177d38bab612b793fcfa6f639cb36ff34d46cb06e828d07796de7eb344a656dfa57624d19fabbc086a42870cffcccc5503a0a63aad09bf47150dd27258a6ef864f4fa335d5051338888bdf095dd9239a240063db000435058a6bbecba1ebcf6b717444360ab165bad430d7d73b5b1e390b00846685aafa596372843db4d76ef5a86e787085532bf5e9cc11f51ce504b8351b787bb26047a93cbcd327060c569b70a8c073e95cce8015d81de176e98fae4eabc078fab6d58b62a52c4619fd0ee356adbcaebb20c5c004cf4c3addeb1771944becfce3210c6691b5efe9652c0053c707bd8f5f51ba5c132c3d5fb66c24a8c2766e55e03154c146899eaf8c1bc3734e2153946a6214baed6961de94df3fca35a5c532966a5721dd7ad8f6d34ed0a858950f6c40d45d42d0213a160dd6e14c8a7472115a3e8c1ed313ff5def27a08982dd5155971b0caa87ce56b465c581a62d4d0550c0105c0ec3dfa2534448cb9d3964ba1ec1c8ab4860db2838513dc96d9aa9ef9f5c924f882c5832655724ba49f8b5b9f6454fa1b2f7d23ef034a1f1194f15a14b7446fef188f85002bc4de5165d5ad19ab6228860b94dfb9aa494c13fd71abaf3cb70c2f1465a6bc9d816e488b3ce816a88e3d7d821a8fe9605789227bf13ad16b6d2340e00d8e6192f322127b88b59f431f6188fcd6da850fbdfec8763bae822caddda8e24fe6f7f46023369b81bbbb645fbb30e19169979ec4d58c5615b0ca67be61f184f55687aa11983c55efa372f39474fc9913e326f5b133f68448e8b204e9d8a22dc585179c4eaaad109914ccd807b3758c24f13bfccf428f669cfd41ec766a4444891cb2b25f810f3348b7d2fb00a121228c3bdd9b652ade65d8988005ad3e5e3307c25dd48b44ed28c4348b45c6668ac4126814baba136ceac6607538d57d7861082022ea1b1ccc56d532009ca32938d88020e8411724bf5b2cfe2a6e384e1b3653de08dc57303625435937eadd12b2c89c0d6218c4856121d319a78d1cdacd1ab2a3179287a9b2fdd5523a15bd4b80fa2fd58927095fdaa5835af27eca491975eb1758f4f3aec94654c511068bf92ad8002066572edab04e0368152a8ac284afc7e3d2ebe36801688959c2a68f4738c8d997ff8e7a1d6d831ded1878a46d98300eaf8e5d9efee5cb39b757dc115b333480e15eb5365198ae978e014f5f73dc61882292346d99fad82f87d78f585da383bea78bb5ab9dba363af5da9904fcd8a8fce5e8569861caf532704ba9ad760e1d5b918c741e2a5a83cecaab3ddb2f156e34a098ad677ddc8b091aba1158cdfe6a1f466bdcda1f00fd1bb47a232c351a1cf6faa81f2116b8037d2e2cafa18cfad2d26f30d426a5350ce85c51333f366f180b9b22961053e7c35654aa6bcfd88bbd3bb3e14349e47f18ff6a37555b599dcc3b2c0df97a5df0355c333a2d2cdc379323bb88138c03698926853571cac62b9e4d557230a85b5bc05674e7ddfebd89bc522f2c2b372b78c72655516fd2a6a1f80bbd5822e276b1cb0ebeb6638ea606a090b6d6739283363ac7839537bc2188413b0dc7b970d678c04abab1a724bd38a7a5f88dd3e4342a4ad0b709b1d05e67e1a6ecc8dc99a23b06d310df92082aa63a589e59337765dc600b98b4c65586c64014036173a6037f057167480a8116d8bf7250427b913fd5e23ecf9e5c95c02dc64dfa9c67df20ce25eb67f5f8d8a957a0bcb551937bea9c3a3204cf5cd63525db1878819e8c22afce0bb9ed45560aaa43fb768d637d8db9ceafde50af610c35e73e251701f530ab68970538d740625912fa3affd4de50b5087d05283b7e6ee65288aa66786273495b58f2df98e1d8ed7380aaadcce85c174f63225fea7483bf84bbaf76ec1a12110f1629e96f8095edd0546ea134e1d9670a2addfea38d7248e5a2db504366368bed99525e4364c0e1903f2de3f512ef2ea39add0b4d0f6409de04d7fb678e07405ba81447fed682511b098f79f5c3c4f2817bcb91d243808bd5a84a7f3edaacb7c20d17ab871e03c6d97a3e6d1e3c833e0c954e951971ef553357dde5b2914e788b8e0492c6846ac83259dfc757c45297acb00f210ae1d8ef61d93834aafd140c1cf48304a350e0dd8e701d8d87a45987c993b53c8dda64e2c5f602740d6427fadf063b0a06c98c8f55859dc99825c295cb07e9ef8aa6bbb5c976e4adc50faeca3a8ed5abd7389765ef610a82718db24a1ad45341e98b04f0d42085e8b946d2059752f8f0fee528e7c4cc0ac1fa24532c1ec29a3a92d2681c4dbd8e2dd151bb325d1c4ddf6318689e3c8e458d1b34cdc5409867e26ec20ec09e15a682f57790d9f4b27c83ef197e11c06e65eebc03489de620614263a51e642ef076f10d017a82c4dc2ce1882f93c9b6350fecc5daeb3a7a2031615ac1c2906516a5810137a0b63564050317a4cf4c88abed901e01de2662617e473c6020cdab4fdc3ab9612bfcaf11b1f085be59249c98a7e1b0c04ae908abf1fdefc860a26862c3251ec742dd9aaad5b0b8c65ad85cc4e5e7615f5709d2c6328a5d41ab980418014916b10ee05ef81c4c9a03f9f12ff74eab1a252c102a79e8f66c152936e7393faf8a66b68d63c32bcb12bf5ff67cf88a34c45cf286778dbb4a068a01047a8d245d632f636c11d2ad350740b36fad90428b454ad0f120cb558d12ea5c8a23db595d87543d06d1ef489263d01ee529871eb68737efdb8ff85bc7787b61514bed85b7e01d6be209e0a4eb0db5c8df58a5c5bf706d76cb2bdf7800208639e05b89517155d11688236e6a47ed37d8e5a2b1e0adea338e4a5c475241f2520bbfb9786595cdba6581856142afeba0777f6f751689dcd05fdf8af79191d6290077cf81682a321e81549981d32aef36cc3627b7105a2d8d10121db8def9b451408f046e03396b469189c596c6c0e143009132407528c7b2ca6b7d52e1807413f28fbf06ddc9607abea97367c279a90d3a19f8d8eefc9187b473138d412efeb73eff6a109fe2f902303b0abd705e2fdda354e24623dd7353f7b14531a60b3a854d686c55f08c1e250ec7f26078765cfa63cc5654bbd35560baad7c05ba2010c547522d9d79d0b72c80d5921881ca16aea109bdc85fe61ff426f021d2227469be544315afe1b5ac5fb0ee54ad3360463f8591806bb61fb95863019a60890f2bb99ac58c55d144e506c3999fe63842d5f638ee050569850cd49868517795fa40fe445ffa55f1844a69e45fdc8c3578a91be2a8b65e1f20feafedaeacdfee3c8ed5789ac778e87dc4d039c77167d508acf6aa45fa3d81f978338b5a155f3dddff865efc5b865f373982ea59c73fbdfcc4ceb94f386c361763a69af4f3c12ae67a58200f1e47fdbb93c8209d46dc985bdbed374edab1e783a5514105aecb5c5ee695e35b79836b10b8ea031c56060c2ed8994bc847d53c43287ca914ae467c4d2d83d267d201503e9230ba5d6084c17ca31b1d47e7a0dc61d26ffaa95af931bc36 +0x399a7a212c1e8e51e644df1339d2e02006c1dd8e51a0c854217532c69692bec120dff30d21869fe26a4f4a0d86ebae3f +27160 +0xe881e908d46879ce673e7e64f8d90cdf5497953a9ee75df95a0b2f0dc41c4ff8664eaf31e97565ca2cc85d5093e54bf3a216e4e6cad34e098288d5c69a98df38cca12293950214c0439aa3474ed32772ebdf95b0df42f537919116ed647980894302aaf57e156df7d43db911d1aa87a65a7b0e5d863d3acbafae5a4cc9c71931f3faaf214cb958b908370576c37252d51471b9b866ca050c036809a9728b9179031099dda8f3bd4c0612f13ecc3472484449fd8828f43e43b6468bcd06cdd2a99ccdd0f23acd84f9f755e43095f7ce47108c419473c0cdb8efd148802e93c309e5b8bc28a94e960803894615c6c34e19a0c1efa5f0389ab3d78fa98992e74ce10759c6469d7ed9c151357eb507a0da081d706e8346638e7c960a14b2d9d0557829385416c066366c0ae1f6d8fe975a5aaf2226f61e498f5a53caf2c1ac57c61774ded05eb70d95505516154656afb6587d5d7fc620f386973755ac7fb282870610d2a0e72d7cdfb65b5a43c6b5f1d64ab0ace1baf3685c796935a8b4945b818d249c2e79c8b9fae64438e822c463a3786f94b49c40b0f74911f25028f9ea9af4d8c5e0dc30ced02837356c202a0f0329e39f6032aed4414e59120ba28a36bb8255d420d70ec248c45cdb38898ffddfa734544d45e6db21d2671f40ecef47cd80c35155330a9e4901dcb1b2249d342038893be39c8fcd7e1b63a159cccf25b6364ac4e6b8cb69bd29df3f43bbfabcac250add8b0152b34272761ebd0bd2d960ec10b63d2efa2b8b828c0e53144e9d6db6e1c1ab3ad794541fc820d471a16ab1ea40afc15d3eed9b550ca54bf942df4a323370ad10c5789c6a802e06c5e4e093770035da0d40b6d5e9878c91307d8b2ae32b70f74bc567029bc6d1bbd14243eddd78d2f005a88e2188244c8f81a8a9f70fee4bf3b37e6a6ef9c48f5b5b649ca662d20d6b0e1d7d67780b6cacb66b3f98ffa788070f9988c8cd9ff34e2cf2f2a84f336eb4f0478c8f0265744f956d57f5fb7cb09d29bdcaf85f8282fc0c934edaecc57e3173cfc2816e5aede2e857f8f64a954a1cc79336e6f793c6cec2efb72480b0c44b5e5d282504115ecc75d02b83361bdeecb2c2d77bddfa462a18af356e551cc96a7b98c4630cb34f750581f7840536f575b2f3b29d58e08a79d47bd0a0b13013f79029a024cd6748455f1264e1000d161e8fced135b26d1b24bffa91a3dd142c5866b7c44e9056d2a44d2a7a826fc9c95110fa3b2c31c88091a1d57f5d21f19cf7c5eb36cb9da774fa9571424f9a919676fe20f8681e1a412a42b4a3b7c4efe93b756d00813c83b7af0091c331c88e06f321e711d3c18ae756693d039910359d8b3de42a5ab512222b562f050e43e8a03141f88d546141f97ce01ba9ec4bec3f51e6f9ba3d4f7b3dd65ff611d051c6ec9826fa74d24766ff066df49d96be3b58f43953ba1153e79019e28bee5d3b5073919796ce37bc22815bd971e581b14b6fdcfb9b31c0097da45aa999a49f49b0bc825e74a46a069d08e3eb398b936b430c71f7782831b96600027ac63c7cc20b50d4413bfd536dfe1b066df597b6364cb81af493a64cabc92c7a1ebabddef08cb5f00994e2da3b6e432c254c0fd1588ef942b993b3f927cfb1295d1e2fac1958753c7e265ae7b61407bddde7fdcc1a305a4e0f21572074a01676fe9a9bce869a1822679a6d622819ef215b6d688fc45b60a7bee59ba9db63e3cbcbd5082b7f7824098d972333d7a483c0688759019e3695b58e86867ca441a18f8a787ead4b1a2359b9c685420cde4c03cbddd70cf0ea80e047ad21821761d729042a053b34a99c79b1ce9a770eeed1504e16ea97019ea991b00173a17bec0d030194a6bd804d18d33d596bbb27fd9a10b7da9a8b1a7b992e922b84c21a09cb84495e681c782d1ece270cfef49d3330accfd3f0ce83a9d721b5d25cce3ae19a14a32f543e647236d236915d0cb9b71a8a5ea7f349844febd0e19f04ab249b011bd8af700c8c43e847319090e9c3b2e0142cfeace465955ea5de39834320608901b187c66e37c9bd96e1b09d75034b0bb1008121886da4b706734ae17c7558b82ff35f5e4daf2c3c250e9a8e96c0ab22c8a3d75c1be5a47e5d6a7726406daa190b69de3e8f3a93ee5d7ff66b3644f9adc3dea9658615bd3c11896a5b764e7f31fedaad701e212659a6fe6b3a3cd55e3509779f42b24515778a99cb880661fe8a710d74fce0ac0f076951a10590bc0241023660fd86bdd7ba306141b3d7ee50abcacbdae8bf2273800c4141d31a410c5916e5959ee9c4298a6bab75e6d33d9c1c73dc873ea2cd7d4af996f3adc2aba505ad4ae52bc5a43371a33d0f28e1950b66d208240670f352ef96185e9a7044f4ce2f2ff9ae01a31ef640e0b682e940c5105117594613dd1df74d8f2ba20c52223b045a782e850a12a2aa5c12fad484f1a256d0cd0872d304e885c201cd7e1e56d594930bb4392136fb4979cc9b88aab7a44bfc2953751c2f4ca57a8924aef0b92248a45a47052fb38b86ff8c6aeef9409f976314300402c7aa177f6bae841073ac86540cefd17eb1dac7b5f971eebbb41ba2cd37a507cbf48b42994e73e9c5abfbb76acab48554576e7564bcb771363b9ed40239bd66c0dd768e90da7cc358899544af3b9f09facdd1f9d47d445db4fbb295c9c47d0929abf3632bb8d0fc11360493eb08b745b83c8bb9cde3219c7b1fde4dec7defd94e858a293390777a38dad00ee5d80521d5cc221f17965514d3cdab64310e1abc7694c44871097a27159c7f1c67548f869ba42092793fe8af062d9f42611f069beb002828aacce0e9f0a59b2437245f5a50ed0d79bd86e3535b69444f4457bc5ff3f03f32a981b1aa101dac901eef7d873dce6f3ea9124dea19a622f4a15f43eed78c8fcc35cff651be2b38c7e45deff3aa70d048068c2e5b890fbf9741dea332dffea25f155eb6c642f7c9315117bf88defab7ff9b9b8e8ef3c9a5a2ed7de512526b005412d7f9f1e4aae6362dc5f52c2395adcb32e8766b9fff5c7b6be410757afe2f11f4e2c7baec6c183e3f0f97c9bf693914911aeddad4d76a8c83ba2c459ddcb90083262909a164e5b1509baf46fb9de34281dafcc3db79593bffa8426904302688864c26c64cbbd8f72814448b1f5a33bdcad0aa0efc0eb1f2a65558c9f720fc10c7fbc7d9359876788f205f8073c7b2ee34a3ffa37fbef8183f6a794dbdd4c5020cdc132aa424499d4d67070d3f0de73b87fc036aacb0b814938eaadda07508c51e9712a1e187d8cc2992441aca535a0d8a82bf4ccb0d78506a6af561e62b4ec1c5d3cc2733e8ab6eed491e8f5dc294cd06de3a2f23fcc1338ba561c1d81d1e5ec8384aa2e46f4bec5f339e5440821ce1c4b77cfdfda61a25c0e8f6e5be740004f16f93fc3a463fac48f9cb51bbba7ab389b68e9ca1330b8ecfdbbdb5e0577c1b0620af1b7e920f186f43ae6f169237a9208377f657ca1cd78125bd1a85ef1b0bd0f3a7e9f77e44979eb84d949833da2d50c53ff16793d6669e6ffffaf764643c178e824cef2f65909b00b2a98ac5eba6e024ef7718b7c0a4ee60893f7cdde017a39c482eacd0fa6d2fc4e597346ff37c994a8e6fb45e63f938a165cf5d8215023bc3017677878b9522acec44de5a791643dc24c081af45ce46d99b94e27c8d66a9abb60c987ca1703c5fd19ad0ae05dea685ba54c8d3f089deb1317452f3d0acb3fd6fd857d9c36645869c8051921f3b89eb5612d0f2ec94c9d13159f70e643a226132c1fcc37adf04c853ddab2e5095b5b603e2e332bf55cfe0a22a17f6d37abd7e09b2ce644d4342ce009b24ab1f55f38fc6ac47bef336b7878dcffbd3a5d24efdfb9016e4c4fac73faaa1053115e1091ea95845bc109d4b6df92febcc60ac9b8510441d6b676c5bc45ad796e7b8a2bf0ab3cf25559cf4513bee342e098e6f6ebf51b62820bf02c60517251ef69300dffbecf72fb021a2929875c50eb3b6838d53c5ce822b5322cfa9e973e7862b642f9b5db9abf6260fd62d94cad1f26150c0e8757572b5ab354059d8a937be0a34798f0dfee04e34a3e5a1552cc0ed163ed12667913fe650a4dfbcedaf57c6b7da838204ac17e1d2c6869dc0d123cd5db586b7a50b32e5c9d6757b2f6d8fc7babc161a4bac98d688e083c9dca242b9be1da94037cc93db9e32c93da7cc26e99c44f9ffe9e7ab56de59a2ccb18764dac2de006c23bbaaef5822a5ab5bb26653e4d8f6dae64498895d99ac4f4769d358f06054e073bfbe4a7e0ccf6c5508952e1ae2d3534baaa6968c0868f9a72ed55ad10b6c472fc21813985a10299db7fca1c6c959111f031ea6f30fa073d8c0b308eb4812475dab01732f73308a39a6e3d571f550bd6a3648e01b141a64e205b58bc97d0c880762bf92cabff73633bc91f1a2ce80fe352b6c6d8b819f75cee7220bf01423b334ce9a97f1a62dd693e3501ee2bcb07d87cad274cbbcf74ea34d44afea731f70edd9dcaa2c9099115f026684b827aae268fbc21e642fea96691e61a03d04c866396acbf504e50490a1001c4aac7734d4e0a68393dd4040f52844c206742de63e206ab19d000d36fb60c7ba99461417fbf8b35efabe59c015e9a6af08145840a0aabfd4cda971f7f9a53e88980f661b00b70a9b7b90e1349bb32c6fcea7ec9f32e0527dab85770f32774dce708ed6078b26938240da4062328fbe4c81b551cb9fc90bf35f1e88454fdedcd3484bcaa5434b375a6e24dd128084448c49c4ee8c8d6dd28012fc0d62f8e2d3e049cfab +0x4f20b8ac2926e6feadb98e36c9eaa74b368ffdb545a83323dc0cb862378175e2adf6df26ae3bb1c23cafab91b6f9c198 +27952 +0x58f70bab24e0a6137e5cd3eb18656f2b5ccddc3f538a0000c65190e4a3668e71a1b210f82716447f6bffb1ffd73abfd0b00a7a61f978932c95eba7e9adf8c402517b2a4862e74ee4afda25905ef59e078eea71b93ad617c460d2192063c48e19af7cdf039bfcce299316b706763d15b83d9547b1de4c95b06f2d6eef8f72f39e02daba919bfccb365fdbefc9e7ba2bcb063287b0ac8113d80a252cc0f7aafc7a93c0405a2a904ef35b5056417915e82831e9b61d6d1e9c2479e2ddfa6413b093aa54fbc70f605e48ce9e73d7f3f654b706e45e62e9ca357c038b08059f5517d28ebe723e1413031d02eccef11f047861cc4806e6e82ee8c8f24836496d19391f89272d28ff51455a3d63f0f9c3e85b0ccd40371132f2bcf08c43ee2e99071f63e1b7b5ee99c42de7c82b6055a84a05a14ff1784b8ebdbadc1aa1b81ce9c6d084df9591f6aa12c2aceb6ba66f96d07f099b8651fcc637e874e38d1c7b27ff546ccbea49aafae30d91ed4c4bad5525d02af9254a8ca00950a1312da3b31959b401eddd667150e0147f18f5d679acef00eeb0f7ec64e5dbfa494aa9d42c887df72d8c976fb276b0e15cb28ecf3a64d7183c0a23beea5d54ec55772a384e3b1225d7f23fecd732fc7c120441bf5745841ffb4dd14987cf1d30ae00d85582fcc147e765fe65474d6ceb8756342d3a179f1d15c22b13a304dece3a2ddab62e913263442efc636a8fa738a5f08fa14aa2cf1b71b156a6a7c53ecce34659e0bcc30c84d895606da8bf566b52197ba3efaebd1ff7627d8af9d8e53490927c5d925af7af8ae1530c69a7208a781a20bc910210348f1cc64503057c0e295a6cb31a1e9dee425cfcc7150dae9ffe3ba5739867715f212959612c16ab6095e6506dbad7a348e84c842614baa7b1ccc432516da588aa95cf5f66dbd11934be7e5110dc4cb4c665fa12b1ce76b4c9cafdf1dd7684fc1cd35700da7a006f918b6a9726e746766e9faecff1ac087deee02e089f1ccc76bdc409634770695480e4f14937438d914a7fb0e26d143aa928f69e9f1fc7449d964e2cb13425d57107b15d8fc957e9ae62ed4774ad6fd2e17ff496dfe6e0b51aae5a0a112a010b6e31daf492668d2275bcd2bcad3a2699ccfcc25eef7bcde7940ed1e9acb06cd5f20348ff7a954cff8d621457b49b9f5713a6483ef866f8a2b4bc9912aa4ecef9a587e1c56fdffd499f5c9d60b25844d45d866f7e2230c7ae22c29ccd328c8f4030c48e9098ca06c852b0531fcefa7cd753a21d659460a4d28528c0616cf317723bc238a61de0d0444f6820dc3108ae2a9d043b3c777ef6d785f4ef18810ace576d8ac55027a9c3853d8cebde020a4493e2b4b24bf2122586cb30103899591db66f231fd6deac4752c5229c6e6a89a5dbcab868da2ea599a5ffe30b0adb696a59e8952c806971c5758f341ad4910c39caff1a473153beb9fcc916c8d670c11e0681e9d696f080a3b442c94f589e1b682726e2369888e6ef55cfd02ee480eaa286e226035f9d624bd886ea2242ba3e9abcea161c56f5a4a376bc19277b326a5da1b2549d24969e23a9059e7bd90cfe374ff0c0e3b4c3803b2836f99be4aecbb61e9a7c8b2d03bc95ee64ed4266bde2a7a9e3e772fa1a022033e57970681d9417c741a4b5c20d4408714edf5f31f47352926994b17021b3ba5f73a08f4da74ee76250d7032bdcbfe4f8697dbb82da37a1d12ace885d011a71748577e0db73808db86e1a5daf97b5904c5dce3ca197b8fa30d09ddf0be1c0ae39c6044b5caab273914477ab9866ac7635d3dacbd5527ec67500099ec0ea2bd777db51b916736d00b579f5d52c722efd7a73aa5168330f6e69641badc544e556f66f661052f7379cebb69cc3b4e3c28de5e445b4a063f558d4a4daf4621676917e28493a585d9baffca3755e77e1f18e3ccfb3dec60ab8ee7e684f5cde8864f2d7ae041d70ce1ea1b1e7878cbf93416848dbfdb5214fde972e5780cb83c439dfc8aa9fa3e2724adbd02bdb36d2213c84d1b12a23fb5bf1baae19772a97ef7cc21bc420b3f570a6c321167745f9b46a489ff8420f9a5679c1c4573c626334b60296a39134f3f1bac26e51659f7c74521d79594e604767fc1339b9d5592fb96e0702f0f910221c0f417d83ad2ea3887c6c287c55004ab60418d4e64cf943a62c392652612ecb1a2ca6175555d8b618709b75085fd6eb6c18385f87a929e6247900cc72d0763512995a046f6787fc4eb71425a675ca72b1c1dba043f2d0615bdbc4baf74ed0aa2ddfc60c78ea22be50d83d03fd9dc426ac856961c331d8fc72dcedb98ae42470938551f719e79144465b80d6b6e1ac5186ef4a68ae6d28ff9104e391d3985ad06b13628cf965bcd659c9446578496a396684e67dadafa8b2e2da0e0a79745a12dd126394c16c8bbcb0a8f079ecdce72675cea66a68fe405d8ae6d7ec25800c7e1309bbd81805e63d7583eedab9a20962db54f0f68662d847b4b0a4fe7ec3595c3280d21da736b5a3cddfa55088a3b934bf9e2de8b0e358b986c1de092d4527f365ff102e1509e034e2467da301e8e0e34935c6098d8aa8fb28a0eed5d90e608cd20fddd20b864f39dc3fde9acb7864b8a3a02121c65eb155c3d53a2a2b27ea6fa137a1d031b4eaf9e35330ff8f5b2ffbf267a8f80267590f7fe92cd0cb97afe4fb00c4f12e9b9abe1d08db98f49a27f46113c255eaae897083632b8e6066953308f1aefdab4345ceb5e9472ea33c36ea152bd601253a2ac1f8cb9e2e929c86a3ef92c7bc4fb5d472d17bdd884349432739374ec55c14224b05aaef760b42697dd96b78f5c3f830f29a4803707dca35f1f3bf916737425b53d386852f7060250aed052772ae143f9637d722acf9c6f6916b4c07af5dcebb248aeac8216cfca48f54e73ef9b912eba6d0b0a3055e456d4fcb65186777bf2c05515b2013a520cd57359923538cf91b698f5cec43554f827238932c552c1e953d5063f5cec3d388a9b9a44048ced1b7289a62672e85ed1d44dc5dab4325f2dd15b089af1b6f1ebdcc078ffb9f27a2a62b194a7b8d9726260bdf4bfdf70a43eed59955b6c05107540949e2be224175d2ba359d8f2a3203851069e58a39821aafc532507385109936a8a426f097c151221d15e10dcbff8a239ba0b4bbd3357e082ca4014c3454d949f142e2f8c7523f7e9be3a15c39a5c5e6f3af3ff68bcc77e15416f1aa93c7d1762b4b9e407a9a46ce7ec462e43ccdbcb762bc0ea42bef0d2283b1a6f66c0f88a6a0e7e22f77416efa0ce2ae0d9b1f767f2ef0aa2e794549b4029daa9685d406bf963c372d88f0bfeb8e650c3f2042fb24a0729afa3e77327d190185f4a6bf54aa567524a2734f42874b7505e291df5390006b6672412cd0660f05bd769977795028b832f60105feb78d38205eb79d87a9960297fd4c0d2c572ed3dc8625a57d98532de792fabbfb649ad9e51b5a259d59a960b40225c24d39bc906a8b11f1696921fecedc26184274bc7edc82421ea08683ac45eb95f23cf20267eded260244add8506c3d4dc5dad138508ef93631951a6a0fd31f6445ff6c487eef132c81164bc14e4b1e3669cb61597682e9000686fca7b1e5065a65a08dd6fdf767eb15e72b241df2e5aaad1e0e661840bb66447a1482b903083ff7263ff30d8e502a67c03549e8e9fc7139dabea66051d531947a4a424fb58ddaa69a69e8d63a36b31fa85177d5b9c953b4075b62743ca1299d8d86319d84fdf41703f3fe7f86814ce4a867f80ce9b618c6aecce37c89851508bbb095c8f7c055f569c47a30f79abe5ec75f12b601298718d6f96ea1c1ebbe7c0cb0b7fb973ec5e6d5c6a71317e7d0360d210efb898c695287ca4e0a6b3aeda2896edf5ceae00c924de0cc4d6dd14c14829534020a46861cc927c9e10fda682239d355137a0cf1a3dcfa300981c1f89f2fa4cbf40cbfa61ca5f8294b3533f7a325c56049cf2b3ebe87fd1c6ddc1d9e801b341df8155f91fd2225b47266ad64cd532d49266fa6b98d58cfd8a1054e045f4e2e7037af8e0e654996b37e29b07649cdf459d1e4e32bb85659acce84bdf3e2d17b0dd961b4e7fd21346d9707a4f4bf9b00d573b64c5be78983e01ce2d132b4ab013c05b339e26cb2e52ce387f1a7d6c33b08336b4813c1fa36bbb2a6f18b7be4aa44e32e85c85a0492368d31ff57374f8c393a8d3e19eeb05886b95887c4e0855d6f9c590060712024d5bb8d36cb8a46daafafa4983617b3d28a5881faa68a95020358bd1374560d814e9624ffcd76b10fb3bb36bd32e40c8d0cb8a8b2f9221c80493ee024cab4d393ec457dc023a397128d86cd15d5fcc27057005517854f23c189774c9d2c317b40f6f020e296ba00cb8537f008e708dd62b259109111bab0ac0b2a89e460750b72b3c196ceee63f522e3f728fe2faf664d64eb6288670ace2916801d632e298e106cde66ebf3457cffeeedfb5f769a6418b6ddd2644de88220f3a1928060f509026a6f18a06d09a04aef42f3938470dfabf058e98d8cfcd679ebb470a5bc808630f29d3557235666eb2e1d980221dae0ee5a832d6becedd11c44e23d390c730c824f8f4477ded5d8caf3a7711515806dc93b87286634647bf2465283a41675a4e0c76fcd68662efdd08607063227099124dd8b62e72e08dde13b2dc94da32f5532a46258918308dde32e66dfc3211e51e786b86254a082fed2699a989e7a4927602c926e5cfd0b81ec35ec852ec966b7fa7f36b0175379e7ae19c277fe656a2252a82796309be0f0d4e1c07fdde88aca45102cd4960f969e5b94cceed52a3a4ff05f495975262f32817b0b5536453192b080c2563b9b812dc31fe1858c9263b5239b1e3e94679f50dd4af490a3aa0418241922bf6dc1e19bcc0529c589658a5cd1a2d1cdf323d951cf98a4b78addaa +0x3dd340c35dd5a88967b66a5602dccb8ec44478d76662a1e328ad5a93ba16639ef7da57b175c9bf6fa2b11e006dfa6ac1 +28744 +0x9216bfda38412a0f70511159dc73bb6bae1f8eaa0ef08d99bcb31f94f6be12c29c83df45926430b366c99fca3270c15fc4056398fdf3135b7779e3066a006961d1ac0ad1c83179ce39e87a96b722ec23aabc065badf3e188347a360772ca6a447abac7e6a44f0d4632d52926332e44a0a86bff5ce699fd063bdda3ffd4c41b53ded49fecec67f40599b934e16e3fd1bc063ad7026f8d71bfd4cbaf56599586774723194b692036f1b6bb242e2ffb9c600b5215b412764599476ce475c9e5b396fbcebd6be323dcf4d0048077400aac7500db41dc95fc7f7edbe7c9c2ec5ea89943fe13b42217eef530bbd023671509e12dfce4e1c1c82955d965e6a68aa66f6967dba48feda572db1f099d9a6dc4bc8edade852b5e824a06890dc48a6a6510ecaf8cf7620d757290e3166d431abecc624fa9ac2234d2eb783308ead45544910c633a94964b2ef5fbc409cb8835ac4147d384e12e0a5e13951f7de0ee13eafcb0ca0c04946d7804040c0a3cd088352424b097adb7aad1ca4495952f3e6c0158c02d2bcec33bfda69301434a84d9027ce02c0b9725dad1186ddc785e2e282eae23d4be7a8a7f62e390edd97c0af1ba5165900828e0630606f83d4df5240e1b05c307ee9153ff52c3e316f75acb9806ab9a24b5e6500d1a9bce003c7d8ae77065870ee39a8584734f75c5c36d2f958e93672f3b5bdd9fb2e0d56d6f7dc77bd4d75730c41d87d66d8e2c41653c9fb2f910b4fbc20ff0e379dbf6cb0b7d4392f0611bb7b9a2c3bde989f1d4065081b5f02b69ce7189ef9f14961a643b0566f46c0ebbe9ecb2a0018f46adc4ce2f3e671aeb6ff17051449c2e19277e259e9868efe3200f82d4866906cf465ae4633f902058acace8ef55a26d6a0762f1cf41b821ea3070a691ddbff72ca6de7174ebf8a97a094601eb8c797993a058c821c9aaac2ad4567e700ec90963b3989ce8a9665e5a6e09e2ce50e8fb9cdca7d21b980735abf50732f97f50e57e57cf8e49e3a4e6ffc43bb42008b89b8ba19936451696677679ccebb4991b328478cd6e1e0078eb71f1259e671eb1006ad9741d27ac21e7924aedd12ac4f4997e00d865f068ab12b9df0fc92df99bd3406b81ae4ac06e60074eb20be269a1c273d6399b46820505de74405cf9013ebb163f081235bc4778de6f63c264eeeb546be23837a8b84d6ce89a0280549e6261f33d5170700672d71e93471d39bd9af86f0c1c629e714deee0389b5dc538ce6cdf4da3f18408b726cfa4a745e83c7655853c2f43b116cb34cd36541ad4374b85e35748bdf828e00df989cb61f9d54614b85ab703680d90e6b77b75e00903a154054386fb54d0b333a52afb9af5efd4dc0d4efdc94cbf64aba6f146d6ed0498804ff9a6d32167fa41db6f7f1863f1e6568e0049bee4940e2ba37f0f2507a3f7b2c961ef6ee5557bdea1409e02cb4545294259e309b8f5580fb50d17f4df4688917a64abf42b01ffb30185a280b552b9fe313f12d4504808ffe584a76cfe5711c66ae8208d78d54d680226d1bcaa800a7d649b1f4435f6e7a23aca07b5eb3c5bf8a1d6985f56382fa4ac0b74db3137ff4de2565283ee68bda1bcc87ff62e5f2ed0281759954c926b0f081dd208d3df6117b356f3b9030552a373665757502652f60691ab55e34cca521d42356917e0f882e0854a0dfc346d51688dd601d8fb8e11432ed8c7a1cc1415f463e32685a38c3770ca9fa8625fd853a223451c4e45abc9e8d52715117b11ff93692568a58ee5dd6b0c39b2bded59502911eccf3b6b72c8fb6edf64b8c188b9043a4357000aca1dda3561529346b9f10640134326d7a8b387e049df200743eb4fc0851a1d80059fc42c5fb06ed2bfdd409702a097f018359115adabd0b3083c7ae133da84565c0a31d97bf5d5f835bcdffd000d161e89f423f453f3502fa0548f8794bebef698072924fd495123e138ec5c57b22cc9c298446582dd29e1d3dc9599f1ef52c6813db5f52cd369b88df76d9b4db860598ccafd508391e233687c95ff9294c830de55dc3451bca520ffa16da22b473b36af32559d9f38038c29db96a1bfd6a99a79f6a7c9b42b8dc300dff159398644c9f37754351bfa1453dca2a067c0dd7c6e18c91c9c9d49aa09575903a8be9e0378204102fe42fe9ef24a78bb39dcd0c91384754696543e835bceb6aa7704b700acfd3a68e15b6d29d03b06f0ff5dd719f185a32a9d2031a01f2b9eefae51f7c4ce53088dc6ad6e3b5577f446a1891cf270e2fbd29a4b4a8abf37bbd835ee89d644ea537996812a5ee9c5e9c607a9c4dff8652445761bb3c8a1bab270f42393be788ac435371fc919f4ee8d771904fa65f1d4c78b17d991e22f7c2ebcd3373e05d0fb02c893cf72f4debb8961c0e4e40ec3f88bad67cc0f61cf44d5c6bb74b132b604b63a91d94d780ff1858ce28faa61d69919b24d3e52ccebdb4f95922015cd916f88941884832cf05b2801684e75e6937f18a2b07585abea0a45314284915ec9021fdd121a3c99e7c01bc73b696d26607131857abace8734975fa3b1e84e6ec686241d66e19f455de706e64128b9a8a6380c64925555e6314a44f2c9937384efc23e5cfc22d5babb998f6764d382f4ce9c5046e08e435349ed9d2670cf2929ae8016a3bc240580679e61518bb1ef933e65a6344cadc053e446114890e298e46a8654f98e31581dcbbe22ac9e0b290c605bb535bef9f3706a1f495e1015e73d8c9d9f675a8ff61b4dc17b80842957e79b4626511ebb0531433eec73d8b03fbc7a8d9ff408870602576e13d62753a2ad56eda090543c1e1ed76ba38cd0fbc7ea9d1efda88061b158508e93b56ed132e5fb19ccfb48c164c08e7016b3e03ea84e5d18618baa651ea7a0e9a22641ea2e17f1925199e395029ed114eceff0c00971234272a66edb7676ae47e93088e8becca020d9730bff1e41061ece49e8ca13d95565d900b50ae04ee4700fdb2b110c8a708b098fa946e12f975763c7b0a4ed105d493ea1653b85b6a92bbd2f13ae3ddcc99a8bf7a6b372f2ea8754743096c19ea1b6479268b68c3665429b3526067c47131707b3e88ef9126976485551e8b4098b749fdaa4c31e56817b50f44d63ef55b6c824c9591fa0157aebe874f9e1f0db814aec8103aa639f639f8574710bbe8d1a758b43e0ad8d8587afdcd811ca9d9bed02d7906cb282987476e1be78471277a7e8e4286482e8e9f78bcb8982ebe2d23662070ec624a4ca1cc70dd94c5f139cc6e8d681cfe4daca32445d90328ce807c4332503fb48f0bbc45cb0cdd39be883dd3c0955081c8bafa0a53bf40bf5d7c2ff3cd878f2668ff5d2fb73a3f743bab556ad26acf7712220a9750dbdf46ed68c4f47c97393c6a800b06dfe629e9eb0b89703d58f842dc7a5b57b7af3d43e0deb1c1a9fffc6b06462c479f812b2f5f3160a06bd049796a4c72c802b9f95aea569ce7f0321736beba578e90abc1a90aa56157d871618f6de0d764cc8c91e06c68ecd3b9de3824064503384db67beb7fe012232dacaef93a000fba7f877578e97e18119144cdb77f7ec5c11141b86b2179e98eb5f2a04b61026235963b3288d41ea53e011646758ce005d595ce05ac81cb5df71be3d3fa6560a5729b284794deb31a9573b340c2a0e149d245cbf224335cf5f8c9e0b89ad9b31fde18df33214be3fec483bc3b337e2b18439bbbfc6698c737f03a79dc81107257f479b063b2be29b8579b81a45c5705e7a6222e92e834629aaa082fae61bc16d432485c77cda7ecddab25b3fa81de0a3e765394343d88e794529d72ac913f291b33ff23ede68bb5e55bdcc3cc6875b08330ba7d8ebb28aecb9674d365b41c11935628b72471fc0d55d61b219854a0916c61c15ad0f5762096e228d2582ec578e3353f86ba045b6ba5965b5dccfb0115409602acc98103f58cc223fff285edb7814dbe031d223c496b3927e8f8bff9b4a629f8f3c6c2549623c2e0acd34dd765d40c2eccdc40113efd2b0b539a180d1813aa0eb0575dea7ae241096968eb250c71fd0c3465d27ca501e8702e3f87bd980fa2ce730998382c5ed8e8c621e25903d19cd0da487dc123effde0b947a38dbcf080b2bc3c25b012d00719439cc7d5f48968074ef29691343dd7e7b540efe00f7ce055ec9d7af4d70c38055248004e46ffeb29e302a16f4e62030f82b9c176f7fb2e12847c0c78d15a085782a2200483ab92b336f742bdeb030ba2a220dc951ef1e69334765ebeaa5fe46a4549abab2312fb3dcb2eef0f82776e4bb40475dced0796324d0ae638ca7458d82a9d07a4bddc812410380ad6bd55878508e331b0da92b98a6eb83769aa3dc20ba31ac883ac5ed0f096912a95e423f3c9412b94a37029cd05f9fcc6e3c222dc7f3f4172ba8710474dced8c2dfaf494fa2cd6c233736334d3f7f471919cab9f4cd5fbf7acbd6a77076495d6816675bd78c3e2341fea555b6817f25a28dfc69a760a4d3653a037ac91466bd9edcb4d247fff3cf954c45f795967a26f7a30fb860c37f2ba687a600dd92d777bb951022fd688eef71b280af66c8e0b99d1b5d3ccd707f36d33726e00a9bfc0a52c1f1e4847070018bb3edd3a6a3535be7396d5d29f1f5735fcb1e8efc7a44e408f5e29d6982478427e2f60ad1a0329c7a9fc8a012b2a26fc0a5f5641fc8529322a35a9419286605faa231bb746a1ee9dbb0f78c145ce68a9a6a3405e100a5a6545cd28f0fdd6bf56884197c1b4b68c26f1f6297bb3b3262418a52faecbdae8bf284e2d4da1bb9e0f60b25b312deb0c4c93da25953e826855a88eab99f59edb2a1bdf41bf45de04727a9eef7179e875f6e8e2f279aee334249e863a8755fd3b8d65a8ebaeb3e6f9671d2cdce76054cf0c39371a8dcb7d947941b466e0b4a011cf4fd2b382b17c86d69284a9fdaad72375ce00253b5df98f3cda41b60cda2e64da218521a40848b1a722cfde1a1e1a781bef6699ea2bfe2d55b154b2738f503d9523e8be7a80f184c2123504a586c5d6e5e4910001fe3577ac0e16e37d9baea3e89c24116de020070faddda208a88045bbf4a8e1ea9e46742939 +0x478f747486422a451f200e63775b2fa32b2af6f88524bdf14a3b6bc8d3ce5c610efac145f76391e7fd55c44c09b883f9 +29536 +0x4a09dddc5a9f00ff888b1b52e99b952bc9fbb6444c4d696a55fb4179a7ccbb874bb6c36031f479331a58348ab4e1c77f0790042d11787f66ad1595a4badeac41781dbbea35ff0e512ae74322a008993957336a1227edf580e8c561a290e5ff139be6d062b0e947c281e34f02f33890bf7f8ceed8d7d55322cdb5af5d71083d677ab907b0e8d9aceee7f26112f598367a47429b68695822b3268d86bca76feda4df3c6abc26f8c63d23bc803af05112d279fe76aa259de99bb9f4efa779439732901a006eb16d1c18ffeab4622a8aac30db67898653cd30414f93f0062eacc37955f9d1afd36136e541240572ec6c8dfa3726dbe53a0f800faf1294c10fd1fae1f882e665d2fc9d0db2117c527e1f3c9a53e274ad238c5f6ca318e0c164dbc3d23f5c467af765d8f91a5a20ea28ca4176f7445dc8566c58c0f14ddeec75f1a7b4f42ff9d48ac56f1041a7fa22329625f8edf39d1c1bd6f074625b952b893c2defdda5085dd343ebb9ee9f10e3e3aa6f86fc983c93baf2b1eebee70d67e9e4ddebc3647afb1908d35eebea6c13852fa78aebdb43147ae92297cd9c4f86de103f106d145798a63caf66fe31169c5e4c566b8363b986a5e3cbd7561f6272aee8dcc7a55ea81bc0050839f01c1464b72a03918cd9a6d381073517231b4e11a1953b7631ea746cb08e643f88527055d7f03664cee412e2577ee7bdfa361c4d013fe487da5fc373befd4ee0907c325608c7774c102d069b6e706933a418d30c140d606068659d18317b4b84ce41604e90d74fb11c5c89e6100444dfe96a7b382428366ba3a60b43532fe5930c4a0427b84745fbb818a4ab8362ff2b90d41db877b8ee0e53c714dc6a42a375103e25c8c840e292ad095ed210b3227e63fdbf7455e411b33f73c1cbbfdb0d92a2c6cc1908e9acdec2d8bf43ff1f363f288e6c5408d426c1305019f89a23ac528c8a0002bf6b2d48c12dcfe798cdc2d8a82e2940d7b1b5a0ee06244b4242071e9531c96b37eded3670af97a423e64eb0ab86002009a346b7413eeaad015fa75c84642f3cb698731199071e63e791622ff93ef8dce7d16270f1a074041da2127622ca3b5d8593474202dd6c0d2df787bd59fd195cb9649032c5d3c93adf34d2d2370cf4b6ec07f12f74d88a883d3f44c2946b6c89c78359668680f1358f3d6fda8bd16330321cf942b6a07fbe5f9222a67231f84958574472fc4ef5df75e46ff4e5c28eb1a1f9e8e292de5395db18a8d1bbf7c685b508d9bfefe6dc1ed9525c8a0e867f227fc74676ce3a0ff7f8f85eac3764dc2627bda0b527efaedc02afbd03cfc63e6c15ad9968335bbacbff5bcc9dae214412f49e22bc6b12730039221bc7ee2ad175abd46b1f89ea5cf938687b0de7d6063364d4e63d85f73472c6d3fd3e3359422789644303988efe68eb48f265ab2a286fc187749e3b45f91af1ebebd068fc9969f684aa7c27f0a6026022b90bc2c5b4b051de554956a4c8e002926de553badc223c5c27f200b75faedf1f5969f450b1dd5e0210a49ebeabac40ef0ce5be3c153ca11542cde98c2e54af6759e5097328de2e1b2d19da38a966f42b4f386f2a4b9e6ed78375ab171ddd192141e9c8d5209b0950350fd4bdcaf6666dbf462e2b8730eac973530eff332f65769adcfa1fa1fb39c9afee52f31744dedee277c5e7d0da5f1499cdd9ed7833db8dea2667f8b4e905af231d1d829738a4a64334fa072e8413df7d4cd688f5d1c28fbc2fd7095f4ab42a1906fd1353bbffec67e39733a9164f53a839cb79b1f264a3955e12faac078f611a10b94e51b339d8d8ee62124a785b98a1fa8167b47c07f2ff1ddf72a308de7dada31bda9b0a98941dbb244d18937fd5f0f9c0fb0759f4a381d408194b35e9a55b27e96039a66545beb4a48b1b4d03331e9c4fddb16f73dfa4e95398ac76f702ab04ec873171e716433fac755c8f2ed9b24df8b4baa8cbceeec58997ceb451bc25a3ecf88d51682d35c602b3e2424aef347381282bea4697e9d072bdbad540fa516ab15a55302eb21cb06fecb64c9d9f2d75b3e30b1f2a631d72d5b377c30ae4b8c202568ff582ce7e65bbc8de97700f24bd568a622ec05911147b210d64f7a3e114a8944588aca8e54daef164090a67a1b232c839ff50a24d1c2dad85a2515f54c66cbb7ed1f46ad8d0100c4f8cb5d02cbc0e42977a226559f4b102e6645e3f9a42147343b7a239e056a8c4a807b7724e43b4a384877dcbbe02cfc63891686c3aee68669b25fd4084473fbe766159748eafea91080eabfc03b051a28313b50ebc34323a8e004ea44c0b9da5c184e3fe756979b42cf7f21fb065fd3dd0d18d4ca97b38972431dd90c00a8a1f92579d3a8ad729b6f72a9b5c4d889d4026b33a4e882a432666a0f22a69acced4f0c2ce4e5562c13c728feddc6383f7528ea1033de1ab1b8e5b35d59ace5a306ee3adc0625e720bf1a30f32c779bdd41c0f832f413d6588780bd9cd09777a7a927300b99f2e70cd7a9490b045189efb45b141078122c0528c7f72249fed7672eaa9a3022c4cc2d0824dfbb17cc78e36767cc4d3261b244071bee92083b7b4e11e8c7fe33240d2dcafd4397b970ef54b5779f2db57adf91cd0d0270ade5d9e8ed6247aa3d99307b9a9333156bc753b038fafb4663d62a7ac50be132ad7689a43b97a7d8c48ccc82e1972ca8c1485c826c727f3bdffc196b99a8f94c7975f12c66f9571e4a8737f04a797ee64c6c5057ca6e79529c7522f0a554b942a45ca6de0a17e3cf420109303faac8425fabe58ccd5f983f0ba9ed8692afbfa9c0a321359f73bc804d92c6cf3bbb87318daf62ae0fb64a65a022cfa9cc1a6ae630e1d6cf918d6fb5cfb4e729c91c4a5858bf7e47ec131e5b1c784fe6cc15497c77816e088ad56bf43adff0dc625d701b43849ec6fcf67273b302f4aa1d30d9f1270a2d7cd5dc4fb0317c6a5381ff96fec0772ac7bcc0e564266b448039edaad8a204bb991d12797e2622ba2bb2632d77620fc8a69612f590c919b5f59cbc2aa79ae98ee9cb0877a29b6b66c17e28b219aac6ff00335d118e1d76df66d01ce7c254211deb6a3ed8e1f3af06b14fc0b36a0d351450ff1fc7b0b63b17705e9050cd7053ff1a7525fba0e176007791cbbfcd0bc2cf1563cb86ad15bef49ea2a6f42d61ea9903664e8e63c748fa910e9a15c7290875ca0bf0ecd7ae8b0d4e46d14066cb6d8212d828dfaf27a03b79f0cc73ecd76ebeeb521058c4f317a80bb5afd41dff5520e525358df7851469bef2c358b2a97df0f5c0ba68f985fd8b5369831d97802a1bd6e80507b1620e0bbc8f2f229d11beb275f25f8be9d994fdb1ed0b8b87f064c9848b07db7140f5781f20606020a29979e84160302a508695a3ba99bc43c28dc05aa8ce87cb9483554340f79fd1de96cdc9487cf41f9d3ad9a55cce1e7f691d86e5abb98b04ff0019b57b653015184f149561f6565e224a30434e09208f768c83a21e6953c1c3244c024a29df8f022af4d9487cc54a620d4fe9f8eb70f85d635d1c7b5e8096934852a607b5fc940ea2c5114660cf88df1c7f1607e56e3e903a69b14cf98fe7d1e4c41d6eb9f5c8a05f2bb9f652e37e1bf04463d577a6e6b16a300d0ddad02a219226d4d986799159b89f5fd2c38fbe8b11463ffc228975238b468c28630ff1e4d8d168c2abe682bd37765f662352becf07eb26e666a46e890623bb37328dc3ae117a45c4aadb112d5467552af2aaf33a3ca9951ec4763734734e16b4c9d813efd487f85a03a5c13ca7d8cd8bd216f05f3818271fbc8d73c84b3c2b2b898d672cba70fcfd3705176daa51151312152ac082ad4973cf3888b706546505f1fc21d70bcbd028c5478832c456e86b633426f094df78956d25fa833d4d60cea3d3089170fefe572f0b982e9e50a3cf25e27951f735310f26d44daf488d8af01f705fce6290e412e4bfdba380e4d3e8daae767712350f3b8ca206adb08b6014b572abf059183de676d2a7442469f53301f6b2d28e556fc4ff3d9a011dcd6ca7164871a9dcfb584c65f2af82e18684283c69b2f6b41cdf160f059c4be8ca2d21a260454d66c0bfbf228e38e250910d42da65fb463c01d9b92c7861e09a080e1efa68ab7d7efef0a94d03f7e4fa3ffd1d7c7a00637e9aec28e824af61ba1dabe98ebff89c9e0c87b5460250fd36d9e012832446b1044e82efc298c931c171732bcfd4d13d3c8fd14d9df7c8adaef532bc9ee352c165a34a682c2343e33889f0503e55a9d1e2df89ecc552e378bb287196103599070b2f8f3cb57293f887edaff17aa106fd29a20e0d4ca225e0f3da391997a9ae147d59ddd7def55de448030e79d5455d01694dda49a4740478d180d5c195adf65c2498c2c41939f638f17098740ec130a12a597b0c6d3703a2ecc2f4288ab0f660a982ca8be4aef1590c9cda5a6793163ef54b6cdff779a7e1ae0700a8e76142a4649e4199d1c2d3d7021e40a77039724d529a2c3ed3aa65c78dc377ed4c2d5fa9fe51e468511412356a4b67e5c932d94ebadc45a39247c1c7049ee6402973a1d3df341f81f32140f6bdcabc9fc2fdbfd5a67825a8b3d05062caefc85c0fd2bdd47fbb5f713868c49d7502cb201e289a549e0458a8a8e2761d193c9a9b4fd9080e686e10b08159218c1889f0210b11fd5e19e76b3df1ecb778a80bd97899e514f411b2ffca6e80fc6510d6e81d4a685d54a2b7b9d32f5da8e7dfe4019e5e95792814206919606e999b166fff7f2c8a3edab0fbe102a1c3aefd294baf571e48891cd83ce9380770ada061bbc2c151f61652cd0a5d46f9ad5e2b2cb93f4d499cd934e67f0cb0b4458d07bb50ce8e3b4a884f7f89ab0aa7791ae452a33deb6100fe22b75d2fee074bdc535bb56f2048e5e94310f046e83bc589db239027bc15034c48d36ddf7a70f20ff5fb5041321b56ddb059b4bd4a17011f5228069939b6125829c30797d071e68c71f2b7d13e232bba29926d6abad9ba4ffbc88ceedec4bcb637fed0f57a8a87f659da629baee0c323015370fba4e45f803a9d89a525d160db15ff5054e33b54c2103ae70cfee4bb9cfa2575dcb2d77f74910f8368a95cbd2b263cec52a504eb74376c9ba1c89f837c5680c28a4f13988181a71085d3d7204b0b402b5b3a679a81220816f67681a965b8ee1d90e439193baeeca7a93fd118af179193fb0de4007d7295df77932b9bd +0x6c3a8559da6994c513896859d491b019b3ea9dd74b8c39dc983a8a0c0a277c6b9a68b00a82772f48c873934690fabb3b +30328 +0x3897c9713083c6795f60326e10dd4ca80b2fca125ebfc0815d1fc444e84350fdecee68af2c6a7c17427c8f40e09799525c502aaa6c1251302e13bce56b8620bc1c13dcab2d84d90182c1b4fa38fe1f912d338495c2ccecffdfa22083382b0d65cfed6d8eba39a4df2715e8c59d7aa50e85c020fbe8565a967ab63745d898dfa00e6665805cf1a7583a6275c99973f5706cdf45036716639c06364a54d2375e14e0650aa89a14a815c18fa12db351d560ea783dd5c676ceba8c0aa1d8ae6f526a4dd3a62ffc0a70bec784b51a747c0e8608734e9a8ddd6597131a84f8f5a782495d967f3c0a3bc7fa5129f8b7625d6889cdb8c17a45b3eedca34e3bdc2e49b75a1997ddf84d1074716966b42d075aaa12422fde9c755f3230448e0dade1bcb94588be0a8b4cef41cc16232fa3ebdc9ec86dc1ec29a54bf93cffc24493966850b1b2f44d1c8f41f4b36148b342944c0a54585435485dde0ba7dbd226b5d6b54446a01fedd39f6f56cd50bd86318c10b75d0bd1ff2226802f1ae1a6fc3c280b5cad592833d903df2fc3ee6af0995b926d8c8c2193df87992f3d18260d4f15d2618ee5f8675643fb473c40373ba28738f389e52a39a60991d1b7883ba31724721c904d76d171e82a65e1500dad739a6c13fb1ed6389f32d1de3139cb04bcdd53525c9889b85379d3535a25d290351c95938a3d0cdaf38dbf1d5234bf7965c8ddce9ace1b66247e60d74ec7702a0f931a3cdf4cb465ca9fc458c380004a3a6e7957f1f813210b8038ba663fcdc42a8965d6a252b5224bf249552b2575bf64568db4091d58323006c3c34994d3a5ae85dd297b58f9599f0db4dd332c05200b0883ae8b45d4e1bc9869bc9fce6817c210eafc10656752ed786eb8839c9ab4560dc10d1f786e75d7be926b12f676608eb1f4190c81e7545ebce0aec27d1bc46eecb1996cbf0e38a801a69a4812e4c93bf0634615b461a81a60718798d76f987b2db9191b219c7058e80d0fe92d9a9af155a04cd307bd9748ec880aafb38078a4594357d3a701660efc2f939e4c801bd76911f3f081e36711e88f01ac1835ac11f7b6193d582362f3c375ed0f797e9416b31f02112bbc609cdded323a0f767beb8f7a28013cebab2fc745e7e3bb7c4cd5bb3243e00b2ecc12530a65ff9f2b2f5aa9f74cc65b418be9900847c21b628c3d0ab37c052c22f19ad04e64a3d03c0e85ce954c34be0e484aa427d6569f189c76270876289381195dde21f6cfaa92619585bcf2f46c382b798d085c445186c4a79a9bf9f04a318a8204ebe22b36136fb157d404ae6da97c9ed315a13739954cf9ecd3cd05581c8c32cb14f15e7ba88202cb454b09ca4783e3fcb56cd55e2b7b93a417b910c5286995b904eb11813ae0b069778fae8afc886e924f86c6c8319a9d4ad186b9993f67d2582398eb51afd2e2b9d29845b5afd2671d4db8b37f90f1416768fca7dd48d01230dabf95f2f1a0c044bf2d755448aaf72316c8448c2ec8a58244e383992bea7cc78f2ab66ce6927391a418e66dae58462e127e20f6f567f123cd03f4d3d0fe39a7ab9ff7c878f02328ea1f410bcb247bc5a9a4f0c5cc154ed26b24a3951f53705897e7000d8e01f792fa0b2e338655be7143005b019a1ce418860d37e600334a60baca78430f0e18563aa354efc73539b8485c0ab349c2da7c868759cf5be4ef497b0f0773e55faefc14b15c46760a1125207ea4e3c0505887d35ab15618af869b448056a4f73ce00deffbed417c1d713d332ed297e70d88bfd54ee6861fdc37dc7ce30dde2dedd610334bb0e6bfb67f8aea363cd9a64390aef42aa16458b32c968a01d4296fb9b98d47674d3f281d6393ab5d89b0e53898dc99b889faab7c8a50d8a2518ea5eab10c95176b549f9946e0df6a62258c36c9d02abe474f017e7c93cd8d2f14b7c6e5168425b22b0d7350faef266e3e83834a121105826b400228e6d18c14c48d967e327c57ccce58f4a86841595605b267442ab455e3575250b6d14c65a9a410a1a3e9e5775e456a6177b23fcac182022cdfa17d76121a1db04fdca6e195bf26317dc2284b13962905e461504358bc591842fdd32fb6bc8b6a1b9048c8801ab88c3445ab9c90cb7f2718fcdb8ac3bba17596c91d49774683c5417498e214bfaffbeffad73180ec530e3a0b4a69a987c089028ac58dffbfec0ae911fff7f6b5f1c6d66a14d489ff8c03731604a5b229a09dafca32c0f32fb0823dede6ced1046835121ccb4b530e144eeba6710987a827f8c510ccadfe9eb6726292b3304bb5fa90cb98625f8720d237c942f95cd00c3fe46be5fb1bc615e6258388d0e50cce911e286743d8cd3eae0636730465345dcfa7c9d027d1f39b28e2c655a3b5bd5a14285210d47ecc6f900259c0faed5ca4be8a0859b8982e3964f053839668065e6bf6711b7f192dbb60745bb143bcf0e9f6d5500816381ff68298539a0fc58ee47ed0ac11ab70972a06a463ce479a97325ed0c866a9796dda6a22ee207895fef335fe2b79bf4cb3c56bda9aa06f4ff989dec399fada23c0ed05d64b9f38a0fd9478c717db25752993755e27ae21a2bff55ef5ea4c0ffdc23839fb939eb7ae34ce2f7598bf44b3a09c0d773380c65d917fc6afe4e5b1d019c2efdbeda65d874ba9424ed5ae84cec1e91c6fe69fc746162dfe39af4c29646d9310bc823e92f2e92d999bf7304d8d3381888c67928a26f709efdb7209de8167b482e77aeebeb9b6631ca325cb07b99e6d3b17dfe179c4dc1b7fdd56a537efae2c2fa4fc3e49a25c52b4b088091a1aacb31b577515fbea6b6a978682a79e75eb03fd3b30b79b76800247084871ef78035d129652b5775e4ffe201f1e977addc642d6f33fe01cfccd7cbef48c8bec9b4b72071a9d4957e92edf00f054fe32ede6f0a115514135fee8c702bc7ce07a4b2dfbe12d7f5a0253b11621414a63306ef41546e98d634c427cebfaa841f7024f50ff8a15206fe0647fa9695a284edb2797baacb71ccdcb922ff18d000358ea705e86e91aa71059e441a3c28217479be278e5bdc7260718b4a9e0a50be98c9b76fc99e6863dc5d59a9e0913033fd7d8653fa16060d29a9d7093c029121c1a7e29d43e699f0917bc4f3fe54423c785fa7993f37dcc480dc090959a005dc48afa508e7f5aaf348d76cbcb3e3c2bd7da69e61ce5fd51b1e8ebda56751434076576b5d264a1fce5b06bd6eb1de563995d8e74837ec63835b485187f594cdf10325c1e46f427cf45060438478926123396cfeb70c6c1c9fbf8f610b74e90a5057913549537d26f7c19a7b8868ae781cd0d95128ac6d64b2c3ca58ba75dc8d00fc3031f65358b26b171bd20502810f9904b49b27a85ee08ef09fc50f78ddca6559694465ff73b3a0c94af364f6c8ac0a3d75193e70bef466de562294ee7b570007d2e932a84c8f4b60ce3c3285d3b1e2f39177d7a61c34ecd5b3fdc5471397537fd39cc6ee41c9cd761c38e86040c5d5cfa0138db8e506838f0fc32b23551ff23a01dbad5201d7a9619b6610f67e5c451a1798bb19a80dbd62efff3103be654ebed4225053fb5d51cbe23026b90af9a37b6e640a58e39f1ce9cb1e71589debdb96c11d5a649cbf791d7743a4387502835c1b01d5e7165f049c27ad56a292382b2a6f091614746261ced10d13f52b2b6744b3eeb854beb216e29c387b7239beb00224822de4010abe5875f8f06fbbb8b1cdbfa71c125b3cc6658f2c3a37d3040cb688251c43c10ce152dc93c418a55f154fa4b79bb06a53958d77152d641c9c83a0104e4bb432ed6d468b69f9705672e442f99c91af6a9af6d2fa6fcf9774dcc767438a36d5e520d49be8e81b176d98b15024d2b87fda778cde7fb88b425a694a74985587f9464b99db9b9aa36e49350effbcd64aa2487da9f87d6c0ae55bb68f30952c99cee4c23f7e19fe2cf587cc5f9a3823f2a72311e0c98a16a900e7490853b09bf6a72f29380bda9f124d97e325c81d483b0f08d8b3ba1c34f0159b95383671102912a3f5060d53d9edc6f80de3f1e2cf7e3a4846b542aa437aa3d72fb1616d25aba1e19a4beb1c5b2a0226b12cb00f0656c98fc0481bbacea32c287ce65ceb48f8d556ad5c2daa7f617fb251628b18a93f2d4dea0e8dd432f43f0e015991a1f68b1d7182c96d74d2fea0197327db960491e5e1385b117d1cf82d06617d97f7bafcfac0cf15f301d28c03da9aef29edc51984082fb05f2be939969ff1e4e87302a8edd2f6c486e81a842b544d1b1ea64720782124c0cf5724030c394701fb9a6a2977068e57618e07618734ee4df246273132aadbeeda856a1eee70e56759d45de91709ea314b6a15be97fb12fa7d53d1d65423a9bd193d07d7cdc531878bc76a825e2bbef48d02e1f5ddf53fa2f845d38a5d1a029df3f499b81aa4dfe4f9d9fc6fbd0a6113aefee8a1d9d1e8d9fb92a8c7be0c9b140332ac4a65ae25023c92a01ba414751149a4963d1c1f82f20fd0ce08d769c7a1bf7d9c093f3fc551bc67d210a3e86f6fb5aa7742151cb2adad66bfd869b01ce9914c057ef7d8256601e02ee95ce4b4a19b67083b3577ec4f4cfafac0c57e0f3e211455163015c9b19581f3000f97e9396360c5932daf946966d40b3c7b321321d76d2759685726c6ffd3eaef6c7071a9a62e4be44e324f8ea3a86da61b6add372ccce8c3114ac118a94c6311d41ce274cc35e7a9179e72115bdeaeb7f696a1e0a99a15edbb3f2d191a51f811d6ebc02d4e0e354c2a42a0a427ed2acccd2415b0d68b2b33d6c2cf6adb9b0669f57b7f25b41dc157f6cd5fc9706a7e7edfb1ad1a3be6b53fe4642c60557e3a84b02a840096faf856fdad03d3cdcd2628decdec9f2253306c74a1c8ac2071f0ec879783505f1c66c3bf503155a88b9e652ac738b25247293407ea2890b51cd61bfc40d17784f87928bc656ce1993c63ae442c35f624491c310ecbd0d09be5369d7e9512e89125cbf0553b2afa0846028ecb9b58dd10bf65ee09c535ce3d51aeeb9f22bc461c1acba54a6fdff18e3ee761216305c9c030a2c57944dbfc21e8ab80ce6821f27e4de4c1ec72107a839daedfd631e16e8b435f41ede947ece220b8e79ce408804045c3d0cbc040f790c8b5556a86601e0a5e080dc820fe12e68063aa8b14c4720a88d55c58f905eb3e76976c4ebf065a95e71963a86a5300b79e18240978ea4a258d95bf248ab3e7d4fdc17f036a48c6e6752ffe0f440b28cdb062fea89eee7b29ca8193aed3ff5ffce4c0281906abd5549e98375d3c7b0da18db094d8d54577afd6255468833cc62eb21fd20022a3f868ba0e9a22c21721cb8cad712aea83d1f026fd8bd206f0bce2fc3d1 +0xbe2da5a9473cf79f41f123520e48c0b37d0b78af0e640f6f85892fac68489e29b9992eb38215cec107a29f95cca5223c +31120 +0xa63c48f1fb7d0b57fc1c832a1176ecc6f3ed70c1b3de487affd325f5a1f9cee648d40a0b8b31c0bf2b5c5dcd98947682b7bcaf06e353dbec32a66407f944ed7f92b337255c61410404ddb43803477d046806bc1ed8b8dd4dd36f0436381aaf730c4197e677f6d74d0f084f165a794b748d3260b29af697c86a95ce2c67625aea3ee6f1f7e3d6c8c2d543f80da31126fbafaa636a32f351828080878e8e04370bb10b0effa8eb5c8dddf775c5e8f757c155d58deda79953a69c97fa07b3e78effec16b7a7cf1bddd3af8d8fe8301326ed071ba5e401cfe45a4744ee3de0f5a7ee7771b2975f5091bfd46b0e1b844ddaa74ee475f6497c4dc608ef2ad81c15c9ffdb82c7766071c276d3fbba08eb8dbd19b098c3cc868ad71467fe7781702f3e5a9fb3c0eddb66b62334a45b576dbb1568b79f580dc0e0c769ecda9de0e22c4c284b6b64a3d617b5ec80cdb8b012bf2bbfeb62fc62ff6668f020eb649c7df23c9168117a415c6c09f93ee09ab9e3814744d34776734c0401ce8a99945d466a56bc7d0fcb6e724df973f644c91de7e9b11ff7b790e7aea2d92eb34df4cd477ce1d212cc1fd322a2cc8231610d8226e0b079df1b10672e283936216d4d92871127faafb03d177353cb4d759f2e91a94c8d7a14d9bf9ad37e690e5e6367540e0f6e5ddd23efe36e483efd4d66f3f1771791491d5b6529a58db1dff2950abce560ff22238dfbdf19696db93e1e254a9827010f8207cabbac3b59d1636dfe7113ea22720a562ab27e9f9faad22f8c46156628f3cc47b5f9f171a80b3b510a1ca0971e7519e64405a5d01df89001f08bf5ba4d1e8282f08a7b18e7b601abf865954d3d52d8a6117f94e530ca00fc19c1400db7b72c1f411852165ff93ee28ef3f9f6c532cffc59c955c71e48ab89cf91ff46afe7528871487f5555fd795e956fd479ff3c8751e38af05c2f9c180ed9a3394d7dd67d2448c409bb14e93a87d4802ebe3399870e786b6b8eadebcff5009ef60a69ab345b8d34f832e3e60ac515cf10ada9705799e014d044de6059a40c2a3e65bb8f00950a3f55a1091c6f801e04812ea8ea805ce32c27660c203d85c5f01a46baa9683a858e27efcfb2f320b8c68a29792f89bd485c76db7d5603fef2989195af22f4b2c7c976067dd11e0dabbd32866566fa26d94bc78d792834795dcaac3ae2212c6698974acd5ba077afbf92812db2b85cfe5ca121634abe575dcc2d721d9bcf99bcbfa0ac2cb048866fbced7f06a84c35ad9a088d453741f4120869eb262253c21d068da30bc6f0d3b3697535fa914b109b5b26111b87d99400d9271f3ebed62ff233063852e3c1e7e48fd3aaefb3dc723067a3b8cd83adbe8f060f174bb98069a10fb272e950e3496bf6afe6ce5828e5d48528874473e6fa2759c8da365978f794623a59b9557d81ae66aff280c656f0ef7f5d88669fabd03098fb70e8e7e76131f445f5a839b71817a77ed5ec458f1ce91be9c21c4e25c9128c4fe248aaf430e28c7c4f9f46ba950d80c297f91ffbef2a22753d4fc97c6c35fd6d373decc8eb0ef4876e87c2ae80f7bb2441919ac1f31a5ba802e559d74101b3fc77b1f38a1a1cf20d5a46f6bb623f1e4bda9b000ab021902b18c8445ed1df75a5aa8b096346764fb61cc62a07c14c72e06afe97fdada887a587ded23ba3350c10d9b3747bf683d22cbbeda6bd28867e8afaa4a8c3721509bf58114d93406c41e40c107cf9b2ab45143fa5b1031c550cf290747a8387d2de219247fb912eeddac9498c6b0602566e19b1d594012721e2bf375657667545ce723d6a265af71f9f699a0e87c96fec17e1186598e1d052c99af4328594c3d8a15a6261141922695a69067f1a6b80d506147c3c02c89f50892bd1f04d34f9f21e8307140df43835d17495c56a13be7a045be5441de01d84ea19d579f76e9ffa0f92376b5b13c0eacd3050c9c0eaaf41d85e5c643051d154b40d08b3cb6c3e5a3a32f74e459f42ef16453e736318dd934cc4e88482434429aeae738711535d79670951a512c047ae745c68ac9dc4d0d92635928c5cddfc6ca2a51ddd104e85bf60bf4c580b9d568eaf1dd45ab4160e792f5b61650647838356990f9e11823d94ecfdf04f785ff7f78e2f8c66f13721dd2fdb5df5c8aa61d892334fb05c1a0d60d26b4673a12db251db3b98b99c4f916bee608e25ea2e1cd1201be7fd393c7d8bdbb055aacd3010055ce8fe3afd85e48d3390fddeb3fa3ed8c7f8de6cf011167dcf7426dd45909879dadfc8d05b02a4aac713b1066d374f544e723de4c8c05f9f7661bff55274d3161cc7fe6500ee58297392b2865e0cd5ad7e320b4f0a71e157971d2ad83a044744ec49a6e032708974fdb50947cea25a4a1fe05094ff4e220efc506f70456a7e6c100dca283ab0bef22d23bd3007206595f924159bec7cac2d6ba394a3bdcb00f451ba712760d77f0bcd85d62850af7ff5d3a4614c1c26071aadbda35be852534677f8a4c4eb0d5527a3825d19f0772ed2760b3c8fd672b93f8a48a37f102401c84a716ae72579c6ae79c359ea309ffd95abffae4c61884c03c9e99df77b6c92e492cacb7854445c0815efd283585071a43828c06b069148cd344a98ab71508c0116aecf60c1959f9e3fafd0ccb0b11468e53079d40db5330791139c833cf879869fc37f85b49516d6c1ab5cad7feb6d497cbce26fbe1b9718a9ecb267238de0ddf5b1e2d0746c4919628a7d0e0f2504b0c377012560ecfb68447be03f6d374a6de02100294b41c0d0e9f53cd7a68862038406e0dc3d4fe85f2a6b30f3631d3e9e28bbe2797f3c04611f939ff08d3c0eab8514877d9b6de5652262aa6b4d6844d894268fa659879c36cc0db1410c6890118f47fcf1c36e7ae2f508558f733fe483ed0b0f9a214710b5b80a77b26a34719c6947491efd792f3e6b0739481ccba707fb116b3b1fa7e948aa33fb2cf1c938b3ddbd76ee91b68de14c045e7c913414cd86e1aa739bcdae566b304495e74f6dc0b1518948c64e1b3360aacd141ba1b43b5622d429dce1e747c4a85ad795ed992aaeaa8c13e569619d6f9e8df9003a0dba327df2452b0c1c827a4346d843cc43599c718639362ee885408ba6118829a9b3e49a0baed075d67158aa0f823914f3b5434d80a101c637549c172146fd93108c3220274e13469c7b2585bdbbbeec31a66ae781338e59d7734bea057fa5a3c8afe5b84e0c3ba4f708a87b596d1b7c8694dbe691d7240e4e4815ad5aa4ca7e5b82c50989d092b96e80aa35e97f99ed79e75cf3b8750d0d263dc208289cb24f516f99bcdf825ead894cf35b78d97e679307b6b6fff58f7fe6b919a27851a53c30dc2b78590be8a8d0d24b940b6312115a5cb1d66d3ff38c1724e32451aaed6d823341e6fe5178d1cc7b7a88ac059f14584f14fc0b3c815b40e5e835bc8fd10bcedba4add63d565004af47e062a76b981546a9cfe0d28015e966f07ec0e8983e9d3c1c76e9b7c94e00d77c443631bfc418aa36f8f4ea3ae19b0ec3a7659d8b2d76be70e940a81af34959df5b2e8be3c0e9e4841e4f6df5e8dc452857b397f201e1c96aade2f69266669f39ce559d1fb5105a5beafa41fa513773e936b3bc15e166c5d06bd78b77d0df0f5144b050bbcb15768204fc5091453100cced6cf53bf68e1a6bca284d11583d13f166498afe29819fc3135d8001ec54559a24e62bad68e0300373dc26aa270712dfdc273432f8dc3ce4bf25bb946d27d81a822a44b45ee570600dfbfd8864c574e44d52379d5facb7aeb25de890f132f216b03f2a9600234049418eb9f43800a0c862d37987877b77e9910def3e9ffe0b54562dc39b77240987b79b4436cb3e0053c2b1e43a97d0e45d073bb8e6a0128c9e1bfdf90deb7034e3162d8596440afb4d15f45ffdb83466d1baf12ad01bf6dbbaa7b6b232838d27220749645ccbe9f97d05a5d117122e650f52362f4339336270a360d85468054c0f31f9c9cf8a6562ac38ca24d1cc4649dd7813ae892250888ab70452b9c2600a713d449c38a6059fa2566e3f730f047a04d48e90e8fdd5b4ce8aa908a9b824c80fd233c5df4a51162708960a4502f1614c0db2bba9f24b5006c557e26e72dbf0b299cc2d0c9cd23003f64c6d8ece94647ccb8418132b39c3f80f16c84f190ce9223919ba07c40f55fdc79750989a75ec5eb80e8f70cd27756d11efa293d5401b275b225517eb91eedf23809ba98f1d62b87a570906039dce2c73e95883cdfeee89a7eee78639de616fb40d360ad5132c53b9676c1ff32436ffdc0dd2672aceca0fc485569ad58018761f48090393dfb4f71e47a201c54315acf462f987133817835bef8c9ce8ff79bb0f39fddbf10a606b50fe91f4a283d3fc64f0b32ab1c53dab13346fd399e1ee082ae7f8dc181b9a79f8942342b26bd8b7d4bfe9992cfca44f955de98911b0de23185ae34c309ac9e7be123e311c838ca5ebd8841dab66b4398972e10477f3b1d5829aa7746010547e497fcc0b0953588d52426afc5689d63095793e8ef433cee610b02a9cd104a50642e3b416a064a239b105857e56ef70fb647cea6db0f79f1e69a3560cabfe23475046de9b0a3dd36faf2abbedd320ec639c82cce9d2c78b45367b120b158636091cb132e16e6654f8f4b7f68ff4a3b030e694cc4c832bfa221e4045e2372546134e2b9832f5688c9c29b71daee2ff262ae9b9d2dceaac547ecafbd9da3a62bb2e8dbdf8d4c6cae222f62f1890c5bfb4184ef9c6e330d10221e1b4b53946c6fe22816e3a100b14c0540229cf7dc468c4c4bc5c90a77c236ad30c71c14782d875b7d346462ee9cf8df8f6ac2abf0784bdf4dceb1971f729f55cf33ce54e172089b42b4d04768a82b0d779c1119db79a077156ad4788c86b0b833d1c09942d26a2e3308c5d3016b593b9346f6c5efc330a03d1ab033619711511931a1562ea73290a8b0a37a3b4f09d66cebe234bfdd62d71f5eb36c10fc479cf9c3cf100798e84f2e4cf7c188dbc36a5f0b61eace30bdb856b77c672d4eba182018c86b600ff1d63e1e412d7c9a0c63f426045c9d55b7905db579d91906ef3f56912bacca84f5b252d50e3288f25b5fd6bc381e9fc4c70baec91a1666ad6d9ef7dd576899805a5ff6e1bd55307d16ca514e7b8558068286c472fbc388ba9ba37e5dda337f9a965ba4d4ed29f5b2f51ffe4d5d356883709e39438d5511b72fe964832271cf2c3021e71f0c156b0c4cdd58494bb323c407ce67ab5d3f741b60cd44eddec80acdce4f3830989be311a49ed9b2c5631c50be73fa1ada07325ff4eb9a0e5d8ad4e7b73012aa2141f03b82b10d2a68e9d4b20b3b4b228230df0d42b0ce652d5ea012917100fc149c35126dc06d1094abcf508490e552f440ccabe0b97c72cca7eed6d38e7d97110f141edc5973f5d72d8ec4a0f1431c8ebbada445620ec7c9eb239cf3e4f31b751f0fb944d8bc5abed37586e6f90effe005d49ee75 +0xb236f326dcfab7c5ca01b0f0e172e77c53ff4e9c3f0686b0e60b91d7ffe134810dca596fa2ddc11827883c1613f74960 +31912 +0x8050922bf6bf1a5665e0a71fff730ade4e2942646a0750846f0c47d22e13a3aa23fbdb74a8043a27677cea0c159c52c55eada28d1b6eabc1cbbaf5a041660b4f9a691a1f723fba13588f0c9d7e0b05a9b59709dc99aebc1e09021556db63b474cde275b5be3645221e5f345ba389cc923d32a1da4d8f2aa2122ccf7c63d44324a4b014bdf3b2815da2358bcceadd4f89ddc5920e9dd99e55cc804d9b437f6364071a20bf787b16cbcc58397abcd135957d970401f253bf402046b43ae22cba3ede67c144b759ad75851265ed822b26bf05f11e39b5c7366af6c52fe2a8a5f0b911e01ed31714ee61b3a937aba2b4cc0e5e1b08404cfbaadc3746e31afdb1aedd88cd60f4007380993f66d83e8634cc8a6e5deb9e21b7c49cc911fb6a49179cb32c76ae2fda400c251291702e9473d13b1effefd99ac52cb4966e9d5af4a06142e322310d0e41390b137226013638812a57483b7b21ec892b85a5f2736614a593961a1115023fb05529502341d34c845eff82f80c1df3830a7dfd213c083b12ac2ea775d01f01180b3e758f75d27883dffff34d12f6a3c35868bf523e40dc4e97910f85c4cd511a33392791269d8226b640e3631713c4f11d2d34afff77c1015ca99a6b7b75f55ed701af51db9b3214eaa99c61a2de1eb562b4a15d0916b0d4015c924c7d7db68bfe8055f81c3452f6832165703cbe78b52ee55187e483726e90943d53504f5c49b19d60ae72d0a8738a9285b86b1b9b9c89a88b531628cf791038e5a57e51af42f7401a9a63d7fe3406e34560ba5e50107be596e9296c8e9a8a30d06d8fed771bd851c9e579b11ae0fffced91aeed5db90d84bb72a5b6797b056446d1098a7b7f5cb9b6b63cc7c4207dc5c572d1318a41466d4216107056c489bc91f9768f84148c5e2936337fc69c8926142caa92a14d2f8873fcf401ee1d1f20f80e5d665a826f29698de642e7fb2a0724e6c1796888cebe954dd8d1092ccd78c2384776c5720d02c0e2dd79eee669503bc99f4ca9972df5f23045486f9c9dac389ebb278d8c6fd2745da18aa4044ce9a2fdcb742a255416d0cec2cee71397a4a26941e179779c7fce28b9dfd1fedebaa1a9cd5ab4d8490a784fd7cb3a39c24848c0610c52dc9cf31668adde3d7b24ab7ff52e650e5816b732da0ca730b8268171cca410e0627814944806f1af2428a5860a75fc024ec3074697eaca9135cb3566b59156ebb237cc90ee4b7ff0a1f18efc102a89566256e1fbaff89c255bba4d70a2b1443b73e102518204f0c99987502a2ed673d33bd92c9a4abe86b4cffab2d5bb8a43974e7f9e202db9abffb4f3d1588d0022418253d26b8fc5ee053c934add2aa6bcc9eb18874516f31a5d9b3cfbce5530fe68decdbab6a7943de1488effd2148d1597f1b4a7086739a4aaf66ab4d3adee6f0ff84eccc3bab4dc109bf2b8faa4c5b8ca095be5b04514b1ad6c86e6b0bdc3dd0077def0d9efab315adec75d9fffd80b2ada162987da0ba92fa69678aeae36b00104850e426e03a687b915d507504e787e0dec5bd34ea6f5f84ca55213a8d050db474c0e446043a25ed3e50a7abdad659049e664ddc96dfbd005b85c27d2172556e73ad828edf48da8d53ee3426e7f3c26370b2aed72e9247f79d97e34559598398d5855363c9dce2d662948a68c4b64097e63964b71a1d8cc510fa08059d20f4ee0ad6bb576c6cfb52fad21ed3f9a4501c7f6903eef1d80813563aa540555f35b894103efc2f8f708d8d25660aef347d5bacd010f14e68264ccdb84f881a6ad292f1c062a49b9aeed08a0d04702ded24ffeefcf070783483ebf8216b4f64da3807b475aaf32945c2e672075ea62e34e353c64e46cf17c38d6b55d49d08cd23f2715c9e9c6a60e69919e592e90f78b23501b352686f95abcf6577603936abee8e8a4aa99b6cdb13edf5553e482e95db96844697f9f48a43b644dd42d47b9990589d0f254c9ce0441df33177d095fe279455e08d6fd05e21de93e7fb032a0e900d343aa0145d28fdb5be1ace36b81a0c9ae121b12e9599dc94dd380729c4838408ea2da887300db7419071afcf07821126c08a81dab6c5ba958b3de5dcfd80d2d829888d19b816f75e34c6ab2e26cedbd48e7bade8b65a724d286a1581279f12f76cbbec3057cd3447f58a3eb87848a300758563dd16c06a282f6d24aac536bae34e38348f81a904bb5d4cd9129e982d574028622c4ab028b31a9771de68d03128289e047be832df14f68f18b0ec35d13568e5175ad472248a7479bb8085041c32965dba99dde329d13bb16c17e39a15174a3c01ed46bee3fac7943035ac3ae2af11e7f54de5328b9cb76441bc373d8f997ead906813defd908e779e6230fd1ada15cd131c80c96ac3d408381249a8972870aa613fce5ac7e82384449ad5b32b503c9db28a52e04de32c2dcdbe8d63d240cac2f2e8c8cae97e414ad143ed05aabdd0ba422bbe4fab771a45611584e7b77ee787b407b5a7b8af425ba2f1f96d0f5f8ca34055454019fc48dfa0bbc2bcbd3f415922f0f769dc17b10758298d41cfd1caf94bbb6a6a0fef125cfb25c94b5a0e82c7ce591099ca24080e6f6f0b2c7291061cb2a2903603cc115ddec7fb2c24690644148483afe970d1b1471715958e39e89e13cf793c8c1fc052ca26ead792db466ea427e324d07a88907dc61f157928ccfdfd7667d60f56a9cc5bd72ac63bd1eda7fba7918105ada73c72009a14d9da3dacce5c0eab041d283af23d1d7065f956606978315d0f76b815d23b192c16eab53b04d4b01410bfe62f2bed357ec79e0b589c3e2511448235ad0cfa1ec3b6c6ce193f750eb9abcb4e09774c2549d75c86d0f25def364b4caa7280b20d643ffae2d7ecb16cf43bdbda5a42fe4f5a0b91537a1a5c12448a3270f6dbe7778628f38df78b1e7d6c575e15a24d683637caf8fba462bd10b497d033ba8d2effb1f84d39e8a910927a74be7a71c51e5c6bcbdfd9f069f58d1eeab26d2e12ece8703474712bb53c5ec71a9993396885245e54d298de9e99c9dc093587d1eba5c43953e5ce413df634aacf6bda79963140881c6d92df8f2e698469e61e4695ee3585dd2d9bc9a1d2b6bdf991caa2eca72381790d6273aa07de9083408aec902a9eee36b884159f6657792fc7ee55ca5b3fd3013e822b8dcabba8ebe1684478ef72bb0722f1c575058954d86abff2bdc207e53b6d6c6788fb63061a2540de9ea153a4b4d97f59c154dee999f6aa1a35701e408e46abc849fe775084a87f2b9ff4b413c668872312b8caafdaf8473cdfe9e56d8026aace4f686b10b1c7adabfb3e1690c24ca3e1d7c5df0021ec21cb0ba3efd49799f3d9e7adb0bf382f46e02ef1ed942ee24ff68ee08e82e55ea4554712a01e5b1d118bc152dac46e3bc568a9c4cba662e5f5e1b6bd4bc0cbac495c20cab893412c8e545aec6bc8fa79b395fa0b133004b43023dda0b9121b61ab5017407bdbd054b4b422cec62533559bf8ae5956d99ad9894d622f392f7b2b24c198f86c608f024f2ba79e8c61cf7be911251428fb8bc26bbef2dd4e415145503134772cc9d3c1983b57c021171549157ffceffc2e6e0b5208ee2f8b20345cb82f68311f60552f3a63c1d816bdbb49cb85943132eaa810c6abe29a6224aaedc70ca2bad6dc79879025544affbe17fa55d2997c7fa8c07f44284ea255c71b6507698268c596b7875400bd9d2ea0b1e75ee77b4634f14da3550ea0dbe8900c4ee3b675ef6e17959ad0763c4335fe1f7d41249812f54cb62973bf77bb9d17f427f683fba352d7aa3eb0067ed1a83ec738a71a9e672323807e2acb31a5e5b7797cba428229066f6bdf5d31e3dce7eb3fa5eb49ecb7610e432dd4a27d3f450702b9a982b7e4eb473119327909a9977bef5198330188117554951be5a8fc5d7f066b4eb4fb6b83e7b068fa4c6edc19696ca838568b5dc6e15b606af5434171981b0e1469db3162d9504b0f3c71f8f05c2e364634d8bcf3facdfc4c61eab333eaa71e8511b5bb0a84a73bdbc9b164be9caa684c5e880a1afa02e53abbfdd616df41192b3d397cdd820bc7fa64bbc3d6d377dab513f7d9ce87b097a053fb1e9cee5f8a715cd50b6e5a145be5adef8adb690cfa0b25d6b0612c4da027ca70e128a078eef1e106cb4f6557741805cb1e2ef5d042c8e473028540408b4b9fede25c9e23c3177a4d50d33c3bad2bfced1253e2784178e07b64ad7c2fb56644c086ab2fc6837c7917109c5737737bf3b3fbecb74b62959a3e3b4c3861bb0259a74296edf7cc7b7df2af2d4ed143929abe3f5bfcf04299826a1ad3fd9d08ca2ef0aaa2413deaaef97e60e87bafba0a526a51142bdd5e1f295d77e734182b08653b234fd1ef8a816c18fa707619234dab56d5c7bc8921710fa6d70884899e577ce5411218a3088d4630c037c6a43bd715f231c9377a194995c4ac9a6767df31d69d887b7dff014d387456a0d5e7502112daf9ab2526b2036c458d1f45296a2222b26dfe8a39f12b8342226e2c38fcc6325f91efee258828f397ed29b644dba2b1d2661db60a44b2e738b7e2424fbe30f52eaf0a2aed1844bc3a412c3340802e345c154b99d6987db4b68b9fb06200fbcb96857c43f3cec126ab2da924b3043efaddd02a9e3558d67c4a1208ef3661812645c9d8d1b02838e37917233302e45fa5d63b1d4b9d0277be61efb067235c5bb5aaf0824cc8c1165312722cc6b68d0aa5b3caa61a7421bbfbac8928a0cf5df5ca347e1b1da415e3f615d32868548aca7b14e3579351332da47852c43470e2ea0480e6f5ecb8831c5cd1ce9880535a09a67839944ecac3475953e1259aee97a2c50ebfc5129cb549e7f4a91fb7397762b83c220e95373e937addc8df3c6ec8babc3c5ceb27b718d737fd0700658d5f4010ff21091f3d119c99645e339198029c3a9862eaa4ae2a5ecd397ced23a59e3c512fdb263522f8bd258635c542e0e1b1c0b1564611d8564b08586f586a48a0a1e95ca4e88faf308fbfc1c426c8dfc2a5ff05ab8fe7cc491689d842c4b1bd033b59f412c27738758ec895adba8bfb31e34613d72a9ef06f6bb217bba4929932431384a93694351434c070471314b9cbf4265a6d98cffb459521b52e8a7553ba63c68cdcd76f4bb91c37f024a2fb91ed432047d36cc333483d492f1fe8e2730817b38b220750e2b09fbf83caec992a027ab46aad19414ef3cea8f40442528db7d98afe1d58e170b74997a99e7275c8c7e563415f20a294d4b3c19260195dfa2623bd64333eb99c29a480d043c72a249a2dbd5a7e156fab77a71388e7f05d5eef70bb3be84b11bb843aeba62f4d2e93f5be13246e5a10f938f32f45d049e902805b1513b0e0b26553773889c586ebbd6701051db4813f14a5326567cd9879ab654d4b5a31b1f41013d40809ab06f9f76ab123c4f50d327458ef665d346e97b02ac1de9dcf115f4241fbda84444fc1e87d28cfb88460a39eb08492a4a92ecb972d534f4d0d816c726a3910a825b3ebf71ae29947072dfb0a388c8abca07b7de7096c0de651a4a436f9264ae3d3e5d0a9c078e11ee1b7b12d7d81bf239eb737263b96aaf85fed8ef67b3e09a5b36808771a56679e98a05eaeebee907818747fbb3 +0xcb16838296482187bce81d180666b720ea763b9dd3bead81134f8deec96c98bab0e938651e6c11e6fbd76fa241cec784 +32704 +0xc0947efb86d54644087247f9fd95133a94075faf6250a2cc9f20df5393edbe1a4bdee20e90e877781a370a7f00cf9eee7373fc38acc54aba23b0df3f020356c9d95ee18f9352e042a9c4b3949592ccfb8a7a08b262373f02d8ec1abff7c62415d2dd2485765cab2a1de2e941a428c4e83fe32c266ceca82c259e35da5a7f51859e2353f8214efdb8de59548d15d7af3dfc780f9bb22daec0748cdb99137704a2a5f815f07b70017554f19d80d0e8b58328ff5a191b4179472c7fb2020af366f2502412766e09dce8e7716c22bea3fd412a41b4a991723049b43f6220283e9fff056ef391e263b99a00a3687cc54fb0ff6c06c651fc06fc4c769494f8539fd6512da0604abdc4be11054d3a95ce35f5465515371b424604dad946f094745d346e318000a8e87513d760388a75c29ef59c4d38b00f4c7a717a451c1dfb74c1e0e077d77cb34bbee174772cff2587d0d88cbc35d93402ea6ab522e0c4353913022f696c7b73cee6506eb4f141ac0714c59b0ad559924cdd1811d9588c4bad9bc4e16e09a6f15a37874f7e4ef91228b1e453a0e0d931139da218d04d1e44b7a04c80ed74a534d5f7af9e3c0ccf60d4f15e3be41e001a3d703152708621283e6cc29450761f44296fefe458f36a9df21a5bdb3f577754b49fed4621cd3eff2c454fa3fed7bd2a3ce770a839cb73d16a7502bc1a52e5e75e71fd7c4ce81dd268741b375f5f26edf8a75972475c9104244a7c65dbd8f3dc25308a7c57a065a8da404dd7dbd6029543f6d3cbea6e6d3f07e1f15eecb1493af022bbcfacbdbe8a6af30d0cda03fb2b071e06398ac8ae89fd818830b3a58e09a691b9fcb107d27f00d4855cc4afb7b52b6519468f33fdebee7369629a7c6a5131c3ab8bd046468f842ada5201a2de3e9714357a6177026cc000bd7c07fd871b7801ba047041c5c2de3e3773f9a419cb3372815c685c64145c6eac0764f18a6e63920ef0f8c1f521f658c249157d1066e7c926740daaccebaa055d8a18201e53dac0ced7d28e7eb3b4bfa35bbbf46a169b5f4b4ab628e1fa920ff98d8b52e9d1c5d1233f6570098101bd033154d3cfe4377e1967cd9f4c48fdd2a798254f93f00c0e34b2192f3e91c3980a5449e0e9d6a36cb852b8d7b4ddd19790344edec5b898bf2ab75692c4ede499df4b00e45df7c7714f93e198c2c2f8a6dbe86ec927324f2c2cd78462449d4a08ab9ee3a6d64c8bd706b3aeaa1efe5847b13dedd660651a9c63980b6765a7df2d95d659f0fadfd8e4063989d46f99dbc23aba33ce195ae259f6855469d015894fc67ac98871b794e277add9df5d9c685e9de7a878f9178da90e23c5302cef32b865129d37e4dca91781980594920ee665034cb59ea9a604d5d3fcc783223bc1ae9b263cc5fb57fdcc4a8077b8b3f73f1d9372c006d00f30246c97c32c5a031e7a903f0efa5d2f7a48fdf096166b605acf76e033791758f8e0027c1ff17b4e31646be47b9eb36c07d5c06dca755f501fc2d31e74bf268b434fbc34459b2e25e2b3559eeb78a4178bb9bb817b9c3acf7640d3b5eda0a4affbbbc3469bf21a8f19b175f4c651d936f03d18b31154a2e5478f9e2c04e439cd076a3e3a8bbde894bea4f46e74f1f9d41da9fc8bf4653f9b7af85b0b23528eec4fa556997bc63f3cb9d5f9945d20adf6fa4591928d97bbf8f7c333dbb1b44b14bbb333e9d5d3c890f28cadefeaa69da66f58ff4f42b2bb04a6384d2216d0184d33defcb500ad2a9751113706814a70eb642c6e4b7c7deac8709fd26bb96e9ba09f6cda82641c0e59bfabc0618cd5cfcec107050ca4c1ed4b3b3fe93b04587f14e7a6f4da69e71cdf22a37089711061556e32ec1c20466f96f161bb1c5e556ab2f3d4734477d8fb3064416e059ac0cf8a53f54c035ad416af784d6f952f2c0581ab3e7e49f6b554546bcde35d6db0c07559974d47b8338aa0ba4b2e2fe0a6f789f82b3e6f4e47ce54218ff61a54a7dd1d66621672a42a74719da32070d78be8d2c0e5da41e75612376ccfd0c3b66cce8a639cd00c85837c280b9c6ce27da38265edb27b442aaac70536d498e0fac83ac4398ea29bc30449cfeb7f3b0d3ab56a4965db49027d0a96c766e777fa8a83c9d4ce80b5a9c676846d2494b478778b4b8612a76b02493f2784e4509598cd6524c10cba30bdf5a0d40ba02300ab9aebcb25da600accf7122144985719422b36f393da833c60ba4ce2b04674462e0d9e922da74c4de9ed482d0f6a442c800cbddd521f2501187c405664fecfaf8a366c49a660b55de095acf2ee425ef5dbd8c38b07c5e6a670a445d72fb07b63467f1c9898ede16139560519e808ee9ddaf710a5bab30f54ed98230d1a44c189ea4f78260c3619827d971a4906a43c4b06d26cd271d1e73219c1a2a12ca3e949fe0d469c0922a4e833c2b42b4ffe9028e5cf9fba3607b8697b878a3b6eb33bcc0b234fa1989bccbae33e9b66cbfe325c01577006103dc8209b53a282e65dfe3a99f85bdec089d721157397a3828d690ee2d3a85e085b6180028bb31f9e8a7cbb2ef432fb89d20e4452c9708a7d917f660ea90f692449c9b1379985b99e20fb75547f9b9ffb5fb94c21a8edc2c3f3ba8d0f436dd06eef48dac2e3e0f9ec09c49392015f721f1820600b78d8f45c9c63ab6d078a3aee3628232cd38c87922b1f3b70e2461efce58aa997a1f7c75173c1e7ae5f2e50ab04afb5fccf500a98705396778a18489aaf414e4d8b13e4a95f1e6a5cb220baad4327b8ba41f62b04beaacb2e629d9a025c8b78b59ef3f26c4ac05cfe67291ffcd9d653ef904491e0ff6a021ed09dbc3bd6b14f5843619aa21bf0e41de81128a1b005af222403e4341adc65cd3ddf564d03fafabde0238454baf62a409ca07ca3aefbf4db65face06f74819c5122c0f41cdb0a26cdf02578a0e1a57efeb9dc40abd0249a2bbf3f5607ef6498eb54c8f1e1b196eeea6c6bc4a01a493b33dd2a7dec460d6008eb40149972d1bae90077fecd47f87ca9f375a9e7adb0512fa05ce28aa5ec47c46079bca2a37b7af092587b4e2281488301cda8d6209d6968affe0f059443b9f4bb26be91f5a46198a6d4e7d2c5d3eb1c33fe31f9f742dc75688863cb85a62ef057d18b05edff0727aa87d4f9a652dccbf661e5d1a64332cc4686816afe762f6dd324b27cf0edc44419ebb32148a08618c5a324ebb23104d3d662d852635633c3997ab555b2e33164717b12f8212f8f892e3c8fb6bf8ebb22a4b7d92058a8c488276e142e8891c71f3db074dcc46241a38c8886a102aece4f1df0243342f05a2219594f65f65c0dcafb16495db6eb54ee8d319a593023d6afcea61a29c6cf7d27cbc6d7aa90b47dfe363700d95d2d21d0aca24b4ddc803ccb13445b723888a60fdb513d5acc3d802f5b7d4bfe3b9a40e0476509dd5c469937a845489b2cde5d50b47300f52d49bce4e7638b3ae6d52a93f9f466a623d9446bea43620328131b90d3969318288b9ca566843f0dc340576230dae236e7daf6de45a948489ed95926d54684124255a7f75549e7e5657e5fe19872fcee0cae090566f16bea1593aea9260d54a1ff4a5731403f165051d19c887d77175a06d4f387bab63d4600d4748e42557515d3dc330993ee3add0d0ca5cd6c31d1f95ae26ecbbd524d1b050e535cb6a9760c548dc3e6ecb1c5f9eb61f436f14dbd5a9d48a357eb700ba786c3c38aff93d7e3f5c1723f972458359194104b891529ec329a59a2c17a099a0a773d9f898f0b4b3c29c69a4fd061fe83f57271b042b82cbf39fa32dbeab750f4ab3a00e10580909c39497d632063d33718a35ff330d89aa7ba0d8ea74ca57af9c23165a281e8529a52736f6dbeee422f602b5cce8a1bc4609cfc2c900a54667e7ecc242aaea30fcb07ccd6ebe651d9d18e62fe9e98f2288e454e8332ce34a1f71352c2f5c6313682ebce4a5a414ef8c1d5e2bc0fe7ec3585658d291be2d6bbf8427dd8a08323556650e040354a262d74e9432b8f116a89fa50309497f2ab23066ea5cb974ff9eaf9e9bb3f098b87e66f3adcb398900d8431a7c14c5378326585fa5312669715759218a7cd436fe4c2154d47fab8de45b2efdec7b6baedfd020b980e537ae30673e3604e417f71bd3f1b82fd577c6693a46967ac7a5abe7b670baa4ff560de5d64525317521a3b81bbc69e65503fc387c752c4f7fdaf843e231ac3907ea4c38ad553538b65b027c2d6cad2287b8f6f929a209922b715b9a5c49d566865b34d0f358b0422f2bdb1010e7cd0bf4fe7e534ab5736c54d49d942aa27e5403108d56b035dc7669faf81bcc1710c8233e5aeee695b305816a86da5623ee2b06731f71ecd402fdeb311f466ae2c0829cde5373052c11843a9bdd14e8b36f1217ebb1cab01d69fe3d361939f1322360e848318aaf61d41107cf6ceae63c4731bfe00d0803f85ba2e873ae9b69ee838b8ee2bcdaed1c46d6716ef9025aa5bfb185baf9d4ee4d1e11734ea515dbfe262a1616bc0cc645adf8ffe04d074bd61fbaf2e23ed67804fb726631c84e4e4a5566094bf8c743c552a23a8e309fc2b6af738dbea4b5a9053aed4a83ddefcab95767eee839b46b827dfaa8de6972c62fb705deb7f21a893823aca6acad9f573576544d57477b46657628d339c2295f287e986d36f2ac2185fed402140007fea6f855afffeac3dc5684554308016c958a4d52c3a16a1478d51290e6239ecec6f226949a48ea34363ef0a97eb1efe2713b6c5e676123f9960ea806db414e9db8024836999a0e775b03034b0e9e5434fa2423e2e1dfe504841a085e68d6d91cdabea666315d1f34538f02647b35f80a392dba07ba8277dd49df7ac1164a08f2360e874aecf9e61227c8381b4be0a20a343f78f479b1a32bed4746576c05a1c8d4db350a51d728bade98ec9908061cdff540a6d2a6d62f967939b347f26f6c45ba0bf6cfe85db0d480e66505390e2c2f841a8cc8c958e4c8f49c0aba30f03312f28813c13af445071699ec8867629ba3e7b372ff6b9f8a66665a94d7aff1bcd68438d407ce04aefba69bc94a196930e228f5a09e1313e91bd85a96c7f6d8d03a760580ca2cf6b4593bd34472d78bb5954fc65dce4a1cc88c50845bb18d0f37e6d2d66131dd301fc9da29a5292a30f0636210f3b79722f164d9c02abefdfcb981a092bd65681cb7f28d85339698c0abf56bbaa880828d2a4978f64a15cd091eb3e623dd8d5521437d5bcf37e2aba3acf271acc55293c53ce4370e04e0859d2d26ae7009d22da68d114deff934eb42bc037dce91545332efdc1df0a044ae1faf7fff61885c77155b5769cec1b5df03a2d0960856af493c0ad93285666bcff96d69e2dea452bbd576f7b952d78c0f4f2800c4425a8afe4c57857fb39d7d70922c8a5dcfa3dc824ea698456482e3038f143b0f64e70ef8c89c850b638fa11952b78a7b1cce2452e8b2e213ed0cdf44292f2b80564362c11aa284df7e820053a1d51241ae6d4fb60b647f2ed3bbaa598741761e00b6b0e1a8312801eabfc2a5e74dcab96bc888331f82149b00d86cca0f12c4f24a8a1ddedc11197b918e0e988ce859ea3c26f5538cd54c635aaa4c202b69be021d05d3421d09005559360cb3f86e68dc09d1be9dba25cc8fcb7b73e2420f0b585f71fa94d2e285952c01e67e94a79e98bb0f0c99123a3f273a910998bbcd54fcfa14b95d65644f45f135c181c65aa425382907d0fadb4b318e3635ca006941f4d43739243d57076c901bc845f751218b6a67d6c9 +0x00d3b9396a09d37e126ecceb86f5db9e8ed94065646f4d3d6bba15e8318ca9f6d07e363d60dd863ec28ac2378ccdb515 +33496 +0xc17b3dd94c4f9f562edba48df48bd57800425b2477a80aad5ac69f6af2d046657241600ed82d823014d3c1236c732d441f5f9ba24853a8fa0609fae6da09c95150bf9e2ee2cf5b6919ad7c1ef5689c0a8fc63b3ffd96be1b7642b77ab6a4672ba41a82a133dd31eb868e5de757122bb299a0c3625c1856f8f2975f90504829dbb67d91cf93fe0d9da3a0ede45a1ae1248515bc752f827779c130798f6e9e1549ce0e5521c9daf667b70bb37ec528c7489b4caddf3c7b2a862d368ddfd94d365e34f555fd9f1af4310cf7381d62e3e306236e1e084cac76077cd124e859fe91002f5b19ccdb660fe3e88b022af7f43f4764a2975826bd63e4f728c511b659301809682af74665506694ef9b0b4d02e3f1a711a1379455f905e664f8c4b7051a8f08430fe4a8c0bea0584c8b2a2cb6d5ee34e2c30d5c1c415291ac456925ab574b751550fdc91f627a7bca58ee5cb81f24533e864247bc42b43f293566c8f2f036980576a9702842dc47908cbea4afc97d4c4d713e1dda04113a034f246883ec37b83c084f678668af02c7ae04cd44d9e066360c69a6219053c8611b0bcd0553351ee18e5974dfdcd9f5964727a01e5934ea22df2ca936ed60326b2284be212d1a131d902e60dca4446826de8fe2e65063203873edf0c42322c04bebf5057f83cddd189736f224cad6a29efba45e43c75450a14f1541713b7fb926ffc768c65c36c4f92ad9f4605679ed2727cddbdec5efc284fb0d65e53c616727e463b09fc13d12e9d27f2c374e148fe9e875205e521cbe0a003c24c92eaf1073242fa5b1b9ca0d0f16906452bc8fd10bc901f66c76c38b5be50945c51a51fd3547950ea54cc5ff947e746258a7d2fbb64fda25b03acc729e32de9280072e7693d3fcb42282162e9f9293eff218c45511046875d1a51fbbfc7022d1a3fd30c2b552cc60d164a5e359db56d2c8164f27456f13ae78c0a5ae9c263ccbd5043e2bc44b6cd859f95a65e9e023d581a95ab8791844974c924492a7dc9648bf2540f7e84746e4644a1efe782963bec5d9ce51d68861f9f623e5b1441a971009671f6f48cdc14e975dd7f42e3f7f563eaf913a8446d49c1d7b71519c69a7ea5ad3c1db0d6545dd9c3c6f9032a9dd6592328cbbaada03486aa3cebbd6502e9f5a6f0f835e973a581befcc1aadefe7b3696ba71c70cd58c584a2e6371b5894f8b245f1ae64ec0988bb7cd8dac69a04076c60cba4ffa639da15809f0c930742ba0a5d50a647eb183525ed7917a6319b2a421bde9c7fed1051c245e38465e89eb009bd12b12e1dd026014a991b743c16e594a4c94c182b44f035fa99e5ba8011a1586f211841089925f6991f2c5944dcfe0a0175fcf0e63d8016a7a978b95904549f7b6323aa36dcf8ace4f3937dd0553d4b3cc9f432a963c80c52fa858bfadd9285e7c2198e2fff68cc32fd980768e96c005dac7b04f91e92c005765457eb0623b2bd254418796c3dfe8c258220940051d06a08db8e60d6a4dac7042c46b5e5cfcf0573ea6d9e893fe9f9539befdd02b6646dc45af965f3c701a18c5780dfe45e84c59654b826c03636816f299dca5761636dc8416d91ddc3dd99f71b2cf16997780775ca1f9778e98c2c617551e4671a7673fcd8116afc6017ba2bc17273de4354d2f893ca7b1821940311c734b19bab458648660e7ab966570911907beeaa2abf2f07f9e2590aa6f60d67676ebb59db77ae94358c497a9c449091d26fea351462248a428fbab54059524c9c268a0a71b5f3c88bb25da8cb875694cd76ede7c9e4bc69b7f82581b765dba6af84a41736a65eccb1a840acbbc86300cbb6812810effc8ca04622d6d2c3af5fe8b193e6f2f3f688ef977aec34aec0bf125a2d60b328eedc45a0391c5a1bd65d8fd5dfe16c43c4e48ca791d2fee174b7ea887af77839993fed2ff3bb1814598aec170e6f6e3fcec9d2ff0fc5e00a87d29d68ee5528ca059ee21bd71bd1573fcc47a0aaf7be8f1e1d07c87c2ca4d102f6722413e28b823be26a8b6ea5508c900de7983be325dabcca74295e7110ddec0db0e17107680a42f1cea73ebf5c5a55341526479a6bc8aeb6614b3ffbedd74dfea0ca8e2a880922b55699d1d2bc699529197258845802fecb1555a63202662db18a04f4b5b428e4154986af47396258d43ba5f509b430b4efda701c7e1933950eb6ba2b0eb20f8ff8f1995e849beda61dc3e7a79146fad60cf6c42847f8e58cfd6b12b99f4a652b4894f768f3aab188ecf85ff484d7066e09b27852f568251b66f23428ce46d3c1ec7bcb55fb2d5705292336674a2fff83ce56b522f0319b4931934900056d0057ccee3bab03ee8626bc8c93854b168b1e432aa221a11bee1e469679c7ab8695f8d0346ff475b3e7f28d7b9fd8f0545246507668d66eeec7a28d43eb07275a39a9e09790b7b8452271843882e79fb0fd03dd812ec9c071cddeefe2c847e3b19574e45dc67d346cdeab8a0a633ac1f4345dd2941d83006da9d952ba371046525060c4cf38cd51efc3a9853b6a5abfe69e5d17f75d8b94ab029ba01461e9b807137568350f2f77987a725f11c1ceff4fe40a94f21569e6f0812dbf386e5aa19686bcb8d7722b0e2dab0efed58d1eebf6ae6d32cd6da65c07ce96996e85eb6ac8503c9dfc8a4a7e77fe864ccef9d3eaa5a38cd7cf8ec960b790de14fece2579651afefdee7f132f3e19e12f462a7463226b716c41a05a59c76f0e1a2f728f37358b08c2f3780f8a4aa72791834b89c036af24da6bcae2af00152d924b99b20cff4c64d2549dc4f5624e6059ce829a68a917ab079535e8c92a274363986a14618d041a175917bcd950b6956f6ff730c3434a10dd0709f4110d5059775f0e3f9ca55c3077490e7f9fda88cebbaed4d239ccf15b43086d8eee703675b5e7adbb2710fcb0dc6ea993adc96c1124d33e09320bb39220e2893fc81c81a2057a6d0e68968ba12d0e11826de4096895255f5c16c939bf5edb868e08dadae54f5e79c2c9feb20c52726ed445f508daf3ed5f534dce2ae9e43c8c041470e9487bdcf75fb01218f832e2e70f9fc2106f277466763fe22f199a4dc22755a655d2723c106b8798666db7a5a4bde215ca3019ff9b4e55cdf056685551823346c68b1ac6eb70b5594374c805ce6576b4de24b1d92662f55614a8369e619a1716e67c5cc2b1f5a21d58134d488d90c367f354d849303a88474417ec6e19f967e05aac21778983b6ac4c542fb708c531f8b1c67496e15f776627ac720ea1268d6acd234f2e9ca159cdc83f549a688c282dc2846e096058297c666eb0c622a9ef7de5eacf2f11d7f34a74dba539d46d10d0cb96afead6ad0550a8668fddc40bf7e04a088ac211adece9f7300adb75f151a777021e816ae775ac969af59daed30b5da585672fc4acac73fa466cca739f537b6bd2a215458ddf56d714cb4c098995ba9e6a4dbd515b9baf2426b14cf5007e13520e25ef8e27ad1714dcfa33fcb5fcc0dcbe26b5e14222671ed7c3aa239a3b39d2bc8e586e3e46b7f5f8699ab0e0a8370889d95f9beaa7618f61882c26f8f0b393e6c5960d5912fe2172ffc84c9101e7c9d44e03a8da946620cdea19269f074a3e93b1f1920079b44152a607f9516f97c8a66de92f9a4f3e7922d0bb4a19e6c67bcc3cb325bbe3a0fc9e459ddfa75a11ad071e5959b342b141682158bbecf7eff1984d22f013b88bfb60c3d3251b2a1b1fff499a4eacd38720a7c739a1a3a08d49ffcd88188f603de69f0af1f435477ec697d6f5350d6c87c0e8a9a623c34b672b09a22bc8b8447e6464013f737e19024bd6adb2365f747bc632afe669d65f463dbfb5542614ca161db69005cb7d096e56c5b6197b295329dd8ec1439c6444f22a28ee4a5a2d5bccba9d9f8a23ba7d8c8e6ada7129f37059ab03c703e4f36133984c35578d8b6069e3211617a4bede229ccfff046b4635d5d899a96f680d20d1303473c1e7b43fb63f4bddf4751095f927fc0e1867a809640d584fcf5139e89399e78ed18f3262787722dd69c03908d9d8f7f0f645a454cdf249a26bc60022427b6d70cfae8d2f7a32aefcbeaabfa18957ca8be62ebf7fd92e73888af0e834a680cfff036b4b108319f8233a5d2cc7d34b7dc92f4a83f0506adfea76f77b87874e1425b4eff66c5ad4073b260107e17d5d16911bc07710fa4d93b175024183ad8d44c92c6115aac80ae42acabdd95950349fcaf0b923479e8099c3d039c190e0e668d3b1ea3134956395da6eba299614791f5ef75c10fe06aaf90acfc58317e700872a8cb2d171898924315a207f0091d39f3478d2c59bf874b96db9ce0f7e8b85a9b805e07dc96b219819d51663ff8eeb2634bb42ca883d85e3d3d87bee2f941ad664639dbea405d6fa7929c45efbd568bc4607d5a82b9d877e2672f5a790ca691716f0101a6a1d4d51389c53f75c2cf36952a6b2e6eedf1f934dd064c20bf41a73b6f2621b837c31a54077ebb78a5c343640de030c38cdf729303aefc707dcd5f32db2ba4958ea28ff7802b325ee2dd22af8f8eda3702db748b7f7be3fec48419e6178412b4f2fda66c884d4c9ee66764e633b9a3200c807f8ca51fab22101067c3b8c1e49d112f1e21847762bf3d1c7a867f132414f668d42518ecba610cfcd95a3357a2b475c127b5091bfd466346e43ed60dc58c5cff42d34f758a520793ef282bc7d5a17d5e73a59abda4bad581224ded2c100cacae2c25bd4ca36b9c9009abe694e5dab45182619dded1832055c55208d09c0c6200008ae6d48e24385bc95418416bc69744d47796e21c45b02f3dd9ddadb212199f5071609fb2f267619ecf155fc00bb2a2da661a89dd6921981c43b005faa43fd69c779f20ba7cb64c0a6b82429b0082e604abad18ad63e10ab12e449bfe395140651c16e9fd2981758cb7d38c554b7498f3c6a320f4cc6b01bd07ffb20547da671acd4c6df37f6568a6428daf774324362825b1355c194c17906f45fad86647a55e09c42f45e4eeafe77a052e799e0e4802673bc83bd0f0b6cba2bbd8b00b35958f6ff2906cf069c5b0fcfe8be4a29f3922f9c74c2c69f559df60b5de54ad00b22f5e7c53c13883249319ce4a410753a3fa6bd843a66ac69b4c17e86e1ed25585ce53b5cbfb13a7472e7ef8dc0722c7f3092be3412249e0d58246c81a7701808aecee337b731862c7b38b02c3bf8b68b0cfb86cc7388de0a3125bb97605b13e2bfb9c69e4b1cd3200f2dc7093c2a7c267ceaff94841bd228e8cf540d34377daf38adced8a3f88819d4cc1d6cec91e417286510d46e64e32e25271f2e4a8abe37c0b3e22fe8500fdf721f989d73b45728b777a1d358ec79e68f370441cbdf3e4200d2eae942a9cf3a922e21e3f81b3e1fd2259bda6b39fd16cf06ec8ddebb6498a012cf4fd88d30f2dcffa188a34fffc52079e431ced5d5878d9cbd5baca89a00477b77a9d3839acef79dfed29dd704e24a7a6520aa486b01700261f35d2d48449d16cb3f5a1475988c0d220a0e3bb33ef73006ef2718264c203fbe9d18d3d42a4ceab35896c629164258f3771e0476a0d0a4b0e56ccf6d2f465bbea10520a77bf9ff183eaf241e11c2875b63f3b9b4d27cdd494ba2f4aa738a5f48464d9e29fe4e5ee037ccb3bd50b3a24114b8e2d49aa4e3ba69f01044e0935243d618d5c27df30ef58c15fd6c9dbeaf8cd3930840c1f0bfec877faaa33e0a3c99978d4cdbbe90173d85b38994be8bb826e8acb25f0f0778c6ed774a2f55962531d2d58bda8bcc82a269cedf9e7cc1c4f69b2c68994b92162fe3ff7950ede016f3ce171a29aa4f560b828d88f09f08dce4343bb2563f38a211b03fbd6ecd8f16c7d57c822ee3c29b5f16190bf4ef0a07d8fa0019feb1a223539d60a1f1be4c2e952d2c4a5300cd5a886e9af0 +0x4732bfd9941893d6597ebd157588b7438daf1df027172664f8452d019cf90bc36ec890c143016d38c2b8f763dda58f39 +34288 +0x5082eae7be7e608528be6e38b84f35ac404db9e67d0f431d9e9f04cc006dfa053c441808637ca1148872d57d7f35cfffe582ae5260f3f3fe28732a71c7f5cd4f1d666509a6dff2b100208d0da73a4cea048b66b2a6ef9741cf35c6f532d0e604fbcf1a1310101c0496b0df0fb8c57314a3502a2fd56df98e98cd207fc9660dcdde697e4d2875e7b4540a13ab38400d26cdb941f177d4df8b8d23803815200c52cf1bdbe076771a6a4216710bb112e2c787aef51f138c12e3b5202e489d64aa3ad5cd77f3827e7fcd67bd4054aaa3baa0db178ce232fd5a3c18aa71d6e99bae2ef9679cafd5f3dc86cbe5cab1ac5b5d58d0dc4f615b8f7e3fbfaa930a822ee1d542d2903cf63cfa3c767755483ea293986ee586c516aa4893b109da0def830bd8b8f49bc16dc3a198715c2a41e8e02308be1a7935ebb67ee0f6ad8f07b804f4de63b60766c3ef9841c37a91c5327dd64fc7646fda631be9d09780f91f661863904c001a557f27a9e074bbd1fca5e1741692a9b2db054151099b69627e802621967abb1eb329d59a1d8d06340dc874c50425d388615a907e330a4f104c8e98f797f5cd59ab4960349f14420020239f90c28ac83a94e97137f7ed1c4cb019d5aa3bc620146268303f0f14597e5f3fc89ff7c9720f9b3a4a45fd4bb75ed2a845052bf49b96030dad83149232f6f0a359b84ce8b7519fd58471ec2c088edbc350cf0f872529b4c13fc85798b5b0fbd7b8a469f18146c74388816c98f724f3f25ecf8e88a8139d0b4ed5802dcaf3a9644f2bf5ebb7383c0bbd3d27986c6741bed7ce51fe0b9de8734273365a590921d1841499df416d25b58a6fc2334fa0eeae239400f1360fba81836a21264a388ca6c129fcd4072eabc959dde8728818214baae9426910b13ebe7982ea9985c9126c6d30c7d2f0c2f6d091503f5bff14031bd595bf6f83ca99b18c8239bbf304daaaeff2a1e2e6732d5299906ff99ddfbca80a5f200a77a4f6e32534b5957a300de8b137330ad18779d5db65215148c0737ab2110d43d2857bdaaa5e072e0396d2af1ac62454974701e3be97fd6de9fe511736712d217db6502085c9d78e777f528592691dc821fbee03aaedaa5469e27d09fc4829ac607f9e3d1c3dccbebc31b5f581e6c66d57eb67be0731d10eaeb41fd86e5da8ec63278db7d9828ec5bcf522844f06c64b215e959a3e2919a4a2bc610af37a53ea6ff84418235fc6ab5d12c1bc6591c66a689e9f21b59e2b1d2c416929f265d2ad6a38ece7619d1c7989d2bb24294f6dd312f1aedbd557ae81338d5fbdd5e7cc3d3e30acadfd043736277b38440408648d09a0ea4f061e4bd8a1e66c4c03c8eaa3d128adf15e5cc0ea1f565fa55f8352a033f27a05b1b9aa2b5d95b860e4d0d3e60d68163bec6d5e9d59ab59cea089e0157a3187853cf172814fe16a80e0c72f0ed83710140fffba58bcc24e4731e2b6f3c5a33858118e4be35f14aa355f74a8241cdfc3022fd97b2232e2659978567b42fb92b6059658df587575a205c9a0e42ec0a6568fb4c44a04a354c64bdfadd70a064428143517d3e8794b777b86138b37acd5f2430688cf05f5619ae5ccae7454cd02b70d5592d29b53df541cfe954644c8b3bea58dedb12d114f09f0a922f72738138b795d92827aeb795f729aeebd5ffc8ae33db2bb9984df663af3ddd10b8c2fc1cbe0b7df8b8c2960c004c0e5978f30a08893dbb92e1347f05676d083568a9a52a0c8ca4196daf6dea05ad9447cdd4c3fd63072b019e132338401ea008029610f31bbfe804b6a383927fd4ed1164f38adf59bdd6801f68678ed1d930f32716d40a740bb635146d9ba7c7485550af0dc320c5c86a98f5b2d07b851337a146ba42d29e069b35176bfa9c847e89703c5201843fcd33b6b170d280e263207cd1eef1de0217038f200d44e32ffde61a7d8eda5c3022ee53c3210231723f87f0693375af38e39baddeefef0e323ce799e302923b4f6fe70aab51d3ffad0eda966d0622a8bac2a01b94827d9023b22a891d5bed83e61aaa55fa71bc6e0b57a4f96df59d6d005acd42f14364fb8cf41b628d0920d87c99c490010f4fef05b05373dc805a5e92028fde75c139b2d68936b0a288f09bab93b2738f98f305349f82a04914de1ff8504428827a605888d808fe0e59c16fdb6ef06ac69d4a33007b9f0934418d039bdaa6cbb7ed7d4f2c770e95110a07a784a20ad0768aba1b01eb25191e850bcc04f804327688e52929dcb4206af857e55fc36e5effefc70fb154915a686dcebbbc3f08e75edb3c59197f962a6cd326ab95499760c34af593874e8037b25a4a653a260174c152e76163d6211da6f8f86cedbb2280811aca490c4f6e5b8cd9034b0723aa455e9e7ad4a186f174a9f8419bc18e7c3889ddb992a8bdb81058688dff9bee5fe3770c6b254af863b9d64f96dab94a10e37e125802f54fe9f085974ed570bc9ed9bb2b4cc5d8a11467cc7d6c8c2d549d2bae470a0c6a4c9096c4d3ca7f1e34e3829b897448d3276018ece0373296545d7bcafa6421805a386d76bc855f0cddca9888959620b2e1f317c8368b609ccffe5e348adae4cfef4ddf2ba003f7b52db06612de06e000672a1edeeeed88a90ddc4d7b96f2c8b1825d76442cdacbbf8b3185bad16b09343d9188a167b23d33b493b410ad204fdd99c3cd50b15e6d74acca71f10e170ed6cbb5dfb03f8dd0d55aa14c941c07dc9cbc2d4ef1ec233f8cd8f7b545e2bf535097f39e7bd4e4f5f646815166820e01876ff665782badc460b625ba3a0db8894a38f74f64d63c1f2f2eb07d186d9751161bcbcb83fe728e88bae10b4ddd97132c152d6d1ba217bed869ab1a1a4d584dd145f9cb85e2f6107d5dc632e1d0df836eb3027200c6fc479a9dfdd2fc9fb55a31752cfffe67ccdca725219ba685f65c9a9912e8a4b34e6bee1215123fd33308cf3fb1d36dfb5b65ae97afdffc7b7ff1284ddb4b8805a27e3b9c9d62448655cc02fc44d0551c262dec2bbd6a641fd0f3a037c8152b3c8d011b63d34dab379226653142913458b1a7f867c6b56df19dd68afd75dffea66286f62e633ee4558caa6e7527709c2f72565bc2785b8a8f3b1c50e5410672f1c7926442c9b0807e89ca974e8008ed1f0cdb7ec23ec73a473d379aa5c613389d2095de47833cfff12df97823d8c4b795e589e9ed86830db828aab0b58190b0170223dcb30c4ec37bfdd9897b9e3e8c2270f415baec19756062083b7ae00969dde0aee80be1606b7d5dcd23dc4cc0cb4343ac9aa0dbe4f1ce8db2a38c8de7d670409978b88f1c6853e2570fbc6105f586d215d145d2901351104c8160c7b6767cb696075f81dd4abe000985927778bb5ba0b262006c854aa68e284d7e49ffda4197072c57461d731a5b473e04fc935d304424b567064f182d4bf8705b711e726d868f5036687781d738b2817a7ce07bb310cf53e03c47fc53fe1f927ec9accf5ee9710b835555e7934cbdf87954ea9742bb24c6128b2a77b909101c6ed02551a4546ec6b4994314dcfbdc2b68210c306d87b774645f411adaf17c7692111299cc3bcb1a40a0b9b9f2ca9f62ed7ddfc7a22b19f75c453646383bb7498f08ef183524386ebe084427933d7a677fa7dfcd7f09aeb770b9749a3f6c530dcc24354d7d92193c933c5cee2cc8ef81755b86c25298084d384886777ef7c22bbfff6fba13f9f01c56b98e8e3df1814984e56f46db7a9911195ed67e6572a73bf0f708de96e05f868f0c3388254bb23824f1e3bb6815e3bbaa890f0f814154a705b79b3b54d9b9f382a0e65c913c04d5bbfd9ea086fe6aa552437abb60f85d05549d9150fc4a81fbf824318c0046fb9ad064fa86b698b056a71ab3f2730c42df642575afebb76a0855e28f86e100f90ff8c481ee857937581f7b45554601988dbafbc2a8b1a4b49112787aedb1deaf9dab88cf486214721231d19954385cb098df6d02fbcc97042eb4626e10f14461dc5f4e2d14eb0ef32d74da4a6fe8823da93815b0e9bb12db49b21cd3a13de6c2448a8145d46ead3cf26ef1b318d52692075b6257230b8c9c7a9224660ee61a435eb3ae84178b83a21976947ddf6cae506bcfff50182c78ea29eb058fda887357837132725ec036e4fb224f05343d7deb1efc3956399c7c26e0232cab64a376916b39b99b0a9b1b582ff88de3b7c639e4c9669cb417d9eae525b126535da598637e83a058bb7ab58e207fed83ca7556bfd395b604337369a7733b7f12263d4d5025c59345e1eda9e9651eca8fece958eec61001c10cd75ce0411893624ea929ea0995eefd0e625d1c765bb142af80a4f4395c0c6514a4591227ef0fbe4797a293927b3fc891873379cccd4e5682e9ef5275e0328adb38d2df901540a0a1774bdf48cbe2332bcae1a3e0d9de25f7738cac2433108cd1235e8b0221d293dcd68a3f952e92e73d8bdc0d4b080d5b8dbc0143cccb22f586e240b7069b32125a23e2471009be3f3768872873ee4841a621f1cbd81ef65f7d044dd605f7fb96b9ede86841f3b0c5b9df7777f3e31b92e153b2a6ceb4e71523f7ca8a98be7bbb7c931115936336f5256f219e338ce3a9cfbfd857191381d10c3b4b2727554edb02c1d0f19cdead581a8619edbb425cf0b1c4d77f5fb162fda64d445e4a62f19ffce8bc6eb6dc8058f9b2c4f913b9d422381144620b24e70572bc5a727a5de054cb7647ff89c35c925373b742a549e5a8d31383b193d4aa8301f6d2062facb7a3ef08e8267e599e7eb857655d18890def134a39e0924709f0c49b5fabd2e5c3f7d80f31761cd5c28888cc639ac5edc97f6933bb717f02a1c94af857b61c8fb1eb26f7a860edee654a554116ae35ee84d4555eacd6c28dfe9705bc6ed76500fdd85c60a16959fa033e9e6412e9f101dc78682972a2f54f6cc47555e96234f00459d8c8d111f98f08cfd493cce08fde3cf60232a1489fdd98ec1a337bf914c351ea3c9eabdd3523f298885ec9145aca32b7b3f8ad4a2aaeff7874f38afe8cf18303e850963da54f6d033a337c17fa5c3a480dea1b2a1e3a0ce416148b04f60104217c9d24a5b267b4aa6aa07a4dd71ad02170856f5ae3054dd97df5108ee88851ed59c2dbc7f51385f88a243848897c70de7c691e7f31a73ea2fd33a00eecedf8a210702ff6e5c93d68294d3a7a79f7b8d991f3ace952865beb444ebe077bb874fa311395c4fcff6793b879f5663123049d41c3af3bfe39321cc3b4bf0b0d6e33502c2ba1b4a33c80e5c838ed8e4774d0a41c4779e97d163da1fbf4478c2a75c03e7226d84890f715e8c908a7751563c98881fda17457c3eb356d8bdbfd5b65b83f93a3adf31eb593174b77b79d23864bb50354ba5f26c8d72198e9f0e0f8c467be1110a736d4fe84fbbff472791a32d3b410fb391c627b6e00fead0ad9bb086b446afc38963c4867f0a71d7c9b322ffdf04b4f824e83723c5e1f339e49faa84f6d11d4f693bd19b8a091313a7633a4270412c04a381243ae937b2c2fb4403a7082a62945b1eff8f395fefe308c7755eb79f80bd59b8746513b72d5439b14256b4f8867ca734d5ca52b50d3036075abc79c7b70d8db6b10b0d0c6ed5e70feffbc0e392ee94a4dbb49db273e0774c71c28161d9db86a262939ddc7d2f4d8592fdf5958dd16b9799b5e4ff2bdd14be43d99614ef0e8da510678cd06048b33cb4c41bb37f0f75349836ed433d0d558457697f88ff90eae742eea18f210a615bdcb8fae8718ff7a45f9d8127af5a81c735db05661448e58f8090a6c2c85b9e0b934159d969393c0e765468538babe2ae6695f056331ec6c653b561105b25b47460c7023172f58b9b66c16a6ed9e7be62710108ff66fad4b341c59c22e44fe9bdcbb2bb9691ab2b72b64e4f209ff85e0ade86140ab4c4587fd4281d9f6ac1860f5c6a4db1d04365bdee62de13e7c50acf368bde1e26649a519447ad30f663d2919c57802936a581a19764e0ecb83609d9007a2ce4c2c3e2520888137d8f1d176c12e11ba6cbbac74838be1e561b33a54fc4bac70492c778a9b854 +0xab4cced009cd42ca0a92339d0513667901babdc49182fa1d414cc91a48827429ad8cb733b93acd82e0edcd30d0ec568d +35080 +0x965dcd60709712fe8f944dfada3235397690bef28dc4f8054fcc348f37c76abb9066d7db379deab7a29e61242107b0d9645aa27f3eaf4207a8a5fc40099e00a9b52ce784b3c6992bc3c06ea79f7a937f82d7b0cee7f0c798930a605ed5c6e3f00d9845836b7ae603f9e2baabdcf1a8d2d7ed2f0810f14f6117e3a71124a7db39a0923801e7229be74dec8e575fd5b57b6b8569544219a20a3c181a807da9af2c77030926b0247e7ec5c632d3b08f83214688a4db03d0873a0a9201d46834297099d101194dea58716c58ee485785da6d71dc29c4de7ec8998a37a4346db00fae0ee6660346daf067478b0adedc218107f36b4038588b2bd0c3f04ac915852a8ddf28800b245e10096045cdbcc8ca4296d41b305ffb607987bda63cbbe71b42b61381995a6edd7effbe6f810ba3e7e3c21cd643604e637965813fc3316cdb1fd0b2d8f717acbf03f069f26cf2f3e22d35d483bf64d9fdf51316a525532a2b8884c514e36b676b67856ab4d69a4222e894040aed922596b33984beaa4aab74467a521fa57e254b7265c89f092a170fdc8ab2531513b9977d7ed4749c3e771f225964e0857771c6ec388b9a4ccbfb11d0bde8457f0e1d66198a0dad41561492e1ca003fcb7ed0449ca8bc8ce6a575908ed5adca72acda6d4f063753e3bb0c374e743024bebdcc2d4b5b615f20df0df4dc7b0ac938157713e99a5b4dc895e7753000fb77a759eceac1f985fa42a24ba58357052b17707cbfaded8083380b2bb34e156a20ce7db8e1c62b2d459415b80c4b10a9d658e572db65a8aedd7d45625b715c83087b4fb97b229963285d61db8ffb4efbb3429ee0ced772ed43de6c13d4617c5015f6f776209cea2e8be7ad3c975dbb05aa1fc04e00ccf4469da2a8c786e61ed930869e7839fec697567822648d37fdcea4357644d90bd6c0d3122005d9c8ea2542756c452c0ed7a47159e8dad752bc5e87cee64bc15ebf64cd76fd5535ce873c310988676395c25fc4d22626df76a1be3d3038ea208b57397416663f02c29e26e78b1b66445a32d0382a04d10b6a53f5aca395aa5e5b4747ae39844ca86ad6eb4a424cc83927cdfeb3abab62c5f87b0bbe712512e396379664287f038f8ed89444784417a9c23bf11e9b436174e6c10959e00faa1704ce2f7f2c7eed1ff84c29bc732adafcf425b16243f3577ffdccf6673a7cfa636cb519e58ba990c16fd8b0997d279a9985334765ebe4cb500545dacfc5938b2d98945c808d2976dbba2733c5dc63deea3d0cba11db3e454ec6d3bd79ca7de4de4e1201367c2627d7a2dfb927d8052e56e459124d5a284de1081fa84d90618ddf57d70ef19ec72a1befa94ba7bb36124541c15700b1ca6c7192d1a23361680f977b8c8e983d350611692cf02dcb1d131f1ded9214294d29662d90b41383b9f16d81d986139f98461fd711b0a152e3b84d4084cb7008d90d29a104e5d53f7ebbcb3365004a0c176faf03ff93eb96af8a35722f08fc96959f20b6d63d61dddcf61857d90325ceda0b28b39fa2f4e0aa10407b9653a01daa67b433aec49fa5fd29bbb6dc988c2c0aa1f2b099e4a277fbd2d62260b344e340ed4de2338378df09dc1e1817c6676dcfba75c29462dea5cc5860303631d0317dba54890e81d2d22797a84531959eda50dd18b0382291b0422b446ebfd32c4f8c552ff1e7c697c780e3c104d30d19bbb69246442e2ea1e187d2eca1a4a34185934648e2645bad063c47d11ea537c058286264441e8ef880c3d5be948ca9f51bbb1606243047fed7824c405c4e1a7cf8cfd3db79af487cd51dbd240e20ec31582b4cd07ef19270827a78778477be33e4d36f13ab8a661727be1085d60874de860c7010b95045ed4e4e56dc5ec72cce655bbe74a257efb0c0ce5949b5eb49e2eb850a2d9df4675c85236bd8b4e76b36c18f476725bdec2ee6741dd773717427cfbfa38ff28600a46d2441d44c7e835140989252fe64647be2d8e699d843fc937ce1c29e80ad19af4e765f36ef357d092c9e279ef3f55f7efc233bf6ab09e9103914f0c20f12b86472444d6765b46045cbc88fb4cd18e61f7b7da556b66a43854d80b463665ce8ab20b494d076a234ed673f51fa5374ff46a90dab21bf0f13d9014c96e94e34ae6c9feebbd8eaa802e8462bf5da4fb2b5dbccfcd5c08fa061f69da11ebc8f42148f381b4ae6886dd120b0b303bb87790dc62d71ab99eec433c369a6d544f12d21fd3363c964199aa97cefff0405c57211ef1495b615a4239328ac8442e93c9edd9cd8edc1b965d692e44a38801fcf45c83fc8907d9c7866880db062ee14373c51556ee2ba4d34ca95400886fd736d993a9c9389889733351a5abb695f2babb084113f693a884e1db97872100568691670efbba8606c9d3752f716c01f9860a17eb691abcbd27b780775d0ff1f668a65712189178c857e1537cd0991b6c11eb8482dadd0f4938283851d6a7ad4d5972e451845fb94489e77d2c2db01aa10ad9de95fdbff3e332ce53d5987aaaa1e5918f5be377f011fc50329bfd63a85ebd4f7693363602f1a4147371270b72ba798cc88faa7c85a71ba6447ad4064cebc5c6ed1908c1c51b089507a2e6ec8dfd91bf206b3dc0127a64640317262a60eea0eab28609f5b2c5ecba90e97c7054d1cac3178d31f50f1263140f1f88429ccddb056768ae444468ad1f9fb33c397fdd91131e541b8dd3e58430b8d25ee1590fd0a17c4f6a300299e61e949ecaca67776139b55e5efd199a6434a10e3e791e3b2e694198c24b65d00442101a8c859445d7a17d0a70b548777fba47f19b8c54b640a787d34ae8f681a42482b5161d9ebf40e4c5f6f568d923431c2e4afaada527b3f69f8d68bb3d4522206cdcebd4ef4a597e3092516a54143ae4b468c03f8805f4d0f935a01492912ae05f10724dfe8d7dc83d7b194c41c0d3ae8ae9a0b465c78fc1455a8597aedc1acea9ee4e0b44df1a6d5cffb1810acfa9c4123c00ced6e2f141d47a8db6daac6e560dd4d38f6ae5dbd81fceceab478739efdade64c153eea5cd56f43ce4be78b210db52a73cd9082e92e636a51d609de06c454f414e455129de1d75f7c3b2d7727992e63da607dc8f2840e5e979fe5a49d4021d3ac853a109fec87e52b6603f2c1ad50e0b5d8fc979f2d04b10236962e2b171b695c1e754a2a9c85be24f3f164b5f1248a4c5c9657b9ce4d49dbc3a4e378f14b9f6cd88f2a0699dbd0af0b7f35cc0cb147e615d1700812f2106970952a4b77b75e23da0f17fa8c910513d636cecea7ff00cc2b384b549efaedf663f36d6e50698ccb4d7d79d01dad449a7b9d958369179e47c5504e651d6dc7c8c44513a7256912aa5862b74ef339748a233df3b3fb00079d0ba3e20335538828bc1484bf9ebdd90824443b3db73c7f2cf59c512504c2251626b870f58eb5175e73e7277e626fc82fd8ae6c6410bf4cc81a4415a22d66defc3e175e04d19a5cb2104666ab1a87c6669d25b28da7c9c3a6b9bda9f21ef31c957a4915f8a60b3f6cbbb9a8106d0bbdf49b33757e2362cc0dfb8d73dd7e71c62b03d5fe99b40fa8d39ec9567304059422f95f1d002e924f47083edd2bf5e9c404014380aea4ae7f30defdd69d867c3338e03112db6d62349a07584da32d62fe689b1c02011df0accba6de91569c79827e7732bdd78ad9634f20612d0ecbe45ba1f9e6ee58c8de17ec1cf3ef65ee03683be7e984bc2d00c5ad7de3e4347a77c6f6442cab7c4d7fa9db68c459942322d0b957dfd051fddd40fe4365dadde02424aea473a13553dc48dfb3d935a9e4de9f3ef09a0a5fa37bbd889d7077d1a5f25e124045384a82fbdd4225bbec6dd840be13d9a498aec6df2595b18b23d772ea5c6a4129d88584e6514ae5f1e7a8a84f15803b85e4060f135e6ba73e46b9ef1206fecea8e9acfea58a401c038d22fb148ccc3ec3542f261e5252a811483dc37444151049d3889b3e726cf17a45a27a950c4109e852f0b208e794dc8d912c9618fff82f94fee100bbf0158ddc79f2cddc7b25c57c45135cd907786a39894d12041df05211d37fd823eb8417b490d89bf1c3c19905955ecb9a99457a9d996add428843a149b829c97f4d02b887f21d8cdaca5dae0da99aa7538544364227499fda263945c316a97bd6fdd598df068949a17a412c1beb8f9a0ab3bdc4af9db301d2e11c660756c59830e345de4336e37a4eb9b43ab8c2044ac90bf74c6c6170aa34a0322b9ede46c596e79cb33ceaf5c7e771ff006a96c25f97743cf702dd4844084bc5bd0f18f3ac0ef1203e518885d676896ba7bcd092827dd9d2ecf877037454c91b44e26a96f5a3e91ba80a795c5202e93e5733d63a5b811f0254d69968e422047ce7a03ef5485ab7d318ef2542e19479c03759118291ae2f145725aa413c79e332ced0fbda4b3d4391b789f4fe2b33213b70b5e934cd09f1501c6c125423624e8422fa090ba953759cac5f4f5ad9e7c9f529cfc716b69c4dfecc33386a42e32db90ba6d05008a4363e20f99c1c93b859378b3011f2f56e2c658e03864a4107681ab05db87311396cbd3be0440d00afb949be5f318e318774ce8b6263bec7d3e8ef3aa6293a6b190162249bb0f5c9d3d173e9e48db213f00f81ebdb378c7c519380d00a8b6fbe4cdb7504b2479c962d89fd35488f2842b0e3c6d5f36b7d0a8852149b1046d8b4dbe43e02ae70c90ec3ca2ec9129db767cfdae57134655916800ef4c340c23ef3cd020447169546d99f7a50ceca21262a56db25e8258ee84b42ad696f226768232a1f11fb721dd9a0c983a96bf9823e324ccdd0624e4ef14ed519b9c73f9e20edfb22ab444b704b0b47cb82c92628c728b99a2c06380e3eca41382cf41ecd2cf947f31b4d27f663c1233c220fd97b89b3a52982fd6a3495658ff40c1e475e55ee167aa93c9117eb6b65bdd3669ae34b7c1962196f6c2abfc7c6339f6c43b76374709f9c3a0e3ba9b01335dbf6f2c8d72b1c2d3b83c7568499eedf2f0799421e355e4a3e6e28ca6739378e83e66892f367b7722e610222ab8310df0217d1654ed6e763d501662cebadd8af135f85a968d8f1193b32a5f5fe2c321b60c3748aba0214d2aa1a50c9fdb5ff80d388cf75fd27d20aaa1e3936433d5f7b933309182b5fec7f05e26f0967f9b3e90a8ad05f7cfc622ec34c454f435d9ce7e2901877699577522d814a55f020fcd2028c10cdabfeaa6bcee551a7c635f3479402290e3c4dbd346c1e6a135fd3e22301b7162854d6b1aa1210e5a6946d6b83f2b0c5476c2fc70b08e155ad7db96ec450326ad93d2c7fd4d8f68ab474ac0c8344c37389c0e29cc14af39589127ba79d372694462fa71dcf68bec7392f9adf30d262bc3d010f443c7a7cb211e6c09697fdbb1cd9f1ef92850a91259d8de0eb70e3b627c9f75dc866e0a332abc0314198ec188bf94dade6dc06972b485626392cc0e73c966a752f25c4919fc16975b2894a66690d098922bea3f761a35213cf4db21c830c22fe81636d6e80baaa35f15360cc3c7fee2a4d122ada4f144950b7b9ff7d8593e6a1c60724615efe491904dc76738eb6c4396fc0e3677e040285f95aef33c994800607f93192c0f50ec8f50ed483e61a535d91af16c775dc46599b16cc66d775b6d44c21dc2a2e07c3ebccd0c123cd13623fb9c90b21bc02dd74a7d7dc3d38a051b39b676d51309c2e298f09877bca09bb86f2f50a9edce08f7f248469e1737b194dfeb32b2e4f1c192b48a36cb4656424db411b5a665cdc24221b05b97a1070d5477ced5fea12ef4a99fe85b9f6268c66e6b02444a0c46063049342142f98e64f4c1dfd51ac027d891aba97b56896ea494e46f610759dd315ce9422c42892454d02eacb499da52ea05683c1aa333ce494bc0b7a060c6d9d02272790108e86f49811ea3f8fe5866b55f661ebde7ea0e311d708986d8ebf26f2b852713f89fc5df82226426aab2a9a72a25cfd9a724b50864844398f2218d5ad291fae9a407de734dda4ba24171b25bd017ddf2637c491bcb6c743b2f10214fa21962f69dc90fa16e96e910353e072ffbccb7acaf493107bca9aa01f22044ba348bedcf484befe64ef8cad508401ebff7a4eb4ced241338a2cc4361edea7e06e479f9d82618e5be79604f852d506f687e40f7679f85564b3834deff64d713c24c6415b5c9b887a6787e0 +0xe1a1e25e96b2ef7504b76ae5adefda0114c7d4a7a6c6796745ba9c9d204864156b3429fb9b9aa1908038f7928d48267e +35872 +0x7af760f18bc91e656da92b72e98bc03f1c6bfb442830305529d681dc6bccae66da9b2e61b9c97e2397fdb92f7f6369b470529c570c2d3b329487981d148a462cdb992d792e34dd233e1c239657b8da0d59b804566cf81ad5f0a7a0ccb3a8fbda673887c153d2e56c484f9230d752be52c1e35bc9af5a7446237fc072afef777665c264c18e6a3c059fde2e8368f9bb898f1cc8393d1bf18b1757219670275f0bbc7deb0248c68af929111e19737479bcabab732d7e033aaeb277eac05e185e9e56b2450beaac784dd0308b7a5e8ca1f2fcd8852ddad9f7b7de264478e1891a391aa89964dae5ad0b7a829c2c9209db346ceb26c1b967cfac82ad574761443be3f0a910968239d23b11507ab978b3ce89e22b7d7283736b9786544ab4460f6aa5c0fbd228496f8fe37ce24ca9775123f947e2b3c7a0c6737fd1634548f8b34f8672e706a296518b0da3803b82f6ad828c8156ef4978288e6d4d227289dff8918eefb5d58dd3a56fc06e726fce5f8d914b79cf5a7e73616468e1d9f70163a5d8c51dad666f6734e205c5ff0f1419bafb3d17971cf0fa389e7875cffc38ed84ce34e517e2d3bac68de3907143dd8cfc666a44f55c277376e4a5f24daab5e35b19e22f3a703e34231862b70e35b0201a7bdbe63042aa48e3ddf83e9b2800aff361d7e45f393a3d122a8a221f0a153ddee197e691f801df47327842019fa1b7144f1ceace644e3d5c6b64baebed944b0e40a62d60a3b4a26a8b2ee6c7372065858ab82bcf1a039cc985f765bc04b6b2734211a2e56e4bf7148e20133417062010bbb38eaa83dfc2211d4b0cd87702dad58ddf2c677f4f480ce658af9168db4f7b8a16faa6c66c172cde6998886f012cfcc918b530fe48fc1b39dea32651255c8f9ee8590c0c3204b26d58ef1414390eaf9fc5248614bc7b0930b8d83bfb6eae14a03192247cb8ef7a7520fbc48d34e9b8b6ed61b2e9352d9e72f035188e3dadd237f98d363f86414d9ccaa2e0037a26ddb89853fba43a7aa1a88ea105311bc1910c49328a7c2463f38a5dceaf9d912be74acee4ab6d54cadc799806490c8f5218c72869685c1bbb34e8e1667a8403629d1698fb096e0985158e184b2d4821c8300f9f1a1707f1b3d85e5f5289df5831c9c4fd805ccce413158e1558f90d598ba18cb52de0a431b2a693dd7a24d7160231fc065cedb26adca4229815f582c00333e7728a0b5b601f673066c69394c73c9e65ba750446254989f2a86a68d0dd99adc8de19e0560864e3dcff1e1d3df247d9a721b4e8b09cc08ea54d3f9c1e38b3d9d602c3a6bab0e8e240b26a0cfa208ba76b4301e31957aa79e38f7cd7955abb7dbae56ea7b2e1132c048692a6f5d870d35929453ba9df7013567709625dca17621c8f032963224d88cf847e3453a25e2318da663987bb7824a40cce859d103150a2096b75f8fbfec049b216fd3f06bd61515e4e25dc732c747557b3877eb56f0ff75a8cd397f48e9a1b1a434bdf8df553abbee347cf90f3ca725ea1b227403b66c18a508a699666dfedc4eb645bbe6ec2cf010fe6899934f0422b7e4cc039fc1ea9a29ee49568ec5766b6f791dc229075642fb94c311659ac8ec6349e732919ff56a95d2743f389c92ffa501a8a3fc4361351c9bff08fc9c7fe35a9f06697fcd171a7779c9dbda5fef098dc478ca070cb846d2688ee8dec093982c78ac10b0c5ca1a5d38bc850a9bf509685600bcafefd5e8ebaef52972a39e8b574b3ad0db1688fa9593cef34fbd2f7fe32ac2e47d49449b96c3b4536eb21b2d49ab4522653bce2bef1f638ef05ff8ed8cb741e9d5c58eff824b6eef1978740e920d5d7dd5a2143e98303cb0b2e10bd2a37000257fc11f552caa67650963439fbee5e64bb2f5f5a34f7a9d110ddcb2bfe609803fa1e8606d0475404db50f04613ec972347383ecea6353172847cfa815b2d8449102980c8788108c11b2e820f3802c83a09de86484726e3d5f17263664a860bfb2185c7e354610ad49796b43b721838d18989fe6f20b00623de27cf83d1537741b39923006ccfa166d7f14c73c916301150a26fec38bce483d4030580fb7c0e4450cf5cc7c6b4169f64a8135e46e4f821e58fa1669833c31e5a6ecf04cdea192c7f8e39df6cf6b1a6c521d1a5f06ad82ad0ba5c8646fbec1cf8d0f3b75183df21c93f83f1667fbaa482c64eefd09118549a8968f44cfea7a436913a428e30aa4ab44802a4ba3579c024fe51e5ec3fffc6ca668c57b2223bde9d196c4d8cdac0cfca127ea1720236233230a42f4e5dd6a9e8b891577e51f2f3b4d0517f54676ad99305bf8f96cd38f434c60d74fed4e5247ce7409dba72120b031fb081edc1f09096898c172c7ec85cb327555c028a74600f5b5fd16d6de44d136c53fa5fce9a1b5b07afe13efc2e8336bb44916469cb85287bb69ba02ab0e26b200093b378b0a26ae5ee94d331b29045eaa1b82c5832ba50b10fa15a90bef294a480f4f0a5794f4c8d12d8f4049cac681c367c603ef0270e65308ea38955a4145f9bc41e3f3e488865e357a85d33fe28b9c9820a054ef5eafde20883fdbe2075b818ac462d47b5a6d728b6f724c0af0c2923753194944c6ce2edb703d2428f3e19c1536e57dcbf2e4aaba0e9418be69dd40cfbded30a531d7c19452af12719f8e95c62a1a5458ea92632bb879ddccc61234bbc18aaf73384332e570142b5e52a8fb280e4ffc9499fd286afd81efb89e27caa62e701a5132a70f3988ead361c5c758b56414db21896b86f25e4ad2f44a848ef9253c05a1c959931addb1bf0e51702af8bbf774624183fb4c5b433c22539f0e3f665cf5f764f18b041f0722c69e19ee5c86665ce95accf1f364f96fa551fda4e362416fc48e05338fad39c32cf45b1f6b53f009193dbd07621bdc020fce270f8fa997e78baceb491808e7f4a40c8a3abf9512ed9452baa822d07977b410819a8e9caed1df6a3a1827c2905bce4f4ddca3da5d8ecd326c60b033405554d1b3c28abc14c3121e684d596aa15cfe250c51b2841e71366548ad94a4cf1f448a3433ee98684fd6620c450751b96cd6364c468632f4196263c5fb3ab5842a1592695b34b1f7bc9ebd8c9bcc28372fc8eb943779577d0bd3a66ae62ce5fe2a4a82e9a4e78961bddd896fbe024eb90a58cd6a811671f7ad0ca5addaf5a69b8455e42bad919f34b8056e3c286445ad80f84435cfe8131291600a1565ff87faccca3eb5d1ad53cf2fb8d458674c9d832849f89c8068ab4c4d802c27f3d4fa7a6809eafebdb557bfa96a446af735c6e864a052f53f12bb1335ef845c21008eb8eab7819cce240b74a99c36ea54ba522bcaaddbd64860b2f5ef00bb3869fca534c9358ae68f73ff9ca4c1444d0c44bfebcec4fbc658ed3362dd6629232b33ee6c98067f828e4fa4862f7bc5099a6f70a6e5885b3bdd22acf8857276d30140bacebbccd7e727018acfae1e61a66b8504dbb36a42ad417b90057bd7fc9e78adaad9b8eb1c8af62422d7a53b82ba0c3ffcf89cdd7a9122827d3824e9430bfdd53f2c23d3b5f48831fd4ca955a0ab08fab98c26644b9dfcc1d50f1538e2920d41d82461295caa39b58a8d3eff53ffce4fdb14c4913e1a3ca437e8c13953d7239e1651155e4912a7294b17ba9b153ee8a9d2111be6daac6eb40653cd8cff21dd246a4094e533d44cf7cf8ab0ab5cded4832f0f70d7a9bb0f7bd0de7e867d38968f54618440755587bb7844c5b2a3560e86426e87d613cc9b6617f768c83651fc2955325812b61d03fee5e44e53714b130ddcccb574b157aefd5c2d20c4c3245aacfd4174be5e913e1c98c7ded05f047e942ea87e45faf296cc0dee1b0e9c164e64bd0d8eb5d768929ef18ddbebc548adb3e860669c69140f3cbdc8dc0829ae53fb04f4fa9bd8f9ae109094e9f83c5e2cd77aa2f31a743254d9ec3bd8341462e7da75964cc2abdaecfbe68b7d782cdb788955dea832b4e4242e09b59424c4ca968d7f7ff9ece872dbdb73cffafe2f371d541a81fa67939fd99396c4845cb34bdc7e9300865d1757f719c8d106fcbbf787a2391b6e3bb8cc01c533f74d4e787d164840d676a5b0f0cb31464d15f64ba353fe223988216d0f291d31bc437c7cb4f05519405f592de3d4dc7c82ac6d66b0eee2663abcbb48cfac1640920b5958b9e73f7cfc84da16978055ec103ee485b6c4d995bd805bd484274ac107098764c26761fc699bcae3826a58157441de310b826e112087a598c317153389c2694984fd571806188e2d4b0f3d793d69ccf14583fa6902170aee12f8202898da817f6815a940506fa64c47cb8097c9fb333efb66091de0c30e7cea46d610c296527ef24cb315d725a5d90f4bbbe1a88a9372738534903b2022adcf8fb17c859a7ea0aa0f1ef918bf0f4c17fc69f7679c8054648df7707fa2d9f9194f4cdc506b48bcf5d9477a73b0352de849f54975b56c2d44dcbc3f3cbfb7078de202a0c16d630c6c47c70aa68dd9e6f6d0f8486149c9957afe0d4ce0fb2c2163f47d7a4735202783b70839ffcc401fda1ded7498ee2b059d5e653a0ad9bc0f520307b950373286c2b3a5890de01a30f88d4f7eaaf702f6129a5e7718dfe8f9ce7a4bfe8b080ca2afda09684f6dcab2d8ab98970618d3ff812e4394a97235a93fe6b4ba460c0123b176be6842c9c41df0f5438e48b8208a4f86df132b3514763cb4dc6d1fd7c2626e363ef97688b8fae7f6ea94d1598b1f04306b632c9d27e93b812d8786efd2e73c74f5ac592efba2142cf87b3e61462615c783051c1ec28ab2b812aa09b8853ab2df8ce169211edc1c03f781fe8414581a98a089783e86d338e6364516c68bc557c27f49350394e146286249702667fd79306e60cf70e74b448802e93c9e393f91ca27443b5af05a48e6b35261cca3beb83b271b906a566b6c1a02e6f9a43fd1f7531f52fa7ba3bf9adb850d11fb69f46df5852a596f76abf618b0fecc7ce2450ef9e1f5d0fa3189928331fa2f172d36f10be31d8904aa9599008771338cd3013f2b09bd7d6b3c30e65a54aa07b4600ee7fadb45bdde74b0bb6e10febd68749f1e62e11a5e22f65e0ced579d3a57a4e4c93ec86356316775d3bdc7e7c8746957133e128cd1d622595ca8d53445855e410b3454d6e0c1e55d887c26cce34503f1b419189596e932cb7c09380fa7a20ebc2497eb20fbf490e03025a83eac6ef6d777805dc50bc09a1ce1ab0a9fdf4248aebbc605c1f64ddca67156e68d72368480e4107c8bbf10dad603fac7656afa6ea1274b3f4a6e223b08a26c4c69d3506f767025df5a1f4e778f7974f8e0c92f132bfd93f21ad2363e9f69f264345e210a20a24d00c0aaddf291a8a619a27844c8b7a53cb8c3a0ee59c33e65a87d514cd73801028b5ff043de95280a941b06ffe1dcc4a21dc588bf0f2c765283b58b28690502d2d9786e148df25e1f02cae3a500f3c2607ba0c82cd133c825a07d3a4842102e2a75baa2c49341d15fe0229cd8a8a534f46ce60dbc5261aa7b69250d20c4f1f995da870cd880fc2849b6c2a10f4b5972da6bf5b7e1e54e73b0685d62469412eb91827e2ac4d999b978f12b7ebd5b99228ee36055420c42da610876e82e121b7aaa08007b2e0f930b4a19bdb4677bdcca9e8da6743159f734f9d411fd4be1442d3bd5ae7c5885809459bb09b0920eacc165a548834430c42a0745bf1024644589e375d8bce8fdeafb043f8011c19681ad90d4b7110f33421005f7cecf4c2d98072d532fab63bb2a95f621c1467aa5e3e58c96828bd6e3e98d7244c199279fb43b760813c63d5fd7fb8bfc3dcd21af4c0fd5553b725f9532f8e8c757fc5b5d028d6a1f15abfa4e6ba2524966246b354292f7bb3252edf9b6f8b5f9c2673bc83b7355d2b5bb1f296e10c573cada9bba3015501307bc2663ddf37656c1785d83a783d5fd7472005357cd7215ec5e57b0cced9b073c0c8d86208fa658a59e44e1df4566e9c27f627ea13ed4aa4b3e03bb51a225024fc287b31703d29a1f4766956b2e95122021a9ddd2fb69ab57e8443c66c98a9eb38ca98d3a1667757f125700a3a5cd112e074b237579ad93a2eb7da684da3826e7b96766f23df185457d8aa641519b614c9ecad201401cedacc6349c244aba558cd745f2e7c0ed4412e776089ca86c8cfc66ad5bfed53423e5f6fd9fed918d84f364c9938365d72c67fe9dba4e10dceecded6743d6af8fd0eefc3cf419452e4fbbf066db4d833bc8a511860dbe31592121a18d0c11359c7f1854776b6fec191066f8a23caebf77836aceb3a565705daea8018317471dc688f27e315829ecea6154fc003a4f6 +0x6f07c911878a86e57375528b8cd2adda91e11217b8c944b20fb1a4fdd6ae52bfeca5d4f929872196a6f17aa1af942034 +36664 +0xd2948aa5537ae4bbe587afc2d6e7386571c4d62f6a166ffc7cb83dad50c1d220a1115a609e2a21188f42554ebc960c4d8a0088e3e8ccbacde9c80670b29a46ca975611a781503d18932fa2210d4321b27019e6d8e34ce935d59dbbaee4467f63fd8c36e4c59441a2387720a39098807a69367577223d041b8662e4ceac6e85d41bda527e329d349dc842573c0f3d308fbe7fbf266f481166453d0a3ad3ba61063969ecdd90141ef389b7ce5550da39d7b71d4b4e90151a005a56b45921d11ae09f618c69a7a0078bc4ff0d541d16a43c9b38a1584e4b26d00dd66a935d5cb84995e9bb8a3feaf84dc0419ca33c9978a5b4f74aaa71923ebea6e5b4505102442b6229ffa81f99f821c7a604a8750cbdf94883cdaec19469b26caa1bf8c36cc56d4f4ae32b105610ef1f56cccd92177c22a004b2cb06f6af94a84e26f37c4243f7a474ec7bdac9479f11787c795961bc0704a182680763184ca3f85eaa442bc7b1a9cea4004599a519e5359c1394938590bb82c4ef8d81adc3a2d14983e2cf5783a5819222196f3245e3b4b5050954dfa50fd000c760f875dff00171e720d7fe55e2b43e4a1df2f70c531e4eb6814dd32e46b3be5848717889d4af5e3fc4ebc10fa69031de1acbfb547c9af08ec3266813a952870a0d94bfaa950496f197b2aa993a3df248d8a14607a75122f59986a73c80d6e245760851287c27a36761d5c0dbe6e209ee1f1de10b1c6a6c53c9159692136658714c7637edd1400d07eafb0bbdf1a8ff3ab7e7d34a230e56101c7c40fba92b70f6578577dfdc795a3bf9cd9428a5b65b9267a624aa046569945a63aa608c4db23c5fde1be8e4f8146a58f362024835a560f802dd1506962c484b71deaa02f3a6ac2c282aef33e5c2fbcd147d35234c660b33a5057272ca2892b64fe3bf5445d5ac850caddb0f69ed5821d8eea77e2424fbdd34a4a99028e3db65a5c189ca6cc6a53432ab96c1ac1ce81ce9bc42a1e46a98c15ac3a1a8d9e78c1e1a80efab900100ff412c0790d5d71385ecefecd3b5bd4aa6bd68440204bc0baa5629d841d80f23afe23916c60ca741268c908f5dbfa77953059e79e6d2e8c2d102c42ed26d77780cbcd8abaa7b12dac56fa6128729af8d91db6a289b6bf5175ac657d8a777c165dd7814ae8347a2462b3d395d991c5eee28e7d6396af66b740f49ecbe081d7654ecbdf2079a9bdfee209f5258dbbf3a04e0d0e9959b9bd040b6348ac83c871dacff347c9f379d50386b3cf7eb953bcd38813eab227684aee3182e3ade8dde3ed5df84b95ca1757d8dd6be33fe0eb79ff0d2db25c942d68cc5fde003e8414a61375456b127224cee5627ca0b798f5c36959c4c5e7349bcf34e2df1edcea1f20f3a25526de9004a2cf9270b894460511c90a73c5e06d15c6ae66f0a0078f5ffcf461c1ff4888496bee09e26b447c9bfd947bb512e6c23de79f58cd345ce85982ac3ff664eeef6592c7154c6946b12cef324a033d58b876ba8e34df3c3b998e6a71997ce84019ebaff161091329682a5f48e1d8b5b4d442b80187713821f7811ceb0ac009dabc3e2be369c2f95b1626d64edfc01c998a44588fcd5da8bea6b4027f006a3a1d2aff8f138be49c5a5fa4dc9a8033c2656ede148f72ef1e500ba9b3b426c609960a82520863f87cb58926ead29fbe57a6e6829497249ff984bad4b910ca7df8c3cf791d487e690aeb472f897d7aba3cec85d4312d3efadadb18b78b1b780c7824ee46394a37d0d76a0e212101add1f294c14572c84e8a32b1c9e4924acbcc1837eb6c4e942caa52c0329e49f5a570193e2d48e1debfc881a732ce77152267498b4b7db5acc9701d7c79097ccffe2f01472e70f6f72f305839e7e7a20108589c8d82dd16fa9aac87fd35f531f714694b5e49303a98094c16d84dc29ba50a0a71cd261cdb042cba32c0fde3f21194b967d202192547ca865e00f8d1cc67940779a8a9bf8a6fdc43ae7635484595db99e750ed9e3f7d0f798e426db7cccf32da04ce92379d8435c34b7b70b494fa65753a397021f1ae3490382b10c7154252fcb3ad54079ce7d5a3aa5f349b78c5dee5e11a1e56d461d664dc1996922e7790ea06b373b20111187f3b8ff57f697e84666c715cbf601e6161faac43ab80c5691c6e7f85c952869ab08f8c37d2df8b12714cbdcfae2d6a62021431bc75a4c2482e6b6feeb019beb8e206d280285381e591027dcbb584ac54dfa968657312e4ca7a7e133308bf301f7e420143025de99a301e3ff5580e7ab6553abee34653a34c8b26e7e735cb712affb18704d357289cf90052c128334c130d38839a41df845afae68c6fb9b6f857f0f5d25a2df7d56a364974b3889b96d75233751f081f1e72344d4f51171a4c42dc5f81a77498667e826a04310b9ff18feeac01c60baac83eb1cbcf2fd06dc3681c7f036149b1526657d29fee23c8d2b91d129843bf0b17fd0dd27a50781a24345bd4d63c0feb2fae4123963f63aeb0cf7807c70cb4a89459a301ef6770b7b533f4e1888c49ae64b2b8cd85a93daa225f89ec1c756f1bb3b11bca8cd94cbf1ce3823588c6896388204940ecb024439dd5bd3fe73250dcfcbfc2acd12a7ea8b1df9e41559f41a310535d2e49e8ca1389beac93d5b80c54e5c252195adf88fd2a6473857d6b050573d86ed61bb771928c96b258567ae41bf55524a0986cfe34cd2edc727ebe45e3592c18e8e0b0bd390cea792df7ff9aaaa204c4d3086740e8309b13a8c80d76c506dac5c717492f8f81266b6518ba7289724dbd113932e37ffb45d398f7dd2a33234110015df52afe8fd6f39e67301e20fc9c67eb89647864639b76b37ca1d2a6251b6217f359421e9f78cc4a31f4f019977d7fd29780524e20288798c50002a682a6368b95ca075826883ff9278d9acbe96d4f66e1fb1395b75970a96f5c3cbcd29e27cca3ebed43cb81d91ba64e60c058e86108d7592ec37fcaec75ea2ad3418b4fa07bac236669e4f222323ccc049f6c8b5f49061f26600fe9358eb40078ed13572ae91cf4f5230955a5cd699ad8a19aa294a7eca17cf3de30f6445b519008013131b584f53c17af38de5dab1f6f7f79da9b9609a4a4e7712ea9375eb2bb3aeb6a5f6172988da05cf826537fee3b9170affe93db8d30b35f5ec8f82c885cfe286f0e6d44537c658920285f667bbf80157f1831d0cfa2ffff3ddfd74366f7ba5ebbb94998ba7acfba5d5ed1ed3c8db3eee482f097e07e25d748488541c30df7e4dd0a86de322b5776ec344b72c508b5535cb9407f6414bd8e0aad629611124f514f5c95935ee0953579432ca599c30ce96445b225cf293f7a0178ffbef5a7292a8f39f636954cf17c70f615d42f4f13277792b5f9860e1431a935cd2ad53f0de7191d396679c304c26fd767bcf9ff6084234adc892d35e43b7e6e5b78343c760d8990df7170e5379db261c29e8e768d85e3b89643395327fdfd7d1b159741ea043d1f49061f261265052f97175126f2b3356663b61ed847ffb30c8c9172c1e271b0331682e8f81dbec49b55a5e693287294fec5605227ccc71b77406a6b4ef7cc9f56c87642edc2117d2f9ec8b34da77a8edc4bc087d44edab357a70ec54b828b3704cf6ed17997f39b76d30e4bb8e8018f796755046016a0f71850fd253a2b1433b79bcaf92e17ebabeb82d5245772ce136098ac7c5decc07353bec40fbd4a1e0209ce194e7dca403b082ecbb1cbc026b72c60254410199fa47440e1f92767ff1e55d6e835db17c7a5475730986878a1f7275e5de04925c5070497d5561b2d4e053636a633d898b887437cc22ccfd4d6300bd3c4f54ba9a7078f242ccb0ae27143257dd1ecf8b5b95d670fff03648d2a0e2460e8e7aa0ddc427e6646ac79200f54ae0cf9b5be0730a43c912590b90a13fe1b96383be6eacb345ceeb19ed87e7eb62a749c229af5b4d83e90f4795fc43a6c5be4316674990a59951e0c06bb5655e4453527b81219cc85e7afda11ab53f3f56fcb72fbf5b1002ec184a47894301b6b68df3aeaa5ebde29c21e54fe3e31d715c1cc6b60cccb43306ca31958f59445b81fd3343ed8d46020488ce3838ac66a39ec5799397c4049eaf109d94c521b5b66d4a1a2292d6bf926057c046603ba13fe5a0d7aea86a89acaf92972b73c0dc2d411db034e162b1f97636c460a5b656acf955e8ef86e6cac5cdf72642e0614129c71dfe5f2159a49f0ecbe06e4d460e52a28bb43f7b614f52d2e853c2552a6d13c5f30b8c9ce31eecf2c11e59a1124f99a8ea4484cd03a1b9870c25911a43e7510446dfa49826a948e9be8607e943a4e9d21c9fa8c5f34764b10ca49877d5374d4cbf838d5e4dcc1bba6a1f616d0092aae9c6cd91ab5ac9b91b8fd8bfb408e66d6406fe31367e10cd2e6ff14f7472a344b693d729c75fb0228c3ecaef18037b1b16c2587667e1fbc60d7204ba48c05e1ffe28c456602b8306cbc1810eecef7ebe289b9a463ba0176e1f1e61882f134ba38c309c02c0e5cacda1bf050578f377bd633bcb88f8e0ec2e2b180fa37293f339275167142db60eded6e05fbd0438ef828f47f324e7cc006cfb0b16f15967dd4796332e74f0c6d5a332cd961dd8e66e74746a1a015089de91559d7f5c2bb89137a27ff90a513caa837d2eb20c3c247afbd94a49097b420b06027651cb32ad986f13ddcebe974012e67eaabc74771a9d7f888f8823af1d1032ca3f9425b46f7959b1f4b7780cfc9734feeabb3cd2f15e6847e2dd373642767c74a05054fa25bc5b436dbb20f695c0d6c596b74c95d1451fdfeb522e56dac54eca408e3f4cf8eadf93efe29e9e3615329b55b88c08e1db0a1851eeee580d830f92c856cef1108a4c672335da4c051fb148cfc7e4724aa792b9bcb96084023a2695dfaee93394240a88b1bbbc482a65bb93adeb3c1d33321f8cd6bc6c21e271fd9b2ea07858ad4181be407d2dd9ce70b945972d7c4fc5021a5744fefb79d4b1fb6c5d3363a9826819d07881134819c6112634938c5128a1e9e3b187f3d2018188cf136f926e3c213a8803d158de32f12dfe2d28546b8397f6f8c3603e7591690c8df85deeef02f44cac8675e2e04279739529f1bce4fe6aa85d2290c2aaabf1ef6eb5045d73fd6ab705ac739b9970e44db3d1f8ad06c3a466dc771f69b877a29a3af26dc844540ae35b1ad56950e5bc221fcd440d17f7cc9a3b6a1619e91e0373b9569e18a8305c38767ba3364cc8885aa2c4ddc660c56bab43a27cbc83c89de3b38aa133e8b9e91f1d75e3e9d642d15d045fccbe29530801bcc85939cf9cf653ef367e034c1638fe1ab09f6a367b1e920d4518dfbac92b046e83b67815c3982936013b6f1b70d23e33d5dea1b49af763841ec90f5a505d1c217c9a619d650bcf5093e25e9fee3d48318ca97698c8e4373394e838521024b19c5b0ddcaea8d5ab05957aba1eb90383db7c07d1292c6e77e04d7b41eb300b2ba8c717d191b780271daf0c6ae1f8ab56fb4e009ab0ef1c8954f18d126ad897f20d68c1288fb894a95f889f5630d4be2b57aa9cb9753877d6572923931a32526e93e712c9eed4979b94c93b665375c369b936e416c03006c6b19d47ac4263c30701ec139cf63213648419e88291024277e79ddf99d9fe51c229f4004529967226211eca8af1fb8f6cf721af9233a4c4bfa985952b07cce03088d6574618f1e831b92641792556941bb589977e8182d0a8c9970fb294bf3c7996ed5297579cac9292ab8052db6ca9d985f8a92ec3c5ee9a0d7a5417c601ec061bdefc202ec046af74568dfe5b64560e3116ec8a4194a6fd3fd66c43e6ba783edf545acae5853ff227cf7264ed6723227f8c687b4318813a2555601d3b116988a9f5767bc3121ec272bd376bd99d997d380225e7107806b7889d378c0f2f454e4369571c11906b861ec9e2fd662d3f87241f2cb8f1ddbedd2f56f97aa83c97f7735905961826afa8f39a7d01de409da90a8c84d42e6f2f14e429afce4f5fe4eb026d89cf1dfd708fb9d90f5e87fd3c49b3f135250f55e3c56dbd60704cc0b691b84ceab16b3c39a3382da1feaa8da3d1e8f44891dbb8625693bc1447e78894535c9f3023490c8f4c383f3ac88e175aa76f40c402dcbf32311ecbd33d68df0798b80d630cfe95fcf280b6e2a47dc4ea35107bb15f5893ddbcd694a63916ec96c9923f8c56d3fe07fdd93ba17abdbcdae1954e1790985beb6183bf94243bd8c94cb3dcb3e8107039d50b7680329726b215c460ff7ce440e287ecf4a6e41dca288ae38ddeaafd1218e2de0e86b5532afb38675a700d846a4c95dadae36204eb3cebe9fa1784e10d2e8d1aacbce939f23cb244e3732abf00b0f5151953863a638cd88fca655e0688033c86f728b791a3fdea24a40fbbde2b970e655afe390659a0b79ba6d120b2ac1d58eb98d407a268c74ace444ca9291288489245ed61aff501f1d63561b22ea1064a1136c8 +0xae3d50c6b6dffc7062dcfb7788c60029a467c40b75e37f0320f001c4588e83024fe4be1cace1ebd8b1da1744a920546f +37456 +0xa882a12a0f506f5fd7046f4e7ff233904923350d8f56c51d5a4646ed312b9a252f83dbc759124c5a2e288f497f2218868033e17220655f0196dab6193c58293ca105d467d96e9d3a18ce6858808e8a113608803fbb90e26d7ab5923f9dc4390e258ef4d23a6b4a45bf7f62452a3c727a93287b3a0ae134a92e5e4325fc77b3e1e4a8a3cf22123bc44bc2e5d72636b90abe1d382cb55f3efddb5d3294ff7a80fe06da49283a6a59fee42059d51c844506e06f21dc6412e8b1a93bc65351d486adb2ac4ea3297b8a3db0202608b32c00b920a49d14be031b0cbf7f662c988daf3510a71a09974db7c7da4ab4389438d16aa746139a6b39bd5746b17ce57daee2e0495215212ee9c9e688266b2c67af9f609cdded3714bcb7db655a6f47a73e07f48536a8b59356a6dfe33db4aed39a54e428ef92b36195f2dd4501a71abf4505baebd9398b719c38fd1216f5848000d73e73066ad6f9cb55a80d2e8c266cccc67aa4c5326d6ec465873d39977717e910b6a4a9dd688566c783e669863257d9317cd782f92132d417c48e2f034f405ee794e4615330ac6f32b5f83bfd0827772e07ad96f86f66d735fd2b7fa0d4a265441f5ab434f717ed7d876a2b596e85aba5644e8b9521b2d2a77b3cb1d5cee6090fa02f2ce8856de8904165c2022d197f7edce1e93afdbdcf5583ea4e0c04b34f305f8a51d7a25769532b1086600d8afaa1b58f364ecd30d527605cddac3fb2418fa494aa6a167d76ae8c9401dbd58124f7377ffc3957b2ed0558bce61d478be615b774bf07a8861a89ae18bbdc4fa50666acdac26264ec1ed7b52ff1c6e4e546a8df531818221b5accd7c53bc9419fa7d75ac71133bb867085bddf8711de686a3166593e034ae3405f50c3090c741610338a6f70132627ebf7b9f42f65fcbd599992adb832e987d32a6139ad0bb0b3476085f9676a6b779815f096722a078c1bc6ac780e0bc6ae1b15514faf30bc1e5648908e7ea153207ec8acebd7c9c87cb9a2fbe1c9f8ab0121096a2f98e262fe44d1f6563e1ea6c7a5f6331ee6a804363a14c911705f5e27ececf2fef08868fb1ae5fd782e4a2c171688cf5527308662a6035c308baaa8c984a832e73d8c97bedf6bef1dd78dacb5d867c5b823c915a70659fe65a240518ff22372100955b7ef9b4b126cbf50f04cf379607161dc78ad61fdf4d83e8921203d47faa1db4b9036576daf8e70f9be8270a8e7a569cf781dbfd789b2e6ede0256dfa11c33cd6e9391ab90daa72f2dfff56dba17fc40cdd9f28cf041b23d455458b26009db35e8ca3ec1776e94ba11b6cadfad724f9f96fdaa5cdac3a7ca649299eb21059c84b3f1ad56f3073857039717eecd2bf9000f5773db9cb3879cb8479ae86861c0305cb46dea9846fa7c603b5d09bd7761288391df97ba73ca2accedcc48aad11edf4f8d10eadba053a0a3fe1abee317106f80175dffb886f80afeffae6a6cc5d0d818d606e631a5fc5a6b69c17cd26d9f4ba1627fa22b8f99a3dae7c1fc22a2beb12549e04b3eca2d001308f1d2000d6643540da4fd67e0178bfd40a74c610a110111330da8677f9e4837562c4cf058fdfd14636e80021afa39b294bef9ac6e703e493c1f8c2048a88944cbc15c37e2decf6f2e5cc89ea2ca23b75e8972694264cf59cf76451db7d449c7e4516e2b2d7140c0a8c035721a0fd0580887453c28674aaf67a281944fba003d4a6d115ebb6de7b57d696540e333d6312d48f07972e026d68f34c04872c253113874e456ff2d2aca1688c66f80be9bcf274ef2b5c477ea5bb0ad6f9eb375a8f068f945888b27805b0eded7729538977e90f9ca85af871b9b766d0dfb944c7837467ab387b1e59ef4b0bc16ee731a6febf4d9f64d66a621324b041a03a7df57624b79bcb9360fcd33c6a11337bcdc7b83cd8ff491bc4d91aca8f3223b3086bd1df266cfb179de91749b3e4ae2d50740d2755c43e702f5e3671acaa506f0db1fa6d5c27ae4e00a9253b8e43c744e235654a6ff72a1cd37acfe0aeb10fb5b5505b9602d4ce81aec363d9a235660aaa93286bcc9ff768d7b44de03e4f48cc27cf5a22c07942f9d2bf3bed98c273c5d115be5314c48c9c64951939048de3fd8cb661d83d20f2fb9226143d17f2d6be7e4490caf06ed100a1a499b3a772c8900c8ed78122d0c6d2167f5593c8ce773ddaa6049808a6aedbb7693615d007e0cdcede24e51692a6c5875268b5535d3e890dc5838403730b77cd6c5829265311fbfb2eafccc26d7a1b0d28b46b5fa814ec3e29765789ded01a0c3668b5525e4464ba07e2fecd692a1dcf87a17f94b5dfac965843d944eee50d9c4ecc82fb30624e34ef2442e08e9e13f6fa97b79c8e89123cdc54d2d9ab3298a43cee58cad251029170de62a3e5bf45a906fedd1c3bf866583d0f0af31da0024c8935ff674bfbc8f8127624bd7573fa11353eb7bfc216f01401de49384d1595bebc083e79a346e7915c5551d746a37b560ebf0e2a2dc9f796b2285650427a971f5dd1dea8e21ca985d6e3b1986138119f19eaa90884fbc506d754fae404b8519af4f7a89e116454fc08880ba9cd180214df2552ffcd93a08df9ccfd9c9cb50b540ae261003806311d7bad28b1922d96dfe7d9cfb71279d1539ff7271f115b0d7826f9d4795de98811b6b8d159b95d1725b96fe9da5a95a07f513d3f166b919e2cd1a6c8af8af7a1004113cc494992cb11de4d680daecf543998060f28b33e07989251044ac617c311a524e1284ab3fcc8dddd14fa150f37abfaba5dfef04c91e6f16051f31a31386c6955da9fc5a8f0753e86b549973d8ffa01c1f23f2aa2813b763c77528c2e463a150d7e55c059ef3e8aaf12a23c41a55135849694692822c2aa4d3e0e27f436a332b394f346ae434b48c2f4ab0d03c1d61d6910a5b6c6bba014fb6ecff06c50ce47b1e5205c8f33c50026230f116b2bb141d92a19186493003dafce3ff17edbe4dc6e39850ce406d43b43677450622a0b293daa9998eaf308abcf27043113210c795257c95d95059f7f818883d3ce070c5efb59cc3d4023e0e8c541c6b811686fa7c50995588a784f57484de3a1990bdb677dff5b0f4f6bb17cf7e42e8f62f934ed2f159103aba70b48007f3cc2a97ba1cc2964ed16fd13a3edcfd8e3bdec1c84d4f8446468e1d9fcdc11e6383fe8a28516694f2b5b3362ddc5b3e48e4a991887e3885eb78f12574a9ae34a7d1f3cc7b0cca48abce5daa1888b0dd2d73f4f3764a2482b317e276a1c0ade73b36a8f31497641db4abcd819cbc8446865a3f8bf44999e737b3f09589ab56b298329c829799caa0b7ae9170fcf03c06fe17e7bf94e51f3fd3cda9e69ee22f0339563cff768c746e2f6737dcebbc4e9aef2d8c02dab51b0921d55d0e73dd9d75a90208ce33d7e7d276662f49db89427ef41baafa382213bfac6ba8618b26386661c68e735214ab7a471bf63c3eef9e2f8762b30a2fc4afefdde11a8467247671fe244c8343bb25c1fc091b189847d829238342b7341535f620e601db7a80de04c8abb1729b43ed461fbe0c837a3a86f852fdc885f78c4c8f3fdb1cfb37a3e5bb7bcd6bc5cb3768832c9b48f1572011199042b2facca26a076530ba58410613f261f9c9f1561e3de59d216ee6a1a10d1965f2908a25eff4fb4ba77877193fef4625b15a89ce50c3fa0bf0dcd80c25d1543e7dffc8b5dda3d75d8fb5dc12b9ee2331949c038687914cd38a2149d937146694554f1adee3cd28155a20fbdffc871600141cd3312b3c3a9e4dcab0ab5d3cdd02190d0523aaf769fda7186ad380409b3ba04b8d30a41b6fc6cc37b0f4f0b1040219c82c068ba91990f72a8d9fdda12f2ed9a6a6179ab538e775f6af389a27981f07fee3fa1e68b359bac5e8877d3f4e6410cca24867a0426aeb961008c1f6f5a3441fb190db9cc3c27279103ce7617575f61bf665a35308eb9d8497c800a599596eb9394d3bdbc755aec2793294be30deea1336d1c643e8c3fc408b08deca1f8bd849dfa1c7ac3aadd020a7eb0dbc1cf97d40d83f59098e9e88688e4d94bae4c521400910f774aa15771200c8dad1766020335ee0d40a56c5e25af608fb2e858fca4a6a2d53cb72371425387e54a4e9bd63692f68bfccddf46a9676bd5a6b7e6643a7674955174f8d37c8935e338cf34bb730ee5984c78084b1b974ed3b183bc31e15851783fe7e82427ac60ac0101f95bc490015bb90eb113822752b35ab4a30c9e347fa68d7abb0c4ca34e6b2c4bb45b300194fdcaf7a046e6febc9a29b2639d7bf24746c3943835f156474642172b66bf47e4a5089c9e8d4f06d7b2a7e6c48b7f7bf180699c294421ad9565cacc27227a4b3a7cf9637290c626ea235bb68e7fb2b5c57e08fc54e4e1907ff14cd1703768f5ddaa27b5e6f652463c15ce8b88201d890b65271b81bb3be74c125190ce4e922e17561afbc067fc4e16af86ce7c17c7df0a604f617a71369a45ef6070090ffedc2ea8589bc98dcb27c0190de5300bb9a00b94073606afda91b2b101d9e821b6e86bc96bffc90dc7b7827ceb3a6ca5f9b2562cd702ec1d30b5db7fbc33352dc23b16e1db8d8892f8e7a400a633fa8d91ff334e472df5623fec07821ae7b6da28bc77172eafcdc267a06dccc83aa16a886eea23e01fe926101f7fe2a25b34d1f252d594eecc61451bc82709d9b628e4e7e6c2d229419013a9378cc6ddf876b928e77a80a24b0dc41c4818de5f0f58a4b5510483abf9b1cf141a74565126463bd062ac02d39697e773098874e4acf952fa96f960ecb0160259b27fbc884e6afff4aab4420814c75527f2c1f2eff7d396bf9de68e76cf85557ee5f71d0ad6abac9ba9da69c92d67b740ea0a810957ad160b4e1638d1bcc76f8d9d22a45d28d1eace46659f9f493db4c7dbaa49b834507de691d08483e1a4fa8dc14a760baaa46394699f0b10d013f5c3acea7187f78571584e5b9a16a5e39b8739b5be9cc6ecbcf5faced6a62aaf213c451222fb06129a6a6d00a3126f4efc82edaba296e370a0f9e23b27e9c0d9e13a8e6a839ecabfa223d607c7fda9abc586c5764a8368f9b5a9072e2760f85bddc66f39bdf7ab562e8c71b82d61bac39e9ca95ddfeabf4fa30c52eefe933bfcbce7d0c9f78e129de9ab275afec50a5e2dca81a789544f3a132aabc5d30af28327a699605aec655e788ade3761b201441d1a359d6f488082ad0cfbf9ce4e83b9c509b2470e980d5f86317f957faf073c1494ad87ba4ebaee18b928d319e658663f1b03c63a1a7369b9a6f3bd8044840fba3fd1ad91ee6547fd391c9bd95ad7523ce1742406fbfe43b9f320f78bf9e085b9238a561db1e9550395bd9939336a446565eeab9bc215b72f20f08bc8578366b648becb861eafe0d3d4f5155ff8780562ae57a121f7228bc3334ac060e5d57a5cb75655f3be1db014feab567331695edac4994fbf238c881c3615df7b2b3f8950773b3a8c179c8c6f1cc7a59e66a41475b09afd9ecdbb76e3303b3040b2275a3d9053c27bb3953e8c35304a072093f2dc7944f3e67d171dbf2aa3fbd801f6b6c90b8837e51a6e8c1251d08dd8e69dbfb7277d78bebb0844592b35886ba115659cefc1dff5d2913faa788eb536412a42adc32fd54e10f6b5583bd91e2018ea2f5f44e604d065641ffbb3520c4bb8a24467534153bf034936656277071ff0dfdcba12deeca15b51f3ae0904d83fd36e8d8de29b38391d699028a9f78991b05b33546293df8e3abe856a838d623a1af4e5c67525cce3e4be8b481741ed9ee1c6fdd63bec27bf8c159bd828d3f263169d14ba16c759e6e2b1ee6eb53e7b6d0a8702e7a6d10b5dd8bdfe9f00bfd0e24ed1e112cc69256a9fa883418ad47a27b3080a30aa2ad290a71e7668133943e04af91676a0f37996a20c106a9eec34f365b0dd594fdfc57f80a0cadb6a2a9485937b798d984d9d9273465e90f96feffaa6e742099dd92c53ebabc49f0c780cf8b0c1d300bf5fd9879abc355ca443f463011503e89dfe4f3370a72a5d010df1622931eb761a12759d9fd85c76a6528b57fba2e69f5637754898fcc5bc52cf8bea87358b98b34cb8fb0b019d850782fbfe1ef7b4d6d06de7baea125d6506a824b95134790e91f6ecca669ebe31cfbd8e7ff17a34341486eeb0ef52baff257f02f60f967e7fbcf957313619882407ea8a03fc943062296cd0522d22a333b83b6eca4ac262943d3b415905d9c303b7f138b1c8ad6e081705d5c92eebe1a9c5c6b05d8822edf41ba6f4695a463779e5bae0b2dc2eb8cde73b473d7a163d08570710d6541de7475e21b78abec8ab2c9b2cca2dc07dd459a0f46cd597097cf973e6d65d331b17370f93d1e4b8c7e9c4e0313d4bfd048a554a1a8eba0f2e6923234b491caf84466a34e68b9ed0abb7eabdb083341a2aa469ee94f3146aeccb2f6e1eb2384fc13c88d8012de18edcde463892e20f9f56e83c934ae30a2eaa69c45d4759dc9b38c13a00ccffd47bc3267f5cbda30415f220774124a8c4e5d20c8bf6af862e1c529d28b62f48a01ec6563d2e1a0d3d036512c1000a896b16cb7c2b433c8156597797f90112526cff4e382ab8916adff11787c3d9e4cd274a +0xb59b1626d9b8d6ff9a35bb5cd69d29702dca9471a3140e7c2106b295eea3193a850ca00d15469f6d355bb60f48a284e3 +38248 +0xef0c5e9abf77c9945949ae11a756e68dfe2b1438a38d40048e22c2fc6d6d62d7ec00bdcd34eceba9b17d5e2019240d61aab5d2edb3d211a955a79b318bd9d27068b80d6ea0bc3e684a2fd226e427d88998b76664bd66388ca1e09b3386ec8971ea9e16240cce0bfaabc9d0cc11458f2e509b9644cc30fdd7f93489a76690d103fb199f987f0a99875cb121baa76879775bc72b35e518a8afe60b2f3834acf04e2291727101583236e6518d97ae77df8d40a5ede11206803eefce538cf7272f79e76e55589aa01c2fd00fdb0b2f5a0997879ba3ed5ae2ceac9ce3be4bb7ebd6add21911f553caa09ba255d5c030f93fbeb9131704c694da2175b3381e7cdf2d116cf86eef33be06a2e58a415bbc3cc92a5d740fcc5c05ecc403a689ad4feb7cce3c7433ef4265966b2015e887d80bee02fb2654ed261b4cbdcd25789f37f70a0bcaf62a9c89a5981fdb6092ea8e4ef86f1b91ae102cbf42355b96ce9c3deb20f19fe4199f0f6753e59fd2062ce5ed2d98461de4dd75da15543662534e68af06a842a7c99fdd9410e6f2d30ef6e6d0d6a60332c0fb09520e41e5f2cf5ac02c04573ba80245f91217495fcb70f097df3ac0db380813f0117525f0ad0a6b4d486226134e8b396dcbb0376b22f5c10203a30f559785cc32fd9227e0facb2718ec673e51002e2241a523d8a04165112f2257baf9b7ffcfd800ac703c43dc3628015cc77d28b1a87b8ab753858e888a24259fea4f003ec3ea010c278cef0341856d89e8202ddd742561b5d1a27226d2ebf5c3c7e0db09516ee7fb75596609f0381a36cac1777a2e46126579805606918c780b7833ae29216e9cbf82290fb6ea48eeab95e86e507ee7840f74a6a0f1700d98bf26d0e267daf107a0758754d1d8bdd32f701d7a260a0fa1fbe99cbaaf16783c26f840e089240010e876f89c2461a0b00c83e903c67dc6507101eb0a082dd44c89170a0f57a9a29fddaf0650752ef86c88f7d371f67d1479b8e41afac45a2aaf30aab6d69b0edf9cc94538d68de6cdf1ecf4642c7fb2020419b9b1f0aa47814f63dacd9f1bfebfeff26316973432272680a1229c29c697dadca83956839ce1136acfd6d1a01f4b81a12f29fb31ba0ff38b279729bb5edce149db3993170053e38cb059d3f2198a381dd1f86b4e258c4057ae4b3cff25d702a777390f2e1cdda713a5de0fd99585fdb0720c4d511ca7f52a5dc53bbbc0922640a7c13290988a4745d8eeec1d3b42b9a03aeb0a034667fb4d5c8d90b8da15335a915a64041b5fac6b6e10d285b2cb5236501f0b2c4cd43808d42ba1be1966133e5d8b0d544d66bccc92cd29dba328b2badd30b794d5f695a2ed27d895258fac3434dd9546d8a660b26aac5ae5b55fbf7408a475028ad6fa65ce0a9c04a798e8833ed764a3612781631e35cb6c917a63abfa05af40127b5097a05c54d44787ad75a201e23293f20528d7f0e537de8084a9dadacc1417ed7d818aa36acdac66e55089e378bd130ed649bd661010457a0cb4d1ac34473e356b6bb56945b77f3c775d1a068c0a8c83da0ef71eb5bd6e6fe21507024ea1315a009c48354d5a67124be47ef188e3a45afbbfaea03a070067ee14a36484e99864265e6c90ea7e0def492ddc2cd20e039a1fa3097509b6a46b18f8ce5a3de91a5cc4f7490184ea18db597f5d40d453524b3003312488920181480baf6de2676049c2b00610836731df632429b4f47c397515274d352162c0b466936f24d92c123307d1cc454fbd00014f6267109c4f5f21b65786313bf088095ad935088b00d7227da2c22950b42c4b05823fdd33966d57fbdb049f3d02028a0c252aa060aa571f0b6b1143ef135ec56dcbdaa121170a1dccfaee079161d53e65bf7574c1f43b319973e01b92a43d76708760e7cd9bdf7d11fe6cf19ed5aa2d4bee400c14a42b611003583aa32d7266f4fcf934a1e9947eb22da8e6cc262960a7fbb0f1c283ceb65663a1278877a49de274cb1204cbd02897d0c76d831bf9de622eefaa3459cd3854dbe26aab4a7c24233501085e073b84a92ef40f2b7dc3af62cf25bfd1eecfeff2b3438c726ea2029d87c19f18667e99ce9155532c142edc912679b800097de41932ed1447aabd3f3ab4335d98b04170ef3f12c1efa8e36cd67b141e2b747f1eafa1088a91c775e4e10381cd47ad2b0ff58154e1da01896718151e79b9f57ca59d48bb77b78e74f77abbd0748d24e580c69f433c56e6c9d6413dbe4f12551d82cc6f2f6223c45f83ec254bdcd3df17cb4ce10659cc214bc0383b1c2a9e5b09bc235e8cd33c34e18d2189178c7fa468f66d8fc6c0a278b62de5576191c4d1e85b895cf9526aa5a01f002f5f0cfb3c800b13f0aafa42b4b32530d9b50def7d6468e8b39e6815de4440715e49e5ad6f0811254ddb8e129de9b101083f25842923e927a9a49ca5a876f95c5ffd9eff04a8118bee80047cfa01d8402d2861ec9bcde92e87337782cbde51a97ba4bf58c507122d1bc2e5e695a2a3d59097498f9c0b6de5957280150f235041f766d01f78ce1cf31cc9b8ba347518a879b566d5f3857f341a8a3fc43cedfe0a1e6a5abee6a437c538bc055fa02142a230aa3f276ae2260360a33cf819e664ed37d9e59cd7326c8bb9c3553da14f26a9fc9d5cebc7ca6b3aade3001a6fb489d289daf7211320c22de5082ebcfea7cea627b6468bd3e754c14a75129006ff75a25d961ab56115429305b01b4481d04182f71f846d56deec807f7ffac4a6703143fb35d5c08ab9f3a560e6a13df0738723b5fd9efb185a385f932a411c17aec49fabdeb0aa57b5dd4c40d04a0f1437a973a87b1d9be0014247d09d6e022062369db5b934db8db1086eeb969d22b5c5ae591abe88b7777b111e7c0109dd8b34902460efe8bcf7547df4aa6122df9bc49ebc51f167b6a671adcee07d9a151ecbd91ef6a855b35c4743c7c55962ac8ddd8186963a4300338b1f3d443aaa12a2d01972bd0b0129833262cd84a5e4f254b8609e31c1a2fde6706e55ef5fc03bdeea5808fe41768735bbe3f02f6e301ab8fc42ec6aaf0f1589c9a2fc2b1565fa9cc29fc800713c333a8dcd170ddbcf8a81523058892c0fb0e23dc41c3e8420b6a200f59a0dc4d9975a4e282a671548ac776131cad55f2c36bb75da9c71d379d8b94b63666b62d7195da7fc10854323e762d24d2a9771ed0fda18ef640c2bf8c6a94bf0146372be230a3f52b3af8ee9a2094c8c60188adaa307cf085c57b326e93aa9a48c3d1d141c2abf31fa2d1e21473578f7549dd07c5a0c422f6c9a948aa9340d87b6418a636c85cea2cd461a533daefd95ef716e5a9db0186b7c1cf5ad6f5e1ea27ab7e2327ae315ac1444aa08ec3c856f17db8afdd2bafac57426ff15a18185fcc1e64c0ab00c3b57b76df8c6bca7b58bb5224deb63f38f433c00d94ca965ea9d7117f17275c7e9ab9f0a291815b637f3b28fdeaeb62380f0bcf2addaedd2f38e7492f8f231dec7b1b26268835f33b3aff46a65ce351274d1dd44a045d7904bd6b09f8a124d177c70d9bfdb9102e4d0c565fb0cd1468714f0853ddc17cd66987d0f86cf5b2f3bb1f0fd67aac96691373fec89f941534b08549d2689d7391e838c788eee5440120d3a04a3feb3f3049024705e54a5c327f7050e47ce0e827eb30ad2001086e8633955d8bbffd81204827ddbc04686fee0890cbee8d443104fd1ff07245c7790f8dc495ff7d4bf2958b55114f8f76b6c4167709751c3fe4b588474fe42fbb19e979f1f839fa6f1a2c9d2a8034d8edc7511393980cac2c89b63756f9fa214bc7c092ade2afa9cf4e31f818b900933618117a66f609af92768364bfbd28cd01e9015248e3e51df5256226900a3721083f81c571b210a91a51a9baf1d7f47576144853638a6ec96926199331224d24ac942e8f445aa62b2ca195749df8e1cd00cff2007e34a13ea3d6e4e86c6fb6f0cbcc74324f3e3ea831dcd35c048e75363a828ad4097120e03dae4070b2610927ce2eff58f2fb4e92d269ffcbd6073343abc29f5885ce62408f12b8d6a394b82c2c623c5de0005a9d76df573e73018067ad069c0883bae9f210baba84a07958907edc97db96fbe70aa7b3864e7bfbf134e6d50d5e73b52c578afcb1f5399d4ed73e14be3c782c787ced7d195641651a1dc1a46fe4e65badf3265f6bc2ef6f2f72d290fc0b14308366a0926ce073bb4f94c5fb30165bfcf347ab591458326d5ef5e4d7fdb1eba6ac4a79aa1d97838d263c7c4ffa7d354770e76280583f932671d2dd501feb7eed37bac11a97d5e15912675d292b841299bb34e45ba3e39218ec8c34affef24e72ca1a2f6a58161d8db8c7d10d5fc5648246c2b94183eebfb343a4734e0770cad5e7fb0d2ffae2a8b97db07062e3bbbb8f881359e884ab6c940b9e2190c5e1849505dff2b1ecc6135ad5c3d3d063c1781013a93ea702c42929a8ebc83eb6cefc2e983b68c6aa3aedf0457453cc6c813ac25df6e0139aa385e2a01fcf9e56939201338fe7a4bfab7908614478bd4a7573f4eb7ed694c8d4035d859cb04621ca06bb5c5ff7f299a27501ada6cb39aa18a45630b39ac0f9c01208ce0502bca4ecaacb672e0226c4ca427a8f3db3b7e7d54c34c237951eca124262edcb4f685c75feb0087caec7cd6d61e19a5bdabea055fc3f147d6e14a625050a6961eedfb4f082e7a4ce463c200673c53393a8c45ff504c3abf78e391a92ea5dc56b79994ae6d7f0c095711a494fc8a3ff77965f734d2670fd286df283c662db864a681b9ab35e59e054a7e8b58400ec526a3be686c8b1b58ca285e79e39ff02307142dd01008691889e630e016d8d2ce0fdf1f006f2370fded88e7eb6881f70388292643a3901162dd52b109946fde40fb56112704436ee684cb02e692b649422f0cf3782d72e76549b789709bab380530301b45f5931efbd61c37d228e3eec644e61cd97559f307153d3e7bf234ea03f794c6c208ba87252da10f18f3b3ef790fde2acc45eb3c31880b5a9463b3fc2497aa99060661b14acf82111ebbcb5341d81da4bb63d0cacceb4a6522b4d0744e5a9b1c79b62fa55305e8c64d47d62208e6cb120d98b1a5be8621e58dae325c6b868fd783e2cd6a2917fbb40d617a64b5820ffc2aac36d6f1a1b9643c1982bb6264ad538d50e208b24de265c7cf5f2230f411eb7a6706644b843a6999bd679a1b3c1e17fdc91788d8efc661e15a2e646184fa676591ca57b677cb7d0b618a007e560aab3d1514f18244ce2ec5ca8f30307af2f653f129b719c19427facf92f573f99898b3fc804b98952356d9e72990851d2022ac50cc8d5babbeefcecd2882e26ef065c946039f012aec618779a58b48b6ad72d8765ae0667d715df024f4adb3fe3b9ae6ba46f4a74b52d53647aa29618dc06e3f2b7cb9217fd4fac69c9d80ceeea1c07122f15271407d3c4d1ae173b8ea829f4937da1f74f8104db9fccc031b89495ed444acc14750941d36baf27035151b8c5f611b1a47324cde320e283d83165cfc76e81d4a11c5bf0158ef8429c155b2bee772e8b28273b13697985a36ecdc0122bfd8eff4b7e5286f1b813fa442f46fbb4b33e8f00e0467dc516309f64024615917dbc8c822f9f4efe737cdeba2387b0df169c4dbd12d9558c937de866536a328e6b851cc38484e0924dad306c76afe3b43df237cb435643366db81ed455af1189438310ae21c5c463a32fcfb9bd11fcea75caed99f66fbf48f199933c6d870b08923108a09bb462d9207edd404b7074d87a70dfc7b068323aeb7ce61d2f74a782e419853936e354792215199ec62de404a89e7ed2e5e23492a7eca7d5001a7f8e9596f6c6a7d511aa348ce503a1bcb3058cae4b2a2b604ed6b363292273caeb923353de07430c1302e430c03d62af6a41932ad55bd564d97d9a7b1a541f18842459babb49bcfae1199dbb4b9a7d78824f588eade698527cfdc98edc085675c1bb55460f2c5a13f434dd86e7b976aa938549642538d8cba1edcd38eeadbe853cddd2805a2dcef9d50b302e1508d2a80699e225ebe11b32d0b411e3d2c2bba95df24de42cac701efc03220b6407261363e3bf5e626dc42a81f7342a28d5d2649d9f140be746e1f5e1931fc95532c55f24093d78194d88155e0da0764155a749844ae1422a7b99112e51a5c2492a44eddf50e90d70fecb85ad8de342bcc08eca9a6c223156c909e32ab54090e04c2961fe715e7919f002edf8fe893a1bb50d6a58a953540cadb90e6f447cbf9b16f74df9e0ea5574cfd2c0d8c5eea6ce91a79b3758f124bc982ad58475b698ea2912f45a16392d01fc9fa0b57aa02345e4f1efcf11881dd716d3ead2cf8ad74de11107b787a76a51f4de0027832a3a223d50da785984b9ecb858a102b865d536dd85fa6abbd197e5571261a7760945d3f968eddba773838deb0dba7cd6d42d558cd64f1c2924301c71e137add9b9f0eba79e9c6161d1050b2d7779a991524a0a6d766824663bbd97f3af04b324a8a5d9d65658923f29b9150e3a71218e7cb5c5fe0af81bf974aac85ae05b4fcd71ef1ef444b4f695fa1a0bfbab337d049feb28ccf8517b396b823df639adec5a92373b8fde33f6fcae9280746e3304ba48749348c316cacc8cde59740f7f11428618a00787582bd9c3ccf316d7f2611612ccb5ffefaa73195509bb52c641472bca0dfd09d493fdb3e623d4419ce40a8e6b6dd150f2af0cb650bec3f11286f66cda71a2f54a79f5216231b48 +0x757a852bcd6479d42065467ece8db9489f081568b54fa7d505ace1365ce78bab67351c10aa65fe0b8ce42291ec9d2132 +39040 +0x0d15d24f2d46d3d4473b68f9695da593e74120f1a1d753b484e541e154b45d35a80aa7b93657189650334029af082e5a700c902a5c731b8c6ce22d768c26b137a026440bc51695edd9ee12ac3d1bc141d9746b60616f004dd79537f15233752dfd53f06e62ea1482e95326aa9bfc27f02c60fbba3935caa0cee6a77b2b436fbec878f40a963b5bfc884ac34a5215280e71b786616b2b412c58bdc43ba1be6893087c9806e8723404bebb32b4e9cd8b43ae63557d7fbb2c9a7d02d75a3b0d2954c549248ae1f56542948ebc11e88b1a39ed4bb035fe4c5591459d28ff829677a807c6e0c0072db65d11aba789d8b99b953557deb16f4582bab976ff53fcc21d37d7db14cee582f1fe3efb3b4340bed7028f6f291a5a107cbde076a47e33f9e1aa3c7007dc005ddccc2164c268a8029626017bd79847140b41c3835ea7afa48da93f6d0213e2244170c5cf821f98ed9fa996633152bfb9f6ee688677f6f629e7dbe7ba4d9a1241e6912f25c49199e7bc34530f7f714967076dd968359492f2b8e93c40309a181a93d8694cd0e53258b36f4268091c6e8604661e0fe1a90b65c77a46e5f33b7d1912ec7a2eee44eca84d016a54167cb57eb6803d65c25ce7ecde370e92dda4c8a42a776ab266d64e3f5293d3bcf0b9a6b8e564405122d6b0eec3c89b3037fe8125a21e41bf7fc2e0858acc8689ddfac99a59ba2eba473fedd33fd4f5a549703003438b083f83312ae3bd558aa12667a78dd929108a7abe27021a0325db5b235ea6d566c719b84ab5bfb2d5e7ee1329c7fa2f59eda8037be5e51cff32b8b53f9276205684356736088232f5a657eb68b14721f3cdfc2a9fafe30d6d24269feb55dbeb04497bd71cab95055dcec3f84beede789fb96e37520d64b4f8040c604f2e3d00181dd35225275ef3b4671c80fb0525fb04b7e671bb88d0da46d9514194a504253909251e790347c4a27a49cca07e8674cbd24c2203a79047ffabdf8ae24298230f1359843fc7b73fd10d322461e267a99b0f889051f30ac3cc829d83608e61c1434657cca0fc162de62bbfcf66b832641d788203cef3a716556773733710c8c97da7073ec329cb568cd9d817d8884e6bf91423c5a22fcf07416149a48e50330164405122d1d6408269216542dfdb2386d6eb511df42feb603879075c8ed70b33a1181ebff18bdc79250a4e99a237197f5c06f552ec7c61e7e4b696e45f2cb925dc37545e4cd10702699c7b644a27981d346cf8adb49d9b65ea20dc8428d8a3a0bca6dd47092f29e7dde0d4ebfe30082706254076711affa1f5bfc2831261336be96c9fc2512eaaee28dd4275e7dcd166793ab7f54e7cf765ab9c302b4451d0500c9184174c54f3e0f29cab4c2cb25ba236b244717149ea77b4be0fc2e62fe115cd1e738d212c6a84e523f9b6f73a0fa2e595ce34020c40a0b92d45912284d083d31a536df93b78a4a77c12fc6dfd53302dec3f842a4a60a862f2bce01ed70462c78d0efffb0b8506e0afe066b8829012b6be7eaa108db45756145af702b0e57a507f8b8b5023fa7339c2493b00512f11291373eede5ca3753e9b091df797db9217f9b2591f0b3db359bf37c56cf396f52ef30697b94095c9c190b09b25154e74c3026bb1914cb88eeaad914a25ef2f866c671fefcbc0f21c88fa37b9b3b1a6e6fda39edace6dd2cc91953f1353cd618c8c76a63c3c6423363ae185bfc9f44bb16de3331dfdf6f234f87e28681c1693ce352983c734b48edf804d84f59165a69dbaca12c2466f8290c7703690ab512f1510879ed8da399cdf02471ba3308c1d718d602411d261e9a6a67450d526069c29c598dfb6567ab5fd67d63210d1f119f78dae4f51c9548f3e3b905e7db6be42d2fb642fabd1ff42025803b2859a1d03f563bb7ccc53cedc2231ce49d182ff89d85af474fd7351a9b77cd5814ab3974134b68f94c8965938192e36f719b354d9028c4f98f563f754e17c5488a745e73d7c2f337d8ebd7c0beadacf519d70429a19367d81dbca79a94bff88afe478965d9476ae2166eec0bd5edfa13fa4e25334e6038719f7cf6012bcae7adf48732b0b463208669751abb63de2b4aa78300e0f2e987446909b33f6fb3131fe1c5f2eae580b4a366b10c75e4f8e11785f83fb93bca04cf2f0557abdd12fb5f5a86327ad93ab7b7828509c1e5b88bf93a203a32957c117045d26bece06500fad34a89f72bfb7a314173cb05c2b7bc6e189d78d37c6a3de6420368593623d460d08561e64a4dacaf180f98e81850d2f4c5b284127d2efa9fa81ac5a73ad9e62fc6c942aeb09baf9f9abb2bbf632e601bb621d485f434d7eaec7b0c2d6ae1a6c64a78a4d6fb8ff3813df8dc022faaf4415e4df2949e16467683c6c47242e5a6b2c02610e5877528d2766b2266ca41000442a956c4b73dd6b10260570c6f506673cc541f50f0f5b021e864a753efab03e2f7c689acfc35f928ecea6c522cbc5687c38518bfa48c19ede887d33ffc23806be21803a3c9793e5ca7c75cfa1783f77d4a2ba5782e92c6950b472ea16c54f5ed96304d4fab8216bac789a15abc31d9b2c4da3e20fbc466c5c515221edcb9e5068881df171eeb02d1d093e20a97507dd6c7f35b20a87b4aeeba94461eb9ccde353d9f2180900e831037889760156a4437c819851d9132137e302713178ff831f829eacd12ab87381480ea2a11d2e9dd8449bf347e62833102ea50119fcbd680dde1f72a43cdcf625d210b22963c599a1ac146e1a988d9240b2da1ba1df9e25b44da36d1aa7351c238bc9e0943de341a89d363354560ce7cf59e8e7528a6a621db874c4bad38b8a855980556c124f3df4fd47677c8a6bdac609198eb363e9c64e08d8a00c28a6eb53267c38384ad2348db690351b9b73122cacb3384dd3e3fa51231829990f4de593d906b2814d34cf7cae59c3b8f1ec380929ff0ca6431fa62ef37c86e8ee4a204f5a66ebce823db5c8cfea39dbf49ef36668453348196671eb5f4be0822e63458e91e40aa753b48e79ff8ac00d0c51ec4a51cdd5bbbf8003924ecf5eed3861fc5966c8389427630498288280d4a1cccbbdccde18859b35052aaa4e29b3730becb7c1599c1e6710bd2b311ba0bb1bd837c7c1c12730174d1fbc5a11685b462bbeb08ae05fcc7984613d029a4847e23dd87118bf2844998ff84f4660446e1b871a4ca9a5a827c68799d3834aa2025ec357c2b91e44478bc439eb5683e57359e9a69406f0a0b6b6e10df79c72d373f7315cc38c26a2c354b4899872c172f267170d8f89096e01b25964b03559062216518e7a7a216b3f5c27915f82631474afd9f5451b373c9020b846073648619821e996f16955c6440be5f9476eb1f28098f907bfa2c42fec69c65d0287870c5c82c21b30420bdc59c9b568591ef3359e8a3dea0407f6719cf64b4eac105e30f69fa4c63dee8bd406fe61869c7a710456ed6f461c33162a282e0fc40aba15f5efe2573f22541dd7d312affc186b7388312a55c5100d6b811978d965266bf382ceb2a22de75b090d496d6872d5d740e8b6a7b80de77c3f9ff53e73d9070c41001b764e3992ed969def77548fdca8214d6ecd5fc6a96ad8ac47e7a3c9b58648965f98230a2df10eb04d993afc34c45edfdf0414995fbe7fcf94db32dd39bf4d6d207fe949bf4eb76dec39e361e5153fc593b59d2d10607c306681e8bc9aa19bace993689d51eedafd53c11864f8810b281246c32cc43717f844438c0fe013797c3f3c68afeab8be870a979fb074f20c2fe2214e3b832d984fb788e87d13fc2e05ace2b0269294ad349a2540eb614f88038dac06045629465c46b9c2af3c46036eb7ed09ab516aed2c8ad1c5bec780c8cb9b51b32f44146b48793ce34c63d840e0e9c53be63022c7966205f4d0af6c14b092771c6456d44d3ad87a13fd8e9a2d82c8d20e7e36a5839aab2897ca20fdb4dafc850a4a9352345becdb196ac774117dde7d4a1c6cd96962eca27453231aef7060e5458903766ad33cc8bf3a154e36f8b32cb667d8a7c113adda5414bfab0e9b47fe95caae2936c950a7cb168110e21ccd481b0884f7d2d8773afeb4fc9959823838c2b59d51df65b1e106a511a25e11b63a41a678b2e5d7d0293cdce2ca184ebbfb93f1d7d7aed1e6df3890cfecf2fef669f0eabbbe4238430fd4347a27932658afd12764a4eb327708297ec3d7e50b133cf07b5405312455558f63cb98123398bc44fe4d9fdeb3edc3a018f4498162971d08034e6efac390613512dd06dc9c028bb41f99afce79cf7a67066a2b0c280a730227aee0e43c7b9c8ee8b9573a8a1f82e93150be05afa59444ef2d66cf88f2a5a4917e4538b89e6e618e66757425750aaadd7bb3c97bf879007b46e012a8d91db7e9c6843f5e824078abec46d2948e8cc1cb207563054e906353bc831db0464202d68c853e57ae7899e854b49b00f26ef4a24aee1b763243341f973637c9c27c4f01da3080caaa808deda5a61990271a0c0afe0538f629f93d86dfe0a91bd4336412b76d4ce0ffbe1c61e703926db7f6d1ad46a204acbd1b44319d6bbccd04cf0ab02c24e9c0349c0ded23b54fbe2a6c0a3029adc5c1750f12c8d9beb507dab809833f3da094d1802a3860a398ac06e2813eb00fc45dd93e6ff299c1dff3df572934faa0b9815fd439eba6b5b55fd5c2fc7de1ae49a672102257e75c81b69a12326b65357cb165ff03adfdd3edfe1e734495c6739bc7c7eef5a0ca77e27b9352ebcf87e5304c6b6950276ee589b26a5d212f674604e6613eae754bfa4b6853801d0968961f79f97ae80000d3d1a240e85af3ca10ca2cc669167d70cd04a5610290c110318f61989a92e1bc850df7287cb988f9b736c080d8f56143d9555b45420c9e889fc92ccf311872a8e485d8aa810497fc2590ca17f213c9cc0486b288a65948d7c6150127a7405acfd6816e4f5f04c7d9402074111e375b1237ded1b1983e680590ba082764d342364448e09e7e81c19af22de4f8c62bc21d5ba6e1487f85a61be4026b57d098d1e71723572047432c472201425351b5a4f5562709d6c3f4a920a9334f3f5459b0e9355afb5b2011b1e6b8e2b7ab279eaaa312a672e2cb541a1cc996de6856dc86448835f3d972b4f8819b196b87b0ad7b2e756e43f4016ca0172b73405940eafc00f7fb6822a6f5a81fb5ee856f53acc09e69c6a594cc06e41ab7129d9a784bba2669f681bc229a69c9eda82deb7b6120fbd5f5c04b94e88d2c55ba1cb468c767bec86c6731506be5862b918d848d96444ea044bba0c2db4456edb5e52e7626abcefba641099732c15e57efcac1f211d39fb4fbbf1cbca7b19f674921900c2f3060eaec38ca5eb5a8595a0b0f2b129b76f4f862f345eb147b0fabbff86391ab9b7b7d8674fe0fbd40801a2d824855fbd55754c080a6b7ea4baea25f912d6d6397289cbb1c2c111231da809d4ba324fb97cfb05f8dc489f0c88532701579071cca6e2fd459ddcc7c246f74a293c1e5616464f4854329c7ef9b9b443cabccc9a1dc551e195298a8c3c148df85822c02f6e61f097bca5cdbb06bf8c1097cb01ab976e551d230e50daeaf6ca78f3f6be182c207d58949e52bf8e1a58f20b0ac622b4027b0471a4c630797e3b605f306eccda32541f6e84d2192a5a998c96e490ac0e12224c03956129420b6f232c585899e2f7f350cd11a23455e0cc24bde0d784002de9384b48a821ef3ec455dde7122be0e209a1129d79bd8b4d7f7f0298215734a64e7dcb4711b6cb78d96cd65521ef6e90d564e1b09f01451111efe7730492062bb06106191464815a2cccb83aee50c684f530bcc3a8ac1dac21fbeef9e7d11f1ebda68e2756978b532d19f600fdfc832ef779067f1d1a7faf2e278ba54170ca0fd492b60a2eec53e458c9123fc74f4f0f5ac2412b72d8d57aa4e74ffda81da17f83da302a23bf759e3e5e9f5fe0c564967d910f513063c99f14df9e7b92143fde49d16f1fbbad6ad15c4eefd9c0fb8e64fe69d3a8dc47d69d0c7509a78610efaca51cd5438d129e3e211e9645ee5e06eb4ba1006adcf166f4ea2c23f9fa805b8b1401054deeabaa253b42251ccf6968a9f3fb484fc8fcf5273c795ffb65deedca1542719776c4f936f96e1ed6faaa4e2175cd0d9016d72ba471e110146ea9211a27459ca8bbfb15d3e9d6e5fce6ad11d24f9ab3044cfc551d38f806ed6b6b9fdbd88ef90a04ba8a9c8b210d0719ce4e4ceff8eaf4e1e92bc1e03286def292a48f97931924077fc1f16be1168e1aaa6de1e54c17ea6c39fa63060532718abaf9b5f2d67f9f2ad74662fa7b74ea5fadfb41be18cc6d424b4b5129047c3d9a40e9ef58dd9ec3f55d9271b574bab45f6560dce8e37af61ab9b91cb794c6aba7c10f8c581cf94add5f309e3b414a64a04d5923d440960d4bf1be36305ac44449b7d51d7f29018c6968ab58ea85c683b8e22eb72e94b02b5c7fb53e31bad78fe6a1d5331c665a1120066d2241a6919a0fb06bf756646bc8d2d048852a2992f714fb8a4dde79657187c4e09aef185df02b349b64ca43fb7e358fe2bb884b69023b315ece33b6b6160700c023217f6e5e71eb379018a811a3fb0b1e31ea84dc49efffdd449ac2be872456664bb730451daa40cb09cff530e299de4598bf6a5f26a99380319212013d76425d84eedf94c60ad1b0323edfcbb2a876135075608430deb8e235b81900b16331105f56d1bfd03a1a918a03bc548c9d6ee1e9ab0bcdf115bc7d915b6c4f7b71cf194b7dbb48d4ae87e9a1ad1f6de8ff254bc4dec0aedfe53aacf51a7040042868e2c9d1f0a23bdea622f9a97d7a403445ab827f23a955a3a00ad163c984e40d9b176ad2265e8e50f1d7f2775afc3ad32caba30aa9401af78911a +0x46f2afc4632e2121e7ab844474534f44c4ad9a13a0b59eb86918aea1e16bb13f8e753dffbef875bc7818244a84e4e33f +39832 +0x60615f98c276b805508690a34676899bf8d93a365864d5f2bea207d5e9e92001418d74895e530183ce29525e1314a376ec6945e6d640449dd12648b56712b900eb9b26e3ff67e86758e7028dc6414ce26e8ed1545a46754435f8dbdc4f3f85a3e8f13d4eaa99b4da77286ad765e7cd0707b0a527ef5eaf0d708288f3a958cd13bef9817469d1af03b25450e5faed6e0c3e378a089a703c200c2b19a27b44d977f819bafa43f71f0b91d37d5e8c3b77199c8c489f656462a6915a5490cfedf1f81bbbaf8b41f44d199c0db9eb24b93058a815a79357226ac785790366ac3a5dbeb14629cd69ae81565c6bcb34c94fe1efea3b6f8d78939caa72efeccb1b1364f04222f068c50e03e958537de083e5d106ea666734d19d3f78df24d868226050b654b6cc055dfc1afb182e95985a6349c631ff583169299d5855808ee5cc096739716c854c37610fb42565dc0357b19156466c0a2b4920fc735b6bd8e91ef7f2a120abe2e45d232a3b065e1aca81b7f1dfb11745cb7768a5f1794d7c1c22103816eadcac76d72cb3b943831794e15eb189fb66d1b9fdebe0f9378e4327df3d83bf5565aba9ab62f255653b9a0a7d8c187babc3759ce38ff4b31e96f5b25d6719c4ebafa726e3af2f38f3ed6dd45f2a6fde4995fa1c2f3e2b48b5cd5a64a574434e3422689487fab189750356998f21fed95d4429e2ebdfcbe0849c39e6be4e4985b726b59c9d2bc17174e41e0113570d957038c8961e5a1da214695cdfb0db7390fc2458e62f29a71877f88db6f5b6e43a09d89fe0d19769b7ec9d89f8840509978b82171944deaba506a76a5d3d25cbefb18e78660b7df74795a189d941b252c4edaabbdde5311541a9597fa1f18b09dcefc219d3d4f60e7995dc2429efcc973da9020cdc190a2c13e97692271bd2e72a4bda4bcd34eaf77576b52191973a202a47f4d1bbe85139444d666c9ac2e1ad014d3fd6fc343ffb64bf964ab83fe435b44fe7d4255aee84fb5e91d5a0efa0a3887e59820adbde606ef9e66547f2b21e034a43dbc078ca5561a26094e1a9f710e86590179c32af6ebaab0c3be5b58c223ec06faf3449cbf49ea3397307f8ce3e488b4d5c5d3f9a6f715d72943b925a8b8d37d5182ad5daa8d9e98538b7e40d73d176f61af20c88a9ba987f38f090049f1939dcdd4a25e0bb3afaadac9b769cf8abb0f51906a15f65bee29beeadb772a70a4decc83b40c373ea6017975bb56315fdc1b0213f0409eba4c62e7f1a108dea88fc6d9fa62e6d1911a32dc19faa4b11ef2f91fa453f6c8395c9a0b4dea23bb2baccc72b32f8c4f4d64956f10e5b3a36ab84fe6bc15a7275b9755a53a2766545c847633488a5b24e62dcf9f150d219ca5647613e5b5b02083751c2240d92f4ecdbf5a7824f3d1e6ddde480870e17d1161b012139ba4c038638e541f1c800ceef1b5dfcdc30c9ef9a6ee7527cf03048622039a62587345f35e3ba40807ac8dd96af07cb0bd3500f1d3d6fd7979d2768f68d7758c9691cfd5e6157259accf00729bf7b7ad8dfda653e730377a2be0418198b449fef090bc548d9445907668236ef75427308fd70d945382c9a63facd3f144226e35d0e099f3d740a458fef855131f7e31c66d4185379b370a8a4fa8cc72fd9a78cdc211f73835a3050fa100240376de6dfb90ddcbb240d5a092b654897b2784f0234ea532963b23ee10f7000eb4900d423c84fc4f98c6d6f25c0e40a97e549a5ad2d10afa925a4bd6297b8873aafd7334f5c43d7f6f9fc39652d1fd9af107131f68f3c3bdb115a343a5b8fa015b01c8ecd3d901d98b5e23f2f39bdbdc77a1b7b432115fea86ff92bd1209e516496f46a0433df9ec8074609ecab67bec76c6d0cfdac4400f686ac2a8fb18ca40fa789515c06d8636f365020054cc4e5972e8f6b8df87049af9f99badcd502a1fe2c03ca3d7d2273738b2a0be0e47d392008aa2059cd42e2b902e8622053a84f196c8a5e0f6266d6be4ef952e73b39c24842e6b4cbf362d2fef7c2abc3f425b649b144933a7b4b9536c7e87e8118a189f8236aae4a31772164c64f1c2d8022de74415cf426917ab7c53d1c1615445c9519f45f963d5129d7d5b6b63dc6bf46d08365f8063c6b9a4452fac0a20d8813ef91feecf50e1922fd38102096f7783a935f654153e2d35445c444faaad0aa6e9d4a863a512452079b741db4b02675a52fee895e62818f50c10564f2b7c67214a92ad77135e7c483b773229b12bd7c30ad1a1977bb826835c0fca2d25057aaae1a1b38b826bf363c5b1c6afc4422568314ca5cb6e74b26ac4a9145bffeeb18e3f904f037ae1471da8e573c00cfbfcb456ce69b416d46915c68ac97e348ea865c4dcc4817544e3e06590cdfce3afaa21ebd551e40d5da70ee2135de66b6bcbac11e5d8880a0d56368c2239c900d3da5b810012ddca86e8d097e146370d0c97cb9759ef8991b12a8a7d485bb6bd1ef9ab86cd1103c6c6cae5685326e271f7a96ec5977df8b4c6bd76b941884890d774ac9daad0e8aac3b9c7c407546b62a35ce03d2d0877dbc49b65e0cc53e12493f7d91617d71ebed431f24b7c635437963eea6e8913698f1150f264375332e0daefab809297f89b9ecfef6f10e81f7956dbc7ca4a335047535a86b410ea903e22c8be7da9a818c979e0399f63373f905b9012e0deccce8d01349d60f79e9bc4f21f6c6ddb6be1c10c1f4b6ce1f537251b184632b55426c8815bc0eb49f3b7fddf504fc1966805fabbd9af482b8698902bc0fc407c6e1ba27a5c8bc3867e67412117d3296930d80f0fabdfc18e8fc679f4168f9a828eff7352a3488a4b834c579db290f5d23afa567e125759b955633b0aa58a91761b54e380cc919ff7c6b9797bcd03c7500abf799d8990810a9bd16be5ea77c5a5b7be5bab24f18519ad415f61d3960e6104c9d0d48e35d810b7a3850c51d1c7bfc89e442868e2ca2fab7641d642d24b93dd9bf4b9ac91bf5a3d5c0ee47822e812e267459ef4dfefb845caf94fb7430f56d9987dc3414eb755915d6204c9d5d75d89bbd8555563663200a1ce448d62ba28ad51b47808c74081584a46f3c374e5ee231e651206f7be3b60bd394b51bbdc97bd6a314e4f85fb6bf684f627f18ac44332d1742b96175822ea5fd2ca80a8f7128e148ccca2153873f0a02827d081d30b5da7ae286f3cd487021c2348b6c49a2794131f699d0f9847db2e3559fcf49284f7f34b8f0ef2b3d64c74935c5099364563c881ab9cbf9b462a81a654b34da37e963704c601b366af3debbb7bea913c0a71c72c092dafa20d433d03aea0175626ccf54273c4197d603b03f40de1474bd542719718cc7a4cebc9c2d5ae5fcc4b3be0b08d0ed27f6897d83fe5a8d115c6445a6a5b40f59a0c8032c584fa2ee6f31c85fb5cfdc96f98c4aa0208c336a74bc63e03e12835796168f287aa18b9e1ee4721383ad70554be6504fcc5e38e563cd941f0a12508a2dbe4adbbad607d678d5a56e99f1102e929f79d72a59044bd19fc1a9343cdeba0eca1b8c41787d5c250b47b9202326e777c0ac826304ff63683bd3c8e21895aee141e982360f57f9ce8e413d3fcc1949a150d1969fe892f7cda8b0c13d2fde304d2c9e06c221fc751b677c3f1f73511cb957cf5c058b23cdabee42df6c081f06fa9221600d38d498b39ddf0ae7a0362866de901cbe771cafa8166f69972bc1f9917b5ad83edb472a3f3851e5c0db303451ebfb1ef134e3636c2621a6e8212dd1baf031b67e93bdf26641bc17d2ada70a2189f8a9c748e2b1a0293fdf8571ca561cf78e41f4e69eb9d1bf07e9449d03707fbd6f06683d7f63ec24b15d96a3ff50609b59c2c95e524727ba1aa33f34ac2f1391487efb9b243ff7215f65444036862de17a8124834164113bdd8deaf80a0f840c6b57a9e8380f6a273142b6cfd6c12cd3d9c62edcd4d8374838ee6e7385d77b36c1d999ae2399ec3f0f3a16d847c905785fd90ef1716a40ec1310f22d86519f18304ef4744ca62670e19789e3f0665fd8f201ed4a82e4d52c56399fad734399b9a1fce1c31dfdc0c28f9f39793b60e2fc7b88f3706d0c9d12e9b29d7bb6761022fd2c8922fd68613d019b4e218f7e37ebe3b447ea9cab41a5b4c3131fb5b2ad592a27131954adb1ea1fd2f064548906ad10ce1240758868ed9fb32921dabe18681232a8308b955ad0d28e45c9f34af64bec1d7bfb626dbbf393cc090a8c64f8569b9870f008e801f7001578d8d286b0cc5eebaba2c920e1be7654d862326af52caf9f92e0346e516892b1af195a08dc384d7ecabd146a83563294c1af3699b8f13591378977eeef2a71a71215f3972198a320ffd4aa1349c4add4ea7bffb9e9ad15b486713a3286458342cb5306fa27f347167270f3e3da0fd15c7b4df59230693751a822e300bcc2b2c9ff5bf9fa975121ab4c1857a2df3f84739dae80eb332c83afc424dc2139a8e583d9b6365f19ba1926b5553e17ff5db0627725088e9dfee11803fd8b5da6ff04b97eeb23f1543717ced4ae100be3703c72333af54114e739d28d375a7babd0f6b419822a77f1cf03edd2ab3546338010e8f675afcd40f073268959b045ef22a5b9d004b2bb978bc5c9d6d416909696140feb5f9efacb20775c1fecf4811bfdf813cbf82283ef7145aa09b219b1b4b8302e377f2b8f5a802dbc797790f8d669d70833e6e498a18c6cda93cca77036f14c8c055dbc5698167d8ebc82eb72c96f2ae230565fc254e120a09baa2996c44650727b82bb152aec501913966db79c16d9e7e9d1fbc8b07a4a4349d505eb05c12428c1758e95bb0a8ca6a43a7e8ef667cd6087de20745f5ed30cc6d4a537a269b0f600be9f9ef1761b7d97f686c07f68ec943106368c0695a1433a2f6f424246dd2460e654f8743ae3e61552ed16e0231fcd10d0a5d950289e30cd6fcdd48e6191f90874176aed5ece2946d71b55c1a04f514cc4d623e21eb01aa51b26b42ec1b5be21f04fbd04e8c38d510c7948c9e6626a0c6a2f32677fc14bedbbe1abc96e32bcd2e363b960e2a95b5e796db6a1fd425d784b19cd8553b809cbd868810771ee3844d4bd26aa536adc97a76066f1edd575baeefdbee4a37d9d67f922fe92d1d37d9e4bc4cc8944ed55221dbb2160be05f9f7db41cb2d76f84feaa677e90f96c8d209d0e073a6bc1a112763e4af9679b8305a9b4fbd08d511667c67cf0c29c9b47eadec79e2a8c3d957cf0245d83c26d86308b58d5b1cc7b02c44c5922d867181cab126f7e23861126e41814464facb4cdb2cb1656f1254bde76b472815ce9616fe3e07c33bfe9fad9fa6684b1a7772fcddec183ebf918420e01876fa8caa405b627b1643b5a18492322640c1c35c22d0b470717f154260c15f74d86e5ac278383d91dbe017ca19aa6fe8900e2750e4b0a7e1449237cdef88aba7f7ed46bd4595d9a7de022b2065db9d15e0990efcbf84fd671adeedd93a5e0ed85be01943b05a7ce6a812b74c700e06d4b9cc4007bb34ff2979cb010e4729ce308aad9bfec06f6f76c07684f5422cf04ea10e841ae0a8f550ecc1391620d334d60ebe94937dbcfa7eae985ac4e41ba4ab22c8a4dd37c92703f8285f96cd4288f26f79ccadef2a6426fbdf01615dc56a12c46066f7c77ddc6b27683939546012ae33480bf21f9ff7982eb24073b51089ab0e3f931198ad5db000e990a4bf131930e492180a1404f9f9cf7be0a2f4e64b9f88cdf3d2b342f3f90b142b821645e7a009bebc9ed642b37466a1aa98232ef616ba724de31f22e46ed14fd4795fddc2272b36bf566e3f6d2e7c8c63fa4ad0d3372d976aebe4377839d9035131a4c3f3edd161e9d9e3e56f5298a3d6736fb32a2b68a213930b67f97fab996b54ecdfc21983a701d03d1b00064350caa99cc1431af3fd0e839b9cad6bd077ea87401976d3ca70d1e285c8697204fb0644d8e1652b570e23629cbdde22cf079674a75959452c241fb8c2d6f3c0630a53ed2cfbda861b3f1cd917b2d2cf30b037c32987b194332bb4f9fc2ce315e8e6794c9ef8e854c7f7c08f1263d1987cd9941cce8bc7eb67ee584e3bb2849c1cf7400839bed8bde49dd62d98b825a53aec76259f4de3704fd3d25f88501d7a86a570c90236f2e8f99b275aae99151ff250a589a3b54d4b7343ecd3eaeef5daaf59d03903487dfe8e587bbf5eeee82e2d6de9eee2ac4ca55ba76c536a7455e21d7929fe43ddc3262b3c9903af9fe7f971ab0afd651829a690651b860fca85ba5a6f43c0cadb0a8959af4bcfaa945aa94972cf5d33e32d7599e7c115e1d9cd8beea1e628a12c9b4e9f1957cb55b589653a2a01b654f39d3bfe9326a7e887757d5f79daddcfb6be9e86e2869ebaebbb56ce3b68b2d132c41f48d311e52dbdc4b7375de6885c63baa19572a0f1e11c39a48c0dccf7b186e94afe0e4c76b7640362fdb7d4d15119d97e54326d6bd0314c76fc08f52dfcd953e3a8ab9d048e627ba53aee6a5fb5c2615e4b88b5b591133af4a795abfdbb124b13ce14cd34bba171a9756a71db90459b6803dd3f762ca84b48141ab50ff5191902f9b0a4b0450730953693b0ecea8acfc5039ad457a7dac997cb01dc0ab2d605d7b0e7e920347eff9206d1f13bcc79459cd3253c000c90fa0c55b0e896fa3157bb7c21662b91ed25c86b8cfa703dfa4416fce83f1863b228cc3991a15cd61256d5e4c6e17a633beb5eef2c943246f5155b0549a448b2279902ff0ace044d614b4e703e23b5b252997d1a198729ee52019276b2353703d995d43085393668067e4da8f2f4838619774c73bb9bfe3df94ee4d88ab88d5daf666a5369a8992ee937fb15481b8ce878ccf4827b98593bd24478b139f6f4c99153edf01ee4d5a7f2be7f3ea96279df57e29ccfbf45e1f1c62d778c27b7124d67a385900cb593db0a5a02ab7e8ff2749eff6de3f06b3f66bb4f08eebcc38ff4199f59ba9be27bd31755ace52d6b9eae356c8f4577d21ba29af4546160e114c3908f92f63335349602f5a47320be26950571297dba42 +0x9a7e7f53e213c84fee6961a65064a3c426c68ce6432266158c60f7a3f87975386301ed4c89d222eb55ef6efd7dd23ec9 +40624 +0x8cb8a7327c0f73a1f97bc61f5a07542091f034f10afbe4a7d70c8e560bf58983638c23db2c009e25606d787513adf0a20d72c5fbb99141363ea176a9ebc5c8bdd8c6ab9fca65ae3858efb9604c11924e4ceea653ba6f07c9d8dab14630a71115338fc8e620e5acc427290f48cfdb450c958d6063d53c3e47eee0c693a2426e73bb0e0018f4299fb01644059562b20ec42f767a92d4a1ee9ac8db3dfa083fe6bfb96cde9d0fd88fe46d6820afce3ef75e63d37c477d4520a9aef29fe12b4581e175d0e7dd399b844774bceafeda2807c379c9efec9ad1dc5ce84d72b2d4fd48c13763a541391a87c37369eaeb501846d9b9825ae8f1ec289bbd1541d4c90e4247474c9f2fd9fc9f3fb196a8dcf6b5bd896a2645a34b3f0e4e777291afd322785cecb45d10dfead5a4776cad3a96a873bcd6dc38856f71955d5c8becabb9def0e670c3684d148b30d80d13806ef698705843cdbcf6272bc5b0b589d93045ecb4ce19a0474c4088b8c4bbb2a9dedf2ebd46fa21585e3915a730c993e1a63df4ccfd307482772b887550c972b1f41812616f43ff95256ed642c3e2d28a756a9d3e5afc66a2359c3470657e7a1f176beb64ba658ffab38e179f52466e5f05949014ccc79f2eed5d34b0e923f37bae9e62cf0eaafb0f70617fc4c63e8ee5bf8275563dd747ae09342f3dc600044e237a1ea95558685cc5aeb7bb05125aa609fef30a947685aaf0eacd20e25dd61eddc7c8fa76b8006a183f668cf90afb294cceb23ab9ea81ab0a47b76027829076444d07cb5912ebc0d2da353d886e99f6f1bb5bed937b6438bf1295057bb65bdbc0d38423e6ae51e65c48ccd89c855b965e8d962c0c7356da77150e18c8435fd7b923e60a05d359651c51d2641c986a90fd0c0afe0b187e189a16cb9ff56fc3f19703d6889ecb2bc47cbcf0eaf0efee6c3500606b79b4057a90de74a5ea83b0b2c23cfca699dcf08be353cd7100d20eb36d303f7b3c8d1288c135b02f8fc64da0a396ff6bde4fd043b9dc12013489f2ec0f6550373debcecb96e22747cc82c345a0d888e0556cf273652066a2745bc39f82673ba6641861ca75af82f489fd392922cc3e0be77a7fa351e7725da892a9542efea7d09a5bf20dc762693fae81d8d29238caf67ac39e5be4f9dd39b874cb947bf23cbec5fba91df5c4832e2354c7ca56e5d3a9f78d7824861d503f8c4a52e6d10aa377ce41af81659d79ccd0be2f99d89b022a472135859f1d73760c5b65d3980f84039e752cc181b5f21e9d0938c57e21ff8350c7fc0797bfede621f12de238ca866b1cdf4766b0d3972e737b09d8b24171bcfcc6f530d7cc6797b152d29b190052b62fc629f759c11003385ecb5adbc100db3268498bc50b8892a5c77b86a37c90ecc174fafce64504a5d6f8a5d1606a55eadaf3209dca46f9dee698502c3f05e716b92fe1febe281c1d3392c0c7ab0418f0dbb0a1f04f4361835b0d7a145362ff3bfe4006844931ff72397344c32357f1f61fe7f50bbacb698aeb6e21c6495c81637aef9216ef2a55accee5584e302a86038de0437674a6b9fa80026ccb87bb15961483ad3c18d9c8d4dc2e24ef3a47821f0de2b4bae69cf8db011284aa774762ddb4467e7f2c08fef04a97d12ea9748b528736705e7775ce3555e691eb7fc7113f427e2e66937d9f0b00688793e67a49a5e3259eea8ef8e51166c6ba170905c9c5a774e47ab501542ae6e96da75721661f09f567e695efe2761bfa27b57cc73376c970c941fb5bc557e462acf1653087c9e2eef2dbf320706d5cc9014d40d6f75a91b90545cb559999e21a6bf9787156a9545a6851105335fd117d7067bdfabc79e799bf0e8eb578f9c85ad348f9aa7bca487ff0ce5452d92e225c9b8c5bfa2adcb4562022ad440c7d7e6a0c654ea49e31a7a7b3dc27e4050878afab4382a0ea8ade394f0b8ecafa2fec923dd8e12766e85718d802f1d06194f9bdc7159ab2a48b4f8a74519b0fed17fb1a8f2a19fb7bf6421a88c91adf94d98ed018890bf9ffe8ed91b97a3bda8b3c914929e25de786634ef7ebb70ad947df202ec6273d3da4a8a2964410d5f47ca69768338817b42f3765f52856298621af9520f87798463bd355e03d9bd326695df6bfd7a5ae2a1d7b6e5e682ee0adcb50d7eed60285db6b72eeb8cda19c36fa6a94963bc08a11f9375178d2c59518eccacce0894f6ac6dc8b54661cac98ecd6d45b35876113316a71f68c8fa5b18d2d265e3e39e6b0cd3729713251432f12a6a332e3e410b152193345e1c6569dd5366b744f0d50c0b924512c6394efc96e11df00ea7a56cc3bad8426c1a05ec0b8aea1f55c2e1400514a0d6d430f36cecac091af9070baccb5cf6d8172454781fd3dd1cbadc4bada5f52641c18e7a3a6ec5ac1261eeec5198827f43e3ddc994a6e8c02dd8af6cbb5a9e35f222b47bbb99c88754ddb1efd1b7c5c24456a8dda82d1433c133beccef9f9a60465c4550870a4f2b70c1126ec3a5817027e41829490ef0a875507cf4b0d15435dce2b391131cb3f8e4b062e1adfe6ff98d10ae04ede9087ec8b38c7ca5bc5617245a71c5e65d81803f2045f0e70ecbded270cd291d37b65729d14fbd44ad3a849b38126787594241ce951e0505733f80966907ee4d77a4a2273e494f04205c2ecfe027ee6c7c70ce31835da68fa8359f578de0ccf5253df02f6efb9a7ab255463106f4d30c538776068fa75dfc3a488b8433ea5daaccfcb1d0c7f9380eef909b4cf13badfd6b10e9abfe6d83b195d2c5ab1f8718e4eb6b6789eda4a03714a86e92535ee7a61f8799907432c076377ede4a95397729ed04a1d954905b89ddf760af91c1089d0d75f65265798c80bbb755d12983f0f05e52c13d714ec28da827f1d321149948a136807066b450878ee69cdd61093ebecbc07624e8328da91f9492cba5cc124f7773d868dc65b4e12db743cdc00b890b91e8113e0dee156280d7d3e78459fc07fca86eaa5b2012341493cb30cb3d986d6d3422c776c3e250986c35c54140cf18ad3ea3b35755f0e6dff69394e701c53a9a3f3b8fa7668ce9a2cc28d36102f3e805b128224589e97fec6a4d78a7ea9819c563cbc514487d945c723d90682312fc92aa6c75ca3e6465c669594a826a99815b3c442641ec2cf711e8d48acb2394ccd084d10c49e5ea4efa7e37890b0441e7e8334511b4c413785faa9e311e8701ef5bdaf6744912f382051368b2b64a19d3e8e33f25e152d99eb231fb11b6cfd2ca71075d3c4c3808a552b38d65f89e99cbd9c6a2c15c3ae7d0a6196bab38509fe4ccb475d2c7d7a23f7fe8f60156943a463758107289ceb6c4a7cb707c27dbc1d4db4cc0b6407458a6f92e331364ad83c98e01f8b7fe90dee133b299f2e9a3d101094ade755a9084724afdd52a875d0ecc4a7ecc102f13b89cd67948be125b55fff3292f9e5abece37d1d24ca5532523c4f9092b09afe9ec7e0c8a2d1c1654b9381582148fd5418e5e4a361a123c986b5a164b6602d565e2fb526f97bb8a42833fdcc05dc86edb4d5c00b3ce0fc8195de22ea03daa442a249b2494190ad2873c7dd57e4bd66beea3c781b5c8ec7a3a73f3bec1e25e80a929e40f92319873b55d888c167f4870fe0a1769c6ab36c77e3615230b249e0f657b5c8fd461d3023f6ed66d23587cf28be8c21550d58d24572cbd180654f734e1916b01e54a48f287d8edf52f7812850ad85e110ee83e3557c051ea2df3e8b59ff4a6124f2b78c9413435b0854e779d1d5151e93b53f86ee2898a35ec91e0f6032d844d7ca5c0faddf9542bdf5c3aaf15dc340a70991a35a9e0bc67ecbf8e6abda48c0fe849d00bd0a0bfc39811ca2f96d18af14928323df07e6f1c88cd3fa821d233c63c882470abb2ef144a1fb4b312f9bd4a2f91cecc68bb28b06b5b7322d26f022cc3c12cddd1b848aa6fd678ce0c9d41519e664e75751f6fcfeedac76f31b37d9028b55787d52972d263c684d4f634bdb400064fcd9823aab79ddbbae1e2581c9cd5b53313487ef438e060676c726898fe0f02314964507023e2debc2f46b545af45515e148e21235a4054af08e391597c15da915d4c3e3681784459bbe163bf44120a26e028c8a6931de3ba1ecc5775dabf0ffe9dc235945ca8acf1fc34dbbff7a6402c2aaaddf49fc3ce2722bf2384766512c76f68eee0220e893374d395ee368cb3ec3886c973ccfc5454b92e7dfbfb92738a6692c2c05e14699cca201ab08d3fb5d5be3f23ca970216e1568cdf42c6e1b2c5f7f249ab7d54be7c40bcf2ad7839c6771056755faa8f965b6f6cbfff64bd40f8b7e9fc080c3a08709d0c864b63f5765ec34f26b963ff53018840a898419fbe911afc427c975ed81813916e00ed0d45eb6b9bb05e5fdbcd92159b219409f37c3d95abc56f8b1d9db168ee12648ffba5ab6dcebab4faaf768bbbfea3891a731a4cbc7aed577400c9faf1650bfca92b161d4e4aae63c0d4de3cdfcda6ddff79094cf3dc32dacea2fd5331a8c32fe51637cf81b1f3c14ef67543f59ab409359fd9bcd0623e50176ea838ce2bd074b0675b20ac773373f18ecc2f91e8539139220c2ad68f585dcaee4b3a1b609c71877920cf231cd5f25508536e2938fe1c86da01057ac6296a758c66c5ade9bf9cf6d609098a1563b2f5fdab7e400f2bf1ab1268eb319919fc93d37b79fa19925d7b08748e55e3653c30c924de6acd55c72255942aaf9aa28aa25e09b58492cd49808b03cbfb2942f4b205600d1e0613e3693e2362292d7b9b2d868206d1c7b8c7a3d837310e398582d64cdd98be4beefd0c16872042e3edb491d794ec663afd8e516a7f5be3a6c55d39da0dffd0013f7a67794fc39130715d7bdb82e4c65ef3d415dc5cab2ff35aea396761b0f7c88dc227f0edea8895bf0c481cfc7e56c6445f6d884fbd57a1eec0716f893aa9f4728aaa07d2038da62f3782e66217abe35776c508d8e0ef34c9666e4ce51b4b27562a8a189c8d34c43a65c8f2445f4a48b5b0b8c878e44b1ea3427c99f5d17fd3d13834bdbe060292791d66bb23a39668e7a3c561b0061fd1e4eb48d13bdb9c8c5c2a3661b6fc6b7353d4f89b708334c655b6574f1ee4c1f106d74f8d37b845b35f770baf17eef3f963130b2dcb8c89e3987f0afb05fed5fea18cfd1879f5efdb63b520e0314c20871f5dfaec951e2a3318443cf005c2c04d1d82de2d72f31f87014b12bfc39275cef12c64525db68a476dcc89c8becf158ef34f6f16935e4928a0df5da82f50681380f4b3f995f42e92f16e5def61724a16cb492c7e8b85f142cab86e13d5147c07374d863cce358ba85bb045cece5ad2870e06a2cfac18ac68078cc08d754d361c8cad47a6772925fa0528cdf135f74352241e4e847574defabfb3019f50790ac6097a74c1111d81fa763e52f138c6210aa5e69c2788290d8d8bc18da427067e96366b8a173ca1244c377761495755d0031bf6283354a3bca2d44ed156399405ff9bc714134a428141b15a95641204e4edfed35f325b8360bd21a1890038a0457482339f4fda802d8d8c5e5bcbe971e43db6f4cdaf1d369e3f0c6ff14c84a99197b22788176dc88d7210f930fb5e2b3254ecd0d0041a4bc9cafd10c685ae0e9edb84297b1464aa35b1f7c1917cd07f73c5f90e22dbb31187d36c2a6566257db1b2709fc4c16fa39aaf993e09caf10d1d2373f32280a8463cdae2134a488b456eaf201101a8df2330dd8dc50660204282dfd6264bad4a587d53e77201b730144a43eb23be2543c7acce4e0d13c6fece696da82e2abc29a6add0f4ad183cc468c8f36a3e66e12e0f52f4426cce89ecff255f62613c37b6df62c4925afa43a8916f3ff5c778470e48b7e2137a73036b534b278d65fc9a826110c138d224566d4ca1ac46558ed16522600a299ccdde0a794f5881a2e87f0cba5c3950c9230f72e904bab47ef71ab31adfef0d6a1b743abfa65507be8c3fc66999af829672b96a050cddc89a6d7d88a07c03276908508cc4e4bf580f54673fed5d9646d09ffeb30f2e980b3e4e944641e8e91ff0011d60f78efa2b2bed8fe9c41c8005ee1749de85ee7bf4d106d97c7d9b035fb5921567e60997d97a9404547c5aff586555155d07c0fc0e0942c7bbc206d45f1027e2f20ef91aeb91f48ef0749d56a6dce60baef35a8acf3d7ee9649db0fea6a65f00afd0b1e5ea089b6a5e4b5838899b567754d6ffcaa0f417a9079f2dc4bede93e8f1e9d8ab5d24d530ee7f1017794702f2df21351e3bb3a9a12514e1d9102f632658a8e1bdad9d5e7d317e5975ee669808be70af07f7f2a14c4dbd519e331f4923549c41af63d873a9b7d7a8d6515062137333a21a5e379b14d1e701a6a034b27a66429cf3084cd130f1f962ab6abb1dcd8de8d2c7d708f39562208664dff64b961e2a481b1380e3cd60722b77630d17716f1ea5830add57486f08346b5aea5100dcb1c79a0e0b17b993d077cd02acdbb9b7338eee623b12a868fcb02ca9677f353287b002605209900c72bc1ea230f700c6c6136c6588c22fd07c6e2b341432bdb00a85c6b2ec25eb2af78ceeca2fe5e14e44c78f9d6cf2594615e2e99376f814c5b8bd596e3ff9158fdd5eaff30024c59e4e1fca725e0fbf3a47a2da3fe65ba4f410cb5d0ad3ffc99b7295f4b54830483730809f6cb296cc1d80128fa208ba18bbb13424012ea651ee75e73f796e94c3b9aa9e911521040a605dd67c5254bfda9d088c60f9c68958f945b6f2b7e9ded2960ace21e42ff3e4c34f5322d930c955089538764d3225493c7089b119505aff4cdf93d46215d2f586d31d15af4353229ec5cce683e7e69d2874d3ece628a5944e97942b07992db75b6798b73cf309cdb048ce24265e59ef5dc12a18d6d94b5c3bd123885d1060a4919b5aaa1ad649b0fd6c90d1bd0c0b9a4ce3f0d743f8c891750ad69ecb221847c9dcd740b1539f76d6cfc951b0875838666bcc8ab5fd89ee8aa331b0ea34b10b74aa932da8f17779ccd0ec369946ec444ab711a5b55e2bcdfd48a97122cec78a229322b35a366e54501e5df2efc114485a6474dacaa11aaa3d59c2521d56c82e4414ea945da8e070f116b3191c9c8caf25d24a8c5e5cc32ddb54f0c632733f7259be6f231bbf7a5a3048600bb82fa2033daf272cf8e7d1a357d8d96ffa9a99e0f +0xbe87bf6e103f66527b12a010e50eb157524c76f0fa7118ef8f0659f3a8734008f973bdadfcff5d84cfeef0914245f47a +41416 +0x7eb077392096a265d703e730e8b65d65c5eaa03f8fcd777bd933b4b0af8c5ce3d613085656498ba236a2d505877e18fda45a2916b74828007f9c63e451e978f85d2cba523346d6fa86b0b7422f6aa65a7434b61f8b015f345aa9695481de0be69a6155d2bf75cb944d95538fe86251a3c0df100112e0643ef1c08da746535fd5161ba08103bfb29916b87192bb4e5f010dc3ff6554ce7e47cc4b9886a930baec57c36404060ad2306683dbf6af16199be5484af35ab1f67774b05398b05d6553e7bf6906d1407482c75d5861cda2c79acfd6bb522b7314f57059838665c2a8334e79772d6a47e0b6c0aeaf7c1cdab12554d5182bcffa20ea48acf3f7d048cab412575621db095ef5dadfa9eea4a71e65faad2a254f30627d85136a94f8d515fdbdc3cd8b2c6c36679b560e5f6def58814cc6b9e9b2fb22d7aef5af05e552cf37d724a613635aaf338d7ca679809ca5a2cf898d1e0045a71f4bb98bf19fa84189e6e2a7608aba128238b938e1e4944ef00d5c6d6d42f53a7ee5c9c6002fbdb31c7465991ba873a77b23768e42a1c19a928da8227e7ff3231c038c28db9c7b6d17081443ebc66fb647d6196e42c009d3b1d7d675f8bf27aa202d6a792aeec9b6a32b596f79eb95870dd90ca18948563f74744c2b840a7917b3ebcb80942d8ed8e8639be36d1fcd62f6b5b5efc0418f2804eb740fc969d1b1fcc61706c262b4190d3b43686e6aff8e2af17e1f8fb39cd488c4b5e870e317c12445b6d35c9522c23b38b7c624d51354d015cefb9da7658c2988767d2081338f52f111af09ccc01a99e460c53867f2fc10a90c499324d1970fbe2197824a0d63af508e627111766b50c6a62d522982ce1336a2d21833ca3f61ee1dfe3d468d8563ec96b33d6b2cfb8766f2c51921ac110144f75ed5db38ca48a0d27afa7d9c3c954d926b15e3ca14674daa563659590f025973b572240181eb5da8d361f820d26df9e852a07f38fc180238a850d96f0e3cff7e9e96160eac73ac07d019be028d147a023087495efbc10d028310a7d857dabd80e2e9ba47930716573bcbd72bb6b25846cd7149255b8af772af1ecd7a32021be1491517947dd02200da1e4c82946e191ef1078673629c47eef321533fe6dda2099bbf35deb4f5586a76bb24ee717147f163f108325a1f85e019c23f0dbd92d961a0911d0b7e9f40fdd649675993e36926ecd6d748893a3aafe7a89bcefd49494f2033d60524f66322c4711daa43eb0827545ffc9f3816edc3267b6f69ef2c783ce24d68b2ed21483f06db4fc9c9b1ab5b63337e1daedb26849de5c1c6db60f091af86dcfc234977be652e059d6d5eda2ae0fb65ac35b06d5a168c9bcd091039b44f8639ca0c957905a9134510771a1efc955eb93313bd4bad57180466c062d90f8af68703f22ed57e9a3119092e0cfd3948058399912b47e52a3205794a7e5a08287ecf911b3b138fff318871dc5d0149c297cbc8f722ea6a5582a4eeed8d4409f0c5185bd0e5bca2a2ba9a2ec734b295cbbd97a78dc9baa4a0afebadf2b71d79ab746a495854571e4975582937ba97832b1ff11e9a4941fcd562e29ea1236fc02132cd43fdaf6c6bbd09c94a7617387ca964e01568ca07d8ba4290aa41fac1461aa84a31051f83f1c61ff67acb721de90e346d743d7393a119f8fdb71c639c725e7ee8fbb9cb25172b5fe59f7df3cf3022399e23626c6dc0b82b31ae788787aeb45bb08a61dcd947b670a0a2d5c4d5bbad187d0b1fde1d9b5f8435789e8e0a62e6e7a8c4457928e92dfb2f6c1b0ab7f0777c1212bbf12b9cd8aa10fbd69fadf4bacbda92accb996359a798e497f0fe39470b642180cc202aea47ca2167e2f9cdf9af4edde0f9b41e021de5f1909b31fde76d7b21b49884ac5c006cd19b8075556b3a0b8b272c0182f0051e7d5036d8a31d4b5ff8a07cdd8cf77ffcf3b8a1aaf4d7151985ca8c09f8ea06496f1de77b95b24d19908ca1b531836c856e076c1e1306e880b4104053e6bac870af40d6a33a6e1aafcfc02e9303c86e0c2cd00a5b18c15a48ff437167b526f49a24012dd7fa185b2c9f834c006a8d2e9b145ba3e96dce137a4da946cecef732d0b8a711a03d7ab795e71f2383ce9c54390eef5e4e78f5bc1e888ce80f97f42919527cac856b5ad7f48fdadaa497bb87ef02d56314a300fd3a97327eb27ae7827ddac6260eec8162507efd9aeb2db36fc4d856dbc255b57dd862e43140de96e40439cea7c329b701b29ecf8ae1f94bb5c078b8eee1f5dee5ffd1e929402bcbf8b755dc562d88c35c21d69ad30d614d01ebcb43c3f8ed41dcb8cc8b8d3ac84c669d17375bd3726f1aa50ea49cf7ce7ffa4eb741838fa4a70b0a3b1085b61fe1d5be6729df3d5081e4462e370e28a9ab49f025f8552f82d719fd06c13b3d9754ed232ef80af488c2610d1f995127589796d9feb1625eef9baf9915e6d456986c57d352ed037f84fa3a01c7128c7c450c881228b4d1a753b975e750c77b8a8af0bbd6bd50f366aaf1162b0fece7b0d6d1c7a28d49cb8f16fa12eea0ab5660d6a9c03555690132646e9e91df6d8b4a75b0fc9114b878a0a0262fb6ebdc8d60e25f0ff7047f566a193b7a3d20dfa0d2896fcfe8a448ff615a0573481ba0491217d95024b1dc1996301e5137b8884dd17ad7e7ae2743895aaa5e87ab1640b2ffdde12ac544c6733f13e0cb8591b1bbceafb0edeb84ef3d14f9fb12e7c603efae9d3d45e1a4868cec2949913192a1125192c288a7a3954416b0a2bd05113329a7bdb64a80bb648b25da204b43a2a279e28ad461eb6c7cc5e8351c300ce1168773a714e1aa70a798728e2fa1c1abfa180affb01fbec7eee913f23112041df63299c11fb168ab99dd5cad3c39b594f21850591c6b299c31d81e4da80cf6ad1951a1759f63c154807f6a9f10be2645d2a13d01e1ed33d38eb991b04bc5e979c80d142a5b9ebe54a5a925cd73d61da5e2da585dc74ce4544db4f582e0e6e5684a8e79471c0b66915081139d2c29a19e6aec29d695314407b6f3d12b3016f264e9fb5836aa52c1f4c92fbe780560ba17b1ff38d515435cd4119bad1303fe1955eb7c3a5ecd1ad76557dcaec7c42370f900390ec00d2b33a4a5d711a221456121993ba5274d0bb1cd43b069f03219cc2a9fc532004690d15dbbcd86405194d3b13b5d24f9f1ce5612d6d2795d17ebd593d6c92cfe881b3fe99ba593555c9375ed190d3c3c820bce1e556b66743b41941ced6e85219a74842e8d88c1490be951bd7a717758c96922d70ba2b69f65c10fae2bdbc4d04642a816d99e9784243f6f0aa8b15cb68b9159273fa0f3455f16502fd9397175522db488c60e9d6e6f3cd5bae9f673bc932b7bf5388ca4cdefe65f893faf147787dfaf6b9d015b6fb6898db7866845d3a8de91283f8f52a1deda42a2a566363eadfda1a9a79e5af0bfcd9fe7c72e59639152a1aa9cd18428f399036453855e328c329329290e215753b11134f37137d51730b6629779c2caf8ccaab5903515bbeb238bd36e78380e3added855458688f0220d53878b095efb31a3d7fa69ee241947b948fbd05287b3cf83bc1300c73fb1ac90814869d83ffee2cc6a9dbe74d2c4de0b3455ddc780821aa01d2d0b4e08026d456de0a6916626fa94c1b7839dee4dffbf2dd9727b01cb09d499f7c793885f0e8c87e4c3bd681ff3ad8bdc4bb1ed11273583fb30b591eb2761a107b8302743eae64dd943c4ac2658771770996945badf0ed54f9b2fa78f0e07d0d17f9c6b4d9ce34e12a93fa8e6b371f318df1c9eb7a1cba02b0441b912f81787e96030dad89ef4073556a6e4ed7f2ead39af543e73f9cc63222e844d13a01164b41cb5dc715b98e7c5fe62f687262db4576c98cb9c51b1acd95c7fea0d8095c5d6076416a47d629e28e31c446042df96f69972cc7d43fbcb95209d066d041549a3b2f3efee5eb168f2b73b54e55fb4d39bd84a97b34b0b6e0a1d5438beb5005eb191cdeebb8a35e697dd38bea2c75dd8cb8ba8d3cac171028c953de77f1df77384465a89988a30a5ace7acd815242b34ea4615f71051cd07b14ad2993aa95b36a023324711d9622496490037a900bd769c7a0a884076600c0c808ac45dd1bc0679caedbd93e22ac1d893cb53fac784fc36aa0efdc7a9ea7df2e8ff0f65418a6195afd543ab5efb2c082a66c376e302546d489bce1266bcebf8e677c0fd5356e67834917fd48a63b199af7afcaa0dc61d94f8298fbd3767c4a30bbd8f6291a1f3861b9ad88c0ef5010185707600823096321b309924867b9675bb18d15186ec1763a769d45e471f88d43edfb6170ae27ce9345990e4ee58dfe597122d369d95d0857a76f9a7ed53b7865e213359e25c201ed60d0d7ad9801f870241f97e605f9d60075acf154c221b9c45dd7455a2ee3e4772b35552d291c3be9f20dcb5597a0c87c08dbb130e1b339a887d0f76e74915f79cf50f19540e7b00c0272d67f3a57c615878442d8daf8de5b8885b4a09dd45a3a74a911af84683f207dd9202c9428b8111a300c1454f89124877ee5ba52b4bd0340c91f419ea9d16f8ac711234d1a86b9eb6577aef8bc3b4aac44f0823a3a701c5e37811435b24c3f52c6112e0e3518551faeeb6c6d4bc216215e3fc1fe6d5bcdf47ba1f0f2899ad9fd5d88137f82562de190d0185bae10d00b54383e4556675e2b1ee59d7d38a185b215de9b4708298857958e786ceb0bc095af45c3b8fb7a162aa7b7e27dc74b8a99747b8e0ed077b0a9448d55460c9d2de4f6cd16ff667d3e1a9e7e889b3c7e32db04c7b47ee02aeb002535769118ad6123b13800c19f591e228ba1587ea124c3a04d2bd53d42288284c1efa5f61822a27869ed49a6acf4fe6bf78a17cefd24860fd60db8f3fe5bbd5c9f21a81c13e6390ba456b9589738261c6aa090355966c35127d626491aa9e3b1483548ad11e06e05edda187c680cdd5e6a4b8a59bcd2c28dc8efe7e6a0fc3eaa42914d4e1bf8888ec9e12dbd25576d5981f3cce22e50caec42bec374973b1470179f7fa93716d1cdc2d3c1c0d8031c3436001f79b8c824961bad8298084eae2a4ec5a66670228feb5f199c3088f7331811da4bc6602219b2de23ebfcfa1c5401706d892dcb040b10281986b33e1bf92c9bea18703046ef691088c748758f4d1d04fef1a452a58d62a63c47f10157b8995b964e20301ceee23b43de24828ee3a592e0a6760ceb5c0c60eaa694d993b686da47b47d678d6046e6bef83627025cc1a37a704901bfc234df8c6d41ceb73d1c9e661330dd7f8bbc9a60dd296ed1019bbe3617c63a0a0503a98862a2e9ab9382315933e09adbb96dde9154a35fe41a586b7b6294beb26ea048484e5f315700e11b8adc36a78a30803ab9274c0123ef2332b21a5b95a145334432f820afa4ce61e25fd6d90b73381e36401cce5c76c7229c4107c5c8bdd2e623b02a8c697843291042e873ce7d1b6f5b8ffcce78c6ec7d3091f1785ef05cdf6f29aa4b69bda9622c9adca9f9921f9a300c8ef75ef9a45d760aa01c5f202d46af054106b7594633bfcf782592998ec83e209cee15f938eaf714dc5ad4378b446cabb765593663c55049858fa479ae200b33ec5ea5acf04b3a186cdac41cbf012d85d40f593a4740676fca8e341cc8cb21ae48ed17fc13a9c87c194337b711a47afa60adbe4f3ccb8dab11cb4c6923f008f7764372d0eb2b27aaab3d35f0c855db7222e6915c888e486420eef34809b846783e09be0fbefae108ea72c7af2e3ed955e363d94874b22303c09e32a1c04b65986ae703a3d53d7e009d87f4dc8984fb0c6bcb9efd485fa3eeb983105c91d0edbec0844a73781d84f98e27c55f2252cafd82c7e9624cbc528ed3469562c46f64540a899a67eec27d5b83f8402041cecd91f0ffc15fc8f2b74bd68fc999a15254c10e9dfc678153f08d45a26f082e208c307c1a2edc03285a8e8905b5ea709e446d9569775b77f866f99cce5afd30718f43f0c138c14687c4bdb551603d787ebdc06695132b19db66064f2408e890e95f30129be8f6d9377c42221bd27b021846224bc8d8c0af21781c284b81b297af8361ab514564045f0a83980a148a569467fb0aaacf0081f524a3edeccd418aec833c828a57f10f28f7eadfc62d54bc1ba8b36ce4ffd4d67df30367aef57fb4c7e82b61ef278641b9caddbef825c07cd592b2391e7124f8e16ca55e3a00535c6938950e27bc0ce33b0bc6ff4805b5dde9ac6039ff2bd92d4a18ef9a37f6a4c9f9fee252db1f693dd5430c685dd41d287f7e26333037d9bee07d4ae24edf5c44a0bf79f5b3568797b0f917c2e09adfa6c1916af1599d0ef3ca251fff27c462158605c4bf566b4c39f3b54fd4785fe39cd56c953921635f133198d4ba69ac9e84d2572a786d65a26ac7ff1c68ce2c1155e39810d43093b3683c5cd3d9bca0f8d9ad3e13e79f4d70745460e64489085118149b428a2f34f43814fb8224caa7585b3e41e7d5952a9e9dc15f153152fc8b2c8fff9222c64f09cce0fd4b6538c9a653aee80f0af704132e378511f7d10fa7da7d4b6a669cebda6cc9e89562b10eca0924bbf14e6ce4b96edd58425ead498d6a0608311c5a104f5ff746c7e4db7facc5c943f6699cd177a7dc62112e8fb2252451bd4e0da7c650ef919e4bb35e2335cfc407862230d3351f5b2be42e1e53584f87f22b012c16c562bf798897e3034b6e3e8f0a42d0f2db208339242703330c35cf302fc091079601ab5ee6581225d7ec5f64e892233752f07b163ae2e55a2a1c52fdc2117da2ab147ad5cdbd9293c28f4e0d8ad7d2a980d76c4a8c246dd19b4d38e44cbd98eeece35766a5900c55f2a0341256dc84504e1f7e5b84b8439f4510a86a358d8bf342b5689ad6972771516638fcb668e235a40ed8d389650ecc12adca19e646feb993d4d5f8c89b8cf1c62b83521142945f6beea33a02f27661e96bc778c5b39849c986c709e463e2dc38353c9ccf3341d68905061659282565b193c70f3b9b02aaca14665390b9d23b91ce8c63570391a3e89c2af1f5cfc0e0546df167b1c5e4e480c6d96035630415b83c9b2d137a2ecd6efa37523eaff2dbb9416e078dfae400d1e349b83c2a1f7295c790856a5fbd5c056954c29c8f605cc85766773802ad05a7b5dde10bd6cc5b10b994f0c47ce959942fa9c87738b56e69f600401ba5e5fbe982be650c2fb2d61158cef8899757cb03955fec37739716846864e99dab35ea7f9313cca6fc7aee80ee67242279b2ba3ae39eb64406af5e01f3bbfa25db44db5030059c4007cba845c186fc +0x0310e51ec82c5fbb0d8a3a3e520a7a0f77504e0d4744f36b4d87e9cd9222056f45b591ff4f0b752cf642cf5859ce2682 +42208 +0x65c656bcb7edc6f994dab6479a4258193a5d4e9cbfe2ca4b8b32f4bea4d38cc27021d0afbd40a0f60455e0faeff61e2118df742a14e6b0c1b031b3507aa6171984a3158264efa5af7ff1e6568820c1cf43bbc96b8fba6607a30433e198e2a4aa28b4ecdcb5e31e4d8c1692056ca98a4c425b150837463446ec153c1704717b9de4bc1e65b60252f7b42caaaca377c1c09d2520a8147362a614ca969ac839e41b402374c671358bd67e9bf7f63674ae53dd83b2f42f27374ea28d0813ec24274cc551b3a7ee650f1272cc41882c86982b89dc92948f4bfc671ec55b2a76198b57faafa6af347828d21825500d8d97c9732997892f3cc8fa1811d9578670ff596467a314874b581b3ef90feb2b618e8751461e5f6d3f84768a0233c4d0e1c0da9d9596c4d73beb33809cf3dc8ab1531bed67d8dcf89f69bbe4793a6aafd24353280bf17f460c1bb7bd8937e9d384cecd70142dc775645e104ffe5611cc4a700f2d511a0d7cc7ceee204945dbaee3e7e402d585ea8f974abcf31aef80ce512f55d5f07b362274ee21ce638379c2d586aaca33480bec3f1708f7546d805eef686c476f7ac2e0196299f25f5b8db8629365f1b5def33464ac3c843539d9242d039dac5681785dc0129bb2c634dd3792f65e9ee4b06a100ef1a0c144b953c712e8302c2ef7214270e672361f7533e86e97ddfa4624382846ce7bd70956b5f0a7006dee7e44853632c665a7f2885573fd5e292d65a32423132b17ed0c78c946f3319b1bcecf6ce20d9abb2dc8d40b7f48348c5ec996f7a97ef0ba2cd6885572fe6404daa7029eed094abdef27c11fb455ff4cb6f86379648e05adbceeec221bd082ee548f44e2002ebeb3169ab757bc2ea9b25c7c7472f94b5238c4dc0ef8ea7271a2b110fe02c385dfe5c9a61e7d3cdb180678dd2faa13bdc0a26c29559f87eb1b6818b296c4dd15939a31d55e57df62369034a1fee958ed3535de5c28de99436687b1fc75f1f7e6c31b76aedfae4acde997b65248f670e29a373ffdf17ec8823c49a5760351b80158b1bfb90a4928241b652677749a04a4d8f1ba941748beb184f41ca8a8abc96d38a2347f45f21f6db340ad99ec9dbc3cd5ab74aa020120d826d13d1bcdc8d1324d36ff87f96fd7b29971733f17c73fb17bad98c6197499fd09283156d87179597db745598f89fafab5409ff15ddf360bb13e4c71c668cf2a174120e1336c69e9b26b317e6d082d4eeff4593826af48535ea7b83271a46a6637633145448148ead39ce87dfdb41ab52fd7cb9adafd1e906c31069180f113ba51d88c09757abf65c89095dea65569375d2f1aa1e1925fcac2215b165c17722c4ee65ab52d1e7560798f5e2acfb2c2dc614571d5a436b40948c2e24a6dde2ec714d6c3d2d33413e6cee36be8e294cbad2361f6bd89b0c556e65bc0b41b0eef908cf0eee7d18540fcafd3e5a046c32fb18bcbd1e1f9ca39b8843320ddcf6e5f919e7b047c8ed9a5ac04a6f4db630794f082ca2bc95d4ab9380a93284befc724d133c12c1972f7e9fdb5a5bf1fa128a373eea72cfe1bf9ecdd60c30088e5e1e65831088f47e5a9b5f8aa186ff768ed0341b9abfb079d9f7baf6f0bd11c17844e2f8299548d4fb5b1a3cb472be8201f5c62c91bc16c49040db61db3c38def78035d0cbca47418e4840801791c7c318658df0842a5b689ef4bfb5302fd65d384aeeab9b8a783a8fed72f32f76a3a03ea9dbf5c67d06cc42adc85fa41a82b2d72f7df6fd7844268cb511e470a3caafe13d30aafd16916617b6a5cf8b9eb6864088543185f6439be139bdf29f8ba558bc9a3c9e8c9993ccaab9a8937afefa3e00f011e9b996ef1139d5c7abe090ec210d3b503ef978867668216139d6edb64094e1278e0cdcbf1d0323df5f0875d79f7fab0c0ac835d1e9dc78602143dd834478f615acf43a2c15b9ae65aa6b8d203a6063c0807d541ead744915f83630e99029896cb50421cea1e9dfeb1c8e692e787bf02e4e8d45b527cbfe031d129a41da23258d44b1361f37f022e003d57c8ad00ecaa5b37c9d4def4011b80e8d7c3488f254f7ca8ff9864e8931d51ef539ade7b57dc76dcfcd316a8d2e954afb592a1313924cb4f4ceac6c01673abc52430015fc63f3cbfb58183fef9f2b60e0a3ab0f1367fc928427e9f6f54da17a711b39e14027bb5c83c05ac5f40dfaded20e2fd35e3077f1c2b7d7a5d15f89b7d614b3e02d339e9e0d88819346d5842343db311660965f4114d0edcf22175422f5d1f68910021e1edd33253e349047ccbaad573ed704130f0f25a4f963ffa11a64d58a42953daa4d8732ae1d69c8c639baf6fab30e0413ca260885ab1392f12c8791d7a32920d3a8a01994b732e97ff8a93a9429921101f0edfc186abd5bb4c7e289773148661aceac4a61a24c6ce5981a0acbf8ffa54e11bb92d59ecdc47c7b1a3ee1637f77f01df067ad5502ed978691ca0aa7935b68bb334f35ddc157a8c473349eb03ad0e41530d3c045e2c5f642850ad8cc198dd24bd9a3c1ae34afda22a1ed07be16fb7742d231530b8890826a884f9ebceec72b420312f176a41771140acad4d370622a3558e2de0c50c7ec5cf00af5208f81c44c642f5dcd7c391e2732705ea6e3bf6d6b296ab9ced7f6649870bf546d78684da9614b5f19498f31ca9d503d8efd4db132e85b8ec98a86bbbb7eef351a35c518178f198df078844c7cc00cca121997b64b0a17b592e51332247f2d3fad4432c3e541fc62d9a5b2cecc3ee8bcc6b547bd021341d6a174066861e5cbac9d203bd1b12e76663b4d8559176e766e237cb865f6784c5a8bc3eadef2677d2470664ab1f9b91a009bcc964c1cd35856aecc7421a6bda9c998312b066468a43fbd62e9f52d5659ea81cf40481b01f11ecf1105708157dcac7d58616f266dc356eab2840bda9ab85c73b21dbdb07ec32f1b06e6e324eb776ba1b60879c6eb6cf26ee1c3767ffaa80ef811a91d6bae50f0090a92f9efccec8f8bb69ad6b476039ad05d02b59c0abb4a756a6cf7ab152d1a1f9884156080be90b1f692d67d7229c8b5a0cc599d2f64c77228c3dd0d57b9f5c53d54d625bb6017bad28b29807442046539aad311fd36ee74d9582df0ca7a2ba0756fac8dc1737cecf6de207c00dec685a418a288e8a43803f8946b03f1f02427bd4f1927275b48eec0165bbe8c72979d6c804870662f2c961303349572ce67d1816d9c8071aa0426bade4bc68b8feff2ff8c45571a4a34b1951efb43a1476f146e65b70824c2273b637071329289484cc99729ab699808cd0b622f9d21fdc286e0a1f94ca5462a8346775c71261128f1773b65fbd86ae16ef25751e05973daaf64bcc3bc97a89694d07d7e00aaaa1a9774d36ab6eb65871dc678f2dbdc2c4fd48710a6e6605bf3f69ddd467fb4a695854f09d86b170a42301441a2de1ea96abca448334893f2bb0f0b31563cc8a9127172591f86efbbab6c583bb275955de3ce68cdc951a6ef6464a4f41dc65b2429b26b2ba0a8da0c3b28fee1c220d4bc2360310c09902db4789e07901daae0aa33eea5fc2c3f6a7e79dc94be526e5166a238899d54927ce470018fbfd668fd9dd97cbf64e2c91584d01da63be3cc9fdff8adfefc3ac728e1e335b9cdc87f069172e323d094b47fa1e652afe4d6aa147a9f46fda33cacb65f3aa12234746b9007a8c85fe982afed7815221e43dba553d8fe8a022cdac1b99eeeea359e5a9d2e72e382dffa6d19f359f4f27dc3434cd27daeeda8e38594873398678065fbb23665aba9309d946135da0e4a4afdadff14db18e85e71dd93c3bf9faf7f25c8194c4269b1ee3d9934097ab990025d9c3aaf63d5109f52335dd3959d38ae485050e4bbb6235574fc0102be8f7a306d6e8de6ba6becf80f37415b57f9898a5824e77414197422be3d36a608085f51a7c5776f5135e3d50349ecbf693d189fefa64b9efdfc3ac283cd6357f9bcb5f2970175bdaacb7bc2c8fbce745be06c4b49550ba9dbe6ddb1603d05bd0605247fa5d3073629b53b5deacd550ea27c0b392fc196493061d37bddfcac39bf8a11656e9aba8d705ba8e2c32f1f02df886bd5fd7c79d18de5b28e479cb55288b413505bc8fe17f1572b1dfca18ae5556e14ae2cd634f756eb0165578dbf9be40b80acf7fe406a4f00584bf1b5372ac6b58c2e487f361f3dfa369d6850297a73f90ff7cdab2fe8cc1fb7193cea924785f738e2dad82bbd859bd893048491729b1507bd37402b37faedade258a23ad025aba1485e615456c0384de2b68b7618dbe81e69df6db0cc7df2c353bf8c8f39283b6bdb4dab6e7f90682d18e8e555e1b8daaa7a20746f1ab7d78dd9ebfa0df7002eef181326c89c58a3fc823612af41a475328aa504a4a72b0473e1688b359e300ea19b696401319b6422cb08a3e0cd41305d07d79efff659f20c06afb0a4a34a5339b19ad386d3db21366feb0998f8f1a4607e2293df9cc738bcb64bfac98ac1850e173205f7f79a73adcd57c44639483a135a3083d1eef5310c7ca7da12d9182c9518b96ba3215bd3ff8fc9646722b779bc286bff6571568381c65dcf2ef2b0a27552bb8536c581bab213da5a7a29b1ebe1754f6708d87da8a32fd85a6c8c4d9f154192e31168cea06be5e516fdd2e9f919ad454b4a68ed08f725a1fc59fa216afb61e9f5c19f751d6392844a70a2a239cb4d082c98c7072cd424353585b0eeaeae202b4dd5be179a5f963235711d8d168cd0e28b72575e9ce0b81c965e6507d28428d14bbc69489fa66d79985da80d27c4e58ed875be75d1a36dd28f727b0f6f43d8767fe4157aa5ee84b4c3b4c6a4d609d747940140cf537291c191306767dd33bb757afb3710458e789e48051dd6b9d242a75ea3a2edaaf4e0943c36be93c4fa4e68ad4062bbe70cb570a5dd02354ba4a44898eb493340a0c6b4f0e3e5258efe1dca87821cd012efc7e66d8b2822f3f76885c336a832aceca09e4fd67f9fc3b58615aa0ec9ff41be3c69ffcdd4324b512c097e14448e485f2acab96cf264ebc723d48564fe8c0bee6f65dce3aad5da385b2e1a02a298bb6eb1c4be35c2176f9973719a132f28c9f6ed84a58b10aff913727e379046d47ea1d216decf7319d7b3019758a7d038147e4320ca12ba0350790e64573ba5d3fa8f083b9b889a0ebc8a3a906171864c73daecd4bb18eb9258ef8b9ae9734419c78cc09d64ff8b4876a5ab07152eb5d85093671b091c49bf7add766c6ec5b6185e2197d6db92eb69ae9bbf56143df35e334e2e5e248b38ed4ed95b6367a1504236f3fa525fe11ed4bcb30427cf1da360a451cf38ade45dce4d59a71a6494b739ea6a649a7278ba3c39a205d6a64c5a622c44b61505c60cb4eed4e5fbd62e6f71d10b6339b3c831e29ddf30fd4a489ce523ad6f8dbc9eea53bbd1a4724ccccd6c833d82aa743e0a8a61d102062ba0cf6c32e2780d42dd6b0d2ce64f3838fe758c89972f576468c8762e1e158bbad38669d28a5c1e29000353ca7952981b41dc745caee5dae4c6e0384b1cd7f8885f46507b0b883aefb547ba0d016b2c6415869664db22af85e6e6635153c5c704a273c294fc88de075bacc27d24e56fb417f8854a92824fb8374f69c9696b81c05bb342c8c3da81f071a6ef834a4dcc8b97a6a3769b61260c368fde2bb445b33be979338f0809c13b85caa3d7e820ed4b331573612c6bece2632c12e0dac0d5e7ba3a17402f731659068c81b394fb2c8368c99792ebfeeeeb5bb8ba91337964546c7a8094a0b2ebd972610bcec72914b4b73772944096b6877e9a27a554dbd8f26ebee1f50245dc2d67fca481f557306f9ce386edd0cfde375a550cb5b574be524f7bcdc9dab841d54593de65a5f20a04885256f802f6b07b5d8dbc1aebb09ee46d35a6bb8066c76199eb2bf26f85fc240808655b5dd7f7d41688c86d5e3bc53966810f2299fdd732e3471fb0a88f914eaa7a347057bffed213fab4258352fbb1c9c269a79dd9fbf9a05c2c18f77b73d4de3c36ef672b4fe5b43801cc01b29cfdf58e38a2f27790065f7ed393b2e5fe6711a2ff2122a6659f95e523d93fc7137e78591ebd3e734df98f4398d9913b9b65f3530fae10bdda602776bcd5c40d09a3c0976e4ed8498033ae3f0e22e8f8f561e1d0caeea7ee08c7f7511f3a04e0ea0e7ceda9e06666d1553ab5863840ba76db6b80b37b5e939b377428dd7e990f3f2efba0740a5f57bbcec36b93522edcaa430f077bdcab5aec4f2c527a2be6d46385cb744f353998aa10b6b5d83909ec0a393ac9667b24b0867f9e6267ca84dd11936acd8df97ba616bbb328b7357875111e7d4b25ef4110e43928dd48c2e985a3e86800c2bf9c0c9c301738a2dfe0f4597354f11ca18718a01c8a277fbd8b7aa4f541d280001138a51e716a3da0d9d63dc8407fbd2a6d24248a00d58f02e1089f3a66a7485381b6cbc74041ea20c9b7489dce3ba9e279c00c124b6bf94b90cbfd2864f37e3254037adb02343ac8470404545cb955723368a145b86f30f00131395fbb4bb4151ebb2cba45c5921fd848fb9c8a7d325200aa8e84d633e888b8e4ee40d8146c84282a6bf5798aa28fd3f298c6c5fbd2fa87f24e50336e627e3e33866c59e219f826fdb30d1bd7cea0e09d6673adc9b9e42fdc5b484e834168f7c99c42af494f0991819c71bb4188fb74a5df23804b59977ec52fdd85f707a17bf39a64569e6e00de7282c3c66c63e816a87d470c05249cdb594670885e27e0416e0b21ce661996842cf063cbace1ff2d11cb6eaf9bbd6cebe539b1b41d247dde85593ba544b433193d7fd2497775b94e7e43fad95396702705641197a87002a9d61ef2499ed05f14109bafbe70a1aef15a618c17e1224f03367000b1a4acf749dcc6f649f8f082fb42be5c991cf8389c12ce82e9a8e3620704c80f80863dc414f5eba804c797473540526977d0ebfec553c58fcd3f7c51a8dce6ae82c1a501c1dde79838af270468961236c930ff5a0379f10340f93f867f4b566e36eb6538a6e1653724043242ebb058750bb194e2bd11db7de38acf88e0bc91bf2b6810c15abccf15756b5b9b552baf84bdd76f217897df5003588ed173cd2321cecc1a4443ac9fa39b38e5763b6481e66e16c08ecc98974a4ee6ffe8bee97526af8bf439f84d51721411625bf4f77a3a8af44b930f807d9d14bab537088e124e2c2c30faff1b7f016e7974c51860f2c1a2f462c6d7dc0cf90348315517478508f331533fbea392c208d57f4a1c1d764c24ab98a2ac27cfce8913e6cb319247d7631fcd50cd52173471b9f43386998f0aae6e7faf02e0208e14a257f20dfad53a1a5c21e681b386f947ab7649de71a7bdaec16a546291c9c834780771f2eda7c1778ad35992546c60e90e77d58a125ab58458fb2b41b9060d771977b396e749de0900642275a1320be4677b7f2018128 +0xf2df4b7af9ca9da652b5027a6a68ed91022eda553d72f61e2abd9ab46038be92141d3b3dac6c0e2f87db9350019d9f1a +43000 +0x24d97c3e28460d46216da39e043e024ed08e387b1e5fcfd3f962472cf1bac4676b03039b3b93927075ff41c87fe1d4a56bd9fa4784d283942787cdbdd5457f1f85f27a673f4e0dfae679689456b6542eaf6e2126ef78df9ac797d114a7441e6d1caecaeb5b00e5ad1ee20249ae42ebb34154936187d74cac809b3a7a9040081ad540d96fb8308251c242f630b20f01facc933a3f73793394fa99f235b8c0a5ee5aaf913b7d664cae7da22c9187a4ffcdf634fc0adce6fa18de9ce08d464c5db05303d996d32aab8bf4098cb458894bf2673ec308e9a40b01d4a9eccc626c982a674598cae20507b1d27ffee04b474f31c8b97683c33dcc1683cafe3836a9be223f7cb81dd17ec8e9bd0c6a5e88657254c1aefdc19139a7219406fe1be78a376183b020d8c91e56f95db9b877386b1b21f924400b7c1e03e8ae66d4bba0986bafdae9b842f16b19a95c8dd07083e1b462192326a8ac7647357af069618759c3d3ec3068a572ef7ac35f919a949050a4ddc8b399e248c8ddcea0aea354c457a597628c18477332df0d11cbff2a8840535bafdd81ff799d2c7bc7a86bde801a7ac1e406b0721dbbb1511745e579923729a376a8c448667c9c0697e5aa45e328ab1a19a5186c981259551c0736cad7bf8e7fc41d4b0538ed9535ba6d46d2140b9e6aaa71397d0bbf3de2c617d8657f5feab54142fe7e16787fd2d54829cd3c4bbd793e72f9ef9e4ac7bfbd7fb592b1a0a50e9621c5fa29a6c2a3937f397e826e6f0e7eb141087b3c5eb6aa47b399950827526bc289c398fec6719918602c0ffe1bf31235fa12c71d698d3575bcc15421d849672b301f8c09f403921e84210a832beea1060a53ad73520d0513b754167321ba3366a4572d4db22324968fa39c8306c8d32d5b1453c880fec3288b980284686f777bcbb2a2546997f78a68fbed88144952b1d39ce1a35b2816bd22d641df162eda708f7a14a68228b401f7712419bd38c39a5c35808d4b52a7d96355fa0994c0044fd7f5aac9639e0304244c6abf695ed1f1dd25580db8461e84365f568b49ed9e208a6d8d4776c18b9ad7d6e600808422bd3db590ab0aca22c6833a7dee9c7c50e99228e4a82259f5cbf855c1676a705e06662d50efa9a75ba8322f96baf737c1b4d66fd872ce2de89f6f1222798feb2ed43fd5c262fea572312c86ca75c1e49a883e89912fe4060d1f245532c058bc3a30b0f40b8b6f8b0f6a578740a9614c826eb2c03666cbac0c52006618c32bad2921a1d456f26523d9599c7a21dd4137226c1a5af0a0ebe78c41e98cfd0a7184a3b0fabbc92049337908e4a6949ac86d228d5ea0e664ac7f35f2c810091e930a52e4a3f28c9c8184967f1554c2675eb529d667da413a763bb16f863a6386f707dbc585c1c8ee77ded9c518ccd2cc6bd8df511b5028aab1e4a5c0095234ca0743e95b866fa59f9108eae1d656ed51579fed056349c43dc542bceb3ba0a3732a8522af8f464a3639cc70de363a3b7f8bcffbfa280f3c7a1a1d9cfa036cd908c7962ec8898ce03bd6f014c11fbfe3dd6d33b03950e8b9ea183dedf448fdfe11483fb6ae5a8a8e37cf3d7d947b2e0ef46692b5c9c41d6313286a58e2f49c39161446626aec887db18e7b535f31cfe34adfb3b1b26df5617fb06b84cbee91b2a09373d90325ced4317a72402829ea8b693e5f4dfd32badcb61a091bb71e2492362d90c481efa3bc3ffbe9eaf94bc72dd9ec5e31b1fab2fb3ecc0cc2af6c9d01614a63caed31515d6479aaf9d97faef220527804d6af27e7a1303c23b9c04326a852b6944ed31ede275c7b16d1ade602c8d7756f75385fc767ac60e6e0025f2a93ad4fc9acbc5368110d25e9e7bdb88459e21c19947da3c416aa42b3291a3934aac3f6120fd63722a9f2701925976ca059dd36ab3e663a063891a8309ef0196d76fd7517800814357774234f93234a80522f8bcc78db6eb454c95b08466d47fd7ec1937f063a30c803fb0832384a9949cb40e3254cc485f7f3ba23e129770a0b4a7817f3aa54d504d6f0e56b1cf2a3264d78065dc109c8f69cccc76450f7acbf638bca1a733f491177b983a14704ae3d5f3fbc1ddf927fdad7671138c2d673425060749d69e1d4166ec0aa7dc26903b689fdcc0daf47f2ca2cf3c70587faa8bc9961dd239423c03b446c21a69407eaba531affd4381168ef24d8b275a84d9254c7f5cc55fded53aa8024b2c5c5c8aa7146fe1d1b83d62b70467e9a2e2cb67b3361830adbab28d788aa5223825e938d02e911ee89968081761b4d47d81b1ca981ef75605ca6ba92004a5d3d84654fd995c4bc39c77bf5b3292aae801c7e696565fa329380f78dcd37e9adc874e5e6d7546065c87c3a1f08b0fb070ea25c84f70709226ef0a588cf580eaa8cf9e33fcf6544766151d9e4ca3416c1ba11bd55a790a4adb854b892e28942bc51bc694209f0f855cdee622e3fdc04454a11a9c4bd28533b385339954cf20c4bde657ed7cc1e056cd4fadce4b1d14cfa864c29b980f69f34b7962f7856bdf4bffc9b2be66216f2213d1e50ee663a76473867441c39230f00fdc5a223480f828073067757110147ded201c534a7400a96260d03d531d62c07d2879a7d6a133ff60b4f6a1222078d0a594c439dbb0b914e19e46cccad387cb2fe84207003eeb2898b1e0c00dd4f4b0c9ba6d313ecc293d6d9948aeaf871896748653be45dcb64a2bd1a66078902094e60b87b7e808e96982ec6621559a8db8f7ad2f4bfbed0dba767ec7f106f4750376f2945c4c09624fbe022fe361706f8935a7252ea6f25a102523c5f04d847a62f92a239cef403c467b64f65367bb26ad9b1ee5d4db8f33e1946b10fc90a2a969e8fcb5e8464fcff447af69ffbcdd4b9cb46ed1dd0e06238560bf396494e17a5ec2f4bbcce57aa5bfbf2beb56f55966bd0e3189b5c3199192068abfc6aeb365d823acb5b95173462f2e750ae795a1e0a4f4e17ded7f1c168de26814a162bb045c678f244bfeac39c922053920026941eb25091ee2b6901aefa0d1c873454ade521b1697e36197f9043677069eeff212d60b12fd43ee18272dbe525bbacaf54c6fcacd711e0eb8fc66e824f3c2a2eedc1c1399897faa16b3ce97643ee6684ce6fbd32e506a7aa1cc6793a97129cfa1f613db0743f45f0e5958c881f29491b4368ce0b3b64729c4d19ce57f0f42caddf963cdd6dd5091818032ce260733fbbda3a95ff8033280b4b46d3a104e9c28e57e62689295f2d5f2b10314dafd530adbb6c7cd65c7bb33d3dd5f2e078f946e4acdc637c50e8990e47440391b456023a0f86e9577945fa7b4c4e92dbf72ca0f809fd5b7e8b75356c93260a7616fe9ea8fe11464b7c98e50ca03a1a5b278bb81294d377578210e9c3383eafc47ed5ec3faf94fa7a107d5c3a6021f428b01d767975e51dcedcc09d595d14584293e4d4494b976dacdbfb474bb589870a3bebc377d5bbb6ad418e39782b316fb9fe323f0cf9a207a9851a8e88c6fc3bc970fb8552dcdeabba5b80a566ca1c5af166c713d1e23e3038b7e21a39bc01782cf657a653b1d562becfa1c96b615d83b274ac3ae02df25023195cd1a6be21a6fc76070cc27d28458048f68dd1187d50c4d0e89a810347cf30528f9c16f5e22d019711a1e76760bbca6c89dade18032bee21831dfc8cc415280b8464d388cf7603027f4b0998042b62e36196dc89777bf90f86aa98eff18ad2eb410f23a06de7ca5e59f472379cff115686ab119362a7ae44f8289f555697f89bd0864f6546e91d54a583686db09e9f6d01ffc65c4a19d265e18157e57ca260c239b29efee1e5c68c6de03462c970d4cfd97c420fba38301d4a9c09c8ea15d309827a5a94c6418badb8f31e3d6edd78251609cfd2376c8f113a61fc2528561918b5c5c94e7e6735608fa46d27284d5216c18db3cd4b1db6ecb9b87a25bfcffa96d97d355590bd8c4cf9db6b477e282b4be0f2372a7db36e54cf89c9f036e63e2bf789e4d084ad571afe805ec6f8d6cb6b7e1fa30e55967ff185bc32ad1505ac8016d11fe8e39d6071a67b8fcb1ebffa1fa0fc3fa35c2fb16de239fd85e5930e3d3e3d2dc533f76dfafab4467f794c800f5071521119e4cc6deee8729f2cf82a0a77b5588eff22475c0113cb0990e324e295662680151e979cb2b2d924759bc88dca21e66ccc86b640c3816592ebeeaf4178c30117d646db9f357d793b45e6b2713e692086248b814e49e45d4213d3ead3ff702cfee6c2602180339b0d2640af5cdc754e058e99722d9a26fb408ffc9a413455ef5ecdfceec899ba87c19f1186f7ab2db81093184f86be2d87b5e7cf8a321f5b915f115a4d3c8afc858039c200e9b37aa5d0b970e100bee349c8a4b6814fc7685c283c4644265bdfdd727ab9e5dafc425f6c8b09f044a12e89a24d184640346596e2d6279d2e124dd6beec5ffd748f6f2c0d8e4c44f96ff88e6a6a5ca2ac6e3b88b465651efbb92db98d171c0f5c73e755db4c9fa4c83128a14984ec5d3b7ed07ac7736890365766ce068259e53db09421fd4c6bd959eea60a67222f3f966b0eb4428797ba86f5e25d52b57c45bd4f5cda9c1619ac53ae5a11ebcc8d10653ddc7d4e2a5c66949a88ae9838eff8845729c6df330fe25f792cfefe0a6e974ffc211f13e21e5a084e4009019418c63bd0e22fef2ab74624580418c7653a9dfdb1c7e0b83a465f8919f2b5b55061768ac26f5bf383789f4b52caa86f6459ea1764b50966b73a3dbf0486fbdbf431d21836b89314c7b9b47b7066f61d903446441bd3e144e363bc5316e5239b08efa08e33a41e7a7de44e5db9c04afa6f31792ce009b27b4529a4ed58f5751e1505a993c21d464c2d60359835c0ec2e8bb94a78ba3fc23265f5bc34d09f388ca3dab5d0ea0b51b35f9531d5ec4f23e06c3582d0b25d5b92cc2dcdd188ccb60d38d68cedb35488d69ceb0abce7533938980be9dbce4bc3c3013b9f6b886235c75e61f59125e133de6bca87f42db5745f99a5474218f142ec8c85faabd64bfee59ce3b964499a9af2559a7226c65e1d7df76964ac98382235f675a6397c6d598d7ac4a0102667043be1c391f9bb357bb938c108c25506a9c7c6716abc82b28de8816c723ac431bbe097adad161321d83ce614fa2c574521ca84e310ddee00e41d3844f78c2cde050affc08d24d60c7a2e88c90391a6dbd065b9325e43ca41a45428b2f7ae65582be1a265fbcc0cddaab6a74aeb9a4bb2ffc1ecc61d961e5c16b7d71f39487785748c0702bdb6be7cb0fccafe7aee4db0f506a5071480f039826bcff486016b4f2a34b6019c89f4d0d429794d7736b4bffc5b6c5d0da74ac0309b9897a681489d930038c860eeb4c35e653d9fac1988c65ae8ca30ceb333d9676db87261711656f91914c1d18c083c95d79c5cdf40d2ac58d646e8214db46c7109b9eb7f79de64a2a6d252b60cf724c3a820ecd9529a5b3e4d69edcc1dd3619498236cc740a7aed7d0fbe5d91589612eff51b862f8e6ba5474b9a797ca9aa019427c5c026f791cdfbf16e10050c7dc1e05b62642dac0b1e174c07f4cfd1111482e4e23f8ad5c96049aabaef464b87ddde2d79f409f2f282f7506dbb15d3f9d6885202971a359048c8a42b47dfa652db2bd3c8c25ef3c07849e122490932c2ac36e7bd535f9774ec0b6645a62bad4d2e4be6e53b974ed3629176cc3af46e0a19f12e6910b56bf5de847980a6d4b0f55bc0ff45ec4d34c9e66099c1ed61f64eb4599e9c5bd6237174c64672c64561e9f82d556130eb76125829c2a9fcfc5bfeefd2a0cd711c6e96533365826108207977e3b1ddc5ec633b4c7f79fad61e2f9940eedd830d02add30e7e4f3613978d424f766d0207ea8ca347b4383af531b1bc4c20bd438c2351a5eae97c045a7e08d303781f74634062e8be7a75c0f6e1a2b665fac8957ae90a8d8d177483b216138a284b21ab8498868a3534cb4347a8734612ef77df65de38f8797ab12a971a3df622721c2dd85d57e62075912863f093b9f77153a7b98d5d7524a5ca6f85d4f895768f8761daf967bb24af7ff6d84494a07822e4850250e892030b18d91ae0d3f6b8e5cbfe09172647a664e025113ef688196692ddbcc37addb93d34eda2b840885e377248ef11243a2a185a39ab2a29ef5fcee738657f8496ab9e9713d9e5dec8dad712d8f981d1f1144c56ab02a0af34bfde6a1b88cf867b5eb1c7f21cd3ff36c3572624c4e3c01b19635e0fc42d06f6bdf7940d835e00ea47094ffee82d32608c3a14c2bda17f069e1fe8ce4c49c1a3eeaced7501857471f9278790b83c18c4a9e2672950655f4216b47f6d17615fdaa680eee87fe06190e97f075e298b02d1a102a5cf3989f15c17e39a72c22e41f989f600ee5ae948c59c8267cda8b4812615fd593ab599c5c3260fc265b8eb188f1d8edbdd2f2aaa8e86d3f155b23324205d44e9e2711f5d05a59b7fbc88323419b5bdc86b690f076a3ce66c9cd2716c5f0b7be05cd88517a22b392afd9c8e251807056eef9510dfd7332c11f99609ba408504c510785596072b4b6c9f82797c0875f837f03fdaa453ee3789f25966ae637e621093cd2b58c33a64bd18c66ea97976f8ac03d5c6e57ee27b4d1da902b9364c364b5d3350c064bcf7850fd4e82dd9aea94390d35023a69479d3e201885b4772d3ede367706d4a47866cdb2a7089a7716c873dc520df6998a5a6d60f42050576dd70bcc604c0025e83dd0153923d6163c4ff513793894643a14e600eda56feecb56c4fdb78692b56924e18dcb7c9a5fa3504718732b1bb49df2326acbbc19238ee39131465c903e4143898227baed3a95f4f255088d9370fd1dd804560c57de00a8fbd0d37404a7b9c34f5c1386d88f58637d30ff070580a0bc6038563e300767ca89422779f5d819ccbc845888624635c47013224078cccff8536d92f9ad870c74c4f00a116cb8a9855760be679347743f546537e1f43bd1f9380ad3e6d54437cc324043e47031b117a8590ccc737a5dfeb08e079181b7f0e69779e1adb02730fa5d9b9c9b092a78aa37d80c5e0bc738260cf65af9282872e7f92184f546183e27cd6adbde3f8c47648d4384c662174ce2f005f8c0f074a026e46a8466a000aa7b0813c9541b3d667031033dab8050e258e523a88fe284c2c8e3bca8a9c5c5bd1d98002ea6a4261df4ab81ffb66e5c42b072b8330e044020f87b7fb966bd51bc360597d27ce32fb4198424918f3321b413202c62e4609001dc361b8044918af2edd5427c7cde4172064353bdddd78980a976e7fbbafe5daf9c9bf9c2ec485aa66b9268f6519f42a0e470784948637bed99fc51c637e48d7061327f4a06eaa81fd7c37006a12e1c86da93fafe7adede440c3ad28d041c0a8d538416df39805ba65af1c4751591b56c113541a418509cce29b9d316c8aeba4e991826482d105d831ca3cb0a54d2f79ab0ddb503cdc29cd01900ba2a2ca087fa5c76184e8ba595fe4461ed8f07f9c857e014bee23e3ac6950397f191d8fc58dbc32752b9fb44eb5ffbb492cad50c12edc961c40b16c302641007de1373ca1437f7b23e5124f747ed682222 +0x2b73f1ea458d69bd87d55e2c055936222a83d927d4c4b1b059259633ab0b14d0ac62ddc4d04d6a6d2c878b0fa1b53fbf +43792 +0x64c756b6dd40859a1a0fc128f33f3dd0e4efebce0e47a0b77eb17352b24566aa598448615b4ad94719fe302bf60c5af2169544e66665da50dc25714800d162ccab6df8100ef48d15f792ef7d5012099ee89abfd57796191cdcf2a4dfa88c150ce0e9306aff27e82b3b32c8c4093b91fce366254349c3a3460680d4c0b45dc693825fb61735c933b26d4881a92a6e3c358e613ddae5d5c2f4e237c8932b2bbc88193953c0b8c3b7d1163be3d3ba93507172f4d13f52b2bb4ff9804aff16e040142bdecf0d91feb9b1bd73b6ebc19116d71585a71d9844d97ed2c120ac7c639a5f42b6f2a5c7618479ea58c2984852d690017e891ac07163a9f5631343659c1290e529843162d35f522552ce8355bdd8c3be453dded023a0faebcfeb6cda73f0d09d9f4c586b3e9164f7c9a453f3ba6399d2448b12d341d9973b6c70cee1d07b46f08013c3e98963d6e7250ab12731c03ac7e13d5eceb357a86da16a12859bfc1b6834a119e49c1dd17ecec945fb0a38cd25861969cb615f560ad8a0dfcbbcbb768d23be03655f077c422ca9b6762d117b729ae9dcd1333cc89978dbdebd1b0080e6b6322972ba6800bda771ada083936b3885735ee9113428a2e9e3b762a11360fb53c43216958a8477a8ebd182f208c6feae80981ae3919bad928011c2343b3f54643ec756d8b331f795ddcb2363b6b34d7fd7326c91994b43dd7a94e6bdc2457a4f668f3c6b2c2fc5d810428cbfe65bac5f42d3e7039560eb3198e9d525ee99f47e0533cf363da569d74cdfc3ece1e5a3b687239421cc022ef6a3b8975208644a57e25a17212dbb6bfc584ad2d4ec7abaed6fcc7ad48857939564a8352e57cd0544c7ad1d15469b54aefe2ac05d52427a6ac273a1020f8aa274a062b6a025fdacab7ad3e8f8ce6aac540427967159646a9648c31294abc1e3fc228e228fb81cc7f6c47580b40e53f95833ea5bf74b0913d9c861d473a124df95b1d382e55a51de8c6d3bee2f4e7cc521531b17d76e58fb9c0cf8ef853cdd1da814d9dd8950c47ad53dcc3953d60d97172c62d3f90b7aac45da2e6cb4c311259b14493b63e59e2239fcd16906ed2ff8a2856596456996ae3efbab52e77deb80d879cba45b60075f2071f18732dc096f2a28cf68a3d2d587ed3718a906b390b5c50b0621590826b8f265d59abeecc58417db4651fb8c5fc1bc551d7af8ae2b4ccc91a3b9452724b517a025aa926288bfd167725a35e05be3121f61cca7b3e2ce54d54975070328def8ea88c096897da9c094fd8a3916f176565b8da7fa0dddc2c49da15b87e45bbcfb0ba6e2b2a8c9c94d298ceaef764b01f2d24813d90245b086b25376ae14e5d689ca281bce0697a7def0ca803f488e0c4d4c3b192cdc422001dc06cb62daedb40bf0b670d2ec0dccddaf5c5612d3e520cf910ec0dbe1fb9b9de262648c7d9bdfe745f7eba6a253bfb02fed744e6076c4e0686811cf5a99a8c28e1148154618de8791949332709208c13823e0dd376980e89af112ee8e43d0d8a6b87fe37d8c39519c34705f9ef2307692a6a4a5a0e7dc4ff052cd21c7229a47f30212e06a1f79af2e808b13739abe39041fc890e318617d2f334a514b5e8e783d9408f254f725080e20eb3738b33a7157365285472396db223b9064641e34d14c196903853fc5c305bb98b436642d8553924c6b153003cf9013a744578a15bbe7373dfa431de24adbf99b70b2d61edfc0dcbd2c966931c2406397d76fccb89fd8968dbfd7b903045884fb55f73095e666bbaeaf0ff4a71dfbd26807f309a5e3e5df603a893cb0594301c04a4c9b1a020dd826dccbf9ed46890823ba2a6c65f1d7babf53a0ce71b1661bf336f83f369b7cda2d9b11a18ca7b2aed0da5d1a7f2f75ceb1f26696cf7487789b03444370197c6acbd428130ba63e6c754ed53e7b0789c43eff21bd510a6fc0c09878d051e5d530096f5978f2adf4e91cfed7fee2e0d9436e621a6a80dce69c6adddc0d60654fd3ee54ecf8ca239dceccd2ae823b212ff44a0399c6e250b4b4a2bab7232502b1fc836c29ba1a7001c28eb2a1f30e34517fd9cae5f901cfa0af6f1753392824c552cf9d57e76afbe86e6986f779e480078b24a0482a65c27335dadcf678f234517edad0c0a6432e1a796536f93b436d1bc0316b0882948ff5f0eaf1e9080a981e27aceeaa202b705e8c8aaaef62b66353c80a156e2818a0ee85a73e7410f8baf4f64edd5e7dac2a7e4fe1cb2115c2ca7948b784c244795b269f19acdeb845019b93c78724e44ec24069717fd67df10a53eb3ea24c003d2a65e44921712a78d4daa51fd2437d98a16d8342af57c2ca8baa56a9555382ee7472fc3e86738b199d7ad45ea80571122fcd445d44ed0bd5b64534008721f213a0169000c42d06b0c344ca8df0b0e844d42755c924de809bf1ee2b491ffc793518194898c1e7c0c6aefd2cb4928d09b7f9445d8e39724ba3a56be38e052d3fdb4343cb0d67e9e4e2c570a5d975e4fdf204ed05b569f391753b8506d621fc6b8d895bc2679d7a988d7264db0683fdec7d5fe8f5459ea77d9a1904392a5bb025d4522bd4af4ae3044e1da07642a31ffde170fdd446bfd83499a9b026919b9397360679aaec586d52ad2ced1f96bd9458a5a1f64bc1b4cce1fa52517513c9ebe63d0d0eeb26ae5da73208137e08baa22651599a01bc65cbaa467baeceb8cd013d71d0b2406534fe2e6619da3aa380928f6effb09f42ba1fb7048e90d7898f1dc259b52c51b2d2970cd0c70afb6cf8acba83fd01cc589b0f31bcf2bf3b8df7879d7d2546c514706f6cf97b6a6b6d0a37d018ba553108f0e240f70f03a0ccee86f76589c64594f6cf74679bc330ad9f7df8b59e737559a1e10b3b4d24af4f5a63f89a477578394cff4ca491ddf2349dc45be3112541549654bb1314e90f1d2567c7a3c91b070b5b471d38c3805a0bee5520297b313dffb7837704cc1b683e35d78d087580991209ef0fa99b740f397878701044601064edb56898dd8264bb74fe7152b56bd7573f3e49817f80bac62574731fd47a638b1e33b656afe6a99bc8239c08f0a668e1e67df447d96e03bbdb9350de9447dd7a334688c6aa0fdfe61b8d35b28df7f6b8e4f537841004911f841b30d5ea8f273b1534067137c5afa5548565d8f62726e523eb3bbf8c0b0dfa07553a8d3f19e8d6aa455adebccfc1df5b53540392fea26f89aa2780b54a1e544c89978dfcaec951dcc3a995a3f6bc9c183f29bac943125e00792450f38b6d363bff6e5d871672b692f41e1f520248e473910d8603c01dbb6f9f5ab5ae94a2a7bcfee8864a198a0db422de0333bb0ec0549027eea83b6c8dbd65f0394e2e64b0b7cf2d8fab7eba5c299314c9ace8b637a385a07a207da7dcd4130f643b215b5814bb6400140fa9addb8fe6fa2753e85248b89fb2d44e75b09bf1debddd3530a7bb08b662ec92ff07b1607c1d0bc24b182b714d1f2a757e12fa4686cc9d328ba594fe4a3b9bd06673934dffbac0fe879134f8d1488bbc6b09d95c2e19e1df135b88e74916899184f7699d975aaecf45c54c9454b560e9e49e2079ff2d120571d07d09da781e9d019e1b996b843dfc2dbd598ffeef0fc590d8b7e6218f996c4d0c5cae26ebc2bb866d9289a4c0d54fe680442ff67d021818bf87ebbbc7dcdc4d180e1c54f6ddb5bb6eb4b56996de8e1916f6bd65e79faa235b76cff55e451d1cfb7a9b8d22d75147a86a64e38fc0826d88568072b650425ab56ddcf8db3bf660bd8775f9f51858d3239ddf3a32e3f38bdd4bc246717caa65d45558ecc62531c2671ff0bff9089106e8336f9507afa91a1dbfc908a08aa8ebc0148cf9a86d94e900295608b60fc689fe165a1c978d6bc35099dfe1cce405948294c045077ae87e908cedfbb396bd036d2ce8f969e3022e7fc14af97cf1880a21bb3cfb6eb4f4282032fec178033f1d3e5f6351061a3702b21e52773819fbf2a573474162838290b602d0818dc0147f7895114ff49bd0e7ef9a418488c424f717a32a3f6d4f585d5de4ad647b3304d023b83c18bdcd9587401c5d47f55acdbf7e332e1f16803f381ac0db92c9c6d7b848af2ad7e8175087ac8df0e90643bcf2e20a9806e57effc9f77ea332ffe054e1ed6223b2fee3c7923bd3409144e8ba394b12b31e63b260b7fb074d6ca5e845f01db971d18698c34ef6d7966835af8e3cc232c68f17822aab2e41216a44487090dd9c5b5d089d0c63e4813996630102a24e5218818a57244c9915675163679d6737f3287e0d5c6a7a0eba73425647dc13f85af21b429a1843436b664c8bad961d32a6215b1c3ca53b7a688a9494e7e539c7339c85c9b1cc37352c67804382225bd69d8e1dbda5844d3274c7b5a74be5b9c3c35ee8a70608d1753eb218134e08c92cc1b7eb78ffd1593ec772cd17d9a43ef4f3806c62ff96b90d8b8f3a8379110e3bf8e3eed6b35206a448d3036afbe96e63ac493884063d9604fa460f1c6b05d20c2b5b4e5e27d0fd6ede31802a187df117d403759582c41063721ebe658dacbfa543683299c412e5a473d66cde9729701854f44a1bdbf4d031dd606fe745cd7b102650c20df2e2674cee08ee0fe2b3936f1564e0a078957e7622554c28fc32ae55be5b28441a062b7036102e4460e30123fe9d5eabc36fc23b29427ab21ba1017af1d389c6a247d817353655057983633cf6e6edc523494287da72240d08e31b89a9fe1019f46d164ad2c18bdb955960c3e786b57400eca9621d2c70bf2dc0a689cd26e2c776408f10f5fbf74c1c2fa1bfb8c6dd43c3219dd4dab78652f1ff478345912a589288e871862ac2e276cbcd3851ee8eb7d2aec6e6f95c8f4ebb6aa87ef9870e52af0ccc756e9713250cf58d369a46ef5a965bce9f6263b339f5c77182d152b63f3495e125938a139c447789c27b1529b377f25a08fd14199d06df4a98b5394ba68bebcf88de4aeacf871868e3dca5634ade391527b3b6ea01567ad9c68d83f5101bd63fa63721bf463e9fd3a2a53cc6a831faa4066a934dee4d60c9164179db044c1ed9888755ba8acfd57105be237a54d9fbb2ad0bf16beb5358c090b963260a868a4435b42f0522a482eb170fa2a6d63f05e5227f196c80d02b663bdd89fdaa31e329b5a8f7c596236ee8dd800072b7cadfe56fac5377352ca1651f9632896db5f12f1149f5256fb6601161fa87077ee1535b9c7ce7b493cf826244caa7f2da7b7cff5081714b34c4210eaa637d8db3ee27efafd61c4c21219608b362315f7ae94c407a37b25f6db57a86c0a52b2bdf582448b2a13b67678ba5fc734716f8d368289b9853018aa2f03021aca6d90a8987120facc78c2cee7376e98c5f9ee76f61dab8b1bca6f35cdf0e887550cf5239e3b9eba62f57c43d42d27507941351d63a283ecd5ce9c422e9db632389542a77d4e085a7c1e457dd618148ebcdbb618e5ddbd6f41a11227d765e59bf3bb1baccc25184b7657a0c54364b0b40f2e03c2130bb272fde6837f4ee60134f4d2f2bbf15d291de03630b2c2bf8660eeac80d171d8fda8590342b0fbaa939dea714a5d9352c542583e57deca74f005e9fbbfaf68a2196ff19be26564001727131a84fa08a277493cd498a1d12198237f8032b48e13704a45f4e4f52e9306612d335529e7d8a9a31cad75946d31e93a2dde7c994899acb7c4b2cce8a1dfdbec87501d65b741f6d0660d613ef5426dca636aefc63ea12948fc59fcc864532229cff55025ed8ac961a7890dfa1fcf9054beba1eb3c6c6607e6b6f071cfc79539945979fe2f12fabc75fb4be6e2335eb599e508bfa77760cb880468e4ec0defacbb6bb5f35688d18820cf504f3d611f94990a2b9f2c73c6897d994d4e657d0722161e51095ba4f8a222dee74337ee024b524351b454c861e8ce5be7d6c381a744af589467c7cd39b1830e57ea5a43d082cc79c326a6def991823480a58d8095ba8d02c836226a5a5d4b49ea6b2dc650e01092ca1cab1e562ba10b5ee24be29a2bb805339df2e524508376e6ef38e04c0e2578acbee9ee3f5f34c7cab6860e7e4039471dc5c1a55f2f337d949d04f98ab41311b135eab77dd541520c49c46e09a017b2d0d51612d3a561463c9e187ad479e34723a936e2d934d3936cc2906903f35a2d93f67a94475817b82619fcc9f0059c00484153d51825ef7232496f6733e30b9fad50749385f05cbd99373950a60146266a26cbfa054f9fd7a508ebd0621630f2670a8c775316393cdf205676c015eaa0cf8026b8675beaaa0e248b0d5834d40d094d4aa87a72b41e3efbdba204e88f56bf76ea7605f0d9d3b5c8d784dde6fcd8db40378fc2abd849fff0513e3c233d308430a19ea8b7723be21a589eb9d4b23b240cda92f269aaa669293fb12e6dfc1665d7d2971857bfc8dd4295c3b3a5fd1e2ed8bb1ad456341dc6cb2d63a36fd5f0a99306c91d79c863ed69175c9501e6693fcd63902e187d975c01a3bc62d1cfa6998bc49c7fc594f55cb764cf25927304a013595ac9578dfa75f12a24353af3207de8947805e22b64705306862cfdaed799d125e26dbc6d3057c34903e25248479dd1fec57979959a726685e771ed9fcb712f508ee1ee241f4aa089c132c2d601406f8beba131da7da917675cbe084dc6725661c8ef96bab198b071c6ed32a537afeac25245b303f75f8f364cd9f6c0b1e26ee0f75d5c38cc871a897adb49bed233692c622fa718efdaf5791f8b6000750a9e5682f4e7a55a61075946c3b028b812144f8426b31f4c6472b93c9cee16f8320f4ad37ce009426c9e6a906f0febd39414b51ef18222f8432e7d0dd4470924a2e94451bdee6c6cf10843c1a50d10090391e69a59ba28dabf504df9fb14e1e0a153cc647fbad7c0376c6c422e529d44a5b2695e26043ada2201b168d8fca61378756b7489ec512688f36e7ad2879d6bc4a0c5d420075fe0b26832c234a861a77078a8e9a42be3862ac4d0d058541566a68385620e6c9fd4b9ae5770d7bf1a83cf840c2c981f94c866091aae8a600f1d93822e72bada029e7dfaa9d889ead78fddc01ea32d716cd484e7d57b2e549278d5c54a6beafa91274775af6312d1a2b3e45566b72ac97392cc88889e0dd7a75fb37560b5677453555e46f179391b82d72a6b6cd059ceb2eb8614bb81ef9255ba74baf9b8f9ef51110c97f783c77180e3f828b957802930c5f9b2f68b9c2ca47161bb9cdb67139144978d4ae7857aa2bf96b7d4b26882f50a6e8bc224db4e9c6cc2a1d1897b891dd44852710f38dff2544c3e454bd97f0aa02dc7a6b475a04693df932127fbf9fdab670ef461ab47788862e695899bcb76717e8d2ba333c9a9cfffba121eb00a37af3ce85c47a55b3b441fd64bd3750c4163a905d75adb72cd066b3e2ed66265d5ca0e092f28edc34371cd37ef9330eb7460f559353f3542bb216c46fdb7d9b2dee32799f86c4c2698f5b2300930940f164facaecabb0be27a0948fa062adc985be1cdbf3c7a8a2c43ba16ea221269212f17142f203723f912a44783d19535bf53ae49a385bc6f7e4ba6438cc1a177c8c8a27501be1946308cdcb309e661aad0ce31e36e5a99c2c4b8a3803f6f4586ade7d7194f2cca3c2fef98d2b3cef70473d552e24844794da59298142bb3665d77979e473ff3b3cd9d43c0eeaa10bd0a4f6ef99058cac4d6cae26c4877156cc5cfdddf46f99a3bc123913b4d16341d860da40e33c774e3 +0x50e223e4f32f90fb64ffbfa33f0ea65841d75dfad19d0eefbc67664b546e60f5564bde3351b3d49df2ac3613c15e43db +44584 +0xd62dc41bef5d0526a8e594471c457daad5afbea6e2c7fc9d29a87524ff273664f65b8ec0f65dc2b9904c020e8e949c27cf7070b352aea49190b399ec0fbe1dab3471e208598d2e7e1ffdd5e9051665e93a1da087b0092f1b728b946d374c611a3776a7393d75b23ffefff320a9513eb7bfbc366825610504783950eca058697aa872c79ccc9eb4c2d45a46fba1cf905a0657199fd93d8e1349c4b3b4716a9f922e6d29792e8f9ed04a16b5c11618c49bb6f53374f32531128e34a70cd30a6a2c7270b5188bd0d631083c27bc2fb24040779f6b2e9ba159c7ee91133beec1320e1b8253c00aeac6adb5d4863215276e11f35ca917fb3a6bfc12e4de8ae9166001d2acebbbd364d40cf9e4b96cefffb5d8cf34d5753877d077a135f241ed925acd3ff5654f0fc66a157e76a8b2e6c07c5bb62fd8917de1f001448a36a821bb893a0965a9c5e699ef91e9913b4c22f42d634e5698b3f0fe3361a3ed9206ae1c5510d904a0657f63cb49e53e5a81ca222fb83fb0fe23b95902616565eea5bb3a271656db307603af65021884ed9a07d3ea223245f2280177c3c732fa32cb719f651529f14242990227872a6bdcdf008ec669cf1e5d0bf0e2e05cb4b547c1f8d279d6f94ebf0f6ae6789fc4fb0f98dedb2b54bd422515ad21bfe8909d13cf775bc91e6ffb8d269ee2c0118e3d6e0dc84281ada5b9348b61bcca3371bb7f3c16c3bfb833ff96cf5c7f68a62f38e286e74c303a2e8c70b8333b6704fd157352ff90c16bec62c051cc43d62650f4514a6280a0c401c2c3e34c270024dcb6d857574d39fe422df5f617b87359987aa5a262673912c5631453d308fc5cb7a39494497f8e3adf671c046566a706b0d1c4d60f8764ee23784a51f164c37236e59151fab028e768181dc4ddd4dbf73f01982e906b871ec3084f25cec5bd2e0085b5d695676fcd8848e07ea88a75f2ee1307f10e980c6b4c1b0a1791b2525abe8bea6a402dcbb3e5004c7aed10dfc0650efb69b098599d67b9636f63b4eabc17fd17562389a46227474bffd5ef7f294bfa5bdc9ff1d87cbbeb42746b52ed1eb4e524e3680362a3f726c55688aebff448e00f93022eefcff1b88f6fd214c3463c4af85634236d3cfda4a0c82dd506eb06c7fed602d40860b02932a8bf82d4fc58357dfab2722df5e0c9c59bedecbbd42ab712edc76d8af5a14514675b25880ab0ad9a1607770b98489d1c17ef7c48785fb8321f7881dd576b141bf4cd844837ebba37f15eba6debdf298d865c0c149f4bd346b53e96694eb79e30963e277a4ab2643dd4ddc4bcb84a74012e5b258710960f37f7403695a22dec3c97d697880cacb49207ac1c61c534865e59154e0995e975eb2da7e8cb1a7405253dbc5bd84582b11fd2f44ac2da43688e4db10f02f4ec0b4b9f9a35737f35f1d5d119fbd4bcdb64cc7dddd749c11f21775258f0daf646db3f9542a3f39917b9329a1400e23b60d3824f8e4a5d4171b903b2327af9639fedb056c6bcb430c36426e2d6f16c88b9082791302b6521e13919b36634c803a147842b4f081e0ce0fa98ef8756d96c8d0ba48cea03cb2a16a8a09f1da7ad9ef2f3a55c050e9af417846f0b4db891af84e2e285e559f624b90e82bc7e5911fb3af9f9310f568eb21008957c539dfc194797c8c748b54ed77174a653b2d45de3225f6af19668630c7291f18abf9082727e323d993c9f3b0ae7e1f4abe0a0f71e512fdfe6c1cd82cbe6246b7fba168b81d1b92b42e9a02587c35d540e3143497471713f56b90c51b713cbeba16bb97f0fe636790b763f7414acf0aec2cd47b9ad272b748aa5ad3a97a28d593afb00c6e468b00f3c0c05907a4aa3ea10db34b1901d6765caae38a4343a739d909173c8c8fd30d51dd279e280467df040839098e6fb2cfa5efc36f7578483a0eb569bed834dbdb3f5f123d0f04886a89aefe5d67768831b8db62f9ac627c7489572ff9edc015f910e908bc391f7c7fb6644bad30b0d72b0a005a9f74acc477ed50c28419dc11e57aed83a242afc47cfebad98f66a9204a1df102e75aa1b0a2bf24c9c408c3403ed1ef1b75984fe0f0e725006a95b9e3ed69200457cb0bb1835355be5017203153ba6028acc67a6259e43558c54a8d92a3801fc777422557986e6618bee16d65d298d333ce39a9c9369a6e5b25d17edcfad742d4ac5c99036044d85146d4253e1a01dae5408e7876155e328012d717f351e32ba48d86d155599b1f00ae8bc25ab869c985aa21410954c4145002c7d3a657484ccf913d68be12c5ccaf4c64df2c3c5531cd619eade3935096438c205c36695b28be4dfcb9bdfa4943a5b6fbd632f438a5f51d4319a54f784af2f58cfc5406b041e91a515ed59eba268c64bd41ff9ea898c533db1ebef7cf74c6f54a5e6fcddc1ae88cb7c2856e8ce7dbdc25acf29a097c962bb317a11abad6380204dcea1d2336252bbc8f5df835fa1c83c161ac54ffd3e08b67beec26ced1de8228f263734a06376dbc1fbfba49ffb7021d1a9d7de0415cc9655f00aa7fea131c43596c7ea51d87c952fe3b233d4b43cd953236635f17336c48828f2442918e26d05c557dc8eeaed50d9540c1847f3b5cc64317b3c0f82cfa6dc3d812cb6aa8484c95cf2f29fc14f7388f7123b40e16162cc7b1ddba56a1ea518d8c045ed7e9e7347029d14cb842d680474cb8506a6ca0452a854fafa53ac2a06a0b57815bdb8a14860622a5b5c0c96157240dce3697818c06028815764ff9b6c3e6aae788e5b76931e481c977076658399772a1d52f208dc4da25804c5a1611359e7cd5c1a0d5af2e357d2c7e9f23d15927a55fd8bc03a6f15c967499f1ae5c39a32be0a8959b52b57983433ee098694055146cb396a184060a6976e1af08e43a8556aca02c4ef0723122b23a841a8c99902e6cf87780819d73fceba5dadc35d2d58b8e4add8704eefce9dde3e250b79f7971c519b7374c0219ef57691d8eed7ce418f9fb31ca1c862d274add93a186fc717cf989de3c3fee7cbf5ebddfa767a351ad9443c18e83c252896d8a10a3572b08be9edb64e5d9bd1ccb45e6a9ac30e0aeb7d1b6f55ae74e0d8eda7bd1ccb495afa51980d3eaa5f86ab1c1a5f403d5bf4ba636c755a5c363ae85f6156f843bd6e6cefe1cc3a1212af701466e5754c289c91737f76af584bdb62d6509327039694eaab0f18cbfd7bf321838924bf583faa77959b99dd0c7b6c4d39ba9d30759c737a6d6c1c77d363fbc853cc43a9c966c575b10a066bde8d95b270e89b9b0096b4271d3efdc9fc926f6c6b776bb807669591af12e6e1384bfd986222b6f10b4efef6a3cee646e0d0f616b3d2c3767a07c3d577fc61c8817b4d07f9b016b8008afaf1e764fd78e7e538cd1324746a8a10f749f1109ea721e62c081cd9e27b4613501fd2486ae67a98de9973b7a51ca04bd8f40695c606805443a1b3e643bf45b1a7884ac15618ffb29082bbd17f15227e0fde9cd5006d068d3adca71f600e652ba7353818e997e0fcf591d3bb2adc7a72440f9c1675651b58b8c1decc62ef0e4bf92d85964aea833bb6cda3bdcdf90eef1e90efa14c75277e6557413570eba8d745781780a299523a7a3f141e90f548bd45687bbeae2692c8eaa6b8a2b3899b98321fd821182db3c0eaed0c289c578fa3629f2ab4c3ffc4fbefb62c5a52514f566929afc0d52d1094aee1742119a74a6a1d3ee3cdb28825e21b9083a676cb2dd9929e83a40021d07f6d2335522f6ee3da1d4b8d4fa4491e44173ba7ce47809be854873e16c2915b49cfb935030432c1bb0bd11283c0cb15e88abf7e1aecf7024d57ebc75e430619ba7ead5e7cc37e4cd58ed559b12f9573971d25f2d18eb8cbce44d206c4aa0872991f07970492d7ecf04f614a21182fa1197874ea3d544c5c34c344e390201dceb05dcdc7e499c709d3f57ccd1aa422053642b44da4673a1f467b4a4609cccf95c5dd09d86502d50b47292fcae6fbf509b624ed054fee0a7ace15eb1778d7a52fa14ac2b1cdf28a5a14938129cb44301460c528f9861245d79238303e256827040c4a013a64936c5e02da7ad212a85c8dfdce6d1191fb729d5c8d1fa358a8de7cce85cd5b740d0580d8a722ae024e00de55e6c235b7d01934f2bcc32f59be5100aea52efc4388dd2660a182a3e55ea46e30b6314d41bac2041c6c21c86fd309f6754f2c051a2b7aba6071a19a0102d0a556e5c14177e0f675a4454357e40f8cc8eb2dd05e411e66a2a1be877ca0600deb8f1c7af9a16b3cef51f130c5fe9964dcd8e721f0008a2948eb313d2f08a0e2a8a203655e07821ddaea15f0f8069a189c042527a19f9749120672ca9d81ebd84458418956f14e209e385c8cda4339316f378eeb5a656c506ab92836ac55697627797fefcaa6f6cda3036b0b52ff9f36bc38ca74049c32c6b7cdfb8a46ca4144bacd649da36fa3ac5112ed754780f3afedd082cb858a1031600b95cd522a9cca631b999dc7947d46112f88d2a3105e2569c75ef6c7772f1bcf389b07b8bba1918b2dc5f7205dab224920e42b4df5081f98e505ffb0adb60b6b1fb84060c679209bc991b1951156c863aeaa872d771825e2f120ed2a73ce8a9c87928132924bfff9b8a5d50dfaa5c1c5a182ef2be0b7bfafb556c91c109f1fca37d1d1166940b70fc1a86a725ec194d9c1136a2f760c7667f7509a6dcd50525df81e39f49180cf44ae4379ab86d1c905d60600218340d17280b56807f20aabbd9221c0b45332cfff461d09a0bafee9b3a702b9e94d7a5938182e3cd1c7f4b353cd816e3ef77e3faa50df223942707b4afdb09e6f1de3942286631db39337f18571e64b7ac58da8ac9530cc5e654e0732a0b8b69c3aa30c9694fb1395a0faedbc45fa60500587926dddb910f76cc015d258c10a56eee149fd089f265f346630611262b4a9fe948355ef21f5ec9ff02e94ed73a0867fc5d1c0abf65ff998a341daa0c94f6bf9da05cc951184254603d9df2678821536782e4545a9c54c14d8a891b7d53a803e849f3a9531c48aa9249f1ccc75b8e95b22e8f69e5f603eef2deeec1f2e7cce15b8da07b828bd04107907b1a71548ec36ea853a7dc139b873cb9a559f7d1d3fc69e3c9bc69f7779c22a99077ffd3c040ef98f78ac7657a3e6da3433016a26ba98604f5e873dfbd30860dd861cd89b1b2d778e1af127c3e5918145ee0b9c9e26d5239bb9c3ab50f82a435c96464c6e18d98b0887157c8368bce954ee86bc8d6dc312a71241907ed270fa9da0c401bce35b5d8727e01ca112af3ae99a3971fc76aa52fbd2ca958e4721ae280a5fa18d64fb16926219b024cdb19b8c5cee64f129d40e1f62266287418786863edfd1ea8300deb2a08adf15800b34c69b6b3d776e886c9c281d9e71a7e8ab3ea20c3bd928b4dc6d49f9527b13062e1ec079a3932d0d94f88e76f154618d44d8a0ad87653b5d394ec52fb15e6de8b11d31e03e4f4eacafbefbfb053956be7add9f8c5d93a4441cda7cf4a3c778f9e4495768b7b2b9ade573d7727f2770c375d4076f636d4bb1ae9bd70fd0bc1b83f02d9ad9b6c457585da189a40a2796e35c453f1f44fa18eb17183c4ae1483eccfd4e63fae28e0ef440cf7b594c40b06757b8b164a642f43c7ed9146b7e70c91d32361894e417c7cbb5861459ed7aa79790b6c405324ec5ea0b67c83b4e3ea5beb76c236f63686b23e54dbc6b96dd61bb2cc6e0cc8f25753ee849be82fab9b8f7b578ea530887e045f8acdb59ef72c71b56716d7f65cfea803a07600829e9eb1054e3d7087b7e1079152bd9e99f40c1ff343ed3e75e550ef82c2a159484d72750bb3350556355e10764531fe44f4f38aeeeb57bcc20bec7eee33944f0b38a520113f3bf0469123d360eab1311a6a81271ad5ecbf65312ffa98abc57e25d0a556983a88bdb34bf0b4f3bbc1e3a4d52399099c22c2ca05a9d72473bb5332a6019d034dc1ca36d63339a120ca925eb559353d9680738af9d8991423fc6abc49385804d16da23bb079c5fbc251a9b29ba0a0196d8c2e027e3ab4ea54ff211d0ab80c0f7df2d25c7b230e6618fda64af8885e4f79bc7edb034ebf095f4a12ff9b1f4d75abe7d6f386cd67627d0524824c7eb4225387c26f49931c13cb53bcbe4acc80e9d3b32cbb73d76593972e90f3080266447374b5598196507c21a28ae3ca4e4ade9deb4ffec2ef9d5bdfd06807cba1d9286219b4047bd6f0b4fabd0a0a7a230fc65306bd37e464533dcf71365b07db8140a7dd3b0a78c371509f19c68cdac94423ab8c011168e43bbbdea778474d1df31fad35d6d608ea56d1b73f2d058cdf8c98ffe197f5b0cdbb4895d9aa56ebf7a327eaca03f1bcba25aabb93b9eed0a44d78d8bdfe7f6caf66867d9e492494e715fc08e04ee804c1425e24ce09b366d60b55be67b0f8ed07a1d80e5bd12ab87ac00e504f1413618e517e7b3478fdbfd34ab239753bfcc24511cfb098dec3d70145d1893cf02e637fb76e376da4284c2a8000a27d1c158d061ad01cdbce9a6148fbe7fc506f737b2408afd1e007bd8c5a5fe3a1d5cdcd9dc9417babab2d18e78066a4221fee9d2909a9d5e3220047f0d11ebdb015bd7f74ed0a44d57d76c9fa662aa8a2f209f5ed9f3f52d3aa4a322a2d610145c387b5b30ff9ae32c94817fa589c67f78d2e3849532db93bff321698ddab50eb55a90ad890842a3c24fdad67d650648837d7beccd3f97b8487545fbd50722f19429de9462d3e4b6a0713d4d37ddb10ed88a303d890271c35d92d98182439ee4810d2cb9c248c8434f63738bd9d811f8005fca1fcf63b1dc86b2a3a29d78720f056e43c4b14f3573558c44396e406c2f8266113ca94a9e2d4c3d6d072d8de79ba7b4ec5c38d0756e3c5377fffbfc0bdae606cd391e9f81db369bfd573a6a43b0f047ed295db3ce5b8b22d6848af43622b5a6c5c1364aa211cd341b3bcdf7ce7567900ed52ae08962cb6027712210352f76b0c27afa3349f59771915bec1cd21394f51905a73fedad8374336dcc384f28b18b8c0c7142beaf1eb8265ea2c195b2ffdfd463dbb944613bc8c2218f54cd35ef9feb20a4604868ea72a1edf4ce607831b70997ce34d4a97cc39c35734cf780b654a75e997331488108cbafec2b7b90b1e37e498899e7abcccd88508008152e9112876d5a64bf766de06c4d91c02e2007cdfc2012d1c38fb64e4f1abf706f6a054154f6ef1c3b1b36644c6eeb75c151bcdb4ac473c3b07ebfaeb93d376d4d5a9c49d6a05e82ed5e62fb32bb03337b4a577732deb356f8a071568e5ef0e5f626dd92d514b17d1c687b0ce7dbe0e0a63460087a16db74e21c53ac9628f3c2b3f7508419f9f0f71160090134778a6688365ff6eb13f104b51aed19994047eaccf57e8869f821d7156f9241df370aab6979dda84d7e00edbac4c8065e51f4478947ee048fb94e056ebda034b0c267999324628868fe0d1939406bd9ae0103bf3116286251e37e686471ba4271c1a9174d6074fd033c226f79b65efc51f87b3c0e89b508781ebaea41b469d3e8dbd90cde559d6fe8df46d7c44f2ad50fdf64a566c91c60cc1409724bad334fdeb9fe628f2a6446dd908239603256ceb05ec7e282fde5d0146a73e9cc85a31e1c032000a80851ebabf7dd7d96896a4dfb1cabdaaa4e99c21acb00350a633ea8676047ce7116edc41abb5f8cae79efbcb9c2187726e4bf9da4ddb93f4e708e568a787cb4317dbf3af185104cf02c6c82b2f716a03de6dfc97b48a5efdfd31a8e4bf4c69a326450b6fafcf9a6a4ca6907ae64ae3d387c82ae67b5cc2e07b56ab9747c2e68baf4269efbc92182117a6eb375b1e7375fd02fb42fcc37e20c3e0740cbb7bb061254cb5bbd9390c98065 +0x0a53523921e16516ac76648367b4a285bfce6b711b99e4775c00ec9d15abd092d5db3ddfa3560f3dcf47f44031e91155 +45376 +0x7f16b90a18deec135d32c836063cde963fc4e6daa1555476619b2c2cc71016d2e2d8b5557be835fe476e23f4606d8203f6a81b9b42c2141cbca3c4508e1ec63948d04c0ed54bb680ae7464414d29c8c7e527bf4e502b211c49589608dbd9ac3d19c7273c104d9920fa0a3226b5b6d86c73097af9b2d8a2fe6f824a5b968af165be85eee71337036793f935aa7e5ddb7a0715f6a65011c04b95e88852a879bc3a9dd24817c6511edbe20816d59166f9770b14d85c121ea38a2553f7f4f7ee36431f76ddd511e212064d017dafd61959ede6cfcb24e0467243868b3f496c318708ac385628dc3407703daa114135be2463000b7505a2d356fe20580959ef89d611ade15b190f8d249f1bcd7b92979c8162c1937e07400b76445b82fd2d69404be7883993af9236911d4d3063aae2fc9971912e8f32a237fb9c9fd0c2ccc09c1011a708a7f24d7777723d9c6f9200269418d8a3508fb19e0c8f540b013edee64a1770163eea2997fe2451d84a51d76299dffebb6825538ad2a4e2fb618ca96524824d2b01a00ce04dbdf3ae9aef51f8d04f6b3e80fc71417463b1688bbd0b63c4d8a50e981be0988dc58ae40875552f62ef87f43f1df40c1b54291a26d9eb2652a4e088aa638b08e5c27e433beaca517747bba44e8fc233ef00b3d8dbe930f7f76b6561df81f7787e3e3693dc569aa436e06d18545ac5fe17eeb56c52f3c41edab79e61e17c0a2f7fc01c9c92c2ac71c8410716fa87e3b5bca6999c32028ee3250ff24f555cae7711d197250635e8ff55f2ef67e81d069f05b1c531231b768efdfcc9f5e62aca965cf80ff8dfb73698047c8fd3c52415051b96a3f3cf4864668c058c193aed45d587bdecdbc6507e82fd664d2139a5f82f25dd99a9db9040b4fab2a184f9ad097cbba897976309a8066938931beea697654c0f111df2fcf2c06f8b71fecc72fdd31f4276f45de99c6c707bc8878932daefb8b37215ba9263d21219644f5b450922dc12f2b95df843fc39b6532eb54ea9149051245adb5c79320be3e33e4d2d15b019a074b00a3f83feed719ed81804ec1efd718fb4fe621d28837154944a3309c6ff75629f0dc545b9b335104c5a5b8b53269c1beacbab38fba24c2019fc5ecdacb618254f0d937276b4881154245c6efc345930c6e93fb0f48ffbb09508b64aaa65112688b3aff07d17f509b61e0d7d604e31360e01266f5b73066bd01943660834e9cc11a723a9160501603bef78a1c99dab958bba685b7875f6b891d50e0a0d4c277eb490f78389a6367fab3fa5c07d484fb505bd0e5e92be5201a2e41e1f02d553a6371631681d211bccceb89ac3c578a5fe44b1205ff275a2adc9ef7b8b2ff6f6ab63e2db3f1b9f38b06c006193e95536d90f3fa445e1c36f24cf9e2e38dcd897f5009cfcf0cb4716944cbf0216310689ac2f0fa4faa5d03fcd7c983e0c51a3beecd6ec9d6275423cde379e8336e5b426e06dc8276586c39d129786b3f1d57ef3f8ac78c57f61b732f8f544eeda4c8696de8f12366ecec40e5aea0f96ceb291bf814ceb7c2ed7cf81484e5b4aeaafa5600d5d97d8fdc3fd1c0e3bdcee8a2e05a9ef7cebca571eb2b0380a88a04d56380cd4a1fc15faaf934e945394c30f92023aaa0520b8e27f87472ef075f7ed8968239d21ecf54dd8b12c55fae01d4426aff81aaf344db84276cf94c9ca57b1905d2ccfa60d81df877d3fb9f768051131356da741cc92bfafa9cfd15d2ec981b23eafd1f807c096031f0e2914d3825efdbc21ba85938de00d45cf4d744a53453933340ddf83bb5b96c0220b17ca9d13d06b9bb9412e4804a6755770d6c600e56b6644ea23297817868801c8c9f45d19f36a630e3e48cb11c05ff0a24a49d54a91fc66d08ba001b01c9e35c9f2faca56aee2011f44871cf1a42b214b9a7bdc5af2202327e1915e10a02b46755a83ecb348fbfd561b93458a9a0273d38c061cfed8f80258eba3951d5a56ba33c838cc180bdce01a8a154ec6e90c6da2e98f9d1f89ac8bc9727fb0c191481b6d06c0716e3dae32d25ab53d8bdb70972078c168a34e6546e33dccb6e28f28f08adac5e39b279879e8531a1cc3b65779b6034184746f4bbc0e1633b06a9a1fc2f20dec2b8911c33fc33dedf255c3e89cca50baf978348574b3c35ca540fb55180c67df501e42560bcbe0d5c8294a4c87c629d2d099e53cf6380dee9d4cfaf17a42af465a44047a6668047ba52793aac210543110bdc997cb07bc92a176de1c70fbafc852e29d57d70270869137e52bd6129980c1ce29bf7a8698efb7a6f1fd83a02d0e3fe05614e601ed9f95418af74a32c267ebb34ddb8b1f68aeeac479bd3a97f2c0292577da1bcd436eb72dc835a6da958d97547d148739f6763fb8bf831e49c685189b48d0ffce3a9a01e3e80d7371dc9bcd990192f53b08f0c06a0b78b61e70051529111f196d99cc7b4b31a8375f5d38936a207c5d8f67c374c3a5c38a7fbae927b719eef1102aab2c4eed2e7d0be10df3af24fa479cdb9863a9d48e22d26ad9572ea9661021b3e01cd262c7cadf2fc2f45053363cca2c179605e1fe0780497cac7409affd06fd1253c0da99a84211fe9e35f655c38121e714c0143dc0f21f7b2e7281f04029d0eada019bcf9e9c4d69fa475482652983b1e5c0b573d58fb47de510595162f0f410b87bed8f3556acac0f6cb7e3a92a1a1c12ef0cc7cebecf2bda37d8fbeac5302bf5181a01f3d6f66fe68d65a017edaed1a234616234e93a2d14cd4716600f4de39abf694f6385f3598593a7e237d807779d76fb6c8f77bb2a9bbbeec94d3514e2ad58219e0acb6a13f664c5d19254ecb70c9f230c65d01bcb78ea153d38a14acd39ca8b197211254541ea0794afca2739f696216a405c21b7b241049aa9baba4f43ffefe522bdea966c0bb55416a07ea463433dafa782979651a7020728e82b0ed5de952da23982ae81b116385040baa15b8ebf0323ad43125e0659ac3e9364b2f64fc4177bebb53687c37369e410a3d7e75fee8d3b42efd1df454fb272232ee4af3ac5cb343d4ad68729140e5a7a00ef0e9e137677aa617bdf4c2d414d00514c0787e17255960b3588cb41503be49b90d93376e55f4d62b963033b8056939591061f5d34665dbefc929142570eb83a634e065f037c93b9337552c0981542c25bb4e88438f0fc2cd2ad635e4a5b5da60f780016f855e530901c2106b112769f541acb9da77bda1d60e229df51ab3ba73d5c07e2eb72a98d78615853f1d698f5223fb0efa88d5f594e38cb0b9684ba049504040d045c4999954adff083e80e8c6d2b80c364b0f3a743b8312b3e714287be77e0dd6d9a2b1c8ce29e258dd0422cdee72161036bfed0e769438674f73bf661bd819b4bb4b9de082e7d3938179a9d1c7a7d11ac46e89de353ea665ea00d1a25dfd18ec93359a6af386576ab4480a6d0ec7b1b87ca19d3df7e0c1124f320bbb3e4b7000c9e753d29073c220fdf5b11a24602c6bd7efa3d82f392d0ef78dda1b2d41a373f7d746c1fa3ec868b7093a4398ffc5c76ebf1a275b965ebe7b8aa93cbb7e47c8859bef939155bea488090283ecf5023d99767c960d86baa333af05aa696fc170fb8bbac1e6473956d96b964580ee6640f0cc57be9598e55fc8618beea784a50fd25d34f77981ad1233b78223055a6663fd27180bb43b533692588874066b66f7a256ea8ebba3ae492f634286eab7873926fd5a07c9ec88da39eaa7d4f6728bbad42f48123d0ba17e14f563fb91944d1306d57a3d572aeabd179e568c083887dbf03cda0c6e582b239ce442fb9a6f2c9405461506dc851d51c3fa00f3ac2befed8f061cd7dfe7afdc1fc67c0175a6aa3ebaa5a70eda79853ac77453b662db2831e9218d2f0258a40a26027ba7b3d94a758f9aacbfc186b6ca8a93bb4ebcb4d57bc705b76c6619ac20383ede48c58581db0c8b8294322b26a385eea4273a575c1d8139080a8bb92cc0deb1f07f3b29f4c1aa0ee5269cd5593861cbaada3c113089b0121b93d395aa6e72227eb58534f7dbf08b30d17213d30b76e13bc252910752cc474e92ee6da98bbb06b58614452f8c6886f24f5275088f6d95d39a1e55250b3e4f3d822c7fbeaae1b5516b98c8e0558a88b5daae677e569e700eabefbc3e15ae7044dc2e6a3e3eaed4bec0633edec9df16d81df669b8d381f649725754a6f47571111b64abbcc97adb7a4f14256f4bcea7e583bb0a2c98c09f10a7e5ace44a2bb81eda5fb2ceddce4000421c0b066de1c26a967cb76e18d2e100a70b339a6949cbca63702dc8ee2198ed53fb5e58a2a0dce3e0abffd1d6215275ea38772de45812a071566b5f7d1d4c9def22adca8c947dcddcd9521c53447a0cfc0de6133dcf233d7e72f9e70d09e19e9e3257d08e252ba4f5854c8202a4ae1256fc1eeef81773fdd54657e4007fde6bcb9b1b0f29eb4ce5b5204dc776da85428573601585e99b6e205113fb09f7b98211dd35dad25f782cb64ae441224e85f9f214882b898df00aea23bc808c0a097ddb7956c829ea23d663559e83978936c5474fc59555ad28509d2e9019091f34bbb2efec5b9313e66f36e0db0349130e20df95c6e78caf8adbb3d25d28f3bfc1d822b16519a0852673bb6d2844a96472993586fa96810dce18b8cf6234fe54373f955e6f66c4866a706b6b14cc5af61a9ae383df36f550387436765dc16b851b6ea55759d791c038e1b15b1f0eb0605c92541cf32d3c1f709a97578e52ddcad4f1bd2cc2f07aab084447cdb5805c0bbf4c21c2c50dd7b3fcd865f3926dc78dfa45475f1925f1af5f14793356d5a080b8f4b715c33d5ac633da1ccb0886ab5701f5fe6eeb0c9955a3ded01ca1534047e0389e768c5037bebbfc465e4f121bae72703cccb6f8c4368d0fe6f9f39d9dc9bb8442757ecae1160bdb5d2dd4a47b0cc2307cf8eb9f24ba6134284bec292b9ea1644d9319220954a9e3dbaa37c25bea87d3498417541d59c6c81e92e96a7c3f48650a4ff9e9f302fca24c63f6e030d019c52cfeb8bc20bd3448245f79f6021406e3230c8f8740a99a9329db80729c462e8291c95e2bd13d2040e4122c305fc5737b0269488e74a0fa32fe71631de0c50c9802546647a152112ed85b5ecdd7bbf4a932e6b363f191a20e24e61d36b0d55a7209506f8403a49d8e7b8bb0131c7020da2ef56eac69e41881478a2d418eef8ead212dd8659a9d1bcc38239ea4907a7eaa7125c8cc2020c438d0de11e2dd8c2fa5c44d4f70b8b41284b8d398f6d643748683e86047c6c03b915b62498f2f2394086d5f2319f082283457ec2d8e506398faf1cdb3a3c05af52741b752aaf65e7221a6a401d5d47fb357a00ddadf8143526425463164af4977771e3dbbcab585409deaec4a38c7154a6b2b991f6f0b6b477e98d2681ed62438ed6b65f362ff4065e9c4688ac75adb53eb551e69b13163de96e6f2d616e773c01693e0780836087871add941e6124a7654a71e484aa5958e498a47fa0155a0936f320dd83efc55fee2119eee396feb1833bc19499fcaa8dd02ed124242a3432973b07e925bb4b14f978a2a0e15d625c004ee8fdc3532f6516f9a125d7f52c408a0b99324f2e193012e921b202fd782f444c8f27e8f510671cc1b9899fbe6bba79297ec0ea91583ba03a3e2a2cc069b2b7fc5d1bf12b761c4b4dc45866cc1928cb5e5f9bdc2c2fbb0b34a01249ec5d6dc128fbe0c73d890a0b67689a13685d12e872e4cc0f47c73aba9ff07140ca7be9cb96107e507370bbc5d54d588eda5f01382db45a692a483f1743d550f9a2ecad3b0f45fe761554b7df601c9abf6a487d2357784dd41dd95389e7f8b65cbcd8417b5b4267206a5c84c3d07d668e60400c11b7d7ad3767a2fd785500ab515f662ef142aec136bbb1acd7ed17c6e3036e386a167a837951ccc54c539638c0d4befb078c31159f507ab7857f93c1a69cfb88963c08d684237f336eaa6263916409302400746a4571e02b344d985fbf730e84fdf12aaf3f25e2d044220b36ac546f56af681fc80f660b924b20cfa916d0d0b507fd8815929e1e2337823ab9f9ef17f4128ada37e576227334c0e0a693fb69a21d27c91065d85ab4b09496f3617c2a92b42e4bc0afeb4d5756f5725f1f3b00d4a53896a8a019bf0c151ec8ecca42cfb8fd1e1d6a550bb6c519872ddaa0dabdd109f996e62caa75b2cfe977ac1e8a2fef5521f63ec01f8245e53dbb21001ec923af2f72d1efd3a32e47bd4c3c439c71be24fe7f42d66edc5f22e0c13c25504c5101a5d172d2db7209e461efa323c0bfaed27e5f808042ea9c3838ea31f9b76de465225ccfbd0c09ca0d9f07e9a43e3e46c7693e00a7e1d483900ddb0a629d5563456dbbf299ac91f92c3d3c17b05d180e6c87c6c93194c39d90273fcf4a482c56084f95e34c04311fa80438332e67758e279f9de208a3df70a14ebc8698011946169092a8c05c12c3e9bca04805a27c4f617b6b5612564f862c49fa39341044bad7f85b4bdbfc5b6d572d1f5b1f5756d883e1d92a39f53c6797e1a2ef05bdd63ab34e98d4872b35a55a1e5b7663cd2ab1f39a8e6863c7cd994bde5cb1f550f74e125cf049ab32c8f45a59fca0b94e21631b6e33187a152ba6b108cf86eb10ce7f5ce80cb42f593be1bfa4abe2092063756224704065277d163026a476d0478454f9bb941cfae8b6f5f1c810433b8c176f2f86ecea0c45ec6f2f0283898a3b4056519d2f8af62763b6588dd2cb38da66daec5a501d57b7a03b186212c802342b0bcc5685050a5e68ae5cba9982e652773c006943e22ec4c001520ffc3a207c6dfdd3ad3f951ed4ed6566190f712e3c7320d37b6e4079b6744a45d1e7e7cd5a2db4cc6b05421bd21b62dc70da9ff8df810bcd58793f20d3e69d596f7cd8ef1593b721587e15e7a0192d2888a2142d84ca8756c70be70b643b82f6b362146ff6c98e383c53156b86104eb02910d9b373751bd691cc4123b09e81846341a33645f4c17bdf2c4b8fcc284dde1acbf574f4ab50b57e66544e0135236b48c38e2b4a3fd85009afbd3cb988b319257c70574f94ac5b567e28759d28ef132a8edc354cd05c2181877558965908c810cb5343cb57b930e1bfc681cda06ee5d14a953e95cfd555105a7bccabc2d255a45fa522b11dff9de7ce3558d9c5264704a0c22d6b65c9547ed1d58140ec9b27a9e16edb490d05082f567de409bea1a28d376aea17bac28693938d5e9dffeaa6e7f8b656db5053da82fda70ba5b4675f32b9955ce0f547531649ab4a0a22483a264d867baf0d717ca86bbab7f4cefee4bccb4b6d103ee123d19a352fce7d3c4b2d88e5320d6de8546949becf3f35f09bf2179504eebf165e8a2f35f432394e41c550dc633c983ecc8d3fbc3bce10c5ea9e457a09c19d716c0aafb2817e7e0684b64d72f685b5fe4bdbf4bae3e988033b86fd0365d20377b519c3b5befa73ed7cc828afd330ecad381c11c3afd8c534f573e637fe6917b2a27e134593ed418a92c2899be28567d5fd183ddc87e2eedf802ea81ebdcd01a99903466ae8a10f652c6e173f0ccb4bfd0197210f53512b8d447cecc08a48eae4036e042ca55c0607b4927ba2374cc3aeac616563fb6ba6c5a9285a264e20faec4988f794b2674ef790f75dcc4c4ef46f663db0e16779840f17f89957ef9e5848d119c5a9f70a0ebd2a6563c6341a09c897f5aa8f7fc2f0f3f6b6525b570a2d8005e916745c8c6fe2e8a43897d5f82841a74ffc772c9010faae282c3b6caca01d4cbf93fbca3798ed347b8247192f7a63ff144ea154290caba717d0fe18cbdaa60d65e3482751b16675b3eadfe70926b5050c4713e0d60d8f494ae5ac42b102a3b2a1af635d23e4d61214176626cc54c022fe90d7b9df3b2cfd8b144ed2a4419ca23c9f5252f557c47566b2e4c0c12e0abeb3d1f5c58cbd0d29a005eaafedbf1a45fe5a1ff00f32b8057162629c30d91d42f4b173ee25bcb737525f8bc3d4a3a403ae89d21db89e3a +0x9d7af269d49bab3b400d2b66254fcabe81cee8bd8d0d2b44c3393bebcd776402746773318ad6509fac19c1a538491094 +46168 +0xaaf94b876975eaad2ad5223b24420b374cae59d2265cd604dba310708def4e8de708c907f897196341e6eee30ce700a90078491ef3e57195ffae8a2cd88bfdf35caec4516c48daa3fb4ef025647d6216019c6917f90192d559566fe7679d8cfa3372a42b6e9015b47f9792cbd40d18c776a22385e1b8210a12222769e12ce3e791dcd25ea678b2dff6483b9b039d0a048813de2f5212067d519b1a7aef41ea05a075b4b2bb079a6c88ea525f9a3820155f7501def51829763f47b0e239e3899b88c4b3ee5646b3a35c0441dd40e342412253f65a72d1733c04b05268661aa8f0715238dc1e3be6cb9b1e6fde9ea858d1fa32246b7046ca19c75e66d61eee2f4d82a5a942bcf01c2e6cc144295c8e4a0d0e9cf3d9977d1853b0d856f20b6806fae3476fe9d76d3b12f8732888219d003d8718cb6b90804333e9a68885d38f153fbdc0f39918b82cc067bf83c195de62a98c2f14ea03573401975066561e6c456438969c1926dbd880e02abd9d615859994667361f9708d405e55e562f95057cb07b53d133abde269a8b3e3ee42d14cb54dc4b99cff59d0a87f959c2d6df64a36caf7efcad4cc7fd5591826f5ea018a2237760a6c5c51dbdcefbc91114a591a3e1fba08450b3a047fa1a7eb6d2636ec44e3f30c3c8ae91d7231434abb18f9262548840d1e48871ebd14dbb7c0a1e1e1b1d5b42599f58003fce6b24f8754471ca107de64b317240d12253c02acc782e8dd7f41ed1136c72dd172a2060286d36c25c031b5afe1a17e135541526e119a804c6314d91ec92f0994576b14b91b1e7317f4265661528fd03517743da11aa9367303b5603f271805ba27a5d2179b98e01c2614fd73c43fb1fc0e4d1ac23d3f89e5e39c18eecb22d0b745baf4aa82d32196d895e153c13171dc8c44706e13bde9098541799a4fcfc9104442c2ee6b4dc61c8e11c88dd415be5b23f2e4f118b4d2726b4de8ee0f8f7d59a5b5e35fbf693c11a921098e675cf5fc67c0def7c6a4e4a4f80a1d4694e25c07ec8ccc8ae9c5f21adc3c2ae21567a744ba46c4eea81e7e15ce1e5d307a58e38f7b4fe4dc84e4869c79dbb30548d640a8bded3d4237822d595fe34f381a53b264e477d2e12b35781b148828848c2950acc53cbe9eef6070c4200159ca1f73373cca8d0d151749351b3eb9f1cc59c165d572adbf514a39d6fab0e11362d437e05b6007fa0503805c214ae9b5693c3eee9748c8c605e28ece61851af29ee3025c657761301d6a8b3ba1ebafd9d79e025986aa16592912dfc5ad0f077ddac672f9df633135eaa6ca72217374d58409bc4518390eef37859d6b11c14f1bb2f90a471da5e071e952be9e3484d14f1b09bd1fb0582afecda5581d544e5a6293e528d2c4c2077a95f8d7fe3f922d8cf91895780399e31e37ec805ac908a1d90a355f1b594a1ec67d03c730c72e1245aab0c5bc7670dfb412d5b6b20472cde592442d8f4fa08eec0afddcd45fab07dfac6cde7b8d7f6956fafb6ba18b3f272ea8ac14ad1c67e031cc61b9375dab76d17a973023bd08288d3cc80fa7b1a0560ad9c7950343f2ab5e3db9bcf865b207b191da7b5389cd95bd74c623333c58c30082413f105ae358b7db708885fc3103068ea110797812296e2f6036e27fcb06b65e836362c5bc60d522208c7e85ab1126cd8580040c886c25b930cb33f0799982bb28b25918e06c4cae44393096a2bab8eae25a81cb82c66aceb2408632d6e3fc248bac91d8f1c374ec463f4aa39a68334361f08119b3c0a3cc6f4777bb758e892726a27b6a531ef448b0df2b3104920c836ef2708b7e03673ec23076fed7e1c03fa4349451a6d721601eb960c373c0cb0773c0dea563e73b9255ac0271709627da7ef36b334f74a2aeea5e79ef6a8cf56c1afc39dbe7e48763841ab8c7d2043684013f6e63cf8feea1ae3ed4f95b5ef20dcf0500b37c93e12ee7fcf8467ec462c8e5a92c8799717bd4d4cb1085b8af6788fa6bc1a0b47dcf50fbd35f81c94f3315969114035fd1c0a4e883ab292506cc5a37910b4801faa8863a2e3d1e541d2df68eb7b35b651953be6409133802ed76ee11353c0e07a3031b1d7e3f50a1b6c9f8586d89146bc0bb7dd1cbc756d4dc1dd0e198d26717ff759c3033d4ed34948d776e2313b2b6605e6fbc3c55ea3d4b179f536c6ce7c5786695fcff7c387f4eef104a88d1bad760b3007deb3d869ec30aa5d1007a0482965c74ee31b3b7043e753f780f5191615a5fdcb148fca06bdc5d80d4f57841f1e1ddd57e6b0a0d45fba671711701dac6a5cb50d0e601bc36ef86bce9cbf62475e35124481bfd9fc6fef932c04060fb99eb7c096732eb5e82851cb689f4622091035cddc5b4fce309c0f41fd00bfd783d83f862eec027fbd125961a3fff4acad5ca578e61d6867b80ea1d853aea45d53417a709c21e361895597934764d1e87b6b0e7a2b6e128cdbec2dc0f6b6bc8a7001f2e4aab9d943961893ca1b78e6bebb65f83b73f75625e25e3b60aebf1044243f2f4b1e5dec0d2a84d66fe8e03a17b472e923855f3b1a158e54224371a674b523b70ec1b425a78ec1e7e87647d5d9afb86b9a2b4fca53bca1ff6d7c7688036cd614935b678bfa0af64e9f8d53c0eef46205082b6f0ab81fc2c5aa2273bed79180ce44b41d26ece54b94faf5ac023ccb9640d54e66033286172d3ffd134eda6c486b88937fff6669e9406375fba3ad7c7ca2695cddbda738c8bf95d5fb42f2445775c6c2341d51dcf8da41d7e8ac284e3eb52c1d7b41017efe031472d6a10963d5746807e58993879febfce11a24948b01018759e99626a0e182249c4a74060fe9eed52b3a4916b207fafc5c3a13db79f00de0d7cec400e698c32e1affc2d191bb6d75f6da67c0a5588fa80fef82e4603061a060d3d475974c4e98b59f9352317478b02f6eea7ba7b9326ac4e277978aec8530bca0cd6ffd24accc35cff071363c98eea09ddb2e01526ca941bbfddc3e4a02f6b3dcb7d55e4964306239df16ea3a53970f1041c1fc4cc4ce4f21199bc3725e5c0c2f9a8f03e2fe2e03856b2993973413456f241bdecfc33fb6bcd5bc628d24c991437f843418032de25b99927a7ac0ca0a618d26ef02ef653e35382763c3d9a508bd6d9e3913fa95c5617339e70c8125258e82c9790ed3a8af344ac50e3b07573a486dc459fa6bcd754200062175fe8a609f0eecc21bf471d060147caa1e3549ef8a86deddf5de3fbaa448e272dcbf62813c36771350dc266a629d358193ece2ef2bc0d50d2edc525b3054b320694d16510c0453b4d5123145e1eed9d9c3b38a01d4238f31caec6e228d2b6374462f0c98b87f66edd31ef829860d4efbd612a9ef2db8f591f497fbd563d5d8b698edae1ee7af99067289e5def9047e2ff391a77fdd86ef75d264613d5c5bfc2e8a1063aa429dd546d9d95e2be1db4fbd42b9ed7a8d9566248cdb09221ec4b524411f9206715000f73199cddae798abecec11e1a7e4ee40e74b84594c5118eddfe8a2a5f81bd0035fa14e99b1b24579051922ecd08b98670637e8ba829e608ba8a5210349e826c7c652822a79ebe9a150f07277bb299bc1c9778e958eada377c7a02514c1825933766bbce8f9398d0a159a8be8316700387734fe503625e99984033540278e712eb615853bfb45389e9c3ff5a8faedceb35a95c15543ae3ad926f3daef45b777a2cd78648b45b6f2442c053620de620d19b8c35e0a7cf29f1ff79a9b89e1a2727604bbe140a135c3e40f17d8b7a56ec654dae55dd9ab961f533d200076c4fa6a92a30784c2d56ab4678b9b63d416ba004b082447299645c35d41ad911eb66568def283d679a9fcccb3e9ba5de1fbeec3e68aa8a36106a592254b67d7ea7e8b724238585ecee79414b1719b50451ab2170da798f9ebc35e9493a3795940e61693a6bfada42755d992496a67c3683bac05a8a81cd22e9519d19090099f89b4abd0f2cdab31edbd7450641e453fb22887949fd55eb492447e52025b40322eb1f4330eab798c89e50c56e8d35e4b8ba8e9cdda76832a7f97341ed34d459995a599c3e2a1413d61954aaabfd2d96f5b827bb642d3b6b95d58e43de9ac415c2858428856f628cddf97d656cf63df338a7fe45abd341deb944d35b82ec05b044e91968b53f458c36ab2576202cd98208067ccbe34e0e0478c3fd09688d3bc186e1a3dd3bfe1f9a769ad75d43e5a2bbda502ddec90202855aef55cdfe12b8b20f2b9e068840632024651d9b66d50c1926217bdebb73c1d9e6039829b2011f1a54137275388ab2c5b68662b0f76f881281d7014c3937ce6a90bd1ead32dcd162ec35bb99bb5180f3a37b412e8419a94063fd38b7d0b27acfe18863b8ff0a72143e0ef3f48f19402271b023748b67e21b53109c91f06879626ed201dd551e73a6c00b9606326682dab7c194237bdeb51bb5ada77b46ee2cda8f4673aaf38d48b328b83c5f33bddb94dc2c2dabe3e2b4ca2210d3d412a81780c942337248db7391ce91315001839ce9655c3a7e3218439f1f06cc2d022acc0db341bbf3c38d86fb38231f993a5c4930d9ee453b04e3f40312ebdaf683eabcd9c3e187800217f537dbfa719b2cac8313a03ef832dada38be942c9ab1266c5c6d719e20a7730f40d04063c1c686f8bd0a5edaae16127fa3fa196585fd58243d3152d411eaa4e7ec6d0c0b7abba7c5696d7c5df1554a28a87e2913273b97a6d1edce2fd5c9f6167a66756e16db2d971ae57f154c70e079d89329b1e8ec6368bccb7a0dd6b6052f5d4532e820b576e243eaddbd29e983f796d1c1ce558059ee5082bcfaaf4f50a71791cb2622cb123b76f62e92042f931665c257c4f7b7d9bc3f8c2d72c9e647023bc48494879c9e17168fd85085c39c4ae7ed724249c36136cc403202b12b76b52c6615afd99a68e9c520616509461e298fab97a2c6639f0299576126ff7f6e547beef4f4a3550147e540504c19177726bf853e72f7e8d184293a416bff627c54bcd788ff5f5d0595f9783b623fc865b70a22ed4f48f3a75ffe51492e5b754f3a41b8682c6802d47894208963e7c9387ef1ed1a7443f49eda7b44ef0a7e184569acfa090877f6fc5437e1a0bd9baa8dd2f94c4cae736c16a8427db96ce1cc0d877124f21fe999fbad473437dbe5dcc457a2d90a3a51daad3dc6742ee22120f60810b199df477c41085480a54b30e08a71610bc9c469c0d10f89b0b5e6a6879d702e3896c32c1e6ae9e26f7f9817563eb4c67d01b915af10820ecbf5070c9062340c124f67d1e0d7c673493d2f039e5fa6457558a4f005ea59c82e52bfadbbf2d84ce74a4a0364262279b6548c70396baa60ad25048355cceb3840557d146abdd153100dc61b28c482882f6c4d07a7f145aa8cfd544a2f46bae1aa83cbdb3d21c3d1350078a3af416b012ccacd147a7f0c758d4810bef2d65d56e554285ca3dd0429ced8ee17581b4087271699311163736436abc64c310a270a594d1f332f3e26df35ed72f0c3b0a78cc6d64de81d5cfef9118ee19c6a30bc7eaed51cd94fc3b06412b4c3ba62a0147454604793feba23a69677ff0a1f0882263e92adc9761c155addd54cfec577fbf0786b02ef260975ff3ded7b2fcff02c8380fc4e8e4295ea160fb56b186c96d263ab4d2c3423d95a559055e277ed65f0292e787b9225cf934820dbcaa1b88b4c50559d101d9898656c0647d16d07f891899fadc16fa037a543a9bed82539d3ae491fc15b05c4c51b852849a489a02665274cf29c81425c84ab02e5101d80fe9cb06250698768ede1437ec1f868365e0f74cefd79817cacd5e0d4d50ef4fe6a8c18b5d0c80cd5815b19724729633b2de5148e04f4bacfa70d779815213632b5e0f482a8f3209b1ded999b5fd4053f147a6912cf8ac7abe99ff1b51bf36bae5f5fe6617f774d3a221d26526264e8b28053f4e5a39822a1d301c1c45ff20fc1c54d40da9ac0fd332c6e524ff57868261ff64a8f37c9463201e77a3e57a99d2d863d9646a16cbb069b55afec9f7b2e1a31d5dc77e28abcece4958d9ba9969e4220a5794e19d6f124fd6791a0a6e984ff74771d283a58f122f9a06e64bc257d9013194c496aac5a3ed1189a14d2301756365e9f18b5a08d84bf9cbf1205e2d597ec0d91d12a393084a4fd4ba1780b4faf25f0d4e1db1dec82b4fed22c2d6b10ea09f6ec7dcf2a2ec6e76a08ef2ec7b88a91d250ec111d889d682b5a2b890ac9d6fb79be97cfdbaf56270364565cf1cc49288795cffe2c0c4547c6b998af6e5b1f3eea8ac7b2ea2cb2d23de06f9926058b486515e608d5c20ae23572fc16f26f0352ddc3760ec2417d779e0f9349b0fec1700f43c6b787546eb61c18ae46235023c5d81b3b39e068169598347a153f127c4dfab1fa90cd2dd131df0d57b39db901064dd47fdae11b0eaaa1018c522cdb2c209be2fa0b13d8e2f3f2d360f5be042ba2c381cc4830d4d6256cf932a716d3419687593dad07c0145aec0d527300cbf419bdc599385c2ffda4408e157a69756d2e31774dfcf58dd6054f1db4b2027b0ad9b1027ef1cf86f585c0329d42b14c0f461eef9351899cb851808700393f8bc07131bae62b07645e78607942a66ac1987cc404b66110772bee24cbbd8f1488c56ea461573a905288caa5e4ae0c1260a940b5691fa24697b129a06e551a2dfc7a20ad985ab6f6dc051b04e727ea24c3a210678f477b8898d8a297e15f70e8516f35a1c25906a76b63d8020358c73e45239a5ee9c67342d512c75fc74509e022152c2561eac03e7b258031cba939bb7f9e1d0ffb051021e6e0267c82ae6b81d8fc62ad19787a08a5bab1f892a1b828dd8236ff458be89248d14e7295e41c69f09587ad3b9a7ab255a3dbdb1acaa902e96066a15be3531065668de6939e72e51360f9aa5ab968a815617c6da69ca2d61dc92a9aa073e628e700832cee2625af8bff3738f96dca766f83f204d8802c1ef52d014fb5e61848284fccda1813ab05f4b0cebd8a2ff689ce8bfb55232dab4a19fc79450e927ffab394a952940f59a4d8363ebcaf68937eacd9f6b308fdb6e3d6c800ff0d0173cd138fc74b0451d7e890eff5cabbb027b1950e52c31c68c588b60016e243cbaa1bc291a517cb839c6dc96e824c418f09bf1189bdf9b0076d85524549a3455969733b2aa13d6c2d2d90ec0272d5d36dd013acec86cb7641f57615f817a68423587007eb6a4068b6f1fe736c35dbe3d5014bc1975bacd1b113e78ba8ef5072c1fd7e93345eb543a98002fa0c49e2e54d23c3fa2a9b3254cd4f362dd85f55b3adaf1b77a60d008f7d6e4ada533d7f7a3eae18a106c3e0620eee0e76f6d61aa95f03b32fa0e3b69ecaf332aee17f05f53206b660cc643babfe96bcf194f203d64e91f215c5714c03ead556e2378d0af8cfc439b3ec0ab87504dfee182321c5cd04b034d474343551858b341eb5e612e7507cff14d615cb6fba000e6521e3c4f01a0517f64dbb170a037b36beed28a2637c87830e2b23f8eea6cd9a7331c685d1e6f707d5b264459fed2beb3d5db33ddf9c7a61fa4b93c594238f0e9cb3288cf4f41c80fd32ce5575bb13de24882449ce48dc2873c803c5d2e8daf77c26b85edbe9dc1ff74f67db4df5d96c0eecea6ab20a13230510f25e4d4f27d18c1cc45ff900bc314e78bf2b6b15d331570c73f52d48b60e28c6ce1345cefc293705fb14df0133615d4f42ea6fa397aa97575f8d929d4b26595a15695ef0ce7b1762bb11f043e82cbe23717cce17ad544a6e1ba874603928013b66e51b5d2523a7c382ebcf4130ffeba5e976f8fa7abadab126ba653a067fdaeb10fafd5c86cf6298f0e6de91b4675047095d82b4863ad2b10f47c7a3499a20f9c23f677779dac26373b7a0bdc8dfa6776f850dee5670ccfe43e52e1469038de7e916fc5654e261a389b2b81e04d538b77aa1dd0071e923e95306fb05eb386c2604162e41ce52aae9b18c774afef49197b92872835f006202bb11d10046c5664491b16ff24cc818a6799980bcfd9a4b98b98d80ff845321fafaba229c1236e6c4107d53c0369f355a405e46fca752c12ada456acd785dce1280547221c3e978151ede5c3432647b75a46f4c7282aa9cdeb9e4b285a18cd0e9ea754239e26994b7fb58fbd6b6a +0xa4d92c826cfae13d7a80653023254365415825a6fa9810dba593ec73f6560e0bc87fa9e5eef2e23076ad5214605be3d9 +46960 +0x44abc5349f6d499111b5d019672f2de1accb5c8b4959c0787155b03abc04324812c006f6cb8fe7a414fb0d35951ef6c351fd6690cd17ad40743d28463aa30a9d80385cb8373343bb49ee82eb34f83f63f8660a0a34691bc18c26dbe14dc1a7e454bbd0622c7fe640763736248ee4912b6bae4fdfc778946380b8d2f13f868f8757f369dcf09b5799647e31c6e90b7382717e3ef8ce6c9f8e1a9c145f56194cec51852f0ecbb01e30db6a7cba8e956dd0d17edd3d916dc5aa207aa914dba3667d0a1c2ae107e6c46ba3a31ee9c5a9077e5455369657a18c1f5bf99af7154b63a0495e633beb64d0b483d21f3ad66fcaf2c2ab51ec6a337f5693c2eeef4e3acdbfd8f3e106be53ca72449f889408103d95e32a3425104923b5907dade6cc972b417d84ac28c9da3a0caeb160e1a4b4e9cf7e78e92b920c02a519d1e0c3d98b068e01b9cd8b5422a9ec89b1af08f28254095d3d78e438a3a38ff8668e6ebb3ee50e2b394b15a6539f799d467df13aa308a94622e73a49368ed9f3e5bfcebad75029c5ad2eb00994a21bb219d384c43f8d1902ce40140fef4cedd3f67bcd207fcf4795bc7f43c30d3c3a8fd1b8a9d77d69bf59eb8b59d0f464315f40cb52335debd0650f45b51de7f43efd173548bd852605121ecef3d56d5e0f616cb6463d9a2b2cfb4d88f05f4a5290c4935149bc804b52f71113c96683c3ee9f21458f845d18c31f1f50dbd15ddf96acec14941d96610dce6c61c3ca5d1935e3087f1651cf38fd9b2da65ebb4922b97dcb861128eeefa060d6c1c94b25eb4ef3c96cc3eb171643361e91616435a461fed7b0a924b17d7275f839c32f00bea0970b147f9c5f37fbb79b1acc154aebf7f8b999425b0694ebd57ad499bf181c9399768030aacc258fe74b488716b081e1331849c51316bb734703973443958c8fc0b3b7bf5e8867658ed7237baf8eee89779dc91b95087a72943b8c7a039f97fcd36ac11500bb85e774e6b38e280cb8558cf0202a2905595084ccba54465cc3429b42a718d88c077b602101a9c85469af39b856dc1635e175df5b29aa56f79bc9e0e470b22d24768b1b2f14b5d88b88fe479d7418a6bf994a6d93e2657996a4fa69f824ca49ab5a7e6ebaf498a0dc9eaa7f4981c51fcc0935f619ec6bf862683b0025cc48724839bc1e67aa3c686d321ba66185cdca83ba9f41984fa61b826ef56b136e13f1239dadf6e03d877866ccb887908917ef0d33f117b614fd291e3e91736b15150e650db9bdcdb56317f0f5ebe97c938bd691fc91401b42576c606175e0d5c635103612483ad51bb78f33331c93cdae11c6389ee98470e19e2a6e5e0b7af88b5b41bd33c236a1766b265611b14e2cdf91092aa05fab5dfab9ac70bdba097d6b6fe723f88f79d9ce6625811413e24130f3e58e8a5d7c8993903a8f07e9540b6f5a4b8fe917cb242b92d4dec6aa17b3a81fa38ce54ac09db70b1bf2c302244b9d02b52a8fc2f42a96d67a92aedeb52a4ffe8a4e388e3f406b1299c3796c41e5ff506c1c71f9bb94161a60c8541883502e76e4f90b91c11bb98dfa27b18f73809d2cba8c1722ea0ab446cfa641be4aca4c70f7b8e7ba0ed6a8648748f4d382c47d7fe5a20aa7473377430d54fc3ad243b2d50db15273ed18407f884ec9a0355ba92f3688d1ee9bb867f762fb0df2e361668b6c0cd62428898ac64561b95e55ea2926f563f461ad408c4b18c3fd5045cc727c5cf2fb3385d28d2205a74b75aa1c034a6a5efc664774ef2776d353babf2ddd8e278b4809cd9b5279124b074dfc964185dd9e70672ffc9774c354979a1b2cb0ab14fe450ec78bdfb5b273754e1303ebbe954ed8cb2e7f8c18486d52571f70f2ba6a747aaa3d4b3ebc2e481ee1b70907dddb94bdfa0ca6d7fd4d470b5994a2aba372147046f5837778cef1896caf509fc9f798a55c91187f0919094a084169e44e7407ae48b9da90cfd9963e59c481ba6c31831b59857d8c26f6dc97ccf06ea4a3b774bc1a4ff893ab9961c60ebe4461add07da459af7f073b2ae87b0d6759f38a858423227f8687f35478a8f565409b741eadcac4d8c4f730fe547d336fd1d9eb245e6aca132c758f53036c74801e70a9613c1402c8f464edba4926a6d07e5faedd2c1979d1916466de2b9bf5d985e835e2520a7b47b85659a6eefcce52098cbbf813b996835e5c623c17bcdf361e0cfee91535971db8d65e0a6c8914bd1a69fabd3dd18bef3a666ab7f1579a6091e3edbeb01cbf119bebe32dea55ded858fc5374d2e9bfdece886795def48e1f8575eaa8494859ed099ed15891e6956c6c4faf64f9899a17c2cc3f1f081c233aa3cbdef0093fcf77acf60ed389c6a241fd6af4d6db3a8464bd3adb9d9756c17b92ecafdf178b877829fb83e6f97d6b1fb4530c12a083e58b67d92357b32bd0a8fae047bb9cb3ebb72bb518d909915ace3914dd606fed255569b1ff948222b88a85b08cccbf4061fe582db6f3e38cd61533b5510870ffac8a6bca589e2fc3e1e9d963685ca9b95313586a437dacf646be4b3c4f51cd41e3f2142d14bbe096b38d9e01c2b181a628bfd474a8bf8f55148f28b3be85ab3b30540de11d34be24973d7d938114709048ca7454ce01b233a751732188ea3576fc7afdee5951f0f4f3c31d208fcd9efe1bfcdf119c8b3d1767cbd38f94c89079b02a8d5db2599e8e30e528b0d3243278091dbeb3f9a4598abcc7f104ca69e7ccb22d65350f96f27bb76c434c356154867af4b843cf962e130e0b7488121460f86c4b2c7e574e1242ef1f18fa9dcb2eb1d64a76c705a7e33ac561052354102384444b8b4074ca266b3fc84fc4f3abe58085e79f4a8320a087498f4cde78a659f8a4f729844d52577f112d90b21f49a47cef93dcd131498f83035df0c0661e2addf315af51ca2dcc05cc1882cb0aed912b7c16d566f769d5b559959ad207c0bdb9996ec4b0d3a5af85d74fcd179adfd41795373110bdc99da5b4fdf11b41d33b17feca11a8500025879c9a1a9eb86696c8a0bf99d86bb20ddc7d5f9ea3fda1cb7c8af13d412987589482c311694dccffc50777b4c4e96a4de11a81487224709672a5aaf18347827033f190597f3f57369630242bdf1f39863cf52b98919c89c480b7bed577903994ed51cb9be8785064c38591a52ef569e076742735074f347c2f28f69024edf3ed490b3a7eaddeffb0d46c85cbbb54418216013cc9dc23b9e6056018cb9346faa3cf85a6abd55bab43524fc7458d220895a40331f918025f2b8cc7ec2dca8494dd0728d6c968d69d44c59520baac490740a9e2cf6fc4d36f734cc53c5fd38d0ac37a5c94816f361edcb3a658d221af86acac05ded3e87e31e5ccc3ce08b64ba47faf8aa67bf0657433a6ea3736f33ecc0035d626cc8aeaedaa94276bd179a5a9362e18d55ef64ae77025c9858e2adc2365ccbc6e03b401ebe92c5bdb62268263138070e9d286cdc1bcb9ab0981cf73d103fa1f80206daa72cb1dc5e662c4cc183b2cf8aa81aad6483ee8f88cb8e8ea1f01466722cabecdcc78edcf547a5c6a11d9ba1ae010694dc61f3d18d6db8029558839fd1da9ad533f1727e0ec51f5449613b33d522acc1a81863d73af919c18bbbf59473866452214d1505f77909742ee119ec8c975d926c29c7271df82469f99cf31ae3da98b2393cdf2b6bede4a4c63fc03250d999a57d088637b2d5785a636df469bf219893e0334944c86e4174a3bfc6abbe63f1796f57398f762b86215db182274215f465cae2dbf899a490524bf385cf21c0f57cc77859a4f464ce3d4d0a24ca29023ca63dae1fad5c1b61dc237d9603276b062df9fe5f0e9a1bc13cb5da44c8e080c1e3dd077cd98c2d3660ceb06ffe3bdcb40b9b5bc222f3baff7e3ca46ab9f50c249d0d818c03a6647e8eb22e8c06db907fa400131b987dcce99025eb2f03c32ee530639ec5c2375bbab4526a72b39320d965eca6d3c5b4bc10011620da3cf743845c53d1a28bcb7d6b8043d6ac8adf0841ffa5a983312512f34f91e824cbfdf4726f72acbad6bf341160eb0592032ba159afbf7d92614b6c13ea0da3674743bc4fe8349267199f3a3cd4dc79eba315a68114bea589ec9421e25f0de54a2565056d551e254feaf7da5e6a7c95e1e1096248bd17b3e2399bceef1d071025fcde5a6b4493d7cdc135aef680600c4d53937f11175f1b33beceedbaa27dd683241c45ba253a1c7912f52285b51b2f566120579aa1f96de702a9e8b59df68b0a31ab31ea857585da76a2cf8c770281c5905c7615eb7b0e849bb95a606df5bff3ac07b97cd3da865a62bb209b54aaa5f37784754352588f84e079bd5b70ffe80809be46d19edda0714dcaa002cc97fe687d54bf838516637087778c076579858fc13b549944f356d7be4dd8835d4f1dad1839cf56e2491cdfe71f30e4a9f73b23791b8d2474c03bc62ab1347d75346639eea02f4e08453e1b85ed5673ccfd5b4b77bb3b139ca8a1f529913e51a2fc7a87472449d945af29bbfa7e67552cf0786063b6f8d72b214bcd216a70b064ebcd2de832c97948fb7249ab2eedd96875151ac37b40ffbede7bb6a8a9561a4996d086185808be809eaa4d1e9b54a10e0fa3d2fd949dfdb624b45a25da68efbf8217387e0092096b2d342edb30262c7c04c711988f8a41af88a8203f7a23b1354223bd7fc8fffa871ba2775779fcdc3118d16f1ab8706c199eb9914c0510ff593b687d942dacf252de67bf19f52340cb9065340acbfafd72cb5b25d217bb3a89f267f1618b13916d0a065ea92e43faba2ff518df26844649831f76780e7ce345eba4d15e7dde58241300de7b81d95a7b2bf3760e54a7071c7a78eb9465e09a2bab9165e18277a7168de9c7079c4df08d3902e41ed2cd904a05e9fdcdca80cf99a6d057a1154a1ec2df23a0d3da3c4d6ecb85eb972d827280ba05356a88d7e41e51c3ff03c2f01f978b30e476c80ed1ae480ee4fdc1403e2f0b3d1b114d50783850fef48007f43a3316a41a56e2401dca530078c93a9153c37e04274874750c6618e3b0bc40b0eef405ffab0ab57a9221610d0f7ff5f043dc96fce2869ac011261e04bc0f29c0be78dda62ee8ce08df61f68721889fd78ed8ca89c5421ccc26f6d4f48eff1fae1920123a1e97789545fa87f1477974d1b5569d3d580196f39e66d215a2129ed39f88281de29d518a766999edf9d9315927c4837a035b85d117e499fa8dc023dbb22f93e42340f562d11da0dfb11e31e886b121d26f9665df040e9115babe4b10e174fa0f4948b0b8f6a54148f5bf130a328adcd8f578b397f3236bf9a133713dbdf6af01cd1b3ff7479edfbc30423138bbd038f02d48fb7655e16f08e9e6329c9833475e471eef985458e09c093e38ee931fbaba7fadba04acc72ee5fd3d0bc810a947972fea3c36ad62087ae90986a658d7c68a750d5bbd88333ff343ae693aa7c7142ee003c23ca3489bdb583a96fa6d870102a5ee6d2b58b3f6c355c0e78ede2b51981fd20e24d68b3f3fbf58065551abee957ad76ab89ec807d8cc0ae31f2434746537fb7c89c798471ab6e8414195c4e3c57c4ee10fdaedd795eef308760a70f118b0d699c5f6fe67eeb741d449ba50850522bb4c7b8da3daad66ffa42e016f5c251309e283d52c064e391b3bc83fdd46f6f6b329863788a5619ca762a1999e1a0cf6ebe32df2bf969bd4cae45786c9adfd60bcf4da68eabc652870a06b437bbf42a523183ed017bd69e2d77a722fb42e9b093f2ac28268842a72f20a058f96b068d615fe30edd2df3b0bd74aa2ab1b4d5258c057f9247091140491fbeaee5d91e1e25b119eac6f7071b830e153897d8eb5c7d6f8c8bfa167d465d6f295d06ee8405258def2ac4c15c0708adb2f3b396737eee989cbc4697cce1f478a90e61907f6be95c2b76df73389bd2ba47040fd7b4b267e876cd3374473895a1066900a85978fa87967520f6e4ff6b9b9d12b381f72171c7e465c9953674c8540715ea1f5853df74f8d08e30a85c5bba7cc6a57e84f2939dac2c11e2e1bc15f975bb27dbc525208d192f320acbda287eacc8efb4a34e56d297cc12448f3905f61802c0c6e8154639c038126c97a05c4ef4bf990d9c5d41ce6dead4a18a131fb4b893bcc7084cd8dfb796383f52d77e941d54a970b646dcf9f63160e31871eb9b1d1523c56ef15ee9c4efac6945a617b7f02e29c43a32afbcf946bdf0827bf2140e31fdaa632d60beb0ec74d4b836ae1f32f620f37048437d40d4f3b2105bbb85558f535d2d2867c642349a66f2aecb34ae5397e4a0b11fa591810b0f0936cf57b8d62cc61409fa69447026093d37f75d2bee957f1294cb9db5f50cf1b737b4f300af91cd62f9a20f7c471ea4dff9b805706e22ac0e1ad0cc74d9fe3f6083f4bff5c1895a5d1fe620b4628c1f211b9991467c4653db6bb59995d5eae14d4517255eb51c554fa44e04b26877624bc61f6a75c00a5cc2ae026ee290d7bec6a3a38c043252a67eaf62233f02e854a521d4f8c5e175af0b0c40b221b3cdc012c5225cb0e134353369abe622d8e6df77553fa3fe889035feacf6cc1be5d4ce7bd41bfc2869c9eab5f9b0b3259179ea0889e8d4e75c62d4e2b7ac2698cff5d047f817d634741aae4e88f9f30ed5a95ea1e658f14906f3750154ea27601937afbf589d519ea72d67443e0f0fa64e7f218a941664ec2d4b01a1ac39373a6aa3512b1d35d52dac0cffe042796db5a2021c0bbaaa93987a735e0be620beef6a3f9fd36e67caa82bbf5c6abdbf7703793b376c809de815947276872b282448c21581fe74bc99d8cb4c682ad66a94577c305bf40f76c92a25502f5ca3d7d20a1a2de0f657bba88535bd0967b6012b7a52eb6eec8fbda0a1d21573d475b82e00198da2013eed6076111a296b840ca635a474599c28fbd44045ca2935ca50a1f1683fb16851d829750669af7c69146c4e1ad1054c00b6cdd0267739c8c92994a4af4bf373ba066c48bcb483e38da0e58d5b0c59444279f3181c228ad59bca6de295b752699eff8fb8dc028de8173879bc102d3ccb14c9aee2d0d506a467bb9673c28db5942849fc8d0e5cb5d2306490a1e03a982b9e3066f4ea97947c5685751fdfd5033a7d6e198ff9c9e3ebffad9206743d54aa0935831711711ca790af74ae949526a4c8f650864651ff79ad9ae7b1733d58917d616d13ed69876b3cc1f9e788d7051a2f6708399cfcf1c561b4f76a86438c28213a8cb0278abb1182436e9364a288e3da4ba871a4d3a11744812bfb5556d8b61e4a49b667d9a1e08bbe3a7acfff9749f2299af606ddf7b77e8be92b877e24859c190aec546021227fbac56472f41a929f8a45906922dcec365a9ac1c5c358dbc22d381b9726241d86bd7719f48cf90708f5110775ab36ff9474a786b62e5c01b8103c0bd833901bc651b860ffcc1cf056f26622d37fef38c163764203c6183fa74a7c84be904f626afdf00338be6c95b009acaa2ba6eddfe5af71bc539474dcb761624ef144473a984a87c84969cf3d3fc34b6824291a3c27deffbe4f9e59220fdf55301a5762ed78bee578dad52e322ba7ab21670f5c97b07a870e9feead57d84cbcf4e1d286c234e372db920b72ba9b3e35a09c609d37a80b7375ea8c5ac4392e0160edbc9d00f14197b81a12811eb70e4fac6a25c46536172abbd87e46b15b0f8b3de71d8ef0da5ebad819f245a6a9a1620c7965b969822814a812ce5b656576c25276fd41da14c4450438b4a599967fd7897228648bb5c5990440847f2a80ec0e6943659e06cafb9e021f5f8841a92e14ebfd76ad13f77721960aa69c46d4f8d748f55c8dbb22892f9a75fbd8e4073883fac1587c486fc41427163e9902882285b835ebf64244f85e96e3917ccbdb258b7d67d5b9734637da7f0f535ea6c5f28081ab19c1e359d095bd10275c3e4b7b933e96f64cdca355db669beed37ab2f1316bfeeed6e689973bd6a5c860847fc40503f7c21dcbafa880a46216e0c678a6fe3ed7721d93fbd7b7aa497970e7a08748953241148892b72f000dd36dd13e9950c1ddae7f32d8177301a54474add64dc4bcee7b1a5a730a5144442d62e42d5390bdb9a9e20a47e0d6a26030541f489de13fd379158b7a2a4f36ae2da7476d5b24fb126b306471b948572345f8851fff07e88a42ef61d19e8f9ff4da24422539764091fd4f887e2a31e6968c482782fb9e7dbbde8e259dee7b46be3dc21d7d76ec57de6629be95bbfa18600c2d4c9a1a0ec70e56dc1e09a37af5b35c671f9e99f007a0aea44ede +0x7fcf34ae19d002775dc86151d66094e11a187478577687c4ae76ce6e2c8666036d095c3a93c1b4332f6967a65f699f0a +47752 +0xa54714c1e89bfe9406c536069c79f18d1ef2d055d3e305d921b1b8b10bdfa9aaf8ca161cb696df78be68e821bad5bf7d449b7f4bf18ff4378ed7ffaba9593ce95473e35725edec19812c77e51aa86a13b7a05cf4340cb265c9d307a48f3ed2623fac42193d886d9fd679aafcc6d83b79fe6730f9a440878c5a0b9842c374b13d43ddfd0a074faa3246b74a0bc64f7ad4a15ac2014914bdd4cae97a2d4fe521a3e86cdad38a2beaf8584e1fbd20f36f4f29dfdcb52c709b64a0d3740e3a776cbcb5c2a21ccf02771c94a6f1b7deae620f1d6044bd543d68656433508d8d14d9af32471c8cdcbe97c4822788a408679a3f0544c3c0c9616dfe9f70d4514fa3afa5e76312ccbb459319ab3aac2aa40660056af3216794c6f258d8f2c903880c37c55d7f4a847481b342964524f1bc72fc89d2d52659bc523e9a9721f64a4137b9381b018e5b0d583e67cbb2b9a25795b6f4c8529a3e49ef9bed646525cf810c7c25a953a4f990b47eb2d3e733e57e56d56ed1d244c044844f79c8261c3a5073cab590db5407047cb949354e5a61389da31e77bded85b4f9a3654acca432b654e90f5703682d72983854794df5bf8d52662d417b5d35a136dfda73bf855fbc97225d8632a612e1ef43fc284ecea6855e67c3b7745c7913224bffc967876a6924bdc4a6cfd85f596b2168c9b8abbf29a7ee066210b2f913a72ffdd62d72fbc6e3026e3e44c4bbe3f31cc2e4f355b280164321c9b8265ca8acd2fb22770db9d9bc3983d6f833cf85707a2f016794269293ad3a75d2824adb1a7d2233ae214dac98a92af653ec4349c884d9a97c2fc46807757aecc88c6db3d7789a933b765e475d9b8c27bdb9be37e482e8639af0330958e408b8000d6a38cc0b8aca84d495b0f557d1f09e60e856acbc84b8299d1b7d70400d60e4ccec72e17e1a5ef3039af1462520da5eaa6aae0879d32f91ff26cd35d1b06dda93996aff1874d9efca14123a4da16c655fec47e10300503adefa0091e11a664c2819270c22bdc3dff3ac19b8167e2e1c47152a1da031a38c023f1e6bb672d3a15415b1f1e420a22d440910a7cadca8e9298e5ea6998fb1f0329e30aa99e13d41df351197a6c3004086d4fef1afe66335cffeeb62364101cc38be3d38d28f2b9491204ee5b0ce648080b4ec7d0dc1e669ff0eda3bbe6f1b89da494dfca9a32502327f70c2496a5755fc52e1332e98b9eb826632187b438890e1e469de6645b3f389f98018bbbf6027c055e5fb5991652520adfbe0b3e3cf48143997c6509f5ecf5f3784ce4cf4075e966600bdd5d4717da08c3d7daf7778183df0e19cb0d6adfe7ce087cc4531d462442d3b61eb8a655dccaa01d6b7280c6a22b14f48ce1529e8a89d8efaeea0509c92519dcfe3dbca2c6ab04ed3121d12a58d23e8b3f28258f5ab16a3408e6602724a7b2ff005ee265243452d5c0a80123044eeb4c36445c48e4cf2cd866eae724d3252f8aa98ec04371f12a559e57694750fbbbb616b87f51954da15b4d79e2996147f00e6e6fce943c6bebeb2ec2921dbb8320676517072008c7581b20f5eaeb3b6a94f8d35475fdefff2805067c140ca05fa9ce85c27c3a9b96c1c685e17890ee079ee85cef5ed709356f4199e657aaac0bc85a1d5d5707ea666ebbe0ef1430d5c96e4b8f92d1c614b9121f6d83e56e4af1fca8704a101e51a0cf89d6613631af1aa390cfe177219ed4c10cf5f745cde9bcc728430b4ff48dc064aebada6719c665af56b24dc7900412ec78d792e14014b6a857fa235f20eb5fbe9922cd1f6fb845021bcb4a4b97e11e050166f9407b589a20c5fa34d609f6d93de782bbd799e1334c5e7f696b9fc2309b35489d0bc631b1c0d0e7924d363cc773087f19182efdbade7d332db01e04052f62e0e07bb71ca7f93736ce1d2c29a4fe7a5c8769955a364916ab09a19943063238b48648d495e73a376c6ade6249ec20cbcf69447383501ca93b7fc8a7ebbe341557d0cb9519fa247ffcdaf95f1a179a5b3c4121300572b9b369129da08a97b5973f62ac7f355b186f6cb106a916b1cbd727a198616d28a0a3c84489499c1d272cdfbe44096474b694306f7ea6cc45259e160d026e06dc7228bd9823d98cc91944bd362aba13e16f6cfc78d9fea74c383e8be607ec7f28ae80cd8fe5f6f935fc7d5c8cd907e02ba378055f910744218426fdbf01334277a66a7c8e58185dbe51453204d77945be0343ffa64c570f7f99f5e00a96f8dd640a345f35e2c426fca82ad2409e94b1130f4f5fcf647485b0da09d75b3193bc584a7cc9f92e70e16b71acb1c2a6d0beb517f88a4d61d6236fd5014823599a7bded7b2615a83a519754e39550d78c3cb2ecdde23a2dcf285070b4ac6f577838852326399dc9ad73bb48e5f40739cd462ea817e90622e600710fd64b83433d55e7cfb0ef7e1dc9dc4a3c28ce8b78b892272e33874fdee9546082bdda071e7068a999222e02cb15f50cd7b50d22bbd58665253ca35f89608be6707142431399d8942883e06ffc1a24c8c29397152aad8baf3637247c4ad30dcb82fb697f47410d7025dbec0ed75ed248a4ca56acefc70acf092ef4ef49cb42d75f623903e5ef6f0537323a27856b68522663302e2fab698b4528fa00afd092d1afae9916132c661a0791b2022dc94caff0650fe515e212ac922e1ef6a46865831ce77002f97f5a793cff3ce6f8fee827a9d8da17c6f36bfa9a47481b4f1d23b34c16a80dc170b3e87f85c01d0e94a381f9c4790d6d66de3c027b60b5d976342ae74328809087d930782a26ed9613e4878a32d30f30c4d13c75d24e0d69fb00b09674d8a3914d3419cef6569fb80115ff0129d2643794aec09955fa6b2835f00d01b3a0bde9492c6a2af1387a9ee89db209b25d56ab5edc91160b4d163eab6a08cf076818c3042aed3324b5c86d4fe46848d45c2bb4abc37795fd2d58d2e5d76aa87918fa450494689296b3cf50bf52e86697b82c7901cb39be3183770c6ca0fb360f98ac97d3d4a4ee4f1bd96dbf4ffc0c0357a123eb5ca138b138bc15c72b831ed3d076e2f95069f058d62cecd7436ae22122d2d9eede75ac85326f157ee2ca0bcda99f4efc727e40b8cb10f68f96fb8ff80106c494b97ec1b35bd8331a2c97a30409710266a1ad8577e1cfb370b077bc90dd870c64558420459a3f982270b48e80da3227be44bc679e02b04a01f9a610f29c9bd8e61b4f7042d6eb6c1e18e77549022be48dc574903415fae3cada503425288b50a371a65ab3f925d6978bf900686ba4625a8b9da54101f6a854b93ccf31679f9e22c052869fea35fe1431b2d6e4fbe4c8adfeff51ceb0ecbf26ff338a1f431ee7eb711c9b0e91630d1d72d9a0c59c353f0e86613ae1092350c915fd0df6a3525687eac94209d6f72b3ab638051335ddef068b8d0885f4e584c36162ffbe6e81107d95242296a1387ff46595aed7ad25ff1c754964bf5978829e4d2a08808ef44055d9f4e4c0da6f32d2e7b94219ee5598d9ac5ef699202573e1401cd143eaf30c981d002f8c69e46b5da46c6adfdfb5e1c49894651a32347f15a201020f6ac59ccdcb11ac0436df531b0575ce33688d0365a2b2594a75edcdc1daa143ecf6b4197c4aef022f2aa81296709e151c7124254430827c32d298866d52c43ae37606ab2e0262da152b86cf564eade8a3e2c370eaacca73d9317cd1a2713292fbd20479695b32dcbf22c3b3e1086beecea3b20cde7c53e9487be2d7e69fb2f13df2f6acb8bd26af34f8a5e5c104a0d0a79d3920a80ae584859612c0c4440e00afbf246ba09008fc7c93758d7eac143536b6a0d4d1bc48ec9a6c54b3c1c80c665b1fd5dfab3c9e6aa0dd7ad59e678ec682d72e51e0fc43ca8ee4f0d8679475cb49fb53306029b1a2a7bdfee3ab9cd82b93e92cbf5d319fc66ae52d583d0e10d9803ce48547bf084b991a47df2db5b80b71d2e246d0c224873559555bcb9fa73608c8d106e9676d0e7fde9ef2aa19f70e257c980cc2199ab6f727ae089aaf008ae98962ddcd87a69360f04b44ac305dddb6cd963cbb9dc9fab937818831a7e57e2b66de2f7c897c81443896fcba62b1202caf23fc41b679fc8271150318ed1cb9d7468f277cd3b781339ec7425d17bd7e8f098974decc71645abdb4a0d8eb6de4f513bbea57cf1f3a360a25401bb747a0e8c20ece19477ad94903a487f808a2a78bb4aba394e37b555464f91b7faa182e3ec4fb2f7a905c03582b2ee100ab81a9a311a778bc79957996948bfe0e58f8cf9af698c18a0ddf8b8e1d9ad6793ed4934412f69156f8334f0282230f522aae2b03402cacd027ca19f4c1308dea28610c779fe217eac81e7ea3170976d28604eb818a0118d546e75490ff382fdbd1f1bd43a0b13201511eaf7e39845c16d5c0b71cbc5d2c1fd3fce56cc0f9e3d4a14b4eb0fdac0922fafb8a9dd1dee9a780ab36ddbf89103834d27390eabcd25e003966c69e1bc5d52d7cb607c85d440ced8d11cb79cdeda8d331a70267c923005681ad8e6b468da2526adcc4044a96cd862ef0efd370ebf517e129cc1d68ff430beccd0f4d748a12cf8da3dd6fed0673b255794fb5bc31a967a9a0f6f6e18eae87426b512aefe4ac0dadb459f08dbd85d8cc57f508f7e84b2d52b586d97bf7c9324b325decfdc2f87492b6406e73e28b625930e9b26a3764d0a50f86ad7f631c75cec73a79e74c7f6d03529ad3e89e0db7c5ad319d5d477bb86757fd5c35f930b695d5f0bbf5acc85eca3070063219943fd775d7af173f184d6334f4cde5e28c5e660288986e075cb0adf7c9ef997aa7625931e3d2e248c4f6604f72e8d745b8d60af609fa9c88c1cc7550ae7667eacf8811885bed048a051e254f7f95534b3d85495a7bc8c5548118eae22683e2909319c92349e8c62c662a7bdd23bca01ca2d2ead6e7ea329624fed35639fe54957b7d47a9b4ab70576c832aa1674507df6f27b71154472b7430e5f953efcf03200f1c54c3a51d4a32a191fa425218d0bd2deb76b4cac9f7162f35258251de385ad85fb71923289ce68cbcb369ed1e43dd6385f0665157e0a5a8551d8a66133a6a5dac3a5236b3ad9ab56d1cbd3f3da768995fedd0f2d92c4924afa91537575379266ca316e6a7c677a50afee7505e468557e0359ab43824292aaa93c8ca90c9afbc08bb0f3cea2fa5e3fd218e286a665d26708f6ba05a106e42aea24d29a8e533a6e64ae33f65304bf7ac4d5bd04750178d77c4ebbc28383ff4239d4c5c85ef2e6c70183af80011916a814af54fdf4cdc155d9dc3128ae3c5c9724d6c69112fc7970decbd6da419a0c3e2df06ad18a1d4448bdf9baa695b2848017a565a32ec27ae248f13a83791a08a39d633f2dc9926a567551a8aabe68ffa39ebb237d27075391fcae5b1a2c1b948edf52627127afbbd5ac6e9bc3acd2265826a2706d801dac16563db8ecef1118366058754a28d7a16cdf9b048fc580b1345bd5dd12ce87ecd5e229c49a269d3c60ccdfd7f731acc3726b71634dbce6f8ce8adfd9fb66d88e572d1d1ea05702596471731b26f6918a8cfc8c38abe797956d502af795ed7219109362177e1502f7d7fa9cbf47dc187f22ef460528c9f4efb72841a660c70705a8b1b35fa1d4f1a021c4c724e856c419cad0395922f89190329fbe76ea87e9ec76046b47aa1b60eae86c8cec670b06d2eb2bc09548e7f00f4612ebd991a4ad261f07f470055cd320725e5886724d63330a7e8659f91c82b5881e645f04a1c35aea490969321dbaf97626b48368a25bc2bf34f507c20aec3b6f3eb277a203cef38e240483bed2aade6a321b53d8ae730a7feb973f12377f0971e050a3f85f1278713560600a100537a51d078830d62b72a30ee7509826cd9826afc96485f840521a09b77eb25a6c9ddd5403910f9e0773ef1b500c925d5a7ff3f97749c983db290efd744036164389795399fed38a79b6aa9d8b93bf5fa8196059f4c431664565c6ad114513d81c82efb835221b0ff4937c01d4a66d82290d024ddc546c341180b785390dba247a02c6ee5fbb44b32a92b9e4d5b52b797fc34041688ac851c2127802360ab76fce919552942afef87e5d0ab3093087b9fec4b0e153d7d463c9938ec0a2bc9a3e9ca7b1a15ce19864522ae508d9b8f0a83889ba8a18bc2edeaa7c423d0993b0f566cdc247248faf7b58b4bf32d1aef4e8bfaae3b811a82626e73558d3d530ba48af6c3db07575a2a1f4531fed9b9312efe670c307e93c58d1026729219014148cf91b9a79ea44207cb7be8d757205c9126fa3bed609e935618e8a49a2b4be3e56b6545f0fdd6b9760053f6e86ff6786149d8c5dcefe2f5a5cde0710d3cd7fb62a799ef1eed96c85f07f5e597ebe48e85b02c3264f208f26278376453145090a7cb563f99368c76aa288a3d4e9291a4e5a31c08ec33b79375611402d47b5cab9c1fc3becaa05fcb3fab3a84742ba6c56969d0d1de7898dfc6d0a0d5f939a35329eb09f317f3b8cf06d82c44707fcaf6f94c7114a18a53de3d0d03642815ce9036764f66e9f63e8be8f78904ac56a6417d92275a9d318f98c35f6437cad9856aab09bea0a9729a06cb4f784d8f77e1addd84192a3a34f4163e10ebd7484b6fea70ec7e28bd307348992922a681ac2442016a700ce05d2b5f9866c2cb083435176d67b6868ff5725a38cdaf97eabb1709d18c5388f772dc7bb7aa0e9b745b7ffa8bc28e43858c3f43928346a8336d61093631eb27e73caf738523fad0f38af499b0442fe609bc810b8d930f62c28aab4b16a3607018834a4ee81babf1ec873cfec536c1f7824ce0bb1344334c00da9cd55b28d9ecf30f5814cad84c86c91b0031b3e06bff5805065a0be0daef5524ddb1eb097e21dea77fcd12a30317f10ee838608a5685f2af98f05cad2bd12a3215e7b08e789942156782a8c4f82dcc289b1db67caa11ba124186f0f44f7ce5caed7d90feefdc881fb93b7483554fc231c2e89cfd8e2b17f5a722aefc6e78f0b50d7d75a30a70168e1dfe5d283f063bf0049ff9572a5c712172cf7e0fae4bb1bb1cee46c3f2df56293ad54efae0d99f2e0a4cb7d0a72b315f4b9248733a7f92a3c3d9eba7cfb1aebab9c72c42605056b37bf6bdb12d21bd75da75f471389cf937a9454b97c86c880741dce049e7f3c84700a6f342e3c47e2bc67f6b51d128503d773a50da059a4bda7b1d52549c4b5eb2416341caf29fdc4bb7b8935b2cadfe7ed4c1e1baafc25ff90f916aaea7df7ebbe5358f938237409b572955d772b26bc269e0e67dee6d2c2ca441119e3137912c9524c5e3ba1610e54bd99a0ccac0ffd1dda1486ce9221a3de2332d6b62dc00cbf839cb03c2c3b6ef3ed048435d5e2272d90cedcfc96991f27371a75e61553261b77b893bc3c69882d61748c452143c6f0528beeeb5caf915fc0368bf572a8eb579f3e8d2e5a82065bbb583d7d26ab58e08fda310d6ceba6c28ef57d66be47e91e7a7ce124ff0b46296b2e0c405e9f5988b93857f54fc3cc09c3f5beac60a68bba8a124412a26be3f0f1746d21218645435f34a8156dde7d803fb5e448f24b6fc65e9d3a89dd2a5c5cdeb9f4a227f6b8caf24dc5f04f7247e0329472defbbcf1cc685c28fd17dd1bc7936d2745ca77006a02e216187d5597844d3feeb0e561be3727fd83dedaeaaecba01c798e917dd8bb11a03ce07fcf08f6f006ac6137d021912dffffc1aee981c395366fef05718e38aef69f0abf64f8b2cb9750826b8ec854dab1e1280c403169e3497ee9af08bd6d2b53a0d9c49e034220506f7719041f0cced1cc846b853a090ac42af0f699c2c3174606e02800952faec06dd198c692237ace3669552f083b7c44f8a764ab5ac5135c25b042034ac5c765b004935cde335f15a34941b4287bc83a6c7f71c3d20d7ff481bcab3c80beeaceea92711d3fb6ec3697a6c9ab27347f22faebc669c4e6edbdaf87dc12d375b95a71fdbaae4318b2af87f4457a611ff17d386eab039febcd0603845d0caf849396eac8e88694e342eef8c45db87278dfc7899ac837efa69e6c224496a091661a12c966831c81b10d836e996adbe7e98a9072d2865d2091e25e804b21651584ad4c726902f6b5dc82fb6de6156b1dec924698b86e19df28396bb20a75d0b87acda29a42f0ab8df033b55b3cb5cca0ec87784fbef7c487e3f4021bf51c59d6b31bc38586c4819686a05fcaffe4970d83caa42c48bc03975fb2c032bd8d870cc7f81de897073f5bfa594941b22a40a02cec38a308134d99f5e604aaa631eec723e3102816212b3ad5bf1033f5ef6025525cc4385fa6090c311e6dc851a1e792517d58c866baebdfa34223363dbc6bf99eacc570c1dcdc7abbbc6a304266080acb17463e1b3ce7a6eda310acfc19ca996c4ccad0d1302e41d0506866eaf6c67d0b61671da61fa +0xe796373a85f5a0372d9d6ec70acde59b60174d4298718ef9b3eeb0222fc6c182f04706a2014f8608592493c3e7ecca4f +48544 +0x46ce506d593c4ed53c82edeb602037e0485befbee03f7f930fe532d18ff2a3f5fd6076672c8145a1bf40dd94f7abab47c9ae71c234213d2ad1069c2dac0b0ba15257ae672b8245960ae55bd50315c0097daa3a318745788d70d14706910809ca6e396237fe4934fa46f9ce782d66606d8bd6b2d283b1160513ce9c24e9f084b97891f99d4cdefc169a029e431ca772ba1bba426fce6f01d8e286014e5acc66b799e4db62bd4783322f8a32ff78e0de3957df50ce10871f4e0680df4e8ca3960af9bc6f4efa8eb3962d18f474eb178c3265cc46b8f2ff5ab1a7449fea297dfcfabfa01f28abbb7289bb354b691b5664ec6d098af51be19947ec5ba7ebd66380d1141953ba78d4aa5401679fa7b0a44db1981f864d3535c45afe4c61183d5b0ad51fae71ca07e34240283959f7530a32c70d95a088e501c230059f333b0670825009e7e22103ef22935830df1fac8ef877f5f3426dd54f7d1128dd871ad9a7d088f94c0e8712013295b8d69ae7623b880978c2d3c6ad26dc478f8dc47f5c0adcc618665dc3dc205a9071b2f2191e16cac5bd89bb59148fc719633752303aa08e518dbc389f0a5482caaa4c507b8729a6f3edd061efb39026cecc6399f51971cf7381d605e144a5928c8c2d1ad7467b05da2f202f4f3234e1aff19a0198a28685721c3d2d52311c721e3fdcbaf30214cdc3acff8c433880e104fb63f2df7ce69a97857819ba7ac00ac8eae1969764fde8f68cf8e0916d7e0c151147d4944f99f42ae50f30e1c79a42d2b6c5188d133d3cbbf69094027b354b295ccd0f7dc5a87d73638bd98ebfb00383ca0fa69cb8dcb35a12510e5e07ad8789047d0b63841a1bb928737e8b0a0c33254f47aa8bfbe3341a09c2b76dbcefa67e30df300d34f7b8465c4f869e51b6bcfe6cf68b238359a645036bf7f63f02924e087ce7457e483b6025a859903cb484574aa3b12cf946f32127d537c33bee3141b5db96d10a148c50ae045f287210757710d6846e04b202f79e87dd9a56bc6da15f84a77a7f63935e1dee00309cd276a8e7176cb04da6bb0e9009534438732cb42d008008853d38d19beba46e61006e30f7efd1bc7c2906b024e4ff898a1b58c448d68b43c6ab63f34f85b3ac6aa4475867e51b583844cb23829f4b30f4bdd817d88e2ef3e7b4fc0a624395b05ec5e8686082b24d29fef2b0d3c29e031d5f94f504b1d3df9361eb5ffbadb242e66c39a8094cfe62f85f639f3fd65fc8ae0c74a8f4c6e1d070b9183a434c722caaa0225f8bcd68614d6f0738ed62f8484ec96077d155c08e26c46be262a73e3551698bd70d8d5610cf37c4c306eed04ba6a040a9c3e6d7e15e8acda17f477c2484cf5c56b813313927be8387b1024f995e98fc87f1029091c01424bdc2b296c2eadb7d25b3e762a2fd0c2dcd1727ddf91db97c5984305265f3695a7f5472f2d72c94d68c27914f14f82aa8dd5fe4e2348b0ca967a3f98626a091552f5d0ffa2bf10350d23c996256c01fdeffb2c2c612519869f877e4929c6e95ff15040f1485e22ed14119880232fef3b57b3848f15b1766a5552879df8f067c3e7972fcaaaea61f421fe7e6966e5aaf179818feccd7847c46c7dd40d5c70f4efca2cf5d236fe6de8cb5cd3988d37b5aeb9f7b6cbd4e41e43294bec2dc0b321320d942bbe78e4a71954bf40b3f290afc19d8881b2d87f6a65304f4865d2517d49266f39d5ed379e2472984e32338ae9e888b6892854b4ac88f61a714bedb65993a910b8bf0081c398996a44a9cc71046220042592b62e554d0f1fef569f6c46800a2b20d05f3da7c42dc7cc712a0d7ffce7f3ff989947051fdfe22b0c43ede4bcce00fac055e5cb55c4135e2ed89acce744f87f905a993c8fece3bcd397a584986944bef580f4aebbe0ef723954b37bdfdb941e10968f5c0bba970d52f74dd6a16068d5f66ce4b27508ae91373ae1fd34f05963afc9a3f411bd9e94f0ef213b7647efe8297650770faff3439ed790d18537bad8a4607185409a5cfc33dbda2375844c6e3549a27cea4b3ff1d6c76a895f162af5c4f7729ff6a544ab9269d33f3db9f0c070337534936ef7348596b99511204c3357eb21a4c272f81ba30596ef1d3d9f8780e0232ea98fbb8411a2187549ca7129f3d7f9243287e9d4dc3bbfa3b2a38b4bddbc46db8b31ff59019601ba77994c321f4a839eb5589c5fb478980d9c605655ed444abbb6da353bebceffd518f13ff4409f3b84c9697224b248ca7d1918736e35f4c95fcafcef9526d98d45ac86bee8ee529b76ed4f1dcc5c38c182d71084dd5e6a2d38262ea0fd4932148cb0ae6b789f012dd5af5e01af18a517af550ced2bcd00f0c566c3dbfcd955303ab3fca83bd9275d317e3aa0458e2a2762f1522ee1e855be87eb7102fc4ddf6aa024e6079b1341b41ad8497c3813448b4e5a84cc8856d4e110429aa8741d2d2e8d91ff0c2ed3ccdcd25c2f17ff4e60cdb1ef1948a78f0b02cefac55f0ccdcae62379ac285f91451228684fe5f3a62b493e3d74259807648e448275792ee6354c324a71deb5e226fe6d8b1088cda0e08863b459d602467dfde1681f9942ecf8ab1a82e4b1ca3d0f1c22333552e5c54d25a2e20eec4ec2b3dc561a4831e158919d4cc17923f50859d5d70f12d6c499bd8b7c4517db0602a2a3f32773d5a2af7c9d6974a3b7ceda83d60c6d3da6e284ae34606c0924a09cc6ef490e26e6ef582615c12af8dfc03a397722ec1a35d81cbbbaefb5575ba6e7ad08e83cd6082fe92ab11432fd2e719dd743cafa3cf61dd852898abf96d29179a1ab2132059bfce906d9a34b05065b8be9b655161a7a1c2e0f2ac1f92c4bf8d96120a49c3a24cece270a2ed1b519c67aed6961ce47346bb44e0915e09c0a357d4813e2c9f8352e0f27ccf74591bb7ae15eb7719127b774d19bcf07047aafefdbe2ef6c49a43f9332759c9d351f6dc155ba3af4fd4065d02c74c705e33caf708bae3d91a9d2c686ce8ce3912ea2c3425e8c6e7c7135d1f61b659ba2fb467b7ff32668f359184c8139fa4c7370e04e665251cc687b5c9e7f24faa75ebb4ca656a8d80c11e5c9440b0b3a31a4ca4c51a5e786cf599a390da3ef8094a9b1a3c2ad233f917dbe8a4f9cc8c93db5893b8fa964a801b04c6fa22cc1a3ce146ce032ebd8c9938761bfc1bee923cb164c525ab97041ee1d10551e7241e0ce1f4b76798b60028cdf6dfe3cd9f2d664577215458e90c0fef0747db50cf6a41f3adbfb29042f76d7d641ba33766c5d83f998f8c2712cc1becae76e2865468a3be7acd2a40ebd931f1c7b78282cbc25b46d2f716409caa0981cf79acb13b7ff9eb62ca19ce380e3cd0279ac9d6568cb7022b413acc0f10a355713881f70d160d216e9cc562b1fe56c38daebf5a908bb41cab5640f3f165af119c9bab835197a509a52c7725df114772ffdaae370027193c5b1c70dccc11f65c588a717b8f698a4a0f62763e49b0d6848806dc942fc9b009417c12b0277c40dfaeed1a0850f4848db4260cd67841cda22d1a929aa3d73f2c675e6d968b0e5541a5acef511aa05b7a9d617f15f22ef273f8ff1871e6bb8f4cd5abcab77f2ffc2b46af387f78d5d6b8d1f9182241dd0ea0f09bb64080db68129249713b8b47ff4598de3db9effbbef058d81f26ecb8e8d01dd7b42ff7a19226a622aa4937be2436a3224528097adbc93be4dc487c254aac889c5968d574d42f191dbd090cfc34a76f6199f34dbaf5ec810796b1788efadb38d0ef10a1bbf7d6f321f1a49169f63f058582444324d40032289788685ac106355cbc52e4e0c4c23d1890424f6d34a76c744640741e3fae572f25f6d5f167d588290954254a009bffe9e00acc71b486ac182d116711009ef603892346bbb4ef381e1d3eec61760b3f7c2a2592db3f85ce5781dfa466dd771a8e0b36432070fd4d224239c28dedb807b9b5bb29159d4cd81b88d1b4839fe2c8b7f258548862a6d01fbe6d2d362c4a5e88cbf317859682d54b8c101ed20e860a6688b0025b5393c8fcda01b7c4fc6a4dd1b2f5e695f2cfcacfd3c36ab9f10ce7831367d4010b6c3da1de1de89f25c0da7cb3ea1dac78ddc18fa51321a2111b68f7dca453e252d838f612eb472f6ff3107116fa4531f151c1724c28caf4375c93a82b900566f07fbfe2bd905cdda2acf498234ce58e26d6d3620f29ed172976727f485374f6ac0add502937af0f859290d92209852adc12fe47353f1373b0120d647a1428f84f2197259c06c92ee14eeb1d5a58ae6ddead4a070791c37093d86a400afba8d6a16bf74a5f2531a37e870d4a1462e6bff350bf8bcd4885769c6f93f940317cf66a9104a7babd6fd524e6ff4a984eb888e2a366bbcf8be1ed9180907964de2cc2723ac624f4f60c2b9b12c8032e45a930744d467f5483603d3bb267a6be2940a0810f46aa57f78f0faab4705f1e6f431f71f767c0a65789ce62ae226a963b41fa5eb88b1f29e980e81b740045aff30dbea148d2640b30e408ce1cc9ac333cb737d2dc9d6db3f3681db4f97f9c2afa8f73cbe98e55cc36fa5446a26254de5328bfa523857a3d3ecd183eecf54ed7ab52a7b981a3793090521893ebf749dfa81efa9f374a300ff23a4080f46a42fe2fddc331b91aba816775bd7d9d8f757e64205087bdf475703634fd44bae760e7adb82dfc39faff05e2e9accc6133bf03afb72927608c33aa3245b750e67390da4e6c4fe2a84b2f062a384c48deea0fb5b069ed45c61951030ff4d66d1f17ba1e3a8090aaae1634ca66e904b9bdbc4ddd90c104aa97a3b7c4f5c9c2630ddac6fc987c571ef462f59abf853ee6a5b161c37644d61e7c334d340b4de4fa59c49cbc90e90e0422375abd5d9361983fd234af8b7ccb691ccffb9d7a07a2faabdd25a64c4e1c25e09d4b7d679bd5973326ace9f7f04c522182a9456980652aaa2e4701f133e949d49db020062601ab28b5b2b8e128bfa230513f75013e9653ffbeeb17aa20dd37a93e71ef61bb4f9cc6882f6671ad8e21f446a5756acb9b3d5295fa2e9d9e60b905897732a1e22631b6a60939d1061f971268c38dcbafdeb04abc5a8ff234da959184a831ed23ee33a0172a7a26bbdccc35bf81054c70c5748f3af582d26bb394f439ed336e07106b2be478709b552c880354c8241798ba50ca17b14e65ca537ed6b02f824b15f29e0014dd65555b7692242e7e3451af240ea35c783dd2d9221be1f05464add6fd97c7af409f7f5524b341558d7b253b6b74c110319542208933bb014522bcd0991d27be88673fcb9db302d2db42b9c6f64bcd3bc49fdc28ee8d0cebeb039f8d2ff7c8489f05bd46495a0eac52d035d72f5a6ee518a3c978baf27db62d517f9525ee53556cc1234e906f0eebd96fc2f77d6b4d1717e93098562ab56bf252836ee5ca70eed7e39669dabca998576588ac484411d9a8b83a1128fd5d122450d4a2d553c619c8b240218f0788bab6fbae81f9ae6331b35a0e6a9a331db1aa9199b95f50fee0277749fd17195259dd795cfbf671eb292115d62b13939c526c5efb39ea8bbf4bdc7bd985dabab07db427bca4a85550c8d832b7ddfbe683fc52fe22acddcab261d003164241b14a2f234cf30377223b16c1f8db07b9f479b844bb3599a2d67f2ae95a2bbbb2c8c77612322ca0cc9f531cc4b16a31b785278d2adb5d89a077cdae10c73e7896c5d05b691f8d040d9541e1caa38be35c613583eca7c1033f7444f62e91780256710ce5105c3eb6a4cdac6db91867a6104f4aa272678a8fe7978d09290100e05894241cef31683ef70c3dc97b5626013b190ef3a463dfb500a650efeb5fff9a06f6bf08efe53325701d9cfcf6a5ef7d45852b7d6be2e9fef26a34b15af39cb9c75e86b2f6c2c6f275c7700e144feaa0975c4648ad2ecff126abe256600400c402962021ed0e4a2d70d16108bb9b41f597650a5d548dba17023102e6e4db52432164375dbd12e65fc80419f1d5d01901ae6a1cc34648d2f6efc33b6acdc1bbbf8b91706f4c16c30fe5283dd149379d4e443127826da63e18562b35e805fc63bfa8e5755e846208c52f0578b1ff18f263c284d1a3aff127059d2f996b73d471cbe027ee324c3dde090e626f98dfbb43c88e29c22df66fb4432e980ff8ff930d6b9b2182f48bf16d64ea08cd8ed167b60612e8a328296a0e5c6f2d3e99917f61284199daab2bc4dc5d2bc0389bbd6573a4b58b1c9d30285cd8cab8cf5511e292893a589e5f13ff547d395058c88bfea32aded8d493f3f2c73da6ff69356702cb17ee2675182be9fc4a7c80d71c23776e20f7997412590f77156accb53f7c283258c6ca07df5bccfd4e5d1a5aa06d1bfb0f6794a3224cc993e780e55b7d369befd6280efdbb8bee7e1142e48c5a5231737f96920accb466443c4f1202f77ea52b197db8ffb5a399a81a94a81254b800fdf6ec5a5117772fb19b3f1d52b43d8c0ea72e91b4d48b13a3f1bc2c979689d1c2fed1b61f0c7e6c038cb8ccf5bc5999bf0aa161c5202ca4961e2039c126abecea1ead6c1cb1b165619722e99017bc1467ca40f0d9a16c96a9292a96380e08999cdfe845f110f861f445e53acece4c452d6d72059960342f069b410da556862000c7ea0946313caae31d698854e7f3733a7d9e6aad646db9d2fccc64b0040fc83f601b80c21a638657a8179acd6d97e8b5822ee5bcb5fd7a38d2356400228adb8132e4710ed5573e786c553adf6522eac702893f6e5ccebb5ea7e3d53eb7de9fedc3aba6d26afe196df38c2e32d97bc2988717406d60c6c36c023e7f11ccf55dac9ed9e5b5df42615fc5253f6fd08ab84f9840af5ec9cfdc8b6cae292268b65ce548d7f75f3e0a5c756886353e53371315be6c55eca0d04ce36c9b9d199309e6c14a0ca4798f3d54d86619d846696a1d117f03fbbdecb05c9b8a6da19d55d641682ddfb3abd8c58faf4745f0301a0b1c6c666d6779b55954db4e8cfe56b705b60179baee9c23895623917144a36e02594df81262c903b27ccd41617cedc07f8db5b4041bf57771f05cce079d486e371cddbf5bb355dfa31b96ea52e20a792a0eab6824035ddd65a781856ec3c72193ad4342ae24c450147b61d1c8fa54e8ef810c1c846e7d5b4dc1bb3f0e7ec790fc53a809747bbe5fede2547f2c8a7417b72dff598b24fdfc118731834f96f0c15b57349d1681ed131699977be45b110e685bada6a1ec84c59a410cd999d2ecbe99010e85fafef67478e8534d5a35d4d4eb533d8b2e8fbac0ce3773c954fb608f9c995f498aba848af916b07ef4df6570295dd8909ad648f496b08fdce8d9f73a4e674e722d7c3d5e826dd5951c236bed09c1a63e4e86d669dbf68799bd3457c996b304874a0dc9f7fc33eb1a39c78f5072c6ce1cb06a0b28834f84893bd428435bc4a9104b36d15d4db11996b29478a34eb579b3294990387704ae32cb8113b187e3649597bdfd995f2f8890f152ceee84d6ce8922ea0ca1a05c2c1ed302bf1a01585d9f966af4b218f55f905dc93b37fc71f6280116286ce5a127d5bd20d686b16bbdb5b0075fb0624ac71e5ec065889ece18182f958ca02d19c6ddefa3fdfe7f64ac604d5ae59c2478e8c35c01f4e852355ddf152fdf45620e32c0d353de88538a5127d52d2f7d46c5e906bf52916000eded071aacca646bc69206cff7212f1526d592b046e45baf7af370f07ce4f6903fef18a5d3f403308a0f354d596ef8ad805f29466dad3e49de2d88554794b4ea738b98206d062d99a1d1d7b43f6bed03e01875006c322ffb3bc0d6577a4aa2f6d1eb11f242a7e78e55ff736c72c315008e28fd440a1a35add7d3e25edfadc79da0340a831a803bf7ecc292ddba1c788ad1b6497b0e0e5947fc8f35d33c662bc52a910c3bbd3830bcaf41bb6fde1f1f8af3eae20e41b5a2b2f01c561c5a1cd657b5289e82f378cec5e6a5768aa87311e93aed4f636bb818d4fba1cda30178d13c8a2148c083e81efad9154b96dec0568defe718e454bec396674623cff821235af1a5925d362f2744cfbac3fb49b0f76059ffc6f8c370ace07a35df0709c0d49b31dc05c1d4f6f28912bb6521b1e9fb49c25ee0068176da9b7e9389b5fafdede694ed285425e485b3e841ba70de136a2f702cee78577755adb98ba940947f74226000837ff0a2eaa89a74495197d74dfcac9079b50a1b26007442c8109fef7439de3f9fa8ffd729526f7b9a2aa5ddab97beb20825650b547bf6e36d8de3f4f21256d00339182c4897b17f3564d1cc8ce8eebb23302fefe7058994211f2837f89510db379804495161a6a7a368e14cf8d784d3523e2f6ee888737d6b2e35608daa5389c42f8bd54b97981c6b9d9d07f84cc7211eb72e315eebfdc8d322d316ba396901316474793f21cd05156acfa2932f00ce0e03f4e051166f9ae163ca01862a986c06a189dc34e78e8b29393dc8d2687801ab8a4922c9f0111e1e59e2caf96529f2cc4d90a732d022d63071b01fbbdf74e37bb5f59fcf632a79116ce2191bd364ba0acf528142c6d30db279f04f597d3f9c08eabf006a5704d643059495f55a90ed489197 +0x1a93eac31a9802d78492522fa021b98711d9334434ff3c45d8f3b441e1805e08dfc62237b1152c4b392ebf85ac39a04a +49336 +0xa799ef180d0ed9be2eb02583263b70211167613373bd2da4d8a86167b7cfdc689ca21ac38633b9358e4835cfcaaef7f271d08e7740883c2e1c34b48af80d229af9b46c3bd80eb78d89522ea31a60fe7fdd55a53dc95c6d8e1ec73368485e6dfc06f66ce9cb46deaf65f79666dcfa90b09d1e2fecd7e2caac268767696f6ac6760b91a233278433836a5ef780d923b26df854b4eb32c15a707b9fd7f634da34f04fad9682b36fc0f1e2b0d859d9846e9e381fbaa4a2a225c367350c756056c0521b70d13f38b08ce21314c259a4c5cb2ba3a6cb7eef2d348b30728c50bb857184b705dad07eee9f3c46b33ce8018dd2fc82126ee1e0098eb21f7de1ed0d104f6f6b92399f4dd202e9c4b4ce6eb98489f91c8a2c353fdf3b1e7c7f92b61e9e62f97f4077126d04bccfd24000539453fa0bbb378be3d25644b98f9f2811b6d8b30b3a361b93a52bd5d8bb7f5bff5aa22d18a54115516217b0699f062a689c66498ee59dad89bfef56ebc59866dad318280923cf52e8b6c98718f6db202299ef2c68c89cb55c81fa46ef3ab4a94dc75ef5c77d09c9109815d2adda4793a7751b65832b5cbc73b4f1adce60faadbefd1c9c39fb180232cea3981094720a5ff894fbc556044938207f936f8093f9963ef92346e52485b4211ae1296c830db2e9fff61890bde5128c4a01bae1a6163e529d94d88254db005923b5e0a9a2240812075f6323af1769c1fafe97cd5c8a1c01b1f6d61bd18b7c3e651d1d95f9d8c939523d8e550167a6883893ee8adddf9a13dd5227f8c31d92978920c876adb05d278898806fdc5d2fa7acc7a761509c1f4fc8afb5615119a92e36c7c995e9352ca4527823b867826de6fda2aa9add4a127e1b15679ea30828c91519083ad3ed9f7858e65e7acb5dc80fd32cdf7dae70dd687d8d25f6e2727931cd1e6dad93621c6a41e919fb2f77a9e8d86e2f52e896e7d5971dd7b336dd032e07dee135521c0c43b58a3c85bc56763bb26f8060b645988d11d0651bc6d32e886b624a1b38a2d8cb5ed0b05e998499ce0937bcf03e03585792abb877bbdb6206a0b192a86c7be6cae1c35bcef089786986cfc94aa85b8ffdc2b8b60e3c7e07714fd39f211732a008e96b261fe6eb7dd6d03e91b61dd2a5454afe482a724285911fd15bd1604c6d4c1cd1f997a5340edc908cfa7cc5f202f8d285571185b2452eb9b2acff7053b46022fcbd8055eb95426ec2eee3c7420fde0156c90c9c53ad10c47e7cf26ecfdf0aa4f458201d9979d111e754344b4a32be80788863dfaf26fee93db2f3834655134ac2b4c026c52251220313b87b93d461f6f37a5e774d19c2d0f8364ad7427e43bb6db8a798f7f88a481f15b47da45e900cd089458cb5ec2220b7f03f914ac261a0fd4b1f9ab863432c414173790536116a169c5f457009e78280c81adae78937a07b576e548ecb4676747f3c983fc6acb7cd9af5cb05d6d99d5da622d99f3b8b64eec3ddef049859cdbdb75601d9752b9cfd6d4f46fcbdbf1a5572a0b7fd4026935e77b4939f3245d926d10ade5baa54c0affcb5ddde2462a07014dc9b8600d0d6d35a3b67e901d143b6b6a0544ecff1cceb2f6fb831758bd8b7741eaec4e450d55656ba94696ec7b3754c608d394bc867b7eec40080170069317aae173e527037ee527841a7dfedd06c7c91b1a486a23a1d21fedd50728afde70fd3ff7cb3f6a5a437be972cbd0d43a22f7de717e846ec24b063762beef039df19d78e0770abc67febd4be7f71edb31f4b6a581bd97e26d4833cf498f3fcc7238100eb66ef5743875702dd286156c9ecb9a12c37c110903683d07e20e9744fbb30973f219ac2c3c463901db0f70f2d10626a8af408c5d15196693d49382178ad0de3b1c1d8b3ef3ff8c5a59e9ae286932d0c9ad91665922ea54d599e48cbeb03ff2e6acd10f46ffffcea9e7ab1957d7e01d1866e53b87ad399c5f9a4823950c5f0be92cdac4bea0c59472fcda6f1b9d8c8ff733b2885324a581945e54c354ef9c7dd50491381086ff524811de0bee3a969df8bc9fb96619bcc9166e80f858da96cd1cccaad5e722fbac9bbf5c7c4a2faccb9f69f35b1b0ccdb75843534f2b6dcc6e22fd7e2a9d0548e7d06dac3ca9fd2d9d5dc453f9fc7e76f0cc6552144719bbf5aa1f91a2cc9e75b8a8a563c9a8139787a64447f284df36f9f55cf404365ed3e7f49b7bdad06ee08366ef09afaf13791f2b6235f13ebf9c376592bf8b73bda2c9b509933f52f747dcadb3145b397d50c83fb6a462a480053d9f9f2b0679a6a6ff4dd27e4cceb7ea28df89fa68d1a1ad1765ba29c330d1007105dabd21c2ba6f0d219ea39f9e2165fc9eec4234f230fc813fd52c8f7e131c762aedec59e9695977f2c699846bd439cc4e42825c359badaa10a02343e6d6c7b191413f1b5823f4d423d2c6a79240e41c8035115af6525ed6aa93a47d058c80b7bb6d3be2997adf86274bc185bbe7d361b72c959dcee58eab4038369744b4e5fd1bda594c17ee68128faa008b4349b63055a185b129d59bac8406402f4ee055f625012db46dff2d1dcf760a44c2d6db0d0e3c481181a3243ee87667a16e8f5f47898a1fb8161dacfc6928553ea52fd06c2345735b80ceb6f6d000f3aa3e2260459bdda5c37ada5622df4967c584b524b257659deb81b8a258fd4eaa86283a1784ee64566336b5b745b451b895cbf74693fd050e3e1f0194d9a2b7c2d1d746d399f3b6b823c4205ec96ac9de1bf576c46596bc6aefb339fced72c4f329a5c922e94e5d31619daaab12751a3ec48ba41ccba6f42a6ce8c25928e00ea1da2e4193e750c058c93dc52ad565db512c190fbe1ac034d3321a1b28007ced557fdb4095389d78a4a72f005c76af85bbbf083a36f754f6ebdbe1d4e8089bf994973736a54196fe9ba7ebdcce7ad491e4f9f393f5d5e7c2dac6ba6017a5dfbbd5accc944286dfcaa427eecaef565798536945ada93afb21269f1e4d456cca9c9f1cf60a0b9cda5564c3c24b4dadbaf19d8988f79f9b018a65a1881cefc1cf2457846dd85ee8192743f7e0ee57c5714609e72802677a9d770e8a722f85595fdba56f7ebfcafd0ec8c830d5249c420d0e4eeecd4e8f5e116f87b6871584781f3b0f3aa300ce404db2680b197e89a800a2d31cc33c85ba1fec77c2116f9bb26fbadb72954bd756386cb9e3185cbe7bdebc1d0db47cc9131b764519bb9e09ace3e3b0a3b00174b3616024557c5f991209a2a31e1b5fe7fd96857649e0117cabfe3e154a7dc234cc4b254dde9ff7a82f13ff0bea628660ee13a291cf296a535411328fd368fe861578348ceb0da57a0780499def1460b24905461e05e2192c19ef6966db0c26e7335b1668074ff97d5fd0faff88bb7f5aa2fde871aab4ae6581cb3b50cdd1cbe68a763365bfd164208c788ba763d242c8906022431a1b8aae105730d438446df2af5c141c812c661211f9840bfcd35b9a75de6bf8d0814e6449f5d24786fe7d99f67f40e2d7db7fa074d67cb3b0391a3ee7cb2e096a805a069339a841464a8b5b1452425f3049218a4991ce252a9e1f245aa8f0fb44934e2380851b5802c317a47d6780f8370ffc0df4adf0e6c85ccae9331a5d54fb248b39968ab3d238f2930486319534388a5fca0aadad5f161fbe0c2571bb9cfacea1c7499d0a6645438e09e342f799d162dd3cfff32c249031590b96519449cffc223b1e4e778ad4507913091e10af8e03e4e5592125adc33c3c460a2c9fc1e7377d33891183965283e4be6c2578dbcb0817318aba02713bbad869f58516bbdcfb231f1e88d73f3c68516a80eba8a504c9e4c019204b054627add5ecdd919e2dd1a47c4316badc1e782fb5ebf32891e7c3ce1f88e677d08efd3d2854b8a8df363581c9ab3dd703652e001f01be6138d0a0338e6e8f117982b5f6bfc188b4f5a2a13b859b70943bad14531466bffaf05bc9d5bb1e9c9056adec7b2ab7c05e77dfaf424eb8517aeb52a5a9149f6a4e6ee5caf5243d618cfe8cfb2af7bc120dec69ba367366530398f26c62cdf06fe3fb1b0e42382fa05fe79c8c969522d03ba9cd4c789249f7c6db18d3107f1e13542b481e1d8589cb919848fb4e81a0ad706666e08939c7a22d18127452c68d0707760965179ac035ba873ee1a34b99ec3478e32108c853f4aee68bca7a22a1bd7671db9da0c65781433adaaa3561932f0077be5847cc9371e4acf130271210a939954b0249b6d430c439a8ef855200d86cd95520f6b4fa7c36f1cf5fca233e5cc956b44d82dabac6a5fa261c139b879ac2244405762ffda64e5b92a3d3b4af3a9e4cc3d9ecb07fb57102deaa50ac8bc8a8df0760468c11727320c7a6e474d7d530ddd631d7c6977fadda3f24dd1371f499601bdbf867da534e07fad37cb24cbf298087efe48b9697c4e6c416196efea11c5dfdd30c31bcdb477788a3fd1b725ad0eb455e837df1904ebf09f885fd76509a3f29efe2783d7cf7d61da2f60eed3acf648b18452c4cfbb3d98d46a36d7d85ab7a3c8d1ba9e0bac7ca165ae81b11c18d82e5a7aa04ed3c8cbcaa7b022d78a2b895822538552b074fba0f3653be84a193ccd187129666c541defe2022cbfc4a5a27a752a8f88104e83c64cfc967ba3d6ab8db312f6f5e487bc704b075a77cef0897289fee02971639b7b371a9a527078add6f2040ee181882fb3ab68b6e8f033c6a72678811b1cdbcb277e675055f826c8109eef7a148c80fe22c9cd48f87297e280143f794859dd9b32e78dbf6d850986a37f7d40744c96b2246fdc17909b4364671afcd096709194043b31ef805d496ef85d546aeb0bf3d22063402b99b45fd4c302578fefa8203d0541fee977c90d0875001cff600fbee6806e9f8cf90515bbfb92f7bd3a4ab21e9ec399b43b117ddd83307e08baa22077ab58a2439ad68ba0799385625f9e6ec03587ad58b37dc2748bb4218ce30a410c09e9f056626fe90ba4cca88745ec7daa3457e0dec6550455f355af93c28f482d02e932d03b175884e4070932d67c076401f9da4d5ee06a0924dbcd263f7b5e62fe1f0fb60c180094a10a506ef9953377063544ad62671d17870e254b4214aa3465543012bdb808c2439e24409681296aa9d5c607b932450783b55f0cb3a4552a9f503ceb35409897328b2db2968612c5549f07624d8908627f9a23717a7186cd14dbdc4a5ef8da9ad79914cbdfed16116e5db0c605b491afe583178180c466a32dbdb8361f27f453989081935afe5cd55fd5683bc9fa06761c39e644abe41d3650bd77b760160e4ade371b13ef000d998ed0d8ca81a590408c8436c2e41bd20ee6a5c1d5090e510812578b52873d50e66515a87a15fb56939d2bb00414afadb1583b40990355e4149ab8785808fb4e424b6e7f546e4581fab7f8fb1121e9d7a90c48990a3433f0f6e0228b2e5c832e38a8a1055e72ca38fa42b1bff1f511787e6c93773185f29d374a5d6cdb691d194de577e3a20ad4a41da61fa6ad766fb7b6dfe68014ded9125e4230c2671910370b68b8c1281fa9ecea4b0a564c8e4abddbcc075cbd282f78f32f6536db52a6aff99a2c46f697923ae99a3a77d624ecb2749dbfb434493df67e79c26f3efe25aa9fe39a1b165cd7b3a3f976b2541f9bbd0ab9d6307f2b4bb5888710169804d64f86accce89054c0819fd187afcd69a00624881477a8b4a0dd98c316d2f24c01c7355b88546a6995cc658b361549e943b64a724132b7ce869537949e4c53beee39345a9707ae829dbb7e8d498cd087cbf505df2408b2604305ec626e2bc342e4ce0c0fc1aa64862177714188be6b2b82eadb3786a2a35220563f9650184ac02dae44e4cde5925f6928c60ebd5021bdaebe56e22fa7918c65b0b89609bbf1200f00643f855f42f4bdf4065baeedfb259898fe48e7c085f55a3ae0cb64bbbf4ad3edf58aafc17b2d6506b892243bff4b88a15ad276958677471d3e9d28c1bd26c09c7e2c14b246f2a884641ae7e23718c501f2e6a3cd9cf973805b751c74f19d2035878d7cdbaa2bd097935bbf8bab7299df4eee3711cf64278cbdb90a7d659539e29815afe3afc02366cbbd74de62434a63f750fb08289eab69eed3b88321f755c93a2c74745d99ea1a97a8cd82647121b77476b45bae90473e7629ee2f2bacba12f43a9433bd9f6cda7c849420b9e566004dc62db16a224333db2576298d9bb0e64fa7d8cad6b8f3cf04b98f5f6a8861690baa2db3623de672a72d17184fab816dd2db05e1b0cdc520b6af87e87d415a1735897b09a0c7792061ab98a477c673ce053fe61f54c72bf61ace4362fdf7983553cae05a2caa44689206c2760fd3d0327039422dc98c6d79b97f8d76ef9464e9edd7244e0ccc8f70c1a65d361eb9dec09c32e0b21706d3d01a282bcc5dff065b8c170f8e4a17a26076f3318cad62e6a110938957471ba524c633e60b4e20c6b5b7f268c2ee71c4613a55051ec3b52ffc54c205c460b52a9c430686dbcbdfeb1cf7d0f992fec43f9b9334a297689a03faf1291ca06abbab611b0bd3e6db24bfbad31988a484f759350cf8d19da4f9a8c36e2e96946e15709ad5a895d186d788b7d335dea387f25b572a0958d880ba677e533b3a4772abc170fa479347d4e08f3b7f8dc335109d8d2b77cffff203c6885329b7d1628165e60b114f96eece271c6d6087ff0226e036d67ab390903603536b760a238ca02b2692a228666e7b957775fd8c59b3d1a39f83bb1bd15d1f5a10eec59bf86ed9e5cb2e3639cb70e410e77cde059af019ce1158c3708cfec8b306049bd418af337b1b0654ec8d9c0f81b5aa8c588a600749d27d191b871e39f77ed3821c4bf8b7d55f4384a8739906d12a268eeff1aca2fc2a1b45828b63790cc08601db58f16bdbde0c4ed64610d1e68c196c30977cf3cf635ad00f5f758fdc1443a17a08415976e28a3bdccea876aa23aaaf85447600abc4614129cdfd864ec232e85f2391898cb1e4d223d30aff043902de55bf45d376945920379ba36349117d60f37188010694439b131ddd73db14488107d18f741a1c69f6a3920e30b74b49919eb9cfcbcdd3cf1f1473cadb19fda5210542fde97da4ba49d47ae7f57fb6c102c9c50defc8b6afe58f9f793ea53c4145b6da363c897374a4321bd5b8899a0a3bda5beb73de850c76ea6791a4671943758260e37524d3be8c253c8183bd414fc43b441161f9870d588f94bb1647dcd339d19eab9a380ac08b15a7925d03f2b626524826c00005db15e4ee9e9a2dcc1b1a0b5a37b5ac61a3286a22b14f43f467e8892ed399da479d35533ce33b0132409f985d2ecd68208fec8c76865f65908b9247c0bff371957c3e434831feab566d51e16f39eb548fab5de46bb897510e4aacf3c492d6ac37a0ba1cd831ed1380c8b64c57001658f62005d8c8f0ffefb6cbbff703f64b7374303045b58a0f22f8795842df2a565c9c156cd157d59e28cf3752ba459158ae96552928a7e56cbe05a9bf2ccd60b348cab31838de107ce2a3b5eea4510b0845e3362c2c75ea0dd0f1807170ea493604c82293732648a106786e1a1df10d6021a4fcc1b9e940f9410225f878fe8ee678de8965ecf726167d978a5e8deb3f6a2820ce7037c99038f781c1dcaad1d6cc8d541014091852e22d4830425c08482d43a1d5c20ede81d3dcb67ba3702acaee2971e12a3453730d00d3884ff210d1b15b6d383ea7f0bcd1d7e87cd731d31156357e212fd46e31a0dd7fbb0cb8cb81ff56cd206d68c7e83acf60ebff5492540c9ac3fba9503236a2ab95f1021401011e1e09b5d5ba2aae17ae67f1a443303b163e8895221267271b545d51b76f79f81699691e0006e2b66f5b43b64d65756d7e0b15172181d5af13bf1f04b532fc0ff0b1358476b2b8a74abe3c61822228934ce8b1aa2f05437493d4233284c352eeb34db40ebd28712ab0bf9c1bcce2135486bca676d3067b1ea27bb001aa8c433c67542fe55fced8e6aa46a90bb10dfc5936713aa295ec4356499c109cb1f397a114b0ee30e40eb4843f3bad5abb0bac4a63eeb656fd2064c48f1f8929216215c7c3483918d24fccab7886ee2f7245ebce161b62bc9408a60f7cec64d1804086537c0458c5b3f8e9045b0fb5b35d21808d56e085f9e10dd0df18ece9bb58f5b2f045cc925e0e73d336f3bf490d040835302b2568386c97acde6c055f1030e961442888310c6c2752ea457cf466ef63d05f9dd2549fbe0f00b27f2010f791845bf72c207bf6547c2ec85b2ffce6a7981ac1b5cf8f565edb950359264299022e67b2597cb9454eda2e773cc1aab4b311dbff7a046186d465337a03fd3e1d0b4f4f1db8853220e2a91ca0f01846f99b34dbc0f55a1457a914a1be848f4cac344fd9df502130b09951beea801e18dce86be1ad2cb7eff0644fa978e4c2b36e0696cea02a39f91cfa3adcfef3b96786211db76e2905397a8d8011502c80bd8a088cf50a4cb6d68d8ecd408351d37d1fceb123aaf42a3b1cad0ea2ed63b0b029c39918c3c07e0f2bdb70b122a253a0ce7791ee0993103dff4b6124f8913ad572bd26fd738e7bec1d6b8cf683ef2119bba524e035109d864aefe15f18be05748e80996dc3bc93b58cc68ad84d3f25300fdfd2c0d372bb602621f61bf6f3fbd5a4945c305a54b0b19f72d01f299b472cf2ae03588ec25111bb6a081f3a38033fdd7fd50ee25db9297ff9c893be0a +0x55851677287615c9f5cdd01c36321a3e4ee0adc7aa8db055a7014b1eb8fe19b09d643ddbbbef874f8c80c6d1e30ab22e +50128 +0x879a4e19effaa5f409f3285b3e5736c96e96495c91d7c1869f47e306aeb121165a509be66ae1e74ab1fb0daf31a3d654871c47b783fc684d16854a75713147af6b8f8c09234ed5dbe79778b455a1a594c07fec5cd63cff827f29ba09087660b18000286b626af80f756f7051f1762af2e3674033d2be0f8fa3de3ba9baa7f484624a77f26f5cd74f222afd6e4c4dedd4b67e4c24c1ab1fdb4a4ad63dd0ed8990d9168187914dfa01b57127f4af4c77a303691718e92ab8ce3b1592ae926fa93cad0c4f131265ea8ff7ebf7c9629b4fc890d3a9f5946461d040e878e24856dbf2a5d3e87c38cb2e5fb04174d6ad63fda925620ba50880a2491f6b8ec23ac9a81a8a1454ac4ca84edba71aa703d8cc0ab08cbe440e8da703a1a145de36b0f1961a24769c899523d369a61f96392afdfd448c905c1a6d010d408e1e7027f1f52f5b3ba2c7fd5d65447373f84b5eec1f5eccec805cb0eeb5478faea04a7b46fefb45973fddefea962960d74cce5b6759b6b275354bb75aec3af4c971761cf7348141fff6e74686dc0b989ac32519e0d48c5def583119f7cd6cd8a639fcf04cbe49b53d6febec7762708384065a7fa2b76835229017bd0e8167a40ea1e2e18cc5db0a1751f4c8054ee3895dbd7574f42bd2a2d586048be62fb3bec95032d60170c0a9564507c27ac9e912ec907ce21d58530cd2e2006bc900d6909ff0f4b6f1e87ff8c2f22ec21cfa0c86fa2579b0666572dbdf4b1345fd1c5a8058262e6ba554a061220170b0350ad34d4f2773c6177bb877c5694601cbaac7f8bb9ceadc65ddab4b3f19d6740b20c6cfb33c730c78c1ac494be5a0877bd2a35f91fa2ff179ab291ee2e366f7e6656e74ee0c806ad060d6b73b6729bf55be781da2e7069228e5a241d1062a1f100152a5c740a2c8697fbe2a5c96ea92a193cd9ab60c75a7bbb49c1ed52b2ad5d01bfbc80880e10e8947ed0b751beae6a67c2b3d951187187a3fa11cb5fa6d026ddbef477773462479e0eac04f9d32a5ad9f1970069d41cdadaf38a33b1afb8c306ab888ddc2d8f281713db3b2c5c8b5fe241f9bd358adaf9c2bea1b2d34dc5d61f0def50115a060e8226f4a653bb600e134c524c2ecd2a48fdc3dec54ef195b4894e7f4ad12a457f81d07ef32a6046c9ef794749cfeb895cde9bb7f78f4b8702c7f5defa764eebdf7878d09dfafb8e37c9413f32839686b9f7bec3a61eac48357d9c74db8b1867c2e8b890035fddc4cc433cb093042e90c4dba5786d67a427b0fc9ae76a8a2727ae54e843bfc39778ebffe421f7ac443621fcd84cca04c3c429d7799d23fdebca164fb0624fc0a9293b21b029bd0657f545cddfb728707b9bf490c10c9450e6cd7f2b89522fc193442e8b293e7f8cda4c94e1145e25354c2da5ab09bc381d98806d8adbb9dc60d6583a8ec7b69baa5baab3b92e982ccda5e7b1a8ac328bce81a155f04fffd208f2d3e39f0448be095cae16c876fbcba42958acfc30f60bee229eccce2e9abd347955be4e775b43044da53291960f7e4336fefc28208d34f70be736a71020da7dca4c3f1f9974b745bf5e9ba70429a1356f5923bf034e9373ae09280d9d18c63f7635ca84d31ba7281208b66b3a00f0f532e5c81351d0b3de797315542df91d13fd80f500ccb68f35f6521760bffbda0d12333de784b9f2b1feb3832d3b282b75d0dc5335deebdbe9dcb93329fe90c8e78da0198e1450fc78ce58f5fb4d4c8def80a64976920219de25ac9e298e564a0f15dacf89a93c1dad48c1e240ecdcc0eb9d5d5c558ecfc56d61babce1d7c2d9fe4b41d46c8bd1f2b9fe9cec90923f50e4778010551d7b6b22215223e5734cf54f8e53dca964b8f8496028595cc60aaa84cfbcf9f7c6bb7796e5114796d98b284d6faf3cc2ac67bab60e12cd1800b55a26d6426da022f687361d56bc8882d3ffa26fa2693acb64a69a68eacc64cad5dc554bdf0ff0bab2f67a4ab0d73d07ddc7d8feec06845a16486100febb959cd2ad9a90e1456be68751fdfdbe4c26c0ff2d4b9dda8931c1131ca456ed3f5cef324a6135d7a2744eda361b96bd6fc856beac84dcfc65c5b8d19fdeeb34bc1d4a8b3f33bb40abac5c21ff6da65cd6b421a2a21f3cd020a279e84e6b2e43a6493723f8ac91aac56687053a6ebd0b055cca31ca752dd44e7abcada4e3a0b8a2732dc303164984845557ea53894b567034a8e2721130a74390c9c83fd2e2f2252da6beeb1b434c6cdb5747f767c1bd9bde564b259dd597a497599e7bb3559ea2db2a9e1d262f80e37b0db48264c0af0cbc5ab271559d43e5f0c4b6e50f790caffe31d715b16ec08cb6d3a6811ab8b937411eeed1e2f82a9c3f93981831ddcaa12944f071677179dd0151947ff42a4aa01f2b26c3c066ba1bc65eb861d4f4572aceec809c92e81b390cf004db8b95f1eba8f810c3686980f9378eae7e734d40a16190fe13de3323351c478e203b7c4d5e711e235d65810dc9159bd0aa675905a983cacf53a3d33065c1b086ea9e4dab8d09f5e4fe224dbeefb31ec5925b9824b797f28af88e48b12f9fd395973e9a9afbd627cc22391022f1c27003a2ba9b0c3030b0a76ee8142416f92920b266e39a3f581c4f661488c863b6480177fed24ab7c08dab135bc617a08019bec8d1a937ac125be5464f181da9f0ff457ea2ce6ec2d9e21ca253ceea40a73dc656f96be1e6976f342f333ea159151e462340efc6c5ef3652886aaf4a9be0fdedc9389c275359bea29d8b6ce1e5952d9a0253d70155732313320ad78706cfe28bac29ca8696cbd2b72d92335dd3f395b79845e4ace5f810a53bbee84e15c674268c47777e158033f83bf22273a8b2ff0551b1c907ebf087af01e141fe4d573b54c61c137c43f96adc6515aad1d845b229cb01c4c0fc0f1087212c85261214a08d06123f0fc6a9dfda15974ce6e73e678b60c098568a8613d415fb224408613c35b8b44ab702141b87e9d179315a0f77a0bf7894471bf829fc5cd799d694df76f54a8cd7008acaa65c4e7ec02fa53b7b103394490124f7cb86723c6c5c5bd1d9325806545ac52ff8cdbfd9b2606d44da40799e471339e77108d2b40a53a20adb735dbb534445c69b52ba7cb041f6ae2dc7de00eefbcf59a2da1ab9044b1bcd163ec816444b8120f691caf24a62e5f9edfcfd66c13959c0d99096c5daa13dbaf20b23a1b7df0bc1a2f16dc50131cf9a8376343a6e4a7dbf9dc2f3650e046c36f75efcd82e8d5a2b19081f5f453cf81296ba3ef646ad8fa867c79d111ed34bc3aeb0b03408c4d0cfd13c5c3bb6f313e4804f6a24dae1140db03510447d9c31038096ea4fe72414125404a0e4a6e297a2e89c32309b73bf721f91e989aaddd059057817863a09a8a529f789d4c589e7b0282743b418e3c657fe44756b47069e56b5daa4618203e2facb9b83a67357a8bed7870b29d39fed21e4e36033a2a4ff6f0a452d8c4fa17785a1570ab430ea4f017f21f50c4c2678825be526ad7e3778148b3e2f410340cac853b0ab989ea04f2a778e9dc5f3061cebdbd035231a4c9cd9a12c063a4d8041554b4ec2ce1d282dbc6923620158cd3eb0ed2b182f0742d240f4a56ec27ede9f9f00780ccf2cd06f19bc96ee28fdda4283f85c4c3bd5c8bcccfe20b59427ca2a180bc2c6165e3787e4fa4f9eb742bbecd795ea4dd4063cb0e016246719c8c17552d5c5ab2e11cc0c809ac3f036d7f0822e3e6ba982091d532cd5271fbde25305d1f6e71880f81c618f267a9f122e06a6ea6a46cbc05ee91805c3bf3c0af4fd5007d7ad9ab971973b5325f9d7f3a56ccfbe92023109983e740d6a53488b813ee876f08f9e320edade9f01c84735ee9160fd5e3485d8157c0b963169c1aa078633a1fa13bf852035dfa5424c79635a230f39274416b687202342918934010871c61b2cc06b1d7656c318701ccb0688803ef475b7802f4dd97f9533281c0b04701445312c3d7541bc0d6b13bfd899ea3754a1c2153eacd9f655007edce6327c0fb2b28fad832742b4331f958c1e880fc6f4e3a4d3cea9cc056816dcfe2f11efaf05d590cae8adc9fdb8988e27f97b59ada41c9679acc094951d3af6225323cfeca230fd0ada7377e72288661a15ce6869c6cf0f8d556bb413d90f22e00ee2ad36fc572cf3d512bd1ef541a5b8e00bbc69f17d88755515bb004fe61bad9ec8f81c98ba990c74f609f3a566c5aae4bdb64c98aa99c8184909f8d65218e19f51411bebcdd9bb16a80f03b76a5e56904ef67040c8abfc3b90314c00f5d3229d1618a38a23579656a30cddafbed8527f59ed837e6a37982b65c1a85433b2f6f481df41e83dab149171a3cff2f6bc050e491be4a611d51274442b6c448e30b5521f05758a8f3cbc738e648925848214c9a702124c320d0182b5df265677e51422684bccd59a95046973cf67bbfab2d83dfe20aaf54d37cbe3356d550e834869e1d7e2a67de24c72efac250a2acbd6e5e7a8f7fd25e5fe08124d5676e132c34d0cf89aa0d7e8bb8e62a235def66a66b4335208b7527ec81cac581b1a52f8fe242044b43a78206abd8ef05254b378dac9bd63d3380f8a1e9ffdf03bade8684195b846cfd1e32bf296b1011b19c659abacf268d81dc19a69f8a3a028b025e3460831695e058d6dbb90757ee08cc39f71c45edb97c6fd2242bd19e272af700c73f22846ef53eb685e4148a4432c1fbc95a67f3682c226b43163ed31aa1a7b4643ea0949e43b81ae331fa72bd3865f33bfd9cff439ade2b2ae637a082f8f8c233e6660fced2af491d2822d7ff219e69728c4bdbf2cd895c022626cf0835d4715dbedabca5ab098c5c51f281b2f556a4998fde4d1ccd0c44f25b72265362220a0a4f6565ccd5b02bc835d3377fbd74edd68ebc1e69a3502b230f836e0c86cad5611f70d0ea588a6e885b2ec30e80e08c51124d1683563c5bbcc9c16edaaab31a8bb861c6a83d819cc54b69eb064682c934a2f9fc0feeb71be61294f066d5c721b0a2a10fae8b7cffa68eee780f1742eba4c7289ab874abb2c97164ba570fed31f6639973a34a62dd54ab2331d3fc083ccb0842b623efff698c6e999656600d948885b0ba2f831d7ff62a72e0f7fcbc02d1edaf19fb679b8858919b4a0bd110908c904dabfb3d942db594424b26204686defed78be6e567575463d29e1d69dc6e2b0ada10af80af2fb970fa3b066f8e1018c423d38c6f4b1da96ba75c35315a768c7dbeaff35456cc294604783ff17ce8aac6f9bb97102f247e31804afa2f72efd87061506dc2714d2d9fc7ca7aaef955ba8cc209accdfbb2fc3ec632156d0d23366c2bbdc8d1e8faef01abf95fafeba0719fe78675b097104a19e2da2df31158cff884bdaa8aa31b94f718cc95fb3c12f686cefa9ac0eb86924a3a0aebc768d7ca9cd417bcf38bf84706760dc59ad2f172c9e12dc305df5bf95a388cf7f3f8e850e08394a51786d92eb82d82969597850cf187e697885cd9a9d04327f87fabd2894df9fc0dfb7d057194a5f4b1f37118ed8527efbe504846ca34c2a2967167df9c6a9e179ea959c53922472abdbc4af03c0d2b0ee1658deb830f1fc67ad31655b2bfdbacfe280061aeeb79ee63f809562212fa0ca8d01110fde8c15b4cac9f7df2d51685d5805c21f776a4064bb09692c71bfcb0ba98befd60471029b305ea9f8533b868ccba544c3d4b313b1cecd9ec52b099c4c0c57af9d3b474f758e5df0392622a1e8adccf2ca7f386557eb2baaceb59390e61602f4d7eb8558ee35466f042e8d36fb8f1b7075ef50d1c1b0c2119bc9f44584670c4428ada1bb7fb5b67b0bd4f1a22fefef32689d92d589801f67cea09226816fd211e1fa32e384800ca892a1e6901030d6bd151284dd0a099211da0203b067a102e29649af7d9744d77c4b1de27d270250750de69d74dd9dd8a44046af8fc1aafd3ad8247dc64244a56a87c16bb5eec4fafea57243297ebd419393e71bf119de5f8f0a132469f02fe507fb04e8f6d20924be8e4e2c6767f87b74377bdf90cacb7853be7e49e54b6714b8f780f0ac7b4f6c392af29fbb23dfc4aacd7d40fb6ee2f62d67fe44a49e8ab3022fadf94334f83ff30dd843912cc3dbbba854067d70c5477098fbab4473fb5e87e5e49957a9942e70a9978e85fd552f3b6aa896b37ad2eac1c40ef421563965aebcdd275643c3a6468098f7061ff41d9e86d35829d7ac6ea56b90a5e7dfd566db36f049db9dd735c91555039e0f3145497f7ce13d21a23170123936f45b5fe0b1d6b66734127f6b9cea643aba458d34e0c6fdc889f364d1d63a512dd3632941b70e98060c4bfca616724f12f74d784ae90fee548ca764de2c468100f181d2384f513dbcd0950f73ea4f6e12b1a18315c69cc73bb1b812a506e93156fb31db030f40ffe20d9808636cc459b095cc2e13fdf000d495c00ec4ea84fa764cedb4506b40571c3fcf77e332938a82f037d9d413cc33c5a539a9cc3b9c4505633fee9ee7f1ebd1c3a5ee71c01f88f07d7f36c49c63c8656c9f84199ea1997ada82fa5d09b8169955b5dcad99dacd8f79fc95640c79476a587c2e3b7837704d2f61680945158fd94269b2e51457d0c6925aa630c85f291af529f8a05cc05202be55a8223e9c8028364c11b6e4193b2c42f3c9c96497f61ddf5373f6b0cec72213ca4b363abfbffc9dd769917d8155270862708c65a626d95363309d18d53831dc59b1c3ddf197cce5963b134532b75d5f214af8502c43d40df3bf11f9563d98546e8c499cc4901faa0306aaefaffa25b3aab9ab987cd5a47b6f6fe3d6d43fec28832b360bbb417b57984cd6b15b6616a2893d04b32a44b10840d38135d1d7a3d5322f278f4824567ae07e054ec7b3a6a827559244b7298051027a78aac16d35d6e6088cbbfda14780562ad51c774b6c311f83e2a1a5eca8d24ed5488a4589389a3937d4064e40b50473d3c4bedc95cdd9dc58647e691680f860746f68b0b412bb863dabe2acab2573c3f9328a7a3b420ee833962f933faf5ff1c85bdaa5666aa767aa62f5bb191f6ab11bcd23d2a47f5cbdb6063996b08a657d41ac34962896ea57de97a3dc331935d5bbf2ff7859cc2fd7502310f611b8a56d90cf2b05732df0d17ab87192819981bc4a2291cdd3cf04df827b6a33eba09c4d06331265cea6575eef53e3608d16babf46fa7f659ade8800dd7d99c2a6e8b68642867f4993768a7aace87de8ae276d5942e90cb227911615b1b82444cbe780b3b627e6337a45069f43f4a57d6d31f634ce5cee45f27d2b78bfa99e1cd323875fd195db95eb68584744f6fea152cd01bc39e488939409549447d07bcd452336e5355ec3e35f76fc0d106dedf6f76f0c7a260e602d84bc1e02fabb21d8aa7d2bee51f133ce5ee76e4b36c7f7e0b37e72d9034909663d0be44f38c834b17b87b2c5a7ebaf9952303bac48a3a0e12fa1c1636202e8e0258f33d39286290a20d97825a7bc9be6e1f7c08a967f8d9ab44f9493b2fa832df6aca93a9883832532f8f868f1d28d398694b970d0b9f25ff9fe5904966e6ca1f8eaa0deab3eb7a53a5c9019e6cc0803a89d62f967f193b369248b105cfd19eed4cfb75a5b165b0caf7afba3270770d7d088797ecca4c6377a68b7519714ff66f2d2691818b8c1ce0aea87bf13236c1886dc599b8f422e5ea6114a42d544919cdb8912a27484a06bb511b0a83b9e6e68440f7fba2068208b84e4c06e881a8503076a5073ef086b586687230910d6dc2980a87865107531509f29b62f3ff52e3c0edcaf26f8c2872677c14b5c337b59ded51dc026eff7f5404d76a82f5d6311aa4a769b16222178586146961c03ea4c1aaa05e37a0f7ed0dd2841f2c970f2c3c052ce80dbebd3d360cb8d9fc312a2475f87c75ed90f585889a81242981b12a930a02b1ce2c6281cd21f0cc4dbd041c00ff6f89ebe6042f0c8557df415ac41565dcb32abc531bcb91ec45aa1d0dd373abe60002fa4929d3e3bb8dba3bcb51d4fba2c7bd9edcef03cb963edb34c89f13bed6b848e2616e595363ab1be17b5e4f9d85c4d13e6ee712c34664c75a9770e381f61dc36bd7daa9a5a6396cf913f66e93ad34cd62b209dec1253dd757224fcb3b6fb9dc5c5375ac21abc0144c3a1e1924419e1bd34f5f500d5b5371f21043b3366814f97f7c48480e9bc87ba299e03899698b2259eef150ee0f2efff40a5583b80ab4849afb5a66b69dd709c3d743b33a4f824abb37c5c7ae6a54e726b78c230a7c23e37677b4ef5fda7726769d4f724f180bfbc3d1e59b93934f934dc0f07c74e7e980db995cc952792f3a84930d5d20efae9d376559b6e6b2a76934cc89743d738cc191095cded7a387adb660845df5faf498e09a27feeef1e2d3a28460f4af4796105f6ebc14358008e7d2adbd58156164558619595df5768a375e8f7ce5108c8fd40e718255b6373951a021be37c94d873af18af7ba416926ff3197e52da969fd7466b9b888a0f1a351ea6591e359e6e3b0e89307fc1bf33f92e341a4b6c2076a5a2fef65953cd5cc5076203e430d53022035df930dcb3c5c583c37c066a38e5ded31ba9263d20c3eb70dfbcb3e2cbd6cf09e14a2d4996b05b90421412793255f9534c346dcaabd81ec779e42be004ba78aecdb3d39cda8c31d02a630e0dcf4f7baffb189e70b111b597cb0aaaacf263d54e7db6b24ae1d1cecff6f9479c424adc45b2d636c3f309664e4da0ce9e275b6b856bd347d85ef9a8ec32475d994dd091c10dfdd548c417a7776c36f658161981c0228a02c9a49c56c166cdbea93469428e66efe853b6c4df9fb13db05f4126deab4c5b81a355124ecc0efcf930b88d551a583cfe893db99523c74 +0x3565d79d701a8b0dc31fb0d7eb545dd3f968a7e23b8a5bf09695abee2f1c8370e6d4098b234189c38bb0f3ba2869397f +50920 +0x146629e70b37d8b83ee828e2b001cf55630e7c131a50bb8963b3181fd500870e9754037122d176a04793d9b973e59c7f32b54868f24663f10a259435fa5e07bef4ef139b9c7d1ab20d46b1581c57011fe0ff6def72837659f113db27c9fd04383521a08b03a58e9998eaf9e833bec8dd76d335d2226fbb682266361ecb46462362d1f469deb098fbf065fa904182b760fb18e6368a73fcc7a404ed42869f942881e7555eb60601811ea1f979cd0a975177b8c94533f5ff1d7fd748ba8471b7ef9c4a0c92120f90d2298441ca5fc02f57f29a2627a45f8d13bbc68eaf4d25781fbae4612c7a320f9719f819ac7f0b491b75a6450465176e5161b8094867219d60e49c9b5476da4477f6e4c847b653ab4407c46d03ff876a7e7997ffae5ccfee5c215a04348f6cf91bc92f97c28b011e7bb1dce84cf9154942094ab908b49635b87906e2f14c51f42a9ac3ce46877b6a687ad6fc08db2bd2471bb97f7ff5dd381ff4897eb636f1fe4d6f87b5fa302a57b26a9af25f2e30ce32b6cc993ba90ec0379bc920a9d3b4de2c526393071176ad0289111278788c06aee36b4e63579095a875af10f2ae035e6e4a3fb294afc833ffe021a37c44a63f61a97ee72088cb7f1b8a2395ba4c4444bb5f0358ca9486b25276b3ef9217e844f310edac99c3274638e30ef82937e159bd9a98ced1471af3a253b03ce37bb9dc0d20a0e5f7900cb1a687568266f640651902e45cd050eabb9880fed397f781ce57e27fda6177e28a0e7ee5789a11cb307aa0d049ef3860d5dc0487fcd514a9e3785d73d30001119717d1a125ec10e881867a44df5885e20815e731fec55897e319996217fbb501a16a8774d0857c0121e59b296430c2da1beb32e623904db496e19f36ef7b1c1a6faea845c08cdd7dd940086521a274afd708ec8db15e7b68c37976d5a3a8bcc5cb8c3dfb3e2ab9c46f3fcae25ed325c904111d0ef156691c348826297ba920687bac4d8092879a3eab89ea8663ee5c906ab1cd512ba19f36afb7b818bea7cd6d48b5e0bb04ca075357c7703b7719a26cd08e053da766a520fdae338cb6c94d3afa50fe94dc1c896b39a062e8e37c7ec5ff50ccbcacce0440e6149f6ca93826395924b0f361a4a7ee1bbdca75f0417803c0a02bb683014300319105a0e01be3d02cdafdc0dc8be944c3c5afc9e38d188ed92629117526eac7a8cf6c0fa39b09693d19eee395f8d7d5f9611ace078be7ce1289ceb6c86681fc1173dca33ae0226b528a8a45d414fa098739126ba3606c2c3571228dc4e8910935285d43ec11b63e34d4d9cce106d94934f49f88fe372f0e08882e7eb3d5a155dc94f8d702574b4aaba0e36103f7fcfbc73bc90e6136b9dd5573f972db543a48cd5fb448c4d96bf67f96b1ed840fec8909b599e314859102e2dd8b4f868ee34ad2329a7c7ac09dac775d4a56aa753059c20b16f05f4d3fe3776cedfffaaa24c3b1b5b05c6c336ad45c9eb686be5250d5b9e4491d8ab64ceadec826687fd1851b338f00d0e25b58d4f600fe6307cdd563b8e93853dce73f7ede9a3e745f2b8fba206892c1235ff1150d2c29d7cf0f466d85c2ed789e09a0063e8a3e0ae0dfc90940ea6c157868bdff69c93fc95c402b5ae91670751943f8ecc73f2d114c16bc6e5bbb98b6299e43fbd1804920f8860d92ac8dc73392bece9741621373e9f7ee5238831e8a7e280b6f0ff94dc6e90c727d96d0fc9954a1aa6f749af91700abe91ea0eb047bbe2f9dc4e9db56a277f8e5836f87178ea61514dc2790e6e5d85935385b9a547033da826328cf699cec73eb0cfe5a1efccf42954624ece2c5bb2a580a313a1650235241b2947c909c8ea40e800cef1bca184fb4153155f59fef46dcfaea705005d7be621bf48bd28aa7b4d54761f115e0c965fab11773285bbdd449724de60c7697476d0511a3384e7dcac8c9c50615262aabee839def82e16dfc25d92344518bab15ebd8b46dc8d1580f706e00d62284824a18f18d710b1947e8fa973431282c5a4f64fba3908cf982ab549fd90a44e21b690064aea0ccec93bd4f1448569741ed1e5ed8a7b58caf42c5fdc21a4a83283b312f45c725cc4098a6adb7275ba9b2aca963d68784cfdcdf85f141893de83e2bca2cfaa1a714ff9fc99bea98e76367df19fa5d0da45d66a214ba82ef8c7a0c335b7fed04cfaa0ff04ea11565a2cf49ce95acd5ffbe3e37d39ae0ef13df427a9a0cb184b745985ad35e479e5436f43ec146ffa626797b35ba3ee9eebfdc4671aa07492984b0e6c6902116ee2e48da2fff537d394a7e1a4a9e295fe9b92e90d7a971cf4331b99a3d6ebe956dba838a05d1e5aef43374265dc983c947ca7b2896e075cb3a8707bea6b65d4d83c28c0ba67f241940a804a4558173b070ba6c14949738c6754e4359e8b128c4990c0e65fc5137468672d69e1c0f219bcc51a85ebb16e5485e4e1474eda445841562afa1ee8e47bd2c59911b99bbb612c357d80ef1a4a2d75c4e23169cdadc15618a17c663807b079c25de24b4cc5a9dbd93a32a208a97fdd7181747dd9a16fde34cefdc456dfcab3c9e64c0558c34c522ceb2bc2f11ee413772990f982b1ac60572dfec7b9ef131768cccf764416d115ad0accb067ecc2be5255177b5d611f72ec28efced5b8322b1b6bdd1c9342c0acd613a608d1c5b4447f9e6861de32319c506a51783ecda0454e5e0576cad9a36e3490482ac32c313c6b50145b69a77b33404cb4225981d62c9e1dd9036f3df1f054fb1394b072c21cb2349ba6942364de285a987bba875c177725b850d50224d993de98d52e4bdf4bc0967ef1f2587703750e7ed2d6409abc660023cdb0a8b4709d95687a9119e16023002ecbe8993a29b2f2c7c631402a71e727bbf866a4495bbec9e2e38d6f80f0660c3b72fb7826e76e8203d4500873ee7716e16f7b872bf193d698be87bf3652f60515a5bf77b5930446c37bc70c1f689268247173c404d899660a49f47b6a2e4fa56dd2991a6ed310bb873aeabd75a6c56605ccd3ed4c875bd2a8346836a4d8ff4774680cc2cb1e205abf705faf2eff9ccb05c000556b8447b7030c67836ef97175e9f4af1352da9f9eecda7a53a3f964f19509adaefa35e98dab1056b430f642bb3f06e48e8eaefb129fd7ef4d6d1aca6433f8205c6132bdc0f10eda7b8355ef81d3fd4196e6f1df3038d702eef2da49ad731a0ce058f130fb8556573beeaed45459664acef4499882487679dacdce4f37d2fdc7cd1a07ef87c8654167db479dcd3fc064892f2cd3835f24a873665d679dc3f1e5955ccd46004ada4d91c1e6a836e7aa2377f001fcaded70135b450e1f39d6c4eabb69e7d0ff8d13c04c4ad2803be1620bfdff6f908c63d73ef4f266c2b67bb54bb1f9be1cdfffb04df9ceb1b246cda6829da5dc2b8962c8afd2f6de1e7e33618d1b64d6862c132e4b1cd5fabad20ce62bd97bce2a3f5ad2da67bb0a7f0b9e48335a33b7b95e77ec4c47e91416881f9f7c23f9bc1918cc644335c74260e90cd7b2e0fed802f19e78c5ed80a431b38630d82f982c74a0381b8ecf943c60810fae90522ece1f9fe7624c803511b8fed148d43eefa5c9501e66f197ba4efa8e272b60303bf04b83f32744a26ee2f8c4715604e458ae83b2efc5202092009b4ae3dc86ddbee53378324652b696ae9daee6d6ceb27bbd30533cb49efcc3e7cf51b64098ed102343d7352ddb5f54cb0408b249b61bc1485b8b85b3d27eb86b033d2ee60ad0e821191b7c6c52ef21ceb87c643d4fa2b1d661f64b514f38f800e367be3b411b9f651fcf68806df8863047746d0fefc9d5edf01e0e0b89be0b5fcc5bd4cef03fbe65c46d89e8610dda762d8b4d603b039605625d3e40f6705ace3aa4030f8cbfcdb9a3707122f091c736d72b75aca5e28aa3454e6ca039e27ed2cabad97b7b1e35d739628ece8116b4c8d0df8663b4e91c4e256c1997b8a6d013d91ac8914fdd9f24f2de6329871f2bc2a701e013ec79d37c6f30b595e71006f8023e40ff7f6052496c2e6ee2972db4aac64d234bb13748a4af36d12969c07bf5b2bfe3048e5907ab01ed327825a4b7f7bb1bc069a783d45d51d8ecd0a53ab7a386fa1f5ef12a17c050953e68b716ce1ff1f837fc33f21f1ce3a1792a2de14277eb97664d4c561b3fd4b0e322c0166faa175d0a71faf47159f12af674684694e95cf2588e046f7a601abae134d506152c77d4a879412d739af6dff56de8ed377e5795566f9dc8cde77f2d891d6a7846fdbfd9a260baefbe56613ae665244792bd681ae0808d148e1c9e836b5af4ef7db43be678c6dcdd9a22ccc659f8aee84f1d0aeda75f66b52395d557086c18de31e69885ac2a0b599f7695fcc0a6fd41b523bc77eb5a9f3d36d9d012e0cf2ac70beb3231bcf8eae646d85958aaee73e67d57f9545d10bb0f206f0b417502bf2c5458b5651bb1d02628be8364894db738f0204e0d4d003ecd88bbd35d35955a90b3b58eaa48f37f7bad9fb0aadc234bcbc61326fd6ba78edac846e4d0b305617692681a8be52c3d795df24d86242d861167b720cf19754fd977a6ac467db188408907055440ca9e81a26cc6a0e1cb1aac4d72a7dcd707e62c1f419628e64813a0f008cbce1c5d17372355c865a56a6deeffdc48b134cde64517ae3ee29d27b80a7ff3da43b8623bfc4943af5eefa9e47be76a6fe6b345c4d70943032df2eed9df814ebd4fa56871639ccd07e710f832b5ac93a9e7c2fe06345cb68f4597fbeda29c7fe15c73ee5bef96485eb8c9e3cd3ea7ee633ef4552f0f9a6f3fd3ecdd87f63a0de2f4a4525002be4c003e6aeb187971e14846b7e9a3ab3ae3915372122d4cd28f4ea2a732f24f7d4eb8d2847ca8f89302b5a99e3a08a9c69a303ec82842090e6a60e0fd0eb7286bd6d52f9716f32e73c937d217b4d27dc61979104f8e6add3625d62a36541320027ae1a023588b9d9cab3b5aa4f875b9a1e7e85288b30c1bf2582af8b391aab8d9816acea9afd6c8963f5cadc65376cfe26c1a8ff444aa57cb67bbd72545c26539a0dd25aa9b6931c8ec08361c746a33103c6c2322a1da1319db254febff1eb7db4fb52fa699b76bdd47da9de7d9a485b3df79b68458ffc06638d3cd781bf42316f48f571e2955d92bc9204fe8d1da3a35abbfa4a9e8900248f763ca6a2b07397515c83681c8a8fc3ce685c6601b5fb32e479a97f3cf4f3b3a9d41e132babc5d9e49fc48620645579926779c1e04c9a30639b6eb028b61eda3a0fa8c52397821cb07a8074f509f7dc91f723b533c9c6c45d88128568b9c9c2c98fa365925ef08b3c537ed9a363bd13528121ea0114c8165ca85da506e33c93debbd69a81e7574b1093875e3358ee475d6b3c0a5215e84fe76316b9091ebe7401fd0b0df61a0187b4a363abacd2d49f3b1f3cba2fb46d97872107687a51988dbbbc0866fcdf3565b1e9da6716b8b5447303e9a49ed9a115c24af65b606413079361964c981e3a0d8dcfb33a79f2da5d8d810a70aa6ccaf22346ac3ac33e750a12527d67d4bf59a8d3bcb8cede678b13120069c6585531552f7df1acacc906bdbef88560b7aada5e0818afc84c01108e89e8cc4cb27c1e6770588c5921ec104922bb76df49c80556b64a61d3cca7b0f57aa0fcadbfc9d8506d3d47ea2d8fd9d6c304178b93ff21b964bc96956541b4706d92c18f8725a937ae95e807d59aaa8b2b39310d9c3878ae9bd516b61fb86429eb25e29b1376d744bcc9385723f6cb90e1c48c0c6d5c505ee2fda8df02f208457bc129786aa6aba11e3fff831e89840e6d0bf0310c51f2f1c19c16b817d8e8efa6ce5cce949b6d735c610532ce3c1d2d587825248301a68ec01a26e865524c4df3b444479a3f65e5ff96110d3cf8dd142871f28cda52b45d68e0a118f4497b87eadca9898378db1c8e45edbc6fa30eec68602112172e638740544eefcda3bec613ac533c5730164391d85fe66f26f6dc9dac785d447cfc34d1dff716f74a5d32f78d09091f4e5f8090b63033456add0d51bdc0166824c78ba1ea62347a24a0f21de89598e2bafefb1447284df8560da60bfbc0e48c0d0cb53adb58f25f1bce2f0d23bd90a85c3bdea4f30ed990d1cdd054ce4270b72113da241ba1f8ad16311050a84a99791c5d4ec922ac8216c564b3b39e0c61f1472320e51305ed6cfc0fbe6ddd035d5ee2ae750a3cc8ed91191b76b0d3e860426786b2072a4c79a5b7b160ec2cb2815e96747befa92bc509b53a42d3d59c15b36a82b612c73d455f2e5f1f56fc1db08220f88800d19db08781093ea50cf0274b3660558c54a2f9a249612332b40d90d16882c2c61de5561165cf93ade1ae3f13b468b6ff38413d76f0fe9308be4ac953565a54c8f3cd61b249d66873ba9c0411cce102f2dbe2b7e40b7f9761819c0410d3c7648ebc1b766f1564e68000841f4f671560eea54f12f3822c59c365cbe911c5121ba1e1983f52b1c2345b1c2c37d56b4af97afe4ff4ac3d4dfeb9d29e1f5d1684a088c80c646205387c8c745cf5a9c2c9f41e4ea90615252ab1c830df4ffcac631ccbdb3f8da7f90de39c72de01d552da7a62fd26ef39200b987ae75420f771f7b6f381f8612a768b93127d79026105c4b3cf738e571d1737db565fc63b554b8a9787210188f262f8b476fcf4a053c1d1c6ec18a9e8cbf3f7a3e401fc471e2462e60f2520ab07a79d6d51591884b57047dc41553e484a9a9318ad33c0ed5ae3c8cc14f41e72722bc2e72afbad568ef96f1c5790171fa2f65361385ed8d5127004711df6c2843ad8af4a894a7bbde74491afb532fa16dcee7ea70deb0da64eb35efcb293d68a6794abbdf6ae4962c739f5bce4a4b0d4fe695e11b540270814941e955b33202b0249ff68fa8fe0ed36c0e26c6a4d0102135139c8b7c7eea56efb8b66a13e6a1012def4741c5509053dc1a2e7d194b448208d58f39be72a2263d0ee940b1c7ae09f3bd009e5688a52e2247b54a0e3934d2f0503bbea07a22afbfb8f4a22351844b248db4edc312b7e2fd1b6db60a164ba47a182482b911f633f64b6ae6cf20ee451ed5f6c8916b62e2cb09aa69835f03671491cc1e6ec697536f3abe873b923678712a28b7480f10ce0aa71dad009ff6ab4e51a4ea4804809e991b521bff31e76599fedd126d8a6c053a581a2918459fe185dc419ebb584c75e241e81d609c8b8d17c886926849bf28d8a1424610ec599a599624746f3e4569f952c2f4261e9d6f691bb79fcee994997427088cb0f0ce364813c033aa2315fb4cd28548b654977d0c6ce2a317c676d78b4ddf754eff6865cfe9a73512a3389a3b35a17377caf44680408a34c98cf0738c7a59986174b2795f6c3bf12f3b27d762e09a1d00de4e4c531b30dd5a997bfe0650f95e8edd37118530010056576e235287e19de82b100ef37158f5417883c7675621302da5609ecfb998eb3e94661e68802a8e742dc40effc765252496a2705dee73d5d479b9a19d8d660a3e5eca29336db7675b52d4bcc6a207d57a90527928ae639809a6bcaa8d0feaf5dc32e4c431951aa0f436eca8e685a39e99e20e52760a62ff33d8e41a0cd5ba26ae9d507ff1bae6d3e5465643edd6bae92908508cb4871483f96cca809b6336251c1a97dce2338e68850dbc2e3b39c03d9e7fa39872a8dabeb0feda7ec73cf169ab17153b81a393e789f998c85d13561460c482062ee43827f0eb8e550eb77e7ce23f734c5e6f79c93a964692c1f7eef62653764647ddbf284fdf60b3d0873fd747e01c6fe70bb2963d70701e185bed6b45b8eae95bd9d2581436fc0bbb10a7f142a58b16aa0cc0c6f8f48fdabeb3f3dc55717a5fe97d143fe48ebadd3ce8595378fc49e115f746e3f3af1059339474d1bbf98f2a6f3be738374327a8c482c6964150c35fc93f9775c41c8c0a0571f2d40fcda3c95baadde992f0bceef0547202324fa1d3225a44e4d0a96d7da2d0f07bc77a52cd4d2e6acc7e1405102ee1ee5fc2454ffbbfebd1c9aff22f149a45e001597c06a6a25b10496f297accfebf9de787de382a0048c08cc8736b7f6a25642d5c3f59d5f9a560e8dcad9875ee51f331e976f4fe821583b6a0998d1e8103df583650a6dbc181cf434d1ce89b5c2d90d76dac00d9b3c6bddfcef11e627d75c40a8e4c88488894ddb13703d5bde6c6f9409af9d65c23d0b150aa0699ebcddfb4ccba8f787cbd42fedb30defa5e1c929ef5e7ccfff640b810b1d8468a3ae0c624174195f218de10b529b12ad0ec4c34e47feaa1f82899015e8bc03d69a054bd8462c9fc7f8d798283253e53d3e914128c36fa2529739b30ed470857a2eca81a68379a2f9b4b0e1d0b464f067de502afd8c3bcb33e57d5cb6f6c0721d0504981521e68abbfe21a449005599f596076816c9e98c89155c735377343287c7bb776b48f8bfd67e31c9dc3fae4aad0dc0e2bba3024f1bcedfe12e7e542d801df706f01f39a912dbe838d199f86a59ec828034420d7bb2b90d8c8f34a9ccd0afc12deecf30b036bd4ed97035b961bfda562ac8cd9278167dee5dbdc1ba753e2420d4ab7f653d0cce6c94003c7c96a88042c8c06c1aad0fc38a3c024c0f9194241de3705861b65ab34952cbd5c673db85514264492c846533ea12a4fd31899859bf428582ab85e917edf91729215f22938880fc895064df7415c5ecfda7c313680eda3224cb1081a061732d6014c2434ff16bd0570eb5472f133f2274f9a9ccfc1291bf674ac1e9f6aca655a12805076393e928d9efe0630bed668e8ab0a28dbbd4507372afffebc2d67cd714e38e367776e34b377a4bfcb1aa24786553151c4d5b00986e82314dace8dcfae2d0c69832a342829a385fd9c8526027306a6c425baf8774824cc1d85be9ad07337415f43d21ec152aaf84c4f9ee02e4117e0ec78dd9cf4fd793165478e1d9462e59e4143ff8cb4c0e692383ec84f1f7301663738ae0be7394e29889aad947fffc0699bee131c66e6fee +0xee6f7213ad92981ac82d431bea13e18259545c89b38dcd3a20906801e1abbcd324ba466f78385f84ba81daef5c967896 +51712 +0x5670f3e8bb9d9aaa95f12f71ea30fab7622f0a9f9edc2821ca7d0968763dc878a1e4931417e6a4dffe9f72c1abdd298cba9f58e05d1cea4cf40758b5de121dfc8fb169dbe3201910b2a7e7bea51dde1048ab121f60d28d167eaf8c94d47eec51485edf05c753e385dc91f52f81f8018935db9e254e05f8c891fe0dca008a1dc0f3735b596a88e986a2e603dee6767b40a8b765bad0be13a9547b4422093d9891b97847a075c7135b2c2d7b917da0327dcac8cfa58e04c603f0ae976398a0450cc1f60aa28f16494ba3eec411ee7d0f88c29545b02fdff91c8c1f6f5454b90c7934750c27617f739f2fb24626e015faa8b9a62da15c57943e515735bfe692d61f397bb5f7930979a0f7ff6997fb71dc26d784f041bc757faf67dd4f6af5338947f9926dd9ccbc43932460952ee8989b4a43b6f758f840a3b7f539271d2aa20f399b419c97b4a1bac3dd5a32b14f92215c26c4a9aeb7c1e6a023f423a22de94e3d4811aaf7f4bfc4774b77a8e9d76854a4a7376d0aa2fe31b01b95adc0a510309b2888ffc2341f4af6963e5f9e29211e6aef96ad3660016d3102a42c3e3a1d9c9a623003bf1bc73589e537c098edc566f52569d0f89ad2806903a908e5951a79831f911fb852c16b7860eb319eca5d148e72393e19f87754a1432da87d5e0eb19e8631b9738115d60b31e11b7a68f00f7dfe8c5e6121facf20edb876ce3c022b33c09a3bba4fc95d8a7da1e7f27086410af0ed9a97be62db3027d0d99fd8fdcf8af4540b5364e7e73c6fb4fbcf8a27917d71e1598576b85f1719ff39b9da0785eb4be5930669765e6a2ca1c1d85ddce71da8f204f1f203421eedccffe5e928359dedd7399d067fa95cdff09fd792ac2b33bea701a4da4b6e8dc8bf91e9ad69c7e901b267dee209b05aae2aff92d0a04507da88b966d599caacd461588dd0d12317affc8493a61c5bacc1d648d3c0bf1ee1251e94fe8bf43ec23939bc9bf769326f213ff882f9c09299417ce2600a119c09c7f0fb36a564b2191fd026d9cc38da387c022a7484fe3d6a56a53501559ea8c6e78754d4cbf10ef7adacfc11f74604bcebce8430efdd446827d8a980496f2b62ad6908a1a4a43aa50b57a709209b9941942a6d80e1668fd8dd9da6a48f8b0b2342208065d9841f6b6259908aee407f109f9e4d2a02a006059f7c9434cffa3252ce3423e81199a390da381e5b093ca07135b28df7fb93923696fedbf9b0c58636782b58f1f5ecaf5e9a7eb8461a97e2ab7eef93af744719b2eaaae3bbdbf3f119698f894a2d842c1bcbb2c811c9592f08a1dcc81a14c584c2c2081441f88c5a41c9e71db9606a0010945db585bd8b6ecec60294ff8414bcae46a1d755ae99a8f7bfbc7c0736a415851e06e76a9f35874617e760286c3ca8bea0fc92bda520c58373950efc593c51c29035c688165d61b8b915925b72462f3af5a2af42862c982d0efa3a5f6e399e0e1373baa6cb0de66cd714946141393b69701994acf9c2093db8736bfa20a4e3b3cf462b8e654cfda9976acc027f1db39436ebabc3a5ec00fa98890693148408f7eb3981068d238eb921a1a405d5fa7e03729f5a4f33b165aed7c374f3f5e1f42390d124d7eb9882e29e418234ead986fe4abe0b174a1a209f9caa1de269c4917ee5987cc926b6bf6d36d0d05567c1b2cde6cf25e4932d1a1510c469271834c6521315f2a3e7822ea210d8f531f3bbeab76f5a107eb6f4395a5b9cc18cac397be541d0ec2fd506b7c855e0599037ce16050de833ad5a7766b5a4b78bd7cadb98819852d333994943282c71643ada021f00e700f83927bd8a6d139f30d11c23066c40221078da53b80bbe127ef6855febed262ac6e9c7ce8bcbd2db19424a18abee60c809c6412d00b7334b0f8de0ee6317f1ee0686dfb2531706f3adf2fcc2705120cd28e476de0175b2a47fc892b66fc571d51ed81a71c899da6f53a8d92a3ddba9b8d49c206ea58c63a6366d44bff83ece6677a71d14d49874d8752e8957fbd6231174b4e7e6d2466fd89d449d12e4cb2f2a79bb93a35e5efcb67a4ab5519088b66172f5754d72e9fec21a1746b61db4bca78cdc22244d319b8fcac50521e63a882e35276fab6cbe37ed16ace6b389419f6719d172a18b5a78edcd6620cee433c40325128008a80d43e0facc261212bafdf286632c21ff20bd57ebf7af6071bd9065aa7d4e6d0e1e4a232c3faeda9f6601ce3d5af8ad91cd8f568c3e59e0771e14de2c3281e18638733f16cd2513178ed085a47e7d4c29a818711805c755dd9f7af513f7c26df8a4e6bb1e3e34c6647a959f25966406aff88030f712a0c78b88e733c795b9184cabcc1fae5982fa6d7276a2276c54e30b06ef1b912d8d3f6821851eb0d40dea6a934df42de7b8b71abe9b1812c6f6ec261a8cbb4e2036c35eb17c40377b66eb3aa490c103b07d0553a52d884d6df228e67b7f9797b2425e5482f421c2546e24a528be0e977c7aed0070547b4229efa03473f137d2aa5a1533da1447bb25ca9c9165fe64531356760968377858c1955af9480a2469d125f2e102043c88b7255be8a479499e3dbaa956d2ff07f7ff8e601b43f1e5c2ef4cfc4742ed8893d2256a902d5648e0c14e8cd0f9d3b087a97fba84accf0247cc763b4de1f7b1423d72d07348bee68268b92a5d24dcfc7088136e1acbcb045e2f4cb8dc294941ffc2b595773dd9adeafaa488e69a42721b64f086c7e70e7271e1757ada600cc0312796c28653ce24813fb6b054a42c9bee05be09714abfd4e7ab9a8931cf67b43f35bc5e87d4c6d3affe98a98d8ac2fd52322600023a07b3285363eec7be83a793b4d0716106e843dd01f17b7b942e22b0b5cf7261000e959ca177b086758720946c7904fe325dfb710e6a2f050a95926e54636776e4fb05ab5f7fd7543b9ca8aa25601d459f4c83d5eeabcb123322d3f6d887e8292df688bd53226c1b5aeac63da62dc71e97de646f695b5a8c58fa6fae08e5fb622529a83a460976c2189802b5b8870771603b25a94622e15ac148ee00ae25ab0912baec8a01dcfd31becfe47b2316e726438a4eea4faa6a64b632d65390effd063dd1dc1549420a5093b6f5f5af836e2688f468994a98fc927fe0b10e78e9fb41ee970143e9e3a307e176bc8c2376a45777a0fa200097a0cc637b069b2cbeaca36d33e27da768d33eee36c1a8499692a258b68ce6394d5dfaab2b5e617414181201ce08294d799fdd041f8db2e78c3fef7260a653bc623b04a01740c81a944877f390f9b1a1bd11cc6959a710c6ffb4270ec4d1cf537f42d287683438e4e543bb8ba03f7b6cdd30f3650b972cae98f730740a94c2c44c7b4cab45c2199caf11c4112762f17580043a425de66d67ff12f4ec5b7894d870ed5b53d773d3089cbb7ccd4ce879864f968a46781b3ab8db0c5abedf04ad5794a0e5c646cecef15248ca07385b7d65f2edc9bb84befd6ad5ee4931bdc076095f9dd34db95c731e79c09506124264db1011e1e7a8581d4594bfab8e1e3455b67aeb0e3058a32859ba2cc713032696b0510bb8130d700211c187671d29e9b3258c927db74c2d5668bd934776338e7bac5fe23886db8e1496034f65260766f91f3e9b072abd82661429fdfd77c9027b97df9e488a393abb9c031e8df1df338d6c380d96d0d228be25a672d15eee0afe387c48cf654ffd5fea68fcc7c6dad9d9d421f011f2b4a9c863defbab72c92f6c58dce7b760465e6849dbf1fbec20df431fa14d5fd88b8deb96769f73fc83f82dbfa783e7c346e63e81040611acd8cd3514622b6aca7e5a8e851967114443eea935862547d6761b495a8a42f14e2a2c167c09921910b59a1bf96d596d923297488220d3bfe1ff87f19c16ae831a3f824e1f418a54f159d4f9ba1a80702e787e736d1f97372b09b29f0e4f50b0573f5a45c5b01c03b692919090c9e1005f3c2890c0287997fdbb23b979de325e4f52396236fe4f0fa8875848432286066fa61f0941e680c79f3d62a9a56a5c76489ea90f39d42c5e0c61b1899acc766ba4dfea44b9feb4af59b8f7d55a9cd4e18b4e31b498dab9d92d4724bb5e70b915470f11abef1b1d3873546ba7601ca48560885ab719b7006852623a4657b558ee9f5d1ca4ade3c448343844857e91d44c0e74aa81851309f4c2da7a924d445addf6f29499b9feb0c8e58d0dd97ea36a1ddf3cab7aa398da63c6d66d0708c4c7c992f601f1dc15e9a1ce7a4b0a26fb70df1905e50a3dec7d9fa67e990e4fdea79cbc90e914ded078b9372888803f41ed7c05fadf9a19b7fa8eaafb880dec3a033dbce8d66a87d664fa68be4ba3901deadbeb40219001a2571a1a75c26ea57fe294da274f5b9fd0b54ba8651ddbe3356ee413023356ba549e2a3d13cd9743554d895e75dd4fed65749341458590fe34817fc4669e520f76d7a55cfe33f28e664b048ff906ae3a3ea8bc79850b2aaac02b944894e9eec7b00875bf5e7ce54d57e4edb7dc55e04e0259ad994e3711af81750be5b59c91a9a93b81ae5a2eda4ad3202c1c454f4df15a8f4ee8c792add52166cce4f13fa27f0a77b1711ad3384b8008a9065d7e5debee5387b019a367e44507c08d6f5b8b0f7ac5ed4fc7f2671906a34dbf4c69790365ac40376bf2a5a3975ecd275877b322a22c1d928914cf7c0efafe8e3998070368a361c7e608d0dbbf76dcfcd31c827f2ab4298087c0d83b4013a5ba4c9471b19e3fd2a6b16c51546554d65209d160f0b965f962ea7eea2043f82b8cafe41dd5b0887b1cf6a68ed63002a172221eb53bf748767fd9d66df1c0b1764c8710753945864573da3ff129c88727a4458be9298e6486217d51c9775e447042ffa1dfa4064216f187bee114d6eb4e2f9aa1648223c1128efe76667ac6bb00b53c1ec5dd9ac3d8e025abc6610236005d4ae78f0e6168030f83ceacc29f1d0def690f8eadab117186db8f07d6f37124747de6d094ed603fec34e0041692738136acfca2dcde35cb2cd2f10e3c52a4a2bd5a2490de72b1b06d3a34d43f47c443d32d6e6932dd36cc193259425ac6d562800a2b38b296643ddabd52850665183b0e15ed4b77501c5e97224f0bfaf80e4b05b5832ed90180cd7ae4c380319578512e8cffb072def068ecca5cd1e28f56479381b2dc1b5c0d4a96d80e2c887eea6d7db92e00ec30b9d1615307fcdb34b63e739942a83f4f149b76c1bbf0d5c9797741c501a3adee7f833ee5d9f4ad8f3416ee23bbfc0f819ba862c65236de1d2a57c3d800017dbf4a65cba759222047dbb84a48a33f519bad59a20f5c656c2307f54b18b482244b235f50c20fecfc05b00ccf2f84d9ce444f967dc561e44782173920b0a48f693b1159145e83bb0870bdfac701e5324e258b473d10e71d37e3620c8cc6598e15371d3b60a13ef80d31096b78e54fb299e668542817787704eef154d58359e9f0e64eed7cb6c709d3ef9c452b0449c1762eefa587039b5a754acbfb440e2e06c2f1ac58b0c3a65822537f7229855bc7aea52622a1fbd92e54a0f8e721905f4f53ff3f6244f1644bc205b9d8b7910d2c09f417b4c028b85c67978102b430752a6bb910f47f67884c7aac52612050e8584fc3ca412ab2c24a77d86d324417f701d1c726f7aa4e9ac214f053f4aae973b348b945b228c07f614b0ac4611b6c6d3b4ed089510dcd2215567bc3789f8536a6bc7f92f0027a7609add68f767f586040aa7c42ecf00da9ac09f2aad7454bba9772bdb9e200092fab63e4d559b9035778ad7558ae9b35b6f1f50010f8e56486ef331ac06f6a9532ad36db9ef21194da4b1e60d381556ed24be14bfec3c6f72317c73eb18187450879ee64f229ce337121c7e8bc4c68e08422967b7b20322d1775f6d293ffa04238755326dae63a0aa5626eb31af71ab254dfdd3990f76f2eec73887e6fd0fdb44a0b2cca5d119b3efd76dc69f569b40dcae87c2d4430c621297844e94cdee6c2c6a243f784923afa02c5d9b3558c7d186fa63bfe9fb37f2e57ebf3bc3210a39435a15e5656515f643ab82d394347bffcca81e454a968e27ffd365d9e2a4e7b531f72468edb3652a42fb59fa2c682c0e064e23dd96b383739a3c04a383a80b8270a7cc3481b2a5ae36925f896e725caedc32f1033ec09c587d2f182326d8ea03780279d2c1f13c0496f7100bfad19234a71d2230a34c5d58f1031cc33c8617cac08db9be1eedbcdfdc8ff7fc220441321f6313e074c52af79e8e8f2e355df93ad2b0086109068c628ff393d4a488fe497d8b62bd13b9a9b6edf7ebaeb1bf12f636ffe26600ea4f6f1998601fd2ee2dcd6a1c7b1110983e1967f5bedf3228096f65f3e437a6f75a481204d9583d9264506d8ce976fbff7c8184fe853a27372118d8026a505bbc517ff1cf8bf855141654e0632a69264dd991cd78bb3a115b1e8505c1f13aafa7b989413ee48ab9f1d85d7b25ba623001c9dcca0add697102363687a925711357f6f688f97f89ccaa1ecc964b15fc99c9e194e31b7852d6db2cafd62e537e174b9e4a2175b9601dab4e44ba59c982d3e4a58ca120f860b334564369d827cc3bd113f6b34a2ec81d840b385fb841bf7f108a169cc1fa1d86ac37a3cb2cfee5e1a6fc7ea6cd4c0c5cb2ca2a0f1d1aecebac03b52e64ea03d1a1654372936545b92bbc5484a59db74bb60f9c40ceb1a5aa35a6fafe80349e14c253a4e8b1d77612ddd81ac53990537b0c30018d63a2644b3bf85a55ba8666d08d874a95eee2019f4bd433f11fd05b6b33fffc5d6279c34f2d5c55ec6a4bd88541749712d10152aee4353280beba598cbbb3df2941842d169857602b15f17db3aca03ce7deb1f3e2458f890c9ccab86012003c89976e2c41fb8e2b8a4413b0dc1d9e8e7d8e705fa9ce27c9fd409e0275c54996f6caa42b41c544fa928b2f3c7f12c41e5c56c910860ca257cb3080c24e440470e951a2b4a694206fdc41a05b1d3ac55efcde2891078f93c50ee33f724a1cc55ce9d30642e0d6b4fdb01e13a726e3f6e2e76b1b6b9ea5608420ef168d09ce10ad60b53b70710b6716b666f5ab3cbced2ca4b41e0acc0c8d37b9aa929d0dc65af4f67eaea7e7b0ab6d77b2c2d1bf042caead1fbce910239e3231ac500cb69428c603a5fc63a55516444c8817a53e7819eb692454a0fb690826116acb6694c5ee9320a1913e4a672c4dcd6d40b02b875965715881acee6b5f65d17c613538ca30eec6280992377551ec72c8ea6d16904faf5e22d0777998f8740a47bde3131f742b7c7fc1fa0cfe2ba2d52181468041811b7829ad9b2d8087f324633e1aa4444cfbbc3f56f02b601df35d1d81d6e909824c67c395826aa07245a8456e267cb71fb1fddd34ff2349ad7073038888c166c7b4a58714c7c1775c0e1e64caa10d1660f0c9efe88185295e8ccf79f1f699d7c5e6a9fa97c5b273899eef47d014c5b0b52a98cdfe21b17da5bacaf75a8ae2db0154ed84bb16ce339f7aa3752aec373480e1f31dc24a48c5178cedf21ec02cef0e71f8bbeb3575260243d36317b1e20058995155e185ab7e3865b0f0db30e89241e05406a4ac37c9667ce79832e056b2a0d34bece84e6a276cf7ac7a0c5796534002780b73e586ac1078589b1901f5a9fe023b69231ef55f399549042e9ec6b08d6aed20d56bf23ca4d8bed216915f84c4a8b8514e71ed6432d11f15be90fa288e7c1bfd45ba0af9a81082d3d818e4a199594b1ba6d1b2f4cd3d873538b89129d7d89ce7416a21718eb23d26c9f335aef0765c4ee8d8d68f8d2d19c939803c32dde2e87554c6e622bd20563158dac2fb4ea2746170d1c872e7425f781d724be2153d772dfc8ac98bd80d668a211a0d1528401bd9cb67196d6fffc098612950a6224ac187b5103c2b53bbd6a7af4b849af1e1cb3e750349cd7bc7d5c0b0ffdafd799d6008fae1be7fa4ce2f005fd9b9eb5ffa0af5fa30da21bf3d177769705b667fa7db285a89d0f76fb6e82abf6f1d84a71b43a6c76a2af89ec1fe230725526fc8ec8b7c3073142108f89a8d4a5640058ba80db76939ecb09ee9026a26894077d9ee096b3937e89b0525aebe8d49a1cc6232d1ae5c0a7fe83424cca33416a61d172edd7bb132deb3e8a0ad24f493b377cf4e37f22c66551df317a564ac4813de25216034551e571a380c0e671cdf0566275c993936d82cb0501435251bb7ea2978683a1b8134f22c57ca5adb727618360ee08dda17ca375deface47afec0c99d8555d397c2213068dc5e1b1872135c55ea6c7e5b4bd7255506644bdcc1fd1298d09cc53f946d825e3a59b7a4a81142544e62f3435f69776448bcc3a101e755a9ee8f77897464688b062fc8e6910a8a9faf668518af0badda3b38f48e3b0a134f43b072fbeec0636da452b774a96965b681e99c41d7382945324b46ead9cfdc075492301d6fec0374b9650bd57db894377a6eb16554797a23e266435d6ab30050a5c747547451b94e99d95e6f7a627680dd585ce9933a20f4a03c723c6a5e30b9cba22137989c0549ea2207c91c018d213f48f7453004be3610104c2e552bddb11ac5463d492577f51ec19078ff20589724b3391ea7639276a6a449a9c79677c537a32eec127871eeac4a90d58029696102297acc65d15e34d84ae3151e488f6486ce53ba612f8375072f81854b87200d7c1e34d4f7d861df2986b116d59c952daca95d2ec1953d56d3e2dafebde42cfae6f40fced9e35df41eda2c259a1d297f0db693cfc0540fd286f705b853aad0b7c76d6420887c93022cd7cca7c844acd71e88a003c9d66b9694feba28a965cbd2b1ccca60801eb197d7e21b33dc9d9fd473920a616ab6e101824c30f62b8f6eda2aa4ab155d443a03a49b805063a282e591652b7f1f5ff0b1e372327756824a1c9677ae957c878d0417669463e9ddf688fc748ba3545c2b061d031742c708ee3889d82d876a433ae7a4d5e004cbba6b3d1932b3749615f09ca37157ded97dbbac7928a061b321b44cd16bcba9a5c231807c423b697117d1e41b3f8ca21a4b42f6e90bbfaac38d9992318aefd8f47019e19a057c0861fc4f5af8d02e43160c04865dd3c3c937f14b5629c5a509346e64eef70f0dc7e51de98fa0e5a528393a80f94c1365436cf75a174ea +0xc966b502473611899aa80eebef4c206fb2e22af4386145cc1e272e2d3ecdebf1be7c21c03a47710957e82cfbeb290a9d +52504 +0x17450948986cda4399d2aa0cd697295fabf4bfd9cb1fd703356f7e8c64c12cd6c61ae1b5708e747310602817236a81e668bf562b94902634474cb09d3f0bbdd1cc2d41cd833ea227371d584f255eb6166fec076cccf3dd6e7dfda6a0835b80760fc64f1a3a460c69f653603e443a71f4a8c3fc26da11a4b9bfc9891d97771dcf782d3323fb6d59403548686ce9c8598afb8c5ae028b2211ef5fa819ce5273be4efa916702f7a32b5dc4699607ace17df518e4c231d9dffa407d6b5a6d43582bb5d83208a3f363eced3931aa2611552fb9012f876219ce454dda64ec2cc679c5ea80478f891692695027714ba0465b3e7a26086619c75793460b1737935872ed5ba7147428fda9112523caf31cd86e2aa6dc01f6cf6f1654f76414d52785be3267915b4f1a053284ca928128d233f864cdb7aeb2098d850aa089c04d5fbac605bcf37e88c2b9a934bf18566596d5947d6d3d51104e8f2e44fff0bbf8a2741507ca31e0a9b9a7979171099d21a159dcf4f3c1ab9a14f07c64541d6a6fa64e4598fdc1343a654b582b9f0ad7f5a82d0c3bf00920d7d36dea194b845e2ac1b5b239e645ebb36c1195738770895a01cbdce2e0682322203401b454aa09b28b26f57b0224799d2496ca09c8ff43b754b2b96a53635531820f5dc5ee12ef8f793e89dcefe160603547504ed1fb7996077e1c32b78f296e5f3c58dea643822a0248e9cffe01229504afd2c340e9ad8e908a8fec9b4002313e678d6eebb0641abcf29fd4bb0842b4193ccc07946e520986648ef86d2a8232a5fd55e74cee07ca1fb8067ba56b4335e97aa67c2aee098f6f9893d6aba32beb0c8a5ce83850efb090f5c8355bbea6a30bf5fc9192ed3698a2a33907d55e61b2f88b0cd24c8d7e76b7585f923c56ef73e71b28f85ae05badc5f0d92c8890b632e07be045e7f85684f94c3702c5d870310166d610f16bfb47501e0e9523febbd36ad971b39925ea53ed4de91796c7fb62f1756e6bd4e497fdc79743d2360cc52cee202b9bde9abc7c09d9d0311d89c3722da36c7993feb42992e913744d2f74a7e0ec986f36cb3f55b57c96efd8b27af71c9d4acabcfed263587ff7ebc7fb4ccce99b22ce204c058996a2a7c436b6745a54bfa3bfae7965237ee85bb934d4b0047eb865092971818013f88d3ed62a62245c76e1f8e702fee27caed96d226030f706c0c9d0c0e045c1b3cab1b02572a6dd9a7f9fe6f5000248e82fdb680f12521d1850eb85752cc4c70ca5bfd8b313d4fea526381a671511af3807ec4a596f95df39c524c7b4ab81187525f208fda25f0ff30744f39b96af8de2b37674afcc7ec5d1ba2ff81dd10d3e83a802e16392a77a0a9f411331292e7d7ebf248750dd7f69768c47970f51bb91ceb86cc2936960d5525aa6e9963130f6728750f31b070a22aed8063507922ecaace39a4ceb9afd9a70c5f0f75943397154a896383cddc189d10a0652a506d941a4a605e0faabf041dc6db9bce8c3ba76ab9f6ec754d6181783bea26056444d7f5c6c5a2f4f10cb540bbe6bbad357369edde84530e16480544d5284fe99cefe0c2ac2e168477df159654481719762203261ffb405611d9cb88462087dee0b5d509636465c7227f4ca9f7c8561a37919d9de5225a56265bfcccf59b77ed18e0df53532f35c5db3681010d3020b8600960db99c24a153e18bf994c60c71d2cb62526e4562f878b4adc24ff461ffcdad07367a1a3b79b3f563d75b2391e770580d00d7ea3fa141804869c33d3f8ed8b2effc9678d4af1135e9deb8fec24018985078d89dc3e746caca7f1139e56945c6d2c8a5148ab1ea07808804c4282c5a10ff3306dcaa5b06d8a66a90671dff735d42131c99b812ad0eba6be4f03e0cb3664bb7d9235d5cf05e5ec4e73123b20ffaa07463650751e89019e2c01f7e5192ecd89fc61e576d91b076167c44a1317a0380551002d2e01b5001952cae53ab97392823640a131d79636ec7d60e10fe202c644db8efb55db3b313eb9139787b3ebfbd0b29832aed060bbb517af9fd68b0b9bec6b4a8191b503dc36e842d3730d80509bf8d26194cc60dee5bd194c111aa501248a9b898b96f5492867c162a6d119d80a9154f48bd37ee6a4f806af6795b73e14bfe9d9ea86f9bf3dbff60cc9079ddc460488b33deea21d194ede918106299be5929d3b578df7889d774b9884b5f6a477d9d5684f24b4c96d4909ba0674e360bf8b1d747ab4d7ea6f1726d07ee50b78c399a2d96c7e9c33c771eff29fe8ccd5c933d24ffa02812edc28f17a609ec4a055cb59cf3a0242a3504df901f469ce422c1124938080dd9b0b31135fd1e9096353f7611261ba8f6030658daeacffd0ee0fae7c07b334d47b24baf4477acdc20be6a6226a8aae69b48e4115c270b2bb229b9040753c284c14514bfcfa0252d7de355e049f5de5bae5926af706e78b7526f841daa3c2642eb0b86d933f1380302569aa6f788167683c66679d3fba91e7424d49b059eeee639581a721df5260b627a90fcbbf9f3c5c012fc06d3890cdf9bec22e2c6168d0d20bd5820ea369f94f2e1e17803a5e6d7f7c18fed1b8124594e1817ab482d712625cdc85c2500053e480ef49f6b26700b8f546a83086e8039ef4afb4b283e3bafdcebd38a6b1be775e66452d95ee6100eeb3e446f16bb90f013f77658d2d35d28aaba123208d4c6ca328484cc6b8f5720bff18607e2f2d6fa30aff14ad487561f039afcf99ab513a9d0e1f2defd6cb60f6210a7f3e9aed2d6e9d6f497a9c4b7019c110c37ad476ea3260f3597a118ad19761e42a9973a151483ff08d5cf05d06ec8aeb8729d063834c65eb56cd31daced606cbeaf784f1e11b3aaa66bb0d562b51de69a41067bf0dd26630ae52fe655e9b5ae946c09383e7ced4c45fffbcdce73003b2a195613391acabe9e86f40d089cea366c65c69026a495666fd90c397437142ed0622856615c27c3f8d8ebec657572a6af234ce14737408bacad6ea3146fde3425c1e9c01a4fc215a241641edd11e371c53ae8a61093731e54d3afb4ff9ba2eda29f16eab4342e161356f91edfe0c12a470336492347a1a120e22bc9c62916bddf802c30dfc7c067d4900766fe707022bd12c254ffc250c6796f7f7bd8b6ae1734ebb63ced692d6d5e733b81b92f850d9ffff953f6a204d0c6c22725d7c2ed9c2b5831697da6c9a92976f1e9809c845d581167c0b8553252a1809f6223cc39bf5b4c2a3100ef299dbe11d718f545d2748dfd7a25b56a6dee923164ab4d2136f32d4e1d3e07c0d1dd94ea379a779a13e59a2accfd5e302bf7014b038bc49059da19b466eb02ca36cb3656afe89827bd43151fcca24364d0fe8733e86e2a6806c6c935a3c27249dcf92aedac8dc76d22ff7742e5cee57711778c92afdcdf36e26b8448504ee6ee48e9eb25b9e495e9098d494ac4ddc4c541f499cdb652638b611b0353090ac125ff1fef8564a78419c57f038dd65951fe06e8377b986947b407579eec1a60a16f540db0931921027deb472e8296bc2d8fb4e4ddf2c27c0c6f49c3ef7a20fb08490c25c6b563fba193ef7822cf8290a7d8f05cf5e9c125120bacd25d93993456317c0aaa82b191d1da4674a8db265161883dc327b710df0927a4f561bf0f972bc7182ec481ae7e23ef84def92bfe88db0bf1b9ebf13e145221c6bfa452e0bde9688504bd18a73b08122f19cc4887a184e2b0a3ab0eb56f7da886939df5a8f31f94372efcde38330f00a9b77a973e25ff9aff12fd85f33afc2a6913a72de4e15ee8a2fffc38ce009929993a8cbe9ea09b93317a4bfd84214e15f2a26852110307b45d1a43cef52e46fb52058b25358bf969fc5c2ebbf49cf3f997e24a18b9c2aab5c9e05bf73a06990478cafe417f52899db43b1e67a1187e43dd35d4d84bcac83b8df4bd480943ffc381dd4eb9f89edc9cfd998387362e5d93472f91174365e0d3fdb9d037ef40fbb6e1cf04f51dcb52f64cf9f671003912564a31f75c3d3e750dadc24d5d58980d6d3d12a9697b529d1806cf0fdbbbe32d0b7aef702d95bf054722807d1ee1b3b544e83ab4ad8def0b90cf9b082db5970e314daaa3f1f962022ed086f802f72e73dc67b9af27b1db3eff1be0a7cd79df565627060b5fb4c20c135c4846801552d9a25022017ea3b1a79150324751952665e8bb840ead644973930a46d13cd8db572525e65408c00cc61621026f408406ed676fa736819472e93c8f05309f9e326cd35d790f5c93372afbf2c39820c2eb3d60b7e21b72a1d8dd6e4ef5dd0ef1c29b3b6b7cabf099eb36913a185a68de6dd65328b705d738e5b0a6beab4f21503652dbd443a24b407389948b531e8f32e958cd36b8be45a62403747297ff7d55f834232c809ae3237a94645b165d0a7cf8352d66498d44960e6665ff4e76596f72afbfd895ee5ecf6ad79f2dd4be70f914ebf23bfc0b3a751f29f9b9314c6bf94035e06d06250480bec39378008b4943b9edba3c42a0bdcfd0fe8e34d2da1bafeb57636e43c77af400f8efce3c7bf9e971daf3cbaff63502ce34b1f6c5b7feefde948730f15e28a5bbe80294fae91966b7142d7eb66446ba616cf3736c5e7c35947dea697151a3f25a018a60ae5b1e280429c5d9d88359532517c13f49461a1d9763fb8c563a638665e5d5b5c95a7ec9e39c6b4198cbe369a3c5b9cedef75f0471f738fe1280edbe69f58318fe6fc1b8cfdc7c6a79b67b6a47e73b86bffac1869e98315338bdb926c0c0f0eeaff37d61437a7798eddb97d19bfcd50b4eb8d81077d763002b594c4c24d8cdcb409e087fc8f6fb718793bf3c0a96f4d11dca194eb8254ca98cec1d8ae09d781362b80950dac26678b98768063e26395cafa6eb7dca125ca3bfdea38f9e8f6e7b88e9e680f37d4713061f08dc812b112276c7e53a182f218346a984b6b94f3f48159c268cad781bc4ffd3380b8e25faa705b59d103ccc29ccb3e5279cbb2d592dbb574fd063536323093c7c3fbf97747ecee8597ca289e3e47a1a12ae3eda5a80cca3d8f8af9fbba1a4c32bc590100d0e44e8c0fbe3d8de6f2ba0cc679ea6a1d5dbfa4861fcad63c5750fed59a9f032da0a2f6a0a6b4977c12b21bb556542cdb16bd324a8d50d1a12dc6b275857d8746681349b14c34c4e8f0b0566042d1f4c97feb6d439c34f3cfe5d6d703e443940384c90fac76661d12d4dd462d0409c9cfe072dfd9131e44afc6aaf4e97d99324c3bebcff8edf1a9e20561728566a6b3d580791075bcb5cd291a67918e18256a09d7a212fd797f7141cd6362d12e4dbac3a829877d5da295262738375a7f9243229e155f23e1b57b15720b9f7725a8e781a0aacc5bbf8da48c37436cb57986c67fd96d3ed2ef3dd1483d82b0e1135f41f8b0236775aa1c034590b0bb07cda9fa08cfd1377269bf7bc076f01d75c01ad00e20bce135e6fab9377aa8a9b844a5e7a6ca6ad36b18e27f67657d6f9df3809dac379fc0023acdce4c3f53c030a61f953f105f9925c44fe723524f2dc07639afbb3ef18f436f3e4b6a26d887d8bbc20dbcead9120935aebbde8491df450fee0f217dddd3624df4377b765f86164a335606a000c47d32a6017f44690e968747c3c83c8816c69c989a66781246531d1d78037afb39ea85dfc3eedaff411aa5ebd596c31ddfd724d17d1374174ef8fa267c9dc0f3f9b9f40208138e7c003933834c7559c2b7fdad48e76ab196266baaf669bbb90f8a5048b7d9d6a708d35bf7b6314c489f25a0fea4e05379b85716f5364745ae78761948a53d1f6fca43e8bb2d8b02d6deb128e08e70b612a46860a28e1e22e755457abe753cd62cebd748458f62814ca4e3fd1baea07bc583e1b07ba5f73caccf7ddd70cedee3279218e45d85bfb0f21c448777ab778ada7d4b704624d97a450ea8a928592c2ea8e88c22cdb7a9770f6b5b2fbc2efdcb99b92d07ccb2cdc4f9394d46acbe2d9ff715bd6b5ccc28beecbcb05bb1de3b274a600fddd5f8da021279f51cc4a4e91f5b403328d16d446dd235cc741f6438843499795a299e081cd6f527933ab369941e9274bff541066d07fe36e3ce67fdcca08df4e68f4b5ffb8ed66b13d594b4e886320a9a90f175a4d340760f869090e5d66407e9d0a7e885814349045cefd201dc487d1f6a2499fb8023155f0f87fbb91e453bcbb45baaa3f9654ace986bccc967fe53b84a837b5a55ce9a3d30f3462ec05817f4030fad3e3c63f5d951b1a926717a16ccf9b522aa996a8d10b37c772e03c723cc856afa3c9366d38d4e69710240e44dc2406396d1951e773f5ecb98a031b7e7bc0215988746966a53593a2d441d658104e535e0b99113df34fa88b06b9052ec2a41b88f059d1a459138cce4d4502539f9b0d20748d4704d564e5bc87969c0b97f0bfae8a0e01be9b0b4c89e9a214bfd096be31368a85e490d24eae7b10329d6242883aa3e56c0e01995d6637dd8ff559cdc0f0d0053055cc142e015fba8b4cc7f60fcddc94832b133a39d3c68bc6bca1acdfffcf81e8c0dda71e35a3f9e8922fa7b0d8a28fe98e465a6c6304016b4e3ec045be838511ce5c0799bbf652ed160fc405db843c01b011965f848ee2e05297849cadaa734dc6bdc22b24b56a0b40fec78956f02d6e391b6a9dc8b5a4c84232766f4d82f0ff5279434cd07f83c59b634eb5cb74d87171ca43a1a016cb85959612182edb7298ea1517697f9344ae9dd3b615b990c1de0284ae059b20db9ad538f441c1e28cbd0627cb1b52bf3118b0c69a23a1c27de653f126341a72399a89a17956975683de3f17badd2a51bda68cc2675a0498613cfe8638a7be7979e71b563dd12f960c7eed6b832946d95eda7a4daa43526120345aca51eaf7a5211312cd9e3beb2f8b1199a9908a38d4a92721dedf5a2beb1f8f01141e884693b3a0f88e37116a919428ec488f6a80d2111eebdc8318f164c38f7a19dada3bb3960344fe84dc2e5a9c372dcecc64bf301b1450fd120a338cc0c83e42238b47836ccc70c5040696e917cf06a2d3e3349d4bb9f987189872b17bcbc6138505ea819c7f1448212b34dbab52df7b3270917817723e21035e3f71790c9a048bc4954ca97da81e88b4a890bb6540ae5487463f02dfa7417ed5ea5b2d0d329b8451e843084a94ae973d32a6bc68b2c2d6b1d3709254bd6ec77a03bd2c30185f2b3853e35d88728ed91f939c42ffae4f256ab9ab4a63f91f99b52c45eb27c3b5cce258cc0d99ba25cae61bdfd37cbba9dd2c795d9fafe2ca5231c453ee56bd3605da775bad10e409f92b6befe27233694a7192e6067af2f57d5a5c85aa4f7d5652ab2020906078a1c059e45af472de1409d486f31367b22797b96549a3748cad3fbef3996c1af093ccfc158f8de0e42097cfd6034af898e72db96f2e6e5853a1199062449492d4467b7c902c136f1e2580bdf08521902fbaabe4ea926f8d7ab89cc9ecb0ae8aac306875b48f295fc479313976f71be0def89eb658142b665a7a25b5f34c2e44e0f7f052234734457fb245ccc9d7ae4d3f4772c8482226858b5c410f369578640af3cfac3cd2c8b2b8671ae279b56d47b91dc4753b5ae55d75e57b1ff72b316a92ba32de91b05b1a06ee4d15070ebd62e4f20057921cfc70b28c3072e55bcdcb00c1e683a27e700dd3de38cee24233114b4ab2e9fce6b041b9d71da251c5c1f7ed914715ef8b8be0b7ad8a9a9c0e52f544ae58a6cc56b553045c7f28fcf7a293a1aed11fe96623451ae2aee2b4a1816179937e0890db80272a72e161274fe400d581010c20acbaad860412419cda62f842807fa9dae3853084b0f105615cfad1f19e736515bdd67c71885131e4e76c2c47fbe9e51b1d5901bb9d0a604b9d7b897e8d94b54917eb5475f5e82e0d77017fe26c5954d1d7600d27adba1c469fda89e4a4e1672b598da80bb343a076f7c755ba682a738fa03ec561596c83d2c29c75bc9ae6054ce121f99b76f043c1f822603855f9bbb51639cce126be5180a435bf7ec62f1a1e4d4ccbbd877a627ee6a701d4ec33b7d29805863fac1befc0b34ad993bd0910200c6290da8b4e86fe41c9cd186164d278a41683d53ff1d9238e2056a3f61081f28d07eb8ae8f94bc0981f149b7bf9a607c8e1383a88fc8829836ab927f7d1d9f67da12e3726e70b8667fb9aa6828ead1084fa35e7ed887733318e638848d9a2bc2cc2eb77dba460902ff3a1f22b80521356c5ef55f42240e1271ff84d4f7456a438e1a5c56dcdc57e5eabecd6cd7b2f90cce8d71d23565fa3c273e9ff925e605f1081ef9853afa4b18268bdfceedbb01935b77f9601914dfb924ebb17b7d47a3d42382b6933e6a8ca29de97bd062e6e0d4fc66b68f56f767924e4ee1e0692fedf5c58dbc074ff3c38b3522cafb9ffc3fd79aa0cfea54d738ce8faf58b250658a5bd7883369d45c98dcd87df3d60ac4c5a21b6e6df67c7bfa75ce553e789ab2230e42bb4342376eb29c6d411eea0c081b3f6918b83d34ad5690f389babbaede6017ec6e1218dff1bad3dcb775bd0e8ee8b66ae6d746e533f326e593f402f6b1e87dbfe9cb7634ad57890d271dd9761fd50d0820f399f8d67b3f8ebb15d5d9f36448a27394e19e6932c7e7d841c6ad838a4e290d33bfd35e93e3d54945bcbf6b7b817c5695e385eff3945414070a1c82ae81b7f6c03fe093e51ba284ab4010e2d62f37d8f803510541f93c21972f2ae4e9ac9923c1a1863d19eeddb570e835201d5aba42e2ca6a74c4fd85481abd3e70e5d9b7dc5f6e2c23d7656f24bb3d94edf70aeddc7dbe390325a818d1b83ac2ef470ff969c22d3c0ec6873e19b5c696110c48b8edf169247c0c02dd0498301d2aba57471111661dc68e5c33dc860ba353051b03bf665394a52014bc29e326b7e6e4b8891e75a13713d8ec36b45594247c8a8cb6980302f2480ae59e87c0a5f8ee6d3aa7d61567f2bd4c4030eb4aea7f5442a2b9c1f000a42b727d696758344809fee589821a3fb68b915f07c78f941ea3d665f48256d51417fee50711d35b0ffe3fc21869abb2eb465051a591491a6731eddd50225d07a8d359245ecd58a2b596d7d83ad5f147f9b6301ff090a305c4c63013b3eb2c20ca29294258e30f92a2996f2fd80c138648a3dad0d20ec3db9c29470e0723eca8e1df1748dc9a21b23ecfaed0db573af740d5f56c3251d1275723d9d63213c42555beca3dd13cb68af2ff3dc229fe8e234a132afcf7a2f66e5c7c8e741e03dd218d8eeb29210ff5a324f3c30dac493691cc2721860b4959 +0xb2a7c12abd0703108eb404f4d038e82f1223f0aa15db525884b7d239e3bef60a5248a66f515dd61f8387e475b4a0ec42 +53296 +0x61aab1e599fffa75f3187dc3c0d03534dd62086688e340cc71103a99144a62e047df5ff90f8b8a26b83fa5762520caea64d3a1d785f8d68badf4ca3366f489fd392ffd797f6b614574c2f7e98da6fe000c23df99d164a7dc7379b9f18f57c51d6020f42e90a5651a4e2adde3a169babdfcd92973122f9907eb257099387bfc89e43cace0eb4380ec6ffdbe2b0971e76b5d7de92ef16296533f8355f30869178aec0b8d57384c9905ffc6028a6cc66b50569786921504850a9418d1c9a828ff66a014005a1ec997ab250a10c8727130b410b06867271d4d72156e4de1bfc09a6529df6bb345c16427095352adc4791ce1b24ff775ceb6d8d3e70c2f04f63ad2d1aff43728563ce7c1d4282f000ae6191e65fd9b84b3d50d77357ae0faf59d8ef059dccd82f94308c0ae120f8bebc00eb25141bc5b7d85d4a52541c98b63f1b60c501e9388d5dcaf6ebe985a141010e2e69da3c2c3d5cb15a4dfe8517fe93f316bbc42f3049312c4112d42796421de7f0272ab158463b1b8bd8cf7df9d2e8ee955c4d054bcdaea2ff22298d243c530cc4ef7e21d66ce3ea63854f6ddaedbe6c51490511e7a536ed859c623ce79a410b11155cf4231bf7ac55d5e6eb27a974fadef494db804a6a5a88d416ad5cd67851695b3fbedacdd6efe73d3e7c6c90bd2892d174a8c227a9785d8baf55008b697e3203aec84a0d1213ac4dae78163de76411721d2019e774d5880594da5f2384f00fb112c71d5429b5f969cf84b10b944bef5906c7f3f46ce0ace48f93e5396b4566e62431a13d9e5563241a18c974442e60f8ba16ecc8f22810aac8181f378cfcbc052b7e9223e0608e0f06bacc1267aa2ac3bf7370ef952a77cb06ed89a84a6483b0b1244c918065ce8d1dc135608f4db15c8f840cd2d65636c7947aa0f6544b625b5db95d10fee39910d7e291e91b77793592cf2d0d3639c2132945f1bc1aefbc7779b4303ccc58924ccd957e06acb606c161ab5e192553ce401de5f8641ee01697ad9b625f79333e9357303663a387ce8284af2c612422afd0eab11188c0aae53e61d56ff38611f2871d69776aa06b551b7440f48fc324eb48286df984b0deccce2f08b5b35363529a78a79d9623ef1edea91762ff82d905085f430d025fca21d96d8bdff991a5d330015135709e81a06eab88d43ad3cd81b3e7f6d86c3e1b88f2b5f54b40a157f90a401cbb7470a17e2df41be4cc4660e5bd6aefc83ccc31568c90db84230308386bad60bc3c6aed0c9f0b57011e4b41a597509468fe9aba3f097695171b572515e6b1a3a412bdb2d05459a0a5bb62ce45d4119b371c2a04971befb88093ee4d160de57bffa219a16dd077bf6f2e2d955af6565acf3feaaef31664bc3d1768cecd33c1404b64ef273985edd9b9e0fc05396077697db45d17d79b5e26b9202748801acda703c5aeb2c7f714a6127e5ebc75c50d2ddf2411edc91d647e9148da48e3057306b56ee8d29da6949b0540e619a476703e7009898f2c1ef02a31fbd22e7a9649e5dcab2e153f16d63f0ee2f2ab2a074911ccdf248a851299c037b3af879b4fcacae614dee900ba61e89bdf34ff9aea102e320f834e788ab9c70efad2e2e9847e3c7e368bcc9713c05e489ffd756bb14e0a6c3516695b09e8a5245becaed9f6cca0e18aa54e76c569d671afecab00df5b2cc7ca6e69b0f29ef104314d69d0f94eaecc8bcbdd0421c707b389630f1ed6d01bd149fbae2ed755114b258592831e6c9caba45ff6e3bb70589aa6f1200a3a454e053e3ec5194a93bc559315c754d8bf10eb7ee23a7a14fe4f7393277c577c1339f001b84cf4bee328b0248e66cabaaea22875f3065ba0b962ead876828b1ec2661e5ee8846596cc0ce7344fff5926c3a6cf23f2e8fd014a297ce15ec11984fb68fc805029d074a6cf675cfaff84cf96b56c036260d2992909963850b68750f6a8f7207f9bc9db1be6bd08eff5d1f780546b8ee1fc70dace99b367ecd159057cbcaab9d768b63c83f964c2bf60c54118ea6a30c21a4c68a33070da93b00314d60a83a6f80f1a0b876ddb14e9dee32ee90dd493b348f9b55f944b1ae5c12a019b192e9241fd99ea8eca9c69efae9033492537221616dd335c0baea34393124e446ee7e655b28a3c1276354c418e60d0e1d70e666af27b75112d17fe3d84607d6a825c2d93dc7f82ab1712367fcce9aa2b89c6cb327a58fd276f13a65433a8f165ea07d29cc9ee50c123dfb30b087f018eb3fceb0cfcfa3df7582e15f82f305cdf0c677fc1195b18fd02da4c73bfb57993ec1d204b18d3aa196ec3d7c9b5bb122e7fe77fb1295a6da75abe5d3a510194d3a8a4157d5c89d40619716619859da3ec9b247ced9840a16891e88fdf6b07d5b6602e253416615e35eec34b980d4c9482149ad1c6e4c266a92ee53ec37c2caeb4a927f9eff51e8b216515e2a5cb6c769742b728dd7d342ff1a820f48702e49276fa0dee0176f5ed6102f5e5c33e61ac94cbf5eca1e03a6fda84484bba7dc42355c96c8c28faac177d4effaf90d4c0a8f306f387b4bc2998bc59b79ebe6b4fc3d99da05eb71e957bcebf7fba6f3d0e1e4a9a3ca4864fa64d1f7efb780349dc168afd65d05c5146acedcb1280deb5ae5ef3ec1dad7739250f8c9a907239a82d7dd25f098b5911240d52f834bd600d260d9773231d37f72a328c02f2f7c1e4887c583927da5dfcd21f86dd72aa9372098c9dc5e97e29182a58866eaf732cbd819485223d67db62c575f1d148f2c9a2cd6e8f6add3acb0aaa041424229eea61ad58d190b69e41f172933c7a2400a30de615d4c88afdae4d2da7adca08b57b9f603bd60b1ff832076de9cf3e905e9011f83516655f11435e29c5cbd6ae7160b55eaffb07f5f02c431bfc12a51a87216d582eccd7d6201acc22e0f6c0a03d2a41dd37c8fdc5308103114cbf342ef4c76eaa7550869ca4a505ad8ba71e6a7348d38065c8830a13d0e5c25e1d724a41f29443ab59f80f1972a92e28655689de3cd8ccbc620e4124bc59b392c5d5f8d9538cd83331b299e8f4053939a9ff6ac886c036ae2e15e6ed73dd799d40d5b7354aa6bc9f803ce9bda9c83351fd7fa9bcb73842ad952077d8c7ff68e006f801d048708562cdfd6ae21460c0e3c86db3353e9f655d3fb47060f92e25ed80c37554ed88b70f538a9a00c44d4671a33013cc9d64331f76587d30b7e8151856be6e1daa4dc607e94af3842a0c587e066d47ed44252076e172daa264cbdb12f14f78a4ff3e36eed7e50406c62c6b8b7a7bcc01d360b1e6099a35408037cc4fd90d01855cd88e16b7bf47e3190be40c77f21cc4cb956c0f4744f995aaba8d41866db53963bb3031f1503bc3a34976837756b6808d41b33522f9b40c44d2827a81e7e03b7444c1a32d3e5c02e5538783012025df98e42c0a352ee13edefe405d44123ef63f13b6fcb3d0252b6fc89b8d9dc4e72c8efb3af0f66afd87e9cc4b8c45631e04049684a13dcc23c7a30726f5b5db8711dff5748bdf248581e59b087a1e5109ef654bbf232378e4521f9dbe7dd1da6209fc714d3d67e205b763090b9937627f12e1a1db14fd7cc34545fac6688a38149f74ed39781929fa92e284c97c192e0a190a474cd9242e6d2ba6bcd358377b2b2cd9c7ddde7b72d09ed49cc6954c0a275c3f9aa8f240242e7fc24269cf7219f24c8baf8ed2f7432445b9cf9777389d6367021a53f2d9f4a3bc193a0e20c29b26690af2e0f825216222128b9084774e2ac3e254f25d49f6495b2be2151e9185242ce83058b08d8416be7f6f565f8092f9fd60c8e89428cfabe76af922fb776e67e2a3f67a8e88e1ce7540c96d7add025d7dfde4cb29fed737fb66edcc59dc9d8e34bea3baf4bfc0d5e117482a48e522c1b02a370e9124b379e1a01e55bc49b8f39da8c69e858ab7d97c636a314c416ad35e764e276c32daee349729739547373487e2ed89b3822d55b1a58df7177a40eeb35298aa1db1b4018ecc9d9a674daecd7e0d6721012e97b72b5e42001ce85b90694f850b2829d5503aa0c92ec4c5762b0a78f1e8f0f89d9a440e14d0ef240144eaedb1cf0df3c556e2c45ac5105723d997c5ec45f578955b963584ede0b5d898a28d9d6a41b7fa81f1a7b0e1ec7b3e55b074d4dc911715978c5500bb940657f84adfa66165defb6de1bb7a09ab9a3c3beef639f1566ca4caa0fd16be9b9df5e02e347b48ece12e775d7004a0f04c93d89dda8a38b7d1a9617e8e459b59f538dcd72c7a8549673a4aaf75ef4c3cfadbc86782541727fec9f87f98fba641a4976ad03832bafdc97534723d986ff43d8a97b69e1621493c5cec2eadc773f514a80693e8123e9c8085e12027ae80b88d16a3157e4ecb7e22f8d8f62d3788e6ddd13cbcacb7a48844d2bd43d48032fc5206970eb37c9a493b144b8097ba599958b97995069161535ee24547b4bbdb3234e0cffcde1df23cfd4590388dce6a7f2db749c7761e1970673af5c658cffdec9e2bda8a4ea187bbe1e353987fe2401ac55139ce8bdc1181d6536b2a312b2fadf64e331185b5af687194022adea45f0ea81da614a85a0dea24c201fdce6bc4d8f5de563d33b8fda534de285a3a733bad4e832b246bf6532beaed56bb80e0720ff542d067a929e704941842b113dd4a7931184588475f85c9815bd5ee19479ba57d122e2b8696f00927d8cdd9db512014f84361cabae41a45a0840c0fc7ffc65c05c2cbe32c7ead255896461f216d40e2fcab2c4637327522910c658b4d87767627eb36493b4f72dbbee727fb66801185c6a5e1856cb95ad30b4b7efaea6d10964be1f9a81387e5bec33200192b38365feeca4e22abe70fe947c7b4d95f1f493eea5d929a45c67a20fe0d5ad2d00413d3cd9ebe88754a18d80f07a3a0fc2c74d2aba47d9a6279a4b4c7df84d305623ea3eb89af3169610a21a991c7ec420327e3e85d2712ca2ff9dcc93f3a742be11b32d111bcb7e8ba5858afecae05e131d70528ee2bbe1d37fe2b7a92d840c3ff3df316dd538683b497df9a7ea2a82a370698f5ee07d6ac4006035480eab35e1b1b7715230027cafe2d48f1de622dad913b21c7c3280727d6b616cf7fee666ac3483164b94f061ee59d073e724910ebcef932270428c9f04a92b873e65fb47a9628b47dd69ccc00097bace8d0e3ec654ea53c9c377699963a106aca5abb37fdf24162d92175c40ee83dac7980af3a9aaed3c38fc38de09a23a3c04b538d6b757636deff106698abf0477878f82765fc5e19498a3efb497c75e14b6f5752c961705d9b7829fba457b04da35fadd9091aeaca4104003b3eadcf4d5eaeec87cc529f3a0aace48191a2b6a4cfa628309e76b38b4c95cdca3abe8e3c8ca269a90eb94160af25c6a4cb1d61e13fe4ddca908066b0ceb7ee24c81f415357b27542eb1615561b7b46e1cb1840777684650389d862ff39d2f7d761507716428795c1fbf9797eb205fba51c33d0fc260d2477d4df46bb307f615e80f29df9cf7a21c2bbc3ec6f256e4b8b38e0a1d3a107b2941c1570792525b126b16624726102cfa19515fc9bc81cbcf09bbf21a299ec85e4ca0b7ead9a6e6dcc7d2bb914a9c9f60b325018891c79d661df1feecd532414e66931dfecf2a20dbc4ec3ba650c381b5bfe12cebbb53e1e7b5d9357c87f56f6157428f2abe079077290ceb6c80ac5c61062ce8da814b1fb99a1a9fb2860ed900e6541856ec64bf19c0d9d1cc2280b7cc50af3e3d2ad8e044945d44761ca60891dd72bd6aa26a33274ffcf7ae7d661b5e651135fcff21aaf06b4a2db18fe5827e0243884f2841760b9f1c65fbda870f7f0cfbd6ff484f0825e688614928f2d12d1e7080ebc610102b78e22299810b1b970f15282e4d897f4bcec0e8282ff67c08f8a0ad27c4ff87f1a2f63672ba19c70e3406337255f899caeb99cb34ec180c755a7c18ec693865c4e4ffa96dcdd99c4c4477ffb1a9c3dd0a05bc1157a68108de0aabc820ffe0310b07a68371017421b9060f95d59214d374e4d0c278a758f8aad1d6c5accc227430d492cd68a012dfbd4477fcc45610046e4f7ee77f35c6654177a518791924b59a106b8f39f0da5cc1c4563c683de1f761106e865399f3d60bc4bfc86e2d0e7cb186dbcfcc3af5222b4f555ea791af34b6ed47aade1b06d37080cddd72520952ddfd889709c58bb965ad1c686b98a144d3afb258070228e4d87276606fce3dbd863c1aeed8dbc3a7d5a652659b9ce0ae221e569ab6988092ab6363584cead147140c3add21c2c576e5029f5a1fe393fa0901dc77d3233764511b3ccdf1eeed78ef35906accc3baadfc88ad51dfb5e3b1f221ebf847ec74e33262a8c84622bbd77f7fc3a0c126cad581012151c25cf85a44472c23f83b6095b6004f4f32cd60ec2db27c84e8331c75de36a663b21ff97d67394602cf58230446bcda6da039073f5f9562202932d9157aece28e97450fa3c3c0e29db48ae4b8485ff12775acd6597ef11e7b6d6a283ebdee7dda57176153c0a3a8fa901acb3826b13b879a6ff5c1f38e579d9a2432760f03204fdbdd1815c6ac3f234950010c467a6194f7ca8dff2534b68f9aa81e48d8f273f60bdf5b713da15020c974aebc12820a567404c69c7babe258533e153980841dd6cf6453f08d4b82f7f6cef9d0f091dfd6fa67c71f5fba8400af2e3fd36f81c7f710b627191e727eb2baa60bd14a6e881b6f39b910382b449095bfc39d0eb11862b41b007458deec59fc430c4787e2ac2dbdc3c3f86dc4c90fec3aca1fc3dbb91ea5dc068aa45672f2a4ee23b80fb5f315ca4d0e5d684ebc859ee77be2f7c95133c94060e268a3bb8799ef78ae4aaf07da801fc2ca9090c4fa920eff6d134189aa0a9137050d8d6d1fc58e34b0a0978d84c58006c44d548a77b0f77d487d0c098a4f15b279fcdc31c30f137f477937301c83ba02d50760b603e0ea1efc9ff278db7f16fac89c58ae7a5fc580f93d5596a9a113df84267defa70a2e0a10e0ba7ea684da367954c98d4c9ded605154ba673307d4c5591273dd6a160c680ca72ec4f245aa8f158ef67541b1d346d4262e4cc39d44dbdd340a2954eccc60795e14f2c7aacd2d23b1a80f6284bf5b0c1b79ec5f4bad4a97f20a7b6d75b61cde6c35b02d9b8d372b25a703b6fcf9c7809c62f112f9553910b53a7abe9711c1c33959a42d0030d6b651bbf84502c8b1b80fb200e18f85d1cee663cf4e3b277ab02d4779cec1ff314b9fac96187f76413dde31c4d6f5853a5beb4d22254a3e6d2eb0c9d519c7427172764186365949a1966fa7e2f8139d9b3f2ec01a4caa9fc2c42aa56114f841bdb33e4370a77a8af64b2cdc054fd1151c0015845fca4592a2fb03a4c4c93d433e97607bfb74c8806be57c98d3e41834e7280a609aa7015e355aa38ea6407f921ba542aed0a42d7525ebc6a2f4bece44213f741e73ecc84da269722bb180a4747d664da7973f90af4fe574c311e5dd8bf5cbbb8491a081a512b0d9438b9195328c60e92df74ed8770f5bedc3d2622b528956465b9dcb14afacb83e9ddc7b3b136f1d7f0798d8ef158dd6996ade3ca2e005677f6a3e7568b399080a024d467d614f2575fe23e5bcd1f3dee07fde7b297f9287cd7b1da767f90028a63a85fb426253fe35da407e27f366f92acc7928a775583c9854e169f8c80aa1780d2da27460a432256396a918c210b1df17584a060b7e1149be33c1036adefaea43ed41faa16949af60ce707787198d672922e92d892c8b4681bbb97125a6bb63a36ce2bc6ecbc93a9b8fdb2c8ba9152aca800d04378c34f86520582842876d4bf6538ca20ef23c2dda82f12013e6d291c11abf735cc393c7320ba61108ab970904494894cb0529f2e64fba396afb4b02d897066242fc301caf23ac14c13ac10795f71d7aeb2d19f0879d3e60d70e08e6d5a0ebb92f5d945da511711ab35b73ac7105133cb791938f8414867ea14892a681dc75606c0e46f4dd7cfd09283736605f1a32c2775a1f37a75d997911d070a8a4f4ac3f4138ce471c0d59cb66f6918b29de83f473af4550b6207f3b6fcf2a56068f983ff503b5c02d6c8c46b5bf0d9595fb0dbbf2b98e427a0441aa036c49176e564246d29682c5d7409e645fba30e76c16d8fd3e9f8176bbb2e6b014d05452a6f0b13d1e1abdc0e131980bab1185e775daeda49d8aa75241d27634eb22d3717407ed0d22b6ef1814e98125e0e991fe7aec539658a2863fd30bfa1dd18b4fdba140ff9c26939f35380d6199476dde9441f712bdb60ea8a63b0578550c334ff8f545eed472d8557f1548414f28c2f31294a133ff01f795ed3f69fbc3e4415b3037bec29c4dae995e723f282fcb1358de3992bd467f84d37ea8df884fa3ddfbeb315284db013df43a189d1e2177869662f873b8797adeecbf3d0e29e18f31b891a9aa3b7bd4aced7bd0082b0d754334059bec2d80382c681ac89fe561f262198a686eef630f240d89602858db0e73ba2ee8a423430297cdf60f39c5b7129ba73e3645a87bf9ccdacc90a7ac73873eb047a944a2a91f47a5badc85cfcc3802e816dad76fabdccddead2a2a30bd2bcb9fb7a473b29cd96377d0f52b0d86abbf66781ecd4bdbfe4ea192f45ceaa241430fe6a2da5c047614cc9f22d287ceb5fba9cdc8cf45f3a978aae4b8e2e40810cd863c6a21a7c73f812b8f2d22448d9cde377ea18464db2373810c3c6726d9e1928e21c6ef9cce7cd31c08dcc54ca9a98f9af17195b07cb466ae704991b6fbfcbaaefd7cec410175312772f960a70c24375a9000a931bca679b97aa6089e58a96c6f3855c1a04871c4d5354a9e5e9c55fdfdc21569f0843fd62b911d75e6d630d0573a1916c18cbab3adb998247743830a0dee7a7df4bdc9a28c1c7480945fd80ff06b9092aab396273867aa9dfde7f885127ef58c454d8a08628574d0b2daeb51c23481de65a74e48fca54aaff572fa9792d94f3eec1ecb2e3733e50e472eafbd53fbb6a2fa4e293d83dc3e0269cbd2681767503df016d33c928e8fe15c456d7c2e29f5856f92712f55754f3f60dac81f2890bf2e591fec5bfcfe39f2f8066cb5d827072fce5a6c45f8d6450ee38723e54ebc65bc30205cb3fcebade92359f691da5cb4491f8d64a8f669e816f9ba2de10f530b8d7c006c6b1abdb16de5265138bd2fc37b68159f7fd7950000aa5b2c3cf6bd774945a964abdedc0e264755c6d1090afe6cb3d966f321c15473fe52691d8862729993028c9dd1b18cbd50cf9d8544542bc507c1002c5e57ad18fe872cad4fabc3256ff32b667aa2f2da097a1e7bf874132d6db5b75115bed397b1e3bd13d2fe3494e0648b3161180a24783f91dcacd47e4deb9dd18bcf5e8e97204c637899c48b8eef3df2240f7c9a44a7073dcfe9db34cd8c619701139fa6c051 +0x4184e0941a1fb27a613f91b6ffa7dd74ec65852fe63e108b94c8ceac88193620a2100d638bac1667072c40d05602c0fa +54088 +0x7e0c3106a5a193b751a3bcf89cd628e4874687fce195c0196b9337a6390f4c0b5bed246cbd79ab944cfbd92c5a8c3531442798a552033484de20d4f9b92065d2ca59b632f8287c854b8899b94de39eacb7288ee0491de576faf7d85a5128dfbb137871be1e570e73957183083d846a3c276ef017908bdbd8053dcb30cbccbfad7d71dc79f7ad6a4473df207ff216a1cbde2446b1edf41e93481d33e2edb60f92516d7fcb4ad397e22dfaf68733424c40227019162900b78d0bbd9ada808ed751d893e31de1709d330be98f89cab071823c7aefad0c58adb09645877f4bfb1dd2570c8fd5822d852154d573eb7d071b7b746b53e05da408e330de833918a6ebfd19ff0b5df6b2569352e5281715ef4f12116bca16e68bd00d22b01570ad3748ba6595e01b05a618704b4238735a12172f5da1deb86db60e18b5e2c58cd3553df182f5957976b2d4a288132b6913157aba9e36162cbbcdcaeb2e9c1bf552a8d08ab949b2dd137d91105181875f0aa3819c1d52fadb98770a6ed808a014f2d90b6d52b6c0b1a2b057a2eeb4d6bf056232bb221b132dcb5cd889fa4bdb4f7b90f6829566465cecf22e40a6d39ff0cdfa9700f4bce88b1e253b24db90540fb47498b2c981cc46b9ec1fd2c2076b5a2a14b853dd5b025b577a3c27c4fd94bd662ef9e3382edad7d14531408a77c165e3589b9d2321e7063f02e17afdba22bf596621fe2896f977fba66d72464c2979c26d4ac40f3521f59e663406cef0867f55c319ece2e1b08e01b7d9513ead2bfe8dfccdb2e9bf388f3c4e3db17fc7496322ede893ae368884a91f80c3bac3505c0dac2a4df9e9b23be06003645766f2d5878d96ddd3bd08c1bc8767b101b51ffb0a266b7f86d9196354478e089ff6093c4e4b2cb19ba0b8ad019698045cac21444c11982fdab7f46e5ea9e683a09e17003dceb1f64c0420b142f51aa213d0dc9d9a16b7453bacccc4c72f14bf9f87a3881dbf2d962f13c933454bf5756e48da6fbdddd2a8f2e028cd56801fa2e7d8353eb5c5a8788cf53a9dd3413164b43da3237e0df042477a90f0d5450f16bfba5589cf892b84abd2fb55b47fd7562fd6bd1fa34e1afa81a28c980a25ec026e558cd131b2bda2d3d195c5b0acef35253cb2cdf44a57b8ea82a52abfc9bf4d3dd0617fa4e967ba4e1a8f538f707fe8df960a943ba6af64c83f620fbad890e174545df9f0d630b462d6716918759157a50d4bdb3e0d2ae764044cafc4fb65a55b0806a8dd202078582dc46e14602c6abfc9ff0cc625d12706f7e972a4da48813915e7f433703fef78460eca4cdc590974f1ad8e9b96ab0df640c4c1241c405d58a28546b96d96ff094adae4858f1f1c0daedec98509c0817b0862020a695521fed86a0438c02c915560ad268a21868bd22719254c26196cde774d9f1f6b90b674df1d987910098ea2b111f7223b963e0b85e60ab794bdb468b40cfe2bc7f80202de2668410636dc39658dbf1485581d00efcde090fcb4435ee82789f62896eeeffd0ede5b4aba6562a3aae729a6d311f98e570f9d0507ff0b3a26a64734706285665b608e839d0f6493eed529470f003d890bffa758bdd2b6d392bfe79391470a3e9858a159e8c4895ee3f2dc0f15d415097218759cdea3a6daf33b9feefe83c7b04a2d5d76a26b172c11a609a7ec73c93612c3d17a73592478cf8235edc00004e1fb478a7fd3ec5724ff5a7ab69cc7a1377666819a83de78d5b0fc7137e0a409fc320ef01f832f916f3574f5e52eb6e435236b4ea31619ea181d111d7566591d2778ea56fcbb1b0d343b5e43dca92adc57a338003e34f2c26a9f29ff4e5806898a544385be829a129c9a7e2c42150acfc67c375f12e65147f2bdace16bc093964f4e81460ee194e9cfd93e77bf7b3e06a939ce32c8331ec2d9ff028973a5e7899bee0c5f94dfefdbf48005eefde2adc9295f67430724417b46ed93bf0f10ecad99bd4c98f784942e34173a57a15241606e78695878c0a3ba6210c74de70889496e42aabbdfd86b2ab627477b56d3e1129f0c3c3ac20f2ac754ef07faa295a6a445058c8ef6e45c19a3379322c26e7528e5a148b18e19bfe94512b98de9bf2c07448f5bdbe1af504122d086138d2ae6ea67c1f48584e74b6a5d0247cf638f01ba936780684b412dec5c79881860101aa04ef3aa7d4b80b490c3461788b90c0e055b1561fddaa3dd6078ba01f7e326fa92c1c0d2628cece4a4a066937f923f3b30c422686436dc46e59f1b5979bd766e08e9aed2fcee34c1ed1beb217e972e7182f515fc6408f452c5f925f86696085f49ed4713131a5f35b55d5c2b4b70e39644177684c4f8f4e846ad5f478618e2b39ef613fd6fb77527428e4118afc46693bf51ce6a4dade3efb2e452aca1e90e544f2c99f9d76e7f7eded42350723bbd5138cca415c7d0c9514fc584907eb19428a4b6616d15e78324cf5a883b5c7ef2b7faaf80edfa08aff566797f5ce6197a19e4bdf3c2efc98c005d46fb4135350dac4c23ea5aadfe9cc33e27cb76a1c8ca0e5968d8612ebd9ffad2c101cac408141a75506bc4aa5a98a321f8ee4877688cee49e097b09a6ac6fa74f2243ed29d11e8be5d8a93b7c3ab7d55147238309ec6a3fd4cb819fa7908e88d02eb05279f0bfe6f73d02f9de1de3923a2dfb093148214bdd5c30317916eac6318de878bb40b44d0b9c401235d38bfd3cabb176972c729d1a341d6ba5bfe2f3e5d862cc68418a22858ee6f13dfc1f7adb690d57a5f9eca80ddbaf9a97ec25768f96a5d9fb83a00c177d6e2340e82caf98be5528e840ddf13acb4d6ada3c20d28131380e0f87946e13f05c34d93821efe7443f56d891f50d237b9d48d72053ac5d307ff4febde5cd1d802782715cadd05973128de15d90505a7505b139293c48862d040b53a702ad969556b8a3d60ed561c3753abd045e7f42302d305ac7495b9e8f6add98d3898401a87023db34e38392cdddc9a646adce7d455a42c67b193a08cffac858a3c8f50151fa70a1e9ca4f6efac2c747650cd25e1d337506c50a8847775a77fdc86f54f7fa5c1b727501bd48c2bab00b100a3f77304f239625cbbafd1df0590291eb48683a1b80d7574841c2be3c108ba8144a5b26f3eaef2dab367c1c62e801a0ab23d469cf3d4b10fc617f65ad7523cdb9a77c59c8478c4d47af56fb18a175654d9bcf31edcd4822acb0a131a53a8dd178cb4d5132a5f7f51f7a10428811d86040f4ab0addad491cc7a40aaab9fd0453c01a6095d9a2bcc5a12b2a8b37b5951203e30a5d3559e85fdbb00e49321921d52e3938a013aa452f6b37282dbe09460b24db7fc17b5f807c57691e85c43b80d6219c47f877492ba2dc227bb2718965ac12424da0163abbf2d933cdf8d6c08bc728b811178afbcab07271a7a208b27e856abc2691ac57f543cfb49f1af034cd38d2112685a52ebce8dca93e84ca10fb278cad8d1e9443b6ffb94004549724af9b8c3beabb8c7e7cbc694d92d35c3155f2f69ad3af749a9b77047a804e320cbd7fd59ce0317757849bb6b36706357039783708acbca3a8fd5a5fd8b550675961563cb8a9701c466f07239f0d95dc79f047dc7b7acec80b670a29cef6138d9755af2013a90fd1c7869f5e45092ab79b24c24567c06e584e6316d0d1d5004b42e4eb3e3261594e5775c4c559ec0d5d70317810621013bade6bf10395d49ef6e8a9aad5a964f4c872c707d75228e63475c0e9abdedc4786280c49307f774836f51e6e94cd165b06a5c4e922b2422de3383d879642978230d7ae5fc5e32fa47204bd96da3208045f7d29e925eeba4ce02411e26e41e44c5159dcc55285703c3e73f1c4345cbc89594550786f8c03db91c5e88a7231151e5e2b121a64caeb6802df757731c1a6427aaac3175e0eb1429e9a2bd060b4dc60bdc7e8bf5b27f3c055b3931030e547d83a2a0c567feb453a5d1d5664b8319ccc06bcbb34c4212bddad7ce52fd05c33a32e2f96b653a621fb63cbe2a7c72bc8b8af76241b2e4ae60880b7e6368e8adc4bbd47fca757c3fa3e29226b2a3c27f2af4e809dc30809d4d965d100c4d9f5b42a6dff98ba2ac9104b43bd5a6c75aaad283a6892cccfe25ad8c374ef4b31115dd7c6a3155f1b2a16db19f93adf12285aac199aada90468fa8f300fec4a22823bdc3dfedd16c76b7046326286f280257db3529338e844023655220e92323cbcc0906a5f6a71ae11bf151395b9574e26a8c67bfeeefafd5280d31ffd7ba3ce259eaca24147e03d9145d033ef5c7ddaa04e6e0c1a1a619ebe8c718059031f756128799c40efe3047eb70029fbfac6c426e112799155bca6ba9bc909adb2f5c0d3f09faedaed0a814e951d5c27eed2892f034c4ad12b5cb3eb4132026815c72f028977607ba9c732653290411fd311a83d1774067605c234a51f551114b6141e7155a947afb099a67741f18f2032148fb5b03222ec6f9da79c78aaac3fee6d1db4d79dcae39c024be935c98cf5765bce3d400f2690d34f9b260f9b3a465922bb2191dd60c3c691912f7070c0fc2a47e2485963982fdb486dc626bf41d470e5656c16e0bfacbab824de949fc1a0c8694a4b6eb7de05e228ce11607f6946b015aad8d9302e1b02e6656b14af158fdb5084daf2a49ebf82510a8c4f640729a1440a1c4b5432ab19bcd15973173315cd6e206b779220b93661c19b45f5a209cef0f19b0fb573b979abf72e327080df39428b6170092a8f68cb71c2d6bcd043939cffc978ec57e29d24555dc533a548894e44718e9202aea40ea9979422088399b8834c295155931ec66a6cbde906ee4811da0005955f9372abc78de0bdb1363bc43a87939d036758f2b4df8ef92c3cf01dca9177ab77da5f135a1a5ef870c8045084004a27d7cbf649a32abafc9bb11bc284aa774d01ffb3e5dfd1515abdd58dddde4aaf7a493d513be3e2c45bcbf715c096bf66f284503b83d7278a5cfedb32dcc7cb461cde37f439c57c2daf435b88687f44d9245598308dce914c97ba459dcdcf06a0781d4879c3e66b796f787aee4abcdf405b1c144d5424b33a7386a12931528141247ceb4c8ab5451a04f1b1b1e7cdf33f1f4e70ec8787e1b678da7a5fa800dfaa9a839cd6ceb07d921835bc7dc0210527e9431a989856c143203c3dbb8248564f52b7d9b33076996401cae7ac5464998d31b09dcbf71fb683021267c760a79991d5802e6c20661d226a17bfb814f734f1911d6701245155d886f3950db38d2e24ab73075c4f0d6d3fa9a2c13b92674bd77fcff2e2c08a13d6375621e90b87687a4d17012dfcdb2e3e590288a15d1362a1666eedbb2c2874ee8bc0ab03c924fd0522d2883bba6dc480f0ad7283c5a9fe01dd60a424f7bafd940cb9acc88cc44047d53c29101823c4a9f90a1b4d7c89926b5d5bb2aa93c0125922a783b1c703c6d4ccca404596aba33beaaeef88d240b4306ea695a680c657c07620ec49f852151e81f38a46a653e4993e126ba0775dc80379d7c9b35f4c324c7fac331ba14daf978d4e439dd7bb0d647bcb1c3ecc3f62571765cb5b8fb0366f97afe4914244fad2574128a59b4f82001c4f7dbe517407adbfe727098290d8ac56a29d356bd68b5178629608719fe70ea7f61c99a78a2c69ebc24947d86c9d85453ab9827e70d58759291830fb1ab0d2a775557b2ee0453e138dbe8111b1f98cebdec6030ab26df6720b1bb9885e541e8343c4bd6814e67cdfb0035f9eff8115b2e54f218109b9217b9f3d0ca9b95524c3c7f6ead3a684b8a8cf943e00a3a8c21304b18881f54b9aae4be894ffda4897f198488e0203b473f7330da6c75cf514b4a399828df399c4b2a7bafccb3f82ea953b561163bada214390bc245379da8ff05863b9f5833832012900aecc37b89f17079c0f894a7a63265f4c214588ed965e79ac9969228b551246662543713e180fa376f2d321299c17f52a481e1892ba77add0ab496027b07e8657faf16aa807e7959345e1ed4c4e8108d2e33d975e8ea46b8c6a26ba71d6ae7f529a36927ac127346d8335ed76fd09f0d29d3483c5659d291c4071901e3a1a87f27d83772ae6472662353fc01e2a1b4395c0837c5bd19a6d1cd8ca9f614d5b36942f88873ce9dfd21dc67ff3c6482d77b917bacf867554ae1a9d92270fa2d911d42a8651253e59ddfcd16706f3e9b913a8ed4b2bd9b33472720958c56dbd2c901ef92d4378763d808bc095682b91569df1cba4efca0db230df968ef9000ebe37f105ee0cab040390472e8b95c1b18e8d003d58a9dbf7669fafefc5405b1a168fe6fb48eb317a3453bb75aa2e7accb94760bce6d88402c9e56f5f6c29f361cdfe6d23ae8da04b586165207170ab657f839fc4dffa66b244c88a7014245d683d09e029bf527be9e83fb0d9823ad7fe499829df949dd8787fafadcc3dbdfdafec390c77dbd838f85c453aeb5cbb8509901b7b77b5216de7c31135ce495568ab74123e88949d4bd92d287fe051914719eb742127a233ab62c783bee0d78902ed3d1bf2f66a00491ef34fdc53114a72a1c4389769fc22f58bf57da5ce68d760e7dfccc62bccaf953c1721fcbe0c45ac33b2ef6ab9239df0c5c56586c16dbf072db49b24a35d09d4b331554d7bb32168322feef78fa90301a2bfe1ee7466ae7a11540daaf77b9d6c16aa403b36a65c1b4fa3edea780cd0cc955d692941d4341e45469aa592a8d8efc91a796259465449cea732afecbfa5a6202671d3d446de883c04d8b0ff755ac45cea674f6e13b88831b273b46841e022d593728a862f0c2c68073e69b861818e4492a05eefbee74b3b4e179465242eb7283d0199e20d5b9f4bd6321c37edeba212cbab1d48786ef73de2a4cc8de6dff79a8ba59e72623b4579ea6a65087af7a439cdfe072300ce30ac1891c92cfa72589ee7b514b1be29a354cc3db094b944094c320fa8e9b8737c18486516ecef845ec809d6892a71b55d7ee422ab86f94f45ac90567f173ffd3e050a95322836948e884a8058373d5cc85adacfa239eb87eded6168f635e7d9faf4c7b8a76950114c6232292e82718e787b188b2137e07c66810dcdbab04078375a1835f34adc992ce849576876bec8e24215ebc50b789b440a2deb1930fa8677c7649382272c7aa47d0881928e55aa9a525b77fa2f24631adb2a47ae12465330af4567e0a8d05457b2e84e39540692052e71963d1d74723f869b79f5eed48cf6842319ab2a58b49b0c7103c952222db738c0fd0a40d93746aee9e86d2125823de8a62f2e2635fa02fc2b48cef348bc3503f1e2ee53d320a496ae199053b9d17b3f172f0646f8b304048f83b6c1dafbe3126d0e55a0e2dcfdd04093fbe0f209431a1e8fbff7017e32a8165b1d48593b55d69ac5dcc298ba970e59ddfc736e8809ec24c7a7a0e099f37948256ef1641911d313aff02355482483425e3e659fdc5437b27d79ef26b4eadaad7938476c038b9a60331c6db9041ae1a2ab2e420684968f5007933c444d7d5eaedce5d4d189479ef8e5cdec348ceeabf33b4883230f655585fc8012b9d22f77d4b704044528ca43563e913948411444ac8519c385db251cbcc2ccfd07d175b8a7ae2f6027407849f0b3e2df64af204e371f1e6d9f867a576d00d665bec9e483a008b473089ef5f560dc5f493a45971b4b7fc30be08fc9a82f2d38f73f39f08b567d2fa76962b7e81f1e53010992ed4e221da408e95597617bbe610c09802e1223621d97ba5a329494005a8183159759838f3def2a866815cb2afb1ece5af1ca9f6dfaae8bd3fa8d6818f255175c29cfc82b0d492470b057a5f943c9ce28e00742e733664e7e7424f3cea6f636c5191368977e9157d3048994afe777a9688d7a8664745982a8340dcfa7e4ef71fef9b6fd5b1e4244fbd93dffc562c2e0983e77027c29f2c8efbeaa741b38ab5948204cfecc78e66c79a2e77fc02216043687af2f74c0bc71b3788d59cf1ea44d5f3127d581faf84ecaf6187d26c1fb74d20d656614d5211da1f629190a0374dea2b0ea2a1230f25c6e4743807faeddb2e9243c5ea2d3cb4d29cc001a7283977d91140654d3a75f25e22aeb122165575eea50b671c5591550b94e94d68f1b86bac8cefefe6cbaa92bb4f591bab271d2d964375637e2b199f8ef1269e5b637cd06b866467f44077aee555bb9d2a950eaa2c53c8e198189c376299bf1c09e74c4f1ce6e8f6fd00a2eee51a1c6028c7f095bbbc4d0bf385e1c88f76fceef9e3f290c994c1c48b73f3f9c288c68b2d278b9548684c0716d8b1f81e6e243db3c1343a797737f82501347884860047bf1ca653dd3e0cfd897bd46f166b8130c0e7dbf5357994bb54122b1234fb11bc680e0b768126d716d5d412d67f5459f0a7bfaf6b04811e349e0ea170d9d14211af6580a73d08f379814d33d56211f5a4f0af7741ee781f8c8e5d5f3a7befdb6f1c8ace8e18cca950154cfe13c6899d752421fd22fb44ddeaa9672a17223d24fd38e3bdd21a5b41c01a3b3c39b3a6998bca7c07b434cea1777995cdafd7a364e48ad9141c4b9b03f31781b5ee314f300d6a285e9fa0feb25a854d0eaba109e54b9bd59d13b4753711948631db496cab238d8dca8c47bd5abc55f8b7b38957ed5bf13d1e605cd1244119b278a802e652f7ba13122332f1dfc572ff8e6e9675c53b167a60aa4b9813ac2f6d51fc65a36dae7922000b68838a9c63c85c85d04bb51592f52b9a8ab04c7a5d1f867f788c447352225aedf15ca36ab0bde89f3fc2040eeb1546d8200317d22c30ddda45891f6cce7be970d6627256e245fc65ecc0fc50ab417b0b1578bcdc23081fb5d48345c17495753d1e7f3e8980c75e7fde2ee30359e390db72f682c2ca0f14b72b60ff9bccd8c6fbd19a512b12add7941df5024e7e624ef23e67b3a9a9ae8389540a95225fada353f89bf163205e2f4cb2fba15aa1267df581b295bb494b35d357674f7db47ad5ed9a69675933422e51a42a084f4a97e58f43bf71203150f33c3a6174d554a82570bfeefb36d2c19c48fb697e54021d4d668d768e00e923836c07df4e51c5a058856f11f422864340dcc09f4c914f207f2266bf3682fa2ead0cc6c8231a91c939d3b3ba9c44d630e3b3fab6bb2fbc08416cd782afceebd73bc47d063c573f8a8f0392d139c54af04d75b1951156ce3d5cece7a7420d4488f33b3680e131584d21bc153f14cc6aeb46cbed24962d0f2798499e1637678ea89f1af81e5ad06379b8a743ea7582bf8a965db74b94dd062ebc2b04b7d6034f9f0508ccc8ee5be8761c6b24bba30fd03304d216f2518d3bbb923c2272660a12d4eeaeb866e6fa70ab15b1c09ae89a254f5ad2130116663734e021ff3031a35cb121b3c7e08ad782826b2120708a4b47475e07b5602b9081036f85a3d77df7b79d68c1fe1e2217a662e5624b23d24bbd81d91604f8d832a18e070e1751932eaa00897d6709f6e564b34d1d499d08c20f6792aa08af6575203f6f646284bb6fbe434d9109874e6745de69f923c474d8c6605369ca6e1980857d71308c5a3de279cc7ca5ec8171 +0x3a8838e486476a517a6a3f4bf10a0144296e631bcb1347f812f35f46f796977984dc7c1936c254f9ecd9469078a72ee5 +54880 +0xc775c7f17f600e3f6f4873019bb0b6056af515a0aa3b7046d4a7ab5991cf543f7e6e85b72c5d0c6d6cbecaccc97a591355eff2aba9e28db827bb49ee82f10fa581c37230ff29da6b370ae2943eaffe5cd178613d51cd1e0d0c588dd4be71f0db58da5605ffadc062589283020335ed0765f82bfeabe56a700be63db34d383f068b1df9de35d1067a57c074bd1ff66e3d9ad71898be10bb07adcd2235382d4451a2f22361a77ef3dabdfb7f6e9ad9c926f67df0b0923757fa79750400863746e226c39b395f9ad0ab12aa6abd7dc545e903527bf130438772f847abbc3f408fe19ff72a0c650ee514dc37fe51cfa42baf49bf81009f1a9397b0a9de126c2f657793f69883bfc37a3ea50903d3985dc39f4f2ac988e7a6c3902b0467a914ec11cc8c28ad4577a0d751f48841eae0d855e29dfc1c2f11cd5f86f1c10c2b3f5eda0711f530fb958c4474521c803fb0fd299fbb9e429d2479aea08846963df56f0a50abc5eb4c1f7108cf462d877a0fb487ff3276037b2891f9077afdcc893f06e8d1e000a4e11f366c8b58231f4206e5b62a88ee277126fd88e24f4c78b7240bbbaf3b0e24619cc3b8d01066103f9c78ff47486d752624a5a35a8d9d606fad67cc15415733759f0034c5f75e221ad955aa7ef75ab6432d719297be574d58e10063297c4498c52fd5279394741c7bc564fff91f1fb26f46499cc069e2081ac8bfc713733b1df8542adb616f0ec809698e45dd4723315379150bfd17a6565e6a8c42fcaea588b616e796581196ec6dccb9c655f8cefb97cdbd25784f0b02ccd0501a0cb6eba2a97ef4a1a00172514ff6cec886b988d7e24b2933569979d20b01f1986a1273337793394460c70cbf55f0b6949b12b98fdcf9417cc27d5890c40559043f4aa703c85e9ec6c1eccafe2ac15772ba8bc9e92ee1ee4ae28410029ee56ea6b2e7eed945e50c71eaf716d574719ba90cad21ae800b16e3de3509f142a81ac5ec70af7f9532698b0370570ddc096983b8ff27a6797da290df19ab24575644ab146d54bb614d9f5d36e0f46e0990a846e60a4498c2417b990db65f6586f8d49e53664456513c942fa9ce57c0a40e423bc054e04d035f87468f978b7a7794b1e7d1e4e7180c09324984c2e7cb548c1eaa6b67648ee3ddb0df8e41992cd135c5ceb56ea5c83bbc5ff2f0440c57c21024db12cb36210ac5ddab313eef433ce0f79a288de630855b057315dd2e2b95a53c15db06c0ce211ff6f3a114f787629f2f9551c8121693f00b141a14b51076504ea2eea2695fd0f1e2ff054e17c0e879550559a791430c82591d27720ace0d1b42c87427989abe458b178671b9b57977523367b2cb7f991ad7d6667e932d010d00d0951bb7499422d8834c07442fbb9f0c67a4722991e2bf6d87fdc0b9f5fb2e710278082d32f991b18a7e9820f656fb6ce9376e11438e79037714c0e4eda2877ba54675621e9698fe7644aab4d2f3935a00492eec5b465081efd4077dde9f1f070326ebbed41342a78dc7c76a8b3a6dbff5023b23a2b14dcf37641cea9099fffe6241f1a91e179495182f76a9e8d2938110891c1ce07877d597ed8795cb392d460bbf0f8bc24a98ae5ea440dab2640d8a99075941dd42d77c5797d1e45727b3c946c7cdcc895555dba94dab63b197e1c0d8a37bf960b873aabe898141fb0a996d5a81b4d43be0d3053f5241adad14190d158609ab3382554815ec1f13808ae51c91164b0ba0921b1269dc8a206e82bd5897d78bc11c47853fa4e733c2af50a1bd31ae1ada7f1434ec6f130d24bb8ad389a7bf8aa2e4af0975b3a346b64e04d4388370aaa7a20d2679991e52225ed465878d668db65364ebd48a48df56254e8775cf8582dbcf26faa32f25e1801d077a3c91f31c65300b334371fd870cfed4c15b5d152bdfcf07b750785243a8c1cb1b8ffb8fbf17454fe7a9afeac5409f418ad474472b1a6a57656abdcbff0012ca4f681261ff3458d511f08d382158d13beac85d430cf367bf0dd846b89df2d7a91eaf1f9263243248b8ff530f23bd5c6aea1d613255d490e6b5825b42a5e5da13904c6a49744f9b4ee5be499654d7087891bcc63c8f24ab7568504491a041e1aeae283bafb81e5a8f9f15b6f63b0e9d0ae88dd488414a81132b2a48cc166db5227f29daecb9f739b5eeece45661cbe2cbf578d53ff3b0da6908f8b11b8dd31e180b388e27ff43fe65da2b19df4c74a060c2660f882ebd7e1e06a2c5a78fdae3385b3ea188106b72496cba9eb986739f74573dcb8c78d934db2d10cd98a3eace297621593876d55d09ab81bb0b972ea7adbae751725c6cc548862b1016526ba59464cbff5fb9eb874da069b7fd050f80b3f54ae9635fdefa0c18d9d84822c531202e22da245f14b7bc5158dcb95a7cf12f1050db870b9899d0ec036b569d613a76db1034b0f2b7b7fec83770641ddfc4c911e06e05e7006a3b089212694ba5883d737c532bfa3e4dbc0defbc29d79fbf2802e1ec067b7f37f6766c15a9b3fae21eff4d80bcfd10429e2666082e0f24abf5ea3d9bb1507ec6a83e7bbc3d5dc911c1866d038b85955d4b1d869c9b4dd64fd7d2dbc42fed63e0fa66a54f4dd178decd10c324c11935686cfa36bf991a1d7577c1a3aea7da974d94f8d4150398710eeba6372b86425829a8c35dba50fc61e37cbf7da342a083d51dfbef5785391a6cc24eb15f0186666aa882e5d5e77d0a628fd551e928c68e403e78de5dfb3cddbffb12190a5b70c7f1133eb558862580ba580907c980d41f559e76896f8e2a21ce3dfa5772bb85e3869200b58b577b2bb37e65878b7253a0dde6fdd8d565894d62310d54df4a4f23f3cdcfcdb67f077415aaf1b97728ca78a1bd16b3d6aae4cb437e53f69b3055edff6bb3e5202951c1a783b486d5c7c10f66ccc702bc82c00239cdd426ed941faa7115b4e5127be27b32b2b6d4ec7ac0cdf7ba1aadcd17a75a0cc699cd1c9e36c31272dbb5d49d410b7edeff8d0567501a1b30179c5291203b8310a9d17178219eaa2b2f3eaeb8f6d753b0989768b6f85e99d6c5b79218b40d68540c1c344768a501e7b866e8f48a4979d088dc5d9041013a532ce7d7d2e9388139cb94ad36943fde4f7f16c97884c8b7e5d7422c1db26bc650541267ea4a249768ed23236a2cd30a0a8b379a6d6cbbd7978db31c84d304057446218b865c3a71887ab0e00eb8cb4ec1e5afa4facb8c9f90b31676ee2c35be6809fd8bcfa9e0d9427b222a48c08e701c93682c4827a2d875515283824664bbd3a58cafecb87f953ef7634a40cd8438c29f487d7f0b654af16d518869a8fbc25e23b83f0511806e23f65a88206615705c1039dec6fc3dbcaa11fad0cada609cb18a6882443d492c9a80ef2b0d14a9de91ef2296458492f7484435a2ce65fd1173e284c1cfc344974a9e0a7d315ea84c0a43eaee252accc4740fea459cd038e84c33f344ce2bd876dc5793c4b4cc7a806f147b2e8e7653e9d67801025ea37bebe6869f536afe6c93f7b47249bee68742676bbc9ea7f1902e158a632139672de0e6e26f36cac26ab444bb90547535385c9a4f95859922e95dd94af6ea57a3b590f7504b34180239a26a76d32c0440f394b1c8ee2d8b92c73cccc2a3a4e0df7dc3bfd71b977943412512ed241b918f21b454deafdca6c7939594f95399fca3ec40e67fc7a5170fea04e4276c6745ab2b822a9ac1db124bb32ed9f7ec0fd1786ad1155038a71aed9c09872c9159471b77c7dc030a72f6a691cf44c5574f8ae55f3cf45354e4aa66bffaa4047d39c0676f4a112173e87a5e93427c6a7da14d73334a2a8f04a6ed01bba0e2b8164fd7187ad572fde487c8fd234e2aee454c42a84fc3600c31330e46f8c3ea4e46e2b5b5ff2ea79e4695050ba8baf65a969a930f196f3dd3c1d533bddf2b63d1f33c81c6681e570d7f5b5c0e8a4f87b55ad1652dfa166aeb9ed185efd69ff64607a364d41c6d2a507921f39030d58607783ae38c5b7f8e5cae722b6346e94bb76960866683e3ca711a2ff21804149a58d81d32b3a273522fdbff4da198cf092b01bb0e040548dc774ccc822f6dd36cb162c27d2a39ba5e6b0bbf1532321ad9abb7fb24360a630b6bf641cb5bd3dca419fe70ea7a861c591828fba99d7e92623e736af285fafdfc5400d7f4279ef5e9999471a12af361eb3f19fc316ae2fe4dec1d4e9d783dde5a3a51d3251837e7e3380c0bcbc2e650bde7c607d622c82741bd9df050983bcecb26d38088b804793bfe4e8790cac9b277181767bf4c97d6e7badb98316b5d95f71e6d25428e6e7599f3422d17cb034fc1daf4621670b7d1e7eac08e687b09fa882d07097e22dea1a420d144894dfcef41364542001690e0e85632191e50a8c723588a7562fdbac7058ce1160dd61c5aa233f24da7c78acd92041a827b70a3c272a9dcb116a66bad643f5be9ccf0cb578adae3cc330a0d5f8efe6112a66560b41d27e605c3a55a1c67422806ee2271b0a2320106cc68815d844ced0ec8b74964ccda90b99183eedbb99c2eb59af4762b9143324598684e901bf4a8c108ecc59c26cbc314a7c78eb40055573df8ef4291ff155fcfc292dcc0fc0079728f8e3b22d301655f2ef9a46de5768ae8319a3da996b171ee706e93b4cf774768842515bf7c845fe34da297cf0f06affc6d7ed03dfb1e4ee7cb85dc363b62fcec1037ba3bc95d9ae52d49cfa2270dadc2d3216113d964e005fa5e1d0ce8c87f465b4e925e6193fdb0f576b4aed4946e828c0d5af5d68c0d8f2581bfff7fb1b8be8cf105f0ed2e6f8bceb1aebabfa1d984bfca21a99a9cbfcc76772bd7a8268f9ccca97bb81437dabde08325908f3fd60f95de20f7ce9fdd0513c7c85c0a2dec2742fc5c7f7fb5258f527381f6ed734d6c36d3bda91a9a4f8324f9fd564ed1b7a81774100dd5b038494d0a2ab5814726e4c93162852597fd8bd296348c1b17d8677299ff2abf31fb33f8ce8895f2c249bd777e7655989dcf684425d4c71a0937ac7cf2929ee53e56947c49035de9ec9f3f674461df1ab5ad60a42e45cff3aebdbf5c072f30eee231b6000304d70dce0eb4c20a8aec54e67fbd1739ee6c4d0e50e73b6040aa832274dfad83f1c9076f7f62af595b43ee382dc5c7cf3966d032d96e41862bd24b080758ab5134fc7ed8db9257b83bae8fb39fc1dc778d842521419a95005a71ef9bd26921f533381b0f088de1af92f3df60bdf87eba528ff4e36eb46056334e16e3bd5937f75844861ef09876c6c9db884670b4d31ff150e4814a03c911203369e9b17217e00aea660c79fe3e86462e2f6d9e3b062ed08c9e02bcd1f9b887e68fb494fae638b0f063e28d05607672b47fde30d73d6f580eca6eab6418d3d230314c503acf85b41f26a713f7051fb5341da00fcda06bf19d0fce01064dea68d9f7bacb7af8517d3f5763f31a54077878b4bb216859a904001529a5fcc086b1a98805ef02892373189e1f15b776b82146ea3850ef8db1f70085877f919a2e15688d35a219ab84fe71a1e2611592ba1a67671e83a9670c346507f0770c036bfcddad53ce0885fb86140bb4bf7ed193c9a3d475a2df0c4121f7426d75b422c4ced191665a18411073c7829d17385bcd98c1d94694daa7d8287ddf0561d320c1f30ce1762e8e044b2d53aea6518c57efee8b1d9843df5e5ab0c185c123af24ead456448c32b5f9351c8039d655c2ed8232c749739639594e2089dda7a39057c8d77762ae4ed44555a915c8360b22470dce3e04df752ec13ce29e8fc2cac0e1e26536e4e76a3213333adc06cc5bf48a1829b8f7e5c808beac5dc842177e86e9c0e75c723c6e188958399b98a22e7fe12cabfdca8c770d7727f9ce9eb0a82997ebc3b1b3b742cecf4b0c1b29c06a0c72d0bcd424dd6b8615341e7a4d9431f214ea63fd505fce9c0e941d245f2cf9e3658cc406adde8ababf5c3492f4cbff2988452d08f03cfbca6ebcd27ee2f0c14ce3e82b5c0e99bdf39e26a3df3e5efc161b858b9a3c57af9f164a95f05b14ac8f146d599bef16ed77da1ad429d0540e00f331e47adcb7d3642fc6cd43729ea1f31fa2b78ef75c00909ac02d3855b51f313bd19f7177645062e0b9e13fce9887c12c0fabfccf73e08306a117d3738916ef19ee2647b5670cde52aa3bac18094842653d9eac1f63739b4844fbc4d2d9db83b50fe0c440c7f123ac214252f7facbbbf0b3f9678e34a31f85313fd11bac563538bc35afbd8ce67817a65ef91472f877f5f922f5c4ef5656e8f14dc3f60b6f4cca7d8dd2d7bfd224bbc2f7681679b7bd9d98831e6a9c7689960b8b610afd0e1292db50f334679f70bffc7568a617f0d40f1782aa2841ea01ba076375008a1bcdb95de6db7c8c34a44cdd41c16c558b0574fe8960a5e89a037a6e3cc57fba7ec6668cb8525836790889ecc13b0f3a7098f4d6ff098a986edafec77d1b30961f45c2ee2c20706e56e39fb15e9d38cf88d5b6264c6d7e5a4ecd6f9a903dbb25e691f50dab0c6b3bb37fb5b480b18e1bb903e376d7542a352223f570dcf3c770bcf426719edff1a67822f47e903dba26ec6ca24f0a863531d225b7cfc907fc7d87b47ea06b61acb68d158496f40a63f80a561c374cca4856461bde42bf3f0456311a24247c5a4173daa08c8416e0329af90a79b806ea0bad674d914e26658403a06e408537925be5480a34d15d87cf13a3d0e05a9eac253d1b02f97d663f278abef8fc4906d1a015bd9da60430c6e16beeef79a47dd93f0e4b833e56e79692f571ff7efa50deb80a229f07a5f96610aac4b16d1e0b390029e01987611231704ca3cdee1f7c824ccc6059823c1f3006d90c5ce450b0931195c00afc274dda67953ba87541f48504645d133c520ae96800ae3905c3d5b0195ad59ec72f01571fda21d93be71faf87d90315606e215ce1259190f9fee059c181051f0d01977142223da8679965c77e3339a61419ce5017529fa9e8893b54b1113ad3f92675f07576775c21e02e97907be60f80da798cb28ebfcbf9ed4c6990125b04b025059c62ddb73f9342e2e566b8f499ce3988d95be2d94054b17d62078d50f85d86ae3db15fe597e249e97aa7f24a8923be64ffba54d64e225d3506bd8801f726d2d79a0a04e9ad397dac1efc31d02aaaf275c676ef9c3e8b7adb1c5b0e564b3390ea7c13d5abc9be6591980d7e6ec3885c23f637b81458b68fd96d8824373bad484eab77d91333998901b281e00c9be885d756a7b926e3cc2496c1edd48c0ebc836befdc180a32f3716532016092fbf0f3f7af6cf9bb29f4c17adf31253d0d87c7a910eb9b760ff4a623e13405e82bc830edc92e80b97057efed91fd203280379f70d54b694113c3afa587c3d7f77399c41f6c96570a011c35579df9cb53aff3902807a48a5183891451ec55dea51b8b35f7604b8594246c1c20cccc3089e1e424396ea00790aa6d5e91d79323db6ac50ddb6cf61241206f2bb0e61f57ba5f32e20bd2e5e7e4cf9814cc1224ad82a970d3355a3f07f73f4cea70b39946cf72045206fb1b32373931be6963b2848021b3106cf0cd6ba0c72ce1c6fbe307b16082fd93b1ebf1703161e4d293e2b1bf17b74be8f74946230136991b85a4a24671d66a18bbfd2b77ff500f6e6a5e3b25d6a30c11365aa068359399d81a851d78ef2521ffe2f8e834eb25c6a5afce2a9ca5a0dc4f77a98257ab6a6963822e822e209aabaeee84308f3d0992df2cd9870bcbd6410a80def3d8aae492268546d9504e5a8f8fa74a0c703c23fa84a7285959916cc5aa1aa0fcd37b299b87ea7628c5bf905508d4f283bf319c86fce963a8703f8bf0970d97a43067600cf07b657977bb6286833f249e64649bbeb0ba317c371d5a4939216cf3d7b4b26ec8febbd34d8cf8a967ae8764471d492b06e13ade96720258f91ec7f1b0aa4647773c223f2f797b461ceac3dd50a4cd54672827d57588aaa53dcb4fa7a493452265fd40c305c913e60abb8111684050c13c55a06abca57bb96ef1ad1c99b5d684fa09bd6ab7c5e71099e86909753bfafbeb314ca453129d1bf5588958785a22f79e2742392eb5204c313b22cc60dbf289de84d48b2317375338c889642ac85002b921773a50e1e5223a7a5562126961f37b16df2712fb71eaa10958479647892eb3bd037406905f1b1c6ea9d4722c6ec22cae16810908746797e29c09a321f501f4c48fef390bb6be3fdfc729676e427d581621a0f1846852811dfeb33b9cbb05e4fdc2b4cf9b11930b955669db7504ac6614a78cb0b87534c980254c450204c2eb3245cab2869823e957ff9cb58bddd8c071504e30ecc193d6d4badca899f7bf7229bf39c81475f53fee6acbddf6f588cdf4c6ed576877fa10e0646c4eaabd84dfabd90afb8fcd9276233efe3afe7344f567ae710f73bdeedf6ecc021e7c7d999c803b44313dcb80f7bc233bb6ed8094a090b3e33f56bbf9ab4499a9005960870f708cef546894492981c38c3809430136397b4acf5a9ba2dc2b7466dc878ed5a24374144b565374733cc3f8a99ce5121f28aeaea6c48271daeb05439a4f2e0bbcc09db9fe4f2e8a3fb3ce87efec8d50c426f517aedf9aef0e4cf34723f968b1c4b1ace9559d4d12f4af8a42f34264418bfaf88ecef20ba3de16e77a5dcd665024dc4ca93887d994f9f89f309de5926fdd6e5e1aee44fd16b31088e531134d6f430923038f54fa99b856b65ad61f3e622348cfc4f61e97cef6047f8f871248978902d9fe424dd7a8989177c6843690a0c351f593cfc801550db8738148137c4f5e8e17a239ba99490170897e9073b1b32751758f5f8a643362f40dc15a5e141f2a7485f85de367045bbd958ae31ec923b510fac08face8ee5b82f559a73b368f557dca07940f6a620f3e42f0647fff76d7552a2f4875b4106229d25016f20b2847718ed8c787caea83bc39bafadd7c36f4e9ade3702ff121deb04caf8ecaba7169187b71df94ae2520fe21f08f8268ea73952ce4f020c6a737e00c7df90c6bf3213937dcc27c3e994ecea3980ab4ea1bbe1f4f3bb1905c2cd481bac23e014834d89e6a215a87a4d076f267bc52bc2a503c4fbdef9ac9da371f5bfe8745ee76bef70dbd468dff0552fe33146351e2511155ef1f08921269517f357ed3f61e2019e44fd755452a8ca550595296ee6d87e771c51c8f83b231005cd8e5ae39d86ccb092c625569525e53d22ccb5c11a7f358f89b5d8b54f259cf1f0dd920f663825ecd6b034fe1bda6e4ee7424bda2d6beee52378904ed1a0a432e9a023215088b5a97d6644a95b38ade0bf808c18a430f31e861490236726be6f2470aeb7e0faf45d1332d4e6d7e32cb90811d71af360fa820e3458e1741a53fd3de965419c015a9e24b06645165c732e7d70bd4faf6e6db638424af78d1dfd63a255173cf62e60d32e6959229af719c77c27bf253cdbb521a0b8f6e416842348de6e052863f49fa29cc85e2dda55790a80a15d4a301b696ab412dd15a4ff6e035e7eef9279d67f72fc47c5c558fa296e2768081d0db012e80eea7e3abce22629bf1216e9bc5688cac97220779b579368dcf6501c4a3c1a2ffdaa4a91c2cee4326cb21bbc8ff7341080d21eb325e05f911dd6b5d65a1217b92cccd2d96b3830a3d3f97e89893b09fabee1e1066d36e66d7683b9c9d1d4740a08dca76ffa9093f4a132b +0x7dedb138a250a3ff4325116aba68c7b45f21b6f83e1f381ad1df4e5b4606e5ad365728f3cc83a2badc8cd25bd45a4289 +55672 +0xb7bd0f9a64f3f398ae90ee77e2ba58bcc82ecf1f838f3785b8fd002ef2eaa730452980243248b21fcb2083e417aad657b815f135cb158403107de7444b10a4efea943520e7290f0ef0d9df3dc67013f5e38e9cf25ffaf25d143959fb016064a5ec26b7f84b3d104d65e389ebb5b4177c8fc257be06e78a7b0c5addbbdb81ef3894068d12262dc0c472650957ad1debd605d8aa01878453454007fceca21c4d922a5d3fd840a0245c5f87e8e8755396e98df91d23ab7855a4f7693df61ed88799f65256b0613f46fb7373ad05d7ff209f6e4d398c3a6c987e7ba82842175ea3373f0e590450b22d8af74ee01899c992def2fb85a5fc0725bd12eb45365555ac534fb9d03bd6a0e1f2334309888458f3905f2c8ad4b8f20347055a1d3b9f66a7d46c7a43bdbbb26b196f77b1bd60554b9cfe07ce8238d43a069c1f37babf399ea4df793bf2c78fd2e9f3155f1ff567a2ea17b5db184256d3e01e5f1b197b7598aaf0df4042c1df1e4906439c160a370162f25d39fc9f20d5bfd54552c29cc29ecee6d4d815734c5720f229ef0a696c6fecd6286e9817d9488a07f6631beacab7f80b7f8dd3a37c8658fdf1e063d8aff5700d3e045371293429fd9dd68e2c32eb10a509e6e41a17b3d870c0f78920a89ad6ddc6839477baa283ff6034812ca542fefd996bb0a0c6e48893c1bde409fe66068fe871c5ef3199825467045eb0c9c5aa5b58a5a0fd312350ad19b9dc5a5a61e86ace584da239220d46dbce8c81467bfd066e1b1af8ff771808f374dadd639465b89dbf945878440c1be41b7367c56ddd480255875ad8e9c8ea75744458c20663bf802f02d89607681ca9717b29eea133673cdc50eb667f489cc74384941ebfcbc99d2fffec3c730791535b0c916821e8ac4537db734e4380661269005920c8861c1c47f35a1291d2c2095e8e65dcf5e25f45ee92ba3b3d598f7e6c226e70287b0026ff46ebbf68b1f6f404696ef1230bc8638adc87d374b96132d6519db5e791bfe3e06067ec008d773cd4057450b54a2fc89220a4bef08a22572ef4ac970eb2a07a71a99640624c8b0856cb3fa0b286db9c8ec8d7a5b9b21b14fd7564c0a4c5ea133a8a406495d87b801321968a23a91506073be930d81b9492ca3b8dd5b1b1e6d8c4692cffa1178fce927042b60f9a252e84e1a20654abd4f81daeef813e60dcef96af23ba8ff30e175b210ccb7e41533d8d22c9d0354c256f7e36516a51b9138039c5ed3d66534286f79ab9727986e75baa66283583e5cd1f763b7d38f5a4d5b43311522f2e1e7140ed451452065128af641585de475d152f8c2539942f0968b20efd1a38f03ee470c589e414308a5f624297a972899e45c8495c4e2609d015a351f00c01b39ae33c08cdf05ffc19d49bcd545c9a4f8fa511344884958ae224af8552f1327f1ab5cc3d7b01dc74e6cf838bb565fea3187d33d552a289ba25ddfd318a91735ca6a449ecfadf329fda984206208e458c211455b4e072aca28288b6dd02b46a5326f6db9eb2520a85db76ffc6fe9d181392b3a05a5cbaa349e16c01122122c26b82f4a9d90b220c2fd2b3e351b85b1e3e53a23c4e2c4319b82bd207564fa221ada2e6dc286d16dfa4a8951531b49000174d295018bad5b4f54602f034f4fe301f6f149b1040f82cec4365bdee5c0465a6669004416c381c0a1c44e33178fc96cbcfc50f1bec8e9a108d6a050e177ef6f2871e8150ac33fafe94e008d74465fbb9ab4360d0d9a1d2176dee131b4cc85b03991cefcde18ff6da951d88adbe0009f0ecd4b5b76ff87b09ca370f9d65a83be182d276407214b7a509458b3b4f97667878c13659175d3eef8e8e221ac9e73e952c883c32c98ae667d79e380a5ff0ba5939520d3d3796c3d0a03b741ce04d0d267d866c2b4db92a29e771b8a157d5ae9b16ce5fec396cb1b4e8862c2a12a1509c5f132cb166692cf2210533889d0ce947f67f57ec83a7b1a34eb772cdc7adaeffb979a44e7c6194ca6da4d0489b5d1465c3ab1ac77f0f6aa6ba15708b6737d05872fefe89f76a09b9b394b768b892d7fb649bd304936b85c414e94bef5a085eae74eb5fea404c33c8db1e11705b71d913c197a82c2985a906447b2e7e08e8ff0aa688f1fabdcfbbfecd8a06e9eec4c3b4c2e6c1c6a8237f7232133fc2da9e5b73f01cdc40d7ba49647120bd5ad8513ce74fd2475a780eae13c7f9a64236f41bf13af14845f6d78400af285f4b81e1edb350a16271010edfeee9748c8685b0e78c6c4d5c8f83ec15dc70e91344513b7e20ad9c3992aaebba0d81ce1917309b664d6f7940a8e4c2a3009aac02ceb02996364e0bf545dd6ce677784d747c9d7d413b29bd1d188321d77217b953700671ddfe1b36bd12025a0c34b43ac63d361e205f83601b65c7d1593ccd582fb3bbdcfd7ffd64ba827f7dd34d1fdd36e36245a9bf65ac61191799d066a6d1be1e37329bc1dadf141cbd9de4c9a07dedf588bc8765b8e718bbdd42e5f6896b2739e23b62cd9cedf2682482e6b01e6312fb12496059625a67d480953ff65d6f938c25bef7aa29d77cef1df3820a83d8ce7d67b5dda14d4d77eb6857876d0c2529a0668505606be5dc380eba60e0b6224904efc7a5475f076f88fd5364647dd512fc0e5632f8485e37cc609d27399f89aa171249615382d27834a6507fe298c7752886fa2679aa8cb8317c65801e26571a3f3801b8cb9df4ba75ce157fef45437bad35398aeb78b584f1c8da129633d2c003c9b953b998b65cd6da6b0d936c904c1282da06579a22c694aec386a9ae44c5eb2d37d9245b6087dc331ad1d7f5f70fdfd7a741c4f71ba4a095e9835f7ff3507fcc44f315cd3a621141ea72c2c8c0ed9d9b66e43a79e7469fe515b2c18e288a480fa74993d88c16fc6ca3995dce330dd335e096c107d0d518050dbad6c32a9acd5c2a82a6639dca251d0cedafed9798090fdd0062891c79945f9945a70743a9961c93465657b6a715baee17c00e36b5c79025ca24e814599a5a83f83a40b9df2cb8ab3fac9a1fd553ad11be981a568d96207f9b100a009eb25e927d9958d56316963a13af15207b675c3d8b40f74047fd27b41b2cd8286f64d38d7ccc35df5edc20086a68b001c1da313a25bf8f3c0c850d8df3823ad3f539223d9cd9c11ff707bddceddd5409d03392cf361dc89104b43bcfcb1a194b58b8b16a86cae2dc571ed47f4318e781d0fae9c663628c89561517454afa5bd6bf6ae9dbe2a78260a5a9cfba152152b1e9b89de55697c26a2b2d0ab6192ceabd52d5325a577688f10a3115530bfe7ee141f316f5b7c4527daa867de9e0b8ac483b83f5ad8d41dcd8ae3d0e12ccb952590336bcbd2def230afca7d6a746a48bbe9ffc989d2d0f665db85522c1015ab5605506f70761221f5948187fb8f3fa6e69a9c685f2dfe90ec75101b92651e791405fed2f99fb642db1b762dee490c23c8f7e6b22744ad6bc60a0ca3b0b656acd3f4a72cc3ca2be355c710c5df3c502df794973d9eb17de586ece371036e4ea51a63e1e36b8fe3620a09d9e62ac39c43e6f3064111eed09ca3a02d1a06f777005bd6277d5d5b8d7d4c663a057d8950f41b85bc831d67560fa0c651e5480c603d1cbdf07125b78a63a15ec9ba33f80ecd09ef326a3db57ead02c1fa8923078ab9d1add565311e5ad3ad76017aea9a361d3672007cef53aaf35e157f7c346367051f083ea01c0a8f3bd52e79ae0dea579325c09f21aecc6b80f743591508ba75bd596f94d85306980a9d0a7aea1a53039d5c5d76fef87a40c482de2009fc77473115468074529cf5de897cbda59c8e9aba5eab106b58f7cb3c65486cc1ac144c1ed71f89eab73829160ef79a7700d7ad68812c040d4cdf5b67331487b2843c04b5237d09c1ed52b24fb22d99b4e3d8bc267872ca4b406b81c350c51973013901b26ec19890519721f9f7715405b20c3782b8f1cbbbe056dedf62cc9a89cfa5b3953d9faebca05fe893635521e007dcbffba73b80b5891bb329ddad734d3c0c9abbf469c4cd462786aa7a5bbbba31d4a5ffe7b2a1eeb714af2125ea3c53d2d837b547a26338bf787cada0f75a1aec9e9a1deee977ce06ec3353d0056e2420931b1f8bfc129578ed4b2b7bbab58874750cc41162aab9d50ce03060818144a1b7b53955b95b5a0ed062926f08366985f26e8113908358cdf126555bd10e1bd2c076b1297c95fceddc6380ff7255547db14fe35a05ca214e23862126867d40304800057bb86af4926bce65a18baadfe82c11495934c789c23e70325514472846b8c1b4c0ff32e7a908f3bef9b6af4241bd635195900418e68c84f76c0d045a929d3c3d9db3963c7e3e83fb6c85cb4206ffa66a93ca184517a834eedfd33d4d805fe00e6667fd699e66efb98e7b9745c46d6b12d8257ca4d21bf08734f94a77ac9b5da5bf9ee105962ca767b3fa8bd3f67111d8d74499aea242486ee001b47f83b9f5a20dcae986d20a3b849195216319c54b2b15aa07c904d5bcf4856f23bb82465871d57e6f63fe5a2cae8bddf079aab4779817c83f8a7620ceb679a3e0b244baf6a3bb2beb3357c6fb342737618e35d9179e6211b97972cdfe335132a40a37a240960345f56b9acb17b3d833fd2727adbbbc69390e0c8737abe980bdb619c776c6e7526f167323c102bc33463bcb0cacc450b18095ca3ff88847ac87cf6790b30a163d09b6f08f536cabbd00a5f05140d219bf9ae918e97af3dc2933387a1fe18a8107a86f5a29fc8600c9d5b41da224557607ea809f20597f258b4289d7c18cb8d666cda816a0271f6a0e47fec95ba1ded40ee1f4c380fe9ab247385bf7221f2584cedbe9bc7e5d7925eec9ee8a0a53ded25933ae0c67e4d6e0d186f76ebe0340fa9475acc2111a23f2effdebb61ab4c5ef6b3224f06196a45feea10494f1e3abc67c0d79be14f7b02f8636aef4293f3499b97ff215eaae937dc3290c006a3ab666da15d916d650ae5a461680ca927d9b5fb87f8dc38f7714c9039176378373016a33213342e1bf6ef1b410198002da7aa00ca350afbcaab8d0244ccbb0ea271d3f1ba220f8c3be728434b5c1dae6e043191aadf320fe93f011a9ed74f2eab15a53f83b2a7f08b879905c7a2221bb29950966d1edddc1cd4b1c18e61a7411cc59475d3ea86c0d57b494afcfa30afc10d11f85c1992ca2d12a3dd5b924cb0bb28a97bf3f23366df6e40f8338dced262097c9dbff9d941e2a3e1574e91c5e251e7eb392bf33648720687f8b48284ec5f35986edee53aa9052c7318af879a3ea5a96398c21518d055eb2533c702da657e386d5300063e6a5c585f07c69b542e8117177e027f606452c62290b43559a588bb03356f846cecb0ccaf0bdaf67a18abd811d4315a966e2f3f87f6c2428814446563fa71864d97c8336b0e34bf9466ec95598398cd4255b5fd5b4f3a52ef1b7cdf948c4f3467d46e3399f71d1f2b7f0cf6f5727f01ed81aca9a682648c1720f6d09ed151b74509687443aedb3ec6cbd3a2ef882d1d1e5adcea71778819878d7be18ab3be376ca07f9f701ab643edb209424fafec4a5e480c69c316ee20c7c8d3ba5f19e0db66ff7b5c2925f856289c757d1bce02b034b306cea447deca603bc60225eafdccb990245275b6e7a100f1e0fc5dccb876280390c01cf29f3fd94c1c61e4105e32f0b9422a5cb6cd49fc1912671c9356c5c2a073e734ff7aa6ba659c81a5724b3490e49c8ce60bf079a57dd365610a24c48bf277ecf356b7278ced10076ff80bfa2378fb1e1c9e99578183eb9e33196a9c0a62637762df9eecd64c3e9e4b8ae8ad31dd278b05570f0b1a9421bb9aa86f74c756012f8783761a20e9eeec40102875407ae879a91e9cbef8193e649e9f7c754b3717bd6c2889dcf32eea9956721479dab9069111dc8698a1780b4048e6d9c61d6e6ec819b71d58d582f94e9598f4e28601487a447716c09f1b4df89f66ce91c661cef994197bb6514de2b3066b10d7cdbb77dc4ad9945f7a68cf33ab05a3fbcc7afef8e734eb1fecf86e6fb0d1af81354d5b612ce8489cb8c9589a75ac9f2eb920c86c1af2b4bb30e9652b9cb31b084820bcaff18e79a0e3a5afd504440b5214baf2fe333a20b1a4898f8ed0fa9a938e9c626ea1b2719282639d8b61b32f8e66b245553cf3752ad040b341568c754a8e291547453c769b1e6dea6492e3530b366f891a3c07fc4d3d779beb3653f456d0309ce1e413d1e33e2a5e0aa1babff10c5986f43c5dfd4372940d3576365edfdc17c0e68621ca916a02c0229522ba6770d8038c43ddc033f701d2c6201cfd0c3b4849fb334da8ce2b5dda5777028e95eb54ca89596f8c465524b2483bef17067429ffcaf47fb5c107a3724e4e4181a40435a19486fbaba313677460d096f5f50f24a9fbd09f3793883c51b222c9dcbc44e35155d3696374b931e2b8e6f9df0094a01136d096776b36913f29fc81e70432c7a27347a1fdded0e9c2f885001c4f8c05fd22fb4abd729808045be351e9a556475b97eb8cc00bdff9ddc8b593f60b7fba366759a451cf360a67f2df212cc738cc4668c510f6236ec8fbce7f9ab35cf32984aef28c7aab98003193f8d9f69061bf298fe016e54d05bee4b5eafd9c6972b9ae9fcfeb812e47502ae83762902b5886cdb34187d7b22d435f23ffa4f95b83d27ee1f7a7ae7fca641a99a3a242bea58bfa7df249127a6dbf35c1c5771259afdcba1d72aa49c7a9a2c94e44825372d1347794fa46dfcc4e9a2e36445f2e8c7c3f2bfa49da9a2d6d74ffae23ea0d6e63eb0ea2616485d0573c122a8442971c746499218321e9da9d41836147c3b6dbe317854c2f8d4eb0100ea9478e0a93301fb1cc3928667df6c1701e10b9f397e0d91fa53c6da880910176bb32699d6bf0048f8beb41919fa8616b98637f64f8a6ce6d361a239d649eb3dd0f961de56785ab679fdfd48997180699b901a3fc21544a68008d575442fcadac6e19b3c8ce179c9fd1bcec38ad6f376248932ca55913d378ca3e13b462d67749a0633230eacd60a1e72a8e8529d57d2e0fc02346e90bf3055ed55ea70b529a1e6d1da20401d07ed3a9d3c45852715f65d4318fc71963317782f9411586989d919def0b2c5c487e9fe15c9599716c656f608d780f31441537ff52c2e41cd1080cf780768f435ce96c55700a30ceed17b57b7de70879d528ab9d89ecfd122564f64479ea17fd3445a1ceb52906b11dfe9deca9e299393ff13c2346c448b3bb37b74c8170abd4f91da814d3fc016224a1907db874aab8a9f9525b3054ad46bc0cb7d7410f330ed3f6e8ef738b0a282988f7f453a2243f3cc6560bf0a315124f685dad61cf98f4e95ac9273ddc0a4d543c381a2176ed161fe2aefc2eb966609dd5139588b8c0ce64d0b383d8fae717ce44bdb7cbf7ee857bd5c4f6919f8a78ceda41595ed394e46be10ecdedea8bcfbf28ec93f82d0fd47825ffc1c15c67a209004dbf8d27fc7d271342cb23b5dcbc4f712f755121394a3d5cc62467f8e72676cda090babce1e3c0f1b7462364c428a4a6ed277dda5230f30183e82b7cf14b3ecba2938f9b295c5d00d60594ff2a59e94f8d6f256043cec19d9dd5b4ef6c5b8982bb92b4cbbe3126ca05d21f8cf59844f57916f1bcf56cd0b77cb3ab59429c7e795453d15486aa44d6ad736c150f2ddd1f18e488f54f5248d7884ab7c25a574638d3a08d3f6b0edfac37b122a15f60dd55d2a0931338c85086296281339cd30847a23f909354a71ed50954e939cd796c1f0f14b91f9a15104ac7c2b0b3f05aed2f27f8835828bb2ad88d246be441bfb1063706a3205c82b1aeca33ed4b3e321d77cc950e97d1932b3d2ae94daaa37bd591b23ff91e66575b379a7de0026ea4bfa7f8dcd8573677488d476a3a93dbf6ff49e9876222a0dc356f9f6830e068f8fc4712978aa03faea94f4e70d8a8d27558b442a58632f25868dd41bc86ed1476fbe0848ccb7ad482770ba6c3cff06e43085c26630e5944151b09e94089325b66e5f9b58444eedd39da49b72bc87398a736c9fe87a29c7e59777cfdbde2b6230fe11b0d469d03421cf992e9706b3a39e80b8130dae905886da4bde7fb388156ba18cdf49c7dc2eb73fd6da4595f4c374fae0e26248c9b4a99c9540dc2349cdaafb197d24c8c31c1860d6350af4db27c2447f8462d3266ac240fcad9da7e0e9936d5010f1f735baa9c52fb553adc72eeaf00c5fabc846f97589da6b10abddf7997ac9413ddda458ffff4bd1bc2b5967737ffffa99b2abdf17b9c70ff1b991864195dd7474e68f959f51a310b0f7f25fe066c2dba90cb58a4d633b12ad6bcc0410511531139c67eeec7ece08be8e3286a6270d897640f4996b18bef9a00cbdff8a3ef8eda689cdc38bd9351041789a6a5943387a7dfa097b154cbb5b764717e703b20120ba1911b1e1e370cdf6218a796e3dcc252c8234adb061c88e9c954a39315cb670aad4d448734ff9a829239342599931200e9436bfe10a6f298f61c59487919134154795f5d451482576f93533afd82fd1908a60101ba907a2cb472a577ae32a0165dbd72879a9e4cc4c0cf0fbd56ce0d05eef414cc4c03a90dcbfe9108fd3d96f392c087ed7bc481334f946d96eda2ca2d63d6ad470e2605a3036724e4ae627b3fb92ba5772faea80be28b77ae0a24bbf72ef3d25a48221857245566f109cbd9629ba5d50d008549b4425b34ebf47c68cc19f58eed411e6a8ff5726018559d37c400d71e973471ec9637adac36f5d35915ea81e6e8424381b43f631942dc031ecdb06888fd14991a198829e878535117386a42e43393b8e72fcad39955e42315e572011b27e8265aa5ff76ef97571d299f61dd8fb67ca624665e68e93bb625a4740f4ae0fdf83f35a2623dc97d496017b097fdef5a4535bec3c3ca10da9a3253e250eade688b0d32787a257f1071416ad5d3480d05358c3fadc0a2161cd772ab97fa8a1d4eebb8d98f0fd7183a16e9a975df66f0a095d42f8c1f9804e7b70c33fbd8d1a6995e67b24fe9fa9ce1827f5cf78100a014ad3414c7a653e12580287376b168802f2d424621cf3714effb2c0bc582be2647c5d578c81e7cb5bd7bf0f4714cf6b3faa0721c6b8a36874bca183f46a947892325dfe2f64eba8997f08a3d52722448e0fe1fbc96e39efddd376a7fe2c044d18f1579dbb900b6649b271ed783eb9a46cb9170af0b9f187e8d894b54018d5c0772dccbea79fa184eb167d5486a7fffb5a29f8e7c31894b13430ae2450bda3832b6c3fe979e05874fc1fad61a71f6fc9e4d71a1ab6f68e0c3e70058da686d7f5a42123a6a90e9ab70b3264ad4ff173808b34fd0c52f037e9761b4d49b810eda87fe11a6ecb86e2db86f3459ff7bab5cfbbe804351d823ce95996e7f11bc87f1c2d2076ba47c5cb530dd6c2a224f7a0f7f554e23d7d29077c7787680c3829f6b12a63eb01a457aeadee615e6c5e24cfa9d60ff98df84122235e41300393c1df18062fc9ed77c9175cc7078b4719ce9c45cc8dcc9f2587177e6c68e27fc50ca2a13ee8a5d628769fd0264debdace51916c5732ddf97b5741de2072f1c93286ebfd332301443d0ca2b86ab8d290125a398de4a3a015703e5bd318d3e08862ad157c81735ec03bd7ca7622bce1ff5c450f1b1354a58b9ab8afedc4203125ec0ba9bfb83e30c29b846189ecee8c7122ae8ca461da70c45132b89e90dc663a251f232735f809c3d28f227407b254adfc033caa3e8974483a4920563d5ce22da4442c6389455c6c875467b521acbd0e4ecf89ad2806328fcc6861b4f8464788f0370fc5309aab051060bbddb +0x0b7356b6057490b828893565407e4dadd6e45d8e75399499f74ab90bc917d5b48b0b125ea3fc87f45ffa12e05aaa10e4 +56464 +0x6513955868a263c0facb87b9283d87fdd02760e4fa437b896b13de28786ba0cb192f9f263e5e75bf664fa7526d3b2073a5fcde752914ec8b6ef1902d1b70c5bd1b9feb6bf0c7be564aaa85f3d8098bb35e69d3e0081708c8fe6ab31e3848b19d94ebe3ee25e527ccce62876610aeb10521f7a7ee3e53b88a4105afc476fc4ab3ab9cee7986c1986b1c011772be3279b0162cc36774d0e517624aece77e927a46893973d2bb62fa79590f9cde8a9ecafe67938d13519775b987c1d34ff71527a0554adcc26bd1333fb0127e731bf98e3539b16eba7eaf52b5d9f3cac38a8a3b07385890113e142d05479424f91a4bac9eb710cf23a22062567f673a0ddffb9dc45aeaf787de35ce13461cf8382e9c0c810637161766f38fe3a1a58cf39d6f351fe28879ecf03b00b0d63361f700f5962651aead5e722fbfa36936263e6defeb5ff8ba7e071f2faa251f5fc700385d32d4befefac06ddcdcdffda172b6f682a7cec6096ea11018b4bb482b92197dddc8d575ae6705ff03cde0856ed622e13051b271fcb1826efe05b7791c2b0b777c406f9f465af4d1ab7aeb2a26bc4bd501d154241caf72dfea8764dcbcf89dcf4282eb644e3d568bdccb4b13508bfa7bfe0ffc05efd1390be22109969262992d377691eb4f77f3d59ea8466a74abf57b2ef4f23cff7d9e9cf1bbedd226d2c5386405a85dd1709355faf926541a84047c9a667df2d41c6b371c3e59b601aeeb99d0157ae15a90feb6f7a631fbcb7ef126484ee64ff41766866d90956aaa5fd1f8838f4da0743ffb9e9e97b0870e0183224295767ae9d45831eb9ae917a94e40fb865c6ac2a6e554b6f6b5ea206c7581189021729c3bbd08e09e449de587e2ff4de062196e78eacfa507e629ec6c42b4af38dc25dc7039403a8f77f8fbcb82d894998ba1cc73b63513d913b31696d0e49044add66312afc6e7c5194382fd989179babe4c051eb14daa7525d2c47287d863bb7bcc58a98963904813c7a1a68bf3a34ae360410244e10fe202cb1f89d05acfa63050e4bb2edfdd214ec9814dc3c6bb51e126a7a5d5b7ed2894e94e6211307c0cb3aa2fd206027557b194497aa8d268d8a2e66091ce99ea50c1737985b32313f5ec226075799401f2236f22b5a2de53e50de8934e954dae6073b0ca7b1ffb3c6ac300a02def5c28fb8ea1348719b423830a736962949be26391e967cbbc809e71208b1680d0239379d973a677751a81b781d00a57314d2e5e036778fdf17ae215eb0cebf884b1e974ec2da10e1ed9158b5a489db5d629395bb16f269a28b0af5b0ccb461d73ced3f5af174cd27cb986067d214b02eaf9ac61834c9829c8ebae4d6b1050760642f9020a78d04df7817d30d3a33bc8d5832e796144f83239f387f2f123308ba3d402a6e59a5407f8fba1124218968efe9068aa33a16b3de290e152844b0fe4b44e97e628c30187e5ed9bb3b3c683ddcfe702fce1a91bd32d8a64760dd2150a9f765fccbb3cff552820121c0ff62b3caf52a37753a5307b81a8b96575fe6984ce15035f864d75f9275caf533cf1b5330697f32471dcd2be46b38827a21834daa7f22aa7713d8bfb4c681a6224fc4a4a3d7f9c0a24982723e57478c57e679d9594d77dad65566be4fe0efa50ad62120abad24331521f5a32c4b03246f035cd3cfb8aa37848de3a3ca414f726c16934fae65893a2e4bb91734c325eb2dfc8ec5746d44510041e2389a843baeb475bd9a329d83164c3b1f46fe5c1a312356a216edc7d0b7e7f5e4c557163eba7277e288bec1cc87fd54cadadf824a96dd960940a254d9cc9a3e6dd27673c3263491b4a3c95eafefc04d3e1b5eb2419cbb3f56eb2890ca1f956fdff88f29535269579663e8e0b7be2378dbb1028899b34ab70d7ef7081c11782ecd9ff7a389ff8f3e2a5173d47e83956c36045151bd6b1a918f6484275a52a0efc951467eb16e14b9c2f510c65ed0a48befbdc1ca173499537f44567b0f53ae272584f217742ea85f02b73622f315cf7c3b25ea4e519055713f86e48fa5850e6994d3910a4cd1a8926c106a66b5d374a1dad5214ad71ebd7f42b4c4b1b767202b899599d395c7a3f861b9142e218a329121540d6c22306fe24b566d9daf8ab1e1667372e009a108f585e9c9d5c0ba97cec12b051ecd65bb2eabd445b00860022fcdd5c2dbf2ce662e3b5b01fa1de502bf1cb2bedf232f4dc8d6b6f3755c77bf6b2234f003fbd049e704654307838a11f6a6938129ee1d86556e86ed7a16423828062981148f3702d47391038aac1a23e9e136028b6880f338d5cc9a1ac0400afaec2c0c6a27634f5b0b76c9f00225d71d7f22a9703d2a2307aef09ff3e501b63836a4e8914ef58e0f3e8f1cd3f03daa15b2e1ec84d64984264c7b5581ef07b874883cac16706e2d557f3262b320b20b474eec4215ce9f953950f5513158b28044634bdd56362dcbb2500931fa0e33794675aa50bf707cd4a53ed729aebc92bc0c2a6ae2fd0ac4d7ca639c112503327277f9c48efe8661d0fe789935468548ba507002536768b3eff1fc4376d0ba2f85703d93533f5aff08a990c40a953d1509a5c6baa521da8b62cdbc97d9699d8b30a3a3cf541e78a4fa3b09e010176eb8386080fc6eb8caabdeb21711cf7c27e602a6dea0f7f859e414276665fc497482b53541300698c3a5b2438e39bf64e3c059ee50e0b579994ce4f318de15a7f9050e888a0e135e50099bf694882fd04b9ac4ee7ce7230e913feb22a3a102cf66cfa2decddf0b55fa37ea4fcc85a73ad9e5c22be52cb713fc4da53a99672a0c484320ac7f3b552c1cc13bc398aaac011921e02b1c39e84614f691af5c9911fb07fff676309b874d5225fed67b7fa4bf83ef9d6074974d0175bb4f058faf51283056a2c06488284614e6a20d076d37e2a49f586090bd3bd2b90c1bb185224df05c07a41f9d89ae82ef73c3ebaf0bbc06e5c1afaff3246b363989a657ef8a8f0fe55378e84e0880a04c6de2d6e4d3c7a8e1f711b31e5521a891847d4d21409ab366fa9fcee88d551ab6357d734b4de12503901cfe64d815a63bbcef25cd0cd7a75b4d97181fa0824ea75af22534d28f17d53d2ff67925adbba2639a563527ec482ccced6835ba9ed8aa4eef81541a27fdd14ed94fddb6506550490d731c2a3f0266090143dd64013549a1d40c0b8d42437255974ee502b41fefbd96f0c49c56829182811f79056fe0dfc44e29dd94749542d1e89821b33f57bb31e553d0f6b93539b9db7f9b47215807569c5f4cd8254fdd545b90361058b95d666710c3b1dd96b92f7ed8a681dc274ab96d30dbc0daff8c5d5eeb74d2a691409baabc0f564a23ba43f9af3d4de6db046d2f32fcd71c00da4d60fe80429f9c0f621eba367c656897a7ca87d223d7cfdef260da42835f1061b5104dcb18aa26145a319fbb6cd5d1ebbb6fe6d77c258234e980ab2f6e1a9aad14cb5db7ad6cbbe9e481d110d0120c210f5840efef669ea0a33d0a25ffe4fc06fd20a2f8794dea0a719df2d92e9053c214222a7dc60171acbfc48bc8a134d119ce8eb1f014c42cf0b1d47976d0d755695a4c07f3c89cb7a3bfd5a47a0a80a65019840f210875f13705c3e96c7f5d9d6152446df44f7ebd3003def8dc845ee8345e9f1f1dbcb9d347fdfaa73c82a978548c99c0f1c34e1edc2c4edd42b73613511e4e6648ba364f9dfad75779733192bd79bab57edc813902a9b3e65f0b9cb410d8f079347941c2b38ce85e75d98c59069a259ffdf39eb84dfc9c88840a09470e0f43dc538282d92344bc40e41e2057ba7e78f4e1911cf908a56758443af248a331b6e4386e6fff6792b18336c9840b63871368dc4d7297ed34b2ba3206ee457ad0a83565856fa1faf766b9d0542dd07c64834050714601461afd42b00653a9ff7cb6544d60187d57f35a49535684637f67573fb0b4fdc1bdd8a57650a1d8f29b866fa552a6e0cdf916fab632493e20e72ffd9baf710055aeee49c99671d4cbe99e12cd37925f3068c2c684ff94a1953e2ee5089f4e0439b3dc68b0f3eedd7264246e204eeafa2121874c3a1dd1653d0ed4bbfaf2a45fea472370c0eb8169a295a9d0432ae9383cbde50a4a0f77ef84b3c1d0d75c0c99e3e344007dffd1ffb8e8aec79a3e459fcf886c7f395700a708d776c2423dff48b312be864cb3490641f793d2b9fb68a7763b8e298c86f42245e4540eb01ae4d2d4500370b1886f23ca2cf9701704cad5bd21ba87b811daf7a854ea24a56565ced425b35e40e1acbebe03603e35dcf4a100e57218408a1d8dbcc3b99296cfea931efe3ebd8f719a6d9a15487b9ad67eafedf15559ca42445b0f9b42e7089cfbd62154160cd19aa086eadd12e6ba93b148d0cfd4da99fce7f5fd5606807f6f11fe97c1d9cacbef67b12cb56fde2997450255fb610943fc60d5228e84fd7fb8b572cec1da85e2c24862dc58bfe04c539262e9ee9a646cd3577efbaf3ebc6dfc5ee952dec8bcaab5db227611738ba74b31f10923d18a6904246a0522a45bdecc86b8b06304dd785c9856868a3b3edef0ac233035b6d9bd21601ccba3564a568bc56754192f76f008f8958a1d678837f6597ffb9eaad0fd9d830dab8bb50649cc938bda4b9907966d8465fd6598e666aec27dd7b93e0e9efb15c34156412e4d01597caf84e20dcfdcb43e6cdd3fd7cf8c9f93312fe0f115ac90c4198dab10b4ccbfe0404f8b0820e9108534fedceaf7321966a47d2426e6247c8690bc235c35711f2d392604652e0511d10244f08e5211f84ebe0b77fea5154181434c7a7f33a0ffd9f682ded34bd340b8314a0b3084ce84d1da557d06c6d1785aadd8f0e833eefa6d04f08aa10eb625916e788d8ff3aa7786760573cdd00b99693ccc2725aa8d675ce0f9987ceb3028f3064b17db233828e33d762cb235061d438ca09db62c3eef30270878b575d3c353855c0ad0981a116e8d31e8627a638c5ff9e0c5282d65fa7d23a7bbe91313ad49880606dec6b2d98ed1c3374d14966f3511272dea228511aa7341c29657721f3b7ad37c743384e9dac7a4a9e0a8312e697ece388aa02ebd2ea2813d3bb761c1bfda6edc2f6312bac8cb50b0ab89a642437f5095783ac555901dc07c57c7750d3d2322b66ed9eed4df5941dc2c4d785379bf58953136eb8375618a1058ec2e8a39e1899bc11c7bb084fe129ce17829da729b40e8443903cf24fa6899ddb9f0a13c921decb48f3be660362d63498e3d3fa4bf93ef3fc590814564d66944a56dfacbb15a29c7b6b1eee77e0cdfe2e4150ba688dc1a724134525d2d4e0f3c22e8ef5ddbc8f35937802291422b534c3e63c6ee73940a8a4041aab2b04a0c12d703f7795dd4ba07660929d42f237dc3e18be9f32c363ff6574b030c8a54e0672651cb84c427ee50e6bf8d46a16fb008620fed4b0f3d1b34ead2e3b137f92cb79524a426bb1d10a41e35956f257a8a785462595c99333cc46f6bd55735912172a82f49d58f3eb19f90ee0a9447de6da22d15b6be56930533796850450fc79f26d3c404f7dd076191d36b257c6505fa0450bc7dc6c3f714f08d6add313316d642ac756e2410f171395a1fae8e298b801d63a9272c6db9dc8a1fe5e4722be9676496c5fde0b7a780e4997dee2ff1c9c05bea7e3b55c055dc6ea56bfeae66b9e2fb27383c945d74112216286cf84a5b1b5e39ae32c94875952cb25f943c7022a984d24e92d56ef1a2805491b36dbfb9f182e5aba5fd72838732cb533da2e49e5b703c6ba91a68aa956dd93c5a06be60f3687318fd68eafa332f54c9638810a7496baa31d7e9d7099a69189ab949c2ea918d7658a1a1fe541950e334ae4290b823d5b013b7ba36890200973f69ad69a14c5043fd5b2f492bba75fb276668f15b5b2cf293c10203b36cb2d99cd3a81f3f945f8079526737eb86dd01042471aefb5fffc6347c57cb135afe64259fd0501ffa19905f5ff0670e1f14a97d70e31632b2cccf784231f9232d41ab7c26acb8ccfe0d1811bc41431de3ab38d5d433e37bf3f262c1cb171a6d843b2412f0a395c100a87c22ffd058a5650f53bfb6fa8341842f14b37f7dbb5cc039726c863b8386b28a3115a324040f13cf6e9da19d722df3c179cfc7ec386b91cafaeb7ffb1ea88410cb6c3ec2f1e5805a0df22c933c9bb367f6794cd92e24597e42321668a380e5dacf994b239eb33b3d964fa0724f0553711f4276db191187b1dcb311eadeba6846a21f20dc66e294f8bc18a5c12615447b58adce4865bdbd042f00cb180cbf7bf2e7807843e70e3df9d3ffb4f65e2616e5373dbbc7b08369e3ad8dda76d9faa15e044fb9f0ab9096ef7247569853c24b5d3f54d7cf75fd0eeefcbca86da31668f69cef6e69011420181b81f30da3744231d595aad622952c74813fbd83147d434af5e1fe2394036a22345222ecd9a6ac11ae729d6232e63322df79924d9aa9b0c9b3c9e1a6d0d8e58c511a6ebc42f3d96b0e6e37fa436ac3686beccf33a22641f15af9c169542f22c4f65d2ee28bc66aac8a0af314c09d5db3bb1bbccbc76d7760600415f17a50924a989cebf620a8c054b5bb672836e852935188f37c7709b185478b47c5dff7c4bbbc5c3e6d8e158b01f601fcdb12f64295a3b6fbcc3d6590de95d1ef5cd17f2a66e61d9ebf40872b22ef713c73e121be2936184e41871b85eabf7a653d1b7143fa8a437571d4981135e67baea93e0525cc9d3f6362e0961128490751dd0a58a1d52d806b2ba6a2ddb99fa3bbd1660b0a0e2daec3b6e66fb315b6eb2db32aafb4855436d8235342013c6f6bfc8305cdeb5c8bc8e793e4f2fc417da86165e8e10c9972d9551f56fffc3cda46d94499a84a361c1057a078da5d1a21c1954be1970a702e0a5a662e375f1964c6ea8cae44973973379c632e90463e37c9220b913c3ea7da3c60ae45728a70836e98c1900d52c505811e32528f57fc24219ffb743b39befbd2004e395c0ec0da907c9a0b6d1d6767af65b4a151f2f27b5d87b2072e6c04277da1cc763e6c98ceff0e6c6d0e57af0df50b608772b7afa1ef41b5d6804645d191ddaf88a42446e4ecb6bf214b81fa6cf467ac615c06923c59867d4edb68c28eb10c7dfd27b68990fc0e18e4cf3cd80940031eeb887028bf2eae8eec9a4428b34dc6ae202393af679f9cf013e3d8c6675a762e728274f18ed122513c3758d6e3ea84b6ae426c46dd69bbdb3b33f6540b96396192d4958b3fd39a7aca5d176b94f9df3e03ee80de76cd1330c72a15ff6a95b54ec8f9524456c87f41f35620354b0e3e9aad9271d4a85c1ba74450a83708db824c815b2bbb4802396d63ccd3e27a9a1b5327d8cfd806793d953f222d897ada18e15894925ea8236153781bd2f1b81ffe0def1beb46f5a70191142926651503f1b3bb1016acdb9e7f7acced8dd168226f118ff664a01a8800116fd023587bfba52a2558393476f5fc69ce9c65001f23e70476d2cc81c97ea19caeb194e224339bcb23f77a83feac5096f9b3090c51a6ee6d204b735aa71d7e996d380b80822e4dfd43683af9c7442498cacbea64842dfda238cb099927c6efae07fdf7b23a4e4456e0152b24853fe0d5de4179974b2b9d4a1cdbefcbc01d8d311b5dda059136176ea698ab82acf20dd490be47130b1235cb48f8a6710473cfc923e222d94b582f9ae36d4ca2a32d141b8e8cc36638845fbc499bce17698c3fecae2572dbbd470552430d7ef30c238c2124478f1f780483839b4fb73d63a9460206824a5b6b65315b21e3c2f24c97ee7c0e78faad3df549c7ca8ef241876d9aafe9a309f6da352bec2caaa92ee8dca392899ba67dfed90aef33d41fc2494b765cb3e2422c8e595dabbfaca217757453fb322a13203f425f6073a9903e2dc5818ee1da737afc345f0057744e3a56e1681c949eb12273a3bfc20699e423b96e44bd1ff62e50a848a890809bfe1611c6787d3d741103308f849a790f9c015098286dbacfc34c1718b2c2b77e32194a75dda37954a320fa68764027852855a7e5b5274eb1e2cbcd27161d98b59ad245822015f48af82a45c0ed59be94f9af03d9736048570d6e3ef63b1770bc98dfb77de84b1bb1708d872b625d9ab9b06c18e5dbbf34399391f0f8aa26ec0dac7ff4cb8ec97b52bcb942fa6db2385dcd1b3b9d567aaeb425d567b0ebe267235651a1ed9bf78fd93d3c1dd077fe340bb04b00529c58f45124b717c168d07e9826e33376988bc5cf62845c2009980a4dfa69fbc7e5a0b1bb20a5958ca967aec68eb31dd8fccca9afcd30a26bab26279f1bf6724ffb08733c9a2f4575361e5458fe3fe5973150c7f4edbf6535c51f1879858f285d14e6956001c2cc3d976b1baa05e81f33eeae9d29448f3900fff95967d7727291fbc1a4cff7fe8e2835e47144365a2f218d4c95d7522e824fb43b66d4727ee570f8303dd6dd310fe7aa00d1a1ffe49a0285a14e69a72bc5847a5bcd59f6d2f56c92a8bd1f3218b5de6c46d96dd345e4397043336ab4059741cad0f962d53d26f763919ef38704347ee52ce4e240cc9248c5a8c154f92a6c0a1e4177898e0c0ea3e381700e5c81f06bad3980c9d90728b30e5884b2e728b83ffd13c43891cdf0f48b0eccca13107e173cf3296f0c742bfab2c8f9ff1e7f0075dfde7bea7101825bd29001b15b4e31f41cc06b4c4b91f0a24b70ada40f9bd92e4ee7eb29bc35476c429bbb5e8589b094b547b30c16ff2b2c30f5fc4c2b1da6dbb2e6be70c3d7948863a8562c32618e7baeef9d190f0a400b2bbf825201630e00c451425a38770e42be3c6e94e244001b523e85ed9441b3c16433bc50231a532fcb9e33408a82292daade613305cfc9e6579b1a0437441ae1a30926c0e0822adb5143edbe2a8769abb1e4da812d63507f27aba5f7787fd9ee30964e1efa690975fdd8fe3d9905343f7c063709b99d18583ae6c621d8536539c5619ed4b10d539219d3d159667a3d6b61b913274adba5e409c2f73dc77d6166ba01958cb50dbdb24dbb037c1354d9b1fb53db8441ad6da52cc6c585c64c42f786dcbea166c88c5901f5011020339da5b18d1c8b4e80f43e1c689da4654e8e6ec48996ad56fc63e8cf2856dffd84fdb91ccb32b6c204bdf1413f0c1424f2a82efb6eaa2af5e7c8f40dab71163bc77e5ea574da913ca74f8143a07d5f75e724da84127584d439201d5614ec6d4b799428e43050951ec71d409c338de0e88a88d4070b6555625efda730fb254fad29d38a4184515d0902abb1a37eaa32ed6b48bdfcb0061730d7d62416b4b837f146b10555c749335bd87f76f1c84ed004e7e8fabdb6d434c0223e368fd821b0886eb12c899f94c2b7c70cf31fd70842cfbefe1cf2766c5880cc9a3104dbde3402e068526563e0858d4cd8a885f153059e2edc8713851adcf3357eb5fe465a4cc16a2b3961caa8e64cd86719bccdbb92f0d618eba9497c4cb80b6038049e3265746a8e24172a5a8f86f83cc93cb2ae658833479d1c5a1d222facc3399049d3187c4015b4ee0971cbcc3ade397e56a80794c4cd2de53d69f7caa82c3d39efd8d049a9366e6eee8b357d0eafdd0a0034f3d7193e00bc49df28296c1fa559e6a0177d0484a31250135729e236366875e1b49f9f0ed7ea26095dbc86f22488c4c57886c0751560c486ab436415e801fe1ac48ec4a3f5f74864e30487581d3f10a55de78b7c17e2c261ac69f2a3446f2f5cae0528b1fd7c377e6291cbc5f1f530ec422fb42e3d00b040c4fe1c82de187033cb9349ad50e169a256d4e2b06533dbf6bfbfe8fff75334809f8050193796671cb7c995fa92bf559d2a5e6a9bd983485141288865d942c5cd96912bfac3518a83fd18ac2e356e81bb778ea20cb16c2c8850ea10f44567ca6444910e9c23e2411605f0eabcab978499a8f647779f46ef087995112fee3ad90124008671bbc1213f5cf2d02a7792c4944915b960f5bc065e258a177d16247 +0xb19abfc62aace1d49392cee8f69fc6477422a647223742cc7d65da06cdd8b86cb8198c3af9069dd4e8c3a4a6e404d9b7 +57256 +0x13e3fe7856cd680593a85cda3d6ff8736f205259221e54a1a2d4cab5439cb9574fdff2e2447de8d33c6fbf89adaba5495247658569e2395e1f40e0674934f1ac54c36ff37f869d41475014a02311122072fa151cb2e2a9bef2e97ec58a5bbd8609d79c316fb031569d9383a8096ae700b6818aa564e74aca0418ca586ed8c5ee5662a2267cc2491b24803628c67ecbf20623eba8e6b9c4893b14eca75e75b0eb23aea95a0f869096c55e52a8c21567fc4a2a60ada220c00480270d3bc0f827865801d8548ec2abd1697702b065f763296adc133dffe4e641bc97559afd2ad1c6dea4579c633f45d4f6116cc917eb667e4f8229df65ccdd4ad5adeb4e7ed357b39bdf4fbaf4c504a55675b87a40bb1805df63cd1c3ca24e27b5b1f8dfaabb605578f9e836ab1c904e6feb0f4c482d23c503c9257bed2ce0de42eba3d3e8a995b55d3c4999ef0b92d72bba99c6970a2cc6a4fa5984de333c7966a215b4a2679dda33ee9b6b275bb246702c7d709519de11a83f92bf787e09ff072075093fbb22cce0580532bdd497a52887e4d2ab24deadf9e0f8b523d7f0790fabec5b276ec9944ec2b078183eeafb3a14f5753ff1d7a27d25b2ed480499ee658ca231c1483c396373c3c4a06152518e1bd9e0bb4a6ff91e56e9ef4dceab66f10bbe13771023c309b5679fbd0578ae0ce4b79b85f54eb9c2bac4449cfdcfea9b6f6989b090253b27cec490d7f1031a9cb6b82f07ba1dea539a6c739b59ac804b02ca1cd58eeba8a507011f56ee9c9e26db0423a7638494b83e0804b4a9eb33e90a0a534cd31d126aa847d4a2c4eb409299c2ffcfb62ac0d9eec1804eb733085dd050b77e27628160f9bd38233b970ac8391a4ce67db8769ef2bf6ed0492d098f9cc5cfd35162fe6e428cd2421a4904b0023590547ed5bcef912956a428803d68b69023b41bc6907ccadb2a652ba835333e3b5680822a9cb41527c0311cd5acce65db3b874b364073dad3c9f6345da537335423d4505f1dd5c4e335dfedd45faaf2cba0b5aa591539ba9c365bfe0f5ca52ba681b7b21b473ae7823c1662245de5a58ad9a700d817b7b25df9fe516763666c5cf7916e0623ccc52f5e3e446eae65c6406ec4155a4ed50a3e9b45f50dc1603e9c0ecb4dc9b871a81022bf5b595b149d14e773b088c37c0968a39ab1a87e7deb8e4ccb170c0f12d64d10026f8e6bd9722fcd1e9b0a7d92f80399644ee0a3a4ba5c3cfa94762e98980fb06d48b4e69b8cb9a82c9c8784001f36060a955f36bdf22b63c08bb01fe9367e8b69ad74d54434d9fe057ca8e1afc62a71f64bca42afdc264b86c662eaeff8c1285f68763fbbb2b7591102149b863507628f3bcccc64c0727bb20b33959026010fb53f612ce84e7c40b7f873ba6cb3f4613d2c0bdec3e63a7bae23cb2ab60765c9d5fbdea4b350503c62246f474b8a19f768e52f7fb495a4d4e0d6d3b048e416dd256494b004ff5ad47750ae480a009fab782fe1b81f16d80db2ebf3302e053bd30f412c57c3a4c3905f42d8c8915eae06d5d2c990ecb2ffae8b2cd2b150b2fd34f95c4da2d887b2f882c396ccc8ec6d8fe8968e0f04ae413fd25f193b963384874d7ba0972bf05095489a905e97f105ce1743d83d4d55c549f14d6fd6e8cff7547267cc41a527c5ee1a916d85e6b79e4bcba05123b0eeb4544fbe7d8b2ed07e24d0e87aa52c73388b5e6ed54a9d845e8f6d769fc815c035e6547aeb61507c437dcfc552cda91ed1f57efa72b3a4a17021638d6a346514718968486061361c6bead7c8fbc0056ebab3e0fde9cbe356fa8917ad5b70863290c4f3f18492c8f721f050b71e8626ac184dee3fe59742ea2550ef9e19836262b91f5d3e00fcef578b19a25b6228f61f164c0e870c21aaa718fd55274d75e0ec14230ef47ca79182d1ec357c70ad5c11d937aa9e067001d3fc18b0129f4fe717ca576fde9f9c97c11cf172e2ef1d3fc88c96294d7c8c31b7f8296825b618612d0344e6c312e2ea5c94b1bf548880898d55f2f35a167e209b35b9e5293bd83574e670dc6a7d81709b60b3859be3df21a85cd1708d7b4db8c6da4f8ee5d5974b359c65ba9c868213c6a97f2d7fa741ef61cabe08b05401df821074cd232d5e8bb74cabe621d8ecba24969e1dc87dafdb00c73e238948a37f15ffaf09a9eb34dd441fc8cac119c74dfe5097bf3e0c30cdcc7adb29e200397fc8ce88ab40b62229223d46cc44f21bb39cfef27aa9fdccad0e0c1c828123cec7e3a68719b0362f579acdad56710af1d646c938b5d0f78b630fa589962e5a673faeae35bcc114634ff4f883cf110a509d44d9f0da7ca376d7146babcdb34d0ecf710f19fc3bf8c6f978e5529fec9941f0dd55a25075a894f268890990d7a3ca5f73f0bc42e589613d6ebda12dca60cbb75b65d77f83b0ee9a52252c456105a4d7fd7aa4f488703b041da7f9e37306f6da043315cf6e608ab819689a561a1aa21f57d45b7cec555c34cecce128ae34ca4221e4e7a8fd6272350679dd29ca8bcf1fc9286940d9decdb7c953e164459250d5f9a3d272fa5eaef761807d2839ff30c09b9b54aa17b6957356658100fec78f7cd69660952bfb44e872a700b92e1fcfe81457a6206d83bc52bd2a4a62a27c8f20fee5187958e23eef8014f0467293b3807d84e60ca5ee4b3b45c9c3f3f95859a7bab982864bbba3f3d5efd436ce02e4711e499dd5859e4915376b751bca04f4fb523a2725cb2d7cdeb76135f107146ba13fcf52e3d63cbecadb37e643df2768020e8f8ebc9fe0d0976f929adfe8724ffa283e8d9e5f6fb3417956a0d1fe6abea636e140b5907da70644a98b6838c4986321bdd76eeae02e6259ef2b2ff075fdcd1157c37666ac0a1380ce90f4beb14ec37174b6bb3d363a15c32b0dc37cef2d61e81aa169e914ffa6692b32eb43e27a04618cb4ed221adc42fe32d0f76c815749035161f4e05e91a749e5f8b58fff240d392d596c5e341ed1532bfb3287d2826daa258c811531c5fe66276bba6aaf52c6417e2ca0bc2b07aa0a3e17db948bb6b525bea9774e36a593091711629c9a0e17c0a8b5f203a89fb66b95ab5c5c53fb09bb43403e5415384e79dd7516ec695fe800d27cc8fa52efdbbd553f1ca7d35a51b6dcda3eef75861800a21c3c24c44e2147250a8b6bd2fe024aa95c833cb2da755cb3fedee6fe98d7e48e903e0a52e1aadec9e6a41ccfd51458b789f9e599845df6ed3489035975756ec8588267bc226b0de59879d5f27af730a74ee668305ef2cbb504a40c2e25d8e679fc7202a9194d1ba2a97460e3f7951aa233b28e1e731a2531f798ca24b1ea94c80474a5c2cd365227a0fc844954d45dd0c1c51f0cc8be4a8994cd05e42091bfdef9f216af460ff89d057808cc979e43587f88e3a167c783e663ab85167ab7b1e263531e178cc1562b6152b515cada1262f561a286571b1870ed9b1161c843b0fdc8ff85a3a833b4fa3af153ccf4701318acb92362a0a4514eb903736d111d0557b25e13faa14c5a311bbdaa991e478ea02bf92fde4b4876a9504c71e35d2df817a8d890c47ff68ff9891e81224f49cb22fa878ea25ef1cea838dfd46bb45bd06633d5c3ab4a189c7a0e7ca1128f5d11c7a2cd0855e486a274fb2263ac1f8fd76bdabd75550b99c9db313fd30fe66baab6aa31649fe2ef3a34207fe84fa5b1534f25f86e6aca635e457bcfddc15d5cdc189a1d6c2a6214de11305d29fb4fa98d399cee76938d5da3df729587d2fb16f015fbf8e69b6bddd633b224f059245fcd52c80755785e6fe0d2a0f79be7c9822ed4542a9b9d063269c12e3b03112cbb5bc130acd2c044815c458d5edfabcd88dd7e2d1b53d63afbe1e32d0c2aca6fa67eaf5c43b713487b6061bf331dc31111463a0e33d6ee0f2084c336fe2f2cf6067f44d536ca1b7045344dc0dc1bda9d03b23180daeb8e8d899b86d179d9e1c8c5a6a722ebd47dc6c8203218c3a2967748678b0a785c5ebd1e6d5786e5ef8eedc93b01cbcc9ce452ea6c384d4e799fa9c6ae6f3575ef05a6c8445cdeab3ade6efc8679593fecf61b945f86e9e76a9e3b67ce0588396d2c506d66bd603182765244cf3853ae8a5b29af424574f53b3b331111768b2c9d7ac4f61ca395e08e01a18b5d6641803fbc84215d9c74e0b51d9baebdeac6b64998094cae360320282563b8792aab1dd3c135d4f8b4730fa0ed7a251b88c240372d2755649d345a168aa1b36bac1aed0e1143ae5bb5f8ecc452d95e7379063030e227fb8601b0f421d963647b151658b855b699cec68cdee8f5bf410de51af0fc5f10255b89fd5811baafb3f18d25c69834967c980fb64dd67d34b630f387e6634beabb2c5ea5ecaed48f88143bd19f7757ec3e02b9fea1549341a525cbd47c2d4ebea441a7301ac0d00acb2d48a14b1d65bfc954ecec432bdfecf635968919211193cae28d24490e55286484db1d3252071804d6cf099923083f91a57c2f24093c711457380be0610cf23b611dcebcdee5fed7cf8bdc0c03b7425ec0a44d07ab77606ae7cf6c49819d6f380c363b5288a6792a8947ed059593fc46cd376b29cf6869b4dc7ad0eb36afa844cc4ded5a19f391e54a2cc5ea9f45752f135c11f23fba93da7c63be2e48eaa345eb8a6a3e5a734ff15b62eb24ea74b503db3cc8cac213e7c510afbe7a7ef86a25af163c6410cfba340410e71c3ec9c5a86dfe17191f1c6b5bdf895837a17e05ca6119ea3606aedb978c5f423962ecac0811cc87471f7c2985331715cd79277a1e48bafd1a03b9b8023d7683e2208472090fcb9fbc8adb292c52817ca5ce98d307ae22fc7ace985b5e5d7e32813e392095ae25e7e128e3723685f01625687c186fd9796fbd30f2cc91359ed87d85b5bc933802e71cc03a0b8d148c69b60f794f3d12e6df4bf16f11850dfffc3ebd9d51eaf38928d61c88ff17477cffc18a378259a191d38cd9b834202dc8262cae9ce48428e33178027653be66e960aca25fb8aacea3d3e8af753d4cdc22deaf1f587f481e378a683bab1168b8fa12e01f99fa1ae14467c73d4d32f06335ad2fda79291e1faebc108fd041ff86d89fc6c98c4f90219b189149e91df40a281a14a5a8ebee71704ed7c58de96a18aa8fc567e1bff5d8d16dae9cf1053f1923aec6498dcca05da4c824a7891391b6996844c340522f4c0def86fe0cf3bbd850efad8ecfd41d2b73b361fb6dc65ca8cdb4ada34f1127c578248137e2ee4f8fd567313b160b4b230495f58ae00bb3356dfa67d0b903c58d3a96080e1cfee385da9ebb1a0c7a138d80f9481c8be97ea7a1c3da122430f2eb7acd814c622b6003881bb1f157285db00e64c2791668a54493966e3039a19426605056b95b7eac5106667d899f1d12d5d760cb682890105568fb8bf49f5d948716a7ed1db0feb0b77d0785aa8d6218440274cbb2696aa8214b7a9924fe6cdb56c15ab04009b4547d1586331bc8fe5945b8292a1f83fd53f2629c008900d750db8cf105ea0ca681eaf56ceea6f9f9bc20210550771b51fa0ed5e828eb4ba5da5d9df556e264de1d4746411d11c85c281c6492a582dc6f86becde77a1287de63261cee0af1b76411dc2f8b2a25dc2e8782aa5892086b5edd4a721f5cc55d8bd27c326289dfae3e46f1d9d47caade77c09a1ade7dd07326e9faeb1a37ce74b30fa807db3b74f076a3ce6ca37b68753fbbacddaccfa39ad09016616074f3765e01f1c2e0887726140fbb0f818f274a8f60001a4af1498863bce5fb7779fd089492a18bfad8b2f71e74ffeaf520ae056e97defa41498ae6e754b0e2e9b0b3d45ea9ff8caf93eb0c9eb9e3268796c64de5488da517412e5c6540bf3d3e7fdf82c32e52ea8a21eb0c9bc6afebbf5937cafb5b56425740fc91e3685a35fc5047bacc0ae3d010ea7aa01e83ab6026d1c925b8b881f986adbd2e6cb4c9f2ad8ab4238023fa64cb575f702ed81eae43674306244756f42ef239da050c539bd895ef65e762dece42ce6423d3ad52fc9e816f1448f11c58d676383eb858425806d9bd2909afd937fdb84f6115ea8d73c08913f82b9c1d5007a182028c80dc53bebee917eff331c7857ee9d4fd77183b30e5f85ad5319f0148dbdecd8a6c6ab188ac39d6a0142fa56186fa22923c3b7b76ffe6e04f99eb96218c1647b804339dec0b770f24fc1bfa193a4af3dd213d5c1b3da535a0ba49351a1cf0192031813d7343696984913ded3601a0f0e40f6805a609fcffd07e0007bcf435ebcad99ab9a4bcd88dc7bddca73f42c6c0b1ec029e9fcab4e7e8cc5a338e7aad64bce5c73a08de8b22f567424fbc67820c4ca254518fe79594ef8b9de119171f2d003e50e825124cd11777b50e35d79d7cbb17a644fdca67afeda5123be33354ee9eca7dea86bee14233d47e0c33fadfb70835409f71daf2dfeb0101667637154e9c739669b04c131c5468e5703d380f663be2698b737ffecdef87b28d5a8928f50420e28c2d22aa077f1a3163dcf9f7305a086a308c215220041f6cd61593558cdeb9aa7c83aa6eadbed2ac0c97a55dbe6f8e8bb54328b7812fb1796931bc66bb302536603d4a27b318789c94f6a40ab7815c144221fdf5987a251f6f366b2129044ece61e06c9cc496f54a22815ec6c4995a4d01ad06d40cec63a710aa0a507f611bbaa7f67796863e2ffedfc13c588dbe707e186fac1c868d5459731700b9645074415907d3dda11a0f00f23da48ab9f886eeafef5794ad66de7cc104b52581d741ad9f99e739be327d97847dff22f14f84e6efb670052a7eea5a21fa915b7e016a44a2361d72858c620cbd0ab6e9dccc52aeff4b5d37a4de6139bc80fc2502d3d84f8a65dc4f9d32a4a7c46b2fa72376d88e083688f2c48c2962ba1e5e49b55771157faf8d99af2c2db0c228d4246d56ffce320057fe32922c1d425c1f9040941ee0a89a96186280e36fdeca0c276372adb5a430342295f850b17cc3a7c24b92c8f62db060945f38b02c41d83e7aadd4cb8c874e862795c47f6891da5ea77d5a55a0377953d54d5c7b2e12dad4e3f284429b02e2b5d6db00a088a929ad067ff3af26ee7cd7a2d5f22cbe7a59352bda88f82a3e7529f50fb39b5aeb39faa9f865bcd0794155c59f04aa24a1dcc91a0fead781638e494cd9e658268091ae5691b966e6005033045299dfa8aeebf87736b2c6e898b67fa5dfa0be3490ba32d6f2f693afad32db2896bab292ca0e2a0cfae6aca6057433c6cce9b7cb423aedf1c2242d74a66eb3f9156e0b291ccec79f00907304d350cb7846c92b34be9b466eaa4c1b7d138c253e74bdd2b6cdb237f9f3b7024a2ad2b083f54900b82d64a717517445121d1498c15eafef810443e2e2796441c031834aaf83701f9db71e77b260a7937bec8f7448794d4bd2ea0731213a9e18ad11ea01c49547702b83501d087eeaedffa785209c6d9eccf1a7888a80e06d6f5bf1903e89d6d4dbacba8203e154473be8767c0685e3aa5b25624e56c510d92e10fafb67c7eb214966833d900589c5657c82fe8dca837ae1b843dffeb974eb3d1554b5e6467f36a0a207072c3bc66c5304f3921d35f41544f073c5e824b4aa84b2264621ce3819caa86d6b3f4cb345eec7f1c11e8cdf836e161a887ece781fec2e98348227bed4adc0deee3101f7571c0fa311f898ebcd45715fae277e67505bd3d4096f18ba6f3332821a6b203babc622310c1421c1fab34b6bc14afe2947bae7ff4c526bd4f04345807653712647d549c43ad8ef08129fea66495114670cf2b3448692e6b361c443018a52be61352fcc8422adc9691ef09777cca389c9a5e97fc93e975200c9a0722cdfd1cd937dbef3984cfc788c25909ac6d4a824f61c8993b6fcc9766231be1b2afc36676525680628402bc5182f663b7ce8c8af9779b9363449901c82a006852269ea547f37174c5e87a475b6455ac2c1916bf053c260b16bab540a071e60fa3daf565c88bab20e60a8cd530d6d5476bc55f9b1d301684c82ac7d099ab4b4c0a355e14729b72194562b1026c6b13ca196bfdab8be3db84fa1d473e1e368ea207be3f2dc09354c266999d4b58819fa89765476cdbd7f3802f2aa9e5a8944ea62ede2f3e4d13c1b0cc07880c9fcac7776859e36ba78ced0ad9ab6673c35509cce23d94b2828d5768d85537e2ac97299b2eb24804696326897c480344e8e93e9ac4250626db70645f3ddaf35a098734984cf6ebd38c0b3e80996916e593d15b74375cfa07e25d97084f2160df311b87033590556599d5a384b38707e25e9def0dce2df6d221b56df89ec0f6eeadb48f408b370b171d62e41a5d3a5ca7a3bf77abfb107312041847a49f323c04f9f2bbf4b023738481237e95f8fb9bc20db673f340bd054413e6b2a0e2dd86be8046ab74471e352a5fa7e19c09333bbde7036258318c13e4dbb13d51ec5b9d77eb30cc63a25fb6651350aba11089b2e7ea26c16f3ff62570c5f8564c2e14b6dd85319d3774907de156ce4b29b157a7fc61b12f9cde93b0845d3c8c042aa1893c08d9ac541038f21b74712eba3e356157f8030b55afdd5b7c2bee4cfe647a7b2fc099686e17b1c97ff6d9e4b749aba58717ccc34df64b7ce49c9e27bf6e08033556e15fd9fdb35a8b7878fbc55612bb063b5f05da74569b3a39cc9abb99f2c7c93651f12c24863bca53cee258d6033851ed3a318f9c974d098dea14778aa32f77e95bdad94ec2d3b9335c26d65c0593f6b7fee4d1c175f8bef3772367b291a0bdda7f6b65bef1b8d471a137e25a925461061d7e45959b24e725145620a456d1f7a42d3156079b51a8992ea3f15422003d52069c6f8b4f680e7d121b26d25b19d1b0f5ab3ebb0844b23454e987cb4d1dc8464a9d94152b28817620f0eebf371ec89b5957643bf0f86dbdc4771a426c13ae3d7a1067b5b6ed0caaa165eced432748cdd8c47b2ccde347bffddb2d3c17686bc1f5836f0f7b2bfc7513e8a5cf27e9deb2f460f7e007abec955194452ad7a26d5e4d64fe64c07bdd8008f7bde75dccf7052cbb4f0826a8a8e87020d69115584f6cf243aa685f432c35f12179b85d572e1ef2320507b3602913ca0f65f158d06e98749e078c802865115ce47dd48f0ee07ad5739e612678d9c1dfce77ee3ac1675b54d28a33db7224acbcbf4eae9b5abaa356de9f970849275d21dc90ca03a1b610139f9710e9e6c762812040c8eac12922e7016d3bc157be5020c825277bd7d7612143d28603ccd9dd5aa6188605e89864165aaba1fa3afb455cffc988ebfa37c91e6db115e1bae86799bf1a98652795016568cf7c1b596aa75701d260dc7f73b25b7bb742dc275fabdee9eb628104bb6544aa4d2c9d3988f07f6cf431d5ee07a7790c599f8b98cc149aa4ef670216581a44ada925f851d2ab66af938e60ac6032f78e1c7e58959a3c4d7ebb2840c3179ad5d1681ad548d4427d3834e8f56119cf478f7481cb94668d67e5c338c591565188b40e5d8c750a5053954ca40c72a0e6e97ef62c6d1b9d728a689beb1917b0e8cdc40070b67ce15f6a556f723e7772046ddb15e0b591cb962575a9e1a3bca3db259fe2f6cba705ca21d701c5d3d619c2452258412dad6d62c99b719f1df6ab8320963a5234a9c41b3ac8a8019515148afff341b04dc4ff62c7588795b05c347b3f555b0599fbb8ece578d6c7dacadee90ebc46d08e5efe10df2b50482363db4dd23bd99363f36099d285f28b1d5de546f1ebec0477f1e5e751926038ef940c6599d84a9e1b4737bc826e9fcde544d43f2a10b5de93144370df1c4bda7d73444cf6b90258386dcabf75913302cb26182c47b918c1583c9327c82757cf35781f7e693cb58433bd863d1cac60bc27681db8bb43a94f3fe15186ad422869d018fa7471f1c894a5dce69fe80e8d6c9281714f055edbfac2990b081f0b425cb5dc61b9a166affbf742886278362da68518af69a659253688da3c466dd119ea6f48f1d86819f03cb064d82f4dc1d5cc878424932ec10994eb0b41ac4a3233c554d5073b367a2dd969da5250c9200a71025a7d55ff351d9871c2d7c414bd04600f072e6cad05bd547c0983718adf20269e02161ca803c5b3a5974b085db0203d1665e +0xa14ab54acad289474c703cd30f01ab844b8955e1e4a8764884b994c18c3f4812c0cfc6a2b762bd77b4e44f940ff4b245 +58048 +0x693eb5605ae784d0af3cc39327d3467c59b47b9048a89e6837b430d7bfe0a5cd1e3c5d7bd225d5b867c51fa48dd98f8b6db7b80c3d8f967a12f10d82f68f920e3b45296a0f568fa550f9b83ba1147cf0bd478dff0b2cac7473dd1cd771b7570a675e017438011a6012e0779f8b0b7375f06ce2b3d90746200181461d55df5b894b91cde375afdeae5682441a7446dde0ae2e9f6ed0a9ce4465e4719ecd9006538fe575fdf0e7435ac4e808f2844e23faa196ac791899aaa9470e86a0fe51c02fda63e10bce31b12a0319a970e2aaab8b6fabf11cd85f44174d086e6c13aaf1e7d411f9543a1590e8bc1d11dcb7e2df5bc076569e3984025622d90f4a3223014126f9a6225a1c485a96fd267e2a7f26313dfdc449628f4e2d6c895381844559067823cebb56cd41493ac0d29d6408e7d78d4a21637b088f65d421215b30975ffe71955a6857b1e37c4f6efc838c058c1359655735ae782cc601a8601e5ea27cf0ba593371854e97bd7e108c76cbfe7cae49544c0721668f189c26fa1338ec18a5fb773f1e072fc3d26fac69bf497c1f700421ea21fc5a1f234ca4d682e3ff9ce6dbf568b706d9d184c94d7da62d06dd2033d417ca68dc44afba28dcb38a636e7902dd9583a9d6279b34f8af72a0251e887d73bd4b8d7566838dbdf4ed539ef8261937aecb19ac2fdf5ab7e76dc9604a6e8b08c3ec92aced686e68067a663aa1b7c8099ad77de64f18e0910dddd13fc99b049a11f59f0a42260533faa0ecbfd0f2b65d43effe09f10d718f0a0bdf4a03d791328faede16cb85f925b8a80db3efa18c3a905bc49f7c87b3b7c43f1c0a61e9dad7255f7558f14df34629daf0a0658af1a96962f630584e4e1324c1af06499b8691bb4f8c581c459a9f337dbe0d9a768eb0b64ebc42ec2aebab12d8c1c624b33e6839c74c9fb5369737bfdb9e83f62c0b5a5f653f5fa2e3328577cd7ad35bfaa965870fdcb422e89117b63ab989e1760fac4df0a70ee140caab39e801b45438708f8d6f651fcd233145fee337a7c31a42b066361cd8120a5c2542717ff179353aef342f0f691caf1fcb811e3f6504e14d6d9381c5439b098ff978b01b1331b8b08b62960119795302b12532f94c0c93d8ebbd17cad9e5050c31c5edfea1e38b7a6d00ed64b74bd882fdd4698ee343f88a33ca41542258c67ad5106f4f23f9743f9df77c5fcbfa0748b9750926b212d70c4ca4478ba55c1382eb417f3722da3ca7212d8b1bdeeea6fcecf05be842dffa053e317196ea5ab6cc7d3f65de25eeab5c038c62c0778e7d469f2da7fd1a13271e125b079d79b875ff92f4696bb49d88034bfb49751f4456ccd913358dc31727ffcf0850cadbe019c33347d307574f9d47ff6187625d78f739a28c4cbfc352c24f7d22954397386ac26720ead9976cb0cd29a865b0b9902933028035bba42bbfb725901e30352a2fa13667f70afb5c8a40d0b72b87bbf5b46202d539aaed0ce8decd3a33ba3d1d320ba80442c10c87f346fd76210eec0f6070a9749eb4275c036d80081c09387939a6c6e013275056b287b7cd8e6ed346f5020045ac00d982d90b43e22044aea50d1a97e1b264512f91ad06a4bccef9033ac30d30adb78be8326120b08993250b761023f0669f977b565df2e3f157e4acf858da1ee700c6f5d6161e5a9d1f27123b3073f67900a8a3ca41847276311eabf76c6ff5a30410118cd345c8a5103b2226218ed931b00e0db501c33993832f66ffa5d29f29eaf4a41d409ee3e88eeaa3fd8c7c83d7d75123df45b8218f759d47d8ab0d02c1dbf71652043091b0c0bafd891846dab29cf74c0fb46910b431f2b449272808b3ffa3d0f1c804bb43ce3599926ef3c80c288aef0ff6e0ef48dcb5171cc12998467d7f38c233204aeae1e3dde0358b342ba39276a5b425a794a16fd717201a99c47e13b78fee8e24ed214b323a161705583495489a963e1ee0a6a75c03ed02f57329e8b61ea0563394b5f50169b99e25db031dcdb543353e7413e50ea7cfea939ca7859b38f27e5d27c569b036c5287bfc39b16dc06412ee9711b255cd6fd95b861f72cfa58c108ced7b30a966e3beef03feda9081a0db1592c894993b74d7357bba38bb2d1513a72ffdd152c4ba666937791e9ec2a09a9dad5f1542ba87ed09c1a05ec6983690963573d41517f32ad1e2d308ff490b566d30febdb8125021bfa1f86c57ad968e414706c2592635120f4a331d1bde8a186d63cf13630b767d3f63eaebd835de1590addd2185ba29250cb7c2e75b4bc5e7858ef79fac6da209714fa062b0f9b52e6bae227c039b766bae73a8ed255763cb9df8a1e9f9ff7bcc3ead3f5947bec4dfba94fa583a91c5ecdec50cb7e2c90dcc9deaf37ab38aaace8cc4f258054fb23265a58f3f9264beb185f416cefb6a6af36dac15d943d6d61745dddfe85273282f542a09b873db08c18949f0b9d6022347f686308e0faba8b04f402e9096f1cedd6f6a904c45c04c24d40cbf00dd59dfd01ec06c2281d1c8a0943508d939924b449faf4a8170d931e34c85ae2c77364797cea1f01c000fddeffa04954aa31e486cca3f62e25cef6005dbfbe2c40b6202a3ef72e504f32f8fa56bf4fc6b3c5d6c5ed963fef472c9809268b8865003a6b9fd677c7263c4f788cbce4e66c46d166021b563474118313a93da02c058c6c814ab2004c0bfda306d690a5bfade9c13cbbd44876450b7ed360f1b22b865bc90bab70055f7a39da2e9850960e140331a563b70177da9b8c61b0e126098fe4dc85428f1b63e947514a229b2a8427298f4a9a2205abcd581849298a70385ace1368907da6ebd1cca4f405ced7a46fd35696bfa3c99475b7cef42b6c255a9f6e0a4025ba2c69dc2041c6c27a21d14687040444bab1c46c310ced46f4b9c2c64b2d8672c3306060e8b41ce90b9dad63bb343de9e572be296a4ebefcc2a21367ebf9a5f8374761f89c8860da21bf9b1ff6538defa270e425aa20c3cd3482cedcd70b492674d5d11ba21b5d162aec2cf3bede8ef68030c909a71fa628e8b047cd82beca9e0a605032aff94c4da5b7c5877b51bb7efd36ff1db797d0a05dcf30927590c4cf667b41e5fcbed8c110b71743b2498de977f7d8fa7225cdc3f243fbd4363da22b279b38ae3eb86d10fa4e74910a2290d68f07f9285d4617f444931bfb3af1fd41bc24a6e3ec9273cdd0f27027d9794ec6b0cbc22fef7529c1c351138ffa7a209392bc0f2f6cb9a74823579c50b6ba222a7bc7e6599f3f8dad0ce274fb0b22d6a159c5f40955ba62206fd24ba40871b5824e90b86de301be266feba2d4d37869fb6fe6d7da3e012ee724e720ba751c735eb79adab5517835be9ab14f95ea0764f253733d4a6c2a77fcd12a9ddc5326e620356a9fd870ef7ee5ebf7bdc6c54c5226831f96b28682d7e1f30125b2493d78674664aa3fb7e4143cf2138fefebb3bc289d2076ab03c6c927090f5aa4bdacb4a4793d7c539d0270143b993869c3da0d48f04a4fac7a52b64c91a9af5c271125683c3978dca6a72d1c36fd39cce42bb0383ae1943f30b349c31b6486212be745130e0d32135b6ea5a562b426a1d3255f46cb8af6cbfd64de1b14c4919c22bb9e357d1d4a9021a564504d52615107536525209ab9db06f3fdb50c4e3435a1ea8b5ff7edf4eba007f39d555c8c8307326c33e8b5800503cd13316065f0862010a6f30cf3f37e4cf2edfd29370a90395edef3625fdba26a6cd910bfa058f633ba7b9f2ac3a8e08ef29df027866e01341528045bfe1f6ba16f99c38891c01e53447394efd1a78aec838e06eeaf196e8e01f1b70424dda95f21ffda499ee856e54b29a4baa251f5fc2258a1cd25af308db1a6ac194898e3ea3055c5713c1448803af82f29ba4aba245b7861619ea1efd980c153f9edd3b3d92745f5ae0de66baa9089a4ab9de4400b9b57c64a5e6404f81bcc4f24891091b2633b1b4e68d128cae83895bea1d100086e8130c60998084fdf41ee37bec1f5fc60cf86d0f1570877ae9f72d17a73a2a1418f418314a0726737acb191d37a691dcc5dd8e42c0a93275018ec929c6e806cb0cc78fff40fcbd4d17749c17bbc53acf27071e67d4e5160895f33606bf431d148e337ab4c488cff293c17552bda5e107fa1f25659a4bb9996bd17c98dd72f65564e0e0371ed3e6cab659abb5886d0eec06ccac265a04a5924dcea4c5679d19f75777c9709604893d48e54627634649e612b7b9915c3762590192b477a4ee0f632fa03e47744441b3100c4f9295581b5de887578ee70d76584fc6b795dd8b5f00b40245a4ffba9494d777cddd67ca0bb94ee58b0544ae6bf50112b2075b9c9135ae46e96f808f0c4865cdc8f021c5a2620d795fdebc41c99add1dafb5634a2e6ce4132f903fea313782b749b30b7066c0edeada0195ef16aead90b58740bcbd0c1f1221ef84f48acaf6dd560e6cf4e13bb5e1045717dfdc993712cd65381cc67d27ebc67597d49f6788e6fae98e789b3c2f05e6c68c3aa2c2444cfe37958fd126c4452608bfb3f878027b3a2cb7251b2921ff87373a27f1939be650e59d3f6771bec84a9146b91e632a4320bf3023e96c5476f0936acf50730687cb5799540fc5dc1d39f9720d9892c9e7b38a41998d6b901327c0655947ca4bd77875d0f6528ae7ecfb268cd8ee6ba60efb7531af8f909c7e36a870ee5e0133805e288c4bb729a8dc9902db41a9588b6101694a8f7842425e2431d6b61e7e86278556137ec608e4961a74a97150bf3e87cc4cd25ed0e8485bfa45ddd80eaa0c77f6e8afb5079066c286633c906b0a8829640812471dec771ebfcbcf7db7ed8c15b8c7a5180329f507e6b9dec582a031efd2835270e9b5974f7babf2cc9fb0d0acd3d940d1413c580d415dd4381ee901801da7da01bbab709637cd8fee50599ee25008c705492f587d9f376912c64dc0854d5af1231c36c999fa19ed0a5252bf5f363b81dfa46cbdff082fe47b033435a56b86e0fd93be6c03cc7756492b01fbcc8d5ab784d9594f3a852d8c9a5c0629897e12f0b9a8ab1f7ab5cf10d365d019d15e4cb21f7060d5d71d19ab98592b64d98ee6667ce365aba6be0964cf8726e315b0fbb7d6f2e8197dd9db879c820cae3ca4ea8d71cd54d831ee0d9a651a6a1f418b4e11d1e658e1d5bf5b68cf600fcf5ac606acbdede16dc04ec3fabfa50696fcf72d0639d41af687da8298597a9d8edcff220a8bcb7234fee413cc02b06110effd80e0364495203a2f365e61581fb46a5426f001f071f390bae65759c4e355c2a42fe5efbf312696c860010f83fb09abcffaa647e3447321d822e4ea68f42c1cf5235e8dcc56d245ace9ca8c829b5548778674862c557c5744b1bbdd24fc5ea5f6429237f46ceaece3b70100dd6560e854b3a2e6540ad6da0879245b8063b406b175cb16bedb373676b4ee931dc3f2346f67778ee2cd48532c64678c0591f3e72ea54f52b20c81c86cc6d86bc91cd2d4cf8b3ca75e059b6ab659cb973aefe6ef74b868125865904dcdd709b369d7c96f7c083a58511997c6b03f99a4a7e354c78b985b7e394f2b6ba1cec791865e9fad7fc4b6ca4273041021001addd5d604177b2b73c0dc331ccaf1935b2da7181c38dfa9fb24b97aaaef128393684b31bf864c5bf7fdc9772913c40e0db0546d07b5a49e508f3e96510c8ab04f6d915a4dbc070e2e6089851bee2327244215c52acfd78afc335a2fc00e916f951530bb7662b42e610ea3c3b90215c6ea0a73884b2c7f57483794adc09e2fa8ac87afba022059a2d9329f9bcdf8a2d3a531f51e3374a4ec7cc4757919646d43ddec96c1b89d0052dbf206741d77d2369ede24f0aa504e31e00184f993075228706c6e376182b026b2765fb57328aed71d3a86647868860ebb174996f530e740ad2ebe84c5767206a5e732c895b33d9e696da5e36463536b572d4cb809863371db5b0e0fac224ddafb6d08144bbf8874cc9e09d637e9be30fa6c16c895b23ea4441ae742de2d498afd2f67015ff4953f8cf638a3b9a4ce45edfc2e2c625b10c22e94cf8422406efef356daf797fc6ee9f29cbcb4b2398b9278041c4e382ab2b1e2f1503e4203c51f2509e65ebd7c1b5846b81d6fea53fd00e2ac6995dfc72b5ba858f2d6041d55d3da71159e971fa276d074e13e29982d75751e9c681ed983a6c7f13cb5313726035bb6ee1fee8a0d29d7f6928836b022da777f3d31be08c27c89e5b64391f84198f1fff94a8968645ba566b7b4da44e41831fad45788fef1c4345ce8e8eb09ad78e274bf85325fadf380edd92cddfc7c15ebb4ea4241601866117d5b0d0811728d763fc739af17f2d9b1b37f57077ff1bbedd80659b4d93d4968719618b1b999bdf78599cfc93a3af580df319d1f764bf17e8cb106a80f6a5781602173aca929f2ab71bead486d8e2f34997866ef88939ee7f872b1e4aaa677a3718584c1882a13dc28bd3df45af56f170bda1a3d5ed0ac7146d1c03153fa9118cc49b5baffa508d0d51ee695a9779d6f5ae121d29f0a02619b569c57b26c8e269af56d5eb5a0b9cf9e6a0ff2021ca185b115e476f4498802228aad1e6e0754160312137453260e23ab2822d40bed63a136fdc9f00596269b00f45b4e2fd0cc302e2711c5803cef1325e086036ff1cb0b1121390a79f8c473601d0fae9fd1debb44bcce19e5ec44e6341ba347d430c20a6b099d8af9784ad3688b2f07641173016c59b237293df5e5ff5fe168e3b32ee76c3e5b392c1da00340c8252126987148cf8725e9f538ea58af37a82d4381f9eb3b47dddfbbefaf4b115c57c48e6fc2d994cd8ff5f1e30b876b28605f9ca2095b01ac89444df65df303cd2fb8439d4cfce4b45824c44841b95cbc71c6981f4882e5f6c92f8b3b93423da513c4ee2af9f8e7c3e83e176f7237aa7a432addff9ca710ac046a1cc53a81e86b6db2371faf17c482a80b915e874a7cea3e53134aef11a956a1bbaa9c38f92ba8a448c583589fa479fe53db1f6938fa95cb09e3092809d97c0aebdac977ef2fe3204f415edbd9ae3153dd9cbafe494e025013f5432fd7c8a7a6c25653ddae1ba4498e52b8200d0b3110727d3530c79db9373af000ecc39d5edd07c642547d187487cfa19a0f83e2019bda269ae6f81243e6467c484715812a1784d19fc3a34ed942d8d60b90825c2a5edd3ef10826d227c7ff422428149b92bcff20711169e45de27298148b53a133bf426e407d9708ed402cea9b7709141e34415bc028170388cf658fbce83fd8a428d35d912f93da1ebb971cb61c3c1356e8122994eff5d2e17179640b8f8c2a060056b3eb056470419f067f7cfff5c1c33e3932f64e4a7af03176bf096882bedfaf941a57e751f3de5442bbf5087c45ec9f801fed2d60223d752347bf5c6bbdba9d5538dbbda18b7e421379292018c85974ad9882747df351a649a534518d4e1c3261b5826f9d5fa8d14061212d137293238944bc0bea15b32db0817030329a8fd67f3a51e68d98e469931ae418b36a2116dccca3dbefafeb7020817ce2a0c89af1796f5208b95dba72d24d7aca41d98bb36ed73fcad3e982d961505f4e1f01c6eb15fb8cbe68d7b354c6a1ec2a04e65a64060e99c1e0ecffcf3a94215bf96d992c1c8707f1e32e567737bf411f46ba15906e19b8a95ce0eab975f6cbf374339d1c55bacc8773892b43ed4e81934d7c449e6c9fa46890edcc01d81d64fdda7c5a238a3de26a5e10bb21aff7b46d635570f8c94866e8c4392b0e2cb2f460716f57aa81b75180eced8d774662e395ce6d20054cbe050f40ef9248385c840682351c1703d122b367452aae7b3616f2d6ebdc2dbfa689c74b358617c6c41ad654f531d4d8335ce91543182f141b536ec5f82cd8e8abfbf72e3391e39c91c1b831d81f47c884070c400ce161d9bba4f0e1bb996e9173628732133a14836c7e945f066dda9b6c2c032ecb0cab94bb1061745daa5780a6c65e9cfa091243fd5b5227a6a3f41895d1b627a622770bc69fa7c405e8fc7eed2f66b7128746a4eb5fdbd1e049fc09a4010d75c5aa2c07825aab1adcd9c352f0a686ca833b166edf9215a5dee85c3444c1f05f512c3150974855bd0a0715c65632a61c75aeeb6880fde9ebc5077b611b1b472c7231f0aeae728ef7b6fa5ba0c7dcaef60f662e5c77a73feac02fc15ad116fa254f40d0e96fde3c0e0838fba9edab87a079ed45106b9900ebf4e796e60fbaf19211e139c88196484b294b5fa96da71762dccb9a4c05d912368cb762cc7d1015bbdf9c93158da29bf641bbed68f2d84784608693daed715f13ae278dd5c21f4ce7e2fa47963a081c57770e0fad2247004d2ca89a81ca68ceca83c07fc986f07f5f4282bb1431d2b2b5f4ce2c41a5fb280769b9160844c746a23209a1707389976c26bd58561908475ae082abed24fca8f83e3f6f380495b1e4e38b59912ff47a54b63186269bb0c28c62b3f67747536968d4c40cd9b2daf6d9c0cc10f66239125f1c68ae4a5fd40a94a2e874a7b50752a152cf57b3f69ffdc6ee562f65b55e45d77dea368b0c7b09bac9a98d4717204aeae1e9b78d76ebaef698b11ca7cf6dfd02043d88b14aaea645ff7fa91d14a73b8aa9989430ddc6f1b0e46341845a6d212ad6eb0a84c374c97f6bf030f355a30ccad1675765d138ae3bfaf605c3fb6799951e7c26cc1cd55aae36868a8f811ca5f282db66f2fa4acde003f2cf2e5c624d8b0276435000d9421b87c920b9411aee4ae37e2a9f020336e727dd098b25662556aa63c8d91589670e8740583b3da6cf191dd70b368e6cd1988d411aa3fe7c093d3fca1f2f03ecb2ce5e739bdc1cc730a9576e727d498b873a5ea56a3e8daae187e934af1a730a0ba533ea52638786f940baccc53ed86a3e17c19261247dfa957dcf28e0620dec5bd92e2ee39925e912276e786d3fe611df75df8f671c74740d671a2e1ace789988b379c6b8469ffb63a69afad3491986539de024e4ef1a1f318df1cec5275d197c7b393a37329cc1d40466db5e2319d380d7ebd940651903ea367d91493563751d799913ca24c5454e8bfba275978f00506b2837e34616281eabe6fe0fc033b455f5bfd8d8e5c28eb78181d7826b2313aaa0c0c5355abc97b635539e7d9074de0b36d311c93e3aa4f92f1f03ec687c1675bfdb0b9f69b0579b1aecf7fc6ccffc2785fe4604f4d590faddfead1b5643109b10a092873a9d70b3a2db93f51eec15902a6700f3d23c59a4d3465d77fd1f0a03db38e1569629ebe81745face6c7231306d38c6fd9f1707dd581e9b6824b90b9568cb817545fccf21bf55b2f11f0a58ee9596218a220da38fb5aef05695b81b39fe80f84a0fbf2446e43045c4ff5b93b2ecab980224c733a1331fe3a916c542d7e77fd03fbc1af23ecc013bb1d30ee964b89fb3ce6dedc2fb1899fdc97088895769f190bb13b442f3bfee1a1e65ca63ed429afa54c5265585ac43c41e6ba8f7a1cdfec126dd361b4c071f6c757b380833d2c3f6fdf41af6273946c211cece959e5bcdeae7e2478631ebbdb81ddeffe01fb0422e31c172acc905ca7f0863a16a345a879368ea908a8ab2f0877e56c8f39923402a59f6d6805359f6826cf0ca7e4c14534510bdb92f3fa5df6000aa3b4a8a74e573db59ed78ad7df253a63ef0d9cfcf5a864722697d390cb3cb0ba4ffecd8ec589021b3609fbfb9e77a1c15bc84a3d4c3e175e3487d5e2f9350070abde16dd1c20991cbd6fa7255fd7f383cd686b26bb7db02c6ff369755a8785ca51c322f6b4a67956bf893ac985beb617de5e7e2db5efe579436b0cdc71aca723dc5e60804193194596e7156cc2a46fe9e91af1d6edfd1da1494f4e6ce10cfb29a5f05dfe256eff65edf9c59379116796884e74a6a63dcf410c209ccb0b20d828393989b4e2a2a2242f41d9b21b9e539a36397511811a80d4e68f765b5290e4bc109a52690bd6882cd54fb06d4c93aa617d9c51ac012bc8e982dc79b279d5a761d683767f036347dc7a73e8197ea9e288b8c7b8caa8da0ddb4b980544c3577695c595346b6bd137bf797eff3b1449827c924c0911dabdd646ab52a7a6e1aef8e498303ab297c8fe426ca14466bfeb00b974a9d106394fa8a84c9cef4d3744a4cab8f4e7e92982f211ce8b8610d416e3cbea618f2c26f7fb6c89c73aac36a0e0a49243da7393c7b98a19ae02cdf345b2306df3c1d8364f55200d721848824c532ecebd60f668efcb27d88968f2800fe2636 +0x511ee3ba7cca58960e5e3865e895995f988981d8cdf2a0fab5acbfbbaa0b2b5d92b3fd5c920f2529a5739fe85a8d94bc +58840 +0xb3701aacb50f918b8a79d8681f79dc8b6abbef0cf3386ee993f5a1567bede254794b028577dde83f45c67bdf9873c36052d04a2c03bbc931b0b90038d4e7e672a534025498ce19a527da09d6d268f59164a6a294775321c03a77af6d7252d901bf92e4c121c96be7ba1d4af4d642bb4728a5bfef56eac0beb999749e5e14042850cd6e7319b5282a86f806e2abe75daa273569e3a967ec52b38618739e17af10df4d6913887c969912d10447594123e1e8bf671877b2eea4b2a663933c4122e1f4799c487705fd59e6110dcce9365415f3a98238c8b30edd3d611ca73f7ca4c217bbd1bbec38a7958a21e91962b03a6dd15d82e8a5529325dd1f0d56b0af7edbd17ace14f2fddb73876760d5cc961b1209412fd21477c7a31848fc4996c2f955a91f5cfa8e3ce01b634d39a82fd0402b23bf509e200af0807944b228f99c5b5828104315caddffb6a93a3e3c9445f1e1a83eaff4cef357e3857bf79ae227ec0bd4b64b0eadc8806cde96353602df765c1f26127a281a44f5c6569247574af69738793c8d3fe6ab648cc8e741828516c310de42db3567fedec33b4dd863edbf24d9c2dd39891dc7c73a3a1c031b1f1a3e03d007bdfdc3cfc50493eef50bf890d941f7f7bb92561ebc71539c24d596caf7816328c98914fdd212c73e455954b1def78252ba637af66cb87b2e4db8d06e1311ff6fa6e044d12f743d057154e76a5c83c9b6df026f98ff971a9c26cdb64ebd3c0ca2fc0a399301b25f0b20049a037b6e36ebd2791f4c9c9698ac561b30b21b89f28a7510dd8b73559417fb7256c3623e2fb83ad0705a6b3e5e2786aa27e155801aefb7f91601aae443f3aaa501f43a7e1ee7c00d4c099516d2d45d83812494a9ea996acdce3cd1e7d665d4a584dc2ab36a3e0b3a9aa242a75d7d84ad28c3008dcb4f3795ec850ee6b436217bc8c35b677b86c45e426d997768e8a2300206c0b326dbc6585824896a452e3b2eb4f3f421b98692822bb2c31059de6015f934fda36103be1efa616cfaf114c7c62fb31e6a8c081ead3fb9e8fa99276663f497dee6e690c7efba83dc1f20b2704c234a01c95cd20fe765c92ebb918b5b22da758c031b498bd480d403603acedbc77701c4c691ae0e38852cc0dda8d2e75b95172e826af8afd4349a0945a731b33f132090e99362c3a98828c4e845c3b3150cc5edec3a63def8be1e1656cfa39ebddfef8cbbcab6d54154066362d228675827c7f1c8f253be4706a8501c1beb4447c3b5e1c39f74ed09d20ec4d5b6c7ab2cce64619efc90f7c9f480e21ef1d34fe8a7bcb6897862b207ea8710c85968259ae9e565f7bfe2328671edf2e4ba2164a5734a3496be4acd4585bb6ec423d580a960922759a31117876338a9f7df9e2d880fa88271daf2e5cb89f007507cd562621bb3cc4f10e44dd3b4aa2edec6125298631ecaa23222a39fe06f02f4cc2f74cb03907f5e6e257d724a89aa21d9457bdd57f331b230a4afcb708088387bac5deffe716610259a4e6d0f1d44497ffe4f60d471e1283b3fb057236ac1a5f114c5d3f59da9ec9d0c69cbe9b025dd1f077628c0de028cbaba4e49df77d4c2962f5681d15d717a3f427594c28874652326993d0583bb6717de32ab8eedea17d3c4b60078f9e64371061bd081ee5a6af22460a889a83540b973048417152a2d0e9d8d58d4b92fce9c1e03880e2aff73f4c872703695989f08416bdd6237bd8bb0808492cce475a32953d4c451848a0891dc789df2910b0c6c0f10bd579bcaba223642b447c4df4b7e6d368a324423b131261938a7e5b6104da69b2cde887a40cb8770c92f9f964d0534d3e499b1f4f73c70fe483cdac23213cfb333df48f5a7123ab6d66bbec131257050d96e1422611a80ced599b657fb265000d8422162766119bbe5e369898045e8587199b5d878331e32e8a6c19cf2eff12c25ef5ce9361fea28fd7fe816c1cf6591b502dc3cc2f014d2874b45ba9fd47cdc22ce40b46eb376a42727828f7c2aafa3ac91d176c9b72955bd7088d98a3eb7bad6c817e8a68785d86ac3801c3abe8e375f2fdbaf15f124648ffdd31f3c966c6e49c327b06702df6cce3b2ae781f3caf5d4c2440f2c07cea607da6eb73c4261a083a8ba32378c4b075b77c815dc312a84153352bd985fefc42cefa1c712ac5ff78d601696a18d92511a5fa2d1d0e0778d2a6b4ee2e1634f650624b478473a2d1b6ed283052a6d7cf412dc0041e76879b7195180a58d7ab5329e62eef1625695b52ee54ba75c95d1954bd4298da831f8abeccc2f2f260bead2fb8f995beb675d6dd683b5a3be6b59dfce3166de9ba3bc10abc6a4a73480b7ee2595fbdd6ad54eea6c930821d858dc77a2d9ff5c49278c8f5c2628363d40e22e255a5ca0680730d5fbfc8d4b33c52108cfb63c2e392332d009d40104cbb3333902c806cb6d67cbd588a88c475618f1385eae647df301747ab9b77738654174b8c4c64087ff5ce6931d7e4c3dc9bb14af56abc17000271b3575b9d4fb94526b52743b51fca84e4bb6c166175615145216bf949930e7ffefab44c15e74de4ee1b019118251efa5c0e77d4833b9c18d7315a25135e430efb7812eb85fccce9d9f7abb2f1baf5cca0ece580ce990558c3e5306c9ddb564613d623b841d2ae9a76a57627d643d7823fd125a9b81005a7b7c79f3e6d9cb0abc47f4740ee1b7b9d50def17e3a424ca19545c8bdb433357c1f52e718f704daa689edfe03ef29ac58d4eebe149258bdb15dd53f4b57751d4c6711b89aceb63cdcd0acc87fd9afc9538f7f3c9972d9b317d5ea09c11648159f2b8e842269237fa53526372311f05b23fceaed6b5057b56baa0ea8bd853ec6fad913ca5e3adeeb962404ba8c3cadca3089cc5108bf555d2356bdacaf08cba9d5fc6bfb8cc84b392629a2d319ce3aaf0fd28df7f02444e2b558618604357126c701d1a85c95fac0ebb29b016a2b29622853ca52c003c90eb81bb4b55b8fc1c63485ff514c38501b4d5b57d5ebf7ec9c0079ebf1e6e23439923d01bb236c2020a4f54f76ba03fdb0c18063b11da916b52ed17d45d35428ebea28e327ea7f3e9e9eec3c9944ad5629fede39338db31a3609e6f8cf23be19ae166bd35c1f2d5fb898b751397a78fbdf4ba152ddaa9a79973826e91e46a488f8ad725cf83ffb1607190337c7aa1b41594e865b0ff2e3b761201dc883ba9be94425d8da6cdb6ce402963c3ac471f8e9105e098c5af513462c683801c00df8cd18f60bf62a6ff76c23a6eed4c0608635ad1097913f3fadc84167023f33af6fb6ffc4881ac17c2ef0e2b177b04bd467c977fcacf43d21179058a308db5f1d551960e7d9c2c27e7824d84c8337b76c02171988d61fc557f540caa2b860b2d64d66d4f67d889de5677a7cee8df5a385e9a10a3b9f8e7832ab5c2ffcad69df78bd41d466efc6b44f716438fdf45480c082e9b28b65cab64fbe34f10734412563291cd7bfbd27c62b2a64a52142eeef8a6263ab0eb55f100da28da658f9a12534156a6777420613f7071e39cf161f30720ca17c2c2ab6160b0ca8b87879e47f5a06bd0c143afc5e317bd37f7dda8013e5e6257e6a225a28b63128bfdc1195644381872e1ce474e5791d36eea40c9bda7493625a4f38d5d89dd48024fa7d2ea48efa5b5607fafa4a2c4fbaffe838dd149c78ea7851ea9396304b41806a093a90aae59c0c5bdb170cc9a7d22b90cbce52cc1b105108942df20c29ef3a913223b915e7ebc98ef135adefaa0f0a6441ea05920e868ce9d1ff6c8fe4dbec06a4849e5e55ad0627f9e09dfcbad414a937aabd7ca7bf845c20a2764a00a9fd40ccd7b0f2d3525a9d41a26d7f7ec3c2f629aadaea9b2dcff61c91afa8f1dbe6c617978161c59e2f8564f58cf65a50adc17444fe7a4d43d84e0257695b5ce4410d114e9029c0d30d46d0548cdfd20d2d91c413989a22b425aa9e6e43af9655948c46575dc949837c781039edca7a4bdafd759129c8dfd140b22d40bf34329249da235c5abeb431e58fa1201014b7bf3e5b25383294c93da1fb5b694c77b63ce96d34c80778b560e1040fa1946d1eb9b0313f93336c735bd1cc95626bf8a5b7ebcbf724f485b192e75bb838fb2213dde916411cbcee62be58cc57a6ae156595d95cf6fda2743d3a711d4740b4d24b9e3180c64f2f691bc79f613eb0737c8a593ab690ac81b2bcea06cf1973420c0a6d32073ba51b8b031a1e31a71a6c9c8864786f70cc22dfb50420c7cb2b332de4ed52f01db8f1b2bd287da42d3ef9d3f46a2acdf3e6f649ba2b47bdb8e2f8c67f712cf1e8e5527eae75063f3db89bd132bcba78b6578c8f40c1f4178f3513441eab187329c4be5d5b82706954f1d312e7eeaff614c8461ecd5abe4b9a9c134566fdbdfa5ce185cd58d324c90f852ff7686293acbba3c386c477fee087726948ccdb860dfea6595d0ad99bc4d9ed131d58daee22f7647545da8c4e7cc26295acd4e6f9149b8d996af6185df320942cf32d9a17ef7494fbda541a1556c7e7190003829fb49021d695bf11e3ba8004bdf74b32b978afbf97c2e5a3fc25247a73d0dd40d24488ed816bba58b5a184d976b856374b45054ef98de3bc6b5e549726adb6a4496af25b3a3b6c4f5c4e8b6cc7a4c31a35db11cd9199f2b5db78d4c7b1e5442f5d9e48f561a369883ff82049315b165e01b151a5e0858742c4fb21769615fa349735194688222675e954cff93439c465574e417276cf15c5c05bc73e53be4d768ee5cfc92e4617aad0eb06e750cf51d27f286dbdc4d512c1561142897b5cc2479d26f8e7b47dd1999f0141ae078a432811d642e24b3622b7eec20fe26d6fdd3a4a5f113cbb37d8c4ac5e2cc7d9092cd897ce4d8a7a70ba3c02d49bd3ba7602b13f14a542c31291ae714814af45ba53667976fa00e3034da02acf72c7d2edd76eb3de11644c7c90c9866595cece1c6b444f66e4f0157c5196df2931495755dfa57122024bb8046aa8742d2cc0d2bde91482247ad2723a7a82986833d2a84c6017df76e453a61863cd93054610040d3139aa26482299cc0cf5df0316fe56102d1857433406974720ab9b847e26d298f8363fe2b96aecaf9d632b903726e16f7b29811d8deefc0f25c4d631318fbecf829cabf06b15fb63b04cf68630d6cab8feede57c3e7754def79bdb820cb5393f84cf86c5c9ae4676ca35c85b80a8726b0cc7ecd5d23a2244faa3240d7c21d257635148d941ae4e575f903996a2f68914493a0fc0e591f4cfc37d4819ec700ab592d47aa18f908393f4fea2be145b7f3328c6e6a3f5393cddc68ca05dea0a42c8b7ab94c4ffff76ab1ec39c384131b5562ff0da156d7a7b0d9843d540016b2b0f36491faa1f35980b21a19e9bd633dbebc33a829bdae03fcdad554f46af1d2407935f83d769fd8842c1fb226f4fbc53628726588daa04eb9c6a1386f86f9abe20533159c36c91a7d06442b018fa45ac68e026c48177430ef8731104dbbf6e6a07fa8119f493ac77328d1ac03f726a474d62ce6f0dbf453a704cd051470af2a82cfda13ce18ba886e7a0e5fb294494d4ae838fb098de65ce925bd3f4e0fed208fde1244b209110577e3426a99ced5fa50ac6ed21a9713f6bbd248e582ff7870cf9297cbd28506e5954eb7f53d0e91558d0b1694ab6043c727f3b71f39a818c14ad4b3d1b6f562d0d1a0b32928ba460609eb776845503d7734705217fa7295bb098dac7ee7bfed7032c27f2de13cbcb5cc36da776fcfcbafea3161f24dc5b60713a3cbf9ec4d6f6ac09c632af0fabb09dfd287e9b145b317521f2cdbba09444d7000586b4d05b0698316a648de5e0baa49a9c6e5931abe567320fbf8caa60834298a9bfb93517713841992ae31ce734112a1df939eb6b415561d15710404c765452bdbd245988e10ca8b6d8574b4bd7643a4191c59825dfb01ffc36ff18b4c88ccca6217eb41bb095d5680f42c77aff0e299bea84ce481b17eac4d1a17a45e44c74e76f30eb6c7a646601324e37f1258fa67145e0045e7ded50efb9900b5c4413da1608e355e7a8e8c936e3d2034ad5590f86467fc0e582b0c0c14153428472836aa680fe8a19b6a37d5d8666cfe4a90ae33f5ebc8a59c3f2d8de2b53963afa1ba51d59fafe7f4e150109bc74e45afb05b001111ed747bc43f7baba299d0c453d27ef16513984b9cdd2bfd894e71a55ea047fe01f2e1bd5f4bbdb803dcd54de78519028a9b1c6942e90e47d4f4eaf44284f005e45f5629ba583b510188dc1404dc0a5135d0dc167c79a1c0cfc91864030fe46ee2bd3a887d6eddbec4274cdf53dd39268f383e19f297ccb2a35464bd4a4909812293f5a250958b4673408d777c928fc9c05dab3c4b4a7763771d34c6be3b4886cd69ef3fd9d62d32365c07a42603f281efc78c45309b8a1c74adf14808ec8ac40ac88f27c338abca3702222df9374b9744fc47fd4890ed25c28b040ccf64b58402363f21b4c4ed569bba46dc9f368353e886462c3c3488c6883fd3d7bcacb20edc3d67f75481db1e8d0ddb77bd0880fd03edef9ab38c4347ef52c87477cb6aaac1656d6f4d775e6a338149c7feb62cddbcb7ac0e56a207ef1e4b4aa9a7c9c4a0d935ba5244ae5c81b5a0f89407466e3b3c6ee452cd7dba083db2c040f4afa7374b35b667e42fbeac3cf250a683c32d5eab99fe2cbf2546d8761094ff0884fdb840edc978d2016d33f0febac41832538f30c16465d4a391a8efec2daf8850ad6bdfe65c4bb92c505ef84c9cb86e9dc716f36d7dc5b5fe85bfd0cef3181f1b9f9851a7d5aa3fb94e747c645f482e0b713b1d25b1130a3e0967423e4e0173eebb87bdb89e5b0caf51bfa6cf6c3d00853946d67268197a6c04e66dc5a6332cd0e9804ca21d26c91640859c142a5e8b12077e45da0a9dae8e608578ea6377f3ca11ca26ecbcd51ef6020f86bb007578bac32c93e7ff684eaf048c8b36ed9370e31bae721ee22eb25881a58d4c58486e855598e721b04201d4d843d030ad4f4a23ef7459c1f6fb2e43a48fd95099a1167ca50a6a0f83f26f07c4f16c60097529927564025c620239c05314914f2a4618a69cca4439e142414fb0e08a4e6acbb73996c595778d0c7cd6767dddcf75ff1b0c201f9c2733f81fb584565083391b991f38e13c9adfe09f8df612e65ae196c7b41a539a62dfddb03f289ce686dc2b7a4c44fe1d4ec04849edb91bd477d6d1c6a873ac68714fb99df784fa75dfbdc300c9a365601a980a22ffa8e0cfafbc7abdf011732bdce9548de581b7251742add39d3b5e2e87cfefd3caaba9fe88fc575792deef0e2c17752910051d1db5d5b09cd0f630af1ccdbf0456abbd898cfc313a98c16a36e840e61980f9728641dd93036bbb250a61fb425cac8e65994325cf0e09a12ace98cb6d043d46ff8743c21faf75718368debf3f84d33ee95634dffb7cee6878fcc422d39350d20c4944eb1c49f60293f01c828024d3a191e7e7937b2b4efd9ce8f5acdf6dc087e1f4ccc25278f7559dcba2adcbe3b5a1a474e4a718c53148debcb2d15b3a954cc5af61ae88e57e52e920f8a6e96980256c27b4859aefa031869d84f90da4d70802a28d17883896e1be18a7d7a25f3c142f26de93c953a1a0dbb5f28cbf518fa5def6d765181844ea66db36a6bd6df2583699ea3b6d993f7d262c84f237e9c50aa2d3c701012d925527902d7d043aa9d8c9a960e44d697fb0af2ac2943e157f1f9560e6510a20870a4a5f15c33d6f697c307dc9f532696b21bed635d89b7dc7cc01c6bbbefd992bf2167174e031b33a2cb23fadd8e4440ab99b58642718c8a4f92c2ccfb1a13f87f3d5eed53ca8af25d0981492f42ba0645e8ed9d7ea7b9e1f8e5fbba890bdbba2f6cdfebd3f6a0b31502b2602b1cf2682f9de8117878da93e73e29bd0c41ab485e448c7b6513e6e6794b09d8477977d6b73d477ab68168e0b91fdf3cfb680d336a38c7447daed80cd8572a1a1ae4c4d27b2b8e41bf3def88ecef8eb2bcdb6c0bf1de12bf94240ea6e09b858dfbeb640bfa0d2eff092ac8dce131aad6e7086222738911452f1fc544f09c9edc9109dfc3a2469c1b1ac49f5d349ad5e1f09b6a277dee359dc4fec657a6eee86e40ac929a025c681e6a87ed9a556f729c7ff0fe7b6f61e1f1fc5d7c6f61e6f4cba150270fa8d325818f011e14d244134edba599aec688b91a2b9841fcb039466d29a0f794f43f36eceebcab4d299d2a719a25c62221c72d4ed94bc170204a5fcb4ffb9eba72f51ea900173fb3c9ff4abd41fdfe85ff91b1388bf4756a108e938e9aec86e0a3996f4e69ad25d931ded68a499acd3abe9cd74fca0ed85b3f9a940f80d04ac814908b6591eb183e0fa0605147889cc0ed4d11fcfa1764c3dbe2d3c6986344a1347f15570f5d6142b2087aaa9243f7b91a0703d8c29a952493fbd55c57f22f3c91b97fcb48809b97a76b881ed0596873b36eff6b89f4f40de64a1b29262944da9ad43d1ab3d141ad7e4e0af67835599157e9971dd6d30bd0515207d5b965300bee53cfcdf7dbede4952495f9f0746582560b5d782fa1472c53a83dba58327b50daccca6d8b1ceaed9a839b71ef72f6d75c58a4f30aec30626bb13f6fa91d714a0e839f71c3f0d318dcef9df6bbdd97f0d9361026ef10422308015f6e1282dc47e83cc16359143106fadd1000ebf0c37f3b48218c42ba16eec71d403e3b0ef6eaf63cd2cab0d37f2872b084290678f3d310e35b8bac46091617797438791e6b93c728460041db380db31e8cc781c2c38cf8bc20ad9240a349778a5e15533da4e2c9638dbca287d6276a8b7c74e45a9d0d3127037a8b467fe975d4703d5ff93d487b933c484965e3f5d76be5a9b4ccfae478a8967b0da3e98680fc5d2905bd8f455c2bb44bbce1ebf9a8545aee598667a32dd53c177ff58a9127567750db072569f991983f63a858b33bb94eab79136db9df2176e878c7eda9e767514d4672aa16d2695a8bd415b4b3302f237969f067a8fb11c9668e776d313fc36d96ee6c67dc55176dc984b67a69f41a9bd0c2aa0ff1002ac5fa07a083b79eef3ea62970e94b102064610c072458160ffa3a09aca1128cd0df4b9acfebbd933f46f38e1cc8b38218b0fac0944d0e0463d12db574d58e0fa887b3be41ffa3ab58191792bc60d62964e5ef58ca5eec5ddaa3143c9f17e3f71651dac8c32a1a45be277acdfc5c03849975c72b25d47370c902962597d284e1bec01960b00571f0d5e4b5964914cc122ae30abe333843ebb3521c06dbb0014de655080c951c5b4b33e320822f25a060ada042888f14de2d2e242e36f71ae99a31731f32eec926a36cb564281b0920de764fd72075d492c3adfb455c568dae5534bcd76a29b674a7c4adf8ee9929be0a3944510ca402123d9749e9ed9682b01d4494b918d24ec5a6e06f575c2621e8724b2048a37617dd098e92844113949f41059d4cc5750c8a4f446be7e74e6c20854066169b88a03395f857cd1d7a2ddc6edc390b068e7a430f751653167e7306d19d88533b4815e681792bfcd926c8f7f55cea6c428b127045d701016032c0fbe5d6f9873930f3465a6561cbea95f06282fc33f900076fa2a10ebe8b6b17f08010714c1aebcfc2e36f61ab92e8643ebc963ea829d56fdc4aaf60a1498d7a6c340ff0f286e9910f3e5ee25bea490e0e568d88b9872930f2e8af915bc44df6ae7822da8f63a91132c7a75c154a92ffe9d0f78eea8982074e0d400530a432f931cd07927539b0ccc80fb7534a3c4cb64bac52a5bdb9563f48190f20d241c31e90c31cbd3661872049872d5c7d27dccdbe593d61959f3c656b9c4b98b32574b345dad0bf558392c831be67dc2095c9b2bc67f64714939b064327a3c155d7de73bb74c21d55086a011b260546d72ea9e1c0494bdabd3f089e491b963f3cc156cc7c317f5bb7788377605e7440f32ae3e7548d7c70f219fb89f818a166ca9a742a028156feff5c65979bb8335f27430e30039526be458cea75da8f33dc919bbd18e8f4e78b8f1c86fe47c3c0d5c5ef9f683800c9274a306bde6aeffc05346da8059a0cbf6609317df7df21bb5961890ddc7c40d220528cd62013cb3874f588bb9c80293d32d053a130dc32715e8cb7d0294ae5e05e00faefe78fa197b087757e4a45eaef5686cb9715b976915999f49cbb2e606214d812ef9118f3882c5c9c567b55b254658f31d633117e79ef3bb7ba2e8130d6093a6d7bc95a41885cd795dabc3a2ffac47bfed5055eaab963c489beeffdd7ca8fca530adcbe0c26d69ada71896da44117bfbb1a090b9bde7bd6d3217c0ee5ae3cea6c1357dec3d20e18e2c17f5acfd5c3dcdf2baaa2c2377be53c785f0ebaff852d313bd716f91887d43730eaac03175d55d36086b +0xbe458f1d393877c0c12100466a1215955faf462b0de86618d8417af9a278316f9bdf2ebd1ea1d1169232f43d67d36942 +59632 +0xdfbbe12e39b516635f3500a9bdc68b8ebc0080059209fc0a5e5c218474c90b6ff5bd063aa4c4fe6ef44c379166ac3e4a11651fc682a7d859c7170e69c7cfff88d5a6b8e084b287d4bc0cb4e40dd36cd14474fe023c284a27f7be751ced9ae210a4fe5ee681889bdbdefce06a5d44fe6d7bb58684689439ba16d9c0668f329e508d4b6215444d21cd83a523eafb06dd63deb11f13adf48f5c4bf0560f55a01990b6172b35750901f0d28de62e9221effe97ef3276b34f3352be8c9fdfe6eb3d1847e9210ebcc5238df43e8ffcc89e1e85cbf7257623ad0de79834039eeb1bf02f694aac67bf886feb1040881d4584513fa55262dba51605620171ea130b391c1e43c1340a295acd544f193759b2db70754a874f6de093030a20cabc07ef4ca82effd621bda043250ed9530677b7ac6270e51e56f37d2bef291ec7e1423f5c7ca4c211db49cc4c5f62d5755c41fbfe11759ca0de3723e7b10522f0c28ca27280cbb7fbca76577c63986b08a07d27d964cf97944eff7bcd31e655cec5adc0949cea031b570be6dc19f8c5933cf4e24543c4ff8210142de85816dfe8536c42cdb848d1f9e8d2247269ca089e976ed54b969efcf28b3ee03d0cdce7c6d592d022bc2e471ee791b6483c555fb219b3a8f245a3b56d27443cd6367f95f1b1e7119d90e48d11ba11476678e2f0562a8a0243391c537a4cf0ebbabf4812f05133ae451cb2cc5acb1a7dd207b9e31232bc8b445850fda2620892f18d7f864b1b3e4e2249e02c8280740096cf22616e9912ecff8b89dc6cd155dc848a6c198b79d09a3dfdb5d41043e679baba6592f3c751cd7cbb0d1860029f6e7a9c56f137d2b03a9d217aed8c7b399044afc99d282544d5c2ce26d8065baef3dbad8739d78da7d54a9e789e7f8f35ec3e9597aa9519b2add9ae1944e7454911afa44517f4147d134d5af41070e9a236af5618e3c30c62fdc94131868a293a70ff69d9b315cefa9ead3f396ae7f04815a0d9916e39671d6c9a71b5c3776d47b9d2e48b36c223e51b72348ed56c0cef3218064d737f90aba25524ec26377b399431fda2c8837b0835a5203a7988a55e341fc5931b1ef1d44802441fd451b9d7a8239c6890e13e29924ded867dc2235ec4bdfeaa8d9df06006a7b897f84d91eb9eb0a923b763d411da7282ba0aa3efb78afb99dbf284f716834e6899b8b46a3b1de00c1c6492a688b61cc71e47b26f312de07e6e725c6dbf68fe3c703c0dab91cebcad9bc0f41a56ce54a4f95d770c93567596ab34acba235cc01c63ade0beb3594b74e7f3139942c9210195737a2ea7acc1c7d961fc450a089bf0b933b60a6965964a4a24778c154f8cc638b2443e33d8ccfa4220d5783c1397a0bbf515f77d9aa3150a7ca659970a9cdb2b425ca200819e182c9abdba8026bc14b11c88edb5a27cbf70222a6a909f5928b64a4ac4d6504007e0f73e74a0e91335e3cf9454db22292ec43e8b25c8b9cb9620f2970b7dedb9b1a65ee00c6203a3e99837c394b5c5b04c4efa4ff407fefb0bb364cadebcff11fcc5f72aeb8f1d7419197c9c150c301bff557c003e1416f070b5c56ba75c2e50d287eba479efde8faeafc5a740a70e723123ec256ab8aab2ae6f4002cd26247f1a3262d61e49effb8ea03a6d7b5005bbc9fe7347e2bb624aab29fa18b8df86a6bc0f83494366f7c0a33405752fcdbd00af2f39ed0de5e5bf512b1e34cf52ffcb9f6677844e0f9fe7d3b54b47c5e7e048cbfe659f53fddc1987bcd2df7c4635f8ad7f660fa90a8f770869376ca366139c05b21fe61ccdee6134253ea02782d034cda17773ba1f6e78299aee6b3312000345959148d01bc49e42af8cff36cf7988e716d237eb18e5f31e8e9bccdcb34f8573ede04fd7b005d8989fe18412f5d8fae424a0e3a3bc9beecf8d64180510a82a770337839a545a171e4068b823bc9495aa14090049d2397424e171d618f2b1fb391fbc6b7fce6b64bcd94622d1ec555e222e34154723668a05d1eb8e7c2115ffa189978fefe8dfc65ab1a64b854cc55f34b94aaa0477cb3a5aa4fac999657a3e9888f17753685f46e011aeb9a5a58a9fc9ff7247e8950f8b0ba3c50dd78689c10465f2ac111792eb364186f69bbf4c26c746d5755b47db86001675e59e4be98fcf69c1b593bd21bd4589578acd62b4fd18d79abbc553d731214531d6567d42b0dfd9871a3f22b3c4f33149fba556692ba2faeaa28e82aa965777226a67e43e2d1e006b647f0df109298083d3896214b84ff6edb11e9cfdbd88f570283948830d7225961aba488293d0bf2e99e3505dad0515ca70de6977ac9d0842983471b958c58f2fc45799106ace3771d61ae6eb11ae9daa6734b1c16d7ff6c043c1278917fe875feac0c940970d2d751196ed67ec31d7b41f893b8208140714b046319b5105554e155ca0bc2173ec61d2bf2c7846760b111f46d06383468563672d58960ec24123cc93e52c10eabb5ea2fd6dc7286581e8efd1380ce8fcb6d8f1dc6422561d930798cd62376d59e19407b876fc99e6806218943b243f1ee498d5bd1de832fe92210072dd863fa7a72a8b5810bea2e151a721f5a0548e9355ce9b364a90a94d879a8cea1fc18ebe5549b64503b54a3e3dde925e3143df4551a0ccb1b5c2c4f2ba99c49ef08f628533180fe7178a99e58a30f436b499391b2236ef9524258ad5734731f41798c4e488c01ea714e597be80c4cde5f200a5fd0fb98c4a606103defacb5a555e85bbc39e686bebc16d4db269c3a8d3b31e29d35f512c38311f37f6964ec72a8bfe500abb397f1ce7cbc2a78b540a68bf9bd0855b2556c75e072f0391f801d967aa8aa1285be1a34ea7fe8630a07d0cdd209ffc4b5e925fb1c0f2ee31f08fccba3271712df519e6bea70a389ece8827d755a01e77236868f0f388a0bf5ff9694c3d0d60112fb04fff76eda41d07b42173e1dad4269d614ae447fa00826cc81ae47467571e322d45d8baafb1f77387627a6d5507a1f4046d55654ff5c44083464c7f863f9a26182f131c594972398b52b3a01a9d314fd9390bf48f69cb02b2544a0572fece33fa777643f253d8824859e82330801cd66917cd9dc243e1dbdeaea7ae347e027f5984cad882b66f7545e0df9d9f96aab33b6d6408f16b4cf38ebb2a24d3a57e35c0bed682125c803b0a4d61b770c9250bd8a499dc24c854714ae39d0c575d897bb48d64eaa82c52fb1f0a3619aaffd309c62532c16144437e9a8ec611c98d6c79bf593ab74f0e2fde0d7d266a5522fed28f57f761b2c65f4107246fd9301d7059688a21920cea5d0c5b10f9527a19ec91baa1b2611e37f2e3180d5e0c94f4da403788e123e9a825ac912a767b1fcce56cd06d296cad7d428b56b25c53fdfcf558b5bc4211ed31cfe63732678a4f23338b582225286881986247793056741c08c9698c0c05206ba3e4d692922a0f061d17da276e3d562b3b9075cba4bc003c5abbdc6106a68b3fe9cbf5b1bf01695dea38dfe6cc548064753c68117e2daa44345594a4fa9d3595e8c61df7b8b76410e315eec60715ec128c8ea6b18753791ddebf1bbbae912756e9fad5cc44f5080750d78f2fe627a41ec9afb91587d375ada022f910ea2b67683492a5982a635e2b79a54a893333b07174c729a34658a6ddc2a6b4097813ffb511b415c333a86d62a5a8a83db4e016f2d5fd7cc58b8815968b72d6101ff0f624c889aeb5276c3e951d0830b132d7e088337a3ce21f0bc9be45afe78ca66a559ca038f7d7ce59d7ad2aec6b4e74bf161dd866f061cb8aca3e36846de5d62a2307e2e9798fef154290127cdf7c4441be980ae821ac55ad21ffa61af28277d8684cd7c6ba46544887281de216a46805e2e01228562a851bd5e8df98fdcd511c2d53c4f44465c39bac5b9543982ca9b289df384f1743257deee02827172d2b9c7904f49e9f5205b5bb13c0caeb7ecff0bc7cc385ed5ffb7a75d1c8efc60ace035447aeea5177e240bb37e89c9900a269829ffdf15ee6d1bb71a2081795cd03f7c6043900e43b21e1b5af53e42a1ceac2e3302cbcf4406de7ea3b30c809dc9020d823de09e0058c42b06349c824396ea6e718990d37d697a7e8848829aca03d28918ce52dcb3fe90bb43b147011bef7bb973d8c0dae0e19a3746557630581d4b4fa2796932f5001e4ca1ffb0578154da9fa884ce4e151ba8295c6e79d9ce81b6f19dd386493a09c73f8f745afe2a5381918e123b9580841ed548f7e00fa3bdcfef89415c78097826348ab3b95d6d680b3fa3157b49c99778bb7a865b4a6e3dd0c9f3573e57d9d7a5ac22325e0dc10ec1ea75e31ff346e2405c9f9e4e02849e73f14a99be6121a4d006d474bb77cbb45032752f9bfa8ed10028f6a42ac09d4c13f61d6d5f1c776c3ff5100f4433f3f530983f3f71f8180022b13e4c941d0eb35b58ea6692e2519a4fc763469acac05ded9c22b7345468ec3285c4dbfc705f80949a1009ec6b36bb8a2e5ccf3194c73ae1aece1b4597f7f1ca0728f6d65316206a2a4cbbde1f9d5c796a5b1d8b2a5f28a750afd0384b4bad23b5e901b44db91f4699ef10ea680bd9883bec960a141eb3c922366a8ed6ea9b0a2273a118c8bed9b459859d93ecf8cf40f39fed50ba8c48a183f06ebbe34b37d7dd5739664c9dec2df99eb66d16faba3e21d377d1b60e73db066c4131c8f4000737125f3f41ecc33dea98ffc86e6806da5725ca2f6f3ba1d01a1886a3106b8022d01377165111fb4ebd02de585be751a0040548ac7e9a7f1b4f73a362521844b53909156df2b3f0eae17ad67f77ef1719a90097db4c814837071c3c020680aa38c231bea89f29409ce85f7cb04af5c3b1c6962c5e51a6b99de1609504964b3d280c4bd778cf0876cf423f459d3d81d402dd447a9836613fca5eef52ec89ce79fd87a5f4310ad7e01c7f88a588d819e4876d8a070b63574746e016fa1c6980fd43c4ee9973cb0e28ef00ca2125933461b9f7d5563a50ef6c8e15860f26be19137534643bb38811cdc166725cd60747d804fcb4fca797901c2a5faae6adefed791c66d55f72da892b3e212f9d2c9cfab412ecb74ed59fefd2863ef434f487747a93cc8089343adaedafc140869bdc93824e584ad136e2652c3c24005e9d0d54b495e6142d6a119d71b0b7538d964ec8df21cfee385e078685b6bf4de829f9f4a37d43fec0a7074743cb73d736ce5bf10727a42fc8cd67da8b80513b560dc5dac3c456aef75d744ef06aa75a06869ca2a6ea857e26e78bb78a139a671ccb098d8205aeb315fff13af418925a716179643ac4e457b73efbc41dfafb3fc0e43d638abbac99c120f681cb5ff5370be18aac4f61315b1e563086c3b0e453d6ebca233a50d0c17d530cc9e29b209e2a8938e13129fce6a0afb255f7aff611c34438131d5fdbd89ef8ac69d674a4ee71bb1cb9ac89b78902ce09d8467291181a702fd9a0430e2dca944de8135702b66619ae8c0e2af1c0a913af842c9355c54101e9dd7fa4e86f74b879cb25ccca648c0756dec2682c1c08130bc0067ca4b7db7c2e94e7f00aec21d7a8999a405ca73816ae3885ebd6f9a46ea73280a91e4e5e4146a685bee642566462c9cd4c39cd0eba3d1fb50072e802791a4217a313172df3ca78d55bfaf0870120d24b6b026474845bfadc509075a6b4dd8537f533a0def632926371b98538107b59a10726fc1de7b3506846b01105b459626e19f069f5eb17699c7ac25eee24dab64abb17f24f76bbc6e57d4258a3fa2660267bc9d0e724d1850ce1760c1db0b77ec4f165f5ad93ddb4d04ec7ab15f8bd04fdb530744746097b1130751b5b369a298c3481649cc1a1b0b545c086b02295d75030b4c27ab1179266022ffb0b490b3d2d1f0acdb1a2a03100fccd7a171a494dca78d75a1618948167b10729b24a832013fb62af609941bc4fde3f03cf523feec91818a99dcef8be92d7ab25f4cd8a88cd6419784e381eb90e54a5a22d4ce210e888d91f6666ccb063e08c8e274499cdd5e3afb6cee18fcda91a91d3d56ce87a8535c94a245288fd77661bb0ee423965b9f485e967382d50bc7a74273c54bb824bb949a84c14a5fc39d2e93cae38d1e6e6114c9eab9e6fe8c50eccfae676c3be888deac8424fbc3327a1658fdbaafbd7e6b4643500a6d00c4f421cfd5865a975e82e1d18ab462448cd6c21391b2b2faf38685d5b0ac3e621a7aee47d0683d57ec7046117ebba8693a79d9cc6d11be5e367a7986f2e883acf8acfa4187553c00fc1cb474487ff4bba22b0489791ffa70ad0fcb5efe066167c550eec4e2977f1cf54cd403d1496fc12db4eb549d268fb8c10c2365bc4e021ae82f71d9c9752f323fc94ec5ff60400343db3534c16ca5beda3b28a415088e4dcb112c87243674cb425bc9c3bb0e91094d698b32cd3a620b61628322ef7b2c88d5bec6d6db23756e65c9ed03ee99875cb1279454a9d8f126bc4adce734f005546efde8ced6845ba313dd638f7e4a4c83d9daf9a43e8e789755bbd9fccaaf4138fe973a78fda14df3b15dd36f556908062b4d612a72a420e7937d25689b0007bded5563db39c174e4a812e4a9593ee26e114775ed2e61109ddd5766338d2b7f69a4fd0cff702df80060c43f4774100341f28fddf55b0f71419d1245668a77d3c78957dced8b2e00cf413b8c508d29930a36ee404adff46a5b3a766908792e285c052d7cac730ab4d8b43e72cd8bcfb94e442c46f5a45824741c4b7b214196a9b2814593440e093da31f9799c5584b9d97861198fd9085c613ab5922baccf77b506368cabe4675c3b8eb0caa40dbe5686c6364de6a8dc279c14f6807d9019bc9be145ec92102946da081664d47fce4425643efbf4482566505703fd189c8c9b985fdef37752ab064e2476c29e0a39252dc8e78e494568ab16776a729cf09c8732c85e3bdc3a50fd006a7e8e716b835c186adc8f562f3a6866fc968b7b5ace1203b130102125df9d89408a02eee2316b6dc06a799b440f20ba6d14a22429a5ce83a1112af6a39b8a415d25ea772cc7d5a6702dd789425b56993f615137eb981f2b2e6de6bd321935d116ce8faa99cb1d5ae09313b098a39c7bfa1903172f297672bfa2ddf56fdd12b0e4006ce9b79fc4e39846c8a1b57c44eb0388425252ee86e2bb5c7b2fab5bb3596b582cb514ca4ed91d9560cd3749f25f025b9969f53ba303c7f748dc83299a43033239ad2fef2dc3d72b76a38ca127607cef72de94a56d5e5c0fb18c65ab39f6522b0e326752e40c5b5574c533f64667b9d06920afc0484afe025fafe16504fbbebf24d569ba044b20cfe582abcdf1fd6f8ad6c0a500c652047badc784fb9dcbcf4b1816957900d8bde7339c82ac9c99f49b563f22db5a1c25d82653beb376df0a6b427679045c6d8937f95326f6b8b5ff7e720c97d48601d8b443e4fd4102ade69c5e6593008952293ea1572750d8e9d6a094b97270dc9b737ca0ebcf08c3c0ea6aa66461e21a2ef457c608e22f7fae10ae38c65134c051acbda7e8a29f5cb08c32c503642d816ca13fc1f916070f6b43f3f893a294d3bcead3d36c26591fe552a134c31847419386434f98016c1aa9c71e3ed1e5157945947bbdd6c8eaafe7c41270140cc3fd2c3a1ea97652c333f2308985e1973b43845ff1b1b8e8b86f3057230186a027f6af230e7a047890cddd16c26843477aa4e1a3f279a32446d047924f538b80e7d094d7af3bd2f1794ab2d055509764582ff5e6ea5ff5fa1a9595ebe3f0a30d881d55de7d59624bd15d2bf3ced92e8c584729bf35ef51e8a811b3faad636dd49d3f9a9e057d22e63d57a0f77b5ca90e0f7d058381a2276e73c72a14f8263c447ba9bbacb3f1955f11dc9a61f7656787c25401ea4a02e6fa023850e150b39efbb80e416115615a25035ea0b9df8e1a88254eb749fbac2119d7e7d0d643862658e6bfb471b646c1c666503c657031126dbcdf8e2912e8665c7958127a4d2832ea6c408d55031c6cc1cf53d60b75f8efc6dd890f0e2c5217204afbae23da14753edd235461784ccb85b2cbf6024d3013222bcdb27fb473c403d1550c9986d53db4adfa824da2725ea0954b24e062912cee1c3000e427c7ed85b106a611bfe52cea43189f600e07a6a0fb33db3c42768da9133282e202c904144e630342f1cea34e5110145f178733e56918915c896ac5d1c557a0dfe1e1983e2dfcbc93d8ec316f4c7389814b7b770c538bdff793d856069711f35421bc2a71b4563a8ab1d867bb99b5577d364ef0843ef02f63fe69cea60cf3e2e56eb33b4d95e1f5ae291db6c1cd5806a9549c20cbafd808482579803e9b6007ea05613b2037428664bb269f005bce3fac32cd98611ab5e30aa5923b3ec708daf8a240aaa81cda6544d47d90f5c99a3aec3d6db7d3041c5821fb4e20351430c497a1cc2a33bb1c0ad4f1ad2d109b4eb0ffe0f71faff07dc034a307ffa0078a5d2da07e0a5186a9ef7bbf1fd3ff455e1a4dc9e43046544cc3a9195a2a1e25682d411ad0fb8033f69bdf895026006c4adf5c64df8a34d42bcb05daaf2fedd27c8d687d6f5e5e17749846ece883d2548788a22e239df9c47d5eb1738181cda31a261a44a3a339b5b65d6856337dc3a2b6aec5926adc13b9c3e752507bb00c2be36fcd0d087ab1933e63aa51eb9472eb3aaa2d4e1fd50128920d6f1df84b47b14ac2f733284534347f33936c5b386e7296134fadbd0950955a394e1881b3fef7b2d82f536d83501deb55aa021d09f4fd5b62b32dbcf96094aee395fc927a9043de17ebea52b593c4154254bfab59c4dfed20de6aba25df8ae2a4dd26c51faa4a1efaa364627c5dab9f722a0180d84c8eddc657d11f0f2c0ca7e56a237403bb6ee7f8ec6e37283c58cc6da05427e60aaebfdb85fd6615b47e613de36f39c74226dbbb3d442b49be302ead4e342b037da3e5d90f3c29ea2774a116cf8680fabd066c9a0ca2c96131e658b98a3de4d11402e2374a39c4fcf363d9f894f5d3feaa820d1dd0e69bff55dfbd0afabdffaf7c40578edd72e1ce86e08e5bba39bd43891e5fcf30ac1d949880ee2a0650c61ef4e098382f53eabf706f40c8d5deb779e76fb716924fc891586e4e9f3372f2a04c6846dbb6695a703e6473c84e313d0223cab59c7c6e1796341c50c318b0efd3b14bc5d2092fbb615f6499c2a9edb86cfcc3ddc96573a513aa0fb73e1c873809e20fa7c3ae13780341e445506f60d42aa0ef9215d3fcdb8a38bcd478b56245e34d285f190bc13ae68467e8ea0546fabbdea2751a4e56357a4ea82b0b79de93d0513a7e5aa8955e8b9564070811ecb6a0f490e93f4b3c3d648a563d5ee058cc61ac9a68011b1c6d53036d22330bee726a811f710d310b7dc94a5b8dfb7f6d3a07adecbe94c9d2e1ed4ce7cce359a8b88912c2af0cc64051192d0c9f59bd888732d385e49e3b4556bae06869a191c8137d180ef5a6418761f490fdd40211371e93cc1a7c75f5d0263c4c737ae63aa90dc70f78e762592d2abc14b3de8d10f57a8ae5fed8c4702ffae20f7d9339bae7f1f77784e6d963be160036a3214333401588bfc7ac0230a12f5ca80b2504a8f17a7edea79673f7b6ae3165602ecd0eb39a2dc7f94897cdd04e0c8480b2ef7b5201dda37558ba9bb37df02f5f5992f9ac52ea8d08412d8e39c1624392bf42a88622846462b025b610efad0315543d8ab6ea3f7d79281c284a440e63a5ccb6b70a4713aff42f4ddd7b8dc87f068115484fca9d17c05ffbf28e2051432e4db43d5b0a0bd4ae488b883fd2e2f1c782c2a8f37ea3fa727b35937200eb80b0c4b391f4c5cd80f57e673cfa498d19ccbbce232e70b48403ec617192402d9ac1c44d6b6414d9236e437962277c17358a9e805d7d3b7f52f935f8136b68a80fd5ceda002561cf3a7d3a3aae33c5220385cd81ae5c4944d5c6ea720f6a04eb4e6136f216c5571034b6c51367cbcf2dd242bb5a9c4824a58af16c67bc2a9f57d4f8bf1e15a04f3cb08f76ac254bf4ab4045da73adbd5821e11d5e31b009828e3200a9c67352d4b52c7bb15d6d30d02acc03bd5569485e4a868f126861a368eef41d9973b669621a071017bfb616dc1cd400d6884565917fd9eb3b846764bd0a89a400be553081cbeec11c3b866a82f206d1b874d8a1ac4259963c1e37e9f9517148620ed664ae4b3223316964a86f5ac2dac5b3896909229434968e398f9864295f5fddc06262287f9af9c1c75cfbb7a69090ccde3832a1082add6d02e224a3306d3cb3a9a627e435bcc7cd2504b28900a7bc194d9bb33e240d63331a7e38af25069b18d8cc79fee2fd3df4041c2e5f8f648a216e0ff56a7640da68f6b02ee8559ffd85f431d2e905d0cecefb1fb9aba17b8d8da61193b68d69a5771e2471df60bdd6837272cd232ccbfcc6609bfeedc53158b68c2cf892d7ec56f5f747cc04d4d4a889ea0bb34da6634a62dafd6896894a5e2496deae8fc44d616e189677e900690601b1694fb9312b3a3cd0d081465c1b20604c83202df1014738089d200c9 +0x033a5e38a60f821bfc35c8ef32c48453e4dc3fd7988bebd807f1d579df4360d488d097eac9b086ff1099a447a2ded1c2 +60424 +0x5555fd795e956fd479ff3c8751e38af05c2f9c180ed9a3394d7dd67d2448c409bb14e93a87d4802ebe3399870e786b6b8eadebcff5009ef60a69ab345b8d34f832e3e60ac515cf10ada9705799e014d044de6059a40c2a3e65bb8f00950a3f55a1091c6f801e04812ea8ea805ce32c27660c203d85c5f01a46baa9683a858e27efcfb2f320b8c68a29792f89bd485c76db7d5603fef2989195af22f4b2c7c976067dd11e0dabbd32866566fa26d94bc78d792834795dcaac3ae2212c6698974acd5ba077afbf92812db2b85cfe5ca121634abe575dcc2d721d9bcf99bcbfa0ac2cb048866fbced7f06a84c35ad9a088d453741f4120869eb262253c21d068da30bc6f0d3b3697535fa914b109b5b26111b87d99400d9271f3ebed62ff233063852e3c1e7e48fd3aaefb3dc723067a3b8cd83adbe8f060f174bb98069a10fb272e950e3496bf6afe6ce5828e5d48528874473e6fa2759c8da365978f794623a59b9557d81ae66aff280c656f0ef7f5d88669fabd03098fb70e8e7e76131f445f5a839b71817a77ed5ec458f1ce91be9c21c4e25c9128c4fe248aaf430e28c7c4f9f46ba950d80c297f91ffbef2a22753d4fc97c6c35fd6d373decc8eb0ef4876e87c2ae80f7bb2441919ac1f31a5ba802e559d74101b3fc77b1f38a1a1cf20d5a46f6bb623f1e4bda9b000ab021902b18c8445ed1df75a5aa8b096346764fb61cc62a07c14c72e06afe97fdada887a587ded23ba3350c10d9b3747bf683d22cbbeda6bd28867e8afaa4a8c3721509bf58114d93406c41e40c107cf9b2ab45143fa5b1031c550cf290747a8387d2de219247fb912eeddac9498c6b0602566e19b1d594012721e2bf375657667545ce723d6a265af71f9f699a0e87c96fec17e1186598e1d052c99af4328594c3d8a15a6261141922695a69067f1a6b80d506147c3c02c89f50892bd1f04d34f9f21e8307140df43835d17495c56a13be7a045be5441de01d84ea19d579f76e9ffa0f92376b5b13c0eacd3050c9c0eaaf41d85e5c643051d154b40d08b3cb6c3e5a3a32f74e459f42ef16453e736318dd934cc4e88482434429aeae738711535d79670951a512c047ae745c68ac9dc4d0d92635928c5cddfc6ca2a51ddd104e85bf60bf4c580b9d568eaf1dd45ab4160e792f5b61650647838356990f9e11823d94ecfdf04f785ff7f78e2f8c66f13721dd2fdb5df5c8aa61d892334fb05c1a0d60d26b4673a12db251db3b98b99c4f916bee608e25ea2e1cd1201be7fd393c7d8bdbb055aacd3010055ce8fe3afd85e48d3390fddeb3fa3ed8c7f8de6cf011167dcf7426dd45909879dadfc8d05b02a4aac713b1066d374f544e723de4c8c05f9f7661bff55274d3161cc7fe6500ee58297392b2865e0cd5ad7e320b4f0a71e157971d2ad83a044744ec49a6e032708974fdb50947cea25a4a1fe05094ff4e220efc506f70456a7e6c100dca283ab0bef22d23bd3007206595f924159bec7cac2d6ba394a3bdcb00f451ba712760d77f0bcd85d62850af7ff5d3a4614c1c26071aadbda35be852534677f8a4c4eb0d5527a3825d19f0772ed2760b3c8fd672b93f8a48a37f102401c84a716ae72579c6ae79c359ea309ffd95abffae4c61884c03c9e99df77b6c92e492cacb7854445c0815efd283585071a43828c06b069148cd344a98ab71508c0116aecf60c1959f9e3fafd0ccb0b11468e53079d40db5330791139c833cf879869fc37f85b49516d6c1ab5cad7feb6d497cbce26fbe1b9718a9ecb267238de0ddf5b1e2d0746c4919628a7d0e0f2504b0c377012560ecfb68447be03f6d374a6de02100294b41c0d0e9f53cd7a68862038406e0dc3d4fe85f2a6b30f3631d3e9e28bbe2797f3c04611f939ff08d3c0eab8514877d9b6de5652262aa6b4d6844d894268fa659879c36cc0db1410c6890118f47fcf1c36e7ae2f508558f733fe483ed0b0f9a214710b5b80a77b26a34719c6947491efd792f3e6b0739481ccba707fb116b3b1fa7e948aa33fb2cf1c938b3ddbd76ee91b68de14c045e7c913414cd86e1aa739bcdae566b304495e74f6dc0b1518948c64e1b3360aacd141ba1b43b5622d429dce1e747c4a85ad795ed992aaeaa8c13e569619d6f9e8df9003a0dba327df2452b0c1c827a4346d843cc43599c718639362ee885408ba6118829a9b3e49a0baed075d67158aa0f823914f3b5434d80a101c637549c172146fd93108c3220274e13469c7b2585bdbbbeec31a66ae781338e59d7734bea057fa5a3c8afe5b84e0c3ba4f708a87b596d1b7c8694dbe691d7240e4e4815ad5aa4ca7e5b82c50989d092b96e80aa35e97f99ed79e75cf3b8750d0d263dc208289cb24f516f99bcdf825ead894cf35b78d97e679307b6b6fff58f7fe6b919a27851a53c30dc2b78590be8a8d0d24b940b6312115a5cb1d66d3ff38c1724e32451aaed6d823341e6fe5178d1cc7b7a88ac059f14584f14fc0b3c815b40e5e835bc8fd10bcedba4add63d565004af47e062a76b981546a9cfe0d28015e966f07ec0e8983e9d3c1c76e9b7c94e00d77c443631bfc418aa36f8f4ea3ae19b0ec3a7659d8b2d76be70e940a81af34959df5b2e8be3c0e9e4841e4f6df5e8dc452857b397f201e1c96aade2f69266669f39ce559d1fb5105a5beafa41fa513773e936b3bc15e166c5d06bd78b77d0df0f5144b050bbcb15768204fc5091453100cced6cf53bf68e1a6bca284d11583d13f166498afe29819fc3135d8001ec54559a24e62bad68e0300373dc26aa270712dfdc273432f8dc3ce4bf25bb946d27d81a822a44b45ee570600dfbfd8864c574e44d52379d5facb7aeb25de890f132f216b03f2a9600234049418eb9f43800a0c862d37987877b77e9910def3e9ffe0b54562dc39b77240987b79b4436cb3e0053c2b1e43a97d0e45d073bb8e6a0128c9e1bfdf90deb7034e3162d8596440afb4d15f45ffdb83466d1baf12ad01bf6dbbaa7b6b232838d27220749645ccbe9f97d05a5d117122e650f52362f4339336270a360d85468054c0f31f9c9cf8a6562ac38ca24d1cc4649dd7813ae892250888ab70452b9c2600a713d449c38a6059fa2566e3f730f047a04d48e90e8fdd5b4ce8aa908a9b824c80fd233c5df4a51162708960a4502f1614c0db2bba9f24b5006c557e26e72dbf0b299cc2d0c9cd23003f64c6d8ece94647ccb8418132b39c3f80f16c84f190ce9223919ba07c40f55fdc79750989a75ec5eb80e8f70cd27756d11efa293d5401b275b225517eb91eedf23809ba98f1d62b87a570906039dce2c73e95883cdfeee89a7eee78639de616fb40d360ad5132c53b9676c1ff32436ffdc0dd2672aceca0fc485569ad58018761f48090393dfb4f71e47a201c54315acf462f987133817835bef8c9ce8ff79bb0f39fddbf10a606b50fe91f4a283d3fc64f0b32ab1c53dab13346fd399e1ee082ae7f8dc181b9a79f8942342b26bd8b7d4bfe9992cfca44f955de98911b0de23185ae34c309ac9e7be123e311c838ca5ebd8841dab66b4398972e10477f3b1d5829aa7746010547e497fcc0b0953588d52426afc5689d63095793e8ef433cee610b02a9cd104a50642e3b416a064a239b105857e56ef70fb647cea6db0f79f1e69a3560cabfe23475046de9b0a3dd36faf2abbedd320ec639c82cce9d2c78b45367b120b158636091cb132e16e6654f8f4b7f68ff4a3b030e694cc4c832bfa221e4045e2372546134e2b9832f5688c9c29b71daee2ff262ae9b9d2dceaac547ecafbd9da3a62bb2e8dbdf8d4c6cae222f62f1890c5bfb4184ef9c6e330d10221e1b4b53946c6fe22816e3a100b14c0540229cf7dc468c4c4bc5c90a77c236ad30c71c14782d875b7d346462ee9cf8df8f6ac2abf0784bdf4dceb1971f729f55cf33ce54e172089b42b4d04768a82b0d779c1119db79a077156ad4788c86b0b833d1c09942d26a2e3308c5d3016b593b9346f6c5efc330a03d1ab033619711511931a1562ea73290a8b0a37a3b4f09d66cebe234bfdd62d71f5eb36c10fc479cf9c3cf100798e84f2e4cf7c188dbc36a5f0b61eace30bdb856b77c672d4eba182018c86b600ff1d63e1e412d7c9a0c63f426045c9d55b7905db579d91906ef3f56912bacca84f5b252d50e3288f25b5fd6bc381e9fc4c70baec91a1666ad6d9ef7dd576899805a5ff6e1bd55307d16ca514e7b8558068286c472fbc388ba9ba37e5dda337f9a965ba4d4ed29f5b2f51ffe4d5d356883709e39438d5511b72fe964832271cf2c3021e71f0c156b0c4cdd58494bb323c407ce67ab5d3f741b60cd44eddec80acdce4f3830989be311a49ed9b2c5631c50be73fa1ada07325ff4eb9a0e5d8ad4e7b73012aa2141f03b82b10d2a68e9d4b20b3b4b228230df0d42b0ce652d5ea012917100fc149c35126dc06d1094abcf508490e552f440ccabe0b97c72cca7eed6d38e7d97110f141edc5973f5d72d8ec4a0f1431c8ebbada445620ec7c9eb239cf3e4f31b751f0fb944d8bc5abed37586e6f90effe005d49ee7570fd4a3bce0ed79110bf9df409a8a3dba90afaa52160fcd04836d66b3e3e44ce4fa19c881a930e99f22a2ae28470a2d9bab75281e02c7d9a06af5a14a5e2cfca85807c6dddf1fbbebd1b6601a97a1aae8673bb69bbe57934900291e4d95d16d1d943f1d2614f276938395a3abfef93c2d5e73e45f9b37608aed683c124d6a14c1492039fecd618002c2d0d7610f6937d6fbae2fde3bdfe7d2ad33994cc75f9a1fe14bbbcc7ad58ed619e879be2b8a4471c95b07ac12c98fbcba2ba461a64a53a5f7220123afe6f969f35d1927e5d4d88a320aea2db27cdea58eb0ebd56c82d7dff543b878ceee365ae9af2442c0c17a8cd02e65e78d723b39a553ee3c8cc1ad4a660120407a73ec05574f29834ed880f62e46097e16424bc5989519fb895f3a61b41b072f15107115d6bda75dd292a252a6d23335ff5586e5c2f4fd86d4e405b279d1ab79313c7bf8f28b1c570e88553ec46371c38b246316dee4178301d8a5b921d5abd35160532b1537f6f35511fff7216a438b4c4766e526e2e66492a570d2468766a1f8249d28b944d5b748d8293828672711d53708bd4581e8a009e32dba42779a8987e1c07e791227175c33675e53eaaadb986bdf2bb5419cc9ca1a02cdc01685ee93204398bf506997f1cc10f63e554d6d286e409cf092814675a2b69929f4d745bc78bd0406601bbdcc0adc7c32376d3ae7b6d3ad820524aa7f25af88fa82fd134653934ce8c1cbfd2d68207cfa21a8c958ce1ec9d40a056a591b5429bc5175fbc3395cdfd115e8daa87c6364d0747e9d1e1c686e7121820a95dc5af7d9e0c053d5a2704959ad00dacfa03bb06fd06d2a9a3a7727e3ec591fb8111a8ffda16abfd02773f5dd278281f58c000c22a5e2f64fa09172a6bac8fe2232293e7213d3945510ee71e5e60c44dc8866c483657e84b0d76ddb341d703a86c7ed9fe1d8a985d727365a0e990ca7c73dc6762caf9e5a605752ce06a4dd69383afe30c7404ae8d8b2e1fab190e23f5804a59d68e4d0fbd098f6c7a8b16eeec903d18d9ceb4641dc5c87f0796e4b5001858aa6d295a4cd7424a05494f3b35fabdaedf2cd4a0a35447c8ec7b091a6ae4638fc3ef4428853dd83160155bc39207308ca2cf2dd2517c3ab6ced11ab629eb88760a2486c0a338f2c9e3a65ab6ec59115ec888825257dbc51b8ccf70c2d95bb096e8d498298c0eb89cf7c4f21c2d3989adb9207b269eb9117d903eb445647d0275c6c6216b2a0753310536cbfe3cefc000dc5fbf580d60456741e58d48b199a79d0ac3ca8f636deb1073c58e6301c3dddf9b0cf7f08b178a5e078ea4d2a8f7c6961e933b9c2186a7c2aa39e35464fd08d25df1caf4022508ec4affa0eb31de88e668fe1b9a4b9cb0ce135a71d84de46b628bd4e16e59d3e69872012b9b3498151752cc1292c9f52ebc15efe1f7a4c12b168b7ee36578694deae75ceaeb996b94b142c4ca8b83d9481517c2dab951dc7377c6b779e2472f646b12d887e248a02d3aa2afe88d6092265f839905273c7d690ca4464becad6c54a2593daa892a7e0a3cd95517a04b67f125c03d0a484eec355d8ef5008b956a44182552fae6254f503e4f7efdcd299fd1ec367690256d7000f2ea8a41c7e46f5d53dfe0200422592ac96cf2421be383ed3e4d0b3fc48253f25421ceb5a983c4c6ddedafc3e80ae6be6498788f93615b6ea26dc6c12f76db320a9c8905385ab1a83eb9878c9cc33c34973bda8c3b8b6f7ba1fe6dbb6e2f51e99cc283d87d517d2bfca930232737a3b5eabddee01d49063dc268c9d88797fd3e93fa83d77e517276a127712f914c6569e6864d33418469dc8d13a2bd8495265a75ae53aa4540d6b2b59a1459e2ecc97712feee2fad22e17f8a68c0156c101564cd45b9f8da08f206be6adf4823fe1607f68e8b7a6b0db44e42cdea8648f2138520277e69438f0e9b46fe9ba45c6a95431b9ceabc832b2a723cabeab81f2266e5f8bb6aa68abf7299d4c0101793188e510892d49efb668d13006b8655f98856abdc6b4457b77e6527f1170547d2f0485945d611c7dda5235817738702df0c2d00559fd624d0b6306d236b43dc20d90d845bd269e131d0366a082db469d796310beabde6b3df4e1c94f525937f86be23f9d1eca491fdce0c715bffd732ec0eacf5232e3dafeb2e6fc4ecabbbd80a84d3e12f8e89814b89ed949953b605235ce4e5885aa3befd3e71249266838eb7146564fe1fe25922e823fb49901b8886682204a2a9df881c666cdd6ebeb54a925621a9c50775c08bd3f5cff31ecc661c1aad79f884bbb6508ea616081c17b3a5324fd90cad0b5f8c32aa381f659145ed5bcf6d1251fdf0a19e68f8e9e67372f791361b5c7b6bde30ed8b5d56cd34ce0211ce0879796edd187efaab98868f2e90591f983bd85fe47cede0671fbe7ba86226f371b465d626bc16a4569d62339079745278342cad197a18f17d03a0307b158086d14b7cfd73964eae2281e4293fb9c817e2cce01e27315705c889db19f12409cf4fc725aa6bac0f5f36cb7238e4583fb6fe8d5a7ab3a993657039d7ffb096a71514afcaa7b6083f01bb037627275fc076f5fe038968ebb25a9c9bfca9607344a2488bd2bafdb2c8dad8b257bfafd532a1efa74312ebfe9e2a7438b3e1aac4c7bc11e4a5ace8b09033b65f7dc825c27f7d131183dfe7ea3d1d2197626d369018ac9a40ab441e0c81537c92500a302e8e538ac329b602b8797dcb407316abdf1fba092a4c4c48ce828453d3384c7922476a7c459f60e46f389099bc4ca4b1b9c42d8727f08a0dfc7a0c63ab9d58a8a5920c10204ba5361764a0b49257dff227ef4f3bc1ffc816a05334d3a1e7f464c0577f6edb974ca0b9e4f3444afa8f133088664e7fe1cc0ac1f444cc3e7ee9557a7e0cbffeea1fc95ba0d1706d9f7bbfdd77bbe7e9fe5e926845847508cafe24dbeffb2b12abe45a0880846082ad6c9c35a4962f88be48569c2e3bf78934fd79eb9394d99e4464fac56c533d118c2a5240f73e4ee38a51fd6597b3794922acfbb3501ff22a1c67529c4c852fa2a37d8a0659fd6b83c84030cb683224cffdd5533a0fe39d3e9bb50a9408635dbe5c2dec90b019aeeee2de96d789011fa32e3e2988b92903632915c9b58835f0ec1e011fe5e6db40ae3ef3d890e268934d1bb024a634394b202e503708b5430fb552c2cc0de18b494b46479dff5caea8552ef2ec9b6a5b9efe122efd9475d4e3a05e389a118b71f04b60a18e2add1d8544cece2a6f41d724843d77c362b1319435ab2b32f8cad55e38f6ca521b4efb53a2620a862ba3f4043a18f3307852a349fca1633bca88febb996f8b92da989139f5546fa7d677fb67a8096aede03e702a7ea8a75e8fac352ef733aaf66da12760c70bc53678a534745779a3a2a25fe0604229c143501ec2dfd9aaef25de5305f09fefd4da1a14e754ced167f6c49b3d13d08a779115c6edf7c73c24c8359572100668633cc2ae5c2e95777e9150dccd6ab13592f0e48cfe9e49510f86784eb8e883de3c037b5adb2b35d5b01c4d09da8e6c90da0ac7583cfbe8517a08b1681da19eb925d84a00ab733551c53fc40aaaa789051684c512f0372ba42bf6e7caea63df61e7633989152d1d5584a1bcc785dc91fb1009e6a262799bb2eaf7235c6655cf3f4a4b4fdb61827648b6eb3d27b5550bda8e3f33f0daeabee381b36c06dba0f5b9153994dfd799c69223c45015813b7f0959ceb3e4a0b21fa0b6d3cab08f6bd93812d4117dbe9b989b93d5fb7630b675f2395f6f67fbf8434f53ff4542cbdf042507c5cd9e60af71cacec648330bed76fcf59a6d5f35e4b45a1edee6a4d724fde6bdb3d02803fedb899b3e3f345a09098f5726b7b694a0f927e019b4bffb614ce5fc472305f0af5d40c4e5e7616531b71325ac555261519a206057b7797fbf7a888b29cd1b6feb80550f6448a2738e07f028d34d1de3221fab6841f8bbaa650e393400d654c7daca3145636ae0cd48818f2844a9fd64391132be7f7e6ec67b905fbd74479642a3c53c2e895601bc86ad56eda671dc2abef81c2bb85278192b8961ef2f27cb266ff9de917f13ef867014ae3ea2aba17eda5ad177947ac3ec9b80a992d67edabc65ed8037eda990732f3d00e4e06134a8b4c1b96abd003586f3fd9e6e1455ab4cae2988e97921cecdebb0b2a8079a7df076b43cccd8ebb8315c88a84a8eb3261e7135606dce8290dacbf62e50bf5f639e45bcc26490443333feaa2ff0efa03379d79a6e8b92d4bde4f896daa4b2b7d1f94c60b3fb8a128dd500ea9b26dd24baa708df1c0d6e1f3f319a18206e86aaac4ab0287759715db05f8ad155b50048a3ee2b8cd1b9096cfd09d8056774e340ddd99c9c7646eb2e8319c6e6c3650213d6976829f4590cc2dfb6dae4167f72824cee3645188aa08cee4adab14efd888e3be9e83fefb31e2acd7fc93d9757da77e1d1a6aac6ec3a7fd93ceeba5e473dbfbb2ed3552990e8abafabcd9951c4c42785c91553e6365e0f2c352b8a5c09c6b03cac51f40ab7114d6d830d7eac8ed89b1e20abc9e22eb645cf7eb8a8ae0cce69a7ad88a3faf24218f04fb277107cbdda951c8f93209dea28ab5fbe9cbe18fbf0e577a3ea610723151e57e309e5581cecd306ea390a4aa2c0a61f65eff3f5f54fdd52c851a7bf5b4be0e2c9be93e89cdabf26e34406ff8516a908d428b46a658e7688206134e293c31f398b1d82f5e6ab40c3a33b7e823b319d6034cf6b40f3b39a60d2a171387283c1a553ae1b46a167402651a6d99c6d1a6870ac6c7f3f46c83021069ac488a195af6c46fac4a57617a698160e7f15c3d7f4806588582f07d41f14e6d2969cc700d2d68e88e6d80dc25a5f1af9d8b5e47227d887aa5ed8dde0518197d3503a8dcd112d53e0eaa80d7043c384f24c4479f2ebbf395bf90271f3adb04425582b9b0353b7bc8b36dd1f294b0e7c7e43892960277fa32291746b151be8134e183798aa82bef210343feaf659862c27254d9dc3c35eee878ef7724e83722cd8f6252dcb85881df74b9517de5675ba745a587c23a6a5421258532ea7cd96b84b5cbf016d445d63c9e2a94dea28214eed4a726f89ba9bc64c57504827e29cdf2db1cbbd98a787ef0d63413521b8d3111b5d631efbe68aa3bcf3b568d7a8ccc8085d120854964de74b3526768beed22a85fcf2308412b800eb954c35bd086e9c63c85c8baaf9f6740cc020b930b268c2b48de94e29266e065fa3db58e3eac982c75a71eda1b8cbbdd66cf7a619eddb012e7a0e1ff40bf4dda2872b78513726a3bb7b18d742bb14eb34a172e44d85740e7d292a4ceca792ac3ca7043e0ed5cd27c7931bf194ea1925abc75a1cd4647b122804047c19e3909bb36d2e5222ae0635730a40e29f2e2194c54677f5b7703834b871665884a835d49140705b95a919f5484850536b6d755f09869118fd93f29db4da168734dccb7c5d8793026fad4d90cdb512eb01915eb0fff0702caeb4f374a4a6ddb2316898bea0ac60eeb9a4ec2e8bb95053688022ac30eadbdad3bb81e2113d83818435e5c0e1169cc77b753cf608bdd032a824097d23dd9cca728fe50f8207d09b342af9aaa82d1237bb088611ce275b31ca635d4b603279a3961a67227f6c8ca9492e1ea57e5989e4834511a76561b9f8d427643d704f3b0e44434e4490d47e52cc2b9ad9e902c876da1427df53d1b22ed157687cda9eaab286f2e49c3ea76f3fc408b66d73909896c95d0ee122e10e7bc6dbaf2f26858d38630f6f53104d271839adba89a46bc1ec56080fd659f89489bd9b817fdd6ead47e48338908f2e6e843402ee5703fb0b1f8cfd72e6817d0dfdbd7e289486c0d3880f34877c41b20c2bbbee99fc18a93ed870247f3821da4282cf6eeb95a9e3c5a2ee0ba43fb042c8b6d95c05a36bdb21be0c657ef5c176f8befa5311abcf3f4c3e89f0d60064446bcd9331787285fa7d7a67a9b644eab9fa594613e3fd7f3c2f04e6cc66e7e422bd17f3563b91ed6f1ab389d6704e220b0ffcbb97a9b44142389b0f859c1db842863d00b396292ba1c0127bd6f43af4d4fe4f62c7abf79db92dac0c05c0ca680e8ee6c230 +0xe9bdfb8b069dddf2bb86059553f9b337e869aa0162ee8885cbe999dafe2185bb411aa8c06cc524e4f3b08dad667c6904 +61216 +0x8246bf7b81b287411777df7ecb53a1795e54b150ff3dd584be2bc7b8437889b6c0e0f9b324e2a5d49269e0f111ac169885535c55dedb4b308f3b0f7841c8bbbfc956df2658a05ddbf2ea78df22e42e0debd2c85801eaaf543afd81f83f5a64a287f09b5b86b2575c2140cfd266c392df7a181ce1d232a8f6a6b946c0a3f72d65e1f552da14e13a6206b30c514511ea16186f8178b87adf20bdb78558d767be12beaf2f2c6cf5aef2898d58e52795ddbbaf1d1fa61b8cfcd9663e67494172beb0086457d8f4b65d169214da14741814d4266b1df2632ea62a899814194be0d648a65df56616ececd50992bb699462376c65a1a4e5f92985190f0bb3535c78ade180e22f5f395e0638d64d2269ef3bed885407db05434442b1dee06d7cdb03ec837e3a2d4ac4d55145e28e389eed6bde32dbe5ebddaa4985f7df5f691e324a3a3688af18af21197506139c248ff7b9b371e282fbf297fef5f5facfd0c0c812400386871816b7f21b8352c10fc473ee144e512734ce702d3bb2187ac9eb0526a5f1600b5408ee28ebc3884321c6cbd2a8cf101cbef89e9cff361fa67d26514d1209fe83f50c2e828cce9b6b811c652d18ff07a9c0f88a14e88af99c13f9144e2f52483722abdfc9a7ac7581584eabc70be31f1662579b5c9eb58ca4b4ecb6f2a3d4276e046c69c5e366fccdcde503682a853eaace9c383ecabfc20588889f0117978172c3d7353ee9021a960968d7d71dec4dae294fcb8014b18109b654384332a440898674a9fc608bb626345f8edd8b20356a9ef8bbeb2392b3f667d9e77f9d024afc75cc2ec6f106b7c3755290421d2adc2652207047a06a3f15c29d157fffb98913ba662d66447d07b6f4ca45ce7a112c2a704e525c32410daef02a2b0901d2e3157aca0ca200f78d47da4f15484add0cbd1e0bc9f18220050918088fe64b54424ce0813543cd7d31bd4f67687a3796632984de3dd0370e0f6d63bdabde84478dfe11120e115516db627a9ca62ae7451bb4cc4f16bffa141324f9d3e6b854b3ac74380501d33dca737c8475372102f21ba71be6bc877339f97401d2a73e65a186f67be3745330a1e154947a832731a34b4a9c2c97f04985a9a6a34058365c1805cb0233d157d4a40d32d334f3041c6293e474a80fc125000b0109a76069e421103df67d7fa8d1dae05d692aed7f6a36dbbfcee38dc4aeb308cf588e279fa3c38f927f4ae60ed04c401f7de4da61c3280b21d06377bf8da58656bb7e159f41066b13c4206e50790016be37eb2372d13e0b53a2b2377b69de6ee058fe923367f28a08ee8a7f3873004b83c0c62e7a3982c39d6d5833c0eb67a9b357960621bd90d5b9240d818c6754c5b640fd6541a6fc1c4659dbd555bb471e17e1ced932eae7346d8f33dc15fc026e9fde192f8ebeb3fc988dc584048086b4561e2f732e97ff906e5783f89bdb142d86c3a1f32b29af4dd9329da793e22d55b735403cdd6be1cf02a3853ee6ab91e9b2171d1bde90f8f5526feca8cb8b43e8814e899d070f94db729bc214bd15828c6c01160e709b97de4b6d39ee7420d054fd9393fc732a209a0669c1e3e9c1eefdfca91334a9f193ee0b530ce1564cdd83732ae5c2ea658ef605320a143356dd24aa389cf5503bf40fdc4aede938b5705c2a3b08583468e5d6b921260d607d58e9bed639b92f20c228047a656ee40394c76cef822419da2d21685b9c383bdd65347faa73e80c490620cc0afbd820df4eac7f6ddd9061636fc15b0bf4fc8b1f0fed36ddd1eab05dc8e17c23388fb5f1a8f3acdea003d3acb29dda57b7c017ea5bfc2b96dc27e3050e525ceca3fb6be0a9853b6a54e5385dfe9d2c676ceea8e75349a6fe1a086ce9e25bb48ec485095459487438809d581e5ba99b649bed06bdfebdef3d15f315b04be4cb30239359f7c1259f71ac95fb95d2a96d76cd25f915643e4d7a5551a40352d5eafb498f216ee804033c6134e96d6a85ebc488fe49978eb50ade608be289fd165917bddf2a64d7cee9c225e2e94c2c255d7757e0bdea830b6c90c00797eb569060ab07ed3c7f9469992b8307c5db1e720bb6bf331fb74b26bcb8fd2f8bd0652947dfb01f1f6729bf5b9e000b43c14a523caa4a5f35a5eff041809d6a85e131ca55dc3fdf9ac59db7774326572ca6b8ae3a7b7fccc85d7650450e2a1f4fc6c25cd3ca3c947641f93834437c5147346f6f4b50e6e29f86e82d0e8a2cb8af2620c509d12fa57b82442cdcc68a625e11777bb851080a84c94e71e51d299c6ea954ef3f17a17c7131867ab5f3d9f237e5d8bcc9a86caa3dceaf0312efab3354f865c0bdc71a8020f5c80a08f3f06a9c599a19c57a9b2c933c13cbdd2739e528bb5b22ca072019507711c41cee57305314c679f6f21bf64ebc82b18eed5c1ab4993efcb0ff3dafc85f69903b0b97ae24bf64c6a235767236f5059d6c6b9a3abe3b1735b5d9f8aa5154d856ab72374bd9027ae7126e33061290a377c0c67ead0f49edb722bad973b3fe67feb54cbf6e388412c48ec3db1cac346527d2298ddb6f6ac9693fcc6970b6061d70a1c1b8810bee33455d5cf51bca8a5195eaba512da546b23353372f0a21140394b7f8a9eb18e7e652c962096b353972aa50a151097b86b0fda823b4a9becf1f523f1a1a14281832d318fda074b5eacd4c4b0715d8b7d2cbaf84b77eb653e07b93804e936402291fb09354419d12456c642514260322d10c32301b1797a9ee1f3dc3bd9d4370c1b5d18290745013f156db24ef0bf0842c7a6cf47807b688a2113a508ebf193888fd1e2dd8c1f58197939791c14c09a58b1e4617f6d47ab8a45b706fea824e2328fe80db55b1f224de2c82b4b172b54c94fea8e3bc084a009b05c968f96d4af946c0ddd62fcbb0c46f2883d4e8045b43f2247b9ef32a902930152c82e20875828d4c1f648d979729f18f813a8d8a65504b98a591c2c3b3fc0a958006cedb3885a2a92cce979e101a0d69662fc98c3a3c48601004525a1b3ed28caf3ce46ff9cc30dfee5c776781616bbf19f9c49342ce9086a23eca7730ba2f03a06c4d4b211dddf74b55527b53c4b29882e0a526e5d0cc12458953a35937ca013bde30f7194151f82d035360ef0c8bfd892e95ce8b08a30ae02b1564017c4a8e68dab6fc480035ea7bac9fa0bb019df51629bb129c40be785b6d37458d5258b20fa707e1152131d61d9961c3216a9188111b407a803ec4639e97e2cb66819c76188e4a2eea6eecc3fa12bf4f88100ebe624a4b8e9fcb5ed490f13d80f4d1bde16bd7a86c2ead0fb9fc5ee1ce58bcbda0f1ff05d762ae34d21bc371eb9f0a64fcf1ca482248a741c00ac7f0c7f8344535a68195dc2fb1ed652654a594d0f338ce90ae53d8a2242be10c9314c3d24050866a1a24256f9a31959aed0204ed55e25f31cdf016a3ec7523eb0b74494daa83992310da3b8b32aa6b5dd6b0c260f809b7bd6d4865b3c6c68f8d7739e1d1398878bbacdea5e941feee5857d6568fa456df1ad7824c3a7bc62bdb1f8a13c6b4072b183659ebf38fd52773b89c49e42170de3253c754a0d41e01bd4a906895e4a7b824f6729610e3d81c97402b22c53601bceb283f034e9676191c427367a4911129c533522da706aed7aa38ab699cadae812fa011e4aa8c7579de4d5a995c82ed86e537203822c1006095e844a7d04c2136e501667c1d7dc42bedb46d842581e2d56b480540e8da76bd41981c62c9dc02e3f594655510300b372fbfd6b2685498203faf29cc6119b7f895905e25ef24f88e46a137f6e96ef1a38eb5baab8bc4b86e49b4b364f5486c1978173075aaeeac41c27003e712ff1e79f1e044f5f899eac8719ecc900c2d3c26d477badc6200c6035048f2b1f1ab3bc13f86991a159bd5359fb79bd90e92d02990f625e17f23edddd8732cdbf03af08162f0e4a24c9222bdbb4549c6633dcf2994dd990d691fc9d54337d8ed7573e4c341664b1304457868ad91fde073f6e22fc8743de688bc03f677dd1e6fea1fc08ec42ff6f7a47d803f5de3e0ada787b14214023af645c243455dac27eab6062bebd3950ed59602e249b3831ab765b7e36a60d1b8c506f830ccddee1be641f0cee056debb36419c458e98b8d286164d21af9427ded934277392e0e922e9f3a55078355324a10d135117f2cb30a02312121a984dd4bc3817b49f4ce7627d34ec5bb8583c729e622eafebab045d8ff2ce5fb2548bc3f678909afc0b2e06296c8f94aaa8e1ccb5a8b60712a9ab81dbed48af80b028d30d5e5acdb0030634760354a5550b895b6f47740095d608c30a7b4aab8a956e2b8b513cf6c31eb914ea610436c16a7e4753a72d437b18634ca6039afbdae9a3f4f8b800bd3e428ed00fee67eef7ae06b7ea31ac78cc59034437ef014678961055dafd6cc92859cc8d6d134476febd6ad3ba4bb846918031d243a647346a82fd77bb8749c3894abc768a366475de81f2c54d5e1855d175351e5490346eba97b18122be5e5269fda6b0f0c19094a0e1e5b22bd3954e94205751f115909c70bb769c980a751fd15ad266271a8e7b4bc48dc5da10f7d9e269df93a39d226692d892f0a4d354d1c84987beb5ab26d1e7143023e47f069dc438140bf090b3722ad54ea4ce81c41157b20ee024da223f7db817f7d187894341753fe263560b6b3f9af2e19e7c8d87857daff5fc11496c13988a67278f4a726208a83f8157f2f7da0fc6ce9d2d77da5a92b225c3b76201b49cd09b70010fd32ed9974bd4fc30be021c129452fa4ab3ded95f97033336a565ac33bc3344a10eadd0542ee3ab8c69bfa91d5a454ccdb91a3bfe7443ef8d0130b0f9f2f9c0c8cae7d6260f36cdd0a0199e3049ff8cc995159ed6e30c522ebc1c906b6449dd4bafe5d1571656cbc20a19e39389072007eed7ec300de5c4e37f3134d13bab03f466aeab2d6dca0b2b50c6608e41e5724c6d690b541a56ad72f27884739ea79a89974a4af1391af7d21a29fe699922e863bad2e58a31e776a4bcf86998b6c60ad3eac298eaa5cff6810f48a36bba45ec137c1a601a7a21854186bac98aab8fbb9a051d7b62d6706ffed72d38ddccd6e5235b4a664b1e8b4311f7c48e8fa48b16a69363dd9ff785cc121be0a607f65e3b5c0169de6745ae18dbb8209ef0c94081be3a9ca5ea2e9674858367d33161645586137fafb416106d6970d6e3f5433865aca2d1bb8ba32ccf1fb6cca9a335709d693c95c37bba3ba881c8ec43e53afb2b36740a07ca80ce45a85d170fa4990a7acc22b1010359b733ec686ca80ad50f3925584d70efea053ee71f4eec7eb5bb54786dde5196190a7472f75df9aa3dfef940f5a4e1410b5822a5a57b2a77b20a9436c6219b7a25bed5da1ec81e0e9a50d151f4163f090b4f59aa96a5b0d8b880a0ccd584c7f8a35bbcee84b4fe7e138b2b1efcab739012724bbe9bd566e9eea3e102410ebe58bc679374d2298341d0396e71b66c651b474a61a95c1234f17dfebfa2b2c766e2976cc135af3094a1fae10210ca60fdf5d25e01328064023a8d16a372d2b8a8de5df1aef9c4cf19e4b90c4fc3df902465dc369423b0d3b80a4575f33c46e86d93357fc288b810fb533441bd549d02c0b28d5b834293683eaacda219c6b95f9b4a489d65a934fb20369408b489aec0ba250c543558d22a7c624e257bd9d1261b4bbdd3ff26e09771d500e99c2cb7d2fb0682a9112c14225b79f087833c3644d6debda9f8c563ecd677a16ddd03633e6a9d16e381880256c139da4f97b991c1b34b70a8b84f660238669f1bdfd7570eee31f189eb3243d097e8350521168aa699d9fd57a78b90e27de8217c0a6f3e4a710b3a23b9f38098c6cf2831881cc8fa72d18d3e2e438a938f464f16c795bef8da741a3a529361b43536dc5c3493f4c5257b47e6b33dfb1d54c852747c0f7f2211b2b9551eda8d2ecb64780d8d43b5109a1f54d6a0428c89b6b5521b93a62acffd0d3efc8590ad0e72a325cdfbf3b4e2b905db965b1ae5de9c5776957222670888cfd1b7ef7c685a11390b23e66d99436a7505af4e8dad24edf4e768834bddd4993e9c0fc467671c8f6f5197b6770b3b95b6faa8df638c6393d5cd1f2ce9353b19a4c48b6c19525bd68d20b1d3dab2d32211e10978632ca475424f3fd7c31745ee4774b4505ad020cddb9ffaa55e3712f9cee25b805732ee7b829552eba229fb0170d210d6f289725ca1f7f995ca4201023527255f05494a8ddfc8e0d04e16643a66062967a826596b264f3609e87aa6268dd5ef7c3517bf939f106fed8f8488817339876c454fdde2b3d03a6a7e880b4b20174241b14455750b9489ac2d1c70bfdd93b04b92ab07a990a18c215513385a3413a4154079141b6b7db574ef8523daed3b2e6e54e3dea905ecb59435c4333c12f1a060a95e056e07f27cae9e67a9bceb5a893b569e6ac85ad63b2de54306d702dabb8bb59a2f54261c64c0026c0b4b1f17471c5f85b4efd689a8532f37b9154bf67ffc2cd69bb61223f713e33a5071d09bf2783640c307c22d836dd94952dd376c731cd6b94f7d112ebd0f09798015480d11b6a476a0f666e955e5ac20db160c651f537aec558f6c653d1c3cd2a41fcd962d4071cf51a60ae6a52270655baa13080c0ae216b5d66bf1ffa343ecc376a85ecd7d65f5e0fdf64cfb8cedbfdb80947ec1a7d4e0753955fa8b0ae771e504218c79d5478d54e57142df8bead76280d7eec69419f19f9f74a76abbf00612b07f49bab0e142b645c5f0da873154f8922381a43779f33af20e21231c265553620cbc1676f9b90d04387f73e888dfa59ec25ee2fabb8b4f196c903e975006af020e0e178f589d610c13173316b820728cfaaf0844a963e5fcd61b439338c12f79ce664564c694bb449edfa17a89be664414999f7c0923048393eabb78a42ddaad94ed275b0b4622942000457ac2628aaf57462e0ca473b496ed262ead5df2b887a8ca45ddee5d9ee4e3a2a77f2db3e4b30dde3d5b42f9fe1d2af7229c2bb9d1ef51262753387e371c2deb50f2905a7f397c8854d1ab60e900938421acd52a2eced8295623b153f6254706c739b4fe602aee6dfcd6a64e7e2770f6b24525ecd60a85fa59b72184e2e5791994be6148916ca9b5bcd2fc6cc47a09745ecfe1a8d18da0c2b87550b903450a4d40e75edf19e9f6871d2d7561c3e2a527abb2d205283d71a8fcc70699622d44c9521e756d00871c0ba64fd9d583458e372357c0ace20440d5ac140acc06866db652ca6c974e30656bdfa1f0720d8d0acb4e24734407c9547150c325fbf836ce3bc8520c070ccb17cc508982dd68a0620bb382b276a074f6a3703e1fce3e27af813d201d6542407b59827056c19c68de20dada46eab3ec6e9395ecc0ece23f58af399b6758f677d937fcbf35c4b2cbc5324b92f8474b1b046a4635cffeeb6810ee422bb1893257799146dce78eb1b361688f148e356de800500c8116ab62892066e238c5a0fdcaa28de93134c8a107f8eb2dc6d05e233ba96c6e385b9c4e8ad03ea02a694460b89d536c24e41a8aafd3e3ad12886774fc48e7f4c26778b752689f046a661d6107b30c571fbe2b75923a77985f7cfb691325e8268802e8a6cb30b0975e84d40ba029e033898ba4699a74cf741475c0086988988df0f39421dc709ae06f8a11636b4af686ca132c6faecb14cc9b3b5e5be4b91fb0630423336d6f846805427b73505d77db4a1e6c8eb6856e255b967e6a6dffa4174afb3ee1677697b58972bb4238a98ab770740cce9beb0409bc4ec83beda44f4b0ba18c35b0cdfa5161e379d8097758a4a6dcb3374345ffff262ae3d94aee49d310beb63631bcd6c4f75d5c3ead0f0929542009d297db869001f478496e26ba37bf1a63ecd28b5394b2a80c7b0ab9c4cfe006b8a67ff4c242b5722e943f93ca00827c3c607c81984bf98b32970abdb11cb35765bbe4dadba0aa6daec3a77f9fb5c0aee89915e7ce7036cf769b9462f99a35daba1aacd3f82f49ac9fde8d3064dee076109f86051c8cd03c7f8e8ff2c4d1ce595fcac1284179f8f9aaebd8ef3f044c9d5c7bb823ab262f9af678e5b33948e79afcd30921df05201a77f4720458ae6beb73349289a3c6bbb182617dee8187e667383e6e05fa5b2ad8ad0042b7d864a527fed2fb7f2bf5dc49cc523feac3163586bb12d71eb9047cfbf4183050e7ae621ba45edd4c6b39fa297b5213f1287e3abf2e572bb24587804bf6432416ac150a8d0edf1f398c1d7d1a386ae149d8465fdc3916540ac66c9d905889065250200546e45da98eb626cde4aba1913bfaf60ba38356396e633c3a91c5f2be4dfa58bc0ecde1639310de524f7bff0b0fb716a5deb51fc225447ec117e387354cd34395ac7171358fc3cc7423518c370d362f97537679d77992ba99ea5a4f519a036bf9ea791807ccf6789c27d451fe7da0c848cb6f6d60b075782ad2d352fb7eb158518e8ddbc190d26b3024ad5546a61c6a200d480245131441dc97f6991c3f0690036154c44b247f2c9ae283a0f9d1d39c87e3a8416eea989c17006a2b9a26299d792b77da8dd024434029ff3bfd46ece6e5133730c47d281243d6d8115f7b420719b49d256fdbea398cc1c92d3c4d90d0a2669eda2d13ed2ac8e1e75151867b544dc36faeda8ff895e471887e9c2ee7e326a4854492f60f6c0ee940f55a8efa0e7c22957cb43277dfb202e437073018a6da959378dc6cb5607eb68a0461dde7bc0d97b697e70d8ea05d3d875f649c4ca22400717df1be078f7e0f6e874db96be76aeb7a085968665e4de716fe9bbaaa5d6dafc75bbb342e8077be9485086bae16fae68bd6f48b26a4eacb3c1d93d25b611e683c1a211552bbd289a306793ad7d1254f8e099ebdf7f79cb09fc2362c86369df478c30aab9ac9f539441388700ea153f02eaa414701e1cb5de7f86b105462541b245e603c2f314a961eb21d547d0cec8f11c0c4716be9df9bbdc41ac5ed6fa9a4e8f10a11397b3767daee202d499c58f5df530f835e984032c9302b9478e506596b86f072df3026761fcc79449dd900ea416c0ac5017456eab24387c51d4ad2005624faa649d77e89965611e19f4a4a35de119d7f7d078a8b200514a00628756250d410f7a0f8a769e693ce4b77779fa0604db0f8f9d942dcbd7fbb6c58065747029d1aab0c1b09deb88b99cc4ee868f16c252b799e70e7a62eb865733e6de0771387000bb4c90cafb4475baa4c260bf1ada3f64a9356e2b11eb8f8fbdee478b92c9aaa5fc18918a681cefa2e98b8f268c8cef9b3011399c533885e4d60f387d6f5df00ef5ae49589c82860a05b26831e68ae1dfc102d76aa152f7db1ed227597155deb02a861eb21305e7348bcf928da334c486ce72ee0276db53f6eadfaaac1351c51e2d388823662771d6de4b84866d1af634caf9e3f06e3238acec7028e1ffc251cd502e1c290057b4459faeb4a88ebdf57e48f03fa0d1e80481763c28978137f32245df514f6c273d252271a980929e50a7cb0e77b05c7d46092abc3049321327d170d4bde314166aea193ce99b032c8665c3ad129b58528ba87c58c6539cf47e3f53a6b890a295cc08e658eb547af9052cc544a6ce701833e3ed9a61632c5c54e080bde7e46235df060c6e354944746b51326d9ac61e3edd4fe10977d46aab4a596a92b24b0d6722661dd54de61a3f1797ad90651ecd26e641191e9043d271dd0e83cdae20feba24ad7d369bb746a9985499559c350760fd6bd852312dee307b646eb74222a09f6440bcfaa54954546c1c8815b6b5578d7124b14ce0ef2877a41f7de804bcad974fc45faa00f8edc01153ec693afc380cf000365716241ba7e58453e86c5b702265bcd7bd25526d6d169f58b89f86135fd892ca1947593251ce376330ef7b92d1447ea7bc88f24dcbfa533f9c6aff8406b930fefc0afb06f5bcbd3e4a14b980245a9e5220b235195d2b14138d13a50482107f5787b78604144f6a47ac6281b28c16a0697227b75aa1275676f320331f625ce246450386a43dd4d311c06f60c489070950395fd58c287daecc7727063f281cee5dac457971c30b8c1f3e81e3109bba5da8ded13c1863ac61a6718ebade33df17f02613daf7545209e27f406521448f01d5eb124799d32223777acdbd9725f1e3c05ae537af5226b0edfb21739104238a59d699749b177d78c21b7a8ad46f13d620b33ffbf45d1835a43abb9ada6ae67bb739ed6f76712cc618bc0b9f208fa353a3b79aa480c5a4eca7c6655757e9664a708d6484b690ae8fedd4f786f5f83f00cbe07bddbf3c3b6a5b26b515a3f0117b1839c550f5f6715aa40ec4ceef4935520bc659e41a216a2350c43172492f868210d756509f0323aaedc209d356e324cbd5c1cb742c05bf9c0b3750d9b1e823f3ecdebe002c5723e52d872d40e7668bd2cc6b36fa5f598a58fcf899d868ca78451ec852fc3862f0bde5c6b573fb43e90b623b22d34ebd78dea87082eaf836f1fa291ccb811da71889a92918f90cfbbada19ba25bb5471f9918037927dcace3f879e546e4b769419dcea06fe4cb70e8fd35550a60f1b479b1636c64f2d6af0af81e107d1b7bdca632c1ae8abfb63ecb66bc7a72a4b0d8ebbd11ea51f66533ed05d839f9c627dba92fbce56c861be26fd17c31628fb95b80a56ba4c99b50e09208f188404b810d517c076c9ca3c003d927bea36389d6e63d51b9c35349615f03eaaf26dc14521ba602ea6ca27c6d4a134ecaf7fcfacd212caa436e78685e5848915b3b558761acb0a7ad0d077bec5e2430e856b64a67b3549650cebf +0x4d7909d8e5613249cae1a82481093c7b3260abe835294e5f72c6683a65bb0cc5142e6b8a21beeae531e7c3fc8238349d +62008 +0xeccbebc347859d4c096ba63c585986dee7899de826fcf7fdb61c6976209fdd62c6aeeacb1a47a83c0de0c27fcb4dccaba5e3d75f4ede43484b00d5e9a57b099be111aad2317a9fa3ec0608833c838a521761e6987014d10eaeba00605dfe8231233c525ff6e62d898d26a1cf14c467d9244bf21bf2674857c7921163b0efed2c76760bfbd052f8f7d887b4ecbcd80b4ab6e822713e9f512b7ecf307a0618f595c109fd2d2787a8f4b5736a609a871facb4819f21ba849393bbbb872ec73f4073ec3b4f7d644ee6890c30ebb518994b08055e91b3d0ddb796669c3b065b2d76cede552a73ed6d5abdc5075e729dd5366593c71fafe774643d67bb778b2aaa40ae819eb5982bacab98c840eb20900489cb4504719e660f438fa66061439d7e461cbc60197386d58122fd23bc465beeeb43035cb008b777fb940bd321b81a702f1f77e17d8d67ae86644df8f66c655b05d3b5190473417435547f5be0720a49a3c09a6b0a6c340160659e06c41b16137f86438194696cce99d8e841c6f8d6d14c060e44e79a5794b72dda964cd9d6dd006196dd8971a04cce2730cefad1e4d0cff9b9b43e9f362f34c5e7f0b6310d83306e94740a1445b77d493d47a5889e0ed7a1840534013b9c7e34af5c2ba823cbb8b4269040d8c3d74d47f9f7eea26b520a07577df34acca23e821822d3c8807e403b357753488374e7284a25fea9b26610321b66a30153081cb80c89d5188d646f0ca7726ae9eb56f2f41a18fc25dd10922ab6066baf3797bfdd72da5920b044ee2e66c9ad45644417b35019119c531938f812a674dbe017d0f9315e896952e764a958c445e35708fe6ed47065987c49a9a3168de60db650f615335a8b7adc167a8667ab5a4b2a684e2d8e651fa0c0678e33a905e8ce2109da375f1987dbb497d8cc7ac51306472db0f66640683d873d8eb1b554a2a4890c246a9de2a61544322583785b999b141fcbd3444867f53991522421c33d1a561f7bb3d5fc0faff3b10ab34bb51492fb0548cb10c645533e2c8194d59ae1b5f00b871cefb0ec3128da2e65da1bab7462a8cee6b20229dcfed6c409b821b5ffbf97f1acd44662244d773aa10dd586c7b3d1062d12443c1ae256c38cb4a0e27f2c8d616b6a069b0fc94ed56dcc2ace16554697a718d4a59450762524b05e8fbd9db37e629a37bf7a0428a8d3ff64abe6b0d02b5dadf98dd2b1fc93da95a4e5427bd3f1984d23f5ed66cc5ada8ec944c12c366755b7fd1c5d6eb1b4b549ba0c952fb36115691066f15704948a61a2c22e3142f5991f2679bced5d31bdb5e82b3e1f1c77e2d7473a0d3f96feec61364cb627ba7d31cebdcd7798c8b1fac1766bc6b5d5db06801098ca864b3f0774cf0bdf7667a623ab093f17d6b9dd7556abf3b458a834894bb2a8af94eb00e483b32734861119799d54f8230efa5d355ad0ec906f5b2b741f779444d13ee889772bc73ac07f7e3b8ee42023aa51d842b72d7de364b767cee6a58111a60ba000367f137b8a7b7c6f6503de9f1187f6a5530acf339e84919f8785999f791ccf51aaf7347e4dcbbb1f0af75a20ab64606518af090b858a50f0ea5f0475b3371e82b9db52cb7238e4526408bd2de0afbe8aec6354f081904dc8f77bea1bbd25359d4d7294eb5f8a9f115d802f4f1832b71db970d86cfa602f2f9620721afdaebba94d0523657e899363dca5d70dbbb3f424661cbc0658c09f2daf98c4f9dd9959afa1dc27c136fd6950cac1deef31fb1daadbb02947037945cb2a290940c4b0b6b6313fc788eeadc8e00d1a6b7de2d2d9b4007346b56453c810ef1c69781ab97bc6e5762b411062591c8ef8a74037ffd04cbdaf3cdae115d105e6b90b28467d4fe7a5c87c7403e4c40b35a5babf964cab79faaa323ee38907b0f84718d8b2c4db22597fe2a92ffbb0b5eb68cb82687f12449fae5167d375131b0b10b710c556c67ee9e18469fc6fc523968802121661acb39401c0df17a29c4e085a1159e7fab9043d378b3bd207ac5c1f4e88f606ba22d1c1eba82e19d84b4fd86e4e3a807a5cbb3dc81ea8198c0d686f0285b6a2521ba30eb631da3fdec8286194953cf89c56abd2de663739c78f506dec20db51f0403364a8826df37ebae18d130ee5b82950dce2bf8b709a7ddb1b005382ec7a5e3988a90bc46f9c7ec9804335e2c026e8f15756b4b4dba47999d11281d3718762adaac7251e66a1a79e0f6b403952aba3e22317050901c082707b8abc3af3dfc545a2a43fb9dc6cc1e195ec7d3a25b020ca480cfab369545f08204f4ddff9ea4ea8772aa0bd5864943a1bb0340ec09b2852cf1cdbda9bcad90ac84b7ceb0b10c77e313f925163f1e74fa89eaddcabd58322bf31efa52088b81e7b659086b1b9f671d9cd5b9d847b84cb449e2fcd6fc7f9e120327f3d7ff8c4eb4285d3d7744da52775bb44ca436a3154f798030993d85237fa06d3ca4080c41a24938b07db349a4810f195002827b792ca7472b79f6f55ce56973373ec8a82522a78013d6fd69e7daf579666bc18de2fc41ac2001bf6cc4b3bcce7600a7dc43c5b1a7da2b69c786e5cd58f2586a66dd0ee733b0b90d47d59b28d36ba22c15380bf62465e3aecf2c21e53c7640e392e1f4e6527018671309ec2c26aa9bcbef7c55e38a698832fd221feb9874cdd3ae7c4efd9cc098335afc27353c95461dc77b34185e37917cee13502ef17057a0f6167d6b8744c1188c16ecd299ce498839df36f2f4628802fe7a334ddbfb66d2264af0de865f1b7d22d4ad92a2a80ea1b2f2df02017cd46bcac169c6cc7883fdab8449b53e721fe7bbcfd9e3fbd51de0cf608cd3e9e92efdcf734418276a2779e24cf88df44046ceb363024519b7ffcbeba2d0d73239d05f691a52b08152c9dd871f8dc76c2c18b8a638a74460d31cc994344b8a6ed161074431262e7ec503aef6766a0ffab81e3c10ab495085b8fd70658f4d7bf452696bdd323ef054334d54bcec2dc62456bfaf6f5558f7dcdc2a46bc3e570a573f52139097fd94c6200f6546eb39687d9a85a92ea166b8fabf2bb314ac08e42bfaa3850afcf28a390dd25720fe2d856ae5f8bfeb29f30253c46a5c1b62d367d706d646a8bbae4f117f3eb0d78f6a9b70eb913a11597e626c9e7e981ced3723ed0682bef67e916203d69cf8d729812923fde7ce2daa6967c9afd0fdb5c5b496d25c018470903c6174b675a5ac57019cf8af54e2bcb75470ef7afa036266cc4f3b8a0b0da39b1fabe881712dc3925c95637260fe3aeac01c4282523faf6afe9b6d12e7d11c19bbcfd3e9f817b9560270f8e9b49714cf3cc867488208e92ccc29fb8920652686813bcb3272fa0a3c83de2d779833f6df0b13c25001f5cc26a5796b4f5d306f5c108e331d8a3b1290612b859eb46b4d84eb7ce81b4a9cb5031ae840e7f6d96314da15afed96518f0c1ae775d17193857b3e724d1cd454302cbd14f0f575b68e4b5e8096253fd3bc0a21a092b258433b0c847275c727c2ca2ddc8e1fca625e6d5a0e5d9a76ef48461515d540b3e0f0dac34e2bd6cccd5eff612992020935477ceb79fb01351d05a9a757f42458a432f139fbdcf4703d8f2c70f4ef6c2476f8295a21e78f0251c2434b689ba2030a7ffadb3e246363e0d9edc7fef4a29e9fe71f4086a1784115d4cf8be82a3e558c4e64215580881a5fd5bff0882039ea289abb0918c77183e1d39ab3272e7dd2c204d997027ff70612f92f652110b699a999894e68b7ef3d4e35318bd616d4dd1459a7b6a58114b9a2ba98a06a349d2f8b5a067af6f165ffa38020605581d8072bb37b0abf12859777a0a83cc41a521e5662bf0934026a2d8a3ae3cb25edfbd35088a00dcfd2be321a31ba94bf2079d8833a1f83b07950597acbf836d7c9b4b42b6fd33a5810231c02e46c42cbe578f0aa46a474fcc4dd05fdb9da3deb93973c24df610ad87958b7ba4f29b16ad7d3f9241eea57695354b57b9b064ac1da17ddd53df609d16cc397a8c86f7b2c862f5499396da586c35bea8cd618e7fb0bcb1ba521feb1c378f82e66e6ca0a816ecf95621c8ad9e583570799f16e8017b705682d11e79d3f1c6b0e7d20b5e9f9f0492e273ede8f0621daaf3b8383bd885a6b65c5944d26a4c5909a441cbf9406c930a15126e51f590d5b43e9f304facd647177171f9bd885030d64643143832847fa71685b1b156ec46d681dc65ec267739c2e9a1a504d506335ef45e4ee41df0b2b20e5420cfbb7e5658e5f83edaed6f66ffeb71b06dfb754bebd71ce1c5abb6127224082275ca4dee81917a25e0aac6b4169f6a82c19fa55ec3170436a382e0893181281e692e61f79aadea81c805850d4e2e1383c76c9f552fdb9eb3464a75fe354c3c7e748dc257eb63d1b958a5b358f0c0f41c49076a19774b73c176ac7e58c8aecda95e9079f8bcd9b6375933587d447c96b30d1b0e91e3900ac9fa4f028130cf6207efde8cc05537216292567d63928b80b2dd4e94a4bbd2eb319bdd0960b5d68300ef200699fda69aa2cdb728f422153a7f7f48033c46389f6221fb9cdda1ecb8fc25fdec6afe4eaa5fd0fe64173b414d84bbb26340cdebadc55453c1e03a388a635a1e481b9e56d80164d236b4273740275b34bd9798139dc1fb8d8251cae3809d562a219326e6adf051dba8b42c209bd22575182befd6f8bde051e71897142312e1ca80bcde28b0955fc2c1fd9324e7ece31e7ce31a5f4523c945f71eeaf4f92bc3a66c7d0d426956562f8978a46aabdd5bd6f1a760d40c5a7f14ba490aab8c4ec365edbefc5c609cfdc9090da61b6f0c5646805f0b5ed6caca643882416064e4abaf0b67f49f1ed01d3948a5e35ebce39b1630f3612429db71de7ab2d53b0756412ecf613b322a587e264e26a15c18c9f4ed0a4cab4f90f53e2987bf0f65ff0a4e874092193e0c9ee839247a293c0e262773145030069080f7ed67933706d46a996567e3d8eb4d08231ad187c3272363fd5158e83a72b3e465d4231495450cddec6e4a3cbf607400f6705d37b645e1e63e2fdefd0fba80895084c22c704b31ca0d4af38615c609ed2be4d1704cbdcf18b2b4ac75f8087fd880a54cc21240ca9bc5a26aa723449437881d341ccbb875612089cc3a3d813937bce0cabdc14b60b7dc1eb58931039e45d6c48e227c5d5c2a52564632264f350fcddd4307c6947a861a65de12862bae81dc80e86aa7d50bd90ec22047fb9afbc97c43bf876944a0704720ed2c6ce34d5264fa49dc94470ad81d756460038914cb8fba4625f1835bdd2af6e8be2953022034d9b9608adce28d47181a648745077fceece1c9a87831358c90d9b006a4555416c640ded3bc1a625353483dcff65c4c037e975bd44cace03595c7ea4bfece54cf69e73eb50e3abd0bcdf8d223c29c99f41b71c3be265446edaebb534088f6892a69b56879fbcb08352f310bcbd44ed06a6975e9ae2fb0d07c83bcd52d6b545bee6fb34466aa54aa9a20fcd00e52fa582d10adb6eb8f48e4a9bbd25759ce7133e222e7bbc6435d0b024960093665299905b92110bf6da4ec3dff05c20ddad377d02b5bb3dff06e933551659e893461fbba0cd8e170f14d4e01f65efc91b704917e311715fbd710aafae2137750e82de613b0da0f4745ca74ba49e4ee2d8c8ce7b4dd21ca6020cab81aa1737dd2a812c2da4e2f838c8ea3c4339fa0802981f1e33cd783b956f425255e388c96599d9af7d58de02687f761a833a1989bccc0bdebddc645c9277ba8598b4f66ab2bee4cedcd16f3df80a58b8781f7d6255f6e77695e526de419dcdbbd6c8d0aa591c4b00c89907395bec3a9c8e64862082ab6a8c4882405f1764046b7c89b7f6ad3474fbdd3a465328a7743d52a3c422a75bed76423e414d784ce72b06620cde4399eb06671fad39d2ce9e215157c807588ae8cb1f73aa3808cafe6110fc5fdf90bf25c712c39c4beec430df06eb024cfaaaf5013cbccb9d3d50a2a408b321693906ad944cc09417d11aa4dceff80342225e9a9f268455eb8a908c7a7a20e2099112fb149191451c2e54829178e92ba553f8322b6974b9a174ed144ac1c0224f3d6686be6dbfffc75ae452933e491bd5041a540c71e8676d80d8c29b9c0b52889273e9085d9754a7eb5c9d58bc92346fb73798d8dc5a0f9e42e61ff3557d037434cd9a78ddc1c44c542fbb68505f05c3e1c249071563e2c21f9794c88a9fa56098c603866ac9cf1339d03538a5fa1070185d1d1d9970b1578b6fc9b197edc8fc331fccc77119e5aae0d0a3403a0de4f2cf7a6d92e52acbed1ac1271529e1de95981d4ea2ad3ca851fdb38e256904e3da7b8cb2fd94dcc2f1524e1589ad1666db3c5111ae6b9c77c6f50b4e4edf79ad85a10695b4051116f2a6694d759de5f21b944dae4148c3e4784b2a7c22e9d6a292d49a8e6cd252385faba5177f88eaf0f544858d11a14d6ec48493805834a643609aaaf57e793ab7c6c6840bedda9ff3f6a17b26861193875a25f903453c53309d47aa736f561515967b78b3671f7f6b7e4fa113151630be9793ad6d705d77daa7802b70c6158bc26d5f157671c3f3d81ab399db552b9f851b72333770348eb1fdb8a085f924095eb9d5ccfd8474b7ba5a61c7d7bcde5a7b44362cf9bb4e02472e759c2baf0e183aea740181158e15929bcebda0c28adbf1a053fd1cb8066d1ab82b90ca2e3022f79dbe75d9ab9ca7f17d7eddbeecddae98ce502618fcfa499d096f00ea1d36d40532198c4fcd0ce9476de6ba9ab2234cc10cbf2a970096025eb0a47f13e28e85f45619a75be07b4414fb8ad6bcb918211b19f58cef596631c03c606dd024a3c345583369968c5462da94ffb4ad4818e5f74497cfba7df752721b275f973a231668d6fb45882714a008c8a9d6e505a1e5f63b1a6560c4a5dee4cb6dc6e1b968e9ef50d5cd9957589640151dafec683fbb885c01e07ae40e5188cba8263828f1d83944675452838cbff0e8cfc23bf66ed13e25c2b37152ad34ee9a6b0012ef6a4be720049c3c422d779be234904c26abb18836e170ec76ef0376c62ae70a931ecf697241e7cf09b777b16ff0aca57f72f6e6fdf28b34e76047c1cd6c4d77baabdd40c9b3d98340b71ad2006869c06750fbeae95a74f32a8d7c402eb3a5e2ac7de00d84bee3e18da8eb6e32107a3584c24af497adc09f96e30b82487572f40f21921031e79962570963f6739d306d4e536ea47750e0a2d2fd9ff8c93646f459234df96fb25c9e23651efb53433ee03a60d16b06d86795552984242f8a949bf0ef8e498c93bffd892876fd4fc6f836bf870dc8d4c8d7ffa4136294c9c6ee338d02dd51172035f8dedff66cc77cfec964428e4e5f96944a3637b5bb469fb65373f9b5d09ddc5128bb0827da68f9b520cf0fed5c05c62efd8202e81824697f845c3092289f2c9405a41d85c692b1adc5366b758265dc2a922e01942bc1a8cc4e9c441cc9899560f800ac9aa1d3295b3f50c1e1420e4cf99070b02476ccf20f0abaa09043fbab6aa87711d0fca8e54fe7a4cfab2b5d9d3e81109b238994c9ca413de2a72853d2f37f7e09b3579269fe6688d12d9ee2414bdc843f1bc4c79480aaac66cbd720a0adf56be0cc132e2be9349362f32d1addb41b31f867b8c3e6b47f7cb968d0e0a8fc92e73385efbaaf82ca4b11964695d6f9b5a063b1e61834e868255728c6223051e0667e7b2de6697da02659818bb1a1af44561d64dd3303aedd4cdc660753eb6056702e165e2fee1c4eaba74f6d1cd2274fd9620afeb2d75a474995bb14f44e8a7d8aced200f5a1f13e41874a5b25fd042090fe1edb06247d4ea23f928f91be42be1cdd58b6e6398ee78e762ce66b66c87f132e1ae2bb8faa5bfd2676c7aadf2ba0acd5f4d06ff967e2f8f0418f6bc3e6a3e69e79b6215d53e7a0d6f26dae0597cdc14540ee0175fea9078222c69578d14771bbd5c5f631fc8a33ed7fe229e6398de0a7b7802943c5b240b86b1c771a3ad24af29982a88216ac3cc689b59ce563799179e31765c75f971aef75018f1c65ccd8ff4f7c96e234d611feaa687587b8093a483e1445952eb01ca3cb165bf3f49fb22e62346fb6c98059f25c6b4231a9c5617f33172711b5a5cc81e7bb5c3569d35d0c6c1a819467437b4e1a4e9197bb26adab6c80a8e176d080e655711e5528004015e7cf8aff70980c6e5e82e21e5eb5553945013978f4d8f06d9ec800d7d19ef1d74f93da4c87e673dfa398923a26fa1ec556e9674cb21791741e30a231d917e8cd1e37fe201fc7581e83f0408f865d50cc0cc9a0d13124ca867e3b70f7b0f39b73de0c750eaaa30fa77a3a6b630f57a1a9f12274aaf489223119590b9dfbca9047f981cd6cbb122106e0d771691491780b8e84513e6ead2ef08a09c0990c055dc61b5865ceb38d32c97248010658634a5d3f4fd500221957414aee4e8d842c5a8a9dc0dca9368cab4b891c88df2d75af1bae156e94914621afc646e3cfd6a82ce20b7ba080b698f129afc577382620fcc345559c604ecc1498a6c44ef486113b88eee94ff9b62aaac050b36ac5b4fde9e08f80dcf7ad03a69846e6ee7014f00ccbb29a3958b7ba4ecc1696c1ec5c74ccfff747aedf5e956e2b311f20e705cd2746e0ff0b322de033995bc01b30af2e3c7e16ea806bb5e9c1cdffeda4addae101771488242a9b052fa4aadfe5171f72aef7691a00315589580d0dd2e858f70421c8a7d6228681c1699a8e36ae241fea9ad858269cd4bffc7744d55f4a6cfc8f1ed8256964fa747d97d77074d4dc331e96ad8ec0b4aa57abc61200e3695e5dea4f1207a289dae5c220e7fc0b07a3fb6718f35758f646bf2fcb00fb1fb3a19dbe3902e921ffcc4817ab488b79a51fcb5c98265c5fc02e48e0dc7e3e64c7db2e736327245845333de68d7599313ba44577aad30855a0c5977791063543046fa29263fb63c5e89419d74dfbbfd239d5dc30b775d5db16912d4c8f159a4af7d37ca3a1fc01eb58837e32634769dd3e290220447b6f40a0357ce80d48b7dd10ab2f1fb3b589492375ddb073e521a2a71259cee8701f36cc1708d2b20c3889fd5b3c7eff94846fc7efaaa9e66171d30326458509e0701e08ba438503dc76d20c68274a0c257dbfb45577b73128c4dee0e957fb2f490c76d493df878935fd35cc6661f96ff4cfc9774bd740fab7a536bebff389cf164ed1be381f42a8a55625cbba9f15716f050d9f472bdf99aa9d6b0b3ebac97fd4a1af242b955ee8a70c3278f91116d710b80c8abbe7fb946e17fc34ca1032a800bf6fb4c2c424cfb779ec52867a7607665336c82ebe2d816eaf6aea06964dee26f2a3dea24e4cd45339a3f7072ddb68fc512ce61400ddd748be279958bf73a8b3e5ec005e762f8d06c609c4dfcd9f923f4c4f531042950c78eeb2a154ee6c6e340398d83bee55604e998e4a94bc3b099bbf2e9d8805dba76b9bacb07fc560a533d64ab4ef1956d4a74e9206ba8c4645be044b340fcd2a2ebd5f76352db718f41fc87224cc899c808d3fb577b5b049cd02b615a4fbfaf908da94afbe0345fdc164649fb678b1aeca7cf7791c1acaae06066f2e6ef131d0cc4ff599a984e48793be3523d85813f63903005d624e3deb873579e60073e449ff89dcf48627353ef169b4bf090f331b42abe4c2f8f47caad71c80ecf7f894bd0914c520d26e9a8c51136dc1d6f291767dc41f5a3e7219346c37fea3b3f3c5b28f7d48af2ccf97083937baccb0a6b1a041080a73b15b9640ccf44d9ad2e9f9b2e93fd21fe3debd3b203336402490162142d440bfe01576386fee1832b36fa346acb8fbc3a5f07f8d9cb26abca1432161f9b55c9f49343b83cb81c91c03e944d64085106ac1b950880521c2a2c53485fabc17b8825b4c48cb666bfab712fb60fa5b30ca45e5adc2a2f00dd892fee896442097ef09a4a24077d6e907848efa8a2b4328841580225876f3d306fdccd3e4e6bda25aa5a3ea950183a58a14c67b22d19ef8d83a0fcb846c771df8439d9ae44af9c395e6d799c900f30decd857f1cd85d50e3124031dd91c004b07151f8236f94b883b3dce245eeebbaeca5fc202dcd07bf51974088dc8de05f6cde2913e3f6a494c852ae60eb93323f48d1b8302e319fa3a1baa6e8fc64b2e8db72cb1337026799d3e3ebddd7a66f27bbf8c198672fad6499227c3b863ebb08c4d63ede67bb642f6b0d9b40525027d90dc2204120ecba6a0278ca68c2428527f0b28a5ebb4823bf5778c771a2b9e4bf06d9dc12a1934d1ca3639657f89997ae28adb8797bd22caf60cd77570f082d406ee2fdf2314aefe4468ceaf0706a7903326fce19ee8008694eb4b1dce3668bc40c888ccb1a392729b19acd1b71deb490d6a1d7255d7b3e53e9d47fe764fa85b3a9709084a28a7d54ad3648c0451dcfbcdeebd88510ea56d7f8d6e861dceda3760d451105126279cb020861c7324e52ee10f4db214ff6d85c4561f53091666d7300ad1836b2eca4f778b72218819ac5903665e7e162c74d4a961eac3dcc8e6c134a50abffc94d8540d7ec939b7a28b10916e505ad90843d08b4b51770d48c27beb2d8d548a1b0a50fe64ebb3964219ec1791d3c6d23562e0067cd3eb1f38926dd02ea9bf9803b8aca6e86a2d889ac122026b494096164aa99760e27e96fadf2d6003107faaf16bedb373b50612ff2978ee753156993d7383bab22dcfe911f121375522033766ac9a80916cebd9f1ab47382a2c87500d6614eccae65daa1080efa28f8ee8c1c5f319bacbf23d2214df237c048b416f28aab3aa25dc863e78f6ff5e3c97aeeeb1c801ae7dd578afcb3d74269eee132af1aa068f5d40f83aaddbc6b6c6dcb3f29ca3d8f841873cc7a73edfc453b58b280afc83e8dbe422134197dc48c8de9691f90f161491a7d7fe1b6bcce1bd8207fad71aa2531c16725cb6c3b670bd1dd52159723f8ff88 +0x7ac9b2b81f25cb0c96971b4647943822bd86d0006fa26049cb9943a09dff78d287afc49831f5c5e8b225a25e0dadff44 +62800 +0x92e47b82b728d639777d5d5843de2a5c364956cb4b21cabdced2529b10b3f4275f307fbc352866d7b094cfd7426ae801aac17ac72335c04adb8d791da69b3c4cf4640c9d01812c154bc534be492065a85ac33a2efc853f7a3e86264c781218f639c849ac81fbcffa3058b496bfc94a582e9abe873ddbf056df0582aeece0302e16a35f711e5df88f489576e60c2d3e1a0e8d2f5a50fd7be5a651b5cd6bcc2bfb733f757440714edb79c3a3369714eaf5e2e3b5309cb387307cb4e6315e9fb16638e2b43e50fd7ae6ac2c620fca46f5f192e5778f89c7bc3d47743e602b216c764dd54456b4ca23b8ca16dcf70c8a081606db9e027fffc416f1dae4e43c1a01339a604c44d6a0f25ab9ca3978c6aacb6d270d510ee62544c3602e0045f7521ba508caf4911d478fd36390a01a5e6ce5fddbc2b93d26ffe74a7eb8bc09c69160d57d5d66c4f086a12baeaf39643d99ffce0b43fe16a75652b531bf3eba109e78cae25fc765b926d06a84712ddecbf9c0e9a0d94721d2f1300c638daedf3c420c8c201942fcdff0c699cc1ca4107053d15580cabce70d9a2755fb683501b445c4241dd3fc12caa928c06ef9c5839570d91a955e87efc117df9ae199fba7df6f4799c3d5202ee11ca1e55150b9bea0198141c5dfcdc1573102e2fd68275925873ef3f966d4d98e10d7125f69a849fb1471d1fa93b9e635b03536371ce1a0ee57503ba6cf409a394c724e7f8bb9ad0c2950d21bc470e5c55c229d77ff5302a2a52678b4598ef948991ba2990014713d22c74d10b81d466efd711fa557a209a93a67b20a49e37e24bf7a14960ee21df5c67d48c1b7e692975acac4a96df93d6cdebcf190ea6ab2358636af5cfe4b3a9bdc1bce160bf350aa3cd3956b897e255158cd3e2e83481ce3b6f778d418764f992d48e4f7fb6d080e6b3799d3f35949c17241a0cc5ba84597166779e6a38ce45681ad944cce7c432baf9cd8caf2b33125f2c12052bbb0b3b76f2cb97be9b4813a9ff1e5fdcd478769d0ab5b36cfb466e3a1f4c5a8eb88f0ad89ee40793017afad51bde0f240f75f30950b2901d3836f65478397b7335984df2c5617cac1dcf5175db98b136fb350e8c7644a114349d411ac159e65db4bf5b7200b4554e42cdce08c8cf049a1a4e4f92e60c7506a2d1e519753e39b2a85cd9b2cb6d201e02feb70a6df177a1ff2a2cb92a5a7a48f58d48cd2e46d42693093f51affc7b7ff0caa307359068f32c412c6bbdbf2f7f9f17e2923724440e173d02cb08d2b6087eca186bba3c7712042bd5371abb130f121a49253a2717fd7770ba8b70906e3c1f659db4564620631962ad87bbdeb37bf10cf2e2a1efbe59663ccd1f61a6028f5535998da45dd38afe5e1bfa2b8a8f4abe586656f8eea5c65609c0f376942176b2a292342ee42eee05a6b6eae44f04ffdc9529fec9947cb8b9601ca409eb3986aa452e6450699100e1a4f4f670acc30fce3ba4467e81919512c856ada60bc933be95b47aa36e8857f5015c894b2437ff15c46bca9236830ff4bb057cd5764f02720ccb03b2539377b224643ffe45e24245b7e707af13cf7dd1a09f9e12cb39774722e88be7b930d4cb869276e472407dd09ebc6a1fa9e5632c218b9de87b1706a060737fce2ffef393b06dcaa839d10648d1427e8e79535486a65fd8b0f67645305e225bd0083c589d3a6ca7b41d128001081fc15602a7c653b792eb16ddc59759644bac97d2a7785a7d059a829c935fbbabbabf10c6413d25ddbb5184918381ae2b75ee702f9ee75e00cf1fbe28c209bb2499e44944be3d7f713f8884924ea8810c279e137fa10a1a5e2fa3a1522d22921b33bd69fe7d2bb31aa61c91807560749ee737dc334c6501fdbdc2e699432ec2e82ec6ed641c9c8342757a25cc963e1b5c1b4844faff9cb767eff9f87e9272e023d18d6e160b144281241ddbe73fb5c7bc5a4bd82748f5bd153cb5516299b35c46c26d4674c707835f48940e50c05c2c482abf2058a724658e3a917bf5c754b9d988031100ef0ac815396947a9c6859b77f32e97ff988d435b5ffae2a8b9db6b5488db486ad172837bad0a0242c0e6a7d449f6b99cabb4f8d5236e3febefabe3304b5276e31cf337dae9f2e8cc2de3c3d595c40fb04f1fd8b40b77ce3fb76ad4054605073a3ff167bb96b045969c0192047cf304caf14285409e941834cf8c903c1f6f93b0a8f1a5b629ceb34269c474e95620334d40b16133433fc83b8695ca5d2dfe86e6e668442319aabc5035a0feecb7c805d79be0fee4aff738e47afac4d1084e6b5d76e9f5aafce0cb307e3b9287184716ca9155d0dd2b46f4a02b30224014bbab84e8eb2cb639ed6a73a1d8d2610e49c0c69f8479954b9b85ff05da5522f9d2e1edaae04bdd673d048a5f1d30d2f03c9e3c34f14ba597816761a96dffe22e3088f84b6de578eb6c43f4f47d2085749c299be020d97685851378644f650608311b5538f88c115cd78334108d33c0f1e4ed762f97a5909c130493e50337173e711354f1f4a24f322b4cd811a1ed4dfea3445b81da327c41b7d554aa3de89e375d0ba804f6ca8ae1b42b51967fbf64f153d8ac754cf2a22cffe02b0243fbf369715eaef083574d022e99210d6b2cbe807314e9887478aaa437cf97aba9d3cf6b4a96da330efb1e19e700c6f4e8a7a3129d83b319f546ee5e0bee1b04f4228aa3355eca4b0e08667f7a0cc3db9cc2bb3e1f9f79c823cfe590e8e6358ca74aadb7edf0ffb71501cec94417a82fec108f4985e2ae11a47649036b2277c127cea10fc0f7daf5a899af7df1bbe4705ae367eb7cd7d064dbfc512bef3d42311a211d115afdfc852d229113ff53e93b6dee0d9a40f971505ea4c6510191256ae2d47a73185dc4f4372f1c01c98a56ef9982c8bc9ec221529121e1392ec8b1cd167b318b85b1d4b14b2198fdfcd99e0b623421e8d2bc30fa17d66a4ae34e47d62967eae12f749c4addaca03ee5ac2f2d5c84b1a5796240a55734a9ecbb8c8814a03cff1a82109c2f6322ba6b207caab3ecf6f0591f3ed0e2d3ef28b5041dd316ff6cf68e0a3054ed70165ff939e5614d980d569a20bc624112587f2a797cb94bab6a69b2344e46f38919f96fae511338f22a6cdf2a65552e96f315c37823bb2138d7b12dacb4f2e012802f44da6a01246ff09bae98c45a29d65175068cad59463c176566b01ed911a0fb6a0f5a7aeb9e75d27b7ef843c1c154f6256a2364041909bc1ee40ae67a36b8ee2225bb1e12e5b85284c6c57e2c7397539f64d8f25c184638162bf9a6469dcecae03e68be17b88bf3301c8cde1abf21ec5b9d19d2b1d2561e13b528c8ded567343cafdff57a85853705f6baeded026932e269728fb5c5ddd0700604d8a36bf69c9ff0ad3ebbbb28808edbdc2843fbe1d9bc605f83c86131e1b3951a6024c0117672b74d044be7da7233327d178ffa302341f84d497a42f6d466e8c5c9d3802c546d5a3be0bb8a3f8e8ba0fa26518bb8a23bb7d86b4bd9812af287b3a0401acbb8e85ff65e7b20bc38009defef193f0ff8d2256d43ad9385580ee8507dfafe54066c3f08c81b39d5013a9fdadc47729a79dda7987d200f67dde49128ad54b979df618defd80c341e6c820d27787cc4ecc786d4c67233bbad4f3c08a8c8fdba91b670b317e8deadfcfc7f8c724e29a46b44963393bd6916ca0e7db56d5b56a0300e12551d850315f5139b8437b7ceafba73642a6cd920bf52ae222dc2deefd8d948beca6d3709fa9b546e9ae45fec354ef6794fde300b03bba0b1e855ce29e2f218eea9936963da64315126f4a0f2e39d305e0a546c78827988a56b9293a54d1ed12a790cb69123c42cfbbf0525832929a38af06be909ba10b8852e15e9e285b413eaaf458922654fc9b6d982581d7478d2788881203f2925c2d9b63c1b520b5653a7b2ea6b881d7b7a2aecf8a312541f4fbf3930cc794e0d4a0b8a91b2847c7a12fa2a47d842cabbc0b09fd4b10256617db788f72858975b90a3119339ea27a3d45a7c0a49e2eba53ff038a2ec7de9f3df0a0e40de4da3753928f1dd3c03bb480a313e9e5ad8feac3a626dffcfe58d5af62f2faa58d8e10ec61591cc136195eb4726e86065957255627f9627c5c9ceeb658f73a0227ade7ca9e177ec6a744611fd93e01d04c8f5252ab047c788ab1d498fa350aeb5b40a3367252aaaabcc5a309010dc10b2b3f590059d095b6309f6d9d7136d329d14d2e7805900a351ca30ebc11622e7fa16d22a85ae41600f56fa30fe582fe8530df6fd87e5c052f6fe6897f32c6b0f354239492d5c8651c81285c347d9ff1c421fb4e9e053b035f5f97fb998cc0af31ec689905f305ecd27dd28256621716b14babb311c4b76c8e92bc4e5346d893ff1245184bdc2212ec9176fcbbbc72d41357f6867ae057a984b06069f58996c4266ec0faaab7a73e30641bb2abb23692b1ece5af2184a32009628834c77c83ab6ea7e4256bac1dda689fc98c706cedba54b37e174ed6243ae5503e97104826ae9e65b682d5e50b4d5ae9887251131eb3c453cba449fe615fdf21897a1a140736805240f93287f9ffcfeb614c95cf52e5c975d43f5925e3f8c17d72c52b09afacda148973c8bd6f588e4d5b0285c710b82bc1a0d1c873306b510eff608c4fa576755399d6e1adf6c061b67f7c6924e094b1de3740dc0fd22258793a33850d71fe19b8790cc37f159f0eced4a3890d4ae12575a176de2251839d692b275d6b9caa8dea30fbb65c555d5e3e625d2cabd7074d2de65915d333f8ea84d9225e92ade49b92c68d046c3d6219ae31939b260e6ef1af0fd3cb4b02e805724c0dceaa2c13095844a8f3d6551607c54a2e1fa5787edba324cb46b145bbb7dc8cd1f6daa29ea0e3b136cdc325e2ef2cb414fe509ba0d2af2b28d02e85d8c86aa2541e4b96ef28dc151ed85a362c9b8b772f8050013a9d7e2ed4afea49a900c395808e25906d69ea78485dc40f5dd1899c65efcd32b605b634b62b0c199527906d3c8d8f18802bb6e39ca32838de5ace29a091eeb57ad20046b68ebd7d040478326f64b1b79035e85d02f4af3a16fe0329c7b0dc11f0cc036bbc1e24fe5e6024ed035cb4f4055027ef6296809c6c84d0a1c292bfd17eba68abb0256a230c033ba6dfbbc05848441ba0a4d2c5e64ab6dc9b797fbe7a8e66d60e7ae9b67574b56663ebc9fc6abfd96d78b0f0a3a1175ad01ed4c101968796f69d03b3317bff3e4d2e0fd091b2d3d6c57f6e3844543a395333bb9fb1acd113705f31ca02bd1565970e3316a7b8ec05cabec7f2d0871d1b0ee11660f645d4a5eb5ded7853c31ff3ed0c3fe46405732c253ca1656ec227c8a830cd4df7e8f7130f9d2003491683b1f62e1b82f320ce147e01e6da478ec007ca28c8aedd1da5278529b0b40e3dab645b7eb0387a9167857b167c99837250a11cd2efcbcf6d43a7f50987d3cac0fdd7c304e44e22e1a547c7824dea49f73f5f45352bebf65e3a5c06438ba8a428e3d1d7c7a00b1297ef21084d3f15c1a3f607ee5962577a7af20e61e1a67ac5fbc4193fcfcdb9733bafdce7803c611501db61be477d588249d385aeeabf9355c40878a224519e6c554c400b222b186a9657375e066534365246889467bd397b0816b6a8cf1602266e2e151d3bf380ebecd34f759e0033bf1db1e1bb5f8ab55f51589bfad7022fc80dbd23c4d47ee1bd8ab572ac18389f45327d56ccda0d4f2a2635ee4044ff6c7bbb6132a9f3b3850bf86668ab7bf4beef1a13b06fe12e4e04101579211ef40067ff820973a37ab3fbbf4ff919cf1cdae65cd9b64b7ad5fc14966002466ec834b3618871cbe9bbb2b566d7ed9f1d97395280393209b0ea9f83407f52573c65508869db3259cf5ecb6275650be46c4f235a0e9aea508855807896d831fb8eb29c0da0e314c45c4c462a74631c91c42be2268f64a8c90cfee71c21d467da6e975f6b8d08dfb5986b6b34ec38e84d2d13bddf8bfe321c43ce1b9768dbbb9de3fce3c9b9b35ad38ca481a9654c37c1b0effbad88d250f035ab6610f356f6ecf5c96e50aa4a4ec73fe0d2b06507d19454a7e5b71047ccedeb7e0eaf4babe06eade64927ea378338b905a47276d17e6f2224c326aac56dbc6c305c9ef74441cc123cbc7801e0c1cf03fc40171f1205fa204cdd21dfb4fa05c0a798027f87e1ae2db10e6875afd03424aeeec6e9322fdc58087ad1357d3c6ff0cd0a066cde88ba042e8921d00a770e2402f6a75a99c4bed241e35e3686fba30389facf45b0fd9ba29c73cb995b7f050cdf9fe3fcaf8c4795dd61ef6a38fe4901c2af88926509f70ce1158d5909b1c2e32f32a257dd4e20a9c63aac58fb0f08f3627257dc6574774ce7b790977cd3edb1d9f70bf189d4f016e2b6be8838f488e0508b64a91706c26894a1fcdb1cad2e7fc53647541de460e41b1f4d82557672d07442d884e586816bd21af8ae51092b54db377d08ff47181c57bb80cfbc5d6ecbb6dedbf236be5b5a886bac9683ad8f380341d69399c5bfc680d480f6d37123dafea9947d7374f93f9edd411d1a620033259e7a7f5125fde87db0757f047a3a0434e92cac02710221fbb6dfcb7ef0264e2994905491317c8c369786f3b63f5a5240e7cb074c7d1f09893ead27171fab90f76c4198c0afe1b993d3dbd850892cca0aeb9717b95ff8fe2fbfd4b94eb73402776eb4d54568d7787cab9db93c2058777b3dbb63b2e13408d57f7c09897f6caa92e112928a2404d0d966f41be1cc855e79245d749dc97b2f63c7cba03140f8922e0f8258f6aa10c9924d0788a7555b89edeaa6d0e3e0777cc2dfec05afc283c2343e2daef1c4a46b8fa8ff87f68284ffc0d5bd01edeecef6d80f05c069cdb3408db73a1ce33868bfb9bf03a1361ca5c8d82eca8f22bb28a68e9f3f5ac92930161fc2d22a34cf03ccf6d93c5ccfeb69ed1f3cf700e90e2e92cdd6c15a369da34cd4a61d614d511e9a2f3fd2432ab775757c496adeacb187c47bfeb44818f3b4e893ad4248948660324d3aecdbad487468d69b4bb0d26adc44815d3fadd6f10af4431d6a687236729b3610b2aec1660cce177bc3ffc302d518c83b8b0fda604e77ce3fbc475028fbddd4094d43cfd8e5b02631fa52e641194a37e2bff98b07277a1b5b616f9425a4010d6fe5223d67a815eb051731a5ee51e2b59904f051b03e0412b98068a8f5150ecb88a1d474dbfd064e3f422467d324e62ca7827e94213a1d9ba042b8f260f50cf59eaae0ddfc8b8a3726a5b495b63b608355602abc23c5cd9e5acfe9dc2eec0473f728cedf91fba98e03656895603d57a2ebc77c317e841d032d4e83cc26a4fd2ddb4227e164f46b3b1eadc9d099d3d471b1defd5cfa2114b262e70c2c11c2ff0a9420714d3b1fd926bfa35eae28a5ded7eece34a35f44bb9440c40e63b7f112f569eb378adf24fa382e6faf98d75a7dbfecbeaa6f7494188f110a10d9e0d73fd3a1cbfe0018aad757b23a44f46c9bb90ef1d7e52902ba368c1be49bf6541c8d8d85e75017ad59766c952ca62bb00f9bad46406f37d15d1a74a8783622da69050b5d68b43768dbe1601d6c5ca66b5f2a843322d003a926ce2dfeee69c53c66ad357175b3c80fd520199323eecc65326f7bffa58ef352bd59a1656fbc4740ba8ff30837d4326bf239813f78e5046531707bf4f0337193c9c3b62723b810af0db32e6bd69fdd44d7367f6894c7b83504376a582c47e436f314568b31e48850091fcce3799c32622f1efa579e1f4f9b52cc32748050b401e25568d8c1c818ed54ddb7b64854978ca0fadc55bf723160c335b99015d848bd3e8ed457fded264c96f5d52c6c4e758cd2d10ca81f4ac54c007ce9f413660a32b1c582500bda1c36786d108f0d1235286fab7298e52e7526b1a9a8e7a1836127e1045a0a13176073a14f4f2552293d291c91f66f3aa7a9b87ec2e0b2e7b5b565765243cf3e2d5ccbbba37a38641af75683898073453cc7c80dd1789e0e876fb519b828e5b3a376066b6f780e6b6dc9794c9ef8ee2f75381f09dd58f13e7ef5dd723cee959b0118eb5bbd33ef8eab1d581fd546261fda648518ef68f39e24b0a528e97e271ed0a94433949225f55b5abda23852643ef4b3c1e20e90ee570008d7e4c4c0e3639791d79afd7df7c905e86e80ce04efb34a8e9d1042b828909a66394dd79c1193de376d39fedcac32312f335f9f4511a7645bdf4a93c8ea727b30950c29fbf8d52e05cdb8a2978d576897d6e8b4fb1042cb8350370aa87c252ad0b1c8c2c3e1520d62c1beee97e26131881dc2141035ab066fb880ae4026d02fac552aabde143206b60ff3ecc2f377156ad295c76ac80b9d86dfcd8878309c132e4bd9eb32d99c9e6a8001a30107c29ba5bb0bd6f31189192f8cc59e39e1b05dbc5a7e8aa978b85fe4dc8d1b3d676a4ba1a1ca4891574e01d48910fa69833595c049c1912a38afd08deb425d5c5c96adc64b7a252ee482dddc9c57a4f25c5244a1e149079c63a979cd74c570482c6e4a7d83c476b1fe4b36af8e42a2bab530f1c7eabff4e93fcde30d41c15ce71f1ba92c0f504202eed492b52678feabd5f6249a2cca60f8154495b318dc2a237fc5523db8c59109fc437c562ea2c0ac06cd65826e1354b12c361729c2bee1e29293ce1646cb6bae6fc179fa6c67eea48edd3de77a42d7fccecaf2d50710890ea2aea421810cd9d991751309aa70927db64d333116fef2c14128ad21ae7a2b8ef53e5cc4312de272a888d1ebae64b31ec646d0c80beface8ce79d07481a3cd4ad36a7f691dd98f61fd213b0840ec5a6f06ef9a1420be0d59bde5e43546347a2a865a94770eb6e78ed869dac82ab08e58bd711b7e1f131dfd569370cec6d4371655372356cc6cf2e180883594335757c135f3db6cce95e5bae1acfca6c92c0ef68729b46d1fa4b8433fa5d5d2228abd92b49e6147f7ed6c79a557102517e406b26557d026cf06429a5be840ecc0f0c9b38399357860c3ba23ebbd35b377a3273237eafee8a33997d01d7a0048d532820cea0ddf65d2bed89efb05f2b8b2117a5f4509c71c64e6bfcbcd839d5029f7f1863022e7781486cdd41d58d09c90d7061fd6ddb228dab4c375b32a9d6a83e81c079fffd618f0c4a1ab99de56c7d99dd45b338e4775cd4caab417988a00acac0d787dcd34ac2c205d0db6be0ca2550aeafca5430e6b05557c7240f5eb796decccc213b3879e914108e1bd217a93ccc752e872249072497841967768493d8c505fcba9da5955e7d0aa0ff62e2903057c1409e25a54f3635d020804192bb4d17fd07d876a3139f6744c7ea90ea05bc9d036453f0de25419abc7b02f311946062227bff48a98b285d6f4181ee86701e06bc286cf64c3ff340a967640d89b5bf1e06a783a6215285e9dadc49de5075f12f6bfb3dc887e5a7c2479427e353a5b5c62a3929f1b300347727c6a6d2d07db271936b4aca19bcfb89e77fc32717dae0d50d9f46cdd71ab09fd6bf3d7e7efdfe67b2e7187d6a3c5b223988ca4b3edbccc511586e8cf61896ce58145233c48d218c5afd1b74f1da43059e5da1c2410ed630d5e305d1a870337d3c6499953981c859ec2bf833591d3fbe865cee2ec71aa982dbcda11e56b82346e43e780556a25f5af6d2032b087bcdb7921513d3295593559376c4d59966f295fff082269435430a0badd0de788c697b41f49771e06640038d8ce599e8f30df4d0292c5b8ad13fd18b1de5c031b59f94069a0d6da4b31c273a6e97ddbde2f1ee1556fb2692fca26bf590b672bc9ddc7c6073ca38bec2a42b1a9a301390cd2adc3ff8531a552df713eba4c758819bacaedff07255c71b54a9beae52cdfa083569a08be89949cbba73ddc8acf429359ca5e5be7a673633ca0d9709848f522a9df0e7900045d97c69063c8abbe80bf208fc023c66cf84a260d1244a29ba51bab11c95935e829cb68f3598599886a2678e0bc5d8bc014acdb59ee6ced6e1512f3b470b0447e1fbf0a99c71b3a75294fca86fa131eeaee13c34c17f25f086d8fe890ae87150e68fb124b539378cfe5c27c4a214c6732b00646ae32dde2b3d61af26c28e590e02b07eacfa8f43adcc508f8f2d9114de07f0ecc46ea365db5783c791289d29d3b916cf8ed6c4667e6f2a8a446cc69bb3b86b2bddde404b7577a7ce54877562469c2b1a66f4891e933942aea10a05c968cea7a813bcb4fdae104639fd79a7a0db0e55e5b1be3dea70bd2173116fdf2c71bd6ee80284520ad9b40780d879c45405922fb7ebbe63489b8d4f6e0218c3436307097226cfa7e18cc5443981f22c0a5aba2117915f89c7781c34f61f9f429cb13e0fcd0ce947103be684ca869d7f125f08d27b3f2c21d59adc7ab1b66ded96f0b4fa5f018b80156b7a51ca62b60e2a66e0bc69419ebbf178507907630f24d0862e51bec101037f900323af82e689b116f427584541c8a9a51ac89da1ed78c7f5ec9e52a7f441ad5e1382e083a95224f395dbceb69fd87c859dd1baffa369ebd48248b142cfcb2d0a1df813d178f8147148223312135bd8ae4c3d05d8ab68ca9681d9610e1df08d38a4ebafe8cffc0e04ada33be446d35c93b852f4c97005d2a05dd8d88649523c7e2ae61b5628de504228c73fb9a4cf56ba74dc0e5e8bb192a688bf8e37ec70c92f226fec961e0fa9ae3c06c4eea7b07596e400c8e4790c990da506089f71dc91e02df1aa251a10689d6a0a420fea1727cd8889ab07a277444a1544be2973e64515a013ca8fa7712bb4351a5da9c673fbb2f4df2b44a27222d05be445626d3e41541b3ed43240b251772fef7e28d7575fdb9b69d007f39db3550b6d04d6b835251011db4db96054785aacd20a299721c2cc0ec22fee104a843c866792f2ff7b5ede06819d8190c80ed34e6aa8087073d2f8a17091537319040b7f4c6643ad615d027bca4a275c8d93758721de621dbdfee5f5ddbac4b679c1263883f5454c97be41d40dea172e2594c5e99ff3b2d970a5189e91f2de34fd3a2154b6d674578ed100c1d4e3dd70209128e82dae774e2c6404fe15dffc8903dd81464d706d48a763c3a7a7ddf6ecfef7230 +0x4a86527c19095982e491c56f5fad57593d827683ae08f0ce40b607a49ce25222abb4b96762596e4809574222307e2e47 +63592 +0x999d4df7f8667ff969f27d5a796a5d2516d59741a1debd4d44d766cf86ff6c8e1c00573c02bc1858cb49fb53363ad7f2012187f302529ef373e9578f8e0ecbca5a7767aec42f9c37f196d86cd3aab6cffa8472f7ad259f7c3a731c138a7f44faf80965976346735c82e1feed783f6285a9073e96cbe227af407f9da3a3db3de8a1bf393d0a8a068f2730541e4f8343dcb5b1d415840e9d552e14c28700a8205afb9fcbe9df81bb9a888dc2467dfdc19bc78b1cbfff336b36ab3b7306cb715419aeb403e20ab5fb444cff30af2d35458c869bfedb65d8f81a60fb986929bb41ed6303ca72b4ae2f541c8f869f85b435759beb63b0dd86acc9f45c19f944104f9dc29606df05f2bd939f43ac5fad01fb1fad83318790c4ef0a1066defb44f7e6f37274a172240b0fc97e258b37cea4fd52656952a8a61a29a75c22cfba51f96eb51ca581733a818bbd603d096e1026a5d56ba7ac5b4610c2667f97d57d919d4fac6732902a6eda9b39ee910f4e9a0e5a72664529e8982f221022cdd68b2f6bf1a0fc22b4dee9a0a603d02c861d95e483effe49b096c5feb26deccdbb2d51ebbd59827dd7d9d25a14e4ad13542428318a15dcbd28aff506d844869e6dab20a6199ea24be06152914ca42d5063ab7c7bd6aca8a87b794fcdfd5e9748d34dc3236e380495b7bf91ccb80bf9e999fab84dcf7c0913903dfcdd8a84c8d4d45b62ea25f04f63443bb693bfe1b9e9e058052cdd4ca8054f4224bee57cc1495a1c2784a48c2bbb6f1cea6ec9ed14551f0f8ba268e62d86a0d2edf6780e29af4cd9387855d442a720ac54e63ef8b3373e657136d8103f9e6b33820faa04a90f91dabd4e9f92392e3f311d8287ca3e9624a3e0719593865698ae0991e225e8701367df8fe98cbb58b4f46ccb0a2b5c7bbb10ffd90737acb50f8bab028a388fdab9c8c5c29d8b6e2e673d6a4830e3b5edeaf6f7f897c356c4b9128fec090645556b44996f2257fab740543e8161b9f2f4999bef56ab012e8a7c8bded6c757b3ea1124801ee0b808fc288012fe0677bb98b0481079adb7dc0f413dbf492cf280a094b1a4583f764003050a0b4885e3b7e2184582eb03ae085bf1715bcca0a15580da302da4a75849d6c13a53e648c68fd9b7da6c3417ae5977726fd9e78b2ada90ccec438b8028cc7d42581260b5e7eb86764ff6da4f7f776aae7f62225556b6da522c0c9432ac70fe72ac6f3f361071ef3deb4a6715e80b3c8be91e0666ed92665537b34725adde63377e93093207cc1ef5f88d63d0b2bdf5f3f4341a26b7153abb565e2cc1f2bdb47b15a6491195a21b84bcea54e7a5349ecde9cde6fe7ce8606ed136cc6f45b6f725bacf843a829cecd48087c4c489193f011010f35403b2e054f062ae956c71361db536441796619bcc8b8c3ace2613de76b126c891151cc057fb0a5a9d3095784b4e04100f999a305327223f6d44cb85161436ee1e7ace0a5e395859ed59cac697cd61718a52eeb1539a715a09aae83bc88169eb61fa6fc650f37232efafba27e97974eef08a0628b32da0130a211309743fe749c45ca7fa1771806d09fa0ba3299b660faa09899c5b28d7f2d971f4f50297d78fae6a20b09afbab93a50165423f7b5e5c1e97201632d34080dc62320a5bd1614687ea7fefc1d91a2b2a8d710d1361855eb5fc739d227500447cbb764d6535aff5b6a56fc07452f7bd0066d60b8d95039cd7ff2939135842c6214667c8090ae624a56396299baf67d18f543d44965eff9eed6aeaf2ebc22c8f34c9ae82309a315cbbec9c351e3994f03e1f4ec11406a1ed5d0360d193fce6261b0df283c02bb62360072ae9e535a6a1778eb089f1d31310919331ddf34e991340dadcd4a3069d04fc7ee84fd9eec56da26a0ca4130e7a8fefe1051ff3ff6ddf09f8147cbf730f84f7177d6ee0ab17db257b091b64fe01f3e1b7859d7c598911e02e4183feb9342dba9b924ee3b3c773698950f5caedcdc3cedb586174a216312c450bf246223386abd1cef8cb4ffbbdd65c883a2f2109871e162773c5233bc855061cd081f434173383da737ec7dc42d5bb5af37ae3dbc838309ad95524215dc336192596786169bb775dc7e6639189cc706e27937b6b0c86f1589d0eedef78dda0adf96df6e003a97600fdea6b421a24416bde6231e2de6f210ac7d6c5cea10d0b7e55eeb6d96d66486b1c7126197e46f7fa20ce4d68c35b87575d97f6e661bb3e344001ff75305bb5452c65dd3b3c985ac2f6c1162445b2ece86938c65e3f4d0278c38e1bdbd3ef853636add8d3dc84316c6723d53febdd1864f2a17e5fc42c1ff2e57d5035de897fe840315f07e771469f7cdad3e13d42d37401ba651076c05d49aeb6e7a8da936d0055d9baffe4c75f043ccf5530c44ae5c09d6bc59ae07184252621275e4e7415297a8d30e45bed4542afeaa657075d15efce9ce42487a85b3056a75a7fc2943f09b9350aded44dc002dd140d7c8fe42caa9c350cd7f5cbab0f452ec632be5bb54819b99114d84e97eccf33d1c8e245f398101e83dbb1443c6dfb9fb5a0cb313e8fa3010aafee5894a78c303b628aea2f62313f91574379d6f081e36df1707ea1865df5c0d69fd37ddc1cf493720f39abaf0880807334d44140dee0374c36aaa7d4517efab272271b3288662122f79c2e289bca96590abb44061a805ad9a41d18218782ff6befbd3652d76d2c98cc7a7f75f4031d2e5098a9ea3eaa20c2423fbc1705ea18289efb96e311f3fefc153b673d1b155b1d8bd236935146cf2c98795a5cd59f8d11084a028e3fdfdd775b46ae2816e6994b45d1b4aa5b3bb0412f31bc98ff88a650b41343fb6719123125051ce0ef601ee305fdead665730b298ed0a874898cab0a2abc21d19488e451fbdf780aae6a340b54bea2c075d5280c3dbfe7977d95e36af3af64b9cb169dff653c8c5159eb21ebb97ca21096494e11c56541abe28a97959652d45a16aa8465ec841e5afacd2eadbc9fb36dcdb7c660ad297d55c1520fb69b0f395d7c2ce0a81720f7d098f7a376e58f9d7f2407d9227d75653f21d793f38b4d5a690685faf36f76df593c51c871bdb428efa221cc7fbeb0bf110a006b74ed730027ba9b1a6c7bef9e9dedc3e4c3cb771c654feeea9ef741547285b5de6249ebf33ea257873bc3f3fb46b3354197973e408834547aa8b092ec0b98de35e5281cfb57c6a18b89cfebbff9968f2513aa725d01583cc3c4710a4f844e64b924106ee01a2c626c7e283db2609fb9d95f8b7c3b77c48f0e1bc3114484ac2daf488c49692ede80734155539c23d59ba5a4c2c2a2937e33a3d52d0f94b3bc2262782115603ce4e5e8fbde9445ea411ed00ad8ae5afd9012ca19386c07bb852b19dd593a8beb447713d34c67755ce928a4b854a72a5c0113cb0f6a9165410f311b9fbb20b2e408203bf22536f321d7a267d7be14dc59da1dede04ee476f0631ab1e5cf309fcf38c7aa7ff46888e21375628e9f5f369b221a7ab469ce026d88d023d71ed01953da54a6a33e65fc47a387dd067eef01cbe1f1b8b245b8d0638639b99f2f69e718f8ae78868d9417f791c22066e32c0490208af0036908a978663fbb628a64d2c799bf684f685fa09be50d72d7567e0993e6cd69ce5d2855542fc9704bb827a208c66ebd27582d61daa54f1d81604dd67b3ba26d3caa7e9ca0e9be217f401c1f8286a3c135e467205ddb72678b880135f127f14275d77446049c081629aaaa10dee146baa29473a6cb8e5d991e5702eb9db3a231a06c701a27518e976f7f383fc3df40f195f0babbcdc7f8fa6154b9c326e69d82e6f1dce1b21038ec79463072da8977ae3781a4260b8d2bd47d078c8435c9ca7d6eef1f634cdfee5c7087f972cbe6d439afce9ab12ce8de6d99f8e4f57162116a61eea1689ec898307ccbfb073dfe3fd9265f0222d9e0f90fdeb02ae083bb5b90e674cab850d21eb1c4989ef8d8daa1d7c4bd4542b97e640074b6c40b12dc8e38260b021a0905682471794a0f4581e07bb06fccd975c9088882921c3ec7cb94aa483ab158716a5fd4aaf367122cfbe60d13fdfeafb4cacbf130cd98434a92532e758a3f383108e90898905dca345199d514f0428b1f879681a8eea2e14239b50cd5811483f1e8ef0763d794ff068ae31bdccf02375d0a52820f7da1df57c6a18b8fa9980058105a1a325075794aaeab269222a579175be53a9002fd063243fef4cc8a34790f8a10892d8466ffa7c6d93f5f72931af58039f250061d1e7bb7b68fb3aa4eb4be5efb9c7efad05bc5d954ae6b4533e29e8334f17a116befd92bb0a46d93507b0c92029b4a3a1c534def06bbdd26ef98bb6bc08134a94e40f5a6d47b21cda094a1300ccdbccdb0b0e710d6aede9a2e06f341c4e8a6582eda77300a5cf8dea8c7263f037bf93af6393a45acce952b59f2ef0c276ffaa5748606d13a8e1a50cede43c8ceed2c0954b8ef9570642b60d62557d4d35e5518860a4a924c5aaeab7c9f9fd2556b7bc334f3ad090ab8c7c10e67d2a2affde13acd2eed7a2808dc7519d4e365803d0eeffdb41da8631292d7697f087da393c692b1bc9492b7e0ce380d43b68937aa0e1517c1e77a61bab4295037a26d976a2ca99b7ae9e1df29a97bbfb5c14762fba3beeae2b287edf754402955487a73c83a05f132946f892d98c799f1aca6e979f471dee126d8f0139aa25da2a1ad1ff618301caa3d449e32c1a302c11eafb4692ab65b85ec745054afd955e6560d843cefb285ab8b6904814c9762ebbf69ab166c15c995ac63f703bb6d78e90ea288e1e71193fc26e5a562622b223838dcb7c7e31790da0daecb67e5e42d727275142f27d7ad67b7c0671c2be8a8703110bec3b743181cb85cb6ca56c8de4b2a8d116cd88b3db2e60234f9ce555d5b510ea9530f21c92255759f7236a0f23addf365e121b6aaa65ab4f33f73fba9c041dd61bf133a0cb68b026da8acf5d10833adfad62bdf5c0bbcde8c374460f569a985cd4fed15479e02090ab4e04ee37dd6c5b6931d8ebba9b386e629660ea71c2f0fd44bc23be4a363955ddefb338f606b42835f204c2f47e8b6eb5d048d29a27e8260fabd32498d56ab4e6e252c407b9d2d48845c9f20af0275821a4463e1c33ce658a50384e0248255c5ab85c25b94118ded48f812f6a7aacc93aa4e1a39461243a394bfb80f30909aaadf447c4974726a59f41d2a19f888c107534b3a97f5a7a22b0f175740782783e55089e372e366cd76cff271f16a435fc45e63496596a40ad75e33e8dac5f0165f467d7d3ea895bd2b23a06ee7c484abb313bdd10af2b0848fc83cf345df935dfe0b48d5168da94260364ea961d0f2afbcb98259eed174173b965a01e88eb760abe6117060584764fd5225abc8543672c899d96a79fb97cbc411b4992d9a04264f1e00d885d2192cebbd4dfb8519f7fcbdfceb8b1337c2a8107e73437bca24b7d0fc3f94eec3c7a110bfed21fee7de568528e044244e9db70828be873be7bc1b18c8f32c02f3f9cb55a22da69d8593870666df1d1409cfff9456beeed3b9775a0dca4728282956b3a2ac3611c9bdbd972afd109f4b2e01889d4f9bffac08fa7d99496111ca2f8660e02730eae955048fd7379c513285da5b095c7c432e9cf08ca38f696f4fcb32daf55943ba67161276f75aabbb2fd8037fc2c58940c13dff8d12e288c81fc6022acb8b9507aac88c5471af6466abed23fcaed2ec80ceb2cf8ad08be5a6a2e79d574904515c1a331d312d7ef0d90f8de3dbb7cbca8bbbc4098ac4d1aa9040f8ac69560e9d3e1f1e6b16130f779cc180eb23c4f74ee7f23b5596d6fefc0f61bfd669dcefa13721531e0a0ba920382b8ee2dcbc9f9d1ed9df5ab5ee5905aa6d06c45ec2f087ce8898df16fd951334b37f710f890be2b8da77c1eff429ede9cc931d50f059748cbcb65641d11c7918c31a3fc31283433b5ccd314cd0b7dc54e62e8a484d7292f725752a936f847a6dc228f5003f4fe831c7a753d56b4bf97423a1b34cc38209992c9c0314bf153dba18713acef8b6fa2182cecf91ab2c6cd0ecb33f6739d301fa37f58bcdaa19eb872cbdb7362501a194f70a4c8979a45ef0a72bd79e98aba1a0b04667c516d6ab5d68d4133fae7904118d2272c3bef9f75dbed222fbc6531115fd584204ed95a6c2337ef7f27b634c20ace0eb4960745e9e9770c985ac137ae188f3c293159e0341f5820b55750aa049bc0a5c23495dbc3b9ccd73443232048ab7de8f797839eb5f17a9f67382b52915256970575ffc38bd33b0c94141fad69af4e352befcae86a6ffbb61518bab0f0b50c5cdef8c98fbabc6e27283bfb11999a6c8b36b8b44fb9d1680f3f9793579b4a3e61bf2b67b2c8dbc2c171296a0f40d345659870c4573ccc4bf5572329b8f9687930369c7ebf4ec7d5460f7ac0f90800855ed1a66f715bc72422ec4a0257b3b65962c5ba6317b4e7122f439eb461479898d162d83a30af486cf27f8aa1b622ba3b540d03b95e83e00607ce0398ca9811fc67dc64a9079fc6a2fe81437c46fecabb9e4d16e5e634192d49ff5802b771f32c7caf0a3088b5d842a18233169c708e369c26427d616e18f47067fa769a5db2a59a4b07651689e3e875f2a7f529507b58f82944e4327a55f825986968f5c3d7044b310abb43747ff10673309c7ff6f88f1cc66cbeebe156a4a3f1335e4c3ce6a50a0172b7921e12e8bd545b7102dcac35946e4861f04ba186a602c6cb20315814413cddce84df335c154697174489fd08d9b15681e201bd2a865dc233f439a1deab33ba749e3057b7a8aa61f3c78771655710157323bc1fecef62842d5ace6a708296874e30d9f687d1f04a9b1e4d9fd7b71b13ca47d3206a2ba1ab1ba668085671c5d2cfff14a6494bc8bf718b54dedc5422c00bc0df850ed5ab9583698f021cf3520b5e5b78dd7850944f1bc125b4efd8c7a89c2149b46767d0d1f936abfe2081cbbf9dd88f12919ad3680e4248c88e9f9a4c1feb9a14e07cc1fef1705742fd97835df2f8cfdc21851698ad7136703522fb18fb82594d266eff6ae0c9197720bf2974e22ea390b4a9ce6f8de067528ffd6a9da377ffb395c8d9a46b835b1126631e830ffcb2d6a7737b4b341253c5dba97958cc4f05febb14e149d641a4977b2de306c0e56624866c9dba24899460b491a7c8ca7a047502ddc6b9d5768e709b7a078ea97b45f0ee0fb64ac3b8a1b9b750666c228b63bd098dca72ddb4613303d20c792e20cac22ad7556bb611f417306035b168f5bc3d3b9f9d13436dc56540b05254c3787d2ee95deb9b6038142fdc4bb647023b668c159d9f09cb15337ddeaf89a00dd4d58d860de968469d8a6a077d388b82df0b10240240c4c94d33f33a2a12f961d85c64ad51ff40fdb4bf3c3e6f6d0d6f53027fe36832e2c2783f4befba7ebf63f57a5abbd46db3ea102b3d0daca42b2c39f501d039d5c24b28ce0e6bdb3d7088bec7b63e0fe53f902266d2e1bf7e935df65b7c86e1ca01c7c168b14af6cf9b5486cd3da06ed652847dfaa457126ca4590a9e16541a502fcce487cae9a7b5be3c0ff3277f7bb18b4b954f17da4ffefcb2093585e42e389acf04a3b1e4687057b39cb22a47a1175839daeca3e7b295fb0d54ca3193a7b3d142a4550ca7b39fd66fcfb2ac95997827e3e14bdf0bf4d22daf8fc4a00f018261dc461441c01394d8a51b5d34c5af4498de3af53fb38124133d0cad5792e604dad05c59d7a9f2efdd17f21a39646d0d299d3a713c7ae21c3a2a7dfcdeebafbb9ad369ae64e1fc01322d069240fe4d52388572386bce921b00ec363bac65d9272069f07a4ff479899648ab2de1ffea94644b74b3243b0bb10616d7d2269dfcd819e883561f5e05e9681f627582f5af443b33b48a1c2cd97ec82ed558f3f0853ed5f394ba498b1ba13605ced1aa5c25f20bf2b425ba3065c4b598b1488b0a0cdbe30f972f650845217e9042facebfb91e74fce60e64c24b236ce8fe296246ee2fdf812d2de851fd1aa0435139767d033a04a6dcbcc27ef43b4c940e63f033b3bb1a1ca92e49f4bddd49939c1628308ed519a50ab959a2eb4cd32e8490eb5cf7fe2126adb9006d01e9e90566295a66a660426bf27c70fabb089f1cd3288a2f257983339d46b22763e0fd1d51eb837c047c0d60267eced2cddf1ee37ca37326c6bdcec81a6fc5c05e23045fe1c54a0d0378e9260948b9c7ae30c127039a2ce0462b5258878cb1a44b407d21885f04863df754223d62d845d6be343bfa651dc84e52cc6987361c5fc5c9f616d80159740e77dce9154590d9c1d7c6a6b39cdc6b29b48b7f7be45c6f582fddb43364af531f6ae1ef337979f01a0e170bd1c9df2562d11e0ed83ff83f7cd2b26e3cf17cafcb4111b90a66fa2529d1a3bfd7449ca3a428f2ac4e71866cae5302c9572047e6acbadabb2ca6a7e58bb2db5736c5ab42583cb7bc21417d6357314d3a0479a7943e08ab79fcb0f9bdba324c56629571ade97ccbd3132843b021fdf054e7760244f9eb128a0d0e761a3fc065220d6c8632e289ad65768e8fcf7909aa9e52adfe555aa29e4fd017939776fdc46e79935f7dddb3eb07ddfca83dd6f4da7ae879d251faffad5fe874d8920a4ad88049a273eb35abf31eabfb2377b63fee7f1b7244d73532de2eb8aebba67428100bf0226a0784d2543e82f28809b15b750f6e2fcc31a3ec9f20b31dc3512f261965ff9b885f35b79cdbd57b5c6032c7fcc042eabf1dc19d6efa7a5a761e95b53322ea66755ed2dc2b6b260e0717c515f4364c6bb3d808c5dc0070ed4a5b62662bc7232ba782e6b08e80f7232e9ce2c5d9b5fd0b411d03e644d7393eb6b3ffa931c74c539567ebc534a1cb43297c16484bd3b751cd492d8f67e335c751a4d80f03a7c856d57a5c8acc4214f68e11da2d99140dc7dee8f01183b8e92fa19a85f80fed19ddde46a381a3e656b5c30a98d66ffb82e5ec78f62d46cce5d00d218404b51bd33126396b4a6a0312e97ed2ece32f0e99248c75aa331f939e411ac65cb5a198670923ef1e357d2cdc3a07e740c454a1c31c256b76b38ca1850b40f56a7b440757be7db436e35bd8150ff4d43f0a8f79a3254dc6f62efc7b2c87263b57d61acd27d98a454fc484795fe3dc0632262dda8be86c14a3160d95175d11148f46a47e59d2effec36995950f4e1419b497be691fde16d108093e63b7f5b7fd8b5d6f7f5043056d2c42fdcfb5b7337b50dfcf99b16ec4889f68ed7b90d98162c67ada64cd92610cf4d12b6de5a7b0a7718ecfd10322fbb7d3c5b9513470f3e0eb3f83b30459995ab794bd1411a8221aa0f53dc3678332cb3fa0207915648604441be9eea70104d2ef2e1136cc20fe6169d397d56117f04f4d789147b62cbe297b807b7c28113a01f5ddc66a67babc08268a7c8b7249cac087bfaa61892212ecfc1db6effa02af6486545b1396ddd17b718a4a5a3da108ab78f5ca4b10fd1aab40343abebf7deb76fb023dc6bbf2d547e5639fc605b6508c9bbb8f58e0163c00d274656ccabb64b5de67ece859a23dd9dca6db537ce228d05a61583f78f5fd7a4d4ed57ebe73b1adab05e71ce25481bdc1b48b8705bd08034f97b3534e14e563fb33f9690d1f38daeb6ccac9089237605f1d2ed532cf64b1e5bf3f38c20b8a7a76b44fb0391680aa09fcf6711ed3d57def6143d28661c558b7583a549742331a4a5046f8b5022fa7913708a9b7a1c2431d0158e3634cb0643ef3633b104195cfe0988d87136a8c601bcb6fe74574a47c427ddcac6bc89c60d7011860df921907c3ed720fe6a81d4003fa9a9e4ae4f265fa475d72026e1fdb3a01e84a47ac435e7edf92d7715388e3e47517435a4b12bcceee49f8c9b5813fb286416c0b088b307bdf7e9275e525b827ab747ad63fabcd2ae320852437870aeb0eb25a7c3f873a457d83a556e59a29680e20b9613b143388c68fcb945c87d94dfbc97a2da99db8662a40a486cd5cd4002daa636db5f27c72f8d620ac9d0a0745ede56f91df5547487634049814c4349a8a802d6e48bd04740a9218ef9194217d45948f4b59347386e1ec4a0d5486c79195306bd56bda68066c5238afb2acc46ea3657dbcafb1a98bedd7e958f50b097fee39935587e11394ae74f49f78ba4c7487c6af583b6375d20a65670d8ed776dfe61a5841254793c941a8d1216c534629533688b094b044f3b833478d7a529c1c2d411f3adca464feb63c52c7f5fe3e17a633be58442eb35b87b00f6b5032e5cf144c5ca5165e03bf7ccdfe05ce1180a9e15ca4b1b2452d83e96a232998cee0634b9a85125afafc7615cc476d2d43da7aa51fd05f677a30176dd0274accad286333ca4d0522f1cbdd11b5a360bbfb97e451dbc5a3ec6457607570804154440a695d4a08eff6d8de3ee128a672f2af4581883ef941b96a0009b0d9d29fd82a12c038a85d455f26b0361483d53659d56fcca8a7ef9b4711c66d705a72d8c0d5ee1246539ea7c451fe3d1c55940d6a14734043a51d232de217265490f56e96cdd8da16da5189bee0f4ce792c777aabd2fc66e9c5166bc6617eaede1beed3d2788f821aab1a6db76a5054bb67040087a767bafb764ff7b8f669716d39b39afc7c6e94d2546db636448d8a4393be2185f841b709473e397e4764189298d8468d3fe2acde54a005c405f8b9b240fa704f4c16e5839675b37eab0afeeeb7e1490d39a8148f2a75ded9354e7d77ed6d5f1c1963b10b026af832b7aabec1f55334e4f01b76655433a3fe38eb4014f77b5094f694c3f019a27a42e3dfb2bcffa27cad09b94d01508df79bb75bac0a0da8f7425a3678e32a90bc27b6268540254382dddd0df2e3adc93c4a071c0bd78e7ab5acbad55a54d3da2049b4fba0fc14db09fff086227cda9a0481cea909fdf8650e2caedde2b593d3593156eb90313ccd547bdabe364d4564c2cb648f00fdd9fc834a9cdc9c95f910c9771262dd900baf14e9f212b8d5acbe099f7f3a9b57b1a5979f0b4e02666216f3738dedd3890fd4adb2dd2024964f0a3b665548338c0df4cd9280ae9eb76d5a69bf10092c9cc7e2817f0272f40fcaddfac8ad14541b5d6e97bd836adbf9795f8ec24f31434bb25d52a6f867c1b29eadaa2eed3b97760e8778888a2f44bd249af52591f2b2065db983b3258af82f48fdec117c3a583cbfb4027c0b586362ed911f419ec9f35d386b872c206911c63843130 +0xc55c7d5fedf6c5f93126dd90b6f19720f56f791590d42903c78a778063b93ed5174502c6b76b0d2b75658ce813e867c3 +64384 +0x396d1ae30d314d107565a956d7ec55d02ae9b7dfa3d437d690ce46f784319f9fb46ccdbda10eee88f720b672b5b8b7578fcbdffb914342b30451196295050ba7b41cac553b1944245097d1a68cdd4f7c5db336c9a87445e7b3657e59434572010125be93227ad64a477101daa282a5a55b48c5313290c8da65b07cc4d41a5a1463300c60a05a2c63a6564ff641d0423c5233931c75be53f4e2da1b8b91ab4d48a2e59ca2fbe1cfd833f0c1e2afefada70a1ba870ba276f9df18c6397c221d20585eb78437c36460fb7e4628634066e504ba90d1749f2a33d5c6e5dceafa372b3d5eba8296b821972f9dd37ca1a3d0e9ddd85c9f76a48783ce92710199f5ab3ba5a8c323e10ecd168c3814a97a7bd14f88756e4fa6551750261608561dc6d2083dc772068b29df558db78a2d325ae08c812c46707813422f78bc0c28cac053e7423537a919bbc0dac0a6b4768da38737447795905081a078431f0d183584a97f6f6c946a01172a1cb1802423c0f81db66eb1ac2de402aad0f1997ba2f2763b2721f818e7d5de73a1dcde49a390bb4cb05c952ab79728d9b020c5e83776379174e64225910c7425f0af1ba574618f7c8b9a8c61bbee56a59c3d2ed364252b34ff48e55b04196ac99fa4b2b824a7c725cea4f211a95e3ea70bc33ebda7a3e3ae1ca65c19af8144c6f55a4e0212f804f0e008709b0e6b2356753f70078066d35553ab00f1f1d874b6983c4803fdc6cb366631826e6999b72c6f2e5d517ce28cd34aa39e6479838d00fec73b4e13988c8ed7cca22c396e6ca1600c712bfbab62a0484c6ef1b516f04eaf97924112e1bb62ab165a24fc5db64dde5635f78b26173502f20d1a230740e81109d77d6a36fa5a66bb051930fc269a60881624b9e6fd19d130f35e41e8e175c9ba8563980cabce71374d4965ae200f6d3ebc63f66296b75985ac3ea0106470400636840ad7523770f79d66190845257ad68315df2d76a5f26cb22bbc324c500a99356f512b803dec987fdfa97f08650febf4cac2ac1f5e42528fb5f4a30bad8fc03c76098da84a2a766f16b596ec56a2fb9be34f72e358afd3af5df80724d15637a64882525cd4d13dd5bbcbc46372ba61e2ffd3f6851dc16c9b9424b32a73e45bfd575a2df076774b6e3f3aabf031dccb64910ecb5725fd99dee9095b7efdb099bc12ff851597632b7301a0a2252c80948b174e45ec09dac7d3dd2454a4e7519d6d0bf0dc3ec04b5a9eb38c3b74bb3c69e123111aa621df8324e0f4333ec93dc38ab2ccb7de7986453bb56bfc61766697e125059e381672685c84f77baf0bdba89fa7e19c673bba97f497be597dd695cb159d8a64f44049c3b549ac927837b1b9064bddee8b8f3ebf33daf1d72c64505ff90d1df38d47bc41f99f921c1cc56671692f20429ddcb93783efa4f9efa81ce2f5f43ece4585405f8407367d1f4d506e32c2572d20bc807d6f4656364a0a51e0b6d37b59cf918c68df011839f228161bfd95c102a6974b0d508f7420ce0395c5963b421a7df4e71a752da5d737fe0de7241a1c67b2056f63d22b9d2dee3c6f2e2e8c31a4f317e6d0e0dd6dd95337ce6c30dfb7c0b57f642d5e9b1fc21d1d4476ea56b88da1830228aca0dec4c65dde27be5731a2437ddfa6606e9a91fd2e9c3c542b45191bbedf8e3318870e23d893862700f880ce89288b82069bf1e0c8fceae66a65ebc433c57e0e94e529de40a524057d9ae0b919d5293e0372867aa4dd0f2b94a97a3d7a6a74b9b677bc682e896dd41d9756b5a87c2bfee5dca42d2ab3159e5a7e48da0b250eaeedcd2a43ea96e01d716c3726cd73e03f1e38ff6ad3259ab8fc52ec4c5e8ba868bb43e8141d74173c198826aef15302992cf5dcd6269b1b061ad5b8e6fd04de619f7a9a3b3f976fca66798990acafff7782b1e0d19d99f3003665534c6f372d441adfa53bb9877642f8cef48e67d13364bffb9fffc088cf21df802fdf1d88f16abdf19d9813bab73030e6dbeabb6d4adb55116eb3080e1bf566c4c3319070e75fe95ed7d2e6a7af0cbf5fc4580fdaa265c2b1d19e0c9045f56c91a1c650955b9e3d56087eaae4ca52e4983238ddbfd67e894b6d032695f9ac6175302fe65ceaa01a9593edc8d8958d513e9a1fbd7353a0295c95a4eea58384e5fe12b0ba3df0f0118c1ec2d9199d2675b1807f27aba6552343efd5dd4590095a8abe0b54cf2b28a2a7ed70442e5db8d27f79d994af4b07f7bfd0287adc9bb44fa996824e76e5945e879478a27d33bef816eaa19d14ce53272eeb1f3ff1031025d930d7ffcbbcdd9599a86e7c8ccb9347065789a9728ca1220fa51ca51962a78da8115ef1341d6ef86cadb42ad391e04fdc44d4323f129c88d072c332cc26e4e784bc99bb5673b2f75ef8dc35f8032092e73723cfd10c8fbc1fe885717fec42b40da71ac6997c64030f2e594650bbde80d5b2faeadeb6f54c5c8ae5e9ab2f6b738145549b8393dcbbfbc2bda4740874ca262cbc1bbece87aa04be66f3d44ca9b6ae2bc9b29b369772834a7c08e8957dbf471909cb07afa175a7177b2891d097fde2df0c9446e12ed7541a06bc14df73d0b71c46814fc6cd0fc21ab5005a57b0a9bdb37fc91d200d5aecd600668f32d1bef48b04c6ddc074f8c43c8713a44e7e5a9d5da5c9948fad6d9bf2db70be5c21da9e09c714581933c15be173cae6316b810042010e336ca9800ff50a6338a7eea3f1fd0fe2353d83e9c7ce0daeb68d12ad84f5341f70536c42a7411fd674a282bbcef931c90ba9dfe2b646b7379bddee30a9db9165e1e07026008b7e1308d8a8725372ff3131eac24c95eff2edec8058caed89cb89fe704f9a9a28c7c15bb6aa784dfeaaa34e7cb577f52e533a4f310cdcae7424e42caf7520d2ad6f69e3c9132e0ce0d6a7b7dc33f542866ab52a5c54d68b2f401d02ea6b49489de775379c7d142eedf5a71495b8550c8c8be7145eeb58f21f9f9d07bdbc847a5ec26bdd8d32cb126aaa39db15dd17b1b5393883d51ac481c9b5dca185c362d67472b63c27fea355eb46c871e8fcade0751531ff4b7db9a8b2055466ff1a54eb739afcda091b4d67e47deb8f9bb1980750825bfd2e7e98d56d10bcde764bdb37e08da84d8d2319d6fa921b7a8a766694ec132ee3fab7f2965f6a4e6e87c2763a2fdd30fd40a0a9117225c0c951c58a278c4a137a3c94577a0d74b1ada008b660d60c3f6fa01e6bb5ffcb74026e19732dd599b1f660ae27ef0bb26f026b990c5a579d1c2b47e6e212f7d5bdac5c0cc2164c84830f036ff463bec5df0326fdf87548f26fa694b4acd70ef7062d97f9f78f458cff1aa1543d86bb019a267e920b401ece926802e21c708981d61cae7b73e775359eafa6e573b6650828f2df1fa5594d643cf63f09b15e1c18b5effc0bd7bd4ff0da4490be2771613bf3eed4d1571f4965c7c795961c1e2b1e2e1e2d25837f3a514a600b28d956143f9370dc61a100b745bb52a301bd3f2b24972dae4317bbc8c9578852c009c31265703f724b13ac0b76802de3f7151fb0ae89a4fc0ef4e17feb9a34241e2946d060229112f81f8fba9adecfd4c0945e402e8e0a92c3bb9ec41a8ae9db8dc86fd292131c5af3351a4904ffaef208eb695e271cd51f1bdc3239e8921005b9579c9d8dda47a6b6e4ea4b579b51d83a6adf5f2aae8add71c74a45d8485d2f0b675b85a5e09972cdbf6e16051a3ed3cf931ee7abcb926a501d457c6c3617b40e682b4f9cbe886ba225144d9ff4ec815304a67c1cfc8252513ec24216b3d6313cea9a5fb4ccaaeddea67b567ac3e17d4f3004910099e101dfbc3f4b5a7a1f23115f171a90b35775ddb411d5380f94042e95c7aaf95c250566061adcb9d1690616463014b2db449019ee662e6a209ad27bb65e3e699bc4e98ebcf39ab7523a56c63053d29ddcc8c92db5e6e653bf6c44b11246cfd3e1571aa44147e9d5851991bb9e10d8a4107a8d939b2271b7246ef75919ffe3bab542056123866e96e27d4340fff5ab881ec069b61e9774f7083956fe6e07fe90901c562fd44d8d6de2dbe7f0c650af9c6030ca3fb0b45485c341dffb6efd94f7fa4c797af3fbbadd1ebbfc6591d079638d523b8ae21784f5fe2f1eeaad2f2b536c68ebdcd31f9b76eea40cf9d2f37d7fee9b3a12231faaca11478036993b46355ee829c02237939deb1a76381a1840341c725270046b2a749521a089c3a05a005a50bfbf31b237e48c85e4aad7dd56428f8df12f065888880253fc3eacdcfb66e7291a44b24dfcdd5b8cb4cc8cb1140dc034b2a999864966d134ffefc56f9ebb7dd7c5db043956dac0858317a9122e08470d036a4e62e1a39a6b27f79dc6b88096e34efcb822da7f7406cc06dd9ef8c49c8d500b858ce5c0b66d10f0a680dd48bae212243e88fc3dbe96ec246aa608b5392c44e7ef42da40cda12755701c7196624abbdc07da409828ac800b00d5d27c95604e99ec4313a638ade7b07af819dc1593b8aec4a52c014abe13f5108cea6d39dfd99bfd0c3653afe9ee7c27a23aac5d3374f6c568232b8d4214ad1a69b519bed1725891ecc6fb6bfb882326b9586991c09d5ebaa1da5978ef0e8d9ecad7046d1ba57a6b9329e01549614fd89bf7967bc17e40f4c0962d960b6e011e4ea4bffce4ef5bba6df3b43459e65cbdd89cd5439cb44804630b1a5d3dbfb20953b29ec6e3bc873eeb98da31b3a3c456ddcc88a1d8cbce7a078d9236ec701af0788543538e998739aaade4a5dd16212439eb431efc115ec60cb247db9e3ba6543ba1203b4c12d66b299746093caa0db67b9d77038d417369010d8d83c95edeb50b7ac7e6b294ef23c6d990c458fbc48df137a707f2c8a6e372f3e5f804664e836696acde48ac5bf42109276fc877e00b596e4594c31363b5e0f9e370c5fe505feb79319a74d5876cb69aac73f1ab0acf1295f52284be3460c9a408b684639eaaf8871893dd8d0bfe060282797b018f399b3318399e2583749b76b811d65283e51c64a462d95f44188dd53bd8bb1807eb71ea315295e5eb51d4e6941b22379a9ed586777ffea8ea5cbc875b2a385aef55251fd306027bd68914880f4afe7f6d5892610453c416492b109d42d67956afe733487fbc5a53df9ac8bf9c29d1b656730188cd86b0140b14389b85760477e4421af899fe041a51077001cd202268f0ae71625571492e8aa882e6b581504b06d64aa4a443961bf54f88f304d69703c64b80821eac05c242488e134570e35ca22440d1310596f516e39217f5a5761331daad6c9bbf5c7bec84c8b5a7cd440920acac02c2ec7d12405429c4f2256613edec56865ef3e3b7c3ddb1226f1ee8fd1cefdabddc40bf100c219eae9cdedd8234f12a63db12020282b3e60e0dbe4884e15e6b76efbae35ad4dc8f19582a52eab179879982725de883c7b5bd0653f95d3888bca26fa3707f24d579b9a6904cb9ede60c7c079d4dd65169ced3db4861d26cff6cd4eea2ece986bccce42ab9417c44e707afbd0b5858661a8fd71f3418810912fa92ef21bf1684e3174d370dd7be50dd2789254513fb5c6a872b248f93d59763c440e3b87da279e8d7496df665dc8c38eabcd2c2f71b8eca33649db34a6c928278836ecfaf0a005e9b6d321b7263619aaf9f381d885587da1307ed57d2a284cf85ced2efa9b9a294c22d25d583ff7b6304c4e7ad2e15d1eab48985e59313d8db5a77d291143dcb2bea0dabcd20ed344278b2440a7ef8f79c766e19d5223d19068532c04c6502f4948183466abfd9268989ebefade15b63600729fbbef69ac00184743e8a12a5b96f07229826e73fbcc8a6c64d100bd99fd5b541be0b8699683ce6b09fc2b3a2840c096ff39a0d8d71805df5ded944e0174e2f59d32368c57c191a7c869ebe65ef0c06cfeb2cb93eef412def3752230b6469c3b6cdcf03ab66469e3c6566a97c44df7dd7016760e0806b7526c9133ca8019910fd2046fdc7d115e074dec2eb623006dcf9b8c2ab0edf9fe21116b4e862796ca5a15d339d8727279fba352c1a943b02a2bc93d6ee16473ef342a28fbcb72644e027e70d8985e2fc1a710b1abdaec0637da4050ca09371c9173fff3c2022a2b25f15503d48208f03ff4de3172afe6a99bc348eec6902c9eecc6d7f22c911795580de2b6b3003a5cf9c853f9a092f8435ecd2b3febdf0c9e0816fc4dc0e10148ee406cafff79ba1bf90db932bceaec7989e22f6ac05c9ec7ee49b42d065ab0ecef703d163f5551d647a956034f1f88f522e99e98ce70acbea54948ba8764ec2a64879b14fcfbc735e9867395e099955f34c9bef09b83fc2e35fc001bca687caa546ccfd1bdd5e4dfe98a5710f7bfda5ec46cd89bb1fe58bda74c237958cc2913c70721740a4a707d4e9f4c9b1dfb219bdcb933c0984786130220fbfbb7fabb0dc540d8256bc232b621ac985ed8b430be83981988d6c84ed94e5fceca7158fa4257ff3e0e69a5f33369988482b353d06ec2f1d01bf5e87ab793f3e50d0e50ad57842c99548b5c7b9b2e4d582f333ec953a0aca1a07d0ed054dac388ed14499ef755af32225a4d929779b25c8ce2dee31625b2d43ff4a41a592ab7fe920dab93c8d070519e5de100cf51afd8c2479be65f59e9b122e4111e6d8cb7912380dd5572ff583ef01c808ceabe2c13f8eade99d5453a806ed4bda53907ab87c8f649ac9eea4d40411f930091c8115657540dc521f08d884e4d107665a37b29abf6565ff49838a0b9ef80226b7846e9070c9232eb62cb12e8d6725b986810bff1086c381b1102a77f13b1bb21d5b4142f9ad3a8daa4da6664f74b1a7a5f5091c5b4f3fdbc5d919abc138c925ae7411ff8873aef96bda4cceb38037cb48f24e64d8353777e85cfc497787b71bfb7d651895a2dcec8b5108ca5220249ee017408b1fcf56e0a90a36c39c8e51ef74c5cf30b9b160f189505edb93cb049cfbb293d1aa83faa0786f4d9c98e3262abafb94da5d35c782d646d384f0e764300c729ceb00d9af21e6fac54704fc90583e6d7a7808967d2b02a2fb69121ba01292d5e039ab56f0ff754b225569514cf26fb9c49c3459fe448ef33aca5fce549f1f3af23012824ca393cee94a2e77a883df5f27a978f6c789ebc6165b32860e4002303780cec23e98c3048e97dce63f76fddc08424f036545998a128e42b929affc44448e48bd2349a37a86b0ed137e565baeead91ef6541228cdb3c5f8fe23296df59dcb08d9b750859f6637e785f1ac794633e07156107a19ff7ea4ddbba766c7b2a7c9978e572819e1a19f44b415e3c74097eade8926e7dd9dd7ad698812c2aa09f6fc7d617f4ab0ffcd599d346796c61c7b7acf2613e5f427534214d9e1d7756a0ff612e9bc32eb385df9497d6320063852f2bbb343eeee3a85f57827b11fca615728f09d8a7b3939b7e0e1f5a52a0822b3053c97437d3c35c459fc07fd06197e6117bee3668e2b527fc2ff438a2f3c7a2004ba68af2b5ea7a2c228d12214d32fb244a651dcd6223129f1e9ddae7a239d0e73cdadc343d61eb5d08749ccd687e3cf327f6f5a0dce542b004a2a6ec54e09e2f4eebd4c8132f952078fa859d5b8392c5382a26a7f701a176088c0678b2c5f41ea863d975de5c62bd9aa93656ce49e3e4a58818ab5c81163b53e2615264efbbfe73ca520246f1397b970815c368d9199697993473b26c88450c2c1f431166d915d6a6a938f5f501a3979f8babd23a1a2436e3e0c9a2cbe1de5cf3a713613338acfa8145df9070a47dc1f701d5b474d0d6a9f08573d4a5084c6bbd638afe5dbe0a07e28ebfc26b09513e97dd0ab49021f319488c3aef02e5d76015ba6f8dec55792452ec9f30ec1867360788127d95f7c5ad715be69ceb60c96480148cb9e9e43f7958c74885feb906d0d06bb5b58b39928ef55c3f826661689e88d9a7275b53a52f7c878367a6d4783479edbb057acfa3e35cf60c4a7ed0fe37b47289824a8af36e4694167fee51038b8a75eb146ba040d52c90179b3895d1568c45fa70bf70715d3f57c974dd18f0fd8c6d0e8b6596b08cef94261e9e98292499bbc299c0ef6725ee3666ee7b1287b1063cec1171983d2f2c69027ab7c250c9623da8a758ee1ceddb9ab397d1250fd0804a4d4f968f2de66c7773588bf98d6c7031753f8c56d9de8fec7a14e63ad28182fff9ecdc61c9db36264160232627354900f10b660de62091928110c33a16ed95c3b7914bf7593312de33398632674d7713e4b3edfc8bda69f691316e0b243b40fe51e6ec3925198807128cbc0395dc82d116df290b1035a07e711ff19744940c188d92c60f74b32109a600ce83f909f0a14f362323bc58bd94eb8354c4bd208079343ee1629029644cb73ec398dafd4bed5660e22ad86b489fc5059d7cd90624890e914618bfa4da390deda32c82e01a1cf4066e0aac98ca07c84cd6a6de6f80b1e234fc1b4a4c09366fb6772637d9e696f1d0d0a98005ca33bc01062a15821d577ace0b5179487baca741466e421036c215650ff19cdad08d69cb36f0c66882e59c087ca493c1b8047b3518ecebae920a276e33c84740647c96536ddf394837c1118a56fbe2de46a4b43bf58879db82d5f1924518cb5f0f680d41b3e1b54bc555a0fba13dacc8aff61afae62a36be8f8c397a4cc86e5e58b9943c10dd8499b307130466543aa67b60741bf2ba68804095c8cd50c07965c8d8f4ec8dbcec598941314cac27d4a1304c8c45222058481e5966345ae8349ee52bf5fa316436b4d06ac17c7b9ec1e1582128217d444e3fb040da577028e62f3a1b5e0e05bea9d10fe98c3bdba14b8d7a4711560b0e918d7eb3eedd9d68d8404c11f9cf0fb28fd9ce285a32d518b8cd1f260f8dd4676b591018686fe69053faa5738ce659292ef3958ef20870eb51cbce26e96ee13522cbefd811b455889d84ccaae0faeb09d048ed831e66b5035eac0faf69a03962ff0da25cb155f138fe07491fbdb4cb3cbbff5d6fa4f4aa46279b6a2955cce4d44a44b10b10f9c288c0aba539eabc03a837416ebb4d59599df3be68fc7699eb754b9ba54cf549d1612a97675f31b99b378e36a6cde13ecaf00c3d909094b0552b4a3804892aec25a983f417fb585499d00605900e284a0428b8416b4d77b82ae08e435929758bc64a14e93d742834075ae9d7b1e6ea260f2b40f27f9ce65a727b60e529949fcebd2a259f62326901ecbf7dd393beee79f3e3ec7757e3aa3e36e40845fe31705c1133fd3e0d9de36551e60b22bdfcfdecb83703f9788b8b0b7e03ce8d5f6aafdeca4be6edc71d5d063db7daebb70adf27670ecf9f6cfd516a50c0f9e2d5a626fbf15c26d4171aa18cb81a34570a4e5cd108529692baa0c402b603d36ee74e9b5c8d4d061c85fc75a0cbf75f8e3d323b92a1eaa1f9eadbac7cb7b4a2591dc8d7a9a606ceed992ba2ea7c36a4b7d81c46143cbe38fd8418d07f5bbbafcbff7da289456fc66edc0ff011d5bf4bfa637643fce0b6a2c611bef9b4ab0042eb16d5c3a4707036c8d51026bede7a9c8067a7fbf596ba297b1935efc2ae6ba3e1e93904a332f165220d970e989e50df716c1736a565b2134422e47a536de519d6000f2b2e90da9ca50a0a6e481d275bf5f82ebcb45586a94ab635620cee54edf2e4c001ec9413237956d30f7563e95932955454cb6e1e33b55c8f6e973ba2685c1cb54e86458442c57958b9c8797c2153caf1c892b962f9ad9d5a689c5cb5cf3d3055daa3ab1641b1f90333e866cafb7e1f6ddeb03d3b4259ffff16c257776dbca9076ceccfaf6767603b477f32b92fdc1d305fce028f58e10ce440b236ce89020e35ce09b838fd0c3567bb32e63304944ba212931148816e4c72b01401a46a36e746c6a16e9a4bcb01f158ab881fc3ce322cc1a8714c062846112d8fbee05981bda21d5cfabb99ca4b40e6922364b5b4583432b42a852f36822a7ecb776a9e0b16b19be463852f319bbc2d8ebcec1f6b47242e6045d943c088236c71332a81fb7dda07deb1df542979cdf4485d9e4c1e87627d54c9328cf0e166bf29fb084a7977882af5edb052da6edb05680d6283f39e58e737be7750ec14593f9ad6ec40af8e20cdcf1ee26f6b014e2695d5200b12166c34b12d90d8dca966b36dccbeacc3490bb6144c5cf404bb8e2077bbc02da477082b6c1d646ce928f4e549e566d6dd30b1ae6d7f0629cf2303bbb7ca2b31d14793960d96dd533b1a6a9bd72acc0626cc7a7c82c0c855f1c116befd07475fc010753b3fa0e2d7f907329ebfa2d884c5a4cfeafa168ac1951d2df3f07cfdfe9a5915e2a8445c3e4b75b3b6a8557397e34116be7d8a34b6e1c0b2203930365886abdd55f08931d15aee55aa3a4c8389a829b9c1b523ae7afd310b0e802bd8b3ad8d345bc0784ad84ef980441e8ef1a03be61ebb47e9e05512f8a2856c76cc58378782bbc0178f9b4f1f9c4afc23a625c500af74dee4b391489edd4da518fb8f4b21303e9770e86183e611857b14895f6dfdd2b3201d0d75c6aa262dd4194ca011e4a4aced8b3e7415d948bd446881985c67f142b59bd848b5a4e4eea182a6d2b25747cd6c6e771a2b7da7baff277816b9c573e74666fa533c147e58b35af36e56038168ba237d9cee5c9743535a5523ada0c06b7b875dde84835e33b3a91abc246ebb477fb2364285fd8122e8080005607f4095fb05e730b579eb474877030445225b3064218c5318e8cb1d67396004f9ea5b2f6fe88293f67c8d5c1bcd968ee1a7cbec107a6619d1a6dffd78f55f6aa16979ff7e39154d6f16ac39d3b2bba11f8371432dc5abdad6be2389c245e47d7f8502cfd1ff87a749ceb0a7192f5a872740b7fc600845df4fb8018bee30d887bcc55e650f42c2e9ac2c026e954b5b86226504e1534d1b70651de0c9a3bf21ce7fb2f589e10aad5bbfb90856ee0ea6e7387bbfb8ae9b15d43f73270d8af9a89bf1d22f05ef603045abfc2b27cd8023f29009524a18fb1b550745401d4be6553539b075a0e04b33ee977ed3a8d9aabbee5397245f3a731539e21892c18d8e11e681d12d215dd49e9facc569a2bb935425a8ae9dbfbc0eebc9fa7685c3f8fac2f4eebfc1510d0259a0125b53dd1a43d7ddb8d5253145d1864d77e681ea353151a8aa0197f899dd4d39f0c8fb219fc32d5faa94247e7dc6cc0d81f1eefdec3ba74add1f19dea86d60b26e92c736f21a3cf3a773026e0ef4a6503e1d34c5c421aa22aea1adcae3bb7b52b64321e3ba50eee0d7fb27c99d63fc60d9f5bb0a66ea44774610bd85f1ce8762ed6270f19f6e2a7061b3fc57d51cb78378feec937a9e5c93cdf4b0d87cae6a2a3e781c294b7bd7e96e23e7e05b26bd0244c22d2aa746dabc6ad3ee8829640ef2cf0c8d +0x13189ce20ec85fa2c86f0c51fa9de0d0678e6ab13aba4ef0856b37b2daff99b5530b258901b6297c68d542513082c115 +65176 +0x44bc2dba269c39d3638eace048f7670fde0dd7e71d3ccad05dc981d60db506aaa7e4c0e9e37e44a12c966e125009b1b17ba9ab73669bfc47ccfe59e41ecddcc677079e73d20d88037b4b66dfc31a3dc9f8e5df1d948bbc56b505fbd3cd49cadc9b6ef2e05a10ae0038f6bdd209f2b65e3d099c6d0fd4b2040026902b84f077f2fb61e2b6e2515da14bdf9a708a59c279325d09ec403e855995a94072aa898c137f27967fd4963eed9c4e2643af170921bf294f218d91de5d5cd63232a6ddb0440f0a37c297a8f9ec138b89d2def3345eccb495945f9464193ef58ff2e2b48c8f9350ed08934f35a699ddeaa580b7eb38414704ce1f10c094214d7e3bc5d5c7fbf342dfd830529a24148e7145fe29d5b8062ac45633ce99d6ef272894b70a0a90172836bad67bd16d6ee44839be129be503a5fcb4059398e88ecbb5852019fd57e74a1936ed9082898d2894092a39e5c82100d471fb2a65d1e8814c9669cb47574cefb1d5dd5a55815ba1803ea9685a67468275147f5aa799e3911550f8e891992c61261e0ea1f05cbe99315fa265a2cc5b740725f8ea06496942393a3638822371e69f9ae92dfe22a056d2f47ff966ff491eb12dcea32ce861dee0dd8b82c3ff01c744cfd4c525dbe8218985a7ec4e06f6c89cb3684dbe7eb2ab31bf6090fb35c64c3e4738330d907e427e9b820601eb4cbaf03f30b0671446f2556a1b28d3cba6bcb58a7e3d5f494a01dbbd780f28b6323bd4598d93cdb004fa74662613f3cb8b61d01e0cacc30c33a6c574f1ce6a6d8f95708ae7bf985dd40db439e719023c5c81b88d4c47e0e324786647550c701a4d0eed59a7fd71209e71406dc801a9270165955fa4d85fd502c0e6be0c91e1c453ef734f331300034a6f3e8a2f958f9361558e1a7e25e7eab6c76d617e256674898029f2f4c9ec0dc14fd716869b5d886698cb4841f8212b28d222b91490a731d70838cd52e9dd46e959329b34dcba0ff77875705517b59f402c2d4d34994b0325d1c865b6397db7abd578a0a1204f2efc3bb41b224a4a4fe71cb7a5470afbf25b21004486837167f00ad0ae352fc3ef5e2aafd0105b884103e9e84ab6a95e07614108f12c8d645e9e41634c58d0bf5a038d8f178710197f7ddce7c3e83f1d491f7909f40e20fca59ec2580272cdeb76d4ac7b78ef33a2113e3ddd984493dfc17e102bd69603e143d9d5d858ebecee4bb9ce9c7cb08acefd2d54f152346f4d756450951e2a00bc4036c20bd72bf671e19b3d1aaa32de424d31684c781e990e6fba7f705434dd35a59cd018069ab21b41603f1c8bddf6a90934c215926cdacbb769e6e3001b63f379f548286da1ea9572f21dcaa51a9ca9371dab752985fa2c5358cd17ab475a9fc428726295a664867c371f4d834f96eae1d46994c4d1c1d84d6e7b33dc208ae08f1d96ef0513e99768198ccdaae6ad150e404499ebb8f778ad953a601c0eba5fe1bcfcf6454e41703d7fae71a445a9d2c74b86ac26a263b379b450c6f279b4c4c2edeca0dec134b80350cb62f7d652c813dc75f7fef7ce32bbb2068ce6c93eb63a98ad1557d28a17c2762cc82eff70a0fadc5b9ffa1f009d7a79a4db806621dd52a5887c38eb0a3783d819cace2aca0284317ecfa383c19bbff072da49b825e211fcc5fd0a737ebd4d5ed99061be2994bac427ad7f89d9d491ffb8b2c828116d8085acc254d2ac5429f0b6436f235501a37d9d61189a0ff1f88ebd8a851caf25a52984f09e6f5ca21e76f60b7ec016ef47442a14f61f2c9afc85ca8b09fdc5b38ace97b271b4584f34d8e20f18ff3407af0214ee9f7ef976a6cc27dcdb341cbe375d2b2e5308670473fec278c44776f0e29da4169d213b2efd4c1ca784277cefb2bf898ccfd35069e4d1de6d0b01a552e8ff22b5786ebd6909ebf1118a40acee05daf9f56a7edc258e377d17739389d7ca0ed6f2b6cf46d0d392ed4477e676623898c291ae6fd3e17a19e99e8666ea258fb407f6e1ab9d0b622a5968d280a0f451e02e87220ffd44ae606829cce290e43fd8ffe880698bc1bf997da42478f34b5a9983004ec621f734f243e0cc6f43bde36204f11c73d89af0c9a121f43537105aad0a23bbfd09a114b9c2ec0e76ca5782395f393c304c40ffa00d07ca1f34ea5a030b19f01a7beb549c2c751a5dee5c244758e76808ae58f308087d2e9eb1826183ce097587407cfe82cba2798e7771d17336242963c88dd5e8dcaba91a787f77159a1cd3aa20fe1955e59cb26f2d4092a5431705a96084ac27cfbac2fb4f8aa4a1b97991ede216aefcc38b4d6ad7716ec5c5e986423fe880af2ad202a9ff4bf10f714a37b7506ec45fad96d2e63fac6ebc05c134972d5f5a67351af08d506965470bb44e6f30ae6366eae5ca4b2b9899704bc8960ef291413737bb140d098d0932cee15d7f4b7e93f9c4a1bd0064ddf7cadf25341055283d077addf692f45ee3b604f9ec4e69845d0081f2316fb22490b2080196061fc956bf44a61f85d785febcf3238344526bc8636affb0ffdc156d110f844556181e9548de41164c7ba95f2de588abc9cdd9dd0ac7f1c118ac5795cd3cd5c86a08cf018890d46351a87310ef2050eb45a377a3dde0efed22e89310d0d71da7a8b784a268a1888ffa258a18eceda2cc209cec22c5fc22ba855970e70028836b7aede481d05b8421b1bc987f0a93a6d5c280e062a865b2b2aac797214777309b477197a5a904f1a1dd33424d335c868e9417fd6c7061c65df7faafc68c0b4cbf760c4617d9e5f697e553328b4e8e677ffc29e84703398642d5b961dfb72dfe5f718699dd4a46bc8c33e4104143727431637d4cfb4b351be9adcd5572af256e049fa73701e26f6a082eae8375fa50d22b32dccf912e9caddae5ff328a5e3bc5356836c98a8ba729913e7834315a70acf5cf0e191096b8639ee715a02cabb72b7b34fdf6812c3721b1cb0ccb7c4d192818a4dbd3806acf66bc19d749627ee0c75d6bc267edad6779ef3d30ef5fbb946e1b170ba5e9922adebce50fd233bfffc263754ec3d6f57f5ad3fdad48e08a2aa78692653654f511f227b283e6a8565c4315bb69b345eec7ebe6714b7f0aa320fbe27cb22fc87dcbca83e7fc2bc72c3f73fca3dadf407f8755af02d13ce2eec191b53dba374e11a28f5bee42499a27f07a9f966beed29006bfb7180926725354928a3d45f7ed99dc69342e1de92930b67f86fde289000a8d52841cb9e6c1bb2025e6e31b17adfec27f980f55b37a30dbaa3a3e0857d4d36435a074aa24d70c6e735399033e96269cfa0ef9b14e980da52442c3a50155d4d391938aa487bd3086a458c7c714b1fab2011f54fb6388b15d1526f2812e8bf5228ee3c56fb77a0db0df7ed32d4305624bbd5188f99953024aa56f3563877f1f98531a8cd25d168d344c4b26fe709a47b1562ffd749902eab6faa4f315b338387e09bf4996219a97591449280145798f2af33e1c330a9d50e73f4d935d5bbe291cd75b6383aa0d12695f0041006aa924ffbc084b00952a1b269af37f04271adbbae6754261a177e8aa54f7dac18732ec78da14f3a1e2b335bb331d1ed2be5335a05e954ef8ade000651cb6590e431dd1dc75ea7ddf983f85ee3353d88ec9711e166644ef10775142e1dec528ad4671ba75b4134f825fd7f307c21d1502ef7d806326088d70a6d19668c3adad6639368e89c016d352e182674d07043df4d97e42d0c76c90e1e369e440f3f55203c4753761c17b7017c348c9092b8fb82d2f7c4ca571f5602bd62014b295257e4a8e359c45decb8d98b03101845547ef759880862a4b2d651626fe0e06d2c59805407ea57c3f8d949e4e46f803aeb24893bc90d8a67e9b076a7c0bba84d15e0afa81583a500d49ecf1458e94d15e5a2c5144b72a6331c7afee7f500174bb773bf2facc43077087fd593e11be358cc70475d8fa64a78d3ac36bd8d4c91db79993b453e1a8ea8fd02f9ee1d85f76617f36c81f636ebbba7bada92e9ffcc8ee4b7a0a33a0514193abea87d5ea5ddd040c2c12c2f930e7df12d3702aba80bd871558ba420f2754a3a196ddc350a2b29df64c1b68c4927225889f88742c3f44ab7f958d2939106ae8399b685210143d56c300aabacd7da6b36477b8b3fd1fa58212994b9023f5cd8afb61f02b349dc555fdaf89601bd7c9b22ec5c98f360a273355cdbc1ed7bfc3b06f513df5c32494c22bc07e01b68a24496ff084b2dee713e7d197a77c5c5495821ed11659c690f0c6d69d5245a77cffa1ad60aec1fd9eb1c50c60d652ba9e8b298f4a45ff44cb228985adcdd6f597a2e1737d12679c1649f690910f47f984eccd4a25908e45bc7132c058b659a8c1543246af774ac13923a1e5901b0322ed0295d8c8c0afd24b27e91006d779c9e45ebcb05ea41277ee87ef91c7c22f3dc313aac09d9d09f1608bd8fb1ff6dc5fe708a638f26268c31dbc081e9ccb7350ed68348a0aee45ade3e4240b0bdc2a72b29a1967d379f4afae0b13147900766553495abf797d0a0bbc7bf8c833510c0b2d5c3cc369b15d428abc38f9c527e183ddfd44e651100115d4987ab9fd1c2930409638d61dd24b849717a157e8095bb373ce1b87fa70d1d21182d266d2072becd38f342855a3687ebe6373b54a6e8dfcfd02072adc65234a5c8329571bd8b744ce90593f7aed5937e8ead99c531e1e6663e22f585fb69f869ee1a7153e58784219e1cea5f578c9b7fbf2f9936be0b7f98db6bc98eb2dec8dbde57327a54f13ed9ccabce22c0c5e07e1c4fb22fa7d00be63c6d573e890b367a3d7b615b685334d40934b7c8971c02e80a808d168bea0bcce59a370bea89b1d36ff9768dbc17e6beb83a2fd736e9834c2e548291d6840fbb4b94e17d53d4db660a43fa77bcd9c4e86e3eaed52cd8e228dc5e2b181468784ff2cfdf09517703a0710d55afd6f36fefafb4ad28d5449ffcb8efef1fc1f1e5e95fbd88467fdadb215898209cb70f4842d13eb368ecc72d36389c672f7baac91606e085ab1b8ac2571586e3d4c977de70973f5a0bcfcb0a73dfe60bbd8e0da2646ccb5fadc11149b03c5c07de8ae7a2f75638f997faeac824135f45509595024315f06ed51cd8e1cb317a152077b9265582ae1a83fa80e6c5775abc6f0edb593086d24ba77b7c1b16998384311c86e909c11145564b37d6d6708ac98f764b27cb33f37e9b59656610d8eaed86e5bb5b8286050285697a18e593420528585eee6191d66037531f43587422a9987fc10e5e45fbcaa7e1c23d615422f7d011912d9244ed98f1e514433bffcd50fc2752720b8558162420aab4e837a00a0d5e8c55dbb1cb91518beed659e04d6c1888da1708c8cc6d80b28e0fc8c23bc4368bab07bc6cd2e1dca4098d30aa15637420b27de484ab495423f6bea16868aef22577a3a2eaa5f309e9fed84ec1c7dfa56b86071d4d873204d17f3200aec932a6b87cca3d9fb75d5fba293802dbd72912e5cf531187e2a01967821a4519bff7fab114ebcb0089795491333cfb3cc5e8430bf8d26fd8302c1832a9d80d1dcf5734abea78f9b18eef7f1b8747a6891685cc6a8d159693122e77ef40ebc74f69d90b05680248375a2835959ff873354b9a057e068d145ceb2fbeea01d5e2133205d46a180814e65dac1eac07b01fb5c78d84a30fc967aa3dc863bf47170c0d9a662726650b0e631be3a0cb491edaaf2ce8d095e32b1eff8c60fccb9b3f9383156289d6f97b93121777528fce955275ee345fb32b4298b15981e0bb68a02738359363082fea2197c2dfaa4612a405ae8de8b88762a0638417b3b5fb59f925817d71491682d75858c0752eaabfdb72bd8e8e418f03b51ddc597ef307c99b1cf34f74b2ae9cb3a5c972e0460a209c1827528da1369901161e913c1e7d52167c023e16262cc80f788e6ca98700df7664708c7f4e2aad14eaef5173aea86dfbd132dbee1a0dbf6b6f0c1029781b66eae62d9ecbbeb78a510ab31cde0a2577abab098b6514edcd27e7c6ffe88fa6317a2bb30c0b5979eb46040e55b3e77129b6780acf039d398bf58143ae7f345dd9a493b556b6c4ee2a7455558e9d9d27de9ca69b3952197d7634aa068e560c9ec9eacc88f1468790e26c8d2d3a03b19620dee54f3cc910260665f08421f58ee57cbd14b28e32f7ee8d8f09f9ea7ebb687aed82ab5be127cfd719c3410be621ce8cac2ad66014bc73966c5a50127710fb47592d141922b6d742c0b0d1ae907bb654387d4929644bac8774fca4448568eb3092333df71653d8e3eb379a7c9ce3397dd26aaf3c9a0c15fb497f7ae3121994b149337d783475413509c6101863fed4641a916d3c3e943c4c5a415880b5a9a433beac470ef591acb09cfae6e47e24f3a1717ff78aca6a8c0517e0a1afd89f8642831c4f4de23f87e125346373440c23a06794f2bab60571b002ec0ac30371b7683701ea9772e54f3123013a476e0af10b6d6ed34e89eba9d7cbb1d86cceb6b41f3adbad8e30197f3b26ffcfc354a7c82d036c1db8ce8380e6a2d0bf0f82e508c21f280c849242a469a17e88998079359fca2b368bfc63935758d7131dc873221b54658c3d22073b47130c191c89e5a5ce120ab22a8c125db43e23692a17e79c656b22a0fa67cdc05dfc36e5ded973b5528bb9153706065c87c34445b6f9b8d44ac3cdef5ecc0cc008ed6d7352e7b9c0a78784d413e2c5fc4c98b82d46d67d66260ef5cbdcd75ab6e2374e460b3d1e7457a61c7343bac7c97d2f0d844c469bdea1ad08caf7022e01749a27d28a52183ccd67de8768f6824083e6a2ef59b29a8a281e95613fe4fd5c3a66a8ad32cf4d86733d4964e61e8c0e1b5026c2d1b3000543e41a3309e84f13ae2d3f3aa6fd04ee0396fba03d9b5b6e8e1bf7b356c052ec6f9e0594f794a9c43a6e5a0f597404dfe91553dde215670e667a94155b53198c159cf62b8b6283ea89aa979fccbc93d88e38e05275e5354a2f2c8a7d41f3aa80c0615a4b37ea73f2f6526670634f58647d623fc26bb35cce6282595fcd1aac571a9ba0988f94d08a1af65505df94b9003131b09225e823f78b1c7f413f30856b6eac7787e4ea5ffc5226c1e474453c483427e13656fc5152136b6aa62afddc5a47043d8dea6348d656445b70d3a9688910a5504351783b5a95ffba1312bb07903e43613f028841a471df805f7059b45f313a7c3db7d4689d8d39dbfc88f09da9beda810fcfd1c0f34f68bee4ccdea6472067c389fcb95f8763ba4ee6e0470503334a2b74a4c84d2f496085c56b90c4bd68bdc4bc826f96a4a3e19156cb26e4395602bf0223e45cd4fa776365bf28864e749d0e4a0b8f9471d85031c0ac08a1b871a4ca3cbfbe6670dcede64a4a0e6166de95feb6da91df8b7b76aea90564d40d20a0cb88eaaef07f5b547cd79e9afc82f1292487821ede3e07d5669469e3e1b3ed77317b373e817d104b95b21f86ae4f66d70e30947f271607fd08074bde512922a89a9827f5afe67633df5e6f39fd18aa201a46743b30afe64df1761deca8e98aa575442f6cd247f78d9830e03d7f7b3584d74dc3eb81783d58c17562776f81600e4013d00c7f1e3ee97eee24f98be39375d39ae608afeb879de669bc070b6d5d33899b9c3d2cd5a6b7f1caa006d8ee3e938dd26d0b02962f9dded78d240329dcc5c02ff6a7520ab9798f6ae3ddbcf7a13e6468cb7b2fe4cfc919435856fd235935726571b39529f1cea64352f6ce9c760705e283c19e73d2b03441900840067cf31eb08fea4cbfe9f7d4f89fda7448f75dd0b41886c4bfc2e3ae36d6c0723f928f33b5c3d40f390cb5a9df0d014489dfd353721c2339252ac3e5a79f080a2b448a4fd99fd95331c458838b3d03c5eb89e80c90e13f723074d189285b578e760d44c19086929f16cb80f061a24a6eca700c7a951a33e68e3bacf72d9e37759c577f376f1a6879646caf8f16cf5da5c33cc12bf329993c8ae9b6be1bda10360aad7a2fe9cdf348b73234ae0f36a611424aa67f3f81d7bab2f97f5c97817a664d99c6198503ab937bb6c0dbaf5acc27e4241d02ded5980792f577411536ee7cd186f362c57df9f01e54d4969bbe28500543a54555772299b7683f0a196ce4e0430f82ba3f7f76e53bb6d07d48d353304243cfb537f93fe77ccc27161895e646fe9de47e379aaac9403754fe3b2cd53f178f0ce0fade28876f9bc00397347b0770ac992d5251fe32b860c277e74d16d2f19fed47129874e00c41aa4119eb0bb845d631561427f9a820cdb998d196a0a26cf0d16623aabd97ef68466d150c20bffa851d7701af15a005d8aacf8eabfb13e61c59ac82976af5657a14c61d2a52a4eb43ee0e8f39eaa0d40c068a72ff9eadf99d06a8d3f0f5af2af1a61a96c80a0db49d039b316ae12117e25d683303f3d713dd38e97c19f62b8c696aa91657bf30d2eafe9b7cb481a74df62fd7234ba335c16790cd0fa4d4d1264be310207c0ad4b2d84f8de59944b9f2b1fe65d85915308ec67ee1e3142a567503afde2987455ff0cf76f0e0abb2cf82a03972d69ed25dd87483c6bada5f11f53b1161b61c2749094af553124e546e8a4b71ac829f63244aec2fc9eb79fbaa235cc8593aad091668d55b22ef0391fd860e377180dd301a32b7d389f97588757be325134bbc634e9bf908fedb6e0412e272eb4045cad1b63c422f75695f7e0a8b58b82e4dbcde681f209f356be023454c140db7360ab06ed425942abf9a54dfce481218d530d2d96ed68e6514fc57eb0f6c2f34f5ff64ca86cc920860a8957bc11ba34166cad9490795470c6b254a9ac8e5c057fa2b574fb0c1b99cf11cc854e05dec6676bd5a0d75e759a9d30d53dae50b518eb71110750e8f7b56e5695601b8896dc689bafdbd364746bbe0f71c0200576347b14328c0eca037d4b210d6f8b628a80014360ccec52f9ec11974fbc6975466117d23f8b9c78eaf84eba5b3a075a61b91aaa13fb8bf2ab237f1298b8f168cea8a7f4618d64ba522e6068a949f539c3909b19eef1160a331aeec6733d20a6b61013c2bf19cd5ae42867751c25bec75a0b6cd81935f76338d947fc09d25ef6a5a2438482b73f1e47ed4c27de55cbcccb35752fbd4f94c5636673fc81ff132243651f82d1ef22d02385f8c717618310c1139f6602c857f85ccb590e044ca7f039619004d54adf3622f9529ceed24d5ae2afd0c40f27a7c3ca10e07aba4282292f9e7c51b54fdc19ea5041f08c2e9374d610f1920df4ebef563bf287ca680c95cc25cdb29a8782402392af091900bc24463eeb1923b88d44a756767f5d46aefbb9fd696fac78397576c88330bccd3033da42a49e7af9f48a666853a89a65ce249e2e3ad012ac6a7e8af9a5ad9d1f56693923066c394288893a7a734baa4cd6d921c1261cf5ab7b24092dfcc8e57d988d0ce9f8ca8918b109cc93bdafb4832ce0edbd179d7cfbd62f986c72c9bc705d69fa9c61ff9205d7d1c3bb191ee1933a01a82af499d026e167e1bfeef7497f0ec3ac452b547b9062aac8fa6fde59036606fb10a55918b406948c2d599cb5321164c9ec3d116d42ba5c8359a738435b1ab58d7811257d2bac7d41bf99fe2711cf14fa977f7e8fa147af9bdfaa74c724bdd80769224527153aeba77c9765c8a5b09ae750d9e20a37726bb9955eda0fe5b73510ecbf003df91aa6666c3b1bc0751dc0371e3387058ca1578481acb240266f955108d09fe860b37627976e6736097c4c930a75b3a9263d3ca5ad7c4385704fbf71c53e6a4fd16d239206169052ea3607a21a87af1e8fafe2c321b7d60449be7d192befa99bd4b0744ec01cdf3e9fb4b90d5851c38b4f5e1187e443b3e53c2495f143cca4f3f1e43204cd699c1fb05d2a7bccbc3618ecb19198fd0a2251ceead0a014bda380b171255b36e40f20a69821957dae52eff01229a077f36b708976f6cfa6abed699bc015fc02747f6608cf680373105d35e3e8a34457e5d569f431cf25027ccbd73837ca8e3903361c5e69c56cb6cba0154b9ac52ea7caa9659783224b2f1a85f20e3f0bbae4787a6831ce01784fc563b5b29258066f89308bfbd5b9e8356b63e1a741a22809ba94720765e4d045e8ee3d9f372373b50aaf04a78d5aa51d59accd8ba3557fb3b3cc636b98351ca01b88d69bf1f01e833571f72315ce2aeecbaadd40cfed67e74a6963e2cebe0368457aa82d2885afe0f2bd8df8d3dd1eb0a8a33a502b328aaf67b599f670452ea6500ddadd44abcdd529daedad314e2a6cdae00b4321eb8d12f2f62e2ee493456223869433ad2a2068c21141ca95ebf52948a9799f17e21b19d4754a129370efa2a63000b8ccca51a3a5aaaed8697a28efda46acee77dddacaf37a132be5a3d470c15243f30753088ebaed5e5e14c46ac678fecbb7a8a5722f384cb40043f69dd35c33886cc78cec30ea2179e4fe9164b70a1aff8312028c508b35531a132ff2d45f1cf5ac753ea6911b9026f28fa9bdc978e26fd91dbbd033d57b19ffbe177a79b255b23a7731deb936808e112fd31e05aa9e4441319ae5e2fc672d39ad76decc3e26e89e372d3bb1243ad9c846d92f718996a543b6657465ea41b7504714c6d5e9d7bf611bfa6580cb062ea03c819718fb12bb6814e524c28551e1caf3b8d89b9caf5e0a8d5f052e152bb5207994ffffe959ad37b3e29e03b7ded1311b2cbf2640f7ee21f426c3c4e9f398d065d90e303cb4a439fc2489306732af0c2636217ebbf8962fb81546492ea4fc38691a6db2da6bc8f455728e4f7d93a4e47c9fa7acf7f77fbb40f537c5ce870be1eb1dc38dadc640f22795556ae04ad840852ef8b7da3fd04df68d3d40b0e4ed5255abb9c99c0c35bbdb5685887a9f72a8a8adbda74e17b26d41a701c3bc03ca130d8cf76f8e87ced5d77bc6b232d99aa450e29d843ac64da489092a55da2bc9ad7d8824876d7d34ca85ccc2eff0427abde29741578595c879377c61fff2a612a70b67e81720378e224c131e479c20377ac792502819cc4c75b1c84ec8ecbace8921f0ed298ffd0563931685c21fbcfc64679c73fdddb3001e60b598b8b0b025dc26ecd8c4a217c117c49e9d695f5eef012a7c52e0b9910dffac0be8d727d03e26822454f141cce9c546730e43454e38dc79fc94d895b09a9dfe91e52e376142f29c5d07b75465a6f6815d8158b9d3007abae2e1ed5956d082bc1038c4c9ad58c5de62991ec32a1f31dd249eb1a4366f6557f7e328eeccd735505188a1c6faa929affab32e76637dfec28f0c55ecc0ac24b6033f903a5ad63e20197ece14915da577ecfdf05558e7e59868744c7bb6e03f41cea02e2647f5269633c2529dba9bc29f011e6b4951866fc7757d9f3763323e5e1fac089add5e731866fb3547bc8b068d01bfa738958123b77fd0550a0ecbaa77bf0b297f6236b01079d180fce156fbaab487ad0c6d018ad04d1476dbfed20bf3776696bb1fa862e535ee3aa36f24295ee11f84ab212e2a7ba9f20b917c70e73a0d6558385cd9 +0x43e98dd681cedf885992d37e500247fef6beadebc6d90eb05c3cae3d808daee1a483087606b5b9774903ed672ee9645b +65968 +0xf6bc56734e5ebca7c400076eb49f15c27d33cd7ee185a5ceaa4167e3934c36eb6557cc4061b505dfde69a11d33844595d7aec465c7029d9a281fc5e82e7ba69f3cfb67da4dc16ef9924623525ca8f7243d45a6cc6a88b83c64034ea8d8be1b82c3cfb1a9d92bfede28bc1677f9b43357f720f91d93c0ff9ca6168c8c58bd9e7e42fc3116cf9bbd74e8f501f3d04fff164c6848bf085179a2367f06fa781f367a00a96f87f5b8b4a419196c2eaa2265498645181a92e52f375b67445bfe8dec5f46fff465152bea57054fdf904ed46cd8ebdef396f82127415ff6cf18b3aec7135c264719f59b6773f2c0e381860e1cabc45c609b04af6ba988532e975f2bcf7f8a45f0095eb134e12994ff6918787eab58e6e8917c3703581fa7e942caab0c8b1885789f1715588af2f2bcb0cdb999bef1a511e02960f5356b198980bbd787204d0d6642ea6edb559402a1be6d7a76cdd5c166f0d3d34b27b6d295b8fc574724720642599d65c62959ee36fbc0621bc14d616c2a41380d1846fa955453d25481cf97954ef9a120f087db03d08d1a9280a1adadf43d3641ef65b811bb89f0b71dace9e588c6cbf19167f391a39e49e3f419ceb0b78d75f19459349255665a77e25123bd6fcc8a42f4415e67ddb9981403fdecfddcfa9e24ee6a979f8ab1b89cb6056ea26bd2871a015d440de7a7af2f97942e1dc94c59e3e7e209c1c234b12f8312f21ee4a26981a002cc0c2730353b9727bd97e84b4d356607b17f65b5ee3630bed6b84202d97fb97a1eeb071bd341ebfec1f3a0bf23225423b861dbfd17bca55243f9edbb7f1d340b6332ee3230487b6161ba586f82b2977c45ef8cd4d3c6ca1560674e950262f9fec36a443bf5582f98c5737a2413ee185a81b2e101ca5e8751568ccb570b57f09b651a70ffc979efea16a66da67eddbf079431404ea58bc44c4cf0cdcb4102022972cadc4655b4a3a17cdb99bd6a8775caa5f412810c5669506b19bdb74d6d15f21102efd8401033031e9b66317ff520eadc84c063a6c55ea3da9101e4d6a0123c6b4b117c33968759256d3cc9662ea9b06268b0bc1ce38b8dc2e0031a85a1e250a82caafcd64d87eab8da834ec73af9645f284c5415b5d8584b8c2920027a6b76ef2e221ed03d1c000069a3894922f74efa4dfbf23a452e4a9c1fddc0f43397f568d7e2abca6e2ce125a2043f95ed8ab55c5e2460339a73adde2186c003d24d173cb2506a6be9a0d64e0d0e3b53a39ce3ade33164a7bc91c738188be9d86175229344d5255cb56127a3332a442a4d141e146589c73fb46ee1d38e56031be7f65f9417daa244da561c4d9bbe21c2f2d9afb96b9450a289f442d70a4ed6746dba1668b2c5aacc6166fd74cd349bc49ad5dec57dbac9784309346b15db2989faa88f369dff059c517b113f52f27ad84deff2602363f86beb97fdb73665c60596a8112761f17b5bb27ca1d7b16286a5140f35b1e6f7a7218785e6e4f554738e49a2e5638502d4b18c50f56472ea86d4f61dede14dde9c4222bb371ada11f9cc1c7e54119199d748e8e1550d1ef4440cfc026317e180a077c12138806e0220691624a45a0d204ec5cd1609fa3ce786f62da4df7c28467a686e9f313f3890af0a407d1d6582feffd344d75854542b153a91eca838ac96f4bc301d697ec0237059a06f095b789bb218540c8c43ee28b97f30c20872f5d9d41b108329668f2429fe41e3ae63755f313c059debee9346396d130f45538978e32f14b9b91f2cf9a3a128c256a603b243e85f73be7ecaed5fad41b9a802f2d9e99d46a761d01f0ca6e95ff2474ba9fcafc46b744c1a1c85f1e7c2aa79a7b866ae10ae3669a2f1c4fa7eed5dc97bf0a53e773089dfeb1076b8c29fc8006c6186f92e534c18bc29886609dae9265e5e15b8aab69bbd192e287ce7dffd857777a0939f3dd2b7464fc2b3322e80a41b7db4e50406902fcbfe0305fe8a304ff0821e450c74b18e6aecd9a9a0f2098ddbd5eb8c2e27527d2909701aaea949a7000867d51d01cfe54e873510fc2e6c27c5ec2077cf21c7ef5cd6d5859f422fd5cf93e30b79eb16041aa83eb0ede891bb024cbc6c90fdd9cd8ced9b0c7a60cc2184aafab1c93a6d32f7d75c511c2a6090b97d283419c26f5ee0d72b78e70807d247d6148db4f6bbb90d9df7ba30fbc1f01305cb97117870eb811beb908d44c832429d9969e328eadf838177b4d2649c21386e0c5c2028c6bc9741451e151bf7879a8af10bfdd8e1ed810c4407aa6bd96c4f40554defd9581949d2a0e826967d1a7a22843bab0c882a31c4c67b5f1b601980010d3026930e4abf5564b869bb403308efbbc395cec7e0b93365d79a791970f53b9bce6d5ed0962252f8548694291a6c78fc6a6225865541e18ae5028fecb9d37569ef6a4386479a51c68424292016cf45b0f7bb1aadd3f2559b6b4064c23b4538de5ac84918a34edb3512eb800e7059df403347b324a0f3170232fb00813f710b62d92d796ef36777adc485a3d97131cd12e6affad3046daf2502dc6c130d7f765d3242d9717e0cae9664979a6b5e809790d79af7a34988a66ea38baf5eed9801372eae74078e660759b8cc6baa826dc621d0b1b17ab56b8244dcafd14c27e4355995194f19699d0a5c89c920802421e12c979c3042923fce0e76f0dbc4028a99292f2d749058d83f089e39c1d48bc3701bf6027ce1262b0f363af8d4adc7b2b610c48fea52a33f2fc5c1c2548d007cfb55b28b9e41ba58cf23ed6cc4f1bf8612771beab94992fb61fcb80ce395cb740b4296e09d4895ee953d5af7b3772f2b37c4fde4ea5b6d345d134cc075d334d2274a69a981e00114eaec483faa2762ccad61322583727b11ac744586132f83bfd8d5f28d52f044f255987eecb0e99f8ffab482568f7505bbd5856b05c491ff62a54bfa35195fa7b15ea9c5a7cea52d9ca827b51f134c535a60b086e690e1f1e416144949de1772798d87e5180b43551c3f20922719dfad15d65c5dd07f07a16cb398a770a7ffed716b9aa6e66fab5f374509e217a8165b14bef0b96c9aec57230540dc527eff60c27f4bd0b902c6931444496d96c9d9a480a0d66262e8765b309372af986aff129351002a3bcd7a38dcc348fb4d8310d28104752059718ef4bce597eaea74e74c0d6a227d12d7b098b64b6e54e4dea32b3e7335bbfa3e1d6cef841853efa29f5658511a91e62851f9cb63233f02e27af8e0757efaec560909f0f75bb350fe10789b8e4f2e60c943a44393cf864f987d808e90b8a6d7c23c14e8c6cad1b59020faffaa281c27c170e14563daef7507950d714e4b8765889cd4fe7acc77c45fb823ab2c0f22e418bef8f95cac431937a8e5b136a0653cb213935b9ac86b2873c13cc79c6b0a3fd717308805ad49e6319f5175d01d080447889726ae287687d4218d7d83a39adf0562d21ae646cb81fc6399e5a52b386650e22a883f53608a8bc25ef368219b6daa8726d688dd8f95a0db052a3c33bc09d40b92a9d4b1f1d89e8af751d34cd490cf6d74e572dc5fc826eedd6c1d9b5d97dbea17b0f5aaf11a18639fc04c8c0ff17afe046f2ca901c2958668d2d1cce3b56e6703c62aa627f7fe34a0685c491238b6211d9b3fae3d2cf58aef85df2f160d936a9c12fc0d5c185ae540708aeba60c88be09913251ddae4fe1baadcf2bbd4754db2cbdf2475824335dc8005fda9315fabe0e7a8dfca7efaa7511702a27a20bb9a2f9ee95bce3c492868042627fa1fc1307757ed91665980e2d3cf9778d8bffc9a84cce6bd5c5a07e47af5c1b409869db8286c49d07dd5083f1826e3ec441ce8cd36c85fef8c55fff889e7612863f035b1788756136d8c012a92df808348c1e0a0ca33ad68eada91d3196b9d0ba5f739aafc5b8ae0d1d90c23d83be5b4533984c3c371579004328e12bdd4cdc42c060a03083b60af376679c96cde9c25f00e35949713f71b45081525cbb58be882a7376840b960050a9eda69a52a0c2eab9a7391d99e046149b5f79ad7a05fff265542391a581158d7fcbea325c0ce54e278ef59ef71f7e87ee685c06617a26ea38aaaf41989fd310c0a970473154b2f3123e94b6d225a3740f440550b7e0bbd76d1e237a2e17c142342e3ebf1aa2b142425f1e4c741a3c45c79c7c71c55e4621ca578626ad12678ba2035e845f1b6ba17e9a9c472325d261de18c753d31d502f18fee02c5eb74e54d4d0d87c48e967798f971591286eec301c5ff0dc2845606b1eba3a74892ffd03903cb2911d342d333efd9111cb1e121a491afff60efdff3ca6349be676a1fc029feff6aa25234635517418af535dcd872cf0fa88cb6db40a76130b6a6c36d4b7c992acaea9df39e990a6b3530a52a3df8e8aeb7aa8be073e580092e8b5160c8cd5cdda87f1908eb6c53869e536261e8a378fd9b4ed18803e11a3394897682ce78d478a1c455cce03b6d5434d2000c6f0efa8cd1de2a2a8736ca307725b55bd32b7a9c355ed6e803a2c2347731009227a7e7dce9fcf85064530a9054e480446d41c9a8e1a30ec2cc2efca7f404d69ba8eabb5e421fbe8231d245c39c5a89d4f3584c3f25358ff5b03c773f39a214716963ff9178caff485611265adbdc14a60bdb7cbf7e8abce93657cc6aa6bd2cbbff803f070c633d1b67bc06b691fdd3102d47c5ca5c172825f50d56aac99a91f3c1ebc43f6b8cfa63ed1f61773d4427abce29c1b05c7f442442c9c08010dee68156e3599b24acb9ba3cd7e11d5c3384e174fe0b21ee07b37cc619747b2b0e9d1d352359baa656eda6fd51f0097d309d59a830dc9f8f54d887e578fd0c569e27ffd3183f1e8ef01882953a08cbfeefb36cde7ee079cefb35ee2764b4a451f209d1b72e84274d2ccd05aaeca5e57fb589a38e14a1511b4f5e18127955e37bcec51b57f2c3654f417d8894e651e66e1662864dae89a5f2e5b38e2d033b4a5278ec354bf1776923f2ac83e9b3974f58a6e09d83b913f8f432d8c8edbeef396484e1d7f9a70aa36994cc902fd0d060bddb7641c6a0daca8ddb2040bae8ec313077384bf78017a46ecc7035bdcaa7fb0c28b62b9d12488b2e333c9e3b3dbce234c47229bc1908ccc1fe19dd4a0d985ec21302b36d69e7cb63df8029d509db9ceff101f9bdde68bcf1ae3bff2b160c0c8e2efe61be3422fbad349d8c2ef9b2f1c0817a34735cb1d58c515933f7707da4bee10bbf15fd94ac98d6e73d9f79ed6164fa4d5282f07ea6e08be3e425b98787e2bdbd33eb22b74e853aefa6ad06e56c3bdffddc534619b19cb27eb83c3d945678298568d430056210d5396fee1d3582c386fe4a6ada2d861f699c08b1894e610db8e6c637c20977ba3a36e1c94958457a93d12540092484f715ae5e1c38f06811f063b4ac453e0fffde7ab4c507b814ef9b28e5697f994ea24b2830d2a934bc13448eec98360d9b3036674167e4ef8190e148134d89f643bf7ebc298b7675dd7049cab69221029a19e6af20384d690bed2ab12772d4c5e48d34cc909d1d5e5ce764a9ab0072b79d1b4394c9acbdbf2472cc16aa6fdc72d1b9e1cc1e8dfa38bab7199e5289b7970492e1cab63bb25c5bb039cb049afd977bc42a4d1be4b9af678dfd3b15946c1b713f55b37e7bc7bb22341850de9ad4ae531a52c22117c82cf3da73e29ca71cdf537f03e17ad37a76186cdc4a90d5ee21e84b1fbdc6cda23bd00b12272038263d3bb060d743e926f79ec8fa1ab3d2a68cbbd4c5b2654cd4469cbe5c9b78ce34cf9a9210f7520379ca35e6f643b0179a693e260922853bdaf7aa52b7a1eeefa500e08288d43dd8cf686e2555483e2b3621ffdd4e90bf0122a99976b7ccfb03136bbe102cf05fdfb44cb8329baa8674065161590a8f7b4347e6ea78d18f35aefc8a73b991de406eb501946d3ded519897721337c1713258c73a0df7996b2749bcc7a1ed4bf0882c4e019353b08307ef45fe85e807e88cd80d0d847173e33879f0bde939bfc98f8edbd72574a80e120eae7129e84247d34795fbde650579f1a624d79a0d61ebdf1d0afcdb4e68d1187d4d548fb70521be0e0e6f8c40a2b1db64c59f3506d6b9ef4d47dd255f879e83918f2317e2c508a5b1b2e30e92e00d6e2c5f9f5a8492c648961f12841698a8dc02006762ea066f12d94ff0e5ea51ff22635f327b250a83638dfd178801f0929a452d9be14b5dc78dcb1203a2a55d0980a041030756b293d8ab6e6691b043ee36b1832b23651f949f2dc5b5b55285bf0179a18b9f983f5a0064ff8a419ff70e49fd9dbf99e5d0689f77c7619e8050723d460d369477e55883510cfd082f7e853c7fc9a3c54c24b6371f83a1eead31d59cabc09e96646911d9d6232965fd6ef596ceb38235e6610fdeaba6f0f637ce5b97f1781e05ec1f186c8aeea9eb783cb1e150d7d55c6339d7fe929dd975be7a76c7dda04f738d9bdec3e5ac08f92e6c4c94aca307b94103912f7ad4b5cdbfcab9a4c6b5ad6fb753c7685d07912f8e72483948a1b3ccee42ede9bae8306eaa3386972344b24af7cb74d2776e0cef26e317379b504417e99c20a5d944b3e91c49804799b9f895cd87698acb6bc6c876335c283b3b432ab163ebec5c86cacd7471191e90a1daf0b70c1809af7d493c0ae76973aedf3b65e43ea245cb0aef7c414ec3948e88e3bc42ce02d7ba0f1eca3373d1b25c988759e080d61a9b5d8c760147123209dbad88df41ac6d61bdb1e3be7d175ccb03d18734df0a0343fb4c6b42de778f891692c70b0b97434cf5ad28da47cceb70bd847e5fadc0786b7089ac748985f592c63df7448035e1c2436b0a357844e6f4022a9fdf717be26839deba14eca01cad66f9aa1a441ad1682365f84e9321c7bb9e3e7c22ce9ee9c0d3b624b25c685d3f7570500adba88aa5124883840ce6163dce3a83d829cbf71bca9a6ccb7d414fcf7e1c79849b81861f9c6d2c846a044b013e99574df77582cf7b1602cea3bd6ce3ed68872618184c2e2e4e63be1efeee9c5bf56712dc1e25528193874a845f2d034fdf294de5ef55675486b99fb058796592b923c52c38475b6aad5abd838918b4120ab08a69793a318b90aea7b28363f39f6f1db38c56713092ce0d9625dda85ce055bd6a374853334fe6b3749a1236dcce81d58c50eb2b7896700062dfcf6484175ab04bb3df48e32e035874db877a77ac8bbbae3e88ee99e23de3b235d0c5c0438429cd839073a782711e36fb45a76ab60760a79992332b02722802bc745477d16caa5e1b1e7c1709ba65297dff361c776f34f6e6a9819273c73db2d84c99316d7e828beedbbab81039ddcad7f6bf036d3dd91aca316276b2a795612dabfc73642462c5735ac7e12299d8999dde9ab613fdad91a8cc4e2e4b9ddf8c0124f6c44218cb994d1e2c48dd34f624341961bae81922ea06dcbd4fab047c92073a309aa3a62d75d08840459ca5a6e93f29ac78663af98268d528516d95ed21a47e026cf556e8f9a24bbc7ded668b6723a1c3752abd61f9435827c9efacb1a97d4314c1b3c5be8336bae9484be1e40c65f44f47822b1ccd2ad8341fcdc36a97d64bc01f6b6cfeb102686f3b34c261679aa3b856290e8a6c93d7c5c96474588b63da9d0c88a729f199c6a6cd34628407163297276bd23b55f2d9556d603a3be28a7213ef981ee0c371783884c75cbc498d236441e7009027dc4f8b523d7f653bdec4cd5f163e83a50ddf8ce86a1b8acd43f8882c17342940c4bca04e48ce7505b53511c19f80b324d37f2c7ea9297000ff14ab4c68c7774f20a36c883ea1dbcec23589bd707fcfb176d99f9de0f0fc63031a263978450a81949618b67b9419f57a58bdb945a669d94c714eecbe2c8081f47b8169b22743a675076d4f8c1fa0284211063b9b7ef21ae8d8c2e1ad16bcdc47bb5553a308c31c6669b2c9ecaf1ec5bde0fbbace73f8e4c06283f31a5a01e0714c1a8dc743f961dd5f81ac19bcd65c426b16cd7b2ffec567b11ab7a250e02d05c0398e9b8367053e3b726c9fd3775a73f1dfda1dfd743b3346efa5b1b5e810799a4acc9c218c752d9fdd81eb8d725ec727cf671386e9c4d7968b23e4d37a39414cb6de55a8ea401fff5b92894547c7b07f6e0b1836dfe0b92275d8a8542715f15a161a34a400e489cc450505957823c46b242c8897b72d5c6d282a78927f250e44e126c59d50d0ff99525fcce87401877d9a41e1241ff935f92aafd218d2e50c8f908a94ef6a93e5f8ec195bc8dbdf5e1928e1be667ad2da38e5cf4171c2e450bcbc9c0f24aebbe14d7ab84eb1002bdcd068927cc94848cdbef20f4327df919f3ebdf1b0d7ada7560996b3023b91556835d1caa8d708d964edc7e65395897b2c981d220672d7e4c8dfc8a002c3000aa4bbed00cf1a4cf34467effaff55411fad4b72839c70ce02be2278f5ecd1ccb9f6d512cb5c0d8524f09fc2a3a2e1a6ed75eb36bcdf6be07fba64302b1d0257c1f3040b80dc2b31fcde07f886eab52b633ad9d2243bdecfba222776c60fbf41d11deb0fc7dbfde3d98132f9fb436a3f2f50a9ed605e23ec50a9eec54d51731b55cbdcb816b7e01b496ea33fa7295b52905bdde0e7a2d5b6c1961c94277eb844dea16b9ce40c8c38db1adb41e119131634b0e84520a68ecf8b9b537beae4193eca230a26b6565cccfcfa3d995faf2bfa8ae45b82a1d599872d1e05e51e2df099a6c55ade1401dc582da15cbe69480060119a9a41f1bca08e1492b65827b8e8c5f30cb02b73bb856afb94bb1994603af7571836db86d81e44d09de75dae116c444d6dbca75bdfd265d548db4367a42610d9f1b3e7e7946d3bff841b5e07d3f5b5047cd2da42db5de949323fc469706c5d08bb93df8a8e37d3d009c4e1cb5d1f68c69e952cbf5a8255c5e54b051051783c61da592ae621e8bd208366716f29340fe257762727c9ea4be9d6af9dd2b3d42f73e26662810c1a583f95829579d4edeb064be84212a5f03c138abfe747340aa6cd486e1ef1892725ab94abc661cca7baa0c07e16167b2e96e1760e89d44e7642cc80b2a8ae45a9b5e315447cbd9cfbdf2069aa0b99b61fecb23d0dee106fb183f03fe6a81dae0c79749bef20f3a254c923bbfebb22e32ebe3424509c622456dae6ca7c85d64ee9f0eeacfe7b9a993d19292bee7d289ee58bb5d0590d6fe8a0c80ea4d6da4e94acbcafad04b518de3f4f8f2debea4125dec5d5d599c9903959dbd673980e1d1bdf2d36209495f4edb5cce456898ad324650d028895596992dc76dcab42a99830fbc320bc2066c5444b21c72a49c7751722c1ca8dde25529193299fb0493566908d3eedc43adff06e59de861daf389d8aa274ac39d6c5e19228749e171e29fea70dc0fbcd364a1ce88c63cfa52c46b2db4e96063101a3ad3106e83664540fd6e0e829e95bc53d913f3d41f255338a6ba581b696f7f1570bdab8e5171c6d4f75dab6aa24e44a42f3eef709aca2777c1e660656acf32848841ba90baeb3ec715200f3f23cfb47c2bb54442b3d114a84418926e6d6b71900ac6071bc7baf340df1d02a72a00540656e1baf1742263f4b7bab8df792b84617fb458d87ec72e68debd4c4abdc96b67372a1926e5a55c82a333985f97f7b21e6f72766fe9fa36669968b4d2e71243ca57f928880d43467b90ebfb97ceb745f0606a2987103b5563988704e4adc322553cb4b0c0f4e26b06044aa82e265383fedc0338c8f973d1876480022b19c4513070c57975a26b114c89b869cda7b3b5716aa56ddcae88f3f984bd774c32fd18847b924b5020c78174a69d041c5abf227093b88e68376403e280a42af20056be79e385eef975dc03a7e46142c246601424dda464179aed4969e19fe5c38cb88d3632042917a994de0dc96ceb68737cd1b4d2d2b78ee10d0cb72e156e67dd09cbe4ef79c652c5d65ccddf26c7b5eafca249faa84f7814ab96f3ef6e8e87fb33c1aaa34b8b54cf89c310aef89d52b2c9cf0bdc8ff37b39af2d46ad110dcbef1cb7b1d5e241c2d2975cfdbd4837e6d3c9a02100f06d3f5a001ad8ee68b3dac0aef4200da6b047d3e76fbd947f5b1a56e65db4ee31836d7e88a5d03dda485d76cfc220d4ff9f89dc614477bb06d29642074deb2fbcfeadae2e15571fcf93fb1a6967d9b055d730f4ed2254bb4364019f14b9ef4af7a5a6f1dab4941eaf5d5db3632c722c1021e52473537c1aa0d80476f4e9e7c74c42014f74c8b0c1e36e2a49a55914cd98435073db1d166384f846ce9125fc2f229b65d0e59ad290d18e0be51736e61d550518e90dc94a1b578a70afd2b55608e07a7b7d13722314e285a88da10b11a3b031e58ef29e42cc805729219fe01cddf0a5eb5de798cbd47e1aa84c2b1fbce70f8d616b70e623fd69271a2de0f07733b9e45c784953f1590e17b4279dbb1072dbe3328770e7183779c2eada7d2b8e94a30177d722ecbd29f8427328df2735cb7df900eadbeb460118ef42315fda8a8716c2e38158ab58cea6638e56d9ab527a5b97749d9738d8e3ae78ca386c4492957af1487ed5d8ead07e44acb9748f8f08df8735a78e16f465a32329f98db3cf44375450d77fbb9ab5eaac765a961a15fc7090ec10a6cfc31060b9087cab6d681fb5b4a193409c91075162934028950cde757941e1c9aa6c6b4b010ec7acbb86ab5dd8e3baffc2f74d1b2fac7313489c37580bdb21deee17ffcdc5e4e47ae55172958abf55a476f310afdb69fc3d7beb8d800e63d8cde4ee524fcb31dbfb33f0fbc690dc6b1600add7772e71e29076246b554a800e7ed416ee37dc9eb219ed8cce59b3e4043fa84e2adaf06d2df3806d563f86dbccd805ba5beec0d373ba5a4c74b4bb7c2806b6fe9140e804e64de3eed8a68c1c19c5c1001fdd3f7726c8c3597441704ee05371e49511dfdf1488e5d178f222eafe2d4e10c46b2132d12a70da56679a02330e2229bdb69da6bf8bcf3bbf8b11ed82f6f513d2ff2dae7ec8a9f8a38d00402a2011f49295ea00ef3ee95633da20cead09fe31cf032c90348ab6dbe21d6bafcc6f866e9b178e95ad897a4a5e451935874eb19145dee783fc58deaa9b7ea3f721e4c9bf60a4500e0054cc3fc835c2c919ad565cbbf8232ddd1a6b8e561870c13167210e69a5f913f187255cf713e5336a0f34b9bab9ab36dfb8a3ae9c539ab505e1d8833f80514b870acec97545481b825a94d1c98946470a1acf33f497e87aa4383448699f205fcac50fafca35b4276a78becc70d0bb0867293644e74c23b916567e826f682ef6c2a12f367c49f002294ffad137f6d320fdcb220afcda13196421fd5cda4543b97884788515ebc652c7c99008a7635638d4e9d9acbba980439583fbfc309d2650f35830c51d82fcc04dcdc79a477f0cf7f56ca453ac2132deb163be8afcd8a0623b03a01d1a765bf3c242e9af9fb3bc06673acb2758abf093c1a88f2fc35d7997596f10b6962eab942e123c6e3865300c323d964f46ad840acb3cb6120f9679995482c7b71814b44a9a24090099ff2eb25f5b4df4fe91b4eada067b5d67ea670d34260f49298f3dbe0d60978d4ae77fa0f57e373d09bd49dbf3ee263554c10d9e02422e94500710978fae303cd487eb7dfc8d9d53ee9b0b8720dcfec45d8431f2c5bd6dbf15e4f37e28f61a35be4539f17d70c75d3591c193 +0x4cc9b319af23213a45f5b8ec966905e20aa06248500cc2bc736b171c9fdcad3d67493f930753912d82125e8bc188e72b +66760 +0x5ab80169184541393a6975f442ee583cd432d71a6d1568fa51159df7c5b8f9597f2b025c5b2897344f1c844da18a54d757aa6782f057448651282fe702dcfff79afb2a1c78ba22d3b41fe4f55567cd3ac5a5b0fb82ab273c152d26e94824d6609471a030d9c3872052babc74c74d6c6b0469dd0c8bdab922866faa86ff59269c53d58d20e40b71230f3534505e03d974fe3e143e73ada3438a35e1448f4399b4c16f1875035986e3d4d776138153bb5c996e7d17a2e98da40ac6f6ae61aad5afc5866ab69d766e688aeaa7449a03bb2cbf40422180591e4fef6b0f49db5682954663aa6b192bd2ba17b4f26c10dc80eb57fb88e476c4ff4b1f6c559f660f496f2e4f011de13e5ae2657e7d124ba6b3a149e87ae7eaf1d8a08411ef376b9cd244649097535c77ade75a8f70beb329fb577d4f3db245a9505705a2059950c6c41cd06e9395f2a074d1e031f4f9b02c0114da78fccdf0b40f768966c14e7f55c7ff5a331d6b0b7f56a8deaa3149aa796ce04aaaddc151dabe08faa649dd5e1185f6ea255f5e0fdefc753b434e3909d6e5c3b52e0814d2e305123faac5ce57c1a308688e7ef566830d40e144734e350c14c6014da651da968b9e40ba5eaad02fcc3ebcb4a5b97936320fb7f5ca1296e3a0f0174cdffdd0bcf9b3e51e3bf73321a69ecee0fa30aec113eca59d780c9422324adf76daa21e1df65a161d8640e760d9338659a5e46eeb57de9386a8c4989371da4112c0c72b812b9abb00640a54b40e02cd69cf5d227ba7ee69f680c308fc06aa2667b8f55fb03f7bbc10ffdfe2e4ed158956a021303aaa220f3628904e2698c274beebb32271db0501927f46f9ba1d73a4693fba02f009846e8ec9b3d0d9d028155f8189dc8ea74172d10cc801fc472404ead5b0fe646b1c6c458bb5f8dc56e6ef92a1fff5cd4a36f814ccec62731231932189898e6079f0f2a5951d2df9d104ec9f739ed5f76dec79a2ea3a84e727a1375584cf19aadb0be9f41073d6f6e988f3cd20ede5d4b76cdec48c3ad0202d7cdad0ed09070b3872377b23405d9c477ceb66d0758b2bd1bd10c2db75ace5cdca63d8edc0bf4b382fc682f70a29b393e7beb0aabc30c562e7f6e4fe7281ffaf94bab6ac7bab3284487c51b35ca20374d253f4d74c3d6b13f377721db9b8377ae2c7b251c23288c4c8432f80bb3053934492797fad18e38ce87db362d3b753d6ba7213051dbc149fb4026686b13b6d98456389c8652bf574ceeff0f347e81b6d26a323ef15b19fbe16a13cecc52b172addae6addfedd6b74aeb471f89db259e42d422838317af1c9f507fadb80681af1155b65e400950c338fb67e9a5e7cd3e6d7376b07fa7dd2675a1ee77a685a3e97f452c206f1bd9f5a79dc5f0011b052192d6a3485f7230a404ccd4df2076a4ac1837cc96a5bbced90740e5b543eb59e2536c3cbd9b0d460fdd3fc726ae5fe0819c9bfc239c5fabe7e8934bbbb6df37fb3fb2b772dadf99e46f7939f0b88803e47ce04f49ab8dfd9cbbf37c85f27d2bd6b828881a677f88ac2c17b1cfd7a56b5f39a34a8b6bbd308201ffdc768f3ba1ff4d5c4316e953bed1a389a316743ea35c4363526b4563e1125af6f03fe5a136ff7fcc5cfad8f288ef665d9267169a28662a9f1b6bd1188bd817975c347e345731bfd75a38aee2937fc4e20424576e86f76fb4ea0f97519d4dd85f84e6e16b8f409e2baf52e38a5aed7fd58cf08f223b9a834362b8f09591ee0d9deed997bd4b968b37e0cc1f804bc2d7a6713e563ba2c9f5d90a0a855b163337f11e8f19b028ce176a8316ab3ad29a7cb375702531790047e44476be2876a7d7f77879dfda8331c3520ac51f30abdecfaafe28749a1ad7e9d3968013744fc67dffa12c5293077c0f7cec59f3f8240a50fb6fe9dcec04bb6c4594b91dd51e199a981d093a8002075c59ac47c207d79791036f16c69dc3153fa8b38445a14e1bae5f30a2d0182f6e5a66cf00f1d6331110716041ba25d28fe48b7764238f7c372993a08bbbc1cc1b6a22c9281be9d3014fb3e7fd201acf85fb4c54eb2fe61516bcf3d126662384890c1c2f2f98b913e2bf595aabb0f2f691d499e08bc35ba514a8ee470557a3d541c0c1658a00da823fefc05ccfb534f42e10c28ec8a64698cbadf1769b28c93ad018a100c9ecb4aa63418762fbd55744d52074c414113d8ca61c8be46a220a21be84399551a4de0917551ce19279e07501941f3510ccb6ed3e754c1504fbfd1667940977d3c1cd0aa6bb0f6d361b56e14ddc203621112936ef58808cce1f08a555b88f4ca2ebf84babc3cd6a594221361479366bd7873af65336e7c05803c35b13723968515be628810fe56d6e86e5cffffbb02aa6a732a7e480d0342522a3842b41a67f51ca2d4de10fc5fb08420b3b5ac42c1700f9c6d82dd6d86ca8242fcd07b744d6468f241826340d77991c07f4cf63189598e75de389997eee6360ce923333932182436113db2d2a87a36d7288d878f44ab0f86e66a259221de971168028572fd5a76f7abd7a5b8b8fb9cec163d0464d9afbc58eede286609faccd8df371926967286bb7918e3fcf144ea87b02718b830adbb725c5d4b1c8d82fde9b788965de5a87d0de2c815a6399c49306012699431ed345c99af36bb94bd54cd59bea51fd14483724eaee2bc7a4de1708ec59fffc4b6509f0e9c904b08f4f60b2ba1ed75448dbf742593f3489b9dd9cea0096302d15236c222ec01d5d06f0e2b97f8176626cc5a9ad03fef5184d55ad3ffa65da44007104d3c66335fd476c2b6048dcafb5d4a7c6cb57a7fe01d3c8b05136434edf91e03c9c6d4cbf4fc513a33da26af3bd24c4b733d0c4bfc4e1c95ef440b90e5e4de39bd27fc749930479f2a808c6d2e6d1df236d0bcfaadffbb9f16fb621b95ea91dab1c7a6d45858a119236087addc1704973ed75335fb1863d2049e327a04f17d0d2d0e9c93385ca8cfa7e1de174eb6486311b89aa3ef815a56409743583ae2ecfbba64a55a4224a1ea3d6b5b528b33327d39dd56ed9022e852524c5d5b40a624ccdf3188d17c98d7916e66c4079b770a0d3eac52bae7e357eec327482b1d236ea725dd0e9ff0a191edc13ae2dd8769183da68f55b3faaded54198ecb71d94311b413d0ff6ca6251626be507d7d56f0a333fbed2680d366f4a9dfebb0d57ded571d317223e2a40daf63ed0e5d8e10f6f517c42e8ec87af8b2189aa5bdfe10098607072c41a7f442a4ccd7dd49b9be6254128ab95533f54970c6d424bb959a7ee79c1e6423639eab3d8b03260aa6661c094cd4f8436b4e4375de14d071412436c204fd838fbfa82fc2c5f94f68fc130b5bec2a521f158dcd0b86e311a9abb4185f672cf24e621cb87aa542c22b64ca19941a142fb3dcb8ce78e6c84f297b550c05ec341828f6012dae5065e51b85952dfb001bf7c565d93005284bf2ba580cfafdbb9c5ce4206075a6f1ea2200087b2fd7c3c6131e5bf7dafa71f46224eae3ca90fdec284c8a407aaaae5ae0a1948508718e9ee986641bb49fec4c072fdae16403daade326dca92302af3c86c7d2b99e11872ae2c5284ca63bbeda4aa3d00eb1a17966f43bbda458f51d187e3a6921dafed6f266a25192981812269147737397b1039fc553d63701cc20772fc202c5a482a47edee684f5727c0eb945e46c17ff7a9fe0bd36cf6d07d0dfdf012745abe5e31957b0596b7e1cb0da1acf426203d24576b244ab4f4b504683db5c30d9dd836a5c0446c3ae347efc9fd19529fe3df65ab09cc27bfedbc57933f0a8a76763685f960d07ecf52081a785670161e8cf550174279f6e86244eb018a84d5296437a0aeefb5a9ce7480bfbb3637ab1c7c0d682ead9444c8c2ed4325a8ab3f90f87a3b28d54a99a2cb6053e524d67e3441960243b3d17ddbb023d48201e43667a37caa19aa35baf6d7258b989ae32bd06e1dd318fd881e9b8a7733a92ed63607e59d71d3e6dd8a35282eab4810d4208b62034ef0d34eb372e255c50da7e7caec3f7b16fa13c873e82f0a57761f2ff8bfbdf4da7ded8bb90c385e2d21d59f719f21842dfea97d247a6c4704952e5d1107e2510a0294c5bbc1fceec0786073a69b3c571b442072088650432747c6f205de6fa652417193183eb0861383a0faf66ad052638d013dac768bad53e0617543cdc663479d0c6a7adcf3b2bad64f9bdd789e049b1bd4366cd56ed40f01966d572087265e87bdb2301727031ae2a4ecb86ee5ec368301f2d62d8a65bd1dce30cca1125e0b941e00f487daf5b83b495433985887aa55230974d96ec0e2b78165f0ba0888d34495ed24a97fe91732b568cb9f66557b04afd0d5837c74144148737fc5ca154a1bcddd4cf6967bbc7b71a0ecee8fd42d0410ef549643fdc66d9bffd67ee7a1e47c1e37d9f9bf1c1c87f67313f0359244e5fecb8e9c45dc7d7ef451712fd1bd16f81fa3581d4a48bbbacc85dd6f080e372cb1ebf000028ebdf7da1efc5328a576123a9643fbc8902eb65c2fa59577a6984ae2c7156bfa92ec8ab5ceb4a35d19665d079729ffca70c9fd3df7091df509ccc2f9f35b2aae679d8a3fd7568adf878c3b0f0c76a3c07921e1ea627463109669277fe75de68e9b5598a0cf4e64205e4c2ea98cb6723af7db16d9f8840f5adae1dadd198a0a2bac8918b11d08d9d02c1aba7f9e7605aa9b3a0e853f946d2455cb6faa106c1005f9cc9cb95702566f6f9c60e99811b89fd1e33b949e32270d857a586f4260929e2174875203e7644ea735b4802036257b1a5b20509af9a786e89327855623fc64a2358af38a147e0e517b27cbcd3fb6ccf2f64f71cc377920fd9a5f949212d7ea0a73fa1670161e2efcd13d34d5bae715ea692b409898065c42f45305acc99faeb8a467534c78df1107dc5753f01450e67f1846758677f9a94735b460fc94ce233b6b550275991b5510f11891a2f86eaf1f8823692c73ad8888d2f62f0810edd8112d45cc92035d8b96b3f37644c3bae04a3d4493e107bc8a76609ad865ca693dc86eac1a18443ff517a97a9a7c02a01a8dac1c9e4aa0812f9e4314f58c3dead4cfa41a738ee81d4202260046af21c8ce68592de0dfda95d86f0ee6fef1c7cd3d9561f3514c4b9ff2e4ce473364cd8f7c58c90af4071285157738a35d1d049ac8c82cd93bf6fb12883e1691c923528e94ed70065056e4c9773534bca88480de16c6793eac15832f628c738270615d20a884e2d27e45cdcd7e27a7a569ceb901981ebb862a0e6031124e899bd1a559f037bda5e1e66a3a1b8adce5e00932099fdd4f78622e680ee227f2ad306575b577c2f61da7212ab63e3db3941f1f751f2356c7443531a90b9d1417730294490c21cadccea4a70dce90074a269514fe561685248381cc57d2dc573b6f64e6a5ca78cfc04d6ce099ffdb681f01f472444af3e8c5dada66eaf12a71dcf6e9f4f28d07424f0e628645a65ad080dabfbfdd6a4612499ea189d8e301e45a9e0417d5a037a2e77627d0a77ea8e14e055966202077621e6369bdb824ed3f52e945f7c5c0949218391f8815c5401aa516540db33a2288c2bdb57aef3366d3445d11fd294aa8705fbbcbe53736badd4482220f1ce3b1c6c501f73a149ae950bd6e1a9096caddde2c62bfa0722f73b99add65f2b3c9bfdc93c4b1839ec7ff380ca0a26a94adcf2c1ce26d226d3bf520268c72412e58a71acd9a66d0044712e9e0795be3898fd6fa9faf56e37ed8c9b15623d982c31cf201c0e7a9b7dba4bef6a76ca9840bdd9fba332dff7c2d826bedc8182e3048934b421c30dc938b4d7ddeefff0dd4821383fb65e2d9550fb55625faedd2c1f537fd2c3e0a920ba9bdba1318b50b4d92ce2e2ea67286f68c0e12fa5d2959b07f879240b4e94c88ad820e23b0033467a469e8d473315ae928e91cfb6d3f35a43e1ea5200f316e830d16e491548dfbbb3d735e8d6ab3f7956ce2ee79a9b3f8e5b759a04aab879a835f08c7ec6499d3a0c47709a9eb7edf93de680225910c162d71b50e112850331209c442856edb4eb0efe154ca7406656ce3f4f25fc1cc0fc403dd6913f43feab793c5cefce1a6ef74065eca5fa2cf3b79241639b8ba686841e42f2bd39d8b03ec93a9d7d35ba11862ae2bf4e9e65dc440f54842a0c955923f7926d0d092e621096fdcf7793b4e6bf55de54ee9bd16927cfe1797a89d3820055950e28b62c5b4c6bedba88f0f035cb48c2742efa5ae2855a4e0b3409474845bfb39fb748b9e518cd722556555646d28bf4e7b6c2e78e893605020095d9f517be54e661c8bf469c46f4da89c9ce60fba7de752dfb5fb658ed6c26853471d0a0d9e0adcf3d25c7025ddb9fca5540cc6e23e6e63caeaca21d07ed3e6ceef7200898bfbaa8afd3b06f9b8f3dc10094d3548776018ae2b59afe0aef145ccb532e778359d59527b0490d86787c15d2b2bbd55cf58fc09f62e62380da6efed46e42142316c83eaba6d904a8ff236ed382cc1829cb5885ed9bcdb5f01515fa102ea307ff5f5a4a469caa7c898afc760ced5046765f2482d54898dce30ad1f7887c9b799f9a5262fd7b029caf83cdd284d98d86cc1bbb5e5e5190bfe020699d424170928c31792dda292a8ca4505f2d4330cc01b166e5c2919efa876fbfa79648636b794d8a9754e48f6a75f05b7a2d52d855deb0a869567418215b184f5187a2ccd4576a0f747e2395097f190ae57ab8bb70464e4a10c112a54c646438301b5662f3536c26d754a02451d1a9c76abd7dbf656115b2a2ac702ec2cadae30cf86e0f0f96da39897d6222889428f9cf9eaace7b568c49e7be989cccb403b6adc6f1b972473caf53a27179f7ef1c07ddc446cffc4e3b77a6a091d5b24a651ada2ee84a628f1bf0fb6bd60fe60b0f5b5cd859a92e70aba5a9f963c3bcb68a785dd75aa92896fd64497f98ce9d0f885c1481ec465ae56339b672174d321dfa36fc6b4fbe0c836d730787bf9c63241072cd68058dc7d4eb9d96b3b35a5baa3bbe808fd071557ef085fb2a546382722e054e35af66bf66cc37116342d48082d776b0ede3aa4db11002ee115e0a40206a7d608fefb988c38d71ee2ac9a2e9d056c8562d93513a425452a9e4e579e6574c43cb1ecf6e6b12b6b2f7b252acdeba3e1b38f7e54e655944ddf14af298bb3e5dbd578b566eb07cd061f2a0e4daa76819d620f1e389161f690b91eb8b4f09fe2454cb7e8c9f9f2862e8a89f88148b036e63d4c694eb95bb4a454f70bb8616be2970f19e7aea803ef4aee1554542d3b3c6291c1c005a295670f1f58187252ca7f57a8f9427379ae80e1b646a234cc89fa890c29c30bf1b18617949c5f91491e10fd86e079c6f364c3997fb872a1aaff09c008ced2b03b328a74314e5183b8d93fff456a0df789c92fc8a6c546394d3cd2ae144b7f90c39afcab91d88ec826ae54e350f07fa3c14e3e05c8078d5a37b5fdb9bb0a4a3c4f5d450412e577ed26e00830260e3f4a2e6676c75ff9c882deece3696995a30122fc0c3450dfad511e30c26c512ddd6915945283eb167851b7541c43bc681a8dd2e9aaa2c8318f9290f30c0e5ed9ca7f3b6a69c1d5e82d35658e00bf001c2140f3b8b8e5e5859f3003b95d8cab9c96faf45b1517bcd947ac5dfd4951e10c57b8f9ebbf6435467ca80ae63f6dc3e0b37ad4e8fcec1c746834f5245ea2ebc31e5459f516a433fe78690b2c1a283440b06d519679b551440f5def85a9086cdae5a19867672c6e08430178dd765279270e40fee6241a17c29d8591a3c11900be6e3f39a51973400e4cfff88cec630f1e3d94314a8470bc7a935a70013f5b33e7e87bb240b60f567af6b2febce4e06290cee59d46035fdbc6a13b2f206c2562d214f596ccb5671dd8e0d8ffefe831102922a3976b294de24117a61383d02e3a17541b5babaff102a28bb070987efb9441e96cb42c7ea16c749729c19e13cc1622268b85600e63b15277f7f53911a67b65738f87fc7c20d6db8044bde1af95838d1c94887c49058683061df25438b8121e61aa677daa12ade063757d00fc010eb2a6e4e972e87d1e9ee680fc7c5ca714d7244be702611d7e1dc14a634e9195142d45eb3cc67520c61069cf781405f9d02a4bc29b3d6997c40e2a12155cf8c830678a15d6f977973972305809bdcd36f08248ccd8810c27fc1bfe8b07aeaa20effbd4036c7e5846c55ebac905cc0ac4d2699bc9436fc12492d1bf13cea62e25af54c42251e7afc61610698100d1575a126ab526507c413424ba0c2abee5ed5cfb0ccaf11ba7e69b9841dd1e9f602b3d2ce035827418d4dd2e5f465e7ce0601d6f7e68fe4e41851dc86d860015fb0f048e749d5c42d824762c1bfe2d6d283f0d59442eb85e4703e322fde4c429046b36b3825d22313c88958a9aa3f6242fd2a364d87cadc02afb72347d89d93d0ed85a38b3d562c3b8a9b1e625c8672659b355feb5d35d186fd4517956d5cdb69cded58a63c69c7ecee061ab77ebfed84869bba366e334cb7816e76e2469004a10d73f252c813dc701c51b66fb8f0bde7e6e4adf55fcc35df64bda8f60a41f5c1d69fd957895d530d3d045951b123c9d6e296a2f2db087444cdb71599627796104ffa757d294e140c79a76a27125ff999a23b00f388f0f12ee5e62593f63bcfd8a10b2f8c4def08b5f7c353b782ad35774f5a2fc10e8b95e7d4d141ab6d94885ff35a6d4b9f46154fe0df7bcaaa1465ba117c972416e246b6c100cfab708ba9ef6e709883c75e24245b844a27329c71a80f28a0e348fbede2d4fc3959a6271ace39d419fc6d3c1e7a91392898c14d418a72e6b2c84be073b4374ce57db870c3447e0e567e38eae99aaa867de3ff30bea7613e3599c899be740f783de14d6e8d9b62a7b9d1d06f6fcccdf3b1d1964cce4905b9911f662cb86a8709a74c0e2a5e190f26a9bcded3965722092c2a2ba95ab686de2e22cea348ddc4868d85a2ab2008ad138e090a1e4885d24f57b669504b370b36746aa7055517f1775655b3f9b9ae63f7cf7efb596c9c054e983cf5488714bc48ccbe9a5bc95e34646a84e61d13545a59d6e45a8ceae5e28c58867a99f895c29c9ce74fac8bfbb5d631dae51e1441bac10a02cebdaaa89293005a9e4c850245ba4dae6d0083369d55131f5804a6bfaab7d3a200f6932d3debf681096815a26c2b48d99d6099561467781ae6d8b01452c4998a973e8fbb091aa4c364f592be6076f43086d2b5a54196c89438a11989db6fc4833c9e869b21aa70e757fce39e4923b87dd161bf694d696b55f667cb666d41bc55971c5e16ab23c4b78983f08a4ebafe8625129feb6068c925c732adf32fc1eac84fc30072d00b07f9a395a1ca97c42d142bef3d73a01c4acc530ba7784a77b4a40d9854f7b7eca1764c37dea54dc9acef8aff8148380c571143f9a13ce6eb83b078a542ef894dfaf62d738f65984fe5dfeb4a54b44ec156bd3f05838829a6c0b539f1b3a06db77a41ee509c509fe03facf6d99cfd0bc1b198ee3635a43e2fd17bf7848d538cb1891e36d7edaf8b03221d52b3436c9696ce6af994a0d84b0e20ca5b67ba510dc38f56ad0e6ac98341f6fca8e02f4918c717fb0727aa6c79cc136a0da120df1975f4b1fcfffce8b020240f9f694adcb8ddf213c1f83ca7eff01422b43aa948d85020f7cbb289523a2a121fe0557a6c9f5fc979cf0e3fd2d6028abcf83b3cd271db7bf0c12dfa5048e729f312aca943f4d503f6d8719935558addfe83abc0c70d9e6e64877a382a02ded155de77bea7e0c80852842a3418951174b1fa921f6dd3225f1ac5a12a289197730becbda1e18bbf40557d40f6c3bd1eb99d08f8400deceeb7db22a8b7921d9a75dee3863a391c4213c668bbc97df63a138953e60bee7f8bdf6f4699c9afcd7041966cda71f6bbd9e96ff0a4949068ecea3e8363685ab57f3d9eda7b47c8caa03dfb2ec22e62920d2a16bb023f423abca78541783f97b6543b30865718253cb2d3d4d24559c3c6653e8471ddb1dc9532b024352c78eea99140ecf134260e4a2e6aebff6cda62826a8d81bb3dd4a5a0d76ee30687fba7b6bfb39bc41a58cb1c9d69065e3e9987eca280d5412b8fe78432498c5c91b00a0765fe05a61296a3db873aee96c37e7a2c977d47aaaecae868ccaae5e153805fc10b88f24022c8e0af72446b500372826bd1eda09ecf6df2752bf7b83bd451ed0f3ab92a3a55d6c8bfe8ef4534075be8d1d739a8c795614bd2d99acb121c0dfd1778f9743bb0a9a43470a343e9d623f58530c727ca088c3ba95ef9e60f349ad70150b09aeb3d27bb3593c82e1878b0eeb06701e55230d70c1f407ed3d923e2c3f6474662f3033957ebd7c6ce68f6ec1e79014ea905162a045e098f5919f1cb091ee72395fb0ac8be7ec706eb8257bdcc0988153d8bc16e6d8e40963f77a73ff0a0b7b0fbaa5bba3915e8ee4d0da30d3f8784c0678d39898dd66efa4e9a4c25c1a43f535ba9fdf910d8c4e7bbb2e2c3c01c7bb6f0b38765ad5f1a234e2be864c55408757e9ff86b8bf0e25aff191dc797f0f75fa0a4b2e91451cc7907d184e641d6997f2d3555faf285caaddfe95c010c2a7f233e09c2fc0cd30d644035269280527ad72e131b8d8cbe054a24cba55967f39c6a9489c088db0d634cc3ffd950c9f134e749e0520ba2c41a97966602b7ef72d49c68cdb374ca28599956d6a20863da4e164845025e7cbf91fefc637a03edd0b221837ca3a8214c74b3c2628ba2973750cbf1e9346d62d6f3e51f691525a934bb61ad3f980b28a03e02ce4c9b07ad2dc3700e75f0209c31c6b6c821dc056bc779c5adbe9b87274d3eef443cda1dede62e6c65903c5f71f995d8bd32d68b7bb073b34da0b303657afce0ead951cd9e8a1927bfe322122b56e5b3c7460ca020183194538ee9682b50013e8acc07000a400c09e315a921106f40afad02842aa4273cd1882f449cc1f7d472eabc049c7731907a9bcfd974696d2d34391048124d041bd0b42ccc886f96fde2d352518a2e852ce2adb9bbf47d7735aa3118604164d856fb9f2c89147d5605f80c36f5b3776369a9e27a568796b6de795ec1d29e30ca76b910d88429325e731b5f0ff8fe99f3ce3702bbb316fa52b30988b4a810fb030271d1d8c4add7d7cfb292866352de5fe3f4d523d88af27239c37699ea810bab828da8d3518ab4e8a2276e423d998ccc3049225bcfc9c63efa0df2179ed8aae97e745e7134a611ba72e1bbec8ebaec643e9cb30aa0bdbedf7d50c2d6cefd1ee57f8ebb5b74eb3674ca48412b5f9d464f94564ed9514c227d4af5af7f81d7afc80c438639193f6a3f2fc4c7a8b72ae2b5bae0bc70ec60393fea6281bac050a7baaefb89b22c8cf7432bbd170a9e4907bd39a0c57678e04c4ee401002e924f4ce2ec1e8a6fb3b923a7459bf7fa1ce2ff8f98003094feb4a3d2c039f484ffbde8694e145218b9ae379406c630203add10545f67c77185c486f2077124630f80c1765c45a95443537a31f4a78a23ff228334173d50b615f83dd640135974cb811f329f1a56cb5b9036a799a4ccac7499a05647e9940ab6380fa7f3865b5f3aa84cc59ef92326084db11d7d26c0629f2baee377d55b16716c468da832f2cb64de8f56e14bd60d537235bc26962cee8abef7022f686d814d7c28afe87fe66052092f0df179382742e708ab1e5ad9f73d3bc1dcf80a91f45350fe363ad5fec70b12751355e9111de0947213eddc8f26be8b5599592391178ad00f49279c03a897e2a990950529963261bd1c198215231794fb60db1b3391fae5 +0x63c337417fa6fe40cb3c6ae8b9d9092f4f3e7f4dde7e583d94f540383eebb0c5a80daf3b4690861c5b0e5b0d29fc448d +67552 +0xf94b0305ee16e4dd360fcbefe9793fb765ce25974eb2e172d325be7633fc903980929808a4bba77ca1f9864d1df3966b1d22b44b11ce5f7f11391d8a661a1af24c4c1397f6c87242d3d1bb81106e26b35e1d8e5ff5c689cad8eed9c85b2d03d2e3e23d59ee258d5a53fd3033cad339b5ae277a7a0282a778b3acb9d71c1e9100cfbadef793ba40eaa9e7ae0a540b159998a8414441ea01b427db8660b1d60da5983ebe18ed6fd31b5ef5fcaeb5fd0288a108ab67b9e7dfa4bee3080a203cbfe8c4d5a465052d8d14f991e4c8f5904aaa53b08088725f8870ff2c077e7337eef2dde65985e2dab8fe02222c001dae342635068852753c4541721e4b63b2b1e3ea6bdba6218c609a0001109dfd333e0724cf738b6ac9645e3fa0229b62e391e7f9f41b51e10ca57b437fc2ff6842270cceaa60507b76c11b91109ec12310bf4047020e226c6993a5ee04a21ae84f538b4a4d33a02b8539c3604afc834d402236fb1c1ce36bab115f2a1617b52664a9cbc040564322fdb6a0d3d7a2aa887ca4133ecbad5a85db06f01f3f899ac9881116590c2f0109e61ff8133efafe7ecb2c1d3795295063005ca1f406608f7ac473b23c3828a288495c1447076a46d435a39e0f05f88ead22fabad2f3055de11fb7e8934ca7ed462d543c98bb5c4c35c2efdceda082d90a49c883e08fdecca5a1c60083d116abec9af1b82ee137d6477bf920faf030fc227eae43476154a36f528642364edca421981acf300163adb267a9b15d7c68bd9ec894442ef2d0ace63be0f6d44b61a08e30b7cac6a448991f8ee8d93fcc93e6263062ccbec8b8adb363bc6384500d67db69b1f11a514e6136f99cdec8691a3d61bd00241e6d756f7dd203d26fe648c0af4cee8c5190ddcf9eafae091fda638bf8775694786970baed919b8bbd947a75b2df57e396e95da900b807a26da7d89792664d63f1421055aba76ed695e30b4c8d2cd43e0fe536b8031d8df1d959e02bd893cbdbb382bc0a5e1c63fb1f5a630ee83b4ee4e40bd0c450e52a3d8c77e20d7205b942e6b0de9faef961418581ea836a12ab1e3ee393958e18c5d0ae89480607c400e1b155dddd454552f2ece00972bcbbd53445f6e8f266bf46f0661779de3fd986003df8218cc8081d547e0026a4863eb26e20cb35a480e194e6dcaadd5dc44b35e7b2211274e24aaab06368abe26fa12c13f8ebe374838699fa39c9dc4b3b22f4dd3759185c3914e14dc3a0fef21fee2a6df4dc5b2718b63c73a5fdde6f4f67aa2bf4269b0e756daa75c531899c3f2d93c23d280488e67a659b47cd4b92a621411a121303503f5eed6e91a2b2aa7764515bfa56455e96d9fcb848c18b7ce858a0f0b9a5b8eb3fee9281507be3e26e9d4b8054ef8870cfdcea13cf6106f5be14aff5106622a71c2581f62a45830ecddf6979737a34873a8a15f4053625c5d05e567340dda94b7e0ba2154686faf43b33938d7e7fb16b7eeb66a212c74eb3c53d7db07092b6a10fa9dd25cdc9af5d619fb1059d8766e44407c5671d9cea8945ba0cf5c90eaf6f74061b70e6930c10e62eab29fa19bdba34e71b894e3e620dfadceb8a73d8fe7e582a423cba6e78d774e56941babd1db4f5924e51ce341c0889ab03b795780996611e3cd271e15b78b0ced49508fbee9c30104807c50682419d2f3ac458773a7e37e9ef7a32751ebc44f0d26d0a5c99388c6aeff35b3dfb82dc7179f8e35cf8008393457c25b0276bd8534c10e8678451b2a72d5db660ee91ee78a99d5fafaae2ed25251f731ddf4d13002bc7cba518ae49cfe98c01f7c5377c4cb0f9f3f9baed1ca676ac4441ae299efe55dadb9cbd19faeb0bc9628be73c2ef67854c8c08fe9b91e226bbfa6fdc92055b4913fd6dc586d017a5c01a3bc68ab7de7f8058f919e6b9610a40dd332f3420e2f3320dbdb34491c208d07c7ac839ce9e72cd3eb28d4db14289f5550b770ac30ad0aa53124753741e4a49c7f1f54a8435f375a5ebc52b1a352a3c0a6f20805c3185cf7621de3de7aaee8e7547da478923662c16fb5e1944876fa765c4d82f6d057723df63045e7ce66a211cd2e3bb3de56f531a77b492c0d7cea9efa2ea8265d5294a073c465f946f51a41739ae1022fa638d18c765222f94cbc6108ff403e75f10a48634009bde84198a0cc2a5e0d8e0e72caa80fc31e14cfb8e60f2713e51d1c1b5c4d0efadabe3364566244797b0276ed4383ac66c767eb2556970ee9c45fbb1004ba9500f9d0b3c58abd52fbf594c6ef65a3b701c6f9894dd8261c8a8242b6316a313de2c224aa056563baad224be6c15792965dc2d392769546b9bdc8cef5c6b33a6e6adcc4fe6a0edee654ab2fbfab42d8b34264fbece9b47e4d4b3e0c60170a5d905ef0b8993dadb63cbb374837f44efb7478547b81ee5e5640fd8b03e06c95230b87a50661c56c7126a96f9f37e6a28543c6395b37ccbb57fa9958bc5b0c7c1348ada4b8404c71990ae5fa3ba8c767fe87f5bca1f8cdf208e4e74c3dba40e8b6ad9895d61d18e4b55238822470e0c4eca7cd8457ab372cf264b11090e6500192a30f1e66df72ee4e656aac637979e2d90d163a843853909be3bd4bbdc684ee3193dcea7270a2b7ebab4322ffa9dae94c209885318669478dcad4a6ca4123d81be3c59f01b7f066148c8b8c00ea4a00ce481b0e657fc178507fbec9c14177e6d6fd93e61c9ca423527009916f23134fe6ed667c280aa24c6a6c435ba9adc641ec470e66ca0705182bbf86da533c7bff1c774278820f56eb65f72b058b6c5910e52bfdc813e05c6a29e1ca0fb41ccb38f84f77aa7c77237cc98a3d6e6e68787c470f29b3ff0ff144d43f9dd79aad4a2103dbcdb91d2852271c8c423e5a886bad9c5d5bd0977d0cccb33fc7da0ed642e3c4840c4e6e0b2a16e865031f58b479ca6b7c59c7e210f52a4e4a0fc1177ff9a5c3b2fb107508f56eb47c45b76ed4ebfb3dd4eb3fe8b1f3872dc93e34be90b89089ce63a83c08f95a093bd3aea7d1096a99cddbe0b249500bd9221cda0af2c7cc9d3e0cbdcbf180006e0974ad08911b3c07cff05347be52ddd9bf715c038b6e80876cbef828add0886b4eef5c9bfd699c0f42f140b0fa4226b5060561b144f5d5d0be41015d22311b88730d6267fd3bb03a8ea74ef3e3680df661a0921d06a3f2ff9e5c7f723aede14ede9668747ad8a00f1bda261a630bbb233709974eb7c2ff9c73d91a6ddb4b0144f85215cb5a8995175251702c617457c4ef09174c40982630a57e7b58ef92a3f3290812738796b7d899d6d332c4ec0a61f368bb208a6e8d429c144a3a5d0bf1e1da820674e7472ddc592ff73376b9fc83aaee2ad17c8b5c5abf622e1c0dfe109871869ad764e320abfb2585375e2354b17c620c67fd39bc007832d005e7b22ba058dd76a3e5b4b7cbe580254764743b74d18e0bebf7bed5bd2f4ad8fdd371687ff54f41e051001bc681087e6970f2d8531138cd645163ce184a73ed0db981efbfb2a3a39692107324368539a76ae754d6a429fadaf370cf9a3275b73b812be9e7f6a346ce8f2ce86b6bbefd093a99d685f3293b55c52d02c94f18e09113b77e802815cf90309ca2258a7c7396c95187e9640038deaee18d3009240d17576dd511b2c2e9e25da7c8d9fa874356fd568e896075987c99d69854c960e8d436951722fb723acefe96821023a71451bff214ed505103386b524cbff59519d096766b3c6bec6a5bfbb1fa516da48e90f86b419e9a5c23190d9ed0f8f78b48136159fae66afa22913c40552440455a1a8e0a3c23a85e9d2767024d87350a1ca67d86eca860620a79aa8bbe11045320f76b172e04e01f1c6a61c5ebf519da3d90d445680ab5edc91a2bda5ba12197873075da3ecaac6646ebe431d1c809c254d94cde9695d163087da874545bffd638cc969a95fc73fdc3b1d68c288b6f8c098acf989fd01d8c6ea80aa2d2c806dbdbd3b5a15a229caa3cc4211f17c3b2fe03a944bdab43ff30a4a537acfd6e9f6d174eb935b6c59136592dab32c7fa3ae1eb419293e177e016517c19dafcd7305394448c9fd16cb969c1f35e0d60b76ffc6857a3636af329071e339773f88b2356fbbd1527d29f7c0a1d1e20f70983b91923f55e746e3f40cbb2d498c11810de3ef4c13c14e2e642e314b7db3aeae580fec322ab1014e48f2ab766060a85f0cbd32659e9b028ca73ba4fc4761c2c652c74f1e7727d84697cecd2f2c89766b350dc3a8c0441cdd277587550d9e6f78b2543554b9b04e75671d8ad7fc6b0e4dfd723d7637510f887b7852f60ecdf72e0d33396560fed6534d5b7f015e89d27fec76ea6e42465d26f990825fe9751c6eb9f0c5d10b480258a105143bc16a5569788864f19fa88831486abfe31c2821a34ef955182730550e08a6e4c7d381199338233790addc032fee734630255bb97442c971bb335c30dbfaad6b65f36291a591d3cccbeb65607b3226cfb77384465a2bfdb62abe00385adda50276bf835fe91c16bf23d6e922bbda11b6f9b5365abd60e26cf735d0ddf3482a647a8667d7064d686908febbcc6a4ca0966738e66926983430a12952944dc089ec01e69499658c45651bd171cffee07fd8909d28e41e285f8ba906f9fdc2cd50137d5e7e098f7f3a3dacdd9faff25bfc180640527e0c97b0f87f6d2b6ceac519657d6c98b9fc9cb35d6ca189deed0591bf28c117799a7cf4e1b4ba8b743e4e427c528f892d355b5d3ebb9be4ef3783fd4878adcc79203e87e1b97d8ea625df77a2cd35b3d5b231747c1a4b25536a4d8b4e865505ef3652e6732e24a97549ef05932e0d9d35fbb5a570192dcfae0dc8c82bd255486e55509d00635e606402f398a7f565c9e09a6e7cc538c248519a9c308add3cf85905ce1823f97947f4f9938d5bc3dcbe47f6b256d5e99723d0891e50c6175aba41b011e4686113c49a9635704919d0deee9927b04cbc1ae6bd61e5a578116cf2baecd28e283aac6ad7515fddda57f0c0470a35357410cc057aad88bb1b4bb23627347681edd6a1af3dc38912aa1eaaf6e3c27143069839049ad46dee1a26e8f908ff744c43c59206305537db12ce7de7374a62555eb2d078907f0bcb1f436fbff2d65259a4a80c14418ee283bef7d815c40a6f08e6e130b5edf5e8ee7521c4ff5731a746aace6e3e03f91fa8f92b48171c9b1dca59a3b85125d19ba4c632673bb899d97fa0d936f7da0c55b77bc94c4fa374e516019af5eebaba8aaa8d05e4f999876f81213904e646311b3b91526333fb206b78990777c32ee93c4c340ccccd6c82efd7c66e466ddb1fe6a1e4671b688615f77e6aa99c92e516372645c77d0bc404c10ffaf97a12fb213e86ef77d361c6ce3f7400d1f2c29f99f1b55cc6744912958986296b2e6a48dd89671cf539944fc1aa05e61108c6911cf265c37a4119eaadafd6ec23c1c826bd5daee77fac948398bda0a4f75d337bf7bfd4246371d2bec5ba6ebdc3d2d1273931daf977aac704abe0e0a7e55e8db2b2c07cea02752801763fda18bbe009cce99c87ad6dc2c03573ba22798b8b39d7f69accaed7c97e45278695778c57d68a36f4118dc27304b8a8b002942a71cc5e0bb54fcd73ed3a1c52452d74b5d8cbd1b9ef25152639f8e09358ed826280b9a78a9672e0476f0fd99ee20e7ab8b15e55ead41ece0996315fcc1b6fcec4668656fbb4d261c2cd541f65e3c5040590026932498b32dd063288cb7df5c3c061b6eed796fadc8666ab403fd0cd9b3ce35c9e28c5e6ce210870fe0a070c1bc720cfd196c338ab02e97a0e952f94cacf29d15746bfbe0a661b7112204d3f31791245a1b1b02877b8b444bcfe66c70d2ce1e54714cd7d722ccdb7777696fbaf36b49cd1c0e456ad18659fede3fcb0cce69a1cc01b45a19fe58db8a0959acdef909649d44ce62fc5c25be013ee77fe947cc0fc74a2dec6de10e9f8f005bf226d0725e13bae2c305c1725c9c1666f1cfe6fd4e8b773ef59c73f410d184f8a95b20ae1d77a7d2ce4dab7519178e42888553064860ae70dd6f5d151497bbb6394593c68b113227ed9bc035deb9d005abd535eee39017490cab47769428d0200baccfc18f28846887b8a8ba94cc0136c48535be0962dc53ea1bd82179cde9bb85587ca71005c41d036d0c0c21964c5e3a5efa7da11d2216e086b91da9ce2f1110114381f8f11bcfcb8094346f60d70475282d33930a141954b392720e73c9a9159ecc562e32b10546b9e7396471cab0ddab75e9c771d7e4af6b0a298f04df0bfac8be2e9a10ad47dce2ae23ea134eebdaae7ba6249a96ff5a76c94813c89bc02957c11124d5371df5c190fae88c8b3bd4fbe67294cc77f3bb9c78da8408234f08137f08b4c77910f92036c74525a82b33585f55ff50a2463ca5bfe4c90c9f4001c39d1a323098a750c54792eb26cd405f8e8e584b6f408344584570ca1c381c7a31c6508656bf6b63786c61c1d72404c0651a82616e792f3a7eb3856f801569dd23a0b0988214e298034d3eaf7fd2febea4acdc299874d488dfb02ca07f60b29162d34550fbbf96582d91309d6802b6c215eb6c8b345af99543e56c45623e7cfeb60814970be90f0cbde14073d8dab5327e803c70895227c972f94d4672d9518ce6e72753f8bad31a7ce4741918828278a81254bee085e58c3395d78bf459b8a3bc17856e0b596cec3243d6787023a5fa5b4aba5f811bbb46506113fc33e63aabfe4136ce8cef62e8a6a56e7627e5a7225ed07839b43b315f8f04088276a65e0c750c435dc3a33b78a2b342fc87ef0f577b4b9636c10dd03fb927be0304c4ac2ee921b301f79e8103ec155df3d66a650078631a3defba1f4f96713e682666ac7a22278ea47207bbf14d72c4415d7d32871ec10e35886aa7f5ed8b8f9a24b5e756e7c7dc2d7a0772a98d7281d06451fc53350d7908d244ee9a871cb98046d8e42b01a9a68458c62d9574be9a86330d4ecc85ee649d16717ea72dcdc501d4f72b623974f491546b741ccafe1a4d11daad5ad50dd6dc9b19df82a546ba07153c456155d0cc3cb51fcfa656d9060c48e0a365ef12d7adab629795b72ea07952cdb9921d67386dc509c79be1f868ab1e46b75599a46ff88c7730472d2e803ed3d20f5c5bde3f0cca52e36433034711dc3572929c6ba7a5877e32ffceed6140e074d026d5e0e9010d21ac6714a1ac28c9d45a84c011869ce4a0232761144b66c1da835a54133f34d69fa90d4c7a9ed72f4cf994cc3b15c6eb048d26af4a4698bd2eb05fa01f488d6df362bea237250654c4d7288a935b09e4d3f76480385bbe1d95df9d81ad0df519475fe3e080499d81657aaac0c1604e1634ea499b8591c12a39997cbf65945223c029e2ccfc1385fe576c80376d2c7eca50ed3dcadaf1872942656421eee78ed38847252f548aa413c13514b73ec87f484e88a8d3df81f965d8ccbd71f10e8f71c74112d030b7e308cb5bcc08dc3b3bd85743f27f3b4bff252155ef75150f3f45a4a0137936a02a249f6812f1f08d98c293a78396975782b0488862f603f4849748ea8ff0114f62b162e44d3b22c6804d293bc3e09aab684f73ed7ebb62c548aedbaaeefe67cc71f53f55e4ae19efdac242871b25ed519b4acb0dac8edb8872d38465976be11d41395c4541127e108e690514f12c375101e9776f52351647ea4e6ba5f4ff264cb9c4e13bcb2ff82f838a9b69aebe21b184749f9bda79ba099867b9f16c82df61c0e0f7c0eacd3056a36d2b0fbba3537b0b326d1aaa226fd7646696d267bbb36240d3c65b06b3cd8cd55ade8c7ea374b77d6c07732cf8dfb8369229cf4d734b5920e6759487aa78da0198dc6a61852c6bc46a952ec6c3b0b4f6349b7087724e4d48612cf3d67ad9460f704c30cb1325a1c77440d4e24a8ad38c94133d7b8065479f8c150159eb97dbe82a5667241304606ed22fece756161ee0fababf9265384e0fae554579c45b9e720e2496d34e74b1a1cb8cfe3daffb9cdaaeb87d34e86e6a801117479ecfcc999663db45428c1b9a48a87c924c1de25563f734ffcad3afa3d8fb819031d293d33d73a6fdd895a1264bb229317b687352611f56cebaeca50200b5bba7989657544d84ab44fd30af5a922ebb623457559abe6c48716efcf68ee087ee143de3c125b0df12a51927ed4006675aaedfb3313560272f704cca4a5060b842608681794d4ccc04a5944002df8da42c9ce244ae2c31973654be204a4e6992de12dd3726d40b92a9ced744973f102c5cb4a6d27586170682a42bc49d92e15bebb2a9ce70c3d37b28a748fa53697848107e93252d4bfcba3ee8fb7fec24b25c90c9520f01218ecda9b8502cdf64ab40718312047f84c7fc90a99519df0ac2ddf6de40bf7ef623d1568a58a0e238935ca64a893913386014a06d635a1d4efb264479daa9924a7acf55a4c61f05ee17e4d75b618a906faf4a97bfcc0a4ff8437ea3228a94e3267b0fce8e0371f08d1e1f2e3f03c09f319be69d2438f01c0e842f3b62b84719910ed8ead1785e4a1d9256d07dd5a3e7870e2fd9260fd52d9aa57f33c0ca8bdd941b74d0f48caebba75ad1e89d41fa1178f06e744cba8129a38eb7b4c52928d7368a29aa7fa628ed315ed89c28ae8fc40d27ec961e9fbcb932271ee5f73de6ae7f43409dfb309685c686b314a58428a94d9cee6525274e854e58feefe16e8d0a772e00d3ef91be2e6bbaa9799c2a8e674037bf0ce8bafe34ff099df90825e4952734b374e331688e2ae203f3950a89a7eee1a6b1f0c1956f4d22452cf6c8b4f4963b9fa75f785e4d0ae60aa9198be0116080ea7dc3a2dcdd418b3cb032c1c5d2cc2c0e95ecce671414ae03c4af155d4c9dfdd497ebc79827e22ccaac4476dfd5d2f04666119b4a8b4e22396be010c601ad41ac27f09694f439ed3948b551caa5af6d90415747d059c22bf3c733e4e4d79933ba57587997ed4cb7cfae0bb84deb6b8d334e453ac12678af780030fa7f7768ba454dadd768ba2570d603d115324f0f3779b763dce59c7697113d5fb85f8822c097317618d002cc0294728ccf3f78a253a8a139960361c6cc06a649874bb3d02cf62c3ca3976d47535220c64e3d0f2cc8093650cee51d70359f6575d00ca078e6ab6686e285a5a04d573806faf3bbb680e49e2fed51797ab9249f6bf96af625d5fd06dc3c614fdfd7ede0d53b2b25466281015e5c101cee42dc7fb46c2d5edce33634c619f5160ad85a40ba79abf5e75627866682eab0d3b7102ad78f1d7fa7f79d1acde1079f2b3ae7823d1c3cd29e441f55cec6a6da32ff08cb5ccc02028df979dd78fd609549e4dccbe68ca6647514b2971e920e4412040c88cc8aa38e97d213a850d3c89e6dbe81463e31b15473ae2574df4de8967bad6489ae30c9cccb68b3a1dccc07629eb01d18cc74254aa0fbc313985efd7776e257f78a283c6333a4a0f0a450e48be4a2fa6c18bbc9ed05e1d39dd12f1590098b2efae9d9c4fcd76e24be30c828be477c5e68ab6f66e6a9499c391227f8893f9132b951ab293fbdaf8533099a9ba5d02692340cf9c4dc951c6710e4ae6d091ddaa85d4d0632d3ef4d0c76b63005e88688def9c3bfab78cf407c4ace2c3db8ad4fdb0d6252a961753201b0bff12e2f728b89df592be362619f230e59093040f6d812f21af754905544ac08ad44de219a15dd0d55a433415220a4840bae0e46005e9434fc5dfb09996d54a70693dc66080f20ac3f9165beabaa46d56f819f75d4c7aafa90ed6874499443b45545f1a7c4629be3a05c3f80732753290aebab7279fd9c6c5f0d62786ba1bf581fc2e58cd4f496dbff6c8a30b27e11a76655f9e8f7e6b2b4f026b0bd097b11bbee7180bc42af59bbe4290d757197c9780a25527d576c34f7cba11bec2a0c810449bc89e0167a2bacd7fb92f8b75ac2c37ec57ed9a076696079e46badd73b565cb90aca9f563c56d6614adf608caf46b14b9b45a5daeb9a14815968a717f0daeac5c409a20cdf2060097ebe56f87e9b6af8116f890db50f3e6b67d983f21353d7f5500f903f4ad27358fff48204af0a150d8dc32c42bb1004c07588e8708d0a4ad117a412f865b336d5364c8bb72adbdb12790a3781e5e58e07ed3b7f9a44476ce2818fd03e180dd208898d1a1ad756e3903c0c51d01bd505c836bbf077215264aff79a71194b266e79617ed6339ec3560f3e9123394529918cb8d0e20f0c725bc0df8b9e91e64833b127e9680c68695b15e76155c34b2a59d9db41fd6beef0799ea22bfeafd1b94937419477ad1b911b2c9f438e76151d863a07d8ea92ad14e5d0a9423a7af5c1d7931947ac1ca183bddbce01765b8c4d3f34a45b518c3326c8de5b98f9fb38aa054e15ccaf63e0876aabdc61b6799601ad511a93d962666e49511ff4e43883bafdef9fea278ac2e54a22312cf6d91c80f818d1482b1b303491b05f20a23bbf3be4fe1e68bc972ee484ca3529dd81071347113242efbf78bfc78382e2dc0cd273e503fa0f17940bcd412b5122147b3d02c2c5a348cc5726581453f0033ab1a6ab25879aa7e08843e8a8cbebdd43cfa89593bb8d246aea2147a0a6104b6334212acf1268f8be7cbd7de2346d2411832f14df7b599c728053d492074c81009c2d3a092acbc95a7761d416ee3dbd26a1b9c6d18e6d798c21a34713fb0b6fb8f2b121fb592be35c8117356d7fc5702b3030f48e7b33825fd6f9e74a0cb6db343d9428cf26f10f6ba2c7e70f716b07c8397be641ca118194a63dfd60c1b38e1c85c097aa1983132fe35933234c9948a4c382e41004713cd29a57d17ca26b5017d31cb6b6bb4ab7524bb561d196b6fd68d62d3623b0ba7dc2b930abc73846e8cd2e90cc1b93aec579e3c4b943d92aecbb7a6423a356540a0c0baed3690aad20e79e0423012a18034eb26c829e9c5cde46b80ff4b87fa7ab5798ba9089a106be0d2b60018f06ee3b79c096060d68b69ab19716f289b21b2a4b693d2c4f83ba8be6de8cafedb19933a2152b8bb6c49feaa32061623f77184e91851dede43a324f1bbe717544b382b470ba115ac1387f94c45ad88f015606ded1f4441c704ed5d253d3f59abc9210858bb632bb574cbf61bd4d64c0f8d84da3b2bf98001a450adb372601687cd8aa709c1174f5a089c5193601eb3c4c845565dded03e30ba93b346fbe7e25ad0cba3b4bd3c152c376fa84d67f564c24e286ebfa866c0b6b01cfa3a2a4521a76b7a7af3f050018e89cc66946ce8e38a87b49ffb093bac161d62ef178de678f0060d99421af1990398192922ef67a4802d60467a71ad74d15afc0e69b76a3cc728fb8b298d7f302dbafc4c5340001c4577c21ec8826aaf7b014ec49b073f018f5cdacd04d8778b6f9aec6cb03f30df3d2f30656fbbc1b075a8d1de462de35bdb1a01db8e7c68ff3b904fe6c41d7851e98c51d6da7e612c43aa3b87d56be5a01cd9373300f9d2003433bd66f97b4508dd479ccf935ab777879dd26dd371b462d722b16016d12142cc0dbb49eac935888ac987dc14c1432693ec4cfccabfee388c7f26ef3a83051b7586a02bf297b845748a9978e95272cdfb2de1b115a6e185cf56fe4cd69fcc0ec3272279bb575bc41d1348228b8ee4b24fdb67376ee73cdef232ade5957804912777a8bfaf988e88f6fc2a5575c71787f46d13dc10c15ea8b7aacc55d1bc3d5724e0b96a49cbcf18a49da6ae329b79c37b5b9e2bb5e5d5876227c02a25ccd4a55e0acb0604719bd7788043893c9c89d9574f5cb2c8c52fdf84222fbf0c3a7920155e541f7a2a835a153c87830e1ac65e1a80d5fdc3efcc25b02271a0ef85893bfd43eb1325470414fd3af90821c6bda637c8905921b648fe58b12c6c6a2e837d6854068d70679cac83040e9511f0ee66216f22718cb914de0056b66de696064909172cfae5fccb6559104eb6595 +0x025dc380479269ae1739ed9631f7606fd2927f71893ad74ae864d6af7d14323be5fda67b2c456fff98387239b8eb3a13 +68344 +0x0f49cae81c8628d290d4813a453132162575fd2fa5ccaf339069ff060679ba5ac4561d7fa6fe827c69c3405eb644ccd05c9b24ecded86d512dafda76b66dd13e9f3049cc4e5877982c39a9c2a81272a77e4307b339bae976f6afc4f96c919752294016761e7c4d4f5e9e850e23856bc312d46f2ac05b6bc874d285372fcd56bfe9ec4c261e524cc889599cea3084014ba0b624fc7aa13a722e80e4da070954ac689db28355c3be2c34d4b6fcd5f87a67b150eecf6f75a09aad22ab87fc2ddb422cbc1136cbb5e9a2e8769bef1cc71f41cc0c954ca8c0e369771ea0e8172131a8bfaf31e6881117532ca712690dda38fe7951e01a2c684c0616de8ca55fcd9e07a9e0da3c95c08e6688cfe512af190dc9408898e10357239912c83666dd1a6c8770b5d4dff9a996048456da940a6ce5c8aa17854b3673b04cf14668d297eee14f9e98e679bcb37955a9a5ba9426bc0a233e676ffecca63a453dbfe89197334788baf0daafe7c87d807e224cbd0cefc20384e01ea2cdd60bac7d9b7f4ce5cfe4594d25762b80cfecae8c365ab4c3ef569005ea5ae042ed69aa3a41f5ab87ac01ebde9f839592af0c065949aa2453a20ef148eeea6032d29d67fb1b125587b0e566f5c5c894225226b16fc406b3c5f2314fd65297c9a56def0a48909ef3ecc5daf11b010fd13a9f81d6560d340920c609d1358029c3a3a6a6bba908602cbfd226b4d6ba1ef4e17e679e948efccf6c05dca0efde68f835650ca4a7eb21a907be12d8b159bea420d71e31b3ae28adb199f3e38cd61b0d629267eac9a2a911cc73e6853144b789fe92efb63bd47e4af86996c392cf0cad331500b89893c00d17d8eae2e0e4d14c83982255b26ac84f485d0c688b31017eaed61f349b272e45efd5661845a1d495b7cfff38a2d7cc63aa5d9ff9fe63c328ddbe0c865ac6ba605c52a14ee8e4870ba320ce849283532f2551959e74cf1a54c8b30ed75dd92e076637e4ad5213b3574e73d6640bd6245bc121378174dccdaa769e6e4f2dc650e1166c775d0a982021c0b160fe9438098e86b6cdc786f2a6d1ef68751551f7e99773daa28598d9961002c0b47ab511c8707df69f9b32796b723bf7685251d2c0d08567ad4e8540ddcc1b8a1a01f6c92aaaadcaf42301d9e5346335922db6c19f3555fcdfdf5833bcfe13f6dabbe0c8f7e41f1a16877a7bdcc06e093acf062b4c6dea828161991cfd4ef3eb3bcffa76f7c5d9cf4bf026c518bd645aa75fcc7890214ddfdbfbd1626663c2538665cc3cf1f6e5cfdc868b2060d44d1222068d0f33f984fd35d6876dc0e6881504a7df80af1f4b04117033f57dad3218f3ecd35afd9c99c2d71943a5d27e4d19fabbbaabf7e7115531d7a6aa38ef1a54623825c0b6b3931808ed8d7266d41a47b3c9e62692f641a986e26aa957420eaeb7130ca925e57be6127aee3c428ff68776fae95848f5e2ea56ba0958a250150e39a40f7d13db58143be7ed6b2f58eac18a754da8e08cfdffea860b21e3be375c3114b6a5483d3289cc5d1367f5d7fddd38639980246299d08a6ff66be0377c80e78a89878cb2122f0c03e6985cb337c3c8ec5647da20be457d9d549d6261ed62a32f118ca7e2ffed4502f0672c95a05b82370b64cb6d74460d37ac2131e491ebad2ad51c607601abbd81b93a2c24418ead6d4041bff2c4bb8065875e156971014ca45da080162051bea9c77a2509214293b57e457e57b58c1f516cbcd698938dcac5327ed06965c88ea1a490e0eb48607a384bd8cf4350a13220e3a33b1801786db4db201518d7f67592d8e22273bfd1ab1e32627b5e9ce201fd747b0e92c3a87e9ae0ec1aca7ec4bda4e9dab6498d7b6e8eb84b4b51a138d30ea8ac15addf07449eca4ca628631aacfe61df6314ba480bb067fc04c46789f27b069e19125f7c09e920a780da8de18cc9c858f07c4f1fc9adc6db715ef7bfa46d17bae1684aee13a26a65718704ffa32ca4af262b53e7f1ad5d5159c858c0320c61663758a947acf231ed41d7d15e3a507f4bcdc6ce8acbd7b5c783aa9276e47f6e0be18a836e1a01fba9b874fbe4985de094adf8c9ef9f5455a3b8aaaec701efc612a8a5e04ba5f653009d038a7b077a50f28d664afeb54cc54ec073b39dd383efe15452c9c697fabe5aba2f870acdcf56cd36bb5c9f54e68e3163aba9dfa06473e2ad3844c73634c61fd59df97933857a8d719d04bac64a37b369fb9875b1b9da7c7a005c36cccdf2b8b7f8e8b081c4449a04b54c3751a1483b990a89464eabaa16855116fb9fecca8b28e65d96ffb33d5db7aa3bfe3e134a33bc81833cbe626d1a94d47cfef7bad701f00f5e15f57bec3c5424d9f8d5c7c4029a078f3e4b05aaef703095281e5fa083d61df614aa43d9a0a1cd2f0b5de63e10fb45b4353bbceafde10e695f5b02ae77a3b52a7c67348df2684a4420209740c5a7e2fa07d7b1b4acaf16018cf5cb87461f81043374768f986f462120640353896587699d67099064a1ef649835e3b55912298b22193067fc7f67ccf17251fec4ffdc0adf33ef068d80429a696372c0174455c7319e8b9e845f554f7d92aacade3b88e4b582899f8f14b6ace9c79f2ee77dacc1494aaebb9ad9b9b2aa0b363e3fe234ff089effe2d225f4a1fea893893384d6805066c146a5b33bfb62271ce24fbc8764becd7a58bf7ba3819250765862227c0c303aeec80db682348c2c853e77902a1ac1582287bcdd6c558c056f24dc1f466ecf0e5bc839aa3764106398db1d28c429f7871ef93215f724d410a6740843dbad172a30ce93570194d6147e40ab4afe9a4aa197368ae9ebf652b944d05055e4d1eed59662828489cbc5875ef587bf8074a1f0b4c42a22f1d3ee4771c01b1f08e33e59b50d6efb7711c70361831b4ef1bfe3ba9e2d7c88b0c4900454cdd267f0eaeefcb456bf82726ec3d2af71cdc1fa84fa487cf9e6e2d1d02036167edbf643eee607bbc6dee222eba23a6f4707df42cacde277aed2fafb008626de5c9f94aaf80ec2f4e331e3308f4a84ca8e306f729944cfb7d6a796d75baa1cd5ee8608cd0e4e748538214c4463a4f7e7cdaf3a31f9475963f8cd7f0ce9745f23bcf91c533b8e66964a17e7056d98ddef8cee0828f3bec6a39dac7d43b2cd39ef4e5e96e584b6e150a3797a1cb70f7c095354a0fe8e915fa14cac5724bf9bf0612d1e3f2af3ae2bdacab0ce3049ef1e5eab49cc5cd3a96c828d35d75617c8cda3e0a2dfcb8f5e8c5d4725abea292209151b3552eac8ec3571e8afc382c23a18daef513e6f60ae4e01a33fd8f2618e85572c81fb4f77430194e682e44fc9db1931e39223bf6f87b8ed65651feff91ddc4c64938f34e8961a130e160266339118ce42cf5862c3cf114a1501468af7b6541b4ed4d64022cec617e9d3e56e08465cd9976fa3016470a23f3b7a166a654037ed6fac981c2dd14ec8fd22541050e12e7b67dacd445b50b3f5603857374aa5cbe951849c6f1189fa4dd56918f4144ad6db3c779ed2af598b940ba3d19bafcc59387bc2abe2d6dd11cff611f9c15c699c239db0dd5468717443c5234b3c9b9d280175d08d1d85b4dd75ea83bf202e26c77813ec54718f82b42a15208fc21600826dc8140ac726f8a468382632b89469a1042594c9d22b739472830263d629ddada4fbf8e988bf90afcf68611a32951a70ef5b0e051f442c5c4397319020da1cf2cd96e2f40a5a6446d3029e3e3539217d613dc3d0ffe39554c4da15de4733a59910213cf1f2fe5cb09c8f44676a89661081541bf11a0e96c41ed31614f43c60ea96256da9ebb460375197bb5d788cd17177277f3219d017f3780b9dfccefc362d872adde49b8358211aa06ae8094b4be76c3e5559a42e002afb08105c7e7b0da90bb6f46aaa732cb72034bbd0c2ccbabb8822062f623239b1cf54d9fdabc1cfa748531a02c18cc4418bda15dc4d190836f25afb7cfce3aad01b775ea7fed7626f6988b77688d70807831be0d6523a1b9dd36e9b0819493ccf07f709211ec4b04994dd338ca65be1502f7d85847835dd3b52e74d9a626dd5f5bd5e4135b5909f7df2dbf60dc4203566b78a6aae68143457984c7bfc7f565e8b62336da968441952aa0968c0892fee8f44caf81ecadf0a38cc258cf4170cc0d921fff746e1e60511e4f0f26f9e8ff214fec4979b459c462717fbe84bd298e127204946d4c8814a03ca16fae0aa482b3d0c00b0ec8155d06ca154f7c95a01abbd8799c21bc41ad26d8105eadc56637f519606a9da2711904f91bb2035544f05e27f77d3e27ebb849a3445282b4ae7d89ac65fec2ddfd96e180fb5ce586b8bd6e0306ce1f39e6b48d1095c1e952ddc1d5ec292dfad50b4520e45cc66fb45bc08fdc1ff5414cb33065928d432e2a74b36e6b227ec2123aa247a598751e48aea82825ab9940ead19a67bba35ced9623b0a7abfa67a53ffc3cca4736ef7dce31d2cb7252109a9ed28117fe705594403b483611198f0098d0832d4bc0ac0aaf85eeee347bf1cac33652dadd6ce3be935be88e5cf85b80c75803e525be2151870b4b04feb1b33e126dae34cb017db909e62024c21f339245e33d965797f5cecf3285a4437beb80e6f8e1ca69c69a303e6a7d7df306cdb18f02ae9573e67ffef2bc1d408532f11fcb689be01c34bfa09b696f0e6247706b2d46c576ed12464e9bd8706e368f6a873a2d4b2a64d454869b63535a9259d22b8b2010cf35b3ef5a25482d91f9e9ce33bdb76e1dd61dff6ec8d8e8e6f596497f331f2ef2d033b18e196bb33031ca82c1b0a7732ee27a26a5ae3a9e482eb57ce2bfa46e766f2a537702b39fed60ba2eadcd7e08c20c8150d7b628c1d2801fb2d28b505dee44f03b915bc0420e192128446e9b8d9bc6cc14716b04123aac4da1db10938bbf143de0699f125836cda816421e907000a3a2c81f575d0dc505b7b07909ee666d3f6bd86c371a30dbe0b77f1357ed5e9525be021de5a3f3261ee66518b1d17c6d28f28a15de586a8214c7a934a512b7cdcf765919a06980c27a724656b2ed3c53837a7bf2df4d73bdbc514b2270910a1ef354137f123e351e8ac3ca9f778234a4b15c348fd479dad359fccb6954f8d40d53dfe7daa5626ebed253687f9a40e3e555203a49385e0e877022a085ccba941d43823ca8f496bc17e3b9b6637599d879c15f03bb757a8d3e915b70e44246c8c354e398566a4b9bbe215f1ad7b40d70e698710753365fe56d301fa311503de0940a6c718f80e19c163ddc3c68b01c4bb03cfeebbce56e9597ced7cd9960f08a13c6955ea0d3091bb47b896182f436c77b4170f734fd372c42d02c36f90f1f13a73be6c636db22c91d7d0f40b31aed828c284fd077f83a07f2e685959cb50a1bd2bce93ebdf3bef2c5b4d640758eb0fb776403fdd260f7b73c746c6010fd52113adc052ea2c73e4721b576f746ba2190d18735d5f0c1e0b8640c490cd2428782241bd31c81c04124c5e149bba337aff10f044dff3f85959a1e00c4127d1f0aed42eedb9ed779381a26eaf7341781cc8aa45dc4e03b3676cadf0436076dfd5cc10be7771c205cb3a5d914e7c7201307cc2616332f606f24c90b89476221781d9bd3784e1ad8e514463101a40b3985d24408a001134b69f023480250a933e99ddc5e23b9217d9d0a79e333a466d034bc60b09db75258e18957f901ea4301fc8e10f07c50b69afee6cf541d616090ba36d0d261de53155050d5b2fa8cd6381b4eb83ee49d409d8539a4f841839ed780d1e2d28eeeac0d20d73afa7eb0b942b050609def076611ca83996422636831230e35359750b3aced9ce633e0ee929e664378921e278d7439552b1c4289532a1b5c367ffdbd0071111265e3d39ec8b7a7988ebfd4662d514c1eb885247df61ec43c7526347c18f635c838aec969e22afeb0017bb44bdc258d50f0333aa9b7abc83f5facde2673a8c62eece924a86564d62a7f6a2061006d778c30ab17b51e4d91d574884d4497153cc6e1278802c901b88866efcb1e3095953118512df89070bb8f524d244ef9a82420c3ee75e1936e202a4680f70bf32a60e005c9f00cc4b1afcd577fd5ae21fdf6bcf3b250cd4b26a7b0acd25692aeb85509877a006a118cd9301274e40a96633f0bfef7ab3e56a7b99be8384c4ae9cc0c1e2be5d1991d6ed22811e0d1bccd94578e443307bd5c8dd04ca7474aad3ab1d0ae51a1d5f23ed42545b428216d4dedfac471f8e8b2b32576535863f43208165d3aa712a03dfc594ce997df55648dfc734ef6cdb0c6f12b36408a32cb61d865fc337adca2b4dc6ab3b43b6ad06b043c6b7e41060252acfb7a84ab2822c5222d58396b44600f6594f415fd5f34c9572a4de2ff565ffe3d12cda039b8acc48be8dbbcf70e6a961e44788f7c10f507dd42950d70131c12280d9a13c468cbf86c05112e8c7f14e16d15cb91264493bf3d11db5e41e0e946f4488a6fc9bcf2c9492e730eba3b1199e86567cb9a5e8357cd147b75f3342a05385ff914b829d3cfb9a17bedfeb6c30806dfd78f36c3665a23c70fc4f28160c55ab070931e33c164242ab64cd876bbb44ec1856c8a179f4ec7a602cbce5d201fe1e68b6b7a6f5e4f1f169c9bc5ef6e3736d71bd402dfa0ae2f3dff0ae51bea6d446ea41e4b310cb910e1b96b45a54cf9457ce5664f601cd0d0fb5f02e562224618c5552c1f2d5f5a9038772be62cfa92f12f8c93be5d668f437a9d343db45a22d567090544b8c8ac1377606e05fad96cc06b7bdcde2c00120d18541f6c97049be0d04a4a7a77cb16112affa243737c0f49bd2db23d608c117470fe44e06eb419e1ad935c2ecee9312fcfcf592d3b54f2e3913ca44a7f7cf63ff1061537bfeb155e3b7ecab042a585b5d239f311b6f6b03484032383fd3548b634f630d10f1c169d266716cd57827c59deda109f7ac3afa3022bd0884e47718d9969085ae0b9b644ead6b0d492028d72422a32250b6e79b598111bb60746191cbab90c23b9564cebe568394476985195b8a4c850cd3986e2b25d659bac9397ea0570ccca0d7472d8c27600bb69d6313a8ec4539154c76fc0fd5b5eb792c2868c062acacc6196a0b1fe9ab798002ed4e741235465169a8cc6b5b557887e556d69394176994a3f5efdf630be78ce0485128c2c5b5aa715666a87d6008cb3cea5081b5f60bf1bc1162345f295cc2819fa42ac59d8d07aeaa532f047ba42d790c5ef28cf09bc7aee6eb86a3ace00a2c18d0e4e364d64f66ca1a67b7505295e3e6894ee2ae1ffdbf9b123df93d7b4c28db5cbce3c3986ce2de43b760871cebc39d58fd7fd7a27b38585fc127843670be11d01c8f61dc456a0f5789c5c80a17615c54672b14292961475b7bf528185e36e2b56bade7a9c24584dd44b0ba2302054903f4ae0dbeef818d8dd12dd22affd875911106fc08cbbd675d4fe7056f92f78cef0dcf6968b5e1557d2c95297339ebf3ef766249004818dd5f143252f6b07e4ea01857d13063cac5b4f5f7d6fbf5b9835402897599219f106cfa5b49c145e4b79d7f0fec1ce18205b9921980ca1c884e4a1d4229db3f9a280b692891d7376fee6ea8bc633717513e146dc3d0e994a17c582f560dcf88514cc5c963d34070681c9bfd29dd86ed81984eecbf6d5f474c3407a08ec87ce50ba52183d2b605d61768ace41d03134c593aee79d401341bd19eddd8b003eb3e125ba7fd3ee32d53c3fb2ac75f7de51a204d7c7bc93170fa77e3643f8465227cac95dfa06e01c0ceb5fc9d0db8f204411ff8815a67a71ccb872b243dd4972b85227b52d42cb9c72e36948b1ef00a79a79e64847d760b4076499da43b66400e43bc3787023eb3485d8ceb7e62cf6e4b36e4b80d4ebe04e2e205626c9f0309d19dc1ee06906d964e42ff28fd411dc682d43b1da434063b0cf903a104d3739a7e7a7bcb58e8810adec5d9749123a1b9276be9bbd2971858c5a28a83f53d7e9a1cc430f3047042b902ce60f6c07024f040e237b91edfba0216c5e430c547ecb2b462299192927848c145ded715906e13d8216d401175b5e1054b57cfff5884894d3caecb8bb5ea622412993e15eb47c9f410d37731bfd09e9d1a2c8928d70fc8ef3a06c9764061ad311eda544ae977ba9e97b1870926d5e1e31bab85ca2e5616a2447bb4db9da5d1f24fe8403bf3c58fdd9e4e971e138a51e1361bec6cc41e1c6f4253b442337e776f8e0d2b706ffaf0ba0df3d0faecb9979e54c6e5970132815d1cd7f0346ab447afc48f3d72c7de843bcce85a241a285b225bf299d24d59ee75ba4f9138aa0ee8bad7b79dc86139f46bc3755c2406a0447635e82fa5105a0bbe0403bed75b550398b1cd74faa7d3e74fdbe2fe8317e8faa1c8f0d098b2fe7f40e33aa098e5513f523819e991ff7406f1fa766ac8b4ca26abfe51a4349b0df3033d3e5f03b1ca45ee56e22514d3e3f958097ac57b470c709dbd55d200344f0e10fc5522a02588bc77f272500b8ae9678cf1363a2437777f7eef428385e38b796e06c811f8aa524df2f30f91fe8c4ef99698f2ee4cecd3fc567b61de49118bdb2545df5692a9f2a0694302107641da567de8f60c7acee88e2d49fa0cd62715dd3e9fe116f6882e5ce3c993f6fb11542649c889ba37457dde0c415534b48bf227c0fe187cadb1cf29696d096b13648613021ff5200ab95c93fa4bb97f69a7ea60b349caad3e8a9db10217ae9648a236c3b1d780687b924b56004f70157fe2c4301f6840d4317d5f99b6afc8a021332dde5ed773b7123813cf2535c01d7ea34a410d42c2170ff0df8c8d1da0b0267f330d0f07163858137ca571e5f2bfec54423884c1979e5f4de33090497eefe0ef10f8ce4fb010d48b4d81ec474d25535c75c08dcc0992a9fb342dc61ca985d6e98b46a2978b6a0f09500a9f441b743a23ab7f2f4b5e1b76629a2c387c6b9990d66d9f94c7ed6c8ff34be991c2a2d72a11ab1d7227df604ceadcd5ec520a53971f7eadaac71f3edeb307c5caaa2c74aa8e3f435e46d48ab6fbc4cfec87cfdc722a8615ee7f690984af4c4753e5ff7342022d99fc9185c039fd18c34001025ca9614d8268d812f50751e117335a63fd7ad53ec653f0392b5f58a158eeaaebfac52b9a9a1fb86429f10090dc72f0a23adb6f3a736b4c3af3af7427370069d2df4def37051b09a5cec9231f3e19910351ec38e9474d8bce3fb1ba72077d25fe33c917ea6c64b11e0b182457e72f24cd6a359913eb00973e37ee9049716ec8b81dc20a7c77039a1709656a007cbc9049af3ff87f068c56d205ed5f751dda3948c5bf30b5cdffaad7ef385de2a8c9bfbf4691bef641fab2d1ce3690bfb2c960f65448f15c1760cba8e61965c4115c987657b4544044519285bd5289ecd944250af2e5b53bfc2ee4d01691ea705f8003b80b2e2025b699dd34f7c8b4c7395170cbc61fe4182572dc98a62754ac3b3ae8cb89898c6d3fdb7d27a72078177bfb2982f97de6bc39349d48bf640b414d942ff8fa4cffdf881e59a6f3e33ca346473877b28823efe17a0e2888cf77f73c95c1878600e144396a59f803986a34433f85f21ac60478c54e17802af00195b04584c0542c9964fac7656700c7699219eaf93b59c1ef218cb7a097cc4f0fe553ad61eb8d589107713e653912f9a18571507a9996014db0dfbe91b697750badcad4404f580d30f549d641b760b47ad5f37af156fa0c87ee6569d225b3e95bb6c0c30a35ded1def52898e12913835c49466f47b8ac6c03a3c7c24c2c473369c8db80a5e5472f03d1b78a2ed752ebafab13376208d4a92b97acd1e5137bdc9babc315fba7baac074f9db60e084676dbc101db2c8d9c496691bd9d8621786b5b262189f3c35fd2533882246a0617ab4854b9628c912ad61b5ba22e189f666810029de574805f284d5310db2b17ec125e2be2d4695aa6d8b4bb028c81d56d5b2107de306828e2365e6aede33784ed348610253aad3139d5987a85c0ab0bb3cdf8fd8d72b6010f85ee43c1447895449826c92a9b3f5e0b572f60d4d17c896346fcac51b446540f9c66a83506d59116c7a81f98ff072943e5e13497c7de96a34c95dcd3fd00680a032c5ff03235c28e4772da186eedda090816c075aab87c9b692b54bb55cc872743aa309bd0826ed1a2eec251f1d9b8874636ca1783f181752426ddb0c492f78ee347e5dee6a3de0a5f829eec8fb30ce22aa91b255973ee5605ef3f5a533a01686b6a44607e805a5f0798389051631e4539d77b4635250b6895ec426209aceddd647d17ca9f0129f8219756e63dd136d6fd29b1221eef1fd35b86ad70efd0031455e724c3520e95fe35e7c1955ee69cbdfd0587621cb974bfe0254a2b0b8e8b36c61034f49e8fe499ccf04146b9889723c1d4c3ae376b5053aa32df3c67cfcc6a3f600e058b6c5ff06d199ea158a07130d2ff2ead78eefcb74313354a0b790fd9493f7c9d218d4e2ca0cc9f4d4217700bb7ec9008e628c014333214fefd769caa6b15446469daf974ed710df37fd3ddddf805b1678a02e39200f6440047acbb062e4a2f046a3ca7f1dd6eb03a18be00cd1eb158706a64af5834c68cf7f105b415194605222c99a2cbf72c50cb14bf2004b0574fce90376a8f560cb58c0168cefeb4718e69b8db3029c313b54d7bbd86a936615c2704615d5eef2f886681bc52ea8734917e15e89a33ca8ca66955a27be538364824ccccd0ee8697ca2e78eb88001bf5d80c4baa281393fdedc7ab5545e03f3eda6cf25e0a66a3ac468befdcb869f71d29b9630721eea7cf500e84be2cc1d2e1dca87e0155efcfd5c326ed772a4ca3154d2d64e9cfef8c6b98e7e9c57ab17a87147f769cf7b1907d08a67aa426d2a8440c115637783bcc378df9e15275d7be984c9ae41739d37109deb49e4bf3238d112d0d42d965fdef9df6ed744d675c267c4aa0cf5a637ef7e20df86254da66dae67ac82fb6de5b7b049c6aaa9e96673a9bd73a404cbdd9ac705d19cda723c4182ab9eb25b82a7dfad448198c2d4b21835eba103ed78f0d171b96c0e82d1664ce44b31d2cc6938cf374c0a121e2cdb1882bbdc9d1e22041c04c7f94baccfa6f849e30074dc85fb0ef4eccac72a66640d16ba60d0156b99e3069e13e4b6d190cc29ff8518fa7d71075c936df855f5cf6e7873e86d719a24ceedc8465a3f9b96411afd2a2fb4943d50d4dc5e464f7f8fa51e54dda5a142372820b30b2cb56239ef83687a29797eb263f4240631754827597ef9bb1932f84387560adccca6e9fe3009ce0fa6d79162c94117003a460428e420cefb488530cc74e41c25da827745baf4aa25285d80e0f93201d6d15017f6ed9a3128a436604479518390a6d6bec2d90a69851e59a19f6c5d80e497221833ce41ecddccc51b4e0d34cd87d22214d82281989a097a98009b0a10d3ec1a79421ece4e65229fd64b88e45685ecf31e081010c3ce7a3eb8b72dee4e0f40c7bfb45785d259364515cfa516bb0547a82ed53a2e57acd0f4a8156d70750145a8500cf10f154488534e3cca1267a082dfebc1f930e0bfae5adace021742546b4adeae83c0839189290435608de8c22ef8c940e5dedb7172dfb52354691273121db03b7850a9eac954cc2c10dfbaf49c914bf4887ec46cced1ebc80cec81e7ea9f79165725f49ab9550a93539e5ab25c17f83f499717fc02ffd32e73f80d1d454e9dd198c6f02be9b8440d91204485fe2b3293a1be62b9cfa80fb92232009dc2b992ffc59a3938daed0ced622c14e9f3199f84396b21207578f61aa01128e3e35efcf366361c3bfd61c9d54f182848cb8193a37923dfcaa4c12aa5762bd28a17ad404ee321259fd1b50f37a05b0b3cf7e1c353e95efb12ce4f11fc0cd899fad032e174c4c1f1eee86541970e8b4a3108b88337e2930f8372414080ecadeba0bd7e750793beeda3b1e10575f22f41cf6e8477a22d5689b701664ad68e1244263fee5f79d87e9548bec6cf46f39dae6299c3f525022ff6081c1c755f79bc3005c811254dfb6775687f6513ac7b7cdc852af5a0530965d10122d264ae37f23b99f6754af6852ffa6d746a56f +0x810231a63c06bce7f411f1b8ef106c364564a4b90fb9b9b275c0749ad3c83983afe2044d1844d8ef76c03a1acef7c6b3 +69136 +0xdb321b040f8c684bf2fa16954f6d63fd6967d8b6355f1f95c66714cf090c1e03b27ec07b76f16baf7b42970a0dde12f192e09702c079a2990d95839967bbb1692635623c3f725896baa8fe0c66bdb34bcb68665b60946325fe056c33953d0cb81ea128d0d0d8d70897747421c2d4f111fb486d4b7d77094081fef826f95ad6f881083bbe93ea8f0efaed20d389e9714d0cc9d6597feb3df37eca4ff9fddab83139b3c28eee7229afcb5c2ba923c5de06e531c60eceb8a745ddaf98340884596c2deae6c94b364cf4f209bc2bf830de456ec867f0d2a6ee3e86f6fc60812162b145f5cff61100a1e3573cfce270f219118fd8e189f47cbbe662e6a204d2797a06691ba49da896d087e33d1255f4d2397230a75c619a04b54657c9b2a862544a7581a58e4678c080e57c53270dea99e370397efffe2e0485654ee556d4997a790575dbb47ae94859070bc86390bc0fc11492a5f2ea1645d24b3084b411dfb3b0be2d053fc063f505f479e2ed68d0fc7b6524645eadbc8f4501e3ecf4e69cc697a9926b56a14e8e29b4aceaee1c9028b96bd5036bcd86aa868e51653fdc387cd5cd8a5522a412dc70508e278d35635b222f8ec940d4de5d3cfa6039bd7a1b9d1333fe0aca5117a77fcf06e3f33ab05c5eb83800064a2b710f4efaae9548aef1f8e1d7d37730c5b60139fb6447b3e1f4160fb9eee4b5d4afa991060ef0ce573f2de1fbf851ca85d39c9657f4b2295debf23afbdb039f43dcafcb6c9ff5957f51593b54c17fa6bdc4f8ef01d95c238c099943e4118a8fdfc3cc0414aacd248fed25f5c9752a4cd752be4be15b6c29d615b4315ed7a20e102ba645e6769f03eddc3919415e7945394596b3dfc40bc3a3d9ea0d507473a33edbe595ca4d94bb03e53caea6c295184d65272ee35a607a5b1be4dea13124d6d19c32fda875d4d338d2d7bddfeaa54d797a1ac4d56794d566a449ac3b56de2f31363584683786d3f36ab14dd41ed26d274b167d9d31ce5d2c3cc280052bc837c7719532f2dbd2439e7473666da644ffbea1c4622301379816aaf761e7f70b75f915fa0f2ea9e1aca0b9c41092c9228ba644cc7a501ef7108ab88f57c904ce7130e90e2404e9db9661014d542bd0949946fcd5ce0ad2354df12c336a93983ab4d5b676785de2e8874913b5392003c4b2089187643a6319d5b4cf8aa32dfc77c54e44dd131fdd2e09c0b9a5c859aad75d53ca8c46c91acc3239693d098078ac2c055be9fe3422d8a32eb9c508be0df8239070897c9d3f76eceac2f3a47253017260c3424082f90cdefbdcbc0138744d8b254b290ca01a3e892ea1557decd79f1ec94391e1f3aaf2408fea33bbad26fe1d7b231100b8f24d936cd00a9bd74aaeb8a7a57eea6e7cb45352abd13f076c3461fac0ec5fcf11cb920e15bb0719f555c962afb062dab9779fade73f942c8e17e00aea6032ccbddf0c7b3910c79c20bdd8622ad05121a766ab066524c206d4ce2114681580973fb18b1b04b0e546130e6d0edd85c02a8ea6ffc6ee29d27b8582ac7e03b55118df6a96563d446801156f10d09278b5ddb86223564af6cb75eb5a0ab283e5ae37e432b694ae7359b46f084a0f0f513b226cc0a01c4132b5db4c7fc216b04f9ddc9830713d1de6bf476a02a2341db757e1f1e8fc829a859895f1185c14519b29ef418d52b95345a2a14c85a1a5845213029003c2ef1f997d8a224e6113307157582870de7018370bac5db8cdcb0ccb766d913977cb96136ba42749587b137731ff95029fcb3364004fe7c4b10e7dca880b3cb1a57dc89e6bca4730c9b3c358becccf6b1c306e758c7230d1d2d79ef652c2d894d36f7de084e4cb2b3c2508ba06a820d2dd088f12b4fd8106ba8c38f8db7baf098a087d81bedbfb643a38a9461279ce5f6bbc5fe282d9228bf09713772c1f073951b08f2a21951f004a5470a3e929223c4db2a68efdec5b89fc5ef71c4b94294cb0cf7d83b6fb7f2af5e12379939e648e0b542cbd2d1f7428674bac8f42c45d692fcd0d3384f56308c2478b7219c2dc802e09b8181b5bb48fb7c4f9771995ebb8571308e3936c12c239ef7034827bd2373d381447ce8665e77733a87dd6f11a62af07353aec46d581e23f9a67d6b38ddec04b06f14e89cd572cff7f4883bf338fc0125ee1966df46d46a0d0b41e51569b3fa957bea44d34086090478127e77e66109d497f99c7b7adec7bdcc3613d759643bacf58d7b9e4219a4ec7cfcb504310290ebfbdfe3e656a5c36843ba75f32f953e63564efb424cb63a1c9db76e4cab593ce8843ccb948cb1f3b91c4f89fd4e9f895538df5283b2e42f1134c308a5a7bd4466cb80b1fa6f9bcf0ca085de5a590b92fef78f0fc7271bfa66fcb012a3d8d76dd33c4c45ac81bbbbff9acdd19eb161e1cd2d0e81811bd6228a300f2adb91101faa410fe51f65aa50fe45b8123efa3afc4c43be6646039b4df77920af91730fb078944c1ec78de014754bb50ebf95df5908c61f0c8a60e3c34b52a52f79f11ee6ba808151395ce57d111745259516f77e6f4ec112c2d63828d236fd08f98dd618ec90203ae96523014e32f8f563effbd2fc2814e783b610f538b0a8eaa4cbbddd8b6dd92a5c3941278929410c8093650d4bfcab194192f6aefb3a2942e01d4e9b1363fcbe064b98865e54adc99fb3bb73bb36f41680ff71bc763e0e805004f0d8110d1b448c1ec1743a6fafbaf5a377ace661806dc64deab45656c94159155d1b00d3a58c32253497a9b4b76f46e5122f49f6c09d9620ea1d080eda048fb0ebea6f522bc3ace16a5728de6544e81b23614281351454faf85cf7b0b128488a15bcb9033ea960e5eb39443729da7d9813e98c7b6e60a74e8e0ac1f6ff4b37e373088a513e9bd2a53fc46879859e6bfe7c3e745fdd10e19e239ce34c14dbc26f7c643fe6ac1996a1c07f11f0091f37b0c4c69698f193b86c5189d82a82687c80aa46561e17b1115e25cfed4514db655176186fd15c67702b80581d0cd86fcac975357971f1d0c75cc84d36e33931795308aa6c736e1acd6e389e2e7d8750319c7598068cdb274d00306dab5506dfe82815031919b71c14b6f2b289070fc8459c240479b933f306fae6a7a714de253652f3a8f21eb7e9ea78474bb913d2167b2af8f16fa18ce289af6391a69d5fafe8665d1283fcf112b3249eb04b2e9ee946db6cf544b0566449903fa24668ebee72d499b65b5ef305036e71869bd196bf3d10187685701106cb3fc35ff302035f6a20322ac4af2e6f5f986835378779f6d28b53fbce6b5d388310973138f3468142cbcee66c5813802c44cb52badab92e8b8fd80b7c0c9b7805b543ac84b725d27159c85fcef43305fdf643557225d4c4dcbffd0c1ace4c43c790215862b811e18a3ca71d490e1d5f492f48b41a034d685a7e3ba4273ae03a4d33e89b5f80ab3d01f6f3a5870022fa92525404feed8377794d2c3a2ddd17ba1b12e20bd7ab42236d1b266ef564f4767df1edbebd6f2770adcf4754ab2f234195afa61067928753100bc7f000b6f24140a08e47c1e2a9f28c67057a0babc37f617cbd4f8bd0db4abf5b40df5580bce9aec0ae36a8f27b5b8996ef10dbdd48b1e30c902fc0d0ce58bf9c3963503cb4edfcd4d611cf192c4a19e18ccfa82e5387bed1b727833cd12b95211a428d456abcdf7f8e6fc0c12d1cd1d946fcdd29547f395eaacd6f5f7421c48c5be369555ed4bb134f871a750e6235d0a62f0758cbf70725d397c1c327e9e25086dc70c6f1d40422921e38cf30a8ba8a32ec93373a8d9ca9da0d47028cd262f013743024d4296f3fee8ba81a446ed44865ac2d4f20b16e6d16944b87e379db0d9a712409764340cdcd55f4f0ba1317add6e411fb0ef0e0e221d36bedfc4e9eeb7429c8bf48b02d5ea7138becf234092cdf3b0dd565cab8ab8431148f17df332c4924aae0cc0e8955143ae9599d400d4807076d68b5ad4a1ba633d1f5c69a3c3271e826f880ace9638d42a9e10bd5a881e6dfbd2f8f2719c5006220bc990e2eb096ead9810729c1ec8aa129fdde536f5ce72a799452b6bc3a4b328d3e0fb96f0920b34ef4bff3a76284fcf61a7547d64b908e2f2190ea85edbf2b74148b1a81be97c7d3de2b990e6824bcaac1713151d07b614a71ca111b5204b371baaba01b43749f2497ca887b5fb246a47d529e868df05a57ef7ee8e109947102aad1f8703a3fbfaddc2d5052dbd6416fc889edd8d697cfd4052fd08b66e6daa36fae7244f5619fcbf5c47f394f0923891d87bdbd3cfa384b5d4d465f0c8456d07381abfe2782b62b8f1063a33bb3737cf6fc7cc843602a3a4267d8f06cf58c26410c1400230b99390291bc05247da7b7ef28a97e6c822c0d6f0006c40aa2d0f162ae38ef8a64cf70fae8d6f39bc036c660ccc2442ad8a4514d963e6e5824dbde62d88930c036bf6fd25642e2f413b724e63965bdf0dc2982489b0e43f7e3e3599c2b836856f9ff82139a9e47dfe08f5009fef24070f5323cea9ef4d94c78adefa907c5fad116f654490637b6c1cf55d4269e06700dbc44cdce1260b2d84b81fd040dbf6ca1263a52ed29ada42c38712dd69700c139a9d7d14d85f0552de5162e279dee425990320a7a856e9471a487c9946a7fb8874671d4037a1234bfddc0ef9e48c0f06cfd83f77baa090c54abf033da88d1ca790a89426a5f54d5f08e18bdd28ed60b4dc696865af7fb7027a741093392b57b717eb498fcb616bd727e94056ee09bf79e73e043b2ffc4647d3f009619e88950230b5a64250f065fb847b972cdee9159b18e07cbfe41e25dc7dba587082acbcce04901209dea72313441ff7269f94486398d636ba73ed3d099f5a63888ba0b664bb03f5aa1a908e67925dc80eda1242198fa89cf38771741662599470616b690c7c97b8eeaeb28c3f94be73aa366ce90525df1534c6b3b34aed3e52f2ad15bf0e6fd2c19d421506e272c95ec35ca9276f80020843d8bae3ef699104d417a79fb1bd3f797f7dc2e5995507f220f3d1e39ecb99dfe9668eea4bfddb14df4628f03e8e63485b08c00fac65fe978ba4ed05db2c2d01ee1838b2a6d2a2e9dbe3a09cfd09c897fb8a176e63c938b6ca1703746ecb45d61a95bf214a0f71eb9095188a3657f5cc25acd0e905aa3db5a6f31e1a9fd169c635862b217eddcd82c60596a2319f7251a216f267dc2f93fee7e143deb6662139069285998964401644db25cc350ac88c3a6f85d22e81c4f755887ca8fab1f6975662d470b4cb510fd3becaf08cc07ee7b460921144c7580ab791d060b4db6f48ed9d2090473b89d53b568ff67ce81cc8da901f0c662ad59ed7a348ef2c0b15b493ec71e08adb6ed0444c7bc64eab2a9972a837abdcd2c51a7b67ea3baa6a6e4410f7d048c4d48a69b54896494a3031c1454fdfd6ede6afe86c84c02d7620045e2b6544b03f4d650658f1e965b7a0b9a81b2e2175e28e1c6f72a3d2add7545f6caddfd600416f8511f3f07b03df2248b6bcec047003f49317546c26a4172f05d45f0c8d20136174f04fec550c08df6853ef3290af983d9c48dc86c6f87cd88000069571f9fd4cba0d348e7d667bfea0e77da8ce1ae994bf6ad09aba934f7758566d218a714658ddce6a7efdfb80a878da2ff5c59a3e1f85e5f94f085bd73613405b59e17138ac679db863ddb15e057994cbc27e15de0675221f4eba3a5e3b3b2497e47de21971e0e1e7e623725f3c2a7e19b6ff74127218870a3fd8172aae576cea6c66aa32cece01bfaed925c97614fee37a52a0228bf47d81c868d984b8f07f1c96a5b3cbecbb67086406b2e5dabd7defb57f805678936d4e94746ab4818dc5f50c41e32cf32e7a8aafb300fb91af6406108cfbf5627dbd374903b10230b6a63d7642249c0ab0a20d38e7f953c27219f03383fb497038d705901e96b6edf48abb7bb15d6559c84758a6aa8434968c0675c56b6798cb4e218010cc0117e2cdd938c49576cd09fed134a20489e83587915d6f4d262b9a47056f7215da6e34cbfb7cf9f6561d42daa969d4fef1b5c6eb246fd830224a06a9e99b5d0109030e76594fc1dce79c2be535bfe39fa2e4713e2674a81c423d37fe37cd7a99771e96555979c4501094eda6defe78f085bc600aff35891a6e4b54cd56cb71e40a07f4f064c1ab59b94bafa50ced3af78287b8d6167721308ebd859fae5de9eaab0551cfe3f01e00ca0a9a6b2855d2be828ba42bd50518698bdbf4fba74d8ab44362d57b3ccec44c2c19d67f98fee74d6b124a90a3a617ca4bedc669a962fd49b864a77bd9234645c5c08a69c6b022aa2762d28de821c65db73b26711c63eab2f454f05720b74bf37e47dfb218332bdf9cc365aa0d3fcc29b70d3a9c6819f8f5dd7ad7987b527c5f40f5fce1f84ea9f4b47f2b7078c8d23634aa2a71f54cd01c5d1d85c551bb8190f114097ecdcb44ef55dd4b6692847f8d145b1f792cc31a2e5b86216609bb018e7aea3012ff70a5da6924ed15c33a7c354168413a73487d34befed4030d1aa562c4c09724f60674bcd79d3b0374b47036a119b73e33a1a13570cbc625c4a01413b6dd663c1954589e87905aba0bb804991eb5aa0dd5972f3958351e539614f6a9378bc6e2d224fa87614475c2f20fe0659f86412dbff2cf495e860516eb40f52d3110df9f893c027f4d03b2a18f81aba20bd2a5285b7a286b6a04a2f52beab7a68bb5d8faa465178f331339e14cd50d584ce2fd8610f7e3a964f91e78bedbe41c2dc2d97c8c67e1bdfbbd330990d5b09049fe72cd4530a70b34aba0270ddb2597ff7f0caba90a0a138d49c8a2c2473952ea6e2c8764ee1d98c363518b7eb22220e833971263163799d1ff1f334cf453a41779523bd4f9ed58f768582b7a2782bed328a23623521256b027614495a4a490b8680c72fd19be53b904de8f6a03ed7aa5a456a14f8743521008b55e051ed41db58384b347163892f27d0b40b40e0d5b47f0dada517d7295dbeb4408042c8c53f612df861ab7041c881c06c5c2108769a15457698ffc4628f71836cafa94743b645d4873dec5caf96529f8a6fad106ac9b17f5d773cc67124ed7b22c4f1f33dce5ace503fb0931326fec086cc618302d1e83dbaa63b47e5bc670e0b76b95723f6246debdd948e2ce90ac5f9e8dafadf310de326dc97e330c492ae9f2b7bed86ac4745c2ae04d85d5afb324c4b65c26065b7121a50cf02d2bbe4ff56599620e67f17e87d079dfc150b3478067abe8436fe584d1dc94d315c30c252b997a48bb3ed3ac86390ac53e4686b19b0ed31bab35985f6a99c9ee92d91df5b415c33988f5514582edfdc8a5bf0f399c4196bc07605a491365130b4d77d806b861dafd1c965293a272b8b09ec33626ac885c95fef9158cf4c7daf0eda425a25e06295c2128c0dc0f52a545d05be3c2f26c8d6c3906b06e364786661b69ec0fce8b161e3cb48269f0152a4ee48efe539774910a5f921338016d7f357fcd159631780b0a174180826e41b19581656f22c229d13719a226317cc22d25c0d8897faf566fe95ad7a26fb160a1e050e61e779c11b3ba0f40d1a3d0cdf9fe87922e126facaa83ad7ed077e0f962f8f91bf49a4db6a05de873fcd4241649877b04ed979a0224a0b63ff2e323955ca5230cd7d2fca001e64d448f0da12686894535af5557e144082021f0fba4bbf7ae76c0b068d1553c1ee5b972966f8419cd8c2d5a95cfcf7482912db20788f39bdd9c3f68a4f55fbbcd59dd8db7b5b86818f9f5d79f29561cd8b16a204ffac6b0f83a91e5ce9046e4bb50b5c8b89c4bdd3534940fbb8efea2d02ae0231b20ba9ec8fbbf112ec99021af734b0ce04bc4dfeae412e931264e6f33a197a1b22259cd1584cfd30cc9c7d9736aa63f79eaabd501b1784c4818ceebc8c198835d292ba5a780cc12afb87273cddcce4bc9a389294045cd22498d067e592feab2645db78f4595bbb860bd1a598671cc16199ce542704519527cac7f91ac9695150fe585f1b96ba6ac670046f266d2a78ab0fd4788595c64c4299ec08a8b9ca293a5e91d34c9ab94d60caa7ea634a7678ed8ef3763c230b760988a51d3bce91816709308c13efd8e1e97e34bddba971509d79a3e3b7469190e1199bbd20726ff85b609cdffdf089b6c4fd233ffbe4bb7e5f625e37838b093b6dbf385f136fb5fc7c073f4557675c3a87da0c074096b58097db8af82d4ad2c403fbf37970f0f41c6d6fa052dc9eb0eba69747aa5639efd5db47d29c21007ec9485265a2b5c0bac6940c689eea213858a5b77e8f8938cb0c9e299d99eb666db9af54f7517e396a99845fe08ffc7952f019bd192d663de78355137477f8c74023bd66210c26d593f3b2eca08ca0018150570a900a8993c5e89477dfcce5cd6685d7289b394c1fc763b435313b617443d7f2427bbd4fe4d68ad0d937ff1ec3715e90feae7f5a926567eccc1b02bd2c3b158fd754ac45abaa089eba25852043d12c8f6ad334deb7fe8ed113c6891fb3a797644b835de752a0e0628d210576e9066e06ffb200450b033705aebc15158549bc3401b058c1646b90a0e4a2e6af1d9191bc1fc3582a0613ff0eef645d1b2b721263bc3413507b6a97ee3333af254c0346036d7fa30a339155316867c7ad00b12867bdb71400e21e64bf0b4bc5760ecbe9614b5f77420e1bc831ac3edb47cf977cd49891d17f43079577df63d00dd06bfa7a4bdb5b7e1013c6642d420e87c2857e2edf5ce21808a698cd221455793b5407a2e18bb62ac409ee6d5e19d7c9942baadaf490bc67cd7bed1365c5ac349a247f7faed91db4a46e9ea1d14edda9beca916d7aa5d6eaec1800df3cf06acc975df064f65c08c83bc2559609397684ad02a05ac424b81e0eeb82a4fa3d07ad9d50d8f77a8cfdb1e4a5b1de78623906e96486277395d67d8066e0f93004096426adb7ab8dd4632e597921dfa1619b9cee6081580b71b895fb2a8a4060ddf66cbdd50af5b2caef89e4cd241e16a024a336674060fe30e4d3c9a70d1f2f334533ed67417a7be8d9512102371e3ac66ad65c1931e6ce5bd1c3965cd7e9dd9c8c662fc5098e6bb6e71098c8e954901cb492c9d6d43dfe6b05f1cbbc89350e82125fef8eb1b5e4bd6f44b681a955c93bb8650a30b5eaf0e707cae4667f85348c9d9db714e8959944f869f4bd059618abdcc987a7458258484ddb7abb496ee20484bc1107fc81dc1608fceddb6caa30e5a83cdcab017897174e8ff95b753699824e2777d88c2f2f89277a1c7d7ce69451813b73dc88523fcc9074daa77180bdae705c75f705d22616ba6ddb1384efa5a82e51e79c3893a4e0aa16a92fcce1e0b181e775f4083f42675844d42e3339f731d5fca26a90a178ebf1d1ff64e5be85640945024ff1baf6c387ab823df63a0b973ea83ed83f203e571e5327e76a9b2e1e6cf1a57b50d9c5e3beee5fc34c845530bef10765828447ba7606bd17b9ec3d492379d9f6b41032106499d74eb49d6696dd43a6830942277e9f6949865246558cd34a0a5289e2ce021f4a8330acd9a252203c96b131ee701bf0f737a3c22de951d2eed10f40e5ec11555cee29c3edaadb1e285290aaed943b213d220097f77b20d8d4a89d779e2ec68d6d729a683de29a2db35471c2c4262496a7731d42578d722b980b8dac5018aa5de8aaf3284eec27e54a370528068890d7d2a56a3fb292ee61a574404db00c351d4b01d4729529fcbb7954ab29294de84b2b53780e9d1dce01896d65ea32abef622111aee5a51ea146bd47d474a0d893872df7b72d7ba0c981c0715ee05c6a41b2f754f2eff34c8ded828b216911db3b1266fcb82ad2ae4978c70aabeea1b9c4963a4630f004463b3665891294d0a8475342eceb6536a8c64d29a3cd63872cf072665ff9945c6e31a7d2ec187681d230e06e42d18b2c22d87544d743cd91365dde082cbd5b605709c8570eb38c89eb90402588fb0b079ef897c50fafab3468553f9c16eca3c4830c0e6e7b64557d56ddd92549d8436d9f9f1b16d7518b05357f2d9eb9180bdd64e0e085bcbb5fb0968231d9eff9f2d2874475a6a8d9cb7810441e9c8db0022f8f00e5494d1909e84d15d0bff5c067baf8714e110eb90af1ab4c98f1ff55154f63f49305971de278cd114c33f5cc30ab65bdead2737fb82648e1034b9867b3a186246057353a87e6a90cfaf26a8dcc0851730267718e617a8bba0415f3787bba6818d3cab1ef68b663516367ce85c8763e48fb4c73758562d63011cd7b07cc1e7c6a73bc77ace36c7e971c008c348469aea85bfe13c59273dacb92fe998623324571b6c8f113a67d7d369b593e2aae5705099af8bcef1721ec152e15f9842f8a55c7136cd884106dc1c857ee5ed894b2e3f54ec8e95291f19c85499005723fab2fe3200478aebfb1feb4e81c68bee621bde3cdeb23b081676ea45c1937e0d209364e534c6bd412ee8694b27fe64e0118156dbeebe6597407d4eafc0e1b408528fb8123912c94a877fbd04d854216740a6ceb9827cbddd83761d19feb2a21d78ef1f4177f3570fef2b1101fd926a8bd7d36f5c04b2ebe2c8a87e0ce3cdef537bfcc3fb56310f964c358acbfc7ee655bf50614eda2997aef85c9a0fd7fc44b341fbccc73e9398e988e552e93fe13eccde65cb176ea9684af9da98aa42054943b337622e97e39b10898391e32c821af91d5ad53d26fa06bdb56aa1658cb1a50db9f7abb7c9e7bf1139576e422d2b20e26476a94a6ce31a0f1254ddc91dc801193c82d2ea3c68adf67ea9128ca9a2fb919c036cc6a72d4c48fadf735d5d12046d2221fd4f582d0cc742c0a54c08b0510eab4749373ea0437154548ca9b5575713551c556f8600858a6ce54e07b11dcb5f7b8b66279b04a89208fb4f368b5ea113bbbb01d12ca7c049e46035470eb1108ef316eb1d252122b1fd1ce58b48f08b733e4629fdb4eb640b927983938634c9a3fa3201a244bf5ad81dff753155d5bd3dc504f77c849419d95e786074816d9da47a25d03d60a5f70e4fec28ae18d5de79373e91d5066a89ba30a4f3716725359b5a387f76e19ca25c7b2a268cfbb7962d7e3c1f90a0355ab6f0466512a124388f82b336d5306c03c88902965265458f638146ca36bcbc34d586a6dddf95324f89d9de1fe3b3ddc15d62bca089be456e2228a4b94ec1c8c020da0c8461ac17229049005f27d3b68520eca06eb86d80de735b9d16601721a59ed4c0821f4e9a58acba632129f8c1f61b10f52567dcbe855c027a06f4268f8c575d09fea1e48599e5124d8b728bc4bd55b705f01f72c70be80584b39355da1d545b312070d49e8f443a07c589f28881d6c716f5669762191c4c0045c40ec9ff9cb87e121388aee0d01ad9f8f697d5eba72a715cc7b3595702c039e410b925db375a39f912667c34929a0a4c42e073a3cfc65e4ec72e726ca14776b6febcb6582e2ba900f6d8d23490a3e4e8f4372950568524f3f071760101cafee61680441f8811184c46457687d41badf59403c09a454d0d72c9e22cbd2b321a9ae06d97d74df6cc088a1531d666ecae9aabac012ba3085ff3daea5e49266512fbe5ec762986c10e5a4bafcbc94cfc2f00c09ab1a8789d63a0acf2d24cfa4d2e30ac63abbd3a5a266a0f7d0c079035784e5b349bbcccf4619fc660516fb0d1b661bd3bfc3a71a95c6161e6bc393a7dd0ad04e4860da8f5a118b09da35a4fd8f1b8a1dd32493395f867c652a20650be81454412394313886a34f31290b4df4c285adfaf1591890841a3c8298717dcdfd13da2247d071695061a1626e0256914a372ff1b6cbb7aea803eeed43313e5c809bea7831a01b804bbf4a1405a57f318aa268a88016e0f21fe60c0b96ea3746170efd997d8d801bdd2e71dcac8ef8840859e075e9a534f96002fc741006f909250f9c3c87f34f9a8921d112bf0982d747b03fe0400114231d1d68ad4b01e4143ef03ea7fd6bfa9ae45be05cb9af8ec9cd57df7e4fb51f0dbb87b92db47598f5c9736d822a61e18b531f1811290b7cca0dc337b6552bb627afc4765bc8ec783c58eba141bb7fc4ea6a0df0e68997ed668d54e11efcff69ff7e6618de14a1124661cb626d0d1ff546ad8b033357cf510dc0bf542ea38abaf3bbef192b046de7b278b5297abbccf31e7228b79e102c384e5c55195be56819b2dcc21fa9349d78ef121b8ed123f15ed07c59867d4f3903a694a +0xb3b87315402171643f4f2826ccbfa633607fa9eecdeb224395b69ddac04d01b1159034fbcde1e0a7fb3c38155ecb6062 +69928 +0xcf183fb8b2020ced8090b342dab7e400f89ac8f285077e0fb045cb58800d0d0467d671db1b5666e0a1455232aa64833423be68ec082d01a9792194e90f9da279708219de2110cbf49caa1fd5a3d906fcd39431ab7cbf8289b0f1c0909a7a8e2611a59e8a6d3a22729a4783f36b2056a030a58cf68ac3e8f87e3eb716c9adbb5373c668a7a7db53a2c2a5e753aa4159686178df96da431d3c0b8ee043433d0f48be6ddffd77fc45cc3d4bb1be0942f99c8f9593541346089d7e6ca5deb132744c19226b5383a4e23832c14bfc2f2d1d83e18511f6ddd59165ff5d6db1ba95d1a9ac6e747376db112eca901bd5c609ad6680cfc044e2f7a0dab8eba182076d0da5a0d86223f6a9baf52d3f8b1173df908d93fb0708c7b41d46ce9da71a3fc212891de99d2cab17c5d682560177e0b6b040439250083714f0ef6cfbe8410b9cc79d4a278d563f2c1b19f15ee7d0b596f4c7b81b020dd820021eb88eccbe13041428501c9a6857f1a206a4dea4e499884469191e84df52df391adaddbc5bfe01e17457502d2c9e6c43e4c05ea07b359288708e2340464e5a7e2dfb711ede759c16c7864aac68b9a7e7fd7066435d31bfa82241b39d0a7497ba9d43d05b101fdc9c6a059281e553aa7497da7ff55134148dc8575503f26ba0d3b3d984dcb9a5c959a5fdb0126b127bd4fb26301e21e69b1da9fb92dac8dc7db3b7e61508a1ae6b36bf962cc9c29e24ed717d022693f15b410f53f18b526e3440f19109468fe3cb1b02f78f0db1a0ada940077c7570fa5ce24087fa7c59cacf64a803ea004debf0f1b449614501c01ceeb2eb26737faca7e685c03516a497550526633f9da170e29e1eb328db7aa57ba60d5288898aac433726262bc1fd7ecf0db1da91855417aa0c885e6e36e4f8d1b89a632b1d57a538bb6be063e62a2744639290671f2e8a4f213971babe0760270ca1479699b03d8f5c9c1765ebf439bcef11ac49d5f671d9c77b1595dbab86848a6a2551635b1c4f0000f2ba3a235d40997557bf0e767351e5947286f59711f01a3c26e5e520eb8091e09ae9397f3ad64908b852337439be63cdaf157494aa74a46172d985c9522af684367a52cf7989e710f889aab96b28286ef5cac06af916101f30b5ad1cf8561734eff6ecddc15e5bd63eeddc0db0971ebf6b2e41e1a5e046bf8802c4e3860cdc38ede46e6fbb5f8da2b3053137b0142c083ac860c057da2e88a34632e4a3522dd757cc424e0e9366bc7e59120114a63a90892083d1b60bb1c4a90c5ee8f832f25b5536cf426302cc6bc971e531845631a081bf14da6b7bb5b9c2d9b2b62db3130a11ab7d1362b5a8f8b9d61390a72bf7804a2c79a41d3223b114379518e9dd782db0b2b488b2b3e3ab780f05e6262d75780bef1cf77539e4f2caad6fd4d4b90a0b5dd4dc6afc0463cc2ea422fba86493d0ec91639b1b97dec40ac4a9b3974eafee3e985d81e7b112a3021dd196d6d93acf1699b857b654fb71fc02a97ddaa5501c7b86a0951cc1d7781d037c81589350beb18f82f4ee792240caf2d8fa44c4d6de3d260b6e423c9992a7de8a82d59abee5e4fc283b6d0c3b7899199ef17eb5277cac0107d3022b423ac7346362f6f76d8cd86714f1d8182d629401642c30802d3eef9efd8e0495b9b8a58f6fe862b144fbb558ade1daa2e246e0319071012bce6c2f855365ef82e6546a7615dec1d02a79a2575bd219b4416ca8318c8999c0f44d933f73216cfab1563e72c00abd5d0950c7ed868b3d55321b128abe3ca146862a4453c38a22060205480ad536fc5ec8c64da196d5ef8e9d9c46c39051c1c66c4b6949ad67baadc1aab1c6bd2826de4f245cfcf378d7666a386d646992a0478ef82baa9782dbf8d68da02ee0a9e4e286b21b85063c9ce58234aff5b0c5e7d1d479b2fdeba12eed29f63ecba680de7455b7b3c435e9e613cbdb33ffcfb33d6c261525ca108d5a97a32db3247877bb9ba47d4c41e9465ff92e74220a2d244b216c16ac9a6e0e08fb2a7926c1bc5423605b4a0c858b1cad9e9346a39c32e0b9f78ec271f36debe023a724bf2bdce0c0c962671e178133780ae39adf3f46ae2ef77462996075ee89160374a8e93ee337e1a11ca87f3553694604b8fe7ad1575228063d4f66eeddacdc24b206834c2533ad00b0d3460d442759e0e827d53ba4ce922d9db98f4081f07ef42504826c6d5a37686dc6f373cd5b4b5e7282d9ec5a4a3dcfc8ff62d3a2fe035a17c76d08845486bf99aa0eceb8ad25659d380d4d446d32d5074a6710087d733dce7acc8733caa2ef7da61f86cbc4eedfb371fac429e07828a2c2275d7a16d68793432851406494de61e3af03cf49aeb3fa5426bad04b17aee18e2923c171351fae4a07ce73c963768c8845ac8be36dc9bb0a1b98025418510cd7f5cba53597ed67b8f46696a2179d48be6aebc93b34093dba61c487a682f86ac414bbee0b05d906b574816f96b93ddbada5274ff90a5bca8d7ea827e75d8b447e0d5d649a86cbd2681187c84e4f3d8e7c7ec9e6c4f8a7a8abfcaaaac0b1f1e22c6818cf8b22ab14fa52e06771e485a9547d37564405d5203b6334d7d887148cf7ae53f685e1611593bff414a87dfd745c2bda672239cd7a6639ad77d8e6db8a076678a231ccd51a59e12b999b248d37bd0f1ae1069c77fe53087d5267d72e238318ee9b36eaf06e773feebdf1e01d399eb2608b9737bbf42b570b302e61f5a1934d1da93e4498581362a34753ba95c3289a122e7e1182a315afc1d9d48c184a618b6d94eee0b61f56d0b40068b8dd1d82519a926332b2543a97061402608067125d4623f0c8330c671387b0d9e5dd8fd65f5e7feca3354fc19742ab60e6133fd1481020ec04f5676eb3861f4d467e61494ac8bdc46bf1dcd337de649525ba1cc4d63351899ae678953617146de5a6da059c3e139192d043980040084a255e44138e177e7094ed860226a458e1c93e4332dc2a4bfc21b9cb3779d15f26efe500e7f8247149f9f1dbdd0a94b450fa2fe4f793f32bac1f93bdd92bf930d28a3998689dc3f1bbd2dcbd4f6b4fed62815f057d48017c4a944861a59c2145f5fe4054bd045ac56e26957580d03dcec065b8eeec83bc057d89bfffc456af643854e47c0fb653b60bfd044a97c1c61e12ae21e76bcd8c90ee04e0df5de10d5643930b578539148c3a601186bcc652a4ff64813722acd9e34410934999c3a1e2bdc39f2e4817070fa255a46f196849293090c2273aaa0bc828b2c084a086d5d24fed87497fd79206ece7a54fd32e13754d3acbffdb4f8a0442f44fd999b110eda018abf053021f3bbf1bfc6c15a11850fd6884072c22be6239dd2890accdb9fa594cf36bec1f1574c4fb910f0547c082e824d58656ab10a9b67534f103613ac22191470171b6dc7aa38e4c7fcbab74d2b775a6c68072e6a060c55943c3f5fa0da1f08ffc0a50dc1503dc160690529a0a1264df0dd300a911e0d480d0171261a28070b3a2e1747c0c8ceed5ea7cc69cf0a0f768a477dcc2c2ddab92de253fd74b671a9b3c1baa2729e7cb7374b68ee04d0a3829d3938e977b005075b61504c4cefef43011e37a4232bc7bd6ec6732d0e8f72f0be1509f9206f1cd13a010e990f4ec09586b5f6d36f0b207e89ab63ad28b10e3f418d5961a2a572a52e33e77a385da5efc90b70a6b2b72768fc5cc2f50fcfd5ccdbe4bfb96aeda6d1cc9c63566496ffd05c914d949aba4d0b5b7d099b10465a27f1cd957705b23a05898d0ab3f0854ed595e9e633937ef1e41b6ebfe5d6bf1bef17aa8300ff9dacaee99866297893036e2977c2fa199fb671b0b45e8bcf948b70a20df11db50a7f4c5140ee1d795ace186bcd7c6ea9771b32bfe05de36761295b455a77f3c273025c75190b065f470f42f14d6ae7dfaf90a59d6546933a9f960d66228049a472065db973558ab6e237ac4e8a271c0893a758ddd59101b5ba321578f89275d791dbce93024600fca6d782d8062961d0eddfbaf593d5b5654b8e02124f371ed83cf33da628650fbd2f8f852243fa6fb4f89a5a79327d24c5ce1a31b698d68b32de0d1947683b1d64c69011b1c6128c216e77a5dd340fe653bc6742da680961541f59f00b4420a08016b9c70afefa4d9299f82b961af660ab80e5a3f22f3837c85b9a30663ece3f9b9a4d0392711a3aa5058c5a4849d92a19d615e39260fb551c3d1e78fcca8c4113cbca55ecaf1ac9c55ba4c0485320b94b0698603fafbb6fac1e87381389f36b8515c23c7e1b44717ff6f1ec3ac955849bacbdc86e6e00ee148a44dc6edf9c056c22c535cb385fc83151c43c741ef012a823268a832e6436c1fad7f4434ddeb5355d33c068a8a5449606cc4fa8c678f9dd24431522534df0510ac11e554733e17d3fae6abacebd6cfa804a842d526890c70a93f6d08f36a13e149098f97e4410a03485a3462d10b7eb48ff789635477de250a9adf234a6afe5b2b712c43587c94af669f8af46479be4eb3b9b67f18e17bb90f4b92be62692d46fb50a3a1f6781e9dfbbd93aacbaaf83c18f7b1719a504bf45f596c2163ee0a6a60afdcf9e7bc0e96b0bd39cc2f26924767b96281034cb69ea3cc57947482fc8e0395bf9353d0ce622da663a1b773f6374805b1f77b5b247e82ac3a5ebdac6b7c8b0a34b6613dc4c91980f9728c1b8ad462e5861a2907fd5da502fcc867f4bffaa11723ab398a5a931c54e287d5a6b8e65e60c93336d7a903b3d5871a9ae261d1edc274bb043ff787df290828bb9ae734e37e628ac9539038552ec29c7dffb7c916150f2beae5026f0a07529d66817e879a4839670b041ac43314959539d22aa9c518dc461203e51145f6a82dfde2e7a72bc536122471b06ef48fe84ff5e3233ba1d2c453a521073536fff222a846895c3dfe42d23b23b8ff41a7a310dabb0845534bad99cac7d0a5882918c29134cc6e78f943f178a09c40c165af2110e14290828b8161aa7ea828e17d0356dd3418a486c023b50472c2f61dd0f2cabedd3ae4d79b26f36ccdf785ea019925b7ced5c70c5bc867072094ecfcf155520d385708fa8286973a3d25854abfc379458b6b9fb5d01c4ea83378e907cec003247900c69248879539559af0a9bf6a98aff243f4262905b41032d8b4e6711c232c289fe447f61334939dbf8eb10874cb1e8cc38e0a6e6ddf67a51b1640e24ffb4cce9b2bc39211be709dfa2608a1cb5abadf543507a53b18d415a9d7bd2743d3adf25c63ab276879f7deb4825695558daa755fb0c5d857a77f09eabf064adef3761c4a54aaba02ae51e7566844e9fcac17d64ac8ed0ea8d491094695c3530aa2d0d4cdc56655c6a4a54046a179a7a6fe28887e45275018e7329d25239b48ae29e3a34d8087ff9ca51c72eef59ed73dcc061564ef1aa58e27894eef2f3733b2d0d610324bb6c16cf7de04b52b5b7fa85ed805638d6f15f3debfa30c823f1bfddfd1a4e4ef9ba21ee3127e020d57a9cffcc7dee2e9cea82d52fb25e4e45a09799efee5cb34ddaa9bb1e1693f613b5c9aeefb2a4bc9dd6725cb665adf1d30040d55835d4fe124e1c9a9724bd3f0aea1f17b9b7005f64759c39328cc66f46a14a14b8894d9c01a509113eeaf2682597fbcedcf397838b286f0f16803df32b0411ec93611cf9765fedb367c1aa0dfe4fee38ac10c0c56c7f7922c4e86b49fa9946a17b45c9b2fadf3905b4516a9cef6264e9b9671291a2db3928d04dd4b03fe146e7d2bfda3509b3896ca702aa9183700e66779f0374a8cc2d95caf900e2657ca1243c37c51c1d6d4d7cb26df08855193913890129eaf8e2d4ee17a2763d05abc3fb0a3620c4c07cf3aa68fbb2edde9e73854035ec611d9fbd8638b2bb4c8b2f4db0df4373bb7d632a6a2d24883e8aa05c404fb5d18381534612c0a2468d7057acfa2dd8148cbea040508180e706e39f41b90a095faebebe1d0822098e7c5fc5404b787ca9a50ec4d3e2088945b3641bc27401990d5f402090daef511995a3e8c61941a99990e831539324b62ad096866ce5c8fd6121904b4fff7b016e65d742acd81bd77adcd5865de868800cfaf56f9fa2b29ed172396ea90a779303698453432c598eb3e541344156468f727f0b47d92f6105f4ed962b4a7057ae5f1d15ab477a9d47db46c5bbbc61313cd1f942afb7e056bb41d0510192c58d8c07fd15ab1847599b577ddd8d1d9dcb00d1e625f79a6a06372ee6d482208e9be464860ee3441710e1cef6f338e3607673c8b23fc02f20f202328dab1d621005201b545be4496e45c3985e914fac5dc62e4d09fa89b4a99c94e3315f33d60e4bc782c4a71e96b18aa949f15221e6fa2c68c549e0c4e9688867c77e3b75faddf25331635af2ba85321b6a7b906011aa3bebd7fe8d022be2281345c0fa545f137b5bbdccf221335dee926039e68abaf256ffeb9449b20aab0dffe4a5f64f612359397e4e070a8fa01296c1d8cee25177104d76a7c154e4279cb62a99d9d7afa21e84f983041f3df030a115b4b437638cfa3d0fa56e7b66fc76be9e18ff7da8f43db6c5f863efacd2eb39c27a20da6fc867572d29bb96017e0e71a5afe1b1dbbe29575a0ac0ec7aac84c95e85af5be4ae0a14458133252230d687e7cb1b04b65483df2c5685a62601aff85053ba2c509234fcff585fb967c96169bb0725f6d75bbfc6b3583cad1d56cf2f3e80dbdc32398a99911babc3408c318fc5c07d089d284fa6958c5051ef3064d67f898edc17f87d42c157b1c32b1dc9726ea39aaaa66eb5e7396f5b451a02f39699da4dbc50538fb10678ec39a5e28baa3c0d095d51837511257dd7e70c630de823ff82eda9df244cb71bb5a74f7f0aaf948943b14d0b2facd03430c854c516339465d8f052fffd7e79acc89c6637c8eb3e84d416e76a2822c02f005971adaf0171b9ba650a3a5ddec4987f79a8c148f560ac252ecf35010b7bcac12af1813afa3247a1ac2e12d7e60e8b64df75900d56c15bc14942d04cdf79a3edbd42e44c665cac29463d2dfe1cdde1f32e6b287877d71032f700d06e0730270070e44b45de5753abb3c5c022fba938b4f6d7ff3cd0f855f4c887b9d72b35d083f6542ac9dac8eab385468e08fb06fc14c97a88ad0acbb9813e26012ab4014cf2ae21074ad417bddb2b4dfbf2a36da8bd0691695b8db7a752b88a2adb2a18d8d718c9654b62ca698d262a7e828d43caf83edaf5bad252bbf3d822bb6b05e320abb6cbd94e0f675a44068aaa3b012fdf60e2a5c26d610343ef0d6e175cc006a0db1886b7b522652c8a3cece37ea7985281928063c5b26febaed8eae322f0e9c60fbea89523544a4cda39afdeeff903c0d4bf093e665eff1fbdbb27934001032c9409a0061b0d8d37ce9d61e0e17df8b6c4d89ed6c1cf275c863482ac4688f9311289eb6f0ec6b479b1d8919e059efd80fc6fbfa16a7b7f3eb2d5aa82a8f1227005d009547118467f2e7bcd6acee478cbc5f4fa42c2ec6d12ae0efddae9c21565d84c884ae46ac9d4bed763cbafe70103cc08cd1f5dba8794e2410b098b84488f248fc6a6cb36a516cdabf3551b0f0cb5790ba6bbad4e4511fa3c4092f0a0425854ea631ca8146e91e549fa9ba2c5124d478e259c34102c3640213d0bcbbe895df41cdc010d8c8ce29031f7e3e9b1a857d1f0a83584b8a36e7ec05ed87f27940c8c77aff86df79685591469d2325d455182e3dd1c11a05126e07a349d8d83d8f0788b4d673bfe01f6aa31deeb1f106fb6e4c802b45d5fbbec2fbf4caf795bee8662e832d219f865c2fe4aa59322838e14722dd792ea4f2a4ab7100592b5084b4ab5eefecd6a8f1856df9f7c7ecf1f36e6b575ba3c2b0742bf011d0dfbe31155c9fc201fbdb02ab04ec8d0c1e2875bd0aa19402914a2108bb5b826b42f661fb460a02c04278d43c3f7446ef482edb211db281db2c0d1f37bcb26dd96c1c08bedcb4c635aaf4462aa0cdccaa2b464ca40f67c5ed5a55d18796be792343774de48564b566199982ff8dbec845b1b8f0d04986094104685f82b2474f50b15159f7a8e4775d78adad427011e2c6c1cbee2c31d7f4dd138ff2b0761596689df0547faffab522b079f27cb08cc13742c96f4030242fcb6d12b2984beff774ee9d6502016f17bba7457734b5f80e9f1ef89a95af336113fc39c6c29a9e1a7b8ea0b40a060a4432475964f2e71c70073ca198b214cd33bba64c56b6c9eba68564416a1e2695e58f77fce23faec29076840b901fc8ba4dcd55928cfd429b449b58c8afc7c9d6a1d81e7719a172b015f4de80ab6534c25650f0548e1e6b799bc3527caa8b57972117261230a29bafa88a3246110bbfadf74d5fda84a1ae4c54073aa784f5389e0c5376154fca9187f13e68a6e999d042d7cb8a6c970f72db166ff88f648ad4b30b95f6c8a0a0bc00971a68e85b98d14a9fd25952eeee1eef8a02757c73d494a0c6e48e7348ac85e243261a54918f298ef66bb4d3b3c91c5057c897b8d95ade2ce448265d727652f49c696732b00640d3859c83390b25d3c626c9478abda41b1e0ec9a6cf44878cff4beb35c9e3857ee4f36faeca208cab199f0e6e39473bb43feb70f611e6669ccbf7b46e6250954b88e9ec1dcf1a850c10699ef20ea1a60f572444ff6b819be82049cdf8451fbd0f860f1ab88f21995e752d81bd51f06d962e604da7253dafdac6e93dbdba798632a70c0168545b4e090e92c0b54a5f19b08b4894d7864129d9847e0ca30986771cb389a91364f32f75a44162c4401331c437832078d7b6914c24b04294796d1835722d1ba2080fc10bfee16fd17d373d3cfbbafa7061c3709d6c29e8775357f1e6aba15efe88d88e31e61bf0c347f1c57f9d9528a969914c33258e0633e06b8b95288c7a0d2c751d502297ec84e76952f5e5bbb4093a48b076178aa2b265d26dacaf9778b93c0ef6d17bfc6bfba5c96b069dd5a57a1b0f21ce09c3c6db2db31f91096a5fe9ffcda21ab9f37510c836991a8b8a04e3530e29a3c4e179967f372aaefeac3785bed8a895a42313ab9ada63997983d82b2b6e4f5d118dc4cba285156955050874c15790a903354cb461dd51eb2d68293ceb571b64b66fad62dfc7682cd81fdba05073e3bda0d029136667eb786fe000fddbf016217b2e3f447e22ac5e4d9fb7f0b353273b419db0b1f19ebaa9099364564262c7fa2a727f57c7c068667d30a54c3121e78aaf43eb7449ad45e4c12a5d2f6ad4b75889e5778401c924ae3078ac9c1402a812b26be245b8ba1492614df370996f6ca4622d2eb47665689d2d1fd4c8a220f43b11bd9c0d84eeb01cafa32f02185b70447bf2accd6cbabd9b3ece25b924a3526d96e021b2f670a0e874d518cb2fbf4ba29cddfab82cf3aa10292da855e1b34b10077d791e56696c60778ab6b425c383248f951f5efe36b864b7e364852376668c2d3bad37ec009deb826b12a54491a2341bc323a629ab6d00b099613230172b49d0c3c3e7ff5ebaf05b203387d24e3039070f0f77f77c544adcf6a84252bc22b0b8bcc614d9aa4bd9cb5022401825b39b1c20eabbaecef2ab03a3409fce8ed427accfbba8c00dd90d9aa3e5ba5e3cb5c1229fbc5997ccd18cec47312fefb4c81776a4ac8afdafebf490c386dbecbbbd15e1338d39fa9b7853608b84dcfc5686e9dce2a0a2d8b709f675550c8d09cb54fe208566431f666f6a2717408c3c9e9703a732a0d8984dbb7b100480b7fe9400e4a93d4e5f4d533f3709926d29f8b282cf9f3bb314879b8aeb2a75e941143d4c2f42024e75ce8a6f24cea4149a79bacfb38ba6e13eebc6fdae8b534f1290eebd48b47c6d6de83487973df63cc704df0719341a323e0df99d2cfb44bb14bdd1dd95c654b32fe4790ffa1f30ed98e448b1686340affc355af0ce42f0332ee20b337f423228a30a8090b43cfa2ff55f1f5508dec05f61ab1180fa2701c24846c7476feebdd5b2a172922d5cfa0bc6bf897b616d414b53b647d519741c6d4b322ba2cb949ec142f3769bcd47db88f34ab0acdbda6b79bb9f247594efeb3e1dee5fcbfcfa7df43c46b535fcc443af6449bc6fdeece7f382afcfead161163ca7c28c4a6be9007789e357e7229ddb870203d54dd26a5dc18e2b71bc3a91456fd1f6daa87f28d2510f128339a7984a18b3c221cd1f1d74e9c95e317136491fe084d1706c9f81998ab81a61b4f37e386a60cccb772dcdd5751a8f38932c4f4c96a69c771e35bafe2b6b451adf6e164f86f26bf9d36441286c6805adaa866c759920a01647a89ca83b10d9d643812a34734fe4d46a2d4314d79d09b93cab6842f2db22766e60ef40c28e1fbc6692809239618283c3ee9941bda0e384d3030b5aa8be6dbe1bc57b6dc9cf5ff5d20be20fe10e8c2e66100c582659db35f6f61d66c3b0c817d63f07d856bae1a80f521653714049ffdcfc64011bb039f52eec650d4c9b7aa928365d287437ecfea3d1e407f4de021cac1969e3a28d44eb014dacf84a66cc9b98124306282ec91f18ee16d36fd000ad5ecee3a7c6d84540f981bacec5f90616af3b821a7c87c132f613725eecfe88db7b8599f48c79841b9ef05738c63c7041f319e20b772a1a60c3a7c2517250e5cd8aa55473fe5849a577034bde53175145ee142a8221001cd00912cc530aae5dad1396dccc235edc050c205d677772f3492895242683ef11ab4fbb590dbb003aa09ebff9a603718464e5b1577c37359c76280296a0a4e03f181e0c30278d2ec2d0b48a73a9a77a8bea8b1cffc49d4895f476c549978dbcef40fd6c1b4888203e65dc5e117e166237be85cb1ee8b09326ea9a4405b444696a4a7443e018b5bef5879fa39ccd580fd1095b247b8f78fe96801ce9919fd3d1f55f0bfa48411bf1315c84c2dd3d766ba0f29691e062fe722fe0851bb7ff41dadba74bf71b68c29f380f13219977775deea2bd78130849d5372f5d413d7c976e6249bba32138b3b154c6d4299b2363cc01415843dd2a6111f7982ac5ecbfdc74d46ee4662156f510caa95042aae843a223f6ef5906704f0cb741760e8c7018d4773d4ca9e56d90a2e5e20ed58d6e1ec699e90b2256811ab0bf52c884e537547694df7dd233238d51ec9696480d5efc20ae4333069506cae356f4a98fbeba9742727bff4bd420f30426f07105f260e598a92cf06d8aa6688fc54ea097e1a4e9205b3a587a900dcaa3dc152672041be216d1cbc9bffe0afb9b558a3504149b52f8954412c92e921b1557303df90a38fa8270494664b9da8bef4bcdf03e2047dbb269c0b49f7856ed44dc673f01ce5e36c4cccdefc583bd2173f2425aadcd528b361fd6c76334024817b6e2b3f116369cc42d804d48245bc30f910efabae2616b6cffb0d27f2b3d34762bca2133ab68376bdd8ae756635d7cab6f5c58cb291f813c51735d5a25b0ba498547112e559b0c9f23124558096b512fd552fd4a6831d78f5c4af15cea03e1780a800c4adb7725494640f0b4de2c4c830b18709d6842754b695b15ed41ddb2ec039e99ef07a689528f3d6fd4aa49748f59d7392ef1f8615ac0ce5175f3e6338bb7c841859fcd40a046314a1e3569d13c07b7e163cbfba5a2a9cc2d5cc9c76e3e70278b746c97531db3440afc47356c705cdfefa6bdf4490d6c7d320a88286bee74e3ff2536a9c9af1d9c36d5a7554c14a178eb5e908b53825008e7e8fbb031810d2325fec5aeaa40ce6456101e7079111fa95ef20c67cde89e95d45ce908c8e1800f8668e04cfeb70cc2f317742efc4d1b9bcfccf931be299f4e82cf19d838f418d1a9cc512bcefc20de94517139dcb2e075c6531f902f2c985978aa54c789a41c8e1690def421f752e1c126dc362127b560cbef462d27d9d4de3e53627dc4d7d371561e504f0090e9f302fe7fd0d493e184670835afae189a065d340ba3f177869ff0dc6ee372af2f3be04120adfce0ad082106b5bfccd131f85cb317e1166b7e436c3402597f3c6ae2e2578875a1f5611582528e058aece2ddc33a4dde3d9b0083538dd2582f1fe30f91a97fd1cbba45d211528828ef51f5dd1b3076436def57872c4ea8898b40e2eb739dcd698317a068566f6ad104e9b21febfd5ab7af4fca787fe14a949a87ae9e129c39e4d0f4bcfed911fea7d09a60ccbb08c1e30aa3a07ed5ad802065dd914ff60f8ceabb39dfbd23a10a535b4d490b14bb736e86d322c0b41a14d5f228d127a55c8e254bce52cdbb85577cadebb3057c7d37012bc79867a790cc5d4b52b74da9ed073a889b5d552927adcbcf5ae7e27db7d74402684a9a3377725d78418be98a28bfd47a89477df6eed4e8c8842dc99fcf19de129c7f82e237cc807fdf9525ce777e992a7e5a6fa941937a +0x3d71f08e52812bd83b34694c14eefa3ae29bf4084e608c7832d23edd52d33972ec3164f40477f4c45ae52d147268ec8c +70720 +0xc3bf9dfe9d6c26f543188fb45729b771c726178cff1b9a185e3faf96e7d49d033a4f1816c2b911c32f55d203278349d738e4a48a12bf1f37f3a31a8c624e6fcd20ce021c5ce69af726b3ef02268f04078e36b63b4d2895c3864ef47640df3ce55f858698d3bc689b0f7b0e3abc178d08af647526191da5c1fe8664dde94fad51ddbcc9138e0324b6d1f6593152e18fe285b608d3df67f73b45949248c566691b84bbf615f78375515669f6714eb7b09ef77398ca05ce323842c0a73f3cec194b3ac9332475030473851f0d821a5f9843ece54c94f51affc1dd51cb4ab6a864e7e92fa8ca704d7824465fc7ea1ca1f0d94e524db8151305ddfe9125f29b63f3f978367f8e50277a6c81704b33be4760690403c2becf81ed948dc6debe53e56d88cf23ddf87e5ab2541e9bc2e467178ff9f640d42f8a2b5eee72391d3746f67b9dd641ec9160aec7e3062854867edb26940c51ab91adda01f495320be3dc5ec53f75d7d4e05fea62221f5f28a06d59cc3f2e7d6e6fa2567eaddff8d04c7ee4f276942cbd6ee4d82a17528767ba9b5a2a04440d464ed0677c2236d593fa9252aa4a1b89cec1553ec8cc88ea385d70a5e8ea36495ab89fd5a359840f7c74826e97c4f2362f631be5e349a7cec40f5404adf9ec79d33477679c5cafefb542b4015feb017b09dc9f952494987c335baf3d213a4ee5d84bc0e60f33a0bd63ec92d2aac831a084b2481532b7443cacc6e919edb445d59283e21ba3e440c1b1fa82ab216168ecc76f7d2fb7ba925657da6a60b970b790286745cb01797643c5f5ee526bc08fa8fb9aa8a958a369115d1e9bda2c748e5fc37c52c1d1f9298ac7653d9031ed8f1d47bc304cbf7cb3b6e61ae24eefcab08a8b4c6fc4ba6d43dfe0d0d72d1bee4e90d45c7de0944d578d1957a886aa7a0759a75e059b64dcab8a37c024f1d0cdb64cc902f72d7e1c3dde1f5c5648048a7913403a7d0f784e49d3f6bc8ca4f992ae984f3706fa26f34df120b1525da504f0027d693de89ecc0501424d770d3d431dbb8e81121134d96f0d43df068d36ef536c8772afee7d5cc75e46f94df545eaedfead6b83384fd78b7cb06dd89f5f548a9a85dd3ae8be097730274b7624b98e05a9d57ac1381ff3898490e3325dc73a7cd4a03345a008d8fdc010c85a6240384d042d3834d94d37516e0bca7b8d17a9136200fa3adc04d3415627fa617782efad56de2c44e281abcb8248a91bf8f6aa368bccbd80655a012c3a9468f42a28bb0de90fde5a1d6256e00770087a660d43cd982d017f03b16aa4b3809a7944daa45503e9d7dc5099407647aa6f009f047ec1d14a509f7db117920a13195a8e3fb36ded949e3444ce7176881f67156a8263f87e4c31489d030fdf88746cfdcd00ef3def37bbc8c1a8f2c913f67721902ff95be75a2de2294f5a7172cc1bccccc461ae50fab7028fcfca553058288cdab448d2549dcbd5ea3c01321342af2d52340fa65a06194975ec0104266d01be0db958460c3c9389a8730b09b2ffaf8a26f8030e538369043ca7a0bd3f5c8a1ff4e5329d58600d672b9c80dd962aa34a11b745cf8499309daca7ad67c14e4b1856e1ddc18031c2d53a5e699808ec13d5db19dbcf356ef47b8d9533ecf56acd0ffa546198ccd6393c9f61cd21506d88934cc8cff8ae2d4006a718373323d9976da9e7c70c8378fa05204eb460b6d48aec2b69293136fc99a6c2d9c32493c2319b2b421604ef3e8e9686cd263d824a9f4842a7ef61160389c3a57fdea78c4e24ff480c566756517c5998852ca0fbf6510f57272b72976c97c519b391a458a5f703c8ee8f1f01d84cb4201fcd716a0127a93394e44bff5c4c14e61de3033dee320e728fca1338fc8711e44212981792a97e9e9423d496fd2e18d464dcac84525e870f980f2b43e5b4d7ae9701fd4ad260f660cfeff5a677c73aaa31848874f802d867b0644f69ba5b6e44c6a5894be8d37a40ef509675f29fe0322be47d5708a6684280d367f3a4043e6e76032261fd8b7007994e9f4c953c7432fb037473acd29f68af635b29ca38aff64f25b1d6390e427d77f2f87388285c7348e956120a0fe5a1e61c1353557e29a3fb121ff0c3e6566a31438a32f4eb02bdbb9f097a4ae4a2b4cd0778b96c5f143c1fd252f8c49a16966f493bd1010bccd8fc2c77f395da3e6a0b2b70a33862d88a666e343563b3e9c9d80df497d612248bb29886c71378218b4991e458e00fdd5575edacf1c9b836ca14969ece9c88719f85ec203ceb46b4df2e3fbd218dee8b64f757a1721d316762cced1fbc7af31add1f2f2c9c46cc5d2d633fe14667884b8192b4fd0288a7e359a81861a999dd890a2569922d4b93853f8f993a0f95648372ee0da7e732a112774f214adf20cd25f142a23a38232295db5b53afc3400a9d00b469876942a75c836a0fc4a5384c56591ce30c04f501f3ca6f7727ac8f03fff38cd185d2e1412947a0ebb64209e184095b33f0dbeab909d3720c8c10abd613131d4c896836f8e1899abc07ffba1417caa89bce032ad13ec00d1bc538bb0b3f2810e27b756a53ec12ff8aa124746d7764ab228ec5dcd1f958e7abba6ce82bedf90c9b433fa4dbb2aa785e6bf95e750d9f0bd018692841a462a9c453f45abd844fba80c90f0d169c18ad3f4dc5a1b33f4370ad543737aaa6a7fa6e781738496cf2c298f62ccd8e102645352fd264af761784c22a77319467ef83b2111eaa570caacbecb0e00bcb779ae948f966d0f21be4ec1683703e854f01eb970651da70ce3f7d82e071ef533a3d408193ca0d03947253b1456b8407c6a7db263ff8ed1b197882646f28a2b0bfd7f3e7e646426a4b895f9c5ab02ea134a7fb66a45b0ee1561e7f9a434d4c6a7030a982d82197b0a6f1b8dea88762dc01caf25f1ec26349ebf91f2a46281407b40f0b5b52a5355c0f71077f1938483e95d86919937414db41d1071e5e002311f23ec0793d1844f6edd3f488940a0a515899079dedba4a1fc06ee27d751fa110948371e57fc3eb07a8dd26000047cd9db3d575f212dc2d9ed098565072cbb58a01a7c6a502ee5316a85846ef4735bca90c535a20ec22e4dfda160b9e3d4d8709a17266c3ace1a4ab540bfb5e501cfcfdccdc5f3061d3986a44b1ab6fbeed4014dcabfa4667e3054e16c0ee530346b8215c382c295b3970c87831dbccddf208341a1c29371a3d9e88553dc7d948fa169e222f6813c19a9580dc5e45bb82a606efc38b9c9dad3898e07a4b2df5077f3efa8888bbf67b3f2e1adaff9147954f63d03fc1fb80071a1bdfebb2c8b1281e59c0f50dcfdb7070641fd9de6775fe36465cf686ede9122b4e0b113a4114931f8f75d18449c98a755f1641c16d4fa5a3d81d51a11adeb5b55aef54ab402631ca07a383b6d4c9b095468779714edc72dd419ab6dc2b6ad8fe67101dcc6cf0e866ead1756b16e2ca1941faebb6b0244e2ea85b8efdc892634f9cf8d2666e79a13d5f880e6bb71cc1497af8fe573c301fdc35e942cd98603ff0212edd41edca45958f4fb67d607f7b6d16081a1e9907cf3012cb381444db52291f3aa42592e9bab7a2aed56bb914e1cd40b3a7d16fb144726489da9a730b8542bea591da05e0eaebbf2dd3fb69e2dbb11e800d39683768ea56ac8f26cef9c18225f50a27edb7bb790e5519f619f15260d8f7b51e2aa021e00dbbbe82fdacec337db579d6f37417a8b8ad0d23704a2c2397a005485df4599bb43ed174a72cef9bed6a45adbe21e5c1e5be184c17f453428304667eaa3cf76471bd2fc57482b3029e9ed675f7c50d0cbc0ea337b5f7ad05c3aa418ab97fe3836cc1403d0eb51fb2b7d894f5456976d1662714adf35c24b3801afc3231c50540cfd16ca31acd1af261a1e7f751140a580b91d476792a9f96e1dd013fba1645e2bf761bc143d38e09c4803741c2ceb0e8d1d24c5aee6905f40f7ab678fe7b8bb36637b55d2ece624007fdec9d419f50cbe374e321fa224016317985a7a2fbbff9ec9ca24086c67edf53a06ed17690d34767ff0092465c37447063d592519fc9fd792d4a32f1c4ca2ecff225a508a81fa586f90d777a1fd2c6f4bf0d02b16e9107337316fa17ce2e74a47a7ae3a0f01d2d67ec71963e73f9e3e41597bf6a70ff5f45f56c62a2ef92fbf9c0d351e56eb526335f94b7386194e468eeda9125adfc4cd53bb530372cde09f74d99b9802cd0da11dbdea413f08b11aad03e408a2e6e170cce5a2d808ffae7c5a835e11832548f2ae7b7247529c6b2cf462b9340fa3f091135c121251fcedd8d590d9156862b8ea50b87fe07122e0f02d50954f01955680df854d4cee4423274e98b93e2323b1fabcfb6fb70b6a9706907404941949a7c27a07a0d22e73f30a4df16ae633e6e8964bcace3581a201c2c63383bdc72f48f88b49a96c92fab1d45c315a981b0aa16f759d17e69487c5c74715af168bb4de757bc1e356cc470427e1ef24de592d90c8d2e8e934947a37869ba0c358e778ccdbd416db3b3af74e77877146237ebe2b44dc449eca01f7fb832c5b7cdf6af9989e2caefd745f7a1545b56e3b01ec4ad5660a26b4f17d9f763f81ac482476b5c63eddf0c6bcba4ddd04e43c7fe4324223aed515d85557bf2c3e242991c29b1bda306082c35ecbf12a479c728154e1329a71d57865603105a1e19c4a063468ba49057ceb7ff514f271905696ebee69aaae7183e4d89c99d16bdc428401f4300f97305b8158fa15c04751ab201bfb3bf8d40058d1ce84e2c0ee80cf7e017cb18a4943b4faead85ef9100df294ae05f8cbafb0ccd5a393bc42ae719b8ea1484dc8d3b1f19eb23a50eb6047d56afeb8f09195f57856e45376e520112f3c5de16539cb0d9a032b8a8c45bc71cc199a6ed3d93b60b3dc2d4eb316e7f1f31d93d2a86ba3a926cec3337166892e2f371db21300e46537ebdaeff1566a96af88ef9687bcd237203825df90ec5adfa739d50d3ea735955cec79a1a2222c718d34cd9773cbeb1a0ef5afe97b35a608ac987ceaa74ab3539b84861e4618a2154477ba600d1762d45b8dedeb80d0ff3bb7e951c4ed59d2228c1a8cb07d987ff44de8328aa40dcdf88e475c40525cdadb41931046815306a4a7350a02892ffa8101fcc271e93d70e92fd867925027ad89e22c24ca03d4e54c655a6a8f295dc65e192be6b03d251038a8b7bc6c1ac00baa021b0bd9d53de27c4ef13ab0ae9047edfc0c2bb020331079914bb71812c459be39f621f0862c72c6eca00701b96613b31303ee1c3305f60e722ae420c8933c58e24423a886ff3abea6dd3c0cba5d9e3006a9ca3ed60c2569b3cbc030bcbb17fca36b7d5c68449eb6060f663c21d56c073f742ca289c4433deeb4d7a25fba610bf5f29ba69a8b136f92ccf21a906bf18b35e9a1e1eebcc3dd7b5c9700320fcc1942600af1ae413d2dc58c8c22869fc34e7270a66745543beaf2598ae4d429ada7213a57d813f5708336c470de64df45c38dbfc6cd5e28ffc8dc022f9aa6968a380af7eec45c1662023f1b6cb8cba91d8ce01d7f6e79b99409a10d01cc29e4e63e781f4c30f722662d66e7cc4c1b8baefd02103cd528749d1fd9c08dd3ee83464ce1270cc865b8016746b01c02e5057ea66c4e8b9bfae88f9dfec3306c65002ec5ee858cd53835c832470ad877b895111ba71ee81d6193cfe6889ba5d01dda044be8d158f1df2a3f20f06e8e04f6c8eacf1b07def3ecf4e29bffa03ab9897f6b4188910da8db13bab5db41a9552fff7033609fdc9a0d8a7c20dc778b73286ed839162b0754bc70ef63503ab6c2d4c745eaf05d6d8a33d2d117979804b78b36bfb53a25c2afe3c031bbf7a032e885bee04842b70e4f005ca5d2c97822d1225596286d07ebf4e19016125a18aa30a324b3ede0333b52e3865f04ea9e826a7e4a00151757dfde565f2128c00a9925cdb7554e516881206dfe610063719fedff92620dd18c1ac6828bd741e20c6c4265e528ec0ebd5c4200134067cca7d7d646bd5075241b294826a4ad003884b020fc1cc33980b839423a6391ad9e97c6bdb4294fdd779b87cd934816d63c09e12bf0eca8d94fcfb47b8d6dc93451d7e8fef874a4b94463b2e158d4a95655129bcdf4d33e2dd48a4a8869a05bbe7edebb24641e13ab233a370df7e8d8e31c252ca1784f17b9a76e57e36f99cd8e8e12b9c8878401059c5580bdf0e32a1f09b83020ebdeba0f40f28906ffc8a336f81a6155e344f15b086c2c7bc452116ca65232e6dff0999139ad4a7daaab514a556c5e5707ef693e0fd496b1e2b4235e6a69a14db5333ad1e9f518b1e0b06c2b2e7eed3655d1dd010b256c1afc97d456de94f7d01bf51253da70604e4276587bdbc8aa9e5daac15692e4f8f1426bb9086b3ac30864e4b499a395ddad407bba9ee5e022d9afc8baa13f89e9ef84ae25c5a8e18f7140509615addbdd495b2ee716e54bc2829cba3d73598a9b6013edcf21101fb9850ee74b5a81b8ebcd030e827652622613d4fdae4f897da9ed7098f9ad295bedce410728daa7c39582c8a8f13fb5d9ba27c911918837c982023b3e59cc5d0c78b7873ec308887247152c7cd7d56808eb18e9849bdffcf4a028d45c53f133d7f6db320cbe76bc5b8cee9ef89aca11765571c6c501993195a0dbcc616cce4614e493e1ef5fa7bbc5d399a0babe902ab875cce16187468e02f09593ec28b5fc69de9c07554b1dff67c780d211a7ca1c35c884b9d8718a5af31be0bb6b0c4adf3d213e22ecf53c0fb7b54e93cc0ada7e74ca33c09874c730bc8f47b34c8bff57057904c504d2a4551c495d76184c43c9fbf744863ff57fa7e5c7251c3f2c360c69228a5e3b87c9782bd037e9a4e0887741dc418b2d682618f55013468161a167ceda296f0f792dd16d06587ee06c2b1edce5b53fef615d1c71b69cc2d1c0a3e1acec8c67df2b4409364859966953ae1933a01a24f465871ac1672c219ecdc01289f60de95912ae883e0295d08e1b840ecca7eadaeae926ac8afe3be346fd8862fc733853dbc3bfc6dae1a7aded384f682e4991b22160de3a34c8667878b45f6b7ae09647f5b30a4da352099f053e52addf21b95b4660f05c357216619296d7846bcaa226256510a51dd0262444a2505835acdc26b86e1f7b2367d62f33296356659dd68ee95e6535a0e8a7ce49e8aaefe86744b4f5fcbe2f85362041b8c09549eed6bde2c0037aa7d307e90d8395d4dd6dcdbd768d714ee1b1498f49b210efe76e01d2b23808c3543aba7452601e50c91c6c90fbfd70642a5e3e6d97bd7ec5b779ab9f8dcfb2c1c33e8cd44d8e06c11b9aa059a5b48e7071e27155cc198ed92288407ec5d5a6088d64db835f6bd3884d5f25822441000640c47ed24774b57cc1204d1b0b08670a1b2432fbe867f928e6e058a4c83199982f9ad36daa4d87330bb83ddebdd66a48e5133fc8a9210c2570b4b63c21f49fa896cc0b825512689e7ad6af446eae143783b83e53f21571006342cab2c208a6aa0eee83bae851fe118701fde69e1e19786f69db3863c3cc4c3721029318fc333ef068d861c48aac2ec8a0c63fbc94de6e10ce72e06eaa725b84b5fa67a73dc9b9f3c176218a2af768b85974ba5ab0c79b005cb1d6833807c0a4981eaafd4bcebd818ef974a9c17431ce92a5d0e8e08981c67af49531faf11e4f4dfbd77ba4d6ac1237bed593dc872c73c2c62de7a288b4dbcfd7b70b71d2c6cd3dfe77a2e766283e4242cee8eab4ab6080523bf7854996a8b1c796702b015ca6eea2f61371f1945e3521bb095a8150ed41c65578e740b9b5d740bdf085113274d695ed4de30d830a96e83485ca819fa29dbf34ec771290ab96dfb80d2e970abf9c23c7a2a92e76cbdde2c5deb91a0a08ea9944d28313bdc276f10f3675e727df95f91fc232b8e20a70cde98484df0288bee0ffcbb9d893c2fe211e0d09a62c6d5a62501d1e41575f05e61a17dc251bba8132d02879d5b505a2ec7ee138388ad1601c0323da6c3921f3e7c1f92da0d816e7eb608941af8402fbbfac63a032b5b43d729376e57e29fbc13f9ba8d7b6ba1649872b5ebfaa93537f271104c0194f7e48f29b76ce0b8c650459e1b788fb24313c928b29327b657f839f67352640caa8193885b402a8e2d623c34ea5afd2b91017aa2a6948767cdfcf94f975316d99ca34a0ecaf11cabfc7a5f82ce3cad1eb0b811a63af70403c0cb9b452557fe43f4d11c82ac879d595c201852702587d2cbc0f8fd16c385d457eb85a0c5670494db9471aeab0b97de75ddcf6a781d7391089f956fe100f120bbe621281e8910127873b1586d84f1836e38ea938d2d59a18fdf52c343b632301344d6a5d9c70a07f4f644499afa93906fbad295575b214b890796c3e6ee2f4c888b0bde9d29dab976a59349db75654da2e9ef3880b1b3d71ea0c8356fb0d0bc42452a9c13b6697127090420d8fe4e012d50a944ad37f78d753152e28902fdc768f99aa7e3769d762ea90095389c39f63874698088f4d6b5b7429b92daee9eb62230c3c7b4715f12b40df071a3580b72ecdf95b5b9f036960b5c0b0c0a7b9bd19a710dc42eb0988be1be3a7cc339adbe701897abe83301799a060a1ac2b1dc60f544e065fa3a2e2adc43487e3d470722eda7d52abcc61da68cc80082aa994aab5e31a473c0170b37ce24803fbc8a01e58b15b9faddb07465082a550d693acbfafbc1c1b7275015fadeea4c86e60b845171e8a9e2f4f9ecfe36b57183a89d4894f47b9ff6d8ec36ba351c131d63d176acc8ab0faca9aa6fb83ff0bdac0ec8aac272e8a6fb7bf355c1fa423ccadce4c13fb7e3521ea3c9e4dd4b639f5044c5d7cc9d8e3f8db76e595556e53156f94d4b52671ada018b6132b381978036f19cb9fa9cf7d07334642cbf718c59896113fe2d00d70f1c087743830a13c927be53379398abc3769bddb54772bf1c2abd3ec017a9a35939c315fe940e5fe0eb52f438e1b8307e5e94e1dc348206e203b4d77b5a8a05201e63424b30b4042f4a5786a62a25106bf3c67989d0c8ea13daefe4163ccc85cc949107129d24891c0c721268b706d3f0fcdaaca4616df217781570790697abc563f56b3b24877611f84d9f66d084ff77437783153098a757a5cf808cff120073533676af0d055475d7903588bdc71e678e4604c485728f3928c51e3771660b3f2cfd3054a0c5aab071e3dcb6c5f6b728a6ef399aa8233426cb9e5162a2ba548fb5f1a21325f0002a8eec9dd83139532253192a7de0d21e87540322f5db3764ccb7bbd3d5e3addf4af6567fd649ba79bd5c6cde5676a7d3c28c9b97d86405c25ffb02cb802325cd7a70c78b98559eb1618b925d0eb2cbdd413b0fbbf3854bf6ae466f93fd2d7f5422c6e7c8069d108476a630af8bdc66c46a2906932e8632892363aa323549e4fca8be603e096936786476f1ddb73c9f0ea71d292972aee10225185ab00fbf7c4c7521d7f58700381793c37aed791a9f455fe12084a54780e91b2f271672d66eccf1b6f7f669ab3fe96b5576eab8bd8ef0f93b92acb19739c76f6ebb6b48d7e3048447654898b2737555f38bd95e6e9398dff427aa7ce73223889ebbb7780a027d979accf3fb5dfb43b76761c45275d6c478d48885f07e9385ce87d202eab7f4be9079d20079f3ffdbfa77a1b27c1a80fc2ca25d45f4a68575a9f0a6558626e04fd9aa1f76fcbea9c687ecf3acc4a5b9c963284df36fa5307c81a2dfb7349fefb9d8f55c5d6b041f8bc58dfeb9125da8b1852c01954bc4bb21be662631dc694983f72431bdad0e89b21b246be14e8b763efa7721366f4b4eedc80223ca66cd15359dfd459fac2410c3f377e12c60774af82bd154dbc3821367083e7d8aba137c58314a410a4f8edc47b45009a330694d667e01428e2fb02f17e4e4dc79c083a5731dd1cc077e9314c6c5758b4da7a9a7105cd194569b1fcd85c5baeaa06164b80ec85b8f9d217ce0c690ae0e33ab7e7f7e2e07f23cef15133a148a4c068300dfb19aaf32d4219169d17cc53a5b2532fd395a6c034613db29bd371aadb30f9d40e5fb975cb4641ad76ef180b9cffe0b4bc84ac8707eefb938969832b3b0ee84033153d9b546d35f522657a930971c528eb364e3e0ec6cf6684e9d9c060406fd511e0a3ee69156a8017f17064ab9694ef1831284fc9770dce06cb01f4fb7414f5233888e979dd63c0c039760ad3fcc4999bfbb756c87e4b1c978388236d286c42df836916f7339649c3a407e01302c89b1efc67cd7c4b1be4afa9d8e625cbca20bf57a0e171a6968d9ab7a2aef9573575f9b9d62e657bd4b8c7b460b7c5dcd3213b3bdcf379a4c90eadeae2a1e7588fbcb4ca7ee4047f2a0b7839dc12bdea0bc6eb9689a76fccc23f75b424738d853bd1f894cea8d9c3704f298097718e51d88438fe1387c47d06b2aaba049e2c7bce580dbf41c775e73c16544f2f7eb7d2cddbbbe9271f2833faea9552ef8c648abba18c9074ea496901d390ec0074babb505fecde10c80b903359ce1561c8c6608850fdbed46bc4c7561967edc70e079a046334438d3cdf003482cd77f7cdc26bb8e8d990fcd68860ad4a31dacf953eed5e982acfe8c8230272f80c010e15c92ac1db98cd3aa504e37c08972996c4c123d35148b9b0046815731c2247313b7b1c47abb3ba2a71babe46b6f060c9072eebe74116c77f7c2ec7b9717890fda938be9edbc2ee58a71a6f91e7e5f6b2c6e8941eca1d4fa399e787baaa9794cfe992904bde4ee021cfc455e21de071f09e7ecafe7ea4d8c8d812e3fafa07b92467092fe335a0263256192fcbcb68691ef861deeab175e95bc1314b0f12418497bc0cebd9747f26e6d4b95b9372e6228a5f326e8804e907d8ffd35b4b75bd6d96533e62b31d2478dbb60557ed970254bf5d50e83b0b769accbe79634487040abcc6fe12f48248827d848da34eca15664a5d5dea9827c738a3b784119ed89db25781cc7b025643da38dac2cc1b6ec7eda7e9a9d413dc23680a6593d49eecf31b031e3a19811bbef6ba034540f8077241548cd53332ab439f4d33292ae9369c9b5be6c76ce525125e6d9875904916ad07dcb1509679177044f8baa492f247f2b9ae85e4e3a304d677c024e438a33ee0b7ace1bc6c4ba361ffa966968b3e83be0c9776131c4f5d73d95e1301a88ac2b5b741b869234ec17135bbc18fa2428c36fa8331f2854e719309940d6e7e545484bd378ff759f704266dcc55f04692c3f60a1e33d3ad25038c7f0e5e7b28b466d60ffae2e78eb8fe0a3e478e5906a3cd83c1a51667026765f8b03980c8161f7c4246085baa2018e194fda9e53a50fa0b5897d4340d038a2b4023823ed5e4f9f721e5ec44cfcc9b814f428ff504c409f00d231827365f01b5fb6f84d31503d88a2d662358b8c2b54fa193563858ce582de9c9ed6a834372b892facdd816013f87ad5d29e205c10a9f2476992996de69279712c068747f3185af3ba9c8494b93822a218c8b2745e0025052c5335f72b14f9d843dcb7a50e2bf98c8c52e3f61890c3c59a7beadaffa1bbdbe67001339c53865a4b1ee1566eac8f8288c6458e164785c7c27e7098d9d4db51ffafa4282296467eac95ac63fde3435b18c253629ca78f2ff79bebb6d6e1adf0dfd9c7dea32464ccce09c1d3a1173ea1a30cb57d93f60a85a098033add0f5a3fefb6115e084606cc1a42c7ae4492a7db916d12e4e17d1d52273e612ed5a80ac7950d2baf3a445507f60767fccd9aa79249ad12a17084f11cf355ad99a8f2e40e3aa7bcd920667804cb2149c62478664d35945eba2653ad6e6ca58e843d36119e474d6de5a1f4974b0259141431740b94bcea9e3aed317acdfaf5adf67cbbb9ff22c5e6daa735dc65017570ecdcd5bfef46767926ac6880c3050fb2f74dcb02b735d7cec019726dd9323d07580de5a9e73b0198884b3ee6d7f5b9448f98ac1750e74dcea0def3722ffc7b7e5faceaf2030453a367b1fcd59232bc0bc745a71e529fee8d81e00014f0c6f58009a12dc1cc073441ccc8e9747a24e0b1a63c044043c781b46b06e17aa3fa74b35fd4f63fc9ad6c1abe774fec1934ecdb35660ba4adc6cfea6638ddced0ffc0bf682d8d93825ec2d745a67464f7c8aa337ba904731704a0d87b5e3d35ff3da14d2d9539e77f830020693da1059a4ae06180ee36d40ae9bb25b1614ad9b91cdf05b4f243604982ec9c33251ef78c20570d4c1eeaf00dddea7a112749e28504418e072ef32867c54ff4aa44336155b4d7dee81f68eea848f37fa1998578ec5d91912e2f916761b2f0d0d783286b7b6c287c5bdbf8f763929fdb6b9f45c1758f95b52fdf6544c0b399d6c0ca443f88b21190ad38e233c723b6377722d0e8a80216a31424b7e80a2f10b16f02d10204ed5bc2e6206dc95b63003acb086f130d1edb02e5e8ce7bca8e1e07ec1115df7584ceb90f7ae2e2a7bb458d713b6a6b2d4cae7ba812f32485378b813de159fc65e1321e30 +0x6a76b88ce50bab0682ee7cb670821ea8f608e7d70801e7785d26f9823455767914c5c87f0054a576bdd69938a6e6d9ec +71512 +0xada7dacb8b05165188a0d2bab906f0ac3dae9feecd398acd95f74fbe42ad32445d961314d7a79d78e517c1f10e1f622081ff52e6ad417ecb0c41659c3fedcf5860cabb4e9438997fdff6b9493de80447ee18ea7311fc9b8d74f77ac1ab21ce845f4bbbbfe93e722f1f44a40b6eea3ce82a034ddb21f049dd761f7573add2998e0222fcafff438f504d096980cbab73cdddc8656607a7f181bac33dfb6d87973ef0566568fdce5aaa114ef0ed79b512bcb06d185ee8a9f942e7eabca114c8305ed2efdd310c683a04111a219da3907f7e4afc5009ef7ccbe8a59dd9acca1eccb44ff64e5154979727f875e4d76fc224db557cf4b141aacd3b9ee37c66b60fd30a10729f11fce6dadc6c6721e205d5689a76f6ec9c09bb690377c48d150125ad26bc6bb8b92dda69e915f9c0078e51b285577120126d350607db48f502d2e8c3d0fce981910efdad169d32a98e32bc6c62a0f5785d95a20b1070789a7552df7bd278f5e2e0c8d60e2da91bc4bf18a0fdfaf98bdcc4aa89e2e6de5b65b5a9923ef3d796c3f082edf5f4e4bafae16984cd150839348ed473f251cef93e0cfe8975fac2d50c0765cbc835f319313e4cf1447b780968043ae7a319e85b0ec0794d86b0e0b8a56e99f7f0b68140521cea6ecaf3ef03606e056d5d05d388bb1a4465dbddda4a766d45f9d640343546c46b83c746152e04145c8d88de38882f628459da495790674b915ae19ab402f37ef6b8a33c94923d3d68d08c6cbe6450e064b2edbb00946152a6a1788eaaaf4392b396c69d1137f13251bdd2770e2308dc0af77bfc7d5d4ac8ac5605e2be421d47cba498313726093c3eddc0c7cfcd3e9d9eb0ecd575f30cf6ca02ef5f97c568e6666a82c0ab666ea157b6bf23aa6bda6c4965a70b905f8d24292c9ecdde3f0eb7ab71ea1118ff06a9c6d238554704c391329f166977a8b79af15c7af43ab9f602c34039ed24fabb9eb0b991234da0e35483e5a0b6d2d6709f491aeb9b543a080fd660d81c775e74c640f13456654721fc61c0adb948f2a27c59ef598cd3ca2c250b572d66ba33196b9b0487b6360265d3f6b7a53b8202347a4a622c8d60714a8e8aafa293958191d3ec7af40a69d8971f6a52f10428110edf44fccc67a3384a907cef9e6aaf51c64659d9e11ca5d2a029e519f7dce12418f36e43a1e24326147409a089b4b1aa9f0e0aabb8b293f766398e95208b55453a00f1c114c5e94491825849ca39429504722877e095da4fd2978d4dd4d82d7b5c4cf5fe8bda3c99a7019272cbc10b19ddb9dbc6c18d23e2cc8a0bc97c8d11cf6620a1816fe7e52d3f3bdea4f314b43e122c4a1fc36116b93d5b30927e70a84740c41dd229b58b0842766565aaf9e40c8c139e0a4edb5adb0b53232f444a9beed28092791f0cd73396fb4e40583a438c31b6fe0fcac1985020b80d2834e291c9059c28febbb371b52512c2ba659d7ac5ea5c93b79fdc772162d21506b80233e2bf5f06ea64740096d502e95d3aeb31bfa04e858935f4a055bbeb645037702940e91355c581152cde9015eab03deb0f8339d5fb0ef5d1baf41249218e19f51aeb6cfe3c157c5f9f963d91ee3bd767bd189f371dcc453a6e074e357549c559afec2e68e464bc1afec6c4bf1c877025e386b8bc144d8ef8649459f78807a5648f4a199b7439a90ef4740de79d1b71ef28d66eae081939d443a61ad7815320de620d14de151dab0227aaff51987f408b340fa75320b6ac93b442791d88b29e8ed23e0678ef972ac03f6f8444363c47c1b0394df585ae51005e725e10c7ae873d85e3d9b2292f8e0ee5cc830a9fd9ed5b445d47da5f898fe2ea3db1f963ce44b3230774d4ec6d3fb5c1c7e5e9fade991f97827d4ad5cdcd00ffac5a20879a3bb855afbf265fdaa67d7a6b902a6fd4b5d752b0d78f0f04752346c542cd599bd514c3e5a2efabfd292db8bd6d142842a8491cef3df036b5ee1366924f4801587a8e14b00579f75e318f25c764f14ab0da3e9e4897b47269a098081b6ad8a85a93f0f019d00a6c86276967905e0700a6b37d80c2cd24eaa7f37ad4677cc7762786000126ebeb32fc7184262041a070ad9bd06966c788c7f74f80717e6b5b9249bd87ece13e64704879a80b80f702c24cfafd013b6e2830e11c74886821dd25489e4c5c52b2bc4ef3a59cbdb766751f0c38cdf149a84b4eeec21cc02d849456aa9319f7802d3df5845f2ae5cd7843af74bd08e1985e3a49a5a940c2d67eca4ef903b46573982d8d830e182bcb13b2990cf1767831793e488f39aa366bf6c534bc56e64f33dcd53d79192f36b8210c065c3dde5f1bdf9d7332db21c2f2d3cf317cf3775dc9df7d2eedea37af9c89971ded070a3e5e7a9ff318f56c1175ff2e6dc0442f363c8b6d8867e8f83d7f339c0746b8c0bc03308ef0c9f154c9fb612a0f10b0d68394c7ec726f7b3a896a0762ebefb9c98110ebb091cc35a1938de10d40f49f33ebd97a43148e0bc43b64ed33f27171ed3690924fffa82b1b1632671d27f5790f17148ebb974b005ffa76cd55435347f383880db162e83989fbf2dba4ed9aa732ae4dea9a232fc3d36ea78f11081da5a50f02441ee111c9b5e9d525e8b96c8f64598a7628dfc1bae840ff1baf6658f2c983051fe0a4ad426589e42e32b4f29a6dc0d51aaff4894e6518865977878b9528869a863ed4430c628326dcc905b430148a35be758a0fe7149d4532b1933ef88ac1c8617f995c8f747ea418f7d63aba2260b34ac3c7dceebb78438ca4b1f982b7db9798ec1a7f32622264cb024c0d9e60e955a6e1d677c923518851990a459b767d0f13cd803460f61870db3391b44693ce25bb17dd68e214ce1d67d8c6a9ab904f39ba6af2047ef608d032d2cdb71886b62b6fad0538a0569a09b8a90cae1acef81c760a9975f52b998ab627279f7e004a6eabea756e6ab05b542a5404da51f621c02df69d112d5d74a85179c8f2dfc832f658185692aaebba07a720d8b8b6d0712ec87725608e544131ea12d83ba3a715cb5c7dcf2cc7cf5e291657adcdb226916d30d359e981d7a72e68387eff31659bf6a16109c52924f0c25e3faea3aebe28854b5262346cb04ea6b534e2c8f3ca6d7e0d0e2be438b217db692000c11061df7f033e68c9b8a5dfa1b84e2d1d509d336b8acb5e125c417c7a1e44ceaf41d75e623fdd9231ce7f022859cd8787b0a894c5ffdfcad6fd98c6aa65f23ef6aae84c36e77909f314055e4180fb178d7bb13995539396b883809e702671781db25c5204e258f597f4019cf7151e06b71a81cae3702feb4056c1acd6490aa5acc0fa17d31ac27da5d539634f007f7b8df3e0eeb53dfbf0f7de2397e3b705ed2b3e8b44ab7601c9a61f775c5329669f986f964d15a23ece64836e089f56aa772393d78094de5c022239812f0a791a9a5ff66a900a8742ac10ae69a6130f406c1c27a674973a1a509f8d1f837cd6e5936af1255f9cd44db381c5dd1a46cb11f39c62c0c7bb7284daa7821b00b2290db242c68f61d471a80a4132920b407063352daced22096fe2c9c1803c4fb35bdb216edf703fb9479bdbd85b50220ae77f5a566df42d87177c4476ef49188752970576a290a1543c6d4bccaadf07ab19ad89a00d9e8f3f5399744c380b0237f88989e379b72dab396884a78506612bed35ea91f4b3f1390c8281cdc14ab6ca34f9d23ccbac8ec927d2aef0568ed8934a5ea6b38afbfa7c28809281f3cddc48ed2e0b0900386ab3ecf4f030844015ea1a71e58e383d531091d9cfef365e1bba0d715ad380236a73721673ee77e2c03844b6cea86443a3fd2dd5619ff3c31b277b0ae720b235350f9f805fb2973c8186b0758a8b78d3934be6be701990c585971f41db7b003574925d79db054c18fedb46f640bfdab6cb03a2da23e6772c0112e15d5e69d1edce01934a0f6dfe3ce23fee8019caf4b4f22d4b73a38d0ec036a1a9a897748e23ec66293c24741571d3ba905d3d362c94b0cfc8cf1896bf49cd4b5f68af239da075c8069542a2f97f795514d3d38bec20aff30136a98af18e6d19ebe6cefe672c1230149d907e122e7e17622b044f9b1e94a0def27eef0b58bf11356a1a8e548e6ba53a9e3790c946870962adf70ca0570adf474ac050776f6b3e263cbe5acd90272f60de5f60848e3f31fda0d5496593b7b7248597329c9b18a5a4a3e0eb38f8eed66ea62e77accf4b99194ec58f519943305dec2a1fe2a46e5098e9a9c7fe8f6aa34d3ecf5caad156499ffdf065cc335752dac7a29eb1511746eb544078881d419de3ee6897e45c064778f67d533e279b26845e2638716bb88f832dcd863d6a1bcd19fe22b1c438039d8a8195e10f3eb6b341f8df738abafc344abb7a77843da139d8b52431b12cf653bfe56098a8405101fadef5da6506883c27486dd5c7607aeb065d979f1302876ffe6c05ff6ff5131998598ff2681707af011ace276d994feb8c3ca28451805dfb2e5cad9fcd25a50201afd545fcb51f95c27ac6f6deb1c83f539a6e66d56f21fe39fe7ffe2b97aec41f28f05a8aa778f751b07dc981708cf142c122d006967a81069aa4a6ef14d768d80e08b978b6bbdc96041a28c09d440940f8e7474cbf118b7d78431f8364c8f516a744eb2faa904d79bec59b0202978d3786e5550fb08d2486df85ef4d4f2873c03dcd77184b9e51e225a8abb0652e870eb44381b7329854091992a0b79d9febbe16cbe59a608ef0b982e8df308fb0feadca2a53ac0dd724ee6c91ba2715d764f87a65be1cb30732e61db0c0eb48c6fbfc10c1545709f49b1d21aac3078075e655b3c388080ab220513e26d549571885e2cd310b1eee97c27f7f0745bea62479c0080ecec52e37c1e32d72a6b3864da44a4ba1016a83679ffad0cdc7b44f8a261ec06e15bbe73d1e8231bdbb8f9b0e6019d03abca4910d3d775a27d251434ff458240ae752fc6c3d17942f9d465f02c238a523c632e030a1df673bedfd491cec567c0bcbf2376e288b9cefd3419ad2d18f1285a77e3879d5183d31a0202b99140010984a035ee8e7c49226e5e7142596065e88e5ee6190e00c24327322af6d763e27daebed3a8580acbefb5c9f94a41786d3530aec221ccaa16666ef6b9e401af90af9361893eafd2a6797bed3e4f75ef5b70f9edf45c69bc14af49b63bfbc0617021cb3ed31c26525d62196eacac5733d53e3272f90355c531704ff73dc874482556bebd2dbb3c18754c2694c0fb65c44eff82f43cc11153f16c0a401bb49dc204b0f65305b65183727a2c1607b7323f4d3763d85c104cc6d8f4e117725abd4db2e30a9707782721d97e82590d5a4d0334684da5c36b48bc5c9d6ce3be254369a44f540f8f8afd821eebd1e44e7f169eb914a8c30f4c9592e0e8164b7baee0a45d787b132a596502b724833e27700f803fdf1de6ac4ec3f93a4765a51751e56c32d0e848448dfe5236db2ecd34e7c8463d0a155706cc543d9d4de3873da8e24fe8eb14258a7329cf12522d17f340b16f352817babb4fb70e9e6e18784b3e67bdd449872158c357f7de3c16b4ef055b59bcdbad7836637cbab22a6ceecc6cd644896ec9c23bd9395afeeb641a94c0369438773f16148205e07d0569512dcece527cbd548ea02f2e670902adbf60ebd3ad3c9d552ab245f30e637186560bceb09622c7affd225fb7ba60f45c29eff2a3133db0881cbc09b492ea015c43d3071d5e201044843ec555b3bb42e7d0ae7f3554b05330627e47db2c953753d11fe26538d929aaca521a88e15c70e94a18ec0af038f7f6a295aac729d985f5545efb48a4c2665b2608a9e1d1e900c90cabb384544c0133437e9d19194b7fb963fcbc08208068de2dcf0dd0f3c5651f8ef380321f4e218ecbb58941895f77287685af544a77b39c4811a0d6c5963055477cbca4bfd3bb51b1c709c0e87a2ecb02863f8d713cb91e1b8d2d73d5cfd4e2dca3d35c945141348c2f9927b54fe909ae8b07443323ebec0e7dee3892d6d57095055eba5b6b459fb15bb1d67e35487cc0e070f91ee1ee8e97807d858b4fb467371dd95e73765b0bc7d7de6db1cebf9ce043171c82db136e5d1155eb2d9ee44f0959bda95af6d4014620995dee70d0d2930f643f0d941d13b5cd01fa08490780a245963b90815308a2c25d1792c00eb64fc1d2d12d914e1737f00c0299d270b4886ddd75a29a5a9a7439a42b3d30dbc07cf70d63415728d16a46cec560cfc243223efdf81fa65d2f10f2f9194c47ca89b10b5e76175a5fdab32dd492eb957ec5163592335639cd4f2f9ae6624e895d6a729b5079ee1f45aba911b7fb98c7f8b2cafe24a7e4c94d63267dd686c25a06fb38138dff541a6cccb28ee37ff6ebe284c6d51fd649d930138c286407364e49a478006176d7d047a67611e1909455aeb37076fe3f03ee27c8c736f96418eaa80ec8ee6560e7d568d15a372ccdefb9cfd77e304a52917c970b6e06111df893a482913a144e12ae42c5e57b3f98676cc86946bd8ea18118f053e732359543fdc1b8777ff8aed6af580c9e3a9470aa032ad1405b25bc3127e62ad937f17a896d8218d22c8d03b26d2b1deb01c5f715f169b811b5b9f3403dcb08ba73bf3e4787581c37dc4bdd147c4e62526d4e8c39dbf7862149c5f73cdf2165e1920940fccfc64b1eebbfab9b3114727ad988b0841766b40583b43865608bdb050f6a3317ab5f1e0de742ffb5401fd6bae32f04933839ca24f00f2778866cd08b485c75369e851d7b6b8039d10de30798f68be8e5b2e341061b5154e4a536defad94a97b83ddab1edc4f1ea9d1ee07daba039ddda1bf5b12f62053118319c5eca3edf0b4afdc283eba0129267e7bab1595cb3740ed7d3831760b55ca1dfefe87fe564503d52cf0beb696cc1dffcb44b28a8731be27b1f4f4493cc380ff4b404826985072de162a263ad5ae953c26f93a0001365f37a3b6e4d77b443c1147b2b8847bb808b0e2ffffad8778961cd6f2345fffec2c059ba787889280053b3c7d5e7ec626cd34d896cf7774d1298a2258280e4afb2c79e1ef68c54720e36570c8c27d4341ca523f1821006462546b51539e77aa0c687cbcb50cf464ccde772cbc6deab8b206f361ac7aaf1fd321a8ac0a1f01e6c7e6f47621fd7faf2bff59b881e62bee2089fd847b64ee6ccb98297ba63214c8d3b0cb555dc2ccf1e64df45c3eb5aaad345c5af1ac662515f2c0d6064e601816d9cee7a28ee345f1a4d02e601c63cdbc9686f0f06809bae0f1a197942b307599804632a4dfe850790e91f00b4277fee5ed0fa9c8d7d316967043556e652a9419712292a5765a574fcc9723a7d879a4eee1006bc3204ea1ff16aff6dd23d6db5e536af1eb7bc1c13c85ebad7a08f226a01c6020276c02c3e28cec64278dbdb32fcf2436bf17a3f608e19378cdf869eec34337af3de276e5087a028594cc6685558d5a4969718a5e7b8a996ae7d066631f018e004dab326d3a86fa436e0859b79934131231b3fd615d25046d12b971ed7bfb6cfb9feebec53e5bdb85fb681fb3c16c58785f028567755ddd6894db13f4a1dcd9887ad4a353dc9fad3285153fdf95df30663a89a9d88cd72b42b65dd3e0574add8f28856881defb7834523741a5df33a3c10b6df11c6a3ef6e5c0673a1a66ed81f8ef2895b60a164572aaf5ae6c6510b9721ad9e59bd7384738fa23cf08966fccab18e5b2592a991bd4d7770d9bf01f7b61aff30ebd9b6d2523abb71a13ae75c790eae548d4042b034220e6e69c4807f07612e3f3eb7d87988e1d4ba3a378aa7890af50de8e617504a4cc6ac2d63571209a8ad21c8b472ba8619608f321bab3e991ad4efdef081e26e2242a27b17f0514b361e81207bf035e845f1591f33d3b227c2e052c5fc3cf71e5704fa095ed6ad3aadd4c5cc5aeb7c1e0c09b0583c9e8293a78a0f3465830ee93f800b2ea494965684727822fdbefd95b00c2d838266208b2d345da0c90e8a4d50366e7185949d3d4e7a00dab1052afde69b191791b52c7cb891d6a1933a09c94daa8c687e61324d504e084a313884a524191b8b071606c6fe14f2ad609ffdcb6c6f0d7a0b74e6055e70e6f7ead3ab39dd189d544f03301852203a3a9d9ae6e240d63a3c996a3903bd95357a4a610f0a961c2719d60748df495635bfb6d5459c7f72bb16b49babb6f20d7c27dc6b10b5c3964132389ca19a68294dc358b9aa686ce7089ef993ae9d804c13b71d5c60ba0a096443e33deac8231c1aebdfc285c48d859b4bb4ecc2260cf3947e89af6f95ce0808b5625584e70e91057fd88a583f75f0fb93930176feec769704adeeadc783f4b70d328df0758f3a9615bf6ba247aa9ba20d006c4d76b36773dff6949bcdb061f7b1d041be02297b55441100e46b9fe8072e79a7a63bd628b366f03bca26f7c23359c81b5e0b71d5cb6169c4af19ca88c36e8b2e21acd94cee40274eb941beb8025b8665510fdcdc5114263152d0bee04f43a17a304831367ce21837d9dc7995dd4da7da276ddef19ec2d2d1803ee17113545916629c7297f7d32fa1bc25bcfe3c8688c451c3fca7fd03fc2fa7a2d6cda7f71e8d392821c3e779f9f6c0dc0d53a8bcc5ce50a0ca72044e0e9649bb035885d26e391469a35cb46ce3b1985dcf389a56cb52b472ace24d0786cfe6d5fba4254cc4b494df9bc4f712995c9329871f89cb25fbfdb8387b2fc6f116ff8234231eecbe8a2b085f9f1811677251ddd96b1fa052148cefe1af2512da16044e2167cb28b8245762833dafdffa7d44d91acd946ccc46f2882ce0d561ae3785a867f4d2875e1d9a7c9b4316d4bee7fca9df99b097111dbf2f9ed2b949ea16041f5c3c9d9efcc074c50c21f5a6214ce9deac61dca5bcd34344abd739122a1bf01192a1a4c620d776ba4a6cc4bace168cd5f5a8711f2c324f45d870ed70cac3ea3d8fe6809376ad00fafa85fc8911df662e3ff02679eba513c1a9224eec68a852d1c85da99d4acbb3d580f0159798f1f6560fbb652c77963136928dc5cb6033baacc099983a39bdfff8725d987cc008cddbd97ca5cd5c90382328f5eab46df081fd0d0cc4f0afee55c243010d9f238e5d2e21b660d3072d98f5d10d362dde5969610229c86739e745d1879cdd853ffd14db7cfb4ec403c8c45d2f3630ae2de8a16734931af454435084948390a571df85423fad9816eefc5a97980352abf938fa8e38cb252e8b6cf67a0e57cf9675903f211e6005420522bc53aff724adbc94b53483248f8c4bdeb820597bd2de97c9a2c66d94feebf2e67a0feb741f39e4b661f88841a284120315f61a7242d474e640c0b1ceed6b44b2042abf1cbab70e089148cca516ac7a948089a5dda81e7970a99e8f706946671ffb42bf537fdb94f5c3b3c4c1446be1ed9859a0107b1331f33dbe5b1bfb13c68abfd640bae6ee161869b80518c458e488bdc47dbd24591ae88dbeb9440b4a0f7cd25407b588850deb03c4123e0ee9fef07178b3364c66b0bb1a0e0e6b225f9e80d35a68c5cd26f8e8127650839c959dbf53e4d50e5bc28ff5532aef03c8dae0112347d87e3d4a438a263d649bf5f25d3fb57757b7cad30521c9a3bfa0772290b852aafb4141758a6baf87a2d993769a0c46ceafc5123ebccb0df714c3b5fd1cd0d1f235b1822f49e72ef3bfef0da8e0af684961b8da5c134b609362dffd90e11531cc1c4167ddee9724f0002ebcefdd93aa8602058bc1a54d92174e77b6a489dff28713737b1804f6120b083b39d1dd537df3052d9ee5ef2bf2e12c0d899e73ab84c1bfba3454197e76b35c76fce55c69631eefa39c6f5d71038f8013eee53b0268fa75981c1888bad37761748ea0f73fea682609fc947cb75480ef1d4f2f5c7f2f9fd99f9aebff15b8c5bba6678b2a51847d5cc3481bc9695643cdac32c3347c492060335934d929972ccfaf000a6248c1bcd862075bdff1a976a02322576f74363a8de5af89a360df2b11d0f0b52b8012a53d58a2db0cfa9e680b24a6327a01873cc7493650ea46213f26cea2020291f7d50039a32ffceed5b66323370ac0aebca5b0b066311a63ede782faac7773e8f1baa567a0b10c48bfd04ca14d46ffd63713becdb790b024a5929ae7688bfc0f90c4b174f404d792ed442c21515d641286f565f3b3064812d8eee3077ec61780459198d445a1db57ce9096160bd4b9de3cc92ab4e0f84eb8f85b0ffd47ac32b5909fe027ee0e73f1d433ff11a5435db3c91d91a3b9ed3081a455561b6bb4ea4a024e1bc285a15e0baeaceb86e60fcc1dac512f22b65baa074d6c69f45356aaa80b3a90468500e60fbe79cff826b07186670257c45ed9f7a4540ec00a8728004a1bd4022664b3a878741930d7efcc0a7879af900b2bdeb5f368baece08faf67bac4a8d5e4cd3011c07009a2c8b9c8e38e64c78c6995d0717eec0f34f8c5336d7496378003f6ecbe9222d98a2d1d1d9912a8e89152356596a16e7a5cd5d07a6e01f0ee94f69a600b481cf77b877260a7bfc661437772f4b205606ab8ea29eb05dd755c894f2020846cbee1eb6a52087be04de0272bf7044005527eddb849ebb181840fd18020a4b67a99275e48549b922e9fd390f20a2acd3bc5153fb2b912ed78bd67120bf4732dec3c464893c28086f54cba255c44cea61328dc538befe7363d81f0af754402375c08bd3eff545dd6cec51258ed3f6687260e22bd8666ef184a623b1e4e77d87f249f0aa5cd6299ee25a96ab0074288dceee586d244a6810019deb4f2ea187c71e05fad119075bb59a45a21af5d06bc13c83f77364937438a4667eca1ea9e549c19db1306eb1638859567e5cb30f466c86c7c825e0681ad133a9e40cfc281f77a3b81db0a2fcca81ea353157825842f67264d26cdff2e343770d26fb1045beb88bff4737ff0f17061489c3f5acd3e5c8c9ff1d2eab5856f7383b4b81a1294973431936aecb13d2819efa3d1c78aaba485243b2558ac3fc533edb5b85f8fb481291b0f2fe4f2f84595132a6b62d0246dfd7d598c7c55b5bc050945fee5ee444fc3e69840dd38cb4f6f5d606aa140613f51e60d76ea347fda7380e5da6190cc49912eef3c59f51eac0529166e075dba8f3f18a78306eb06a6ebcf26094719a5051d4e7470dfaa7ae1f2f08cd4098ac8d3f16fb82f76cbd287fa5e86da0b0b6708c4efb89cc2eb6897b55e643b2c49f4b43555cfdaae797c140ba978eb21c8aadb246d3c0ec81a5023c8dd1d01e42dc69667855f2312565bd1bc5a8cab2ff3b8e2b8517f4543c9da2ca9d717d6c5b8c6f0f458d68746f50a2778cc22a889ff49c5fd36e2deca6c5ef8d4d70518454d7e5a886ad675a0c80fabbd98eb41d45db5db7f780749c094673ee6773554e78e45498015cf7cd461c4c5172b4725738185b99bbf6d04cab47b653b1258fb30edc44477f4321b5634d21a01fdb6c1fc2d41e6ee5784ae4d6f13f25f52b09995de63b1dc70aecf8ac3a0010aaaba95e29372c9f3eade94cd06c96cdf930cbeaae2bc382a358617f690c7109d9ce31fab6680f928e3eb56de1df43b186dadb8c49d363ded9d58632e2eafcf376e90cddb1904fb19dd2b62d5372ce3b63d143697605a499322a65f95efd2a3647a743ed62d672633212f5756c4fc0d25abe0b677de90c1b76ff06bd276c823a15addc141063020f17a6792e769ba1dd31493970a5a825cc6dfb6f6483608d68a7a6e238055e871f12354a3eb781f7c6b119d76b386a7715dec7aad8bb01d126c7385a4387f087faec67718f78274cf4a2d7ec3f7c56885c930bbfff1676d8dd3b0b4e1cdf418c086de6f50700b527cfcc2a81d6ba95e30a526eb4c3dee82af6ccc8c5ab55781db15c57de90995411bff6bb9d17394e0d88e498930b597e4dd74217c8d830bec35d82653511892c912cea3248ea43aa8f3d113264bed161cbea659f5e8bba3a0474a8b6017119642f7e6e368a371ed1f290a0e42dc68cb82c96fd098fac39156b5e94f24a9a9124731d4b6f6ce613eabeeb5b55f80ad3acf642d1fc6323f6767d830fc218733996e6724986f5e06a1e79b5082ecc72ed65b358aa21e3d83986c44ce0ce74e458df0fe32f232e0b6b94ad557016b2e6240aea3f502016b44a6cc71fd1bd65d5382a76d9c7ed1d505e75e1355bb6b04ebec4245f8ba0059d70510e65a837f42e1f9da4bdd78dcc988ae89ebc91b6d19204bae8202349b67cf45d22872ee628d7566020f528aa43c938166b52d9bd1a9b3e15beeadfc5333a1eb78aeb2b6f09b9259c72eb82ed89ccb026d05ffc73954fb4fc2e2588b984bd3688cefb677d9fbad3792305acfea58a3a41554bc3814997ad98c139e6d0afef84f7771ea9b6f3c3aa1ebaad7084a2ea1e8f837ff38f3e5c7310fe8ec1b0beb7502d0cbbbac20cbdf0b4bf4a942885d3a337e16157447d844c8d6e8ce101b8fce152153c634af28eee62bb43e191582f1262f85ab6490df88137979c0e6ca6a8808d1a086af6ae20ec5135021f6723e5b3374ed3d745f6a1593503240f988fa27506a487976d475932a8b5ee1654ecddcedf6d3283e141661eb03a8ead2f7bd208e63a21b458c5230790c36f8dfebdffab81dde082c5f52e16cfc240b0d673208155653e875e3165b531e8ed4e0d9d33 +0x5377572306ef61982330034f0a28fdde93da57c53cd1365126cd496847bc05694fba3d508b55c97db476a75876ff6474 +72304 +0xb6320a8a22858bd801c666aba0e461fe1d4fba68c1ff18428fb7c20c1d8b0f0da3a01e3a5233c659e7dcd0667f146436adf6c25aca4233468ca73eb3da421e41df6274615e8e3a7245c9f82a84143a381f35412782b7f98616322b4611ccf463920076c7ed9ecd6b431344bf57ebc94c9c949f979365534953def18e693277bbe3028a33a86c688b0b441eec9fa1fbb94c9c4472a25429d96e36f8538b7b9190fbf11a6e36fff41bc2e3ed7a043fb7c956d499805a8d647c8dbfa95c1faf292c02558d41415f57639379193230cce4c2e3c404896017ea7bd9036a73ccd727d51fb44b716e957baba48d0ad9c8506ced1af5ee545ffaa51e7989a45e3af972d47a98bcc967a8463b1da7273a77d4369224eec0aafd3f7cac95d9c0e61220f4713c884810d4a0a25a2750da1ce35e2af92837e053e2ed566f577c24d3fc5194f38d0d570d5c867652ea0e8b46b4f930694f59b817b70c1dade5f93aed9f963aa494ae5189a861aa698d6ca08193aa302cc1dbaebe24a5b8af67d869fca4f6ceca7af39e4c603925e838ef8295287b1288a5452c0fd0be0fbd06a218c7b27a39ae6664a61e2b16d1171521994a1a73bec6232099d364620a1ee9deb11772286198818ad1c7b101953d49894d68119a1d2d65f35dd28796911c3a149bb48c0a2fcff3ec880e9b0159a3ffaf07b6b7f915079046e0d4e2648cfd1ecc3e66a7288b9de31231bd911f05925d1c2dfdb1978f9acfa289a11dd3e30abf8f02f56b885e487985369a3a6282508b572905aa7d7430488dc200dfeb7e8b45e44f2882348e19dfccfd6e3fd2b625b2e8619648b1aa0f2391f3bbd0b545c8d8548dc8913405583a6ff00047778a5bfa583f78333d1b7f89368298993821089e66249d438ea94db5f7751afb5ae6398a2e29721428adcaa203d860e27df895c2a27c6f3d4c644075ebf6820382b3068bf2894e937b4a3795805dda528ab4b56a90fd062a761d78a5d3da0106f7d70b242dc6d2573dd90d8b3579d092693bb1bfb9102ab012bc3e6b38895fadc23c907e6648c709764295abab95084a2277d1e8a41ba2772a28daefa06b649feac8dcc02577f4502f6d171e69174c21bb4e5c0dd9883728c54b945a96e8d88477653913f2bb23d56f42da0bf76962bf3eaa9c58e1bdb16bec0cb3d49f68820672faed9f567c1a403ea9289bdef112cdb272d7ef4324d8e7a653818445532bcbe26f418bd822a238a48a47f5a51926f3208e56fa87237345fb0844930f119b7bcfac7d0001158365aacd8043d44864d88fe561a236244c2cf3144529850a9abf4198e92557bd8570575a1baaf4e5962507613f0ed78e2945975dcc6c30a6f03f411dcd2364837001b41960548c5a828191e93a68f2c9d338eecc2187974e64a2d6227021b0cd0bbfc7f29769240ef195336698d50f3d12ac00498ba04368c09009901b48c1041f539ace07104469aa09f7bea27fb752ad4ad6bd53e0ba5ecab3e14d16c0219174643593f97275d37784e5daa08e71706eb9770ec26e86964bb06642a9b058dad29b9e2bb5b73eb41eae04a2da2ac6ff1ba1eb261e732e7a0a32a0571c40ec4901a0df7c8306287468305cfe97793d677dac3bebaf163b70d1df9875b69a6745c81a0070ab87ba7b1db2f5d721a65e105c806e47bf8034e2665f5582c0e35135f1b207ee74647c3205dbd813bed7b16280c58c2194d8a137925bdf6782463083420ffedd28c2f6ffe7540c9cb735bfc6b0249e6077470bd71d7b3f0d44e98e9684daec270dccb14b8dc4995854e70fa2b644abeeb0f5f92acf667c5b4ef4f2d67ebadab36ba7347fbdd48831dc15295f58cfbbb28709f39870c59e38e790e5abfa58cf698c7e0701402ce00e99e996665f6ad79444ab8189c73fae8e59e5ee7dbe5bd331b777b33bde73a9d6d189dd1e92bf057c2e052c659d7db244ea1a95b4946ceef333babf935e52eb73cd1d86eebb764f528e3c7b94ba26b542e35762b8423329974970b3738a70afccd5ce1a40a037bdfeac7bf77ee6e3bc708cc6def290578b0541c118422876fcc930c3207b0ba95669d0e8268be95cd1b62c8c90c848811d2663d47468010bdb5228262006c274227942ab92248a38fbfc0cd400a33058e6e0f6d2524dddd8534f031ca24b8d41291749edc3af9220432a75c4b7ec1285ee1c44e2375984846ca80acf2fb136b8742c2fd64096cabbaf28ad843c09b4af3dc3932dadf4bdb82e4685674ea083800a9e3a8d913ff7b24adefc3d1764de7fdcbb2cdb3b86511ca20fbc0b88803e42f357b33b3e14e4ac1934ac17d1635a9cd2ee57136a770957cfecf6e464ba2da5383de207cf7b585226130439f170efb027425cfdc02fab12bec57d1a6ab41952e03a0e1acdde1a4c78614bccfff26460e3a182c2c716fff4758397d422d7c9f0f335809bc0a4f3411708caf7845182560ff2128a0794cfa6fe0c8d3a158b07287a1581b32e35abd90ceec9e307f4113ab31d547c0712e1cf614aa776ca3999a27bc4578aa1f90abd5efd8fb71045d9b3d50990c14ff6fe18a4242cadc947480501294a47a058d895151b669c27aba16a7fa00e8067aaee29d181660a9b1fdcf9112ca413b4badc083a3294bad58e3307b8c915e2d89479a9ef4b9bb2c7271d28b5b5ab156387dfbfd3296238a1565531896cef0f281e6741076914d0d5c9d337f4aca9763827a962ebe8183f146cd090f872e22ee2af7f9820c3198a4e6cc5d1d7f9e45db80202988757fef6b4366bcd10c137688bae8a574241f108b977bc9c6485a5f36d80b209b15e5c860c1df090d64236e4ad85512575cbe6739e548040a536335fde0a805e70e57916a18a258054dd26cbcf9b99abc2493ef3856ad966a2f5d8ca9306353fcdd49ecffde3d446917b51447a582d9030a342aff7218fb662abda5c15de9953ce1313d9a791c38a9502fd783524d47dc8c13ad07be169d7ed3e823cebf874437e8a205b27fdbbf3695c738e8867551a918b6e7d9a1230724b9818939dbe8eb6e2220d7d068e8329146ffbaffb89790e93ea25dfdb1cac2e859fe488b496af5504c12169cbabe5d59e25dc0317f20802d6c4a91ec668a5b4a13d2d44b7ea9ec8eb50a544febea79f106460b1630bca9d63034061e35ce3abaa593def2e2124b69fb8e139272e922e7116cde2683a8688418d33d0bb612dbca5da5ab0a1a309c829df1d6dcf636e2bc9226cbdace8066a784cca95d5e04d8f9caacdaf99d815a590afa10b7dc5033d2070856bb97e10ec11264cd5b93f09cb96b0de159e280ff5dc0fb439babc180d7fe8601317626db6130503bbf0e82a189cd4d40a36fbc16215e6a01f0db07742ed7244de4cfee56f86d0356c01417820b5fef9b5ebb9f192441eabe7fe09e68573f67bf4e2b93fbf726f2b1374b4ba88e916933f44ca682d719e1eb6152f2e7e185c4b7c61fa4550e0c92dd6d2a7bafb4004ebcfc996eedca24e41b7db8a17d4e48cfd9e4f2bbdc7d7c882dda2843e1fc3b0498e03864b47e1165b0fd7826830df6ed88436b370cf605374516cb20f9c7903f4a47900461535deb6e99280eb3912eb26539dfa260e8252495ab999f51b6be33638b36da8eea78e986b92ea669884e92d360d68a62c45ae4a1f0fa1b7449f3955723a36397c3d0e4abd612aa2f43d5137530d65bad2b14dbfc9f9321fbe1fee9a7b95c1c1640146140887a667f6460c8ad2255928a8cf18f07ffcb4f332f3e84d7b4c780851fb1f3d748ac87c46a6016edcddacb955a6f7246aa28ffc472111b699e8c2d5e9327f0f28f4f7ab8b65172d99bec635823ed3a5b2722b02a6b3501dfef006f2d4ae50d04d4c9aba6d8c380e304f0f64d6a092b97ef4f1cdf6b08cc9d2ecae25bb7778c90a1b1b7296224b58c918f00efad31ea9f6b14724e021af033c6521374696e14288e8e19bab2f37548ea2cffa95df5dbd443096d00c0da01364e2c7f01c127182ee3b54fd57bce64aa57415f150cd393c8df9479a217c474173eb0817e6f312d3659cdc5f40cf3f8136172bbbd3a49970fc95c047c8778cd591084c764b41ab7b1594e18b0e732a436a117720c56c649fb68b6ba2a8045716e5c2fbd3f40523c325aacb476aad8fd668ec63e8ce2e8412e663af726a2e904d98a07df7884764f3be67025cfc875683592f56da97f1e011b2a6f37eb5fa1fc2d12b3aaab00d55530752ee926b0868926563b8bfc8bd60e342dba18f3272ecbdb9e99bb31461de2b29f3f8b05f38ab4bb30ff05f099aecd2bf8a206d889de086786406dc5b4ae7c24bd28680822008f66cbb688200916c24513cd8e06083e1643524e4eb2ed15861967802c879c767dab7f087f058a9c8221f7731b0622dd8a119af9ea934fc1950326cd251ef36b140bd34b570b7ebe81452c693a435a2ae834b8f9ade16d513d7463660e38a73cc70a6125accc65db54211ae668682ea4953f34c42527b642c3efa5f1246f288a2b2990fdeca2c0915f385b9121cf00e93583b6cfdcc0cb04dcc776e5241d07c1a4ebeb5aa3391f7f171d66eff2f281573dc4979321671c15fcae5eb879dcc581b8b3e8b24ce9f2e32022b559586d107d02545fb4bf6519f48806c5e18228d238fb34119b565fcb6beefacf73deb94ed947c5878af355453f23632506f98bce55d0ceee8c5be50977f8083db5d2419cea629aa7ac69b23e443346249f3c700a76ddf6e7fbda344d95cfcd58a5ffa07b2ee746288f8ef665a25c122cf0c770270a773e96603da7f853cadcd8aa93507a154a5a82badfbc4bd7f279a6c226f6a48f3128626012baaa309d99065a59dc0a4c003a6e94d85e61638acf4a79d78df3739026d461e606d39aac949a2b9f9dbc21ad7814d4056746c3a995508e65a0946618cc74ec13f6f5107c51eca4f13ff044a6964dcee3615c86c36e71863dd917c53f8bcc7549259f208143764ceb1d57038017520c0ec7131b6cad25e7dc81fe2f78e73383e1fd2259500bdf89e9c0411cde7dca01c4231af009f3e639ce55a7e35961529e7af83f196cfd80f279c35ecef62c2e46bfefd4a32fb52ad29faeb5af657c922b709145ef3caaf30d079100b87bc4f7516e97c0b352736c68ad0797e201ab8ac16f72c7494396be303fa3c757e3baada83cb57f9ef6b1336292fadf09d27094e6c3f733c616433b028e86232ba28fc9b1c6c361d490e11836ddf2fba53c6e59121aa93bd43923020a50b294b25cb6c414893bf7d2b5a5737bda7a6e42c3f74fc9d0031ff200d8abae32b3ac7a66b23536e0a9d237e950ed98350bb740fd9dd174809f80be21b68064a103cae24514859f897761728085df226a31574e3dd496a8b8c8de86f05f28d4381d80889c604db4d03f35f13fb6d090e655deb9293df7ecc539b9eb11352d63448b6debc107f62d515bb0525b565a6a3613ae20343c8da7424c8368e8cad6a862b7d37a577e075f897771148806e524c5e55601e352b06ecc8bcb7f0ba2ecfa2f3d61c2c45509d1e4fce8963a2b0937423556dcbb1318b9b072029bee3fa8fee68689439c0f661af0769775e6452f48079e311f2fe02f0e8a89c95e0503c32d451dca7b432fb491385efe2210e7dfad928a7557b65c5bd3d75d7023d491a3ebb77d95d85e186ddb29209d393e8582fe7f848404e2ea37b01347a78bf15bc3d0ba308bf9416c0a6f5f55f519e3a0c1a12b16fdb54a1c3b19bae2cff4dfe4bb62b9b10d4c918d02b42789864294bc043c31ac32d73054ee775ab96a0cf4aef3285279ba50d31dff402e15c141d649d3360fced3e94a46ba5f6f360622e42cf3880114e3846a7158a9ef9556a60cdcb71531f9416a0c44374864d314e502e14508420d3975ec399747c88296ddbce7185024b61be7daefddb8d82b16a1e56e502f91bd2ca3bcd943a0656802676afb7f8d748fb3d15aac263735b89c080016bd748cbf2d7c70d2d65a32a039b1ab7c65138dd0c9b4effba92a19d61585f79ce56d7f8dcc8e8ca8d7cbacd59d6ad2fc6188fd439e012f70cf37d13e038a10435080f6938a5884edb07b5082bdf185fdfd643f32c1548d8e10b7084af6a30ebc87358e8ad748edf408ffba121bc448f3711bc038d42d8eb6064e3b776f6f276b1211b3be33fe2c6e49bf460e2771807f95462cb036da978b2853c75dce2d1ec159abe2b830d6c4beeb3080f17187b0e4b249d1537a0a5c7fef6e5868938b4971f64ab8035e714b5875f9f7467a557ee550bd5a7d1e2b31f6d4044b2260082bdf4094802a0d4c24ed62821597b2893ed4090724a783cbbca27eac3c15b4025a7bf11ff796ddc5e5c0495f684faa81754343cdcc6d4b4a60e537cc87acf02849da60237ac4307d028382f86bd8d2ecb6b58957be38e555a34197ebda62b4d87e6d1665764cb5e00fa9b7c3acedcc19779d525b8694e24c083a279090d162a16cc69c4c969ade8d61a5506787e8e6963c8d374f91fbb2bc04516f51477399f199596a5f48390ad3bcf8d55a9944c2e179e7908a7ce7e7143c09d7846ac3bb7788a7f90407a1cb615626bef36d9bd199b44ef6b2b3e3ffe2f3e5d8c0773c6771bf34d0d1515fa0a4e1b185e85158a31d7025e25eb37a5db6e0581b8bf967fe9eb1827a4db1dd2b1cc42bc2a000f5a7fb31feebc5181580fe65d2f85d6db1014ce4036defa5b4bb4791f7ed90e91d60918e5c6bac4e301a281908f79b40b2100adb5a242da940e1a3bfa87f51661a6d9ec9a0fa7ab27489d25e5cb1ec1ee59b671bd9259e493c3ebfc1aff06824871f71987f0097013d407bca308fc664b613d00a12ea97e1f1130a3c80d92b90edf6985f4926a7a704ee82d13719909ebe09d44a9a0bc11ffa0f0184cd923237b99391a281c5131055d48607d2b7f14977fdf241c0d1a06fc193343ee8c402857476fbe6db747fd9caa303d296136ed15e60a8744a049c3de24010cf64e72306991115b098bd346fbdca7ac5e3944fe2dbc2657677ed3b26d68635bab463fa37a1d29d845bf7d74eb9cb69565db33ada9aa3c7bced2403a708e6018569d32e95296be1d697ccdef349264e086708b64505752dbc1c216c2b13d012b3f7ad06ab9a2d912bde94c209e65b9750920d28ae96c735f8776dfb4f61e4d7cae06a38f77e9819f892f816df1bebd3c361292863d90a4ef6a17227708d94cf3eb6932be5314beac1475f43ff444791e556f52c2146cef73b0cd6873af1506793dca056017cb9821a7e42eff70a0f401ad5e9ba535a75bd3a2bf3810b27a84f4ee51a5de89b518e68aa4b6132e7936cf8708f4976aeaf0f788161ab6dbb1cd4e4428999e727b45e305dc14e5f378486e2b95e50079ddb7c7aaf996cdf062e96d8874690a99c5280160b4d1db8a4531c8e12cf6492b27b72c4f9135bdba35e13b01609e89c83ac726e255745fba87f9c3f1f5b0d84871f90cc1067eee01d0bc9ef911bf82c5822c3bd4e785d84ae6a949a2199a1698628351467ffac98dde8280b6b2545f59465f297e918dae030c48413ec03d6be2a35fe127242fb425053bc88169e5874c2e66d6287c1348ad9ede920b111f40f0db95a6ac1ea71893edf05ea25efb6266e14b2c1ad09f10104774265235cafb88b32b861c95ea5e9d3fa92a61bb1d586f0816129bb4b96df3ad10e45a54c60673d32b6bc1b07eec0ca36c1306a5d4d12e4acd6ff550eac71f78bdb46d9499c779e29c3ce198ed2ca7c04304d846a7356c507a2d6ecdb9875d51807ed120cda8618987e1c575bf84383f35e220c61eecf1c124334f53af1373e0632acf1eea0ff56ff341b56e7a5e85c74a96274dc15e8546d469e00952d429cc6da1afb77666fb3de846f8aba82158018b08320219f4f08791b768182d3249bda6c9b912fb143c9a6fd7d855d0357795ff208c0dad14f92b630531a8c596995d178b35580081802f8edc9b947b02aa2aafc77c9705276adb523b81e0a466e351c7d06ab00e158fa34f3e8a8f30f0bb68a1e349c8aa96093e6741a1e8510ced44be7ea143ac38309fbae3ed6f776770f9df5d3cc723c89ffda9ffd9e954ee80dc057e223862522dcbd6b40c5bd8cf9382711e9dbdf824f3bf215e700b367663c1a3b935b8b8cb4cceab992e7cdc90eaae5d0db4d1b214cf2dd544b0757e0a609ca01622eb370b5651417b9dfa0a123e22ad11c82cd8fef9eecf9adf50b4143d15057c30f8667a12fba1409ffcebbd5689691422f5f24c3aab174946c360fbc3d3d9d5a808cd814a75d2d27daa05fafc8997fd0b5589655a0cb3382df70b27ba7f2408d242f586c466dc177f2de32ff6ca41b4c97424b121b8ad4edb133c00eac0effdf6cf65f34977c8f9ecad0ac60df56e20a4794b9857580d759a407cee1a3f419c5cd6a52ea1509d5f0e51042509b2272be68c8682c393d994b0a6525914a422cd4c803ea1949863302b4257b6b2a873bcd5d75ed72e121b92666c46a99e969a780df5b7b2eaf722568ca88edfd0805abcbb7f5aff607dda5904bbe04681bdb285e85c98cb6a17e3b879aa2e0a2ae2e411deaf0363217b1fd0d2baa99885c271dc25dd6a53de9dad3e3970c19e89741aa4878ddf6939b4f1df18922808714de0650ca2b4b20c3489d01623cf03b5e1035dfd41787a6fd1586e1d6ae5fc0f050509e4d0fe4fbc827e5656ebdea076cfa7248af456ff8c7a5c652a6b69dd2593eaaef792d194b82f94b842ef78df94e70fe274ceff5e595606ac87bc3b147c9e973d8b0eb3e8c7e4d3de22582427d6d0427d04f6fd019b0e5d2c7c87e407dccf129fe96c2fb3b04944b13e4d6be1053248df8295d84e1d4969cb51f1ea200cce65ba59d5ca5e3c05ee17ddf7d373e9b72aee36d216afa6b033724d24d7c6d642987822710e4f33c1daf9497ee6464a05ef9467d6418bfdebc20ab948326000d4b1c08e6782ef5d240e40c8092cc2f0c49fb85fc8e049eba11f79dd848458532bba79e3e0aea681d794d2a3c02c4fa39d434264d17c53387a50a90101541597f0ba8d6a031bdd6981749922cc6e562a37e219bf199c10ac205f806de72aff94cabae36bf950fadbcbb47c8c557a3d4e3c8427b8c7c8e80e3853e8685d8e7e1162c1632ee9d567a05c5e622b82d96ed751315396048943286d35c83c8b09fad85fd7f5fafc338a80de7935457c124f8d20f285a3f76589c0640c072f9a22dbaf6a04811959f1cd42f60edc236bad4a3751cea525c9e6229fc8e08f8ab262895f2b51efd12a9797b04e243f0d7632c69f8cce9c65a194778d3fba4795fa506db049c5276b94ae4f908ec3464ac52a2b8b78f950aba8f6ee5271a117979b74ed696d69122ec1bd5fab5ef3d924811de0c4bd57aa3f0594f0b5089de7dabd5672543e439664d94c2ec964bde0e1d2914f1204f09268e1f6e67fa9b69fa4867f6537655e9c5303e324b24b2843cadf10df3cf5cdf16f64a53678fef5283e21762cdb89bf0d45680ba92db93dea27d121f80c37f5ad9cb5284a68af6168f0b4c331085370cf80304b25035703bd40cf4d02487370b037fd0788176402480168efda856a78cc4d822c00fccc82a55c021a65b95047e08863cb5a4dc4e1b0bb6481911c78dfeaf38635a2e0c0c288c592128a27778127d710fb27d177058964d101bd9322ad13bc66ee7477ddcc50c1a6bdd75a8f266c6b2c1f566c2677b945d6f7c5b312eb2eee47dfdc89c8a7e39966a2b519413f978ddebf51e6793d2aa69cec1344f0a123d2549143dd2c5b2b95fb498d2d35d28f854e647f071761c2cf4a680e0e63d5dab0b28b123caff10efc8d3ac55f12ea3e9ba5954896a9ea6b0709f11ed814913ad08c55af6ef970761843fec775808c8b170bdb145dd6e10c970111ab6cabdc2d790878843bb3e04a2f461cf93729c25e40a7bd4b22474d8dc7594f1d90cfbf9bf44e7bf76b8549728abe1cc56fb2939f5fa2c355aea336d5df3a33dd0d28406a8a87e672c516b4d571d28792e3c60836bc23759bc993a5ce27cb4651ab5f6a8380db425c120f285d2baae3c75c0b270c9f535c833abfa05fe7350fe2311c42ce2171151d1a17aef1026fbbcea229fa07505aff76cbce3270669f17f86906d233b472ea1da5d74d793c49940e7dc98910165fe6dd426960eaed32e4fc19c6219b800546c37bf70dde225ff8efb593da103b8a9a1e683734b3c41500540a0437ecce53b379631ef606fcda6ed9112ef8ed0504a2a305e1b5b43371f36a04671d10e684b8a727f411da12e17f345b43e891bdf586d2e10eebd5826e43a5cf97daed10bfdeb38d236542ab9db1685979b3e2aa85cf15c367dffff8337a6c323d766d942cab065e50fa2711368fddd47962ca16da04d375939818dee91f29f601fa77b9f4a9086125d96f8ad39efc93eafd30471fad73bd3b1e097cb7bb43e38a6df2c93f6021604a09045f9c682b60758afb867a535f64077abb1ac6d522c181d7c80a3457ba216792ccd8ba74d301c213151b137dfe329eb315003ef52e588d40e0c5fc16396e237db13c554a5d3f789f654e13b3b8eea9d1fe7646a4cf7057b12241be25080d26d19ad594732fe23f37d367a27df562cfdd60c306686dd0863176c8a30d8dc619966ee9a076b3b2c1e247ade7641d54b9de2230a7cc7041c3c9c4a0d3553263a4d517c1a1db5077a3a8a9690bef988d0fdc2c055155408bb680f41275855eaa6e957ca5be2b6df89091e1e435a7cfd578e0668a2b8d4576065eee66b225786520de85dc1fed74fe2ea6d8638e1228f39cf0b8065efbe7ca5c6b9ae4b1beea5a61b81ab0eda9cc5125ee74313eba0cb124170ac311278f4e5fb0e1d49bd71b52da2c236750e7ddb91e719e956c27e4d5b85a44076d9aa3cbb834a97d97f973143341884a6f300ffec1383fd641df1628ffc34e1b9adb8d090effdc28ceab5a6a130031a1730bcae7b54a3d3de46c0c72a2591047bf72b3d00a1a601d6775381a226f07b48301763da3b082127d562c7b482472d205e87fe8548c1fa48bdf75ed0999f0cac8997bc83270f49d3623e00a9a2d5d0693c45718935dff05627279ab7083d52d6a5b41500b947d25355d8fe9407bb729928ea5296f96ea8713b5ad1cfe379f2390cf319dd52304f4a28ba0dee1166a8429cfd0e4923ec773c73177075cbc34f5627eb17639267050a6367db225075c5f810d400ea15d7e11a56c4036321a7eeb09ef2aa5dfa4ab8269e58d2db6557702c1d35d7247fcf6a9d6f0716f2759644cadaa05f06ea59cd1122038163908a1b412a68fd72a2119838145707be382cd627538a8208f322b87c970e6375929c4be9c103e04f2d7cee7cff1a7220f9da3738a207dfde95140ebb85bff56bcbfc7688698d2c24823fd1ce87e7c2b53b0cdc814eaea4e250dc344046beb3c0ad292faf9c7b3d9d40f8e6bf374596056c533a93a1f59ddea6b9cdbd82813b1ec6b0dbc1c2349113da26a1c1859a587c1e3bd5d24463170e175b4f85a19dd7c099020f61836fd322be4777781b7c8693b13532efbe7dad0b132f1e2b2c6b2670b4cb3ef1488350348de9ec353152ace6d5cdd62e78abcc503aa3ce309b7fb3897a4aef0399f5a4d3997c84ab9fc337efec643420fb83f167fe67e4187751eb858a2f941ae05d5d8a917db52d9f34b4097596d169cf8cb8dcced9d45538785aff34d7c2a9c420c6c3e67c124db82dadde01e4326b5d3c8f093c78337967596e513ad20f32bdc69d1a08e6008e831481e801caeb983d09e087b7d165f77c8bb215ecbcbe3825d53ce7894a2452889fdc8205b94192e77b59d2d1640041f075b2d7cae6643ca4d322d6e826d25c21161a667e4df8cdd507577509ae770b5baddcf165eda5b2a326db4295fabeede51dc7ffebe755bb8e4475d8d12f5e96269abd0d4e40d73cb966e2c523343e9a6d2d71a8cf140cee8ba91188c8551b84e9d2cf75d47e9d3d5009c5c90071d5e401bb840ba86262c955abc71f4fbe325a0ddc80e5a8f55c36ff95f0e8ce22195d4b5e9b9308411bfe64d312d6e7c937781b2e7db72c5388ac1081f08eecc37d58b26d04d95f3e8cd041a5717a11149f818a3f1284ef07c71f4b544135dcd47688cf8d7c492dc939f174995f636c1edee8e384ebb951808c0308836f781ee399400b265e5ce46f97d46635591d49567a20af9675cf045c4bf9c0a5e7c0336f5a20fdde179f23904aeb9effeb124939f5cb56fa2d5078098b561c2226a8bae63dae000b548a5bd9b7c9975f81ecdc57e64b62168ed81d06ceca638eb88c05c6c839ca3481a90dba62d0e7daaa07833ea013697226b073e28aa94f5229f4b4af6e66a4f02b75a9a0e0a3f907effcde4cc7c5d5a361840d1b43853802d77d380ea4c738a4be7ac03b95b5535db0273e00d1d52f10ebcd591f8de0a6176d8010431fbdfdf8b712e1c906877f52973132f932c3ee4101f6d86dde3e221638a7de0b13cd5d32a1e87ef7b78ce57d11854da48f148bca608b1b9499102475e54ee1c54567df090b6608463d582e339b9dfe713b4990037404831252e925bce00fdbe019300bd260160e12ec5ba21ca205b61dbbc58382a90dcf65a03bce61b5451d0a03986c252c63010c6919e9aec14714d8a52aeede9be1211cf58a66fac199359189136887dcf7719118157d5085cc9b507bec3a5db9294896b75787eeb166a6253e3399610e2de02f9dc0d5a84c10aa03a48beeb68d60a6618a15b9b3f157ff23877b77471c80dd565ece7b2ca0bdd170b38c844f8501bb1bd25774f10dc7911 +0xd3e8ef0c120279753ba4211888c2b079f5913a1d9828500cfc68f29c9b182a8d38608cc7dae41448198ab428231c24bd +73096 +0x6561cf13916860ad1cfc43650d1b5142a12041aeeadf6f26bdf1db36cb4d75a50e1898ed67bfd4ed8542f0e208d32f94e69fd3cd0eece00f4c6422866db0713ca349348c2b8b24d92c0c5380e32b6c0afdec3ca7440371d87e2ea26b92c890aced9cacda24f7d9d8db017225e54c8f0eadae8422d44cabe71bf864cb84bd595db4b707bd9c287a5158c957ba575e2007bd8db42805f015a5eb696e9089b655b8c0454d1fd9498fae6c0d0a288188a85df633d3a02117387ab52acaa0eadb0a23d8ec86e72480a056df759155abf3ae772045e9716ee89acf43e280e5ef550207c654bbfdc5f536b179a8f62b1dc7babf036eff85358cc50a5b3a9645df4cc5cd5026f44904d2d827024f41911e2b549c66541bc3bd2b4195c6da16aa04e7d9db3f0a37b2293c0f204111786ef8470576129f481350eb94d64c6907fba44fc89b5aa78e237b5d6204ff97a5acf14454b6d0f88b5d34f74837b490722008ac1a736ba60081435d593b0488cf32524acac26607ee89b275e51ec8f65e00782555cd38ae95b5ca647c2d188dffe86380ed039c737880128ef1f54e44d3853be203108b6856a755995443034e3cb66b0f48e13ce431289c69f6230f21da969b0caba42a7c4a3f2f2468e38c728e84b41f60c50c04226a982f7b10d336791bdecbd6f1dd917a669f2e40767da2fd3a84d7bf15d678522f4d070924622abafd4d460b5f6e4fec02ecdf65659c8592c0245fec3b60ebc95d041a27c783a6a52230a6d256a360aafc5f5e5e17b2c454fedce06f9d730390dd058f5d6100524173cf12b33e4669bc3d40d4b3f386064cddf382d1a5d668ae98988f335a9fd596d871b3377f1d1528acd768ed63e2f48043b36c99b953c32b750542321a29d8ac3a60b1e581f109f8306b4393cd8c35fa1962c74f43b0bc105b93cfe10965028c7fe23346ac89f034b3458c2d9b4d72c24849ba7baab6fa64348b5fc8901dfc3d914061e069af70e21cae6c4434ed53deb7b06ea6562d262fe735197015176dc756c2643e1e29310c53ec0b5f00347f584dde0a57afdde77a5cd92660021cfe33b8af64e535c0dcb93f47900667ea9f38f41db7171d8de64c7bbfad20bdf457889e51885f143c19f2ca0923c1d1d65a8493b39d6d0807cbad2c2fd739b0671fceefeef93225658fbedb78ee19a6c1594611e9e3e1d8113da55770cc32413dfe0d95cfdfe9ce03e7255bde16954e7344855807b2fbf574e43de4cbb393da3d9e4e773c610979ddc92f3081c6be32b4c24a4f553144c7f8697cbb88b4e5e231a4987d7ca71c8dbcdbe543aa241ab84c7b9cde1b8943b764746bc4eff9afc1dfbbf48fd9daaa7268c84e7ca0583349021883eda0e1802b82ac10e847a779de0f8969959922398fa93672c3ad8b914e9f4107642d62848c18ba750ddae9cca38bb6ff7705a6534e47ce5a0117e5ba2dec9d312b0a33d643ef45a21ceee52e771aebbe1d658f7f1609370d1c278d3850aed5082b7f7effb6cff69dfeccc32ac283d0af7001044650b81993fe25ac931db090944ad468854f7f757099bcac45ed8f0cd956202e2e621c1ef58d596951feb977de71501bf275c96923d705c8095e064845b80c35c1b5fdec3ab30aedfc5a9032ed893cbfcd8f737bbc9ff13efd7eb02bf97f0b4087b1232b6a57825f1b98fe68ca78e07b9f07465245d8c637a9b5545eff91667707be56848e6107e83722cbc17b288478ef440a97c56ccdda966cbc885fd86503c9455d9eadb8e2b0d75fbfe70a7f70de45ae87f145424e504b09ae521f3b4f0c55ac0123cf465bde83b7a17f7e67ebd429ad8409cc4291c050f6f36349a16eb9345d0ab8fcf2b99bc4923b34e0c73f8224a9cb866254dd532e995365e4f40833edbe40073da4460e205853ab3786b211bd0a22110f607c306c5c95fdf91b66a208396ab8994448602171b28f8b8e8da97d385252dc4eb48192a683d58ffed02d0d35527319bb08b84f462086e5c61871eb9c23f0d006ce6b29dee395ae858dfc851abedfc4efce3f313d65384c169a928f9c5c94f4711118b86e7ee55e98e738f84f77a4a2c9e21c4fbf484fc8665d34f1a1c7e54e75c7b0c7bd1c6ba81f2409ec3e456bbb318b7831359270619ea77d9a142a8ce9fb365ade3385d293028d96eb4eefdc1810127b60050b4520a7c198115b4e30caeca83f863880c028296a087ce73f9ec04cbf4c63997b760c67f3abdee0fb7afb2e63874634d6de6e7c03862871fb5abbcfda14c257aaab2dc784df8a09f81183abb059a78f4fd36de49f397554ecb7127fabfa06a9608b8cafbe5b9c400f9f6a49d6dd30b1b3472d478849edf9da5ecc467a27b6f664be3008e7489cec06c9b8f21f3d6903cae4b78f04dd18c68df6f10b8ec35aa57fed22b848cd1274a639768dd19edaeb5c4f12a25c1d7d24cc288ab630f57a2079c068a929138742b797ac02352b0cd23033466ad832a47c609c9d2ea8e59fce1ade0cc1d24183bd018a6039930986210f365ccdbf44153412f9355d3ebc501729f015ea8a808c4d4bbb9c193363d03ec1005bb55b7a59b6a8e7572a3aa21663709d8c0b9af82c5a5fd2678c5c5f73930e3a4b09f2fdf768ea100d7de3be781ab58e780c4ad0ea4c0376ca7a5725f686be8c34b1cdf577b4a2195e3e8239fea4c16ae1d4e2314e8c004fcbc96ddee181989d1f943489620196ad53555f3a306a5cdad04daa42e1801e067562e3b2bdeb6516139c6ee13eb68f72f2abc2ea97d24d864b5eea2c2a912443cd2d04c8102ced9e19b0c526963d55104526f371ba455e155defe916b227dcaddd12174965acf8de38b87f80effdb03054af39f6212c55300be9f029ffab0cedacfa635c41d24e7e789de516d35e687a252fdea155edfb7e5f32478c9b837dab42cb312a2e08b625e1453f11c9c84495c38c289bddf218a860b336680e19f78ea86fc9dbb3b6fa7b7c99d5985aa30e2a33b0600c41a17455165405e5ded4423ee5cc73965942e02a5081eed40c578ce07e81cd1c0a64d62e8afefb2a951b256401cc7783a61531d765e6d4ed6a4c8760ade9b9f1bfa208dac3976160ba5869a805561ccb2497b42cc4aecd0af9ebc651c8cf6ab6e8c2d002c9087faed6f2d6b1f851ac965b3033d174c32253439a135cd51a29910e2ef74ea53a9d3d70513428e2a76d0bd249746e7d0b1bf1cfc23429deb43eaab84d45655e14033510dd4bb4cb3fa853114841aae870ff0c25ccf25fea84f12a6e8781f0fc7df9bd3ffee3febc01a495a097602dbcd918cbce1e15a602728a39b8447596885fc6fd831cc3adbcd5abfa089c99a0012dac57512265a82d6650fe1fece70009a1b31e679fb46ad4a303aad0c1b6abc05604d8363faa0a73488ca22ae7a0d6872b084870ef7edd0b53f5cc806d7df5003b687506dcab77dc00874c629e68bf0be50da22874e9ad69cdc989a007b827c9c41f5648633195717786254d7706639bb709551696bd83f6f9c708b9f92de823d973a4843b040c3993d45575db446b42894688c2bec106bbc0377252aaa5e11762aa8742ccec853c3db8036233e87f05430a64b552bedfbf0860eef482e7baac470d260b7eb1a8835e79589ae5bb46eecd9e1176bc7cb50abb8ba526e9bd1aeb70e4aa66b91a1c15dc607ba75b8569040f4ab68d62c331a5bf00be7047eda9dac6773adce5f08afba1b59411fb0e8f4ff1557c83ae5bfb97fe07625a044010842f0dfff46afb993b93c0cd5e2f1d61d85c098adf060bbae85ee8b96d887ef7ee94f02136b003f2df9cc84c185e7c87a636ac0929d49c16a1c9eaea303c6f0522de66c72a20d03ceea31739c6eff1a8c1698720ea7fd7b9c926561e2c86dae327f3b81959202920718ff3bdf14c456c32dbe2f8a86f8148685d747ce7cf893905bd2e404a19d8466f4aa50020dc407d007605b8ee0c656e87558c2deb8042aec4230f648574a355f0bb7429db07a9803320378941be4ad12cf8e658c0ffceea6d0ca5ac939753f6fdcaaa60ab354a20d4c3c1932bedf719622dca26ecb6f59608623641fbecb0d09c5f8ecf16cee903ea46ebfd330135ef2edc7fbff90b7e5a9b0c0b4b45d9818cd862679ba63a4fd17d91fdf0e262ccfb9aed4e4a6f6833dd30f26cf1fac890d1b6bb7eefe3e24433968c3f93be7884e4ad497fefd434dac8cefca05ba120a34840531bf1542c8fd03b1ff90f51ac25526fd65ad8b2d73cc27e12f1b2c24983987d1085c98181fa527732728b236476efe97d262a90b92174471ca51ee5abf86a75db06a0f24a4b5e4fadf330ba09406022272d10f7425185310205c693aec966319de49e30ed4b9fcd78c425a0044b5022bab5b06eda939e44ac59d353bac033b83c68eac2d4c2baf87b2d935dbb5f65f22007327de9b0678902e96cae37a37a12a2daad3065785ad89f76a277984447993f6bbfacd7718707edfcba2b8d3be248b5820e030a342576cae6797802c19f1f01287f840c9ba7c653dce552245014615fa736c22ac0c3d9e5c641e861a0158d4c88998cf0f96ecf1ecf14ab64aab76586934cf52ce2dd09d95e214d1ca750ea0ad1354ceb528529341e6fbfb610745d148c79247a631b0f8cf642319d9ff93e224c7d4d666d93dc7f111f15804bf350f0dbe5d87b0a24f2e8d6cc1b4b4fb7927c419716c71341f1e5ef4c352b24db4602c8b79897a1a1bad446e6948e8133ed00f8ab30780c376f50021da82060d547329a18ed36ee3970378db823cefb155796b8e221df201c5ea790bbf5c6ca885c689b2f5ec0bb951bfbf46b50738604d826cb6373661799c7d2e24ea484299d8c8c1125739dce5cc307c327a3e5eaa879987757ad74b855b1b840fd3ec444bbe0864521b436ef3770434213a58defaa41d405e65870ccf92443f1f04aede48b5e3e7f4caaf1e8ce2b97b858ddd15db239c2bd37fbc41b2c285a3f505067d1b4109d07cddc3780c8fbeb6f1dd31afb67674be6731ed76d97c6e57045d899d3dffe8924cdd2717ecee927ad8b10d19272d555c9c14a118ae105cdcdf66bedb2b42feb1f741505ab87fc33bbca1b5cea7a8bc9af4a05da3ab3eef89e8c90ca35daabac40e92c5dcf9c3cf7e1017c25cb288f90de36da9a44b5874f2b2ed09826fa7ab2cf559fdfb2b4b15c6659bc92fd24eb909fac4eb9718edababb05b2c04bbba5e714dff7f51b78644894f9620d4715a7b339d4eb9f89e7ef229839bea86cc6323257b0bb06d38f5ca4b109f6fd73a4c9e0f6d738b55467cc6d08f17cb953c22c7adfef7379a3a3a15906b301ca47785bff1cddbd6199b77b855455755bc75898a9f5c5a8b851593c4edb1d0adb8c3a64f7f40d030c227e0450c48e30f78f3080a6e15ae02aa55b346a786f999a0991edb2c690911fb5656db89fc435f374f1eb59ebd5a6376951919724d2366e8826fd17da8eef001b14c0a42f1e0db93e44e2aa5b5f7f4763e25cbc286e6abfcfa09c0e772ea6191c3205fbbac53fafb5d06c81781ff5c25cb79cc0cc6abcf6a8a8d27fe6983dd17f6742a789e1533fa03e91c68b3e8f111d78598d58eeb579d9e6a85270f53c8f0e5d818fe499d2d0c9355961dce3d69a6bcc9b0a1424dbb12a01256f5b6d2cbd8fb9c99b121543c9f65ecd3ab33750c6115b6b1f4832b90665a252bfef2794c2cb2623b35d7e2e94f061f43a586287fdd5ced0b43b40d4e150703528764cfc068a4a95bf0bfc1b987fe5d747128b03a881cdd3b13677b6a8b514d9933603ecf193cd2aa765b6933d6a927c4a2bda4a2ddbff7bfe81fee6c55a3543e97875edebb058e753b3d51deb7b11ed2ce978e6f6ac0dd08464feec9e077c7d1084c9865ca793d6ac3d80420a780a32d3958d5f69bb9eda29279f519d86908ef2a22840ac4125fe984ae089022a24512976403bf0d25ba2d611089c289e1b7e761abaa24346b76700241d7a3c59085415d6ba04f2b7ec2f746b6255a916c2558333a634897ef01acd115e9d1ecd5e427efb2341d733f889e97dd40487b72f1c0337157ee7b1791ee55acb7b114dcd244e2ea27b060e27b91f8f87322a490adbdd6c2e09c3a6f97b32478d9b7ea3fd016cb75f39e91023c6fce9a366fa94fa98f91b1a5c8626193a9b1fcc85cb9597e1c0de8303e70191b86ad34f295f5fa85d3f8b00ff99f98162072cafc262ec43cd32eb366168a81c985094b302c174bc319706097b62e7d8fb60b45fd9a96fa8cbaa259fdcd4ce6a6d9575f8798899dd1de9d25d574bb8c60e8d0004520ae86fe610d6e7fb943b233f23be46161c97b3271d38231bbb33f5a17658c5b6eb1d3f234c4435470eb7f016e1b7c462e535e75a1b8084501a210abf0303ca8cb6d8c18c46b7b247ab0a79fbb7a79be44c3d21bbcbf2a77dcf4ab06d1c4b3c5cd2df9d28e7798683d3fb65f58dd8f224b775085415d6b52a44768db5a97643afa7fa7aff15d1d883ef545c0d4b90f2ab8fa7452ce273d5dfe06d499e92cd060b9df3001ab906d0d065db084ada18c3003d99804b181230250bf68d30bf98aefb1c91d880bc6198f19f590eb420b88cac271460baa1fbed832ddb0174181f62048c9baa39042a556e0395195306b77635b7df8d8063763582aee24c7186a94bb055da1d4e7ba932d0fb59cf30745fa82554c4b0a548cb30a8f7d41630ef809086df16dac60825559dee6bd85253f64a0365897132374105806e7809b73dea5b0e931689a992e8e6604494ddc189c5865854f7772e1721dd8f7c98cb105630d1d1d7a4d10003380e9e649c8686001482ab88d66ba1d2b3df5f89fa0443249a1c5614865ad2425ef4e1b84b7aa89e2b668469eef4934f3f3477fe675d568d6f6425b385cd2737a2c2b0a769622f4d515b6b5f06bb0d760d035f41a77d537bf9d0c71a69d207ca4b9d9499bde524f4cf89e9d2e867162f6575a0bc820e41d57e89c3b3fa107be3a3af14f610ac8e7bed17852a5aa1b7628eb2c1d6c0b5298347b7a1e500308a6af020b8272a5e75c9f32dc8cf2511f7f7d1e14af6281c126c9c80ea1742d93d477b180892d3a4e1c829f5392a115eded6762ac38684eb047ac40f25b389b49b628cbe8da0d326db5fd79460a1e53174e8c5b6b5ed9aca0894098ada209d69aca36a3aceb9f18b6a764435c59d6b31c21305ada893325f24a2b11a92c6469f78f35fb55346f67c97f6b9fef1876907cf40803722e01655628d05e6d30d4cfe0838b157a5adaba069c57e176bc5a85aa3587c7aad3c0d52ca3b4d17285d7630635ca9474b58d5a0e8ccdba9bbc1f0d3474142a1d00fdefe6395d1d4161e8dda91458faecdad3f231cf318dc6ae1081ac2e51ad214c152033583d84627b85aa79bddabb3b416b0d20e237cd7ff8fbad61c2a4b35ffba310648eeac94e293a23c880a447f87faef55c54250c30232ccaf5efa1ff41b6243b2a5bc93e7cf17304460b6a439cec1c5534939dcc7fb31074f8f3cdc34f0224fac53d7d66777adcb652bc8110a12d2fa74a3f1680c73f6335bb7d8cb2004601f9f5a25bd3b61bb3a47f228d41ad9975661da513cbaf2e8187edeb534dde2857931c3908f8c15ab4693bdbe3590ae77a1c2f640a0f8fe6f7d5e0dbd5f960ffa260a95ff96811ce3b7f192727b9416daa23e00a8dbee21f32ca34cd793711426eed3d8591843fdcd55087b2cf0509b28227eff7036c5e2dcebf6a1eb1a967a70983494885ef940cfe7817fd4dae9c4cae92afb80f9a5c99383ff16e23a2ec942eed4d273b0cc6e533703a652828a1926bfe9fcc06cb55f7ebc65b2a23c618703b65c9a0255e40ec00b37f98e305923a56c630b18d61e2b065dd07d1468563e1ab973f21d9768a87e2cc57f702c7e69afb7412f708107b69330ea8020053675f1bfc2e4acbc81c5f5625441e1bd2274ad692b71b0b399868efb58c2af5d28b5ef90f177970d56ec8d748c45c72c6dca054ac8d7c0b5fc255d87c54ba7b655857cf3a7b3c6d210a5ae2c17950cc286f52122c16c88cf571b6a9cd724f259e56d00b18ca12253d678c0509a3996c4967d67b9bd35f048d2ee1c013654768efff5e392494891d7d1ee2ba9c0374f7dc4e841d7653ce16a9728da808be31d9ccba68e5e86b1fca8288e57ff2e991d3439c016436188417bcb500edf7edacdcd720767ddeae24c0c04e0ac1a8f67ea301c8c4ec65821fac499ef1fe7b64070671ca1d7d71ee5674c8d6d93c189a79dba96d55128f310f28d278c7560dc1dedb3f0fa4713cac237b0eabc72bec4631e1acf228631d95c131e9daf7812977a2cf9179c1d5a957fa37f4456b2d7e9a25598eefb57a8b20d43be24e190c5905e1581b90fc37427269203c2c1bcd5a06d2a7c1ce82b57282c6cb6e4a825406fd19092fcd99f2929beee828d87f77f90cb850d80726b04e1bf754f048f9f4cdbdb85750b841b4143509e45cc2fca9f62c44e9443207d7885d146ceac1b66b17c85dc730c989d831ce38a94a8429ffbbe606d598c7bca7bbd67c77e06d6e237fbd67dd2289b8fb85d7f9ab74947dd5d4aa8caa4840abad5318be0a637477ba500d750da861758a8ad2cb6f5d6c6eb8bb1a34dbd5255b64d8844798d6af69ac5328e3ed54f93601bb5f3c6977848334d9959dfeb20e424ac6a9b7a7cc56ca55d3a052d09aa980fd91ddbb2e556541c6dabd3667813406dba8196cbbb70300636bf4406bfc0adcda98ced622799720eb18e18cbaa55f0fa3f7240549294ca23186a51b23fb85a0255aa30bea5682a71e3ea30f7ca0e7c3203e89efe4959c366cbe33618d1bb2716a320acafa7ec05aec96924d11f656d7ccd89baaf27e6a23616d1fb1fbdf19d715c96691b744c8a2b2cb1fb40f383494267fd9b507564effac2dda6b14a81437b48b370ec55b14251d36abd2e8c909beb97ed49ca7cfa331c97ae41b5c294a19d2e20c8089243b388883d738233b3e8df2601cd0381d1f4035dedd3126b51403dd78579597329673911d124243014ba85dce02ee5cf10bd17dc4165b28ee1a7c50c888cc53f8ce6ca37d0d8fbcbdc984780337457ade013c0dc53fe7c726b5e9b93d408364093b6a5c2df97f14c330b8cdca1a7406269806624caa6586118ee29340ff593bc6761307aa86aedfa409abdb6d3d08a37d28b717d4f652ea110ded5b9e25bc4fc2f6fd527d358d81f2ccd40d770f71c7444bd49af8a44e67b7ab609e8f443b0481466fb90086a98011e2c7e072122de61e69c5682224a69377eff2c8beeb441e83ed0097eeea716e83f40df0d8e5bb845e1b201bec0809d1d4640a66877b75e23d43469b92d173a1eb790ccb35ea9926a5c87b02a0bec6b75f701de483853ef42ff1b82096ec2edeaada4abbf3a15541680a1cc8fac98bb86bccb3ef2d890dd8de60cbc3659b115934905e5fac9a5e692758abeb54a8c7699bb242d3000760e4cb28f7f0795eb9b62b53ae32cb463302662caed648ecf82f61c9713c8580e6bc78a2c3345cb78689f16cb0c1da2571b196fe7c0641f68c9e508a95983875fdc46976c40b8a26163929741c7943c888db5c66ba17ca76232aea7e4652936714a1000d60f28c3ad73825d237e5b2afe6f408cdef776cbc2a49820cfa0820c4d9b6eeef3065dd56482b993f9983813c1aa03ecc62918359209ec9cf27255b2fab9a889498e1e818f777d5f4c7df49fda24460cada12b8dda48f342d6446ccf808a06f86210356f343917e9a294577750c751141ac6767aa049f23b027c8d0ce8f8cf64c6f268465eb2cf5a864728432b7a6b2d9600c3a5eef434aefe84811139ea4df4fb9e80ae12c9ecda7dfd31aa7324dd7fa8b7d8b6cb3100c453c210857b47c6d18b7a45515a66b890111f385531aff031d8537e5440e89da488a00111b7f98322fef07ed43d7179a5c91306ec6d02e96bae3c7d275301547825841e5cf4e7cc10da66f5e2c4d378412d4263162d051357b3db9dd80e646d65b3d82d0f3af9e9c3a9467021f572fd8ac614167b7ba0b51a6e96a60f79f93095b903f7d191172162f2f7b839da374fab1bf2e9c45ebb16df67d65f739ba9e430bf6d444b0229bd163ee195d37b0ab8cab542a299df3e7fcc270491ad7c5ad35d4d7edc2494170506146cce97ded47e101a6d0aa1041138093586046524f54345ec9e860550c9415bfc002d2c0d7beaa4d4dce985d71d89bf19c680429c637d1023350c963c28b93c7e05783b10e944ae6bf607ed6048ba165c2acdeceb8ac9e57bab347e631ab5d223e3786bed04d45865222b7fa67b1235851cb20c19546eec7b68c766ca887c447202f565aeb6e1c84cca1fe6b19fda451c03f94a2fa8b64fabd48cf57b5b57bbf4cbb7d05be6b526a755a9c8899a5b6daa47684d346de73393584dd47d798e5f2fa48555fa7c969bff2b92ce3756dad6b64fc8be308d4ac2bc5ad0aad8cc6957adf6289c955fcd4fdbb4a19fc2b9a2a7c885e0442bef2724ad44de20943b2fccf62a694c3379a269c357a0e432adfa0968507a882e7bc681ee7c3fdebaad2ae590a60e0dddb15c113f7f55448f1929241f185c3140196e00086cbb8b520ca0cb05d4df899aef4571d8918a68e2e4781f74464fe86ab169c9827a1acf623fdaa5dd1ba665721ba3ae15f605f733f82f23f0401b55b32bfd05e4102354f42e209c9ee2294c6d1ebff37f168f9a883c9657196f881f236f73dcb7959fbf0fc1bad8d29331e494dee1669c59eff9eb98f4e47a3b5eefc2661375817157bbbce0ef80009586d5ee44512ff728efbb63f493f1980d646c99f624f9cd0b10ee027308bdb150f0c88338567715e95588f838b9a7fd4b633faf08f08f20cd9500e9624db66c2c37655ca339668006ea0ab34daf2e305f240f0c85bd60041ead9a79950694b9912253806b4323bfe576e69b19bdadb9af6c85b953d49400661f64bbf47b7e20e77b3bf77ab9d75af0c1c7b9852a4c21a50649bd5c7d529d0eb405b668f49d2a9608c4cab6e6a9d98d925313794035eea7b9022086ffc2617c342672d7b8185e069297000911c2c526b232b4de458dab1f4c58ebbba40dd619676ef82b1018459fe05ba15a8149a622ea0da19a827fdd7488f525e2b25b844d14864f4a44c565cabcb9b6907f6702e9008ce3973f300e0e357ed6e372d3f28105157f1e9c4649edec594695534463e3bc5683bbc4cbc5551b9e06a62c9ea81b00c4918d5fc4767239e2595045075078e81489f058768bb101fbbe1228e32e85ce3b8c81d76676bf6bfdf7a99dd952104a6dfb1d4459e78ab03d0511adcb0d25372178e14a55cf3e4a512988a2e1f013ac0ae32ad19e6148f10de48b047ecc65021e5e9501b80c559d87f6d59d48b2e9d49248fe446a81538a1362667623f3acf9dc458444b8b26e2e466778d63520fa8aae3383e8e8d01343f6878b49e30a61e20035985b7d4bf0c337835a95d1c3ae9806aba0043dd5f1e65e5be2c5e59aee863536b88d2e5f43250152612243226ec541b83ddf94185339f5e75334522abaad2151cc23f474cf1c4ddc76c4b4c5a0d8086243c21322a2066032c7dc51432d1e6c8dbd65f614fb70c32a82c54c35ae9a02b298f5e27a47134a4424070b6cafa3bff3719b5dc631e80a436b6b32f9fed3d8af25c02aa8a828592654fba72da802c289d10d5013d94dcb2f1bff8f99fa4a3162d26b13352f0f35df3d004e0e80041c59c503f8815967adf778c88a9e08c9b6d1883dc4a8438f8777c96028989f71756b36c47c9a1afe59a26c104c8f92160f062d7f66894b6ff7f7df615c526e1177c50a9905e684da7638de1dfdf4fffae309aa7a2061b1782c66664d13c553acc8712bcabbec00c2adc2b539c356b73ddae0e8731bb7dc72cfcc486a7477b70910777f9fc534f480a646dbaac93b22a79d95ceb57e13342587326c01a8f203f1f8ddf05f4c46c9da08cf37b8352ea800d430438772fd2158fd9fba59d6be9d2c27ad655477abe8997c62b1ad30b4b10f27b731301ffe0bd5d91b1abc2761ef8247efc5c46feab785a90931cfe157a59d3c347ff9ac9d5a62c2ae7470c3655fbbfda9faf85b8ba06538cb9f68719eec72beae152a426376c86061b0bed152579ef3e5eb3864160a02d0b1e3be0711ee56532edb0b08d7c8ce5c3bb6ee79ae3ef4d1aa80ccb2145d251ac1e619cc391311a3bbb9e32781b63e5e446e48e5037c853e01a1fb6c0d0094bd058ec3e89dc46a575d97fcc6e9a9df0d85c1143ad87919e3f0360ebb875d186285c40382c6672b171c5d9c0e980a7812059599a3b69c786882274dc60cdb78b1487120c23a661a8a01f30c27153fd214cdd42046244f6974bc5c00b623e27e51567b63d18327005913419438e8b2b5bce364f14baafab6afa8be6fb255daf0ebb7cc14d72914a42c5b2f7b699ac9e8b2512f54dbd00325c34d33e2e3282b9726744a7bfbb293d0a9dfa60be4b2ee359d1f1b911e1fd37f55b3a4a070263e3bab93dfdf66a80e4a7ba98c8aceb88862265312ef3b1ed28b10e3faf282d779a4211f728a4092ecdb48c1cb415234ff38f4f7fbb75a56681399e41b2041c24599311deac2b0f9954bb92d497895afba7fb012bd32a54dfedd9bbef172d46f0be3839731d0de64716275f7f077c2b123ff01ad42a5428dfab3bc7a632f6466314abe942efcf35be8e82527a685ffc0a17f90cf715b599ec65ba41f58a1183021968b1dc98d176662a470c355eb74669cc90480329b1306c89dfcb5ba0e1954418f9139eacd710e475fffd5e4f24b2a7ca306c86dac974f6a436c4570bf8e5afbfd79f079022adaffe179643bdfa994aad63eb00ad70e0013139bd562fca0cbb6a7ea4a5e756953f2f2877942fdb82d8c2a533ff264a0a22ad73270780d772dd9568d50816e57ff885ad11be193a07c8b66 +0x6486d90890cc9b399c800127f495bf67f692511b6f26c08c53aac308d3d3583e7184bec5ca9d17905d5b9717d43fa0dc +73888 +0x6a39c81281bb2979ecdde0401331c432a97336783cc657050a40793117a9d3a37c807875023f8a93efe1aa6420a0b4ad5803a9b2d818ed9e30feb32454a7b567f2dc28170382efdda11b0ffa1890632b3f2d91cf09ed3c4b57f87bae106a8a917456c042ad0bc121a795f5492287397306f8d418f6ccacd62735ba157378bbeaa9f5283c28626925ac57469a670f9e4f546d5bd5c83da5054abd56a2a45bae3a3ac1494d9b0f4db25667e8350faffa85d1920e4ea6c88fa26598399dcc9bcd49cec209bf2e9ad78f4dcfc56241f0b5de2671d5cab9f6d27323cf494e12be7fde0e0151d80b8c6e863a97c36925583722fb129993284ed641296870fc9f4e2bc3a2850ae2576d795dc5c5cc91e471e819f77b40ef1c5904d3226e94f19ad33bbe31561a233dc362dd9563c724a6c3318ac3b6b427bd9dc2f3b4e69f732cd31698637d6be4e31890ce53789b6892d4783f07cbdb8232a4796787da78cb7dd82419e201e36c71f36bf8a60d32a6d12f26fe6ac09f4aa4f692f844510741b469cd0853ea6c0510dd5b22372973258a59a490949fe7c53a19736e9354341cfa0f792e6141edf5e85dc816aed4462fe6db59bd2e709a3d1d9786911beae7a676509054b20d4d8520fb1a9ab216930a0d3eac4ce039a2f874f83229851b082551b77a40ee5676fde03fb977ebf842ff260a07075104e63f68c2defd78ef7fe2b2c99fbbbe244fa552b20e7502813c565ac5d1b42ad84e59217ff4d69d6f3425c210688cca80c0c49bdb7f5b9fba6757d0f9711c12bec290c6b6db7c9ca21036a8133b7db971b1a4e64275f369a9ac4ab12d5107b2bc2a2a80f0fbb71c91f95c8d5a815433000a8b597059030958f47624ead83db2dd6e7076b4bc4fc542d8e0996ea3dae234b3c21cec915426cf252452b76e85b92677aad18a860b41bf960af3d607d76b159591583e87ae6915289c621c7ba86fa12b20b8fac1b435101922c41a171379ab963f35efa1d87a31e6267da1676f7d557319548dd5124c3b4b7033c33a55b2ff9f16da86499c002e460acbcf9b9f8b4a38dfccca2aed2c4a133c6958d766be18995c708be6c0a4112f8f732d7d03408960b8493a280d7d4458cd8e61580f46fe6a5a1e87df0d0de48bfe9e4476624519d4edf363383ae832046cc9662416f2bafc580d019e4be3af419f739aef8341027dc5f1cfc03b141bfe6142f0a3436953359e64818a42d07839ba1bb94e2fdd4d428a6c062ad9ab072ef422863d6054d1ff734c8f0bb97a495b97bd29fc2ec1010a828b8edcdc52ff7c6d91b15a335a3d4121edb4897a89298f7e827062489426bff777f1400cb309d013b6f86286249ee3ee6e776c4ba621bdb69218e745ffc5482f57b7bc307630122fbae3bd1f59fccc23f8611df57937cd8814a9f2eca9e48d735466ba1243792a09c4fad3c6a25fe607b2f90240a975a73c30a9ed063b8e760a9688a178c0ee00e9fdc60d45a7d018e4c5c784f3dfe3331a10a23f5b5cc8eb3e44a4d92b98967d178dced1630f564a0058530bd8c2885a69d91b50b3b59cd4558743caf3717987da9b9a88e783fa64a5942600b5fb6c0273b69d88d6ed11199886ecdc97f4a0077c4fb39b9aaac34f19a1c7c9533197147ecdaf4f8cad2fa24f6a2777e1c812e643d2a070442db9f1a4a6bed07a0d1279d346d90d9c9dff57c25a7c039795d70a784ce971adb3e43390cb947cf136e417ba4aa32acf648821387f74e88205f85d62e417059ce54dfd233ad034825515d87a01960eedabd3e6fb00968e6abe7cc64bc3b193da6bfb38a718fa62f312aea35d923921be19e69051066b5d17686b2c79113f8530ecf6ca62909a6d0d14b55fa92514cc0957cb0583b97abe50acce7935f54a426310479d9dc739bd980435f6a7e4b075980c8a2fd8404b17de32ac94c79759323e80f5989fe85eba5c89334f9ff5948631e129f49ac466d18aa10d657720f4bd88e408a2b21992cc214cb952d98048659d7eb23e0f6c54551aa1f9d48db8a34b08e389a51c825c5baef5cee79cae557ca48a2cf481619c0a56dc79c95086ef4487267f88264d44cfcc2b7bf632a642310daea0fe36cac65708f7942c09b35f10cd55f233189fd2904396c767e19197eea291154477d05aa6f69d53e501667c17a217ea8d3aa38f06dbdfba22f297dd1a29dc93ad8b9be15ee974bcdc7dc8ccc2ce147080d37e02995bae5c10addf9b1c6b362323bc52e3e6a924dafac801d97718f58bf42d5bb4b28daab6175992595e3048cb8e501ee6a8fe56b22529382b9f4a6244cf8e602bb7377ccf203fd7a0473fb995d49026740bb0b24e46e79648a32a02a2fa3fb5f11222ccaf14a8d7f63f623289dec493147786dfb5464b42bae9817ead5d88838e2916415fd9dabae6ae5f5bae94348c4f544a86ef0b9d6409db167d6de0b0f28866db83e6591ea7f5fcffdb0cde273aab0bc24e057f2526bbe0b3a8eb6c01296930383b4c7abbc6ad920a5baba5e7c4b202b7e0fe892aae5a5f1ea72ee7c151b8eef6119a26fb4095d6488294cfba53eca2f0e3e210f6246ec220213e3b3991fe0addacd744243d353181f9ce46e90fe0533700b9fecfb17d7081bf244eb112c2ebb5b50bbc7fe4160c7c6761f0bb1f167e52df8c3afe7d11d10928e70a71fb8cf946d33e76545ebfcd027556b77aac16890a2762accaafb14d80048f55c075e59c58af7959ebd3b8dedbcbb4826cdd69de2780443c7d6fe64cadfd2519e8a8533cb2f0c34f8b6a8aa5cf108338dbdb96e3719439d25ee7363659b9af3d2fbb60411d3f25407d4bbc8ca6eccbc30dcd2502b0084956b43c2c734ce038a9ded794136144a6120a9fd6f92709950a4bdc9ea2ab877cb0c8994d6b4e1bc5453c23761a46a64eae788e61561b0ce8f5dc308a2a2bb7dbc8e2242387271260f993c88ebf940e25fc0f3fe40a4aa0cd6c0af07104f8406d864905352d9e6c10ad29ed6468122334e419dbe77d7c6b4b571b45d997dacb3bd347650bc67dd1de4948bb817f898e824fdc89f21779156a9e58564c4b99004b95226c2ebb8aebd0b5365a6c6ac1f61723a1728e400847322a094c5188fc86a7b6234125728e5ff1d93bf1ad938204fc4ab0bd4260f3a9ace1764e71b6cc06571c920d785550d8469da1a8cd60946038aa519397df00e2dface685323dd12761b1b7f7b0cb9afcd9eaaea8533bbeb1d32dcc1c1425f89bd474a3181f86d392cf5bd928543b3273b1a6ac19c78bc99fd6ba687f419aa27b911ff330bdf79aeea90442c7ec0fe1e6d6bbe123b2b77ed448386fe5a6a7c82b20961ff596f9ede4f59338fd00ae6ffd510f96ec9a29a2f531912775ccb2305289c26e8e31f5961cbdf004f21980a45f298c129f0a4800ad9aacd9583a25a399d28a2a2416515b3d0803eecdbeed48b566199f62877c5fa18a71ccb57866e9a805d599dece7705f0dfb43db7785d22a6119d835d9b2d867c09c84ab50fdfca26298d05e5e0cd5cdc49eb3bd7ce38fbdb300207bacdc33ee41f99998086f60ebb4799b460d4bd27aa4e902e5648e69bfbce2f739ea5a64f81d5cc023d65157c1066e1ef7833ad3001f68b5f5b6ecfcaaff00c0f33ac3f81fd3249cd1535a3decd8e4dfd5583073d8a4ac4160fc95c509fa08122a169f49cfd3ef8422f7c08fa9ac7c5281e4f3217ec51239b99e0f3f472e576f610652e672c02c2a9b4c5ab981d1a31b6fc1c9686d0139135223bfe7fd1c8d3d1a72656ab2f858d49cb95f682018e79f016749b51de99f42dd263e3ba634f80fc8e36d230b1d0436b9d76507fec2c851e95dea942bdea36cbd0df0c6ad18465bfee1d0cbe58e9ca5751ef215687fb3d88a0e3281f160e3d574537df5ac26f6b61ef616a1dccda0c551089d2d079038a75600980b1900ef31958f4c651df17782cb88c5614b6abefad02cac9b56a4c522ffcdb19c0d4f13e59329d2816d08475667226376dbe625da64e3c6fcd04df7ffc9dde5c1489bf085efaba6c723cbe4b5844b575ee8b093d891d672cdfecc3f7256b9caf7458813871d9d4fc2dcbcee04a57c37860c6a7769e96d269b5cd00a4f18d9c7ba9e93eb6daf7723f0f26bb1e84d2d7a78a1645f22de2058c154d9f6caa2c66297ce3fe6ae17b1c9de0f58dec4dde7a6c3624ea987e2888ffc814a739966f831fb2efc93cce8e5a7e67df4c31efa3322e2a989e50d991e42896cb20f2ff7f7ac716b4a814e857b54a6d8d01d7b0488a562f1969028545a071461a127f2b83d3886fdba2da78ffb469baa7b4c5d9f6074a0d4f5496cb6b4441a2a886c863a417c9840bc076c6ade04416d46be3b1d433738ce366f5f32b58ff701e83b4ee0acdf41eed09d01a8abf4149bc3019820b9539747da80545ae65157923122d16dc7d70052885d0bcbedbc91a080a4f92c2b5058cc420af081cf3ea85603a1b2143afa501653c5ff370bc455260026d2b221c3d9d61d8dc869d88e65c7d03645866ecfbda4c376309c8e81bb96b1e5b9353514b6ffbd8720557ae71c52175f1036ebbda57847dc544efe9b517d26801127cdc95ca3b265bce75ecf389f499aa6a82a5aa42b6166eed0d4779343ce848f2c5468576c9cc7d291dcad470a07677d4cb31d361890b454b4988d1d852a516795716813a4cd2c25d78d17c42ca14418b70e7bd7da66331a8cc3624cabca755f15ad4f3e06d3e10b4ad8854c71c7ceed59a4fd05db4261c4abed8d9d321f6eba0f509422ed31a5174e478c2c73eb568fb71f275cb5c5ced7a46f75abb2a9bc2cf513cd6ed266e6ce647272f09d8c795441c57128d460e8c808c1a0e4a7e9dc0c596f517e410404952fb1f045691bb5ffac406116c1944e0a4b9c95d47c604cfccebbc6ddd379ad0002be8a7761198ad639088d8307e04d32ef58daf7ca9d8d62a781a409e4383e937fd088231016666c9a964d1a11c584c6567ec6cafd022bc286696f8f1dd047c419909fb4f092e7472362262869c4734933870fca9e2ea6b0eddb9fd9cad23716428737c97d0f7bea7604bf5a9a5d971fe8fa1c8328836ca240409b7675aeab0e9d2cc6cd2ffc92caf4f66f1d0e017ecee950636126a10c1b104108f1c8d612118be9e33c83daca6d42afbbec4f4088dad7227af102f7f38ff0556eb81ed8fad381570394133a9145c1a92c44d8ab53d824d8c9cf57f8c17542e623460237c3a93fecbe50589c75e9046b46a324a24e2b44ebe6389043d46f9a7bcd37fd630b16fa236a1dbe60f6db8d7e81a3ddb5f658c9f446e94639cae3699ec2ea6afb4fb152939d58df287271cf4b73c34e66eaf5265a623de47b135522c7aaf9f550ffecdba5ce7e156397503c6a836e01257a74ecb6dec2e5683c49787efbd317249a4de7d2840a0ba2d40b774437109082434c7f620304e381a444bd3d3bf23ab6bd4929b244892c56a6e7e2710557770dd400711475604967e9bb737ac1f3eaa7b762f3cd9677e20f8e8a107984bf1f188b254426ac81918b8b323dc04444a178471fe87cd062d73df97673b62b941332f72f7b112ed5565ce72d7e962960f998baf47a58a8b686527621aecf6082ddfd9673888c62d7f26cbc21a874f7d54d99a1752be9860f59ed9300041dda17e9d8f7b5eec0ff06102b48a36de5261e37fb89166f97deb9cc7fdeb63639eeafb145895b307749ec1a293b27115f3aa8232ee05cc7ec3962788997a8979c14d6eed3c9d7d017d9f68ad6f211455bac0fa9a435bcd76f1c85c88b7c5bbaccf319dcf437c0502b25c1ecc51c166c5300c1260bf7baf0990e805705eb440244ffe5263761893319c3baaa74079b18edcf4942c6a4eba5e2760e8e7972f6208c91b5351dc5a6eb6c2a5d6e544313bd746e146a54dba389e3e97ce96691e6780c5f268407d2ae0baac03682f65d14ec9f73cf2746fa86ff05ef57e24dc6998b6ccea5bd862712f65e3bb292cac42308c766b5e41d801a87d0de2c23af8f83dcf656bf3c29215a4deee37e185206a29474bd853b391ab2b6cd6c66080c6b39ef619ddf7a61500874e55dd58e1ca328322ffe99872a19040e63e09219d4d8302516fa9302bf41820dca11755e9b08284461908f72710972f13cf13cd3a954eb308ef3566fa3647b6b1594ca245dc4376db219c367ae7a73f1a104d2cfea7fef74421ea60bbe37493f405e3059c565b9f08a00d1e122daaba24891d05928a79172d8e30e8150487fdce2e46479624b448f61dc27798ea87e658c3ec229d46a95aeabd70c4b0a0673d675bdc30dc5035b8cd202509b326260cdf452349c8e4740aa43610bd35bffe9be6140d8716e2c539b4319d9b0cea6f73e0972843bb6bc46d82827a9b4c69335e73e14116ece04e11d3d992f74a3d4a65844265d81de380cdad2814269ca7eed0384be0a30454b789539f6ce316289f28f3cd40cf975590704cb04826ce8017375ad952f70945e8e95c0c942818b2560554c023f2d0c8dc9f88a37d6289fd97dc041400daa1bcc87915a7708ef7e35744cfa4750771444ba189881aa3762554075c82501374c04181a7f869dc5cc38a2d8e009ed721d1c7c076e789b13d0037008aadab6c2b593a483a87e8dcee5bd708b65c062a89783842774931548596280eb71d7aab6e8f9c17f4dd535456b2271c724015c850408470b6347a54f6f0107a0b582399e46b4d360081130d3bd060b2e83533781f3294925833cc783915d58dade810fe36f436ed84fb91cf46be6c1240c2c8039e5450f088cb8f89f60d618cc655a7a20c333f84a9d434611f833184a3703c3274b0a0d16c862b50d4e19ac27d25524c0c2e51429693638d6d27995039c6f7cb4a4e6d7f2ceb09927c986a76fbe278c6e1ef527074c08819d8b38bbd294c6196c7349d40f1828f1a963ab8ef671380d6317e2c566ae30ace0a2eee149c8ae25d946c1a5de3d426afc9d06b76ea41d445a5e1c53ca1855174a8a0ac9eb909e3e658feca1e29683618bd606d53acf3dbdae422076a402dc5d35d12aca0a950cafabcf097caecc6281e1bf5a5ced4b1fd5f9749d8277064ceb2ce8ad66593e70161684c68ab537762898b94fb2f8b04a29a655c22bd59b1d4dba6131234a057eee3031a240787024e21b44757bdf8723255f765cc72229c3f148bb24854f727fb483560b527afef53ad3f15a1c144851556f46bbe8ff4ad77262671600ec2df8f57a8280253f4c7d8f7d307c18396c5b4660577e05bf66de4d91e5742aa260811d90179f3d27e1147c51923a04b17b9754cd2901a205163eef41b6cd7704d29eb97eb5c70ee745507e0b9732461eee9c1d202be54242c18fe41c7b905a75fca84560cd761edfe1c80105aff360c45dd01be3d0976b1b0127a86c745b599837344e10cf5ae1846ec1a1ca4cdbf96411e9bd92d7a680d04dbcc8cc619d08ce2ad93ff94bb40b771503dce41e8a5450c33f9eb7818128052fb5a1b6a3b3cc9a4ffd9774c33fd12aacd51ecd655d262cea481bcc6ec5c54bff88efb5bb5e398f0f27e12db64ce7017edbe3f0e1d2c34aefa9d13c0fc2fcf755ccff3428fab40ee0dea98ea569b1be037ec8f8e499d05d5bcb4b90d52713b9cae84ccc7cf7e0bc8d886d120124d592e3344a401e10c1b6b722d7756f60cde5b77174e917f433fa3dbb884269fca73296a2c450deb60c097a4721343eee601db3eef4149a6e225aa9fe97ba305fcb1f8630d3c5a71833981dbea557b44e9eb448b746d964d420502ab827c404dca5ac4a6504f917a5cd1529efd07a700fce6bde70e9a217b4d27d687e950a57e1bb8b4bc5b475a0fd3cf327613ef6e2806386ed8258f9238ead24cbc88bf79a0d911f12c98eb5c37d07a48ea94d779c6f12a80e82115908c01508cd1c69064bcebaea27e6d0540fa3b1cbd82e88570e1a4041b9f6af4c3807be7bf4e0a8d10d839d7f03b445bad60fcfbb8c678c1f982070e668468f4d41b3ee00dbcbe7c22ffabd303ea84b74c72fc5f623faa55bfb002908a1f84dc6b6633839da14926453629ec021395dfc5372192e374e70768737dd1aff824762f674217988813531f879b68153fdf9bbfb754db62ed98a19dd3601afb98b288c92854e625f684ca58f9e99066f4cab5e3fb7e81073323e905d993b3998694dbe0b14f366d7504559994fbac1abdbef3d80a85cdfccdf2a8498cfee4af4a34371d081d50988cfbba8a61b9045c1f231f46ed530766436ba510f58af5666df8642837a47ccdc4d1c2d2670cdf52a461ffd7aace77701ef8aa031a1d2de5764a29a846ce0134a3ee3519afda8724d3e05c314be0643fe5007dca05a0d555ed914f463b8129f6b3badb093f0d42fb3408fdfcd77018fe20ebe70cbefc35dd5a349fa920a73a3b7c9e7c48218b59ff5042ace15765d9d35820b0714b1795a6469dde79fc277d2a8500df7e5d3e1457aef42f87d2a9f0e61309a0a3b6db3dd73933d760d8e93aec5649cd54f90cba2cd7884f985023a560dc0d7f47072f7499b95e5104bbd5b9a877e20e71ffdf95a55164d4b9dabb3f693894140844fa84145086130dadd3418771316a7f769eebeba6f2869476590828b106288b7726b36f8513e624b7cb1bb1caa0a923673105255d982dd12fe546c6cecc837ba79a4ad3e06d92f1dfa5904d0d969207d97f2b7cffc090180a47426b174ced7edd3e9067eafddf1b2f49e684bf7beed3d472a41813d1780f1168443d15ef2e3c20facf542a29954baf9f657d6ab6852f61f1ba202133ad614b2e93674f1d0d5f78b64dc1295a7b286690576195b11fc186e5b3bcb24df7b4c082790f4e3f548ced5a54d76df95a5b5c020257c9d384344d34d8164d891eb1794d3c5e98bbc96d88ce2abd806cfa8b99deb0888d847b2ebec771537a4ee9ff7d75257bb7fb35aa50fa179cea1d2361260da71b692cce57e086c69ec1052146d4e47c8e33655feb4ec7659c31729d840a762f39e5334359bb591e1dab148e30878089c1926311d7881b5ae4dfd52f9e4d00920a8a02a3d95729c3f8bfe4f8639d33933a5e5c111608e0409d7bada354f89516b5dfffb582bddcfb5885dd27871ee3e4211eb82851d6fc5dee8e62bf50111c05636d9343f9f45c0f658667e345137ac29f5bde1e30f859fa009f5c4c3aa37ca53bba2613e9048f474649ebf34583df76dc9c38bb5a78dd5efb360211b9b39f3f665021eff8f65fea2457cf202e76fa48ff692dc7785d72d306dcbed8764b6c1a0bb7ea9dced1b34226367d32a8f4b37f304a250931b0ff9f4917f7671972cb805375ebe5149d729575705bf15d06f26599c8884a2e786b0bed7216874931a4b766148b917262862c388dd324f2b39f405f6abf5216bda05f1a728100ae8fdf086b1c31678f29d64f98134c951204a259adb930e9928885e3f7a1a19af19465bb8a13473114f94a45bd8c2e0a63ffe3f8a93c44d74ae002dfad86de1dba481c18ed8334b5a8dbca58ce7fe04c8dae4b657b7b63e3e5cdff9a63a9a150b0b4ed67b9f360bcf4d63ecef375cc233919c0e74cfef6d70c57645d429350fc7cdfc0ef19ec330da0f28ef056f559560f472bc7444e63796687197072cb55e9c6d17ef933f515725337a3061c87efafb640754e8af214929c64071b1ad916df35930dcd2f966eb1b5ae635870b3f6f4d70c84c147726fe955f614a66346fda6712c57b33657a6936f5eb72d7802d6ee19b4426ba257de483a4629587499700523a443f370c125e0295087cf5cfbf865253f9693c427c875f25b2f7a765ad9c6f304b8d4045b53608a8abc844527c221a2b56780d46d9539263e0c5490129faf8853a09f1aad99da3b163c955b0c9de9391e9f7bfbaeac5c7ef5aa2eeb482a898b99e29ddc405d18e4fcf14ac534f286928325cc617477a6a18aef50ae84e21ba3de6613709b08e02c42c2eaac2727c154ebe1bb2d465ddf3804c501024e2f2f792b144cfe4703fbbbf296bf376ba660275fbb9088adc6ceea6c138b0f2f798bb487d48fafcab5313a13570f8f8ad52bb5e69b9299301a3c60c9c134fcae28f8fdfb8e23aaae854951aeec23db0c1eeca388690a8957c2f14223b645f254a43efc8e2a51187add0da7ca3d434477e8699c4d0d407faa24b53783dc0518a755255848906121b72443e56f32b6f2559a6b463e6f7ca4b2a950e7f01abe9731a475ba31a89bececc1b4b2a5b3c60c2d9eba496278061ff6b989fb7258b6967af7f5c9525b46a2a11e28b775a8b9ba885b1e4ec20e2519febd291b117e373e08b76e2eb28fac6a5fa2679ce6f9d826ed395ffd641a23ba531bf9eed67587b6654da990592d136dacb53808018e6b75e4a044fd528546297c3dbe1dc823ee27191f6b98501ec4d313bf64a3cd4fbad2f5f897f79435d78f0189434fef71b6b9aa977fee9e4807c31928b41652250c63a9a91e9230141d136b694f2d54472593a21cac394b9524654859ed0998f6ab50871ba277300962de4144a95ffe8e85de8915b92160ec62e227b8da23a8acddc218b7ea4d9bfbec170b821a8cf52c1cc1e5ec6f50e4340a623eae420d892debe1e2e3c0bd7ad405e7528a6a5c420b33654008966bdf57640c16a4ec6f43631dd46f08ea6fd47bf3769cc66179ec1111f221d1f61d5a3cb8093600a1efdf34bac4478f310ab1d8feeb749dc688fb28008f11af560b5bcb4e81262b2938648a0cd8f0de5d371ad3706f5f77633478374664970a7fe0edec6d9b6f8e4cf0da4c5939f45f369d15548f29e7bcfe226a262c9a3b4a3a4215875f7f9890d2c04962ea0edb7983e5ad43a54293d560fdd9ddfa5985d74ddadd846a562998824fbab307802b930eb6e788f8e1eb28516bce43f8c8fe1a804f4ccbd748ab1025463429f7b76e179db9cd0bd02f781e99144f426e102d799d496a45ee7ca55f834cc0ab04da2b6cf99566b57754c120ffa267c1a3589a5d6a7240d8f61b9fed640a65227411ebfaeaf3ba6c34774f944cba1ba9e0c9ce2fb16fd56d394c212290272b7490863529387bd2194ec0a8e3480675e06d8b505538eb32edfd38b466ce4c1a8aa05e9161aad4b5a50e585676bb2e7c4f92c5a839c88c5d3e8b06df21e8213b4cecc4870a09a76bf6bc67e1b46dda38de97a05f4128fa604a2bdf2bbba44d95a2bbdea08c1d9bfdf6a014cf0426b1b276c343fcd722de43f724eb1f9ccb79307557d4634fae59728b0188aad0ad5bf1fd5fd607627ce00c2fc051432c254c15ab06cf59bc8488d29f29ebf97fcb81fd5db383094affa7c5d9453a1fd4796f4b2e11f7083966d126195e64457948cbdf7c077089f673dc75ddfccd3cfa9189dae4c073fa2f1edc75e1e91b1525ece09e44a3c50fd0a02625232d3321083343cbb75a6cb7077250c7df1239f1ed7e69429bceab233f4d2edc92209356642845258e2909c5272bd624fb20e66138c80dd46bd24a4eab449ca2141c1664783736f0507373aef91115951d5d49ee6f90755b9bf5c9177c4b177f906be4d2aa2abf35e781d1fae3ebb6212d0f8b1ff89f48df138050071b2b477cef53242864c887fb3a9b4c2f4f8360d1137fd37d3cbd2f69bbbb09a4eeacd5a0171dffef0dd8374a31080cd7a49fbcacb7f54a8fa3b1d2ff7bed1a795e9569f4f1109cae0c23762ab41238794a0871ba01b818dd9645d8ac3b5fab0bd4b0aa7e657624edcb71eda4abfff89ea9862803da1264ef7b3fea75e35ae5e4b6c341485c95be34b18943bffe1876cd29e089902849564ebb68af645b24ef8b6d97d55abcb7930c2635218496a5d78e32e03b68d5a61881bf88d0808b05f28862f40fba6f22cafc923b2ff959ee46692c4ce793c771cf10ee67f4d15b471664fca197725b1e8c8d5e641428303ae9e77fed341ae8f2a684afccc460b43182a6a268148a6af50145f078791903d3e88f938bcb041e71c3636c81e7347c0a5fd6be0f2f0883ed50afb13f05d3bbff6cead0ee535953354e388c4c06559d1bd47cb75f8ff68d50a2500981615e3e079d7e9fdd75216e87708877f6c9ccfdac0a21f520dc5b72641eb2610534c27633a2d66621d96557af50dd9447d7a08604294ce01ac0401972ed5c1f9427074acaa4778e82262df6f518be4d06d9d91e6d5886e014e1ac6ac136d6adf6e236a116caeb80c8057f33a0edb409fd7680af2dbf565dd8e7a74d9b22a971f30c57655d3db9a3bb1d65f6faf94631f2579c208d8744bf2c7b3aaa46d95cd5524d707de824695e2317e6274964fc2bae243559d5d8d86ed9456b690b82773fdd4f8bd1ffa8831bc79a0aaed6565e60f98454424dd99bd2a7ec4472324582195ab7af49e9f19041704fda73e9f6f5389a1fffc33db314535d19cdad034b06ca9230e5cdf0261838e6dd5d5eca6c481c5b9e41c4ec8dcc5ac5730d03c6bc8bba4d6034455a6fa167f1ee9c58c0e1df7202a91f2da390494da5a30c5ac2c0975153efa49970f5b53859279d47147d43a358e7a3e6aae41596c650d29c407db4f76b863db17ae0db12e5326a150f67fb182501d4d749b0b89bf02368af881e69145fcd0875c0589c5d5fb70ba8f6c88f38319ebae9c81cb8c6eac3d57de2c93e10f56b0cce89847e828d5d86ea14c7886a43675e026e529f7e7eda21ec96a7bc53f60951a21f8c0be737cde5c1b08d6d182504c70b8477f42a720d55e6ebdf6a45294ee0dbc899cbf527af30171141c6a99d1cfded52b640348f0677522a99d14f58e3c05fcdd3451424aa6dd3800c1c857457098e20350a039d6d92179cff77d7496ff918766101adf566a6dd4516f514725ff2d8361cdaff64e9ab1f8636e647c59b94ec0a6b8726638ce21da886dcbd5ed9c0b2db943890ab23cc513369a605940f98c5d31b60e936c42a7bf18456eb01707c0359c5ad1e3cc3fc95eabe3d7b7e720d8a1797135c36b585df673aed0324ca2db5f6d6c011dd7044d3f25d350f4b6cfc231f0728e92a08fb3153ce286e8d8fdbaffbeffad157d2aaf3946f162bc2a76c77339427f7dc649459fd688f9405688ed9b03ae2c6729239de181c6636adc865709a +0xb0181daadc927c25b4a8b4f634aea80911d31181a379d3d4689f164e073fff0f268f518ad3e131122439edf25c53bcd9 +74680 +0xd91a18cec8f9bb63d2bd0501bfe310b08556a4635e38f3d71ee087bec41f781d4fc8e2f3d36f961bcb701073b134aa3eccaf0fc74a2df1488e4fff09cb5011ccd28da669284591b65c9defa997e75cc1752367a113c643ff6abbbfbcdba877540a724c79f00313fb2c4b8aeb9a84900027bb9539e48c4fc4592dae1f1bae137da17ebd6b533283b3e482c981e294adc48b7e81d7e3067e6103abb67ab4ea4b0f3cbadf8778594ba62b4a94b2969f1bd5497413c338bc389c1140be14cde488d1862c9b158800d29caaacd3c8df2b41fb08a534440c36e63f2bf1af368f25338c24deda5caaaf805d09af6e09e4c289fe701acaa487fdee10f8c86f282234b208c1d882a507efbdb0ef5c4dbeceeb5aa52adabe29d098bad821cce732ad996f0d03207c38c647f15f04b9592ec42f1cb9deedf91c108fb05e4d05ff9c58ddd06392c0b15d11408430f1d178a3ef143803335c62c56e6b3a6c257ca0ad4d873fd117c0085c0d60dfec5ea9936376241448d22ee06b13b2bfc85138b0aeb11f23213a26687ce432685bf24b93b782e71953636b5d5726efa73b784118e7af2de419a2fcbb06be3b884456be5ee73be4afeb8d1bc0d2d0a7598d42a0c1a06c3aea82f84ae842c205a770320ade3bc8a33fd7f847f12239643f86595c922113cd9c23e316d77819172ea82d38f9fb52ac2fe04df7d78f88adc0ee627d72b1ca6f64c60c6a70f0eaf983b2ef4e996e0088e9ce34315c63e60b448c080c4b9ab9a7a9311a4d9bf15e3410562157a5ddfbbed36954ff67e47a053329f01004220afdd42db6c840c59d4f3c5e6b5805906ad657785668e15c6d23f68dc5918592e2f94b8288e147b2ced26e90745ba1cf7658dcc5e175b011e6edf3802d98b6326c2477f837a298011a4510b6e56761e247cdca169e2cbd4c0eec93cad02b7f49cd05c0576c131bfaa831899665852d1004bd88343597f0540ca73e325855c82130258f66ce3bb9e4a11e41f99dbceda3d6ae80e74dbe317309a65d826a1b7900bb0a4aee062258092c92a0a6341489e1e42a19f68ea769ef2d725680b1877a2f963e5bb7bbd0e1af72170e67d395e91357b8bb2ba25c7e119f9293f5d2a0b3f6ea492889964e3d1f9a34f3022248f58056e1ce4c2ee55a21888e7aa8786e0c9cdfb11b2c3fa352a1cd72b740c83496720a2bba22dd48e3670fef756349fa6e6b9c009a675dd70a7c3357c2e96e61b22f9a20e875548f032a5d3cebeced4bbfa94abd0f0498f34cfaf36d7cc5bbd832002f48be0d3ec2a1b499fd440c0d69e99f1071e1c99afdff61363c4e9b58a0ff2df12aa5b141e7a54becbbe78b515dd29517a3787f08000dfa234b9e35ecc1fffe074e062b0508f6387efc3e31602e64d286db3cee8d015d0de322d55920441cbb9a3c4741332c7ec3764bb0c6e3e485a086a295ddcf0ad7e29d495cd09c303dabd17dd2bc735c2433fd2da51181881f453f7eeb15762263c07a499962078d4a17d5980d636c9fd0d23a2c85dbe321190ad8faa65f2b52e9f1a2a8f6d60a642a47cd156200c7fd6ae656cfb9ecb0b75b377a9b2e8196a151bb3cf1daf64cbcc783e27d38592b7edbb8789ea70c9153cd144cebeb435e17836770a9ad88769d08133c56f638412b0990c922b8032efb57e97771466f2bbc683c685ad6552f0fd53e022b0663b10bddb671e254982ebae1fd22b5a5cba799e684498bbf25201b164e5d81cfa222263f719767e4953a9553997640712178b5e6853ec5cfc0f0c8b38974e2b9bf3d85180a6337cec0f99695059b991337461851896c8f6eed481f953870d52c80a92f4ec9fedc7ce114c48f89b848f1d5bacb0dd6fe710476d026a2a278e390af0e2ccbf690de54c232272a6df5d675c57bd504b41af3f9212fe7c311b5924d12168575d940c3c02afcc84cf87bca06ce323e1c6de99eb6b70e6ae1cb4e6dcb72674136ba371527e019aede7372ac0bb7870f3f4892f9a1ff14b5e2196cf97396a968f5e09d5bf1ad32e1c9260205ee49214f548c3d8d23c3ead2b04337c0ab4885039a94991e8559ef6af359515b164ca906438214e0a5c937c93191d649dc4ea2190c1e53e54dacf75046548a39eb88c63cf4723c7c8ddaa4a04f4b721c6f71aab235c6f438b06ef39ba95ed324d5c421fa4ea3e0e944bed961f0b832c2ca7942d6fcd4a49f16668a5403c154a63cca62473b5f26ad333d7d14fe213fc2572e148e498f8aa3e75d65823ec337468860302ca3ec3652c11f38bf60cec0a47d58c8e10440cfcb8c1b2c2d41ada18d214f33b06c933960552bb46cfe07def1a3be06d8162f9aa06b68865df4c7bc01705e14db7f9c575d592a9622c014c1303329757a65a414a9ed0c1b1b3f58b02cdb577bb5c44fb7d334e589ea8e3c90e99461bdcfdae7656e7ace946e0aaaa596cb000f4723f482494e2133cb50c974a42e2e87df5d3fb4777b77995f3d03c2c5a923799885d2df480fa93ccdee0194ea69587bb3d7f6294d56cfd1f5c0ac2f43db8661b0d032f757df444df8502d1942ada640522e52ee77759ee5387bed1598cbf26d98ee5cf2fe26b90e555f942a3562e17fc44c9c287d3eac7c30570d9c4adf2e4857c598f7c54cd126eb0180f04af0d1df12171b02e81bc13fe63a56ebe3810498f53f2e2e35b9543ec21f379209bf3e09437919a23e73a4d6610e0e2beb183a067b4365c0d5d50afde3a20239fa37f0a45f59dc300aae1ee8a9b97e83e80c9939f0b887d52d09ba0c5570290da6c1ae596f9eadd5d133f71dc725ee1c64c4e9da5c88da94c6bb2e122073f43594c342d07932d4b81d6cf71fc238a51de6aaf290c89aa72627552cb84d91abda4ca772b088fc990375c0e593a2dcedaff7257b043bd635b3d83d7da6e3b4952357d307a1a1e444db62978b2470f80cfa1e9d4eddbd24ce6262dde983eac3fb393cb1c94dced21c6a6b5aaf7833734b25e37a31c4566cb85b4c9b37f76ba6254383a77f5916ae6ad8186f1a37f337f259ce25ed610f963cc71ee131ac6c455b6ab51ff3708260764df13f940ab82b49bd68044a5bef8aa2ce61169d47f888e5d65980eb3818d188f07f32e5998b37987a38800f5bfe3132979ca1447314570aaef7323059e2e7e8e949b1d48b734326b7c60206084571344b57eceed6ca9a141b179d8a7ce88bde61d7222a8879373c9d9bf0f50bcb33ef111b5e6218213949444229c04931a6b180b2eeaf3aa4fb22543eb3a50b9960ac126e5f6ae2221cf252ff3e9c67c51eaa6d617e2b46fc78200337b4deb1b5deb375db57ccdcd32b566cd744e47facdd11516c39665789947ed20f5a67a529974c63e7ae51ad3e4fbfbb51a36138eec92e535c862713543883ea4d0c0a8efd71bf041ccdc1fd6b6e7366f5c3db3b94cc489cb8cf3822644d787379348d143756537f011ae4766071bb964b0c1a2fa6cda853087b5f2dc1b9a5941c39b9e0e12d51fd1efe82be2741df73dce7e5bd2ab397a1d5f265dc74665276bd83569a02de01a5fce2627dc8c427242fba058d2a685baea59b12d6843ac741e47a2ceaa350aba0222c4d5c49e4dbd2ccee4346add33ca103e02dc4f91f4b1c19860276cb6d971518460b02b48842a43cec6590bcdc84a27428804ddcfc282fe50fa2e9821c0d2d679664191098a5c3061b33155e6b79db82dcd11a34b8a4a3cf7dd2e9d04554109686204666fb4c56b2e2777a9b686571b462e9d2093d08a060385b1ebed0b5e52d7c0633bd9b7f86c9abf76a7bbb8e8f9223901e63729c4d1ea8053253a678d4b5e2df881d5f867bd2dd7c8b074d3d5ba5878da64b3fa7d3933597ca98ade507b51f73ec8f2fa85c55dfce854604b9fd74f7aa11c88c735a4748db9193ce43a3b59b8a0819f32f51da1bb50141c94c9e88d9ad08e3414609c147972c4ef2dcd33dbeec84c6936184eaf8f9a7fe853c6667965f32a3476908899c9446d1fff6bdd6f060079bf8871a0cde611e871ed27c9b9788381084248027ad9a8522dfda890799b039a208e83ec935b70fe47e5609ac43f0c132e1be9923e471914b78d0605921a2c4e2acce16a866c1211b8b103420015e761246817a06a8e01354b41f6a53f0ff4d63cd7fca31d748fd362f4726813b9cfeb79cb34c5860b0b3437911ce7d6e8e7f2e514483ecf1134a3c5045065658700329c99d369f76a91822b1ecb55f0419ff4a226569621cecb136d850fd28c0a32a71b78761655193ebf843f94682186678bf262aa31ac199da2baeb1337edafd1d964cb8f4315936d3ce1780aa6d143f909647db5a9c46e36c23bab0cfe0104584a0727a188cf65a79ab15c908a85e6aefd66bbfb57115921027e494fad6c94506981013f5fd90c68497251b89bc60af3e877c1fdd20946e6d3d14a7dbe96ec34c850eccb20c8f439d9b2fc0553080d825b16143f9312d3e2c70322f9ba06588fe6f53ed78415b996cbd1bfe938c28ab4b5d0273322d47ccf4c526756184175cc35ec9be6e255c909807d11e6b59bff2599347f7b09b49de6e46d8c1561cec06435b5787bd3ffbefca813967061dad73f65918169a039d3d41fa315ba1f04d50276de58f8c179e80a9323c238c6359f7cbb95d1a18edaab116e9178a6c88a000179d5c1f0436af09de22c09825b02d4580bafe4954e2d802951c7397dc6d4edfbaf2a27f4d2394531059ae10f78e9027bc64e3ec73698ff7659a2eca1b26c0b5b974a0f78e66b726e8e0efd12d84ea6327c0f54aa00b37592f6b2e6b513b5d4abb2b3ecfef887e4a0ebe6923ed1ba4c26ad51aad014f38f09a985dc2a5348c656920654e9910538629fb06505fd9240c2dac3b5bbebdfb844f28a217409ab7d06b5afbbdb4869da3e1a0ad9fad49d309174b419d00dde6ddf523e4b14af5455168e1e9646773c36ae0b34657fcf01980d1bc12bbef3862c235920dd9eacb9eb109be188bdb5e2fa0cb3fb8c177585f3b030798fdb255d8fdb77c04d748a62ab7f5f86f7a38cf48104d49ed2543080b005432b9ab72bcae5422e9b1f38d0d502dd497d578a54e76810cdbcccb8b8887986c475f0c56f64e901fe1fc75e1897bd950a434cf4a6421bab0fc3dfa756139cbf44d7169878a1e79556dcda46ba110850f2573c55098b184e2b528fb291a8b60944dd70a2c0088d66d940cc954dd78f7b9257aa3df738ea74a0d7517d03be421f34e79376ee1f2710e5fa12cc3c51bf8f7a931b11e7c21eb8f0c0d93924cabd4ba583f3875b4c610e1d47415e1e2614f71bb8036363bd01859bad6ba96d64a429073115468016b7c8dfe6eccd6bbb3c6ce624f7c4f3804f55220b9d3056128331ea8d7d56f51497dbbe27598c9d87723b6a786c98ffc264b20459e250673ad6f0cfe7901b42ac8da138a72c3e2c2172fd3900d66210e9ce26b316ef9c29641bd017edf215c17505d3cfd4e934b00f9b2ca28cc9b2bf6d082dced0f9761514ce6a52ff17c929d49ccdf43ef51291a87744674abafd63d28f31a806b470a2c36b3a119985c7c461bf0a3653f44a799273ced7e93ec496a0efccef26951e5b067e99d44ba0742992e91316a25b6ea0443d3674d6a98ad05e967a04cf0fc1b64485340b940c60d1eeb77305a88ed1de342025de91afc299621fa3795ea92d4d13fb8337f13e1055eb869493d523266bf8c8f775b8960e6a61e7e3cd53e59377db5df1e9e19a051e0fe30241c6acded1e89425caaa10b0bbc47ba5614d49a6df21391a71f3c4b1a2c269468feb806db8ba1e5b5de4847c16106782e5b949c9db8bf967909632987cb965dbeec2425588b3c3e2900685a301cc27e6cb166a9f05523b63a647683c144b853cded96718ba8c2176116e88d7f75e495b71f32078e53a5b993385ca1ef1ff33e3e09f6339d699b36042bb028d7f4d285b7ace0ff9e3aaf662b8effcb3ae5aee5b8482cb4b6562f63bb44a8735f22f516156058d94990a886ab6d4649ca1d5311e4b32039fcf8e6682e6bb8b64086b510794382ddb6dff8e1bade1962c64f498a6951bb0d9ad6290c04a7c838a1a97b3a8a5e46530eae063f01e860605604f818f12be377b6795e16e601c042ab11ad5df1b88d8278863c6827930389a4c2c883214781be7967ef4f7b7f881c8548b54156593db31dee0123d5e7eb26d5142192a3af7e2b0a2a427f6c2c080e59d6f9ae5f4a402e246ebd3ab3edfe7e147f6b0f1f6bc006914ac16e600d29604c41e36cb7927c3bb68ed97368ac25db878d0ec03c813197384dd2e3002cd1598813d9420439db22fbd7bb979d2c498356c5726da3fbb82525bddfa7f490e94235d345faef48442a1ad0cc6ef97650bfaaafffe0fce03cfa80214f83e3415a637a0a8e5a1fc69e9c3c0274bf259124d7abd41ee0ee39a75c72028a3c75480a04803f1c2b3dbbd3c088f31c54c885ab1380bb3534210de09423e7f89d53ace36d6ffa5734f030cade272d2af38b5bcfbb52edaea53e64cfe9ba58016d2575cce66ec4a73fe12b6b3e40380865161a761648f0effbed475ca55fdd0d7392abacb6a5237412b7b79e28fc9a1c7110ca8a6d8b4e62fed5bc6f0e3cff847843576d263da126771bd94be383ddd0e12274f208428e6d759fcef06e7645ce44e081f67e5ec62533b59b5ab8fc888b7cf31f962f96397a2af282c70b3838539f102f2f062f19d9112c04b3ef8f24b4092cd35e2aafd6f0e377e2dc2ea85e7b517b6b0005d922abd8291c3fd06638b55174983240b4ed3769d6f5171eee42af21ca3c51c58369014f53ece4a2a64cf51c7477fabbcd07b784b6c36125336955d9a5ab0a8c56774440537b8baf7ae9dc31d3779ee124abd7fbbf55a0899f5dd73fb3be13a37ad3dd71d0d21d3d0896d25a3aa106fbde6102989ab2be9359a59b1c9d7f5452160532aa73f7809578db3f5d51fb1b5026b19d21efe2a18b8ac90b370af6b6e05396adb5e4f49efff3408b03bf90c32a2224115f65ee33b959518d5aa32a1f97580db559cad15dc2a14e1e142d65e7cffa41c61aa5dd5a64efc68b4b102378bd4ef2b15dcd94a728a98c615842847088d790241a57b700d673b06cd3f8e9aa9b5cce0b8a964763773382ba97a7f4449de19a942622850c550e9598ba04859c79ab272aa8cdf179f869b9929803bd4d563fe67c08ae4e662ae8ff77c8dbfe359f6288767f1a9bd0f371b85224ffe871fb1afd4586a41af69d287571c5255c5f54aa7657d6234c52b073076003437b9ad399655869acf1a4f5f780ee788ca701e1ab7b3576930ce676982f26fd7681af27e5a81b786ddc587c7ca756aab6e8028e8c1e782810e3748f07b70ad940ff983f254df87d90e2fa78e07211234b274ca376e888b242dae541e92776614bff3d6382dd563ebc0c72324a6987abf46ac668905fcedcd3f81fd56608d15b3c8886db24df9d859a61a8f2e315200a59bb5825030db07068460b93a5e18390bea35bee32db3418d2e98400d2fd45072121ea21f67a9734acca91c2cf3af4c87757a4e6d45a85bf0bacefa340a95c6cf4a564a5922cecf2448e9aab0b9b8ccb0fac490934e3f744edb3cf2455a2cfff7c4daef9fead1570db9a0c97828db3602faa32a077fef26e22050ecb386f04895e23b16563857c7717f4d1cc5c97d1517f5a47f2c833de044faa92e0129865d1452f5331e93a87cea0a6cf93c0424e64a6c371494d0b24cf1fab45ab0aa658a1d7787da4b756a03f1fb8f033d61592624ded96eb2e0d2a97370f0d74492047bfbc061807f6612e903c301af6c79805121be19f2194c2592342ded482f78e99f49de10aa2cde1998a9e183722bb530f3eb9a67533a7b0193de620811e3b78b60822123dbd656048f5ee772e00d9cf19acce44fe698e61d3abcbdefc903d6706c3f2a097a0e665a599d356e7d84a93892503c4240b725ded369a202d2026e3f1edb69302937779173df6bc4af23627c971002dce607a2ad1a6fbecfc161e72df4d15f365dd402306abfeb13f95c4143f586c87e4b1cf52e5c3954c51b94c9e38acb8c9a7c76aebdaa9943eae0a1ce155a2efdb4d46985d935511471452d9ee64d2461cb2991d59fc0060697f9a671672163230f367fed1422316e52d29eceacb8768f56d9b80f6d278093c9a8acd3cfd7edd8ebd5c293859f64d2f8486ae1bd593c65bc014bc49c5d838bfe72575da60a098fd936c401942965e2c01b14708ebbd0756934ef8da3eea94f94fb28878024409865de16bfd64cbf0e58df1de3a73ced4eece8f5d32a374c6f2b8782d9e4b34db300301d46b275dab600e909b37d78fd42c5a2013d85d3f75b20cc08dd5a337b4046e15a0ebf31339a76ed4a7897dc5b0171d494154d5134a4231d2cfa472143d088464fa0530b63fc293062ab7cf3b0fb80051102f72b7eda911f61d9420941d462e380842460e68b7676d4b4a33b89a15eb82a7f09bf505ef92749c2c157ffcc655d7f2299ee35990d05333c91303f938c7222f1fba933a1d9e9376f4ba9d848fdf8ae1439efdbd55b8fe0abcd6e5d3297a7acf45365a36391c9dd37475b55ba8b699fd16af243a0c06b7f7ace426d0eeeed2b0e977129e4ef3d8da35af91291cc04c6d2c3a1f78bfa2c62220a58e99910972f993e5831d610d8db4bed1f797f0e7eb5a0da5b720757373b4a081e4d61ab5a1d3cbe874597c5103889741b04c2e11bdeb3f59b4da376306d5b4e0f22e8fd9a8661ae8affaa6a7847f496984f1de280b494cbfde4d0c59c6ace52a7e4afa5dcfd9074dfaa9e8f756c15bb03a2e06131d9bbc3efc22fc3efd62bac751d262285e541b7f1e0e4929c275557d9caab0ba3b0a153dd8010ff8f11ebc1f336dd0249d01dce6e3d0d12610c4c03a700ee305adbee12638904e70ea09719aecc34b38d406d4ea109788d488d5224e7f01a8dcbadea760e57ac08e324b63a1437ddb4c4a8b8bf46f0d771c72d10621912c0627ac92f053a7656d3b100b1a9a0143884948b9886ac6d8a5e615dff11b6e3705cec904436745fa5e5dcb711defeebc5b1516b753b6dea01a1bba286da4ddc9adb95a59280489e09addaca7f406d2915b99fcae743e7f0edfa1a9d30124a78a07d1a6bc279239bf29a4fbd22749756a91bd42c6736c70c9fb622a09360394241afcf753c9791e411499001d3e1e9fed036a2f26d9a77b7a764585f292a96c3cee2393469521000c62a302aec2ef17c5bb860cf72e5666c9593101b59f7ef77d8c2fc3be14f3a7c81bac4bad3b23a698c1fa2160f8e3fa5dab10e77be5ebfd8cfb06cfe3cc55da1e489b21432f22140f1bafb68ac1b5ffdf74c97f6beb5645144392ffdc47b063b5f058cd98285429d1d38c139d10343df6bc4411ae392898bb6db99bd20d6d08371bca96d3ad21ac87f17880c06ec87c4b8c69e56b57cabe298065eaeca4f29249d1dbc61c47f167d87b5d441b62d98386eb2043cbcea27f07847d355396a9c8951b72a49d7c2c206d7b22a8d774cf1b4ee25172f6241aa3fd82e9c42e6bf874c30077777bd73aa0edf8aff41c2c120c4b78e4bb13e499f1b28091dfa6a9495c7b89d388e1dd83af01fbec7011130a1e26b5c1664a938632cf895dcee3da034964bd6c1ff5187014518bc163dfb0201887a1d0bbc5bb4b2efba235d80c858e0426a42b83df0f679984b01617ad8bbac41545fa01a9e34faddfd50147493352526a46f8fec84ad1044272d3d2a42d42e879a825822194fa772329a961c46bb7fed8acbcd6d852171e35dae0ddec1d1e4d5bd23a845255b4536ea7156fa2b525ce17dd5d5436ae9faf03ef2580ace3b8bb61cc225067aee50b68552db80e99048cd0e1c5c00be6d37f54ba8a020d0876fa369dc32e8627f565ba3dda862ea0bcfeaac1da627e831a55d141f8ad3613c2d1804d0765d8494d2a0c67021f2a51b5ed4e848681b80cdbfb218e55c74f8c0309e8e5d53f849b532205d98ecc2b3557206332b067e0098037eda98b9982fca06a156c1402b2a670144e9d67d559d20b6192d4405a1f0270d2dd98806bf5ea03bcb0eaaef78cf00cc98fbb7382dbb3377683701da39d80139498651e85d0de93c760688a663703900a6f399c1bda5d4528dd11318a810ad144c7184b2e3c60b853ceec9097de67629d9621c9e77d5a9b3f48bc6356f42912ac11b7f1af61f9da27a181a8d1a7a2ec4aad7be22fed30a3836e7b9b511d643e921f4cf7506630610c822cba5eba3e95db5c4dce3b516ac3bcf455c1c12543bdbf98de4559738eb6ca19f7ae8440c3c4164aa17753d28d65b18553beef334ef7fb2576c312b29a3f290de96c8c61b7e3c5207ec4bf9823f02bc77b7823700e550d6e1b59c349dc65f1070addbe44a459ae85ed9dc6cab4ccf262d7d8a5030a3dbf1ad5efb360dc90e9ae63e76112118e9a22f4eab290c660ceff6fc6bc15ca18d7d2ac6d2b202329daabfb73bff287ea509f9e93c913e3168746492bb1ced74f1e3da9bb73b038968ca5db6a1e0d8dd59aa3f081547b9255e4de6fedcc55b8485c04d3c1d339a341c74509b2c78babb73ed6f49a9af05c86ae70e9f655d3f56d59ce336893e3ed9053338f35029369f805e1b1c7e599c70fada3bd2c946f1725dc44cf96fad59dedf71675d9164d5000b76c2ff17b9e5d59a920f579d152a5d7af0eb13451383bbf7c96c1884de2e7371c1e77fea528a6cc6a8e99c453a327ed98d3e12be0334f6eab5c7d29ed7ab606fba090d8ab5f29d0b796aff5638b26ce603b6561efef62624a10b0a43f3c46d31e998265d56a6ece5ae041f3493229e2cff047c0c694fb02215a63e18b511e074bb2568f6b71fd2c191356a84dbfb891ac978f2fad49a3b8fae09dc719e1c70b4b93133cb49e5f54bdd7f7fbb75b5b43c1db4395eb36e1ec9b4d66403013c746e6e3c156f9171bac0ed62bd4ce2d9b60d4616ddcc9843d04cd47c634190fa81fe34b69c48204b99ed3b5fa1bdb5eff50aed414eb8f5b3f695876c6891dfef1000c72116e978ec191d61f6cb82615107b17da41aa85e2708304846d2882082b502701c43c80ddbcedddba8a94f77b544ad61bfb01f24257ba9916c4f99054dd76fd9f871684183219b12e5b9596b85523b5414ad820a27d77ded7d1e4910b8fdc56f564e4ed67a97f1a24e7a44af39b6f7af13617552b68209c6c9ed2cb54cae9faaa628e01f3ab86df4437aa5d54ac97eed5c8a6da05a21f9b8033a987581405b06789fc09e4bf96ca35528d15041201d995076df757b3daa3b996530d3ef89841d4e2174c626e17a1a04037bb2b551703d9fc55f34921bb7cbfd1b6a52ffb0a769874c514943e712d2c0a8e96f0fb403348ad4418057628ed3becbc9753a7c4155c48efa7a2b90d3682b77cf07c8ee3338a2423acb0398bc0d5ed4c2ad1832ce6c7647e4eb5675184494fe80ff7966ac94869dbf875f34bbb34de4da8d217abb382d25851f5cfa6de2adbb93c88993cbe2a8252447a2bd0a701c6a9577decaa42349a67f88979750dcd62d9bf5721c1d9d77972d8e769824be3ae4780fb898f5c86c2918b99ed24dad9ec2fe08db561e4f85622fbe536c971839d0f6a7376c3c92054c0514fb41d0af782a3e752de84a5341f49f69c180ddf889be95f0e3caf51a957db93d155c668ce2a1d1bcd2292e634ded1113399b65e9bb1bda5f462babccad4ca99475889bb07ee85c6270cf36d9f9aa194d2412cb664e573854c704bd12ad275abda46cdca49d6c32e87210f021e5ca1c7a397d7af8a41f3473eefcc597259c411b1a5f95e3de9c09b16eb4f6f592bb9f2cb232011b6cd2533f466a41d49729f12f600773f8a2f6257fcf1197bf70fd15c756d6da38f90f291935d3be25823eef8cedcae35d9b092a960bbd6eda110d14ec7fe272ebe9240a8465cf9734676990963c30608d27539d86ad2ef8efe37a110e95db77aeadbf9c133ec4697bc73888edd3ce77f1c853d2d44bdca26b78b2aea0412834fbc74032482948a156221a3ce64d0b96460e888f01304d17d7314522440a6f575dc6448195cdd2db6df88d3131e05e47d45a7006902306b5adbdb0205c4a074b3f1b3aee8e94e9742dcb0fea33666d09374c98fdf36c8ff8696e723d6b98867d3a3691fd8506f308100a20dc7d278e66d94561c9cda54f7ca4d419be046e7389b9c8f8232bac8613af465e9c71bc58cd54e578ee6145cbaeca8ef546894434ed4812dbe3f4ee290375f0178eb38d42b914ad3cf060c69b0b44efb34b9cb271146fd49bd443544273eea7fa47b512d2c6a2fd2c644ec0241ece86c251a1218e9b8b6ed668c96768c183de654be9059f528a65c5be7d9b0d55a1d4b0ed291a03ef35420a15e9a01298dff3e70fd1bdff093567a7639fdfad4c8969fd62a714678c080eb5601686c6464d88fdf801a478472e833ff808068a6fcfb70676ada92ffe5e2546dbe2a3fa76772e28b8fb61a188f0390de058a82b3bef3c7a8daf30d3c2a2166cfdd0503595c723e5b7216de16b05097fc1041d164d826ab81c1e53e9559e52662a6233fe10c83ac3770641ee59e76523fe8d0dc1f103d24da69d7ae7338d89e0f60ac7ba93f4b3307d3c55fed211ec990d75d2b4d30e03a9b18f2e33f91a0d5bf55c83f18bc72dbb3e1632b9600f003d823114757feb6f6ad175e675f2ae5d358cb9d14964da1ac24e3660948059308fd1513b7a343685ff6ae42c23dcb50a1c30b56818bb880af4020f6826bf6b0e0e9f58c039bc69d7d5f24c67a3f3e8846e95d190f5fc6b6ebf0e2391d679cee94820ba3b4a651fe59d0c31419cf4a36cab1080e447b3fec681d6f5a62a4bff62ab29e81512baa33fa32d1512754b6023602565fab45ebc92fad117fd98b276fad5ff84d62949ae3696b97a82a364b9391c68d31c92692f6478a0dd10b829b0222735f307048e9b6ac655d3facdcd192e3e4f6af2887fb1ab89aae777ff2e55793d51c5202af5f56cd066b3e34b010a63444d9fe4fceefde8bc73b99bd44cb15076d77daa031c468d33808ce4b19cf788dce7e49c66536eac7f7fb614ede16e58723b7f0d236df97c7e27d17777fd8b0f56a2cb616b298e5741437f5b92a8e6e1adf26be21267988b0ec1340434af1f575002d6dc61fdd779b05387d868efa59c8890a6914695ae6963d0f7134e3e3ef1478c7975e12cc4943b243223e74234d9909ac1c3467 +0xcca52ac605ab74649fd6c6bc13da780e913bf742ca25fdf24b0092170ec4909514027d8dc1e3036105219fd5a2f260b8 +75472 +0x89c1c6a082f5058df81f29804be8c212ba6720a534a0c6036a4a1c4329d664ede7acef5e9cb8916dd325524e006866b7148160424f7da213554018ba8581265a8616de0b2272777e586cfae0ac423f00c2dd18b32b56cc787fbac758ac0a8f108d86fa72bf2b9f09b07b8afcf87c3434ed03b2c171322c7a0f4091e4477889562585ab5a19ecf15502da686b8c202c9dbc7c9434c91aaa632e5ade28fdd4fb73769a598ad8bc55ac7712fef40f35118158cf28d4da152e79039116ea7725ccb0a74d6ccba5a4b35437aab3612ac4ca29e884d4694d2ba006b76ca1f35c73e655e1264ce528abf396692aee7984d43fdd952402bac964e8507174e70b55c730aa4bae62a008d9fdba351a1903c66d58e587361990f7c9eea05a2f51f90a2892f60e6c14c4ed36b908c4039bc89797fd88e54281b37f619b3d9a274587229ef48351e8cb1881cb0fc83e6ddc90a05b160fd7d0a1eb0835d57158e42c7b46313e973dabf065699fe841cbde442288c08bc28769e3003a4b8582bcec6f9e1dea587bfa3ce97350ba2abc91e03b48f8cf44e91a94aeb9bfad94b9efc974b850d02b77af23200adc25bf81bbfa29c8988f29ccbbda6bdf3c63e85e1903a59186eb9dd284e9fbf2b5e78dd86fb5766b0f0823b390c2803a5c736bb9612069f0684497d6a215e4f284087e09d5978af9064218e5c1d45692c4e70311f0aa279f9de202c9312f42d4f191795b172acd3a2446f2ab779855af1fc69ab0ee294964cecec4f458c07d5ea38965185af6a8f6121b974dda97e559131917dc82233608a30ec79f404ffd5943f82c86c98281f477c9f11311586f5748e762ded4225653c3acf1121164298c78e7b5ed8956c1fdfc59e64445635972683863fe0dad110cd7af2c94f2876bc1eb5ce897c5fad1d949d2602a9d410d7218150283554dcffd86205f6e0b412abe4462adcba3f71750053c460b4279f11f028427b7d388f8ec790672e98519cf4c2afeecd04bd3fd29d89f80305b936f40ce90bae0b0e9f4a258694c4b8898c033453a8defe619ea2e6c04f5e11118ee9f243ea34713f52be7ca52d7dc3b44663b3e1d78709c4e462566728f668c8fd602aa98ca342536068277c7fae6c7a8292cbdaf969b94fc78d771f23506f3808e320ba517ee0e33eb3d08d39daf544972cd69f9cdb7f7aaea0c338bcf0a6e7380f7ed6d73bff57443de257ba88009b1a7e7eb02060eece1038c544546ba27f11318f9f9c4ed0282772e75c904a10e673242ead32ae69c282b1e7d28805e4381af5fd650f4c15fe4edf5a1c4975a8cf379a60f721f882f07ca8c563d663eedacbc922c7ae98331220ffb50744af3abdee6db02e9cf3ccc06489c868be0a24bf9a27aa5808d7ba3c544072be206b392aedfa86a40204a9bae0e17b61ad7d185f0cadfe769c6f1da54f3e3da15b1e46aeeced7f07dfcf9c58682c48df33114c4199a899a3d7e2c01578655041534cc5a231a2e3baa4a9272170d6db41dd8b330fd7b3f67059c753e56642651eb78b38bd72b76f4cef25dc9e718d8d2a0b2f6f023d6cbf6c80814b9daf51e6b9e64e324916976c2f2dba2f38009ce9085a9242d1311f3ee8eaa519c6aa104f736dfa34eda3cf84e1defa9186a491796d3a4870e569680f75f6a730c8fd0a2a0bcd33a31390cc23f5715b95e2b417b8b928a65bc73cb39bb4430c433d0eabe0b3727f1f436419e3ea8351cf04d58c217cb45075ef21ae8df44e48a39b55721e3afc310c0594352f3193818f458f5b3e385bcb51d5cea530e686e0e46c67f93ce2d8fdfbc2b7aa605b104f693d2821897c8d7b72138a243eeb7b698808ccbdb74b773a511334f641d7982fef44566b7db9c7e54910eac802739a470128ea1c37f5857ace6f92852e2779a7740380958550a99d595676fd262f621dd22546a119415233a64066e3afdb535ab9e34d3c5b019108257c9530147f71328d9678f8e5df8bf98b2e18ae2153b39e037c02cc592d2cba3fcbfc0d47d43649a5e4e76028208130efa12e212d30f905f32647c1fa43bb380afce1e15ade2fa79da918935ab4d07e36122e094df3b2070b8a82b9c8d5fae619680d58a7eddbf0d74b92fee7fd084611198eb2fe0c7d35af115a104f543a58dd95c4dfc993b99a0554dcff7a69870ce32fc6aaa7eb98f670432461f86f1814da1eaef32a5047278a4d5d316c9adb573ebd7c7ce621b3edd1a8783b4e67028e916b321f64b4031de8adaa2149018399865b0696334f4c7055a9dbe8dbdc884a95f3e4c0e33f8be1a2fe3a4b8a2e0e685c80fb8319b4d1227edfb6070b4027cd4a513d94304340174ba7841cca80da2813b7c1cff402d078bfa2ad2267224f7b40fbb2e5d66fae2345321e11649a857d5e680fd96cb9c8e78aab07b77a039df8fc6bdb524035449a12467ec602eb8eccaf2a2c3bfe3a38f382517c22ae6461baef1a1d56080491e0452d1ca70fe4549a6876bd6403048f21192e61109eb559359b9f0f5d888e149a508e8e30e625856b1cc629fe15c959f4c19a6cfda586d2fd846317f55c125b2cc6c32a00402f7fb35ea0f846c0c927e30e4de6366d497d772bfecda9fd31c41c1a6396719852d207809faeea7ea4678071816377508da73704caa6e7e67cfdfcbdf85a11494ffadc34fac465c9eb97317e0d7b2cf9c3eeb1a17f1a3ba254472343f9cb7bed6778a5ee7acf251d0f358aa62a73c3b37cb27b8454ce11ab485e342ed080fdff49c9f91f7825c4f27fd1006c6113d82818a0f9201409067bd9a1b3e1251133f9576d4a4a8b7ea1d4bde8273359a1d6c24828cf071571869e7890170d5fd2aa5620e12de21d20685e59e953bd7cc45c1c5bb8419bd18e1e8db5c7c1f5f96bbda026b3f898b5b174d9d4633a5d32e1b490f3ee1560e0b53ac401b7694d7a430a71e9545eb0dda853e1adc43f8514808cca71289ef8cb9d77cbfccd61866adf0d25e950a4cd0d8b720056bac7d7ba37511383f662c5ea9d322007984f1343b6323697278f6fbdd17bb05f8587c77c6c8e168ce5e54ad63b164aa29676768d5f164e8347630b76f0cd6c38d2e3c6d396b04dfc65bb1a070d70b65e569c42b04025b82e4eb412c18fe3be63116078685c442462f44896057afdfdbb4714ea44efed1e089c172815f55b017edf823e9313d634512012514a09fa7b19e684ffc3e4d8faa2bdf0bdfcc7afefec8bcd9c0c53c2e837679cde5d4112d92ab340d5a59575a87d22d546de8d3ed42ca4b7130ca2b6ca96396c9fb7a6c3724e4bed1e72985fd1f879394543ac9448cfb8b3363c771e55ee13f607d1a188e0f50eee2ca353d3e1b51f915bb4bc5cd83646567814476614bf95cdb933d7dfafcf7ad8a2c05e8e72339471dcba12d4ed00cc154b1c9a2a818b2d682676a034293e2e10f3522efbede4665f5abc66a901afb88431cdf5d816c15939d1e2912307b1873ba0c13b88cf5803be58542e55b0a3aa07cea0d0fb6ef287c74e302128a5da14cd3da60ad180fefb2347e9b057648d0f34742dc200d4af5794fdc7e6b19e08652a2c692352cd59cb02cc05b31ab7bc568ec4cd3f84f25847375312485a5adce6f6ef930b78eef8e1e137309d3c04b22e6b2327aff4427db502f0b7cc8f66b818a819bc29d0704cde532be2e527e62ee57e319599eb3f904fac5920f9dd3c3a88b21d3d04e5fbc62ebd1ca5116ad6531a2c52bf93b654307577fed646a055d4a5997c9e3325ec1541a38bffa8715fff3afa190e14023acea51a445049855e06fde2ba682b1ccb8ab59aec4b20d7dd63d66be709913b3dcb7cf7ec1759088f51f0124923633704c708f7c01ff10af9216af66f2aa1edd7c76b8538a41b9694363aaccb486201323aaa6eb9f6cf871dc8772df3e9bc76b342df66cc7ef7abf7342c16935fae07de5618541c67e2d8c5c9797727df47823abe67011a1083d512cc52f443c1adb763b9d14c69dbf17c8b94e0667d73e98cf8aa80e8a401369e817f3daa5f26f7ac6cd673bc44db61eec9bb4a70673ff8f35787cb81ecb98664cdbd4abd37f80233442c6e281fdebabc2acd262967ac2c41e1e6856166a209b4521708a180ad53f8a42c3f146d6e7241091af2061130ca1512377d0ba4732729b91d060babbf7378e7765505b0031f39ff553c7ad67678d9831ae0e5287565215d2fb1302bb6d710986b4e808a2517e377ec741c39e5af0b9ed17f9265514a37d8df98d3832bf57c21ab89f95e5d02f9fd41274ebdf6e337d01b9777ed7f5ce9969d3b4a448765083d97a5e49f0356da1a03c4a6d5229bcac159c71a1358039320f90728e2319c3126b010e6eec089f038a4eaa902016f40ed0c9d0d8983e4d0f2638ae3dee301a387955954a00d22f8e394f7b9d71ba436adb477a6b28b572fa57d450facf44bcbdab7fdd255519840a5647a7dc6c9f128add1e59a20c6f11b94a6a3f0deedc1169a886cc491268063f883f15953a4cc7347f5754c46df49015a60565be7480810419724cfd60441df5783dad100249cc3169f9521b72ca59d614aaa95589b87455a54c4488673731f3ce4c5794ed1f8749420c3ded447bd2c43b63f319540d5225f51b9b334ec8aa023171fb6b23556243b399fc830a8f65a6c4372b53fe06833cb0e73b463e80f0ea49b681dbcb73c3e963a67725ed8c7946562f3a4bae2c6f627fb80b095ee56b73bf22d12d0e011401fb3e961b15fc756a9a5106498d057f5f0a97f3c3d78184643bbdd4a91388bc54226641aca966c3db37a77895c31b19faf88bdbbed0dca18764907096039023aa81286021d153ca61d639787677f6a7fcf29dab40727c2ca2e3a28e3e059fb1cbbf8bdbc2b74af2c31f0def36d21c8f2e9fd44b92e4eb8b7e5ffc17e7423fce7e85979ad780d3a3cbb92dc31bfb173b55a838a4fc4fb128e381a4f1dae1f7e28c7b5585a85776453f4da1de6e1a6f113cb4d19cc5db546999f1a4065f0b4f55be48cc857d62bc40e8826f267659aa7baa6ca81c37af5eb86756043cbde8d08fda9505809dc92cfd8e01a1857dde52df6677c40d98f4577c1659ca7d3e9f01f9a809065f51b54fe2f9723fe2c9d1eea7397f2d5531d1c51c6ea100b028596bf9f24dd90be14eab58f07b4f24a35b073aeb29ecde4a6f320237d7adbdc43d94f87e08866b95bbcac83dc7db3553a42400441f088e2bf6259539a2da8b5a74065f15e31366b4253498a6fceafc21d3cd610c09894f1b8d273d3cab8e04322549947f868ae688b36f32f4c3856155108bc50a8e7808645cbf620799d10f9379e3018498f2d2578e05fcefc3b34c3685e4940757dca14c8c756c6315ab94c7985e0cecc254116add7e605ea57ca50d576236cb0cbd011c45d1c418c7257c14a9421f7eabb78d09c960c40a10e85422b18d141e5423121bae5cd0ee5646adc3d415a103fb232d7c7a3592bcad0042bdb9ec94c8d717bb93f09df9ad6b17101b4361fa445ca1d90a1784313a24cb552697071f903ea0e4ca321ca71cad9e8d661bad9106743779fcc8d6094c1c5176a474661e3f31c775099d624304c5e50dea8782d014ebf0f69ab7b282bc3d9b8e817892f79d5793579859f6332d5af476f1ad671e356ad1362c09a0045130b08303ca121472590c70bf8d60e15f15d1b2c1b5e4e33099e422fae928f7d29d993f73936edb86de3aa9c66229b3629e86a7a2c88188ce1f30a24c7dd3c3082b5ca819fa2fb6a18f26ebf4ffd813fd9c1b3fde0ec773d7a5bd9f69ed28d0bb8303a83c28dc0c8a14d71c938cf568fab79660bcae3d0d13d294ff9a62b087b24d95262544fd440a145525e933091a1f9801f483d06cbe494fbcac2704f14eb7301b091d771ac8e938a9ef3f1a9b9135e763e27c9edaef43c33d8c58fa758e90d49c3b6ae9bcffef27da61dc693334034bc512ef3d1106c7d72089746dc4b006e220a354c16a51e389f0620a49596d536d2e6c23d8996d9e336c8ac584641ae102b0292528ad268f08f4dc0fe296a4ebf5a6d86295f88a907e29769168df36e9db52b523450ce6b94aedb6345b713f948a363ef29cb8c764605f372140bd6be616102f98410ff92af7e3d8c1dc73a716d4e4861c16608be48317b4bd3584209f5af27fca433ec8aab8de2afe8f2244397dba98282b793dd68c59d5ad6fbebfdd50ff8e027422b90135e793329a097ec52ac05c5e028a4703262b823815f2af68a03f4287fb4235f61505fea725adbe8185fdbb06c41b1033f797a3a74fa95808f1ba84a30126a552004150a359986a3636799b6798b5002da7a42042476a2285eb793d9cae576fdda0a2726f5d51ecace53ce6caa7df7fbbdf5ae15122bd75a6378353bb295cfd5f9a304c535a60aaab394f82771921f5a347c2cf1c0b2ab9347de0b0489bbdb5a099f3c696784e0efbdab959b61503caae86e3d0eb283a56f864993a8b2b03016743f4c982dea17e63718251cfc30e66a445c6cd05a174b4b795b5dbcb02b5487e403a3b5db5e464ada6b354094cc9324d2b71afb39f613b3cb83c7a52475bf1ab39cd0670249c279f205249aed8bc9471e1ee5c3d4a87544e7437fe66237e66b7d6b6100354532f02886a17048e70f5d70e45beebc97065b471ad5150bea50e6abefc435e6d90e49d8500a854976cbe485b7cbc0445a4d83758a65a583f58518b9aa785c896dcae3ac01ee3e51b38558c6f9d3dd2e5a9139fd12a01c5cf1f97e411c0c08bf7bef59fe0cbb001415d246bf4af2b9bd20980b483422ee19583483bcc4ddbedb9be21958e10f7ee316291ad8fbb6da8334c853d17f5c9f2ba0bcc597259be3704649ae472f4a0f514cf0619eac8eb4131f88c04344cba4165408c06ace951b0ff39c854337f945e122dea78adde8daef497fccf834de916bfa8ee0922077ca2d3c414ad7ab9b9715203a59280053b36a3b03d67ac023fb9f0cd5b2c7bba2753a78de4b6eeabf876fdd99f2f0946dd2266ccb7945673a2711f373c35600b3a0ca41da138385c3ab43a383f17f3a85bba6772d21d29a7fb87746cf7ed78009d15f2fbb4fcffd4657432a6ef11e4349d46cb2af6cccfa6334318f6f61c6ca438b6b8af83c7ec1c62fe0cad17e784f18b0ebd7d8b67ed7830ed335d9f8ae3fcf3371fc27864a73b1a9af1d51d5f7de70e5a63f1f9b72e26dccdec275cfe8612b7df4ebbfa99d739749009a56a42741e0c71e510a88437b61e2b6cde9442fded6af86d227030241f57277ba56657149f6e9c6c620096b333dd4edb09ae1cef95f6c8a68044ef38f4ada8705d796802711d23206e6ab448a2037f60311455041341981f5cdd9fb8c05d5b0f560c3be99c004e28bc4ca89e0d770623dd2db5e56e35af003ea3084f8b4f888117859a6f29fe64acd40f385e7b212b4d9561033aaeb95772aefef1a35e6b77ed284e4b3c1f01afd63f1c2d30f5e93606e21809aadcb4d69d3556235c4099707c12cd16f986f075cc84da4ebb82b76e754aba8ddefe1075a85a1367233ac1ba565c6cc54e66b2ffb62bb065a82a731cc357af587e1fb47cbba69d83a053cb9ea28e921ee2c83195bdbc08389ef50588179160323144883300a05d3f7a939f648931a6eb5eb3547f09c0499146ec55fa9a7f33e29f7774e19cd0b9655902255432cc12f269300304c1bfda3648164cba74a9913271bf60d0babe1abbe7a946b5c5e73dfcac46266d0d3f25ef4b7cd00fcc97e3e84f25344680f3e90bc98fe8d16c0a8fd0cffda60216ca9186f724ca43cad28fcde0afd88c16f68c1baabcf4ee4dbe7038795d690b04e786c1f618239c98e1ffa9cd6734eaa54f6db330395355908a48fa526f58d0ff1f6c6aed60c1635b4c9944bd5531a75587f29d030deb4e5ef77fdf033a5b992ef8ac4787028edf3e9cc7655980b50d4d2585a0cc40a620df8c7daf34c65badb9fcac216a08715a6658f0d649f0a962b6b18d8333db6b153ad1ab328c1c3e55c9b3d5bf3e79511afe087b5d34adf6efb7b3720fdfe52173984e6f2fb443eed986a48febac5e18682c34d2c3c3c082fc79b49b0c7966b283208c3270544351811757436b5bbead8c18655ccf9d3037d1243c7242a867058dfb125dbb13255194a4545708f5a1f8ceec22814b6a05fcb5dfd15e7815ee02d9506856d999f0d55c5724358a1f10e176cdf4a9fdd447b8f2d2fdc778680691ae481787928facc41f564e43b9831150cbe5623caf81ff55ce2647150848b49a560ba656ad9d620826c95aeb5dc9af2d165cf4a2271935ba920337b1f15d020517c09d2df46a1988b9d9d0943d99ef609f5a32442e45efcf85905601fa50f7ba3a8f85732d9fd92c20ad39a52299dbd1ae06a5888bad377cf1f62b6eedc99ba206a1e49021e3aadca26f1d88d4747a698b88d4d708f814a91c5c3f61916ff7a3c51e45ec98df9580884402a41bd0d40e7e09479a6bce8f3e4feb1840adeb12a6bd2e2def5a3ba1001b567261bf56f2a9ceb187377dd9ae23d2cb40740ae4f59438f726012e9ed744a0cdf42787addb23c4a71b1806be7b41ed233f667003a6537ca4b78addb03d3562d1115e3c7d9762a8148ba3ce28fe7ee81b9b7da6f02fcdd15b69f2301adeb9a8884f6ea6702f50c21f60429cbd3ec30addde20765297e88144c2a1ec84bfb9b91d39c08d2caad459f1215c392543f99d8e8fb9a6d2e78ed3894cffdc95ea1edeb654bab95910d5b6b156586e091506e75937afff1726a60e4f8f75c7f666ce5f7c2ac5f2a06a3d228888a00111bdd431645d6a49ca5c187bc11269744f3bb38496424affa9bff3e39e3e9bbae44249c2d789524c9292cc62045d44ac4772b4952c24afa91b17df411a00b1632bac4fe4db44cfcf18cfa90b43f86f378611b8d968595eb89e7ae98624564ac28d03cddd9814499c031b99bda46c50ddb523a9997068bdf4dcf1f9f8e6c9cea1b350aaf635842879fc7e84c14f3f51667cad6e1d6cd936247a83f7e185e0a5c6449bd077da19d42fab0150606dfcd99982b9efad85352f122339cb872c2438f9e9ea26a8b15db586b7abe6df26284f3f704e1491e20212847d195d33011bed044a4794d0dfd73345c9852e89a14d1d20ed75c510adcb4643302e952c2c4f2dae0eb902398f0fb736889510a507f2aa04a235ea730b153317e57d5cbcd64861bede495829e78ea71f9de5757a7fa05eb336966b03266a41c744109829278ceffd61fd7ee90fdb6dc9af7d435132dea1f452a030052651d81df4ee33bc46a5413340df5dc1307e6ffc676364724834db919e5c21c4335360df9e1f13bd5c1bbd2722f7dbf87200177f6da1be25e82a7450c1d1278773f741d6e9ac22749074cda3b04be1d8fce8cc1c683f3bb23a49d4fa6407289511c5e3ca7e9c46280b3ad86d92e658a7f7bef5990043c260671864572e070d373345af8304f76923f4f4464e6fcd26ae8a0bfcbfdeb73a7997208a2ec8d8bfb502000bc824c572ab742b7e0eef0a3535de554856aaa28d43f1e7af48d9822557a57d6062860f4909b366ea75bba36b841a2741260b0da2079ef73c6e0a0e26654444171ad1ddd685d82df14b7ba3b2e267064ff6aaff610cc6d897660383ac2609de96b6ad3501660c08fb57d60ff199ed7cda902f80b29c8f102af86be99ee31ad247fec421b2f67680706275f110efd3104aba41987dfd24295ceeeb49e3e49fa891bcbba8d17b3f1cb9340050f62d424b073d8850aa78abab940f2aaa6571c1e9dbb63dd2463e8e653c951e358d9a61b379e1aeaf21554d1c3c22d1140bd2a71c8fb5f0a8f9878ce2624d77a7bc8059d2096d58becbdc3106bbf0878fbd4e7bc914817c31d29e601b9323b4ae6b2551301dab30848e5580f07941f524632e6278d2e28a76baca349838e17d5282d272531f61de0953076163dedcc2dae6bb86b231a0c27d97542de2b74d799ceacfe4c575580a55033bfde6528b97ba2c3a0ffe9982cb50538475807a3051938964ce0e89585b7184397b013d141cca1ef625e572524ef7d4a234fae751ad4048d958b4c1297964c049043c0740f814a436eeee24d6f27804f691d9687a33a90f75ac4187920d369db3c02018d7d4a0a74195a117d760ddc9c8b5a364718ed8c782ef3d425cbfef05bed634d8a157740d604086b31c3f2e0d5fc8e343ff64d556464c2e594f3698dfb36f00b0662a9ac0db1826616f3871b704f11e6cec5ea6a60ae99e36331b3913dab20d06edf41aa6fa44088796f3b0afff58de490023559e15ee1440d015d8887bc8e243ff5efaa905ecb48f5a17f2dd9826aa41035cea25b18419dfeecd7f28ded808d0641044b0433ab3df834c402917830bbcbcb06b2524d3347b54ea35da4b0b0513e4b100a2fd548ce1d93ca17bc3968822f4c8e285b702ed7ccb1503860989637646e934697b62c7fb248d1dbbe588a9dc734b562db239cc4b1bf6ef146179a9605462eaec058ded972be7bcd1c580f65001e2d0045da25a4e0c34046d9b036039d4c12913e3fc851cb7f387a5aba7f8e7663557f4ff621eee65784777ff510f688fb1fac65cd917f29058851fdf25360969ebf3e5e2a4a093f069c21bd4883e574dd863edb9492b817ebfbe28a821381fd4acacbd4c8e69a673b07c4264d3766dd6de6f7043764a3049d03ba650c3878f6d228b658648008db7f47dd2f5583d12f16c23373f88fb69b83203831d35aac3fdf397c5d8fbedb284deceb5d03f1eae682a892bf8a7c794948e1ea5589c29214bc7d9c589cfb97ba21676d13db19ea901bfa832b5f93517a58b95f648238d132147574ee3ebeb52d8437d1083d6476c85d48835bda9cd5bb3d26f5c37ef5d00451a1b462c780b9eef0dec58ecd5a05dbb10321d59dd17c8860ab4c16b2b215080e92d97ad9da2c7b01eca93bed631e56d1cadd0d1be9cc7e5dc6d0c2dfd626a9a5c9327ae833735e01b1fa84203836d619f01386d73e3be9af0a125c58da6b85b1a57e07751524f4aaff37fc0821d5b6042373c752474166bed58f47b0478a18bcc81a84f307b7fb5804f00807b871832ad56c330fbd838217c9a60978a5d8df119176980483b2de8363a13c9174a0d9f8766b7e71d968a844470536046dfe456aa230a50c019bfac7abda0e57deda16f7870ffe2b536765beee1b51f61850f8226ac7308c19e9ec9f4df8f1ad7f83b692a7a8369e941637021f66c1d03d7743d36bb8cef725032074ba8c8b14af44557428f2bc4e13eb98986b6619f525e7c4f82573d4ffcbae32e272033f1006826ff6bb4df3ac6b5df6fc4297cf079a18f7fb1886e6e86611a053250b92421dc46294bf38714c02e3fea8457a6579e2916966c56079639cf3d55113f4090d4d80d9f8a530b9bf63240c16e49c51bea7c775d5acaf00d3d8bb6e66ff5b17f42e5e328d1dd531491484abe2906c28584241c9924eb111bb91deb80f27bf537938a308bc89747cab8f9c5a75e9686dd94a96b1571c2520ad50e46eb42d8f201ee505c91168bd00494cc1945b402f86b4491ce98ea559c20bbe42dee081492247bbecf0263c1d4094d49af60d451ff76ba66ace937aed5a7902a0a53ec38bcea645cf1a6593f3c220af8edc0658b85481eaf6dd1ffd5e7e57f6544e0954b5899ceb22b449e0ff197f3623c2c10b9712799f57818ead0b823ad1f435eac554d7ae349e3a6da39dab0320e056d7de1ab5c53bf3786a2a932a845df6f94d85f85d5cba88292b6c3deb5ec84ae4b530e1a2e739511e2cc683cbe6d2e304cc26fe7f2ae5771d1d9b7e7ed4c4da18e3b45a8e721ff6ef61313bdab4d93ee4c12905b18b3df172bed1cdca177f044fedc903cce8786b6881cb49fb80f96115d6fc7c99002c7db6797fba41998f50163dff6be2acab152619252c92dd8bf0147811e19a3c497274f815b299dd5e53f84eb8017441509a8491bf62352d39726d2f19c339621d862a9534452755647652aa9342d648e1521085fa7956e25a5e9c6674900b44011f33eb4bf07e844a3dd1dc01ce9d15d5d2565086d07cbf971b0ea8a2e66444aca44d64dd2303fc7820e25d94033d5ab691d29bb5061af7584e40703524e8d668bbc39c688b6c3066a600a9ca6f4b6a0c26f1c22598b63c165eee579bea1d8bdddc32ec6e67fb92ae63b93b05812bd63ef8506e58f6d2f069c344c9578456d7747c17ef5f6746c5a7b078abe5e77321d78c6afacfbf05a6cb22004ff8a2494bb521ef1fdbf7d23bfb32cb56dbe095df5e699df1ea3fa2e1a2e19d45efb2595b184434f83498325811512dc6682b28514bf685de39174f1399886865bd42fb782689660329d6cbbc72922c951b259f4a18e9af2a4cd47ecf079d1e09d1c2c44568380ecafc2222db978c243d554e6f0c5d89766095d5967685861abcddb0382545f6abaa5c08bc381895b119a7240c2a827c681b94b94aac8bd9eae921a9cbaa583ba93baa091c544e456fc491351b27102910a5d9fdffc3930f0b395e0df337077da3f96691b7a2d1219cc8a40000749f25fcb9c5f21a7e33abf807d35b437dec43086e223102b619a0e490400350b577e998a1f9544f1ed6273dff321030c17f1263046d65a200b049c3a605bd804c42ea5108d482f23803174959fadb4fb42862204698be0a151d92a694559d23bb78aec258f81ca84c32e2b6d28e0af4c880b8ecbf44a8af65ba0229c5c0309f8591bd690cd47fd5edfe1fe2e37c3dc471009d14d8e19406652e1eb9c4d606683d168cc1beea2b0f7fbd2569f735c233403085352e002ea3a5e25ed31bf78d12348f9348c9b9acb99408a9c8a85b56d5a888e7ca2920c70bba6f290225a543321e65777ac7b38368ad69036b514d6a002c825b4044b3fba2e53d33c39c7fb72c5d209fe433783da12e46c8ee8c9c5a674ea546342b3a4b1de8c4d593cae7578573597301976849d7b92a70aed4c8c65f817a4f12273423b127aea4ff4b6cb2b1f368a74f5e141680b0ac8148b4433c7d6779bc66d332241114531862988047565fe6934a11fc4240c7157138959c0b35531c34aea9a4aac2414aa67a3cc283d70b4bcd7e3d915b7c4f2dc6fb0343d10be6ea4e66351c462930fde582929406b89810cc584b73a0b7cb2e08fc87db1c85955c4009e00984da66054c2854753e6f88ddf654c603d067bdcebdd99db25c26e0fad02654ecc54a52c940e7dcf699805ffc021027d25920b9683c0eaf7a0e645c3e7527ee36a5ed79e27a2da698a68f800346070b5fb96720832a084792a1c269af85ab168795585db94e863bcbf3e18b7c58b5cb1c6f9f95c7fe63008cb4c58bc6a80c8850220f70e6346e2710f02ae4dfa +0x4da010129dd22d2daf6da3a9c760e3ba8a68ccbed9b59c8525b84ad72ec04be130042794b8c03a573ec41804c9de3eca +76264 +0xb78acb49bd88e0212f862f96ef28e2f5a6c7fa0f715b9f3cd79eb4a0ff6eafad1f73a8e93803aff2014263bf208ec128a01a39a9a0d80763489dc06302802b27e683535e7575daf08b16903e8f7d44abedb7db5bc6b19f3be657d941f6fea1f5f2fff530dea50923b54ade9ca3bc168573e607ad4bac0ecc971625c143b1b81d2d32b5e5da5de39468257460c315ddbe1ceee5289792fc1e4420cf6b516119a97e63bc07d063104a8af07b12594e425fcf199e53122a133ad6bffdc788d56ca0ccd9311e2a80394d04f41a3bcc30ec6f74ad5ab7253ef8273338d85e51d7580b01dd3db04f7c06a6bf767a62848384f6f2f340da369456ed45d687b7122d85f104b70847a71f1e5ca2c1c20fe90fb1fd33337946aff6d395f2e0325a34a09c5abdafb96a9a312a77941c1bca639b1c8a1eb52c83f62a1725249d03d020f8454f140d79a29079d1007fcead1c5af16ca89bc0821775f8cba8c25620a03dfd27d6f1186f75f1c0bcfe4a209f8c36d74a5c929da38c922a9723b454b152f277ebfa3c19c46d25ce9279dd5a1aa35f165eb0eb95b66ab78622a0e2dcdf6fa92d38c0dd589f12946bfc7a20c445e73d764fab8eeee4374bd615263439d17ec9e8b732bc1d29eba75fa207fba549e238bec65564f0547db6e017be92b1b107ba701057c2b08980c4712b2b56474d1cb9b86ab753e52fc35f6dd16fe48ea492e38dea37d558e859556b40eb19f07a1c262ae4d844139c92b044eb411216d4a8ae07eddbde5f6effc01388512ce9f86ae9dddbc120c3c471102f0c3c049269d082a5c24ac60b42f96f32ac64777aee8e6899f878cd3ecee8e7f4dc69a2498b93c730118c73a58dcfc88f532ce2ea84100d25e30735c9e37f9e5c05cfd5856078e67181aacf74760a35f426b25683e4793f4b43753eaf2bbf9b2f2c76838c1307452dbbabc1c226311c27ccfdb98b335165d1c0cbd236cd2f4735fc6795a8cac84d2f679730d5c5cce7f1ee15f54b9c1ee9800310d8a8f2580a351aa9f41ead44663e2c7706f77a63fd1a3403f00b456a3220b44c384bc1c04df931448639e602f921b2522a6d6d7fc66a45ce941356bca8797b88da6863f17647e74135409a8a6ca1a2308482c7a7aaa9ca7ec7aaf89db352fecba646ff73efe8e4a7e87af4652986a419fc7db064119e6a1c73195294bb75e81d842fbecc1ea4d17e8730191a96985f167aa54f3d6312ceaf7fa98e2928a8df865c69c8866d4256cff9ab34311d9e7c2ee644cdba08cd9e3fd39fd1e462b48b0f163d4428438c1aa128306b332562a26a28a05163699781d55746464ed16196bf9af35a3b0748c6fcfb0ae6a715aa7ad0280104c1ec381f77f3e512eede76a59fd0d33446233f01e85a7fce15573fac6bcfb10e5bfa7721308fc3604cefbd63b5a025f7d1fe39746e2dd94b0552e9df4003f796b9fc1d2f05132956f16efc750bf330ce6500fec7955c5e84006e6fbb59ad1ac46458f2f000675f1c64c1fc86a9af3ddf899155a166d057a28d139beabdb663c1e378be0d2873addb2d52853c95be9452c51907aae76f0bcc35a9331174041ab5bec2492d85205bbbd5875f3fd9067d50a100dd8b2222c42b7f9800db878187c87ea05bf92054b0e3e3ca51387d714001a6ae9cec1fd2c8e7f349caedfd13f120aa79bb1900f8f57cdf8224cf87e6248c5b8c0f74e5656127192259f2dea4a2e8cab432342df573ad5216a0ab014c72194800fdcc7cc5d4137a8c7490321be04667bb88f2b0316f9fc3f08d75f28d73d2f6732d9cecd86cd59df0e56f0260f46208f585fd90963479ba77b3d463906cddec4e688b3d8870920ab47238555b266535caf0fad50b0964bf13da715b3da862b2f7764178bb27754a42e49334f4bd7776a29394887735885b2cc9f3e27c6e8ad1d81f67a55bdaa3e4000227a61303bf54e53471b0c4010c152a49030035057cd0572ba5ca4fd2476058969db3a03e6656fb9c3955d9b51976762249be50b66137de61a2f17f548747b1669c6383b793054d93957f9e99d605761c6c23b5c9618fd48a0721d3ab8b20723ccdbfa4b66fe741e12d37fbf46c4a93fe15384d86a35fa16e7b63331e7c7305ded8ceeb822286404da884d81002cd3592eb04fe34502facd5a7be87f482c9d11464994165d36ab3a0ae6f1d33c117c59e978fb11d8f885f87323ab776c4a83ea819268ca5ab1900a2e9ffb2a6d1afa9ebc0e14f8789f0214bc5dfabec6b9bb460a17fb68bd11d911bfe3c7fb1591d4b410f03bebb66f15beb08b64c9e9e279b06a1aca55f6dfeccd3982e6d9b81ea12682cfce8014d13732da2c680d386d65b60c4b34369a9421b925dde62ae739d6527bed4b3a066ddd2da3c1730d44b2f5c37af9e76f0ab73e51ff553473054beae476d9309e2dad7e0ba7db245ea14ba07520d75283e9b1891430995056a4fd55491e342d10dd18905940e9ea55b0900c27b843e4099a2ba89c641ad82a4896bbfcac5e9f36a727caa3196e33a6f5488f678bc03a64ae8e0347044a2a8262d0756bdbe8e5641e637355abe8aea701ada0c125fcb42999412fa08bb7c5e3761328331743be4da554210d52e9a9fa4867f6a11129ffccdced943584d448b204d73aeed8ff7847ce626a16a8d1b4055bdfe7a3d7f86bc30c0bb7726a301192a1b523dbab8cb1e71c16a52e38416b5c9eadfa35e4e886a088f42fe3b64bbef9af057996097bd9bff0f968a07ba91e64833ab4c3b27adee9e66f6415f397af5bbf70b2aa7d3d8e16ff833b09dd897bb1cc0e9df9db0fe303a6b5ea659ca4713d455f558571421d909a3c82e6e852d1c8cba21c34c94821824c60296f3be29312c359e8c3704a26b1439dd6b426a5df1df49dc601079418fa3a06a7af3be29370cbd8c2c10496280dae1facfe02e2e225e94a01eb108447b00211fb822714e0dbc1549a2aa8b69fea1c4a8c2127aa99751c4f865f6e892c68470a8ba4880a09c84665d54cd73c0cfb2096eac9ef6d4380000699da8c1335674b68de62d9227caacd84eac41a86ed955d9d5f54d49b9eeb2717d2e8f3d30151b1a57a69850ec807b92a610cdd37b06d15c6405e71c609fb03fbb80730290e9c0c58d615361f6a73abdecea3b9cf03c70b9a3453416cf344391abfb1cb85bbcaadeb77e246f4d253280a9a151aad46578191a1bfce01096b18fd60852089a75228e5d67d41ffae4a804649dd8a62f6832a352f006212bab4263c30ddc9a54fc70fd08832b1b04cae770a5469737092de680d22d1b82265d4032fa7483159139dc523f3af00b73c136edf50458066b9cdcd7223803ab0b93f12704a30f215914aeb68bf4ed9650b0dca3da3fe1bb5c9d5bd1cb7b8643e2359f6768044867b5752d507319e865a27e22b9de5ffbfde518ac96545c6bf3b12a901daefdf58fac44a2497f11aa207115505889cc6e740df5184d45457c62825c0c6f5ff8e041476955c83745fb6ec55caea762ee02c9dc1ce51f279d7f385cb25d85025ccf248dcc8ef6241ba2f7a73b83cff12e7fa45a755b3380cc3d1f4814ca881f918be0865595facdfc69641e9a19f7bef2acac90e9c4b2db3a7ebd4c6a9aa03fffdc1e3aedb1fdba51165d3361b64852a3528a855e66c3bd4f0aba739c16f4e90e8986b27a2c2774807289ed78a3ea34aa39e641bd8b8fb073a8bfc29386ada5265cbff5e54c9f82f3459154c82804ec6d2966cdef793d3b0e2274433532f2fbaf1b720b175a8e6c10571c70378cbe0356eab530db78f6e7883e80fd6b61ec74118f46fdf79d1bbb416fd34aae194100cc43797268d2e23a49c58cf81e5cc397b480e4d26c5f6ff6ed575ee91615b56b36fe5b9c80cd28beb97e3f3d346c9eec00b6f39260e6b1a57bd5645555c942cdfee102b50ab3f1fb403342d397d7a5fc5ef81c45ba7c0a5155b28d97557d0eac8bb517c5edca647847aa3cc22de5024e340f07f46267a281e2b583b6fc794493454141d5135baabd34acd613e0e0da6bebc45ba73fefa0bd8aa8ebba34040a07944f29eb63adea527101b8cd960e58d9ecddc0643b5e2d8db55170ace4678892e0a57612c50a4dc0647189f839b9a1229e22e0353dfa707acb7ab893f4ebe8bb910cd14f21b8fb8e77c4f19db027e0cd685d60212e0d920b34e96b774bd54f0a0f4ce2ac5f001b4411c19ac2e3a03b63b454eb30f4ddbac959673260d370e708c32d5030682ad56a99322972ba6eda6be9d0276b78b3113aa0bbb5577303d83c1377c4e3227e538979dd49b21dd8e66d6e99bcd9a2d6bfe872af9b6313d54a2f68f1e5ce7644ba28188aa08cf42587f2ad7753835b90eb5b38098c8d9b2f64672b655cf84cc335d0de03d607279ee4810d32946f8927bd19589232dcf4594e6ec299d06a8d44e908330f942b9e8b26a2f69126a715e45eac3c123258049b31cc9755ea2a1f0f01587f758201423474ddd05eb233e80ff69c4a513709b43d350710635242ec6ca3482afe4790f9e0f7bb045fdf19e9f0ac6fec16e7f8ed8681a9978aafb9dba3f8619c728be1acd8d7c3f85d5663ffcea9af892aea2c95c03e3a9391a998d3fb272a3e99f8fa44653b7e151fbe1914f315e38856e9ad953193406c41e9e6bebd582c763a34e5a7cd4b72c36fc0410fa5179453608c84d621a945896217ab8332b5edad1fe7aabf5831296b1304e5d72dd74951107ab83fdaa7d054bcdbf00a9f63f74c0eba4f7250122b73d4310c56d37e8aea305c51b7a3b66a3416dbbc3b4f8dd2b9d054deaafb19fe457aefbf73de34e08686d95828c3fe999139c217fe8959045e2d5f5e4ea36b2c47cde805169820d18ddc9ad47983a6e8d4ee36093b94ef17a2ec80d8468e333de395c1e627476be767f846cd922bd7dc63fbdf9bdab97893ecd761537a0497b78099256a8f343caa7da2864b5b03b8ffa72867d4c3401cfea6b4aad7d24fbf2485a2ba9a34a7bca135a40257bc5272d8083f73bdde7102e2374c036d36b6d40b5c78287dffe71354f8c561f89d622cefef06ae5c149353c60767121b8e80fef56ce3181bd83e684b2fcc4c37e6790fcdc247bdbb4bf036337ecd82ebc2f664691dab327da8f2e30f40826a1a7fe043f9eac84be26cced4b00445f9e5ba602fefd7971daa554cae2795af64ac50dfeffbd052fed7607655c501981f105e06860f027082aac994ee1b941be1f241bd3b5cdbac7ea40d30e0fadd8e9e74972f925206fe0886ea12ce74a78d8af63bc450a372a074515d449dd800ef1b194b247b3f4c095845a20e74b935ce07bf243a5658fff488e437f9b5e6d2834108632e685f3a5919efd8cf0872a6a7ff55e6687404e9716167829850acbc12b548c893813839b5f48d749eb32761dd1ac16796d32e98dfa8e1286995b3246322e1609bf054b2e791265dc39c61d03b010a910c9b5e7406045b10b4ad82733f2edc1590da3b0bb597c27d86eda75a885c384a11f31ce5ad1edc22c1c0a2126e8140ceb86a73aee8af69bb2ecb82678bd2547cee03f1539e9d6c46d7f59967b8c415735dc58601488024ff0560795f0d0c640eecf464269f2a13644074f1dce59f63ebc516fc6e9cb3fa3151d414abd6b273e851eefec6796dda64426631d8bcb9332038835b5baeeff43a5b4fdbb1ae6b86f26518459bf40dc82e26f3e2c306bb8cf900342d3244dd19006bf857da5ddfa714729bc30ed7b3e6ab34428b048b4c775e6452f95a2724716cc9f70f8eaab7dd36be9f0085ec063bc1b37cb4051315fb37ab05483b1f6d0466bc758b365f9b3140924b8369f9afcf59edc8e62d66be206c1e74a13df360dbd78d9a54384232a91a36c7d423c755aa5c284fa7e44beeeee605c88cc86da4fda5858df1fe1c2550acf23c7b191ea1d5b0ad3882928c4d6e8ba828914453e272baea77eaeeb41b2bdf0ed200b5c53b573fc4acfc9fef84a7444ebd39196ec143fc047fc872d4bd4499d1b0ec5e86ca38efb4d39f743d3ba1fa40af0baf86ea77551dce12f142b3a2c385ffc77b27f680aac7d4f2773d196593c725906f630416ac7b8b50d3c7a44d4670e617767169385743d87d11b9c7faf929474ebfccb829e867df0b7f2b394e08da8e66b62cc868de7106c9aa77ed6812ae3ecf088aaeb6f329f2c95f3619acf30d1e3ba320be162799875dab4132b8c8a0329bb3668dc8b409eb15dab0ec6fee50bf1fa514f14c190382c17add3ef101454a382625fe64134ff27458605ca0e0ea999924d209119ef6207e8113ba1ba7e7af30cb92a894f8423170410f0f45b324d3318820af6e9dbc891b27ad4e3fa1cc890b0974345f4b2bcd90fe85ad694e46966f39c78b69ff9be420d371a164d73cff4f479249cef452f15cf58adf11999809dca08f440daadc5916ef295c9231813986efb590e7dcffc35d8fe64d477c6155ff233f825f87c61284e29b26d197e2603768a5b0b4e97a6b1a34609e12dfeba1602ba1ef697ea334f21490a82af1a69ceb1a2a523d040a121c4dc27a7baa7c1688217b313278b9eae8edcf8aa4271614296d0c1e8916f9e0e940d28b88c55ddcfe6b96f0c25b525aefd5227348217af179c912bba0058dfc0b7759764318d61a4a73bad52211b4ac8e344f0b1dc81a5a639606d28abb0f8f0a581ee6b48c2ef8f59fae87598027094e721ffb2b023d78703cae0a4f1ec6c06c4deb81e207af9f86593caf6f92f599b6f75aeb7ab82c732723d20cf818fcb8bbbd86efd5729f3785082af56d2d64834e2bc88213d3307211b33c808d90f79e7e10b8d995b647e77b1341005a3bbef09e773069fd398f9db455b30c146d019b3ead49e72bb9efd8efe449793ea349072f415c4840d4911d9a6ffe5b979960d782fe01c09e65df3269e20a07214d4ef188f212c6e58a801a4b6be6131dfb5c79d26aa80df6a15e1c71754c530c2114d531f31b8bf245a2bb4eaf33ddaf7b3faab65905753b54b5be9005d6050607e5dcb3ab3f4072ec41292aa5ad6054014f91b733e1a176682d414dfa71c418e7072d9581458d6a67a38c6ab31b451475d6575c610438afc40ccd31bde53849a9c3f25fdff719e49e100b93434733f7bf1a232e4936e3ec509a89c3b4fa0aa13561509a2c1b8de779d2ce2fbcf7d306c8641eb4543f4a37f4219e8b4877e228732971cdcf7a907ce030fec586f4cd4876fb6f76eae6149798e73411e12667e74c637d8032dccbaabb71c3de0906c8c6b22940fc74f4ea15243571dee8cd42e5a6569b3bbc09e579f2de4401acf46c866534b6cf583273b780538079c3351b2a6b4bf487d5c887f16dbfaab6da8862927565fb76006558879589876adc2698bf818ab0ebe5e2591b145c1c86f88852f2cc043779d258408d491faf3a9a6864abd25bf6f0542002fed0fcc3f76fbde3ac5059916138d2d4d0855c1f7064c225f64406ee1c8b482ba287e8c793a7efbecaebab32b4999abc58328a0094a4fd84a9c1d2c2faf0227b1022694fe208e68b53844442fd5d799f2d36ef792ec1e128cb3009970fec789b4f8ac5836bfb69f150026ae8c1eb3725587bd3b3c72336ba6478f198e5e8103267a5448cb6e64298c84f664c8aad9cf7e0e780d5e632c4e17d83d2ea034ab3e9615d30924b323729c3528097df0a6fbdcd643d08145653461c38f6b8f17b29684499cfbcb348114c4af3fff1496a7a1e27d95174d8f7aa904c7fa42838e43a5618416b33758e97a8631a2d814f3583c3f72d0540ba7d9268124023625fecae5ce63c4a1f196e93e619af507079d45354454aa1954250d3767863bc8feefa4c21b574b4a7274fcbad719ab1e54fadb27817176d9af9d8356185d1b7d76d78dd4e8dd0f3f3289909a675c398095a2968d7777cb078667d80d241705c6165cd298a76384e2ca4b313792c134c0421b03c1a6c61b45612a87b70b529f2565e61f87e79940c7a2107b1cd9e7017fd2cabf7e9feaebf5d83bfefe4e8e5c3ddde9c12d19dcc760429fcad4ad4c33f1c048061eb364b1ab4432ca4d5e28a151f6fe63f2cebc9d4f343face99d5f50d8b309942c91b210d85da5562ecac01314498a7463769716e6ef869db62a9ecc96f385c622bb616dff5cea4f1d14d335f73e247f09921ad8b9eceb29d4c5992bbf3a53389b70d13da2ea97f182bcd07e7d4d32e05fb1b6674ab4f3bdc00ecce2b3cfe857e182b014458f250a0a235641090f5c44d045e8272bc036d5f266a876075cbba0af415c6669a327e52df8c3423cfd0728f5df2ebcbf971b0f065dca7a3c4953af5f4d54c881df071f48ada5e68b8ea9e95addf87c78b216d556549153c51e26c07bf7179f209b4914e4b28ca2774cdb2259d2d40b09a9b0a57cfb9b973453dba07fef437eb8507462ac87d60a82a011408d5e5fccc4d68f1be4b347b8fc82b8bbf58636dbcb96ff84eace10832030c2e06fc0fa565cd0f885280c343da013648f576c803aece760f839d5caa0f277866e6bab122c1421839db176df99a19e55772ff2ae007eca4f39143f72e85bdcd2672b9d55b28d30c6b20b73b851838c021fe9c92ee0f3a800c4048b97cddee91d5709e8238e4a87185ea0933cf9c84500e60f5071410e192c35851ab7c5fe14edaa914c1a13cead2f101b560c06e281c8762b1913a5009627ea009d31752bf8b9fe5c1997e77c1b4162d62c73ed54aadf2ca78384818d879a6e1153b3300afd18beb4d12b7de54a15c36b872321b1389b861f40527b0795ea4e320ebb9afdaa70685613434b9cc202be361688586aa3a42efcbffbd601299de6ed0e992a867957879a508de5050baebfd02b11d5f3748f73ca52ff370ccb3be4acd3fa4337f234990c0959bea09f5044c4656e4ede4393e0f2b9bb227ce33ab3ec0f5d9974adae2925be354d01f5cdf98d25ec17ad7978132044de0cf41a10d145111181eef41a9471dfbf24bb974e2a951d19b4c38e9276bd94d66ae4c864b92279d480e97e10777afe45ba1ffc7764769b75cac30b8988352a12d0c1868cf81eba053b0694065e9b8a6791a1adc0439c219ebe2e78b3b4216531c33ccd200a84423204c8ee82966e14a3200323bf24805fe303684ea7a6fce6b1a6a914946d1db2d972a2d61bdb6d2d770996e6da93cda6f13f02f5dbcd421ef11f88f5709c257c6a0916f3187a132551a2ff7f992dde8737c57126d6a37b8e9e826ed83b14462f623cb7ce2f1efa9cd1808f56714f2d81253b452a1ea613a60873cd455a61fa1c6081e7bfc6167e146526c8f4096455154804f1a82a51a505dd6826b56511bbe3d37d3940541d27fc8afa5ed0a829cfc42eb7090970329a2e7bc3fdb0d180061649931f187f8f82e5b1afa38503fc081e37d5fdc686d58d70624bd4b03649531411482b709eea1940878b29897357987401c63277d496d98c2f342e4be9ea3d7df910c11148b9559d6b2163469cc8eb65fb1c6995f00318c241217cdc82cf2fa43f919252f379b26ceb06e354d6cc9b84a25ce5995fb6c5c3369842fa9784a437732ef1be25a7da3f65a02c2cc7df032095ec490a7a1e6aff8e0d032e7e8735a8226d61cb55c0177589819046d67cccfa246f0651e59662e796045fd0ce634e66cbb185031a5f04afc53fc23b89225341fc49901808db681c0cf29b9a0d957903ddbfcdedd9d11c6e871f4463567c30c87bf088b58a49c4fd517c58d2929a2fffe6dc9ee41ad2e9126dc47956d4c6dfde321862c2b06e140be1e61a2313ddedbb759c8aae63b0d53be7a3d39e7aaedaf3ad1590c831a4dfd85ce45203f7fd3ce6e87413853b177b5b635205a2bea09cc94b7c952e74aa72e320db82edc56487e2ddf7bc01075345e18f4361fc2728af9fabb2027e0feb97bcbc503f48e2a0693fb48c06ba6f10cf8ec9fc9b133ac37e072c5a4b2f59c498a5add6f9be064d6b6e1ad56609c8bc728381d1f3806feda2907bd9f1cae8d2006e63d424b576a7e8fe5f386c87aad2c98065880dbc4d2397cbe8b578c9339069578cdc42b7da5c6c5120398cbc9be05f05d3736c2f48f1e7fa117152b2d08c2df17753f64d97d78016dc5d490102618d746a288161e9d4fddb749202003631e8dcb1df91df35b5aea00218240d74c2ef6c781bdffca64943c080ac2949db0e0479cad3b7f54a53629d200e902a79a0ef5ebbc1ea4814cb7459d4041af8458d1b4930d4db283c5d265eb4852ff0677827bb73cf32ecabd7e9f7dd5e6983fc4b97db72577dd0821f64754e3055f7f4b503035e784c42e1fb3f2b0aff978565b604a11dd01296c236c7614b74a49977f41be6ca6188f34da1ce83fb8c27652848dc2a71e32bd3631fb9b33ae69e5d8791dca6462f8b76456822731d688bbbaa90a8d83ce54c2eeb56a5ebaafa95cc9a2acff26016d6346fbac578ef3956f16319d54add7ad5f1d168266b0a154d6f262b502b96dbdbb633264215ff62fb8ef840fbf2b1f86bd4abc0b5c1d6eb07adc22027e258c30e84261702dabc79fc1cb0a277507902603fd0fcde709fd06710e485919734810126bf299227a4e2db0352baf1f4911d75abe778fb07d369de3103e837baa87a360674ba7a8d47320aeb24f6d64f789dfea165c1b5f8001bff76b6a484dd23333fbbdd66269c21ec2e2ccde2bed1be287da8c26379b1b46b2d5a6366f37f433060bf5f9920a4b3759750a40af61bc031753a93dac0c55edbfa64909c2e0166f64b7981efe3678a62e8ef4ddc169e3d4d77cf309415b36de2e92dd4a07f143cf97272dac6f9350538956131d2bad973d0e7ef4f3c030c60247c0e9630711803be6843c0badc9db26b1f5ee69b4d4e02606803461ef320e3f5259f5bb8ae9d79b98f64da280812108f0920e272387c67705ab3abc980a157e968489ba58214fd7f6a4e9dbb0632bdf8c55f9c1416d521854268e6d8160e3a85c6a2ec83860f0d748b7971d04160095ce67399dd62f8bf13b1ab8da73db81a3ec326b4df34ec384d656e0d14543a810fef05625aa747aeb01af406d3523f6598e05c9b15194cfc4e7aa4b5d3b912c3a6417d6bf84e525ecf00caf8d91e14ab08a0bcf5c1ada1d80c4db602aaea993f9480543d52d2996dd4e5a8da14dbd8692276b05b716c7b3a1b610a7a06632e537f1e224ce6ee9d5a764c06013325eb1e6ae4ef3280d049b0d0371a9272ad52adba8d502120dcde8307a67b24a086dd39467db2218c639ddaef327ed28c43a6bcdb5066409d27cd962d8770aae9791f5839a3b19f00a0d7f6ad05afb09fa08b0f5609ed21b879fb024c517f1a7a6731d9d8f956016a1288b2be0315c3495e7ff3bf1c5d4b0f2dd735d8b6fee9dffba56c98e1280f4533308d86dd5970f5d816287afa2f330dddf2cf770a889f8680fa5efdeda00f0e8d6ff59bd6e3404197be0c1e35eb6030e4de2d9bdea4a20aa1a14f8c814687427b877961823bc7a938081d1d520a6914dce9eebb95cba7e8d82aaca94e941e7d9827876c81cb6d991364e9fcd114942640a6715ae276078d8f06f4e8a8011b1c6db0be41482aa88dc454e1313592a7f19aa453fe272c477550b6c6cf102633ab66c36c5437d20f13c568a16ee1fceae365640519e666fe4ca7ca80d1396bce971dd03029e34a17b7811088ea88bbf3981b561332a2be82500ea2b173665a628bed57a836dd0b48e5a1dd26587c78486c370afcecee8b7a4bffefe74a396a85f67fca230f878e292a823f081d4f8a5ffc32e3208d2c665c7ce60280aa2524bf432fb83f18655b2ef2bca68ccd649aa0a4b98f3ca7dec79f8f7b7b1c37ac11550e87a25af608fac0eabbb442cd7e01c112156f9fd19827b9e00aba285750a90db51209150cf4d5855f09d8c8b1de5837b0e0f4d87ecb2f420b2e6023ad95644fd3496cebe19b73f2dc11946d0f18165b0da6bf5523fa26be8d50dd9c9efccb81f5a84e4df86f6e8ffe7d77ce39bdb4c184d14fb44597a685d31cb301aff9574a78c90dc9d6032db312b7e35ac631dbf1b2faf6647846373e78dc50e1551d800ff9065bddfed92a12d53b67a12916c472147e73f42068515eeb3a67ba22cbee58d2ea98f8c773fc159272952006cf36b925e618d1c2807d5da69147fa9da6faabb30055a8e4461c31f717dc55b3dd7b3d63cc858bf32113c1478b72312a112d7f05c2027cc9c1f30e6f75adb0c4c43a755a9c2a9126ccdd102a8396ec5cacff4937ca3fd2ec9a18f1582699dfbe15dd0776df787fd1d611c0dc03f69aa9ccf8a0e5635e59c12106816da511210444db5a54f11fa688ff5a59d8a741aaa613a20c8b37fe6febe944450c7bb4234bc3cde4519b50a3b08b2f51bcc7d8bab5f383f295a28083c1654a92b114f364d9352d4c1918dc05ed1bf93ed4f05c496e0ef6e9915d9533f6279220f7fb4f5440fb61e7f804123ba3245077ddbb2cb542a8a3580aa3ad0edea2a3464db938702799144e9ad793b35726cda32382caacc852f1c46e2f2862ff5906992eb93f56e190acf65e2dc11b8db5b93732d1c69e53b07ac5385aa7eeeccd24801785d466f364a465de512ac2cb33bbaaa832a0e8993396c105b09be10b81a591a499882ef197831387fc415774333d73e02fda39fd4ede5e32bb8507eff8d254328edb2d50bbd195e789a5283d36c7397723e2f0e474d9d35bf5e3b21e95533e5db04dd0952418437983b6d36ab0e151d9b94bbc0347e1e6fdda488e0c09a0b692b840b72362bfd2ba7506d7a1240463845a84e9ce3abf0f74e323ea2ca833635e01644fa01a309a26c805b36522a8d503722f08a9bfa9937daaf655151393bb3c2619188f9d33204b0743e52b1f572cd3aa9a972a593a39548c406d49be4a24a980ef90568e1ffb93bd31eb578c97d1716e5823c499f967b62182813f0aaf4612cc4855794f5f829d5460449eecd3796937f82d1cf46f850ee54d3f69ab6b862442c3c67c638a6bc4675f6f55d2a27b2781fb2177faf537cb51f0f65e02e76b4a9ed261d45d190db5507ffa10b07d6d48f6c18f7a1032e677f22e548093bb7bf23b04b615be93feccca52435418dca629e0fbe597c69127914045c875e0401eb7a1db41c4ea8395971f66f9a47e48dc66eafac26590a861a3b6e7d0a27b2dfa075db6834673508880da3e7b66533a766c7f5e944800e12b2be084fb9ac6cd646dd936f93eeb933e367539472e3a29eac71897d9d399c3ea96379da7d345b70457aecd21f2b5b43d049af7fb7085bfcff33127018ccdc9367f36a263c08a63405148f98c26544bfb9795eaf6b1e8348c6d639ca9c80f7985435823ce07177aaef7323c963e69b2f05c0092c776b450b6b23a594139f15d6d8f36a234fb5f35b695e516eeaf4891c1ce658ffc438c7cc55dffed6646f5dd35cf3c9e3731c44cedc9fc18d3ed8360d66b3f22f39cc3113ecd5ee967739f81946fe488532f0928bb1fc1a3149dac98a4bef80c4bd71ac6998cc1bde34440e3000dc8f0f7677041b4e +0x3e82f9f2941e2e8edbd0942f8db71b923cfd2c62cc80f50e7064385616c954eb05bb71a0e52d5bc73154d24ee01458a2 +77056 +0x693eb5605ae784d0af3cc39327d3467c59b47b9048a89e6837b430d7bfe0a5cd1e3c5d7bd225d5b867c51fa48dd98f8b6db7b80c3d8f967a12f10d82f68f920e3b45296a0f568fa550f9b83ba1147cf0bd478dff0b2cac7473dd1cd771b7570a675e017438011a6012e0779f8b0b7375f06ce2b3d90746200181461d55df5b894b91cde375afdeae5682441a7446dde0ae2e9f6ed0a9ce4465e4719ecd9006538fe575fdf0e7435ac4e808f2844e23faa196ac791899aaa9470e86a0fe51c02fda63e10bce31b12a0319a970e2aaab8b6fabf11cd85f44174d086e6c13aaf1e7d411f9543a1590e8bc1d11dcb7e2df5bc076569e3984025622d90f4a3223014126f9a6225a1c485a96fd267e2a7f26313dfdc449628f4e2d6c895381844559067823cebb56cd41493ac0d29d6408e7d78d4a21637b088f65d421215b30975ffe71955a6857b1e37c4f6efc838c058c1359655735ae782cc601a8601e5ea27cf0ba593371854e97bd7e108c76cbfe7cae49544c0721668f189c26fa1338ec18a5fb773f1e072fc3d26fac69bf497c1f700421ea21fc5a1f234ca4d682e3ff9ce6dbf568b706d9d184c94d7da62d06dd2033d417ca68dc44afba28dcb38a636e7902dd9583a9d6279b34f8af72a0251e887d73bd4b8d7566838dbdf4ed539ef8261937aecb19ac2fdf5ab7e76dc9604a6e8b08c3ec92aced686e68067a663aa1b7c8099ad77de64f18e0910dddd13fc99b049a11f59f0a42260533faa0ecbfd0f2b65d43effe09f10d718f0a0bdf4a03d791328faede16cb85f925b8a80db3efa18c3a905bc49f7c87b3b7c43f1c0a61e9dad7255f7558f14df34629daf0a0658af1a96962f630584e4e1324c1af06499b8691bb4f8c581c459a9f337dbe0d9a768eb0b64ebc42ec2aebab12d8c1c624b33e6839c74c9fb5369737bfdb9e83f62c0b5a5f653f5fa2e3328577cd7ad35bfaa965870fdcb422e89117b63ab989e1760fac4df0a70ee140caab39e801b45438708f8d6f651fcd233145fee337a7c31a42b066361cd8120a5c2542717ff179353aef342f0f691caf1fcb811e3f6504e14d6d9381c5439b098ff978b01b1331b8b08b62960119795302b12532f94c0c93d8ebbd17cad9e5050c31c5edfea1e38b7a6d00ed64b74bd882fdd4698ee343f88a33ca41542258c67ad5106f4f23f9743f9df77c5fcbfa0748b9750926b212d70c4ca4478ba55c1382eb417f3722da3ca7212d8b1bdeeea6fcecf05be842dffa053e317196ea5ab6cc7d3f65de25eeab5c038c62c0778e7d469f2da7fd1a13271e125b079d79b875ff92f4696bb49d88034bfb49751f4456ccd913358dc31727ffcf0850cadbe019c33347d307574f9d47ff6187625d78f739a28c4cbfc352c24f7d22954397386ac26720ead9976cb0cd29a865b0b9902933028035bba42bbfb725901e30352a2fa13667f70afb5c8a40d0b72b87bbf5b46202d539aaed0ce8decd3a33ba3d1d320ba80442c10c87f346fd76210eec0f6070a9749eb4275c036d80081c09387939a6c6e013275056b287b7cd8e6ed346f5020045ac00d982d90b43e22044aea50d1a97e1b264512f91ad06a4bccef9033ac30d30adb78be8326120b08993250b761023f0669f977b565df2e3f157e4acf858da1ee700c6f5d6161e5a9d1f27123b3073f67900a8a3ca41847276311eabf76c6ff5a30410118cd345c8a5103b2226218ed931b00e0db501c33993832f66ffa5d29f29eaf4a41d409ee3e88eeaa3fd8c7c83d7d75123df45b8218f759d47d8ab0d02c1dbf71652043091b0c0bafd891846dab29cf74c0fb46910b431f2b449272808b3ffa3d0f1c804bb43ce3599926ef3c80c288aef0ff6e0ef48dcb5171cc12998467d7f38c233204aeae1e3dde0358b342ba39276a5b425a794a16fd717201a99c47e13b78fee8e24ed214b323a161705583495489a963e1ee0a6a75c03ed02f57329e8b61ea0563394b5f50169b99e25db031dcdb543353e7413e50ea7cfea939ca7859b38f27e5d27c569b036c5287bfc39b16dc06412ee9711b255cd6fd95b861f72cfa58c108ced7b30a966e3beef03feda9081a0db1592c894993b74d7357bba38bb2d1513a72ffdd152c4ba666937791e9ec2a09a9dad5f1542ba87ed09c1a05ec6983690963573d41517f32ad1e2d308ff490b566d30febdb8125021bfa1f86c57ad968e414706c2592635120f4a331d1bde8a186d63cf13630b767d3f63eaebd835de1590addd2185ba29250cb7c2e75b4bc5e7858ef79fac6da209714fa062b0f9b52e6bae227c039b766bae73a8ed255763cb9df8a1e9f9ff7bcc3ead3f5947bec4dfba94fa583a91c5ecdec50cb7e2c90dcc9deaf37ab38aaace8cc4f258054fb23265a58f3f9264beb185f416cefb6a6af36dac15d943d6d61745dddfe85273282f542a09b873db08c18949f0b9d6022347f686308e0faba8b04f402e9096f1cedd6f6a904c45c04c24d40cbf00dd59dfd01ec06c2281d1c8a0943508d939924b449faf4a8170d931e34c85ae2c77364797cea1f01c000fddeffa04954aa31e486cca3f62e25cef6005dbfbe2c40b6202a3ef72e504f32f8fa56bf4fc6b3c5d6c5ed963fef472c9809268b8865003a6b9fd677c7263c4f788cbce4e66c46d166021b563474118313a93da02c058c6c814ab2004c0bfda306d690a5bfade9c13cbbd44876450b7ed360f1b22b865bc90bab70055f7a39da2e9850960e140331a563b70177da9b8c61b0e126098fe4dc85428f1b63e947514a229b2a8427298f4a9a2205abcd581849298a70385ace1368907da6ebd1cca4f405ced7a46fd35696bfa3c99475b7cef42b6c255a9f6e0a4025ba2c69dc2041c6c27a21d14687040444bab1c46c310ced46f4b9c2c64b2d8672c3306060e8b41ce90b9dad63bb343de9e572be296a4ebefcc2a21367ebf9a5f8374761f89c8860da21bf9b1ff6538defa270e425aa20c3cd3482cedcd70b492674d5d11ba21b5d162aec2cf3bede8ef68030c909a71fa628e8b047cd82beca9e0a605032aff94c4da5b7c5877b51bb7efd36ff1db797d0a05dcf30927590c4cf667b41e5fcbed8c110b71743b2498de977f7d8fa7225cdc3f243fbd4363da22b279b38ae3eb86d10fa4e74910a2290d68f07f9285d4617f444931bfb3af1fd41bc24a6e3ec9273cdd0f27027d9794ec6b0cbc22fef7529c1c351138ffa7a209392bc0f2f6cb9a74823579c50b6ba222a7bc7e6599f3f8dad0ce274fb0b22d6a159c5f40955ba62206fd24ba40871b5824e90b86de301be266feba2d4d37869fb6fe6d7da3e012ee724e720ba751c735eb79adab5517835be9ab14f95ea0764f253733d4a6c2a77fcd12a9ddc5326e620356a9fd870ef7ee5ebf7bdc6c54c5226831f96b28682d7e1f30125b2493d78674664aa3fb7e4143cf2138fefebb3bc289d2076ab03c6c927090f5aa4bdacb4a4793d7c539d0270143b993869c3da0d48f04a4fac7a52b64c91a9af5c271125683c3978dca6a72d1c36fd39cce42bb0383ae1943f30b349c31b6486212be745130e0d32135b6ea5a562b426a1d3255f46cb8af6cbfd64de1b14c4919c22bb9e357d1d4a9021a564504d52615107536525209ab9db06f3fdb50c4e3435a1ea8b5ff7edf4eba007f39d555c8c8307326c33e8b5800503cd13316065f0862010a6f30cf3f37e4cf2edfd29370a90395edef3625fdba26a6cd910bfa058f633ba7b9f2ac3a8e08ef29df027866e01341528045bfe1f6ba16f99c38891c01e53447394efd1a78aec838e06eeaf196e8e01f1b70424dda95f21ffda499ee856e54b29a4baa251f5fc2258a1cd25af308db1a6ac194898e3ea3055c5713c1448803af82f29ba4aba245b7861619ea1efd980c153f9edd3b3d92745f5ae0de66baa9089a4ab9de4400b9b57c64a5e6404f81bcc4f24891091b2633b1b4e68d128cae83895bea1d100086e8130c60998084fdf41ee37bec1f5fc60cf86d0f1570877ae9f72d17a73a2a1418f418314a0726737acb191d37a691dcc5dd8e42c0a93275018ec929c6e806cb0cc78fff40fcbd4d17749c17bbc53acf27071e67d4e5160895f33606bf431d148e337ab4c488cff293c17552bda5e107fa1f25659a4bb9996bd17c98dd72f65564e0e0371ed3e6cab659abb5886d0eec06ccac265a04a5924dcea4c5679d19f75777c9709604893d48e54627634649e612b7b9915c3762590192b477a4ee0f632fa03e47744441b3100c4f9295581b5de887578ee70d76584fc6b795dd8b5f00b40245a4ffba9494d777cddd67ca0bb94ee58b0544ae6bf50112b2075b9c9135ae46e96f808f0c4865cdc8f021c5a2620d795fdebc41c99add1dafb5634a2e6ce4132f903fea313782b749b30b7066c0edeada0195ef16aead90b58740bcbd0c1f1221ef84f48acaf6dd560e6cf4e13bb5e1045717dfdc993712cd65381cc67d27ebc67597d49f6788e6fae98e789b3c2f05e6c68c3aa2c2444cfe37958fd126c4452608bfb3f878027b3a2cb7251b2921ff87373a27f1939be650e59d3f6771bec84a9146b91e632a4320bf3023e96c5476f0936acf50730687cb5799540fc5dc1d39f9720d9892c9e7b38a41998d6b901327c0655947ca4bd77875d0f6528ae7ecfb268cd8ee6ba60efb7531af8f909c7e36a870ee5e0133805e288c4bb729a8dc9902db41a9588b6101694a8f7842425e2431d6b61e7e86278556137ec608e4961a74a97150bf3e87cc4cd25ed0e8485bfa45ddd80eaa0c77f6e8afb5079066c286633c906b0a8829640812471dec771ebfcbcf7db7ed8c15b8c7a5180329f507e6b9dec582a031efd2835270e9b5974f7babf2cc9fb0d0acd3d940d1413c580d415dd4381ee901801da7da01bbab709637cd8fee50599ee25008c705492f587d9f376912c64dc0854d5af1231c36c999fa19ed0a5252bf5f363b81dfa46cbdff082fe47b033435a56b86e0fd93be6c03cc7756492b01fbcc8d5ab784d9594f3a852d8c9a5c0629897e12f0b9a8ab1f7ab5cf10d365d019d15e4cb21f7060d5d71d19ab98592b64d98ee6667ce365aba6be0964cf8726e315b0fbb7d6f2e8197dd9db879c820cae3ca4ea8d71cd54d831ee0d9a651a6a1f418b4e11d1e658e1d5bf5b68cf600fcf5ac606acbdede16dc04ec3fabfa50696fcf72d0639d41af687da8298597a9d8edcff220a8bcb7234fee413cc02b06110effd80e0364495203a2f365e61581fb46a5426f001f071f390bae65759c4e355c2a42fe5efbf312696c860010f83fb09abcffaa647e3447321d822e4ea68f42c1cf5235e8dcc56d245ace9ca8c829b5548778674862c557c5744b1bbdd24fc5ea5f6429237f46ceaece3b70100dd6560e854b3a2e6540ad6da0879245b8063b406b175cb16bedb373676b4ee931dc3f2346f67778ee2cd48532c64678c0591f3e72ea54f52b20c81c86cc6d86bc91cd2d4cf8b3ca75e059b6ab659cb973aefe6ef74b868125865904dcdd709b369d7c96f7c083a58511997c6b03f99a4a7e354c78b985b7e394f2b6ba1cec791865e9fad7fc4b6ca4273041021001addd5d604177b2b73c0dc331ccaf1935b2da7181c38dfa9fb24b97aaaef128393684b31bf864c5bf7fdc9772913c40e0db0546d07b5a49e508f3e96510c8ab04f6d915a4dbc070e2e6089851bee2327244215c52acfd78afc335a2fc00e916f951530bb7662b42e610ea3c3b90215c6ea0a73884b2c7f57483794adc09e2fa8ac87afba022059a2d9329f9bcdf8a2d3a531f51e3374a4ec7cc4757919646d43ddec96c1b89d0052dbf206741d77d2369ede24f0aa504e31e00184f993075228706c6e376182b026b2765fb57328aed71d3a86647868860ebb174996f530e740ad2ebe84c5767206a5e732c895b33d9e696da5e36463536b572d4cb809863371db5b0e0fac224ddafb6d08144bbf8874cc9e09d637e9be30fa6c16c895b23ea4441ae742de2d498afd2f67015ff4953f8cf638a3b9a4ce45edfc2e2c625b10c22e94cf8422406efef356daf797fc6ee9f29cbcb4b2398b9278041c4e382ab2b1e2f1503e4203c51f2509e65ebd7c1b5846b81d6fea53fd00e2ac6995dfc72b5ba858f2d6041d55d3da71159e971fa276d074e13e29982d75751e9c681ed983a6c7f13cb5313726035bb6ee1fee8a0d29d7f6928836b022da777f3d31be08c27c89e5b64391f84198f1fff94a8968645ba566b7b4da44e41831fad45788fef1c4345ce8e8eb09ad78e274bf85325fadf380edd92cddfc7c15ebb4ea4241601866117d5b0d0811728d763fc739af17f2d9b1b37f57077ff1bbedd80659b4d93d4968719618b1b999bdf78599cfc93a3af580df319d1f764bf17e8cb106a80f6a5781602173aca929f2ab71bead486d8e2f34997866ef88939ee7f872b1e4aaa677a3718584c1882a13dc28bd3df45af56f170bda1a3d5ed0ac7146d1c03153fa9118cc49b5baffa508d0d51ee695a9779d6f5ae121d29f0a02619b569c57b26c8e269af56d5eb5a0b9cf9e6a0ff2021ca185b115e476f4498802228aad1e6e0754160312137453260e23ab2822d40bed63a136fdc9f00596269b00f45b4e2fd0cc302e2711c5803cef1325e086036ff1cb0b1121390a79f8c473601d0fae9fd1debb44bcce19e5ec44e6341ba347d430c20a6b099d8af9784ad3688b2f07641173016c59b237293df5e5ff5fe168e3b32ee76c3e5b392c1da00340c8252126987148cf8725e9f538ea58af37a82d4381f9eb3b47dddfbbefaf4b115c57c48e6fc2d994cd8ff5f1e30b876b28605f9ca2095b01ac89444df65df303cd2fb8439d4cfce4b45824c44841b95cbc71c6981f4882e5f6c92f8b3b93423da513c4ee2af9f8e7c3e83e176f7237aa7a432addff9ca710ac046a1cc53a81e86b6db2371faf17c482a80b915e874a7cea3e53134aef11a956a1bbaa9c38f92ba8a448c583589fa479fe53db1f6938fa95cb09e3092809d97c0aebdac977ef2fe3204f415edbd9ae3153dd9cbafe494e025013f5432fd7c8a7a6c25653ddae1ba4498e52b8200d0b3110727d3530c79db9373af000ecc39d5edd07c642547d187487cfa19a0f83e2019bda269ae6f81243e6467c484715812a1784d19fc3a34ed942d8d60b90825c2a5edd3ef10826d227c7ff422428149b92bcff20711169e45de27298148b53a133bf426e407d9708ed402cea9b7709141e34415bc028170388cf658fbce83fd8a428d35d912f93da1ebb971cb61c3c1356e8122994eff5d2e17179640b8f8c2a060056b3eb056470419f067f7cfff5c1c33e3932f64e4a7af03176bf096882bedfaf941a57e751f3de5442bbf5087c45ec9f801fed2d60223d752347bf5c6bbdba9d5538dbbda18b7e421379292018c85974ad9882747df351a649a534518d4e1c3261b5826f9d5fa8d14061212d137293238944bc0bea15b32db0817030329a8fd67f3a51e68d98e469931ae418b36a2116dccca3dbefafeb7020817ce2a0c89af1796f5208b95dba72d24d7aca41d98bb36ed73fcad3e982d961505f4e1f01c6eb15fb8cbe68d7b354c6a1ec2a04e65a64060e99c1e0ecffcf3a94215bf96d992c1c8707f1e32e567737bf411f46ba15906e19b8a95ce0eab975f6cbf374339d1c55bacc8773892b43ed4e81934d7c449e6c9fa46890edcc01d81d64fdda7c5a238a3de26a5e10bb21aff7b46d635570f8c94866e8c4392b0e2cb2f460716f57aa81b75180eced8d774662e395ce6d20054cbe050f40ef9248385c840682351c1703d122b367452aae7b3616f2d6ebdc2dbfa689c74b358617c6c41ad654f531d4d8335ce91543182f141b536ec5f82cd8e8abfbf72e3391e39c91c1b831d81f47c884070c400ce161d9bba4f0e1bb996e9173628732133a14836c7e945f066dda9b6c2c032ecb0cab94bb1061745daa5780a6c65e9cfa091243fd5b5227a6a3f41895d1b627a622770bc69fa7c405e8fc7eed2f66b7128746a4eb5fdbd1e049fc09a4010d75c5aa2c07825aab1adcd9c352f0a686ca833b166edf9215a5dee85c3444c1f05f512c3150974855bd0a0715c65632a61c75aeeb6880fde9ebc5077b611b1b472c7231f0aeae728ef7b6fa5ba0c7dcaef60f662e5c77a73feac02fc15ad116fa254f40d0e96fde3c0e0838fba9edab87a079ed45106b9900ebf4e796e60fbaf19211e139c88196484b294b5fa96da71762dccb9a4c05d912368cb762cc7d1015bbdf9c93158da29bf641bbed68f2d84784608693daed715f13ae278dd5c21f4ce7e2fa47963a081c57770e0fad2247004d2ca89a81ca68ceca83c07fc986f07f5f4282bb1431d2b2b5f4ce2c41a5fb280769b9160844c746a23209a1707389976c26bd58561908475ae082abed24fca8f83e3f6f380495b1e4e38b59912ff47a54b63186269bb0c28c62b3f67747536968d4c40cd9b2daf6d9c0cc10f66239125f1c68ae4a5fd40a94a2e874a7b50752a152cf57b3f69ffdc6ee562f65b55e45d77dea368b0c7b09bac9a98d4717204aeae1e9b78d76ebaef698b11ca7cf6dfd02043d88b14aaea645ff7fa91d14a73b8aa9989430ddc6f1b0e46341845a6d212ad6eb0a84c374c97f6bf030f355a30ccad1675765d138ae3bfaf605c3fb6799951e7c26cc1cd55aae36868a8f811ca5f282db66f2fa4acde003f2cf2e5c624d8b0276435000d9421b87c920b9411aee4ae37e2a9f020336e727dd098b25662556aa63c8d91589670e8740583b3da6cf191dd70b368e6cd1988d411aa3fe7c093d3fca1f2f03ecb2ce5e739bdc1cc730a9576e727d498b873a5ea56a3e8daae187e934af1a730a0ba533ea52638786f940baccc53ed86a3e17c19261247dfa957dcf28e0620dec5bd92e2ee39925e912276e786d3fe611df75df8f671c74740d671a2e1ace789988b379c6b8469ffb63a69afad3491986539de024e4ef1a1f318df1cec5275d197c7b393a37329cc1d40466db5e2319d380d7ebd940651903ea367d91493563751d799913ca24c5454e8bfba275978f00506b2837e34616281eabe6fe0fc033b455f5bfd8d8e5c28eb78181d7826b2313aaa0c0c5355abc97b635539e7d9074de0b36d311c93e3aa4f92f1f03ec687c1675bfdb0b9f69b0579b1aecf7fc6ccffc2785fe4604f4d590faddfead1b5643109b10a092873a9d70b3a2db93f51eec15902a6700f3d23c59a4d3465d77fd1f0a03db38e1569629ebe81745face6c7231306d38c6fd9f1707dd581e9b6824b90b9568cb817545fccf21bf55b2f11f0a58ee9596218a220da38fb5aef05695b81b39fe80f84a0fbf2446e43045c4ff5b93b2ecab980224c733a1331fe3a916c542d7e77fd03fbc1af23ecc013bb1d30ee964b89fb3ce6dedc2fb1899fdc97088895769f190bb13b442f3bfee1a1e65ca63ed429afa54c5265585ac43c41e6ba8f7a1cdfec126dd361b4c071f6c757b380833d2c3f6fdf41af6273946c211cece959e5bcdeae7e2478631ebbdb81ddeffe01fb0422e31c172acc905ca7f0863a16a345a879368ea908a8ab2f0877e56c8f39923402a59f6d6805359f6826cf0ca7e4c14534510bdb92f3fa5df6000aa3b4a8a74e573db59ed78ad7df253a63ef0d9cfcf5a864722697d390cb3cb0ba4ffecd8ec589021b3609fbfb9e77a1c15bc84a3d4c3e175e3487d5e2f9350070abde16dd1c20991cbd6fa7255fd7f383cd686b26bb7db02c6ff369755a8785ca51c322f6b4a67956bf893ac985beb617de5e7e2db5efe579436b0cdc71aca723dc5e60804193194596e7156cc2a46fe9e91af1d6edfd1da1494f4e6ce10cfb29a5f05dfe256eff65edf9c59379116796884e74a6a63dcf410c209ccb0b20d828393989b4e2a2a2242f41d9b21b9e539a36397511811a80d4e68f765b5290e4bc109a52690bd6882cd54fb06d4c93aa617d9c51ac012bc8e982dc79b279d5a761d683767f036347dc7a73e8197ea9e288b8c7b8caa8da0ddb4b980544c3577695c595346b6bd137bf797eff3b1449827c924c0911dabdd646ab52a7a6e1aef8e498303ab297c8fe426ca14466bfeb00b974a9d106394fa8a84c9cef4d3744a4cab8f4e7e92982f211ce8b8610d416e3cbea618f2c26f7fb6c89c73aac36a0e0a49243da7393c7b98a19ae02cdf345b2306df3c1d8364f55200d721848824c532ecebd60f668efcb27d88968f2800fe26369d0e7aed9de3c5f221e06a69cbf62b5c8b239c61b639d77759e17232ccdfae188a98f14a3fd1776723b944ad872a5d61ad2c3771ddbb7059b5cabd43c18724724ce16be07547d02685b3fa9d7fe830c3f9f8c9e02b08e3e9465758a4077dee0d8bf1cef965ce38f9eed77481dcb80c49168f38f4c7aa9af0b1922b9dc54976b1f0d104db37ed17a6062c9ba1c52259bdadf96ef6da29fb35a1831f75237422252288f3ce142dd5f676ba554463af7fe5653e512d8b0b7082bc311a764a855c33ca1e851c2415dab1e6898bb3dee6e689e767cbe303da609daaa405e662048ba1909ca00b8e2d8e9ffda226375d50f673db7cc35e691d334f14e4c90e927a16381b092ee57bfd5a87640c0c160873186ae78320e8e65d5060a2fa4c36036e67c0146d16f0120ea433c3cf279808d9b235b686ccc7a2212198fbed78a6dd68e50122d040757ce7d569c1f45d07850a2e9dee8cae43c4f10dbfc8c534a547f0f8c3ee3b94bbe01056f2068198a9a68df26a389eaea675557c9cb08a677c698f08cd20b5fa0c67128e963b81bfc894e968643bc3b436dcd6d6f85c45fb746ccc7de85f475aae3874e41c08f9baaa77a9f652a003a83d22fb849b73fed7d37830c0dc53f89cea7dbec24e14f37197765206fe0e6672016e4dec4d9ebbe3e1b4423771a5d0a8085b798ff20876ccd9b96eff2e2ef5fbcbe95377d6858607e8498a4b6efdd76650fc2cb2d18b8bb3b7698449aba8b729e2ba958dfdcf662b2e5f90649d0216bf0a885f95b346390e78ae1d4c3d23b5e5900b9b978b256437fc1cddebc45d94997d269a9f60e088c565afc06fab47f5181b01eefb492e86139aabf846acb659def2ff66389f0280c0c695f51dbfbd81a8ccc61523fc93d6a8503269df1db36e74b13b4ac839542ae7e38745bb3f2d617feb8298756ffb5cdc66dab91ddfffda450201cfb7f77d8d2303ae36b2f43e9b83c05c005b690f1f9823ca6f67b940a5372d797b6e9f26b15a6f32526aa699399e927dd33cb17727c5d12b1327741fd83479cdd953f9f69f75703a214b1de642b7ab0d9c8010da7c49b6242dc4d8437a2330226ecfcf965e5d4cee2abe20ccbfb55133e08e4ee0270e1ade46a6ad5593eb98a3c44be7adf6f84b77f52979f3b782cd1729d033322ffa4780e535bbfc2c76f975622d0ae47030b7fd0af5ee04320567e2fead86789cf7843393d9cae14bab9dc3d0de00e3d3ecd6a7f28b48a7392666bce88d115976ec181fd7faa1abfb72cbb397c791512714f29e34514e83d2cd14cc6ed89a7ec6c04c6b3900090341b3ca6d3e4f85d7758f510a58b1ca4108e2b73b18f7ea8f945d68404153ca912756e31a4ddda31cc4473b12e6128288e04d98306e50c933e6aab4c5785bacfcb4445ee24cdbb4c91c23fade67dc400164f6ffd4f94cff12c68f7723658077edf06383ecc4b08085850bd5976376ca549bc6334f405353d53bf4fb81912bf20be49c99613dc4cff908e71365604ae8288da37ec8cbce8e244dc1860882c2e6ff97d8ea683d7f69ccac9ffd6fe8bf642543762667232378a605de61dfc2af1b7011fdbc2a4e4916a77a1cdbde823d05f4c4287456cfbcd9046a34d430d95859075bf458cff78a9d327844f5d9b72c923d189fb0ba57ff79e685a926204d27686c7ca6067ec1aac714b00092890df5d4a748c522be445620f25c26a1d9a8820f467cfa0e5f32115cf62a39fb160efe93db5b8112871d2895d3fa948b8371d3173d64d7b79bd427247fedd579a742b0968159bac7406adda12f64d92d45318149fa3b274a5a2f55e65801be52643073a7404b5a8a0fb4dd0cafa4dfcf486ff46b2509d10fc3c9016c286edace7660b08cc03848a31c818f9efac08cb9b4b3944566d7bd4eff2c957c983c1337055acd0eaa286c5a905c5d1eb9c3ca32b086c9a163acd34f35e077df50744fd338a734f5a623aef693caae5693b28083646efb45c790fb598e6b115df71e78ec38ce4b095b32f6c14c55eb0c319796f5f9f592fa388b1db63257c9bd354075c82d577c12725c2c01e4847a093a79f3ce97a3f6885ea621ac482c09c9b4e42eaf3ecb2ed792aa38ff83dfc4155761815665ff8fb7e3e8ef84f970384719118beb93b0c821642202034fef31f7305627d78c91c64f6c5a6f866cadbd000fd074c35591b4b890cf7355733b2a796c60cd9734e10117a4028af9ca6a02bc3c28d17eacf35964bdb6713c154c1561b3875bdf8378a9d830ea26273a306e4248218a65bf601fed93e1e5025ea85b78afd4baf7a4dd275abb1a2c56e586695cdcc387c0b75f6e1abc57b8ed75d96586064ed027bd98e165eb9885cff2f45bd0a017b1d7bb79aeb4dd20d04682679a5360fe86b7f73241c1686e17da8a02ac673b24eef1f4344783a1451754afd861a666eac5ee7932ae35dba4ccbed539c5e956f227578a1ba24fadcd746122b62449bf1c73166c20908bec408bc5fa200c1e988a4552a4b325e0acc0ceb303884a02149c7975f7854e89424c3b352240eaceaaf32e286a8639fe44260f937bd73b9a0d70c05343e752f886cfc657741fc8c03335cc21051b47701d081e49b22a5ed951a22ffa77d1039f5fd2137319470cbddc5905879dfab5ffe06de31dcf091d86893aadb1bcc8c948765c0ad13840208d4d66c3a059acec73355e4657fafcdf6b5c3e24bf3a560cb9727593b8fa906af82d64edb662b85594c3e22f3e5d8c0d4e73b87b6d180234bbfd25967287c154c6245c6b0fe0a657293301861b1d400df875af9a037f54a916bc75fb45065b44bedc5525f3faff59fc2cc3333665a148310b2c69c996d5d492596caa7a9fe4a4a9fa5702acd849c5d357311ed75b3626c0dd36cf06860c1bf77c138c587ce6db4f296aed81a30f02775c5230462787106f92d5b7047682e70ccc708729c2e851780f97cbb983d678b0e22f4fcaf21c6c04d31106098fbda19af28e84339c736eec54e5859d9f288f4591ce64ade47ea34847f3a55ef847af6995726cc0300e9a72a15d0375208caf001339583524341e0397827c4bdaa87b415e262516a6413dd49e052d892d8b40a70d7811abdbc644fd6ac773175d666beaf5b1997d2794bfd8f2e7eb20efacaa032a91795730bd7cfd69c8730ca80be92b011bae3fdb908847450b26838e7755dc0f8e77804c9f30cd3c8f6270e41f5cce2b6c4ea3e9bc00e84177c4fb3174aafa6776f26f56f7c7338a242a8c38282c991aad60f079a090858c35afce002c0f24d852d46d774aa9f8fb8db1a8cdb0c05576e6cc6fb5c59ee4ce4dcd442426ed240a2904c0d7223de438d4e10ccb3e82cae91d7a68c3b294ce +0x66e646adbcf608c86139c62ce5c1cb76112fc0aa7c3f83ac24d3e6f7c5c7e1a1b6db310df87f8f9a0f84c4e5658c6fd3 +77848 +0x6bce5b07be558a6ee9f68910678bd641d0a2dc8d08dbc844b7929837fabe74bc591942f8f882755d119f2571a1c665d1621ed176fa01663872a59790e9fc9ca28ad80e7bbb53b197976e91a69ff8508facb2beb629b0aa7b7e02f803cf94f43ae753e6186f91e72464abf237c8e93e8397a5cbd3fcb03b14c5f1e415154f238b58d2f3587c04be0d5f9e73ad8360d8b409412257ddc8c30e2eba835021f5d29dc69c5cc24b74df596f8e398f3a27c62aebcce8ca33c2e76ea0a4fc3b5c4ea87917fa4adf42a9f1107ec56f655404afed268f48b26564513e05f8785e2e214e263534e535ca6a9d3b73893bb839c03b06a0d26899dd77a98644ff1e4200386bac0692544e4c818be03523c50e5023137c43dd700602c2964c45fe176e3859a814745bc0b22eb4620aaedb36f203f4df57f6f789823c0fc19af0408a6a404dad6566d950e7dacccabec5f8b6e9b9fd469fa069db94f324d2772d0ca0bf7edc21a7c3522d77b6916d0662c46c7ddb04f15d2b7c8dc48fca70ece4a980f45ccdade3750f7eea2ccaf0e96d858135cfd288997e75c79a78c943fffd60549140eaf82063586cc6a241fe70cf841d99fe2fb259819fb39f17e9f4ba6079411f94f9ab6675751f9582bc3da16e096632d0e217a71c41765ad2f22b25f53c7125bfc36dbd93adbede33045586335b8787aeb5608a37a23b5312ab8f47a5f00c2b2910e72ea549722a1de1ef2706c4a621fe6e350bba0b281340ddc92856df39b93aa8c0c093916200a81ab38ad08aec8629d63d308dc46521c25081d0f14f21585a52a17c45cdb7e83c7948b977f6804098b5210399151b0502cc5e485f89ec8ff1d83268a445986a41c457bce5508ad7b2d3898cc44672486619089786d5c1e767001a8f96412e0f1fc4879900e034d1def71bd2f79e917158fe28c5507ac8e7249302f60408a05e3e41815ab2eda4b886eb82dd1b66a1083f4566dba4c22b17905891a7d7e317e00703ec07e2c10213117564b516e7c99683b469e069f30fff141970a9f51abb1be0d171a678a2776be75e6a63d26632a28b14dadc89569e28169c460448f5b3993274b8415bd92b47706d3bee352e03b4c12c60d7eb33001900aabcc0b7bb28e266b568df75ae452f136c805e298665548cc6a4da77d25d5a380b7ae629b6417ce25a2989ad68edab3b21e0bb95b5800b54a84dec157adc742887277e882c27f1102ba546eb514d444d56040e60047b60829b0416ad75a5ee36e66b8ebb6601c957f2811e17af8a81b2d1935f74bb7fdc7c67715f2709e150cceff020aaacf88a1e7568191acbcfebd25b36b4b822b305abd43bcf6b7fb823516b5b3b3d4634becf7d0040daed420815bb95171480406677aa0b6e621f51ed2d2357e85c7bdcecd1d2f19a405d0b63e4bb578f701f4d8449b08845f230d539c7dc8a2eef94199d8c3ce42f34625381a5212424b44503e987af5b5b04fc6b8c89619c15ded91258688381089f4542ecc2b6a6dfc93b8a1c9b702bb881c93c70da7936a51192f0a5cd6e6f2c674fff2ba14282c7954909a5ebb8a1654fe0706c22eb00e77007da0c23c757a376c5b3c6ac8d63e501b6a80de152656958892e09ca80a1e2e480f916d254e076b2f28545495eef3ff5cc91dae3051ecc820b9ecd3800c29e5344744a42deb3ac051d9e31e27ecee05ad1e9975b987497b7b0e942d5330a24a79c7431db2c774d568d2512deb6a9cd160edbc9b0d411d1debe37f009e0227bc6d021510608d5628c8b436ea5cc280f13cb8cfa4a819a82df7eaf5e3dd1b1ab9a28a235293875f2915f20cf9f88f2af375027b19167bab2a2387a14d7cc60bd09eb2062ae85fe054c51e3bc34b4b0b56ce4d277ed4d176a0e34bf9a419ad7b8fd63c262fbb719a3a5a9b5becc16092799d0b5d3c6fc59b10db9a779e103bda45dd6b1bb7a966dd584aebd5ccf78a60fa65dfa4d843d299087105a3821ceba8a118d14f891e9a3a2d1a9241ea5a02e747ad0c66d8fd62f0e6282ff5f68c5787100d0149eaa7a621374e2118cb6564a5fff7444bc4f8f12338755bf761dae9c6114e7d9372c0f532f56a1ad2f6a64a2d71c9099c12d327a07ded1c106aa52d16234198a4b7f711dfe5d2e1f8e2a91dde4b96bf0048f8511934f402e967679bd7d48af50600b68698872d090315ca4a48ebf4e6f0ede527cdec3e82dafe9ea08b939f1520037bcdfd67ed128a16a669ede14813e66835f66f02013e7d86b6f5b1fed27b9b26d3426ef67770e65ba9f74dba14c8694e47475d25007839964ce5eb54d99acff1599e7db170b6b05b616cd8e4ef76f216b5b518b390c2a7a3cd0b885418f546d95b3c9a374d4660ac49552fd04c920947fdba323c56c04045b3d1197b250d886564a754e681c28fb4ee2ab32a90bc27587bb13a3db6d38be2add13f1862561d2c02692e4da29d960bbc67f3526067c4dedc448126259ef310f78649da75617d83c0ec96eb1459fc27309760c64ff77a318beeb78447650e373d5aca3fb2b212030ccc2f2d7b6a5a7de7339c14a41daff7071a3de680d845ebfbd94096ceba8320526247b33c4119a64cc705cbf13cee95da4194bb665b22a59f8c3d9e1e0d39724e5980eadb90c206ddbc3e3adbc7bea4721f5c716c803cdab4ee31b4150cbd6f3d1c5b52ddbbdc36169d860fb85088996aede5a707c9fd11b8799d57684b777dcb154779b744d0aa83e5ada91b69e4fb2147c0daccaadbe136a8f1167c4c002464eec5ddfcae37daa22ef5a579764c3041a78e7b2fa551afac06dd6fc580e009971366de225a8a5cfdd3fe7356f836df28a7af06a54c16f3851da2d1d87c8f93ce0d9b18acfc4098036f389138822d5e52b2931bd20164435e57f1cb29a177399647e31c00f5e3223f7b348d9286a8446c42eb191a57f22584404aea3d922f817c4cdf46d2c9ea622e6262d6f9883017b1e3079d02c22900b3510e8d88c120f1eca6d02776fadefe3ccf53fbd2094d4ee01d88f60fd2716b6824bd43afb0e41163c0763c820b395d070c887ab07c5860534cefd2b60b73cbff15f79af6e3f1467e342204687d71e4f9c450b2297409e2a81b9cb179dfa8b8f4bf1df202ccc127a87c73fdbeb4214ca1617d508162aa4c4ae42ff0efb178a8e57ac0f767edec3b5f03dcb6e961cfea8a7e4ed47cdae203b8410a3f7c336c224df351097ac9dae81e54dc9e6ce8c6551175559c504f19bf6cbccbeb93e81b9baa937ea6dfe305b472f9f432ddcbad02d2e11236c031e9d5f4b1d593eb11ef9b67f58a6dfbbc0526d96da402a08cfc7a4b4c15322115bacddcbac7b6d67350a8227404bd42d741c5de2a7c9c599f3d21e700cefd177d052d815202c2ea7ef72846998e1369a75407ddbade5e6d94d7a032b9b01607ea716b8ef227469b873bb260f0871ec4bea463749959c750e0646bbad1590b76b0580e6225a5c06e3ea6ccfdf3701de88fcb7f2f306f65a8145bfaebe23a5be891419c8766febee707c0ee6a3ce9cf499d31915a2a9fc7d7a336b44266d475d1ffc68c7b20a2a07a75028d521744716c596f70a1e26b5c740f8d4e6ac9a7e7c74e5f64ca0d21f3acf8f420322d20c2c556ed6382f242a1e1dbb82fa1a525203d1f649bd0670d4703260e5d86d90f21e918240079d4b616c57a4fcea363fccda7e57eb83ad8b518f16ec97bccc5501d4c1fbbcdf2f44649737ddca1cc907f3e9c33164075dcc9c80c45be31705c942362d00d328aeb73b88058b74fa9a52d019e8ac3ab0dddabf2c84d44e51e195bc2d1dba0b4ae34bec2809d982ea73c9695034eff7e5f75fc27a9e7f62d22861789fd850efad93a9815e8bed7d561a13c877f02322107100ab515985a603a2d47c76a7eb04ba89790111d2efeda558d9f577656f44981467849bfe0ea24a1697d298d2b3d4d78c62752b2708583ff5c3f636d8fce4e5a83c553fd541df104e5282efa1cfe66d630ce493d25f488cb978d59e94f18a5ff52624252647e4be10ac92615b68c2e5d72056311b1e44f46ca19a96e077bf6ec2cefb35394839ba254d0cd84aa5f1a5b046d4ed496ad5dfd5e54b0503b6097ad9dce157556b676e55def73bb4affa17b62564afa66e81b5bdedf2d546d5f3eb00f7df73c4d8f54067075c72e2ad65a2b066115f784fd3deec6196edf1fd022900c7fb71ccb86b9a256f42641cc8bbad68b0e0e5083850c22ae840354c55c09ca1f53f39b63352e355bfb1fbaa2882a2a4acdb299e4f82c93f2af7959e06b4acaa29b3b3ca703183c09eb21ed3f445e82d02091482bcf05cf2d0c3f5313766c2e50a5ec84f9890e22eb54bb5e05589e7cb59728cfba822e10c82ac3d4b115f441841485e8fd2f76867ac86a91972d80745591f7a523ba1c256e7bb5535bc269c0c76795ed047ef7d322a6be0c674b9b065ab17c7d09cf46595a8f725375f43308950fab15b1eff8958d701432f82b54af1f76259baf4a334946c699698223f6a5777d23d7880b0f4a25c50ba9cc5533db2e4091a5b6a37951adc178ea22ea1b13d9409ec6e958926d561602e54641bf1701b13f1fa2737f2eea00bf69babf16c044fa8a587841287bc8d3a85a08895cff34488c5de522bb2d95f4db7ccc1b805744fb54f0976d3801e89e5a9c8594a3d0206718050149b3da3c1e3b77d967ce3553d3bd43d925577c2fc698014fec1a46709d509989510fb1470d7e0f655c86e6fc03f1b6b011fd5718fcff4cba0826de8f6bc48fefc1254f31131197e24210e8a81cb0cdbeab903f3ea1eec376616fe4e752e25ca7227b00a4ff7495e2b112b6d27e68fd476ac6710b45e4f9e7904c1602d3488431ed9771fcf335adf941f2de15b998ca0cd7f6b909697074900d41ce8c7d559b229af11fb3cec334784d47caec5ebeb8516ba763a37d2fb80240f79acea1a805fba31e6663c2bbcde25b6809c0ce494cc7ae6efd74017138b0d3c3f763f09e592fae85e2877f7ddee9f4fa272d98c70bc208a402f586c37b1e2e3d60c6ead7193105be20897587ebd1a2748fad3ec659f302ed00a28db4f3bcc8ca6361e0b0aa92513d8cf41568794bdc4dcfaa30b5cbbd45a0730576b4371f2c017bef72d991e6196aa451ffae0bbb0b0c43bf0f13e5a32974d698e24fb9b7d06916ba31a0738eb6ebe32d94b727a1c736a8563a7f1c2726c0a7c750f600194e77c04c7da3a40ec227e5e17512319299334a0a4345f3bbd62a632b33358eb60ea40520e761c7d8b3b51918015dcdffe9a8c535aa06e0f3b008953f199cca00897451d1df59439f1409e92bc9e8616c410d9672df4088413ce1ca7d647a569b576f32c9f5f89ba45b9cf2a74f50704a27b82a5c73714e46e54c5f50b47c98e8f10b3493abce54ab02f4b21502049f1c165f1d2cd717a75731bed0737a12257bdeceb3a96158f2f5a297a3ff729322748558db9eaaa22804baafda3035b970b689205c85c716fb16a2fc44b1217aced60d4be21c4ebf44c1d895b92177f0ff4b78b67bb34d96d1a09c9910f48f39e8a3169ecd1033bd8231241719b1a147458d35e7bdbc55471b05e80495142c4ef47e29c7f9250a3b64b5259a688b523ad80e393a7f0b8ea63bd92db54daa792896c9cf5df2c532a760d045961208fb3a2b410b355c1b4a32b87cc631a722066534186fd7567b3d800b150c90c2a51cc3b3c8245ec176288b157359e04e05547350dc93ba70b18b53c7f5f320e6fa276605f60d1d4ba6aa0de74f51678eeed3d171a8c37dedf2cca12bf591ccfb72bbaf966d2df747273f498283353df629150e1aef87a83ac941e6bb8660db7c9939fee9902f83607258ac8b917dba205e8897b12358bfc3afbb92db3ac8f2e6f832e274015a381402a6c5770ca38279f9befce8e6af2b35107a442f856299c6fa36e8ca33669bee627a22b9574f2d8f8518ac069bf380eb960e690cf8a6469929a67060a8bd153c1c7322e703c8f1cd7b3633aed5de47739af87018070c6fda011217bbc3c63a999af2646484b995a06688125606c7e559b9c907c5232d9c061afa5d50272a728368a855d67c998fc4b19ed670b138f10a5ce08e88ff5251b9d1dfafa2455263860fe585a13dd12696f6eadea367b9e1020eef72f7de431741b0228d46a0c6742deb3a62595af91093a0ecb9429cc33bcd3a3663864248534a40738491bc0f2ac795377a635689c4473a24e4f2b2dd67e88965beb8ee0a9c400d43143819850e0f983d4c53a30bc82e4d13f0285c610bd056fe130423e268af7101ba9e2bd084426edc36aee2e772b5344a59580c068e213d5fdefc76682f05063fe638756a242c7394f7d978b58a789a388ef624367537a70b9106681485dd577e358b88ca741a60f7de67e6ee45e4e95f1fa7376937902e91c7b67b7fd394cf1d172bd879ea98915578deb00a5b969c2e69dfd8277bc73e82e19122f2beb7e7cd198dd6e0fe139f6e45a2569221ea4d372c0468f98859414f8d0ae1259dd33beeab2616982537e582c3676d0e3f6c5709a4b97c4803a2e16818985871076335f24a991a280661fe43807245d71aa954068273849b6450995d22dddb7d71e45088763b53e9082e6410fb7783a53a0dcece33a7147c20ced3af1a2ffca363d33611cc915683b0f9917b92cba8c1142621b136d8ae62df9a2ade8d233e7b53bc311eac3f946087501103f50327e34f7ee7601a9ca4d7d72ef95bfa3c136dd81bec1f93aa8007f1de6d2a809283543264aa5b4d47ba53de19e9b7cfff0e03575eb1852146bbf286d1005fc41e3dcc6393c4f34d7e315f2ad756629cd090d468014bffc3b8aab8cce465244dfac9945978d1c8a9b4ac6263e3d9fcdf554e4960bff5dff954deb32a9526187cbcb9449a805b6bd07fadf60fcbded715e198eaf7c759b640cfba8a264fad9cded88f759d46bc2d5023a89294fbff91cf2a033193c3e213287de09656907621e2d2ae7fe8389ebdb7651ec089f096ad69830f95ab4229671ed3c37021e40a68373fb8ebf1d25d6d64a882f855465e9a738130bfc4be9a22a285e5901ed6f4a03a74114240a082ece66277b28d6991e98bb8f8f87685aee641f8c98eb3d5af9a7b145a1b5b2fa99ccb276f77a8d6db0b007edae81753f2227ba0e1c4775ca5976794f5bfb7ec2bfd616bccc02e2ab48f805758f74d95ee67be12b0c9dff871278e7a76d7dd42a4af77a4321483b198d769d6e5be7fc7fe0697c2c90764259cdb5e494fdc31df8df34c6511fd501812834b8223963466cbbf87359d258a6083236565f3456c2f52897e22fed309da9c03a3cd7526f1fec1d31aefaf7ce935be802275139bd29e9cd27b625b5e17559fe8e13d6cd93efc6af1a16572a5d711c98213db03580bc9c76ec2a7a9c71f35b8a3a2367d3571ec318be91b8918fa811e99c82c44f28e2d5caef2778cc677e760b4656d18c4414ab0022086454eba003847adcd7b03c025e713793656d4b7d7129b8925e1fe13946115064a49cf9c2b910c3352f7f4486fd14cc588aa6a65a158d9ac154b5b6f65bf14f8bc0914274fd367f7415e5c9d57b5bb75c2fa0ff7c2adff3cafc754cb1b4482767005a4d1f959eb781d10a52579fedff899c83de4b78c6cc959e882ad317bfe1dfab20a22c4aef7344ab1567743373acc51876cb2fc6eb2c0a8215d9c54dfd83da0b0aca01e4d1b9a5eb2e9094fd94c7faeca14f90ddf61b11ef45dfee1eab184266414c082bee938cd87f561fc7f9570f612df1d6868ea2922f40c6b55171a5fe05ecb0a8e7eb08e1bb2d407d574964ecbd423a69875bc775882d1584b0f634f630347f48df73208cdc63d716752df7794807b1b2a80794a2433455c201e3cc122f414052dc2ce4758347a153eb4d169e4ca5de17b3371101a77f0dd60ddf763a493a7b2da6be5b84f801289a8050cc430f4449016e95457bfe33c52a9c933956c747b94105d28ea282baf454fbdf1e50da0a7bd9a3c938f68e7b062576a71d4ef19280f6c11083b56b9a8bea25a116adf522fb05187bf25ba17d562f62c22a0a0f405bb4a11f44a6f9c877c2c63fbb42a8b251ef96527c937d6140b0298c6972697ccfe36ea8d95e756d4046a66015f73be306fde4f6dd856a50491093afe16f476c66ebf05248c427b06cdd8cad2db5f5dca199cc101d18b272fbb868d09ae7f038a734efc69bbf56ba85ee41cd0a6220c6aa2a144845369ceedd0e709a9dc4ad091a2633abda394bb213e38e69b4e802c8a91885455bc66fec777b73b2f1ecc607482a83aa0b194fc19c233929342de30b27cae7b06aaf7496526838c39e498359b8a6a96b3847a80faa160ab4911b0db6acaa023077dbf312f53b8873adc12b28f2046b9568aa9ec3c424cbb3d399c7f2be1f9d6e8c313388e85e2b6a253e089b7faa92d0a42c7b0673b542cd038e58e7e7918211b0997e21b437e9510ea760dbe602e6c6f3b485ff3d3138ab28e409bcae6877c2ecfb1a04e0308ad071e47c0faf722e1c5d2b06d7ad0076f54a82229a9b0d4529473f505bf4afd58e55dca4606364347dea7744b5488ac1527150eba837e6b4edc94e684b791e9334c27920f6893fbe8fa38188c29838e46aa636ab0f095c8bb77a0eaafef6e48c69c0a237f8a96b95fa8f3119252470a5e6f01cacf69ad8942e63685e9cf36988d6583f328e4c508167b6704107749bce6e58ea348670c095fb8b44cb4cf8154f23913959e2f956497e21244690112225a9e5888ce6157d57c5fa8b3a378e50a8f77476f41938e5b7e6d73671e7826b73409fdefc401178a235b923f3853c825dfa07df4b5e91659148e08f0a354fe07fda8ed5cbb9ea183df3cff63e5d8b1334d5545ca6d78d3ea04b451559a101e81320bb53437b2ac4f2a644eb63e7026bf63063d64cacb3d8ac980db2a5541feaf5ba2d41aaae58e687f621e9a94d29f26bb23a3386068b9b7dd6404d38763150ee4fec884979fde5c58d6dda5ab488115a04e35d9c0d9ef0daaee7ce582ebf81c687010e6805a029741030a5bc46a82e8cce663ad6e8733d8cc8091c4ea452e5450c73bd4f7ac91a5c2a7232182b10b3cab7c9b47bc093eb5ccbae21620171e433834a7c45ff012044813c69b58b4806da6716b2d5bc84630f60dec4db6da5e657978f3293bccea3f6bd9532dd8dd9918487551b2a05d00c702ea2ed030f75537aee49c982dabb0b38878675d6594aba92bf8cd9c3c2fe4d46de0184201069936430802858814dc0d387161ae91823ebcab6c5d3e81c9790581704727b97090edd063c375dd80e2a8f644d095ef2ed8bf61507f1e13b223c6f82b29d5ccdde2dad1886dedb0885b133c6332a7d0e2e02dc835b1bf54627b953c613ee0ada6f569b0d650518383abe8957d1658d9571b745a9c7396d652f6ecc8c2f4dcfe544f2718de2945d91b6b757bc2ea3d8ae3b14f82e563391c2c1c5a27c0fa3f116e66af5420473f23b800666a052caa4821680bfbc0df1a98265259c3dbad6b996dc24f0d1d38b1f5d20117ea946c43a39896360f8f65cfdd0a3f6847838d06f8dae8a29e557c22c201f42667f1177e2fa1d26a48c185ad5d204a120d492775b23e5036a24990160ab0400e8cbbbcde4ed582f53207bd478b00f8c39facfb5c57e08f67936a031052757b2ca354dad873bc5e7355b28b32f934d209691f771f4c99fcd1fc4743861bba1c2d564cefe140ce9b611e626dd42a344c501421393312a33ef24761e00bc906897d10146aad3874e05b1687d3cf9077ee440b52902c4c94bc450f3a56f60cd379986b3be980cd57b3adb8a36b79be883e31c9144a8f5cf6fb46be4116f949b9330bc233cb0071df8bf58f45835726dd92c5d7f696c0c6427273cf06be79f2206c43af9cbda0b884efaf04deba0c4bf0a25cb26a23650affc858cc0babeca8917bdc9dc70fe623e04556a3ef8dfda059e382d2ff6ee0ad9753623fb06de5df94f83317435045266a236906e85dafc681bcc4d416e7d82091ba2c94a572ea099347e3a6a21d42429b00728869d7972100b48f10510c9006874324655b696da925017ab663c5720aeb72ffb2d45a48324f516e222e6bbcc1e0a4c61c32afe550b2bb44e0f8f738d1e3f16d10c874378cc629de841f83b2d52655ae33dbc4e572d4bbfe90e2111b5a0ce2472ca6a3e9932d945ca0a4c326d2d0bc2956a736e291f3a9e450afb1ade5deec1a510f67d2e7be2765224ec86d2d686ee3cf35747130a80bb2aac2374517c2655338634e87fd205984638e021a5755e44a37f70bf5c16a37c609ca3095626fe48e5d32b68d45dcb136fed2ee92d34192e91b7c7bf4e6a2d4bae8183bf3483ff0281a0e4e37444bb5095ece0c8b4394112cd4263302f2fa68fdd04c98035bab0eccf946542a8b05eb580ddfea580ac5d5a20ca4cf8488c94afb5cc7f339ff49a6c9958b86eb8c93aabf7668e67dab6f66d52f48b01e1aa8115fe82acc0bb5843eba593e54eecb6d99bc4329af80a7f93b32b6a273142b1f42880cd590ed10f35d2bceef2c98ba0c3ebade7293f582ebc9473d42872b2c8765003568d072940f887a611e9c9dfae7e057b2e44240cebfa78f1d997ab7b178ef54ec450920a1412742ba3d1352e09944ff6aef28f6de0d3c76e227bc4e3c7c47f2ac0aa97beb30dff134db3f4c1d88d33e5103b68c432d1e9b257dca43300a0575ff2a4ff8b44719225b696f0e044ef1711fb2797590c7c47851fc235b2e9abe3b50145b0baefc4942a868210d37544654318bf0574945b47af22365eaaab6c8cf496969392de906deb67803ce1921384410f0a985df2f652f7093f07616d6bbae3589d905d365c842dff965c53c3e5dcd38710395b4fd5d1267ce618205831d64bf064906122b143bbf6cf59713241d5c328dad1b8d3812a0422327a2f944546f405f379e8c816115cf530198304afd7d89b6f46baa581c759a42b13d6482f74a640503538501356d7a4c385d164b74ad988d882aaee5d0eeda9d9cc5d9d78c6294985aa99e3307bf5aa8f85a378e2968f961b6bd0d59e6988da458e0bbaa7a644c79ac255a9f6e67eb09c024068b723c26e42eb7383cb3ff1df763f2ac7447bc1629563b3c9ec003a5df3e2f15dbf5a39b854e9dc1f6cf7f15f74c800eed8ad66c38077fa6b9b31f05a9b0ffe7f80a1be1b5a4c54d209fb50034812d655eaa4fc9262e573b989e26a4e9c6faff58461173f5bfe21c42bb2d672f904f32402c74a76449566d840796ee2ffec4be853030dcd5fe68b1c59844a548f85a184a8801a182d6f1af34860c5becb6d1c7f73ed686d6fecdc031cd97653137f269d65373220255bd93027fd378908d968e36e89f0c691f85aa0fb1920158cd9cb96c0525b353541e9b767ba8bebbe1a783bcc3e6d81cff24f1c7eac1142027bd897423a5dff630993b18ffe8b8ef61794b01373a64531c2019e2dfb11837d4d95ca71570028b99b1f462830fd17b8b8046acd9264bbbe51b94f916ce88006364955d8110c553fdfd59db9baaa310ae50f9081026f8b7e85be5631685de0a4213e60fcd14830fcbefddfca035a82f686fe4ab82b8f5c79475adc9558394b60f3ba1467fd7d61f81ede33e473d4b2838319c2f9758cd6b880d30946a2446b41950698a0ff73903be9c1c28e72e26ab9c4a81dcc482da242167204cbb046e54fef6a152f3df264ce05eeb450684a52a132f386b90c3b681ff37ff6ace8076492e92db39d21c285b85cad30b2bdd51142b3422349297fcf58fd420672b44e8e136c99997011aa9c01d4465e3dd94b50a530dc1c0307be80f41e025da47be50bd95ef4f033777451b2570067782574b6d0920a9a700ec323fb3d0922caa49284eca987df6bbae64bd1cc2573eb0718eccdbf14c516a7555f76419d7e6d991ea155339a8fa242c933691afba91fe8fe99a4a142c47f383bdc6c14079914c151091be675285f77e4b07f2bcb329b31ef665b1fdbc0332b3e43e59d8f9a4784f26546a85fd12bc1016b1de6dc36e748b3fafc2029e0b8e6263ce9c47caa8e4acb5cdf63a2b28d88e60b4a3378dc8c9712ff8e8e724d98d3bb6e817118f0727ba297ecfe84f40d345c390ffae54c1184d41a1a50ff2e5b58c482b48ca9957a7f40bd78614ebf332d2b9d73236caffe79c0f5a74e18ac87df0b1f8bfd78c02fbf6d778874473a88db1bde7e97552ddcdd9f383d7005efa6cf56ee0caccd9a17a1f06d261fb98e93a7f4a5383ce8ed3218398be49e0d1e3f906e974182f04bbc8e9346594aeae2dcf77d99aafb6d1888925694a5c07961db8a1bc1326528faa6ef1cab2add235fec347f63dbbd2bd567b2befe87be91e201252414e63ebecf5b2a54439fc0ac2d4ac7c3aad3686b4d55e2386f93809dc639c9533a65f6faf365a903b7c3dbcd737e160e179be575a7dc8a8e8fd0eee5380cde6ed8b773248e4cd2f1ae9b16ce5a118b2b523a1d910c8410860846f1b15e00cc3e99e59f84c7960fe5d1315af6098a8de002b8f707a4d4dde97ffd6f48609ffb8b22f56162c7cdc7a9c88c8d8fa87183f7cf1e5a1e9654597e9ffe51f36771d31d1ef2a005b67861033ab499df614fd7366373301f0b8cec0f0d5080fa9bfdbdbb33e146b6bb2047bccfb2642f5aabf06663bf60522a05ff6274fbe3a523cb1f2f09cc3abdfe4ce09c308dd8c6bb0d364f7a0ad2ff1c46f8417a08613b2763623f49ba6462a884946a054ddceeadfd11b84e5d6e6e08d74172c77ee406d14eefb49bb4acede151cbf0f5fb57ed5804e96a87bf1ce7174140bd0465534c47132d55a6c1faa5d039edf4a99d330ce3a9262ece39c4b1710b5fecd9c59556b13a83ec13e936d39ec6623fc93e5793767530cacbd24e153dbd05c5eda7946c384b5b3f893448bf72809399fce3abca3bef70062592a25ba4e09912e91237d604cf1c18b1ab18b175eee6c9ea9617f8579f4cac8481a8cbcdfb8599740f66db3c4e2d3d33558ff1cf98c4993c5e8367f50d2d8292a849ace096302337a509c4084ef876b63b93c6a70696cf9a44d75d3bc27c52f40e6b4807390277dadc09d99159e48de2630d7a25c1c234ab4efb2351459fe255bbf7e5686d635f04bc4c62fff6594861d7e6537350b2901886d701601e00fa5bb8d6cc2bb9bba15d4ebba77aaebf71d89f049ab63bccab88f4543e90d60564ae0cee4579a672068e993ef029077fcef2c15196190b7a4ca49f582408f418e7f7bf29977abbf0563fa5be84348bff285547b491c147233d148fccf9f100a04adeda6e0c55809e59177b21acc4c2a846a93814d1d9772e447fcc9906728205560a64a4ea337de2d6bf2251b00133e2f2979d5b9f8723052a8e5fa593b403aed32465b57a3b3b2597dfa234d8126616f2c67d7043f3d40fb6e84fdae8df0b0589d3e688049641d0621e04b46b1fe3aa0fe0e03b054711b4b235a41f4c1a20713fc0ed05d06b174900244fb8b3523308118acfa42da8635ce41f665b098dcc5abf93851425e346fa399a8b27f6d1dd96c06e50930240516f164c9e7865619628cff3b39d4d265549d428c1eb7dc469bee4346ef0cd3763550e64545da9be0644388881888e5bcca09b75f8eb90545fe744842ea3d6b5217795108ef21ccba514c1fbf6bd31aa3466542a380f77a84878a9049a9465e1143b72f8561f08b1fa0134f41a257d3c1303c8ee893f79eaacdbdb5fb9acc2e3c30a6fc3b3ccb3978e74581af6a6bc39f4dfbf6af463df3f +0x1a8b75dd663038289a4fbd07a51bd53c4b6073a3f0a9b9f91350ebdf095b89281398fe773f755df77956b1a57379507d +78640 +0xa1a05f1a7861889d2fb94d2b30f710ad8d75136944cbe0d7c243e8afa58d6a47c6b4961c7751f3ae09fffe92920e14c2ec7c913701203aba4629d8f786c726d3e128edff14a66ecdfb3f00435445fa6fc556d3f9218f88ffe7fd3e1c0b5429caf9e4acebd8c8c2a20b619c67fe038c5b1fed21d82a7f944daaa76249bd9d3bd517d01b074920b7d4434d1a2618af902e0228c3fca658244d990f8ca42208239c42d4827cf114140cabebc2a72bb3cf9277ef008c1c8101a6bb1e0455c4feabc682d82871580da3f14a24db13be76112d842a22b11564f30118ba11852be899fcdfc4560f04742a2c28deaf915a601da734c16f921868c106b9ccfd5cdd2cb6e56280547e7faf72644d02844a86d9bda98c9d3058adf5355ca53d0e016434ca2a12f46ae551284342c279a366ca49b7db96a4ac2a5c7315ace4f38d9d48669d72f809e06c0045646e8e29540cae18d4e459bf2d31ae4a2a9d7fd8c2570f2cf6661aa5fd3d16709f8fb9fcdf64bbaedc6dddd7f9942ae33cd87dd3f45843ed9fad82b10a7d1b10ba4d4cd98b977874971d2bd2597c59a41304e6cb6cc76b105ef038164f57958c7e524ea7a1cd6ed0cd9d4a9a9511c1f676cac3aa73cd10fffcd742ba14f10e4eb343c750692d232b45944215f57aec422ed21b574f92b9214109aa87a1730dbd21cbbfbb2be021eec8ab1c2dc1e062ee04c3f6ba483deedef42f78643d061b418f903fd02f0ef07f1e8adfc9406aa964bd465cbba8f7389edff0b23832d2bf42c73a4e77bcdd16480fd893d0bb414b0a24025642b5e71dc9c8f562edc6fe81288f72f5981c781daf633d402c7a8cd04a00a0eb37b93627c778e68f6a42b2e95cb0e03b1b95058d1ee163efc4c574be8b18c72482fa0bde01b76a4297ee188044f22b28e870adecfc52efa880e4219f343520070bc18fc9dd4c29825c1155cd491cfbc4e8f597c4b17e8c71481ebafaaf1f529fbb55e970c401cc57a1f49458d3f8fa18016bec9ca52de05404bd6858639e06f17800425b1f9cfbc94ee0fbaa4b4cce2b1c1cd3fd402793589c075240b87ae4072b08c21354e65de14b1bb24a17e11f05224e756eea334e85f845a13a167a93e8bdb6901fcda79ba680ede2c0a17f96aff94af9770b1bb9e401be7ccee568bc9c1452d507f0a75c21d6a0b39550edda308b5888a00ba57b7c9dbc0c858d0a062c1a24b85427ad4958337b4c508bf59490bebf4a72529a3c56b58578e676281a9fb573628dd9830a5581c5d679bc5d6cd87cc9667448c1a6783262e97a098c9ffdcf89fb3a6def4620a6c778994aee090facbc052f55e45fecfa9b87c7acfd3e4e4facaae34dbaa5bf8cc95b379d70143d36e14e29e2c90fbaf7787957c8429f9b1d259711e0acd13c1912a6db1dab346a01806aec55395fe80f41e8b2c62469eb213ceb4b8e8c6f9e37ec820d3267129ff7e1800018fcf6802c3dfb5e0c6b45474338ce1abf242aeecd9d1756446b56e4ff4bb9eb91da7e8935b5dbe504dfdab66b636705db3aa733c26e8c3dbb80a73f01083d372a9b9c0c12f1afcf1547d1408103df944a97917500a70a4bff6eadbae65e336b4a06fa10ab39a0a2a66dd1ed6d615d4f75038ebd6e90b80678fd115c9496c31058e5409de8d5d6e8211783c617c50abfc2454612f471bff88ef47b2df4f717adbefe16bbb10c7828ed0e8ed267760e6b9a27637c7a9146a9aa1d9236eecb54cae3192273ee28afeb721a9c1a46be90db666f8a03e83976a0323eff7e6b58a5f02f000fcc876fa2b8180252a49ae3b8988ce665b026b1776590206a0d51e830a50a7a83cf642a7a1747905a7a4d2eaf2976549c8a1d4170802a8b79ec8ac11d74dc4e26836da05e90678a5ca445e79d168a81d799b331897a6a47d722fc2b95e20d45a2f08b1b77ace0b9ff286c56aae83234bde6d1c8ecd9b71b2ab79170c07905279c1ea4e1ecf21ae5ec10a8c3fc26d537f678604fbe2878d01bb42fd7c5c02dbcbf16a13be6eb7ed6cb64e375be58da502b58460e2aec172e5120c0a7cc3febcbb0df6b718d1d7253432a04b51607ab48048c6d4d55affbfd75032b29ff7fa81e1a81e8cb08125f26fc6cf3cb2cbaafe6281ebb546af88c052e6658a58407cd7ba30502918052ae159f3198ff29f94ef440151a6a8f50320e25502f62835fc0abf372a00a1c63c5e9d482db98354cf038f37a71d9ec3e55df01c998aa2510eb76b3d0aa7f05cf0e694266a4e0773cfd7cea54a7e7ab4a5d416bd97bc391a1b5a38b270738621eef5f92e5db1d1850dd86ccaba6ddf1fcb2fc0b89c0f6f09a85fc2280a17d5cd6d2916b0768983f11f91e42885503e9ddbcd888e04f8b6a84c54721e25f961b811ec976d533991505b70ef4f29ca0b874e49d8be610ca26e6dc4d2f5629cac6a63bcd5b562468c2b6801d89f163fd89499012bba4ecfb4d4832d6f5e3e76386ce9165c192244c6dacbd12aa8d926382e52900c121c96506322faa1b9181a78280885b5092198f3f6dd4b6fecf1218cbcf182f446691517a2d3b904868e0dfe3448876b15ded775f832fd12ebec9648d8fc467ed792a07d1c0be512471ea52d0a2f97d8cfb864df576342be162a091f0ae947064647ecf327420b558b3884a722343398875ce582bcc4d8bc0c47fe61bb3f211502f73f1c5d0c9848c36a30df04ece724ed2abe2270fe1ba72eb4faa3726451459e0f3b4b45c2186670321e473ac02ef861a073111c65781a0dff6266b90f43f2881e56224a091839221ec1723c3487ad756c98e127a19a6f2a95ea2e078695b651930413f257f42b598eaee271e06d9e98dd94152b28ef10f506d65bd660b2fb8b1be9a2d72548c777105b1a842a5d565c71f92f8f61e2ca0dc0db92be24285c75076b4160f792980b323a7cdb98e36f30c82c92cce311d4c5625e4527576233dfe40d9218554e179662e19bf0a28c43a65ed2d18c32f8ebcc59d2f59a60fd2c0c3044f765b4f7c0a930d4fa5bdda47e3d94507e15c814598315de269fe755af8a8aa5f3e19d1c1da41a891a85a0e869571739fb2228d0a87a34c45a90411838fb41b51a14841799278e727f06a2b4af9345f3db19cbca7312154a0424049152af03d6dc66f096cd940b258a475995bb72af129065276e23fb65c3a5b3a86d77462f9fbd616906258a2f16eed01bf81765b12aadacc248559674d5c1d7b319212143842f8c53e23b7a58caff2980784ded0a80a55932c56263e0d4eb08ab00eaf0ee08b55057b769d526b64dcc1d82b98909c8f9e2ef81e4f4285583bef6d13f156da1e145daf25b2af77d4d2059a3f4ca3d782de25eea47b7b9dc2e633ce6980f60f435f5642f69fc79649fdeab689a112402b3c0178b253f23ed3dbdd3dd705f666425b769db20c9fb10984fa92ce40e4bed1e148fd0e7fae4ed43f752127285cc66232482621a041b15d90bd97d9d1213bbdf485e581a6b7b60d3d83e21f903219ec0c51460a04b47c8d49ba2d71fbd19e389e3d97d370165fc6fa90e888e6804628101b6536e000fce1d679bd5d66fdcf8807fa7dcc87d23047a1239a29d14c355e672dec6edb2e17a16082ad66bbadb5f55643fe3490f310d758c562ccfaa0ced6380f41789d44b7140e5e6754a2e73ac9b4a182d23682e9c047fda7370883f9d7ac4ace1ccf4dc383099451efc2b5454a489b716f1e86a2489853d233a4fe9eabeb65fa24194e233678acd5fec41ebfc23bb934d3f30723b8704f49887617a5981ce82c562251bf75842e5a4b4f2b8e77b48331c65b0e5458fa7a75fe25d8f6e7685bce7c935d7f8855a3489c0ce29bb2dc82d110fea11d6f5b5bbe5d5a4979e0f647475c137b4bb6129306baa34dcebada3d7c7886cb6647be7b8d6cbc7117caef34ffbf4bb20b49e484fe6dbb740fd9d73c9bc898911726496048f4f458b6ef7aa85e6ce20aa787f200977cfc5d4755fb0894c6dffd1855249459bda9063f95c02dcc2d818b07b9658e39b110125c776d28d13b0016511c789f268f84849b05e84ab1c8d03e132664b74cd29c9b38875624b8eea6e4aac26d0719322dd9b0871b887506762ab418180138a84bfec1cddd85b3a977700c912a56986d4b0d6862816d80af1c57d0d5a8f666fbc245e1902bd229321bc15dcfd8130d0a8629aae041833a8b69ce50a63d1e3c93ac787f1a679382523bdf87c59ec7dfcf88335d4784520c6106961dd3ff002337af9d83b1ba5125d17fd370bba5f97685f6366be071615cfb9ab71da4152484b173bed49e4c927c778ea402f814313af47b37bbf33138931fce3a3a61a812c5c7a1e25c2944e1ee0c115a23c614f893e3bd4035c8eb5f1a964a265b51df535042e1120299cbc3e357affebd6bcdd4e91b6458c1a6c85f5728b58368bde36e8be9da55ae3808c2c3211197b7306650a465198847d7f0beb49cb85a48eddbebe08635b3484c2465f732de2df95d08f12c8784d7afa18a0798bcfab2e529f053b6df9934b91e4634e552bfc96b3ada41e9494c4de14dbebf6b4e249326b94a2c74beafe1e7f697b8f6495c71f50f05c7447519f2c622b670941bdd05f3e4100184e91fc1bb1c3f7892de5c307f23b00ba3d195cf446a97a17debce1134f46b574d2890dc1dd765fd22db680bf1bf04966f2766eb446b8cdb8d869ebed12f82b83745ab3bf67031cd0c06270c332b29ef113d344eaf6fbaa52cb3f615b3de7eabaa0617e52c2fcc72ba27423a2daf469eefdba8016bbc4c87c23c7e1cc04886b90e357ce2a95c5e749208609dc893832c73cb690b629a6809b7e7dddde1b7c368cb98843b533f0e59fe702a3eea1e092004d420747a5337b4747dbc60ff715c4349f8d5f7142005ab652647247c99000209bd75459d2ee00f5fc5c2ab00bf7acff11c171ed3466bf12ff36057674c905bec4f0f85b2728ba3e18998c8cee9459629cef3b978fa67b4c39f1de0917fdfb11452973ca16862f6638fe5bf4f37e41f5ad410cfea84217b8bf225c6e47a188fe98eb47252588a924ba052966df180f2edf71868132cc2ceeeb421114784617ad3ca0f30ac892eff028487570e5e409848ffb08cda3a723554acb8caa1e7e2fc3ad0507d994574c3f1032b0a1cc74d98d5b4824427f5583925a393f8dce9c59c86661e6201d284687fe5e6b57e74ce7afbde3697e2a69d61ca615aa3dfd32fe31f5521e6ca79877613f162621cadecc72144748ef4956836a9aeb4d392ed4a576e640211dd82a57317f04418debacf06b1afe330430ae23f2b524991dd7e3e82d95d69eb223505e9f2ab37e0ace29ebf12e72b85b84d3304b814c2e4a8d033ecc906fd7d81dad05f0ce7e1c16e6f827aacb4f5953ba5820db9bdc7d5db29501ba72967cee3b82d5ecd6feac30ca7a2c0e7dee969b55cf7e39415ff6b5ed2bd99d98c4fe62e18456d9d0afbee6ed327182b2cae080cb8bc0db3e413ae1913a3eec9f85bce4c424014e47fbc4b7d3a380be067ed7a2a02f6137cf2aaa6f5332aa0dd34368d237e45db0a97d4e11f26fe206e574dc8f581d07e59076d5cd87c79397f0a862b9d147c4b771aecb83ddda0df3dc477f9577f70d4b1ea04d7ac34b9411640f4b1a14b0eeb93d0abd9c0a847d0b57612153742fea0ec64161f57a4113e0a9f2726166d2343c780ba4b8ecf1b7c3f34c7257c13a367713d4b3dc314aabac2efc892e6c0e2dc79f4c016919a436a41c83e2f103a86b3aa3d4d38d6cbab3ca8f87efef88d743d13f26643af51e82225f81e3edaffd10bfe2bc1187a133d4d2381f271341b01eefb4354d9d23b312d518d0f57c2aaa9f8d5d152e6963288749b54cbf382b4b0789baf31e0e1a147122f4fbb84b082380198f5a6a91171b3397837b28cca9ea96259fda561c4cb51592505c7cc8cd0a6aead606569d518e72423f34f45f42215349ff75a626301788b9d79de383edc1b877dda382ec96f4bbe02504925e8881c77d463f5eea68be42ffe71a6ceafeebe15702bc701d5be088e7e1549348f18e5b25f0a210a75b0bccdb0b6c798c54eb7dfef1ab9e9e14c451c000cf67bcf1a996daab484c0b8ba29ed1b10ea9e69442f6d6070b6efd5622bf1eefbf90191d55f311c28c61757ef5218a746b7e784174e482cf5681a9948e294b1abf9cfbe9260841d3090183a9860d5bc22d57bfc103bf7bc7174721646918db2e49feb3c99c3f115928ac949fc7aadc26aed62bb771f0277ac85ff32a46065586d935ff532b1fd6c175b346d65c92721e7a6a4a79421f2c46d41cad6a978a30a107c33cfa552328b87ab618c1974cb4161a94aaaae6a4e0d7e50daeb9e01cf3293026db439cd17d8aa24568f61a4218aa09d5cab0e219eb9a55b3757cb227237bfce178b374b34bc486c1d5f8581b2656b2be091fd6f6b30ab0aea04780413815c88383ce7f312a0282bbee2cd3205388bfbe046c17c3bd95804fad8edcf3a7832d8d9ae91ee38ea130a3f0281e0a26cc9b463b1a26f991e73f26fbd71aa6f84086401cb7d632e04d1b0aaa6e8b2126aebfe72baea700a66c67b529a4ebd3b0da8d7b87af37b7d542ac706b64bd1dc99b9831449dfa9181a1748aa56ca31257bd8d706a33a5eac44e6f45c19f2648860fde85146cb3f4aa02f007fdb2e2eb636610cf42e9b33433acce1b3b925949f297dd83199f45d2861d64cd910c2db74a60b2089045e22cba0a536137d2c89a85b02f9bd2ba3293bc5d3d4c1ddcd61e9339db8ce0bcb55cbdd399a854d4e6a2b5d54f3fce21fcb0a35f03f3e2a99e89d46e17fc92c29f1cb5950b60f11d55fb0993b6ff7a7b26c1e17f33659df6c9717459d1a8450c221537cb232bcb10792c0767f15b463a234fdd4a56019e58f96df9a9a34075ddc0becae26b591162d28e25ce78c3dfc384a31d5ce6686224a0e7daba073583dc0d71d5776e798268e4c9fb33d7d9a5cbcd7428136efa87fe42779e2777f81d6b6ae6fdf6872d8ca74247ee4478fd1697602b63fa4a488e4a7085ca6e6018a1205b869aec5fb59eb25d80755ce6bec0dadf41779e22c2d3ad9daae5eb6a179d7f71c932c542d246fea91c26f99b8f22eabd4ec96b6319f67c3c4f574af06580fd20375c2dfad40400b77389a721fecb6b6cbbefee958e755adefbb4f99d92ea1df9498d62c26b544d0b1f03f1f48e18c17011418434b0ceade8287573cc1047566f883d2053e8c65816872c469dad998169d764e8bb21610a0a6e2f46067e173af56be1c309dcc8965c34793187eddc2fac86c078b340eae3983538ecc72cd8301d7d21e75ec7d9ac5ebf612f4dbf3f20da97fac097afbacf240628d498bd18da6a3463e9ed3a77fe90707abc49a2610956936a3ce2ce5f1130697599f5af379e4e1a2e671f95320194003c552627b04db2f1a55a2f1d467e4fc7b5a96863d2f04b96f7db80789659dbe71c764dcfcb62724b22a4c71d1f5ad4b95f9f5b8b7974d54336b39a44f36bca8d91bc3afb00fc16f868b9655e383b51a6d9c8697689a09da7917bd79af7bc026c32837849ff5f03a1ede464513fa45928cad0fcc581e7e73c6eb0b2eb01cef62b8568803d251fdaa038c25e86840a5db799259fe8f0cf645a44eed6a5a0192813f0d7dd3500c30e9bcfefbe7ea3e1d1cbcb52cd6164db77b9aa829d5b613f0aee1b5df9d210cd11fd19b90e9a1dcf57dde7c50fcf4c7093b31628818cb38530f25b676084e3b2873cacaab979603742766518c17316436adefe2d2dba25901cc93790abdde807d0e30f51699d099e342dc9ba9cfd60b85fb5f91cfc5415f430eb3646363d9c217188b83979657878af5c9c170cee9a43d4a06d7467fb23061fd0ee048a348eb3fb861dcf73734b6b169b42da6b97516a7c56e1d01b1fdb6a3c02b56832532e23d163c68fd236e0da0c62546163b7f4b0b911ec9c60228d75180922cda909f8f595ba38e73020d739e33a47487fa112ab1d99e455e1a3d7db264cccc168d97dadbaf1fb91f7e1ad2f5d8ba1fc09e329be0c377f791a2438f0f95609cffc323ab0a39374ecb3d9b11ebdeeeaf8ad0eb86e1773049264243f5b03ad6065cdb4aea2f2273b63de79b18c96dc98cad3843d3fd1e51a2e7a14497dd7cb770f77c157f92915b593e251fcfd7acd21ff17d426b79e062699a684e5dde838a44964f8a527baf789f959f311e5cc491ce1e47f034a0e4ec08083e692ffa76d7e902fbb44c32a451f10cfcd8eda2dd8e02fb405617b95377e6f9cc9ef57b7d27c703299853fe976eb569e41d24ef1d5224510e7bfc0b54896b35baf497a7c200466081405029b05855750106ab8caf649ae85967ccdf10acff83af74fdc76aedcee3aab32cf9199637f8f89e6ac1b94cce88ca236d7daf670aac53250f22a073c7524df9cdb7f7b0c5ba74ea49d5649326f908b6c92d5842f4794f0fb6028a1c9976111b1daa752f65821bf43112d7c00c02bc28c73733c625af4b3ad8ad506fac179f20031cb89a811995c308be3b5be76d8e824ee2697a0619eeaf5e6c1bf469fd9e106653eb7980488b5fb822b7ec1f0025cb487822e7fd7ee1753187133436efb7f330983455cad5a5d1278674fc1c842a0b9c3f859373a5cc9437465fb67cb692d24833bbb4c7888a203f31991245c0444a3280bb08d15755155af12802a41ad6b4966ca921df2be354e66d4fb7047e1c91f282ebce7d5c27ff81cf95a114e32ca2028b26217a8457760680be72c0845ae7c48f3e6be17ce85a9429cf1a36d93ba374d7593e005d8f8c86b30dcbe29ba55590eddc69637f412e7a47fdf571c4acbfd4996bffd97c32a14e4e654ad08ba5e23ee5ec506d2cd9841d7148bb2c6b26fe0a1a84ec6da9e9ba4699ed78f31c0396b6bf97a6664c596364efd8f3d1975269fe9fca8e24ae5ce156dccedcb3166779e0c304f5b6a768d43708d425c710d7079973686c6752321d665e2fff79407894a4395cc4c405afde7e0664da769e5fe1c1dd840f9c5c14775e683967ab63dfeeeb68c69cfa2ed589212fb29846098ffd5f2447fd2d95a9f52642139eb347448f9b996b04bfe983dd09cce3ea9f1811655c91d8c080c59aa2a634e72cf7b44d809e1472847b0061e31c242255e9958d219e6c5fe0ffb48e83c786da97e172a5c8da2104a4973916a2438195638c46aa370ffd06e310292ea26f7f1669d748f26f390849ed795d4b226729649bf0f311b1968bf3531ded22068768c3294300dd7ea21068e68a34a76c6e65b8857d666a961a604eb78dc911b7f88908608c600dfcfc828a183285d387427db9aa9c665cef85c24098c882a3bea82a0e951a312bf131a6d609da1a767bc9b98e91b3ba8fc3befaf17d36e381228193fd50553ade6628c47543e8b93951ed6160c32c2bac1aad4f88ee3fb353eb6a0cfc1aa545cf61c9248e4ec62bc41094bc56c66d815bfd3a0b2d734bb9c0214adc33797218a5edfc0e4ab0da37bec0a8139924e08443724d740a95c2be71cd0b4ccbf7247d090fa9c9d1f38ea7d06a10ae5064ebfb0d84ced444db0c8a0ef794a4ec1c2339a3d1b89e4a9e4942a115b4d5a40ff8b06038a57106ce91e53ea5cd2cbd6fd7171a3a11d5dd3a72cfdac97cd0bdac6e69e598ba9476f4b997a9e19e2b6778a9de17529db6b44e7317228e50e6c2c3b5ef44abf584bcd8ed67f8b2efeb11bfff5541224288f462b3e2226d1861dbdd350a24793f8b01ff931fd321a8b2e4cd424641b1e995c8ff9af7816dbc87328155812d0b7eef6df31585e134b1c90829db77be087b2356ac9020e89724a1ec37801e08689cf9273bd962cbf5f278a45b30b0612dde7bc6f1fd23fff139f634871ba75d987ff1585f497d386c5406e1ecabbbd22afce5415649c96d86e1d030fa8fe5d3a4111f27e7cba0d1a0bdbde663b35fb807bba8ef64dcdadb5b0575081744a0139338cabd5cc9913e9916e3dc48af63bbca050ef7a21f1ef07a8e2ee566a2a0c56dde3c4146aa19265f48c1ea240990847dc15d8198785d55ea6243ef7012ac903beabbdc2bd60032fb3a9f397d28aebb27d7deb7cf505eb1b36bfc4dbcfa8e1c044490b695b50e0974d3c5f0de748508d12ed9bfce10eaadde8fa128d3c30c12d0d403f60baf0b53d2fd7a38cc55dc1182b096c11d1ec9f171b879a73bd6ef1aa7825bc5162cbeba1d9f0739d1337c8142445ce645e4c32477cdcdf37e99fedb9236e24a3d94f0e45ea0b41a74762efe19d27555cdc89feef5b6e533237603fe98d8deae084f69799deac9043e86b830104327373d3427f9f55b0990b3d4c42ac2509818ffc5f122e0648e1eb5cce2c12e7dbbb41e8f21ea7ea48132b51b0b08178658b1ab5e508731f64b9163ae76567c6979f3f741566c99799440b1b29e409f6266a093834d4f97884784d0953a9a00efa81d50b28e254dc28ce23003457962cd090e3f9ab2221b02cb2082eaf832c4f89159b14a91bda267af42b975ca5b69ad8a23380d45aac34c1f8c031376c9d06a7dd0a37126dda0504685d470f490bbec31060542cf8c994f8bf1db7a7d052a2fb2aaad8f172d506598d6095c8abd607046e02ea31773a5f157779085d48edc2d790e580c2a54b98fef5be1a2558d612311d83c96e705ee1bca45ac9e450dee4e19242b5028fbe3b4913ce3a81da5c5ebda17b68505ea7cb62d84b72c962a6678dc15aec3d8c9d7bdc7a298d7a9b094b2e8c524d73acb57a8c85b3797908c4e95080969cd04679c93d9b58697c354d65f84090ef44e5088dbe3f3b646fbdcad8ce627e5d7727c3a1c0f9c3751313994daf60bfd4409201635c674bba39fc18c45be98a947ebb1ba42b180336bbc08d60b86f4792f33e409a0b905cf1543e4f2a8d8843d8737ae23ec0688004f2c69a2da7cec081d9343690303ce7904b1ece79d7b122afd1e1a7d0257dd28634903022f1f1a3476f2e63f45edf841d8af82740cf06af713689dd16beca63311db7ffdf2b8a784a218749250bfabaffa064e9fdd80b52c30dce026110d0ca7c0a9849b0b8fba8009cd966b0bc10e4cd07ef772f8701b52bb448b84db02370ed77cbbe562ec7cb113d9f4d15e3a4a9fc3de26f5450bc3f01e6646f3b1124eefc01ccce2df17159e290335cc317486303cf0822fad98d68ec00ab77c7b8779d3e2515e9b6b57acd0b11402646cb5eb88a17ab428165e7bb409fa892621a7e241a5e31916ecf669cd15d502a2f846a12e5b4563e86aa6dbeb61fd62fa8cbbaec17199a75d4c3a751fbb0bde8dbb6fcfaad31938788fb81dba30daebfea20a08dbae3cad78716cf84d0d813d2e9e779e8570bddbdf6fdc6baade5acb3c4cde1618c494d66d45d319e071fec88b89a8354699fbf325f05aea42d345aabc737d00ff1c69c746aeb9015f514927ae6548bd75b8992853fc79c40a78633285fd30ef191c832b0b9664d852142b019f18a05d9b3460246f7a83218a337b099ed43f0bec2daaa8c2e41dc542226cfe648cf83e3f75188c8451be284b6d57d712def27b02b8a5e675802cf0b6e3d4c707a79887e9e3890b976b7302d48fbd45e6059168e3233d8e2b51d98236bf2a049053c76121e67a47b2afe9d6adff76fa242f63f915d73a48ed416ca34a1e385c0577cef470e6b5e8dc056acd5f274a9fd446b157223d64bbc2372c7a7b68c47870fbf5675d4b00971e553c0f716e00dcfc31c3a992bc8290b21c633050059700d8c684e2717d24fc7f87a8c36b3b6258a6d8e118ebbb5e6fc5d657ec525d799b46c2c38f32e4e9be0784f612d6f836bcd92353ccb7a4befe044e50d707d832f1c1d6fa942ae81685be326e23380c45af9efa60ec7dde6be8766c9819f9df89ab51ea7019e1f275fbad7a581f1cdf57dafc4552a0c6d12dd3231976d9b0d84771fee76e47de68ccc6db44fb2d07d934e5fbec6f1219e5cb68143b313fb32d34ead1b33c45a9b4e48e5079a0768362a377a3d70067fe820f4e50bb12758a4418bfd137223cca3c85fc15ff8f2117e26d38fdef4ccafd10bf2ddf8261a0bd87bb98075b6854c96a76b731c010574cc15ad2101a9d619ff7a4afca7766ebd45ce51b790855b42fa58168aca36b40a86732eae44139546b9f867a1881687c582d5df33124328584546cb78f8fe703b53cbd2b824d69ccea712d36d18ab17bd161ecc6379847ee4ee1004be16ecdc9fba9c33af12475f1a2d3608cfe798711c5605a3d914ddc1817b305cdaa2765b901140bc239b0a5ea1d2ee923a6363366be926fff492a392b663243e4f2a2f7fc4fe65e6963d741e0e3eb8ea5d1a8fca1435ff2b56716a64ec4c68239c2c7cbb96d8884d7768390fa7a7018b787b92ceadd2fad06f1fb6aa9b8d78974217e2919e46045b57a9bdb616c274e03d1500a6b126a669bf1c0ce65cacd213c18af58443ad869ab78076a3c4176fa31b655dd496d78e61b6e4d1aaa82101239ae42a161fa57b76076af85b47fc7e2e93fb1eeaf73c1f52f718a969f69082414eb1f4c98a944f87d7f7b74f1b081cfd2734a85c3aeae5a7f015f896d061e1e75d72ea113d109f4a998537e1a5b0c8a945a09e9ada5a5dfb226b43d3be1b8ca037b58e7f7f90d738dcb1fed5709d0d8d8fcd66496e00f4a70e871f8328340ee67de83686faab83dd11fc707d241358446629a3ca6e8556463507e037a731c534908986aa06b72191c9d3315b08ba35485933bba0444ddf53165c3a63a39b6c14f028036b5c4a3d1164b4b5e1c6f82123e97a326d97c11c5823028289b5e740024d32114d43db32b6833f82c3c763a841877b8c84c19589bffb796d3c469c0d76e83654b265f0bf0ba5d20c538273373bc3a64e786a219414f04f3eddde2010fd61b3325d2b111e8b3cfac72390bd5a6d1e88ecdae9fbe7d1b1f29bf10529e7003a272e800bc2edafc93857b67a889e7008a1ec0ed98ae180b0e1e91834001c29e200cddda06ca8f3db19128e989b5fcf126fb096b1651dac6dbbcab5e3491cd4e9ee84c85194ed01d2fbac1e833c3ae4bc70ff04fa00f8af58ee954cab6b659bc22ee7d2c7d20634417e78d8b3019c5b67241bcc2bf50f23f2d8fd5ef4fd82d8fb706b7f5b8aa105b7100d5fb062109dc3179b7ebfa7cd84dc29576f4865f1270621844085453a10a43ece15f404142620b9f27f3d9fb05c654e37f01e4b4d0072d0c6a8ed982dcf89795f9e063e337f3099c5501e4354153ec613840f03d2ffb1fca72afcda18bce74e265a6f96eb1353156893ea493539c91f7e9d73263f7f5403ba492ba177433e3bb6cd88a4a78d08db60bd1a07b05484b8dd9ee328eef9c99454760274c60d0ea08589e9cde546d25a422e360561d00220b51ae7927e09931d1a5409da8164d94b16f21b9940db4ff09179c6d8d646b1f59993e8e94929311c8045ba3936051e69ffa8968d36a4c25cb32234e86a232495ff9c7f93fcd333f10add9c1750484eab840fe320434de9fd4bba18bab9ffca906b971438e5921c593e8e17fb6cb8fa7e58ba79d8d3311730afa3dad63227245342063f3ebfd04ab37fc9b66be7d1a250f21ac33d72f8eab5737203b15f53c27d277c691bd8284f7e63330fdf5e2cc6d1c4b367c4af0fc4fa2b971bd2bde0157c906c1a56cb14ab387d3c8ccc4c14e86f6516dff4e3d0465d3c959bc0ca669dbff157db86050fee602258a5c91e44778837b78444ce04ef7d1af00bf20151ebd5eec2251002748993f719f34c511604cad117fd3aa9f810c86b38d4ecff2c505cdd3d7f9b600ced325ff2fddc91141095a5aac35d24345add91d29f1810709b93311c437eaa13b9c9e1661dd04ac91b7749f25f12a9444e1b234fb319e1a8fe37aef129302d335fc92ff5dbedda9f95fe228128f1c5923b0f9412c958ef4028a89b5e99567 +0x8ca103dd16385714893331aae8b98012b40a1c359b4b25958843093a1ed2cd36a58aa0054a6b9e0a18b08836ba6be834 +79432 +0x068a639ec92623e69af04c1162fe2e83027dd272e7f72e4adfd19a502b188885d57d6fcd449d08500d86bd210c775f1eb4e81717a3ca9f327910b18deb6ec0261361e7f80a6f1f67b9b0b4deec8dfab7a8c83c5bbfbdf5aaa1e7429d75a59829693eb2674623cef3477519922bc76817892528876455987bff5c36c6f24576587e1dba621e427fbb5eded483f0ae1106fd08c5e2b91cf06d3a7a73518ad4c479fb05e631ba539988a7f1cef964c85d4bac78fab6e7996647fb46e28664dce95587ff1e1b43de8422cab8ed3eafa0b5b0407daf49155460d3e9ca6baca9e44db4cb124a69e16ca7516e3b1a99f8bb7ffb5e1fcce56cd647d7ad0df70c8075585e6e465364bb846cdd3b813e5167a324f5b0673ad014a6841cee176cef1216721a19a31f51faae3a8ddb923faf26df0d66de5cdf52344c7d6a55f1b49b874f03b17432977bc5727a2af37607fb5af7a1169006a4b5f4519c888aa2b55906a873ec26faa3294559927c2e357c7d2e7347cc6d6e713f7d3c484034325970b7aa2a91d8032ca2a2eaeb4b31d8887cc8dc69521d9b2f3af795e858fbaa862ac3dc91683156182f03aeed5fa767124250ba6e6e4995c4ec8ae5e699891126cd52c60e3bdafa5118902b008036e80115ef93bee999651a9e5cb2a9cb836f20a28bf10ad07af7bda573eb8d7586653f3eccf1c18ab4121897988799b694cc5cf197e4eef0ba56461ed176fa0740e5b304115bdf1b43a4a52164e91e216231c2029e272063421ed3cad552b1fe0c7145b1e35a8062ed24ab82e862a0d695a53a1cc7430af1b9574bf2a40918229110dd8c6c750c295b9911034e79879bd631ac883abf1262c80a98de6923993a78ca63dcd434eb36340bbfecbbb73b39cddc008f2023a27d163ea1d64a269b1068a7bfea431f855121839c8559a2247821ae1e77a1f8210b4cfb4e226f9c866a0ab0dafee0bf4244ca07921550c4ab1f7aafee88e4c5f7d411498709010cc11106ec9a5fd39b8bd6d6a288e6c8a536f882e8590c12128ba00e3134d428ffb6cd0364e857453bc6ceee59673ee8cb2fc9de60454952684737eaba3dcc0bfccc65a91ead2c5e285df5b9361566d8c0fc5b391f9c88cd4d92614eed8a36d38b6ba3a224cf2745e9b613e0407ba6c10c0776392e4411aa4cd4e5e2d0045da734fb4d937e389023063bf00a7f8145cb35b6e18694272c12ea768c4d6e9188b080e42c2732ceaf1f085253e0fc108d1dc57366c9592b212db1de1e38cc1afe16f68f08044a7bcb6276650509be0ec4e044a5cbaa863a37222875634af48808001f62a9d2cd252e13d8dbcf2ecd65333b38b3d9d0223bb81ad7a3222cedc1ee9681c6d63ac4b61e5bb71c77f732fb22572b0758e43515ea3c47d12585bfaff802a62459e33615e4629990c50bf4bad95ba408108dc8b216b1ff6532fe73396e6916e2f8772b2ac84f099f83131b889f702c1ec974e1f983a087c9123f0f4697f6576a7c9bacdd114a8cb177b6b04fbebe4ab14a418bd27b3268638def9ec0bccef322acf9bf16097dac2e6a9dbaf67c6c86295c9bcb25448f299d6ab6258e251c727452396fbdf60ef07e2570416522a368efc72aabda27de52de733eae981a065ac73403c1ba2125e0096dd64e84f78a7969539732da6c486c8d6e2c40c6e3b435821cfdbff5d2eb05370d77e73b454a4000c78a680b5bf4fe14242be400c74f8a0fd0d270575187e671cbfc1772520a451cedaa56563c0a90da5de1a12e0fffe2d51828dcc6e5220c1d710de31168f311268ba003a356b4aa47e0f67f3804ebc43cbea80c2bd7e4fda5c5515500cd2d2b846a1378dbf218d5c377138606eb3cb8ac88f9076f6ff4436f90717427c9df1ba052acbbe4585e98b6e8e0bf800f19468d40c3d578f57b66e59914486ea6316ae10b13d6a8d0af7c88fc04318fb7abf747acb07f30b1a0ec6daae3dabeaa4c9fae5cefd00ea23308a17b28e4192a1a524295660c7eeb8c5f71898631fd1f5842710ee9b2fd1511c46a2df3e107b18de0e7c28d8449ea664658ffa455154b7cdc91e9a8835f72723849da0e2f42942c279cfdcef07bf7572a8ad4e54fec77e1f476b5d54b1b017deda74920d6b11b20b1ca0cd157fb5a87926fd0f3266ceaaf12883a1713190a5b6aed43d2df3b8e9106dab83dc1b15b1d066fbb73e27cee0dbe2f4017e241d533378190cc51ca34a6ac32c9ba368542420ef25c108c03c92381d38e7cc07baa2eddcdf8b5344556882d3c07f2bf5f561d33607c702bebc41ae2dcedefb5afd074e337433591933c5f115f3a8a6327e0d7fc21e33bc71b271a6ab22518cac5902cd12938f66f9e2e52de02292d2bc52897f29d591a697b3a4a9fbdfe9e06a5327e300aa09dd64d74891e8f9d811d2176869b3ca6b417f345d30b65402a7237fe93864243d5ce88552d586d5e2e442412cc826791b3db6b8fdd3613b26314643b935e39e94460371a66150434dda5b443902c84e4bcbdcb618fa72d1df2f61233a63d565a9293430c5bdcbce7364aba53fa23fd657ac4fb0311e61d497e202a2cf2ad035d687092703535fd3ee03a1f8833ee38dd92f8e3bd8c7b49feb098956fa235a8bc6efd0d911ba82f02847dc92b63159f13af616cd728ef1b0430683944dc5eab3d4b449cb636bebafbc91ca283b12098d177087c980cc8f922a59800f2c8ae75a9a74d2826aefe06f1581e91da46988ddd92f4fc4961914d22b72ed1c390af6ec72c1e972aaaf17bacd88b7d764a05e500a92dd5324ecf7eca0f3493fd59e9fe6180c1d30a521d82f3f26b50a0e4ed080264bced9bfc0cf4e355b130e94ee38e3d4b3ec20ecf0c81904ec7f1a03cda5eab6aa82ecc92cf173431ae8fcf94258425369b4e7e4946e24993a648be7b534fc364f97f0c39a14f87493298f756374adee8e25ea1e7510be769113d42c9e14311f9b8c7a5190904a2484533a8baa246330a1bd9c0d2b766327a0fb8734d0aa25ed2ecf0dd598f9e4ed4ef482ce8ede2eb444ca923320059f16ba8a19b3059d472969de1fd22bb85539539bfc909a085cd3d7fb5122eb24eeee7e4e00099534115eed3824c9b162179352a80c8454396a39ebbe5d5ee57acef94cc5deab182510f8297bb14ed27db8859cb7471c35f7f330e0921b39b76dbbd1a6701a3a06d6d27f9f0749b3f761947ab22810bac7ba746367051f65d98432022beb2728d9cfb27fce7952bba8c447fd33a90e0272076a3bef85de45b444cdf54d7599ea09865d53283060a85f0c5f879188a365dd554144da92dc6be025ec457bcdf7003e811f944ccaf80ca2a027a44c655567622a95f8b8caae3ad5ae195d4752a30db14695dd9ca79d7aec365cddc4bdb88998fdd4d22a8ba8551d53d1b7208242653a5d3c89a864a555b4255b8eaaf0213eea558a6b70546f2d2fada1eda7fb4999022b9012e070c44f92f3a0516fab4419eeb8332f5ac377357522066b3e1c1d3bd1382d13f55a5eaaf137b7a0735d858d1eac4b881a47350086478baa637351a000096007279ff90a67582e0666856a1ae28840206f5e4d10eb848e35b88f7b781725d56717a007d06ddb6feda9916645e2f2cd62aa8713e91d6f9aa79dceff269f13f9be46092fbf6d37f9e0cd2ffe9098722fd95c401deb847f4d5a93c0512e003a49672349c509ee04586a31afb77d5b6d03ff0517efaac92a02c92ae21610d32f410c4fd05c5278b707f487af257ed469c63e358cfda953f6479dd3d2b25190597d182c3b7a2b95d6851a3f8cad277bff03315dfdcc69ad6aa8231ee0ba72c04f5a1538e992f7bdd96c45b9f6c2e9ca733752ff18d06e3e0d91037cba92f6cb87648df6793b4969360a01974c0b38388cdf2d893cae199e558eb96dbed0404a8838dcf558d7832072fac8481aeab55e92672b9cf7ba1e46b91dbf726c0701a5d8239cb616fc475c26cb145cd1f5c3953a6bd7aac888cebfceba802b508b9d75ddd147a9221e08a4b7d770360f90f584db59ac233d9ebd71fce195e8faf286232fae685f08c14972accc66743260dd95fbbd2396a5605cf5da2f8b4bc9b05e4634377938396a8c5e8bf66197d8c9be511202d885be824fc3cd00bab45b69884791e8f4d5428e33b0cc01ec0161504a4ec4c73570e758e8646be1bec31e6286bfbf5f55b6a2b0e221e36b80417a88e3d77a76c4d89e68c9403d5ef1e8815ffc0712f7264cd8571a1a689fa8f872c83d93a9ae013d624664efa7d51ea532a63ac6434ce10862054e12d20ad066e8b299fbe8b9651fd1664ddb31f07f8990d9d575b6cd1099ce2ff093a659914d4acc9b88ae357ae04a3ce69b621daef62a6f5e8de3f42f417b5b94256bf855fc277aa4b270bebd2f5b5eb198ced9278b6ddb2877515eb7c0080ccb408963a8f3fd416811b691a66d7330416bce9f73a9e9a1e5ea95692475e2b7e86d853814d54ab5382f067ac12b3046188ce7fd0de21c57f92016a00fd399d18e14e5c204108e4aa752d6c687d90124a964a16e70b48461e4e06b9fd4799c0e1ecf31adf12636763825bdf175076440768b915026a1a0543b83eac51cd877b23d04ef588686d1cc6d3012a81326e82df27a3e6eaa29fea36f833a9c3360ab624b4e856e1ed2fec1b8da7b46ecc7eb41cfb8ef0675cdfde3e376d191c2a2b592ec147a3b447b0bda9dbd6e5a6c6b1c2040b049b4140e3c7a49d73652453f14d871ef546c71ef879b9e31425f0c70c95e0808c4f3ff5b28fb151ccf3a356647877f57aa5e21b100693cdecdc16779913f781af742a24541caa7c032d61de8cc3486b5c2acfe5ff4e7fc2e372de7f5f259337f372ca74d258da459d7a2591721640aa253b5525cd37c5ea834f118766b4facae3b2e78e332988d52441b9171d5aa9da5c423b8383abac6c53dc7736b7a67561049a49197f79fb5320ece3199575c9228aa64aa628917d70db7fd73559e54c24e093b7bebe2f7ce817e26c3fe351e9ab36cf4a37c4d08120a4a1fa2b5457c73cfe06fb25f93353bc938b1c300ed5509de82503dd6052fda235aba9c1b1e62ed1e659dbf5386dc8f61b4fba951ee8481f29103c4102fe3c1e1603aa9f7779c80a21f620d781c523bf389610151c7417597ff8bf0bb5bc85bdd013c56caef7de1036439272de23ab3e70c8e4590f600674754552e27e741fa6ea42c4d15e4ab80badaaf86f566fa99c4e4dff08ff945d98905fbe6e670e5303ecf76d7590599e220f911b75f1916500578d29cbf4f764ec5aaeca58777369f95f9c8a014c0cd87de262c42db871279315f1294af77363995a9b4048b689a9b2ca98e11c984bad45b184b93eb2f7377c0fdfc92c0fefa1c6188ce6e52d395a56b5533b6f7efe67a2015fc352e80cdce4cdc0cf1a4554679c1dea86d8e36cc60ca8355fa1050d4cbb5c5ba90e609660f3d8fd04bba088fd43f01ee6c8e00833fd2ca6175b3560a5b949e0351c247e09d0b7fc30b82874abe2198ecf5e2df6ea51c80e294517e0b9c351562d243cad20a4f2271bb8e500b9a221a40842d11f332f05d55e06b273d202fa255acdae0aec9612e58c64e0156eaa8fc75b1bd46a55bf6a637e470f02369ecfb584c0847cb7cf9e9d4d6420991323eb5e8e923fbe9a2b7f2051af34762ebe556f72a5c6edc7771eb9245fad76f034bed36a4e19054898cc759ee72bb5028a16b9ee237a4466b51aa0dafd90924d068e8db7f86a26a830dac82f96fca9fa2b99fcbee2aa69dab11bba37e7d0d772c0e6f43d373b09021b3082ca65ad385ec966a1ab8b5d436b94a86f02c5752ba68b4b70c3b493969e81560c38fc484c758b060e7dc69cbc63864a27053e8878338f476913167ab5c389d5cc4102d4cc889a00adfc3a6ebb08ae884a06fb0fa55ff36147f306f84ebb5b342cac205aa0df1edce5f090db29a435ea40cea4159a73e022722c2c1649cc20fb9343fde1b0c23e231d206febec7d42f87125e09f3fb67d1053862fdb8e3f00b369cc4271e479225cbf5580a7eddbfe3b46d257b77c72f3b550c8b850055c22e315109612244bf30f32576b161408913a259fb26439ed6999d2bc6e7b976aaf1301d7a2cd5882d9c4deeed7404a4b227d775299af5e7108424228fa662ab3cecb94e90da96864fb042be26c2e75ebd98da5b4b39ed344f73a06d50319a77da894360d80af3c3a825681fad3e77e31dff1158da93c80ae5f09888b329af71165f54f0da3e6bc4b954348ffb4734e655c3131a5228e4df968352e112ff300b72c7747af1d56d1e15d52e8bab6dbcccf77d660c3c79e236b39486231a12cacb625a087bc97076142020bc9f08226dfb6596709b14073e84efbca8bb1304be25879fb75fbb80255b7abf6536cc05c71642a6c9635341586e8d541105a855a8ae3500d7a36294e9688809ceff51786691f116e6e184c8de382f0375bf448608ba0d160ff3391f30bfdaa8403522fabae3036f4f9212fe2e9637433d3472166cfd7257b6abb99fa9b5e5136f94cb1d32adfc2869f1a851c7ed588bee01ab6733dd073e62496e96a30f29c3b37ab4506c473ddacc8c9f8448c1e545fea37b28fbdd2e42a968c284bb102b41a2737924d6436aeefdcf82e60fa87019e5964bbc23726a0ce2765fea505d6c15b2fb741aff26e5ed6436dcf7bb058b703966a79159315ce5a3ee8158116b6ea87b9f5f935576414ea65f1849a96d99d170711968fb9e5975645df12e6cbea57252cb763e67960f9b1ab4bf5c79452dc611520b73992de224ba310a0dd0cb931bdf0c627ca41a935b57b45c909920a9b6928618619044a98c1c043656dc16da0d76deaece99789ef7e3ea5a869784a03b8a99aab3af86f203e0442099ed24ccbfc0bea5a4c644650925d343ced2e5a3cd5fe94cea15797e34cd7d43578289fdbb332901afa8e297f7b3eba2a9f9c826d489117965807080872a1c09104a9adf7854aa2d4fbff7aa4c14bff1d87ab0abf9ac9ebab66f20ab839cacfc4493ec048f9bbe92f589d81e9eaebcabbac413959520dd7b6d3fee71b27bac9774fd01ef697ed2dd4185286748085e4ac16475863f8c7a45fa715e558c6d976511f451028e748366b4305d06d0b831699cda6af07155e1a4deb1e4e989e909dfbc087de067235cb9be29ea8fd114c262ada44866b303a0129a70168023545081c3a7cd0b9bf1ab60cfb04564c1c48dc06440b25b7d1c3219ae1a67cbf15617d5d960e2e695660bd6799212281b3df02d613e2d31480614249a3f5d1f6c64dc566db243f3dc070a954c1dc53c45f795e414fb0daaac67c2bddf4d6b1d0ce70a8de11a54c5e84b0417a7d1d333fa67ebaf0015f80a02a7ca5ffdd316275b731ed6d417b9df42a8a4f82d4cc08171356dc8a31d60e1e35c9785764ee2d0c09fa5ebc728d7a263b659913cfd21b772b698cb8e5fdcb4e6dcb6c8c94f55abd4a32c173acc32b1c3ea9e9d67415b4857820942227bc01565cea4847722e31b20440df3af705f7ffbbbd0573cd7e1b6981e1bb6ffefbf65e8a8fd62f0881fa10be8e80b75c3b28f73a0bb591e2f5974cce15c84873a2f48f7e20dced5dd7fc0201836b95e24d042b44fac3d8b9637156e82584548c994110c0072328791680ae54876a7a9223d4c460f2f5f25caef2ae5677b73c53c8250ad8aa73896528ce3c3f02430f72a6dfe9175b1584d3c05f7da07528a7d018eaa54f7394b828f32ed54a5cbffb8dbc6fc3f09ee939247f03ea4f86a13e0a6fd608abc94d5cca61e8a1fefea6e6e84eca7a73213ab659d5251eea11e8a909b7335c7713671d545943c7e24ec07a8d453935284dcfa67aa90c40f980c78fd5d647c838bbaba5cdc2886f7fb5d55c8387041c988a72af8de20179043a039877b65b757828de993d8600c35b9cac37d2fe73584a41e9799c6a4cf194a7676df63db68bbec2cba4ac8cf0e800690eb18390ce11c6d8fdadae2835cf302fbab65a55a23193f1396c23bca309f686c3729c275c6e95b976f3cc04043c613ac31aabe5658f7e1def99a9fe604cc359932328aa66983e4a1cf2fde6005fae304b42f2d448ce07aeb6d4473a6ed9f14c466c2c0134b749f5b75349b672619f791ad6370c9316b60c56c5045816d908c5a3f4b2140ef23f210ebdb85ca269bc7df87d80748e8e149f9713e840a0748e2e7364c1cb3c71a735ead953c1d8a08ea5addfd7f4815fa8d04166fbdb54d10dee7e63620e055d099b134f21cb5c2d9c5700a54374b3b0fa051b68460f79190c6d8c9a9cc5b3deedba51c62a6375396efcbb77cddc6daa93a7eebfd0c55973141365b177d88c1bdcfa6ce777726dec8dfda4fc7b14f775fa1f8213a1e63a08ac48d04ffb2fd93d5ec32b590fde8a6d80c084dd57059938b7d49f0dc25865005c74971c31b2e16bf97d57c4fb9115e5cfaf22c269959b1c532d0d543a052282acff80c2204aeece3790b8d24171557b03314851b8ad44485594939111d3b9b6255154e6d0dd468e9f651629eb689458a3adbc354c36dde44570fb6c50ac71c54ed2da334a5432d2b9623971005d18a3378d47142d16ae1aac280b8cfe7793d7afebdc4e9598fac20ef0e95389372b854838b1976437ff1011268c9a231c6713d10220e2b990e6872578ed768de013265d16c265f77f18eefcd1453dc88235a23b817095bf233e4986600e84143f18adfe8f4227f1d840ddf591001ef39345ac75ce920fae3b492fba111422273c8443b30bf8845729c10585ce83e5af36de5808534ef98ebf506248f4c7faccbf9d0f05f2ad25335ae18d33f0973901534ace7b766efb68969b0ab870eeb40db0ad3a7bac29b18c52e99d885f04c2f3d3cf3756a1b8bc43aa724d93ec53f8f2f7faeb9ea134d16bfb215f0b8492298c9cb6bb223bf6e527e21d5660d2bc6c827dcd4bf43a962dd73cd0f944c50916d497478166acee1d1c26e34ba789f2bbc5286d8207dd166cd8fd3f93bb8b3030d4acc9b2aa5b690d2b5e0e55f179bd8bc3e124b75ff37e367626b756f93fd02093c4867577b22e5d5b72e49bc40ae4858591381282e59435baa07e698547b18d19c5c4f3531807b4b54bae46aba43150121ef2bcfa19210eab51dcf5e70d9b206f99cc53c9f5baba3fcfb37d2baf6a9472729add4ff9ec6c52221b22a8f756819c26e6be5eb2101803e73d69ce9358fbae73789c07ecbff5b5fb82174f6fa957a856595c9cb5d176097c92311bb8c32bcd0bd322ac596051dec558fd64dc5e4b9c0f6f540a67c57b5774fbff9a8773ccd721f597c5aa9829d566e6fb6fa63b047f3b6ecf3030b3d0f7b9c0f8d4662f87d59c2422db462f25a0c8743af934092b59c19ff49779651df131294650bec004ce66a9eb7595edec49d149e289f08f6733894aecc6a8a1094bc67e1196f8efeaca66cc1b1bff9a27d86baf1aa8419761147bb7de4527303c0f5f06802f7a82e1d184d4da56ecfd7d537dec0add8fe7c0047f2df39d5cda5f45e30abca2ae4193eca80b4facc4df97c4ef49dbb043492d0b7df65355b1661af33cd2ed77fbf6a522bab7a3a7ef081c32a90eb5a9c38250325d5825f58c9e142351a63937c867c27ca221fdcfd540b5a69283bf51785dd080079c92065748f6dc0acecb697f5d9000489186abdf4f0a2794f0222fcaa156fe6309c10f792d67274f91c99587a0b7b8954e66c373fcc2bd969c05cc221589b25ae9da985a15100b08395c4448f8e0ac6fa2c49ffb10867081d091aee68312a6d282072962c898901d0cabfc2a2db3e3c0d3c8c8dd54fd493bd4ee5f80b198e2b41e6e4bf90da9be7653df489506d7656e2a9cc5838dd04fadf043675667c46ce903378587ade89efc551fadf14df53a62ef651e5386a68bbf6cb84cd26f3e4e58798b607471ff37955c94b5a6c8b46b856a4e5cb70628035a8f77985a90ad90e8ca9263281e96912aae65e71c40bdfebee37c0616d4fec164a2a5d25891b938833c73160c7f54b5a494bbcbbb7cb7fef4a11aa4d7b9cfcdc7ed6d83333b0b5010195701865be2aae956beeaec464b7011ed4ebe647d432d69b8f53253564bdf76a765adff79e778e33c95cb1564215efc0f40dd24e803eb344b656720aa21ee9f2fc6a1e0a20c28788e69f7a09fe0cf9d4f1a887fc1b70f0eede6ab02fe338472f8a1658f9ef9c1929361f4f3bf30ccdcf40148ddd2079fe1e8a084611b2ca9d74c1f827635554b1894a64c788cbb5ca1481fa4a6e199a59482ba7da5cab265b671687ffb2fc9cff2d95f8695ce2687d4919c2442b718280f045c1b36d16dc1f7b0a3e48853fc5308aab52bb44c1c555d18a0501a1c2a313ab6b0e87cf807c48351f83a846a97e2424fd0c23ccf43cf242552b194d877c7fddfdb6be0092577409c9007573c4181880fd7d3951f43fc1200dace19b2a8f240c8082cc8ca72e017d993d66891a33ac234f3e72604c5e50df0612f127365baebba5db49d059309f04f292c21316414d8044b8559467190fe3e0f5de5e35528e6fb028ac88033fab4477893e9e42d18b2c8083595acee07ce330bdffcca214319d32036af04f8ba4909ab922871a64c38c7517f43ffe55263157e3dbdf071146c8cdf41bc588a5099dde8b247a176ba534b4fecc907fd77a72c8f00921deba1c86d6632564692c78b0b5779ac3c466ae99a2903908cdf8081c267afe2183af413bdde91e494b82406da2271c00abd62e3fd084c00563274d81d2dd214aa041537c56ee7d00ba371f4946e22ebd284ac2abc1450812c9f5c96860af2929bf20a1acd3fba8173fcb63c7f6613965e4250a51f74967cd8ce3fa2452696c3b3abdda61c79955f946af9c6e32fcc2774a0543b6e51a757206625e4a2a8460fb9d896c1fc43fdd23596447a0af4d508dd46c2d6f0d2097ccd101744e5b88ade77203b55b3c57c4220279e403bdbb79f61dba15dee204651a7731baa5580eb98b32cd6498a2899171bc61000bd0cf956c708fab7b062e64075383cfe3b25f0a536a36e85c994ddb9ef1ba0a2d9b02394d974d4ce7ec16fb001067f28dfd2226ec82e0cf1b830ce9164cd580ed7efbdc05dc73789a0656b091186ee1089ad07593075b7759f25f6054185402cfff050441cab2cd05d7561b26e5f909f81de29cf381f77f9c59add7e50ea5fe598dc6387dec6b98bff1ada15e03a6dbb0e8e1039a6d5546573b8096557a5bd1fecda7ff16ac0e9a2cc7b5d992ebf8e4d7ae542fd433e57a1f1a704201f5d62c341132bea8a42c1fe0dc172a62295fa3e0b0a4985d7038795878e561970bb57bae0afefda04f44b850913a1a48265b9740a26ad372acbed2a7d9585b61167a3ea11d55329a17d8e200a9a73fb17d6d4d9bf60f47d033f8f461ae61b61cc084e3d1cade03f298692b8567d6f14a991525471e1a8be2c0677d2a7a6a0816746619a48601d8564b6603336e51e55003d3bcc69d050616bc9adb76c009a7dabcbe3e8de1693611ab6ff7bf2fa0627e383982bf05675d0893037dbb11a93bf603cdc1126f6c83c122d7776d2e3b1f31b0b70584c9b9e724ee21f28be1c12ae4e4454fc6829467f15c4d10e1ec9a71f717ccb3bc5c653af81886d85da2fa0b23c895491ecd79590eb23142a1dd36e15aa7fb1bca5001defecc927d94f7bc433f4b3e3b8f9263bd95cf148b1182a903b91bb2bc33270829a554e570e632706993c6b0a59d941c2c030d6758d57f595fbedd94038b63f0c1885bf040b5f5bee4ddd59d05cd24eb2af2e7ca4a5225d03bc8580f903779443d244c337b88b4105b59f243da92d76910d1f88dde1c18a64e522595c0cbe98ae2e5902f7fd2efed23a4974592932e0e942cba526297ba33fe08c0b743cd272d5958e254cc291bddd44a5f32dc228b541b6fa7989659ad11d148b3f4679fd4b4070a9d43eeffda4af3c7947c05d591c22d174ac0d7d643b85e9e79ddcac854b782573b6d66cb8dbcf888e181ae30b3e13fb00e7ba59220affc767cc3dbeb399041eb4741b210a8bc592ac0f443a87429c9c68d299e21b651316d5757195cf5e6cc134b516f73ddc1ac19ad3454c1551451c7214b1fe99754a3ef73f811b21c13978ba22cdd498f5557c220d25fffc9397e3e7550b96e2612ba795d37436f0ebf2aa10634aa262fffe2d0a65ed3d862f19598e3fad933f523fba79d852d086041fbefc1f9547e4219e3b1b82a4edf94e54e63178a1dbf8700cdd6af723d02933481e47feb4ad6684bc0e1d0d52f79e17cef396a8ef5855e21c792fd8f01e22a0f631b9aab1ba2f4fe00ed8adff42bdb311e686789df09ed1f7f79122c0a2b974b05f19c8935889ab92a3140bb4b89e49a529c98fb58d1a6423bd587e9c4435d7ff103103636ebac05b3598cf79408802102227973e1612c42a354c938bece0f06aacc70028e30bb5c22c2da054c2c506dc3b68354173ce1894c6340a958200e8799ba46aeaa1c4b350f09b264f279b7c90db5313c58c9689e7d7da8ac2eedee6b44690e7b28f2de18be9aa0a7155538cb569b2d9d249b23fadd204bc1b18c213a413521f87958e68fd7f21f4c2353460d24f4b2f709269616d1e7b47a7e8f397d06bb4bc719b2e6f2e1bca8b4baf881d6ff4e6bba84f0518b02307d56f47bb99c0b77c637889561fa5236b7813ac95ee15c04d288168cc8bfd496f0b791b6041fd5d73bea5474ea0ea01cd632212a5f94a1b471c04c507e3dcf87d93cf4e2bb80ec76175ffbe5e19851bb8f281cbfe66996d9b3f384efd47d598f71579c664267b5b0e308ed4ceb2ffdbf4d037bde85e871e123b25ecf8e07191a6387d6d53b3cd8341965b72e595dea848a34cd2ad099e9674b5d3853ed5374b52a5e52940858ba6c44f6d81ece7ade97d14c9f0948e653e89584b02184fb02fc304b9e472c73d2b5d04cde72bd3f1085bcab501e415647c18c9944cce7662a3c0fcff85329f6c7cd55d818eea7e346caa6e18ece6c824b9ebb3b649a871d7101335c1f4c8359f00f301935c7113fd7d32a7fb99e2cd2c5ec8bcbae3ee6997df825806197cb25e1f81990a3b07b8d5a3bb1e65f01f4c04d1788ca701e7852876d60dd7dc953e314145ccef12f69543460c7a5ed9e76e357cc3cc858bdcee143fd6fb3b255d00a1ce094349c884d4cfceee64ee3c805a46c670245c6815cbe3a04ccb3adc1a21352e93a52047fa9a01a329841e013339bf16493b3582da451b03fe24dce915c876caab9b7d76a012622d8581f510483329d614ba17c0738446cfb6af2a34961eea081bcd673dbd6179d5ca047b51076f0b6d9a480b0a27afeb6c3a142ba5e54b1b51aae2e6849ab2ce01bfb4b9adb816ed43a38e184840ef934252fae7254976910e1f830233802bea1a2d3ab60aa24f57c0f7344662046bc5b9c809679a0cc8d2a54357c433b5f45489dc3d7b520e43d24c5de19d41bc4c093963eab2ee74686880de07336a813694b594660e6b441ae54f9e3d26cbafb9e72aea45d007ca7edb05b83a57c12e1933051d5d793f8cfb193182f1e8e927dbe8f426c1cacf5534b19e9899392003c4b8e33ec9c4b42e0ef55ad1a5eb846ad993ffdf07a72c5fb074b247cbe0704760abb6c152f5b4717d013253003882c1dc71b3dcbf6f082e1aaba88e795497431495e56ca116269f6dc522d0abd6cd740c0879e7902b4a0b9bdfea334b9e7f3f09fdda085e2ef1fe08ca900f4ecd4bcb90e3b7c622e2da3e5b97dffee8c50e82666bfc5c3146ffd77697e5d99026e60e9187d6421e9ca00f815befb9f9d12e565467b332c0653771dfb48af619e88484367e3f232c6183c635b3822a25cbc601fb7a6750b69381166aaae52e921b0f76a84f5931f33a6eaaa128001b15babecc822b807fb9d8c50c3f006049a3c86e2c0e828b341c2e4604ea41d25271a6feff12036687713deb9c873e620ef3f689ee919f3ff34e46f41c3b875e97e0986de2d289823088c9dc0e6aed52462bad4804592fdc373289603aba810db40a96f5bdeb453a42a3857eaa0f949ab9f2f593b58dbacac870 +0x45a19bfa408943f7a44e3f8bde24b08eced95632b92fb30f87c04a8dc18c8fb242797dca783c34799b6e99907239b589 +80224 +0xf407e8ad17daf71e1feb8765a879acd211706be625857b09fb814c7f1add4999e1905b282725ae371e10b7fa7d427601defbf8b164e021f5a24da831b8ec6378bf87c5fe681aa5d0df2d40c2f66082a97f4881cbf9794b9470e4e18b9e64838456932e1623e2644f2ce92ba75afb5833bdfe0d1b2c79814e2cefff74146c32256e5d9f589fa4731ecbec7f90f33a810560c5a58945084b8ba0150bd6612cf6c3ce8c1fac26895ba384df446407468489304750fd8b4d32b392ff0c98cecd5ac63fc9b7fafeb9a348216a830ddf47e926f529165f4771bd2ecb550aa2a377e39689bc6e2a705bd37468344372c36439437616ff97c29b756513be0edc28511b9b740c4c24c498738e23e68c7bfac5fb4a7cb4148e41f4e0be31e21e2ea484893dc86259d042970c0018276610ce93b7a2cfab5c2a0fa488a2ef6a45806137b5e54c659e173281253110a0da1985f6f5b337a4df5473d2f57a13fe88baa59328f9c9be22dfdb7d4789d2f9ef7e68153ee57c47a6f5b4a7adac6645f1c4b9c069e30714ed1286b4f97028d9ae27bf1919a0653bb8f31b4a3aa2b0e88786e5e50009ce1008967b4dc34ed8e81dfdd2290f4cbb291e38f0e324c2b98e52e8702b76d5e65a7a5502712d8babcf47e6e86ea75146b8deaa7b9cf17648e05bd3a4b952ad16994b356348c08f693631cb4b106917ce910233039b2b252786a92dc7b81cfb27758420e5f903c3dac4e5954136dd071b5b91bad20859361c2744e0224f5d26e2982cfdd1ad7f8dc5226a2a13088c87f4bf94262e0c0413f06b35d2fda79b960ca74bb46f8bba56f4f8c87409affd002365126160cfb3236bfc83eda0e761b3704dea2c07bc3e872ded075a6a53b8db6ef41352af78eece547f3617523834e5d5300f4fe167938639a930c3801b467e9e15a0e1652f3e7c759f573a5cc29e9402f8c50445b53fbde0d54b9991302e537b6fbff6c91e29959402ed3d06ac2628c04e11337acecc92e9195ec3e6baf8c0ccab7b79226a39817a500008981f5509d7dafdc4c9d9c26f1e1c7329c7e02d2f5b70d952b93ef6a9ef3299835a42b19f0f4390a07afea7bb458791b37bca5407ee67e36ad6c0e773ba4fbe96943ec4533031d2add56705de2701c1494ca1f5b04e37a0a7c0189448a5517a298d3a168b014eccd4213963408c330ad3808d9892438918f2c16f859176ddd2248e5f2db04b3f85fea89f4a493cc4743960b5c615940554341fed43b4f69ed06fdfd4932bd6af0511b0bf4161fe5d0763344206a10b525b5323b9551bed397bf2c8c2d0626a4455f782c1d0f09ba6cc39445be19e6e19353915fc432c2359db9691516abfcfa67c9666ce7f5edc46caa4d729de748601ebcc3ddd96515fa4f94181a8eba9cc7e82d8a30ed71386e6098a37d4858b1bb384f6e285d5f16bc2dcdce1f0db882b7470a383a85f77642d92d5aa835e4bf5d6089d4e1b88730d5c8c50f950c0c3b22f4de14cc49ff23dc46c6b795ef21ddb1380abc7c837410e1a128311f124c42a582179478c20edd8529f36ec8ec8679612f30796b46bc235a3755f71fb8ef25a96f553bc2669cefe80341c4a3b6892ef7a69990306ab5e4ca0bdcb619587b50c92d057f3ba03ff77f63207dd8c5b07abf4ea4955e7807d19b8f3ae28e7967506f4ba6d337174e60b5ba1deebaa282d95277fffd67e718766941ef20f1a439a1163bb7dc67246ed82588a89bdbd576b74bc2fa3ccf406e4f9db467e5e56168cf587dc6ff2e6007ba394f4ef9bec712b0f5a031d8070c7fd9a36733a5dc298b47a09242b00f52bf737b8e7facc5ffdd42faa01553a1b3d38134dae0e5387507868919c9938c64ecb066b6b919a3f83ce9c533334421ceffe2bc7fee28accc64186c64aa2e182f15ed856899c4bb48b801efea1a0df9c65b8a94d6c9e48ba83789d51382c44509d187520480428e59e547d5352825ac328cc5686ff2ad6790e8375d96e20aa59d861a572b1af79fb43b180f94ec3fbb8bfa4fa1bbf6e7c30efccd607f26759c52da12ff4ca86861d03fff1999d490aa4b2a65db3b4538108afb98883cee79abb2140dc4d9d71967465a796da48fecfae8a3c46f7e7bf2f28d5b452f40a8ab4633ea674263259f328f10f376555c992ffcecd7e8e5f9bccb8e924fe03ac37f1e60b3cbf268f24e3602fa09ee1cf919abe06c0ce2224d0a1e274715257bed6976c106884f6bebcaf44a8c292f7bb403014bb7ffc583f45f6ccfd021799474eef1cd6938d3dc7079ffde3deda4f23bd9c297371d0dab7e1139e0c4114705089411fe426a0a4b0effab3685a3f900ef02624b9fe1450948e3f8129951385e06ed59dc28786d3835b0a8dc0a0896385c1162e128e8e61df33c39ddd66da7fffe5f2bdf9200771483215b47216806f8f18b36e088907b69fb7e719af1d3307b5d6e1a71058ea26055e64500626eb5d34dd460d225848f7dc04f31d2820e4c50b29eb848f96f99cc4c63f88053794d47cf81732e96116cb9e012fd3ced8b56008c6567cff44fa788c52ed84f6b0417d70516e06e30d3cdaee96e3612cad7081b5966ab6e7c9b66566eab86d61fbbb0017d193b19ac480cdd3ab56efc708dbcf187f715bcf8df5095876e66bce7fca047a5ecd5a96efac4c5628d1a6294fc0f33c6ab1923ff87e0c6ddec0a5c6a435319fe166295df486fe7ef59cadd9ece59426407384c0721b17aa0a8e44d0d2c6309043a447793dd78c53fbff2d5f45125be0e7ff58d96392d219e3986f757143a9556ad0dc7230669ddd20424e44c411ef71499d371333ace4c14f254f3ce97543f440310fce37fdda254dac370fcfa9fae14d9549f54a31f6aa377f0cada324a777ac110917b962eb326b861148d0a12138da2eb50710e9afdd84eccd5005187de595b6f2d41e5e770c601803772ec20e7fdab2a4d1ee9cb8611cb5baae78186c47e569f18ecdb926bc16aa362551d469be34673ddc4a11b83ee922fc4e65ee1ca483722ecc303ba2497384d2d9a19fd9fbd096a9af8d11587dd27abbb8326036045719d216aeac90bb61eefe1c86ea074096860fd220644025be071e754937627049a605f4afd39b1bc72fe275687f9b946e8198ce69d2173e970f4e0c103a47ee4160eeef9b7969708c90a76caf243c0040cd6c2ad22385d144db7305f1338e892791b68edb66a2c29a597589c3a2928af4b3b26ec21e34e4adb3b4e952e8de46e37f845ad562ef19d8d273550cc0463d727b9323a18cc982bade393f9d23e02f5d7281daf235f87e2e42ca57f348001ea26d36d0d635efb053a62b8f39aa3c4b7eb4d5969aa664f884f3a117de0067376cd1c4fdcbe14c786051b2628e4599a22c8ca716367fdb90c22b211e36b2248fb9ee6432e75888e1c928f53e04be9f3d50411fe32c86074dd13372f36424df2e6f0d3ff892614cf376731dae03dcf723d31c6784e6848d379753bb1fce1f3f1d78767cd634c640b74f7a5137f366495c9b65a481ca401856fdd22528de6aec63ba714455354d0b343d84ba633c253cf19264016342844eb3ebfad798fbcf8f081f46bffbfebf557326db7fb946e179e99f60a4b0b516d7554a11f9f68c14d0158e3c1453f5e3c87af4c5cac17a61a84ca9a3b5f38bbf5c440060b5cbfb025691ee9c6ce283830a538d8bc0043e6f70239a735db12b478589f72f319eaf61ca8429aeee321065c306db758b09fbd179755919c374ff76f92b15c695f710f9d3f626bac3ca05529c99c4ca53581a506c4acedd11c36e146132446c0a5e86911af0cd081232c8123c1632d43f7a01b4f1aae1066c27e0e864a76b6ab85c79f3467906e004f3c36d4d840cd978f61ac5af9e7adefe27bdbbab917208c67851e5009ab989c1945d2b74ec3a222654cc4b4f2d81abef4b6e55ddf8408e5c3b7630f05ace4c709dfd135b55a3f76f1d7e0d7860deb6671b597ea3e4bf44a42c519cbdc12d7139960defaac7319f7ed89ad4d33e79478d20e7fea55ed672c3d348f010d7bf404508f485094bcb64790d876808cf3aa589e1809c8a6d6d5fe4b8c4f690a56a00bc7b1a9d1ee7598c8945ad91be1b0a1a84e68d21fb1a6d542d642e74e63217fbc675e70194a5c460d50674179d2bcfeca6b874569f6cbc99c65eec33b986af778980c378118df22886db44c14f06736416de9f001f6b4376d82e68fbb2aa18bd302316c93da6cc2cc349855879b4dccafde074ea221fea338b5d089379a53c15e1e748bdc2f83ab3b5da9fa5c63ef46682475ddb51919a17067236c5b57f01c6c452c11c458b25078315fa6ddbaba17fce9ac19a54c8396b72f559570e41511a03eee9ae7168736e5682fe7b6303cd5f086108f0d2ccb077f66ed8122ef21357c343293aeb960e3156aa1496044e5f4c592599a573a6e883bb661dbeba9a2fc62fd7e78a5e1ddc98aa14a28566953f8fe96cde81e05dc8d7e9658f235d418caf6c358c647006c7ea7b48121132e05570dfc13e4cc1f937bba7f19608bdf0145aa5e28191c958b671f0cfca021035893663a921cdbd831f761d949a3782afae0e00672dd9121b907332303420a79ec32b9faeefcd7d02675174d5037655844215a54df703f3573f3968f3b632a022eb95b8571114a97ef794d43c3a8ede79b9b5bd1c49d91315aa0bbba1ba02a2c9e9bdd92ced6ae8ffb7876452a547c495f937705a8a211b5db93053c1a756569ca5eb28b6ec97e28e8f714d9ead68afe0ebe3e59121a4b23554f257dbe5f764a20767cd7c76624032679cb6a9babb496377004548782a81a76397f078dcad73e4f878f107f494aaf4274ec8f93506372586d8b708f67b30bace68451ff43f2b685e67bcddccf5c7dab7d0ab188412242efeb16458035e66767dad7f5895773638237d5588684d40efff6a868e11a7b687c9d474c0079ccbe459aec5ab271b395c2dffe5902e64bc38e76381e1438c9537cd890ec86afd080b48b240a112f4dfda6638937b8802e4bf5805c69b818b6a46f4175af99549c5f4330317c1becacdbcb46f88d3ddee608b38967a43356addbd24c881daee48a9a503e773939365ae0a01ebeb1f95f1d7a4715fc862c6f295a347e2abf4dec25d289ea77ca0fa8c28ca34f5e5e818d3f213e9a8d67f9ceb3b0044aeffcdce7e8985ee8b596f5909e30635d59eb5cd5c58df8ab9cc221f1d76dd0374a6ef2445d4c2dada338919a288c5ecd33d0e1e53b1103ad9d3d4b750ef416c7cc8e24adfe6e949de3174a320bf104137eb7b7282a7afe351131bcc4b4e34670d8b2ca614680125dd7cba5e4a2fee1c48cf8532afe0c26c6ab382c6d73abedc701a57a2ac021355203be2b1ea8167654f12b3c4a30454bd69db8e0dbc5be8b3ee9beba46e5b26c1ef977506c65d830494db8e9126bc6abe99b5c909c25ab9d4cd376e16231c425192b8fac4a8694be15f539d0100b00e574166ba22b0df3a2755156a5f93ec6fed50c5f9525650c6e4f8a1687df8874770a819e9c150917195d05e66e78674b67d72e7fb1a98b8fcf6a6ef776bd7e91ef117f4df4c681968048439eb16c45c1ee940458783384af6fdb3625334658099c2d61f232dc11e275dbacf8054144bb019020825f5fcadbbe2652483416af1c3cb2dc33dca2349b489ba47ad0940e973f500575dd8ae89538e055d8ff9aee7a1f56408b68d5642196fcccafa9d0edf6f66825bb8951488c7e8da3400c3f8083d26c21515dd21b05ef63880f07847d5ac52cf3bbd92f7501ed72ed25c0912fc9e479013e2214d3c890845901602b37233a33020f5381e896045475f2e32c26ccc411729a6c3a28da48c3d23f4a4195f0b3fed32e6ef53dc96196e02fba6d100d0fa9c80e72ae84cb669666013c442443c104e981a205cf0c73bebe34dcc075fb15c6a3f30bee720c8890970faccf7c7cffc9a7b1931026ffb92062bab0e2b32774ec88f06e767b2e1d36d7a3122fe93cbed1b02698c0dfe3a0807029ed307202ab7fd98f30d2fa9092fdca741301f4e38ca1756949745478d84358fad8461d2d38152817e9808ae48859c1fb15c24a11e7bd79e22bc72f2fbefdafb608702ef7a930f7330f0ba69a7bdf6090910d33386e7a30399625ba78d2f3c6d3f45b22025d57c958f7d0d812dc0328dd2b3f6ad77f8c3ad83f0c90d4a2da30ed326380dde2fe01025a8c99fe37498d593ad53b6fa957ec367d084cc3ad15906a3935e5dac89850b7ad7b56acfc27006d465b3f716a61d6ece69548d6504a57c37f2eab998cbb1af14739a8bfb92014b1e45dd17d314e8d53f2301f8d4acce9818aca5c8a8ddad247de540a96fcd94caf7b49bbf39c52721426652b48eb21d84cd2a5733e6a7c1913d946f6d325971abea1ab39751a222795f9a106a9bffda65ded3c8a15a12341edae7ef7e4b20e0177ce0ee46229321061f2703c1047a4d66d40ebfbb0b0450f5de488786c5092936376c1475b4816bef0976f362d00abdac3645062901665b3bd11e012aa5fb932fa227edcb1052495da6eda8f4079974628cdf639244219e1b39d02314f5e0672b457940f13df003787cf5e920b20eb8ae5f449f9edd1b61bba0c8b6ecbd9fee51a9cbd78e4341e16715f7808ed750d2b835db82f6d33eec438d6d815903206dca5583784b2b2f2a53f95933e581490aa9990ed3422e7186dc89274e04d14b2fbdd10becd0fca12863ae85cbcdb5e0a7a910445c29f69b78ae1b5ee3952e087b53a6c9fbc4be7e21c0bee110f07dfdf3df24e6e35434a60be0cb7a09b3233f98b35b276cd07ab05e91b1d7c9f3e08834745c5a316bf079849a21e38806b6d8cf07788b099b371e27ff0dcdc081e76ab39040090e1530fc2e06a6022837f1bb6874865f98cefdb0c4325c2dbb409889b859595b41fafe175049e13db1eedcd0ab240c0ae210d44e7c51255e83d8fdce8afa2eb994c361b2318e5afdead27e00df3f92f4af0ac5e09885f1c8e0f21e2173994889cd1862b51afb9aab9c8cdf314eeca085c763d74e60f547d39936016bb95f2d34b5a0070853b828ad8fc4074c3e54bf25f1c413801ccaafe7784bb092a573672314045a9424ee8c6d8b21ff3af89f763cf7d57f5f142bb16c43da33807ffd7ebdb2ec633fd5c54f51584bcee1c4f44e329f3d26d19041d6cac38a901b8f27f86956fe29f2ad64f8c3bdeb7c2be97bce6fb2a50dbfd733a569c004d14d1c175f91cae5b496f5f40f2a84a912ffb15e7e5bf7b43e12322aa7b202effefd70f53a9cd4470c11f69c1dee732c974462c2e65f3813c0b0e94e620b50f41d13d1ea12f23dcd3a4df585a976531d13e445d18fe13b699b8344c660dd73bb3876881e6efbcc1e45303dd63b2ceb238ec6a2b3004bc95fd7728abb299134eb5610ddb8d61e4be335a415b85b7705e711d2c190c103aa9d7d640554438d592c80c817e0d2c680c31290c45392bf6710a3f0e98f5b73a6ca9543fbba383baa28bd8680c0eb583567e5db93ce676dda474d0864d85501858e25f6b5149002f18415325e7da83d3076b66fca5263e726341602789437170e9337657b8bd149f4eb90b5fa4292dd3a998b33b1060c96137e06c66eeb8a1c0a7ed2789547857a7c0337f59c352fa01a786e0f8f13ede269ce253d8e04d47842faff174a6f33fc517411db8c7e0aef9aba66ebaea08b34efcb7c4d1f08a0927badc52ae32c64373be7264f1146a83080077baf54d670f26e1e12df6b1e73d4803f2c99a8a59f9302047f3a74b593cd9509b644cadd2386af6eefdcb86fd7a518593c4ce1036c786d722382fef2522ca1651e9058dc2c5677641c2a4f23536d0aa3fe2bd66d534e46da1a11f4266db76cc6bc7c45fb14cc91a8a0b3786170951fc4791fcf0cdd7d53e36dcda1786cd4bdd296f0db64614ec4e1835d7a51b4831f65b50e1307916d5d3623a04c11d8ed5d31b7d5603c9e46d7b7ce129f1ca9a0d22dbbe2eb87f8862b7a44713c183969158c24111dae501b93d488b92dead754ffc592819fb498318758d927bab615b0ab8be68e5adf0135c0ddb93a6de2c50870d442d577b5fcd43778e9ac0e13f62ae7d506325ffa38fc267d697da72dfb22eb03d4c4bab3a9d904817ce78056633f93138ce773257ed88c5aa16923f2010c39fa4f38b2d529a6b61c9ac058a8e55775ec7e94df885a31bb1c68e8285a602c2260bb18a54402a515f04c1fdd3003da5709e621ec4d546f7c6cc7e2ff8d9fec6ddd214cdc27bf3ce8a699ec58174530ff11cb75df99f4fa95f2c53df1b246b3e41b88bb9fa7e5d5f9e58a0f118433c135ad367a0397c33ace556ae244f2dde84dbff84f36ecfed70e56267150a056f5c3852e179f6c4898f13dbeb94074edf5717479efe81d92aaf0a075f85d9235357040bb34fa430b7ac454caaa2f61fd4118e01483fe6327b6676c7f8d7f8358e70387e5ba5d429549113f959e57e0963409abd0f4c0e547623b624d19009b48754501b58f10916d6e9ea9277b021a3f360e7eb62876cc79183329e68226018c45fe57329c5b591b4f3338892b763680afed01cc08683f4640186a52b23adeacc1f53065c986c228569a94c294fb5de1076fdb1c7cde673440b2cc9a8f8359314ff43554ffd8f31bea9a66daa0dbb7eba65cb4ae6d1f6bcd81c9f8c5034b9ba259c10e09249a157c72fa56da365c6b25f57c3688c17474996b2595dbf5d8cc874625628c21154fd458830bc93dc8a2185a9707b46225aa1f678d4ce54c7412697ee8d9e3df8ecaaa03fd2eaf9f65834a3e74cf3a367a34e7dbcbc5e9f26598ce69d21c184550ad86db306695437c37450adc372027ba3b7930a5a7f2cef384416fabd3333aa221f048e35c821154e5912497e6701c2fe65ecfe49b05c868ff47f83aa63aa8cb4e71b2e0b87ef137b6b4f66d8632fc1f5e1d1e50482cc80a306a6c483b3776145b9081ed2191cb6bd238e626bc6cb1d3ca3e87b0576eb6234031339d3d318cc571d61dd33fc4873960a55e8932282293534971cd6fd47af95624b5015231d226b7caef59bb1e0de98881c55f906d37a721c744703964fdd49bcc5a3c223e307e56f45d493da745c3745683707d44d8565b40675f5c2825fe37b08b1556608e1775dcd06a6c68180f49ab0084a2b3ede92a3a44638128dbbe5159ae56969fd4373d0bb183f1686c143209a363a7c55ea8b53f4243506b085b114d2dc58904ea27d608665d73b02b1b55f7d6d4337f13db25d6c9c970f9921ea0166e2bd896b82f675b59c09b463b6cdafd01a1eeebf5caa18841bb8ada634f263cdb4f2b5e2696188df0731134864feaa38a908210eabd52db12e245176136ca45dafb28621da6132595407c82f20cad72da6a94f6dbfb5f59a5064ab6761ab5bbd5f57aac83a57dabafed853669ea4af159f6cfa6b1cdf18a60ef40c289450f253306c74442dc81a7a643d35ad232e9a96ffed827527b30f5ac64d04081fdff0c5cf6b830409344a2e10a0ff5142db42085485a81a84d4322f22ea23a488badf7b88df47a6712f124ca0ae0101920d1e0019efbbd9a8a539998155db7c537426eaf93242a9da0aeb3c80aefb2c85668714dc663e20f7c87e308e1aac0e048e6f9a9cfef46cc86a3d943d4e3e30916a259cf883bf8f1690887a85a305c8108c0210e0afed8db0dfa1da32e65abc4a7a622f1ae2b08279afd0de248989390bdf96d460cf8e7b27ad80751e11d13e1529d531afeda1899578ffe1d72896df5b0b866b99d867c39186720b3b5b222495faf75b142f1332fe8e6e0c0a1acf398292692cf85509e582ecfef3271cde1e216030f2040175ed194293e359da92c626f6b7bf18bfd55f70338fd37df155695bec2a9cec1f5a367a4819de32e272139ccaea9857935a9fee0c9d028c5338b4ba113cc238c3309d9601587321cced8078617a3f515a2a3550daaf26eecce88ea051ffe876b78980f100e838a2e475bb2e6d0f1a728ea4ae4d204eb721c8f535b330eca62246c59f1fc931a532d3ab22334fe1b0579b5a79477ff419b1c1df6877307b51c80b853686ccdd2f5e24ee343b8cca975d2acc04b43c27e50b62279550d32491d47048f5aa7e336d8122cf8f9ba602461f9769ff27f7629fbb043e2ac48b80dce41f713b1f6fecb65887cf82c81e21430b7bc4c727442cb03d32a3b766dc18995353ae953a1461b020be5ecc6567bff4ad426cdb1674febd0e77f8c9ac47446dbed75192af0e2ad18620fdbae81526f17185b2c99a3c411cab4e9db0095facb092f4fa91c2afb091056a3cdcc4a91ebff4b0471116fcac65901113290287ba085c470a31399b8b850af49cb08f85dfc6a34c8a200128990e5989f9832c41e4eb974810ef68342414235a8db4ad5e128c09c50c950d528fad63f3a16ceb30b5c0b062af3ad31c02c4daf69087a2742fa694b44ede800d08994bf8ab24c3b6b52e54412591feb5b02d8e733578037abf7cd094b17b0dba8c787e0387694a566b9aef4e24836f93b494da3afd2444d42a9549e0d4e90add93b1769ec6a8e392318cedf41c9d9a2878c13ac8580afb12f9767d1339a70c08a6dad244d95233ecbf7adcdd8e2f02f685092ca5c69a7aa9b496c6b6503385ae4e6afd704ff39fe85deb3864f9d64e8051f32c4dc961581ae48cd354a92d0c40f2d874bb9b0b9bf7a5648d14d021b1587805b64ae0ee27f8f1bf0f48b4e204632ca9b4813b18ccad1e6d4777a18fefe15fc75707ad9f4e9674a3f73cf40112775465596ba099867b317bf417fe7f5ebd81ae8b1e700350a5d5e2079bf6e89b101281cfc57c0c7dd487071f40477e923f7621cef9e8a8c299adefdcd03e2712afef8574392df0076b779525bb0d1c0ef9b5c7af2477fe08d45523d3842a4b2db943f7033126c2a7829bacb3d2cfc6497ec91688189e81b7f8742488224ba320ce983ce9480722f2cc5bc42611f00bb6311884f660ccc244788378673532edb05284fd92e83f6f6dab406209032e6af9a33c998677933e32d6fb95fd27408940d7728f9c9c40267ca1d20ce920db5278679dda94d78254079654e3b69324e446dfe98962cea9d6a432993b22f57750a6d0c4becdfb0ab2372918082fe320ad56ee72618209ed0e78f00e6362fb92e4298139bc7e7cacc74611cd69c5a1f432e56575be76d88a2c6f4c9a1c159dae9b64fb756a42b6d911b8e2dd8f1459f02376d78bd6bdb4f1befbbad4dba7663ae4eda2003ea7542000041ed0fe9875a4ed8fd72d60d319c434b2bd3718b4efb83f280752a018bf1240cc28302ede7fa2ff94c6d2e33391623c08e63959ba94b728a8adf53513521022558183a632e24ad82a3904b47b966c2372a8741524ffa82fe408507423d7aa4344dd43db52482d15b4a03b7af7a3328994965fe1808b1bb36ea90cd3c6aa61122e7de954991bca26d89effad544265ecc312553559b18261bd0272ea7834a51d56f5fc9893d7a289ea87c9a1fdfe76bba2af0c971d1d6ca933a73b1eb51116d372c7e62dcf0636cd7eed121f7121d57497eeee7d47294b0876f9bde709ca06c2f6864e7a9711f7501a51717c4a6702b63734635e746f9dee0b8c83d9e2ba256a46938e05a89574c02137502ed648aeeef53213b1014ae5e845d2257dec8bd33807923d65600b3f7c480146cdc1110a8d564a682b8a65a385da6d0b39639990caade4d50059eda802d361bdcf878ad61fdeffe9148c2a67252dafbd93047dfe80ae0ddd6cf2a75ee277cb3dba96007224f3b50f026313a164a43ca5212ba37d088c9fcf01c6e2b4a999904f05790c6f2b392c528bcbabd2b2f2766a5a65a48cb0cdfd1275430a59b6ad635a36ad193da113a85c07127d8bae8cff65a52efbbe17e6c8502df398ae9847b6f7c4aeb16e1517cb740ac3f32ca5d83a3fa8040371ac6b63f0a2551833dced0d90460a6f60f5ba08330d7c97463768b950c9716657fcc0628c58f3f389e301c9cc212cadb6c17ee1219598e458d1b2ef318ff39ed1779a368bd83cd501492a9df3ec91e6f016dae8c839a564e5134b5e5a61f7176ebb3d7267a6ac174a7dcbdcb01ee6b57d5462719f402e836b6a968953f6186a80163e88a82ade44b60f6a18892e7793ef088a2dff6f90ea6c5628f286a2c3f2d63721fbd5fb2fe7e46c99d3d791e10ca5b1d670910e78e46854772c9b0e965aa19c6c4e799e3d7b4613bf8123ff9f8a31debbebdcb3431bdfe41599e98fec0ca29491f2fb6a73696ba35fc306be2f8723edcef23ad48bfb438368bcfaad418329de177be4065e5cb58a0efbf8540dadfc7d74165408b00d23c1051856ed3358d7c7816bcbf87aafc44621ae6167b6491bfc3fea80c66bcc011b5f3e86d63df81cff54250b9744ed18465c5cea5fb5f312e8a6c17983fba25bf0fb91f2eedddb69d4044a2b89499f1228f389fba2792661d13d3d76c7fc3aa4f04ea5339d7f8d6ee4164db434f520525caba80dd69c7d992467d13108f9ff7c87ed0ab178bf886cbe0e923e30d43b496fd94999728c432980bb1f10dd516b33264b1504f6fa5703a051da11e3632a77c100f136fcd5218344ab699e9bbef86959ed66969edc63c4698467e7f32e886dfea7116eebe393370ebd5342fa8f41afa13871fee6c2592f481ade18b692df8c87502c99a64412c53d656ea6404eb1468ad0c9a655488184ea89af3cc44c8a53d980c55fe2732abe5f481e212369d1fe853ac01560cb8795bf554dcc9298336493bd5e29f70d3572f2b9d45c0a8d2e181edb07c49fe7d5b235125c30a812453f146a69707a5edd93864f43af7c152023b646035c7919e67afa253d018b574a33fa2c79cbd3048d80988ccea3ee9e42b1e9e0451572de54406d2272d7a2b3bcf3a35801a4977acfda87d6e7d1d8852043384e4fb823a189a30c7e9ffb84d417eeae8193934e4e1f01f2d221a1c06623481fe4859cf200013366be1715b824d5958a4d92004ddae58767e30e9c4ccdd6410f57793c64865551fa457a8ea3129088b4f0af844ccdddeb35adf139c408a3be94fbad2ef180f08f35c92cfedc49b328bd2f2e879183429e0a878c02dcb336213f6593ed3f9c5d5bb7adb0ceca26c7f6116d9192d297ce204504317fdd69e8096d09cfef95451647ee67a8770336499140209b2e7677cb02839884196c7943e7bc7ca3be98f795c4488b76a00df4a25ac7dc9dc303afe3c534d8f668007dd44c9c22d1c2c1406651548d9da250ee8ce327160bf8f0ac82d8d739fac41ff413988a80bca4949bf29fa0e2a0166280439adc517828c3fa42cde93023e631688c5c163ad6cc8986e4dfac2f0074b9567112561364eaf4158e14f96fe426eb379917bda5b2b3268d97c1e4c74145cbdd9fca32d054a8178acf3e762dce1e840de45bef55d2f0e20c95c6d94fe4e220921a22d11cb9f894d6a0bafe0e4425b247d89929cfa9fe42a0695ef82d6e024df09adcef5d2744f2658d0adf85d8e4ec71e0300b77ba33ded58d0acff43f0eaa857c28bc160f25c6c40ebeb9391ec4a918b5e0f2e28659fd187b5adf18ea7fdcdd48b6e5dbe403788e8037197c685d6ea8b40c8e9490a953e5aebf942002ce4b448b07eb1348868e018c145ee45807a3ae55231d126bda49c9b1b98d8dfa827c77bd9c3a509ef78de9acd717e5606bee9623b55cc07a4565310ec939d73424f6d34ad4622879feee935cefd31403f2b5fcaa339c333e732cb8207f1770623e30d3dd40e0ef4c05268b06cefed4d524804e534e79ff3afc06db813ba50de726b115cf7235399792dc5d450519cc3689d417a9466468f24899f7cb9f60f445870e05abe8ed7bef3066769222a25eba8b37c536bbea24f6d14ca94a1ae9c80fd79e2fed05684ab5665b6378983700d3b111e3662f89a7ab3e957c972eadfda880e7f12d68340a7c9d21a052e636571484090ec201a155a1d91ace3d4b0c09a21b71f5c771ef5fb74d6fb9cb9d2ec5ef8c6393d4e2ffd35d49333aa710a2707f2fd2aa65c2e8af080f8c1c5d1d9ed1e732d80f0943c3954ff7753e6eefffc6a206708b62cbbe7cc15c1d4461e7e50f7e0fccfcf994bb1ffc7c6735ef697270bd67e215490cef4d75ab89de74acbfd3267bc8da006634d7e5407fddb2fdb90323ac8de4a306d995b78658272fac8dc1632f4212c828df5 +0xc16f349a856d4f9146bd281fd2b1502087f75ef0e2260015e6e3201f22eedbadb0dc40ed3c9e99de9ec5f761478492ae +81016 +0xb789d22f2024c25aed11387b3e4761dcc1068e5c6dba87717322226971b114f5e93506e7f3b6ec3b2ea19254fc267789efdedfe07eb12419fdf74defccdde19ace0afe981c83a5adfbcc58290c51e769c30487a01a4624d8870bf8332b395d774c52dfc9055396b93cdcb37fd590588425bfad25aa4330b3f9a74cbef78f2e934c53d40315ee6666d917cae0bfad73e3fe5879f5946eefb43b13711799a5fcf6b75702cdb41bbebdbbc6c6d3326edf8d3417149a428f0ae235978ec6774370a973a494af4aa446c4c830cee1969d448ab144a69c1a702845d07bcb54fb3331b36a82b0313f4fa585e99f0b9053004ce35b27568186d8f2e6f20651488c3ce81c823b7fdcfce584080759a46bd1609d9f1c084dd3ed8e0fcc8481482a91253deda5162837e72d8a5308a7c2f77984dfc6db2eb319b75b28ff6f34d88374b7d72dba5ad3cb69f16070d6d18dbeb136bb6180e2afdc4b07e588996727d99cba5fe4a950aa1eebf7ad67571f2c47e23cd877f26c69a3135aed6eec6260b771f67c1a5a40d2bad3081a3e75d9c81a755fe0101b140af6761ce9b94f6ca9a25b32d7d8b47176278aec4fff164688c0d0677834e222ba5ddc148072a9cf2a24c2381825a12dbceb796bf3b224af95c05d1c4aec2fdda061ad0b5ba0e4d10dc40ecee60a09bacc90074dae5d865c16a28346fe3fea8ee58952c9224be7bb770ba7bde98ed261cf9e9b592a0a249534efa9ac3c36fc7db05e31167c7b9ad5927ff6cccab9e56aed9b9f580cc0e6a2172e3917abd84bf22a67b3ba1139e56686aa61c531932a1d4d117a13ff88b4cae6e79a4ff32dc0357b2c407c8a8cb0b87b14516ec52589c21887944fa9697657caa2341cbd3d438dca3541258f7de31198432f912f76eba0758655d7b26b148feae86f46b111bd443f0b1c7dc71366ba05c161f4178e36008d952572c39676bb6f40b39476b014a004353b4cdb5621fbeb1651602376542a883c6ce784f38522803368cfb52232ea3e3b045a724efd1b72c8659cfe352b668d0392ff9c89270e4648f6bf1570fd6918a6e16f3504e064c16107724ed3a5fcc473ff82b46045c5e807c52c3fa15f67b8fc3952cc7fb41c01699ea8bc59a93356131b387381c8908ff83ddedabd3f2a46c874ccdec75f8c59669207efce1e556b6b4fe882f396b763a4c79c8fcd84fbeb8ff9a513e5cbfcf2e24a57903aeea82a04015c88be99828b92c93006d71822cedb32a515e0deb3f364306046a60075bc659b5a2eebb739304aad60e6e6e2e71933869389c082fb8575abe9ba193c03491683ab1c81da237955d9f5d7ffca92f1205d391a8e9e1ad09c23bc939b8a9cf8a02317f988e9898f3ab7b7832cb86a8029205d6e511959fb61009f7a34d286f18ae1656d09ccb39981ad6d8f7494b8eed635c82d11dd002f4cab5b17edfc0a5d5c275f220a6be9c0b325e1a6e046c463af054200d6d15793e68ab811cdf070649f5ccbbd96ae732c5786d96e76b7d6063df8938fa9dda650b6067d11dc97002ddae772e9b27d9804f5381e8f40cd36ff0777828191e9348d448874be23d702e195321c4c68c0a27115a378b246712c7795e8d87e97dd4a73197663c1a999bda759a4908ebf5fd79a402fae7f8f8cff9670b45d30c2a1302abc3913c177c67aa8aca59858c04280a8fd448a9d2304f8831f44d93c1a1e2ed9b53a4c679344810b199dfa527151e4c2d54ad2b50ac35f672aff144da73a8ca88de0d55b07fd1af925f47f23dc754d114fa94f6e4caf7c691a4cd50972de91c0cb927844dbd78d9a5a13ef73099401bcf3c9c971f2b296b27695e61882f38649f7bafbca15bc21153f6012ecfe9749ec4912086504b3f669c6410d23df5fb36a9abf2796bf931f935c44b034c5676dc9daedd3f38899e5b793b813d2920c604c3b09c450e044cf3b3a2890f366eab57a2dc0f3c3884ea9c46361c0cca2e0d51762009aa081b6793660727bd2e70a6928caf4317c0bb98ab7c1a6dbba17c559f2970c702ca9d365ab568c397852aed0fa3af253c61ac2d2b832ee2e43faa236056395109f6082dbc3a5dc928faebe33190421214bbc51c7f140a27f10525eb2794d03409faeab22a6d4cc4ebc0421daacb0e865b0f94eb387722897c827e31676debec9d49c36837b6bc234a95bc10ddcc7b1e5a0d9a1dca550e93e148118aa239c2e73e8310c466af3280dfebb8514d1d0e36ac165338b71634d3b9c69e5b5a911bb05807613b39df365a1622d5536b253e5bcbba4ea071332bd5807e6328130c5ce494771341139f3e1b87eb719bda7d821a3379faf9ab4469f5bfe01e754df3fcd05e22c58aa697b041afa64b9efdae8fee7dd5c6b8a7c255c0d28c1ed77de072202fcaf65c45314368e7d391e15700ae44f54e5042092595d362e2e2a3256a533083b0045a81f45dfdeaf402e7694c73ba5454264a41f6a099eb75087cc6fa16adf4729de9ef69767d03a80d25c6ca66caf5779715e4adec70c6c30ec8f50842e4ec9321aed0091362dc301f30d202fdd36339415953c3f014af4d542c122d6e61e6921dfdf64bbb4bcf5cc77d2d9eaf701809a36931c141e1ef9476fab0c1dfc17ce0017ba4b9d4a4775e848f3bf6022dae794be9e13e68651208f5d9537e3d701a1d6a9c7dcc05e94ee5d4cb8f918c787108994ff493ca0ab13b4f2c6caafdfa489ac7d4e40ab5a6d06346d69b09a4cd1a281a0fee59ed6f37abe1888ee0a7cc82f897b979ee6a4986574914d0b6f1b804685cae210948ff3fcb6b621cb7b16343a758be91ffaa6ddb425a2ad331e9a5ca39bfaf5f1a7347142a3b4da888a15b15379958eeb6ec6069b4f87d14f2f332c62ce187db15e2b36f48df9fb4ebfe107229b81cc29ca6ed9c1fb2801882b4dba2a230cc37742dd0ab97c6fcc44a3e2fe4ee537ec01970520cf316d8506994fcca4a4be0f6cdab2b43979fd9593bd815d805f9f359c5bf3a16cf73ea4f001a32b775817a9b7ae13fe1d8b8b9d629524ee5f10a2f122a19f25415783a86eebb09f4c47fdd8824666ae0dbb022ddab4357794002666bbee7373f65824d7aae0def0cb7a59e5f22b148db010488d23a11ac1c63714de8dccd6553202097ac96795e59bf8141831e48663af92460564e43d949ebe559fc3c230919d5e1bd8f6093d4765c914b967f923f8b149e4ddc50604b8c49ccff18359eaf0e073403b574d3eded0f64310bbf252135f3e0b5c6f8ed9f4dfd96c1ef5176a3aa34a61e914bb01728586886556587d7e6178a1cb8a042311977e136d438719378de9672b56dbeccb2b81caff60b30bff5eff8f723df149d89691ac25922e5fae475a3849453668b06bf0f3270089645fffdcbe99b1dcb50e811d1e8f0d96a56979a5be8b0853deebeddaea255e64f065eb1615880e4dce7e032753f3d946512ecad0df39c8bab44258479741a3cb16dbcab57b867bccfcefc2b9329921c6cdc6e2e5859aacf4547e553fe2c3f747418746c2dadd20e2a72866daa3c80b9f7ff96aeb97f7dd8824678bcbb3f2815fd633054319d3261637f298938ec9bf58d18e0aebfd9882fe8ec4a3f2f2176a9b3ea5af4320b1b5f1141500ebdbe566792a4f69ec9fc5c4dff85f44bd877ad983e1a6edc7d7bff4faa75945ea7361288af10230f665c6cbb2ccfe17325a63f7a027fd67d926440cb956860f983c882c149070061137e2beff716ac35c541aec797974c480f58a25b68a6308fe1fa19b9f6e619446fd63c54f4f6bf1405be6df963dd1acc52cd7657aacb9d62304f39cb1f39d829c9f8f0a28cec849e85811f880ddddc9aeb374f78c2250210fd4c758d487eb771c05afb215564b725b34e161bebf60c04672a9017456f092cb7565f78f92141bcd170ae89b4fba15a1d59f3fd84d223c9251bdacbbae61d05ed115a06a7ce117b7beead24421ded9c32592bd57edeae39c39fa1fe8946a84d0cf1f7beead1713e2e0959897347f67c80b0400c209815d6b10a683836fd5562a56cab1a28e81b6576654631cf16566b86e3b33a108b05307c00aff14a768ed7350606a0f85e6a91d396f5b5cbe577f9b38807c7d523d6d792f6ebc24a4ecf2b3a427cdbbfb0d943c3f2ea7de041e5a7a501b03dc4ff052c84719e13acd280cf23a68033059bf1dbd62d9702a2c829e5c9e54f1496793abfcee5597df8ce6e439fa6a33f605c4efa789b7ddc99c4bf44a0a736e4902ec1f1e0e68069a48ec228fcc77869369e4b0029c111742be41034b7cbfa16688c557348e9b55f36a036dfd98d52491ebe709d6822f451df92c7467dc81b32761e4fa495636ad7258f36d8a46cd3478f594a12c255990e3b4d3eea61202cc14f511b1624e8135a07b84cb3ebea7dfceeeb4210b6cd7201b59ff1a11068712b6ac1624895ec416043b7e2f21e8ab4c1d3e0f307c3ff01c4d4f789fafa15bb094efbafac56e46772701a8403cac21a4ec4c6d778686eeac02fe062789c9c5cc3724c4dc1f6650818f33cba796f3500ec482969d312917fac0ce7157a5670c8f25b5fd719d2e2a5bc63baf0c37a381b32c47514b8511b42b122780d90d647920e8082d624aae1c2f547f1c1528a6fcbaac0368298b240c6a7d71fd55c9a654a708871c562bcf6e22bf69da6d70e2094ccc1fa1de4a4b69dd8b14ae72df17e54e0b9891f64a77675e915fb0ba1741f0911501c513ca6f11acc3785bd9599e733b7ba555eaae8f500b51cb68a526aaf8b00e129c6f14764d00ad05ce323e224896df1531d95f0071508814c8d5a4046ad240baed9b2f4a6501d224ce24978daa88c050ea6b66b01256bda299f399398e1e3162823e23d1a1d6b93b22576bc6e239a5be4b49ca897b4578dda2a60e30acbd6b702101f9f549a8ebb49374c2b537d016c71b1b9372f444422dad9709d10cd6764e938cb89ca49eeef5e923a542f3759bd32188c952c47ba1fa806d9504f692d8629f8668b0fbe14c68ec0b1a555c52bd4a2639751334131face5d1b7b1b1191b160f98121896988c7363d52cd6bc8c0394f2d69f9c8c3444aba16b79c08692c6d1aa69bdbcbdec37801828e0ad594ef6194d064dd51405975f7fe2e219bd2562fa37a27184b805d4f6d1ad40c27cbe1c41ff7189a613afa03146dffaa59efc76fb7fea3658ce0aeb3d570c53fd6c040075cfc05af7d359e787bd09ca4a703c8a3b4aea1520492305bd72ec21477349271b879bc9b09a2cf5caae0959f17d1027225f4915c46f7aa9dde9f5b386d7b51b9deda9dcb9b1505163df86b0830b9ed41888b03f2c89345f0886d010a4e16f6361ca939dfa60ec83b81829d5e6630e19858bc79941de7cafa30f254087d9a087d1e500145cee291433239ad204cd897ed131352ee9b87822174d9b4c19076f0f53089948c5a52e8b3bc780afc390378c6442a3030d5d503fcc08db3b40b2058451f906411ecb247037cb83720df63fcaa786b82296162d8e2a088d15e624896e3281ee0750a9324c91f84c25c945c9c000c51d926a2b37989a1458e3f2a324535e68faa3428781a5b01683cfdfc6fff7d8c6795b73e495e482f6e4ac4c78febd3d76d11cdbad3806fcedd07936c107f698527586978970fb4b74da78dceb3e3337731b7a056280f4dd44d92ab87e0945a631b919c061ef635e57e24f8a430d3eb42682c5a7ef81f9bbe449ea4c442e6d6c2bec1fd5b53ba62166a33a3eca92651c58ac06a89c629cfe96c6c1da5d9df55007b69dbecd7b4bfe6bc640e0c6f630d7d14145f2b14c660e20f8b84b0f7f65bc8fc19d63f1d8db5c2cf26a588060274d59ea886c7666dd544a89d685a3fc461789b226ac697adda373d0bf8e40f9d3e6b84fd9fe33d98b36de1e2471613b1fc9be3441817c88d93a0608476a4ee8bb0bb5173f902fccf81da262a8f79065783af6edf5ca742a588bad410ad5f15667221aeac30ab368aa7260fa6c0079a1d9d2f9854a6f978ae1fd322311b5726b6095ad726b5407d42b9bde9178726518cbf98ea548582ecdfcf85c5863f4194e2dca3754415773390302e5cdd2379af2d5177ff5f86d801e31e4f28508782e28562b7f3b4df93fbfb80d3c56843561568094921c6197d7a3092abd55092bf920641e4fcd9623b28dd426add59656016c53d890c38bbc79840b30856d6df3c25fde0d6db224be15ccdfb4fef20e80c45dd64b40917fc5afeac05f11783cbad00d4c5fa293ffb0b0a35f1ff854f69df05191556c2f449bc1fdae1f2b1c7e676c51367cb61830e3cb3bdece63a45594ce6f0d5fda44e224f7e45fd999013ce2de5325cc71e8be3daebce32b0789344da6e0d1cf5379624a99c85bf324d07e136e3ca1b79bacb1a8a14df79dabac9ab0c0cc650f9f76cbf4eed028d794314ae2643430a5fb0b110beb16a18c19b48fa5635a528586e2250a3f2550ebb1cbaa3707625cfe5aaee74dd5406960174a1c14d8b21f9bd0657973d4ee5b994347a5faa0efac2a803c3a58a7f3d7826e1647e568fd54b844a8ce19f554cf48114c43137702a891355e1313a9567458e6bf1a0058637a43ac532ce3ea7f365fe4838d6ad4c4d99b41bc79662292c74b46ee9d4df30b18a6ce0e9bb9fa96174884948ae7ff5dc6b16bfd74395cce58c4584ad7b5801eb648727f24836fc1fb6ab92643733ff4f8397cca0c749d33b029e27cd01e46c3dc916251ce298f2a692d4be1bef4deb1f59d3dca4a002ee956e3ad2b90728e2313e9652aa294a3f6e9f9016f055422bd474373a635c35717d25b81002097a065e2b842b3a6aaf2500336a475207954407595e905d6a65fe6adf825a38777c4b3d266c293e454c65e404cfc9e154dbb6108f966903391907d6e2163bbcdf842326a5bad72647b654827a4d18feeb6a14987d9b1ef566d30059d4001f0fb04610c3200cbfa2d05183741a4ebf3b39e4c207a9c93c9472088a5c3bcc8ec17826b69b2bbe3d146dc275314b512706aec050d6aaad4c60c94e08667fd80542c59a67073f5bf9fbae6dac32a400dae1d881438de6b3c8fafaf80cf116bf1d33f735b4afc17250d8e0d79b00baba556d359c1ca5e4792cc385bafa9496ee20f5ab7d11ed587dec2cc374b413d5fa210954954eb72a6a024ad7fb63c986e1db0840d521587afb2677c4e999f4ac5cc836a3f14c2a3f02c401803ddaf85d3685fc65d245799f668a4a439abf1ba44ea585a244b78788dffc880ce6c2a99058cc4278f900b93c3ca204ee0c9601343c6376dde3f347ae5e163eecaabd75a6c5186af8cde5afe809e84812b3b14df2c26c6ac56381f2f609ab969dee2dc52707e4d663a566b6094ad7746024834a566d3b01e7480612167f173f9f25861097addc3558240674467bfa2a44d3ae8ee59959bcb215e21d860af39a6ef568f06f0348e834ce3752f619cada3f4575a416d3330bc431987dbb59cb279bb248dd13c4c56f88188beabea0b3f4bdfe8af260a7716f8c3fabdb2cc8087793f0a84f2c4edc4bd0777693f6ad500a5f73412259827f5878a49e8e50f2360af63509cf1f2de7fd9c8f89f7449c29ab82285a9c77f0c77727f4e33fce44de321103dfc572de93054ab5388d0ef9ab28c49219c9327ee42c08950c480b5c5bbd92c1acdacdcd47f3797cf4bddc425f32a55511412f995fe799299c3f9e9548edfa02f36766968138976b51123312b02992c5d39ca5bc854a6816f59ede8c2053955c4603f3b6d95522f4d01299c738ae1b88d3245b651eb4e3e1baee61ad7c7f13221738ebaabac9aaadf44776ec6310bdf29280b73f66d79b0e4e96be75a7d0f1e8e96ec4eea016acfb3019510ec9f1e8b7842a2f8807f2fc1143205b715ce990352f1e05ff13cc98611610ce8ad7d22a3c3a994afb6cb7958f2b33af2ce6399c8b6adf2558904c0b7408c6260d173200f528469fe62f95e5dc59195004ee3165502f2aa987a01564a89a922df1f281eb76dfca74f4ab1e7b9d6f79b495df719927ee791908cdc932734e0d1cc604527835c39d809379a1b526d0bd636c247a96771b52ea6863d7f36895bf9915c71405b66628394f25c0211d1f5cd2d477acebc2583094032cb2360cf3f2195db557327d59f315840a0a4de4cde0897b2389079e07aabc8562f868b50b7d240a599c7cfef1a69bdec0e0aa224ee10ddcc2bf886ebc29ba4bb11b0a052e893fa81e4453bfdf8b32bbc4d3b43a24c6c655df90dcb8e82613e2917aa881efdec2b39def3534664970a7a063fab0e21a4992d4ad83010e386fc68ec7b29fc1c653b9330db0014849ec2ece01fc0b09441e003c75f9ebb0c91483f362b6d336e879358820528ad804fbbdb84e26ccfcecaa1a917acfbd5250a89779ec33b0d1ad999507b77b45a81335d0e999096b5f6c746e5e3c731a7587a26d8cb4a7ad048e4b642c43b8d63afd0114fc83226a835c03680d3b62679cb68892a66c814c5222e52f70559991031b13d64b9ce03f1b33ed9428e83c493a65c19351646f034cd41d638e5d7c2a9305b4b16136f17d897c897f2bd36f13c12de3ec184caf66574a5a8cb0cbfef75d358a12d7e1a49a40ae7d85a07d597bd37776095575f0e9f3de03278231908bd432ea971a4d9819f33220440156a9d5e3caee77a380a202c507cdb09d2ebf4c9a768c9aa2ab3a70f3b01836d8efceb67490c3c38cfd51452d6010a44c03f9de1288b6b9fbbb1a43d490cbda91b9469208818c597c3c7d25af7f529f3961cea4dee21f619fdd95e7186cc1bbb6439ffd11f5aeb5fbde8438cdae29fdcfb8bc35420b2d2e09835bef319c8036d10f395c1365a165764414d2fa84fd4c898921040e6c466bc35cdac0a2b88de85c8ca1339f6a1af4861d9d98d88c5307e153cb95769e11c757ca711ffe49515cc33c7618186b61cfa5bb9d0eca3cb1bc8198ea7e2d1905bd214cdd31a6b760e0afaf167e10f21c735fbe7189521e9fd6c4c92c028465a8c9ca647dca3e9b33307c4510ea1b96b16c1e96d9bd029a73e33574fed73efc5159bd91b12e285d5eb8a3aed3c08ab1b7365cc533fe4e38e46e5e2cd1709f45b5f9756535f1f68639d5d04cfda5f0eb945ea4c9fee1b78257d4a941524337ea4d258c4f7aaa1b9e5b346c9ffd1ee09cdf419125b8fbb10f44c29162efe39b527d6a5cc0ddbb1a1e4940e318307fdc5e0e8b8c68e0a0dd284194c0f208b63c06cd448169fd99748e7a87de66566d46a79888f10414759e75c4d7928f4b5f9c7fb320749b48e9bd576575a8dadd5bb1f213e68967b2de77705517909b16242f45d5aab0d55e1057119096fd1613bf90c5f72090344a6fea9058c14595f7c876d19b2fc0c89ba1c43592682578b82d75abb8a3bfda49ae7a5e66511c107ea105ab7a4c1eb58012974bd165cca32919d31bdefc62ca4efeb942f463ae8af9425e4bf97c455ca9e742bce41c5d05f5093b8ee09723a4b8e509e6996557762620e33baf3cbf0e87a45911210841119a70018d54007cca25f5eea1bbc2b15253c126e301f9f64b97be4ce13e96337687e2e78fbfd4c8daf4a5fa1cd22846b020a7bbda785085a458a9809593528e754bd6301e6a60a227c3899ea082f282000b48f49a98ccd7a9590ab6a6a5d9ccbe64ce8db20a50936110f55ee524bdedd2722973abd9cb86bb073631ad0c7878b2513052d3160116f74b9dbd436de6f4a803ddab86c1d8fd69e1d094113ddb1cf1afb011f9f41ea75af1c73c53950a40e12eba2ea3c771b626874e406b906e13ecbea26dbf4ae5bf1ca2265e9e50a43d2e61535f8b71324b815623e924ca9e18042c9ba86b7112e8bcbb2f867c172143d02a4dc0b6557727fadce5d0d5430773e8781064b71d129eabcb3766855f1e1f8707edf4bcdaccc60399f8a9e57026c20a0f85250a95615b7a40f25132af070aa388d86df777bfb03c0bf0d6ddf8787cd9718e6bde708b9998cad4e91c7d58afc60b719efeb2ac80f4a152ea3732792ee74c809bbb44fdf397b753809b409f796f2e6dfa5b223f82de08935689c4a532a3def047296934d3e794f2da47af57f1ff501212753cc5604880369e3e058942afc771f09173ccc518f23738aa000ea4072f0279d568fa93d4c6b143dcab91b95b847a2a8bfb2241ac3d953e2ae91ffa0709b393044d3b87f34a97c9ddfd5b0147a47d579155d1d401f5915d42d1287e8f7ea9f07a3ff4c7347a6e92ca9151d4f495f00a1a1a67f6cab8b018aa4ea4bbf10c5a04cfe7d2dc08d48a512afdf29ed2d776a4bebf311456e585f299b8110cec1148624dab4230f0e78f776799c9b972e775c9d7cad9c7470a676dc9a3fa1bc14bf97b9c10cf608d31f268090b53cf455471ebfdb3de8a0b95f8fc92a8cc53211ae1c333aed6d52e3237b5a7b90d4ada9d0f8da9009bd725269f218d2d043d8bfc95cbacebf5296466e3e29c2972b6932f83216247be39242aee7f21b73e45526f9a17403ea6b7b05e6b718ee3108d1f9a8139a1efa21a79114b67f8cdd70524e24318c64d681aa27752d4c86c5348c05c9e48f06ed41594785a6e6ad76af764033552876ec5bcab402eaf012bd78435f41ee1c65be09526de8005006a7686a030f5571c392c384b574342a1a809a9e0dfa766ac1d442370b240de420d665d59f9e798ed2317f8031b554222776624419dac7a1a597b4b3272312cb826d6c601dca09a72b32586530ac9202c0079ade8acb28e8966f266ccbcc5a2cb4d246b3847a4ce657fb16dcba4135ef6e9b081369b4e0671ec4610afe072c303f6fbb75dc968b71ddf6818cd85c8713b89a768cbd7c3847c4fe2e36c9bccffeaaaa924e2d050e70458a601e91e5ce96266caaf18e0d78b01085539832d38cc07ded95e880b11d0c181e7d39eec453a040796ce9e54ee8c98bc298d74435ab9b419f8ae8dc81006cdc1c9e86f5e25e578f2a861cc927cfbbbc1bc79b04c874b97d273af94a5dfeba1ceb8cacb02536e69ae5be33428077ad2cf9a68e7c752e42b9ef6dc1d12d611b5df30f5427762573e913ded6584126c861c5ff56b325235e7d5eeae879d96fb9299cee2661be7127051dacac14532534e5e5989bb1be993352dc7b174a4a71bc074ef3c966e363297569f15e7d9cbc1840c339067f29d9ecbfd1e6f64d66ae4c8071e4e63ecf43a2c16174939b05329cf8c5ac3e244f2baf4da5f42c8916708f1b6d8a24f26859b9726cfff47776d1ea9755b8eca817d6a482c16d620643fdb060aaad2c8898ec970ff1582918d8df27a5da24b8146824f5e98b193fcdd39fd5d79115a50b454663205a48d98711a57ea8bcb9496f2c5bc7076cc06ce5b09b27098889388059ad462e0e97acca0b6b152a623f48c14ac44566cd299056c03ccd7df8d38df1bb6a68c0750d4cebac7914b2367e5c12aaa7948d141d5429edc9efbb4ab94b6553c5f05ef7725ef1de16a4c99f3d2e6b344cdf04ab6460651d89b74ce4041be509050690fc8d8de5888bedf5054666d3d0fa4c54f8c65b123ac54bb7307ca478c574d4dfec277ece922116c1d05fab5366fb0304650bed392bc6d38494e88f266f587fd22f08dcb4e31d47b26951a5f2de952d9c58fabfe1d8d1783c7a1183f7effa32f22df84da065caaa5236e3fdb82011f2a43b5c79122931616649c029f42da213c54fbf7998ff6f6428a0df5bad14b779a575f9c3d4062cb88a69bb292412984ad5fb240aa79953a0bc100b66daa3ceeb276e994330570ca23042ca2a90842300aa9af1a5d21cbf8497ec31c746b3a06fb08e04a42d041749e13cb7d43e6c8c5dca95ecf4236efb38409d1726f92d732eca3d018cd4f596d524bf49d038b31c88bf52de9fa1784fe53f8c8629fcfa9050fce35aa42c13d06e823347c6863f18aa113b8e4e542203b31d20457b56003ffccee8d5933d440f3a82007a5d2efacbea46b7c6a845555ec961c01ec20f29c75ac9b43b010f719964ac8eaa3e3acb7c71e82d4c557bf7a95093d6d7a7305c729374af5398ab83b81288459e11b19972667f07e9fefef12d6f3cc939d1c08186cf5842e7fd1860b16d9f8e207d9c4ef6f291ac654bd72c2f4fe3010ce9c77f4c35fbd3bddb5ef2cf9c78cff62a02d1503da88488e30d8ffa1710e618964e400ceee7cc9fd8861f59c79b71e9c1eb0ac86e4bf71a6fa801d5f04be024815bab0e21a493539c96d1961891ddc1ea60e1a6ae036de296b16c07021d57fa51f9a899f7b892a1d099efcfb5e17a464c673e3124564ea9012fb7d9740db360af2d1ff698ad2f531c94614dc613af40900b09b2f9ce0237572aca936fa45c1f4301f86e2b0bd42f27910f5574b0e6765d512a7154f3f15441ab8d7d1a68baffb47c1b47d958e8ff9a97e132e63f86b15c4389b65e4c84c867b8e8de9ee335c7aba671c9c91ed3891cafbf2a4648f7b935e80fc93e61215a705cc300229d3641cf88e03e24e4fc9656e09187b953a0568f48a2f11dba32d4059c0629cf1d2333c92951ec1133cdedf0323f8f69e9eb50126c2b7823e01dfccd8299a2cdeb66664092ad1cb992ad5891adb18b7e913f6e675b93a4775a4c9b711564b3438f65a2ddc9da174389049de15acfc220d40479361dc0be42b02578985d4fa359918aae48d8c222d8a03b858a40827e7539a33a26bb9c0dab6b125deb6343bc397a3c5428c64b88a060b8d83167b005a8488276e03c0edbdb127910112e264408d2e25a259c5f8fc250e45e81d842a1df890af80ca8fd6efa2dc45ab3c6e284f11fe689e861e58167f927de1f9a21974285a387510853102f445a0379345dc41aebafa9191dc5a4b6e1ea22b6b53332fbc3b6ea5763f706a2e0a3d30a7f814cabbda58260d9e741d89293f0ec3262b92fcba9eac7c1d19b7c8807920faf3463cd1e30db639c339ff4948c11691895730926e64f492ac916e5c5ee072fcd6052a795b87ecd6e9108336d3b4dd66fb4a9ae5bd3e184a7c7be041ec0fb13e0ec6263aaa5314457e9c2bda70a6bdb40a6a449f2da67213fb3dd021be53663f0c0d826e55fbd70602316b9c960351f9255a9007462abc7fb75b90644c680c606c4ff1bcf4eeafb90274c4f5ca4714b6da803fb68d2731fe1f59a3922c9a1e428e01e67efdb7f8af0ddaca9e740e806d987f863569488d1fc1ccac33c57606661fc7c35cd6c46c8862d7eecf29b62f9dfdad260c60fb28451d090cb1ad986f4b60062abf26b055a5c000943061da7cc8689d71941abb8e0eafa337945b5db3531d418f1e53e85eb7a3c96d4aa2e7e26d77d50b74ed0648fce83fcf6445527d2d960e6302e4f8e21e6cb6dc76636b0afd89c846176e67c360551336a9f1f3272b68d14905604e8a4aa93d645c29d061093cfbd404055c980984e20fddf7dc4bed141e938e4c75a1dce7e197647cb45f110ff417c348613128e600ad58bd6a45e3165ae5160ffad3458737d817c2938f956125a3cdadf2297ef713b1d2b919bf9dee2ac025313a99052594b8ee91da6d16df24da8bbc9bdb5c368f9fb48187137e19e2874446d16dac31accc7171056215d8565ea5eadae14132d8d9769d2eec241836dcebb74bcb9b49d45528d6b11902eb5e9274bf1bb5de6a83f1a1627d93f0678c239409063d62cca0157d3949fc6e968208a0bffad3845c156acd77ffc5939646edd5c29d2d8338947ff72f5c86c96885338253d4b4c37601c7435421db6e131bae196a7d268d1c25e71f1f4542a3bfccb5c21155f42c46dd79bb7d805fe06c6ee6e77732b2e0f5d8fd6d8fb0aa7e2accd1c88eeafc1f4d0d048e6aa7cdab00b52ab86f3a5d1f4422256b071b38c9280a4a0e12f0572d0714fa4481e4af2e8e82dc14b9007fa895a5f1800be178054609711b44227fd5f389bd7679d36edb545c9d74eb21b50d58b8d455049fe2c2f34ed978a8edd09aa0efe08cb900973200a6c1618c2a77ce0bef604297c30372be4ef59e97bf13eb7d9be60fa5d8b2e301f5fa630267425b2dce07e11be744a5058e5805c712946908324067e6e84c3ed6ceaae1e484af454cb94db9278940da779173368d84fc63df27822df29bcdd5fda54566b8ff191cd755a4234105627372dcc9b97182969c41002dea3f8fb228f4fe7c89e6230a325c079db7eef8341085d4de0709980d42fc309605442083a84b4e9293f2bd0d264963bcff87de30223f2e3297bc41bb286f5d7d0796eacce46f2a3a4d6519ac893dee6462a223d138fd2d49e41ffc4a9cf8db2579be6af86deef5d5eec3c532aba80c3679d475a1b54e7686949b341611473e31d4111d90953955f820853c6a3df631a5bd85203c37b17e9af1b495b84 +0x4b10df4fbdbcd0ab46f3132c2285a26e1d9c74b1b7565526f02de3799383ee3e183c6d11b9a500beda827873039c4523 +81808 +0xf8c0fef4aca77c1e89454323a7a348f8baef10e08c21c22fabdf80545e9df716de08351ec3a5bbb6bdb5d4d0845d254a120384700ffb0ec38d6373f9f54b9544411a52d76c2c9da727c0d46ece124df69ac43394188290f2dae6aa126c99939089bcfc288f864a77312eec066c0beb84bcfac2538f007147fa30cdaaabcf1a831fb7db1715f9e9b142c6c39f4690257ddf6cdcb65cbbd847550983c69a3551a369d298afe4cea3dac151024144e823686ae327c368fcee7c533974702113617bd0d7dbf5e54d9f7c189850f44e5d0ecdc7274b84990ada6d5d8749af28b07190bd8c4bf300bd061eae6056c14c350e345d00f101d82fc5a2d9bcaa8c9755aa6c96bb91b01e68ff49eb74bbaf26b94a269436c1410eb1d7a431a03e0d564a3496c42a55342594b384379b28c7c431eb2ad490624c21d937facbfbae3d4dd73696b0a23e88ff8a4957fa9c45100ee518c985d77d2afbef0e2c1195a1216544d8f5c1eaf4b39292ea4a9c40b992ed1cfa8a0fd3b9e4823b83c36936c0c384d8443a5ecc20bdc8f3bee6854f2d554720b9f5db4cbf80a004bf463da5b32a93dc9fedf10e6aaf87f7ecb21e91486206377c924f0a36093c94ea3df4ab215e7b981496e1797990b9e49d37cdcdb3c010aa6bead4d4c7843d312b30f610b3682254c8be96d5f6684503f8fbfbcd15774fc1b084d3741afb8d24aaa8ab9c104f7258e6ec78ea883f139c268811571790a9c370e8b2b0d67513b5902d7b16e01b52eb94a9ef7fd81e0bf74e667534611208fad69fdb51a3fbb72b0545ce48cdd4a957fa7c635e8d0c155b991b912c9a0553ac0730b41f2b9461d0307a0cf87d8361e242ed3c4d501219122f31cc066a7172222e23a7e11348f9ea3a539def983061d59184e215c937ff6237308d8c7b5f4ca471011a61061f67c24a58e9f5c7e1917812cabd7e9f83af94d99e3e8472d6cb79f8517765aa2293a0891259d2b2a0d912ea46354f7bfe11ef3f0546b7fadfd6ebec9b25b6a75866cb1f08534d007421ed4481b35204b10ebd8eec0dedb981554075688c1ca6cac68d33c2402f5966514f46019d4de3a38c44f1dcfbed57c431c1ba3e145e4f7e9c2cedc98940677c518118505d09bfdc74ce8e5c78817db050b6e4a82546497ed1f176a49448cfc009cbe3f6594e4165afa18df4ec6fd34e9b671a2b279a3dd24b24f6dbcb0f3c3a6274cf79fbe311452405172cbf8000a5fa1b85518223d280f40d94f7955c54f142c60363aa92d684ba44548d597cadbd561c4da19ea9b192b3f4797f59f9bfed9307a83bcd21382b5ba56b9e222b819f95b099a3e4f4810f6f20cdfb81ac26363b80e58ace59e141ee6f84e783552552a12091e0bacbeb0012dab7f4743e31d52479e3d7140276ce5aebc9f1e2c140de60b45fdf89f7976c836a5ff19a7787d13439c9aa07e4a2db89616043a8387b4cbcb32828ba412c5baa18ee7a5b1ed132550ac08b0fc60b6e621871663e827ea39c671744b36e53d66f2c8c171ffdb6006e32f00394725992cd5a25e00a67f0ebe71651bade49b3e3baed60514edadf4466fa8099feae354cb26da33b76af792d87090112a299f58d73a493af507ef30627aa99d6b54347a6f99a14fee921c27063884dd56625c0d982994cba8db19b4c988a624121f936a78b29a0b2cb8673bc63da5d8a94b6bdd1cf14b4f86e3a7f20a1e20462ab97aa574e626ede83a634196f495ab99314937c435df3f359e346892af9a6c1b9e74dbf2b8da70a7b49ab906f1b6cebcb07ebe2c4bb3033b77299901b1871e7b5afc4e60af172bf1a3783284b99baa6a4576d0c3b78943ef1b01f3b5c878d5b05b8bad5d4d7f883c83762eaeb0b6d7586cbc00191da469e6d658194d68e21a513cad5926f8761e1ed13f1dc38b9acddd92d8dc9ac2a6edb955966a36f75554e45adbd27c549d45ef191d70818eaa06805437b6d76af367bd053776f108352dd05281b9bbd6579843d7abc7674e8719d72d633f4d6b3c408851d5c00a20140daba0497f73e2279da37954a2d35f9460488ad5c66b37c400a1e7dbc5e0b3747cdcb09d84232cafce848ac273541664726b0929fccf753d307023c3f92356d8d3fa2ff878480a32937d885fb9682779e8a504ba42d8980a58999228ea306eb3db8a6ae4bc610f6294e50ea6f58df7370b9d2a11291514bdd174bf6519968f87dbe3fdecd0fca0a24b516a12a843fa4e8399c5c920037fca33a80822f7c42de75dbd556b567962941f59472d5228c502b941844cb8323da2178a08cd1557be34f96d0dfaad65c99a89531271838adc06451ac206621fd2e7c5c13dddf2bfd5030779941546504a3821d54869ad08a3cb9f9c2ba0ae3ad40df6b413d0007af6d420796445c1b768ff716675904f10b0b5213c1d860cf1b58702f9373dcf07981adcd30af6a019aa52e07d166fda41877582711430ff030be572f6f491cee43d69952cf4c251d582d5078fa762ef099c6f3be1ac3c04bd2b9bdf33e856809f5b22d1cdce13679996e84f14a503fdd76414a5f43201beaea93ca0469f0674a785e91b5bd37441d43b1f3fb29bed77397308692f621c7d46192a5e95652c2b8b222eea5dc16f80f403ec41dff869ebbe4dbcedf9b8f6d111dff772a6f73215c8c456c72a046fa59765d20e034713ebc46894bcf9832b4aa082267501b1a2a3cee1132a6708ef103cf562fcb30475c7ea38425e956d245a609429ee2c1118862c1cc69c8b6b78613327018665bd0a30ae51283b53d37c70d07a84368cb1ee1d6ebbf3861d98a609386f404391ed3b867f27c8dbcb628e3e7ec9d7f6aa00ade9e5632c8f841cc288ab52a1acddf1a469db40a6d85276f413d9f677a71a89c26c4e86c401556488501a65a83a9076bf3b511034899f9d28816084e5b044b9e62508bb7c9417fc520ff41cc6655ff8f67b6f3b1497e951a617b0f9c4bacf1d6394826598b02270aa08c6ec8ec5a2e4e4ba8415a95be610f73739c9771f0020e54b6a19bade3b3e0aeb015953d3ffb6f4794e34757e1c77867069789f658e60c5aa1e4c558698c0ff2741e7c808cd0bc0281c0c0b56d2e1ee43ce8b8016c0599f412d61fb31e1a5f13df71c5deca14fb2577c20cd7ecfeca931e776dbbb5c87cca1061f1e789c598bafaf7b87e802ef5577ed075e6e59e421bb32cef4bba957f83a36c821b32f6818ecc969c89368872419fd2410ae1784e2604f088da03d568c7d3e01b78a213e3385d37bb2674893a8be1b1b96a67f3b85917a97e9019f10040a9a304266086865fb5c35b7ec39914dc4d53252fff77475ef6411a94834f0f942c9e854cf4b532acdd20c5b8aa20c9dce9a1cd80316cc2dda99ea40fc9595d6b65b9e612e70aafc6dc3841fdb2862234bf83f886863bf27d36aa64287476b16e5add6ea1c0ebc457baf116756134e48cd7e2f069854a9fe7a74ba1080b0dd44415f0662107c23b047f358e474290da8b37a4fb50b70290c3046ba5d616888f969edb16ba45f6da7734ebef9cda03cbdae9b36263a2cb8fb853f1b6bb1e4ea80cfb87c69200ef6a58e1fb829bb3f67e21f5f56dccd00e626e9ec51ddfaac7e74d36dbbed4c315b24e8c4c8f6d54cfbc07615463b0c931d28eeccf2269425b160257be45a613d07c023fc85e3945f84d3437b78e3a139ea7c046f70c826e72fbd2641aa5307a888e1c015636280fd7f9517f05348f38bba9abb3252551b774606667d6249b7fa5b143dbde616239d688063f289edac0f2a0f83b41b3ffa4c90b6567da0b0fab8fad1fd349250e4b5bc1fa8107144131aa534ee633ffb3bed9c4786d0ea2b384ae4a59f47dcb54cdd06dd64c8addec154a8b56bde351968b0d5547805a30b0946b509943639a5d489c5441a9994304f33c10b8c739f1d095cb8579a8a6ff2e632c8686cae3dc5144273ee49e1c8cb154e7aa1b0c1e2688647c1bb7edda5554775ab5c990e6d75847d9f36636fb011abfb32127957839e67e89e0a858de7b4a5a5ea50a9d52d598db1a3a71761eea68bc083c85693172136d589cf5f09ab939949e1ef0fa111c3c8752ddaa686e8fc2d34ec4dd902f1937b9531645bef65649ab84e823ae09f46ad4e9a2bb13d137518ded82d6135c7679e8e11841c8db9ca12977ca4cc124a74a4847524c7f302c3d714d3b19f99ed10284696891182fd16a96de8e133c487c066dd4b504b574b4ad08d7ba4e4adf71fa1555cfdcb6dc3ecb7823fa1f265fbac3cbf9928cbc8318c9d8f1c61c0f069f88210c15caa8c82bed59add7198750aaace81cb28b9c47a0bb6b04262b4ffba3d432f60204f8dddff7c0e4eca8670394e64ea7deaa5ea793a84979a32412a6c507cf7b5e32ae01a41236300375cf60c09c8500dc91098a3bbbf8b605af60ef4d498103f0fcd01ec06642f9e227c64f75f4139174e7a5dade190225147342be82c1cef68108681b7c1a6ca7526755b8fc1682c070553b7ec5edef2d9719bffbad9841bcd9017de020573ca21bdd83839d2b5af79782d15e385d45355848e08e16f55fbdc08d1855f4443b5305305898a05b219db01772627e918ea71da9ac5f0501b262fe544062400af020d809dcdf4dcd611984bb2372e1b251eaafe42b56c2e4c1115afffdef4bd0e3725b0f1841ecaaa1d5db17ee76a7e81766d6a0655c94c514339e3657e45ebf9db257eb13a4c4196a387cd2da56195a678359856357c5cc343190a05729c1ffa5469544d5f21e4343aa3195effa7f31c9a9023c2c319b23a871f9e604a6bcb78398dac367114250b493c008364a2194c540976dc8d05feff85da0b06744970fc00ef110d0eb7867455cf2d2b62f46ace4b0e1c0401e585bad5c4fa586e99930e312a1d2186608b07f6b8f9c788f38a1ad61a8db9b01d08c4ed5cc6d6b7e0b42740bb1b1486c3954e9295f0d82543d9aa9bcb469e1630dad6332e0b11eec356cfc61ea5767e4557b0cfe29cede649ebf5e27cc101a2b58e474da5319a5195fd7027b14697db5a24c6e53b78694a9a339560bba784f41f9590a35ed4c0aefd1ab0ec3f79293c969f0998ecfdeaa09933019d1444a888d3836acab76f35555d20fa8a05a78af07f18f15193a7e2a6eb8cb2ddf332ecbf65da0e3a4b5b58c32ac2b597a06c3dc57844f685ac00d1bbf58331c9f4ecb2267afc13688733bb970a528a8bac41c1fa1685b1cbb283486e4bc906e775fca94c577c12dbf782ce3f6062e1ec65a2b82cde6d9b9a23c9a72c42c09a9d12cd229f9fec850b18c3113ac1764410790970cc446f2c579c2e8e749efc657147f8ceaeb89fd28c777f2507a1ff39ce53008c56cd0cdcaa783c5ee5a4ff0ffa81ea0de8363883c670016a2486803b4c90028b6aecc934f9447da8ddf92af2af5d1b50eaad39214faf14611fe38bb1319ca9ce673816bdda8d6cecec1012a5f6362738046204339e91029a684d843403f540f5da1387efb4bf74ab9e6e48a265a97843e4093c2329b266868c290c4c3a16727242139f331e574f6553783f607423a8d508174388777faaa60a1a76625a9ca8c42dcccf307de1379aa9c25978b831139bcf00bccc1e7569894076750edbd47e7bfb939a6069e9d7cc0fe14953985e52d8c749fa7675100d90edd16aba347a4e0a49fc733b58dd9a6a04396179ab07d14c8f779f0011fc116d60cfd9ecfaeaa1ef878bfc39c1491a05155f445346da3947660e2d018b861f7f27b6452fa5a214ac32b697d44998b11db1a764892221d55a097206f3384a8236c1192eeabb3d10b0ea00d8a348690a2477c63483939b4004d837bf4daeb5e434cb8d19b6b21810ae0bff311f44168fb9c62056cb318303d860e3d8795554afe98576781c10cfbef4170633b0d34dbc3e2b3a2dd862959b3521fac52ed2a35fd5ad59dc735dc0561399ba43006c5b1a2215983c33dd2f70bb99f127a69d2e7e8991cbb964ff96808d128ff17675eb142623bf0455d7dd1edc374b52a92b628665e13091598cbec8d10ffbc18b966a548ac41308b7091b0ff7987de88ee3cc01fb0a2cf6d97bb5898ff08235d8345535f08538dbefe765cece2c0d4bc07cd76bc97b154c5d42f76d0a42c7b0b4d62832d7d594d068d939d5a0607e1ef65d213e51b28e146d8900cde09510e4da027ff5a133bb98aa7523bf2ee454b498eb1604145efbe172a47e3693660224902fb8e8fd2e11973d31afd5ba1605bf10cd422791cef336253bac31a31420027fe46f774c334b5e89a54ac3d2742591067a12434a80e884cd953739904ddf010197103b0ed1ad4128266104289d18dcd25822d1bf23504ff4679bd8db71b392cdde27aec597cc01915b9f110cef73e51d0de04d6014df0a32193679f50e325a2d10224cf0d43bf24dbb5174ffe9bb6c3ef1c720cde3c945ff30b3a76d91cfa9b7d39c80213551a5b5bc24aa822a53b4c0ba63f658fec385c4348febb59b0013e6af0302c739c19e71d4951c241fc1614abe3338b1e4324c299b27b15d98682b41f8d22f633ff03f0a9b0f547638a8f42573b1523922b9fb87db1782d6086c524247a67075d65229d8861fedc9036edff9816afd8f48bf36678adbfaaf69811b7021dc709f8b8bc1741c2342bd1e87a72f4dcc74f4b4a66f5110e1635a3a4b09440e009a10ddf1a865c3d5edc2d887cc4f5f526339f52418dd13c46767092e8e5662af779a3c2841161394697adff3c1c23ca942af98acc553fa01714644a02cffd625739c24941e0d91eb203583302a305c1d9dc60da4e76e3a050b888b5457c8cf2f289725c9b1c4c536bc8360d16802343bcf3dc2a111845a5bb09e2b9fb149b41900fbce3d8ed4042398f4f75bfdc05b9061475625b61ee181eb07d3f6abeb2b7f976a7c6417a3f52e300ac5446df34897fe9346b757c655f42545e30dca35abcf4643ced1eecd0eb33c25490f3b0371def1a202ba78f32e4ef9e8f7297eb1ab84a828240b76a7c75ef7e4f130e7896db1e4f418b38c3de0dec3517efe4bd7b13c37781a8531dc958e0dba6c3df5eda2dd42fa073723ff04403c3fe8d0a41043527eb410b3c2d41fdce82608aae8b8a7ad86244cc9b2cf0f0faed4c3653a13d873e88cb53b8c16cca811a854fc2272e29f391367cfcb166789a5d0ad10502ae6fd0f326661001d128c04c1efa64594ea4ed647c6dddf7db46abbb4046698fe056a4d75a2e8c16f88054c03172dc4973528e8220858625d7c1f5aef47dc76d5aa583da709173286938061dc9a17220249b9d9429ae3e64e0513fdf305d67c7a4c235a46f790f5eadba9c0beb6e6e06eae7e441a0cf4edc805e53f6fbd090c3471782de5fcda6e14b6cde34a1c117224c9e29328cd0feb43e50f79a5ebe8b89ca0a3230487581d9cbb8963df282b69dd228350ef5989615a290f4735f0da142b5050c413358e86db6058ad1e799939e04eed07ee4115e263584122a09a61716916fd9ba276022c592ba839686eff64e6b56c12a5f229e107e9518676171382ce4b061422d74790aea414934d96a27d58ec9d2b971b39dfa062bd0d171564bad39306c824c7c33644301a454e8f36d5af5b0c9d41fada40d53af0011403e97c01556c2228c6199fa27625c9eb973120529716f2273f6fb70ef8771cfd60f658e028c2ac9f509f3f51dcc38b957d05cffb1768c4c7477ea4c621debb23cb3fd3f873a6e1f905d897caea7024ec7f494701525e8f92a18b9c932d836627910a7fa2dc654ce6445a2b8605b800412c50180dee84ad29ec2af0ee91f19889510abe77a99a57b79aa88d1be507b84412ded5593267c7ed75b15440e5c5dcc999a502ff81b28d0d87281ee4defba755c139e1abc4644a6ddcc33922af6cad58c95e0fa2fb4a7758887d637979e0780695e5df5e2b26bf2b9fe5121c455284c76eba16fa6cde81291cfcfd523c6284d72f8720e8cd1b90972d8b71964e13fd85f83dcb7e5ccb54efc34b3f079d0e6837ec8258e420bf5941041ada19302d7225045d8f9741bd4d1d09dccaf222209ca96b6be9d8cc8e93a9c237ae1d720b7d15019df5edc200d4415f1603ba52659ccc1aa8462f3705ba41d656702bba3a88e68e7370ea4452a4fd41ab8bc8a439e2e078cc006fe6b147a9befbc2cc4f372019f97293054f1f19914ff1c595ae09f9b7044bbb03622dc631fa9c1867c78ddd1fd11fded748b2ccbdd88d33a9c6725b905bbba8921fb7a07af7bbd396a9ab1a78a3dfb6c8d7da18c379d2788d83ff830cdd708b9495fb80f564dfa6c16c2b52a4f046bd6262e19852b265e6b96d0e0a9d081ec6736b75c231907be480956b203534c9452c8065b5ec00bc10a5f82a5cc17a2adbc6e692fea029152f5cac070d99effbf09fa6d31beff34988ebabd0e40a92094df7bdff90d18d3fe9ae166b7553903342244cb614dee8a2b1e30e9e4ae8fe5e9f8e57f823363b50960d7b24f1f2b423bc62e88b4b498f3c1e3486eefbdcfd7f43132b39105ec20bd6e330affde7ca21c1d410cf29b0258a4058ab4f71673e0fcb0ece2f02bbafa60ed7dd8903a350d1e4e04c0e3a936a21aab7e24c46082e74b9d9a73654cd52d3b043e83cbdd5d6a8a82000a4e873bb76cfdad241d4405d32721c5d0b910469f96dcfc73756cfca1a8e0bb53fddd1981e2249e1dcc6a038ed964f460b421143ab99c421059921b99c091bf04b652d8e7c348d978977984ffa88daf8b1d2447e4eb6d95c23ef5c03c1abc9483428e81d05990e79b471a910edec47fb9bec4e88775777ff1eb3df671fe8ac03a693a1c26ea254ff0a4f430a3c233ea525da7fe0a9fe187052913c220b323cd8ff2feafd0bf2f99dd75b06ca69bff7abec3759155b1d43666c01f2e3182ae43eca78144b620d54ecc84f54affb253b766b8d7aa50f377127c7808418db353a8b84e6ce2c0543ff524976cd4974f5528b003744fe3adf3a5b01976031a8e3c865bb06692d6a596164d77bc1154b92d55056ef68bf6266f77686a137dc15a8e643d95185be0590239afec8e091f3a04c6cebf026371a7140e0d3484b66b6174cbc6c52945c6b9aae7b2bd8ac5e118020471bf43e13c7809f4083f74b6fee914425e074258700db7a7beb4574c809c4e9658365e0c3fe177b1bf538986643b96516d240b9dc69d50023b979ea6e60e1104e9ecfeec632a86cb9c386b2d839f23805be52b1bb1b09e7f912f06dcf9b672d78ea8c98a8e9a5dcc06b5c3b3455ce358900f4bda1790c9a6284438f5a3db9a96ae3467eda97a253c6594392190bcfd60746d12e3e283f8ff689edbf9cac7b0c9b056811d9d1205a1209b747e4e0599206fc6293df8d25313ba0498f158c0ddf8fed7bf2350aa2685a1931dd26680e121eae137f043c50369843f17e4340f49acff7ec806ac8ab06f4f43db26c075fbea4b87e505a9a330892f18ffda46fc1b6c1b1545ce98facae892755781442c0f04fc80db8314b601fc2454f9db76ce7cc1ba62dd84fb419c77d2ef39ebdaec46f56394c0726b449f49cabeacf0accf9332442f392fbfa84fa4777a286c6affc747ea8b3ddb969632f8881dc120d0458947214200d7cb770bf7e9decc0ddcabbb81f82cf9c57cf4e192c838df74ca798588ba63db8407f6f7f991e3ced518394a2cf4409d3807a5d49ef1d8aff282b3b07e755c723f5b6c3c31d551d6cd06f19bcf488fd03c1ef334a46bc5d8a4e13b31b0bbf46c0faf2301271eef8bfb8f1ad7f25be13bdaa924292c9dc70392cd5831a6f5f272fdeb616f64d586966999fd251e95fe85199181dabff1a6d8c32f53d8e9891f2b10f76fae6f60de9e1f0de3aed95eae5702bc5270e4ce29fe3ff0744d00e1434050bb95e5d029bf4c23d4129aae1eb8599b13df12249c1a1e0ef603b973632658c5201a3d1096f1487fd4d310223de532ee7e6fe906c43fdf392b4843cb798f1c780c48ddb6113b393bf76d38bf23fd8b03e64c1d12ac60eac6768b148f8a4733706865ed4a0167c85d242a3b0c39c80be031bcd5d0bd47e6c0be135347fd1747b51dba9755ce3b9cef43504191e50d5b8f490839c95fbb7c2ced29297c3cc5fd50128f015edf805ef83b2871d79096221814787284fb835414ea15beb4ae19ff482e2c53ed9efdb581f6faf465a32909817c53a889f768157f9d1f397abbddf5a55bd8b68a727c4a915b0ef2c3848fb8d468e30261bd326876ee8fc353cbd7867080dc52bec3c3c43052ab927a9d90d619bf6ea993b3a9f400c5ac83c946d05bb084804e10fa9ccc66c31afc1155f30b566b3dc5a7439462250abfa26395911c6d510cd2097dcd0a3c96a459101382019553987d26d4bd59eda51047aa1edf70afcec8082fb51e25b9b38fd10041035ddd5fc6f997cdea82617ee79b244a85ff7fe3fc160d0a59c6e603238b68463fca377711628298e485887e8cc65b814972e478ef2428e54494c96caab0d08afeeea983bfe06f9c73096b8b46efd72cf571e775ea5b0aaca9386dd76a67c07507713e6b199ae7415eb6108e5f3e1eb14fa38fc235e23ac94e59d72dacd9c16f24fcfb1767b971ef6f3581701ddcba7a20b1e44818e240a2fba01154b82d5ae01b37ea70f164960e6c2ec617c9f133ed2f42eeeddb83a5a17ab42236d68c1430b5c9125cfec4dd061e48e56daaa40f7446ffb69ac5ecf02c923f12ba4e1e76c7ba5b7bc4d801ce404d2ce8590a1ed8762b9043381f46a9ad0ae6e9c7670a080df2942e91c542f122c182d6c22f87155ba79c9dad31b8588bab53b0476b79526b251d32a90eafcf1541f1b89262064f8a82cbcde3436b862e3d2e6f21a092dd471a9d8ff6fb71ef82972195b0ebc30d6d84c7dac09d87bafe881e2c3d4f7e300a9abd4e5fd3b0d9cf89bb750412e7d76b7535cc2e87337d6353ccf183bf64d31d6d2576cbe0931666e06761761f9a35ec1cc0ac14489756c568e0c5db3a6d4fe65b7c0f2468432dad63cc5fee5903b058420e815929dccd8c8d01b12d06c12bcf2c6a2251b4e8a60edc937a540a4bcf18afc753e7722a6a208bd7bb616c87ef3fa799b53a0ca90aef1163b79078991b922b942aa56ba8b6e9290bee5fb4e8249e95aed3c7b7aee0bacce5208aeb161b2f7e1d0f7b5b7f385031454f0f260b5153be5481e0ff20b0d6d3c1bc2badea57576f0909518cd678bb692ce8590a19fec8ea31c96d2a2703abee9e9359053c5773c800210f44d6ff939b69c026a739b364e1edb25681ea5fa1e724aefd3a34a4e94fac5e9ecca754418da4df5c4694f98f6a3144834c924f2085fc140095fcc523cdb2c8e46c70002b08844ee52f5157b14fa588dcd34658908fcecd485eb9428709bd67ca6b5a89bbd3b114a7aa99563256f0854a5d2f0459ce41e2bfdd96a47fcd734438138c7958b8d4398cff947c7b48ba44b33474dae30afe5a4c59b97172df7c6617aa2e57697d95c67b756954f2ecadcb019e3f62970aad3dd61c4a34c80881d54d796aac58eb9bc25b554163000c6f241ae4b525db98f594476c7272e8102a9ac4c866ff8cca8f3516e743330d6ea857e84e00aa187a7e66869258b53cbf1ebc62df4ad86de218279373984b82db016a51234879b779f1bb7bd626842bdd064311053fbf63fadfa1ba416733c51b21673fadb41b1e5df69b0e7f01681d318938b8836d3dd6dc8baa7399d97440f6b25599326d17b7ee340f27d713e87a8450a23fa1fbd92e4ec54ba6c216955a34593d47fb9bf5e9f4541eae24848cab9e02898da7111cd319358b3b05451e7a9cc0263050643e1b36fdd18baf7cdc164748f58cddd98d2e0582721aaa8e970af88f183e78f379b77dd82fa6c022612447caef238b78b4a5d955082cf91a89710e6e1c58bd6e2e24918d40e79e9ea23d652f7e3af81919a15f55565739117c17a603386665fee6ca3ac30c37931927ca6a20abba6de2458b5d2b6384b49bf6648af97651b9ca271140229c7ce5bb79311f447d8932fbbfc99c7e379cb0de81c081f6deff01fb7c616a54f7a0ddab1fdc4944fc908f8d0fc5e4f7db857605a49352a2775985b86a2281fe2589c312a131b3c730b7ccc0bee5fc3e56294e36e845c6a749478c2a7bbc4ecb2f21df17889a247622e730bb5393aefab06e7f99d33ea5aa5cb26078369796601c4e78e35b7e63f9d90604a75636c0d3f23e5358efe6b756b98047cb231b2468f4fad89da24539f75dfd90ab4f35fb7323801098c4a6c350679b8a4bcbb1bf89bf0c456ee6566e18b7b51cf0c7fa277f4b1cff84d8e493436ee9711fb5bf2e6b866c087ead1bca05ee15f09e46ec0ca272f96841b609edd5d754437069af3ab7510269f482fb15660a0454dc52737182a10193fae37e9aaea9c34a6570e7ab1526b6aff8ea5e16e2146c8fd275f720c7e01bc7d5e8aa6277ec1dcc2751d1492c0f7024b46fac96221334eaa936e0df1a352f4efa4ef40cd8a84c12dd94d3dba513180e4d984e5dce0f44ad891d977723aa266e929dc66278e63764b0c2572b273a96b6eeedaa338d10842099b382b08946e670c55b872a00aec609c862c4ff5b8dd264bdf729e0071fdc8a027f0a51f411589cba129e2d1706e14b4cfc8220e913b460e23d332be5433435eb0a97240e1464399a49753366f870706519f95678d525f1864831ddcf8574677dda92ef7c56f3918c897304958b5bc13a409168b0d90b60d19e89be6ceb8469e079617be9dfebeab95900674bc78a86f4f9b2203b2950f6eac9a59665804c833b6f6e90fbb8368d4941842530b5e607baccc444becddaf8fa51eb2d6149b4fcb64220f55ae8bac263c96706ed5c558bb5422f9de4cb93b128bcc54b0950a51e7b7cde74af7761d02f7a12d22ac5c05c0ce25bf3522d61689d949ab7059c052fafa412d3a26e1101d6dbeb518ef610c0e834b00eb3fb2e648060d23afc35be787d4323dbdad4b49b80755b4bc2f92b0071c197b5ad3be1eefaa9d59c9724b6410be0795400b131e754cecb876ed6fb64ce1076b2e8f7624e33f60aa57d70d7d281037c06bb0e702d7b70a1ce3993673328aab6cb0d3699cc52cfdb1c56210772083594b9b4f259b51de347e8cb3a56b7a615c0c9c4016eb080bcafcbcc40306ac8fc29349365d4c660ad239dcdd2b23671dbfb73b45fc941e446ef7885d33903e8e3a340ff6fc9a96f589fb5e76462f9b083ce93865892c8a7f401ec29e50a82906f6aa5a01920a7706c21f7c0f74e488c96a3efe2f4b18df04f4eef617b8b32ea2ae62b1f6ac1068c6f132c01935e6b2d9be1516e3c0ed8e8de3e49d59fa45a1b9b7f99246b940eeaebdc1c51407aa9ba1aef7fd53791f1b6293ac12c583d414e4a9eb956228209b367e48f59078a4b5c9c3741bded231f84b8a8200eaf3e30a9c0a9515e99713d0e6c934dc1ef76993aa82061cf67aaac7714f12e25aa8f6f54840a2ae3d84af32481511d300126db7dc612a5b2ac0fdeb9c47eb316541846781e270c8ee5f6731c2e86c94e4482594c7e75d70ec43bfe7250b6778cb2c2fd3d176abf07ca5c051ffb9a17c4c0735bd059b2bd8db81553c94100412dce73dbcaf63a0af58f63f15571f5d03a7ddf2830de2f20d58f8427e71dc6dba1af14294843feb6013af57ee517ffbc5784b009959655c78e5172c0f46f6f0b915d8e30de87208bd2d5f9f6f87521a2c4dccc4627078c7c6107c66717bc639aa5e1c735b54807511167569fb514c14b298d1d270dbb3d05f5b86864788e09508442a983f4111bd065f9f6c2457b49802ca089f3703ace2bf46c3fff406ccbf4d7881b61c467c4d07792c0a6cf321f07781cfaf4770aa9b6032b358097df105045bb04164dd46a18ee3a9c957cc2ada8b30957704bb5346eccfe312ea46e412a77e44eebb6df757173f972d574b2592d866f88b013c3d91bf7ec1c5390a1c44b140be02828114da3aed82aafde8a8d5c985774fcf8baff842cfedc358200027bc536a215caf05a7646dead6be2d3b0ff92c8059c22240d72123b5a1ca3146381326f7cf9c50605b2e414e151aa142adc1bcb22d7b8886dad51ab7e521b64502702bd561e40dbb41e2f80afa95bd562bcdc67b3f6e36f86fd9256311e11782f33de2918ca64f5d083d02cffba209fc2667ca4a141ca60c02a7d4559c7add9696e6db9aa4659dec2a96e20bacd1ff8b1a4a48ad20096e383fbb97fdf96190e67a05877f4da461ef158b263c62a806b973cfc222f7b6e803739ef0cacd37a9f9091466bdfcd533bc45843fc0d196c7dddf72b73a0fa7bc044acc6f5a7c6fb154b08e09c5169aabfa570cbf676e20bb8e99dda850ec4e42a131ce741b7b6c1f702cfce1233f47032fb6aef56e8cc84a324f6b0615f22d2470a51f9f8c6edf7cd1cacb7d56eb7d01a2d0c59264d2000c6f6c9560e7d5c6d9d9212a523bbb1c320016843eee8faf001a51fb16e8c27a6aac8e073944ebadcb61429 +0xf22ba6107688aeb25c2f2465d8fac70a67acc7c104b2ec614c281869db51aada00df0eb51ba6a25ad7efb72744d35cdf +82600 +0xe4277302ef90e1fd71ee5a1abf54742caf534d64fbca13c9e7ffcae224ef49b5f3e386f68e441478c3b0eae7e24d66b9d95e92629e14a5c7cda6cdf693a42b14ca881f96658ec7b50fc5c21b0f663ae36f6521c05d47ba7cd1335ca5704b7383b13dc74c3e14019b9d556b1f0f47f790b89283e8010b5bcf3bcfff57858f27e9ef2a0580df81ca14b4876b5aaa97a5aafd0b3f40520a8fa852a13f7498155130cd786198117b2a089d834c33a7ff4d1886f8dd3217e95eef5fd2a3647288f83f934f63fd9caa2a5da1729514d026f5c29b82e5251a53d08caa89b48fdb8e25fe89d6941748b8d1fc067ccf64ebb5a89084d1e08121eeee687beff85e9acfdf55f6367b4edd4a28cd14c8818ac1536b6a880c56adf562bf691a2cf93779f52e2c2496a10b220b35b8157f33f01aa94838f15bcd135e584b78ce673f833ea51a6b591f8cb4e0a002a64fc86efdbe5e46e205e7cf1a23789b7ee1c850abb289acfadef9c6b3dfb4977d0bccb819741b6d500dd8e32a0e69b6619978b6159d49ebc1fb4bd76ee7edfa2791b29cac0588c66b505692abe5d4a40b3f9ff92bc78de0a9f73d454fc0f3358a29a39f1e3a4c58191888620571606e621a649f54f7fc91981cf99abc316f50901bc74bd8d9102c43ab96dda17ab61b5074f032f7f73e0877b0a45d1f04095120ae452740aa7b48d252a98be5c87db3bc936b3a7e8dfc4d2ffc6917dfff6842212c46bbbf7736b6ac55e9f33a225e3f8dc0fc3d5082de66a6486e4f64eb352a7ddbf190be06e87ebbfc7d9d095101c6ad43cbc5d59d8b5dc6dcdb8d168f17121b046f2da3203aa6e58f8d11b81e0d500364015975a8ac3a76ffd95a5db5b701e3eee71ad78dd438145543d8b14e2be6776bc6829869e8039dfa903ca123bcffbde382e0c3155d3b2f97c5795aac028ef19f41c6a6aae8c2251527bd4aa2cf1591296806ce807eb81e9d3b7c1dff3b52594a9bb00731537ef598c665c0fa98494709c0145f95deb6c9afce6a610e7d3a97b2fbc523c6d240f5cb97bb6bf3bea5c7cbb293e01d263d1815a5c98da2714d941f8a8f63330d0f0df6bf47b455ea31f9b7680ab8e1fd56f316ea240b83be9336db70952d3fabf32560699101e7c3f4c61507014fa60c0742fcc20042790d14662dd45feab155f42552bb22bb72f2f6142cba000d37fa5aed0d57e79a4c06d90d5cde760352b21bf514dd814bbe1e3fcd45a7905a5b7057dc92d1607bc350e911b1b861deea6b6f7eeef8361793f0d8d7a8f6389ed91605f7d258f44da8944c5c7487a8e54127f8a62834ca89b910c81c9dd081417a936c2717122978c1790bd4ed76d47f1e8fbf5609b8c408f72517826c5df2ab06909452a72a8a64d7a82d6363aa6c134a4acb77daadacfb17d7cdf35cc4134445b48661cbc69c7ab1c8baf0204ef80b8e0125efe43a0bccdfd0f356b62e6c75fea8493dcb0fe9201982bb626a8800ceb05cd3a86c8867e218b59192c3c286a4fb13e5ccef2cf8bfd57e37a38a800dc47802df88bdbf4ba58a31ad91c8a9e83b029e63f87f4551c0ae63369ac860a655b09c50791e063c7dfcea513a100a1aa0dcf1caa8c2847d896cdac02f6b4d54e91ed12f62d685c4d237888475e20ea53d51b322c4010f0384d78ade4abd719ee88c4a832a2e656a0c04b44f2a85dc1078288c7333840e6b18b61c97d304f40cbac0af54bb6eceb6932916b841429ee3bb2b26c6df93aa3eacd337f4b289fe26c782a7abfcdee731d06e55caa36179a76d202622af760a02aaf484fbd094b575789cda8fd5c5d962299d198a362a97e3f5d037908b74584279e2aab6136c448033d4f1082e6dcbd2077c0c02e3e4201fbd03ff175bd7b9838165522d645bd1cf61f4941eef1ce607d3d5d43993d93ce32c8026bf07e5574f2a442467aca785eb6bc26ada011b528bf36e19372c4f11b8aa11559078e75a2ddc49c76cd199875bb7071c434ab236e6d10f8405978fca259f7c34939424eaa6ff3ae444bd7900a7af8a5161b328ba9ed382bcaabde18db3738a6acf44e62d41fbe022f8568f1758ba15b23d24c7083d638e6a2e858c82e88f03a04c71734e8638032a8e8622f5f53f6ee7de86d5454be8fa369ad6dad34f59af7d13011573fd1f6ba311337cc106a85e974dbf9b9c4eca8fc7f59a11a56d3a56aa2bde11c52f16df368647e3a4145cad6a90b96133d07015c647b87a23cc9bbfce9ceeb26ba386298bf7a9a0c6a6c3230ab15a6f32584454da98185d72f3e2b3926f1b3f8de1d80f496b41fb4e4445881cb78c0cc26fad13acf1a202bd6a79fa9eab4bff5572725a19ebf73b64764aa34bab36810b9b131ce4593eb02abac65c9958683be9ddbed2a27eb3aa32c53a3d3c9440173467de3529d9d4b1e16a33a12b7f593c71aa223e8d2c5d8eddb87d1e9a7a91136558772723784c4b0b022690fd2706471662086781fddd3090d87b0e0b6613c0c8f844b97b3e8ec7d00a09f2b75857a7ff8cd71627fa1bd871ab9dd5375ead6582ceaeb5d933826d570b438f011a34a256b0f711272a00cea8bb493ac86d4749be621ee1e4601184c98d3c2f817685824056d020289672595e90e8076398cab5a23dfa0745cc21564d165c9ae273328de707ca0dd2445ac2bbb0e302b2e91cf156e6abeda47f9b290c300b97ca1a230c734a4d9fce3ea152e6a5a0f45d67264503e59a5ca78268462e62b1f0e27241460ca8c19dc48c2d4e08f789a40c1ad0f9d1c32e1bf9dc6ef5da34b66bd1837285d8a88ed05b34e801482c05dc660b0354e707cef44095977d382f82d13f559f0f02d21c003c40b9b2cfce7b621341a59f6e39e4ad25b6ca2871da7de9d6f1b12eb0aed3f40fb787a8c46555ffbcc49f238de2d70f4f46ef3cadbe107d3b5e8e270bc51c767ba23c2c5077fa7b099dda256d890fe2674ded021361a15319a420453a9e5d4c2808bf869b8ed29ea1d33df035b6f4ee14d4aec2cc4d9a3516cc4dcf65c1ff3fbff1f8fecc3145302d6eafcb0ef1eefaffe119c4ff0a61e9dadcff0cb6b76b17e866cfdc0ce9bbf854771afd20c365d0cf7f164fd51e60370edf1d455307089c4a6d2c67823c9cbfbff565cf92b3c1362db38dac7613fde95ada8fc364393d968e11f7e857b4504d15f078898d4a6af5c18766240971a2c565d73dcb12d674cc5b5718a7b2d93f6aff713b73380ec8d5320289fdb7beb695d8dd0fa8846514075a4977ecbc32d2de257e96d4bc89439d292cdf7fa784a11f5af5eda0e46e850f33eefdff9c476f702e2271f6404344174d0e4ef4024aca2c9426bffd57792eac8d4e90277ba080eac362b41fedc3310947afbfa2ef999b832e786d05070f79a6107219ae81c66b128b484798eb91743cbe181bd297f87beecff3df011cb7cdc4656181dad5409ab12fdb12a9613573785b4f48cd21efd2331fa0fd38befa92cf3423aef4a096738e5623fd9977379884c65e30d8b606091bc886b0f4135f319024c18a4309516073a929f1b257204a2aa64cb93e7ec6866e6fadde7b466e10ccde42fc1139f8c726cff4d43a2678f030a322cd45a0b6b2f4bf1e70177daf984e0aaeeba458131270718c907a0fc5f45f66e75337455ff5745de04f0de0ab31dd4f0e41468d2aa81937fa0bba3891bd7f97a3335a9447b8b8f4fb61a899e944405569e53c00c6f1e9c8452f42c963b358de5f55f7b6f861862a78902fcdf13740c5c7bfd1da6e55a8cd75e259ebc43eb1e122a155d2fa5aa7a75ec3e9a74c74a54730b74c43ab3c1ded930e48c53bc6544bf4ffbe11d309e314b5e21f4c81613782adb5f462040e11d1a69a588150b307c2dd57789b0dd8011986d41ae71868bd1f45a1136001334c21b66ece448b6d93eee691cc972f2ecb5dd8831f9e9af001c50163ef642a149684cc72f539755cc0791695022dc2720789b3d679998e60c91de7e3d0970817b7a2ee8e148595e95508764b62874d0e7e441fb56e017c22decf020a002122a5762427aa7253737a1c460c9b34ca5869f837250848feec9d088257bec62900279cb27cae58c99879dbd8e26ebf216ceb3d0accb74db767390edef0e869d72b03f1f3f7820e0f8b4c5b6900aa4cb210fc14641dabc655745eba8dd47132542aa33d909f0edc4ed45d649f6c3923a5cc0446ed1ecafaff9c74d2340b3f69c8856d48307c3b0aaefc12be2230018c23286b9c4ed9fd33de66e31f7e9e3c565bc5cbda7c97efdf568ad5309b54eccf54ad99db2f562db71a5a146910944e40337124ba1cf713a46f060d83b2dee1335fe2f7ce379c40d0da006d7895f55f717b11dfb1b7a490a220f9217f0ed8c7016c4feb3c0fb320c346e15713b3c9562f592e6687f5a74c1e92ea7bec58498882a57ddeec5fa3b3db88843b0412191bc3f54f200480073163ec618292373a0bfb30f339a7ce74e35fc5717f115bec967578fc75effdcc26b857e69e3954b238b735396235042f969628318d03364baf8c0abdcd1217ff1264fb0237a856b9f7fdddd8c35eaadcb6c9d64bcba14a3d4e52d21b903374a7dfb0ff3cb5a8e65730144f57c2ea68812a41fa47a3b540ca5b0df99d261bbccc74e48c1d8101ac95cb45b43ec9a0e528da43baae7c05bffabe06a6ccf8929876b948c92c017b4f7ab0d834163f49cad8ae1a3e07bd5b70d65f85022e6c60b0ae9623dff19edd780fc815f6668cadbe9a8e0dafdad07dfb6526d1354deb4cab7bf3bff5f4c0f1ce5bf94323b617946a75626335b01c3307b0fc3466b1de1f31e6b86234bed07dfa662cace28f4ac675711265f70f09473cbdc7f4bee0aba1ecf6cd55c4d6344aa3384a965c778c0a8896865b1e82ff7f4496715a6464bc9a81b31ae0ccc4562072da394ab9f8462a4beda78dd18e66a5c443e0ae80c577d29b25884a74119dc70f53e310209adeec657d5b4239bda67f67cafe383c894611e055fddde644700621ab2e2fb9e4bd197f4e8bc37e9627d6d235b13fbe3a901ef84a62df47e539a650ea04f1ad5e4b7940692059c7a15271b08ce30d2e5fbcc28c0ca099c27c5f7046194c9c2490f0d351d5004a3c678d1aa7d57be8b58134c544a49d537c924a29a840ee79450315f0599a15de076f41975f1a61197b275fefc7194355a0ae619c2165d1d0393e209901c1455f4d41d7b182627de8a7d9a507be7379e654590e905792dfe928c97b94f1517a133966b530b5b6b79c61206ed7d0bb264fc01ab9ccf2ceff0b392d8ca9d0529b44f06545dca21df77fd3822225a6f834d90e79c8199b22198094f1bda247cd90389dc6ee7df19f25d7228929bae7328ac963fea43ffa94168e629d7546fdc84137661217da4a4429ed79bdec5e3c71106aea32b506b62fdc7ecbba1b5c9b4e968b73d02abc5315eb09fea5d1d84dbeae03c89c633677f85498f6cf19adc864777bed888eebb7195373d9c941f2c1204cdb28c51796e7f966230c64d6012d14cc4efcc3ab2f1c584a7233b1a57241a0d23b303337efac39fb693401ba1f71657d4dc707e9502bdbb64f34e663217445286b08702d096ec0f9b0972f2dd13d6072c077dfb0158ba9815303efe5c7031737b3d9045facd6974a415c7597dd390b93ef33d06847e4ca91c3c954912c951ee55bcb7537a08bc5d464ac5c600c0c70c921246479aee047d0eaad9ed117d3631baa054d1bac36528160af6bf0265f97fa9f72224b122527240fd8540c5264edc2e9b013759a7f47377f8c2ab0f3d9860fb24492463b5b72777971fea9a3f2c4c061f350ac300dabe0076c21063b2347f1a0c23dd3f12b31b071a12412d322f1ff57f78b28378986634176d95bc5e4e286b116aa58fb3d6bb73f904faeaa9e7b6516e34c51769ae0a875d3d9185ac55db82f65613f223828742b6506e5ef0e6adce5e01c8fb7e9c297ebaaa9a3c26ec26e60daebee2ec470cf7d49d21f6c19c74b0b16814ac01e3318ea24d266c58619908e9acfcfe78a4cb07c633ac4e7689999d1ac05ea5ae03c13bb69dbc72ab66805ffd095481432c3ff71dcc63c29a3e8b07fcb30d74dd7e470a7a04c30bba5b9b7fba2c6c37f64dea4a4dbfef0fa71bc775d9a897961ac3317f4f2ae083efb138dcc38e9a7eec7a4875d896b46217a1ed6b24298395e0731f0ea8687b77c627f6fb9bb865c2a031d90e40d94a7686715b5c8eae57d0b8fe7e4d38562a53d8003450953264afbc151a88090017c95e0aafce5bbf9ae31ed5cd9f516c43a49fdaaf7052750d928a949b57b3a3b2b718ce49352dd5b3598c998b89a6237de6782796ef5608c717b620ca01b32c91ec414cb635777937808c9a46a089042f961b77a902125627aba95a252a9a133bb561f67523bb12ae1499887d687c96ef3fd43b446d09f5b5caee914b26cae026cee56c14948b4a7d722dc49e36135413404cf2f794bf6fe7f1f0769a7ae82bd985661e031c4a892c15d3ef37bdcfb45243d02f40fdb51d34bd596a91bb544eca654e7ccf0f8b57409c0658c854244022b72850af2c6d86329973fdcf5cb1d1800b1908e702c01d31614fa1ce8d937ffb269ff790854b5357f2eaa0b1d3635c80d34062d97a8b73a5020a4ac8eeafdc41feb194a3bcf0dd2b6637e3e7a3eb38435a7eeb14fb3fd2e1fae0c425ebcbdd9dcc07b84717d0bc037fc637bf62dc0d4e0d0f3237f96fb39eb84d9e94099a0c74fb0cc2f94a8d48969c103cc784983417679bb8a0f9adbe21c6bb4a61cc7ce15e283b4548b9693b4b37c0338e9dc25525f68eeeee604c2b11a2b4583da8f6e4bfc00ddf93e8f6eca7ff30ec72f2ccd9004663557ee1fda2f4e8c33876339a8f104f1ec2995dd8d5234efca823382a481cb3a38ce0e324be31e5627ba9d0da690641c8ce978c719d43938df70dd25d2af1dae9e5a2e843d56f350c82571538daf83496343cf943ad9f896f69a165f7ea263880f04365ed70e3644bfcfc75288d7c942193e828d17e8d8d1b706c476d0e0039135d30f0841954df8b3c18853bc8f9ece57e279fad98941b0c9bed0b3f1f36791b5cf9fcaa473a2344d019a9e545f6ab4c5389d23a7449bfdd5ca235e0963f5503a00cfec282e9bc23599e77b76cf95bd0a47d44faaa24f7e8230a4bf3fb617956a6f88b5f450a269129056324b6887b1ce1807c70a2ac3fc79fa3a1dbc763429ed23b06f31611ef08cefce0afab1a958bbb11fd4ee65603e6130cfc2a82ab3d56c24306006e777204cbd394cab336179771c02bc7ed98e0ee3d84af42a5bfe5f8f7bf1d09c6c14c1fa027e41887418deaa619ac7e410b632a7fc92fc6a907c8ffd2fda091a775f9b3ec7852eb6fe374dfd86cd3f45923e7354a391229151952f5f48d252a991bf75be13365e6059248f1795856acce5909992d62eadc727b1055ccfc3f271409c1825ee7918ac0b496ca295a9929e93126c0b9c51e7339838db9dcb9432990f5f4d196036a3c29e0dab438f21fde6242eb464fde216fe2e9277c9442d5a4a836eda42725548cb9ad716a48ad5f3ca1e4b384801ca834f7128a1894276b2ab2632874a2bbe4fef8511736d8eadbe720bd0c15db1ef764fe8602385ce5781e57f131ed694590055e9228b46a491a5077227174b143a36261ba3c464efb8111f167a6591b30fa2264d7226d5d269efb1dcb702bb32930dfb925a4bcfae81a88274cd262092c67f893a690cc5221de597d0e84a5514e341f6d6eb816d119a8f362075272e3967dda7376f04bc9c95cfe2d622b6c0c1101b416ec02ee723eb0e62a2db3161aedb05a8ccecd76247b9f5b976cd0fa54104e301e23f1ae4e95c6c2e83660b61fb083fb381484d612b729e4539511dab9da5e161bbd20c0d6dd6f3c34a7d7fd728d8d3f0dfeb2e5e50a613aea617a87bdcdd5d8780e0cd0ab63fe9497f8a536b3b3208886d3d4204bf3e9d1b468578bc06939e9bb9d12682cc8197e7abf450c43efd27a3b3a751f87f2382b49f04541724afedc6ee0cdc1db88245c655233e8b382378683a8f22e5983b0aa33bfd06343d18922fa8fbba84812c3b0e057fe567328b4300895e7e7113707f0da2d654ba59b8d5006e05875f2f65c0e643700c01331dd093297d2d44f7a9271d5af907528076fd5ec9920a55cb171d76985e7d0043c16648a052f7074cce4cf8edcce7a3bb3a5473400a0c0f5b299be78bb1fe0d6a5f4f477847a4621ac634c9e3b9bb5611ec20675bd65535ea838061a5d158d0b1dfd1b938c3fbfc6a7b27b6c2264d128b75aa62a25cad6e7d0d140b6c2653f01f2935c6692ec57e43d46fe7147d638030bb3a8b9e05dc621eafa10e6a19b616bd26c39592efca8faeb953856025c64708a7180ad639a9bad4516d9227104be992bcc24f3b70d2d8b2121ab82f863e101b218b08d261de1ea8dbc1be2a74d812a6d47c1bed18a50157c70da7080892837212dcad1be34135a035e5bafbae2638015737222e4f0ab1a5c1747b73138c471460542038299ba8c74721af2224fd04ac2b3c8b897dcb90a5e6975bf80ff20509f5398ab199b31e22fabdc52740241eae3ad37f830aae475e1fbd7020648d645ab7d3120f9d5340bb3400239369652d0f6a4326a65f7c7ed8552fe2727a250d0e906ce1d99c41b699de34f2ee0686d9d7a5d6a779e2fcdc1c6e36d877ba82a72d674a1e97fe4627c4e19f59be8150cc0fd2d22b84fcf80a3154187ab58a6bdbc023b6f2d22a2a3c452389818d418babbfd980d9501536b01fed1df1b653a951cdaef885108ab59c238e3c91e2aeff21eda228da64968075ef238f65027e05b05fef58fedc85afef6609ffb2463073d4a314125548e59c01a8dcb4fd1f7144a17bce1e85bb83dfdf177b190c402fb16ce8198573856c52fd5202d6e2979631cb2b33914437ec0e123cced3c658137f92c598cb5ca2926c11f67c3b3cf25493d77606fa60d7290430e0e975091644a6ee407a2a3727beb0e49b322b32b612316c652fa10423a089e208b447fc032bee2764a5eb2c9d5ae81f490cf0ec6d3ad433fe97ce56a4ba65d0be1790c8a62e1ee5360255658bcdda6908f2d1939e3344d34b24c97ee1df5fa109fa9a9487b600d2c079b207797f4f6be1cc154fd26549f554bfd9a5637841fdf245ab892f2c5a9409f3483defd80ecddb8205479038ab41205148f3b0ebd18e7fe00ccf25f6f5d31956612d7640e136fffce9a46014315eb7c05c8f52a2d8f9bab3058df17e9938f98c43ff951f8e4e5423098dca61a5f521f65ea2d1031de9aba7ddeb1c2a0d6ab07b36dcd5dddebee2ddac2b5787cdad66d99553b3786a0459a2de122d641b12460d84ecbde2992eb1131ba68eee712f8f534bcb826885f2cc8d4e2aac9389d8c4287356d5968745caae9f25f8fe5b23a44bc631c53b375c0c51765a221e206331b64d43a5626fac34947ed01b20522faba850ae055848ea22d49ecb166fa85c959e58dab6ac1b0bf7af00d081ba1dfeae542f6ac929804315000ea510ede96af8c8dd448fdd51091ce56f4db2368536b436ab8c9915a710edbc0d0f9800ab36631c23a8b85eda4ea920116e35fa5280c6360e3dfd8484f8b2efe4313710b568dd82742fba967e83a947305c91704c83eb3c9ea47edee0a46d83dc347485d0a76fe216001cec04502142123f51fe3ae82b30a5eaa38c83bb265f3b40d8c8c49b2024524566ca365c1bf9ff3efa0ee6568efa6936f5f435e6e36b497cea3f59edf83070232197da509e544181160716761d8333b1fb7fbecdae8f501132535645ffeeb8c4d4bab9d3b33b1f312c5193f0dfb14a823d95e5178eb39627386c854a3e477250079d9b8e6196e076c554256bdd6df8d3439f736d8cbf64e485f3aca5bc21e5ee42a74828b04dcd776877938f1da083c996033176ae9b0273a04e94fe81665ac70e40874aa8482e5d9d25a705a930348ebd2be4dbfe30b8fa11e705fb96fc1903f2d0219c526f4b4fedc327758907534a407d57438464cea26125c74702cd6ac977bfdfc5b5ab6b76debadc86c30b2824a863515747208b92176fa188cdbf95412376876ed9e2d7fafa728ee16126fa457b4499bf4f4d39f3bb2f5c6700bce195815be13ec7fdd802c953052e6a3f13d54488f822a4d11eecd5ccc08ba2ab98ea16d7b7de86e5b4b6d2c60814e73db9fb889636284f9682a6eeae959dbb73006b6c53cff51e80b33f9d31613bdf0a35dfd1d81b7a5782af488d3da34454fe613d0a35f22c98b81fc5b2fdd64c5a8dcfaaa6b56ec0c47fecfb3be1b2297333058b78e6e82bfb743e6f9a9330ef61aece849095f9a19e7480e77f0289f323fa337b3fcf79994f9c5a66dc5936cbfa557c9416e082c6ee48b433e108f14b693b3235e6576d1f9d17b9d200b9b289306a1f03c0ffd2d7bce5d008e95bb2d94fde4be2f5e58b64eccfa3da8e1a6ad008d500f81658b17b0e321c8d20639444dcccc6aaf4e39c1144ab62a60fe428498c7e679ca154e75aee17dfeb0d885f3518ebebb46cb868cdad933d5f0b7eb29cc34e9b17e85b3b1d637c63493933da530c240129e5ccb741306f7b2d0852d070b52be69073d6766c7549eed02acace47bf605230e5875114d427653790c74c6d6bfe8e2fcb2b60ee2d66c9a76ab703b8398524f2f651feefa2a443a62a45ed3cecb0dc1e77c4c14c92bc3cf88160414f837cc0979f92857aa0cc5da15f347a8540271882ff07612ead318ee8f52f50b4a42e6e4669b2af5cd888fa51b5fdbcef704d8a86ec5e083a84ae09a1508af78ea4827627da19443e52c163deb6067b2383097a4fc5307d1b221cf34b19dbff858c5f1f637c2f0cc7155de16feab87ec981422f0812e589778c61950dd989314263afb222d75dcea02946ba2cd87b8f8873e2f2d75ce5f4f7cc67371017fc536d3159778b710954709662363e08b8740860d00be429978642e814217c5b9c2daeff45b6c7d49d64e0649b9fcd02d5f6f250f4c25804650601eb529a782ed189abd45bb7fd887fc7989cd73b004f3cddee4b365e5b72b63edbda08eb2c16032d0fb883c1561319453f460054007653f1a35a7e2914fdf3f479bf1e5dc19d9ae280b3a51efaffd1a57d68fd30f5ff84faba84b469ac2c82f182a17b365f4bfe70a6cea91410d411b1fc0cb617067336bfdad2c0674b87ccfd9f8909be2da7979f2b1077ecc118402f613913535b58d009ac4a8a6b179739df787eaf3f5439ce37b482f7ee3455c5e857f8fc2b1d39bca0d8f7fbbd3be33261b48855fffc8909ffec2a126192120aa4845059e6749b614c05def9a4ddf41d49fbafe3474b20b1c07812ae8f02d8762a904912cd870827d5db096d6a26506360f7fc425f6c852f420342b4bead2e714424eb0f287f077602047f40553d816d6e4e76588f8540e94d33c00d37ba9c63b8e83f393f8321b69c254858ae4a0fa23ba8260e1fbfda49a9b0969f4252aab44f834c7659bcdc4f6be96d9fbc7780698eae124d5641dab61d23cc54269de1cdd19e1aafbf52c3aa37f5f5fcc9ea5e2c310744fb7e34c898733468132dc2c81406e0b2cdba6c5b2dc8f4e8561bcb3052ea5cc401ddbf2d56718a74c39deae8f2b6f21bb690322e41e68c4e97fb437f4382559848bb0b8f5ae0cef74ebf3cc7d0a87b5d5489cdc34f586530a6b17ad266c199cab7623f790b87a7fa9bdbe1ef14a524818def65a2bde728956b8597b1256ed16235198470d130be84923900e82875958e4b082154f45b7d86cebfc2a4e753a466ac2702fe14a1ba9d1b20c23872e0758c751e2a605d7c0b0ab7a625341536bbe003d5e0aa3ca3454d1eda4f695cae6c84f377a84e5f117b290e83e5e815e0bdd7226b47fcb1fe049d83adce034ca6247dad5bc2a761e474ebbb9e2d4950195354f1315e7ddc7aa19432e2678cac91427f8a14a0f1cdbb9f59a63f23de2ea8255e576e4eb423dfc43b14c0448ee337719275e96bb70a5fa47ab8aeef2f1857dafd3f6c3e2aeff414980f918a90596057bf53214b7e80982a57d732bac474ec1b398e715765a9823ab60c9b641b76d49c0d0d0567d0972dd9f6ec15ac26ab308f1b2dc6c0efb751dd9af428f8b6a25ae9858bdde834b7e85b61e09decdc26ebdfaa04b3a2508329a64ead7e6ee945bce62db5f1f533488f55a09913a36e4ce5b2effb7f250e73d23dd921e5ef3cc7c03a0f7388b754b2eb72b901bff86584e5b1f0fb7470b3f113494336a7a338902f8d33aeeb561f5dc457b6ffe8144738b584b7ead8acc764b67394d60bb16408d0899f4c63f91cb2e2af9e7ad71e9fcf1bd24cb2f400d0348162d5e8584148986dd45d3736c8d4170c207a5cd53ff2b1e043b539109558c83dbe0e54d77d6da6cc167555aceccef50c52518c289fca45cc80fc697493e68ab2314502d08b5a9cb6f8ed900f8d92b5a8ef2bf21865aef5a6312928672103e1a76184da8a9397e0f321cfcfa5d2a9bda99c1176efba272938fe426032673535e5f6d2c34fbeaddc4b3b23fab8e49a77d6030900f3c5bc47488d51f81e8e07ef359938a8653323f686ebeff88eebed49f9cc1e786eaff5b89f895dd871befe755df2bc6e151b81986bdb3db36f0e2b9dd89f55c6a69f5ae405986fe8731ea43025a869fea79e5029c4b31412a575dbda3d22b8d2e4be743341628e106ed780885764444063e31711571a7dfd77498568ee004e846f33ca0e1d90c238a8101ae6b9cd571c91135eb7edb97e5c2cb2b1afb3df1fc59127e4db5fca13486af2fbb0158ca97b7855ae854d3822170dd7e8175668347b90c24b03d0b78a28fca5aa503148424361d28de2413e6e1762e1b1089d429490b52b86ef38002ec0a650af2cd5aa2b5e94b286368f736c4273f795ea521547ea488b1d065f4d08f8b01c93aecb596bb2591c1eea0081238187421b253b8b5673910999af0c451eb96130dd3cdafe0a29f838df645c0d9bbde7eacb21214ac811d7ce815409907ae903b51540c94111aab82f500d6bc2dddcdc162d46cbfaa5ae64025d5c1cd72472dcd2c42161c9871ce329f94df445f0c8aceecafd0344f6317ecbb62f0ec2223a35b071476a3f7469bf4d638dc141dc679f9b29ac8fd0c2826e541235a6f87e2b5576a41aac4ae07895c41533985caaa3ff45d2bd384511897cc3fcd6ae22402c864de502ee93d431acb697a9423e616212134e96c64beb2eef41f97aece76e240e5dbd67fac2577c4e4a72558790098e222e24a1018c595911f593892af012fd36cdb3b1967e7241c1a82da12efaab0e75bedc44b1ad62f22808516b2ee4339e46c650488b6f2c684ef950f401234dca53eaffe99d590fe17da1bb88c06cdaef866f1a94a03e8dd93d6564b5c6b4faaa06da14f78e36670e58e95a48aa300ed83df19bfe9f939d7dd613f04e4654b796d5b7a3d64cec72610008b514b3d7d741b5735bec4e15653a612c7c2649ac8e7607a934ed9f2438c3bf255552a20a3d12341ee1c7776decf925d790a597648632e5d750a64f86c21adb68c06c407049330319b5f8e0433aa36b3db533f723a7b2b76a7e6823b917509dfa80c855b2028c6a8d5fe5523e581e7b8572383291fadfc589479ce4663f4b4d031dd0a9777106b0a267f894064d549dd8501c1057869f565d32a85a3443f533aa1dea03689c871f7f56987044212b195ed647591d54dbb30ec7f54dcc2a3497180a802c2c8df8fd4db42caca0dd8d363e8c22d58a6a7c25c38eeb85d5fcf2c0756bf9ed6c4c429333071e11c188613da1fa134c47d268f2a410f2c9f8c116f7e8c9bd0cd0df4b295ad9d567502a8f76aea98385fc948962dad473e3dd82888499ab3451ff50fd07eab1b976f4ccfe298e20db4950b6c5bf8d62d4992b4730afb199c686a2a73f740a1832055674989e68e78160eb42064fe4437fb48a16f6c0581bdb7160eaf8bae295a8de1d2d441d6587df92763f335c08fedafca4f9c2feb5badbdce223121f9bb083c7f2fceaedad875ba799b6342c211b4f381ef77cb2f1fd2e8dd05974ec5df12b897deb7357676f5f66fbaef10756234532a3180c24336d3c4cd19506684fe109ec6501c5a3bcc85298452f5137cf9d24b0d9655a9ca4906de38ddeb0dd9a0783b75346c919d3189c051e423f03b511537b68e54e626cf12a18ad3c5a9165eb02b4eec36700d5eaa5752feda0b230073c5bf9a1d1bdb215d9b5d9b7eccdd916efa9df7f88a2e9c3d4b0203a5d8d67084617349fc9f79e86e480b8584ed91e0fb05fcd821245382d937d98315edc839bd979c0e920565acbb142f32669fd5b5eaf9e61d5ef32e9af4aa63fd98be7ab495d474687bc230b6caac231292381b98c522d437f05b125d25ff1be3accf508993a4a6d7f87a5dcf135ca1b6a65ac5f2003d61a883e09141c3b27bd5c0a4fc213d94adedb6726f3e3bc2059f018c875a2295f8ef98084dd174610e3482b3e003fa00f40a346ec78caa68d92c4221b259b2b9149d9b568a94be873d9051908eaa6f8603cdd0b40942c5bd96eec6dee95927334f030c4fe9f3f8a19479bbaf5a9cf4a067a939e6a6e9343cc9772df88ed0f68102e07958ee87b92cbd313f84f6542fcca +0xfc98a8a7b37b9798aec687fe4e80e30d616598d0a6ac2c4826058a98db089df3d65fc9f58c3c1c518cb46c3b164a203c +83392 +0x3333cc66d86fd64c5d8003e66ef2fe43ae6c235efce2e3f4f50b6a93b91680f4f299ad8a13caa15bdef1d20f291d6746e116552f4f94c8579aaec4be8e950c309b8243d221ed51fceb000846f94b08e682b9df3939c3759fd0e3a88cba4c33dc36d8d4678942aed68a95ecb564e4a7c9983c09a341d7b3759c925d25c7a1bca0c982a971d32f7f92c698c581f4500d972b871b96f0384a8108a32cb03dfe71235e680a17881e8ed7a4f1dcd531f802f944825d39cc4e026a1bff5d55a2ca180efc723e812f76a14e2e8979d7a2424d96e91517b55f82a3d8dd8c383e806d7a08ac888fd8509f819e6b46e3afcf97b81825289031313af475573304905e4f5fba759243447301f6706311648640600924fda311d6c8dfbee690dd0b76c5d88fcb5f78a3ec2104c76c1fd342847e0309657b6ee2cbaedac9d6907093163c70d1e47222f7f9e110be39a672c6d010ea8080a6714b396b91ddeb60d6e5984b7feeadb77887923c8da18000d838937e7b362086959448856ec2cd07f549257a6dafcd35639ae0b9e339e836ebe0f45120f2eb24c0041f86d83f258db706e552a2d9edf4c97a0be07a4e1a4f95051c10407e8987dbe4e7f6371e9bfb0266ff5a8637b4fd946d3a39baa8bd53bcf1324342a0a3b7cf7cc75bf225d658c0af9b1a8190cb57aabc954d0c0e7a4b4aea5f729021e1bd8214e83f731d7facd82ae31bfcabd90af5af45a3d649f93e2639cb2691c8eaa0def4722921cd3d00321ffde45d51871f5b8d72c38122e13438269de6ad5f6768ca648ca264ffb95bb6d611fe0e4a7d9dc6a04336765edb3568f8fe3b4cacff1e2dab5e31a4799bc54c9648ef755e628c1d2ee1831cc88e4a9ef915acd6795bc9f112115e49048a46dca9c941fc55dff548807432da27a37ac26f0bc1b38c2271fde1cdb1bb682ee74e55bd7b0af69bdf2ede23cc1a42c1cebca307024cadfd1e3960b9b3636d30af8ae34c26060a3f52b98f16d843e2914c74dd32f807a694d98dd6feeba7db38a7789b9dc95a597256d0dd76debdcfbafed365b32a4d3e8ea9e18dc3e1f079edd501c4d9ec6dabddf45b0e6b66efd1e5ecbf82b320873c94971dcb311ea710f8430ba72718a7c82733436b1cf943b0ba1d217d5a631b694daa29d97029326800f97f8db0d37078f91c6e3cb21e2033e099e29ecf7a738d62eaedffa78afb49aefd46bc9ca83082fbb5c5c9545eee240068e82d3bedf5707a5f5284ffca687baa59467d121c4fafd40830592b401649c1931d72c5450bd93e123eb29f70e3c59b1569173ab935c72d1d98365f4cfe6acc2068b596091c91550a9acfaf04d3f12a3796d43d064b92adfae3a6170a0f51c81ab03dd5c18f61694f4f24590fa0c5fec9b5fa438bf7d7fda9fbf27b03b1c55e86df53abf6ce0f1fea44f9c318b10ac0d2add273d1a260c432c662b4be4d8d366edc3f402e406321e2609615a77087175b68a4f65fb5f3ab9b2e3deac34972f7d98f49bbf44d27173f8d4278444406ac6bcdb8f4bd96595aee1acd449b0f3c4ad0e0b945cd5d21a80ab2461478954d260ac4559474af5a78337158ebcd05b3d65ab7d60543d81a7d4ab6ea10cacc262e4035c4fe0b67bdad701d2707e1959e447ffce924dd27db3e07837694c34f576c16084e5b0a254ca3af0582bf6026c73b47973ac924b02992490032cae987a887932539d3fa53cdfff711b03bd11ff464bb70111d9edccf21191566d8c7dce328c075cd8d6258096c5129fba4bceaee67e270b648d51393947eaa59e6e2b7cef6a3de54b2ca9cc890c335a922a9ee7debc57d707151be3f9381a7541dc47e339a47491469ba87d113581d03dc219368986a8089c0984399c529f49fa4f49bd8bbb19f56dbbb81ee9e15c951fbab417917db62475e340c6ad37e7a82a4fa748502ebc6622f54f2e5d90422dba6d06076102009f373ad7f7964881f45455f730416fca8808e0e427f6b2c0ee8061758282a3f5fd4268906902150cc2faeaafe1ca1ec2cf82070d984fd9576c2430892570e424b34a0520875b2dd6a8908637f9448c339110c021fbc364843af842b74cb6430b459098fedf1be37df9b7a125d35b58ab9157b4c7defbf4c5bf8f109674bd312848c88c91ccced6715ad2d4000c79049934a94d759e43fa9a8e5b329d4a103efa2154587ffcee974f2074974d0128006aff9802a1c645f6811bdf21321939dcff63c6951fdbf576660f1f53735dd2ecbf56966cd2f37c7907dcad550b8ea49bb68491caf7e66e24646b2591097f2429f4de46f49f8251e29d6528567ff6daeb9e083852aea8c301b8b939e875e17638b9fb0c325e1f60c3c039e2ae060e675d44634cd49aaf9e9ed19dcec24f2153995d31689e951713bcfecf6eb44411b451182a21b952475b6c4d7d56a70bbb36dc8d15eea1eb05f50ed79a1f01a0cd6c77a7c159895c1c83fa9adc541f222bba72981d00d4b6588f69b92e962ea28dda3161dd76cd1e9b92ba383f698328df38ec2cbb41bf8dab4d3e31f14693dfdf880ed4b2fbed1051222bb41ae98b96525cb9a98513bad76ab8fcc086b2c99f3f10608ef64b61e7b99cef8d036690e131706b9cef096f3a134d35e3536d489728fde6ef2bf7e3fb517d46216d632bafd92e62857d95351c31947a28ebd8892e299b0273a883bbc1953df01fcd51c438d5d13ee19549b504420929ffc47713eabd8233cb107181e111795de6a7d4e332a423613fea996768d125c5e651eb6143514e0b43e833beb04299e004914f0113b07f7a0ed1f6b4e04b64fe5b388819ce9148f97c846ccae5a52a36f7fe32c662a75fd9ccdff435d12d6113ecccef75f2da2d7ee3996f4ec7a5a4c34f63228b95e54f10f8891452d1f384a719a3842e46a8460c078bcda2fce09405694490c923f6c7a01051d9a4594a5a384030d8ab30983d3156d00a8febd2728dd436f01793584417b2ceb692dd7e5c381f197f6557067d8f500a983e2af7babd2eaed2ff7a866ed84e543db6e52c0546f4b1caf5109f81669190195620cce723c710bbd9300d82725186c188f6cfefb57f9e5dd2f3bfe3678a04e06063de82423bf11d3d6a5a39765adaf47188c666240e23aa6786d40df2b7dd9fe56a8916a8fbe479b47008fe44c8c5490911cc23132f06235b30987ba8998eaa4dbb691ec8955f53a6e7763b7e29ea31c8383d810360aa7b068769b6f9ad9c8201ccfaf51186c62dbd373e9b730c9e313762970a552184f40201c44a56629bd9ba15cb44245ecd7a4ff5de78d3df65e9df076549b9003a30c61634a04f66e0f3df3c3696617bb9cbd799b26e0110e5ae07bd24b98f8b1eb3db6b374365192072d996e936696c2f94fc9976e59b5f720079ea51c44910b6ffaa4748be07f7bed941bc3fde9cae9368278b786a0309bf838e257904963f9766cb50e58ad89130999022c6e98bc199a7d0d65385c8ae0299bcd506f4c76644aba70e9a0427640a265d510ad1b73386e6910084a35ccb0fd5ae9f881f8d332310d5d6d2e4a4eec021f1cd78319f72ffa6d090785d5fdf2ba9abeb88df2814d748d0503c96b19fe6ff060e8b83a51e786b281ccb1e1258ea986d2f65de5889b5b61ef11384de05e320027ad142788475a6000be96044c6b1243b01bb777f1062db2a3014499abf49376fc8d5f88a436be9e0c45fbe47b733dfcdd906450c37534a7aa39b5f780a8d97a64f06004ae9ef9942fc9aa29ba8d71d7e2bc2c1906cfb6698b23530e69624e36e93ee044ad66546bf0b2697c0fa1f8fc4806d67ac2fefc1fce25e5876d0a38cf12e0a7f0a976174bd76901858498189497d82c1a00e94ef2fca935099488e070673c7dafaab68a5b6d543aeb20581ac75599f4a2c878f30a9c16093de7c48e3f71bb2a29b90ef4c439dcdb56ebca46bc0cb0f7b92093358e36d42acb6da68a64b7c57507dd669fadc469ae70eed6e39c4387fd0812225aa7534b605a2f171b08c2c327f11fa6d13f946479de30653b8e8385ce37a50dab7c7ae3729233fd8a53181b088e85b6d3a23333054bb95d94bb531231ede13c703633042a1d8342206c4337e0871a7eedfd29401a5d92a8374b3b96efd2cf98f1fc06164ea027cc227ccb7d7783e3e66678fcf27fbcc22c6c65c379d08f760775f77c81a7c62585dbaa3657952bead7883d36b0fe1151d37a3174249cccdf72464e1cadfd348753921f0e2c0127363799715ee45d044883abd8d5fd1b3010c2aa2a6e02189555208e02da64841ecff0e23ffdf5653cae2645826f6d156413ddeab3fbe9bf8f95d3187c2367e6b9bee8abcd9a4bde628ba39156c8dd5110f0ad4e104ac8bcca515478b5709cef9f0a093c43bd4e901de8e2d77d6ab398dbad191d6ae408d5ef908bf6d4496d6678bb39dccaef664316cccb5f1fdd59b26d5408a1e84f12d3a65b60da02364115eeda62d48ab6fbbef53f467062a735676fec6420b3154d7d96b9bb6b66c081c2a76d6b6daa9d75ca61493b537152b17f897e14e3f2bd209d68b284f2296e93364b7f3cec52293c2f02f39251726633c162110032ced0f5f9c44ea3b772c9e0398315bd9cace4b8b5814433b08e6925f6a3ad10556fd5335b509600026a58d093f739d6c4dd555123864506b8ece5eee6f35a2c93fc544189b791831b38a3cc0b4ef26fab10047043b8fcf4b3b561f659fb213c359ed6894b9f47154906323a6a3049709a6b7a7bdbc073e3e71066a517630928837ce2726bb1c19cd6f98e83784744c1d9163edcb445b2bc9d267b63e7d21bd8c5bf0064af940601083b3e10fd38ee4ab03ad8f996f0bf681d1e289893f05e34438eb8c7e1f01e2d28f4ca48c1ae4cf467ffd13c4969a4ceaf21f5ace166da2545129304c76f12077d4bbb928b4f68a5458cb00c945769d59b576b079adc9791127218812ab7e9765169975825c34946930afdd04063146728e7111186f99e62f3d7d0a7d170ab64ea76e90155b3f7c09aa041f21534af6ba0fa6f336c66f67e306941de864361b8919936f5e4c77bf99f7702d9db7341c849b70ed315cba7cf114ff58f0fd7125a8efa089b9aa6dcdbedb6cbed5ac7d3686c47755b4aceba3bddb2742035d6c63129c2e65d3ef9224dcb8621965ad96c3250d12c31d11a36acdeb944fbc0e58527aa1959a29a675536800f8e3ca250140e3f7ebcbf725523095a8def8678ae58235826e8d374997e8055789947fbd5d3e47f76ac6bf728893a9a55fd2b25d9460e7d121b569536a51292eacb1f2d10b29c59e0849f263a7126e63af4518e0e58ce5f047a94c5e7d0d47f8caa2c00a8b81f15e4cdc2c934e2b786645e5f7cf4954c46258ef5cb5409ae6387c0d73c46ee53fbac0e3ca6bde5d4c1fac2bfb73305707c9ddee27124578888029586a8915a21535dcf74867e8165e025a9d80774b0234893f2c17d00c34a3426afa20d320671642299d4301ebe532b0c9a12345f9f4bf12f53fbb88f53dcb01b989433d0fa2c7721f2c36e46a484ead81dd5059bd9d1c09b88f9ea7a11264408d8c3e2143d38d48265a9069e3ce165b0ba8943d1669efdfc1922db6805113715f596e2a5d67fc36e77efc1cd8d52e4bdfa96b6a84f99f07d8fdd52023683d36c7977fa2dd0e88c0db2fb677c9fc0ae26646526c99ba9e043719419f0ac655e32eccdf451305a76869d36c0527b110c14815c5bdb52b8177947aef6d96fa02192d4ff96bb00bfca02c00893f8282f46afd7e41c877daddb459a93b265881a64b2bb77a91348fed1a8a4daaa15ae00a41ef0663375226f75cff0aa153dfebd6fba289cf4000effd0a1d012cb52166e6d8a5448664c4ce82d40d45de609d97089d3a4d6412b5caa1214cc1abf576760eb1a89f47eb400ff4ac0cb13ef70211afb25b68d563c39e7de2a21584ecba9bd64f719d04357489c16765f35f61bdfa50ed7e629fcdaae9e7b0a56363f57e56f21488c467cda2ba7d78b1729c4b21bf80711bc12fbadc1b732def31a5ca2225d6a3668bcf3e8b209d6277b5821dcdbfb31fdc1b11b5e7c1a4bcb816e6b55686f87e9379c6e27e3a85b70142ad4412996d3c07c6c2495e7af0efb87993517bf8dbf88804db63fc86dad916908a78a0cb1348575acddf9095fc2968d038291309f5b3ccc3793d9694016b00358605f8d349d7235da0f33ea10b1c31b141a6ac28da32ca2c2cc9dcc0adcf66883c867b20756af435c82eb92ab21abba34c44b7e3fdf818a562b32fbb1488a22f2a74b8513a765279cfec80a195b76f1cb4adc6a9e57620c5b7641fe1fa294b90cc5b30e3ed8bc6a004b725940a74b494172c4919053f8b1397671db3a323eb338e945547130db93f23092870a4c5249fe05acf8fe1a6a0058f36b9cec3fae9ae0ddac5f95f8eb2ad977d09d5e94b5796aca3ba9d1f5e18221b5d6491c130cf56b678e37907913b81de6d3a223c59961ee8b1aabef2c85bdfa835be8b2f4814d415094e54cf87cc42546449e4328288af00ef00642077d3b4c26a283952b3529ca5f6570afc04dd65b5eca99a5058a7bda1c66c2b1cdf28480675221af004f116d5eaae0a318af7626f80e9c31a4e7bc127d24e823c80b1efc0c13cbe7baf78d95130a3d0f47ca2deedab7aecf4c66d602f9d180823ef1932add8f8825a35726a7482e90da96c5821ccd6ed867472f5010581590b578cb6b71a46b60510194630cc3bde1ee4dc9fe1699db21e1db6bb2a6619a22a4bec22c3827525b541dd9cd2c4d603632b4fd274506a591255142852bdd053d3758fe60e92fea82143f4cea6fadbf998e128a8811dc75301cf1db4f079501ea568da68eeb84dbdc7aaf15453ead8111eab197a6e3e2f207ac025f9ba14e3430e9a6e33fa6eece716eb45d63ff134ea62ed74d0b21e1c51dbecef5ee63d34617d8ebdcfa82356b4ad9974cce1ca8d06143cdd43e35a2957a3b9bc6d2b4ebe0a70ba4ba47e720596ea1a1090dfb34ac490fdb53c785ea0b2709b2facefc5daae96a19a4ae3d7941e5b017bda8067f8d677b48f22f7b84cf2b125bb86ba4f24be4de92c3b8ec06cab8ec448f27a35019c16f5edbfc7d37888e3cdd282f12726ca04d563eec5c909dee3f6fa8133c70f862d46333b9f5cade59718273a4afa5b426a1ae3ed3f5de618f90df2ff438a8d34f90a025eb4a067b939890c152e352cc7dc0e2ebf320babfa4c6dd4d50ffbe52918d5dd61ce4b30444995039c017435bad943a6cd743ea5f34cbb12ab1f97a1c31b1e271d32b9924745c0a0476b13e0abf03fdea04c837e84786a3ed9e8ea6da37e6761c99877f812cc80649fc1b0c81baf7758c04156903e5dffbbfa0260833a91362fff5602ec373c78b31dbbb7567a657e87b5d94485717be00c73e296ad09120ef446f1e6f935241e2e49afb40648c0b9fde9aab9b8de40bfb2e00ff9258f6f462108f290899d01c5489c142372273fae2de40c42c4c55ae341b6e104874e179068edee9c17cf5412749d8f72046630ef9a3d946c13d7190f3b711c456cc599622e3e3c764e4c998a34b6884c47b642e2b54ed99230740978029708483076633fd3a2629b77b550912b8f850eb677f42c11a02251a53caac229a13b696ce1039e0b9307884e6a07dbab711c35cb2bb33031ca2516ec918b8233283c458c8608e1388881d91d0b2dae5713a45e10521e739835487e61031a1c9184714919e5d1bded0b67ea6df940ad90dfb3e4008b747ab76a12f4bd11d515d75e71008f710c889b943058dbb4df3deb4dc164262873ba11e0faf65b3e5ae2670ec1e877c7f7e5b6ab6190d0de57f3e8e6635afbb99ac62a22870fc5f90a26e32dda8d4d5b4239d0c9721ed7d65953fc220044fbdf380372b74dad87c26147be34215b8a9b7a098c66f87f6b2d41c2b7993e9ea0e9fa168e17a56c0b3b0eb97a9a4cdfba08ede91c1c5b2f0553afe48da454d4756a5f53debc24a7eac341108af8938656343c4d324210aa30da022df0ec0992f3e0b66fd72d41fd80ebd6d161b7cbebe9ade39a5180bf7d6830d70373c8c336a6ddbdbf29d393e978250e70b1602c7cded65274ec50ce1535f89d09a8d2f85c08d1d3b6295780d83aff7672dc7a5bb5b02e2751752ab30e0481c2a4e2933f5f943d770968119f6633eb9d5c657ec0230845c0b48e8714c46e6cf669c3720eddc391361d68aa46000d69f191ced5f041419dcd129aee59e4ce2a96cccdf7cd43217d8f66ad8a2b32320af1c77b28729cf6969af01cd8f8cbce4b224264bd112c3842f1799929b5692c3f3c421ceebda281d0b8d1a6cf77f5d93f377f2a0a60f57291eacace115b3166873fa6168147de9ddca53bab4a6e0f698734b77098432b6aeb09debec9a3176b736a77ea8887cd850afe92acd2315509a3b8afeacf2e5a7baead29edcb1387c5744b1c1b7d13dbe1fc137b2def6883342511acfb17890f4f5d6340dd8e330eef1a50272bd772a62f20925990fa89f6638bfe532419e9963097ba98009b681952c6280d9e100a98e6f8d9c298ac0c4b3238dd16f84ed69bd9be11a3e96b49439b181153d4cf62408415782a874c65ee0acc1c8cda1ec68c956117090a865cfa2270da8e826e002990e6fc15ff842d5b67a65b195c024fe51df1291be67509b97370b20209647ab097fdb3f963bbd90fd368073100b1b941be1ec6710fafd61e18985672ec4b287203ba5e69568bff97d871bf883a85b90f102a8d9cd8af48748c482645ad9a9fea6ebd59ca3a5ce77fd163d2739bf6c5c99ea4dce3f3ebe7794910bffebfdb4786236714b091a7472478aeee87979d45edb42e330ac3fe2978d9727202b575c5d1dc583da10f13852218c36238afd1d0081b273e65db4e851fb7fdeaf601028159f3f1231fd4fa28054c41ec0b574cea951e103d89ac6590ca5f03894d34fa108b04d27381b5e3b62a8d9ada8420670c015789eeeab9dbb2f54933eb7cc3d4d9e1897c9d7b1468a61e474ecc179da8aaf931e4910d7609924d010f7019202b6409ec400f6062f18e6d23ce1f4a119a4dd947c0e2667387852e10e6c586fc564540c7cd47d63406b5738da962a04ea47b2df3af418a34ce2214f35a3a6a9aede4428694e5410a10d1ddff51349e876f9963eff03ced3c55ef9e12ea6d189e7ac76bb317563557b86a18f365e3a96e545f1777344303fca754260a17dc2579556548c7c52937af65c4a0f4481e6565eb02b533fbe272f84ad6495352e625be3644465f3ebcac639197f29c984347009c4ac9a0b7a99ea1a91c74593c398ddf75fb00c3d4af1826d44aaa36a6d0b2b0f08dd147e7e70b9b5a6d43b63434b24f9cfff4a0377f1f7b9663246d14655d09804248841d492e47d76f13e4cb76579123a99e7ed78b06a46067fdaa617f9a7cb41eac0fc84e9b399888715f626cd24692ae6aba25718263bacf92790e6dff8d146988256945b6d3264ff890a986b6d28264e5ecb1c1072c1e108f438bdef0bd29b9497f70ed25c6f93bf623016279b74b739c70fcd7f95002b140b46a31127f5c948c788f935c6799c31680fa6e9f878630faf17744fd81f15853261a12d9662571ad9b15e6cf47707bc62505399ca59b538de8b1867834724c33231bd2b9e42cd749719445e2e925dc71a9a221f5a42321c1c12c2afde9fe236d35f01f388bdb4bdc769b3f5bcf224bc56961d63f05964233154790f3050d646dc93756d9cfa935d3248b418e5bee702dfec4b4ed4c6d2b6e4fa456fc381885c177420822122f2bca05f4daff21f2b017d43b4c64db2043bfeac2eb7dd5b81de4aab0a18615c5942d95688a32b3c7a21f74361b4a445831c48113dcfc70648363ee03b18a2d15157a4d46ddad83e5bca1795590122a6d6bf87d2799fc9a965cabbbabc6b2da86163ca81033d414c5764a3e1a4930cfe858e8696eb102a6c610489e194f74a0a12ce140652b4ae8ff55764ce4b54ad7419ef0c0699083478c34b6ffecba6401feb00470b6228662ebd0b2205552b4c31194ce0ca8d702df5130636b96a5f590e74612e373c7fb25237e9a52ecaff305c0d0ccb89cf315e0bda9fa6b97709db00355a9033e7a3da23ec57b4f0b3baa21e7d9795eb65310fe09e7d87a7fd8e0f1cb75134a66b7a26c863be19f31743ea9ff255069a595a889fea08a12a01d53d8b81afe339d1eedd6a24879ae0fe825006f4aee53bb393106e43a8bceb8dc6ad741bdd659420e64930b818005f705f1c7c090afc7979c3f07533c59f91a849a6000e41825e6049b043a6db121776c29528bbd111f9b5d471de41c713c55b467257e145024099015bca76369ab117930433916bed666eadd9cef616e02fada557a01c50ace1d4f592eeb1935ed45cbab1c413405866ad36706fd81ace76a64e9e0448c949ea190d9dd7de5928294b1fe404cab81aa1795780e9713ca4434e2a8eaaec1aa1026e31c3ac85f0be58efabe51a3d3cfac1daf84f6449e22c3dae1f71ba90aa7cd2dd494d962ec0e8084d44fb2ff532c16bd8012607e6762c0dcd168d5ebce1a2016d3d83bc623170e16fd3706b780437497c5a4dfad25e6d5ab3f82cbcf927db3826f5ad47a8ab1d8d5c418af550182403cdec0c669504b7cd69ab94fccee4ee1f115a135e8996b6b11c7492f604d85041d39dab73b5ced20ef6190d47c480a45d3552fd2a8c5a04f8b856cf951dab83aa97567148bc2685c46228e1c56263c59b9bc6b2d2395fcf0737ce8bfb22f884e62000a80e32739997b6c2569d30f61980499f7b7f180dde89a1c30c4f9b291c9e778196ec9d1cd731f9ceb6f8b69f67b549c3a059b2cdfb24fe1f9cba11a5137aa2c3830b878b0437333447fd7dc779e1a31c69878e05ec8057c981640bd43121abacb9927727eb546cdc52d50cd715ad5d911d32341f7a46b3a90374111e3d3c99267faaf658532eadae1ea7eb3504c1810906812d816d1e1ba76c13abeb017275181c7b8b86036dfd92f59ca34b0dc4166e6a9d00958daf96ab026862a3436c4669d92cbe19c4ba65701ddcbb80fa5f25a792ad35c1a2a22c9d0f9cbdaeccd11403fee617795ebdec30df8ebb3b9239b59cc6da556f739ee565d9d64574644ae8cdd3d01f0f991d9aba83da2be69cfbce354e4ce706c94ccaeba93f805ed27fc9af9f135d413d8277f651e994e8e14c785a712a73ee6c54e218c6fff8d2e017bf91acd6597811968ccc91e37ea929d5bcf3789c818e245d36d27a3d353954bbd25b40429c1ddefee0258af06f913b3da1e8abcc9a50b90fcc020b21bdfcf7120bf5a47fad966c657be78536f108e12d302152df459bf214ae91c2d41a8191c5714820b4144d837166fccae08b76e14d7086b5000bd89811e465e77ed432ea7b0c3afb095aa8ebcaa84aa114c643044469001c55736d73b17468c2467176c9dde5b47fa706116b1949bb52fa28d712bb2375ce0605c34b9968809a557bb4f892039ff2b6a0efcd06523624bc3b9ad359a7cf143c4942e874c797b9d37a563d436fe19d5db1aad738caa2617f87f50fc7fcf4361fc85212e89a9465e7f4c361982f64c8c5c0aa5258b9e94f6e934e8dac2ace7cd6095c909de85fe7b973632c384d0ebb165556050d28f236aee70e16b13a432d8a94c62b3db9e087727e9e65ccd0c9bd77f818ba001da5606a0b9e727e333d9362f2faab6d16ff8c3a9edcd6fbc17c1710325737d9a3ea14c8886469ba1da3f487aa5ed8d705a440385985456e270f120a8a7c453fbfa999f0e4cac20d005d9920445c792391b7e9953a017bcd0a69f48d89edacda7bca380baa374721e552ca56495b58f9bf20d078c6b840bf737405c0b5133453de3539415f13be9bd36ccf5140c33bff99c73d0a87135bec68178fcc9956a552f0d3e4b98dc5f026d392ef38b1fbebe026947773047896fdf43ad8d9ba1fc67eba8a809cbbb7a568ecac7333246d30426e70c8dac550b79a1cc5290ea2d46080434357117250a50926a3a36c2280d1ce7a4176675304876aeaa1ca93d8df3bff94e7af4139f8b7b2895dc708329c982b51f1ca4435face1665b40391e4a61fa4b35cd1549817a50b1ec32732dd294b01fb660c96f39c544595e71c304f93d417aa8c0571171535bbecbd0b10aa8fb3fa818a84881651e0a083235c979f0c21ff815d93c03f5b306bfb34baca213798bcea437a3f25803ccf364e0def5f7bd0053eb9c26a974f5dc2540e7d89ca87c2ef3e7b35e6a8932e79b651755f1447a7d0eb87db97a85a8669fe359c752ee8f83c8619fea327f17f460c15dc1048d86f098faf266ef8e57107018f5fb5d4c3044bc9051d9e2b02f7e03f818c298296ef573318eb181156e74566060d72447eacc30f27da013b2e5dec577cccd34be9f163deac72bd7b16b0cb3481f0d30783b94c60677cf1e0dd7b155df0e3362a393bd498520283bc8e944073e74e01a438f290c5ad4d98a177170058c41a79a7ee975369f2e5955e255b4c2c227023a307213445e1931e0664fa5850e0b9c54a70cb885a756119e942cc9866199e628d570ce3e9eb97ab970cecc34e2c08419c279f1a72c1bf38e34fb1cc29b420e6e98f7c43b8b3a165ddd8b4e958904e16247cddb2babf4719d6b3d0907ddb3dd63f1939fcba21f9775f2e1c7479f4d56b6ad54bf7385740e549d6f18a6b763e5a185c0bb7f71ee607a577ea09b640e369f79bb392f672f4c3c520de65fa6d6b9cfac0ba1c7890b13e381ce752195cc1375237db2afcf6a9dcd1f95ec733a80cc170ad0dd24461a3439f83dbf7a930b7ff030f8b6850cda857f5c938591c1069f4ff8bce826377023f62168ea06ea40ce6938d8df4fcdd395db9f835c2c08bca5b31c2c3d3debc16590a3cc7f471a10a168918a8750810a316a6ee1daa2402761e8dbab56ebc1629ba1e5c509bb90df7b76d17a3937a4c30a94313b8bb525eb6669bdc6bfa056f818926e0ef3e4ed21cf0c8f447f75c7b263f18d0cd9b5185d25be48eaf20c1ae67efab2f6d8539d6c1ea21165c49b584ceffae8b26f229611224ef394788f9bb231434b1911781032ecd00e5aa308e4f70128cad8969e3d9bdea4446fcd9b57efd1f49ce259d2e3faac0edc9f855eec4549f3b9fbfa785d41dd46c1b96bbfbdf3d3872eeefbe49747eeb712a0f60ddcbc1cf41c890551a3c780bee22ddd8d5c62a893879b923d989f3771370b8f8644c01ca288fc31ba7f817b652c299d54a1b0d3722d74973e6664f8c5c03b9c5892f5ab7775e22a036f042fe2162915d62c62e6db970675779f3da51d34cda71565c15beb79c738dce0c410be26c8e1626afd55183addd779818deef00b1e5a1d3bb79096fb07f8978345b041d4758a89dbe4a0b0af4727a4ebda18e6b9ba0ff0735d0bd27040e3d3b50d9115b5bb7bcd0dcd4c4d6aeed09a0ca6c549d73d533fab0600568ffe8511f48035c221073fac5efbda46d4417cb9827876c1d9f4ae5b4157307b809d46c2c04210afdce530986e04bd2591cb8693dbc3afc7389c8bc3e4d4feba28a9b366b6c7b4671fd20921b98c77722a0988a9771cd2d289716609f3f3cdaabea0559e36959360805a23c8afe79ba4e377ed7af2f8726c333fe7adfd284fc5d92da7a9ce10202494ea1b0ddf9a8c4674833f78cdcb210ccc446b207f06e783fe8e2449fbebfd3bc40e5951c739dbcf53d809336629412cbb2b7af1d804176d955e55cf3e6d8d1ea4435944d53a1cb7e7d2b53b6a775554964191a2c694620b442aa6da04395235ac05b557a81fa198c70fcde13959f00ce44349a3995c59c5715fa1dafbb3df2941e1d7faae4f0cda67ebddd5513593ce0b9cfd84eeb05124a389d1427381a6521c444bae666cd10550f34f78508ea31092bb47b725350ab16115bfb10a172a5881c98b035eed7091f8b2ad5aa5e9b06d002a92caeb5ec8e420afc7a73de8ed9518ce0069f6558e18f5a681fccfcb4e4bda7779309f922e55689473857d6b62a057ee6672cb196bf2ae4b37cf3ca7df25980e6578b083ad5dbf805dec47332c02b597079e5bbdacc7a92d69428b03d592bf6bd213cc87c8858befe13c29c49c24b8547e4d16b6b2f06ca971072963e40bc72c698252230265543fa805a394458ee6a3351f8aa931156f5c098da64c6d0925ac7654dfe9dd65aefc1cd93336bac9b70fb68635e989af37c17d367021e303717892fbc450cc1f02a1aa1767006e3daff69d01970c3f164c5656a21588e8a3312d49f7bddc50f9e5ccfa409d95d28337f433222c95c3f313a7104104f5d030cb26f5d91b010e7ededa67f5656b8a12f585235874fababe342054a3dcdd5c54c5e241006a53571644568da65d05e7655f25e824fecf75e0144e7e4afbb3cf87a80b960e3a37bd78bccdd5c3c2d98d02db52fc082878a8013aae0796e02dbc31f7ff7f72f942c3eeaebccaee557aed7400a8c982908aa38a1dbb8b18388fa4fc2c3a67af25f8ed00a08fe786834e8b215573eb24b56a0ae343f3736f537e1c4ebb48e9434eceab5728d3c61cbae8d8a35050eb5f05bb40b533e25adccf6d74923ba76ebfe238715aae04c1118ace786267dc14a20fe2d77874049c111ac2506f03d282757ecaf173b6bf63157153ccf72262218e427551957ad6c18cb431424dda56af1482fa8e3ac9404698ed3d58ca067f8c843be721a4bed565a02a2eacb6f5a05f1d8d4bba285c53c60c7cdfae639aa0a0146accda1eb68cf30beb1ef2230c4c1ce +0xb927381128f052bf16953a327e8bdb5fea57b3715142ea1e0eded78b5c2061dc68cad2956fd5ec7e51dc22ebcecca4a3 +84184 +0x97370b26001e364be3c39b545be4dbf49cfa51a58f56e052bc6fef536d7bb19f103caa3dde1d6ffcba7dad645c4b6cecaed3956e76d7b2d736e2f62350d97d896ed3d4f2212abcb0c9d32b6db4ea94618a9168c9e8fbdd944bc4ee5f3084a3a379a3922d136fa6cfd66b1f56aceadabbf6ddd39e2beae8efc2bee0ef53a3ab57f955ebd6fa11b4c1aaf090078c73c763bb5fddd588cb5b526577d3bb025f1e0cb590e8d61f3b6fef0d0887679cace2bfa1be8e5647c6bf24fa98cfaa84e0832976fd9013ca135dbfc65b0b6024beb3386fa3ee09b0059bcd4ac8dca6234d62180444eb7643c1089a9f9224d96bd1c237efb506d60bad77b51db0039725ce4440270c01e7d16ef8e95e55dabbba0b9822e79ddda69fe9db443bf74b63d38daf09a7fddb4fbd42b312cc4b36ec5997bc6220027b5fb5df50e26b46bdf375af2edb4bc080945064c37fb11d3f55909bb660628de9eb95b75df776455f2f535f461edcfdf8a0cffdb096d573fedea7400f8374e62e30879a8beb259b3bffb4c3813a235b4c59853400c1fff37970e5ad4e3220b45218d3b061263ef1594ce2036698e58383a9b9323d67f948baf1930bfbd72c9f5e8ac020671089eebffc23487d9eed1da577b21eeeef8918c94bf9819ed96151596d97132511d03b77f9c0ba4fb502d0bbaab9219cc3780cac645f38c0a0876f4baba1b02492d97f892901806345eb44cb2c1663ce4a8dcb6d260d57e89466a43d2b2320ebf96d63fb762dc341b77122e0e4110b0cec92fe14774a079f1dc59535d5688a02b0548fd7c78eaa72715c12ffbaf242df114d4ca74160706ca36eed3e91b717f21d56aa25036a5e7ddd74bb3296002fcd21885e306b95b9d78e27525d4757ee42aa3b5ceb140a06ea6280c6806084fb608409dbb6dd320b6846b96d9cdf91397abeca4f33e1b6cb42674adaf200c6cd20a3996c427f7e8da833ece50241ad1d23c0cc280452b5d50c5698a08e5f0ece94e4ffb9db39c3681ebd87629756f3c4c41a0a92674f514bd09633c05e63a42544b0056989f347c3534d548e6404aa56e533493362c0d055178fe3e16af5cffcb8707124549554c7cd49190e70341cfa0e7354b3008d7b1d67a96fabb8fed978798a0c944507309b161b9f8dc4cf8fd9c842f2bb469f9ac84b4ca1c8536408c30e689e5f63312369b629aeb166bb4c1b9a08eaf33edc758148e03fdd4011a505ff70ef2db7fb775633dd0e2260e29be70d2d0502ef2d536ee8cd129588ebf765d50cc6a7474e728c179e8689ba2ac365a8190b91617a7eb7b27be29534dc480c17a3ec741d105e33e9d3df8e7a7d0ebff335c4479dac3c852e5377884ccbde224d9c2a3d412b817232e6e1d8aac2c21a76e7f7cdaaa9d600e5bb9814d69f03ceff6146aab9852472793e541051e128a1ba986eca905b944f5e1c0fe1dc42fc38b65908628f088e5b464300dd78c1887946b1efe758a9bd9b21dfa298659b1489f9ec3a0ecb9b0954225dade8264c2acda29843cc097a9b0bb76a1ae17a9292e95182a2557325db8593f422d9636955c357b73220abb874c8a7273e63220fbd7f45830ae091904d172370285737005383ec75838b474a91f9797cd8c765fadf745d5738572cc3a7325a39870aabfa6a36e93900b7e3183ac7b6d3aeb44b3b3eef2167f4604da631fdbfb7079bc63de304d76d6f498a0ab65ae5938ad3ddbb22191a1908a6fb2133a1da536fb291b206143c7899ec41084fd98e2432cc2260d51acfd63acf3e1cf446337389f612411a8fa3c2464612fa4b6c3aee6e4622139e19c80754841e7fbd1253811b1053d3699c91b33dff04c8f33d6f5908eae6bdc43e8e121c6ca432d630c1e3eea75c4e396490b348c01f5a8f71b8cdc65f754490b3a8615b30d71d87c60503ca64339cd30f272a2d316c9867339ab2724dd8924a9d9e5ad877c02918fda84777efe2a37fc4df80b5f9f26bc2a99f70d25e158d3a27f9675dea653cd0fc3119bcef714d84ab3e1da8c0bab9eafb4e6faf38361fa77640efb031d03ff8ec28e0620de6802cedce69ce30ca6c25522f17d083422fdbb5fb5a9af3091bd8f4150332f04b26bdb217cdefef2c6abcd6cbd1ffe842a41c0ab30fe3d816b6b83d81ecf140a7268021a0afd2a5e89df7aea903020e3d68b39dee78538a01fae0eef4026aa70368bd63f17840fb04eb1d035217a29f3b62e89737fcb2aed2ce9730f4ad64cb66d4bc9f929101988a3e78fc4c73a740457a02201303c7ef8f19272b0b55a654d852c4fe0c60dd26817d4ec22181d99b61984b5f0cf55bf242c5d606c062f9eb62ca1ea8e54f9c4af290e87c58a700589aa4097da93b3662f2b9edea9b3c25380a2413c4a8c505aee45e8e537a4fe31ff58685a2723b20e5a8ddb3fe254cf2e2da48e97bda2ae1fa5fd1876f0ee04b967c2707f4f05ee1236b19726be5f82892da1ee8f405e5f8d66cd01df79cc20068366dd69eaa0c40c64355705864a98eef118f5a58b06012e811449613ad5cca3b2b413cc629ae07733879f7ee28c8eda2878185ce6402f7db58133bedc81871b8648c7f95f3aafcd4536d4d54bbbb0d5244ddb37fa8336e55492654aa755dbc86e834e832926ae8919b19bab3a5ecb6a8518c2a92045b41feeb6529753c94744dbf23bfc58e549252196688336cc1b04bb575323000e2368046b80174a62361b7f23f4c786dd2c4bed33afdfb9aa4c2e5787f158125311680620826cf3a734b6a8872d671b94b447dd37f6334b6fcb61ba39419acfaaea8a9483bdeaf80ecfa0e89a2a7d8f927db38211b0005493152973c9b88da08c2b6a0ff3b723c01f6364cfeb905d6b6cd5197c3f81d97daab5f014e7ba832d5d506108fee2a9d44fac6ccee9e399377a76e41c3fc0112f1d1a400de1ec2ddeb50629f013e4dfbd25e733561398b36c41cfadf2811f69d170deb3df66b1d02d29990f55c12257d318c052f5f7242e72594bc18fb1e4260d2c6fa609d4a03ca101a58bba851f84cebea4464f131a8d023777d95430a2e84ad659a10dca3ba5d2f3a8499ede50f8f88e2f7791e5e0316452e05fd08bf02312d5093f5ba5e8be2b760da3634b5b26f8edbe819efe19ce4141f1cf95324068edcf0adb83f64be812ef6243b84a92814873dddea6aa2bb6017b38a312b2182c441adb001739b9b641e63284fe6a9bba5fa6f9f94998aa8b2d652164c989ebdfae4f063775fec6ab00e0faf1b619db14a70dbf6c0847faa03d9658af3a28300594e1f8fc30a3f729087628047fd6d532d70e8a916326a0a7ba952accd52b8930906a4fc8d7c7dfc2a10c4657ac202e97382fe823dab341141cd834583af26be3194e5727cbe8c50a6319d245cb942bb472e8547def7c3047ecd5e1cbcc1b3c9fa814cb938d756b62d72558696e91610cffde5c1a01f012e59324dfb219148fb8b543f986acfc276e75c5453d05b6632337687b82c2ad5d6fb82b7a85926ce9d0d9528d9baafb7d7fb760253b1151b679c22d1f4292026438b4804ec0d892bf7a7cd6e42cf7e1f229148c84de2211bf832872c3c4009debe32099b8fe5c049518283799c5244e1a0d35b0c0b0b87502d1c2f015919eee48f184fe65988d50ef3c53fb1aeea09e596e7363753d34da14d83a2b6145bd620fe64a14c129fcf642499897e4240d6134ff562b2eee27df5a28e66b533aeca7a533f883581d1b7322e26ea481efbb253122665e4a4e11e36726605647ebcd1dad5d08b096fc794605793e9770bc4a68d26a1c9343c78394b0632072dbf2af328cd403231a4296ed5e8090f73d143b9a9d48f150c804ed51ca61bf277bca3384c83b60513e89e4e7b28afe2a4381ff38f6418d2d3360cfa91994950a93ecda92e3f5b8d1803ce3b3961aeec7308015c271e6387f02759b09229e3a82d0d504db7495651a8bc623df7d92db5460890fd5a4999bccd1bde00079c11836af1d52dcde8d0d92cdc025c9dda55c3860175dd0e2fe1fad1da43f1d83bfd68c8b2044f5966f1ae0a2c55a114aa4da09cbc57042c1664c7642b2f8ced4eccdfaf1784bd4409e057ac71041342913ed4eefedf7b9d474aaeeed74ad82e1da97087eafe7f741ac65c7876b6ba10d950e5e692b549470aba34d7a73ddd84efbaa4b8f1199bd3e0ca46d802149f66c8aa5deb3f807614a7dce38860b0a3d50e2702aaf57e1b48a5159c33dcc6c92da875c464cce80beb65d94267cd4a330bc01913c6bdd406baafcee6f1cd73404bbfd8a0bb02970fb38dd9d9ddb5b4940c4eb85d7213c46513481ead799dc30daa56fc7b57a9328a5667033153df96cec2002b6a17bdf63f3ab62d773514603730b409dca0896485bb3b80d12f1496ea131d9bc21e84119c174122cf8cf9efc6c723264cfe69d206ca517841da1c5fefe9ef2febed30be859233263ae6161bc356e97b52d91227186bf0120abdbf97e52bbc106fee89a40093d26042ab318935c54f3176994d09c0866276b33fc5e7d4c1cd65d688566c180268f96e4413e424fc9d7040a6e0210803edcdc4c7f5f6c5926a57a62261bdd2c73b18461784d299e21b5f39699316f7cada3fc6bf186dbf88da0e6926704038ca93e6538d4cfb9a611127e848309095c471f3408ef6f3cb8a67b1a6fb4c9c51f4ba8b1c0f32093260c6efd5ac7d39ebd7f912ba9c5731f0815768e609bd7a252bf72e2a03ffa166c883e089fe44b600ecbcc3bc5103ce3653f35db0b88b82bd5891f703d27b6d407f90228ba44bb2ddec002fcf15c173a5e983b58c707d5b2064d10f31e56e15c76e35dc63085bd388bd0e7d7a505bc8462b4f9b02995cae5635ff9e3ca3a041037dba379a903bc10b492ed6466a977420019e359b9bf02268b563cbaa73d998fd95665ab7a6b5256e76a762bacb3e203b54baabdede01605dca44bf05bfe0c2bc9c826d42b18fa7b72ec3485edb1873a00ae92654cb570f3d5eeca2d4ee7e68487c569ac41992eef058c8b1ba03ec16560d74ce83c8b9d81158a19ba0687b32aa1b2a07c44586a320dcffc457a984b06543a3caf53ef163e0a0acd2f0949fc7e96346dcca9f336d50a2b0aabc37a6ead696bd433296c557b21e55704cdcb1d00d3af1425e8e60f58791238a71131b6cb0ed0c60c036fe5d8fbae39d3ca77bf41f8a7561097ad7e3cd939f8dffa7aaddfb2fd64a2988641c805ca080495ec3dc263a186052cb5ede2a8f6edbed591de6c0466428f5f2be3d8cecd242fa67522f2a322367c2eabe8ea76ed69bc3933b2e0619fe23aaded667bc52c20ad82bf096345adea0df3dbf9c4b1620f60abccb5ed590eb63d2b372431776b8016a1264b94a9a9031342d28b01f709313493b961d3593750ff4d95b78a540fb4f3885783f77da82424623c3712964791b087a64142f0ae24f99b859af6e99d51bcaeaf2d1c002fdfc9f85568873db1835cfe0fceacadd7b4d48b833907b678c8da9aa9b162ffa4786c6bcaa9c05bbba8a27d528480ff5882e8941b3c2d39469cf5c2e3bb7cbaaa80943318756e5eea54197c1aed60438511de4bb9fee7e06b4066bdd9a5b9cfa6aad9f4bb45e1d5a2183a80d573bb38f1d40e28ec0bb85a7b55d5f1e7fababd3d4996171fb5bb5e97878e01feb2024e236bf0a22ded2ef5db4fabe5bb44eff1b2df6110d22f6b382f047ca60322c5e1ae2c3e5dfc1dac412f80513fbffeda0bcbeeb3786f2d6210cd319eb38f408691d6a74f92e307c0cadcaa7e3662930979ccfa15c4433a306716715cd10f85b4dd516f9d175f460d0167207b803fabeeba5a74007afad076b98f564f74e07ce12292d7bf21dd52d1835384f193c3940a4bd90efc12f27a85769c42df15ce909c100f921e68f9b8ceaf263a48f78b05dcbced0d6112c6b2ed2cc1e9944a066b36244c01434320e2450353d30a12025be67bfb01e7f0e3f42e5a949d077844574fbdccb7b646df69e51e60c1bd79a610b807878ef933d6c8c96e88ef9126e50f696b0627ffeaa1aa1f5ed198db94f2ceb1fe17070d621bab3ef71353c9dc84dde3aa8cc488b5043d64532acadd0a74d064ae2e0cacf22f060f82c86c2a1f905d7f0ac53fd93c739e4489d0da3a30b8e050c630f2407a9d83ab802c9b3a6694087bfa43dc69c76c47507178398bae1b5906a4c46a7041c38ea37d945373280c696af78d3cc30c7ac2e888657b49e928b4e6e85cd7b50e5d9177d9b4374cfa65eadc8105d37d621b8b9d5d4d21ed687d8e81ff6ecc7736a836a932e0b950443d2741354232f17ecb2bef6e739ffea2764058588ebb3f315fd8a807ce5c059bfe892972d6cdb799160e4f1a9d77e63d9f64ea92111695a4d11214c6b191e578269b05c81826386768ad4d000f3c4c807586b92aaa70e2f7985d400e5eed685f41c756b3aabf0c604fa369bd6d4f8a1185003480cf5cdfb03224da2d1ad106c7ecb8acb3e30aac0a377b15812c3437774a7bed42d43cc4552b0343d169ff692863c96847759b8fcbcc8ed119c08cdd08325463df7d93395cef730d69e09ad817638429fcb6d4202b5b693cd5cebbd37ac91408b51fe2b73dfbeea77503660c1b487362324b6725bf8094b953ab43b315ab457c722fcdc68edcf0a27146d35d8aaf11918697a6e8eeb89bc701eaa7148f25731f854196dfb60f037efd2f55450be3e938782025e23f8fd8f66f0168503dd407626ce9e06b5a0ea19d57217e6b15a354e7756966ba2862f6b7f98409fea8338cf5978d3d11d158559e4dd1b1381e5a0eff0cf7dbd94fce5f9c4fe70e8864c06e49a3afff3bb28889f21f949024ac74521fad4017b81c4e8e13c0aee875ea1745cf0fc6b97173fbd9296afe8dc9367ec8a9e4e68cdef4500caefa501a5fbe848df64a660e3bac4eadb4ae842c8e52f5fd2e323fbdc68e7f45ce6b5f36ae38b4b17fd2024ff2b1dd822458a9defc78665a2d23c02d073128e4028230afda0f045a9c352ff14f2b44f0e907e4279c1d4c5a27181c5d1992e941ebdd88f87ba81fe40be253b4a98ef174732ad798d5b824879cada8b0560a3cf9daebbc92fb7a43d82f77f1fc8a438f77633fe8a531ef6b6cfe5309e9753da076602b3021e21c3cc17754af2b79ef6b8439c58bcf49199d74ec86944adf7390421c1aa807b7f4571a8406cfd3e0e90225574a558983dd3729c7d6fc670d6298d75f4878d6f5a92f5dd61cf88867d70fd55c3cca666a80d51610c286c0777136c0aa2326f2239121f5ddf59dab773fd11ea91b5ee875cad3a467b7e7d9a625d6789d3926ebba42db9d1c2f43df8769f26bde7487823e11df6f2d45843532071479a8f91d463234b89e01387f77110be0375cc6d8b61bdc34d0f1f9d045838b5d3e4df16e7413fd45933d9f9514bc8c271bb490c71697a090642623709d13293d510ca0af17e7f30ef711c3493ae26143837650d70649f56eb35a70d9ae7977213c5595338416cc71343e41f05c1b31a20902858d17ab511c290f507fec1edb957ac93da05b38c018f513aa2efadf63df16f9ad5dcd243a454fa550d7f89bfd2676d80879ffb6a472a4225a5989978e5727bc46dd895d176691ccd07636492240baf284350438bffabbfae1049aebf7b6c5dad060feae8efc99e68ddf37cf0170d1a94f45eb07993db6fdccb4a145565a7bc5d89c7fa0f773b272b7877f960133457cb83126cbb6982fbb7bfe3f2c20deb41dddf49ecce76885f20be37036b80470ed5d9b49fd9eb680a47d25c708cd9009434eedde9ad5478f04e987ac097c60fe6bbdc8c705b7f544595edfcb83d33ad5c6aa0ca193579d37fbdee8a5b6f4d54888476e108ca8f0f53a8f90cef5c82bb4188dc5aa3ed4e61b776a9adfa787edd9c388efd8fae8262de88dcd440722ef3ed9589d3b05d39ea3d80af2cc63cbf74c9e00c262c8dc0128b3e809cd1069f1a0599917e670ea335bce3ea4fe64279dfb782d7a507f1b1ea04d1cbaccaa03cfb349ddba3f187f50bdaa8415d821215e70f29d9c24961bdb1f149a74b54c96f5d20a74f8a755095343fd69ba0c435f95479daf9c41a664c2ef9affbc39707a00771c2d57a1cf2ed789475e25ed2328fee9c9f1ff5a187c62ac50aaf5abae535c2d0f355bd0ef4639f818efde0d4913e7d217f339b074c936dfd62aa59e5e89756e544b79972de6170ad27d46ef3db6dc8af831eff733d1bbf48bfd608429a2e8b57bce35770394eb4c14b4f4f56978698efb1c6690ee3c6e84e2a1aaef6826229ce63c23e328c923364ff56cd274df0b58913142000c5fdafb8aa5e942c289cf7f4423a98dd5f95b53f4dd12e8b8513e724b1f06e706b26de2e488a030a1542be6e6034ab9c3bbe02fa3ca8bbacc857f668914399865eab3b570b8741b8d0be46e7c699c195a677e13cd4c3bcb29d24a9ffbdf3ea6c25f28fdcfb3b965fe17657057a4f20f02a281cad1e0a79c58de2c98e3deaa9474865a164208f4c27d1d4b970864010d64f3779f62166390b1ff91ec0170e1e42506a3b98836baa37273e33d1f152db6f9c0dc1bfe6bd46afdbd1703a55499182c46b23202bb8f7b86b1e8fd0c46fc8e29912bbaf73f9e6d749d287a7ff8249322ccf22a3205c7cd126db9314067e1e58ceae316fd20062acf2652bad1ba18f7811fe00ca6b4181abdfdd0846bf6726f8c44ae9a70bbc02555df023f4b38dab7cf960853c134d4d6d1e8cb50df81228eb024cadfe24130dfa12dd3825ce30e5676f5d79a1206a2a406b506412b8676b58101e431c27efcdc59a9232e875718461f85da3a39b7f5e4c4f91dbfd074e3968772673aa1b3788dc7c79d9e4af38d2911ec8cce88b7432b851b7e375edafd842bece075009d3876740f8f4c2846d15206806bc18f831eeadfa2a4422737291106d7dc5b5f8aa128f6f794d29fcf996365e7f3bdcea9dda52d052c6ada07facf70d9a7782f0a6707b9063aac220c29df9899b11dc6aa23ed05d9831be7dbe7121258fe35efaaeeb552b1ed435f7b1729470c305bf7f27614e29624cfc101728b63dc3d2f21cabc942c812932989ae5c2d9c5de12d32158cf5ba19e010637318dddd9e0be66083536cf0a7ae47dfa2a4ed93d36bd08a5207ed9a26b5a17eb88abf8e8858e1ce1fd1fb2a45ef36007393fbdf8b6c4d8fc71a5d51ef935867d0c684d7e97f8b6d678b17ff541c9ef40b6f8007efab4f495c0d6d65de42dd28a114534129498d4543c8e6f63cfe29c45080a39465f27cc1fa2747605a89d7c915bc5453b07e8f5e9cd29397655d7d772c108d0d57077cfe87b110caca32ef501305b195e7e638c158ef446a37014215866565fa2cb3f808ecf3f3299803ccc782398f8f34483175616822f81bb121a745c854e44cbe98e8123516072bc517354c9e19ca006e21829d8554c87737c134538182521ff003a5e0bfa1ebeb3f77a3587c74cdb41eb1f1f68d0262b459ccc497d816cc0d11e2473dd8bd5e403b95188e1dcb20b62189c953ca564f3be0e760f91538da7ee8dcd713ca92e7927f189cd6c8444c703f50129b8276167393bc0e617f1205da3e9a5b49db470e49d5a93718c407d8483fafd4b8fe8a3fc33cf3d8b75fc9d489dbc3dec754045bcd03f0f23c5a3d4ca8eb4d189186bb5395a134c6e3fd88d0f3870065757df35787d194d42ad20e31f709d3e50e6130d9508c26dfcea1757f800af9fa3b9d3989dd093ee6cb74a10d9d62e84417d913595bc3712b5e93b86b992b55a401fd01793871952f05871f6b02be353c9434895b200ebeb27c1a7a1ca4b3bd6cafe671b001d342b7c155afd08ee561d56dbbbc680637b57d1180e3190b6bd8582d9eb1b59ef5ec86e8247ac6a99e15178bb6d4077504fd93030b1aea34184f73636dea10799f3ca5603da8d4bbb2f90bd46df8c1d53f3ffc3c0448178985c9c2399d444af89bd91b13e860832ceab4b83127511d8fae22c1a2b394287079ef4f9875e6ea85b06df0e76dca59640cef278a2e07a3091a4fe91f5f27a653bb6921663cf97887a59d2cc6130fe0cbe0515ec8c841dbac4a6d7c9a5128199914de408d3ba47d664313d8972357a0c9308367d13e274ee0082583fad2c007aa4cf6b5f3ba1080895277fc42e5c920c7c22c4a8fd8e3830e1a1f04292817faee2b5a87820064095a9a709eaea18ee82b5ff50de9dd9a029c49020a0e9b5479cd79b2be2057c9a040e2a7c8c59fcd805fcf86bac6977754f45d769a9175a00daffda563b70567cea3f4c4816e26af71c9da8658104c9f007c1e25be9afc223cfc80dc7c2e53651aeb966ed291805c41d3489ef0ae453d8e9e54b47d117a03911ccaff146d89ec0d81914dc117f3fb7be4e0758988ca7787c1c6cee0de356a9177a3b5305cef232dcbac0a59e6c8b5a4636bb42b862275724c3d19edea7680c675d3a6dae3cd330532b14d9fe747b146bab202de909760d7a9813dae1b846cb77f217b19ea6a431a1f66bd9d02b718e8507a08ab8e6f603e3f5ae32b5aa957ecfb56dcf6590f7cf6f895035a206211138d8e6d9968f39c307690b36b902b69ee533a7077180406202604c7de278ec54ed9b5dab1066b3d34b6ea5476a353c944ed95e0a70f910820127cb03201845b219cb6f7fa501f6ad367316f547d69a076332fd38b27feaa7f23c4665d948cfc143e5a6b7c2f564c94f12dab0e04b5150d8bd0f22d469216c4c0a69267caedd0b02769df3f895a0bffbda6b1aa227e51905f3fe5945596717753e8dc5989f1fe7cc0abfa4c4871ce9c31642833be0e7c87164553c83d52e6204353eb3abbdeaf016fe765aa52e4bdf4b62eb9aebfabbd7a18aae5d2e40e9a48f8af681247fd0ac59de7c76191fb028eb5ce0c250f9e3cf2cd3642b93412b876dac4fae915963852b371c97aebfdc2f2940ac89f952f22779db0128514a5663351594ac80df16030174e13fc4a3428a9bdab952539a5978ff0e2ff3e6b11cc06c538ffb61755abe533464cef95e6593a96791dbee34ac2c42e92afed239c14779e27c2bc1b0c41fb6e201c5bb45c802d893b05727b64cc9dbf89ca9a238f630e44ef3be1015c49fa2fa62d498edec30bfcbbf849e93cdca20b8ff94b5332e4541f58112db18eeb68e09e24c00db34a5b59bf9c4c151a1b5c7b6ce40a9bccbcd09729eda813e951cfe8d1acc918253ea507109982e845b15275e732dee3a7160b152c765b10b7a0b6af076b6b977ac7726e7698f44807c50c62c98bd01309188bff27554d8e3e03a69d0709ae73fb0c48f6b841a81ea67f13abda99e6133beadabfe3318676c8a0261a9b2f9a92f036b207a03ba8536b08eeb6e2012acb85b580bb28b30fb19b9fbe8e898538dda16c3509f42ffccd9e8825eda96ea4242ea1035dbd83ef26ff29f6619ab28f3c55d75b647dc4aa76872641b7f6865b0480d5ed0c6c482ebc3e6657fb965fa798569fab8003a3bc356e0bc97b93f15755c17ac52ffbaad55d9f7d68c4453389d7eaebadc64e7339f19a5f45a34658a0fd3ab714303353ebf06996b1256fd73ce35ae3ea9c25dd2a9454493e96d8633fe633b56176dce8785ce5dbbb84dbf2c8a2eeb1e96b51899605e4f13bbc11b93bf6f39b3469be14858b5b720d4a522d36feed7a329c9b1e852c9280c47db8039c17c4921571a07d1864128330e09c308ddea1694e95c84500f1a61e614197e86a30ecc28df64ccb3ccf5437aaac81a2d52950a3c4c0a3a50d3c67f29b707411ae28b452236088a7f6b467b50518c92b17c943531c84f3e7b7f51e25f972182570e9646b60171db950fb9426c88b3b745aa5c29fdf487fb2030413de04af4bcdb65a4434cb83d3a8518d23b27c6da025a6a514af947610affb518e464290d4b18a639cd6ec0d711c01505c80a825c0e603b183acc3756e85a6c5d7853d7b7d78f3ecb3784b1bc1bf692d87b9d41d635d7ab155bef5ad61dd0c4635c27dd90ccbfaddd24371178936900ceb8489bc5135128dd30cb086b15f36bdf22688134a51a51e415fe567922c7fd6d10a4d6a5114d42d45bf7f6825b22b1354d8e88fffb3fe9848f32f75a4473c718173ab8f2da3c67af3fee7bb877ff32ea40025b7f3980d312f27d8a7872fd1c743e62893ab89f25a24f272e79d6d97f829c8c5f2eda9d9d23d246767028d45bf5f8b4edf946e60b622c3a75430251e582d5652a7b78e6a64bb12641cde09a1401c8ba4d9affc177733980e6a074e9035f6d2544017eec8cdf119572de34aec34c40eb2eac6d91f83a0993092ec91f679cd655124d671fcf7275fc904d9f92e829d3b017a9fad80c4b1f09432a596570bfa37d3bbbcc00dc8a50f420888bd7012f03b18f204214221adc2c3b4fb04bbd3c56f616d9083032ab24f48a1b83fb9cc04367fb8bbdc6e81de3a437eb6842ab9763584a21c61e60498476537302711982353bf368c870cce8a7d9efa9ebdada554b3c2c22603bf3d9d212032b91c805e93ba5fd341ca22effab65b8e7a584b7fa80ea635771195bf0a0201fb1bc60f069d94e7f6a04cbacc760b03a414fc0d2fba71b563d7327171271491f81ecec5788909e00973b6db4d45a41da33252f99dd20279b50d0e5a3b3b7f579289dcab9c9f40d17380af8e5ab1aa31f39d011ab238e97991e34e5805906bdc312697c75a2762429c90e0dadb0045c8fc1db27554334f3d601f9a73b76cffa63ebba8239b6896bbec6af1c7b87b9c69257a0d146c0d5c4e8b8a99b43a18633f1f11b6c745ab05c5cbd8895dd96ad89cd87bb9fee30c373378ecf42274dcc02f3ef06ab94238d6e7a1a050a5261520e97de95f3b9f790974910d53c64eff3efc02206c03785732aad68bf0a688c39dd97a8ca6d48a9cf99a3db45ca6b0cb0430d26863add1504195d2610e68e5be77f3382c37d08bbc302ce3abbacc83863b521891f8bd346a2a30fdea55f4274cd5bf1f91b9378922d5b2edb81340ad790aeb3b64d23d88ee1603c0ed6a5134b6dfc69882d5116e1711b4c2a4100818ec9a82a3a69a34b7242c978134f887f644bf8f09c9336721e10cbbca36582eaa26129fb822f7aba8549573a985a59f533d9aa3db2c7a408ac8ed4e6d3894ba4d719bcbe19f92a943c6781fa1a919a035eb9b88777453a59116ddf613706bb2e8135d8c89e4123670c2fe24d068fd928394e7c84369659d1e11033a24a8862063557f6d15ba205a178f4f099d89f97e2581a9eba9d25930190388a208a68c0ba67f2af3eee9641e2076925672d6b46b02fa07771078d6666a3293b62733267c98d985a87c39858973bff094b615d761044629f6e0248548f9e74dffea16fc7a23abb91327722ca4f9b2904ad00f096812af38ef809c0dddae69dd04b719b50d2e3cedbc585b007698969b002a8cf389147b5ceb5aa8182e72026c4df702f93da2d54a2c75bdaa0739b5383e2b543dcbf3f3bc71d5124b412bf82263139a721365bef8eae860d15fc555908d3b2e8e37955f810959a15020c39426cd71a9c696603f1e7e170c1e8722bfca74c2e38ed3e307d23b4e1ccfd3201ea1137bf79dcf7ba0e4716c8938863a3b0f7c283ce6a9c532d8901d4c6f602cdebabe984ba0c49f28734a4d9ec964f310872bd6fe3ec1242abb8f2cf9d9d1cd1b9a552f6e767fb220f391241576293788590c32f43d21e635a2c1e4eab52eed1f6860aa29c8089dd08ccf58b4e9deede9aea4a5e58cd3f59cb5acade9aa7d73304d6870423e654980648a5144ca8bfd7cad7d9898d3df37a71edaf0bc60c8479771f4e9817fa09d78a64d778cc0364e897f1e71d6b94b969d02d3132c8016519cfb8c7db034c180ff789d325674e9ca584b0f9a67e621f9c88c1d8001b270798614b8949504cedc5f0204ea688eab58303ad979130369476ee1429d039ddda79fe30196fa98d198de6d09078bb585e05b740378a2b8296ad82ccad4faea65c32d91eeeba597d19cc5e135f187917d4b1f2015fddbac6b494e933b8cad4010b5794508fb5eaad7d05c850e1024cb9e7fc5669772878836cc173e1f2ce548e765cb28d52fef79ea1cea821ecd2a0bed65946f123e6ef393db7d56fd1e6aaaf1bb6b62dfed1fab1268b900ed8e60f874e5d6630ec95896885ec6035ec9040d36a0a01aae9eb5e9579c0f2601bc8f3b3ae8d16a117b0d18203d3b6cc9957b19bffab378c8ab7adac2a0351ce4c07f7c4754cfaaa5bc5423606024bac6ea967793b3eca5b77a36275a5c730b1e00f862a413164e51f4f75c52b0c914dd301ecfbab193c90375b07728b8101b35e6c295580bee7c9e8bbc6dfd1371a397cfdcc83ddef00b3203b273329d5673b3d9a4be6b26a15c12e96cfe6972668f7b2f950b23204b94ce8b02c382f18b3c20406885e64a76183776cfb69fb6eeff12b914407461eb8c5f77690e209ef89d0285d491d061b4d5959bac3ea6c5521be2d3200e3988191a6b2eaffc128ae5bfe30fb18b3152a4beb2becc3d8689da0d75e6801d797d1d667c189c36629f99c94a46c61a11058ef81849f85c48e9cdfa535bfd163c283f99199df86418c35ee4c092dde77962baae4fa2f643f3cc750d02985fa18a71c7dbcb258a2e3ae07a38cc5bbc9970516f06dd338e998f1c186b0c076e656c40fc5318181b3ad2dd36ecf6092cd9ffbaf6284c628a0725c0ff3ff90ff10be97d272a8bde7333e7a2da29c604f54f2d85973d2499b134bba072af4f17b23a0a109087a9df5abf8217ae16c5b5dfa2029a9a6deb3fcac95ca4b8e39889779bd6e17f93fc849886aa24fadc7a82b27b86e147df2bbb9e6d0db41b045bcc09d655d83c760b33f43167b105a26dd43581c243e6bc6b77f5c9d8b8e13a214830928fde0e575e553868c1a618912714315dbda6be2b34da9684c4 +0x1b1979f92d62c71c5756924a1778ef10514450677754acd36cd0a9d71d9ae400f556e03f5dd8337a24e8e6d129c7c919 +84976 +0x9d251427fc3c6f7050f75c8c8ec5a0ffbedca25eaf22c556e94ef4efe34a7f1276dc254a928672c730ab4ba887f2c77a83f040fb7301aa240276246768f6cd36e11ed9c45e6be40f7b5a851eb2cd2787ceb11435a2ded368fa3eb4fdd232a9f0c631571fcab36d511b4d3576761d693187684793a482e72abbeecd3a89c7bb4a0d5ec8e23d25b694f7cc81393aa9347d965d009ee1b58f702cce96a5f57daa4b9fed54961f8a67e0f71e91ee683a3175e3d868dcc23e7344352638c67f1b1efb622622c2d7aa283d038d8e1d679807205721a7d7ade73aadbe3dda258d6bc1633f515beecf4d9fb4035fa04f9f8b5f86d87fe4170b768db4af5ca54b8933388a1eb526a36e3b774cdfddee0a78dbe1b04f3c482245b4135ff0cbc1bfd93c2e79e89bac671c3b560e7f4fa1d95a4f34a5a59efa82c16975b86ad25509e74e4936834b15c54117e500ccfde041adb1016dc0ee22bfe95d5ac703b989b2193131cbd90d88424595cb2cac2ed4ccd9c7ef118a73ea5f24576b93a4c78641d9ac8f3fd1292d68917eb09a082ca501465aa798ea7778ecd92150243645743e8e880b9b52e62dbe8b993e51c93d7a685c31d00ac740f4ee7281b0829f7b7b319f8d4ce6468eb0cc9cb01b59d5aa7b8a841613700b1787eb564033b6c9b1c1a37683fb289467dd1b2c89efba16bbd2ee24cf18d19d44596ded2682c79a2f711c7a32bf6a24badd32a4ee637c73b7a41da6258635650f91fb9ffa45bdfc3cb122136241b3deced8996aa51ea8d3e81c9d70e006a44bc0571ed48623a0d622a93fa9da290baaedf5d9e876c94620945ff8ecc83f27379ed55cf490c5790f2783faa4631e7a705d5c79852b0c5c410498b580a4dac511f2304067e1d34f919464db6dc5c80918673601a88a8ef41e80ed5d963e7e87c104934f9541f42b43b1766b6ac8d0bf8a53abfabb5df8159f4f8677955cd4732f1c2413e777d0140dc5e1310433dea5ae69e2eb256af1c8acbb8c8be5c7839444820b13c34d1012d71acdb6a3d099c16cf1045c4e7a22142d0a2722ee4734efe67d71d792895c2d89f66180b065aa1dad3238d59e5433010a857ec317a48f8efe577ee8bdf45b6e0ca2c51991bbb8c15775a7df7dc2cb972b74baf6caa53b78755659cdaa56b6dc46662209b09a6cb354027801538a92df781f02436f13e1b531c32b0ec37715802089a0d674ca6efd8a21d4c4887532e0dacd7f336cb6284e1ce61b346f1e1e608255660a441265a7e31ae3af844b50a237c8594d2a56b94a1d0652c615157c8655109d2c8a3bfab74634cc4aafd4972e7956b71911bb3bb11b6cf74c1f22d5fa7f036cc5ad0ed4379ab8b81d72d7ac8b86c0c1208aac578b0061334ef40ed2c2ea76fc5c15509c2ec9eeceb1331e3ac1484ea1e9fbf3b5e1b32b2e55fca01ae87cb074792accf9a5ba1e378d5b6fe7d9a5477cfdcd56fcba1c120fe89fa256741ffbfda5534994a355901a3953935bda87f57de2699ed51f2360ff9045da2d6cba9dbf66fb8e1430828ca03e82523fccd59ec9223593e717b05b25d4561248da35dfe147876422542959f1234f733bb8778b8b459bfcdbaaab4daa3c3a104ec578098ccd609366183240347024c0f6a55404e9d102a258e0fc7cb550599de8366a63e782eee38783858992ae68ff199b56500b50d24e07c28b316f991c80be34f5351bed991c2e9e0b7c326482f94ba264b91a4972c68f5740b3ff9ee98377c700c64f96ca050270aa603d1adc7635c366853e454cd29aa8044c8ee7296cbbf7745fac06e767ac014b7fda58dd3e7f0545fd9ecbc73ccdbbbd4244fd450434cd37485ac45a0ad359d71f32a7ed18d071e76963634bcbd29a55de4867a313885032c9805889b6208134896c8e74cdd00d3511b4954046514db268c3adad615f894d2a464bde333a804c05b196da2628e3173cbaea0f76f1dabe28dc58cab5627e71b2d524bf48cb5e05da294588e880fb76349de91e235b4b5f65bcef61d8383984aa556b96bf78234952fb26e4de7f5b383f841bd61437a87f698afadc938ac26f5aeea9ca5eebd8ffb350be57cfce0d47a697069f132cf7057a6f02a2ac001f1b0ac664c3eecc850f464f974a82151989b10034e2e6e242d9e1938e1beb415a6f020827e936c2306053213823c0fb85e8a7e42d05560290e3e61d26af1af67b5289da77a40076e3dc22ed294c51285b4bd26e77722b34ea0bd03652c6ffc688aee964de5c1290a56afadcf32bfd45a39978c39c8f2d1f5739e9059bc8645a8b6a68cfe37935b77ff225161d2a8cfa63bce20e24c6246cdf5577b3881d0f598b6e4f430f633193775de9c22fafc5eea59b5875957ed7c28a47c367a22dc86c91a2e6e7e882cecd98918f08b12471ca701e2120791e0fca61f7154a6f61593ba4ee74e4f83fd40de7775e112cf05835cd2d87385710942c6b4db584791f896dcc3a4362c7000afa6ef7a005287b42d8c2b0d0e5b8bb2e8fb032ea3c48d01fab116e9988db2e393d34fa9b0c2b2df75a5a8f454e2387a59b398cfd9a62dde49c7c72bf7ebe32297e4166994cbf6e3e659ab22e9c20dcc0f90d4536c751aca0e9142efd6df872a2649e25e0f06ba6e19e8c02d3f6372248513443ddeb9da71a39e28a9a7d0f586c97521db81eb83da6af37657b85f1c1064ab7703a2dcc351c35ec6fe0d58d4b4ec065386bfe2c9b5640a3c47071d521bf8d9db295b668bd6c853cc3159efab21287e05c40ba5128b9f8d908f8e16cab3ec2eef335aef9a9d3d0da7082ffdcf77e93ca737e77af4d9680e0175cfd3cc54a90b31a633c056019becc5c6f21bd815b8d2b646e60cc70b67fc0dbe4efcfd8aa9ff30f6788164a06f81c71232b24b8701c0b17589a32fbe29e823bd7dcad4d2798b6ba89bbb3cf6226d295e8469a0487e9737484506954e0852d1e7fef5c8a8923040311fd6557f4f0f4b2049aa6cd669b6a6339a8f7e578dbc96e224d66f998e7e6d24675b24a85fc8cafc04ed07bd6dbf9ccc0ca661474495f12092153011b8d630f714c2510ddf5a174648ba0769f51279761df3e4b9b76f5f27c91a909dcbc84a2daa94311c4813ce938789f2789a4fcac640f05f1b40b96f6c2c5f27ba11d5073c9b596b6024864f6843e54f45c7d80f31181456d88af470625e6b5be3358cf6a8698a5655ef321838f044746df83bc55b05e8529df0b120aeb1c7b3a5a1409705879f887a22a7b78a2f30186db5fb7b888cd4e8c80c6feea5d8ecb57ddf9076b8980188594947bbd0533091a19b87906e2f727fe3589138ec3652d7d86b0d0455fd78cc5fdda283a00ebe76c5e370b25060498e7c4fc5ade65c829141be16ce423a3dcb1a4a48bd8db4324e2758474ff3c1b29b0f6c6dac38ae048846534e4321c0f91b05399aa7ddd6447e62546bc7acc6463bf93909c237cd511352c4f3f1594403229d0618f124f76d8df3525ec80fd08cd7d6301a6e881ce0d9038dd8577d1614786e4a5428079a060356ecb0bf8192ff0522dc202f8e2f3c2fb5084be3f1c98582e570dc9ada30b664f98dd21c9660052a7bb7ab83de76dbadf3eecf355bd0dee89f1402e8315df72977b0637dd2da47de2d3d2ce9dd7647da5c8be2ca1fcea90ff7ae779e916430c74deec531bb543f96d3e724e02fcff91b3b7a26f0a2154c7f8b9a9b0c6f05fbd4e8a37806b48034caec4013f539c678073d23fc67b73751adc772fdd04e95c0c8e4890c3b52c0f000f2c28aa7800c4d24be33e38d93b7511137c20078a4a62829ade9f26e1aa8d9df6408e9658703d0da5b046cd0dc27c3405902537405b98a5db140bb0d80aa6a9cdc6dc0bdd33fabbe803008eff4db10c1b7be6740e632700b9b47c69809481aefb87b912ee9324637ca2148297273c20bb040ac6dcac37189d849c5ac2904733e84bceb173d6e38ec95529b2be9746f84ef53a35927cef77ed4e108a87451fc1fcdac2f255455ec337e6e7245ae4f71d3d141dca181c77a413d88301b5fc32df9ffb3edd7a28be8a2e1bf8e254577616ef2a5c8c56d4f82775eb9bc835fda7153978ea79cbc72a6b16be01f49538ec6bcbfe9e8435eb9a897d4e00e6f090a7eb32176dce3069cbef5795ad6004cf80a53b5a8cb89bab845191cb5b63cdfd5aeaf2a170e49258c99d5969a13088635b4ba504cd32715adf071b285448b38be799e1dd9ac4d7da4bfe8401886c0b3da4e573c50afaa041d233822e929c8c83778068959475e93879984127081a74a684fc0c65eb160fa8865e2ea5be673f2d3128ed8f05ffaeba7cf6f6a1c944abe42317d8ac1790a5d6220f87557fb2b4d13e18da94966b10a77c9d0d3874f1973fa8be3f6237704c15cfcff5057e84d3b7c5d8956cefc0f649a017ecb4b12a22013b79a94ef2bcebabb525e07f63e58427eff188dfb70647e611eafddd27f6337006d17e39f17e69e1fb99b089d5ddaf68e4ea19b59645edc7f7a1a67b7f5db3d62e4d26ebdcbdb0ffcab3cdec7c753cc3cb4bb2b53686cf3479c1515561678879de760a2c5a82a74d49fc9f7001b41380cc9dbaa93cd0d574bfd46534731d9ba23cd290c413d43613a1fb8fdc0ca31ce711679957532ce7d1f2624ae06086d49870eb217ab0bb4598f93803fa4448403fbf31b68721a1ed913af16721ceaa1ba5a3492617d93fbc257a3c649052ad65d201847b034e37cffdbe0b26bf6692590ffd720564356983024b8e1b67ddda74e6fde64f9283f6755da737ee81cf45741fa5f028266d40837796b78e478ed556c4dbe29afb68e7c8f91cfe2830b1cb561dc44bf52828cca2cc803d27f70da8f1b4c4fdc507a411ae1846e63a94b62de5518109d6310f16c94833aa4d41015b2ffde0c1367ee07d10044d798d7584720b0205b43208ca25e134d78567eb13f4f7e956b55628c331d703583f899bc3a2af7a77d370760002d0d89357dfbeea7d30be4f618dccf637e95e8fbf96ce1cc6b9ff00effa4359b3807c90a71c822ffdc4c5f24e44342097305d1b811dd536e510dac88f37377f42d768f6fd86ff897d9a466803e126ea579347240d8479bb079e53f63b8f1917b6bfe3ece185fca1049a89d808ce6bfb81f966d1ec358250344ab1b37c6ab3cc181f379adc81431e9aacd56be671cbfd1c4c004ba596b89f75fc3e26d830cb436fdeaa2975e29aa947b8744824340d9531735ebac011e250d19c4078d9492a27c3e685c13510caea14a6ac994a7efb6dc756c845c50dca0b511300d0071e981e1d1e1089a3749b88085ec683e1b65b2de6dd85143df23677fc47c657e915ddd0846e92aa4774d42c2cc909307046f67d96f0df50b027ef3cda21da340797c0e700be554ca9793f7d86cdbfc87f959403e0771c21a416bd03f3898390e90d0a0899f69f9552eca22421532e72960bfd6acb5a85aea326677450680a9318dd83dd58ffb9b0c933c6c80244a0573e10f8586081622034bfb736f8a4b7641b71f30e44bfebc396b8731233865b9ffe0c4e76a6d4fb9ee04973f2f327d22c7a2f2243651f7cf742e170a9bb03a8715f67c76ba53c97512d2c644f4ad7a312be81d823c407b67354188737a2a1cef5e8892bdf659f8061a5d152f6049e723f6ecedc566860df6054c47e61f04a175521db427cefe7fcf5d09e058e296386db127df7855a1040e5ca4c1ed1aee5c9b692c3d4e74afa543535fc44c0c20e280d32f8f158a001212b3f1a2f2fe45a2d43c4aaa8cb7ec2d04a5c54d834d586a0fd57a692764419ca593b95792298918b213ef987ce9425b75ccd0c8a916db536d408efa1884d4282984425c353d4712b7b88163998930d5392118e207f8f8232bace3be835c4639210e432d76a9fe454772b6b86d28361ea15af4062a845d5dbd630f22d26b06442e8a2247b0e02d24f3dae5e36246c09c50d2f8c1ab196967a51b67c3902192cda49066478e7032165f69959103557ec2ca11ad90e458bad5752e842d47208a5a25a9958969eadbadbca75c3ddae4bf466f9f68e070a2a03ba024faac51e83b6e244e2699cdb0585fce0c80465365108bd3e4e15cda87d7eeb89721dd6ad9547e12e6aff5445156a0f611d84707670107798a7d528c88c07310ed904cdc84341e841b7838485e4525b74f9aac616b0f5dd2e8b36e0125d87d6b90dc57316978a3fa4535bf5437a232942e6e02ebd199d372981a0bc2dfbe420b395ca9040980b2e80c6f16f26e0c7c1f36b8e7213b4f1cdb0127b86c26b085824f979eced4eacfdfd96acbad61d246bae111a58c288d9e6ecc42f0478b6d9c534c23c4ec6c256f3424df39dfc39246f9b5eeda96f9d3ecc052224fff8e541b109777a8072fbef59787230e1403dae14e3dc6f2cc4fc06c522b1c33ee9002762cea09a489a016077c68eca4e4930a9a4ae1308ab69ac1b1a6bfb728bf40d7221a9c6066fe6dd9295552829acc01aff65238a21ec06b5631309879aacc1160c36c27025bdfd966cfb4dc8b5c34c0397a06bc920b94220c8f724dda46af722dce942265ff98834d5f1d5f7d65b96f4599cad586fd8c5f43110e386f68d3e3aca8251701ced2ec0b7be153bf43b45f42da312c07411383985a46f09fadd4065be4816d7c45f9841f9ab361f772c020cfbfbc288992e43f8aefcf0ee1722a2aba084bae2bf186ebf83006028c7f67543abede43845f58d3893608dbeb4230f14587f641a76e057433d05bae04c6145a125c1a158df30bf011c176e003ba92da9cf7e3d054f7efbd30f016dce6e351b2e51bf2071d1a5805b316bbc3c137ca471ebcc6d2db3bc037ae13ea07a96399ef3182f8a0a821d794fbaa29ffaa4641d7495b01b1a0b60173d9b027c6d2a3677f7605806ac5a5f52e49f053ec3562940bbb6717052bd33de262596292e94f44d421383bddec135b223c8dcc21e9192b44d3458935f33fd013c6742ce453a3bc9dd17f8d6281f6541121e6f5294bd682233f9adacc9d3862787494d943b86d393cf56ff7a12dcb8a8bc870517ac42733173ebb8e5160795f910b401a297de835220b6e0d12560f68f26ece839ee887b8a17f4c064d036f41fde8ea421e1ac14aed921e202e814e79d5a365edfe2f848d426fb0f517ec76940f9c17f38a2574f51017e4e36e45e527b5f4bb03111f8a1b8a9e7ebd5a924bd046a33da106047f9e0a0b56c949fa701d13d15265802f150dea7a29d18d8b4b81538cefdd0a6e4dd06bfad8445a358ba46fc7b077c3d4c1bed28136c4193df21186b782fa1f996c2696450de7078d74682a5649dc44b6fcb8e3522a278630dc2b80c1bb9abe3c56fb19a85c23ea48e6d2e40ba2e59b3c42868d4b786e7cea6619b229ee315ebd9ad87663477d7b1e3f6f2d3640363fdb1f92410ba5fb35e12c769b5e9f5089a3a4493d24546622740ab75684a6409b2a00869ee1376079bbabccbcee437ab7650fc7ce5a177078c0c52600654987359f81be078ab13090c0407687377f12709849deaa72e52f06aafb45ab66ae9ca7a21fb30b5687de1395972eaaf8a6aa3db3cee8721d51e424891990c7f749d369d837002ad33feb8aa22c3f68705eb4872e1b8f85a7f2528af1ac91d695afdde4b8641fe69f5dcb6e8c5c33705d0bc3d58dcc3e85a12adc826b20b367c0451eb0b9238cbf09460027aac3a5230d325ab1593d7fd2a78ff4a35c128ffc15ae184660f1b124afad2c5e83df0f210f76eba2f70bcdfd19763d764afe91f3f45f4d2e365b37a800d7a26bbe2acbdae22de9130da3937575920973ce4133ffeabd4fd0afcc8ac99b79f4e7a02385b113dbe59a03918adc5a480b144c871060776c72c633c224f9dde8b64ad045a754131563905f41fe82262c94d04c3ca1d618c1687778e880c956c8491dc52dbb347e4ee5ae9751791767a4495053ee52b14d70937cd58c38b8848d3fd905382bc2a40cee4d323c74fcad439afce9f8bd9293de764ed039c737e5ac0cf506f1939f22c3efe4c66f9cb2558f0c3e85084cfa7a8fa3560f8d86d7f8a9230a50e66d1a88f85d0dba673ad8feeb0fad9b798b496ff88d3ad9e422094c093471698332d5353ec83084bfe9c107ec37b2b3e8f31ff2ada665c5ca135c4e4093d2b7546f4fb5fbb3f5bbd6240b1f06f6f654c30ede9103815f69cbc5318de3d396c0e67cfa89b3a2b5d656742792cfdfe104844915c9be90802c55c239696776462c9606663efb07095a9d54a711ab54fb39c93c460b23768083f494c48f5ffe5940ff860334367358bf273ff9fa3de8bd6afe52ffe3d685d90714b7736e11ce58a49f666217fa5a3c8a90a0a0dadc1d902e902793d25c50e23c52a4c6743178ccddd231f348bb3e2d3346212c321a762bdb2b24b265096a448a2ad72e3043801e4354734744fd91934fd43c0c7e8d64e9272bc4dbfa7234688709e92b20ac76d57b72a4ce9b45e71746a75bc23e897c40691e9261212b31d6a98c353dd3f0cf7afcd93109ca08c111ae5bfaddf0b31eca377017f277a90517680e45e6a8a4fc873de4b2794fca921aed5eb3c0138eeeff08dccff04c500093491cb5a64d2d7072b511b3bd9b1fecbb9a2bf10935714f57539114fb3dd4c6d2d333ff0d001eddd6090c9f174a6d335c2b304d29c4fec25bbe49a163ca8bca6e8cf07c8b8fed97298021df36cc2708751728129250abea849f72dfda51097dcedcbec8923b1e3ed5e0fe1e9c9ef1ceaee4600be356fd2a6a7d893acf8fc2736c591b6dc1a025377371fdb7a9414208622974738d4666f465ef194ca3d53b2ddf7872d68a4d97037ad9ad44fd418c48274ce20400ad7deb0f5a9f7ff7aff81f90b1718d6c91e835647e9951091e550066d51517ee0aa680df46786f5b9e7dcb18aa841cd91b9d4fb8e72e364d3620c3c9389a2995dc75385e495075101f30a2dfba16ef60592ab4f089e89f3a377404a71dedd3a8a17e73f4c9a43be5b0b5596e66c68f92c92507a3fd54d66080c33588cb9c8086d806e64b4de02e2cd170314d370f77d0f9f0aa3bb80f9650b092e8f6e802dac11eb2e1ba4c90b6562ff5dce4b15e22ab4a223f202055397b35679169e9dd2cd7b41708da5c328f01fababedd5c3f3a92584e1909ece24a508dc5c16a4767f14b5687ce13e341f2b0e043598fae2f0a26a2b8da51741333612811fb70975fe28c64a9a40f884b9bd36f042f841daa2bc89816e58f3c84af3da2e0920540016b3b6ce12d25a1bbe4f9f581c353214d1a08c6dced2bcca2f8467cc637a0d818e5a8ddb2bbeec61f6885225097655f645f67ad6f33bf9afab90c14175ecbc5f2fc7545b2f2d36bf2911563d52e333e9c5655ca626ba33de86bff177879fea02c1a213356446c19b1e91b38a3fa553561b9539c4af77f1c188bbfe54e1bb1ed20c92d0511332145e9eb172f317e43da30d2f1918d69bbbbf7929f0c2cb67e137d74095978318b77171199a5f24c77a3a64db058ae34e194020b4d0a88ccbba99ec5469effe21333a5f7033b8ac779181e74003021db794ac4602a5ed6d10316011755541ca750f23305e46e5f81c0ae260071e68ceffb36cb3bb777bb65ecef40f4b5f75303bd393ab8dd9ce50dd6ec395d75ba43c4dffe62f884e39afdc1abdad7f9273789c08f299a2f75bfbe2448e5059c49eafcaff838211330f9fb39c24b5b9f323eabf35a7c248a574435414aa5735603f719e3bab73fd2de5d00adc8feda08c6dcecde21cee25ed016e5b677f7212376dc9f03bc7ccf445a3880a63671fdd643a6bed97b8e5e1d6eac51ec3756b985211fee8883d53a0823210dbb815111883700a48dde36e25681790c6b3f40970b81459b0a977d1a6ec78b0a464ff8cf8f2f9f3053b055399ac70177abc641342715c226d26db0db18b5eaf8eed8f5725b8bb6e4d3a865ae4a9dea163682d52b586d3a14a88d3d16768cc57c0dd2c3c48dda0c34860cf4cae684778a83eb78e72fe601d6d55c6e3708aabee62bb3d01096a8f391d3846f0a1ef95e273c66b8e21e1eae0fe181c0c75f9e1bd9e102c6f0f666f19f54754106348ae28e989af1c69385b3026563c141ebe580c9a63604e03d92aabf71761729c7b7c92340eecfef20a9a560c9990c312e0f6237e3c41668ccba7374c2fd6dff58ee5677cdd8bfd655f8f9ada687fe1fa67a5497323377e5345ce051b17191f158bd3f1e87ff2e16a3f2243b54c71357d5c4cc7a1a1aa60ff4e875d8d5894faa6792d76a17b8b72a8b33b9bc7ccce8844c6d3e52f3d02d239efba86ca79ae384d61db3fcf59bd78c8c2c2e83870ffa2f6ad21eb4580a79da92f4fc9f902cea0b44ac49498a2efba71759f7330c06a4b3c1920210df10289f6162e6e427b5efc833cd2bc27dd8b014cd3ba84d645784bbe13b7cfac18795dc9ac40bdce6dc5126240ec01a292f81501e4fb625286916923a2ce3c4d7d75e3c9fa6bfdc5606baaf75cfaa9324a9ebe37b04b57cd0b1e6e14cf4eb116a95fe19f0798784fdab88eed9ae5fdfe8be5c4964090a96f5d852338a11d762f239d20f2dbb07492651485ea0293452fe035eec89bb4a15f03304d382024d3c17399686b7f993ab988e756969bedc9eccef60572c99d87c68585b7bb544b10f422b980b2fa3d12eacc99ca9b6ddbd05edf90d23fd335a3cb6cee286a467b74efb767326e5482434db792a99e8046a4ac9a6b1ad4c0623c973fd267edfd9a48dbba0a44479652170cd33abb4add148bff87efa8dc980e9c5186993deb8191d4dfb3097fe7c794d44ca8fac7448b2fce7f2f8543fd63200922caaa720cdb4960242bceabf3ef30c338bc389737927db5531993b2df2a80cc32916fcef912a934d2aac09016160d2cf59a5df1c9fbe887a4cd83be2bf5162da8664f195a2e989810b647f5f6451557aec7d29ea2cd578e99d4bb2f89caca73acceb21ad63800d306d9cba43b842f8b89ccfe666b10b1105bb5a5cda0b384e86853009a1637c82edd9ab4638ed94312ae324810cccce05611f8a75f19b72cd2017ca261c233d8f1bd816bfb974e3a3246811a666c0acba8e4262baf9bdeaa7aa2d1fe3781341864cd175634fdeafa34793fdb2ef4d25a4dfcc69883cf31e62871db7de4fb4370ce36e3ded568b56c606ef6f2310b2a758f806056a45db7c8249621872fd967c8791f6e6ba882b878fd4e2dc9375a1c04b4997dcddaec7939b53a2c85e1c3a908abb13e6673f0fa0755406dc70889afef056ea465ec247d1f248582ddc2600f18ad14dd35ff5d83ffae6d3d546b3feb1eca285d86a4afcd64ba9eadf99a59a4e0c76fd342146f5c4a51fd25d82924d97a4bee3098c83271eebcae353f31556d4840eaa6f479ce8cce8617adbb0ae180e9cfe9a60321586fa775dca0194ffd743962afe0b2f8231b7594e35e66d61ee954a040462f77c6d1752c5178eebbf9c09973e308e657161225c58abf3f55821aa4041c988492279f42283444263ef05952bcb1a7f75f4e78c85f3459af4fb61dbf44a5256b3921dff5b2ae8d29a08b484a853f444dd8745545ab08b21f8b62fa8fa802744a365c9b7612e7da5ea971946b16b567508a2fb284f12f54f5d22db7fb775c0e8a4f81daad9006b32f204a459bb63c99683d28966d79d1c79becbf5eeafbda79944d38a5827434a003cfc064c4aefc60fdb80709e88a149177a1c1f6467aa53fcff72803dd05982a437c79f7cd471c4777c47313dd6d233cf3b9db88f63de4e7a217fafca68c5bd855f01d099ec6c4d33e2914bd346b245075fbb41be28cc0fa77735698c551a433a2f3559f1f761e8ebaaf930ed5ca40536730f5b7f2af61ffb5d5e2e0229c9cc2924dc9c3389e4fff531d980fa8d29ecf302045640eedee7ec30349dba5b56a0d8ec5207cd18582ae723dcac696cd674b38934d2b1e8f90000bc5319137e3389cfc2402d3d274dd247dd5d23d8501c250e751b5130add6e0cf4e5430bbe702bf8453219ce23b388e8deae577c5eb7d865a5212425ba1fb12ae629265023a26da8d2b70a78ac8aac82fb9002890a37d012dacd4268169d80e2495b82684fc226340a7b80d65641717b3e437b6e70c9d3dfee1bb8e4079f04bd8641015c29177d25544521f2071ffe5a0e8e693377b5095549d42ea1736c644203a4493398eb9b011adf95d3a86d7ca7d23a75de094299fb53c04ba8444dc9fa294b02f58684a853c30f8581227412ebf40f46790dbaac5975a6b800608a5b6b6000d5abda2bcba0b79e99055b79e9acdbd5850b6a6369f8154f1db1b16b411f1189695c7c282c725d5478663dc72875ef54d99d0a86f95f9d8420c41d37a49ea2af681053c3f4501ff8cbacafa5f8cb9854eb36d46a8316730b6c408e38ab6e7d3a77cf49444bc3645439df985a81383e9c62deb05930a601aca72debb47f1908f240a245f25852952e6b08e22fea4349f5e79d86992896ad317a931cf44727ad9f6b9030174485184f082f746c5c752127227c3e73926ee1608c7b08402c1ed308a0a2f0f936e4567fb95a3659fe542efaba82c12f96b7040386ec99e05688e1f686df6ee057f8b7852693103df96ad93658b8f5155ef87ee00fefb61becec4131c54f9216cf48a42bf6e1ea62743f88a2a324c36d0fb9b6c0d08b473a17d35a8106fa45e2c55c8337d24dac0e9859a40744d0137ed483166a70c83585fec494aef1e96d8b61bdbd7261dd3e8a8d42962de2c4ce91d3dc05a898ae6644ca47577f2d23f35acdf2bba44c9b881e7a82c5dc2607daee344feb40f046c3bfa2e40bbd63b0c0972e83e4953a8f7311879f98dcb7a021dd206131fb1f97343eaf2418303a99bb8aaff99f0cd4c0e5adde2379f43f9a8aa6bf9c3da1cea9a208188ee7a05be5cb7a75db56d3c236c738a496cfee63fafc90388778faa485f36606abded56d9cdab1abb170b0abf902fb047e0190cdca61e4b4aa4acd4a3211a0a101669619c7cf757704556c37127c3e246579a32512a0eb5a8e1ce467b8e2fe101ae8ad076c910f015a6ccf0f881f492cd29eee12d8a1ea53ba5405a42050c77c7ecae0de960ac7723e1fa0db63d263454ed83b3d264c2cc6b65cf9a97142450cb376f8464a21e4f235d5a942ab7cd597608f504e0389f8dc0b9a881db39fbee94352bde992beb0a8c9f7b0ed6907e849902bf6ec784095bc407879a9ef517b3ab6c8f66c75c971bd81eb7e84a55ae1836614f5bf8b594c90dd5c96f42c3fc428923e6d7afc2b7059e51adbae655d0b6f6bb3157046bc657d6bb0a5a77251e1db611ee8b92dcaf5a27eec8e13b3f8ad32266e1ea7b15128ad71db6f69c96f197aaacf30d1128f47c3d3ca615c96130ef71faed70bd301dc487745bce33a81b52ef6b90d6bb362b0e26d1a1a31179677e4dfdc0945b4b2cb75055654bccc6ffd1ecc44462f162c7628d24582393c693021ed5e7cfd5c4d3b5da476fe9d88213973b4d8a5c445d3e2bc8cb4611d0f7581d7d19ef8dad4bb7528db0d842e7480b15436ddf0d348413cc623ce7f8598a0b22e1402458423e2c1fd3383ac169b72adeadbbbf003255ccc701dfaa317ded30a4d3df42aa451ac660433403ffe02e0745c2ada6dfde60ed9e004a2977ee9f7d25dd4db71e26700ae6763ac048db3b34fd3aca32f68933ead3e5f2d2160c1f25385621fe0e56cc5df4b4b30c56cb5d18677e77cfded32d48eb3b7030a666faed2ee6e27405668e542da743248421024616f65cea034cdb7c567938c1937fa119abf805d58dc63471f3c651c56b8cc9327e4ae02e1e46bd19a817b2f187c6a05f2212028f22066d3be99a654b776f20522fd487e86a515095429f757cddcc771213cd7f0d4c978716618c04433238a6498e3bdac5721d2473d89906902001a3c70372c1ec780a20961e13a5292679a97d2bd95f31efdaa739bc6cdce7d8f6b50273ba81893edeb83f51d9ce89bec2c8618b456baa1e4a576b70b37ee0732c0948e6fd14700b75bc76bf46f6d17574719b2f08a6ba97ccc36d97e5431679123f0ecfc3213d687fabe0b8d3949cf53f438e798b86dfe6d269c4947af0067539b4c8b0950e5dc04d14e1c1185e388863acb00d569286860bb904e8fcdc1cd203090b1bfb523dbd7e760e8a7d8a50d9821ba45ce2404affd94fb317e38de62a2eba5a746e8379ca744ddb578bcf62532b1edfeac71699aebb8c33b3b77bdee7ed371b5c57187e41df1abccacb83e97fcf34c7396d8bff3d32fd2b1ef12c8395ff1dd2264d97d7ee1f5b4756a55e62c9deec0ecb5e26e805c020edec191650aeb4bd1384da67f319a58def7da1954acbeaa2fb03016de0a2f386109da7dfe2acaec363da563f7c4f023139c258ef1df0630830830fd7758f3d9b279615efa62a5d9f27a97954c008d5d3aaa733c258c1e87a23cdd1da23451eee8777fbac178241bef3748c6e6ad160e3b6aebaa597dadb776945e01c564f17eed4b5c1bbb34eebb13bce37d2d93363efe24b660f3785cc9e557dc2e4ab17a91a83d1f085060acc148508e43897993f66a20fbe65d46d3c4d9cf7e2e97e3952f0195f10ae8c20533753c719f6228d53d69a5e3c5fdafb9b039426d8716c2e961e09af9a8eb24a21b82c9b6192069a51ce3fc96843d7ab696edf9d0c42d151f2e2d95606ac14c2a80563c82392b02ab9abe6e3bab8471747ddc3cd06a46a6de9fd0ce4dd8d202466bdbe00088ebbb8ebfe341fbc2395a986df0539503c83bcfbbb28de97b86109ee3f8fc558dc95ef6933abdfd52c6fecd6e108546171b9d998ab91a5bda463dd9f095d7acd02bb18d1fab2c6ae29225b989241b0c2ca794e514cebccc7d7850a09a9bba2bda7a7ef86a1fd469fb059604c5155d0eccd3e85b62dabd64ed86129aeaf0edfa321f8be27c7cff2324871b572bc993757e0960a27bc3634ab1d64b70e77db8426080a0f15eacf3bfe5807a5ac1290568cbb1c5636773f7a751d2c2c99a2a632bed0787cd1795f866c6587cb4911dfb103931df452fd0c0a256e0414e09e035dc601b07 +0x9dbd0cc2c35ddf97c3940ed706ff7a2cee1169ff64661db7d1a805619422eff4bcd7b3df0703cb8fd3fd060822dff322 +85768 +0x4cfd1111482e4e23f8ad5c96049aabaef464b87ddde2d79f409f2f282f7506dbb15d3f9d6885202971a359048c8a42b47dfa652db2bd3c8c25ef3c07849e122490932c2ac36e7bd535f9774ec0b6645a62bad4d2e4be6e53b974ed3629176cc3af46e0a19f12e6910b56bf5de847980a6d4b0f55bc0ff45ec4d34c9e66099c1ed61f64eb4599e9c5bd6237174c64672c64561e9f82d556130eb76125829c2a9fcfc5bfeefd2a0cd711c6e96533365826108207977e3b1ddc5ec633b4c7f79fad61e2f9940eedd830d02add30e7e4f3613978d424f766d0207ea8ca347b4383af531b1bc4c20bd438c2351a5eae97c045a7e08d303781f74634062e8be7a75c0f6e1a2b665fac8957ae90a8d8d177483b216138a284b21ab8498868a3534cb4347a8734612ef77df65de38f8797ab12a971a3df622721c2dd85d57e62075912863f093b9f77153a7b98d5d7524a5ca6f85d4f895768f8761daf967bb24af7ff6d84494a07822e4850250e892030b18d91ae0d3f6b8e5cbfe09172647a664e025113ef688196692ddbcc37addb93d34eda2b840885e377248ef11243a2a185a39ab2a29ef5fcee738657f8496ab9e9713d9e5dec8dad712d8f981d1f1144c56ab02a0af34bfde6a1b88cf867b5eb1c7f21cd3ff36c3572624c4e3c01b19635e0fc42d06f6bdf7940d835e00ea47094ffee82d32608c3a14c2bda17f069e1fe8ce4c49c1a3eeaced7501857471f9278790b83c18c4a9e2672950655f4216b47f6d17615fdaa680eee87fe06190e97f075e298b02d1a102a5cf3989f15c17e39a72c22e41f989f600ee5ae948c59c8267cda8b4812615fd593ab599c5c3260fc265b8eb188f1d8edbdd2f2aaa8e86d3f155b23324205d44e9e2711f5d05a59b7fbc88323419b5bdc86b690f076a3ce66c9cd2716c5f0b7be05cd88517a22b392afd9c8e251807056eef9510dfd7332c11f99609ba408504c510785596072b4b6c9f82797c0875f837f03fdaa453ee3789f25966ae637e621093cd2b58c33a64bd18c66ea97976f8ac03d5c6e57ee27b4d1da902b9364c364b5d3350c064bcf7850fd4e82dd9aea94390d35023a69479d3e201885b4772d3ede367706d4a47866cdb2a7089a7716c873dc520df6998a5a6d60f42050576dd70bcc604c0025e83dd0153923d6163c4ff513793894643a14e600eda56feecb56c4fdb78692b56924e18dcb7c9a5fa3504718732b1bb49df2326acbbc19238ee39131465c903e4143898227baed3a95f4f255088d9370fd1dd804560c57de00a8fbd0d37404a7b9c34f5c1386d88f58637d30ff070580a0bc6038563e300767ca89422779f5d819ccbc845888624635c47013224078cccff8536d92f9ad870c74c4f00a116cb8a9855760be679347743f546537e1f43bd1f9380ad3e6d54437cc324043e47031b117a8590ccc737a5dfeb08e079181b7f0e69779e1adb02730fa5d9b9c9b092a78aa37d80c5e0bc738260cf65af9282872e7f92184f546183e27cd6adbde3f8c47648d4384c662174ce2f005f8c0f074a026e46a8466a000aa7b0813c9541b3d667031033dab8050e258e523a88fe284c2c8e3bca8a9c5c5bd1d98002ea6a4261df4ab81ffb66e5c42b072b8330e044020f87b7fb966bd51bc360597d27ce32fb4198424918f3321b413202c62e4609001dc361b8044918af2edd5427c7cde4172064353bdddd78980a976e7fbbafe5daf9c9bf9c2ec485aa66b9268f6519f42a0e470784948637bed99fc51c637e48d7061327f4a06eaa81fd7c37006a12e1c86da93fafe7adede440c3ad28d041c0a8d538416df39805ba65af1c4751591b56c113541a418509cce29b9d316c8aeba4e991826482d105d831ca3cb0a54d2f79ab0ddb503cdc29cd01900ba2a2ca087fa5c76184e8ba595fe4461ed8f07f9c857e014bee23e3ac6950397f191d8fc58dbc32752b9fb44eb5ffbb492cad50c12edc961c40b16c302641007de1373ca1437f7b23e5124f747ed682222856715bca2924c2f44fb62388467d7eb78a510a5571f9f43ddafc591f1b4350586641baebf645d67569621503e328f7f8718d8f2836477c82743b7b1b30675a4967527d08b661dd4098e0732da96b801097129e302eec137f589d3907b8769657c42400a50c113de248b1cc7a0bdd9dbc75b0c601ee405f710292314915e99b102726e44549cc8ee713769f5d7cf7a74867c87511d6ecc7040caaf263cb58df1eeadb966e120c26ab637f5a5c9f32334117ca59e48b69c0a4c147dafc6b1ce8b099d2a583d748bbcbc36c9c0bc525d832f046b30e7e1002dfeb19895757ce3e91be8c802b0c2ab4a4bdaeb2cf914afc9a7bce3ed421a7d411c4605c2923e5471ec369c4c842fa87e2bcb65d3c860a26e424b14bea0879dae6f7ecd1c641eaa8d4330ac1fffe50cbf23b23f9b705ebddac85a068b4b50e7dcbffef98d35456ca4e97d02616b0c5e74fc377f6e3b3888760190c23d899ee334d47191fc4bdb221da7c6a6fc0ecb27077e012f336f138ba8b4964fbaa3991a1c757d9b50f007546243b39ed6314beedf71b956d2551a4fd9ab13b5ece16813fd6cca217369f18bda85ebf4d91bb43b649d06fd3235725b72acb0fdba8a3456407f012a4c01c24eed3717b0ec162d97feca912b3d574637d980152e0be8246c4b77cabfc3ffa226031fded8f668de8815bf02e8da02bc6c78efe950c94161dc881bcce7c0aab89a8407e976e15af0981145003cf180fc81b6c0d46cdbde122e5d35b0aa2b4c2d32d8b5e09194348b4f5a2433306b172ffefabd8088290760eb348b1d10ec2b287668f16932f73ed634582444cb2e107d6caeac92af9b03739a74e7bc22ec8fd2ef9a852f60f2c0facf740cdb1623b30d513956b5e6191c72c3850f35e711c25324d737d8236d011fa814a69f173247083803838f378b9885efcfcb2f67440bd29d88d10d83504a6b48a2b839d8441695a674fac8a9d9c0d6a4bae553ab6eb177e31319758983e30936840b50613f66dd25f4850944ebdc8a6dae2348ba75fd6c7de2d8b93cee141ffa24678db80d80083cebeafa11a934cccf134fb69d4337d6f35bd580a57a25d61de89498e794ac3d74c1f24217fc0fc254512f475abea7e0cee8da73ca0d5d55263a5918f6be31a453de65895fcab79483d08ca1fbd094af95f0ad3ab59005c59d817fb6eb71596663aa0b79effd726be4f82d6c8760486ed0db177c6eec654d0a24cf19d0976aab2c8eacb8d17b896f0032dc51075509430810e0e1fb07c516f68d0ee9ac17ad9a35f00fee0d2e44c75ee45ff782992056c3f9d01366cb6d47e92307d088d96a5c0639fdc4a9fcea9c87787f080013d5d08cfdafb7b71fa409694e81746bc5e91827d23ee1afcfc515015404298aab6fd9e8844478f4eab4840076437d5dc371f721219aef268e1b5b56e2b6042649389861f658fb2716e3df3503169467bb4b217a90d993172135950d885d41dfd576367ebcb3eb578a7a43905dc2618f95c0bdbd86c277896f5becafb0c088ba3772dbc73c1dee8d2ec0d79aed0f8bdf3916f46f6b1e438462d488c3c1a87fc15874adc5df5eacd0eaffc4da19c5bb5f8f95ed1aa6b59f11e1ea90d123ddd1fb1ec3d7ff0d3dcf28a67d31d94aab98168087d145a14f3136d5e32c623d27247072a97ffe2f84fc9d4a84471de98acb0cf232c779c3b4a4fd240886fd794e21293d6cce48abf9dd38be5a2d305c2afb49cee0f83d74ab9e6eb7a1c32a3e196f2d6555eb67eb651a00ea470c9a0d53d1d6fdd78b191cfec79076f60e71f551b684d4acfee3558f5bfeb7950ce162cdf4ba665fa9952373c96b494e8d5b04bea03770b93142534147380b8a548fc55f0efdf0c27a3af2d3490719f3686fd428d34d23c3aa0e4c4186b8d0700d2b9dd3c4a88546258fefe5f26dcc2bc835cd57f7ced31491cea858c186ec8d5e3e52efc0c10c35d31d837369a44c3fd5365713b5c36af20f0bce4ea0a8492a704f4c7caa536cd5ab6a164359b47f77b6f9db23b533cfa64c4c28ebca28cd8e6be6f24129638f6fd600111f68a64f1a9407bf509e26ea786f191df7e80d6203768cae08e6fb5c4a7b67dacd3e81a37296e66d6218a4a3afa0fa1539a160efcfb9c7e7978922bbb0c325db15844d62c5e5204b21cdb6e2950978787a9e285b3b5d2206b7b9e194e7d6c47bc1e212765ca83dc35462638f70cf1aaf82866d908f8a2271301e3fcf38dbcc2197ffd9c67f08c33cc582b492891d69201902387513675191ca614455ebfac3376184a93a752d3c1e3ad3afd32819ec3407ba90f20f1d36ce4d2af80c485d3324e5188bba883e2fd07cfd5e3b95eb2b5313557defcad35991802064dd9729a350ec64862efe6325bc53a9c9b017bcaee6077c07548db243402cec8fb01f899c233d10a27e20c6a549867ff71bf7b4fe53a9d63709a0e27b451936816e29a3a505a2c3e793368c37dfdf26f0657efaa204c20c14f74b8a89060fa543fdfd9f465ee1255e5388e063e62447bc74f1b7225f19c5a604d6d3f6edd6e1dc47e3a60796c3df0ea75de8b2c61e8964329b1207ce78aaf61988e449603593543323e0711510990077ffccabe89595ef86c334d7b8a5620b1faae60ac9f663b4a804740b4390fa3aacb4b5d7b251126557b0441d856996eefc8400c28fdff80390cf8a5d890aabc62cc5cbbc8d19a9ce8fab6b5e9c8ceea59a5e5bf81ab9fb49d2cd4cf04d4854ace17a35e4e2b6023315fcd12467d6113adf801e34d24b138e5643e04bf8109cf2b21a1cd717f1c49bd1eb9df64d0fa8b4b53172fe1f5fe9db047c6ef7f32b2ba286efa71b9690970fabc0f85db6fe5a1c03bb7fdf69bb2437c4bf1f7aa561aac3473fff3ac55b25968bc209e00a6cd079b1646c5e18286dab7e531a5e7579c15edc534bbc0e1c1338593af907b221b2d3a6756204946e6c3e1a81882acd3d177a2d73b427d8990cfdfd70ef5a14e5a733cc3588574555c8f8809191671473551f22e662058a9bb6ee5fac1462998057a00aee07e194a52ae198cb5c9cb1e42255a3f67cdd8eeab91268368fa6a9b96b2248e6062ae72539024b7612510e58272598e92a384b4ebe72fe5589aead598bc16e67aeb8a79e9e627fdcda0f92970c96e908969d298f6d140a532a030b295e8665b726153dd900091d43dd5ca56878b17e9be59490746d027576992c2dee8d78131e97c90f9b08000ef443c3af94137d3fea42a5e8c767442507ffb17973bf9f61e6295a87af5e4e383733c918e48602153cd359994e02e0044d831b597f9d04375503520cdca9fb8554d5f8491d7948e6dbc0370bd2e7e0f9924ef134d9cfae7eb54e3905e99110dc9252d7a80a93589c0d32c8a71abd4beb1c87bb724afca51c4c3195dc9fc094243ad2ee9e727d391d1b5192d3f02d2ac43557027a9accf2fb63d5f0f8c6db8f47947cc6941cdff3534d441ff81adf846b23e64cb691e99c014162d1c1268d0a2ce879e6f0d15f8f24ea34f77f617a61c82e5b248df6f8ab1830ffc19f867b0bbb7ef1d61b59a8147a3c48a0ce8da7cac3a0df0f6793a4282776d447faaf509ddc9d0b1f7e7c608a3c89a9a44f660dc544bf9997ac2e921a165c0aeb3a6ab2c5778fef48800230f9521a7e8b69b3555d33d5b243c5906d89cd2ac935c77d4a8d749ac6d988b2bf6aa337f0db833e26977828519b1881db7e332838ae0ab0bffcbb07b85b0055b6e41927271e07cd297dfb009f280ec984ff329e80dd69cdb91a351eec554fb3bc709b344adb5c290516a5a7c471102f1217b1d3c84a4d9ae2f0c8268b4fdd947a1512a4819bea1a636a5c64e7ff847c2acb9910397e1fe1df855d69bcd112c097db64c0f6e51968eb82097e3058d3787625d09dfb0045685be2dd2da86456febcca7ad0ce4151da4465953ec80666eb9e2c3fc2355829f8fc0d2ebb768f111891eb3c1c3437fa39171be6ecd791a49d4ae8cec7100f31586a103a5b4fdbabd4bd4592eb4e507c4d0bade6d0847ff456216266f3b3acc7524ef3e7545bcf8cfbe9e0658744133fdec9227b31f85ac0ddcba1ed8f46b752ac50bc1ff0c1f31c55bcc59b363f09acb4f8828f595ba96ffbf1ad4de3f3b93a2f1775c975aacfc4a9dffb1e4167b8299641d6098ed4f569783b8f6c37e039e6a34c25cd2c3deceac1f98ad4f0e3aa1f4e4c25d1198bc5151c504e34d335bfc0d096d5135da3d1f863b37ba78adc67f7a2c077cf42a9a1ddaed9f28bfe1bd32f7d9e8c825003065458b5d57e597975175b46d4eb50561128f87d845b02bafe9b740c52044c86146867a6a040a3e35ee94185450d8db99e5fc0e50b8b2539c76c7b872f809b54829a5a2fe5d7b141aad31b26d11d3ffbcfe8cfb88f03b0c0b70b5bb72cdf8394d854f8f7ab2acbbcdf3fb3d08103af432d2ced9f19abeb7954dedc4550074d6f9ffd08a7fa21387c8794cf2c5ca725ba3f93e142af6b1d8a294ec5d9a4e1400c5efc53e6daa442a8293a38e16af1e8888d8675485c2b8f1bbbc4e01a2e55a6949dbba15d549b2f684e99b698b3ca42d49f6b6f5a25d38a5594a6f3b1f84cc52ee4a1b9b36fee48e67d1910f9401879c6feab981f144b545f3b5dc7450aace703bc1665913486d5473e2210ab18c5d68831afb840307b35623852247f6a5f523aac826b9fa9491eb6191c7c5743b7a13fc0de9764814b778614ecd107224b4efc3d4e9484d8206a59976f1da4cad82216349ffc3410a461f2569298843a5a2571f5e0a8e9c9f303583f83bb3bb40ea133135cb157e46c3acf86ae3f9fb8731dc05fa16f7583ab2fdc9ac01ec3094365bee87c7c76058d4b442ca78fffa67d801200f9b1d10e2e370d2e8f0de5d15eb7e0386726397ceddc7ad1e5504c0b62948e625135a472666312865651491547dfc08d84774750763499fcd04a30f009a25d0c0fc497b73afa14277eb296dde625886e3d3649890e9dc836d044515c5af1a6869d2652e691463a9b70f8752f23d05d64f92de6309f5d2f064d0857573dcb925961237c07558dad6993eb8d15e62a69f62122c74c10bdf7f4af5cebea9a76490cc582bd206d1894194e5387961779d4ac1bde94e5490548885e09b51b593bf2272f0dbf3bc12f18330bf70aba9e06c60e5029f404327d494bc2d75cf46262b532098a275f3919614031a0bf8a631966a528ca8fafb36d23c4438d897d9d33bbb6bac2a095bd2096c828164d0d4efadcf80c8b0ef1b41cfd7c4af5e3bdf3f62c3baa7dd0e4358adf5157215e4c48f0518f623219cf1dd300f93dd513bc4af2304741835f5489a065652889974d3744edf393885753d6da54c586f6c0828c70ed64e79bf6eda1aa508b0215a21a053fd7ab08557184c77920688b2093189fb88e19048f3db865f0c84c4d8f27bb9826383f28610e6ad9f88c68b61a33856d1239ee0025dbbcbeb9f42e72bdcd36da4437385a73d70ef29ec24f6eae4ad1dcc6176c43267901924ffcbbd7673d95b1e0fd1d08557477fbb4e7a41aa27d05d61b4f1a3559be90cbf8097be5571fe00741b17699cd8caddd8226f024bf7627425a09813f8853704ffd43f504541a1dc3b07ccc75a4c7b97e50a5baf3cddd4207cc6f27c779dfa908a6d1b19d25d656cd7586a504a2cfa2c8668c8aef94595b0fb6a69637f50b44dc3adb371693fc920dd8f68cad8e4970a20b04e880db937c4163d956f5c47f48b5038b10d96634da6b21f406db31e02cf389355d0e6c33ac851a2eed6baee2bd7a4707c34c662535cf97aa9df3543adda5264670010de0f4c322cde5ff7bdcac134f77d8d95a78ab21833ed85ebdff8b9f2b5faac187425ae3c4dfc61bf2171c676304d7e70cd444492dd83f8435d83ec9e0aa92b6a202e9ce488c1626dd381560cad649dd42e2092fdda15bcd836dff0b8c4cb04925c8a66af6fb5f8802ea9fe5ce14b625c54a01bbdbc0b3a27165d54d78708ce0da3b9ba0155528a829d3c3dfb5e6a4265db334d66e5ed069c568c977ed3cafe58704cf59efc1faf01c9b8834c8759d48d1c5ab66e0a3388c4820e27131d8a0bef5cb4a7bca685cc7a2ebf7cd4fe928f3eb296d5477b67571c23228238c6de7d5ec3715efef72d695826b1692926ace8f718782897cc00f82fb49a37648230d9034f0379ea606f0c385c2ef6bd81e15842c86f3ec36e88c25ba0b5c50ac219959949fb86f374c33b773988a416b30883be4cfc764ef5776c4c9205a9bff901397d5eca149e96d26da1497edfa91c6ac1a610a06dbed3454c6ee31a53d8a9703b1bf7ef916059152942f65228093090b8a6adeb9387aa8af93f2e64620955ff2111afec8bdd3df3d4e8eaa31b9b9202cf4c9f3e763dcdb0e939ce6442a6710681eae1316269b80716ef70f208f4a3397be44f298435bf4f92eb6daa7454ad1eb404366ec39a59c765e333bf9e9906cd552a483d4c2411cf8cc0669785884ca05dfa09e51de385ad2840ad8c4aed1f16d16b04da4c7d47a94d5563cbe4a5e243d638e644efd9ee20f4a438b87c856eae77432f90f3b5e3754b16cfa810520071b35d560ea7e1d5db417a8fe4c1e6780ccd3f02e1e04257ac1c8104cc970129a28bb3d392d49fef34a52ffd91a984bdaa29ab495d80b726c61820cda9f737c06eb5e8e981f4689cb586511c3fa1e4c22f43344d645388c34bf48274b0af6a572ed868f24c95e050e66b7a665f298b07d470568986d74bdfc6080284813e1d607b49c09863277bce3fdb086670deec0152578ea8359a54be9ce94d878c11c57edca06c465627af473a4b878705009c41215f4914010b47f2590eaff841c90704bb72e886a6250f6e5e3374528c5cf049ca0e124779a8aa1d82eec65132c236949017a1d3d39df0a624295b5397329c7d94ca76ccf000df9293000d1cefabe891132544a85ef1177124a3a904862ff57f4a4ae31f14927ce411f900c5c8d4a19c8d123d8ea8dcd871c828f9e009b3afa132d5f3a857dbf6a488303df67edad6199674f90161afa80a972faa70625c0f95f71205132a5bd1365e2c10f9423d1a9aa7b4037ae9e82abe0a3e47205087b9cfff75a3ca0c70812c0c632678d369c3923955d985d224c50ea9cb6c8a34d522a1b4776c478ee8aaf82b6beaefa2ef8582d3e107ac9ac40b7eee5d67188fb2cedddeadab1621f2a31d33bcdab8214cc50f0fcc1a49a4746271507ae355d1af32b6b67f0cb0564d0e2dadcc727ceef0067935ad6df79f846ea8789a4dccab38e2ded461fda0ac46408c02114ea86c77be63eddb8f30ec928466bf3222d76cce53b8c10cea51848cfecac921cbc51a427151b0fcfa800c1d484e9ce8ff10a70e09c6f4c67f5d8f6f7d6c7b84765d78feb3b4f7783c6f7e833eb2ba153f02da4679ac0825192f2d8c50d391afeacc18fafa1059d3d149d472bc556f4d6f28872627ba43af4440df621db2940a75bb7ad5b90630a635b97e5a55895507fbfc3e1b98845fdb8d3d156f486bfb3ac3860f0d84e91455f6390cb8aee0e3bb81e85f95409cb520506e802245725fa730c65600c23b8d697f42effc0cde93fe9d976c31b465ec243a6f7029b96809d669e6d05e059004675d6198b313d4fe478b63f46f78624d4da7ba95c3f8bfb25ebb821e83c37901c5fd0fa76c38868b1ce7e888bce134810324da31afa7ebb196c202910090491e0bfac79c960f55b2e53f8f8988a33f0feb3e49044b3b6eb01509f2c852d092a1bfc303d8befcb51e36fee3877112f4527c60816e0527cb166fffdd350928e84547e25efc4585371598b26f0304d4f6e12d180ddf8be1835cee102c5781edac613ad52367d83d5e4170d6ac7c924da93473e158e93e1d2a0c45e76aa05bb3719e0f181bbbd5898d1a55f80654c801ade4f738fd1baa2f11acdde202c0050eba544b278268cbfe6618ce73073c0485575b1dab64d74e9bfca73c9c9f170c53f91c658001ef2a005bb530f44992e64d480f5d951abc99e82d93d8739a15d027b06ef4be14bf8e33e09823e827e9dbbdf28a4da2a92c1aa836fb38038e5cfeee72b45f3e356a570d970a2dbb4cb1537bd94454407ab65f30ab25e1c8e65cf73cb2952b9cee7022f1e1a3a50a0279fbfb8ee607fb19ebc625fcdc5c402c864786e279e0369a51508552fd2040f3b413c165b7df3f012cedfc9e671de5eb697e6194eaf3a7d39e8e4c5d6f25fc8af0594200525088bb0a4539126e8d468d96fa314c60fc7d24a83a9b73823c9952af3b01e14df264c1f45a400b4b40ce9d6f498a7b646103081ec41737decaa3c54127858b034b5f907b9bc5cb95cf0a8582ead1a46da7f5f862d9241ccd66a86d66ad415ffab1d5b120981ed5c69e66f0526cbb4a0557b26004e86694d68713b5803ad9f2cccc63ae63cddfdc662580485e3d8bee93f6b4f985504322a2a282381e6e93c5d1f185e2b5ab7d21ecfad30816dbd804c1eb9a0f54cf3e688a4f505fa1a7235bb2d7c8e8a6cf6b58d394dbba1cd6342ef7ccce2c03a3dcb925f41ab6aa72ed26d7d5894aa7984ee3b27a06d8c0ab14cfae00cdca028c9296de275db7a96075a9b971536358948c54f210e0eeb2c8ee596d3e1583e1d7f4a44b5f75ed2eee4176f041c3dd0a52a82f1afff65653ce457ebdcb31c412147753d6131fc19b7ac4f0f4bd47025d3126c4b5adb3ba3409ae82083eaf2523c09f1806d897cf8f9494ba3f4a499dc1de8cc82a90a584c4398e15d50eea01977ad07366169a816bda2535488f67e9d8b94eac125f484094ac68acccc28ee3dd91bff87c638461c0a9fae498e31e90f24ff0e2e540187825f0c2a927efea6676b3c219a225e1fb1e928a6ac8ebca0daf00f80f1c09a285e89520adaeed98e3e34f6b4980043fb7e612581a210016ba7f7ad8733f1253046d18073caa522706b3c3202a8e54fa22a7a7e88559d67141e42c26d1c6e0c68e13d7eab8a2a3f12958bd951f35beadb5e3c1c03edbc5661e6d83478d3bfb595d8d834fa43059a3c652ad1eaa1e97c6fc2b0e53a91f6361ca8c1edf1816c8a82d2a78aaa1dbf99b882200415d9186d27fdddc2746ad2700b0b06d3204dfdf1f678b469023fdfa64d9675581ac36e25c9b8cc9bfba0d86af7b8aed04c60fb54b87206b749d2ed28c24631b74088750c1d9a8359155a908da756c1cbbee1ee1a9167a55ec8fd7287e03c5d08d050b58aed4c0ce20bc08341e58e48abbff95cab49ff9a44c7e9f52a6f2001331242b508ff756f2025fc38ef7708495a95d0cf6fa8e3ec538dbdfe7b3799231f4e87fdec1cbeb2faaa3337fd266bcfbf888dcece76bba37164a215e1ff50cdb6cc4615a00ccfdf57e49009d5ba5fdfc2e259e2307a2ec88892c0c3c491ed06dfd3a8868a974ffd21193835ddfb8e834be95b91fd7de5617f603e8f8cb317d782add5d61485e7153f9256437fb19dc242e7bc669d4788793e164502a22e764688a0f490a59d3e2e999710bc22a337a58f22a3e678a0be15adfcfca26cc9b35ed7f52e39a4a8fd50176f8e272d9a02321be3399bf6502f3fb45a8cfa534e762458f4aa5b7b6fcb83a164f90c0a5ea673cc71a50c801e84fe3b771c8fc08366a2f3e4917d91b751d01fbc79f320b7cc708b1610c17cd3655b2a9cd5eb19322cdf910f0a284e4b363e79c03565d76d1c304118a2435437795c6911df95c72170e318bb3ee31af223d697b856e997473dbbd4c082196e12690ce01e61153319d9b7723154365d73c09f61ec0308c80ed8192e56d9cb342cdc70780b83f4c4e10f6285b975a97f97b4a1c0a36549d28a94533522cee20c4d7b92171f6fb9e143bbec3b9ac9c5e826a8e49a27a4341e831a6fd36b8ae5603cee79a6a34aecf405855e7a1e771101e84371d9bee75112c11178ef7b355c97c2dc2d0edf3f1564f014bf2c8ba81630a42e4f63b15629170b22737098f6cf19a7eeb7351b73bd99cc1117382a835ade24108622481b43962bf56a400bf5c74eb3cb1e059f116bfb61236e86433167742e921ffcca5b27f5e73164461c5bcc9ead1b6a65b23fa8f276f3cdfe1ed9c5588b5c21db81415e9e087e6a6a125064715f88a33c9e25fbe6d5283b8802a4faf4031594a6b3f26ff75686839437fb192f8fb8d274a9edec3f446bc10c39ba90af5d658045a999e26a98eeb7acd18572400653fff41cbc03658c64667209420ff063f6ee9fab5c405d98610e9a2915f70c8c0230a43fbdc9c075ba32a2bb64fd21db6de59e0063103a1c85914687d431fce96d6f6c5915c5b8c6162d84964ae4a98e756e29f2d7da68ed02479932eaa776e43bc334b4ef80b6491f6001e4194bf044b49028c7e0274fd3813979747ee1e3461435e496718020c47ed2ffebfcbb5ec4d25384c8a57d5795aa6dcf93b868acd7a2cb6448c34f6000da8b67f519bb5bd878bf233d4f67e8fd24ed84d8c1c3375f8a8f9c120e75dcc5dc94224898d34f464eddee6e056a6ad198c17e8bc17aeea67789753b7a78feda2cf4172ca28ba2d7fbb4cda2f01045daadefa7f4df1638730fc0d50d2ee22d0971b32deb5f6cbc53284ca92338e0e1e00c81e65b441e7c90fa3ca6ce533ad01853da4eccf6fd05827cae68370462a7ab5c7e2207181a24c3e105cec7100951d07c7061168fc6e62ca0e1f4277c1ffd0246ef4541829397d56c2437408ed617f9917d4d125450c5183bed333bca9e4cae72db3651aa103d8e42a0c780f4298a5b3d0afc086b220b0ff6db0fba1367fd78874add7fb9197eb50c8168d16b8a12bd261d553ffcc521d979b26fee820376252e452213d736c21471cf01791b8217e9f4c1400130bf6d3e6b7a3a1d3cf921800ed2ed542bf071711a9379c12b9801a550fba5942e9a5906743c5a906cd16550d0fc268bdecef395aed5baf1c45538bae2d56c411fdd4cf83dffb68f3814a95c1bc8b5001759b048d69bab510d4024f051567e502b11aedd6ecb3661c849576d984082fbff1711513aef34292fe12e0e4586c10979bde67dafa8c25045f8d64bee6b76c4be927c7a81d83dc051c0bcde686e1eb432695ea0a69f42a2d7aa8ebec65177a27b525a89545fae5f9c6638265f157d987d9e7d0efeb79ea0a5e5e78ec8fb6edf5fdd14475a8a6f4e385a08afd584c7fe83e2ab8e5df9be92d83449829b7044c191bd107c3c6369d54c24964170c1e22e6cc050ea6c6b8bc0971c1c64e8b8df91397ab8f0a1f2823c004d48a4d8d6b8705fbdd4e8d217eb710b27c8fa56dc2996819a736a323ea3ca7d5c889fb6ca300c8463a0513705c7ef5cdcb50d8ee3091a8fa7a8b4974fb5c8ebd9bdfbb2a6314904391aec453c0880b1c34b6437d566638b29c194772d9e7e724c4e807371a57107c7ab83a2c4946d3265f3c9fabb2aba9ea625d37ae14834383ea5f6a23373cab496bbdcf6a555fe094913027f9c3c67f0a83c394972993268372925e6f5839d342db3c1eae7327a5bf815d86d8084b2a8b66e8d8ce87bbf28bd42d5e8bebd31af14f9f82593122b53f85f136d6feae3ee592399ea4bd525a05a58cd509609d04cd4f74950b1df5716d35b7b26725641ec17c3230ca48eaafa95d3d6c5854fc033f4147e13478047cf106fd74190b015c77bb6f49afa90975bf61cb8ef94774a8dfcb75d155fdd43a43805f165d2e0a7aa0a64d43b56c234ed06993b77ca69b682754ab0ff00de92bdd2848f3b3ece3fbb4e368a97bf0cc8d84cb32605300d4c39e6343d78336b7e4366547a6adf632522ce92e0573d569d4451d24340cc4b54dbd7ddcd29ff6c4d5e7ddd7a9bba85a00812e19c23d888f9589b5f58d1a80c158fd0ad27ba6cc948359e865776d91dfa95a38c87a2998b253cb4c02e5fcc36d87e5a0c15d2826ab7f151b9d8a2431479f008f9697d87456919245f8d933eb3e5cffc625d194a37e2b91edec6c800506642c9920a5cab9f0c1771a33d15086984ab3f17c839cb1910b68e5be98f19bb09b26fbe31e50b81585d25f3058c3242fd3aaa931ed70df68b10289909a0953ca96981e4a8c3b1d49314c7b9aea1c22597a3c53e279e19b899ee7400eea27cba8f8e876e359ca57e0663e05c01fbc2f99b0f1881aa33f6458378fbf95f3ed61f044a09c3a119ed69f973f744c34339a851a52cc27141ac8791d844ea261cac524ec5904bb3e1937bb36b94d9bf203019018e886a426e44640a33d83c09e3053bb526a36e359d9f9e7e744082bc3bae34f3f1b4e2e662c5c638b43d58d13ceac28396cb94edf417b9a0b681aa813bbbe16ff7399125c637946180fda446ce62cffe3c8f25a58f05b46258e2b6d7c95f08bcc89edec642a3b6cec2a08a2f42754a70417789231570770c83e80f868da391238b6b33937d1013c7a0ac71553f2b1b1fcc0b28302f61e9e65e1d1d562e8e64ec6929f7522086959342abc1816e8d2a5406d46b9385dff4381208480f55296a5f895f91ccd20d237cd124e17976a25f561659b816bef27f49c631f978a97b89c314956bc93caea5c875a03b050173a36f2522787f82a27362a321965ad38caa623153ec11067004c055a636efb406dce55bb814977bf8b6cbd15f897d7a64b68209227c6bd75c26ac9abe3afe3965f401dfa2f2264ffb31cc777338a9470c936cc38983a05778f4d46b70aff93898d10bda687cf4a6b4ccadbde60da6e18b2b68881169792fce567ff145fea958a55d4b739319c8292970b5cc3f6e3bf2e964bd804097bb076635f754c48dd642967e08d3aa306b7f64032dcc06c5321f2e28b5d2a1733186467782bb76c5479e731e8c21352ba6516d6e5de5c4795112635e96a7b966a2557806694ee10ec61342241d86bd713f474a9a8d3dfff2617390eea92612d9d51c04c8f4378fd119490d78042ac96afe08056e05ff429829e9bbbf367833329382f0a76a9b087409e9db028934e17ead3da6d10c5112d3731deebb85c4a4dba42f468a15a5d2615e9bb5aaf3cd8d15128d33adec5bf90b05b730c9dd33ee3ad0cc0e583b7a77fee006a2588c1c5697f7a1b6e9eb467ea8a85e8ad188ed98b9df014efb25457fb557d3aaf49a4ac36c2220366d523a2a1224ba02bccc192abe9875105a1b2c70ed8aa9d566667e5dfc5bb3bc21695e83b141 +0x87703bdb80194b39bcd2c71c2347bf71962fef9d9b77f637f798115dad973d0642c50ab15ad7bcd9e5452c4990376ff8 +86560 +0x90b569513f77fb5833b71e852c8ca03c8e182a5757b0cd6d533cde5493e104e41bde8ffedbb40bcde18a154ccccf6e0984214e28286efbaa485999f055df447a553a5cf5db05207537a27fffead92a4a5dc1eec6d2e441de9a9e1b7a88c607c9a790793d28b262d79ec602a46ef0fd8880c0b23a3b5ac890b1d409fd16df745877aa8ddea803f87b7fc046453f5d0f4957e6418b4d17b748f5c30e7ee672b4af2e4e41e145400be94056f4e94768871849fb44c1ee65378fce32d007e0c7ee5635453d4de6b0c2aa4b51b4996d588e7abec662e5088a70eba4eaf79fec254bd6f257282a739c464506782d5c99774bf91e1044fe82cf89e7dfb42c4ff2d6f3b5cf4bab81d34cbe42db95083ab30be71cd2a19114447cab08e756171eda200d7e33eb6d59f008532a316eec3ba45d896b4041f23036d9fdd824985f148c4cc1b686fd17bab1182d836fcd826852b55a6fd1b80f58402ea8deff44ac39f1a139e72f4a50acfec373d8ff7872c8a65b82afedcd8f974ac2d3a2de20a896ef699a98989ac138bf534eae48376363889628b4fd4a1bf23cdea7ad2af6f9326fea0f5228b51165dc0ee58fb2d4fe42e1af740467f55a73feca4c864c8c47155a6ebd9c4762e93c3e3d6102a515ea6c97ee8f299596f52178cee9b5aaaa3b48963bcffe5d6bf1c3cb27e99089c4cfe9949ba1abedf793049332a6c3ae1a7cd20d996b00d296d0046c16a6bfc6a757c2befed110d9dfdd25353dac37bfa3b3bba5d2ba2b0fac2f070a50bf1ac48728feff5f48e2c0157a8b47382399440c880c482de3067a74b5d28b1e5d26ec2beaa53e052ea80a62133eb26b3372a71ea2ccddf10e1a7cb80b6fd9c8a86da45d46c06339aaeb1e8e50475c1e02484fa1aa034c6765ed7e3ed8e6da96c77655e3e3565543e4326661d8ad2f99bba6a45d47b97dd70d09e6cfc53d78d0e3c968866b6ffe6b050549a35478122384110e1922f7578831f61d337a7e99bd23ef430e831345f935ec2f1b6bb1ec068513f59fe3c4c4c4f73a8c329eb127a6b06f5043d54b12349b708092c65fa788e833c1b53129acd1875f9a94d9dc09d3b1d1f6ed091e4d656018a5d00d8a2af2d2fada24b42df5f80aedae20d509278c4f9e9cd3c795dfd4ab6d049de73a5d8c6deea9b315d88881a86a329f373f6919b25dacbeb6b7aec9a5f606c1fc78289de199942cfc324db488608ddaaa87b7c101968d767e8ca38c763b1303f54b736f5683045510442cd9d3562796d4e8f9ce65d1a7c3c81ca66445c4942c7abc2648f33262f8fa150e37b0d5689e5d6a17860597626d3c70a09b3a1aef0432d22971e03014db62add9174864b8b9ee15f9320a6f263b818f77777fc48e53c6956432460584c7ee1577c1c38b7fae2ff288199be25bf640811541394ad7e1dd0dc0d24d3718834954ce7d48d22546c708aa85e1776966204f6040933534762043239b1c503ad91972c893ffc212495f5f48bc03b6b853ca0042beb30b0cd9373e77d3dcd8518f07784c4a11e2ae7f9e004b072a27b085e59ca201c157c7d3c906a2c3b455c56eba6d41eca6ba62af2df299ae7e53bac31a2c6752e69ecc2c7ea48eb3cd51fd3edb5991bfe5d394a3b33d1cf926c13cd711b67bf9496a85ac001f21ea4e5363c71145230cf7b4ae21d9eaba304bf9a0877145c53e1442591af47f45b260e45ed00538df1a04e516f247005d9a14844c9ce2de2d696cafb04005cde1512b8b56235e3aad3333ef36dea487ec80aae9aade0e8b9bc17b38f3e4d910dc10d6d0b386c553759dac5974ac98884f2a34b020149a53f78f696588cf185020378a3bdec2e28c1fa198ab3a26cd096ee0db621808313f291b5ebed8c96b95940e6e553d9f5cec93871f6eef12e81531eac786f98079551aad81cc4b9a7ae820ddaba539e4dc7bba976829fa3994b1808f1fa42b451a9fb08dfa164a09ec50aceb68b33b5b09427a199c64c56377e743190c44161fbd25d403f2243bdf69d62081ce08a9ca8c48bc54e2a8b75739be62ceb5ef22d50aee6f56917f87e49b8164e7052becfa0c966991637b38df833fc5f7432cb731a80267cffeae97e02759616534a46db3323267184668b0c1fd7054dbdd843df94069a6b66239d29bb866fd4383fc93bca626a031b4f487c64e5bf8c4ac7e1cf6792b1253e4a99fdcf4b121c81bbac5df0f7afa24d5a926b61e0897f8d7a2bcf0fc5195edad85686d8341b63d24666de215345f38d00ef359177d1ac0877885af70e316cde45594140e1ea2eac589f28e615eb6b6ceab5777dfc46a64e489e0fa7ee77c3cb2a28b9a3d51cf1727aabcab9bffe7e6f609bbd71ee56d2c155c339ace67b1803ff2b4c7b7e1230c725133016b20d91071af85427de60d604379e758076a9ce1b2d0796225d68810cd06bf5777c8767c66251f80a3d13147956965fad1f925a933c141352e39e56d6052c8776affa572fef4ef593aadc12a34b31448d61b341eec4f75067b11216954bcb627eacd4e3961a35f95e783a45147df5b0cbbd8b18a02017b9eb366264dd1cdf1309f3b591ab6bad5fb545ac404f776a40c2b388433a05fbcc57f40db61fe0be15a3350af5d25c2bb54293a088b6cff5611cc449662ecf2a04287a828ec0400ee6c4b15364ad84278680d2c582dcd02d8e34603cd5e0e4190df72a5f5380b3481309290d728f4c274ffa9369c344207944a427e12712fd5f262e9402a8b3a2e006cadcb7b41a4ca17e1a563bce6f597f10e68bb4ee177342f949380b02eb976d5e947ce08db0ee3c9d5a8b8a18c0b3957f65fc467f70de8b03d196d6d69b194666f069f683f5a94f2a55a3f316daf762eccd0a147fb1a79dc25220f4a834a101dc6924881b5b166fa1765ff55d307d5df566258d435c56d1a13576f2fc6ab7361b594d13d843be049f46e00f6043bded05dbef3f8ec374ed4d15f940578fd459905b44082f61f8a4703204bfa4974196aa88b79996a97a37125e486b2e2670c2f7e999f3a5186ec5d0e20e74beada0f150172f3a1f50ef559d88b4e204c12528ae8ecf54cde978ff1db19dccf2f94473a2e1b68f7d6c4cbf3b2fef335fd259e120b544ba0e57bfa6d34b1337060cb493ff82de08355e0ada97ae57ddb3fc9792faf7aa81eae59b537df90f314c4a69e8e2751642db98b23e2fae7f5f958266a499b0514ae805a49b9a45f24a5a44ecd8d832efadd4cecb607f8ad62779163f9c8989e9838a5a63d594dc6ce0a48ea5ea6d36dad7b542ced7e3ddfcc3c32a9ae146eed3aa463641981a06cfa2bf8a3da40e1b582ef1a7251b091243b32831f1295e59904da03bc669867fab0f0fca1c8c273af8321e6e76905bb24b840cceeacb4c44bfec2ccd7aa066817f6419b0bb0965202b7fa00b2bde685884a4e543d04d7d5aa2f4508dd70326c6cd6061f091a2346572660affdd5b9b5f8fa456435a368de5f9f49fdf63d863aa15727cec58fd11756d93c3ced3ae7141bcf0b44fe10cda81156b7f5489b699c5d818cf16496088ca6d777efac73d96a9ad1893cbfd370fb695d7836fe114358485d1ecf11b8306ef028f7106208f67f1c08a794a075b79f0fbb72083e287d370bf2c3b2f27cb185dbd5a6e73681a51a4a7d4e93ca7d0c5baa788fb530667d014e4964e02f6af49910e56bbc51675005cc3764826573d6f8e29db684fe56ac7eb868eaa2f10a5f7236602dd6db425e06493ed2a998e07c3f6130cfbccd7d7275f2593b4060e55bd7f64fd67efb9837e66a9b81508c4b68f5cc3cc1a6c86538b0a4244102a3825192f8b94dfcd9f3436cd65558bf693c01e5cec6768a149564f575cfe230e369a769e3a67a989edae96235743e3d563bafd60dd8d5b0dc95600d0d6408114723c725601e459a72d6948e31011d147bd1da8f3179c65f46ee92c015ea9aeef837178e162a96497c6ea9ba7002dc8a0185ead9e3b231e07a2764d5356a800f1d2d016baed155eee52a91ac9a8263e810e0477ccb8afe7ca1c83d1614eba2bcdf8eeb86cf1c6ad1d492b42d58869a76cf695a4090091678e35984495b75e83d66e13fa52211bd3a722f7a045218697b67a889edda375f1f6763a337b1103ad9d9ae64914ebb3771e7884cfb2f3fb84100253d4a531dc2b8566e01a8bfc580da607ec212fc1fbebd5a2590d897046f0ec069df20a1c2278ad70006642d9ba28625d7c1efd4473b68f38fb064346d762bd2fbd5376c2e77de13a31a32a29b88264d44c9f27d3a97b8dc4d1267ab85b5e05c6389575d6a98fc32dea5dbc6cc1a01034a42e1a000b8f63ae720a9a7511474872a61481b7d742c5b390f28423641616d739485e4a2886938e640f1cedb7c317ad7c7d14f6ff2b6b63dc0debee1e38cb34627a6f227ee5bfbd1dc08c82ad35d5ef222bca149f9e16c7121c8e1d6e9cbfe4b640c7197d112ae305bb73e4603415a03dacfb81273f7a55e98ad541c3c66760bb17e0afa1bd7778c25c4d838f225979357d33dd2473e888a8e54bfbbc2a5420d77c56559b3f27e6ba2f73d078a503c29008fd7915dff3e7f6c86c8bc65d08bd91fa929bb81abec583a1a16bbb10c724e3fcd2f589d81eec5980b1a260c2e78f80ff2ff296d4ae9d855f30a5d519f61897b53ed2eef0ec1e27cab5b019f0832f1b1688eaa5f169c755b4cc2f3515230621deab81c3becdf607e2e345505a6e04c6cd37f463f582eb6b4ebe588996d08618b5a382969646fc7085b4c2b2850ab92a7fa7905f559c723c8981c211138100f2e6b165d61be9a9d81fb4c8aef4ebb4acca625f0695e8d45ff1d0fc8a1fb71f36ee5fac00b42876c51d6db7b42e737fc429f2a0e84b2aba3c241658431fd5296b48f8b5b4f385fbbdfb4a2050965473171ad32682c9c47c677cbc75ea987dc7e6632723516e74913955d48302c0e156fc198e2044a638a348884dc5cf1e13635ee96575646986efbda987604942bc6419a27e4ecc7509b775b344d89f1538a43b283e0c7c993f5fb162fd48a2703852c6424e02889aba2175aa3c1ea9225fd2e1cc1b88f8520079bb2e809c9cee078ba87557dbe7abcc99aeb98e189ba9eb980921785b66487cc64148cbec97208c7726b8264b881ca368a78dc556d5207e6c07e4ff0454d0f6bdda5e39a93f9c49bdc78753d1d851f116e6838c49e43a8ab77472fa04327010d8fcdb4462e4d5c1c8117f5aff6700183cf2371d62573c9312c55803eb8dca5d900f5c969a2541871e8aec9624a29b9b43411523409ccb2a067100971ad5343f8ba83e8acf8f840c39aa7baff21988ecb259aa2865235ab1fb1e094e22874239145e1dab7371f1b391d68902e84a5caf02a2628730895fbd6902de73834278dcd2775663167b3f2fcfb5b13967938b34dcc1dada434d6ebee8e5fcc1cd654c8d4eaa956c3919b0d33bbe60ae00b39930792e7f9c1dedfc38f33de083618e31dcd15e47114bcbfb407e6733fb33f90b04905ecd4710c98cbe00612662d01bcd4e0318d7ecdf0072fa0036978b81f255339ab94065cc8e94a0a8f64adaa99c83537c50e4695355bc5259a307e97b2e0c3ff0f48562b19ba8a34563aa454e9ed87f759ce911594a3c0be343019f700aa4ac4b66e8e8608f3d187e4fd15d4f814144b763526f414c7669558d0108012692eb02a7074149b7c682bc016c6d1cf262259a3abcfdbbeaf00cf8e7b2ddbef07b8eaf2b4d17edc3d974772eb7ff47409fa49689852729844d5975e9636b09f6a309b96a46c6bd31fa50483e60ae5f1a7e4444d647860ad6c2f13518af4a62b7cdeea9ea60f848708dc897a6e2e4b4ee62772db77094e0210546beebf2f669a2309009324807100e182ffdfeab2ce91b00dfa993acde3a1198dc8bd9daf98f449fb04fd8588d94693e08d3bc45f17c4ecdc040f138cc8916d2252478d3be342d5fa1f6231ef6562053e5c1463fdceee82ddbac66b0da4daf65b3013f59def8baf4f794c907dbc5b1ee493f52f549b1859584245ab1920859a808baa3e9b65d7bf4239420afa8639c8195b63902b24495b95c4143978e49843d88a92d1feed2eed1a88cd072d6d04ea26dce8ee4b14896fdb69bc7ff2971ed8ac5655148d2e9921218d74efdf17c56b533d0bb17d11e07d7458c4e34ee11c4144167a7112d11f439d71bf2ad82c8435e8a7554187c3576ea6bab4cf566c9c66e8f38a4f537dc93bd75b3620e055472f2d414c0731d4f528bab715aad0dda52fe0150c161adb9ef117746239bf3a18416a347a6945e9c394f8766edc85df408473a3882d2d93a64da5e3cade3c82fe53e6a767d089adc79aa72047cd3d18744debc587fe544ce938c8d1f67521d5024deac399a5c7c50b2310dc28e5c03049728ea590f059ae7098c9666f6834dd2a17beaf9a4ec5dc97157cd39a8cd5d0c7dba5682b6b03634257f0c9bc1d3e3f809aaa94f2354c98715a312d242a46a0f7707739e0d71910675b852365fe06a60cbcf69a27c023a1a3d878114f27d947e01a4e3e389d6460e88ed09bf37156b8d566e9e8c35914a0357998a7a2eb576e8abf709fba23acf8ccd6195aede0f41de381cca74e67e53d2d23db18a5de87bcfe482685efd2b8831b1da788dbb2a97e3ef3e7fe4e525f1f95c0878ce06833da439eb8185d1252a7dd4ac34c454f3d83efa682164d814aef7437e52adcf2216f61a76e7f8e4c400c1b45b5ceb41f78d3fd80e517d25e6e54d3703d1b20e21a24614d90e30ae64b5bddf6c537b08a2217706b5828665092f7b953d78734a2e6a14a77656b574a3b3c29453bafbff802f6504e227190bf807f2ec8fa95a1984d8d240d3640ffded856091a5e5d6bd1e119a6108c1bd813fe953bb7ef6dee2e1790f8f64b898a0cea52845d776a3b7d8727799bde4ec6b5d5e1e608ff38a3cb0b53cd1cec6f7e3b38d7a2f6cefdb764bcc9d2d66031e30bcd0a39a36f1e49d6f37eab66611a65d28b8e6ccdab3f68ee48a7b8a959edb67eadb93c708a4667b995b99abcf1b1c63bab1fe9ca5658d584f26833fc13a9c7773f95f65897d985dbb9aaa306e65c2add603122d6166f878c83b54bb7d48e9f5c49476f41ddfe2ba429fccd2c86451820726c1dd735ac0470c43509c3e5c4c5969476af15a5dee27cac5521171a91186ca87ae4b7f938d6967a9174068e72c18ee8cbbfba37a031cb095ea5ade96bb229cb007f5cab3b84687070956916c11cab0ceea61adb6ea1f909be63d73df96fbfa3a9f4b092dc974c6d7b72d4c7d85d54ca866c1bd96db96e741d637e5c63d697f81a4d99f84496ac385a1530e7e00cf3e83b1aa778c701931225ac888fd2701792fe9201239b09ef9ab48663bf00b2ef2fb7b6a502a401ceaa7c45df1e6ec3a839fbc9cf5c08797d5b31cb579761d6b0679f4bfcbd2b428806ca3969515e59b3b4b9fcebebb36dbe437aeef2b72a009e589ede96f2854b2aecb88d1070cbba9ecce1323c18c56d1a1937f71e6684b821c95a795ae8d9a41a25ed4bbac2dc6cd2491b74ac2b6601f9a70fecc2ed9787a1847b2330e950d6c279127b5190baf9b8f30ec9226bbdb2c3b3abd7c6948af4864faae5003b126889afcf23bc228ce9b79163398722f307e006b3bf11a3858838f38fc6b22746e2d691cb4de3c07bc236edc2ccc1962f89b868cead8d62b2c91f38d1ce2ff515cd13e5af00aeb2af0e9fcdd18bb90f9abeb3a1a4a821193741a3e518055deda6afa7742245053f4f5459fa3b7d57d75c303a78deb8b50f3c782dc40e7425572213fa06cd23d0b1831dcc3ca6aa84359c67b3b624e5328deaf5239b59226f7ab07e746358a2f74e75f0605abb1b267082ea88231d387edb6840ef33a117249f797a7d526aca625f4a557d1e21d726d138411f8772b88241dfe1f7548f5c2a0ea48e7d9caba4fa2b2dd48b4e80e66da0e3f4e2aacb6e26077760a5c5caf86b0f5a43dc09c537a5fc44f6f2b38251e225ae8b3754ce60537457466050fbf3ceeac31f02615d8b4c18b7421a15cd1f6ca7bf8f884c2698efd1a81b8fbbca563ae606ac576c1ea9d8c8af416c3c0958f5703e883c5b791ee36691659ccfde28994c4c7244f2ad982f5454794eefdf0564c654fcbb4970f8187b3baeee54e071d264bcf82fbab5603b04cd7429f8f62da1f229756ddeb2307558ce7ded127739cd767fc6818ddc0ae22043ba661df8d8933be47abae1e8cee145715b01d14c8972cabc64a333ca9d0eefddd16b278a0e24ebad940a1cb9d846894ccf92580768a9a89c5bfb742821a6bac443a2dd56d83b49ae49c555ce588b6d886108704fdf5a574731f3189e9f92c91f987109043dc09c0c245355ce5598394d99cbe1ccf56d20e471f2e6d31dba64175642713c469c2df2aa1ce462d85535c200437327b2ca4b9ba05fa770a606d3d4077cdea5fab544866589c932e8aaa8101dd9ed081e59209648a4231c3f5e5d7d328719e761f428f0dc00cee58d7fdc5e78f319164203e6faf0282280f2aa4c3a60cbe7ab8341235997eab923cfbc17d59afbbdfa25aee7f221536c44c6d2e63518b0139969857be91fb05396b749a29d0a57a25ccf4369a3628dc80fc4be7493e29e63581aa679c7fbb864e44c0ec5dd507190e249abb5383b3e0089f2563d7f46fda1919e8e651cb36cb4b597f3c7bef5af4f379acc13d734ceda5b5a838b1fcd3593ebfe23870fd0330ab29ee1f267807ba601ca90caa9d6a61f2d042ba49bfeae020f414f26c9d97430826bbe8c00793c5ee9e2de24d5a82c97a6f637d11c62d0b5a46ff98c715699ecce0674deb369593f96e99d678333c9096f3a905aca7f0476539109ff30cf09073e75e930a6d73c11b1e7b7dcddfde53e30d81c87cce0b00bc4ad66c82ecd2c4979c207ca014b4c9ce1e513cb0890e9ff90d6c5a04b0a3e3d9ecefa2f92d76a7928f5b4f3ed4df1a8cfe9997c2f743b12373e72ec6e8714d489f9ac7b85762b61f214daf4926693fc22fe3136782f453fce180bb45edd9c982f3864f62e31d7c780296015171d9a618329c3430b4b6e50fd6a774042973c5135920ae6b690d674793b2e9ea4fb6f9f9a7437e911501d0b6b3ea0d8433a5ec646108794441b903086532cd76387787e0ee67571b2c4bc3ac19b6dc4895069c008b8c148015b6ec24f7842087a491ec6888766231531b2a3a68ac64b3b61c5072394a14a14d7d6f47bb2587811c9c93eaf60f046631e670fc31193b781f3d96340ac0fe1a617318cb30956705190e2af2c78fc24c3144345c03bbc4e84900f9c0706f456dfa4e8539e8624386125cfe1a6d873035e9aae0f440d2a596cbfce791fac36f1e6056111e530aa186a10fa9cc6863b2c5c381033f791c31f61097fc331a6bffae4c2068e2f10d15894dac9a8348c3ee7e476d17a82ce70ea8af48842e4fa75b900643e91252c7f3f060aa6cc97f2627b1edd59ac8dcc1a000f0a52bee1b24276637270e46f8e9d16e928f8d197be913233f41091bf94a7aa19d345ffcfd60d783474064db43e142564bc2780ddfab2524b435ff0c12d0130d0d6c9cc576cbe089cf367959c42cab4a04f9b9f11adad248d53ac933a9f0eda5b9b47ef217e3c6ec376fb84d1a4a90bc568bbf6dbe06af022ab6040d3f3b8f0e2aa252ed41371f2d0852ae1f86c9872fa90f14fe19ad0fe32d4e4c03430e5b98f8ccd52183444dceca85c76bca07e30674ea570cee3c995e4549fdb045e7f7e88c8a52397e89d733e68f909c24a458e352a3d2248c33dfe60b5f858ec866d87f5e61768f6376400ef4c6963b571d4d48cac222df7431282cf7e590193ae971cff6e8aebe02981cb26dd144c3b1e134a935dbc59856a31675938299ca2e1e585cee96672fbc7dd1c0ca1638bfc58ea3773c4736e974182f5256acff2c0243f0989df12c6ef185e3bc922bceaa22741e5536ab033d8ceed765c9cb5cb96818df258d6f8af6524ed6f84e8882fd293009a5cd5d971ed1b5b30255742efcbffb78664587ff405f473026579302336a50f9fb68f58f08130b26ca921de2508a6a50ed5ec0f5f768fd63a955f1a8e7664563c882093783a13dc720f85f136f57f40d1d31b10b661fd00603c22b0383ad9beb8fa0ef4d1c0cebf8a8008e3eb39916e19856beac26d47d7bb814859e8290a2d5d36e3e1c2bc6945fc24341d0a7de5182c1366064b437445958d5b7c68eb018c716126c415d6ea550f2290055b68812753a694ca198a8c313488e3837e29c6c43da6600490b55bd60da3a404a8a36f81d6667c9ff3eb9882e19966d5f38b5fbb092b1809fc02c3b23ccef983b7d5b710fd7aa6eea20e9f22e4e86eda8eb8d65b1d18d63b20642bd0e5cc16e851a75fba100a9a1def9aa9f8859e82fa1959338bc0962302c6849a184fc4839c3ec171695640e1969f38bfec0ce32b9d5a157c323bcd85c6b4091872c4dfc90846caf404184202bf7d8fe7e6c0deef2b1b95bb3ad6e486efb39caec68a456f93316bf1739e38850250482bceebb8590c2280f78ad903aee58be562fcea1dfda4c64b6f9e304bf3c6df0a938cd398eea8377f390a8c548410048b3efc2c8ffca5ce13766d16a2d272f37e2609c0a73868243a88a237fc90d9e6374aae98c5f3fd126a0fc89767ad70544bec2bfc0dbeb2b058ec3a21265aa6f8908dfb76e46a1457f94097fdbf0927ca1aeddbcef108efa2826dba93f86be0033f0fc90d17e952686713c28ed470ff1d9332027d7b9f88c35f140ad59a4af0cfebd802a684f91f0c5d903193ce6960145dc28652d50ae3db98e8132f357f3c243df18c895321e30a83becc53d57db27921a5519524d16ab2d4f1bbe9f1932ecadd6151feadea062b80a57c180f325d1286e4498e937d840fbc38eb4af50d2d887230374dbadbf037fd4d2728a713c9a835865884479598bbf7c48c9b6a75a028a46628bda17c09f6a1bfb6ccc3a55f02d59365c16ba1107f2e9e84257754f1701d0c0b978b55ba2f1502124c8c7285ea0f14578b2529532109ccbd2d45308729822ac7249fef69ac001e21f02901a4268b10182b9db6c9692f581dfefc94ca1b7ec646a906d180330b1ccd00c2da257ff08f8fe9fdcfda2149498edfc305220db7ea6f71e783658dde03fdc381866ebde799a40c6afdee0ffea8f717c20df7c8d59d2ac36b8e828220db99828c8ce9a817373fde0ec76dfdf77c3fef2233b11581e85fe6b9793dd979ac88850b74fd07297048a511b5bfb1dccd50af0bffb8ba63d1f623fbcc005c937fb41427c711a4c44da7aa9b4f4cf354a4119fa4fa757f2263d8c2561032d1135b0477070b8f4591d44535d21e7d8d07086a0616ab4e2e66a3eb0bf4cc3a01a44960f5d5cbdeb3370f088de1a9b8459e01432e889bac8dd99b1845fd8882b4ec50b0d8b68c66b65f06d9fcee7866e5c197845d2350f866215248ba99cc71b19378dc66d4d88f15b1c0a1c82214f03317d316dc0f54987fe6d061b0ee216fc242c9cde85736c19ad445463aa404bcf849bcdff3732ff6a0d11e4c70270ee4ada14c69a5672f640b719db29a9dd034fbfe5ac8e9776778938943f2426a1c383b570899e72a4ae0312fd1cb303401bf06dfb6b9084586881fb7473a6ddfd1d4340d0546f4cb0f9dd4b7e77b43921ec4df94d79b9602148d0b03330b3bb0b81e606a4c5616700604bcb0eaa81ddeafad4fc4c654dcd997ef20140e4ff202567f8717e4b39242b87bb0c3df3c04413de11e1789ce22f099152693e0eddb00356070bbd543b368ac6b7a98d01e41e34fc814372aefb06fa169e527b1cd3ecfdc27e4ff28f0c00a6a3de0d6c4361ceb6dcaf9c9b0a1cd7f385224798ad7639ad33eab8be4a000527b57ab26c46cdc811f4f947824cbc248e438ad3172f39187a30b8d06113dbc666623a32fd7a8cbcfeebfaee98d55d8f1308346f6720912bed3f85218b8ae3d6eb3078f9a05d22ffa61820fc7f32654a2a19cb87091012c68eb6bc16ae0dbc893eb6d380e56d2512d01007fb85f288185c1e9ca48d7c328ad73cea3a491aca8fc95bc6734d390798e54a2c664d742a6bf17d346264c374eb4f488c06ed30923d3395ce2b483f5ef45e4ceab75665c0a7b2bc3f2b1f946e5a6f601e06eafda833d5fb571356fe7fa7b39edf890115ff6df861f9892e5d637aaffa1cb4f2c070e64902fde5f9d4fe358d968735fe231b213af50fe7118d08ae999d048b753780d705332f0db1716f3034ea5e58ae0bb86402ebfedf49b1d278b4bf6214f2b16c78931266e51e5226fa5200e15b913e5ba8e8cd32cc675a356b79d7b1cbebcc786d5b17321680d5da265d50acd938498952450f3858dae4c5e9518c702ac0e74907f5b81d1c999aed36cf700d3c03aba602b0289bef24fff894e43429ac32a062fadb7b8451c90fc49e10e5af0e93d3464ca2bfca09c5fa41d0aa755aea81763a8884e814708fb314deda07fecb696efe62a52b4f334e62263f0ca660406dd754637a7429d35e13427b837d78fce4cd23172ff197f61ed63a32936df6683852250e24a64104c4aed1f695acaa1da67c48ccbba930bcc7a4e25dc73269ac715540db3c05068f53f447d2992c0e981f0af3e5d0c8a611c98cb303207a5687b98f2c6d0906d6dd7c621881f6521306cee7a904f7c6647fa4cc20d537cc29a4713e4c4614222e79bea6c89745d553e42690dcaca938f860ea01b05665ae7f6d290124c8f5fd99de8b00dc84f02c4dbac6a5034f5d76de6ff9bbe5e94277b46c51664a9816ef9586722ec8dd9dbd7cf52f72b15f9d2682e76459460046de650c7aec22161f7eae0c047f2203970f4e1db1b86b7fd0ce9281aa78355dfb38fdd815f14fe548213fd9a2705c8984985dbf0db49602a0c569a94c874834c82e0b49b3142868498de779dcb0ecf1eeff08338415c59a85a194d8bb150337461409fbc2c340219c0b215723af67bf2e99fa25c54a7ea9e7e9809a868fdae7ed817648c59d2b93b83f7a0c17ca3153dbff8ff031c125a34003d9593f76539936fceccb5bf05f5106816e1319affe426fa6564d6a286f394696fbbf3656e1fdbafcb9fdc66b3fcc3f7759d6b9bf132d6214c977cede9fbe341954170bb02a67d1f77a5ac57c5187ab87d9f1787604575bc17619e0525bb4c0e19f0b3000818a2483aa5ca99248e5d3496aedc6736672a532d8ae4f3207bf55a6290643c68bb71b07d69e134b6a996f2299162425add1d6ff6daf5bec48306acd8e92b780ad813e1a6b7973165b04a7a9c115220b4f27797da197a6ef71aa88de3c2aebbd6b6af631f58949718eaa45559f654092ced6054410e1a0ca3890284ebe5980db49f6ebc4e14816eb7a0c90ac6080f06aa15ff2d93827e9faf193e1958188f768cd978769db206bf291be4214d0e2c1e16b47daa383d4e2f030f81d492243bff46adf41873fcca9158a01b2355d2525a58100153990731c587b6f63e01d146afca630a2b37b876ec2b7a9697451a2ac05871b4b11ca8cf672355c2de0ee6558f0043e43653afb1d88aef7e0587af5c5bff21be4b2ae7d120bf33103c1f2d13a5d095a7c12ea9245e5d49fbf582598f30336746a92c8ddff5439906e19e6c25fb23a07e55306e77858cce34f09edf6b49dd8a74548862a0f097cfcc54f16c3699dfad8f79c1c5515600c7527d430b9aade6d371d3a82ebd18a31d8b1d82f5ec85ee0402b549775ad79f7b7c25d9a3c164348a65aef2b9dd7550cb6bc5b7cfefc936ed0091304d3b125234db6fc8708b77b1f7786ed0cba910842093d3fac1e86da1b0b196de0c9c0f023897e3793a9ded4361d09aa92bc9f028652ccfb2947f7716943c4bbc7f24d595d1d70952c9a2ced41298bae4a2e41d25e35d4246105bf17ce2c938306d7c6cf544c36abce440224b50f657ebf8a2a061df4fb320fd25e2bde382e6a39d4cdc08dc858d20551ff2906412f825f5ad80c6a429aaa7238453c0dc8ddc7ed83b2db8e042fae4e2e8458b961525fa60aac53b7914af434a214b6d1812a227e6f168eb97253a72544324242d2766d2034478a7a5384b5c39a3d2acde3ac1088f17958b4a53d43072d79643736f4415a421a0f471bc055ab9b3f065752cc0879b55ba7f42f75088064da3d0ae16462b0ce9450925c966a692f9ae802611270ed152e1afc43737e1d64c53b32743f57d03456fce0986f5a68c1c13e539117f04fab711031b3b10a2ac7dafd4261fd77151dd272b641c3ac36ec5287df6534fd1de2b53638e2c63354e88be1bf2d27670bd58740880b2bd65029bf42ea4001fdc4557aeb76432b90184148971d5835ae3105e5f4da37107f50e477fe18d3f788ff7e22ae7e674986e18c916bc155b09301299efe216819fd95b70d17ff739e051bb75cfdb5c1b8be4d0516fe6fb810dc18bae2caf21090d7bb1bff3ee2b16e18b5bb8a67c0e4e17cb76519cd5cf1deefc43481e9d0b31da42d8dcec1871fd03a39d52b6b04336c68bd074a373d959324b020dce921e238d95976ec4e31016cd024aec076044fb1f8ca75f8ea6605b63158fa54377a004aedeb71d8339528ac7102a2da2755ac4aa37c2bd6558ae4b08c1b3b98535daffc584019332017d81793504be8ed5cbb9f0f2eb342e700952aab936f19db214395bef3a75d923da226cdaa146d36adf047826e86cf3d6ba98d064e0f492d896ddf7862d6e7e86b1962765ca6e7a1ae0caca3c820fbb720944022a786b6c8ea71122b3a1242b144a05324045de8acf14366f9a81c28f2c3d7ec973c8fd34bb90fd63de5d3fe7b4ec9616d1da3d0b70c56deeaaad2f76eca070aba79653f1499acb426d2a68bb4ee1715a82533406e5399acfd3cefe789a783f322eab14ab1f0aa047c9d047adcb6fbf86ba776a8116b8e39b7cabd79d1e0e16e671cfe96a252ba7fb5a1783c811dfa823e00d8887eb8c70d90f0d60ee60aa1b4ed6c97a37434405e588c7c411097953b85ede351d4cfc6a11f3bc4472489476f2c6636e19619ce58ebca7b4929b84e9cd9bb21a4d214ff9cc90802931bf13505aaa636e19677c6d7c5c80f952b04a91eaff50de1e52ce44904e21b834ab70d10fe892213e3d2cc539d21a3b592e117498f2822a99c7c174e895669882f6f42098eab83090ccf4164d843d23b0ff22b95edc0ea6c46870b059cd18712386e4667d169d4217fa1c883edcb1585e09c589c525bdf9a91e22216d5effed20458bca47d60800dcb0eb4296403d836b36410c543557cc50cf20efabb0e3b2801930757d91c311e6d7aa6ddc1aab4ce06ce0699375a4c6bf +0xda81f8b846337c2dbf86c1818305516dcf50b6bd9e7b4b91312bcd32ee8e0736e869ec791043a7c67bb853a70f4a9f84 +87352 +0xe3c137117f3738282f808dd94aec5699fa4938483507f46eee9a3fc48c20cef69b44b0a7c162e0b5f4ec1bbfeb0cefe5d28a15cf42f100f170edb60da5f8dff9ee351ba2149c9951ce58e62d366d02027a9eb940d48e3047bc25bfe15c35fe10445e230b5f2f8b83258d962a1359b876584dcda2d227adf7380a0149992155c405856ee98a61ddd36254d4bf6a1639cbd65ff9fe23049f894e63254c4402099c9973a4447c7bb8c9eb7348f323edac885b9be45bb16d2d8565fad2f34521452168f06e241fc443ee29b299ce262639364eca37c163aa7f74e495b14584c62fd9dbc474925a86a7c984db6f585b090a5c19b499392102bede35fd694ae939ef4e58b65d9515070be365b4749aabde44822321b3c9d3bf1249bffaa30a5dc1ae08488fd136389198c232074e9bfcec1231d4d92d7c6127a23fea54078ec6a7948e14177a7cac6a75f0559aa563387c9aef94a3ae57b48397471ed23cdd0e34c8672216fd6f57daccf5343522fb45d60447cb49de64b21a18eac33debff1bad731edc540517222bc25739a26c6a0d4279bee19166aa44364eae415dbbfdd75dbc38a998387df5a381a0caa82cb8760821de3e44ee31531d611e01fa55de288bcc3ff0ac3ea8b98c3157510e0aee6a6f232e4b2a1d02c51878bf69dc60aaf87ecabb1b56c0a0542cf905359dad13d0c0a7366e0a9c24846fbb1be2ca85692e7fdf32915f666eb0cc0231de1dbe2f8f44d77f10ad129f766a53b9d58e6c24b2d6332eba8fd719b4b37463b456e44b9140d9909adc287c85516821a8eebce36ccbed36feadbca9472b76241f0fc86dbdffd5f1725d86c2986b21dcc5b31eac44a636d3c583bc27537a30fa871212a0fbc8f42b02f8d3799601a77192a5398922ae358b77d7809abfe9cb70542569e933e25dc5b177b8a9695b2268798bb681ee2c13e97c72af0a73c06f0bee1175524d963a47e6a0dc5bf8c1b94ae02e3c9c9068f7723c1cf27f56474355bd9ddfe2322cb03a0b3de8972b7b949d315774e3f0aa0ab0209cf10252c670d52a934fa1c8ece92587148363ead0dcecd3cc055df63a732a8ebc539a4e841d139bb96c98f81d0d90c2ee56c91d0ab9bc2e5699138b5f5b68ef42c15033ca739879d9dfceab094303249208d0ac6f5297aabcd50b9563eaf3acf7e22be7e09aeb2db94f4bc7f6b40715ca42807f48d004afc8634ffd8c47522ba35f33530eb9941d226518352d8823fd5cace27fdc5a8ca540ebe7ac239b0dd60edf705f9cf91cb3dbc93cdef6e6e04411edfd927519b5f4ed14d9896f0dad14ff0bebf4d1810a56ae22bfa998f6c552b1aedaa159350a0497872f7bbac6b94c408babf8f67ae66d6119aa7d5de25a8f04967f95d1d5103e05ecf16c4aeeb9e89706b855530b3962bd5504448bcf2764d14ef6542521510801ea254369ac354fcd241bf1305d899c8a7fd5e56be7b537e27d47c89d4254cb5129d5e85d28b6e9aa8edbb6d5976183903e264845528b71fdcc78d78160a1f0be5208426e8bc31ef5ec008a89e2467f963bfe556138317bebe3936b18a2c1dd100dc73be6fde55678e593579666c2f8661d65f406c030bb74699f6bab313bfc0f0119ba0ba5a3f9f9229a04424a5c56c68d630d7e120f9b5f07a5bf823597b483d706a827ac856f414b2079d6b79d017f3301880f5756827664ac4fe5d55e6c333696eb8039132018072a9e99d40b6259b6464d02b78ed87f29bc031c39178ee8c7d26c5e75d67545fec25bd5ca30df1bbf3b449f593e0443fdddc36e8a4a816a32c1130b8855d492d9ef98d0c094e18ff5e6562d66ee708a89187725f07fad811e6bc9ce9918a6c540ba3dd4dfbdd17b015169f60526831c74740787923f7af533d974eed0a854a7da2932274e3515a88a8466405f6fa5c067fa5bdd9911508d1a12fdb4568c440050475f11368417de398536549c503e400ab15b6e2c7e97127b1e4d68534ce0984919acdcbf303de4b65ebf7ae352b66204a1f084740db74dfd064b52ee718f366ea902ce10c3f184a817ebf95cfb76effed200659946180349d1deb95082b8a467fe473152c59a84b7b6a11b30d6e4ae9f4d745ac2b122ff0787f0e7a107c5a8db20654bacbc9fad8c45c92687686969901935ab17d73e08de31682208891d0b7318426547326ac7cfcb4a63883b6ee6783e2aa0c13fd2e576d62db3ad8f2894d6edc8c64bae629a28510e1a5cd659ee00c53a81e871485f787e29e2b9a14e0daca7ddb8dfb9efed3ddefc932ac19349d0b54f95b3f6063e8c3143f65447f73c9f4f6b812bda798ab97afc151b8585bf8f1650254b55764a59f86339a50a8beb55eb596a58996837422df6e957a99618e5f02479d816fe4a88da71f1d57172e076868fbb8e7e25bd8000d25805b52d1b7c4cb5d981c20808c0e056670b0514e4ab25f5bcf41216e41dfa78a84e31b492f931ea8d6ee0fb4aaa11f8e3704cdabe9cd273b5b3dca473be24d12159a6924307a8abdcc8f83fd9ee7540ac2cd02a38f094f1edf26437340d84c30d4f9c2ff64cb8e010b7923c7d3314160c66196d184f7457adda3338edb22537b25799f3757069716f62375afd21f7634947ad0c2763788d3d93d00d67550c165a9a2746871cc34742f26e012361250dacf6166d2dd1aa7be544c3206a9d43464b3fcd90f3f8cf48d08ec099b59ba6fe7d9bdcfaf244120aed1695d8be32d1b1cd6f143982ab945d635fb48a7c76831c0460851a3d62b7209c30cd9c2abdbe3d2a5282a9fcde1a6f418dd23c409bc351896b9b34d7d3a1a63bbaf3d677e612d4a80fa14829386a64b33fa217c9b26e8453e4a6b28940d88512de90ed6d54d65d91cff97fd0628b26019dad84de628d9dabf42cfb195165a369c22b49d4b012c02bb910b4bb03859b73d07ae949532683d9c3b7774fad4fea888e4c5274a1cce5bff67050b0c461ad510091afd02e44202578ce8ef5fd9e41b66b7b7015d00eb494ada1bc784d2643e2547b3f3c9bec5bd63bfaa8d1e85a8f3d81410b7ee4df15f407295fdb45dc446ff5bfff5441281c3636c12dad178cbe63f7258b788648f0252c92a0a0548c9a400be559e2c9ff4b8b8eae854f313cb571f5b058cb5e4f2d704364e991233d2c9dbd76b4acda7ad11e6e46187fdf705caea568da3f13ffb41d7425a1745af7e2ce33f9787c1d9f9437fc134f07c9329b642dd7799b4e5d6d74e95f2f12a1c2a41a96f60c183a787d1e609c90ae96895ad9b5859ea9b67340bdc799fd339ea75acb0ef5da48d80d741ac369443bef7e815766f9af2ff448163f395c729efcadec27c27f49d69f6462744d03d4777b17f82467bb16f6afe4d543652ff61d61dd4277db1bc18839872d7525f1a62ae35ea788e15339c690506711739af176763d45028052aa284b7ebf6274bb241bce5b77cdfc4a82673f93b2f18c25cb72e2d8db12daab6d7c804ffe8661eab514e5154e39df2658a063b5a02bd859edd94db3eded11ae704d7d04d4281505c0dbd0941616b372223aa4bf18067ebdbd7361d864dc4ce31c62eda5288fb794af3a36e0b5aa9fb34afeacb801cba6daa408c34e2627b3d3d9857638e104701fe9f6bf02153ecc7337b120a845c37a360b5f1e1d1d166f05107cc0c7e9cf682fd6da14011c196239511eab97cb331f5b5841184e2ff1a801271074592738c64bdeaddde5b485888e000cf38e7b66c0d1f57659e746ff855088093af78387b3fc6936c1b6c4c866f9ac42a0943da3831e48c68af349892f79992fb9a8e50356c9df3e697d332b2502bd895bb2f93190ccbbf9537720d7ce04c44a9a7435f5d83aa88d7d42ebf6ed319ba9ccef97591063b4d65b7db331897a702184635ba560d72ceba40bd371e50fae6a9a53ff632b699d264b0ceadf8862047d207e405b1729d42086e2d3e436235f946de61a970868ddb1ca2dad28f444ea2616ccca5f24b706f3ccced39607f514eeefb1ce3cd0e7dc3f81e7e456f5a889e40d55e2f8b0092b2e1ed8bbd0810e3641c6bb049caa6f0298184277afb217497fae227170e3a8ac97230673daccf52e559a0ca5fdbf87b78336464e7c541992bea03a5d0de41beff78462e4fc0f3263f214ad97a837b763ca83fc51040234cc6a8ba69018dcea5e15e9f4f47e734e3ce0dba5c4e539876e33a96b6991e5f25f4b196cf0d8f29e60bbf8c38ca71fd023e698fc12fced8040874d9b7c6925dab429f09667974fbe5caf5cd795c03b407fcef3bb6b347c29418d1a9573d5e97431ccb82bdc9b1ad2bcbabb38f511f127b75e93e9b6d60e0ada0fb560371d59493ffc1a34362e7c63e7a4beef96e2670c355f218edb2acaac71d3c904af899ee04780bdb85f969df845350c025e7bc577609844b3c178d99670a3fc8ac261e0c1af214bbf3e1ba4193e354e7c372334f0a0d3a55e520863503d45f6f95aec4675e0a76952bb07ba4e3a6b2b620824dc005dd6ec9a75218f63428160595e73f98343dac177bea00620a1a04cbeb9c4e42eff6ac06c120d8556e521e2b3b53e21733f81fb382f30b116db9c5897314c7403ee57c9de12126eb190eb230e4995e4ce3b66bf9df6fde2b95027f8f65a04b6069365b0f75b7972fdaaa9cc7201c06d1ba14fb3adfc50c28f6909d4e21b33d0bf545c1dbfd68ab8c19b2184e7c506e2e2d8058270277079228c0993635c22eab69a03b73f6b8c6985ca1cf4767db16cac4850d2ee60a72efa22f1dd81051a2d74ce23277e03c9acd2a161c426110732ff59f74c30903b099d94875c45ff61c080568414848487aa2e87ba9b006a515d6673c4973d9d7533954894b5b6303fcc629cee275ad80f8a24e4ed210a6ed61466fe7d5b1d719dd46aa8df93dd81fe79a306290807e5a9753921c3ff4e06e0808962eb42d9f2fb13a21b329cc0dae5eecafefc5e93959c93f7a404ddd41bb5c85607d6f2780ad619c708537869243b545feb31d207ce320be5d67862a2939e165556061302a0780e60d90bd0e04549d2ea358e0b6a7ab1068b1fe637c258e38f0fb5424e809b2719f6f5224c2b275791f443dcb2c48062ab72e818043c50cc5d0b8d534bf9e52c6210c4609354b0acb9047fe26e1ec88d232197d4701665a1a8d14702b17565cf1236ae8d4e63ca9271a3506ae87f3a7a952096e3235a7ea997ea491528fc035751f11b70245e5c4fe1581e3ac7efbe702af84b0dc610822d53ddfd545a97a70e46c773d2be4f4e2c32ab521cb4763cb90a302019013e5b750432ca89ec4d393a1a421e7bc33d88718c2452d5571d9c9b5c507bd17beef0c9d072177a8927a124f4ea8433dc31f166164c873057ebc65f49e1c6fbdd272971e2244ef0d72bc714fd460ec2b1327353f9aa59f45de9a24cf86a6860cef2eeb460d0d6b37e6394515dde22efe948f57f5cc731e8101d19ac9173c9c8f75627dc73ff178b27d7ee253b3a2a832d7b6033682975d6199111c53e8451fbff5bbc2f423779407a8ebfd6bfe38c4724d49ab7455a8f841f4d73e1252668c0900995f6f60364991e90edad1360b200775a8c531ae2e5bacb5728466ee076e04f699b78b6e84060bce561f25c390279cd161e4f0f47e142c5b9173c423be324e682b4ffab70755bfb9604edc5f7e679cf0e39f24e13e9e3b47b270dc9be1751fd5cc9d1fc226b5384a9bde67321c5c7254cc385fccd676440a342ff2af17b323b00c337d2868a0ffe297324913f062c76d8a65044fec28e123b4f5c8e5c758e4975887955253b59121b10f045d913706ab8c89b4c2d6229d24a356a1c886e2ccec302dfac86e4f768897b92b778535baaf613ae3ce2affd28d9de72fdfccfd573f317b10032efb2a77a9c5211a32eb4de9a6dd03da611d1baef31bb5840fe51e00cb13678afc25277f75b7778e30c45aeaac04b77fff06e3394168f56dd6568bc16b7b73d87c79f8207a04b16bf55d4c030f3651178b49d39d075341f5a6ae2b01a117c764164616db2531413bf712abf33ee673396c52474ac36f3da3f7786631ea7cd4c66035fe3005c1b976bc90f51bc999907e38bcb8e2f4214af15f31d7e2d61f2e77d0b628afaa3a8c94cc34b1ed2dc42b2e66f5c2c627fdfc762466fa84c27326e0ee4320aa71103d1e9c8a5cf7d9fab5f27d79df94bd69c4ab1d7448a85e1d70aa2f5970c108c73d8ca41e60cc5ca1d342f2c589af42f9260871064cbdf7727e2c0a859383bfd41067894d67cb345de5985d753ba65730a2f6e58971463d16b1ff0643f35324db6827a2b3dc84ef836f7b13e57ffa5884ce2ed17a40d17d7eae8ba9212acfd621875586ce3989fcb6f363ccb2b11bb58a09f8db6545d0572ee66a7989a44a226af069bc19092aca7d03dade59999b2ca4e8ed49b6fad3588bdc03edf9fa62b80c55eca910b617f72a0358cf3673f8fc59dd94c2fbda4ad02a01f07cfe9799f57a0a46d431dab20162845625f5eaa5c33d7a57dda05eb77c9dfab8bd03f66079589010d418e199579b096b590468321fb421dee0511299bc4c28b514b6b156a21c89d31f22652e8857f5010eee771e40526662716a7071fda91e8e2a6332dd0e3a59f61beacff2120df9af8e1081daf39cdabb077902d0df593e9c44b605742c3682f250deac74634169cf7d1732e897f7e12128e94426cfc11b781a0ba3ac6a958770647a65361a86d7f9426ee4d7bbf80c3d4c57aef45d65379a10f087f677dbe9c8bd4a94a79642c6b584842228be11ce77e830cdb9f6da158aaff14cd2a27e2c93d1dbb5597509b87c9a03754c3cd9aa6982f10ae82a8437c26d8a4cd198f0c24a288a31cc25402fc7194948c2b6b4227ab334f12f76f800c9c0181263b9e84d5447e2b460258a8f1d88d2371caa45b933ef691ad04aaa23195e47381983a9105ab68197c5f44d68f84f4aaaca85e2f11dae09d27b441ef1298e84186394c7ddc5dac3665e200d4feff2ff2e4cd8204ca06593d290c1db0d82d75b5dc25bd8e81e4b44aaa9274ea65d1a8c3c242f923e64ac9375b16242caadcf3952c64730d1dc8e61df2788960ec80c5e4ee0ea9d48c2e985464d93fadb12ecaaa1dff5842d78fac76e69a257dbd96f01f0f397c5fe43b2e5ced5d577914aa63bc58fd5374d8c36d1f2d02318afd9b903acdcc590b17f8f4179dab52d9fcd9249384664bec47eb90de70b896cfd7150cfed2ce27214dee504d1dca1a15914176f64a432af34d907f7c57c23a94718ece33c347d0e9ada3abc514c29575fa6cc2ae529bd7cf1239a1c1892a0721f38d3da14b3f3bab60a16e482b9cad4160e26e8443763ac8bd6e5e74aff8e4bd869bc10f10bf50af8e70ff9e0a5f49c0ea29e43dc6dc3b2877b81e5f7032b8b2523fc247bacef73c5d96c88f5813503bc1cb8aa482d6c235679d494875e26d467e01a80ff275189cf89d2fe3bdc0acfa0c50ca80206bb739b6a747f8660feac23269dc3060bb9b15850d9e61e36f4445f43e0b9847a4027a8b5e8137eac2176e9800c472aba868f02d6c7cd26f280064a11fb4b5a0878b410f495dcca902dc91d54dc99c7b446875174431fe0cf1c89e3a7a2f9fd21f3bd569f044814cd7217414d853787a9881eb6c1c25ad60d4843de8d8e31e8671f880c2db9f1c7b49ce607b2acbcc4eab9c9c537dc0a713d81c87d2c038fa6487ab884293d466dd61cb9b32ca97619f85a2cef5ee6ab3ce0578c521ba96fa13683d36109f4d271b26006d624021ff162f79ca79f78b9b3964813efc4e65e83c1c94d255877027dca156203315d06d5ab00bd808208b25fbfc1d3c8c050d8a86ac9aa438d4a72dc9d8b3fbccd00b7514103e3fcaf2d21abcd63505f866f6a89a1f35f3e20d59038ad5014556f93cddec58fc49e6f4c84126f8b2e269fa890c1f7d4f097bbaed6fc6a02647f819ca6e898f2c3c85afd564df6c7a1b07472c7dbececf2c2a63cd3a253f0c49dbb71df094bdb661cea962498f3a77f8f9d748c21f1b9da51791602c51bc9992265b9d2bb4ea8100ea6cd5b9df688fc1683246a4e96ba1bc6bcb0e0cef1eb76c028db2e7921f77610080987c7600acbd7bde8cebc5c7c3b84e9a3fa4aa6e4d1d97d6c4ebd6647fcb396b115afe09b5355b65845f5a36ebe3e7855bba27b342ee0cbd3b0027bf8188bdb7aa1b1c8c92712f4f95c751c001835f14ca1711f580278acb7fee2d3a66deb3ebca867a902bb9202226ed516dede1ddcff5830e3dee103886f87d91dc14164390d865c01d68555668a197034697458a3f42c5c69274f13f780e74fbad7477972d3e7e963b318cf8a86d8e0e52e7f68eeb1aa7e3fcfa11c6292a9d12b66e4bd44a6399a2f36ea82f6bf29a1c9ac63e105be6ef0a8368b9f620b2be7ffeebd82570af808f4c07ef22389882d2241a6338180c66e530a631f7e510a0ea8dd168b0258afa034fe4aafa97c710dafacdae2fa9f6d41c0a9dc1f000aa0bf96c0a419df45ccea603ed20de10e70adc24c5671d960a01571933b109faeac757a27cab15628dc522700b9bf72c60397fa8ecd62a68b2b43d6651486c59379baa3711f040f985a71c9e24616c729a656c9028437ca655b776f8e0cf3ea8f8509b34af574540ad3c3f9621bb666bfe564be463f53ed85ad0abd8c68eaa6c97aed1a040274cbf6b4b305febf10d9df2d3c3aa843596872bc8840cedcdd52f7b7df583aba97fff289e9a01684b8892dfa67cec734bac3a2f66a89e3bd4ea780c85aee6d82504874dfb2385821100d22e951fb1187fa979ce74c0959aea0fd0b28ea5d0afe203df402b73f2208a9ce3456954025b18b5cc70b873faf1596cbed55f8149182aa5906bf633502aff854f8ee9c2e62460f7bc7dfc6ad427672bcaddc1eb59fb43112135230ba787b8e29e6fdf12655b9d98d05d064c2b265d717c327c8b094076701a057ca20021fddc565211eb87e818bf91799ec208d583695d3c580860cf0bea0445c7a162df169b019e49f655b3199585378e74721c2038f4641d0b66904aa6665ccdafd6a94a4626bb4ddbd6a4e84236009d0971e37d09c910923b246c7bcdc8b256756367e3064e11e54112a4cced2c3d922a0d12e30265a98041a149e586b2af2a9b110127020008dbd012990fbfed54367e4f92984b4f98afc4e611d1faadbb10c8e8605f63c408f631dd6df7df03af51ae3e49e40d0f44e76df9aa8751403ed1a4f16ad2502279fd0c7b06cd75f6b4ab61e22011702e14f0e4e4fe4fb2f4a035d83308caf2a3c3b908f54ed8ab4ccd0b4044ff669b337291d0aff371455049040cb6238d70ce4ef2ce522b62a78f613af26bcf2ab7a6c594d960733434dca106e783a164f32c826f069a87b19146d701205f76a6eb1074bfa80165e2a420110312a16c97a343c8fa57d6490e92fa99267229de2260f8e9dbe599b0c1bfa5ffc235186a6ea79e8659690d59c1d2320e718fd0ede53de68baf38313e1aadf2d40cf7f1853128c22555e5479f1278769eac205c8d39ab62c20547d0f634968ff9a90033a3274d390eb6738c0249ac4eb19dccd6a564d2f5f6a3bd7ec059a105d461f9e6ae993f8aa844bae56dad9843af0e3c451dafd9268f52404384cff6dbcffc8a138dcf253d5ac76359c58761dc01c518b1dd62e97ef5da78282adfbe9951415ac1281128da8e0615f1f31f32a20d8a0723ccc5298491030f349bd121c8c1f912f867a770eaabca79b4dfbd311c3c27b1a1d420c2c0c995aa70bded46ef89ec59c032d824f519db37aa71a986d2f662bf36dcbadbba0657f4e2797b569610e2d82271ee6d813f01f6db922a5a4ca405d9e7cddc9dfbb1129294b8c27845bea337250c2f721887045e50288ad513acd6a6be8dce300a308e2f8e600bd585fbf61dd2ebe45c4158ab18101c0f1eae789ecfc205d8bb6fed9371d65a9e94dd2fa5322ff75452851abfcc2357025ea56e24fbfb1d4266b34ee900768fc3dfd6c2761f4716c97d6a36092192c0abbc81f832d372be535b5dbd578576e6c2dbf61d328c1f3189047a124ec0643e5161c87d8eff2ece54bff5a1a7a8dc46e2b2c8a6a120c131dd103d175951a1bb3d740565012637368dbd03629f10b2996c8cd1c68a8434fc0dc93aadf17b511eb81ebd1753f096df467a1068086600c6a8909be5b660807c6156f93ddde67d4f08877afd4c0752b0c721a31aa951ccb5dee7ad6cee5bae9721e0022de63b2d3575d6c37eb410739057d845e24c7a204e56b88fc1f81dc437948edee7d42267ba4934210252b6026940c77d27b7880379572cca4e9c4fcd43038914d16f4235c5cac81bf1ef9e0622c818d352b3247e1e2b6be57aa499cea3b6f82c557e449e3f42bb39b4537387a338f0cfc908f69725189c68acd6a2d13ff504aedacbcfab0ef73403b146db8ed4d87afaf57ea5587667e8db4efc13ddff08d523c81c8c621b325c0251907e219defdbdb3edddac9f96076c7c7dc93fbcb369213863a23cd4e3a5abdfcf8064be6c73efb0dec3cf1974a6fb47f3fcb328bc964047eed3bf48f5957bc1b48181197a6c9e0c87474d8366ffa28deec628a2707728017fc7cddc7d57b8814465f7d98d5a414d93d2986bf1540ad4cad010b8739e50eb9319092dcf7eda851bb8096d19cf81fa60f04041b8568ca314850be93a6e437cc521c1bb807d6a4386e26642a42ed8799b2ad5930079b08f586f6aa34989881b828cb7e414d5d053329f7f08c11aad618edcb8de8e201ed002f9cd750552876e67b42c56110ab52a9b29b41dd4f58938d8a06a92a60c103ba0be94ed026bd9ebc132cf8ff9ae71302d2bb5f07451e475f4f08b3ddc704d28ce186169d537f80a3b72f1d03313ad1a551ff53f03b2579f60576b6eb60f1e1dc7b1a379d2495a40431f33e541ecc12fcf70e24827894b1ba74fbb73b73b1b8139f4ebabae1289245472162dca9c4616e8c91daa346947813633dc0b5486bdf9a16caa6dbd15fd3d0c2619282194b4363d72f7e3deb4d54699be4d8412648dfd7a83503e83d63ee0b695ad52eb8884243a1911737b0e6d024e59908c757703e341c38dac86d5b6b6006b533c8cca4e577b25ead79dd8871ac0704572f210a87183c7a3265a970d3365f19b4399ec6b465d23f49ebba5ac169c9cccd61cd3e3febcea413a639caacf43e2f616776173876c9dcf1758f8547c4f5997246a236f0149b5d857364908104699f413b9cbff8125edcb0ffa3308b2351154fc4ea1721fd6b4e91b474ebd7cda8105c9d57e57da25be88b713f8416efa7e66bc4eb0c5b0d061e3e51af0238b7c52bbb76f0b14d8c86a78cb3aba96f91bdb4ce2fef3a25ac337695335efe2b2a869765acaf4cf23aa7c2baad2fc61e6f5b2881eb3ccc0742bcfe9c40c806398eb5fc6229dcdef41288e01d481303acf34be98be21ae88937675d5d613743e84b1804bbd3bf8ed97ef0aabe6a9e89a08454a0f4fad3b734f4fd3ce07ff1dcc3c978557794a0852be5a6c7a4fc198082893df5c51dae608fdf45422b803ffa4f719c979e53c6eb71af73e0d7e7cc10db6ccf8f0532f20b23610918484e69c516a94e7339f87ae734431f9d6011ff5f3194d217bc21e8e276e30f653fcfb7649fda54904f6a04a1fb0b72a54664fa980f690e34f2d2d80a12cb20d216ed7100726d7798e893ac424e6e34a191c704e1fa534a8fb02c09ae7f820407d78edec018c87f300c5abaf2b5d42c384a2167627cba50d0fd19c5f4437183ab8a9c47cd18553402c4a775d8b9a52313785c69451c06e69ee2815204e8ff656635fef44efa7b5eb61762261de14ae1da235f53af639fd5a1664af907f69371e2e29c2d6c47a1c4f40e7415e8b6292e3453126dcad7eee482915d0225f39770c4985e3a4f86312f63b0c38a62bfabd2c9115dfebe0259dde96ba2b58569722bb7602c621e3f9267ab0538cdb384389442642850b36c49867dfd015a50df8c676141eeef02fa2c347515bb25028d393d47555ba9d09b27a9e74e6338adde4def6a438c272240675e69e935dc776314957febde523d19590ccf66ae98c5ed1d8a7b6eee53a798abac2e888c383c8d3364932e9993236e4978db4eccc2c09464ff3ccbfdbab88b60e76dfaaa827693fc722a2675b3aa205db4b60da3fec55b8a1754619fa67ea0eed7cd48750150fed987eddc58fcf9b9ff8a06ab1d94fccbf79a6c38bd5d205fbd44f779d7fff054316a84572cb439c196c0743121cb8e6b13502b594028c75035f69295b7c27e206ce4969fd72491be8a1fa7a696eda3c347003acb0e4f9bfcbfb447a5fc9323e7f1bdcbbd43942a3a426f48126640625cf9744096111ac3eac148beaf90ba06332abdcdb8564b2bbc2878fe7e780df4bd9372e6c32fd168a2a5789ebe5a7f518b7eab4198fa93bdcda30172f1b49b816e7bc3d45952bbb1add10d8fd7422a29785551d26616b208f41bd44b73023430f81b2fb1606121c792afcf3b043002b8811875262991f133b9f8b7320c4a1e29e2d97d25e1444bd1d9a585474c0c50262e2de0e5e9559867a4a373cfc574a295b41f77dae2e381f80b1df95eb8be5c9b07fd5ab8ae49efcb3e82d0c9a568089cf754e3756e260b64af7ef1264e2f6e3e95f0ab4781553e880efe95c9b40f986532df8aa18af5303c4d3036471845ce375f6f9a396961ccc59c808c76fb4f9a19ed2a340440383aa96d9b906a1ee9c4afede0f0366f55e2ab716e7b79811155dfb19ca84697d76fd29827c637670497cec8ac75e89a19c86214312b794f3e12e0049db01098ba18e0553ca255fb7c90bb773cf1f4f296c6110d32641f6bbc19437195120a49c97cfa2d42ea6de23bf79f82f72c057fb224e0e5d8ed13df75b2317dec97dbb4ede549a7a16726242714a17244edc14a5629f8238a90fcb34f25d2b20b072be10c99f44bc1e129ca2a2eeace8dfed05a6b1e814fb21382ed34b94d97582aa4d60fe124a10a201ddc2b8ea11e3925dbb7d74ba2f2b73f4e970bb7cbb43cc8ec9ddf050132e5ebab60117defebb02b8a6a84f8849301dc08b8bc67739220a8ab3e624db285b80b7b60c641fcbb59d8847a586d4fbaf8b258592e116eb86a938abf82016022ec4934e33122ef199ef372ef3df12aef0488e4814bfde3ae8451302a26683292ea6b7ef23a6af08ae646fbd21ace3dbb8d285738fa73fbfdd4aa478636cb515c19390394c95f29989a97c82ad64ab1a5fb58578623bade2cc46674dc9972e408e07d68d1c64bbfca20af80ff5baeae36b6e18c74ae1bb3c3ba4c613339a5141fa9fd58b11974dda8e156cc5990425bf4268ba00984dea24b2025b693fdac0928db82793dab23a9bb455354415d4de169b31d384e8b4bd54b5db91a05cdceeaabddd4737c629f4b8ab570bfbeaa19681dc661ff49aca9714bd9d0368f9155df3019bbef772732ec9e9773b6d95fec1797c51d9a04d042a1d3fc32b23c31871240f6ff9534e322b47d5425e099650f165f1a1ab487dd5c8b6c2ea6351196ada862dc670cbd7cb8cab1554ee606a2ca8efd2b20f3d8bd40579dd7f66718a60ecc1f33bdfd1adc3c57c201b66f28ff64a7f962f7ff0156362eef5fe8f2584af4a4fe64c70f51e9f68236bf242408642788dc2666810a928538e92e457bd96ba55887d54eeb6c8d2d7497f962acadba595a2ede3621f957779c13acd4ada4ef6a1142ef193872ae2b546c1636b11fe7434475f42f86d88f5283f5425f2dc0c08bf7b81af29f6c36364b3e7e69d867d52d6f3bcf1959ae215f141856aca635c4503170bf9fc8610c97819498c3cb8c6a5e0207d7bc4184f5e678035285be0ce501e8f244e95a5918961df6ce0b32969020266274e0e761f32fd63e9cb01d4c09e543c71398fe5d427a48ec870bb48e2eb903d30e4cf24d038157529ef56cfd1a456b7692745b73728d29ff2c89fa7b2c72c0e20dc90b510d2623c6be1e5327ff6987872b441aa69015e9b6234eac6571938617d91fda73f964612266f179d3a099c08345d2e2fb845baf9ad5227154e7647cfbda1606bdaf8439effd388709e51d3ef147e45c7c36a7a432aaccf151752dcb157975383717cdd4b3ebb924cfb63c28599b432f308f41ef060b16d56303359aed1c0617e81a895af9973df92ffb40a643a8b7041f7570ba9e5ec6c5937ac5120c2d8f4cd89efef3466b8bae309c6fe238d6088352d17d2a830ca568e8c0255bf912d97e0f8c76c524ce6deada811201bf8dfd53d08cb0693c7e7b676abe9d9c3c35ac5696cd37fb1a28a9553693702e61355f1da18c519f511b1069215c75fd5efcd07c744789bbb1e208984bb8d38fa536f688cebba8f34a4a2b171683f4a7e6d10c97b1e4b62d6f62525b22d9814c13f98a3d5e00fd8eb0759619501963c25c1b294f568b057bdf114f45c1dfc38e33e4e3e3594297980b031716d7070a754941f04e6924bdca8657c6ff32b0e17d8e60c823c86bbf38e15c77b7b43631e934ad2639f5962745ee9d81317d362340abd603a5b262bd96bce87da3ee8d2046a5c696bbffcb8b119e494682a857d10012ac5a101f0fd9db230ef3828df31eb324f4077a91aa31591ec5de9abdfd32e44c4c960d175a5b2f9f399ffe9a5275583a9f401eb21b6043f7771122c30f8f15e01c7f43a32b8ab9b7ce4bbd1b916b5e6e2f0a506b0661f7b0c9a6c2c37530ba5686dc5bca6aafa2f336bd671b9849ed490c2db8c3537d9ed1226721c4175dfc37f077fc95ff1211dbd9bea59f4f572c529f71fdc2ebf960e2e91ae8cedd5e030ac416cf0ad2fb2ff81f151fb19edc44114e9ec770b420646c8888bee9af7af65769827b34ccb224d1718c7c586d225d0e827bc0d69739d3f766794c1e75fbfda74783a918d37e17ee35e9649da46f9dd2a4d18efb7c8bd409ebb53a7417274280c6e001c0d0a930d8d5f581862b0c2fe41a68d9e74c5f902c7f032ff47d47ea6d4e632a33ac799916b778781eea4139cc4e084aa3edfd2fe78a2cd3a58fa220f347d2cd794d377730453af46ac955e413a679883649add8c274f9cf8f36820a9c19f6919b9d2af5afe5029b74b19257408c823ca847b7b346a52fcbba582dd0ef2c971fa0839c381a01991543883ebbdb67ed0e02ce62e9fa86996e2fdeec9b74e97d1e90e6d36bf900c80bdf38a2376c9f80a54bc8f8a2677dfe61f5b10793b4b66f3773b018b4d54a552551a706f47c9c04aa8b1cbf0513f3254c14b7c6df36fc361252c8b33b3447080aa0bfb11992c540c4cab2003b8851d7d595da71a882249a563416ec29a15fab63d466edcf3784fe9c1172026b4efddca77f014f15219463ac22820ba6a1fa04d7f686003ef24004da67440fbeeb61fc68da14a94f9ab659bb23f457d9be80dd0f0c06338d4b621b25d5106d5ce9e3ffc1aefac77d75f1442c3f5419eb7f59fcb221cecee5 +0x2714b6e51ac7b317efdbfce1441dce76e98f3198b495651fa33b2c90479c15b8ae7811b203a739d3e809c2e28a4e1f95 +88144 +0x19591e3006d32cd4f5b0d74e5181fb61dfc3ae159664bc5db08354f6017800928814da364429fee1484d3b6e12dc0ebb193cd00ba5652ea9e3a0dacf398e80c5d76dfc4d8f97ca3fe64bbd716bb0f4d947170bf616818e6bf561b3eedca348602fecea3d8f247837f632c71e0306970392ddc69d90c0c4ec0e4e471b93bc40abb71a0dceedd8f011a188c03e83e5de8122156bc9bc2bb87154f0fe2006e350ee987ecdc851bb1a150ed710999256b19a1e47614241c95345f2ce41c4dc1f6070f9a193f262d6de8b66a61ef7d960f898aefc10d0c9a37baf0e7176cebe79587a0309c515c93025bad07e5420ff0b9bc1fcbae03bf9bf19f6d15f070753f72054dd40cdf92ed1d5eb75e619dbad5f835e2d0c394a7b27166362225a3744a4a046b1ce116637c2d8667c66d5f28b6596b66c7783c7f7e3583ee942d9263885c198a439fb248f0a14730e86f12b4024bd13df85267814f9c9cf9045ea9bd8a46991e00bf1fadcb1735a53cfd34f75a4e1bbaebd8a257b73505d7db5f75fcc08817a8dcb5db2c7c0dc6272c8e426d1eee8f702a71798d458d432d819673bbbb9f29bd202a612f73e36d494fa8c77fd09bc0f03cc3698c6b13f94cafaa2f44dc0a23cd83734e315336bf8e0eb340ca0fd434bd8b34decf98578cc7bdf10552b247ba5c7f26fecc8a862167f2542ab63d367f3aae5c65d16dc672112501925fded641ec6bcbff7b9a303769830201dee920e4ea0e807b3c5bff4ddb7d5252b6a2344eefd1b8cca8f2f366054923429e84222a5e3467ab6ad34074694f79c301bcf055e95993e2ff351e31bdbd5e899faec8a409a86852d774688a6ce3de6fcb8f98eb6b6be3deb8d13f2f05480a334cb972e67ee3192e2cafa5f4390306b57e8a7c73e8711f1c9047c4b27e71cccc1044bf66207ce089b4f5a74660056930953e3983d311ac3900194d708be30cd094c10ca780ce54f21ae6daf56463ac7d9a2b4e9fddb6119072b647cdafe440dd44cef92f325ffcf3c8e3bf95d8b616d917d23a2c4ae6f5cf82bf323e7d2e1f4e9abef36197ca3efb397cd38c1f755eff78b36abdbd2cbf529a84ab575608eea1212199e3336591a50722a56cbb19db3d475f7ec8a6efd4a624b6f18cdd0d357152973b3887ea9b5d9c75a39c3e2c123efe26e4e18ab8ec56dbc6c36374b38a3bb97085b627a1c29173d66cbf1b149a5127ba2b7cfb005cd11a249f5faf94636cc05dd7f075239ded27d55f29c47bea303e89b10f5a6eac915a50c3f60018479101afc08c02f883cd22f2f980ecba8848bd06142d3b4c623426ebffbaf8b7ad24f7f6cdcd53992acdefafda48d668db072dcfd34b1031f4260a5691130c1b1aa50db35e58e97de94c086c6fe6240f78f80b376cdd7ba808e37f213682bc9b06adcd760093372f55d3e7c928ed5806d897dfdd4f78c026e6f8efbc4eae8cbff78bb1bf3320bf15d702184693c2d4f780630641f991903734d2e6b847eaef0273eb54ef9475f3da033304554f0b4d49f6e628e609ac6e41690e0e85b0cc75faf2291187730777d451035685a92b0386a29db239fe4dbcee0a06a1a527d79411f8e192377d59bdad56ef694840a6aa2619f63cce25ea0e857e694ab70b70dbe00e91314001e137cd7b53d72d9402a3b0d38c23133f05d5b05c82840bea3cbfdd99b48961bf3268ad34cd0aa611c382af55dbff99982594e72afec844229fa27320c804fcf3c1e2c529d77e32487db98a17424cc1dfcddea2404aa1c0632e36393a483e724e1418cdb0ffcc52b675cad9ae7b754c5463156a52d28b312a4cfda85cb180722cad8cff60a26fa7da60390671c41369b499dbb7d942fef6c6904b48fe90957d2df2a202bf6bc27222a186a907d891da7eb6941329f86781e67cb183a661c7e3b0981a5033c87f723dde3629e7059aff015dc0f4eb8f7f730886b2e0daa1a25652e238605424f0f87a5aca1185f77947eb03f4e59464814a8b22e1f901dcaf3593759ecba71db1a566cba4f86b1ac7559a2da25d9b1427690cf5a134b27f6911e0d6bffa831f5be9819569370cec0fa8ad5f5bd5860adc6efc63831c73164a6bc96a1e659eb63a35694c8955f1e7bca182fd83e5dbd51abce7f10a28ba1dddb3cbc43ca5505ee7298c5587edb09a58e0b9acbcf712ff5ce34e22a8e1fe129d8a56698d222e95ed364944e766af705ed6bfd15981b1e63d629d7cd1c0c571044ff7ce9274afd7b6dc4e9f1a496506490413fffc2e3f2616cb6464274d96d5ac753e57ef055ab0de9bfac8a31e67c8a1e944ad1755114b838e117d2bf0e8ace0aa88b9f56c95adbee5dc56144e2e33f406d05d3d8eeea30e1b432c225341536b5065594813071ae25a71cbe0613ed4b9ed3584c1441dd9010377f5dcdd2785870752ba498115a4e36a499e99f000375dfce2b8650d256a26c71e7eae0701afce1fef519c3f57c83c85d252936328b86ac6666c7b52abb2c9e6a50b0859663ecb3a89b392c633f1583d8a6c8f32fef47aca4f2586bd075f74d2aa4f8e5cdbbef8c7c064df8e30bcb111f060cff81957d888fb581994cedcb22bac90a279c8acc15801c9c52fd486e173a2b3e82afe7f3e730988968278a6fc521a92e758c384cf5bec670603a5ec6402fffa5a3424b70728d83baffe8b3addd672aacf4242d37d43eed0f4a21b69b3108688b8bc12bbbd1b05f5a8717d24b129536cbceecd2555c0777c2393bb6b595cd503662b4ee9daba112b2273d4e120eb1b4d52b6c8d6d33204ed1550ec7dc12849eef4fa4fcdea866860a08e18fca76c68b10322dc74901945884c52452d750373afe7a18bd467109a1aa518bfd3bf5d9a5c50cb6e9af6f687f23b205bd6ff8ed0bab0c98999cae924dd92bc3002c31f4e93be08f596824a6a9f54337716cb2affb3e2dacf8aa060771e0be120067d21e3fbcd741813cc956c043a144d7962584f1fe04dd42362272f50731ff65b281608f8e1953c8f2067eab55f3b456b4fa74d635bab2df09aadac096ac1397d6e6c1c1facd4d955482285273620d5590d987902976b437eb4548bcd559d4fe9ba849be481cb85228e65b9de516d93ef068c608226169b2a49bc3d00c5ecc02c86f006cc02d1a6637d92074f2369f789d5238266aa35bb9fb5553e482e3830c27e5efb4aa29fe3949047ebfe4eae86b5f3de5d3486312b2b91b00e1801180827eb01d7e4d37e933260f7d66015c3b7ffdd2d6f503c91507a694d3ad4e0f4bce967892b3f28065bc95a1255192b1201c41b81275e4ffec1e8a69d33134066c5637e65739e12bf93c5f627f69de141faaf197a13c332a1f612d4209557a1e6b8428a173fa62612e1b4cfc92942fabc191d6198c313875363657c57b02677ed1bf3352eeddbd4a8ac1241466bbcb9e8d39b8e4da3b3a06ba07cf9d331e444f266e1ea1d1c9390d9796af5504c7fb160c0b5fa093448305333b5e70399259b8f0fbb23523a81fd3dd03b564739e073bc46d92f6c033599b273acce79347eee2b9cdb7b7ec61b7c3e36efdecbb2a37343fc81b8d68f005f0206ce1a94b244bf5084cf5ce34dc490631405093e551d32a0585c00f9362ce2ba539645f6910b81866e0342304011dc34fe27601f8fd22449c0a4a214973fe743f091fb0f3f57c735af13b5e63b87b23c6ba37dffc156dab8ec1806d930adcf57444d845f3bae02f6ce7d3265ae9aa4e1c325bd5fa81fc8663102c9b780fafd3cf5258c570472c74242ac423f07cf36bdcb1a98af82917fea1611453016bc039d59b67d97384a8690b22d6fe2d599ea28b9eeaa701f5063bd21b013c3504574d1088cc2903599b37a838d05f1968f31db363e6d31acd10647da6bcfe1cc3bb37077f515c28ae4f0583d27cedbd923901db6765b74d997fa12b6a0a42be90362042e9bc1aea6b0afc255aa05120bdba798c122ffba141991c63cfb6b024540e304a2fd60d52781544153605334ad2bcaa4dcc0b461fada7faad3d86ef55f58c8ea6b767db67bdb804dbd0733944ba88bfa6fdc340cdc5f066911c44a8595df863deeb372c32223a65008eb20e155b66de1f0d1d92b572be8698d4b68239729ad67b320da9b990e58e0bda8958c59f9d304165e2e4df9a578249cda526fc1eb91004f3b3f906edffa7841bc1c05d6d77dc936bdadd512604832d6fd83baa489f380198efc52123d1daf4b822ede4ac3a0a9e88cc2615ff0db1ca23196a4cd89277fa888ab51018a34de21b748862462fe4e8248167330bba33ab4f2e5be8b5dbf5782b4c70ddb6bd28d6ab7f38e0229e8ffba8c247b1345332555de0b589c9c2d902e9fc9f90e3669458d00ba66428cf365f7a556e99611fd552b3f72034fb8e4c212a64e92f89e7b9f1f2df79f94009ff9a040285f37a674528bb3b46f33389755c564af7c48f88be2879c45aa452961236ad9334c56673a962db74cccd59f97d3bd5777056dd91cb86ce82f16f46bc98bbdcce22190f8b2a857d695dcb56278b460fb3fdee5b4a0a9257e1e56104c4b9affb7df8f65cf7f01b08e39ff3105bc8066dc54693f1fba1d47da9df8275f69c9c71665d6535fe22ace4aa3a4f70dd5b025577f24d87ebb8d4a8a186db7f996a09a652fa6c82eae8be7886d7e75ef46dc2308faa240563781b419283730bf74a7f020877162b016bdb2e3f1ec1c3e926cf67d6152153ab0830ae447d5302566585ed527b68198cd38a6d9cb6e78504adb06014dc4b590b919b597f1d814affe3a3cff6ae6c32d248549e6648618e8d2bed8511a6ab00cb3be5a80b0b07cd3aeb6110bdb9295f1df1bf27657b35c4ccc70f3d941c472e322d9505afeeed714ea548186f44a789b3f6557161f86d1109aa9def67e629cc899033d7346e3920853adf4fd4f6ef96dd809ee42266115c8bfb1f0550ab59c3188b47866334f5c125d2ae1eb3780870e3b721e86f6e278d9be31ee61813ddf927475a7a02e8283c77943eebd671fafd0dc266e612b8b98b818a21fa87c8bf58feecf31ad932db79c3a9161f038ace27a3c9f544d1ebce408517b0a9646f07c7e5a19bd0b2b8155f5139bf23036b8bd4ecf6576c75af6f93efb3535b79b3bb2d238ed9045325ded8686bbf5e9ebb39ee316f13c4c6aea36c068593788c39e57401dc351c851f3ecc5167a0379b23e15cba5cb1b68b8d72b313b6f76866ac8c83c7b33781104e3e215556e918c44a8906cfe6b9a98ef7e4505e6d0893cfb2b942bd3a689bbc5ce5c0ba602368dfd93cd4b835b4059592022c2fd34c628ef373992a9a4fd251ee3c91c8acd58eb577ffaebc702a316906d32dce104d3b6d19c27058fa758f96af497cc96387f40ecddc7c25bfa197d2fc5f3c824b938732c9aeaf8d8360385444166a03acc201b282da26394ba39e971caf4295aca4afa6ad403e125d9a375358ab41bfb00c1d683f0194413cb7ae820dca254d5c0a19916d7f052fafabf25b910eeb4596f0b0f9ac5aaf84ba662f5978b8cff3834d2fbbb174ed2ba119d33497494edd87f3222e70ec5d4cec3689e5048226ce48f358eb2025dc505d6e40a5136454cfab9fdccd34c087dffab125ee5a2f1428d486fbeb629cbbe40831a378ad65e462297b449e9fdc16860d5f693c21c780474f8e828120e17330cdeb63730c56e5e02a0fc36b5a4af0894dc7be9602535174e091547602faea7cd223e85fd93e418fd5e4c2fa0c12ff30e1718dc5a5da71f7af19d991aff10a103f619a03bb26dfb85381a7145e3a29c3f1e53c92b164c718e5ad799cd0ceba333d2ee1295b15a7a2cb6edb81f8cc5889a7ac35c2cffa3b1faad69c5d0c97e12ef4102597601381976634c70981cf73cb294dde20a6a2b553251aaa9e0c5669498b91ce16732955dd4c5ad274a24c62d19f50a173df661dfe7f040b25771239cc2a39446e3c5d0bbda4686389024a0de3323ee582214e5b66df1927baf6d439fffb8fef6762b98b7f96e7e4114ad15c49099d1116156158d36ee3672731a3512a231b38c98e45bd6b4c5ebcd521ea374a4ef88ff762a7fa8f54e93133cf876994cd65855b67088ac9eb55539a309b863026d4c6edb1282ae1b8b3eea5798869861ff63fe6960ad8e09e54112b1eee3141bbbb1ec0aaedd110c2ca0746d6af39484155cf32c25391f98be45e4f94eb20c63534ff37f4fdd5659cb5e2de8f03c2225c0a9b0794ec9b5cda8ca2cd3a993b06bcc8d11c386020286bfce9354b8cea5c989e0d2db4dce051b4d5456eb7006b4b76fdfc351d1f98a15a288312b3539a3d1c988c6bc92b46204146affab42896db8e5ee84b4c4127178ec0173e6e5fbb0e11807f8b7be1b710a8674839d81aa5ff2a70fe256cceb4d4324c0f8225b933189edf505374071a6a12c079f2ccdd81ff73bda48d26cf261e6c54d2a48067eca0ec3b668c59a55677a6daa8ef3779102390cc4349224b673e6461c86c2673ccf1231f29fed5c1557c8d3c3ff6c2f73cb3a9254422074a5e7c44fa59a4c0e4bd526a1001708e65fec4ee6ea4d0155eecf6e8510de07ed4f31f31a8ed12f5c3a60ae99856ab2c983996f2f94145d7b6083573d7084b2ef20e7155f2ec806e176e62c93e90785863ee39c0647c1cb00777b8723f9c2ac0ab97b8d860beb4d3e8ffa2328a179dbacc05f68237bf1f4a5a23c70e123047db08763de27acb76cb3f40124b0554e2f9de67155dfb71144ab6f3aa6ed62e68280f944899c97c90fe2319f93d36ad11bd9efade7b37f9c45b24cfa8bc16fd564ecad72028d437c8159c72a12fa68bf0b016a7980473c1f723ab9f0b1d5705d9f641280fb52365e8b8b233504adb5749784d578d203730744a534b19bb23aeb8c87b705b693f6fb68e6e454fb65f77e2bd4bf003f50cae057924bc1bbe0160bd6b80954d6bafbbfb40d78ee69aba558328195b43ae79a3705827d8584e7a83ae8858812de4fbb37e75f5f75c1e7257f660be81957107777e8e63881a91157f54c60c1a43fbacbe09d6d168fb6c11e7020e424940663c93f7c4e0b5a7b25abc77cea24ad6d94943620b72ca09a91f6c6edaae9a8eb7a35da3a1a74549d7d1a3df4725f730a55aac52bbe103cf00224e036b095ec589c13e4acebf224529039a53da9a0b97886860a18e24fd9597a4f4896a5b7c2e07209fb3f23032e6cf770a9d2f0b6d54aafac7172e459ea3962cc8c87eacdc115647e6a7b6035f73f1b55c83ed7f05af3298497c404bd04026433187500566b6a1be7deec23f8f33b946f6cebdffbbef48ca4e976f3f7ab56f6f9790886d02640e0eca50bdecac6f4db142464692775e16193e316028844b983b62a9cded9865c5be37954f139d70d57ea6b231402142c10c8112be0ed547c92cfb9bc78c10ffef562a8421bb4a7b7a368cdb2511a1e4742c7f022ffa57f42cccc82d1f52527bb45e0de6dbec9bdb63605b8acb0edf8c55ffa1c95bf2f199e6a232297d4746213b5f478325ae78d6ba847b85cb3ec4828c0f4d2eec018b7d2236a2558874d538ade14023a50ac9b6a42a5494ccaa360d42e4ecfb872c0ee906117e7be9e0e50a316a608e060776c14bdb4e8176581e769f04e7f6d67d6025baba2f6148935fddf0840f8beeae6740d71ed11372526506caf9a4e881fb6a7967b91ed04b962cfa12b6b5e40606857a707c451168a0f102ec4b8d9830ae142d3597b28f9df032a9be88ba5ff517b6b93c7c1244ff48acb52c8009d08a9f47884bdb5268e4a95b311c8386c563e9e34366a6a074e0547d66b3227f5637d5e9d3d20d6821c9ca8edc552e81ddfa85f56214825768b3cb4b5ca8b959f3e058e357f1b65b83f35ab3f0911214715ff2d25b6f99a0ea1fb600e034cbfe6f2d311e59d15d93560b61b1b6f7b5a5473d3864799e72e1c0cc1c833a7fe2d692c5678124998a7862b8e87276b0a19e293a609103c99583b36305bcb2b08549245102f3ff72c5726ea3f5dd78e35e65ddfe7043401a8bef8b8c7a9390f03dbfec780b5e318497e9447393da03b972642b32736179b7db8c10ee81f01b6690a0b3e389a903f68745aad1c751605a6701dd7e6ed3f7c80dc10a3225bb9c3b0854413984bcbdf11eee69659b2ad8edc5a6b9896b81ff76aaf840ff6bdc5b962d435e23057fa79ce24c49d6164db19b12ba89fc7153dce839987bfe5d3ba0a086d6d24912da08205dc711cd40a3338bd8a5137e8931d448420983d702c1b3809b736452b6b52aa417c88bf12212a8e69ece20b8ba0331bb4db220316254db5ff484dee7f6f8535197b57debc38356d3ed9f77520cb1396be3fd1ab486dd62651a6f06afdc8bcc4f65f8b0622cdf867b4c7fe2f3872335808b51380975458eb9949ea5536f56ddc509f7ecff630c810543d6274334416c22ce1643d83772a884ea77827ab741cddb0b1cf86a72f48c9a5a0d0fec1af4287733b504c8d54ef7eda56467cdbd35e6bbf4ce9e4a607df2621a8a62934122afaa4294408256c0c51d4ccb1af388186e8a4c74a4473691f9840ab6e8e3b2b44be1831cc2aec2af583c6716649520d4ae739978d30afb17eb29b3f96881749341447fb551f32205fa717eac0d5b8e4fee9c6541f33bb7f70e789bbcac188fa5dcfdbdc8b4f97da9f0e41af5ddecd973762d3737cc827319ab9a4c657a4e0cd46331c5bbb469db8385bec2599cf109268d4f98c22585366509b64e5e9bcbf2071d0b20f819eb447b0027ff40111127527c290f4ac8ef08c372f5270dd738492653b055e5ab26c179a846581205f53ade8ce524377b66f11b2c7f61dcf53d1a184e4becec31c35965c744553740454ab202a85ff10792fa55807b8332bf816cc753026e7475691527a3487e188aa860b6299d49e0341d2a59b6111676fbad471aadfd62e43dc1fba7847b5c1babc682d248e9696dc9ac8a0f166ba1127268b3f9a26550a6527316ceb40576a96a48bbeea6b747fe90ea205fe8aeac6dec5bb94c7c62c0217c266b827a0d542b90d610f28c2d6cfd4f7cf6327305c0ef312e60fb811b3bbd828204ac1dbb7f07e5178bc642735fd0cf0d146e009664000888b1effab948e22e31e835e6387ea731b4335210b2a8e1d84380fdd78920083a11b20e2e6370f846d81f031dacd9713c54107f3e12d09632c644c540077c6f90726d4167423a679322b2000a3f19cfcea02b3313ba5e59a43f68b08338019dcf53ea71eb7e2e98ddb4a812f417c528ae408b57d8d3da91f756f2a5e74336fbc25b3084043ed4f1ec390923255f65e3a5db38d4d684cda5f3b2ec8bb550a3ef30334764f7aab5db8757dd1ae33d826a7b193b9052f6beff60fc5d4c3689d1e2e08337f70fec58bf78b62ddf77d9a324f8a49b759750350606db4ecfaf14473d9bf208279329450385ff005a295c5079e321606aecbbba22adf8c6fc6b198d662928c3daca8c051177da5f7340ee11d1063b9356985fd6bb1cfacdbbb1c12cc752ce70fafd3a1f4f15ee511206b66f9427983b23e46310391c8a6bf4c833abc6de8c156e755e1b2729e4de1fc1ddf12a0fe060b818f0f1057550a98ff99892cd9409bc1e771e820079630e82ba8a20fc86bc0afd7c2d0085eff38e748c186a433dee6cf24ea2db41cf14ea2339e6827054d442da5743c522511c238cc9daba90a1e22ed24113ae54f19f79ea8519a1ef40cf0f37f359c84465726fbdf7070a1b888e09a6979984a0a7abc4c0e84a05e213557afc96989254f19e7af060c6e34eba990556995be38dbbe0d18ba8a234af95108a118928aab8be474c0e4a40cb90feac2aca8f825683f3e8aa350e48b8c08ea5475e143098da9416eefdfe9d4c4a1e6f81ebc13562ea196857a46264197bc6bfb9cc7ed8e5213bb367a7c404eee2e089119f769d912af30bdec2ec20dd4a0504e941114a18f47ac5bff2e39d38c10da3e2cff7e26aab4a764975f3a28e94121cdea613abb9bd1af4fec8a591b24f6d64fd648d2b75d6e554a0a7c112b3c0b6b0a0e4cd2650e3e4ea2d105008e4f4c77569447ea03b118e4be93f9c99d538b96838e187e066ce9d4c54b22d295719e47d2e59126b43c50b032e25cd5f7b63e3ebad87890482e510c57995841d92248d25558993b1155b252676419c8b2da9fbe207bd1ab82d9204fba6a39d0c1d7f8815e5be479d3a39a459ca7b50457472cbf44f6a8324ee3d4096e2c3bf1d81909df4e6df785439c9504631bb33b7d62619ca8c780d724d4c8d3f36dd347845c1966b61d46c019a72f195b3e98b06dd2dae0bc6cefdc7d228b39ea8da4246f1793a215c856bcae69b4eee58eda15d11f0526005549e4e06397a5a43a032af0e1f50bfe2dabfd7a4ae30f729afbde2f9d5cc7152f2372c70e7aa1b0c184cda231da1ecf8bbaf515c125f5b2d1727bd1d45e6e5b4900f8c999b0a8b0d2ad7f0b8daf551a8108260972fa3c06c0e261705a9666534166f9407bb63504dbf1d1855be1395f9c1812bdb6dc4cfef7a03183a671598d96c9f6c44b17d12d4bd647b8331c561f4b6f4dbb334892fbd4507e743e9bb27ab7be73dd8e3207aab0ef540c99bd15d9fd72397a4ecbb88de5577ada89520b9b2298f2f49bb142fd9981890b0640030040d558838fd22845b949e91f2d50bf7f75fde69219f20da66451493bff41a832b3ed3d6f6cf86c93be8c3bca810468881061d14e7f90e235bfb33707eb4e7fd1a53e6a866caafff863b2d5552ad9716580495572430a4b1bfa4bb50750a2f47db35d426115765cf457425857816c74685438b5b5facab2d9a27f55a2d5fb90876cae57a7edc6fe17f7bf374a3b29ec20fa94a4720d5ea3ef46c29b72d1c4ee9f1fc63c935c396dc3c38df495ae9e332fe201944f0132b8dd65b9f8efda7b69256b2943ebf72a2688493312d2623603d5b8f3f7a55ce34c247dc9e08266ab9aaadd4c2fea3535b2e607430478ec8db8c2ddd0510d96ece8450d76f4d2fcb1edafc49333469cc88d6d7c325c01a401dc77cf4b32f045bc17bf8345b84a034afc94dfb2f069a47f308f26858bf52f4ee9550bb91fe5dfdd55047dba8d6020c321fa7d1009cbd2b626bb84b116dbf4a159eb21ae6a66cbdd2ab45b49e6adbbb708613b3ed1f5ae09ea7315498f1e8ab5c8ba9f9fc4eb9017f33fba88769b6a931a497893db7face6f65656c3474558089043e40191fcd32a591709da9fa183e3d213e3b398b245d9c4d5d792f1e8f2f65b078d786412fb90c6dac7c4e468be25ba60db229c460f5ef062064cf161d22b8385fa78bdb67fc7c6db82ebc7496fd55db0ed4558936fe2e39b6165d8587bf4a43fb966f15fe65bd3c9b9a3badc2f7f167488a04032fe0228d287620925670e27a558d7c187b5b96805da715199538f8f3c3bd7f5ad20393ab7d6b6266119c4a857475f80c6645d1e2073f90df9928312688530fb5a7cf493abddf692840aa480b60342c19488d3409a049f628562f66a99e36fa3c37ad0be3f0b97f016c04a5b422b46065a79a889e30ac8d1b53b65d230d4c88190903a24e1fe1ea191c11282ac1dbdc1b0ed49448c0529ee11823df3dde7f0371a63ad722523ef297d8399b124593e76102a322b0562270a12de0b49f18b5b16f94bb70078fbae1a428e4c417b7c3ca5f0d6ff87dfd044d841b53a4f0c3d8dc385ded35a7e03cfd67957a6ddf1e53ce3fb6a0df58bae07bb269e677d8e8cfcaf78837f0a74cad9009a6635c12822a3826859e9fe9979e43529f00f4018d82c3d29e0367b2dbf3e0b1e4085a59eb32533e03d200d79b27ed8c4508e510bdd911f126b8636e96f73688d5cf2e5c625266afb7a2cacbce61c18ae46810b07dbcfb7da8bdac8384a1d9b60321a2c2ee72b8a12a77c46c3935077103873d87d713c89ead7c0a9aaeda1362f6677c33987a923be2bab863e38b066c2bcd363dd2c6c17bbc5c455b1a882ab43407855967533ca569d16c57d54c07a0e3a2c27b76bd2e3d5dc5246dd29467d5476b85d963e3fe084726a8f1155e5238b36ea8e9cce1570b181f7179dee712edb7f9445e9413208c021f36d9adab2f5a2399b12edb18830e76d3f226446873230a1b898e03cce9582426ddb6a41ae62fbc8ba5f2ac4bfb6efe47701d0efed1a0ca381d11b7f4a39535a264300392bede05ad4cdf4563085239e4b2054493768c7eb7c990b874946abbfb94f0d1fd008f87656d9bb046f0e2ad128287ec0ea80eaf0253b30f3504004098359e1642f56cc81cd2cef5defb48e43aa64b1056b04ee4808321c31e3d7e4be30fe2db49e29a523b41211a1173a966c2e7f8b755d675a5992383dc16860d6543e96227fa1244ad28833b29c99e30b9140d36eaf261ab7bb5f980630726d514208cc9023dcc905f4d60c629edc6026796e0afb0159b17ec3ccfc15fd866fde3e3c1bd74fa57a6f2119f672365314af8b2280811a6cae282966bedd8718eae57f24ee68619fcafeedb0ac81e19272ef2cfacec158e3733c52c95add6bae60ffab6fbee3f8203d3d915679122f1f2d6df543501c5b32a333c6417a9629bb5495397927aa81db4393d267f6a38d5d96b46ab8bef28feea0a6fa7b88883fc4583eafed935c7d3560aa1761af966ad2315b03b765f4657c1dfe65e3ff342c5dce648519ac4a68a336d8e6d00e9b66119fba46cbef928a7f5da2aef7591a5dec39af4f99bd24d2b918b8b73f8e030d90346aaa62a64d5d4cf25c2c4220bb72f42c6765fa505c29fb98c20f0cb86dbfd291d4a51834955c897e536430e087da0a09257ea7f050fccf397d54c4185bfb6d2a90dd5914fb16995450fd60031011a27271e01f37b3c9c87d433ef2282e4ea47127a9b1c1ff0a1116bd4e4c12e4a831dad530ec70f4ff6bc6cc14136285382d17f1a09ec601a57527f0dd51aa660c5cb4b7f78c46852c1db8707ab451c1367b6187388c8bb3873a1aa4210d0414cc6792a29a7b22f4ce72c4c8e9316092c7f3e070f817ad851dc4613fcffaea815706f72d903590b464ff7e4dd627295a7b4b371765ac85e6d7c89e4c2097b83c3a9f44a17f480a547e184777d8121688bed5b812e7d7bf6943ab1421d96fe795f5b51da6ce2f1a457851a2cf456eb2be012805cc1505b47cffe0857940e0033ef6dcf4b5f3572b17e23032bcc4b9886ae0a682db73d2ffa25b0d44bafda49597ec7b4c57955cc74c5a3859d8cc7ef20febf5b1a96aac1b69f395e46f660a1921151486f40aac79433ede9aabd32b9a2d718a34be801d724447fee6ff209d086b2f3d5723e9d2abad1ea7779e6f3beb342fd87e934a93aeb1c6bccee2a3d9dde6895a1f6fb94bf8da68076338f74c6fc46564e1c030ab2b42fe53fec2665d2423c1ff522fef84cb6ba9830ff411c9925eb0b410bdc8c062786d690916fe735593479191ecf329adc151beb068253fed53905a8df479700eb282408048c2d8fcc5b8b5513f6a871a8c0eff06fdd81bfb4392acbbfcc9366a91db9ed6e059da742b63ef129fbc498c2c2fe8763d70ea26bf263f1d4f4e801086e7b87f663a147644f78348767edd9d1232ef70afa6370a26c99634646fe99b1225420c52da035da2d226856c28afa7deb698a8bcde6f000b0b26a3c4b3ef64b412bfe02eb023a4b5825d3bd9205c4702396860fd800ec2ec5984cde890edf7fd4e76ad6262e1e60d967bde561c5ff4fd39d34bda4192ad4b33151558ad71df5e172ac69648ea9c0b7d270f5b63273c50166dcbeb89a74998367c3c9d602795473b30ce23089a313fa4d33161ab4e778b7d8c6399ce990253c20e861f3f5b8458f92d2690f87d303abbf4d7014b32510fcdd3957d9704621e6460a466b1aa56f3ff745288bf00236d012072a2c97f336d95c7f40f69660358ac06fa0c6d8077b8acaae442b2df854742da96deac81a92543ede1b7bc2a4082f765f968a96a51079f355e877a47d069cf87b60d7af62cb78699f10f15edc43dd50245041be48d7125b823af8be59f4525bc42c7ab292894ac60949dfd1ce8d9c3605f772b7b8775fe87d6235e353c59d3ecef85b3a7476d43d66ebcd83438f751049b3a6e9bd9968838d89b77c35218689dfed03b0ce381db7fc2143dc02f16fc639ab64bc1fe53415fcd704efc5b213244033f97a69772d1a1511ca44d55a93401d083498a502cb841073a6a6cc1d4ef739f1c5020ddc0d50f7e3e9238272e8673df19ee5199935ba12862507110d3feb114ff0ae810ec43feac029e1d2e27621e08f2b0b41517a9d4937077c5e28ede6127601e88fb65ad138d011e68d5245574f0a6272e5d3a317ffafd66c791660d1828e8017fd7cd8ec273a299a7b695ef2d389cc82cfc7b80f7a15193f2b80a095aabef6a29407457a0127f96663d0c8d8b234efa4c6d3bf6c0492595c3c0eb618d22feaf31c00a9620cbe0ab00f2f8bf33434553e91a2c218e34e1d2d7467a9444209e4715d0e0c8c9128e3e1452db029a3b186baf9dac8fa5f70ed199b34810041736c841fda77e0d78c0c62ce723d6445d2097ec624dafac2215188781c463318950b94290cf14628130e9a72a73d8b64c065f4c027ff005288d2e2d4c801c710984809444b83a6cae470f0f874b58646a32582ae8c3ff459cef79077dfbaa36fa4ac4c383f34e80629bace2a80af3d33a2ce925afaa2be1d1a49f8290a77af7de0bec3cd910cf42407759bce74329875e5ea8b8a1a3147e7954f83b2f142d3847506d7cae913b26ca828beadf7477f539500d50794f375fe669199d93b22f7ca8b0cf0f9ee520b26345ba18fb2f5da14da99d8990ff131acb797a367912003984859772049d0e599d296ab3c4c449101db3cfb0733316437adea07259a42df36d774d208a2952a0eab62447b6e3c8c62c171a91ba9bdf4e872112fd8ff9274ec5ee56b799faac0cde746d415c0e6b37fb3c1479b199dcb072e94814b6718a8020635a93beb16911eadcbc3d3e949ef9fdab23e502ad7cfdc08fc67457bdb64bff6ebf3152ce1834925777a7b926d260b5ecef6028575eaae29cf488de3e3916d578fb3d00b14809579d55fd5625b410c669dd779d27e03c7b9988cec4638155250a950342fb66f4cce6adbab021a29e81aa64a7cb8fb016ddfdc9a2a4ce3dab60ac2320941cf37b44fc057c319b2c4e7a371b5d5dff3cee9c325dc0f9eebc6e3ac61c117e868c215215e39e6502cfc532986814af06e51838efab962e458c3205f0f6526cd87f7b96fcceadc4f8fb872d36e17a49375728268e499edc532b8b44b5386fd9737bee75f93d36dbde3e08ecab0ddaa6f0e1930786ae476ea828ce897b58c65ef7dffe6193a5b6143315bed36d43d262d442ed3e71403c6fb5029046cbddf267d63a2ffc649e97f888013d73e629ede741c99b4dc6a5ca59fa27650f1f4e708e8f0907a8e48e79035d8ef960ae3689ceda0421b80f558db7e825b134fe10cd3d92caf9f98c0bc5cf141d771c3df022640d7124ffb3c5f2f41f7c097ad0db74ef720e8b50d39d0ab65c4b3af91dcd64414c9ef9a74c7da6a90098d2234fe4e42ebd3240614398b4538686b999b644bc0117fc242131f2f5412c1aafd0b3e3b775c4d49d8d64a +0x312e2d967f977a0a1f7dbc9bf1c4c47a94a87954c99a3a6aa3d48ecbc0764597e1efbd988588395d95cc702fb53590be +88936 +0xc67f9aa8cf1be3b4377c30c175d33ab2af390982c6a015d99209acdd6ff8934bf825f0c61275676f2d2884b5c654596f3092682895f7c3b93846711efc6314822a0bc99c6fc3503e240e6d2bd2e38d2af65ead5801b678c2a36faf3349d1ce4be598edd1edede44aa695b2cba269200b8706a1bc13c57d1c5dee2ec75e280acfaf34230e94db6cbb3a251d3c3dcc583b6df00cfcd20c1aeeee29b68041521035134734fb6d762fb969267427abf67ee23086b6c047749660dc8a0f06fc3528a69639e93f7fa4776bb9008033f5cdd927562f66af78e33b9cb177000297bb9a4ac2730883d34e8af9b41c0909223bb3336952e6716f424fc7f45a531c18cbad481e5b596e6f5db18ce2e0d7503a27522ef159fcaf347a1b0c2e9acefb894cabc9325aa6a95db7344ccab5b1b14678ff3f74ab7111cd71e791e69f3a48f128daf487d9b5dba5465b60f40460d44d18028e7cb00c3e4411fb7ea4d15eaa594683f2a43e4fad4df06ef0e833ad6057eea34490d097dfa1419efcf19804cac88eedea11f23cc75f9fb4262fac5dfe6de22a893973d89beae81933535cf24f46e86205575e44d0e23a762850d53b5595dcde84fd01991b29f0b44a5485f1e2dc3c286bfde92f71dfa9fc1ed3180e0ed9c4095e67e2a0066540b7697c7bc92b907288438bfac4515dd48e3141dc9dd04182f13efc7eb505a7c06aba52a642d16c72cab58afbcc1964a374882088b144d4ffde4d463ea2c0f65815625e6f247d782436eb81531070fdfef54dfb8612119a211ab3cc882ede5af0ff8c283c36d6bb71140af86a55ff2ecd5ba5573d88e09bd1ec9716c52008db70715e397641853d3fab3d77a8666d01f8ecbabe15db59e0f89b21ad5e41e582c0b30018860d31067844aa87750a637e67f1b4b776d223707c707b18b9591e56c90d9b4dd262831f022779af390889ac02b1bbcbc837e75347b3cadf40305a5f71c75761c408238fc79cd3785c298693b276f58073d04c923fac398b5a8d42a6a1285bdbc3c6b85eadebe0694635033b5d868d61df66fb344ea2eda36e397d324279d0433666ea949e5bc70a5ff4a7adec2aa9f375c09b415bdf11afe6fdb40c3a03dd2287ae633a8135b1e3102d1bf048aa72c09ba8d5c24da9cb37299f8f3a730babfe1d67c8583dc2c57dbfaa060c574e0f4fbae451be0e4943c49fe7b5c6d3dc62626059c4f4bc472c5fd631110a035ea8283b3db63d8507a3ddb09fcfb744bd29d3b84bfd18e50f0d11bb8be4f1332167d4847bad479a2a100bc48d8416adf528db8d061bcba061911cd88026c9cfe072daff66dde535fcb4d5437b7deaf5cd88014753c716d584df0793d77f9abee3f1c213c5ef1e3ec3b7c3952f623b068d71cd4ef8a9ff6cc1215a565a996dea720d1527628afb9dc8415d2271da12c77d0ac80bbd68914e607c9e88cf19493ad5ed59a50357823b53782c530b8d7620e47c79e46cacd161a91a5a90ffaa379653bb19f471fdbdfeab87b78ec3246ff90cee6942cb1fc98ee32316d8b2f23ee6369cda7c7425b4cf1a94863c6347053a3b891e8ea46780be58bf5ac7af996612c4ba26a5d3776e97e6c822c6b19d41ccba75222ebd2cfed74e14afc5c048b703463d84d7589af33c584a129276cf2a95d1d9fd8cde174cc20e4d9c3aaba73a9f034d7d7ac9374ba8b843de0a7984c87ec7dd350ed1cf7168e090aa8e395df6cf451098f6eff57fc14eda0f958465246fe6ab541e5dfd75b00b055f2a3213f37c52b15db3927d957161382c9a5d1a45517468e22349496181d9d646745e703a8c7456541a7a76989e3b84bd83cd4a340aba3f65855e5a3cc59028e4d5851dd2e9f02806916e898d3222e74bb79c9df784005667ab64d90e637926c3b66ec1c379114efa81385e7e145f895d9e92bd98a58ed56fff236ddf43dcf56a7de20516261ef0b8539e9c722c3a917ba0774f1e57abe506e862bfb84d01c06194a991d2d65e38c96d69ec7262fa272d2512fe9281a0aeb2ceeb77a0692fad31618b0cff731a4cb43961f5859ee975fc952c6ffb0bb657fe19843ca07fb0e4614e501ea6e49b54011d4d60b3c84da06f588d4d61dc32086f32f6b6bf77ca8e79c1bf70ce1126793983f6d404c86fd30fd6fd3ecdde5feb8f7f088e0539c6d30124a1aa7fe206e2e3d225fa81869734627844ea45f88425e569846c7aadecda82debe74c13f81b98772a07a31eb0debf2a429fbd412e8e1f95930f727bc83cc8457de749d10e123adcb2ffb1ddd182147c376167f15d44554b5d6d8134cd5d08df7c9551a3d6c4ade459c254b4501fee73ef1e550e790797de63cb74646280f272646bd41ae6b56a148aea1c50c11a95c7b63104e7164a6fc552b3ac993c5b1d94c1f55194c256f7f3c2c1793188d4b2ee4933f819b98f45a696a0ca319f4dd2bd11ac4aafde4bbff89df2ebb53c00be3e04b19f24e738a1e89c3d3dcc2fcbba61d00b2fcaaee65a9978f8f47a4f11205d65146a8703e91d01ffc387d752774d19898c9183c8d9305ce03e23ef267871c306e6fabea4230f992dee28d1abb3035abacae0599066e9c9705cea9276b93ae556a3c04a5c490204a317a1498011658bc020ccbaba41df5585bfb8f2a455e45ad0d54ba880fd8cdafbda71bd9414fc43564897358aec8987ace12f8e33d0f68a01f60d57a6a3188294912a8c4c302017c98cd038a6b990e6626bbed3a9bcfa09667075e651cc3da209f62c641ce5895fb6681862824b6de832b9d7417a6c573f7aef25c306eb54afc85407a38ab790a18984d011a22479038a5619862a71a6b2bbcc8d7c3a8306125c454ce91a38ce83df4d87e48aa75adef5bae5e03e6f5109a5932d806125ba5032445c934fcbab5d144cb049a0767bc0f162dd0e2ab7fe9ad4dd865e1f35fa0fe6cbc730afe2afb3c4ecd9cf87f4745009e86f5e83edf7eca5f61893c9563da7f6660d5f9f30541e5db874d4a5c3ad029bb60d5fbe63e575b597649ff3e90daecd8daf6ea21721036b2a11f78e46ae6f435637904edc4fdc601beaf12370e28af8bd1dfc6d19aef969dc21a6a60ff0ec8d338e8ec9998f77520e2c25dc8044c2e47ee96734ca4666d629247081721d10d5e872a9933e3cdce7d898ac8389aced3d3d925dbd7b9fd24cabbad3b53f6b62c9ff748f502cc083be25c103cd1fa3705f93993e4bd013d219de254e95aa9458b5b3149e7507c2f2215025b9fd9490f2b7fb6e97844a3adcda3b245fb766006935ddd3556631bcaeddf2473db99b2dcaf2ef92e7eb6c8d690a3d0875aec4382ac6ca2152c85d06103086a61d6595b28f8ceaa6ade59973ed367e722ec077c403f4f28f050fbc37dcc587b2c7a616c7a6e2771a68076396ffcb59d1f9b0e30c8b2cf18ceaa101da5b09700dcadf80e5b7900f4e94c54d5f175569a854e488aa36fb41ab7220b0662178ca07a596768528123de3b2a3d944aa412875cedfeaf58dcc6d5b4a033a53b6900040d65f7a4e7ee56d5a402779e04f3b00cad5f79ca6f63ccf2cc0cd223b80ebbd49db9ede7a22862812dbc4b1aa6c9fad07f8efe01716b9018084e2ea7616f85b7333d945c0c970f8cdd400130b98db67cda61d87ce55bd8f06e4e8f5abff22655d5d93328aca4249bbd76e10ac4a9adb7c6c04d64539d6d2209f53f64590065578e7511760ab56b59d34633cd4f84a72a4c93a7e143981755de2985ecb7020b6563f9776caf34aa6b29993ea4e3866c7d73c22c1a3eb49d31f7d3a81a625ee0265e4dad322287aa7cc7554bb50717c35744362538cb59c9605bdcf117e17eac438659fbf1eb183332b364a228439f7560c5d5d96273ef6187122aa80bbcc83763e306a9d1934d0d35f7ac8b261f864b41008892c1bdde2e5125a7151e7ca6492f7e3afef9a190ff2e9b174ed724340aa2fd38967d318ff8639b397f76a87fa94f5ede43929d48d2c5a58c3262d9127d2ac3cb2fbd576887687cca303ec8ba206a8bdbc1c310dc4ea11ff280efc6866b825a2ba2a9b8d2a206d0416e9c65c176280e17bdb581b63b6b103381a874f99b52ca3e3a6bdb3613e5a08682b806fb7333ee7c828f783d61ca81367ab36ad4d6411bee3e2848faa0aef381b4bb33d0de3033f1577a7dd9886779e3b638307de4f75621f50b88881209d21a4bcd74a881cae65d839e19f277e900227c604f5e8d1d83c1a8392246309d4439911552eb22a70eaa4f22d3f0f7f91edb13524edd995ba8b5a0dd9e9ec41351c6ccbc54018a6fb3bf032f343cd03fdcf6c437b564cf58cfe5221d85f7941201a945e9035381cbdd84e7ecc33cca62415bd7370d5af8bdff3979215eb86a435dca44c5e547cf6395e142820859ac0b56f39479dd27dc314199ec12b14b0c4e6c11107884463bdee2be5e188bfb40e122a44226ad32435d9cedc218071742da3767f32968b98ee4cd0381d7d58b4c8dad572b6506e5f5e8181d445ae684d68fc4b233011706901f5d98f4e76d6f99b6fff5955f6ea7b97bbd11ba01d9fa8e171ddc19271b9709349a65ff6fdb11ef052164c93c6fe159be94b26c3465e134174acbedc3fcd2c1ce8c53e997a8d816221a8e0f2391f99b58a4e6a11c14a18e3a5169f7ff402180933c48fc895b2bd5b4f259ae3c5b5848f2f596a2e16da265253c9c7e0171eb0d2bb12d7e6a7c74f563b1aff0b05566283390abb8aaf84d8083134eccf11697313ff3ebb865931a3fd960771ba7078b02c47c0b299f3e08a9fadc6627f8b88fb4770b68f29f298578bb07997848fa309f4cc1a03deac63ca632a1ccd83ede3a5e7a008e7443c51c6bb4acfc4fbcb5bbc87468503eb0185240d5696827ea1000f6f1da448577f049df6a598ae82bc09643e47805721cbdb03f883d225b24d7494683a2716e6331749b85152a8abca427d843f9a623533cc06bf524e2be16b97d14d95fff7831100368aee9c47f97e8d8513af41b97801de98cc4269096e54004299a19d5e806155f0e8ddb410de5141075706f4c16c9e992699d4b142cbcf4474d6fd8db090dc9f055c9f6877dceb1360b8e7521ea562725cb269c56c8c15cac4700a5f9226bb31e050a3f7f177946b4dc3b0b825a505f097a0a203eb21c009ce1f487177a4b5c52e5fac011220f5bf1b0203b57addf1aa63eefdfb531f66880e1f4871d5ad34af2be3f8026e8b778554ee40c882c2ade64df7ee2a18e771dbe10a7acf30a2b0768588187a4af9a2648803087fd1f5a36ab245e30ec12c6a6c036b6fe82d27c1b1a7b69de75c0dfec320cacb29ece96a7e3d637d17c020c8bec1bc885b0faee0c72ef9e8c7f63af537bbbff97548007bb74bdb3ce3ba97055ac86864a66c9a864d67bc999acdf32e28b55d23e057ed5f9c6a1782e0f4e1b8b674197548d88d3aab0e9920ee27e8f21cba2ccad9a1127e9414a2ef9e23834b58412a5ab0b80966767ffa0f20b86ef98a16a96eefc7f25144e807e389bb0e45b6dc25558caf61a2263869c4d0e4079d07674d7091110f901530a10f222fe530689195162b03586630c452d27d3f45650b3893804c30ec838bab18b2f5f6aa83d40de41d1a78403b3ca06fc8942eaada0be7161e9f9bfbd42e93d97f73a3c0c89fadbccae962ab998058fb17a4369a74901f4f9c09b6dfda64a76dd539bbba6711fd69b006470cf9c25a9f303beba6cd2e2d9a98f905eb3ec4323054a6a309f7d179856cffb9e6e47921c6a2b9b2623c3cbea1860c2da059d3e0eb7e58fe31e354be9a42342fcbd20b4b0bffac2f3f5a523edee3a182b1b40a2fd9a2bf21c4c2221902d0521d1e5aff42d9a781b6909fe52abd5267a981e5dd7b956247b2350cb02579a7c80670d7cb85aa2ae8fd28859c0ec732ad068367d450a94d8133f53b85704939147045e10690080a30474993bd578705102e48a2754b7fc50a0ba7d728660bf4b5ef100f270e7dc5f6399652ef91675a0f95443e36c8a35930bdaf580f933c7b2ae761aaa33d75ceb958713b994902a219b008839f549e8a93de8e46a164552ce1ddad4c11c98ab4e8186cc650eac36dbd12f82b257bdbc9b1d2b71b9475d09a8946757be92f16f900ee0b8b8cf3342d6842a59d5faae5a7092edc5f4f3459447fc63cb29fcac51ba26dbfe3c3fecf51b9a3a342a46e46930867407a381c39ab33b17588bc48ff8d3b0c1c779c6a1f8b1fda53b3aa42692e3e00a604f5ba0c3f53bcb246a51630de393d83af6cd18f2a093b3988c7a3d7d9288f5f87fe8a3b914e2c75a510bef37f3b969803bba1a8cf146ae70a931f2d145657df6bb909621181a5220c55afd1f0909bbc0d0f76f6eabfcdcee17320b360261ec838bbb3fa60acab59e50a6536c306b18233eeadf3fd69f873760e45056d36388c678d168eef1da39fe7957bac76dc7c6d10cfd32a77b16f5760bae8bd6bf549be8093ad7a1d5312365c8d5fad8ca050ef1c2972f50a0496ed1a1fa8261ce1a6b10c75f5568beb9befdc689db464e0e38abe81fa0df50203c70a92ffe9d099e416738a6a9ebb55951eefad925ba01c88c2907ff4bff9083a67cabb4c73277c86415e6789dd1c1f92360ed2e9fdbec1c5290a69ef8566a5af31d30f3a5c921811e41593ef7c2eb817d7a25f1135216f2d10b4e64718ce58d6c7abf53600a0dafb513175e80683adaa7642c8847c6883352bf86b97d4a090459bce03cbf9c453b72b4aa420068b6eae9478a5d03e048c51dd7d605e338dfa8020a1b168c28d10e9d4c9a503f6d679a8b4bc5d6114860927a79c6b06cfd6e5fae8df94a8d55b70f7e026df2041d56d3d497675d38a5d781b1cedf22e041bf12a66d013e8bcc01255cffad8f18208a7b0e54f8593f9fb67909fda8c407aed8aa33d1bc5b4d34b73a816be18e441f0b7b7fa9fe32efdf0464cb2eaafca8eac30d9be1b0099d36df35336d92594ec2e2bc6fbf034f100dc929408b6b338d9d882526c767b1417a83fdbb2d4757feb0162528bd8e1a6ad10eb0ad3975d27c702dd81ea869b902a7aa7c61d488f01e92af9df1cc28fac4d1dae15d63503f3e0abc10c9af3c8ba8655d996c8ade8c740fb60e11145757e7b835a4972f82e49b153cb471016a8dfb5ea33c2676cf93cad0325fd1bca69a9c2c27e1a2c595285a36b6ac5cc97b29c337844dd5c1e56de67c2b7879ed9a29a9d5b980c74e1172451731e0d22df5c6c79b08b5c292a88390bca94151cebd6dd65df2694ef27c2c2260b5381d5562cbd030385a35129f3b9238b5a2a08896ceed69db847fd860bdbab94b9c846a49a2a69e1b25756952feb3975683b042adb5b4a47abaa129448dd5c8f9f44e9433b2118eb9feccbe4935ba8295ccc7258b88f5b3d9f1fe0cb1043b38c928c4faa763d9a81bce80390d4670a078652e59b7b076410012dcaa2e8ab3afc3202ec52d1dc593487bda04259b9d9a0a362d05b99600f4f506842b438706d5eec4d41c4d489ef848ef2244199a091750270b511aa15a74c2b33eb67863fc5452fdfd28904c2c7e2410a02472ad7bc05421126661384e6a6f03527356865dd1f7b1f2117d9237cee3c89ccab73bbc3d1d0a886c16c5a27e02dd078b6458f1f7e6c9fcfe9d80878f8dfe5d5e70ac9535b3ccb68ac2af1f578528a6262a42806b262e6117767fe36a2b9a2c092567cb501f4de4e9ec5e8d9effce776b31aad1d8bfc6698692f81507c48351f25fd6293768775ab11c3ab4fa79b6c28300f9ade4ba7b5e707951e30d60a31443a560769296305f09daab5b14fac8cf962098dc371e348600b1f4162507e1bc21806d7908b2623c19af194c938aece5cb17ed267af3d92b5bc44776f6c22593b67765fb42c2f43a0a22ec4d20310a4e4a6f625355415193ac3ab4ca299857df2a12b1c4e8d1ce9f04bc8c2763f80a503caf5e2a6f1186061999a1dc659260e9a5d9b79ca1e4d8b32e0361a203e6d434c9604974716a5fceca6b787253b726f94e55e04b1505fac0b181d485a904514218098af90255c432e837a0559a0f92574d0d9498ed3b1c0cb5be4b9afc5967c152328b81cbd99d799b86814de3a28c4acb893c4dd18f26e061412fa7a5edfffb9e64b3d474fed2ec0adf8321d679fd1bf0523e3068070084dd92e9754bc8023625256ab9a4cc4cd35eca0e9b1a9bcb13e3ef040a5bae92405239dfcc97f356bb0e0018fa034cf176becf8a815810e078cde8f4a25189c55ce8be7b733175e5d2827a255d3a85aa1c53775f9c37e12292d5c678c2f3a27f1fc6aa2434c05695c2a91dfaabf17f600e4549f5b460157bab2410f730e900a9d3158541d5ec9e50d5aa70fdabcf43f995bbceb5917ab4d209e14ed9b5daab2cbefcd53c1f5f56fd51aefb97277dd85ff7dd8c05fa2ec70ef5350985196facee28a4247cdabe86847fdc4730e5a346787cd40d4eb8245419b748c765244f0ad95b34f969ceb434cda75ddb31afe8962e6ec8d9f9940366da974113e09e22cdd49ed5dd6bc2e76abf11583f004bf4cf6713e0766c53740239dd48725e4e92fec638af57ea80ff2f4404f6fc078170f90db5456e11c01e321ed0876e47fd45a39972e9ef4ecea58c43ca5f99ad1b041d079a1f494fa2aafd71b9238e0473e3c73494ac2dff758187a5a9ba9e59df57423d0a958d8dc0bf6c1ae0475afb78156f7fe61f9a663d3a2b50ea2f9475971270974fcfc435e30685028d195b95d483a562af6bbde9ed787d2dd4e8026809dcaffdb0f675aed326520f08c1183a4ed470c539b71ef14fe58724b10a709afe5e08577432296058c8db2a98681a53b0b0d990ca2c46e72927501ec7c066733d40828de4aa67b33a94273c8736e746c0c1e6ababf2bc3144e6e00160306d5b902926874887b70f40313e2b1b52097d47aca1fe2430083968cb40b7c2820cbabdc1fb2ee8f0a1dc344828e19de5085e0c1c12727c0eb3655c7d772635dfccf88db109680b0eae82dc80ed4454166a53d9b740edfdb5441feaa58d38036f347dc8a1581efa0965690082963e8a0eb9c374253358ed4d43ced8eb8bd37259ccb13638f139fe084ff96af62bb685f47c16a60ff39c95fd39d9eff678e1ccc61cfd9e1fdb9f5d33f29be182b2938ff13cb3371d899f3deeadaaf76f5c4957ddadc7cafe1e3a5fb3d8b52cd135bfee2d8004eff6fc4b2d4827a8b8fd3ff35cc70678807cc3f04eb089b11489bb21eacfd07096435487ac322f3bfa492ac722abaf798941d0ab70518cf561534da1cd00b45ff3ab993a03d44ecb84fb24adf3b23131adf650520fbf68ebdbd6f227dde7b539cfd7d44e7b570bc01fba368d15031307b34348cd7122a8f949bbb29b64ad5a67f26e0daa5ae3ef83932e674fd1c8dd6565cfc204dea1d18975a995e5a8792c4f24194a36e89f817aa800bfdb6f2618b28943c5dfa0646d022549a4eef274b25a2d8095da6fb4490e25d8461937474b55e8465a46fe9403cc2243e69c89c574f0d44af57e354acfa7d45d05f27153feb84a8188213f591c4f343e64d8b796fa7ae220730a83879cae7b38034c6471b942779b5758acda3ff222e2248bc20ccd5e20a91566a1963789e311481159ca055b363dcfd38d40f420b6d8309bf3517406538ee57bd79d28a2d48edd279886696b500ff97a2ab2c43eb6c890f2928d77d84676eb2f6dc5f860165ac97869cc6eda8eb8dc36ca5935b5eb594a76e7e75f3ec00a2e6baa352e2a701b14ea14c49a11b6e180edb65dd1ed1d3468113988b29f88f2b618d816526aab7ac767e09878769031ee8837e5204e1401f1aad298fb6367d58b1c3d8fec878f1ee9d6176d8d72e6512df09319a9419767ee28f83ebff1255bb66121c985e9e4b0821eff6e636e7ee8450b1222f42c700e6675f4a288b38a2d3ecdceeba4f872d79b29e0c081d0219f3fc3fe288978659f61780eeddd105df32b4a8b1ed21c013c3ade048e6f01971e22ff9d52f18e3fc2e8198d474770685485bf9f8a96bd58866a25b2feb66aa80cf6a739c9b3d4c51e0140bbd74d3b71f9551353567843405e30e63138dd721c12c4a218b557b4c15cb7d5dec677da418aa330efab0016816c9609ca656c80bad793da823d6595f9230fc03f3b4db3a0ae75fdbbb0b79ee357a377c5adebfe4b046b36c18966df371c13e9265f582f560dd562fe8e24432ec85f166a37e3539740549e1cc2e2f941efca39da5a1fb62a50ca47026cd06e2966d3cf002cdce7663457fada105f4ddf433c96a5532ab1e51f5c940d7341859dda068bd1b35c2280877b32449a6742dbc072e9cd7202864f21943168ca01f252cb003023f5ed6cade2c92fa2898140fc0f731b9be12e9f30ff79075b9b981b10e2caa73f1a162db4ed47d73c0436af09d8471257c53662506114fc2d0b8c6a9fc76bd96d4960cd5e4fff1359340cf8cbc2f7b84949a33977ed6bf928446745c621ebadf5aa51b473b1f9cc42418d810a768af4b992fc8b6c4e89e7926eb0164e98530a1e66734abbba3ce8405241b38d9c08adeecbc9c0f82a73acb4b0f04400d5aada31a54ef8fd13d051998faff61edb7acd311a9340e32a3332d633ae37a280f804768e68240363bded95215fb383dbe73bcaa7e072f5f5cf5f401f7257fc414670354a4b3893530ba67e30d950854557df019b3bc0f534521d399bc50cd8be9b06b6007f9a768bc3629ae3a637ecc1d2a11d1e2991ad8ec1530acf2dbefca2ffae40d98ab474b2ed0b33634dce80f661696857344ee3ac26e9fce434d531937a501dfdf6ec54708f888fd8567f098d0b1f286fe35d603588c6550262b93f3915d493934bace06fb3c1f6694ab14e2dd9aba68ebe27ecd2f0d45d503ed2ee3ed722ebc40f5bde54609eb23eafcb187fd1f52ada4e144e2b65fa5ef750890647c9226db7cc6017ca9f070a8010372f2bfee6fc7e1a8d50e7ef209e1f20444efff1bd60950925537777e44557f25c5bd8656463a0abf8b8ae962e66ee376c8f0b59d90e854f115903f01daceadfa2642e1058a96987be4f2a630dfe8f1c6a9116095fbdb0258cf317129a87625e7111d706ab14003848dd015da3ae2857a41cc60738b63d13fee75be6441ee6f8312b784f43ed8d46fd2adb8dd9bee27184f8c35d4a4155a1cffe767301b89f334a7abcf40a7b3a3744fd61f99875e4f171ecb6137fa52058680011c1ba9eb59a25c648fce7082d9587203aabc61d575fd3c2472fbe2cc5bf2fb5d3d958194fb228d7c76fc1da8ee72d590fab4cfc624411401dbbee1c6d5f8de565c2c16f9505bc75df55823a86b69e7188ff135a2e26952fe1bef9be3fbeeb576e84dfe8b01a4a6738b711703d8941304cb10281e290c6563a41c65a6466afd4972898cec87938767b9c56c4dae8805d04c900b8a7070c7fd14b3d3803df432488b5d66704abef6a500d397e855bc2c2574df746a515cf704de4469f45af0d0fe83380fd8d37d80b5e11a2e5686b7025ee47ce74034177f25814c9d95260775d5fab7ed68ba55a204eb07942a89ff04f70be6d8aea136ccd97e4ae2c517ae7d59724b83a257edc73c7f2a6dd7080ab0886bbbcd0811417c9b45bdde16a83c74035a615738348c8ca72e011fee6950917d845a28df1cbdeae57823f3fc7057e66e43980c8ce8e85eef781a3ed326673460d640a0b61c12a43275fba908d87740f4ae6de802ed57ba7fdde42f17d7b4f5bce20d990fa7c6451cdfd371ae79211030fb418e4caa712bc2cfdd754ef5d061fc282f865e386f2a0f0619f27fbadbd09dcac163ccb8bb2f72ee84b5caf93015a92914fd245673ef83995d8fdf160e0eb59d4c0d0580ac31ea8a78452e6a5a7d4e556c61e48a5ae2150a0cce4f233e26f2d36fee79aabadfa45406c7ebb1c5f5464d7469313caace2dc8a612626af2b5e00dab9cab9f6d853aabdea27577e93a4b71eb577cf5e9f05865b810ab45b237f7cc6d7c2dc73adf18225e596e156aa8a8533fd13a3e7ef50f51c13d7c4bf339c470442152bab929b7381471482290ccf761c04afb8ef038cd1d5ffd68064c17b099ce00bcf25f01b25d8f7e76281203b33e3b49336fd4581c48c2d4f0ed137e56b949beef06930374232dd57a8e550956490f306449a1cf6744b8589968efba214f65a04b500b8b86f98e1ae7dde04a7b129ab510a4cf0b48919eece4124777aaeca05974771f2655610eb3208f3a237c0b8c3bdb19e2a84acff5364361a1135de1683edce4444089fa5e32d72ac930e3c4423906115302c850399949ef8339a4ee4be4e71021867f25cb1e5e2913ff4cbd6b312413b6b74bb30a9a6a1474473a63b9d045832d54cf53f3da3812b0eb015755b8d7a974326f78b6be2668eac868d240856ac5ce37d53556fae7601690cc329034733b12108e01ec7901655d29caca5e78b9508aac2b2a63050ea9bb6ce7dfa938995126be41ff0a6f7d825207cabc922ec3abf92e5bb3b66cf05825ebfeaf1f39bc8418b805b09ee60d584fdf03195a2c1c40803ac151bfb74ee3dcaa7b3150bc5f3c6e7a43d72891335fdd1bee6134d525a6c65e1684ed587ce54614e806fc34f3f2ae91a6c325d581f1505af744a0ce62572204a5eddde50cc508a7bf8050480d3f4f7a991515477bb56ff8b8042c8c64da29cb09dcffc1611b8aff8c3e1b4a2d8ac7b1854d855b73247281ab504673bf98441dacd2c1923c514378b8a0bbdfb75dbdc305cce4762ac70e823b897d38b51a1789297fd1cbd0eed8afdf58905d4d30882b9523b14be505aa8703403f2fe7e80a79ea349ed2d17c91015ab65767419bbd57bdd27a314478ccec7cf51aedea8a938c7981874bb0633319d55a7f725707c3d3da69bdcabb98ec4f13188ed71f6a591d51e7299ae04b0555b9a556f2d00d422c9559ea7cdcde9f0b603b0990191fb1c90df60445038cae4192379c8d5f04aece59139ecc0ab24bcddedd299d4a1333fc080e95de7cb08469d971ae9656967035a027393cd7cc78f3096f4d5324dd6642cac16ccbce4f2e3af9f41ba2592b1cfef5154843c685bd075a7213565bd6bf29d09ee7917ac112319e3f5235c94b2b96e26e4a8559667e975c75ea1b41a7a51db3f794c3f4bec6fa20a3e0c5496f2279d282ce5602f7341f89fb501668c8be8aef7bf2e7ee80c2d11bd245d53c1f88246003324a45a0740c6d72d3dc43a2721ded9c9051aabf7c72fa3b0fea23c4c332f56014e6a40ac4ea616ce3d164dd563328c9ebb5cbd37a3c465e9d7893076a021d19f49fa08e9d36104a1eaa4ec1e1773b946368c46542b98aad8d14fc5fe33e31914ff9cdb4737bf4aad2ab54089a36907ca60f26dd4c5721b83d23e226d533fd7685698e14de28890fbe692719e70dc1f311fd65b41db1b5ff4c39c704b67fbb3a4383541833d847d910784a6e5e694a8835d7f3822d45c1f338db2d61ed9e054cf8cbc2471ae7bba7973d107e76d584bc801362b0018fb034616c87d7010b663f13a75b1a09e34efbb14c1bd2b6ef2b009f3435c620fc0b23748268dc87445871329a811977678c35dd09ef0394f287e4e1beef4d02175d50e0a132daf6d54693b439d6bde9c0fde6991aec79a7ac35d9d617f1bd2b6e013d143d985ac63adb0746f9ce8fe7ac1e9e63e3b6bd5558bf700ad3df8f136cb158addbebe47be1605c395ecb07e76568cddbf8b04724a47f17ee771b4b409fc8340bf0b0008e65810329ed6eae6fa956e55fce6b9fac0c1f61ff76376a4973b04fcd1077278443b78c870a2bfbf6d473856dc96b2f41fbfacecc55b6747485240c5fbfc3d1e3e86e68df498568f373491e94ae218e8ce0abbec39a1af288507e0a3253088823d03018a12ffd8e1c02422142b11135e376acc283c7c75ccb4248c9e37ec7c2daa7872c6b3216c3a6fdf93e1686ccadfc1a687a6b436e1bd3f6febbf197841a6ebaee049bd443b24ae2c8b58e93b66f2d48893708b151d828cb1a60db41cfe756a6df41c1ab16c26e5d5b28096c60e20d8d6998ea7624ea305b16490ee20dc238d7c5646b0b028c97aa0b1615754ebf035594006f2649fa81039ce51b0cb0237bea5adcf69889793d6563003152e25ea54d931e25265361a170f8c57e367983964aea1c02b83e00e61bfd66fb69de3969b1e132ab1ab3b8181fc45ab6d3ac8b2e660dc20e0e72cc283a24cac24e74d7d73ef8fe4f67fd763b6c8a153388db829ae8303f76ffda236a5c83ac245548c2645154d1a0929314a1e3b4a592aa7902623dfc14ec00d6bf22dfa46ba032ec8197759f4d3d2f173bd211de5c42dd27931ad3bbb2cbb5fae7e85fe1b9b45bb28df73812c18381fc24527351d9d28549bd3b4619c99483a9463139c5f6df245d5ff9f559ff026fa4969984c97eb02761d93a0170a9d4fe84528419ebb38f412f701659ff36381cb2db1dc2afeb6a58027fada26ad41b8afe85576cad605326ab56e2c25d07932da99a55b97f807f8bae38fc8562f8c6bd8a57219ea59db949737cd5bb0df3b216fb3ce7d5b2de5e36b77dad36e358750aaa50894c4ebc302e0a6a65c08c7b036d2a3b3ab3d47584edd0b6363386a38506f109e4e2135c4648c2a8296f531e05a4a92dc4b07eb682156c8b3e17a73a9516d0ebdafc8dee6a2e4eae7713fc5d47321a8d2c77fc31e441fd551b3fdfbe23ceec5ec1f838f31a5300f6055ad2a936a9d0c1c856e7781a0805bc54389a8e9fa3860b30618f0ae53b8c072aa0909252807e742ef9baf991bc08298f8e622c87293059acc50a86495c326a7d819099394a760cd6bd0126f9e29715139db12878b49dd2ad9f3605c549a688647a6d3e495c4a04463d3480a120151787031202c2fa10fea96c9bf9c7686b09760770e2015a7ce2f3e6dfa735d91499504b0f3c145e2c36369996e2ee4cd236389566350fb9913176466d0b0692182315d20344db455231bbb2d141987b7eb712b097a7b2fe097823d8671cb1cf924d3e3498ad96642549cf54b5a66468e3049af59faa998c481fb319586cb60605604fef39e6c42f1816e7dbce81c089819747b0e8ce2208ff907a85ab6b91ca0404b16e5180e30a9d017bd486543b71fcf79f9f0d72fae8729300a9eaa9c38ff0b3093e89fc718b369211bb67ae43a697ae090c684972bf637fdbf29097c9bc6df3bddc4dba0e257751401d0ce0679be4032a75a3a237d224bf62fc37c622f3ce3f55c4175a077dd1c76d65c0ab15c684cf6a872a2da8d548ea4c234ab54dbab40e5782615d0bd8d85d10223d5edcbaec4b4fad763c443d3278ee1433d5d87591d949a3d62369dafd9acededd8c3aed7d1f5055126e987e93f3df2badb821b8fa388284c05dcff8a3f90ff82ba3aed2c9a3f31a8935242dcfe375f5f2ccd8095fa4b8c1ca5cacc67e004a0a9245b70f5481de6a351065af58b068efbd9459cb349652c75eb07ea8ee490382cbe2d1f7a02148c0b090db97c0f31e95589f25831b85c721f7f9b434772bc2fd12fb8e302f1ae8ba8627045b9b141d637e5dd9d5671bac5e1088ebedab211ed612004a2d63c724b420536e8f39abdbf67940d516c99068c842fe8428ecd16daa3381a463f0de835a199678974f12d0bae3f8a5db95bc931d19bb2b9adeb545e612001b5838999af8cc70c1082df1a22d48e5daa86dd8a1b8df4f40a7d3351e2617fc1d9eada0c22cd372b64668c0b6ca1288d1f1a47d1b283e4b41d47ce97cc6cfe6398be28c9f72a90cf +0x72bfe4c4e0f6faee65817e0a46e7b720560d2d8753267e398637ac21795d72f57469ea2a0d3f6ca65d948b272d5b5347 +89728 +0x0e6c9fced82669cffe7b5a6f09dceec8f95bc397e7bd55f0e9d10c3036017a348b27ddc8cda2ec62efa8d01116dd70b0fb25f15f91b77d34e974442d5276c169c4eb3f987f249bb1efe94be3d3109fcd9e4e47f11d4c16665bfd06cec2307b888261cc2737d5ff22c6e6d4cc879b0687aa7bcd35d3a3a7f0081758fbcd562ff88d318c5b3cdc9f1e3b4672b77ca62a47e6568a14fbe5b839b868449cbc106621ad02871dd862030e17b12e89f85a95731b878674dc39d2a93298d199d788a76baa7cc656518fb45822d10f2b44dece7511b6c93fbfc87ca8405007da66e37a3e4b4850ecf08a3966244b1d85a85b5db3908a5c5becba3e9ea838ef48b14c6702590e2dc9fd7c1a9ee5ca607f6bf9cb9760ab46b2ab36a0f333f790c900e9f71f9d7566d3c08ce06a2cf4e102d7df9e8748c28f2a44642b0fa936f3469ae2b1fddc2602f480e31231c371a7f4323661ed127740adfe6d665bd29c1ea8c8601e04e1c9091387a8385a70eaba3fc525993084715f222379d93d76d21bd5d28bc49d730584171b04db4ffc0723c9d8d5d0b86759f770f9af0d1e5c7ff2b7008a2d2e59827aea851f82772f6fe97cb36e8ded82d60d81c93889674d4ca9359986e1215ce9f3730d20b53ad0cb143e9d1759379f91ab3cda3cd57e11e04a36e7a666dc44e2f79afa30fc00a9c2adf9e0f8bbfe8431d88976e27acd70e5dca4301346c9d9148f479676e03180fdba94c23a3baafa5f9d50e352ffba32006866bdf4094ee228c262271be8351e2346f78c0561a3c9c301796ab5ecaf1edbf564d67235d529c599d3f6469d754bdd560a8580b651b9040ced5333ca13fd1e8b86c3b554c574941a824b208557ced3f4b5f7d4c11d92cbc692e6f3204e977132b4cbe4ed868c3d4f586ed12a4471ac27e028280a6d1bbf38516b1e76c8b47af3d6372789803967403ba68014a5fa11f87361a51aaa1d89691329db55e81ce4d5d44fa8af1b42baf4143c55c9e032a96d56ea73783d61d061be695343189655e1965b8ce7bf71e073cc7879d35fe11d91710bb9ac8cac3d293b73adcac0ec751e04a3febad48c7ec549a214ba88cf1469ac0ca03f01c978c8738f127246e4ee94076f24aec25c3ff375024d04c5c337fff0344fb8037e28464d05aac21347654b8506264df1a9c80337e04d3b7d872e5a23cdee9ff995f5acb01c9c428fdc854c67b12d1fc93bc40076833ce617e1a0822f1da77d4dd48901861d117a226df39e96b861abb3d9d9ef1c34418efd9a3580fa6da0d96604894db65030f335c05a49f963e979154dafda103b84ba967a965b6e04013baceda09828fd22342e9f605677f9ed11585defc83ae02ef24a486b1b722cf32b875674ebc46c0ec577d0adccfac497fce5d241c2826b67bf81ce5bc9ed2b9e325f08ad4d72e51d2f761beab3690a0dc123734ccfd02356a7a3d20f6bc94a29d79cccf4c71aaf77f9954abf13ab1477e8790ab9f70c512434181d2f0cedd1bca3a668f160a41343ab3b23d3f5aa2afef9515d2f421e3df8ee497762b14108811de6a44b20f859aacecf70cf604d94ca7d123657b9ee2ffb5c9ca75064ad369dcdc24aaa0ffec9d3e9bbf75a5d7c9902fc235bd963656f55067a77a22c19a53b3ba320b8369faae68466811df31f82cefcee945c4969442d744cad00126d9b81f0f2f01a9cc1460d2738d5c02a1f975707daab8871e3f8ab2f7812111c9161977315807b494de36e5b99bdea0a6220c5a44f6607e5bcd1f9be686e7e546d3fa64c769881462cca31a7f1ff439cd165405cb58f7eadda183ca98289eec2ea7cd6047b02d49a44437f94a86474e754aeefb575ec98cf27149f79302a0a6dee624e228e851d4d7f9580a926b425f3d442fa39f546fb558a0f47b5d91b7a5d6237372e16e80468c40a5b6ed4b7fdc9376a8a709e644f46ea4f5fe5e422e59a2f44b8b07bf430f2fae8396b1834a570676ec7e1d8103dab311d0d91bb08f42d3bd1fa3124714af30b7841295bf5c5f04a96d8140c106c8b46c17942c5944e1d702625397b27f974de029c2f06c00452ca29e591a02d86ee1183cd7f6a909b72b58a604ee7dde67b5bce71057f5e0a9dce7118e1fe2f30dd7aab2ed112c28534f147d3fad05db9136a23e934309780d93db4978b8cde145e6980c6bf25f4b26c0ea3a7c49e6d1941f34b2c437f320e0f013b8a17b402da7cc64bbdd10becca22f3e70434bad6ae0fde8c61bad6f95b46014e1a0ddd622a3c79543b8f2d73765c885a11d38a5f2184132fb0229cb2108625356ef66ec7aaa86ae36782f1505e24b546f72877d21aa87b7b42013926d4d75537b05ad1f905c782406931c04d298162f1ddbceaf64084fcba3fe2151d5042799d05bf6dc0e1a1a7b36a2403307f7c77a4ec1549923c1f7f32cf4a985f2cce79b097afaae4e73fc28392e420c20a1bdca74cbdfd6fb582ed2d18c32ab30f843db58eb1f02cbea8bcf908f881cb6f687a42243c6f5554b32cf145d433e2a16aaef7124ea7610ee47b5df5e88c13596b37bd9c18060bc1bc26c67c061bb58b8bb2bd490c374b81fce9f7803dab616e2bfc5fdedb295ba3a4c1f6e5df4af175ec324e5e7609b2bdf7ed0ed27e457e56b0b2720f0c420ba374e7c8aae92861069717f37711835e6add6eeb1233c133ba023f3c5a34b8e468337f83f0ac1ecce79347f4bd670e1731b756d769e58946422a8d06e5daf3ae9be97170e2af92f9c0e8ac9957ff13a4ba8c8c18ff1b047f952f8217d8865b31e39fa5d7a57aedb1389f2d2a6d61f8ceac64f8f6fb5d9aa85c1908b95cc15834e95c0200649598bcf7beb1ee2916275daf4782bb8533b3873ef0063299115281542872324589f9e2a650222eb1a506196d3e12adc726b7e6e4bd63cbb601b1decd0bddb670dc7aebed5a67322d96ffc98b509016e6bd0e8bf58809ccdb16dd14fc0e29d50e19829e73e66842c6727837b486e43c0d81213e1a57df7d32da3eeb88383fd447c578c4e1fb0da6a3bfdb298ee6f66862f856c9fb34cd25e0d43c2a1a9207fe426ac625dea23ea5ee088f68c17baee10dac16f33f26bb0e108c409b5922699a288fd38913e2e388ccd2fcbcf64af5f13725ca838f36917ee88bb004eef24eef20bd07b827c3e49867a78aecd55db1de08e9d842926a37be9058f62e800a9c46537bca79c34d291ae70ea1c205bbccf1a782aaf8f1cc9616317b78e1b8703de7e95184968f899a597490a9042f6c2c723d78a66c536494cdf37da0e43e2e171a09c79dd5327e209c34b40a7bfa79bba9f151366861381a2dfde5d501b94c1427db667dff5534a12a52022cef0fe95fddec97c1b2c353117c783b7efed1d01b5588b58ddc9fb4064cf402782815c4025855d1af1320ba5f038b0805a42fc413ee383d3333b905384a433d54edb5128b60558867532077ee0a5fd2d1bb7b2fe6381284d8cd4a2f1e6c663a290797dce23e1443533a6c90a4d91b244a0b5c1a7b7c3f14e573fb3b9ffa8581603f622aef3ab98ada90ac106bb7e883d85b7b8cba01e775c0eb7430a53bca9b5f5bbe029a9b6de5641c87fc2aeeee79e375808d8b11302dd3fd5c1617785b0f9023556ecbab57dd59a7a65ec9c4548dd31f1225d6f245c685735cf6dcf960655a61cc756ab0a0f922f9b13d2f8243481022d95d83ed4cc83d141bd7de06022624dbce1f5ff36fc225da4fa2466fe23002467f3c7a4a6eb965a742c104e768d9585a017592bcedbfcb122894f5d55acf1252a9cba451d22364f578bc36e3bc065da60d7eeb5341787c68e51b24fad2ada6100111e74aa18da2c666d15c4323359b879b4353ff9575a1a62e3fbb27735028462f162c7c028087e1b3075f50c7ef7ac553cab0090e3fa092aa09a3a46542febddbe25c301e837b100867254fd0bb6227dc1decb9d65de3f50280c2b9cf0b923dac7e5dae1c1ee6190df7978b6622bb77df44ed571557d096dead01aed9314a8e4af1193e25d930c569c19d4bafabed7b03459d2bf2b6d13fe49648caad3e90775e437628613dc1dcc5cd20d6d6de60fcf12ae27d96004db6bf45805770bacbc1907c5eb3f7d10126c821067501437cc150fba69429c0acc415c28f9b4d2b623487a5b828101d596b1bc739705963aa94c9bed0b9d27b55318f135fdf6a1bbf98ecc66ccfd3aa2f7265c79f0f05c5503b047d4834b9bbb2c5d442d76aef1149b566e561f069ffec044f27229a2df1d87fa83ff64d07072a488d57de86059668539e0c81d3f9a5f9e981f1a958fb70a8285d0dc24ce4e8258161585e79d43184393b42b3c0ac22bce9a22d1b9295c92afecdee947877e50b39f94f3e8c836a0530e690dffeaa009fcb5ae162902384c4c99eea541ae9864538fc4366073ac9540047fcedd61ac609595317659ace2ae0507809ea7a61533946133dbd3223d7d7710591c69024fd625932d60cf8bd42e55c04543ee008d5502be6442d54631bf74ac9545074f22c1194a2273ff11a543bb5e9d238940693f2ae1c609eb7251d1c553a4f74c9a9db80d24910e6ce0ae84a23d08bc1dd821588995d99f6a18f66af5801891bd9749316dbcf9ce9d8b787796e6188bf05a4e478b253f81e5bc97d161cc50a2bea79da3b76ddd0305449b8325d43d01c5296872cc2a484fe2dfceabb692fdb8e45e03b576d1bb6a48de804ddb91f6bbe0d7d860a90f8467e5e50360407e7032a32d23bd28630552bcabaf2e04a9c628f7d846a7ce6f8448738ece85bbd948ae9f87764158ac5b5ae52ea0aa4d863bc75ecd0bae98a4b88ff01f9882754de79b1e1f63d864081df166e9ed4912b1b815aa08cfeb9459a1ad0029e9fd0956fd76c33774e8e720dda4966ffd9100a6dba25e2debf53df8d00e08304b4be45ecac0137242096e610ae318234a0873f016ebefaee832120cb4419cc524f582f00005835233a04653364b50a65b15f907ea50d30e5d58ad0fdee6124b1f8081a51dc59759c2441b71e03bc45bc9501c68d67f9cceb3af6b6ca04a2d5493836cd8747ec3eb867b6a47893307c5ed3d3a9d5bd6c15273ccd9bdb90c325419648114b4af9da9e8acaf4e91df8f776f33f00ffae4e54c2627847d799ac5dc29ba7ae45ec688f7815e46e1ba7fcfe2a7eac95b24385d2e4345d82672845c4f3cdbb6c1c3521a66b916edcb33c24d9a2fb822e9783fad4b33be514334476a4fdb7ec13782d0c66a185cf045ce158cf07f22894557695a55afe78c4e2f5274307dea36a03dd121942796faebca0802981eb088f95243f8cff067f5b1d4340eb3acc463a624c190575f5b6a47b808430376f89e6ff96ded0cbd960a28b37a9e2be083f4b40820a7463820cad428a4c29520513633ad35bbae501855ed5d84a70ba1af4654388ceac34a7d990b9c4c05ff9360eccefe39f927506545aa22f0bdf568bcf5013654bf60fed85168738c9195589e2eac5cf91a0a56e375d9b42d575bce136d359216b991cdb780754ee4d9e8e86f885659e182b9bc3952e681b8e7c11a793b8bdc515df85f91a2bcaec3537cbb5b66576581e7d7f8cd696b0c2203a80624dc5e658310e6fcfd4498f3c6a2c349f8551a1068adc7a52615d1b3d71f82e9cccc37de2a66f04e60c2b4be6d3c5f3cbce128eae4491b49ca04b53966bfd46dc7879296c5e4a6cc52b97a7f0574a2dc1f770e45b33e354f2fa27fdd5f593eeabb9b193fc40e7cff49a564a64e0020d0a6a334c12411c82dcd7bbc400f6004e90f731639d348d54fcc030de495536b82d8d236ddd558368e39fcd4d21588d90139ac240542285236404ec08a89d2e59b2ca08f0c3575f2b8ebb26433f0282d9bc0a2cd22bf21865b4d0547288a232162288a97ccd30f9f666918e4c63dc275414af37c2298c8b42758b2ec4f14b8a17042ecfba01c699eff28acd1094cec326a2f2abb856d929e12e9c43a5ec807d85e02642516902863eba0eaa39dac0a07aee394f5bbbbf396b676d5bbe7f2954883fd7caea0dcc0a0c4686ee6c3d9a047681edec545f270207a8653eb7b52f5847a7a92f2df30d6b811f586153c6443842e2774a4a4bfacdde7aecb3379378ceeba30438c125abf2c4cceecb967ca68407993d31e6851ee218646a83e623ed019bb850af4fab90e7fed5aff4dd68a92fed2fa969d0177d89dcef47766e6c76388070f55a7e8ba29256c302a4cf9033831b2b22b9af08fe0a52a1ec547476fcbac2525b01f7cfcb3af51c51a214fe2dc6ba150feb2c6188aca305bfe5a34a65d088e6eb6e627ff229026b03b755ba8041f176dac5ee2905b9f7a029f1a0ef9bc2fab50b6866a1ffa5a63580ab3aca123ce9d5ea109e685c7775fc933f166d84d8424624b6ab3fd9f709042f466a38cdffc9baa793e327752f46a06398abcd0a5a85219f21da606a67525f7a4f8e0c98d1baad7918666d3828911403c40716148feecfe2719b0d993caacfc8904d4c5afce437c865ce428dac7fe1d98bd35089c0a2d7576e954d4ec038db82cf5002fdc66edffc44c4ae5c01388e4fb5b7835335ccc165df71287139250b0ed53e356878812e7d7af0ba8d70e3a3cb095ab859369216738ed6a6ebf098e7d56ac0ee835944abb4d2f96d0841a9a8b75065f7830b1c5deb416dd0a22dbaf83f557e3436b3e0de071388d0b5bcb1267a527f46b9fb931e34c1dead7f38b2c5b5601f0f69cc7c4fdf0444e97c2924a57cd751afe34f1fe2b6d6d0456a58a9d69d514c8704ee4187a56fd6c246cf29ab25a78339e950e72fd947eba14cd6c7b460f1aca5ef5f570dbf1ae563f9f7e9c2dd89bcecb343149005ded8c80bfa33e66708e8701367e56997cd1ad27fe98b710c47a4d12a73cd8aa2613fc2910c16f4195ea7f15650132493521d19beed38411aa7e4ef34273ba71899c798c4549767ddba922ea1600bc51d709540a04b18b86f72244fbaa6866ecf4e19518e1adfc61de65031dde1f2d49cee2a4d0c4a5260736f0bf7a539d5673048ddf5d6a5159940a88a02f019f3d97895854ae9330fc18f6842f1db28501ba14eba8d843e6269aec9e8a7c451335d182d4e3e214e76612923714546bb21118b2a58207f2deebcce11112a3fd0dde8e67e2c329be3b0caab6a3ff9cd3a6dd157a260b6b1bae01d0a47ae924be01700494fc82d3f3ae4847b03541757ec5fe46b7f7a57012d6111c93566e8cfc7092fa969ca37f59b3b1503b659a6ce1a1cd131884d0c57cd982274a1e233b2ceddfc6f95d958a54ddd07a94df6af190ccf200f8782dc9be3aed77154ca7bde3db8ef01999d993799f1e2d78ed239200a9e5a6f42c0d0b5b7cab82916c5c93a5cc491c83dc00193c79f2cf443964ccb5cb106b883b0ef8e91154e04ae7b24ae7229692c4be799a21f116f6832e9f0024931ac5210fa410cb9b7206be6959422c90f009689bc684ae86c329a24742ead1a46d5a5b145ce1876d7b7c484bb217ea79ddc6cc1e776746cdbfef4e0df0db41817081930399f9b129d99785194d4aa55fb8717b910cb09f1845add30d196ff88cdcd16547fbb7bd33250f015c9b48f1b5289003ade70efc08fcebddaf2d076b58fac04e4bf2aa202be64939801c91340ca688e0bf96c102125e2fda7ebc302e6862e4ba9a0f5f6e6685bc8a1e51c1f0e8aae28f60ac7525b6e1f035f64778962dada536bcb2361c959bff9fa1db49ccbbbe238c1b9899fb8910c38ca04f5f472b23884f1e8bccaf1b9178d69509a70c0848d2535adbbde7eb63204af74442c5e36d147059ec918a7afececb726d485350e36571a8f65f7f60717d0d85c6c186e902c026d9550353363c57eac496cc17280653638068dd168a945020b62769feae5d21ff2765c08ddfe2aaa0f5e690ebe03a32a56bb3d561cc74404113169ab196049045ce9f279eda8a3dbaa10d45363bf769b3e557c6d59879a3cb26f4d2344261b1b73951c70aa88b9764304b478a7db69f1b67d53fe6911d114b5c52aeeb362cfcaff23e1d55ec7f3e4a3e51164d380019487dbc8f2928e71f2e4da09f6ae3aee7bc73a4a904f8cda8d9259f4012ed5c8ec7916e62f1d2600400557f1227dd6ff9594835d8ac500f4d9d70864360203456253d7b29e52000865e1e3eb5a675f8a802ea624a90a4bcc313c9c69eb9531005cdfc53627784510c94027fe86b5fd18a35d4aa7d66594e7fb87ba0b0831888243e38979b3d81ca1d4eaca328fb0d73068e917edfa1d03cfa0810c53761c30528028ca8328bbae42eea6758f5b9d165a3699b7fefb7bc20b89f23a481b9e50f87976315d7067237b7f3dd01ed3c7e11e7636cfe2c3c7f6231da2ecf2e00110fd9894660e7125a2d4ef7882e6df7561058e880aa13849ca9fc358c95aad8b99e8444c109e153c53d6a61d34ef68eebe96e7570d4444486408e5de79876b861341e464d71642f65f080df48d42547b1f5ae96b83d3ce0eece6eafaa5810038a691e2a5657de299eef28ac736e68d64acd7fc8c1254bde18bbf3a75f55156ea785ea5d75fdbdc6e271d865cd6e3f9f18f97898162d1fb0a681d3d1610fe54e3b43395c2703818bd33106a7c1642826aed22f6131c516fd0ad875ba79f90e16d80951a2d3e9d7ece3a539cef9e0a0f16f1fead0ae8dd017d7f86fcee4910e7ce040e9ce27111f6e8636f867d1543873ec0b5142e6d7c995808a188b5b7854d4f6a2583a7b29d6854d6eb8eee24f6d42a85cf954654361fa8706067c290f7fb38d7633745a948bc5bbc4f1e09722add2266d2971c44137bb6df4b01dd7d6fd8d1754e2084fd1ada433d249d97a8e78a6e8b488276e61c96ca7cebbed026f3ce616c70a72b561baa5480f173606d35c3551db8bd1de258562b6fc70762328ec432e45132045e5415d8ae3e072c6a1d702044abb2d9dfd0a423e167425a4a45a38a04772bd5bacc0115ee94c3c346a6791827a8c871858a69f8fa54d981152251b2f46cf867158b585469790eedaad9c682ef3767af7e908bf3e115329f3c2cb7f2ddb80382159a00dd467850713ebc40a9c3e0f7596feaf45cbf32b77c666bbd91e7e1b2ed6200e3f8ae16f218a95acdd4cc2ce038039e8a7bbb34cedf3ce84cd939716f72a5c5e7edc9dd5aaa94b8564a32a28b14e0b63797fea2e19165aa4a10fcf0a1d786f2f603be54f1efa6e0c4541ccb5eb5ae39e1faaf04575b8ab9a17f57e4afe5ac8ef784b6031fae88d9fd3ab22dc2e2163072eaf7e39803531e376e73d70364c0a1d1b6d8734db1e1abeb441e522065bfa2d1b0fec50c5167e0f6257750041c69346ee24d2be1be5a5f75ba85c2de045397e694eb351b0f6f07c4eb8cd81ad5504db54f3cb3459e9bfb82e312036688771899dde6b82d03129c8b0adaf6ad561df78e47ce94df194b8afc08ea9f1eb8d52bd2d519d8aaf6f9a632c8883225687737e1102b5519f61211ca71381e705e15db79c2aa1cfab1cc2da16ebf14ebd3061796f37a7e5aff9a9ad4662206c340df2d76edc10c85f9323ac043a625655f739e9638e49809fa882c022fd0e17e28d92bb19e8731b399d3d3779166ecfcd366d4c727902a90b087d03c136b360bdcaedc131d2312ed575803ae9e26f118f986c21208a6bc56e93d8d6a5b1b8ed124044882b1be3899fd69cf4db40fbd22977c6f5f2250d6c36c526b7450077038ca8478e7a380292151ad413c1949d78076efe497beb4013f036f7242375864a894d5732b3b906feb1ccd606315fbc79c5e8827a024fac432743cabbc5b35f2894c9f4134c1179261257034aaf24d16dd17ef42649c4ba80488601dcb03c7a343b88cebec7d3c18e9363fc6faf6684baa68cb3cca6ecf341d0784d0557636fe3ea142783ab7288bed15e21d396b74ee6d1ac51eb9e1adf0e6b94fcd43fda98ce3ce69f005b60272d48b0041519798888df584ef1b3e0e64c5666a1b7ee048d39809aa5c37c3f3560660413b28c3fda072c1b1b7d7cd191923d57cc2ed673c5dc618adc3b72623beeb5c4f12a836cbbe8446f37fd5d6f79669cf2ecb77daadb2d6c4192d6d27b932eb47cfceb83a296a2b4cf34efda1cf63fd1c283d0680c2582ed596a2410ede3a6ee86c783f153f2dcf9a582c3776ca094984112081a2a4d93813ce2b1b22b95fdc08cc172710368ed8f9cb216b9c100fb3cf917dcf887bbd5b4666cfe3ac73289d6f97b357733616ae31f436815cc8fda5c4525bda7a6e8afe35099781f4331e19e57655b786664bb90a7a7261fe1a5c862cf9c289c0a5ca8ba95d89dd4222c7b83210032f91efb7614c06def3ca2fb2becf31bac4a14904696a0ab0e0de68aee31d0fc7a7dbf9e20fbe3f8020072f8ab575a04c736682c10040b911700f2c58007018a907adab532929ce62ceff4269d2e6ee7f7f587788b8f312b6761f964f79f1d6b0374f2d9219555a8ce6f88ed97fe9c45ccebc51e1f94abca6db54cf1ab469eee41f09a827450a8c04513b3e612448cae949dd37542b0e60e985f7ff411b9f0b4da823449b17100cd4f510788a27c9a730d802526ab607a5885e4f4d4c145dd3f4b8e42874f52e8104bcbe64daf13503396472caaa02fd348a4da6e2c40969eee038957d3d492e939a8d8f2cdbea53880ad376c69d77b8b4f73942e631618c0519117e6a7b7ad6eba04fc9f5157aeddcad0f566ec97effced70c6c8019848ec0a829e718b8f0ef311decb5ea0f0ac9a72afe5aebb87d9c2a33ad6cd806da37c6946a18ae7b13400d1a4b9b305100b192878aca65f2de556f12048a177fcb4fc0e5bb58554d4b93259e54c3f263c66a44ce9aed03fd07f3457df90e650dbf9d55a403f135b500ae24b1ef7456cec2bf6607150cee63623e567b743fe9361eea2ed82c29753b9a5ab05b04f884195e77a038e56f4eac55fd47145d67cc8550fef2891d493e67815f71a57b95a5cc0159996bf15e4a5e4afac3509ccc357fbda14abfbe98b7c21d8511963c94e16f122ffaa721210a03a8fb703819b64daecd9bde83f76009d3d7943537303d5f8bfbbf6af55dffb722d7c9f6d3bd6f3c99e9b355dcb0e75b221553878e3dd748a723d2925c8d4279443f2cfe2a6e3e29c877b358d3d177d638408bafa64cacc34cf22f1ae4993077f048eb3043156a3cc4e1618e6f4256a19cc10455844602f901d0a0a9956912daae5ad033289b3c9f148d85a0b8ebcce6d6fe8620321122124e25ebe778e62fc906dda1b0e1e6fc7740e5e935b6b523ca6f61d9b8b7975435bb59d97e94f6d16d8139274e74e0f2efd14f54f67286a177ee51c4c61bbedf8ad1d43213f1823eeea6d62ab6eb70652c4e358d8af3489015db3611f266700d3a17ffbe519873bf73fe1c728f4d7d9f593ffe5d9b41e136cbbf7786e3a194246d164044dd90af9c241074c682a3f1e69c2c128cce653bdcc2217eec42d4126d4a54008e62e1201d2a6444ef37f4b3831d9ed9e2cd663cc92289b20ab605d230fa5ba8628694ad8aad82f5b65548abbe051dbb27404cce47127f7baae83ebbb5a5b39e89f1b03d2ad4f3f0e185a8c1de7c2f2022ce20d89cba8c41927f86b74371e24ccb4c3dba46c83e9c386e1add2da95e709c20e9411143376c8b24e6ae23897218ef3f440b26b1eb6085b9a9e7f1b531135ddeaff3eed509645d7f64869e13eb6cbf71cb1812b682a68e0d5ac773c830712daf7ad57b978992d0370b28fa38d3af018bddc952ff8cd51c133765fb08e4f2d43b53cf00b23f5cacf5e07c7f1fb4497e347f062db59154f77247a9d0a0d4ff192b41c9c44eb32bb860ed6a77f115a2fe15bbb7ed00178de7d3927c3cb689fec5274dab10916e68bd2139db28d57f2249d698c4d807a8e7b4de21c485738959a0d67e5d2ca6f77983dfccb5dbf47931261e1f1537f3cbca253afb6bf4fe5e7672e1dcc860b3d6c8d243afe2d9758b375e95569251eb099e04902857d1808fbf03ef6fd2f4e194bb72f5e94867813d9cb9e447247018e8cc1787b1726420a59a1ba940642f57b8bc2a9c82d1d04018c8ffb3fab1daa2f2ba27c89da2f407277181b756675a3eca32c4e083645ad9a323f8a97522d8b0afd1fbfaf4d1cb5c9dabfec0b9c1bdbd5285066bf3e84f7566166c6fc260b26aa6795dc6bfe62f4890b05a6c725ca0fdd91cb9e2da47f53bea0722ade952b0f95f1b13d405c969f387e85d65881e4b25e661a5f040689554b65fe30af0df1a85621de6cbce62c1840abbce5003f1055e02bb913b2e3376e75387772ee1f1373538e99e5422997e23a19177d8ecbc18d0b492466bab90e21d47e5a6c2c36f503268e503160a56eafad5d21ea34a67caa2844f8d29c0671f1e1ce3386e9f40ada47a7bdcba8d814b2e2de68c5925d964fdfa582c1d74a0761159e8f4d97c4e96b2f612f3e7b402eaea323589a385fc2d089f16ebeecf232f1e875ba3ac6280538465110e4686c10f546a28dd2973b76fecfaf19444d9d8926f2da60d8e5abe2b434fe2f67e0ba602945f254f92f6f270d09452edc99ba8e729d330fa286af068173aec73384b9a0ad39995a88617957addf39fc0231c797577026132229dfe5027b0974d1c4f8370399fe1b0afdd89d33aa142d3fa6435857f40a17c23f8d12c9c384b4bd11e4b7dedf86f2fb250b4c31126a1eef77cc25f691858a2d3854f439d5b703600c0d876182fa9ed3a78ff94870826dbc16b0a4b5e0fee6adb4b61df539f6ed6503e14a6e1c9f6b1ed5e528cc6d137610139f39186afcb9de352f046e68faef36a9fe5547150bd45730996f5f6083e475fef6778087f580392a3e2c17db09655f5eb35c7ef4c686f7581b1153e36a25682944d490c07fb6391452198408c8fc39a2aeb4884435ef89bcf8d35c7e2cb5613308c4dbcd01d868740931358aa02070165ef1f58bf07a88cfa119cb994210fb9cc0ec93e6127351d9d227aed9255e7d1a429949247cb46f10a24943bd50c481d6eba08ba427f36fb63b51426cdf22cb3ed81ef5b64129c7108b063752bf4cbe721785159fc8f51c89a332a2ce23f9e4e4adf77da9c4470b5fb9c529021415ebeea30eb4216be502d4a86042759a6044bc22b75387ac98b64ebd0a9b43c5bca4ad3ca1f9f1873f9d17c95ea3ebb8d27515d4d319c8309b527e033b00806aad634e32f35958b18165d384824998e5ed009242df32f416db5a6e3afafb506974c242245754ef6146d788487f9615d80c51a1eb303183b5b5588fb2bede2c488f2c199f526f2e1cfc7cb6a3ab3bead5bcf2e54c8a880f93c5b763190b3b8c9e692b44f2892a8d4b1ebfdf14998d70857b5eacc522c8f047990178cc4495f9c1af2a44cc4ff995822a3b7219cf1d5f5dc41f8903ad56ce378bc1414b0f7fec58adb3a99b2b6edf48ab5a1031c05dffd523900a869ec401ea3a714d13c05becda0141e3ddbffcb3151ea629eaf1e1ea62166a91ac6b8323e6118c0cc51bac63bc367f74026215b96df0aa3fb3e82ba7bb1909cf038836bca19d9c00cd55f3f975a9a6eab7a66c7ab9cdd0b20b27ada016b7e8132a993134a35b0bb99b23c506acf762a85c11434f8f12a4317f14ea6c2b5faffe6003251461c66597cce99223a89c3d4d6e274cc0644bbf2e8e5464745f8cabe1625a64d4736c343bc13bedc92f04913a7c5ceb75cfe56c19974aae5129db767c9ff3730d4eb8e216167f2a7f76ccf90ff526a1d8288c4583488c1a7b20a89a208782f2276a3919a74b47fabf3651ff2e6718f250148cd5ec008d4b6aca90816da77d44ab4c69257fbe1ab0f0d43ffe2640a87f760a8387c46dc2b3a88e1fc6c47e570d116bc5a0001d6bffcce6e3808820598bc270fcf59cdec0e5acf192c4b57a849de24edb13c8b7b0299bc4f920b474a0b9cdfe5589e5d20c53e08bb615c13a9a79a67c25eb3a3b8be0f614cd494bcc128be0f919cf2fe60970fbb2e634782d0d42d66a12b0e5075398545cec84ae753364b3f7d63feb994cef570dafab3ac0617bea9f3def59b9abd24ee3e34d6d2e67f6af710756995a4b017b027ee489a31b775b921400f8a0f9013e602e1df85634944c0b299dc9b78869e027d06af533afd7b1d91190528bcfa7bb584970e06b3dd0121cb99ffd2f897b1ef440b90df0a31f85dad317e7a894584e12a1d0b5fbc83c8a3c33b79420d2d79fee4c69247889b1302dc4f238a5fb755f45e3d7d986882c1cc0348f3f39d8e1eb7c5fc5e929b82f593853d9c5f249a177687bd0cb79e241527f18714ee9103c7a24f789cc82d30c69812c19001c234f1ed0c6661c646afec39f6c2853ad2d49c48eb01f3f225ebad9aeaa4a8791fce0ce3570024cc476c6d8c7bbfeddf4749c630ff5e0b176afcd22075ad8bce25af90dfcf53fdd28ba3c1a7e647f5e6d7aa6de2f5588d3fe6ab5eb21ba6e108ba21a46adc2692dff99c0f12a02245566c3eb8e733b72172803f79d844555430c86a700be6438efb799e805612188437ed4ed0c623436eb920024a1b58848a4c36d31d4a5570972ef3f23cfaa3f15a914122dd072bc31d1bae3afa02bff92b67eca4d3af927655814fe16a86ba74716d52020633b501d5a11330b016e17de086d225b9c3031d72fb75b13382c16b6ed2073673d128c33f52352c95dd27d751b3d09ef80d112c93a54eaabe771f9cfcc948054d69ecd20336fd75d1e1f7d125f5ce56b715246d6285c01634ed3ccfc159fdb9bc8369f6c85553558baaba310455b4961f64a5a687a6b43bbc6a80ce658a0e98e7a807f636b82012ecbed9c098d96aa65881faa0aa0d13637f785360916464ebf75f2e9cf6664af51ba7ba46868bd8ce89f48d2372c4c3d4a49e1d4cedf0e5f9133146aeb067bb4640edc78b7973e756db46c5f787d2aed65465465b20357a0c64a5b7f50bc4594d8516675617987d8575fe09e3923fbab3b7533655d33b0c6a1243e939b0840e5210ac0170080283a47fa4c3b03b13d1b1f4f25502ad0b815c4493444247afc19c0937ffa2f5b9e2fb23c15a262957da1a34ca0c2957acc32a221e31d7774e5a74993dc8b286c680d287dc360d0513bd349e61c1947826b81cd56b16c2e867c022e848c46862304771d37dbf2d764d62485b41dd09b9824a7a85025cc94305ddee1ddf5b8e32ff1e1f302c5d4e250fb19d92f2c951c2c7608b596c6cb5302d981f608bf5ea9d3bec26c6727837b960927d6cfaec343afde1987a30ac4d56e9d9ffdbd2fa464ced9bccbcd678b1db49ed2e11e3ad79c92db7e910d6865b5e4088d4b33fd268e61d125a3ae1c58433d0aaf9a83576ea185ec9c642e761a5ef3b8ee71357e51814d139176a19c7786800b1265976ae4dcf98ff7738eaa5f5b2e0d18021a49c207e13f84d7208e65423deeafd4e30bc6b96e341431b67b9114f393ae705ad5d47cbea37427a368be20b743dc6acea0a0c1348777413e607c16d4eb163e8fa9154a45fde40ab2a1ce8c9c993c89e2dfff7f1ce895047f0f6cfb4251f3df214a110b078d58d2c6c032f04e5d24c4a8003f6d67e5f20e00cee01cec86abe4a82f343983f04712684a67f65d1e49ad86b7ecf6b5ee22b05c35721603f7c2b19ccf1b403bc5436c1fb6fa09494affa7176d84b5779f8bbdf9c9af515903bcf867b022d9af6ab222457c55938361db43d2a7a3242d48a16961f1d4692c591f1ba168d7405f5f37f78230f73f9c0150f630eca4cd679818551d449db82e665d8dc25fc53ebc11293e4e4b7b781397e540bab3161b86fc3503844867e8bf99ecd1530b68ff463f2a7912424ea75a942cc5f87183893be3abf74f63df5550826188dc023f3c9e27902a76abed7801848bc842ce59a0d6fcc1a2d72d409891ae4016b5cab46124691ee4d3fed +0xb1934f70c974749fe74769d3fc2f2f2e9e315f4299a739e77c7317f787d8d4d48a8513c237773f1a3af055b4e20b1290 +90520 +0xc68094c26c7f017b79f126dc26b3bbcb95f97535ca412da5f7853e15fcb52f042e6492c857c22b26ffca5520eabca20ee2cec2f0b71ea60383ece49232065e0f42831f62c8b48581b458a541550feb6c20120113ad20f22502bc9041149513c98b460238c63f57b51f03dee87095de0cd62cfb45b42e5b34fb5c08c9a94a9559901305f1594ae8e9c834c7bc4234c2178c86782fd5302758f73614d4fa0e2ee8d953ee3589be814638512966d3d5e1b4ca874079170f9fb87db17e070dc7249eef6f86ae5f816af4f6c4cc8d2b61810c19971aca83b10b7d15350d0cec5fc0a259cd9502e27ceb1a8af378da53beeb46001ecfca1fffb3ce472a888b9fbc4a1d9fd7e3d91b974ce07d48f5f452d6678b08842822f5e1ded49cf9b82b2cc80a364af437dc10bbd46f56290a85308f3c03b732ea7a0d40d6b79b0865959d694716e18b5ab2cbceccef9d008132f5d3b4d5988ee0796d02e19ecdc05671fa894be4ec06150454b97c88db3420a5aa89152a3001d1c81f1148b1b8895566490f5cc9f4cc2e7ab1652c60962db0865799a82909f4840f2b53531ae6cc281c94e3c3ed80456dbbecb924a25953f87c02eab5fbaacdc2f597b249fedfef983ce2edc87718d99c700d9cab74a90ec230b56684c79bf653226d157488295c6d6e3c15b29044f081401af80bfe10c6d44a77f45cb665d5ff3fb5631add4e796f59a943cb5f8df2e6d41db48a6915e3f771517c87f08fd48ef475868428d6b066a6315f590d7a4791d31db871dd41cdf34d49e74b9ca159c7e8b765fa8f476819fcdc51a5c194574ae623ec08811aec90876a1bf1e223ce73c482e8c33a2b085104b301f7a4618bdbb53638967e2aa996c7b901c0eb9e9a5a2fdff7295209fad666bd5797de6b490be75e8465fcf96accb4408102df9a2544d2d47a72ff6aa570c9023ccc963afaa125a3b8bb220d98fbf70684fde69dd7f9546c59e768d571e7d58b96dff4540766160ebce118f09ceb3813f0fb263118405fac7cd0b6d2c602335f4f182143d62263a6781f072adc641e70af42cadd50e3989ecc7510e90c8a8b864dbf458fd19cb374d4bc1741c22e5124a71af82ae7a8a9492f1d9fa3ab4884097a1c87be5f9eaf7eb9026fbfb5107a37c2cdd89e45583ab58e128b870b01c7efbc77105ae7eeffce0d37382c1cd441b2e6a294c3d2bbf2ebd29afb1e9580fc40fd1708ebd3554a6cbaa4990e61404d9cfde05121f7987af2e1fe17eeaf8cca05244596f78a9b385ea691bbefeb1d47fdeed03a3e1ab879d2a5860981c2ecd9451949e208748872aebb45c5562232d6dda1ba74a4a5e498940579f65f3769d208c46b15a5f9e4a064df0ae0cc6e49a345fee62adbfee27f3fe821090e74cb5d560df3575781766a86fc2634d83728553ced9b82698f7ad5db38c46718e3da2138dc28cfa47407761ef9e2e802e59895cb5622a4d8be764371dcab3b05eb5dc7b51953a6173a5f6f33be8625d2e0610bf921c3b9b0f59d7007bc1eab5bf31ef6d6acbc03353b46fbce335a12d1914b5ece36c6e9779bb605a8c064dfa465e357a27dab0f88e084c2f640a6d8865e1e37527d735bb7178aa959d0c70067a87592217468f2978fe06db3cdb19e79b0a13d8edf1238f7d3e10524d48d362d249c4e5b7a3ad3eab124a40dc2c48d33f09d198942eaa7c03682c010b4ffa87d411f3359756bda0aaf160e0d0727cd3b84db724b9044d199a837832558657fdf67c8ea224f41317eef7f54ba84228519d620f1ddaf68de0a91c6f66ca807e2dbfe5d1bbeee05fdcedb261e1d22fddd564c373e46899ef59b5af8c0ec8d2cfafa6ea76e363cfe6983dad5133cc7fffe7950e7008e042e3ed569958aaeed1eefc31f6e89911f769a245352db215c71100a49f7dfbe0a5fe23f2765fbb8b223e8bf7a7a17d781b3bb39b0661fd4ca9b3a929f3085dd827b0962fc2fbc14c2840d74e592be1049fef24a58d9875bf7c5a598b95a97f353c8dac451bd74ca0789876cc98026455f9f67e0b373bac0cd3779a4013dc009678f7eef8cd5cce067797e2f8f0af87eabde448229fc610b3338dd3edea0a625a5171d6b17406c60cc9e19439df9dcc11403aeb9223b23421012f9efb84cf152f5aaddbe58c6fb511d3e81325d1479188555cf0c06f9a96f4e0bf63ef80a4a953f8ee972b92e22bc42a2de843525788ae31dcf033dfe9a99d46cfcb404a059f86b0c670fa04288a8221257bf8ff2801f17a4d6262f129fc98a7d32d745d6c582626c801b77c8d61da7d5146dd2453ae0092f0bfe45fd60065885c1322376363b0af65b20a589b324b8353e1566e44ed4a1099612e586845826ced14a0746562c4cf221a5924dc8c33d78fd40b3976304c879a0ea7877b4c7dc9e89a95710ca5c11a7f933a6dcbc041fe778752128217664c6510f6796975c623e11d67d9a3dd33f5e0c5149fd38ef44cad83c185d32345e39d00819acd61ea0f69259dfad559abf5f8187e37ae48b9569441d00003b469f1a465df58018167f0d34bbe710bab87af2815ddc1967e0fa0be5a141d7e7b20eb1da9765dc064ae5cd1e83fb8d1535575f345c9ca36af65cfae34f43abdb829245b53dcf8647c4bb7c793985ea0e1a3dedc10b8bdf94d6a17c65b06e43c2be151ffed79d47848cea636c65ecf04c6e16e551f212978e87b3da934a2b69426c7e88deee36e765a859ca209098677839c98f0b9a9791ff11785c96a8e0e30396b5c67d09022e9122eff8bc41f11739843e33188a8496907dda49964ff77aae43a12102b069e4b102963769015fc738565d199f4a3f6ee9d2c0ebbac9d6f6eb7c2ce3956bd3d06c4e35cd4f574a411db70e89c96332e1b11811882b9ce71f61483d5260c3a8bb6b10b30395cb1a4b8faf39cabe5cc3b79057b769115390bdb9afbdb8883f506d564ffa2164e537ae3647c625a5bd5cb7309899d693733b979bb9925b386834aed414f16fe32e0932bb869de2a60f64ab36e29f16d9864f76ad6fa58496c4ba468d6680353b2df99ec675a649ebd943594d3eb1730c1434229ad8de7acadd4bfc2a4d8fba936a6dbcfe1acaa199a360891bb3b73354a3516308fc2587fd3b509953d10647146ece520c7fef34dbf625054849999fd8bd1001a0e463f157642fe6affbcd24e5c0852997acfe48d758f9947d083fffc1e9d8c309977e01ffe252a8e7d2cd9930e9f80948a7e026b55444fd62f9929b36b01272eb1d60ff1e3d1faaa25eecee1a6f91b9c77a7b169e6f6f099e2378ba609824d6f07fef33dbfb00b389a8136acddcb703bb2db95fba33e080da8fdaa6672b77b7bec415e45fa65c8a44b72b5671b7d1adcdc6814b3027002abd43a1a572f173ddfdf4b95cd1c59af87a941afa2d894980a44fba2029d337cef049b300a97180105618c3e15ae124c5d345ca9e2ad98644e9cf4e27ccc0ee361aa9faff3533071770371abc228161b9f9d4218a902ff0c1434f24a842758b28e4695de93ebf6ebbf559a835502db99b914809058613efbe5bd624ebb27a786df593c308eb9e1fc48a8654930d6e943546aa6959340eeb05d86c363745581bcdf72e16a2655780fad9c7062080ca5a4dbd0128ccc3a74c5c631942d62296de0f8f433d00d472fb248a23a622d2cb73aca15530a75b677a8ca4e6300e73bc28fd67d9206a5f77f70c45a31de22af9481a98af683223d5de5d42dae8285d53605d27f8a7272eefdc78b14e51a8b1db3f5f4a16b8b44479de96e6fe536b0ae2f0f877a8ba816a621131762c2bbc8ef9c14261920877e6dbe30137585721a2f13f96fdf241be3b5600ff3d459365eadb378c822b40c12f845664def3dd904c08b5ff64dd2427c85510a9aea272eced0a070557ea49db4afb9d8882d4ce0231b0bafa52724b043ae6a9f9704aae99be0d9b7588d6090d5dc82235cc0510bd7970b65070b89e9db89233b52c4531b4866c59a4bdf7699e91744b32638d8d0a4bd111c965b706396bdf16a6899ce1856cb0ab5a9d5651d80d868249f1742b30cf5a332dd97769227b57bb943056a8549960f85ed0faaa01fa862e401bc2d4792f9385447601b19e0f828847c87b6d683504a779ffec5a627ffcb6e08b806f2b90046dd6e15cc4f64fe7e686fa14180a67242273d2324b43c57184f1e9b6e48f1d3654aac5908c72640e3e1a6e2790825749d014f0d663ecf36dff3bdc6a1bedfbb0a389c8a6ef59767ff6cccbbfbf182efa192302df8ca432768f850da6fb8d55fac03b92a5d7f5acc37862b9e18c1414c0656aaf56adb4aa169c9924716eb6519d1588cc952b8c2f612aa4e297dfbd30221cafa042ae6482d48e3dc8d45cb1172008381e7ed36727e1765cebe8a05caba8a6bb7cab76fce338ce3aa1d5abc7d00b03122f69b6cebbccc3507fddb739acda6c56ec9aefc4f4cbc258587f443da4e76ddfa85dbe0813a87849447c0d9c5c41d44798150004de14d35e95d70f5eba3aae673063d25f5800ff0fe2cf88cde364475827279103c89c6916ffe7f4713b8f2e727082da19b259bf6a02de111368cb2e4f42d58b0adbe9ed463fb6dcbd4e6b54c810c2bf7f483d20224caf91b813ffeff59029d4613e85c5b7fd4cad8b1c588a30b72b67d943338afe674dee020d87f412ba2a55501af85b31e0b25123cddd38740dc6bb6fcac465c8fcbd123a7eeba36e67e0f61f97c8167c90efaecd8883c45abc9aa38806761946b208e3a78eb466d04054a015dc7f5d5fb60baed175d097ab69af086e1fd40e4132374b936369a402ec8d397b12a49aa3fa0f3876bd4e192ebe0ed0673c63ad80235231442892c4ca1493aa9960c03410030233068885b2ad63bee5bc85ad5ccd2e5f7c0303b830f1606fdcb7ef5a936e7aec89c7fdfccbee00c72db5233984eefb6816181c624f3f7728b61de7fa1f8506d52102453bcabb3c3292993e8f8eac3174e6cb9c18897b02c61f136f29401d50c6e3fe87ca19dabf06fbb2fd38e0cf788cd464ab62466fa85201e0af6d5efdffc6b705ec321e13324b4f4689bbe41f7ab7c82a70c9eee112d343cdd051e1eebcde855d9cfa43303d0a789e0aa00164dcfdaa6614d4e99ae851cd22fa5a31b82f15354fbeaaeff7874a5d02a7709e6549666261be0ca062d1d587275412b623ff73af237bca8932b913e6b988b225eb67fbd96097f77900756559230700d8f7d500db21fae37ba77a6dfb0dd6eefdbedec3f5aec71fdd3e7d0c2b603aac00fb58c5a291647c2c1f73618444b9ac8ea657c69f92750c35e291cfe524169f94f831c9eabae01e04614cf669a75875406b7a0dc053ca44e7b558b86fb8c360feb607149de597506b37ac35927edcd07bd4ee9f3e3aed515d7f7bceb1646877a4fd83afa15ab09ac9673b24e8116c46a7aa5c85038f06bbfd08a119936f2e6df0954da1e061548486baa2ce51a7315e2cb56bc5f59a3f08311773a2fe233cc948450cf24042ab970af88938b68a53a072bdc469fea2bec260769970d8c6bb1316d668abab44dc5abee9976c0000f994e28a0e7805f1ab70f1ebba8b0ba1d2d4c1110bd308b010560854757115524bc3e2e3f2fbf1cd2f9b4e3f7efc7dfcaa92b1bb9a723fce6e115103cb4fdfc872b4db9218f9ac7f72cade3a8fca181f6ad84e9fc09137e61f1502bc400e45a996ef365d277a1d4e9b8509a392fdc2513b2b00842336da404aea81487cb72e3fdefd590dc8872c84d2553744329e65db45152f316b6c0f241816386f285284d07365ae6aa226c16841c0d0e315b4e805af1d436f4138bed9b1238df8ece52ea57daf9b3b5e62c4410d503c49e3473317a2cca4064da4cfa83c99eaad6f7a140623648a4aa3401d58618de43e45602e5945a8babe36b72bd9e1feb6545a181e3a8d0be25d1acab5f563fe2e89e205c113c13bee5fa479b8b4cadc59b654c8348be42c0b3d6a07725f3b2b83f46441d48c3d0da6b041f35f801cba3b9b06913e3f504f6db23cff3de0129c4c4570194f0de2a44b7ab22c09870221c4cb177b249ff8fd708338bbffbe10daef45b1971aded78a4685a22c9c0fa2985c0d308ecef305bd7c7a05429e425c6cd6bcccc21d474547fd99b7fc026124a76b2af9d324839e18f95d4c9c04b41fda67726ca241905461da7e99a321c5b1d659eb19510f96ec954ff5b4d2175c80ad0c2e37406c002b6244fbf129e38271ae8e153910757617bce60ae6ebc181a86c2cbad5a387e0f3d2a3da67972ee28bb67273001940694615266489efe86dbe9f2edcefd37b78d3375ee1a2f4ec2b27766dcc177356b8a12978ca46e77666ebce7c5d2dd92e10f41bdfd94b4804a66f77e8e72526a1ab517f4205c5da52b557827d0436bc8af07e058d89099c5e9b8940498dd33b07897e9feddeadd064a22942999bb3847660987ed0bb85f7e2529d5afa86c9b9729c4f12e21aa7d194748a9738e84b3ad9a76a0d103567617812d44b619aaea8c92aed5f88845ae6ca75a108c2b5a7e59d0e1d3ab5c056e20825559de8912b11f47c800e46e36f16eeeb971d9fc86e8da9ddd98d2724fa837ad149d7f632e7fbdada2fa886fe8d6ae81f935e38e9493ae55cc58fcf29fc4bb65fd882f2468b6e658b22b4af9e5de8a059be54f3e2e0f539d20ac713970443a41729254695be727cd982ba298b869affe13f86397adac58d89cfbd5c35b9712d40654859e72910070a77425b8db188ebfe3f7c7378e0b3c9c73dfa13ccc4df3723b3749304734fef6728d5af6c86b94df9e6bf07a599c6d5d57c059e24cc95ab093c2f5cb445381a38befa8cefac350e1a5bd65fc9ae0699fbb36667057a99723828041cbe47d171c5603a5ae0cc0414a9c749e1acc67bfe800ba6d43776f572f99e783beb2024dc55371c82058d2f49ee51a1f7158a2eeaaeab4c4f8167b19593c6152103793944326b286a2698bc9431226508cda12646cbbbe03fadf6d3c250c96237cef9168fa223e67b0d94b6dcb9611d7b9db56bfb2065eb0c81ca65e176cfe7e31349c5a7ee87df1d812a220bcf3752ba4b6b06f0f5cff41dc68c6ed94eff2d8e9c104e725ec09ab949020a08bbcc8a2c9f6dfe0c922183dc43e3f7942082bba12ff7b7da39f69fb52ec375bbc547503963635b393e8420b0c27807f93480198295a60ac6c950777bf8166c0c35d129495df4265e4220540109f2a6f0d120d09b96c44f1d54f7a9716fa2f6e352919fc456c96662e61ca638e2fadc61408a6753f9f98cc92313bd015a101b2865b03913178a232f72a09fbb1338b234cae7661188efcbb17ecb3c928307e3c3b655809c65de65ac2ed6c5f364532f51b55f563f094b13bdac47ad8bb030579c8da9fac80b6d35c162e4a3489ff45ca14919be4445b86dd5f7b09856aa337e9c32d431ffcfe09a5655f2be238ac23f0ad03e268804dcdfe1a52e855a39b761a9ecfdadaa7bdf9d535029a0eaef66e37590f516730d5f74c9ffe8fdff246406ac054cf42fd51145a09bb0d00794874dcbd267176d2aea31754d0787ad35e3778ec3ea90f8a61f9a267eb0d6e041ce87f2debbb0de212520ced7b2accc32dcbc356fff096bb5b0a4cb41513bdfc0e298d4fc1a6a2ebbb748bae412f3c4e4f6db8b50b2e5f2cc6d6c782bba866ad86d885874acccc5c049b122be4fe4fe13dade77b02caef4b1fef91685143feb50145f658d985e0bf88264efab9007e08730cce0d595ebd92d0a538b9786eec9f18126e59107a8692b0b6807f4fde5d3079faeb008142508083983c1a9391c6c835ce5bfc6203345208bc554e1bf05405dcf8bce91d1e3eb0a35909e0355503cce4ca2db750c8608a0ab84bdb9feef8d4f696b22b8f5ade9fba3820ced0113a199fa6721e5f2291b7313ac29c6e12c24a6155794c5a80b6aa22e62f2ae65ec03ae0e3b7960fba5e4616a45824e91436b297a550cff1186d6c87c37378faa63cad32f27cb2c4f81cd325858af9a36bccca2417072b059a596353509c5d8f8005ed10531ff9215453dad87eb98f2f720add711adae1ea7f110b102e083d1764c276f3964fdda767a9c9b9c09259dfcf678929316a89124f1ad048bc559c14dce8e7773c5ad4c99a751c442b73ee56ec694996fb24953f82dd5f577bf2ff2a40ef9af5a5ef730a754c6f01fffcb10751969b44c8977ab4a2df14e6ed7edaaa495d1e19736c4cdc70962e7dbe8b46738755fadd2a41be0427a67d51a147c3275ea7fd3d255fa6c224f8d701f7ae132e065de4baa0a1e3b0a9ba153207ec2d23e96694eb2c48355dfadaf5593be3ab9946e4e557cc36604c718058f2b1da8d1281ff919df8a45d027ac305cdebba8437d1a1794efd8dd83a47afd53e1fa16795a0f96fe02af2a2522d2794ea87a111ac2f0a1d0ac506affc747f065ea1cf510fceda7c3c33c199bf7aaf0f29b015f848d7855d05b33f4c2580a468eef8b2bdf38429631c938f97bcfb9fe125d5a78ca033b995ea38a6512804866969850a22e3495ca10bdabb40dd1890b74968d46344ec0d6402c5ca438668bba458c724045186eab28469d319926a180e1efa0af09968f753f9fb1997c345aa96374f9ef6b0d55a1400d175867f589c3210f9d9d930231dc23a4912c250f3e9bb7f7ee96e93bd31422b92011bf67ca3efca08bf718bb2d75b4e205457d21bef80abe581d07c96f6c94f3c144e8a4eb583a4773a5e1e90ba7ba0214ccca92622924703f6b0ddfb2115f6301d92bd37478a2ae5c8e36b254d9fcabc7a9558ab294cdb6ab6a43a7236c4bb0e8b8d01ced08fe7d4e9c5e418f75438625c4663037a2cd38a501f1464ae31f837eca1fa8df6f145c52b6a3bc44e2573b360544ac78bbeb9d34185ee7afdfa583ccf55f9fd215acf16ec44b4cfc88007102553927fd48f08e6198d3b0dbc9a359d922da294c6290e7acaf9f183dcf06d0929a8bc94fafa5b2336798c95507e2acad3ad66cd7be87e4145de749921f3002edbe83b9f55acfb2b26ef55ba5032a2551239c93fa915890adb76b0680e047ac1ba7692077af3935e695328e5423426cccc774c43e43cc957fa57278917a1479253f85255e18aae4d8c59689e9d1f428260ca527293cab98921046c64c555c0e126c1ef131fce9678fe46a75ec74060168dc79e645e4bd44efde2d1939d9ea16ea187eab78c3bf6513dbf679e57341a1991e36261aa4c93e9df97099e16f8537b52aeb7cbcd4f4866d9382be5d386dadc1ba25122ee29931a447576dcb7df4197c8aae8c83995073a4f3566cdc2a52d0e8978ecf0c07f3c30db229be7f6d006547200f0258799bd4c0e2baaae8b1b7b0179fb988397ca09cdf2130b386a571c31cd45506c0dc9c50ca4af5a00b3566f556b9ed633ea86865227bb275678f0fda058ecac2452a1c90c9125077cc1e2548abcd7488a4f212c6deaaf82baa91a1530936b45b6ecce33cc5221357b3d5bd5120c49420f3c468661c954afed815f1d530b45cfcc328b9fbc662866749c0f6b7bc849653b18530eee424ef167882c50983f00acbcda76675d5baf0d01548972287f6c248689c33053c3f319a1240e69709d206f013b1b153f9129bb9a0d56a3c8a025f289f7339542ece56b32fb71c26cb4397941eaf633d3b52cd4b70d035aacc91b71adf710a83c1b9a788564f2e5ecf2906df740744daa162cfae0f9fc11755891047affe6d39fde86c420f70e6e91f6e9cf89f231cd3362ae90905acd6292ed4b3d797822b1eeb44ed08e2820a6cc3f89e082769b3cfff926284d85e3b885e58e8f11f650cdb92b3710358ed6392c1b157369243d17706838449121cbaddedfff6bdd010d818fb1e425af819b900237f0eab6a183d7352e3957d3a5019d0e4af276431e9577c2c6ea6364a6ed461f14c0a8e3650c06aeb9cde4bd96121084a52c10ecb5951b02f89e6bfd7557b5b31ff94087f532205da94a7d976b79a2e27cf0de224c98d5c0c594a1c26347896ed80f441cc882beb26b5384f99ba4ce9840e5309c69fd427c9c51976c07491bb2cb77260a559a2c4d7e5d8d6cbd2ffe268f7dbab3945eeb970b49df42b7e8f72f78c568e922d513af60ed09692677ac1db72ecee0321a3bb08101cbff1b9396255e7e7f21c6dfef3891769b679e1862de567cffdae9dbbd59ac0dffe998c59344eb06eb5ca7f72979be8e85e05a8ebce8fbecdfec21ffdae2dac2edaac61b590eacf33fe25cc75cf316998b8c024714de05f2c1ac51132efc9bc517bb19f171c322c7ef6b4bccf435582c0e931bddf52e132347841da223f76d88f0830ad45832daf97c4ffb8479a0e1ba71ce0dcff8498202f41bde295473de831aab2f5076be341c5928e26a67c651c967756e7978c0f0f639cc29153af25d47f88bede277d5dc85285ea6fb493606dd5221a4870114ee819b2d74f231e3784c1cbdcd06b60a22d84c79afc39840af6ac46b46552bc5b9499aa8484cf3c7ae03f9a94339dbcba59a4802634fdfa68a0630bada8053540fa2bad51981db2f6d1411e6f70833bae33f9d7177ec79b845141988c785023050117e3c7f3d628b33d0e7ef4ede68385a2cdf5f344610f65f28f16d93cfc2fb093a4736dfdc245ba0eefe3ac138d3c4790660245ed91ff136c96ac1d5ed1004b971c86cb1fa8b2122a2c751d4a420ffde40d2592e1201397a59b83de45973fddf4c5436abf5117c37b0d5bd1fbcba3ae860a866487d6f2f887e9c2a75916936f94e8d3d147861ad6e7d9be508cf1a2625da54e42497a453ef9c792fd0216a5085ecc5d881d0d665258dac520677cb1215326a5b58ed6b371e27c1b6aa85e1cb03abb0a18abaea13fb55699cbf2347af44fd4b244bfb0e59a2c518475b3b7a16f10fb0208573374a5e69661d997e1a5e23af99e7742d182c1be8ef6a78be9dc4ec8d56ce08b62868dd2e246d0bd4adaf4fadb90d6800133ec807b988698bc74544b917029ae0580fe6382703acb38c03178c2b1eae107a0255a5f939c43f8128a7f77386a28e2090180bd069e2b73ffa19cf8293acead707334840e71f2645df64dcfe92b60c2ca9d11dc318544c3404c4fc41f4eadb94cdff630328b0ec9fea29de0aef5c06c6adaff2718767ef02b3b776dbbafe7f4db6f88ac277400ef9c9658f3ad4eafaa92c030e6e4f941c16775fd3c27e4e526c62dd24014b42f9ee0d964500ec19542ea588d61bc96f5ff9d02ca7988750e17b421bd3321d1029e7172ab3ffad3dbfd19a9fee0c9d6027274ebc56c09ebc98e4e522fcf7855e3b6f96c1408990ee7a3c8bb6caa3240d1e29537d55ccfcd80553cc8115a3ec839b01dcc86f212f922fc9e97bd08205dc817a7eee49305a39a32258b4c1d9eb06b52879ceb468e1cf4cf4444db42bbb350d85319d957d1f67feeb1a4c660be97e365dfe42a4d3400c6e661caaca02accd2ef41be9bf15b4c9651891a696bc60408b0ccaa2b4c2d2cfe079e321a699630b42218e814a9cc30492255f51c85df8042fdf7f8d68ea02806fba3830ce72665603a809c2bc64c27ff2bbc3dc6f73192f91208d5135ab67d448a17c5696003f53cff23e4c89202bb213267fb510ae3c295b8a64acaf796b2227ba3011b1d5468b238a6c7d35317731500fe37a4031d987eb7795de3ae6a4f0698ee3e0966424428afb44e3552b3d7445d28f7a72d099d1dd72a1846c757dd5aa7a1841b83f513082af37fd4d7fc7016108d4542cfcc58d8e06183db8a87e3857163db39bb945cb9720b6499291dc5f4e3d6285d3091511899c5a58b3e22e9efbedd4c4b5748a8a34fa5056c923c5f449caba9e0997e1146cbff863c2d4f770056b6de399f387e2e886968365882c46f04b3ceb352bb1fc83eb72ed79d37162000979aebdb8d66c2e7fe97ddc4167edee397a1bfa3710308ba94a645d7024db78628864a536ee8c7320d9a4b1e2015f801ff2aead4c8466c073ef56c23d7a52dae10ad3c4f048da5323d7766aeca0f242591701d2ce76f5eec5e2336c8dea5ea41f814aa1676dcc4af373818bb3af6cc19f87b41f4f70645339c398a1041d5560687c57df1ed5e8d71a2e5488f985157a3da533c751f9489a29f3e4f4125bddac766c79b289199663f2784de700da92d8ce001f8f488a09102103a6fa4b4e6dc4a3c22ee038917b8e26e1fc1a7c185b69bb18c5bbc59b2c71a9635d18116d7c658b2de5dc9fe60ec231ebddb7cdb6d599af6fc4f14bb5292b4da385d207318feb97004cfc417fa68c8df67133683e9814f5659bb43d6095a96834afbc8f232ee351d9c2e3afd6f96995b24511fe38293847aac8692d15e88893a7493c3bbacfc9461ac6174d747dd6037fc7d7d20bff8ff09fd9a49d5da8255a7bd0d57f70e929de63e50bace08a4e31ef7809965291889ac52deb00903b1c2712d51cdcee117195159e3540a3c55ebb61e40bbd8465be90bb53a0e96647d9841cc486d67abf3d14d060289b26a5740a778a62ba1a12ae9cd2d96ada3824f9ebea3d87eebf78d8a804c95a2ef1b12aa9a0d9a30e9bfeb4f9ac2dad359e78d9d91b9ea4a814a4f0f923384e7e8d6eef137e60513d82a08e41c7defc9e01aa15e61166717522ea0272cc3b7a0c62353dc250acd1d9569e770f865bbd75fa3f1a6d7c3352e862ae899f6051615b08aa9350d81dc934904f2bbd9832744fe0be7409bc73ed744c7902e97008a8ecf9458c2965418c01b838f8c65dd1b5ae7d8e9f3542a6859b48bfeaeb8bcf9524ac8c84c698a6beb346f28ac447e805f3f956186aaf59dfeff009be100424daa4aaf619a2d2bbc5bbb5024e41f6b3c9c31c7b6c2472fc40c4daecf8e18996cdef7cf8c768b40f259d9acebfa9ead3959e2f8506fd0e0c5ccc51c037fa7c9403678b3afa62bd0f72db60de5b6684d5dde7daf9755f010888690d29d7a56dbaff9f6e034f3b4e3b21f79fa7ae2265392722875f33b4dc8f482d5580748cdd6a37198e08125cf810b774bfc12447fc5bf5e0bd1ccea8f0ff307bd37a7b1b3c203e48739000423b3ea7c539a15a61cadcceb504b8a2b5fee6d5e70f6e77cb0a8b79bea76175759803777ba5cebcea412a05e1c6b95c4656c48d0151d2e736e8fa6deea1c30e818f1dab0a7cafc84c0fd25029aba557d48916da3d534e35c927fbaf5afb5b27d090dbc6f436db0921875421eefbf3320b065c41fd7c47000c780da2760c905dfd3dcc3fcb5cc70bf5382dff94602957347f1358e44543c27b39beebd26de91d61f66d89e266fa2d21a2ce5dcc50ce440b23ca936436daf98fed7dfff287ebd2a95b4e49fbedfb094147c3a0f9464894d9c4e0661fd96311d513d93358f30f3a2dccdcd45a4a300cdea79c7dadc92ea62ab30365599572a7c54d3f3a7827d9b079db97dd90143fc44432c7485c51f714987e91f5a4038027eaea3e79d2aeb1b217f81daa2fc480ac3c89b2a57769285c9d981abba1ac221eb07b5585eae04dcb82b2cceeabe39941021d0cf9918738da94901c1bb4e7cf08b090f2c333750469448c240f76f9e01f4f5d34c94d24bf3b27e7048a705efd5265abb4d64ed56c27c7f4c17133500b937ecaa8a8dcda11eac21d62ac466a13983a2c1a139f79eb63a78d03d843be524a1af5f70cf30fd765fd93c4e5b9a1c856b8a2712f97eb08b94da599992a7d8aafae6fae5a124e763924fa99cb3c8e81fa6b9f787eea915aa534eec1387a25eb3093981d34ad1e84d0f2b25fc16198b71fcd939e75ea154793f7b9393a95301a7974efe21135e879c9c14b856cab58fe1358ff31c928df5621f0a550142e348ee6cd078b744f44db802b26b9218c37cd918852f0dd29680ccbca23b459879bbf05065f87d25bac10a08ae4598486bd8c06e63f4a266e47e1fdfec4b48f33ee3150bb5855bfdd96bf878b04e50a2d72dfeffd04bc3959e77c24e8f8ff09d5a47c6646927391678d3eb195f8fa36e2c02fb93753a58a8edf11fd2340f26ddf470692529e6ffb6c0824cb2640f77f395e01ef2facc49e7f8769d3283d2d3fa34e468149ccb9526d9ff810c66d7b67a384ed1e306067e9ae88da43823e0dd3d432d29fa6bdde3aeead2f4ef0eed464b3dd47c3041f2e009e4bf9caabd412eee49d3169e3e25d1951b840b22045b11aecdfa859f5597557c1592ed51f8feac556d5c95cabba94825969c306fef29fdeb104955f9e7fdc63aa29000f57d1d41b9d85210448d732ea480a2ca9c785df4492d485405a22d1c8cb4413b5ef3a9d464b23ceed55a8b6d5b041e41724601dd114c80ea8d2b2e3dba732c075303a74c9c22a39745cbf7eb924799fcb9021c9f8c977780572d08130c06d9cd9d552193aa500e735c87c19291749b653953b724ff34b77c2d4ec485c996d0f304901e90d66505eae237f1489fb1aae3b9e2d953b54bc848d536697a3b4a9ae3505da72b678910649e828df7052650de03568a14f505304a178effdca84bbe034963c34ca7e3b84959119f860cfd14bedd58d24f068979ecbdfe8f9259c0c4bdb74b7adbdc9c8401db8b2eddf95b7eec1090baec31002a958d2d1f8496d2357861bcd4c04fdbfdf4ec9943e4176a17ce64a549d4be92ccac51c4ba9aa7a9979b105fdae348c9a98a54e3e583ad5266cda04088edf566e69bcf6a65bcd36c75908cdc932d0e8e122cda101ca2023bf4528e087d201da500c9d0c82ad2634454be9dda0884eb51c04048c8f0295f4c47c3f4a632568076a39e1b8610c49f58be8d0b013fd2253a3a3064b56a000cade9899bc1af75640255827a4b1f7acfd13a659dfa42fd05730862f77d910f5187620d4b02fa661271a1ddb3bf60dc3bd651ae1c6d19eed321b240c8c86e3f760238b6cb101d12d2ea0c178f8bdad32b9089d05101ca8ed76fc030a13f0776c245f5ebe5952060ec952098d6579645e6266d33015f5fc45983bb9c4889669d7e7920165f360937a79b64c950ca9a1cb5c18240f72fdf77a0852beb864f939df3c5429e029de2814c246010c48df03ee089525dfa185391f59e96852339945c6652e2eb9672b32523579dd6fc48a095afa564f3d1c2c2f9a0f586d2e7ee73c422478865e35c820b745da284bea2b007693e406b45d63497e9b4823a9a1738bc6ecdbd74b004591b875ef780d3432a7e587b6f2b1efcb25317001325035be92b910c0780c7123f3da381253403d415e1c285789d24db42157404bffbeb6390fbd42bf1f1ee2d3d5912eeb30615fd7a18f083e3281e1cefc546e511241ad734137f53002feefd59571ace2960d365600a2a9e3933d666be4bd6ce8e08585ede5bdaabbea28f2b9d1f044910a903b5cfa1b8fe00281262b98f6ce5c00f6da095bb2c5cb2b2985f11991886ef496e94d0c4e1cac36e9bb8e77a50522ea22046611bbf8d64c8d340bcae9dae4ea8dcab695bee2b076d390f50f2c93e60273af84a63d9675d4a0677a644dde8b52e15a2a44f2748568db30ffde020d1df08845d597bc31224a2faacd7441e5dad43e0208986d44a3736d361f52d9e3232abc31e954bc5b5413677865897a934bd4f06cd1fe93d5833d05fad40bf888ae17ac2e207bc26783d7045ad3023c6966eba50526e60aa9bd1c3209ae780290075db4852b5b430849fb72bca67d2bcab47ec83577ed4623a9977ded1f157c8bd75381c16a91c2901ef72f285068bd59ad04d6a83582bae5e135561fa662bace869f807d5ebdd5a17b60b62851335578c9146cc7f034fd62fc8c370bc4fe61eaad983d13781dd0bec7ae9437399ba8ba8133d70f2872622d43f2ad5bfb36f662b4e4142e6750684abc6745df69d01b917dd9b1f85ed9ad97600f356ac9aaecc92509a2187cf3f0c7a1f1478b729f2290077c9a1e03c92453c9484bc2b0c8b980865f638c5956fec810f315b5d4475228c6a2dbeaa7cf5ac4f8247cee312ee11b417bd4d45d1806dea1d33cf91f772eee33d313e8cb5ad57d652a2567db3bf80bfed5729b28a59d5dad2829cfb49d1d32c783ce8 +0x4f7cc474699e94f2576b1286e583a744c94944d276777d4393a5d478de1dc10e619596afc8ffd242f8ff3fbd395e674e +91312 +0x22dbba2b1a39074ddac736767ebdedc37e4208b233e03b349735f9044deb9536e1eaa81350cbb224cb90048db893dd9dfabdd3a272f87402c5e72e8760d46cfbbaea02f5d9a4cbf2188590a7270a2c9653ddeee0084b3f5a94f885e22dd147f436439178beaa9ade4a0da46dd40824d813092313fdc0e4648bd0c7bdbccb6d49dc5d1d4506c76611e88f0687c6760b8bc1ab38e35a3eaa4a32d7bcbf13a8272334a06e03b9e279b37a757f9c053d2ad6e62af6fa26afdb3111762b913c52bdaac7754b5be0e319eb8826d7549a43c9e209ee25fd69fabd43b113dddb3faf77051c427df582b18fe19b0ad6598c7230d7b25f8d972b0799a899189b4422a99c5dbc70cd78a73623be3a894450e3b1a6dc6ae5f56e75beb68851eb2b74ef2776d92d68008d57591caaee0be8e4a8e77419b7e8272a4e075e0a62f65514ae104ba2f991e1db9b02c4cc3ef88bbbe2fee3b724d0e974bfcad756539fe3cc654e64dfa752370b7a19614db2b8f57d99dd39de360504f4cfef6a95ac509b431ec809b9c015c9c4fd873c54d2b3eed3d56cbeb577ef4051865e5feff6704722e0668258cb4160af2b329d0a27523e659f93bc656ef66433ecfffe8bb767ad10b41016e3503ec4730c03cb9738fbacdafe3a7915a3833a440aba8e927a9c96b6a0ae0e82d873bdb9a8e210228d1702dafb493eee9ffc8829e778592bc479c9bbaf28b25fea4a132908b8b2d3af0f060f9da85318e9cb178d8b1fa57f1f6510c9e6664a9f0e2a8d6a336bfad32549811eec4000ba0956af16ff99bbb612c831854f511e6dcc7bf52531e5304a772f3ab2f0f78dfd8807176c4acce3f7260bf599f1cf76efada611010b0c9c602e28fb71b2b64108ed45193874a2656ae19424add4c9994d3811aaa7c8ca863bd19b8a0339666604c0777b2286028838cecc86680128d0b0f62587be70063506e8f2b0118ded42188a0706d187d39589721be2737fd263406d4a72ef0ca8f2e7fc943543b7351d6dd15c82ee7fffd48457ea027556b19a2427e931e2a297050694e9e140be24412a20deb720776d8d52049fac178facbc85ac688d3e3dbdb68c38597cb1aaa4f578fcf56d107505081a01a4a90131aa138a82314eace2014da1704ccd3d849c807fef096b6684af8c05d75fc1da4495e55c33aa3cd39b4b116cc52a9d8d53f32b6680827ac9a953633b0d3abb4bd1547b22473d1e5c6f834b16be5bb4481f933e5638c862e1eed9d3e32b9b61fbdecf1d054451beee679243c6e447da17f06301769d43eb575a292526b9ec799376ee132db44de232895e41a5bd57d7a2cf4bbbef395cdcd3f52ca12b4094ccba9e99a4c11e9b53cfdfd08ddbd3f17290c333b6e89479fffcc8c88e1b48fb221960b819e90ba2d96e71d06e8fae7f748ad503388a34041a7bdae6361d57894357c333bacf02ca3bb745472eead467a6370ca38afca363f6f7346fdf5af7a6f61dcff2cf988b7b4351651b1313cf13cd4070fcf46769005b19dc49d2f9afba04138ddda06f2e1db7e5d936663227e9b44c09f4bdf30c411189dc5e5723072d36e004dd757a7418601aa77e6e7162532204e0742fc71690dfee3c94b5008867522d3dd895e1e4d50699d9dd75f60ab7de0ffc65900c0f548ef102d536b7b9d120a13eb749cd07ba710a773ac1e9a67fb11765ad29e97df4e6393808207123d16ae51163d96663306813877c9b73bf1263c124364287eadaaf6fe515bc554cd0f6a0bec38dd382a0b55f138d4bbcdcd8bcb740e6230edd6db13a12e3528cbe378d7b4bbeac3dec701e94225419eb853984a1c1a713a5df15b443c65c2a3d016cf71ec23e80cb270a6c5bbdb94d28439d8226b0605c74773a7f3109678b919bd9fc302a2a4fa6bdd4675beba42e9d9c6c7fef14f944a42d44dbade3ecbfb016e4645a8c6962f53638d63db4fd056f1a0e43a4f559145d899c905f5dd40cc1faf7f643efe501e1189c82a820ac1ac945ec96ec5b6a13c614a866ee7e05bbeccd797b935b857492ed6a3445389ab5d1a46c406f4f138b0855d125034f68135b19d2bcf4d931022f3c09b2bc03ad1eafbff708d6d83cc24ad47f9445d6e55e3365697e0c6fd1f4e08ee1c4b489ce9c8c1ef6b7c9ffcd01b51a1b7c5d1d65e29f3aa88c83284e92cf6a5a34d5d3e679904acf15efcbaf9071ae0ba5f22ccee9c51ff6ad02098e242158dcc9c8e8dbfbe2caeceaf144c8b7a518b9d7ad090ab9cd9cbba8311c7af201e0cf4a35d1976bab26b3fe767201be7ae18bda36beff9ae0396046b768fa44958b9b80c394001112e78e19275e43ec1790eb75345397d6267f4b4f3df5f76105e0a8331b3b00344094e402ac0f748ba4ad40724fceb8b4c6f5e58b6acc57927a685f2ae5cd7e1d5cb51c82ac8d7de14bc1f29730394c7be82496c1e7f4041f1ca9262fc85361158fd2a061d0e14737325369ad7f9b3a74b692c7bb5b75e450122d66086cd493620174d767bf12b9d481eb0c7be3fd6ae755c9de3f6f58e16c857c887e7a58fb4cd922295b2128ba02611145cb0566c41bf0514516cba4e2bd9c1cf2599ae8811d4065fe07a02c3407fa4e7c638dde305aadb062081661ce8980970e61738a0d1b5dc4be31e2250e2c7329170c226e96eab4709fdcf8978f195875435eae48879059c7d1a28f1b30b9f42b7f8e6c1cde142e18635c1b4f0cb54d3cf817f22ad7c25bf6a022501682f6a7da1cb115f2f0204331154e24912da587769755e837e6fa8cda9179cd1feb2ab2c1563dc2f8b4561a421f7bbe63da302daa87e038779a7f13fa0d6ead3d569f3d6596f91d3513fedcd3e8ab8fcffb9f6761308089f2dc9b19de7dca9879a89b715042aeceb1f35fb06dd8a53fdc783a5f22fafd83b19594c60f475538daca677509c4247d743ec2bf975733779239493a754d1ecfbbabb34114d5d73268a44b72188223d187da6f31d9cd1bdffa271423e291ac15180840b3758d18312b1e8e9006e67372f1b1ae2dbba2261e1b28e340f22e70fcd1928343bbd9dfdb2c217af65956db09baa9c7dbc63e1cddfe25fdb92c8c2f2ded33c31a6d20f6d8729355cd9c3c253eebac0164810ac5c3a907abb71913b45074d24a5f13c923d1055e683c54ff17b88aa1a6f0746ce97926b435623f2cc60c6f565e3b363e2f6eee68fb6c0b077a20a26ffca628cd4fa67d16e3e1283d2c09e5a948d65de6e256349b568548bc151d38004caf2496c0f3b414fc5d5cb0aff0deb2505710290332dfddc0ae9486b258563bdd33f02d0407d595cafd61eb17696259bde7d76f5ca9f818830f76cd17780308f95915fce38ce78393eac1582c1b7a86d9ad3b20b3648533e5d176f90d26484fe6491a692527f3c5a04b045db5af2d21ead2c3a4d10a91162f1c1c725c0a2cf8ed2c87de918200433949b0647ccc8412397df8647e4421a9a817f1a0cccbb7ec562ae5c2f04516e5a60c4fd4471b85410ed760c681ba3fd49aeb7cec2512f111696abb7d0a183d932ebb6815df443a97b1088533a413f27f4bbf45bc2e86e3506e159177a7a17e351a7e848f0ceeabfa6937ef14adf8439204bcd579b0d09492ac52f0178f8be0b3b27f2aaa95c1df537f8c24cf651038f50d0ab38c74970cbd6c4a5ec7897c6cf53ee3e2ce4467de8b3b30aece9404dc90aed0675b3f8454baf62465ef5f1c29e306d53563df85b088e54b1577027b344b2f377a50dc3f737292098df5d7151f66527ba9d12fc65e34c504df34761e4a0fd76673d2116f71cc88215d42ba0c566469fdc880fccfee762384966cba9525c2f085da48a8bc57af1f935d3ecfacd7c694841ad80e4b6b3546f3c1869487cd4ec0be381c67d02c05a0881551e09aa9751b3826422ce0da5b7778e9eccd9c4b99903714b51750f8b553270ee4b381d45846407424203645cffe3b95052d7da68da718f67b80e7c3a78099cf5d120761565cc48ce7b0f6b37923654d397bd2e6114f8a66d6693b96c36f05e026c3d45759a7eef7f4a5c82d412e1e9af08142140cceb5ed2e9bf478f16894caa58e91be486de43cb2c653ba0f668d0292057636686dc012ebdfbb7219b26e14443de69e0af7cee388dd4062cb14db0f87d016570c74d35e75fb388b2396ba466a967a00898dd574e0b0362d5d802f4938aac97ce02b185835b712cbf75ca1e97e63f6ebac7721782109de24adf2b2370b5a37afccd9b48891ddf13a7d4c4a84ea6a01685bfcd977b2aee04ea4b28c6169aa09f7b8c8d276f2337fe19eaddd9f1574447e7e6525f7fd67e3b42807e44fbb60e75d8c3e98abc18361c740c984c267486735fefa2e8269fe8f5c223be28a674578e730842eae649342f44ce6657648b01195c1031c9f5e398e507b94b099d721659f8ce2bd07452bc871ab4da8422072eaa7b0c817d744e28598195b730471bc558d899f6d3fca159b45434676af57579b72b39146b084bf1f3ae6d756549fddf1b80d0565dd5d186478fe18f7445527ccfeb3a5d1b484990240c9527e10c84ee128015ace6965fbcb13c30d528983aa2454964de16bad37d6b1a91216c053d5cce54ee7cf6b4a87771d796bb00647a74c7b46d19e5c67634496706044ecaa3b5bf8daf4916c7384119e0a7b38440ae8ec7ba9792f0f1be3f3f60584301d344735688fc93cf44aba409f5d8513ca3533ab5da98cbc0c2f808dd950c604da59c3023d54adf78936f0ad265ad168202e5131282d546fdc0d02b748396ee5ac81756c7f10eaeab59ff0003ee9a660cf5f0a27e41c176e061b311b49a8c3fd1a14271937adc63effed80e0ecf24e235e2e25359a601ee112c3d561e7850e74ac7a9fb16d128a1bef8969f53a5d0fd855056c0251e0b1f1886cb53127b89772ea1ca6dd27277da80ed972e82f1232a73d4ba537118418c5f17d9a311329a61e5d6003456fd4e90ee3466561d3fafeb99c68997be2349a87d5604c0cb2c183a08caf80904c011474f73909072ffbbd36fdc41077cdd8805cba7c93680c667621ff72e366c7964703d01825834afeb546e5c7d2d3d958136e2a3937ee2a01c6c93f0ff571e67bcae3f84c827c2dec300fded9a6360f9c98e5acffff45137bbcbfd3f07e56b399e53bf73ee89bdeab74bc6f625548758d5ae9c936b415cfbaa02c437b46c036d6e03353551e886725c97321caa8b21611a0a007461e0867a8ba37181a1455761b02f596f8eeeacf40795c7a79641cf711b135f19805c4e22c5109d934b1bd7b5195a647911e6a1fe6cba104d7542d2276d6ce0c9231f1482daec90e30e6a14d5edf71ef8777af5efe0667474d3f8e9e265794e29d6a38a2951aa0407879a9f52c297c1542c162947073d9ca41ece7730b7caefa227741f74bdbb6f673327c7aa1baef412ac42aca245a1c151c24dfaa0c8d44dc8721b34f373932b889dbc3e4a7dcf3fca747b00701035bb047af1e4910d18011363036b2417e3c0e223a253b25d5b0cc21149b53f1b5bc2428554d5b01918820956c742951f0fe81a6194b8802ee4d3c00f194b6dcb967f729de14e5c61584910e9c12bb4fd99d987d3edcd3286ff2d1aca74339a85885b4b1111af147a59ded078abb71237f44dc107181227ea0c9158dfe4fe33ed73ee027b708866c89fabaeafc1551b52b19d3c57ce27fecc8f78f0bbd61bd8681b905f59885ad1d08c5831ebbc866ed2444070526a6f15a31a7c78fae20cd689d1faa827c3a6d426b23cd0b8f7db5b4b4ee0039367681b021ff467f97351dcd729758362bcecec3fb3e22193fdc48f0213f44c775f935d6e12793454147b59b494a96796cead888fd3e09b0958c268bb45e5d19abd817b5b948364774ff9bbc6a60ecb309369479bc4b0b385736576bb574d3959fba2f33f08ab8eff705d9161d00e24cc859097f7f8baf194e81e47a6ca82ca51b488339d014a0a494007793aa5201ac72fc3f808d297dbb4216d49e2023f2b0e52a1eb09f0f76cd11987b1a587fd03ccfc63f652f4bfd87fb9c2fc11b0cac1ec607057ea6a2c3d43776ef9271afd862a6601017ad1ab8e340bcfdcaa38ce3568687428d2df60d20ce42dae53b099f87c071ba7d4fbd3538da1e47a101cb1ec2ed53dbc37c32df199ea345faffb6af14e6a2467e5d5cfcef9269152e7df0e5c9c313db0ada7fbe276e4237b904de906fde9bbb041e21966e2e456d595e24c0d3cf6e4749910534b208c7b80a94a7c802700321f6db328a1f765c590aee8e3848da0d2968e7ebc82232d9d0d5f53ce1346683813bdcb760693453e0297357d491ac98884e255a03dfb520880270c3636c87c2e2bd69d9a1b32ed50a9e36a61d140db66de592796b515946e7794d65d4149a694c63cabfd4672d88e0517fa49a3ac50fdf1478718ae1e5f0f623d449be93681fc715469381ecf914692a9678d36b9b4ce6c31d69e8f523c8bce64d98a851b98d5cbb267a30aa5a22ae12c24c501059158adaca8a0bf7d97641abff791bb6545a123eb39e6a09185ab5ef4c459a8fc511d442c7fc7d4dd0a28d5b33159e2a032ff2843227b671fa6388ab7c8d3852a8e9cbe15ce6c661d0f3a9dc3193b9158cb40276ee3d9d4acae62f2c9a4cb2bfc94578a0d1706c99a1119c18411cf4dfb8904cfc2e06a6fc4e8ab05ceea99140f2cbe1676dc4f95f0aa56ef5abd8d8f04f6cd8ff39ad59ef4ff81521c0cd5b3ce926101f7a07f51ad457275db6eeecb019efac6558583e8b94d7666557e09b1b77fc0dae3e64e631c7ced037ab87b888dec2d218d330de39e7d0a90ffc09d64464f6defe0201560eabb3716bd2cac5de658c52fef25cc05f0e8be807f770962178bb8df60d06cc1848ad10e073e09a1b77f63201fd046c67d2af2a35903e62197bf4227da99cd1b76665b780d6f0c0a8dca87c083b526bb7fbe478810f9bc3943448a37d1cebec53cc826d324323bdeb5c4938faf56c44b951d4d9d3bbae40fa6c601addaf1aa55443ad3bde01a11b4ebe816cc1737a7fd39c255513dda061b4ebe38e85aa518423938e276c59916138ccfa2244fda5a56fa37ff429bd98ae28797a085c55ba122684cc3cc5931b18114c59616bdb143df42f8bbffda3bfb0bfdecd8f4cf77ad6c6dd107fcff769c7400749321e54f1cfca08f0bd77d73deee1e1832b3ddabc586b6801fa73cca0f62fc5709b45b161e359f657f680a039f0f74c44e41544a6217eeb48b49a5ceb2e454e76a7c83b8e0208c16873fe48db3f67e5bac3bd7e60b8652f8cb52aed70f5ea69045b8f37a0b34130ca3bdb154d629b758bcf1dd013a58afc76060dc857d686e0c2c183f0bf7f6c0c2656fd50b4e1f9c35f111d81e771531aaeae2935c956817957e08aad11edef1d23cd4e403b45eb99df8fa6db03a32a50dbb5687beeff44fd6cc08db5c185332b6aa7b42f0715d8bdb2539e2490c37667a524b0e4ed583533a86a7551f5cfa0fea2ec196343d928f88165efa5b55a9f28b602ebb6eee9bde5b4e528c9d6549f5d74a56425151a4212f4cb7fa69bef0d58b357003a1b3b45d9373990658b9b961288d97dbda55e90d3b28f386f690a27c2472bd7b89ad533d8da6f946d3c2ceee385904c731c30790364b900474833572d18875878933ff0aa458e1b281390109914d2b88fa2156569b14fc17860f30560ce726bc12f02e5171f9e0fdf354e62fcdca8ab585e97bcce425b6248d8d1972412f5f8dd95a579e710a857dacdee4ed386190d17793de7fabee4cb00d95676418c17e712efb013e1c2b2db6101f93be8b92ec4151b8f4cb5cef3e4e78a080a7fe3e020a962ac1dcfdac783bcf9f691011eeeb9976a1654c71a8f95471472bba6bf588be91820fe7703ec3732de6db7e75c61d4e8915967f749c0c6669e19f27dca88111c39941ea1e32bdf0cd8e617621c8ffe4fb6e1ee0e048e5f8e518715cda9779888ec90e517228b63930eea183906811d1302344fd5f202480555438e5e072d09775a9dbba06915ab0ca9002236c13e1a7d9cdcf411bc236913d1d5c3f88ab34d2fab42080360cf9fc2d0b19d1ff6ceded5ac61438d09faaa02edc61e63da104af906083409aec328fcac84f1bd4c3a50635c49a610828df418d39c0566a04cea1c9376a77afbf92c01650187d86c89576ed21e8461cfe62d9fa8e2e2cb847014e27c14c91ef177941a22b0c538fdc3dd4036674549970d3fdd971d1c582d83b091e66a03bc3647498f0b1a14a4a8f1c91fb1ad50908208101bc5d71bd6448da572fb01bb1e727132a84ac6dde5151903546b770ffe3ae18aa05d97470c7097ddcde3605a0a4efb36ad043c86c3eb4672268b4de95a64a094b685e608c45aa73feac60f494971ef3fe564057906d37d00df39b7466eab4b15a3654bc6c4aac8b310cb97efa3855434998fa81c7674c894c69f3e8e00b4ecf7b0274ee9d507ff21881a7fb3df2f33fc11b0add9db772e1622e2692ad92a8a2125f077d9bf1956719bdc4fffc719938195ed9d17fc83b86f3c2dc180c1b32e7b4aeb4ffe4a89d48b8e39903a21eb7caa6d6eff3da2416c855ca6cdf980f7dfed663d5dc13eff8158ac58c9cbb64cf75fe05c5bb595585441c97515fddda0a55fc3112988622266be3c62821c4ee50a8837df3ae69d71788bcdc321f5a15388b9a78d3cbc7f9b8aa6857e4394b15ec00ebb1e22388234de4caeb87a4794ba91e35bd91dc65d11f6f9d0d5959ba65e1ed7b1429e130b48906ab57ba75d7e7dc7c5271e540cc42db09d658fff99f68d2ecc647233df025696cf2a35309e2744334852846af87c97c27c8cd30af66995f7d51bd76b042d05f661550d9e7157b6db522632e6f14cf6337d8dc93c1bc71b81db1d99cdea54feba0a7d2c7740d57bc9cce951505efef30c87af9a206ed8cad5c4b3dfe1fa41e9eab1ecb946726a3c059fe40831a9583554843c6e3b586447fa7a25d1309abb6d8c3ee8dd906fdea195b15f8010392365135b7a6c1742323df8e3bb9941338932aa98bac0df9ef95183eca2e07576262a52f4b2bd3b920b52d8e9bd5c9c2e74e14ba9aa89ba6982f5d737f451e8c82b2d18372b882fb2b72ea1737245caf144227858ff61aa37433497799ffbf297f8156d0c2ff67c08fe7a5b68237952e6c19c388d036f367102b7cd9ce9051a4b578b595b042fa9fea8de0eb21823bc74b2f89330fcdce67d882580871b98e94c0d37e50cf35a3efa7c01c33899699102e1dd912a33cf42c49d27b9227cdbe603e5c0180744a0c366438c82e2ee7358fa14f43b61f071d3ae08657f5556f799d6a6cffb343f28c1a9c52651985e6a99c314e598be7be920a49386da08ef138a2e170b947b2c1bc02bca783a423276ddc5a957b0291b60b10c0433d22391584274021dedc552a046541a2a44c8b3beaa689af28c8b19fe0f4f2413708e82ee480e2dac0ef8fae0dd8c7ce37712266b8b14b15f33cabdeac1d6bbcfbb320afc24666061fdfe6c020c3bba4bdc09d6a40531b446add04f4d4f08910ebcf573aa5fe265e4c4bdf02f5cc99a0b7a930a92a2276c4e0383174e424c6d7979c0032280ec03dc6b1fce8f539ee5cb5a99095de95ea1203ccd5d16210c19b7fc7c04890feb01f1f80b4d497b22623282041c2c623f1b64609568cc74af5b714d0fbc0a944728cc7568b6865cbedbe9fcba8b279630a1c178c38199c49dfc4f726374ca98674015e920516d7cd81698d0a59e780c9afddf8b3ef0a5973dc4f8755e73f4a3b511735d1a662765dadde604ac9d444ce6f567a1f0fd1778f97a155dea03ae3b98628fd83e3ddb9f2af67ba2b6cfb6df7a5201c2c0f018ec38e84d33ee6a20ea78fc1162741eb2b0322900b1ad7df34cc0db54f79610cf7d63d449fe51f17437bea8a003a450d42258401d3a78ef261b1e5a09475aa665b2e007b1c6fde0cfaad02ce4c4b61c687d06017944ff6d75d5fe95c7bbf4fa011318492c94d97f5bcc175087ac92ca9647a336bdd72a3f0801c756375a4d54cc297361626fcd154024fbde2ec421a2880a97a590fbe1ac0827e163012c4bfcee7b5a19fc5fc1eca63be59c831349eb634d49179bb90cfd9dd0b484cc39d7398e923337a26c9d4ab4973b542ea1f3ef529923538618937bee83a883408ada55d4f46784fb9f497892c266ccd77608f47b758c23f8215e6b24c8252706263a96e92b5fc8b0ffaebe6944cfcd259b6e430669ec4d99db551866279337c615e145f5bf82cb6894b26361a3dd1ec0170f241cfdac9a124e61c9dd295a7c2760b5a91f363754cc673eb1a169f78951f2d1dee5ba32d20b8268c5b155e2bed20ea00c901ae82d847f3bee521d87d480349ebb8827e7bd2b805355093393c46f2789b470f2fc1c37e58f639b48f4c8f4e65d012dcd33221b4f0bc10d4cd658a5b457eae647dbea8d9f2458a571a62d5610f6f9fe327fcb83f77751e72711401cbbf4f61aa0ed5f30b7e015972005cb4db850eb20e0317e09817e4dbc4dae457d47472035859942c534ade19ade796982e8551fbe5fb30458f40afcb744132f705d38b05f7e4a5df71f7206d6316ad19ca7ecdcfe356b25165802a7fd96aac69c07afedbf1465766b7f17ca72a440c944fefd6c08ecc3a8ecb54d96b9cad9d2aa4c94217ece5356cc5c837697bc631a22f37115050c21578114d51111690a1a4135cf92c3357cc5c0bfa0516c033b8cdd912e201d1beff87e7c81602dfaa4670ac84988b7cf488aefaf55a51a0031e61edd1dd577a394548af639ca36050f81ad0fe84d8227206f03348ab8c83babf28ce1267b3c2b78334e89e5985413b230d11295284bc26a3aa15627d49f3d1276d0a4325b933c035d713d6e13aeabf73c1ed839603a2a8fb4731e153fc78dcf3b912e27bea55d9d999c1aba806d55456c3e69ba3e79e6f8a521933a4167b348097888efea9a16aeb07729b22ab8990589d6cd020a2d7e0cd553bd7f24a738e7a72db9702899ef9e6ba9713e58b8009d5b910cf70c817a320bb0a5cc2eb0a313df57c994bfca71d590dbfa4751951176aa142f838b9b63d411e0520aa9aa7c33779ec141f95623bce7b4cdb35e7655f83e0a3e8dd1a3c159ad8ccc1fdbbd4cb138aca8611c658db93addf16cc783528bdf193ffc24c21a29a85c1cf50d0f99f4ea2686db711e38354ffd6e58d4e6929854e93cbacd1ff8acc9f7497386cbee6455b7639740aaab99efbd4d61cdc49d8566233cae13e4e24ada065b809017d0694005487dd1316e4be2c5956ef948f9bcdd6f48c04036616ba1305b06711bc96b75b83c756bda0ab5f0bc4e66a19730a3817467d89b3ffc77e81e50ec720160d2ba79486757cd063de14b81330ddccaa419dba1de6b273bd67577421adbee1e06d8f0733bde33ea4d7c1935bc853d4d266f4bfebaf916a6f010e43a77f40c896f97c4c5d946343f4c8acf72e951e24391496d87558d33c62d830d3eed04832b76be9d4629d7f78ca2d31440a2b8f4334c70e943956ea622f695995963557b8c811725ff14dba559b61f91a8cf039ba6c1ac663b63e69842b10d3190c22d1b32fa6801f78098652ff236edb1587bfe2357c48c75a83b31afc8b47cedf0d58ba7477adc3657576094bde0d16425654632768205fb4ab698f0a1522377d695f473d2155cc57f60bd137fe4e5c71f0c9a5b86ac76d5339ff68da6afcd365cb47e1c010029abe2fba531a10bd0e52cb72327ef0b8a09493e720f3d9223336b7c502c3e05ecf066704078891d3bc335ad091d1a67e7a176da35fdd0c4cc75e933932bf0ea4d9df506b56fa0e2cd6b233773c66d8835a4a0bd66dfc60e7104c0226e9f7e78f3b976072d9e4e212fe4dc9d89a851351d1bb12d2e3e8736bae9d6910a125277874cd0b9cf8efca408364a27754d2f38460d9073b5a07b044e2b15c88e0bd3afb05fed65c4c61031016a541d5c3d6d575a8225d722900a42d6d2630e231369e817f8b45233cef491c286e1c669fe755bfe8358a09d939cb6f9e7aaadf1b17ce964220dca452f0e8cf295db6bc11aad0bdc161118503399296071d1eb1f6d747b3ee2e0132270c8e9399c29548f197f319c46388561f76964b378c011d6cfba664d421576f119897241a5b3c9f9815293e618b530f867742c99055f663d60b4723a49953bdbb3b8edafb7611227dc8dfb609670613e0c224cba1e96347da7cb66adff46aa07c5bf232edb1b7642b19a2fb5c752605a6ddc8abfce4dc1bd2c670c4d6d110b9dd705dc6418c93e7289e0f78bb34174751308b0501a6c572678f12ac39adea5c771f2dff97653b3deebc71d8b6326e6b7841084140cdb3ce012cf89b68f96c1ab1ceef696fda11aaf5fb7675cdeeafe474a5acfb4ab82b812826bf1cf521fa7715f61e7e3b69bbe0c6d189fa62c73044eed5058d7ff4915e4512c2ab6ed639f42c3b37b87a82ae61e9e528b1356ab40f3f358e9261119997f0679fb126749f146cf4c7a2bdb34d90d79cdf4496379fa5fe6dc4849e8d88e0b29bc2d8cc9b8e4a40b95ac7658a2e00087f2a1f05bc479b94d433ee78c703aaf435c88cb1a9ac185fff4d911265d431f4e275cb14776062ab1f593a806c7e694dbc1d47862d6d01034d2c8a34d4c4a9358d5eb342e76e9da995a0f365dc7d9e27953d93aaa54596e319842d5d6563d842d65172018ac6af08dda7a3699575dc0a57a5fbaf9fca4c67eac0f4fc8656319533da81d0d00d19515dd9b53c35eb856e89e2d9f57b6f941a478f7b82b60057b54c766d5165a65f0bacb3b33e2c633cdc9270c92cc6a9f072a62c2b8082e6bd2b86a19ed3aa26f2a030c227efe76164dd17dc43b6100df3f98d437f966b9dd45058d881082c0376a790818dd2056a9fd86081d411d60011177351f204de8a3fcc59a7ce4f49c05d9a227e5f74e4e34067230df4d09724da64ded42d8c5a304207ff8bd119b1f219f09d250769246fe901d5ed1062b1f0a26a56468c7d7d249d9bc0f13407c2fd2e3336f23fff42650c20ef8bc158d4d82b9040159958a5ebb4e03474619a1b562cdaa68243d7bd672c4cd68682137e5fb85f42edcebe72d9fa8dc081d43119a1786f5231cd52f3eacbfe2149dd32fd0beb5fc53bb71f428400ecfba6167d4c43a369c0ad272184746dbd66623d37ff4136fa5d6bccebb37e5a965c5da2cf31d1204278310ba3fd7873f2fc4c1c82f3b41db7520a8aa4443d5a12591503b758ce9191ff89c55abd7b8147898415a458c9223f69946af9532591d98868b3b62f8059d0cd03fec6430218136496932cbce4c6cb0a96083b8eeb945440d52d5c24bafb77473c12773c80aaff33f02f8c8ebb8e12ab9bcceb55d3d42b38c6fb19e6c2f8fe149eaaddf89bbc536e2d35445ca1ea7ec2f243992692d3c6d6da876fd43cd4edaba8227b05a7bec889aa6ec4953c6e97e755d6b59f9d05af816c6cce8b8d11ce82e503cef22944c70cf416bdc6ef7cd69f1320d12f46fc5def1915d66b38220910d1d95a3cb4c0c76e96d770603fb7b340d6ac7c34452a5a764d0ce7f1c2a8360bfb1d9d43cec552250f2b8d0fa181c6730cc4076d0c121d9d94dca3bdb0f6cdaacd4b18a5dbb4efd6c98d8413b97d88ac1222132800461feb7cef7a3d87904893c4ec5ce1603208ea6277c62afc0d6262a3211003c628e9d661cfdbefcb273f4d8e6bca74f0af25d64664e393cda3fc2d2c5b9e7ec25d03f4eff85952d01e0a3e6663f1ef01aedf30f1ef6d1cb2f3ae721a2c1ef78934e6bd73e372e54ad731fd094f53ae17938d710171c2f4505f01c7f93d020c8f531a969a3ba935aff56effc3887030a6ffd91cd19675d90a589e9545e8e83c592a0816cf4b7cc253fae9bd41c9c81544661aab0ec7f6296572cd608cca51f55b4c47c48fad5df9fb5a6acbe07ddbda5448ea920570d463d62016c03a5bafc61a1c521657dbdd6afa863a924c0f1bee7b3ac168524b9116f103132aeb17823d2a2caf92b4516b83c62101a6d10828c00d9e27a46192acc13a7e4b16fb7849b8efffb8b0319898e3029d38701bf3530daff595ccdff097f1170416faf81896c7f00815f53c2be5f7246d4794895b4b15b6c3944819dfd3051b371f6d7d52d9f8ced84fd84095c33ea013c78aa5aa7176d6aa9bacabdafe9bab89cce4d7c183b9c0d2beeffb40c1380a1330a8fd5b56bf73fd1471025c6b136c6e87d7b3ef34899a99fb92b8b75051c70e0b95fcf87b4e034da72bb9eeb91ad26808dc7e266cf6a0908e66f584014a6b46c0c8210c5fa1291ecc433f0c68f05218a869b3218d6f7758dfd35e1144506b6ff8b60601645749e2ec4e1e3feb627fd2fee5ef4b26828355687e4ef9aa224bebfbf6187229eeea3c9fa2b3f3c0bfb02964f78f1db8ae5908c0ce34a7932e813d72fee4c920c68e7e5ee7acb2798697ae83051f13c4616d057129cba5afd3bff6d646d780e98cab3a829375068645aab4c1a51bc7da3a33bde237607e50c03c8aae448d33d49fc4f3d32c896a677b4deeb94e01945aa741a4ac6d9f8c1662ab7b539e525c827e703ca9197658ada615cec2666d13c6171b4c2842d5797139614b7eaae36563a711778cf0a85bc94476a78584bac0bd283536fe3dbea0e1c3127d78009ce908b83d26e738bbde3ad5053b7b3f7725a05903d796d497acf88e1373e8260b41e21067dd50581d7a72e635dd0bed2ebd00081bb07aae0ce815f908e13781ab1a704e060d40d5499b21e67d2ec0145df16cd3f15412108b0cdaa25727feb9f8dd33dfbc394146bcca98546f83205b615d474b193505a2ae65b70882caa6257104cd33dee3ca13038376be718cb518e56b1fbbe7d5cddac39d2b9a104bb65aa01b7ce9028f53d0aa402d93279de6e366a556c501a8c33f871db8d5841da7c002abf37dbbbe76f61d9b2d60f6594e2141969ce4eb309e374561df5952d3130c1510a1506ed39bf9ea0f06b66221537922b952a9f90fb758aaf41f8400ee508553f4070f80714b527bf649f1ff988f4176780872df98971a146ee9f412d218d24bc0a509b509fda65feb57a223215a20a96d3eddf36db6020e1cdf180d20b45979010bed61203b5c0278b045715e6c8d58035659d8e1aca714985f6e545cbba1482f9c1919367cfa1009046a7ea20eedfed4ff54f4b6e35fb46bfb659cd8a74045b6d62b41df4ae6e536a47f8f8ee9d90a5c9a8ddb3fe2b26a0233ac2b370fad0e316a828f6d1dc91e6c10f3488765b506f4a83300ff3335a1e58890a40a4d3dee2999bd36628e170813ea741e2e0b387157a902ea674d6ff8907ab17b94f8a9820a1439eb71e4375ee8816094e552a9d5d02d6c0c2aa9a7da9d7a9d36998a46564d4a9712fdd8c06f448647214fd4afa108a5dcfa9bd0a3d46718a2497a8abac78dad435188d438d5a269a667bff9a07f6b92e41a4d4aba5287c56f48aa627d7225cccd0b855f171e9c9bfcccc83a22ad6385000fb17071e16a1152a8bbb9e4d2b029a2c585e1d1a69dadb8b50b3ebcc79aecbf2f6afa511da88d0aee20f9a765b7345303fd04ff0a200f78d4cb5fc56a8c4a801ddc40de43ad88f68d7c9a2ba7958d5c3b7d2105b5be419b90bb15d2e2922ee14f77dc801ff3a5840b2123f814f5853cf068ce6c35e2e4cf7d4d097bec46fa5128d035dcef155351eba11f733a31cc63b75275c907185952fee39316d4354d5e5e77e54b5d7d22dea38ef55383e4b36ef4ccbf72a5d91fe49a216b3a26c7887744d15361c7a58488c74d3def8e88eabd2d39f41f9e9fb8e2e388ca6c70984c3a707f0896da3908fecb6e61cdc688d2ece52ccc166df6b4dc4f8c59143e01f8f665c38d80f182109f2464f964a88efc6ca1079ffd7058844f429e9fc7ebaf2f5999615a86aa2b5bf876b37d4ab0e5d7caf56cf84b525fb7aa7151f6fe05ea4fc28fbae83e608f1b7916fc65f68c37e57636cf6d769056bf7c3029073d196deacfbd42cf0eb147ffbf99823bee76ffb5fcf9a1580596e81c43139648fb928480efb68b678e18c0793a82f777992da7b9cdb285508ef27e5e8da02c24c00dd89290e0175a130393085857be919d0cba717705dddf692fa3e6ba5a4d2310e7d4a061de591f640e3a3db77c6a225080c27d77482d6d2a9ad355679 +0xd0db3925fd16e5d96a41eaf6afd702d62f52855a84e3eef742edda22b0b1829e0f1f13669454bb06d72fe133a65eba6f +92104 +0x492bb3c8f1ec825b71fce8a753486d26f34fde793fd93ababce5d00ecae3a17928230bf7ba8ea9c88a94750b0e652f8ea96403e573d866b93de54163d0bc51b9760ecd28bcc64a0475f7dd1b02137f90d15fb5e724a3705c14263179d5d972e73bd342857dfd2fb73a0f6801b9bb23d475273da7d9a1204a488fea7760a4ccab805aaf33879c1e8adfc260e2bbc3e4019ca6e34e1a3a402ce107b386fa8426ab4c8b5f5d6209e0246efa0be98e958abf4fc3ee0470d696a9e878d3ce29e14992a74e992994ae3d2fee9eb33bbc97ddb89566a8f061ddec6a64c993767824fe06998ba4bfa7f2fc5068969e03cd33a5917677573b77b708165de23ba76cb30baf2b2ac948233ce731e3ca146747d0a9f5fadf440c3acdb256dbab13888ff73837641350ec8ef6c47a67225f8fb4d5b28a2a84b78c3185b4d2e70c624268584f434d2e81d272875cd3fd86c6a49bac88f80d4ff7e3e448d53188ed72fc7f3f167eec64a323565777e2abde90ce85bcf3e8ab284e38db7fdc1cc73689df5d12578d4b9b0006c3cedd527b120634f96dbb020df802b39f90923aaacff013893ad81b72bcdea4405455c9750a70ff7f27a7ed3aa55c7eb7e5bf343ca0efbf8b2062ce67b086255551a8efa0ae16569f5280523a19a4beabe42bb18291cd0bec2bbc4e345d40b08a2d9e6e04e73f62e2560ed8163a229e04f79d5a868bd42033c2b044e1ad546d6850ffeba99b344bcf9c1928d5f21e444985ded74f744a26e84f0458748709857622931198b33e38ef8a69e97f28dfd802f6b7cfe536784494398131f7d2a8203c0c2285d818a351c889c5c41dc4ae83b7b1edea51b7a6a3bee8ef7871787965437473f271b0abc0e402f761b6add36cf1204bd19ae11c6beec416d4eb60c47d12c34ffe6c65a0aacb5bc56752cd96bd37aa982cc89a21c3ac35bdee6c72d19032627e51d01ec83a03fef87ff90b3e9b12b79ba2e4ccfed381a3ae6dfc96e7c529b7c894a5c36d9516515850b44f153009af1ddcf45efcc4f476affaa3b45044812cf56ff33bd5e68cbeac838a8161a4a4fbe682033861be8e16893d6ab45236c128cc89c3704853ebabbebf848a6b1f6b01be3b164275e8d5eb04dd587e36c37213168b1c491004bd8254ada9507bc8e72a6daf3764826b535ee78376fb44121b549b1c07ae742289aa37f401bcd9c79fdeba876d86ce6f90d5fcd6cb11c34c445523e58b87bbd5d88b2f3d94b6cc451b866f6bc190a21b13b9097f5fa9fd98767d768eb0bc2e44318d03306b279d6ae4885202396a46976473d7253aac381f37345bbe7e3615981c187d748df5955d814e2cf5e0fc020c0b692e716500bd0812e29c1dfedbb8f8219463b2020afa477a3ec4ebbb2f1ea29005d50be78fd47c8cefff5437945e8dc9697e91d34c144f58c2e48dd4e9e1807cae969ac83fc4a32fc44d0b314a507f9bff96ba07a52d9ea2415283321395cf57cb37c610fad7a482c74de9f5e3d7f520bf73d4a6fc8b5be023d774dd9680b6a7c68139c8a753a80d61c9978a493917de0fdc88b93877af9bcf3b09de58ea5ef6063c98f82e81d659fa87bdf862be0e5f589a7e464339c259af46e93c431deecbf3308ea677a957edfb51024818b0022b03765d580419bba52ac0bcff3e608faff524c1dc69135251caed0e8151551ac87635cef4635fc204a8702c3030fa692974e2d9a1ee06f00ed1238aabf7f77fc01ba2782448520100911fdfd50334a3c1d8307ffeedcc59ab77bd1ecff1dc599b598404ef9b3b9d204e957df99e5666ff89d75bf94fabb4b0238171f4274ccfdf97a2195e4462c1ec459aafa1e9a8d96cf09f149dfaec29a63f392c22819109163fc560772c0f93eddff61dd7cc71258f734f52efd7d6e21432abf661e7f230c7b8b58044398a3baa84706ea22ffb71f07bb1bff9ceb3048264a078ba41b66c7b6a3a22cd541ae2ac9dd24a0bfa8ce618718b01c2c8c9ba783ddf5a347726e4b9bd1cee196609b07990e25b18156dac8ebba6c052ab622a7f253243d8718ac10919228b30559dcc9bc76946d368e6eadac3caa5b261c47c1e845fdbad182a2af3e616a21a0b1f5f9aa82eb644dc3ec885efbe57e9d037d9dec22fcbbb524d48008cbedadf6ed690fc9dfb517257bf6f16a94c7fffe2056946476abb0a083c43b773e2dc88680c884b0d96bf65c2af0715583ac5fd7d7453de7bd852a3234042a1034c501de0076e0e60c8a9250657b70b6351d0ea8bcec02ec740398d899f6d44a5c3dca4bd116bcefd59b7bb09ffa87f345949cef359d7bf916c18d024a1ed2abf0e2b27e970a7124e11902eb5ef02f9321ad7b19d5ec11842229675da90eadbbbf6e3ad4b6c4962bab8dd86f16eec01c55c239c7124a5c1432b5b8295b28bdeff43ad3fcb4f7a46a91545cba4c58e2055e6d59657f5ac43fb4f10023c51f9baf5bd30e4515f614783f17106b83d11dd4a8194a83717fd25d1555dfab7b35cfa032b15a4c5e627ecb114083f141c9dc10df508d9f9d3c2ef2f07e974ee20db23935703870f2af3be9946b37ca0aa5953040ada318571202a7c2b5d77c9e29ebf0c07a3961874ee44a44f1ac744316e1b9887b2b8c339415d1f8a600c3040ce55d6049dd8c60b3f063af6e427e8f704a1313637779c734d1082ec9b3a0b81936e591698560239108cc404baa57445416e38dd1275f6666bcb0c19b50942ee1491fc043c16b544865fa8424347d06350091345ebbabb5bc41725d85781bdcf7a462a983222c575cb0650752817e59957fa2c36684fd19a807b35f229ab646cec16489822821c1407092268101d992f7fcaea78343b226bc680a430d28e200c9387bfcdb33ca06961f188e2a460d56cef00b4d2f5869416beacdb58fb32d7f89723f7ff8e5a3bbb0244e9aa8ce8829ad024f40d543911e2928a40324ba072791f7258f65be3d454128dad896fbd86ff49be11f1f85b8019679f3c886bdfdad553fb4b79c1e0527ab8513b47f5e8cbe3835773468af4c8016875382002f7f5545c46365268589f761c1afdacc7703790a57682d4b10dd3e2ba939ac3b9f1ad4062db8247f953a290676f5a7f8d5db44dd8a4a66316ac88068881cb3938d4e9df8c4398211cda430fc1d9ba8aeeb72961446847ba60dccfb4f8c8344a26a8917b0305dea778f36a3d51df859393877d15104acda238a2903332ef3cbe2c768c5aefa9bea3b6a9ff604009246324d59ab165d2a0e34608b3cc5f7e4a5cf145c4c477b79fdb7d01eac1b5dffdc248a7677d6a892845311521c7a7fdc8ed1e1d2003c3b8e919760513a8d9ea7978a707ccc048f6cd90a2d1c06c31f51d395a06885efc34032349bc635cd4b1004ceafcb1c426a2f88b4045790226eeb1084e09e41c4ab157c19d2ec027cdbcfb07b98efecf2d130fffb47835d3ad6eec22a12d1c86d4b94cbd1a64134fec94d071bbc69b2a84d37cb4a572da25efff364ffc7b19e4c3d34ade6965451d5bc0e95299ab711d556aa572bc3c51411428f75607f9c17e3e88b9eb32393cd93fc8ac72fb4666efc55ef401a1dd836f4372970069b1fd9b6e5e02ad1ce9e2cbc3358399879d63eafe39cf28fb5d57f7a4637e15cbabb6847bdf8becd07c1e3b0c8ed58ee8bb51542882a0b072c5b4206085145dd4eed2828c93bd6ff6fad770455b0a1ac4a516766ac2ce62af1c84339f60c29f2d823bdbc9010000356cf7b394258a05c4659c98ed80c1045a6aae78887aeea57d6fd7d75bb1bd6535d9654c2172bc178f01c902d944e15e1bb81a37445d02356dbd90c06a2b5a679f49098315cd0a17ce8487fb5597963a980db0b8fa916418a5754cdc1df841ce1bc4cb9f98bbdbcf28f3bdcc89ff485e7c715842d39c7e16cc9ff5759d9fd862505393ead1c69805465853be9e065f936decfa1ff708b6f68a4172d112a889ebe7fd49aae975a782cfba3017bc3443a113877e958d5d76828965ab38a39cbb3087cbd5280850710e6c223e1f0a105c501849ccedbe2125806e1288f47801d5fad9c31fac54e05e70c5976420b1221368213bcc6fb1de2ab9e451f14cba62411185f0107ef8acd77281218a60d9f2ceb0d96367628f1beff59129ce879144663d32578ee51a3d42da48c89828a809f6f1e5cb83107f61dbfb1da207ee2431ac468802822be3190871c49577c049eef4f3f07b09bfaa37569531c484c99cb07bf331f8d5967aca92ff9b8f0d70e2292e7ea079e2b83725c88975982e60204a3b0dd2416d6f07d8474c75bf43809c430e5a9dcff4434fb399a09025ebfad985545c16e634fdb4c98e1ffb2b02379ec3fb4e908529a71a6a32a22b73a4e0efec2fa8a2ee118aa727d142d4dd30df11315d2421a1682ebfd1f957ed8b425b890432b92161eb5c0879777ba9ddb6be1c169ba2f72d981e677157877f74abb1cf57c6573947acbc0048e89322317d1ce8f81f91bb30a3c039d0b5f98836c92aea6c544992a93bf2b71b8b52e6e36c439c6250b814b3705c5e787976b1da821002cb4258d58e8046547aca7f9efb6a7a61d996e1abbde73afdf10dc6a267c0a93efdf94caaff6300ffed0ce4f17f61085fe759d22756f0a13fc1d7b102e56a3fc789e2edb803cc67e2fdba4788793836bd130154328673db4c7241ff795d6818c5f76402a8a2a3c422313a710af0d74ca4e5f62f7156582e4b8cb177b1d6a27c5fd0e65521e4d05fea12f52a20ed26923be6a12b8ecd87e3649591e24f58ffb5bd9ad2acccd23b806027533972770c4fab9d681031f4e941c1174808feeb6a0a08e08fd05173cd6facf8bd68a79674cd1b93b4a501d1649287993eb16498c8c26827858957d06c73f70d997d68524352b44eeeb3a76fe11ce1a4dba52966022604f91c9e86ef01d669ef50415cb462279d587c02cad34929f5bf87abf65e007e05ddbcd988da75de29254b7c2cc3b994ff39c85a130782ffeb72aa8d7386aa12925ccd000299aed46037f1f67f8830e0027738832a1276e6ec45ac1147e8e829d4fdb7dc9f32960035aea976fe09b055cd9c3644b6fc0b2820c1f5001a8ca30cf348e23504af14a9d110ddc651501f398930296760cd2b0cae6ded219678c10416c5b7d3dc170f185be8f4ac1f6567d55db979b2cf8ebdd9bed1fd3e61b62c5765fd9c7dcd737196fcbb56f1104e6e7172c18deeab47a9d87a768b1d234eca4d0977fafd7fca2169dc136a5dcd151e55f0cfcfe39efed75108e30187854685302abb3a199c2407d922779ab7fec25dc8fe6ca6584ebd2f8b90a0c5442ea84446ef52c29ac98a0b30f7704ec94b5b1513c41e7a16638b98d03b36411cc87cefd981c3fc47b00215b48285ec595aea2d7f6b70b4e68671fd66302cdbd7f8c86d2f08964eeaf9970dafec3edd30d6768d521be7ba8e5f754396980afd3c6896a890ab5422494c4edb675c23891665081dd4fb0df5d695a253a89b590e15c0ed87469284df2e4f316725fbbd58d2afa7c54f3469cd88d1fd15e460a07628a7d6f298e6aeed5fad479930f093b32e5d5b6d09ed83ab6aba90719210679c3ec657d1cdcf5ab4a40c985ad2642d00f0172cfd4b4fe4f546f96250f9d237ea1ec57b0c2e74119cc7152d90517f14a8e184235d5d821315e2357b9862cf96c7924b478c03fe5a0d8e6f0d25f668cf14c94d477587ad98710617e433152f0f9b6000c5379494be6fc3c240ff0948e6ab701aa12d11f9fc737c46a4075a1927cf518efcf6285fc42a2cb8cf08d246e2d49d92376e428dc6810b6bc3fe79b568c92d9af4b20887f4a692f7c126988b4af91a5d131e64927e057a2e4affb92c59f2bccfb6517d33d64bbc271e43a53fa681ad243d27bd2fad66923640f164a682b2c5d249bdcd8bf38274f1ef463f887fd41f8fbb6f968dda0c1b2cadbec04a6c72124eb5dc40b8d2b180fd3b17af915b5a374597e036d38d5fddb7994d16419e9869e9039820e2fb42a9f20a9e3d80c57bbfefd961e72a4ec79f800d86adb3a08e934b3ad7b330f79bb77864c3307e429f7d3487d9efbaa6ac2b2f1051cfc7fbba581d628343cb4d267239526ed2b25c2e3bbdab3297aa1c76476bab96c2a536867f07848316db8549a2dadb8769459a90bf314c532723398dbcdce53dcf76d959d2b0a6bf7487286e0e0608f63e5e842dd1397324e74c8359512bc62e3e626d9a17c1d31fa7f7bdfc7f63e0a39926a36d3b7d278d1e4e8443d0005652579079b317e1108bf654cc5bbd996b76c1c57eb9c4a470761650c4b1ff029e8f6229850b9ab967eba8c6ddf29051b15800629e77335756c7157bca0ca8daa5cea654190a68f1df270674792bc033bb2f9c258911513de26864f61ebd913073f86c3abe18483080275887276d14e690e5de37c9ede6ff1b414bea482a83ab11f3fc02fb9d031e53d4e6267021551338600ec0e675ba440a3b117fd0bd45f386a99ed5590161645f14f77adbad4b61bc8a74e7660f94b5b53c00dc3fdda1b1da009adb5fac2aaaadd0d4abf07abe79234958d5d3253df9262d5e2a1df15d8d16e2373b9507269743f1c6e037f07602758701b2b41e7eb965f77490f063422e4136be1e83781dd42b5d134139773aa5ba2bb8a592621d9d78808a37429a183d63e477abb268d6096dfe03f77d78d40afb1dc5d6f459e24c69b2e8479afea76185d3aa0ba9401add0fbae02a8b590ad84045706e626b976f4074d5e781f7b643aded9f65f066b1f81b7bf001ec84a5b78f8b0195640002ad03ad9b3f7eed0f8ae6199ee21044630398287da5275f6d51f2d7bf728380edafbc478078194878df353feeaa9040f8a68fa9cd3ec454294b7011f32e46531e1d7229cdbada70baeaa448d8e4f8c4378807e628f34ccaa3501121e5f036e15d9e2e3bc92c4ace9d523a1aa4b9d137e95208c6d8ec4629a106deefdde1d99274daf765bef7f0c8e8c0ff9e9a50a101d6ab9b3424523ad8ec15de632329bacf297ad58ff24254c765dbfcbc01d2f38ac63cc615534db0414c261a66feef5efe4626d0a1ae36ff34da4c385d23664c3981ad9352ae0431cb88e198deb85b4f899185f1833afb787510babb6746353678cea50ad37da044de6aed62b5979714d6d3403f1edeb847f4cfce8ec4b36638af77cc3280084872e2b8f380d1e4c8354fd3fec258e296f517de30b85ab222db4442cb13419625423f3b9af81ce6193a5a5b68831a8dbc0948078741138a91a5a0f84ab5ff705f3c5ebb8bd47ce7b0ac613126894d29520bee107b32d585da202b61f021a0df1de8a5006d1cdb2db513cb1edfddd7fc828470c2b6928ae926d44d44665e0e2987cf7dd1e9d6200151f500ea3b85a24f72fb38e5dd6919ff9c486f6a54742f96c6784ff7a70c33ababdc685de48b94694af8ad419bc06a0f6504f79c606ced70026b813b4ec5fc73ed4f6b3f7ff697943303379d959e6561a8904fa0354d2ffd62317d63860a62a13cd77157b7cf921655a53ec3760bf23c8e75dd3e791fdc870f51a937f9e2507cc3fbe26e311d6c38d7652a79e40ff9ea3f3a0b40d5eade5431536f814d55ab4da743264c98e80f42e1cc648887b362b1e267406cf0b71cacefc036072a6b5c5c1337a5b99239627c9d6152b809fe15da9f84e38c738d7ed9711f6592392d4bf12d60c77dc7174d2d31ac5dd00ff9faac9f1a5e660575ec22e0f866ea21a260541d45f55fe18ab89fc535ed9a44aafa710ab018c34f764ece64d4a0d78bd284cc0c6e9529859a8b1882856bdc4d1bfb6f08cf796af8988c2624397b211fc69da3226411a15d50aee18f233d5fd554e6f0bffee925a9e38f7249b25f8f8485941f86aecf9011b30a421597cdeb825ba43a5ac5d0ba0a603dfafac4b4eb6317528961d439bd49cb85823c6a8248fc3a1c95ffac96f2c2167f0560f9e2fb6385be29da5fb5f2aca108eb2b23c33decf9354bd73ca3957a0e3edca2d851882dd6bf461ad6adf5e23c7cc30b4afa93fa9ed9a309fc606bd94e60c8eae96a5968123f2948c1888f94a5c75303678e12cd33efe4bd75333b88e0ce0f5db59338bd42251b8da9ae886ae2d3e33c03e7820ebf5e571d2d85cf2ecb71f925c335ebd46d5962111487a80bfd86bbdea56dab644b10444eaebfed741830d06a9bb93b549bc246fb8d7bb720fdca2210d6885578deecf37b80475e02cef2da53c685f0e6d44a117399f27c50eb8662fa1da047f280daabca2987ea7ff5a16109cb03d23121d809a3c254c044cea2c1c5021d4a7939c2b56333e558949624abb4329aa8de895578b18f094ba3ae0588990d6726b5128c596f26cb72e8b863007a84b13c9415a7a4c58879e5169499fe9dc7e6a34f1221df1688a0fe246346aa8648b254fcccb7d608360c564586456dfab70288ef42678f7fe3ccc5ef9fb5f0fe0604b9bdb66d55a1202b65d78ff11bd766249f3ca847b1d3beb78ff27598190b470f3380dbb16bb9cf3cdc75b485515d5ab2aedf4ea98c39a2c924d4ecd76ed4913b8aed446c5e78c9a981c6ffea57b41d167e7f3c7669da166a4b3e0d5a37826ff085abf884770598d81d737706750337b6d7c5799490dea202ced8df09bc3c6696ed63ffe3fe89c333772324c2f3722efc81590ded496ccef973496acd442b00958abc626f3b2bd320597f0f07182b8c4f43e20068dcac23b7033ab68c1876c455245f281275144f09892e3fbb2e53d816e6095aec90c728a44552cc3081473a3f83f359b3f66bbf55d0d9bcc77b159bbb33752463afe56628033ab39fc5c3ebb96e21fe3a0459ac6cf6288f1448975ca5efce66b47f2d63ac039973c32c145e2caf911d8ee8069db6c3c2bf89dc01a33ce5be26c749c8a9960e18158200621b010ceac199ea991a9bff50540d817cf9e8dceb6e8454dec050ec5f9fc687d4ab9e4ed5ef42513bab837179578a7d30e4119bfd45d3ea962e4065151c760b93956d3df9b1716713d9d6e2e6cfe71944ee1feb9db49c51187dd041e2917ad2c661d4a0ff0e0e724a2bfc1a3fc40c9de09f7a9473c1c7d28d3467477008ba2496983d408e0f02bb072a5de12b3fe1512e7e8a5e26773cb51ddc6c4064881d4b2bc10fe64fba338a735c61ff52464d7c5313b8115fdbe342effc49f5691a8d8eac64b258e9198a27b64b713b5de43b687ae66a74c5f7a4c12c1c652b25c5f234420a8e5f0534efd9f77ff35ef41e905bc980095001d26879fbc528ad40913286143a0bc24b114be95e7f5130befe359e6868fe6dba7415b3857dfa42638636cc4b7c914b62ba849f14d3f179648b12798026b09399e695b7f1cf43b136ade64e0e5888c0f337844341033d018dcd0f333943868a452fcecd68406bc3600d2a53865758eaa58e311d0c979b90e2cd1516ba46ea196757aa3d125ada408aaeeb25da00699121c975759e1875ed0b920a682cb7430aa767104e16a4f9f05b990f0a33db237d0ff037921f0e32e1af24d872b61ff823ac66e7499da62e9a7cd5804bb971ef7515095fbdb6ff3a34768c657c8104732d1f5c1976cee9e208946a242f93493342de1ed43e8b75f5ae0ad19bceb5f11befa7518d1dd2f47e004c61e500eaec58ac1036805dc7f7cb1610fb60af796b5833ed4e2b86d04f684b4cc1aa04e5e0c77b545a4a62920e243633139e69f5fc92bf995adbf9f1830ab13b925a85adafe77751911a94134068d419203c42522b315c527e85bd5d17cbf9c1dddfc969e01f68b0e3d83c7318ffb96a2a2283b8809dd2c0c1111b3b9312ed87a9201942fcd91518586ca2d91b51adcf3a38734e843fe98c2b675bb380495335fe05bc608a7c4732f9bf0e6ed3c678ef56665c3dbe7d695ec470c5ef65d7f473e476fcea1270c6a6cdb7c85ac7c7e174899484acb7c019dd9512a014ca2498e7645b1f091d1c5a1bdc3d17c47fbab103d8aa34c4f571c2b2a536364d3798063c859c6ee432eacb392f3a45d48409b0474d90b4ad02f62c85fcc5cdc0359b0818502231a4d941e0a9cd9498b45d1aa6e5ef2e4c8e66b91ffda3a5ae954b956424cbd3b0709a896213be35598992575b88c66c448fa72063c2a1c021f502eee30700983271fe2b1a1e0b03cf7eac2797d6db33e3da4f95bf7dfefc6d08e10e4d69f75a01ce8c8dcd73bbe844b832f1217735697394e67ffdd6c343dcf5705d6af4b7ff63b0cd1846bad6cbfe62ac1fc214dcf83ae8f246e374f77cb4e53744024e4870a13f47344c9a659346a2a2184255d9c681fcfd513a00a28f3effbf29dc1fb29602a2844aa6bb6f2a64a09d4469e133bd8ff88e0ac921cc63c26c8f75c110fd58d0020cc01dc6fc77a086250bfe61f2c4ae052ed85a807ee288532f9179c8329d51866500796315624279c0d5cb7c1fc2244b6323b3c4c0f3d7dd28e3ccf0594fcf5719708239c0d391a3f80a96dbc1a13af1b8549d96987ef93101d582307855909cb07afff107b2d62c54122825e048381fb2d1e09e106c347942ce622f9997dd7eb085ba32f2e75a3c5c554903849f66ffdb0344832fa3d1da74363596c3fdfd25a3f879a5885b62f9993cc01db68e0bb6ba5291eefd0c177e1e74c30cff6f3ab8103d05f2d1f4398e922d571a7dfd716fd7278e86838f508dc8f2d43a54d5da6080bb26c0d59b2621cf91d4a3e2d4de50bbe804f4c815c22efa1730c8ca1726447adaa3b79d3970dbd9d1005fecfb9b81edffbcdfd484b78a3d4b9e5d691d668d8602468030b460e33753a3f7a35af02bf5d27bf0b0c675c918f6e8a13acfe2622c9bd5c396f63e62718185120fda24765ccb0ccf63c144121480d43e4416e1ecf50d1927d8e5527f10c26d5939618189a9503623f55f6e8db7522bd98fd8ad5268c1da55fd6be3639b7d257328d84d8d64cbc0946f863a648cd2b41d24ff8cbd0e1de0f50d6f3a359a1c730ae428d1a916a373ccd820efbc186939af0a71c7556d8af2ae11d8a01e960620c376375506464017703814d6c0e57f803a4918a5410f71da280f905b4616a3f448e5ef21cb7c0a742b984a37957a7d5364eada70aa7c385e0c127eb3d4a25bb64139377c21406951a2ffaa5a665fc978d5f4a16eb73a4947021f8af2f0c29630557bf6b0301bc57780751c86591dcdb7366f54e991d30a5cb1409c5ec4ffbc282db216031f9486af6b028804963bf0da2f64db275fcfe567c27c9c4175e0356771e67ebe173414bf0bafd61d464199a767da1e714ab4412edcdc72e12eee69b5c81f16283f81d76f0a83ee1691b732e887d9040e7a0c857ba866078715afc1d9da66c68bc00538890d87b83a9e26226336697748165e1b14ce24417a52ada39d50c2762dc1489dd3bfc11dd09616d1e11d935f6547336ac1f51e09040e7078c7d23c0e586bd16f17c53b031fa00da729e45ea2ae3412da4cc55b486b717ea92007db7652e628171bcafd5470e5950c0532d3296b0683d37be8e3e4f8a2619c7098a7976359d5fba8740df60b8d35683baff8dce4e40ebd1803bec7f3caa1bb7f2ca857d5ec6085856b75d338bf76239404d7a360f73c00e9c1f5d7a410c46d146ce79feec9521c7c583dd13fa3dea5d8d9786729669404b7c78efe529d5419f9006b58f815332753e36bda6762f756cfd5e10e855a9f3249c094224798d929f48f3c6839fb8910d3b309d5fa24499f40a11c82bdfbe3f069520c2dc92ad904cec163b9faa1de3ec4711ea93e105ae6f5e531a91870eaa7dd250006217bde124f40e731822fb919eec4b3407c4fb594b448266de0e23cc06ee2779597b26fbb3eb1d0ba1bcea3091855cf81fb08df12467205b55b785fa1e4317ac272f8156764bf273b0ba623760ccc7a54056461c7730cd668d35bddb407b91075fc74567e8a10f39b9bdec1c890d0bca1e08bc41a02be9f708eb23e609f2341967b4fbd68764c3cc4139e05676d099e50d5a49075bd2f6ab4d5a6080c7316150d38b0cf8df11c0a9dbb1078bc6b20274a2cd84b3f6a083e1cef5fc5224c3b95c27bc01656c228660eda59a12d51bd60752d4e7fdfd2f024902604fc09f23ac89e8ca61929b31757ffbaa40823e9874fba202fb3bfbd9022f8c0be36292dbab787b28b606f8a91e658a1173607f927fe024ca27046f390433c06b4faeac56368663697749110401a01d8dab23f4a447533fad03ddc3b978c45400fd0b481dfe52460f1dcf50dc9fbe3a7160435a487bb3672e0a2e95e4d07f9b6f640ef2ad336a778c2200549d791e455f3b54fce98d7f4fcfb27d5255bbb41af92d30388ea61d9c631c9288b10e5ed2c984cf7921ed454e04955095569b006750a105863ca70a192675ec59c1cfee7722e5194b6c2b73d65f1b3ebb91eef2e4e878056831b6ae6238c674645a4e4b870dc4d8d032b8a99d41ccae418237fa28331a966b0865892c2c76c124c50a04a6ecbc74c4101554f75f1205d391f684b5b2f15eeb1b2418cb740f69179c73983b422473838ee1e4790993fbce5bbb31020aa4c584f492dbc4a208c2b96b2b74d890a55b9af98ef696d3baf6ae49f67d818c9d40a52f0250ac38fb74869b8238f37ab7a3770a7cf9d5400f6d0fe728c8d8db5376e82512f5e69b4fe50bc828431042c3d1a41c4c7cb8c109e55fbdd2b16c595fdeaa61456a085b8e9ab55b7e21a39b627cbeb97dddb5e922f60a2874a5b0992ace888e19fb85fc200c1fc0045341d70bfb036c71bb512ae2f5bbc19f444a0d4cecfee5e148e3ffbccfb7b05b666fa838d32e9fd8941f08e28ad113a2eb9d482ea07a136bc0b6d8bd4bf996d3c98161619b9cee02e683f57a1be699302a2ebc589f8690f9f153099a0761de1e0b2bb52ecaeab191210493423f68ccb77e72ec4320a0d92c695d24db989d008a99d2f5f8d77494f3d22544b35bd428b9570e5a86da55766387499d0a65e7a8b9f3fba64847e702bb887a9c45f7b527b65255898c2310d33fd98ce4aef5fe311ca81a6895a2ae7548a2590c829988542eeefcebdba16f8a31eebb8e21df3d243334b39f896e27873bbe6507f1c7ca38939b4913edcbce05ca254a1c1b78110c9e186bdd6c010e93054b13310bf8f74f74c5ee744b18b8d0691bacf0f4573664adc18784e601b03325b6d7fa39a3abf3531d319f7c0ecc64af4078bf35030996e2debb385ff6b8e22db047d6236e34eeaf0fd6e7e914554d0d2221d955f2074dedbe6b5a6246852a7d95d75731af4e7bf8fc23002acff003f33f3cd1efaabbe42eef0c8d7587a176a5f60affeced3535c180ca5aa9a83903f1f62e3b6a9393e416ff332402209a41374f5722cdbea5a6892c2179fe238cc7a9f57a684f532bd8465d63c0b0a7dc24921040824c89fc38c06cccc080c857e95baba5fb165fe03b3d8812e5d983e39b46d75b70f1d5c586f7b120d0ea0d46c3b797357648205d875d0db506155b4d1fd6030c8156388dfbaf97b21d9278c5f12e26ad3c6d2b0047256cee93cc84751cc021e835d218a211489f1529029141fc200881effdf654e53714243197a6083c85c252f10dfcce626315ce65c2cd674f4d8b37f36318d80c02a1da41ef1652d9a752e155526b5f597fba22664ba39265074d43d944e91606088485573b7c018ea55227e557cad1810efac5ad15aa5fc7ddbd4a140c0d7b7dc93ab9e4154d70c5f05e7b0386c1c15391462caca9582c0241599f3620fc94cdb532ec6b04e14d1a18c67f4257b6ab5b972acbd78f13938ec2b0d7b24c1cee906d1ba17e72fde2e59f28891443300c03911737d02f8302d7e241780ac604d54051435d70f7e9cec2f4034d1be1b44fe60fa9d509132d06681089e4c2274b0567f24894f4fc4b8d3ca7d52fabbbb9f37d734147f4d2681ad9edf8c25af835eb71d0a9cc7d08899abd3b1ca55629c7a3245c7be515d5cacc87db2c8547b17bf3f86cd5887b952a73cf1e4842adc453bb853bc8510ea5cb780c5883a20adb73bb66275a3d633ab4a4ecd1f67c1513e4c91a91a50021baf0c9d1e6acad36dec3ae35b0b67fe6619eaa80e695d61e8101385eee9067119dc11e7325f60b4e53c248f17958b457926ef135dcb4e53c942fa5cca3191a30b6b3026a66fe40a3a3261823e1ef7f4955ac157624c20e01d5c67dde7fbd8e11ae4d02125a23e1e9753598479ab9352e13cc83cc4f4bc4e0ce7c4d1ea4ec3726ed058a1550156382229755d704647a986546d8a2ccb0ae5bd6a78007e333aa02eb7326ede93149f033b1bd4caf6fb3fab2a160841daf2ef596deb3249b125b1831fc5506961619d6311b4b32fc4975e79472d7fac285db20778852ff3d06cee9492790f9e7123786a34a9c049b6034c183218b714bd3177f014aebe2598f89f8a97b67224cd44793f2b60c4bdd72751af73417822a258863bc8cea98712af0c8cb7e442a47daae80b7e4386362cebb766930e8a7edeb827111d4db6c0457a7cc3786b47c5873f0df5b6b9d05abf38c46619e9b4cf793ba29a9a93ae793a42395665b44930f5e92f265a2968d197f4c2d78d39bfbd7cc83efdc7085859f7ed896e0325108ccf9298c5f2fd1744bc09f7e1786574f2ee4645632c157e098664b533dc2763821b218efb069ca55b375dacaa60d79813d79ffdf35220e630ef9004cc77230cbae37e5af01f6edabd0fda285dd0f6f6cb40baafd6c09359773858c0625c7fd1db2e9144cbc4db7e134c67b5204d2a55bf307fa233fed49f866ba32f1c14a57b8e054293b57e4b5804f7eb991b61db7c9aafd62033954d80048f5b9b2326fbd27a6f7991d5d426313916501d7893713402c5a76ffe0c64c499ad674a9e1aeb9d48741e84544ed4d159b47d895c6b54459f7bdad8bbeb8332eeccaf85b679dba69f1c19b55974bd000dd65a25f172ed771bd857a393bb1194abf41b9393c935b32870526c0dcf4a86fd86cf385f2fa2921be40618ad0276b0782d93be5c95608d8a77b1f197e6e12ad0cbc40cce2bdc5d4aa8d07f324b194efb80ff4c3a62c4fc6e391f8b2041ecb52fae21e765ec04a14d2b9b1f491b6438dff4478654bac9c77cbf8283d069d1f0c135ce124cfc8026cf7651411bfcbe35ca9253b4d324d7b85b10c421cee5faa02f6ab3d5ace3bab4768fd82dcf758f0c65610b1ede295695b434cbad433dcd902055b977ad271813ea801a2b8e0f40865769580b9e4fae272e34816f56fab4873dfdc6427652040ad451fd838050376b48b220c53a2147367217ccaf30a3164c2e6ac37c30ece563dc086b7cccc2dd83e2454d92db248a8a27e596b4f8c05aa89aa4996e027b23e4a9af4b5f9bed9a95ca29c5bba9e2ddeaf6a7c6c7d7daea6329b42e6015892656e44d84741458d76bab667287cbe2a91f87644430f5782d4584a16c9a909d558034eb0003608bfacb2b053a406aac57f28124f83779228b1653733a639c401a2c4290a654a60e6d7ef20d072cadc94d288defca248c606c9d3d327f0561f8dc20b6445eaf0f6a964ca986c095bdc0f58c52cea23e55bb38a3ebe725c606500425370f105bc326dffcf8784dc1c119b6e579c868cefdba57f0059a13efb4cdf8036dfaa4a1e9caaf5886ec96f9e25df7faa9e6041cabe6324c325131c792f92182010c03c9a9de6d26fce98284481322948b2f5e7088c52f7f1a166798c95be76a9b4e131b2ceb832f0178fbac1ac39e7bc6ab5e12bce1b75066f09da8807bb382e2c6bdde9a79583b3ea0e9b781f5d3770362ed496ec23388bee8bb41e0e2eb937f7eea5c1b0e54125b6932eea4322950ea5df15fc6ee09efc904a9a91117f965197e80dbd534df7bffdbbf99ac0108cd22a3539aedefa34d304e4f283aa243c059cc69a4f372613fd2ff7800c0ebd8b8543cfc430b4d676a9ace9608830c336ce7728bff9b5042267edc456a097701d72731d3a1478ebf0eb08b648f15dc2f306a78d033f657eaf8a87a0f21ae2debf34489bffeca3c12001a8da307189aa1d68be41e8a2b0ec27dfae2bc6bd895fed3524caaa0bcdec7097fdc39b6b3cff024f1c05f4a62fe307d1c1b3691af38a341fa827bd044fd48f1888110e50f0284e344147abcc5ad9dbfb62d63da5a9d4003e4341ad68a20fc80dc830edb54bbc5da2ee6572879a5720c6f212d90024c3fe2b76a6efab7cf4b7d24ea1de2a9821bd35540ded6a96e152ceffe7bf9cece06a61c2a6184f3939db207be244036e0ee946129f70d7b8ef0e7dfcc345fe7aaff17ba7edabb65f25ae52e080a3e245ca6e7fbaa8a17178f6905e7944208746890fc3a6dc2e93676eadf40d0 +0x425ad2c8b6755836b4525a5d957e29fe7347d03b615293542485300eb39276c3e2a9c46458964d2b3a27f0d61debaea5 +92896 +0x29ee4093324142e57be60c9a664da2b6b2c76134413ae4571e19253bbe93e4af860b4d478ec9d5aca5ef653795aebabea8b90cae6afaed5ab1857593dbca9c79570ee790671c471723373e95c25443b41586685254ba3ad61da4e8c0baf9a885a3df579943a25fcdffa8dedb75a7053f0115be4986e091716b60c8eae38ad17a7266e588adc3e77741298f32360fc708754e55bb88d6bbd3a29f5b38dfe3df00cc8bd8862ae7a5bcefa197c28ef453b7781977cfe30280a5ca4bebd3356e9ac1ba367aba4476634513fa3fb204be6ff3135e6aad1ecea78fec4bbee36d91ca62434f114d82d8e7b9b41bcf2b21d5e4644d05777ec1a1fa380e871c8f10b6368e70bee6666c75f9c1dbec8f546ba179b32ef6e66a55e23f493be74fffa544a7eb486b412e8bb563058f55c6566c8bf888be1aff9861fb3f6978539e5cb4a3e521d33e69cd6601ec2cd83ebe58acf9278a06570a316d53c241cfb350cec53ab8d91920a86a86bf5bdfbe8fbd83b254d0620d964e5c0152907947efae7c6173e8bb23f7442d715979c54a300cfe0605b9b8dbc01442a66070b8e8ef008f0fb53c6ef8ad863fb1350e878309f3f23072ab3379bba40ae3e52ba6bb9c8e2e58697d9ba028b6c8cebde2cc7203b987b8056d7bee7146dd414989ecc7dc9f82c3f573e924521cef4e57bc3d1d04a8e42725c93942c842e347f4523215987cb3d8c2e6018b1100ddbb6d65818ef50632053985157eaadf437d4f4e1fabb96ee81f389e8add4fa9ba9c66a641cdbf1c98d8ab6ab6a9fe66266bc0455c9325bb4921bf622d22f360ad7aaa4525e048323f2ae240c5cbac1fb39ab0fe91d5c6abff65c0fc9263e56ddedca10ad4d17a904f8246cfe9ed9b5213918842657782883273a13260a80d18764ab3bff7a83c7def693fdecb15b5476dd8aed98083439809d4cccd3ff753a99d4c482a356b754347663537124ee146eaf88c8b8b00f025ad0fa795d95a9f677a6bc81537240f28800190a0679d0796b27888202ef7717546ac9c51d3d8d99b362e9b46a5daf175c2c2b8e2720c1080ece00c5f106faed0fb3412cbd879e98df81e298526960371343216c5daa2e24cc1b97f11da708e80f42e71c98e46b785e9c1da9c625f2d66ffd8101048676642588949fe3303fccc5a2220149d462bcb31a21751023d579a4a3c0f8d636484a9dadbd2eec42eddfb55988974ae822ea6f746466eae3869563ee77c02d4a025cb6e3481a935fb1a560c1913b06900a6606337d1b90d594be20360bd3842232fee3d1ec0f62d729b25a82c269275ca7d3f9ffc1efbc8a7e686c02f3cf756f68c5b6e20f79f549a48b0505a2ae07be8998cd01d97fb862a208a9edd5f06b820225a2ac38c6a537b093e2d2a87632260e48e2122a283f0ebe235c4f1902f0fa9db32998de820d21dc7186724a6e3133c448fb894a959aef115d15af33638039a9d2de20873897889688725d0ed28f584a3d5bdfb134667459fa48a6cb8ea3efa52912ebc956ceec6d6d18fb7c5f9713ee8a959dd4812c3ed6af77ae3800d65d1e1a7a430b792dcdcf73ece60971f2f74fb53b3c4b0856cf35c1152e0f569232832b76dec3fc4e8d4b5180a53c963d62dc41bf537b367075e5f3c3beb7fc51d062d09b07897c8bdb5f7a56a19c58b0e722a4944bfb97f3f375abe5d8d86ebfe73bae4965d25660187a42f1739f15f814a1824cbe32a96b98534e0df4d72a16c77c192472253685d52a6fc393bb7a9d5bd73f5af2b6e742050d7eae9b4acb00f1b2a59ea4f8894781fe454f7a87e2fb2d324041b1fede11aa12a24a5499ae09166dd82a76c2bb4fbf546817907adbac195139935480fa54f7f15d53994a5f89761c254a702a68e8dddb4cae8e0ae12a90a28fc252d3d8769f28047cd1d35c2cc12c219129860ebd7de16766cbce8ff133a4c741456dd510d0253c08a6db304d583c31710b7c192800054ce2c21c349a72e654b2a4c59c9e5b87689970b85875dbcae98c7e6314d314b571a519aa7b70ced5cc78e9617b8991bd2ea1d7f15130ac36ce262ad18e292c805a202acfc13eb7f1a3169bc81e5d1334d2a4452ca7084a2e43d0794de1a4a7e47ad68e12a23ebed86d1e247fd1a3409d093330b0b657461fdf3df24ebbd02760684aac099b0b53e87ee22bef51d6aa4446b133242bb8206a14b11e4a89361b62870f2d1b281f07a07d150a9d0b71c0d8ffb0b4fd63a559bb78cc55d7b63104896b7659ddb6045aaedc39591f6b0f24a9b8b44eb2faa962726ff2515cdf7b63339a12dab7d135cd5210a19fccfd093654e63e68db5d3ecb3d8ec56960715fc80f87872830163dc038aee0375c3dfa86592ca18bed07d0046b49b83688f868a36ba825baecd186e3c12b97b813aa4d8534e0a0205e86f7ae8a253d211cf12075d690911b34bfab989a0b1abaa9ce8cc366a69cdea657201a18a5d6b1b2d801cfeec53bc1ae2d066f11d20b97751732b16cd30a1f5af4e3d7a5401770e139a70202ba8826cf9641c7d6f4ccd70c10d9efc61a6a5af2ecbd77ae9871e70e826accb0e528e30fa7c84347f7e101e547ecdee0d15029f4ab077aa2f3787cb14ed77077d9806ee4ce1451e35fda908738d5ff7b9c3df4e6cc7c4100f59dba6ffb77add60c1132f575b08437913c1b78404fd1c4df96542fad667b67134418a114c5c549f16dc7983b275ac340680b1f1a94e67b2ffbc055ea607a43e11e2feb273c67522df8a5738ad33604c1f0d802045fbdfce1d0b1ffeff4de15c38e68a4af66047d164444ede15eb67aba691ab7b9fab8c8a9b7a1644a9e175b5f174b6419bd1d295ec33e8ddb244ca37e333bb68810777cfc03374976b6a683084b40bff2bc21e54c07eac9d4ce790da1d1c3751b1b6a783d65bc05e0e91c2b438cf10ec6dda34f8294f2287ab7bc17b9e73a79df861248f231d83035bfd8c2b57ed4e702bc21b676dcbd30196a96602ac6194b41eb0f7dcf09f44ed1756ce7c27354bf42b21db8bd41c4674d7198556900e85feeb4a275184098b840d468e8ff1d091de36a07d4aa86a03493472296192a102e327d8bcd52984e1300473d64cfce6a89814e7078e2fdc93e6765d570af94393cb9901bf522538cc59c385ad9b929e16888d9d843eb39b7db5658119390f1bc11e0a6e37afc14cd66713251c64f9206518696af9427ace491cc88776d61a52134442c72cd445e887c2bcfb298f7a951caf6ff87082cc9e8085681677ca630f12a509b3a7a9f93666d286aedf045d25c4b468ecf0e5f333a9570ed722fb327b44a927daae15245bfb0039e743abeaf7e4911df1825536b44cfa80718152cfbe33b963e54c031082ceb29c4d5f6c693404ad53ad2dbadc4af2d6878d9cb781ff673b867c865803d1685178893a302103ad70d5c8f9fa2e1c2253ead3791391666799584666fd467050469542dcdd5b8d65426aebeefe745364d973ea224c471cbb39a1ecf3da21880ef8bb214e5d5ff9b78bd9be15aef61640d0e87b9f4ceb49eb85291535d7db412bceb2cd9796757028b3ebe875f2fb8e3fa0122df6f9c5147fe3b86a35ddbec22e3241efbf72e51a4222681216b3cde2e8b1b9a9313d1da600bd1593fad210349f8b322fcfd8f61e8c4118e301d7b23bc36ba59758ff3a27f67a09378ca01abe07404b34ceaff1a58e76c2043d48f3c159379d9d712765bee7825cfef42d2489ecbb55a7c4e11ed6d12a301cd2ecd79b317b6a66869ce6935d3dd692396376bdd963172fb955c5dadcc628d4c9ada8f2d4a0d4989e4805cfdf133e986328578153a05b75b6f32ed837b073d42972acedc80fa3dcc2120a9af66c5ebb7b6611fde4dae721c2a3a1f96b52d9c3fa222db5972f9fd9f9e23c1b28b0fca18804ea5a137984dae64d6565ff13214945a77171c86790384ba0e47b0047e1f292ea2bc068e5fa4829d9c3437b5a150f11e8c14ae4213da0c0344ae10399d557a2001b566c871114932f03bb68917bbd66cd646872c46fba6187b676bb0ea077be2e0445a6c591e62c386df74d1f1cfb4c3ea4f2fab8ee2e357f7062af0f09fcf15c2cb49f084165fdda481cb26cc06fcc23c711056482a34405bfcc6702d98b4072dcccddb9ea3a0dfede551fe02ec4ed6416ec1a32f3c19702eddc6c51d8cfb5585cb5ea3e540d648d75c81de330a0b8ead9acc1890831355c40bc4562ce6d57f6f4964e0147850b6d569d33dd8cac339b587882d18a9b26fd01917a9f83102e34ec978f688b4a0988c9fdea360b8f6860da79e67342a673cb7786946fbf5e43fb8be237dde70566c41510c95675f15f22a9d674d5f5fb23b0ecc01a3949ff9d311b9ccec7255e2b0b84fd58a5927c1fc70bb8b5606e423e93a66a9467ea9c44c0e2f0da8e0bfc5f445ced1f8c2ad6b03849472f7c7422cd5beeaa8a606add418e2904e59962880a57e607a77104a71a5eaaaa6c92ce43d7f20ca8858c91699b8537007652f1a9342b6a7477bde9986520780af408454e643f488e0d5326e95a8c560d16208208e6aa305b17d9a1509a65f98e4d48a1eb7d2aea81a81df304878acc534b6bdb4c28bb7fe5102bf478c117775f01b8aac1289b39abe052be632969e2f9a09cc51e0046a139e91daab8e01d38a498c227796f7a7e343c5a50ad4810e0279a1908267834dc812a168ab7015f858698cde2ba5aaf0244449d718bec670e07c34b6c0b976b79e25c7e5d1e2bc5a52d8b40a12df0230a018184e8a51e56b3bea29ab97665d4bf8606bceb946737e2c0f8852d7a39bce1967a757fa2e5c51977bf6fb60eeb57f895b03afcc2bc9d826868034e483d63ce29b7d9fc2b4a9c8658a3302c7c30dd6a36e25f585032dfce4c6222cb3f050118e3c11928e754c34389d547e4673c4c5f922593c6e5d1e50e956e4a6e08987c08eb1f9bcb7f0b229833dd1aa378188e1dd1003e1029a2978a6a14e3fd4bfebee66a59c9ad9a77a2cc7e44133457cb89ec1afcc8fcc6acde89f4dd5541af40adfa87f80a95e1a129299191985eab5d2716959f9a5361f7a0555a500902dd65338b6b83c54dfb90a0f5954c13e81cd74ee26c741adca58cc734c5f665087d7537e23d82649b924cf079b1feeb9b5440e897c400b1613772396f5d55d21a3679a048267e4e484bdefffd0e2e883ff8a0dc7ec8cdc7a8c2b1e04d49f7b902b07758034efeeb1cd04db7c9d364529cb30012df9d62c57bec52a218b2648086947a465bdc8aa3dec9a1ff242928b1792a6772026e4711a05d5c6916bf22916f8a87529af8aade58dde3be5838030d9f08dde42e610515dfbed71c9199bb528439a86406cce70450b51adeab277cced7f36a50ac9e233802b7cca3cf67b72d8f4ae464e97dc87d8ff94e46661f1c5ce793179ec54e29e1cfef42e619529c895664443a8936d6b1dd5087ded047691f9792ebb6be999f7a100f41ccb682f4cda330cecf2f1d97090162ce8e33c8ed80b195ef80e2a60e6a8bbed13ff01e46633c568c09225a95ebc5d82a3ed5c930e5fb4729e5789efe1909a5fb270d4f1bb2e97d86d1ac1658c0ef5aa4d60073b9b73f4da3cbc7a8f5ef516cc66a563cfa22744dc310137966f1488f433efaee105f4352651c18ed7d542dba3bf1130e6b1ba3704baca0aa49e498200f5f0b61bd43d0fc75beb3951db0633760a48cecf605408b268f9bd28903a7b4101f7df448cdadf3dd9be0c75e6bbc8c3f6b08ff244811495d9f4c18acb53cf44f6796d13a64a4e0a599e7abc6ed0061e02fd16e7c4cdf4ff6c6faa53c612188d320a01d1b6f7b6bd3a20f6adf9ef75d49d62d62877a7148fceaefa0c1711c17a430e1037158fb3b719da22c31e76829844a6503cb3891da74f57132c14cf649cb81a2a9c686ecf98671e618422e1d6d9971c078d2ef05ad68cec983c65a77c84ff92a37a161164c1b0824579ddcdcd08e3588ea2408966adf5d3fba570366393882c3d68b5140dd3749a310c75a6efa6d7d038047e90cb9e28a1a00fdaf8c478f03b3ae0bbe3454e21cad6c490f9b943e307b63c5fc2f41783da47c3ec6b2985b6343e6a910b85824698893ac622a46073836ba26a8c7aba95e2357a5b09ed4a48cbba6edaf959106187dac78bde5b7d27c7daef0549b9e7dd5e0b8b7d519a472656318600493a88f12d4e033879290a6e49767ad6a74c3fd8a23c8fe9eeab0ced6826189757945c83dd5566727fa788c58ce0ce4511ac2306634ae0171db9fbfc762acf06b110fb782c8379b07e5188ac068c61e7155421f4f5a9348b7b2194e20491f1e4f21af66caf4aa588e1b18ab04aebce232edebd02ede9f5cd938c882c980e29a8772ccddfba2d82524631ff40de817b8fca9674dec08f9c43d355163ab4f1eec7dcc0f23fe1ae88a3186d56fc15efe2837525b9e6f20ca084d715ff9acfdfb9d97f6203fbca4030f1d4de32309579abb4bb072c9a16e39b170b3984db5d4a0343fbaa63c1c88513d517df118ce1d12f8a08b52d8693a6f460dc4a466af1a3639dcde4a1f050df99b33e1a657f6f68f689eaba3d2aecb944f8e6d2c4c8018e435d52bb3f2617c24b22c40abe76a2b3991aed80ec05a6acf545a74d8081216d3af946989bd171df908a561a7d0130337fd36d93aa9545f48ded9a14fa14b5c2a2f806076860f38a127040d431bd8c8b234a077d19584f2287473be3a1f1531123d01d7205731154397b20c27cfa0c0d1bc527a788dd26b979f9091408b57dfb3627f982f3765fc08de1826faf45535bd1fb6aad9972611bce698e40aecf9ac342562694c2f933418869d236593de6d9de532ce9cbe682dc0d1f37d3f4ae2e1be0f13131f45a3069a17a8ca0fb223b19a9430b069078007cae8092488adfcc578a7f85e4f837dbab617a3e4a15c0c48dcb61716e67c56e703b443a38d1e2ea28b757a1185f109989610f539c296817c8ad24fc9be24d31593bc07c1f5a460be1e0101f6689630e75f8906911b6a6a93cd7140919707ddd8a188be4569487a635ad4f6d3a17ad8f13c0b3eb453dfafd6cc1a52351a2e5d7a55a1d1f8901165d76775bf71d7a5eafc531d056a13fd388db055ed7feea03c41d88ea6a2130707626c6cc698b3204f51cc47c37a03cded00a0aa7935bb65607652d7a70b9932494e9142720fdcf2ed38d011e0adca56b776c5a25e202b86b360ea053bfacb9b13e1007e2aa0fb23aef88704c4cb11a17c3946c40408e40a1c49c99fc93851494e65dea85811b8bc79db18a7d79c7fb4268f4c99d3b58ef98277172dbb8ed244e0205648632bbac33527ab8282e7bd999bc1ffa834eed25ccf33fb3878c1f695b35b8de7b3b6aa43cc256a1e2b767258c51686798d7c583aeac59d47689c6643ae5dae0cb07a2f41251d7b023c0f47f78ad80a944728c79bbb7526e2f3e6ca56b870df40c23ff2c7285706b61b7be480d44db282cbb8c7872a8bbe918166c9d7bbda480a51cc9bdcbd1a34c33282f0fa8abfa7ca80f402071f4e8cdd7ae50ccd9ee413f2c5ead189ccb02cb0e7eb146e947410f4cda61d228207b94d462b3b4049d6658086613cd53d5f1705a480f7e3dab516881c94c3e13bff6c6a4d00fd38a3f8693dfcf985c8f8701d4bd007426143c9e10fd4879a4a327bcebaf82cfabe969144b08f79546ae62b6509d2499cf1b9fa98115c474a6850c607c7ad76dbd90aeb2162a8ab50c4edd718c7140eae99248e64141e9c7c407b273e19d5a84892e54c26d9ad5522ddf6bd5d0efd1d1f636ace6ca2814ed8dc9ce59c36d988e8f010fd7b9f084072bdea265d64f54098577402d942ed2405439c4948a81fdf64fb7346493c1f34e76daf584054643dc17c2a72d27dcae8ac7d619b6af7117463bbf66eb8365cf929f42f9c2d63b2dd41da746580d981607493d5232ca916118e3982bfef172656e15a50394c1b48e8c1793b250ae07855068cdf28b448957c8d7cfd7f1766e414b7a8fc79c6038c26e86265f8991a188e097066f42a5cf87e078c51f757ac00fb52e51aa2c3a3e75f5f9cdc27550ec9d5264754cdb76ba6dfa572646fd870e1d35b1992fd6a84c25acd2f86f96544f4f0051a90fc83ff07670e35202fc13aef64794c4cd2e42d83e0db244db8f244ffa84df002c8b59f83deeadd6b7e3b93927655872f69592694b9318218aa239754c5a6d2927b75d4820be3732fa66e0132d096d12509f0f85bad7651ce1921c4590fbac7285ced246cb79ffd53ed810e373be53316fbd12a42845299594b1353784e2ed7acb2421aa9aac686bf9c9d42097feab4e8882544af056f63a08922cc1849ad0a06c69f3ba1ac01135bfae92410644c5c84f614cf0cf972b68b1a76b8a0c9dd691ee02a11bd85f8ae0f518e3cb5b2b433d28dc552c028069b0248369f7a9666fbdc470b2363fc525ec3e7b3125e30c942ba976155335ad119ed598b070d78f1c929456bf9fcdbb72c5f06812f75a73490255a0f60cd577b3834969c7ac13726d9eb20721cf1e8d11ecbf4201a60df9c25f91ff8fcf6e6ad00c047927ffe9aac350c214713a8ec453feff9b75b89a0aa0a202e43b016d10f7a77b4949f2c6a2ce5729013668baebe94b35f6e7b56b2064680cf190595de48ad4224cb60b36f4def07b5fd9e01f8e227006c6e0131dc57e1034aa282dbd601a20ae15e4dfc71b85db1d72e42719059ffbc6adf7581e745e490e605af5080e15fb53176eb6d3814375a40cdda453fcc24d19fe960ad9c7a560eed6b145da691ee2c5d3bc46f8b0a83e93603eee4cde39f2554b2481fc09b3f67a5fb3a680eb85758acd45f6b34424b4602f807b6024577a2d065b83e1e53a88257dea8db81ffa020686a44c7f9639659ecd3ac23a69bb42f5d2835727d4798474a3be61cc70ed36bd724fceda3166d0a3bbd6693808c5fb341234923a422179ec83b7d95a88cf723432b0e43fa02d74139ddbc6e59c17e18c5807bb95c8a2d6f1706f4acec21152ff2a60233c5d0dce62c5c361cf9e11c453164539c6d27e3a280c3d3cb5a7634772dbe6123ce2784e15d615c0528953e22cdf95a359fa3401f4b9ba359bc335ce33b9bb17ddbb0d81a1415b792ae85ee97e06717eabaa34ccec0b5eabed800955b66647da8b512df79999fce295258338cb4d6132485d21098273a33617683e8c7f4424a0c24f6a1e733282934ddb716e98f6dd44cc9d59363c75103ac60675c0f2e5ca211ef04274a2bd8511918499d96ba54e4c84e57de19e923e4065d52fa1b5cdb0c1fe0e3788cc9d6cd42c8b7d27b7db4cb02dcfef7a0d5d75dd734edc9d3c6e6119ebd3c9c93554b2515b8a8bd811fb50f603b72e8e2d396f788aedfd120b3a637f64fb69c49175ee2fcafc5658eea7e3a4c325cb9c52b88387f93d01ae86d42098f5efa7f9457388b5e74b6d28b2438d42d8b64703324d4aa25ab6aad153ae30cd2b2af4d5e5c00a8a2d0220c61160a636b0c31171307a3d5e2bd52918d63b1ca25127e0f8e6fdfc2328bb11cf6081d716e7e6cb54c1c1c401f9333ce3a2fd3caf1470fcc0cd8fd60756d0c09344298859da8bc53c8ab687342f3b36d02e872949f1a098cc0df810ad33edbdb020ba4286254caf86efcaef6b5a67a75cfd4b5b19550155792cc9448b4c5c59a47ad69e024483eac26571752de7431ee883dc5a83db4da366ae65da380cb734fed6e0e384c4dbf77d803cb0e272480e01569c901fe0d0130307605a29f188d02db97bcb5402bf5626c49f1b2f7800e545ea1ea453f22314eccc4b3ce7a74bab9f96f9ae169aa8974cb71b1c6b54e84514a2c50fb6abc1397261890ad77a7a27e2f40d1432f9223b6dbc334d3cb5789e0c35422abe6a34e1326bac4c9ff78ee5865508863fbaa6a2e8586a261a063c608b15f89dd1b9f8bcab5f176aa7bb0465083e9e8ca33bb07e6b20423f69c3ae3d1fa96ac1a717872c5b907ced65117516c715119ff418da1e64883dd1c27a387438741b4e950f5aa0b1b42f5d7eb75b8b617d0428a8be8e134314cfb5aa9675a6740a8c8d320e0dca4c4eb1335af9222365eb08bf47b946fda53a7a3388a4e06440d12115f49ffaf999b494f76073638f32c371dc47758f2e098dbfe3f322030e2d7c9b615331bccf187a6d2245a28a2f56baf2082e9fe134ce63233f60aa5824a8413e07d46fbdab47248c4c60f310744015ebbb7384c792827f26ae678a5a483fe39b720eb6982ea43784ce5901910e9d88d17eacc0bcc7c4264cd95e5e73e952b826285882b6c9ce27e920844a864ebd6835ca30d02b64e1fd0818dba34f789f5380a34870a3fd236a2bfb793a5ac52e58ab16a63fbdda8a67eb1565d54776643a1d6b64ecea492292cfb7be5da8f26ece83ec836bce991bfb58376380f6734fc07ef92473f42e6a2636ddaa20db670d2e62c44ee0f831252bf1f77b12d6ffc0ab07c50d824c2d58a913e5e3207c83881cca367f3ba533147e2aee1327536c554e5a6796b47cb67c7fc958ffe906e84e0e2cab7ad8500f88667583a22b06597c2ed9594676e06a542ec9bf46c70505ed76fcabe853a336ff796440ce9a6a37a3c12702934621a96e3ab7815e56e15cd4ebdcb04e19f939d83b69bdeef1f9977aa9a60c03aebb0439380537ad25365da2d12f4102a7ec98a101184399be3ef95f4ce8ce2e0d070b238b254ac99e7ea8b5cb76d6ac99d7c3e87ed28a457b94cdd03f61d1690db01edbb8aa532a4f249eac4f45f9a24c455c2d193afa78b6b5855bd5a3ae5b2d20cfc05506b94593c2dff4b10f228a5bdfb1dd44b40ca9dbfbc070b410cd6ac7e38e5fd4cd15b228c3cd1da554d9db34f18577a5c0396f67e20fbd6f5ba71e7a72eb28ac5fc0e66ac1e685a099981b5415179aa102192fe702b3804bc6d3ecb15966b960517358c627cccb175fd5a155c50894cadc2471d5c86c67edf4dc6c18f171608524858fe77fe06c9e1a2b23a68bd92477c0d3bbc0bd9ad2da581902fdf59bdc8f5b70023b34b1c8895af108c2d3f9985c52bf84146cbf5f85832247ecb0567bd368eb463dd0c19d8d84dfd73727fa8edd0440616d304a7c63e870b171cc31dd15cf2fd26bfe802a0f4a400570125c667e47feba17a2dcb81a1a9cc60993ae6ebb10d62d41f88e1c82fdba1a0a0d8fcdb4a04314c05ee6710c7bfefc30c13caf37b076bd5c693bd37d21b68b6184051314bfc5f7e3aee855bf9f2fda73bf5d1d20308a0927cb29fd7248bde023006cd512d8ffe9ee3d62c4a7e6a7d74f089046e91378a71088d8e8f6f548aeab2d2782438e49516c64d65c5a04ef791f1776ab06cbcb0db34cb9247f99df4d7644b5b90b624ac4dacfc37b4a5c6f36806660b80dec09a39c615b3e70c8fa532101a7d7eed76ccab5c8aaaffd6fcfa60f9fef0c72d6bd1f18712fa58ee5224617ce7e6d726037b98a0a0c68e7b1593e191e8206ba2e4dc6d3f6b6e80e70df9ce71599f81a9f2447c3ee69449dc3c475395cca35685544313b6c7184841e8addfb618af66be6cacbfff031b1940979d1fce51826e1ee28f4db3cffe98420cc7fe15cd1e6dad993dc9aba063e4f14e1dab0420c49db4b74782002b2a5934a1cf925420f57dbda07e030a647594358a4f60fee171ca91faf3196382a4715dce4e033cb83b8038aaf7d3e3f8580f5573bca6863b92ddfbd41c7ca57c72ca06bccbb8953ef85d64de31a20003143f9830ebe662d62ebd3b6d49128ec29e4b7693ce1b275934fc8a65b3d9272eb20a48ea64865b5b4d5499ec0243e5fc30dbf77adf93b9b2f845f16605de2121395aabc8b0f03972f7895c79cf7774d22e64cf99878815f04b20e30ab01bb683b1160bf3568ac4c23544ce3e391601eaa2cd47194d6201bc3675a6793bf6adfd2326ae92debec4f40e6d3560c78855ef93fea722ba8a46bec02c83da2ed9d0369672ddced1f300af8bedda0a023638870ade37db5566ac9df12dc255122be5d712e1dfcfb690419cb3aa05627086715a0e573f6da65ffa02d160ab146e54b5879f5dfebc15ff4f638e8dfe909be1ca11a750060035defa9469ad863ccabc08ef46ce80bd77a7f2ab247e0cbd0bb00954ddb2d5ba8b4972fcc0fd9af8aecba6b60e1aaefc62f0f21c7e6678114659f7cab963f4c62f092be1de36306ea3e95685002ad09e6142165fa32b8bb3d6465c1c424cab4aa987edeccc4290c6307ee10422e62ecef905271c9bb78acc43dd00f28155426f822a7fc591070229def210da7e360fb2b4a1eefa6ff0c0831388aaf27c67005c4159ab13356fcebf34ada9b01c03bd72197f30a226c07401d0ae24c73d682e3a6e7e377ec1613bafba17742d02337e37b005b8bcc80eed6d01b63417cc4214309100ecb03cc49222f8983bfa3ab09b29029c4def5ec174f02f0aa38b2fdbfa673347924eae821c3f7799c4becc605c6f96acb6e3eec351b2e11138ca701d2806dbbbf10320821e2fbe80d822be2d0832f49ebc4183fbccda9f33bd7d97eee53612c4d07498ace31955b73fce1afee999a5d827b122512d91f2d8f84baa387b1f5fcaf94c21e8b226c5a4c169e8ba45cd30c4bfdad5adbbfe6068b3ddb3e230e84a353231c01ed27d95b1269b2e4b65f51dc94b65a3f7bf4a734bb4dab9d44dba5b6d44cc7f368c484d45350ef698913af54e95f99517819cb3eac4ebc5f619bc1bdaf7c4651828ac76c7b767478910c43fbd633fb1f6491da7abaab8de30de1711e412c17aadeed397a175512a062cba837d7edf017a5ff4d7f730e80c6ae2f2c6f45f6dc7db25e5383a3472a5f72b444af6ae808d8c0a4bcb371c23578c6f76c070a46d538b1709e1fabf72c344568c1a90baca5b1594470cd13713c87ecbca89c2aa6c27a60a681b49ddfa89d6f5b77eb36c6776fb4312212f495e66283e18a95039104912472a6d8f55b2019350f0fbc78afce32860d492b71aac3a721285a6841901c3b916766034f0413264ae5d1b34dd34ab8232b4e8d371a64a458d3b0ac511e89d81be747ba076502431592665622db4d7f303dbaaea17f3a087f9625c7aea6ddd54894e463caf86e0e3977461ba42276f6219716063d53c44229c21250d6c378d19bd29496e628c6d60b16f98a2e33379b6be9d92a871293cfcbfa1ece55fefb4b8a3300d9f5909d392ef3e9183da80ffd93787c920b36192ffa90a396a8b3c5b18838819385aa61b60980ad4c6edb708b2cf588c33658d4e12a4839504b8c78923a55cf59f2e0b4cb1f6faead1e5809d29cd3864494d54761cf634861bad3846c050d22a3e9ddf6e6f4f375a0e8982c526784ed8ca355f1407e846961733369ad7ce123f7c6eca8a81ece8ace3a36688911ac3701ee3562fbac2e14d6012698e516545bcc06b76a6cf153669baf9d3ee52f9beb4ae1fdfd01dcc2c325e127a29145e932a745a88cd41114918fa557200525d682de0b3a5fe184e50cd7afa11740901230fff04ab04bf2a48410b7debc57790e9621d654ec1938f75a61a94d57518951ef6c931855531a65b6d5539e545aad968dbceff832176d8c146a8a66f362a64ab643aa8bec77fceac2240530989d47f0d215947eb27a9715f348af986bf25b4f3e3ba33ff6291ea60eb3491fe98dbcb02bb28062fda14a275f82a55c316f3ce1efab198f02f4f42a24d99bd6c7ba9056c31a103f643a0b32c1bee82ce457afa533287a03835a21d98d2d79dfd382475760c2e08e96833ebab2440474e54a47fba11a4137f7d70c56a0156fa57d9366245d336dbb053b6931b9b876dec4957a77c2170b96f0da38041627e9b2265c616040e2145f20c12f3a3082abd4f2e7db8c1ea545aaeef2197457eb84a07e5bbd7d946560e57992d536cf493fc1f0afdfbb0f3b6bde42bd4529ddc6acdad60ffeeec013ffe8904f1fb9de729f506e6bfb872c4ffabbac7a2f87205feedbede79a366ca43dd2d5545325f67546faac9ab372ee598ecd7cd75d3eb7fda72df68113d6f26ca72ee921042dafe7c31b3bba9bf0ddfe748e544342931d46824ba04af062e9f3c8671c53c7135330904cac5a199373856878935c7436b8b0ecbf7bd3b44ccbc02e161f5b008998e63b097ed7b0ed37b4c706da71569c22d362e3e989d407105824b642b544e2d98f3fdc13d1f640a2d31cc39a208e25e414716359fbe424303258c226e108d1ad81fb3f1bd75e303d86c63952f87f8664fa94b87d984916d3d536b45c6cc0b87d75099ce7466d5e70367fd27547bf102e0c395da4ed877153c75b2723b70129d1bef78016ad880dd3789629a1bca165c7bffbcd707a33a6486f12753d6e4e8832e621831a7b42e0efb3a59948c5daf99a8c487250bcb2381a53193909e10d5629813410734e325a1d7e2acbdae1c04e4ef7bbf6c623a7a94219bbdd19cdd2362df68bb2a184cadbf53e921bf89ef5c63d98a2c5615d687c780996fbdd63118aa8dcb4d445bd61090f8b8813f25bf013eed5a96892b8991404c926ffc56f6fe6329a3c1fa066b943b4db593e88b72399eb353c5adac39e2270cee863724121bb43c58ddf61ff283e9db49215fc2f24dabb4dd816ba1d0c0a549147c16466fb8c64d526ae0b15223c128dcf14fd225858c7761916b113574e28a6e1940c6f31cc1e4f82f5fc175bdecbed7cd5ec4f5286a8545be54045046055763255eab8891cc8ab4f61c5942989125a07b349f49806c64f3d0ce82097d36385b6717fe155d0fc5ed85bf80a1fed9e3a1c37a6b08d3bb9ed18f839448639fb6bea814c681c9b3200ca5ef3f7a35ec82416fd8301c6a7ebb49c21841f53e6558f5b0fc0bb61de020771e549db586f18ae745f5f76c8dde41c2333892f857b3a7664778d69ba1bd4f97b897a23b391081fd0f7ac7e08303baa4a8898d39f6af2a7a35302e189d7334d43b6056f29673f1ea930ea9609614ad56eab33ca16381699941cb1b15582957976e56c2c3e53f61169a5aa4d40c39a342c15fa716e552ec2c35f2a57a1b0841461a22ed966d9f5ae9eb06c0242e9c23cff435d581c54a3c99d74cd52f2e38794b076cdf5477b963cb50b905394462b5654ddccecb4c90e04af082b21dd9e0870cfddba1e34bb504248f1b7cf996b6e16c92fd9adabf4d60a5473b442a6429f4f3c4173a2d31bcc55c71d52c4d6bbe304c8c3f429869a84514a620943f163a476623c9b21971f62fdbbe8f1e1d0da2296e034bcdec91ca15fed3d8a945383c08cfe499128e528ac9093ef05852c28b5538bfc843bd7eda5bcb970c8c221256c095cd2e61761da01b4fb8a1e4d2d3a13a13875facf579019ce2ba6443c0ecb1f620a731a7b81b62ae13f64aca87880b626824b8117bca6762ad0487d8050e7432d83949ec3c91f609bebe92105828f2559d5f7a7937b93334933d1e52dbbfc8fc254d1f39eaca84b5b9d921c02cfd7d991cfe4ded118e8e9bfc2cd0ba2949d5dd6fa95a95aa0d35386b0fa0e1ed4dd5b84bc9db74f1909f1e509a4617d7f2c25c1e16a30964a1301c3b27b77c8261213a948ac916bf088f45f84f2871cc03b8029a5ca29c00cf9ee893eb0d98d3818aa55e07c2db633e85985a131dd1f2c3de554b43fe5666dfa725da214b3dc8f4388310096cccc57aaaa0dfaecd3e307c5ddf9a93603f7e19725a779218734904525b14586ff0ce0425e4efe7e1c06e745c28ed136f6031c4280fd4061d433ef700b6d1bc745064231fecf387015f94f504b6ad8cd4c0652af0cd584502b48f166c1baffd23f27021c0415157d4248b457c1343c736670391f31a6b166ecf24a9bb1216e223e0db442f6a731c031639acedc715893e5ef44259817542099be5f818236e351d228bd595efbfa1353d87747f588d9d94ac1e854987de927c20bb4aa9d71fbcb8be6a1b19599fad13a25de3595012cadf596ba2ebb60fcb6f668ce996b591409dbe5f60e42f7a07454ca443a4370bd7c76ec2e068956eb88976421b08462d88732951ea1df9b878724342da8793e28df6f20a88e8ac64207357c3292710595ee3082a03ed40c0c8429021f12beefeb411ed2de292845acad511f95b1a9d7e889562d1f17c8afcbf5f3a27cfb8cfc714c36812368fa4b67f55adcaf80a7505cf303f2efcf162d3246e493ebe55bfa574b169a1cc0794e1079e32204a1e1e54fb5da8296e754dadc11ac64d042a45009d86fbc2eb21dd442a56a8e2977f22d5d4c3a3aa8d2fd5f25c08b83cea60e94058e8235ddd050646b02617f8285409ef210b3b99a348810bbee327f3b81f33cd6b80eb5ae8dc974e60b5884945c65909acdc75def6e7d95eaf511c59b68eac109ef55aa155ce19c603ac02bf35fd9c8d3bdf5b61ce356654f7fa9d582cd6db6fbbef781b6c02131561b28e41422059e297bbf40b755aaf565d88b5d7611e485388184eae74a10da3427033b8b257 +0xd66832b9f5d269e35ec9dbe48fb70aef640ba53b60ca7bff88eb092a56a5a7181c63d25d567a25c07a9f0ada0caeb21d +93688 +0xef4d163db14a90bda8415c8318ef955188538c3e8063b30c92fdbab79720f74a3b5c0bf6bc87c365eeb23c4c835b4b4089e51bca344518bddefd0cc74c4e884733a9865efa684c49c2bb94eea4e5e9b439a8549860fd387e3b097bc47b4de61dde1dcf9df553f5102b44ab9003f33957a1857fd18cf5dbf5b2094dd6ad85d975449e2dda35b184633235ca5b29ef01cec864e39c4194c9cd4ae5cb24685e29f76e15ea3e40ebc2e9dd7639779d3f0ac4b72ec9220542c9ac0c853dd737409d4a636b4cf0a067774b36f0400be74d1cdf74c9798b6367a53bfed2eb169f93ff172b869c18dd8f6b304589273f907fffc7091f3bfee06b23212ab21c0a2abf1505cf5021e07dca6541112a353c1f3f7a257d1757a306b70c06980e1adb5f2ca8bd56b0256e0a7f2f26a2bcb32a1cf456a1d99814a35cb127944fcf2bb0c6427fe6c88deeea0c188f860025e9310f055be2248cbc266ac23e7157db98b1e86a64292ed1c57d09fc4e09344f1f7781dc519166da9553b9521745b81ca9084c0a1d2e8f63f24f8b93345845209d27fae00055a86ae853d0ca7cb97a79a5da7b8c739cf32bbd871945081b3b82aa67007930d7f124fc4e37903374a6d9d652fb562e1c62116e4d3c7a94f91e5c905f1d0fa8bf49f01b6b770e041f4426829556d21655e5fd4ccb7a9a9e9bf7959539d80a31b4b8b68bd217abb9625a47f2ce1366f2f083d7a0265e0defa9cd17021ab9d3935e475e95ac9fce18e4f2246e23bb7c8c944587b2896d3b4fcaa9c91f2c49d09666fdd0812198e1eb4e13a53dbcd57baaea31f5ca1a318d85a6929333970f6a0174e3f49758894bf847c6b2a9c2e9cb1599520a300131695be6905d888394099e2fffb21f7afa7408781233f85d80d4954aadac2b67f5389732ab0f64175e1633405bf360ae73c4e289ff1073b421fdf2a54cc4057406630231ec92107bf7f7894eff9da31d7da35021953162f054b0f351363b044feb50648c5accd4d8e7166802f19a30ee9f7918e8dd7e0d38a15561f773f771212c6985ebfea6f756b4da98043bd04f4a62ae0388dee0bbb59152043e0ce2941152152cf4de08c31ce8aae0fbe52948594daad9a6a03db68fab10a4cf08e3b448e4bb235204db7e530af00990f58c6242e8d562ed2c7f44ed77f709516fe11aed6ac530ab78057122a313dc6a75e0e62ebb986502898caef77e70fa6d49c60f296c9a1ca84070e4b23a7b1e326c0f1c444f59ac90bf4e3cd747e141cb9f79d92473a2aef066021e2a57909a8fe3004cad2b81fd3dd7ab35b25bb3a41278e2c0050645b02cf2a569b383b9172ae19bbe90d77921b1d88de3b3404fecebdde90ef5aeebe803ea400b7544615caa6ec8ba16dca8e095cadb8cff801be1fdd576091bf2fc201e58bb4d9725ed32b8926f8767c1750191b67d79c1a3814af16871fba05ae01e2443fe7742abc661fc56786eaa0e4a4e4ca35af21f2fe8f06e9ec22aab6effabbeb4f0d19d6054b11dc1cbb7084c8e8d6f995c3e41aeb89c1d8051df65b7c28e94b27ba3d1cbffeac4dc51aaa802a887a1a06aa750a75814a5150661f5bc8f914d458634057430d398aef08eb3b802048bc16c7374a33220b066cafa8405cf7a9175facd62e44d35423f91ad50f603ccd5034bebd429ad8ae37983f03a1beb120a4bbdb610a2c0d869971d4da84513a6266fed5799c13119e8581b8c3e8549215eceb8373636ef84b6bf7ab7e22c9a5b260b3bffeaf32694670b7816b9cb536f3507d398fc294401d0be9233273400b47ee11d2af048f5c4079884d6d27670c338fcf7208b022516619c4b089fe3ae76d6f97c22d347047171092513b20d07e60eb70a180b49fc8d0e618f8071c40a6cd5593e2dba79bc624d664517801882a16040f5c8a487302c811645e1c65c7d5d240b4d94cd64856142b5cb28652048bad69da1787c4229bc62c35574c53570106b178f9f3692c834f8009f8f89acc1f917d8f570be054f04586ea68197d6494e5183ee951a8beba4184ea99413445528ccf9d8f790550ace0c21225063c772df7e5951c0a4d558794aa8d17e2c706c0d9c0634571abcc2e026e3b0285291518b9ba19f66f9fa757b3515ff97fbb96e723009f0d685c1df034dbd38538cbb501a5061c2d04482ac72829d1b25a9a6c31d2f09f4bdf9edc9ff29b5a31738cdd55344a3a146abf36425d8480d715dc0d3d6420f28549dc6e89c63d6d7bd7e4f4aff206e240f56d7045de01fbdc3408d0767112274e29ad6a5a2a325bd8c87ca16e68bcb33756eb5f6e2422913637a97c597434ac0b118a566d890ac3dce7bc6a1d02ec0b6be1b16a17ca56ef8983266762d818ff4073eb99407d37240c982c95385b058953384816df3b1f752ab908083f272faf82d349c98f7147facc7c25d94ccbb98b81cd27ec20e0fcb0be4bd6f52aebf92b46b23d6d870fadc6b0e6609cc6ff48a08c12c95089667f2098be1bb4d280f60100833edbe3a2d9063e69456633405356b69bb4fa754607536e823eadb2a0b6af54e8b6bb11c56a37e9974cac1e496a1ca5ea733070da35b7843ac86637a5bba498354d818e01d1ea26e30ef4e474ed70ee617ca918cd8acb9e3a4174fe1a658f6f0b5ba5d4c2908b9aced4d7324d6de1d4a339aab98a671e01132230627944ae2ddd79be7292369aa9cd66a9644d5bee1d2252dbef8b5b1d5157e34f014ce9af791e1021e3eb2495d8610d02170f48041c5120b3375ae748037b1d17570fc501b56fc786a557fb1bab2c6077a6edb2b246d25ba70d739c2c9bff383fd02c67238725084333431a8a9671e950b0631c7741083c4dfe6fda498f46bd0f093d20a352e04aee1a4713712ee40043a029f5d18f757b1e769a321d51f4243b6ebcb1ffad2417edc6de765dd8f55dc7129ccf3f86ac707ef2ad24268889f61b7d257ba6fa62e7d8d573a3af29285a317426194fcb0fb5061ef330e3977abb45c101ee27cf2f4325a2a13be393ff7e3931605450c131c13a4816e8d30348ec30b6cc99f09fdba25acad19fa9bded4234f6d611010d952d920a82ac736066f162db000f9fe10a9dfeca9f5f5feb643ecb20e1cfcf04bc4293d2b0fc5313776362ba26af94373e9e780e74eb74c106dc524c3df1194b19b8b63d4c68e0b0dcdaa6b0bb0a6c06ea1c5d22ccd496b347a360d525258e453fe87fa69f72aaad199fa57b27a095e49f90248431ab2456a91c7d6841cd8c97816a66ab34aa2f8ca05af56616f28034b1a254cf3dcfac0fada01e521e69a296a0b6f1b7a65fddb423650cfde370d98bd2cb64503bb2ac62b7e6ba3f157a4ee6f046b7686f3433d7f57652cf27bc006e7563e9b3c61493e47a58e78bb1800fed02920e19e9a7c05ca8e76d465e3473311c144b566735f0f9476f0cd49d0b643d5a318c58c02b11b6b030c2fff16ac09839550fd499c75235b1a1b086128cca3c59adb8b16d4ea67aae0aea588bdf76f84f9eadaac829161e3b99793ccc84c08ea35ef9905b82dd0cf4ae59ec77f2e4c5e159bb458cdbeb17679ead452573d598a9dde5920558441216b388285055b8a5712eaf4162601fb5a859e35ba7ea87eeefa30313154f69fe96b2fb98af68510b8186000ac356427d8033b1ccee4945e5e736b8bfe5c8bd3707252ab9efbb5c6c94e8341e2a1ee1e381c47f3543209e3213019ce51164cc5fba72ac189bcf294d1ddde1f8212a7c6c2f74c21150f10f4815ac162f02a405dd5323e6112e044621aedf60352329808bebdd10ed924af79c419ecafa33f7084453c16f40310b318eaa555531ca6c8cd73955f226818f05b3394211d34fde22092ed3be322f3489e8a2d8279a6193ffb2aa87dc58994db8016f4e814690ea01a056c349538320adc42ae05dbb931067b2b1db35f064077d1b560c9fc0c17b25be6e289710c7402bb595067e31c962436be1d8958a5c3cc3657014d3de3c31eca7d76c3e168623621193a2ff799f1a1132bd088182fc6e29846fffb3fb7b7ee4e1151694b12a3b0f7c895e581f6ea86f9b95d37076bf0c2ddc8815c6a4f9e2ad1eb9a0319d3e07826af8811e8fc28dad2b1ed1e8e23ea73ef26aff627751ed83a547a1ab273c19495163c3c947354a5855ba7c6131d5bfdb4a8b254dcefdf02719219357ebaed0e2b44d8eded2315f0faffb4b60022ec691695b2fbf3868aaf5ded9edce5700deed28385ad5bd314c219e53b76bbfa45befc37d675d202c7e8e8af31974f5cc83a71196b03464df923ca55658fae6d0d044dd44748e32b3db4f91efcef2447c7fcef4fb17716576b1bf5965a883f43ec43f3b52dff8cc9951b7984246bccf9b23b366d809133ba12b382f141e9d8438c84d522af1f37a377254e27d494b03a30002dbbffda053e97f259ae423be03792cedb62f5324b8289db615032f036d2e952bc8157d9f5aaa2e162158705bfe5a92aedbf28c0302e76449a466609c7888639cb06af1669c8da86866d35cfdc15779ff37f704f4d6fe468e1539967cc25afbd4293301aca5ee8ebab007722a191a435d5ebf4690c0d7c501fbdf390ab720be70970016c81357318ba1473847520d9f47b4bdd95d4cfe5033acd9b0ece3443be09e54c95f41524139cf25180c089bee5cee7525c0e7ec7891ccbba699b36fe4a283a361b8dc5a3e637e23a9beb95fa0fb4067c4420e2ccebabff77277c3fe5944fb6e988b30f9799752b565f5c0c367b16f283d773c39a30d1b0fbd2d816a0a367a28d63cdb9a9323d17cc537cb6192fddf18e9d6fe9d96075286df11684d68056464935458c80bb76ecc5ffb35a4c35ef4cc51d7c1c32847fadf60da0512f3106ea46858250c53b0af368ec6ac27695364b51df03234ca3d688beaddd4555c05dd6acdbeccd1fbbe074dea107b4405599355a6b6ac7d1c56401ec593527ed344551a2bfebca3742e0b74ea6f4f9517fff54074a1bd066f2105fa99a10c1a296a5a550bae711b4d8f203e1849759531a52ee81037c06b533c2ec1cf6d6d919ed6418df5348683f85fea2bec25a9beb2f794cf01ef730668f62ee6ef7ef38fd416cf3771376988052ecda0fe8a489c3c55cb67b23f318210fd9aec625c4a6f49ba47e3f81da691e46a4f4f97fdce983e4e3734a9bd8848dba0d744d07bbeba602f4006025daa2c26a0f37a60e6c84d394f6cd860e0d3d5298e7882a253dcebd7e44c30287df0d13c413ed3e1dbb2259de7d0a5702fc0b19b14f318607b318de177c0d4b305270ba5f995ce834318bc0c96073e4010cb58a0e2eb889368391b3d6852766a799945e408acecddc3686ae5e87505692a5054cb66a655a391701e4c2455979741e41a871cc89159c32dccca4dae9d43e2fc108b1ed802298d53019e3a5eaad20473e3ff949d6e7fd8d55c1a34285878b12b265089d5108dc27e6f9428d2429327e55cde0e7fc6b86afb93563a56e9703b7a00cc26420358c74ea2ce6e64d16322a4cf72e9045cbbf01d0d2ededea2b2e8453a4e72934d13023055bd896ae9ba8b2ec67ec2bf72c30e9623d4800426b93e292d680d4d603509eff2e1e878fe11d80fdc522a05bb962d036217cc8be80ba3a264a934c4ef3754ca04cc29f380f19fb47b8d6d7b997dc1f1524922ba5922bf2d8a72b7be4ca2695af5ecbc8f04e228b91e912b759f1263cc7ee911341c86f746e954d48e0b0ece1f60b42e900c6c298a500dd2a82edc99114288167d84b0d26b0be039b89cc4e983bfc2eeab09e808a49a440187db34c84c47a6a0fb3438d7268c7545c2847d42247d897b248ffe4ca467d4167936c377f9e8b55f21ad778bf5c5b4973054806e8e248862b101077be6434eb00094013e96b0449fa542f54745520e8c968f86d50d3f4013c50fac0cf6a7143cb2a56662af38c4f0eab74acfb1bbe3b44997f90c3e48313cd4fe4486522db53b03dd7bbaafecc6e1665ce05bb76de4acddf04f7aadb9ec1c756f795e9521b229889ea97d0546caefbcb64e91c2e281b4d84af2b6b81ec1510ad5a31c1c3d9b86957b88406bc1317a3255fdf860a43b9aacea9b3709e1616919c36a4573dbc1e0def6909b40069b2f7bbe67061d4d829ce061a171ffac3cc326bb37412886c5b6a9924af40e61886dfd4222215528e749f732ae0e25c9c40dc61f82b596b92776a9d11fc1337c59b44ba3b800a4d0ea3075fff95208e487975c72e5096afd67bf442597a95ba1afa0cb3580fa98cffbeed10c4be4056707fe6e57c6c301cdf6eefd224b12e39bfaa2108a15958d90acb38cf9fe4ac7dbc5b18030b068f7a565845939928477a5cb369013fe580fad7d4d2e4b88ecbcbd314f26903a61b91e241ddcee1674647981ecee55a3b8ab80de0a297384405075eb25b5f8bd53c292c329fca23f695661bf237fe19e4dcdb54f89030478ec2fb043e3d2ccb195a09db3273d1885e9a9f8e378b92a567e02b562384f60cf56a6d6ebf7f19ecfdddfa984a41293826bfbc99f6b4ea264cfd70b8696632b0006526443d096e16062dc40b81f11b5ad66b83e336994ec31c9a7125d21e2d5a381cee2dc1c37370beb22fdbdf6bef17f605be15ff2205a45e21f74367952c3323f58cd151956f23acd403b16c97ed960ff733d6593759f29af9caba2fb17a634b59cad9f867ac5658fc0734315e5d00a8a8abcf4dc090d5588ab233325b5e1138b16eedbb2170324b90040d35a6867c4a80eda8e2a5f374213c7756797c1f66706341b4a4ab04df0cfac2e38059b1337ce7c30821cecaf87c77e0ca0bfa06897dd90bd7baedb08423a0095f1b5d264cc645f39710245d88f2a3b638f1bf5ba2e77994fd05cfbb4a19eca1290d9c2df0b00246feba8df34d0a28c14731b166db34ada3cf8e3a6f58754451e85efc0e47c38684e524f2d66f4c6ec9a0d5ba6e5aeedc02f55c1412d7bf12e24417671078863a75f3583c4c1540de96eae4c1bd479c6d77167747edee80bd1de73fc47cac8284e0d15d519e676fdeefce67ad99cbc7cacbdae8b948c63eadc776defb9a0a3dcd8f273b1b148e60d79ef465684b0ef65ac6ebb6546b86844aab9cfdf3b2bb417e489cfa81f5b29b326903e6d91a37b1852feee9fe9d57d7fc90ffa2960ce616fdd4d8a36a8bfaa95519a4f3e8506e81b3d08e8aa12761c12b3d47d8cbf0b442b4fb843ec01c8f11aa767e927d34ddec4c6f71a02451cbc93f7b1da47aa54d4f098448d16af1995b97473ace800da97cb8d53f336f63be78a01229108b74d8c56639cb6650523f1086567facd924fdb960caa14c6aa56154b6ca1223e7a57d2a32e0b6045a86a9b7de69f63671c1ff2aaa153ef1fd5fdde7ea6b80e574806608d542b0b470d700d8074946732e2bd757ff80c02d10d859b9a2bc1d5f1b4cb8e6b727627d7a8b6cfb69be186bf9acaec8c8d1cc058b59fe5047868e98c5539e4d4057736760eb14a96c8f1427bb8aac066bd10d83562af33642917e9858db3ec4d8998c7a0a3f21697886e1ae5a0ef898524828ae599361f3f9a59368be2dc0d3e7b655bf60cfbac4f5692808c080bb06e3fec88e7ddc700dd68a750fdd914d02d577753d4be208414b01903ed3281cd988ba932ca84c470e4007cd959f4e0dda0aa195fcb1c23368e216c2577d4d4498a846318fc32c0f7e9fe64303eaae27e2eeff5c057cb562c12270655ba4395acbaa684bbfb7c4efe35aed7e60a8f7c3a2e958735f9204bdd574d62253323287faf8e989c56a5c10c7dbe527b4c0720ba364738112ddf76d2b3e11a1460e81f3aef99092a8c63c9ab18995e5081a67256cc5192f2743d59a4be9ea893c206ec56e15270f70b2acb42accc761639e1e3986761225a5aee86bbede26833d504026c3b474a72615f386b90c4143cd34de7077dd260a940576090b8490365286413d343e4103d1d95a39e6b1cc324ec4f1f1c9641d87fd30c89cba42ef4b82aab733491b54ca79e529f5392330d6ef369de50372be43e716264b54820a69d6a4eb2f8ab475a52621a8e13bcb35d8b7722b74ae6ed2e75aa1d73e60abaa39545c255a806f6e3ce1751e26730fa3e0af60e3c551c2211a5eb8259e6625976206bbaddbb2b50636b1c9d5eb69584195dde90c0174d57385fc435693ee57998df4a7cadba8ef043c9f051359a60fd8a04bf3ef4fa00f90cf3b2bb34481ab78622509c582eb8331f5b2112198b19a30a80167d5d85bd840a1245684daa688fb88a1cae6f702db550af2d547cf12631156052e04c430984aa3bdad117ce656eca870d07563755d3822673acc2752d04352612ec53aa4b7777c1018a153c87e11699b05baedcd73a1e61a26fac7f84b8d431d515f62419d8fd525807e87d46632742850fdbe918459fd128217d78c3bb9d23f7e1c658eb35a5502cbee3f92771970229885fd49f7291157376c8197088da6d19d426b135f9fa5b1e33aa38b198d068ec79bd37e36d7c7f22c41eba019d268da951a9b590a286c3aaeaadc46b555de76c48768b6a82bc9ea48de3d2fd84fbf6350ec1ee71dbb53a31685124bb13a9fe17791e37cb5efbf47758aa0ccacce5473b5001c45fe2102f602156c237704f2d8c8016d55c5e950129a8e3c00fd15ce12ac9dbcfc1722203b59a013556d7b7e629f1e2dcb40e225529e32385234eed6481d0c2693cf855578056f2f69fd66ec87e4314c658fa3e60f6bbebc4bb71f141ef09683928d144bb7edcae7e88e8fe34f7f82f1ac18f13a51e87af271ef702f9b0d81fb82bb95a7fff9f8635987bc0cc3585945264497c921fdae004f44abd0c85d15b5eac0d114591143cc4452b60fea58fe705d7b5b3c8692a10e6a1f969eabc69cda52049038cb1df14a31564593cd65b899d926073b898f9c454ce6fb424f315c9142ef99bb60054b04a9fb30407268d1e820ab616d31dce7cc7c03a063b9879e0343e9b6461db1992333a941bfe34a8f86bc74327b8662cacc82dc4daaf3aeaa57dc5aad810c0a23ce58c83eb828f13b9b35e7410c90078d6de7dbccbe0490c8b696aa471334f6302e9fc0f0d247471c4e116e58c958b477d63266e449f4144048f8414ca59d5e0a6b90fa1fb64a337cc8da703d5ae552d130ebe75cf0cb2159348a8784de502bf7acb3dc930c389ca1311755b9663fc7e3a29ac5fd5d92a15da3d4e5b7675443401991cf137b1a6cd4b0518494956ffdf555c8688f38517b92bc5fc1ace7b1902ddbb13c69abf78a5d6d0f6796917cda4f71fc38da280e9741a8b2842c0770f9051a9b895b45d7de8491d96587ff6e48391dbf9da5d6d3ddb18e5597ff6f986512fdd820b2f1c350914437e62e8a4e2efa8198ffbaeaa7352c97d160edc631be9aadef673556c1c8cbadb25254d82373dbc60fc6df0b9387f8ebad49beb444ebe65268c8ae1ddc2e7cf5d112c191f5012414ac5adde19dbb5eb171b939e3d7d43e13cca9e3ed196aea431d8c3d5eccbf1d92f8237b15d0b9a612a61827f8f561e918a2749e6f82645dc01d2990e7b1950d697a8a834f31691835d3cd509ea37a318a7290a54b1e051f94595181d3ab6b3ec0baf5bb36cab3fc4380427c7beb075c91c565c028f53377e6596ddacac329f6c041cded73a280996335de7337d4f0b354215bb9ae10d7acdea6e3617600b87e91967bdfaec1b638be7b09fc7b661d7efc11da578676da07a6c71ddf7c6afe1e5a42655a8e303f217bd92be1efaa7605b01a4a61582f22d06344811b8709e41d44cbf525bbf6019cc3d8ace83aa7e48f99c613a0cb44994f40a679df3de652c576bb920ade1be6f1befef5da04664d66de9c9ddc88bc26cb63736cf14608315c1899a3cf9fa8d56793d66c7ef7ed9bd0a92451dc379fb08ef436c21a4b77672b54ee923da5a4b5476be57a9eb946b4161fe7956a7ff621de1c74e222f43cde7a5041c61c991770d96db58700f27982806a6cd24c08c8600402b736d1e85e7c91341aa7342209ed65c2cdfc6d4b8ceb55b23b714b7b1d5548d08625efd0e52bb729019d4ce983143391b53fad6b89d9df1eddd82f80fde8f1ab6a174353dad235577f102e958ccd8b03f6ba88fc773364d7d971c0be710149bdea74961a445953e51b68a0cf2d00b44017d4c6a35fe12d05b7a3c6de8088962e8ea5b0cc2ba759fb5e0d6b3f6d95f76fa0f42e0a48ca82ce00d5088733652126de10591297a68fc3cf68578c54749cb819848ad93ad8aa5d3b714f62918032cc631e5994913d3d62f6df2b5fea86eb440beba0b83ef2efd8f0de6317a2c11048a43777f92054aa035bdbb15f38b12b3bfe91384d5a009768a8840c4d6e1105c329c47cea4dd41fcc87c5af3545dea6c578de1c4398ebeb34e9cb12acfe5657657b2b310e1fa3e4e50103ee8819f6a208033a1340009933653e1b3cde597a4f5521d65b0e9eaa417751ff3601bddf682f260de4ec99f3b7222cdc5388876335bca32bc591d2d17eaa001f4e48388340606abf58f16be1be943d76205591fb51c18a943640c401e2a595cd000492c871c355b837f47e4c92e2f85168ea7e28ea8d5d7875c37b20b691987012ddd4984582716049a0db1a7935e5d5f6f256d44a47a43f4bc1ff174295916f4d7d05da02c24620559a8935bcb58d6b911321e6b718e85080e259cfceda093479892d76f1ae5a5e258d9083a389777900f5e8467a28af15dccf902fa28888265eac54535a6b38837f1ff9ee75da2b690c41b3dcdb9e84f52730ac1e06c694adc38c835b852465f82cf8cb5d7ccf32a17d9f889021a2ec5828acb68641bcb73172d1c275b9ff6a24f4c10eb7fe91138b1bb6714a965e71a6a8ecb54e9c93781a312417894024d06e9e22cae64447568dad2f75f280f79a486f98b15e5f735fd1c92d8c8060bc1f40f4c208d1961a8411fdb19c702898efa44557b29ed283f5bc0293284062efdd01bc4ad0603b32247ed1e5efacd667f923f2d1c1f63cecc144a3fef3b28ee49418bf61287b7db6be3cf273758ed28c3f2d3dafe54ee7d54cd17618f6be2bc4cbefc5b01a0aa2cfdbb3280237ff63304a2bef99278e19671ccc4186384d83b60bed96dfadf5f3a4024b3a3a3be5d27ba083d0368d9e1bcabb9bcdf3c145dce3db7af995e924b85ebb6cf2c58b2a6894cb9fa82f22663525b1a8e2059a907f73c3feb77ad78039248e7e16482fb46aa453e53f2bebceaea0845a4764ca14b48d4be198377eefbd1f04e96f6e2d6d23d2bebf5dd3f2bfd065be18c6b959bbc259fc8c6474e75a8e76a415c5dc8f3bda479694c9cf3e1fe199e64c25ac506bf3005d65e3d818aaf252f66ae03d5d08d62a62cc4cc6d7d82a67855d2de4b60e8daaf7d5dd0c1bc532db835187379dbb60a4abcfae61c6d0f3f522b3a60a938bd97e504519b8f8959638d2308472593cc0ddf804b74712f1846b45b658c5f0ca1fa5f21b6083b50165926c709d9798733efcd1d52e20c32124f277ce0bbed4b3a74765c17a155cf0e910d77a9b4e6348222abea9dd96e24a1cb23e63869d472eb88a2f9d2f17f44c68db9db5453ec1a3b38e48e98a4f7553b5d225dd920951239b99da19473186fc2b1a45886510ba6c3a51f6fbfef38724347ab1a4f7aafb7a999aee9b890a19e87af6585dc16c568bff9a5148012b1da5e4d46c207d294c1bf8b6f18dbe4bb5f89d975d9b23f89ee84a92e0385b9f41be0c05ddb9eb2e4dee00146d56ae9b6214db24dca9515f996b63602b34d3f6fa57f3388cd80b6004dcfbdde95e21a329247dc65ef113474ffd912ebaa232d85158e29302e3a3687bcb2f38ee0ddf0b1110cba46ada3359c9841e2116eb40ef4ca9213ec6447cedbaa4e54e03cbaf7a23c00de788cc773c0ee95063c678c5e0f632f86260615e98c7506546b0005b98661c8bb6402fa9982615701c52b0895654dcaf2759a41111acb6f7497d14a90ee20d8d3a1b6c8f171aefc57343fa53f7708d8db438745cff71bde37ff36f62849f795a9aa0e9f25ff15e99911fc0ed6b512edb328538080b1c4f700f99794ea1a64a3bff580f9918b34c329e71691d5bffa8e2c8c95adddcb753e822f79b340efe667891c9464eeb69a0d9c1be5dac6f83e1e79f8a41a31b49b091df963bdd73afb759777df7d77f1a42d6229003624ee4c335de5355226fdb50b46ffdc31276c22325dafc88fd7ece1971ea6ec506a12a3513aea9fe2281741a98f9b49999c23e9426e1cc63888d8d0ff241e10a620f5d1ec83716a46af81cf687a644273afd2bf1a2b577ee4056600ba04e703b3c4186689da021afc37ddbccc79e34d3bfd09122e27d8593ed814ef6c53aa3be5ddeadfada125387f5b8ba84a1080c07eee2790e2e627cb956b660b6a72c02fc8d8fd8bcc7b43294c850c0075d0c552a91dcea9fce8ce6c7449c9d348e4d165d93fc1196abaf483f04eef63b43d496a46e65edbc09224a277fdb0d58c4c5664a39cc5f70d02a1dee703962099b8557dc4e26894d284d3140cf1cb80b90bb7a2945a8cb327c4e370ad5da0e59ac4a213cf8c6c63b7334227afc07a7333957db6380375bc4f84320fcfb780214bf497a2b36eeac6c3200a53dcd43e1b908c31061b222190e8c30602baabc45201caaed11ce4644c9add842f10b796e864524a18aa3100df97f3d7dfeaa4dde670b96ff578975953a2ce582fe7e50578138a517451aaa3e6b1b9401dfc2d5d8d0d4353a632f24a7a8f64eeccdee71a391286bf9fce198b44da65a7435bcf93842beae259e88fa83f9543c09c423835aa05fa1cf16be81778869ba5c675e6308a7122a48705ba030178ed75f4ce42f8595236d22fb7a0d9002acda43df71bb50e619d02c4272bdb6e8ec4678cefb1d2a57bdf77812dde506a5b7e2b004bca816e718c9587a93fa1e56b5b2dcb02ef454d075685cc5aeb1e158d1fb2c3e09d364925a3c548287ff6f483342115c465c08e792e8537bb7182902434d3ef51ee441cf2652a9c01673b1a5ac1fa1380bff50845e9ee79dbec3e78d56ff6e91c482b686c332de9e07ffed57697014ae4482338f1fb39f918c5a23e04f39447ac355c99f7a067b82244a2a45b25ef024bb90baf11e4f03c0e984e3e379254919e306840293f309d633fd7057cf11bf0436cfeb90a3989c929ce9317e1be804d4ec3def9756230f01fdbfc77507b008b57ee7d055f5b9f1706f3214997cadfd14a5a111470abe156b4a393887a364549f5b8171285ed88bc02807951ce59abd42d7dbf2f8f9eba37ce212ca75eb542a2a9445d4f2241ef0eb900fbaef9ed7cbc44a939a9369d3429c8cf3862727a912bef3da039990b2aa5a6ff38dfbef8daf04c6701201a39e7933128472869f8a94c33ee90607eabc41748d5b162620e4f268131a6128ef73d1a93a6c99789b2039a13e19e3227a663ba0b1ed5c5978031b5af83a8ff2947ad166cd5400e6629288c0bb13a4d487d62248a554677d4013b2413f78a546dcdd01d292e3b1b93d090a897d7e51045b347dd32f363f78c13b4085ae7baa0b0dc1e95653c2b3d774ad45624b03f09a3ca9d5a9183ced3440a44c8d0eeca62b70501258d6980e2a4fa5c3b4ee4a8b7d735db132270d789708755ec32672a18d4db20342e40eca99151a0ce82ffa2997487799d52652e88b60d7fe8ec0b6a419ec0f447a45ccf00b1033a664d4bbd3cf021f15fddbb245f78ff2b556a25fb6b7948e5e6ac179886a86191b92a537900deb7fae0f10d698c2deed0a849516e04f8f57d87820bd989dc0f3f3d96c13683949bceb748b65e9d695f1867e618329c923933a0e29422a8c06eab4a0effa633c6501559415083e1afc25afadce4d990d996a0d93a5ad451fa026e851f7928afc877472d77567a1765ab21079a41d38043903d76f5da9f23ed5ce16534c83e462f73dcda6752919d2f9bf2e4baa9a0f944a87230916dc38d1ee0bc70eb6767956fc85eb67dbf6ae161f759389a96d25a6161d76cb9bee1fc0330482eafd1352c1df7456847078692b15fcc69d6a3d8223e3ee5a1cb388aff3ece2cf4fe8017689e9319563fc5451f7237b4fedb2b32ff1fa2256642552f15261cc36a541e9ed985fe5306e47356f63901ab7e34c7733faa3e0f30cbaf3ecc6daeb4054ce72c0d48cb7af0b18c1c957a60384e5ff3096242550b77a3a14a8359e6674c45845f627b7d09ba438a06abcab5b415d92866159ca9b2c176d5c2e89f6665b5da609977827577ca0707b5778e84d73b2ce239b80d8e9da4b1a7485a82a137b888267acae2575d86786fa9975a5fea44c7bac4c819861487f0b03b57c82945fabb2073cb3f952396142c439992a995b9361cc7c44522cfe1906b2c7eb45128c30ff904f6eeb1526f66e823fcebe4421ef472934b04e718483d429c2dfbdb48c7d31abedc743e7288ed0dbb1fbaa277dc8f66b7bafd35963233d0fae3f30a3e5fc10ff1fa648efc69132789908376cf786373b5a292a0c2263080c94f3e70622136335ecf3435688675a00fedcaa381791d041d8049cb149aaffca7be22a06c82cf4f45d967c43f678101ce9614eb666518924fd296f71605fe8ee6bf641cb61ae89e579783bdf992c1e74617e6a0b6b2f2c8cd180eb73f0ec8c236c16737c7501ebaf487fc851f8ec4baf6e1b4562ae917f235df15ae080b8b30f872a09428a8de2fbd2946ac29b1e5e76182128e1b8e04c8ea86502df992b245ac31b4b442ab9367120a06b5a0b2c207068765bb010855978bac22d99c2ada9ad29cf81abdcefaeb839891140cf7c5946650326f83ee66e879cf2213583a608b0bf2ff39e299713792539a59d6f78d09f18b0d1e1cb6d556355db26dc647e0a0a8f23e94697172d5bed966e9874864f248766a3923e81d5b5ed6786b6ee9d7763a194aacab0d8c407988ab65a65109c7dbc0be5341f89b5256d7d87eaa86c1765fb687f53fc42a0242efcc30bca7d8051bf88e0eef7efbe5adc0473a11b51b2b6a789b00902be885bb8d3dfd12c35c34896c6d9e94d1ab8fd42e69002cdb50ffeaddd85134ab246543cf950d711a02d0b4bac1b4ca9726bb5a80a27364801f7e6134e459a5c87a0b6c5555e4304268642e621ed40935f9e2b15587f64149b3215e3c33ac5c1a65f2a58cf533e8a2f95956d0f96ed94491b0791b8e2b5b7ed88352523aabd00754b57ff4f75ef2d2323aaea5d5f7a3398a8f024129651bb5dc1ebdf58dea9a15e2be6c1bd0e7f746af82c64f39010f9b40e8ed74ee45fa855a4e11b491eb22cc8c87ea7016415e76cdcc1e4b971d66d06148ab1541407043cfabfe0deb2002a1bebc8b704bfda0f919711719749f517f4848cba0c6e73597a8b2c37ffe1ba23be5a6bfbac69f67342f0c5137562947fe7253bfb5f3ac82e771fd12694f4099d1bde107be2a9909ce5b185d23b02dc2e48be407b33bf310c9a7e56b885331422993e5f3e8fc6d010e4a0f8b7d172f5ab7d1842437246d47a4d6f62f2bae60439a044ff4c9909df59a586c7c91ffa067ef0fbea590217d900f8bc9dde1c55006b98b699adeabae5ff922a9a110de13730072ee0c7cd7a6926012bb18391c8313ee95dd46a68210988115617958471b2482c7bcb95b9b7ac75d18543e90286be3cfc015989fd85747e8cd0e95f6af09c4ec6a854c9b015c974d091fe1958d8d0ed376acf1590304e686a61b677a9a720ca3d7e226d99dde8ac6619871a79068fd8035fdf130868becf13d127e327de6345f8c5de885b5833a3fce389f44f582285c9a9318d4f76ec3aefe8e3adcedd904761452f23e0cbd0e3f8b9aab0c115b27cef106c8a4ca20131666e93dd84ebcd56dfc5be450f81e7f4c4619255b6876646df5c3913e733253ce02ade79335142fcda0f32f6d0c1a15cc6a3eaeb18f4676aff553f2f08737fe4c5e56d8bc25819c0bae9343e0bd225a568495a7bcea5dc70b9c327e697a838b07d67e71a1945772ae81c6c26a8fd9c561119890bc0e2eee1746d98407c1b77297078f52f206386c3ca7081b5908a2ef828dd20a6d6f3c543971c3b469f1465d506e03fd1bff96e12c9ac1cf4a9c10212175bc651f81f88218c98b8ffe9da2a3ea8666c08de4e57a04e9ae4e9dce9412c455c24160eaf6000baa9b67440b7edecbcd424dc65ab68f3bf00829e124c12cf1aa7e2fc00eb746a8917ddab8ef1d666acf011563c58c99585a79d1b31309e81fe06a70bb61bede661a9d6aeb9d10f34de83d97d4b9da30e0957de6622de0dcd593f1b4c1887f2fdaa284985aa9fbddebc54245a7bc21ee4b2d7ec89ce9e8638931be7c60f77ac35cc5ddd364aa30becac2d9bf3b20e61a1e7f1718c1cb8314c1462b382813242192f0d3bcb80251fe718d4e552d9ca95cc126b1275f373379045dc26865801dd2e3c030b4b336c21576712ab7fd93fe1ee9a0e794e3d18c08c8c50e9dc7a2ca5fe5906f4bf4dc13ac201af958098b26e8ee7a24e1fe1eff3c95288a48cd1fbc110efdd9e2eb56c91b24e734a5f006e633461ef38eec740f9ce004afe9c43b55aec6751b2a053b550aeb6267324f8bae96970bce0c5d753fa23fc5f9f16baa4971b272a +0xb2adaecdced52a7bdd889c2cd0e8162ccb2212d6ecbbcf209fcfe7785ade1f07ff904cf4711db0135b7e47cad876dac5 +94480 +0xafb60944a830ad6565df306fc86ca403850d7c91d761e564729b5adfb8e272062ff8fd40331a505ae828ddd0730607486a42346088f723a9a6f180f3e611b5cc32f30443e5cfd2f2c79d463b3f7d13d1c455927a95bc1414aa1776d6ea01f6d99ef144d72616dd32ea869438949871a57d8ebf69647861ac665565102a7adc365d38e8835eb916243a2bee4fda20c9cc7b35e3b55ff2b17ac2f2752710440fea551016d0f57e27cf9dd37d0979dec24fa89225e4edf4ad84a738cda5032638fd70c3f644532eb83bfcc869edd9970535eaedae807544fdd4fb6d96126aeaff789498b269e09170714050d98463163a862b8da61161ab4872a8daf7f4af560b62abd66fc7056ef8784fb4f5547d22084b52bb341d18f1366494c719d5393305c39cc658e4288ef758133ce7e79082178b47bf802e02de70b4a97b233c704894a34fb0924ab3ba161a732fd4c505ff104ef2e1b3cb873a9e6acd403eb2bc5f610bacdc48810cb8fdc556d7e77442619b9c3b69f57d0fcc688cea5c92be853e13029b91a00f9d505361a67a457eb1705f7e0a9e6dca025d7424e71846e833ae53910418c27ecc4cc1f74a61196bb9f305fb47c9443dc8b56d39acbc83b82e77c9bfcfb9d7560373ee8d2ad489c1c1b4341cda32a15bc99cf9d4219070b7df611c94e4bc071da98c832e2e1abd0a337995e8ab21adae6edac0fc2edc366cac34f5182b69795d256027df3e7ddecd760bd067a2de90bd1d366bb9bbe7fc5ffeb7fb548d08569de1b783aa42431493f2328ca1a8b071103f7aa213b0faeb193eb3d74ff0e0c56644583e9622b586e30fb5719fa3e178303d6c0c13f55d2b21d2f130113e3aef3fb60d01abc61b5d45355e28687db7cfa47dd552c07258e3ff2436afa35d5efcb09f9c74f216bdc041ccf359041c7b9bf4697c1c2310333b3c9a4dfc0c3794134168ce3e72fbe2d8603c3dac7c6a7407a9682b1142b5355c5f9efdbe54b2245c7b776b08345bd4cd29ed04c7d74dec384ae1a8d9274aa76ef0970d9d84b85500e5353b793e20d9c6254810551daf29595f3ebc1ddab8d19878ed4643a3307127080a053a9a303aebdab328fc5677749070e62f8561e5fb037e077055b901bef86a5f93f250753f65d29716648b8d15050641c9b8c6bb6dd78a4f537ecf15859c959aab4a66d52f5c955da036c4d954e2a8b7525f11216e3b242cb664eb530d3b112516eae63a54f7a96b8f1a0742794cdfb0912148fe4857d50662af18a3a0fb64669c79d78bf45f982baab75eb3cb6d32944fa7753c4154244620085bed840718c704a042b058bcea03bbb6d011936d29cb54989fc2a25a9a52b617be190285b5ae18062e90c835255d88be65451a744cbd689dcf78b390bd93ec834810629ec1859e54a3158bf2d3a0db782637a5a924d3535e0c46bb1f18718cf401b8ec79c6b35f31aa26eb1c7b347a8c1acf7f343873dc825e14042f30555c14f2fae83f4ba0234649ab2edba6812da14af6ef3e1006cdb2cdcad4e78fa5268822bf9d17d9b4b23a8a8d9d56dbefbe5fbc923cef35f5ec956250746fbccbb0fb99ed542af757d3b675b280b6a2e6f3707a8caf6e2ea702d4248e2cf03f2dc313606d559f2df1506211031f2283ce96798ccd90e48383d6161c6d4392a13526787e28e89f03eaefe56668c1c3070f6d25f83c2778bdf3320450d3037c6949a3d3fb05555202aa79e87ccab0c1b5114119c8c0bb53635ddc45caa9b2d71fd300cce0ebe3dfb199b5125c0f3243163cd9000443959cfd2b9d8292d899ca4b3a060a34c4db6f98206d0c0d219071b0f9ff80b2acfe7c14c43d63ae47007e76e67d36ff77852940a5677d97e612740eae7941dce33c1b2f90848f28dd2e1a273f2df74aec293630926c0e0348ff74b5c510ec89cf97a0d6f73aaf08846dc7e7adddf61c0b0fbdf04d4467582ea1982fa48c29c25a59339161266a542303ad3d9857db7dbc7fe70940b72f9e7f3e0902b5b59f8e6bc8fee936116916a139f3b168614d75e7c0dc02d18d0edd251fefb95e53f7f5eb2e2665dec35455e857c2cb85c4f40d741bc3636a8dae1e078c71d9092dd9ffc0d1d68ec204d21adfa541145748794c4bd8c4b57281b4680dccb7ec1d0cebb5d3fa34ea489c8b6c6e6b991347b4843b543f097f512fcbc41f29ea7a02b8d81e0cf06803d95228537df0f150bbd2bce07897b7496e5f993925e932091ff9464253fd9b61deef51d7f47d72541c68ca459d2af99c33dbc6cf0755b623de97de2a9167f58abd3cad01bb5a43a6d33f5572ac3ef5fe076afb8eadb59f4fa65947ddac779d08e0fee5d8bbcf8ecf461f066d8e1cd3fa52d3e07f00511416e00829638e75bc63ad00a064da247855dfcf8540290cbc157ddf1ca9e6703efef26c2ec51da979218e0987ae01a02bc2051979f36755d8d9ee565815485c4591454dfc0a435afdcceae042bd198ccf9d1fc38b8c2f414ecd0e003bc90f5b505741733b3ae7d26feb284e789a08308b6f979662156816477945a46ecf21b687d74ea6945ef157f807b21bd14bb8d488bfd45aa795fc1dea66fc0c982f68b51399d5adae7d4832c0a7ef0ff7da0fc0ee153ed70115d29e601b99fe62efcb9f1c253c51339fd6abee5347f18f4ef73be4f93dd4199cd2e1d0208643731931bec904ed5ac8cc8209ab94228b44b0578f92f4391b9632e42d63fe29a375b4845843bd4e90170d34961ef0e8a3bb071602218d9a7221dff0cc403cece50dc9abb6b2d8c9bac869d49870f101029f5b1eddb94dc8a262acde04916236d3e55f8e203dddc5a283e94b58c81fd67096b5566881bb2c7300a0961e7bf96e33a57e15dd0c55aa0eef947f1e4f01cdb5481ca6eaa25f2caca4c401612888fecef52e283748c8dfc7b47259322c1f4f985f98f6ad44c13117f51e0517c0974d6c7b78af7419bcce957b8bc1db8801c5e280312ef78d6aa47a9cb98b866aaec3d5e26392dda6bbde3fece8a0628b30955b55f03711a8e1eb9e409a7cf84f56c8d0d0f8b9ba184c778fae90dc0f5c3329cb86dcf743bbae704b8acbbeb39716c426ee3e0c5396f8014b6a8b5f2a2492e7fabbfd57d4ef5a994821533b0069771f9fe33d74ef4945e43cc7e20ffb0ad639b09b5c3f0e6b6cd05faf3ad926ed00410357fdd7d859bd892a6e9cd6ca378686b4ce009837586c7c56d988826f4d39931af4871f54ede856dd06c19bded32a35cffdf24898dde204f649461d21aeaa7bac5fe232ac2d4db41c385a4680054ab0c9d03839792357d207a77c92853bdc62804316fa2842740cb0ac6dbef8f56f5e6aeedc512251534d519a30c9e31956b15f462c5d0f54e5c4620905ed8ecc20a77900e57ada905cdd9bcb6ca98373a0ce11102b45ab8a2946f8f727ba8ab2e6f3c0ad5c9bea08fceaafe2371cac6f43235e4a1b99420dc7f83a20dd0d33ce48aa059e489c9ae0badc53869a0aa735c6160e9c04411d054744f2292eced249ce34117ab16432411e1c505f9b59bdeeb111e8adef2484993291e6bd23e5af4a00faaceaa0ddfa52b1106e1645f233c28d7bb526e32cbef10e46df82c23b12fa67629d961bee3a3cfa2174539dbd54d8e0bc3daee940153666cda52015b643818ad5ae252d7f392682b72cbdada26759353c48ee0848cf90bf8d0040243f8906f1bca540db794039cf3b5cfd7c8ab36c11629e8e482d3526a3eeb88af5bf2eb1257d4b8e2fc2979c6b13cdbb125b813afe980635b1d58f21995894a5931c78abad8268b830438678dea9479e78ff19eb83464a8b4c2925a82a335e3a0340b01c1131c465e6e455f5ae64924eb55cc3a629d2303a20113ee4dce7dcf04e111d2cdaf4263e5a8e4b3a65ab7574d15cc79376a581e7357624fd3adcd7707d7909018f3258ea9327b1708ae8b9b8d5e66cdbf427043c943e1d1ac97b1661985fbac6b85220129998cfbea68226c1c8e1fca62bc083e144537263132a636ca5aa79a1debe475e75caed4d40e18438b237bd1ba2d9c47e4d9b6b019f528439ae448eba88dd95752ea45345e06d9bc49bcff863e1d891bab8004f1cf55c426fba14413a3e17d100cc0d49cd0f8e330e8c91f4a57027b03d8c6968db9eae65b6d202da4988d4c5a658ef160d53ac13bd8c65fb0ad82ce9b0d1bdfc6721b2b5b8fdf6a00eef7c3710d931032e372f047aa43353baa05106bb90e654e806cffa1a43d8dcb2fa77f0e657bb5858407fceeddbe345dc50fdcd05d0cbb885d66cfb87ac90d75c322eb8cfdb755db2f80439bd395d19997097083799546f6618f381a54107d6351d0756736b475965e6260d93c689171889897df8f369c3b454cb541c09232465456b947b12199698924e11168b508782223af5f1e7f2fa97125c3c950ccd081332c3388fd5d35a7485e20eef8f98b0fec41237ca7cd75d36db0e01b853eec9686a750b56be5dee21464cccc5da4bdbb5f6790d2abb0034ba36496a2ce56cb08b77ebd579d49f9ac65df21341754f50ce40d73db9aa56c74aac75409acb3105a4e18b5e9f1f81a58c533eab0b678e57722a94902054bf5d0fc4fa4ba90b2310dd2ebf6d71a8ec599aaf965bcab8ee38c93d18ce07be24403106405302af2c185ce8eecc9776c6fc19f964ec2671593afa00ccbf15f26eb6d7fab0204cbe336749967f41b891f9d730ba0f27c999b6a62efc162af3f783082929b07930411f43cdc1dc957c026b320878ffd15838edc48cb75fd949d54d7e501aa928563fdaf510f06c908dd00655c8be9cb57e57e5dc3dbb1092be94b35f745504f365c04bc439ab97f99003b08799114e9ae1fc883668908f1efa3d9cf5bc6327a306cd5afa707bc59a30a45311a3fb7d472932bd1a36bc4645a6d8f28651cb7c00e06cefdedfe65e3913bad63b0d039185fffe6ccfcfc99bce6a6b9c5b5b1569d19ca8f2b7ab76ca9fe14d214d00b2f21c0b6a7d9e5a3ff883ed0082bc01ca58e0e1864bceffb3729443661c8fa38e08d4f47dd9cfffa4c42ad89e8cf06b71b0f35810e36b0124bcdfe00baf491f213c75623f66aae882678cd24ea241c292d9d3a84da0d5d951114a6247c2c29bf3f4c6ffb90d763a6049718417acf52eb53b487a456b56b0c2da9b6e1f3d43408a999070f2b77d20c7d2a195019255d6633e1976012d34ae007d9baf9d08143570949b60f24a05c03e6ae3ae143ca9e3234a104388ccb8fa926412cac80b7da32d4baf75c2b057424d7900775992397c7ec7f38ae2322abd00f5c86aa82fc6b24728945769cfbbcf7c67c197d77d4ccafb1d8bf21845d21ed39a8435465a3689489211afef91788f549cebb796e32cf522b4a02431eff74692ba10d3a9751651b8f1f0255ddcd8a95c80497e9fae1f247bf4fac73516e35cc5bc32edd969ae311dacf760ba9a21451c7ba295f9c46e7f8f4660842da4dc89f40ab32bdf1c4652012def090eb29c8d1df6bda3ac0f612fe5109b0320802bf5a80b5a34c27826dcebdb9fc7620c91a7e6576351c1753f5c05bb74eb169218c76827f1b18a6496f6641ed143bd9048bb00085c473fe0522d78b0b0e517c2ea28bdc63e4940c7ddc8f35e4b25272608f2f16f702c2e37e0cbc5561a982cf8eb3f2e500ba5eb8b447b2003d614a8b61b7343f667a99762325e741479ad5c1c6135432d1e6c9397133773753ab84928c7677d0408658148900d0e5494cbb016953184c63f4740d39223751d3fba116455f628001c09f4d341001a7d349b2ececf5c7a8138defb270868ad61adc209520d47cb546b3cf8ea8f6020f721c4e02d57ddacc7d0d8cb7bbf2da3aa4b7737db3683ee67bda79675c055a82923efce1974dda201cedeb9b7fd9be061e282a5e519d11aa1daf1d55d1d063b7d02c4ff7b6f84e595fb97ccc30bdaebec3a8a5b59ff5ad56a8ac3be88ee9c605a85ea7b3c90f9fced1fac0c8731114cb51b385f202e46aa2a94c557df7b3ea028760a4a421f656f6f02c481ecb6698c224d34bb20efbc1e49c19eaa4a0b1582509bcb757764efc7856b8834d8e409329d9725774389e4bb2fd9f7bfb2e8498e38bcd602c2a7c08b96239f2c340119c68dc3b4997046e70845a4779cfd58014c49a3d2fc0a2fff4309f3b371e956c3d15a97882b8f6ced8df1e9c74b15a46545eb1768683945d57848a1690cde2b2dda6bdc4a3487441dd39c728ed4e0149e0087df405036316ab0baf56b04fac87f692a59a1bd4216a061af05753d48efd40583c401bbe93be576c7b961612774e206fed836cda72a9ebf906b2490347f2edd498e54b23aab6f4fd7b3f22c4c787e3a4f1fb06c9ec73e76a96c42d58b0ad50f3f05e03c11c82fc552acc76c501c7a8c86f8b8a20f36a80d61cf771237d9f123cff04e6156db4e5fa16d88291da8fe850929f678e2c0050c1f5e6d511f34a9a260194529f12cf3a62abbdc6b9a6434ab417a11f5ffab7dfc4ddfc9992b62251359466e9dca03472056616b3baf98428996b5b2224f3f3764521b36f343ad8efe244071c4caa872578d25dea0448b50a471a08005b8c65ccc96da5a654f5b0ceb28cff5a7d7629bd338d1dda341868786380524a9238613bc81e3ddfa37b5c663cdbaa24cda7bea1abd2b0f4b8ed10eb655aa451379c885bd7b0068b7e303e5ed7bcb21bdbc3988b686fc1da014b40ebc2e578c4da0d4d956ecf7a3a63c8d90129ac81a0263e59d2ff90baeaab977af212dd6a05e82f238103c9135ce289af059927a3421b9c6500b80226b726661186cb8ee2b4e066aca72d396c73790742d4acca91824a526cad48207fcff04bb72253966d2251383b60419ce00ea5d616e6dae1d6e120e4b33116783085979cde4d417073fec9387254e770189ee75aadb4ba19dddf4de7eb24b965e3789afdf9702ba991aab6dbc3ed953f6094bc2979d6b0ef30dd1fc076f09796033968c39b3368ae40a68896b2a2c1676290a2b6fdc555be5a7b1502e93d37751a188fa235ff9efafb82dcfdb10cf29499132977cbf92f23c539dc23b4631f8f82c68e0e4c3d251c4cc012756194bf237e8cbf0046fa939bfb89b3a75afac641e7a3d25c5084918e9eded79226d27db08d6de1d5014229a387fb6a026f7cb248b330fb30e56e6ace7c3f7ad8833eb4b83057106a8d5867b6d4ff3dc9445179e0700e67107d4327585f72aabd09420aa711a8f9353da5c4628d15cd607c2173b5a89cb47f7abb4dc8d318b5b42b74d5f9ac03dac9b4c2c622fadf877c99653634b75c51d2802f447c51824a526c5fad4c69d8539c6537f374a8acfa521e8537fa46cdddbe0027b1ff755fc72c3e5af70bd596e221d16db2d4310ea4956e0a0f52b181a6a68d3d0cde9901ba86240f59b469d004fe8becbace1e8504cb1a8c12fa91e84b0089c7cb764708a314bfd53bd2b1144a86f72d41cebba09947a653e93e5292396078605472f9d50f3c645523e325c4116f95b80e52a2d1e0bf942a08ba9df0004afb8f5e414c075d81b4078872426007fd0a0566f66ea969875656d7ebbe822e3465ad3f5d98102c7911550fec81987cd3a6bde236699792238f630d4e4ed9119159628e44787fea771ed5f0ce8dbe0e680e1a167f4e1d093881e6ef4ec96569064927b18267b716203ef2f194a1413b4ea2c26a4d66aa2d2ae04b1489b8a782e7b7654f93e0463df8f44478eb76d261dbf74f543d5ddf7c7f2d28037b972ffdda16b3bef56cbdd065d132fd1f78d230b49e097aab9e2d75a9bad64290df5f4841f99b9623877e6bfb585704cd21e1165ce9993434a204b73f3bfe48660bc5e0b3d2755baaab187f2dec2916610c5f91397c7717550405afa403088b77a6e4559433d985f7521c78721f11a86782ce2fcec90baa792e90dd7cb28d82223b4b158790509ba616eae66c63a9316d4fbd40a141ff543d9c46bf2dcce5d302336abef27a430313541447815c6857deadad824599aaab0ed797c33ba4a9e49419b3a069445952dbb4192a355bd7823826ff432012a625696af4883afc523d6468c6786090ec117b9179fd0d047f2706665321d55f6a39d9c0ed8c80167753dfbb03955ce273b55f86a73e8cc8a7dcc5d629acb9d27f8edc64033ecf9571be825b0b85c2bb98b5140e317d192b1a09f2e0e332521e4e6aeddea61d5dfbe9d3d8f33ec8368ec3a71582a92756ae2e451a21305132856f748aab76b6dfbc384a600e2deb3cce7cf1f0ae6ecba9b45cf4a8116187efca4b223f24c589a948f578a3f6595d2a0d3d2c21cbf2e8a6f04ebf293c2754ce3f79fa780543046f4499e51156319c92cd7cbc1575f5fcc2c44c0b29fbc23672677473d1b75fb58611ae2624a847381b81c4386836b87681b30d4f06faf2ab50d4b314b8a57c2b8242aa927a671aae18ccac278688eae4584edb215c9419320df9ce53b96a38d4e85a07e07f1d2c6d0f008ceffcd6edd4dafa6df8a761a658fe691ec7307016202cba4e66af24ed0382bfef1837cb31c67e381e4b63ee3a8e96853cd5da5184bbc40606bb8728ecf0086d5b26c3b06717b6aa64a00e8446418ae09105f37914f642af9945a393acb1049b59923d30fe6728a3e99d23ee4a20300dc3ee3871376e2d29ae9b60ff9cc50bcc52f0e0c7582328c715793066c6a92a5f4de505b47c91e8069f335bc73dba8262efb96ade04da4b8660eaa0983c2ade778780e7cd54f007c8e393f0751ff00d117862380fa50b0554645810fd2b43c0c919585b26411710d32443db93b414003a9561e4b68923fad38857fe00147275d66bc1dc49c15577c7d9a959ad8a750050cf5edd7d51b370665550c43b783562220753e7c27659c1296c5b172d13c181f67ebfaece7f482a9f53d90019c71b2a3e64850a0aa092614a64df709cd058098e2beac51462406de0fc573e259182127e1bebbf9d007dfcdd4b8d127750c71baa7f86ad09bb3adecdb761eae96818cf8385ee74f3e69ad844990a6937158d1cbdb209e2f8eaa5d1d82d7f72dfab2dc5c14b03c6a9f377a802c5cde1668f18a14a9bfaf37c61000b72c7167272eb5f79c9d3d231199772d0aa6a5e17803e082dd375c05b0eced7d0300cad763da92c700fa8c020ed433ae6adff21681e92ca36ead7f0862a74abc49276cadaaa54f33cf54264227f972e5e8fecbe7f8c2ddd30e34b12015a02ea5d1c9df53c437f62253d2914c25b03dbacc2cb8bba738fcfc06f478b5907fa120e20ca92f79398e7ed29d5787cfa09b155d9042fb54f18f059f145f2f9cebab15c51b54ab9153202e95dcff5aef7294dee453f00dc895a1d61ebcebf6018c556cc31c682dd32cb31ae4b8122f4bce30fda99c4b5acbcd3757ce16a672870ba60d22386b1f086d4f2a0759176dad5a785af494da4a25415b70f647170bf510a7e02a96e7e8f8bdfc4645e6967bdbc173dd0d6225469d981409dd7ac62a15425ece255f63f06bc5c356e78818c39da9296f3b30b4b4fc7a6b0accd53c35ad4ad5bd59ba689f292dab42356624acbdbba3f6c82310fd0a91665b0b80009686cf14960fd07d5df99cbdf277a9429e019ee85bfa65c08a8f8210e4e2a49ab3687a21428fc82a92a5ba004ef578fa0133fa00871a1e4cc253f86e8e996993f61bf306a821cbf7a6f3307c3ff7fcd53e1979f4616f753d0c1d998a3f77f672c666e1cbaf0d016d01aca639abc45c5abb7cc1cbd0439319d2b70d6be0c574bf8a12ed76419a91130b98c3407ca5c112e1237a8dbedca06b7be7fd195acc0a03ace7be114512a4712d7e309898e2538318d84d431283c3b86f76119d93d1e1c493adfda3a2bb6110cd279549e9c33937c961e1f4b480248a152cf0fe751f208da72c513542def177555c985c558f9cb65a87e0a88b1bec68d7d04344e7fdf0e3502c63ce0cc27b2e2be3e4d8c690a3863512ef67819c43db1c2cb177d0b27950f674da76e8b128beb9841fc5230c7731c0cab83a7d4a506a4d06e3a01a87e25b01cd5f35bef120ae6509f22b544c3f3f6577e328686f3c9dd02780c7acc4548dd9ff9a1476cb8a8699380413409824368be0183a28512efc0e5731f26eb1f66ce6d2321af9878ecfbcdbfe84d1384ea099cefe77a6384f106f5d9e2b4895f182910ed0502d6d561036b88787ee73e404f9093de7ca6ec7605c036e7922ba6c57407a1bbcfbc507d16e9848237f920feb12597e927d3abd743b0f4ae5e46690715cdfbc684bd6cc9bce42e8606dddf6dc4c866981a5e359d5754ad97576e2855a4e055a5c06e9cbf4bd8010469e9cc25f0f57a5bb2bb2c50a737cc433c076729a7db49e9f12462c67a31868defb179afcc395db48f8ef269b9c6db227ab697fb750b42f3859351879e9d3972f6c96a73cd008b231f3e2a71157e44c581d05d63b31ccb732c2feb7b4f5794641da6010a69f78d37d03d26df30eab3aceff909cae87c6db9234e8309f30d21c1d2bbefec396ade5341209a3c9288823913a53fc96b9684562993cacc202a5c2ca49f899191e6e915f07cd6f1c0d44afaab4961c7d317b9daad84352a6d4bcdf501a560832a0857f04c967f97224a7872057a124ea56c68a70d9424bd20cdd1cb8881f749682b8562e421f6a56d77853fb0abb3d669013b5be8484bece14d121097a9d04cb2ed0bee2593cea4d8d81ba43b42d8f784728c69bc150d4235260954bd716e15b0a95612af608a0e1af8865013f4041a8e3ce641078edb4583051218789d332ce80cee40d01c9b599a356fc3d92397b7ecccd372391a488f5146e6cc4771c20aaf645f29463c851fdd2b326fd956367836bede8def4bd7583687d1f0a8939d379d6c031c5024d9a96a4668b4b30052a3e26f61f498980a5899347e161a77172c2870849aac79fbbeb8239d42e4b66ef3766af836b3934408ffd945bd2b90d260e71e5e34b9a08da85d2f2a9afcecfdcf794e1bd4cea236d1d0e2c3464a75516e4fc1ea7ae64ce20eafd5ab1d4a1881905165475f4859355bc2ed6152059916bcc907d3cdd0b3ab4a46c3995a7add9cfe956d0526cf3cd20f3c55ca60cb8094c4e95c84be07994be3b8657fd30d80a262cba1dfcbb1a19f54b3b848e33aa05e2f373c87bbd94246835b27b8f760b624555ac021ce9e4befc4bf817769a18cc54429245757e4631d81c5a6ff6812f2a55ec93495aff38065f7b64dc054beba7cbc45b07e02b76053677e5f9d8592aab7d7ad7b85d04fd374363e89de44d09de6fff34d565ca0ce6abcfbbe2de07e62ae686df18ce001d9ad28cea20baa85cb9677d8678ac65ef1d5fab44f1af9249f2b798153054fb7f77347dd42e3064cb7fdcc6bab95c0309f27993e7f0f4023d4a1938e0ca98fe0b1691be0c8fee8a3d7af560365e1dad41ac210f0fa5545fa97934efa8ac4110a9be10d8fc0b9b229cf0dbd5642f996a7f9581a821da78b274c82f44d69ff83a41b9d9520a6adf32cf2ab5adabf67542abf3bee586550703887f33c0d06b6583bb4d15b4a07364c4be70ac6e72795c3dae0f034fa6dfaa58cce667e9ffd82ff3ffc3ec8725efcfdf510ae8a22381f4646e31766ce93f09bb2844f44acbaeff92f663855101a7cb8c703f90d025d6e5bed4a13fc7b83fcb3384e301689db47c698674099d9b60fed20358cd81e040d853c8a687e579a598c8c809b7cddbb34f7f98409ff05de510b9f29dc63cbc87752c33897650963a1a83ddff3e00ef741fdc150d70d4aefdaa492556a48921726350fb93338f75c6f66ba90dbd893fbc9589e324a4d0f66f748b84cb8ef077cb4bc70a09e72a8011d789157a5cf13556598deccd626d9e041586f844adfa2658d49a4636b9a91de263e3099045be370912f0164fd2310c8436426708282e96e2a7d09961d295b60242846e959d7baf9c68bb4bf41da6a9b77ec8bb6028152f306b71ead15976b23a1d712ad28fad04d805f572026b54dd64961fda94d5355a0cc98620cf77d279509cb3278f40de9e858ea673c2e3c21155254faeec56197d3c691625a35433730c66534b14db95e56baed6367cae78ab50d4611dafd4460289f229e09517200838245980a8865b41510b8ea278f3fe151e4b5c112776464fbb0dc739ede922a09a7dcbad9469b71a004dd5a1fddbddb5873148719a659fce9a61f918f2f1c0a3fc1ab3ba21ae31d8411db41b548e9cf5522e2e2551c8dce5ed97c665ed58827924a2188e947a51e3da2332f6c633c33c49ec151494c882fe7e5637082645f08adabe031338f8a0a39306571b99f3daf132100528ab8d1b80134753eae5e1933ee8167b30544da581366e2b7215f56a7ed6450648dd3e2fd3751122f17253f2fe155188cd2fa4e8e38905b7e38462fa4afd31215c7304445f6c5dac0614c49530281832d31223f232567002572c6113bd6e7c5d4db506e48bc0d3fa12155c053eea12822845f24ad7635a14b4571b3c3ff3cfc301eb6d96c1381a13fbbb42c98e23e87fb5103a78387869f6e44bb7fd3852d259615d60e3699ddbffab4f9f698a9a413262bb2305bf5f45afcd505ede10542c2955530851e9b7bdc708189a6e9819c6a1188dd478d3df974759b038682fc1853bc6148c6aaa4e6972fc605c5f22661fd6bdcf7659dbbf07c76fb16c22fe6187959ae915b6142a86086e6d0dc48f4af3d93aca303141c83c36f69d2395e3fcd841bb1acbbc9012bd924589d326478deab078c32b876cc2df9cd8ba8447475920470fefd50484d0b6166bfad90bb2f7ad655e058ee3c4759702fc51b8c2934108ad80af5c16592a189fc70845fe3850e400d3d782cdb1a80d6f4aa9e68e2d7c377df5a4877b78e98c3241fd4084415f3787c1802fce9b25e9ebaa0c37317fd257bf55147fba47d5b9d9c11ff12735ed4c040f49bc6deab2d27e04c0d335ef0b0d798a486b5b30b5489b2fb8816e7cc2ce7ea57a523306187031400ee122e7ee03b57b8874e69a52e081730e17e17ea663fe6b5b18a7581e6c0b463e897ece44e17a101cc2e4ed752a917669dc09a361b38b49333751468e6e14fe98f5d30cd54ed1314b7cdd90e4cdd51e13f86d54ba672d274cd6b9392f1d5551644aa80969f3c0c65ecb57ed68725554539296f77b27ecedec1e689ac822d525e9b3862cc87852b79dd6dc6bc8c1180170d20af66a9ad1835c37e5cf22249d647056f4dfb9848cec50c6f372ce61260bb3e153b75069e3d1e448b84205ccb3f4415b7a8a06bf784ebfc2256a40fb875c64e7f9a4f43c2bbfcb796a5938c221bfa4eba09375d31dc332f3f8bbe73644dacb0b822320b9af365bf4827e85adefabe12eef63cf658334f080f6ce8bbb636f2f76789e9a8b791cdade8818b23623a23f4bee62db20b38a4292a709f431ef02da50627c2b58915b9162048f8804c78b076a26f863a9b4ab705192d5e941ed7a12c0c9259bc9fdd9c8a57f4acfc0e24d82b51d8e2dab8e81c2e43f9b339367c120ee3401b285c780c7d281b34f117dd2f5525d8a03cc4af37f7436c19ace64be4c032b783835f736d50f9031cfa09f01ab696e56abb4efe8f12800b1e69bed59dd2736f2f48093e53b84362c191450c2eb23d658ed0c854a5e2924d1dfa1097a1d81ded7af0fa574425bfa0cf31698fdfca71ffa937c15000f9e2a8b4d89c009523aaa8f318934cb2fb9643a264e809a271ed0a363aba5f24cb09b46f7fa1aeec5792382429749d24dc8fd1c7a630f82b4b072ba274240085d87fd69a69d2011be67cf18aae1eb71e3b04c1bb6fe4e9beb848ca9a5e8eb2a894adb5e221ad95b842c38ba300e22903899daa0a4c643ce13c3a6d7a646b0401922ba8c33184eb261efe6ce9ec6f61795aa2d110a64f804769449acf10496325536245ba13f85009bd860bebab370ee420bcfd7b17f75235a20fb9050c9a5e885afa0333338882b7b112ef04d7b97fd87e5485b61c0c014088f47eb893de64af1b4b77cb2ab5f1c49bfd8ce1ec6742dac601e04e1cee3c0c808b22565096041e16eef9ee73f10bc4d0de6bef73d0d64f8a3db39fb53e60ee2b3c6a6acd51cb39c04d301979da5f2cf21e12a9e876c8bb4d7066475f4cfe59db90ad72648208a6b9fe80e8d6d25a516235179dc4d998b292328ec185ba82f4242061e9a0b76ac9667b82b905699bf6b3cbc1379379a4a9cb0c839ac3079d3197543e4d2c626036583cac1670008271693ac603dec79b258a56eb3f91a48b96a7b4892942036751f1ca639db147ac55f52a8c8f0153eaaa42ba3c2c6c21fc97d7c9d8ea9c1b0ec0e59d5f9b43af8818d9e39b35959ef19c76aedceddd005eb999fcb42d9529b4f7863de6bba198843eaa2e589416196e90a89d73f04eb0307080c5914eb7b0086a66149f6b45a35f3bc8337b270d53a01b5b1e67d04bb1f0510eccf6ea9e3e678e07c9f016ca404794c6cb496ae5ce4491009a4f0a5e963cdfa67b6b7d933550f6edc66f6a8a0ffbde283e69dc39e9ba962ba9800ae1dd7470ea495574412563297a8293c31f62da8c6f0543076446709f5eb4a16e9fe825c93ccf4b6b229efc9a4096d3bcf4d96203fdc86b590f650510fc543981c356cf2d3065b3ceb202abddd26bc5b494d430e966f0596da5b5f69f9700af0106a9df2147b5351b69e0ff48a289d04699f3b5b14d05839191c9b39fb1327848d441e459f52635ddc4ba557f336999ef5eb86edfe28070818e00daa5cd623be5b6bf6d1bcb414c826d0f4ce60793791b6d82dae9f9e9b699e50bba266e2850541882d80b2c9edfa59d504421818ff45740f37853e5b9bc67214af0a5f5fd5c00843cc39cbb8765b4001de99643c7923f738ac5922868f865dd3f1cb90759c597843d9e34daa3754a2fd89bd8c0d2e9106fa95149448ff11273587cb414a603759315f6881c6b94b46700d94d8b2a5f86bfdf99ddcc974cf98e47bf4ba09acc273b463afaf3583a9f50373088f5466c1eceae0dc423076287785d52d42d805628e75efa01f1e1dd7775ec200fb1afa52526952b90ea68b848ec39b5d22dff57f711b0a2318aa103b94280263622de8156421581c87523d4ba343d76ea3480381e54fbd20e401e33f140a3b1b0db4b870ecbbf9edf65d13e57fb090470b38b8d0b2b90f7fc94a1e4abeab760f44d8f3cdb0de3e14a3ee95baeab0cfd0a2d99ad4a000082810ae4ac35bb4bb274fc120937a332d79d62e4c32aceb9bf1b25333f676cdb0040054ee14b3cc104b7596c72a1062d105d744bfb68c0bfc9281ce0b9cfec710f9e36492a48e9c7f63ff8070fa3a122f9eed5977ac53b5fa9b5871a830fe972ff0ff08bedbb4cb0f5735a6a46bc2eb512d6295fa7ec9939ef47f6494183fe415d29e66fb21ed02c80f5f31eae56f973e9b7c1fd292b64def863ed057be8957cb8506a6d0de00e9b374c548cbd008bbfece84208652e28bf537dddd7788a49858f37ff1c67ab627d76caf14ce9456029ab0c1bf9f2515f4b9f0a3b27ee0574ec402536f645dd7653de064bc7b99211119287d25a4721630429ada78f42d6b21189cc84732f02b4aebb92d695a473093831dfe791da3aee8991bc8565fd6a9bb5ba828a2b899797febdd5243f4074d2ee0798ee4931fa5c4c45db5754945d6c1950eb9a77fc18bab45361b71d03f3e8a3923738e8d4ec36bcd46ebfc39e1bddeceb6c47f0ed12777ffabcf1c7659cc509503f59e9398cf86bbc0b114b81225b80f889051ed2f168b2323b86b6fbbbf28fd015e3d2d6593bc97b24ee54d40d5f75f6c6746a5451f8eb8881c8742cfdfb97805f492e41dd5b668030b9680d39644c74a8f86bd7a0c29c7c1449777fbf4ac0ef701c63f285e1b369d3050d93330474e0a5138bd35a40357b678c497a9c5a8c7bfcb00c7eef6940a67053ae1c96ba7fc94f5842de0aec5704f003629401b56ac459b6902d864c9eb49d17d1ffb0f0cd9d0c39396e2f3161a742314b528be5ec472b8297a4c7261e12bde401b32e320eea6038d80a33b9f5e0d2a86c3c87667182c6c67b7b3e605f4f572ac5ed7b08842fffc9a718b4d0743025db6dc8a0b19ae5cfd4b3f76895c2d8fd6e96f503eefddc1f7e0f302f3f7d23b04c987d5441e90ebb4fe9cfb230f93e2521ed60755fbc8d63c8a8d70f31712a067ea4d12ea1bc6bfd9a856ac7cc52ed42d731c62bd540a2413bec83d160e0b1ace3fb5a7c5bb56c2b470f3f05b27074eb111c8cb3da3ab95c4a42ad12485c58f80f047fd9da34ada8c7ffd2e8adc2539242062a99f90b41096663d94e52349e9c6268b7c3a7ea9f1abfdfcd0cf8d917bcfc77364a9c22c7cd32989ef21919e0ee8090a8c64f27cee5711763df3e251fefa2f826424e21bc3c11895489f76cce82ec04b96e2a7cab9d9e3f5ddbe826fa8ed801710d7978acca858e908287bdc5ddf74d6007d479b3a799c0018f716f263efe1bad28c8a7f7fd2140d988448d557454c3434fd77f8597e6420566845e316497af411096305c486728a5e7b84bfbda671ec982ae1e7fe3262dbffd7b849a944744c3617c921830b9ae6c4d4d7a2774b0a8696cb2d7311dbbfbc7b0d172c0326f74ba77e64dda4aab5ac3159eb876c7c408b95aa03a17ac2a24832d209950e372a77cd06dd400fabeb610dd0657586813b82fd8d097b212f34098ded368ab1c1365b1077dc52ad56638fbf02f075aca122f3353dea08ee699d86f2284716d40a437cd998081c64f2 +0x4a4765fe4c9b6e121007c34b373bc4fdc7720cf3a4631feba046dd2d69962da52750ecb74afc8a5833182536da727bf2 +95272 +0x822bc911fe579dca7450e1b3d9084cfaafc2a59720d57a2f4dac1539e412ac5ff0acd827f6c748d23d55b7856d311ba65cab20892440d44c79a9a4ff3918870845be79c690902b75754bf9524eb51cff422621285e489967e71b1365ef3c474327669438f439ad7bc53a8f63a31cb6cc0a3e90bef7743249420a4ab32e0654d63fae11c34b4a35abd42b600095ec50d75bf85591164c05ba307f30311dff1789349dd8b0bd4c2dce4b2556704caf54e6de5e58e9e4597b825980af27e5aef626ae3bd24771c6fcacd13158fdefec29c23a7782108922fd686718aedcad9b5a735791e5cf90400a0d0f564feda62c3733184bb94d2c30f135ff4c16999e4fac3ad4a6fa924142bfb9ac9c21899bf6e60120e3e6e7f509c0b1cb26cda6e0515241d083fad6ad558377510bb719f3d29ef3f946f2270d37d3a473adbc4b9a29b651f12ecbe4fb00be11a6acf9e5d948c7d24c7cc3559c4291d69fe9cbd0f5603e31dfb1570454ccd84d5286cf3473e1c966c08e43b9c9b0610ff6e3e37c187d54ab4314847de04039f4fea12250e9240c77fe83589abd0bad1620a2ea982b085f85c55d3c99c6e449ce5106d87f649af9cdad63ec42a0dadcb4c62eca6c588ac7880c96669e2f4071a2f4bcdb0a0cc9f62f7637e6f799a656b190906940c58af37cc1c6ead542dd173a8ecb1139083b6c6701062e02d0f682d525cfb15c9a904d298bf6b0862842a55cc83c64538178c43bf5d8acab6e52cae72ef3880700243c56132d9ff908f781d14a16bba29e066474fbb548399b4295b15205d88b1fcf28cd0173a1750b851560bb61fd6c886fb6dabaa6eaf67e4f4cf93a0c882e1e187954fcd09d445973c7d3c42614fa663b2034dbb27a28400055888d108039258898b4ac4d7cac194901f10c6ce79461f00c4c05e2e01808de1926f41aa8f45ea5ebb5baf124f674902a813c3b5e81a118e1e8e13d040eff70009a1730e8a6effadb1ecec57e6991cfa94cfb9b610b4d3a07d116cbce514d3e73ae9d5d2898000cd1b98fcf724f998ee81af295d8788ddfe6cf4d94272b19d0d8282fa65013ba65334ca619e9eeb3554eb2c830ab118b8ee6a92ea1f5e28baf98d17415485d448c6aa0baabc99008ad43de2675c31e6ccf6f2960f922bfcd621c7115b1f8bec709df7d748bfc7bbf1d2f64b46a06e75b2ae9158ca4940a0471cbd0b98248806b65f9aa7cc368f7012e7b0d19195db37e28bc3659ab350b5b650cb5099121ea57271ff1795bf74ef6668da1fe8ab0ccfd5050547015eb0af8c449eaace56943b4d7bb18145990c6c550cee80ac4e878012b0d3778eaa04e0319e9354b860ad4a9fd34e8f4c71aa99771a6aae6cfeb00b23f5ca61a323b20a5e9545f8e7deae55f22f229c1ac7f3d93537eae39b3a3ac3717a36afef6a4c805bef1301cd1f3bdfecd5da32511a6cbe27dbcbdac78f7c3b9384b4bcb3ec38e4d1f2a6f9e8a0ba6ad87dd1dc6fd779aab77ca9fe727ce8f5f2cbd112a1080b9a29566e6bbb11ce694d7da614c78daf417ca0e1c91c81256527a6084c276c3932ea70e5b1c4d0dc6dc45bc35608bb71f4efdf2fb5261aa61b9aa9b6c3c77746219dd88976966c68ead59eb62aa3cf6647798dc06d4fc7ef8bd44d8903f1b7b6f8bbf3d6249052f862e9ccfb0d1957f0bba233603bca0766286d17eb9746bc002abd69583643030f68895d0e67e9e3a5c402767bbb5567ae93bd9f5af826e2b63a1a9f9c463f2b125e2cd57ce585e109f312cd7f6652572d304e2a43a132da5d996c0cfebee509a5c65caca2e08dde71bb5b8ee7c741546690a76f522ccae14adb2a480c1ac54d3e3391693cf3523a919f25514148b2edef3751c4f2e57fb62281cdc750e460544028539187988393ce1138ab188527922b96d5d1a285c1c758ffdf0159a636bd60171b9c3f3a8268abb3edf2d9e70fdfb0219bfbfd68217372d7c69c72cac8f6f272720fb073ff279ef9cddf01f8ec24f18a1cca40072f68e49c2cef58ec978f8bdccf5277bf2a6f3c4540b62d253d108412e0c3270d4c1642af6a70686612e5a0b8bc1b1186b48df838ef2ec8168310cc6e806d1ed4f7ea019417d62dd1cba7b598a0b00a652e324757418f4f274ea45eff642ea3e8b372a5ecbd6715ba42345eff15b7ced4e7cacdf2b07e4ee200599038048e32c31f3ea41bb3d9ac79e719f14e9398db4081d5e0cde47223d1489f24cb0a1267fe9bbc80a393748eab5ad70129a2e9bc528cd2243b35e18a7f77e3710acd419ff5a96ac006f4ee08d8fdea22f2bc10ee65595e0cbd2d62cf471ed50989c6926732d8c7e6c8309cb76d40c1cb4c47b4ee0377b80ed6437c8eb2cdd242ca9e8b4a509a526969df0716e2d3fc6e98fe3c37b778aebf191075356cd569d13fbda2a5b97ea8cc6e68c3a3c42808815b181d67ebdc7071f80d035fbff60a297b9c7f25e7f62984485648faabad64a8155ddedb3b03cbdbe5a19d5a268041cfe0b35737668153357a301d67e3d4af476a18072e0f9f0f618466b9d15b049f1911aae156afa0c434968e9798175e36e3abdf1cbce40eb98736d4df41b80380a980eb94004de4eb160fba6de7b07a9a015d2b862452c368c18f747427b80d74f5b0fdf5c0abce366e585c06f349ea47351085e9d0d65d8bb4f0be1f0fe5730a82143a6d1453bd4491f2dbd9273e0ddcd35866ae6ed94d90c60d1a4646cad4bfe34d599087d042841581c27b102755b98087564a4ae614266927217078d2c2e37daeb3d677abfe738d6798533a70626ba13fcd43e18731ab32e16c341287ae33d5cae1c5703131a15e36d60802b3b471d9e44431ef37369da7ce42e7b073f72f60245bd41e2a8c8c0c5203f0055bbc5a7f07539ab070837c3c405e21bf024e14c13d8a88bdd27f920c4b9aa1bef2fa84253b63c4d1cdb8d564ea1678bacd03a26d991669fbd38b51f2a612939bf3ef9d50d2fd66cf993727b61df433103ed856b9a967ee3498205a43d3f45c28f91bf4767098e7067d9ef1a47e70077bc20c8059f0f78c14baef098477c851e25cf0282a96cecc22e550b1b46e225c4a1130ddb3025dda089637fe18e3f72b549a1ca6d1b7f79c816aece66a7f83b7f786e5bd594ff33e7cd4ab9685bb192efc5af20f0056bbcebe78d40e3b250c9120ad8bbdb15c70500dd0ba615f5f9703560a00bf3ae573e9368996a7bae1357e41ffa33d5f9a2d852814d4ed1a64191ede11d945e5f6c8529627b5314e5686e5d7f7cceab89ba364583b8ba82b4ae7f8111cdc21960d21b139dda03979d7895e5f10591460d37a641aaf5f111686ac157b8599d0df9b088bbe15f83ed1f6a54e43e3d868ccd41b1aebdacfb670a9ddfd99e682d20722e5287f6b2dafcb36733c22eceb46610feddf48584e16ae26e616d8aa37b3b127603e1a37a10aea097bbe7895d23bc2099b57bca26aa043706d07d45b18e4722ad2230b15f2eea302173bc1795dc774338beac533a5e1c538db470983c6e2aeafe38dce90b3b97a92ee3a7a01be67dc20482edea67069a7c2a93ae48e924ceb28fcc4d10233f9f54e59411eb9a49b8e52488a75555a865fb05f79f2062b719c28866eaf15243e9796f0d63c1b80e0ff3c058435dad4f67184767abe74f2ff561128f1d533e4d5d60f3d603ea1d3c6936027b27ca1700871a186c3a64579549d955cd4efd8f68e3509a785b2e72dbb0f41078bd643ac5ad4b9f8db46023f0fd7078abe3b8ee9963938c7ad1555ff4cb7612d76cf3bfa5c1f1055281a35b48f86fa3ae454c03eac56ff064cf268b8da20431219b3e4da9ac55714309f5a6a5241e0060dc817562f12deebfbc6a9fb11de594ddb40e8dd754bf0ce9b41eac1068c4b448101fec09d014b01200e94265246365931e2b2739a276fecbebe51690acaaeaee4aed12e8486e5be5036b1db39fc4c9cb415dc2d77ec46e7114148c2ed819c8dbf0b48c0642811ac12cb8d8a27651ea0e856c06b7d1ef84649971b5f1d55776966c3c056ca797132ce5971a3a9152f0e3521f9de381406a2be0c53ae189ac1da7244d23205df66eb096d28b84d80f03d3103f2c6378ff454e53d7c206dd62e59782af8e2c4ee654d5a52fd48734cf496527945e3d9c7440565871f669b9c0f5edec29ef9760b1ed227b779d4c8bdced21ffe6d87bd7e780ca59597e11060d7631cc85ee6a7d9e601f80718dd9c77c158f00fd4525109f3032bd580106aa928fec898932ac8cf4d6541ce74d38cef8ea3893a14b412fe57617ec3628518f9769a58bfe646575fc764ab89f85718a9893a31e9992d91b017aff4ebb9af99b632be43aab2b9e20fe6988ba63dc8ae1a338580baec3f4be3b65754bafff06b840fe31fe5a305e7541d6968cf9fa8dbd6303e0c0a8869bffda5ffe4bd90181cd740a153fd11bad5c0fe6fd94298881051e1ac2a74f82d5c6288f24b6024671c248761765d99393bdaec0443cbd2e6fa11da586266a60aafb6b1e6ef4f276de7f046bc0d83a401980678ef3eb7b935e78a8cdb5a7c3c72287ec34646d713ad0ebf0109600bccb468d827593082d60567406b9d69120604650f3f78f89473a50f0548e234627dc23cc479fabfd993c607c8193714c4ad31d3fc89276b13b1d6575770cef10421ab625fe34c33188d082795f800e4009c7af3cb22ba24b178b1863a2b380c7d62e0981ee5b630cc1c4c651e9aa36d524e50530faeb99c1a12e70a01dab60d4abbf24c6603d14f60ebf34ed6739707365d42601e9f9e579a2ab7515301b179d89760dde9c025d573569d33521554582923c1a99c57e0ddde1ad2faa232b2b8c38fbceafead1c797ff6bab115e243c6a74c7eaded6a19a5328daa7483d0526087ff56f2392d2d91e346dc46a68d1dd93d31b9dba668b13453ddae4d5c7ce9078280df621db2f1b559c1627268582b06577e03b14bb63001ae956ee3a09b1ef46f9ea6d900f0d15a2fe0fdb2ffe603e4927bfcdd31e52ea3af4f6ce604bd4cdd9bb35db5a7497506e24ffe86b1b920ea5ad5f5ae1d780580d26618b2ed55fb1993595496652f25322d48f57c42340a8e2cf6aea252e14d2fb47402d8bee7b24ee31b3be9cf349a624d7672f2160949569568586876b36e06c1e3abd61e050ad40753642e49ec2d2def52e786918b45ca1095a34efd5100bc874f84197f105d4f7cbc7dd269a855eb6f58d3a8694c885f1b291fe45b5c7da771121c4156ac2217bf90e984a30bbd216a12b7e5f1cf999c317d2ec715386d6e1bd5e4bc393b11d35c7b27a38a88cb765bfb14bdcf76e1f7e02c4055cf773856e4057e089b3f74f8bff5c8cd94a1f930b18c6aae56f519f89390f51ece9b6718761b38a4f13bf3fe667b3d5135d9df1707413a262cac7a14e845cd80a70782292e91b52fdfc2f76afc9605dcf2b2d56fc9b3f3b3b51faae34ad53a39fd6e11ff9a1363e7bb46f7b4ceb0a2cf6faf84c1754f37d594c124da37a9bb9916118f0224ead59b183a8d627955a4b6e13265a2968d771a203360703b5dd22ca5a461d77bb27a887b30210a691f7c121bede099aa0921effbd8f63bd24c0e73009922e5eaf4d35e68ba4b033a68b96f54348dfd2c2cd8d58c445e93790ed0fadb525ac41f1c707b452b73e359bbbd2d4e98d6639962fc4965e7f21dac00ba228a7261f874a3c26db5162431439317ea5f9d52637e661cd9fd465940e7ec3a98828be0d9882549b41d0ce46374895a250bb47a635780ab05d6e21c93c90bd2ab77e1500dc61b86dd01622cf08908e44bc770c6e9915d373b773d848cabfa0309cf1527fbbaf10a46e6d8766eed8c56ed3754b06cd856420942db59a22d314c01fcb9e139d330349051b259451eae2277cfc2df7379064bedee2dd46aa94c3e428522042eab63a627c6923e0998c8c789f56dac741fe7c567cdb7bd4ccca52a39fd001970a005dfabb9faad32f876b6725c97901529653ef5660b5cdef3c6c066c8b689765d91316aa05e1f379a228fff49e332ad121929154b8b3b87ab3b71378cc7ecc630904c031e3f1cbe0a76b45f51d2fcc2868e0445e2d9e1dd7f7dbd4a9da6abd6d57d9ff388001e0cd5cdb43108d966ebe30e6115c059e846dd08151e8ff55f2e98c3adca7253abca68b21002e388f99fb444bff3689da76a40651911e8167f44170ce5d661ac4e6d4fae584356443d4476bb817d4017b7ae460f29c31a9c74adbcb3e8d5da7c6e6c072ced80f5ad9a70a6cd5601eb5a81995a70d7a0bbf9e7c2165317175146845d1ba8403a2627a9aac1049e2fdec8ada1fa34934920b13137906501394a8d48a6e9cb00dd8c34e36951fbda557f04945eb1c4fd0b0d44f964d75437aa3ac2f3d01defaff97c77c022e61d8b216070ce25fdac6594c647a8d047bb1ae8b68a4e6f14909e0c9b42d87dd9d4310207afb3ae4a457d44d01bb8006e043b83224580ea6a586b855d3884b0b9da5c75f9140d4e344aa4b9df43af8bb6ca09f8228763c88ba188f236cb6d82127a7e0b9930038c28066c52385207d8be6706b62bb24f9ff4f686e1bc7deb68504f16218ca66efeb21334bc7fb9595de185d24b9278acc732e1d5c252b296ba1fc2a55637c9780c4efbbe471a0c0ca1cc80dd371b2d23d4c1de06229e2bf81dcd6fac182f2be73b7b1a39809bacaa3adbf288071a521d4f2e559870f32c7809d5c0baf5c7401512a31966f7792daa8f9c55731a148a21acd4e2fd3bf6469ee4e540226db4988a187353a72a370196269a242f0e9e27a96451f0b4e21bfcf5556878a2fe6bb7ceb358637a8769baf58631d90c431bdd4d1c32294011e8d1e3c1dbd49d1651005b89cec361ad65dc31250ffe9b6611fd651ad1d73f39c14812c0bbde71441914a8e242edfceacfc7d199910f7cc6151a8a06dd94f2c849e1eac88510d00608674f83516d9cee1c106f4a4185f10199b7346691ed1b5bf711d44fc3f639eab37aa7b376acd225bf4862bdbdfcc8a72445fc90bb3a19534d5a77ccf5090f50aeb15a192f362d004dd2447a52ce441529693b3ba6266d4ca14e4dd694c3d0d66ecddf1ae7941e2c3c409cf69c94f3da3d7388bddf1c87b6b75fbee32fb11efa58029f3f4c4115f7ff05d4b917cb6864b5075dade297191fe3f14379325b5a2b1f02130ca9b7b5022aa4744840ec1253449732724d2061e6abb5941f291d02e7084ef2f99c727bc933aef41aa471721440959fa17b4322b9931f093b8080b9ccc83b878ca11bcabbae87eca6bee618265da50db1f969bbe72e801b64e520ef3ac37a794c33ee3267ffc1c672fcd46507e028053a442e9e2dd2ab5301a37803bf7e6e10aee194333cabdf0a15eaa6f9476ca10e90e7ec59cc23d338b867f097d97d99162b26985dd837423ff604e8356377a2926c513d7f6096aa44ef9f152c07358dd2576f550299269dc0a9d812b9ca85af29131c9c6f79bf93002db56030c73aaeddaa4864d21dfe444487e0a0f70b1b294b2bb673aa75e32fe2e9376c4697f19ea09a3e423cc532d834369b3d6d93ac93611c9b7dd0f3b5d375a8b193be07febfc3bdbd77b32d48bc083c74229e02be80137c57f54361ac1020f2a0713785b694af6b427fd5c4b48248e0180af8b6c571dab15884a25e4a788d3d807f23afbdbfdc5969b5051a1aad6ee7d3511e4e65eb1f5239a65e27f57f131fde3812c48893c2de9fd1d19bcfafe2ba529f6f37f45e59e557d4d77d51964ae0161675828ba30b815130bbd867fc6cbe02307bf2053e22d15f8abebcd3509d44d4a4cc684b801ed82a6c344e683545895edec50b2d1d02acad427474ef2092a4765da7d45c9d654987decb6c34cd05a2e4d4cae1b07d71ddbd96892429a8c38587cb7855136d776c0622f1c07236357120ccfe2453d1d8fb2cf17d49073b987e8558be692472eda601b347d995035d9a9f21ef316bbcd08b67edb1620c6b99e60baffa8ef430009e271a2e1611b6d675bc6e1e978c80d0e4fae5d5fdadab4052671bad44f747889ac2c225047cc338a9052bfcc52ae052be52645b7a6f9d145a44265729c20bbe428145bd333aab1c8b05c61a58bb3dfe6e0af3a266c6938e541f7a888bd90f4a1bcf0f6710dfe0cac23ad6f7b0d20c0c7a911e4b51473126d64562a209a0c4949d28a9a33bd106fbb510d9057bf3dd257a614ec6b865f8766772994411bdbe263d1a8f01f2b28007fa3436c4089513d1d407ffa51aa75be57e1368df42847e87721139f40408ee77f7f19ac3e53a629a2df1cb56d68fde0c80a46be40a996830e2a93509be2894d434e55f8590582bd6cecb1c6c9a93e14415a20cf2d8611daaf53f0ab3afa635a5479c0f79a882e2105cd07d46d5381834b398e67c3a70016e206f157247162353966225208c2f27ef5ece6885f500e546d0f562e0bf4ab5e2fab5ffd612dcf077a7f43b1ac9c15fcc2b0168aa9862db0304441ce0c5659db1fa80244fa18f2f7a02beaba8cfee1c2f6805e8153df26bf1b4017ecceb354b53966a2d5f619122e32d1e118b2d19cf918c68716634240a8b66ba0335af5e213054d07575d1778d3b8dbee7126fb8fc8b1e95af0e396c494892ea348b7024c1d0cc6f87337fc6d0fbab0da6eee66025848519cb8dac5faaa1defead6edc4dafdd5373fd18daf370ac1b86cb614f83cd06566181551b62a13f9173b830521d3d8e909a21866181eeb545b6ef2a09b8759918f95b04f519cf6a50f5ff7060381d9cea5eaf1cb1f6cdbfc01a6c99836291b5237da30dc7e987caa3e1edbf8512a250e71df03c3ac67014012dee406b16b3d33c3b03e002565cd8f0b3fd7e4f317e731d748f756a75986a8f6dceaf1f495e8b99cdf82c42e4c10dce08c92d1d09045bd3eee748cf88891bc15698462e6ef436e2a2fa32f81956e1a24cbb5c7d2dc673c0e9a236e873d4b05d84c5a6071c177d9d5684a4a07880ed03ec5e7cee0457635ae12ab033cbfdb0aa54f13f37c52ab8206511e1ca66c19869842d1efe2119a31881eb65400586a53e5385723f0eb08f223b3c8ad478bb6c4990a1b31c189fab70388e967b94e206901d0d0f9b3d4b6b09656ef05d32b0e13a9e46c9d63f5bf4f8717ee4651ea24d35fdf247cae55dc44c5023c2d309548fa30996c39b19d10817c926df9ae749f19692dfbb5c9b6a2371a7f562c48118d0296f2c40f93c816d64bc20d86ba34b8c48681feaaed3e3110fb94e70a01e605b144b41c27f2c0f9d55a6f77f75b71985b1da4d4650036b157d20b94cf455ed792a0aa1b87b4cbe007126053547b756666985f26eeebe64a9506aa0784fbbf2c2a139b6a39c332f3f2db5f48a301864b6e5e789c4b97962250ff3ae8310b522b03064eb145053d5c201e32feeed5ed6ffad7b7dd86eb8e64132582dedc5c5ffda4df8c97b16433401941a21e3cdff2f9926be692a7ce153663e04c928fd82ec995081dc487c75eca63ae77509607dc12be82cb62b42a75c0ca985eac516606b85fe7c9e1cf15041f88cb793b0335f5e1078430f6b7e6f42bcfb581d32bee31f289e658968f386e6a100270888b51838ff4d9dbf5b7eadb9ffb9f7daf2359f59e9b6b918ad117e4d181ba23de3643cf430ee99408bd1e7243d4be1ae9448d9be41de03d669c9aad7c655a5be60df32126db1d25d7d06a0040e47b202993736aed98ac24d1f9a91394434ce0481749c160e5db5509f8b6cfbeb33c56161af3ace194370e74ee2c5c41a4f77aab5c2ef618b48ceb473dea25e4c76a8559e0f6a7e897e9c3f6860bd1aa0fc3f1b7e5880976ce99b038a8ee4bdaaa6e759aed62a5282b2a0a01c62ebaf80c180c15b94142a3bd686c8540aa89c9e4aeee804a21ecccd762ad3ab87e5f52235e946de03fe9c70963e6d50e0626d9fb94b8b3fe19c4fa24f9724b63e107e1ddfd5266636c460938f1e8d118eb6c3179879adc113477da985722dccf40fccdc15d0ba949aea192d4793821683fa1fae6ee5ea38c584c96bde485940584843d58e78ade9aef418a65659f6c06ec0e5bc833caaf766f8a531b09621c0c93e859280196ac5f166f18711ce55af8d8fb7da9bda7a9d7607a3c382c821bec57704bbb14f6bb9f0b73648206d29448edaf8710f4bc38b71364769eb7ae3aaeb76338998973b462b695971f8b2ec2fe1174a28640d3051f70902cd510ac21599a0b4b48c6d53fb0ff1dd9d113c08c202e90f69209b2b7165f458463a14477f5eaaea95235e40392ce52511e065198b82b4caabcb722f7a5c8cca6d2d040e58b8e957d3f3d67a90f0b7d2891cca991cdf0f0e78cb2eb6dd3936dbbaa076712216e08ed954528d8309ee685afcd901d6865c4d48b63d5c0a8a870eb71ad80a7c2724e21deb7ed39fc6fd5910272cee49072109a4030a8992cef1d5db129544b7382b142a1fa7f747b66927411212a8f4dff1b6033822b9f6851bc3af1e5aba73e8677786776a630b56c645564436ec6a7f42e4fedc2277b63b494a9ba484c622a66e9eab7932915b367955c84416030a739918ff55665d42502eed393ba01253f0a4fc119b9d2cc7c416bb3f881c97654b68c47d3a8aa53b72112e004a39098865af124155067fd18e02f7f486d7040b754679f101ec1a020fb48f7956cc262063f163c34c0b150902e28ebfd6c1f35d6f969c0332271626876d840cf7b5f2cc89f0831fd71786beb11a01c9ee59cfdbb8edbd2c41b8141987c09e439392f9dd2640d2af9cc84f93173dd3db342b0416efc05fc4c71bae7b7f4250b5c0ef95e2e746e4fae379ca06a3b2874c4ea23a9f5292f67528be4f9cdc572dcbe638716e4b973c9a61b8a089f51c9e95a45bddc5affa13b5ed3c722e3d93980e99e9f6efa1963c069e114dad89d08c6fcbb4683a565a29ff8b02a08ff17c11f65290a0e7a7e885b7def03be1b062d3033b48545dc427cbba98ad6532c6754dfb86a909d6bcf28c36caf1e5b72777f51869843cb098075b8f8ca94ac6fb138eb6ccbf8c4d6f48c20be872f5ae4d547517dcf48bc3306d6be6ed62abbd2ddb66909b20c2ac2d4fc99f9e1fc627909ce58a0c15cc163bce7f4911760275cd41682158992783759bf56a7244f1c3afb598d78d74782a08aef83ecf50098157ca05d1ab753553e6a1f804fb8ee302e9333188c77d0a6f258389304d9d0b806be9c239fa4176addef623f7a05a1455ebaa322640ac1d6610e084b63299a2c368351fb2db8a65e1ed1d1baaf733203d056f0d389f9e0b9f694a8d3904f249fadb1080e4b5bc7da09f6b41a766a67148e50635282abf6f8b8d2605413b137b77431098381f54486a547538657520a1da09144c8d787ca3ab0b177f675b99a1c92ec9c8357eee309faacf527db93e1c90c00db5c11f72628e41737e03dcd17770fc9093656ae6d0c100ee4258995b5bddc846f37b761d0695eede63bf3577470f4af97c3059da936f05366a7eac04da418074980512f91a6261ccd2e1fbe7aae48888f53ec246130a165c4d5847d7324c670b26068c83187428b34e24a6af1da133b390d94a95ba12b2a46d8e232ede5f0a7f0ff839478b3bc21627efbc3a19b5eb0dd1a84966032978c33d8894984909d934b842afb2ed39cc8a12bbb31519a30cfc3a14451388bec72d5fc032800cdd61e0d17e5651a8ee8673711111ccb7f918033cb5d44ab5332c3726dd6392943a22f7ce23d3a058daae56d5785ecd5f189ab74c056d58132716953538de2c79b09afe20ab9e2b778e92c8b269f0938982138cfa7b76e81d2b24bc0d5ad8da17d138485bae2c6f8f6ae23d9a5e8dbbc1d600f8ca8097675d8fc51001bc0a1808fc997ae183e4c90af00b29ffde7cb28284f18f3edd35523ef58635d4e4e862c7c32d0a44c57dd464ce7c12455243f4660f43c4b9b9d7253bdcd691d96dda36dea5617b17fb5e2e3756b38b1d628a0dc6e5961deddf037cfea634b891af7620b823e551bd9dec130d195ff8ea77a57b3f98670f2d9520b5e1f22f1e903232acdebf1702b815ce4f2096cff03f2a3ca93aa8152d0b74e56c70413448578ea647ccd775229a0b7b1f4c4f81e58dc2963432954edc0a06981d3403d2aa4a2d276e0d2d9e15d5d7592fdab4245d48f96898d1d072b09bc2df24a7ca98c90a965c9c1a01e070ee120eed466515dc03371a3372fa0f3f5322112f45f5d538fb42bc5e7df4eab86533f2c429c2e4c64ef431b0a06292cca2bcd4998926365eaebabd21a3872b50bdc5bb60ff5dffc08ec9358ce4ba9c0d1ceba0000bcc3ace9776d592152910ce6a4fbf3031b6e53f452e9c24ba5299652446f9df286830fd380f9c0c5d7b39a5fd2a74be5b3e23b6f48cdc148bdb09695b4748a3797ad75f22dd871ce6ce046bd8fe8267f68449bc3f6c8bd8f3a46a8e147522d979948c88ca791d204bb21f84a0244ec97df9b5a3685611ee6c5f3b4802490f0d9315defea16ac4d2e6c7d984c544505f6c3ef62111d214c1606c0a2b875b63ac709f3d254a1b1491627fd0f0cac73da64ba499a9ce58fb0e7a4b45ad25f4d7227c912591170292e8293a843d23355d1a96cb0ea1e0633b02048d8c5150cdc02c219c26c6bac9c633b58861de61073538c832c3ae1a895b58b9932c9cba4eb51609f0cf3a87d9052091f9f858f6c55c9d6a4c5722bf13e28ee40cd4f3a4e02c7c906f7d6110a8f62b390fc64166f84994f79847b450cb56f12e4ae40ac33aaccc4f48cfdee7c20fb0352a4a0c340872dbfaa703b771f82f4bf2edf82677b6ac81a12d25087facc85bf0e9f23de08e6ebeedf919b08532e1dbcc567ffb44dcb239307d1b823ad1968b06bf6d3afee2a3da4bff08342cf4054d3534e9ddad15445f77b911b0cbd910d9e12b09a7e1bda8aa8f294dc6bbc4000ca7d9c4623318d970e181b638851bcda51aad55f92b77e39c321868ccc41b6886aed5ae1d592fe7fa0837676e091213890dc6e0a34e99eb4bdf4cc7dad872b567b4b9056391f30667467aa3e5ca6489024508182acd9c3625e12709556b527d1c53e448d97fdaab5536ac0a143b8b948d6ad19b142b074ab6d2479be0ef430610f6f806d3757f4d20534bf89dfeefdca6c9b3b7e3e963af7b4d1f0df1e6cd06e23864be060539727526eafdd76719b7caec4f1d1e7b29caef9c2dce0ce448e60c72aaece5b191a1a02c0988551691bc866cd4292862d2238059e45a866a5f2a0c403af1d71d20515dcd18368b8fd06155a6137a9632e54fea00e34212eb68594e2ba59b6e7a6e17fa94a7770f255e2ca5326d6ffc6debb6691baaf326ea0cea5e8f7b18108bc34c031d27d84499a3a5119c4297af765ded9a249c1c36d8a563ba061c1661b3d89403c129c8c03f4931174e438033dea45c099646fbd749da3bfd0a1904e6750656692b2dc71698a77722c2e0983e29579813fb2c306cb003f97415f261f351e529cfa594519c3856ddc0849a7e02c8f01865cdcc487badcb22dbb428cc3cdcfd74a3eafe06d590cfeb7d2de170464006535b8897a28895982e806f2c920778a7dd6245eb4557248b06b509462d5d1102ef81a62eed27f9e392fe918e5207b77caa9750bc9ba58610e604b14913dbde5e3364c0e276be5d45e6c2d5ce9aa20bf482bf8602882517e9dff8a05ac236eaa0c5614362ddc03227a069a65dca5b08a7fc47705d897a6c7e7aed710b96e2d8532c23b82090e21b11465f8dcc6fb71fff6ddb8a2e1df9f6573d6f8ddc208429edce18999c2e887a9b4f10f68af93ac4735dc85de4c448380c9e0b613ced8f51e921bc52460517d31e312a7b2a055a889c42ba46120ad9c3f7232d95ae6c68e2ddcd8b9caec334a7127308761a029afee2c30ddd4650130cbf536295c11ba54f243802b346d7537920bb3781eb8f7079ef455fadf242a884cda536ebe579c90964e7be40aebff8cbc14034291efa7f9c0a401c129640fece9aaf06f2bc0548b408632acf36fb99116cc88ad614d21cd7dc49bfc5b2d98a3caec77f54955cb8a19710b4a97ff8b8dc9baaa8137da4dcbfcdd8d711c87adf718284fc8c01de7d849996f889fa65dcafc66d285ba9f143b66763ee9157b362efbe6e0b0392091bcf786c72cb369178ed859668293a35c64e218162bee101b919aaf92755c67b27d4cbe79ff7a52a122851ad04069ee0f8f994a7d014e4f44681e0acdded0f930646fcbefc99d68e3ce2a317687e5891304b294db31dd3e9afbae80f9b43edff5b988358f52c3b3c5d9f027c21faf7b520b567e988444e8039173987ebf4d1fe7c4c182c361953c308dfe831acf6eccb2ecad911cc22b52687495dac4c7a6c3f0cc403cf2c0bb0a0a307dcde860ca851deede54d0b33986b2ea3bce3494f0d2f71b2dea8335dc253d0b948e939b6dad7a5a12501a1e178bc73c8dfd34edd455e3f7b115e089a096af666c4c8345fc4cb178700b63cd6d6991b2b4ee2d9cfa539ea9f4447084b1644a892c922029226ba990210f1486e228f793d829886709d40f781dff9bedb497f4bbfde5d20e85104cea4ce493121ed1e0292037ab17aae11eae54cfc98e5438974507cf01bbcd4681ce1a104a39ca6c36bab59f00748480b392c33a622d374e1a6f71d715f9a3123083b31d9fc28effe08fbfe9ed4540bcb66b8fcace9305e1658164867690af7e41523e93fc771194c6f0659edc54859a0f82e307768867fa60c307628c4898919d83e3f8c81efc32d024cf453467fc24a71fe578c0d3049ff37d83f5c0e906532a5eccd66b80f6e2e67526665d474c616489bda5153e86db06f6ffc7783aa3cdd12a1eb44d65a8abf0299289bfbc1e592f0a9416de8f92b38177a45e1d0414067b31041bd695b995d6893a37c28d1a15f1e89254818fd3314c489944180f04060eb9a4926ed7d2a880dd47f7ce84e79c906cdee66806ee5c4fb10701cf2319d6740b26a17df49bedd66de0524b672ef6f6dea154f9bc8e3c73fa161bac08fb7d936fb3d06bb5bb6bc1802ecfa1ff962c098602279e7859da9e6aed1c16855303552c73a8a0dfdb2a276059f63814c845b3ab2ae6be04f73db94ab58c7564c971a08c8db0843da233f253884f786e6b49da974019c026116dade295f1306b04ce5ed529707f96b98d08a2e363cad4284168906d480ea74f73607ab6d5b163ad2276507171fab1c740539593b9940fa73444dfd9fc0f4e5856bc5a40bf5f136b76d0458b3a5b577555b973c0d93fe88f2a56ccabbc2be5d51ea8ca5a38a245e7d154fc9f540c506bd32486914c3424892b869e0c11ca326dd40b112cc7e2bfc93beabcd645736450c27b142f99da8e3c40bc9f238254ffc97fcf78dff4874ab8bc7acf5797fa5bcd2ba666c24898ed5170e015199731129027db479b47f9ae5c5dec7b4bd108fc89158cc471e2d8086fc4da4915d8ca336bd417c68749a1b35e252809da7c04102d88177564ee01a83f42928340ce852c028f6b3ccc81e521661d16c12b1f585f608c2ec3c4f47b9568f4f10bc100cbc4fc5fbff391772ebf1b4b9fea67426bb1cb2ab9f4b97cad9793e2dd28c1f605c2024dfb31ffb4e55626b9a9cdb56ea5ce1569a1516a0f017668133f23683999efbb60073f3ebf70ae2e6f1db33e296e7ee752cc220034def98e8f0044dd50f113d0a0cb657520398fdc73e4e22afe2e88e9eb23afa274aceaae5e06d349c373f6e81530eacd60a6c1d8cfe4a3a0724db5c23e8e3f7956d40f6f893b18d31b895facc81c186d06210bc98b073dc80f33cd1b53f61cad62bc307a16865ba4df9a17c3c078357d9a113758ad34facb5c49989b30418c6520cd177610cee3e3970de7d7052d8a27a5de0b2c3f5320d1e1f5ddebdf59d8c9196f8b0c7cfdf9b9cc4c958da0225f91aeef50ee484bf80127a066b268244802d40b53e464fae54e04bee98f983efce33daecd45d106ca84b5b3f999d18c2338d90738a5cfadefc9cacbad85f56ba846da824cdae16bde8213945f482478b392b1cd02f8c6fe5f53a3dba716c090ace20ed3935480627b22caad606669cf3e39e3c3798450d57c131956a0eb009450de600a6c5cb6d3ea8c6165c39ba67b0d55f75364f2751a8f32b3a561acbd61dc62598d9d9a8ca674e960235291e563680d76e48de93db5e0d7fa2eaf00ffde98987fc5eeb509c35f615051d3ed2d6f9689e7ddba12b18eb72b745a558fcff3cca65d1a29563613f31bb8560f5a8787e1f2d2a8b415d88e5c56ab9119023488bfb478f51424197c7a40209ace7ef9938f70bfac4399bb9b167f273cc5013785baeb5abc79c8bde73af71085d7018e7be92a37512e46609e2fce6ec11f33dfd205728ad91ee9273d7c69117ff48c4b273749c1ff3fc5d180ed6c0a8af0413458e87290b2cb30616488bdaaf0ebc73a80c1f4e61e3cbe1627998183fdffd23efdab13f5b14a447246a61c64408559626cce542d16eed8357d7a345f84168f06aa957c403c62cf62ca1eaec6d78aebcbd4a8911e501dbc3869daae2886fb209348efd6f9bdda7639d7379a581dc2247ea195d24132911226d2ff17656b772cedbd0148a89b7be300573b09a27bf5ad82b9de3f1f25118108a232969f9a525b1df313fbd63e0dbebf3170222d57ea2ddf06cb013f9267b1e5c0bb535d7d54572ad06d170a0e58ae7c4d1f0e801a6a4d9e6fa34029df594bc514e277277b45c51c3e57c3cd73235c41938ff4232d3db5c6dbb0236676b0f7b186ef2a85fcec50fc241827a6d5387015eb0afd9ff62b0c5f3438d37dbd335caffe29930068129ed169f96c1d9c5d91013dd6517bdffcfa72618478f61eac23ca64dadb1f287f57a3f742baba305b670b713c17 +0xe5010c8264bebfb39e73e4b25e8882e7e158e3dfb56b7bad0520079666a4581c543184970a7d9cfbd3906679c076c235 +96064 +0xfcdba9ab5284e97b6fc8906d2932cf7bdcbc87950ee50a4e530326d66fdb6028bb6f7d84ca1747204bd38d1b31e06cb21289cdb6cd402f3d70eda799598624869be0f8a7a3c594341b4693ed0e52fb524d88bf15124a88d0e413b4f4ba0a9f0163d722fd25b55a1fa5c8abcb06b204c35561649b252a9d6d761c58cfdc8e5902ddfb046c9a102048b202dc9d63250f6cf2bbc42e4d09f67ef0b19812053bd9efcff5a5dd48fd6f19099c2e4b6bd5a5b7ec3ee8b7d40f1c6918797ea57e39a732026c0e3978a5cef9743da9bd67ea4d0b0a93d71f00639698b71d11708faf4b313e094566732fc550b98d56db9e8c90d01562994c1a2eec719444595b7fc54d564a74544e7ec4dc87a1363c8e5ae1f56fd65237286997a75e79975f4f98a53608f05442d7e48c9c04f4dd63bce114044e120cb89a37c74ec52cbd2a3220748eaef65118ebebae8c307a2dd44e7d4b45d694382489cae66910765fc2ee605ddbb22514dd71dd533573facb962d73ae416f237d84df6c1b80a61f253069a086a77b4545995100a21d363e62b13f0e677f828683df83628e1cefefb67b8d281779711e8c55739dc4cedf0c982e6e959b877586f33d5df768c453aebbab403f39dafc778f18bffbe0d0d82d1514a14f75e2b2eb75a65572d1013a23dbc96c2e1351841af9ea1d641fa98769826bc0851a179f7db023531af05a0c17bfdcf83ecf6671cd70d3751ea9e35687873cb280b5aea6034dbb3f39ee5731520fecccb492a12b599cdcaf72a505ac51cb8e61856c302e47f3770115f280129c7202d0db878b1a86270cb3a83b98f08df769b4df67249e0f4b5d81f6255e15bd9024ecfad3aba71bb66c690895238c04b2d593d4cf126024fd78a826af78a37c125d0858a18938e2f402b9dad82ee77ea5dbe6aecc82db4eb0cd5cecb75625a2a0b20c3e17ae37a186d88c652f4269c3788295b385fd77540c66868f658101f7e12de0f45da10a2117f6c8f2c0e67a9ad2d3892c230a9c00bb4a0f58e280a1437ed56cc29cea1b2a4d6257c9b3a282cc5bd4a860cd32b2186281dd8f56db6b4e1eb299f0fc12d084d0261f3231fee922bc8fdb99acfc2165ac14da7ce91bc9e06acd4dc5a4a093f6494a0a75628317619d0c0b1de8f052af3e0aec66c1c722c00a2d718abd1ccb4960d4ffd96db87554a5521e36a896abbec36bfd970967ddb7a5daee886e0fdf45bccee5a77a2569c27d69fe2914779559e13ff455e784648de3ddaa04e00039b2063fa628b3535c72cd599141561a794a408fb9e983a51e0a6e3d8f493a774058e53029a13ec9b72d3c2ac1c59307bd578962349b065273f5eb02849ea5fc5cff02a8565d430fe0bb72e574fcf6c7cb4964c14db29813cb180535704a4918f56e04af15a3ebae41e41892942fa4e109e778b3ec7860718e3962dd3d964d52736e944d4eba5d2d4070d63708a7c8dde1fb6e40f93387f32421aa02d2cada333fc75a8be9ebc214472653deb8a98844ba4bed705c2c3422f69886ac172e1742bf41fd70ce7e42ecbdcf388e8c800c9dfba19e4cfdab90846a669ee4f4092d075ca32605e6bb043c0a332c506c737d700ec329dbc4f7c3a3e95299b151a5430a7eb77c5117e9318c951ad82b40c903465a7935269a5af407dc251f1c164882d48e43a85c4a52f065c84ce327f0cbc5a5478d6a33651a4c36a9a7da2c2b3b12ecf210512e683c6a4d0a90f64c64c1ec183dc5720c0f80f2babaa06fe978c61ada14e620d057f0c7cec4b0b9a385f39f24a4ebf2b97ed40e1b75d8895be630c2275b8dbd4901b62e705c72d33339a80753e4c595409c5ecadf4417ce8b5bc3345a2ecccfa14cd5c7ba3b9fed0469294c2c651c00ab4f654c908e24e680c0c595fbf76cfee02297bb34c9ffae1ffebf953790b7de028133bcb5bac87a42fe7f10921d36f40f6a4232666e59bf8bdeb00afdcb60d54b190e43d732cb32dafb39caa808ef56360c1f53d99376c750f344d5057fdd8d90ff3f097d5df5b54fa13beec41f62cf5bef7647149e1f6f7723c51bd715f7b0d81b0e352fa30daca9d7cca26fcc560588fd8f369ff91a5f07587907fcf376e32c55c2ef766cddbef184350e307792a0c41db147030a2f3e0879aabefb8322d09395a561d8202b942e92bf5c8f86df49183726a2c73b28b5836e9e6b5c2cc31f15c3fdb0df27c0d568e8afb1146205a88a34347073f3cc6b7e1f9d34a8552078bac7130713ea642aa76e50384873cc6425fa24d99099e2090474f141666802818b892f8cfbcfde3bf40ce916b221fc25ee723e04a59733361a55e1bb1ecc31e58ff199671f3ff8af56aac176dbd55c95ef84c91a3a54879bcaaab4ca59e9754acee898c107a3782fd630217e49f5b55a2f190f42d738a5df1b5bb3959d279659515475c23c6127627b86515686ebcf1cb61756a505ab57ab1650264575ee5bb91f1f799145e3cdf14d9599271a1d72848d68e76a4b1563a7c171550166a68d12402fe957aa8f3283544341198bf56639bbf20aba32de927a26a787f2fab7f40ebd6e103bf4cf1dc19979905363d972e4489f06bd416eaccd4dd80540b88958539dc23566aa0a58522320cffe2933602d3d55259a002e79473ced181228848189e8159fff54a7a9e0fa1e4741666af6bba1fead7af784c191fdcf0690d3113759a74e972f7a10d910275d3d45a1e6fd377c81e784afd94b52986417e44096416be155651ea5acb08cb1c3fc31620f3c48d6c61be1af96e03313969533f77d68669e1251f35ce3f5fca03acb2e324d7d97b8b591b87f2148dc784cc6a8812c74f2e66da3d7281d7207fda9f164970886cc29369032a8e44bf4cf6ef468650d2db8c24ea2f190c2ed56cff7b7fa1ba8208e32316177b145b0241ee3659e2b865a60399d976a1c3a2f911e0e651946951385da8e4dae22ae41136f9561705c01c5925442ca6954ee005ff2d543e89f37275a29359a008486c469c96b32067fe534f51a258317c144276854349890aef724b5270e90945d3502d0354d1f891c9a7031932e0a9beaa56e554b13ae38fb3bd13ddd0279933823c3eeb9236f21bc8841efc746a61e577a9bcee05acb090f6cf79b52f79b249ab8cf6b60d56bf5e6176ed7bf53a1c89129777a1af1382b71f35e778ed640700d5cedf02f4c5b2e22afc190823e41c01f1cca0201c13dc5a936ce779a88ae9e1877e725306e87f3f8b800c318f0cf2f89b95c0d9db021ff409f0f467df42dd7447183b16a24366df19af4178a50923c586af444f7a72e02bd95e88a3f01074317b28a3de557b1c494bd6535df45d41013965c4f168faaf6a87f23ece99982091ba2c370aaed411f69891bc41fb9dbd242a45ad5024ede038ac7861382a3e852d8a9f8f3c0d02ca6f967dd6d5293f1ab6efeb77ec4ce124fe9d4daa812067f45d530ef6d2fe6ba83cbbd74d881bb5cc31e0b3af463f58e05500ee652a2ac900b9a9d7187001935db68f4a9acb4186441da33addce7ad994b44dd74ba387c62cbaf5a46e93a4fe3d956754291f194534e2aded6e159dd7c494fa94a87df5e3fae9dcd363ae5720ea21fa7073142166f1197747fa9c06d8029f8da31629c3a6ddceb6009220a69fc614af1c231ae8702b3a85d6edc2444ea10c7d8f1f379f8357c217a864baf1cf53c60bd393c3dcd525be6026c238d4c0528450c52e17d81dfb6c782775adf73435be87235f8f8d1a832d7c94026046c1899f9dc1cd5b0bbb3b466e2a2fa9f562de76a777e0de67b4b60051bb48c908c6a8b6cb116761b8ff99b8501cfd1f9adfa086f36dc2410b4850cf8618efd3a94442524f40a6dc5e5f896ad47c887f460f3e57e1617e57c629c5e36019723096dee8fab0bbe61b7a6f9ca651c54c5985760a71f7ff6f7346ed97f496597a305fdb0f28960fafbf7b8446235e83a33ee7b8975dad9430340c18497b9f35628362dd276445988e38f052184a5134378fdb2b578388dc4b0a642e5cd0c159b58a5e69b4266602fc08674d8593e05373ccee52dd8c00142a770d8434acc322fdb590e557f77dcb63ae5ecb0088727de2967fd3abcfb9e848fa66de83680b1db5a5a8e4654fd35e6fab357f2b909dfffe5d2e0224c6fcc54114ee81ab8b1fc657db14fb6ea82d287a8f89ce7964a96641817782db2a6f478d5723022f8e67a95eb6538ef688d1d61ecbda3d4c4d4b5d36b3caba513287cb982192f481fa793354d7e3038f7a77d3b6c0954046e2fa215854b63d09a7bcedfc04cccd3557daf0b4a0521d8bf565aded3e497bebae1c7f2104b87f86c2950b23912ef0dc1ee36e18b01f218e7251d13c7565449d0748b31b145ff63b4ba6cfa9273803c8c84907db77a8b4098992ca0f06873eed970559c1240b35998b4897e767768a9ddc726a77778d498f93cf04df821dcf5fd5b8ff9db448b2440a10e078b278d9cdd3e5e297304b5673395d1e4848a77a663bfa011b45a6f0bd508655d798ad85cb471a1ca522516f76d2c382b3fa92d483423f0ac438847557f72f548e9a8313389e85851bde4df8ed08a8becce88e4259710e79233d8fb4b65662690838a8167842ce9875b47f875843633eddc2f8583b50ded8a2a527335b06c60fcee37ae41cfc4be34d55949f4b0b899f70fa4f9abb6a26a5dd0fd975b870c0b55d3b7a2098f383d20d21fba527c9924d10ff126e5c157c6d3cfe1500413cf8f63d9134307ef11d012fba334d911603b45851ef679feb569b4cc0684797c3c55eea9527b8315d6ded3f8ec9dcf97954819193150ae9643bbc872751c03e9dcc3beea7c31c4290fcf2c7002df7d35c1b21672341bcdb18925d7663501e88235429a459a4d1354440ae20beee02b146be104392e411e76100da8534e197071d13b4c62b3b6b8bdfef9c072b78a215c1b3dab1528a9e90e5fdc04dfc94ee5db38149ae8cf56fb8ec4038d4d65c3a634592ed2af293b76a1fffbb3b2ad878debf0374d80f61423ec1f901043017503c4ae1c43ae39df0c5676d07d7502acb2c6830a2dd131d87a01960812fd91878135a16fc4bb607df5554ec52ad0d0a49a9779f70184878a46f5b1d45b2320e166afbb8f1e7ea7fd77c70e41816a20598d84586493400113d0f0f85ab35cb36bfa5982e4199e1547dbd43fac4becf9b2d5b5aabba9aea6596019f403e250540d875c80d77cc4b34469a3686d50fd6497b953f6630c757e453e982c37afa80aaf53e03dce119788da685d11ee584668f08086c5c4843e91bfb196285fe40cde39a70c40329ec09cf22229c3962b6f0da573759e46d8b1e8b0023b71e14723d693cb08116cece6f775dd3004cd901f5b9fda490951d2758afe7aae8e27a196fda507fd38e2c3b2a249e2995ffb51fe5bc4fd298e4d38337f935f180797b90c5858a3133dfeeacca458798d598834b514fd233eb6a2d392d055f9a0659b592ef192e671a9272bdb0588e9347cdd02ec8e3395b008b86b3b842e926f2f9a47a4cf3c1a4004c44c87cdc37cb54f60824ad24c9ca60df8c8d5a30570acedfc4c15fa3f85a7d43f167a05f078395a7a7e78e7327e484bc8b10936c1dc802828302a7b816fcfa3ff5159b5f726e72693bc1ed5cb83bf4c91ef7f434c1e136688bb8a59ec22dff86cc5cfe3c0cee83a1406e3a501f53398bc4bded58d7e8c3283b5dd9c67e5005cee39829932b8631e63226f5eba1acbb5af8acff16c44131181e5cd4dd9ff5a56ed771ade372b815bead86b08e03cb02dd477f9a1d1b7d28dea1400722cb9146ed14540bbb6716a7810f27fac5aa10a8892d905eca420ee2d270a1e16475b572c026c9c3698d045fd3c3652511091004c50779adbcdc792799e8fd03e122d4a19e9b4d55ac3913a73d86e8dffea56ba03781a617435f4e4fab86bbef4757616bcece4932c20fb73614b60d7bed0376134718a01c1c2ef0c37dd658f3f5880e29d74c680b69758154ffdd5d997aa7b1d68a38f23ca5dff33b97647eb28a391d745ea2042ff11ee4bc556943b91606b152676f16f96ef6e8106e9d77cb53ef21d3bb4bb810f74073b4cbe67a4b5da4f72f652778c2d5e821da8a0dee7f011ebdb073c5fe6efaae90d6b9d14bc0a016f5b609feb2397948430270123d7e105c33932e8d318a699dceaab5b642c98bb12f9edc513dbdc77bbe1097670f28f00c4604322e1c03c2b2afa93601f9c67f18174242cb75d05f17159d8668be002eb3478c2514f86ba461964ab140db3808c05f38e3ca1511ae9ecbf1b393d4a42af5ca838dce61127d4f3517be0f51aea72e49eb15e985d2146763c5b564ed8583284192c2d6e0a8bbcfee88c2aa179ad8d669e17f8632c24f255f81f2786314b5ef4f326abaf18eee68352655bd777d2c3d51b4874cb642ad4d11aef13adfe231af35daebe71e4593ac9b68edc60bc5ffe773ccb3898ae3cd434cb53828ae6e84dca7f4dce7b16d3a01a3d901404f15f25962a27ae92b161dac432d4dce692a3e1c2828a4396556500bc0ef26a8abed720780de73c8016a1cecb78f98a89a95cbd218eee868a491642f8533c48bccad1d7650c904c2c8404988fc44bf23bd419c92fca00fd1f9bee4e1631f71560be5432a74fac455ca49321593f517dc4bbe4ed365f48111cf3f50c5ed2aa383f41691985ffc28fd91e554f70109393eb05c4117c754e2a4bf83465185edd1b21fc177446445b926b99530b1e61999d795bc21d4a329bb17253b23f8bfc1825ce96662b3345feb5d9bd933ea957ec013764e4f9e8c1b60c5aac778400d5e4be0db85e26942b3363ed331fce5a1c1329eac9348e9e4827a5cba98c1abf11c84ea70a084db11d83016da3ffa579d8967b5d31bac2b4f077e38df5f8eb10d74d3d65336b89d14474f822b439a94eb2fe6157457d7e71e02d2d6736c3dd3b4ff9f40ddc8fc03dc890b0d40fd7c420d3d1429fad85ab1f41d1ed2215f6da87a357d967ac7ddb3ed05f914b5ce0dd39639a86fe10da2f043aeb8a863998c93ef8ec553d4c3cc31a8468044e425ddbdf89de943c1685f468f4046c5b4bb191a67942d15563d45e190d336fa76955a85b6d27d621688de09596a3fb69f24a1c074be0b3789a4e968593483b1c7ad02bf538fcb374aefaddd249519f78d76951ab994e646e99b152a43d30d1761dd74cf412e693ff8fd4d2663595c04fa11918d989154dff07057ac03472977cf970f3a2226cde88b424a69a81f7c6b7f95f59d843bcd5f38d53f51fa096f7f8b7a608459116fdd8c5f243b656ff19788745fcf1f0cb6311d2a2ad09a82458b0fe7e7326866c56b769449002db36215af2d2ea6cb8ca61227ffa89c874a5226e77021c8d2af752ed482475c539234625e30e0991c24236ee3b6371a32da1bcf8ca39ecc1a53e59410b99da49974ff1a0010242a737bb4a3dafe64de1fb9e90169e2bc90c1ec9d47c5aaba7d41e408894f5b57ef83ebb05d7828a05cb052605929be19cb4bd212966dc63c4aff58075c9662fa3ca00cccf845d5882a974c083336a624e02accdc2c73ac81a2246971e07fd799a66a575100be856aac36ff572c0b3b6c53e105505671ce38f74360bed16629a4c14543f3035ca8e66601f4b3b021de6ebb014425c0e28ba0cefef6648bd3c9aa01c35b097caac089fc9ac4c44c151f9a7a0dd1b2e8309587ad9992f99c533827dc57152ad9235cb3b473d80f6c4f7f7e0559668e38f65c2bf7b5bef47f7f059cd5830addb540edf2420fa6eb9d5b6e9801865b2e3fae502c51d5e2dba191b27771d994787dade4c409c0c9ef6ba36d66e31727f958c301e7207ca715af35cf5635cd5aa1bea4e1a79059b98133c20c692e8e65a630cef21b080c6448f4f59ca795d0b5efd4d0652b5a1cee57a231cc1d484e9c8b444c91066d17a2cc1f3bdaea16764e997cbadfcdebace0c9137d1d01c4fa253f1fa67f57c430fb358a82ea9c3c408d54f2beb1edb96c395c240e8fa528f3a8280f770d7d91cad61bc3654c4c7ba1eaa8f376ac2947dd409740508485e8dd9ddca038dbf67a47bbd5565d9069592cfeebeb5cfeff1b929ee0e4fdac02891a5ed37e566b40d25a24f8cfd62781594422b436ec5aeda91ebcffae6066d99e3c9393067a2beb3e54a9fc7c59a203007a0e8882af206374c42319f92335497ca6b4a1b4fe9e5412d99366f862608cc3510aef4b0fefff033559e651b097f0b90b4a66166e532a045ba9bed08b138d264bb04efca92a1ed8e4d9db44832f5de7bcbd76b743cacb675d356a713e1b62bddc872e13e56f517a551b7f4e253bef6d4d865a041965c6c050df0076f5e8cbde8608032d5f10254bf8a728db117e33de205d667949c48ab3c8ff074e3d1c272ccabb74b570cd08d252059e87d236b9aef78b42a37f57a596482de5639e25e31d3d09e928c4e68ab203af16b0e225ef441598650f04afa5fc30d431437386ae143f8be703c60d194f600c47f2cbac43521d1d5418843cea6a159a518a67ced6c654a9d4e2ee91332ef9b598d9e93a644d7082864c7870015488d8fc94d55f0b981efc5922b92376b553338fb2d560b09ab25072374bf9893ffd2868ff66c7ab0df0ebea6fb0344296eefea32a1abfc6ce550fae559929c0a0d5014d267689339c6d00ef066e3425384f8f69bc2398055ccb38a133ca91661bb2ec0fa69f3433c805d3fda34da3ad1dd76e49d57a99faca9733e13e6ab0d805195126fc4b293a153dcd9ca2c92338bc1903d9f2aa26159c4bb9f4e1f418a4f17ac939a404f8a508875622a17b035687a6e870b01cdcf4465b1342cae1394b5549ccae1a572313266526461bddf48534f394d48a5d2f056d47d85165dc8339d528c40adbac28e2d379866d7e6c57531871914bede58cd7558481a72f2096fec57a57b6748e8ac2a4172f1f45a0ac3eb6b3566d573076c8a3b3a7ca9367d518bac0e0575178b9012ce068c20e0573b6943b6caf52e89d77ec37a3224f1cde06299f06641ef5444cb247cbfc34254e39357c3c986d58316373931c44aeba025596573243198ebcf3f8bfd124546a8c551ee85eaf031a02f9fe586bb82eb9f26595abec9afd9f739544db10e0eb5fbe98c5124b59b0a852c9d0ea29d36bb72ed48befadd227c218af4b1bf3a8656f7552ac9c7b2f028dd1418fdacf5cd21c08210da4ee6f24710cb06fe4f1e16f34213159c966a55524ef0fafbcd48afe631eb97f6e36e86036c04727d8b432452842b3312ba64335280c72a4e2d2043d26e32c75ae1fc4878df3b207699301a3c66a36e755b28f3ee1da1903ef304f3ac1f5f864d6f199f6d0f7af830a16d5e798f85ad0ba03ffbefca871415487d273eec78be18b54bf3aba4c8e1f5cc835ad1a9d9d81eb230b51c317f9e195312454e7b875604dc1dadfb472ec60b41f9740c59a5d6f4b983873ffa9416943d4bb6a5779336570c143323a0b28cbb295716f149f391d5dcc1db1ecdcb64cc2db0e20b86a546596cbaeeeb565f1c4dac26a74a21caf00b43711883502e700a4cca314750c46e542596461d123a5e09f1ed8fdd8833dbdd171ba6342ec42295c1200c237ef8968e5e30a47f7b4d3a372134357327343a928047edf90d9563b7b53ad965b849a65040116edb3a9f991e638403d3a6d8f573a57e559c96aa19b650a101d6a5c086e2f3c00ef7f6386107e06360c7ac24f5c8af4746e3700a2edbb9dced3eee641e8c9ec5ea9b58217c3ac05cb415e12220d9c52b289843bd886e197304653b3e56966aa96c910761d0ff2af46886efd95fed10b16381b9cc11b797efad12335417477ef3faa0ac00479e46b5e2e27b519b4db8615f67783eaffd5cd7520f7eb047e9032bfe8fef07c85e3d268bf13093ba42e4c38411281b4c8a90b35a22c55ad0c220dadf27777d3a8937cfcb7ab3a6a612bc603b49726ccfa4590c2d14b058981bfe870530ed6a87655b390b47af92450569bfead5fe382094e26833ace6b4893bc4bad872f8d6963bd2ebb11eca6081651368fb7e738727a25152d4b410768a6c9bfbc0b441ca4f52c46d27c8ac174078e1e4d40c7961cc15cf4f78f2d5a482f4abd325c0704d9af45848d30dfebf6c88fcbadf47bacff73783e98730de485b1c1bc96f5c2c685f67b6031fb46861ecdb8c7282f7dbd8904e96a76934d269fc2c146606511d2286f4072672879103a8b9b89527e387857fa32f1186c65a104d6cbd305266ec83f7e3733a334c22b0886ca8aa35d464ddac7e77b046b01e4436233fb1bc6541939b7c21c6ccccc26d743b853914921ae8ff26960b12b9c50d9f9bc171aa14c35b58073a52a4cf1a44546d77ca2be552ae61e5b3ab50a8f873701a6cf7853d1be217cbe566231dd23c104ba5e6e495b438b801f6166a465e7f91e967cbb6a6f130c1114b8bb17d915d901d3814a669e78deec388d6c65ba038ea50db75a318ec4e3c219348b6b8ffb0bd2b57ddda2a94b5e9739173ceaf65a76496f07db65ab4437243e6269a96c53c7dbc2bc8e6a062b993593873e80956d2e505cd6c5636f21749bf6cacc5df8b0ab919dc5d3393faa0d2bda6607e321ac356e39bcaea724ed3abdc4c62a05bf8205a8b912429cb037290e603c1f7f35a82a079811ddcd76f7e7fe3afd091d2b588465872a6300f2637b41d761fbb12be15a90fa8ef932dfe20ad1cbc7f010b6a4a67c8a86ab1290bf826aa27013257ed865bed38c7773ca2c21ccf9cf659cfbe6ca3255bf812df59bdced53fefc48c90dd9d5a582ef0cb046ab64476bdffe659f8e4b5b2d9bdfab88c94e6e671d9774e2056a030ab66a4cb2362c3735d5d18e4f511c2d6941842d26f60244310d9e2d0597005e9c6418da0f20893bb5dd92d076c1292efb18d7e4c6d1ad87f532c93be8fd2d2ab07e94f2be191fd7545ddec6964cf6d24b98378d18eaa4ac1c33a52bfcb644e9df7c7b213f7e349ca9ed01eb3e52f9d9d3362f607dbf8c232e66be97b140ec3e81d417d013ce7bfe1ee1a8b8cf81d6983a791c1965bec88fa47281e9b72b877b301c07a9cb985a6e3c023fb9da37e18fe9d7aa127176fe3406bd7bbc7ed4ab3272cad6f8d75a648f79952368ef03bf3359e845d6215671d2cdce286a68eacbf6c256e257b7830eb4603110306e73c42513117bfee5fbe7ce821af48e15cc7e3a9746d640fcb0dd8f785c82cad8f694d79df9b8d74fd5a4999c2a8c81f5f816707a210f3f175235733a8dd772cf0aa5bd62f78909bf525cb6a4733d009a0c392ad36c19cc87e5caf22f2b9ad2b12e8b590a917900c51054c8139ba26472676aec3b8e7253cef9e2aebedc49651fe09a4ced5de556e19e4120620a49380fa800173b1e957f7cfd30eb72166f947bbf76eb83c36a66a53a966228259df5c22cbd4e3a831fa9e26e2a4ad15089fb551985b7765884ca8093c90fce941d285a83d6e3b2526d6dcfdb334f651105141c9d6b533d83a10cf4285d8bedcc434a093c019a4b030b2565b2e06b95de8d5962a98c2131eb6b887076b868de44acc58ec3b1b46d2b758b7483b611fc2f6f35a7cc5cc40be620c7a5fd9e194883b6352ba95bd4812238ea5ccc28f5007a47536c74719e240a8d64e52b432f850ffc13905b847d2f9dd1dc8f0abd673b45921d11405f1202defdcabe8e5c1e4c4feaeb3d68b010e0e4bcdcabbde7fb0517cc1d46ae79e220c9ee73a2a54d67e6da0f26834f63222d9d665503643d13067771be6d2d56711651fbfa21fe9b9eed24e540227e12436e2e6af0567c3161b7db1f8b053b79315c1d92c8ccf8db15d7b6e9e26b7341d73b2e4718e584494991c921fd9f5756b55a634f6a0432608f3f16a967eedd76600d036749611af95d0cb825a0ac0f837fa9f98e485829d04d7bba805b2d0b34706c44680c398ed5feb12e96febbd263f2b316dc0e494dbee326192b26a68ae07ad177b5dbdf7e53a10792f2723f3e8ca11e61b506482c70e2b6c8e674dbeb1f01c503cd22d367e706889bc4a5b6b2721d3450a5dae5348abeb6306ea03d9a5487cf7f3a8bb5ba2481ac9f9a03a2bc98d9bd6a3ae690f480e99ce610435c27058f49407a70e7038094ec24cf0693db7548e224c0d3ebfae805e36077d8b7ffc68adb0e097cf7c27fc2efa1e048fa8dabed6b06e40d56a62476221601dac1a2fc0cfd2e640a5885969dffbd8a2557519159b087210d5184babcc1ad4ac419af3a78183816a399bb5988c4de09363ab5b9f04b3be45e7d153f6c4a6cbf1f1082f67eb4a19dc33bd23d05b76a09f60528aa63a38bca7b29e616e744fadb5656bcb4636af165f3af68b5a74007e8df5738d70651fd3fddf865e5d029ce2c044cbae8d8a3ae0bbf64fd57e0073e427c9154c45abf16a11159230099615d2da3731c2830e74dfb810cfea84275539338540af6f3735eba9fdc9c0bb5943e5cbe6a3ee72ebe47b1d307fb0b41030e57ad0fc9e352f73bd8e3e33f6ba72ad845af82c1aa048131db4fd651056e48b50c4535201debc34488881d8ba500adc155116d12e564e872b43208bf2b1caefe2d9b549c0b305fef45f6ec1f5c349560276e79c13dc25ca0f9340f93f0eebe303809feac3fc335c29daacf58d5c56a5b1921494af7af4642f6c06b6ddb56fef1b83b93cf2016dd34fc2e47c6c635a508c6c44c1eb78e3dbf5961acab6ee7d9b92a8aa473609dcedcedfbd5f78207ce0f9ce202cb01d1cb9c8d8233db1013d70d0b81b13755da7310ef9e0a59bdae5dc627e4fdce4b3c4850ffbca17b535d8f53d7ab3a99946f82778d8f456bcdbbccc2e457ad9708006c834c8b661acd476b341b81b10880af4587243a27bc3692a39c5eb492c3dcd08099e048f237d243e304538fa502cf1c54b6504921a97cd57aa8f3863dc32e1f2d0b57aff63106e59f6afc3f9726b459388bae16b3e224f6aa7f4f471f13606eda6e1f1ac2b4df9ef8de921c07c2f4c8598d7a3d6ec4b368cb85ce61a74338221118a303e821c0f277b591af6795f50c40226127a2efacce4662fd7076c109eb59b18005e7165f6294a6976436ee397774e0df5000b17579b38d58fe0e1b5a2d1ccf329b4fe10f71e8180fc5165a369c705f6150f8c8b20d8b7b6d64cdc0ad69f2b8373e734055a2ea90575c5658610dcae483b50b73c6fc4693a74f363f681444031a6a0182c67804962aa4a7776d3ddd16b2d6a96138c87d8ca307e8164edeb93638986b46d663de9fe6086a25bf9f3f7c7b40631f8be488cccd3953b3960baad82e5420fb19e8c12416221ee1bcb45a7c497cc8ed44e2f0caa25df9b5e23d915f7827b31de58964a9377c4639f91fc69caa063b78d8465e0caee05a8bb7e71532928da23dedc821c5c66170acf933fc5419574b40da8129096f6ae6a38b8aaf07f9f06ec9772790d04f8c1ea93183744913fa68b3a025da4740583eabe1bab7363aea894f362a3a7f3f56b0bd46a0b6d2266a246feda6fa5cee22c2f33ed9d643c1f6824d9f327719225bc7678cfe4c85cd210ed4077701b0b5650418177a74c71b8eda3306e2ef3474f5d326990eadea84a9686e822878c932997298e01f2b16c42e019e21bdfb67b3df5478df444366c97df1bdd23dc82ce23abee44d3a61e9484e88ed642634197b52dbece451b59118191b309c29884240b31988934ea185148ae0bf42be11c0180ad9e13c996cd00d055575347e31bfdabd430476ee6290b54da97241e82d023661cef43cade1ca04cd20ea3f9e4cdc1c93abd65c7c3d82a71133b4e626ee4642e22ba488e1acd58bdb1e0e121c425d82e0b47cb88a9ad166701fe5a40cce02ba26806095e736992ea99d5f507aaa8aaa2f0d761f8bf3138fe4de83000c44de28896db6e811177b59c33f6c8f3bfe09fed90730f612eebf6fe9f01b9ea80b2f0a954415f411b7f299b274a402d2b5420d69526bd091d64b92e9e52db452597bdcd4841c4e4ba0a55af1cd946fc158c9326a4f55339b522ea57f3e27f5bde84b1bb1de285b3159fa3a0baacc3aaa51162a568eab9391eafef4146b98e72d102343d792d8bf655c67a35aaca9d7d056af31b860cd7517f9332b43ee0eed32698ae190528bcf5a1074237943bbebe5a1fb050a96395c900541978835e89c606cf871868dd01f722eb646f1f080cb4cfb9000c77f8dce8cb7c0e54be3b4592992e27024a544346fff946a2f43871a989bf4a1698d292f80593781297800c81063df69f5594682861ba519bbbd3d4e3b3b9f837b5f9a13fd91fbf78b534c5d976845db72fa559e670b4ed211be21cab732f71377676ef066daa4a4fc15f58e3108cc211808fffc7537183fbbc6c3349f1aa1dde82506694e9bb835e6209ace7fddc8e76f15a4115337979f24779000557b264f3828fed3376dbd16f413bab2d64fc2aae290f0616375239ce64126b27cacdae401d3c6b293c909c4805fd3cfc6e75fc81d1b6381488862957ba3d5cf67485638bfc5ecabf62654db25755479e42ce6eb79155be554d9db354f204bbbb7d61eb9dc6fdf13d10df4a75df4db5590a8fe71710f68022af1d3e8fb36f70bf0de9ae3e2421c8eb7088fc5944ec6c76eb41cf6af7a066c2d69031cea68564474aa61535bed33710a7e7cb262f3a553c0f6b8d78ed5c587fe97df6da734e7d9e5f1f864c3b1a26f6e08420a3474058f59e958b099b313e9f116df47bc1d2a40b72dc6a4944ff7de341e8619935055ee7bf4730e5a927006b75e79378381ac2d5ac662af580892420f29af8d1a0914d5c9b0ae4d3be46862b3e733b9b812dbd4534442c1898c003f51c224b1031ed0f9a5a650f9d8297b827939954aa44137fa333feda7a33ac03a9e709c42190208ae923e119099f217fa69de2466e28d5ee37d01d9be2fa560a867ad6c9cb6432a8931e046be0baecc1f283d57aafd67af4483428d61a94c501d2fe11c4d5552c4fdf75596be97e0168516efb5635f60a781f86a7f5e8ab01d1d69a431c080d1569144d6582ee90675a0c86da43c72f8e6105ef235f15e41360da77f3392c31f5dd7bd1b218b59b26816af2fcaa2f290c994097237c69e9029826bca983096cd5935c26c796084547c3b5dbe9f1338d8f0718a52fb4ab62d6600192ed626663bc73ff772c62ad36d10a336827829c031c93d741cf6fa5f6989fb521483e0cc1b265abea6ae66c17cc3d2ec240c33132bd25c3958c151d4e4f3f8890417fc42cbf51a9a708890f904144ec10bc1ebcc379a526c6ed0edc120327c308618d544cec1f42d78eb25c483707b67b21fa035d59fb46ff7bc2aae9bc3fadb02ed084cb40b7bba284cb1de8b66dd32bf9bed0a963106c66bc9a4e7b836f90b132b11e4ec4015f2f733b1817c6608d47cbd4e94fa1cadf233afc92715f9fb232f596e8807ee675a7e36a167e70c82af820a316f61b12e95f7d513c7359b75d5cfee8ac06784c44315ac0dec5bb8bf3657f932146d8d1d0420b021528789fd757d510308bba1d15f662a53a93b09230b7700cd0e9e0edddf36e75e539c440684a02743db54a3f301e8281f09055c529157b76ed843b50589b2e14744d45805a5d0d7e9a2c329cddd043bcc965b40c25a829393ec2f2e08961d146890d0448f3ba7f9511997a1a64342bbe8dbad5506e9701bd8c480b87b76ee172ee2108817d86e02068a428a30c73c4ef0436be774a0b8c6b9ec1912b2ce9e602693059113eecb68968f4461e1fb596b8f582796b022c50a93ed389b62efb665dc3e200e27f128b37d932db72e321277f2a460e12dd21d7e03226fd0f06ccebebc4e104da8720e6928305f089a1e002ad692983562513a9794363f41efc83fc1433d26de3a03f50022d168c4aa019acab7bd3e21e20294cda393277cb57492240d96044e4109750efa10db79d2af5aee028ed3351188c4a6ddc3a8dfe6145e3d77f3190c4204f6ec1a591796a859c91b3371f7cd953632b99f4243e9f60a0ca41ebed596d188f32e0024adb99fa35dd8e7210c79d1ad775c5489792969d815ce6e63da7c6408125b580e1e413d1e918d89f691b85b410b25ba13c92cb6011232f37c983b7df4acea6e6fe9dbe52dfccf887d181796b3569c2c7bb4527f177a682a838f4283f15b51cfe480c83c5408058f2f1ff61856f236282bbb49097dc6d48ff320301a60863808e683b4b7133bd5fa871a0254be567a39ae4e5ef9b6801ea0561b72a5d4b5f385f0532fc9fe10a7570f869ae05c0bdedd6e0e22d4542e9ce826a188cac0731ae39c8f87f9771ef02132e64e2fb27ada8ff54b330dd93ad5e3ef82e0dda646248e35994bda10cf46e5abc98aa7443c03cddeb5ee2ab82d60100b1029631897970275f119d05daa2220a4a0defba3b7d11384bed2af738eb1e913d9b10f79ffe8dcb8374060a028084ee7fcc9713386d8fd81c67ef08dd741fba45016175cd7a06986cc7e2f9ad17fdcd04dc8bc862161f8507d51b2798f96b41713d73f33c744556c212181a02edf66e8045b420e0022706b33e959c91036aee68562cb91374b1cd2f5b90b52a8cd59a9c10f965dbb91124caaa45aff119848bd354760e7b02b2c459ac32124c7c0319004441dd7ac143a7f12213a8e0c421de5940383c9ca7b005e80ce6799143e9b353e976d2e6a42757d2ace7ce858ba9b1a3215a899dea135685849431216bee303e087f8a46ea23fb1553a96a09f684ca58ffc33ea7544480d81a2483237c795768a7444ec319a15d621c41c4938d1af121e25da2e16ca94b88d87eb7bffcf4f17ad1ad6585bb08435f1197244cd9d4f0a6d30fff74baab7e3ec68a151f75c6c61b8ba219b357c076b73994d25c61188e8ed9c19b87c6b2e3a1eb31e4686e579ef4df0bb0767631be109c1e15eaad4f9282fd5bc0431927405a4f596ec5700f41acd4d073f59fc3e213431e371e46e2c52946c6b4d03a705e10faebf95c025677ec72d9aa595adeac67357d7e21b337ef2cbce8bf55b1f7056cf5d0ce55ac94 +0xdf387001cbe2401386ad011b2bb2fdb48b156c3026e6548f7140838ab2383f88bdd44d4bc50fb52406cd9fe8ff7731f3 +96856 +0x7d55c926d1bab1666c1945d4decf3edb36c2b9b122f47f895758890b33e4c401a1e711533e9d9035ba001e9f80e21cfd99397329cdbad4960ca945ce0defd91e356dbe8fba907d1908257e14646fcbefcf7715242da4fc6ba68b8b2f4d08023eff8ed9c48ebb017a1f306d1bd19fd118a025aa8c88db7e72eda865163a59c8c9c9f369d90347a3c0c8c8f49c119ab8dfd3eb37482786e212a9a5da6b1d07b227594376b65f5cec53c995197f6a8707ae3270c64052ceb1b2a12df2163e3d49c077270943ea21639cea41e6ac258e47ec835d5e5c51db72bc9ee6b6ffe52113fded472868eebf9001f571630b89d9ff008f5908846bd4ad9768782d0e5adb9a44824ade0db15efbebb0cf9785e08db7541e0dcba0e9e1ebabc78c602ce49466fefdd9301a7c242dc3e5038a0070d5f84ff821af98132cb26083ca553fcd74fd94279b2877973cadef5ab5446583d74859e43cbc5431da8d1e63d916305ba2e96cc839cd0c4acc03d9d88cce9d5fbb32daab06fbbc8b16014d3062abe8d747b2f0a85a27c1ddfdb8e726302f8f4caa3b3a152973b969069855b20c1a4e898ade878ea73f7f97f653830e4a6f2294ccede2ea4a2c3112d2d99eb1806d49b894f79843c71c2cc2e05c14568297407e48cf38f2142f0ecfa34c90f565acc3ad8c858d9063c6b2a4e25b02c77fadd0514669a5f52c8336e8a17a944564dda3b19b0ecd3b2346f78525d9b429eabcb956f04492ba3d3093a5f3ea106b250ad10ae91cc00caea3e5afd05e94446ac9e5d56ce7650aed3f0b4dc2246e2d4f3a34009d36cecdade563690c7009dfa8de3b15e2da88ade4b7882a35b114548a76b6dde0e55f44c71558fa01997bc44b02a3607ba6616bcba0f18275186ca880c53ee7d9afdb3aa53aaeabd66052b9fc3e05fc5ed25a0c4a032e9ea9e1dcf0d62fb568b11faa78ef5c4cc4b44df78763994932b5e6d95708e726c6fa95cef637bc01a68fba34c34c831a8dc2e9d0f6271b584aa56b4815ae54c34290bba98049750bea9c0ae2e664b8004d29bb46cdf1cc188c58e80e0ee352ec5992dbd557b461bb7bff961aa7e002e64e104cc2d668b57240f6e5930a50ea8954287eba432188faa3e1e645d0686ab4d6a022aad735dd4eada6ea3fd19d23837b7c2bc00b38f3aea86a83cc27a3f7522e00c76799ff4c951c91807a2a7106c016b36a4f79a0a9c0d3c1f415753ab1a89e5ac362e46f0b2dd5df2eacdf7499296df8c3cf5302b2196c0fc18a81d4a09f6dd39c027f2d210020b77d3db64fe6a6c871bfa86205179fbb7b7392151acd1de595dcae34e096f54541f49578aaf5206e46e5426e52df3c072e9194f7b43f0b4cc80ad0c93073f38ba71b1ced2ccc7da8a0bd053f9012d79a50a3faf049fe52eb93afcf07c7bfe43c0e7a3bdc7e75a7bea7d05a9c68b958ba08312bc88113d80a1f5213b64a82af9ea09a580e48f884f882a5a74e82dba6b07ec48f47068587f1947b049e64c43cfa8502dd4c315bfe9d5ac5551e8580abc4dbe38e357d5c46e719b30a86bb8e7397e53a305ce1a8fcf756b6cdd11ab04e3d4717905991a1fc35d6808d38f7e73cbfe7cbbb0601e7654c9f027632e8747765e9e7fd7ce85b9324f46df57ac1d87fb8b33ce414391e23e55c30b70898d30e82eadb3d662a92f2fa9bffaa15c16824cb7215154c30571d0ab6c9fa1ad1d6fcdd717bb8df004e01fff2c014d19e9f13404cdfb5788f993b03d554a6313c8427bea750d7af1298a87d22379b750085345f68202c5efded6517e059231580e5786cb4e1009d0777cfba52eca8cb91236f6fef63e1c72359838fff61d88e4601d731bfb69c7387f45effab68a199f680adba082d3e7aa8e87db35cf32f6436e12d53f05814f73c163d945532f0a8daa4d486dc08aa41369f3bcb1c978f5ef78c601b704ecef2cbe555c177d2fbc0e398ce1c937b8de27288a61f6ad56046320a5ad16720342bdf698cce3ad12ca8b96381c4540f502606aaa4f76c360be28e6401bdfd57ad6c1eabcb02c5b6ea2a050dd7c6474a59d59a0d1e9a4a41f6fbb4a13f27587aa07b30b2fba741099c0c6f9fb76995b711b7d5bafd512d7f8a584bc9fb56a3117721be860203d553ac179e2008f666dbe09360b827643d762fc3fce51d9304a599267030ca5eaa1a81133b98b4b5e1402f33e20f861ba1b04e026ffb8c26a3bd6e52edb73902e7e983c8ed10a2ee2f6d645d04c801bd82b54dde4b163257a9e15e6dde233936b5451afe5d8ebae977eae9da6eea7f94070b961f393bf66e3e99d13eea7db1413cb8ae7c331de4ede2402472c77deae6593c8f8de074c0b2896e2f8ebacc886ca3c9a70b16c2084498f67fecb88a29fc9fd0a2efe9c8786cb3e7e025f518a8ff13016d73ae870e34c0946012e817241e024d360ffb4007e4e38d4ccb4469f842b3e6687ca473de0683a231aa002fc394aa3db2b3bfe2536242e6dc484fc8607cac0201eda08e610208a9597da7d7eea5be2780a4dcb8452ef87cf663bd3cc8f725dd9e9049e17d6f7831405386198d9a669407aafbcac58f2cd704e537ce18f947fda92b48731b97fac04ef444fc88bbcc0baf8cc41ebccf077d6c97648538cb39ec8887444d24c0b7e0eb278a88c7501514e014debe1034b0f8983eed6911b52432a56ce6757e33d6187fb500c632a16c370208f2b2ab074fd0eea5798289fe305566a2d6f5133880f072674dbdb2f6f7fd7d31a700738f0e8bd893b1d989f084df35f0bbd5c916ddf12c031a762d96deedba57a6b2521613b3bccf3c75fad14958791f3e1b8a1714a216510ef78cca4a901f4297d02fe286cf0422c45ec2eaa64699f706d13d814e8c961bd24ab8da636c15b92060f13c90681754ee9dcb83c433ff40bcfeca9db23515270d77980e500b0586ec6c826c59055d2d6439fbe4cba612c207ab18b36927fc3e688413ad3af5556fa1fbc9ba082e3e75ce3a3c54e2283a4590df110b9aeab1288b7b130148b06f3de816ae6ec56c22f3d3a9751d3140df90fea29cec6e049ead1d637f50a3c6b9b868c419cfba4571701c8d8e85e176696cfafca1a00dff2995c7453ee372bf9da7ca0df2260c4393b451ee6ed51a5241a12cf6096d9e63bca730283a02de2181d3b5f921bbe6eef18719d4ff54035dcdf73b97ba9c49b6beac00145af50f76cf05d2918fd66ecdf1b11c48284cc51e7636d0e89d743882976de11286032c45ee03c9dc22bfcc68fcf90351d103871da42592ef9a3f904eaeaf7928a6755d17469541e2c3bd29477b2876f8e2c272e3c08d2ab69a437ca36d3d7061a393cc733f85e2ac5b1aadf3d4061c4444d1aef730363f4583ca22083bde6fc263a59ee1419a5541d01c7ff3715b9e3ddd7862e15ee87aa23f1aaa0580591e55cff3fee9b49b42aa0c0cc8cfb8efa3eb96ffb72ab06b83d7b47b3d22a5772421cfc51214005150edf532af10138ad45758add459908601eccc3703e810002a2e4c6202e98d84281475d55d3de9f3d98809cce1f665039ce76d9523de2abcd7852c13f7f1c4fb7226733ef9dea1f3598692a2088a97a8fdd281dcc58d5b72d42d592019b20b80d52cd6b6ac7ba552fd5adc786f9c8e3eccb4ef55137b0cecc82eb9d18fb6cbd9f92d88839e9d5cd86c0bce953eb4b18cb0969f483232a3f05c91366d82856dcf873170edf6cb2e4c4ea14f439e5a6a5c527f79fc4d3a8a47385db73e19a5572a2741763edd8e83784d2549c8b71721745a7765bb8a1927b9039a238a7da0f3b2806382bc7a6dc3220f9ea36db0723c9d6f874bcb1159e40d6550649ad5fea82f3ba17cb1f6f056133c14457ab1f4249f39b513750b81280d088861b64a45dd68ff034c63789fa5137d8f1737e4234142620ba501a01a5a7f914a022604fffc267590db1b290316ea7a1800eb6f8afb4e8f91e9b7f7abe42cab9c2f312ab36c3145500f2030a3125fdab6ebe07aaebb8a6a4ec8df39bc2ddcfc88d020e4ea9551164bd1bcb607023b4572bd5c2e19e7bf9b4a28c08dd69d562c15cd3b5c2bdf4e908a0a35e3b84c4665535fa8b252e9b5ca8df3a31c809c64e44b0ecab7feb2ef5c14a0d4de3d5a48df61b90c2fe127349e200fd00e4292cccc337c1520eb76fd22f17de1d01e92095ea4b3cfcd4f0b04bf0a668f8aa4e7578bd4fd64bd7b9341892a87a4e0e45e508825363bb322fbecd653de28b82f03cdca377afeb63571803ac6a864371625e705eb28960ae561b68b0461e2c16a4ff63062dc2c34a27885ddcdc76bfc3c4e947efe7329f91da4288523d607cddd319a665f09365f4811171948cbff58df43209b67fd3ca9542c0b6dbb24dd031112801336eb645eb1a2fd963e9e6973866b53032db01742116126ead135ad8c8d5b71e0ed69fd5a659500fdb727f174b92ef45f587201ebddab43a56ff0be90d97235748e6a4b7aea50e8f6bb4ede8400f4cd56f12d44cc3f7228459c3d5a367ec1947920d894e7ca3d7d2853fb7acae425a491fec8260ebf1e9e736104c7a603ae5694ac9a21c88dc2863c86160b6fec2942b78a2bf0d9e5176dd7c52d4e09f0a3426f39983a46b949cdd95d87da9aa1696f719a3ee9543ac55d18d0a13787ce0721b2cfba2789d83918a8de362f74894bf26738e95ba8459136df8a46ca472442bb0576e82fb871fa3051130c52252e3895406b148cfc8ee1bfd3fc054f727abcd80e370a9bfb0df4dd7b04ef8ad418991ea53ca7c5799e1ec19d2dc70d2f59dc40781908b37c338fe6ceb8c820a9cdd4563db18a4e47fcb105e425724da7470cbae925cabf606b3315f437805ccdd75305b1d5a56f8d30005051edef5701ceb41009623807d23e48309289fd8668be7cf3a8ade07074c3756d8c8c277366763a0882d83bd3f832360053b729e6a108b9e7cb432498233c77223c0a01e9fec6076bf98fb96afad1654ddcc7ebc4a13f71abc29e5731c2236d3909706400f046830019909b1501a33ddfd8c42a6790ea0b0534c663817b01c1789dc53a01657e169187e2ca1c352f277dedb3d0189592f1bec9c42ed1745ddaa89d116a3484f729e4ee8d2dc7bdfd89f1c39ec41fd8be8a9e2a9fa268d5bf2091b45cdce1763822c3f49aab5dc195cc01038ceec482f63e6cff5fa690c7affbfa88af785062c96bf441102e286b8059765586364fbbc375f2ef0d218f72b6d3acc11126c971336a3f7ef79d6ee145971760938407aaab97f6a3affdaefd5b1070088bce93cbfd896e5357df784b6cedaecdbbc03578380c41c350213590271a0c052458f797af2f476739de8ed27dc5014306d2214cf23d9bf6f5756c55a15a485fe4ac3dfed2c39463a481f89e0186da6b7da2134f6090cbe4a8e19a715136eebed3b2ad27edaf1beea1b0fdd68097ffed271953a90a6e9b36704d090fbf17c4ccfa538e3a885aa5b13753e6a2806238700d1d28817840d19456a1ff557466942e60752a612b2cf9546e53fb2b8b4e4f9c3597dcff336c36a560c5c56bf789248f0d01c7c25f8de17e4e96849928c30a1ba970b54dc25c921298a1a37ad0ea3c950ae0ae85abe523d7e005c914e0293392718efc90ad76ad82061ee0aa88efa6e85ef827d3989c88082b8812c339e990ac93dbf8f37d244e9eb122c622a6022931113379d4ad1ad8b93708a6cebd69ea0f193ef39bb9cd3f0ea1969b0bb28a8c182c78eeaf72c8db910d6bce5ef41208630a9e33b3e9d84679de63a88c34ef9844b6aecc8d6f0c5839b49bd29b654cb4516fe5016195af2c88716f35ceb598155eb7bf5c952d4f1959347efaac9880b4804ffaa5cd46b9b8e261a48af9bdefcb0d3892e6f033fae49896fe8db91514d19ab2c56721835eb42fb6e9ee34d25b81fa3f0fb2c50973829ee102d5ec6572d344a12e8f82d506e6197825aba77e4401cdd71e073d3824bb141d71186b0f008228221d641ac3191846b042077b4812112d05a72f80477356a253359f5e9b28a6ee407a2f11d5ff105e66274bd8b82e7ac2d39270b5beca1def8a35b2ee9151063e002d388f9321970aa0bcbee557fe033548c713042690d6a4ca5999427ae26bbe6c1ec7bb86e574f268e9aacbaceb762e6c2f5f96052d4a681b899b84de459d198b3624bd35b471bdc59655b1405e9a5448b09e93e60941e486ad01d943e164f5655b97be28f75413c0ab08c099bd3650e33316234e8c83c012ad146b331e88fb037667e6e814e69e5f100b20417113c946a1116cc71ed7a3c87119623564d0d26c70dd5cfc75ef03acaea6f8c0e3f96877e0d599d8270635aee25be6d21b0522a82f4149ec8037edaf6b21709c7aafd580daaad00a0fd91fcfe6211d90abef95c09ddbd4419f85026f30c3b25f9dffb76875da39e33e15093066b232fa7d56d1bba1f2268239a2eaf4e6d6e390b6afb7389bacfeed1c859adb4b574b95f7027ea122cf6637b5574e4673a02eb82c887cf7336744b012f07bd77b5891eb82bb457b0abbbde97d6ad66ec16ab95e6752afad255436b3861d542ce0fd2b838748ce5040fc531ff8a32973b67bac0acfd5f76359bbf97ee1d5cce3618e41e56c72c028acda4f618eccf05d3c1d3045ccd8fd20b6e4b8998ce08b02e552fd9a9b01c30b369fd937a7abd2343a966d95c62568ec2616998ded063a94569285297abd8102c6911b2aab0a7801972f8a852582e1cf919ac4e06e0f819e9b96011a736d9f1444fa3ac102af89cc3d30af9a51b810d2ddb9621d76c2072a9ca69af6ecdbc84a982061851562ae9b13e1065eb28f9cfcf3b89bc96ce8753f410a77434fcda2aaaa4cb6fc4aed8f780189b458b0ce2e56bbe2966eba4972e67209c28c030cd53f62c561b00a17d36aef72e410b43f6de61d7e7c93c7ada72617eca05670600a0ea9d58b29bea7237ac5e2bc0f24a802b602d374c1fbdcbb0718fc3b2bfe90e92165c25cedcc6626ae6b2264dc6ad294ce502aa77fbe9d57915d7ebb921566197f80d5fb869e1c8510ca7a05ffec85cc34f1cb3d5578ba23cdcebd48141da84330e056917c9a90e7a8c831c701148852f2cbfe5dcb91f9c6c2540008387e1f0e3d6f8d45552a8cf57c4e91d16949a5cd10c80b2f6a7123e978d58e2686a09323ad13c1409bb5d6579745e04cbff2a2e594cf39dcb9810033f83ab0c886eccc2988b63ca9d5a337b4fe93675f8c79484388c7d28c4127574d496cae17c1c891c9d63f44a98c5b77b4bb226e3356455f8ff39a1c6688ccf1de7352d03abe9dababa096226847475e00d4d83defa8beaf70de2f609318d9978f7fd35e5905d4e376eea31e0d8eceb440549f1bbc074cff8f506ee53b79b40f0874d99f9e1fd3ffd2c64e7fc1e958401b405e52c2fd571994513ff58431c721f05a4bdc2f9304c769327f8fabe14dcb3aa2fd28281147c326e98ad699ca7997f03a105d34e9ce05e0391e94f4fd161d458163e617cc84c6ed2137d1a0cc3138af1b126ad6aa987fe2e313d7c3c619fee3e67ad3b6b476ea93002e2ec2bd59cbd605384b3c5dccfe153946a041c3bf36bcd829392e5386f6bd8f5835262758190c006a47908ad14a21429f37957c708c795f585ea6311ab415d59b2ef59196eafa1590a7f7b90f2baf0707e3e97995cac283ef8b47d49cea43dae06056847b05474b93b49b73ee69678e64ed624394b63e4dd70839c67261efa6101472876f349cab59b3a43fd6cbf0e1a09d2a61d71996c4f61da38f06e1c04211927022da3da13bcbef3aa62f1bf308a13b695bc4ba72f13512adb5be325eb5cd2279dd24e9fd05d1af832f611f1709510f46bac56378da7c2e81c2041b72072a0cb541b5005911543aaa62d4a005ee9661ea0441da5389b4bb443e3f65a44012974bd5f54a5c653ad9d5c7f06564bf5a787dc4a0e8a906c3ff21afd6d89b696c0c64214d8faf0b6dd42de71e38dd82849d267f4955235793433e9f333c008a20b327ae2396f90bd373d949c4df1841fc180dbfa6e968860bcec395bd597aa915d4bd03e028e36b56fe01754c23bc03aa315b0b1e6c219b12ead91adcf7b2d035b74da9ed0d1535ddbccff41ccc71d1763038ec19a5f59c92dda8b5f8dd4f0667a40026b00d36714ff6694d9ea2e1b2485ccbe9ff5d8d9372f057ee79d4fa5493e2fe0493efee2596f4f708386db2ae08fe3d8a395c90879a6b0e4dc8a45bc0a1ba6ecafd7de75b99fea2ae54f48ccd9e5eb5572d6aa781f196f75b4b1519557a747801567dc61a405c91c659001818f2c45cd9444f7a8861b8379f6beedd180458463005b8366b7355eed8af59fd96ec785a97e6d2b0a4d21bf9a190f94e1328adfddf74f6dd541a32de6cbec7e44f75c1d6197cbdf1dd2a0563ea23fc154dcfbdc8970aff63e01d3c8b0bed12754c73e9f8e86cd6e73c52bf9d018ac0d9cedfcecdde2f9a711464b81d3ca6015794d036ea8b20e638c83291d06e2f0d439f4229343f4b91affad8f1bc88515d332f72f1d18afeb48c8ab2c224ba78abfbc7de16263fc6aac4995f2e8e7654eeb0264361d86e700a8c88bb9cc06ccf61a84e9ddccb6809ae59f9e2b6be8e187c778029d024beddaedfcc3365cd0c9bf8f23d65c54a417a6415234ad2725805cf2f450e84e002ad692e5e046672234439839b2017cb528296a11e7dcad35d84ae817ed9c632c34703214414e7d83832e90070b51b78248a0aa4f265e60824fbe3153272de428715445f884d3026d3ccd314c40c19773ef889c7a8e96e3935d3349269c11439d97ef491329588857c7cbe65a00d59f02835dbb247f0a99019756aa12badb03f3eeada5e48d6391dbcaa719b0ba0220c6baac80cd764e03257474de98120f97b40c1bf6fd4f789151abcb55f0eadbef28ebe187d612c5b4a77b3a41372023816666c6b6bdde0c1961f1b5259b01c73cc19d892afeb3062fe022039c60739b6383851a6fb6c7928c7512f1030f9d58abf9562004780583d767ff6d2ab47aeb8073fd938c788aa08d13b60b78cf1c04af589c328f0258c33db769c38693a4989ae026ce876395ba7db62170e17a1c6fd967d63d250e4b48d556f7c33a9e8f370530a737fb187744f0e50bade7610cde9c9f9aac80fc4b8940bf3fd8a135a92b41fdd54c61f7bdd46928cb3ef5446be58b78600d1d6ce808d268987074e970f9e39057982691c7ed48e9e6809574c829088abcdb44d08f4c3cdba827003a75376c90a487e36733f432a0f43f42729ffda63f1793a1b7cfd7d290d568ed9934584f9722b812f8609d99065aa776de51f7d70df6c2be8328102620a6c297962cc0fefc78952fc5fc2e0e52b075cd189c9c3d9fd0e4f5e30699b9f392a098a1cd261d390caba4406549e54e6c169fa1ce5f2c3d3c86d23809e900823f9f5b5ca3ec0ce565581af81a55c0220406791a65a5358ea004fdf2a0729c74f42b6a272f87508a0946fe7da9f611a60ec1d3d30122ec0c91fbb3b348bae01456b14f81fe7c7a8f6ee4b911929f7c22f2d55a7c0f4cb23f88e7adea81466e18eded760d6f500d6e0cbdf58442a6422146bd57761e871a800b454728d899a8cb101c781a10967bce793f1e1658cf164970e665418d6697768f8109cecd1922d363eac04870b437f92af4ad78336e6ad407ed0e6efa6fcb9b8c47806ccd696eaa6fc4d9091e4dd4a6a85b2e0a7108b289823dbd6ed406f96797f5258357feeeb88a273cec57a7d43f67ef1a4d80227fa26664fcc1a8d0d353290673930b4e159649ae6652db66a92be02cecd1ef4044e72adf36f7f731dbf6b617f52c35db85cc34b6efed180ee604a7a120081ce684a0561906823dbe65bac59624bf963bc1b2b1dd341b7c14fd5234c85e70a789c1666ebee5e0faeb1327ee0d7cbd7ac32bf2778dcd5e95fd618d0e2ef2ac0dae8db1db1d5fa49d2c66c685ea77a6721656f3cc453636f44cb52d9a31871acdd93c1b31d0de4db316d30f33b9a02b0aa9c54f469fe924f5676aac7f6c863d467e7efaf965dc3ccb2eea6a5e07808ba301e96d6cfa50b937f1e492045c6a842612a8e99838f40253c90f709b309378e99345c6a5f127643a60d566ff7dbe9feb4a5c5fa4e6902edb99d4ba41d153433cf26ce397f0c7a65b389fa3974cfce0e46a0bd595eb4b22c105bc9008763aab1b83c16ca985abf038ddb5d08236afe7c01639d3e1b37f7eb29139aa457bc3f113ebe59a513c5ee241e4ba6636e732250cc358e31edbc7a31ec0ce518f7e89b5a48f3c2535615afd14d20fed3bcb4e1908e60b8bb3c09e2064190d3e5cdaf6794bd24765bcb12a91102a48cdf76f3e446312a426370e8d87210e58c9243d94bc78799a045d98385ec251d790f02f9d2799cdc55b2f11e047e415437a7bf2deefc8d9a669ae732ea6a9fd4ecebc98e5432b7bd182f28760d31bc25fdacab74f93bb76ff0e15fe5819456110efc337912786a17b4627bb79c9469a0052a6e76138aed5f67a2a865f271331c06c9a984b3539d3050d353a858ad300d78a970fbe5f317b3f3662a7ae4091e3cfdda9175e0cb3852150b1913ea86fab37daf19cb177d1db4bbb34debff6500ba1bb8541540e923c32b9133bef927addb3dc6d1ad5030e7a7e8147982ec8cbfde87ea5b2c7cb447cbb9ed0b712e9633cddf75006b38155ed7a10e1605538645f06af80d823b358ab4e7a807f631dd72d18c450ecb7833688b0f2b8c3ddb5c7838eb6bd1de2672d5c4df499114a904542f6cbc6396b893ee0a5af243f22d1542fe33ca110ae4751145c65810923e11c02ea66467939f3bd99da9eba4ecf1b98a89699d34cc1e46247dc75dec39990e9d1763c5838cd6350f8c249f15f2ce513822b66da2ed7cebf8b507e18cd16202d532ca651d4705897a1ff595ffce6ce4331142c0c235a56e7334b16c5a2240f64fc704ce9f8ed33d019e4155cb46747a659e3421fe6b42d67f44eb84bdf3dcf1f31e38886f27e85b8b503368df238e1bb511b515bd59fa2c032bddb31d0ddefba97f8f19f7daedea027ef055a52c61d00bb1ec2668c57677e632b180e339ed1c5931310b9d718af34d70a3a4832b96a04fc702db65785ebf12a18c73753db15deb7d45e6cbb2667d546e72dee3e6d494699b1ebc1d3a590d6ec098153ce1d4c547abf330e8672a90ffc0858a2c27c4b342756952f8d20f68e2d6fdeda0effb5d560365735c567d3436ad0530c6b40e05c09d0b245f0a29d8562de3840a2dd02cfeccc0368e480872e17e1a5919555992cc5a2bbbb8a84f65b20b7160e065fb3a28502f02e8047351e87ceb8c8dd44d634ff6f19d6c752818deb9cf0b8b5d248fbdd5d85ed15465da33eca1518af8937f2fb78654e4395df8c37f260d74def234a3a4e3d2b1fe8614aa1963307888d3ee56e6126887bc950d47a49eec02af0d30c40579e6f1cb7f07364a5ab2bf4db4b9aacabc5fbcc5796053725e329c9a1e8b063fc223f783f8bbbdc6ae5ec70fdfe715adadc3ed1eb1f8d02f8f66ac65cd4d539ce5102cee983928d686bcf895fc807ed50d1b818de4dea424581199d9c17f92620a36f8d3088860c20a55bba9b28dcc8b03f0e0dbba18b999e2bacbbea329abda5b1bc4fcf0b04cd264b07611a914e917b7c972d0ddb0f5d654e9aadc1a51854cfd49f62ff6bad34eb95693968a20bcc1522e9e33f2ad4222d7279efacf010a001b48f835c5addf7d34cd7800fdb62dd1fca7cfcea41887c793fa0fe26940213ddb9e30d6039157a8fa9f8f17a9e0248edcbd6a6798f8ac0bafed655a9117b24d65d508d9596e221736533ea337a589421bf7d8c7795598375485082bef8ca676e275e6086e4d2a120e72ef6b4e0e4433e0de81b6ed383592a94c601d2aaae3017a043429eb3556e1aa83093897213ea954f8cdfb9ca86a66d7c9d6f7eb765236540c5905772f8ecb330ef4d2bae85dee9fd0256030ad1ff90584d083d9fadb5c9914bd64bb42ba19d19c17015e6b8a49e8ebefab4e4f3c955c06b7879d3d67bc70a5c80e5e76c314abb4dc8d2bb1ae0157d394a5a097aa8004d6f4ccde47dc9f0246e2ca09d38f01eadeaa3dcbc2af5f160f7d16ce8c4f02247ced1a4521244b777f73616462072bb5a2eadae3a677ab4a2711c680361465e4810c387ad22509f6d8e39c162a13d93589022c1e65ec2d1ea3b77c5d9ee1ef6d6cb8f02462c920a7da9a41c8339c52921a5bfb2108f82cb80cd9020dcb9feae7c55808ebdaf6dab30c0118218688dff3de5d0f979782f240eade1e39c5349c7a1556497941967d42f67eebca2ac1c8805b7030261871c5dfc32e9989958a4e4ce2197b739f90527b217a806a272d55631bfd257695afeebc21313aa442884788b7096684fccca187145ea0aa86b6cec1a66ab7301523b4018b4fcb33d415d154198ed1526132b28e579013324e437ac58221aefca1b561d38af012dd541b32d892108685d5aaccb7737aa1a987bba2943988d281404d3c5ca57cd94bc981b33ea9f74bc6611c382aef8212b83a088e595309ea68fad38cc4645be6243b2f9cabe7abe9bd0c703f1053122d066e11863a560bc058d72f9a334ff50111b30c3549d2942811de8e27912891bb3c2bbed25fccf61afae04aaed0efb2f4ba3702c540f41bcf6adf5e38d4f567840179f7b9f13c31c1f61c0a0fc3cbfb86c6d2f896b8d5a6a87218c9bc0242fb50fe61a484182f267df3945807356b367ede89d7eed8fb9f79ce90b5f94298b7e7daeaad7cfb2c3c15994e1ddc4e58cda5a9668516c8f06c0b294f0c38bd7d02113e1dfae6c3bbdb5392543fd7351926c3d070eb56b13c7726295eb4c19a7c4495d200740d97646bfd83aea8401336aba0faaff1f5bb65269176c497dc021ae63c3d9e0138a0b054dc17623e5f0f38c203d02c803d0df5e316b9899bd11de14ece28fc8aae0626ffb8f47aeb7b52a6d5b5f9ee7e74d074157b9ab6aae71258e5133a24f8b8f04fd259c2fd95de03084b7f1efdd5e32b682389c052ab680a0713d21c1d319e86b136862af426ce4be78c27e7626bd2475b7708d465859a2c7741d575ef1fa8f2d69409d366859452c90075fb242a894bd478c07df822c6a12fd5e2eea3a91e594652a8675b9a783f390f33034bf84f605c8e796411693390b739c22f3fb647e687da2c8bdc4dc13abc2127a6e0bf6eae7a21fa31bb422b2298d33ddfce306cbe23925ce9ef86b96ddc9e1a8dea662c5cb6990c8bfb95f47f590d1aa655fed50ca2e402299f2da6fe20eed56071d5d293985f771adb4ad7ce824e232ede08caf68a37e4f3f12ad11510791dc67ef4a77aa9d90387624a1c389cfd1e1c703693a465f2ccedef6582db35a7bd6717abf53a7070777a987b0be42e84d41b1470773fba7f80c2a0c7017716e17bec47e202fa758c9d9a86c6ecfac04a0dd1d19ebfef1245c8180c3695123c8d21fd138118e341963b90331306a4dab790e6afa8b4dbf4ac6e983c9b87d42d15754185707d1d5bf41a03a84ba20805332703b6769b2ce81c38e937df1fe473df4061a49779cf4b10029ceb54084ec82698d0eff0bf0976fdf0b305e8a56b9655490478de56219a51bb030618809facf8acf461ff679b27b75ca0afa061901cdd5ad30a2e5a3ccf1e0cdf007e522338112b181489da0a82b245563cee9b7c8fe13976616dcf4872e1bed9e26dc501f4dadde31177617d1057727db4b99a5676c8af948585fb6c0c019998b3cf226268b98afe5fb2441c570cadbe20eba7475afa84d57f5c27d124e665c57b8bb16d1d17f9100621cb10e13abcc1876b0a77c2df80e356dc9a9f42f8ea074389ba4b9a5df3c20fab3e81364a682df1210b0d36df6b6312ec9efdee9ff00712b1852367f140bc813ae496dca279aa66f5f2323e620c00bc737913b1433e6cf0eb5a1e0d3da8a564b506785dacb7e2efcf060d63d02c605b5b740a124c9ddfe51f806413a7f325c103ec4f41cfea7a939790c72c91932bf78bd70a9a22d508fa35401c0199e8e69f0ede420e72d91d5b35d887220d090a99ebea3acf2dae8e3615e26e607a508d06bd24794eff4d714d912676cbac56a44763f5c33bd5f01aa2a7ae83b6b2f3c5fef8051d88dd0e1e7494c2bcb2d741a30bdb3fcd6683625344d4eb838ea9993490a7ca564574e4cdd524f3805cf494aced3b117fd79dcde22682e3966dc60a82c3b3bc4b0c2c97267a2a03ea536d156af46bb301168df96e509adce2dd730d58a0022025656deed06a8f38231ea88d8228536d7cabb9aea0c8051f9265186c5e2d7d410bd89fb274ad39db53450fc39f91dc87181f8bb42098a9f4cc8e1bed3b740c6626ee2aabb94c1233a15008816738ec48fcf869d295c870a2b8dee559977d98d69e2e76a1484e018a36c8fd8d82246cf951c1bdd2a75e417380dfde771c4e07da9a21eb5cc8bbed263a3555b0995d45e23effee7aff6403ad49196e1170f143ba424df2a3e29bc050d41d78b254ec5d4bec3c649345e1a0993e13feed3b6e32bebf3cf1403ef761502c0ace5b5ad89e7c82ff87e421deff7f8455f4d526cbbe2e397652f983d6b86e6b83bf735429efbc29d1bf37396208a74667ba8ed812ce51d7817b975941adf2b911b3c1e9e83755093974523875a358aad2b6e3fa4b4970c2e7d6e26a3f28233d3a120ec21c608d49bf0efec41fb8dcd81d529b347c19d32230c9a15bd8114b2089442286cd51ad12ebf50385692f79f9d0f57d2daf25c21ee2be9ed71450b08983b1c5de03f2fc8b469129255af078357306538eeb5585de871c9f84fccd9aa1b2c1bf72c72bc4dd574b3849fbe421b38fefe3fe3991638ba64b6d0a977153909dddd7e920e44b2fa689f79b52f1bb9cab17f626a0c1a64dc8b3d012ee22227dcc6bd7ec1705dbaabcb42fc36a00901750e653ae28cd944b74bc8f4407c94e90c8d58522b376ba752035a86948fae64d05c4c43dd99d76ae32ce7447ec4f20f31881a934fc1f30ba5a722a34f6c5066652190f7bbc1a939d8a5145c4a59ae0cb44d90dc9fae9879ef3d57dcc7b4b3889bf4dfd12d82a354105adcb623894d643d543788ab6ba054b72c568dadf72c3ded5c856a735b6a2c22a4acecaaf2449805229b11e377cf4e95faab5062a24f18e1bf3e2e5dca72347829016a3113183ad43f2812f85159a9f43eb2af7654808c11a346871d4e300f894e86a9667a5caf03006b062a96f4096a5f2905698c6519e58f4b2f6255481fee8b8934bb8676771a2cd0661aa702df60d26aecac986144e5f9c861ad8e1ee8106695a690c5fa25921af4bd49002abe603ef4efc026f99f9b792ad85f4718ea8776485996c75c2d033144662640c008e10b536934a6b27c5e640efe081eeaa9cc210dc82de9111fd6264c0b42d757517bbe02f38aa6207dd760c13d3883f8a856fd429cd6d9bd50935078172f32752a98dd80193283a8267ef60e3050f4c768a061a32211e7b571c34655143be09df6b0d06744bcfdcde8cd7a3251f21fdb6d31049c027fb19df5ce8e6f8cf97036486c3d05009a4306373b83da2c8c33a918915c89b860b5db4f4d8f33dbf85fd2822379f5c74b11e5b45199622a9ffeb51d49b018be75630200a8df2e9bb91df7465f2dc6135fd8f0c2983166d6adcf83cdb2c5b58f2e57869c78d4dc46ac291907a7bed27f39069bf487d254ab263499bc74f3ec94ebf1fd852626a967520fcc4875a3c76577396bdc98f2b82299ac6b5bf8d12a8a4ec0bb5d493b32783b30658b5182f1609adfc4bd54190dd788b58d4ec6c40bb9b75264874a98e3f3d8498932b3c30ceb04685b4941cbc23473ee53e76762ecbdc6156d85b2b65a54b9a9bbe124ea668f447183e2da7171c3db9563c8433459f0eb885afb0a19f2254fdf52191d6f9aa7fb79c33c96a0a90030694163e2aed01da839a139c94a47e00b69004d15d905df69efbd98feefb46412d8614cde38fb7e8c97d4d478bdc81f9cc52aff96ad54904041c79a8ba53079e34137e59e6918adf9216a5d80eaff2e447256932862f354ff2e75a3b577b9bc225259b09bc5d4268e64d6277a5859b6c30f07ca43806ea7f6f44c6714bd9ca5607a3b406ec59a72ace0ace4ed9c642378e9b2e7608c3313d841b037220d75c02e3741178feef80ce51352f8231dab0ed690dc8d17eccd03138545a655ddc186dc082fa867a8697fb78b6ce3e3629ad37c93091dc238a8f0293d713728b4fc740a6b4b758e985b25a4a75f3a86e1c01bdb7ebd3c07e6538589d8c76c3319a31229ef28f17d3569a92cf5ae6e8631973263a26d4a418c691dd5f5ccb7dd7241ebcae24ccebbe60174c0f4eee279d89cc1a5bc9deb177136437e02d59cb065556b6e132b4fb340bf1301337548da3d5d44321bd370e25b6770e28e969d34495a0b73c059070bcbfefe5e2ff6141fc63534694e827e5aa15920b407643bd1c4cc667c983a771dfe4da14848c5a6c339d11cebc33f85b8c9a7fd52fbe2fb213e28e6f8f95432723e27a6402c88a35cdead581a286f09a55ab0515fda775dab3bfc1779624aaba1322977e639938c554b169074dca59ca8cb2eb73b31b5c5c834c2726e7162551340af909afe9ab43505c9309c5e57912ba16fa9658012d600bef87258955fc14100367aeee9f2cd847521c2f13c1999b663ffa27f4403110d411aa1b84c7772c2e76ab1529a303acc3fbcc203e45008d1895b3cd90c2ad92651b59b1e156dec116c98be568dd78e64bbf6a854e58f80f5980ec31326eec0e46735a8fa7e978fa5166d0c7b135d3af6806c0054ce4c749af686ffbe52c35ad0083755cde678e0066b342620e935b2ea03894493fd0b664a5b502d2aee4cf961ab274c18eba68fbdd1aa85f86df598c7ebdaff82f040d88c0cf6e5e977e03f31c671d65c0c94e123f01cb65210115f087fdd9bb246714dc8a1e7a48a7e319e98f0c3af17c7c886d12d2741de8e1d7834561d93a27e313898a0bf038e6f959a2fa08910cc8bb5d35e1f4692ee267e76c3f4f791c3f5f51b648fc96d55da90a46e5c3eb5fae6e179231cf7342187c8cd4fd307f0a75c4178c4d5a36c813dc76fcd8a50f91357dfcab8ccb59fe900610e3086db4abd0f8ad33208e96b810 +0x339bdcbad66c73c3ac55d2fb66f3c3ef4fdc882b45493d04ff63d87ec93f402468ae062057e330cd196812fa7aff006e +97648 +0x52e533a4f310cdcae7424e42caf7520d2ad6f69e3c9132e0ce0d6a7b7dc33f542866ab52a5c54d68b2f401d02ea6b49489de775379c7d142eedf5a71495b8550c8c8be7145eeb58f21f9f9d07bdbc847a5ec26bdd8d32cb126aaa39db15dd17b1b5393883d51ac481c9b5dca185c362d67472b63c27fea355eb46c871e8fcade0751531ff4b7db9a8b2055466ff1a54eb739afcda091b4d67e47deb8f9bb1980750825bfd2e7e98d56d10bcde764bdb37e08da84d8d2319d6fa921b7a8a766694ec132ee3fab7f2965f6a4e6e87c2763a2fdd30fd40a0a9117225c0c951c58a278c4a137a3c94577a0d74b1ada008b660d60c3f6fa01e6bb5ffcb74026e19732dd599b1f660ae27ef0bb26f026b990c5a579d1c2b47e6e212f7d5bdac5c0cc2164c84830f036ff463bec5df0326fdf87548f26fa694b4acd70ef7062d97f9f78f458cff1aa1543d86bb019a267e920b401ece926802e21c708981d61cae7b73e775359eafa6e573b6650828f2df1fa5594d643cf63f09b15e1c18b5effc0bd7bd4ff0da4490be2771613bf3eed4d1571f4965c7c795961c1e2b1e2e1e2d25837f3a514a600b28d956143f9370dc61a100b745bb52a301bd3f2b24972dae4317bbc8c9578852c009c31265703f724b13ac0b76802de3f7151fb0ae89a4fc0ef4e17feb9a34241e2946d060229112f81f8fba9adecfd4c0945e402e8e0a92c3bb9ec41a8ae9db8dc86fd292131c5af3351a4904ffaef208eb695e271cd51f1bdc3239e8921005b9579c9d8dda47a6b6e4ea4b579b51d83a6adf5f2aae8add71c74a45d8485d2f0b675b85a5e09972cdbf6e16051a3ed3cf931ee7abcb926a501d457c6c3617b40e682b4f9cbe886ba225144d9ff4ec815304a67c1cfc8252513ec24216b3d6313cea9a5fb4ccaaeddea67b567ac3e17d4f3004910099e101dfbc3f4b5a7a1f23115f171a90b35775ddb411d5380f94042e95c7aaf95c250566061adcb9d1690616463014b2db449019ee662e6a209ad27bb65e3e699bc4e98ebcf39ab7523a56c63053d29ddcc8c92db5e6e653bf6c44b11246cfd3e1571aa44147e9d5851991bb9e10d8a4107a8d939b2271b7246ef75919ffe3bab542056123866e96e27d4340fff5ab881ec069b61e9774f7083956fe6e07fe90901c562fd44d8d6de2dbe7f0c650af9c6030ca3fb0b45485c341dffb6efd94f7fa4c797af3fbbadd1ebbfc6591d079638d523b8ae21784f5fe2f1eeaad2f2b536c68ebdcd31f9b76eea40cf9d2f37d7fee9b3a12231faaca11478036993b46355ee829c02237939deb1a76381a1840341c725270046b2a749521a089c3a05a005a50bfbf31b237e48c85e4aad7dd56428f8df12f065888880253fc3eacdcfb66e7291a44b24dfcdd5b8cb4cc8cb1140dc034b2a999864966d134ffefc56f9ebb7dd7c5db043956dac0858317a9122e08470d036a4e62e1a39a6b27f79dc6b88096e34efcb822da7f7406cc06dd9ef8c49c8d500b858ce5c0b66d10f0a680dd48bae212243e88fc3dbe96ec246aa608b5392c44e7ef42da40cda12755701c7196624abbdc07da409828ac800b00d5d27c95604e99ec4313a638ade7b07af819dc1593b8aec4a52c014abe13f5108cea6d39dfd99bfd0c3653afe9ee7c27a23aac5d3374f6c568232b8d4214ad1a69b519bed1725891ecc6fb6bfb882326b9586991c09d5ebaa1da5978ef0e8d9ecad7046d1ba57a6b9329e01549614fd89bf7967bc17e40f4c0962d960b6e011e4ea4bffce4ef5bba6df3b43459e65cbdd89cd5439cb44804630b1a5d3dbfb20953b29ec6e3bc873eeb98da31b3a3c456ddcc88a1d8cbce7a078d9236ec701af0788543538e998739aaade4a5dd16212439eb431efc115ec60cb247db9e3ba6543ba1203b4c12d66b299746093caa0db67b9d77038d417369010d8d83c95edeb50b7ac7e6b294ef23c6d990c458fbc48df137a707f2c8a6e372f3e5f804664e836696acde48ac5bf42109276fc877e00b596e4594c31363b5e0f9e370c5fe505feb79319a74d5876cb69aac73f1ab0acf1295f52284be3460c9a408b684639eaaf8871893dd8d0bfe060282797b018f399b3318399e2583749b76b811d65283e51c64a462d95f44188dd53bd8bb1807eb71ea315295e5eb51d4e6941b22379a9ed586777ffea8ea5cbc875b2a385aef55251fd306027bd68914880f4afe7f6d5892610453c416492b109d42d67956afe733487fbc5a53df9ac8bf9c29d1b656730188cd86b0140b14389b85760477e4421af899fe041a51077001cd202268f0ae71625571492e8aa882e6b581504b06d64aa4a443961bf54f88f304d69703c64b80821eac05c242488e134570e35ca22440d1310596f516e39217f5a5761331daad6c9bbf5c7bec84c8b5a7cd440920acac02c2ec7d12405429c4f2256613edec56865ef3e3b7c3ddb1226f1ee8fd1cefdabddc40bf100c219eae9cdedd8234f12a63db12020282b3e60e0dbe4884e15e6b76efbae35ad4dc8f19582a52eab179879982725de883c7b5bd0653f95d3888bca26fa3707f24d579b9a6904cb9ede60c7c079d4dd65169ced3db4861d26cff6cd4eea2ece986bccce42ab9417c44e707afbd0b5858661a8fd71f3418810912fa92ef21bf1684e3174d370dd7be50dd2789254513fb5c6a872b248f93d59763c440e3b87da279e8d7496df665dc8c38eabcd2c2f71b8eca33649db34a6c928278836ecfaf0a005e9b6d321b7263619aaf9f381d885587da1307ed57d2a284cf85ced2efa9b9a294c22d25d583ff7b6304c4e7ad2e15d1eab48985e59313d8db5a77d291143dcb2bea0dabcd20ed344278b2440a7ef8f79c766e19d5223d19068532c04c6502f4948183466abfd9268989ebefade15b63600729fbbef69ac00184743e8a12a5b96f07229826e73fbcc8a6c64d100bd99fd5b541be0b8699683ce6b09fc2b3a2840c096ff39a0d8d71805df5ded944e0174e2f59d32368c57c191a7c869ebe65ef0c06cfeb2cb93eef412def3752230b6469c3b6cdcf03ab66469e3c6566a97c44df7dd7016760e0806b7526c9133ca8019910fd2046fdc7d115e074dec2eb623006dcf9b8c2ab0edf9fe21116b4e862796ca5a15d339d8727279fba352c1a943b02a2bc93d6ee16473ef342a28fbcb72644e027e70d8985e2fc1a710b1abdaec0637da4050ca09371c9173fff3c2022a2b25f15503d48208f03ff4de3172afe6a99bc348eec6902c9eecc6d7f22c911795580de2b6b3003a5cf9c853f9a092f8435ecd2b3febdf0c9e0816fc4dc0e10148ee406cafff79ba1bf90db932bceaec7989e22f6ac05c9ec7ee49b42d065ab0ecef703d163f5551d647a956034f1f88f522e99e98ce70acbea54948ba8764ec2a64879b14fcfbc735e9867395e099955f34c9bef09b83fc2e35fc001bca687caa546ccfd1bdd5e4dfe98a5710f7bfda5ec46cd89bb1fe58bda74c237958cc2913c70721740a4a707d4e9f4c9b1dfb219bdcb933c0984786130220fbfbb7fabb0dc540d8256bc232b621ac985ed8b430be83981988d6c84ed94e5fceca7158fa4257ff3e0e69a5f33369988482b353d06ec2f1d01bf5e87ab793f3e50d0e50ad57842c99548b5c7b9b2e4d582f333ec953a0aca1a07d0ed054dac388ed14499ef755af32225a4d929779b25c8ce2dee31625b2d43ff4a41a592ab7fe920dab93c8d070519e5de100cf51afd8c2479be65f59e9b122e4111e6d8cb7912380dd5572ff583ef01c808ceabe2c13f8eade99d5453a806ed4bda53907ab87c8f649ac9eea4d40411f930091c8115657540dc521f08d884e4d107665a37b29abf6565ff49838a0b9ef80226b7846e9070c9232eb62cb12e8d6725b986810bff1086c381b1102a77f13b1bb21d5b4142f9ad3a8daa4da6664f74b1a7a5f5091c5b4f3fdbc5d919abc138c925ae7411ff8873aef96bda4cceb38037cb48f24e64d8353777e85cfc497787b71bfb7d651895a2dcec8b5108ca5220249ee017408b1fcf56e0a90a36c39c8e51ef74c5cf30b9b160f189505edb93cb049cfbb293d1aa83faa0786f4d9c98e3262abafb94da5d35c782d646d384f0e764300c729ceb00d9af21e6fac54704fc90583e6d7a7808967d2b02a2fb69121ba01292d5e039ab56f0ff754b225569514cf26fb9c49c3459fe448ef33aca5fce549f1f3af23012824ca393cee94a2e77a883df5f27a978f6c789ebc6165b32860e4002303780cec23e98c3048e97dce63f76fddc08424f036545998a128e42b929affc44448e48bd2349a37a86b0ed137e565baeead91ef6541228cdb3c5f8fe23296df59dcb08d9b750859f6637e785f1ac794633e07156107a19ff7ea4ddbba766c7b2a7c9978e572819e1a19f44b415e3c74097eade8926e7dd9dd7ad698812c2aa09f6fc7d617f4ab0ffcd599d346796c61c7b7acf2613e5f427534214d9e1d7756a0ff612e9bc32eb385df9497d6320063852f2bbb343eeee3a85f57827b11fca615728f09d8a7b3939b7e0e1f5a52a0822b3053c97437d3c35c459fc07fd06197e6117bee3668e2b527fc2ff438a2f3c7a2004ba68af2b5ea7a2c228d12214d32fb244a651dcd6223129f1e9ddae7a239d0e73cdadc343d61eb5d08749ccd687e3cf327f6f5a0dce542b004a2a6ec54e09e2f4eebd4c8132f952078fa859d5b8392c5382a26a7f701a176088c0678b2c5f41ea863d975de5c62bd9aa93656ce49e3e4a58818ab5c81163b53e2615264efbbfe73ca520246f1397b970815c368d9199697993473b26c88450c2c1f431166d915d6a6a938f5f501a3979f8babd23a1a2436e3e0c9a2cbe1de5cf3a713613338acfa8145df9070a47dc1f701d5b474d0d6a9f08573d4a5084c6bbd638afe5dbe0a07e28ebfc26b09513e97dd0ab49021f319488c3aef02e5d76015ba6f8dec55792452ec9f30ec1867360788127d95f7c5ad715be69ceb60c96480148cb9e9e43f7958c74885feb906d0d06bb5b58b39928ef55c3f826661689e88d9a7275b53a52f7c878367a6d4783479edbb057acfa3e35cf60c4a7ed0fe37b47289824a8af36e4694167fee51038b8a75eb146ba040d52c90179b3895d1568c45fa70bf70715d3f57c974dd18f0fd8c6d0e8b6596b08cef94261e9e98292499bbc299c0ef6725ee3666ee7b1287b1063cec1171983d2f2c69027ab7c250c9623da8a758ee1ceddb9ab397d1250fd0804a4d4f968f2de66c7773588bf98d6c7031753f8c56d9de8fec7a14e63ad28182fff9ecdc61c9db36264160232627354900f10b660de62091928110c33a16ed95c3b7914bf7593312de33398632674d7713e4b3edfc8bda69f691316e0b243b40fe51e6ec3925198807128cbc0395dc82d116df290b1035a07e711ff19744940c188d92c60f74b32109a600ce83f909f0a14f362323bc58bd94eb8354c4bd208079343ee1629029644cb73ec398dafd4bed5660e22ad86b489fc5059d7cd90624890e914618bfa4da390deda32c82e01a1cf4066e0aac98ca07c84cd6a6de6f80b1e234fc1b4a4c09366fb6772637d9e696f1d0d0a98005ca33bc01062a15821d577ace0b5179487baca741466e421036c215650ff19cdad08d69cb36f0c66882e59c087ca493c1b8047b3518ecebae920a276e33c84740647c96536ddf394837c1118a56fbe2de46a4b43bf58879db82d5f1924518cb5f0f680d41b3e1b54bc555a0fba13dacc8aff61afae62a36be8f8c397a4cc86e5e58b9943c10dd8499b307130466543aa67b60741bf2ba68804095c8cd50c07965c8d8f4ec8dbcec598941314cac27d4a1304c8c45222058481e5966345ae8349ee52bf5fa316436b4d06ac17c7b9ec1e1582128217d444e3fb040da577028e62f3a1b5e0e05bea9d10fe98c3bdba14b8d7a4711560b0e918d7eb3eedd9d68d8404c11f9cf0fb28fd9ce285a32d518b8cd1f260f8dd4676b591018686fe69053faa5738ce659292ef3958ef20870eb51cbce26e96ee13522cbefd811b455889d84ccaae0faeb09d048ed831e66b5035eac0faf69a03962ff0da25cb155f138fe07491fbdb4cb3cbbff5d6fa4f4aa46279b6a2955cce4d44a44b10b10f9c288c0aba539eabc03a837416ebb4d59599df3be68fc7699eb754b9ba54cf549d1612a97675f31b99b378e36a6cde13ecaf00c3d909094b0552b4a3804892aec25a983f417fb585499d00605900e284a0428b8416b4d77b82ae08e435929758bc64a14e93d742834075ae9d7b1e6ea260f2b40f27f9ce65a727b60e529949fcebd2a259f62326901ecbf7dd393beee79f3e3ec7757e3aa3e36e40845fe31705c1133fd3e0d9de36551e60b22bdfcfdecb83703f9788b8b0b7e03ce8d5f6aafdeca4be6edc71d5d063db7daebb70adf27670ecf9f6cfd516a50c0f9e2d5a626fbf15c26d4171aa18cb81a34570a4e5cd108529692baa0c402b603d36ee74e9b5c8d4d061c85fc75a0cbf75f8e3d323b92a1eaa1f9eadbac7cb7b4a2591dc8d7a9a606ceed992ba2ea7c36a4b7d81c46143cbe38fd8418d07f5bbbafcbff7da289456fc66edc0ff011d5bf4bfa637643fce0b6a2c611bef9b4ab0042eb16d5c3a4707036c8d51026bede7a9c8067a7fbf596ba297b1935efc2ae6ba3e1e93904a332f165220d970e989e50df716c1736a565b2134422e47a536de519d6000f2b2e90da9ca50a0a6e481d275bf5f82ebcb45586a94ab635620cee54edf2e4c001ec9413237956d30f7563e95932955454cb6e1e33b55c8f6e973ba2685c1cb54e86458442c57958b9c8797c2153caf1c892b962f9ad9d5a689c5cb5cf3d3055daa3ab1641b1f90333e866cafb7e1f6ddeb03d3b4259ffff16c257776dbca9076ceccfaf6767603b477f32b92fdc1d305fce028f58e10ce440b236ce89020e35ce09b838fd0c3567bb32e63304944ba212931148816e4c72b01401a46a36e746c6a16e9a4bcb01f158ab881fc3ce322cc1a8714c062846112d8fbee05981bda21d5cfabb99ca4b40e6922364b5b4583432b42a852f36822a7ecb776a9e0b16b19be463852f319bbc2d8ebcec1f6b47242e6045d943c088236c71332a81fb7dda07deb1df542979cdf4485d9e4c1e87627d54c9328cf0e166bf29fb084a7977882af5edb052da6edb05680d6283f39e58e737be7750ec14593f9ad6ec40af8e20cdcf1ee26f6b014e2695d5200b12166c34b12d90d8dca966b36dccbeacc3490bb6144c5cf404bb8e2077bbc02da477082b6c1d646ce928f4e549e566d6dd30b1ae6d7f0629cf2303bbb7ca2b31d14793960d96dd533b1a6a9bd72acc0626cc7a7c82c0c855f1c116befd07475fc010753b3fa0e2d7f907329ebfa2d884c5a4cfeafa168ac1951d2df3f07cfdfe9a5915e2a8445c3e4b75b3b6a8557397e34116be7d8a34b6e1c0b2203930365886abdd55f08931d15aee55aa3a4c8389a829b9c1b523ae7afd310b0e802bd8b3ad8d345bc0784ad84ef980441e8ef1a03be61ebb47e9e05512f8a2856c76cc58378782bbc0178f9b4f1f9c4afc23a625c500af74dee4b391489edd4da518fb8f4b21303e9770e86183e611857b14895f6dfdd2b3201d0d75c6aa262dd4194ca011e4a4aced8b3e7415d948bd446881985c67f142b59bd848b5a4e4eea182a6d2b25747cd6c6e771a2b7da7baff277816b9c573e74666fa533c147e58b35af36e56038168ba237d9cee5c9743535a5523ada0c06b7b875dde84835e33b3a91abc246ebb477fb2364285fd8122e8080005607f4095fb05e730b579eb474877030445225b3064218c5318e8cb1d67396004f9ea5b2f6fe88293f67c8d5c1bcd968ee1a7cbec107a6619d1a6dffd78f55f6aa16979ff7e39154d6f16ac39d3b2bba11f8371432dc5abdad6be2389c245e47d7f8502cfd1ff87a749ceb0a7192f5a872740b7fc600845df4fb8018bee30d887bcc55e650f42c2e9ac2c026e954b5b86226504e1534d1b70651de0c9a3bf21ce7fb2f589e10aad5bbfb90856ee0ea6e7387bbfb8ae9b15d43f73270d8af9a89bf1d22f05ef603045abfc2b27cd8023f29009524a18fb1b550745401d4be6553539b075a0e04b33ee977ed3a8d9aabbee5397245f3a731539e21892c18d8e11e681d12d215dd49e9facc569a2bb935425a8ae9dbfbc0eebc9fa7685c3f8fac2f4eebfc1510d0259a0125b53dd1a43d7ddb8d5253145d1864d77e681ea353151a8aa0197f899dd4d39f0c8fb219fc32d5faa94247e7dc6cc0d81f1eefdec3ba74add1f19dea86d60b26e92c736f21a3cf3a773026e0ef4a6503e1d34c5c421aa22aea1adcae3bb7b52b64321e3ba50eee0d7fb27c99d63fc60d9f5bb0a66ea44774610bd85f1ce8762ed6270f19f6e2a7061b3fc57d51cb78378feec937a9e5c93cdf4b0d87cae6a2a3e781c294b7bd7e96e23e7e05b26bd0244c22d2aa746dabc6ad3ee8829640ef2cf0c8d50637fdf9425d4512bda89f82564c8e79595e8a53b4537df60a2f75902c8a62a31928329b9af4da301f84e4f330098839ded8fa75887a7eb278f6f35a152cf5d937e8d9da03316432a5d7ca97642bb670a5740c75a58ac7aa497d58919950d8e3dcfa82390dab89b6eb21bf03450b8fda47a05ed8bdfcdf4a063303db0b8eb23f82ed9a3d3ccba11959f340bb65217ac33ffe501314592c1e39b8838afe3ee858c432a05af30a40f66cbcde2447161db7e8de9ec95b1834935e6e5645e40a01cc1b5a2316d2efffcaadff15d25d41df44ecd1794ff4c29f45eec50a804f488505f2c491054f052402982a564a3a5d35e6b6779e2b63e0b2b2556d0ecea2a2e8a2d522888ae9b2543ab5df3df04090b819d0217be04aeb15454cc6e1859081b30f4cc4682c15a016cf818e2b6912a4ec5ac46f7112fc4a4d9b1f5311597b6d6ac7c45ace7d7536c25d75a7ad1923023925fdd23c180aa6b20057a21c9ec5de7648d63609d36aef0d612cbc4184f4313507f6ca3b83f858e931702461da225d7c2efce6c8e269415e56f14c7740f89a567d49e7ddcb4809698b136a9f900352d2c692fd7a0f12d62bbb7dd8ccb1c2d613f2618bb1727c00a9999be51464db6710cc52eaabddea05fc0b1cd1907bc55cf403d856550df7072fd984146ead2cf2cc9c972eccc3416945c278d780e382a78d3e18b816f25b6572c766891cfd7a9e5cb3ea4a5b53cb68af8dfc5b1cad8d3e35ed9d2195b41ba3f8efbda39dba36b247aeb6bde603ea9c8faa31cca21e378984bee0334fe7ba5b58bef3f46f8803e713e9a709eb58116d6cc393acdfda3432000e8c6db3f1a9f3e8b1941c10db44a557f115bed9c4f263dd469c8c1455e5a02e78fc2150668cf64f64286b10288b657a519d3d3fdee00847cfd6eafe15de5c666aaa0ea3bab5eae3432b61ebf44ab00187a8059c0a7ce332bbbd39eb8e80df5e7030762c72c74a4adb17a102b3050d640fc0b86cdc2b5d3486da096b446f916d160a086903337cfc9877a903094ce6386671c630c87dfeb3dd97ca0bcc1d3b18c8a135d7f08d2b6f17b5da5b5b74c2f50825af6653e740371c810c2b99fc04e804907ef7cf26be28b57cb58a3e2f3c007166e49c12e9ba34c0104069129ea7615642545703a2bd901e16eb0e05deba014ebff6406a07d54364eff742da779b0b3a5146641293925b9e2ebb555705b57ddc9b64d1edc429d9775a91375619585c2d27c5ad905be4d1d21ed6fea636b6bcc783b0eef2a1107d73fabeb519e647caab4072a1e16e1da93681ae7887d456648bf35af63d212195e74ad04aaa8111dd3135bddfaa6cb53857d1a2415070ed0b8684d36611b6f5b95dc566766c5c2f0a5b7207b54fba3405a29962e7a49f12f86392aadd04f4d55e23e4f1b6f3ea07e8967ff0d135e922a7a34360ea08b140d19fb751b9ab4d790ae643f28ab5bd24ee5ed9f9a2117c0984d66a1cb6e159ff1d975d589a69232936214cf97046380e8220faa2a656e54123b87806dcb2ebb642e71f3fedc3389e66417a76f61a0d4d5a996c5c6c7ab7620ac5e7afda12090ed80b5768224de02121e356eb8a958f49ce1499a742f15504b08b43881d7314514370b071d66dac59ef635cd7ac6d408c531f2d13e85f5071ab751610455aa0261bb394ed88a70fb1256e16bbe9f5c39d90357122cb193c61621fd9e8b03d3f15d7507f2ba78e8ccf7a5fff18b1c37ae5fbe4204459c37b3c5ae809720c9f3378fcb3f9ccc198a5fd34b5806ea25af91dfc9794f912c29f6b1c7a1f3ca8f53ff7f26a7f315539ddd31b0b453e2a20a07e18ec49c184ab0b862d2295b923d3c6fb6ef09a09d0f6b6d963cdb7f7b7b913aee74ed93e3df16215f39e1767ebbf4afbb8c2b4a6c363a388c579433bd998c528de3badbf9d1a15830628eed99f1c3e81667d59a8bae53669a69a817b1e243764743f51d620a9a865db7fb67e8c7f34250e6d1370161fe1e49dae0d25e3ffdcfa3fd6400277049d26e9eef8d7526cbe4f073e6cbd63583881f12020dcd9804852977d02d4fedf565ec81310747f492f77e75dbfb121429cda679d66f04d69ebf611a004be268e7665fc78a7c661b91a283547971bee53915667726a10ddf14a5d44ebe03e9c868fe4dd8c294db81100e867788d5e290fb87e675b84af09dae61097cd0fd6af7be55401ca1f8ad1056620f48d0ce84fcb74caed95513b3f7b318880affe070dc3192bffbef50e4aeadc7a62e1805ae13b58b460dc5a460d46df5da621354005f0bde53dd734389455b65d4912a2267bc3c6d3777d0a4fe1e221d86ead40324689260822af67aa2bca96320d9ccccb8df961a07813ebc96bc1bbb140c0a92e3df1041d74a409d3afbdfea136fc7aba76509b94192d6932f96a0f50d2f7cac46accba8d7a5195356ea452133b9e2683f34de736a1161d2d194f8f3f8baf3f753b80cbe0ca34944007123310b20e7ab85355d6f0c68a820849e6dde5d17371b14e91aaafdad97193f78c041200d9c1b8350cdd6aefe7026519c45dec4ad10c191283f953229cc7a1ce7657afce6cb61406e78cfd93b848b3f76c91ab6e44691d15ec1a73481b00e9da65a0426143a25c475a4831487abf8571441bbba24a032dc71e9078a1b0b7ecd9de7062600b20e184f9a19e74aac15a05ef5e859d5e74dba4bffdebc61a571b1b554a88511fac443e2a2badaec5089223d2cca1a5fe38974d24b5353b9469053d4e814caaedcf04d18038e76d55ffde5973089852b5c8f10f0148fd68db583bae3ec6f7d411e3a3fd707bc426ea118f256474c229f1a06998ca4bacd44bbf1eecba8e4263189492009f46dc71ddd835060ba3b7a24e497148d41fbc0462083f87264984ee6e5c6f89513c88b4bdde5079fd180142384ea8bdd347a38fbace0dfc268b67cc8fa58cf63acf6186167e720f9d3407802c0a60563c560bdcb26b0aba2fb64393f8fa8ae5b071ef6c54431a2580aa62f2b61738b073bd5d51e589d64f967ca0cb36e5d9c656b69abe13c6a95a3bcd7c0042ffb24b1e0000a5c084d13b1f2127d8c5d20a26922ffc11c163a01c232feb3f7f1e3d849fa0ae3edff68c0b1e56114322599c74f7207c0dd9c4bef9cb441916a71d6afb7d21ae839059771e188e25a0d8e6f13ffa4a92e8e9442661b89c8e1c7757ab2e3b059a2a9e282302922bad6855f4b8e61ff0f9596c7ca6f26fbbc2b75c677e8b6dbef98a35dd00471fd14110362d4415ecd5e7c5dfd8911a55045f8dc2c765a169d0352903f29f6a15f1691ed5db333dc54c16c4bfd275481d18ace646e1f0eec3cbd59d950370ca191e8e0ad198f6cc4de5eecc8914d40a0c6b4387556190e21014634e4589f5059dbb386a95e11f5ffb15d843c7fa3deeb77eabb77aa0d629b34c66b1b1f0ccab2849f094bf3e1d57415e7bc0f90d0354a2b55e1d233a210441d6487e56c248192d6d3f3faa2a6140a54241da98c7d4da62c1d31eeb981220304490fa9098f7de31778cb1d3108bbabb53b2e723b512fe5c069333404519fbf309d8bd1bcf6c68b90b51a1e69b1d13e7f5477d365f5e2f13061700adbbb9062ea8784c44e01657489b3676412465eaafb998132d1106eb0c42f6fd90767fcd37a2f81ea8757618449993a57f4726bd97130d3f8484bdc0cc3f8b80a51fcebfa28be0aab2ea1c2a51a901b5fd6dbfeb22841f68e924e33ec77e7d4037e2366bf3c5ca76f0d8690be42c093e48229221d6af5705a77c07b3726214a2e5983730afd30e19eeaafd4b60a50294ebe05dc027d73cbc6bf49bdd719d1a2f2a9c51dc3b4633fa08ec39677ba69660553173649aae48e39319200b3981d65b6359069d2a91c4addc16bdce89a32d171090637db3970421b96434cb3ea2d1ae4c68d611f248488be4a4fb0f1f2d4f2fba77ae79e723e6ed3b604a9bf592a49e324630c936dc383a9f316197a09765109f71d4f7b9d779acb597b20bf2b3c7b1b17bb7214cb00c3078269206b28417705bf94765a01424f6a4753b89ba98a36f4673d9c8b8864ce41c0efcbac975deb55c88a6524e7c8131847327a3b1b3d05d6db9091e1ea162ebd755124269ef13563daa522bf9731713d23c16c88c97c6d293d5d59fc3a3e6be5693633bf8525de95bd8db71559a4ee41a1a79868fa70f855534bfdc6bf060b206347ff6093226d5538eb2b0d7549148d8a8c06c4f8412dc2e6038426c39498d52d2c90f211106a0a1467878e32496a87a51abd85091694d8bd2cf6038c109a6e8d8cee5b47175d1b19a8d282dacc7898bcf7c5917617b600a26f5c4763a397524c0f22857d5dcff20f5714d0b3f9c72895cb26d2876e1aa05b74bdd9907519e9325e3356fb0d48f6be1b566006f9dea0fa3fe82f83404922b1e221a15bada79b062129b8084d4e8fee9d9f1a1af44566b1fa148fb4b8c9ec6c6290870c73cad092ff0c92ee456b256685f7e6391185e482a5b2dc60fb2468549b1373eaf108f09ca1e5cbf31f2620ef7a66aca978258137e8c8fdd034e1fc3036b14d3e4cec63edafbb4d600007e95124f554b352ada4966a60da4c898912cada73fd50affb914dd097ff7d1297e6542cabc69fc7a6b769d4815b1b22a311e8305f6b6840bfe383ac80c9917d5d80bf3a91eab5fe972176cd34688728b76153df8080ce27bfbf59ec7e93e669e21f5cf5ada83d20084a86fe80e9d6c34e6ad390db22c98d838e95389945c2fdac2cf10609e97e54819a600f6dc6511aef9330eb7a3aa39a94b90037dac86e61450d4714ad93c1c38b79cea703e740562246319764b1a27579a66292480232be352c26c89f904e94ad4f966e4b34eb9e6feb9f3da16d0f47babf83f1ecdc553c02f056cae9c66df07084810e4c96991b5fe842843a583237e06b2afacc3e210236c09ec1931f66ff5b80572c0ef394f579a6e2153659526e72112158f211dc395806c756a38280e8f6abe0739a352253458d47979d57b813f81b2eb1663bcf08f1299a3023d604d4c96ee388f7428c5d4c0638b3773cad4ffaf01aae2ea642988891dcf81a053aea5d2f2a162d041a3d15777f11cdef774a01f8acf654387c10a5a6585591f66a5339577bc3456113182949e258a6585e2b949bae32e0dbc799d1cfd5f08f91dc36e54f9f374643c1190ee52a310b5fac1b3c41e609d876695b92771a701cbed8bcea7e5e1b38916a654eb11f4303eca74180521e2446f1ab7d7303f07e4065a50dcf4b7f17243357277117883796e799c6e8361c2a3134d528f9dc1fc2046e8c501c20ccd21110d085fd7e2eb4cc38c8d1fc55a9c4a2262f83ae6a6fe36fc1d5ae5a640bf507121ca77c4eda63aec77d8b45188c9aa0b101b71915a88a8a47c84e107e05270e2085b675ee52eb437cff1b4ae58f5333bc92ebc246915e5ce6ac59c6d882112f2251da71c85ef6944098aa9325789763302b483263f308ed87cbf604d94a5b7101c93af743c829a7f98e60a941101039f314f6f0d6962f45136b4e53e924acdda335ff8fc7572e86912a64139f1f64bcee951c8405427c6d70d5883a70d9ac79f1dd50c1bcd2ad39eeb4df59a96d3bf509f6e2775abf966c8851cd42d632044fd30856168b024dc6fa74f804c6c13eea2d7e71503bd4274a412645f184f45c67320039159aafb7379bb1d89b5de414a54076f197124bd40f859e17d2e0ea5bc7f40b204752a09394bbb5a6a6d89f662e2b268ad546ea47c43bff6c6a53dbaa79037233321b9f88e341c68bae9eb8dc8bd7d662903f7a28714b926b43468ef185457d9c605e723e2e152daf3a17f71dc62bcea45365c21e1c9c9f3de41fccd7f1a473805981e25e7c1f3239d2ab26d2e70e5576a3208cd2cf186e09d5485d04c7079e0aa3eeb790d6471c52fec20ba2f46ab5000ad89eec91a646f89f2709210f55445fc80bb97b4375352147c47036f726346b0ff5c1136b2e7132c92698d6cf78aeaa5042b0c8cb91c3cf34191b35f72a1bdf3bdfbdef639935dedbabd1ca11572411c1fa631e76830f834e29d448fd5eb28314fe5a2984cddb245d207da6dcdaedbca59a9b264d3361661b5d651710aa408024bb6069d3b3aa2dd8ec641139e953d4838c2088578901a0251b954938f60ffef37c96565a33ec21d4774eb42e6c9c81e437baeb9c6e3658f4cc2b877d2a652407aac5992036e728d7290336c64b11ea4f0331f725c849b60ed9f078e82e8b1aeaaeb5da2da2e5686b6a4a41066efa384c584c55f98182e3fda8acc580eac90924ee2ec08a612c0c17a2ed7af8be9f92639ed4ad207f290749a326154e4666193bd4f8f33e59043a6439b28ba32147211d3d92a6a3ac864978312811582bac71b9c7da1c5174b71ad897621c0f803c0d019d4be989eee1d214b97861a87fe13a262e9ee3cc988cd6fd24c5d445c4c47d9827ca1eda2f81caa5a5dfac462c4e9b08730aefb6afca935b49a25c4cd328996841d6ec9f56af58b15c259a38183bbde9fde7e917a0ba7c786cc25b2c97b08bfb5436fbdf4bb3a4c24612d4882defc75034fc78f753a4b6def7ee7aeef7a378d9c9b3f4a2f6d5d75fcb6e023e51b4e2c68013455fb0d06c1550ec6199da4b8b8806157ff03f5d19115300cc606ed036d249f2f7569f85c4a3e184b7352aeee992752443d20e92915e4691d8f86b8ceafcf76237e5080ce612108025cbced5bd7f7da7e94f4bbd68d10ce9d10d303027ccf22bad13d3adfbea47a75261ae482dd585681870de26c5ef0dd05da8a50414cba31500e8e8b02bb1edc0e702b28e611ef72d793caf15d142b20e24d0b250da8070e8d96c2f5d9df169948bb3c2f182e13abfb4bba6d2b451616acf8d3f5ba073c26bdfa891fc7a3125ebe77ec6b7b8a7b6e670f5aca495a483ae06e7346e8f2d0267bba3f4d4e9fa888ca26aa6292af7d36955f3a7d59cc481a070e779d1cf3596a51465422e13d3fa41657f4a8f0159f9120cbc81abf338c109b694f6cc8713e8ea93f761522044e3d0d8c69a31645590a73d58206fbf88adb080f794a7df505e01e0603b8837d5ac02a2467f567c7400f190d06e682b3dac5f751639a9007362b1a2a8b618800fbb9f6c08df48713db1b8ab2b51e05cde25dc3dfbce1b12045bc181d8bc492479796fdd12a44d6a390cc43971b31d7df382f081ae3c453c8cb1fa27f734654b9c4e399e6eb4ae8fee77dce0aa7b68b4042a63e935696fa792cb24390d05b21cfea3c75624f9b309e65bca48df9109299a85fd1c9a3fe17b9e130762231979c029dedfae3a59a300a921541a18dd48063cfb86c3e5a5e2df38f06a483f57015fa5694a4ebabec89bbd2f43fe5b466d7073f4c5851c82bcfbe9ca16936ca7941ff8aad0ddab0f6803acef5e9bb2b7bf91c6d8830b49c0b5f8380ad4ecaff1782bac0b38041634cc60fec76f9a24158791bd0f88fc734616feae166afb121df6a949f24c6a02143cd939213ca2b9490e98e0019c01a3fc2734d157a0679c1456c255c9d2b87799ff96e7648f5c7a3b99cdb81787c2e0ca2fc32c3540d855bce09d5af793957eaa5fc08ff82e706ed37358ccb710e6329878d3441910f846fedc63dfe457aa1d2fa27fba45e1859efae362a44a0116a14e488ba369da6c76c3913b6df8e69e5e1111faefb3724310963013c93920f936d4e813d08f64dfedf1484e8b9b071a4936f45ab6aaa754ce90a392c2eb3638f812a09453f177f7b47149c3c13584c6e58793c697924a5de0d1840817c70a7af0f1b736b5f9da5cd22cdcc3972e23493aec35671bd321094c401b9c51376668245777207d0d57b74f09497696eead4c504e2465c9d5f5fd1cc4af77f7a110a99e2d267b3397b4b034efd70345dde9763093a6e72a008de4584789c0916fd1e6665c0d6e5ffebaee88c8cf932c64a170e1a50415c4bdb36406b0f2a0a80871c782cb74228aaa311a537b794dd4e99be16b6a861822722d2530e7303fc3d4b8f3fc61a2be3b03e1db9ef01d5ac4d6a072d7cc7318c989c4d0ddd38bc46a3b6e13dc08e16bfb7191da700f03e1849178cb2cb2153c4368400d165e4d5725a55ace28a77751515c0bbfd1c0730b9d84eb937203b2ad16796983e26fbc227d7a45cdea25ad97c52c1531c9ebb4009615c172b1a99393cd2207db49ef224af922f7b8296ccb66df4978d861780fe7f7aec112f28b0015edcde1bd53c4c5fa22063836ee6319e5281bfc5da04fcce849b6b5183c91405b00e1c0cf09d7ee587e8cd0ef40f2df3d270b68688f58332d1395632f98a39d8e8ec66cbc7210e48c971d868c27016495647f86a0347c8bdbddb293fd0da95dd61de3ad2a9657f1bff52223b5ab78f11668e01cae99a11e1d30770f2aa38bc95a37a24bc27e955b191e017011d53fcee7ba97f339c6b03219924b9e5f62312943636a0d2b31b06bc19c243249ac3f4332e30ad3eac19210f78e9607445384c5b82aa4bc0db79269e0f7f13404385e981c69a38369942d00e0a9c113807d6ae4e212b6201219219d9db5d23deb828514cfd6c9cd5d476b49fc6d328abce9ccd0e9a50901e05e474e21602e14a6919d0073b1e3776fe03335726152349f9d93cff46b05271f8eebc6937f6c82dc6e8ca42f835b4a46696c0a6b0d89d8d2a3a52a2beb125a78b2f54b1c9bf64f351f3c482cd3980e8be900110efa4040fc03ec29b7ad996192d14c26e43b33435bae93349229028be569d69284afdd32c6c34f13c0390005 +0x1ea47ea434f0654e4c183c7bbc6880577bc2ddab5037393115d2bca4ac5b0fc9cad4ea2542fbea7186507135249150e8 +98440 +0x92d9f3841f99bf3ce5b946397f7a8ff2d4395abb3cfc61f4e54bdf8074414f79efe27621daafa31ca07836dd35725f5ffa892815e1f7b623d116cbce4c7290314f239232795a0ab57039611081e8f3be86e514570d9b50bfb637f79eddb7da1179434fa044c17b6f1da4d0b8aa04d47841f424690910b9315c556bd97036b38037ebb551830d7eb26e608abef9f089f6f35f62331d7d79e08b192e654d17a6e64fc3cd2e7e659be62c16970bb6d19a9f64cdd69e900a16330b2a472cbc8338ac8a729e1f7df25b731f6d008629d290da5be78790ace11a94a332c11505a2f338b0a1300dc7db45c20f0ecc169918f211a2557df2b7270d6a1dd6a1076f9b5ef389f78cdea549e239c4a003a550ce48abffbec0adfa07751c3fc0f1ec43970145dc1db97c5f64b84105ccae1a941a1b103bca59a7bda7dc14d298b9abcabd659773babfcd3d5351439c3ad35cae24f1a71e224fca482fc9b99d05ff2c4936114f1477a7bb863f35a54f917d55e61555da6f6eaafde2c8c5736ab0cd570b298dd788fc782d844fead1e779b1ec8315cc10f8557227d49a57aaff412a1457bf629597f03a0a7dacfa2d2c9c7909cf4be0b27f80b03267cc07c6255f1f4b741f17f308fcf63cba7ded23e59fdc9410e01826cd976c05e0865d2fa4b2b2e4ab733457a5c7b3aa83eb4919dc2de3768ffcfcd5aa41ac888af2e24e44e3edc744e0422b34fa793c201e9879d7ec949594c51527dd267aa3ac351d89cd9ad8dc8790c8d67e3c50dad83d61aa9f84f9da6666ea8530efdd3e8d7a9649067e7a0cbbab4ec04b36416cf4712d14fc9e1a2d4f0504556944de4176e7d6f7b838db3d2a585c51638f53dabce1831fb5e2fd7795cbe90051cc8394afa464f9ab7003581ac07bf18df08f0c78b6eb3394f7ac9e81df23efb030d62080dac8b9a7cdfb46d40b32089301fbeb7017edb85f862f8c5b693a894e18dfcb31b18b9d74f7caeda0600afe3b69a25dec2d1216df368c276b93b435f22aa57e0950340fd9977837c5e78a3b4ed1894b331fe1b5dcb0cd59f8831b5d6611302251e04b76a0550e0b8dca3a2793e0ba9e8e16e3fe1e9bfa094c61f6687073889d5288593a8fd893503e2ea22bd43f3c3c453a9e576ca0191fad56cebed9f9b6d95171e5c26fc90ff0213d4badd795170fa0b29c298f673482648a2ac7684ac1bc99c2777807cf8ad27e1fbc17658b53fee6a765dd5097521cb92492eae70fb13071a497c321930dde9dfc7dcf46c9f9f061407fd975d87cd4f34c8e921cef8e1c203fce0b83bc9ffcc5fb173f42f611cf57a67487c6d4b9925c2ca724d1936167efbaa3b9f6f34914404411cd21baa1821100cc4e0d30113e3ae96409cca232fb263e9f3342e0120e5400f3e3aabfb3f1d7770d9510978cc1d6ae4ea9d6c507bf0df248e22f2a02d24a5746e8a6aa4e04f133c1c698af330178a1eb6cb6a4ea9bebff292e857a21496a709044de267ba3a65b6f486d200de768eac6bb36e6e2770a8cc7800b777859fb745c5e17d941b63f18a0835793225bedb264fc1c33f73bb0c2ac3e8aca0eeb478a2fa01c6ba8250491dbdf1eb07b4650214f99313532d026c95fd2cb1aebe894db9371b485b8d83defa8c4891e1f8eda5e0ef83d919a1cb4c868a2931018362b8f0f39a6cf7ab732598f9a6286161dd092298308f23808a1e75018ad549cbf54cd2c61bbf0f5ab2bf819c96f8f69d97de428a059fe127c37509d9ae08d7f6956bd704fbb91319a6ff3cdb979e21fac287d94b9f95d3361bc28da92f363ca1e7b88656c6e59376e477334d24726407d1884f535b1b8a09d799a8c67af8084c5095693209bf10e0dfba0d47da304d5339622d17c47b7621ab6cb3d81dc89b546494e81d40c00be61d3a138205324e5b8ea7fb2f6830182bebbe67448422965898399b7ee872f5050169fe525202d78f35cc21f0b2f3f0873cf11ba24a8069d75ff5ebdd8d526cbc40ec165f2d2c896cc3414a1231118fa203b74967dd7c864f404c61cf8be8c37a401303ef1319c482bb99cbfa6f33562ad483990bb9818c3eedbf95bb809099dd83813fb88045295f8348301fc9b3d47013b853046b19ec149cd1e027f80470447fb9321211591861bedf0ef8dd1d9b2065f83ff86ea0166ee205e99b4e9eb74db92d83a232a02227d2c0c12c15fb1aaa3fb5884e40de9bac51ce0a9c10da0f57b4409cef60c4c710439fef1010c6c37c0562f47c6e000c6b60bcdb90db40c900f5a4f630283187b995bef14b39fb36146b92ed1952deb91aa334c5200a5d74c801cd183ae570e4925dc070441e12d311b6c7da9baba552387de86fb02aaaa32b4d2b8b5644fd5e28e026d48119a83ae28b745579b4fe4853752a23c7b892d4894c42b828c34164ebe164a688d915ce155e2ae64a2b640bea0d7c99dd30b0798083a53708cce78969b5fc5ed1b9061d08b34df5736b612d6acb723a772f8e02af97b5709cde5a4c10f27075e255d3a85b0f601b8be1602d64238d7e1c11862044dd060d5b74141d701b4384312c18e08ad713b10a49fb7c549a40ed426333330ee81965bb3a9f8e158507e254a84055f6beab6e64f19daabab41ef060a10fbb6c2d6202327e771e5fe41048a356e4894d1ac99c2274c12914f58a301d678639cb31627b57cc153eedacff0fd3b47ffafc6fe0d2c94ff087e1d30514df03312eca88bd29a1b004701d4446b03c4d6d2b634273aadfefc647afd132270c209b2ae887b4a596a6cf428d4e69c2638e467b3027047cccd09cd8dd7473ef4b2c2e8e83d2fb67ad3cc036ac2ffacedff3969ad18215d1269efebc09315cc612a255ea4aeef3f85bde91bd086d5c2e0819d7ead5e82a3063b75671a19c5f43d91fbbce9c3030d03908ce56009b0078826d84ebabcda4230a965e9a3519fe0124f0ca9c064b2477cb37b082431daa36c57b182dc1a7361181c86186424ebb567cc20ce2f79451676907f2d24e79abd157af2c21b60932947fd9f9d6478f09ec56fffd341ea04a17b8e5ffc6714377d09f961b5807683c244b2791fac37f7c1b3a2705ffb9f37111215e51cf59efa0cd23ac70412448b5397a5dc4742474846b9cd3d1a6781268dc48dd736d66f2b92f8a7eb57dab2f204c93c8fbd30922b565f562cae8c76193e175efef1136d123601a69754dea902ff61e15c287efee8192ea606c07267574b95f122f6b282f62177a191a6280f0169e7fb09313275c6b6ad2592fb223d29ddc6ac0becbe95217be1ffa2f3c0ce386de3f25f7f56de0e55653b9a04a3ded71c31f8807c3c8dd96bc82892e4acccef30de2d26bbf1200920dc51e486fd34a92f5e3e4a4e36546719b3842920f6f36edd6016268c0c25fc3d9ccd3a273926e63fd5e43109b3d113ae2a7b2f50a629fc9aef14269baed432d42d19628f5e9bd8731f54fd56bcec2452b5756b1bc258e28f158ff08fdf15f20e159b2467747dc5f4c3f476dc588de42cdddaa62a546769e659ef4a11a7d08312debd4a5784b3f6e9492e64448f9c99652912a824633ed6c4439dfdc90fed2e090fe69a069425b37b3a698e3569018c24228539b2f8c574535cffd15e1e553b1b317dde1dafbb44d21c0cbd58efa405924e9b217c1ae48abb2b7e8d79ddeef26fcbecdc43da5df0157a81b955286e4bd737bd2729d1835f243983fbc152a19a2e659a5d211ff3006dd92f4ad31d45a81a65511561258a3cb50c74e1df87577d7f88ef285f8565bc01c37e387ad41362835fc1b1ce1fe169962eba087a84f6e18bba5307a4149b6cfabfd64af357bec23cad73c416c6702ef027be383b4f670f7a862ec098d57d587f569f49e6ae2f106ad7d115e12320d3eb7de738c9f2934f7371e81ce4cff4c8b90e41fefadf4f943865416ed83cd79faeba9cd2ce7561e99e05e9e3300be603cf72242ed8f40596cce02d95a21b7edb626547ccefdeb82424c99add238f3d52ea07b1a428f4385d4ed0fc53e8c8fed02e074fefd63782492d4561d16665dffd32574e2791e8d232e7bb167052493dc33b271c032b88a6a0e002a789a195b64ccee9647ebbd7ba5dbe2be3b487a825ffb04d16d095d70c716687d5cb7b25a886e7455c724fc9d826fda7cbe730ed9dcbb602a51dbd2e9c04e75c51609c1f9ff5a4f49ccbf5c714d4c9b836d0f41e8c6e75cc31b44b943ea08a0a8510ad8a82df2e7d8e5154d756b14de48c387c45dc311436225be612da8f7718d7a2566f398dac6899cb15048603aeb635e77069745cbcc5e0db36ae5817d70eb1e03ed5ab47473e2403df538c1317b399a577933c379403d3fce472a081d2757a900ec4c255278599bf5bce5029ae65203a39ca1c09c577638598669a158fd49a7b6d4565fe73c85fc8317cbb8d9b53336d5f16fc1c76a9f940f9912f1a37b37969045e7c8b548cdee60865b38607053807917fc4b6d022fbf3b0fb45daf19a7f227b19f044f15b7ee08892215d1a0499d1760e5c20fb69d36765acc59be612146d797ea77173bca7805a0aee5bfbd7bc90b7caaca21e06e764bfad98a63da2a013a6948a5a0138c18c26d500c5d3060b0ffbbc9d836182a1b26605a4431fd38bddab638147c45634cd93fc41e6c91aec15ebea150ded64681803bcd3b9b42c3d9030f3757fe39e680b4a869805069ac9692f5efd86ea34a35f3edb0c5223351ef7dc4d4c4b8798c60ef37bec69b10e09d46e203e37807bbc4fbe683654957697d95878f0f3d8cdb49d35e4275bf3fe141e5036be68d5bf1ab02c6e3b0831780efd4b7c47bffdc49b82b8c83023f4f3520f7faa6761148b254a2ff202b620c2ec2c5e623bf61f05e483252fef09db752b6ea0842069636445e570fe73a689dc9a2e3931b3e26519f56924214c55d10a07055ecad0c9ead4e2489699761f954f7ecb83f196c9f88738fb5ca72f4efd3c4e9a5e8661cad362643c4accf36b6ca202cbe5aacef4ffd7130376c8803d889268f64bbfbab243973389349ed2d0355d8df5066542aba392f047198d276a9994bde1cb7ec3c964f9b7f7fb17fb97190986128f2ada360c3f3691eefc0c1d59cbb52386ca64595e12594d483f57073f2d57ea27ff7edc61664da79d20189eefbeb98326ab85a8596a7f55c21fcc6acf51674577ee16e6cb8f9d51cdfe313484f62fca50290eff7c8793d512be4306f3fd1eeb26fe8a9c71438e5926a0402940f981c0ae4de7a6eff3fb96df24a525d1bae4a4dd37c2467c098886520d2ec34a51152de81ef9e5db362160d25ad80d910f213744a2a72c136af39ff64de14bcb8555d9a6a42a0468d66bfb9367c6065c853d6d02461f965fed376dbd694308ea1ea88c8fe8634abd5d432ec953555a5aa3a00ec02c13cb871abcb84c683b44d0a3750d4bf18d01035310c21c276f4fb2f1b3e2255a6c14b479ea474e52b045a49c262583c88e6f613e398036eafb2f8df7dcb0dada10b90e932ae4692f8c558f92229cdf7350dc00a8282dbca4e140123e844286b4e902bcefe2554508b6bab90cd13a06fcb99207184494595d09cb6a4d145ed2eede36e7157c638be416bc49929bc6a16ab3d89f17f57cb31e5b17bcacf2cd6692d69fb68e5ed6e3cc94a568ace80a57c625f5f02ca3ac72eebf6e31e48856e9a7bb8352e1f276f4c718bb3de320ccd117f63221dfb6ed3fd61d16f17c3dc30436742be2969e0b67dd8a48f1beabd5b66510d75bb89607c2dd5d5823fc78db5e46e9df8f36cc5ce316d292abc6f1edafb95a2cc540acc2a20b677cefeca365a0df02e78148e332117bd8e294815bdb641abc7888fe5ee6876823ca7ed5252a7109a78adf544b559913857fd4794f697c901e05cb7a153a1bfd798af83f66f27acdc011d1e26b8d22e7bfb39236365da0236819b73d3a8703d1520385b0ce84623235c4817bada254fd6fc4f63e798077dc82fd74ce3395eaec947e4bb2c5aad241eeeb14a6785bd95f7efb291b7e9aaac255f929b56a2c7657294375ccb32a7201d3ceb5ec35815615d2a05355af73e0ddc754fe7b45144f19f79a298700cde97acdb58ad44adc762555fb9b7273d2c236c1581ca72e141e3ae8cb8f69145be0b4c2e7bbe62034de99ed532afc3181f7d42c4babc18cf68bc3e31dd1fc579cfeb89cad71aa1f51397884f2287b534628c0ee76d252c7803dbbcfda14c83258ec8d414fd4a9affb2dcb011ebc7540eafd00f121bae1477bdd2a964883540b56513b9b150b6a39f962994c200e7460351d9e1b948bf673ae12191faf43284b5fd6cb90463f75231482ea4d4047ff1bee31a156166c19b5e3858e52597fcc5b3b23440a2c9753d71432c7ecc58f9fd9dfe01289f085d374e0de94178d5dc9a1b2dfaef00d3c8bbbc11c3611f90dda02ced3f89c6bffab196ec430569205a5878bb2112a3255a539e2e842a422ea3bfe84b25b76cd022a0a55df6cf7b1a0eb749046769fe30b2ab8413ef08d894d4735c92444015eb5d6b05dd84fe2325620d08740e4396886a1a0a4c44ab4765f881064d1b92468413a734e57e1005d4ece02394b64df08ed9258d4255701304885f51f62c5c731cedbbcef032b3779b17c746e0dfd790c68854a99071f5d012fc64dc07f6dd2028343f109853470d0a6b38dee2eb7f0bc2103ddba13abae2f3cd48110cfbb2e2388f97c64840594a856fab580579a2a603d937901f002de039936f7d7fbb6c1dc0685c3c8a9a4894ae9d954ee30af1040e7be8634462cd3c56b7419ddaa667475257030fd9c1b39fe86d8d2fe60fd8aa4450b6c1cbf3277bddd174ee985d430350c4029ca04728a0c55809879908c81d37f029481011bb03314a6fdc53407db66e48018f98aaf66bb7f580c266765db16be2b642bb4ef686e3ba990375e075e4ed4b56450d5dcb4542ce997cf8e8f82b52a0f45e181b786b778a86e08abdda235056975988e005c1f83b9a23aac125cf8ea35a06d107af256f32cff00c5908e659e23b3985c244564ad5293306af753262725db9508409493d6bcabe651280925c86c861ae84f596bd23cd37970454e8908686022111154b546e1da84faaefdbcabcb56e4d9897f7b18fdcbdd65043467b68595dbd5f61a066d22f4a0652951736ec88bc0d8da9fdeaa1fe224f13def095804e48af9f6cecc730761033da1ed923aeb8d748d4ba2daae2a7f15bdf766b7176eb4f5281a585080188975281fb96136bdc4c89fe36eb84da40c7a713a81b91b4a6ce50869a0dabaded5bdcea99d278bc59986b7abecc0ae17f019b50e28568b20762241eb8eb24ce0aba5d94a812e608b72747ca90439fa0a93ba2f7c43d78f7939747ca80b1f5ca674f3ee074dbcde98b85c97e79f6d58065d278a8bba8451db1da361a9fd6a13b99970b7eae91a2c73d404af6da3a2f192b6276c4475a5f6d18a7697f54edc98a080e4dcfa3d9074a42c346d41fa21ec3606817ead5d82a9e0e8b7c794e4bb14e39317053f3165dbb42ab6796d8a32727ab5fe67d1586390929f2c988fa94fae0b39d0d9c2aee38b2a35517af93d1cabe72b66cfb54f8fd36e179eb3ed83e28f9fd9d9008a9a50ac8eb4cc18ebf929be04d08160632b4f9bfcb9d4bfb65cbade27ddf8239fdff5656911f0fc4da89fd4590d16c0e2d2eb10c5eb9865f21b20c42cacf6ea0a631adf42b385ce2631c7146f48ef973a2eab595016b04daaa85c6935ae9afcd2100742a10253357f7ce9a7cdead28e7426d69f25a3e51ee6ebb6f4ca4bae02ffcc03b50e6621da5f714db4fc5c884c96a1b609cdf8ff80accc768d73ebf8a39a8157601247b865cef83a648205d97aab8991c0cf7fc61d0633e35eb9f64288aa164c6c340de17dd5f9fadfe94c8cc0b8c5b0ebb39f029afb08468c23d4525837732801fd2062ca7a5cd34cb89b6bc5c73d5bb302bf7aa29333e7423aedf0bc4a803346f4e903f6c7090ed378593c32dfd9da404349f7dbd79c0ea684aae65ce925b764a1ce8ea6c4e8f29eb0edc8ae098174b9fea441edce2b03e08b71fbdf1f4afa838c38c98478e2c9d2e8c1d7e24c1d7246bc38208181c90d19d7abf6eef1d745c93e907e38ebddd99aa93c3176b0951c11036d5c3ff65c7679eec1a03069b4e0613e3c736a25c26c1c79c69d113dd1ba3f5eabbcce37cd84275a19c14e8ec9137114a671c12f7ac880e3c7e45bfcb994fb525a09d74c05804ca31d21ef68fe262249343fe510ec35ef6ca7cefef436f26b69e20b013bebb20f4f3487bc003c609b6450a77fd0fffd919ecf239f2d2e1bb72aab8af50e666199e8c5bc5c5d690b05ed616f37789d678d00a5abe9b08b58081d1d4e5acd60d611f63a8978876f6d876ccf60b40eadba0b1a922e818433f186cba11ed97ec05aa0fffab4b88734ce4a6a01429f9d163f3575ff7312b1102e58bb9dc41a2b6e336e8d6d05c364a278756f61dd9f2ac23e3198524342400856a7757b06c4db51a9a227fb464226a0b2310156f85dbf98fe270bf566b93805b39a82a1ad7f97530665560c3ddcd615c3a6aa485d806380c940574ea420a1ee8b5a697981f5665b90dea008b33a7bebf4fbf19fd2b11f62e5a303c7c51f84ab270eb26949cb50529136905771041d098d595ec42098fa269b7a97c6905de823cfdfe6dbcfac5d1e4f94ab613ce1c457d6e77a1d0fdcfcb533ea9cb5ce83d540cbf58c36d93e96a813217b8fdf7979bd16cecc1366262df5f51d99fb473853e962772ce2302902d824048747207543239735dd0fef1d96cf293b1600c3256b06dd8d4f479c16a997cc6657f2c97d2b719f453377706a3e2b166b9b2c0af2248084617ccde4ad94cb516f74f9a038388f772558b4b2b42df205d6b1e7e346873d9f183bdcd295ca5dfc4665c26e4f726567ffd42f7da46c0a3ea4df9918c99a2676dd14dc2c7753361514b2b7fa69e1dcb6f82d4f98e2025d09fcaeaa6f24672351d69035bbfa383ce400e43f0e2f8edaae3aed7bcd15f7d2ae06a582b1fff61d772b364f47c78059b03382c17049804895ed9b1de2e5545074ec4c89a6014dfa31058e9298853374c3d514a7e95ebf0fb438c09ca0fc20c1a5d32b2815d376a4c78c216775dd5a75630d2258411654155344e360cfff630c87e5cbc5c71d790181e77634a777fc43d903353c401b4644ba398cd137992519634ab3ca85865cfba63f1662f7fa21c86de0d4bbae129d83303e44579f706fd0802a6b9d15b6297980bb875a2a0fd1eb66cc883d52a662b9fe7b915ad12c481928ac7ca83f56e862558453830b5d15940eeed82af57d9cd06d19fe429376b9dca1f86d51cd0e9fa06ec10144618df4abab6f4cea5f3f53afc3401077aef6c9013437c6028585581a139b1a07f346771986766ce558958f3e48175161ea5380702991102231641ab88c3a25338a31a5c4e72cc184a827596546c748680e35e611c82dd1199752ee6220c5aa30eef5869515b9d22d169cb80c03777df5e44604cc5834944e80f8da0018643265e73b22745a4427496c9cb51bc850796e322be18a23cdde2bb3fde97abc41443c3dab824afcf5494170d1577add7ac33dc18f85316f213917fa0b20b85481681cb7ecadfd44f5bf7bebe0a6128a1ce3c85918f9ab85582c7a1bc789a3284f266d1fa7ab777a6c1161a474aac9175f6279c16e44dead9940bddfdb2b2180d107983b83859ee682c85a65336c88cb6ac7b7c33a6eb42f0cfb460eef0e1ba32f9203d429425cd05d6bcdf4c5f338f0669ae92524801452dae87e70aa3b7ada925017b140ea987f2882241ad347bfcc7a6479b0d381e55f2b8ccdccb5b9246d22c73c9c71863a3c0996c69f057107a7cfabce2cf079119e26719cecb79003a40681db5b641c294f282e1b4b0278f6cb8cfa506122717f57f41e519659c9fec667065ab7c0b74f00aed28be67364767fdad66717126f17d2bc1b5693436bfc1d6cdc23782e5c9397c30a7e37ff3e6e0ae1c97b15687ec156a7f111ab1c7ee7ef3e8d9c665515dd5b8e5f5c074f0dc5b5c85af424cba3652ddd27eca58d0ba68504a12f48dee9159538588d1e0ad965c8b8123a0ce3e8eb9d85454d4b3d182127e79e43e870e1248de87e7944d9aa358bd877b59559543befc8d39e63d5b0401d0f0e3f0cb403f08bc757894164891d455113ce86d5ef3e6bcd5a46b6fcd8ebaea3788d7d515962d7fd6d23dc527d05404a6eeba9fec2da58bd62ad0c5b9a0a23cb659403f0eb62b8b148b1de4c8fd5c2ec0e76c47dd4f800bf713b2d99fd85c4b15cbc6539bfd9780c6e9910f9c675145e7dd5a0f92e81a9fc1158e05f0944d97ae56d6dd3dfad5d35694537022ace7ec94372051bd65b9c9bc96cee55c72faa51880fe16753c8b054c11b1e0ec3c64755e6b3bb8bd67021c521df20223e2f7f5cce0a8a9c2110b893fc858cc69a46b929f00289f036a67fa2a2193c6f772a9fc33ec7301b536fbf18a4e948d1b6371a6ee9c638f3fce70059d3830ae3780953af61ac9b8cf1cc0b0b40b11bd91f7fb34b5766903b321aea133d8354274bb5e348bd229295010ee5955944cd83de08cce9c44c5971df2786f76682e0e2f81597b5dc92dfe18d1f95de760a2679fab8ad70b7df5b3c0cf51c2ed8e977bd8510b61f466248169ce6630d1f6bee637b799d07b9875e45c06ef4df1b1ee160fc908aad81fc96dd374b974addcfece86a32e6d651ac293303795533b58be672647c598817c691dd653678bf369ee9b1cecbce0607b685afddfe895230964e9cc6bb6cd7902a00bf2e8f4f91b440ad66af2b9ebf630e3a6157e6d66314a9e08529370bc3728eac2a9a3e64ebdf1e00ae153c9d28ee1a10f07817858ee72b65d595d77e74475c5ec7b22cfff33e9eaa3109e5156a2f43cf05497addfd3384a63613830c1196fbdc3e7d3f68d159297298920e4cacaef13e47d0f728d57f1b684ea923fec2e8d3ee360360e6aeb828218bb99f8b17f48d265f1777ac41545a76c562a09cb1c44c5e574d78c3b2e4017fb185811ad3887d4ff426e0b36739a8974443e02e03b2cef34a626d4504641e54b3fe9a4107f22b81af031c836fb66d927356ccfce33ac174b74b29b5cdc0e568382cd348dcbbfd8438b8116482531230f9a24c4e77e58daa450e925b3481c083e9181576796a5d1f364da9a0c899fd397f2f496be73a9a5d9db5927e622e166c6ec946150687b21c51c8ca7e680f9775ac06a99c5cc25154674710677e4f4eec6e474f6bad9b644132335e458a3e48ab292e5629fe0318594acdf35fb16cd2cb929b19c1942ddb5781954c3e58ac79a59daf365af4875832ee4e25ac230e09d181cc8b5ee3c57e25e5f77cb1f7e39029b192337667d67aa8fcd28d96fbbc5bc5e3e28c8cc3ebb7750760d6e5926bf7000dde34c77e76e4831c62136762ff307162e606915c28ee0d8fd842244fca14f2589b209362f1008bf5049f657f5ef09ba4dfe0b6d50389b62468a8b4568a51c63ad1e1233acf358830c219da7b61030c51d502435605f1386e16f0ded03215465d895ebf2f96ea4174a4690c7d90d28c12d0548009b48e5b17ec02eae54bc73866cb7faf69d0897f6ab17844ae74c3e38fd9bdb4149bc8e7c4f2c620bc5cd165009d2c3a0f04790abaf12cc935943fd86ff728299f3f08a31f2f25c87eed9a95d1094da949bb22aa0b6c6ee53b78af345a337a25d32ab458d0ab052952878a8f8116ca44417cec27052b27dee8a979bffa949cf1d7e336ce7f6e508c61b1091db9cc8b531ccf3f4851353dfd63ae0741f42276d5d4f2f4cdd381ec39d3f37f052134791e053c83d697929a8ad50fbf82f3e5f018f2e0581d74ebc378cfd5541060557aed224c209a7e4b24cd65550b499de6f3045833c8850bb4bb917de0f0061f3877079b867e59af67c50d3c0752609a2c65df2f76aecf40e5becb069bbcaf05e359b5997305ded2ee649481adfb8d93bf30f29e2e71c1ba84b370928e1ed3bb60063f44991ef08ee9e8a85dd0709930a83a85cee57924229c81c648427f39e8b768edc3822f568b5f3b92f8f7184c18ee6de0e7222ebf1f321216513e48aa35ee66063fb6a2d97258449a79aa5b6df499af4a106ef85c5a504da7d50adfee490fe7d4dfbbdd41ebdceb070971a1c66bb2ea0d71503fc17afd1ac3fb2faecdce21d59dcc1b4a569df41823cfd5521d263f056f33506bb7284261b0eb341b0f692d17aa2d5e4fdf31a7b334f45dd63bcc4be8b97ef6e4060c260ab7cea1907bc43a95432b0a56a64efea4839f9296e806db7b3279cb1276cdb1fe20ccff74da875037b0eea9c6719dffd358f9faf8eb7cf9a6244d565ecf14eb23330cd52ff45a77e5389dc20709c6b429fb2a1f650ed5ac51d5211f2ed888dd6238b7ab2991e3b8872460de813670258cb359894617bafd648e1eafeb5ad28ea476f40ac979cd1a05bc61849cbf4359e5c9aebe01cfd2f2c7976c8dfe1e9906cf36ec787973bea64748c53cc06ee9581d85524800fec69662383241cde9864eccc0c67fa1495e633510b78f5509072a1a2f6dafa96c3dee1db99954c286416d845caba7a7c15759b85c5d03c35948d8c60f267966e0e004e161c84d44bb716bde52c377f4a44e90b673df2272265168086da6309e2457df947ae7b4ba52be51c1e93577f0b9ee11189e6674ca38cde5c790155bb8fe4987204a20128e11d226176a2a2f03cadce3c7251a8034566254edc19a831e375e056b1a99ee27c152f2c71dc928969dc30eaa5022ce164ab8bf61485d2f37973f605f317ad0ed2ae9bdb94a3be90ffc499ba866a6e6d9da782d0b6d87e76be594a0e3d9ec4048133d90d539a7fad8ad1691abb1d051e6cf4aa7d378403422eb04cede5817c7a045f672033236e45778d3f89a77c696a4f0d534a1b0af9cc46f38f03af722ec5d89bd6c2b7c102ef62728d85c01b03d7a07c2dc5d5efda9b93ad811defe3538e7a53a8535605c601c80bc3adb97b7ced2dab8a7efca51e36a148b36b2b57a32a76114c509264303304d3825fe8103d21333609e3f3cd4d13dc4f9699e6316620387f3348f16ec9e9c5443a2ad06bbd1a4d862c836fcaefb9b14cbb18a52345064dd81dbb0777fb9c75e86b8d06f0751ef91652eba5106e9edcaa9175ec8fa85332d63c1529326dc1932a96f500410dc5b2811d6b485042499af3aa1020e9088d63d44ee5eb00790fa9a53cf130dfef9506310ca0dded233098b27595e6c1fe1b7d5ca6bbd174a5cd25c2ce102d2f931360c0712aba5959ea32617475b29cf193cbf9d3f551018c90941ddac059b280a76e9a1b4782178eed147b372df8fc7b7cfc2667210e2995e07110e3805afb30e76c384ba5b9ca0aafab8a3e2d3e43043d7a5cd0dd5d7f4a33594668ee857c3c59f61582b3b5c385a853f8e9f20713145bc3179178b355220f9918eb598db80b6598dc61002aa6686dca51db2ac7ef346e52e13981c45da5ebcd22eb5fb8311690d0d757097ce52b766b1f72261539ecebc6442996f4fb5e4e71ded97fb969e6621aa0f53e21026748b2dc4f726375963a89aaf206c9b0a3ae03b73627f5e5136ff2c39c2cbb80746b3df2e39e2744c8f119a0238fb7002e911f4691e6e2150600d5b9dc33a0d1fb44691dbf17f50a0d95f2ae2e60418c578e00f77d4b228c36cb5ffe36117589646ac097327e4147dc9fb13f7346fd97a6fb756448b32bbd3e25edfb3a14ae194844e109fe1f9070ae84b1cea2924fc4957fd8f794bd622a74b6fc4b38dbbf040f7926d0729a67370bdb80f63cd0cc85bb61a83bd1c86a4692f52768e2c53cdc226e1ea5206d39ed6d1abb309290d87d81776fab9072a8a3e146ebdea86f8c04399a44d288168d165aa8acf8544107fe8ff79bc1513aa1d50842b6170a49310ebd9415f33a04d5445d2be2c7e27fefab1f88b907849eea2c706f129c78d0d06e16d22e8186d6b6f9dd1b0929dd8bd3e5e89143f8aafdf64cb2328de97494cea4eddadb082f0a86a952dc7c88a613793153b7c92f45063aa826138488ae13a0459b24c7e1730ed8c57706a98ecc95243fe942b4e5e3163bb174b8a2f465cbe9b2b73661b7f35231f082103c86c19f895431e893e6f5cc8e0b066845b73c2bff8eba8625063073069d3c9f921b15810d00961ff29d0d87861763c8f94ba1c2764c2daaae36baffeb3deefb46b648e823d7be4f3d629ad5d86905414a1c371dd25d890a59c3e347344511b9c6e2cc43624be2fce0e21e45e972636794b35c9c9835452bb45859e796655d619f1b20113cdfdcaf999608362db626b285ab82cd3c85ea854a4e7f5f75f12a693be9d4d037f5e3eda3f8f95539b6a7a8796f6a3e33a201bd8830d42d478af16729b96b0ee830911dbc8561f181f66eb00c69435e123bf32afa89e8dfaf954ab1e514533ba2227ce63fb5c2b99af7f47f9b43debb5c9667642db43dc502a2befffa851dd50a1e0fad9a14ac0be93dc14dc2697cb47753b6df7e6a439be5259697d6763b7984b5b1fa782c7e76f12a7dd10e54ae07f6e66a1379068ab2cbb09a1015822c77a67c1c434667ca794750527fdb9ff2f46fe109a6ba0383b82ab6120f1413717df3c3972e81510081505207c0b695ec2826b61def9dfbbefa86b896db7eb49afad13ecb02b562c12da072063a2bf0ea01dfe80f74b159ad18743aa10b91e0195ce34020665f378cecbc62d652a81b8d1fdff966dc7097ce9057aec9261a107d328e7a2fcfeb29b43d1896d090b78035e0cb6cac6d7850a3d0b5a767a163e0271a574f41b5e5c3e79d2970bd7ad6c984e306a458ce24fecd8822971503fbb9a752c2221eaeeb90879b7392d5779251ea953652e465030c9bf5030049d46e178e9a43b51f21490a24a69b7fc12d56a3e775cedae7d88f049fc5fb758e7927844d4f705abb939aab3f4cf599f8f2a04a0c1334bedb8f4571595950694b98b48a53f0cc958c9c6d0e480d0673e56e1bceb8fc0c7127ffb2dd595dc64e19899184431cbce80aa21c8ddf5562803f06058c7e7eba8465a053930011b1b670e24b2c9b21c5e49e2b45a455b48e514e411a0ded39c38b0d27a44cfe33a714da294dcdbcae7bfdefbe650c5bb8de699ba5b5ed55abbbd796ec3165a4220afbcdd515f2282143a657d1e71041c0f73bbfba55857843080c8b746777827b71cdb45c30348e18b1707eec684ab86b5d4a12e59570a5ae3c9c6346c2fd199e602d364538ff2f0359eebd845526101675075dbde2396e3bce09a6d9d050ea095a7cbc267cdcab6f8173ac203a3cf960d305c8a9c84a428a40c6eea42c3d744ac54ece56983783bbdc91b35683e9c4c90bd80c4fb42dc2f81966734c12fd38e14515e57bf7aa4876dfdb7b8dced712cd63c09106324e5023dc6afd28412ab85b3e648a0d37af5a3eefb35d3c776f63cc8f81ff73cf468a9bee46e4cf1330732725bd2460b4b13962a0bbe0e91a2d2864e38e800ee780c2aee38cb2b725c8d9b39f726d3d1b4a76807757af2a239ae1251438fb3e1797a8fb30aeff56e53e8caf10469cf8c7e59216f809006620331e6b7623a987dbe59e0f7a102354de1bec780c8c6c0a371d0ca497529d23ac8040c6add12382b115223a1462b7076ceb898d08c63308055b56b7d9c6cdf904fce8c50fc3e1a51380d629941923053e27d47c89768a68af2af0af23d82b4cd61386c5307e6c659fc31a4c7da60fc4be5b6dc4f33feab291067b192a092da5ac6eab65a4534c5a92566f21359bd5dc69e0a5d4fa64dc6c5768467440dc5d79d468b724cff4e9eab7b56536505d0da2cd622d4af397c7fc6edaf35f0cb433500a8c3a6137d5cd9c5c6a7cfa527c2fbe655a5485734b35e953d90217e23337beab63c5c960787ff61cd016ebb07ba485ae33cc22edf1cec982ece36d75dbd32c3369b9bbde5f697e6590d398fede14af1488f491e81dcb038871279e1c10be1f2f18b6c705ed329bc32723709215f88134b45e50f641e32dd1203f485964210e1afb2d597bb433d4b20d97012ea5b8a29b6069ee7ce08fbf0954aaeac268d48f738b8e11a45705cfaebeaed9092fdd9994f7c7d8f08c292d7d98eaf3cb7120f9c534695e141820d335a4cb56d5f6ffccddf4d89ef5a757ffca678001f92f9f038ca04fbd5faa1d95e36a8d08f9ad67b2b2d21cbef0b494bc5c4b0a83bff6b703363991adcb7f347e147a547e08a5ddf1d03a1497865657d9cfaddaf7a459019f6e7aefadfbfa3df2555ec21467929af0a27740d70aef29de811a71ec2ae8f72e71deaa4c75bd72992282466abad65735a62431fc12f173411d2b8fcfd8090036fcff61f7ad3b8ae9187f61ff66f37b4747cb6855130fdc97f02b5511204bd55f7c37973e26f6df5883c0a530f07c7f8c23d74490af9cbe4996c4925e9823cefe5c21ca9e6771e86e00d070adebd3ecaab6d2673d2d1aa0dc9d71a816a423559a29487c86d32f5ea02c3964c4ad9c4af97d373099302c2cd770ad06c7d8bd11c970161d861e917a854265e223da28031ee38041534d23aab09ce14ef0aa737bf2bd152e2a9e4af4840fd08939f619bd71964809e9d8a3b30e8eb8e11f9dc91cac5cb04ec2d6be3532d123ba8565f3d297e1f90adb671ece27c29e5da327304c6cfb91c01d5c6db50832ba0684be18cb08631dc4967d1764c2d50c1529db3ba3ab0614526893cc0c7a911dedb6632b3f399610b7a98f000f36427cc8223e6dbaed08b25653116ba40098c9e099099d87b2078c6483118b3618777ab71aa528eaa970164c5b59df0440a6388fbaf5d24ce813fb4bc1a8fb71d000809271b41fcb76d8aab4ffd168b5a146043b8acc7be76267b7edd3b9d33af35a28cad5ff94d5cbaeda209f1ccb20b8f497848701fcefb75f7cbb47c8c4fa0900ddc0a5cc3a822e6f3f0fd7a068edee3e7ceb4e2ad7ee3d87a4447c6a235767710a246fce6359059643d337e0b475b7902ee03e9b8f4b8b6cb91a0ff290abc5475866a26ac1e2e7b0833b1e624040ab7627f3d6f8a580177b359c71167f9f78e022f7dc25b8884b5a678819b99ed7406ce2a6b5b69d34782fa44c2e2a527b18d804687b73c9d1b6d08b4ab84b22c20cf0f9793959e8d114168fc9b5c2abf71b9b67291ef97857a0cf4903588b7e69678ed6dc00470ade71bc4265a6640e7c07a6e5ca151b46829fb33b32991ef465f6b3055f792295b5178d86d05e72dc725386eacc2c5da6db1a18dc78e86a371020ea0f6422610c1d8c06a76a6c93a89285b7f09f93352bc9965c9716d4e1b9207cb05f9a8a86c04035c43ec44f3af52514b691b5083657e69b1b15bcdd39fcff70926053201864f5bb22b75e84dd44d2970f48bce9d58dbaaec0b2db6fc7750592fccc3e617a6c8672bea +0xe7289fdf3a44e9636b76dcd8d94a0e91ca14e655067b498fec91789ee7d3f1d929b31cc8c0da83344e468e126ad415d6 +99232 +0x619e2aeddb1e23d8db1e5bc3a36fb514d1bf6f2429580197950b48e96a66e34aed2edeac16098d1a947abb4b10120577b6e58069f23ca2d677895fed86a0922f6d239f814e3e567f21951b14fc7b44479265c358fb9e050cb33c1a45e45215d5e867b694092746b18c59c345ef113d2e6e27801acce7f3e24f0ac01a0de635e666e16b0ed22b2555ddadfa076f3cb7d25113ffd6ed8034ff55dd9b9387c2ba07f07905172eb2ba161a780a82066479db431187b5e7cf900dcc9cf1d9dc506ce28c17ced6a724ce994da439dd3bf14cf24d0961df403ecfb1bd2f0b1393f6131f45a30c74c4ea29897d18d041964bf8bf75e3d67b8334b8952f7d316a351e7666200508190d6a938cb3bc16d5a0db45e9c5872cb2351914612a70aa06492f5e5d27260aeb0b0dd44af67855c2e007fb1945ddababe054abbdb7efc00e579193af61ec5915453bb36d4e34d32fdf38e1f6fcce9d8f0b4f454fdce3b9aae8abdd02d6403fbd445dfa9ac3d8da4523d7c029f24048853f71aac2a332de0483e704ff8f0b020c8ed96f7b5e4cb02b364a60592f1cf6b60322a1bc14c57741b0accf4d9333eb29ad19dbb826789d0aa0fb892fbc4bed49dfcaf4e53684cc8cf7630794eaa2423c298305f92445eb0ae7500352a0b475675bd169e71157240be172747e9d3e4f6f8881b7e55e99e05295b3956ce33ed83800a0c967ad27c9e6f542deb1b3f159e8547ab724de5ec60b318b09228ed35ce3559ddb1013da0146bb3b0dd534a1aacf14d6ce5fac7ae35c4440251ea75a4b91e33169874a5a1553bcc5c9932938884d51fcc43eced7806e553ab20839baeb6930c439775a8d4d347f49d993999d3c8a925661684e5be469ece0778749dd8594c6bf15864c5df0128d2d067c8cb80ead5f4b6d8633f05974929c3e44e1aa60392d88c35c27b148146cdb18f60a7145de4043af3f867d25b7cdd5cde70809c681eb890ba2f3709b63a6b9d7ab1cb02b47bea6f03c4ee9915b28f4ed17c7e2fd948a29b700b8843226c3310a40c95d060d60ddf824931ee588285f667c251d4e9992cf8d1d7fd4558649aa7b601a601f5baf4e8fa05e036965577f00bf2aa301b889e557a24f484babc28cf0b115a1be5732627d58b680651b3cbc8388de5a5e1bf9d2db3631c85ebcb53e32dbc4092b29718189f3a37d20d15f7fb67e4a2bade769fee2822c3cd4e1ab2a09872f7eadfaf4147d1a2de2e3b0492e624a75fe354762d1332e488cf6442bb73c5d5de98df244811f745d97f6e081334f9467bc3f616bb398e18da10c0abd4d950456331438e83238aa3a85a1888ff44503294b135d0c0cd74304615e5ee954da25224287f5688d8f63cc922cd1fcdb0c3fc295f964cd44b9fdb4b533663834d467ca0031504dfcee481ca7dee24f4e6bf13a81399e37c306b7a685d54a31564b73555459721de61b0031ad00e410b72cc19af61a32d1f18618e0ba8a335d2007f0cb25468263b3df34148adafec87d1556e9dee548233700c96c3a9b4942fbcf87345d41a9a4ca028ccb28b459fe08ef592f20e30ab6fb3e7252ef50b36a506ce099e3920f6a954caf606dd61c3ac0817174a4599e11a606ba98c0f09a5d85a7a2019f81db3c7b8546da438770040d9547c152922cbda121494894c525a104467575795636a3e474f84291117de557f1821d12d5dd405357c86955157dc0331103fc5958472638e26e9f3fba6a64065ecb91cc69d824236fdf04ea29c9427cd2f19e27d0374de09750f934cb600a82a4ca24689746f07b3335203b4932ad464fea63cb062da0425b45595a8b865d338b26decea74f2dc26973c530bce08bf85194542d4252a8c7f6f5c6984405e782db88c7e6e11a625fda40fbb1ccfa63fca0977836cccdecd72f0948d63c0430d55b97e8998cd017bc4e45cba6bfa8beb9049cd8ccebc7f4dbcf29e7fcbdacbe95d4fc48cdf298d5408d2a3cf7de142397454b7ad8e96849399ffcacf30d241b2b0f5eef6b599b22535e96578c71631afe2a4b68430cd7725b642b9ea17495cffdd166e65c0a01895d8a31234dc0c02b567d45aaf39d3df7a7e95dc5ef3c276075e5bc34864df18fc6daa4a8231251df0704e046d2e3c16187f53b2ac5ab0158fa1207e1d36a93bef71397eef4b13ebd7988c546c7288c37624f6dd40c0b4c3ff31feff62aa8109d5600b1feaae3b04e15d09bb1b9b2c501a0c09acbaaa22f9bcad51e7a725090b44c689bdf2bf1cf1841a60b9092cb9548a8106a1889b9d3f6e6fc397595aa3a8c4212fd996123c2a566d0bdea39b92492e40787c28f9760d7af5cebf07afe37ac9ec77d3532c0b27ded1758c796c4996abb6c96d1a686fdc78dbcd9f10994af9cc94fc6ba8812c6263c43853091361d559509424eb5ccd24de8e5ae832ab3c9e52c727e304a5f272abd1ceb2b1255d7dddaa43040a4b208f128a010abc5a5ad0e2ef84e9f60f0fc11d76933c3016bf089f3060baf5b80c73bb5b3a873c2b0849f36a8dd10b10d6e61f1f404fd46be8fe146f779a4c17e36b4f8e61de2091d7621ae4bd48a27fda5a4758307e3c996dd6e3c3f2225c0f47ee3570317008334aa1bfda9da16a90ac861cadfe37c733d02b73ea5b03d3f29c6503bd040d6163c49158b8a98bb207aff2158d041d02afa2545b2f2c8f1276637840d173d6bab7f7a97c0b6b5817296746b871ec9e8d7146e9e01ee144b5ef3f906339eb9c82b43662a04f4da7088a64cc7bf9022cb63d4064c94613c52cd18335e172e5af37cd13455bf0eaf914af2b2bd68eff581b48215d7d213e80e5c1d0e151f8ec8f688710da159cadbeba0c1ccd6ea03e913b466c2c522ccbf88f449b1b2b588acd9356a19953af10786735dc299ad94a78849c736a0ee5369c77be544bd40e2aea26d067fb9ca4bda6ba90cbd8f1a6ad6e85def99ef9d718fd3db39f1bf2865755b178b6895729ffda12c17e53e974c1f3cd724123b97eed9b5fa8dde3fd4d9aa0b1b42fbb298b71730e2c661308d042a8b9fafc90b4392ee74c22933c5ae06f4bb61736197a659d121b5605aed65589edd9dd8e7e70b247718195419d91db3fc72d066c1cc024ed37b8c2ff7fb8511243ab9e69457566e1baae958b80489aa6a38526244da165dc4464e7961e457f763abdb23f7e48d368331197b37cd5ab1e515ceb1124848504d8be587bf3041d10437ebd53915164556b59106bebdf99115122d99529e02ee155138a13a65ad69aee7d14581735a633d3f3941775acc12a33655632d65abfec5a02f0efa0d02850ac275bbf885c157e0d5f973882f3cfb378a2f56ca24aa490480b21826afa8eebfd0bf7ec6d3b4ebe682b9e519c1b2167814a3bc526369977bfaa905e6d4076c761998d812e599e5f84b61e0539a94290fde9adbecaa4fafd115fc1e640387c6d7a6e60f0444d90ebd3ad9aa5d414bfda3f0fafdc182c45bafda94abc5c490c6897e936cc677dd2ede56098b603e405add50ad68f8723061bd4f57f4349f8a3235a985377d060c0d02a7d9cd841ada0765089964ba03fc8aa27e2e40d71dddd38230a6b8547acd72d23632b7f05c80cee220a83b2fbb8e9e076f01d9d6c5f171191adc3771598a27f50afa90cd8c9c75fd9ec1337e254f659329b9055a202ed4a16f11fbfc2eaaf2142b1ba1423295c55d8ccb96d0c6a7a7efb43c0d8bb4fdc3c3372c4d1e7e959cd7a27b3278d7d386aaf1b0aa4c28ff2bc2187439900cc407277b1575fed3b2ede576048a9702be808ed657b81bd2bdbab55d48d092adec687443b4bbc6b46bace7af9cf3c63cbe7aaf42a807644c4b1c708c9f1cb821deae5395f1669baa27a384562db32d0c3b3eb53d8be1501f0f199aad63632bef01a16b7bb4c0a73c4f9865729e13f5fa9d9249d0e88c07d27378dbc67bee129fbc0965fce50f12f24954320bd75b468e4c3f1301a751b0eddd03dde1cf0596b979ade8206c9c04547e9f922ac0d34751b00dbadab07873f8b780450547efdfc69f569df031afa4eb56402dd541c321ca31c3e763eb49797c68b8be3bcbf6144e96cc2b731c901a3e3a01ac174272fb82382b41a3410cea015873ee8a43605dd7c5d73cb216868fd590a8b7f5ab29feff2b0b71a29808ee0def797dfa9776e3eb963f75b305da2b39c1fef579643052cb742c1e68da86ab2a95911493af80ce1170cb8080d3d515f136cb0faa55cf1e6e7956f1feedce4cdfb2855b5e73c646d2bb45052166bc768556d7ac90674e8a6ea450916bbb28f7b4ae1bf962cc8f72b4e073ab9ca8da757e88e9753480f4c0555ce4a8b72adcd532f11c97a7a0257a41451d1bfb7f763b6336cb129d890ae5aa08d8dbeb24310de0e34fdc36d9ce8701530dfd46d5d7efbcc7432ad36bd824f612f5d40d9070c747ed7e71165dd3c17b720af8839146ba12a31a65df0ca6a3c0e1033b2855e22ded756ffd4f167c4f370bdbb4bc9b0bc4eb32186dc856bc8a90ddcab7415dcc645ce5eb29eaea1059bd8449daf8db6e34d2db04e796306102ee6e11f1628f79971ca3ba9deec3d90996471c124039b7324c09a77e5281df3363fca29192d330ecb319a40063881d8549ba1c039b9d2de8e321cad803337c4476ef433eda11388babad71fa522125f55e47105611ef197c1e8c339db12d815db0afbda04031da9d8cc9e835c27539825d55c2b2aa17c31685b2ab76645736a898a4d860cf1c5e4adcd4d356bb6ea054cf4bf8c06ffd73dfa1fbf90b2599e24ab6375b268cb80cb92536f80845f3a4923c937b28678971fef9d0e703fbdbce6e92ce109981ee2b13ee561ff169ed8b642a9413919aa4049c16973b06ef05433ab5d3bd62b5a7057fc09e12b92e429ef323b687a3113476e17ebabebe08ff87d6a6ac2b2930c9e026227598099ddb2567ae61a107d3220df4bb9f38d04eb1e26bedc32295fb3d05309c437889bca068e854fd2765e85712fe55b071e7c9049e21137e6a4e1decbcc4b6717be09579ae9c9bf2e26459bacc26d25330a982de021f9f47cafd9ebd4d0af96569b6304f41ae0ea99aad2d328595bcf23fbe8029558e19850b4a8797ff2bec880ab593086744328817e86ca983729af464cfcbcbe095099ff5dcdf641b4f18422583c88e698791f820bc1f0610e6f5c168846caeeb5df8ff505cae0be99d03fc84c8d7c78f9eb2627fd14d31721954c112846ab8bd0e6e0ce471fc74b13e371ced2dc69d20b11d2cfad0fe11f1323f5c2c78cdd3a0cff12e79c4d287bb5a3c0c29599ff766ea5bc05a613a90d75a3efa7c079ee6dac80bcdd6fc372c4e18983200f66abca76ff384662b0a956ab8da03ccdae4d8b4224351c4c2344bb4a0d5f839a92dd62c686de2e8d77509f4759adfe298a793760521230bbed0cc331b7ac59e1cf22c3dfe5241a60c84d2bbb807f686eaeffe68982ea97397139714b11000f5f7c0a6215828086a733ed908aaa7b08278c501d204f14cc4f605949f891e1307e1a02c22a07aa1fab4ab06227205769de93084fb70f374c582afac1bcc2c659c8398a686fbcd731e76d342533aa6ae9ee6396f2c05ba8a3fe418c5d2a1c35e7c85b3fc9693abe6a061bf73e12714c24e16e7aaadebd0f4fac348c80a316a666e8ef6179a909b62471e76821563d6187522421ec649bd1cbec8489e0ca3a9e53b466bddda1a264fda5500583716741adbb152b1bf470768539b1f2d20200843ab5719379d57d21522ad66db8f67762e476c204cdf0f384280e3d55f8dd010e88666080d2d722a1ce7cfaff5647f65be82fab3d86fc6d7110e48731b9dda483d941e4148d091b3cdf063e38d0086c9315505133bb7976d3dc6740048966738a89d24cbcecfddf78e07100b8ba9a328ef8532495fffa8812e6d0c84d0c19e69926823ae89727d7dc8f27e2dd6a8fe0c60dd2b5c2a8f219b4bcebb089a66a86264bec1f3600099cde47a56545845c0fcec24985486ae2b44feb027928ecdacab8467a6a13ac35b7048674085f8c71181fb21203a5aa6ee02afdaf82d943dd3cd5c2b7bc00101e9ed5e81e3ca9e781822f59d6c158ebd9160c415d7de9400454f52d2e8599c036bcc8d90e82a329efe67426024ed093c3ce3a6296caf765c29b9d0239472f3110a963c5bf6ae9d82ead84a32efcab56b1915bdde5ea7229aa7943de72816ee72edd2d5abb65cc56c05fe75db75b579914d7d71fc55ce8101e96701e64b4a75703e08bf48d03e93a377602c225fb53df703a32b4afb2d79db14ba84e8a618705122c062faeb5cef716786d5d155d3e9e661105191f5cbf36e53162db5e187c75ec3832689afbcc21cfdf9daaefe1666a48f4b4d99eeb1d804cc016614a39f62df49d873bcc668f2ed6340a18203869a79b6dc852a8ce50ee3a70597cf9469291cdc48b15cd568692cbee394140b2b6eaffe4c630c77717f530daa26ac5dec055ca25a483187c20d21396b192ebf0eca8d8e224d06585c119e26777c74a631dce9c696a0038180c814f95f9a96c736975a8fe6ade2d7afae0b19f401ee163e98096e84219a6eaa814c29477e15caabbb5f2821ea669b713de10fa91de4561d1f05c3ad34bef4462012efac2d73717620e4825a6c5b4daaa6692f1f391c0ed65b25ec983f36bb5e8cae73140f78639eac30c4199b889463d1eba2ddbb60e56f32b011cdaccb6cf9af68de0a8cec482b498d17e6dfb719a3a6ae8f6b0d7683f28ef05cd5e145af20708758130c96ca26de41a34aa0ae84720dfc1f5295269166562bf337486c2bdab75508b9f73f8f9653958fcc46367cd8ee1b7919bd3ab7d472aafe7b4707892f6c181783b5af3f8390d104f53917a9de3154c748ec789c43c9b5a62a48e070277819adf9aeae83f57c3d294be119b48bbeef2e6889aae9bb459312cbb2bd89cbc1a0f0a44a0403f501212758a70445e87d34d800fe964545cd8e6ce6ed677c2230f50b0bf278668a06c425a4f19f03fb566bed98b20559e74aecd90361a6f034ad5f24b70cd454bd746f4cb528b397ce32db94b80dbecdaba2f683ab76418e0a2127642e02de7795316ac415b508a869f7cdf6e9778b4899bef492659402fdab7296f2fa3a5f741a26fdb44cfe66dfd28f893bb2583272b8862e2eba23afe51f8af2f7a21e1ef6543b7044e06d95e413e0578a9c187cf410e2eb7d318b11f06f4f839aaf14e5a34c590a9e5b695c5e34d47f0b2e1f3176a9bb75aa5234f0c4a2ab9304a8867a23096614e7455985f63b5248e8f0d6199f8cf712dba5861409c085685c15dba61f934bd64a24a7d6533241fc466aa3fb18c0800b39b3ea4468d2c44bcb7f7b313ff3f198ed82ba181e208be15025efa1884d3ca8eb03c64a88df5284796dcee32a303fa2f8e6fa12fe0e173f2ba823d1983c1530191d83ec13ef165b8d673c8489521c3b94d9cf8e9c03cd60027ba554f094f2eded8a8af3ae0bf8182ff52ddb036272ade9e2a1529f07958bfb27dff2375dba258dd142260339e00289a009b14166283e1e89d828b02257073e333772169f5721217a124fba83b662c0ef38ceea6926375b56dcd6775dfb1df427179e3463b029d20e64347bf16280ff6b22faa77054e0cad216249bbf6915458ce63c3ab0ad84c7149f9fed8acda46c9a2ffd20859a809084ecdcc5518a3758e80c15cf8f367c2a142a56b856dd162f06c89efcafe060d8f4c7c49c1a44ca56c6f1f19c07335720966f21855d7b1d713753a6e4f70ec9c8ab10a6c922801866abfd9848208c5ed323d5cafca890035ab43ade7f630c0188302d48f3712767b12198d17ce22ad96b42c417c43e020e1105e30b76fec250410b8872c3101f005faf2a65e056f3100f7ca4d28627bb87bfb2b8f870cd18001bc587eee006522b97de1b1d1b83d04ae858dec1e96ca1b68b431f6c16daf7583de59483f45ba6308134d3bfd672a9d11e5ed8ad96149ee29e41822e102c459fd0f316f8a4170556463bba13b82967ebd816fb5d342799541f34480705cbec1efb7875169a4356e60e7b38e36ab2f0e13e09af9b6cae795537a2d9bf9dc0d21de7fb18a57ee78128007bb6f593152efb7abe5d2de6af282b0e159d1e8112e1e3bb04696df7096d6445c39a12dc580880b1bd6bdc49358d1ecb14fcec59c9ffbaa01bcf35aeb304e204db4e02ed8565ba0e8f43703d45907897285ef0ccee16e8bec9b2c74bec2de9664c388d6da32fefb6bb4bb16ce9197f99d72bf383870db63c957ae975bdd0c3939cc27b05bb4d68d4c9ed677b28107dfaaccbbd269fcc6c43089064d42cd6b6b25653935cd4a76d8e429059150b5db8e12ca6165c3b3b52faa85aff1144250becff529e1bf625450cad9b50e098e97977e124c6cd6542b08a004184d40aa60a68212965e929af3a7792781484d99a07e352ae942224c9cd1a95aeb9c48841fa4f433fad6f762d92f7798e6daad659ac4e07aa490381b8f2d3f107688ac5df25c8eefc4154e48796b3eb4523fa960faee08982ad1782f767dd9bb557cec966d1fca9c8e8417ca58ed46f05fd1b21a256c05f9c8807326e745f1b214f379dc04712fc0b69de456fc2818e36c4b67ffcec171162a27a96066181fab2176d48d3cf336f2d8dd247ce79e3cf404072b903b80c283ac319b8a5756dbfcf7919d289b0878b961cc68aa8fd22ba8c39f8d5a101c82b8eb28c9f34f948f2e23be344c83435d7afde6117e79465d78077efdebd1173a2c5387a539c353d1b522672a57aa166dcde9a4cf57187d4af85c100d93e2e3415471d8cddc37171c387026ffd864041208c1a2e2c301e99c904e1d3d00ea1330d7c29694493f50f71e9978154d459ef2d2224b0c50aa0d9ad639d0fca14b29912cc23b990f3083daee0ac51b34c34978b06817ac7e957bfe40cbe5cd038a88eaa9fd526c9caf42301d40b8621d61862c0a2f9333ab48970f5650c64e962cd395f5d0556f802ffebf22d7ac9a75a4f78565d538326537f1768d84ecc1d7a67c3b86e7cf1258272ba0953c2c24cc01f00d59e591494ad81dac6cb4e3f7468bf533d3a02a0563295bbcfaeab1818f0d122c3cfd18b8bacd6e196a8d263f7141d12772a5f0b95faaf13cba6fc7413d2ac08aa5784931437c85560d6a3e0ad67c828eda45ad9e9c20aed86a47f7d464ffad7119e3ad236369d5eadbd895f9f470abc2711bcb25b72ec6f860efadcb84d01ba810cbaf0f9929e2303c54b88d39d29f6aeda4d40f1f29ec1554e363871b50bd78109ce96653113cded56b30253526eff0965d528b52a680c7bcafb3a7a705e5699fd3c6c83fc4483f0d88776274c21ffc01c1c15af0391787eec108ada6542605150cd195adb786e96b3908b55758a1d5c66e9ade663632ce81b3fcf997b011d326a4946f2b7f9b6664f96eae7b4f18264aa06986234245140be4eb1c09ce2b4c3b3789a54760d82e815613ae4f09d566052397f2b5c1d0e0f3f06da56af2c4d8c9422be8702fdfaa56bb8245513d7c0d9c54b0a4ac5968cdc052fef639b281216730e599341114824ba64504104e7e8566b04e0c655d6f22f78919bf04a1e29e8b90514811d9091ed6b2e65b0ab15f75fac2baaa7f627699000f38403a355ba8bcfcf97587dc40089e4db0cabf0a9157cf08a0ff58fcf1988051f52a78e17ee851b34892048f3ba7f8f36ec38bbea69369fe7b8b90717299eefdbaee1f3aaec6007fc92e26866ea57d306ae62f4211c14210b4cfb4847c25b26f040bbba57dda3faee5ba5c465b69a1712f92e8396559fdebe74c139a70b461226af3ccc66e9d75cd38c71443746cfc52376a650913d5d3fc7d815c27f2de71c44a36c0f1f37839473cd4ed026c37e4401ccd1445afcd8aaf01ffecb164fc6aa14c6546ccaf02f0c96c44550785530fc74a4b74538b99888fff2853cb59a6c265cbdfbcbae3b642b041c5dac76236b5544a6613c759d2342bdf8b0fda43660f6e5336a151441a859847b9fcc6856bab73879d61257cf033ef2da89f72b4a2a8477cea730442a86fee08a11999615a28a1ac61ead2777c0e6663f181092fe5336da36bc06861d8382def0bdf94789ad36b03442f72cbfe0a1e0d06431207b6276d514b07e2242294e4755abd5c5da6223c36c49d7b0cdedd62a3575431ee9dfab31108c7f5fc2ffc8e263e216562f49b91a153b34f9c96fef0a15532cd470523cb6d157f387c58d5979c06aa243b0eb617fd821f850dcec53491807d68a3644932c0019c1e0725c69d2144b63d487cf81b85d020afd2eee6aafe7982788663d175b44dbd1b3f2f361b7088d4050d97e838e4be65248e6fc9c032a0e091526c3300b46a40b476ddaa7ee43392001d17ecdc94bd5b8792c9f510f8871637b9e604603ae7c57e60a9aa53f6e57ed2d9459c93104d824d72a5df199aaca1c00f89bc10c236b9dd6f1bac27431ed8e1d4d96dd8d1ff67eab05c1e46a38201eed59fc0aee4d7ac5604bc265533305eb1922be73a74338ae3de850924ad97c508aeb0c8771d5b0b7cc403bf8a61da6ec683b58f24519a49cd5f994640035e59a1ed652a15c63165b62f7ace23396d97954c1ecc230484531bb6014c056f563e4f34257c0799eb2996a999d8bc347a57a23dc034b307920533646580f12c1fe164f56a14d8e2f8e5a2b4d965b1dd812d71eb324f40d543feb90d3e9bafd40bf197b3abaae64bdb284ee3c20ba0bf028788d6fd7278e80a9e20f2e4e27df1badd3bf172a4dc3f12401fb8dc2105337f045b837a44c7ca6661efc800fc080fad12d621577917373eeb79a6905c5be577127e63414c99f6d7f899ff0b5eca783310fae5b2be13bea189013f8704114f5b304618eae07bf7efb0a3fa7c7121e61d762e912cda7e4ffa873ad618bec1dbcbfc66f6cfa6ea480e28825cccd9cab3acb0c5c61e64a3759a847b1cdde2fa0519c5359f68167151c3ced9a884ff117b713f74f71fd32f9a11ff66763f270675f52956756ca58dcfa1220e403d679297fb90909699ac7f57e1667174c4e18388cea72e0b15eaabfc16b094b64e99cab3bc52cd4724670f299948209af7a90dc806bd40e32c3c6871a509019d411c263923d47f6b48798b799a12f85b5ff3f1be4dda237fe8312fcacc89d947ad5531b2d2b42b856e8a40d274556d286648cbc6049c4a44026f8e520db18067fbdb799b396056281eefdbceb89df394931e1899bb6219d1e32df0b1d91e9b50a5156a6cd87773c5c230b8c8c74b20227efa5483e2ca369c0312f374cf3f8ea441a99092305828e100e3645b30fb87547253fc2f0b331524faa4f2f54082dec549fe68c5c180d9fc437e7ae0761d7d9d25b19bf5a54b39ef326a9bbdfd971056368a6f520c801b8a12784903172f878ef199a0724161296d32ca4a5926caa7b99fe420d191e4421cf6577b3d84a0498c7e82a61f50234821844a8b417cbc2971de8209ced21bf22757926dfa5f2e182814f3196751e02aae9f61daf16fe9fa118aeaa6a44da5a03bbecfbdc3f71797e46d7176f4d7464556fcb6c5f360b2be1b1d9473ec74ffe0bca455c7150cfb2d33e0645b1250c43cdd24afb8c20fc4c9e11f05ee11d8a9183ca0cb3687d1476cb90672127a4ec855839fc33fd7cd9ec225f7b591cef93fcb3e3ca67877049acac657f1498731e143fcc677c7cf1a8f2b3c4039fb5e57028e33b05e097d1763cbfe4d887cb3aaad6cab5153fcf2773469a680f9874a62bfc5bfd48865f47a10d4c36f9e089a096b540198ee2bfc741d01f7227ac23dbcc5f624f18c1a97bd4099b826a899a4dec98eb2358cf14791b78890bd343882b593b4259fff93b151617f3f1b4e8c6eab46611f8fd6c96e40826225a9cc56d3fdc7741448496debc701f9eab5e67d51ff409fbc305230db110c23088099a98be5cfba83830005a18e80ae2d7f06c8e93b668f1aaf65b40873b34fcbca32ad151e2afbf5c899f77d289be089df261baef016b3ad55a7bf80f9264ce1ff0dee2a0757bcdd919dcfd9258245726edad21dadefa206db8edfdf11c3aeed97a1c92521d471cd7681db3ff5f24199a69b88bfd53fde99a991817d4e19fa311c94da810e2fbf27dfccb62c2a5a79421eceac0ff6b5cde8384640e60ea7936ef63daed81cd7f98f35f4fd283329312e100ab878a2bff47510139a93e3eb2ef9cd229294ee5bb5662190fcbe90fd2d9052c63aa439dcf6c2b98ffb116e53016409ea4231e339773f2b075159c434a31b3f97aefd4c8b2943ad21eef8fe8ddf3024db2a59abdfc39caaee87745d6e56413ed581fe5b49109a636fe28524e9fce0b69ba756a8dd0ee139bcfbb8cd189b94f9265021d6a5511964d0827071f60ee837a265c35abfddbf4fd94a7183b20778c700a5f25f1e4f5329da2b35564079c91065d22a31d6948965e9e04921c91e7f50dadffa45128fda4b03593e4247c205d97c78f5dedfe7c20455599a17cc451aff3b8ab43930870110e2a905d67a7c210b4cc6b0b23a2c1bb3b2130ee64a1fde5aa9129aabe6b98a43de772683570cad2e6d47d55c53f5d8fc76a8f20db1032bdb8a24180da3bbb82c7d601ac97bf7fcab3478ee1ddbc99c371987fe0eaf9395fa751bd6ef05f22d6345e04d2947c2a21a68d665a7201bd80c113c8d698445af4ff08641b06bf15c60ae64581358f13fe440ecd668df611ed404432a9edd9dda4462efd302743db7ad3d88a6281e0828a17338bad3583dd3375918502f1a00a96062a515458d3be1b169b9c1d8057bfeda66267d872906879e8638888ad8229f3c6662830a35704d15c9743593add114e79042b8f4c05fbe8222304e4286581e20f49496b0fb7f6c32c3446beb858c2d519829d79cccadea8aa37c2bd6a335b8c683b7eaea4dbdc1a0eda6ff501b218ac0d42863ff9c759e0080987bc7cd2ff1959a48da16babfefd8af184a61dd15cf8ddaead89dce5b4b8c5ff1e89652cb5b06aed3feb6b10a39529e14e79159fd5e4122ddcfe7b0a365968834ecb2d27c579247c5c35adf0150a72129514f002cd953326d946e01f28eb79fcde2addad769d0ebaac2637359a83eeed2122b6e48a36c8036d0a130dd29581d297507ca51244b10ff66713c57b2823d8b9496f2c55ed592b60f21aba7c80076c41e212f6df9593e4049f498a00229b3c273124c276e26f067aa5ff106ed49334a48ba88a26b93e9f9c77df6a7099de823183dd8e353f91fc83cccaf6efb8ad9187f144482ed83aaa8797df4f15b47210a0e7a077da294875420e81534954deebb3bcf11841180d6b8da65020359ce1503b047768acca1bd980142e11c2d1adabf195b4e2a5a4414c754d3bc51979b3a8cc836946f44a92900585d817a357a3370724978ea3a25eb30933a72509726e82190b7efafbd13502990a884d340d46f8bd10a105833bea0a0f019c2a4caf9c45ec45bf6c06868d98044b459bbc1c2156dd01da2d8d966fb8505e23bb2c59c4590bd93384609121b80def17e985acb9ba2da14bef09dc742594f342c0ef986f263e6ee32b501b79cb7e9f061fd5e4988a7795fb343e3482b9a3670322de9324144facd5471d4c1e3a1d021b25f5ec45308188f2e275c720dc44636ec741736b8b043d13c1104b976cb3c15de32ded4812142039e2f6bcd6f6418f8a98605fccf327c6a58271416cc80783d542c40f2a9af705d71d093c2c6f60925f7d8280d0b47ef29171885526b8e3f189280479722ef4e0d47af66fabaf6a15f55ff1fefe36d266e1759cb04ca20db2837e3354a838d15939e0047cda1e26bf5524f300dfe1eacd9d78f67966f04e6fcb2d9ac7541f57170d397c8c41255e3986b6d1aef91e90cdcb61dfd9fd096ed0671c81fbff4b4ec3586ca6c6692ad82a90fbd331d7538a0e75189df89855357c61322f1730247e042361ca53d9975d3b7cdd40b1feeaa139a28478fdbf3c6b1cc159ee447012ae837500305a19d2b51451436255f8499df65b8fba10fa26d7578d7804aa467da8e856312004b245a85c17147f464bda46eca720a95bd27b42d6cf76ba703acd32dacedce1792b56febbd63ae0ac820364c48e208f03cea374418e3d58bfd46a1501e6e9bce00c6f7edb979ccdae222ebe261875b2337707353fd3b426be9dbc1906a540f961def7f26161228d74b5c21db84e085b11530d4d78a5c36c961c2c059114c9e026285620f83db46a27c327492537c1d1c5ec1e83950c52716ed920a349396db85472f3d046323aaaefd2c40a13db885e78caa3a03e10497e6f5d01b9d71e12cb164538ccf3489c96f36c03282b4346485273026d1aba90dbc02f3810e2cba15f92278cdba887c2765c184b6a1476e1d87a71a5afd21110d08bd82b70134603bdf0a357c40df89592515f0599767c4356194cf2310d1dafa5f5de44a012991e2d593e0250c9a2fb31fbc7977dfb5e520a568a53ba74e756a128cbea6a86ccdcf6f582f347858edd9d82da6ade4923f83b5ab52f11af76ee0d4c26849418e52462ebf69371e8c2241c0d20e68408d31c334c54edff65d35d3188787ce76feeddb764224a959b48b6f7c4207337e177a63855f0f74c3e048d550548392b34eef13e878f817d45287d76d0627abe7b167d939d10b4c0e41364c1eb1e23280eee473f7dc49eef8f6860e0596e61e280b88b8c4b3c8c22fc07ccbc6182a2a5a6f5c7026d490bb42012467f86cd926b9565b76a88fde73c31e9ac908ffd1e6ca30b59ce80a72e94a22d1999800673216426e9777bd92dd428c0eb839e16ff43ae38e5eddd657156bac2c0776fa16ecb950209f94d5ac6b38c9473deb656adf36f8553a5ae0b3bc412d823617a26ea33d002003925081ba1036e2be9fe4491448df98b3f1822f3a452772a9ec91e4f1fbc2db47f2c6a92663555fbeb9f6811fdb19d7602453103bf22a7bd7885110458018b0e13890894c9cc51cb2ec14a96e88277fa385dc0d2dd2871c435d68573a64824f63c656a8a936d6a83f88a7389cba99200278757c8c60fdc271ee30403d039015543e819da8cc2a90c92256a506fcdf37119ec7f4d417df1ce7bd5151ca07b291170399cee7c73154c44b8b7559c97a43354b4bfc9171bb7a194d34126dcb7a4140b817b2c2b28b62c556ce3fe19aeac302106a0a410903689b0060e894d947b445ce73ffe618895940f6875b5b0bc134ec70aa946f484766c199606aebbbbb58bab946fcbe53bb96db8d5f5e12766e17790ea62188ba1803415aab1fbeed35ad03fb093fa80ea2b9d99daebe947561f92c2cb53809d8c5bc7ed6a96d9ad8573fb616233f5fa3df10efaa0e037d834d587a6d805e7f1f00f0fe9ff3db1c17906f359d2d8231bdb15a6234e5c32a2a7093e8436ffb65073a5f250912ee9f3561ea26f2909ecaa6d9e4f5b0de5426c58c59ea410c95382bd245a6c47f2eb09c4c0efeb8f4fb8719a95f0eb0505cf00ef10914d8cec284f77942e834a101dcb6df6c2142b31ef360b01711b5d43412413f3ffc8d2ef9b7f49fd56dec210e903f6c703332637f9c267eab9333e2701a16c74ce5e0b5a16d9da68b9c5d67bb6770a3c9a90a7e93fdd5759b27bcf3a753fa39ee7545fb60026d3dc417faed7ebf04f5b7073d7d0274e8354433b390306c5607632f5f589c12edb62d55673aff2366d2e6b24de731adf92e654baa30b1cfd4a069788f65ec1b99b015d904d8832110dbd74eae35a81562d14ce4136d820ad0a55ff5489ba678fbbc1c27663ec1349d70e740f0e0ec27cfbe8971819f4789e486b50a2d7271d77e2aaea50de62fda5722c51d988164719a569988775e78e98ab5174ba082c4b3bb8c5be66e57358ef871cf59179fa76f5d29fb9d67237c963db0e51e4435257a1e71926ffa1a58cedbde7467e0943b9d72b93e34c376e90c681aad168b01faa7214ae0b653a830168bd962eea5e787789574cfc32ed134d8a452edb8d781dac75e98d53ded79220272e31941ba32117d1ffd2edd0bbaf6777cea1569dc3d4c5740ebde8b3a05c4ff4b9be5f5afec70378cb2e9f6ecac94655c50b2cdeb8cb5e352b46b02cbe68f795064779ef97f1a2466267f95442e952ecd1744499808add82e7319590593e81d3bcd3c92297275c026d85e2ca4a98f3049be586154299ac21ea857e2998675376836b373b26f19976939144170a5c9164ca65da9c278131dadd4a523da46ad7460516ab816bd8c1687d920684abc094d507fd287457c9d6776889fb15a5cf740be7dc0d3d8f633ca1d39010595549641ffab458e6f9f902be324960f9c21f918cd4c545b8b91b73e93c944ade2f81690a4a92523a36991c79e492693023e1989272da3c371286cc0760a49c5a62ef0b5ea09ffeb835328e6e256cfe04f19df0e56922d805c22eb0c5e8cbee17151bb3e2a3e445a81f4bbf669ee007bb54db014d62a50269f09b88e97c0e285b718ec75ffc680d511b6d1728f7f56c9e73243392056ca3aac553ba3cc377326f9ecfb19d523340fc521ffe7ed7b415f577ffee7bf97ea11168e0b086660df49bc366d7644e4ec4f1ebe9dc2ee623eb0887f59ad1e7e4e6e601cad08f0cd8562609dca37c98c083780f531901cd4dd41ecc8d9f5c76a45871ba97841e5ee1415a97b87bacd79163d9e6e61dbf3437b9816e4f65e44fc8e1f9b9d133fd042f9b7d9682c9bdb3ca4e5b97295130c2eb837794c35531195768c826ff44f2a5ca4ed82dc3f478d6722b474ba51b1b207018496672d50a7d5ad4242aaa21c6e9bb40b3850164a2e591e2e529e0e44af6ce623f0de34e3923d80f56ed5931417a095b56c5c781068b305a7d5a641583eb0d48a0b19e2984b2d900a59694dc2afdbc8508169ab36b6e557d5705b9148fa736b1b6792cccb4d3668f5b4de48a4b1ddda812a0046298360b32bb53654b36d35187c78e14a1912d85a4bf3ccfa36a8073abbc8a8cf6568c5761f06cf2203f1764b11c18de0ee26941271888df8f50ce86764efdbbd76d1843f23f77e8fd741a7917fd3e137d712e9f00af5c9cb7c5b01ff11020176da581d6cef09ccd499b8597a1b1283a550425a918ccde8d8190cd44044a1c2a21c66f18db4b052b6c7dffc73782ffdbfe64f56655b6363a567bcf009743187c59978c120297d789cee23110c1b6eb7ee05947dea0b78d2b9f4c5b5892443d937ee17dcb2c1e3d70d792c27a279613ac63aac31ae2150be9c2cc1c56dd95b2f9f96ced4b3f265d67ef545b0d516aa0ecef2110210119d7fb29c3b701607ea0363000829b25f85ff67ef1a4d2277ab9c7ec84d7fbe70b1ae93af9d76104472fd08d65e4c2c4dc6ca5ec3244d0920d87c4c29cbfb17a33fb3c5f35227faf3786517762bcc80619acfda1dce40f786d326bd931714aa4d8a37bff4140624a97ce4156c1b2b6d1f9468505ba2b98c3e0e144990b94ce4b44392e81e3da12beaf2e2691486d930fc262c58093c27259afbcd86bf1d14659bde6dd4fe49898f1c7cf8a92c09667a7bd2a467b2e50a52422ecaeb5acd0b9b58cd211d00b21fbcd27d9f4c0f0d43b8132c4 +0x2fbac29e12a3d83304ac661cb664e1240aaf810a0e13775f7c4319c895168f4f82e3b904562e711bb8e0410e328a7507 +100024 +0xea4ab388cce26a27e016c76b4888b02fbe1d4b93350cc0adbd35407ba8b5461cebb71c40c78ca2dea8ff4b254de268b429eda90d09c9e047f86709045f9688a371d5b1b7c6658db746a3dbf7499556d6fdc336390748f9396d286319b3e4c47b444c79d31495b51b84ab82c986c802fe0146fb0077b292eae52157a2eac7820c2cc57c7df843a27328bf45834aa4f592fe1fff48a02e34c227faec874d664bbef1e8c39eb998da25fb862e0dde51b6fcbcf54afbcbe56629fd5a2bb024eaa6f95a5c551ca0bbe79bc5a9444f8af6cda20371e5ff40feb0872de91a06b77a1c2530ca3be1f5d4513b4ecf8f3195bcc3ee9b3bd73e47a29a448050c46f4d3f34aa3bd97bd3000d9e6f5da1189c49ca1f464bfa289e28f9adc8be372ed4306176f043321fdc088c589ebcc7e676ec496914dc56e1092a2a707caf45621ea6076a60107c2ee35779062f31e801a9c7602abf17f90966965e6cc61a236733f85999606960b1cf33fd318c85ac721b2238e8afc188a89db4bc270fc97945fd6e808a591886af8ae540601c80bd40b645f82e4ca5aec795cc6d2bc082ee04634fa4c5b4e39530fbb4691b47e9c0736077c981fe8a116c382698003f0e2aad4ce5ecd3d793363d0aeaa0eb758a60140301d36b2d3759a26d0a662cf635d648a276813b2cf010dc9fce0f560e29432a862b3d7341752f6e1cbfff394bbe9adb4c4b8b8519c1cc18a2a7dbe67a8f11bdd13d3022a20c3bda2d8e8aafa8731d7032ac313a08d011f6fbbe2f23228473d6cc7fd3feb8c424ed89bf2f14741a080e3ce09be160e38880935b31946ccf107b5f394f91ec6592af169a18f2177c02be5231f20289c3d8bd50c509c1c13a92b772b2cb63a4b62f29bd666ad0f961b4875ce55e25eb38aab51b46e0328a8b9e8fed3370fa4980a062676d50378291c571424506d3ee09a671dd24de702d8bdf0db80465e0448b9062faf5f0ae1ad3de84ec991393fa0073f87ca82a021402fa38bb6dd39dfb9fa532604772bd29f0a7c94229acee77e3ba52e21aed70a5b89a18dfb6e2b7d88487d97fabffec17b1c7472d3cfa6bcd7b2288f5c24e434a7465b60a26b9b84201df5f4168bfc44cdbe706931c2592649054a19fe776026a00031925068128a1e055cd8cc8d9cc3039ae0f5e0f54eba4eaf7a5c6d38c356c221d49199e618d5ce7902a4a11758c2b92c569745eaffff650b49d54ccb964baa35b4fcc368271dddf397e628cbd8da6add31cbf515f55c08b3390301b2518bb4a643228160c5b8b8ff7d2bc81d75607538131252f8c756b641b864208f7d8d7e1e1fa148626d4cec1732d4038eb70b84c77af90425de860a0158772da582d762e79b077cdf8630e3b5597d6f822611f605c9ee7d0fb35060ac89ca8db6f9e00fbd55b3b34ab90b3c64418660ba3b3a657d90712228ee4c469ddcccc5165b3dd0e9c03470367e3252ae8b9d8b797edb4f895f1f8803d7e0484fb20c68561f4762f77b0838253e5cd2fea8114452698b00c39648331308a2d24cb9e7ebf8cea31280e6bd7f8981d119df27902fd773b045b6c689a7f9090a711f450dd470d1c77c0083b2baf5d135a3ba7a78b26b35e17add70625b08518d9131f3ec9640d12b1be0e2967edcb5011d2b2159509018a51ca21450d0d36ab2df2f46f2b5fb45545ebc73c73fb0a5b9c2abacb09ef8a451a7af32e38deccd00a751aebec80296c9d0fdc7c372141bc650b68cfd01e761ada84f5c78f6b6e10d8663abaf20f95df1ff2f4f19ca699fcd23d642bd0dfec8ef9b1ce1afafb45f2008bfbe527541f37355bb8a488d439a24d8755e7f379142bdfc9272f62d879fee8ac06727297f0fb4613cf9ce4f149363db3e40920361778f594a70cad4831bcf993026cba1f2fb3b9e3e3e19946f3410a87b89b3f5c1dfda1d9f7bbc59495b59b0798d8e93505e8f891997c8e1b5d4a1bcc7aa437344d434c62be449004ce7037cf70c0e6219a206ae59b74aab8afd9da49d12df206d0d15ff5a5adf8df047533b4312b992b15e677a991d1d7641276aec8663d571ace2f405b5400e46f5e4df97e8422ea9b9fbf87a3229cfc68aeaaff0fe0dc4eb76ee6595c72453bfa057feff510acc1b85f35029cf7dc000caafc36e8e812bf26d87d11bfa782e7c921937fe07ed106cb7ecf515db899cd982ef5b91926e892b0357ccf4e9dc1cf24d91210097599a11c2316daab0cdb4a54641bf16a4165af9bad6cfdcff909db52558309369e0d7af3779006519bab5f8872f946a5e292ff2f67d4020b6663f39dbe6ed430a1347a98a2c73d150e10f47b80142190b07568b68c3c46ca8ad5ff4b3c5bd8bf25178752cb43e8c10d13f176b7f6e8f55419d376432c31d30d6ae7a5f6d37daad2bc8a6b1a8a6d1b3fbb3ec13e26059a758329b8b52d2bf0982793f3155d2bbb512d6c29b82636ec4d10c4a43e2cde47bcbd50c409c69ce7d316ec7dc0824ab84a7213d5cd9fa9fbde1a6967df91ddc6d0ce32e26880ec81653ed88a20c9426a649169b6807b30129be2165148dc68de5bbeb65afae28386f7a740645dba7c9948945516fa4432f72c6fb4aba295e9560295c373e674c9be305a0d519edd5e0d9e82be3b6381177338c929bd1444c7f76f5c437755be27f1b95e259a0bbb518d0d648e6ee2bb464e67f95fcfc7726a894a1b1dac6e4903e639bb7287cddbbee33d41acf79f79295063063c29e3a63ad43ad8395b5a9cc666597adb5f0cc50bd5d721001ec3432741d1f8aa138f699f9fe89d7fcb403fd939c1a2476cef02a22c830d722b76a1a8e85cd890d4f34201b4fc71d74649bba227183ba0f49f19e9afe80bea65df1c140eaaadd5b538b9c8d91d5d29129d978bf8064ecd4044924a28af265016273bd47b637f63fe86565cd7f3675d78635bfb7335e1b69805f62b5d7f638c8475874ef7305621f704a22575279a5bc0c4905a614aff43430accf61801cc86f7f287eb4ab93bf7e7db248c7d61fb0b32e7bd0f8af0ad5c8b7c9c121fdd6827b9c6c3133ba535cd183264f7b548945516f56a84b6cdf5e9b683efe73aba3f551118c32f949c4d8bd032ebcfe7856c22b3151f20ad89ded20d464bdd33405af9461010a51b488a1a5803407dd9c08b585270654b36cd70ffd8ee3b5cd118c0fca1d831df994ef460f8ccec6754a0fae13b2dc36d1b41b4585fa244ccdbea79446a95ae43d5599346f7b675f71fcdc0a3b675c2ee228cb1c6e98bf0951a5d8ebbe972103b990f70b49fe8659404f0e5880b70e8371456702fc0d0c61f561a06486595dd2eab189293368a43a5c9b172778145c0aeb849f77d2a9b4ed356c9e9d22826a084d41d01c905c6989437b76e57611dcfbcd80b509670111117e4114043784edea4dcc6c64054c2ebc816abe112f31f9fc93a448364da5c9654c69a12829e3421f88bbae8de6ba6c4a92e34d38f7f74b73ea79d96cdafa465f3c50d6777e202f0e7a9a26f8d919bab9f46fb4db64d439f81e7bd93bb3910075aa912470a8bddd4d9fd2564340fc9291228a7566fa5b5e0fcc24e8115bec903f33a50bb23e3ef543650eccebb2d57c56a9ae1f7a2cef2011600f569c387f7e1254070caaa3060f8676a9eb509336d080f6551373711218a36685c52acdcc02a5782197d87bb5848d213e421086935796a519e1e16b66a03c6c42b44ba044f65f3c9f4dba2ccfecde013661b9f17d4a0e12571b42805f6f52dda0a48d449ca1a60dda9ece3aa7a0ef931cbaab6847505ddab71025345ede8d3729f64e2f15ad20686dfb8339ff5938636bcd736f93e31c7a9470f80c07762205695a2cd4526134d8c3e4878f197e5edebe0a905be57ab05e89ae398bcbaed7c4d920a7b8d57689db670a39ce9878b9815e0280c1be9fb013013878182e1104f1e3ea3d51114565ecd1ad185cfee0ded7f635c33581caa21485a02255a125401924375c3188667f89ae7db1debf3f456f0124e63bc173fcffa165c6a8b753ffa7146882eecd422d3e27cc84a84bfc73a2f950582900342720cef9e3a5f345ba283f2e5fcd3270f577084a0f6e4790e01059389791c073b71478fcf7c1c7430628fec931716a7b7ed0ba56b08514a52123ab4e331a84cb336739bf7180b6044a05fdf9a65fd7ba1fb7a873268145a19d796a11a917cfa322858be1ef5741d22c5b97103d0cfcc55eb86d3fdfe75d0eeb7e1023680e0383eafbd9e4dfd9fd64f3a664ad53fd6c15c23f731d2b2bbd4561ae27e40e81b2e61336ce38c17d3b154662e13189958833d0d9548bb6c3090db6862be3fb07605221c2b36e12b5ad6bab0d874d4c89e39800f27c1bf141a29040a296a3bc039e509d3c33f56227a6e09822e1412b3f00cae937743e692c2ca5966ff293c00acf59fbefca5f2e27ca1c743f69cda4295244e004b7739ce709963e5aca34b58165e6b469d10bd54a8967e5af9b3325dd7a8e8be6c05bfb06cbea9eff7816fb0c147f6d3702ac0604576b531ff0224ecfcc10535a2948121fd62b4eda96bb1f0f3d9c6ce3b9802ef9d68f52fd031b7d74d962ccdb4cc85076cad0a458a081700f53c659dc7058be7f695c5bc33e7f3061250e5ee6c57d54c02c635616201acc80f975baadc1764329925ad40f1cce1629316b80090da79d604d6bda7f9fd753088122e5c417694b6ce3f3523d28988d117112e6be900778fbd04288117a57c21aad7681ac0cb235ddc0be6ce9ec6f13ce868ce973f6ed95d7479005683a1c881bb0b904e1fbe1a0d0db247a71d2a228c4c4420ec5acfa72a705ccc8e0698613a04d92f5f27f680b0a75ce117175e25a78ccdadd301c9e7ddfad6159168335032cd67ccb5a01c5d2df3303a87530a0277f02afcb2fe04a35e5a0f62c671199c535eddefb852d7ba6c3957dc5d9ad5bfe3bf8496f21729e295d82e3b97e8f24d83fe6421d005d09e55c1f94f03b46766d2430201fc15e0ad6abc5c286b97686cacf624e86580af11d0d23c19df6969fe2ec2cdc737bfd00bc54dc0b2ab4421ffb58f44cfdf8c1b1bc5b54bc45b818390de850c6f0adfa2048ed48360bdb8c511860eec5ba6f1bcc51cb34cd8ddc35c23cad4e882df3bfea0ad99ccbb0abbfda707be461622773b16bd1268dbcff89dbfdaf789871d9d8ae80ae4c44afa1571cb20e67787bbe54017901ac65798e8ed6cf63516062bcbf1e38dfd9295f68dc884b9cdaa36da0572ce7e158fd3a05bf53306d7b888738dd9991f2b602464ecaadbbabc05ace59d7a456d49ead84f195d1bf22596945cadeb13a6b85380adfac1d60bfbb0704676ff8446ff00ed0de9cc2da267d9b24ef1ce580bea95303a7fb28094d2d40a6358aa91f27ff89a4295ea70fee5a86ab1232a70370a4ebc724328de3e899903a60b23765811fb6756e360ecefe72c45ee09a964115fa5adbc0dc9faef6726e27656113b5ffd31ddb19cd6a95bb48cca6b6cf13b8033c38982a73ddb90b5a42f3a021de6f18ac183bb88f3b02c95f1829113aafd6eccd0db2bd72d890abc3a735cd7ee81f502d4e1dd6e600848d283f3c8c87db3c273f3281f66410d43c11134439d2d1352ab91807d17c5b999b369a779511164647054fac51c206e250f50fd571c81a5f2ce21e7054cc8cc057fcc260a7710183b0b1cd887c073b497ed2053001c933ebcb2ab9edbd314487680d3f6e5021fd7318c734bcc1ce1e780a2a9c0a6640ae698a1582e69744f35d3fca7a170bae8aa2d3a80dafdf61310ca7712cbb1bd8fa56ee1501e15f9229b043c6faf15671398185f6c0d8017b0375cb484fd89efca8426bbbaf649283483f08854a63bd048aad8415e6cbe4761621ea126dc96c2628aa977be3f6ccb2ef481287e1049be2ee756287f801f4dce9bf88521f241fe00c0dd5d8680e6a8b7f79e631474a9f96d577a5ef7d00cf39ee9d2aa9cc7f06a4b2cabb537411e8878932f823f5bc249ae022d2aede4ebff7a559456c0e10ccfecd8fbc6fc0b7e3218d01dcd264cfc7699f155d38945253a09e526d2b5cafef58accb6d9fb646d7040b64e8cf2cfbf47d52bdba2f57a236cf4a37066a20a2da4ce0fc2365cd75308984eab07ca6c73850bb8a8df560b4c5de2975b59af2700a45fa8092548e999c3c79f1c86d7ac80f8e2a1a3d2d78107d47cc8cdf506abe1bce7a272eee724a56976b18a5040164f6803edb3c29d63be9b6a3eaf80cc1e37b60b02e4d8600fe0c24c8ddbae2e33469d15a4c2f9d339d8785301ea432c06695875d2492cdc32b295f23af9e8c989ce5ec1cfb7bd9f8cbd34df1a64864cede16bcd1a8833821684ac0fc0ca4638a25075af74795729e2d497b7900791545a06b6bae089327b42bccd4c28380fa40632a8869ef20f9ac68768836bbaab6dd64003e52e3474ee3ec4c151792a8d343bdec0ee52092c1abd3d71eab3641dbfe8f718f60b714004930250c5bb870611cbba85919aa6f8d0515f789571ef30711893be948028dde4c8e04151f739c3623e30be147db1b9e50953462cad4229abee7cbd67934194b865c45e9c34270c501aa635220413b8816d82a3566d455397f31bdd184ea4ada5f3186d4f7a392903e986b06135b23dca065456bbbbe0f55aaed6e64fb93970d5f9433711d15761a23237f8791a778feb5b3229049efb561fa7169fb3dbe92470ffad848b4269fd567e21d513bb4af80af582e2d91f7ebf0c6744d1edbc9a139d8dbe1c64d457454654ac0ed71e14be505aad4ae14451784975c644a5643583852cdec6459009819b3c406d6c4dbb2ae4141c29c5175dc9ff5906c082dca3bd5063754cd67c68f97cbe45b87b502984eeab36472da088fa569c6a0d2c2bca0925bbeb74bea35af5126323b8ab2d441498a5626bbfe6bb5275c55cf24c5994ae2cbba807a60ac8bc84b24235a5eef621088c0a5f26f1df1a855c43398a6fe8f68feb14cc35bb9b97fb340bf7109b26f566e795e908c9da9badea87a88d74ad2773d3988d14bdb9ce9f6fe4c5953abcd6db3f6bd20e77961a16f68f08fe70cd8a02fc9a10ea180ca997ed3668dcd59f0d8f1bf4e1df02f9e2e708c520846b2f6764ed841e60d47b6f0c366aa98c73b9e2a90397e02472ed3a49a890bac86ebb06c12ebc7f1efaed6a25d0e64e4d1df19c517fbf9584cf5969645f589c718059ae4048acfbcb924ce00b45141fc9da2f85b118d1caa82224b85fb4868f28aaf1a909c2ba5a0fa27f1ae51d5be6a5b25be3ee5536453773386f6330805b95f36b3d4524506394346e60dcde22698cad5eff33bf56cfdac87cd69759afc85f63afb31cf7d5dfff4f01fa1812d37124d41e21a6dc992f392bd83424ba7b9e2f02a653b5c1b197fbfc202fc040d5c6152e84916f37682ffba334d331d84da4acd93664390d4b502e42b348fdf1903008c37896b7552995c83878f9e73d8ba37fef4830cf600dd54029a28df6ac6c77a59ce379a6c0462a4af38def6e709f644f4cc5fda0445eeddab9d546d4f9d16293c0ab8363ff25b626db59fdedf9efacc5f99314d440a65fa4fb34bbbe6027bb7b37baf9179a300107f9c56a8c61e54689fd9cbd92dd4ef445f6a834dd6ad648040af626e919cdd29353b980752ee7f94260c63f02a1bc7466b217f8589e46d2d7404951020566f272f41e85cdeb5f8c982bfbe44d1659a7ae386b505885df209be19ac189e6622a4de1dac2bf1db4c8356522f29bc48d54c68f8a8405a50afcf9f6d0bfa7422940cc23d77f704e4e75be1623b21332c14555bf5edc86892d2c9986d59384a323fc96c3fb040b05955bde46e66cdee85b4004d1cd9f04b6b279229990854790b82854c93098b6cbf1413bfe5268236ec50e7bccc117a6b6ffab3d37e9dd1992508aad3b5d849927caf07d4551ed0b4d657761b8218a950f7e8a9169c8e2213053ec4a236a11dea188314d24cb44be0ca5425e9ed541f84c95ddc73615dd88f22914d2883e84aac193ca53a2a6b66333ec391c85c484f8f2ae6e86a7b81675603acaee73c3282810538336c7cb89234aa1224075d89bbd8b300377c39ad51103eed846ebe0447d1531269e9b220525da2ec67576f8cd6e9f83654192a1628362ae0581f87d1fd458937935279374926afaed61910c6334b40f5c8d1cb604f405e01848a283025362e246a072071c91836d5eaccdfda536543bb0036ac2058c75eeda42f2d83522ba87538a8464474bacefe3ff33b1db9d0671284a83abab72393e1318ef65006ae8e8689966943be76de84202c9114d9053198d0b6f5b3fcfd93a8a71a212ab53756f4f751f7d408e4ec0445c99054338c199a7ed37b808cade4809f611c87d04e883cfc7b709a068d8dfb1b5ab7604bcda5a3e99e2ac508ccfd2564f466dbfa6c98baf37371fa19c92ae51b7054ad94526c41ab6781e5d3d343f3a2349eaba60a1f1b86ca6a68d530593ec08b16b0afb2c4002ed02f5790396f77d1a2028b35bf71cb20f0c88aab4b7f74950b7bfdf057434c0e6861bea097b62e7ddd50ef5be537465c772ac41e8324331381d309f8c86091a480f77f8756ee840147083c7b23d61983ddffa9916fedd6c67eda594b7eb28d9bca2f1ed70f4f14f67f771705f3e4b15195b5afc67a12fc2872f0504af2af7c5e949710f2197e5dd7c74bf39ecdd9aa202eeb4b003a59ffb3de93a389bcbe0a5780bdfa8b1de2cb2feee556a82a3b608a0a1f0fe119297de33252b78a4564a4210f123fe47512e96936e1b4b4817080e9c7bf62eb9ee7e3411eac00cf2549d655a0126590c795351e3fbf92367c1f67e9e84ae882543bcc57e41e13bac4d40d4fd45ce0328dd04aa979dd73c0629e91f4dc501547a18b9592330764efbc79d58a2c50443c206a76b575c9ddc4ed84ab85245d5d9e3f6dcb8a8c2678d064c1bb8f188b160027aa65aca41334c67557f12540d146086648fa9b4fc9c40f66322be9196bba311c36740995381d47828f2f5fc23a4318bea3af6efe8feaff2951a302bf70c54176954e46c9b6fbba9da0928f2916f941b104365038d732223686bd766b48abb3bf2d310e91fe64b24f22e75dd5f5bd15e5f13bf95f3e4e0b0667e7bebd31f1fa6e84e8abbe9ccca0ef8c8a26693522f7b5e12cb50233a32c217b9e4615fb2ca80d22c1b88010b8192743f7834373bf79a96a853d9245b60810285d9715d2a02f039d58bf96d89b8d5effabff052fd72e58d3e1ddbfe31b214af4b23c3d771101ea4b1a2b53730b702f1633f41ed82e582cd3af3fcbaa36fa4a6718afed46e3c339b28286567e6c53f00e1bfd00fb19b99de069be45f98e1587061d6cb5d09cd57a6a2e4b003952bb4a6dc0944c072db534608dd3cf5fa4e599481cfd1792a0db14e879f3f1524328b6abce34608adecd78faa83ac85b0ffce9a3b3db930b9426a1a3f21b9a47b1fe9d4ea167ef04a174e405353db15a23ce00bf6e72a8a9eb5a9933232c7b9823df86dcc6a937f32a4e0e26a1772b0b84db76d1996cd90c1ae973fc89a115b21d3e0bccba62ebe4bdbb4fc5995185bda797a4b0e124a490b745ca86a203e924028c94a5094f6b37e03f31687967620f009522a3c2348be62511f567e8ef666c785da9dc1fa9468b466c4b95ce13406e24566940b916ff5b08b08d06eaae3e09e323b3f87a1afe5d34a506b4040f9159875df10e32368f8db6b419ea03dab07ad7715b80b51f030c4f8bfb79b796d56fae1e4272ca2dbcfcc39ef487e0ef6e4dd9c908eb4d1fe5370b83822d55539d0f1d19e5f4ed76f806c3d3d566ee76d7d14e8d34be9eb8356bed2e336569c058c638c3443b187cd15a2bf5151da8eb7dc3ba407761465243f958de97a871678903a5bcf58be7d9d95550653c129cc7d093b1953989c088b18df327276ce8a3be65c869728db8086096f5b6c2cc369670afa8ce038e99c60e98309a5b394c2f696b355b33a71573078d706c31c102d1ce96248d5de63e94ab8695aabb8428450a6250f4c16e9cb44ea754f821878e045ae5a945b1372b6f28f796dac0d3e99f1209cfe8945a9a46a68317dcea96349895fc9b79a5d7ecd00759b89cf3bf2c9820bff68934e1baa49f8f3dad2553931910699fab947eff41b73b7f83cc9c4dbab70369691b9a6a48aa5a3acb3a7626005aab1a5e1562df4eb8fb5001c3f1e99135628d0ac0fb15cd474293c9c24469e8c54f9003914a09519d37dea972667c963c5bf5e0cd6a698d06f6dd2b3564db3ce0b5952ea08b09e4d47f7fed405073442c6e287d899ec21269d58b620c4e06674d7b9e51bbac6d92ef20c83fc6466a2595f799439ddebbf7d06d02f0cf6658026c001fff5b3480c65dca2c336cbecdb509a6dcd562c0b397db3be869f7546ca8bcf19e9a07aa0009a0da204abc301a6ce7fa47a580db459cfab0b0400c8e9094c0be9eb4397347d748ef58f82d30dcc7b1507e366094ee51bf69dee5877b808107d5a4c06936e4b9b6681ace484781600647e50a9a741a6089d5e8fce0b198e802b525612f5b531b89d30a2f95daa490574f208486ff5643fa7352e8b0b7662441fba4f8f4570f8733ce9bbe8e60b30314e49546ce9d3e7681c0912b6ff364d03617b80a50c09687349933ddaa704922df96d7c3d9e41f62a05c484786fc11765f77b317ad0e74961cf1871f629fb36a07d44c8e215a85b2d694dccf9e47f8814eba4aa391c7263e4d35f9f65f359e533e3b87f84d671dc1a508c3260e6d867b545dd320875127ea55f500f4e8d87678e32b0eb4a6a024299c269fed6fb347ef30b0d120f652f614b7ad308da80eb84587213525d58c55451c8cc7782adfb9373471e93787331d57f2dd0d43153ef043aabcbfde42820dceb699de68d83956fe000f7fb682880a2e97f2fb97a8efaaedbe6bf3408637da00eaec4931e056adae03f8092090a84903078d800deba734be42bd73ff190436a639d29c65ebce29c1b0ba1a283a3a666fd20b4f0845ec4a3fc80fb65c637da009241b5c7742f667c3b6c4271fe7b4ceef780a9d39402547eccef13efb0e0aa2a429f4edd89e75c43e56a4b48a118e0eec79fa0ef382e8ba4fb7f0725d6141bb21bc1dd52c56a2eb9c30ea46f9404c82f1485828e966bd1dd3238bf4f615a955fc7ae4b6c4f4242a67d5f362e00c76e79873b35f6d6408ef0192324b5783b80f8eb6e7e7450f602d2bb65e7cd0de73894c8c8a36f21362aa657471c9f443e4446320a60b1ef0fd5052429a093e2ee90477e34b2439fd40dc795ad9054eceb49114189d86d5514220660b24acaa864dd5b51884cb877a2a01b7a5b691d99caf720c3f3cdeea98d539e1809cbb886cf8699ebcb5818d2284969af5b8d427364b73d5e50297e1403cf95f4340da5a5b9f5c6f105bea9d7ef717bdbb5e60ba140ef2ebaa9d363befdfeb39b3df6db2ca991ad0e3e66b4af7e8117a76f5bbf4ce609bc8005b3e5ce0348bfb62b70a14428c215e87f3880815ddf06bb93d3a89bdf6baf586db14e6d9d1583ec07623e15bdf0c527cf1c577615f50fbe28380cb7b27fcfe9e8b5e4c254cdc5e6d8b3fbc6f083867437fa7fb62d2afc59377134c7e7abe4dc7ea7f1f6afd84e4ba64d208049e32077beba41682de59433c76668f40759b5d8376fbb30379ee6c47a17f56a51795bd76c44e5b49d909ef5e0fff06699f00b861cf58b99728854f95bf9c1ad8fabff3c4980b3c30692e3468a24134425d8ae8e3422a859eafc629151dbce708be2d3505e56f3bdf0532bcfcebd1ab63378669788dc5c972763d63564a562dcce87a0b8b2afeccae13b3d37b3b24de64c3afb491e0ced7baf26798c9d3fc619df002e1f4d71e71063b2e32742ebf4f9f785344e009ba42e0cab133f0392424e46b7452b38862cbafd20e3478250571abdc2da4b366fc9d8c65c6cf59e841da38c12ad847ad403ee38ed063e7bcabe6f2557b5ebc672a4a063a04b5777fea141387b2dd31b45b4d49a8114b5353f7020b7ad8dd3ba8a7caf6dde7a0c95e91450d2598fc024c08696ad44d553b999b656fb2c2aae19a19b2d6c80bfbd012bbff7e31499f29c2cc359f99f11c10ebed8397a3c5422ec9e4741e6ede312c1aeea5ff21414128b73b14805f88fa63c981ef0bb46d2d73a69c913658daeb2df58ddb087c0c7c7fa7c988859b818ab4c0dcfa446b06d770bea69cc70c8e7466213df112a827cbaef2fc2447d4874784507357ca4e4eda768096e949006587553c639aa64c1f993757476a2fa0e6bb42f6d96a15c481a1157ae22924bafc7e8b95934a4bce607f99133fbca5674c40712273b3af646bb5de3c1cbef2c2bfd479cb31627bb576e944d549ae51ce1491bf71c6c70fb459a33112ab2d2b8e2c23905be275ae77df60db0bf9b1bd1bdc095e536716bf2ad7d39ebd11f64793ddd66fa61b166cbc0670cc25d4693ff6ff220e55c915263e52d1a789e59cdf6a218778684fa73ec8988388c14e2762d61a762fe76154dd657727cc07aaa34b77a3914ae0f4ba8d43e223a15cdb9ebe4faa703386d4586d46a1308cc4b58c1452e09e47cebec2d0a49fdb96671111baba2b9ac9b276922e486da65a3fbac9e27245090f7fe252b1610e15e85e6332e0ac1a705308dc94c8f138d3b4d70eef0e5c6d6bf27313eca81fd96d17c16674b89bf37b5fe87ad2a5c79f534d39466e2087b621a156d7e31d176e3b953e7f59ab10532650dfe5ce4d321daf63c4d5c9917aabe49c8982f8991e592bf1043244409f95fbc66d81fa37c710429908517409abdb0f3489b97f946b1698abd113d711a04886310ff3e8fe0d23a76d823e0fd191b01c09e5ffeaa7a4231c3613988486a8f7301135901cf86ad46851b0ffff81d2c795ad1cbaec3b400b11105a24df28300e93f78d0af8cf668eefd6131bc5b2d58df66e9c6ee6d7d53b31db036d497edc0b2c5464b92edb96dfb86b2715e4bd207fd8fef3a05d05ca3fd8e6adc645d2e38963a85b1f01b562234ca17b72ff293a1997aea0e3c13d958590d3b7c476fd0cf5d463eec123d55f1636e97eb7578f88e7cd2e22adb5f7cda8d422cffc3f35becce9278e3407c3f414e1d3bf5790589366e3de0762adbce9161d4444b211255f9b3c63b7ec2009b79be7d0abd83bfcf023663eada70b056e69f6c8c49a9f3485dd28a8fa5dff0f1037b360c2bdbd151589eee0b3ef7059c3f0db10ae1a2bfbb80f3847d40e074ca464df14928c86197a16c83488a05032905754cc8fc569d37cae05f0c370db6acaafc56ca9a93982a4669ccaba6e3d184a19de4ce800bb643a360c14572aedb22974f0c966b859d91ad5d713b7ad99935794d2222570a3167733a532eda0b0eb17510bcb581e4995440101a00ee2e80c5f74faece679b372ba237bcd2556c75e3ac050d30c6f8b3fc66496e03eb2cb0bb826a2fda9a05f018981fa436cc18383fa4f7a80e200b141086d2154b5719519f81654d4cd69283b5bdbab5642858804dc6ad34577963e3180a71b8e01c3e8afa5e09b12e0588198a7acf95634f74759678f15a13b849499d59efffcb20e38453801e03870e30d9203528ec3b2bb43ea12389c24bc5056e26db1391134d5067324f6cea60d9d2ecfe578b63f5a35f04f6303e130788df793bf8a717c089cc5a1f33ba0fc04eb679ad49c1a1979ebfee1e05d8f54de91f9264187138dbbea085a394d11aaf5523a9b372924f2c061a25a00c1f1227d00ce32aa33b9d6bd3151145da7ab236d663a49a39c515b9c2b9d004acdb0f9c25ef911401cbed78b071268e6d7b7f5bb9bc91e908249a48bae418d34cd397b4d010c7ab9ae9d10b3dfceb05b69c2b28e6779829467587e0d6e3259456d05078b9b7ab75d75ff12a620089321ba75ba545dbe3e15a81838afefd1ecf319ae2efc82c65fc1ef4f4e007c3289d0562b9d9bf329799ae10374d1a7b2b0d45f9f622e6b61ec8d86f8332148eeecfdd97edcc3ac2dfdaa9ea4b3112a576d4fab53417f99ffe5f6e99452a71a9064f090c9f869fd5e12ab3d6663ecec324afb89543d8ea2d2c4b463ae3cf065c96a5f38a7610d7b1c514349d307d361d6023e762cc6da2a9d114ca1a0429bbefc75a01d81a71c99eb41d940753f533fb50baefe476dc085b14406100514179a9c0f59dc034b15ce6d6cf3cdc74aeaba41cfb38e3ea2f038a1e5972b5711e26d4aafe2e086cd97ad052b192e43eb18861ed6e2a27cf6e7d7f16e767020dc8acb6acfd1c7969ef0aa3504bffe75605b07aeb9c2e77ce9f5d832570a7adcd48f197ef7bcedbd4fef3a8fa26ecac67b20d373d0caa9d8fcc8bdc737e9a7e58a5dfc19a00aef6540b1f2776c9bffc17c185df0c46085fb9fceed22798a83f57e75d7bd612239192207567ecbce29f0e3902bc7fd3ae86f43870af6a4739b67117520ccb3b95763544ddb28588bb5df5226b14bf3a06daea87f8b96311b5ac4f3ca8bda0026c6be6803f4e68b4b4fe7485a830f303762240f16f3a3b8184ea995e46d67eef11394ddb8384bfc833493269a05844b76828a17ebb78191c0e35f685149f8c8beaa8115d929caf4da207d8d63dd4dadd43b2b337c5bc266cbc580ebafa5ff35d607fdb0e52de62ca68000dd466ebdcfd6f891e23754d89f8f4198a04e060daeedc8852f7ac9200c7edfc7a6c03e672a054758b4ab4756b481f42126caee86ac4c4891f1f88ffb0cc99c3c7a5fd0dc64d5a3da2b5687af4e5a6994df94c40ca69814be98ecf6e9b62d41c9b883aa8fd8ce9ab0a6b7aa54b56efe7e4b3a2b024657c96594d6727e91006d19e1ba3ff42e569856c74d33e992364f37ea2997f9d3e1c3117633a72c15f97a87968205abbe142946fd9598d05d56c87c4cf17f75f7ec8e6cad82f974bd6ef6ad4779a009007dca0bca1f6d9b8f36e695e41055e92acea7b1ab52dddb1fd76df564ef73aeadf9f71fad4916cda05d462f3004cfd5d51e9b9b1011e8e185c95cea8f72150f1f2f4ced27b128c9293053a2b15d21ce9f42d6834c4e9f0aa7cb200727afe8accc74180ec9d6082082669b9b08781035e1d1e504e06764c8fe4373e5bdd782fa4e7ef50ef426596654568a7275e40f9e3552438a5d0ade9ef1c8a4e0b2a7689a0d867038472080fd1796acb3ba3f647a022a7eae1297611f1ad15f82b69dfdee9241064523631377349d7ee925d8d36be0f0f2cab1ab90abd1e3e0663a09d77a652513a0295c854743d17d8d494ec0c65a1c4c7abaa5e1d7cf76f3e5ad9979c00eb944c3b98b6affbdd9251aa50fb11bc622e8388e14d9256c10f6ab91bb5951f764063a646e19031b2b121bc9aa28fecd9b527eac76eb172028650276fdfa92a7bbd47eaa7323e3e43da0fb179c9cc1c8ec27d7b65a9c1f9453bb94ddbfd21498372c0b0c39103491876e531f65811750abb4be0c2e70c120f986cd26af745a615c996a0a3e7257abaee69e61837a61fd40a5ac4e60ed8e6ea04336021b55d66b92990614e1aedfab0a86475e74fd341741572cdda086e9d5de7d49c0a20b1b4f7fa789ccc14a3f1820e9d896b86e00473465aa3a5bb165ef1aa18302c1e89b658a514f826bb8f87b987dec8adc5148f5804dcef4f1118512cb3c7c48f982c9463902d1e63f9f9e2dc7aeddab4f5b90babb6be59e1f1bb9f996ba9ff3c77e377a1248ab58bb5282d7351936888fc159ff5c6c98862424870bd3a858a3aa1f68798c9f566a7d7658e0773981a32c47074bc9bc525daee07eb2289250c9100adebd2e834d9bd46f82d1f48c497b93314b18b9d7ad752dc40394fbe4f2e4a7b4fccd7e710b5d8ec29334338df882533487fe734b047d0f43b81cc43cc986cf926512d3051a3fdb040c8fbabb0947fab53065ac82e1d5f1e3fec227e64f1ff6478a35e29bf4a367a8413d0090064ce827e6d6bc1bd00044296a2d8d9dee20ca38ee9f23c21538a323e3d49ba979f1aa211dda3872598c94886ca76ba0412999eb04c6fd0416502c1b66def263dee6bf2547d88822e8eb518588d848b9c2ab13d26f45f4ce529a40d34cc48b6baf9ca5a8e76a41b9f8ad09b54128bb36fd159683708491ad6467aff0082ded0d5673ec209ef7fb8423323b7c182139a45b09b072cb0b6a1dc658c7f61b639de57e1d0120b119fc3dd32b555e904a2a8e66e7e024d162d49be2ee076a191df46090e8732dd038ea2392e8f5e12c1c24519b40a41e25f367a464880ca063a5a72b0976b0bc7eed4bf1ed0b7b885e0fad9a72a48ac33b6599c3a5c7465d9d932c81723848310faf78054c0374d8a8ad2cc59773f2c88411f176311c22d6198edb2055bdb83024e814fa2a5170368e7d386f544f8a728280f548910740ce89d159641e677f4e313fa93d1285dc4691e8470433879065c94b2b9740192e9b41031de946e60bcfc70e8b3a9f01377d3586ef00dfccc326cad8eafeb8a22ab0e1acaf1c6989fc5958ed519f2a64004efbc176f1937f912a09a2d9fb8562e3c3ee367379f0e3bf5f695482c74f1ed52057309563092068d3f8417efa10bbd838c929018e7783c3666acca54f77a214b5da4cc0b1ab5fd8d9392d2096f52d868404fcefc657dab6f2ffbe2f942e8e4d63e78e6f89f47e5f9e2ede853ead286d3a144a74be2c68f8897ab18831ee43edbf217e18387f1c7b875bce137d934cfacf896a56d26fbf068e7e4f45b53163843bfa84516995aaab49428431b051fbbdb8d7050cbf9c3d6f966cdffe7a925d9f4ee5398189e2a96d487599869373c5349a8f82fcb23c64a225e8fc090e8ba2ad7c64264f15f0b94009576678835339edc9156cad66bad53cb1551bfbed77c31d4919a3008a1a3aa2007a739e0c7aba47d8fb3a9559a20fadcd43c85da3f14f8d4958685c72f9ae31d251695d9b74c6e15ec3755ae78c6463ee378994ae82987bd1c2cea95d09944dd37e803dbccbf038aee09554bcd483fd78a2c83789a64e4796cb4e7da4b48d74985480b4ecdac6cc6de523192614ded901181ccca1d6d19eecd4704ff694ea349575c369a83baafaf043972edfc7e5952bf9efbaa38eb2e06890dca6af254b0c6f44c0b27b692d62fa7e79fc365838a03deab987fb58629a7e72dc084ae0107a6a541135e2ddce82d1083407b6503888cb4d22cb15ae714bb2ecf6fb564feafd3b263d4a5b23fee908836dd7fc4a75cd68a393ea8f0b6f629a71d5d66def2b03363d9d8650b63ef425528ff364a160dc8a70856cb3e9ad8d99a3c14fde28613b0ffcca70701f1f32abf802d08bef8a3495568fc840e3cc1b34e571ce43962df31d063c7f15c9103301067f05deaf72743da81b93b2644b99f0d94fb81ab2d1c9d1cc7c28de4ea253c8e04cf9d94b9a09d7f7a14564f59c9851d1b3b3eff8fd2de2c1f204261a563368380523085e6163f8c7b963e5123f74dc7156382ff320adb489467779a69c5063502017f8527911149aec55bf44c4ddf53aafcb471bbcc7cb84e219658df5295edb365f05c241afafd392c150079d32309018d3e1ed51ea9c374d50663af12c9f2ba05ecd184b8e5f24450d53c54900231439e87ce260a4ab22e0c2f83800d8b8e4069dcadef74b76ef8bb0171858c621297b8f748569747cda64d7980fa4cc4076d1a26b80f5559ba7cf40367b4cf2df52662f6560ecd885c01204c21c6d65aa6689f34ba8963b31ef98341e6886249221824 +0x1b759ff129719524de78cdf9bf814d78aba88a51cdd2861ef2b1c7fc3b5e9c73059a5ec8180018d6d4e770b6db1327d5 +100816 +0xba47d5b9d9c11ff12735ed4c040f49bc6deab2d27e04c0d335ef0b0d798a486b5b30b5489b2fb8816e7cc2ce7ea57a523306187031400ee122e7ee03b57b8874e69a52e081730e17e17ea663fe6b5b18a7581e6c0b463e897ece44e17a101cc2e4ed752a917669dc09a361b38b49333751468e6e14fe98f5d30cd54ed1314b7cdd90e4cdd51e13f86d54ba672d274cd6b9392f1d5551644aa80969f3c0c65ecb57ed68725554539296f77b27ecedec1e689ac822d525e9b3862cc87852b79dd6dc6bc8c1180170d20af66a9ad1835c37e5cf22249d647056f4dfb9848cec50c6f372ce61260bb3e153b75069e3d1e448b84205ccb3f4415b7a8a06bf784ebfc2256a40fb875c64e7f9a4f43c2bbfcb796a5938c221bfa4eba09375d31dc332f3f8bbe73644dacb0b822320b9af365bf4827e85adefabe12eef63cf658334f080f6ce8bbb636f2f76789e9a8b791cdade8818b23623a23f4bee62db20b38a4292a709f431ef02da50627c2b58915b9162048f8804c78b076a26f863a9b4ab705192d5e941ed7a12c0c9259bc9fdd9c8a57f4acfc0e24d82b51d8e2dab8e81c2e43f9b339367c120ee3401b285c780c7d281b34f117dd2f5525d8a03cc4af37f7436c19ace64be4c032b783835f736d50f9031cfa09f01ab696e56abb4efe8f12800b1e69bed59dd2736f2f48093e53b84362c191450c2eb23d658ed0c854a5e2924d1dfa1097a1d81ded7af0fa574425bfa0cf31698fdfca71ffa937c15000f9e2a8b4d89c009523aaa8f318934cb2fb9643a264e809a271ed0a363aba5f24cb09b46f7fa1aeec5792382429749d24dc8fd1c7a630f82b4b072ba274240085d87fd69a69d2011be67cf18aae1eb71e3b04c1bb6fe4e9beb848ca9a5e8eb2a894adb5e221ad95b842c38ba300e22903899daa0a4c643ce13c3a6d7a646b0401922ba8c33184eb261efe6ce9ec6f61795aa2d110a64f804769449acf10496325536245ba13f85009bd860bebab370ee420bcfd7b17f75235a20fb9050c9a5e885afa0333338882b7b112ef04d7b97fd87e5485b61c0c014088f47eb893de64af1b4b77cb2ab5f1c49bfd8ce1ec6742dac601e04e1cee3c0c808b22565096041e16eef9ee73f10bc4d0de6bef73d0d64f8a3db39fb53e60ee2b3c6a6acd51cb39c04d301979da5f2cf21e12a9e876c8bb4d7066475f4cfe59db90ad72648208a6b9fe80e8d6d25a516235179dc4d998b292328ec185ba82f4242061e9a0b76ac9667b82b905699bf6b3cbc1379379a4a9cb0c839ac3079d3197543e4d2c626036583cac1670008271693ac603dec79b258a56eb3f91a48b96a7b4892942036751f1ca639db147ac55f52a8c8f0153eaaa42ba3c2c6c21fc97d7c9d8ea9c1b0ec0e59d5f9b43af8818d9e39b35959ef19c76aedceddd005eb999fcb42d9529b4f7863de6bba198843eaa2e589416196e90a89d73f04eb0307080c5914eb7b0086a66149f6b45a35f3bc8337b270d53a01b5b1e67d04bb1f0510eccf6ea9e3e678e07c9f016ca404794c6cb496ae5ce4491009a4f0a5e963cdfa67b6b7d933550f6edc66f6a8a0ffbde283e69dc39e9ba962ba9800ae1dd7470ea495574412563297a8293c31f62da8c6f0543076446709f5eb4a16e9fe825c93ccf4b6b229efc9a4096d3bcf4d96203fdc86b590f650510fc543981c356cf2d3065b3ceb202abddd26bc5b494d430e966f0596da5b5f69f9700af0106a9df2147b5351b69e0ff48a289d04699f3b5b14d05839191c9b39fb1327848d441e459f52635ddc4ba557f336999ef5eb86edfe28070818e00daa5cd623be5b6bf6d1bcb414c826d0f4ce60793791b6d82dae9f9e9b699e50bba266e2850541882d80b2c9edfa59d504421818ff45740f37853e5b9bc67214af0a5f5fd5c00843cc39cbb8765b4001de99643c7923f738ac5922868f865dd3f1cb90759c597843d9e34daa3754a2fd89bd8c0d2e9106fa95149448ff11273587cb414a603759315f6881c6b94b46700d94d8b2a5f86bfdf99ddcc974cf98e47bf4ba09acc273b463afaf3583a9f50373088f5466c1eceae0dc423076287785d52d42d805628e75efa01f1e1dd7775ec200fb1afa52526952b90ea68b848ec39b5d22dff57f711b0a2318aa103b94280263622de8156421581c87523d4ba343d76ea3480381e54fbd20e401e33f140a3b1b0db4b870ecbbf9edf65d13e57fb090470b38b8d0b2b90f7fc94a1e4abeab760f44d8f3cdb0de3e14a3ee95baeab0cfd0a2d99ad4a000082810ae4ac35bb4bb274fc120937a332d79d62e4c32aceb9bf1b25333f676cdb0040054ee14b3cc104b7596c72a1062d105d744bfb68c0bfc9281ce0b9cfec710f9e36492a48e9c7f63ff8070fa3a122f9eed5977ac53b5fa9b5871a830fe972ff0ff08bedbb4cb0f5735a6a46bc2eb512d6295fa7ec9939ef47f6494183fe415d29e66fb21ed02c80f5f31eae56f973e9b7c1fd292b64def863ed057be8957cb8506a6d0de00e9b374c548cbd008bbfece84208652e28bf537dddd7788a49858f37ff1c67ab627d76caf14ce9456029ab0c1bf9f2515f4b9f0a3b27ee0574ec402536f645dd7653de064bc7b99211119287d25a4721630429ada78f42d6b21189cc84732f02b4aebb92d695a473093831dfe791da3aee8991bc8565fd6a9bb5ba828a2b899797febdd5243f4074d2ee0798ee4931fa5c4c45db5754945d6c1950eb9a77fc18bab45361b71d03f3e8a3923738e8d4ec36bcd46ebfc39e1bddeceb6c47f0ed12777ffabcf1c7659cc509503f59e9398cf86bbc0b114b81225b80f889051ed2f168b2323b86b6fbbbf28fd015e3d2d6593bc97b24ee54d40d5f75f6c6746a5451f8eb8881c8742cfdfb97805f492e41dd5b668030b9680d39644c74a8f86bd7a0c29c7c1449777fbf4ac0ef701c63f285e1b369d3050d93330474e0a5138bd35a40357b678c497a9c5a8c7bfcb00c7eef6940a67053ae1c96ba7fc94f5842de0aec5704f003629401b56ac459b6902d864c9eb49d17d1ffb0f0cd9d0c39396e2f3161a742314b528be5ec472b8297a4c7261e12bde401b32e320eea6038d80a33b9f5e0d2a86c3c87667182c6c67b7b3e605f4f572ac5ed7b08842fffc9a718b4d0743025db6dc8a0b19ae5cfd4b3f76895c2d8fd6e96f503eefddc1f7e0f302f3f7d23b04c987d5441e90ebb4fe9cfb230f93e2521ed60755fbc8d63c8a8d70f31712a067ea4d12ea1bc6bfd9a856ac7cc52ed42d731c62bd540a2413bec83d160e0b1ace3fb5a7c5bb56c2b470f3f05b27074eb111c8cb3da3ab95c4a42ad12485c58f80f047fd9da34ada8c7ffd2e8adc2539242062a99f90b41096663d94e52349e9c6268b7c3a7ea9f1abfdfcd0cf8d917bcfc77364a9c22c7cd32989ef21919e0ee8090a8c64f27cee5711763df3e251fefa2f826424e21bc3c11895489f76cce82ec04b96e2a7cab9d9e3f5ddbe826fa8ed801710d7978acca858e908287bdc5ddf74d6007d479b3a799c0018f716f263efe1bad28c8a7f7fd2140d988448d557454c3434fd77f8597e6420566845e316497af411096305c486728a5e7b84bfbda671ec982ae1e7fe3262dbffd7b849a944744c3617c921830b9ae6c4d4d7a2774b0a8696cb2d7311dbbfbc7b0d172c0326f74ba77e64dda4aab5ac3159eb876c7c408b95aa03a17ac2a24832d209950e372a77cd06dd400fabeb610dd0657586813b82fd8d097b212f34098ded368ab1c1365b1077dc52ad56638fbf02f075aca122f3353dea08ee699d86f2284716d40a437cd998081c64f246bdb1b7328ec6251d66a7824c50caba0447ca49e43e5f5b78648e320aa51dc9bb744ab7d3c8bd555664ba23d85c9b6891d57e19b40c3bfcfd9a990d89f6c121eb3bf2c97c2b7779f274d6ea35334bbc6eb7746060874e35fba660f12e153643fe9a11b7d5c0ddd91c1f639d0bddc0fec07516e68fb7814e9a114da6a10c66771b190f47858ed7bdfaecc9050463e476b298cb72eaa5bd8e0161c6f389e337056a415542359d4e6cb46371eac6cc9d6c69a7face1958e83f592135a28fa093341499496f8cf6282f730cc114f920d527102a0dc0c3d8eba7c9d601795a4d614d41aa549833a04f4e5f70224a466873f0cda96b11902eaf0e7a0a924193f1899818fadf83d1a3a9119f16fd5655ab5f0fc8ad7c892a611bbe934450c1e195f25dc21350f90f0820bf5c86b8fecdf181cc2bbda8ef367916fe3d0da3c3ed4086e4677d10c295d69ba2bd49bd0b5642c16e1b62570d5f7f8a15a0ecf30d5efa2c742dbe88a60a150100ebe672449aa7073fc223f1a94a7a5e4ce369a869ddcbcc573f601f6d16ce3c220de541733e273b854888de8ca2727aeb2f0c2a9d12bc4fd3c3eb3cde620833504ccf915eedcb4589d519867e0d70c63aab5ee171a4d49b31e2e549c396cbced2d02bc9ce4d9a0d938f5f5246337a2a8080e636af3c1c99b9c3d8ade25a1ff5efc081538b069c7beba1e1a8aebe9b8e07d52c8f1d819a31b28f4bd003540d90f0445a965dc1d978d83127f17c53d8da15d3b955851c584c666dc71af02f9c871d863cfa0c265aeaa368ba96799c3bf6f3a114f1adb45ed01b86d3f37091d5c2beabb2e75fdc26bb956d21fd6d41cbcae969c5c95df2b2a71a01f7c34a23be2a1bde41c5208c45d1f469e49020ea903e3e5055475f7e5eb7ab07bbf2478c62a57c4573fc15ddc01608838cb6593e933b3c804bd27aff6aea15c0a8e82f74c61c2808cff407789e701be4a0d6e2e5dba729212fd1751ddc26a253450dca85f4786850dd16bd04e7c973b3a85a8188706c4e5a8aae1981be5598e91acadf65f39f844526c8012aa30859192da9ffcf5b70f354e3d02ed3175e40a9b08538bccb7bc40e31739992db15153eb62b2361a39d6037c29f7cbaf029e2bc8ea79b3385f36fd486804ee397d8ef49cb48b7e750d9dc2aaf83cadf509ec6493d99d17127eecfbeae55e8c5dd392f62f46881086b0eb05533e4e1ea3fa5337943c2a21fbc562af5305c2fe2b7201cb3baf34b6dfb2325e1d52a8a82c62673742a89d5e54912c9a094fcebdf2c75ff61a451dbbd080081f61ebd8b4feb09cc617958346ad80af4e8639ce367442020973beaf9a19b8d0cbb9506acfbb8368768b99685577026f3f524a6e0200809c77b05276fc1bab21059c26bb72b3595ebb371aa91531a4e0dee5f81aab27f183c358c6e04c47057d3f82d557289690f426729fe2007dd6a8bfb9d9509c6b236c6ee58287f53c2649ebe5f2da7bd5c8ad2af6af9fa1bc162b546644ac504a749afceefbea915bac1b9d6df591c6f16efe5b1ba03e636ce1ed3f43f08a513683a3dfcdb964ab35f566c6635439a46a027c195a484ad000d862d30b337729cfdf2b9a1a41a2ad4b90bff97ea51e8ea0119ae84ade4172385830b204a3ff4466c586be4d0b11021d1c9b99085edd00441acf6a65f8cec443efbb4ec8b88f3babf539aeee9c2c541ae76e47a8e7e183c69cae02241e2f40e41d871bdfe7a379ffecd8fe677b712dd58fcc67c8d6c89397f5ab320db4ff72695008abb2c7e879e2fad93f500f7bd9dd841a7bf0b1eeba48e43b8cab63cbc37425d470d9cfaad5f5cdbec430eea8e28352fd16a90fe06249b6f3746590f0ce751d5efdcd6586f898c3ee2f728f84f2777ad8ba6a273a162b0c577bc4c32afdec952cc4f63fe96c4c8c0bf3ad789c641a7a21c9bcbe58605d42dc255180b6dc5b2bb248fca56eaba1748c933a105bc1fccf8cd7092bc7bb6108f5e3844040e4415f840c393c6321081bf4a0b11d4fa69ee96e64e7f61491d6bd3948f58835902f9f0681447b838710e0b88e9ac5e45c61564af5c1b3ab8e1ede2ac7fddf217a8668de4aa6d93c283c715ccf6fc0c68de4a4a6fc3edb08fab9ea2ee325ab810dd64b6fbac8dbf99eeb3c55d598844295a943070aa7e2c982287fca2d0573d0c4afc53f64230a4855bda04853bd86f52e2fcfef83a541499efafd80f805ce9d397354d1d96ddaa4d7245b88ac475f6a91d899c509af9d15bb91e1f7e6bf2242c6b188ab8cd1c39bbdafbcab51be63ff7b443f2c0f4f5cca629ddb737b9a056e16eabf30f1275b9953c04234e69b3b4034e32e98f6dce6c41e7f38a8291efe7b849f8706a8b7192a43f69a99dd565bc97945f67072f0e18f69a687fa71b663f7aa407ea1060972cb08c3146e98883be792ed1556e623c3a8bea457ded818dc6ef26de474aba6fef81ca64e17caa952472c3909c0d2de139c981916e9ee8ece5de78877160c18244dea20b629c6223554afba5222cb9847d78045439007a0c0210420a4e9a9c579190bc2db092d8b6b9c98017d1132ead6e601e96c65c5f74874e2b6dc83f74773f60bfd2b5a635d5b8b7f7ee9009b3e574487560fdf9bfacda5edbbac6997068b7135402581fa109badb0b33465770b2f7fab1b9c621c13d6508fbf92feeb9b4607422c6814743d927fe62eddd468e9f5f3c7baa091a8dae8e163330ed8776e2a14ad225186444cd67e8a4243c1c353114d77b3aae2d4c87bf4e2a69e7acd07be45c0b2806bfcb6de2617ae04b218cf27e9358719da226515f7a89ab05a5ef06907376d631a0014201318c2af29fbc690537ba57bec14292d660f7ff2fb9fa0b0d57ba37824e0ed32a1f810919dcec1e128d4bf5f9d1c9d58bc91d6b4d311913c2d08053e11319a8c6f50186a821459a0b5bb052371ce29fe87ca2fa475576a519a6703337354a4a3e79b6a887b6ef645a6a94765ee8b67a544330b1056d364979a031de6afdca40f87445779fe3110465829d6a587e6ded37e46c9a70c184874a886c5c64b3c1125ead59fbd6f0d403966a73350b262e81fa2800bc6e9986e8f524c8b60b9f5749d7ee983d15245fe854ecbfdf612821bc03d7941fe83c64f3e03deef34909b26ccafdaa4445c9db3b06ce297141cb6f29bbb9cfccc7f34731749a851b0538fd03a1a338184c256f8516d958f29258404d8a955acaf10657281905363727755e97c3a8eac21480444cebd5f56a3e17bbb2d935dc2150bdbb623844a94d9608fdaf98d467498324811bed8aa7e22c5009df0e5ffedacb5f9c67372085683c3903d388ef58b583584f7784c01760444b515c93dc68fc493621bd8061738d0050988bfbc0640ffb63d6ea183eedef6e4fbcb2ce74c18fb48873ee79cf1ac6ca94e3605910345ed28e3dfb11cdd09492a6726829eeb29cf39eb9828c31231a824e0dd90aa76faaf221ad33d735685998969a060a14e229eec01cff2051359211c63d7f764dbefb42644d18d23e5e4568685d14dbacfa418d36c4ef9cf5f9345d449cd806cac95aaa9e46346baf5a60eb64e21b037fa1e9b847d8d96ae6160a4f10526e20e537ce1219bf0f085203b307d152a3ea55802b573c8046f1ec351ccf7186c92e67b160621be12f13ed0245a5f9d432f8f63e0e525de6bd99cefe70c6b1616f9619de1782edd31ef249fe1fae2291529529849a91f22fc6ca5618101a160aeac2c067fb5bd7be640f2ea0470895b08a29b7fad8fc4386e9ec4a2c04b5e9a9c21827f314d320ca87d06490c79d9a5a621c6947cf7c9811af6773e1527d71687d02152b6bd3121e119fb275a75378b763d6051488f738f89fa499e0045cf86da5e651b60744f3e38ae3e1f8ed1479ee14c0530809566c64420984d12239c4e0c12ea43ef00c0c407803b9c0a3c7e328fe401dcc5c827c7d1efffb5ab2fb1eea5a41d6682f15a55e65690276d054ff8ca7bf29078962b06abdefc826be8c4eb3f787afdecb450665d87c84c17da2154399a6406296dd4f54a73fb1db4dd39c622068f748cc86767c5aa4074ab19b6d745c5b2a858ddda36262597f2268b8501f5e4c754d3bbf3fcb724952b874264e487648af177549f2bd78a3faa21623b114379bf2961fd8a77ba8d32eb4ce2b02e771d397c15708858c7187e9045ffc086635bd36cb80b8f7b484ab63e6c893cf78d566a92a3a04a4f8d36b15ef4b2b9d40e01b09936649769d8f37b9f56944fe232868aefa2624972928b9470ce399b8c8bf1b3396da726e5f50e0f88aba27d612f4416fdb2450a546f7d845032e2ca1265a267b7de31b25214f0ee74cc124a16ac058b1733a701777c930d77b34cd9f8339a5aaf08a2ce40c152a4fe48824a55615173f6a736d35e62529c71cfe65fc07e5fe8896d68ef348299af8f9170d2cfc7ae5e069d42d47b8932bdc8f93dafed9e59bdd18cf279afc13c8aa3474c97c84772a5b18679995189b9edd7cfc16ee22c1e2711d7de021515c1a2d3da93edd17944f791e3399672cc6ea938a3fff1409023d0c4ee9a2cf6e8bfa48bbbe5699dd5aba02244016041c9b77c662667fb7b72f1375531a53ee7b28cfc556b9f7f7fd50d4bed197f6b511a3ae3dac787d2053d0cb75d318dcc4a2bc016ab7a40b3e9fff0574ce3f23c23364f5c20f7ee098066dcfd477ec269a09cef800868679b7ededb6eec2408373a968b51b337f9265f88f865ae69d18b7d8e61b4e6a6829aa0ca44df256a3000f9c375711c1837acf50bd58cec8339965388cd41e0c51035e27ac3449326f81e03357416c619380203780adfac7b793ea51498b361449ef1d648bd1bbfdaced2c9752ddf4bab58c9ed45feda48930ed8f4aa4a65f2959d52debcb8e0f5f622e3cefb0927175f3869350e28095b6a68f9c4b268e61f3879dd7e5f3d20f029a2b5864f7c7aa39555645d291cf95f72161597e55ab041cdd2f637a8c04818b5cccc81eb1e668afe2e5fd83f5406cf4aa4a0d09bc651049637319d11d8e2ea5aef9d3446556737fa219028a953ce15448350214e0254c24205241132ed7def69a9ac2fe9c7f93509ddb9e10f92cbdbf04077ec84b5181551cb22267484758262797dd76ddc990cadc14173daa76c8dfe5a9ca4c845377845f7d05f6f24666de5dd86cd1b09c319666aab6382f84ca59f3032ec91391f658f29932e8b43ccec64546b73a9d603f5c4387c32a10bc8bd836fdf1678175c679dcf0f16416915985e6c706d72d7d83c37c91863ad688d202b7805d4d5465ae9025688a92a1adcfc44944a0d0e75bc27418b24691084f697f7d72b8a417cb7845d6eb449bdcf9f82a74a6ce4e5462c7171fd14d562e7816f890bd4b934f0eea3ff56069a74fdb9c6071d3d879fafb59539ad5e1b2d16da215f9475e438696cd278dae3fdd83bc820d48b50678638c3fd090a84bcd7895d57dbffa39dc43cbe8a4a3bf0f66ff0573daff339f74177f42370931d3ceab5876d9eabc23850f15055f417a206a4b1c376ea034ed949c3a2a300d58c0def21e4fd08377666671dceaff6ec7bc10f06b967332a236017c27bf62a5055c24d64f260b901248a8f188602d338e29807558588ebe64c3e23facc876d820edc9de53c4311c75127317812f9197b7b0e3624d44694b62dc606b330f13af91bcf49393f1eb2c880bee6c2f1fd2a22b996140b123ace184c9a38a235ae2304011ce7b7574e1ca337d4277fbf8995cd02c2196ecbdff88b2d1d223e4728b6516347f206217bafd5eae96c04b818dce8fb14cec66da0849d43d15bfde1fb556f96c2e0ac3a01fcef1e713d0888357ff516f09cb8642722bd25596e57928080ad20203bffed8b743d470e12e1bc79ef7fcaf81b9b6bce33794617a1d1d572e898a3e27c97d872b67ef9127626a120bbf79b9db405e12037402a9ecf03272ccdb0768c2b0a675223f2a920ef5df2f465eb1d540e8e40a7cea057512e420428d0933c8fbfae36945d56ebabd6ee1e4f6dc8b4bd838b16df3a1830c14834f8f1619f5a6fb319b2d3c30a1535c55d7fbc342ee62cab82d0213a265b71b55272112163449eadc3587ae58ada315332b3a5797c4633ff0c09381f494be4fe111bf2705dafaef841b40435678f30e8f446a57e3f4965e69d3e6e89ff769d7af7333fdf0ce0132b0b420a431ec8a6ff18a536e2e664350aaccc5eeac75ffdb47b6433ddef8a6dce868ee79f1f0b261e165bc428102b23c3b15f63b22f8ca853243b88fd8403115b59f74699f6bb10ce83d6e7be3b02b4ba5144178096710fbf781599ae58ee9049dc1781d4147d0978d7a32c25d58f5a56f33704d69a91a651ed7f0070dca17d22a36c33de26b572a5984cebff6e2597121d949614ba830ec2faf437d58dc03a6e4671d7087bf8eefd3c40a19b6369fd8446d965db64b9ab8b3701ca5cfacf5a952ba4d5e3a2bbc0b83a0b078a53c0f015f591de8b37a9ff03281412779233503fc981db002972ba9f1818686ccddf014fa04a7ab491d88bc324c7aaa5f270adb6a6a530ee8eb21efa6d056e832ff8c3b9dd6fb4e801d9d453d3891d687a1be592596b81ff20fe70529f3e649df8b299cd137e378606026b3daad4c55fb7a97a7b486148c2aebc5140254fe4fdc6a105f1d8f25d1f2cf6b2e921375ccc398deea9fa02ffc98680244ba5968a2308289ad0a468a023d52b4ddebd3d2e6e5e5da4d6f4ed018436ce8bcd86cebebe3bddbae1fc4dab349d248e86f532c496b48d5f5abf7c18833e0bda5e4f44ed2fe025089e472dd8b1f357078a6fc4a9d5ca8150ddb02c8f370adca2666595afe88382e67e1b65a33c66574b51736f68bc1efe3bb87d9ae0203b95768e702d7188949be6f9ff91b5346489cc64a6af6baa104872738e33a5cf3eeac93ef598dc70a1c48caa5a4e692a8c82fd3c7fe13d404cf497b758836a9483310ce04c543b41199149f7b1d8498f3cc7706175c157ef33871dcc73068930a6fcd41b0aec387a9a86917aacebd0e2f3bba85c1eac46274274674b5439ac0428c29157a7cd3e7d731915ab91d589c65ff41784d12e8289284116bc72992d8f8716d72ea983c7ca51cd28f30741fe99cff5408433b487852371ae9854b19843206e07f8968c5ef1a5175de983ad89edc233b5c2cccadf8be28a915780ff66cfa33cc65de5538e83eb9c17077d74c622d533d9e902fdf53dd40061727def33757e0774b72c85c0e1a3a006d58b343de9877a3f3f5cba62fb76579181a21d68d52f52a5acb27f80ab5bd78fdc03685ba2477b685e508ca3555804940da3e6818f15a2dba73dbd583182b734639c8d99dda3bbb7ce74e120cbe7abfb6ee9f717d3ef8c892f24dbb22496a37734ad1082fc0acfd008405475cfa3923a3deaab96741b5430acee4718f52640caa7cb9db19e1b0c337429531cf12a7bd2e33c9077c017ae54c9107c1713aff3c1355e817034230544cac67980b0dabd480746324648630f87dc22071710a250ed85fc68794ed15f96547e144b8f32cb1c029dfd9c8d8bdc2c8ea964a36c9bdc91e22bcf275e945faab9d6cfd7fcd149d17dba7ec50000b8c5390d114697fafb61025301f4e3eaa9f4535718a08a24adead112225a305009d463c3997b135e31dd3f08bd7c6f52b305b9756b4fa7ab6bca953b84e6aef863fca77369ab7f24046920b36e28514aff4174c8543fd5d40813329d12d4cc684b807c730e722beb07873ff970834a620349fdb64ffbb54d073751cd58cf293e15124b78f449ba11bfc9e5218117bb065381bcc5dafd9664edc94b32c31035e875249ccbb7acaa4671b3c8f20c4013c6648b4a8d61d029ca202bb773fe4282d5d03a0901c5156ce7d1a753b16ea6f510bac91f5390fdcfcb42e10ee746f090a4bab4e8a1a90e828454470e0644b6cf83cabdc3eed4e0f916ca7bba234994dfc39947e421e0127b8a7e0560571afa138e18eba085aa24460b3b7e51be8299d0c0f0456418e6abc888c354e33a5deb519e29e55dde8d223736fa4b6dff6e8a040b544fe0ed4944ea0da8c81f1689f51a32720d544ffa853d18ab75578c89effa2149c9f31564786067b2d17c722bc1ddf985f62c607ea7d82ea38eb6ec412613a125361337e4a0cc45560373d3bfbc0d41ea222ea6861488f796f9f47540e6f0e98b36b9bb36787e2526d09dc1b25e38a9f3040388ad55dff1da39a8ddf58d1298f02e6f15c649f66599bb62b2b022d0a0452e238d60e63dac01e03c7cdb92e90dd89f9bee30afd5a513466b3d159475b36503173b2d303284926037e85f92e4d6c90cd88af2149c5247e40fa76f3d8851c72547087ede5f2a004c23971e07a66225f89da28712ab0b9c26d8a839989919d0073b7be25b040ad006780f836bae6e93d5639b6c14922f84715eb5e110286a341b8d1bd410c1858611bdb82c295d2a8745c2fc1db4e23c9575ea37123ea6c157e4945ee09a384897105d3774db434474ac243b185e0bb1438733c2399ea4cdaff4e9bb8471a8b28764eef409fbf13ad08b1feee88a7f3c1337a3edb3aa92ddc0cf05c82c11c351db91db843805d78c4f550e6e0ac4dd2b8909c2f03cdd01702ed560fb6404f8b50829bb5e9b8366a735bc885f0b87761e2970099021b061234e9aa3cbb8c5b94a919ef6e9a0ef3f1a28040638476cfa72590cf0340ecf4275a49116bf96de95911c5436bbf4c3c1539ade10606acfdac6ac230f62507415d5d56b525d8aba1e06ecfbc35be38b8df212ad3f8dc23a9789a764cf9193696bd2355bef1c00d2a33aa7f8453019b1056403f3dc170a37a149bf44a94843f9b4d95915458195d2d5aab1dc34dee3cec837f3447e728f418875784534fceebf7179b519de14b61515b5bf1a0acefe5f26cc6501bf46edd2cd9b46e8fb35f0253231edcc414bee23f40a04344f66b5ccd1bfeddde70a9275e129cf925479f4c5677047bef79daa79e11645ad7b6ca6a23980d21bbe1409a553bf66e3e93f791a91d37764799087a17d48e7f807173d79de9dd65d8d19dfeba5caa150120cd98f31d9d15f3fbae21529306fa67b1d06be21855f05dc7271b347b9f3697758a2add7d20a01b273665f655b413b5fd48ee9b2d5c0c734c46b96ca2bf19271b970f0f47a75ee9a6060eab23801292de43276f2edcff42e7629f09d8f106da985a0f3083199883ff88e41b04523e25db29df0725bc12f120e396b4261d44d8763df1e837609611ba22afec0012e0977c63de0a19e48da87f326615922b1c483ca77fe16d63a0bc603e36c61fa8400f4957ec21133bb8918db5d7d32704d65273007fc02c0afeab784342526afca6b6cb6ed1f41aabdad1d1d5b097ea8eba20a2afba307d3df7088a999b37e8f65ab48910542a361c3d93d3fabb08e5b20fd7511ef8d766e4d4f81ea8091ea17fa3300ba63f6b6f7427fd1c8dbecf1f591fa209b4015df2e7dea5bdd754af9e7dcb52da965861ce9ce13733f48293a06930a750d99c6b262e5a37ee904391e6da18447d4a68b25a7cb36aa099cffd71cc8b0eb1f593a90ca293d63a3b9f6d817cd32b7c2836061cfce4beece26db599687800b170acbeab29d0a8283e30ea784d4332609a8c061a05be5a9e39236220273ea5dab3b0530bac58d84002beb1d233b27eb00730595e7d87673e05baac0fef2724b324660f3514748c0aef11699718663af4d7eba8f04e880c55aefb3d6daa79a5c42c989b30476ced0f6ef0bbd0e3a88cb571859bd65e09726a9cabba423f7d5296340c9e042f8822d6e5254f847cc09c793fc6d91a9752c0053695ce96967b51b0a28bc1bab31053e7bd76ccbbcbf693cba8760bc4dfaa1faee6801f7297bbca9adfddac59ba4baacb5facdb7db7929930145cd8da205bb7ee143355dd2a84e6dd54ca06e92e824c09318f23d32adbd532eb41e96641abaf4c267719e03720cc00681a7773f6fd64299de64dc40c1a705896ede56f2ae3305185141382a6d5a68b8294a9fdfa0418b40a7b00594398922a7b2875fec34a618399d2eacb5fec99070c02419222df9031e014e599b89a613103ba411af42a6b6dca7946c34aaccffb6d2aea3756d5f528867aa38c536b08f4966af0cba5c9759481d0d173505f70ef0dd44af67e2f6f216675e33afd52adfc9d012b19be71a88224a030e2574ba36b54ca09d6823625a5e7cc4dac9c9679cf7e48990d27682cbe1db10e1848ba91f8aad3d0e04a2f403b714988e9198093f7a304e3aec8f628d0d2cb111e0cf2621d77b6471abe65e76c6cb23df95d5823fc7200b0058965c441adb6e1fb893c3d63233c158ec71f43bf40d013e54f6653645503a91853fb2a97143927b7a9df4a51162de2444ba47cbc566bb3b4d6f149b9b3d476f10c027f5d711e8b5b5325b36fb8515842333db9eb144bc46edc432d82f43cbe989ec0ee182b2bb4ee6f549d45726f1d92683222d5e337ef1c48a228487f032913ef7e9c52aa294b78e4b5325caa51d93cd1cbe1012cf8dcc402576292bef1616ce983b49256dff7029c909a3bc9bd354655501bf755563271f1a902e818cd0bab73195c61971761927e2dfd6a387cd8bade08fb40c8199a28ffe230d2f561d2d67486bc46d597313372d382725e566c9f533ca663eb09bbf3134916d9bd735bf7d613fec978280eea60cb51daa21296fe9b3447e828ee3ed91525d984d9cc511580084772e892a0c1305e932a6e7a00dea0380458e68fcae3eebfa45caf345a395aadc2ca8d9d90bfcad170eb295452474990053a8cb50817845f9de8a8731e6a4c499458d01186ec176f0fa43a6933427e83731684289f7fc04cecb02c5047b03e26e8a417b52951fd7f99dd0b814cd5275a767535b038238ad0ba3ca4947a13188ae437cb5222f56548351e0364450b2d5e35dd07157b09cb312f157607619cc2beb09855b018e138130cf08ad9c5e976d4d9d9621e0f3b69b872c20c71a452240a754f1b97b41b5c2846da08a97479eb0789eeae959dc14eadaccbcd9aeb3e27b55be587cf9eadbbcf0a65e59cfcc2743e6ea65340cca1605804b9204add66b10989e1001f7d9e3c5080178a7a02ccfac0b088b9e745e58900a3126f4822d4ab4c28cbed51faf7c6f2d17b5d0b31a063d6761c4954b095b0efb061215d6390fec75f2cb82bbcbf43ff2516c7172e4599c8e8eb694eb4b7bd6b542b9e5148a090c2578bc8766cfe9abda3723165a4c382de307c829cf95597bdb7fa4dec780e4b85377085f9b1bdb375741601be392308607357fd072876282d005598f59ce216572863577e3403766ebf8aa1ea956c1295dc054057e923570258c5e6365b22d88252eda6cb9cd8cbf2ad5777b161a687c6900db554e3630c86e6d1a0755ed87b4cdc95daaa92449a476604eddb45d9513bbaf7c3c5bf3e2fffd3012c7b4c0be6feefe45be0be50cbb61119692fe80e573c804cd17424bca9b646ddf310cec401dfb2619238c7034687d71e5576f34d81110a934927bbe660f368ee5dfb8c0ab4394e94e5795666f302df9c18780d9cb701815492a72cc33dfe60bbd3062de5e752ea05bd6a127fba6f521b1afddf05e1550d1814bc1e5b281e57ccbbf75a5d8274af3d83d5a45884155721c3cd118fe756d565372d39b70a9c75aa7e97ba7b6de5c5c39d80b3f9373d17387baf4a42b14902c663c426dec9c0e1dc85aef64691ed531f7533e868bd2fb9e7aa6d32272879bbc000478dd84fd2c4ea3704b5c7d4d681da71b8ebaffc3366b7b8cd7245322d29dd767f15ae821a455dfb60a0041fe6797bfbd663d6de91462e0d98b2a5b8ac74a42d3467674ce08dbc3b8c5e075b67608a7a54f8e34a9080d61195994da33fc39d8e2e2b0b946bc38f5e4e98d86e9f618f56fb53e027793d372d8ed047d92e3e51ff3408a34204105fcc6ff67d42d7a113f6931cd45f94a4d7c749ff9b44c10f47e910a6363df39cb2ecb71f00bd564b9ec4e4fac8d929de404990cd4fcb405b07b588aecc6f808e1328edbc68c96685b627b596c37d8012fa1929e26d55f24d1ac965c86dbff30f07e7db74be4d4d77e587cf98cd33e1698ba1dce7fccc200a078f6e9b22159346189247f00930544bb24dfba7eee3930b7d477384051712bd566d6dd0f259a95ccd8ffad8515cc326a5dfff6b2f75df1f5875b4608f1e108c90cd280ee6737d78ae47bcd39fb8e23247a6a38e97d10dcda2926924a2c9629f3c1669fe054c57c344225489fa2cf8971f0ab1b52fe0653fe506587746004f1fe2b0f64857ca7f6516898ca36aa04f7db674ef8afe882e9aa8384a0284ab20340b039793e4d63c85ade22ac9f7fc2d0b924a27b50cb2b2097492066d63b21e053e771687b559d84b8f96f7a2aa28db693df51fde614737b2d07b565fecfd8ebb03743acdd13999e0460ebbd78a0da1c03fdea0ac062d06bd445b00802674bb7de262ca0d4060c86c5ab13e0f9f91c6381e6c71c7024e6753589bcd791900ec7464a98fee0bb4ac1651e647f3f29d94f864065cd85d90a19c95a185f2cd8768c810b15119391f8f07b517a02b8a1a5129981627871fddfebf82d6f0924bf278a06ee2d736d288b7670dab0f5e70ee46f243039b7b511cc4e4a8a2d5029a2a642407a5ebecdfd66d5de20a5d34aa03bb7cec35805dfb353c358d6efeeac216747e626053e366f3f911bb9c5257423ff8ee1b149ed4230faed7bba031f0cc9df0d3087dd8c472c6a3ac20c8b56c3f8c44715908bc89d39462f5baa237bfbfa91f4e7f6242370837b35699f9501eaad1e92d2c79a42312ab9fb510dad8fda3214a14517959e3322e7036af94e9128af62d491fcf1c4be93caf3f47b2db5380ecb9500528e571f7932475e90249f3e7e259eeb772eda95e30d8bce7900a685ff4b42824d9ad88604e153ad0ab3867ca7fb4437ecadfe47c6d635476de2be5472083c435f37ad173488baeeaf77d163ab48871fb40b9a548dc982e7e03077141586d4dc0de14f43a67d0f9c24fe2aa3f691b9fb63a4593cc65be73866766b55484bbeb4e014398bd942b42dd192dc8e186b7f6382149570ff11e4a17721058888db6c566c6cf6503b8e3b1c5be271a29f4a29e085e8e98196601dcb88ccc03e559a30490947f0514b9417001a798481e9924beae57dcfff3aead51f11d635e74d1cdcf54d41c1df8818da4193b48fac85e877eb376fa34a4af6bd04a8d9e103cdd7b4f3bec6e58b7f60f7895e1fed7302b11079e22b2de345382814c4443c24566f4accc453d5b5a020e12fe0384875de90c81f7c2caa5ac803c8d7eab1a1b9852810d904751d1e98cd49adc08a0b3577ebe1447c00b331320df1c6828edc43c8b6a9a0d5a72606a7ba739b5581b0327d470e614833d2d711ab4559324826439f7f77dcde767b0e7b9d016135bbc1ed4d26922e973283ece5603618608a2a4988070db5854f96a672d965b7d794dad665ff3ee4bf8930c33bc1468c93a152c600d1cdf340bf036f3bf432d7c1a9457e6655472c47a483fa7342e91e524a3a3998544aeeb7214bb92571eb697a65bc55bcbd5d8db610d8033a69a04612c14b24cd2307305f32ca24cdd6e1e5685689ecd79be451915ab77defaa1eac5bc2f0080db285408f5029229397c8d411f838b455657e304feeacbb018896b9a3bbd363d8874797ee05c343254902ae1dc7634c94ce7da26859124b1e89aae671186fb8bc15b0bee1b03306e14f11dbd2508406442b85207106a2cea531edcb4a552f8736e2632e110bf2de662e98f5d6000581b2110722d093b88623f5b1c0a61e9d4fc771e15de2657d3a027bea84af72723f8cf386222d6cde321969a97efac13382fc488dd6dc595cca649b98f0b50454a0235784b6ee1e8e3303e2374eeee97cc123eafb116553fbd00b2226d28d52274413b17559790533096213edc8c903e37b0cbdaba623e1e51b44841692aec854abeca5fa7274dd8735b2533f753f8 +0xf9dabb2616b848d02b9dc3c198aa4418b7eae1224c8ae06d17fcd4d767ee429f139a3b86aa4dc0ab76382d8b4c9135fc +101608 +0xd94d5c206e65ceda51c7c4e2b2758677a7be7a73706d8c20ff40d24cb89b70a0757eba2dcdb59948964e3098a850bf6de4aac753756a6fe8562f26ea14e18a94d69f882b9af9c5d4c1603da8ceda2b0a6bfb2838ad109621989d3f77e60a3a0404990f415e9b1a25dce4353bac7c91f74397e54a9ec7cb74ce71661ab37e4998085294989f0260e4eec15e78cb9cbadc746846b0d2f8d488ff93e3fb05a47ff7e9b46257e8965fb800e10188b2a46f5f07549293d1097a0733eafe4363e6a3caafa6c0a7bebfdf4a192b6592e9fa762b0345131a216485967260ff1a56ab7fb8620ff5b0abe5a7414187d4bff90897e670220f6e4c6fbddfc5dc2da7655cd96a0bd94a993670804680dd943769349c3956d3cfb6da94ea8a3347d213185f7a87b2eb078be8c83201df15ee21c1e84bcbbe3f9b1b513ad33fc5873485f71d2ab85d2d74ad4755851965182aa58a8b6e45af50bbc53bc841a582859b268bfeb0a51687d828dd8041371bcc90ed4b85cb4e32ed76db1fa8fc647229511e5b6bd6f5e4e17d2332af2d02071a681e8c3d2b8f4efe15868641cc259d5c9d94efca6251d023a9c7cc4b122333eaf963d61d55af0b6ce0edf7fb79900c04c6b0d0841d60e035a53c35bdb841a7258ce2af8c1357711d1f39fa3eca4cc60a159c8502cfcb1effb9a9f56ce7056ab169c3a2f22b2f89fa1a9117728802d357d27d96ab4039926a2c3692bf67168378d82f34b866de5aeb191ed7ff7b593cd2457e8ce63753435c480d9620ff1efd61214eef448c0decd96307c14e6bfa0862b5c4ee1d7ec139be535389f679c2dd538b475aff656348aa41755ec5208c3ff16c7a44b7db2a7c799633f1a89bac2d385f43fd51b8897548fb9034cd61b8ea66b0c6171c1736157359d358a02e84f5f7e66961a34f267b99d97fcdcff8260fa8cad0edb3fa8e0b96e45b4545f9f13b7865e20d5bf0e36387226bb131ab7db9a102c151e64bda66c97ef441ffc69c09a327d589e3646834f9207b665d4365ed389fc1c81cd4c12ef370c6d3365b2d6660736b5ea1735cf6d619d876b98888b555ebf7dcbe5bec6cfe03f88352814b5b9790cb13ffe468b20856a969af418b18e02c8c1432a90328d17cb2d9bb009eee30c71f306381336f761f17c5a538191fc2aba8f8e186ad6854261e5edaa0cf2913608c3e3710663508bc4a140533d8d0e1b0711133b992366f4861991529861428a33cc4e25aa80ca67469dd36fb7035268212e6910c5b990a29a612d5626ab658d7574acc27a2fd38909da9a0588a56796bb1006145b09a0d12135283142417894604585d3ffb0fa6580dffab11ce39c3b177e50c2d383f604bd0e085075c3fa4366c77fd695c4bd814e267bff0e3e8ea9d8b1ffb8c9c92ec1c06444503b93792f0b72e146f6db7b70c436944bb726bd8771536952a849b97cddd0729d0e30639bc0c060a17d55e2988598ea23b22c873873fb041ce96614aa57cb09b3583b483e19386472a3d4517cf4b5d41389c09a5142f1769427deceeed0cc702fc414a57a97636336f4c766a2a425f8a7a873655680df2744cdf4469eeb4d5c6ebc4cf9c5ada9e37b0abf808e1661ae3c88c556bc902cacab56572a5ed9d614ecbb54b3c3de947b9b301d3db3cde18b5eb5370ce803626d344b67d8835eef30463bbc61e9acbb82341f70fca82d3e169ac838e68d5d08ef6c37b6dfc0dd0134f7d7f492ab9a879db2235b5bcfd6cfb65d1c4b8200ff88a9ef85b4ae8bc6b4a97dfa8db48e1a7134b1e62cd9bf3d2f01322c0f5de78d8a330adff1d338be61f4552df85605cf00dd9fd265d4ead2c48da691c4d8a56956015a80eeec7c26a1bbf9ecc4e5a70acefef862b6fbd73a389216c83c80df25a4ab5b231c38ba91ec46e8b163e1e660342f482160ad08d5f3d52f49b6f4d944de7789210a667872ba5bae1665d95861c8c50ba92376f4287ebd4c90c49338496c2c712529e43a6b8430c6763b4a51720586af345fd82db441c0fb37f5ea7095e6008f89fb3074cee28cae6b64a3763362bacf8d764f1a0bd576b7a9cb7926ccd4ba50da1ee9cc2f5db5e27062734b0878f7d90f174a4d91b2450e50a5bdaf60a0a0419fd56e850f4e42eeffc5482473b0b45823b3683ce850b26be725269ec3e258fe45ef4d43d13cca40940d80b7079286d975cb177c7249555cb7ba525999024ac356ace48d37c19263c79bbb572696c5b97fded660b1f4945d5ce5bf8442990c5d5c9ef2d5854561e4f4f066a973461784ac5f33ae39fb05ea3127cc93430f1418d245c6915c608f30b6cc01125028f2c775dcad997cc5009fff0117fb2cecd8823231ee652f7b90d3875f19265fa7de0e86c7a2d6fcdb4acaf102104062bae025f6d3e8a5712f0d49e15a1d59f45b3fa639b0c1cb2cb61b17c19b43f786e1b170babc43f6b3d36b004f2d9c11b0ab9e4b1928790aaede17e2eb4d21850c09d2fed84b6ecd7a0120933b4a040207218049af8f3709d5cba7d8d888477d548bbb2cfa11e79e4650c47f404ff3af7a557c4e57559a4d43f7714603ed144502ffd0877a903cdd7b1acd20d8afd95e9cafe8b5cb3c01397bf9dad717dc267099ceb99ad456ed2fbaf7b1246eda23a3c0a95c0c55730a72e04b6af86ee5ec948b80ecd3b1d666f9784007069d5f611388ca5cde90cb147e0354a826838ad5055aaed0de8d8f38cf25bc3523cec02022779b51990784cdbf67bdf8edf04b7e5779b10bf7b1f1d12555a4d2189d7cdf64ff84e0c8143084cb8fdff3ab3fa8571f8b3004dbd99ede708a9254616415fd3fa32f70e8616ee806ee431f0abc11eda1e19441d76ef6af45371d327abd0c1836e4e3887659904606057fe1890028a0a32f664996dc89d217edae02e122cfaecf37599dfe77354d4d67fec182a64d2e77b71e9276ccd8c57d00bd3c212fe12f8d3cfa37ed44ce6c5178385594190fd5b43b35a3139a6417c922d344a72ee128e5483ddcdf4cec0196c8c51439d2d134dd0e43f1e9dfac4790d678c30fba30195c0bad0320f9fecba1dc2d73f05e41da46c2a215660711b3786e262db75c6e7f75d9b0216ec67728e724c9fb3435d214a5db086414ab4509d48c53eb3a8fecd9b744ffde254cf587fb25331081d3f2a26eb9cf947236b6b929a39a8205bf4ba694cfd49fc0f7ea87427fe16a75c333d206017ffd0b23e7200c366298a5850b6492fce6ccee51e6a541776d5f6c8e0642002482244c0d36fce0c73485965b9c92363eaf0be9e54a409cbe2f65f28efa60e1b58e90b15d569e4bd898ef54bd7fcdf31785d3601ca607a8b6b014945070cd2f16edc8d79ea692a1ecf82c7d1535665e1a0399dd728a58f9f397f1ce8d19c55ccb38432b4ba7688766eac35c1d5df9dbb8c0e5be8157c304e73f83fd7f4607df64f68638dee98e60f8d94a8e204a070076163d8fc3aeb45e142f21cdb196033b6691186ce2ed72c2f55c389fb89a0c40c4ac17bdb3ffdb6a0cdf71abbe8a360532905053d213c421feec03ed50be883136dafae4ccbb76bd33d8ea1410831ea16b8ce46a370ce10277f133138337e9364f2b5d91986234dc2b94019332212bb473ef4b3c7c3967e8e3045c8eba96cde47025b62081a4842b56a93ea5add4fb92ee2fdb273c09a759e2bdd6db814ba4a04c52ab2e22c2e33f377117d7ee2eece12cd73ad6d12e4db9d956387651d6ec1e262a9316e67de09c509423867d8fae13d27dd0b7e5f7c9ad4995f7ebb6b922a2a01614776705faa7348ad84dc6878d9f517c4346e5068988b5c5ab982a72d6c25ccd85dc0f2b900455bdacaa63a72a083c5af90058cb2bf0a09dca28278487118e998d91693f5f2826b51708df5ef1d2f5a26870bbc62f598c66ba08287ea204e8029253efb1a67749f9be05942f83840feb18147877e247ebb911b4c7b1b610eba11a700d3304961203f80d2c894d900d8d9e6829610330512d57ba6fde31c9fbedac926c3407f9215c5bac030cbe8b511251e84901f0a72f0bf2959b54b394ab50bf2767250f14fa7b6f5ea21a54da8d01e91151eb491107fd88b2d4a5aa157c72d89ba896b87e0fe989819442bf0213e4aa7fde8d6b026e7a70ae965193a0e1bc7f8b8af96298c41f60d154164ba678333c903958d4ffb50b50f57ad8eedb6da61a6398ddbbf9c9955bba6bf5991c4c6615df1cde156d8e188003dcbc3a3992b84fb04cb4131582d3f0a9466105f7e2f5bcd8d3adbad05c2aa466466c042fd37b65fe310d06708263b62a6df930adee8a97fa082823cca1ca34a94278bb32b26823a9c049149f4abd22ba5d2ea7b2c16d3ddf14ddfec6f17f97394b52edf6b1f6df4f8508bc064e58acd5ae61b9bb0e4614d4a44f8a33bda36282ebab1ad054a01f5bf9cc7b29ffbeeb08ac43051b278dc39710ed74a778ee1d328db1a0440d0c5a6b98f4b09ee16833d0014308479facc082f5484ca6c5a83db4bc273ce65d9416dadd221ab995ed3da837d241e4e93b7224cbe05095f67a3a85f17c4f2bc8cfeb3650d5182e8fa65f0daa71306796a27ef90f364f19bdcc9a22c8113588d1283e1a7e7e1742213c1e8ce3b052442a9a3d7c39ca96967e27e3179a96ae82093585d3c08db6b91d0702827e10360f075b442ac60da580aa148bd1037d08abc360691ec19464e7b5af91aad4013a2cdf9e09814e801a8cd40b2aeb7d24e26ab2314e37ec22b0529d8e425270140d21f5ab241c3dc2540f8e8416c3722eaa433830abdbcaa9177e373bab05fcb8fd82fc3afa581e34f08d3c07f5f58d0aeec9d7e71866c7a808ef15301251b470a9c455a612c16a586e8a5f1f3efe184a2e6313bd0a657d901319a9f44eb241db807a9474f3f49cbd2c8b8a225859ce5cd7b36e3af8545701a482780086a42f4a1ffa2b30144e3fd3b9052fc9e874f9c3791f69d968bfee7d5bce01dd70a3c74ce6d79c600a5ade2ca28bc27e55fc351e811b7920e2049e53a730d9f3833dc46463a77a7d3c86c2386783e4a8273c0abe9e4c2e99eacef125056f62db44de812114ce17f0217eb6778691f8dfe2d0e5241f05fcbcf97b9171f4de3f0d2c0297f388d027516f8f157a6e1a919e0f474eff81fd56028496c9caf411b0f1af46736c2e421b296d5459b1ac92216b02fbb2a17586ecf312ad3480918e7b314526adfb738855d0a15b0dadc0ad3acf748abaaa482704172a3b5c434bc8f044940f9212073779ffa20fabcf28a04013ba60c18aa8724dd741ad9b738135b294027dea4047c3fa0ef5eebeb6633fd4007b1a61b2e4ed2ccbef808ca1e07924b8170df116b3b258771374a0c40ec058fe0d1415c3abfc235d8a60aa5ed7f7e919581c5105d98717d0613e1ca869c6516506ea482d5c23b414b8aa7efad62652403c45748e37b6aa9385a76ca422d66ffdef09836083f87189e0ea751669a902b539f5f6204cc59348e74d2b77b864e6f13bfe520da1eece15999d172210e47cf0e7ca305c973864590c9bd373a8f6590754353e75347b3c50592eefbe6a6d238bbc2edda38583905c7c1fff28630f58a8ee5a9347ba323eb2963c693bb4a788de2d903895c64ba9bbac55f9267514485e60bb1ae5b18867b4d7321e3aae282f70b29adb93a7d5030f23ba6bce5da9ba8031f31fefa8f229ff92ac792ba56389dbf1ab512dc8c45ecf58d9c1a09b3421b6f87f2cb60f1417db6f08049f38ee2a88514e23e497adff64d210954dac58107b2adbcbe9624293d0b2d13b05e73c83fe67ffbe2892d67778161b51260f6a09452f7577fa31222088149496e02eb328b69c3c9a9a58f24961ab468fba42fe6e9d9cf8ab58fa176069facea2ce8df67b396481438a487607c9f81e9b7ad599d2fcf9c1e0863bb6b5eedbfbe911638b0e0f576a33a8efc6150983201ef845a0b8dbac5dc2226474b39f3e88c4696dc553a0fb640556bd8713b8e2e784b2f1c782c24b489a8e02d5cbe3a901ef270b59ee86b6eb1314402d66508dd1672b8852e3394d0f0459955e71649203a3eaaaad2139108bf772062d8f58ea7a20d267f74cb9381d89f5aa73368a8fea9d24ea23be20aea32cf08e0c114a8f4e6c382f1911ca82f085e2a0b8adde094325563871f7e5d7ed2e00364d7e9df2ca83dd3c2ce4d5b42492b1269329d78499f70f240c70e122a675319d6649dbab7b12221dc7387342263ae19a974cff884b7ca02b57bbbb258b8cf521eae57c2fdc91b7526c8f1bc381e8e47b3989be8af410c9bce83adc46f8efdb724fe407d67b7d0d68814b47aea4273a46fe62ad13106ddc573260bd0d7b1854fd19b80755b45e84ceaa1f7f6a1960739c5a6a43b72cee6898cadfd5ef7e90e230bcf3e3242390cdf34b5e3b9c6e3ef0d9e1f31acda60ceee0160adf739fe4039bbe0a23a855ce3984e99a04abff1d628e09af7aed1863efdba87402204b7c59bca17d5178a76167e21955531f6886293755f21c8bf06debd9f6ae168c1dd42511ebcff51bb4f4c9993f02af7d1703b5543b6d5830ca955369951b650d6386261a117476e7fae2ef28df44823ba700a7634e73b6520374c708e83e762ac90cad5396fd6f83d5d6390f8e7d73d185277ff2f397df863786a7468499d26abad25b4d00ed4775f22947cba12fece53dc29f71bf6c0c43e3458490deb00253b5719074d3a68714cc669bcbdbde65dd3d7c966e2642f501732bdf767b137e6c5554ed5983cba706c11895ae730b772ff0afe556bcbef24573b42875ce26bf1af706e26995cf3fb27ca9d5d22b29895413f71ca9e752bc867178f00d6c8c3cf63701e0338e13b9be5bb4cce558cb14f003ccad063a909c5ad8e4b6abca96807471d08725d15b9d60eaa3fb468072b27a5cab06ca2aeb1a193671ecdf6ce8121c53ed47ef03e96370a601e1742692ea696b1cba843cd4ce7806cb2326b7f37a6449d2a2cd9a5f94341a59000cdfae1523cb9c48b2e4e021cdc63aca00504b21d2c00b08600920b841c403d75f0046db6ffaa431d4c79faca0e15b720aba4190ee43011934d4cf48101fbce8193cdfa57484bef6783955d78804a79b945a89401d6f5f35ba91ddbc2599ceb299e9eafbf7d657170bcec52af99ca9a73bc584d7f6916ffe7fa4be8d08dec3b77fabfb47508c07041e0c402f6c15cc356f6fc690f055ddc3e2a1f453203b367728d7832014f2495e0d56695d560ca9c6bdcdc133a129032681fe1177025b91622401151ecbc598857851a32d4dedaccb956407187f878ab6ec3d989135ac5f190fcd138bcb526f0aed628017ca455fc484d6fab7e20dded57fc4fc0a209a1a0c3a70210fca45576ebb2d72b541802d321a7b2eaa7f087a02bb48ae7a59c13cac32aea0031f0acc1180070d8e5a3abfa4b4e51568bd13d6df3d2d324a47ae417996ed131e501f47a3ca83b2fb5ae1618ce289416b12cc9fcb63e729f280bdc314c5a01ca9f3ff448609180594e9f0cd6b31fc253a167f1f47ce0af82b8b7c2bde4d5c1f4e81276d48ba5877e38df55dc011a2534e4ec7efd4da0d1f2dde660666ac958d747e240c5c5cb97c4f9d7b9d1c00003e2012137c1326622191e007cd1e51d0f9a44171cc416ebfa561bee005df9bba5848070e6e5321ae81f036ddfa95db92e666719d07987eef65a268bf129b3325343ea40511456a46c2c14955194db85fd623950248b1fbad4f9a01856ddf64d5547c6f841f4a5ecf666dae1993a6569c3b74125e2a3e738dc5a13fcf521caf4f2b79c027e2d27dacef8dcb78145064dca8c07fed068e55055a6069f969b380f73bbf5c5d068e4573b08a280cf5ac319580a1444b88323eb8904026903f64786207d57a9ff4de54986bfb5a54c23a6b5b658ef60609ba9efbe9d8ec203d8004141224d16d283319af8449c8cc048b6092ca020b890597d463d9832125dea69291ed55c7413b3d030d7c0df9ff371fbfd010730b61265a9d64e1e76c1dad38d24ffbc0e2b8884cbf56b5a0745ac457e7a7fb7a6c1ad6635893857e337423b711b2bffeaa3fa9f29cffe3b9be5b56c4666ecd80a4028042745456a00dc5dcc1ff7ebc7784530abf2a8d68a23e9d48f5bab9191e59d4ce889f4bb805519f22c9e9e873c4177f4512e673c7028b8d256c62fb60bbe3fe1ba627de3c06b54cb03f6fa4785cca20c39e6f4781531ba76688edca36e1d8eaf21bbc80553c9f6aefa30f272cba12f410a2237d2a0c6578a6ebb989fe18af27dc69bbd6960f86864b8526d523549845b6ce81892396ff7d40f564df38c8ed314510a4456107e11b5e667552dec4b0b2209427fff0ab5021ef466e2e898b0993d691145168be558682c74914c172f2b5e86375462381fe02ec4f33fc42d79acbeb6b6a8eff8b4a747318309f7df7e4bd68ecf7f03ee36f9cc28064ccf7270755fe203552a7f7465189e9ba5766cbfd553c713e82a5280b6c2c8a5f153901d5aea9200340e4aacf9a41ac54d10e57a309dd90a771f8c877dd74bdb1696af08c42570b42ee57ee4cdb34e08e90e7238c47c6dbd1529c5d3b7d25aada3e1f5ba1cda242729f546a5480de26c61b83d7ff9b82b32a89225eacd7c9c25807c8dbac8cf56610e88c875d2797df99d566bda3718ba7319a0d356259dba4a95af9d9032cdad6bc6e42cdfd3c0c7b8853027cee665c388519cf89f29fd5b24cac24ec5c09bd14c38519b68b3aa6ab0028e97e56e67ed7737cebb4b406328bc08fcc7e0dc036b0c4b193d9adbff0be9fab7e3a637e6e14ab27d45e4d198c81935a73169edcb23b4e98339fcb187556c57f43499a9aa4609acf2bdf24665e4433b09b3e85bbca04af9d6b7169e0aed40ff8db2472d7ac5ba0c764cfb06902443006a76e68d9e8bd9625be1710b4f7e6ddcca843729200667ba4f1a8979e12f206e14a1ebed398b660e5add945e1faefcd4f2d3f10762b0179dc54e230722aee26c4e5d7de25449fbe41ad307014225f4d14fc6fe2d096bd39f22115218194892e15fd226d4b96c9fcce5ec535a808c5dba2786e505dde1a2a7ac8a9c148fa637b790276d2b2e9d5bae014fffd3a18b4077c33a2ef5a5b78c9eade28c634d70d9d52985da507c843672b72693d26cc9a4ef6b0b62672b98996a6b40a76d184d80237213f6a96bc838014f9698c1aaef910c672108c2352ad2f42fcd779bbbe53589b2fa489fc212694111c9950723a40fb5fea3a86e8c153e2440b08353fce1ffef3361599b4b09d21b45e7120c9f9127d279b9cbd3f802e5e3e81253fea5e9e73d3b71af03cc567a7732179738e65ee04c208df8594099d0176d1b70057ca4f45b1351d4400ea0693e2182adf3bfb243093b44b7682e8106a918f261ce4abb2e31032b50bbd990a8565a50dba5f43556f21209906888638f8231c0aec3d6d59da85224a9dbf4ce3ea925a8aab64b9023efed020cc117e6748800ace04bea9b4aa64a6669072901331ecab2a18e8d6bb2e91357b2dba3b3bca5ccdf7ecd4cb53c14311917a93ed1909c90984895826d09c6cd310a1ef4716fc0df8110b3c5ca7bdb50643c28fce85c0dc17f2734f13f327063b89df3d1c996c17fb91e641d8210e1ef705fec2beb9f58a391c7d1a38935cd1d13f2c00363388ff5af31481c8702105665085d938561657ff6afd661f218c7426b92ee53e65d14898cd0c78a7e594fcc6ac0e3fb5cab1c9cd667a9f122e5451ce703e686fb0d37827884492e121e859aa70de62d188465445878b41bc2a42ef1b0cf0f674951e02a9ad436d1e9589c09457aceef62f528bda4695da97a5b6c0aed7dd0bd7930f7c71b48f63bab0f7b5f6c8c030ae2054d50e3c20e61f114e6afc796934f32b365a22268f134014b0ae443cded463fbcbc453d0c2e0dd0d6842866a1bfe61de11003d8bd9084931531e2f3c4f46a21225de4d9cd2573beaa2ebcf126bc4ae1c2e13165ce39f20874d89fa3f9814032401874e0905a5c6496ccb490aef143275ec076f02355480871e7647cf5fa8e171dd63f79da378f69a546586dc0c89997be9618a1454d4c3d134679a63fc91d7bc17d8bcd3523d677dc84f0ade4a813d8e94960a1bb87c74c62de26485f54b50435f7a1042886f733456fc47ba2f97b93e7c396180d6d80e06695b38bde051d5a802ac9453cc9bb47e7ed1cfd8324976fc1ea022ec466419f2854679643431f26aa004bb8f752ea5bcae73f5b0e8f30157ea8ec0967d9d031af048c9216758110bc606e86e48a4c16f74676becca30d2c26e49bd47e30f63f038b68a6e0050cbfbd317bd788d9a82175f0094e43c8f85dc28658b592d27b712dd343fb275a88dcb55dbad26da8c8234ccf4032fd67b75058756bd42a27276e34c267b876dcbd0eadcb73a01a5d72c585ca629382e613acf39b1c5ace97c2df20421b0652f373feab63ee6817626faf27c8b99858afd41a98dfb36f068a136bfa3aa60d45077154ba0d7253ed1d87883ab38b6a0928c2415129773a5b68e3bbc99151f4d68080b7dfb1498923f881f9c77221301dbba4ca2561b1e45499fa76953164e48ec668cf2437b931415927a9d4edc3131acf445c1d70a9947a85204566012704f341f14590870b74cfaa3f416c0cb93b8acb68a03f3ca77353951dd045e9e17d8f5ae2c12b8a87795652926894b74acff419d93d95aef3a9692fb8be39d1dc76ea7705eafe2674695eb9e8c756d6bff7e1205fdc27aed45d44bdbab84ba15e188a02206910441c6b6d470905b95160ddd848c125fb2594b86aa5ec658241b08af961fce56acdc5a80d64bccbc51075a661f9c9bf1bf979e16551136ee69a1af5bffe610712a7b847c578cac183fb467d049b3d538f14cc00bd27fa7a7f92e381623f177712bc3d711debfc8efafb1b884a96e6885d5cd43ff8916832561255556c8ee5dc72f29b4e9e2518db33f63befba538c078fbbdbc4a0f5243d7203b69a655294df38331c05cf8fe64f34d5efdbdd38f7782d1827b73cbdf745db4b4f77d3f2ec276e6606bf398f309307817f7439aeee813d5a01415550a9ef9ad4681540d8b55d1b73a2a3628ebc4eb4e133e1581e3bcdc96bb18a721602e5b684499c336bb728484138dad4f5532941dc524bc2eea402d8327fb91b77cacf374539333513ba31fcba108b172abdccb85c26d9fd88f2c97397b3f6d9dbc85426fe8202cd38851f3fc571dfb197c2de2048f5b49352edc9a182946b32aac51d8a976a328342e19b194aa5fe2ca22a08828708030cb65cab6adb6b3db04c89d26bf73aebdf9a964d9332f20f10b5bcf1e503a7efee1a0816d68a8097db2adc1ad10839546aa66cdcb463a13ae337414151a31aa0c3e8bab3ee781b9f3aaa869dc5b1b196abcf2bf185c6f9a92f9082a2cf4fa83d1287382ab98b847d55354e044edae8d82a7d9a330c4344817b2744ba65ef9aee645f4a223fac025ab434fdf7756b27437019824b53c3c8ed506652311e6c38dd40d8ba4389c4df5ee00d5b1d414db6ff0409abe0622ccf1335b473b0ffacca2f2e5a4f369eb961b0602a301fba66dd336eb7dd9b3f689f1bb2796edf1298980fb64dd0a38775d179bcf144a4e89fe4083789e024f45d802e4f1e0c655e18eaa3611906314ade77e07dcc5f55d4e112a5e6e97b2289f5bc74950915ebeb150713b626b989f1de9a0e2a2248da8512b132033e783d04169a140ba35118c27538883eddb053835c832a4b5ac8da031b07d917f09d1e6faa61363a548795ea22c52a7fa4b536093f7b5d68dea7fe57e55dc0a967b36dd1985a04a88581096b02f62003e48eda8a71c8cf0a15aded8857fa0f410a81d133c8cda3df9c051d4eff1293520604e80ed9b2a7b867a14f9e5828ef6743d1f39c22013e6703dc799a0063aaf270df089e5f830efb3c4dcea2d22d88a47a697b148e40fbc620cec457ec2f8e6d8ce7e140eb812b5afc77109bac52017f151210a4f4d002865da2a68dadbf664bc1e41cfe65f6275d0fe8bd91cedf82817d945a523cfa7c2e2122c9452a5b5b12769d60e0b528298cde687e8c201c35301ab703284e069147d314d2874b4b954c15db56edc4605a70cfbffb95895040175443b02e123c6858dd416c59f8d63b800566a62d78e5e1904bb4dbb3f4c5cbbb94ff0b6b71e42ae9a6713dc519457537ae06f7a8ba01e774bb10c6ef46c1ffa640b4bce75145fe83966bedd296e06df87883f16773fa94a5859b6650688d035fc22a6baa9ca80dad15f9258857ef484bcba43d7189190faa131d60de4271006e8029bfbd38557fef8be18df045ba31b80f3283cee6a6810bcb5e5fa1bcb41e5ce47960270f947bd160eccc1146894ec8acf66a8770e91151172509a2bfa084af54e1f7f007ad29dcfce28bf443a3c7020ab59ba31129e8035e3c06e8317b5bf23a2b2c210ae7b297c88b719f2551c5ef913abe2ab0b02da90769ff7bfc8ecaaafd1da6c0ff8c3e8a2aaf271cd2db7015aa4c7a2534c409cc7c759c640621fa6105800ed8cde2f43e8b1554733489effebbb2779b87aea4f3242884aa397c139eba1b0b6e5e32fd3a5486a1aa32a26b322e355e9490b625a6674960557be63cea84b8468c99c38106ebcab5cbb3700b37699dd7183723b56dada2d76eb6a99dcccb1d663966dfa72bbaa93adda139f897d6b28930643f7bd15ef992fbd10b5fccf713147eadcc973027ebd5e9e34659dadb3b1de3ff50a059e2173807b455aa727062f86256d37a9d9c5730f661df5786e2023a3af09f4b8ea2c4729747cea5479ed2b9ed4a3c78fb80b6f30c034c1a2552cd893b1f74a5f604c7e8b572c079d2ea2b00276f4fb8d13bd0c633b1d4c93e9365b2f07517d61b71ea41681d714d9bba347419ae5463a7356d4f7453c08c5a0d925c61d8cf058552f326b9302a4a2b77b6becaf092a006d55539d6d1588d00281b2f9531e55aba0dab3eae933398098a7a85421b529874854f2a6213e4f1b84ccad59469a1fe440cda32522ed45ebd5945728a18dc727bad25ca1f01ace30be165f366664b19abb548a9aae955c5d04ee22da9d07857a3b39dc31584f8897f4fb53414122bd27572bc4cc0adfdf4c9d0175da72a6e6f730080ba4c820f0b9efe823da45489522caa00c39b6016133046aeaa8d0d05e173fc955acde43a92f05694b92113acc157c4dab543ece64c8e1a6dbe626386d62b0fa6489f93c146fcc0b24e9039dd467f2a13cac137b6c56ab31d3e2e13397524a2792fca76ec4e4aa2a6a4fbad64092b4373ab1c2bcda64c7986d5f90566e7e51bd8b5577402d26265366469578933e377c1005caf7518bcd46f29cc215553f6e489824d774dfccd722b36e31f94ec302ec7708aaaf443432ca1e2ae4f4ee2e063543fb46613f212304cc170edcc5b98d04ba4ac06934e68e9e5a9a87798bc2a02039494289ddcb90663ae18a97aa9a5c51644cdaa9a61b4730126c1817c085c285c28f6a733e34a5e36a4e33be6fddf76f0f7f27e51a6ae33bd00015542efff3c29a4e1ca1d2f4e9f8f4cda8b5880cd49a065256aff42de8fe3df70db32989aa830af5e79a2e74d30344e0482185af7a7f0376d56ee60ccf0396d17fc932bb5d33af2749c0b33cd7bed516a066db2e5f9a615d32a642601bf894ffd9eafd2d8250e152b1ca03c58e784fd1200a1b020a58ba65dceaabc046299302aaaccb38c0676bf8bdfa92a75dcbffc0659fa7e2f156793152a084b5d4331b6a70933f658de38989dce6e25adc268f34ef7c1419aaf02830327c5fb95c81b897ba12cc4c5151d4968d137548602458df0c43d24eadd231f2eab2bf3335b1e52ae5cfe455a13ed7af4d14bdf8a021f70f6a7b84ca606940f9e9f805cbf6301b94921f3a09f4170d24ab4f3ef412bbd44678778e456911bfa5bec0d5dc1488d6553d751fe1c056dfa716477ac32e5e9b24c4ec61282e881896e781a1fc2718affd46861865ac8ae9a71c71f3de5996961ace3eafeb3728d63de2defca4a48c02ed5bb6b61e0f3f95953c732cae2ad06fb8f2e2cd270970930b3f2d385df34f69b5cb8b7b636ec17df1e4bfa7db28b8825fe17d4b342bfbb9af5ae10780b9df6ee74478caee51dd0d5da3abd7cdc99b789ff8629cbb0526d47ad4beccc55eb86ce2250347174ecebe3907ec4efe8415bcf9d63744242b8e5dfe3b0b0a945876fe370bbf5266bc332b047fe57ff5eea3b9fdd96fd40805aec0b9dc5a33664d778d6657018f553096be507a2bed3c7fb209fc9070cecf39e4973e5720f9c39446b4f0958e407b2265f29d8524095abded27a689fe96e22edc6bec29f3a024d370ff56559a3841382d625c3f6266a90fa19d6c244dcef95b029943d346d9126162b71805c9b94fb859881cf76b97c00b7bd5ce0df2c97d54d3b9f5c19f0714e4a886a634a165df4976ce405ba3ef3827d85b3c959228d692ec48429370bc94d3cee8914095a0a85201bf66bab00f79fb43a83859806fad9b98ceeac7406c1a95324769d83afc137886e600c2f46aeddc4a4761d862005ae585a83ecb92883ecf6f4d8059e5faa90372acaed2f5743c7168b32980ab7d76f72f7ebf1efbb349d8f24585544b1ef1a951adb18947cdce210b75ffe0b1497a46e2ccfc3fc05ff45857d9d945cecb55d0b053c9444fda2b81bf0a65873806ed6b6bfd76bca4f0a6b40c750cace5927e0ffb295692922bcd0a0fdafad2941848cb178aaf03fe07d9728ca180082406a2bdaea8da02a3352b205a72105159f004ec721f15a45028152a54d9e3d5fe9a9c60575cc3f2e778ee7b4b6a4681fe40aa4608053b1c3fb3e221f1a89894f9b0a3ae61bfb511f3796f613f2e2df2f56cc17e45f79fea014db92fef782ec3a9fb50de7a4c2dbe4bb92678c2280712d3f6b2ebb840a49c6958027aaad316f063ed3ca6fd7c8e7654babc38510292701e512724eb7af981cc6576b8b043d199cbd8cf6e57db67c8a2f0890688283079391e76903c210f58aee85e509c34ff3e467071bb35e33a33baed3599c41361ccb8a129d436cd467f857351d8db40e03c6836dc04042e863601131a38915eb6b921abc96777ca4f74e478d9c7d9d23532b58e56ef4f17cc4e1a14cf897c54afece870dda05bb27ab7407b5e9434735ebf92f98ac373298cea6a34cdf2e1bfadc691a2cf357f1068d53dfd68c457aedd11a50ae0271cfe48a976259e1b6dda40d491b4269d3e5e8a5d116180eedfdf30f74034ef80a8e07ff9d25998597d4ef9a58d276c2e36176f9d7f6a2f6a29aeeadf190a0176a38aa359e33375339c8848a7c86f188ee2b58944ec59dcccb1786b1783ecde6fa95743583d559d305810ae59f81da425c0c357b1ccc3019d23d6425f057fdee206c0e063553288e61c62ab3a8095a7994ccb5b82b5384631ed43010432157b545861fb09bf5cb0bb6608cfd7f6799b40033815161a2c03517a4917b58e504c5d2ac503c9c036ad26d18d7cb0ce3be7b07094151a8000d142574306d17ea2ca62da449b122c42f6cecb4b32337c4f25611159cbde7b7938ab00eb5ee687af5dec036b117148140609dfcca0fe8545cce86203b9f060d791e2038c70633db8af7f22c31775982c536e7bac19607d9256acff2c6feec4be859ddbb0ebe605611792a4d70d8db0fe77731b443c07c9c74b35253e4e383b807c14f5f341dd733b3ead26017428170cdaae5b3f6962fe57230780b3d55b29effe0dfebde2c81ba97d4512ecdbd33eca1576a7f821f08fc4669a9e17a5c6143f73ef329b6f24433e6be0f7f3b52d9cc880628e09064f0281ae64e9f430078f01861f5df647709e5c731741a08085c59ac40879ec86bcdb21330cd0b3f4ae0ed8ad34bd690c3b91963b4e8c9dde8a2d8358cef80d13e89e25bce90ee17417f82741c5fd6e1df3a17e1cfd35262f894944b73c85054e50a001a48fd0f73ee3ef7fec297a7ffd276276a0a9d7e3e421ad4147c7ad4f8663a5477277e38f9570593524f5d1093a4539126eeae151ace1ddfbb2f6dd566cbff269bf17a2f5486bda0954b18da455dbb9c3c026edf9da283fe6614091a451c43bdae3159bd2a834c64f23c2fcdbc069591d5ce46a470c836793eb4b76d3e5fed62d76c82aa24549c288fac0cb1a1a7c9b818db9c2b3a481c986a96dd94f99ee55d3e2c5fbee90394339422164e9b463e592eb0d93da4281fa31242e5581de013f60cf857c122981bcf2a27b56c53eddebc3ed666a2567226e160413581522e5f756959d27a76191b42794251d270a3902971d3a922f72e189b7a1a37d7428fb1217cd638b28e907bd5a8fb52499b713ce7ef310c842f62df1988555122930bf1436ef7f231110423d0dfda21997c5dca3fdf77f692a81862a3b37bed29edaa0723664466bfa87efa7b4868248aba722379692ecf1207578981221372b5f975db098d46fd24fb05ea1d082cc4e3feb52dddb7ddfecdf7283cfaffa5488e5e73553d0b841f27b1a1db004aae696eef30d1b2ee0ced8b1e9163576fb9d77cc5ac5e0607863592725ab36a34777cf136eaf84239440314249de6e19cd88647d629dcaea9d5a52be8395ba4ee0e63357aeb88d3be0ba82fb251adddae89bfb638f1b97b1bf8d9bbb945bbf6a1fb8802643c6baea5ec44a670b7a196cd55ea92940cdbb6827737098d87bba775c751209ce4871b176c3f3f05d6a8531fc36da391832ca609db29df0d05440191f92856c9ebc6613c1502c31ab6ab5bcf5bb1b1d85d9295d5ab1603e0c93c4a1e19746d935a0eca3b6ef3f9566093f703a51e8410a2f7c9116f663eafdb8dcb43b09d2ea438499c3cff7bab62db466fe42a1de3e25b428be3b0805822411dcc29450b5ea18d5e206951039fe52fae0b99711498f68f5b2373f4ce19e005d695f76025c83561359ee8ebf19e8865b2134a026c69f3462ad9eac6b749922f9e6dd689553306bdb65ee155ae70f38439ce21668e1f828896f570aba3afdfc55f9eee490366bca8c9a77d18a3ddcd942d854324e0824a5e89be2c2dfa1470d1006e6627952a002b56c3e3bb37adbe9e7580dbc4cc59f4cfeb7d47d32540ec5a692667ac74477a4d45f83dc6d1a770a8f9070fcfb96e27e4a27be9258afbfc69820d185e0885d1167e8fb0c2db9588bda16207cc0f878ca497fd38ac920d4805336da2c8b9acad8ee9cf6636bc3db1e255d8ec43356dca17b24e5fefa53d7736648c2c6ff083b8be6f0287aadc679121fdb2e6bc95e88a45dcb584772c543204fdb4dfdd13d397adf66e3aa6a3ddd08181391cc096bf7437fb79d0ca8d1b2078e62be3998c64f563675da8b37966170bc9b2b7d6a0bc2ff4f8e36a723257ea9907395f2bc1fe78e9ab15f958c6c90ec5bd68de871ba56484bc3b7af781d3377048287b1c1c69c846a8df541ef2cf5cb946a2ba5a6f43baf02ec92adfe456b003923e61f2036c8e824802e18c6540a9ef4aa773d7055eda3f35d4a0b4c2a7fd5ccbc53638e0d172a672c8ca2a87e49f6db2c0308643be6b79bba604fd838fc583dd0325731a5e1bb90e773480c182e43d673519f0922a16a7a7857f438ed6b07eae41532d19dc32c30358491779e42067504e589c5b6b83cfe1ba390d4d44685728c6ebed45125ecd3bb3317618d0fcf154531212044959fc508c59e327a0921632dc133c06ca48dd9dd01425070f1fe55d8b72dbf78c4133de45074d84b4d9c1b3c9f3a1c4ca98fe11f619adad69334a523f9d7e9afce27e722c6dd4cc46e26295d6b5a4e7dbf5357f6e689571a5dd291ab7be835761e5e4f488b0ff681f5800bf4b7ecdd7c5078ccf812a65bd8dc7899f3bfb739582f16e4da2fb57be07e1a4197079a5fc50770ae97487a6f8e79972c8137cd5bb28af2263c2746337c625558b8ccbb3bf44edb7b692a6df897cfaed7d866a31331bc60a1f2f43ab3b23ce1bfde99f7f8668109c1c22b098da149300a6dded106423df2e693391b7 +0x8748824393f51c3259221007ffa84d3304f2fef336716733a249106f78b164217fd0dd5202fd2ce0400d456ec121a3b4 +102400 +0x239daa03ac02c03bd74ace9a592656eedb68703f510cbbfa8775994ffcfa9cd7f4a13b7ac92aca908250a946a64bbb435399198c8afe08a5cdca29faec5af07d1ce1578f4969d424ad148822a2a8b90bb44a82dcfb8ac935a8a072b9ddf5d2b8c2e6670cd5c4c640811fd4f8f344398c290412f74bb7e6f03f81dc5678d42bd10e36d1b71445882c26f8f68e41272410d74e31a4238e481fbbf4cf9764fee110295bff58aff30230c32754ac355a60dde9b047ad2b15d5094382b346497bdebd3bdd57b94dd61d948035581c76e4d73b85b2bcd80a5676f800b1f029d15408206b4243a197f7bf9f86a969a5adcd6f74d4ddf9ee69591432190cee09a2904981e2142ad7345dd19afd0bee0e821e12cffdb864b6ef249500b71816ad64378827c8da7424cd103ccd0de451209cdea79328cc66fa45c1e3aa025fcedfc052ad5b441d88500a19e680dcbaf9a3a41516097f9f68801238e47821687f655de89f657e64d023927fb9fb95184e5f41cb477927bbd011ff8f82b23dbb9208e501488d9f37b3650e4a9c855e83b81b1c09212a4ba80775b4d0a39f7de16d90fda58f1bcf1e99dd258376685f859fa1ddd68e6611ec7674d80331880a617ac54fdd5c5635a2ea54803131eac2a56bb72b3b7673a11184d6132e13b50bc3206f83b09787fa4a0f92c75cb454ac6c8426ae3fbf9a249f98620f5b316ea990c655412729f6459f6e5fa10ce7ee476053b50fea5223c21c1ce1719173fb0c4fd6403049f8eb3f287083b64ab2ffbb0b3e2ef6441756a212771ce4d9c1a35b88b7f8f81eedae106d7dc5af1dfdd130f5ae570a56f67bed0811d80e3a03b0bfc3d14542aef086dff6feee348eb0aacda40cfaf427d8d9ca8752e097bc21685f898cefb602eabdd44c59c6eca4b3d3baa2bedd5cbfa3b96216a2fb28670314646150bdfb21c19919f6f8158067ee9420772ec9e8274163dd3d69f0694492fbf5d48578ba135f63d37c41a397df4a3427a9c2854366981f62840f88015ab4673b6993e89ae1aa622d679e38da15adfdf6c2e4db138492351974fc8b99b1529e5da8e2d544928ce04d3d769bf1100135b64afb91018a16ec2b9498c1d85255e98419da075f2eec235b89319583d82c258ec76f70b47f0b8ec06c4cf16744a390d845e44594beb17480d036ee38761815a7c3a740d56b5b61ff857ee5ed8f26db80b366598b48c51be39cef6ebaf1ab4c28c50dc90b57edae11669863133cc412a5ebca09ebd70f60ae74c3dcae51cf143a5608d2ff4aa9bc1e9700348152677c6e76761e5c70778b06e11a02bf9f6bb305fd0025584c77d54da12020ded9f66204dbd460881de5e3156a5da693e26672b0425d88bf653f3fc60b5eeed2da590c8ea24a9614e541b10397f291d222aa9964ad88c4dc9ee943b25d2468075b78c23554428aabd1733df8f0428b25671e7048c7e7a156fe5d293920d95422673bcc21782302f3e764cf1bfeb55c34baaa3f8517e3e6d68d843982dbe47bce038a71799655c79431faaf9448b4cba622364d4225e55d035444bbb616afa5b1394dfb663640a137b71e258c56a5a123a8aae3a87a53cc865a86f6fc5aa19973106cb00fe14c578480b9782bb1f1a65553ee49df9d96fc06a833337d2d2221bd91cfd99d1ee1b32294b1f198e001a2e12bebc70e1617b52c4431ba601a9a0337c25ebd3776677bbafbf0d8fc6b3c5d723887a55d6e3dbea0386ad3cea6710888ad02a606704678f3bd5c757edb099eae83ab2af52c6fe1098cc4c6ef5b10f8585aa1da3194e67276e3df0f47b7d22f3d13409ffed817e40f4629daeac0dd9b51cf24a2e16aaf31ea7560ef7e87fed6c8f02c4c9ffb9c905b708058e85d41b9191674463e7b0a7cf879c65e4cd4f55cf7235979011c66ad9511b18810bba5195837770e6f4e5d1c48f9fba2d9241e8971b3ad6e4cc3dd036532a3b28b616f84b73817429d6b11da81fce6034c02e324dfa81272a778695971da401e80d709c2dd233b29ef5b8f7c4b8b6fcbcdf3abf7e80b6fcf3ac4727964116f1418a6d99b74ffcb0c8ea53eca50ad7e408681dfc835e3abcb2e2e6029e4df18db7b5549d721d5ae33a1d1858e356afbac9c33e5606d38b0afab3f9b32994d23bcd06cbf3d8eaccee65168ce8ea5cace553a912687391265c3d87d8b5c2d6279ff3f74a596638c126dc6f1809346d6e08486240a04417ab24ede72986e452700ecf2f462aa477e620f27f40265c0951780a873faa12c777f9ae5a62b328ca2a1ca0e745e41e388a6169cf9beccbc105c93c9075c24a312b4ed14a0aa6ea7dd45e3be7c0123dfb5c6c84f891b90e24d9803116699564d523a9093e87feb41e0d27d2895b317e20aab6e652b8178d956b119a71a1affd33ff7cb8b06107100b132e17446dce794913b4f0968584e4a33911db4ab46e7dce1d4e52482c7c88c5a4b57cb18e4599f515fb561c709d8dcea1e575f9f84d51141b92885e50bb78ee3072655923336a85200e695d0fadf3885420ed1803e9319668fdad7b74307ae524c98393c31455a9d042bce0b942a050be38c31d5dbe79e583c44417ed98093b104f3a09e47505a3955cc34013f83ec85eb17a827c39a4520aaaeecc434eae6071680b141db1d532ed911ee3964b095fa41f85efd5d74b8c5bf5fff10bc0d4e5d6a8795ac5776eb857a42253b697aa772cd777adf133c9f4f65a1a3ebd9b174bae85073672121ca451ea60090b8a9cbf677db25554cbca1c783ba00dcf39dff26782274fba3e69976af86a8bfb705a88c276e86e871ba673401f33d6b729a98aa0247c0ef438f0020142a4450d055e73fc576c61fe8ff999ec6948320be70e74c6e057ecb6be2a64c35dafdcc6a632f14393c0c831a53de0dbce5f9843fe79316a4a5d61882a93402fadefbbaecf529156b08819b6f7dde8aca2ec81e5ec645108c6ef15cf0aa51484b7d65a2c0d47c4944224cef5047421cd8b6177681d7a4410faaf7221caea6281001630c4dc8d1b8aad197072377b2cccfc60f1512e059b1139f10ef707cdba931b01f81fb99d06b865e876c51d6d5a195a6d88277aa0b688197624d53de97d396d3be88320e2069c11146a5432c54a3139e99451afd636f42d818c32d9a82af28b16baa5af06aba4132fc3a6041d6da31f67ae761a109cd3caa58da67794544cd944c6edb075567f009d0b30fdc044fd8f5a4efb65da48a59574a186743889b6ec2895c1e1b8a77b5deeb99bac78609eee43fe580fadcaf8026180896c0f2baf4844bfc89f4b0f277f87574c8c803105c0b725226415b42995ee72f5cb72cab4522bad7855970e120a095caa1a8246d0bb266bd12f7c64e8b48e21722f2de764be4fd747b14724b971e7325ad2e9027e22143aeabe7c8d8402c2e474e37af21ec123d5bd1eb5d38c4ba380c5324ef46c89f30ad59d807ea9f52f6474a4f47b612f3a115f1a7dab08fbc0c08fe50ebd3a776554384912b8b900160a07c024f3ca4d05229411090bce06b16a0137c2ad466ecdbf794dbddc4fb8294d94e176fbc8af1771f2bed28639f107f5cfb6e5454ed4aea52f17ec59cc81ebb7a27584e3dac9e3980150849aeb4f36ec41eef125824d8a9db04428a1be01afd0b6e8b95c7f21fc0d369279ca3075c0c61e4c60ceaf3dd411a33efd44929c181158d79eb6244bb33a08e13c84d819381bab6bde91142a3da97e74c4d2f8c5a7020ebeaf9178abcba70ec9476b108dff457fa9a51d6f9709adb89229bd4f12cf1b2f0a667edac687fc9eb714ed9858a8dc11a26ee3f008dac6d7f39664041802d550474dced9208a736f374f7cce1da767f7c2965573f4236d53359577c629e4c908f1d001e24e35d3c6c631a920218d4198a6b61239ed6619c0b4a158f3ece75ebf96a7c884b43c765be075e34d28bd218aab388ad0693544971d34981bc58d0efaa20f833ed6e0d3851286cb9387d950346ca82fc5dbf3864ccbe9b5bc38386230b0a1b28f3ad583d8e8eeb291b344862c579f8188da3347584d1b2243d99bf1082ef8e6e4648d0fddb00848c65f911be8f86920a7c87710501d537e411e0a23c7896f90dcc879cffa147dfebfd14189d0cb9f7d914b2169baa91d1a327a1583156c8020e6fb2e5cb492ba34dcbcd868aa4dcd08d3b6e4cc0e9cf296a67230877824d54781610d2ea397479bbb76c830abfb5c42fdb013bfb2555e740b9b0db9466ed9553a9ea8ce3dbea083ca93836a7c50e7cc5dbb40ad4c7ecb22e058ef91268706ea70f883a3e9655f9d8897ac8e81ead9f5a23cfe2d3355c323b33068979f29d867d32320584d17cf3973f7b6155325ad6f39b9aea81d86d106f2b60b44f6b3d86dcf930153cf6289f82b380277769dfc99a2b5d4b6518e7f4d2d5e4a11e3b1815cd4cc991ee6c21a4a0ced445d52c031f56bb5f2c085e91856d19da796dc9f6dc571347a1239b2facfa76bee1f8e18d813033e9b6f010346c47e08963c57f9f828236f06f61eb1a5c9694852466f246962e7b4310a798985168103a88adc4dab0569e0d2033c4a95e7e117235a9c5f6075b7bb564b55c85dad993350fad00710edc31e5df1e8ea65abad3cd3c49c4657bbc1c87d7a0c6c3b2a14fc2214d9c2a431bd8c2d2acb1d7f750c4de63cc555a9b5b440093f23c197fc82e29e616fecef81b7cea21649504de4acbecd0bce29e0f3fdc69c0322851ea5717b1858f8f25d4e503a6f5cea2f7b7afcf41aba0d2fa7e70cd0a85e9f1319a55f1a32741b7f68080573e767341772988ba231d018d3390f7fd2b0b9eff8238caa647f3b2df0ba3f45efacbdad84bdcdc73db4e667b14eedb56147ad9ba0b6bbf1de5126c6d2ae64a02221d8cd13c79b3e2b0655704644024bf0df9238a96dc3a3ec5abf7cb1cf18929fd930f9212a816efec8a5c90ea2dda1f5db002d7e93246f12fe7d95fa86bb9bdd456ed8595100b82d5e7fe876f5e06604dc80009ce16e81e6aee9c9398fde3a5ef8dad108c5a9d83b5a1c451bb7bb0692569a5880a302aadbfe7c7ceb34e0ec99661d89dc12dd1dad2e33756962bde222dba78bc6827138676fae377c007421111faf593fa32b16f75d3ddfec8169a73ace4010eafa4ab92d75177f888cf8765a77f8c5a0011442ae59941b218e5eb44ec0ec8e4a64efbb729110bb8d34fe6ada218265a9b7192f46c5ee8d85040da7d336156a717ce0adeb665281f682e66d148ef4afa92faa4b3504a5cda36ce6d06ca0532c0c8cbe1f0c4735595111510b9e22980a5af558151da84241e9338aec7f921e49581ee86d39c631a8294acea4eb7f150c0b82a31b45235c80e2e25a5a907def5900cdf0371865eff4eba9aff76116d43b47620bdc60084d010d13e59923e63ec18304560b0c98c8d614b88541a36c5e0e9b1e02c6d2b9ac58e422bd26be4d95194b4c8a37aaf144b240f1df3236f22afc7311286931d9e2fef4a93181d4267ad6e6111d6b67e1ec1fdce02e37704ac39b7bd5dd41f1cb9949bb11f348fa036860dffc8004c7fd478554fde2c003d8a051f1f691df971137efa3f762da8466d67d956952a23fa5cf7955b5ad7a462e59c681ddf690964d37474bc400b527b35d53a2d1e5b2537dec623ba1eea4dbae484fb8067c0373c22ff71ef27d67488b65a984d0e9b397d836e6934d170e28eb0473e0fa82b6b4327a659a1d197f5b5177d5b7f0bf247167276cd901b6e4b26706c9b944bb18dbf0bf1949ae656bf4a81c7eb89bd693848d466b998a6ee70ca4d7c79d5f75b85f9f5688aa20f19b98f1bbeb133ce07f25cd1c7941217f739c26ffe409c55303b390e94a381f4eacbcc0eec1347e3d55e9a9020c6c719928e55fd7a57af0d3897c77dfc48fe3cd0dd4881d97a8ba7d964493af9b77f52c657cd1f7928d6c67b82ea6b28dfe38fd4d74c9d0b4fc9bf1dedb2f6dacf026a9b7c70ff821adb2802e2eb00a1d2f697fca120890cf8c7d6a9df1eed4c76170a19e587c21d9585ddd4a11263ee8700f952240c6e64df4e928324d347d61488da497a5993d2019b8af9a5a7bd9768c860de465874996a259bb5a21a2b01111b81322430982ac7e6da7ad8f23525db1872a7f04bc23503169a47433ac154d599a8dcc952f9ac4d2e725e203bf41f4ab6d7b50b2e81c011e7373fed7d3257c8c9f6505208dfe1fc3afdad67c9220d1c6b38107d49d8c0fc6119a78a29a69252751495a89a724f3cd4216f94e5e677b9ff3dc130e4f0bf2b4ce9860187448edc63a9b3b150d98076c286ad8fd768e6893a8dcf0a47f14408704ee53adf35d2cc5c5eb357723dfc10cdd56f40e7d1e2f4e4d142f5ba02d8fa94f1cb1d79a1e68c28db9c8147c54974bdb6bb8f5d49f162c4b022d8844b0269827940929caf53828fc77617189af1085ad09b6480f79d3ba3d3789aeef54abd008f4d819187a01859ca4a002de37c366ccc16a799046de749e14b254028385fd7dbf8d2a15255b54d8d1f26cec97065ba513440f097e9ce7e83a460c20b55b5cf044b6d1138fbc035b8fd70437457fc0d08fe17cdd99a580a618a33bbc72828afb34e3a2c6019a3d7f3ecc6d30bb8652d997b1478f207eeb422058675833921418f082239f337c5fbe4f510c8b61c07e2abb4203809b9f6456f1d41366811064b41810b7f18dd8e6b361f36689f0a4af4e6af21574636da86efdb4d479e37409670c1df47f89466ee8f7321fceb0a962af476011bd208003c4b4690f04c3338eac5d184d9bae3b54b98f7b7cbc5a4534d7a11a6cdd5b6d2322a67f3789b8e550ee8b8e47d8853e34bf8b5e11f5361e9252386fab476c9b62f35445e29b2cffecc807ee57b876b58b657b5883ebdc8c17a94dfe31adec816fa14e7ba49ba7e9dea352c711ae1b37d545ffe92712c62411478244b45353b595c6e58ed21da249931b1c86fa4beb3b8ecb697e900c8b5d2bb755b197ea2abe71deb9de1f93b485a69995dc65f45f47248048b7333b84bdd36338e350d4d9f280534c07c190472485a98f060949ffd142ef2df1a5225acc84e5bc4863a5f9f84dbf1c9a8c85e2acbcb548b248af3560467279dc4a4365efccb9506f64d00336369c9be4c4f71f94b867535fa8b6a88acbb4ccd5b7214ebe275885b6c8d57e42d7565a950f664663051a4f7cadd2c1a73f10975c604e6dbe113ddcbd1448d394ac86d919b055ffae2f589d87cc96094c0d3059feda2d5b4606f3c5e0bb8c9bb222a887f17c48c3bc93acbe0f9972f7ffd27e952b8940900c94f4b1d033134f01d635e7aab7b11b34de71217278fc06191b65c970f21a946837cb50fa1f9f662a43a988a3f7116ead7c60886eff93cc5e4480775da93dd0ff6be203cce5736991d78deb7bcefc467cd9d5334391cca305ea592f40130cfe28adc35ad70921c1cf2e5d70a083d42b299359b29ee41932c6794a41c6c41a447a7a09b6970f3d27389492c8a0ca3b953a156896ef4b0be4067dee5f6040d87c6b5d0fa78b7c27d264c6c8540b06951d24fc7c40a35b174f5c64bff89afde9ee81c35fce32c4748bda1168832ddd631b80a52f505988cddd1eca397dd56fa1134449747b1b6c959c1f20ee06a7933828d39bdc4680488205e41ae58fbe2aa093396be83ea3f92d8baa61d33f06dc86bd746d1d83a63ee66242e34e7ea3936ae6b78715997aee8ee2e250b2acaa2dd15209856da839c06d6aa19fcefb245e62766537a70bfeb14c3a7d7a06c02ffbaa8ef9714714b971899786bcf165cec029dac909f726add5d7eac24a3a2a06ba74bcdabd3469b3c6cd6168d7504ef18d137c395a904a06e0d47c674de73aad0eb26413c5a017a734ab60de5b66273b09c1e35cc5fd06a856b487b2f17882a15cf62d3b27249f124f961e3dd5ad8f19cab798a9b8b7ecf0abea656bd178827229b270b75e3c60737c2fe23dc280d6fc44671486cf3b6d8e64f8cdc86a61caadf979c72ed7521c494edb55249e9aaf810b52ef9a6601f8cff662097f38becba340aea8f83ef023023c2b0fa8e655691683fd724b19b61f33e4a8a0e6a909f5f093e38ea9d1b1054cd8814a21264ba44b42e9452f56925158b45f3c9547bdda14679af0ca5bff43778890cd33dae7e18dcc88f0ada9513fbcf9d83511a155089d304777c01a456e10d0bbd14770a4916c856edd4c8e5d2acf09b612d22269e1e9827b7c21b92dc5b755752ed2842c344601fd93827230b30d887b6e5d6766f697d299867595131ac96b5f1e6b81c95ac8d6d79bf5f1565906da9a9029dcc6c706b5441f225a8fbdc5a6cc388906167563586f5f0d88489d39948630bdef23c3d48eedaebe660e3f4a8c6ef5a16d9e04841b37654fa371e0143ae0b8803ae88d8fe408ddb034190fb67099de5b34ba98c9a3c24712ef8cd235321ca0173c9f84773928049e613abf9817ef7afcf806a2a266926d2da8d3e3fb0eac8ff960b3394912cdbbdf69edbf7dd6d2242d341ca28cf82a5fc68bf186044512c09d43be2c73e55c7bf9baac9fb631e4926255471907ccec8793e56038bf69d1fa89523ace664566cd83dfe1c10fbd892e12f81086a1596b8cfc61aa9caae18c86341893afbea77f18f44637d3b8de525fd589237bc81229c8966d3af24540850c24036330db8007e6d19a19486018b2b02074da590aaba9d2c8848c0a2d1b6de4dfaf24025b6393df9228008f83f13cc76a67cfbed77a6e3429342824a0b6a9b8dd884094acc6a54bbc8c8829930c52fe39ce5e0dcd02d9553ef899d26eb6cae0940b63584e2daeb3b7340a972bae87dd05151fd639d99dbe503e5ba3e590340499b4e6ddbe0d22b028cb1268ac6c6ddc62d87fa8dc630de82391e81983e7879d652155858ae9a3b9779e3a0ea3da5784c98517e5f343bc6b1f8fb993e80138037cbd39f02347a4482a49ec09805ce76eafa7531e3cd01bbfba945ab38091c7ef47050e9e25bba6e4c73aa2e9e0889fe28bbbcbc207acce4e6b2c45e8cbfdb9a96a853dffe09a1e07c50ce91042c1d388f43eec71e24e269fc7c405b448c98fda4daa629602778c39aa2d391d05bd44da6fad3f9e6b18c73c56f814968579acea6700f6e109e873e2ed182d70c7cf465f54932fb7f0b122ac8f34ed1fe082a3625d157561454167ac145a10bbf77c6a70596d574f118bcb58d71719b1086905da865468b76336d9fda65f8d5f234923c5d4a820d45c2d23c9c4fb04ea5bb146ab794a3b23e22d4d4029b51dbac9aa04c86ce026e82ef9be97ef7d492c68efe86dac6387672089241c04f72c8f59337fe06891d3eb08960e2bacfa5117ae795d89a63cb7c1ccff00f9ce72442d507a07a67e29a26d877694fd841ea70c9ae22897ed3256f435e36661ecc2ff155dc24e9304343cd00a1fe5960b46d5abbcbedc00f7e0ef5f09dac6dcf665b7f7cfb0973ea13dedc33ef6728db90f47559273ea6d3cd4db62a74994d361d7091534c973f1cb934fa7649ebe3d13c4869aaa85d635426ac5cf9cb472ddc5a35d2e0b718764e9f0dd0d397d4b2c82231dfb637911e1af2f18c658afc36478373e72d25d23f092c310551c168be4aa9767f86bd24ffab9ae5f0779901900102f27b427c0ec3d3c86742f8aff02fde39e1f021205c2f9184503036e09e62923d7a3425a6142937db782fd14ab32d0d3a38db8f4a82d6541afaf4ab481ad4809ed3bae0892c9abacd2d73e378fbdf5d1444e7d921dd1b7ac3aae3dcb7bf10558bc4b67b0f9e3ee6074cb737220e6d5830cdbd068fb7278de62aa5d316d33b986e17d0fc1fb13c42ef9da2d331350086f49b041e7b562215ed40e3984e9f80d2ae92af6da0afbd56eeeaddc18bb8c06ec975652acc0333983fb54531456b058ab3fefcd57cdee8ab6df90f091adfd498182488316c0682a0445072a8e57ff248e5225e3d9a87e6c8d293e1b1c4f2648c4771143b42a738b464db130515227095acc87eace2f1de358680fbc373389ad3c021b251362e7d5d071ccf4ebc9da7f770b6032a3c66f97bf28804460efa9cf4e9ff097930e2782195dd4f8dc438bef899b596c0902c5f217d73a5437d8092772cd2c2bd180d528b76e43ac9143bdd208f8ddf74c68c37af8e0885c1a812a5e5f0618425d6f5322012f9390b94ee2ef6ba068550c6cea9ae8f104dc877f8fcc49c75f8b853e2416ad2e6f45a2c99d60283e8315c783adfa5e754a461d279c19f9ad6c57e751ea7f01c7212bec48300cc50fa8a9fc518fe1cfe993392a1df19fb514c947f25f08b3a59643c3f44f5d2dd8a05392193af319b3caaa165cc702e62299f0dc44c9f15d1f28519e6943774bc9ad1e5eacc489eab094e97e23b75285b8a96d754d0746f3c4d9d52ba9d910ff1e6263703562b6dd3cd4cbd10d6352f6fdcfb9b379bb7be03d4748ec3454bcb05d8ccd7731ba0c79cf06dbaf786fa69248794007693b02dafeed1760a75accf7fd78a6c4201efd48dda79379f310a0105f32aaf18a2a6e1c7027db19616fd44e74a2a9e78f25fbb2ef338db11c0ae1d9789844f25afe305d37a41e8700e8751c69b72171ed539a507a4714f541c2ee664af6c89a6a1adbf5bbde3c39e478f1fa2312b7c3c91c6b9a153ee3a702bd283f3cea805a2624d37e8332be92aa760d606741d78d8104b20836a75456ed7e21ccc4f016a21d90b970144e3031b18419d77cc0fb1fc391301354fcf185507a5db78983f612bee2e042f58d1b87a81799c7fa1cacfaff46585406cc45a2da364e67e132a91c98900a8f9d7bfb14ec951fca55b177bfa2988d32b271bb3fe926765662789a30292c7abe72973969fda11e57162bc5de3c0c5157eea9ecdd1bef681b93b263edff1cc3581b6b50e769b017e6c1f811c75a26470c21c134dad0e5961fdb9c70b668f576c50e74fc1daf468f01df83060b5b5ad0e7e2443de9b6ad72fbd0835b1a152af7bdb220758d3cd90620d568fd3ade2e7173a6cf626a2baba107e9038d998231e88aad0a77b690ebffdc2a2681b64125cb37e5bf3cdcae6482ecab9972b52ebeabc465af5d1a5a03ee9c64281e0e22b5208d359047c1bd7cab128eb1c4ed7905c3e3626ba038e69554da1a0a2cb30161241c0ceefdb9e7387c1218e8deb2ffcbc37029ebdb82c524b51d922958355bce484ce227d915aa3c9843c0ab3a9631552ce3329c89988436a1ff83221b159040ff983be76475750d62501c7563179c5652c502ea14ea925f8dc86370dfd45d5ddca6a08a2a49e60f8caf82e3e2a7cf23f78e117117e98de3eb30999220e2019941c0869c95136bd749caaa5323d718626db6f4be0d15b5884ca0bbf288df2b77d1ae74ab2f5274d95c29e95fc126268637d8132d6f1fc7912491313e721c397e0e98e1126397afaa2645c67625056803e859f34bb83822b2f59aafc26739ca105b48528edc536aae2ac6d812da056b6fe1b51b95632f655242256e2af2b84bd33a155f5cf4063479ec0584d25a969f2ed69202970a35fdf3acba22d48f084d3b4d885e294520ab81fc8a5311114971c519493ecd181c5b0b67c1346ba6aa3cbce829d5503a432e5aaeddd97ba88e81c73c7336a417231b2e35f3393cc42e98dcac725b8e5dee3b68a5687e6e9ae65da9b28860c881ea9cc0899897d48205e01f0cea67202a82513052d2b86642e153f11df16386d2f38e66c559d6df4ab0b1087c0a8eb22a801e4659751dff3af01311c156b57ba4ae3e958b9f8c99a8cf7a0d9c4b18b0d897e11f0be825960d92f9905f20bd23519b4bb14ed21fa006b2a9a2c034bba8af1a582efca455c7255a960159d800fa744b245e81aa069efeeade7c9a5fde063897d20a9e32350f0cb776c913f5278d773e56f1c68fe7d2ec0876df8d14f655ef80ed1682fa39da3e29fa7c4ff07748f4d5622f7fec29d8787c01600afcab144e6607e72d94dab53432bf8f506296a957a0c44c2057433c0ec61c92b68f52cdcfd7c101107a9e2c79622466b7b40c4b2a30fbec6a49da6a296716ebf24593ff0e2696d8ae240abc9828d7b6f87d2e9ae7068794804c45ef52ef8ec050a7c5046402f7f2891996c1faf737e4952694151881e5c934c71c3815bff2d4543e8c9a8bdd72c323c3c8e92c6dc3741038c346394394eeea52c3d0dc68c18c7f62510dc01675eef0db27aea6fd18e9fc3c42aab3bc239a0377e346316aa95d24cb98faab5eafca82a8297ef51586baab9978bf226c004f229ee1049f45e8caf6d2eacdc8165eea6bb344c69157cb6ab0e8fbf00fc3b972ca405398808b2e5a7800cd1380ce21c2ee951031f624257eae9342e9d663cda96cf4917e8f9ad8800aed96588ff686e8bdb6023dae1b436af730d41910cc9b577d344123070575e021e1fd0920100cc03bbe914623ad93c42d3a25ea395ed1019d77e932a14b94df7f965791fbbb11ee0ae743d7f14b94fea327bef9daaadd3c2047e009c8eda3e256634caf6d5834c68de8a08f9175d58f1b8215a45f213e6bb82ccc34f85c31ad58e132ae1f67e3ee473b2dc97eccc409d8c1b09641626314c78f0420ba27ac750988a01a6c6abdc9b957521223b0eed37d7f162c1bdee9cbc0e72e7978d092fdbad21b80eef110fd76a5a4063ab2c4906c02ccf26907410556edb19bded7738c1f561b5e116b8bdde1de99f1fe52d3b547053b65936bf735dbdb33f436acdcc4897d161e7e6a9cffad4aaa7219119aa670fee812358d7af1d2680c3f2ad12d2babcfa24e704eb2e70b726c03056f98089c485974c9ec5aaddcfcc0c925e4e325d8b6267ab1b86c08bf0e45313dcd4a4ffb7a1609caf904ee5e01e82eb258ad47a2d9390f9d1836f92a46cc693ccb2fe1411c944db3440817c82ff8dc4a8cda058c915099acee922ccfe478378ce9b760ffa86abd0d4de2debdcf695e7921f7e41886e3856bbc0c18223fcf08a8998f437995ffd443871397b188b021a8988567b922887f4401133fd3e137790a6b060d617dca2ff08018d715b463c263511104f0eca5d3e04e3628275157f54cceca2329b8503c9eb971118d0b0abd340c1940524dd21fab03e355cf0896f9ca452a2934ee3866a8939adb79c50b8e84fa1cae5fee83df1eb2a94d1d8f7b131d6ed4943587d94a98bf24995eaaec92f0db79a37c17318eb5eb0672b55e7acdb09c27d89e0db964f99c7cdfbe053486e1f0ded4298071ab0b1d796b08ee2c861e5db27ac0e86f2245ac22131a6c69b6e30aba94fa92bab078ba80aa9ac6f6d8d143f30f50b0512f077ea2d7f658f2cf7e697b8a61c6733b99429a95dd61703253bf67eacffe05c7b9747da2d453761d1e9db008f1a431a8f75645c163561f2f20509fb1912a03a8d63e20e826d45a4c3e27f6b52cb48c84ed6610c1af1d5a3bc177f8d836acc13ed83c2b2c706415c967989e03656fda6c15e279fb331fb7c4b1c601e3432ec4e649eefaf4537b4f01255034684e3ea1aafb6beff261d5ce666bab49572908955ba5c72eb412925caff1ff487859c988ddf862e12bedf7f4ad79984da86ac2a8fb767525006031c51257e658a7ea78e681a757fc2c29cec0e6462d7d5b8af5764226497c5dbee21ed4c1b5d37ba2c5411282bbaf5797f2c9cd6bdb66e4fc1983cc5fe4a310712bd063b9de476805473f2d151e7952cadc65af451288d9509767f66db727ed3967704bbad022f17467271dd8f0c89245142b288c7351ad0b07895cea3179387a3d85094f3c04ac82bd9f8138c33b9a691290b58c6e5fd49dd27e7c5ff41586b6067508e1625afdb2b31ee3cf1630dfd9502cc2ef7411e48b909db1397f9b5c6f6ac6d70bf3a47986d01bb2065a56d7086555fd0025065146ca8da7f124692e28c2f0f049506f8461ad1c6879100c1468cab2b068e1bbbf71d8c4dd21831d7054b799f104191ab2f592a79391c7cf1c8ce8a989a43a80637f53b9ad453c16c785b11835d6ae3499953923bfdaf21e53e757d0e52cb01301d1b3f2b4d68fe3983e37f25b3b905b8cd3093759df2f886f0a809f5f8cb2e1ff1b720660502f0276d0b4cecdad6fee21317b58ddf8c08ba2590b8b552ee35bdfbf364b5c4c7a01c80fdff3f9968d6adb2307fec8c26596a265511b629d920f082f5957f515f150102de2088b9179503f4a479fa6c67f47f3c1e9c614437f7a2d0e53a2b757357bf3cd9372e038d44cb1f9b2b1f46f8e0dfad13e21c6daec0ba2becdc23f8ab6f3c7613cd993c6febed7c3c1ec4e3802574c15e6a506ae68520dc3202cea2ae6462f8b769302f68905053b0d94f0ca8cc24c224bc6604894dbc2bde34943a253e1809eb945da31e3ddeec1fe42a8718dcd9f69061c4033c21765f18fbdd8ab70645f2d7d5885f39f97e8eb0c8bb1c775d7aa7c7e0d42fa90836c20add11580dc3d3fca5b4172c62cd18838b0c6c956e58ef1bf4c1fd50780ae49ad964986dce7da96c7ab973d241bf9511d938a4b9a4d3209a3d8da62d512f6830b018db91a33caf8d816d04197ddadb81c2d5ca4fc2d9f56ecacb398fda80aaccb580408b3409cda6df5732c9be23d31b6d6a48206f6f56dec4031d3ebe0492b61024302528ebebfebf0066a9aea46526037f85f4549f2b3153beba02a3c30935ea8c142528ebf1de47ee0682f3647aecab9ce99218705cb09e8278a332c6f5926b415254db10c78e9fab7c1c356bf8b38e4adcc464ebd1a3cedabfe812144016baca547aea625656f0bf2e3f1dc2c9c4d310c650e01672520a4bf79aebb5d00600af805ffce9847e62b086b35270d367a3770fff33fb28047b5f888167b28fad647940cabaae3a4d1c08ea3f7d7d00e326061f9906a2d902499dda652c1263520faffb85cbb8610c474ec4ad46f2368283455fe600116e959b8d550ee2dd363c28d91856d90fdf040a0b7bc354d65f8ae3bc35aeca52d00399b86244321cefb4d87f010689bc9e7a8ec6774a503162446df40ab80b6de5946da567cec4d67602472a1d5d85c684b9fa072009e10b27f84a7447cd6c6897923cdcce753f13b36e9c61d42275357b087757decab06d96eea1c452b5954dcd4331e6fd014bdb8e4000ad8e1f00126aae2d3c1953655e976d9b6d95382d246ff1714a5e3a9137efbf9a95b31acf6438f44340396da7e712be60f6761dddf364e2279057e7b92ebe3493a1abdc8a33cf22e2eba6e01e0fef2a17e75f2e4cc4965e794152d26bc9e3e71259df2dd887168031c4c87473de16f7e9c9b731229eecaf8fe4b6c14e0f46204046b5d46169f555595308f14e5c6f6dfd22e6ef098a4e1c9201eb7d0a08cf2744ef969bcee054eb8120cc1e5692e3d67c7d5430a78ea4ecaa2159ce48bc674347dceb48c7f51b88d2b47dc4348758788d5f69bca4b5d668fecb687bb034f4be71961aa4f3af3275749684ab9043b79d59528d5aa904cdd8b787804ee9775fdee9a48d77fb1682fa8e4e479b10cfe98b07dd28d45e856f84fcdd090d9c8d91ecd88eaa898632f15e4865305c5f32d58ac089a2f06a3fa5b3f6566b81707f712f65dddba13d0c68ebcb62a6b5237462e4acdc6377763a58aecd790e720e54e6f1b9188789c8abd0e73fcd1070059e7adff260d330297f6ebea8ce5aa81d14da78fbc71507ce170f9bcc2fd853acb704c5bb9d5ae52c15d129afdeb8ea46c7340e5473efe4f7590f4f980e6527c1c7e7dc2e1a615c260467370c308e013176dcf9eca37ce7ed78b64bcef51fb3ebd70d6d745f4e5ec0551a32e44d45b68529b981eadf24da557ceed694696ec1d3ed5dbfb4f48bb3a20fd06062bb46cfeae6b5f077af4f83da6e9e3912f4ba172014bf1c17627e23733a730bab04f8140ab7b78cba9c65ac2255aebd721d6b7e7b511bcac5309176dbdfea79eaafc24f8aa3a89fdc2dce1bd53905a7d96ce9be8cae5912e5e62b7384041df245450e4615b26e6f04ebf3999c228d42716a9d9ffa32623c9f0cb3e413b4f4c0e44d43c251edf2455b5c3aed1f192dd5629eede96ee51c901d2b938f33f4572af04fc88be65b1c68090a0ce10525cda7d49142638fd0705684ca323c8ace2e7791d407697d05d522357dd23bf64f5501eec905d706fa46d5ff72f8b5c04961f0ee636724bef103b9073bf2c49c9eae2bd8d09c0b7a6c8756b3aa4dc17e6dd8dd3084508350298f76a8ced6449c1abe6dbb2e71c7942c1921cbfa99276c437c867ebf2a50dcb562a140bee483a1cb6e0fbf69ead5fc44e67e6dea44b031d23332019d5e51099b6382f691864851baa7580b0b71fc59bbd5b5c203b6247523e62ae1a5524f80e57960f3d1235c54ee4f92c89c6d03539acd0df1cc584be23c7eb745606f11e89b8e855f052288536f4f031da246b393e8b8cf22ce90ec1e27e11f55541d61eac3893761b6ed92f64690f333a763d4c1ad7d447f8fc7d1d1ecf9aa3b0bc5052e6751bf216beb42e47af9ac31322e2e85f204b12d9966c0a491aca21c0dcdc65b8ed065c8ac8462c613717540cc0e8885be35615774d3823e20e44d23e09f6c1941ed707e0220b8431ae29588fb6bab6c19f89b23a678df49a088f5750ea1bf1287902a6af3270e04963355304aae60e00b35a6b9b9bc9e6a1a80e03d1f3d87eb68a1d9b509012ab08f4cfd613e3d6d899dd4cb423506894b95b456a199da8b4fec09c686cc17d4f00d15d54261819a11d6bd52e6a0c06694190ca1c906df94e41cae3906c3cfd66c197624fc3ae2b11dbfd883cc8451feedaf7008deedb66a52ff79795d7692f7cbba5734b651c978585e0ea51d682119fc5dc8d208d7c6d5429d52d0b26dc9feb6f9a04b992f9cb967bd450200d5987f6c2dfc486e4b779d5cff22842d31dab4d4dc39b2cd5bc43af5e466e09e521ef7e327f4b239d13189472ccfdef8492fe1ce6e0ab1795daac4a8d95a881f671b4a0952985890f15c62ac2c4326383d2e4d4bb4fb8fc5beb51e28a60742aa9cf74088b6d1819c3460f0320864a4189641bff4b8f596da054c121e535756677a1aa1055b85768521a6fb82c71ca0bedbcf007181de0ce0bad96632e6310b7f88ec352b4a9d807241944b43715261529440d96917a03afe66c3e30b697caa1a4ed6c49f8a02e58b1a93a71e0fee30fd49fb0f848321685d90725152e3227b5f553e150c239aedfa360cd9bba8d755e6836a6d6bcc4bde25c04e78ae5d0ac677248df1181e4fe2e41d65a7c144f71837c9f4bac6fa04e37d7ebf1fc8de1cd38a442c206b82080a745508dad9eb35c015a401bd3c1636c08d532d10476e40e9bf3b816aae57adafcf685b3aaaa67997aa9bf93f7626c8be7ec60011d4155e523e93f69789a5251720dec88edd7cabe31e3645081c35a2237860a0eb17dc5e5430d3f26ea3755a8a8d3db5a01976b4ed99fd4be0d548ac37a2a77566b7ca2838bd84ddb8a5ce33523e0f8c36079b7afd4279748f4969ce442525e8495de8a5460c2d1e3d36b998b65cdbb4194ef3e65b413128dc219ff09029625f5eb03dbbc546561fc5ff3d71fd0f2a95119786e04ebfadd09105f3fa64d5e5436b59d153ff92884718a862a6707e8397e58a5d511fe476d2749c6bd4085136fd39ffac563a1949fefdd8302057d26e225fce7f1f17d713984e8f1266c4c6ddf3904bd7aabf0224ac3e37b0c5fa32739e450cf4347cc10c88e685ed99e05c628f37e55939d6769eb9a16ee97ea0c71b7360ebc57696c9ea0c06270653a33a4e38f8743ae9c69d418eef25e33492b9ed097814f9cfaf18348b741d647d5789295599a082a4d99e9491ef03a7cd192f72c9552e98260dd5726df90e0f0042707950e3133a5155a21f2b6bb13c337b513019bee2ab62f9292d195da310c2ac18c8909e726ad883d06bc429d7aa4c0048b1627cd8386dbb3cebf968836eaddfa89d7d92681821ab51ffc5f31cfa02f23c7d0d58b74a2e9b353774e25631a82249817f869b4e13154c63948f28333b97541a801728e68de13c96f292c6629abc23fbfe44b3139808ea209bc5a45de139b9122584d21672d47b92db4179076df65d936292597097ce53bd415f3881db1e93ed63665ee1c5bd17b298b7172b081820d11339356bf9adaec2ed238ba6118e0931a18473506ee4 +0xd558f26d7e8e293a3911d606e7b7c822a92e28675a8e92389ca27ab0cbe71b2debbf0c360c8d33586c7a374550266db2 + diff --git a/src/sha512/formal/model/PriniTestBench/testvectors/512.txt b/src/sha512/formal/model/PriniTestBench/testvectors/512.txt new file mode 100644 index 000000000..89ed268f9 --- /dev/null +++ b/src/sha512/formal/model/PriniTestBench/testvectors/512.txt @@ -0,0 +1,387 @@ +0 +0x0 +0xcf83e1357eefb8bdf1542850d66d8007d620e4050b5715dc83f4a921d36ce9ce47d0d13c5d85f2b0ff8318d2877eec2f63b931bd47417a81a538327af927da3e +8 +0x21 +0x3831a6a6155e509dee59a7f451eb35324d8f8f2df6e3708894740f98fdee23889f4de5adb0c5010dfb555cda77c8ab5dc902094c52de3278f35a75ebc25f093a +16 +0x9083 +0x55586ebba48768aeb323655ab6f4298fc9f670964fc2e5f2731e34dfa4b0c09e6e1e12e3d7286b3145c61c2047fb1a2a1297f36da64160b31fa4c8c2cddd2fb4 +24 +0x0a55db +0x7952585e5330cb247d72bae696fc8a6b0f7d0804577e347d99bc1b11e52f384985a428449382306a89261ae143c2f3fb613804ab20b42dc097e5bf4a96ef919b +32 +0x23be86d5 +0x76d42c8eadea35a69990c63a762f330614a4699977f058adb988f406fb0be8f2ea3dce3a2bbd1d827b70b9b299ae6f9e5058ee97b50bd4922d6d37ddc761f8eb +40 +0xeb0ca946c1 +0xd39ecedfe6e705a821aee4f58bfc489c3d9433eb4ac1b03a97e321a2586b40dd0522f40fa5aef36afff591a78c916bfc6d1ca515c4983dd8695b1ec7951d723e +48 +0x38667f39277b +0x85708b8ff05d974d6af0801c152b95f5fa5c06af9a35230c5bea2752f031f9bd84bd844717b3add308a70dc777f90813c20b47b16385664eefc88449f04f2131 +56 +0xb39f71aaa8a108 +0x258b8efa05b4a06b1e63c7a3f925c5ef11fa03e3d47d631bf4d474983783d8c0b09449009e842fc9fa15de586c67cf8955a17d790b20f41dadf67ee8cdcdfce6 +64 +0x6f8d58b7cab1888c +0xa3941def2803c8dfc08f20c06ba7e9a332ae0c67e47ae57365c243ef40059b11be22c91da6a80c2cff0742a8f4bcd941bdee0b861ec872b215433ce8dcf3c031 +72 +0x162b0cf9b3750f9438 +0xade217305dc34392aa4b8e57f64f5a3afdd27f1fa969a9a2608353f82b95cfb4ae84598d01575a578a1068a59b34b5045ff6d5299c5cb7ee17180701b2d1d695 +80 +0xbad7c618f45be207975e +0x5886828959d1f82254068be0bd14b6a88f59f534061fb20376a0541052dd3635edf3c6f0ca3d08775e13525df9333a2113c0b2af76515887529910b6c793c8a5 +88 +0x6213e10a4420e0d9b77037 +0x9982dc2a04dff165567f276fd463efef2b369fa2fbca8cee31ce0de8a79a2eb0b53e437f7d9d1f41c71d725cabb949b513075bad1740c9eefbf6a5c6633400c7 +96 +0x6332c3c2a0a625a61df71858 +0x9d60375d9858d9f2416fb86fa0a2189ee4213e8710314fd1ebed0fd158b043e6e7c9a76d62c6ba1e1d411a730902309ec676dd491433c6ef66c8f116233d6ce7 +104 +0xf47be3a2b019d1beededf5b80c +0xb94292625caa28c7be24a0997eb7328062a76d9b529c0f1d568f850df6d569b5e84df07e9e246be232033ffac3adf2d18f92ab9dacfc0ecf08aff7145f0b833b +112 +0xb1715f782ff02c6b88937f054116 +0xee1a56ee78182ec41d2c3ab33d4c41871d437c5c1ca060ee9e219cb83689b4e5a4174dfdab5d1d1096a31a7c8d3abda75c1b5e6da97e1814901c505b0bc07f25 +120 +0x9bcd5262868cd9c8a96c9e82987f03 +0x2e07662a001b9755ae922c8e8a95756db5341dc0f2e62ae1cf827038f33ce055f63ad5c00b65391428434ddc01e5535e7fecbf53db66d93099b8e0b7e44e4b25 +128 +0xcd67bd4054aaa3baa0db178ce232fd5a +0x0d8521f8f2f3900332d1a1a55c60ba81d04d28dfe8c504b6328ae787925fe0188f2ba91c3a9f0c1653c4bf0ada356455ea36fd31f8e73e3951cad4ebba8c6e04 +136 +0x6ba004fd176791efb381b862e298c67b08 +0x112e19144a9c51a223a002b977459920e38afd4ca610bd1c532349e9fa7c0d503215c01ad70e1b2ac5133cf2d10c9e8c1a4c9405f291da2dc45f706761c5e8fe +144 +0xc6a170936568651020edfe15df8012acda8d +0xc36c100cdb6c8c45b072f18256d63a66c9843acb4d07de62e0600711d4fbe64c8cf314ec3457c90308147cb7ac7e4d073ba10f0ced78ea724a474b32dae71231 +152 +0x61be0c9f5cf62745c7da47c104597194db245c +0xb379249a3ca5f14c29456710114ba6f6136b34c3fc9f6fb91b59d491af782d6b237eb71aaffdd38079461cf690a46d9a4ddd602d19808ab6235d1d8aa01e8200 +160 +0xe07056d4f7277bc548099577720a581eec94141d +0x59f1856303ff165e2ab5683dddeb6e8ad81f15bb578579b999eb5746680f22cfec6dba741e591ca4d9e53904837701b374be74bbc0847a92179ac2b67496d807 +168 +0x67ebda0a3573a9a58751d4169e10c7e8663febb3a8 +0x13963f81cfabfca71de4739fd24a10ce3897bba1d716907fc0a28490c192a7fc3ccb8db1f91af7a2d250d6617f0dfd1519d221d618a02e3e3fa9041cf35ed1ea +176 +0x63e09db99eb4cd6238677859a567df313c8520d845b4 +0x9083e5348b08eb9810b2d15781d8265845410de54fe61750d4b93853690649adc6e72490bc2b7c365e2390573d9414becc0939719e0cb78eca6b2c80c2fda920 +184 +0xf3e06b4bd79e380a65cb679a98ccd732563cc5ebe892e2 +0x6b315f106b07c59eedc5ab1df813b3c0b903060e7217cc010e9070278512a885008dac8b2472a521e77835a7f4deadc1d591aa23b624b69948a99bb60121c54e +192 +0x16b17074d3e3d97557f9ed77d920b4b1bff4e845b345a922 +0x6884134582a760046433abcbd53db8ff1a89995862f305b887020f6da6c7b903a314721e972bf438483f452a8b09596298a576c903c91df4a414c7bd20fd1d07 +200 +0x3edf93251349d22806bed25345fd5c190aac96d6cdb2d758b8 +0x299e0daf6605e5b0c30e1ec8bb98e7a3bd7b33b388bdb457452dab509594406c8e7b841e6f4e75c8d6fbd614d5eb9e56c359bfafb4285754787ab72b46dd33f0 +208 +0xb2d5a14f01e6b778888c562a059ec819ad89992d16a09f7a54b4 +0xab2e7d745d8ad393439af2a3fbc9cdc25510d4a04e78b526e12b1c0be3b22966872ebe652e2f46ed5c5acecd2f233a9175dd295ebeb3a0706fc66fa1b137042b +216 +0x844b66f12ba0c5f9e92731f571539d1eef332e1549a49dbfa4c6de +0xc3f9c5781925774783ae9d839772d7513dfcea8c5af8da262c196f9fe80135b2b0c8c6ca0a1604e0a3460247620de20b299f2db7871982d27c2176ae5fa7ad65 +224 +0x6b6cc692d39860b1f30203653e25d09c01e6a8043c1a9cb8b249a41e +0x2e5263d9a4f21b210e0e161ed39df44102864325788647261a6e70ea4b1ee0abb57b57499bc82158d82336dd53f1ef4464c6a08126e138b2cc0892f765f6af85 +232 +0xab1fc9ee845eeb205ec13725daf1fb1f5d50629b14ea9a2235a9350a88 +0x72d188a9df5f3b00057bca22c92c0f8228422d974302d22d4b322e7a6c8fc3b2b50ec74c6842781f29f7075c3d4bd065878648846c39bb3e4e2692c0f053f7ed +240 +0x594ed82acfc03c0e359cc560b8e4b85f6ee77ee59a70023c2b3d5b3285b2 +0x5ef322cb4014ecbb713a13659612a222225984d31c187debc4459ba7901f03dac775400acfe3510b306b79894fb0e8437b412150c9193ee5a2164306ebb78301 +248 +0xf2c66efbf2a76c5b041860ea576103cd8c6b25e50eca9ff6a2fa88083fe9ac +0x7978f93ef7ed02c4a24abecba124d14dd214e1492ff1e168304c0eab89637da0f7a569c43dc4562bdb9404a018b6314fe0eebaccfb25ba76506aa7e9dcd956a7 +256 +0x8ccb08d2a1a282aa8cc99902ecaf0f67a9f21cffe28005cb27fcf129e963f99d +0x4551def2f9127386eea8d4dae1ea8d8e49b2add0509f27ccbce7d9e950ac7db01d5bca579c271b9f2d806730d88f58252fd0c2587851c3ac8a0e72b4e1dc0da6 +264 +0x9f8c49320af9370cd3db20e9b50d3eaa59a6232d7a86fb7d472f124508d7968b05 +0x81b002f15c4d48be8517f7ed89df302fb1435c9435efefed58f3eb8ea11910623f1eb9028a66e02121a7f08a7c604226f2324f483e91548dbbd2c441ab704ce5 +272 +0x4ab9aa069475e54b25e5688a52dd4acd134169c858105f01a0a1b134c72d4af51f8e +0x48ba5a63aba7e7bd8e420475331125a947928c67fdb00f65c4080d9a0b99c0672424e76a1ba6bd76dfe492c730f6f9adccaee7bb11571aadb31f6bb628cfa933 +280 +0xf0c1d3407de92ef7421e42df5c9ab31d2ec0a750a9522869cbe4cabd66908d5823ec04 +0x9e75c5bca2c2af1d7739787f46e1d981c4f98e493d0724b5252c2fbae3c526719f1d27e6ccd0d705240281e8fbf3db75b9b3205c1413436d3b5d140004b8cca1 +288 +0xae8c9f8fb41b519b6d943833fe1c32d1c4292fb1ddf1dbe2eb227d9e14d31ed74ebaef12 +0x042f9fd0a4ed3d9fec3655ae11011c6f2bc7e457e8812b6d8be2cd45fc6c432a94558c88f22c01439618865e8e49e509c448b342ca914b120344aaf7bcbdca18 +296 +0xda39fb86237f00303844e61fc6cfe779e42af53349839590bcd2f0e4cbbc279ec0b7e885d1 +0xecb43de8c233a731b38e30c5696f8876761b7ea72efe283fd07bedf20029f47c6d2a4427823e100fb087abaf22d7eff42a951c97c3dd05f48a20163fa4367cba +304 +0x3e7271d2070ef095394620c4b016576c150f34bea60784613a0f660d7fa5ae56872b88c58398 +0x8154d0da634ab2266061acc123acb407650ffe9164a22de3fe29bf05393b2aece92cf4db00ea5b4341c31ddb7de151683c8a71b5a44d5c3175790feac67d18ee +312 +0x311fb67f6a0784bb01a2d5a3f3092c407a9d3322319dff9a79f894291c5fac37319fb408402e18 +0x1870fe913abb0a4b4f53b6581ae18322cd05328514556607f3f4d7b6a2ac8e9185d94d947d8b9c88e0efa66d89b59f7439c75fdadd1816f7412306ab2b59d664 +320 +0x7651ab491b8fa86f969d42977d09df5f8bee3e5899180b52c968b0db057a6f02a886ad617a84915a +0xf35e50e2e02b8781345f8ceb2198f068ba103476f715cfb487a452882c9f0de0c720b2a088a39d06a8a6b64ce4d6470dfeadc4f65ae06672c057e29f14c4daf9 +328 +0xdbe5db685ed7cb848c094524c1723519d49dc66ef9fe6d57e6862a6435750bfa0a70f104f5d396e61a +0x2fa6e5b2c443a68050f093e7fb713bd6b18f6274c061ed61d79bf0688a61dba1940bcc30998276860943ab038902896d0fbf59b88b07c80de927037097150c40 +336 +0x9fa83e96b2a6df23fb372895015678e0b2c9cd18a8542c3eaa2c435a76ae4dc9bd5136d970daff933acf +0x3a2c0ec88a3e5347cf0ea9c078838300ef7356f9a6c342063277c106b880a00ed2be205c13064097bd372fde38007bc306561eb4e74bba2bb20bd354aa690ca6 +344 +0x8a5a45e398bac1d9b896b5a2b4e3566b91d80ad20c977ea7450ff2efb521d82f65019ee762e0c85c6cc841 +0x3c704620f4066d79c1ff67752980f39ef3d9c1023fa5a213a5265376b14a15166ffe069b51df7710d8907fef9406bf375d502ce086ac82aff17229aaa7a5a334 +352 +0x49cfffdaf4d031e33b1d28a447450545f6c4293b38d5afbcb9883976c014f080576ec691ac1bff70b742efab +0x8bcc4f1ea2b7862ef1591bfa73916665de8faf65439ddf5cc1be43cebfd5f60f205e835a2b186b675b041258c5cff42669316ce25b46a2f4d4218e102f0f5d6f +360 +0x2ff845d85efbc4fa5637e9448d950496f19d8d57da99b7bd3df7474822f0a790586736416714e364c6e1fae04e +0x236f6f4ed6e858c02d51787e60c578f731f694f8e52b5df4ecd5b04dff14c78e56bad1028d6f626c29d85aeee151a2a2846d3eed5cfafa9854a69fea8af6d04a +368 +0xcfca05fd893c0f005f5ff796f4da19ba27a1e729956b8b715e67ce4b2d2a382a72ec7814f2f507b1825209a20fcc +0xd80969284a4565add4dad6ab9b3bdf53446142f84aaf92d4b23dd22ee7241e6c81489ac8b246edcb6df9bd7b23d91a0c517f546feba4ed5790a2be6e165c1709 +376 +0xcfc425759a9c36bb9f4b32eed7767af6566f68ded0adeae25c7a70ca78ec09774d16c8bc357f6d6f7bd441bf62d942 +0xb587a785cdf455cc9c544e756c1e306300aa3c59f8725012e68ab4d54020b6d227a164d9f83c905e86f8cebeef708a69f976d6e7b18b9bf78e9b98cc4a5cd1b6 +384 +0x097c9db919515242c99d973acb1dc4ed482768f974eb83b465f9f6c82503372006e4490835e2ec8f92301130bfb790b2 +0xff5a376f938e73014caef7fe3962944a7230d020b7087869ebe7ec70302721cd06fcdc981c893a425d05e2f99fe198e4db50a088aee2bf1263212110efed422c +392 +0x77e73d387e7bc80419ebf5482b61d5255caf819fb59251ff6a384e75f601ea026d83ef950ed0b67518fb99dee0d8aaef1f +0xc4c89cd882ec945cc888fb9a0127d35e585ecc14a75e4b5b3d8330538d22da28cf6af1ebec96dc247f109cd2aaab9756e6946a3d80db8363a4da3e6ddbb510a1 +400 +0x317e5d9ac73ed0633fa18ebebbca7909ec3a5ef790478f9c38cacec44f196d895835b425774483043341381e7af2d383e51a +0xb10bb04491b9c0c334709b407cda1d503efb6b63ee944f2d366b6855e6e63e5b80115be4be7ff63edecdfb5923792e68123976d79212b3884dec2179d1fcf382 +408 +0x209461f20666a346fedf4a530f41a6fa280c43665767be923bc1d80bbcb8c9f8f93ad75782ea2689c8c5d211d2053b993145a0 +0x67b7a328d9444056a52ca2f695c5d3f3baafb625a14fb32eee8ff26a40ccb296bec1771a826b55f7ddb6170d4caf7795b612448e66a0f19356fe505927149b47 +416 +0x5d61aa45c446f3bf93604b0511313b4e2f306d6b046fbd94797b926746836f2e1dbdc56124060c6ca9c911b1122192d112420827 +0xd3931bde2bde8271ed18ca0b9148b12f6f16161e637e376fc961f65bc33bcacf2f6addf26a3eaa81b196653cc37e8a739ec5b3df870d8c38c8f28691c22a39bb +424 +0x9288c795bb0b86c0419d9c5637dcc37b39bfa18d441e3fbfca75bc0306e5432e8e7b3a5627b5bc7fdc424a77520abdff566e7f2bb8 +0xe363d0e95d8cd18c384016ebeed6d99c4fa2768e2bd58fca019c5108b9cde1cb46f3f884028a55ce282ec310a10037faa1b16b4a6a669957f0b00f350bbd63d0 +432 +0x780427dc164b2f69b8c7d569266f461e2d30c88c4cd6057fb030a6cf636f24e3c0d0db742a7b6193fdaa15eec50dfb4fae6ec7653c91 +0x2964b009fb1bf996de12e030b9d6e0608ae8b9dbf2acfb9beb76fc5361cc104ee85c2a46fb7b4cee90848312da302de49afe61c546477e2b25d223d5e3d33560 +440 +0xec2a92e47f692b53c1355475c71ceff0b0952a8b3541b2938270247d44e7c5cc04e17236b353da028674eab4047d89ec5dad868cfd91ce +0xc83aca6147bfcbbc72c377efa8d53654ba0830c5a6a89e1d2a19b713e68fb534640deb833ca512247166dd273b5897e57d526f88eef58f6ff97baee0b4ee5644 +448 +0xc99e31ad4e23ac68e15e605d0b02437f8147c44f5445a55b68a10905276cce8676481c33e8cd3efe322bb13fe0107bb546ccbec7b8b38d10 +0x52992d45a88221d972958e9f2854adaa9a21d2bf7051e1f1019ae78004da50c5b55c144a02afffe539d753949a2b056534f5b4c21f248a05baa52a6c38c7f5dd +456 +0x9aa3e8ad92777dfeb121a646ce2e918d1e12b30754bc09470d6da4af6cc9642b012f041ff046569d4fd8d0dccfe448e59feefc908d9ad5af6f +0x994d1cda4de40aff4713237cf9f78f7033af83369ac9c64e504091ea2f1caff6c5152d6a0c5608f82886c0093b3d7fbadd49dfd1f9e0f85accf23bc7dad48904 +464 +0x5842512c37312511a3d8ae41f5801df60cd682d58b4a997342b6e717e94006c214813e6c63e75591f957a7ec301779838bec8ae3ed7febad0805 +0x9763c43331ad0eb279d704c5f6e97e02da8724115026827f889e9fcda21f60fd230894ab35abb719890f3afa51afd31bc6852183b9c51059910af460abd2474d +472 +0xca14e2ea2f37c78f78ef280f58707ec549a31a94361073e37701bfe503e4c01ee1f2e123e00e81a188f08fa050825709128a9b66bb8ae6ea47e41d +0x4600e022a02258739f67fdd367cc1e662631fb087918768352062b9b3c8de8dbca0e9ec751b91f284694fbddb8d325c0637bccb21dd2efa92e48dbab2e5e9c26 +480 +0x647629c779b24c1e76f41744aba17159487532a0156a7d8264db50d645e9595ff81e0c96a850f2aa56c844c613a4b892727a9bfc3d3e20386766f805 +0x5bc842fc2d3b7eb31d2d3044df3ec32af114feaa7cfc27ebc8630f46ab6f0c543f59b812e776e5303861d17da3f1f16097641f3b808d4d5cb3e483946409746c +488 +0x1c5dc0d1dd2e4c717635ff3e9b67caf957aec0f8f63c1b1e221e800a4c14848f4ea06e644e5d3e1de592ef5a8007fa3f07171b24bd07578d68963e5cb1 +0xcbf1ea86fa5b3dbf67be82fac41e84cccd0d296c757169b37837d273ccc015eecd102b9ce1cff68fdc7f05d22f2b774734f62ded54c8ee0bf57a5a82010d74f5 +496 +0x8a555e75477d065b3af7e615475f37c0a667f73a4c7af5e4a69f28a68d9f4434776a8f90eab7f1d137eb4b22643c0a0d6a16fcfaa1bd62f2783546a9695f +0xc088e4a3d7da2f6f99a8f3f717361108872b8ffef921b383c24b8061d4e7c27fc56f4f20dc8f952a14043c5650b5a9e777c49c41cfeb3f2de97ee2e16b2c3924 +504 +0xebb3e2ad7803508ba46e81e220b1cff33ea8381504110e9f8092ef085afef84db0d436931d085d0e1b06bd218cf571c79338da31a83b4cb1ec6c06d6b98768 +0xf33428d8fc67aa2cc1adcb2822f37f29cbd72abff68190483e415824f0bcecd447cb4f05a9c47031b9c50e0411c552f31cd04c30cea2bc64bcf825a5f8a66028 +512 +0xc1ca70ae1279ba0b918157558b4920d6b7fba8a06be515170f202fafd36fb7f79d69fad745dba6150568db1e2b728504113eeac34f527fc82f2200b462ecbf5d +0x046e46623912b3932b8d662ab42583423843206301b58bf20ab6d76fd47f1cbbcf421df536ecd7e56db5354e7e0f98822d2129c197f6f0f222b8ec5231f3967d +520 +0xd3ddddf805b1678a02e39200f6440047acbb062e4a2f046a3ca7f1dd6eb03a18be00cd1eb158706a64af5834c68cf7f105b415194605222c99a2cbf72c50cb14bf +0xbae7c5d590bf25a493d8f48b8b4638ccb10541c67996e47287b984322009d27d1348f3ef2999f5ee0d38e112cd5a807a57830cdc318a1181e6c4653cdb8cf122 +528 +0x8e8ef8aa336b3b98894c3126c71878910618838c00ac8590173c91749972ff3d42a61137029ad74501684f75e1b8d1d74336aa908c44082ae9eb162e901867f54905 +0x41672931558a93762522b1d55389ecf1b8c0feb8b88f4587fbd417ca809055b0cb630d8bea133ab7f6cf1f21c6b35e2e25c0d19583258808e6c23e1a75336103 +536 +0x52761e1dac0eaea898e0b07cd24f4b2e6bb7bc200ea4b0528842f17b87154559a2ea94459a0e480ae0bdf9f757dd4a335aed0e510138b024a04ed1d591b4323234dbd5 +0xb826fe80494e19c51b42f2582b2d080ba6b90512f35f2db67dd7fd5ee532eaa16498afba08b4996cbcfdf8d1a2df6b1da939e8265115a48aefa42f38205db436 +544 +0x3804ebc43cbea80c2bd7e4fda5c5515500cd2d2b846a1378dbf218d5c377138606eb3cb8ac88f9076f6ff4436f90717427c9df1ba052acbbe4585e98b6e8e0bf800f1946 +0x17dd6d87bc6773051e52047fd444996afa8124b0483fe121877f98553448772bd0e7751fc655e9cc2d29830211015d310f191474ca6adc0477a187c03b8fe252 +552 +0x2249d698c4d807a8e7b4de21c485738959a0d67e5d2ca6f77983dfccb5dbf47931261e1f1537f3cbca253afb6bf4fe5e7672e1dcc860b3d6c8d243afe2d9758b375e955692 +0x6af44563fc468d51182f6c3be58d45932af1d985c6f283976c91a9ff421f383fe21dc7322f397ccead583e26b3e3fda067976a7f34665df25a2ced7b4b09cdec +560 +0x32a9c17033658c54f22c7135ddfc879de94d79593ef2dc7d3041bfa872738389864eeda27801794ccc4ff1fcb5ef3fc48833801d6fe959e3627f8ea1536ad00fa9c7d7d9f043 +0x6a47699dd3ada2f11bc4ea42072b06cc20857bf164497df1285400c250f5848b6f71957dbdc845f5daeab913036661f69387893fc2d61c25fa59b9d85b19f401 +568 +0x3d65f69a590a5baaabcd274fe3ef9e88920ffc7adf05c16d7b0f4d18d72bac1e94c3b3d83b8f4c552eb80e9fde3911403f8b000579816f02e1716fd627946031d0af0793e7f3e1 +0xffb2d9450943c24b5933c24812459b75d3d9f380344c9bc06fa3e17ee448eca2f98ff79f7e2235ccd9f9a8176f68a2254bbc9b834d6ac8d2bfdbc1597c432c9f +576 +0x76ff8b20a18cf104f6cdb65e2ba8f66ecf844af7e85e8ef2da19e8848a16052ec405a644dafb5ca08ec48f97327ac52c0e56218402c72a9a6dc1cf344d58a716a78d7d7529680bae +0xf8858144c6d709dd0689a526a548a43f17494950ba2ac20544799e8ea27201d78bce5b921e29a7b4029278e68341ef2a0ca4ba3894566b3c8f8950e3e545a689 +584 +0xca88dddfc876a12f45f19562bc9ca250f43267ab251a7f345c3c022e20144e135604078762ef5c8a8f038cf1b1d6a91709b59dd068396a9e971ab628f74886e765384a23607c1a1e6e +0x4f3d9eeef349ca51a7e419af1686f42795abde58a85335ce68d496e81e4436a80a61dc143a4300008c23a3e71f4ba98743195a3694a8d02fee11bd314569abc0 +592 +0x0a78b16b4026f7ec063db4e7b77c42a298e524e268093c5038853e217dcd65f66428650165fca06a1b4c9cf1537fb5d463630ff3bd71cf32c3538b1fdda3fed5c9f601203319b7e1869a +0x6095c3df5b9db7ce524d76123f77421ce888b86a477ae8c6db1d0be8d326d22c852915ab03c0c81a5b7ac71e2c14e74bda17a78d2b10585fa214f6546eb710a0 +600 +0x20f10ef9a0e6128675340171cd248df30b586557620b615ca39a00db534315a9012dbdbfd6a994986eb829dbe6cdaf3a37d4f59ac27298742c8f777b6b12677f21eb289129579868705f27 +0xb4ead3f860eabbd36c770d66c7356f8107acd1485c7c94178c2eaabd50266d7645d009972586ef83ed43ed92882137df5117b88f35231b894ec1741ae7501145 +608 +0x995c8f747ea418f7d63aba2260b34ac3c7dceebb78438ca4b1f982b7db9798ec1a7f32622264cb024c0d9e60e955a6e1d677c923518851990a459b767d0f13cd803460f61870db3391b44693 +0xa00a601edeaca83041dc452d438a8de549594e25d843c2cf60a0e009fb92d87abe28a72690ab657c8d35b43cd02d22ec0755de229d1f922fa6ca18a6d6c2aaae +616 +0x0feb23c7e4a19bcbd70bd300d76ec9045d696f8c9687f49ec4154400e231d2f0862495150cf250b6f12f172a7d130f8fa5d175bf2f25e280172ccdfb327951701165302728a619aa2f242631c9 +0xeeb6dee30c119fb1e1eb5c15ff2b32d8b9c7464a4e4cc6815cd251a6bae29b49961dd5c2fa9c44a9b142ca062c7072cbf3db04299b767789040196bf0c06aa76 +624 +0xac59a110623f1a64666f160ed32926676cb5be25dd9d962f441951b0efcb5d6a67ac1a4eae473e49c6257860728853ff415c5e8ec76a8a462ecfd343eeac22dad820722c597332fbfd94ebbd32c6 +0xf65ea942ae0a47e73b02b1442e5b26083db79307f64dd34a039c476faf18d5c514bb77a2c412a6074a7afc326ea66c74e5705fe2abbabf274333325a15b61fd9 +632 +0x9e3e1077e1333a1fb1aa633ccf2f746588ad426489ea08dff5511438b5f4c0b110d1a4d47b540a12b21ea2aa070578ccfa5c22fe0b743ec0cc621c6b3a03b75f4d3eea5dce89e03269afcd9603d0db +0x4b5c5df80c344c12388c723856cd06965b2190af652480476747dc2195ea3716f87c1762359583a5f31522f83f7833bec30f1f47d14540417dd463f5d258cd4a +640 +0xe881e3284c79d8f5237e699e4fbca84090c664bb53229f58cb0842b0436710c9b329d98191b8f030e9c1df89b03858c1569c6ff49a7c07c4a23a8a434b0fde13be4f94cb44ee629d5b44d336090d3de6 +0x147d8071c7871ef9256cff32aa63ea031404fa5ee4ec09c56afdd5da919b0cc84a9d35d142c417715203316011cc620cd6855bb117063a5e52867facc680d5f4 +648 +0xe58521098911503de84311387d375c25929e6e55076eb6934fd8f2b1bb7b9667fbd76d5ee204828769a341b1f716da5bdfece6c62a9f4d4f988267fce1f5615540dbe375324eef607c910d976b45a5ea5f +0xf97ba056fa41f43b8e1987072a09e828c71c5ff6ad4e37f9ab6b89e2a078933dd23052fa72c6615b613904259e9ff9b55ef7b923b89bc8752f6babddd256e117 +656 +0x3796cf51b8726652a4204733b8fbb047cf00fb91a9837e22ec22b1a268f88e2c9f133e5f8527f1b184830e07c3458c83a8ca9f9d9c6998760e610668ba0f22e22b656a737e978b246a17840b7dc4091da85f +0xc8a466199acbcbc93f2ce042968508c046901631e3118a2d0bf39a9b42b4197a379b3a86cdeca9df2de1a3eb71b79ae9bf2d6575eadf1878029c4093133f54d3 +664 +0x9af608d031ccf309d7273c607a8e5e36840d449b55db5b13f03aeb9af49fa7e7cf1383ee2ed9c5a8b7515f16fb1c7c84a681590bf90f56597b844db5ebee223d78109b72350772f7c72ea996603e1e84f2ba5f +0xf0ded9495b4f64cac585be8a737cfa14247a4a81cdf7f01ebcb134ace71f5a83df2cd72e7773fea1e82beae17e13857372792c8231e2ab9fbeb633e399d5f0ae +672 +0xd0df1bdf1df6203241722fb9c9c1cf7405017497ae154538ccf9224ad752e6ce1d4ae948639aca70cfe86b2b06543cb9914ebd3085aa3e2963f6e9b93d0b03a31ae26fcb9ca974eee016c091a6fcac37b21cc1d7 +0xc2da3ea3c8a3fd88a5bc5dea2bc076f861abedefae5a5fbd941ddfd1c41cc3312eb2dc826c2c0f65414fe72ebee447d2f9b1a6a56302660d1f86632ee80a175f +680 +0x8cbc9480553acef7bcdba9716ea8d66b4131780917de2b0b048045fcb32b5cac054808e1fce6e94ad851ecb47fe6cb802225d3551e08ea122093d0078dada564212eacf1d6394e0007cc62a1d595ab14ca08a284bc +0x63b39b88ceb848188b37316e04560e75a5340ab8d417932d231c997e892b41daa69d9fe3e9a14dd19ccfbbfa01488c208e7b946cfaf16ca2b1bf7c8d8da4e6b2 +688 +0x38f184448f3cf82a54cafc556aff336f23f9149e612134b3fc00c8a56455653d88640b12f69062b8432c4335ad8f7ab4ff66cb7eb54f332561a36f024d92c3e26276f4fd48619628cff88e4b8e85cf14ca4767ed990d +0x9a49265fc641c59f1a91872cdae490d3da73c0c60fd59648e1d17dba1a647a5b95629392bb4ff5163d1a3cb45427c1437a3b2e1d9f030c0a8bcc5ed22da9e2ed +696 +0x70900618b1e9e9db62296fb6c6590c9f10b0a632765c489c887f1ab7c07791765a62e38465e1be281b1d396c6e080b7ee3e6fa56a30b9799d0e629be153ee76f81bc6a3295aa61489bfa87d53a8ad24248a6ede0dfcfe9 +0x1c8c3357ff1f8d6ac4defb3af462a73e09159e3a20c6506edd8cd3052df941c81f68c5fbb893912619e28640977fe8eaae8e9d5d4e7d5f132552cefab4540bac +704 +0x4e6ddae0d805afcd10a055bce584c848d050fb29fe8f1c64b18e1abfe46b65782e6ff536e89d8d40928b41ed7371365c8080a9647f7532ce6c6d4ac21cfb0c8020783851ec9a7dbc3948f8fca7adf8b2a78c04d898d31ff6 +0x5c2f996c779b91b3c4639311f54fabbdde7e2212b53dbae4828c8399588fc00d3b2ae60918aaaf6bb48bc757e52b2bcea84f5d15bf4ec25d5519fb54f6f26e1b +712 +0x696825f6d6ea8173ec47d0959a401c4ddf69f8f08ddd678a4d2ff976e3a4372bb39f4159845cb63585e1d4108d32e12fa7c5c9d7ce3508a7f53aca2b4bd951adbcd8984ebb7536563f5884c90bc5023b3316f7e4dc6958f743 +0x3ce940ca96b00011375daa95c65f66907d69b3eb3b8d779e6fc971afcc05e990bc4c541f434590f6b18b68c080d0f24475a3e764e9cb85343301314ee2fb661e +720 +0x79ecdfd47a29a74220a52819ce4589747f2b30b364d0852cce52f91e4f0f48e61c72fa76b60d3002cae89dfc5519d3430b95c098fa4678516b5e355109ea9b3745aa41d6f8206ee64ae720f8d44653b001057f2eba7f63cd42f9 +0xba3d0fe04470f4cf8f08c46d82ae3afd1caea8c13bebbe026b5c1777aa59860af2e3da7751844e0be24072af48bc8a6fd77678aaee04e08f63395f5c8a465763 +728 +0x9263fe75e8f6c7d5d642e2ca6a6eea4f44e9a0f249513ed79c9409ffca5526ca4491aebb1382057cc7c36722b0b6c3b15123cde312214f25353abfe30bca170568a8e1ba5408917403a01834080ab607c56a10d0265082498fe0b6 +0x7736d7a7fc1eb05857ce7d88abfffa87f58c670bfdfc0a8031f60f379e4b6ad94ac8f13ffe28c697809b5cfac7f13be01e7496a85237c4025539051fb2e32fb6 +736 +0x78c17bfe0e02eb526d1a44a1ac127be082181452b625394bd6dc093a2cb432e6ee59c2f8b5503aba30dae41e1a1c6702697c99b2c94e94af48b00caf53b2e0e4e1bbee81ee282c7b2b35f58cf421a07e828d57a6622626af25835399 +0xb56b6e343166328523e0d1693e5174da643ae83cf69c85a7b3c3bee247b77b84702069d9e6b4cab03bf17fe612009bf4239683ca78ca7e876aca7d07603ba714 +744 +0x298bb304a920f960447d8fd38b061bf8fe4ac1f871d8a0feb4549feb72ca694a5a41b6867d94cd5af77d468ad2f315d127b6c41a862800f3985e573e037740298e2c5c6186a9fb83609be2d49f8b4c31f96a2e49b56dbf09571b38587f +0x34e3878627904ffbbbd85266cc973c34f931e3cab5d4c31f841c553dd69f84838206067df4f9f3b9102001be19267151e673f5c2d4c2f8438a6999a0a325487d +752 +0xa3cf714bf112647e727e8cfd46499acd35a640dd393ddd263cd85cf6225f59890a0686dad1c54eb8d809b81c08a98dba131bbdd6fce8ff59d95db824d8831ea480529da739227a6e0f62b603b38c35cdc2581f614a31879b8be54aeefaa0 +0x6f230ae4903ddbef0ba384c2e3506eab318bfd1a46ea76099f65a3fd529c91bc2865b9fd943e346de64626b8529f9db1377bf2c5e0129c66b50c6a5cfb364b3a +760 +0x0a427ae55ef3a7e6044a08cf6128cbaaabfd776c4e9374708f2ece246fd73603d2f54ac3e01d16cfac2bdaf713920d66e8f0a3d54ee68cff64267d5528cdf2f295f474d10f81173e0143488ac53fc503c444ed23dec63a080ce90c2443dba8 +0xf6bbe5d0cf13ddf41c1436748a5d1ccae2948547b452c2171c7c8e8b66c6ae4de3c0e8b2962bcb60d3de3608479f80e455c9024d9716c38f6f1206861ab1eaac +768 +0x2cbbb87511f4948efec3a61b511ededb1dda8b6ecfc0210c11e43a77ee32dc2e374afae4268e3d30427804868232a966b56006d3214037076bf6a265b72135af0fb2ef7909fea2dea412f7717446b276ff153753662b4d4148c02347e3259169 +0x76897b87a8a1cf835c434f6d391c9e5227351af9d3e20a3389c796b98b424281a59068d9c8d567ec2bebc435b0126b059e2d86394a9854d6611e1c922f385496 +776 +0x2b23324c9992f60a7fc010159a03cb9a2b290df4fa6a82359b9af602f0a403a5ef33ed5da5b2caf87b77e6a4b93b650348ce2a7dbc08f8da9203d710b587ba5947c65e899f4a759f8e2b049ae7850a8e3e2962f6ef93ea4c631de5d78e729ec5bc +0x3beea0b373ed09cf1c919c51d86d642c9125e0ee81698dc4cbadf02e9e6925efb562fd9b87301a6377ca192be79c4118deabc450b54639000c2e312945451fb5 +784 +0x4022f930c7033b00d986c65ff6bbbdf9ebd0e58c52844ff658df3893c3202dc533f873d4a7f5a5f944419fb5528c9b6788479a1e891306acae7995fc06db70a59baa95bef7da79f5e793f2db7f2a55825e4fdb4a34884af881ded1089fd5334502a2 +0x0358775bbb733ccc49e78f544aeee512370d480d0e13c7e8d5c444c423e592146b45fdb91a1b694d35e36b60e4bc8397fca8bb9790e619339778b9cd1abe3fe9 +792 +0x1cb77ba43ce77e236b9fc925f589b1c070780a84f99e8f50c1ff846ac92599cfe91612c8178325bee642a34f4dffdba2aa2ebcf7064339829b26f27993e1106c139c70d578cc05f0e1a777cceddb10a2c67fd9675e4a009df8037d6eeb38f5fba233df +0x6502f46551a3fab3a96428fb97801d7a4aa2f17fef6603238df84e17c74309ed3d9489c8b16a9384ee634a3f86d0b3ba9a4dbc9c51ec8bd4bf8d61de6d3d87d7 +800 +0x52167de2d6c502d99fa10c27b2ab6203bdebc2cafbbfdef15872a43dd610c2362f796ad9bcb5528d95870058fa454453f1e6065b315d410a3f2650e5d71e69d78d9767dfb4accc057fd2069266b0f180cb319e30ded7535bbe52d24be151de4bb598fc5c +0x25cb3ed3983a91b4cf37a65193916c5e3e211b63e943e2f7b50a85d349a463b941aad33eff16561bdfdc92fda06a4e1d94b162de48f06d3c626940b31020925f +808 +0xcede6697d422ddaa78e2d55ae080b8b9e9356c69bc558201a2d4b0b3190a812c27b34bbcee3a62b781378b1bf636b372bcbae1fa2f816a046a0a649a5c555c641fea4ccd841cc761f38f777972f8c91b0324e71c333ce787f04741439bf087ef5e895011c0 +0x0be42a25d77ac6ad995c6be48e783380bad25a61732f87cefb0cce1a769cd69081f494a1a12d657664ef2b4d9c41f2ee83f6e9a84327d8756af9f985595e7d3b +816 +0x56d18d3e2e496440d0a5c9e1bcb464faf5bc70a8b562124f5fc9e9deb5fee6544b945e833b8b5d131b773ecb2cdd780cd4e1bb9e4f1e3cb0a1d64d19cf4b30e44e6c2d0cbcb4e284ce50db7a8a8062ddb63f981d9026c532bf8eeddf8af5a43848a32262178c +0x982dc61c91a93770582eee8025aa55da8e9edb966bf5cf70d4a6534c0d53a2789a8c4fb65b7fed478cda02ed1e0d198d85c5c735b2417c5fab5d34e969fc8e7e +824 +0x25a7320dfaec5af65da4d0f8688e29e8e95532ecc16679ea8aff0f407d898db6922855b0e8901aa9681aa3dca617cb440764cdc7293fbeaf7f585b593c2b0531738e0ade7c8626b9995f4a84d9fc9b593d6bbee01abc53c5be14bf6956fd2fd81000dafc7c7686 +0x749c928c3d5510925bfe98659025b0ed7c01acd4d59a9bf1c54863a088091771dc9d407bdbf83b0f44b0902e10349ba79c84d0981d5e8c4f5c733a117fed0790 +832 +0x3d7177b28ffd916e7e0634895833ba0bd9e0653df2cc4202c811536a005aec853a505e75db55d3c7107579041099e382a1feac80dde65d72368e909ab85f56d88e68d7c3c80c38f85bf8c2b36959409cc34ba8e3ad94fe8ee1927612d672d92141a329c4dd8a88a9 +0x14a331508cd7d94fcce56a66bf65f20870a281c8442f8dbd4c2371454a2b66f8d0994a0b67692e771efc6a5e0b887acae7d6f4ec7338e1aa89f2abc7034c4e4c +840 +0xc033e4a512297caecdbead892b11a9f7007af9a74bcab89e0bd4ffdd542ca03ea12e17a06c42bd43fc5f3f757fce4f6f5831997abac3f95676e1ebdb11ca43e11aa31e5ebabe18ce8d1bbfd8b02f482e1ce581b532e307e6960eb97441506c2ed299e1282523f41527 +0x95ac9b7d22aa458921874c4b4331e7d64761853217c3f83c601abcbccd7e2eaa6ca6ce9a22ebcfe5046d52f8a09097f043ab8bc59243fd770090bb432c3155e9 +848 +0x69fff0f1a3dbfb36e32f025819fa99ea9a0edaef73145bf7fcd05d8bb0a646cb3b5d5256d524856acfd2e44d6b72e4ebf1ff23c0ff6c56f821e782d5a15f7052a1445b06668eeb4af700679ee7ae26496fbd4640c06aa149964dfd6011df835ac13b73c8ff21151e8440 +0x45d4daa652558d1c12beb0f5662c712f325b4c802fc6eb9ee039c949d002bb786f1a732712be941f9c5c79b3e5c43064d63a38578e5a54ee526acb735b9ad45f +856 +0xb2c439c97ab7c63736b3796324d68eeb7a471ed142bd9622684167d61234fff82f93f907537a909bc2e75a4bcbc133cf57197662c1af746ae8b81e5b83de05d9b589851de25d3c99c004c1dfb12d93bf50d450af49c428716f5b90ef088e3b6a6b2c46d3ce67b379599018 +0xc48ec83be5fa669e6ec8db90aca9676cfe2ec0d5e8e7a2431687bb953c0a300be3db4075cca3bac4dfa4d971baf0fa1aff46639db4b238856ff36d1dfcd520f1 +864 +0xc016f522f26b7470e922b9a287e6d45f6c28813b68c1457e36d9ba266708272f9cbc5411f8db9d8bd5a9449fb6eb0cde7d4d03e5df019f2814a90ceed377c59d7d92623899bcb0268033073559d4d8de488686cbe3d67796e6df6ad4276d0b52cc62c49ebb58d7c95287aa6c +0x7402f1a99b47e102b3b73140c6771b07ee6c33b3715e9c4027c441bee40511b735d95e508baea78da26fded9b7038e9a53defa58448aba40dc1e62d7ec592107 +872 +0xa766b2a7ef916721f4677b67dbc65ef9b4d1bda1ad4e53fc854b0236440822152a111939e5ab2ba207719472b63fd4f4a54f4bde44a205d334a2d72cfe05abf804f41841b86d36920be6b0b529331ac163a985556c84511ec986439f83e1d7311f57d848cfa02df9ea0cf6b99a +0xddd60f93a3babc78299cf763e7919d45ac6f479700e1adb05ab137acdf89c1521ecb9dfeacd091e58ca57a1db964a9c3cd1fa39192cc1e9f734caa1c5fa62975 +880 +0x10f2be77a4055771a67007cd8630e3230e38288499cb160380290174d66da57455b6baaa9785c84c8a663de41ed3bd544055b9170cec43cb3eb120eceaba1fe36e3eaa3fa4f99b425cd2519f09bc0282bada52d14ce625b1ded3b24d86b1dad342d2b7be322b775b04fc6b86afb4 +0xa872fa33d463b3343cec57c20c66979c33e1ad067bfc703454696aab5dd0003bc194318f4a8ebbc74503feb7211a472dadee991efe3e38f21a1310f8a76eac80 +888 +0x324533e685f1852e358eea8ea8b81c288b3f3beb1f2bc2b8d3fdbac318382e3d7120de30c9c237aa0a34831deb1e5e060a7969cd3a9742ec1e64b354f7eb290cba1c681c66cc7ea994fdf5614f604d1a2718aab581c1c94931b1387e4b7dc73635bf3a7301174075fa70a9227d85d3 +0x3b26c5170729d0814153becb95f1b65cd42f9a6d0649d914e4f69d938b5e9dc041cd0f5c8da0b484d7c7bc7b1bdefb08fe8b1bfedc81109345bc9e9a399feedf +896 +0x518985977ee21d2bf622a20567124fcbf11c72df805365835ab3c041f4a9cd8a0ad63c9dee1018aa21a9fa3720f47dc48006f1aa3dba544950f87e627f369bc2793ede21223274492cceb77be7eea50e5a509059929a16d33a9f54796cde5770c74bd3ecc25318503f1a41976407aff2 +0xc00926a374cde55b8fbd77f50da1363da19744d3f464e07ce31794c5a61b6f9c85689fa1cfe136553527fd876be91673c2cac2dd157b2defea360851b6d92cf4 +904 +0x9159767275ba6f79cbb3d58c0108339d8c6a41138991ab7aa58b14793b545b04bda61dd255127b12cc501d5aaad476e09fa14aec21626e8d57b7d08c36cdb79eea314bdd77e65779a0b54eab08c48ceb976adf631f4246a33f7ef896887ea8b5dfa2087a225c8c180f8970696101fc283b +0x3cd3380a90868de17dee4bd4d7f90d7512696f0a92b2d089240d61a9d20cd3af094c78bf466c2d404dd2f662ec5f4a299be2adeadf627b98e50e1c072b769d62 +912 +0xfe2d8ae200e6657fdc7494af5a12b2ae940348f1f983f0ba98febbe99c80d115126d57dbf37296765ebb5990256696588b3851d54c8fbe7ade98a6faf7c20b5e4f730f54a7f912ca0ac31bbb53d17949ef69aa0de40c7bab12a871a9b90f68813ca87af4256422a268f4a1d8ec3aa1a947fd +0x8025a8608df0f6a01c34cdec012d4cb25852e1b100b68172fc4e86ac8b7126b64859cb9e767a7e59060989cedbd925afc475ca7369bd43f85ae590e224e036dd +920 +0xdc28484ebfd293d62ac759d5754bdf502423e4d419fa79020805134b2ce3dff738c7556c91d810adbad8dd210f041296b73c2185d4646c97fc0a5b69ed49ac8c7ced0bd1cfd7e3c3cca47374d189247da6811a40b0ab097067ed4ad40ade2e4791e39204e398b3204971445822a1be0dd93af8 +0x615115d2e8b62e345adaa4bdb95395a3b4fe27d71c4a111b86c1841463c5f03d6b20d164a39948ab08ae060720d05c10f6022e5c8caf2fa3bca2e04d9c539ded +928 +0x5af8c0f26db4e99b47ec2e4a01a786e77899e46d464ac337f175027b61aef3149848af849d76ac39b9b0910fe6594817859e55974fa167518ed72d088dae6b414d744d477974fb719c626da792f981233de24b7579d8acca510a266d73c0ee8ee1424343eaf6ffcc59c86c1becce5894072c6c11 +0x09da284d5b6556508be54c8ab6c97bbd472995c6bbd585917ecdb54ea9167208daaa070a7b2b7d8e93ce1315f0d1ef8d69667429c44dc5ee1499de57b229a398 +936 +0x49cd0ba0df5bb3f43f68464e3e83e9cbd5d5ee077ffa5591e30f939cb30c93f7d454fb3fbf8bb05327a89c08dc4baf1eef50237317a405775357f1e0d1f31d9f0f0d98124019d47bf18363b1ecfbfe155c10cbc83300e01bc9ce0347c596b35f411e6d8229ad2855e42022b0373ade98663c6d6e9c +0x30cbf0679a97c871574d2fc05d7aa760c6bc8a864b7d246c39b9e812f9b7ff7b4ef5197dd5b69493306688b8564de1ad47d75505c913ba6a78788f8caf5788bd +944 +0xa8a37dfc083ad2f47fff468738bf8b728eb7f1907e427fa15cb4424bc685e55ed7b2825c9c60b839ccc2fe5fb33e36f570cb8661609e630bda05ee641d938428867d90e00744a4aad494c93c5f6d1327878078590cdce1e647c9820818f467641fcd508e2f2ebfd0ff3d4f272393478f3b9e6f806b43 +0x8e1c91729be8eb40226f6c58a029380ef7edb9dc166a5c3cdbcefe90bd30d85cb7c4b248e66abf0a3a4c842281299bef6db88858d9e5ab5244f70b7969e1c072 +952 +0x36af17595494ef793c42f48410246df07d05936a918afe74cd005e537c586b2843701f5df8952242b74586f83339b48f4ba3a66bdeb457ecdf61784eac6765cd9b8c570dd628dbba6ae5836b9ac3dbcd795f9efdb8742a35bca232abf36eb3b6698b2933965802277ba953a6edcacaf330c1e4e8c7d45f +0x158bfc348a30b4fabbe355a7d44bdc2122a4c850444c03f289003ce01bfc1ebf3ecc0febb6a8ff523d25db7681b05bdce048d11943ab476c1967cf6556c4a120 +960 +0x42d66edc5f22e0c13c25504c5101a5d172d2db7209e461efa323c0bfaed27e5f808042ea9c3838ea31f9b76de465225ccfbd0c09ca0d9f07e9a43e3e46c7693e00a7e1d483900ddb0a629d5563456dbbf299ac91f92c3d3c17b05d180e6c87c6c93194c39d90273fcf4a482c56084f95e34c04311fa80438 +0x061afb119a3c60876e04c10f12ad0f4b977593dc5a2d21096a57e7d3f7d4d44fdef934b2c17d7530674e4f4a1c176dbdcc54811a22e1b8712e4192fc2d4bf8e8 +968 +0xf91bb2e1a9c4cd96bf250426b3a6afd9b87ac51e93254d2dae3b16ec686ba80fb0bd7a84d218660e9007593075bc4f4c66567f0c7a5fd2010c999a8a0efa81f89ff5bfefe0fb910f0442e6d4a7c55bbb618c69a79a2ddd82a0938927f6fe3a80f04beaeb7c7636e3435d12dcf1c6bb6ed0a4edb69c9657fa93 +0x6e692c8c694ee0a3565f37a299e0006b85ab4a821b20e76798220229f656efc6a20211a4e7e4ed77facde0d70e4d5d95bc8ed1d7a56d8df1446d562f044b344c +976 +0xd1eb961ca6a8f67c49b61e4d3ceaa2a1de6f0ea927b132bf987abdaa725b0e1e274e46830e99a2f75af608964df0dff9a99024fc6839bac5acd10202f921ac71a27fcda681aa3109ebf5f21ee3a849098ea3a551e844fae4b48b5c5bb97ccc802bc5520d68a14cb7e5fc056b67d889d876efb82d0e9a9a2499f1 +0x39b2c76ec207120de4b320c7fe069e602c9c38f257596da7369395e87eb64b3acff988c1839ac269d5012c093f9edd4b7cabf13bdea7d42e969ab108269c6ab0 +984 +0xadf2263200f376886ba7b6f5e4411d5f07f7d9d101590c73ace114bafbcb0fdc99269e87cd2cead2a1cfe5744394d333aba408a07e21f30233b65b907472e9e3c7d6e7aa6d2c47a08a1be7bb877913a6b5604c723384478911c339e3b5fe527c7e288705a89c95d970b443347897e79f6c522bafe62b11ef8f3135 +0x3c23d2d8cf4db6ac6a42e27208180f37668bef5ee0a3f879483c8e604e7f42583f202037b8d242c04a87345b8be6dc8b121d6484b9edad0d73c894c1288f5cae +992 +0x18e75b47d898ac629c48e80dbfb75dae1e1700b771165eccdb18d628bfc4063dd6c3839a7ec4cd1255c4821b078cd174647b320bb685541d517c579f6b8e3cdd2e109a610c7a921653b204ad018d0340d9938735b60262662016767e1d8824a64954086229c0e3b5bd9ad88c54c1dc5aa4e768ff1a9470ee6f6e998f +0x01c756b7c20b5f95fd2b079ab6a50f28b946fb16266b07c6060945dc4fe9e0d279c5b1505b9ec7d8f8f3c9ebf0c5ee9365aec08cf278d65b64daeccc19d3cbf4 +1000 +0xc2963342cfaa88ccd102a258e6d629f6b0d367dd55116502ca4451ea523623bc4175819a0648df3168e8ea8f10ed27354807d76e02ee1fdf1c9c655ee2b9fd08d557058dabdf8dcf964bfcacc996ae173971e26ea038d407c824260d06c2848a04a488c4c456dbcde2939e561ab908c4097b508638d6cda556465c9cc5 +0xa4d2f59393a5fea612c3c745f4bb9f41aaf3a3ce1679aa8afc1a62baa4ed452819418c8ae1a1e658757976692390fc43d4decf7d855cd8b498b6dc60cae05a90 +1008 +0x85360c3d4257d9878e2f5c16d3cd7d0747df3d231e1a8f63fddc69b3b1101af72153de4c8154b090c9815f2466e0e4f02f3af3a89a7fd04e306664f93e5490d4ce7fc169d553c520ae15dd02c7c613c39b4acd00e0c9a3c501566e52cecea11f7303dd1da61abf3f2532fd396047b1887255f4b256c0afcf58f3ae48c947 +0xe8352ddcac59e377ea0f9c32bbb43dfd1b6c829fad1954240c41b7c45b0b09db11064b64e2442a96f6530aac2c4abf3beb1eae77f2bce4efe88fee1a70cf5423 +1016 +0xc13e6ca3abb893aa5f82c4a8ef754460628af6b75af02168f45b72f8f09e45ed127c203bc7bb80ff0c7bd96f8cc6d8110868eb2cfc01037d8058992a6cf2effcbfe498c842e53a2e68a793867968ba18efc4a78b21cdf6a11e5de821dcabab14921ddb33625d48a13baffad6fe8272dbdf4433bd0f7b813c981269c388f001 +0x6e56f77f6883d0bd4face8b8d557f144661989f66d51b1fe4b8fc7124d66d9d20218616fea1bcf86c08d63bf8f2f21845a3e519083b937e70aa7c358310b5a7c +1024 +0xfd2203e467574e834ab07c9097ae164532f24be1eb5d88f1af7748ceff0d2c67a21f4e4097f9d3bb4e9fbf97186e0db6db0100230a52b453d421f8ab9c9a6043aa3295ea20d2f06a2f37470d8a99075f1b8a8336f6228cf08b5942fc1fb4299c7d2480e8e82bce175540bdfad7752bc95b577f229515394f3ae5cec870a4b2f8 +0xa21b1077d52b27ac545af63b32746c6e3c51cb0cb9f281eb9f3580a6d4996d5c9917d2a6e484627a9d5a06fa1b25327a9d710e027387fc3e07d7c4d14c6086cc \ No newline at end of file diff --git a/src/sha512/formal/model/PriniTestBench/testvectors/512_long_msg.txt b/src/sha512/formal/model/PriniTestBench/testvectors/512_long_msg.txt new file mode 100644 index 000000000..2cf6bbb17 --- /dev/null +++ b/src/sha512/formal/model/PriniTestBench/testvectors/512_long_msg.txt @@ -0,0 +1,384 @@ +1816 +0x4f05600950664d5190a2ebc29c9edb89c20079a4d3e6bc3b27d75e34e2fa3d02768502bd69790078598d5fcf3d6779bfed1284bbe5ad72fb456015181d9587d6e864c940564eaafb4f2fead4346ea09b6877d9340f6b82eb1515880872213da3ad88feba9f4f13817a71d6f90a1a17c43a15c038d988b5b29edffe2d6a062813cedbe852cde302b3e33b696846d2a8e36bd680efcc6cd3f9e9a4c1ae8cac10cc5244d131677140399176ed46700019a004a163806f7fa467fc4e17b4617bbd7641aaff7ff56396ba8c08a8be100b33a20b5daf134a2aefa5e1c3496770dcf6baa4f7bb +0xa9db490c708cc72548d78635aa7da79bb253f945d710e5cb677a474efc7c65a2aab45bc7ca1113c8ce0f3c32e1399de9c459535e8816521ab714b2a6cd200525 +2608 +0xd5e378ae9fc2648f4a13bbec4b0935afb4f822f5fe0d5063053d2fbd547b33b4a32e7a009ee2afafe83d2ebd603568e4a38189b5d24d59e8953260f15f654ed4f42f9a39299d68c3eb78b09e83779d5718b433f1765d35350eac46493d194e84d1ce1f81c95b59725cab8ab73d369ab01e7967cf73a3acf1789227ee75fdfb6e40f353ff0484486542be053115db2896bab86c774f8985c4dbcc4c078f7b1c3a4c867cdc6580fe44a598673494cc0fb1f6598b1295768a584041fdbd14fa7b90fa6fe33f71b743b68e23f8e7407217aad9440cc8cad28152aedb82388be2de165496d051b292de6303460273a43508296b6237c07804335d2e81229f7c9a0e7761e38a3aaf7799f40fe9cb00457ea9d5b59953232676681fc71b261a6f8cd359293f5b21f0cf3a11b7f49cb5adb3c357bed2aa185d8fe8408192d6d3ed1ff465b590892efe03 +0xa70c75b9b1f0ac2ed2c2797763ac9a6601d95f46889b00fc3ddae4d0ac6923750a108d79eb764e77ac07b7cb5c01cb4b3747dcf69ba3b35c51fb995da2632e70 +3400 +0x4f7a5618870945b89f194e31b1aa802c5350326dc691df58708e34b48ce666b021d7c92330a69f1832412d8ac224156c9679dfedb383d9f9e13c21035d3d0002cfdf79b97ba0223cbbc833b0ad4cdd5229f2ddbbf6b650623d6cc9623da8a17d41db8e61cfbe772b23f4872adceb81e5f403535ff5f2ed996a67535994edf12a5f1230a494c946ed500e5280b5c8a82ddff369611afe58a85272e870cbd59a1012ce8509338a368b2c5dbb3ba2adfb33d30c494acca43896dbd8b030482841374055b81812c6f00c9e2bebe2096021feb69418a272aa356cefdfd22074ae91a8d2f1ef599a481c788dbe0afd54aac39672d401ef76d9f83175d177c9b72e2f6ab1e7525533d761d8e3603f14ea538904ed142abb3ff929ed55f4c6b17a72c685c3820b93463a67338756b2b033231a4f119cbb8d35d270a97791e8622340fc02f2093f9b393ad79161eb8c5897e21f7fc4b3ddeec02b736cc3ef04641c6179e825c319f6769f59fa5966f5957e573f9df0a2b76548cedd3e2158433dcb9de63f44f9be2b63319477570e14ee504b23b07cb2737a358154277912cd779abbeb1036f459c26ab7310f43 +0x713d5c26de17e1440a36aab93f7cd8111cd62fd8bea5099b2b6bf93e470e1eaeab8b925c646e9e67ce01b03b33d2b500b9400e59f0ecdfb00dd7ddcd230cc837 +4192 +0x5e0e84419c02ddda289aa126bdb40a060464aa58b88bad2708ab5f1e3df9ee439cb470e28eb627c6fe4904af033b6b01bf3536ba8748fca643c993d6185fd34e455a9dfe4b461cf451c04bcfc689b87748d9870bc5f6b91be004af18961fe90821a7147e1cdb44cae9aa7e6d50c579d068f9a535bbbc6deda506b9cbfd62b8daf744dc4b499d26b18dada371e7183773e73d991eb1c39f845b74bcd9964fc72a91d8fd4b1ab34a120771c4c2d4aa78ca8d4c6ab0ee32d748caf9bd29a90f9e61b50c8068d74638531d9fe84a5fa2c73c22cf20d1bc329ea1b93bc6a37ec9c5e82c886c89c77d79de98df18f0cf29a9316d6dc46b61eb7af7f1e2de2f5ca6c525bef3c996338194193fd85b9c6e66a81137cf5d652684f6b23b970eb58dce248232f6a0766379116edc33b93682824b45489cf3a75326973a5d025d1d57686d665238f8139f8e794435973aa754a41a33687d8f1930f8e7f71fcad34f039c2539e462d9542fe8520214ade7d52cf59e445f1a37a305236d524b977834d894d662b11b4b215aae27123f1dc7a9529d5ee0f41af62d19ceb1b1a71355b22075074b810c57626a097ddb7e8ee20b0dc3e370f126d19fb5223c7dfde471b2216a415b1cdc04ffa520dec59ba941e4a68fb35a1ce5d2e12147951f13b2d41d25980bfa49345be1541cd1385c15eb1a652a58083d0000dba56444fdb12687d9722aed90d2bc62eebe24df9c8b7ae897 +0xd4a3b38f18b048e61686c2159c666469ce9a9400632fd40ac1d6ed33162b921b95ac26238af9fa00a4314a6046e1733fd4fadc6033f3ac33d2b8c202afa5f02f +4984 +0xf516561edc530bf7aa1a63307d62812fb560dd5da66297298ffb0c4fd060a85a5712fb675cbd0e2d4e60f73a0dafab7f59b6140f8bbe63248274a863e1489f617814cd65fffecc700a9fe47a3965dbffaf350dbac655bfb1018ab071437df19b3e63f79f2dddefc8c61d51796a4bb8b6a027f1e5c1ef51d6f5834c025dc7441092499f9e4f241c3d6a2467bd092aebac12d2e719e354c49d44a8a69d99ee41c95d0ceee8cb99fdd8defa4dd07cca1be9ee8018dd944bbe0ed741e3ca5eb98fcd85f50b070b053aa00ae72c3a2df3f1761d77abb93c9ee73096962e1115f1d624f44c1e83752f7b9ed7352c81826d145a86ffc9354313e90b69eeadfb245ec0d7905951e273e167d82b2a742fe5ff2e9d10629ada127369a73993880ff4c8f3ed4363caae6ce1a658f0102dcbbd73e448a5e6452f0f85120deccbe8d5edf7176ef3b4b16ec8f8e1260c2d7ede728fe0612cd5f3bda31389446cdff5d677b3d5638a922fabeeeec04869ca90ef6c1ccaf38c75cb0a36e379549f17d699fbc3d5d3ef466cec488beac8ed2e8b8612e14903af0ff6a031bf88466fbab4a7dff0bec60a188fb93d9708ad82a3962ccea8069b7cea9b07fa6d5e21c312b6868d023844c34fc09a35d9c1000f6fd9670737a9c2db50e3c5fbb5a4ed826505c06bc1ed5602352918981abec87bdb7dc22657d981b487f6649b6102b296fcc8dde3f48203af10efbacf22a60db02faac291d03edfefd8fb6c41371f79e61f28635c65a254b2293d0940b922d895b387f1b16a81e4758b1a635701a4495a154ddc3edaf34ff3c8398c54a7da3012af3dd6eeed4a982ce87dd34485382bda285ecff01c1dfe5b350bcb73b3751d0f6af3f9b12040 +0x1288010a5092c66dc87771687ca6227139ce5dcb48a79dbcacb22bd365f661fb1229493c662881b86bf1eca2071095bde47c96b992ee16d3e3277662cdbf960c +5776 +0xbc4b7d3a380be067ed7a2a02f6137cf2aaa6f5332aa0dd34368d237e45db0a97d4e11f26fe206e574dc8f581d07e59076d5cd87c79397f0a862b9d147c4b771aecb83ddda0df3dc477f9577f70d4b1ea04d7ac34b9411640f4b1a14b0eeb93d0abd9c0a847d0b57612153742fea0ec64161f57a4113e0a9f2726166d2343c780ba4b8ecf1b7c3f34c7257c13a367713d4b3dc314aabac2efc892e6c0e2dc79f4c016919a436a41c83e2f103a86b3aa3d4d38d6cbab3ca8f87efef88d743d13f26643af51e82225f81e3edaffd10bfe2bc1187a133d4d2381f271341b01eefb4354d9d23b312d518d0f57c2aaa9f8d5d152e6963288749b54cbf382b4b0789baf31e0e1a147122f4fbb84b082380198f5a6a91171b3397837b28cca9ea96259fda561c4cb51592505c7cc8cd0a6aead606569d518e72423f34f45f42215349ff75a626301788b9d79de383edc1b877dda382ec96f4bbe02504925e8881c77d463f5eea68be42ffe71a6ceafeebe15702bc701d5be088e7e1549348f18e5b25f0a210a75b0bccdb0b6c798c54eb7dfef1ab9e9e14c451c000cf67bcf1a996daab484c0b8ba29ed1b10ea9e69442f6d6070b6efd5622bf1eefbf90191d55f311c28c61757ef5218a746b7e784174e482cf5681a9948e294b1abf9cfbe9260841d3090183a9860d5bc22d57bfc103bf7bc7174721646918db2e49feb3c99c3f115928ac949fc7aadc26aed62bb771f0277ac85ff32a46065586d935ff532b1fd6c175b346d65c92721e7a6a4a79421f2c46d41cad6a978a30a107c33cfa552328b87ab618c1974cb4161a94aaaae6a4e0d7e50daeb9e01cf3293026db439cd17d8aa24568f61a4218aa09d5cab0e219eb9a55b3757cb227237bfce178b374b34bc486c1d5f8581b2656b2be091fd6f6b30ab0aea04780413815c88383ce7f312a0282bbee2cd3205388bfbe046c17c3bd95804fad8edcf3a7832d8d9ae91ee38ea130a3f0281e0a26cc9b463b1a26f991e73f26f +0x34b4cf4ed7281ecb07f381e9fc3805072238e21ea0d1d2c5ec0ad3b23ea700247b8e9535de9fac6783f955166c4ca9a90f4caa47056fa9f313be75daf27ec8d2 +6568 +0xedba7d6312144e90ec9eaace7576045a46e553dcb8ee5a9849272de841c8f1ea9502e3760b929c539f9593aa259ee3ba31064ece3483826ce7fc9cd0ed9ceb99b426f6c19c88c0d25bb24a57a0a85a91f6d67b6ceba545b1724bde7d87e7c1f211cdbe2c0c1e4277e79dd9bf2bbdf1485effe19f277a2ad0b3bbfcd956d0fc5f76a044a0a57eaba90dfd47c8110531453126884d2e2db92f6ff5fdcba4802346a9468f03adcd83cf937a9d5c98a7a1f137f6795f4ae47a3771a1e93ab71fbe117368a73f6d36505342bde2620acccab43714bbbec0c7f6508066c910d9d455279cae953a2ddf9c9ce26e1ec2ad9b32f7fb2b5650db00b4e363eca4344fc771f0ecbf60de35f0ee123b355a64ca3d632049e153ffe2b43c56e3dc828e642199d42b441011cc92cf1d14b89d30a8d9e599eadeb9b21c0e1713c8de6b065f0a563b20e4aebd3becc62537a2ef0e91983ec8a6cb9051d233cc80da99688487a92f8d944841c9cb285b926a9958e6cba2f8174450e1c34d4ee307e0b680f02627ac324f18d11dc16b16cc7645e1a09f1e9aed8e14b3f2d285e50fa4dcbc3282ab559319fb67a168e0803b235091245534adb14ac00ec5ac0059ffecb42232e35eb316ba99093d07ac2048385f715a350eb8cd41fbfa2421e8c74181e6bdd993684d24f99bc2d9e5fa7e597f1d872a87d143a83b6e80f77b65b73c2b19920dd9f0ab269fa9975d4bf023d8be2fdd7d92a8d7aa00c1a726009eb258b1f5abb7fc1e5682746a92b181b6962bbe407b399fb9fb3b579b789af9bc3ffddd240fc0451bd5a24087babdcf755fbc47f66748f62c37c309a4f939ade6e793754bc60efc0fb0eccba7176a7d5507f121f9ab90df2a13aadf8534ec664531824215d98b692270cadd73b29ed27d153413f24ffba2db18589ee6319c6a01a5330c274f1dd37a9ca33d939242171611ece68959708666cd36116ef72f0341cb0c9b2c30ae8442bcdeb4aebf3f954784806265d3d6d4f3baaaffc68e8f762d2c76b6ca8425c2a059e50a6c427b9139f55a4f2fc417d5ac681d2f96fea20eef4fda27a9546ad6bcfa1f077722e05613ece1758e351aceb75ef86a854f5212acbc9eb472a76508bf27f4727467552bfef17d9c2b2dc70a3c24a1783b8a85c9 +0xffcb3b313e576ea5b0a87449749b82c1523947ad019c633401a185fbcb4fd475dfe42289c5413f440d083f73b65abcf2386e0eff39acfafa398a3d6b778fde23 +7360 +0x89eb3056770a6157f06921bc153834447c4b6d862d10d185f1c3f984cde5b81cc9eafe8bf532fc4fae3a89f41e14c52a0214fc1ab0cdcdfa583b8bdf8a42e3d3f857bf287e7e6b0c5f74f65dd22ddcbebd81e1eac022404875d105c0f6d1b8cea09c3bd417d6f5b58a7f319f396cc02834f8e69d65f77496d0eb31ce1a7b7e3248203a38ca22e472b8c3ff635bb9bb91efe2d1dba734af0df2f3d5b2fd267f2a794b84fc9e4a7e6d70a82b5141fd132177a86b4e8fc13ad5624fba14a7bb01dbba85e0c79c360ccb3a967b10f21e11ff53b07c9c24865d15a869a89a21234d7093361841caced5b79ef5b9497606fd540b64cc6d6f6b5ff64da767ef7244ab0f8cc6f21332fb2357252daba3d69b1f47282b226a76598a9fd873beb9a20862e12e9e37e5dca33cd356a61ac719c7be01316c483a43362438d13476a1ba56bc0d0024af5eceaf6954bac8cd5c477124a9ae910486deec76ebc151574ec115ffbb8bc121271208f202d7fc8e0b6981976827011ff64d61c8de2f342969bf2f741555dd56e8b0941f0438a8237c85de6066252461319a7f6239a344b499bd8b6340e8e11748ae3d388362365556a672c7ca2f6291e0cd2c8b25a5e9c087c1111467cc332aef16ea84a6df0cec41d12413bdce2379aaec528ccabe8b14dad6a9ceb0873d5786f0834c963594b0e710dc8e6689cfdf3801d8ad4f7592793b013bdb43a36668b542efd87aef3469ed6a827eeee8ce8c3113a636dc5367b7524caf8149a81523231618707b9256defee8ff2c7c7388483e2ba46f9bdf7096c6beed09ea1cb4527973e55cc1a861d8c09039e039b366da0750baa0b2a116de405fdebb4d89aabb5e623ee373b9bd1fdb6c19e24c2fce0c338ad0104921c156673868de9b765f277be90b4fb94bd17bf8848779de6f29a46be1ce0889e8dac7e45074bcfb6c3b5d781334e6bce807b4bfde6cee17fce06b565e9cd0997dc7f95eb0eb9b96f2a627fce5a2f1a417c691d784ae891e5d59299d0822b0a268f2b47e5eb3c49490084baf693bb7996177dbe97e37921c1afea6e7e849f0cc32c1c0ec64b67f1ccec9923aa6e882c24c805a9cd2ed5138bc36a9dd04f7d73e629ee44fcada13563551c445a4929847624ad6998aba0e9bca68fc276615ae2180f0e94f9609ca6b4c08a9776c1f42512b3d1787ae85106cccfe656c168cbd9c141f9895d22aea839b5708790579c8082ec1e40f4436a0d44b5fad541a424cd8a793b7c98525bcc5aba4abf277867293f33f07d956b406fbcef39c897c21a3fd +0x6b8be942ecd6e8509b88c0ebed80e0e2193eccf212430429e7d3d097285726e85e0d1d22d046cfbf37f80f922e36bb1c3b9e9d43cbbc477dc80eefc783adc20b +8152 +0xafdccc84f257cb768b7ad735edbd1990b6114bad876928ab1279208574bd513ac6beb32bee9192c4bba0425e32ad0e64221371b5ff4f894aecc0c8191aabed3951823246cc66c7074aea804e621acb2017bce416acd54c03ba6f77d77f9ac4c479b1b39f33de538860e0f9cd260c370cbc920c983702591ea10f94894c92c02265d29dfccc021c8f230b15a3268c3c703a1f520348df98e3cb2789f5289cc89d3f6d58263fd90b64bef23d9709a1c193b8eb1c1e8672f19a603fbde4bcbec57b2c0a4ce5336b084e571ed7737754afbe5f7cd3b29ac54d8a87df981db0029d055632e10051c1fc9617154dfd1aacec39575ce0872be092fc6990826aab703983e56c7f4140e2cd85256105fe97b1614cc713a965e2c9aa382ed9e391550f813d01418e6ea8d66561aa89693d996bf63fd7279814678a7b86fd43235b57e75d7ad038765033a6aa72cd16df84c6e39459b122145b612bef2efe55aa905900b6847dd99faf87598602b78fd199c62021e37a8c840479b2ed775b97e1f8026372a12eac71534cf7e0578f7ca645422a86255deb52d556295cab39912e5afb177b1a0c3a55032b899fba7e66c650e20aac6780c9e597a1972610c3ccfa80eb24b7373e0ab189cb16ad73acd499824dc77af10bada511010532ee1ecfae307b93103feca4eeabd6a6f1ca404e87a32c69d70a2720fa0d1f7a688f7522b033536b6d7c40917532f1425307625cf87a26f9adfcfca94c51a2feb03aee4e6a511ab4b5346058ade5c6f0bb713c8754d0e47de30db1d003a73399f236b1da42517976d2b07481fd8efdba1151f356036d0d0061866e1d87d57a5416cce74ea2fd17baab38a595cff33ea83defb2526d194a870faf5d1941a31e360444b833f11b9d8728131a1b8ade30c128939f01fa9c431cd5cfa34b97dbc848a5e64b0f9774b2e6318bfd9b95157b0db885e2ed13bd9fc69b2f6b3bf2431f91dff9c96dfcd0ffdeaee6739d5a60c894d60ca49e1e45078e4918db72bba5cc199bc759d288f72b77876da6aa4089bf5f6b720d9b85fd227ac7d01b7758c776e8c29624c8a3b0dfb9a568be49af5607755dfd446caeaa9995fd9f54d23371c6073aaf52d6b5c4c3adee1fe2030f9149de96f67299031713e4d3cfae0cb26d637ded5a0a8526fc7e5a4bd93b5fc9002ca3fca5beaaea0b397132a750ac3f82f752c1df745b5e1eb9c9a4e0f1e5436c59cb79515128cd4db343006e633a4177278ea085b9e2c5f21b00e27a2b1de69c775ef443529b13a62862276d0e3f20159d3a719501a2c3424d09ebf011901a5a2f6554c4ea8924de40d78dec7a424324015e1c577322c1d4f6eca98acdc5486c29e6831a417c68bda4a91c32cecb146cfa00881338ea2571bfaf038f8444d69b0cec688d7efb470bfce0ba893362fab4312a9f11778259 +0x014fd2fa6b05c4fca1a5c0753f15c940b5f976b41a40bf6bb14afe839d83a4676173940717bb7e746a2ac77f573e6744cf0002b78b5b7f664e22434e22d0ccd0 +8944 +0x7a26b7f55809d58528540601c87db4bb8e908c3d2d82823addc315c4b612d4be5d952195e329352beaf764140a48a205739a4789d3f20ff67a7565a0bc32e14c96430fe895147279f402c85404289091d175cabd0302fecf02a37f5d5ebdf1106d570956367394568d9ebb2980c68547f24c9d3f865a56acbf77ec6465580df22af997478deda4acfff3c4fb44c9890f1d45497924a11f74f717331c98ad3bda14534223632ba86290286b321adaa4d1998855d1a4806111f3abdcecc16485b0748a915280d4ab6089653836c8a1df75af3e49b1d09e256afb5c703ea625f35c92c90d3cac91b28e32d4b47016c541e3a78fae806ea472675651767911978cc7b6363c49af0ac7d4d29a6646ceefd304c9a20aa6473951f04eb47604c86258d728f9a8e250e6f11ab2e2d621b6c69cbe5ca0e88b2306c9ed29aaf849932f5f752f3bd96d58ce39481bd28d6a98f3a4faaab0cd97cab2e246305d85af3ca6aa8a152456549069a546539212873a1df3a1f9fb433203e6a4e4abf5a49e896e40fc20dba7fdbd6040fca24bede264ed929992a9d1c4974a18ade299de7e443029b5998954d2aa5a0f525225a7e1e00a88ccbde100b54f85458a1c72bab833936e9bc855e5391e001c31aa47c7ee751edd20c2cb566df1403463a3a8c0b21f401698f468e39ce0fa6e7ff1dad570eace997fe8905d544522eb21bd6278d5cfde299366e9d662b9ef0d2670055acf08c4c5d078589dd215d474aab3c86b890d16b073670144f37187020c6ff1dd7297a869fbba4a9d5027fdd7e8cd0420379f90b1223dd8b7b7d06b541b35c5e6c35f218be7f68fe53444461ac2523b1f454ef337873095b6169e430b390caafd2927d8357e744efde83457471f8c98f11de2e7478a8a61ca78a2b630503ac8ab0cb9756ea77bb06ed2bfd765e9c1401d252316eb1391637945a56dc947084677d4db9f3f4a55ddbe5cad6f7d073a5e2bc7d9252a0a8fc44ee56f10e106be4deaea56feae5048fc78edc5c696613f18a46acbbf0d57caabcec0c8467d75a4048ab4f13bc69f9d3621ecd085b8df17960f75c28a9ae38b41833e78b7a77c0294e29b76fe8c209cb243c39753eb690c01f452862edb9419adf4c8460c66031f247708abee0abb8c9965d9dfd938e76481db68df54d853be18a9c4fbedc3f244ddd3615ab44759b712109673bea641683d4d1f95a49809c0aa2b9c5f01c431b9e77d0f49f84be06346cb621aab3e5f605ed1df6fc5239c688a01b63af174a8c669fd7b41611f3ad95c1ea59b480729940bf010366081f6fee1b37c5464d840b38bdc0c0997ca4d617d91c7bf3c09884b6d311ab21cbbfdcad6ca547503fadfc777a1296b43540342d1ad304e304c62cfac1c66aba2d79b1392cda86476e16e4b52d43c2d0dc642c67ff94910cbd9a166ef395ae999e0b7233d44dfea6495d68747fdac189c27f433b0fe78ccb6b72b595e115f33aadb3840feb761cf761ffdc37ba5e1f4997f00d28b42264c98eeeaf0232bde537dd208b3fdaf96db5386cd4719534389abd64eeb394fbc561a87c472630f3d0fb9 +0x5f1da3c03d633d35d6f28c1987ad25ae9e26b6afdebb2aed02f1719b706d20e5632b2005933db62129032fa3fd2304469928f6810af1742c27731a5beffb15bf +9736 +0x8ceddebd38f00406743a6756565ce762d3464435d50bd61b8de57fbe0b79df8f0c5cc66713d5ef6ebbe5eb3d4b845b3f8b2e625dd69e5ada71dac67b1b6f88ece5fe555f44f7657665a56f63c06bd44ef04d1bf6c2b19d9c8c67811dc0e8eb5ec0db71ecf4decfe41b82db11de97bb55abab554ac0cd0728869798ea216b6fac45fc03584b1093818485178fcd92761d6350f99ff9790048086ff42b67807ca01b68f4e970171b1549b50b25b4e46f6ec145f03e953df0c2baf97b27b9af7a00eb272ae88c7bcd68111ba01bbb130c0f6d91206fbba13f5f433c16284081d1955c428f9dc6c2134185bdbcb80ca9b7ca0e3c737a932e55e74c40ae74237dea2717c00a4f4776546a4ca54845cc2ed7654c4fd0a6466b9b227c0e29548b2c2b7ec3a98247361ef7a90fdb2d0a2628d3a9d1d11e3cfce177d87cad7110a014fd610906e1cebc4366c77665514f4021155e42ca4784dc1652d0f3256cf089bfc99991de0e2a016c088c284d9e5c42a0044c4a4232c60f9495d38a7f043c6fb5f5ef0239f1a32c2145bfce9bfb78552e083a8f42c74abde3a6a9e9c2203b797ceb28051f728366eb852a0f554feda15289f2b9d1ee570c89ef1ab7f6a736d09e110f41997910d6503093948584014d94ef3a71f88f372710d6ee9c2383759ba3d16b5faeee94a5daaec3053281fd817ca3db5fbe92303400c5ec42529b40031192030667b955fa11688209652e2967930b9d2a2bdf8b5cdf23dd4e8bd7df3072bba0dfcac29cfe7cc497482573cc246090477a475f90c63758896bd41f99494db60a91e2f2b0d8a32bcc6b7a382fe36b9aa3f91bf8869b8fccb83f375bb8772bea09c5b42fdbb10e06e71a6c659bca3d92774dae93b70270e73272bb7382e193bf65234a6263b146bbb1fc04e256015dde8c1e081969246111bead684f40b00d9de552ab7491ffd2b4f2ba4997a8b153e8aa153270e528eab2269847d8390b21ec53fbdf4badc43a5772fb446ddb02a81798d933827337933230da5ff4b71b581475c5efd1ff27070ef868fb4a361be3d2201313355a79e5f9a51bb98c0007397d1359e2ecce51c0404ea9781800258c83086bdb73e415676f4c055b895df84d90f75ec086646aed543a65c3bd82472c91198892235734a2fcef3e4fd116161ab3e87d9186079916b48544e22304aa4a641b13402dfcfd1c09546e9d4e73882a4fad5e5ed40006c4c7f7f0df30cd756e64d6b3ed781b995ffc443e4be6bc7705cd0fa82e5897da7ef5570ec1ce27d120f91211a2eefc2ff33f87556383380a3193d6040afa133dcda66f4991e458e6e98b96d56776e6e85e38e55dec0c306a380bca19f9a2be56384205465659a9db50822ba642f823ec2a5126fbef69ecbea29cb2900338de4e4731e2b0181762d9de46992c3d5df962def111d97382b42ff5ad581030a4bc4c82dcce2de005cb07193fa8105f8bb172037f709f803fd0e5bba8824289cea07972a99065b50b2c8e8bd51ffab06b9246206509f51e8887077bf4f9cd159ed1fd9e01f2029f11cc95bc71c89139e5e603bd0aa481564523bebef9855bddfd99ff8e4dbaa9a6fff4453379697e01e2f3d463d60bee2f5eea310b1fed91e7d13ea7cbf3b104d3bdecc67857cb69104803df983105e2b2bb2589eacefb193d04091edc5d9fbb2d34fc3f1371b6f86f015c4ce7835905e6441bede36e759b +0x1c7665a61930433fcc7660b36049c016a7c646dd1e8412721314f969d3661554b97b18fd35945109cfbfc783bdc424b204ab19afaac855c284daf7f2cb333a65 +10528 +0xeb22f73a99b3b00d6c9b15c8be5cf11a5435d561e398bbc1d3dee973423a18604cebd6ef8ab6291bd89475c85ca89f57c4737378ce4b433f0e09d17bec037043ec3a65d132d4939445cc588013e8b2a935eba610750ce2bc8da8a10d3234cf4e51756d8999f3389f39ab8597eb047037310435d1dec4de60d9211fd41eb57ea90506b6bec7fc5e653e99c6b6ece4222a3f26ea651359805279de1475b76ec57d90530819c5d84e0ddbfee1851f700fa9e8b98b711cb510bbf545479b0547ebf278c62b429a6d50c099429fab8b9181ddb225e1a0ffbed6c2d6c082ec11293a2f47c5e6e04ea5aba6fecdc8d1382dbeed27d3b497c65e1990a3b68b10e2faf85d84ba039bea67a9e69407249e2f2d0f02cf29cc01797c234ce48f2bb080a46ea3b80c481d749a90a9e3597abb777abc443190f0841e003a1f22b22a74f40de42a6a237e0bf728a916722994cf18fa0ddad571eac8bfd1a731e3895003451fa11922676d1078f83c56c9e038831b974aed4332807663d9b2a9b27b65067bc0ef996940dcd201f2919070e72f7f8738baa4043d7b3613ffa2b014f030249fda14d2c51694f999feefedf0a4416a64c5a6289ff8a2afd62bc16d93507a06b85459ebc1515e2e4904a095cf8135edbb2556a09ccdbf8ab4455509b6040b53ce16060de259001918eceaaf98e5d5af934212358423986eb536a7ab0572abb4ea08635fb29642610e9e1663d038e759f403220fdd61f704e2e4ff7c090322d11212b80ab871eeae33036bdb01e13492e650cd5532f1a2f44238a5a4491f3751511c4c357c50caaa9001333cb24a840372115d30083a61e5dd1ae04a4e2fb4ddac0e6809879ca0fb2c81b4b16cda9f539f2e18c7e9a4fe80bc73f9969e995f1c2dd054ae60be36490f6c385fb6f94c2b769047435c973f6ce62938b1c3c700b7db4a584b8f1c543d42a80571180f5533fd1d31cbea7bee516326e5c3451f6155be65bc089d20c47ecc1f630d1a8480123ebe208819b8d1d93c5048f3aa0b499fdf07c70e11314db5b5b79c5c45c19671415c5aa174b6b1aa7891a96a7cf27f3c4519c28573b6b68a065af785202c5ef70cdd283f80de556c1fd04f50423cccd5f884f5954c19c8a4c6efbbb0342ea24da92bd28ac79687c83af583cc8550f812012ea86422c14bacfd5e31070730281a202ca0a9d0470d65d0e78d06cc98cb9a6701231d80160749b38fa1af2398b90777cadac5235ab0ede990b5279f7b0d1632e4ade6eb80c324f16952d310cf1dbcb8ebc705493538058dd743578661852d6bbe90e7ed6749e5bed68e99543e1ce0eb79b092c9426d57c5a47ebd0ab2fc881979124a0d335f3323be9b29794c7e1b165bdd932be8178b98dfaf82b2d73acf44fc7c34d44cceb62707c2ac07600a1743799631f88efd490f711ecd073607a9f42f16cfc81b5d17d29a4b4a84e4897979bb2394b79ee838314013c790382bbe32fa27437306d6fe2c5f7e2a7a3fc4ecc109cbe3f07fa0000635d698d5456db70545f9b85d76ff123e3ea37570d98016224bd8472b99ed4a9638ae675ec6963c76f8d2550cd4a2fc0f200152ef1a889fa46990e7f15497beea32e55cb4216ef48cfbfb420a868564a7ebe1ea7e6aa3304f4b3cecc91865030909c1a15ec0bd884f36bca8dff671f00f898b65a53198712cda237d3c4d20c2fba78b5be4094b9fc7925caf118a2d4b4ee047eaecd7300942fc8fc3d15b90a2c9f28ab5cf66e0e2fdf5257e2aac831b6cda5da1dcc433a1999ac6e510aa7d4c7ad408d5a53e43f9f8495d3eb2c33909725e14b3fc6069e03a9d110c81a2af6716344be3f1f93d8bc0744d162f3718bc +0x97c433de3cd8f18b75e494bafc3c813e112b2261f1261ea6fab9dce0aaee5e5359f0e763f02154cac1589bb70c2cbe9cd22f976559032923c4e2beaf3f88f196 +11320 +0xbd361ca6c8d3531d4dc2415db16ff93d3e81d3c2b451113800a1c2814b8be7ae36b7d5cc64d1da003a3a23d7e2feddd796079b5a1b90f89c8bdc7d125827c5fd8eddde40580af36ec6112828cda2c6a690e69893ddfc951efba9be4ea34b4a954c0f01a9ac64e68f7bb018f87a41fad1b4869216037f2fe7d7724fdd33e0bf9ef8b704af66c9fa8ae07dbbf1efc4c2818a4f518a95000f1ea79ef66810cc6c3f1b3cb0fb902078887de1d9b9361466de9baa9c9899667eecf4957c9743f999a13c06cd353151a8b0db4539f857172e0f6efd3ce8199bc27944bea911d34d8eece37d23055243d22b810fa45758b7623d8bb1fa211c8623ec2283447fc8b2924798097911fae03e20f7a9e27d43db498f7b2f9cebab0feb6d134b17882b0fefdae4129904310f34b8c679bb141f6b2c2ec5deeaf0cd1e6026a17fe8d5034bebce4e004984ffb8fb1b75e9f7c1f54e5341f125aed58a9bcc3c5385800d5850cf4b5f3b52396dc3dc708c5f5d2ecc6e06f1886eae45ea6e75dab1c6a7d93205e3789d2b7ccd82191fdf9445b603acb28d661120b3e6f680a42644aa24e19a526e7e92388ee547a00c921402cae79e022fc714a28560b5b7a048939ac1cc971fba85c6cb522cc241eaae94fe6183a846363c195eec5c30fcb36927fc444332540db4c04a8e47fde5035e9ca1437fd566e8efa9bbb0826d3823b1863976ed72dab033081f0be100729dc8b55337822a4b8e054b219879765139473aba1f735f97eb2b26b091a0d1d20114667c0734b1db6fa988f86eea53313d54cbe6077c017405c4a267e82c7aeb776b3884793f71ffd501e7a9f87c0abe77ffbf24f5b16159482505abd72e03a746f5b2d3564872a00635f09affd8a5e22e71a0deb3b9862ffa77d7e3274e72ecb8d95cd165fabda44b6e2b344aa52b83acd1f57b073e78dc64e19e79a033d1a41340bee770fa59f5ecd421dfa38ca58b37484763bae5404ace8ce4d40a8627b6a051617b3df34e79318e5904d0351ae118fe1dfd9458e55f7f9f305c2dee7d0aa735ccf7968ba51a62c55b099a47926d971affb35c3f6f05c1430b79d114da88701387c1416a65bec6a0b058c96b1617fbc575ecdc41e723daa0fc93bd9f461842141b430639964fa648df572548acc78e260811da0754a113dd8b12ba38caa267600fe3afa040b44ae4707075875f6596663f881f39be66b423405e90876c0e251eeb0b02466cd5fa9dec0a83cf34d95caca3ba737e2d5c0599a4df07333644c5763822c9d4229afe9bda8c15c9350b2821bb0f9d7eaa6a4e683efee6e5302c8e917c90caf168eb9d05c260f41c69e442ec0ff067e23c78d6b79621f74461afca9742bcce4648b021032cede871d84af13727c39752ec6fe6af35b200f9d1b3bfb00f109c7bc9d1d0bfa19bb9708b267e278cf1f675c135c678a217caab8821b7026df3fe37f336f35ea8d22ec0896131e6c5e34cf4c3b3be3965ba1d038fe2f8b8e3cdba22cfc8d10bcafa100adae1529c5a006176fad1161a0701c1a9eddccaf8fa0799e5646db4ec8e7b27f587902970d3affca46f7815440f567d44aaf977ea38076328bb0ee2297cbe3b2a9755fe8bb95ae726298e04df05201a7ccf2046b82836e092da94a4eb1c291450121718159468e8a330fc2b1272c661fb62397e874ffcd7cccbe5425af725791001c0c035ea41c8c48dabd206ddb217666e2b688237c2127e96eb049d941b34126b373e13454d4e30478241e3ce4b0768f8e04cce67ee574f418c32dd7b710bfd5864dad82cf3448f6668bfd0cdf9f8a70a3f729667ea6fe7d6b213413591c77ad02fdcac289e708bf34796f56324b1cbab302100c01c22ef5c44f0f249e13030dc808bb6c0b39ccaf4060c7b1734fb7de49ba234f9ee370fdc2a11173fcb0dc8833f301f7c9b8ef4748d6a8a72919e65bc683e5b9ac778ee5d4cbed9a0b528e9ce54130ee4be0fb278c4f849fba4622a3b803a +0x44a012fccd62e69ae9a2e9e46427fa491b88f66522cdc1f4ab5c5157196b15dba3905b99c460bf690711797ea556fcf4b2550539151f80eeb522fbc00450c723 +12112 +0xcb7e0a2878bbccbb7dbdd8a2e2791ea2aeee73c909b5d9a19eda01aa43ea0e07dc4d9c787cd60188ce99d208b4fdaabb2d1226537c24349c87908ef87dd6810bbbf0f3b7f1e2a44b8093b4f727db6684dfdd23410397c241b4b706c37cb068f2310e17cf1d063e6b5b528559843cda638cf8717ce63609f6eff872f589a14c24064f11a6496b5650277f4d1513478fc1fb0a18eb6d2a9324fefbd975ecd1b409025de826bc397462acc115131c250c07f5bc2175e09be834aa67432bed672809eddda436c0972009b2c1e43be7fdd99b42b6930486b08e8cbbe4b8ffd48c308c8e7a4ebd9bade3ad0026c275bcf87fe7aa9f767fa8920f96f91c41d9e86755faaedaeda596a444b65f99b7a9e23e8551f51fd3cd8e69f3b92cb4e5a172211ebb15a589d5f9a4cc8c97c2ccbfa2f67343eae0b1d8805cc05c1b57ad3fbae114378b842b350cd401977048089f4448d22452871887c69300e98fab9f9b08d0bdd6d81ed9ad175d6d3fb2d47431105d285cf5bf10c2a7373ac75058c69ea416a401c31d9d25616798ed240d165e4d5d00539b2ea2716c70f75e2607272ed5da4e1e16267f85331909078f9cf80c4570df700c7cd57d5e65be16d960cc34e544459797e486b5d59b48f7bb2822243ebc4f1d0f52b2ccc23f1757300abc991a7d10d20ffcba9d8f16dd23705a9a8f816cd7c26e583f47e3258a89f4aeff43bdad373945192326a9b251f576da6a3356a600c5ef3586d60840a014edf39e1c15fb423203e1ca366a962ad3944f9afa0492508f5b918f6278b8e060e382a00b6c90ba270ffcb6b61bebf327946130cbd55a5188791660d17cb4d3d59e020df70894277f3213ef8f04d831583cb9368d0f238b18136a030d5c5cffdce51cedca322e0fa234ce7ea76d866ece55ffb32afb1885a8ef3580fc60d9eedb8278496b3286fcf8ddd46ae89e1c31f1a6dbb089e15ec79ed720dd88d053283c3bbd28c250c575e9f5cebb39dec30329f9f334920920d96490d22498f3f13365d99393b7d41303dd43637a8177a36bde14f2472dba844460e5f45d1312dc99c024a4913205972c3c903caeaaafe3f178c07ef1423eb28ffc9d2e8ee3753ce2b3e3952a1b2d7a7b6ea4005f9bcfac1d5fc53f3bb9dbd3429f7f27c1ef643894a8e011665a92e375db4758953c1e2578fbebdf2c7ada0fe5b05588fd1f27f83906e1be4ed77cfba4eb41ec5975e67789b5fa03cd6e838d0199e5f84b5b05a55835af44e97b35ea8f075963b22e6dc9d8f3b955247b1d761dc1f820b28b48677a9d124c402c04d7be955966a94ffd44ee1ef17d3c8af2f1c29055a83a97366526a6d17e59d330eabaff079c45c0dc0f529f6a231a844827776ec637eb6718c8e4b8b6813e59024d0aab2bae8e6952548cdceceec84f6840c4c31175cee435b73c3b87fef7a4c22536038f438c33a938253f3f864dd59a6331f7ff0ceaf4d75bb7970d9c8a9eb89dc76dfa04480427e5a42f2a94b1fc25b8477258a1478044dcdc341004012e2bda44533398c9c61683911477c0fcae53688d9de4dfee71c561347a58dd633b6507351c03a9175fbc397555ecb137d26a9b8cde6a6be6ada21246d2acd0b9afac4a223032dc3bb96230d75c52106a50b378ca9eb4f0371e23189aa2d5850a7149cb94f788db3cba4f903f9070849b107628d1468814eaab909bb8539ca35e6984b313d9cd4e224ccd80355910b6d4f9fbd3293caf7f063b30c2294ec7d3be7fa42a253ec8dcf6562228421ff84d1cf5899f58eaf1da93b84cb674fa1ebc309bf357548e422ebfbf97b1ed4af1f27cec69b7e8b615cd9a092c9f21be6b07bfa5b763273103ec85717443bf42c34dfac4e441610ae5ff211618a4b804745b70853976268fd3bd505301053f703605a1664066494d271933c758edc23302614d23c1b6da107a49294d8620f53a12c376bac54d2ae7a4c2d50433a3c7b2ddc05d67964eca1dbf3917474abc69091e2e83a8bd1f8b4024a311b5f3ee4debcd21a83a02647f1c6b35232996ff244623efcf196e03f5c06f64eec2def5de459a2c37824b217f7746e454dbb214ad57e9ad62f32122efcf4cac75133de101280b881129baac549418efb246e6218ca63811 +0xb4641572cf72bed4513dfc2771dfeafc1aa6dbf7f6b740998c905f2f48ae471d00eb0e284291290360c9763500a584bab1a1603a8017accd15c3db7fac25b572 +12904 +0x43331ce3faa34f02b379076a0fe38dca551dfd63148804b90afbe98e455dca1088742952f0f8a7f9d7ec0e38f92e95fed54c606d5799478fb380d84494199f7f76faa5b250503687772ee7d1bf24d8c2e314375e2741052f3ba91d3b63957233d56e98ed62d2861459e79a1fa9efdd7f451d891dcda7c8036a1dbf59faf9cb946d770aea6ea71e0946c02d08feb72c9ec4105e9291f517720885c688a06e320a05be0491bcf686cc0660aa7608a34e852895bea5ba507be4dc883baf9e1c30fd67ea8dca94e847c7617118500ddcca9e3953b23e92e27bc1afcf25b63c2a4cd559a4ae7d3da5e8611f98807e568a2850bff341455fd39f7249018c84c2c00ffaa4946e920054f101077fe9e72bd3f102811c74a26a4b6f5d72c77803780800d51061d5f1251dea11e3ce5b75d3e2ac1e4877523dfb7174ebf2c9f21aa627a7cc64b4eb83f4295cf8792ddf0f98dde10bdcace3fe596d358490ae01b193488c486a34b92eb4a0cf1e91427b9dc0ed193105622fcece683a91151faeb1889138b2e88a46dbafaac9ebf5b839089439daf88b413f93a08a0c784ac30000cd2a3270a75d9a732b6dd4c76c3521365ceaafc835f31a3718fa32a3f443ff87aa3c02ec6f56bedc7114771abd613a1060271d09cc1dc8a07ee13478de46b32e67ef318c071db900c9c53b4cb1e68c7ee719ae23196a52b81a669b61cf7525de4b6a46ba395993c57aa8a6c510691f693be7e97ee17fbf6533b2eec58e785c7d9fd6c9ddcbb25515cee742eda295fcb7a2ba5682ef07179113ecb50ce4f660f4ab5a425c86d206d70ba7972d2e0f2a5265ba7e980aa86223003d799d99973a2cb71f3aa1325eaef37a132beb7e82b120cc0ee826f90aa90343cdc0e27504f10c0b4d3913970155506350899058949a0b1edf1c9685d6f41924c3154240e58d7bef0bc51a7c6104d80e89368585edecfaa554a34e76b4494dea47fd25c1e11763aa81681eab26c372c2e4bb31cd36afd4a79604b8944bb287df8302f3c1a196ab85d8a987eaf99806c989a1fbf717eb836dccc73aa64436af499cab1508cd123bc83810be02828d7d69a1704dcd37a9ee3f1f753e7646ddad71bd80f15e0c93fbbbc82629bb68a9bdeb54ae8e153ff1fd64b7952bcafab0699f0c0af08b0622d3a5b17231dc53f4af97c9e52598d6c99826bbaf696b08b6cb1bb1d07a5664c6abd01a7d3e2fed773bb4299c7c1ea53ba7cb544c602117f8bc2cd55bf888ce886b822ccdb97adb394a8c9b5cfa6f544e129ca9f378b3cf7c221ba031d0e9eb6efb040fec0886c842c26548ac07528a0ac1e1e32c19ebda4ce73139dc6c416483439eea62951b5a9b8d8858140b90ef789de2297fab8fdd70f1b3c9e43258e0cc2b97e5b5c700394b913df21c6ef12c9f8ce6a475966883ee2aec77cf8cf608539c392a6f05ff0e5ab8cb3e4d993de98877377b95423e71d078236c27e1e2841f7ccade17b9de81d1e87c652ef23ccd39471bd76717d9521ec59fcf7399e5fb38b5932c364a6639b70b968f48e2b681bce2dbe0747e00ccdef8a9c93c1cc716a72ddc3a53205fdf140862e321d272ad1932bfbd43dd7d871af9898209d1507c73ceed30f6a3911af1c7288a432839f8561e0e975d9d162cd9b08721622247d5a47e0d37a83bc493553030ac364ed30a7d8d1295482794632405ebcfcf7676cb43278577ef50bff2482bc16f80aa088c956911e08ee2bed302e0fcb3d936a30456b09e17564a4bded2a024feaba6a026a799549fb6355e257b2903f607c89728e8019d3f629130fffc77a27f3fa8627fba0523fb498a3a0197c848bfe2951ae0fe02cd199d8d36fecd98811bc21a1740d695c61cce481c0d5fa51337f105f4d4a29b75ca8ea624834eeb09f9be63871003318429cdd6caf4daa8ac85bc81ecabdbb4dc7dbd45c43585598442baeb7a984ac1a64bcf9e0c5c10ba5ad3cb6fcb0db2354b58b3d0dcbd7cc8381d3f1ab880b22d74a95b07acee0ac16746a73859a42d060a83f7b135c23b216eb3d458086f445d366cf9797051cfa61908d7455e15570f6127114e97edc84d6e2b010d340d073934bb315c222d6752b941e3fda20b3539986c8a11cae62d3380ae4ea1020303aab6bf8c19882cdbac8e1854c7ec2cd16af679e961955472baec64447c3bf94096039f91166bf4329be2b6b00d0620328bc477b6a5c1e09dccf9746a06a796c7e76484c9bc922d7409fb438236b69060854b8d7a471631b850f10748a80d839f8321 +0xa1a60fb89d420fc84c2caab24079d75ddca9a4676eb8677b3d64038fba8711203a459bc26259112c64138d4cd1ebba406720cf29cd1e4ac35e35be50464ef1df +13696 +0x1cecb230f8c80f87e65e6a5cf1de4301b2cf1ac7c4ae81c478d875d3c9aaeedb92e6b555fe58760840ba161785d6463e27ea595924505226ce5e424bc48cd19b20d41a95f25fbc2dee5d2dd0613552a26ade4d0a668c9770ac904e457b79d044308088f8bc23087f560f588d6d438eb4e1739fe272aa752b793442c8d6bb136029b0a88745ed8385e1983f58914a23fcf570f7e930f216de9c13c5ddbd99c376732d2249730454c7f7bf8938b59039020e9ffc2889aca2117ff5808b185a080f76bf9d472fb2a5cd014ddf36c15ef64f95c657a6631f404c89a21adacf4709b2992dc187623d9b20650be8589dfc856af0aeb06ba894191822e13cd2caa8efe747413713f2ee60478dbe4da832b20cdb891fad803e5355fcb27b8e7cf1c5e137e5c1a7f3c90d1ccadf31b52e66c8b42bc7e1f9ec0fa41b81a139b7df2de50828dc76b82dcde2f632c52bc9f12285a4e111bb3ab701cf932d58e1600364518c44942813cbe8b41705a67331f94f330585d17619eafe1be78b3d3b30f17f529413759f60d401cda7ceead2944ed318fe9f6eda3d8cedd23c20b911d0b0672e481ce8a24651ff73cd12f8109af9987cb8b850af4fa5b53abd763529e748022dd1e753fb6d49ccefb15b3af5ec0184a95a57dfbdf63e409b8f14174c1ec23a9957fc1f707ec44f897c301748326e81e60d0583ccdb5d753fdd82c8421d25f6b801e4b5ca21cb7088561af7d31348767af949a4a3a50d3c6dcd49b1d38b791ed4f8267bd0fd64173666a0425c38984aae45abaa0bfd537d6c87f039c711c79933644adb4cbb9a2cd9d54a61ac4966e7ca1ab3fdcc8b39208534ffc7e55616511d6cd83c04027297bacaa0ba8bedb834169fea05aef6c60e00fcfec5f6036e2ddc385906c27bf640216e2bb6c1cc9819d9fdd72a79e7022d2506769ac2bfd715b7f155a04cce2d1055e972bd158f0d7e5d5b03d5f405f6663b7befae11335af1f5bf52746aa21feda062fd3850de1f4be8e2f46ce8f9a9a28c82ef69ab06fea9dfc9dae9e69fd5c04801558d3a60d768c3b934591d6a23c75e44003358e1cc26bd387467876e567296f001269bbe3cbe360a4b025b016dbefae9a974df6cca4ed733a95614b7aae9d25489693ba0573388fabfd16a668e70a8987394094e020a74e3ff1f5621da0f445876c0e2ac2eb003b31a2c11408ec4b079e4fb9e307c43dd7000281555edcb34214f92578dcc1eed5de37d193776a159b5861166b93fdf5b0134da18fbeb04e9da9c4763e936638f1fa32b4bf44df1ec74e13f289253c834be229d29badda4aca9e647ce6976693122e19e6d1f1b9bb1dd7bebae62c0e4b0d052da0e3aca92c5b6b3f960b492161b8e253e4760e987f019de7fbed28e1d195f4cf79024bab67c2a8ec7e0739554948af873a35dbe9df14f9261218ac659b592995e7720b5f8182dfc18184d840ae53ee0a547c1a2c5fba81dfb9f317082ce92c0758bd5c440e3e68755ceeb692057d3673cfc329de7584c09b3ff6f927faa8749a694ecee76237eb6e4cbf44b7d307115a08a58b8eb4e62def30bee36389198bd58590c3c82211d112ed711330bb83f7139b9ddfab92613222289536395cdeda2f2a3deb44c25e9219bb9ea28b13966037051666c3928865fa74249227ea5af83de3a0a61bd770d6d943b263257f90e53ab199e14549be41cecfe767adb6006e583e63748bb5eaf7e7f236d59e5415dea53da2afcf0c954e25884827394471952496f0d732f24f8dac53a69a644597e4fd15cb52cf6f8ff38539e161591a21151989c36e9020f0f0bcf48c0205a89970a8b67e5aa4f710ca64512da69bbb9156bd83657b21a681c9904151ad01019d1a4ebc36280e17ca4b496a97576f8d34e2671051bd76176490acb6820bc4f5053a45837d5b69660efebaf2b90443139e40dccd1275fbe83bce88e0b79eefd7846923a8de652556714d2f660d2dc4f34fea54f62265218d59dbab4c4ce6e03d7d1f7f88b3c5e05d73cf2d410e445380ac4786380beb859b51509a55cc7424ab51d59fcfa80e190f98ed1b2026d87d6035f0d71f2979a686b4c5cc89b0b74b95c5143ada159e4dd1533f9f6ff16ab0f69f7ecdf815aff2d3f693b8748430c3713963a734a706ed47352f20acf87b8cd82b39e16f5aff09079942e492d1610ae2114c8b6bb6c875d5a1442543a67b6f798bcaa7f163d747960f7be77102d8a05cff274debdf7376014a1733e085eae75f13a9881abad93d03db77277ba2f81246559c65318b687c5e7200d2e0016a72fd554f1837ea6557d58ffd3b2f3c5fef32b70477e94537e741cb9968eeb34a90c8e323bef55d1c368f9f568908297085968607ec5f9762556fa9698c59163bcf763fd012cf9d6e47a68c1b97a314ca7416650f4 +0x3ed79e61d5843b36b6228023670b333208cf9bf556b1d6fc54e95808dfac2402ae06fb749e45883f21211ff41b28cced38d706390a398afa8f5eee760da041f2 +14488 +0x1297bed1f0bd49803921a12a636f92fe2d7a7a7484884e3ba8f0dd738be8591d7a9813d0fe7386ad05c697953d911b99c1979ab1f7b152b1b8677f7ab2c1da6d0b5b602647b854666cd88750640dd7d9a20af67a093d6d27095fe0850b4993580f092d3a9335bc93b77ffac5a08acfa71afc163581d5a486e1ff86fe5c258bc4ccc90376aa91c51c2fe2775bb8b009ec6f95834c282001b4896ffb4b6e00ca9b8bc46841547578e9192a867a76298f8eeafcc425c6c78b9a49d8c7d6098059c39421e7035889dbe3c07eaf8aa09a6977d35a612a23714a2068627005f44d3f262f0905257f74f9f06b077bf3ffae9d8d72d6e3c106c7472f30348042f91084aaa4a44c0d91dfd7f961ed711e5b0b35ba0e99d154387089ade7777ff4de7131393a19432456717fe7eb571a717c5938e4f1cab34a82151884d652f3826c174dba3b9172d295d3f8a0516dfc552941aff56192120baa5efd9a45ee66566babe014ed33628018ac4a0edb59a1332c6aa1d4a71974ff78f23fd97c725fd7a3d4f33199289a94a5a57e18d14091714b7e16690b86648eb67ae627c207676ddc3b8cf88697a27805669aa57a4d52794f22179cd40167202a9dfb6e61d50580dd88b651fea903920096a99f1fa56eb1ff00aa554cb4071d9d0485959f03c1786f6276244786444c5dddb0ed08736d8325c0da7cb9c5cbedd8578c84c5ba23be5a71d659aa55ed0de6e5b9777dddd556870aacf9645c3bf8a03d19231a21b4b8665eddd96f3f873c6153cb25c60b3091ef842ab495a2e0a6c05e325ae861fbcf5ad1938ade6b994397d2efdf2a26059e23d95b9694be4160fe63e21175a1806b007101553f01ab8950082c8df256dde4ebaf4785a8d9e78c24f42e300b0accf51ee72e22d92b4576539d8a1767c23fcb11aff76a1a1b5894f8b8209ff0c466d37dda23daf50ff0726a3a1165ce93b3bb5b80722e32ab1ede4358bf466cf6d66fe5f3e663dbd533e55b87ca5f72f0c11c93cac0b738b2c1d4cc7b130dc9c8a5301eda81a7d3a69737ef2bbcee9a02f2567f37eaef7457c7dc5dca25dd4d635a7def36fb8d25aaa3d0eecfeff88df1cdd1e86df7bd2ec3ba60bcedfc9c42ef7dc021b05dfc1808df19201a6c6694e4dbf69514ef08ad1d21c7b28ba034ee9397607cefaedef5e9d3784db53a21f703a22b50d5dbba3a8e8579074c1a8b9a782fc5c89cf61a047408563c476110fe77acd9df58c2ba1d3e6dde83da718b8dc6cd57cd5e3e988dd2051cb679ea1af16881690b44acf09e54615eeedaad1b11a4f97e53de8d40d82a523083f3dc2917fda7419c41a14405f9e9610ff7d7226c3a3ca221c3ebfa2da578fc6b5c3f24b95fa8cb5af9aa9e99548e4fafd7f68ae7b11d2b00b660aed36bfee6365c1cf21fb60c6e0d11cee6a38ed7909622123aca312581b85ff54413a36c58ab9d7a7d912959917c3416046bce4d8c8c81341a5de1da0c1165b1a435754bb993c461ac57e0199e700888e0393d76ab599b6212e8eac634d3719db6810a2171b67cd967b804d3fcb1352f635503dd56c41aa60ab2747162c52abf633e8a79e8dc6beb96fdbd101307641073064707f397a308ea04a662fcb0392191b61dd885cd399e226f32574b3a3d35f996317eec98e18f9a26a8216c5c45cb292fe9c8b2508ffbf1538c300c1167a5de4beac9a79079430260a3361891f7c314f219d0d72f1508ecf4f223be558b68086e9a708e46162c0bfabf2a6a17f7133847d3795a3072cffb998db9c9ce5087614668fb07845e539b3b2383c8b5ecc37f753f49a41c4e580789857995445f09d01d7df37c10f9bf9b6cf8cc9c357ed9d0c687ca1dba53a9f60d01ec8a7f5ff63c3901e054b39078f4d5658a4d5d565f1280d0842dd427ccb26d29981146f9568fe31b48f735cb878cbe934743f61c5c2fec45fe3d3072c921f126079063d532b063f3b5cd5e51f34d6fa98ae6c778d90e520bc0b398dda62de120c1719c9a918701b2ae3ef6cbc41e2fd0dc9e9a10dd97fa4d52f9d10f6dbd843e4c1abaf07cfc0580bcb2c4e003e64830c4d3358f70b22b313d75a6b126b823a932f58581faf7b68465919139b78f00f0caed619b9a472fdf0891de6bd7080689fb68c4f213605ee73443257de800a0397654e6dc643e4c803bb440e48a9475052ddd41eecf1f43d0ae3048559e216f3251708cfcd57fcb3c5e4596c54644b84552bbc21b371cad685dc0c269e2dab704e2aa1ba0f6f3f43afaaea6b514001672f16a10215240e6d7c85c5a60bb13bed6b1685a72cd800ea39656395dfbb0d9b49352f3a929713544776adae332b4ced14713121a650f639ebba51665033c4732bfdb325bc298e1d7f35408994ea52d1c2b140b40c3893954f0030774348ca915fd6d97de279e33bac380ac2b17ce23e1e5d10d8bf1d4d9edbdd8d23297894684d570e8db606973126f5890409518fa45feb4e0a3f6da8b90aa8c4049331968a8d04ceef973e3e90a80427b81d169f872fd244b31da8196654087195e102555a9756971e16af3dcc77d +0x838f976308b3e38471c3b4d8e5422312e4f56429b381f91b39bd27aa471e91a6e3ad8e313c64e6987792416c44a2a0e06afdae11a946af8b12c62f57af73cad9 +15280 +0xd2860f7959d1d18e4ba3a08b56c5b7139aa164880349012fd7bb268e8b641d19dbe2960e1a0e9c9ec63ac84d5fb7b59b799bb3e411c0c0851d10b4406600bbe29a5b08229d41c8cd216f552076c1ad75a3f42223b5b1539f57c75ae7a3b947203878ce7d8d713c6485caafcc43e987ea3f37180c9923a1c5ae69824aea94a91cddc14ee790a7e0aa19d43f196d392b4076e9fd68651e943e4a7d9332e19bca1eafbff1284eea9ce906146bcf9db981bf6f9438ffc1ab1354528bf56733d5906dd9f91f077142586773139cb57a7072b153bf339953d0074dee1c0fb1864ae45381f8414e9eb7fc6e89573b94ad66e45c49f355fec697567248b74bd88303af16d042bdc37f5270446f6aae34dda3c00a7ab706f5c008e90b85e410a3d107d7ffed61fd2fbc1a9c314ed45f5db330ef010d93ae48e92aa860d02bc7db185e465600dd6759fd18697f4e1bb4d7d61458892b0fb5bdeb057bb84f15d6480211e263333c650be952bd7496c91769f057e2ecfcb4841d6ba14b5d2a29a6b23527956dac085e0b28d2825a4f65efdda6027770a709812f1407fe958aef9fe159a845be93c8ba2263a09e77a078a4f9a21bfe5f559715bd8b3e7ea997f0299d179ddc9c1105e01842c2fb14b2899e868cad5eff2de4a88d7b4eb1e178b3adad170d41504e463ab56c427f78ad20444b0bbd8199587aa3698a40818456c191da00005c2271132fc18a2714edb8c60012c8554e74fde16c17601bd5dc58a03fec7a7e1559a2f42703437aa1b9fb0139a16b7cadda459f6d5fa6e7942fa7da1dab2f90543f0b728a4440420d259f5c58c19b3b8611583e0d0b04aca8c66af795dec43d011ad114c14c28874279cc5cc33a0099c1625d46b3e12173f8e9ca7d0e4fe48e04331f6332e3a45227fda98be3d4439e47157c3dc9aba6436cdfeff6f0c4358945d21be646d15caaa4f95f7020570c52fe72dfadb62f3a25ecf200e9a2065f38ad3fed2565ddf797a1b41593e38a02becfc1ab1de2368620606825df8edd0ba322c1bea8f8d11e210677f47d9236cee9a2490b16b587323cb08a885f1b10e1d18da1b6f865737851bb8a24b5972318db6053251f97ece581c5a04ef1b16988cad728fc9c168cae2ea935ccc35819879def2721c0f02b47f885f2a21db8aea996e69bb91c71e367c0b6c015303fe0c336390d2881280d01a8d9c7aa6c98a8eb3ea4451401e0424c10cb722683b23f75ae254d62eba75abb9aa9698e65ba1ff7c9f86d36d1ca6f0425d19428441b00450e9a2ef685d5da1cd4de1e779184db743fc95a461797333808ae6e42fce1e9da5d82f90cd71b54cd605e2f8d765fa30ba801556d58ae5690bf4c489d326cc3dda3c4f7ce6adf92764613e4f79eb440640d87a6d31e79a0b354916a606e2455f5e8486d62c58a5abe8ce484de91e97b267543959ff05fd94ace671bb4387169cb35f6a6f07185754d3cb85969d5681af9e91d6afa57c8c8fc36b5a5c119bbc50691b6e9a1f437abcc5d79a9c1f497e58770fd6c0bda1c367293634eae986a324f05707d9cd807c3e3f80ebd0d76e0a67512cbe4fb01c4eb54ed585fa43ee6784e980cab0aa45f8739145fdd76e1aa236ed76f1af15426af494d7e1fca91975faa5272bb13e1a6bd77b9545024bf5c2518c8d156165cab4af9babcd8491be6af0c3b8af5de16432e44efd5603e9760741becdae091a0bb830d3cfad04864392f1b5c3da094cba0a249bfca53ecf21dd8204c70ff8ba8bf232ddb2051f0f2f9a880bc71065c8924e12e301b725857fb19cfee7cfd2cfd1df300a017a1684f8fe3e2630f6d5fd637b29a4bb005a74e62fecfdce7209b263fb82f92c508d90361a5ea5a001ec53d41de35177154045fba51c91e97b101ab8b3d61b913d06b94d9b940a82a61b543aa2ea89c47a695136bd864ba76f785156b493f1ee93f458c5ee68b55777e5772db679be2184582f1dd5c49ba6b3c50eb46a371c8309f907357f3736acebcd4513a54b5f2ce77f48279a41f255dc689b584149ebfce3673cf2ea9a2ee1664546830bc9fd34f85134ca57a8f0436df59fc8c646e0cad4d172a4ad0bde939befe402666018d85b706d9caa4415eddcde846c85b8bb6b32ba40b13306f641e12fb60821b81295654f6b151ebdc3b3ad85d1e9fc09ac5ca1a41fbf1905d65ada87350ada3caaeaca60a5aa01709a4354ae109795d4642d96016814cb932f7cec78d9910c682246ef36b5e21f06f9fb6699b91bef83434c8464c258c74941f69b971c2124c5293848440453b3db737a57fb43dd75a0fa37f140b6f19872ce766c448531afce104d5a1b29555c88871ead253952a4b7d98e5127ae85cbaa156ad313ad5929fd87e4b91e9d8d9578b576daaa12220932619e488c217bbd79b7427486ecfe1fdde0acd9e0c952eb367f01751c66b22f9b43163bd0a849fa4c44aba500dc96fde9caf440e4355bca4c544ce0ee9f99646cce54bfa7bb871ebc1df4f933e4ba40ab975962ab89febf24d5c7b283252e542183f82873d3a97723d3ccf572adee848de64ac3a90fb2364a63f07e8ca0078b54046f1ac77927b02de6720e5f809a362b3856e86f6f1ccc379f55896d98bb667ec0280b1524983624c6a2c85d1553d1edfdfc455100a4ed76d87587a86790620c37c18ddf5e6195c304dd97edd491e450b7a +0xa163a7136bcc92589303cb15e26bc6ba7abd91b8ed194e2ade3d47f381191dc402e336c4c1aa8c0f9a2ef4149b1e3c2452d195d36aa3b96451e5059f5985ca19 +16072 +0xc7fb2a67c42197c11457c8fc39a2f974f2577b44bc8e5a5b97d43ed30d208f7e7109dcc165357ea59e15782beccfa2e0747c07b240948b02fba6d1faf54d5b216e5ff32c10674a18bd56e0758b7523050d9edb85d5acc5cb36307e114f66a39144673752cf9f4541f882c683207bc40a4425c06680be52ded2d90fc02152aff57e8770d8a9c5b549d701f3fcb2c9cd17a27a7efd4bb2786457084aae75fbc776a1296569a7c2e357e23b2f894a478656ae03ddf13d7080854b27f9845248333c37b4dfabcf7c1794a29941d2efdd37edf029a5eb5ee1b268389de2e9c1213a6ec890a6462bdc99279e81f37ea9732704f0549d92b7eb5536a5d2ce86c86e2634da2482e3c3cab0395e5c0b3680f19fc437ed8e8f4f77b3161b2e840372173db7f7da3b2a9d2fa5f26b9352a17d3fe7544c5a40892f6e12312119ce07c405c81fa61998c2c3f1c0794c8c9068a74547ddb7057b295db6bbaf3ffb723ac81e0e94704a62543dfa49f789b18d3207ec078701540717e339f6b7fd3c3945854b593ddbd3618711308893ab6910a8a31a6e79b1b1abfac9dd0a71e444ebd00375ef42711d5d04497dc576391be37285b8c5dc4f83307a158c41067b7b50824b8219ccba901e72edc847c7bb31cc37b5af54d763325f40d12de19e4a4a2f04645c1f033d946b7a03f957afba12949f39e563937626fef404a83360da1752fd56e9490e82920ec495f73d56bd2603541b443a380fc6d53eb7e57f75b24b7f162a13df1511f0cdf7aaac41e34cd5e0fb63b321edb77caec4f1cb0d055b4f7ff7e7c02842731871bb4bffab7fef87f53f17195fdaf5b04f31ba4424375b8a1a4795da6dbb2f70c2ba7fd8c2512fa408c541603d2851c8812b1a380d333c6317af3d48f6a8cd6287994e1fcf829394e238e86f03ff532d0c5a1a8d1122854440d6e5f20b32d5558a03c0bc1a39a4bf4b3e152ef9868447b868c12c762cbf945b6598c0f481d0b1919ede98eb9fe88e0a7fcf8566e66b7e4dfa18fd847871ba31035b9af8bc46dd6512af998adce967e9a51e5c9446913b92bb25e8852f23208a593868610bbd43ce083ba83e172fb3ae550a9bc9cf7ce45050f2d6bf785e2d2e0e36127597bf4a93288bae517840db22399c2a4ea9b6e34f6487ad7b7ca849e4cb5d807d88d35a7e19a6910928a6450df9dbf16bfbc79e579dea5701628cdc7538b69bc00682db5584943baf4fe95b373dd0d967ed357f30a325ba99538f4eaafc484988385235e1105e928a148f8467ac81c88ca98aeca11f40c08b773b0849c01c731b46cdd1ea660b80e4a0222767eef8a720544d4f74b941501ef517701a2b3802c2597b15382da3ec031b2aaefdac3d5f6c19070f6f1832519cf6abefe7e6a6dcc599e36a920e2fbd30ac2d80f28e56d6b81e3f945be51aad4ba180ee76986eeb6c2d8d39c1b1b6ddb37bb5050d3b4df64c8b7d46ffc7024b741f1dd390ea9615ff3d01e88ebd4033d4b149a5185c2aa66f894a8d2567f1135e970a07fd842844c5f3c8e1bedbd6a7db7672c8d998f3cd6a402cd1936cefed5332d0f3850d2b5f0775698a1cb27e210ff1b6d61a98b25585d7ad7a127f05c19918f6fef02ea84e0deb6c4d6feb4289ba4ba037a1036e25087655f06a4839777970048f058ea6f91f7e5a917e2d2ac722abb553368230253b47ab9b636e95f73b6283108dd62d488555b9bd12213dc48f3a7f93a3bdff3d666f37e4c59a21292718fae851ad4623869a143bf36e83664b20855daf5be355d01981315773e4f685b7f17f16bcf7726c72f072e9bd04969d844f1a2105e455c26b12ebe2a2e6449c6af03da7aa4a1d7d07d7cabcb6c93dcc8e6633c2620b25848d717b2ece2ffdb557808acb20470c028150ab3300d9412168510e5a1b5fae5ea8264703a0c80718a628ce49c6f5274208e47d18443c8ce4379815b1d7e8d698e4bab929c0b84c0d807171ea435c5787c219a83129fb045d26c4af8e3faf867968b43867d507b2dc0de2db7640848217da7a9447581d93d35a5c43bafabba74a5d9c2b8787bd23cc740374b56476913b768caa2178aa2090fee83bfeb1151f54eafbfc4f80e38626de5ca56e58396d3bbfd9508932ab92da38f0fe200cc3d8dc385712886581c2337276d46bc3d5fc5fdce8ef452e27d3fa30fdf4e8b2cfb82d6f3bd5fae19dc13859d86b724e5328eff541f01e1326ca38109685204c40a98eb62cad6c9a416a80ba0ad04ca1bad832346db9dc8ab05fdbfd44198e811f924635b402a73874a552be956dc16312f471bff3b4473ace7a2d218e18fcfa735a9e155a3c74643f5af58c00a8983c6363f4be5b4826cc870374a4fcea305f44ebde7ea6c399c6a871b24ed3eb9bd6b60f035a2edc43e7e4e2f9ae16f7f2579b2c4e972100de05bad3d129979d90d612dfe6baf2da6434eb00046565a80c8a7f05358952590dc97a669a47d32540e780bbe40832a9525aa643dcf4706344a1f85edd7bc237ecbcf21354d00fed73af078b476973b1d5021d94cb81bf9164440e1f8c96f703458429c349ecd35cf0d6af3755073f5ab4d457dc1735db9b321aca318b027b23dec9275cbfc1a8da810580a8570a1d0cb9775c0109374be777cc337a22e6d6017f34f5c7ff7a15cfece483c4949a962faa9434ede9b097dffa0151e3986a8e03f26c9aed513da3a3fa1abf7456dd312b50d2e886ffc748ea85622d5437b82d93fe1a1eb5fc32d8bf73503ca1e3fe766873da7eb692a5e56fde97ceb645f53b186ae68a064a833f891f2d03318523ed4fdb530163ec71f6d8ce473def0b4c3efaff77e5ca81555d +0x0a6bd4a3be10c690ba358fd4abe6bb3b05c6e74762ddb16c96122156c6104102a0f4da5d119eae98c369b4a39bc75f86f76b829c7efa5d35b8c43dbce18a9c45 +16864 +0x11efc562e14f7a08dec506d17a527d537fe51ea046c528cb292ef0a83a3f2fd43614a0f5b42fcb43a21c1b48f25437e391638f93994635f2c717ef802fec8aa22efc71eba1037e9954e80f63be9d5d72eb4809adb9a0f83947996140ab4324f2e3ef5eca0e953a13dd720aaa44f5960575dcb3740e9b18a791fd6e71160da6cb3c378f1c65aba8b8230233a6ed248aa61769b67201fe3e458e8b3d9ad712b736211b2d680d0e6f900fe0b2de21f1e25cb9353a2ff893111a248af743581a003a7ae260376e8638a38953b0da49264630438966325c203a2e3c44c3f500ed29df2fd54f10f0daabfa7aa45523cb895d289dad6203966e6089bfffca363752d92d293c237bfbd46f9cc81cc84011e3d04fafe9572a0c452c34930433916513b82d4e5f0300f73a2d915d0132b981fb46aa62856d2f286c4636a29b278bf2f66fe6878518284cd58ce21f9bba17859b68439cc8cb9b51ad5597d20bceae47c4a660bdf78a7a626d3596f83489e18489de2146fc9af6eece015f0d9e4f81ca4404a4d6fe807fa2cacfb5cf12c69fe68e4f4c496701c66998f4973a9ad38ce44032b9bce022bd72b303488b7e9ada127264cd8b51299529d3d34741488158fd7ed8a755e599be3bf1795516c02d1872fdc4abf60439ea964749750af0826c7ec89d778b570d0a664dd8e75720a6e46df717ee71c75a4e18bbfc2b7cdafd50cde42930447ca527598cc90336e62dc36b27079fe3e1b44817f99470814d1b8d549a25da6a9e8a9f7e79f3b39b59ec3fd4563ac4369b6e60fbc7ba4d009304aa7ab4397ee403e4fa3cdbfffe6ec208df114c5868513db11e2cee16c8e2f2df2fa6f80c239af3dabefa7994ed9769ac2b88d10a901c0fa40b13364fec0db3d4a5423047d174b89475221c5b86ff96feaca2adf8467f5870ae16660dbe6a1d0d93b52291905a993ba61b8cfbd38c9126e9c7a7c99162623c8f9e48fa48e17aaf816797936934ddf7da4d911ddc27a14d6b6089257aad73313714a2bc915b10e5f7c056f563eacdef9820f369a8b9109bb8d319b60748d4772dde3dfba1be29d57e28295e8764b14c68fc79863f2824375a8a2021421bcd35f966e16081f40ba79d07d676dc8bd135d249ed1da95e264ad9eb6511330fa5932412559238e3fe84ddc526e66a4574d35f6f15d5ee415dfbbb60b22ce10aa6ba354c633ace754c94c5cae156397be34e96d6b95717bb13738a50cd1a54f516d2b47bd1004c903bfedd7ecf6d521667cd00e6a34b2cb38ed9cd237f8494b93e022a06688bb91e15ebad4ab7d4bcfc467823089a57331018560d409012aa3c66731e57f0841d062082be9463337f17c87889a2652636bcf712d111c86b9d68d64d18d531928030a5ec97c59931a44d37f5ba1ecd5e3c9e7334a1fdef387524d5b7a0e8f35eeb84eb50c04622763188d9163de29aa84e9ed6e5056ccc203a57acd93ff8fd9065ea3cd7c27ec6ab31aff804995894ab73a4664c86c628ccf5eba4dc7c6d18cff74adea824d44c78a9aadae759e68210b3986d92ab74cbe3aec703e8e0b00cc3a88c1aed6eb27e84a361c7e602f62e7e166231defddc7d0e6bd31124f227a115809838cb297f227826bc09291eef5e9ea5ebfb59036706f536f718b93a3b9e6d8756806cdca201fb3ba3e7d93439db186719122a457d2d3f161b5ecf4054cd72c6af3af80f85e3b6e9fea81ecd3c6d9365d5c07b4b87bb9514272c8c8ddbf4cd4489ad964a8f905038b5951f705fdbb7a5084b719eeb799e3603ca1ba836dc2609ce226f1628cf7230b0f605a50def2d3198fc36c5132c03869880a219cf4d231e64e1abfab869c4dad713f7f5ab6f9d116f1bf248659f6b0ccc964a690d0f6f8a3532717fa727ed3d13331ee6a224ae4b73f0ccb04b997fcf88533a1f57e9b055275de92b5ecf96614a9fa2025ad609e98ec2ed832ce1e7d7b5019bc317a48f8824a93d894329664f65a0aad13b4d56f2a7db7d4c70404a2c39e694ddb408b32a1360921ebfff060e4d7c5edaae503c6fa581a3907e7e50d7fe4a4ef696ddc543dbc813743b171da6e87be7a519a9636772fd87d9c063a2dfea77f09525eb6cdc6629e5121d3a542020e76dbae51e74e2f59752ae9db6e84ce7b4a343c9fa51fb9bcd3380ce305383dc0617a27b7817e916962c987d41c926dc488f87ead11bab62fb2347b7c1c1d704220ee4417ef382bd443c1ec8caee76b07cdbe9f03973f1a3faddee3fb547257f817a08a1fab1b8d2e7abc8e71aff444d98b0f143fa01d746138afdcdd38c74376b829602b2f8903dc8a01e40f9a3969ae435284bdc6c64348e52fccbe439cc132a4e17cc707114e62f44a93c2f82767fa7931570a75da053b35c74a0b0f535fb05071366fac44bb663bff0438345ebe42bf1411b227b948cc9d1edb4ff69b8d743d5103a18983d93ae387bbebe94fdb1b67832b2166f47c81ad8ed6f993c5c8f2ddf98af9495f36656d7d313a816b5ce914f729f4be0c1edec9afe3946172a0c0b4e322d35647418a4c67fac09741a2404a0894889770be4883fa77acda228342549671cc2adc88fe02a07efa95635995690fd1798dc2c9636ee719af78460f0c2f9bde50417f8b5522ef44650620c16d14958723fb62cea3ecfe2018c66da292b86beeec34b0b7142f7cd18c543aa84bbf321c347ad14c7e70b841754ef9dc5a917f2a0c6f109aaf7b01acdd19f14c95db5e171796aeb177acadf4516c8b1ae82d4e063d7b0fb4aba7f64cd3c1f54cfffb81fe49b95b9c13f3379f19c981ecafee610a0bc30e838d38c317fce6a707ce924638475d687ad7e6fdc85ac08ec0367750abd3e1ad85c8a000c4d4e2973ba622036b9d1d35cc37fa590670fc0243f03a857242516d39e26037a9e86036270b3d41eeb753740eb89fe1b018d67ce681ca87e3b39cbe2e6f1bc05db3ca147862569a5822aa83b0de6a207 +0xca2928c7468e8e421b00fb128b1c114a983745f9b20521e8c8954a68178ccefc2e81d0f0c49255157e9b86cf09e59e187ad938ffd35664f9a3ddb471b85ee250 +17656 +0xedf5557e15473b747a819398c9ac1459ffdb4c97d0072c124a16c723b63d57aabf888147d6b7dacdd44ca9f3e1e2ef4d95c0a47b5eae44a122088a1725107b612c88a761e381accb7c6efbda997cdf416c26bb651c0393c96be3cdc9971b398c7d1d5034044cb957b90e12b3b722ec1dca3417bbd4ae21736fd219a3d3069813fb6e032803c00a5ad55474e7047b1fc9f81242e64c57f68874fbf50ca378a1deeba448a5a786a6ba1669abdf48307f2e3ee9c44f4da51beec386e96ccd195bd598e6a713b7469561c5753f024be81432e3e1235d9e40978fa49c7d2c1a92cee1495da9dafca7e035299fb6b7d44ce7be3121e97709d172515e653ab2528b02e84531d5623e528e208c109a68ad04ffbb6ed29d075400b41e3b08a7673dab00d3d589b31344efa70934f0727c9cb7650fe31bc874487466dd81ad4db3a29bcf8b418dcc56d82534d76a66c75b6a0d1fa4d825f126add69076797eb2ff4b0377f7d167a791c09c3b74769a206ddfb037609517a0854bcd38d06ba060b1fe8901fecd3ccd2ec5fdc7c7a0b50519c245b42d611a5ef9e90268d59f3edf3384d8748a7c37c493aff0ddb830dffecadd779ff28656b1ea511c276c5c7eb5eba596d882277d162a461c872f6d3f94e5f6ebff974af224c049c47e7dec886c43286c35cd16394a59522acc14a1fe4ed3d64cdc03f6173ce39aa273f195858ca1d70194559191e98a9ac1b54f1243b5fc45403f20d1ec83bb0c5d11aea09d9b6f78fefc01e0ad7a24e78a48c908374fc80a6f2fd5259a80b1669e5d9d55f72314d40a76b94ab6858f012d8f68cd02a7a0ef83b40a3848bb2b720c61a6fbbcabf8b3ce096518d49332b0519215a8cb42eaba21d6a7541fbd92f65024b2db13bc83ddf1bdee932e2b77bc9e58b9e0baaa0f34f39e95bf470d4fbb11aea73e25dd1d191c9a3a00edd5c5ecbee93abef9667825a113bac1e733c889f8086f6a1a962e30f7a932aa38198509564d828aadfe8c55d33dffa427b86727ad39f0a8196f1eeb29f1bed838801ddb118c778c01fab28b30254cae3023935fd749143f4af155105b7ac7d11591f62a94af030b1be3549160d28a292afcb3f71e41c179d6a33c67344d33def6d578be8abe0d512341d92d0c4c9f5b3dcc31b82c28e19ce50d39ba5d71ec4703d20b5f99bf7ca4429aa928dc9c758d8f19746aa6065bf19eb8b5cf7deed854661218d469bc3a4d9f782c4977c9f3064b6ee4d537e317c02a2b196f3dcde14d441d05e6a3bc2e936462ca5a86db00109750e9c085c8fd51b1eecb624515ee79c8793c5defc840c0b6e1eb21b0db86f19b49ebf538bcf5eb5a8a35703ccee62117b02301f4e7581bbf7cf7689ed06cf281e0523af9c8e7d74d86bd61cb01b38d5c4a24995b215eeba7bb56f5f7c29a5b6e9e865870f3bb5eb36acdfc99b53c05bdcda6efcb7e3a799626709064baf7748c09ef17444559c6b4bfcc0a4ff269d162c311c9ed07d50db346ad038dbe6d8403abf63e1dc6a957770c225394c0223874b3ccf069c315ee26a2761519d9e3d5fb0c0197a57f945b25d9369f11284f831b26412ce6bbe36618c2318db11042ad9bb27ae881770018e5af72b66d31d8fb7ea3d7440cf528bbb12f4834fc6d70550b27c7fa5cb6d7d7e0143d6051e4a5e5c6b2f602857bca36187021d2a3f7561574f35295dc45ffe03d93ff6465479f8c1adb062cf655b31f760d262f4db6dc34fe9c8180a92b627b25b1218b5065ac37a3a76f8b0a89c9bef28fbd12a3b3ebfcd0acbe856c70e6f0c0f8099dbb43b52d899d9ae76721f65ab57d50444cf569b313ab706acd1d758635ef20624deba3b7f346ed08b524203de65f468ef18440a2ee1ffef87339f687ad1ecea1af645c1d0928d1b59d9b31adaebe07b63a6956118a92d2f707cc50394f0e7c2488b6caa7f5cdafb8c68d10f33520fb84ceab95480e8b532f30df6de5444690b181ead49ddcbdedd7da02a557a2108ac25652e38ea393e968977834d2b34e741142066146e97ef5db7e03d8201d131c3679672a2d7131fc69e4a28d4ac5af8e0c72155beb419a2d8b5c969198d0b319a9e0f1516b9fedf4fbbe626093a2f04869b91ca9d40f99ffb11cc6b805e177e9e433f84091564f3ae6cdc295f6719909f2c12533497901d213669835b078e7f4ac1985dfe6bde034f2bac915bb5b33386d2f37e192a75c0d7be016f0e1be8ca2cc3a9e16b4fd274be62d7fc62a87453fa3ae5b9bf6c2311aaf3547d2e0daed5c0a3f4ecd413dace78ccded918b1d57855ce49849bef20960770b33c1f4f5938830d09aecd7a6f871aa431a5e2547f1725f79f6d3335e6b479d0be3a66637049004948c5bbc60924f09360f16412b9c6e76167d219a2fdf37e7dc5e6a7ec7cada4f342b02389202eb714fd29f27f1dfe16763361b3e8ced981f26acf384ce6dd0d8577fc99564d1acaa366de31fc24333fb0728aa669e1ed20b93d62bc07373d869a6919919ff86f97b92e7c971c64fccfaab5bb4598df94d74c9e3f97adf665cc8c968580e8ba93cad0c493864248b152cf6d822608007722170db44f939cdc3be670cf0ba2fc3dc084b9a1a41057f745991a6ddc39fcea7dc31c7f686aa31751328864766145b4154f8e2565090b4524823cdccca13d8556bb4aef6695a19da8fb6dd475962f9d359ba2ad4d9eeb118c25556d6bd04ade597a0982cea700d5afab619d7dd4025fadf3a797c2446fe2c8fcf48e5e399d3bd289d8d805115955d1bd343de38d6681ead1fd73679c124f87738abe085fbd447e65596dae5703a4bbbb36246b34d49a78c124cea1f87aae2423888aeeb5238ea996dba22efaa838ca2fe7ef696cd51fd44bbe1805fbf1854b779e6395dc5850d08900240b7eaf988985da0d6297d06889dc19de08191f7b59fa0cd68237c451afc64741c855922a76577ceceb486f2b05fcd89f2cd26cd6dc258452384a0ff783d911b9fa11f8952d0f612c67e109dde5186ab9f8aa625e4e8475752c9593c8f93c0fcaf5263b3efa37f74a6d0428e783c950dcd02398481d9150ade3bce83c7c6992135e24d2ae8a4bdfb56f2444de8e8a1b7657b0574ae5c6b67 +0xba3ad050bcbd2febe8989cd0ade135303de9d9a419daaa647f0c89e2d8c78e1a701a4f9ea3ade33ec68b28d4a6e7ff15d637a1a803d2de1ff35b0d4298519cbc +18448 +0x8714eb9ecf8bdb13e919de40f963d7118fc580eacfe9acddcf99cf2140d1bfbf5119bc8fd011af63924eaf821664c9586544016b3cc994916d8d8061830146e7a5bdef9cbd144d94d9ec83fad1ccc8ba2a37677d3a390ada8d3f39ca882c1e5d4ca88bacddbb3e0f849c639071c35a9fa545bb070f619720f55601469678cd8b0e8398a9792f093b5b05552c4070096f9f1704f0046ac2cb6e7be1bdf610ddd7b2f61f7ad998367f28d064b684fc5c92e0554a22617c1443c056df15f11ad6ab02a82607451d4d45b1a49516868fdb7030a695846ebe14f1b38e0637cdbf3e6ec442b83805e6d7f4bf2af2348e4f0f7157b2eefe73594a3b0fcc5b0bd2269f88c16bdaf5601c5cf31a0982f8e3677ffe1c225c78b7753e8a9bb7e8794a788061c1cc9626a0e762ac8aea4d4bcffdb47d489ee8da8338794720f8b46a7bdc6a618c0df3b30b6e7386d7755c13983a3458a3cd990c1fcd82d86636c7c4ae7be4f0e9d5fa84eada16e9c851b63a874589f5f55877f7d35ae1a7351a2a712c7c7676a1ccb1818452d43d272763a6e4473abe06e68a81e7081f1a554ce4573a08a85b7c9b229323ff33ebba9e6c41f767d0199e20db93a2fec39b8d73fd602347030742ea55a00d09bd594a5fd8f107ced27084ae71164d655591a7377e732d600ee2bb6050918b97faf09e11afa05ea3c82a813754f030645d6469426e77a27c5155afa61d4fe5d17118805dfa35420f3baf5d638d0b9324647b9c39d556c8c255c6e564c4c163e0aa3ab6ebc098fc3ab267e0dc234dbeccf14008c7bbf7e85ba19e26414bce4dec2dbc096209b1d44bb5bad1471ea0f8858d1a74922942496ebe463ae5bc60ea1c8308416bdd68116acc10fa4f87eb8b77bf71a942261f35243224e9f91e5e8399338426ad45a5fdc180d1219a6516bdc90fae7080bb76f2a587a2fb257aaf608bc59a7fd14850de7558650fd0c008d7a405378ff4ef2fc91844273710d73dc919c1b1167eef51fdb1dd348c9aa0ab202f2a75ce45ca3202a5f21a66633def066bb030b15d4190a29b95a760a00ee6e29305d0f71b5467e57618e550c5b5ad5eaa1a81191546f5155b0a24528911a163f71fb1d02096b7bab03eefbddf455f1bfe850b164f06699d1ac4142bfdb2c4ed84fe7e23fa9708c87eeda07559f8ed838e7b3670b38ad283004ae0b3a6f838c6612ca1b6515f445806ab603fdad340df83836aeee8d91a103423eeb229ebe336b8318051cef751b2700397e50ae03e7604260f5997fb2789dfdaa8f03193ae87ae9385be1866191ee57aad2d9226d0923aea8d7967f9e33928f4753464f981ff6ddc16c4d8b482e48d9a0ae01aaddf794d5a4d1601da346738fbbc486a2445e81d939d2ab6ea764b8fea17c6497e517464fbb5f80ca6045a3677e7f2ec1ce088e54181b9590fdc9c13f23aa6c8a010cba7572ee631653a5b4bee5dfb92ea3c28ee6d2a396a2b9b20433bdc493e1b02c63ff521aa1820beb29fea862b0395400f609f007290479d1c454c667854f811ad545df40a68df78a759f2ca49e825d38762606b2b7469c9db41ad3ef9b23e24c70d1811cfcaa85082a28f911fe8a3dfd61c36d32ebe9c07a460e7ce94fff5225d93addec1e5852e8aa1474373ac164b45b7aca04115e53fbec9817d13e425f5b70ea4c5a7627dfa087fa5480edb86ff1c5b473a2d214e5972a603b23c08d7841da5862c4ae8989c44632e08b81efbe2a32f9109b98bde3e081cf6d7d91413b7d780d97d7320dffc86766cec381d7ede225c1176affb9dd4c855e153b0afdf762cc8281fe8b1590216dfe65a587f16dae0094fe7d5189404f9794c8e8a8245a966a5f87a72450f973bc724bbdeedccbf265fd4c5f58bcab7e5afbff02e344c38cb3ed3f6d88107a13f56af78930ea7733c862779d5fb47d3d220c3e1666efc0ba4bc40fbe40f4b0968b30ef73f8bafdf6aa5d0693e11144109f4dfc9f8d85e0b3846c8f15c97e3b8ff07c9a2aa0becebf8e558fff77538ead2529c10ad19791ed105f14009c0d5954b7969e09b3767802d6d46a2cacebbb57462811e4dda562db5214650b3332b8796327518dcb72784526622b97dc5a689394e165ba0c2fb212dc14c8a2198ed78265a75b4333234e1aff775aed9010050673be3306d7a72e0810d8d541d96214f4518f11b6950977d8c49c5e8a62bd1f1475371037ea9c354f92e90176dd5d1f4399472b546ba574231839dcfacea225421be473d99f8f463dd4cdd3cdafe044e4af77fea91187c16e5ce82cbb2e7fa613da4ed47870f0ff7748efd292cb9c347c269a12214110fe3f252fe4482c96100e22cec8710951bf7071d77482bad15c6e7115fc5954e16909e3698a2e2395f195a7ecb67fb33214bde21d3009f8302b40318413bdd779c0532a3d94d9bdffd94ebc3124e129028db41c19ab84fe292f75ca5cfecb433a62af5c047ae75624259de234aa41b55388f782553da0473ce783ae19241e12a3ee731b66c2b376b37507bc5fad0df29594fca7686cd86debd1fe7f411a02e056b242cacd02daba1e26209d2aa3c26b5940381dcbbf99dca67d5aa05d472616c36c930cbf91d97ad4d75d271e24fb8a0f093e37e7bc611dfd580ca3c64204306a5be833a7161c43680721ccb2b715c9376e739854d9ca9c60e0990c248109c7cc3eb6d22c063fae5814230080c0adc362de7ca18bae32e271a5944bf08ac3475953838ab6c8900625acb564f0e82fe301d7ce060490369a902572e5a2d5bd29a258e2afcff3da05413f7d5c8b7428b2a4e8cc18582641ff5cdea95bc3e8440937ad38d3e01e6a063b2adf79c92b04acbc900b6aeed6e1bb383fcc30dc39144079cf1a798f8ebc93841d502f3243505bc95c10703138a248a2d74fe7445e9a79f94cec1336eb6e37bc7563ff4f73a82a4bab6fcad7b1e0122d2398f194bf4300269542237eaaeb6d44d1af6c892258a2c41c6ddd4ad947b247a35be255d1aa9d8236914cbf53b09e9da086f967d5fe5fc31dbf19f32525a382d4fd2c003c3d8cbcbf7dd1716c5a6657608f18741515bbb92dc813791c26605f46f1511c657878167e5c644d5b453ee2902c5c36562b4116cb0d5c4524a6634d67dcd412d3e7ca2021b177aba71d92cfcde347171f9b7a8c841356dfe54246cdc624377c1e080d7a18118e04e6200c9f68484baed802e25ad76e95a1c4766560d04bfdc08a65ac84eff119f18f08f6a20ddfdc5625edf33 +0xa86c70c2063f12bddf997c91d1ebb57f5c55ca67614f397c1c52a87b0621fc4378c2eeb07732e5eb0fbb4b3c1fdde87e9ed71b50f83eeb02cba03bafedc84764 +19240 +0xd99f82296f56251e365764e1acf4d20728f89f546cebc6217d918700b3b418a30c2398fac5fb449c2c25ed68b020aa6c3a01ca06c0b80c48179413a1080a14baa7b2d29fe092cc1f539fb4756281242887978d2feb3b70593547d0eca0d7e78c5151185fe7a3256f53cca250ea9ea902b8c2d01818fc581a82b0a729a3a6f8e1b30a528403b7b654d5b59d4071ffa2c3758a7b0a6d842d55a3d9809f39fcb18174e468545b55e99681608e8e1f2d753365f8764b125a58d043ca4497886379343de84218180525fcfed75e831baf8c1a3113a92330063f54088ad959bb62b8c1b61cc817614fd34ff522f3658e0d4d4081e4fcdcef114ca89a20292df882d7f1868ae39b5fbc59570d47377c9fd0226dfb7158bd7602e696a2971b5b67493c8c563a79ea39d320dcef501112777f72684ac4a30dee6174e4c8f4962a3241505acd32734d181c90a64244686d3da2a4fa14e5c7157eb7605bb34184e47ef27b22947cba0c2420117caf2c26d61ac222eb02daaa1d4f8a11c30c86cccf76e326ae5220356f84660c28de0f329536665303bbad366c8965efe47ac956333f9cb7c4b024cbbe6177e77076f574f2b8169f09e866514c53cd6285a6140a5a04a5982d56926640e2d90c1d20e7d435c85a6ec7300be503d54cd270376ed08beb872fb1eb71ed3e3016e1f783eb3aa590bb28033ca6d9da3869a76bd6e0900d1cc9e61718ca470072b6d0c5480c8e8b35c03586b33e1519a4ad493f2b703229c0f3242984a45eced13f4051164fb82fe2f2fe183edc8108409e21b4dd289e27ff8d50add70719f0753b996196bea0d9bdd7e980858705ef35c695919510bc4f0020d46cbbfc60ad853142be6f602fd1eef95f882f478915aaad0ea0fa2f75e8ec33172ed6891b4f2aaaa5304a3d4b5e9ee0c9f6e524f5c3c8d9f5a7b58daf3cea4f81bad0b9321c8b2d297ecf5eddcaf5128d934e273141b7d4b06f6d32539123fb7ada52918e5dd1423672a5cace5b1a191527135725d79e26a9c0cb274a30bfbf6a54041b1559237134d27589045a367dc77adbbdbacda555466177737a61e523b9f18d5eb05aaa438b67e6a4690f70c40d534f5fd66af6ebf11c181ecd6cbdb0cf79966248a68d3fa4f9a122e4c1f1784e7c164762f7b67011b756312a9870ed15b4c630c386f5eee5504d0b5cb9e020f1bbd97d47bc106a0dfbdbb3782e2663f16ac6cf0b420ad6b7339368bb40664560d940076b012a634fb04caca1760698cc623d470622f381836b1b40e89cab6e029ef2efb80e2ce23e9e54248cb839160f65d4a19e6ed977afc18c9bcb15d6233fd1983d152a3f70428c9924213ce765203b33e4ba6de33ea5fa8f814cf510ed7f3cd9f7699f8b94c344c3b34849360b69ac011841683a60cbe1cbfb538280522aa55e279eb337d6298c7bdae92951925080e6451da705658b3de910c8064fdca8d5cfd49baf6bbedd2d69a0ec225e823f7e8c7435726dd34cd590c993c7a4136294d30748db51d545ef340d397d86619d6f98ad71119a347572692c9c0ea87ebea912c78d7e0ea2ca998429b982f0b9d21bb5f6b9cbb30f70dc1b44cc2282a525de351c52e1cdadd4f503fd5278c511464a8959f5eae1eda4db4f16094d5b1000f9e40e7f4db47fccc95790eda92cf261c4bcdd0db44b557937adac3cd55b48b5c3c6a6fc08eb9f18de28ea735b4ee38b50f78ae9721acf57b7dc0d4e03a9d4ae0484ebb15a9b9522fc1f14cad7526c2cb8e269726b75e3a6258541251f6e3c5184c5e6878decea51eae315dc656115acc224818ee9851ace474f51ab71d109080a329d64e805250c721df58f4ca367733765db263271fb37e5e344c640fbc23a60731a32b20fcebd5a75bdcdd63fe9e9de4f7d238f620f4ac9e82260d614ef4e4c2f65d734316ecb6b92747d495e24768188716b4880dc6dba07f360794318ae970e843db6948c9e6d1d2287ee279e83e6b8bfe8a5f2ec097fe8c0ae72b0c6c109ba814a7f5fb09e28bdcfd20dc3e176d6886d80eee1c787e1329032098480ef69d863e8d9bb6233641b8448ee5975b9199f851d6a74f34da88e6cd485e7cfa0811333fe0ad02bc5e8df49d0d812e0b277a70ea662d4fac59ca35b7c30003a3c1710f8735bc592bc7db024521516accbb84511031e286456841a651250f8492bf47aba3114c32080eb361fb7eb8c606ba323951ce699b7672a9a927e2ef684d6e0f7821f7df15b79fa1a41e5a39c85f902e9a2d9024f7d6254cceba8122374a3a22f5725de78cd0f710492c58470a2df9b3f4022b9713daecb57777843a7a0fb04cc412b7e7ffeab1a9b1b3fd82d3f8436cb78df552880b357e53fd70ba99047cc734819a62f75b3bb88e33ce5fee5509d3851f81c9bcdd9bf1b49abb051cdedc3ce75d79eb0ba911d73f2a2f5091aab972cd45557f3ac88cda39fde7bc8de57b185cf4eae2955ab0802515b4e7669fdeb4f08de4d57a52847254956b4364beb5e405e641ec2cf6b44e0074d386e57ae624bf57c48f04121f6484dfda3c39d1391a62b0235a5ae3898b31c62fd196e26c4c5a3158ee507dba2b5b5b990955b36145f3d113cf77d79cd249980e49e35ced9681b92685f80bf13148974c2d70dbbad149d777be3c198abda85913425340c68d964dc1e863233100ccf1582af3c0c256d511e3a8e04fcfa7ee87c36d8f4493bc386d9f881a7a06345918418456f90431163ecc123cd0d82b7cb2932ddfcee18cc8a733e79676fd268d6a9ccc22eafd1a9dacb57c8a5330b2e35806f5cd461c89c77913795f806261da76ce54e01d195dcbfa246a513d65c8a2e69377e050c13dc551b2cfee4cf260b0bb5ad10715e59531958d4e49f5e3e74beccd06a1656c0342cf865dbb3309cdb0a6c6a3105bee3b5f0d74aaad1337994ee9183498fa6994b05122a55eb934e34ac7965d8465afbab4d06f02232bdd591c5a09843f96664cae750c394165f06bffac4e62eba986bdd37cd0d7149651a144be1577fdbfdea58db9a77bfbbfc8a24fb35355bebe1faf2b614eac29e910fc4893d0826bdd3f39ee8d890ff63d2a20ab7b59986619e6f93d2c3d03bbaaa7d4a869af25f2750474416f2547b95491819372a5cd8a235936794c3050424192c4d4be25e53a2dcadf16dd10c5cd9c9b3fa827ec47838102e1703fad1466445e476defb942ab5dfee4df65bffc9b7ba3a55a0971a8eab95084a27517e2903956d6d49cfdc0be9c1d201b87977ebb88476d19a5fa544812ee8a909b053d488738ed994447e1ec5ea21b5bb14bae9638f2f1777bcafc0444297dbb00097707b461162c544c18dd1c2a310081211ec41432ccf3f987e2a7b38de89242793246575bcb1e6b6ef7d95b220bba65dc41c +0xdb7e2ece42b5186f84e6c1407593a9b9e2971aba7122b8167b21b31ea5f0bd21ff754e4fefba71c9327eeb19625702b64426acce7fd88467adc3d2b38a861abd +20032 +0x1dc9e32ac4176f64bd78a6edd651ebeea3ba85dfcd8298a8ad72540619d66d317e3acbbc2f7282bcfddd042c08ea9690d5da00d9a0c88989f3e72217770ce2950b6cb29013a64a3812045cc07cfd0e08c5ffae7abe6ca13221e39d616ac019f3e9e6016f16bcad1f24751472d9953d9e9cb0f789d075caea60ec2dab9bfcf99343301e21e0bb95bb5ab99608c7b70a9a827643d07decebfad88c3abfb2c76cbc3fd3736e1aabe952dd57484af06d5d439ed8fa156ed8ecaab04a2c63562a5ab70556661e6c94912dd5d79402f9be1ee2195e84214a41b44211ae6c602f2ba9cdbe4161f87d7f749469c2e1f68db335bf1a904abcba302d0a2241607ee6d54243921dcbc5f6737ccec19e96ef52528b22caf7b2ad66ab3e4a0c8a7184232d0d64a8700c4d7e79902506f61db5f0a50653511a25bef5bdcf49f612073c8d3df27729c58c58be9898df604fdd1010b48f99d6810cb5106bc950095f8b6ccd0cdac33ca1b2ae5ed87d45f6333ec85a850f3e81b5cd5b5ebf12a76cfb63dd8ba2ab910a8ee8160541259ff129a8a475236c887b3dd27888c09396486ef9576e084f29bb13965a5bdc793578ba836e0a9390c0eca181d435763465c53eb4a21e45acd376b922400ab0614eb46c37ecc0de612dfc6a44360eeade5b0af5fb854461acd76306f591b7c5c634cdca2ce7400dc919d11f8268ba2377c1401a38c98865367cab8477140c248e2dea59cb263128afca9648a230e229e8df8e36d2369158310c76bb1093b1d4a38233a37a733c35fa89716e0e572e051afd1dd03194084287cdeb3229d44eddeb7bd12fa294093e949e8a182da545bef4631570bdab942b1f08337128a18a48505fec85ac523f4a64510ace67e1d05c5d599d9fde43de1ce104750077c00d1cb978ab2efe75866252ea191824d576e83f26dde3fc238d1cb50bda687cf980610d0c37b102c5888d46b0de7fcc47e0698113fec77f144a3483638a30a1168b203664b8961f0aead328ec828ac700b6e70b6828d0cfdebd6b3355ace04dddd5601bc85566bc0b573ce0e72cc27ec89f6bc56d828854498dc9ad296900e7180729a47f36a8439175d157e605ad576643fb97693576761d6356d927e819d98dc883b9d384e41b64ec99733435d5bba44ba269a668229e21e61ba09752b28a05c177420a67a2ac4c659c1d18e3c213485f65236a4415321ebf1fe8c0ce5462479a0c276d066b5e1188e33ed938fac51b264eadfef1d69cdc956a9beb8586c91dfa4b50448ac6997afc75bcc05b073be54964efaa96ed422311059f609ed0274d893aa6d71a3cc5506a5b81157471db6e6fafd1b55ce38ebbdbf7de6742bae4a0f0e40f6ddf544a5b799b7320adbe0f7d41383c696a3fe66b9a483e4899cd68ded74e745001969063d23f7c282c783edc6706160ce989b4fcf601a94aca901ccfe582bec6a78a00301c4e83771926cf51882149e7004a5f37992906b6fe8c663ac387d318f9b9008900d16f539d512ca54c92bb42d8084fe128c83dd45c47afe919659d8e20aaf93826cf2a05e080bca05d605665984eecc54ee735ec0d4b60a28e24036f44e5540335509bd4093be7096093009769a19eaab18cd8463820df2ecacdec058cf377b3d65daa0a400b15aa0034a321738bcd57f9c20d2a064c965576684296215bcc10b0fc3feeaf76ae49e34a264bdd93e195cf8ebcdf9f59ebde3afbec6b2ba5b9e16c3842c77b061aafb1dd715dd042422cdbfacdae2acf4893bd90d2ccd15aa8f0b1169bdecf43c2a413f66c9f731e58e4c40d29dfcf34143aa82edc003b01000328a0337bd1b40cefb09bff59efb18c8532cfb6bab812b79ca2def251922229e378ddf0e5a9e1615a32d712d26b8344d6cf495d860af0998154a7fc05fe458b584ad5bb6680522aab3eaf8d53101ae9a04082078df05722b16591e265a6f38e2946917d447e90cdab7f2d58240500e4ab30829a1590cebaf37ea48cb9b3b39a2013181cc8ca22b4229a585b8d73bd9bbf4552006712ddc91047e9e2494c0e17035a72823a8d9045d83a387fd682d778a427f91fcb9f0cb7d16767cd5c9a8b6d9bc2a895e2ee63ea9405d6aa4659d8e2217f7fe1885fe4ecfb8726333cc5b204b0f4c13f0716220a20a339c52621484100f5ed2ce879ecd0594e2ffe2ff40b440a97c566f32c550c42bd69b9be01adfc07304aea3115accbb26589147e4f1f967054bdf4ec59845ac3fb6f6c5622917dffd99e02ac5dad46cd733c5f71ff7560abd3b0d03bc5385b6a0452c836ac7b2baf97f25ca17776a7732151c54f2c950b84bba6e22897f87701811ab4a6c6f46ee1134de0588b90586c17cf3062fd0800c0b5a712faf84d164e19d017ed9883ae5bf5b77618c281bf80fcbe87f09b55a62a68bc48fb0fbea01b757bdb544bb053e6e438062b43d346777927b2422e0464897dec6c7105d37d2e3c23e7230703c54a88d978d7370d5418351198a0dd9ea4a49b4066a50114164f17d023a2f3056d4f8aa1b465c6b8502cd9842351d0aacd446bbe1edf2c0ad148ae8b7718383db1bd9299a21d175ba47b0c883a9f30b0473194707d67ad3c17e0a85bcbcffd33fa5b47c72b46537eb7cd7726c5d025387933bf5e6984ad3251deae49070d6b70b1f252353529a1aaf1eac165ad2dd6cbcd12948fcb7f5475e50b675c131baa7b3c4a5aeba90f2a65ba9a934ed8fe6cf0aa95ba0b8ca0c98c3d2f7c9cd741e1dc052b08ef703e163a7aa495e72f8b0e307886dada922f35ffbf1294113cc6391c725d044b70ff8cae99d16e3a9a1be512a0ab9b05c774bf57d57b58c428f4d9c2eda7f5079399b44b7fe9c74f02f8191e88cca69212b7901be6336fbc8411e956ddd38429c056b79895b4472c4d68d1dc99b3a28c5a3fcfd35903830139669361aaa758bbdf7cbd1d41f997db65b435d53b2738f88955a50898b1399c2e3bfd6abbec1ac4d754ed63ec825e6430246e90d7ef10e086413a400a053b944ad84ff97a69714d922670f1ff1545cd98ffa495d3d4d14b394bb50617c931f17784b2964ee8065df73a6e4fe07bf420848ffe6d999e24428abb3fdf27c3c2bc9c884eca9f2f80fceed70e06f97c1265db1aa59f8f15b0cc61d8ff55a2bc97fca02c4a1cd60888325f46789db1df47a287e9c1b31f001ef1a6eb1eeff17d58b96db8ce155939c60832d0d59c6f6e3de16f447932b02915b9413cc3367acbacfbea74043b918ae1854fbb4d8c9def99297b72f5a3a9563e2d1a1317b0a6713bcbffa81219e6c582b29f4f07f4a22b068393bd5e8e745041541ab842e7dd35ae30949b2034c1b0509508d62c5ce6ea2af59f6bdc7b78dfc53727726b6388e1ad33919657168815f4397396e34cd1f3ad8a87c596f31dca72dc2a8bbaaa0d3bdfdbdee1de46a5ba15a3c9d8554dcb1038473313b57dcbdbf14d0c495846d60ced3064c4de4c7e675cddf0e4a9e63c0773368c9d60a2ead8ea92b3f56dbf491b7e3a09877fb17de670eed20208a08ca1055e78aa +0x99820341517e3140475fc1a9e57a7f8b8bb85293ff7ccee237542e729531fe9daeeed96c3f41d87faaae3a7c6ecf308842b2e08aeb17e77a64484f41c60cd93d +20824 +0xf72b6620e71f7b50486d868eaa2cd34bcfef394b7447944f6f8a75f1fad317cf4f4a95eb75a65b5259f0dafc208981f4bc6ee8b8bdbb4ee36a6e4509116eace39bccdeac634829ca491782b102e37605b21464febc4eea11d83a9dcd678afd030437a8295c0dcd003f6ae475f7439cc5d86715e518085021e177e403a52ff276b2155a2b06fe2f3c64726910a7b0da7e57f164357af1685bacac817472657386cced5e7a092238c6dfb67949bb321876563ab7b589121b066261dee8773568797a481bde0e82cee5d9be7de9dbd13ef7fec8772eee724f6c2a1f62275ca6b998e6adf91fbd24dae37a13dbb9ae96354776250d695019edd32d6c75f8c8c14e2b35a46004bd124506e93cfd7edd88e3aee7d9df2b5810de8493d37f24638d0f7a92b5b857b754f5974fc149030faf3176796a573fae5e08c783d9e874d612e5cc236969de52f0d4ddd32b290fed1407e55362dc6cf90b55e4250819adc958b66b1047db6237f0c9229e0104691fbe4e459e49d579e120ac22a2e7789ae3686c9d82d877aa0d5bbbacd7cb42da4cb5ecdc81a5ac2f10a4f4ca22fe6e02cd49edaba1a2a3807d3a94c5a7124a2a1c02cbf32500c8562b9f1724ccd664ac2f0323dd942fc8aa2f943bb3365c862139acd1d1b2e191b6dd1afc78c9f6c061af9ff47a84074ff1ca7198beab345d8648bbe8c04fd16f16cb1b8b0e41e6ebe9f8244acc98b09e1df7da93302f1f3723f438f7062457ca3fa0adac2d5b2f4e0cb09a0c19f9b41ff65dd5144fe9a77cbee22ae6ec5afb0afa02d5471f3f585092800922aace9b3943a56d036502539520bd999dba1945970d9a9d442a16e958420f7a73c740eb53ce76a748b8a1abe8112b8e03b888beda400f0c8b97086bd0e506f4e9b7772ed75d798dcb90ef38de59d40f022ed0ed395d092a05ae3c651f430c806bc49aeb2cb9552675371481e0bf62278163185a1d2a320098b6db5fad24ca25e234d1abbaaab37a2cf4370f540c7adb69a0898eef712f952df90ce1e250e7eb345046f5e9f83b92d90e8068a308c635a02d4b1015f8abf2adbdf874268e0cda4a601e51216a947565ce1816367bee3c0f528568f9884c1dfe4bc69fe1a8e1fb0cac8447cac9672bb67c27a1742d9af89e57601f01e8ba200aeb9feb7b640d55627b9e604cdd5bbdb660d48fc4e67172368303bc97e29e03b7e4abdf5c8b39f0351794230f6e19324bc1486a906d1bb1bd1f96c7223ca0ccef801103ece50cd56bc68f197c4448925fe9abb93f8b41bd1d7343c90abf67859905fadf94392f0beed1b7c8f92691e6d91e240539088b9f3cc73049b6339c359dbc8dfcba51499aa48033baefde9c35a1a9dbd5e5aca05e046385cf9060e6e5e3edf3e1c8f3038b771a2c77c73210879fd2f9b1ad3e29025b8e6be3ff0dee9c52e0531624e805e54ee9c985e7eb96e4bbe0a621f888cd942b920a0e6b045c62d4dcd62438f7f6b01033336eb9d1d555dd1d09ae2f50351b5bb589d73c0bd73f502ba4926aea7ff5a74191baa3ab76e1edcf4bdfb85f089fd34010c7dbeb073caf13e4e8248847bbfa5b0cef0f432091d33f933dfc7def297b7bc964ae6c9560d7ddbfafcd98f70af1c8cc97645f7c6c77b50a4f637192bf3badda391e5529b4b1d05c6ecce336ea74d2f8390ac8317ac178d89d5605986cfb1f6bcb94706a3e2536e4ad8b31ad646bbfb85e6946e8c39ad224af3bffaa35a31aa5a4768301081c557ef47149037fbed8368de9a04950e809160e7b286f241be4af4b2d57951a7c7753cce6f5e1445665974ef2a0fb289566d8417f4890404bc5b24822b4cf7a2fe28abc52fbefb919ae0629ec0ca75387318fd0ae27b4911b07d624bc6157321bde4c4d1e24d4e8f0faa9a73fadf4daa8b266446f8c842074f142666228d44a2ab5c105b03839d9c393a84f534b8bc4de3183232c41a7f43cca1f967ecfefc843ad106f71ffc5937bbf2caa90ae131913f50ef84c0cc6155ddb943c771f4fb64d106210c941211efec75d3e5f9d35e12e47304837b6898cbd6ccae1b5e09c1b3224de7221c5f48236f3629626e19925176f109d5407976046c4e90ca0da8000d932ad1cdf54e7c70a8a64374e42e6edb6b5d87e0dc69999de2d1846a0d4a16c2a81f6966db6a2f661d68aab4088c53ff360ad74c9bd36406fed7f161d98a7670d5be26931b3cc17251dfd79637bdd25b6bab906f1b2175ce04d47047fec3bfa6a06991c95120d303da8e4291ee3d7a6e70924bceb6ee4f5199598982e99052b29cb4237ff9d0f4b91bf6843db875aca6e96161e20b94414020d995b9267ac0432f20542d91a776f09a9b15001300f9a33a9b6b5f85adfbf83fd73d4131dd98d6dc30bc68a52f0a58db0e6d8f8a69d1d1e8a2c08dc1b5e0184ac4d8c1a8533cdc3867c4b7a0d20f4051a2f6127b1ae5c1880a19f32c269dfed6350090d6563cc1a8280571113af645930b575f819e75d07d43d036318a763a66aa4d5568610925c003d74b72b46fd713aa09bd2a5f22ad5cf27bbd8e5c194970970785bb0e3286f48de29d41f8dc83580185c1d1f77cb68b6884ff8f15e7aa988dc7886aa83953da289fed0b52bcc8e49443e424d1d46aad487482a03271ec22e125f3e3e9ae1ac56677c13b6c91162df4ccba7f78da581704d2dd8e5c487cb4437b4ea32cd15a6ab9f2a05e90ea09b88598bb5e76ff0d7d10186695ddcbdad127600f44fc63712ea59910f18a3801f8d9305d4e46a2d9340ccdc453417c94ee0f5cac35d2d52d75cbf3797092fb9d83621c16db526669d05d6b5d4321fb298f6dc9abf24a96bdf46f6a607855b54acca2b47e6234ca2dd68469c7d1e9980729b54f8506be38c11f32966c554cf588593db20a9f684ea3bb14416abc1303cc319856ddefc83bc55aa7efd3b3e32cd4ad757d31cf675459f27faadc3e48aed75b69680d19d300493b21df5cf0b2cbce3dfc7e8a9eac8bbf1138ee82e4d4f9b6fbbafba9117926ab3542fd6eb82672c37f354e7b79c245419bd284f54c5284e9970faa2863252f99ed8dc26f66d8825305a2659add23219ff6df16b9d13bd0fdb1c9cc019b518b63a864b6f58923aafb55e64c6f5559a118b6b10c37201b5e51d08c09cb06a8bab70a5a53878b923d3af4536b4f6ed0344a6feaee03955b8d9477d8cbfb51754df297f110ac0aceb980458c5ad186115bb3670f3485cd870f241c128b08e851b5a4b5ab86c97323b079ddf3938c37b797d2407068541528238f31cbdf7a57c8725bf7fc2e66512bb266222bade5f01d792590c101f528b99b346d8731d60c440476e365600931512ff3b686e2554bcd603bcc6389cf54a5b6c203c71a92924efc83fc79c438703e89a11fb80980b741fd7347fa7869459706a6b8fe02367653cb11979bd36aaa4e7fdca2116bceaf15a16ab7d8464967e81b50d1ae713814fce09e695e16264bfb5325023591b5afa2ec9080af8bf63823656f025af02e1aa4ed88d632f4d1e1efa418949703cc45943f7336c2b1e632c3654faf76078ee3e6326f62bd0813e875f305fda83a78ed442a813eb4409fe462ab715da21fb10d3b6fc0935ec862ec38b09b920bce52234d3e492d16c089c96b98828141a15af30ee61aec8aae2549a28d47e61417de6409db49764caa4a5 +0xc1d54f9d273a339cd1750ffe36b10b1b9a60c9be1f2f36d238674e894d19b9929ef7be13043028a862c528e79026504c4a8b04a375a66d9d84efc1ee24325539 +21616 +0x38469d81ccf58dfcbb44898bc73f80316fb511e466e19e4c4349a2c87ae744b28b872ce47970957a7e46a3dafd2ff7f2b83582c143ec9619b95443a3ad00e0236378e8fd40dd08f980cb7543278383b63a4a74592e0c8d2aa145701b4822a55b29e37ad60a830dff299ba7cd2d844b035dbb8fb5108aab0864e5d0393393bbe1438e8977bdabcd16e17de080f777786489527cdccfae173a6bfc0c04579b493d1b41bee6439d6fc5103bc8656ea7315e26d5e3d655c0fa481d52cb859a8477f817c6c12d82a11c951e9b0883785b9f7b9c0d6bac88087bbbe1aeb6c2e5946f99a1e4395464fffc0c736648e3fedaea4253c2bd6552cec31a21da74c5211556a82062ce61d0fe36b477632f8be96d393bb4bc81099a59f9ed449cae96344d57adfc09295eade7f315935c66851f5cb4ef25c25ea148f246bdb2bd0c3b088597319ca1f252e5025ab52d1795d98aef85e50f9efc3443e1d210d20535be830441bc6af2d0465f97941eaf5e638d116ed1a5db1604ca756ec4710e3bd2268f147bd4cdc36c4103eec8d87ff778ab9b20c3b8eff31e6bc5e14565cd298a7c13fb6d032ddd6e4bb94f1f6907aa7d3a124e80a5b5fcf1201b817c76789506c7f60241d0f3097d6c6901c15bad411a435d4033f493fb26f05f97922b7548ee0f22711cc3850d41adfb4dd536db82f6cd643e022ef3b664e4796bae0c2d0ae95d7e9028654cb16415577b8380f837bae00f9015da3cf754035245f9a208a29fb8f2a68d3db0bf8bad66d3f5c36c260d84467d9580d6849e55d06d9b746fdab92866fd73d41afd607c0e9c50869e1898c2f14eaaa92925e9e2dc2abb0bc878dfb5c2db01b0f0358b8a3820bf52f8d403a1f84c7bdc9da4ddb35fc681ed7c45b868ee895f5b9b2db4dfcda568aee124f52a43bc31a19ac823cf3f8716a4f409ed48d34fb65d84ae8284b3747322c1ce1664bae9f3808858633e66b6a2b8978c255d57742e3c127f9d80d4d50936019b0f57461aea02cf1d4409ba9a4cafcc9509b06342ee82ac6aaedb160f52730753880bcd963eaed7df6f37257d3d13fdee4148e0ff1fb6bc355d9d636c75603cbe288938a6160c08658cd08ea59d6b915d742eb4f4e861a9a951cfa2329a8608a398d870929aa5cb7942dddc5b9340f0ab4a68c969720adb8e3379bbaaeb6bd4cc80005ca2f40086e13964f9e7471982a06d0005a6e439baacaaa1951c8d9906ff860ae31e49a6a3661a70cc91e27eae0382fd52f26777aeca5f511ad0ab98080555fdef4dc41d88d08d063da18cf7df9e34689797234a1fb2f990310d6bee40a693e167788aef9fe73930345e6c0d7a372848bcdb3f3d752a2167c21df52518a9e9be32e7c6a34e73c7f59912ab47e89709a5a807e4d518fb7fdcb64672c5f6d8fe9d3ae29ec2ff3bde5e5403702e91867d884562399c70edbafaf3d10a5444f97b8566b13ad3190827714e79e448ddcb2cf87a366719e6c77bc66206e45c69d5077f9e9bc35e04a24a386dbe2f203530c0fd2fc995d4e053694aeb2c2964cd344b92cae961ec27d1eebb9a19783bff7bde9f4c65ec56c7572d8d778c00f5d8deeec6d3e43b04ec5dbb01bed1e723a47530e7ba509426049c6e97ec6f9296f29a99239fd17a2eba0d5b12bf2fa65f8de65edc5fd2b4ccfdead571341b07cf8331f4b217fb45f2faaa73f6877bda7721961086243574d11c080a2235d98628f36ca67a23a9c5d912fcaeb5fcfdaef3c74cedeef1bffdbcc8c0b4b2d9f0372aaa115883ac22226a6bcbb15808fc485ce9d29d1bafba771568d87b2a06aa435c11e8b1d698af832e6ddf27e792c2d03aeeeec915446c0a6566190991a64dd2468ebb5a7ad19810ab8000b66881956f133e6919e59a1edc32294b03efa0220b718a50fa773d25f36b0df506e5bfbe4c71410a3492981718071936144cdc7117646e703ad6c69e51f67a87c065338491db5f9bc32425a1e4699ea1e2b142821ea7a0e3c29e534a55d2317e8cf1c53163da00e26da42b0268e220561525ba9c47c38a7139d7cb72248998a211905d0cecf58ca9db199183cef9071b56b12c08ba3f92e2488a185ee9a319baf84ae35c54b46bb6b48b3f6c3b37bbb94d5c800fa0a322fd96be2156caa61b90e8273f6ac39f05d1a1031c05d922a4f8a12e9ef72178a18bcc7bcea2ef1c06ea8a305a7e603fc2c44a871295d0442b9ffa2f6e086445775491c90789818c4191866c1adf531b0b56562208664825b6780268d98c92920b208eb1b454a87f364d83e468d7c5bb464e6ed9e7be684baf495ee0c5c9d2e8c7b76a3abd4c8b7c4ce5299e2dacdea8dd7539b695e658407cdbb99f1c084dcd12e1ce6d0ab6530beb2322a44fa7c569369360c0fb26418c87f6b9aec4912acc5465625084dd27b47bcd13feb810a386bb708aff01c54bb536610614a7ac926af60ccdee1108300064aca7b24e2f9f88d2d3607c900d9d45f3e649d9aba1ad315e9eb84c9a7e96760f8884cafb4be2f6e585893e8e4460c4254b2a06bab7a2a8f5e3ca740888809fe229524da5ae93585b4fae4de5b3bbb8335950a2bb389a5723a2ac6d416e16014656ba44369edb379cf777b27ba2d7ab87d864b5956abcc751a5053f2f788226a4d963b69564e21910458b743a59db2488900d483296317fe5b27ef3b9eee9966278f7abaa48cf891f03939b081ff0ac9e49f461790320074992bf8fc61776d7eafc1b2c5d91ca0c31f73630cf3e3eca31cac10b52fbb2e8e30d6f1e403c4e73a22c793f9689fd2caeea1d3a76fcec06a9dc1b4ba5c40fa91dea36a50ea59cf2f4d2b9ef3d768e70fea5f0c1e5a223e86f47aa2b5aa75ed25ef3be2e189a86da47b483413aa1a56089ed56ce04770af9e9d317b25aecc8ec0deeacc0466334b5029c7d3f75526b85b78df767bbc5cac080470ae88bdb747e94a4ab648047cf0a8f5052f0d7d10766f14b7c97f2d28ac59c6d2ad6d6bc8a105add6121ae8f7f625598a85c4665a28c9df18d6391e87391a60b208323d6342ac76076ffb8846b44bc3e288cab57647d2545d1d5804dadab04ea93f85b72985543f79306866bbc382c087987efef74c3ef10f1f4a7495f9b20d22c3b64d8de183668603f008f99c60dc04355f875fbe6651994c8ee26b1ea618b935628502ffc087c84b10f372b77c72c30ffb031206ced2a635a3e2acc1f2edc6f508e22b38821fba86499aa9ad2c215e68cfe6b0cdff10906b17d9fd8c2f18e69327d959144eaad736187310d6067420d04c96ae6c6d87f24d595cbfc5c11692803dff2f2b8c95a8eafc214aca71c7d4e70fb77d7aa0a5465cf6cf76174f63555cb9b81fd6d27c9a056319ba0314a8c51d77bda0712ef5073a6ec6a2f9208ba9793998adbea6dc3525fbb0e11865a38bd4131db9d86ef3bf362fc6e8d3eafc09762c155b3b701104cd14ab4262cb2493ab605c2c28e72dc900c8349a301530efc40fb2aae5d4d7835b4c5d608adbc87723fdfd69db3e0fcf0ab6b449a625c6d6f352f50f463b7c3b51113bcdf91dfba0ae3a760577ca163bb479ba79aea32a5984a4510ac51a9b876ef1eaed25e82a9adab45a817721dd99ae9fbbaca1f3d7e1e8625b2feb08a201d56cdf4099e0f1d019da1f6061bbc26349773c5538be5c0aaf2b77e1306c2c3554e08d5add8eddeaec4a4924c02e711335beb0f5db69332e394e4bb13deb969c4e0b79ae69584b45d2534c310ac04643c3d4be10f27ad9d727692b326bdd6da1213c38cdb5c3c67b6ca3ad37aa37de5fa447b8391669dc9fea0aaac722d83dde8f012f0 +0xbc393bc550a3705fcd5828ea43b536f6b2de8426bb7d0857dbccde4cf0ca37bc8a3c27a93096b4ebf7861843da5e4c31a43fd7155ce8c986ecbb039739ceeb04 +22408 +0x02b74a2ca22173be04ee6afd204d76a121cabfc10b68108ea1f0dc4186887f52a287c7ebc788b39c95be7a509b87cf80be4364a6df66adf5b8cce647074d5757ef92d7309b268fe524d00083b5214844ed49a005842f2afa32c0eaa1cc8611f4b17d82e364238f017acf037eb743665574847cc643ea0f07d673ee371d5c3693aff3d0ec6ba73b595f618c29e917b31b1b9effd264bfe5836d8efdf142f74d9bb29aca33f8d91c539b2ea26c92c2b6ffac3c320f2fd732d6bfb81cb7827ede74821a77a153e1b958f5df4d2ffb6ff767ed091b66ec5a8167949a5571271a7285e71ce01cc3e89ad1361c955a6d44ffbca8aac4bfe27057a0b4dbaf0777f29038a9480b8d91164824268c83d52e695567a3ca35035a3f3ee8e7243361bb2fc0f48f4502dd06924abb8dd81e88860781cea70f75189cf2bda7f41de7673af88a2262bccdf2688528fc33a86f5bbf460c5b7b218be8f0af5d46a46dd5023e767728ea5472b6ff166b51e0a27c37204d7d75e9a9825a9e9ea42bbfbd05180dd00e6fefb6fb10156e9a215b714f02f0455c83b74f5f55ede91cbf0db47d92f02fd75f39896fe7f0b43dd36dbbf0a6785532efaeba2cc327b54d6a55fb47592fbb5b608f76d725d911ddd1de29650900a685209693f18b922dbe9561396b54129b21dbbb253ab118ad01827662b815cf60e07e3781b4957676f7a6f717ef6ae1f8b236833da073f5af314efc0ff1b02faac871582d7fc91dbb8007e03ddd85e3f994dbb0671253b83ff59d3ad716c466acc761c33e590fce22e21ee4523c8c61c751300a4a9639a887d6d7f6633138bd8f64b63e5d4b4fd0d3a455caff1566a389719f588f370d0eac5b64f95a49f47c7b28d892325b716cf74e135ceb6ffdf1687a8f64ddfab732d90dad0b6567e0eb9799308764935deab668bf60be5238938cf668f4dde91f5c347218f32c92e4520c4124e49cfbfb92377bc39f22c7ffd01c6c91d1360b2ed4e5140e7b56d2e8f801a81d73819a34aba30e86e1bdd43af2416574c39168cae1157bf8698c2fd4269f5484fabc78ee7f21aa70ed3784d13f226878919609dccdec2d3c8675b290240ecfbf42f49d1254dad6e98d39dcad00e8fd0505ecf54dde91b4449aba62043a75a13813d2128973f61a59876be6b47cbaac83e53c34035d2d98766d024819b0fc505534fede39249cfe28a474a9cffdc1fe5afa2dcfe892e75f3cc6f66ab5cdcd66806f1f090caff40bbeacfd2de7c9247af30c68cde3c4e893fd6f3dd2c1da0d6b208add9ce95b27c88467ad7be2290ca9b4e39436db3c57bb202e8088261fe7e59c4ee29eb7715dbee09d2d9aaa65a11106465a13ba435d600fcc6792cae4815e5e83d3176039bd733b15249225c50a3c52fe626b671f2209311199fa9771035dcdf15b0fcbfb7071fe983b6c3d9170b2fed45346ca18cd3eeec4bfc8740d966b515f208fe0ff9e408fee1a2fd910faf9748dd6accb788788aeaf80024802620f5297ca9e878c6d6658df68e3e08bd19b1af492a65285776dd99885b2fd968ed1385f0245a8ec086dbf33cd903c4a1c205ad0303b4789c677d74876df7a1242396c80708b2b6595dd2eb1f33fd495040e9be8577492ca9b2e1187fa92a7bea8d054c2bb78f8403d3c0c227ff890b4b1ef4405b0571b911f19ed1cb9d26ce1e51d59ec8b14f8c52714c14e1cc158ee4a4abfefe2efcb2579c0d4d15ca7b1c424a8e3c88a68113b7cecb5fd70a4148df8a8736e964188d0d2ab2f6c8b195eb08bfa5b1c5e7b2cec634d50f723a8acd7e290c84a74573bd8526364b6ed315beb429a27b1af55321e05befa03ded50815318a264a2338cd86206fdd772bf690bd7210b14f26ff091a89c71beb4934118e0c1ef5384cec242265570077ec71e67043e560bd6a809b2818f01b750bccad8c9cd59dda967c2af448a4377dd9a8434bdca09bc524e0ce8fdac2626acca6c555083686f8aaefc543f2dde9539aa5919566c9cc2dfc288c99f6c4589136c8423279ca195c2f4ddf598b8a7dbfd670b69708e95abe995fbc8c957f65b4ef3c0a6b1717bccdce9e5f7c3a335d8a350f9c99eb87ad40a48d46b1de79f2999f0a074809a7d8122feb2df52761f07c618c29e2362b2d7bc4ba1150fa3c6509ef381f117802d6f4f93b310c7b9b9e5cffee47bc125d4237a2ef07b1105028cc86d03c0d8bae1c3bd59753085e6acff4ba3edd6da7a6543be6340f1b493ba1aa0ed945856b3514af6a067b33f755eb0a3783d23e1c8dcb50378f11d8cd873a6b2c5c22c13f1f2517619091d36fe45a6721c510779a9b0f3e3d0af62ec3bb5ad68a60bb0930f2b63d613d7d31ed9f85d31e0d7e60485688cda1aca466536068b5d0edf8a5663831e7131627959a0fd215d66204414f489ec40b7d04c7a7fdcecea60bc1dc0878fdde1e2277469ebbaaf7f3cc8a61d6f9baed2286fe9be41af3e9b2c3fef83f3b82ea2c6a568e202b763f1a53f80906f0420e8fce7b2835403fd09f1c973f320828d2e2f4aab348e89cb6f500368107b5a0f0fa5d61b8c0f51a4a131f74fa0a675760eaca5dfe3f7986242cda2d1100d03a5b093c9a91adc4ec1eb6d37d70eee0775aecf455b72d669a5167e9c30119ca7a1767720cfb25321d1532409beb07fcf0898f787c263a3842044d36e1987c29c7ebba07a14050c915f72c6eb4b17c422ab57c60b8938c76e50786c8701f4e7888a0ab043fa755103d8c4f66b10b763b8ea65bb4f3454ea8ea20bba856deba3c27fee170d0775c8ffb9b402f7b411d6d8223d37a1485a657bb1894dc7d1de5ff0bcd05533bf98fcfb8eeaad1f89b98626ff68cbc039bbc0abfb6b86ecb24fa489cd5beb668751457dd4b3355126110a2bee52f81a8cfb9495ec4d0652a3a1fa042deb5a03f3213afd07b83c2b0daacb3d5b964d2eb68c59c000883ca81a97c8e65af9119a87ab560fb464320ba4f951f1e39d2b6b4b0078c0d4c7aa4b7b73b9a6d11fb298b9321f1c5731b771708f26eff2f2235ebeda8a0ed565cfbb6ad814cc2cc9bd9d0c680ea95ccb2d0b14dec26e261fb577868cf6109eed2d865d3792dcca818305f5bfad4d517b1326f66abd12e9906254369a555c7de8442ac7048c4f46d1b36209ab636ec1dbfa6399a56f64b9deba63438520690ed194173cd1999a0e24bf4fccbdd9842a68533f733161ea13551e2341cfdfccde23adda233123539d05171d93596823f7aabe1917712d0982be0e2295fcfbde4868e1f22e85b1f28ffd4b6a1210a7d4b60d8b8f0af7394984641adfd47efd33fa1be0ed9341ddfd4377dc93ad76110ce21b4c1fa2260f2094d1c4b961d85c644fb71b2b06180fea440f4b48e9fc2c43085e803981a0273530918c5de28bb1c5d5b50148fb6ab0302e1e07f83c15520d9541c86b3dd809ede42de22bbb2b75ff18a023b5f7ac77655e4e930038444ac3156f75331b403fc12bf166a1701a1166751302f06f6fbe0040fb8d1f532b4f0a1532271fce7b313584a67a6d95ea2ca297682f96e7270c8792bf5694011cf758f1245e8fabeb76e16a979dde911e2029ec19fa07d354db61bff4801ce6abdc2645c07c115813892b5a5f5172f6288462efc302c1d89bb32525557a08684a65f89f9100333775d099e06835c9299bc1e41eddca635b4e2c586f3cd4e50a9b1d564b109b63ee94f5a3894cab5fdfda8133f5e4c15adffe9f61fa25013141f06ab5f4c9ae31d1f350dea17732955d771ac911528816db2f94e852a88f8ba2fce69e1916a91b86138aa1e5625c1836f42729dda17f35c15395421531f042b213198514922c8f7f780ba3b1a89846f0d41eccc77c1716470d29059e5ba404d3d56bf193c6990c22834c5a92b477a01f996a286b2cf066c0aeb8a96a704b209cb6666a032e8f2013e7d51cf5106ab227a6a1c3455e9b75d2cadcb4162 +0x6b543633eaad9b4acbdd18958c2f76d255fc32439ebf5b7125e6826da4c2165e4fb7295d2804e627a072d2382ab10d43bdf0c0e5e7ed45f3543c7cef42761f1d +23200 +0x126a5b0739f20f4e7a2ca8f18d41bbfcdc4324af38125682ca7def664caa904e79b8ebeec1a21dc242673f53f46837b62311d45523bb1bf23fd1dbe8f23288b45ad745b5e9b643305ee64a97f303950bd8d4e31fe12bcbdf7c0d5011e513b5ba9d1093e418f4289fb5f1f246f4dc7c03e4d57995da2a0f51687975678d15c0672aabfa04b526751731cf5ee75eb995a72d5cbc4076808f51ed5d7374530051c4e9f0a49c2a12d1a1b9cab802996388fe9cb1d7a71ef4f2e6f20071c09d9b0fd7c227b934de81e5433628251f0da2fc10191bf0533850e01960ab98d1d4afa3aa9e976054393a59078e32cfc7223d9ae68de330ca2e5a03f11da610316104b4456389c285a307d4f5aa30de8140fe0987de52be9666db007612390068aa62ebaefb45074e84aefe14726a7ad6cfabf1fbf6aec33e4a9a82b027ac90fc1991f0ef4c13563844f8806cce27c94d370dfc4bbb3f664b40612fa84546ea7715586a10403bd7ca4bad0205a7b1f66ee0ecd07e174fd044b2f6af655250336105810217be04b48c02952be8e34e27c13210159cf12428b10722abef3712964053d25f0eadb81206cf77a41c6c4785cf964074ae3007971ba7adcb4fddd4399e66142afcf79d1cc11b1d14a928e4371f724694bbbe404509fa5fb68c2bde4402a60e0aea83fbf7444f4d2498016c65392fe81fcb82175903680015ae0877e0f57b8aa8df391cce17d1d07cf0de2939a636efbae764d4fb9159578fbe5ee935fe4d4eabe30147c7c30b6ec3b9a661d9edee220f154cbe553c352dcdc2147a6aa58424bcfec3c30acf63eea2fb435d6d96be4bc65f221e8c8b644a76c51273a77288d2833967d9c0c3431ac0bf9c651e2a103087cdce3ccb074e7633cc401c16eec220a79bd5d1112812b8c60c99c013304b9bf966396038365b79ace186bcdca098d8d12df6f3248438915beb22b87630d652c43249d2fba2f41a880bcc9c241073c0a8f6b08622621d6d28631f936cb21b1d9139e7d93dd37f227053fa0514c7bca2d5feecd432472914d47c789a1f3f81c60884fcbf2650665a0bbff83dd44cd944ff4d93237dbdc44d083e1615b75e7013d01a6ecadda10f87025aae8c8d27346ecfec8bbc2b4b56e16cb2df4c5b9850ce920327438b4ee474fc29043c67e133eaece2bee7637a4799a7dfbc8634748abdf5480d7257df4be8a236e3948901407f003712ec4dd0ff3b62ce950d6a7a84a9a2f00a9e6addaeaa9c8831db1c0fc2f4b0f3711212d7e68f448553272432a75940030510ebd074839127d85a47942112a61fc2a2da17645ff60edc1d8a255b97788ae511033e053b291cbe593317c4a18ac3ede4cc17e2711f711a37c6da0929f28b94e7dab1c99a0d6ecd1f0720156903e5d920115fc68e68b4f4bcfdd917d85511f9da97b02868e525ebf6ec377b31ba8f709ed0777a7e79e151f65aabef6c4921fc3463c48a6c584a02240ae55ec357c899a532e86409f9ff1b2b02d7f7ad78c5853b6573576f0fe3f9f288b126e581993c7f5f38eef7911739a420e5996387047c39c648f739b2fbb8a88f243c60e00842727ef27f0fe83093a9da5e3c5521e7c974adc8d292e897278e46c406fb1d2091c7b89b7e1aa752118158c9474cec745535437d504259c12eecd61ced80e0e612c634bd55e175859b76c3ae241090b506c3afeeda10ae80b50966b15ab5d064adb61bdf6b29fbd219ce43953a69b6b2c5681aa3d6c58fdda42e1f0db36496a14be1948a28bde04073d2ff07f11f06727b6aac25ae29a3dee3a329b76153daa5d28dc845f464cdd891ca208bb1f927fd0e128cfbc804938e5ab0ab37cd4b43792c03de9837e56aa15bfecdaae2c0c25b68a8e3ad8e1e06f2f29dcd165e1379243f8bff0b59095ea3bab52febec3c7e956f74d8c4663fa51491b1b9db7b7525aef56c5327c29852e694396ed6383504b10dbd94c7ba2e18fb2035940e8e37ef2034f00173db5aed73d3d0b1f32c73fbba29cd3f3ef1b406af88718937fe227e81e65d32780a16d8515dc320cb31bd0cb5aaea00b173991839afadbddf33fe7bd9f2fc0dbcb896ba881c5ae5e5b0dddfac7a5dffa9a8a5f5a07f315b8d95938d304015bbc94ea03c21f6dc25c90f991ba6806e65aef89f45ecdf4489ca8ca85d8fb8f0632732fd0623d5930b00b8ba68aca4645a46cb51b225b6306f1d800792fd42d42e5cce75bf96a0c5bc11110870c5ce8905fb8981e254ee3b370ed976d583c60b44f289cf0f823fbb6384844ad8f9e6238f549af87d816eae0625ffbece282cdbcc71cad5a0f099bd26e2774a4b50d47b1fd9667e2cb21ed107eb5aa724f45c8dee5ffb4d17e798122db254ce6fd380d9de1356db97f1e6eb5fe752f880ef3e68d44683001f702304a17c829fec89d384f489d0d66545ae4639a2507b8922bbb6a3adcab65e9222d9aac969856b7bb3c688c33d383eb75e28bba2baf6e894b9bd861d38367c557eda6f1f714794af09e5c24a06c9cc4ddeda0d71fa32444d21c7a31d354a22c11d4f190902af0e2fbe2acba59151b41116a4589776f74656dc1a223529b8f8dfe880cf0c84838203b8ddcb5c4898a10befcdc49a980c96b6d1fe2ced7c49a5b6c7b4bab25f8c9731e146e9f8926539424f9f7804c73bdb75e7bde9ce96c5d24ea3350282fb92f6c320ad4e00d68224be20609d5c6a4abd9c089e805fdff426b06249ce04c15d46c05c5922fc7eb50b8748595a2beb02e6321be81928c09e4ae3ee3946c117b430317f938c75f1c796a6b1d2d8f8b12bfb3f07e4deb29f8ae5ef2d4d944066605c1d70a3b4f297806c2241123e4b248da7ccb6daf584e581a0dd09ccdd09172a718c17d1c3fbd8a73603e263b5acacef90df0f118627fb4b23b469004ca590d718875c65e1181c069b517b0b65a4b11b5e83fad3ba2147b0157c342f069b3b32f81427a635d2cb634415f35375ba9bd7babd5f66b8fc33781e3e54a236737f02ba3e60dde8b04d87d85734830e77d2ec4c972613a93f266ae701b0a102b6c30e050aef52213b0a3a001d25e35762be22bb183822b573884f18cd307392eb711f8282bc4d09f96b436471aebb7903c840af487bdb031fc0ef59aabc620f9af0fdd8adb016c874d66cab5ab7529be25610d230d886bccb381250a13cb4a14ca870b093b1f48534b47b7ee128f1e688d258c9d7376a07005780a8b998b26f870140b23da83169bf6e39840ce9e0827ca2e13f4681d00d44850007fbb8a4a2d6633485b27e139b9f6a6e66e5e36796463073da839c00f6222a5c166d85d261be3616d2fa19e3435c12e2cb74fcce4a6fe2d642987242e91fae5a7c19e583d5c9e2ac401e63e88b7ccd5c5cc01d5cc77e22d1208ceade0ec57ac3e107c101267ecfbf7825436c998902a6c1d12f5a35fb572d1c68eb1b8e9bf45eef3e02927b6565162117a0b5950b1b86a1af1810bc6ee8b2dd335f43912985f54cc68e7ffc070d7be4fd640ca8887fc5a463c2c682603f280cf52d9c3ef8954ea0a74f10d3eb2db469de76b9fa8a962b73f413c4b259c35750b73d6fbe8f8d3394e92c8c259a2f8a57c2be04b298c87fb66af55172dfdc07528077033976d36acf950c3d1d9a79c557b12435f83b7d8b14cd4fb7ea7cf2ffba58c3a2d636d1bbfab3d969e075752d10b49093f6f91d153626083c44b76d082f470992bd56eef0bd497a5999b289892bd2ea67d15d10e6c47c0a29a518b6ea5956311c175e91cfbf61d7556eda1fa34f141af9b4ecbec665d83cc63728336de18c23880cd72422a902d8a487749e4125800891c530907cc141865a226e4d586ff2c71ec3480eaf223565900d086e2c54219d772cb0ecd281bfd02f8e736c75aa8e05266539b73fd301665f281ff72c85fcbff212f43b8e4d5a028ba2bdf98a3b6ac6e719328799646ec35aff40a009601b574c9f85e679cc1b05b786d65a60c98ef0aa08bce6877c8464c9bbf3d38a8c854ecbfaea535ba709bffb6346f9bffd006db7595e3ccfc34c31f483c0f878b2428ab84cabecfc862d199e61933d6f7fca235635a1f13ae3cd13228030759b795bf55bbc51 +0xdc0465690127cf6bb6a066a8f400e64582e2540fb2794332533d37873f08dfe7408b2cba3b539138486fb75aeaf081229c525963c0d86efbd4c744f75496cef7 +23992 +0x5b5180ac2e0afd84fbe10116aae8ec95aba3c147450c1f9d2bda74a451036d9cfd80b1e52150ce23e8bf739a8fe8e1da76799ca177b666fd76c16db13918c4da7a5f10d23b6084555a500fe26553d364af43da12a4ad0494591d4467689c0c82fa76063a25410563791a3bb8d532ac7d7f8ae26274fae3abfd78608e83972fdca44efce487fb3b956ca760e2878c536b0ed41e5991a4e9898a5929ee35121430a16e589907970c325c7fe7292269b07683acf5bea0b300782749074e2313a3c6195e8321501c6284702836554fd2abe80797cf5b4c300fbefccf6277f8a5c4e533a7e644089224d1d12cb72eb5cd2c07c11f14f63a22fea43273a2325acd5fd717d0e8cad8013a62a613d17bfd651b1ddacb2d581591b572f1bd2f45f2955ce2ee61f07a67728b7f1863eb06ce9f60707923804983861b70603672786704a34fe0e3681d5eec016f4fa66f95d185e348c7b076912c071ae6a865d19561221d6614ddb77b6478837c7263c4f1ad1e8defecf978f7ba1f991bf0d2b5628af8b06eb3d7455c221dfaeca92352e20b7244ac0f87ec44d2d38158610687a9878d45b1e4597a883fe34c081e6d8130938af1c658e03b401e2db8e52388ad3003eac575d0ecbec664d26218f6c9b9a2ec6d7d86f08eceb34634270a5de091c0a41516039e1779e039f324645cbf6201bf23ce34ff190c65f2f0b60f38979920121822a37763139c654d7a3376d8e415b3b5ce18ac075c1ec96a4e3bdb342f1af6fbcf9c8357f4c391e84dcf6c9ba7a6712a637920e228a573a9d5d76e3fba74f8c40738e97b841d64cd837e6791147ca08a77a18331d7c399b5352b1b41a2f7bf7db1bdd2572c71870306898f40915ee9def1d6fc7dd140e397547f08c14e6bf42db57465745289a192bc380b328716f42db961b34d7de4f8561c1b5d4728983eddfba5cb59602b5b838fd204ef5f6a687fb78ad129457681fa7346435b974546946a982b8ebc205ddd66a1a1fd7f23eedcd3987e9990c0258c434ae286033cb45aec94ae9cd02f4ea828eb0be651092d4df5d5e126c7888d13736d614fd4432f3768e37c0a0222d7edbff969323be3ced90587235750976097ebf8e83f73235f34c7cbbc60bcc09fb31213e467a77b7889ebf76bb594b547219333a1dc46a4ed58ef95972765d04f020980a40ffc97d4648f6de2c7fba9eab75365b2b1b68d81acc98834e6641b8ee28c8ad0b1a2008972d930b015ee3df06413d743432ca8c2363deebc252369055c837790d6017e40bbb28afc27d337022dbbd27d1c0ebb5900340d566c09815b77d6900e0581d8a14800c1ee861360c71c339c87c3c58fed12942f2b447e2d393c6e1d6fc68ad85320ad1eb0b91780e838637d8ac0baec2772479a6234ea3347b13166dea18444ff4b9fe96748465f0c8933bfae9c5499af2a339624c5b65c2ce008b2811fd7e54cd2c06a3ebc07c4dc188ca91adefa602c42426d997d487091d1db4b80c7eb83e3bcf6e95b9bc479ffec5482f70e160747c05b65e8e709371d8b9377042228e66b112bade670e4441e0d75936cb40f57a7ae65c83a8861797916167f35b6f7d58dd946ff08c0cfeee184d524a2594d18f4134adcb6eab9fd4c7a4eab3a0ebe19f11d2f27e815ec3fef585e7cc1843812d8f8f1ea8594778c3fbf22423cafe67a3ee5ce6db0f6a5fef191f6e5f0be380cf9644239ce0e05eefaee798e6223d8c01d370b1885ec61f58e3887a5578eb5d0ff5f2513bae1c9eb240f3dd5d5f1fbb3351dce72917e89ea6f54f8051f7c172493f282be71942d4a65285560bca1b61b2f9effc1fc3483a63ced314d7010c6d15d2341831aaf97d56743a97740bb73bfb2c2864eee96b8f19c0c1ac571d32a9f04fc4aaaddba7152cf67216189c8996867924b618e2d909237b79bb54b4cab553185857be33e228a489da568be5090def515364204807453b6f99c642504b2bd8bc5db3e54c3124578ec1dd207d9bfe9065430387917cafac1d7051b2881a59dbbc4323a58cfa94b075c71e88ded90513f551f8c157bfb50ff5bbe227c4deebe688a74b815ec4f639ef589f278136add4a22ed87ff33701d198cafc148f0f3e83b208700b6a16c57e5c04d38f0d4b557cfc3806e60c79029b672c140b4f01ee2db8d555a617668ed83c4a6011cb6da85753ec28c5fc0c23b7f16dae6ead7d676f2d9c40e3ff4abee21097a9724433f2fe59d992825a5701d1c7fe3fc0f2c826a250dbe6377a29d216698b34031034d1fc7e8ef89d9fe019534b5c5ca4e788c871e2f2aa23109a750fb7837456b7d6c1cc225abf8a454dd6c6fc16698cd425b95854aef1497af2f4187b1f0eef93905ed7e5eb5bdae2d6c6a77aab0aeb412575c0163f7fece1e9fbdb34cc48203bf7e5ba49af5201e141556f1788a532c70e8a33b8429ab01de5d8c27509d4bb398412edce253691c8e43f98834dbd15de57634dbb46d625675d3768ac5628f2f4bb42ecd3db7dfd2255b1ce2e58d6e6ef869d588fcab6af56d674384b4fb979f60412220b309cb6660c685a79387738732294fea62cb0c074e83babf244fab2c5f4fd47c4c317500c7ecfd8046b128d21a1e6aaaf1b690b49e8ea5e01d4812fed1450a8a111725c9e3354b1507f3d47438b1ed70ae523e23e7f0ca92a7cd163c3e8d8df209a323e83b0a390ddd35c0981448a2e3a3885d7db010f17bcbc7fd0e2c8e255b3cbeb68658d18d10d15f3564374d4facd74137e98258e443901c109d25b0996db34e28cbc0f410c8ea5979002826bd7352631290e42f6a93ffb59711b05bb3d1753cbfdefdd98ada300bd4956f3db4df1dd7379a5efd4a131e7ada9256f7392f8a71c4e897eac3f1ab5e904b95f8fc983f86ee2e782b4d6af75320469decf42efbd47e10148d82b36438f44921c15c47c0577f74bb1f3b409229b35810a3ac77cf4c377ffe2c91c8628347b89bff9d94a9313195ae42dc3ff5e2d9ee348229b20ec3355cdc2eb6d9ad25d2bf8b19872601fe4db9dafcf70d2a68db3193f23286c120c2d037fbba8e4e08dd877a79e2a6d0a51b07c5b6565239a10148b45c919bef4b240396fb648e4c12af38f08676bb1e0ee3a8f9d6bfb72877925b1f260c9aa02ba31c81967e82af2d92f973a80b0ef421edc4fec6fbe301d1d8945dba6c2bdcaa89448034ce118040ccf28d47684659c680825aecd280cc961919f57e78f5acaf1ca21c3d1ee4c632a64cc5cb560c56e5e60a97b20b338fb09e126fdcfaa11723a65fdc1934a289ed682fa39d9d08f26665853c7f70a65406afa8543bb8d626ec6da24930d8f4d1585ac2b02305e13531461bd2bac781228093022a027c3de0f3ba94e9ead482a75bc42e73c65640272ed1f3e0cdd96b0206944a7c9b0c7e4d20d45c47b0eff312deed9a75ee57ccd1464d36ee1f6e0dfa80f8a5cf6d3040755c0524e8e8f0f01bc91e2f3c04d12e3a5f040b85184e0f15d6083dade0b22b618d931156fca020c9049f15526e8c0d6a623c9b2c20401858f10c3a9d5c59e8189cc74d1852c72c2478b8733f9650126a383e0d6b9f0dd0cdb74cc42849ec1fa272e900b6542dbb340bb17189e2e5e541c7528acafd7de17b110f01d40f347708f54151b868997602a6d139babc122df7f9bf3ad2a258f06ae79f1c2c16f999510f1669a7f8d404953261f0598ba09295b5cf440af766a8a322423bb5c7022d85a7b2700b6ba70ff595a9c1efb758be22e2c8d1fa626fae2da84187f98819daada55b8d6a29d73c2bb9f1d203a8ff56a66af3082b4c3aad1063e4277fc20448cff05ae84e9a2f353e84814b1dc560052a349812241e904b553a7243cfde8c20f672f7aa3e2676a236e0a055c6784271b428ff166d3e3930031435057242790a271279fbc335732a1cb4981884296c424f2e6f3d8f16fd0522db7393ef5893ad6cb82a02642fef76f7e8afbbe23ea721002e32af110ca472bb767515ce87a2b2cc4c50e8a97cb22ecf632e666520bbb6d1108e937b8af51ed4cd83b498366dc050b734d41a8484f9ac0f5d43973770a8c9bccc1156f7b9b278c8e497d4cfbd80fedf1eef40af2d7f97d38377ffeb8e9ff01b335329bbb8d5ac4fe2e80ab95a9ae0ad5561a26674699797e92d25a5dc454f130d7e7c3eba307a4ac3ccc25c0cb5fe092351c80f235fb543d88b92cb233fed8da0bdd8e7876be9a1d06d85209b795edccee73b140008f8c0 +0x950233b2ee76ce1943d2c6bac53bb945b5e9793a41270cfd8607028df5c09be1eb311ece3fc5f58be0c5e233f42ddfa1b63c61326244a57c40a7e4df6a7e7f18 +24784 +0x2b8e5b85086abad60ac3cb887d0b4f2e3a06045a1c75bd60b4f2b75c3e1b2b76d3f22064e0848331d6c9793d23ccf486620b8525ce21711cfda2064ecb472fcf944b475ea6142b30f51693f011f5a20356e9bb10626797c0cdfe94c2147f5013d560777c4262d95cd072c0a72fcd802f7f684f22c18f57d48bcc0abf000ab6c900fa59c59cb6b63bcda5a86c659eb7914550e964d1e1dae1a1d50f4e793288797ce194419c58ea575576f4469bae6eb1116830dc7ba4486f76e14c76673defabb1ddd1f82b8f9c38d1ae4c3eb947ce184979cd94a822c90472b8693fb07412e807b6b8f32fa5f464a715575aa7afff4d574b67943ea1832afd210db13d1f1ab7e633f03991e01b654173bea44d2e28d8a1a6a7e2276aa1687fe5e0d5f6862ea1b61e22d23a8939c305902824940e71429152358849c5494660cc8cb2c3f0772ddf3df5c711e775045d343ee1629503128d16b88e8ef9a44d089eb6508da71ce3c959121ffd44f8b2b026a8e3a10d06d0ffbcd9fadc50d904e02308b83af1464bdc3920e2e8e6ea54652f0d3237bca1054e0a3fd61d1010f44e232af1b4171dee81a7c818b9167273e61716d70eebfd38e2c9922a388273a3bb65c403e160c8531e69b2ca581cb8969aa66ad90ce142f123c07cfc15ee279b90b27df7ab1670021d488500ac40e545e9a3b2401be897b879b9a3569c9c576433d2fdd4f97f3c84e40ceac09fca21093bd89514224624164c7aaf3fb5d329840e8deda2b2e55560dd7d881418019368f80bbc5e0844129204cd49c048ddc58587abf56ac08ee21e6e620803002f64ec8805ce26b72a89b5097819df3d0054ef08f3bc330ac30c47018511953d9abb1d548e74721640b005c343c6a67c85fe48f82eeb0578cbfb62fdac4cd3b88ac182c26e564c0dcdb00c9bf8f91dedb4ea1abf2429e8f2f0d6f7caa060c459499ea33b6c1bbb841bb152f75d594b79d441ecc59d1fe56078c68ed029f671091e790828516bc86370da5e403c8f38062f2a4771617503aaacf2b0760eb6e0ae507a3aefe5f079921553b8df5b42ec7d0bceb22d37d24bb9d483e42619471b3128cbc0faf04fd8fa5245e83a821b70c7b155b561e9dec37338a0b34810522a7bee9122af3a33ed816ed876bb7bc1cbca69e6d8733d4275c11f72a442bc7e1373eaf7e9788a42bf10b333ebc90dde05707aa9a4ccfca6698cd3203f7de574e00063229cbcaa245690677fcfcbff1727a02ec7a0d4eeb1a6ba9ad30c6153dc990ca33dc3e26082bae7d3e3a82b1a163742cb6855f3da0c3434bdb39457cd5d447ef06ee6547504f4ff3f8800502683403d9ab34992895f1be383e75ec51d9feb3e93dd8e79b1510abef3955ea2eb05477be3d10617c45163ae3698f214094b9533d4b442b9db12070e36334b89304556e3eeea14ec518a157c1cedd9ad5a094b47fa188b7cbdeef0d6528a4e6dbfeb745d0225f977f8b339377f0f9af6d78014614f33f02a1d8ecffe8dc1efb65e9eaad168aa3f228374d5c6a525bd594a59f869192df92bc499ab6d3001b6ccd606ff2769a26d54b874f311d758cb3d793bff48a12e2ee87ab88d0d82712c18eecc7b474b350c74615c9a005cd04b0a2ecf32e42f5d18c706937cc5cd3ad8007098261a568aa3ec44d3d37b7eb4c5272fbd98260ae23e3132d1807d578342ed22110986d4caba232a82a56a832cc1fe44ac39f67ce6288fc41ba11d6a75f348cee02b740b1cda81da1018b5b462c8f637441e3dcb915f478518e88e4c3872773aad94cd44a9896e1e263444597b6177cf2e4ee1400a6ac33d715cb645f347e42f1f4d77c7985252bc6c02ffbaa215e9d312d1cc237ad169b4cd067e9fcefbf574de5d5cdc12ba957d8989cf1efd6bb50c97b0e4bc081da3b1d5eccea0f21514d393cc63cb3f4b9f2926d19acfb4eb414266f21352ddd5d8fe31188f92871da812e6a373db468cd988eae34a13f01df63c279f402f20816f618892a7bbb49c19fa7ee976565005a9617ec6c533d98a3cc481c05399faaad2a382600064a219ce5304a65382843f787e8982f57696b97ca01c5c33d993d7688cc88c81d4791c31e51fe2f2a80bc1afa5b420c02650321c99a17bca37129099e3021e1155602da97778a63b0f0c13b49fa7a710892e7e8677b825fffa9f5dcd72d81c9a2d7fd59ed3b6f91601b0bef134091fcce9592420020863ba6c64c76cfff09003a5ff9b78bf82e46bc41f49cc2b8391dc8cf8ac54023a3ce3d38655de53f58134050808a004846e22a1803caf4ebc0428bb349f893ef5b9637830908c368df81495c1a37c6a639f23e0fb2001635d8097bd3584267fe2e120a388fedc6f60fc8d9d53f475b8c87f56c9ba7c2a330d0d13dc22e3958da9bc039cb62937c817958664e683f4b85a17a3a4e2d8928675b4845e23453d30f152f4aae39906075acbe833a0d95f30c26ef3b89ebca1243c7cd08c6230863062acdc1637d4aff5d0a79952ac7d1fe9a78c2c4e14b1bfd40b6ee0ae042fd854a5d1a129d9649c5a2230820930f79dabb27a38ae6c3e545f8a909c0c34c79b6562c92d28f2d133fef86f8ba055d0403d8b3ffd20cfecc88e60ececed1882372c409d665ea9a1dea8f86a9d5e428f6f69d9e365ec65428327368ab99bd8e7156ee8543612275e0422cd2b9e8c20bc94f5446f575955c8edf2b370e95c9d7e9bf602f6848b938f0c321dba787216df16aa76eabab0c8066eb980a866798fd0328b358c371216bd60a1911d11584d815d50145c783ae5856f42443a163ad56442f4291c39efd86f6736d05e5386ec29d1afc9ce783cd5cc5656a82ce3e698c234fa87b1716a002d89bb838524431c60da8e3a46a201bf638dbd5488b4c7ff736e65f750c7cbb7802ef651986ed905ade0b712cfded0ccd37a3fef56702333fe5afd2003235924eebeb1e3a1188ece984bf0f76e14f023a387a4219c01435beb5f89abd16d5d7001a1b2e0a70aaba0a98302922d2caaee5b1bb394644e6fa0c3e4d33fc38d1fc24140c2f1b32c77a269f0b58a130e4652849d35edb53fee2a0d53a185df6ce7433501a8becc663cfd5ffad08728a30c79a577f3d798bc0a205113bc252ff0fd1a654d2eeefaa040d8140a1d3375d1438b4610b2f813ad09aa188cecc6bb02a871598d1a2945c2cd5c0e866233018135afefd03df831fa34f2e826f810898b326d9a273519b6b429b0d7d86832d59c280e291f5b80f78cd31d4c49aaada471e138af854764545e9cfef766f7d6f70865d07b65d3386f492e56c95dc842119efefa200d18b228a8706bf49ad7c771af341c6e0a6ec7a01a8cc3e9ca1b7ad9f8d0da76296fac387beb2158dbcfae4b77dc1a8976f4d692e7378c33f86bfa0569a101384015f98ebd5748aa90a8338b4aa7f454122d0c4e9975da2f50806d9dd8b797eeb9d3423258fa0773232afd3b0fdbcf5744e012db168fd566382179a72c5cc320fe6f2f2a321d873afb1db562aec1d61b75d78f4148cda45f1918c62d4fd5ad5776b167803507f087804902090ea12e270ed82c89167670a25c2bfd36286d7e1a8963933c480269e31a768d3719c3020375ac91ba67d460b86723c6cb9f6b5ef29f4b5a6452541ad4316bfef4b66e7838141b65dc252d9d28a4c7c8f39c167466203365023d462ce42df1fc48cdecb84d52ec50f837ca4e7a79e1acb607b8e9fe74e15c1df020c79b76d02f3c4783ebca96e9fc1485f39c375037191cc897e442041de5be532a128074d040d70a7c39384ad80e3bf7efafe69093b82ec8fb8ebb36b1abec4eac361b90b8d722ff1fc91dd58231727508ae0fa1bb31f3ed2e0ff0736354afc9ed5bf430529b230eb3c4049faf0bc3e784c13beb772b7320778e6924fd890fac36a794be6435e4208251721026443535ac12f0d6914fb74a1d33afaf45f115dfcf4582a0b74c6d1bd299f190b185d047c8c6b9cacf44c6516928497e0435c84a005b46401389c4e9ecc4088716769d0520081b2ffbb2a91fa392bff701fc31d6111269044094f37018f9405d1ebea358fbfea06ddb43669a139c9a8406ef5669499172560514029a9d601f7a9105eb26a3d0cfec389d07ac006b618cd9b641ecf101e99d2bb2f74dc5222f4637f57b595ea73014d968933cb42a9c7743f8fa48518956407b15dc73d667f82ad8345dd775ab4c4e884d133175ffd4ac0c5d8763b15242a9bae5b8f31956018c3b6a998a3003aa000bf38e758c128f95fc8ff2275983353fb3cc94b5d618d2d529403558d6d8d3942b040cef418c5899db33437b9045b56a2d7077a155d4f36e6a5d3b2bb1514d70b0259687db95b42070f48046a0c04c92ef79699fddb3edbdc6 +0x9b73214f933db062db8f1b46c60c266962c8071bdedf569c0e870c54730a0f97e200d199260a2988a651524a2abf9ecd8dbc831762f0a784f830462539ac24a1 +25576 +0xbbfe3d99ada802420cbe6471c21633c5bf6e801d3da50263492bb8a87fb6d0761536c8611b0cd3e000767e5b594e9385def53decb58a6ecff45f7e2f61ad15287c864a82bf0c0c8424e1c108e8de2ed58e08972828bf2794d239920c7f2ff83ff8d60d24211177d57ee577a0f72dcc5bd88fd4f91caef55beba13b6861a54260910e576dca84da7c196be64a0ea335c2c3723d861bbe9fcc4880c26b9075bb355017718841cbfe20fa5c582fb6a830b058991af8ac57ef8ef0bc6f3c93092b663cd7a39b0e50ab6a2b9e137776a486ce9eecb37658e1ab4aeb3f8a04f2c75a9b5d3734cfba79a801b31b6049d7ffffc39d544f29a5c49ca742ef5bea3619107bbc1f6e4bccb0bf8f9ab986cd602163375db738391d698a4efcb62a17e66614ae60789738cc5cb6b9e862cf2d99737ad4e7ffb4cd48363de6217b3eb38a152fdd5228f8bd42e45629a6fd818e0a5b0c3f42120c0dad947c18ba26e0e5aa9029b09819d903b7b26787dc72e51b3c42e02376da8822d4ec108ccd9e58d5cf3ecace3c318231b32db17a90a943f9b691bf268c3d6f3445a4c2e965cdeeac8087d9e0455a3a70bcbdfbabcc89e35300ae71f08b250b6a892658d7879aea9246d3208dbc7b4ae85cca0fc297fc0c4fa303be2a7b79a2ed27d89a003ded93aea88a657ea87cfac01abcb366faea071526f66e7c64217de5a72452098eae32292e14715a114492217efcb03ffb391dce11f1488d4f04e4799271469d83c50f2a60da0cca00bd5a3211f0cef6a5d293a2ed5b1506430c1ed16e263f62221b72dac742fd767bce9a1c5a01d433fd9db4b8409c9d8e49207516c6ad05007596a361eab50e058d5f9906e2978c9d0d82c739951ca8ce68282f701f6d6020841fe9e6519c05203b59a0192f1bbcdddc6a134c7142fe6ea80d950603ce186a559f8e91855dab6e8fa2f77ccbf32d9b723be11a5e78661511b5ef01f938f485f3fcd88b0d62c8989023e6583e89a77ed8df79cbe326aa6bac0985888a13be1a632010fc7111244546c4b5d50e44f22e153c238689b2901a80f19ec43cc73cd0aef17d0c3ad4861eba6eab1ac58bd554313c2773d685e1c7955684dd9abc3750dd5969e1ef12b8caf3071150eac8199835c6ccbb5407641cf41e7dfa295b7641f83f1aa6183280f2f9782f9e066286a128c15c868ba0e3c1a433d243730ac34c058ad9813e9ea73ed5aa4d2da0c1e41812171dfb02b9245ead7bcbe1ff32e4190e24ee9ae8bdf5558e84b325404dfba4fbaf584341b8f19a18e0affc553ca24f1af4a11a9ef731e02ceda9ad6f6e93eeec715485d007101dec49c8bbfe8ec59632e23a29e8b42586b8cf76edb38c739dec455bea380c4990319d5c47819215985dd600ee4f5c97f03911630e970f645a0413b39a0031669bf0c6b4c866af5afaa3b83c925a5750c6b79bb838a05f2ecd3bc3a5bcb0dd2de530ab1865364c5b670c70373c920e18af3b55bd9258e4999d993d7979d0776817f934cf4678d3e185a1e736157de7b653cb27b94546066d73266977f8e969ddd853492394b4abb4fc69038445a54bf45b72f9f678f22e71f6eb30e762821a55d147d25a77723c9c756cad68f392a3986f35b3ba54e5c26ecfef7810de24f297aadcb7bd163bee6198b3ce2948ca556b361e3d4e01a62c2ca53a2b3b9556596d0a1be0949a9629ca0c454c106bd7cb3559347ffaa6bdd27321d52fb0aea0b79d990a36272a0c55a07a2b116584416bbe7f7f61056cb31e0bebc76eb7528a74f000b49fbdef24daab896b0370bd8e9fcd5108ccb97a0f76bbaa18ce98a99df82ee71e04a0116620b3e20f0c783c48ce2c77d6a65cf959444c06d1399ada60ac1ff5524e16b75a90802c1e13c729f65fa198f1d937101aef87a9f996060e5cf68ad3576368098990d910a1ffa3ad21bcf55c624b92e8d8df313898cd246c173f3929352dde307a8988369fba55f0504cf06d30e6b5a81e7c155eb7c53c1d1bf0f29ef493bf54b5e45345202b24190b7759706390e779712efac15c689648f06f7eda9d7c559cc30703e62d3a5a50dba5fa10043371835b5da709929d7a161c26a58638d2e6312b5c60c0cccf3ebf463e99f31ab69bed6371e5df5e4c2faf297b2e4acb7cbb3b7549317c08d2178bd6aaffc1ad01ade012d27cebca5dfe3a9fd8e3cd60621ce12a3840c1e62b2edf1352f423c6fcef83eee834d4ddb92fdf04a48ab8fe6c504bd190533870c3cbe1849c3fc06b8fa9ff811cd5429f460ac8e247ecb2ae82a1a2f2b93388ad8035b9b1f1aa42a7a2227b53d426df19edd61ac029d164778c550e151ba85aa54bb69022bafb4e7f1da320ea79f0505297dd0027b201756172b5b6c31e7956610d948e605dfb8ffde87415d074fb40522a65a09e4a438e741c09c3832a7023e8ac18daf24472aa28ebdd838d2b0f552290b722ad596057b972995cdea7536a42128a9d60d5284a080f2692a708f437c9af1bafdc472177375dacaa5bfdebd2782532fe337ae415a63a9669a872718f4f71d86fb47c4b97f6c38cd58294000491cf5726f29a70b30955763118d15005bdbc3889bc60a95eff8e7f04dbd45aa795f6433c259c92cd39490e117d8c57401a7a81257c5b027559a4ce5fef26c0648d843c6954ea130b3ffca632610d4fe96e92fc6d7dd61d830cefc10f45f0fbe380608bd508ebba14225886bc4bbbffa7c2ecf1874637c33121559f3c659bd4cb767278a7c8075191ea44f6d6c4fe31231d70a89b60e8bc279fc0b20dd89010c577a24a081da69e29a0a73da8533eab05870668d2514fd00c8e1740ab25367a788cd84b1f8e306b854b6ba45b80e336f408967b53a3d6c789f742923ed4f4d98dbcfcc115a30d7e4cf3777317d3559a98a9082747dde46845e128f0ed6e34f4ab10f6f511e4a69f27a0b3f203d5fd9f9a7144b5d688e07ce954b3a1e07a5d947b8eae2f3cda6198be5b0768480d410da269326d272b34cb1c58caef4080d781a4400db7bd0ca730b82b5b1f0d038aab5797bb96634e471d87f6552035080983cf2ef9d4bd02e12ebe19975d7b4041426205c579b17a813ad1353d7de69b5d62a45f5bcf6445755b772ca36bba4bcc9a6abb395f3a354aeaa31e684e7cc03ae5cadb1cf0d95ccd7f8c6c6791f1ac957b18bf008e260a0af4a5b7bfdb1e0008d6eaaa227f45cf4f62a4e1cc1649ec02ad141b004f9c7e29217e0a2a6bf5e230fbabd557c4cf2765cb6894b844e9927df705d723e9c41b0f39d71f924829ee181cb662a207a0eb76837f8c1461f9266d2394f950a6c768250457fcddb8e1ac2903b25cea8fdfa3e95393d1c9b6a3313af7688b6fcccdedd149a7abf50445a5cb7748c819a5b5d82801496cbe8b0d3a4b3c2a9467a4fd337cd26e34c0747e60673f20b016914a109a554b64da285fc90ab9811d227680c18f65559d284fb4656324e11bc99bc5d6a71941c107d4c266de38162d878a7e1f70cb04f014df0e3d29ee34121a0b4fafb713d28c2cd85e9a2f7f90cc7e271ed689cc22356b6ab56f1f65c09cf1280f25320ca7cc307c5aec66589802ef96886d412f57721739d183af502ec1363b2ebf81cd6889fd08dee5e989d6d8c220e56cffbe4db1ff94890240792589d18cd3060a1bbccb7ac4140b21daf155df0b5d5c2d3fa9f90bc2057339a64efdaa63278036c14b9b8ff822e9761592822f9f17c4327b1653230d6e5e04a05124aa0852b76d85be0024eb30045100606598263c2c763a3ac52fbbec4b082fd507b7c27b331831bd0321e667e61865040903e6f31c6143bd5a1715a6c3ad1a82acbadbca7a9d8befab6e31ee16350a25735928651d5b604817c363c54d5b2b011d9c996816665cfd00f414ee1c0eb76cad8034b9b6cc5783061ced70727a28fa6243457d8fd96b8e0a99d78f810d3680be625218701cf1152e08fad0b972da14819926306b60824bd246c1f8cc984e0baee6caaad2b3f6a79770d40daaac09f8848586aa346267dc5fe41b528519c6b285f3e39664f92ee04a3dc14ecd8e7d4e72eeab137147e3e8b9592dc434f7671f4c73e705ae5761694e550abbab81fdbd54bede92ab76be17e98f3f77629af9fa0b4d1c1e393356e9aba2f77dcbee53ed31dc674f6959c013f66c9993966a44eac869cb0a8cf6d6096a0bcfbcb53b458711308e733357b181e8da833f59cf0f988daf3bf02f09a9719277dc9ff2d29c33fda29b2691d8580cc8c044a3323124ac6107b6f9abd297c82bd0644f09191f98fb1ad58f0c447e5a9d0525e8a9f849cd4d59824d87bb68b63efdb0f4827a985f168086d72b04eb136f936e36468c47a3578de8134b2be3e5d1e608b5e65bcd2f53bcf425777e67e0465167b49255e5d78a8b3074808ad1faef73b3babc2688b1bcb667a2771bba692b27578b14bced11eb3ba297ad3ffaa09d8cfb2c8c428f8d58572976b343ab5525fd88e2542725f8848586a55ab4267de5192633df17aa6a2f8581c8b3 +0x096a0d12871ba1ec81261a8e8b5ab587aba950b91580286aab0759586e04630b8a9e6a05a2422768cdf77645d2d144a7f7a3b8480968a809e7fd3f832fbd2424 +26368 +0xa5422e53975e43168726677930f6d3e13281bdbd13c67c168340ed67e45d15b0093208c63e6d09ed898bf2a8304bd7d07b62e6e4bb7091a08b33f0d156fa60671a5d71cc6b2cff74baa59eb6d7ea3cdab5b201736e3e7aef868ff76c74d631cd5e2c300d25836cd4a1dc33482ebb4a2667d8d71131187e2afcbbcbe045d7d00a5f050f33745a9a34c79978093ba64bdd193e30670ee6e779732134d6d1e68445a551d4e36099cfbdb242369e08948526544bd41c0c90fb057528f9f621ec97a6b67948c7f2285497ec4135b29d6b412a9e678ad933fe03f68938e4e73ccf4f561ce3338731ef71e9fdfc3deb0015c71082fa1b468c19467438b9bb522a79f57d5ff95dcb26d76ddb6bdd16f13b785f01856c500a1ec70ea6081347def4d0d04205228d3ad7c69297c04a876d567e51253126efcef2f1a1b483af5034a1be2ace98c58d7c4ea5264283ad5a07570ee4a30d8ec0390e8048c731f39efb392a4949a04c233a935d72073d6d5566480f62a4a10d8df47c5a4b079948f8dcc5fb76daa31e181cacd4be0c75f24133306b114f760c1ca64469f29b4317277f4c1bf9a92ba333c9a3f45279b3a4e51518093acd13f136f86c9385abb7c6f48bd6711adfbf433eea80a4757780eb0bb507d124450025a392fec24b617ebf24a96ce521a4e866ff2649cb702e622f79ba05ab19e0c6112b1b01dd8de31f688280145f551f2c74402608538bc5e3d8f8cd1b7f5fc6ec1c963c7ecc9359222bd5b9d8c7007916d5c791c4230e648b4e50964f353f1efaadab9c7c77a5ec106fe4fbc00568d92bf15c1086234135e1f949bcabb50110792e33e403c60bc36f9b78efd302d568f531c94b553b6c5d6d42abe837e7edc6f006f7bb1ca10c08ca19593c19a4914efbfbd5e93953d607b78f3dc1fab44b65e79dbccacdf0f2e0a6504f8b9ad4e3b2c5b847933a53c8594849c8f0fc026218e65b4db8209b03758da822845f7b12bcdcd1e8f061238a7ba7d9141c45bb7b0576a8712e1d8a88ef068999ce6f7f6796c7ac80a9b5ac64965ca5e9eedec5de541eecefd4cba5c8769a5b7e12d2ca2a650eb3d7653ed49ed2f0170f0ece0ad32e678f905132d50d30cf8697f79142a3543a4db4cd05847f56ea964d231d70a2bbd8f91c4e5a009d483072ad26b3d11988d2e1e08811a5504bd2896dd5d3e19222f9925b724c0fc1e442888746405ed62c5ed9243f6b1d5ad8315a35cef944ec8c52c314660febc12d8f2eef0041d02066669c469a19d6e2268d706eb39780f9206cf211d1ab7ae54a9ecdabfcbd11405e73920e4025b6335d7133e02fb37ffe07ce89185c29a67563f7ce84e1bc087e3e0c2346da96a794a4620b52e85728466800eef2af9056b8a223974258469d212bbab7b40f75904c23ea608d868a63186c8b8b6771e872f72da992ad0864b8734f04b62288c958a403909a5ab25518bb3af6c63e4a39e17a2c11268c9a1d41bad2728856ed9ae9e46cdc217f14be2f78fcc90941e48c8d89c8e4baa9b57a203fdc8c9518e5f12a5485575ec453d09197d78dbb36e4e85d6c28a8b8ca02813e4a93db463218d5033b7788b7f317902460f5c943e6f556396a76e887b8283c812222e6016a2f4e5ce369f895d20a08d11a7e050b19bddd09cdd7298f3bd0b3d211af352f8ad2641d92842d612bd23f810f9ac97a96e485b5db75f5381aa2ed1a5d63513958a8202f91f0b181c4173d1a856f9ef827135626dd78d3ea1f45f23f4f65c1859d5a897828d40c5f65820b85c5280bed92f259421a084c0d1062ca2b2fde0d7d208fa7e19e58c461d8bab0ab17eb99c1a02895f2dc4be709b6a07ec445f5be88abf083523da663f1e4683473c2e0cedd195e121f696c2c46d9a814f4d8d35b0d042524b44be371765034a0c4103135a7c53bd9af0b91a32d412197a1329f6c76f4d593ed113a7458e5c5fb88470353886c68f18c07e3d524b5b40cb599827a2a43a8d6e7d7d1f6fe6bc44da6b081b2e9d58c629ca8894994ff097d1756a40c91b948f788e5d07ed2aad89e0693d0d930c95035c935ab87e6e5c7f1afb12caa131e5afdba8260953b69aaf790381b50c7105c71f9f573188030977165f142dc183989f164f7a9c1a172e25f2ce688a01472571e16310783cca820042160102b08d37ada6e8dd28d6c8b27dfc2e73f5081b7e94507328f5030140bb2cb44bb1e4bb4d8c0bf89037e057d217e3a8169e874a6bbedb43d3408163dff834be66e3e49a449ac4136661ed20f79447cfd2ef05708751e059d1d32e5eca580898e4f116b6b75a4dbdb20f43c0bd73970a3b5f191a5bfe0e298745605e7a5b06e84862117d006b375bf5c88ac37e266ffba27738a453f3c33785efcdef6a61ce00f3cf6b69da1def82b4063885d43d20f8cabfcaab0a039e08305add8e350cac8789916b198f02f4a67f40c3943a285895f6a1659ad88e0d10291f05b754cc40f08c40b6e8a9bad54bba10b28b2a588567c8c48ff06a038ef3c2a4ecf7342129b04e65d573a4a60fe6f6fe9bc71f7e25c2b381a04818f49207bf64e9ca6d9ba56b72692d372a45131ca852d5c4a3e9b85b39615d0e7fd1b4d0520782ad6bac62768ad3449f85187d3150c5f720323bcb85ecfc0cbff94b75f24ce54e1ca8d3df55ea2cb2395fa0acd992b0865654d4cdd720ba45e93f9243c1d296b2a4cf928aae22eddc81147e3089b0baf9d386553db387147ef69d76ace3b58446b22a68e2d3c79f4a034df196b66d3dc824412da9cf82a33e84bd492fbc583670d153d7766b4aa9713c66bb4dd41ac177c50fde707fa5df0afff98a2ad02d45d79ed66ec3d92ea4f898e92bd4873bee9f326cd8504853304ae4dcca5cb3b71ad1672c8f39a1d60a26a55fd3b934530d94f8c2bb97be2d4f94bff18a03db982df4b6c0c97659e351a1ee35336a6ff2b70f84bbf8d545a6757f0db239debc1307c82a2d9dd865d903f0d003db769e9d634562b3008773315a404ab96a3bd9ea20b22ddd8cfe5a29a98a07463c4c44a5aafd1f32732cdb5056aef3518bb9b96021493e5b1746bb57aad3d066c689f6cde69d26d4b143c2a6030184252ec6df3751f3c820bd4fedd59064e8001a8e2958be9bf5f45b5add84d7fe999ec3e1bfb25b5877c8ef887645f2c39a8c98e750e89b70292bc1e0908f5dec9048db98df73a5ddb9ae3e7ef90b3a668476d21401fff5b01ce595536037fd52049dd66ab2edca0a0a5b2a91caa7efc412494692b0f155d26dac4641e0e14ec5731864c5eea31053f66a247f8f9e7b72e09e76f1f28f546d880a452a774dcacd4842d738c7164141ea25cc86ac7175e95bc0d3a02b0c49e7e86a128bb7bfe9c000a7de41e0d9b55a6248834595a3679e006afd2bef0adeb82b564ed416da345438a1ba6fd03fe513fb3cd94affc6b9076af75403930d6b74bd595a92190f22d06ceb2c10f9eb78f5216d3ef53f2de2cbf7f068b5db8678941aedc65432d14deaf9ce83e3e25eb974516434d2d87b8d4233e0bbb10cf89eacc07df288f8b30e0a8bd652471dfc5f2827bc5b6250221110ab32bd93cbe636154aa49faedf46fb957f9d27b90156a276f0d003323aa406adca70fecc8ce1f76415dc0e345aef9f32617d74c821005be76939dcb0fc93e6701e25ffc9c44e2b1fbe9ecec7f02f5157ce11b9e3115bc40fed74387d1a54290e22cc212a06bd79bea16771c83388ba8c01d4779846fb7346e9f9b6d5186756ee54de034bc8a23bb77ab067c3998e5335c9402e563641f2230b44d8878b6ff88730c626dd8e8f19908724412896a283eb70ef5ebb63e1c92abde00dd2c7c0766f532f0c2dcce67be0731d6e85cf57f523953c8926543d50d47e45c76561fb591d187313db084adb1dab16706988210f64a2a22e359bc731a6c900b5adfe8329071d3cee53c52ecfaebba9d72275903b2525cabe478f01d4282a8b291ad1fa6eb3bde6ec269804c22a0142036efc2810eb9b20c9fab29fc0cf1f5fc24aa0c392b9970badd1d55f4b06386995ada05b293e7f1ed1cdbad3800223f8e1abcf611d7f2505a3d411a0d2c9bd9b0e4cf69bdc845e4f562eec6f8a67b4e137bcd275977ad47f5eabe18be1fafd50cdeb537ca353952cd79ceb9648765e9314fc4e53794341d33ed7a9430100942564f76b803632c021d6961d1a62a49da909f8979d3b5ee9abe4d5fd98a8710e83540f9318ed987bd8c3a9155e3178de7d972042b566243853b12542ef50c2c8f52b826ed931fb04bc2f5448c46d79bd9b4d11d42e8239ba8554540da9928c5fe54bfe5333bbe117468a264bff4f1d977c8c3bc08b0815ec9b2ed0d269d6243fee45d1e4aad3d10002647d83718edb18bbe50c9c3d703f4b1fa12a25a2a430f57aa9bb97b122417b6a3ee8839d8548adb3d802cbc8432c628d6bce7be67528fd14d809e0e92fc8d5f889e5c105cadcb31ee5ccd3be0943af6eef4c4997d172c337615b64b544cdac37c603c03cd80de5379eb948713b3b9e2e9c12135931a4e47cc61e779819c65aa283b105953562a0985366aea4417acb56f2ce6d8d2e45ed3f86c1ae2407598dc3337c05b15b5171dba4335aa9c4679372a3cfbcb62fcc2a0a13e38ccba5dda20465c34513c280d55c21cdf1042 +0x4cb6d5a4382d4ab1edbff2c1fd938c982fd4270d33c42bafdb00496d860643e554a9039dc1d8ad1a6004f55874aecd7a73830123dedb3b42aa6547d6f4179ef1 +27160 +0x4a96d520d8d5a54eb73f8f558e328d1b3e5ba360161fb8444739a40a97a58a1b59bd684e9ca3ec66a3de8add9548cbe07627e89a569a97b5c837251e96f2c509b3402836717d4d72f48b9b60e7bd2d796df36d525b06e41da46650731501f75142673c60c02c7079948eea68ec585af00d075a108d2a4685c20f4e907a9bc9f9ec7acc54ef79fc836a2fa07c0ce3fb4d3daad85d54d066f40a7946fd2e88e30b9bc0029b68299a995eb6e525af24b796e4250fbf18beeb7264ee61439a90ec8e368204bc9107f1c1586ae0e93de537d5ecc026c041bd7e08b8b4c7e9257b8d8ba508fa3fd4daaa054095ba531eec22113cc345e83795c7bcee149f7736106d09d09a0dad98696c6dfe7d9ae8ba012153bc7696be620e6d98ee561176371835109f80648c447de0007b6aa9327aeedca254213eca2bf019a4a0c2476d8f5c8ca9fa01296742deadc69da60fb8c47afa06ec0b6894f80272e7eda066e4a6a11bdac96781c3f9547cc74d78f302016c24876c7d3aa5320d2169bb379963e4b289adf4f8962ad1a7f50c74277d999a8d012ebcbfdc8442d9cd32f4d00673b1567f2a63fd9023329ebf9cf8fcd704f5a53a02c51977b98e2e1f4b7eb3d59b7554a558febd97378403837fc33f26cb7c7c760b6dd333cd80d4bfbb43282f649875a23fae82d1ec2f9ce8bebb38957796d95e529d3437477f92548a29773c5582811fe7599269cd9b329760ca2e498faa8599de3e85acaff23286c01ae723f69b40c359e836855f318c376dd76b6d9b2249d0b8360fb98e437aff66fdc10dcf4c79379c44b64e2c577471eec935272365ebabe66f17876ad9336484b94e2169fbf622b8535aebbb76b0edea8ad59fb0db33d172cfe83ece1c25602038d3884b127d2db6ff6a8494f70952690193ffc9ecebeb6340c9053f74179944619b69fdf7d7009d2f2d43404047497316b66cf700d9a0c2a901044749d2b7f71ceded0814cc4275cbec4e46bb327911b18810c17fc79996f1d9646d031f634251103bf3cf239b46baefcd2ecf918b4aba4f13afd17b7ee702994d390ac4452be84d7d4692a6b519e67ee981e32e262719549d495ebdf6bec389e634c78904bdcaecd88ac41b35f536e1c9c561cff3aeb7dfd4188f57a9221cf058e5a03848fddd357646cc4bc6e3925f9785b03d99e97a37e3a3ca0f401bf518cad5fe97bbf50a6f7f0214fe0eeae24278463840c1e04ba6f07278af63b13647658a4a7003ac3ae41b4603fbb5120ed09692619f139a1372240e02fdb9edc8c6518eea89c82a53da709b010c6463ff5219f09324361fb8e4a6fecec2ebd691ddb56948aab3783e9aa98876f7c3e69b0f29e93695d37724449fca46c5a0747ad3b9a1ca9d6b9de46cec96ca8579a2cb51ec04b2bb91ab3dda36fbd1d081d06bf287c0da2999a12c97614b667e2f9f785e8dc96f5e19c1eded9418d6a936f14d80444edf15e58dfd653232b0aa8ce6888032c0d64612c41ac7e0a9bf1966e006c61bd1412af668411c84d011d1397ee5fc04724d3a25b9aeae4337f3e8b9a3800c32d36730753adf0582aff2badd6f751d2a663d04faaa90ebe549daded944a19ab1dbbbef090bbf685156b92e21c2222acc240f6a389ea8c6ed67dcc36bca53b7c172a42e5be4c98d1c4dd0f5ad7ed26a14352935889ede868319615e1a3e7dac8a1e8ab713cce5bb091d9dd728ab6f262820f52d91b11a75d1e8d1788ba707c2336ad550d8ccfb3c404d8a9c3a52e0a7306dd919fcdf44d9fc5b94d9690dd83ee4dbeec252ebf356ea65fd0b8c7a0d3255a53fc2703044fb2ffb12495a79da6bc7fb3bd42a31b5522fed60edc62bde12be4f8ef196ad0223904eb49006f1f4900151255008a62978366e1a0a906d3b8d95f32e6c165d679947dee07517800ef4bd6515fc9353380f2870932a90490cedff1987fb974959a47d33ffc2322b11e021c071a2743fc8612c79331571c63978264a0168c177c18d5ad37a3d01fce39c55e9a2085372c2b46b136292d9edaa77320d047a3df1889d0548b7af2cfa6d70826811f7d6f50f510dc5886b71c548314bebf8f8b3bf9419a71a20df5b2d97a4d0c62536a8cf958039170d66e056f9f0976b45abcae7cf4c67cf1c97359e4a7f668a458f6f083e881792594ccea8a6fa4115535b2b73207d6ef1129d62546c4a6d3cdbc8d4a9f1b3d0bdd4e4e5c438996f718acf7e6a6ef3e3086cba8b57e64e0c654eaa7eb996478c21e7f8cab195124a0853d16ad5a3f7ef9a91b658b0a1d06c8c06fd1640148d7244f84e2877a7b0f961142797bba6d1ba31e9597066841bb4396b89434755cdabb071b0a51f54baa404369aae245fc96b54dc6b7c8176760df4e515aed4404f5eedb8e4e9af8677757a22f25719b6272b8cd2b3230a61289f46dc6bfef2bd5ab48137b29d322430924a3ff739a09332215f33fa0e082c7a91b6b851dca6b437d5f654e469ad162e23fcf471fdc4de3376576708e483bfb40ccde190f0fa0d2fe8d47940f42a44b65119ab274a8a7f7251fcd6a54e84021e3711bff0e1f5b08816a10d90e7b096134328cbe2c9fc5e37dbd5e999f411ddff3b0cba38589f868a86e7789ae948f48b23b1bc6a222164ca3b6a06ab7d3538a13f463b32fc01757f612d2127a3f94668163ce587fc0177729a4397a592f5fb4a6c46a8a4762266adcefc72febdcb74f04652b001ffa5807920e9024dda5b0e43ea946b576d0b425df6dbd2e9dec6666cdb7a849fd4146825f4e3b16cfe6e59d4e0b8ea138ac2efd80052a9aeaef30423fd3dc92a235615bf3fb90ac9a536c444763a8f9f7551576315e96016d759375fd222e86b9374718e28f4772e78bc38ddd6a3c1c5d5bf60495d295de9fe00e56685b14727cd7563dcd81b5e611e079be5257be74b5215f4d0ff9909efcef1f7823c724f297961d2ef77b6292b401fd7a58e486bfa955afa4224c2ccefec3356f81fee68383e41a8112c4d3f54860dd2653794b49a46965ae5f32a0fb303cee81358acfb1bc41ccc871f6908a497d8766d48e62af30dd2fc02955b3801b9cb971a0c346e9bb4fa269c7991ece31c88a904eac735cc9015c8e031ddb1a2b6314a54660f2b80b6e39e97624e53d8bc26557344be3def7a67a6c9f036e05ea308e90a8bc4989271e01cbf0127a54c20b961038053aa2271d07e03faf02ffc28595b85a6db1f988ef8885e7fa44a07f049b5f9c30ee42e1d5938d776920546ec2b8a0adddd275cb434caba034dabd1d3df39a0387853db2809bc8d8ca5c90298865de4585117a48c9aca1bb6ab2e727181d53f041860f037e9f26d66b0e5f9d372bc5940bf5939be3571cbc0453cb1733a711d52767137f5ffc2bf293bc0f346f88fb3bdaf54e3f10aa51148a33e57810ff583481bf076075515ca00cfc2b8991fbe38f6aa7069cd234f34764e9a2c420a49b90e8e437618f3d1d711f3530f73f0323114371595fc87587d73cdbaf85f325507cd57d4ffcedfe02e842fdbc17c71d1e53edfab2d233ea63467a804837f8f02b5adff09d9d1232817820bc2975dac849e9d299afaed5123a17a68e2954b2a360ad50d4ccbcac793da33107056bea934a2599d4bc4ffc7b50bd294bbf56b0ada4f6e09049e61d108bebec54ec9466fc73b99c3245304a846bc9ab4f66c8637d7cd9f7c981a3d4b6e0c4bb2c2b79e0627ae85248e6ea2fcbdfaf851fdc244ba13c991ed7207073caf0d046035e76e763a464747f2df81cc020e14f237bf4f9a788e6be4f92d66adb2060f5610225dc7ea4a04b4b66c4a1ffd40171f0c2a4cdfed6356e9955403a55f42941cb93013021d01e7f444dea5fe96d72960e4cde692598f7a85ae43852c9e08bc3b9ad9392fbdb4158e02fc3970b51d713e276ec3baa65bfe3facc3954a579fae3a19e57754b1acb90a5a90af7d425818403dd68b5fbb0f0ba0f89cdb08725093a1a01b747be12ef9f1b360ae2d25d145ef8fcde78980f3c82ff896fe6dd76393f99644d9ab3585fdca7436df8946d021d1831b7f41dd4e5e741578a7826f20d5c963284ded95f8ee1d07d8ea988d9cd4708287fa8eba6af4f7b70c7d4e20ce82996e8f7948e9cef473d30e7663e37f8554f5da0079ff8db341471829d9d3b7c1f2214104c41950365240a22bf02ebf5d0342dc3b099400c3d92b65522b7121bb5ae30597690dc6dd45b65ab34958a58307d3555046610b4b47cdbba14de055985b1da5da40ae7810d19d00b37647791fe80e0dea384ff5731494e2be460a9b7f7d35e77450e2adf8805d5ad67de5835b2c5dccafe8440865c7e7a1501ed53a984794940ea192aebdd95e31c168180a5d5d2759475d298a46e830c1ffdd2b7c0c41a2744f3ca7c48664094c1f3fca584d02d37d5b9fe7c441ffd60b758cf3a703f3c74ee02807357baac4759608e2b354a4cb0093b764fe7b95414457331504a4e66ceb686d9c49c632f872cecd48649aca76aa96ac8a801f31d83750d878db18a1f71490144c4a8c840e0c7195e4b346fc3c420d864091535c05ab0685067487acd28f0024017ef8296c0b24699ee780c385929f4e6d7a3f9d30672141a616189063245fa5a22f2fa87c3791505e4a72a5b960f50bfb840d7cbf344a15400bf3d4149d56a017a35c89a55860520c22412c4075b6c5d1f4e2811bda2907bd9941004cc18c1b4822a5554e35397790b818e083998b84d715e935ac21652203092a9d7257aa211df63293e197c2c8d2541d48e8931c51f52e471fdad1a66bfba3d532f02857b77e662c +0x4018097493d3386e4adafea20ca962c9925bd5dd9c61c1a29198b064fdc313b599e9615bec715f9d3a2db986e64cbac04cb253e8ec977ea45ca8f1c9f802d965 +27952 +0x825b192f69fb73b2716fb35e69d9c09006a8a2422ac7e4e065143c58bd146e71aae56d5d6574c39162f034d41b7e9e96102e24840c2d8b59a93de4f716636cb618dfb0fc4f61f50ebb7ad6257f512fc5e4973a4aa0bdf8c45964d304651581f7d4322b33b02ccfd083f7e3791abb3bc289cd2cbc6fddf2c87b714fa82f9275dce4c4262b0f3c1a80c24ea1f77625893807b6420400f6400d194ba10bfe41100c527fe90bf4f99dc5816759c81af5e2cd673cc447db71ab3c3adc1154598c1930264abbfce7cb2248c72a52138e950e29b046f9b089b4fbfde70be6acc9da5aef660ce626711a6fb09c7fd6015b6bd5f5eabb2a649129f8f727c06a3ad59499f21cafb0b0194e4ea6084e2bba08e1ffd91d859f8e7b3769d302e3e32705209fe04f1a62c368cf84d2147f9a651d5d537c528ba054d0451838805d9a9ae1e7346208354386e506dcdbc7fa6b2b22499a8791b575de17bdcbcfaa14d7bcf2511f204ee89d2218591d6a2aa7e633a00c9ca1e0eb6555d8064b4087f1e2b4bfc72ac1291bb6be89310e26436e53a61f0e21734915b9e19c8860321fdc02abd0af1beea1b6d883c1f779b81c38f9ab25b7f1a5d31bbaa9e9abd14d7bbe80c9ae72bb4ebfa14999471124c7bdeb216b3c6fd3de86e5add64ad7683aa27da435e079d28a8ac55127a3e9d7fc2c71130deb9e91c66b5cdd8f4474eba19c03b618ee2b28490b083a555ee55cff73b017babbacf106896691fd61ea23297236fe9961ef843448534a4dff6f7a779a92759a3201bc46e9ec104828a1d87b2b00c4e1c02fb0f24b8fcb340eeef80ca7fe74d4da05b92d91d7a3972102d23fcf484f179352722c1ca2033513ca9f67a4db5d913b21b2648b0d9212d573d81c67f6e86463c0938ac1763b75976a3730981378f8dbbb6d93df7825e3cb5db4bafaf1d7f0b6e0dbb344f1ba1f2238880e8c8d0d32443db46193ffa42f8b292cc2902364e2171c1150acfdca593a9b59aa87316466fe0d4d76b18956219e3d09dc3173d7630bdbff080281b14b69fb73ac91e7c5bd8f95007b400084de8b0312afe6c9779a1c866b844d64b81f36c19fbbb297775f813b9718494b7691dae111e4b60d8db0d1831e6c959027fa2953a37ff329c3735c69d8f4d35274601441cc22aa2761ccb23be067e3ec4606cb1a47a25b85f121a6868db8e6fdc673c08a0d12c9003b174816781d3e605c6ba37e55c9f3944993e9fa7c0b8a34b3f366249a5c1b7e63b91a7db037aed4b3513ae8939ec23c12eeac2c6e96c8df84088f773ba7a88a20d9b1d64e5d3b3091df16becbc9d066965d78862a01a7e682d9c2ebba9b790dbc9f938a1b36ee5c3f3dc169c3f225fb1b06d46f7af33031f28f87e8dee195ed7d344a02df6bce410594c35244c0cae1ea11484f24146aa81f5166d66e210414acc05ea562a3e3c52a0ca2e015dbc6024ba75c8ff10d5d345048e81d3302cf68906a55da6b8736d1f8cce87a00ec214485f09995a98611bbcc9c9425f52dfdd3735bb90bc4bfce4eb5fd1c8acb9be391e21386ca14268f26dc74f2567b4a963c9bbb119f33f2b422aac6c7773f8f15d0a838ac96f996de5ec8f88b198f00a38a51b1e6fe81c8ee371f5070a92471bfe920899162227e064ad852e6d4f7f72aa7dd65bf9076eb86735cc29f8842e8e7c3922bbf94558410d154a78cf17cd8367a870024bcd90083c0a845dd7c609d97484649be965b5303dd832203d6e64bcceb97aa9ded74b2ee054d01b0ed4837d65f830914cefc91e755aee8d5edfdf7f6e2548ab3880da6ce2a911da343c05fadf093934ba6ffe7c4201d24899c8985bb4708c9edf66d872b16bdc23be691bd22e4bc10eb842efca32818fca84d519c2402f98ed49f5cfb0eb31817023e83f8402147a87ad24f798b54e798b9671ee537fc6f02eeeba1aa7ee8ec457fb45db90c907c8282f72b05858cd1214452b808fe1bb44dc643063e839d7f733aaee9a79019a2c78a5b8a4998b81fbfd275e7ac81480f96e10d515c25ba1bcabc95ed6bd3a5029e1b6634ecccc11a99ea3a7379c76cc705c9b24bae6d2806728cd232acdd1ae530bc80f097298d07d814082319d86d25c4059bbcdc62cd889232cb8013b76291a5f51187f2b80531a3d848c031bc3571f81d2f6c8e0c92eb5237ea9e4868634f244e81c2a48011df23bf60126c7baaf3cc99d5226b745f75db229656f2f80766d550386756899a588050b9e16f1eb6f26602f7a81ba11d70557b366eb9703420e1829f3eafdc86e5e114bbf5e5ad40b8eee0fcc4479bb222e8cb34af47d7d4c3706c1c115880bfce6e91ce16742e2f8b8db94c3f976b08d4ba98f7e14135ce98a99718a6f87d2b5b51515b0bc4ab6db46a174fe0b21806cdf66de7cc52920ae7b58afcc638dcb4d4afdcc89d7e2be17aaf816d7141aa9357c2cf6c3720f770f8bccd2e39c0a44180b3b87f944ab7732781800eb8eb2a99b84648eeec536be812e5e918c737ddb9a8826fe6b8cf560b020a9b9a7f599fff39ac5fd5b194f75a7e5865203846900694478967d0b6109152725a798c3211ad22199d894f8ba2ae853ec9b05394c40f8c288c69a6a6eded60e14513a71f898abbb788728edf74cc6dbf9e2fe1ca81bcd84d02540048f608747ee5d09ac80d804baeaaf93538759c7e026b05aa8fcff5bfdf728fa74432c8d571c1192cd4a8761c268b840e40ae070230b899768cb7a28a0665846341aa16cde3615424ec5f557446b17ddf9c26f33f700e550d6840ab82e9629afbe764dba2fc4eeb4bb73c039c36a64a71f7e54a7eebf3a037cc73f8ecb1f13939e06afd9de30f4469de4669dc1ff2558cf7f4f207c8f2e2bb60567213859ac9e3d1c46606c12cc94608856f7b291b04f7445ad52230908462cbf4ff3e8ee6b2c26578fc25bd2ee0a9de02fec37babc17c871fd9174b57ecf4b65288b4f45c5d9e4290a941009cf35b07c4fcfa3e2af3e1684ce82d40ce8339c87af6bede85303f101353a4b1fe69252cd35369991e01ef8ee8e9ae387db1f8aa732fa474e7946c780ae494f9ddaacdf538e958b511556ea2fbc3e05aeddffb03451daee00cf2ef217c435a00bf1e1b09faa80fb98a56264b8e600ccfa573087cf9a724477cb08eb571583eed2f2dd9112176d5ce126cdf32a7a779be2dd7e8bd95b44dd4bd3812d9f20b87e8b23fcdb4b63df41c30ff60ff518071500e71636d242e72ac59f0423705447f1bd2bcc09bc0e4b2ca6c77725991d33aadcfab4034abfcdbfad842e877b5eb6cac160c7b6e475358014e3ddde871881dfcf8ec49bc3406d0e4c095ca4107e897c30697c3d454722de85fb76955f8886266129b44aac63499929b50b23b052348892bc56375ed297ba8264edd482eb95112a422faa96a6e7d2df0dd6610b685c7250cff21fa1d6088682b6a03681c04322836e8335f279cc5dd48a3ae6622f45bc032abc70be9ff9e51f774a15ec9514cd25055b67405a6bac92a0a54e652594d8223331b4f5bee038b11d280d13e89e8367bd14d910c74a11a1e7a1e374d9de59269fde66f7a15ff3d01ee686a81924e7c3ec4be5e45eec5f7ac5bd6011ba66b198c73ef124e5cdc8f502f21d19c56c6cd2296d282b7fd6d895d1542eec55e273e12fb00e1e0ace0aa85fc72ad96bc9851aeaf51a66a87e0f8b8102ba452ac612a85ffdf8437eb55b628bf24a778ab0b2f6a7803716775676b46b558cbca7760046ce655a25b0381dac2dfff66490d6890de57b08cb5b04a0a8d6a930c36a96df550182ae355daad3fdac4cb9311c9f79b93b51f9e5c1fd1fe1798a20f9d29d025b8fd26f12c5a200df8d650d5d9c7007910fb195065a9446f6ca84e7b07dfd1bb2cfd1171e86a246ba47d56d5a8efcb51dd8f664ad738ea8412005ff87cb3b8e03480b20e92f1ff816721a43a8629a04c83dbce33bab30c66930a9d30058dccbb59eed26e31d9fa78c82a03ad7b5dc692894519b31701f23d772dd0c8a955567522af3939cd095d7850003bd69073864a77370e74f50ce43044d0bf6b71f39e35182baf186f6970a8850b145ccc53289cd618761b5cbb2a67845d33bf634fec24c1cafcb21de17b31f1b356e838e5f4b12c50195354f60b0bbe3bf46c8a52886aa8f5e7b1e159c53b1c61c821da1231b10447bfc2e6a5d0447bd2ca1bebe2b92e52123abac3b997ed8d7b33b0bcc029c4e364301019b1c239428a7d7490e8c998498bbb78cae9396fcc6b5f3ce6d82210531133e6f60026139bcbd41e804dfed114c63390fed1f3ea6197146e5e4365c0dbb692ec837b47f90efd98c2c3f7a1013b2d69ad675a0d86d5691aee2ee73afa04b913c9ca0a6c142488910762d0f94f462627750e6ace6aae4738635eaee8e654837f25d396dc8c64d4879664bf50e4be1b3390faea7fbf779b3875f47fb9ae557c9daaa405e08857494216d1abece82b7356a733c368acb5cce0cdfa41f3778f0c37fe4741c03083508930b17e168213965862c2dbd15af242f91377dedf6c899c13c9c430c4ad724f268c0d1f16da00ec0168ae1c02f0b5654aef743dc5b2cb92fbb421bc3427acb0dfd1ec76341979dd1962ff6d4297879d9d07f846ed74dd58b46668cc57c5b7d97da7576bb86707d167f7beb5db77ef52b8060be19ed848540988a14776b01d34c8b855e6e9eb3030b4d0f2de13b775ec6492b5f6220693f0c1c2d217d910662787a9eecf11ce7f62c894a3cf3380a1d36953ff6dbf274693a3bb0523c80c181c84252a0e763779cf6becd97082f9fc6f8ff3f02ebe63e9a4791c41538bccbd7a85d2128b604fa8df65809da94a4b0d299e17912267e1058d098c8f8f6979dca95358ad2f193e93fb7df7f662d19d5c675d69e82f01ca21b51cb4f6bfac3bfe11b66004e0e82bc2897dfaed8361187292 +0xc5ad53c45a03b0e1c8dc5a70031ed1ea16bd09be869d4505ea811ac6ea8fe988d264df3b698e08113cad1908b8710494e31f6b94275544eaa8dca047147f48ac +28744 +0xdd946aa6a6bab6c970090084b034ff456f2fa9bcf040f78c9359e847f9a5c8996961b2c372ed544bd223f2f297e7ade784ff063ab6269e93885b3f24b37f20dcba1f65de858fe6314b3831b9b632d2664216d2abe70d7d32f72d68ce4906b3b197778cdf25c7f4e2a3f0c6bf553ef52a711915f6c91f1dcfa9776b2b0361087ec9112ead9bbd07c6a2f5b8eebc339e9bd9b3d703a58405d467e04e2528b9a8ac199453322f9aa64510ec0f2d32385621418a21bac264bda7f7101ba3023519a44ca9035528865ac7b480d4630075a3247346fa036ae6ceb221b0da8cd7fee5cd2df747fed0a8aab457570e7a6f13100c35906bc6e332bf5baf6891caf03b938e832726156d291e74c119c559c53a224150107beb7671180c67df4a449515ac5115e0a98348303e6fba6f01e84a11632b8c6d325a6bcb622c13be0ce20eb4b77daccbd72ea9e6930e0a01cb0f48c15a32b04f98fb0a67232379ace08ca23f3c7a108fb8ffd773a4b778762ab605718fbf8660b6b69a6ee6586252cc2a9adec4af09d554de1cfef9d3ce7627c5ca4a8b38d4459374650730359557dba43ebbd6865f45b4b4beaf1bcbd2abc924df74d50763a9371bb15b8b21dc6512e2d6fbfa66d986df6706af91054dba18bc8c16f592fb32ab95c7927e84fd217bcdaac9b8b74141dde13c26e3eb064e1c73195974436388f6c8efd392c7c1351d4b024b99e25d1db708a83c9ae4c70dde32cd64d9816554209e71464d50f049004525a9244df6c374c692173d57569f65e2f260acb3c73e32fe94143a8852042da45c0ce261d3da1c0241e254ae7cadb969ce74764352ed33cfa165ded7ae0fab4eef9c5986be0bb8a4fec3685001dfe3b1a9c9bd98ce0a2bfbe060c3a6ce11822d268013257dfe4e9311e200a5addceaa0cd860c1a033c2369992e705b78b3bb2848e198a4d95ae9b9c268a415484dd62081d4e831b92c210114f66d60759d5d269fe66e6d9ac88efd597ddc0899d9b0180cdbdb45b78230ab98e1431b8d76701171b81fe688ef47471d4831e669297f6fb7c26cbec6e5554f6f1779f687e7fdd0077e33796a781b7f57f22a1780e44b0fcab22404aefd9ad5dfbf97572d970a4ba961308d0a0a138e4fa25003a6b31cdf8dd2897f37730625310225a8452fa26a9f89a0892e4e355a4d812913a33efbc7474b259828efa128ad07ac509856ca15301d0ad79feb8bcc99b73fad3e2cefaf424480b54b1874c49af7b4b7eeb58c34a545f7de258a1dcc7a6b1a3b4026017fc4e62040669786e242f9c3450ff3efaf462bee0687d3f1433ac6402372d3381f16588f9f4213e06beb366362c2b9fb6e5bf477b78f6d11171fef3bcf99dc9c7880c3553ca7358845ded51b76d0afb9592ccb1a5903018532720e93a580e83570494ff87d5da5885a63ff73e9027c305901d66054ac36537a7a4dce0feea00cf0bb2302cc2b0ae890c1dcf4231ec96954213dd01152b585d981d27673aaab28e11c68fb90da0daed14293258dec3d6a33d529f3f6bd262336cdc5123b7db39129b54569303255e4042c4d8f8d36813ddf65c24f6cb42f3378a74f2bce2f5d50b2cee3d616fb8b9111c831b88cc23cea3f192f6edc017bbf895798489488536c62af6ac9a9fd56bedf5e682af35917773a3899d8ac6ab0ce5025c7f1f5503ded239f01cb51005f725836196d28c3baeeba0c271346b87769b55904af594ec2dcdce8d06376cb4db563976d0795c8cc56a6db02a910b37797a03a7908284b8b4075d000198027c98fe8cb8c82a030f6b8e5ee512274225960f9114b86ca0f4021d5a0b975d8dc7b09d0189d66b3c2df1b618d3d04d8cec4cca826a5b1a8628887e69f2200e4b20a2a01c7c83935472f870100eed9a68061e496c1ad10280c0b7b8f1764410d711ffb641f37858e889005ad8e8b2845fed8afa92a8b2bb3d47204b84ea6c0bbe06182e16a0fd1254aa89b4d803c7a1d10d035caa8688ab283652b498d110657c879c961ee7ba664581f54ca1e2b569680f17fe2856cb68be18bf72b1ccd9a47f10ed8caf5a18bb2799e350ab07d441815e494d707be36a8b68d7044430104f523c9b506c5a9087774cd48f67e5dcc0b96517d937787926fca129e7d4ad6cdc726526afba6bca51c12539476d0f177d7ccdf40fc1dee534ae5c38abf78737c27c150ff93e202eb071bd92173ed61cce47f37e7fc401c00a0ce483bf01700997cbe6b7ab4c0a261a15706f8d31ed6549b7601797a293821d84e48b9f96da7ad2ee34ce54887c490528d832080ab7895627be4ff5d216b3e5c2d6c0dc3c38e3fa5f99b47368092fe8387f7a160dc6e19a25488808f6edde093335b3e3560ddd748c7ffa966f331359a0b0b845df8e168c4ca9604f758b58ee527bd54368ebdfd81172112c027ccbd01e267d05e49f8082ea5b6947d291cd1bad33c58b093563ab8afa98a2c66891c1ed4b28d4a15dc834aad8f36092739307afd7e518ab8cf1553583e1a92f690dc5ba894c30ba5b4617faacaf4839c35338d6e2b47ac455017bbda88c8da200a841f28b77b8841a92834630ed6d3ce37625ceeec42fe8203c658fd319eec2c1f9dd11ac0bda931e362d3a104e3e20668464d45694b67b60ead9289dea4b062f6aedb475a8f56bc8996c32c5423968bef66c93a4969d22b9951d24539e10f0ab83fa4772bfb772bc34d6ccca59ed8a7f54a399634a52427cd3c7efaea5def6b8cd99471db08f4c6bb0e36499f5d91a0a27b0321d40646f3d1f5007099203ace9b0313ff13beb5d59661896aeb67a7bf1d8091a3ce9420d7ce04be6fed33d67b0d4589e77b26a3a07fcecdf831c4044c8fe149e4cd579a1aecf222bf8e9dadba09275ef2ba47a46f9cde6abc187d8e8f1f2795ab77589d06524592272566a5d3b732fae8792aa1891518c87b49992fcff6d9dcc2749e0fe1298878715a97a80d40edc6915fd5833713054f006c20ce563b7f85ef6d31daf498403b63d4369db2cce028b5155230c1be2b6812281b526a17a2fafb0a1ae487c8f743c63c4e6b088294891b42a9926f3d1479782591a554b2c9a2aef26017e2e134f86139e4fc588b90528c8fe09088b948ecfb0c8aae5c337ce5cfce0b594c0a80c2fe740237e90f5ce9d0a3011156594d2763850e55c9c3432b284524940f6b62096394af04053581b8af2813ff1f46ad9478372682e589a7dc7f00b1af712d62355942f44bf2258625f1c31f412ca7f09901cbd91df6ae2f609da6bd92bb7808aea826d8f4f908f39a5d1e2cbfc5a59ca0c8e8300e455964204ae04d253473dddc18e763e86206517ebce1426132683b109337313d1ab3cc824d566b5026476828712e9d0d75462739d6b4690fba1754512b60e693bde4f1ef70af1efbd71b31f87aa28f4c7af1fd33733daab1a6da70cb580a57f675135bd079946f0e9018c1b5fcec408eb82e5cd35b270c2f3edb16e6e1dd8b4f8b68908b31ac647199669fc8c0b3b8b97826ca8355189871ca3fce0a90838a87470c1a8a60a0080c3a2c53978ba000b60200d1ab2bb8555f9231219f2ba15c84f1278133ce1760c7bb93668c285b1f6e9ee5f9b1a3b14be2ded7950d7be20a30d1e04bf042ba768b63c25f0e5d8b1dc894fdc9fe86a882e0f559b4bc48eb9a722f6002288631513e7ce1c684f4d803ab2b6fc9fa9b48034220e006145a67173152cf2d426023f9ca4c1a2458b3ecd801ac64810dac36d5f1a794127e78fc8657835455a8993877151c9300f1636ca4b15f037aa07f1d00d4d29c60606c52f1cb0a1701c1f919d2093374e2b7cc036fa38c753b19dea38dd2e8207823fc125f752f41b9f5476e128ddbe65212b55742bf7be14ce28f7083d5334ae330f1e4d93d3afa06ac4dde40885a11d96ae71024ed747036615a2deac4f94028ee126f660b72696e4ed11262e4f91cfe272bd71e15be4a80000982ca86832acfc4295c0ec720b77b439cb28388002f4ab14754371fa296b22662162c051931601cfc52d9598c0bb5f47665a85cb7744471032e77f3687d553a2f921728037d645d55fad0a9fe8ea3c726d3db48651074cd290de6795826f0a6369d94d7883563eefafcfaa0be68cd2576a52334542e622e7f9b8d9ab9b90bd140e0aafaf181e339b3ff602413c0bb772c838908caf497fdcf7d733cd5602e231403617a868a6ea54aab081e47bef623111413ac108a9aa0df5ea048f241e2047cadc13d8f788b9a85aafc77a08c0593ed01cb086e19f38177e41da75984aedc3e86d32c5473c3802ea14415674f702d88f1b9052bc92b0661b7f13f52521b1323379e2f1da29cc00b3be6e2e332c05ba98de48991c1c999648024fa24d3b011f3682a2f312da0c0e51eecc55e5a7c841a7d547de62a55a147e7bfbf192ef53f76c08012d93d57e983f25da51ef22c0fa16811ca732b5786d393c975778c720373e8a7c25dfa48a3af60426c6c20586607f7245680ed58afd02d4a068714b0c6b488a725058bfb572f0fa201900c89f013d1940b5598e086065c4b5991ef36f1ff4789251818f86bcca9854cd2e046158f9e69d0395375723cc9d256dd448cea1dcd54a9e0cbc8494ed3f4357ac1183d4108ab8c7646a1db3c1ceae5b23c3b1bd6c31098a3caf2577d37f5a4cfd986d0f3b56329529aeb29ccfc98ee5affcaeaf1d1c6dcaa3dfeff217d93811a5018366b4d998e1677dbc5b511e6591bb4c1c1389e7d5c3d4d74a8014dd3b4a34e56d8727953a30904fa15be04db0e3e83a90771d33d00a421ddb9e64dbf25b2fac91ccfe19b50756acf82b17d7ff60a95082465170eb026e3c19c98285ebd8f7cf86b4c2c787da0d0e3755523dbf7c9126980dc13f9540cb8a6b8df84b86282fd6b2eaf02f312d35fbc54719ff6fac12251839e6f05d49fca1675830ad6fdd2a5abcbc10d12f7563fe488ce98d9e83ceb4a9572d23b182441983b4b61bf77c89b3fac4af2df157197e37a34b78aa78098db1e21e4a109e645b57200317bb6ac08af37125c62526c8f3f916aa41321d54f8d86744e428d2cfcf3826a2413a4c61384d6e0 +0x858deb41f50d96cec9a0850ed70b0d96207e6d5d8b3641fd09af5084d65a7c7b71fbb6fe04876ac728750a543ee31e94e388d42ca5aa2197fb006379dc67b423 +29536 +0x2522cf92da7d8f153dca86dd249aca300b85697afe796441ba51fb5b0fa92b5f88f176594ec1e2c24a6c44af8ad8be48e68d877ce30beaf3d76192444efb0469adbc6d70154d9e728ab455c95528be7ea62339017eba5e1dcc2a3e2ad7b3ec85dba93d3df7c8cb0f46c840954d31d1ba95710871982bc7a7e2d38a757078ec9b5ce06d2abcda7280c7d08d79399cffe4f99c7b34f9092d785e84fb8ee2f20b93768a859d2b2c9aad52f5c5dfe21050e41bcf1bb269fa997a8b671bdbf4ca515572cf0d000d664b7e325e6f2e1136cda243306e54b0a61194b0a171c570a8c6c998d68eba2a308ddbad3513ce8cb67d07b9e7fe8095b7a0ae145d85b51c3373d82fc890334a3069ac0d9f39271b3769f9c41d539fe2d24bb100c1e011c2145f6881cc99d33511e6d998c66aa188619761adfaf31a5da11c83bcf5094228f39262d40b3302b2790d4a97d22da49add1128bda56857cfcc1a0d902288b1177615af71ade5288b11e5e851eb0b981853df3439473ac0fffb4d37c470e6c55648ef35a0d937ad8680769910378be5cb6a076f6c07efbcb7d5beea9f06aae5af0f28dea8b7b2f96c6ec8461ae135f37bcb93c09d0e11b2bd02740c6a0d5c7be874c991d370dd740485e4d8b90f912aef1e8a0e1383280cda2b77866eac85eeca1ed936672c4187186ad13532ea28f3f10af543178fba31d6f8d041f00caca61db660b4ad1264986ec89747d09981b44737db46f15a5189791086243b54590ba9e367f5ed4bd011d0453ff4da4424d6ba4e44ffe90b747c8b1ca11696ad1485354ef4e06ffe0d580489cf2697159ac212f7395647cbac72d3c32a01483f667c8b9e125d7a54a1d7d23d52c450326adf17d9c03352c17fd31aae28cc9a31d658717cc654577516f40409cdb64ec31c94919de47e531677072884a35fd4aced81b0901aad4f88f41960944ae4d6f1394b47eaaa1f92f11c76c5eea4a23ed7315f10811550a8b6c1adb087d03633e3486b02691cfe577bf589b994317d1fdb2c5a58f8bf26aa260718ba896894abc3d15c8ac24104eadb8aa6cb1d55d8c1df66db529c21159f014dc1474319e688b65c85a79c2117923a6337c532159b6a0c6648c4164206cd6e1c121e5deb1410e67250219fc52099c009a26d7a7bae638ab40b770d2be27d96fb72097ee6068c7b9a24bf743408459403518c9e8ef9f480d88a332ae28ff8a07249ce4e13a4439d5d694ac376b5dfdfd9aae945566464165a2fbf1571f783b50900367779d77f7242888b339411aec814174e18dcd8fd76c361e575df0069fd49fd099e20858625d1e7476d9503fc783bfe81be273b05c59b876bf23594f09fb9a90f6e1197a2dc92ef491981720f17d6c94be03f77c52e680b1a357a9a62c4e26c0f8c53f618bf0e0858de614831cc6ddf74262d7285d7b454bae6b6fa05934aafd3a3ee8833f8cc9b3b643c6ca7bf89a8c437f8168de806ca13adf29c22357bd82159eb373aac540ebb541ac6bc19b18c03bca849248ae7d5ec30356800d1fd51c25651ea74062fcba056033eb7026ef3f85c46f593e4dedd0f1a8746e99056807e4328892a2be438b21100bcdfa147456cc0d9012320734a4211f01e239a10cf1cc879fba546fbbfb82e18287e1fc4ea2790695519632e844ebd79d8f716b2a5668c4b2a2a7dfdc77c54546adaa36d4bf173ffd9c0d898f3fbc8295cad2cc5692238a6fd04f871b7c42cba6a3b56cbce9211a1755fa4380010d709928d06d0851973925c79e0dff9595e5511eb6065dcd1135a113df2961157951f62dfc95b6013e6182fd35dcff403912a4531e8c3de77212f95a3e83b9096a775b5eaa0ef62d8393f5e5896ca10896d43ef54166e3a4ce22ae9d9aeaee396b81371f7b113f32f1310d251b457b5b59ca7f89d13ed5a18ff52f5276d77741f6eff804e244f7be11c917105deff4b4dc35e465407c8a4a31fafa2d54d1fa9f97143c837222b62b7fdcc24be3d493a1a8d71c3c11a8882b5eb4ad62a752deceb6ae733fad33010765ec9d4c2f9bdebe49fe7552b72b45b150b2a7a6f0e29a4be01f1a8de5ee5eee9e68f675b39e3c473a4c8e6dc3ad4968c265777ed3f9c383add6b0e2cebd262d73e26c7ce25442e8e421c5d1a98719de2e4dab3e9310d1227a75c4f2da480d5070e96da66e76792ff21eca22eb412d7dfefba18ae0b04994d06cd5226af76b042fde78a6aa4d4568cea3f9d60b73fac4aecff8d83f6093574a3c5ff62343c5950b322bd218714e4fe451e36f7c98084ed86b2f9af1aa54e63254c3e285c5b3af9d94f5dd4b5aea21cd990553d115ec78e63da467b9e5f4ce3356af7bf4e5ab905177451cc592afab04f9de278b860ddf62b7f5b2fabc098bc7b28127033c1403b149b814e991153804e4dc5f1e50f2fed87a92013684f98b69e8d77833319366479cbd5a59dea14567fa9e6f0c1f1233b1f617d6efe94b59847a20f4075e90348ed0d35188e3da7f88ab82dbc749022a79aae5a8a9417572c1d6ec0ee22b90eaf196889ee9493732e1683839f257495faa0999fad5361e738c9f973d76112c161a4e4b970d672e0c2cb10cedffd23e2fcdb29342063f9cb85f24b11415b7a83253789ade67d65567a5369f8c523277375f066012beb676ddb416d8075387bbdc57a604e98b0f13d205396e799bf08ae2d8a58ef15133434025e66aabb1f9dd507147082cd98a0fd7a769d85a3fb4cfdec4f08e42805e787c1f03e755a386734b4aec132ce5df9fe516188b82afd7dc779e77dc9aae608d0e19ffdcb9cac614294ef5c47e42684a96cbf5f6a78ed22739dfbbf87e4e11f762b15ac93c7a313676e8048a7551bca6495362882d3f4c46b2033d7041e1bb5e164f753b52444060c0b088d3c69665298926eede8843aea16ca36cc2aa0bf517857f0f818fbb8c197343034ec6a2ca4ae2c11b584d3e61cdc62ada6e0b1f37ca5cba6a5a69427cc72afa044a19e98490c2bc4893e0720e325b23f6e0d9adfbdd087c1614636b8b00344ffc5424fcfc81c573170fe6a12c55980952b9ba4ad9c5f54ea35e02b93f4b4bdf6c0b7c3fca945780072ac42e14ce09556e5711482a1bbfac9275db9e120ece12c3be8424575ee55d99730d8b80023b92ba4773589554c410542a329cabd12774a41bd16d2b381b762e87274bd6888b3bc71954ee73f7af1468b9bc375529048f7d71e86cceb6566466c5a5e180c784db053b3a6c7e8aed1360c2dce0b67cd1cdc07f3d95ba6022a2b2bd1ddf2745c4db053b9864fd64eaa7bcc4294b38431baa0d82458a66ac0cbba2ebd3a73299a7c63788f36a793c444bdd3c05b963224ecec53994bd6c207109a7c08bec2b29ca272ca1efef8a77667a52a916cdbf80e78687e3afa12333fc2731d98ae0897c88784514c266a98cedbdad89b0fab5f5727bb63f0ac8347d0a9ef1a57556c6188f2421602f524f0326705e5c88b2eee67c18e0aa1aa5185228db47a2bfa179743ad532029b44f360cd5ce5afe2a8b2da70e8879363da3759d366a45fee430c1607e6177a7ac12f3c3ebdc3e2732eba47dd652ba98aba1a0aa6cba84b75ce067492e1124662296aebf72d8992aec75dc52e093d5ad3c758daff64c3e3eaa4f1265850d2e4c6102ef68316973efa0525c8ff5f4d05f3a44c4169dc77b7b16a4491c4afd9d43b07f3f26f238d55e96a9ac9add1db595eb39ce4529d34356e80895d647887a32563524617bedc65f15a355dd60b58c37997932a662199fb767a27dfb4257cc009c4b2881952f4fda6668debe45655b2c8a2f789f0f419686dc9b89f304129b97caead3ee08a677b7d21fcfa756d42c5e0681299afaf331ab8f1a41275560efde2839ac109cfb46de9ff1b1ff59aa06b45797ccfee9d6770ec8482efdfce9d1bdfd613b5019d6c43715050a2e1791f216c49ae933a5927097cf4cd7dec356481c9389081446defaab7e84659c582ff66c94b209a1f6d0242feb4fc433704f5de330da9cc5ecbcef20209547b1e42c1d9e1006b3b0a3389cbc66797e62cc7b17fa1d7c7eccd318ab7f45613ad582316c9580bf6fc87671df2786f18cd59f837e4aa296368fc39837b1330fc570fce6ed372c04c5513524f55994e076f2b10e9ab906504d7884e79a9d32c871ea18f2a76d5bfe3eb3a9f8e739d76dc523c9c5743093d34aeeddabdc2a8cb4c4ab9ffea22056d561569a96bcae99c100cfb15013988f47b558988d064287fa481b58b1e73666b0b6a2d0a57ca22003af5d2f567fd743d417207b341fcc6dc385a20db47d99d1b7c60012ce2ffcb65c5b370c7fc1d7f7a0f6ad4f492faf843602a984ae6c2fdf1418d629b9dea4a1f48bc40f75e07ef3d6dd67db733fd5157c47968648bde2daec358dde0d918129f2c76c02dde4b67e9c51b6e95b552567bcdcd3db2a7798086aa38ef7724e7d987f9797ab62d666e11adc023fa87c87c41f4ac64bfba23bb3b3ec403c921f7f34c284add4aabd76657a05b3a603b9e372cd18d99e6347b221f2970a77120b7047e41516435da1cd4fe15431e6141621baedce739b0c6ce59a4d2d566e9d1a36170cd33bc1248a55ea7952e5c7829a2ae4a7f4fb0c9b1cbc68ec358bead955baed63448215a781f57d6a863511f64de4382513dbb7bb5c1fd2f83710b36ec3e41011f254098d8d954fdc798a8b173838fe8cb27a641236f61f99bc4f91056d9dca3d651a637eb71da9f6b14dff8e620e7d075a40dd48b12998f64baf4c4659cb610f233aec240676d3e0b8e43302d44ffebb9295e906d5a085386c98abd891571eb0b61e6c24828615c316b9ef1c94e1c9d3e2e14ff4ab442e86a77278641d2a4948a62cab293336b7c75132fd84acae2675d28cd8b93afbda0985a67991032b2afe79ce70d9226f0013f3b924e1239d5dcaebfe4cfd8baed2e98d9a77084d4108fbb96b84dc56173ad084b52bdb0295b5f9b4a0736aa4465f4d48b7397003562d67ed6ab0dbd717ab258a8edb1b5080772ab6d814a68fa9c75d3c6589722b51df699e35ba7eae589b3b8fabfc491545ec87770ff95954c15243f30d2db6cf19672953336a6ce2c154391a76560d5acc593581aee82cf9744a24f515eee3f6980dd094cc8a4e7b391d48b456b00d26fd095f5c1baac688acf52bc8e794a1a9b51886ea68e0cb82aa3d90e3b3d3f481c0432b8ec007d108509d7df6e9 +0x52e4c7a5283c2c147f07e595e81832f5f31f29ec02b4fd68ea956d54a1f6c6bc953fc268df43ce47405362d3773f8f89fa024d92b54a1203f6d390bb88a73227 +30328 +0x8e4d3a26b9a8d496f6946eefae61662fb81fda07d71154e7845ead5cee0a2b9b4025ed5e224289ee822bf38194d3a1c7178cecc0db7abad080485a158019aff870c29102823670f24f413a0cd37a7fb3b973d43ad93275f800e52e9aefd17bbda68ceebde26cd1c7e43f0d36743c4a1c263a581edc20cd868c9df0934319d6136aebcb3449ccf498c98b32a77e034829e44b4114e92c0ca2acd86aa785d80a224547f112bf3e208b878f7108f9b6c3037d0c56c30a3e7876e9fe627fbcf85d11be0829fd4caa9ec8a5b29401ee3d01d179e761d4463e5b27ca77a1c3f06018095e96399df9f8b778ab5b613964804bbc5e4328eea614fbe0d8abef1a29f88231ab59e99ccd10b0c321f4a2596366e8ecb68775ba30a9a1c79903132c70a8e5b22fba039fd1dad4d090e41d08f3d92288081d0ee0eee3940497e5d7a2cc5887b3721f4d510b3f6ac880939bef1dc13fb9dd6cbb07e8ab1ec05aba012446f0b25dfbf191578525b9d27769e3b6e80488a6bcdc46d725ea852368eb5a59e558acd85299955c47760a17ffcebf045d8b45782dd575faad8612544bdeaaeab179bd4bff7d22065718a5bf9f2af581823ebe56b8bf121588690d7c8bfdb97eb2392fde8a07fffdbff5d2f1e0e54ed661053a69e602e3d3bf79bec2aeaf4ebef18148bb7c9ef6ea87f3d9d5486792ab02c903d83e06b1d958a06c4f3e5b3352753a52075da9cd75b5fc0194611889a76b705fcc493443d25ec4614ac36b2ee1464a93edb3924d4553f79456b361fa73a6e4976d8df26364d6cfe3dcc34608136d9b549308c03e0368cbd842c4a8afb7bb0bf2e294a9d737caa83b2dc8548992f113dc21e39b6856fd6216811f566e1ab0cfba54e6c268f44137b16459fd7803da9c75c0cd8b92e719a3953a49d400448f1735ea09a3de4344648caaffa99e11311d65984df8865ec4769f96cb892dde60caadcd87b601cbda17162640c0c462fd7df5d0eb4a0a6206c37abd2edcbc9029d26824e86299350b389501a7aab09e46a66d902fe9e79be8726fd6fa377701f416af18b20e6d28dfaf5262b9cf2b6e147f1502a23ee5b2716cc60ab50124dac87ec9d16f24464d5f6495720098fc7a70f0344bcbafcb4faa97c780e9a18cc2aef20076a60bec4c9240a658036bed6961e1149632a5631999dcba611d817762ac5a9a30e02b27cc8129cc3d4ab1c4e3f03afb09608973b94824e6d4da08ad62cd9ee026a4ecbf75320850495ed34a9224e332ccdcc1c4d6bf559402a79ef56916a71a817ab67bf1afc67aa3c637471b05c501082eb71e1905580c120cab181f915b9068eaf124e5004992740a4783299bc6afe5dfd1482a2116962d9197df2d45a389047d0582fc2b7be0e3b36ac562efcf868a76790cb01e767a7bbfcb0f3b3a684f7cba5a5ddc3a43ac194807d66e08c9cc207b163054015fff231dad73f0799028f92a587d2d34883d3e51887ff6ee9acace770f7dbdd4bb6e4e34a6d2f509045da35368aa982234dc79565486a2aa2cc8bdf1cebb939f710f238a1ff3f1f2ad35a1bff0abc40b2ed1f2e0d3b31943650e1471bab28068692acba97e9f8d3d72fa1cf65a495bf75e64d2766dd004c12fe3fc7f3b292a398b076d192c9e71f13af23b7e0c4c02efacdd41a18aa30a2d71919da4b9ea3919bfee326092b84416ef6727e1707c63f9008366e892f6d48e135e1e679cbb5611ed26420817b5afb5789f07a7eca02620429f6ad3ed8f09ecfc93a8514d652927fdf8c499225c59d4bde30456ea82f3695a7974ea0336524f167762e932b05965d7ace0991d76eb7ea67a4678d1e870de3059adb63db557c0485475b7b4638fd3638ac0926fcb0cb81baef494099b4886ad873dbe01d3bf467a7008433b4872788ad9890b8023658c04c53733fa632169b74a4b8ab85733ea941544163025ab5c32e3668db8469d01490836dc0c07a49037ecffa3cb0a5ab37f8951b7f9c3e18744ee7d9f7ffc5d1fd2bf1a17a751780216b38290a0b4dda9211456ae00eabd02a943f6c93d0c4def87320a6c330745c73ae8fcd9a11d63d463007b84ac61e6d4472afa935a3f147851a82f6418f2b5e88dd29407350c953d2d93eac064f2050508eab1863e5d5bc3166bb086beda6e6cf6bb73a1c34a1beb6817c8ea9263c29ed3cd4229512ec9d6c0c1b65b8d87185b5ce9c12fb5a09ce6fad2408a9d7dc4a58f19d504fc7907bb35f3696aeec05cbea9a5a53a72d3c037cd0d7729ed08b425261794a0a508bc7a5f48f03b474ee29cc437474962ae30e5c80f984eeacc39237f0fa584b6a19119240a745601fa51fd95e7d0e4edf894f8d222c982fc91fca982493038950d2ea26e7f1c44858a51e904fd68937b789379d58c324c8b1ea5be170c5e45ac143a1c24f1118c3ac68c69f9c036df74f7d66fb896fd34ff3cdb6b26a25632617d5e902ea67ab68778a7845c79634f403d05e263884fc2c0b346b7975141871e12410574e7804ad6664d431571166c4712c7dabdaa537f364b8faa526247cd4a998c83ddfb4bd18e5924ac0ced78bcf23ec460b0432ef2c9cb5e4c401d8f8b4cdbe613532c02d31619d4ca2a38b1c9a788a57b249d0ba4e2fd5aa647c942498ea0f8bbbec0ced6d86e06a25599e81bcfba1234fffe101be7a72cbf50af879077af69850400d6643b20623e76574638d39ab2922aaf65e142927c9f441887e66fd2e2790e344304a7f68fa576bbf2aa19f12e9d8df8337e5986f14f094a6ad6decf0b9ec4a43c3f84ba36df3b0d14f90b862d5d1020a278964b33d6898e57e52c6f8bfc0e97ea9b3b32fef5af95d6ab102358db9c71d95960a8eb3caa2b769dc27a0b9bd55774a2322790eeb99a5e4a8f8e571e173101a81e66c18a566bf08506b83284ff2a03dcd26093d24066d45ef290d12e6ba941ee3a4d5cc77494ed2561f1a9be7659bfd083a7b0a92e3f616da0f16f147e21c2b21b2565fbecef94063cec1751202bcf06aec28f7c6a6e2d010179d8d73ae1ab7c29b6832ea6c40eaffd722546e7ea5c06b97ad752dc3a5fa17df0b47f853025d5ccc85f69895b83a80e4b7ba4b2dc8d590e9730346ced1fd67c1dad15495858436c22a0b37ffb1a7ad53fc073684b8b8613e1442902ce972666c9699f6d9f6b50718def1570edfbacbc169cbbf37d7d153220b8398624ec1ca3bc9028d94e878443d1f496427a4fc62997b9853abb8c8ed21b376ce038493d9bbecbb575acd3664ab6563edee83e51868bbcd8254ce07a5a9b67cbf852d413b797c2502903787eef04be152c7fefd43aba50bd9c7aa0613468f05db6b9b5255d0e1c00dd999d549882d32414898bd7adec1b3b878bf5c9c74a7b2b03b715fbf6ed81ce79b86b71aff93e727f4c39e247e9c55acec8063c7b09b03bc5921c1eebfa9bc0e5a60a5c9a31a6075311227e7078f7225a79fc41b86c3697e693f115a2fe0fe109aba19dc3f2b4ec7a206d329063599c11e6fe61e63cb6474c02bd6885c08836cd1158bd90041028dac143870f7092cfdc5635226d41d751e127a7a0fb0aacc91a1e58436b2e61c35d3ccc0455684bc4a413c80fb64342bf8b49d8446ba223a1d61cc9b7bb394fc6ead82f31ca122b814f63e0ad270a9e9934b277dc3f5196c6eb51d3a2e7ee843868df9596d738db10c68fa586295d94e5c3a8adf0dedfad413f069c8a5912a521c19725bce2a00279f2de3e212506ccad2074a209b0140f19bc824ffa78705d8adc49082a551349c2ba9ad40681cbedf8335e7dae1db86556490f1277accf517aa13c6568965958f505098ebea775a0cfe4ad67688d925601cdf30d8b5df62cf9f8ba65ff0f3ad619bd7595d0fdcc8c391bab87be686b8b2032776abdf3ae940fc9093076267e6b37c92410c4ed975a3ec09e0638160babbe5fe34e95d6bf31c5fc72ed5545ecc056115f2823dda0b1e6bbcf0b5eff3a5fe03c7fe39c6ff1ad22793dc525d34e7d7e7d6d057337ad3a3af486bfb98cc04f90b1925159240cad2e28b2df6c386a4ab7f598ce3f62879c41530b49d0236422d5a666c0555ed7dcf2f21964b5db08cd0a6126ac0cc6f68003c1a5d22b2eef81b803415716861bdf75bdb97b8526f2b17ea960c664cbc18e89249d8253132a133fb06c3e2602a061c073db4d6680ef9c1cb58e45ced9b26dda663b80cf3cda8174952f9e0d3c2e08d9fac701df51c637eb6df850d3588fc6fe6dc7f5270fca725f9bd19f519a8d7cca3cc5c079024029f3bae510f9b02140fe238908e4f6c18f07a89c687c8684669b1f1db2baf9251a3c829faccb493084e16ec9e28d58868074a5d6221667dd6e528d16fe2c9f3db4cfaf6c4dce8c8439af38ceaaaa9ce2ecae7bc8f4a5a55e3bf96df9cd575c4f9cb327951b8cdfe4087168e189c42c9d7bbe10ba07b3a8d07697a60e46c299257df0d4613d8cab19992ee64aa7626f7fd6ab4ef482c7d7fac635229d92f5bc85fd8f9c1adc5659ec93ee9a512b0ccd50a57d1cbd8e6a9ca6d4dac8eed8782f38c49769061f734f229fb96c3e3e4aaed78f3c615f53225e9a488e804941d458067b10226f2f6af7866498445807a57add3df10720f87a869fc95932f5f590a1b6ca02af9b33c3b8df8b920ae8afa4992a57a4f549a6f77a7dff44c63b1b3471125876f8d35407f9f4bbb0a6365dd07486845b13218423a3fc93562563db482fe0ce73e45ebabd248e9df9008a3aaf71b96c2049f2bb8569e42d9835b55e5545e9d3025d868c6da075d875002c6ecbf98ab8fa7f0272a535fc7410df78cce31af5102a4b91f39fd571152c8f6320ac75c210f29d9bd20c6d0d11c80cf64d7816cc2df394c816dc2b4afc27937978d84b291b0e8b0303417bdfabc8a275079ea135d16521731eab0ac7346df5b49fd9e587825831822cccc53aeb168b3e25dc23f9a489dada3295dab266069e5dbd37a9a4ecd878627536b5e679bcad99cdba04e05066a7447b2103d139fb75bbf9780148029546e90706b1aafcc2f2cd28c1acb27a0471fb20d7eded565361187c26543a6c9785610ac423501d2e40245d788437cc6c1e454a3f00cd64164cba6ec80943d1e61b10a5f9729e830a81e49468f237eea5986b21e2a53b0c4c1deaf6e78a2bda8bf23f012c065dd65e9c56f7175f7988b7c5b4cc4742fdf6febcf03c0a3eba2e8df03546e54754c03079c2ab0f34c641ab8f6a74f641dcc934101469b98db776f4ff3c9bac9d4de78a0070dbd8d7e6c188ddd3407808a02ef4039ea57ddfec59c8069a280a700ef37319a7adf8b2a1b156963959540111cc487cd517dc9c1f8012ec98168628618df4acb149f92bbfb91ea4e2 +0xbd8fbb9bc746521cba8628670493cd851f43b6f0263f49d3b6259519fbbcd93cac1c7d215425a26a73a3c0f28aa18833a4811e3ecabeeac0917f2e18f7718c8a +31120 +0x73dfee3b9a968877082b72fdec5a890239a55eab0ef441cf757f9eff51ed8dc392bda427abe60f7646bae3463610b0b4ada256f1afb419fec6f7f7b3f8ac3806f60c488a96e8c236838dcd6833eaab291af58fb31e4aaf314a159bc5c633cdcf0794816d43e4c73e286ad66ccd30a3e9e964b2f843fe2cf069a3333ca5c972a72d1df8d79a2146169b1aa659eb29bf7a80b867c90617b8c38b6766217cb84f15d06e54d083e968474665e637751e286649b8552d4fdf7a33182bdd7b32468ea158503e60e682545890123e0e52570535aa2e252c069c9bc778b53f52b1bc54d32d8b5e90ab3533d1e0eb55e76c1c7f6d0de07ece1397420814cd35afe062cc34b7e75b67ba4a2d3ba0b6d4c9aab5be98d998091c5e18987c523d6799a77f1b4b5f2cdeedfb09691d373c62bdf469e93d761c6e1dcf67c5ad9bcc7c18ee5c6ca08b218e2b57ba10ff0d45a8ca328229e54c3454d94fcbf02358411d349d42e5bca48f1428b4a449698a994ef84c46a517c3aa6359c48e4264ef65f1f69d77ae26133e17edfc103de416fffb4f2bfe865b434544a418f6e2faca00a165d443f0663ff64080154614f7194057d8b5f1f33934cc9fc2314cf86d4fdad4892bf0d3058f7f37ebe98ef52bfb240b9ad369153afe081bbcf9d7ae43e8ba336b8ac57e8a6da0a3365e3008072473bf9d6eac13e509c1619956e12a06fc696512da091a7d40232c675e737713fcf51aea6c0316c3bdbe196132b0943df2b013860105ce676fce7b88d0a167d7ec72c588b7b6465a83c9ea1d748d15713455e5d0e901c3cf646a38a09b0002dc5ab1687f350dca35c1a87cd404c0d529292082f77844203d86be0bb8a9d970a9af7baad8d050cbd9e024788eca91fbed39db930398180e393d949ad7e173d9c65498339a6ec670d049058653ad48af45cc4cbffd30c3b54cf1b290052b1864bcafd0accdf9b8e2a163134d2c982c1bba4a3dafec288e3cfd0ae1934a6f0e39122aebbd7a586e48d495167620708664d31c740bd868c1ccd5f0e94baf959e81502cb00da87330cbf149d5a8381e9eb519a8b97acad7a48c5b0c92623b861064ff1ce8455f32469381e6198c7b8abc341357d6a4c85f7fa517c4a47df728ac09a6645b0ca77df7c70cd4aacaf19c280949919132dde7993e9181e647e964ba99cd6bd10b893c8d90187a5009a23d295d43bfb4cc0e583b8052ac21651b23813bfc9912ea0c574e152f42d3f1975309588a4705196598ad93e1ab1d82954b4a18bc56e55039b6837fd893fa2bd7c70e21a5934dc2e990379ec6e8a2445dc55d57940a14e5164273f59cd58e5f6a8281e11c09536ea22821c98ac978537d7a02220d1d6552aee168a001715834596baabf7813e1c69949b23eb4b86658fd51819eadf8a13f067ca8a791cd1d53ab69d0e43f18bd72d5d93322cc1c36fbe33121f5ff01905328fc7c33d452a86468663c77fc80b0195ec1eca05a5daee339042b4f88a1f9371b472c6c5168c00e984937a134b282633dea25dde7e397b907b1e7d3d240a593e747007990782cf944fa078a7118fbfa793b2604fa15b82453209daa64475d0e95e2408319e8b5ce7460f4593a19e3831a9b363b1c5ddbcd273995fbc61ce7502b0233b1752223352e654837181d01a929f49faad422c65b8ae416ef81290b02b48e222c2b8c3ed57cf0494b928c1e11ad2da77baacd427785096aae1cd593cc356e551bc390cd5765ea41be30cf0266ae2e97d326c417c91e90d75f1f874555b88a14a7c5959a62f23976b77a4c754e35dfb7ddd1700df85f61a62b12a9eb4644caa7f8ba036b9f29c6315ff96c3f7148284ebe3239ecad50641f397ea24b46e21655352a4109b61479b9dd34972779f2f1a6a1d2887b8ff88289b2ebda2efe995668879bb93c4ebb3a585ab336f70b382205ac37c383475fa12ebddfb95b157172261597d2cb0f24f254feffaf75d224a3b407eb54cc7c8daa5483e4a79c347252d808a5f480a35987f6f09f6c6a73bd5cfbdb76a11ed78b86442b810cb703a5dec5874e8721af62e386591bd39d990b3521505e144100601b46de3f50752911ff37bb18f377de45ec4c60fc4ed8ea1717708d2d13fc9e1453a1c4a4db9e4fbe9b74cb8da14ad50c8c8f2ec944e10ee8e82ebb6a081959b0159f043a15fa1cb59bc5e035f7623fbfaa99ea0a1d81ae8692a4019e5a5edb3a4886c789675039fde87222975e86c2642eb0bd48408072fafb1a88507194c9bdd69f3418376a4d9e68c3b83b3f800605ff1dcf0917a6014b0dd77708b583ce3ea632746fee0e01a10500cba90016b4a9072847d809bb0481ae25f74f8ef290c7a087ae16f505fd0da670826a0b1174592d184e3a7e8622a5c84a30ab64aab75face50b96b217e8ea335c0605c638ed1c59370bb9ded004be428f49a79f74ec0fb296b3758f0b6b41930c7e029b55c8fa73cba7dc926151d4043c6bc8a716d7de9ae0cd3ef3ab2d19b0c813eaf12eacfb641d492b0001b2f0f699bd98e4581fd44c0c817646bdd77a71d8ed432f8d422812751a2f9178cf1800ee689ebf046cf9b161f9a7ef0a106cbe833398bf383288661b426fad8d4f570a8293629ee06856af295a58585a81f87f130e6e08f723234856e874bd0adbb2fc9e676deab6b9f22faacf12e875d1259ccea54f7294be02a16f34c427b51a33be8a0c460c4c07d51a2e7d5c0722a9fcfefd21c265d5aa2c57ae4fe95556b5e1388ea9756a6afb0856fb8fbe1d2bb1838be7a95049848fa9545b616badb753c453f266836eda3c92cd592bc0925690c42cd6667f866717827ebe91d0999f9de5f5fd6cf77f63737b65927aebcf6cefc7ca107fda8447e8bebf1f08a280d53a4b07f8e35904cc48cc08eda3c63a3475924bde1de6acebaa65fec5ee68ca22d3fe722bf33267de628c9db1ceda3c78cb2f9988682d641d068023f96aabde4e10071cdec2080f616ac30c2725ad3efe98a69a56873615a3a3161503a4f22621986def597b66641d07793d97cdc9a68f85fd3890a38928462b2fbe2bc5c509631438d2e344d1ced9e2b71748f1b6ddf33a3e597de3af03ce43d305b9f5acefdb2b71acc645d3b55fa3848484b7fa4cf25e71e766702f1003950bd2f45b304052861f6748a8f38175f1e96c91471f5a54999cc9937191b6adc9de0d2520d86590cd4aeab292ba9ae474edb5b8caad6ee095c9e74c0f5e5c9387559f946b2dc45da7fa1d4c2dae6973d5984841682af25ff7ff29d9721d6c7e76776e8965b6c681bc38e85da15954ecbcf20d7448204d9a6a477781c1564d363e4c634c36fbd3c3b50b332f1643c415d004ec999316e75694a8b98e2591678388dc6624058454ec3a7ce608b3f222b8bad5cef77095285e1d2ad746c557222dfc30605bfadaafc4f292e931a0f0d49b226d99d708247879aed5b9f2ca2fe6fb414f37373f844e13865524f206c54487aed53781834b3f6eefb248d95ba21bb60041d501f90a97a19dcd80920df7d84309148e3d0892e50687c86a45a1372926e00f200053f5f436e003e35bdc10fa99d9328853bf82d2091f1f087cc37678138ac0027e73cbcc99f7fe37939c98114fc7380c0ad1a26e3f5ec00bc7eae77045a55c62c18117879389c662837415852e7a2d01ac667a226fedb2596e3e137a83daec2712a65e8cec3e644e738d11bdfe9b19517fa593546373fddcb9e681fc97d1763bb9092a456cc0dfe1aa0e132387d105e3ccb7746ee199aa7af00bb96047310585fed40219dab43f057220a41e90c5f89fdac4a5d6b207c01d5ad4440c5ca29eed292c6f7000c58da111eb4b16e31efa6df3f3aff69e6447ac406aa96a9ece4b5b813bf8b3a499d09cd0969073468513355d6c19346c58480feaf470e0d45a13b74f2925488fd810e0f74afb9e82a24cdf61586bfae68dc92ea09b22d8c8f1ffe9db1e7e98892b5554ce2e15fd5f1cac5347df2eafd2a8d5f1aa8746b9403915da6d418c0b5a3aa8e09d6b65f9a49c3b7a5728e9baf95471404fdf64eb05da5f704dbad60ac9ac106cab2873fb1bc9023ad95c24852337a703d9cc04d6df7de594c3b2e4fb9f2996e0418ec8698a4c087c14a2687717f97e228e75afe295caae2f16513f47a45b4124a7c5ebacbacc562951233bf89f43ff85b703ec77f168c2278fbe6e57a0e7192125f4642d73f2f227d806287081bd30149b9d44fdb90029667622f9925b7826bd0343bc537c66e660f174b447860e1bb8846c3edcb639ebd213a4695f9cb471e188db7a859fcf3abae49569e676dec857b897627cb0bc1155ad6d45282d430176fde4262da2d5f41ff890ceb319d73dda804738456f30a3d68da41554d4cede62aa8549b24e211e76768e6b17379f842a24a449a0ba3ea73cfc72624b5afd118fd7e76a7c6b5bbfa7a6b6c97b97dea52decd51cf35a8e277140ffb2748777a1e3cc3211f3c12be099d0316f45023da6cd200339a718c72a5ca172903922e59648d08dc67f173788363c26e5df406391f107552925ba91b9e569f38101f5eef9a52d201288372abf6532beb4af19fa6d81eaf473d40896dbf4deac0f35c63bd1e129147c76e7aa8d0ef921631f55a7436411079f1bcc7b98714ac2c13b5e7326e60d918db1f05ffb19da767a95bb141a84c4b73664ccebf844f3601f7c853f009b21becba11af3106f1de5827b14e9fac84b2cbf16d18c045622acb260024768e8acc4c0ae2c0bd5f60a98023828cdec18ed8dc298a306c38d1ece01509f3265b5f8cbf441f0525097e8b48234bf69f65cf402c7540a023ed231ef95b222a900ea4bfaeec02c6d8b3b01648ad7a165237ca6b557b1ce287b0ea137f4ef54534070ee793695a9078ec89bcea389956878614ccbf917b61f8427b7cda870fdd92d2d297154262fc65f28ff1a54b2651afff12d6f36ee8c906107bbda399ce5e2cf0a430ad0dd86520841757126bad725bf1593c7959f16221894f5852ddad3172fef866b3321755491fd44fba009b42ec0b6c4fb9e901d7eb3b8acf70e94911f54c538bd0559c5740042b6df4a07c3e00bba0934d92a684b39592a576331e5a44672a227ccef3e595ffa1146ac1dcee0a70baa9acfd5c132b361b5ceb519984b0ee00cd2124aa8acb50c9e574fb19bd99c8fef5407faeedb28b796848bb372beb3f5bde55ed2cb140b60a53bba2df471f330208b09ffb8eda04315a06d693aa53d9bff8939ef6f3a68de6e1975f79f50b3d484665e4ee71124ed794be3a2baa7b5b918e62a095bc5d46e401a0979641fe465640e8d4d43eeba9d0cac76c7b86d22375123b988585e58f86566fd190d868eca08aa1e66932d6d3b14ecad3efd9f8cfcf2696ed42eadfa642324d941602cbaebb8639a00a17542afda32117051e4fbf243dfd255a559c49ac37c265827ba70b0bc618882336f43e1a6a729c57be478008cae6c74840bbe828c976ac628d7b6015bcb705612 +0xc1644263ab1ff816fb1774369156e8e7001e1a164abc73f1bb4caede515eb2cf5708b21612f1ac475e00483f0552869603a7120c0d3e5a4d15380bb6d9aa9e82 +31912 +0x349b0171e52c9de8e064c642953b9cee4936a32ec7461a1a52ed88e9dfa2976c817725db25f999d47f5773a144c728ba9a262c8acdde5076430d4e1cb2e4a2d8904d9c8dcbd0b4a2bbb71d4a55709d09a1349b746ee67a38443e255d9a26ebcc49648e0f417a96597acaebc62efea3e346a7197112243f663cc63535ff321a4f940622eaedbfe801a6da069c3939e45171c9cd0b2162480a15eea52b49ced66a597980a5396652a3262d9654dce9055a0ae0e0c903663c2bb6fe9ec8e0c3c7248006d1c88c397b45e20bc27781d5b107f935793320f8c4d2073e47922cd89685f1f53ddc4dfe0cf2c2beb28c8fc68e5f2610c1d2e0e28806f0f5c91396d7eb95958eeb68e67eacafae8d8f1b6e84446a79b8e02daceb2fcf596d4bd384866d5d521904f4be8104868ebf81ac85d77c30db77fdcdeada62352aecf6595fafc5e411ddaf083dcfbc7e4a9dafc83e87deba329340380478c8414bbbf12d90189b32bb23152dcb2f7b9fca6f42f6005b110f6855d2f8608d0afaa42265d77d8a965036335dead06ae9f2f77d61bf341cbe376305db9568e1cf691e687adf90cc5e456c55b0c8b448af7eb70e35aa40928c3b0deb8295823bc0949fd757ce30a89c1943d1364edf91754cf36be63f8d8524224c4ff0821864848510b5252cc4e4f8d5a5ee1604ba0de26294dd9b0683bd2df40a784de39125c4445a4b0b7fb649198079f57972ab849fca80aa7c888a0150b92eafc041554428d763e132516d9fa822a72e86211bbd548ca11ab24c0b1b357aa03c7123cc89574815bfc22951ae4cc416e166987381a8aedd7765da6cd1833f486789115ebefa9f572ce290ca3dae6cb056405f1998433a1e07bcbb17ece20e0e78309373a9b8e21072ba0d401675255cd53dff77cace374b14e0767234fcf1dab68d3273143a1b2ad773281bff4af402a585fff3dff1ae4ce4f993e77076ef946ac975c6c528518ca43569c3c1d5e38b0f3fe7f79e53a609bf2e9bdd6afb1024dc0be5d484298d1e202759a124bdf9dd5b9440ead09d2769efa715bce8315d72547c08051be5d6c895727f1befab3ee1d1ab90343d763a57bb8d89ebb3c0dd661a4469c250053472493d639aec46bb7fb8ad623dad87e5b86a087fd4935199e9758a8d71ed31af0485b18e87e13777a05ac13b6ce8783275453f80de4f8c97e1af76fe7cb810506691f6874897257a2afd10a52bb5f02976945b1371b118e1380e3243497a4b1e81b533d647d6b9cd07eac127e2de97d1a39f83c1f57f9e7fd4dbe3e442fa89213b399104ea659b771d69fd4af7291632e4ade011d282c5779f5db469cd0273627d6437989b0e728056c1ec94d35f155422079a8b718236d37fdecb5b5458b1e830804d1ac197e6f1983cb58fde483b4043f6d8b73847989b5ea450423ec5eabc3ad3fd13c3c9a1d1cd2081c380ab31fd31c0c21e909894d523f86ca4f311c6e485a66d0a0b6c4828dcb677b722519f93d2ad8147e23ed28bb622460bdb04ef6af740c587004886ffad46c0f32a032b0b10073dba9402f9c4ff6a08fe5e660a557aeb2e120a24005d281883ff0287806cd2141d0010aab189e518d706e4fec2aef5edd03491ca614a3573e96410a544beff1e4aa0bcfea4e15373deaad595bc7c4f8fd274fd004fcebca11aa9be272009816bec2202c878d42ec4427299f3a3c772195c5bb78f72f2a5e83d5673d3bb563f432a0f49ced56a5f532ee698e01d9845d39870253f74bdd8917af39673beac21f02ceef8d964acce68c88f3a24d2f6b004ac3bb0d7fa383de3fa0991cdd0140fb91b4779b1cca1634b38f4e8866ce99bf6c044c021af69bd28e51fcbaa9a95f1e51fa3331eb6510743a79d08d09079eeeffd14bee3385a3ea663beacd1c337afbd5f888ee8cac5a09a3d1304c8e8af91388a3210e64013a9a79a6d9c0cf40232890481f2d6af04179621dd42371c926d19902620f26d9ae771b5b40321d5ff60913513c7b20e1655807c832ce4d42a68d9377955cf67f9df4cda1b49d90d35221c1bc875428e0441a0758e2899b7806bc2a6b21644d7387882322bd6fc45ad6173dd27644fd8d5c23d3585a01c6d9b5f1a0659cd1a655d9c5ae46b1352246d03dfa5b8fda09391c2a0e3f0fb369f842a2a7ef6e119b872321b186466a2537ff1a69804a6ff68412812a858a1aff541b63a3712ba09797e210ef89c38b679ea1410e092c832ffecdcd9ac43fa4f16dce9925934c0b24f8a537ba99df2543fb75367a5eacc02ff9ac53d163c6edeab5cad790be55bdce39dafaa56effa454ded95f10e9518371153cd880ec865235bcae93975acf34eddbf1de22518ba514a94c4f8441a1699dc20db00be7147e7cf2d8518c011f0d1e4f8856c3ea2983fdfb5c7c26f012def0908d8ef4cbe7cf2ae8d685f149cba2da051cf90ca15fed9b3578697b5d3c4033f14aa9be0376c0ca1f37c5598d6b92abad1e496f1f753e56f82e9c14117459b274b3a4da3657ffd5065a8447546558fda81aac6dad2ff2cba3ed8873955178068b5704cbccf1e8c62eed472d275f726a7670a68ae2d6a763d943b30c616a27aab5a34e254feaf838093e828d8e905b5ca8decc39491fc8b9f8bfa050fe04e5198436f5593789ca8515ecdaeaf2ce905eafb3920b5851d32892cfd4e3d3e83ccd67707eea0c74bc47e56694c7ec609deb0b8d7c739913535a37e2c5377b5a9b40efee6f5a472269eae83a54a6d3dcf08c4ccb000473dac5a9489705be6cf28d1e7e1f2b2c60293008aee6aefa61ba24acd3fab130712ea6a0555afafb11368eb0a27156c2ffefcb0b99e9e854ee7e96d7419af47a297572c9debd3980209d2ca1ed8366d06eec877e49b2a52902a0e3a6063a6e640555b6a0552c25cfe3acc35ccfd3dfb745b5f1db3eef79f926b78763925773608d25feae4926643cf2dbff6bc9c115fa1cc296acd9eecb37c328feca9650a802398c975e3b4a5979d6a14d395c09ce1b4c98e26dbb3f0d87708bb63562d470bb92f03d3aabe699e8f7a3195006ec5c8d6daf6188436ed54ab7364a2e8841621f11d73cce0bb99a2cee48004a4b0745e2e88c909712eca703ffdf27208735f08f3ec83282db01de9813067e72a8d91e9e55a6fc14aa36f745b2ecd9b5e000a09e8239aae3ba7ddbbd1e75007390e05b222d95008b69ec4a8298d5de59136ff6cf84b1f27afa7c062e690a22d7a39b6010e8bd4a65d25b053cea20b184a1a26794aeb7c5c34b9b025e7b3c51f94188d1ed1fa6462e8431ebf75f53dfb30b66778078b181270e4954bfdd921a630b3725092ae6605fffdf332440f5c57ec11abb056b45b140b30551d4f891e89f6104ee0792e4457495d18f56377d1f42533d86a60ecad29aea5d9e3064b24928d390716af0264206f6a7550fbb5039a8425d8ee4cbe7618014c09e549a79b879e36873a5cb23028182cf28a34525911b0ee918443af1eaaab2ccd6a4126eb31d00db494a7c60e37edac78ed35d53d205296ed746d490da7554d0ebc154f7c58ccc8786cb9c7681496f1edbf27c616911226d305f113acd7a6b8b221eeaab6c43a6fba09ba3da588ba033b4931ae4b2a97a52a80f89561014774a3e2f4c0023cc00862b4d1ae2d5b01eb48d37c1346b48a1bdc2da95895efdf89c7464e18c689099d57b526a4685515b0fea530806ef69290d0542de3b16717000897253b6b73bb358354e2a6be3d9b5a4306747a2bba580dee3dabbe1b3297e04d1ba0af5ac27fd9cdd92d3d97dd3ef20140708be5c684991e304c723d1806317d1ce8fefa3efc901d8b2eef5bfba47f1f994d3a04e3bd3d487438867ee00cfc82e024afb2afdb625bb30e4772607509855a330ff0d9ab00545296824554524843b07d4becdcc3576f99f4ca44d45a991bca49931270f7ea2a128eeffc3a801da8d31b590f8e5d7842850902391ffa35c933b84dd0704903b3fc4a540a5b3e8399932561838d51ccbabf7576ba08ffe877dba7c693a04854d557ef39d77f3283fe36c4ecafa1465bc08e5fae2d580eb70d0b3f84c4c99de4796da826cb6d0724bf051f81fd92e42e3d3cef33fcd7d2ac730ba811c9b3f0bb88849ba44eef636fc5485fa8d427d44c170f4f8c8d4df0ce912309f50c26e8e2e8e5f03ac8cbef6af647abe99c29bebd3850a4414a8213254f9b8ab6f3ea2d6083d8d071a1ca521f3b492ccdbe61498a864619db9a3ee1ba96ba55dee8c6683d3fa463d041b434967d9809dba0941ebaeb3bd3e1e44802944cca8ff5528441820693d0df10513fd6a27a6b9cab8de5554e75fddb92691fbb5b11638199ea5f36bfeb4026776919e793387a9647134564963dbd510b69e038a9d8f70c24c16b6152f5da2edcc36ad139195d53ddede6eeaddb3bccb710ec122066731d5dd00c0ba6f9c77ea828db9c7b673d5bd3e471fb7a97a1d4fe25ec51a705003dabe1eb3da53f2e9e446013514068413493c08e94e5b914ef487287fe25fbc6f276baafff360e38171633bbf8726692688349e4bfd688bea7fdbd66208491ecc72724015741b00c7088697b97f8a7577f0d461c86354dc78385cf30bfab0f9a4124e7894faf6bd43101c9fa38ba74b9ff9881ddf1ea51570b48708ee382bdfaead6cbeeee6688b5e3e91ce1e2a014e0728bc0d007ded994c8af672895f1e23149a598d93c4f4ed90da72ad79e92d1f35f50cc9dd0f730a941207ea5dce0c86ae6fa15f14252076837a5bb857378f11b4f4e6deb541e9dbcfe047baec137b5cb4a3b0bdf0758f989e94a9793693abd7fc9ed6a629c3c67f688c427ea4bdef27cfcd2434a93476e65acfe85a888c07d4855958dabaf37d77e66c64a0282bdc7a6842582dbef09ac2407294f6cd9f2799d7bae9c6e95f9357d2074ac9d6ebd7b716b9e933a2284fbed8333bb8963b9f8a7c4a060525768c91a3f35146418c4580438a33d0e34a2a5e8a68592a42efb448db7d4a100fc6eda7e4a704cfe87bba488739e47ff2e49f13ffb859b6843a2a378ddb027208cf2b1d0c98f1a15c38ba824a5f67ab717632617079ca07aa9945e90bc9db95910db973945f9474ed51aac0155139edbf7d78d9b5432678568bbbcfcde0421538e13d2e145169b53c452f8460b5d7b16d78d6ef069b0ba2f89fd07e5cb4b25b71181aaef514eddcc981ad31c4f3cd80dbe6d1141ce7c5f201344857209dc8e2d9e0d698bf109d7605a5987abaa187e6bb45fbdb40c001e010e7780cc221d235c3f9f55dfaeaf4fb811f95a1aa35936d6c14bbb71aaa3c17a837e3e1a9e78aeedfb1fb8100fa80e7cc5e19592c367c6f6ee1954a130cc0e32794108850354f587db75d8499d5cdc537ef97f3a90aaf67542b1cd6c26e5cfd2f8a72535db18c2d3e58afeb0de3480e54529623b948b90f8c6fb71f91555ca01089adf51ad2edb792344716d5c96c4db215984bc57705a2a80e087718584c868b2027c0202fd08209d8c7ba99feb6edd1b712fe660c21eb07a4656fbfcda90affdc5456f61ed13705a4b628c2d9c47923a59a9e137eaa235bc1727c004bfec7df2cc82c15266c21362676f3d900f17a386fa3ad4644eaf5f4c3942e8249ba27a97ff7b1f5dd0dfaebdcaeae550ae +0x27aa551dfa2fb1c0f4504f9bdfa68e50b4693d9327612a3fe8984c00d05d9cf6d3a0a8d0223ee5957504ea56a228e98acc6954fe35c7a577ba6be19abddc5dd0 +32704 +0xc8e2e36403ad4ff9f60010cb877a57139ac1463a8522059cc377128dec4ed899e447841053be14c356aab00875c53e04d4ee3129adcba1fdfdb2a11d7ecacd82d66d22040ed1131c45e8d8eea6840a8797bf6d63339a0d32fbe48cdbc85ebac2051c66471a2e748f2b80308603ffe2244bfda3f000d76ec324d57acfb351c7dfd81cf7e0611d60a1713b5fd7747eef6458707ad9fbcaef39df4c140025ed1e63b9347fdacae6ffdc7de10ee9e24858ce27e09b250bbab51b961302760778e4d60f2ea33a3cd078c7b83ae4c533a646eb1e15addc1af1ebf1b0f0eb39423b44be41d00d0aa124f4ea8a0d8a7251e0e141a6d659070fb5b74495ac7752bc7e64a5b9e36552e02b9ace5c24a7f8223e505a28ed47acd14f419aac0f4fc85f896c12de2e5218e12a93fa9445e4609007bcbe0a201ed64a07b27e5fe01ba312a3858e187b7d668c6c06f69c39e9b182854cf3b638868a6124327515e982ebbc15d7a0cf908e43c9381c4bdac85df3dffe298392fd29d2fef0e80937f02da9472889d06b362cb880d5fc80b8b9e92f91bb7af60836acb509b1fdc12bbec4e59a21c3a65435ffcb998cd01d9cd6346c7f0468d27eadba3c6bb099255a1beea59d4bafabf355b086fca5bdabf0e5e7b291211ba15e28f96d0a35e2be2cce53f338ed7266ae5ee7f19168edb11bafa909af59baea0f701152cf8703130aa19cd6534e375fee174b13411c88b785fc237ac1f56e36f94dabf3a2f022ad5a5a7157d6b7241f1c4985f4f20bb5459694fc0caf3d5e0c84866f566cb6681285c2797ca970612d9ebc3d9c8d7b9de4b63eddc86179b3f418e504851322fcccf4a15d4fb5c11711de381a14fbb5681b4dc46eb4c0f194761d301388817c06630ebfc5d8e0f26e544285c46322013d73c3ec56dbb2ed2a1bfb3043659c0cb05d3ae3571e134a8d7d346ae491eca64473807f3e4220b49c6a1aad3d264e192044e2d7be2937129d141bb122a740eea7a3ec44cdf3f38f13ece36fa8d37eed7e9f6d61a0013293c5a25f2025ac051f8b8b7005acf511c6b727bc3d2d7214cef3f7434aa6afee122eae678096a825821ab47288825064a1afa50ee0740df705a7d3cc59773a51daffc09d981ca3875f7ca55c96f80cd36724ee422124ab11dac1bb6f58bcaa45326160683260a613fed9e694f7b63245623d88bec6e55549946937970d1c07b1617c17301409b8b1a65800847363caa4d823fdec976112877dc9d0a942405a7cb0776c5e07c0e249a1217a92d2a7dad712fdd5335e3deab3db060d0ebdcfab90677be858d32d2bc3355ddc28db2c6cc658f496fae124e5b6f74b772e477200d4ceaf118740f79b07ab34afad57978759f230caabe9bc0c7619be9471a7d163302c3c725316c73afe4bcd79890f93347827d8f8ad3ead66dc8987ef40a793db8ccb4990251c44118e5c51c523c8c67a0b4015a968a8a0fbd08ecf0d010d6070d0f1fff5631b1727a028e718e54dd861fa850e6444ef3dd43b71be781ea2e22be5e7862877dce7841df5b8fc366572f12d3eecb1a9da2bf8037b7bb7fd2ebe13b1f505b1c7245d31eb0cecf87ed73c338cb3d618ff33136f12f12f5208799f311d62a419bdbe2135f4b5aa95266cdd2e002cf522aec09c424e1e01d1a54a2b8b11788de6bf71da981e371a5994ecfeea6ff070561e4a6f78a1491abd3e6a0a2c767de5a33704306353dc65ce311f4670c348703db7983319f2b9a19e3aa2e51932bad7d58c40cd9d7aeab37c65cc5ec7e27c1d5de274912e28b7bffa01b8645b2f77880626ed564e7baa2bea99bdedf7b6d49e4105a431be2d8b9c5bfb742efb53fc23bd6dd3767e3e64f6a033b89c0925971c6e8af1bad1e87d5f4890a0ec018890ce83c9b9d336aa603b269d861304190fbe6ed723d56f41d5314a28024573b57cb1dfa268157da9e523053deff9f07982adc7560229a120da39e82b64e25bc209f65960a9e55c233cd6c47dbaf6d62d3910046d555f6e6dd5a0aa018c6ac0967cc2796b42ebdafeae7bebc4b1b4bd1c7c10aa86e61edf100e8d18124286ab1b2040c82bfbceff23813b02799ad8ad3093d543087b0ffbf2cd29bbc650de23383c95cd099e36d37afd3d92063e0dae50c586575bddd9caf95a9b1a867d1930d517ec106bf1cd5feb6caa22d265f9c9645b4c6ce7d425540efc0cbdb890e0dadbfa6b1ababe38aa5f14a93b45d64405559d4e0c13289ba21afda42dc652da2a302d3a725fcb22bcbc3f6364c75b976b09d3b5be49a0e2bb03a38af1168bb027bdf882a0c0e0319eec33ff25c0ba9a016945a80bf105a3a7b337e791120209da6aa36b2d47c70d57d538a60698bcf4d15d3b5079711f856f1000e29620818e4920751ca05b475fef61988090b7294de3cefcd49232b6311a0448a487aacee77ec5b7be816327cf6f7799b44a86c94f3da2d15dde9c924eb0765555ec17b2bb8142b27859c93004defe856bbd6b64a0e9c30213e4187a853a4d711b4ecff5b25880ab73aff42aa744e0a2cc6fcfc1e8ef17d71d2c0c387ebe73e221333a5f750d66edd60b4cdd5faa043900ea1ba9d0558897a43ee192e047cff08d26c0b8aca8dbbfcaf53910d51752912eb6b5e4ff25fd8ccfa3005154da49e588acc9c7ff2fc96877f6238db193b2f47f59073a1f675dfcc7e2cf3d8181c907394fbd5514ac17310495721a9a260ca81b5d7773d5219230b383b81d104337a0c996042a9626ad629a5b8e8038d948f6294a6f56cb5d8370bc0e22baa8297bf65f09060e2ba6734360cfe08634b34e26d1a656aca92218040a0c75ddf2397e5124312bc97b33511b7f79cef636bc06803dfb943d16793933c405184c957d26fb4095dc222fd52f341ee1c197e5fd594c92d091d1bb68ce46137f75d03afd5c3bdabe7fe3ef94f5d466902230ea7d2dd1fbaeb43040fabf851e04f33089c009581a327ed262798b447f0d578aec456c589e1c67214c34f4380e1bfa3629ce139b297b3fb8318bd9cc90e0ca6d945bfc29a3a2126e872056a70a4df2a8c32f644c2f212c5c04d3c7b3c192e1a08ac9c78c33c81bdd9bc5cb1a3b20434ffeece2b353aaab8881573e433caa06ed7597b3c97617eb372d2b3cd8c81e56f3830b7717bea02602532124c226b0a01afecbaa279316ea43e85b922adacf915cf9970ac2988a049320396379aa2c17f0cc6f93efb24e80cb715cb35899ba5d51099582fa08f1ad0391a5e1b0eda7d237888a556afd451695733689aa2c67239b5b0fc908365c891a4d6f88af1aa93bb7d925dadd9a85126b94f2fb67bc5e4902960cc6344b5300a0fd9f3ebd57b8b93768470993b196de137c97f0d97028394e639561c56f5e7a5c483bed23cc5eb481dcf8cad36bfee055d42d5246714c594769b18205c9065f17d74d7c2aa322945bde4005e4ef4782fb44bd08f7e65213b55168113a82d2179951dcd317018cc28e1628a20f66f82bcb734dfa34f8c3ce5fc2c2f6adc14b0aaa5ff1da351025a4e22bb78a9cf89a428f0ae81045cf25f10e65c819a6aff7a012a99379cbf874a31ec6f6a3d3ccb4310db09332719203e68ae281636c74604298d6ca9820e102280c8eebd6fb0bce5f0e0e5848016ae2149be0f6ba49370e56068e9e1f7df25599722ca00c5edc713459cc3e3a3d7e4ce309072d0883208846227b18f62a53f75f19471d2b42682318b8914df06df7c8bb9b00303363595678b5433f056f2d70e3c988681cf0d76f73f1058e52d9fcdf041a73072431070056868e1c3594a8468c49968bc8b050daadcdd10849c9b617264f07b8c435550e465f05b56ce0eb03c1631b8e16cafbee2e149dc4bb844cfb89ff654dfab76909b2064f14939c1f2eecddbc77ed8501325f8e10c89253e71096f535cdadfe6b790144154193116b5074802350372a8a2ea602d31eb47eafe0b3f81e41c75384e49be1ff425284f8f0c114f821db01bd6b6c3a8ece0b4dcbf249cfc8b02ffedbd4e8a5b421ba40ed963b61e2f0c152c3701afce8de7d0764cec143dc22cd479ad05058dde6b28c73cb4a2e8ac7d165c4c516118958f4f6a1fd811c02a08975e6613bc1219721afb215564598adf381e7f3ca411a435760ab06f322e1304bd2ea0d11a9293ef1f2d1ffc76cb3ab0ff054819c5343a88e8ea9717e1c22ddfba4cb5f3ad89de2099df90e056c83c70df834f7f611ab8e80c8c4c789d46cac8134b4dc1e16248c51f851cc780db10bd5e2afde3f41fbfd1756248e7e1068a7c5cacb0e252b6643b14a02c08816e57f4ff6ecbddfacdafe3a7ff051c499bed5b0ae387cb8de0c0f11dd33729e51c62a647b141c3e1af197d18c5195c337153e282724ae3df8bef859f70d6b2084fd14fabb4e83c453e8d2c5c56ee4e3b115eb167eb72d1e42230771e1b83278783245fafcc37bd91e66b7fc7270c58cd167e363fc1880c181e44341e35b4f0cf50cc64d879a8be544134d5fdb7ec1265db32ef5e6702f9080a8b5b2441e4b46c3339ed9a4fc3c508e989cd648c15f191ea0d5b687e6c3f1061863aa4e2aad8da950d5889a111582c19dac4a006027cddcd7df8d26a3c34edadc571247a7fd48700b7441b3009ee3a8c986a14c84a1ab5f0054610aceb70ec59b99d378bdc4e1e00b81eb35f25fdc0ac531c5745556196ec23d1c7c9027998ffd2fd3299288bfc1f90770690ee1d3ae38b59cc0facd80d3c5a1a5c4119c5700ac23fca251d44adb7c0bb7977dab315dcb1b10779c8e4954b288e42a789eb0df4d7d352a202deaf63d97a80766455fdf266a08e36222daba31fac1f6eeb30cf68b43650a271d07d9e3b22b00f238c3fcf0aa6b4a75109dcce900246f9a65d30b0b7f768b902b094d176528cc490bc77cd2e323f5fce0f85483a1f5dea53b6de778384ff380e0581a81b787b19246d226731e172c201b5518a6e61c8b36bd42527877d88a21c25c08c8b030f8f6724bc37c632f3709481be2fbd581be7674ba14b343f99a9b5b7ede95580ce89c169c1b94b8535ddeefb2782a790dbf8ce73ef4d3a49a69163324668fb801cbacba2cf664276be7c89882a2dad7a6d5a19f34bb7da2a340b9d0b8665fd7f8e750e6631c93b75f1deeccf32ab3f9354add2206315b46fc67acbca0a7acbdda86ae23a955ca70174779126dd75fe6a36467fa1a1e15978e26187f46f11f738deeeef86668b15b7cad90f3587083a6d66c68aeda4a539d3fc5259f100c6000fb6739ee021eef7f74975cf61cbeca42b8a907c7ad7dbc61f88bfaa668bf166c0a3bb78ce53f2de5e84c04a32189d9c130656dccfa7ef8eaa2c2c01cb5d3e9c0a4b08f5a78931293c115b182cf985b2b25e6c1452b16b04123b09e875e118303b010eae021e14793e53a8b1c8fb5f68881762cbba70d8c6c659dbd71cd3e893d16a1efa749f373ed3e03b9f8c7a652e12b5bd6b5d62b33754ed344616925a676beacc736598f3fa7b3b7649ee134183d0bdde6bb20374e63c8995ce09a8d80b790789915b77e53cb2ba0b3974327f0a509468555edfb843fba362d75c83dbf07744f8ecdcd8756609004cf6a574781200ddcda0ca53d7e100bf3dea85bfe0c6f5277cee50274f16fc92cdf9f835c74b6ffe90e67b0c6e3dea5189801bb980ff6123980e5bd0ccbffbe600cbf312d706fc7b348ef765e5cb26fed820951d36fa49cddcc5568168d1857e87e51c8831e544d83b12a60cc919351b9c5478377d481d8abdbbe6a5bdec27c0b5cddb026266c7aa071a2 +0xe8e09fc57bd3b8e18b2726418836852cf1544eb2cf28c18f5b98436382d0b621953d2faa60d155dd28c2cb76c00ee93d3de56289b399c22a4fd82f00dd35ef27 +33496 +0x9c06316ac709e94470a68650e1d6aeee089aefbf133df90a3eda0a5ee91fa979ee509769318f03f1795afd2e7e552d7a434ac591a56eb4f334e61d894389078a3be856a0358bfa47c77e66761d0d43824ccb663fe4d90068c46415413370307a2cd45457f886350e0319a871e88459ccce25bc11f7064632965edccfe15b8c11681e7bd6a5081e0ed434ad640544d5226f61ae4e077dec1951db597b76d2831798ceb16462971c0ee3d65c9a9cd5214ad78623403bc75ce59ee4748c1a5d7d5363eae04a57bd97d8d7079d5ad6bda30caf9c052dbc6bfc5e2480154cf485e28e727cefd1ae01f73259cf58ebda86c5329fac3b5eb1f1364c8cb724012dd11a906c8bc63e8ceba5e511377596d1b7ee824ebcad1b43e271767d9189f4ecca8d21fa204ddc1b0407b9a646dda3e3d985c665d743ac9ac414a5a0172c6d5af6a309c4426cf283d38675c105765a3773f4c48b02e558dd2289a19d50f6b39fdfc50f71f90bc7ece18be3097a2902f60da24569477b68358137321b45cd10e20d59fda94d12a47db47cc927afdfe54730f710a7aded24c96b8620c2fc9bca4b07c999164769d15ed6c2f0c2ac7e4953625befec3c23d4c267de323b7f462a04557bac5eeef896b8cfc6208377ef77422e36a8e0fd05c047fea7312ed6b778327fd9fd294ba83bb325ef20111a1bb73b19f0042cf77c3081b649e64207d7fc000d495620645f077662a4ba169de95166adf1cb78336e6b971a2c16201c8dfe9488357dea4306432a0d4fb43706408cec71a2c56bb7c5bab2afb98c701cc0c51678043b30f08638f6af57d71e5f0ab1f5ed69b9ae8d6765faff560fd9105a9aaf631e589a71c52b03cf24eb73b02e08a8aaaf71e9bd3eb496916c6603ff42c586d3eb9ccfd0ad6778f51eb8ddff94d92e2fddb3c34d30eeafed645a97f1608ec54fd3cf781525337eaaad050556246caf045948e447275d6c9ca4b33def9c3c91603eb83c4614d63d74399c93bcc60852b28df8f5b20a47f62596399cffde19158c9420c46d6499dcde2a432e3a62f73fc0df8a9e97c1f57410a1b35d2c0e6b765e3dcfb891fcc4846de8c37ed6e07f9fb6b9c886fd33af0fe62ceb277b147bdf5ba18dbfbbc49f5cabdbe42c9a28e99a1d827856ec4abdef2da1a7a3f6d891760d282281f2a4718d1f6b6de08e227d577ca263b56ded663b7067b079a443f563fb3b55a73e84843e51012841b9b782ff5b81514c8604f31c34e6ce508d3beecfad40efd9a74c1e98ca03dbf823cd42b942870ac34178acb90386c8d0baa9c5e2aca1b9be36e488c311db4fadd44d03aeba1c55c1a62fd93b64af68a23276c3c37fc478fff2340ae6aeef4c07d5200e054aa8fbeebc12c2c9e0c9746efd882d9bae13f743e425eb292aa99aae2d2cabe77b93c5f38b09af8cfe3cb5db24c94e91c2f4fd33129d75b50c70004be45b217cd44578781bfde7ab4670f392ae206dce42d151778685eeb2dcab47860394baebdd26df2475d4b34f40cef63ba374d179b611bcb648c69f4823c4370690bebc5d1e9fc1a0a0785ba075bc857d0cafc3bba61c06985e46d09d6722987496c370f92016e593a4cf27c56ca36a00f0b88bbc9b5af7c7d2efc9dc332d32771a8a1ee86af414a68ac35ee7adec6b6d577771a31d3356e8aca8d12b0c4dcdb826fb0e5184a21681593b4a2dc1fd516c49d4bd99b20feda6f25831b27cea30dec1fe875df786b3cb191e31c02f40e3a4cfb7b6c5e45682a6aee9329b0a6c2492f47bd3344a0ab32dd2565cc77f1bebbef008a5503a70de93e7421a0b3f3b717cc65a38fd0595dd4e8dca136b3af82f61b5afd2613cc5c913a64b312ca1bfdf433f83ffe1b18efad752629ed4e73e79362494852173bd0bcef2ecc126ba61359067df6f07d55fd26f270644290e558fe548a006b766c16b6ed30d102112873d0a4754d297f96f2dbf169e4e9337a5391526b99c4c9e37b298519667442f9bbd5ae6cb6ebba526d36e26120439eb96416ec8c89108a189a8f6756f0eb79b037e274c2d8d9962ec8c255f4aae44b1906e9a35b62b12f91d153046814da3de29481a82607559b7291f8cca2f94db12fb873e7569b3932d5dc1eeccb26c307e73e3db8f4e6e242d45554a6ea7fe27953f550591cb70b2c6b074d710ebb285054b16117bddc2224ba8f608549b334fc2c4a09490c3ac984b7df593191569cbfb18aa644ff7b77a99bbca6d82f47c7c21f22f967a38ad6c442e0dcbf016d729e641687e128397559fe49822029821d63b32ccb15714bd573a2a84279bd844c850301504cc69a8dae68c2acedc716a8497ea3d8d303e2281b4d9224e2441facfc04c7ca185913332f51c461a16669eafbd844bd30c9e24113aa3aee9923b4067bffd64fb46e37f8454fab5aeba5e077e3666be2bf41c0d3054f0f29feead5db8d4ab94ba1647d6f98c903e31cf43eb1a89fa5e3cefa023058b28b4193f7e9ae987bed587fea57eb92445ab4c5efc93aa3ea6f3af0512b0b966b3bdfe8d983f23609eef0a05e5c0eba480c3a66e714757ded4442b3e5afa736ef9d5f7e1e2948de8b4aaea33efe4b794ab4de8078a4f49f0eb1a59a3604a5c2963c3ac4244e050a666cecf90ab32467d2d12b9312ff2a7fc533de13b0de79c215751c4b8a66d93221d22632501f2c0e76edac2f54879998a73756a0f471b5ade3e45e84bf0817fe5426f4bf9da6b4d58d66caa5abd2c4923b58a9c25f72cbee68168bf040a653c763b7d32141ce6135acd921a697653dc4e804321870663f1c38682f2eadd61f15d7214be7fb1ab3d74bb12ba295b367d943d699e3d5a081bfdb75b28054fbcc6234dfc97417f02f12f08b531a2551d527c52c4be4ddd63631a7bba0a5e49c0e44f36fc6662703357111c4328dc4a4f838e281c26c175bbf2a439693ffcb4b3736994ded3eb6b8599a45f8446e024153952273981a00c5af0235b2e70e876de9afacf6885e35742dc703a4034b5c9b79c51b7e375f38986841d48d24528798982894f6325521eb04bfc133e9963237dd31241e1aac1d488d61c681d65c6a3fc539e7b965a41a7170bd053471ef318ae071d2bfcca12d5a80fa723d679c9de7e34c1bdcbcdb6dac1477463236b6c92945ffbdffc7aef742d5747e1c7283a11584d7b7cc826bc9ff52571a99a27d678750433c3a9645e9961d5820ab61b2024d3c75321560c58defacd4d8f73fa39b29a1d4d41ca306a2c8ab2e3066cfa83fe35cad2123d27947f1968937c788e9e274bd3d2c029861815f115ef3db16c6c89c67d7eb84520776a9a1ec8d86f880cc1d04e49a88c0c723cde2730184c19e1acd009e27b369f0988c516760a21938c6770b53a60bc6d7f8998102dfd07aaed4f999683c4d74b53bfe179247c5655250174302d52814f47e569f76e55a8c7955a6a4bebf9f1cd5cf8386e5b95d676df7824e9abe5a25bd33697047c89f817e3b68b50a1844ccc2d1c101ea2bd689fc2b2c8053b81e9382a666b61deffbf43de4944ce2dcbb0f1cc11b2b1815cd678d798a8af668e1c8e545b2d331c21c5f28efcdded1838e5e443c1664e80dae6a825120c0db37404075aff25a5bf56d1cdfcb89dd4e831b24c9a12741d28a061d8b4093b47aa9c694943389bdc4e05ad7c2f63ceac2820e1d2d7ee234700140eaf8d637e86d36c13fc17f0d60351981fa62fe6b69c5d6c381d043cbcf4919fb7d6b70a1df2b74dc9c9df0e1f405076f0f3052a9dcd117d80d628e4874b61aa22f43ae460b2dda85558a27abebbd407e80db816cd66cbbb80a44ccdcc75fa9b18b21fdb8eefcde37d50681cfb9e64b3ce9950918d90148e023077e1d39ae4db61b86dd6f1d010680a5939dc1d0e89e26c42d6852473735ecc21b107e3e0a5d3c5ad2cbccf7e2d9dc31d1ea26e35cafc88ad51d9db367093a82002274672c7ea0c3965777120acec72411e56343baf69eb85c975fa0293955cd5732a4276d287fd051fee1fdf16bcdd7042e0b848c0915d704741c9fe65ccb0e70bf620154c1462b9620921e3f274cd509128428286dda516d1258f536da16effd3742876bff801fd36b0be53c87e0a8913161a1488b38d2172099628337a5cc4d18ca1c2b29ba277a4cb3f5721415cc4d09387244e7cdb362fd524a640c044df0f27d520ae650fd2b342ec1983258ba9d185d2db61a158ff127182f41bdcecf7952b0ab93abe0fb46cfd0dbe79925edf1dd644604888cc2422c5f83c4c341cb5698289b4de0e69c6d5e5ea7188f09f0fbc6c23dc8b9bff4d67b9cda35c329ec195129a3a22bde6aff9e0cb583aa714e0b731b776b341b821ea364b53d23d39c221c584738f334e17ddd7f79b161f86fb150b4a5747e1c148b222b87436bcb46013819186acd869a88bb3b763a4c1bc07dee422a6cfe5e06bc7675d2d1119d8447530079c0115fe080a5a53d86df380ad1aa3888cd4b4de3232eb82a7eabb6d164eb92fdc1750d7df62b61321f81e9895d230c431ddb68244fa986f0a490a3b7da704516f75f2bad69cae3e67cdabcd660e731ebc7253964a27546b7db66e092287f9b57ca4647094be291ed17500e7c8d454de551bf3e0ebc209bf28ba4fa0adf680a22c2a0dc1c2d311f9887787ae652ebb4b2661fe2ad0d29eb434dc15c9c5fd8162a791547408e04d18b35ba7eae22390ae54cbdc3aa05ffb90c9a5284a12a2e43b1460a3530defc5c37baac762eabbbb4f0ae2f5d80472089b0e9cf1eb3eef91769b2061247a07614208eb51df23ff24766e2cb2cea411ad1f2c49d676eeec705a6658f5b0f63109dc81a6ac2935f6b36ba83379e32747d2624b3440b1cca06a319a90c9bf2a74a5da0e644008c9a95175e17fb3de36195fad91e698668013654162514419bed81d84d9ab7544871ee4de4196c98878913c4829e6445bb24d4ad4e421ce85596559220706b3a4165f55ecef0221a996b6517b39bcae5909570230488bcfcca32441fcc3fa62f11f748de8144b25093790868eeaf13c272d38749db714afb6461cbe5a3311eaf34963731ad7f73c6f0428c4c8630c588fc7f887655946d70be755b6837fd2b3723d36eec96190cda4a485f173cd9569577fa025cf55a8ad9331d813c0d0c52536a2f5e83ed99e4271c0aff7d54f14d748fc363522d3c29a16c9acbb594e73a90621a648c268a7029c00afbc361212092ae7c59ea7fd1d075b5ad998962063a5ac6253f69b363575ed0b8c2ae03d1769c5e7524aa6f9405a2b8a6890be6f1d83ee0c03d9116acf032e8a4e281af9a95ee0a5e72066efb3fd4e01608d1b622aa995c7bfdb6e2dfe142524fe9d2b6e525045c88b083108ff568c68c976f3221181693d8ee3f8a648109b82a3735cc399a7baf947ea4d6babcfad67ac338fd65a71311378daf9fe385f594c4591f52106cc08e022ae03423fce78a510ab37a78ee3b7f485a6b75c53692429ecdf3eaf2225f724243d9bb244bdb6cbfdc833bd343ec186be307be92397c7c1a1457e96741b4e6e557d5de541032f807b71ca3fd4ea18712a608ccc2f4f08bd6babfffd8517d765be579103be08ab6d938e4555f74f845ed11f342efffab1c553f9070ddb7f58b266b37e334334f23a4c08ec2924d5ccf5bc53b9371c0188806017dfed00bc9afc557a6d9e59efcb8eafc507e0e3e4baddf2e5640e0dca56979aedcfc77c3765ec9492a66c87a10011c2aedea5bce414bf7bbe7ddc5abfe2b109641ec0d557802a2ae571c456b2576c8fabb99e383da34260c44cc88c47f677b66216029583b55d1f5a16ce4d8a99471ea5dff3de572f0fa8e118fb2ac95891a8d0fdb54325ca2d7cd8dcb4f4918e49758299cd369a80cd5bfc2b9dbcafd1a6e7971c0068a4884448490d9bd330fd1b9e2c2f54c96f5d2582fd +0x6c66192d7e119cfb52e822217591996077095c73a7b957a0610ee815f9000fcdc7756c08cc6227798ec73b651666009378c879e47a2402e8861fd1cb80ec0369 +34288 +0xfe722fd9a593c85e68961b93864efe0424da67de94d6d5b9d6ceebb65ff85eca1a221259ade98007fd2c5bcbf4c073458265d951e1f944dc1eecb3f6d5f454293c02a5096274d90db98c7d9dd3215b6c69949f08a10638b090c88165fe1321436afa30124e9c9b19a59ec932a9d97e24e14f002c5b6479dd374b9d2b65be8cc2aef2fa9cf9ca8dd2c74b86b20150a413f37e45e5987bcf0c185b4e6f8f5b5f4b10d24cceea6478e12979fe4560ed95e1a60ab75adfb302e53de1de590654608997826ed0a9d424edd3117711501a183703d99bb4b874d90fadc69312510f58214beaa8cbbe80599fcbfc3a41583ff7bd10d43c1aab261d3370f0b6c2f8f60ebe34f342e7b2d2df9f1b208ffb01c2f81ad7e3e1b5413196f88f498e90836f4c065b83834b0b307d94cb67bd67d10ce4f660efd1ad01fd0c0711b865a57be4d8a1c783b4205404fd26e1b80eaf528582fbb1de552974f24707fe24812968bc7b3880dc1d8d12b525fe67fac8f80c959ccfd49ab55120790ea15e772b43d05ffd738f7406bbcfabbec46417346d86a5f81ad109394e8ff82b7d3a98ab1b3d3526f9fb35b7d1124e8f20e1f69a33481b6085ae15294849d96442996f49da36a6be73cc0677f8640662b8e57f4275da6199b775a5cc66d482829884e44da8441a8c880bce90584c3bfd37789a7359c5dd6e592ea06bd1ba5d4d2902dffeacedf959e1bf77481852552943a22f770790f9a613dff04eb183d08c9a1b48a60fbcabed25f0e8e861febcae846c2694a8c31c088c927cbd2db5450996d7078bf8369810fda609b75ad9d854a4dd671364e6ad5e6d4e2c006dda238ac33f04f590e5288a11eac2ff2c6a12e348fedb3c6282166e5d1ce85e9a79d2d8c95a282eff50c42208c3fb06fe39d0221ad56856cb1ebe0105039821dc1bbabb5131597d6cffd2a28b3a9c16f9cf7bdac26df7abc6430dde0d0b248f5a4743fa03ca8029ff7bbcd041568d7544b37cd3e8cb71817c786bcf1c3c74f13d85d55f862f867be24be874d31fb66b096d39d533f9bc211545409ada9f718eac5dd8b0836851bb3af7c058e89d00426d861ca84bfec2d3b832f408f13b01b0d058b4b6a17bcb313208aa4329d951409a858c13d9e269de8dc8efe106180d9dd1fdd1398972db24ef0510fc3dda93afb8f2f1e085ad9b8cbd8e9aedc43f7e9ed6d59701e25468de9c76594ccea8acd5ee56b2d5f6683f23700d5bf3d0b73afb07676fd5552a5ca55fe3edfb814c86fb653839bbd51b3deccdcb9bbdd5882bfc8d3bbf7e8afb9ec260d534d100cd07684520ed59c9cc7d2ffd52c31179bb38e990d9f0c528cf167dc8d49696f3331966b59636797b85e634282a39b86457480937ca6b70d8afac1dbf667b110187a33bdd237ce1924d624274d9677a3f6445a5ab95974741a148ec6c154b0bd3d08c30e64e275ab72dd9a20ce9b31eb2eb160514c2db140cb0d230f8686e4c1116be8df8a09fac922b319d16e2876e64f2a37199d9a19de0e132328be74c9c6261209a3aa04d9fca525379bb4a4a30fe84d431626350ab663e503a4b1b4dc36eba9a9fd5d697fb08a7277e22ab642d27a6918c98e84f0645ce148f638bda88de2814e3f1cae687f33495f6748c3d2d8862c2cc63ee08762699677bf9c059b45ab476afb405a30c34008627d8763df8c9bf4f37eaffe2c3b1a82f443640340f8965a84b490e34527213e05a77f0cc5591c6201656a245b48d0256334195d161144393ffd66d032156768dd87882520d887d1db0ce60991363afc29043469a72a2561d1384ab7641883073e604b437e857ee2f4f7bbf47a6dab85da363dcf50adca72fce7a4ff779af497ccf430fe3aea6213c398549b5369b240db3cade4cf06a3db279e1e1ed9373ca8fd95c1abe271c1c2db713864c8a4dfbbc0a9fd406edf3208c5ce0e9c0557eba934e785d311b62e9eb114dfd746c994651ee0b478bc91f59a7bfa0f0d78875217274be61a25120905d8f5c3696a2270cb4a836be434c98efe9ea487d9cf40307139457ad7a92fd176a7968b918f59e55cd8047c1963d03ea3c2401197660ce755ef56aca22a6a188fc16980f642da72984bd66d8ec660b5387b7f34bcd957e723be1203e0055b5eafaaf15bfe012e991c1a9bd8cad8d5631b2e9459b0a5cbc07929ea1937e67e1464b8c0751f66b0d946c8a7164417b8c8ca4032091937b303b4b75145003a3cca3d9f5954d0d02ba3b6da9ade910f8566c474cabb6d1ba81164eaea1fef6d21f098b32e73c8c9d998dac4e97a183cc5cda820e0f912ce357a083917224c1bc8181498a26a6dd05519211c1571600be45dd3d8f73ab0dbc5ce2d366ac4acb299b11fb477a1167028b52854916d0f097b97e6019008ada0f36e324747af97ce115c489af0a07925cefd6ee2ffc56bc1f62c4d4f2ddb8fda28dab600402b73cab969fdc0bff0fc6da242536bc302fca1ee5b77f6234bddc3d0a436d5e6c0f7351c6acdaa280b26b45d3474335dbe6845ced5f4ab32a1fe1aa54b235cae18689994ef26cbeb676e965a345ffe5240051a020c51d2be96872b014009e9089a6e64cd6797ba5c9e6a9023d265013340798b426f0e114991ff916f23692f78bf6f332054aeda0e08711e448f220063283c35ea8e87cb461cddda5955bf8480ffe1612846cacf723e38ad26db1560747fa39674eb6d8546af98625a677b7cc3f47b8b5fae79ef2bb817d96546cda5e9bf66297bf61dc3bdc2b5c5ecc93b9c8415842e410c4add9d0e950f6a42b945355fea6b5a4f16fb3deecc717b0b5e5873db91a656e0ac0f389a46dbb06f46c2e9e9b6d8ba46f7b0298c22f1afae823505cf3aa00bbc1be890f393aad21d14a369d531fdf68e2e7713338fc2d51315b6ac58d597fa0f191e38a3021939ec916b47bb1247a97529b48d7d396195d9a751ea20f8ea8c4a320492112883624e4b8f05f3ae424dac77ecfab1d65a5c72a5ab41802b345d0df5303fc65d95f5c2b18327278c8a4d94a7a4ed89dd29b37e9f07451ed2f1c6bab125844b47bd4eda51ec2dbf236c43be2760c85db43c154e020a575586af63e1145922184d65e815bb3e7c330974aa9985b52db6021e1c716d391abcbcc9af018d4f7ba5f52c4bd53bdeb52bb54ffca730f6802b3d5c13793ef7e1ccfbdd22ac8a7d038cc57d04b972514af1ad3ab477b7b96215cc52a4d605db5f0eba564942aa764c2544d48d32fd4ab03d57e16c7b8872461e45be3b184067e4ea8ec19d545bafd817d9cf5fc21b1f77575bc07f3331c59e9d2feb60a07d1205e8dfab99622c9e19dd2ac9f6f77a3422e81f44873f3207ee2ae156901f2a5e54a22370c7ec7bd593dd8e60dd43994d25681909fee007ddb73010ac53d4c6c1337ef0cd9363e7cad8919b009d26d6bf114fdf7d50c6319b8c5514492671d0df34f7ddfea658ff025aa1c7359111d10e5907e91b27623de5dff292b98266e70cdba531905b4c0ff09c86998c63a506af6f38bc6fdd448b2114a0e279e23467de9a0f923f3cbdb93a00a898518f50f636e65adfe80cddb7f1ece8aa06e05ad1c8e28f8637c51e793339903a417e961e2930d6ba1010ae22ccab224fece75ab35067ad74367efede70a9d5f5c8bbf4ed0af144d17493368a15e1f65a9871b49b097bf1e2a7e4cf4776d3d26143b1ede1308a1dbc820ef72c6213cd30a619e8e758a1f56808711042ba4a1df36f0af1a94e6dd9e1d4de60a835d32f88723a7836c27c106ac4be525ebf6f21229721a093b93f01d7c9ac137c058285c8997dd2e7eb5ceb6189271609fad5847558906b3f15601e04ecd2802655c47857983e999917e6dee2b245cbc2f0ffa0722fd1b219c763870fcafc2715aafb6fdbdb072cc8ec8c7374dc84f42836501d9f895025a253cbe54ec08388f87999e4cbfe621cd5edc0418e648f2f983f694463f1a636675f0bb1488a03161d46427f8e5ec9ea6e7024b1a5e6aece9180cdcd55f55e54e73da5639373e56f12a56788b998c905f1381c4c31ef7e61a28ed010ec00b31190641b84a60ac4f466fb9ba8d428c9ffec9a3989e8cb687959ce22a79ca07efcf186f09cf6db0c3688dd3148447b5748df1aeef30117178615d337f9fe610c67990aa7051c5135b606aedaffa12cfb71372ebf00316ee6086522829077aed5e1e553b1557d09cbe35f04eb3760aa2109936a2c49e01f6e80d62095039f06760c6516a2169f61594ef0540478197f52526241b92893b51b8fd771d1bbeae4674796b7ebc0f9f448797930993a22192a1c2249d834d2dc7775e78adb31d1e5241408bc10dd233f33d3381f2c061103f2a751e71bf713e20cd384c0140dea652702299793d391ae85eceb743f646cdc56848fae06d7dd5236494dd61e98ab010a8287eef73cdbcec936d1d445cdabeec0542a030b6f95c9ae1791215d6a8a3529259206bd81482c6841a9b3d1ba44c7ba66cf9a9c16e3a4beff0d36430c0e7e1d6bd68349498d240d8dc19755a2cdf3cf5cceb95b764d7fe340008981f5ae4851b5c3e94cee1152037bc7f3542fbe0f59a6d5f3abf619b7d58b199f7caff0205093f8bd1af75b42f4bc0b5c5fb98b56f3d543ee202efee8f040b6fca5a36a92b496d35345ede1535b9f2a36dac8bc872858b6ed3a79538fbe0177058f68841bd83ee260503a4a2fa2c5a32757e5d80c61a19d955d7dce18a93dc85ebc77c32845ecb448cc84dc2454aff482498954432a50665b2ba4a5104c66297c9f59ae448830b7911d363dcdfbbe9cec322bb7e7fce5afc307769f03120b28c3ba76abfd19ab6acdb4c6e5a912820ad9a465895753c1e851937c127d84ad34e8905752ce64ad5c5335cf4a32139adcbf12af3f1dc985ae8b321d85cc3ebcdc3fb384291513b6eab612b7f1f5795971210f614fa7c89140d475e38f8b8aca9d5d9685957d8168c48ade09636fde5e6693ed343181db856dc1c15696480356e6b6abc43e7448334835ea3c250d9d0a2b7c5e909b386cc273d7c6ff107e32d246cf75d87a75c297044be9e89d5b5ffd4e6eb5fed33806e9018ad945a48a83cd4c2c873ad01eab1477313f6762d571984ddf95d7800d3469755f8ab2c91990b855425253e5cb4c2c2f9a6d60ec087c7b884360d308247fb47dca5dced497c423f0a569bc1208405e7bcbf64dbf70fb17ac3ec959f21a336a595fc5127d71a890acca2febeb42022c0a5a6c86438b67ed182611d4d46b19ebb68452f61a53b86ef825376bd8250c0559ca22b31ec43d7c6a9dfcec15737dc903ec7a1241aa6e4f514af2a47f1de87ac8afcb5cb7c7f635f20accf83befe972cfdcbcdf79e2549256aff43e3699021cf55fd8db94e32cba6cf10491be1ce78988f99db62997e5e856d8ae81a523033c6e7eadc83cc23b6a39f5564122a6f27dbda79f4ed737aca20039a427315846897260ec9b25d1ccd5d76c147ee00a84bfdc8b3402195e135fb157579761855654cfcb07dcd68e3b8dc3e9e1b3aca428c07408ee685657b49208c64b4abc46ad5ed50171f5c57421e28dd32077bf206940029530ea24c10ab964eaf1b9b818d5e80098cd8e791fea74a3dc6343bdfb908f06d4be2feb3670665459ed7cdb884a80f1157d0f77ee2fc4944a1ca01f92693dff3bb872300490096577910c9cf185ca14fc02e1386b5c52ddc0df056a814dbd6a3ee28999d7e412f6e87ed183011223fab0f1bc4113ea9feec50cec1544a88dc652bebe6f0ce723b711197414137a1f00d8bbe91874651c55bb38dca659143fa21b9f89463013bbf485f36cc6c5282bc5d7d40025095658a137e55f943b1b437bfe1782b5cde43c5dbb9f14218296cab832dc89fd4f38c53fbf94dd75672829b27eb9331452e33541267f02aac8508c668e37ff17c286e2afb6c9eeb079c552e421f703085b9b275d5b05c0c922efe14f2e78c7faefbb416fb1e6fbdbcf6d7f9f6c438af8447692f0cde5d7031ecf59d0a8018d1d3360620e358e9d6de49ae032c241237aaa0008a9f371adff187966a99f84b7054 +0x2711cb980cb4fd62df85446940d9c5d0e382912c96e80ecfdcdaf7195f377130d01f1530b429e3658c371e7a91e3a738814ca8c7b1139d9847756f24e9d247fe +35080 +0x61ddef57b77c6c122d6128de0b45475d3af8acf74e521a74c46d99ca87111c33b9706083b11417b9401546d4398fece83053e47081dd0ce69587a79160fc009f2eee5173a00ce240f12e75d77ed3e2bd86ceff812e3cc24cc8b9aaba54d45ae847c088cf8c4c15d0c9147d8fe3f97205c4d0c4d15c5784cfe56d69ec6c8272398d4ccd3e7ebbf8904f3026a66feae4e873c0fc0913169a97750aadd0afee90b887fbea687c43d3a90be838c12b8c808d1a086fd05b614bcb00f83e0e2500fc8dbd35a5f691cbed4285a57a8b1dc88e1d410fe5cf3d20e1940c9ee44dd6a1fde1b763c890c23c8f8446d0b5a94f8755bf703d26aec03ba21923666735cbb7dddcfeeb19dd197c0197d5cfb1c6c9af1e9c30faf914ed9ad783ccb78e6f0b2be2a5193761869d748ba2ba0c3688912931db08ae28a9ca26c7f990f922a39ee6556590ad6732560c75cd7eed0c97b1ded6a681c1791662c5bca4f595ec788dcf7e43ecb7f58a4d2d0642a8dcfa9c31b55522219cb503ba60fcab85f1b197dfcda468b3bcd13689bd8726c040ca3f1795f57973a5a417dce0d037c8763ca89cca10fb7024c4dd12a540a44e8142276d68ffd3fc450dfbcf2b8070458c5452ccad0b25a8569627f1ce79e1db072bfd3b15bb5746e4b9579b2b547d849cc03d785edb0ee5bc0fbe2d1f7a08ee394c688784712ed8eb71d249c694870d0c4912a8c4c8ddaebdf747ce7f8a3f10816f115b9d697f3ac0fb14dfe687b56946b77962c91cbb8cc1156dddd8f3aec8465a9fbe48ea73f5cd1fc6687276301fb0d219b0541dcf063032d56111fb7f9ef1d6bbb96d3e329079a790e952a91fb7b4619b994e1542a473162a6212ebd71ae8ab0d52f4abe3932b59196c6e68abb9b92ea6269d4a3beef08912e9c30be1c594a13c93c57aaf864dff0af8aefbfcae27ffe35d2a05e36d105335fc0ca2c2265d80f184c8f3bdf2465f0a96faa9391e659dfa48dd8d61a83b3b3da6d5faa5c6ac0fd32ce65d365f7e42c24d3abc8b8fddd092ef9e2cde27da0bcfec0659b02be7178b93050241535d6fd925567a198bf65f535856288273538996d887080bdf7860c0c10e2807584bb0f826362c0c991814e78debca7413107e3771404fdf6ac5b21bbfea18aff5b0cbc759c2198b42abb5f396475add8f77b15dbf1975545238d544947f1a62b3f489edc5e38bbf0c170b22795020e470f2ecaecbfbc491213790e248b77548187fb213727fc8cf81c5de1940f063b23de8f5d29ccc82bf5e2cad9de4797388aeb90ee0697f19e4291bf683f30e6d6e7ec195723a76f805927ef21f6eac5a4bfd0b64fdb1ccc6268b821a0698928441bce49436aedf6e8c4495280df13a73b88cdb7e11524c17bc2f63144a3963f1537dbbbac5fff12b7bfcd91712720a06f8e39222c555e954cf9d24aaf8dd6bfccb4cadcfc8359279fb43b286d4fb045b328a9919c1c18ac4865e2fa5b88d91ecd2ae229ae659ac9e349f883efb9310b98f0a562bac9e17b00af9eacc3150bd0b8f2d82e4c87226e34d9bc3083043166a37e9331f2ff5776082f6bfe90c2ed79f2b5036751588e8906fbccbaa1b12feb451b297bff1cd941c17de15c2f02fc8f1cd9fa41576a4daedc18c08ec6308b0e005eaead19b2e552cf1375321865c76499ea3358c93cce4426c92e398b02d15357d1b931ed420a2d7378ce3cc76bccaefc6e351a1130beed69756c274ac8a13fddeccfc6e45ac636712622c8b6757ac2a6ce8611e9f66e0f26b610e4afd26937e53868c8995d98022a943962802360543b838cbc9dee7a2de103a30e04b097e0201d0ab366db0e25125b68969ee60bb82d35df96a79951ce2ad698efe3f3cbacf1332c13f75376f3bad446d18d3ddb82fe5df51cb177837466a77926e80c6312daf34366a5478102a6a73aafb5bb6e29215443db36199d95170eba3f7b7afc966fe5f7380b37bae6483cea8db2cf223f38c1624e9feffeb4ce74d28608c006cc1273ade4839462f3221dad07fee99629972dc6e3697b2567ff7268b72a6c00185524ee08c8fe37ddc6c2188b14ab487cdee1f8262d4bb0032c6fc33f5aef770fba921e2125c5a7eaa8b2a3937e74a79d72866ca355c21d3ad7f5a88b14bada16b513d4aa349b11ce4a77d4cda6f6322ff4939ad77d8ecb63748c5f26d26eb7b1c752a8107fef23dd1e7a327628707698d792093efef25901a49c7d9f3e7b8e8583b6ef0062225cbba74233497d93f36c8dfa4e4664ad34b9cace7a509351dd065cb93fe685d50ade77585da410d1271f9a44c09a491fece0696aebe78b821198c4e2112f4597dcba013528027cb890368efa168716bae01a031a28d0719ccac15ec9e9673bbb30d2d76119012baabd25de92a6a9580ecccb1a54d788000267148cc94f1ae2efb5bd5c54a71ca8280c720ba6f77d779bf17831a37e8a91438506d178a8b6a585c9de229858b17cc10caf889f8f800fe30ca5cb7e6464cfe0932cbf409cc72e1debb9ac94b46c14064c42f7e4e53d8b646cd85a4e4f82f66a1fdab8c981c8d72899d46ce230a8f85839b0bc3f8f2274a0908460ab9681bf2099b5507bfe382b3662c2d5f963f4a447539d57d7e3bb5618164e611ebfcd74d48f2118c06891a4b7c4e99a52b4dba244384d4d769984aa4b7c7afe0041e2d1d66ec2743f6761de3d3ecd0c76a9ca7cef46652f73f70adbbb21be7a08c35e30b6c70de551612532274ef1beedb94d9e990c695058b2ba74d7a46d77809a9c2be616580eaeec683b1663dc242079e171e208be62ad23000021832c79105e192df4db5532907f87737b1c00dea75202b15aa9f8d8d9ee9808493c5fe1207471b153947a03be812f55d5e5e440fad84db7539e9d25876bdee78f3e9c624984224092c03ae48197ac6cb7401aed83830f0e6d251fdb0e3141489418565ef3f3a77622ed1c777239ab228fb90946e9d8e32127fbf55bf6c57b85d8480249a8497dac9479931f08dd8801cfcf33ef86404689e471b23ad99eca39cc4c44b4eefc216e6804335dcdf9efa517d12f49f16fc5c35334dafa2f23c9def093822320921f360e0b71b63a253e66c89d5fe8b3addd47d493e41c500af6efe5cc4f16f591d38e06fde2bac5d5e0d182524a3e3580f991e93d4213e4aaedd70c450ff2c671faf0d369eade0982937fb5be72dd0f8fa73c119f89736589fb3ed4ac49592bc8d1e903ce0e826dc1b2bbd3206e279a306290ee293ead5b3ebb81ff508fbc9dfd04e108a8d25a7af9cb307b3690b07e09b85acf68b6342e2fbb4abcd0579f858510736268bac8a9c149581e4f8efa138214d445dca4aa66d366f3cdaa15747b07710aa1ac4c5f828eb9ad2cf9cd87032004a7d1f36e728dd03b07825c5dcdf6ea933136e1eb819dd8a8aa27c3b0c9b56a0440045b981f1b9cc4107b55a51e81a5136192883cc1442572d9bf1bed44b2c690374d73a612889f8e8929246fe893dd6e26552da4a12dfbb4b63380e78a83dc44e82dba0d0f6d6ef6ec1c5732beb5ea0ff9ff30b7a3a3d1faba2591140d91017eed25bd5148326189b3b55c720360517556f14fda4b5e3e916015ab174072dcbac0b5ec075f604dd36a94a2c2491baa3ab7bbc9a10aa5983542745d55b591d494ed5ed493d77f5a509b2ad89812406accb6ef3c9064228532dbe21653ef867f89cda0f58b23083d9daff85c57d18709a7beec172cda5d7c3696bf748650b933f60bfccd51e4635df7237daca619581d584a32f7daefaee39cfd8ce6818bb2a88602f2ca8c7e493209903b47f75c2bfc5ae3744d3f169f61f28adaeac9f30b33a65d038baf6302604160b1ccc00c8b4d2c04f095ade1c76dc3c91a0fc4191b6bc374af7f1f25275f4b3f619994ccfe865849684fbbc38f6d8d32daa404806bb789e46723605730956366db4ce9ffee2e4c0b1bf9fd5e8fe7bb529d760fab94bd5626caf7275bb68936817f454427d2ab93d4bc22c6f52172da92c2c45a0cfed3b4a63b88b8b511c14119de1117d75484ac30a938cd39ec85679deb3d581732a1220d4956b8f5ead40f9a683ee970ec4011a963ca549f59a5eebe973f9e7cb89c3aa664cf8c909a17ee7dbe3d3da6f27450998c561187f14adc8f2749a18ff92b4b1c2e71c807b8238a5e308a98cc1f97d59b834a68a63beabd7a4bf9e5d38cd4efc8f6dbdfedbd7d5f968fa56f62bc013d29d935ee5ca20c1e2a45beffe9ec3f95576e7c5895229bdac0fc2c460d6066e3cf0e97072dbc355af9d50734358fb1e821f5c1b6a08ff57868267d911e952f65f583fc479bf2ed10835a714748ffd234c31d4a7e924e10d4e69f17f538d2d13037e9c42429de99bb31467b8d86a52727b5558514dcf5746ce6b699d6cea1e2def0908d2149e7d1d78e39849b8128171d732ee01e030ea6bcc31d61ba527adaceca28c5c39ea71bd214a42ae5cae128a2771a19fe87021e2116340e0466d62f8c2f12ec8f7a84de574f06ecf0c678e2435b97613aeb6851465a8afd697e3c679399df8fe97009afc3b7e249410657ca6c7b377457a2b9d698fa82ce4e0b26098184ff2e6601bde6a3c9b6ae5afcf647aa606ab1e94f6f14a590cbef26801b8bb29ae23699c21a49640f04aaa33cdce079a5b1a844341091d897c6ee978f9574c3263936d913a71ea0e25cbcbe28943b56b5acd60d0316e4be89f43af58c2c4b1fc154adb898ccfcd70e1f53005284aece0aacb9b83f0a73d3e1e452d508387544f6d519cca4245a72cccd1c2e3d56c14c2f41c1ba4a63c5a53a07c4ba864299bf313af969c825ce10b8f6667c6b63095d9dfc9ca7b7ab509eecef1f2a78e31f0afae6cb349749ae1d5d2bd08f4f31ed8ed14d98f50959bb4d950ab08962927ba4ce691da18428a10523cdc8eb6b5be43c63a54516a1f76c2dacdb276bd5c9460936524f35011b1d64976cddf5424993f2bfa43fa123fcc9bbaee0f256450ff4c49d030e53a0c999c842898e516673635e6fcad71901d27a7405ac9fcd32df0e539d2ba9a1e58c9c8c9f9438644a71d8bbde79a9e2ce20e4d36b9e8e2511aef932a11ccf94420c9c4e191d8ac250bd7ab796412692eb60af862b575c1283f85bee3356deaf38a22f694995e3e02bcebfbe21a1ebaddc0a20d8ef476809ec539ce2de7a65574be5bc8a9b9de2423e1e1e5bfb2c57982295ef5801ef607fcd4942bd0cf7e2210e5fca1ea985f46d0a342cfdad3108e6518c61801dcfa3e8a931d3e9494fd3a0c278de81ddfe98c512a9523f92605e1ceb663ded8d68c0d8f2b5c6d41de2b83b3ab97070b3584deed9d6248e552af5b052bbcb0cfb3b35c55c4d9219e5711e64c9aa2657c433924ee2432a6660013e2519e59f4ac1b781322841dc374a5b64b1e1b346a38b10f469ae98ba543d83b5ffc37c31438b8e11a3f96afb98b70229b7257d77e06260f2c3a11f8ad46812ebb4c2081763b2ff959f420176dab615ebc90761209af4a40be15c7fe2635a4f4dc8a7e1b847d2bc5b8884bde459c1f7198c09f6d73fcc6aae575312778d9e896acfd7c1aa4c5524f20453e8bab255363164afa7124b2425587a077fa0bfaf61b12ef3f0540dc4c9e777122a60610a53d1d75b0a5859c654a8ddfc2ff4860758bf5a6f264bf8bc2baa7551eb7be23bc06978be992fc81d890e07a3abf95d20eee3f6bbbc089985cac96395b473b2741c66bd2ccbef228432f66b906c15b19694dd786c29f06cbc17b2e6400dde4e3db85819382b3d05a4c3009e44f8d03fd2dafa53f308c9eee9a2f552036022321334cc11532f9fcdf9e9ab0423cacf346031d91de2d0cb9c78ed1f5b3253d5fa7f12213a20516e07fdf75431cf6a595bc929e83aae0a9bf204667f566f416013ebc105f802394e202b8c9a9baa4005027833a63ec72ea18bf69fc3d81cc156fae3c1d8df8b3fb6c2fd09fcc646f468b4e7df919ed0b572c6ca095b54cd4c312bf1a518552ded1e5cfd0fe93627ffeb0fa29e48df2d17963f1933c450f35a75239feb42fd6cba0b5aa5fefe6fbfbb026f32e02a846efd72615e9f8d511164a98e38f4f73cca3ef43882679ad790be55501365c50308bfadb9f4bd24d9ba0324a8676293a7b8d47f931cca4d022d923a5ece6f86ef7ce68ec5860d095f5fae9d2ea5b4a6a2cb22f3e6cfa78383f8af57e7be8e0ebe4dfab +0x73e3a0b552605e08c1ca390e9b8d498fa2679a4f2f29bd80ca7e40a86e20a5ed4a9b8707db0aeb79e251c8c0f4259ecd25dbb9c82de838ae953e712d36991546 +35872 +0xd5233637f4320cf1579673430ac26259595f2e48d742aba0a59c9440f0712d6fbc4c2628e030c3b452d13a7fa5045d24d07578ca31987db3d2e25e12ea38bb1da7a8bd642a574261d4ba3a50c009504190f1ce6b6d8abac3498845cd67b567b21e9fc394da8dd01e63b83a5f62b886d8213df6d392ffacf793f8111a70d07856a999ff5ff6bcb6138933045393f9461209bfb8aba8e1997837988aa00c713830d1fe3a6e88cb3d6acd935ed55bb4d716d2e1de9bb817ca6dbdd278084380ed691d363c6897a2aa48b741118dc3d1820d030a2e4ac88987ffae0da2f91de5e02816a9cdf62c2948d7d0a3e522d2398f1f25a17261e31f185690b0d11ca388599642bfb5c04e485e3f9f22a13d91d24673bf1070870ec1c499ee25cd19dc529fdb2be1bb6d05e733a8ad270f850685ee3259bef1655357d4f14dd35e97d129fc1e5975a9a559ee10398018f5a33b3bd1837c13bca3b9c9908537224c3e88f7b68753e5451253453d1aa25e1c3e38da358fae779be848ff407e337a5eb70ba21640a197585afad402749b624cff034b637e7a5254dc09e12c03ca435daa6213646ecbf5a9255784a76ff18b4c8da677a377650cb02803589c3d82e512be9333e83c5965021c703b73322e40e69229453da2f90d77743f4ad753e6c8429ca8e9ead0d45129e64fe2afe6d9ebe0b3929c7828bdbe7167c3a1266e7b55b8eca81cb152c420e72cfc62a4b27bf3039aeb669d31398565aa9943d1b6cbf23b559cb686ebaf3a04967da197bf9bc017ef3c8af4e4f6cb1de5c91a20525d08927f8b9eb1c21f0748cbdc89d334c1bae4598bf0c56a7bf95fbf590c5a6bb90086137dbc7a019bef7b7421019f3a76493181e28058eb5075f4e05303c9286840dfb97bf828cdac5a643852f042f940d5c80f4822f48efea9a4f1bee6b3b2f13265188b3a0551d8b0ccc079400598aac66faac6bee37b0cfb369aa39d6130dc3ddfd9b86a57b2aa597bb49dd830403984effa623c6bdb02d57482090f1bcbb2c817a30770671ba7bd39bbc7a00b18777710a82684d5d6699e2452f82629abf93dd31f82347db25944ce7dfe80dd49eb07995c1a7e6993c8be0fb179c9d2f73c03dcf5309fe19f475701a34a60f0fa1d9d54bd45136e3ba79dfd4892e05fd80082facc1997da0bf95c9bd5b3288a54969f0774af292ef58ea3b6bf4d541875cf22f44c4605b11ef8bd65ba42c0f47fdd777b2960a9efea063801bdb20b45f7304b941ebed2afffcbe024fbfe1076a27a8b7883617cfa4196c4a7eac8ee2e85ac65a0ea89e419d7fa2fa33ff00157e5f645c62ab9889723c7af71ef97e51b48cad8e157b0253acd0e10a92f1e79e171d80c2cc770b70db82061247427d95367120c1f0e3a7c590a8eedfd7392615a6ea84773028ff0a62729428b2081b01f0b0c6a22b72fd0bdb5022d68b254a20b04ef6063821c1aa8996abb6d9cac54c75c4158b1f9980baff7f238b2946a223c5933bec4f0221f5c356c32918fb0ab9381383f967c7c1477f8e776a3c3decb3598ffc95ef3a6e60a24b610c0a2969fcaa3798897e9e3d35ddf694f02e4b8843de7d8e9f934b257fa8dd0bec27d6517b6e98d997de8d530a9d5fe2b99a2fe349d6e48865c5a4d5a739943a25fc725fa9d7cfbdc0f205b13a20130722ea2bac59e57d608500e80d7bf7096265f29de32c8834bb7173a7c64918c868c8a8ff31e86c70bd79df852b6243951b1894a99a67f2706945bdd410bbe9d88e1750fb2279de86d5b0bbfcbdfeb1dfdaaa6d35e3e0a90b3daa5b2b0f0715dbfd9b7cafec82de286fd610cf33b5b43217b7e6b33e2b0e5daf1bb61d4fcf2f3b2dd176adfe97cddde236986d3b0bed3458bd9bb227aba4f03416591b2158888ea535e945d72d300fb37e9d672275af7f1427f6a32ee70f5b7326dea54247d44eda554f2814b7a73679faaa3d88979d5ae0838216b261a007d2c9a16c112174e4539c12c525db95faac574960ebc61950345cb88d60b0097de97b3ba01c59fcf79796dead88ed8ec4a0f0f571baa5a60796101467a836ae361db81811d275cee12cc20d31cc71e41d1e7428d0739ae5e97c4a20460779f0b8e60cc101c1f98d49799a18f25f1d587c7b4d6e0db53a3b6e5d776698ed0e838ed8e5b12069499a8904ab9c7fcf243e5b2dd94fa9edf8391eb00441e0e748d9207cef82de370a99386463023a7b4b0841ccc418058c5941632a8d6cae84dd64063866909bc9a0ebd00f5ce4a301d668b8ce8a81d11ed1f6e4138f21622420a6b8920774f98fa104d86bf5ae59e17ac238b999077d23f6bc0a01661aac63a733a0202eaa78078f96ca00c9e9bfa89c974a047c036a2a3c235d8acea2ddb1f57d655968ab87bfc0f41d74460154b5a06a5535a01038a016af5706157486ad8ff660a421f2b916e9cf5b2cf69fa9974abdf2c3a1b869141ac27f09c6fa27a4db313aa7070a7cab6e6afba1581f3edbe0049b450d666bf4bd0f3e0c7f9e41366bb05bc8746d52fbc3698757f6fa84e204c0c7202fa4b1c071e82c949beb53d0b5e63c8ef695dc769d3d86d73fdc0c482d94feeb94edfb15ddefc338a86be0124e555560fa1e69ba307962a5af1e457cced3bb1de9bc785365789a4f218a666999805ef51b618b15318fa329d14bb10e6d1f842d7a9aea078d24fa6e93e167552bf981a1c6f9d13624f2d0fa22eeef6b9cdad290e403a0b0d9779c0d7beb63537a23960d9951ac9b6f45749d30724112b2882efe92813cddbee2d7b24612dae31890e48eef03ad9394f9f669766066a252ca01bd228e2eecc1f935d38ef24e826bb3f5ac448a24dd1a72ef055153b08901f2f35300a4f77c771d5f07b3042ec0081f51ec365fd2c68462c6f77da6cf4524a56c66b94016fb32e18bc56ec30c1a523581d530ff17fe572c069647e413455f53e55eb8fa1de7a9c87482fea956fffe98fdedd0d264d3074126884c961d27f680f6a17c2d6cd0303471c6ff31afff41ac3e9c728469e31944bf33f8275d5baeaf08d59f7494236ad83c07fcf67786e001bc77b28f67bd0199393fd732446edc4094718f4a248fbe161bdc54623e254e1c0ff5fd5e0eaf54d11ce2662172c003f831fbd8288e43ae60999ab1ff6458e06d919ddf6acf68876ee2f2218f68fdaa1869eae69a320db05a4df98248aaa03b78f9e5c5502a471dd513b595d68786532394a54719c03c6865a14f41b84189d3c0a1544b888fe98ca637c34f815ed883cc5ae17621b95e4b152c226cd8f9843dc7106fce8e90be5844c7919b3a6f92b05524f6003c7df1bcdb57098025131dde0ecf9eeadcbd3415533ba7154c3a136d607b7951d49e85424aaa7b18272eb5490a57781ced75f928340c8a5a413ef92f70c6d207848b978fc5aeed9149bce8e34c1071d15b4b6c2579d2a1b6b3fea25b08af967dc6d586d9eedcd788274e374146b322a480ae0b7196f683d71ee9ad849a9e4d41160cf1d528accf692a431ee78c97f103083e65b11e10b727dc908940990b4cddec8266e605974bc0dd4c0e5a703763895c5cf9487189a2159783b3f3a68f4bc0d4e634a0f834c30baab993fea429f083f78a34cc23f9db4cba23bc22258290864999098a830ddbb63d2c3e689ae83e9f5456b6a0b7c9c929cef11060989dd19ac52b4407387adc6cef046c0cc6ea94481d42ed6aaf720239409c4f239229757ac20d829b8b146b7c4ae2bb7faab997fa9ccf478e7dab0cf7a955c6df94ce02a2eac033dbfd630f70db479b25d8cdc0436d5c538094ad5fe183ee261902f3ffaf89d3d63cf1cf1ef71a938983b3af939ef99aafe5a71161834a95db547f23c2fd49c8e8332ae1306b8357153dddc78889ebdaab22077fb859781d55166be5f318851ff862eb21ea3a9012bca8b9be25809ecce3ca4840cad096c531d35ba3168dc6397520c5198300eb56ee58d9fbe10f9cc1d842ebed2f95112dd01fb0f393d9a7b5fd014b20b14adf9428c2a0f941a36059f720650d4cf391d7ee502e4ff1688405de88dfefeb74e73b0a7ab13eddd88405cef73609a9887323bb190620c5c705b9b83c15cfa81bbcebf1e58d54fc1b7255de1be17adbd04fb1e4deeb0e77818732187f6f586dabbb078d9797a452e8a5ba932309c94a478202ea164f818d04831f5de75f02a2a15c2e1c1562d548ccb8b48c80f18d7b7ab497395395f28ceca3d216e86766ed992ab05bc37140643405c438da3b2ff5d641df612b70f9ed9653ead2170afdb4ffa13e9b36357e2bbb277a167369393fd6d44befe24300258e0dc9fdd7dc2f8f415a4978f231f705de8836a400ee21b018c67d343c9e9ddb504c0018cf3d84d31aa041636bf94398fac29a6ff74c820d08a2e3ec7ee63b6579992da151b18636c83db6e927fddc4bac4115e8cb06d29d22e400674dbc615a667f933603dabc10e66d2a88aaa239947f9e29acf0af8be6f42463330d739820a359e1355a1b8f0801c90ca058a8d419c134460b0ca91670f8ce7cee52be486ebcc2982dc8e6876296dbedfed65444323dae1ba173762ad1ad6ccde7a20f0a8b1f54189dd4ee3dd702004ec29846f2743165eafec9a9017f8e69c6bd7fc8571c4768e2e402750acbfff09fba12f3776638e6647173b462e1184007ee407ca688d17ba7bed62d76c7dd076133daec4b7ed0b9f8b8062aa78ce7aa01d898be81572a26a78cc46a2a4115cf23de5483d724855b1820f57e47f958f2353aece0700dcdd482cc61dd6dce56b26808146ca30dc344535ad611dcbcf8a32253b194db23492fc9fc12d9e9d60c5bae4f9f09577117003aa40ca7de2e534749d18b4e5b2e0872ed9a6c0206dea315571358ec3d24fd092ebb1d82b4e3d5592c22de7f5884a8585e35e1c84d7eb789f301d687fc6fe1d9b00e9d4509741b5339c62faa6bdd853a9c4d089f360cb6242289ac6efdd861fc5efcf061343581b0034a0341fd8f4bb4384e3519592f3b7e36192ef3b9e4f9eb9c24ab59ddce950a091cddf89610583fb2c81bb91f4c93f2de4ef2c8c91c1621e81442a15ea5e1dbcbbd3410be0737478c2910e0f0eb6c2c5b897c50a3f45329d32a4aea4f31e48fcbb98a2cedea5566351fa933969230756e57402dc2f41d8dedf5287728191990798064cf9e305f163dea692358c76d786746c2a2be91f1a888f35fda61b1fda865a0486b575fa0c21737c522bff19fafd6c69871ef645c1434b375a694a30d1200a79972a1eec714417641d444b723864d5525fdedd1d95b91a3fe4e2942c477eaf4fc87f6543e675d34639a7f7eb5963b80ffb92260d5d8f0436e53a847b0548516d61ddd268345cae0aef7e8bea24a11c87a3635a7fe3701102a3989f85d025f8bbaa6beec123a0b09987ee90d962c709a49f7900daed024a8c67256fb373bdad21ea5240b77aeae1d949218d1fdb7c874d36fba08644edb6bc78087b6bb4b977876bb951b303e14ab37d3f0a2457699f6ab111c3ebb0da5d7b206a4b165dc15fd573c9a71b842ef20f6a6f8f509e3658e458e5f071f87148afa573681d347c6cf34ba9cc58c678e1d659daa50b778abba1739caf80e6597e41504a59e60293a6c93b8348d3916820ee92a8d3bdac0dce8a4a618880403b071a6918a6db8ead15408a7ca1f3aca6b6415d00a2ce03689b87255a04d9cfbeec203804d863a273c23e82be611fe1d9abb6020a99a645432a814bafaaf35b8b343d043776e5048db4ac69710fc1f6a90834c8f040ad3a45815e05890236ac49e75817d908cb7da2f37388bc3440b4c0d4a5f9d71f4ca917aa089b10950b89a10e59b711167cd55a887927c85704e3c317f0dbe9bfe95b61ad65556bead8bb3bb0272d072960d45f7aa88ebd00754b5dd9fdb74ea7ee19ca905f7ac38a060bbed5acc1e4c8df4256d1e704c2b8fbb33423b4d42e5fc1a9fa5ddd543ffbfe3ed385cfbad07c61e6ea961dd2ff05fee5f0fcfd7cb070ccd39a1cc62908c7271f21c97862f2cc4e89c1d034419d72e6a73a6dc0f5fc61756152d304424575e87551a88fff73400ef383871397c4841bc2ba7de5883bba2619c98c7ee71f8eab070a2bfdda7a6009ecd9c3a21c9bc505fe1734547d950446c5a84e1c60be99d79ef559a83b30b5a83c6b8dc91a4bbc0c22f99af51c31c53d2b9622c6f4491ed402b93a7969bdc651aae0ec70d7fbf199f80ab8b0ac388872143c0e64ece8a609fbffd658ae481b6d00e0e97f9cd4ed1246ef956e77d1d24f47411dde90c5b8e0516f362e50f93d6504158bdeb1fe37e1d5533915c3252d3b8e4f541c2805dcc0cbb061e198f9b39f7f24 +0xf054933142774856dac63b63f175544298a3d36874bc37650a2682201f8336b621cbf9d95c87a9838181c1b5c015dd0c08723beb82830326382b5db51ea9283c +36664 +0xa2871817b7ec41d5116195f97ecf6e4c35dfde5f0d5e8a17ede6bc6984bbb3633af33e6c66da89ccc194366f1b04afe54cedbbae6e5750b54935a91a0f4497344a361cd7121036d283d1f9bc6e54e0f14f7765d77f7dcf66abb14ce7854c3ffbb999dbe02357f1f03f5f066ae187a97526c50462aa98b032fba3ce584e9b53c07164a30f0177622ddd878601da64b17bb91fbfd8566f9a21215356f5d2f97a8959df9bed143830914591a107c3b4a10af0cdbec0eacb363c06090d477a2e5c605952ec01c562032460c57e06033f202bb3162aa2d0742c8a900d1ad5ac01a24c5904bdd37abc85ef146a468502cdd7e5ea442b066f322313a8a6a627d13cf456413e37ec9c0f5cf94aca200d28266e407d9de8752fcdc4e0371ed9c652a5f984f94882d39423304aeb2b3525dd118c44546a8a77780cb6f823bbda3995055ae06a6ac510c9c0aaebddd6ad558958d9fa57f23892b2b8a16456c6d2080423bf727aec292ca2ae71e30a13af2594c1ff696f7f1b5045992f2ab686e8bc06c9ce411215d5ae89b42e3a582a631e6615a39982575b389a7706542d4545dc02bd32551b2ef11ee59c89f9b162f2c7671b709379c31fd2171acee9a24910f062c891b67b7fa7051d2c2927fc0484a8009d0b5e3d0b8fa7254a30f2fcdc72818db2946d1c501dea9b2db7cc2158404a97611f02b577d43e2dced37625449316eb43e280e4e97b55c666daf107a64f3496315288c84f161f956f617d04c99a37e44324fabd91eace06a13b9c9836d9ee63d34cf760da7cd3c6f57f1081b5b06ce07901e08e9292dec3a482d8bb4f0501680fb65764612fe12928d735844efc3e47ae223c3f329a0c653856aa583bfbf40baf38b1bb2c57d125cf11f6f5dea73481aa2e15b7ba2ae154255f1c5840e44fb679790c4f831a2c21b4d55bbcabd8d7f635ce74e0726ce4f9334635a1a7e89bd037227007aea379879dc96bc2feb8ad0f17aa60a1a1869dba2ab3fd1cb82e5fc1afdae5cbf41840be53982eed1e6f40321769e1e290a09400d14d7db1badf23f0aa4a74839fa20a2e9ee8ac26552418c8ffb3ff8b88e35234f1bdbc49f72270c7ef1a2417f5685d3f4562ee56e9ffbb3a9532c385cf765ebc52aac2cab520ccad48f1fe703f93c45912adfb632329b3eea28b34b6ad824002bcbd981e3d00c20a7b770874c44ac4e4cb71db374bca884eed695b076c2f816cf79e452bd7ebd74751554c0cceb6e748395897b8a909c0c140723e6053a4a864caf4d1dbca0995ca9233d221a3feb4ed240836d0840fe5ae614ee7aaa90a3d51ff684514608183fc06b8a0998c4cb33c5429c06626047e7f19a65ecbb788c89b5ca1a8c0df7c2945748dc05ed1c56d9b90643e61d50f149b3022a9adc547d2a9aa4802c69021100ea65a3a56ba936973a161b7abda582e6a6e69d2361a6fe2e5b0045c0ebb99bfbd62c6146b8fde2f2d50c7332b7d0854549b24e150002781b6387ebd80a80bbebc7179588497cd482f633ebac905470fc17efadce2bd973684085d2d049ea096719b1c0e881b893be3a270556dbc3ce519e094cdd49ae889b8ea4ab482e780ce46a7573c61633a90b0d7020bffe81060c48999bb0edf4202b8a3ed5be2c9d2eea15fd1ecf6b706d0fdc89fe567d2ea082a41b2af77d4cc2aedfeed290c8dbf7fec8933252f5f1882343eede98dc2f364b4d087b0f9c1af88bfc2f327e87a6e088eee24f0f4a2962ebc0194215aff53fcc8fdbfc67bed12a597b6a65b5fda0711ef564d542dcaa95dfdd93d95b4d33158d09103f9e6a11e07dba4afcf57f3b42277895559c21d78955f8e904c8584b5013255fa522025fb38f552b58bb90f9bc48e4ee6079be42c614ae7344eb35b097e580e4dd812c1d0c04b8861956e74e47e9c6ea567a166ec4626aed2a327a05257a887a394a4bdc52547105bf75d6ab8d909b23c80baede1ce5ba91154ca9bbb158c87a58cbf6004f14fb14ab96d3b3f5c3ddf535acfbf328051a19a678394693f6bd5fbca49f3b2abcd32d6e1882da08fa1c091fec92508e4705d14e739d2875dac3a4c562cbefadc285ca879958a04fa9b1c9f738e678b8321a728d9d69e3bf7b97e40364e09020bc8f768887b98922694ba24c108cde2e4ca457e474140ad96f9698074991cf2c015cbbe1724a0739af563c9f11d9f3690d500bd38620007c1d4c2b418f33ef384779f502d77e9cede24df360ab724ae0da8a08db521256e01b253842846b92ddd563cc9d25cbdcc7b8bf61214bda573e5aded98c566f90cddfbe296ae79d3c7561a6bcf0ebb6295f890700618176aac9f4aaf837019c209dd173895b174d5e9742bf20aea7c2150dd9d14b91cadbb82c4e9adf9be22c98d896f1d273a1f07bdc1f199246d884225b319abd42b67e01ddbf1b0a0b86956bf6a6959f45062b068c4d52ac2a0c50d3d006cfdfe4a2d20a46cca802065d7b1c7076eb3a5fb251915053d6b8f891ccac04ffdd2e083e7c54000dbe522ce5221cee8e7f4e243508bea0d9226303275c0d62536f221dd7d15181e8ea74ef9c3effc963ae45231cb4c0f633d2150a3b938a50c7e256a61d759554e4a8d4bf013647898d14b9ecc7ea4ad8fa42595e3ce7a588b3d326315ddd81e187860c2bb28c66b7612f16e1d51ddec1a31f9a7f99ece152bdce2b30378dc9c057ee85a60ec5dfcb9679e682a2d3ef38b4b672ff0107c0472c1fd03338eabf69cc5edbce9467354e8371937fdf80eeb6a5935d5cd0bcb4fea554bfaab088e5565b5378f5d1d4e9a8be92b819e9c96fb40c52c409a79051b1b00934175cfcde1e9b68d7cc55b37f72be79cef13ff1e4c93f614195f4170938c2b9f7f99cab0c1af31b92b28e776934f983428660bed06ee54b507224b54dcc53c355d1de07f1e408c81438ea953957f64bad59fa64d50d647d6b3ed7ffb214e9d1e830bfb811f2231ae6d0089162543b3f89dc4ba8452d53741c4c7c5ac88b0b422986a02ffeddf860850846f066d24edb429df2edb35728cbce3b905ae3972eb084543dc41affff5569525436c92a97ab720f7ea9a2136ae10b8c9274a5d1ca99a319d738f8e08e562e3e8ed90bf5bc3c92b15d6093da70605ea0113c81c36559e0480ae31b284bef2e3d755ba1ac02eb1f240da70b24ffa622269b1709d4959dd68f5756e42fae7cf3cf96432cb6224391c80de16a7b6f3f10708ea8909dc1c1f0302b09067f3cac19756003ffbc90e2752ddca4445625a7842e6a45d8778062b7db247dd48f6ce8f9cf7122bd27b52443b608642b4dd95c07a0bc83240a47fcb7f0a239e0e8b5b03f2e3833c77025a588010fa581baf0e9158803f515ce8efc5b1142a1ae03ad9e3422239bb13e68c2bc8f60fcea25e2bb2844cef0202ccbee2bad7459be78cb0f833bd1ef0cdad5284bc18abeb737456eda577c28d5ad954ea435b5d674a08490a6ebb1922cee1132d0380b7f8b379f608630a9f398d961aa5f3a958c732370ae19a24119a3d0936ec46361c3d8df372cc680c6d4fc38c76db73c82003c79f5c446001f0a143ae258a2d40c002276c3401598516172341d1536ac09b6330caa8fc68599d7d085747cf5fa88d8fa96ba36fe17d81d9d63f94d6819ab32f964054d259340076b38c048285766a2b3c7927dda6fd96dd040e252c605d4fae2087ca8bdc9a01d66dd6c46d46b03e20081d2815500c3d6ad334ee1dae115629f72970f2989488e35dbbef564b60f3b434df0edd88b35eca6e3b557113beb2e842aeb0ce36297de7acc5ed063c8d7030e84742fef6f9e143fbabc4ef396d4a332a9cf1e65d62c828817c2745c0409ddc4ede2a4041e6ae1ea30aa260c5260652d77d9a03b64551ef056703da7f8062ff8b2b2f6a1182aea38de2578c62efce8c70d815ede8dd01835f0eea8f2255a7e2cab6b94610d6c719e2ba4b3bb6d28a2b1e36c96c9c2fbe2eb8f9452a51c754ce3108319ae4e9e2cac91be63569d62275081e1e487a45713638b17a74b3df5109e8a8fd2f35c3e8fc6b8c904124037eb357187c48292603e406bdf335f1a486db181e87cdac6dbff8ef95b1298f62872c32ac4b3652da5a804ba51635b21fdc8ee9f3363bf0ee51067ebeb1b351fa232ac263f3d89c6a60522ef24d3b9f56396982ae7143aa4e846d4090f8a812d43bf32ec4dcf6b0ddfba1d82bff11605387b30cd7a2ab829642775c92eecf7cf6b8d09f586f5a353b15b771d8937d9c1eacb5aef7303c1fcd726afb4dfbf2356a80093da512cbd48c95da20817348fbbd92b7919583be2afbfc8f444788d7e5387de62f352e1035d963530daf063a273a1f00dc3903f94a28c72e600afb47356695af9e902cf2ff29676a61e9b41ac59c3ddab86b18b5285dbd8f761ebe0accfeb2abb13c7239db85896644b8e5b280ecd38b4db42ab96ca2c5f9af0937e85407bb2391c36aad70f4b191dda301c8fd31c85cc29ba1cebdfdc7b63355d0a9728a985f65ad7b15677ec73155327025e773069540a9e5bcc378ac0c2989f014d08e31a756800c3b672bb38fd3ed9b91e4bb747eee645e4b271a5a44b92efef3161b6e438cc687e519045df3805de8d39c10fa5ff556744291ebbaa50dcb640cec39377a2e0653dc2410ada48409c0b5b97a807f7c07906ba8f4b4794ae88927f8f1749665c9d8e832588cec06798cfde001ee27acfe188c153c31069b0ed50ee54a0ddd58967ed0e8e2e0112e36b274bbae2c9fadc3766e80cb179626c3b088594dea9830f5ad5ef0b8935c25c79ce2f288232fa6de10d98faa506f1392825cfc01f30e146ecd58f2e28b1513b4b00f2d97b91fbfd85095ede0c2d98b00b353786e11892d8a46879566b284208658c213e4d7b622379d694075571eb697ab35729c2a4fa2d080b3824eeef172c4fbc54c76663df4865e1e3172f585bbded3ca959427a99cc9e4a461a229a334f600de81564cfc604afd7c67de8655c25d91d9865df1df43fbd821d9684ae38ca5d1d65a8a733b8b0de14b8bc1f1d7f59d4e2cf0ff6e39bef0c5f492aa39f9a258d5747e1cc142a056725344241e537a257389798388ff363014e3356fde2d9f97748296132058c5ae185c3b0ef510797d66b9c9f02678d2412bb76ac021c6abea16c6497877c7229c3b2d17875e581b2e9184894e30edbbad7437d8a4ea0eedda230a4052add5e1a8438f8197417187bf5bb161a58da618fc552d2823214b8eee031422a9accb275a984a214786a4e6b82b0af8fe27eb12b4385f0145aec6b5af1fac98865bf11f3ba2269e9e153960a26b55f760e504d15f84970c1379c78ba3dd9c4af0a28eeed2caeba1a4d6781c04825b05d4af387c84a19bf1946a963854a6abdfef69ebbfa77660d162b2a94366d8e4cb616dd13cacf73357d06a7ae34ae3a0008b9851b8430f4ed7df8f13fc50d5b8f10f0715385eee29e6d05fbdb50bfa4454cd1806012dfe7d5a2457ff704be19e1ee6664d9922ee44479b33a5d521555f84bccf52c3edaab50337f0b5c7de645ffaef70c086805f4b2239cc7b6b145ab93760a67f260c7abe7a22447d2892c6c32e310eb82801a9071eb31486a16a731916c285d45111d85f66ed399fbbee6f9262b4297ba62c3440e410f1109dad0748c8e955986d842b626f9eb962aa7ac7943d81a752298a68bd1c584d5f87647d0ff6ddfc14a1eeda8d3e3fab101abe3791689f7285d9a1ae486d940fbc88183f3448a7649016d64fa97bd7f6ef354325508b16705cddfc6ca77fcb1f6fc850b47f654e7353f3c4f17dce6f84482390fa9a4def8b1f5e200ba3fb0565c06e9444baf6da13a7614028d3dd0e3c620c2d1f375631a9158397f404894ac8f7a26c57aba2542bd288d35c7153bc068717a3faef4fe4b48775e88e92d0a3335b8e61551c12c3a31d8f04f520d681cafd6c79f58ae01193bd5b9b401579178b3557faa7d3ee2f63d09f5c5ba80e66700d343777cfb0bf2eff5e3874542bafb9cd28c0b398dda15233df62f7d1a572e1ff9766e78768f66d95a64891188f72a56b273ae235871f5a8e789e2f6340ae031bbc8daf7aafbe38c65a53ff294d6837577cf09c7095b4622891986c258a20bfa9cc3436702e2077dca3df254f0c9958d8506a4a13af65534a53d917e028d2fef0eee3e4318d23121da8766d52740eee38cb3152e47c3c133ce6e8965cc5cca6394b23218473d0f1d2929f3ef92ecee2bd14cc1eaca5408b46714d53610714a0cc0a7b5533882dfd4288e3000de2e11db054c31432d179a3b01c91b4b796b4d5f15574e80475451cb7b3c81c5737508659b29f9e40a9f044c1113b23251bb42cf0519443c0e21d37773ad8f89cd62204ff57e6239cd5ac54c275d307753e1a8c102866cc2f76bf37cb469bfda7675f81eb6a230b0ffcb5bcfb73e1c86da6f0df9a026fec18da3202fbff98933f910fe46614dbbd61c61465b430eeced6fc +0x221ca8cb81dae78612b8a7c2ced624bcf7dcba005250e194818805acbc64a41ffee4403672405ce5e7e81751736ef1e7addcfad82509ac4f0f5ec6100eea39f8 +37456 +0x1f55a263d748b98577929cddaa865c072e37d444cd9739c28fe0f21d2e33a925ca7fa2e2dea54bd573da1581934c832a010880dd271bf6b050f79c4b171910a71fe9251605e27e8493f25cfc3724b46eb37c85af152268c1eac46955af35158e885ad4083546791941a418567c551759ac5b88c280f6b67cc50cfe42dccee1616c9957bf541a651ce4b6f1984c29d675546d341f4edd0969499a061a882e9ba8336f55434ba66915e3f191c98ee6164a14792ecd69208911df3527e59a9b6cec44a4769d0332ae8da81d9df12ad5025e524921d4b7075dfbeda409acfa5e7cb3090063d463065c0c9a02c018073ebf3c77a3b33d22d9aeafddb0557790bff288e94bc4f0526a9a182167a0470f697869ec508c0f91e0a3b61521b34c4405f6f04c4c40fabaa5903ba516e586299d536e18185552eb626597ffbfca35fe7ab2759acc80f9820067fc8ed538db3d2478d462c2b60e1aa81bda01514339a6644b9e3c932cf592c347e3456d4150344410233418564c05faee0885a1c560240cecf39869ebf6d236577930a6a7ecf44643e1f5e0de14949f06a8f275f9b360babbfd171665052aa0c045b84712b7667238980ce3f56cafe18a42b096873942b6e04321614329824ba9d0451a2cba720f18cfe3e9445e3e06a35f27cc16fbb347844e1f132d6bc27d3ba040e59afc01670a0fe1ba73f129577886bfde4eff99b6cfa477f4cad1d27f9e3f0f710785f9c037df6e1d292d581c323fe096d94fde4ce8cf93ccc3669a99f9351c86195e4463c7c7f2db0e1bb49df812f2ba5cf3684ef857d963bf2f02127408ceeb788ec898e14fd5bccbc22321f3885d1382f1210726c2b3816736f33439428c6acd1d6fa6ad008088082b8ef24a288969f053efbe9b9a88ed638253456d6ac0c9c0141fd7546159076c5cde56267ade845121bcba7e66c0705a1b0c8e3b09d1d1f87ac271fefbc901a05ff996af07c52b4b616f44f8afc3d2f50a0457c9a6274a1e573fbdd254393d4c3cc9fa0c56a428861df0a431fcf8dbdb5625e83fc92afcd9b47e03f9f60f8417f935c966f0e441ab5c272250d5c952b4075588c6fb42afd298678b9b69b59ea9a0244de45bee3f6227fc067ec29d012a267e8086c2d72ab10be29cde339153ab3880ccaf2129e952855797e24cddaee3b98719a6a951361d15d77fedde0d6bc5ca308feec9fc09247e201ea5faef2287cb58984e35189bbebf2e7deef28fad9e5d1cdecadcd165801a3fe3ee553c25bf61d948a8f094213d10cfdc0af581e2dff92c016be10fc70c629c2ee6e42c7f3385f270d9612d8f4211a2e468714ad22fa6483ff8601df5735d1f47b42f28f78a3e8b570c104caf74c890df31ed5245376d58e19ae265b75b13b17582be96566c958c46678657477c3f7f138cf201039f55442f78ee4ed76d8d3802751adf648390dd85124ab820017e58c9a207bfd30e67f471bb0c401b50d29d34b7ca6ce9743a665c36e4d502ac8b04499ab4f47f2caa50ef8ac4a34daceac9547056a4adea981013fbdd18b525706adb9d8108cda22641f10e9fe0332bdea3a9c747ee778bb4c1f188bce800133571c7d3f7638618e3adbe6e245d9673b5127de523b411ff95623f0609acac1fe00354639d6d7235ea7e9fd3dc833d2c770016f2755d41ef43dc469c4dce81f07b07cc76fb8f58a2429adc654dbaf2ff2d54bd15c251d003c7154b730eb5472f0d6475339a2f0107f3ebbd4b016b7b93def6ba7694f786e228f799b2d7c9c6839f0498c301b7360a065789ae80fca19292cd553e72b92a356e6977822d72c69538ce7c4db88dbd5682c88ab550d72ca151c3d695e5fe86a3a1522c0b9a180e0ce0aa6bfa481b5e916f250689fb62e46a24bf84a2742f60d5ca9c0174a52367919f80abf238c7e364d55646510907919512aaa98ea7b28172f12e3ee6d7fb99cc7e38855c10fb1276bd429236002dfaca246a8b8006f0b1231cf02b88b6086c6484bb4160591eb5702ed332606a3be8b061e872a11a51b79055ca0f83ccb3a802baef27289a9892f931f06df6ce9b23efd10ca8196a3e5d60a3a434fea162144d26bd7fd95bd072bacd818c21b5b473307cbf740f7e1d693c0f66e022bb7e79eed20d909e25301c5a0a6fd708a6eea01b6be71dabdf57a4cb9ff85c17a4709f8cc6c8a39d7e1f5a82f0a096d429b17157a56dec171455d6b65d42f004e49f4ed009d400fef105f2da88fd11acc665af8d323a2978a57ec7a4512de31101724e61a21befea034bad09d96e90b9067222641b351cf91b393e3e829f7f68855366e99c84b8893e5753b8ebdc5a227041928567450cbffdf0052cf8810a2ef8a9600dfcf6a2022992ac8ec72db8108d38c7971e5443f5d30ae215bbbccd8ee0db0277cc5bf67e4c647f34744bf2abe3c08843494907c126ef9ea1d43610aec75315cf149afd2430369651fa1c501afc429f31ee0ba14b7c0601794ad91bb6347860bcda9bfc1d5c6eb78e628a19866024d208188459bc60b9d245258c35cfb0b2ade728463e905876ab93b37c971695d0ea70cc9b763c576fdbac6d36a721c269c2f805830aa6adb43a07f5d910f325acaf13143842f2eb91e2572bc1bad3f20568967a3aa786e2922b93318bcd449822e896f7430307a385b0ee6714b30dc8ee67698d535e5a7f7648de6e79163274985fa47ea502a307b40d182717ddf9cd8d871a48b677470dca5791b48b33e54378dae3af4487eca086c07d75b27fbc88489051b34b3a7713f521530ba96b848c2922fb9409d90df56493c658cde081818849b5d5fbee12195f6ecd7cbb0738d813ff9535dc422c8fb44c9bd950496e41b67befb6acdd3fa77006a60ea94f28ae9e385998a60872f4dfb4a3fe2302ab4f38eea75e474d274690b087ca5b8b7d963297eec74d7406ae4e9387d12f536133786a84d6b587f27d273618b6ba035e1837e2fdcabbce104568b1ef5a5a84b876dcb72e25dcd3c7d59d5e00ddacfff4bd15e22da7d65eba3f94d581a08ddcd79fce9c4e53a678ced55af1e8441ac6660c345f2768886b2a263cc9e8abb1a4e736b5e38c69fac03105c6b677f5eda1dd8efd219215b83f8881c753ca83ac250fc4f9528f6ebff115ed4a7756f70bd881c9d6ef17b44e20fdd99d3cd03168a478d001b2006adf54a4164cfa2c525eb3794728925e4f3157b1b5264ba1bccb6c49e237ca8665413106073608a20ecd79ee905cd30eed4b2ccb9dc94ae62cbfc4ab820264ca68cdd063486e6960343f74072ad878cf9783e67319f1ff46892bf3c639ca46737a6b78e2625ee50dcc9eeaed9f06494b54c1cfd3b203346adcf642c18ef8392aa40373abdc6c4451dcd124c7774d10272ced2d10ef68aff92d0af9c50af20597ed7d07e73e024dd66ec06abe3814930e27f049555988399c824e60f9332172615dc17dbe1187c941895304fa6cc59ba64eb06bc876cb99fbe5aabe8694ed4831fcb81d57db63813d367239a29ac7f097a816db91d19a99bd5d065d93b2bf4eaed3482edb27fd3a707c0552df4b825a8a3d0ae0d9ef5bff8af24a834917fd4d81e95afa717abfbf8263f497d8065ea1271675c3c85a78940cad5f79d04a110e5146d7c7425e10d71cf32750b653c38c153a3dcd85995720e8952b874fd36156c7f3a5de765a5849e63586c5a0ba19e5fdb14c433934626bc9b397f4ee3b57f08bf7ae8734f700de8730fa3ebfc4c872868488700bb3ff3c550d8b0ad70859a3445ad809a4bb6e5ea8ec69023af838fc59badb9b249f985c34aef00f2fc5d1369a250daeef300b91f072bd5a3adfd14a1d5b2c0bab8094940f9bac4c21f72672375f34bc3dde3f3e08c9dc8ee7fffc267b706209c9dc5baa8edda909d228c01fc010357cb54c732f97f9b0e668e31f561b0067dda63d5566587dcd8e6ddf0705e040f83680020d2a460b1fa9e610a4a3a41322cf692aea921683022218a563eb3df86432c58877f8bd0613218810f1d5bfb17b273b2c82f46ff52f0efb013c9a7f3f63b7ad671761a3f27394776970b413e35a2c43ca85560cdd3c9b407bfadb4f1edd0e6026572ca0d8274bdaa6870749b0a727aa8c5b7e9442100e0c9b0574559cb880054d9e235ebf168eda4ca09808214a6097fa6c34b02d95b28aeac52d38c1dd53c564530c82af2aa59fe5222df93d2c1f339d204208a5b2cedfefa3d0a09534cfc7f4e0b0b7b04ad750f9758fc30c33aca5fce06f43b24fa9363205233721a53e3484acd7a3cb5e6d160e01860f96484e169f12820a5c558cb53c54f0a26c19e6339d1f48ee074faf18ae2dda85e4544fae0f204404acaabf8494f9fd8c7e7611edc6a1cd416d03e57f606352ccfd3df594d3707ddaa9378accc25a129b60a60589879a2c4403635772ad0bb78de9ed89f1736cf4335ce435b54fe1f977198f0a3068722e9ed3574d1a1b8bd16fb14a52ec787a73b8cb9a0766c2f579c9b11b6a0af2919bf7e5c80e9e344c681b5c3e9aae6904c011003f4908a3fd593931316b3eac603bf93f9ce32780b64438f2b0a75fce71a4e503bc44c27b63626ea0b857f51f45d64aebbd14dd86322c6f7c87c3253029e7dcdafa3dbdd18e5c11069a7456d1a93392f111e9e7ce26ea6800ad342b1594519f8fe07f202de60fc96cbe0b8a4cf51b7a5782a96ee0fb44ca89094297081aaad62a55511417d3423fd90c63b8188f56a927f79e99451a033e1c8337928e23b929b143fac118bdbf1b556cc609bbe1acc969570e9184e9ef6bc30359433117473e2e91c34eb70c4c04e8c67aa5bf51e57f238c427d25d2cffa8571f2d3785e1cc0a827f4e47d28b2a29b02c8b3ac49c8755f7d8286b03c6c926bb54869eb60005528edd5aaf17ab89e7508f85b08301e53241216d4ae8f8fdc7bb8a32e1385bba5b5cbadc99b6828a07ec052c75d6eafc07b33458ea732fe7fbf604d4a7736145957a9c668035bc94fbf131e1c326b43656ac858dd218f82243f968de4a0d9d519166f66b0b2bc62543fe7a385108ea2eafcb997e8a60de2730243aa2414d8c48cfb05d6c92ff1bc5607262a287e4193f636ee4ad8bd14e813104ded335d99aa5b0d535eda02649ffe1db6fb2d04ece0312250b9d4ef0c5aad719e9e3903864e2e5541450bb47bd2f48b815ebd2af54f45c7c52c05c25d01e82e1c055d8c057aabd9b8d586cca01fdf596d9b0079c5a9d72d36ea92c070a56d4db169c88280f47da39e5470d23a4c688d64f91d78c4b5925d8c3ca471ab0ee3d94414a26c5e854abbdd0bf44eb12236314dc13cb05a3d1b5ead6a635c7703f3d7bc4c12d307f5bb275b4237c96c69f24c0f3c87a7f0071d3883bcf6093d4d4551035a403ee30c77f1024164cbd5e943e794af24e7ecdd3ef4f579860063b4804e008655355a922721b84fa1da5369d209c3653bf8b8852699eaeb3aca53004dd79b177940d44e72bd67b516804eb346ba84a5f560bac77e2f4c583bee73f953f3bc57d3e8b90901cff6bced442e8d4802bfb679a95c6deebf0209b0f42d673baa4b8c8cb4718b7b5e4da94bae5cc080ea5ce1f05a053d1d4ff446c265e811ac0430ffcb2d649c897354c75a473e149579446e82fc1c01b4ea0a5799c70bc04f0a53f8b9d9fa04d315f35d42963d5030b85da556160b7f5a952c835ca5003cccc39dbe7e429c8a004c12b22b24c23ef8ad90cd95303980b85a421334842e4dca38f49b41f0b0f8b820990f3c7733a49662c63066d30ecb7640344f48eefdbbf16f42d52a6aa014a59a70bc9d19f94bb1dfe514f285f22a3b4fea7fc16ad54dea726db56338d2a76dc17f0177927dfbf22ad6c261d14d63af904cebc6811ecc5d495e8311e2b078b89eaf26f268267b004d8282da3c873f7b0a43db80b94001f1fafe875ff0a0512f37e67235255b958550d09c8550088647c6b596169da3b14f8f340973eb0cf879960d2e6950860f2639a7578b943900baca8c65b1b2b0a71f0fe750755b5b363fc30da3b5720eb28d12f1fc149080747d20ae907982cdaa088301a58ec6f5d329c4cc1642125b4662e395d347cd46ac38d0055f95946381b2f26950e5b64297dea334d237b8d5934cb27b244dd2f46e92e077192e70dbf5c6640799a4b2aa4a07682c1ebdede460f4898b374e27f083335aee086b9f9bceece2c3c7f04395b34b199b41fc37f077026fad537155a4b3c445517275a80dd4cb728524f4ef6b9b53c06b841b21619e1d6dc9c2dee376c5edaa88a0731398ce0c1f35f6d54194cac764832f43309f9eed89c7cabe59d08355907ada8e69a38656eebb86bebe78084e0ecb8a9bee123f1bcd8fb4394019b3a5ff1168ee3098c252e9ff1cd5f07f1d90c52bdc4ce222484f4109c8761fb91e84003491baf3de4ba817ea00425e12d036918b6f7d94388330ec1e4d9e7e188c9b99cb9e1b37dde9ff8062792e9097eae87ad389578dbab667d6b48dd8e59ec592d4bfd73886fd63ff2d50d0c10f78344d89eb73025412aa9c07b4ce4dddb39010b9f6843a67a68351259d4e22621b730ec5bb75a571a6277688075924edbfb6bd4f59ed4863400f9d702f387a11ea72d2372cd6686de0f5 +0x9ecb44114c5cec8af0b3a10498d7cc4e0e60fcc3b5bed7d5f7df23ca7269ea002235f97062a6ddf3d8a42e37e48122a8f869007da8855da0bc62468b53b8fddf +38248 +0x5f07a4bf880f45f5e251d19d4652878a89a18edca467372c124083097a49e5a88e7b48d733375433e221ed9b4e32fde4470974cede828d37ca8a528f0a32628ccc02f21f8e8f12a6834f316338ade42d7759e3656ce2542c06864dd3a0499493e144a97fe04006b68c83a5dd4ceac3cde238e48895ae17728fdc7bbe84b6022694ea75df7371b8ccc76450f2d112222c504f7d1fa20f5b712d33e436fda234abae9c5e278d4bb14efa9b3a88114c89b28946b813db2caa91a73391245435b38cf8016d3f77f678a6eed06b8852c181c754c49d4a882e8b3ac7858971d296062f37c2a90f7999953a6baaecdbdd9891d37a7133adf13c87d453d1d403bceeb5fe36861b80da5c917439d1c467fafa423ec4f682245e7f25c714be7bc45d64495fbcf6c978e468f3bb1feefb16f00f1b70f7fb9298161eed7bd2f5859bfc2149bc90babde0dde54376e6a99acf09fea4d1de276cef62426759551efa6fe04c3d7c7b79ffa10efb0a0f56a9a7798bf065ca402317138a131cc764e0e32a520ead0745db95a1bfd0ceed37972dfebf0ce7c1e4969bead6b8932ec9e347b39a8f22c5b68a89ca388f1a78511a3145ed7bb11f9329015e8d5a54f74ad02ef200f6241e952be303c05e73186cdbbd365d644b4d15845056f920e888b04fa0cfcc6c397aac69a933a06563354f81d8b956f03eb1324e90b96033d64bc207a6324518eb41c1e9e54421ce7137c3b58bb6224711b5b230c9710bbaa6a64aa14703b423c1db9d569e1d89be2686901fdd1507904cc05cd1046542dee1030ec48c2a61b443b00856dda6205f088a7e66d6be4ef47839f9da497d4dc70ec9d8197b8f94f4fa28ca91a9c730d9a1ac54337e9a3e9a1c8a51f29ea1739cb5606e481f1b950a6dacaab10a68ff547952dc2dde8f21aac01a2cc20db9fd865e3098f87db4ab1f25a2715b0871d6f716e6dcfdfd863d4eec5152f19dad33ac92a120d19f43205ba874e739accafdea02ce1d4ae368dcac29978b2856655d37d81bcd7d8cb13ae58088d4f3fd5cbc56c57467bd991b44ecfe549e0f41cac34eb90666a14ce442e634480031030d5b63e53e82fe2689bd37f4f0544d65c2ad1abccab4e8e8c67f854d1b339ac7c62138ec9635b4929891b592d3758bcb3662c269cf7ff7673e3beb526834d6507058fe62e34987e632068d6066c970790f2b6f487d8e79d133bc3fcb99cc8ea7f146dccd8c8721293e66e8e60f17a579335049e23dab142e8f4caa4115c36ad23333fbb7fbb42763a4f7edad3729d1d38c1977be759c70873931543b44e111db1c6982a7979b449c4c02c53c47c59d8d01cd22648f2a36e319b364418eed2cc9962f9a26c8031edd1ece971ba5b4b1b179b6715df11d0e4b171c03db5bb162a588cc6bbbf6b35d2d02a58cd3bbbdb446de1a8d30053d9fc61bb2589213f35c76d9891cee8974aa95e0cdccebf0aa4f5517429d653152925c0dbf8ced1e7cc14473aed647e90ead1ca08f7eebab4229e50c76ca85df238e15d589c675e4143a183d83c04f7f490dca2a33ca5b564cebfea5fe3c1776793cfa5b592fb0ce826ff91f4f038db1ed72a76601d9c458913ca8ca211aa35e1c44128876ef28429007ef015cc689e8c186bc3c41d3ae19d9c5ec63288cb1fed44d66422a2d65a904ab02cbf032cc8d8eee10953ae09f01eb2dd1585bbccac069fffc72bb11ed6ca7023b65546fdd061c55ab5735262178911d609102cf750ba204de0172c44af141b5a1b8d0a444bd3361966c7ad0bbe6913da0f665f03b48480114d5976e04a29a6b3caaabf98a189bbad8ba5104f6b3b4349970cc45a3dd23a1a4d87236a1e679cd15242f9736811b09792b02ea5847c2ab53e57ef63533fb8998f04a45ab24a882330fa2a6d05f7df682a6d4ac6b0a8349d73fc42c79b29864f70769c3aac6ed339f514d4de11a8728fa12116fb765bfb72c64e60ff8c2c2d8ca0415d7243311885fd478b5f01a0248e959ff5ec3be3d9c5a3e2cc639cc408d18cf97a9a3d3dc287d7e6b0685c6b5fd5862e69e177ec6a16ab3dd7ac436db2de9503762ae0e15bc00396d6728886af04d15105a3b0e226e63ad4352226a5b5d466f3c2ace4c86ebf1ecc70062c7e7c9d35ac4b8b8d419aa4d13a477dace88c73514f02889f5f55e577fc2fabaecf52fef1949e0143a72fd30cd491074cc2913c12799856a712bbd3ad9a47db95d5ccaab3ae8fbdaa7f71115c27a4679cb08e9ef908068f628f0afa3e4b5b0e583e4430ea5e9318f836e8b03dc7f417033ebefc937edfab7830bdc98873fbcc9c65542204394a9bd35a01603029f28e16b9bd05604276334e846ed24aa88c9ea8f766eeafa308ceb2755581c1c232354dde0329ee078caf5c0678a4c35d9fed244107073b30701a2c055f95613535c52f081beaab126578374375a1a117a83084febefc4575f31696867a2b9cd77f8620c481b81617a34656a7e069524b3811416cf94e3cc8144c88755fb4e33d7220d99fbf12bd6bc86230c0435c557cc207f038407dafcb5614785e5ab1c2dbb00daff63eab1fa347846c19090b3930c87cf7cd1efb1cd43b06fcbe05b2ba46aba51a748ac1ab32a2f55f0ecbf66bebddf8feb80f56e29725ac7bf0db2847e2d79faf772df6eebe5d6d803de69e6c1254f44b757c01bf78b87d8ca36592ea54c655e58a82cb689ae9357612f363c858c0078481ff9bf1fd65e285521f731ff0fa50433b43bf975cd8e5b72a7d06ff13c19b2069f4763889b0841c697359676bd6274ee5cb33f978af16b9e0ddc87ec7cc37b59a1530e1c22adab8660bb64f1a0c337f3693c90d72ce1104d2b058d6093265aa9ebc4c8c2b273ecfe4430a357fef1d4a8a280f51dfd88d1e7c7f08834ca69d75e4743996295858e950b3c5c922013d377d1247551430e36d4aa48805069b57ae07b788ae5110919b27c8896894e52bdc7bcd3195b479bc77c9cb37e9cb831cc974f0aa2316f2813bf61bc5924d0d619ff2c33e82351550d4864d98800fe0654ec8da2ea2ff70906238080ad4bedc66f89e9ecea91a9678f9ecc64a964855b9a45fbe768c7f0d57946a17a9be6ee4a48ccbba7278e96f7d5e79af9e6b09359270b638226e2a4b3f5908e552add1b8c2a306a0ca800612e688c974249cc712782a78b1a2c6659cc01690eb76318bcb1a01dbdc274d15333cff38be7d9a067ef337f3b58803d58472539e8494c8019e42ffb7e7293e7b22f92863e909e14bcd6c3fd3de42c4de94de968e5b2f0fb7a4b613273c30e2cc6493aac77e4a111ba06b988586538805306d65ecd9a5472260ebd2a655eec86d9aa4ecc008be97da7a79d875383aabce099738368ab82ce6656cb4c1bea35df317956509f2e7e42cce0f864f7e78cebd62f48407d8b81f5824b14fe5f10f11e17dfdb9f1d75694671da51860c39e5f47eefdefbd6e259d1c2141fa9f778292bd30464214107b173debd30555a20bebf2002bc1d395913496dda74b6acc9e5eead0f793ed58d5eaf5ab01d39a8451e34048f6b0f6f97b544cdc49c8b46ab2b4fed28a25e9fae79e42edba19abf500d3b71bf713840454aac28fb1e928dc80536da7968e9691309f9a36743e068e894bcb1ba58ff730bd768c7a6823249c57a8bbd275247f96316d6ff7c8c7369b5b99f0aa7a7ced2906660f2ee51d2414d9236de5de9e01747a9638a4103bc8a6186ccc5aee70c237dfe7cf1fb12dc3e06561f8541b31d8d67c8888edf30219591032b29f99f202f79a8a40bf44db70898cd2efafb3a64226a7e2d517e9b0b50ef37a580ad5774be2d6bc089018bcb67ac004c84b4061e9df9d03a1c44cde385232a2010f5986f98414fb8b34c528023eaf55f6d949db4c7bbc897375c4d0ffad5e48523f7e879845c5c74d1fa2d3e03f9b650fbc2898c68596d2ceaeca3f978ac6ebdffdbd2fa4b269bdc2b36a16dd0824b0877675210487ac7e17d1d5807c650cfafeccadb5ab54913d909263875522cba6e29aa7ea72ec7df9f3716f3a3ae6a0f4234ec8d028a6acc51b2f279be51a00d6958b497b8e3e7bc4c6200fc34f6a237601e686f589234cf2e6fc3ecb095854ce34dac25ad308366d24402fb22679f4df0f16609c5954c235688c11ab4e5847dc351bbaeeddb43e617254579d4c90a5cd9f610e4b25a5dd0b345138a300b45aaf1aa09bce0acce43054ff0feb4e48a6905758c8785aa0ddf2bede2c48ecd6fda54a0bdd6ee6dcd8583092c10297fc87e5bb5027aa84d0457a8ca555134f4aa16d67d00857fe4e7b5789a21399b646ba2c3009b46810beb40112295b88c48a0655e87f94ffbdac5dace4bf60072591cde259c7e727aac6aa34e3ec981fc90f6cfd508d1bfca180ffc6c64d4ed1727833969d2d586f9f7288746661a35ee96575c2146af5a54636c233a2de289f09647bb78eac50b68b5cef4e3e2b05bc92069152b8abcaa0286845820ed495b666d116c382c78882eae03f20cf9b27bf5f7d401db1b1f363a4700a206ee30ece276885592e01685b3aa708aa9f4481edae341281a4301866570880ad476c0c2ca77557d6e4dc68a5f71bdc3a31b9ccbe0ab5893ce488a23ecc7c39772ce206787391fecb5bcb1209aca91a6e0b6d30a6f19c049e073e19435155a51c83e7a6382848fab4d75ffcecc7f9439490d1863eff32252390c2f61aa21f440bf0df33c221f4dc120c0d71d5d566f86c668915fc80225b7bf5b9b13b2b53a6d3d85b57cced4003615e56194b518ca95400e6685620e727f5ca74e31b497d4df2bece8aaf0695013132bc7bb3c8d4c6c9d48c05d25dfb0b2f73a70431a90699e728bb34fefa7e75f04dc2e1a5b7c9e15c75ec7707a3c8859785a28d14b68a1b3f8aa3ff233566a22cf3ec03a78ae6898a498a245c7eea27bc6509e64afe72625a791b41b243e84645c9aa5a2fdec51fb1e3d7a6575bea520cb64fb83aed59dfc668739532a26db2e933705da50fc01481c977656ed713a506edd67b7b0f9b1411cd5f620add817875c5f076bdba6218785ecbfa296d20814970509871d1c08fbb3c4140d151ae1789f58d3dc04b459be43857cd0d7a8b8732e220a7b5d064a32129abb9fcab5e108446b92b535ec50f73daad6691abaf1761c7d911bd87f20ee219f12603471be3f33e06c7fd518af395ba3f5f4c6d15c24475ec7f0f74f3238c81d42d7bb15202554ff88c04cfe1d8d85b700f943b5a085980cd481203d2717ef5a728cc86bb1c38f0f0f03016743f9a32f1f01f82e66a1f7d1df56bc13a7947e9fcb08c1391620cd5a28cd5e1ac8889d537c934f0456814df310f834975cb65d3475d21048fa44f426fca8cae1563f5b6b3c37affe172c80bb90eeee92eb85756197721b600338eebcb31bad829228c6bf8a7580e652aa7a7187c054cbff09ac6e5a714c48d903a16474af70c6264ac4978cd62b82ae04215d1df7cd0c3e4beba2e5560aca25adf76667ea7975baad3e3a6ae1169bd4415fc7781ac01b50521b4761a9bcac8f3fd709b5573157f55a1df14d1faaf86b691bf6c3b197c1de2622a3f5f3ccb7bec02896867b0033805847045d164f631c853d332445b9c690d0eafecabaa1b35b38d45501e04fd302afa6bbc1506ea28f9bacc6c35d8ef20d5759a20789a3680db0c28e4f0d84fd2468215da2556d7e6bb652f7c9817e0dfec359d6d5e53a9e7d2eda89978a097a8e8a9f3427abb6bf59db160e5e39f1de0a1dd1e15c58ce1c53bd048d02e04412e71d0a8679dcaf2d0014e052a90e4f2eda6ca80cc369c7ab366228e4b8969f8cd82a499cbf70c28f0968980cd38700c515b8c89f33a18d13ce272ed4e03480b208b744be22ed56af1be02784032d6c6b640918e2d386881cc413fea6a342514a20cfe334caddd253df8273026286fce86f68801ccca2218dc02e81a22849791dc7770e45dec7a044fc5865ce181c1603dddce897457dbe3069819d0f98d160f3a6b9ad3a8634274a1b6ae52f4c772485576e3899679dc9cb68133b371a606e94649ca85becabcf2ce4bedc6f271d8c378425586b598ca82764ed4460d7800bc7aa28e7f035b400b4fe5e30d4d098b8de0d09315544d2c50c06159ed3f6b89f55206652418cd722a81252cba76f700e459922a99e50f58642f69533d8a09092076d5dd296179d9dd1c7a0932f2e2bf833d179a990a47f5590db75e9b6fd914ca33a164d36fe8ddaf7c65272b63353dc6f5c151a7169f899bf5ebbaab7344236f12e97ac6a6a303fe2b7704f82a66f24c2e4fee28ac6e6b99726715d216e2cb6bbf2ead87a830c3559400011dcb00837f40e3deb23e4d31fe0dc9eea3dd2d535c72d17b8ae70ab25260c0ca20c79a57dcd84d91b84eb463262274b385389c71cde8824334d5a95750fc19be95a28ce5e15eeda5cf402c85ae5b07f31abba8ad1c8ab1b33a168508fdd08b6ce0ee50c4293f34995bd51e0ff301e42bc8c8ea4be4d3d039ff0c366d9588864396fdae591103c2dae250116890c1a9cc1402d9f4935e7e55e83925fbd47eaad12c62ce3b354718e8e753af261414c96290dbe03dc4750c85aa2fec1a173d599415b068e112739741ff423fded975b37da3c6956de4c20b47a952f16efa5f231af768e6d11513ce848ece5be96d6f088bd145822b70d01b2a6a34ce50ea3e97c425fec081c9923f1f1a3a7bdc4c5b28fbadfb0eece4f99c8c6157db766356182e35d49e79bc8969802629283e02d4a56bae3 +0xbda8abf3e35a759b9444370ca91c0b845a93de37d4bf5b814bad94c6733fae356a3d90c779a4cc9decd5722a07373b8edbc42159562a5eb764962b9541ce784c +39040 +0x9c8b9ac56e6653fed43fe530cee77044ab3ceab021f0cb539d8c0aa0d8b449ffabac4d70241bb072d90fda237c422da8b09c80cf1bf8cff3bd2b302180420978100c81d6ecd934b1be802b42e8a70be95f3e8ccdbc4d2dc390f02771f89f9fb372b31f3def2647822a9bc0d5379e72ce5f2cf7f02b764f88bfe2d5d8695371757aaa10ee558d51aec567812494afca21596ea78191fb9b0df10923a0fbe4e989d0f83a314593bafe38ec577625637ba8f40a86c715657b19cf6ef90fd5dc6eb61ba5874ee7c2eb372b3228151241ed2cd90a7b0ce03b56730118406f20c367c303bade8c64a14a244542de4784d28974af756d96190594e42e0fde06031f3e79323e2634e4b8408c2f235f55a39cb54a1f5446afe94c9c34fe5cbd1da77a5aa04d39498e8e90363691dd95879629da74d1aeed9d7896d82b1b06c3fb345b2300ffb42ee28bb092eb11796624860161bb6c8b4aa8ed6eaf902a15daead14b0160edb5bd7803a0bd735afebc769aaab0e799f4451a7159892dd692e930a6d15c89c247de971de9209612747ec3fbae31c0ffefc6392be1cec8c484d816dc759c44246f79890112221ce2e39454d0954b0d4787b54f448de72a9ff38fe49bbf2957bc377694d8a32acc7154e57142e5659818c1faa2e3e53a1b0de8f5e20a386c8a31a6bd01ca25a26f68ce5b617928e9271ba77d7a31723063b669f4585267cba72bc43718fe1ff1cd6e5add6e9ce53e83f740272156bb32c94481738d9ad4af74549aca209d197fae2cff54ded3a5cc745594dede7949a6165c355bca0b0881bb512f5f63ce9bb4da49c5a6fa48effbc2ddac8bf8c2a2f512a88f9257cd8aa742cd8cdf27ba2ef8186eb4bc0a204b3334368f17b85a508885d096017c07e28bd26eb730b58859b33243d57e568641dc930945686669dbc6377c529081e2999332dcba3c5561a54dee6f2fd425a05a5ea7fdd7684a16c916f053cc28ad8536292cc09de94e6d992e159bcaa7c1961d2138bb4cfdab8aa4e277fd0baf491841b486c26621ead3bdbe6f6eafdd7091138e0eeaac11d3edf3919523170f9dc5439c09891fcb6fbc9966c391e5607bb9c20bf033008b08663f8b126df92ef1b2c3487dbecfcf264fb68cdbab74162a35b401a83e4f53931d0f37b682b8f68d074922aa087f1557b59b9a7d6565e9c42e71d9fcb2a151bc3bebff480b5c4db8ed5d91571036844a15d0f67267bfc093cb7ff9b538fe6dcae85b4a92afee1dbc8c88fd4e7efc064698de0a81588a82dd3568cb9b776f8f074be8815a17754ddf0b51ce55f9d98295664c3c74e1cf19eb93b4b57518fb9fb98d190a69eaf9c56a92416d3529d6e17da6a2f612a9956c050ee9210dc2ab8529d5774e87d1836da54bde40b6b7fa094781699f2259e46372ce9176291e86299f4c89b57b74192dd75cb3b09f4b4ee33a1e289e6d98c4e67cfa331c92d39473621ad7a80f7ac6ed49ed4526ba8cd857a0a6675dbb0f3edd69ba587b108add4cbc66e98d098c8f9544271e08cd23a24ebf40ae43d3655930823887fb6aeb6a9af35848cd32517e0d0e31c5bfa1b7b4aee11586b87f431ec80f9948046a9d4247501a7bd152729a3def34c2b4fef114614c4c76248551938b580823fed6496d391bd10a003196eb0d31589e4eab79cc4d480e07f0ae36c262a4aba1517796f45a9ca87ec196667a661bc4e0f472f6e45c1f83bf82c29bb3353daa4965152dde901bc55d7e4b894e2ef4a110101911627517d2294389276ded692ea4a278b533c5df50329e16a86f4f0516b6096971507f7a24ca9bcb83f870715f387167d7fbe031728289c06be6af964c5b472abeb5648ea02cf34f565ca89d649038ab3b3fc95952d7a61179ba38ee6b863224a29a0b9c6fd6b1de49a17c346631600c8807689f1ab85fd07bf3d0579ac0321ec3065cebb8503f4004d0d3808ca552526759a54aefae1bc7189a61170190afe2c9013fc5a423033d2ef197c7ff7375457f3f68a4fb4043bcf9b6d277c97e11365d949c705bd6679c6f0aaf52e62330ad79c099f366f63d78c64f0bbf1a12c0e327c55b3504f1d127712503696a3ded51fce42080585872c3266ef4371bd524b1ce9e645cc7fcaba4d9497b53b34a13fab1b4e593f8ef4a64c1197527f54ea567fb279f2dcd805cdc527fff5ae8d20a703f37d0746e422e25405b76d6cf06accf5567f5f03e054c9782ce77c4315b397b5076ca6ae3d984cc4b39df8dd2839faf85664cec4211e39d113ecbdab76f0ae38977b9be7f3db52289bd9894264fe8d0322c8e6aff2e89b5a8d7e3e4a295e46f944487b969f52aefa3ee8933f2f2edfa05c2a1b2a0e3a6a9efa2a72a1a562fe919e51aa0ca894afb40d49bb25ef218f4a52f6f0c4bb8a23f8da600f346385417bf605cbec9827c0d0978b45894d9d088bc7bdec02936e5402bebd4894ec5b9c12fbf335a8f672aefa6e1bd6eb92e7c7cefafd81561e4d773707a0d325b85c7b1110a89bb43c0bb67be179f3cf87a8699e8d144541b4be1a2055a913795ffe6ae0c47452a0e16973ef923400a774455a74fec09c681f1699391934ae023bb7f7fc8804fef18ef263c010c8a205e14516ecb0511b0b860d90fbd2e1e742d41f8edeebc8f5288d6cf287bda64c5d672e2b50526435deb2097de3132f73ddd1abbc02604ed9b8650fdcb1296b54307e77046a556871440b70dc894a7bc8159cd2ec0175f51113ce715ee6c4767e018fa63e7529ec51cdfafa1958e965589c9e2bbb46ad5a3fdd022805731f561e531342361b404e5bef190bd0cc906a99d56e1c966c66ecba76a89a6cf0aa88b9a7c1c187c7493d0429ee0c8f7eaffa2042853bf9cd433b15733a5ef1d9f69cd461e3aabff3a506cf00d292a1c9c89270866c0071f3c2b3d5552fdc40b973f0f32421642b4ad45a20f67f24a4385ad21ef38ae08b7a55e58e8f01a8b5f9a3339a70e39476176795be9d3c492364d727602c7a72a2bb7d5e85a3582aee2524c33ebaa2a20cf3df47dc47a2669bc9de10f893b32d5451b97d6f148bf935c6492e5463f7137c6a9bff1e984a0379c1d00d4ccbcd871cb79ac0bf65259a4957b0d3802f597f20e62e1a0a018ba659f74d9ad12701f6686781d6eb07ad647543dc61266f323bb6e116271315efd598d4a7483a582921d3ec1f1e669e9c0e66352c45db9629df9af5e4b4be37ff07c2e49d73ccb18b6fcbbfc305d67c69ee888630fff44698d1399f0a318ffa31c3649170cc2cd5b156cc4d0e3baf43af9b58c18b0e24f317c73f47072bfcdf107f0a85c1bfbf37236d623e511e5566d58b53618aeec21e2f2808885c02895923b1011c10ad18485a1a09ee4c2c5d5864350500c110704a375a21dd8963b9fae40004dede32bcabedf34fe75fe44bbae42eea09be21a3e9c8f417a10fbe0326c9c26248aaef00b4377f80a3fce494e0cdef7f06e280c18f6c7c568d6f8ff98f4d9ec5d3d710a903cf1568ceb39bdd8c99ed3062cebc7dad9a597afd29480176f7eb9c2b03660a1d2d6b54a2048869f0c0beaaa7e3332cc6cb21d17abd74bf80514f4198b04da852cac7c0e87028decfeaba4a60c093536d875c0680ac94883dd22072b75e4608674fe159ec86fba06c6096ac17d74b85f4477e869967360ff203059c017dcdaeacf51e7c28a97f6378eaaa2c27a7da390d93efee3f8dc79b6f5c752a019f730fa672f5a44758327c57b18b672aa2bde11bf54689ed70c7cee856e5a92223a4bfe641fd6eb323a36f9b7da0c99b686522a1d419062dc0c52f0f7add95fdaaf113eeeaac37e69c40c1b6a780eff4596e5231b8bdcf7afe3e104740c37cfeb5d6b012b5689c6c12a8f73bb7a226b00648043e3bcb624f79913712414dcaafa4c419146ae908be373a948d369b2a68ef70cd39a5b85b25c37cf812e4c31b8b2857c346537419477a741e4dacd257999576f1b6bf1b16a88c4fc7abb3c9cc1b80f0233b17b02ab24cf3f8df72ce3a9c68d93637c05a211204884a5f26d868cb7f2bdd651013c9692f18a8c52105401bfa05ef3f51fbf72cfcc4e4afc6658e2553794646d51581e6a180c291400e0482c98ba12ffc872543b5642b100af788b3ae56e272ff4bc0b5449acab6585ef45b47e8e0ac286237e0cf1482127d1504f0f043565bd71d225f78e525c6c26e9c10059c22165e438b9eba248e4995346f67c9dd0673f500134fceee682526b3684b8313da010671acd80732a407dbdc44728b62775de1ab0ff0a7251663edc3e56830ee9cfed993182726bd67efb98310bbc5a22d6c156494fca207950590269ff09f9adf52101e5a0699235e53d6bf50adf8ea9d4128c33ece4024787cb642046f3f9715bd7279fee0ff12dbf68be780c3a5ca4b5f644d69eff20a355bb8ac9f5e9171d4a3594c535098fa752a71a21d975cbfbc297079a2dc380760051fdced2925a9a0863cfc13d02758ce820055a3837e396431d5ce760da2ca6d1b74495a697cacedd8a60f9cea0a9c2c7fb098bf328ad5d80b0cc2500e92c1d1012e788389f6fa213d2d0d7b08b35333761ae1ad0f13039c076debcd59b86c1058d6f0d525352fef162a6c1aa6c20c5827a7b70983a75104d9a1a14a795447cf84d638eba5b7acbbe636a2186eb7362ef6df8f512aa82cc6d4208953e826e35307d4b72395eefefc3fca55e0aaf35f1c563ad1108ea6153699731a862080ad4f643b0219705ba544856dee0ff616e5a4d83232d40a21a8f89c01cb3dacf224092c718039cf7e2e094989d0f2ca82785cff6e1af8479b36614e551206f80bd634c320e8010dc6f7df1eb6a535b2d675a92e36f019a1736c254305955e9c3e4246bac1700ba5e6a12a577ce14529836c1e07356894a25aa8a8fc7bbbc103f9e6b395cbdeb6323da87f96350bada909ca2ffcd1db15e4b18a60ed2ffbbab9df320fc6b87a9d3d3c7c435d879adbbbda2e5381b4ce09c3087fd197aaebc8484eb2cfd01fda2d21739b0a1fdcf55bdc84f72d3826c7dce7dff79f7e64f26619d8f758444a83e2897393585fbdc1ba859ac31182c04f2bad98901f2406a610b90e6e4d95f0fe69cface3a28f928654317bf0a4f419ca629ed2b7e50ad87d54a04f8614378bb00f8e801a8d320399c57ab92e6bfe8bc01e261efd65a572feae5a2ced50bb832f6020bd965ce989929acbc2dabb14aed6bafdcddf25866e908a6116f267a46fe2e83085e5a6188d0720af396436d8fb64c5606fcba92023e9753f9e33ed64ba612428a986fd41864e139f8d7943bdea00ca08854164f51b5ffb504330367eeb3080937908d6e72dfdd0072f888635f3213550aedefd97ed6a894d8665f7758ac7a9eb74d9a78bbc9cd290aff062c3cf4ca3d33d02b76af29fab81d84394cb019cfcab3d77f3a1ea81b7a67f6f5e09a6e971fac04b46f0d375ee87c96782f1f836f55d33725fcc1062ebc32e43fc5a429e3c51c91700cbf873aee9ca30668cd71c207be747306cc6a6eb612d2cb237fac17f52c804994eda1f79027b3ca3fe16b30a81d96509f685d4332b0c78144567f997884d82651c10efe97c2cfacfc83f921ff97a6a611bd6615f6b3cb496f4f2bd316cba1ee896155b6ca17fd94e6dda4fdd5d5aa5ca2f20d4cccc4e60beb92372b96aae38b85f5fe86f3ce476a4614f32cf27ead5a9b2fda507a8b21af01482b0bc2c8a7e48da692d8d88fb51664536f161e3bb488449e568ac8af831df99990da60cef4e1e89b981343014e8188c09e2321b4c9cee464086080d9153e1bacec003963d36ae0fe989efacc1a91fa830abcc290f314c4ac783b68b0def8aeaacae515304b67bbf41ae3c599212f01c53b47ca783b422d9c2f844adde634fcbaaff1bcdc64c0c2a7a7496e106c44e7aeb82e0213a740655cb4a1ec0735db4b05258cf510265e3d3fc638bbd802b6f26509d72f0a42f6b4158ffc16d7d4d3e4b3b31e89749a2774e30018769aeb6f6b13b6ac1c04114c64ef49fb92f4ca060febe20f41afc704aebcdc5265fd30559adf471390aa1e2bbc11690827081f5a14d538c7e36ab6dd35f2e24c51aad852c6f2457652a4707903a4778a9cb8dbb93a9a3fae374c6d9b4fac9a6f0148eb4d3873383c2b990f2082cffce9baae070aca627f2c07fef62445128d233f80722d398ba6cde331040681bb7f8c4992ab350c547faa192759625f4e42d1d1fa73dc0f62199142155615478f88dd110bcd214899c78e36709c3ce48541df805df941021f18f010ed0d331e749f43d9c277b8c658df422681c9991ee213b7145109445ceb2c521460324a4c924d266b5fb0e1cdba502cb101e763538a3fbf5580adcd63eddb1f1717cb411a1019ee8d898184a7e7a0b69f99ff81cca84d610b8fecc4614eb0bfe1bae300d0178c0408e8f08a9a065a47b7f018dbd162c604fd29cf119c35309a3af07f6fb6ce2ccea32508d9ef400346c2af3a59a9e0310ff4f45c9d5dcbe518ea61a976145e84b528e8ce5aeebc251d897d6de39e4b16ecb8989d4eeb3756a2b8b668fd31ee19225dd84cf5dea34733d103ba61f6cbfd0211be9a0d90a20b9e6d97c5ec56a7757b0c9e8993091cf2f065e828bbfa876fb9c70e5ac392348d76d1abc62bcbb11f29fbe28d1ab550adbc0cd5c0d9f2a8f379a12fe5563a146390ac9b76a2d8339f95f34b61742b6600ff8d7289a3265512aa68ca43b0d06b1556c60eda3ac5557e26bb810c87b3877321b1668b02ddb753b4e4867db79c602c2ee7adfcd9d94143431d2d963d94db8f8a405acedc61f63e00dd0c9955e51c2f82d620e3685d1c7656dff7087c1889dba302f55b1bf8395bf41b03a271f5c7a6b95c0e97d099119fc6ca86692e85bae0d2bee039a5eba833f965 +0x64fe3513e438e5e0a977586a1780d30795367d6bd622386b4fa8cc9a91a88bfdd5666a5a39ae2a9f7f2ec67943edfddb42e96e5ab81aa0cdca312f9d60f8c9dc +39832 +0xeb2d8518ba3168e2431f40ac2addf0227b1603f13d82e12b4b6849ec5f61fb3e705eb53a3eec61702bb78d894c4d1b2bc0253a1d40e095acf8ceca4d95b41d83a0cd6e030a0e681708aefc4021e60d1f84f66d95a068092aef9860ab12743a17238196bd471fe49e820d7418d02f2fc6718f85a284a3a66cd7cef550fe28b9c3a28216ae1ca53dce42dbdf5a81b1e7e72dfa688a1417d43c597670828059044dc5d9d71eb22ada6ff020244f5ef29e4c603f00957a4efc601d9ab88ac08e827d338dc0573035254934e52b3c8c7cbdbbb364330ddbd084a1ca41b7b0e74f9b1d95a6b8a0bf4f8523b431dc6c36d7aafdcd73eb386223d6c70874543b1d25b7f3922da94087fe62c61b0c1f268289cfda58730f6034d1589a813a777589963ec9d3297a80afcd25fb0f7edcb1981c9319f96d87cb7c6274e2da9b08a4542c9865ffa213a8604134883890fb56a1185d845a683bc1605c9166be9ff011a56f2e8fbfa05c00c1e4f8354049645dc50397e1236c138c084916efd34f1504a5e66611bb2c3dcffb3dd9ccccb2ff0e2b67a8f9fc82f7739db06d45c1b260c47c19a9b29a4d9e5f35d4401387d1b5b0fccbf8948bb0cfbd471afd3031d0b99b51906039050c67f6983293d416b06c8d5fb8ef7a7b0083b32d0e2e78cbb209cf4cd4f16fa36f80dd4cde3bd524570deb7db5f572727afb9d781468e4365f36a9976cc61c1d81d15c7860a1df57cc81137e4a724518251fc34fb4133d1bdf2a7157e045081a4742ba44412cb95719ae4d89ffcebb1709d86cdb77974b213bcb6fb7b9d8fa43cbbc41d908432dcd467ee1c65d719c142e0ce144e45dd6f17a03ebdd7ee6bb401425375f3d50016159d8165eebc3b0ba9da46bb184cba632a4b92cf1b7d714b82a67e5fd69bafeba5ca33579312dbfae5d89504add4a828dc2d57b1cec12ca53166893dc13e9ec8156c9863eb815909b76a1d839794334aadb3e2085a601a8badf128924c345935d503151d607e4ec27f1d64da3e01c8230f7de63566c0b75958d4b0efc0136baf751c3de69a7039bfad50ff5b3983f35c81e9c8bb4c798f88b29fd6b8c56242bf66167741e1ed865bd2a341a8e2b1215195960e2c93e10fa45b90fe9fd4977ac0388055d1df6cd1218f82c025f21ffe9ccaf12aebd59dc436b4869ce77639706c6cf85df8fb64969b248e1f54c006c7b88299b38b8a0629ba4dbf362212aec01e63dcf439ce7b43334213a3d7d52c391f6cee1c8e19c0bca987c95ef2428df640cdbccd16b107538458c1f211b9e6bf4bda6cda660d43f97f03237bba8e5d6f9dfb062d025b9f6408e9078e84e6dcc6c86b947195ed067cc5406c10fd4e83a8608c47a8af16b9e13b7352ddb3d464ec0f910386a0319e92f6bfe1b33d0b974d42e1ffd45f8acd5786783274211b159babdb286e276362f89de252d6fc5e0eaabfacad14a6107033946834c65f13655207ba71bc7e0af9fa15480e00bdbe506d214cce0e15501901cfd3c858b065eaabbdaf8dd61680da34176191a4e39512f13232d1051fc24e5ea34b6bbfd78b0c05383acb6fa37d7a22fecf7c48208accc34cff54be47df7686a92fad4046eb500b01dcb8dd8749504345d22c7ed6f7c47fec22d78e001028266c00fbae610f3d099515e494448d0301872a309d7974b0739a1dd7f8eafce9ba466fd53eb87f499d7c76bd486db0e90a3d281748aa7a074ad170b4836b0e21cee2bcd895dfb40c43326fd15e654da8b9d25c4ef4dc804f621cac1ba202bc66b0ab7864282935db7721719f4acdbb989cd1575616722fef55f6206bf934903f2c0b33068a478d5dc5f41c9591f9a35f2fc489ab421dc16d92d88e33ed9322018dac7d4e209d2309ac14d142c88b6d52ff2663ecfc31fd40a54e45e20380da5441e9a7998f9c8f4585fe203552f5a21a67718669a9512c1f19c1d824bf9021be056d52772be82ab8002a99cbd5caca2c053061cfddede64f4ccdb54a8633b0953481fe6589f29dc797249e94a57d4dfe54dd767e0e8aa457caec8de1fc0ddf705bd21bf32e3e510ab776bf2e567fb617e2f33502bf99fedf2088a279956136d5e7c83b9e8d3ddce7ed9b7be77d649aef1bfc4ddc65ae5e3bca3c937fc6f03f4c64fecdd62b73a9e5a5fd455e6eae550a8c62f189953a3af44472e173251d513a5fc043289d72308a7d36bbf1cecf8cf090b1f098d2b01daf0bb60ce2144b253634c74c0437ac195cdfb2304ff23a9b17e583ab7882c28eb2ac90864b392c23b6807e48f79e93ccc349fa52d79d921806e73282a739c406a5937cee2ce812c531cf5fba8146dbb3644899942715487c34125926a37c470e0e4ce594f5c5b1923e8dd6212fa4c66596680a549cede04035e362080baece1d4355652b34466b0343289c1d515ce66bf004b744c7abdc0c72f6e7973e65cbbceb39760166eeb1a0d63bfbffa4b3de3f07cb3ac525c39e2971b95464ba25b2556c6592c81c2317e36e448048786df04734080f6645c9c93fb8a722e10d53247f5d6635efb288205381cec3987adfef2cfb67af989622cfa7ce4cedacb692a4a324b7e9d8d8824d69a727206ffa8e0d58f44685ec9563340a19271f184458956968e72913eca601be450a412f95fcdd4385414cc2c20f78cf3fa231c41519792a80507e316d67ef99f1d48067cba0f17544d44ecbba9c107f985ac030c759e27f019043b1d94c69a5240278991a1edc76a97c1667dd7d8d83b9bd34dec99e43df63233405ced8026852309443ffcae0c039a53e17b93862941a561a3eaa5b2fa43b95a9bdac7f3c4c02db6de8eb39b0da6bdc105bbc6111f94091fac0c8150895e1442f49f0c689d8cc6f50086aefcf3db6bd57b4756c2e4bb31d2115c160610cfadb3f1b4a227d970568f5230d519e52b0955eb272de1a03e834579e24a1cb81feb753d2073789ff5454d7b9311390c1c000afc6131b67aa6693f8da506d9a8d5354f7eeb65a317a1fcf524b748a59038b8bc57ff4c889b794a87f5ad33870979f50a5d1e62ef6bffe14ff4a563a698079933a40865a12b428ee65802b76c0293926e81c051a6c0945d2594644b824c100c368a85634751869c245ead7cd0bcac744393d9190e41ead93dabfce681d5db778fb17d30c335cfde09b0b568fd5e4b03513a72a46f1388bb60e2761eed5bf04304c2f8b35d00a4bb5cf622653a11f9a7601f91d91361f66c56e1d9da0c05d8d95e65ffd45cda8e9be7d7fc5acefd3dc837e941a04151bd55e74f2d0228fc1a9f6441987b0aea14e670fc4c2e02499fce9f4187e1400b64dddbd57b7d87683effe0ffce90ad59be05c00d1acb1e1ea72160cf6d8459b8736bf91aca357170cc609846a6fb8e4e145e9fb16c186aa3de29423afa72d48072690ac72211303c4d2a56bf2aa4f5f29f5ad5904cfd2d01cb4e0d2b3691f98aea3ed6838bf90bf549c4e0126174296de6612953c162b15ff7f988492aca0fff635225f70ed549c34698fee6535174e671dc64a2d32f3ce6e8907c3ddd066006630dbfcab28d33cdce0d7ae309241c85c9314e248b4c17bd287db1ae572b32c874d76ca5800a113c688b1bb28ad66a7475caaf82f0a28a0e3f26ef45a122ce6d1d18f3307e322b379d7aa8fbde4da6d8fd0d4f640b17dcfeb3f5feaac2d47c1ce7381d12b6eec8e7f343ea650e7318dcea64f670e29457b70e50a584c22884fd589fb2f430273174f44ca999212f08a5c3366b5180024161d7a1ad7baa052d39fab57a7df3c3af0528feac3f1f68bd5e10eb77adea47e323974fdf388155c0f855e33c5607ac88c216c1bdfe1108802d5aebe22d2a4d8526d5c201634fff8561ef8fc22674c804d446fea27efef6993a279d747846fa6f921962dba41debc49d5223d29642016d63401b2468ee1a50ae026bf4374938e88eec9737a1f201c5d30605354e7a3d09968d820b64e95cecb170bc2c1138ee3942d4c9db05d629cf2c919fb3f524662296b4991f19f8a4b76afbf9e2af1d04abd75b609076d14b2cd07d5713334663fe8b3dca283022daf7022a88dfb8ff61847509c41e9cec4f22e652971fb2ea1ce59cb17ced5070e6f5a185d2ebd5e7ef0c43655d4d212e1dfa9796c69d17177921f196163722e8b0f96d953fcdaedc958d6af794e5aaa09dfc0ad34b560dd662f9b37702ce4e95214b91e1384feae63b4d1247cfade248b86f689090123a2ebfb40ad9a77a7b7c1f3233f22337310dc99561de776e6e30549dd856fc984627789b1d466d0351a793f87c4e694e2d5a28ad8243f5f0f9605acc83acf7b2dac975f61545bc307a1d66e3937f735c84d43edd9bfeaffb29deb345901ae9269e1d9f0d195ffcca9be67e3ca00da829de84f46dd5980f57a6b4455028283abd392adc27521a95995f0bc54acd7e6f7ce47033a457987ccb19eafa34735f533f54f8158de801f0656b932257405c321f3da2e1cc4a865e212a86b93b98469a7496903388029973f66a867ca9212e58d89222e72bd5eb1c1f809269abc0667824a8f91c5ec86c871402ecbd89997d49708bf62e09214d208ec415f4cd12455616313bba5763019586dbcecc3fd0d06cafcf289db05537d1359d1841e9b76d9a13da5ff3bdfbe003159e339113edaf2b5c07c01b679a2e97deb4a23847d666aee34b6cb1d6b7923a89f324f44d18a2ed41dac4927518bcda4fb0bbc12e98b6f84e2b6adbecc09ea3aa81a8dd347b321b24f13ee923f66802513b6bc4e825e7e21c226259453e8ca53ff1c734113be61bcef33508b95dba77acfabb29bba481d214da5b132958e5a712ea89e12c8347560789b2d77f743ba22897b2d8f03d0a32fff85df0e2362f13e915f7cccd79dc34965bbc3dbc6472e98dba59bace1a0c69a52770dbb701f5508d1a18de3c452d1e45105b25ba54e8b5a20ab6b59f600edfce0d9db9efe1bcc6c6a0f5fdc010c27ada519774bf6d236f3030d4b2a93a99fc4252eb73d3fd0edd5b4f9412a30224b11ec5791314d6ad7dffd3b89a36ce3428c89f63f1ab7e72fd16d1ff062b42da2cd91508ea01b80e49d79c6c538c4467cb2a9c0b1bbf8b718ebdcb3ebfa1f96c52d3e84de1cd3bcc398033f7c7f3c5ba4d2ef0edd9564d92f819e857274d4e638ad3e74ee1c28671b7c13f61dcb579b6169d431114b9ec5da3f2cd5425766a453ea3ba15d026c2852a6469b27c1987e28e3e3f7db2318f5af810253ca065749dd50908aa9842168efa2f58f38e6617c61edb8a3b9d045e125d3a9618826395f0b7ce79131f5eab168eebb42cfae553eb2c3acc53bb7a820c3b3ac8efb2b6f5c84bbab65a4fc2a9a450602763a8de61d82224aecbf6dd23d0fbd665c918a6bbacfb9467870eb537c1a75557a2809869156661d7ad357368e703d712af9c7d10252f2634a046807df3fb93ecf0695d942b62b9f10160867ad8bd0479a726811bba4d36c3afde6ca4c5b5e38f564e7309a17cf4a1cd5e5c812b8f2742bc9efc05f3be8dbfbbbebfd4bc3b0be8da1423f1ff1ed9911b193da469e30615f3ec34f558eaf3cecdcec13462f6d39e87a4b574ceaf3269f278730b19206b9856f8721472392f98ecf6bced3e4e055a62e671b99597c5d05b6345dfc3ae1c76ecaafd89c8140bc6201ef626d8ac67c375c29fe9dc3d5b6f5cc2fa48eff5e155bdeb1f7de2e14d00712eb808b976c382c721862b2c0bbbee007ddb6d265d84ded2a11e184909beede80e4abb6816df3e60e96fa80b68aff44c7d3077ef4ecbb832b6438184f526368ca6f4666df283a04904a28804bcfd294aa8418dd330808be510d6e11b0c4d8366defe325174794f895867f29c706e3701e755d8596b6901f4991f5f97b5fa7b7c9faf469b0288f428cf060e5deacac37923b58009674fc0663765247f5af7c6d8cf51cbd30677372f50c605ce93d978bb42aaac6b8cf97043d4f2585b620a0d82582ae882e70fbfa5c2f1ff77d362fbce2e7a84084331ba94570c21b435fcf8802083c62f0d1835920fcd23e1132ff7bacd6d3167f2bd4660a8fcaa103b942edc11a38c62e05a40fe1ea39a93b906128809cddb100366bbafaf0a19fadc9c589e12d463a3c89c89f2d7ba8c152fb0f43fc8e0a98cdcf4c189547d97f780da1dcc0a5c737b2da8b875225c20f0dbf546e7f4f0c462e72f02f77f9f4b918f182670e384e37177447490e7cf7eab279cb0897443541a8adf230018b65e4f711c1a918494dc0e0e39654a0e5ccfce7a6fd92b3021803d2fcbcfad070bf7b98eaea238d5d485d85a4e34ab7f4b3be23b346ad810d470523dbcac0534e63f584e98666cbe8b0759c44d89bb23e4e96ed4b40a95fca34de11c7a6210878e5eb31aa10d3527038919b2fc0b83e06f02faacb7626cdcd53f7233cd9ad6e94d7b535890409bf882349f8d25630a9f33ad0e2b051a6498b36d8eec7dfc604069bebe722ea6a719512f73be8e395849791333b965d985188500bcae512fb5762b507ece43e86072b8a31dab003476c4895bf0bea047d845931f85e212dcdd71db591bd697adcfecfeb825be42fc6bfaabaecea27e0d640524f370ee88aae11bc1001bf0f19efa6d6d95145e1e3a3fd1273454cdc7d3324181a4053b7b42c85a256e08861a62ebde4b6372f25a96fb3344140aa8434048e2f359cc31b34b9a184ecb69ffdba2aa28e149c5e4bfb7a6074b777899bafdb0cec03a4e38f76e5f3c853ec7c3fa063d317770979b1546483584842709f3b272ef307012b9115320ae12efa93a3f35aee355006f7f24eaeaa437649e61b706942b8d23a01ac7a1e5563d0797cc74d80525c220d6f8b34c923eac3e6507cea1206c1d7a81c5e200b41c4eae19e15f9648de08f8536e8c134bea2b3b0565002c1d992a9e3c202a1a97e88c0bb8e1ca1881f86db16e4975e81a90fb8305e1154f949afab75995669495a24047fb347b06b75a3a73aff137730919653dede5d4b18c57d5ec618b6019b632b2896b423a07f3ecb6659fcf9a5b1f6bb19246d806fb0db7 +0xa3481b7a56b6ac361213e5a69c0e99594c332567a0cd5181992dac5ac6ff236766768e75968685cd44ae68ba7a03c1d1471bdae070deb899cbfc1690d4a69b47 +40624 +0x4bff0a260be42b8bc0585e920f78107e83b7c26130e8c4d7979940f4caa37b7bd1ff58514bdb1e3158ed7aa0b708c8242ced8eb1256349649c8a6d743f6ca765cfd5657ec665987e3ce3b88b0bd4096b324c1ef677059bcb51ae3f43048521a30e283996c2a823da33e0203953055ebb5c7e791a6ff541767baebe4a6117719f56a1dd7f88cf46ad048cb993d7c24c7c7328a703555cc3cbe531f2719e4a20bf6ee8582360008a5f78918b81de345d1640f5b19b7161aa3456e0e4a10245b56d20a4b2689163755857949eecb28218f1888a9ec80a2d7d1895639bc0d631b810327df438652291006940fbba99d50575169276746ae7c4df6b611fb76235b10f6d1d257a226266c0753aa9d5dc55ad0bb1b34186d7b808f0a082796fee7a29d499294d16114e7afe452db023c3299719209508e69ac8cfb5fc6fb0cfc228a8c67e4c74f37a0b58239fbf198e957a4b092ce1d37cfb3ea49547d0ccbe2666b44de32ca3fba5c485984c98ebfd9c6f52419d3fa83041420cf8484cd626615cd7d19271e215d99f8ac414612e571e31332b3b5691eab6fe9146c88cd5eebc3398ba51c4372960c4f00ebec2ea8664e7762dcdcf9592a097bae88f38d1fe7f137f71e9cdac20805c3fe014622871b6baa4b11d51bc1048380f4465f7d23ef223155c223348e0828ffda1dceaf0005bd2441ef1850f4cf60719c31271e1965c8ce1e4c39e1352ae84b4b8df01481b9d56dedc1213952ef22c5fcd5d4f05ee07756c7196b8165e4b64eb8fe5503aaac26ffb5348a2579f83d06acb0f39472e39073c6c612658eda3562b8db67fcd95134422eb5ada5b85f21bc023f0d6ad3e3b6adb3bed93e1e5fc83fb1a193509c4d8fedb0c1265abca8834eb3fc8cf420655c5d14802a5ba309f13e39ed71af72059c4ae1e36e84f548a4473855fcb0b6ece40a4fa6704eab4d42d6b81b8d79e8fddbf24898f0e4d0d4372de5f7d73125ff005deb8e659795be2f91c2c841407faae16c4b5e57cafdbfae7b634e96f5ebf013906ec454c700b13a07d050378384a12f2160a00dd7da8f6ca826c6c66f7784a07a5fd4d84d6aead4a1775fdac3b65527ba3f1a7d7bd5b8044cb6fce01e67013954253c6aab32bf91e70e539581835b6d8f2d0a41279dce07d18a4d7e73291a40b65567865106a3f4512bb8023d5a185328c10bd37b8135e9cf1754ec0e3c14492976e2b5ef453c7e785619ab57c9009b0f71abbee83e842cade49fd3602ea3c525e03a63d67ced82a4f3d4fb714ec887bbd5565dee143d32e6889aaef95f3d572457db2a971c3bb39fab967d1a69c4bba652885b0da0c5af1169b1e93a7c4541ad144174a1b1ab93a0e3ba9aa39889a9678fde10c762b1f3a71e821cb3d4504748cc09dc96cbb1856112ddeebd598bd377d3b4398be886a3200d87b3f615e2ca5fd590bce6d8e20b48df6ce3b82b4fbc4fc4971ffb90b83004bd4f3961af713d8ac782b00247c1b7d09fe414349c49d667e9133e76f9db1ceda42527871f802332283c3089b6b4fd80eadffab31b0eb448a7a53f9e9243ec1368b608f6c4941dee6e49c8dda4405ee236bcf1a43602d87a86c97dc2e897003e618e58016d2180280017e38e7f085e6d0a07b3886bcab5660cfc93846b590bc7250a9f6747ccfc7794431b1cc5617e99db4c9ae02adadda3b0cafb73a8fe513639a7397902dad5458147c9f915d031f130f8224bf197a3ac08912ff11feb9313f600d0b71cefbd2a5d828ab3cef90afb9196e41c6ea5b9f78afb9b8d3ec523e91093dfb1f480268e9fafd7cd7f308c2173b54ae1e069831e9e66e8b8940f961defdcc0fa381073faae1c3bb6950b17fb6dbfd13cf5779179d97f71f3ae2f6c2b0a382ee0463557e73f5420ffbf0d40f1d633216e2c3457a1c281d1eeeb9918a8e6526414ad5334ec99e422194bab899d439b9625e344681ec03a82dadaf12e101aa82af7dbee8d736448a983c96a74664c75a9d4b91c255978e60f680abc0ee90db5ce1a608bd40414fe31dfb6ce73e5473df70b1c2021da5330d216e96e5dac35e7d7ecd9afab273271558da24c1a82ca70e8299ae4e029c5976568056c7cc229cad2ff85ce7545234e8f0e0a77dac75cab17c0a3fee2c0667643cbdd4aeed36fdb39c3136cb4f68df248e16db6374b6448e050d5c29c26ac79f7b2df8e46586ea596c7f10f0ca3d8e90d982a9bb25777c6ec6a9ed48ed51e0efbcd8abb05b9ac96548ebd29cee57aaf57a2ef9ccea41dc1866e6db93d4421a1ca7c7d359f7fb03a0d77b6418e3409c1b1822b4dfe99acb568ecc0c52a0c5ddede3015928633001d2c239aeacd080cbca5c65c03c4a0db1eee66469cd7862912b198e2665c4c12ac3b02d999fdd9d9ecaedfe072b361ff7a915b5da4c85a29e9ef07721584537e53a4a5e0b3b34217fe275f870f4d55a034fc4c74816ee0c6d0e11c331480b199c0138d4edc6fa94d5dc9958e2de4e453ea89aa39974dc296443237a407f41efb6de219728895a7c077e03284732ca68107b4050b7ae777fec04cfa535430d429b9aadb0a2cc7a637f915b708639704ce2925dd6880ce6986e1bbd4af7dd9798b2fd852645d782d0a4dc4836873869781ab39a3ef6d552fc504e94747095087c65ce5101f8f19b4cde297384327adc7422a79f8fe853e231fc66fc2887b288731bd7b849a263ed5e953e84616f46f2c9603613d145ccbfc1d82b9f70247e3e073dde63072d769f8e31e422d626e3d2fe3e279f0df78910344e6422532f3f53bf31acfa43806fd9641ae3f5e93f9aa69b2244ea4ae5d2fe10c4db30da913eef23600924038399c569b903a6a4a2b3932976539d90f7efb1dfa4566f0b30c338bc32bc89511e3b8824740cdd0f3776c32fa11d5fe715275028559e87f0f5155911108fd234399c4d1db4c54131e72a5e350b6ad95827c304743f7b2191c87e78ab6048a7b5bc053adde2f77b1298198bc31c02b2ea150bf44acab4e5f49244be108bb0afda8fbe77eb646a33ba338973623cac93a6c74749325e137a2339b052cafa8f93ad9b0f2dcfa4e61032a1c33e99d332249226bf2ab4635e8926a70a5c6114adfb36c64084120833ba81c80f13f1495a0cb918bbc059415eb903c29a065b40d18d7cf998a33bfa18daaf92b41af106edf420868232a860dbb3c474a77642e8c5f4871d60b3d2e15f18c5e6fc7d2172b283d1595da92a299d1e71a47bd49d734fd65f18e1db6025ce1bcaab2d6109f67362d377944d65026ba3103a5c49f54938dc0dd460446c2d2e8cc6cb90f032f8f6382eca6f45e3540eeaab1d93fdd1d247ad983728157e634612c12d6d5223e204aeea3935ba2c884f9a49376817b97546f2082b80771e2ee056c4b90caf641a656c10ab30d3c604f45bf36f22bf359dfb526597af92d5f6c2ffd657b42e7e0ae119a80aa6b93b32c5d7b0ad0b1fceaf3076b862fe8d2a24b5b600efaff7f818405db83de09313798cb388d9695c0b14ab050976b591a61e8123496943335aae49e24a2c268ad4400f9a83dc85a1753435a85eba1cc5cf4deeedb9adb90a2d33c54d65bfc0c608f11732aa9ca71492779507c1167a523019c4bd58a459a3f70f7d4912def56e36f36c23040217dded4695c93972195f4eebca3a2f346a2743a9367c58710eabe7aed61699f61c250b07fb96ceb63f15b329c90d454636bd966bbb8e3f6053a4a28a1db37261ff147624901889cb359ce63d8adda2c3038e7abcd328cf930c82efef08a1962909d1b5031cf47197431b6f8dd2534f911ac2760445f211f2816c564561890d387f85500e67d58f03b0bad7836c17539ac38013acda930c66fa8b60f4ee12e074ac57cfab3861e9f7c6a3a4851fd0b6c445f0d71a5ab4c8d5be06946478e516c7d770bb4458408a5ccbfb61fdb22681f9ea3b4cb78dfc4e2916067bfdc6a9b71847f79c40901b771808ed9352eec3bb20f889faeb3a14a5484ab39b28a207cc4e4515f807a69ab915c59ec4ec9b4c6c21b801681f2ba3d51ca2347f4bd2a75c5319f25901626459394a397b33816c9ce472cc1eb92652e78b65b2acd01f306f0e0bb546968e225f6edee4418f67c954506e11a423f4c9e27fdd54ac1d514b0d676387482ef07bd19bcac79d68160b9b4ff3f983c35dafcedf5043059c309f3f46688fe6315218b9a8570c172657db7ac94aac420328acb49307a642b383d50c9363f6a8077aa01e7ccad83731f0e1f8a4bc51694a1f6a9b824aa6e8cc14947d369ce3161830bc09016e5686f1a9c41dc98f1180ff088e8b96616b814ea98599185b7fb9cc3e14811e8aab8bcf4c2cf1200b13108cacc38cb6931c95a10b4f681fe8f1188c6b4f8ebb6502ce319fc37d917a80a058d3afa7ca29e2aa2d029bf2348a62bbbe7e1638c14881d8806c2ec805227fb9cb44fae3bb6be44a59561140408bfa2bcc401088167b5030257918da624d39e24dc94d496fa14bfc8fce58592931e0ef1c79e685a346985e868e27bc9241d5a3462850dfcf133e4937331945d9c53d8f18f03f3850f181eb0d7503757b467c841e2aaaafc309e6b7b74dfb0d368e3894266fc4a706c3325e21f5550d07a6560e3d9703c134ca6ad078e4a7b82ad6fa85b0bc1ddcab05d43f29d5c58d1da78ac80c37051b089ff31ce2c0c44e9ce3abea1da0f1df28008e178fdefafca493413bf1d256c729d0a9225ea8fbd873ff714cd5e3e8b666f9896dbad89d6286b0a2ed552f9ecd7da5b36a5266f45c99707731404dab6b4c3becc9128b55c8aa47d668a1178633ee653a7c27c056e5f57ee324c6a6e206c10de0b3ffbecb35f89f04343b52b503635a65e1467fca786f73deaacfb5358dafb68db4e93ba7b1580255d78da8d545c3ca5d20156bf71fef958f4dc3434a0afd7f1a5338c89044b2b6f1dbfde18bfff8fe49c1fe4b86e15d2e1f940a18cc8493b0b019542e2ef7ee04ffc8f5c4813be93e524c68e81ec7a184b5070cfc61045991768da6342ad1f434a724dc1a5f007ed2a04abb0b68d7a4df7a2f31b7b1913769953794a42cdaac8e13791aabcc579f015a435e7a0b1b4c899693e21065331582349f8745db1bff5a684e173f71463414a9bdbbfeb09b82c930bc85d125f2db227c4ee8dee09bd3dfd12c3a9ef6d82553b442395eff5e2fe6703084c098d7719295cb1d38e2631266749aed8f02125a06a45940649f6c39297f7945a667e9bf1aa69e901b8a79a237792098dc3dfebc75a08b38d639cd8ada851f324a3a31ad01d750a74e80e76d9a0946a14b51a331e8d15e897d748a0841a9a8b176b7b524915268cc9b6bb559d74c9571a5e309a2a65e5c9c21f9a99da5149e2cf0897f0a103c6e66c8f4e95035699470b19e39f8f8700dd78a6f353050ee880a81569749c7c0eadd9ec28d39fd88cc0639273a19262ff8a37f7f33a8885eefb3f1c703c7fe036598e57ea8fb78d3c39c032914ef78c2a569c9d1adef968c5a8f0883cd6efd30670165cf4380eb700398d94ad06135529c8f300caaecc2a151068e33fd240b6d767fe55e65afa187146481327556a706667f7cd9338753c55c804a7e99d371e21c7a2fd21670e1417c66c38a0bb814078a9f75df4fa8931f0465050dab6278b9e05a09d45eabf2c5c50869fa9b6ec57c9059e3c70637c8d8d01d87873ab965174a883c0c46481d3c76b139292b60028e01148d38601c3b17491098954fc08326e36a9021d530aace18c8fdc0c676136563373cdb663f3405f5a600dff15f190e3269ccbc1449e1a232b77b6671983f28412cb8581f89faca5e48860c287e6ef7c0eeba84097c09e14ce57cc436aecf00205ac95694e0d78d0c5cf4c4fc05cb08135f2022beb26cb2efbac7821ca00b148a29377dcb2e1176864c10b176dc7869b525c73d3bd1503ea19e26472b563b8d0601c976ce59f1af547ea3799debbd432ea9777e86c2feadedf95fbb6cb8a7921d4a48e9a54abf5dfe5c74c47a1be2be0452f78ca96ebe2658333b87e6af974c556c7d7d56eac3ab0c4c4d3b13522e01c1871111acbcd8d16cb48253a22152e239cf2ddbeb2045bf07b8f4857279ea35ecb28bb2959393d7b0e5fcc6a6f8217d4edc23ab6bd38cc17707324b9f795f810e3a2e196edd3860ac2c7089fc1a4c451ef92694dfede1dae2a1cf35a038d20eae87c2ee3f810f93e9f2a844ac711b61308ffd3e4e558c31d2ee93ea7fa08e0354010fd80e676099eea06a9ebce3d5fa0c077152c0f3d5f0ce5646134498da898910dc80e577739a439c7f3f365ac4373bc74a783eaf033c5f41af57f507fdc8d31cf38ecb998fbd7150afd021bd2e4144395057ce7160400b17975f9cd740e7bd8d1aa9c9b5fe2aff22c1f986f45c3fafc44a987b2132215d40c6d340efeb0fcccb1a79e5b3060a757c7f616ce6965a05cf02e24aa7c20ada24045aea3746678a3ebba7297bf0855cc5afb1db7d24baccc43ede45eb58210c2b199ca19798187e4ec4db9df504c23b651a90dca04d868f0ac73473d63c8e7abecc426df72b493064ffbc480a89ea9ac488a775375ae7d309658bdc4eb57aac43e6f4563f452329e632f332a0c924014ac19eb02b93042229df8b893c0c0d2b24305965572fcef03e262863a00a99f95f8c1c9562400603d2ffdd81898a6e7ec76f1aa12731710dd2a302e4f39570096bb2c92bc5a914ff6c8b29cc1b74c62d966ede13989234090c7129bc7fb2d2bad6fc4e7a3c16579d5f4c1673dc153cc1f7f44ec1909c406b535746f32ea8e793082f538ab0cef665130a4d7db3b4f9c154c812b5f895bdbb0e1e0192e7c1d61c69167f64071a1adff18d76f2879824b514b3d1f7b9c6d382a78e019f9143c8dd62787b0f2b42eb945f9c38db420ae6259f7d338db977a846856fef251677e45f591cee93028e900bc6013b3fcb52679a5deee281e2f06792108972295da55329b7cb81f9764532cc8f8228260ab8ce9cb6cd83db1b7836ebb0a433b54e153cc3e54ddc486eb1f86020e8a798e78444b112e4c1a14b583ddbcd87d9d0d10ec8b6496aa688d1180b4ee3fa5f9e4afdf063d9f941dd5cd9a6e9cffb0d83ceda1f894dea88c189c3921e3e82f93f1b6cfb3973d5ae963541969e1ec877d52dbf68c4589429fc7dfab6599b461c8442198c +0x08b3276cdb68adb64cfdfb6d54002354108ff18c3f901c1fedc48b5a44c81bbce19e2a231a319191fb5b9652bc43c20d80ef6d438f7227e72ed57c7fbd9c79d1 +41416 +0x0a268b623e349fa821ad14e9bdfdf61217aaff016c8a024fba348a6d82b4bef3cc8387346db6f5168575df214bafcad50d0c0c41722332d103ee9e68e97a75aef8e3b8aced80b096f45b90e76ee456b3f0e6f2398fb9aab95bbabd8529f84659963064ef48fc98cf77476e65ac046055c91ff7134ab433aeca802decc995fb9cac51d4280590746a1521c2c09077b1639fa164f42b7d9558592837c651b85a1e442e507dada60e0ed7d1d4239fa511847b538106bb7a98600f9a233b4acb2d8865af1f16c7a52c64c33fecb463f74760641d95718114036ef5be39723b353a8118bc8b1cdbf59713e454529b63d31da062e7ea5d06b3a029117cc194ac5e4ab2643ddab772fe17c43ff64d0127a259ec7d99c6f1d0c0353a6dbd02c825ae24c3511a550e1327741fde0e270e38cdc4ebbe1c725569a18b48116745372f8d925be73b444a46da75cbc88526e91dba26462c5636b259c06afc0364d20851635a222f88ef92937fe371054193bb5ed347a5d030593026849afe4d9af164149845c230ea9d0f837c86b89e2cb6ab847feeaeb09225f65a54e2f5f7f3ea73ff941be0f24798e99d3a26499a2dd6e21625e50cd665e02d7c9a0b8a0756045c9abfa4277e89264769218bcb012b3c879c2ff2654a8fd3fc15bdde6487aa88486d82a73cdb969051709a7ce7db1031c39e04de6212fa468cac25202c7ed9be5e0143eeca11581e31390bc34531c3fbbea50c70aa388c8004c93a9c89f5caeec7dd6b3f7729b5170c4ddd268c0a2ce29f38af72e6c42fcb8df5631924f36560aa896363eb2a97c50d32796e656f33308fe055aabdbcca6d4fb60b5ea480925c308e9222cf1ce56e597245637767c02bb52466e2d82a45af71979734b2a4392981735f43cb08875b1b95abcc6bfabb1d3a8c4ae0de1588d91c1d7063f6684210c4c0349086f564d479211272e8300c4c45a0696d78867a3377d2feb317d3955922fe78cfa9eb66209ba0e21e97129b01ffe92c504e840505ab3da9ecbeee1b4cc2b492c9dbf27489aa9982961fa750838feef95307171096dfe6dad592c0ba30cd6aec46c5137655ce955ca22af8141c1e37393c4b47842f3c56f7373c515b4f6aa8ed0e0f5555cd2e1bd70c5d0bcd12d44d55d4c41d4718ea146ada63a9e7efc2f7fde860c1f739f3b35b9b62ea65aed8b7b3e318a0429910a89986b0d14459fcde849d605d45e144e55016e19dc23853fdbd31efd95dfad69bee03cad05cd541e6eaf6b833270c4a3a1f46812acef86ca8da85f2ce81826574cf185bae15aab99598b8104b86042d392ef3eb9b6f354c3f71a8c889947ae5bba68f087359228b76f4ae0fab480f146be6e4c7f88f391a4aec631a127f2a7ef9da2e7b280f83e00e679f5e5d57762756afe3bc47154aff52b27c906f2bda56b4d3be5cd51f16dfe75a52a56999819084f2b67292e9b123de2bbbd1aa7fd29877f90652807023b18833908bd5f877747d152692e0f3b6ad76bfea86cb62596ac7b4d00633ecf27d795c21b8ab5ba2fec782fbc43a1ba0c6a2d6cf56d8beb9f42e6ce220f57aca6c433bcdd5f3a94853ec9ffdafa749b995ebd834eadb7a385f33890547cf02f5a66d3a5c8ab3ccb29e74d6f4fc2f654743d82ddfe9db7e1fd35f730123c76db9527fbf957ef5ab2805e58ea752da5793f7f23d98fce1b2b67738929e5de8a15f980134415ac02ef1b0c92edf5ab107e5dabf7129cbf4fe4474484fa49d37872ea17c0028c51d3d57c8a72064bcbb5d8514c92f59fd1c4a13f21710da8abe077095788b126812c0a07508cbfe1f0042bacc98e0ef3b617e69182b3e09cd840a6b9c7b3dc7eaaa9f15de7397752b899ccd2ab2edb42ccc828f0e0e42f90e917669dc0f7e0ef5eac2fe2c70ec90895d550657a1bc7079643ecdfd488272f4ee35b080bbb6b12edc12a386873218e18453ad7bedb7eac9329a6a0d5f683c27a22d88ae084d763f87754b1541d1d6da07800abd1c45ecc53c7fb065dd5b1e50b5483b8e7cab26d0f3d4400125318f1dedc26546b8cd3c158cd3e52e4ac2e217306c104aa13889882918c871bcbb0e523e03053e49b9a3602a80528f2c074e231a834e07ff5d661030272c8d8cd51a20032a33cc5570e94e1c6c3fb10d912b1d7b743ef01c80860f10ebb47f1fe87a2f431f3718665ad6886c81f3bb74c840ac5b27282a820bb22ed24ba76cfd5df72806ca594b03df32b622a5b8d6ea145779c38454e0b964b0157d2e4f7fac9a59b35413e18db567c48044c2d42af6dd362bba73093847f5486b197ef2ddb609687736e21605025a558cdcbf90de208ba66b49dc905ab62444d9af22d9b1a311eb1db31f41dc7520ad85f184341bf0866fe177a7316f8e5b6b0645024c21f919ac4cd4b2aa39932194118cf90808ef3759344cbc349f5501849be6069255428b71ada0839945e6c6d2d8b40654cea4042c0dd003e111957d583f9716f57605ce03e81f7a5628f5752e8371935f949756af130c6580eed539af9b621abbaccb4a2aa459802809489772bacb8872835196abef07c8585d9e9c50564efa2d1e1b67ad89577b591068956424cbcdd5c3592ae948c916b287770e0519639e93f57d8d564020552f67dcd5cd6a784ad07b377c2ec75b35d694e8f7948caaee35587924eb71bcf4f3332cc17434dbe8abd374f24514c40f0cab79c0c6562ad35a70989435c43442ec9fe1c02329fa8dadf497f6f5d60c8a9cf4b3cf6320ec334c656145fcdf8f2564d08239a0f1df221f0628ef05b53c90cd981d8d3391f6f8515e5da0086dd587a1f19796b43592904930b0453e5b5b08e9bf4062fd525208b283120b20140e4fec28a83e279d19bd739bb65f686d71d93690a2b78b0a084db7fd0aef0e7c43658d9d3e99c1d07e93e56fc2a74b9687edfd34cdf2a3621eada7f4cdb5984e7cb1cc7ae00f4a77c9f9e6d35c84ae7ca32b85d3497d0e029e12cc8fe1c38732bf1af1e41708893900d6c0ef0d5e5ac7d07b18939cbe94918f636cf7d083a2cf168b43056aec47bf2d14b9ec5c9e182013c5fc9f501ffcb8fa88d054225bb3ce88e90b0561234cb0579a1af2d2aaae2f76f17a1ded06101ee66840cd5db580d61d1d920c841560b587502b28f5ebe49b00e8da36f9dd966c5bed038a0bf8d390de0f1d415c2b4b76c41e33b750c9840cb9906411fe0b574962fe63b4b38c72a4d2a7f7cc70cbd49a16ec7cc768ad542caad260d783f81b5e0183a673ded925b902ce67d6485ec5ca85a24c7fc7fd1ea0da9715af110caa52426515ee1347b677746ab4876d4de4ad1a28ec07f423a81351c5ccc22fafcbce2d8af84eda3eeb883264270666fffaecdc66a4887785bb2b1845cd376549487ac9db97babb268e9144a5087cbbdbce2ed445bb2ad98d1e90360060373b42e7fd1e40395b3f67653db0149f10f54b2a1c08ab7b14a1a19bebb3ddcdea3a02710034a22859ed693931809833eb9bb5d45d82812a6f572bf8e498c35b77e9f1ad2a14e7aadb4e94d118bc1b0d343583959a4ab011628392fe22ec9c5307d0786524c5f90809e851f7986a8476144c1c357b661f7816ae3e754eb74ffdc178fd5f954fbe8a0c4606715994bbb4b367e87ca7e0b5a6b25f97250f02c4a1ce68ea6426bb20770ced1d080441a70f380e4f32c7c05ce55f1f05d50ed4e3875528a53c7f1006193067fc84417a32d1cbc9b91e820cfb7b4575f04ff33594f77f4198af475657b6a13a0dadb746434096218e0981ce79b18be9c059652dbf38743a29852695fd9787f1b64b0fadc3a6be9d36bb6c0dc0cf5a03ddbc0cc54c935b9bc285c6d6df0409116125f1b798496ec61afcead2b71dd94caf40910423505cedca79cc20e5444f247504036dab72cc22a094a32446e3314b9fac9cf32cb7a1b7a927e37cf7a182b25ab0f0d6e468003b314a400b5568898813cad498500f4f81c657b1f1fd61ca4177f15efa2b75339936e7698fccf50a8c7460e2fd75a291d48bd3de87dfcd4e5b368ff6e269df8dc21534c5b993d2dbde2b376d2a84b68d365f621346852d3787fe515f9584ef354038f6fd90934726079e171e2566946b32aacbf837d8c9ac4e3800411b66ed549b05f8b81cb29c108d37c79df80184544dd5d73461bee8d6364a64467df5211159e6019f66d918c3fa5d1191ab3fcd7011464e70cd20d4ddc99d4514c21bd2950442d85a75f10467d577bba34407b9e60566f85381e7d3e88f996b53f2bf4a072380469052e0a823a7ef8e7acd408edfb19d9c8687f92e1f0fa69eac16c9cf903f0a13e903904c20f72c52bf4dd495829e5404b0e7402dabd12da5c63520aa58df47070f92e738864d96cf19cdaa16f853f1f67aa7a317b45d94494b57ae23868b9fe9a706cfb37c3195cc3154aa596858de3b8bd10936613c4552e0845a8143cc7a835c682f072a2c9113aeeabca5fb36819b8d6c5cd0dbf5a6882fc50c0eb628409bd3bfee7ab9c5f26a3997c844d87444dd2581832e4a1021b2e021ac10082959fab713f6555185209a7a64b67c299a8ecbfd176698d5151d9a9ba123d060572e68ae6d2ee019f3846b18586e961331c62bbd36ed55a48d0206074c5796e73925ad60d47e623a9784a4bc7cd9d9c0c056c60de600afe00037bfcc2a31aac457a7907750ce25dcf9890f0dd6dd8f58cfa564933087ecb1f4268d9343995320391dda98e9066f25a2fc72b47163fe02e61bcdfa1b6a553ef3363704a078da2368ed536da80f894019439658525470e78e20c8e8b09132b084cf87c648b487f46b81c39e94cfbb53e6c843a283962b2f4e1c1e06f6e4cb2e305943824337a2bcca3ff2d3b52f4c8792f140390b137801af7797fbf54c67e17d3c34df9ae773a20e91a8b314178603a42857c7f2b19e853899fb6fb5af50f1f5e1228654ae42cfbedeace6b870aff0a4d44ef1405ae7e571eb120c3ff7cc8520aed51e7973566b628dc715aa2010751a5cee61fef59946e2d3a4779a0a24c5850c1450121ef89d8208c1e8f011f1bb8f2affbf346afdd314ba785bced2a0daac64a8c42596708da7b6620694299ae98ba549b2e8a15bb18e09575ee43587ec1d1c5a21bdc5066458ff71189d525228943593e32481fb0bd8260928e31d2322619ef00fdf92024a1e4bb8c5147362a03442a7faeff424077b7b5662d371baa5ff50323895e5ab668002fdb600741278f2344b9e52e21fcdfe6e06b4bc19959d7f9cea41e6a64ae1068c0992693caad95674487753313586e969e0c5a7fcfc316ae9ded5dbbd27e23852a40258b572eae968662efdcaab5ac5d3ad3e9b043689469ed79a7a138a929fba95aed3c6b2d432796c6b5595cc70181435c6a1188dce9e259d38cd8ebb19c22da63de557b1beba0f24d5657adff16d944006c0204728f7e5f858dc17019e29149d589351b8d10793541534622b0449ba96a60005adbedb46b0a2ad97a6495dd543a6e79a0f34a36bc5d3ca33f9d236f0fe4d69ad07b9d1b08cbd4bf4f043e5da60d0e81bfe1016013fb630d79183bb9e42a304019d40628b5652bb1828b44989bc7d9ebccd8de6bc8a666d343b3e612a2852d8e9b67c143fd40806e995c4124c1e561266c3d29d036d8c89343f2baefd79ffed4e9c957234cf8835518199c78a50024bff2908c240b1d08dbee4732c7ffc544c1695b201d30e795037325ef0aa182a51704756deda1ed980b9743e63187bf9fc2beafb4b825b845d82f13916163f762da265e578397c506a0f35b3da31bc960573e399d7aa7c51661c0652c0358d8de67ccbdd18c593dc53a770fb193089d270d8c7b42db43a8772ecb9d2766fc91884e5c16547e62b2644696c3da87fa8554441e073d6065dce8ada52e1c02cbdbe10c78ea58b040bd5443d73a21084e1c8899574ff590aadd0b5ce18a627d42f2891097bc66f87fc925c0bcb52d8a9fed348becc803e27f232fbb0544a32cfe8fe0f93d0f078d7c60593bbbd748855c51d88a3301d0ec4f39f64684ff46a86b0e7934dd54a305c31d5f1359131a8ef004f512ce7fe504b79bdf9df4ecd555f4e8b231fd1fd1e7e05ab7e618fb0c1e17510ab413b4c8c234c34c1fb9cfd7dc38c93caf10e30caa6092e4328ff1a5a92ed099fca722f4ab434adc4a580ab6a1b30a78dabd20cbd3a060747702896fc6a2fe234afd5ce1366f9d00bc64100a2cd036e763566b97ea4c4dd9223534d2ed1054273d8ac526ea162449d442823af43cd918c77125e954a0b592d27c866782f35d1622e3fe2e4cd38b283097d3c19e356b7d7591d248b96a3231f66cf0a62ec88380c97d5a7fc5243c1c3fb88756617658960c4d132e7ee53e270c6b0617570c61f76fcb8c93e984b1a670490f42046c4af2e9e74b131bce43e2931b2923824b72daa462e6f32081864760bdfe1ced739d049d14fc8f2671fe1518e1ec6346e220baf5b80c161087148f9f7bb65f9348d94ba43aaa0b057c970f0c53c24efb7d1618d25f6e85201206ef7b26da828c488a588decd60f6f4ad960fbd54d5f3688ad64c8bd70c8d5ceb7d78233cd1e3eff1a8bb88ff3149a692f9b460ae00c8e71612f5746d549b7f9b1e85327208b31d92485c2b893b33d53f41ea9592cef49e3dbe90cafee903d4f8f824c756771eb6312b72aeb3a53be97d17b644476701f3c6822374d3f34dc1c9b460ca2f43ae2297f905f9c598ea4a1423225516f277507b05b85a349902b0d8f93e234697ebca8c5b1ef4073bc660cc0c35b14797dc1c22f056646803a908eb70c8bbe3995c14d7f8c387c1b759946d7af73e2280babf84ea067ab95aca31cbc005784d718969427aff9a3a332b4cbe1771e5eed298a1699ccf846dc6ed934092fd43ce48fa329386d715bbd8c2f18888aa8ff5b8ff2a99adb96acd6e9b96118eb905ac4638d593c755e08ccda8ec9378aa227d5876c2dbc6cc14217b5ba2085b40a43092cabc0ae280e3f53b65a3a78d7a88cfda85d1f88f116ab114b61feba29a0aa255384dc08260073e4a7f808c6f21a73367b4bfb9af8f55c4623375830ad01d4ab60bf27c4dfe32ae2180ea09c7a769f0278cf4e3cf4ebba48d5a0c983ce9c76fdeca1208eb614d8ee9f049e83d15b4504194d84196578697bcb34cf2dfedee5bf4fd142a05914126c95504ef78727299dd54d39aadb19ce617c79e589ce57c54212c62ab4397f4beea3985e721c68a1425554eb5bb64e7d9c71d68931bd858a38de063524c7a509e74233397df1ae4093f1eaf5b69794db7f43d136c03ce6a905fa07fe9c9423c0e8e9c76c95b75 +0xe0c80702526891b3335d5a0b3180d47025a76469a296e823fa7d7228b9872897799dbc0a1252c7b7e89043eff1bf3092ffe7b67870327324cf95742fdf0e4122 +42208 +0x50973fbb1fd9ac1d3df52e52adb8f12423d179595dd593d8b6868c0ef954a0907324b5024c514a3717f0aa99a75965cc24e3008e5feeece26327b56d4d077c205d9da7174c8ed7c1e05a1a42bfe06315812537f60851a8ff14fa871112a5d675358a7cc3c8983c03c3b9e8139c57d2495f1f84580105b178f2886bc1f13795d824749cce68786245e6977bd5e7c59caee95a507ef112ed952458c74791c4a39152e26f00d33530cf717b3b4f4733a88c445d042e8181469dd2f204699c54e7e8e65c5d21b2d78de88dee904b65a8de2d9bb006315959a3da26df8bf0b7f04925086acef8ac6763da6277e28fe82c26d814dcc04f20a2eb9246a6c3a38c9eb18fe2952a4e6aeb99eb179e99e579c768d4d768984f7f64080e5acf134cc368076f9964d9eb936e1764d4eb1d13c0828c6a0ddcf8fb1da8e1968be3e5b10456330d58604397d0f5c58dc3e7d7e164647ae2dec14719a3755e710069a09cf66f1eb1450fd01ac98a8bad09192d190e761b84719ded72b8d467e9e3e9abd341bbaea388fbe93b2534510dd109888165bf5597effb52ce05cce44459eb701e8e42cc2a4aacf4c38dfcfff6414051e3124711657f60def53165bdcb8cf85647850d6190b3a95b7ba8e87dae8145ee05bc1638344a56f9aee5a7dbc6a497c514cd23531bea7a84281f03b37dbaa0c9af0c35b04d78640bc2c99b247dc851254f0f8c8c1418a7d995995289ad14da48aba9ab63f830137cfa8448813721addfbef251f2c364b8c089bfdfe885b67ad5c03d80377d9ae9b41cbfb7da3ed733592a1f796f6ff736a3cb39b1b64cc908d7b56dbc1623df701bf021ee18d8116bfc5a3d0cea61f8a9e924aed0dd4b740db653e368e7332730194053f7214ef7de3018f5134ae29097fa5cc64543cae010d962478c92f599b017d2fcdadfe8b3135e2aef947938e78a3e3b2a17d2103499aaaa402efeb15e787b6fc59d39ed6a92ec59d29a5eab24091d89824e7067993090f2775815af9d10afdf564a16a747e4446d462ae185709dff0d75f30715375ef3049411be367f0119ea56e8605c6f90cc2ef54eea0cf2cc4c90ac0c7e6335aa3ba63e62e1902cd123586e80fe550d1eee64840d618ad3216cdacfa4bd99bc9dd1a11d516703cb0b34f04519d8da471711d69e702e453a21c7b385c0acfff3bd1bbcdae936d88534b37b84bbd63245029c4de97d3a865056c5e3766a33dd039582c11d2f375781d60ac2d26ee0a73067f9910d3e6b943c47cf314ba93a7a13aa6f768d2d52c7e878a08ad83bde7f30ce8f6ab3bbaab9277c4b66ac86a91f4c8648a5d3ea7072e1a3dd9e3d29b8036cc0c6a083fbe03b397ea34a40076814d6b07614976e779e95de29c5aa41567b0dc406fa2406f36399d43da5b0375fa1d8b0628c80c251942bb1ecc6c78aa02f3a63b7413fe4cd797006833fa31b770e7a0f73d436ede49ccca48e6a3b0c7f661c24413d7b9e54c5e59ddbe0c2bd96a2e65410b662f71afda0407779afcfd96adb8f0db6813a728e2120af4fb524a5a64107a3f8ace9d901ce0c10bbcadc98819e2c8174f8c30e1e4c17665523588d62b6b09363bbca0bee7f91bff7353aa2f48d84063e893e0fbb8d0a68bab562341e6ad848bf38a2970dda55edf797f1e10bd21e05dedcb55fae0c821d461249842288062ad4ca7965a608e20381990a3b0d9282e41a982fe53ff207edc0e21564b536c3a1691a585d0130c0675ee38c9a44f8390dbb65b589b5671f40f2cfcebb219c961548cf4667657b7583561c7fe5f629cae689ed4e335a92547ea27f7d73ace407ee37924c6b1c118bbe30eceb046c50bdd94bd502cb749c2d0f999a2a739f339e94ff0b71516c198a7fb6fdd9deee939b4ccbc8d9394cac325b9fc9dba342b4e46f68e1bd019ebbf830aef4505dc31aeba9cf6cdc652aebeccb7cb49aebdc8c60e739bd3863f9215f38e17c5968350e3557206912385581e2c5f7026e33b7e69b653c46eb60c77046ff173bfbe78a9702be8668849817959cb2d95b606319e81b4f3725ddde4ed336ed17d93ec30bdcd846c811386eb64fa3fbea6976634bba6a0ff30116c6d870b66aabff2ae200064257b00b38a37bd87e06f2d1ba1b9585100b38839f01ab6f4ede9955c82db13cc55904ff8c1dae58b53db93e34743e7193adcd537f760ff986b1aa821f8c65a7ebb48d943ac697f6d1070656eb5490a57d5c7c18be0c4e36e74ba62f37e8666f3bd013734c857edb59cba3c1e7a5d14a557f0b7a65adaf4df81455031927fabb3d165e43c941aa2fd5f35628304d4a87a48043237b40796641757fa7cc336ab37aec35adbae46419cee6e833cf364385f1c6ecb808acf5ab4bd4ebc258f2fe8179bb61592655f4c1cb0c2189cb46036bc4b9cee415db6b429d9a62fdc64efd4ac2ecabee157ca25054cdc8d32c67d462a5c1b04da8b42253c030ac001d2eb139dee5d8159041b6eef191a7b8fa80fc921d465c9bcc1f64073afc9172657960735410b3759d8c77c22bc084e13e78c422b3b09877860477859568d9fba7195323acd403b747452ef589c228f50039743bf0672d89e04ba4f658db4b44eaf5d26f6f988f82935423ae94ff5b9d46aa54045bd3e378e1dd33820cbdb0f536f5247f24c6207f8ba19e16d2e0e4811ab3aca67c5d81ec91a06c503875d0b69301937c53c57e553615e755cdcb8d48833cc348db6bd18ff97d9789646d732d0a01658e85fd71ad9c9645920d291c9b8a2de21301679906205cfb54190c6105a2dde3dc40d6c12fc60d02f618635a21356e512f75b7a2fc0f26e1daddba61e4647d558f0fb83582bb6364a878df0f838ee858c3bfc5b417ccc191433bdf3d7356ca03ce770b974f837eb4d0b50703689d813ff768f797ff611753b6b8e3bb5982aa34c20237ad3d274839985542fd7969224df4f7b7125dd50f6f5bde2fa43ef006329337a440f5aea83d26e2f7c75efab4cbe2f46ceed931902c5b3429bfcca7c743689eba171e208506a2e49027be581d01e9e77df31a7c84d4de423ad6a9afd3b069c0e2fc6186c9dd35e174e6418c47372f5954e9c9bed2ad0b91caaf7d1014c1c02482b566e75b0a07630bcc909d18b5dfd258988d0062000ba84214f1d271bd9253040bd44b23d53ff1bda053937ac21fd8f1c80f491c14060f08cbacfed1ee0ad3cec654ba09860514f22c317654a817f58740f7a1e833234f869c579c1e9a4d2e4aae8d3df56483521236d34f8dadf1b082c9ec10aea38aef23519ab23f0a86ebde8a28dbcfb8de368587e1250f1ad2914b2b969f56ad647746b01c4a1c86db93f424cc9d7fca4145b3e70201c137e421482e9e55c899d9705983866b9d5574adf3422289ede2d209051ddeea8b4b4fe7e299ac3becaf1061c3907f1eaac17ac143add1aa0248b909e1f31ee855a03b6c81366757aa3732d2eca0b06a2b1015584c2d8205a4431fcdb02f6a03077ccf368ecb78b3eb78664b3c7ac157088b6cf9758adda4bc1d2cdedb9a69448a2833cf6f21865795bbd5551be859ed297aa82c288b898e331c07c3c8fcc4b2c4ec90bf8e003a499248a677f1b020357625f079cdf92fcbef89d904e11d23569e0f0e8c52303c93c867023a269bc036d8d36d69ca9c7664daacc92a8dc42c3600dbd4c02278333d216011252271def835ce4783883c0760dbcc00bc33bb8a5cd3960be268a1c84d847afac04dfa2584775ca54f6fa189c7d932a5423dc8e3d0fd89da7b8b74a2cdd8fee69310fd3ae184c6af56e892a5a1be27e14412b4e09868fc6a12f3b66ac40734fc27d144c81746548f1f59d903f771f1dc4b1a4628befa36e22f0832c73bf8646503f995752fa34d6a332b3c4ad0dad8bddebd48644a9d816b5b31af623993d648aff1b9e93085fb6b18c7842335e126ad8663803b4238232d1cd9f4e2c6c0d2ceb42078cd22d3a4b7589379352d6e21d3ca74b856b0b3654ffd65caf0ea679f1f99ed99c90e7591797bf9e229c06913583258b65c9bf68ffa833ef934ae708662e6c2e684fb520ad7076088a6f6ba4263467743f60ce8e95538cc495519c3cfc0240625a7f15456f986303455d849f71d8f3a26cc0a73bb89a37782fc3449c260da201fd9f862bf087fd0acdd6dfe79ad940729859d7e4cbd4ca86bd006e8a66b907a9cc319648b2c7baab8e8bec2123cdd4712c9cdf2e51abcc5cd7a9789c508ce7b640d5b43038c0125221bd17b08f2f363aa42a3b5cec87a3870a1ef1565601d8b3e5ec7e56f5199a9b120b013a4f65dc1b99626b04fee0e671cee1772cf9a0412f35e633317a2cb9e2c9f63702e71a3cb076d5fcbb0b401bc9908168a4bdf0c784cb6391542a8206d5c3ff07cee8a4ee85b7054ef3843da9dae99f4432057bb260e0e51743a8b1f7c09a9611d2b6ae57f7e460f0230c321742546b98798299c82040db13645725134fa85be3d2f38f0fa399898ede05c5fa8c4b96e3df97e34f5f55c6345ac853cfdf97a0dc3401df8c0520ef59990341aa1549a1b4d8c7d0de8a8a36f87b7ee6a40cc305897a7418439914f30ed8876ddc79c90c69e994faec1e689dbe6add263633c50a6a1accb1ccdc00451d00f482d826644791a681b9fea77b6b149d85cadd0118200c996e448e4a5d45e2c6fd2943a785e3ba8400a69c923d3f9977eb1d2ed136d6df7afb391e60a6861e8ee3d99579b8515306b4493c8b288b9bae8fc5a240abaf5133d617e3bb56761ecd5b1c54197610d9b2ff0a54deb7cfb995e63cbdcbd10a0058915984b6e7a67206c559e60349b2ecfd53627c29758c61c270eaf7cf51877b5dbf8657fff497a6cfa52ae1d3adb7db5a43fa28e7ec3232b8d268d6e7a7a810b7b326f3d2f7ba2b8c9d07dde70c80435e6339e19686618aed6d3ee1914ddc6f0b0ea3eeec5b9e7ec1ff6910c9f0bca38e13aa1cb1de8b08d4b3c59e58be94f4ac34858fb8aaa52f045ec74108f4cd7a4df7a350c64f3f0b0348a563aa6472303fc7547ca46f7eaac83dbae5008323463261ee144072ce200d9e46d802e9f4a01a39993c5c047b80820ebc536d265e85bfe4c2edbcc3d8d638173271fec98cd2e00dbc253c243c2ed66434329b48efb76b12ca2397ccef9c2765f0b7fa5dbb3705b645edb129312419b0cb0907855769a86e8c7c6df862f06fecfa209241004b1fb5cefc779deb0ee086d92d5e46160b1c4a525ebbc0e361562eb722330dec9d829eafb7ebfcca2daf58f735fc15bc1a2b48e420edc0d16d9eadd053690ed09cd2d360c68ac06f2efa999da96d6eaa1559ec8a899082cd839ddcae3ab0de6cc784f69a9ed0834a8136eb450e2edb709b2ca7edff20613831c85dd92e86f711ac1d7ab5b759afeca308a085cabcc6900a17fd66d839e691f6c283b9c577e35fc900c23a8682b0a622d46bc86593ca98f0a06f8dcb29ad7b5100f0f895f01db79cd37fa1b2e830377f2eaf95654051fbdd5a70db4e9c1044bf0827fdf67c20a9a60a057392f6a8f1267bee65505ef7292eaaa3d7b8fda99ecf4c8b328d9876b66318f638cd4a8563a740aac0ad2c24b163157afbb0bae3d9d042bd4eb1c19a6e5284c469b830401f7011572fd2445515293f68cfbc705996808f10ab19840621f2e1e27eea5483851f62861b764412d4df6cefbc42aa65454e8637c01b5c3471d294f2e0ea33aa2513b8ba1bff87f860f4428259d9c5b17698cc95363db6cfee603258582e3a3e8feb886599d4ac405a1634c320e85ea8ab0dc6bb65f72012f82a2e951d2cf4ab2615661b1dac0db520a3d82499f4e1c5430c190ce7ee24b82faf0e2bd87cef9a780fb63d2fdc48b1452b81292d95db91ef22182c34793129d55d35aee2847766f6590d5e48ebd9bf382be4336431b898ffce687bc43ee1e2b9b35970f3da48ab318feff0e1613d499a1365f5d66f0535058f6e8e1f85936d2d4fde2464e4cfd1b9f2b29791c2dfeabb707ac2ec845e1080e3bed5bf03d243a091383bbe4a7974e04019b4d2875e1d4cd1b73d2f380f960249bdd52b303ae0c425fc298861d20f54f679cb1c25244bae959fb716f0b6400a40002edc7119df085c8e702bd165fb7864476cd732cf00516a98e31c24cea8f9551a255b6d1b88ddc39392310fa1d3db3826fcac26cae5e59f3723d76ad52b6007606b208a9c98c4e9701230731222edd08d0d03878446dbc1ff0bb1394661cec56762b43039694e3cb882a2a2336330dbee1065bb97ad9461650d41f6bec6a61db39e8f146e94ea4bd135f023921f44a8ce995b6971a4affbedaaf2499ad4768ec991299da88629855edea16d9aa189c5a32a5ce7bea6af000d675a986715c0771dcd1c4273b77c87c5df4ee6c9b480b10025d2dcbb4de20c58b4d379a005048534b4cf995cc353a18aaa5135bba2ba096a2e55af13e5197f34260553d21cc33782eacc08c0146f8121d240c0dd06a62d45a66dd5351695e7343d58bd79e78cfc9cd18a174a44f0a53fe9a61e9a4ac5ab371083f5bb4ce7c2ed6d561d03dfb242e6fb925b57bfb76c2952e9b59009a8e1931f2076f3129f90b43886090c7fe3a905eb7d3b74fef4646290941c3aadb08efe04dbdf98e22def1d1150f7f03281ad5e03934e2e7d682c90352db916b18d01ec740e960946032cac9a5f606bb22cbe73e67ce9f0d5630326c32f22a0bf9ec8d2ef4140c0b8cfd7d735f9e8bb59355acc06a2c5487175a69aad10df6522566235c90c565bb4d48f2176c8e78ba24c10ead6ad36b1ec207550556b45d084546ca9b3d85d36b4c1a11fdf34e33927d16f44f8e4d4a9aff40e0c7e96fc7f40092693123dbbee5317bc26d1d672605455c45ecff205bc3750cf136b4c79cdfff54e767694f8eefa373edae1260b7db249bebcde5d70461cd73719cdc434491ea932e853869ab524a0b7a09f9c150dbc4dccd3a67f7af3baf7d463f8c6c28d2685825d3b7b27dd6cf4a51c6fa1358cfca26d37aad0ac31ac1335968eac8ae6a21aab4990fb16d42da395a2d3fdd377de182e5d7e098a8c6ae9c925e1ee13f20be91c31e67eee16012de7e85eda754adaff7eb972827c5071cc0d96b513f44bde7153aabe8f242f62043a3182ffa1929dc8dcd03ac4184a5b4a817d5ab68230a433f0188b944f9cdab70b22c2b5cedb8114c7363956d4c671d5b32e553e646cc7b1601fd046d6cad5c6b940a09583821f63dc6ff0a348616ffe114e3724113ce36a22052eef3055ddb3e2ffaf273632d3267ac1e341c987a0443a3172ffff4d71dec47cea1602ba7cff16d430e37d4a46ed30e0a3bafeb5bd288c9c8b3aa50aed8fb5fba453b4551e18a352f842bf44e5187d5094675e78111b86d4025c98e1c0ed84e5e010dbd24b8136e047dd72bf2848de7647df5f4b46adc77c5aee518e96789fe02fe5dfae8fd93020b20c4e25aaeed2e6309b77bbb +0x8ecdb553cfbe2451feb4b6440056099dd6511faef2ac7ba92b646c061be2857c5bd09710aa56658d4e3f566850b680b23f2e01344902fe0c83e8d3c8714c8fac +43000 +0x5e7d99cebeb23c5cf1c7340b5b5e2c2d1af148a597125a485bf7588a25350e5639cc103dfa64f3d3bbd6bc56d3ee9991ef70cf00ad58f43566665e7a4adadbb8b37da298b3e08ae7efe87a3fb18a21e438d4e7ec532d23a32edd8e2d6bd0f86d7496392610af6b603506560e1ebb2ced9c2577afb1184f595b63d0eaae9dcb3d2522bc303a58fc063437380a41082275c46c6692f0a1e02096010cf83bcbbef06e2613fe5963a7a19583087c43f96b4458b19edd38503ec087be2aa03be2374df6ac26d89459d3f8fff2aeac4b166f22fffa06d8b0aed101d5a2122ad668a01d66bbdd0613c1e7d41b8d13e282e897d7615186cb814202ab28b5adde33e76028655c20cfff234dfd915b1d660ff6492a27bd06fdd29437852a00e1037be6df369c96d77d80076c3b0864b57f1bc8eee5f9476eb7cc2dd958818a97e3d5ee850fb371ea56bdf6ac5629b1c477cee7efce7ef5a641979451ecd55bb8c46a86ba7a51f541a3df7875159b4930944fdab2ae5fd197e35a510609cf7c2aef6236e6411e2bc4ab0d132f410635e31fc729a14c44e327e53eed5f7716f4d7ace486712ac41a5cb8705142a2147bc35f5d5d2372d3323f8e6aefc6fd53cba54318ffc3fee8caef1030b917006b25ba9e3afd9fe6b7c6c82706dfa2652e0a7efb27284484354466fc74d31423b33aaf2285917f7196a7a8f83c465a754eb8491d39895d86508faac46428a2d395c3893567a22adb19dec94932ab58f65cddeef175ab74cae4b3a2b0293f2ad7b8c7321d08b708ece7711162109603afff8254bf0415f31a97b93508eba012f8c64e91228f58816ca96b6a8aff8fc36ae0ad65cf0e4f403c11a84d13d1d4c3fe64618e8e250dfd2206d1bb0b271f00eda7690868bae2c5f8fb88d11a0462a6b13c0611a7f15fe4d7a7adec2bafcd2201fbbb25d43055e818fd62a865acd222d8f64702b71cd59e533306e433bf22916e84ada55999301362be3dbc3cefad9e3d3a2c4904cdf8935e53e58d6b81a5b6fceb466e401dfcada0e721f4e7f87a84a6aebccfd72d4e2cc0af51ce1a1bdef773d88e69d1e3401e981f1638adedc13bdcfdff7a776461cf40ee528f89b555bd9af28e7e531484cd130f2570d8f70b2ba7cdfd332e99b9e5a8b8f0b8017893713ae24d9610d75124d85f5584ae3ddebccec7bfe342f4dcd7beb73432c88b1f791b4fd3974e552d8ab1b6af5d78e8c5561b924c70fc9e540b4b9025e32617813f05e2296b56b5a36764bc39e17d1f456154d6acc4a4bfa9eb16eeccb465444229c04356f870203824ba1afdf9070be845423de8c5827e61dee9772f8dcc39e9a113196228e3be76277b78038e5cd3356aad6d075ddd04064b8ad35857a21ffe0ec80d56e1f9b6e4d96f7d5186c5a1b4395d0e1173ff791f9cc2ab4ff8301d09d8a5c6390df8310aa25dd2f1cb8a9aee1819c90fee2e04353859a71a5abe5c936673ed1393295671eb0f1feb43f3e86a70aa4608b8b3cdcf87176ec36393042322f929ed5bd44ea01a4b0b45d848b3b0aad92c04b8d6fd75f1c4a952fdf93c42730123ce4d41401f99da3e0971d022492c6c230bd6debcb0de27ffcd0f362c77c15182be51b75577ce84613ff5d45ebc602bd526fa153106b609193e8193fd4a75b3efc54f80b52f23101ced4e9c8f91ade0e75c0cc18501e1329eac3b58d743f5ec12ec2fe287cffe48161d6370db517a5104b6f42bdf29c76a372024cde1ebaac7923ad926f4e0c9f2f8d61c986d833147d23a9a9b6805d1798ca1263a44c9fc0b18b8359323e9ebd76921615b6baf398af9f2e758481d6526443728e62766547f4b6c2c733c72ccbf12051a03fe5efae222e6c1aca6f9ed3a08ea131ab34818edd460a40c6903d4729a8a2fd64d16dc17f51d12ddaa22cf7e7fc3cd1e10f9b21b5a9c86a8d0256bb7abb8881d816247f0199fc0347e1f75b752c93f3a650188d18626bb8d995ff957ea980e1fc1c7a3373774b4f9477845b0280551b6dae604d900082a03ed3ae61b0131a72636cf58b2f6a5d77430b6a930aa7decd999328cfa6f4aba54f43d9ac8988b3c780701ce2aff3810ed5e6008fe803bf6ecc76c8afb7bf255c6d5f07e2956afb65e5de56d66f93846abfcfec9e3514759378f1d65a5cd0ae2a3b9dbf805e4a4fb2060049e308daa63f7301856a7c5a7fb0217cc85c00d994831c7877123e972f50637e5c74e63984e19223716128565c69587015214e3a871b9287b524c0e228a580b1152892209ef59fce271eb3989a03708453468f53e4482033f0148fbbba45d030ea5a972062efee3a2cffc89197332c21e9385ee63a9d6815ce8df57452a5e48662a76fd96f35201fe980b1b1f26ccdc17d734741f88fbca596dd9cbc904a301a047b868c1269b7e7e34e19aa2a14e7eb5683b2f7bc93a05befafdfe4d1a74574566365e8faf2282aa0c46acabcc00d282ae62c97e55db5a14f61499dc541972dceeb98509762f340b8602f9418f29fd051273e7311226f2e1c9e6437b9ad979ed47098536640abc280bdc2a6cd2122ac6fa34349ae963f5b0da3ba534d4fe9501d8ee071f5ffa4389049de7347d047f4ecf6f55c3c2d98b0693db660eeaceed9f0b30b3ca5048f1b7d70dd7a278452424faeaf5b486d1da6d5b8e2f12c492aa4f47963041203ded39eef4a3bdab1d42d0e16eba741b930d6c9a1ba8464a91f399f5e9278cb51f6097af1af38efed601dbeec24c0a6b674a8cb94b78b46515f1067bf13fb1f936715a84476d1b5ab788cc88b054815d95b9531ee64864fb64cb1d427621bad3cc4909d442bc6ea507002b16fe7aded864844b32b4bf5cf5c7aa66b24074ae2a270f2c06d4868fc90f90810275652bc61ed0fc5d7c86a63c86b66a3316e196e890ec4c84c57484ac176154b3ddbe700e09c8ed0808444ab7e916b02ec21079f44f08f0b5dd2d5738669b2f91fe2cb3986d91a6991ea24e4d38f3c1090aa85f36ac8aa001e35a1053466597049f58fe4c9456af7a8748bce8ba74232eb7525196ef9ae4d0a1a2b5e7fde716748ae95812c53d91110bdd9b6fb8c2600391b555fc5f62458addae50dbd44a33498588cad2476ed3c8710af4c97a0400f25f7a765045074a976025e81713b677eb59dd5a746312fd068376cee048638962eb48b97ae9b47c60f2b08683025268c3ce8f12e06151973207c9319b6a0785bbfbc82862938f614b5af73107e9479037ab47fafe89522ab6c6ad26e227177b6458a1caf18bc083c162a1f18b0fbc77b0baac19b7223e3df988c8b39dc9bcf4c7ca7ca70d18706a2bd057cef7bddaa397c16777f1763c596314c2e3b4961d774b1801c89f84c79cef6dc0d1333bc99e52891f1c95cb75055c3444bb10d7638c580cd7349015eca37701850127d1b0f04bda7d118c6a11c94caef64597d3b5bb566ca7f3c614080729544d67bcc7b71fe87b295dbc9b372d9b4b7f8832d43c8dad01180e2bc9424e6f2dc109d86408b59336ca080fa60fbab1d3888cca201f89c693d38ca67bc302b05688f164f1c83ab3d1081b6cd2c2f7f70eb85a4500873807ea7f751e73b2aa53954b2749b62234af158d9dba68786dd3c4b8f98dbc9c20d9cdc5d27dfa38cfc2b3b2b16dfb3c2df1cafe96e3b058a2aebc2f71889c85cba5054daaaa567df864786499ba083eace0b8060ecef28b20f1bfc6cb20e86bc1d15bbe058dcfa8ada1ab0ae71724513ae4a64b0e6376396f0295250e3ce77588c794c1eb0eafe277e1164ba16b999d5e655e759d8a8388154b06f342c3e2ccaaed7bfd65153c52dc8c7fd0d1a0ad49a0cba62dc42b63a39c32dad86f9f2197afadd71b7a8ac021660aaf417e9da97d887f471b8a2e5cb08c21d87e9eb7ecff1d6e6fc2335581769dc46e45b14ad5639fe709e6f77bb7d86b7fc98ad7f38b2c7e970c9b965ec87a08208384718f78206c6cb33613fbbc42c3b475a7203b45455992764dae8edc542f87b8a7c654dbdf77760fb5e794b2171b28a47b8377647337c6758180cb072d9a62d356b88147c6496ee3097a2fe37efc431eae078f2edd9f9bd1df16fe8f2dd2179d3850fe02fd69baf8dad4b595a0ed6daae9b46becac1979510e7710bd7b5e10def695b354ad5fc416d1fe0c11a4760e12d493f4e5072dc8bfb7abe7d940c6b35e37908987feb4f30495ff1e9fb31f8e1c16ab10631764f0e181bb6d2ba3936ae4a44766e217efae8ccfdfd186f57155915705a8ac0345597f15ae88facd4c9c3ae5c434ac21985f7427a70f1091f3cb3841a7a509f4596c631a8c2290e679b026a10fd92e43386d85445ebf83b02e58db7a9bedc212268f54395d223315a21071802e3fb0a6564087cf0cc92879a86540aae96a1f84362b191a2a702c825023e32c2b4c79717a40426fb9144715eb58307a9702687311a97b64faf4c3560a51434a0dead3cd2cd57ecd6e8a28ab7f9b7391af9fe4063d6f42c0d6963fb959025b85dd0004e2f567029133121264ea94d1993828dc6644e736d5c53eead2c49ef182a27555d75c5e97620e944f68b6ad12373b8598baae781e4ccfd40acad38dceec64330ed5ea2205e809f925de6a4dfd15bf9e602b0189c4ccfc40e8c80e38ba692c217703251b14cc2b27ddee8fdb5cdbcc5b7ce1c784eefe556accf5fe057ca10127d88a97b18bb67c07bec2acc1f5316aa4330387d06589e13afd792a5dde3eeb2d7891c84d344d0581127f496690bda261cfbacad5f117a999c57b1aa9a6e5f21ba0413f55d53acd7e1f50ef32f72a7b7a962d17fb594db36d6a23574f9d401fd998c284333725dce42f5b248df11efed7d185f6aa67d509a0359a68b98bf77950a83b1f4d22b43b9d88c873df45413260c7e9ef4ae157b3186e08d54d38b2086618d4990d5e92f18f72c06190bc3d1ffec2828b43907ab7bf5d9527756b18d5042fb778dab26506a4376b78081eb7cd97087751fd3ce71f7b4a67e598eed1e7133609471be7d683c21ef03fb0335a4514e2f1cae1ad46f3367ca9971d8786477975f58b3ac58c6fd36e773eeec2cb8e5e98187c55aa3e39d73c81c66effdffb2034a0ce9e1430d2be702afe2b95b5b05b7213f1c2fd77fb46d217f9f21d830deebb3597af9c69b56b6c2f06d072beb4f5b80bb1916c9a406b8694b811ab1b84cd51da6fd525e01fc2a9aede43228ea113b1274228c04f112e9f208b336f4e69a440b7dd78763c18ab71d00fee6dce7f9da6902ef1c03d757767e2fbc033c5c35acef669005826a80e0abc20381a26567adf6dfd52360d742e24038f20bd279ad944bc9bd59346d8d3bd9b9988f33d2f94a4e735b5e866163b1faad0bcd51df708ea34fc5fef43afe2d2950348bebc11d23d266081a0f16486a00044fa454fe1cf0783130734c6352391d1e5df444a051cf151051e245665f7ef2d7543d4646016e4d468332976737f4278c7b54d90125a0a91adf43c3c21775358eb0049057cc5ca4d844c97fc70dc2cb13132a1364074ce0ddf6bb24ba1ec16aa2c976dd93ec5ff16eebb46ff352498a5acbe07e3975386ee23eb4d2cec407e4ac2720889adfccb582ee7fe28c83dce7cbfc1483f20dd795b01dcd4870a59d46035f7e2bcd153783bcd37871f3311165df3a32cf3e2fbf17d02a6100304215f160b90c21bb3b24de65215a88b7e86b870cfcc7ba7e596347badb1c949e17e6992cea4714d5a02918245e82b14af86fbdfdba4fd0232948b7e8b65c601a95a38fc059ab8fbce298d362f17d663d0f829cf9f947aadd0df3eae222bd1d2659c157d39dc5dcd1811892b970c7220e8c3886aa402b950c75d9532fd69b0641c2c483df1d1286a3fa0cc88052ec6f300d161d87157839220f8d833a1882c60d6f21963b5e1e37b4bc0a07601e59c821f09fb418efca01be2964ed898f10d6e9bd5d0170d7454a745584b1d1499ba784d53a0cc8457d8941521404a690b1b3574c0b48382f24597345016a4c5b2e97b929796a1dad2f3a5c280f6b09c3d1e5e68980ecc9bc47cf3209049349d98f133f7bd26e918d4b8f5f09bb833b9f1dd908046261de150c16212ff2cf423b49a4a83ae98ccc7c4f02da75acefb498e2174c3b2449cdbffde8c1087070ddf6cac653f5034716e0c63f4efa57f2fd47cb2b239c4b0711139991a250f21a65929ee2f318c42019513d9f3d16415f8e02258f1ea65b1c50b67bcb45680c3e81a54294d634b09a3c4411ad2547fd67df7eadbd9df7b91c052ef0d01adc035fba953256add73d28084feed3881de0be7a03b02131fef96896d3b55aa31b8bf068e90aa2ca5ede5bf5cb21ccd5e6afb5d647d9647b2aa0949e4b15b56ea50a9315271803bc5a28a8ad5c56d3af609f008c919601ca193322740bbe9aee1713aa67c606e404579090675a0a9274ea4300f5975253bf391584c07c0c55a1d01bb8a94c43ee32b59a95dc7a9983b7024049b9cfab04cb08ec4dfc428b801a6e974082205b6cb812cb3b75049011f636fb4d41910c8f6e071bf09fc5a8a4b8512ad45af8b9fa14fd96f3b9ae8ad7b2f6f88e1582034e18c228ff239c003e2c163ae6cc2bdc00c9b4825122cef65f6dd0ac8ebe190bdb6bc887cc102c1eb6b62c3bea3e405e3b56f611d638ec4ef38732abb193dca2b1d768dd09fe0c50991711c27129ccace43d20c9e5749d113eafcb6aa94f33446bdc418d1b35a3426f9f5552fe372754a5fcd31f216e47d9bb47d96dd838b38d53fad12c926f8770a4ef6561f3bee6c1fb166b85fc7e72f4d3d00b29c0f8d3da24a3a61fe1f42f47d367d073f45991815e0a7892e93da51f32e8cf22f6082ab738771eeb9c7c11447599050d626fae1f495988ca7a1464a532e2a3edd9df2e9119e5ca14145fc3f2f613a192e099a30837740aa111ab38236e6e17ef0ef636144360362e0c27bdefff3804a8d14ff6b8b2fa7c9b625a76163fdb99aae7d5f7ad3f76c1adc66c7577dba6ccb3c6fb3fcd464d5d2dcebac4fa41cba7a60706d9c888ba1af7e586714725b058483433e4926bfd3aecc9349b4bfebed064def162f2997aa0b0ec1e37ba581535da9b826bc49e8a843ce4607f87d115927bf23e09b7fc68d14d4c8c4f6e0d25f3ff8f5f5bb04865c7b292c6c83a63706c3fc33554952bd54b4179691ece9f63010b62332b02141f83d276c02bd0204fdc34d48fd9f6a2707d22152d2c58996ceba2c69660266c382700e2f510f58214510fa8a5f068eaaac56382510e8885a4223a2f018199cb105fe279ce0df7235e6904b2003e788ee4d27a537d1bfaee993355fdfd05d8bb686cebadc379616e9e92d883371a81e9cf12fb0afa0b1c3ecc9d6ad5f1736fa780fc80f16de9d0de555cef8ea32b3195ca155a0b602268e0aedf0d298730cb29fa7d46d735e5a1fd0325be46ecd6e40d56481bf738186d8ec066a17b16f477cd457da1e1b3d37135389bb94e6ca435db0429b530fa43a69391c2cc4d3904f1ebf26c26835069bb31561d8507bb2993694438ca5b1f3a8099a381e2125608c60071c7494e93eeec5bfc29960550bd7952a703afd82f73980b7602876d066670c5441d9e9616f97 +0x49e91bdb49492471e1474a3934cb235d877451e4eb447fafe3a01f6948e06fe71575eeece2e41d9634110be5369199458c4f2f68ca380079845138ca5c4913e8 +43792 +0x0e7c0e3ac2f13b490fde401b38c3a8dd47dcd240b700477c71c94b95faf5b2dcea0cf5baa04385a934a15f83ad60e1ff7496dc780915eaf1f58f025700fe4905a3422b8ec00cabb691fcf7c1df0640f1741ac84ad2043d98259145b377f35a022366d83e8c1454780e36305e357d6cba2db0bf3b7a96e778e9163d32c79d8cd950c023526a2329f8949931e1198c0e6289a0e9d5699391992a68115b58c4889414983553c400d23d096b23d2f2fdcef26f316d9f08c3e204cecdeab69230f63b563536c90174f64f57f52dba27965371c6ac7421bded83c0bf8ef0ccdea87cd4fee04d3a89473d37647f781f222046e7785925e4f1db1bd5e3f24a24a2f5c569f3e1a230c44151fc1a512c8c4a624e5c6c80a96f0d53534c2443214747df77011f805e321a29d7a65fb27086072614d98a69274a771ed32c69c79cbb362e3ba56905a9c9f3c97a3e1dec6c97c1324065ba5cc8fe9904427d99c8e40ad6aab85cb9b7aa7bb7e7e0cb3b454946e04f7909e4a0b412dacc48489e8c20bb8e1b972ef7df8ad3ce4cb155a1062f1bcc4567ccf07e120ea1408e945f5c7957c8487f230bc57056a0c096e53776459feedcb3b6c63e0a7b5826bc69c47f1765ebfa1944deb1858e950b3681e5dfb459acdc05cf4f28c6e066477acfb53f216d5ff90d9856ebf10216f43b349387a3d26f0c042071836bc5336b6ecf1ae2c0f88b0d02275cbadb3a89444a0329b73b90a03559b0159924b227594370dbb11b8dd9fea0fad9686bbf58c30ef88fb7a41da51fac8724b01730aadb9fbbe1f45bb4b0939018b33bcb18e9392c1aadcf0501e892a4ae84116cc624b72bb612f3a7f578957a89d47c20cda66e4f716b4786c2cf56e92c1f044cfdfdb68e6b57f528d99acd055622729567f62a1d06b26651eac4322409dbd0df5c9da070e2994405e77c00da8687674f6d40343ee068768b012ef0fd4ea2bf4c6b6c3d7b22be2667a887f9a121eaa17967ee555b0777bd5f8d75561b025b17bcb2d3555533afe476a2237f0130326939dd67551c84c584f318002d272dee2156ba38afa61d55c5595fb959a2ba4907b75813fc285e3c126f29393cc8d74225430a041417e897133967af502dc716c31d605a11289dc3b1fc49874da709416baa2aa04c4f9d5c143d406f2c4a6081e5907ba45ec34a41a7c2fe52266bcbd23ab4a3721ff7448e128e745fb5a08b72b43a3359a9a26ca03de8d30390bd23dddc88fce455b7e31453538be9b2d852d179430fe1bb6c0bc7bb964d0053451b4b9750bd5db53684d620b50b74ed99bd867dd397a45cca2f9e69f6f6b237aaba02b4316f45081d2ebcc0dc7e672c8cd37a0510540b5364e10d8e2d5581049508eb7a5599031613eaae7def6b2c38599c935c25cd7c6ae128fc7466f2d681ad0eee33e4c301a7c1bf949d175b2ad9a720bac9388a6067ea0d5361c75617779bd3f4250575a683cfb556697bd5c9d61e68d893721420132697fa9e7808aeaf065fe39ae1385a71e4d4dc29446171f9677bd303faf222363eced973a29001ee97bba5d8a093853ba8250e2599878a082a619561f9acd098d9bad9276d777afff6ee2027690f8fa7c5afd5a4a3d07ccc0e2304f596cb9100a064e00400447fa9ca003ed16432e17ee07a17f089c3b00dbcc80a06fad6cc383ad3d750847f7ab3bbfae51dbb87e187a48fbe4f74e98c93dc588edd4c55eb06510fa75420b1d2e673e3ff529393f88cb6f5b00a8cc8792515dc77c3b5d155338a213658fd61ef0a97c373b917e08e53c1b4d768f8eae08d0f5aaffe5dd172878f106ea4421739e7d2a3299a6cf50ca66bd519b3e1d7279173dd1dd66bddaac908e4367f185b1844c98a093dbd5ad84b5c5f60316e15b8fae96aa995077d65c39ca67533a7b6f4ea2780fbe930985c0a3d5a932cc82ef98f180b3b815b3a0b3bf45d150616af35a2928de7e7ed36ffadb6cf9aea16aa541aa9c7bbe48c9b04fab811fd418ecf4332b2bab5801dbc28fa6ec55db4810f306143a71104c529b8c88fca152b369c8662310e4df9e8b241bb0e44c3d131e7f42e8fb1262a2c6a906c2191450e37a067fcb492979d75a1b1b63d54b68b4db90a4735efe09de9e8f2b0176d7530b8634cc6e64c7cb3ed11e0b4a4fe1e28fe0ed974dc6928a7252b475a19678ddbe26c9e8a6c46e2827788367ceb49e1f16b6dc97f2c26e78e08b9f833ce867555dd43c60ef188b3533c901bd8b93ee82ebd5e422ecf2e039bb91c6b03dfd216e6d0702a1b1b18d56e64b0f78eb6e31b271b69ac4b6a89661661dc0a92f35356d8e37b34789200321b167132678b426223ae176f9ca840f647277f3ca7b3121e7140ed4befff48b0a27a59342be063a66c9deff3ea2e599d75348f680cc71657fb0c4ed6460af6394ab9f265a25c4ccd48117aa1fca7df41eaaf94f887d667e7bc72243f465a14b45dfbc42e93a807c100323edf9cb9d7ccecc11453e1880eb8fd98f9edb798a908216755f5c86c9c68db27c516900c4b25c49299e1e28712b005a65448616bbe1fdf263023074f11ac231997afa1494234ba49aa0a51787bb91ec5beb80b7c5ae0de5fda2119f970741e2f3a109718c5e1150fd036f70652ba8e1dbea57f738533683bdc56c613c1a7169238a33a20db141f0b91cd9dd79e9a9ed5dc7783f74700c3e2bf29d5450a2f516919cf520a8cb51e667837099367439615a096e0b0a92f387b0b04103655f318dd63fba67de0ac5b470adc04e3b59cbe07936b5e47b2a90f2f464e3d8fa9dbb216a091ff22e0e11ed7d125556f918d5dd03c5cc4646b549025fa6e25f70fcf693b57f825a1933daf3d5478c6de02febd9b23d2dcaeda190386aece90178db783751198e0a102a655a21b3e1dd811d7248ed1366cce09e1af79ebd546972e7b49eb55d9f8ca3305592eafe02307c500dbd1cdee3d6b0092dd2738eb0e1ef70403c6ab2334c63043030897c4a01026622a8d9f64172ec615d5b71d78b154f238f92d9bde5d3a01469b595b545c9e3ce358ead0fec1bf6253df5222e4f8e226007249ae723bd1acf8694884f71e57106caf0fe72605c5df334320d098a8709b45b8416b4796313b40b5fe9914afe3a9e675256c43a9e9429c4848aefa8ca55aed113e5bc53602b505c6a32215d8eb0f37f353e8bc76d2957837f345736b2a6ae1c6680455e3ed2331e55ea7615f174b4971c2e2fb3428e0ae58481b6c0ca6d30a1ee6f05d64998cab5a57b1600c0e64023799e267ab952926f370ba4b38c29e4f63e1a74782b0f85b6db7c77aa979624c8c017068a2bf7ac85092aa79b726d297db80af7905d7702966a67217fcff4e0eba221566e34eda7cb7d7715f517977ccd0ec925db5b8fafd8c4b399fcf492f30072358c934eb522a6f679964ce6496d5884cd85959fba1bf28cfa47ae8fe0d99bc2dc2fa5e3ee8bac169aaeff58e359a4cc907d7bb486a5782593b100fc7f0332067da5f29eea614f5052a6a8fa05f03638ba93ea1455fade21287ca0e4ce1e57dfa28615ca494205365a33c644119f817b945f6d49d87aa90220f0eac34e797190d3468c107b9c722ae9ccd3c1a6d61ae7c64671cf6ea34d3b05b45b0280b313ec987dd1ec01defac0b9e85dfd2622671fb8df940f99134f5e4f4d8e3cf549c3256a8263c76c88137a230cc1512002fa85f48140a4d83933ce7612d0dd2cabe3ddb1fade3d2c3660c9bda0aa58250649bcf1d20409ac837f1e12aaef6d87580a98075d9da7b1584731f24a758c959ae91749585ab8a690a5bf9d8c2658a5ecabc6f3111eb1ac6c5b356970bf69024f3d47537ab13c36df3c458f2d023908c85c0cddbbfdc57df101667ba9e477eb71daafb8cfa40eddcd972260042f9910797fbc5fb4a76d9664ce27a15c9123c1c125c2e1bdbf9b1bfa6ae8a8b7fac35d8eab67c1a1a8149666360b931f221715bbc31356cb407b71d41c0ac1aef07250665381dbf97c54ee43cd84a95833ac67a01733907ee33a6fe92f0b535fad10999efcbce73290a91eabf9255c9e226e383cb686175f243266a8186cd6408d1889a72b5b7bd3817ba7fd4d5035679ad6f7d015ad63d27ffe16af6c91b3081d04b10d53f02252cb570ac63eb7bc3ae9613718b8fbfe7f4317c05d902c820cd96fa0300b1d4336dac5b78541ae698ebab7666515045fbc39fa244127afbbd54eb3c7bda53587063c424eb8fab6c5e97b241643ae49002fb12f92d8976dd8d7f97b9814d6cb36376c4730dfde6349c19741b743095c784035229cb2741961ab4611a1c414610950f76efe7841267dadbb9ad9c1ba913074527db23d2224dec5c1307559c27958c94a041800d782ca144489ee6e1699b152859b73f73602b89e073273347586ad26f0b11e08161ac77bceb975a6b1d883514af6426f344577ba64a23be2a21b8ef067f0610c6130fe7ab6840ffa10d01f071f38be03816f94a185fa2fe2dc9a769c3c4c817c6d77c76798840dd6b802fcca8ebd3762c1e3b7c9d7c4dfc399a5eca0da100fd67f41bae8f1340fcb2c039531f60e5efb6a3439b9c67ccbf34da06994bdf56cb93b4151653d1e7655c13480d3f196853bdef392f7fe9c64f08d2c65fe7467188315d92362e8ade1f53c2848170e005aa2b4846beadcae4b59bcac7a3489efa3c2938b9978905cc327d1414371b7b64fde7f792d28ed2cdf8d70a30edd6af98ef638db3c0ca0b5aa7c45321b7a6b32c53d94344f28ac92920a2d92ac6f941f4aac6a4a8395b6430850fc5d28a7b5005b5e97684a70976a236e681ddb4191bb5743cc4bf8ba2d8f5d445b45037001a992affd77c7773a2de408a4870419e068456ad36203d092f519c5066c2469fd98dba03ad51ed3015854976770cf5f0ca0957ff43f4d7f630eee61724513fbf548c6ddd412e8ea89740569255d857772feb7f1b3163e2d3a471b9823525abc7543c4c75db39e444f0b771c62cfdef9cfdd3d6e94894e50753851e79e3651221a1455eb3c29a766ae791a1fa42a245c5fb686551d2b068fa05d01ce4743afa340350ac80407acc834676ef16e1f0e25cf253333c15def31482fabbab31cbed6842053cc29b016ff8d31061024f0f4dc7aa3b48905a470fbd91ac03b762417225250b18631c56e62f570402a6d4260e70ebc9ad37e912435dfc8efdee4fc312d3750b48490ba2b99299fdd7eaba5daebd7da569170a68185c8947b0393f7a53dafaacd25eb00c718863a1eab747ddb4182776841a05711522018025817c8dc0a37c97c08852bd95787b9842f3c5cea8e8b2e407272154c2172be062ac4c25de94c3731ab13bdcadccaa8be7887a581394e799f925a83aa7a4d11071a3f86a371696e9e6c0b19241ebb822e25cafa17b868b3a62fee04a4d2fb9b75a4fc7835292bfa12e9dfd07da3d6d043a59abd46b2569724b9912ad3b22ac7e23970399b76e0442f9306762ff2a91daf766b81768d948e6bbde858af9e3720dd662f2d3ef142e75506136cc391aeb4b226a1c92fc0aef41bab5830a10dcd30b7a9ade5a81ea05e13a18b46c0f754400c14f206fae202729500652550773972018260d55f55a502fbf3d276b09a364a0dffc0cd30683b84686b93b92661285f5b7eec8edd4cad906e7b8d8f0af0c13d4815928e88d9c6a4263b686eab62067325fda564aa4a4660fbb710f248a191944b14ebbd6cad105c2efe57b847d05037f18d20193f04fc0f14250142e21303d9776c30fc5468b5071332f628946282182ebbe0ff13d33af55843e2e37fcbb4876d9a06adc873314f4367a822096f38be6df86c98b15b8fae38a21a667a4200388e0cd1543172f19f601b02472f7cd0851fd12778aff466b425be3c4e5a0c93376953258237ee9271d9ab790a6f01e5f6c4c4a61158445c81bff6ad0da781ca3e700b87aa442c706110b790ee50a4f59ded417ce552a1dda157fa0126db5831a842845c5eded337d7b5cdce657cbc6be4f9d5f08717c3669d9e26bd2c7de655ff515c27f270794560393ca5f23bdec5669b00c5592fff93d0e30b5570f7b293be1cf18f17916525750ba2ac2726829e8d11404fee03dcc1d5d7265ea6e153976f05f2d630ca4d5490bd8e3576b53e63e32d1314a82bd18d26eaf63d30c33fcd8cbcceb1d073884f3dbf6df663706891e32f07983a1074625e8ef975a105dda291a1e3966935bc91f691b0537fd097c517978c6ef64a4bcdb743ae9c7a31b3b30845dfe88d8930b935d4f3d12e6e5259fb071ffd8f41be4bfb9994161ecf687b6b29224c9fd6bb3185e9a6f3e1a21eecf7fe30c8478f4259860138771147526834cc592722b68277614058304c0453eab8dd7d53c19b8e62d10b1a33f4221815ff9fc30ca8914d075289762ac00d97cf983544147ffee9147727a7d139f80fe126141e61b40f616dd4259f27e0366128208633aef511e8dae2d76fd35531c06632d9b9cab7796627509511cc1f174670ec50ba87a38d0422aeaad0cec857d021b05133ac4577d1a062689c9bff289e36562547131db8d1883512890825d29580290afa8ac0832a8584009dfbe2c2fee4e86467e5c63dc778009ee723d04aa72e07779ceabb13d723300d74807caedf092d9eab743f746c7ebbb079b66a288b67d6179950b7a27e25f0efdeae2f24b51f90547042dc052708a0e7cf2445e498ea1f7b6e3128c775ea31183af96cdd2794baf654e64e588da26ab545e2161776113e138a20a0fb550c9b26f7d6d8209d150814d7b2e8f706d863997c943d399969cc607b8392a6a1f9798cb3ead3979bfd0230675d4e6939274614d1af3db3897044f2c0fe8061d33d66b9fd99f1ca8ac923d98229d1178afb6cb7f3979a1dbcb1323ae8d5ecb56f44dd5f1368b5020015f760c6cd339a72e151e350d1d4e0a9a90eb951ce5a09dcac67ccb3db9006924ff76693abc85a97559037580270a4e6c454ee9a3c3ad7b1d070834d67052097f3ae6b773a21e05ee4a214979defc2da9f8f5b309411b7755da2235e9fa6e8a78d86eff01cb2b43ffaf21b8e18c4d31b97287fb38a7121ada0572d45e9d7d7479a0b548cb80d5ec1252aaca9e7724e2057badc7173db9ea14509f1b1da2a74de95b649ab90844878ef9658899e7aac7f3db0f218e4a39716c8552120e51139f30d122fdb3ad9f9cdb6df9f9ba260768ec5954108518ba37486a32c01af1eaf1b6ca987aa1b50fb361760f26ea7b624d59be249de4ed63c311c9e82d27cc53cce20e6e186b69bb5587db4f150f2de3ffa0d229ce93125c9d30681b611e2877b71e644be0fa11cc09b76660d01285b4052b5d08ad7bcfce4d0b0f7465e84e7e3ad296d7d834f5695859ddeb5fdccbfae760276c42826be15b0c889a406b868fdd646abb0a025cbbc9d30997c85447e02ea9f7fb949130bc509a9a37fa9117d2293da99f7e4d90e9e48eb20d1561408b616d975dab916488b41c0cf09c414b70a5c51b2a3bfbd71c31f2a0f54eed00260813cd3b8f68506c0dfca76f2c636891da64870549f57a7c39689af679dfcdd7ab05623d49003c91e5a1335cb5deb75c4e83b6d8b024c03083566ab8a01ff0c6d3aa1e0adf3f701ec373785e3c9c80fa8b88714a786ff3619725d6e4ca94b11d076ac84b5c0f333c30da3d1ecb840b9319dd7e03aabd5936fe3ea72200285701d0ad2aa7c557cf13b33e4c44697e9f4e7ee8a5ac4ef83cd83f07a41949c22c +0xb1b2dab94b3db9eeb1d579e65f06f07004b98f214026e4d53b36917808cce2f338b6d195287cbf2430f3867bc1fd5c1a38a4cb3ec741521da718e2ca33c9359f +44584 +0xe0f3c6150121c7b86b2efd3cae3b9a5ca975a25ba3e09fec97549750cec53bbeb3c76107e450b47a85c0aa05d920b79e13a7c1e16983d3fb6bd615c693fefc351d19bef318c80947be34f43b014f36fd665d958516b2a27833bda44d6845d2aec4f3c521c8112ce7be91c2244d517d414b9d088fd2f6742d96112b2b752325ef505c5ed81ab187222edffb0ae6adf63269710146c4d5b1e03ddb91a9e31f5dc26a5d7162363280c0b6278933f3eb079769e069f415d9c15acf23c00fdac2e2edbafce605451c8188fd7053e89d941a3af2f226dfec8a0d63f5ef9fa581921c38e743a50a6ff5f143acc241700c2f96e1adb0214f726ffbc3574916b20119746d9a3a96b9db4738b96a253b156744e3554121428ecf10f4419c380d8082df50527ae8a259b299beb2e0a2291dd75b695e574e72e32af561a66cc56c552b6b19b13055af341b74eaf6b640f3d183fd8fc3973d9795aba7a8ba71f61b7a244538506389a6903f5f264c9308827994b1bf4ea8f89aed7cad334550d5033796f513f7bc8d70b646e2da7e1f00bc5d310061c533876433c28f680fb46a0ad3a9031470e268f3ee57856c5203328ac48371dbf1dff0dcafa8d6b1df43bc199884f8a2827f22197f9ad14591e7a6d5f8b18c969a553de9a85309757fa5d319cc505c24f438c4c9b3384dcd037263833fe4d9fa883d767568eeb01bb583b7f0b834b5048fb754ebd059826c6f4d717de244e170823ea167359f530d4a857188a4598da91ba4dd661f24f68b9e20d8ac28f82b5e5200c8a7588e7bb2065207c7d8e66b7b60a66424e8c233905992a0f75b293f2dbe2cf21c19e5af72b09384979b04d8e22566f30c735bc1e5664bd245c1fea6468f6a28b0bfc978b512efeddf37db5b46348c9106071626f08df47680a4a0e70f8c61714a94645de3f20f4c87f2927c0f53bf47faed1bec1b9835928f4a368af27fbad5d2dedee664199aa8761552c3a54ba71cd06e939acd4db5305afce918562e1c5c31e65f9ba14f390a96e742b971e3ed1870d0a6b96d761d57c901e118a363300f4df40e05005b9479ceb28be5d9e53943c35b7bd065d91410c4a3451240e49ef50f4f13abea0752fd06bc54cf461732a6af593b671c3f436233283d8e97790d165f419715c8191c9e264fc600214381481d100d07fa6f5155fed9f3150fec257b2610c2cc005a996517b109ffd02fce31f6c91a366733e7f10dfe8c2e10048f2b4a05bb57fc927259bf2a4454bda4c06a20cc897fcb51ad3f48df33620288f32eb568ab3e22894e8307049f884e69fffa856183678e924a4698c30e384e41f88d4d81b90adc06d6e9d7854322ed4834e90cd0307818be670ee3f445385af7474ffc970e4291d3b29518f758aa010707409c60b739d29daba013b801ea8f71887ca9f4d16ea8b6898fb0a005a9f26f1f061f5b413222f6bf030e586ad75579621d3cde2b178b7803dd89c973a6274825437c07f5ec71934a3fbe1ba78615d57d399c9e44c4a1e1c9898ab9ca290a5ac0ff9badfcee283af55d094be17f354e82d8b37c43fd52b8839b9aba31ba026c994364947dc0adb46864d92e3f4b1fac190268bf504a06c7d919a312d0e277485716bf06a1eb6ac94a5c150eea7139b7e9c0a3b1953425d4710d8c0ad028d1b4a381944990f6c540444ea5310979ed379b194c98374217a8f67e3dea59157979258bcba6716928e3fd4171e0c5eca2f3d6164cbd61fd450b0e759dfa9230d55f843c4c656ccdfa781e3d60624651bfb443be896839eb15c461f99682a4014e2d699cffceaba9a3c84e4a5c01b330ae428a19ece1e796f09d98120fc9b7104dad7bb4cc2953858b9b36714d033412d665522f5d6f94863f5c5bc8f118f1e638a5638b9cbd8fe91ab97db919b1f37d9fe54309c55b684168ca512422b77d0a78dec82955d3855eb8e9cc2ba95315fc718906ae0aee8a51d5af232d8bee810476205397e1b35d6bcdf4cbcde531c514b41a4326166d233eecd379ec1405265d9932acdc26a54099c1a321a9b592294fd061a17acf235a8e17fdf967a643939c48de7a000ef1566ffcbc77c702c069342e23c9b11f5758cbbdf74ea827f1f149edea650c80dec675e607742db201ae4b342b63d3ed50447c45871eb7815767ecef1f170763b5b933e74ec1e5af9e201d4b4016e92057472a1976129a9abd1e0eb64535f9a1bf5632685705f7dfdfe631db298af9a2b4895ca08bd15b5c6b3d36aa246aeb2141c6f9cfebe9692c0b290f4daf680e5aaf319a42900402ada8eded33835be3cb86301086d215457d6c1040079a582d3090686d674b529577be56bab92cb3ec87d5bd00f3d43093b948c44b73b201600c9e555b7786641ea1f39f25a4e5180b3d75945080b9e259cae86cb8f8be0caed62221eeda07e1a41390f1b65c77334ad5afdf889448d5a197943110fd8820207664f3aef9977230b5dc73f649aaabb037cbc331964aae7208933bdaecd6e6bcd5acf4223afdbfc96f214e6cd34528454c116ad2f08818d5052fb19e2c71068cd9424bd206036f7729a5a9a163125412fac8fcf309c7b9d076aebbe5252127986b6d2246c66f2a42cbb2ad1b5fd7d41e2a3aa01c49d2396e435983353fadf1e674779e07e00a9a333d8e8164315d5372c5ad7fd6187041b455782e19e2df0e81daa6e99cbe9c655167814f043f6c7714b16ac1a8de6879ac9253e716767d236e87432b8dc6ed33a531d53c81f3cce80ed8b98d1b0383885de331d4b66350dbb661958b6362c4ad3584d07265b4444f6820e10bb6ef8917cf305c1d801120db6252e632a5f9ea7a0b46bc1937e99d5428732c65010b42cd0b621aebfce9b5ce7a417c48dbf228432f61df5880fc9f9e58b8e0c084bd7553185fb466b351d65a0415a1f48db744b0a7bb8258c75412d6ffd74647c86eec50fe1172b52cb24d270ab89a5e44af06687d3eec419459bea326b7a61f54876d6dc65f9b01ef75e0de9311b2af87423814b9d1673a70736baed4424873b06ec1527730797185005827a808300fdfd8a05b615b396be10ae09f115f7369658db0a6196e522e75bd7ca950855ba5d3d908e67fc6abfd7186e61de5f67129fa4b0111b5006f5f4712160d93707d9aebad365d1af90518a84f45d059f088dcf70f7e3d51ce182d8469ecfa79b1dc15afbdf2663bdc8fe30dcdc561743301aae543edcff8c094c0b329c8190b31c03fa86f06ace957918728692d783fa824ba4a4e1772afbe2d3f5cba701250d673405d2c38d52c52522c818947bcc0373835b198c4cc80b029d20884ac8c50893c3f565d528a0cb51bf8a197d9d601c987429f89bb85727ed1a33def4630143362641c681a72926834160ff9ac6d0a44570a9e89c6468d106dd7866304a5a3ba2ed936b75936c553e5ac5319882ae192f1b53500abb7da4e45996848b0930608e8c32cb0d67dae5f76e3f65d35b590999d6aed56337f6021a00f6d0610a44303d84d87bd5bf053722ee27f2f7ab51f43a2514cf32646286fc8611c05ed7e6495459cce45ae37be7556d276f620d394764a93dc3f4cb6382203b8fdad0ec970a579db89b098f9f75136da6319f0b6f91cdb5825a36d759a209a3c99673d2e701aba304165e1de04ec1623cf02af06551c9ec7ae85502b5653d514779940546bde51c37cce5190ef303ed44218286db15edb09ff4ebe8172a1fb6920ade0e569d886bdc552b0b4c004f51642c3229114cada45a0677f1ef8f456621a09e58673f0a046a159c5f57d4f8511596b641a8648e2a41a365bacef332c28ef1717e18f0ee9859a4b59f830fb34ec0e78b7b110c03c4ef3251ad06046c6e2263d3e9ec81aa7a337913468e0ef4bd0e952e3feb81a316ab69b833452146cb948e5216523fc23c800911eeb961311e47362b0a8883e0721e8005f80cd8765d5dc7689dcaa9da51a7eb4df29594fd051330ee6588814069a13bb765cda86fb5d6a583eae64e374c438623ecc318bce3eb2bf4cb5bf8578febe36906e7ffa74797bf2088159b7daecb704057926af55d476deab683577a37472d87561c6c9195396aeaffe92021dbb8100fada41a3ab3a09d1cb18f2d3d125b609ecdbb7dc321043f3facc16aa865820c0e697894f1899f302746eff8248381231bf84591b07db0a2ab293ed995deb1caa9058079ce619bad76e11636b50d60eb8b406b46edfda74b99ffd20b5ea9efb28c2c4c1705be1e8ba80ab2675332733079406d0be0435080989b0b6e8749747a14283c1b5c11a041274e1518a37520884262fb6f1bc154e823854b71845fe877dd93e0f515eeb9747105dea91a680169834266df150a2cf8c74922c2fa3fc44234f9db12e7b7d28c11dc7fc71c6d8e3ab8496fda40803129004121c14d7b905fd6c47b1325ff83fe762c68c14e083f926e0256ff42b61a0f4b17b8faf295c5272f8e5164754836523a903a4613ba8e06f0e7bcac803e3ff2243758de8e00db3eaba1ee954a04620dcb8264b4021701ef0d6411607d6b2b98082aa1fa746f6b1cd7b9b31408c6afb7b58d68a99d8033d10021f5b9bedf5567835bf4cd4a13cd3840303f6f560177b6651bb6854a988c53658bca26b90d55c71265f1d573a0aa2751aff415a64742a066b7eed5adc273ccca2c1f25f067a55d31b3098185986a50988371957e0aa8fc36ec72191b90a2c39a6d5545f990bc805dddac70046d864a8145286d41be03206213d0de288561ce52da1cf538fb03e713406b2f5482967bb88f990b95e3f9c354d89b83590369538fecd6b2331933e7ee75c60e0a8a137a8aad340eef1ef54baba532a731ad01e9ae30030b8c7d95094c083d9aaaf675bd943899d5c1c17e2fb30426c826e4c3f73a2e227f899adfc1b85242539a2a45bb41ac2afe927e0cf6277fe854cd4d3802b041c57ccee35cb7bffe64d77cc7fc0a3f9277f7e5971a25556307db8948d6a2ad156c91c1099441df672584b7421100da65f1404fbf3e33e97805dadf5a184d8d13783d14502f067326f4e9ce1b1d65aea137761558d1b8400952c154037569ecb688fd1d69855c27a8637545c5897f18debae7faf68d18f5a18f2d7be7969e28991f5060b82fd97975f1c5a2d3edd3c578ec34451ab8dc76cb0b7dbb48d440dd159bb572be9704c52a104969c8a2fa210a5bd9a827fd794000684096d9b70886c68ebab80f4344b71f4f8f0f165168b7fd7a5688c0c385edcc1604930cc73ba22678cec50ccd3fabc02ff5073f6195f6dcd8296b579378dc98a54834447d70abafea701e498d5c3fd70219e6b66c087a22f5c0b46ef5d898f09679ff23523e2fed443d28481c00dfae966c221dc9369e6a43cb1869530baf6e5a18582bee0a9b492684777af1e3f7c13d7a4dd811b6e01d4296fbf943a89c6c70a1d3c0995c6a5df1e48074976c34b967b2de77cdffeba682b2d3713035cc656ab50673fcaa399646ebd7a7751002f1b5b4386f66782da084ad3383b119cbf3b8b044d8708a758c95f8e1963365ef04a7dcf04173c602a5b8f4a0833eeb27a1db222340ad53aa9b5faa32c32ad4555caebbaa706e5026f0a0178ef242204bca5299365f0bcc455d046e4fb0f3e1d2844adeab8eceace74bca846373633fc507bf73d286042ad25c34b3acd20724e2f5fc9497ef0d42e001a8d9c2690ab01fd46240ac582f15ede36118bec8dd04033c449be433b2a89daccb763065b127a8aaeb9e1837f503d4bd0a1c19e7fe15cfb1a34304df47447cb792e811dbeeed1c05dbda9ab7fe7b3333a02c22c1e2b08510a9389e6443bcf9bc9fbe0b4e2c96d67f8384c85a93f295d1c3c78de9138adfb3c6db05453058b1266256612ef2ab6472a33b15926df05921c58c9fb0190b4c257ca8ddf485de2f7f5b4fd810c9a142798b4c06f1e4fb09ae55d9fcd95b9836e04b308d14cc83c1421b18c4761a0efd0edc6610eb818933d1d53e19a763d84c7ea2e097086d0012f8f23fbad17c4af0bcf6e7c801cc115436d4277abcba41e94b24678061ffc9a11ea1232fb568ebc9ee7b6f90b73d29d737c334848bd74b89f03003dd93ed46d82d887187945877f51dca5c0f8e5d49596f32d3eb87437bcae866640310ce1e34a0188976f0d365eee5643ba8f994e6474793940451774918ae27f6a58b1aa65300f209624d523c23bff99cd17b8c872d5b75e3735ceb49ffbc053a19554b859fda754fee1c6d714027caee2da69ca278154a409d1c37e4ec9c8ebce2f1d912879732eb5ee08d9ba09788be21ed5ddeb3ff9139f611b5a06bba14eda6f35bf3b6c1bb5a493c2b11e199936b32c238826d94eb4e12d01d02f9af484ab9dc4caf99e47f1b3181de8a6f987b93f4c7c544015fa8eb77c9b69312e68962b01f138c9d79eebcbc44005bc73eb1c6cc508c8a1bca6a90a9811ac743fa68b40e2e59315dec8aad2e05390c74d6d6524e1ee6cb196f90ec0c78c226195556bd48ac862447c6e36b2b480122f50b49e4ee657c8d96a9cc4c35234515ef71e3fce3fc12ebe7938985188ed125b4469ced21d6a657f0236d3f98130c3d42fa90e164af87eea9dcdd799a4c218b5f133fe98ce50ca0d2470444c9ba9002c039de094f396da32afd6fb704f28aca41ebb358741307fe999f21ea3eac68ecc3ca3bd3081c3cafd79fa0dc0d347579095a97b89bd330d7d286369e5b4b0f71ea262aed23ea6d7b4c1e214707646a0e11ca4d8858c81fb2f9b6c2efc428ec388fc83ba62706888bd50351868814d10007c545564f441d169b9b474cfdc89787414adeac860306681ee9c22903c862d537d62f90c3e9c189249e44346c9c9a049b08945ec5627f86862bf38d0ee178243e676cd66b1b9571114a3a3495375c26f99bed3b69975c6db76456510e02894398137d75a97c11650e29a9dc0c0b5674e97f59c0f73415840f0d7ae385be2ed9b144e21d136dbddb67a70389359b3164e71d6a9dd2ab33700991c1d30a56c14d26862b3b1d83035aba6ce7dab669457d7f108010a07f5ea8439bdb9e006ef9147451c93e4c3e7a5972c5c72ee2f83b251dd34ac7c522cf93398618a30c893ed617224cb503f29b6e3d5c12145fba6b024fe01b31d5383ed747db19909327faf87b92163df961eeef569a692981425d8b81c181dd352204cb1b254ed518bdc5f23e0bc61780eedd836b0b2ccd0c029b375ff20f288962ba151fdf38ef21cd1859cb09ccf02f1bff90e728ed7d348dac7c46ec23a2368cd71bc273685d22d87aa5af169b46785bbdbe676e1bb8bf45f9f0b32a6fe8c102d4659f8c4d9db052655c56bcd198e130a0524855480df0be1c0b3137346abd675a792374692f3eed50f45e56e055fe2d3ff32678f2fb6d787b425d9d2186801ca1dceae63b9042ebc5f4229f480c23c3f5276e439d0fa9e7a02c84c6a7eabdb562f7623c455f50e04cd24fd08939f6776855ac3fa6992a9e1320334e47f5caa4165f05f116eaed6d5e1532a5244deac9f2044ce7c046640e5cc4058e72363b7b347a52af10d17ce56243778799d6753e2ab9ecb64a85eaaae59e6811c73a84ad35efd4b0c38183eb01d38ae26a622a468afcf835d5e623163615d772a7613abc931618c0bfa996d0a55bf960066f8e759b43fbe0d2d5a1b2c6a0c02bb358d21be4837b3965882a48d5232f6b0e5cf63dd4056441c1d2eb132fe5dea74b6fcf5da2ce889545cbb2b619efb97dd2b91611add7cdc3336c63b9da4b7f6ff034a704464ddd6ee0d2c4aadc18041304124293b121950fa810a0195e582f004245dd725787d620b73be4999412bbb502e7203666795661805e34a4147279e2a1f1f75a4f12ff45497576f4fa863cfe7fa6137c4 +0xb4e49d08be92b07880b5f9496ef0974a09f44d57ae3dd5ba0dde1b498f09eb219bbf3019dfb28e5a4d79d12c299462cefa246cf4a13fbdc81f719972065d3ac1 +45376 +0x3778e7b9d4fd81acf9d9515009f176dfab5c7a4273741fc8c02d5b1ee0a6a17c7bfe621c2e69d4f07683f294d0e4c4821ef4e0854d003170358ef70fc0ee0f5e4f1275f959a007d455448b2cdb4bf4bd066ee1361ceb67ea71db10c888bf238d7c5c26389ec9a2be60c62600724f8efa2a71853d295d499f3cbbaf3180406671ca837fc1450c2d185daecaf8dc181ba053a6d582bc7d60f75dd6da32f09a5f720030887c9692314915a780fc63cd231749b4d8ed1d73335b9ed59cb31ff497f9e80a4852d98336b950574ff44d962cc6d445976793684a31c560fa9c5677946c48bac7295507c2d0d6663fc8e39cc017bcfe18d667842ee29b1efed5dd4be035e9e70deb53445ff66e7d58606d076671c8896524e2ee66d7e8b8af46fc9703ba933a237e1b659493e244a3a433ffa73cc28e863749cf7a7774d515d8fb8383650d5a10ccf590e90ff862277d7cab09e170b481f9e74ef329061e39712139ea9d21f1dcbb29eee7d27980ecd1923316c69aa4605003945857683b22fab7debfc995a49035fea615442c45fb8abbc056540a062b26e4c8316860d3d85c059d8b53321d3221bde0fccedb5a5b8e407a50f38781e862d31307c4b78e647d539cd5a2c004cd66afc622d64c6614c769888c0cd8bda1ec189d60d33516cd47e903251e070066ee197d11c648122f1b7d129205c6635dacfb8dc7fca1101ba10efb032fceba07a0463051049706b374c642eb48191b258ac40bc1aac42757720cacf83ddfdab7647d0568fa01e9a8b98a3e1e3b998c006eba41d842670188a4293d8bb000077f220524e00e4e6317d2122eb3480d5ff6402655932d5046b61eaed645f0fae965c227b641aa451e07a6a63b32d63f3b0fe8506f7ad3489fe9c8e3a1ad659529742d2be31135b0bf801f8d8d244cf5c9544e80b8169c16b42a8a0fc34b78986fb14959d2da1755f18a24114b1114f8b1cc5afe57eef1842c804c7b67a78fcd6226fff8ac23b7fc5a2e9e789d7f95109a7ff511758b3858aff4f670b34a14faabda385298757f6fa273730bacf837042c7605033a73db5be78d7034cfbb6de8f2d5daadbf57d67572628c12a003629e10b8731acd3040557953a20fe482045fde20ce52495124d57201d1d5a1297ea4ee4d289f574ad10e104e754b1a283f2717c2fd895debd258495a2a9bd5f0f3df6d3e0bd9ff47f44d5287cf2f9834880746c34e9a23ae46c69f7580ae67e32a1736920312eeb113dce7059a02872e46c8132ca8ccc421e9e71e58b9547d878914f151fa904b0f958178d0bc0d0e9ee0322504f56868cd23826c0dbfd64066799d4584d79d3feae205adf11f98560dc00d25531cb636385d61319c787cd707637cda32827ff2c9622f2d6fa9ea87034d21ba2105fe57ecfd4a160bce8d6af2ad775963e27e8b347dc9a152444dc806ef368d779888f3716d06c264a85323b0c1576a1fe1e433b39b99b0a3d70741a00e13455cbd9b314d135ddfafed1428c805e3b46f66f711cf2469036949611b5812818bd95c81390a591612f28719a1c2e3e5e05a5a014e0f80ff41ac84a37eb6644807f55d80342fa6fb05375daab727c22395e9a34811fc172313746f1591436a3060b8a8e14a4561d26085570e917d09677c232a15831c519f21caf2ff7d868d013f2a25eca2d3f464cae55d8f594f22773d10d7afcbfa973a12b5f5a8690835824b54bde86561c679ec5d57733422741b7fb89360131b4fbb8f3e60597e4fcb7c2d3d561fba783fd96ef82d034c80671dea24446e8009e3eb3f6c1b5ae4e5b5b78cedd9d7ca9fc74bf7bbc887c9f06344275bd3223c4bb992cb470ff3c2525dfb116d2f59bc5ec6982fb00e47d3fbd057de6529c46f693b78dad7226c401c291064c43eedb93da488c0dee88a9027161fb64b2c9c40ebcf6415253d0c88cd83bd2cfaf0dae9c5c9e34f4d3e9a2bff9d645814c6f1d85adf1f2338491cbfecd2cb11182c6a737d9e718706f9bdca08ceed6cc8de0d5f3ed272ae182ce410027e03bd25d9e380ed89fa0d10ff3c96cc0f8499705c36fc1d10225bced0aca196ef2ad529e18e379ef3458c733a5fb6d2c9ef871227b5d78101fad4611bbc9a308c0b042d2bb3c117451baa38916d52a265f7dfb929d219f10dc1c1d9f75b2459bf6df0379f9a45e0e5440f66ebb094c54964496a49d4eaf69c3ec93f4bd36797f0174152258aec823d886405326ea2c2dffe6c2f6f057117163a959aff6a8a7585d2a083a5cdde84b3af511e4df0a4218e8df10f83abd7dce37dcdf2fa69b578e766b5d407a9426eb1807db7247ec36bbdd87f136e0f43cd6bcf184f2618122a7e9b274c336740c99ec491db9f5f2627d6a8bf411679de7316f81eba6abec612b2399ef3124e021ce243348fa6ddf7dd40c559a36430d0554dbf883aaea4fcb8ec07c4d28aa8adefe5c50fdd213e5b1563f7f441407e40fb76eefed8da13daa592ce3ef084bb6ccb0e12caccf8cb7c58a706382193a956eefb4b279bd75188600e56b756e9d16536c7f10c6413cc822d74b9cf4d43fa3cb5429fac8b8ba62f71c667d50a9f30c0ba782c7dae5a89951d32d95ecd3ab917d8b5b134b0df5cf76124c940169020a6df8789c6b1b649dbaf492e90a75e2e12e0ba4b6813bbba07b78e43a181a2eb3f2c5dd18f760d567f6b21800ae599a15254bb33f0bb080788fb6e9fa054bfd8b22962cb7f0349f6a7d92297778fd25902bc1f3273b0ac8ca1b62ba3e496ce2e285efe413f6250727c82b53b7dabf19f48a14e109afb91917b6f2d18164fb736c8549af9779b0c1225ed4033c443ddbb4c89b0950ca39d5d3daedcc5dd886238bb929cbdceb4631dcaa22d48f55e80f537ffad8971b0ba3a10fba074e248b77b28a06e53ecb73fdd952ae242b805c1943188adb3732bcf6e1cdfe1ebcd979e49380776837aab8798ac0cc9e9b43f88e261ae18dcb81bc44288e107f3457dffe8124e1e172099239737d048049214bd25f0f856cce88881fe7d8a7a54f203c2a1e0fdcdd58588fa225fffc95df98c49a606eecf4bac7aedea2260a2d67d30cfbcc79dea875280f6804b20b3ba92b012adc919eb21acfaf24ea0ede8418e0d0e81f1b5dff32e8afefb25bb6ee405870182640013158f0f77711eb9b25ccca0673886cd13e2c2acfbd9125862a3f919fe6cfd2cadf1fdc2659cc54a69f0e0f3c328ad6dee1bb6f0d3633c80f7be176ff2b4bd23237ba01aa217bd2a76c5710e089a8f1ed868b15e6fe1cbba95ff0690c3a3cb6fdb7c1d1f172a2de13fa328f720d65467398f5bfdb79be78fa42c6e845b7f50973fbb1fd9ac1d3df52e52adb8f12423d179595dd593d8b6868c0ef954a0907324b5024c514a3717f0aa99a75965cc24e3008e5feeece26327b56d4d077c205d9da7174c8ed7c1e05a1a42bfe06315812537f60851a8ff14fa871112a5d675358a7cc3c8983c03c3b9e8139c57d2495f1f84580105b178f2886bc1f13795d824749cce68786245e6977bd5e7c59caee95a507ef112ed952458c74791c4a39152e26f00d33530cf717b3b4f4733a88c445d042e8181469dd2f204699c54e7e8e65c5d21b2d78de88dee904b65a8de2d9bb006315959a3da26df8bf0b7f04925086acef8ac6763da6277e28fe82c26d814dcc04f20a2eb9246a6c3a38c9eb18fe2952a4e6aeb99eb179e99e579c768d4d768984f7f64080e5acf134cc368076f9964d9eb936e1764d4eb1d13c0828c6a0ddcf8fb1da8e1968be3e5b10456330d58604397d0f5c58dc3e7d7e164647ae2dec14719a3755e710069a09cf66f1eb1450fd01ac98a8bad09192d190e761b84719ded72b8d467e9e3e9abd341bbaea388fbe93b2534510dd109888165bf5597effb52ce05cce44459eb701e8e42cc2a4aacf4c38dfcfff6414051e3124711657f60def53165bdcb8cf85647850d6190b3a95b7ba8e87dae8145ee05bc1638344a56f9aee5a7dbc6a497c514cd23531bea7a84281f03b37dbaa0c9af0c35b04d78640bc2c99b247dc851254f0f8c8c1418a7d995995289ad14da48aba9ab63f830137cfa8448813721addfbef251f2c364b8c089bfdfe885b67ad5c03d80377d9ae9b41cbfb7da3ed733592a1f796f6ff736a3cb39b1b64cc908d7b56dbc1623df701bf021ee18d8116bfc5a3d0cea61f8a9e924aed0dd4b740db653e368e7332730194053f7214ef7de3018f5134ae29097fa5cc64543cae010d962478c92f599b017d2fcdadfe8b3135e2aef947938e78a3e3b2a17d2103499aaaa402efeb15e787b6fc59d39ed6a92ec59d29a5eab24091d89824e7067993090f2775815af9d10afdf564a16a747e4446d462ae185709dff0d75f30715375ef3049411be367f0119ea56e8605c6f90cc2ef54eea0cf2cc4c90ac0c7e6335aa3ba63e62e1902cd123586e80fe550d1eee64840d618ad3216cdacfa4bd99bc9dd1a11d516703cb0b34f04519d8da471711d69e702e453a21c7b385c0acfff3bd1bbcdae936d88534b37b84bbd63245029c4de97d3a865056c5e3766a33dd039582c11d2f375781d60ac2d26ee0a73067f9910d3e6b943c47cf314ba93a7a13aa6f768d2d52c7e878a08ad83bde7f30ce8f6ab3bbaab9277c4b66ac86a91f4c8648a5d3ea7072e1a3dd9e3d29b8036cc0c6a083fbe03b397ea34a40076814d6b07614976e779e95de29c5aa41567b0dc406fa2406f36399d43da5b0375fa1d8b0628c80c251942bb1ecc6c78aa02f3a63b7413fe4cd797006833fa31b770e7a0f73d436ede49ccca48e6a3b0c7f661c24413d7b9e54c5e59ddbe0c2bd96a2e65410b662f71afda0407779afcfd96adb8f0db6813a728e2120af4fb524a5a64107a3f8ace9d901ce0c10bbcadc98819e2c8174f8c30e1e4c17665523588d62b6b09363bbca0bee7f91bff7353aa2f48d84063e893e0fbb8d0a68bab562341e6ad848bf38a2970dda55edf797f1e10bd21e05dedcb55fae0c821d461249842288062ad4ca7965a608e20381990a3b0d9282e41a982fe53ff207edc0e21564b536c3a1691a585d0130c0675ee38c9a44f8390dbb65b589b5671f40f2cfcebb219c961548cf4667657b7583561c7fe5f629cae689ed4e335a92547ea27f7d73ace407ee37924c6b1c118bbe30eceb046c50bdd94bd502cb749c2d0f999a2a739f339e94ff0b71516c198a7fb6fdd9deee939b4ccbc8d9394cac325b9fc9dba342b4e46f68e1bd019ebbf830aef4505dc31aeba9cf6cdc652aebeccb7cb49aebdc8c60e739bd3863f9215f38e17c5968350e3557206912385581e2c5f7026e33b7e69b653c46eb60c77046ff173bfbe78a9702be8668849817959cb2d95b606319e81b4f3725ddde4ed336ed17d93ec30bdcd846c811386eb64fa3fbea6976634bba6a0ff30116c6d870b66aabff2ae200064257b00b38a37bd87e06f2d1ba1b9585100b38839f01ab6f4ede9955c82db13cc55904ff8c1dae58b53db93e34743e7193adcd537f760ff986b1aa821f8c65a7ebb48d943ac697f6d1070656eb5490a57d5c7c18be0c4e36e74ba62f37e8666f3bd013734c857edb59cba3c1e7a5d14a557f0b7a65adaf4df81455031927fabb3d165e43c941aa2fd5f35628304d4a87a48043237b40796641757fa7cc336ab37aec35adbae46419cee6e833cf364385f1c6ecb808acf5ab4bd4ebc258f2fe8179bb61592655f4c1cb0c2189cb46036bc4b9cee415db6b429d9a62fdc64efd4ac2ecabee157ca25054cdc8d32c67d462a5c1b04da8b42253c030ac001d2eb139dee5d8159041b6eef191a7b8fa80fc921d465c9bcc1f64073afc9172657960735410b3759d8c77c22bc084e13e78c422b3b09877860477859568d9fba7195323acd403b747452ef589c228f50039743bf0672d89e04ba4f658db4b44eaf5d26f6f988f82935423ae94ff5b9d46aa54045bd3e378e1dd33820cbdb0f536f5247f24c6207f8ba19e16d2e0e4811ab3aca67c5d81ec91a06c503875d0b69301937c53c57e553615e755cdcb8d48833cc348db6bd18ff97d9789646d732d0a01658e85fd71ad9c9645920d291c9b8a2de21301679906205cfb54190c6105a2dde3dc40d6c12fc60d02f618635a21356e512f75b7a2fc0f26e1daddba61e4647d558f0fb83582bb6364a878df0f838ee858c3bfc5b417ccc191433bdf3d7356ca03ce770b974f837eb4d0b50703689d813ff768f797ff611753b6b8e3bb5982aa34c20237ad3d274839985542fd7969224df4f7b7125dd50f6f5bde2fa43ef006329337a440f5aea83d26e2f7c75efab4cbe2f46ceed931902c5b3429bfcca7c743689eba171e208506a2e49027be581d01e9e77df31a7c84d4de423ad6a9afd3b069c0e2fc6186c9dd35e174e6418c47372f5954e9c9bed2ad0b91caaf7d1014c1c02482b566e75b0a07630bcc909d18b5dfd258988d0062000ba84214f1d271bd9253040bd44b23d53ff1bda053937ac21fd8f1c80f491c14060f08cbacfed1ee0ad3cec654ba09860514f22c317654a817f58740f7a1e833234f869c579c1e9a4d2e4aae8d3df56483521236d34f8dadf1b082c9ec10aea38aef23519ab23f0a86ebde8a28dbcfb8de368587e1250f1ad2914b2b969f56ad647746b01c4a1c86db93f424cc9d7fca4145b3e70201c137e421482e9e55c899d9705983866b9d5574adf3422289ede2d209051ddeea8b4b4fe7e299ac3becaf1061c3907f1eaac17ac143add1aa0248b909e1f31ee855a03b6c81366757aa3732d2eca0b06a2b1015584c2d8205a4431fcdb02f6a03077ccf368ecb78b3eb78664b3c7ac157088b6cf9758adda4bc1d2cdedb9a69448a2833cf6f21865795bbd5551be859ed297aa82c288b898e331c07c3c8fcc4b2c4ec90bf8e003a499248a677f1b020357625f079cdf92fcbef89d904e11d23569e0f0e8c52303c93c867023a269bc036d8d36d69ca9c7664daacc92a8dc42c3600dbd4c02278333d216011252271def835ce4783883c0760dbcc00bc33bb8a5cd3960be268a1c84d847afac04dfa2584775ca54f6fa189c7d932a5423dc8e3d0fd89da7b8b74a2cdd8fee69310fd3ae184c6af56e892a5a1be27e14412b4e09868fc6a12f3b66ac40734fc27d144c81746548f1f59d903f771f1dc4b1a4628befa36e22f0832c73bf8646503f995752fa34d6a332b3c4ad0dad8bddebd48644a9d816b5b31af623993d648aff1b9e93085fb6b18c7842335e126ad8663803b4238232d1cd9f4e2c6c0d2ceb42078cd22d3a4b7589379352d6e21d3ca74b856b0b3654ffd65caf0ea679f1f99ed99c90e7591797bf9e229c06913583258b65c9bf68ffa833ef934ae708662e6c2e684fb520ad7076088a6f6ba4263467743f60ce8e95538cc495519c3cfc0240625a7f15456f986303455d849f71d8f3a26cc0a73bb89a37782fc3449c260da201fd9f862bf087fd0acdd6dfe79ad940729859d7e4cbd4ca86bd006e8a66b907a9cc319648b2c7baab8e8bec2123cdd4712c9cdf2e51abcc5cd7a9789c508ce7b640d5b43038c0125221bd17b08f2f363aa42a3b5cec87a3870a1ef1565601d8b3e5ec7e56f5199a9b120b013a4f65dc1b99626b04fee0e671cee1772cf9a0412f35e633317a2cb9e2c9f63702e71a3cb076d5fcbb0b401bc9908168a4bdf0c784cb6391542a8206d5c3ff07cee8a4ee85b7054ef3843da9dae99f4432057bb260e0e51743a8b1f7c09a9611d2b6ae57f7e460f0230c321742546b98798299c82040db13645725134fa85be3d2f38f0fa399898ede05c5fa8c4b96e3df97e34f5f55c6345ac853cfdf97a0dc3401df8c0520ef59990341aa1549a1b4d8c7d0de8a8a36f87b7ee6a40cc305897a7418439914f30ed8876ddc79c90c69e994faec1e689dbe6add263633c50a6a1accb1ccdc00451d00f482d826644791a681b9fea77b6b149d85cadd0118200c996e448e4a5d45e2c6fd2943a785e3ba8400a69c9 +0x19cf6c6dc28eb06cd9fc0a58c87c8af1aa605ae7fda192ec6ea3c12ec3b6dd529d22c45ee32a00597ef615af5a8e790d3902818d1bc3d33341e648b349c5377e +46168 +0x2214992c8008d66a2735292420127ca9527995bb4857f6e234a8010734a3603dd531a4e2d6a42ce72ea6496c4f6f9f90ad3ccf877afc53edb44ca95962a5b3361bd45ecec7ab82a8aaf709149eb254049f79da1d8d40120e2e44942173417b0ffce50d19dd859e54a310b145924161ad3118ffa6098afdefa9780a85edde7f73804dfaeaa09b489421d98926b5858e356a01864a7444da382dd055ad5ae38808b0f26d6a97534a102d3ad8e08ee6a541531cb73058d57291c334bcc241ba5e7693bdadc14a166b6fce1be89aa5cd6c7cf252d9813ca58da0718c86ec2bcac96631960416414d725a0d64ff7d83a0ad8b51893664a91cf31041c0fc529f7b91809366b891055e2878f0fd66b1afc82e1978aa140226a26b873bb8661d25357d6bc013125c1db3557282ce655db1aeb8cc6d9ebc833b9fbead665c0c74456056d0c0875a9c11b2c1efc8bf43a912b9124c3a4b760e707bb42cca9535808864e4569ca8d87c6ac53398ccb94abe59500642e79b8acb4e9e15a96f492a6975aaefa65b60d422af53741595a2c0c40edd5a567a753fe35c70a9cf5e61345695983f67059695b668c44d0d2b64eee2bac7d72ffdc0de7e225a38439ec6996f6e979b42a33264611d7f832897e51c41e47645767766afc329c289b0375ea1de8a10cddf3c1b894a57eee10fe00f920914526cd2f14efadbf81165bc321396c871699be5d83b4c9b9d782e6a0ec89761d2c313ec726007ee18b0940f96ccbe58a90ccefd7f79f479788531e02afa7471a731046b02841d230f05de526b7163b3bc5f2ece3abdcb0e6f7db31a3a8c72621a0405f8a9a286a2677a0b2db9e9cb0432cc820110ef17820ac97cc04966d75cb4a4df3b70a28894a776e247891e3e7191b9943d0af821fdd1cf54795c70eb86fb795adb5e6c6c2158612c49e2f7062263902a2b2fbe31a64df803ed7d92f80979ec3d817ce97a7001a2b1dacd5c6a402fb80d72872a8fa505ac50c5b3b4440db66352d4d1fff9aa2aa339a35135b1f37e9905bb1a248223815405a907be18b939475f7d659733f65ccb8c4c766a2462d79bd9aef19553484a56e8407f98bc358a012d23409a6e7d1d82717c44e40bb6c22653f213634b3be71cc233262a78aa31f7846f6beef366f830b2dbc489ae16c7a239308878b025e00c5a29015d9440b6932b09ed7d0ada723d1512fd4254ab6f77540f59baca2dbe907acb1a17571ea23cec98ce2dfa01151263c9f7f8469d410d6c388d13e37c080fe8c178410b6d7d598dc416e80d02681563a7bb91cd13c6cd49522c6a413946f16db223c4f654cd54d737ce958906f3afdf5550f72f35841db2063fa62d8d019dd147248660fc1c949296fe1cb7343f489d7bbe10b42c056670fcccb1efa0bf7ddc278271938cf181868cac65dfb5d34967c00ec6a620d1114cdbde72cf990bf856fa456cd62dd5837abfe25749b0371803cc47ff4b386e840b4c7ad115a06a76066a765e70074f0238d7a7dc3c4ef41f394871a5ed9d662978f6aab608df665fb51d1b31aa41e766867d04db02b791c5d3dc959fd27741675a827509f17b861c2bbb3fcccc0425172d59ff3de1129671972fbad542ed85a57897e4b2189f521330ede7171e77927ef512a3e822878c8d4feae82f8727bc4d9bdefd9ac57153ad8c5b1dfae7c3b501a550f5c50c40fa80c1b42795e84e6dc68bfecaa74019105206ace85d710f160907bdffbce96268b2b63680efac8a217810a053c2d0c0126b6888512802843effe1ffc8b6ff185e8bf518fa251c025fcbf26c9fd4bf8edf5e78995e43e34ab449fcbe58999888657348019e1f80dfaf27f809b6c353aa0195ff8419965c88005120a3b84ffada04d2759973c6204899f4ec20a079d53d0076c4f48a0ab466ab7d1455efbe6d37c410458981004366a69a945865dc8c6e626b918fb885350d3c37a27d05d03bc72c958079d0b632615d81b85a0ed6c266b1db2cfdabf025a53be690c3036baab1c4c9ee1069d13660471122cea34ebd4c742e5ee76b34cd5531f1a7cef079041e141556f75337958beab3995a2a2bc74934cbeff501377546a5c2af47d4e18f35a5df82d696d2970bd0cde4a9ad572685781ca7ce74e365a01fc070d5b78b941ffe9038543b88860881c9cc6133b92227c8884e1bcc1fe48a2753b221a25f5a03a79141194843a8a9840d192bc5390558ac77ab8311d23b2c46e33cd39c452b0a294965cec8ea4717600393ae6abf153fad5187af4ce6b3af03d8d792ae254d5b0b1f6b1bc065a97aa01101932a339c05527faa468542923be79b4b06dfe70920d57d1da73a9c16f9c9a12d810d7de0d12467dcf1c2ce20f7799260d83773a77e10ca411b3d77d8bc651add211c862accaa72e5580d72a70c4126ddb0beb16f9f436da01ed2de36ecfbe4da1b5e34c11d6c088c226d166da2c7bf8c357d8aa9abf6d0025900b977b11467ec16dc70efeef2929af8eba2bbdf94c633107be49cc9b15a2f73cff0e432370adaba9c23fa64c576d8818dfed9ee2fa19be9c0a99122fd73ee15476bc598ec386eb0a8332ba96c1e0b665d130ff520ba8c6655bfd0de618308e77112620abc566ea0088acae56ff0fe4e63c7a51df078ce324110a12466f2469054ce02b12dcda331c20e1f3f575678e2a603e28d264228f38c824c1c92296eb9f885eeb5c905d50ce0a971e0aab740ca2eb0106e4a8263523fff18f0708e480966206f3d1866ccd969420af0f37b1fad03b475e7e49f47f6616e4fc5858a9e29a588cb71a1594f3f66c03096b709dd332ef959217d019c88fab637c65b8636c0bda34a7aec4428e6de0d2cfa80cb4205b66506439c102aaf13c1181879e8d977b75b368081901d77d9104645d52815cba3e2c376ca34b914b2763ce667194ff69a97d5aae9a6f79a60b1c59f3f88202cfd57d7e28ed5105ee2bdea56ae8260e46e3f7121abec7df679d8f32f455329d1cdab8bae705bf836a87e6990d58ad4ea3c3a500d4fcc79342f6d161e6ff2f9621bc82703f82e39440ea102bd649872af0b72ba955dadb1fb8758779345cb5886ed95f308afb69b2f1b0ffd05e31603dce3cef9e15ef7eff48b815eb750470ee54dfa36e61c5be6a0d7aea28fdb6b4f18cc36541ada11f9c742d112b217cee22842df3ac4c886e13e4b673884d4ff1e0ccf9212685765971bb42eddab22c99df7d42c45cb399d55b27e23090b543a385ff3ca7cf25f5a9398ea8105cafa9e07f90cc9a022f90a0aa378c85b4de58465ba41c7dae17958b4e7ebb3d33926b7e8d7f19f93f39033c8ba423f77720e456cc5bf6f745c2ec7c1b0bfaa8f1d2e7a08398c9465638482579fe371a5a158e5162777ab918c0410839a6f5081a19b512fc5e391609c5f5d7ef963452d0249cc2b8971647a998599c24e028cf1eaf4a32426017fcac6a82e0670cba256be6b627392b48078aa39cb457480452623c1d8b002eb44ec08e85cb8ad227269fd4610b5eb48e9d1e7a70ed6b3f26569728b589b02abca0e8ba64f5a58709caee6603cbb3b3585cd7957cb3bb35fd302ffd88aadcd47f778776a6fb419be086da243504b2b833eb688d1683d1dcf7739f333d8ad0ccab571f3bd249096139eee5877b22e633bfad23b9e4fa4994a39557621a9656639eb422725d6b47a7746783182cc2c8a65a36bbb45e638ced901a0af2c669b849e81343c2cede96bf2e85555ee040c480720c7304e97c16583b760c7db75180d005e8d5a5ad1f7118d6ccbeb43c498472b592ec142c906055143dee6b63fa4aa686c95a836eaa6164fba231c0773962cd836ea96a7e3d057498d6232462c0603dd92964f48a1be1f41baa50fc478cfa2179f42d8084fe703767e34d612a508bf67b8d677185c06d7695598ed013d0b4fef7c7dafea7413b0ddfc9bf8a31070860ec69e462f8447e3d17146dd472911db68b5e442d7ba1c0688f0e1c17fd60702dba536e7148249ee81f7f5081da4abef8a32bfba5689c9af7e434c58306095d9d53be6804fbcd49e7fd0ee950b169f335edc563ef049e350c7db25e53e15e2b30571f63a699cb09bd5e279ad99e7b64eeb99f0f72b6232946ca2b3922f5cb5397130ad3ce989a48e8b17dd785080b8e93952d60d923d7e20747f40858d9fd812235e55af57eb7a1fa756641db7476dab51f051a7aa408f9fe75912e6df4511e723e434ba3c29f8f5338654c557a59d3d3a59a7edfdd42db7cd1a72deaeb6296077ab92861eade7b93691f697b6030f46fc77200812621f102fa9a8958159e824299ab93a88de0e12b95e92bc5ec78c6fa030062071502e5314eefc32e09815dc4198f0ffff2437a9c3d5705bd75bdc602d6e9f5ca307222885d1b6dd53da7a2fc58f7efd0de728255cded79da725c7c0ab1835e52ff0c336893a1dc06388ddc6bf66ac5b398faa308c6111aa588f153723160ee39d72d82628117a00970807483605c2420b84856f5c4664a972ff8d6f9c50727d76f42b9f6a3e15c878c3c05e335408d90c2f818cd37519c27bdff80d1eadabdb40e0824a58a9363e8d21cfb0bd3ac549c3f6662ffad7771ffd961ebcb1180026869da6cff93b258a5e8bfee5dca243b9b942fbffd752c8e57f8cc7225e76b886cd935fd556da29d5736713a69871c852747c09a575cf523f8a29bbe72cb01c229f2a7404756f8c47551ed79afa909d3b7e0a58c8d9375f53a5d5c1b424ae742383caaf0660e394078b19126a09e70a9d5f56b0110d70354958f8a3314c5808b002dbd6801f1c8a3e9dbf8cbdce5e56a09dc6d92818641c4a2bfa2705ae961ff2a3c5b21db804b61314770c3c4fdecb6bc2c49ab402f95e7ea74316d852510211eef00b8235825faf76ab5c8f964daf2756b7bd5ed319420c533b37543e6ffa346bc5a95a9d7dce394ec2425dab954bfbdf0708cd94ab0f1cb74b541f7cda4d83a3aa534bf9df4cda2124874e949ce710e71b44a94d970ed85cd933e1147843271d08d3fd508f1fba7938f30b5b4ccb8ef55d399c04c58766c94f9d430c3326486148ef1aaa758f00dd684d3c088b3e9c9234ae4cc31dc1ee86135aec6ef23c0df8d070471079e6d5d61c5f89a143896244086c61918606991c8f3286429dcf9f690a1d2e88836a60ebbaef98305bf50996423c8477eb9c8e1229edb68e1b25263c5cc0771d7b65caa4abc614bcbbc8b90d48e45d7b31ccf6f04b52265c5686c9fa301fcad4491d3a8957aca34e4b4a9933832c93a841def93f5c2b7eb3353cb02aed04cdb7d5dbd9232668ededf3c5d28f5bdecf03031abe86c43e659ca08e0454fb352bcd07e6cef981c49ba19b7f8ba939c0b8965fc86e4dea54841d7fc3ed00c27a8a1ec8884293ce8655722bc1ed0a839cf7683e2f301d38348341ba2492b7aa9d93b3fe075d7a7677c2698bd32039a338338186982d7c15a8090d3af91c001b64ed9393ac4635e25f8b8da3fd4bbeff5c15ea214b8df5e976be8be58ab2647d9940c66dbf264c790658e75b87972201d244aaf590770d1d674cc2a41e7d6a3802365576882448a233d07d9cb82bec0f6169c9ecaf134e174358ba60fea59ab4687547944e69b0c7b09b594cda30a493d02c50edef8a3f40d28d7cff73517c5992a5a4b15b1d0c4f4362835533cdd3f4e83446df9a046800db900f6bc3a999904a6f75b4f566e5a2b5cd019d0c2b009a712ab3acf6a852c0280c7b8a36d678bf567bc185656fc128cd83dd0eac71b3ed33b59f3b4c9f84e67fa7c9461600a1507f70900cf35e2b49552d1f8f5dc87455f57e1374e31186dca9090085a94e9da98df6ea31e65ca86d1372cd076558cc3a812d163f0525e1086edb283139e9f33448b7d8dc8890c2fcd1fbf1600d4842049d69b184f8031cd495c54a310cf92b57785861f51f23005e556f92819dc15f1b12daeb2b05d4bfa7e86e6c6d6aa5ce7ce4848e64f43ceafb6777b9525deaa9e7a729cc1c74c053e82d7f99cd9d15630a55e166114f04093bd1bb6dbb94ecaad126fe5c408dee5f012d9fd639ec7272699317f1e477a3e4875ae2b6a48ceeea3f5500a47d98876b59b0772d999ee4830066cf37c6b6400445c9959cf58b19f09afed8abbcdcb2ff587eafa5d5fc921f3996b1419d5203efdfe77b2896da94444be72e79e6a298a4665eee46d54ea5cd7bea64165394152fbb7c3d616fc1886eb8d9a917e13260e1eb19dc1982dc44162f2b91becec49e4c4350825069871df64b9bf18c97d4333f4f772225c2ed9881bb21df42f82ac5ccdd2af3fb6a767a656bf7afe0eed03945fa4068737ecac9968894f7a9b70eb339f3d3376c5bd4c8437fb38b1cd06d997b553c55099fbcfeddfe4c80fbf5b7901aec14f7ab25ea2e16f1982c4724f47c69c63392f10b095fdf85102340996e83f830b3dbbeae00d568286e3b69d2ad0998b6ecc733acf9152386aa88818b7bb45a27788aafe05ee5c08cfd5f8bc1e0698f8e309bd568d6483167e056c6b3264cc8392dad86a24b85a7850c41b3dbd5c3d6b4c7b6e129e61f92927b3515f9b773cace98eb49db11dda47b6588ec07d440f69279c15ed673c3cd6d43cf78457550e94e83ed0275f6163fd6cedd3b2d2408768e0e645557c35c6a62ffc9f67fa90cac21b45bb857435800fe10e8aa360e42de124d46cd941e11f2d879ce978f9bce9caff3dc74693fca705cf3504008da17b785ff10ce74ce0aec377784645d93bf3f600a183d93349516563ebe058cd0ae874fec6961e21a70e0e6c29364d1d907209dbfb81bbd68e07a55bbd902aa3730d9d8dcfa8cc3496b564f22a4a0d4b4cdc4ccdc6416cf24d425c2304a3e4b59c43287976b5900a422d7d95e5f1e4c6e39b55727c337b1b0999e0366b8c1557c931cc6e463d08173beeaec406be8234d757aa4697e854c54566d8225cc94b2e9c41efd8d8af82efe6618f08e71063f9aa69b1d693c088658341ba5342ebe48e880c1925889d9ef8c43e84d11187e8a9cf7a028f1a6c948035a2fd65d854701c0ef8bee0e087bad667de26c91095aea9d8e122fc764cf7b9ff0317c667938c3bb38067977aee74ed53b8eb3d6eba249e3937999b41d23057220aafe18b498781f84ba9b5a2424bc1fa5758ba7675c8eb72f5bce8079cbd0c51021c63bdb6f0735fa2ebd80123add8ce41e5dcd2592a161894236f322d1c2dfe81e3b9799c65845c3ea45b21e329b6620118f11cc4b6a29cbb539d5bd3cc50ad129c5f393a4539706769db6f313ddf380d78b390490d0571a3d3fedf515c08cf3cbcc197411e072ec5b2b5437e58a7d2df7b70d7768be32a161b0046f639aae758bb8cfe215e7209d20595693b08c4a4ff97d57cbdb190385a9f4e2d62e3db87ff2f2de85b950e7404d8e82ae7dcaa20d6644dda8f1ca12f19d734fd07f90f23b87e00e07040310fd6a31a231532ccf8fc57368b7b3b9a70bc69513055d7ba3cfd2eb260dffe8e2fd00ac7cc33b9a18fe9e74c09f28ce0afbabc3f51fd0e615635b7bf042b0e8a7689666d90d3cfcc4827aaead0958f282ead463bfc3e0b98e20abf9324b21e9a566b5c780b65e3a1c42df89f79d4c0b5900cadf379b96dc572d49cbb5d35ad4261de4373b67a93d6867586d65020b02d564149d264ff938b8b3bd5b4180619270b8ab1ed0c826ebf0186ac2c1e19dc03f3f3a07538711b3f8da90109efa400acb5d92e40880dc2dfb7e9ff0d1e10b2cdfb8c58388eae73661c9495193eaff23813522f1ab38d4ecd2c07e5f5eab5c2dfcf83c7b8b2082aa39a97088e9f8a4c7d967e2ae8197140ebe088f782fe698addf26275625d2ebf5c9a18d1c68cb39dd1a1b5b815146a67c057b5ba10e3bc893d16b0f7c1ea8280159da2975d80cc54c8d7b13d3e5ec911fef436943c152f3c718ef7a553e4943b4317ccbfb016251fe7aac940d0332dedec68841c711d22130fcd9f3494d5e43f898aefc16ab76e4da29d9669574c094a0d0716c93c6645ab8c751ffc0128e31b4d898432e9df086c8e1280fd5003dbb4f57277111a8afa746bf812822568214d0376328aba0773fb0ebc119336e525cd2a1d2d8a87e5c0fc32e8ff5d7e1e1f433fe3733f57cb3187a8fcd0c1988a67e11f6982abf12129b155aa3ee477b54dac774 +0xcd200254e5a8cf6e0923e70fc2cf3ce26ccfe07366a1c5e14944959078dfb803cd0d0289132a45bcad2bc290605f33e90184d306f35f0522e3d1a315da594bbd +46960 +0xa19f65ffdafd6ad5ee43570f7e168f94a8b4a7b7402ac80b5dc7557818d0ce8e9075f51a32042ff7375d2c276da6ca223b40376edff95670fb8365825025dc46c9b09839bbb5388b6bf5c82ed1199d2d9ba37f3f75250e9c88b05e0f4090e54c53369785ff764f3893f3714b30d7cd5ad1c7c7508916b5340c388946717ab04b36f13a2585b03aa6b53e70a614482553e49257c9a33316e390022e506a4c06e97bc8c841d5ccc27edcc00d6804d46cc0dcee76d34ce6f84f1af69554b36cafce29a28b037830af680d608fb989e36948c2c26e960a972220b5fc057bd54473a34869c991f546c90b520640c02adde5949df6853968ac5dff66fcc8ed573a1a10e104cb13d475d810b29a66a66f2aa84c757104e4eb8e719437de24d1c1b86bbcfa5bd9b29e24a31e36054a92e0327a17521d33c11da526862f8a624f9c252f509e563a95dabdf3dee42d34ad065d239d3de159f58559447d56e9c9916fe92e73d2dd38e610a790f8c6fb6b1f68146a873da5bfabab139223b5e1a3bcc26c30cea0d819cac84a4213e457390f8ebd197d5b51ae091839d91d535b36fb1e15fd090f2f266b8b0ed1d7442ae4a501c2f6269ece6c375335e1163940cc74094e5ccb27caa7f1e05b04eef05ab50b4889ca2b0e02415ee46d72b46d76ab4f0d7f17bcf191e4845099a4fdf0d1f466eb7c5c33b3d677a6544b549ff9e71bb5b20ef485746d244a623079af4a75e9e1730176e7963255362a354e80e47966ce7f64bcceb944b16e9e884ba90830dca16782deefbeff2237ee952aff3716d3c1fce9363ec600d1168c09e29632e914d14f665df2332327d029d2aec3f9a5a9b7b1052c7ea587cd6bb51c061cce88da97b415bb99fe88ac2a6254a375320e31d7272164365ec3ed94a0277ee3e6f4761b1cf7c08b2614f86c2183d0bceb39b34ae5a3a80df79a78b9d59413948117308612743470b3b155bfeec7ff412b0e763773f5beab7af6b804ddc98dd7a8d84f001bf4def2ae46094b5288f6acfa75c4c75a7d6eb9eebef39b3f30b453621f1db0c1df87b71ebb5d37d42e7ea46056e32121a582df5cda72a6832f4fb1b7d4e0bf8b9df7670bf899acfd215fd166991c6f50d4c0c4cb317d4e32302898afe0e1550196f6ab7de405d153c961dc1326b7d67071f21143ad5bbad39a05b153296898ac324c2b7d69e9cf608f4c6d70e5fc8008e6de6dcd355614eed5afa4aa98bdb313dac08e126e8ccdacd9e72b83be3395a09a4d816fb2b4810b49ee18bc1527ccbff41c7c45dc37f4bd10fbbf569aa33cc0f506f5330abe2bb35e89b69289ef0c36ea269f1d99326c1d9d50d0f15f959ef15fd3702126bc3a6d7c4a2533da5e9a0222a79ca28ec55c54e6ae075af751e3ba407a9a40eef6d6c20bf70da7f2ba9faa06661edca338ece855dd0c9b481f32a400c41c984ab32539735918f7b74b42b7fc2dcbd4c1d2466351a486bc3c47b33607799e31233d525a1c38ec2a135bacb06ec24b91cedc8f4d41cd1ec3ba1090f8be61c7145fda83ad6e5c3148ed30041dc3ee471bb39ef22c8f1e7bbaa9c4ee728b434048e8d3e1bbd28c905a2c1373876379677b5960958aa26046a8f3a9f82dd7e9b0d5a470930bae92b067ba4c2175b62b52b8a76aa0eee25a26967f07d3b00b19c0c47df8c1256b343b777e23356f24ccb1da84033ce1b7d6c48b3528aa838d9c181c5ab59592723bd69360e0d7fd15232beada7591ea899ac78ffd53a32fc73a5fe522ed35d92a6e2bc148ca31a8f1f969ee9006c691c070d8aabfcfe63b1fba3e27bfe9c982fa97e20b1e2a68f7201612f18eff035ec41e9fe563e59c2fffe65ceb18f17a164c7ca379ca48a7730a42cff8bca872dafe6cc347d1dded94ce846238154c6f1c87e71512356c14a21745480d0248388cd424edd9f2ff00f0f45df7179e44d21c129ee0de45ded70eb0e62437482880fcaf0cc4a2ac92feced939c48f9b1fc89e5769ade5e3e5193f3bee0c7f769170b3f8eef1aae8e00eb3e5e070a8f4267b2bbd122430f8cb02bc2226a7eb74c9303815901bf98f2f59298019a46a92a1134aac5fecc66ad6b90dcb539e862a18e91370baeb9887c807b712ad08de5bd8b7848c1aaeaf234f67baa040985580c8c3cd6f36088ebaf33fe60365430b38129060c60911f4097e334b07b43e625f20e5ed7ccb1ce30ef8293cbb07fefa1199c666c0f5be9c06aa46496a7638b4ad6778fbfe40cc9f6d1eee43a25be0b1cfb3801ee3a55caf011cc73c304f2d5354e6a3805d5ec2cbbeaeb683202b923a58a9e61197e39436e11ddfaac107c5483ae58f0300eda66fe9f0a8839e3dbb9d96c322c645750e3790f3b61d8566a99a49ab630c51b51f91d52cedcb825a04e0704859c5532471bdf5e6731ce434815167824823b77dd63b6caaace3364a150dcd82b6972bb865cdf8403f304638f4767eb066d19a0f737495b10e5420d5952b97b75ec333f99471814741df133bab0f757ee49d62319d45388b3ba4aac32d43b5307cd1d5afa3b07845a2b4b3054e273434eb1078acfcb43e7e5a5e3bdb845c0f35364a78a13d93c58089348e5e84c3a31aa2b0424739cc8dd394073ae6437e8d0db4b58398082051411fe90c0ef5edaa78320829ccfc920ed2102911ad11b117021f9a605cac6102cf8b5a96dc4aac3195c29d9601ec10a9c2f74b27f597fe955a9f8176b5d25ec174f60f92912b0920ba7bf9efb0b24d47ed70f6e4897c6cef5e5bf32d6b221e777688916af53f0a5f2f85a39d9ff651ce99a4b1b03069040d567c77ed4543a90a1e686784d02fbad63c072309975f25280fba04f3b106cdd78a29961e0cde0764b4bf194aeaa21e6e2929029a5f95d03b97db7715d5facf36418bd728889a416b80b430220b41400d3d15c7b7c1415af1782f937e64ee1210c5cac27481205d09c9703376fab4279cc1f0faca830bcc30fcdddf9726899f4f5c0ddf68bf176625d91baaad80a2db04fde5233a6e9a2de2690ee4c6e2747dd94f7cb76d092861a6f6dc1d2f65b4652b3919cb6f4a9785ee08e928746256b498e641d1ec29fb587669db15647191ccfbbdb779d1dfa9dc3c2197350a6cd84d726881b54be537527c7a411ab46be1185bd0e5b6c8f4793bb4fc3f93eec9a24f511f67ecf4068458a07036b2871d4e5132bccb09bc53aea93ee00ac88a415bc21c5118fd4d548c71ca95e167454d7e806ac793fa15c2f12fc217205e459babaebb47bf70c096f4a5e22f6bc056c419adea3a62113b0aead428e7a8dd86a13c1c154982ceb39667fcd087fb45224ac8de9a5d63d796f340a05899cacbb719b313149e899e901a8b7f7ce5ba7f12a7331d6277bbd38e449c9b3a74b0b23fccbb9c9f90fd68beeb0835cf90d0f58ca201712ad2958e8cc7a5ceb7c27f198682fabe9e6506b5a5d18727afd2642ff904dae3dab4178ef6420440b5c96289f4021881fa66cb0bad93b05b05f19eb6c29568795a66695d367e60f91dd37f89f116beed99db75f53efb2adbba36a7114d1d503d9230b483b2436202d826fea1e584940b640c2bf8c0cf9eafb4e9a7c804643d376b592086d458b262cd0a0859381541e24340169e9bd8b3dddd52c5644e31d56ecb2bd4f00387f721e3c9c53a52916e7a1fc15e6e37de126f1cb92a6c924ec0ea9cecf948a696d94804aa5ccb9bc0c2dcded52af0fda9626c5865fe683a81a7b3c4e5b617274e02de17f4f5947c6ae60f6ac5a2ad53004cdd7b9f68e1ad9332d22d5e34e4ed7717eb03f0ba1e5b56811ba9d9f02ca2ac78c96caf905e534c084ebd9e9a3760d9c378b2e6d1f0a14d3c09855839f553768d3813dd9f679473d22f5eef1198e83bac8b0b1d6293b717bfe0e58ca891cc2334335871bd84d8d2377df797c190ed677a2ff6df968d037cb1a8b0bb6287777e14c023b2113e872fe0416fdfd1a6d723d6695b729468ef44ba6ad02e925fbb4ed6ea5ce9c41c09537483b00f6a630e386843221f85abe236832d2c2d5ea2ff5a21b6eb5efda7c6069c49a16fb34efa6ed7c4342e91df441bb4f9acffeed7ad6b9e2eb859e565270f009d2a47d5ef048ccbf477e7df8b7cbbf5d638ee6b862c49f459ac22a4e09238478633def7ce925ceedcd4929837f4deeccdb840fd38e4bccc3fad0061a070471a0da47d42740ea4e5833376e36c134c44e5143ecb733d8ccee9a43d452b2a052038656cde68de2d5bf27ddce9b041cca3273430fec29f80a15e7a1f770b263a02115ff3f2326cbff62f980cd28ee628b299015ebdaa7262eea615ef1fc8ceae67a0785aa65b1e225e446e4ec58b6a261845610f31b51ef85cca5ff467e88928f8ec99e8236a5e1d3c38e6eaea31368f7d333d8d826a0b0b94d13f7875f5be725dfdabe691e793793814e7276a07b02a8b6a7e1ed751a1623dc39cc17177d7523ddb949c185a24fef9df5b4f6d9541c1e8f20a0b58f349c700a9601884f43b91408f3e52de4c7b7428a129a81a64511a3cd3cb9c2fd76900858a72c5d6f652f70f208f500e45ffa36c63397b9afb49ff3015a81881866bd6736eba108e04844b529671ddcecb18536e2c730f15e28f366bc188c97986b511735d2041d4a73957b0f9cb4346682e4bd604bfaeb2a28d8796df55f53c61b1792c608c9fd265d9e1d25284c8a0a3a9544bf3059e99c2aabc5975f6e5f59ec5d5477ee673adc9ccb260a886b50104f23675022d28f3ca4d9b5b8d53e1cac65bef6bc0160590587a920104b85293146fb9fd381f94e843e0ee452e5430e360da8d412c049da19c4c485d6d02e67e5a89a48b9ec32a9fb4ca7bbe61e11c69f4aa7870cd9983081ca89e1deb4cbbea5fa8c1c63a013241a5730b6f2de2eb840b3378a1a8bbfeee60f75ae9867e17fea935d65716c2f3f59e4365009a3fe65b2cdc557cc753587bf1a24568478143e2c296ace53aecb6e428a25318b0e05517df0fd6a8314ad7d6560f2743353b87bf32350b19ac69c335caf89b5f78ad80dfac34c4ceee86c42817a8c82259952abd7f79bb9b761f62110dad067ff98faedc1cb1e79507f16798bdd4efabb977760333c98312a0f8dba078295c1d3b6c2936b6ef07a68372074fcffa66895fcab1bad58f2c2730db750993d465e4472e37140256eca86af0ed74d584f36253742409ee327f8130af7975e617e87924bb219e894f5d44c455623057d95fdf9b5f1719051a41c9a75e2f0bfa58af87dafd2ffed24024229a88acabde6171a74171d111a2af3da69ecfdff4560080b472daa859669207e9f371130cf184f3634d949c1a4e583ac11cead157827824a8f33cd6dacbaecf42d8f8e17c19aaabbac5afbe5c8f80ffc129974d5d0727630c650affa68bfa44d450055c22dd3b6355b3aa80fef08c554fcdbe9a2e6c740488d12c6ce82ee02d486380ce27c59fe1db1e6d2a29f6e50413114701f139c9d1c33e8965c63ac7534519517db2593eeef50fdf04042bf3d4b4fc1acacff78d9066b40b316839177f747b60b2ec2281514b8dea56b8161e8ddb97203def2d270a183b991af7b237777c9095b4fca7ced484a075676c3fcff62fe93fa17a63010782dc1b669b2e91030761d9cd0b708e3d48506980492f6cd859fa60409721824f4c9e7a5e7b348cedbaf4124341062a5541a6ace9776d5ffb00d26c606ff012a91d8a9c4ac04c90fc3f532a5fc5f008e415a927ea1d810e27cd7a494a295719de9da66a7291fe05f73e860769c0b692b26c62c2cb63f4e32467f9e146eedfffb775fccc1d17d354a75e9393a959e12f86efd766d3724d44b978571a9be60e2df94d94ab957a52e3d44884b466b9f846294512f94b72149bb0a59cde93386f096fcc74ed20e1041b45a46154ea07834164171b647b8bd24fcf98d114740d87fce09ba67c07746f64c419305a7b6c0b87fd0df890abe30dc8dff9fea4878ce06f1362323e925d1d27174ffbae62101780bcceb36423a5506ea76f297514de01c8d1c81e1d08c196ca07efc938e71a2f946b0354c72af720a9f1a35c71632a7271e2757400b3cb60b75ca1a3e051b3db2bd053e1a30a0107e1833d9e7fbb99bcd00e123cced9a00554de0c908eea02a4adb56764df09ec8c7e26e4f8876653664f1d477c71c36b0d0b55d9982af8301182e0e6e46370e038e8a2407072aa7ff854d6bb3ed0b952fe4388afc39cc464ab1219796a1787049187bffa1126d045fa49021789d3027d626340371acc96c7f8c62ac8fde3958121c445bae08c1fcef59569026662e815c0d54519a4a2b6818204da7aa5afe47f7005fb27e78ce14271a0d325db65b142a1005ffc69076bb9d135f0386a63ba2504b3aaea2d0f5cc9f4d20827f3c4a62b8c4c568872e1fe976bc235a955e7609b67371aabbafbda890893cfb2b3670ff90921f166c61ab744da1171766d231e0a21f71311973aa1ad344bf26b253734d3a0e7f93e6d98dee8a68c6b46bbff3b9ab85d5dc4cbb2f95b016237fc501a5ce2da0637b77045bbaa559aedc245640172b6d0bf6d5e4d2cbbf540670d3cf9d14e3ee6707ad60796b371a2bd921538b6bba3b703b459f181f79a4d4a45f2bdd93e55f06f2fa7c8b62b820ea45d3365a39c057cef40c3883f3478f2a74d794cbddaa58afb7dec6f64390e456acba5d1103e66864cbaa4f9af9d159547ccd990c54cb81ddb0cace4e8059fafd785756644c84d3de1c9042c1957fba0f36b1b7038b91612d885ef0f8ab8bcb4b333ab0a896343097816ec09c58db27971d246d3604c45cfba90bdd8927aeebcc57d4da72537cf52d7486378fa65c08a89a862a3832acfbe49d41f274772bb2fd6096524616b7980c70872610107af39059678c7ea7e3c464cfa1ce4f2c9ae75ae82fa698528c9fb10fe20ac229c07f0ac438e27dd6e12ce8da9bdf7dba64cf6158e155ed995482c7ad17541a54c4e164558afaba322dbc0d28a09484a321f1bd3d5bdeba5db7d79cd2a7908d23e0e12997ce03b86c31e83e44508bf8795ae4aaf00faf83021f04bd0b035eaf19bce4e70582bbfcc79647f8b81c245d9f681ec73b7d46dc3902a0b4c0cb0cd498a17319193971fbe6b341c8ee640c08a7d216ae5a15432a650b21f0ae5f29b23347023c6d62c43a4c216c2b71d891ae054152ace67812f218810f1cfe4043ac7c1618cd5c9f313c6a592d9cccea53924a0e596f5b1644d7c60cde766b1ed947d5872d58713f3786b3d31c996a19d079d8c1a1524260372fe01706b96f3b58f8d212c64a45d3558ddb27afadd3c786a953d3b0e216e6887f09381e4265265153e4516a2f44ebf9d622bf6d5694a3e4c52ded0ebb5329b759a3d89badf78040ddaecb9f73e8f9b2d43d02bc00171f7941d956113a81aa22244280f54890a9a5ea73d9bcc4cc7d1f2c8caa3246f59ac2a3e8a77eec2cd8778367c9b1cecb330f2ee614687e49f67d23841e66a79ab65f6fde799e4cbf4525eb760b579cf19ccb0f6804292cfbf67b7dd5c7af8e80f28dfa2d1505d8a3609bb11fce6d3fbe4798009c01553d5ced888fd44e938832cffd0747223c1c83cb6798a79b59339bd3c4a6d4c4934bd75c32de121bb9014abf1aebcf29a784dad607f6bffab1f4f4c1ff66b4a669b515b2f8dd11a766a61330662c3793deae13210b5fcb54ee00538296d4be3f2f2572924921457a42d346d47d4ce2e95804c73cd0384c4293e25296295553e77a09886ab23f401cc415301bbec283929a055179f514d54c1a275c9d357d1847c0ddc1bca28b740770e86966b9318c381b3c6c78e879d8ca072bfbd839c06dc8aa1eb8f8b8aa63b2cfc97d45dafe5f42622652aa38dbd944d18c9b07a4a3d6f28c48c8bf62f091b73734c659b29d8f39f54fbe9e54bf59550fa5c48c14abe64dede89b712002807d4db6fee2dea39e974b04fab5daa8cb732823f2d5f85d1e43457a8bae7e54a28d89cc61a19d950fd2ea02b191190cc217a163c085ce2be17b397b23d7dc7b9a6061e1a8e69dd6458548a55da0be6fbfcb0201981c148cc24e2066ee7dd8cbba8e7c932f525e0be216ed896975395626f5c079f3f95a14434490da6610e1e99560106d8f553c9a78105f1b6f8ef8449a3073396ebe0d46e6e7112205218639bd9df3bd236fd8065a0a03d7da4e99af7bf380cc62cabc992fbe17fa5630445085906d2e9612aec40a5c724b34449c1b6ec78faf6abfd68f80221bafd3cd9ab2afd0031e51ee3f782b8020e1f7f15e0cc524e65f010de99e8acba2df0849f7c47ee53c28e142f887103da63 +0x52ef6d43536b1fbf828b21b669fd459acd71e0ed8c67b97e9a7a79f145cb3a5210143d692ee36db3a09ddbd18bb26f8c50f473919e38e07614b8a0cff6e11012 +47752 +0x4b91efb861462b30b26bb5e8c8b08ab8a959f396069c5915b54a5a2c62b21d3981c3e2458670dd8a5959443204a7a762af378077cffc0b909a9e574cbe679dd55260d21d0db77867b664b90adb0cb671c6261d67ad5cf9912934cf3ce9efe65aa8b2e6c65ce3a5d0b1d63df5b5a962eed56cf2ed0885ce234a53e9854c129ed06aff47caddbc0bcb32f5f77dfa4450e0c45228914840304be545cdae4e986e3f80901cb1f7095363210b102913a62b4f7b20e7dbd553c813e250a43f5648fdb0d1ad8e011194249d665eaf8166979944e11e565418863d8229bd96c1ceebf42a479dc54495232783e936fd0e5cdf42c5e0949e8377a337a0a3d4cabb1d49fab6c9aae801ea7f031c93dd22575e45d0dd5fc9e6f05b70607636dc69b5ab2ab85b401a1fc1787061704a9a45e5d292e891470657242db75d0bcb1f9a37e056d5219236940ba7bee988f7b48e3e218e34eb7e9319a6533ed9684be386ca2494fa10a8466c67df30426b837426ecb4015cf2edb853fe37ce7a939c7154f5dfaecf316a92d25d888f1521d4223577f2b308ae7cbd2eb53f2ee896a8112d41796afb8bc061ec760aa309b3d406e265426cdf2814e9d152d528cc79550a39355a91272693fde239cd34c728696756400ef389679b85645d6082ce428da69f59eaebfa0bc9acdd2f3a0af6887d8fb98fbd11af73fbd9115f480595fb372b8835923f1d414cb705deb7ec3fdcf7c432dbb78ef9551a2dfedff479caab3be21b52b85737d0026681d0ada44a2bbf4fe9ab63320e14e2c95365cea6145b81138137c6f9f1c1d5007a8d85f8be7dbd7807872bc497b839f439793d531c12f006e16c22eef31baccf179ba5b144dad986b4f7760e3b4a09f8d8a4a94a8ad87202647a36fde4e66e1981847797834bfbc31784add6a3d1391b576d7a5105b5ee5132e868f06d2b0527dfd0617124d70b7559b536e57655b1a6de5d193135b24d39723e228e35f158415a05cd09ce87f1e5a1137a035ddf59e197faecb2c3d675034d05cb9ee5404fae1aad22252a62955b1825e1f700751913a8cf5c9b572a4ff6eac4cae92420d2b8464fc88edf70df1ee673d48b0622d9853961d2b698b4c35c720389379b9ac9a50674270c96b9b8783285b98518eb8180733ab4c92f7eba7b0c4a6f4ff1b51cbe84a3a766f74606af24e4f9aedddaf94a7de16b9dc3901a9de122e4fbcf7ab44be564b066a91eb30ce617fdcefef6292b80de60fafdf0cd0818125001ddef7794543faad25549a5d79da62cad2247f96da4bafaa785a8b904daa31c2ac21e4ee0f7bdfd73a2d0c658741aed12f2d6525710fca06e02c0c8db4f5bae3e270f2179f665111139bafcd791f9aac715aa1a30ed2cbc151d3ee1d39ec56f05b3c9d9a57ac04e74c10f319b1cceca9234cb3b4162d2b5657d2ceb36f066c7470f545cadab541d63e3d74ced3e1eb53cf7429bd29877f326ca91d04a6cc81fcbe2b894d9b0ace4a7471b35151e73d28d0516242ab7a2de20ae7677583b72dd5ad5fd6870b24d0c0894e3d45be6548b4c074fbc93e6dcde1acfe2c8a784ec6bbc902cbfbcd8c1fe4e73351106bb4a4743a4f64d534dac5bded5ddab8170bf2fb9ba4d83034b8f21418b1bd460c7dc6f388512beb3159abd326970082c27729318fb669b8e323fdca9859c05af329269f452abf7fb662e6cdf33a1c7f1d08dfda3fd81efa5b659994d08c08c3c24f49e3fb2cae07367f1d0adda7ad0189398d72065a5678fff66bff6bd90514fc48b76e04d756163416a516307030be9991c8858dedbeb9634eeb66c4b133c303ade5aa1ccb762121b2258cb614361ac0aa178130e2a63007d77e5775c523626af75b048d795cbc91e9f4bab9142b8a80ead0f199d9ab716038bb6df9553257a4bd9e19e151984d0726b94cc3e08fa26cbcab5313433cf20eeb1906ba020f3753591566b2f4a756f3e0e99f6119e0d6e6c7fd2257bfe93666672dbe525c1865c96257677cc3087eeaa0ec4f0b10bdbc81754cebb1902ec2f92540013cb3cc87a951ea88995d4a094e0f57c84c8574a7cf5d211bcb747c0c59ae165bd3b9b9f165b03566b323da9aa054a2878fb8b44d12d8003effcd6f96ea7a173ad1de6f5770f5ce7e34a738b7844963295f4adb010e7e70d1e91b67d73e11b92aa1823b1e6dab2c3ba857f2c46c36001a35bc875824d8d950f1def361c6fd72b7bd45cbbabe48b52b88d68765caa30fd6ad7e17d6c84fc058b498a0ab0795da4e9fa98fb0e5472fba407365001228e8eb11102af19b7bcc35abd8ee379293667bc32e0595752ec29479ef2a17f53031c42b132f3d00c5339442003a8bda5e9dabc233bbdcd0883416af8a3531c64160fe35e7a31d8ab4bcd111af241c515fe67b076b10fb99cbeacd3bd514d217d50cf5dc0e0517abd2ce988556295d9a2fd7562d24a37633625d24b960477d6c838c478806f3cfe6a7cf473765b8e40746f6b98e00f1d13ff411b992bc5b9826a5657fb462cd8acd9c5569828e51344b2dcb31b4807a9111e99f087239bfb6e8e32eeb0b9210ecb338e76bf11090d2b84cab4b3b13ac4a4bcb6b7db268f25e35a55f35d8255c7a59f60beb2d9ce623e13c3d627c3b15416011eda5edea81f27f646cccb49d0e98046c29538293dfbc5874e8141277342ad145bbfd8f0eed1828b8de3c2b59b5da5503c6318a95cc00808f41dc7858877b21ef5d0110769243e41b39e0a6ebd0c5ce456911b0035994ebc3b128284f9da6c467273d0c922fea23f3f676a1d3edded2a998509d6d06fe1ceaec93acdcd5225b55c12dfde2049f5aeb9a5ab6a27b79f4b8ca8aad533280764d2a8b7080cc923923a1404ef6beb80b5a9bf95fc7f84bb6fb862c5a368ae09a73118c0dcbf26b00695e108a40cce8b7d981ff07c4e2b89bda31c24e877e72fbe52821ff1ed511239f4e1b2a40ad85d2e0e2c84919c94515ed73c8d4d66bdc0d1bd4c9af09e319152df7ccc986df340ef914e19e472a75b7adc2cc9793f17060afbe0fa81dab0777ade1a1c273e067ae8abed761cd74cee383852a0160adc478f93a4064baab50ad87a236cfa84f85442e37164e2d46b54c07518d9c9cdf6cc880d0288f7152994953aff82b847b31625c143abde70ecd33b1ae53e3c924cdd1ef261462c24f25bd8a716260a8f1e08b8cec913b7b3b7b4d1b020951760c6c178c8280a93def9a8ca47d0229865217224916c6416a5b43fa9be33a701404cc2c01ac19ad44b26c292a5963d09d0a49b90939465a24fccbbeccc853ca338c6261b6d93be967362f35a46ce3e06d98fcc255aaadf04b8e572c1637e1ca5531c36b34b0640815f938147b4e2ee3687ca4d0b70149ae3e8e8aa510a860eae96373ab03b82e73e16a2b58376381542e23e66695d3c5ee8e8beacc34905db660bfd7a3ac66f7a75a078d736143a7bd1f2d15f67a788f3bbbf4dc040a8634b77b9573d777235c2cd06fb2f87164ee78cc06c7f2fd8622003757f2df0b0082686a82dcd92ca3c87ef4f15049f05de221a53f80fe67731ae68133b3dfae85d343ee16870b153ed908383ada0a66951f525b35b57b70d5d6694a0683687d8c83d446bee6ffd97aea730abab49c3c80f2552e97f9fc8214e0d2c24f061be09b208434ea9129d1de8929ecdf6481eac807d4bfc4a2f413b6b6edba8ba06c802845ee19380a0b96d041a76f478e5e09c0cc4b8f4a64e4be41e504732ae6dcc4ba407c6415a637b1068076025186731211bc140da7a460ea2cf7a18cdb4ddf36d7ccb9b6021a1098d7e21036abe1838c2153d8cb5ae5db100e4b5f77eb4a065ef727208f9bca38b6cad3008ca523e1e076200448d29dc5c83c6c98c4f96fc4959f0c3b41213b12a365cfb164ebd220a786ad20f6ad50b39b5dd7e7e47423ac7345d8748b60e120d72f54bd6fce50c259e957b955599316d1d919c756ea1a1090721866bea95105ea8dfe8f0deb34397004cc27f555d9723434bea1bcd997b345aa488c6b890f14260829a0bfc0f118726f5717573098681b07131156b130e73b64d550127e7fee3234629cf5ce2bc1d99fa4e1eb68644afeb6d390e51f8a4eca186b4c33f827f6978935ce608128d83e0c1222326ba19d67ca5caac852e83c7a5b76fb40949bcfce8d1fcf50889ccde83b4b42bcb8e4f1eec83ac97119ff32d4a464c7d8c25fcc2fa68d1a7622dc1590b39cedfaeea2daec26da678fc313e46179c14c6d1fc89e636c0a3a120e8b419ffba36e7d6b7faaf86cd82f74fceab3994218e36deb8a98e24413a8e4aa1ec49e79eb5ea4bdbff48c10a06bb115d812f493d8476bd3fa5e34d545e14e640b20f4c4d1391164084a2fa8cfb6d4ac6094fbf59bc2e767bc50c385fd6dbfeac4e93b42f18833eccd0e4b9bb28b403f18bc27ddb00050f5250316dcc6b8c99cf08feaaac8c68cb692d3786ff573943c64eaf0b2d16a392ae907c7501e5cfc0902778b32c36eac6fee1c3eac04ea4122d9c3ff2b5c6b10676cb13d7680c4b7ad7f5285917dfaf367335af6c66d69c780ebb99b9dddad774924a1e1b67a7a9cf8cb83723d54f5f23b071249559b7c97e51f4e7e80c18bce3e955c6ca688090c798b9cd99ce4ea3959cdd49eb01b9d42bde8f4e08a94a095b6533326bd25da96be14010446aa4239521c147f8c7a465889dd4f8a01e3665e5ed2e8c860d079cc250952bab1218862a26644544113f239b760b0d38d2a579876a8cf9a3814610d4cdff44572c74745d940f6c554853b76e527bb4582d5eed4bc296a34b96e1aeaa41c784ce227e9735510ae4b5d5a8c809176d1689972b6839de94b205b4a21d4b9236129a5aff94ba469dd4ec1e06ff72af295b5278d29258a6ce4e5a434f05bfaa9217423ebe16f45b1064808d3504b300f7aa3c381c14b0028b9dd1abb1100f6f23ba4f3485c3ec79aabefb89fc7ed4f41f2bce3fd19649db15caf25490e442cb332448a61a43a986b407e5792516db72e80890f6b9bf2c17b2fb45a6b42960a5087cb5fb463f336b766ac4c77673d2619c660ac39b3860a0ab59530ae48872e4ebeb1f9bd15f9311380d22dab83ec0ab8170c50f41a8ed5c480ba3e6eaa87f7224990dee834ad05f4218861ab21eae37df4b484371b8dc35d039bda38c338f36fbad075c24a9f23cdbb479ef2ebca3ed00221bc5f41034128d0d2aaa93ceab18b84f954d7b2302924d0982c1f2bfa7b52b1bc7ff9257fddac5ad7162c623d900a2a9402951610648de3e29f8c8d0c277a75ed35712363f77c1411a32efda23d602e08f586e0a0946d77bf6fc7697fd1bbd14c7373e5403d0c9f2ae84d49b9182201f0b429ac7107480ea7236c4bb5f89b5652c06dc5a50cd24e7b4bf3f0d2aed448c3a4f9d4025ba20b0240c7ce5f1aad778882cb5ef2f561c4ab44af6d8f6fdb64fa6e83e1c4f0000f894e764bcba646a76661191bca753f740368fc1a5fd9bbd91d7734604972e69e84b3046e9c2a0b8864b1d3868c0acfef3c3f56a1c48b0a37a545a7e9f032ca1a8d04de813114707d1c1b8719c824a798be2e4b7e4de22ae31a503ab969ee2f061aba812e3b03fa07f4f4a0500f613b02f1cc472a6c7db27df52d898906d38a03b65a78e00a672cbb77e3bbd3b23f0ea08f8fe61090cc156abe33f0c367a17f85d85b42314fbc6d0a1d4f35ff612c9713efef84db6b4be82bee1a2ce30cc653ff0933698c4b725f666dbdab3d8c9878bf8b61bfd54c7b9f43fd468a7256b0cbe1b1895b6bae376862e1b58838a5210815ea9cf3b8c4e99f55742f95fbd60f2bd079b38459e87a1c8201bd695b3b54e9b9a5e7dcd064f48cb2eb5bdbea1b20183dba4890d17a98d046563bab2fcf82820d15d8b7c69d5adbeebb41c8c79691f5ac0bbefd5ce532482247b6ea20d25855a2e2f63105de5b018b7c87e90ec8e3688de69d2676b8c4d8986ec582d8d434f8fd65b6b518c89391fb9774b93a3272d565c359a89955df063b33ce21b255b6d08f4690d079bc8301d1a4ceb5d463fec0c63a8b004f4ccf656d2f673337c74c70daee2b0f935ab7d5801ccc6b67cdb5bf21a487a9f31e445ab0c9f723e3b9645e52c4dbbf00038091997814466ed056250aaa06124f4aac6aa88c1490509c9cfda973298b4a479baa703f2ce3442c4e96d3a35ce59e428619a6fe35f4d8f164d321719ae0dca76794c6ea7cae92321d892f3912708aa65ffc5e88e1ce17484a736d38b65c31a362f4e0029a24d37221707fd3bd5f7ee6986711c49e888611cc52ef40f259d3bc1c2f6e0ffbc2827d28e147fbb41ef573de0e7329c2b09fee58f62a12e5664d61f1c8c37b182429a362601a19ad2b78de8f36f530f4d2df2e7ee19036f60e0925923582cc85a633958c5158d5fef193972a950a72bb6bce62ac89d425aacd91875c1a1e8cbae52ac3f5499689202db03e4e8d45577cf7e81b707348577a0170f7eddb19342e5d89af3bcd55dbb72c692459a41867cfe3a6c959127f44fa56120795ece54b567bdac7de3119163a7a28f9da6e061c0acba4ecc50beb9692481f3702e4153ad9cc989e4b3952f110937a1f4f4f90fcd42c4d0652a40f94d833d2f6a3452b9b2ecc3d93013a85d4e004c71536cd4b72b26219a6709f7df842c5e7c705848ae4abf754669ea9443a1f4aba6c1f6b88260c29953dad429909585ac8489826d59ff7da57698229f0b924d1ae9477aef98f67df3a3c6731f3708f8eeecbd9a07e3588e1c11c5a212daa97362e2ece0bf2075bef93434cd21fa66ebee5f14885f73dd5aa2c0f65235db6fce4b38b810714263ef71ab2bcc760136c872839734bd32174aff2b351a4f336bc69c94b3f24c284a7724b3b457687500f643004d8768488dc4faf989e2aa0d26c41f9de66f9af7b1bedaf2d6563d7e4ddd297f3f67aadcc7315cd2fb928c8f262e9afc586da1da212c5a1099b23e43a3e5eba873bdc9164efaed6091123ee1f56ed65811d5abf721296eb60551b3ed8d765322f3720e1fa9857548554a082c1bea9b5a1a90fe76391ddc8c231ce4a390f82796c76cc11f603cbc354f2331981e0cb0aa7a85e280f1706d39fafb188e36d330abf5952a3dfc8689cd8683034c883bdfef399ba13dd28ae96692d799d6066f360a87d491a204caa6b80254c471e0deeed160bc82d463d318baf496ada28835015a84103d760072d99fcb7cbd2eaf5fa6faf6cfcc6d2cb4c2de27229d1a458b5844f53377e079e5eb2aeae536ac7c25cf0f03bbc832b693ae793361b168c4da0470e1248708f68ba40066757612cf9831bb906abe4988d9a534213d30b18d8bce8550cbb517ffcccbca4716c789302093a4a3c3f5da2bef6fb7f89d642029047b2c4b1049351c102a2f95af6f392825bf7247aeb70e253bd4a9c06893da1fafd60cd8db8a89d6bf87d85927b7493e0f7bce81134a0c00279cb28288060af7f3a6ce0214c13cb441ab6c9b68e7e2fb4690605bdaf7fd431a8e7b45e405d63a37b219cea336753ffe5e946159472be632c6cfdcec0609777c73ac1164d7666fe5c3964670315dfd5f67f8b5e21f4d873ce4c30c2fbf5723b413edeef0c6e31e64a1ec7164fa1c78ca903f9eebb66f66cab4e6f48c6a10cf2c36e4e5701875d01c14c45765d8d938a89f12255c55ba0c46fcdd9beb4e5b044ba43cfdcc16430b75e4c6015c15bdc3625d18501d4456001685530a35b4614879249b3fec08765ad7d8997632f7efa35e92fa2917cb6acaa417ee4750e44a261e80aab1b9363542aabae6becdc7976006065fb830321ef3567a565c26263d23a27e105d19e7a94d565054e217ccdf80c180f00451c09b02967534509ec262c96ee7754bf565fa0243638ce9f750ed8df6ca551563be097fcbd1302c9fffe29fe882838236f64fe9d9ba35db5499e90f0faa35f34c7490f25c56f1f71327e52d7919e00ac2e3d08b811ff8c118f0fc8c73e938a7f62a56e4b3cc20b9e18092fc897234eb8374a76fa1587da22a9d4e8e8a4f0738472886dd37fb647bf15312938157282d60f0f91ea32e6b8672e8069cbca34aae29b5466350ab66442be78d7ac78e63d940a1f11eed696b75d8194c3f71afa811831bbe0066a3ce1c77862a3ac5df8ef70dcdb4f9e9d1247844774afd1139ca6a3ca0183be1ac430bbd76115ae214518daebd6d36fd2d3f969e4b2561040a58c03e8d799c2a8e6d1ae5006b6285f353a50bb9425e934763d8cedd08f0b2eaf91c702a0baca711f550d76c60db18463d460c085bf812e53944bc75193484a05585babef6f2c1fc83b67b02174c02d3b67999f4e18ce2d068e5515b80b4e0f61503049362f7e019be52b90ab93dab6367459ac3fca36bd099c073d666f82fb2e19e36ef76416d2e4f2e7acb6d367bbdf8b2f7bed3c414ad74df0b30f389da9d605f39 +0x398b4e5c2570d043e9a4a037b0a01be41ce56d58a26a6014ad7dc5bb435c86b4f8e1f8d9673b0e4a50e1e548352475af8b1081f3b618274a77182a49a1d9e877 +48544 +0xe9f1f2cf0b8d563e2d20f39f9f464a808b136dba364a644683d0ce52b960cb94857f1adf43b37ff479f0689aa453cff138136203e2b4e29c107dc95cb32d2f0a43eaee2b047a05d389b53abc763a04958a62a79cdc72a16f6415451fbe09a6872b18b6dcd94aaf856459b22c9c65ae1589e984aeacee6968887e8bc6615cf7b344f2ba19478b46af12c218139e3a98183d904161db8e012f83a2e377258eeb389660410bd8a593fc9cdab49805238947af4025dcf0bc336b5d67945a90074abb294b95d913005b110987cde45887484ae6df794873dfc5c41fb7e8992c2fdce70699fcac8004699961b3ad1e1fce9ec8ea5685ccec5e80e4d0792559816f68613434bfaca81a843aac459a6fe35f5369c48e9191e4a32c70789594c5152db8d4bb02260012a8739cf325ddff2aa42fd67b6ee5bfe31591131ff27d0273d292e6a4ed78d14618ff683e3bbef57f04fab717ddc97d6f1c7673ce7a283b20c7bf3ff6dcff46cdd0f046936f847967e77bb3a1c584f31220a5388d14dc96a5730788b9b601882e3a0eddfca979b56cb57b73200d5f4a5389e40b62a8e33b8b3d3169f565c7bef1bc20d680d1e3ce15d7c29f9c9da2aabac0fc94571f83535a8f0789b3d099119fc0f0d827cf0befeab318de1d5d953ad02bb57a735f050698d04f91fbdfbea9bfad448cfa8b393e74b245d8ac357f231c33d665be51b17bcf67d228d37a80add9ebe59a00edb5e33a3c1036500daa8c274029ff41ddcedb86be58f74589254676e29ba942dec607c5ba42a012cd5c9e77bb74ed03eca64d463ca9a658f4f69b1dfa2d61c644b5d29b92a3bdf85dde81960a80da0c647ffa96498cdc14a33bd5569b656c9609cb6b462efb360da5785c0c97156c652fa20afe4dca41827f3c1ba92d096fba134dfb4ef412b2568d71575fc9fa4b153357a406b02b7ea96e40969f18e215384c86a9394eb0daddfe139c1907f920245ae5f037db773b9259916dbfc4b8031a9abd9e91a39c56a9dea450c1bbd8939b8a96171834761f432975c9919953e468e73901dd5b9fcdc2176d9ee04c604b81adb0413224f0d3c6c435d29e007a5e281a43fba6de81e8318fb6acfd2259f1deaa7c950b14acff231419af6d5ff719641b23b473930a4efd30c7a2a0a58b2cbb69423c2d6a734a60006889871f90be23d22153cce401a72ee0e7a9523dbea51fd24a5e20900d5c876f6c8772a90ef56e2785013938309dcd895fe99952b90412cddb216aec42de9f4b6bd2b86438654c0296e543f85dd6e0127889004c45f09c423eb095e8da78b17bae91e0b7d8b7c54b9d28718a51fa726377b10c932a11c619bc3129ea9cd1c4e77ded730cb493e1eae2f14c57d4b28864a78b478f3010973a9bcdac5c5192e077200ef8ca969fa9c7ad695bc7aea62cfd4f3c38a81e95188d23aba8a5c1620d13de1bf758448624ca46b72643a67d6516b6ef6747be474ffb9ef4a42db4ea54a3003df92086ee5adcf405353185df3c9725ca5dd2d6cf466a52cf295cf2d2bc0fce9b8589268054e3017811fa1376b768e4f5a1b32fd405c38865be9a42c14e3f905e23fbeae319c8b33a410718e7e1713b99bb5091ff92ef88ddeb4f6e5f111b8ead5bde9cbfb17453734dbf5cddbf9b72de3413c4f8f7d59a6038e33c550d8c10b1b69b02be25ce284abe89a6fe5bccd0eb93638f663c5c06162ebe754b4a785d91bb98e5867cbd7ce81acfc0f2bced9ee960a7bbf2676e13265448e1e8d1c9be76f33e0cbfbe2b9575ecf87062eae725ff2449104382f20bb932ea47d5a9657b88e4f54112f4ffbc18b96c7ff6eea0aa5665b0560294cf34f6510a70bada36dcee18264a26252139f90b92b555cf027815ae4455d6a6efd7063812253d6d2228d11737f0a55978544169d4d92895f4d665846dd568bf393b106f682c096913a9586792fb3498ee55185c99b516485d0b6e71939d5fe795aa3d7f764dc4d6f0a5ac929d337deb6a83a56b4a0fc8f1276057fc1e766426eb6ab5efa25217bca165f420c2602859d528111e4db0e598391d49ae76281f8523c49f475601a9240d3159976849ddeb158a83fd0b6016437b8a6b0d037b370b26002310f92423151e510381f6b743a813f12491ece603fcd5eee6a32e3755c1da666bd1f3812c98bb0c1965d6720298b7a71c61590c53ca2f93e1f85d2320ad283e9c12abe16db4ccabc4cc6f42c3c3eaf392f5b898afb671bf8592f90841d9f8cfe15c8b0b8d713a762b3d29ef2e32921caed67253bec683bbfafb6bae5f4d33626035fac935d7ebb577406c40eaec986b9a8bf00529044dcf67bb1add2310bf3f412860e10defc8b0cf5da0fea0f9e5287b9c99769778b842f4586d5d342986aeadba261cbcc0b9af5c1d2df1f762609b7c92d46db129aa5ecb5ccef53ca36ff7cc75b242eb52a7f945077ce1982ef00bc2f40bb41f1f0c69114fa46fe0836161c5e06d1b41ae78d7b3a4f3962a657fc2784aa5118862c7acf1b75691cad34635c183bf6e67db1691ce7afbd75610f406c41d0a4d94fbc16f911e4e24a29b05bce7e7110504e1676fbd13fd6ec4353620cef3a130ecf1e4fa190bf3ef0fe1863b6093c9a6c1c955b8a9f75f211bdf2f58bf57d481384c1794b207adbcbaafb1fd530f511a469ac7b6b9ac8bb90313c6f5bfce0a0a1f1441868499e4514b0c6e49e9e40f293a5ca4af16bce7fe26dbe341f5e2ac914a524c19b64900776901a56649996d9a4618d6ece7afddb7293e6e828a1a20df610e1f92709f69f6bc943e9d9db6d13711d544b5550bd3aeb7455001a6fecfbc0b4ea23cdc248896edcf21360ac4a5c6449bd652885a33a976f66f066f1721eff01cbd5e1f5fc31fa4ba3679ba4a50108672740aa72364710e5bb4d810ec7f42b97f583f64d88358885c66add5d03add80630626dbefcece287c07c1af064f7b0e805b28d118310a42bd971c82decbf5d97574ee4b45d9876c5f510775ebfa639625ae618ea633fd7ae5b20ceafd6b1f3ab1a6aa20aded66810e78f38925e9c2fa783a32c40af3f9d7dda0c635b482254b1d85a281af7231109166cd133c8360e281e5e39bcdd7c601ac47928a8c78cdb3c4f71e97d4d0b1c0ee01dd3db62f04f44798bb3a76492ba15a91b7110cb5e01babe56589a36fae3a2f336a2d1d5778dbd23c03ca8db0f25ff0657ff4bca1252adc38c080a5b8f0255ce3be0bf862823d2ab704729b74e1e275aa305824a566895ed677a460113e2a7bf91f00d0b8ebc358f3035b27fcc1d3f14a1367cd2769df39a9d21c5ee361f1965cd6342cc17a1463d64bacb9b259d96c2c70493e91f7d57598181127972221b4f62bce94e4f9d9534a238ed9fd739def388f26ff49d8131b8a93aa41934762deae65f6908c2eb93036d2291045d5c68156b72599b9d440336989103641985e1b6cced6a91ee35d0381a1a4e5f348fd2b6e326e9347b304c31c436a8e08dfba7318ac936603de6cd415d828e16d94eaf468462a755d3c09d58b09e1cf4fe221ee9b485850a3e88fa9d9bfdc8a1c8134e42c3c81c86238f4709e239d83806a3995dbea4bed66c86e8cb59de96b68d78403a35c9a12be70709d3dd8c531023faa6fc1da94c8b548b08491bc7609ba5d815ab3ed9eded8a92363507182623d291d84355f5c66f62efd995562acee78dcd4f04539b4b11aaeb5cabf36fb9d99f03add20c2cb519343ffd4ead8b3a10c1d24cd42860515eb46cfda726f596a7e5ba881684c0810f24f5b3c3666b2aadce51afa901db991b338199c5164c35154341078f7423c2b7d1abcda2253d19252ff5e7e1946f7aedb4d3a17455d62db834119cbb3ef8e2a9a6bc8b496e93adfd4329761c348e7f2c94ddb5334a15d8f734b6c81869a2796b30b27d57b6e121ccc456dac786db2e7e600a3590879ddf68c19b0a2578a2ef72fc38242b72b84cea1018a661ffb80159a2d3b30a72d0a9637758e370d08ccd3765981043468b57fbb2e9397a03b78034e9e4ae0fb050bfada25ae47925c29b4f095cb24d86dd0b682943347e375c33968197972ea4809a7dff2b7dacdce6c21054109aa8d81fbfc5efa107fcff1883f526770ed5e402b27aca452f8a6a6bea31d23e29c3aed5ed8b729d2464ef6f09e7250d6593e339a00ab0326aa052b46c1a005ff04c7fa23d2f5ea22a548cd23dd329b53bf726a7dbd42d6dcf7d2a62d03f6ad07e91bed6f728003a8a3a3bf4884f9129126e12dfde3dbe71be8f55f9af187e3a35420116d41c03c0b484812881b2e7b359675c442fcddfc8c84579eb614bb717b4cbdad42c61e5ff39c1f0e0a2b3b9fea1715767390b0ded6d3deaba8f3fb1e36d9da08198900320aa810fdf73b874656b2a98cb925bc55a2dd73cd9916adb17d03606b1813cf7ff573042576d47a37216e1a4e3b45682998abff4eb1063bf3f7d3351e67ebf40c5f05e1d0b07d7c3cf4544e0422771e215f446874174a0bac4d5042692f99d5a1ee679144ccbef51b776a2ef695444606a0b09888f46a87a326836f9498a6dc084aa0fac9f31f4d9d51baa26cbd3246a002f875d16fef15a22b72a5e6c99970081cb806a94d29ec8a2a4c93adc1cb87b72e23e999b1601f6f0427caa8ebfaf8680cb89c2a01633baaac26e702ca977113cb39db26e2450cd358aac7232552def1c1a7a3963856a0c57d5288b3001d6d7b824332c228274496cf01859ca028896be48d0533198884a245d85c088ae5e1b9fb47d8b3ae8c2f801236eb5e8304619e1c73a94acd83500aadbe4d4891773693dd50b4419aff3559c951e0b0f76ece51126077227bcf6ac55c0e42bd3c5cd5d2d163aeb61505bee89c584ed924ef384e6e5c57054cf23c9bfcd022adb41b243e7e8aae58462832f631551c22310e075bd76f313968762c54320ad761203c8d9e8dcc9c7156eff94b334f32d34754a341f5a2ed07f6e3a4b7a8c64821a94777bba53260476ce27baf484f78348d4875c771fc73b71ebf0b8d060b5d3577c54a5e6fc2e322b18a20ea185cd68c2c72e3b7f385ab910a94c99ef3e2fee4b13e6d4d92860b4c4d6e51c34c7e34254b5a56d822467edddfe946b21851137780384a51b786c10c671774048cbd7a45138937f1a746d2e2c847e9911d6384360b3d483186c9eea9270bf3737f229035ac86eccb298e91e9eb351c02a91d39697bd4cfb7a657786cb6d434d9ceb45e3d3dd9df2e5124a13a703b47cf64891b58f78647a9c038499d3cfaa1fd217ccca4ee0b76e1c712ec1d80e1d0bef8ae104ba8d918d07b754784e003a0a91e80c3b4e9a31bae326058da43b020980a940189b557abf480145c68cb799ba370ca29b35329355b3b14cfb8e02f9f244544d75b478866dd76206f9325e3f9b4bd62e8ea57252cb1893838007fe7b52c4ec5780986f3b252069e674b15ca22a4ae4ee6a11a206778c5d37afb4a5ecb76d01fcedb9920f81cd8982ed9c3b57e3bea980d20c7a2507896ee7fee671e47cc715bc018a9979e039315ab85582c75411a4843ae84314e78a5902e24feaf93f4d980350adde10ecfe01ec696fcb76f7de56472947957c94299c16fe4389715b6b19617f75e85ae4866ba6756d6dfd4b8f4f6811bd09b299c1b892a753c6037dca1a64d28530be836cef1760b0f2b0cbaee055888ae85d74fd3f147203391602c50b6bfe5e5fc2360bfcbdbfece247f4b7c9adf263d9e39236800af2d45b3f77067d155763cdec68fe2517e773c50953346bcfe3ca56db8df83bf48e4994d666e8dfcf7227f3c3b8bdf8a48bd8139b739f3739d110e7bbd4dcb34fb8c58e714ef6b418d32d79be91c5d7f1f1ac4674b272bc7a4ee9f4eae33e969b16fa90a69baa9a7ffee6b85380a0436edd42d61bbc398c1fb1b8070f45a846650d3b53ccd99ee36359e6481901c7db99834e6af6dd6e0688ae0da69f88a4531c101a408a852e2f7178ae918591b7010098214d9cb27abc53a85d5bf218ad3d4ed419df362ae2ef18efa23d0fbd084412906e2673b80a2def15198fcd624d857bbdbc88763757a2d80353934de006256df0876e227a76cbd988d4ca7811ef9c012164e4b146f6db1d78454c96b76b25612cff8d2f665b26a188218498941e019dc3b57c7db63b087792f9c1908f91b4aaca491bd10821ceb577525695655356a00920a84211bebb7507e38ab1e50453994cf682dddc6514a3fb19a8f50229fb9666390094f5dc54742b851071644d92bb298a7a9c5f9fa8fb77da044df6fc710f6f611decbf2e64139270eb6569d7f29ee4673ba30e2bec0a6205f0e6b0655769892b48cffa2f7ac1c11983f4823de393023f7e6864a46e7f6e3fe785cadf0f43481a19a5134a091d3bf162a539d9f66607558b82ff93a0b8e0ea6071a2d4090b20901902b7288f74579b100ded569b56685c1b593b7413556e97e450d4eee54fa73fcf7f42258e65c8791475391e5302a9b58671a4c036c36bbafb99dd7a248f407b956140db767ff30dd8a199abbde95ff45552d7f29b816ce60eb33920373890c6135f3fb4e8016bdbe4e98b892c78df8b10732195b21de68ba643545badd9fcc1b1cf9b4c53b8a765b1d38b212f4fbcfc40693e340b076d2e5ab0db96f8e1f8d10948effc3a041a3dd7e6152e46cc8cda5d9b6a2816cc654084821b6c98ff29867241aa5f0b6248c6bfa7b5eb037da377d080521c55eb7354bc4db0470e7fe354955056ff5851b792e18ee9f1d5e1b58731ce627b58c2fbfd7a6a26a0d9e2dabdeaeb7227a150fb14d6022ddd4e87277b09cc37bf9001738d476ddb148bd66444db79889266fe67df15a80e07dddc6db5b1003e638c258e96abdf6a1c84a9046bff8116ba29a8a25428f6e6fbf4601cd9d000e301ad8d81abf015402365095fa5bfa888f959ee1f167865554422a0a959ef54c21494c8113fecd5f9c39d45ca84a4466bea884d52889c79e55af91c97b857725806a263a1b4da67f377ae0cd98b35e14c083534d14cfdbaf3bae8326c77b0c0117286cea7bd4161c9aa07bd011bfd1f85dcd1330fb6249f2cde60909c0a73e48ac28287b7cbda49e8e54ae4d5d96247c5d2fcc68266999cdd5002a5aaf329462081561d4642dd96ddb3e802cc25fdf07875087dcdd0d54aa19a3ef01dc4396b7f39520dd7b4e3bf14905f95589438b00a4d94c74687601f063785ee68f03cdaf35506c7e0b4854939f5221b1f969afd17c7121180ecb2807792782f21099c0b395f04d9f5a43acb9a7cc01265cf9d3e1d7c110b0183551572357600ba62ef829dc1acb28b166c9cd271ca09df81d7f987d702024cedb05482bb0021a9beafb7bd278ef0158d93535e8e906ff17fb3c5e3627595c78e6cb4258dc6f0835f4530f3fb2c01397c5785bb2dc3c32ffbb919bc98ec4415e7d2cad7180afbbbd75874feb704644b65218a54d9d4920f88607b7ff4c68b9c8c9aff13f47cb1d7a9420a29e598a7dfca79f7d80d335af4c84251aa00a4eadfdf1dc768ad6ca15b67aa56f1f1593a7b3ed954a142609c941dc732d746f7c06461e3ba419d8b48ab74e9e20374d6aa8214b8073d240cc5521b779564224fcaaeb7855e4b6f39166c739941caea9156a8eeaea627fc6863b323cc0fed4d0d6833426b19c27cf6a902c630ecb4cd09ed344f15a7ee6633f63bd94cf8ef01c10786851d736351546f02ef39495d86b0ccd8a89592fcebd00b509e62e6c5fb0b470d1205018a86d2e6e1712aee21c21683fa7da6eddfe7cd019605b6602e833c955b5bca3ac487e29f22de7e51ade9bb910e40b21f03f49b877081bfeb7554e580e5d4c5858ddf13f64ba9bc0a5e780072a8945fad059ccbfb74a4d7ef26da8688311f9f8862e6d78ac0455c8ebff795b74deaf82e614acedc16e196e1df7ea019c19eb0a9d049bddb2543e8355ed2ebcd62a72409838914a7dbca8579fbcbb2b41bc4916052723755ff17e7b497b463238b7b5bc4f8c25dfd37c22c1e084c4ef5a433ba4255fac4999253c38306f6ac582cba17f74d90db3acf5af324816ac54cff6eb3d6774de5f4936a0407392417e9caf5e106de7f4ceee7075343f3c1c63881d7e68322d63c1586dd31d78ac74646fab13f7a47e803983359f4e2dbcbc236d001faeef53e077ac12fd57a985aa7fe106e8bd7f6659fb518c53097a5f339c67e7f49604ae00872f6d45746de48cd8db0a06e96866281c42bdb9eb8eed2ad65c1925a8da0668fbc7c5d4fe2b93c17646fd9503c64895a53d0ffb7ed12e48da36dfdb6cd923c3da5e64d27d4d58f2620828bc9401d2479d29cc3e4aacea36afdb813e6b69cdb72ddb9066773afcc7a20bd3a42381cde70cf03aadd685e89b5d3547752cf3cbecfb2692b8765a47e74035467538ad001cfb79a16daac5f120ed2a78a937dde60c4c27b2f1011500fb4370c8565bef358f70ac4ba94ed5cd6d66a45e011591e6bc29c63739a1d3f1aab4a3a26f15ae32e876717f874b1b4429d08a3fa64d7593a698eb6bb7dcfce09d9ab61de9ed53c0ce12b0842f27011dfc33c464bf67f3b472a47e94943df8967cfd907fec +0xf52e19999a5773b270b3ac58b152965e6c5b37ebb082d1f7a6d723ca9cca7e2faf4bbcd94ec326f16d350592ca7c3210675ed12a03b559ba66f9e681dff9ae71 +49336 +0xfe3ef26e61c39720a8176696e1dc07251db3261b7e0124a591f30df0debfcb8fbe2d991d6d57ba2360ac6a3bd93b1576b82fc7fc9495e4f20a6619a155c192d41f786d8197ce6facc47ff68919012fe1490a89b65d526a2a039a209d29ed1a16ca2658e408b220857c97f3c6cab5bf2c784c569300bf1f1523980b2d81cbcb1c673f418ce88a34742ffd473b13e02c20ecfe15d9a5656b7a1367c39985e40eb09dcc0fc25edf134285b7dc301d09de854e28aed176cab7237b0f2f295fbf499814d3acce923825b728cf98ed0fb83d2345d008c3987869d60199362534e5e69d755ffff8ad1dd19abd4c65b91276b1c17a000df736f7eb5c500cc2d42fdc4b876875f088d71682b5ef372ade4ec9a22994bfa4b476cda37d0e70ba7f752ee21e941f67c537ac9dce6397cfa2ea3c78213c16b5448084fb00e4cd056e3162112aa2644cf9f6668baec4743b4e0f549b721a0b29ed7da459af792c8de989014272394d876a3bcdb41db8d75829e49b73e4d5a9e6f895b3275076943938a592dcbf02e001602f6780e2e7c70d7d9298693e16f5d5adef3bccac820ef1a2ae9d47d9a527a025fabf58c7fb4c429040d3e34a84f9de53b4c3b08b46a19d70ccabea88c92a4d00c35aa292996edfac17d54acec8bcea330bd43bb5695526eb26432f9416f0f138b2c2c70c6b36cd173f2507938946df961df5d5f194327258e5ed7dc436817216f17e30fd19abf219df4b806170a0a7c212aee6086f416a0230313de1cee5bae2a516442d4bd537fc1fd01fff25d128001187d6c3a189f6303098d5b38924afe4f9126a63a8bd8406283b4b374fe14c9742090de8d312ff290da9ae020c473b6313fb0c69d86ac28122146bcf96d9f9d1cebbf43face56b36eeed3096025645a91b59910584e4d7b335e4e990a4c019f4dd25f192d509249ffbeac3371157b4fc3ab261005434ade587312c421e9e934996d06da7f58610ac5e2ad0ace15472a59790e421ef612b5e43869cadaf7b4f182243d147b56519a53c35bdbe1b5466eb5c7a8232fe7338688f68a198fd6035a9a906833abdad26d1c091f43567607818aef9a3f92873be499361a3cdb0542d4352a2ed48b4661e790fc8dbd96c7f9073b794af401668a44a79f80a1271601f2f459e75394399ebe55462dc71d3b996439fd30ecd6f5ad2b366b63e30e88bf3b6ab8285d4114d745db5e55ec7431672d18e3e2868dc522fcc8421a7efbcdd911eacd784e2c78aa1295adbc9a1659f0d65ab5e65db0556a5dcfbc3ae16955ee1af6f24da2b0c585a906ccb84c8e15b4d461eba2eed91711b2df324b96f1d17ccb31df1ee7789c087db133ef9045e531bbe10dae96529a87a0593ca32c0f90f3870ddc72a8ee5c9105376bb8f1c848d6013a947000c7405a8ad033f7fd2d44e0f2fd82cf538c97cdd3dbecaaedafd13028e1088d9aa1b8f8e6d6c0b0a6d54dd373835abb73cdddfd7e412f3be046eedeb776e25de07c54e148cf6b4395821c39ad31dc9d963c8fde48f9bbf276382210116eaa775ea1b4b2354c8c4765de4081e48b810c17533dbed8581b552bfdfb92eb2ad95081cc48da10b0bc3284245b5adde2d07d83ac583db0feb5ea5e02dbc5895de77fe66691c78fae637b6d0ebd12edfa536867927fc94750140898d15336905a6d6bf8eb2018e6982aa8acf7f648891472634fc004e02ffede567903e25484b2d38b35c4643cda006a30b07a877a53d3c5e4889f9820cf5d4d5a5af529addaf9a28429aceea1be69baba1400f106c2aab662ce9ba9e999ee196adb3f69b1078152bd40ef1ff62856949b4415c3ac5a2bdc746e4eaad934339b2e563d42ec9f0c8cbd181588989c39705acd336fa98eb9a08004131b4e12c07b1b789945ef05dd98fa1bcab9078e94e67f2be455acd4e69b1c1ca39bd6ba171198aebde306d0870ffac84911d173eb5f8ecca32614d13534bf045a7cf19ea9f74c55358ae2839b6a45aa4b2364e0cf53f03bea517fe827f5df77b26f3d34eba49d287addf0a38d20514e2b7e6059935c49f644585c9e3156f3d345c308116ea21184f83cbf94cedab40084832242f9e102982bbb2967d3f092a37f18e0b8b5683ff75837bdebe2f1c48dc0c24931458aa07e1aea74e9923b4264e8e1559f227f7efbf54f6a2d6bfe29227acc33a908a1aa349c76ad77fe9f7993fdbce5396840550f79e442bdcc68588b0cf1701ed5ce96482ae051b77ba5bebd37fc0e2be96368ae30b6e63186b8b90411e29d171f79eb1530a7f01c9be6784d223f3ecb18511054c417b31d2d77e14a04100906683c1f48584e170bc1ca3cd046e705ab8781f2af9e8737c5131e57b96dfa4281227db94e0c3325299fd972c31093e151b97e65fb4a95f2edea2492deba01e7fbe0c73f92c707a8ea888cc0a209b6504220bf00d432c462ec1523192672e757fb15a118b3132c20c31e6c9d09acdee0e15fcc59d6f18306442682512d22eb10f35383db2b7b211b47c3e16e46747e01d3b91eb75001525b8a90dad15f34bdb1690ce80d685976f6ed1b93cb04fb04318ddf3ecffbecd2e123d685203932bfa7e0b45615f648ae422777fc29a1ab020e6434a50a271e5525a47a29b447a76162eeec569b51c3379b8b7b7300c8ff17e71b5bd9dc5e0089a780fe2114070d5380e81751e4075393518d9890f6d771865a07b745dd2d4dc0c54dd513a5f3def66060c7e0a683745212a251ee5259ad0dd5bdc9817301509b3d7f917a10aa86eaafed608b59629fe43d7e29e3d9cc0bfef8a215154476b3894e7aa5bcba77bf70cde283aa630140da5055a319c39b18da21693c69b7f9e11b96d3a4542a07c35938e4a3c65a0c0194f9dd3fd8c6634e3ffe577207440753b2952effe8d5b74cd47f684377a4cf5cb4788962d948b13690ce0188667f2b95fec7c12ae34422a6a30ff1e536e9e7bcb97acebe73d0e14c6d3efbd21fdfd32240bd5ea7cbfbb68b2578f5fb7c7fc19c047f319530d5800a25cfbad19bdc9a8338d44c191b730f44dc38f908c10d099525d446a9b8ed19ea7adea319530bee3337ab0dd15a40897e47ce8f9f9ce81c12ae38624e448e1b87bd0a691bddc45aacdda03872f0cab191f8b80e2278b775af0e0a39059c2f114c6cd1515ba4bc4c7a9b6240707798142a5f741933dce1a2b4c5d82f61f84677c31aa2105b405a5006e15fba5c672f2da1fc812536420d2fee4610b9e6116adb56371b1a8d2904e1ec40070a9948066a83407da6cc408079963f426cf4501298a052aac473d7629e9557e6b5a982945758dbb8324840e21c56f1ebbd3f3cc45c2bfdbfc2a1d3f9c28c697d402fbf8f709d1ecf4c4cdba884ab0e8b2f094ff6824388e8899997111a5c25393e7e472e42ca9a21593c695a4f0d059f36f5022f97a194a38dcd996ef26efbb90517c2174a6bde6cedb9826de7f747a67984ebe628a0918f43a06359e74f5d6b48aeb8c103eb4bf07e26af59cbe4651f4b2b75a0a1db1ffa4fd48d786577dade5d9583b1ebe3736a8f2658b4776eee98307b27f59fab907306bc6030f962f460c85ebb708eced529951b06f486f1447fddd68b4b7ebc83880cda941a1fbb2ab12d7ce8734907f1bc247752905715f75487d01818cb6869b7d6a1819a44cafe4dd1726330c7494990c1ed942e844777a4e2fa46e40249d370d8c3c148052cdf7578d1e44f65fd5d55d1c064158af055ef53a79043bfdb21419793db99dd5b5ee6780db415c18e9d69f8b24aebd7cb12927e8a9cae609703b8a7a4291639d0ed0f43a88b2a5687aa4b8b15a127e7122e4cb7f5c49a70f7cb346d773233b7181a6e8014b1f39172d4892d7d1f405570197c948b907e7d9818437d8f9f78b1ab6772a1e4c1180edacc91344b1dcb9f5f548098be98e0f2d25b744c5fc95bc61544ba2d9b410e2b29f2f254221520215a7017290146685d4105354e5a386370c042b3879aba2c72dad83af1749df487dbec9ee9e6015b396eb605181175163e36d1dd448585197277fcc980c520af3f6e3a965fef825ff3a5ee722e1807ea7b0382c5e8ce4a4ba68bd12ca69645c6b48bea7bdf9021ed38a10eeaf4d05956d390c5dbe8e772398b80e5d2c76a65c193bf6cedfd5a786964caa80e00dce1f1c4792badc96375799df1ab6a67b419263973423b3da0ee7b049d3a29d6804a41ba2714aa0eb4fc726a48a2420bf5d86b2231fb0215260c88949345ecea8cfaad4125215f3d7e5fca5d006b0828b20c16fa8607c1283c4b2891475bb5b1356bbae5fdd24bba0227c802b3561b427b5ca00ee9e8f6cb6632c18713dc22cf2c25e1150b97ee28f2dd11d7dc03f9fdb4229cfbd82f2193464be9e293479298c3a1c65af8f2b4eec2f82e68e4e5229eff06742ddb4acff42f0f0830403ea3b2be77b13420634e9ff4f18412688a33baae60bc315dbc5082b2f4b2fca521d4815f10581d2c7a0990fb61a980c1639be554d9db92f9f461b3548560a43c81839937f421826797748668b1052099f1c98384ca58cf1aa361faa64997d370ee5f7edb9b94008c5c2dd4af783d7e5cb55b39b0caca324a19dfed0aa9dee6dcc8c696bc8f2623e5388400422fa8f6844ebf5c6b43968902f839ff043e9c6aea9137655d475e491cad159dc33fde259afe648006dd542fcfaf1ea5156066ec24d8408f204cb30c9d3a5101952143882b74f93935f079931aaeec73d0c7a4c7161e6068b817bacae150d4d05a9c8f9a9022dbec5b157d6f8e8831efa8dcfca838d425768730dc2073910f8e65da08d973888b0df8c4d5f175cb7d7d1008c4fbf789fe5d10109d99ee6b7f90599255c140268532817729d56ad92da0a8d3a42eecb05970e53f85839c50938aa83ddcfe808d68eea7b4df87f831c0fed5e600dd82d7d55669262a9a17d0e9d1d43524cdaf1d9496bdf67d958885e5fc298861745470d0723e6cd339eb7ce11a5020c3cb3657a6cf56c46a6ab625fb0d06635c8fdc1c0958b76c35ef81b527a8be892083b0ec0e0ce4974c93eb927ec60eef388c7429be8e76bcb927650a1c2181c6b163a91b38b3ea079a8d936bff9ba584bbf6d72a8e67eec6e37e1ffc3cf91c722d078995b568f96dbad46802ec126cdc2d5b5faee789a2232b501cfc18b41103c9dbcccc1290755243e4c407c2aec75e232688275878135a2759e69a2dc6f2043e4d0d2ecedf005dbc5b21eb21e5377323f4eb146f97c4c43dd80746eac621ebf0f7a54e48890cd89a941c1d784a4fb3a622e3068b8d38f9f566e992de26333368583fab2e430d6b552c1d2f343282b8304d1a6e3aace273d493280e866ba8732aeb36b5de81748e728faf80f45242d948e00bcc0b9b53ca51c92d0a720af413af2d150ed7b8f4aa893b3dc3171e329f566811a06cccff56039573270f88a8ad7b9a7506b87de047efbb62664afac482ff61c67bdca657bf506494d4dd692898f6bfb14def34d9ff4c8c97dade7c6b1c9a59b4ced9dbff6eced2fca45a21067ed7096434ea724438f62b58916017a8e4bdac4709f2c258dce54d25060444c4b76304086c38aab17d93141f3a6e610043eff617cdb5fdf6821a5fb88a7a48e5eb414c08546862a44599e3763657cd03d297b3817a71e34b07047701921aa1ec72e82e0e7de82e8f1970f5d805cac016194b612ea0d516e8d40a2faadd73f43af6ce3665594672e471ced7df3925fed970718b69c14e0d3261b1e60e9cf49473ef7a01b766f1b446e6fa15d630f7bda080b09eed6c4b3aca488236c7713b1709b561fc7f37787728d1891c679dce911dc27f1804026b3402e1019e4ffab6007ef11ca3273b49300cda0277fdd0092da3ae438358141c6d9ed396891289d3d5361b108239f2f2835558eca5236835d7c4ac946d5421ed5bd098e783b9bf32f9e1abd40641fef2c5a4e6ae1052d6e3141365e83282ac3c935a994b2a900b5202e42bddcbb9afc89b7dfbdd66169c8f86f232b58f5e23a8889f5d57ca5fee9f74d003943f1b85f2594310d102e9399994f3bb92b06118bfc0116d83ff53d999c417cbaddce221fea396be5f73452eafc29a68f652160bc0be53425646266ccf652dfc712198044beedb6caf33a4fc209458c356f0f77d79f7c764551b4218befca51e94a9c79d78bfa3a466c0a3129a8ea1434af98fde39f0f05bf70b315dd6eeff9a7ed1db6de38a61ee0ca6aa127c16266138f839be9f3e6091b2827ebca5c0b00896365df64ad3a8b21752347c53cf3ab5a769af8f08349a9e2e0d74a5a9f648d17143c9b6ed2fda88fd6fdca0a01e60b92cca3bd0037800d9b028cdb962042c9da696992068f399eb453bfd3fff883ad42f8679121f7d25ecef50e4685c7efdc59c8b66d33cc349418553309aa0a11baf264ae1d5cab89c4032125322f7db2ed1c9ae9d4fe7138b341451f15151dda592a774008b83beb66c3ee99479d28d224ac48cb6e6d668b22b9894c9e481a24b37399e4fb3e8f416d95c4312ed6b198aa903824e48b93750a088b824d49ea38f05432649ef58fd200020bb68fe2014ca750d4bcdd5de04093b4b188ca22735e3756aa8698e524e848912bf111caff364275835a02ed3632e4476528bcdb9fddb0ff6a13921634c96dca8ca75d95929da486acc8fb427b9526490e28cb7a55ff84dad8d23391a8be963596a31b4ba4cbf50bb9cc6f6499af80401351a0097d0adb6c5d8d245d690feb5bb2acf2f51c065c8d112f075c76c91bb6de6be38ffe47dc3f620a0c825e0495c346898a9ae19701931cb86a31fc2a1f32d63e3c15c2feb0da4d1294096ee5bcf5bc038c42ddc60da5423140eb111cb33d639151a2b0777ec5876d64f983f9877a7ae2a0f5f7daa84beb6033939fe5ff5eed2ecd3eb0f96f8979e3235a84891fd9eaee6dbc171df90e7f0fe92f8dce2c1ddcdb56f1aacdabad8a3c793458ddac9a72ee9c9e25d5297566040acac31f6202996194c4863c59b9213f1090e93d55467cacd4a40a4b5f0908083f692920c8968a8831be2c8ca235a8b68d751ef142646feebed5acc7c450cee23016a71987601817d2e88505adaa86679becdf409c7cb37d0239f49080d41e5c84d82551c6e8abd8214877f1a3a0231ae0fc14748b16b02147d8caf0ba1d613ce3b88b11aeb7ac91c6e9eb96ab9de79904ada5d336bbcea135bb172d9bb1004bf7bcc1a16754810b69d0ca3eee2b3aabb0077ba6c6f275c775e9c1904a1a615165eeaf491847940eb107fa2f93d184178c137c3462440d59af6ab261efe0ee16d8563e51ea194c62469565b1c3182da63fd891c73338fe208a47d0e8b4890e61f6fb5400045110ced182f10ea6869d20725ea3a56156b0e4af87056dbf9f28fb67e5da9f8e774a1bfad6888c63a53c4dccae981713268b6dc632383738aaa6add41cb976b2146111689a117523fd73f4f6cf5a657131f8827651518f4830ef3de5a9d7cd96afbd78c4d6740f0d14a8df97c9cfd7a4fe5ded67ea37bd17bb6b7341931eec62d0c618b59099a34a7444d458a5e1b5d41523744208d409ccd2821991e2751a3fffe4b9e4d2687801a5b09ce16a774628ffb3e0afb00fba8ffe9cf57c9ec3a155c57f22f8a3c9d85b2d53ffd92078d3c94373f855ecd01a8ac521d1abd0f2c7cba9ff1c9a0ca409809694c4e8d0cea4df69cd86ddc3ff6fe2b27973c580e9d5c934cc6f7213e1549768ddb5b781600191fa2850ee3e8502c24a0ca373b4901279ec4ee327c36801c8299598ee3b1632077dec203163481b5017432b5d76cfc8015bed3f622121583d6323363506d87e6a7a80bc4e3c3102b4a084d22acd8e3d8909124dca37f4a11b9df15732eb8e2fe2794eececd128fe176d385f83c2b5bb3a7d23d3080cca238d6066c290f1208b9603bd7ab3281658a107c89b0f5b2c883b3f8a9ac3a88927b933ea41f52176dbaf9f352c4d4be15979f59a4e77a2dbecb5d7ad6aa4141bf5c79ee59a0a81796654d61ecc5f427346c8bf183f629fab31d0cef60b535766d5e029bf96761c0f76ae2fe1209413b26ab5eea9387959829db3aacc447779540f2c5de1fde1f72151e532e4f191c8880c6909b4ff64d84a7a87f696deb883ccead2c1b197f51c9840206790060169dc730b98a35eca24e90e7337bea2c07cb5affade982c57925a8b87574d298afc95e8c423dd1a534649a2a0f7ab55346cf9a7ce3aff83b261517a43898420d48b9db3bc33cafea845507d36bdc5c2bf5b7f17735f4c65ac9263557c859bb4881ddb1c1a4fd2d17129e8e95c1274b007522f4a14d5e99aed2b7a6359d4fcad4ebb376b07005d5a55faf82c3a7d20e6b458f187d7223cea1e377ded03fd0dd3cd6c99e7aacdd362fdc1678ff986312d6f76ad15e4d0af1de7bb543ba28838eeae38e9d92c3e9cb111861f5ac1b50f4de0b34b3d6467a8faefc1e7955dfee4c598270f89b4db200f384f07d5b993220eae17b3477f6d914adf501e435ce678213442f43f6b2dc8441a2607480aa7d33881aace7b5c6cd1d55e71e18cc8c85eca2a907e4378bbfa17601207fadb7988920375822024ebd063152b18bac92cfd88211996dc040d1f52b21cef345592aae5da7fb880fe73f6bcac86ab13869bbd23c2e6255437aca0bbb74aa73ea079a2f9aed059e1138baba7ca8a82e0289d0662b4fe11f1381fe31b18a61860e3b6d79628714b8c8bbb57 +0x00c0541af4657e4296c95c076cc0b87504e771aecc78e2259b3dee92b0ef30f59025653b8119436a86aba5e7b2155ba2d112532d3542f5a9684a6277131ab387 +50128 +0x793d0bbd04099f5f4af6dcdd71e139a2c4378613ac137dcedba69b2fcbdc2e19673caef3081150f0a2c7d9944097b074ad67383d74eb5cf70b116c8b4c9c2783240e19128fcc2754c47d68d6acb3365999cd85d3351c74b7b94422765fe5c346197bf3228383491216e030ac9f7cf2dbf03216dfd6ecec954b0866f9ec0129e9ad4be42ccb7ee1b202b7da1d013b0d811b5e92683fa4ed1a2a25e01bdb3683f4474596364f0515bdefcc0d32b839afd38019a277588b9eccbe6337e414cdf6f05133ae4bf7600dba45e572f2adbbfe5a882bee1309eb28366f8a135c7f0dac6432dbd770abd6f2316bcbb065c80c259d9b5b1d443a0ab2dda6611e8c0540cdd85205b7af53b0ecaacb467093f2734a252272d812d332654bc9b1fd7b8cac80d4197bf60fd73722aecc1d5a85113796788339c686bca9690742425b31fd9beee1ef043d991fb0bdc4d61a15420ea13020287590a7ddb7e59977dcdeb741533f863c6734531366e47551034ad2d2f940a577f1dd7e1ea6018ad2472e143e1d9a4c686d82479ca0c048a5a1a03e4487f08dda74561168bce760b94af450de4027badbdecf7da0a579c53bbcc08d4b926662b8c5a36aa143bca696afd87408061058fd82c5fb08be3674791c51c7d164caab79ad6b91b381abe1d03c8187a4b57aae37200acbbd331fdec888fcf5bd4345f184f4568c84bfd99bcfba989199968f45ef8246f5a64c5e8a91c9691df778ffbb43620e65fe44715bfbf0c49bd1f177a48e6e227faa5118003aa73f4a664a1f911dbe3824085a99aabca8aeab330e5a537dad4573b38978c92dea2781f403cdfb7ad27fcf8947790f7aa8fecca7345fdb230759d8a83da36cd05ac8cc88ea3382c26488706b543b129db95b0315acaec3e74303b770b5c4718dbfcb320a4676ad5e3dfe0e95c9043b8da36d5a65bf7093332bed17f5390161cbe0d7bc6360c105b42587b2efeeff13b22eddd87fb2cdd46e85bf001e1182c3f186957079803a112de4cb63610a5121752253854cd0ec0dff1a207bd384701f6979ac5835ed095931417429d36725ed3c46766ab260f6c650b2b98efcdbf3fe9a81c57c7ff157652905270c2d4ba1007063ef8e9aa91287c8153244825f32e6ec6688e240d24cbe7bf88e1557ffede17a4165faedf469d9cf0a32a24b555662c7ef9c945ed90feb91e2514b39cb3218c0a881b491892343cd5a61b2400886f793e6aa9ac34ec974d28b18b7bcf6982eac60ebc670b0674e2acd697b49bfeb2fb81159fa5579a1e2a5bb8a5fc6ca46aaa5304a3771b15d804f2bef054fc1ad919e3852befea1c0bb74394f4d408d651412e247107bd32e64a23c9e593857f3a5ae253deea5104d8aa6ce108913881cf55d3c89587860027f8cc81b7eeec9e5f44e9fc190320c71d4a3427519250394d4ed07b9174f9e005b7696117c575fad05e76d86ae8cde5423d25d25076046f4392a0a7e56e8d6517fc66f265c5d617060e258354f9dce1dfe9de6c95bab9865ac7c0f811c2b4f1c73e61b0225e716598ea528767c4c23f5ee6ba7081bed430fb64bdc697100538ac03c624edfdcc78d169aa5f03c8127037aa5668b51108d19deff3bdf5d4f28c3ed320cb29226bc378028964c972420702ab1ecf904fbbfacad00f18be90017ee822ee0d547ac3d7d55b6c531951e576386f801fb3d9620efaab7c9141cfb6834079aa760065692871caef8483f55140517e26c3903c9fa0b5d8a8a23ff2863bc05dd29fad50c027e5d77f8399cb29f7d64d8f75a5e7c93274ee2fb5f986f50af045f2e4cbeb6d68aa1798dabb41d3ff4f54068075697356c0628e671f1b976348a887efec83c57d26e1c7e46907f3d92538388e7f40226020cc2110012ec1e7421c0e0b7fb86ca7f4fc895b337bee17e050a1fa33fa6ae10e81a44b501f29096506f1e1f607d7ab8c9e5989ab1c473e1933cf5e2406917be23964938c8b114c3a0fdfedffe07aea666db50a207773be28680d14dfd34a73644a0e7306f13f22397d2499fde0dad71ad12857440c181aa65407d8b80f0a89dd39fe545fcff71ddbf56c6060678c04026f3ffb864898c60b8e3bf45d183601e58fb0c20795cda1aa0f23fbd802e2f3b5ae485157cb7a52d08d16023f6d718de5c1b2469ed147501c00c7a6c5419428cd04ee1338f321439db7128ccf9d217086769f5c7610e8abba90e41ba88204158109ad9bba5e421abbc2ddee9e15ea7c2ff4c46e3dc32616fe35e5a4f262a73caa32e3655c6b414ac306c4c21b7620e34ae2ce06566684246f4668dd4352121071074bfa8fb8a3463c197381d82c59588fb728cf407987468668ca4f1beec933adfd23e5d4b4ecaf9f6146b854a7184e36e841038c8aa40fcc13a654dc873118999b2791bbfe81e95574cad00184d236f90cb34dbb086ee2a8bd79a915b9ee31cc57b3a8b5e4178606da7c536f341b954e8afc282c815c61c4ecb09647f55501ceb954755303f2082bf8e7dd0e33590baff9980d7173d0ff7917d7b6f3d80a1b1946868203dcb5d22d6679b76f011eec85bef3882a5e713e6dd57b75a9c071f02475c67948ece7968389be8cf23bd1ca6861ab02b7afc180fb9c087cca5d20f388cd90b5a2a2eba7d6f932c848322627d0883b1799f62679aad20b16d5fc9bc7aeb471b1a19d5698903b62f3c18260775679102141b0348b041e0fee6d2d56df1ed0e607b64a9cdb37a6bb8a0ebb255b52dab6da5f6c50279fe6636df06dc69c51996a226129430245e1c915803af9266e13bb8d43892df1c6b1b21ff04c7f91df747a8c32b7dd8043630800b690307af0ca8ac48ea5125c1116786efd37f6521108a3cf9b84b0e7a8b0f4e612398fcb9355a11aa14ea1d9276b32f577bebf5fbebc52470bfe81aaee421c3043b54b9abe4b9afa1bc440fb42465e2dd05f2f1d0116229d14b3b44c9c9cda699b82185aea22d4dd6ec494352a3e7682c787ea0cb08c713c4612cd4f3c27ec1cba3e6aaeaf51eb5f0abe00092799f89eadc764b115a5eaaf00ba311535899da3f038b6e8668f4ad9802f1909c30f70cc039c13acd8e8db6fe508845121287baa0e0f71aab8017fe76f76539995055bb559849b5252dbefe9539c3b65779b029944314f580c7ef7031952244b15f235c5200f50441be584b5ecc3dac4b137ceec333c9492ec4e5ca72e111f90be7c8b85e7aad6e4ac9c3650113dc71166b54d3d7b8fe5cdcff5fd6e0e51a9fd06fac97220d593c68d766142516894cdf069e9e75da9b78b301c65a24a8267f278037c145c1e2b7c26fab2072dc2d84ce6ec31847a289e3db51831fe5321be239a1d1fd709e2e248119f950926dae620d2a2c09f517aee57b77fcedcc8ce30e2e5ae2144bad26cecc5db96d2ad1f62ec1c240392741f3c8bbfc9b8b81bd644c2d33d2cf7df5b2fcccc4513fe510eb3015be666f842940d2c467c7c3abcd88e35eb509f4af7ebbf5a9d52a8e683377af2fa70875b4d67e4dbe40e75bf2c5351dea67f04b885127028a19ac225e4281f537058d116050937fd110651c00ac5540f9d1ed9eb175e06b97163fc36d43f048565e5d0c30a069b1235da8ce7a8acf95b27c69b3d1f2cc78fa564c383d40aef1b33ce02dcbcde72adfb218390b678b643eefcd5391d1d571d861394a7740a23778267e3edadff4342b941d24594c71f5c5b27f469919e29d5cbd70c1c34cb464caa59f0504df7a152f8d1f590c40698f6e4ee95490d2da45abf45765c86bccbfd340ab4cf2d460161524869ecd4c5b7b614a71451f05a7b1f08e58fd2fa5d28fbb7f0ad94bc68e7f02e2babc44772f02c72e81e0edb930295111da539f02ae1daaea2474b8beeb98204d237b18c9cd6ac88380eea3f65df5f607452dc18b49b1c70a61e7e1c261a897ef2aa2f14a1dfb8bd0d637e8c4165c08f700543d4789923a662af96dddd7f98f5035fb790308ff399dea83652c43a7af6a7590ba3f570a2c86e571051436d12ff6ae4c55fb74bcf973269ac135cc1f12e70ba8e0799c5fc5f3fc18507164799f6bfb5e303a4b7bf4d8f144a5e899095af62a6659ff3eda2c34d5b6f7fb4a39083786f9b0c973845157b348b94b93b0ae1f3a90cad927c38ad1da13a1bad05892e0b5e47dafd61f3975d56fa469a05b37eba3efde0d3d62065371f6f7b7df2064f0f2e940f45a94d4bcbd810f47a9511de1ce4b3ba56afec9410428a0f95dd7a7efa4cea1a1e92a49b3d446a1ef97db878a216c89a894e1fa23fa72458834c68263325c47bd6a2bc1e28285036850419d6c0519711fa551c282bb9a8e6d4a351ed6065bdb50c4dd63d23008dcbabecb8911e31c9a11849749e4af6822af896ca2cf87930463e189580a4495d5eec8c17001213bae8619fbb6d43ea6aa56d7b237d71dcc6bfca876c71228f5960a556a7dc2293f52874cc431d7d01acd6b1e51057530cdb82601eed97342f0c6194f0fd5de61ef301a053ce477cd8d34f5458f3331285f92e6d437b6b4fc4d0d209df8a3dd3315f04a2ca9f53b9dc887fc34b5ea936e4aa146099a855dbdd61529276d0d4506773a1ca9548caba8906d89d30a512468568e4d895f6ff7ec51833bd5b63ba041dfb49a6485d25056b08ea20ad8916b7f4a01033ace9b09f387025f8f1a56754e1309cb4684eeb110ee9352c165d1f01bf0a171052f311b3940389c3de2864d94dbdfb7359809573c14249ee0fb3a3ca50e179ed2c95bb52643cdfac757f2af7b01df671a0a4bc844e8e8904fe0f4d6836d0a938ae53f60225a6a8115bec3236b4bb0e2de22db8e8e33882ff65c26461fd5235613cb05a3954bb73a0f622031cc83fa306728e23184bcab83bdb9f815e00e0af157c3d607e7df5b2c9e8a3262066f675a9f6487378c4dfa958d3d93ca2ddf666b3d15da1380deff5fa87d213d81d89d676d1ef32a10ac1d6c4c321fed7011e0cdac08384fc9104adc1684144ba685445fb89d4d9177a2bb10e4dec307106c1f1e8ee51943283de5aad1e73312db40054b6a2abef529f77c8a3b8aa89f75b8cc66caf4a478062c77d1c0eea71c89cf88326a0d6edd8e730ae13b7df63d07bd8eae487d0275cca6a95acae198f119fb741ca08e84d10ede0a1dcb01d4692e430efdf0c85ac2e073234cd9072d17f18c7111f4f5295911ff2747d25c6aac5211f35baa1dd5e8ac5b8cafd4a98f187b4a291a4e8984feff9f07663ad7e18ddbf0e6d05ec39b6e96268c8ca20fe67c1efd413e9693be4740865282eaba619531a88f65f403d3dc089bcdea2d8159c9416c6486b45bfebd3c7cb1a4ca4d114abc0195215425a5bb6983f4d15c4710894e6038f890296de65b49cbd2c2d81a36e4c3a10d66713a9121a6ac4917a83443aca1659f1345334d06b44a16baa2a4e112b55a2f132ebae998cc9b5b46eded80c3f7948023f67777a387d3789af4d6d2aca0699141a64d4835bd690ed25f62c7fb2a6da5a98661ee9c8811ff4a16d8911c4c753bd91f19386240bf6ba143bca0bc0197158e3b1a395780a9b3b250d3a6c8812733c4e24940871f45789ce422936e45bbd8b85ecae03e36469cbbeaef9a1a072783e83703e90a20a23fab89bd2979be80f71136986bb7748ec34b2b53f378a51c332f656fb9540c7ec8b779b5e945348f79800dad632c00292f4b5c283c4c25ae4980b6b73acdaa8319a6fd315c3a6f8f66ec29315004a3c0e8a4c595fafd4d86cfc27000f4ddc4573c625d5908c13629c63fd34bb8a725fbf73caec3b7f3e64cccdfdc756eed20a239d1e15677405305a2605323257d4e8163fd5fd9fa96b7a849be423b3063880d16ddd15031218cca0137f1e21eeee6fb34ce1f004c4e8a404d47ea7dc2a9c13fdd6d746ebccaaa20ecacf5b02c62b41073963860348325bfe0621b61ad2596e1966813d9a2a575b16aa7a6b4d5418169273ff0203a9d51cb0af71f0f7841ce9b47b8f6b96b18b42283104e17a4f315ad58b09069e604d60cd4ee3cb0ab643014fa4465359d8d311e3fcf33001ee038850ed15f62c1207c2c452fbb6ccef586f5b6f4a875c26bb24ba7cc9d98cd70b299528aa734525a0bd066a3e46a6a5e96e584b006a2611a0051c2f0d607380c4a902bc3ae0621184aa23d30fed30606298d6b60c9e40302e3d999212574e71aca13a264be01b7c3024ad5bf53ce2b55069573ec37622f8b228b3248d1076304f8c9be551d4c9bc4fb703339298460b3f7a4a43c99456d1d870e974e23ea33309c5b877e13115581fdbb6184c91d2d88c262073936b44520d80bd0196342df08807005c8ea756e64d0d3668a7bc01a3c3079a3c958d840fcde29e393d93af0f26bb14119e8a26dd43b614a318695b037098e80d545d9e5196111daa3ccf7ed5824c5425b57c0da39080d156334c576e2154ca74646debddf296abc3086a45ea1745610747df63efafd7ed007cb78f5a31b581f02a30f4fb7fddd92244d67cb352309b44ea36d2081e35d830594d5b3e3e55df0f3a4952307a61263666a68bd7cf98835cf104d083581513445d7053a0b390123009198c138edb037de25d0bcdebe7b9be10ebd7e7ea103edaedc301281e0ecbf10b13fb2b398601774c5c74ec33989ef6be3e50bc4091ab52aea7cc1afa2c7cc0d4db37ddf6fc909109474fd93335b3854d8ee366f823f95a14a14d1fb463a53dead1caa233c94189ad80050b674997e86350088e7d41a93f9451ecacf96ec5a6b19a1c1e9c56849fada93cf94c4eac9e842428895c752ba1b21c332925886ec9cd96a4b98d3eea618e2530395ebf6226247ddbedf23900fef262a93ac55af0e5934a0d0972ecd36dc376b7322b06690dc8bf9b22eaf7b9c5d9e7c74855510ca8a746bd6509eae012f2301a8a1dce21c3e57bcedeb34bc684ecfe05e8520512717dff2e72aeb3910f7ec3e287c3711cd70f351f67c7afa7ba8027fd8147d192ee8be5e8a8ddc156a1edb497d19899cab5ba7de554b49dede5580806a9a3510e5e558d648e13beb178a384b2ee29a2abee5bb8c93be6910983b8e0c9c7f10df56f7f783a78fce6220254b6bc43d32640ff77682373fa137b144774bf72bd62e8904e18d31fd5e238cd55bd2c69418f2a57a21e9c935bbfb3257816402064fa484f55f1b6e94b2d56384b2a7bc4e157b885404e8d1087d06225bf680457943ea51b3b955e5bc9421ae1996132fd3f1a7c16f67a8d81fb0fd893a1cc649ea79a8f82537641edecaaf747c503ea68b742057b1925065e41c8b6fdb3c5f95c2ba857f322170a1601d26bd95284fa9de658b5204cc0901be8856dd269d72b26ace29f0c4bea0f7ac552f914c656ec0348e93bb4f5ffb3315bd06da03892826487d3d52c2571da7283a71f98951c574f5b5de997a914d835284446f5a46a97bc68f69ae13340f393e9395fc3432794c89a314f46cab2879dba3b8a3131d1c384bcb540ba19d9d35552a42a33551b5d15820ded40ff4b39e19e2097e1656a9e63efaa77153daef24d4c521f574f69f89cbf4e4424ab61779740bdf084b397a0c09e409e911322e8e252dd9fad9695ffe48e6cd4505377b9355e4e44a9b0eb43213512379c3ef82f9af2a13ba4df11eb838bf41e628c108722237be4bec1c82e1c4099d2c515712efda84773eb6d7043e0447ea2c9c9ae5a045ca151328ac0a9f84d31e07a4b307f70e02ac8dfe64381712466d1f470a3ca5246592ab350674f7bb794e14a24a889ab36d5baf0bdde3cecc8475c7125b320729d2dc1afd72e96ed1c1d65a3466be5e318d2badc78d2ce899c8a82de5d3f150bad89c686638918e2e745ee1434dd1cef12ac58e18bb3cefe0dcae58a9bca107413e7a9e5a9f93de3b5a8db2b548e86f590cd05ae8ae3a6b0b863050445c69b525cd1dc3c0f017e65e3a0cd4749f2bcbd2faf5191eaf4fe2818fd61ea0fc72e1ce4d2edf7f74472f00dd824f669ac369c5bedcd4a206a3deaabf47c9a4e3e413a48654fb817049408a0c982c7581d8d1981e2c935cfb5de6eedd2c59375be6d40f3f381dad2f45a1628df672889b918cb5e38e5c34d6a683b5b32cd743aaa0aa77428250ebf864dbf22843298631172182d5a93912dea53b6707f04aaf193b204455d9992312cd75a1a72859598b921869bb2631de5c83996ca21fba63f0dfbbde41e5023dc6aaf7d6d04c0be8f129fad05eac4c809867222c4c622f4677b305adcd4f92225c20eafb6d58471bab044d2187e493e0da7a6010cc61b242f6e0851ac3bf51b81c59d57744f313da004c9cc3fc750de66ae3da7eecc34a3eb48dc38be9dc48e84d7d40b21ec6790d3a296c1e8609c37b8fcb18df72310023fae34869094f7e9b39b3b314c278809c9fc2479aec45bb85935aa39c2752dbd7100a9b1de9bffbb72624b705fab2306f7840b49ff8d3ffedbcb7021bd3cfe3433e29440d52d5c8255df8d3ed8c1c926f0cca3c95705b979c530bbdc63e4f204fcc69cca30b39ecce26569034415dad82a58965e41d8489799f7d5d042f7b9be401f1ba46de926f99c8667542e11e8a9189a5baf4c7f7df6bea36693c70fb5be826ea965d91895a6d8d520a7f34062f850145c02e355ca15c7a5e69d8c7766845837be952edc5b434bb3fd75401bea644559101f8315ad533991ce53ffd94cbe160cd398cbaef85d59b57652712edf7b8cdb204bb819985d88d9866d9dafe8ba605071173c0aed63875c23b612d3c28c7b1d051e0eec2b8329efb730e255cb07ab952f66fc6abae4591a8e16b1b53435b481271cd407d772b166d9546a8554347c6d672e8968d15e43630e0aba4d94f5bdba1ebec3f71c9aa3b1553e929924af472ba0c46f6 +0xda9436bdc81dc6aa3be907377519049371e61a409f850375d3a503060112f0eacf8539c1d98cb3a302f9c125c78ab6e3a3e695575fed3eed2214a0b9e3fc6b51 +50920 +0x96bb7a62306a40df8c1d0ef9f11301ea036d7d15e8cd713caa23dcf3dcc4905481bd36f5296692175d3a08203de55f4c689fc69f1cb9141e9f75543edd1b819d52498ef02a8ba93ca72bc14ac44b465518303005fce142a1f0f190803b993fc0d20a8c3b7b000fb7329b415dcc6b3d6ddac9c32fd06e822d673e979f3f655127c9a537be64ee4ceec63091439e6dccfc77128805e0875d2aca05718531a83f38ffc597622d7de64b2b92b8e2827a7b6ab8b2867073555a00e2ed27185989925d3b10b50d1dd46735286abe24bfbad31f6252c556d3000117779fc042fe31d1fd472e98a87d1c57148760acef9f545b8340994ea146afdad751c244e96ac7847fe9c8481c957c3c4f0e1b892d68709bfe19302837158a6ea937ffbcf7e374334dea86ce4fad1da05086445dc563381cf9b4be5b0288ba44f3f2fe2f53b26067ce110f312b0d270a7eb682319fd8d265dadaecf0e8e667e41e4b66a5e51fb2a76a280c7997fdc10341687e0ca30f66ff0b5362eed379b8d79307e0269571937c89f524af7ac413120162e0f6b94f1d70f2e7c75daa87d6a4b9f113bb4bf22a6d934200dabeab46bf266d4ff7c9e21e42f95ec4465559e9d3f7d0a86befe8a002f0d547024afa829218517318bb0e92fc877f00b0bb3718edb76b463f699c1cc30976a22f06f9ee1440d6f560771ca127031324a3c6688b79608b963da156c73944efb96adaefb3cc04c47dd8e554724ad7e2d7275d366bff5af83f6f805ec8eb0a0733baae26f842cde2b286eefd2eed6ab4c24568e7e0070c7aeaddecfb4861c485b9286ae4e6ff04f93d747860fc9924518c04d0c4111ae0d93f8ece766f24d832f2bbf672a58a0fd1c5aa6cc605d46d81de6d7b1527bf3ddce58a0f1764bbb0d6877b3a185c6b5832f32eb3757129ad0b60865222497f8b4d85d9952650aeb2391f701f1d342b45e46f0a33b6671d4cb8b9593d32a0e133f2c6844aeb5a86482263a38bcb545140aee046d6d00f3ab25092ee258f546d9b93519115aeabcad95afa1b6768e465b05aefe8830d9207489b924bf07f8cab2cfacd0bddb66a02ccaa8ee09c3d0ef0fdae43fa22b3180c7460627a884b70244eeee3f78c4cc0b78bd8c4fb1192f8798e7385839a0bc8d29f69a983d33b295f6a363b5f09b8d56f7dac4673adafca88cd705c8cd55dcbe0327c106cbb96dfe4e69b7c4a3c42d0b50af0bc505adbada5216f711cbaf149be93623f3f27a6b93c2ce54fc10d32da0e9a6acd9bff5fc959f2366b3b310e69f52ce3dd04feb1e0eea2dc5bcb64cf1a0495e3225b8383452ba98ff3f122fd530c64c692c12a007c82b24749702962b91e64246398d08f49a4ac40b1477507308ba2d5088092dbb481c3f0c0b84433dee56df2375acdcbff4a64114c44127228fb50d6e4481e89b0723c9d69ac9d8ab2df191846aa627f8da839cc6df1e28662e3d592d122b65499dd8717ec531daf5d96d05c398f77f21b439437bb54cb8d07cb99d175144282974a0b26f0b6aae90692fb88b812f46dd2a5db1cdf78b6cd3e3b045a7829aa5cd14230911ddb2d82d55900626a3ac138d955784180628c8f30bc7ef78366d62a704c5e221ccc8fc0f37549b3f80fc79b59dbd16e471c331b04d56f6e3ed5af349bf1fd9f9591b6ec886e3c420999ecde7ac0506ddbad95b9e30f3f88507d1bc17bb875d12f308c4dbbca43d946e11948638b5b05e61d99b1f5f1560d6266031b38292f8093b3f82db513c53e57ee37223dc45cfd0d74264a61031cc51b995088f9cc91746921e1d29ed02a3ae3c82cb42ff3ba1efabb26ce50cdfa78241de851e62a0474588331859d8ad9959278e24662a1dd3055fa8083e9d856ed24fab5be28caf14a08e0cf8edac83c170e053f20fe552dfbc5371cb255ab99edc4399e16e734bebc2240a3357e12ba88fc772d8a2a981246f37ce2a2bbce2c40ace18aa34af1d5934eac95c2b1f0bbaf07d793cb0ef1f4db87d0ba9d44ca75ae83fa63ab7a889c96332a8d7c9aeba755d52c582cd3e83b80283c8ce91826defff18d10779f817d8f7ac573ad628ae7420e7e66f5a1054ffe7ec640cf5e6acefaa0a0794fe065de44ca822f9b3056e13e5bd5a46e9fd1981c3279be973f1fad68353e867a65bb297fcc6ba98e2dd6fe11643afadef6d37fa4ec5aee89e2cce2115b6c1f42570bc5062887cad08192a682d0b4508fcd936a5c5373b8ed70f9d7bdb8342ceddede1aa185de78a85312425b474c8ec74d9ac20e10cb050a102ef334f49d95c421ba901a8b799c5dcbdf386273099dcf9e6ff080cb6abb29ebf49e3db8af420f492a8f38e35f1f381380f260f9f363efe79b5a7b2b59c49228d240a2ac731b167db37fc23598e781507dd61c8412c96e51a46ac6d89f068df051412977f00920e6dfc881282dde80ad5f4e60ba6fb7960314872b7b446b626bf70a9bc12ff277ab35d23d6525eb7c50acc1f2431116ad25721870bc51da58c04f01bf3436c061f63d06bd9488f5bf61ef979bc800ccfce147875e42cd3ab818de8f5f760f5927ec80cacb5c5fe68f09ad3723f145c3cb5d1a3bbdb6c075ca9a2e1c412fc2a711b785872d65b1a5356f700b5265e7e162c1739c55bf3272d66fc6112e085590667fd4a6ac58861af9bdbf7af0cdee100836da12ed062c1924be2ed4eea8d2fe706bf68d10dde62d221823ecc4d0633706e4d8054f32b552fcb0efcf49b940d875a472a6219bdac6faaa23c997174d3ea4f2f4dd41ecd605a56d906907e0a806be52d058a73b69cdc79b477a3149b40c2a88b7028cdc961a681c9909efc7116f939b990a69649c2ad21317655a0fa08be0d0a8ddf8a9fd798de59219cb1683fd3baa542630bf7ac563391cf3da111aa20eef4fd44cfc130b5cf104006175079700a58913c4f40b86c135dd8c78f62939fb103450527ce1b61c687726798aa32528b5c139edaa57563630e299fd67d639f059e0bad0d26e63177271f3dd006190fc0182007389671b0852b480320b288835f2da788fa5c2fb93357ccf547d49bec4b257d01d3b42bf80c2daabdc8b270f1204aaf4579ee664d9dc1f22a5a96298c8efc511b465f028e6a9dc80c68edbb6cfb7d994ef65e188318de354992eb4064fe1562b01b27a40822e4369b7bd4d66b332eec221a1bb4de2704ecdf8b147f1a3af9186c9c7e7ed9b7a96cd76c08405079e71e5b3fa7d9d36afeaf58add243f0a82fe8ad74f3f197bb45d14cc3e887c1322ea646e1a2e5f736f3f35165752dacd8226a0f2f08aab680521a581df62b41fe7e2a91aa6d67be2dbd3f366cad9a834d6902ee152d18bab9568ea5d4c19947315e11b7f497dd8cb18319840dcc29386a7c49e6d1e1ca18c8bbd4a282db50357d36d2264a92c607651de8d6d3514820d1c4b565efc71d5520fa52da9293feb12491026936eebfa2aac6339b57ed75c0f5eacc07c93da0f474baafba9e9be33eda0518fd241c08e31514903df5f130bd5946f428e8c5e37b164531df0153ac33000b8c6eacab505d1691855b57fd176a7e71d465e8e0535d98528f94654bb832390ce31a3b0d145531c5696fd871985cc7f3d33b242d8f107d4b2f8734e4a5b0d791a39c49b1c37ff918d2d801ef1208e8357715350de53837978823eacee3338e2254617359fc31cf1448406ed632f331cf468095f2044949d03007016b0f3eaf475c1622361d2f4630402579c769a04719b809b17a4aa8368d9d8d13396836cd794106e106a4acd10540f3ad2324949abd421d322746f9901847429acabcb06b20a9d03a2c315f020bc137837a0254af127b3772598791b918c3a4028f4b3ffad5dcfe8817319a5bac476d974c7144e6c1d9e50cb16b2543f7794de507b24a1f2170de75682403306f5a12531b0ff9f433d4a26b9f8008b34cfe9cacc470432a6bfc1c6c9f970e42dd6fa241561cf839f0f1fc19a464d07971ba1cd43603dfbf4de524e81df93fe57f0ea9ec9e46a43a81c86e81406801191e424af5ecfb54402fb2847273c90caabc9da5af541ba2785ebe565cf4281f14ab1d938c49b5655f89eab7962194f9052eb3021407ea6765f05a5fe740138efe90a2a2f1dcc0675ff5043acdb7db89874de56bb52a5157a5df02f7cab4c8d5397777e5e136bafed3f9758a73a70b3293728b2f0d4bdf179a836eaa61b2a68647b813e8b4c7e3806dffe523326fa288cc653ae886ecf21bc675e3d466da3b16bbeafd07f70108905070a99184724ff0a47e7b04ac7e28d8bc3f1922249bf50b0878a9d0228268a35e145951e46f520e9e36a22ff88fe1d2ee476500455872d7bff990ddc1cca23dd9236ae0ccb767371c1666b6f582bb9ecf175deb23c0230144d6489d4f3033c4445654dac7dade1ec0a62f362e072490e1377a6f4a43842c29b7377b355dabdb3205bd8c405a450a0e5e722a0c8dab5dc71030f94363249cf0e4f4041ec558e724b9fb91d0a63a9d67b7c60f0b76ce59e34a1815899f72e81d07f4d465d7f97c9efb9567f35f0d5d6f3a9151c552fc19c83d9640a758fda21098b058a535dc100343219b22e55bbe876f6a9ea4b2b321e87342170740334f6e0fccfd474f9f25e4191697d9c9a42542cec842341681e6b67391e533c5a234a7e5815ee685a132c3f5eada928c554613c120e8fdeef6fcc4c71c47a759c91630b2a3e9ed8880db355224ffe79e0d859cff0b0f5cbc70b895e627bafc8d2658aaef7b2ad6c8cc638ac63b64438f2b5820c0fd01eb0f8dceac496acb8dc0387078f49d8e3cb6d28066bac4a430c04d5251cf6d8d3338bc836a795bd5e5b37de22d7a71a079e331a64bb8273c39e1d1f89262d2edaff87b9b72ee51869ea765423ae9adfe38ce68399c46f998b95457bf8533d3cfbbaf496b3821023a133c9d0513ba9903d3e8f4deeadfa24649a84d1b8cbad68000dda4773ca9e48cede373bf6a75c93de5b365fab9fac7c1655e30912b5051caf9f42b33f2f15eeb793c97b58193b518e8ce1a118c10b09696d690c4e39cebfd21933c45fd9ff7c25f98679bfbacf3214799afb7c3ca134258b1fc0b4818fb92f22b6611aefe35ce0b8761d75b29f9f3ac968552137f66311560b0e8cb2d0718f63d272b99a4af5b079a150c12833fec62554974ddb90fff67737de1df71a51b9838fe08401bbaf5de410f8ea4414b8813464a94950f9719c95ab19b076f3c0772bf591c34dbef2aea0cafe3930c936339fa2735dbdb920cb596ea58d57e6268f030d6ebea5db266c56d74bf611dadfa40d16ded04a56734b6a876cfcc378eccab2de5fbd329bb35fad40c66912d01a9b27c7d0ec215ad4e372015545e23378f0e1704d071b85024f4e0c56d9583251e295bd32f7674daa5d16e147afdb9e33c937cc1ee589227904e043e5900e88eb3ffe00ed3a47b55c7f00312c83d741851c5df9bc9fa4f881450cee5ad45a5b507b0a99e7fde71c5412d8f9eb0afda5d7b3faff0d7d939183dc7a139cee6431e75e628f0a886f09f9dd453f6c8976518f54b7e7fbc67f75e58fd1bd952655951aafaeea3d220805b3aaf00d974b69cd17c83cb86dc48f2a1127b9f12cc3550c503895b26714da97ea3f816a5497ffa2d5d7307a4abdec3a6d6cdcb9490f8b20f2bfc0f072a70c4706659f5f8bb45f5733483c367cfabd2d6325df1cd4502058660dd7ac4520c69d6fe4f2f224ebb37497e507f3eac32b89591c6d23b6cf3c3c15ea81ecc8ca32228e84232d078420826b743ab97c605ed8b9172cd4d5d40555671d66bae3ec755dc90dda181cc7d00816be7c901a187da1eadfc4391aa6a62ac5702f1d7ecdbad68946beba4cfbeb8e008b7681ac34b16d543cde5a6d8f454495a9841e81b6271637f8781b7d6a989c91a3cf931afc21c35ff5223db7d50b2940910cc3d4efe4a439ebb043985a00bb31cd30cf4cb8f62b73d437ecdec11f632ff0701660c01a08f9e70d3b86144b7248d3413b2bb0572df89fc66fcc9ba97ac98e581f0b71f1cbddb4370a2de0a04a3e7ba9e29d2c6d52561f76cc67abd3f475326ae5be4990744f19d7b8770527ca7b8e11c98b735f21f51cf00d9938c35b9da651706291208bb6e0954e4bcd0a7a67d320fadece56233e5edb3a498ca136a8b0b3c8dd92c8997acf18d3907e6ee26b147f7c7c857ade97ace0595fed960efe1939f61991b12502af094f30617d8bed17d5574fe0f2dc69cfa774c2a4ca6a07a88a01fcd902b7b8470fca12be5ffc57a5cb933e26e7a51d90d7925cf964d22a274ff170b1e4d70361d34d1edd3cbd0f86093930a180bf19b518bc14338cced25c2fce5c607f0e4bc3fcdf3c053b577f8236510f97e6b4c70614f9d29c6ce76411d3a1a72ffae3f9363389548084510d61fae1c251400c8e4d70517e7a29a4490ce2723b667edf738220524e94403323eafff33117b74dd550d7cc0116ee8ee9160547ff4d3288226f6a42128a978628e6ea8e4431730106d8ef7341b8e12bacf6e42adb2b3f696ec5ba6189aab0d0841e66bbe3e69baf88ad604d27a82a06fb762622b74acc07c04bb7b8993bb49c9e571981f67f58e0c397d3629b2df2a43c5c73377bf002ec7eca0a4e2b87ca6fe05cabe86544d11b1f5ef0bb8690618fd97175721066099f120b5a2b28d41bd3b1f4c5f8187d2fe804c95e5fce1a9e4e387dd1da5cf408a8e2d35058766bcf4f79e60fbaf77299cfdaa2c6565d10d269c348327848e1279058ed94dcff940d6ca1fb3035eb6b385909afcfa919bd2468e0993e52bc7790ddda20cdbfa996fdb08ffbd171daaf330df9b9225fec68bdd4f9399d73a1fc681ad233a30a5ebbc8a5acae9977ae87b37412876680bd58c43575f1f8e0ddb9dacca7efc0c4054996d360db314e4d3be014bde3441573d66211bc87f7a25af60b7dc11cc9f586898ec1144c40fea113e17860936425f82abff236c341c2fefb26b4888269a5c9c3d9f72ec76f909056df2565606db8339c025f4b6f7f48b30f51fa64e846ddb53f9efd1815660b044e01a5321208d60c7454e16351583a607bb4d6bd1708a43444065c38fecc77e441707e3171dc886bf9dcffe63375a2ed8879d0fbd858032e1b399bf84949dd1878533bc84492d53874c3413cdb7d87417bc57086f1de01890d5e42bfc08744873bd3616155d1c65b2d302fcd1119f2469fc33fc62a41a62e609ed9f4292bb41bd2187a636a4262bd6c4c52019ff1eae33b98c4244d29fa055c20e9014de035bb84490e364c8cb144793e31414cac7700966f8706204006f64b0df94df44cd04f9a8fa342c358bbd99b2f54f3dff3a186f96e11d56d2bd1ea738c9240e5178cc05c11c3ee974e89651c474481216d715bacbde9fafa9563c71ec63b42eaea72f412f8f5a48f1522ce42ad8851dac3ee68f78597db8f24c57792e27cbbc96d88d4046bc2cc74568efe568aa8cdd19c219522eea4e2f680fee01709dd134b47d8487a93b0cc0eb8d6db9f052d5bd0a110cb741f9776f65216ecf763e7b238206a39bb97490d25e4014f67479e659d7ac5f03641f8fe564216827817210158a2448d10a015f781811741f478835201ce48edb17b50e4dff70589e44e14667373702ec1d69bf3e938219890be658ac4459fab2af6268f591aebeb812f464a503bf6021660636727b1253e8144ca75ae88d411ecd902678c52d18f98e34116b8a3dcf35667f5bc01932e1a0f303d7b873fef063e4d6cd43f48be5d70918d3073522ce8cb12da5b4087411484ab43041612f674677aed3e3ca4ba3d5362b00249f2eec8bb8a99aaac34681426dc667824a7f342b0870c0d490dcd17877e34f20228287d6ff6ba130c43aa023fec2d3f79a9ed58619d52a92f2b00d3550ca16a659ee4ee2f7fc5fd295b10c6150220c1ddbeed9ec2e3467bb5a75a5905347dd13bfc2903434d43d0cc25a049f047c866188efafc1a8270e9a529e391df20528f4ce900a4f287bcf3bb4864711ae3ac97f1c21c5ab3a1585cc658a4642bf5a70c600e6fb98556b6d0bf6d6427dafd55ba32025ba0d369873ddfdda4b830de05af3f13812a44e1bbce9f3ca75477bd4939a1f5c0b6c30284f2b95fec773701f3e2b09f3bdf77515255255c35de3a4c127a07445284cb93d7e51c8782878886f90d7d5aa7c166cd04cd177616af6bd238e72b971af23244097ccffd70d26b969f966ceeccb6597e579e3e3153ad527641e6d7941ee9423fa1219c68be3e28596ee64600b2a7978bd5316236f2c23661b7e1d1e6684f41a9273b497172b506f6ed65d23b627d691d06ec4b2cfed561bb213fe233000e78ad23329fbf961e4e95a57bda44e31e175c7138c0bc7ccd19ab0868d224ec0c2f701e6d66fb316049601c9124c63d74e96f9e7e8a8e7694a759f3c469603633ae1da05666cc4c653c7ddc0d7a677966267f15247149f31153ee6abb6f90e6693cda2f5466dbee1472146d59a2cf9edb18b35f943d96fc2c6492f5b5ab5b029822cf55cf30cf1f55324e55db64a7b4bd05340334b61c98cd246c1d1ae66a94a7a926992f8a51e710c3521efd8a97c4f33629896ea484cfdcd9a56952e864a37e160483dd3d094f2d6e494f26da46d465f3bb7aa9ce75a941cc6462c579f23805b4939c3f119e5e957b5b71bd1e5deffb84125c4cfd982fe445d28edb61bc5a24cafb6bbecdb91d2e32af0b2c1c831a9d3055bac1f99568ae8b1777fd676911c39f6479c33b0192e1da6ea5da9d615f3340ad196f8a135d85e85aa59155a165ca7cf54cb4211fc797bdbfc82f689fc5a5fc4103be78ba1453a2c39f01f10e5f21a9d66efa48bac43621cbfa9347e454dbac3aff168a3397fe027cedb3045606b06e3067fe787b8fa74fbac66e00d815bd98bf96df8926ee6f50aa171155216360132bbd27780932d38fb3b1285c240f3408f94e813e3a1f8fd478a581ae187c17dfeefadc120eb5a129de452923704b26430fb2646e183445d6 +0x3fb5d3d8d7154294799650b12df25c71f508c4b0bcd4da2ad6e57babc98439a1fe21d4ef57c7c0befedca85d517fb9c5d5a705ffd90b1a5b9f1717001c8ef547 +51712 +0xf287b06cc38a839b7dcbb375f1a5bada9296b6c384fa1925f519a219b0648c3beffc054f7174e12bcdd890d106ee4ddb5fbb991c7149e8847aa89a44f8332c337714b070a70b7a49b16b1d5ccb6596fc0b88c6d7788926d56740b64305f4363030d899178bd5b7bfd18a42606992fb073b05253bc3413ae163eade5dfe2f11fac24fa88c455cfe54d440e72308fde5c299399f9277f98e7017adfadb0b6d2559d682c616fe28b8cf6392f4eece2fbdf7cd2c1a22bf3a894a2b91f2055634da151477d9ffdebf4ef9258a5109e6afe96c7fe67f35c18a9336469eae23040f98f52338ca8d0cab269ac32fe6bc7605d3ea5670b711a57414fd10dd167d4083c7c2accd8209b174aa7ae4899b4fa7bae138fad1a9fe947d74673355135b301acf44563ce8bbf4a0416031a15909a0557d2014113c46b62f1c3c540e8b04fc5b1843ca8fe3eafeb95215517e06348a5e0e684c395a30321172441e1168c1cdce0a87afce5ddff6474762ed288c168c5dfcd9494fea0330abdf47366590dacbfc0ed7aeff3de305d0870dada8d1f7cfdbae3bb45ed308da86cc0c4712ed971d6c8afd6f2c6b3c53de7ade3805bf217a608e56346bff8756299f5cf721653feca6e8bf995cce3207f8889f37473ddbb67203f1728055c7cc1cc2ffee99e21c5f338ee6d498500f4aa719165177326cab9b75d615a4bd1265e89bbdd5824b749f9ae63acae7d8194371950c2f9c881d80624ccbc6e01fae4814945e54e58890d363568220514f9a1be1644a79be26365e4ff1992d3b63e49f2813a912c980b82417488881de9bd8f97cee95d6e5f4ff6cebca08f1bd72fc8fad8267b8361d34ba3d23129397a51c06cc9cb8ee1adabfd3bd40dfbb6e323e422a4860ed34464bbc5d4fe9fe8355ad6958d4796a64c0c0ba4ebce832578cf2e027cd5c5acce346520034d56baa94d54ba8ffa2f2cc8e484a24a4e9ff7f685f902c7923a705dd6da6ad3a9d821548dad44586f92d592ca0aac961abc9eeafce7bc2b47c7be81a08ddecc90beacb5a052bb6cf47c413821004c55cf639ad4787c970e6317e7b835f224549e54cd4b39e798344535e0279df7d9efc91f7c31ad2a1bf770859c800ba9b4122f44f3939ede5354ce7a42ff7573fdea846aa380ff72b36cfcab4d77a607067bc009c01d63998534ec93ea1e5be720ccadbfa150d3d915d563f36aed79aca3f7fd1da3471ccba65b4c2d3602c5d3db1c9199161feeef8bc752e885701b0d152d42eb2dbf2ec72f3e59a0b75b27cc9540dc81424c9508adc926052dadeeaac2721e0ccfd40e2e886491990e761633e7dfeb02e6656ac6f44179e3b3d588f8447cfb0cfa245f645a5480707be2059c3b5049885308d49cf7c6aaeeb8a56e98038476364d2e86fb1d94a2b1b03d6a78082874ac1895671d10df5580bc9bf3ec984f0c43296119753a9b74e72bd6d969e6fef8c8b7a996a9d7e1e6643007dd786b2319ae2f5a8b4549df738b4f4cc6c4501a4278b0a3e7d5c574f9e3a3977fce04b74ac1bf8960fdb3d72b18ab0db719cc20ee368412df23621efca997b95f5ffd620c386a6c1f0111291819cfa82efcc399587ca274e11526266b007cfbf090adb9da7ca07129e1ea3ba6f91d9a92cfceea2dd5bc58921d9a51b192d3bdd8129e35220902371632978564511563871556a9babc022c76cf26f78ccb2cad7a58675a9f68003c7855a1acec9c6781706ff34eabaa446ee38c64ae493408195bd461909f041aefa4dda1088c455472f3321d4f5d2ad3ae8ce7dbdc7347c6a00119457dad87c2cf403d1e2eefd69cb6640e4d326ba83059b763e518a78108cfee996b88574d8869bef6719673ea80da5746fb8e43ccfaff178318c9327a4ef788c74c3708dfec3d959c23c5a4dba14d519eb0b961e3941d11b7ff94b09df9c5743570104ea95eb95880dd331f348e8dc757f55a62968c222a8501d1ae56a9a815667f8a9554607b7c56e6753f8fa92a4d0541c7b25053ace67cb826985ecf1e00dcb32c894b91d26580d7f28247719137491eb7ddab7b2bca019af9eaf0eaa5bafac37c7709538cc8913a3183f688513a85f4714102730d49b612c232c78ccd986318d10b1835d90a0a85b8b1074df8bb3e6baa88efdbffe9fcc825ec4d15f44d883be091f2a965ae4f330e960442e62de4dcba11de06422f68238b93ec26c83eec9521c8133ea129e1da99af77f7a8271bd036785782928e6aad69a64f2f97e102ccfb0a14562a1164d4f069dcecbd2b45de8628e6e15f8b86de46bfc0a111d86d4bf2c450904ed94aca8961ad92a3aee5604fbff6a307bb4f2eb93cfb1b94897e8a9fa3626dadf60623eb035479ea269cfdf98a21383972162737aa590fbe78c9016813c45ec5fc19699beb7c130f26bf1ffa33d12153549e40288464edee2adf68d291e0e405601713f2669eee7123de3ee82990eef3e72a1222579946a21423f965aa628e0aa661aba521077cbeb27ce349f7eb01798e5c05ab9070aa88c9396b97c9a3cd44539b992a87703e46370da5760b4a0972dea6a32acb9579f0ce8217ff7c3f1220dc1784d92653b3b63622ee12f028577e3c8c733665524588788086f34e9f0d4ec487d7576a1c6d7d443f35a733108bda4c9fee450a318d9e6bc741299d4e1f2c914f091bef44ec09c5c50489309d073573338ced06ddc2c12cc8dee8f4b6a828b6efa2ad12678ffa5f56e35f95286a0e44f9c774f791759f2007a8d7f18368e1c9ec3c717ffee9bd55675a80cd4d14d32655369369072666d9f6477cf01eb1d63ec72f0f847589c16c68c2a34575a812bbd842ceb7a955d6df37232e9cf323848a02f2edcc55d0b4f8fdb42d9a2c844b69e5846d8ff2745d942cd48334ab2e6b30124072b42a6ef68f78b78637ec49ebb52f74163e7d12798d59c411739142f8c5876054d86db504847c4543bb3f698231f88a5f6f93a0a94f408a3fb65ff1bbbed50b0ab59a336d9c6ad5fc7090539d44e33f8f8fe0af6b4e739f849971cb32908d88fab83a6aa02be6f2070489a8ab72622c4d1bfebf4e0f556c7689513febcf1362ab6cb8db3ab75311f9e375c91b4f17a90e801830a00678799c0278b045def930935fa005abc341ce5ba9ff458b4f566e5a78f7a43fd85f6f5b9172ccef54c17b58ed8a6a61e4358f92a4809e79d7c0c4a753079a4bd97c863bb2c9f636a4ee9b52b2d289fb7ea0ce358fa444459cc9447baab283729e5286b2e2d8ccca63e329172c12d4d7071612caa7d4d79ce2d2764dfc92e0329b73c967ae39a0f8f6419d2cd5c5eb9321f7e5b8a98cb8ee6e9ed2a4a523410a6542c6b071672360f07c7ffa3c563eae33e8bf85f15668987470d20640ee167860521733e8dbc480d7063a05bc5e3e86c14b28c91bac7749b8eafcf95c4de0fb312433485121f4e70e8163d5f2487bcb6ea199e885096560907fdbd463ed21013c3b938456b434f22b5085f16aaf66da807e8b6ab9e7a38b9fa1c74dd426673905fac07e761d1530a1f608de81ed80329b5485c646e1c2193ae377cc499423f11304327d1bc7163107047503d4ad787233a61191b8624197f6d745b610b0d7c7d7ca7226d44ca851ceee42f7df499007ddf5a7436af3929657dfb9b1e5f6f32be8cff8022c185c316e360b210e5c6761fec5bf61eb103572d27f5c3625f126abba874c757fa4925e695e2615fe507f1f1a98e253b542cadbfb38a5c94d19b2c5c182e8176b8bfb2754d93c5d0bc047ada5d198cf56059330369e1ed1e7eb57e89235435e6c38f72a9529a65cc316418c55224b0b59c34f0e29123fe672e066a2a120e6c0fe3606d6bee20c9bc0dcfd497ced81be1d165ec42727718d7a836f7272d86ad59e0daaca4674d7a0618efb5391a5c54e3c7942f0d5506c2d6b6ee2d68bce1802c81a6363a0648ff141a69c3937ed9e3214668c22982f884cc1ed615d6074a6df08f6c1317133ae04cdbe8068d417751051689ac804174e621a995b65756e7fd0dd3d34c21d64aa61822128710ad5d24f5fea0f5f8daa2713d1fd419d4f0e0b7eb1284e84296a1d8dfb98f4d0208b4e75bc855a67b94abac89483a44361e5e24f21727ef619d66fe086608604d9ba31f9e3a4fc5f0b9b71f6bec7041632889ca8ba9636a6531c2a1fdf225c9d7ae5356261d375d3e8fed534cd21d18455688331c8fe060389bdd4825258d8f8a89ec135b38b4734f5f76cf95c3eacfc3ef84e70f9247d9c123de7be8c6e9ba4c7395dfa5556f110a707a1bac877e70c43da46cca7a40dde810eec2ae9fe05307b676416c3a0f3e570c20c0fbe683023286114cb70f727595ac34a6df761b60a298b8c118b03d031e799045e8a89e8ef413f20f3c1886a8b03dd9aee31441ec056283e7117fa1674700f332dd94791bf22c703bc35f237f210c04632341fbfc185bfe3cbf6fe272bbe971104173bcb11419b35ab3aaf200d061de4b05c4f19ac3cd52478b48a92c607c31667c0d0f584221e2f374c29b35a6848ff0f267cacdeefea690dbd19d9e1f015cbcf62a1819648d258f6e6fc52689bc3eda53f02f9e813723a018d367cfe1bf199b169282fb62a5a6b5097818da6252138f8e28c71364c0f1feab17aec78cff9189460cf30724b18aedada73e591a8e37990dd73b377fe13732fa621b8f0909eb10ee62134492f9fcc0c2c2dcab97b8d28036c5320fbae21ec56f7f562e412550b8745a8cba95c522b4b0929dd9c3180bca73b955a5fe0acd3e713406ac1b9be80841bd0371135c2453dfdf26e985f60b012b7d4c0031a36c25674bd3127eb2da88bd522372f5072b25b77122e6c499faacc5d7be283df32503bb8a676754b34fc050e391c4240e5fb1a10f37d56a4aff54ab90532608431e5fd4ba67b384e66e396336f86f87b9e77f03830dc05e5142804470b4017cda7fc11aa37efef693607a5c15fe7c054feb1746934dae88f6ecb8f83e89c1800271b1f50c525192024c0ba5464bf2881a9502d3089fa8d08125852fc4796ffb011cb8cdbe8bb3407b5b75a49188d9f7600bc711a9aab51e39146d51c82d11d720a75d0a82d22de845b53fc3c05d39396a75ee674017dd5a67e2fac6134db2fba73a29141ecfc672a981f16999711b3880fcff3f938d286c53b6b4f76d80574fdeffa3545a2986c6efe814fde66d86dbeac883006cb59f3c45b9224a9d6e0abb0c1b5330008875cc5f112fe96df8830aef000211913749b38513cc286dc0d2277bb9c111d6969c6d4024ca94f7bb19add8cc02dccaba2fb75aeb3afaa31eb87b71ff7660a6f8028fdc4b6d664b5e50aded550dc8e1e657310e69f526082fc29f3715f9833659af1b79aca1c7338830f076c3aa3d9c65cb0ae7b78416649cfa7b1524d2e44e5facfa606fed1f75e1c25fbb3e62a3c5dc93282efa6f307f0c68f852548ae9b8b20012d9bddad6da120de204edbb6322f6b5752a5d3fde202813fc38cca8fc3bfbb34d2bbeef542ac3196298f83fe37c593bd825057b87119803700db5b4849ee2ce92a099b4022d9befc5c088768c9aad2c38651dab921803403d1a3636e9aa0e58c87e77b146aa4396f5c4c5e7c6469b917f33cb5769fe12d349a778b792272859d90e7f6f896b6316d8ecd61afa46ca7194d73708738a6cc37efca3bfe9ddd7daac98da753436a278587fe3978e63e4d45f998b451886b918c360ded45593c4e12964af4badd4a8c35cc716e7ec658ec3c8c1ec97c0b8a3daff1d51803e13977938b9277a5e0d1effcb0a95917a147244b7968485d3ead0121c79254a0c23f7a7c1e16a89ada8ac358f91881da238386214617b97b9e2e8c801bd82ba288c8c75ac229f00046ff96c8fa41813cb988822c76af955db69940296308f59f815ffeae1c5ee68ca28aeacb38b6cfc5cfd088eb8f925489f467ccac31c75aee588f80e49118047679c72fde38dae60bf2f63add05627f76e43472770c75b4258ac1eeaca507d284393ee6807f303c55bf63f87f5c928eab1269d22857a6a9bb7481a854dc80d90c6d5caf4070695b5981a4525109950aaceb828c1ea7dca436b2593e8bbc356095829adaacb0b8cb7de621c8e0a0fc6be2fc18d0e8818a2c2dd0b3219fa87831a61583f903c4d105495976ccac973b3ae3a09771145931a9e74c19f22f45cba4c492b29b1401347122581dfe2370d3e0359578cd10a355c619711810a8f8c232578671312c0a45c7cf7e81bdd3b249044f3747456c0488d92b0c181dab55ee82f56d7a4bda54975177194c8c3bc01d0f96f29d8a84d12d8ba269a46994d192ef24c4285b9d54abb6dfc4d8f9da4ed27ab373c60d09bdc63606164794f3f0620f5c06f5e0e3aef550501da1872da2ebde1b275b3d590ed560cc9e7c105736de3c01b27d6c5bb806b67e6040a4a460cb923489e7abf168fda47c6eac7c2d096a2dbc63295e43f44271c15930d2dd0d143f9617d5c9614081797c037328e40c883cf27584476b084afabf44fcb2460c385ec65dc026371a134871f94ab71ab4cae22a8618b80f5882b9cedffe936de2ca483bc81132e17a2599c4bcada74f76b4c5fb014110cf698c478666d126c3252cb47cf3438fded53b060aca1669e0d6a850ba63a7f219bfca1c5c95feccc447e20be04bf19dadbfb5e5aaae0f8f8d59480b0f49b7cc8ccfbec0e7d9e1f61fcf7cb72c4e95dccc9e48e12ae513788373066d501ffb10871decad8eaf254304307f5eb7879addc9f5466111ebacc581c855e03352ec5e972ee65ad78223343fff4c6af8638b01045940ede64e45e706adc91c1f8ef6173b770e5148ff863a11a07654858ee0f72a4ecaf01e69796d60b7d2797b20c2daf28af7296973a8d527a88fb3e5462710aa2a371030e9a1c94e5b0470dcb4bd0a4aef232baf8b1585f09bfaf17e45e7fde28037b6b43b797b2e2bd19acab75f35a2f8050081a256dcfadf3aa5d6fa8e1f91f52f6c1ecb4af36e9ebc6fbbb523dda94a2f208665e73aa506e13975d093e606dd9098e735a0d2ae184768361a9572bc6a04143422313f8d976134e15493e1dfce0dd583f715995b4ce50ca0643e855acc26440173df5c23054d20901308a36b2af99aab8c13a8049127d5a13e999612d5083874e75c0103d5077508886cab6798d6609461159f2889725bbee6112563391c8a14d911ce8e8b12bab1212a5a238c46cff512b5ef359a76e730173fa3ca5ce59157e59b35419c115a3079dc404d79ad21341d5f08ba488830cb3e9fa1c6a4f5e6b48972a5bb8c65ebfd0efcfe33d58c1ce7ed8b7c351838a0e6b8ab9fd6c5c002c12112c05ad092d88d3d06d48544560b670fc5da248e0acff931de0e7923d66df46905f5be0d2ab857908463a03abd8558008873172e71069926b16e2c439ba0c4bdc6b643969ff3e2a5e03c132d0503314c6df77b5e0dfd3d03c04f7ea99213b89bdf929a115533b4f9c4ce5c9fdf1d696fc0d7cfa1240c6b557512deda6c5f568fbb1b0fe1fcc054e88c8afb17ae3c86c73b9482ac65cc9a986a68db3a5cec1505d3a033acf942391eb2026d08f4d9100f38ae42b445a64148fab1d25e16428a9ad3d2a3b6dd31d7e8cfc530f8457b7b8442857e7d4631f5e3b07e72ba1adb1dbb1612beb41b07c7f35023c56a02bc4fe2d3ca944be9f83ef5263f3ae2cd4e44e324f10309354c6fbacddeb8e2dee4039776ee22c4935172f9c664794cbff496af7aee1f4aae7865aba33689d71cbb1d0ea650b86be4e6387e1b9edc7c6576998ca27a41ecf90410327adb96db5e8a12d4eca2c3a6511f05de803ed2d6503cb3e716263964a778160bbf2e8e5406d97b76b444b2f86a7451a7aed4db0f02bf7c6b506254463c5cdd83eabfdec5c831cd6097c724f6937eb275f1f1737aef976965ebbf31062a2aed3777ffe6c4f52b7f2ef19a88156ea68ea5f4053a9e893cf18342bd4e28e35abb92f17f54c6201f073e6c4f6ad94e846cd41f807f0e6218ab2fffcd0a230a74cf32e1ae974ddb84fc2b62562bb6c580c37cff13df3f0cc30ce86d6ef38901f19e73c31e3cb08a15d4527e3f79426624390cfd0fc9a4ebb48d392623a8cf6c69bfe2104ea3b2ae1a16500a7ba1e0a30723f0a404dcd47185a29eb47b886aac459a0a43a06ac8da3a38a0b18b5425fe721ae48e736742408ee38592e710ff340db368f7b3f04770dec1d0edfefe96fb2d944516dc2772eb58d67a4bf6e0d1b62aa26a8719e2c31470384d2a370f980b72069ec7bf6beaa47be2093a1b66a68544ddab8c22a0c037a70291f0d415cdb1e8185e3b9dc32e3e60acbef7d510c233b4cb88616ec8c34cebc72bdc569f8c8108100fcce7bb920b8f8ce80fa48dd9342302adc16ea950e6a6ec97372f0b78eb5aa430063db3ca8e810920ec1a2c3028e809780692e0dd7770e950abcdf7f773483b4b61f05a4c49cda7f617967a8b64ac4673bb8c0ded81c253e4b4d3d3ac9b594bce8ab00d7bcfddffe40cba073f89c8501d5aba6ee59823a2cfbca12cfcd6266c45caed4bfd832a675755f540c10ac49cf16e9ea27a2d0d5c6e5de6626cb618032dbd18a436063b74dc6dc8b5b46a39b38c61b946ffa2f7e76d02f42270bda6a6f2dbc294a9bba9beffceb4d47e2a900a4ace8aab0abc7bea48365adbad4f6ade41a16b9bed25cd9c1df33a3ba2be5027b91f936d1fbbf1cb6c729b0c770dcd0f86a8743864d74f92d365d949c6a8028263df53fba334021156423523625b65b12e4b9cd8a5428849acb1029d3e8a2fa0b7885ce539a71532922fa9bef3ca9d79c525162b22fa0017064f56948ea7101930a51ea847a7b3d5ac95693dafcdfcbfd7afa07e62505f816cab35ce3bb18c426ba009b351985641120e143e0af80bf9d245ac60e7f7ff1f6c5f30a8da2bdcc2d513be94ec1b852b4f040b2e79bb33be41a19a612863575771c5d7c2ce6899f0e98a9ddb7b83c8ead011ee8d80aa1c83a23e0b0da7f500b019998b9a9d0a3c73354f37e584638a0621b21ee9c4272ed070657ea4eb5f73cfc024dc9eda833cc0250c0d519b5d4113d06f1cb198c4d33b38c255e576f538fd02023b5dfb66334e553b9e8e34b3a67a4893787392f5a21a67df214dbf48c8ce6bb +0x1333d76d9642fff25a78e1df287d433bf30c61c2157870e19abec86524bc248c974a61a14546cd6edd382910b9f269a913b09f72f44534797662d3c4409e5701 +52504 +0x4b21e011a232ade7a8c92be77925e878ae0bea9723749528fe83cf89ecb9616dae6ca0e8d5754ec6c92abb21108c2f33cdc18c6887c430b72c5b193356494cddccc577bd4c2cd53188f352846edff0c2ac7869cb74bb16a77c0f0f194a7a9477ae15abb890bd0bcfeb0c39381a87f1d05319c7e971c10e9ef687f96450b400e25b4285032892b849fd5db8649cedfb03c88defea063ee144a1ab1f3bf05f59c7db364dc39c11a446c3ce16307d78d50315ba29f5bb9a57438564c8c7b3e367cd37d74b2375a4966f47489dc5448f4979428abd32193d3840aa983d3020a9f29d760fc7493ab2576c90b1934b799c1d0d55e4f2caa78f4ce61930c79dc017c2dea0c5085d73a3b0e4a6f341e9a5061a6658af11e5edf95bdad915ac3619969e39bee15788a8de667f92f4efc84f35082d52d562aa74e12cc7f22d3425b58f5056d74afcf162cd44e65b9ee510ff91af094c3d2d42c3b088536d62a98f1c689edcf3ea3fc228d711c109d76ae83d82d6a34dcfbad563cf3726519b519fd48b51741aa86720836494b7a589c778927047a25d73508adaa401e9a6c0767a675e31c5556cbe35fadc9671359b45e985c3c8af84113989b299ae4474b85e4b5d4b0578ab1e8a2915a8df97c4f52a639fe32272cb91bbfb721505dec46d51383cb8973425a714245c2e37d0577fbe0d66381d9239db1f08a380cf609dc699698e0fada2caeda44d58d766c4f8214b10642b80b8d7d8add7cc41d47108ab7d07dab71069a2d982cc900b331caec317942122158bac6eac9175c2dcba0c04443aa9188832b553f5ca8c336880824d6bc02486a2b4c086665d276aafe3b1b93729829adca50c44466fd5b5cb977aa78fbcf5c0f0da1b09216468a11493ffb39efdeda5d669ae92bee2f2fb250aa1b9cbb11c36c7a6c6dd26cdc3cfd572ffd8c1dd72a13c27a327a34c6b6b3d80fc6c67c72152eec0c8ecbdc1bd5cb829b811e7f29af6d786f4e93dd4c96fdda295a6aa258d7b2fcf291c2d68e0b1866032475964ec0c6f2fa8c2d6a3936ecb187350def4e818507bf157c0e9b33406be7660605af14cccc9c799b4e051d0d0899e53495bb8931a6e2984bc6dbe4e02ec8b4642fc2f1cb5fd5a5520b48cfcb49e1f9533838753554dd98b6a1b8a67409279df477330e5f37367e06247ca5c3ffefd00e693dcc0c9c30754121c9ee88a574915b9e77c104fd2f921c2c096573951407ba9b440423d76bdc6fc978237a6e302cede7f99038ec31500884775556941f1edc30e3a417b0e02cb6fb5bfbe5cdfacf4006411287bedc565fb06f1be987416407dc852254934df4ab59edce476f3506e65be6ce6ddf91038642291fb8e92ba5b1f0b105670905a2c14796110bac6f52455b430a47b8eff610bc6dd721344e226f1fefd3db8c97e57d56ed7acf201a3fe1a6ee7cc1e5598c938185e8cef3298893acaa040e88750b43fa7c51fe44b62e4fb1518c58ef5e55633409bb1e903e36c449681c8ca74da2b9c49b3d1594d3bbe3fd14cf79317eef143671d4acb5fccb7558b293e243623a5327f292a18af35742fc90acaf563ba83b2b56abd5bf05952b6d11f08bf7533084b6fb092eb1859ee1326daa67b8051f2c6510c74625b9425af8feb9063da133e2d41cf719830ae15330f44f3ef17bb28c8648bd5a74b851987ed163cd70cca2d201e0f2fe8a03ccfd6add11917cf000bff156d4af466331488142776e5b460bf6e2ef734a3100b0545280880bb512985b58d3c3a0f54a6fff82ca6a5537adeda5d980fe8912724a0c9a77290a5453e7d30f37f0dc1bee6c3205c1c30ea054b683785dfb4798e8e86a85295b29c5145daba70bf2ad24cfc4648cd108172feaf50421cf0fe25ed51a12a52fb4c67204886992c83fb0aa5ef72b8a70affb30c127ac786c92f5beb76d799cf2cc8cf584e68154e53e73172c72eb711921275d87dce0deaf2b0e43003123bf0af8c9ca2606878ffb7560e5a8c618e3331227f0af7345e71f4e8886503395ade0b0296a5856e086638b06a0647f586366e979a4989940042563e0e327b343cc1cb90840ac5620fac5d5e0d1d00d1e542d2da8e3d3ad63c87a01c403e75eb29c074a03078282cd3f8afc6bf48bdddf37ee451238f12e25a655be9e432f8466b0390996098b7b59d73b551482f8801fa132c6520e719a0a2060e0cc3b50d2d49b3a6e3dd1279e3b444f7676f7968254029327e4fec58f95c9241efa570bb880af83fe66f8d779f6295fd71fdcf66310ee67f057647d6d3cf307cf9520a0a3ff7f9e209ddb1b7d2ed8b50d5bbd8880dac759a605ea09b1844094892912c023a58df17b7f12743629e5077fd6e3dd8a262fc0bf9cf9db0ae03452c222b7eac6175d1675571972339bd0cfa4fe1a55ed678a45b3791e91c7f540bb111e9a70f9d95f8584c26a85d3d92e66235dbb92192359411816b2ae7717f835dc8915033d4017c7404d803fb5864073516232129bfe3f5b54126091a6ecbd7bbadeb2021ef028443e54f5004717d97fe5a82847e43c8eecfde8a2dbc5d822c5029c1c0e0d7de384c585236816f23bd4268c08a29082ca8e8c05f3fd525eaada6a5d9d77872ddc117c3ab5d793c9fa18baaa5dc31f4594a874f6de66eb04b7f4487fc0ef2aa49472c8f206ef4bf396c6087f8229ef196fd35f37ccb8de5efcdb238f20d556668f114257a11fbe038464a67830378e62ae9791453953dac1dbd7921837ba98e84e856eb80ed9487e656d0b20c28c8ba5e35db1abbed83ed1c7720a97701f709e3547a4bfcabca9c89c57ad15c3996577a0ae36d7c7b699035242f37954646c1cd5c08acb4f2a2076abad02a3bdde8a4c68f1a755ee6f67eb0ec2e35a6f39e9d8c288976726b26b0d15e5b2671bcc88989ed079a29d7329dd5f6a60a72af078567e18510fcbe5d8005d9a22dc57f3dee0d4b3345a4f526d6eb6b1f1ec1238a61a5af82e41a924f5d50522da800ce4fbb98d224dc98e9d9123c721fd95bf62e198fb90a59968f0530f8f185fdea5007d873a964c9cd5a53370e3430a308d1fc966d28a4d7375e86e246e031964bae6c2ee6fa7b720bf19d2eaad9d9e48f5cfabe8723d9c6c4a7da598244b9d9eb9087a338eaef411a56bee05888a304b93e327a24d32f8f06110a7ff448a630929c5e20b3a34a9cc130be346069146b4e20acb38d603098c5451d3be4117f02077dfc8e9d4d13edc927a61109a5b68116a96f4f0bf1644ac8eb1b7499caccb713d966d33f0fd39bfbe47d619c6411afd8828338e4ae520dd9aa0d145c9916b77e59a6d9e112110e1d0f4b0b61cdab5b5e52f05460c0824abe2afa0275a6e36910a4c286cb7e55aef75019f7a0090eef6ec2be8dc94f7c674014ea262c1abe379063c5c4447a28e3534dee0da13fc2d1d17af6c96582c9ce2710e568c81d2c88c83db47a952e1015f7b1d235ab984d6b4f21a0f27e82f0e53bc5f4b093d6b7c57edb999007c397acac22cd57083c3923af5fc2ef5a77791644dc1ee6d36ee6547be47bede06145103a48e85bfe520e63bbde66a84188edc809fc6cf2d10d419e8701637b682fa1a969cd2a29d6035292394393057dddd26253cee4bcd5d9510b69da5821e95633e001569ca9d8768f17f23952ee559fb34eeafa912d27fd9d04eb1662c7a9fe831bc98e44c44bd44c5cae66aa4b10f615f39627782b0e9faeefd35d8955f14d1ac38a1a2c60794412c83472a304f70982b91ffda39fd4e80a35ea59d6b4096e7f410ca55c66a8ef68c34e064501520181084c261972bfff3b3ff8b050ca39873afb17d5dabf21fcd6b5c2ca992b69059b48e647e28a180cc974c50a0080c9c1d45b7352b0512c94e4065965a668833e56e1b50b07d126393a3b1810ecbf0043d4c8e7c5e60610df1b1fdb8074a1e9d43d3c81178f2e33ac18febb691e6d2836c2aa3dd682c51704026610c20cbfe4eed5bf12168288858dea2474be9e7387c127683b2c8e75872c2244c0d475a8bab4a8d330aee8c9650539150cb772ba650d896caa701100a97e0122b25db746b34f3de1a287cad81b3c8c384bfba4290c41731d5149144dc5232966af06db7f19e71c4f314a2f9def596bf7f8333ca7c3866ae3fa609e442342227a7f77e83d32a3ce86a59f200029845eb9dd06401ed104f8266b5cb7cd0a0472c4ea57e66748acdaefc62da4e910e7eee7c01dba757fe2a44e6de767d0c491a3aeb84edee5a12ac8f15b9dc340eda7a2e76a1fb1941549f6c3c8a6b73597103d9eb006d79f854421f32e9685ed08ef0322a3b52e63db6077ee4443aee4cca9c6fe9b24d97c3e226b5f05c1f3d8a9e59800328738c91850ae35a96655c6aa86c8354153ec6713ed319ca9c614ea18b1e9eae13cd7b116402401beb6b2c17bcccaab6a3919454bcdf812e24cf1099c7c7e46767d13001b595fbb4cdcd0be85a655c8de7e67ff2fe94a2977fb901e7f6ee07dbaf1f59f70c2e9c91b7fb4a6123af0f464cbdf7d076aae49327dfb1207ae96f8754184765da44a95f348685f68b02397c6c887a71b77addad9773acb7d65281e6f14c96d292708859cdff3d3cf317619ca1c6965b239ce443594533329ba1f566f13ca6d1e72ad03ddeb5de891e572e2396f8da015d899ef0e79503152d6010a3fe6915c82aec1768015ae88f5f39e5ada6bf93e8d7b96442cd138ac41e059a1a53426249e02ca464b04ef9a428382ea77b6b729604a4ea95642148e3f01ac836aa58fabba9752da07602806c1bfa7f8d6f8cf47d66e48875674ebbe9261841756e2d6db1e95e09c7cd35fb4bacd94eec0da4782390f0c47f211c524822768c73093039a1123fdf371039e8c74d5d132fd0329c1cf54234ff3beaba8597ce1fbc2601cd2dc692f47af98ec753900e72e551d7dece26614092025a3325d877619d2ef2b6ac8900101ff3b525a4f755d4890cd49eab86d67db43eeb8aad871af8a29eb374a1bc0f8872794d620ff5dbbea75bd97a59990a52f22c1eff8106114b68ffa495a1d209e42ef4a83b091e08a7bce956e04cff7556c874452044e802e05cbc4688218d97a9a21065ef24d25516361fcd7efa1cbfffa3822e8b6d9f584e0a7f29caa521214f8836f71ce7b559809f79bd84e56342b41fd01b9f7fbe99eade92cedba14f4f5c2df2ec32d6297e8d7571a7c09375962a9a08aceadfa8405d55a19649aa6a7a462fbea5cf54b14c7344b20c8098c632b9ae7642ec21fed40c1c26208325052a93e9f4c45107ef4c0889955c6349d790f7c9c37e11cb24dd7d8e9afe26a5a1e8dc095fb8564435e583c0a637d73b1c495b785adf0a5fbcb538196a7f82b0b32d74ea4a024dbe27a19b666eff5af116c45b36b6c624341903b2693f2545badb70f5293e32b5ca2718a5f75a437ce0698a7d8151c3fe0cec4172ea639fee486d4be332b6ba1cecd6b339ffe274abad670448f4d669063e88d70019824fcacdfb26b5934e18e1ba98f9ddfcb233659c91da33ed9f25cb4d816cc07305a589dff789e2c76ecfa2a7f064f85a23e049529c74c4f8267abbbe685b6a838841a9e304fdf14b835eee396f8d1fb4c20bb543c95c828106d85605903b34c76494896b85fb779c464712e388caca7917263804cb09e334baef38b7bb74d5bb452ec6fe0cfadc360208cf3abea67f338dc05009f4056d6fbcffc2492ca0b3db8460d10f0c84a5a5511461a383b8a460b05a7bc7d6c797be77ba913e763755a4aceb461307114a66ae0a78b27a79e07d096549c305c8e89d8580140c2ab141a3492e84ae7f395106935b72fc0552aa050361188ff391d68960e0c936aca6fe63d39b1b35f7555fe18b77fec4b6eb678538ee868312bae7fe946d2f529e70f242c6c1784de20dbd9410f06ab0f19caf7a146e0240f59ca3899a85c4c452a7a3ecad223a5ad1baf0aaae55455557fef85010501a4e1ecf8fa6ddbb18207bc3a9adf14dcfe148f59f71ce072d065c7ac8a3c7354d1ef0bc12e2e88d97db7c5d7a233d94b785aa4610a5ea86706871a8a6e1a39e09180dfac3aa456dd279d6cd7bc8dca76f9c98150aa3ae63bdd03a0109963ffaecddd90418797eec46601dac452b68e676aa74fae3e7642f73f2080c674df6cc46e4f45087dcff796242a3725cb77ce26b43d350130db63a21327e3346556292c5a1c268a84131a5b4861aa838f9632b9bdd35cd3e731f2444160f0e3d58fdeee7b8c5c4e052dff1cbaee5b6506db612a6fb1ecabcb4096e6b013d05a2d533210b7e90fdc66e34de16219735398100481b11e0c1244cff88e4a88aa21d36acd9cf87966bd11feacb0282a1ad5adfbc2c46a64e48fbaa8bf47f607a7c1319c589925868a786c46c693f4687774ad6644fd84c99daa959194169cd7efc1adb17b102656a395e1824091ae1cb3b700173233e6965feb3d531f052541a9a9b170dd08e331d89dd77cc5b23e8ef5270ed6336f781251db1bb6071b778dfe02a4a2278943615117b6fafbff8c06664a3f6defb822879c019581f5607b031552ee0f009c312d378be5c58a7f80cc2eabfca20f16cc3b67e5147e90dd19ea1724f77f114792dcb281cea51b3b032774cfab3f3b915e77db10017381993a8c2bfd26ba02944fb7e982d8615639fb616040b60a1a32c0832009c2296f9cc42f7a67e5877a8b500605156bc3e28352c01c8583cc5500dba75d58c16803efa11c2be99cb021337d112dc3ef916821ee8dcd267c4c9303952bbb8664f7e599b79b670cb1fba094be1f8a13cc948f19b90f9eab07547d44d756611a15a0bca2f0f356568d319fb6fc79448d6b9400759990b59d8eaabbca8a72779c3b293013326e1f51981ac5a21d6882b93259623d78563a847817f49e94c527953d5bebf36752eb853a7dbb5f0b326c208aaa5e773daa56e62d63d0c6df98978c85fe924a76e8e179dc2329f5ac1f2b49dc509c2dd0d4304d1556f94c5132ef097adad02147782ab5e4d5b56dea79e7bc8e14c366191cf24098b81437d4dd589484b64a7fc24aedc1bc590aceac86c7020abc7b2bffcac1481e50cc904fdffab60b5cab6ccfa55326ca77ce20d990f4a2b6106e836d25c8ec0fe7c65ea981fcf6779299f056d3846b78f9aa6b5bdd9624fcda427648762cb4d345ada9cc0b86dd3121bc143f1aa7182da545b819b5d41143e09f0c79051828d232277a9fc5c2f29fd1bedf72c3e4b55045480efb62d6f0f2eb2e4ee81ab2d17476dcd80af6d6bd2a69445ad71564cb4b9f5a76e92bc54973c396437dfd223622d876cbf5e8eac63ab3f98b575a4fe1857c24f7cb57c9a52d3080f321f591df42229a5b48e127963875827cd8d8cd8066a34d99892f098a88fa9467ba4c27553e1af291eb2ab4b48a788a3543d9042f56de7e640cfbae83ece879a631480b1f7c892674c70bbaa89a84b7bc81a31f76bdf35f613a03df15c1c4d8b86f3266c56636de0cc2cb61fbcf61b11b797e44dd03ab9797fc8ec5ca6f5458a65b525fd062ebc162c5b4d03490d6215a12b49ced90cecf0f3be587295e61a277dcef1fc7da6e777db90c30db47acaf7f368c4e2dcd24aecfdd514fbaf7b25d33dc52cd323588a966841ca8785bab0294cc4d82262074dde1cb184206a01132e342c4929adb01ff23102c6194349bc3a0bb40625ef288034cee828a94c244c98ef68b968534a120be438483b63a4499acedad135fac26c9192dd94fecc614c93cdfef007ea830b53e076b3567d56e2dbf49dcc0b1b417d74f6f63b8971249dbf5e73af80a9f7565ac432b9f2e6de027e1b7148fda7423d4f69e6aee1c10aba6c2f5b2a8b38139d90fdf0aea936a632e1a1f9ea86452116917a13419032701d3aaf2a13600b644b86fc2513e1e34bfea7369c234d7b8ab3db960095fd5be1509b6c44dca79a65eabd5d647c25833bc04f37ec85bb90db7f9e4c333eb193fadf1ed54ff8da7b94f5a4702369fc8cf2124a344f84494b9fe44a0b2f9e357119232578afea61158de6cd02e64fcf771b8f189a49a18ef2448c7f615a270189c8c75fc4e943e40e9d58a75421a026b7f4714af86f5fe53b65d29edd477b9e2486362e589077dbad6fa5b4027a0d9ae6397341dd3521f47d704138ed7c0e7407ddea01921a08a0985168838c33ea8488370fada71f9a353ef072de006c521b7a3c6d8a000a78eb460f0b865ff3c97bf499a0eee4a32b1ff662c1eeb4acd90d122e3b1830c64b044cd5294d0c4e1d09d1cdc1761454571d4a43c8fb789215b1562fdd4c92f1e19403602c380f877786963ffbe3b49790c5911fe274dad0aac0bccdce87a501ff03002c9ee7d8444baac88ccaa854018aa17153c8fb49ccea83cc647969f57ad5e9d996fbdd05191bcedf20883471168729419bc6ef440b5792fb908863e2b118b0e63bcd78046a5a6b4097ef387a4b28d5a83476d167f09476c0ee55f62b6939e0bc878e5954acaa18a35f5a04fe13d23f1bda534204310397c2ba7ca10df7ac01c306a8e184746d5f5de3432a6b0535bdf2d9e6a1d731478e67a166e528e1018ca035b7b102462697f6c045295f93a5dae3dfab712f75b2b3261f9f42fab9bcf9ca9135485c96685b0472da822a43b52e55480c509b72d7be94a1903b01f640c1b8a5ac0801e9a530fd777db58999e620dd9f939099ad490929c3f44dbd0b3f8cd0ef867070a45f82485aa943cc0abb4ad362ebe1b8a9791b5bf315ebaa7d0bb3c9eb4f22578b19f77b78d7ad801aa714dd2e4fa466fbda7db1bb8fa558c027cf0a05709df4d246e91d6e9363345e2c07615e695922f8ff98b189bc0b2689263707ea9533f72e78df94b866f55729ccaae67fb3807b355b04d1ea457db21c899449e72794ccf4225377d2cce477220b68030ea8baee357f3a9959968d8a1ec46f46a7a220e4c7c5ed4d3a3fa102bb6ad71d87c358ea7dceb28e5439aafce4691084889f78ed2df5f57b7b29cb887a6d70bc779dfafe82ebf51766a966a921ea309a266a0d347b1514890235c486d375bd566a9301a8c9398acb0d60411d4bba47fdfdac4e5953b5b30c5bce1c7c4b262571bd3d1d67d549ec2fc4e8aaa7c66bbf067ad0bcda2c5a695c046d43d765f131a4fc169eba1b8f81ac09bd33f716710e6a2a71f9258975a02e888dcb26a8697a56b39a162e209cf3d658585d79d06cce8f88fa53c9df89efca54ca22f886f1580d5042142278d4ab154d4497be78b177fd12f48d45b329a0d5f58cebbb862b634f7ea9093578e9200f450c632373d +0x4bccd0e158f345b34d583f929c0a74d2b502d3a8f4112aeb8a3e0e253a817c52caa947a62a4bf857d1e37b3fc9a5dead09fc2266319733ca2371051a4e358e0e +53296 +0xefd8212e7ba7985699cbf81402e3f0aef704d3758db890f04946e436ec34ce9c900b4490f45a24c515fd6d91fe9faf93e07ec098656eb1bf422100dc0ca50f1b4c2ed5e6d516d40855224b122b07acfd782d501279b26a0714b23a6bb0c683444aca3ef6c5e4906682c1fa603122d036e798ecaa708ba30ee681f8aa829d105eb366e6896dcb4029c463e243b9f901855447fa2af302441ee117a3622a359fb3ae8b356675d3cc97428f6b826b922831e7c3e458a91e357d2cfba45b5093198964c0935784041cf925cdfde7eef72e83ca9310fc3be75e73f1b5615d9bc16429fd8d68224267199694a50038eb30f9c3223fe8e05065a84a55ce4430b3c66adba07a1c905903a9b8b8a0dc3e094373391a50d2cb91a1f94882cdb49b41aa11e6751017696ee0b5a5b945f9c1f13a832cd74d3884a5a23bb7a03a1968ed754394a5d6c2752c0726a6be1dbf894a1c10e684be81d4367054ddd69eda5d5e30e72b5855837b387fe203efaf975dbdf204ad472b1583e9142e034d8061433de3e5f4b513c3453d50d3047583e706f2c346ca481d5c596895af702d6815e131942537e59aeb99e183e0f17821184d9097be85b01cbe1e5bfbc16e9dde5e01e34d8e3c10726140cc1ff0111f1293f840775425a7aea399694f4b43c56ba469fa150a4a5c218f02a72cedad93ddbfcfa969f0f4545d73933b983438ce964fe21ff581aaf431dba61ab3be0dfc0a039c74787a38e0b096d479de6695e0e8c734faf3d9a5fe2aaff6ccba4b798121c92548a9da3a732f7424ca29c8a222e87527321afb81a39272b8664c7c394aab7833ce06f8423363754bd68242a7bd1ebf83706fcf860af38cb58f6e39948030778ead96bc974bd3021046f0bcebd9120e0f5bfc3dfe5cd465b5f02a6ad44b3630fe8e610f83e108813cc27c1eb79c4dcb949cc82e2fc0be65803187f73fd2470a4b1970d74c1e885c97f12d505331565cdadadb88625f38f4ddf98ec81e3eea6d3cf5cafe3b29ddf9e97c0b3b07beb52ba9be3e35e060ca7a95f045c5b8b6a8c19bcb776a982b8ec2fa0a1ec51b6cf39ec9f0f81beeecfc5f70bfb6d75763076f2e428005ab4b241d92446fd7d662971f01171124d72b570b360ee9e4416d91ddbe03ecb5bbb2267478d2055a81c929151bdb9237e14462e6af84e4d5bffbce7412b5c36412871c2e755be83464c831e8dde6823b5660a559a3cab1931935459cf4010ef9f6f38fb35187214fc78838ff10dde91a7ca6a9cad988580597447ebe2a8fd45cb01e066bd400b791f230c5c47c6bcfbb9c3ff5a21a65df12815001407d061d75882f09bec56bb2e42ce9619ee8363d06fd52124a2e0950a41e80578cb50ff12cc54e2014ee731b2fbfdb93f51de63ae3e9088628dd1db2a2b7fd07089a515969b1a5d4d515bef95af12de332e424cf3aa689dba6ef490ef394ef991ef3755c149259ac6903f4544c0b08d9bb039803f37dfc982b2b346b81fd7d95358a220315b195313880be34ef5493fef942e9def6b689461e5a87d1333acf84b425015554567fe9ab54c4a22a16f7d9546bbf682b995a6ce944e949f1920eee058db95ab9c93f5e2846ada5e5975bf33544c4aa7b6e9492f3b103d9a34f62598f8af31a2d51fe18181f21460821e8d202979eabcc7c6241a4697d8c31b7f24fbae4579e9637e49ee4a7ca8c7cfac500252af573080ceaff6433fe678413e757ee628ceddec41877f2a64d7f276a1c0504c5720b156654579bd92e7482aa68fa93cd3b0feb3dc32eace45527f2bb12670932bc7addd2c9ceb121b6ba14c69ebe11ed0b0da7ed0c487928888dc533d1b09a387cc8469871ee0ed43e4123adb12ed18aa5eef81b1c4fc03c8eb8891c8167219e5afe3aff733e1bba6d1295a8c8cf396cb0bac80e1acbebe610b024bc4915052dfd23a050f7463e9aec3454ff0b2bb25ad579fe0f2f4261efb67e805c5241aead0e3f5fd4278fe03d62af46faa3c9a51ebc348266833e8a1f27298443c47384e6345b61d029a06a6c788c55e1b831787e0cf33c5b3d46ce3d0cb917bbc634ef9f187d8d8f250142edd6d268fb71ec95436ebc143686e395130c37230a800a57a262b0cb58443bd28823896691f78162358999f23e859b4767d0aa8f791b8024b5b9f90372add5810708b939eb7278491b0691bebc63f94c02ff1a4350bf1bbea1c5621d268a57b6302c6bc851095ab0be8cac60f847820cac428f26d793658d2d2ff202bc004adbcd38a7fb0be4ad01e7c4f3c03a5ac0f02c41122256c0e5fa239fb1987c393557a4d373ba602cfca35c556dc6cac33a5e4ca3aa1e146d236b49bca8c8ad5da0927ea6d9ed9a09ccfee6e9235befab78bfd21160035ac3a849692fde7b999313f42258e07cffa2a77a4c251b65f33a037c87323bb770eafbfd499f5b97860417e55a92904fd820147f58b35fcd1c9762fb33af43239e09a4edb2b52805bdd833cdecfcf24f6caa9c75d03bf77cb3eb1da69e2f802f2c492c836b194cae8636f014a13d0d620569c5c47d64e959ff5dbde48f5bfbc461d11a263e72cf792846d52241feea71e9851ad427d73f4b4a16c91cd0dbbbc886caf63df169ba4ded326a5f94e68f656125200e953c013cda3ec9b82756c825e35b49324da514141b1f3734619e0624b57161d8913a3513f9fc451f5d742bc1c0ad996c1acfe5b5fb37c50772cd57982d92649be179e5b8ed78c6b93adeeb8665e77153208e3618d5a29b418d1c88a711b0b1c04ea21812fedbd3ee853c105a1932564f268b0e25f188414b7b33a33ba8f2d1ada05dd70b764df5260835a32726b6d2c8f66d75c49610408b04b9af3b3b814bcc9f51298a9bf5b3c98972aad4d29a6c2656dd73dd0e621f6bef57b58f1285a78413271678b7fc953fd19b30496607add10f8311589fa7665206b4bc1f75256e3cc386a6bb108923f0a8573a6e29241b32e906561d92079ea80f79ccd3ac89275e7817e23ceec5e645d54ed22b651a40afab0f4b142fa94ed4d34ded93feda5a51fa82d1e39bd865a42229ff686010a4b11f45f626bdb6fe401ad92847b5408f7d116e7b995ee928765590ca0d642fcda10b51613986553653acc484d717e24f4a8583e9447e20b824372a3902b79e45e538da9436d0af7f7550b70a2b6de921201d6a22cd44a69c1490a0572fa18694e76e899506e4ec600ed05ac12bfe7c8e67a2cb2e1df8a35cb02899297c6c0f400d74066e8f0a336286f254b1c014c41d87dd4d161be23e815fc6beb9d25e60d3c114f827bb89ac0b467f4ee2d0f5e956e89399e1ae49a0928834b70e17c1a2d56a1407c671ab80e6b43eef5d44ea12c1f28f5797c077f11795382b3035dbfccc6f3ddc5599b6d77839f9e029053b67e70e982e4138b25899ed9bc32812f597423a571fdb1af3d84b3e76c84efa30114fa275c6e6fd43fd9ff82426fd98569bbe322a7861deaaace6297e50d50a11388118efc88ef97209b11e9dfcb7ad482fc9bf7d8deecc237ad163d920c51f250306d6cedc411386a457c7ccef5f3b117bea491a098acca56b95554fdf2620b59b6546daa90833c9f51a5b7ba5fb29faa8a938c7923dc679a7b966a83500f4092826cedad8ea418125814270c6965f4bde8ef54dd010a2e855c5fdabcc5c8569d1d2d89810f026f75b15e474fb35c54c4422e6746d0a48389e4184224941ba1dbef0cbdafa21c873c05caa4eece2434503ec74030e34a1b1a9b662d357b87b6c18080f693e85103c7ce0fac840a4c17d427407c45d94939d9facff869cc8b0a007a20c0d8324e69cb6293da89f84273d2a43087d02350742a7a9c305c07941ffb2472a8d710733d997bddcb7b3885dcde3e0ddf7a51ce6eaea3716176cd317d2427ed1b3b135dd3c46263dbd21ba4b7594d3f0faed5316db8fdd608348df1860ded06945ebb6ce0debecca829422da7d66a5a84e82e1815dbf240912fba42df3afc45a0cc693ec94b095eacdb2c7f02c80dd6cba0dce0dbaa292798c2e2a3fd1dde20cd0ebd32119bbab046723b176cb0a03a6073622a4385fb118b9887a34438fb2e759027e54e334b6821990e855a22ea0bdfda4e62d211f094f60b29bf691edbd546eb29d6d3b443ccba9a17573f9123b1964002290bb0920844b53956b03208ab9d9a336536913c747dffd5fba18de5c2204f1dcb54f4680204014717de150a17f607e54f0b5c8de5e854dae1146bb8b40a5201e8424fdb18c089d361372a48b0fccebfc2b668b0a7861386a5fcdd151db0e34efe58457392f6b95ec14ff45cfcfe49138ecc686d1fd3d679c8ef347355b08d658c0b57ca27030a49c6ad05bf52972190f1b1bdebe55df814c850145c0285bae5ffd009374b921734dfc2d0d86843c2a8aa1aebe56e80f2f802c3ef578aacf630f84adc4357104aa07b25e8309480c6daf64c74c231f9719426bf47de7492b9e6d3d04396fffa2f1d274aae606dca88a884daeb0ac603ee6992a6905956e390683104d17a9cdc3eeb72a5b5e05aad8281d44aa137914cb3f8e51e7b6097fbf4458e6cf896c422e4cbdbcb7128f1966ef7432049d13a407cb27c8b4b7cbe686fff4a5d3b53fc6adb1ed12072b2b91188997fd05750176ba336e771831630956e06037a1c3aac106c64d1592d0627ab89b8e8ff2c4cbf4ab1e6b475d4c5a52f78fa38281dc359b0232e8aba22abb3d0cd05fce16b1fa85a435251ec92f362830b3c570bb2869bd699dc3bd7d61be40ddcd14a4b86515906b20a4e6a60382f2caf4cfe896cecd8d03b1e8346c9cf3ecf23db5f81f07a47fca86f0853aefc31a8efcc8d15bf6ea7498135ef6b703e3a915c648b194c02fb9860f12e5ce1c83074170b81553ca46dbef6e2deda6bf15e00c10d7b95fb83fa66a6411eca9b24921aefba79bc36f6b28d1685eff81f811f7a0c469f7c8165bae3d2df58415d89ed09c439e4bf610e1c506a9f7168fd56058998a075317030c39c611c69458b6097cd2f0a40d33d32e1856da0319197f8969bf09b8b593a6d9afceb98d03bb75128d19abc2c9c1e0dc8b89a387f0671e1494daea840585284a781dcd52bb863d416b391cff67e960738466ab8d83c1d98a40b1d4732b35b0e7fc7bf41ba301351f7efaea63cff37b796db69b1cba6fd872d40d708e10eb6739a4b0d6f2a37486332f24bdf6ea275878ad411a3d7db84454bab666dc9aef74c7d6831cdea3265705e47e3fc19ecc20f7accfd1f7b4e645b859745d65b2880019fbbe6ee88b60d11e06d116cbd42cfa7fd2286852473f0227190ffe32410033b87c277316436a1c05fee5ea1c758d0f97871386561e0ca429624ef04a2d9d342bbf87d472b48c5f42338264bd673887c7335ad30c219452449cfadbb660a82cfa2ea53904c40ec35e0c702bb5947589973ec3f97b392135022fdb697cc06842ae304b48d35c376fe0f376e80ce28c3d9010179dab4cf975ea84b940a637279fce2c3face765508b504f5e43cb3bc4cc39111d6aa543653984015c083bac2b6ae28c4a0b48c5a1413787eee3f986665e1aaa9f057007ada9590f8c6a4406becc73b7340eff6672b71c05ef719eabba1abc416319147f19eef017100dc82f26ed0815c55c122e0b1587302894c3910829a640334c9a92f130d17fb19bcf0eabf4290ec59e8c07b384007063f56e2298b3600dd546092a7c9685b037b9628b970a5e0afb7b72d8b42c102d663caa45b1df731211b0692e034993136a11878e30563071309cce8954343ecffa107ce29dd566b5b132c385ce71830f114b48ffc00126ab2ca8a701dcc413bee719eee2a2bec1607b731e192534de0bf60fadc68d32c920b748062a94061663f500072b09c20d7a391c82d150bd2b71df03bdcce0129f399924f2ebc320cf24ec6dcfa61a08d16bb1d4f7959632f2a895d280f700c9325c99e3732cb23ac66a93074f3b1cb9959aac44864d41bcbc18e022fe30377e0af2812d91d5aa7d849eb3778ed359fce271f11436e197820f29879c4060cb59ad6417ac55cff11090261464945417fa3e574aeb103ae1ad764354e74d6d0583a5182405c600cf1c726c7e776aa89fda34b47d711a3e666476ce0dab2d412d247a786fe3ed518ec9b3d6b95817b539c549f1534f5ed670d099327b92e9c28b63b2ebc2ecd0aa753edace8caea3652ce30774942de4eb451866d7664288da6669d7d8e3c879f4cba46fbbc122179ec25bf5a608b2b2632e66652696631270085e70a99b20f015d922fa051e5b7a4a41569bef7687d22873df1f85d29e906bb76906c5b29c3bf7e7e104136c02d450f2fb82b8a8544c205cad1b5de39b09b5bcb22094f0e364803c09144f72be2e981d73316764c0263531f8e117920185355f62467e1d9e739a22c1b320fa388f0a0ae5306673736a4e39e7fa19a5780cd3e7a101eb00746e2cdf3168eeca17ff8e007a081b9d162052bda3edcde4aaa7779e96d743620e5f1ebc82bb22ac04860c495a40f0a9514e2b0554429a193c5d09ca6a52ee0b134d5801dc342265a72d6c2bac604b61cbfec0592082e70ad93771b444fa54c32c41c1f6665c57c0a7fb96ef99f1968b2d37f90132341e80273b97a44d56de52014243e349ba2984adf972dc487a38f01e02be44b0e0a643ce7364e1adeef27f3958c50facd70178602de93ce18399584766f76cc30fe71b77e7beb58b4afa137d8b30c3b839456669a1e1558e94218b4f6b8cbf924749d0ca9e8f660ff35cd774e46a47956a5f146f5d437175363850e0196586461334296ea0bd3d63708290c76a5ce36af2b54a1b67f8d6bef046709f796b0806f810f00cf53182ac49d2091d26eedf5f57b1d215c9e7cc924bb3b43692848ffb8045eb4ba6d47d1507b6091f1e09829e23b973048bf79d19cee7e14d6c99614c323be3d4b98d76c3319557755c93154cdd37f490b3128f7a014bc28b1093c722965a9f4e3943b4e14fd6bcc6e876e0940e921e624b1fecde6c451e99855809a5350be9622be08095e9e300bac8982b9c3d32b9225a05fa6c983ebc1ed3d26ffc96b487b8994b22078823ebfa06e33e8cf27f8d78e9ae024d0c9f65c303e7415042bf42f78a6ce261b3fe442eaa3d608db6e1610aff014ba850cee1301c81c6c8bf92e2c7072b07c8f3dcd5feba90dbc70fc0fe83a4e61fa6ed35f80c2687478d97972fd21770db66cf25641040c3f56188842d89e045c46f6a3a72002ae10cc65134f1bdc223a463cf41ba0f43bef783a695b4c4bc06832a4f4716b32e775d9c76d3ef33102cabe77b999fa1cc692957f35b5bde3f12a4ff25c3adce3d3182378ddbf2da0a7338195c93db6ee2acd202f63fec7c724f6f177216fff85cf7c2be1eb4c25ab7e19321f998351f8d6f3baf37a72d495ba62c9ac1a7d4da95b1675ab2c5275c205c0328da11765cd59aad843ffce8ea04ff22b097e0f41bef47b732d078e9884bcdd156886466ccc3156ea995a7e30a75439a7f7e28276473a1fb6f0034cf85421d46d28afbcd185ec8c647c10ee74fb558dc32fde7345d27a77a38ca62a2fc0d32a8c5683c73e8af9bff864c9bbb61cb2830ef9d86e4ad15427eb6b7682a94b2f63f56ab9120e2bc77608dbdb529e9c29adedee46bfffd45584d104eaf2ff63b5055aeda619bb18f4230859cc3f78f9f952d295cff4df4bdd2306f179f79c9af2730f47d13adfb30e6b895722feefa6c0367f58daa953b87996ffb9ba0cfb6176519511d111e69a54940e6c560d6d331cbd26dfed5a179ab9452db611bfb657af158ed41c2b6a2f8550fa020be77c1f4d5b6b637e637572faa2138f276c37de0b335ef718e3c4f31f06fea08b1986dbf095dfbc047207d1dc52339d41bf0a75293f87f35dd7a175604a6ec07a1037e994f0e62225e24927ccca10791704a8ad679e8c7161736a37178fdcfa4f67e9d8b8f1013e4950a3f55a6e3c9b1df98cf774d4eec9ba4399a8934bcbb6818d2729bb1ac378e539c2baf3d31a8bacfa41d3af772194ded4ba5a7202bd7d970c7a4d39d2af6a8ffa0fe9278d3cc36a8341d295f9c74b258336cd224924c816424dc3b3bd277bb03df62073f105cacd111764b6e1425544ebb9612283841e85db3c1da74ebe34ec621fd147a3281a5b403d1a80a2155bb38a9cc6f1466df94c43afcb82ebf61eab02d77c4117f62a8b8d1d6491c0d2c6d7cc6b5f2d0644e0fff8234dd52941a1629cd791ced40283d45452c358d1ed1f484dafaa2447ab5e178531252c9b3365a99c7ab26f4bcfaecc3257c74439d6dd8b6ad428859f03c9095743e1e7964dc3e68e4b4e90f3d013e9a3a6d0f28d2279f7c0636aaf50d0da6c0af5f494cef344bfeec3d6d270964ba334ca80d230428d33daf7d12011a4dab60ca1ddc299b6708c4a7edbb22694ce9f423d4761b7c97fb606ec0c8665f2725dc8e22def7b19dfe20dd6ddaeaa5e15146869a53fa839da04f0ca7d20a24c19e9ec31357a079fdb37b5564d265054a7c923ea2aba75f62497151d93ad7b1439d0d319b4f0b3bb0b13ed87bac7dd1b0f23e1493860a580d7e2e04ff08b44dd6ab919f60cf203fde80cf2e5a6f19503a39b4cd16ec0bb8c7c8eeefc0428842a24f92d70adec7ccada6981fa82320cb11db5a34d2e692c5b7ad19d8c5f23dd6ce11789f4285e82c48adff730dd07c8a5c609a10707b87c906b71788b61fba528279acc0b0cb6ba5d51d6ef1337f14d5444edb2897b4d20adb6e51c73ad2e7fee8109402fbb838807d7c4c62bf38d0f4f12f8445f0975bd15f592d5cf912ac21255d992ccb5438056754018e5c01982e8a8aff2f222f0b65b90014119ce7f10464e82308caa8517bbc2cf53db0e454cd38e8b3aed681c81012eb6faccb599ef0cb3a9b5c9ebb6c2ca38d903763e8ec1722d0088ab4977b1892a3a4f62d719b2b82da67f1ef95725e45fe3a431e15485571ca668a63780dc660af1db76b36d0fdb250f18f663f495ac9075b2b897451ce4c5e35788c2c6462a59740b72cb126b08325a0fdaac0db6858305bb54b0cedccdc15dd1ad6bc6a3488e477bd19e8838b1ce0db0564200ecf1a02a2aa0ce605954876c638ea2f0583321d2993dae5d1d5a6090c6d3c68ccd9360498d176088272b90a599c6f8d1f99cbcabdff16b0f6d748299afed99ffcccd5bfa5f42f7c4aab5757fc0d0ede9fbc7a739dca754fdcd92bc7ed80e4cd86f11eb932d9df4a478849e718526f2b6d3567a130bca1cc6922766b6dbb04fa51903a7ca5492f785f51b8421634397b714cbbdbde9c3f2e87fc529d8277e22f47f15090680cc6107c4dcbee5c7b15d793489eaa0f34fa7e1dade7e6947b26744f5b897be1ea4e1985c5ab7554efaa46bb7337952b4a77c3127e5ccd0b9077cf51180dc77aab6c9c +0x2d97d18d0b70ab231a0ecebed1a686c739914673521ed64ec6e27c1c78e2000981df932439a697743cded208f736164468a1a53cabe2b65b9a0ef10ad42f0372 +54088 +0xf60e7c7c4f4f13eba990a76daf1e6152fe6ef25fdd03dfce28921c978e65ddeefdfda90d59fbb03374415eed3b5430942d04c71712503bfae984b19f22a430c50d0db04e935a744524859a1ff04ef1415ae10ac3a9b3927401adde1e938cc80b1088bac7633308289fa5838c36d64b626d4be4ec0cf58c425a56cc9b48e54ec8edb4ee01325013e4cfe840bb76b2e6fe4d8b7d19a2ded26edbc6a39eab7769048cda758369773e829a98fa3416ab6b1de4e9fcd2d3350c006b478aaf2309c2c8d54176d56e713109eafbd880808982c719ac899f07c4e2fef41fa9571865001bb0331a80ab069381a65b03261a14d205d41e4e09a651fa725d97291df251cc0605f6890b86fd0df3b6fea2ae4e1404defd85709718a5ff638ef7328a1a96ce90bcd3eafe69204666022ddea18350bf5b7d2a1ad2c68897da6e87eb25f6fcadc1bd1265e2bb35e7e2712fdf862091ac833a55724016c16adee78f7d76ef4a12a1f0fb243ee405976fed4ecce58f9f735e1d4ea06b711a2177e05610056e4aa4393dd64c9a4c58ff165ed0cd473742bbf40e5ccddb405964ad4225ca5bd9c20c908dea087e5bf6c6deaafe0c3280422c4ef6c82116e947da89f344d6ff997bf1aec6807e7379a695d0ba20ae31d2666f73bbdbc3a6d6ac2c12dcfb5a79173dfc9cd2e0d6000e3114f2767edec995772c6b47dadc136d500251e5927f52bacfd561975239ae8260ea4ec65fc284313e0a3f801093e318fa024cf7506c11e9fb2305ff1ecf043df9c0ec930d82e90f80b2f650c411a03e74d70df87e4a3e0e878e91f18bbf8aa7c43dd2c3ce47809508cc989e3d7dd14684279cd2644061903cc00c54e232c8288b0a0a40eb39d22c9dff2e51c400ff9af39bff6b4a7703d7e25e7e126c4f472914ce9cf0ac7f663c06f3be53a1c2b1a188da40ad7816ab4b4113f0126e3f8e1028328ebd5842c42e0c51538b1cea6fc30d8d677e3546e2542084683c332925478fdeea8e39a9756877c1f2e17da1c268485b7ac8cb2f2f5a495cf178023695341179b84a95dd00540feaa53d0b0e30f803ed837280f81ac5824190ae228d654176abfedbb505ed599b7573870f5a43db04ea89649dca2bfd94dc4fc6dc581dd5851ec628e14ac5dee50965a7d1ac837a14fb958669cceb6a47d435a878bc46570777171960d40f4db34f8186992d773bfac8aec02e27e17462d14a3d3ee36731c561fa967cca530dceefd10aaf04a78780f8dcfa32029684af7d976b75f508ca848275877b541a86fe905d1c5a5b9bc76c33271cbf869000f47d231b6719b18a0f8293d4a69cea200ada2ba5e457dc618723980e1bda5952fa7cf7365a78ebd92d0a596645c74e43bc77468b9322f1bf996e36b88e2879e0892019a2973a3d1fa5c2d123a000cb57da0cb3b8b0e462476abc0a026295761469119349668630c4405102f4fe6debc42d447b1282c4b863c1b61ad5dd4bda5561f86d110e844b30c660f4c1a93635f27dc4a78353eb7a7a6703701749722c0a3a7dade4d95e16ccff96b073e784314a92373ff2698130f3254c14b2ec31f59dbc475da90d3919feb29c3df0017f6832334349460ead6238c1390c8c0fb1bc75afff8448f340dd2fa919a3223f4e61132a90cf69879799b00371628ff91a09fadb4c2ba8d398e9c8aab6ebf0e81aa4563dc7d8421f685cc3b59d1ea2f493659408d759b3f56cc52f7e1b1c41460aba6135906db91d4834d99d6446ac464456abfd481650a0e2faceedef3eff9f472a9ed99295b6c85ea85a856fe497385666a783466a671e220f0cbeda5a113cf87c73f37658216ad340ae3366ff4a12f11df062795ee1b5558c50bb86765f6546394a49e3bee249ce843e6fefa0ad1c3c02ee628af9a4aea3fa04aa989dd16159e88aa582d0e2ad78fd7003b5cea89e609d0a4a2144995133df8f54bbd44f7a58119bcdfb9507e0f932adb55e9123df8576aae4e545a8e52ec659819525c1f66b3de589f5153a2978ab5e4f93f10628d11638f67f06bab4bb34caf8ce970f1ebcf2d0a3195964cf1df1e997fbf739c16f041a49968fb50403b34a830f32213a70bbc4e10e686b1b128bb8563faaa4f285c8baa5d3e6831e2eca41e800ffdf92b21d290d7c4b39557c013153061330033ceb7ed2de150a4a630217f04805326da8a267ed0d08b4c586dcbe58f938c33bbbf4d0975e2434cfcae134638f4d00157ad1e64a67a9c6b255a3c62bc02346e32b6b17bdfc19e7f78cf100097fdd33d051320eeb3235566614deb19502dca243b3d8ba0d5ffe0d08d1bae4aabebfb1e7554e489a17b54b27e916e65e6769bda37cc4234c2fda8d4bc0c3460df4fb64a2adacfa1dbd308f3efcd1cf4e99d4814badb7b94516b64f0882948ffbca97324882d58e3dceae09f3769ad32d3d25d5826f37e4bfba993b873eb5283ce79d0523fb4f6ac2ef38a18d7ff65ac2fe62a092eace0c81c38b390f1daf7798f514c47941a4f874cad43f563e6fccd68195ccc145039954da9531e94708e6d7990557937b5b9e1b078dcb94dc8c923171c54058a95ef300a7bd0b5ee34bdcc07d77a5b9d2fdc67e4e682d9081d5129b74fbe49e3d68834dd10dafb41afdc11c497298326e11d766456f4e9253d3b5dc323ea0dd2aa8af03018d053313a8fcb3a5ff1748761f399b97a914e17d0de3bb55965c5b97a7e0e9de44f625f7d3f74d37240b4112b053e5ea1e68c7250c0502820b0062adeb7fc8113a68d0ed0719b2aaeb5a666c4b8f0ce7d7338a7456817763a6743893fef2684177447e1ecbcaa9a45cedffa97854d735db5b739175c1e3a06ea0257268a39117047375b1a772fccd7eac54f4bf0b0f7c32cacaa4f12b0de16c6d7372aff80b3ae8dcfdcf237971cf597fac73a91a7c66e566d7d75029bfcda6c168ba5d5b9d542b6660a0c848d14ff54f514ebdeae699fb19e1501c22bf0c26864e73f933110ad6fbe44b1d45e3f85b0289ae83e315bd7cc93237dc7ed647f4a26bc40ce82d06ef82d3f9abd9716f92829dbb846dd17b716010b519a4cc2616ff08d61de2baf081e273d1f86c415fa2b5d59c47f1e17be1c5c4f25afe695096836cd1b4887f6f91050dfc8e671d6e9485787a55d50e64d4e0961527f3756e7b18e1dc5a44462c29d2e8a1f530cb446fd9d07c348320de5299cd4608ebb727cea5ad1f957dd5cf50314ee9b331138a3b9823cb6e61df9364d8b3af864ef824961119c3f09cf5ff0f0a85fc52d1bfe800acba8e8bd9122811858e752885000cdb466df0f0076e646d45d6015a779505c7fcddee115283486288a7c377f69788a62bf1cd1f2708a772cb8920518d5f8a9770d3138a34f8995dc946bffa0a8540fea8ed8304648b702682e683c17ae31e79f0e6247de63ac30c31b391392991dbeba5a8392727be669253354f31a6ea6a74645c4973d2116f77a63562bcbc8502750a6b1811d66a32bd26bdaf2a793b1690b47eacf35f4445a511155a0c29275ca5bf7e4849db577cafe4c7c9335ba0c9d5c9947285f59dec9e5b9ca0b0da409282ad29f0579c4deb71739bc5d4b4df2b4c89e6c6b1fce20d6a6a0f5d3035974b14bab439c48314270abd81cc95ecc1e5fcddbbce00dcdc4f1228b9b815a4f63064cf664a17f673d982a9c106ff6b0e9feead5db2f9fe535b9d7ce1dae58e23e879d5884cd85f34a9e21ea29a99998e0028e2129b25c80fd8134dceea2b5be71c5cb2626690251d3e31066db0ebdf08b1b46223b10aa3d76f7c85c9116c720a7413503cc1c6b0f74177486b727ea3465a9a17d81b32f874c8e10b1a77323d5497a8955e8402688959bccce106d94e0ea2e0e87802252daf8a49c7094304238d2e226b0fd8ccb59d2f097a1a948549293190bc4d8d69ac4e5dbda1de9e6b8c7ce08ab999e5adfff96a653a5d4508fb5fb0b17d9de588db19eb4481e0afeee0ea56e76742d22cae66b3d9f4f140eccb77c74c12b1310a24dad9e64f589f15889f38415c53c8d22aacb26c901faeb8233b1d6863d19a75ee57d2abf38e9568ea632da18213ee25db930e26f62fb7f56a715b0d58444853a0597c9c55caba706ffedd0ec0cc6daf2ae3700f0e69822a07e22843d954622ba4a87fc05e5435b47f37f190fec46cf87d637f30c11438df64562d13ce471086610c8420f4732fbc83d7112f244514863ddce490f57a009de89512841f667ceb3f4d33c20071d011e1a7e4f41b958ce3d317463793e103eafb667e9fb4f9cbe2a63233b06b943f3a036c13e6c9fcfd97a5d94e2e849269510592196b754828f3fe852df21b25a5bf4ff1450d17c48f281deda47caed559576ee28cf04b9ab9a7af0cc88efa6b29292ffd2372ed336920a21aef29fbf2fb869f1b7f361c39a6852190ad8eefb0f4ff0a57551c3493b4079b27d73e52307865fe089946d26b1816bdd883f9e13a2dc948c88213d22a976372dd06c29ad8f87cf4708327537937e0e9aef3d8ba53fd1050185260b1413bbe8e0421bdbd32a254ea1ae5e189ab2a6d0ed8a53261418c5a8c0f6f0ab71fc89f5764d338a2869f7446cf657d5a481a45951f400fbe4c013263747e19ce0e658f35c4c139311c17647157ae02b09a2eeee44b6d78b9be851d3d112a96dd543a1590ed96cb523b31add47a667872e78ff26524d3733add3fa582ac1888cc3a70b9d0a8f8f3ed2d15d6d60036e7887864d97f711b0b29f358519b0ef3f783082f035dbb90bbea38ec67deb0c558d995d62999fcec456e46f7a9eeff61ece9069e7ca0ee052a31a5dee95653bcd24f850d6c1d8bef2bf11e4536e4470a6de87ce6abff0bff48abbc12e3a5b1c25ed192302972e7cbc49bc56a7fe6ad988567b12e18e3d8281e3ec4b1dd33928003480267e900d8291852828d0d5afab0394fee9f4cb51f25b3d307e25f68be9dc99a1edc332f26b130ff9cd666a9f6fc93867b61cedba6a11053cbcef2acfcc2b8b02eb48f67980a138b5c6e143c69249af5a09b26bf36423ba4599c1d671697d9727a1a8510f7ddc9dc0a7d9f7a1bd05684a576ddc796b03eb0f9756901d2c333c849349e920bd15bdcee2a8dcad4a7d01cd1197a5d9094215df2815de2f9efce9be52a61559c8fd0714f9e68965b510fa36dac85e8ea96ea958ee7817253c2b3d1942557c272be30857701b74579771b03c15987d06d5da33f13d05d1aa7e5e9549f4d063f540784ffac7a033ff6c1fd221546077ce1925343ca637a40bfff780a4ec9f8350c12d3c73731d3eb9ad6bceab19b8d560edc0389fbc95f4e61b969dde8c2b50d608625c5604fafb32c5f6041dc81a1c5bbe4baf8ee2994aa56bbc3b4b75fc32d190c82e16efc1ffe7603f211e020cc31b252807aeaaca2be65ac8e7601c9acffff4bf303ab5fac353e6b7941039f9502b9cd5df6397a10f05835d30d0f27f8e9d9ec7f135da1ddbe4d3efdb98e2685a199fd5a5521ba66aaf6fd996029a22d5571962ff9cde93b026b258761c9df22741a8b7e7deb952d5306ade8579662d5aa8df20a9d43604d695fc81d21fbf0f7e4031fd257de32ec5251ecc8daa08e7750f6a718e7062e9b5cf3cecae16d81895a1e605ccb44ba2b119f6342d18d4e9caf745e61c0607aad41ede0938968bb623c31f726c2635472f7b7b95d24a6cccb2fcebfee0e976c0c8116a5820132c509f3058b382285294a6c639722bc332d8c38ce71c6bbf42e3f8536c69e3113c806e862c598d5f0603ad869a5977f7c9c67323a1df1adbfe5ceb415eaef0155ece2820f4d50c1ec22cba4928ac656c83fe585db6a78ce40bc42757aba7e5a3f582428d6ca68d0c3978336a6efb729613e8d9979016204bfd921322fdd5222183554447de5e6e9bbe6edf76d7b71e18dc2e8d6dc89b7398364f652fafc734329aafa3dcd45d4f31e388e4fafd7fc6495f37ca5cbab7f54d586463da4bfeaa3bae09f7b8e9239d832b4f0a733aa609cc1f8d46c0f0fc33dfd669b5af5cdbe2c12ffca6688761e7f40839a65c29da57058fa7594705c8bdc432e7c13b4cff7c47b2e046682978ad08fcc14f32458d4c7a420e986b63bdd19ee0372cfab6c9e553b95d4e3469d85b369b8e7b72182f58beb93b7a9a953c3dc480f04f7a04dbac69b5dc2459a311810146f9a1b80c30ea3767a6764114d440d977abaf15c1a53ffe3ae56f447fb49cfd918b5850bc529f78dfe8121b5d06894246c1c26a77a72e85baf195815a222d800dbc05f882d4d6f77478e475e853859370cb3fe48151d694b8992d9cbcfab13d1e14410c0a683f37e7c163ed413bb44188206e209945f6afa634ae03329eb699452c9007bd6d26be8c59f6ddf24fa3e0ef79d38b09f3dd3b166c7d31359eac09056d597816542bffe4bb33e475dfb2d6293016906ddc18cb8ba931c3406b0020e13f23d99fcdbd70836d918d368c8fb5d7db9ded3f7f27d578636215ed9461556b4a75a8d43a69b4eae9a634ded698e44de4dfedf94d88fd6f2364c5879b3e3b05f7c5623e1aaf417da7c887b93e4d062dd4630f15d7ca87c281d04ec90ff52643dfa99247fefc8ade209ed250343a7fea32bded3fae5b1924d72b0e0c3334cb975a88b57c47e0156efc9fb15e58efd5f57846f4b121b93608cbebafdbc55b8f82f0f9586595e855b29431a12e0cbb9ce22da4b224d27342e0b88890b23707d6a95b51d77e5973e04b7ffb3e39c04c3932cb3da2055107e44f25885d29f898554cc248df311321298c1852c51c24003f69c9a830ccfde58e96ab61619d9aab701ffe44bc28536eb61715eef24fa88613f9a14b1af669aa9679b2ba4aa79dafbb8547bc1ace8abb0a5ed116224ebe3c5b550abc9d2c04b5b04ac3e974b262239c0f3735579e29a49ad5d26ef183e5917a1e4e6343b85f95509c57857c588885962055471f01d0a9dc1ea25fdca9af23f4b7e4d5ab35eac7fbe10604ce0481744e6b2a47cdb3e039628bc97f300a8b725fb4769a301f36dc16ab27edf630ed4e09421edde00f08d1b2cfa043b8310afb1f966c178efeb430356d65a761881c916b37bb6fe27d9b11513ccf23c1b79e2cc8c04de3f43ee372dcba27d7bc54afdcf8de788461aa1766a265beb5e8f8b595cfe494662c6a650270f3e6e54331178f1688eea1da0f1e503adcf7609a9ef1b4a955c834740b896d96ad3b56b2a7d43658d9864eb807104c8f0501ca52f4d307f9a661d5879cf112c2689db2672366514442c7e1983c8dda13604639aea4ca1e2548e9afb3891ca068a8767efd2e5e6e5d572c10d719e7877c916d651a295755a0dfd849a47a6c851ddf6e12d1332cfbf8793b430129ddb30efacfa301fd0b4d10bda629c6cb713f368fdd147fdc4278ca3b7e0ea2d6b10b6f1ef59a028a4672e984ebd69706cb4d673c5c0a75844f6337105cba48cb01fef17067a0a87b99559fa811c691a6cb2e0457636b4ec59449c39a6ffc4f5150ec5a819e5d402b84639799a0704346015fb2837b9d681ac1aaf43c204b43141e71fee522368624982b85fc206a284efe60e6230d375dee47f54d68060da08deb2e42fd7bb2c6e1352bdf220a2abd4c22c003c8a0bf9ccaa7c733c089da0419175feb4d0358af0bfbd317cdd6287ea80efbbfe6de9cb13a618f4bb83426da6043a54c5661ae9aef4ccfa4320cf9e8ed23726f000f6517b7f5bbf9c19d8a8fddf08cea9c0f0b0725b860190126f588a600d295a6cb9f4ccde4dbc27f1e6bb0fc9e854aa084249029cf32eaadacd1ea5d178ac83d8bb1ccd6af7d4a334f40da46be0ce0e63951b265e1b6adba26e56a6ce8197b46d823247cc60ed5a098b06846dfb241efb738ea849079b698fdc6a56fe2fd23553989c02ab90f09299320e76763e3f22f8630a4f06beaa9dcb9ec07d0a8a464eb185c4c6b090c6940b718d432eb3056282eef7e23d4880bf7e3cc2e3999ad947afcf105b836755a888d0ebb33f615f25bf9abd2a95ae0317cf3ed64f546874677700ea88cb1d871538d8908e4e5035b5daf2c4efb7f71dece72d668ae2fb00f72e9fb91630bb43254210e59c06897058f97b75f84b2bb588ee91d95ded5b633fff35e5ce5c48701ecf0050a50c13f65745bf360ff853b3310bf0978d1a9187871049d675f4ccf84906313a700bf6b1fae54570fa6675fe3066d408e513a452178963f3d6a350c2ee102a0cc6a93b888801958c823e9c80cd28c4942c809cae36930ca6b80fdab65514732c6f8ee9624bc338f06f28cd204f7949a3290882822e56ca57e2e075bcc53b9504336308298951b50689cb12c60080ea9da5545db645f9286c1dbf26bc88ad17fadad0a1c48bd3943598d0725a26662fea680c3531c4a4ab4e3154f79ee49181782b7cba1b99725ee463def6c50a52a0f23ad712ddf381dd65e646ef4a220f5ce5ef105e16fa559a7db39ea4edf46dc61de35dfda119b54519043d16a989512fa9ee33929df8a6d06750b886bb2bdf28d42a47fd657f6b6bd352e375a1637c822cf08e6098d98a880a02d3a417f9cf4e7dd93d1b116ec9d8f999dd131bf6bbded5bdc9cfefe62b4bce919704eaa465c182b6e65e8e2cf713f5a1d6f9008c34c90e1c8be78a67b1a01bc4aeb01a75cb08498aebcec2011ea42d32742d366b0fcd3fd77cb151a444105964bdb091b426ab3c1cf373963766140b145fb9a7db7572ceb445342de40a22f0396f0a35a9a133c136a756f215f6eaf50e40a439268e3f247c8e7904712e5e480b69c8f09c6127429eaf7ebfe2f7ae55eabff7d69381bca9f6fe86c091d64cc9a256f2a9d4910f261db2f3e3e790e9926e83b965697771c5ec3e65478d2b75dcc6dc8e489a5774d57b59be486cea22146335f2cef197e7e124f61e83ad5460e73ea3a6b436dbdcb7804be6d4b82ce143907cabf9730aa56368cdb75a38799554d35441d7f046d234f4307371157fae87bf01ebce36f733b57e6b3ab678c49d894d9768980fc0dbb49eb26e06c90b1248b66cba3584871a3d2e79ae7eb35bfff0741322dfdd70819f4777de7b1df794ee3e642016a3e1e165429f1c9a326643ef0f717794a07f4b5db727cbb8596cbde11f912659dc2f109480848bf13d0ef2f0e8586fa0a115c156b66b3da4c5911389219cd3e677963031b2d1036d1b7a935ac57113e928586cf20ceb3d29a98f204f0c2d30a5bc40c8a69e2d8df516d4ae956f646a587d73d39a804ed22e4c8d6c99a7eb437ef355605a0d412f727441cb09aed87cd5e78c7fb4dc3c059cf7b47dd0bb7f165a63fc80b5c6b5f3ca7eeb731e49765249afccf6aae65fdd59f22cdd5d1090b11f555eb11f9330e1e67cfa2d3c0ae5f39a1e5ac2e2675c624e851c14a66ec71ab711a37a003a5a00aeb69682cbb7cd67b27a5f6ac626de9c63f8aca8159dcc5b08dff264c084dc580a73e5f93319d8b7770b0277bced8b94819206231164467cfc0773f6c7395ef1e3fd121adcf8acead31b6c702e820b518e9c4f0d018dde837ad050b87e2187d41f9a436d2e1cf108adf0c4dd83ae07db735eb2ec4fde3b7a6984ae324b030008a8 +0x0c25d4a35196e3771cff30a7452ab30e68d71726cf0ab02aa016432b1d643dd975e0702f458086d8ef7a35b91d9faa6d29e7458840e1acb02e208b3d79ece077 +54880 +0x4064b1cddf29c0c9adb380b2c15250741f89fbc47ec0986b4f39aee2fa459c206bb838b0cd9ab706951fcd13c3d91417642db2b75c04374f62c2c4894c7c722f8d66f13dfc8a703bd7c0bdc907daae7ca51fbfe8befbfcfe53f42299a4e00153af55249df362b40f797c9afc15bbe44aea476a802c0db1212ab60f398bd91035d76f19f73a884b2a853daad376e67f29398dfba72ea21c5fedefd59188cf697c109b18745a66fd3502ea3777b1c147c39cd9b9844d220761a689baca232ad2d15fc1683cda6292d8f96b87104eb603bd1a13ed4010f538cf5c6b070ce45214dcceca527642e6d1ba71a8e2c5d62c7dc2bb23df0200837750187d037e54b0f744649c1e4b1b598384728892bed08b7b7888f1d7f3a3348e8ce1a7f849faaa42b2292014e2eb2370dd05f6de24c43ac68788651d3b8471432cbfd12c945ea9bfcd263e7b643dac606e30d70d1f3aa32698c468f80128a060d8bae3e8880916343e62df9df8965b1bdffd1468d6bb2d625342e0b26d192bab37dbc5744d82576aace5e9c0c7809a68d774953772ce40445f0cb791a9de78edf22960180a51d629c0b8462df882d111fe9c42c21afc4492652ad3dedafff1edb0ac9a1ce8fff93822e2dc2cb42566dcfd7d0350f7cca1150ca21ee02b04fc751a6d5cc70e132a61796b950423efc2927c1fc12a31c6c095fd7e7ee1c276034bd8738f63a415d06a6d5c57ff6c6a4dfb228b6299ef7207dadfc6dd27c7dd6d3891c71936d48e521ca8bc0c63b81e6fde98c8d0e35959dfab5b8022fb63bfa204ed6fe489c4051a3fcf939b792e92910486def1509802b1d119b635a5bda60a779675d6a39c028f9b8deaec89f74e193692d6af2ad4f5e315c06ffe6dff190d5931e0d9ce850d19f787c8e7db3ada713a67b7f1b734bbdf3df8b4649b4ea1137169b9d450a7af201d683574b620bfffd8ab899e41e1db0b116b8c5276d5c58488e307ae72296f0cd3d6397b64d1842dda0754a00e03ddd15bbfffad47b90dc8664ad2517c33d646e279dde42b74b162062221de66c14a98e19c155e56250147d34423a4b6ef6b3412fb28975431ce0526a5f7409343a9c76cabd74deb3f2a699779018f6783b63f2a01237c263164800037dfaedcb282c8c4934c624e2f0f97799374fad9173fcff436d47ceb9cfa3a5d81e01088365e02b1fd7c86c61e3837433784cd52d48f4d363f457de99a199b042a024ee0f6c3ddfb91709f9d342eb3bb0f3af01be12d1fb9c77e686a51480bbfdb4d512c1b3cc169f62f9619987871aac39d4c7c67a1af45748526b4ec0ff2543ccaffb4cc4e16c5d5c15483739edbd7fbb5c7bc8e7464a2ee649e0f91f6b88cf48041bf328344d5d52fc023ec29570c5e8b4a257d2da597de23b7c56986c52fac7800967462b3629f80c1402ca04f0f9426befd5d54dcedecc85b1d9b4682050bb82282bc73cc33dabc41235a8b2aa9468f098d5571706cbf5d715e4fbf55d5ba4a90c92f3ff5122fec27159f7350a21ccc151d8e0dc9dc00e9e0d1af77a769603533b3f74d97c546175b5c23de29c2bde7c8f530af4f05567592bee0f8e187a682f28a3c251b15c645c4400d571dd1d2e70c5c62e06aaf6a086e6d0dca69f83438b4942550e7ca587e4c0b8563949602d5c89c4c2782a1e4aa5c255c73a984b15f631bdb5565aca3cbda03b58cf6daf6b8e4fb170cffa46b63442ff57d07f2c600e66586bcfc8250335772c359ab65559847c2eb174980a73c0ed30170ed0c1a2225ba4c0e131606bfa99ed7521bffc87edb38efd1c8fd413ca359a8d2c29856cd086458d2142e6e76b9d01a00ae70f77087a74cc1e4e2e16ce909112dee5f210977aad09066932f606f4fb3eacd7f89793355297006f92ed2c92b6508d92924df5ad3ddd1710df285b365cb99def6279ec78baf649408d1782b06cbecebbe06569928a61b9d645fee6e588a934b9b78e92c910627f8d87166f8e36c608ce570771cf154f9525f1da2867117627a37256148af55419831b7a3160a70ec24680a49cb760ef0f8c7d5a9e5f89b8dd591d50e042dc438dedb4b376fc3fe181b0d7bd48ffefd8af7642e0c71353d9dc27331f949527d96319dd42aea563e6dd99d6c204ed2484eb7fed1d2146f2619aba3e029fd68a5e2f840fb846e0a5972c6df8436f23b19c4a15d6503b5f07d89f7ea8ba609b567a59d8d674ee52977b04a9d6c1d617f95751b4893a83cfe6b760e10da795682e9668749c09036f9bfadce9dcbdd85e6e6e88e8903c790e2186758dd74a9cb1653ad1e3fb05049c35af3b8a84a7f44ba34a563e65c6b9be4abe43d19023e4fbbce03ca36dd9806ce700a728691098841a63500284799444b4d75258b2b41ccb782eef3f5ef6f5564287862ff478638c5651fcf176b5b736125a378fc98b9295396f801458fde1ecbaac7f2db14fb3c8c98eb367a71b8106c5cf59e34f1ae4ed732a95cee65eb494c1f7e89e1a2727cde68229f1a00b904b519f4fffbdd29238b80886cb818a1be2faf268eda96f2df05fd4b71c0c16435848526031904308fb6a51d9a6b510565bc81466b8f9b844f487eee14325bc38c21c81513550fce7da2ccf04cceb721263bbe6687c5572fb4ee1494f03977def1d309499578a608d2951b8aebaaf3fceaf38d0f4a4772fbf440e6c46d9cbdbb4de37049f34a70e877d8ba72e0c7ac9e972d17c71cdc95f0f8861d06f325d4648699269d9393167554b3d23092ed8b1017318319654b6817a808e0e2ea9a65e1863d53cddf1b3fb7516d8b4d68e437595047fa8a8d5d9277ec0d58e1bac4173833171e613daa94b757500c50cc7359812cb7a4a4fcdabc18addfac8acb6b9373776fb0e21707bd7c4ca27ec12564999192c8a8ee1b8a8d03d1c405658557819a398c31d8d4fb610e1aac0829da7d9e9069c32ff05034ae3f42058bfb514f87b361b7c8c9dc4e2876a7b6d30e558711869bf0603304a2c6d4e6e965d3951c50c8d6389d3f97c8bcbbdd0807fbfd49997b0f97643ea09a7ecba7babc76ba8682e08257d9c16d30c2e5a2e9cb753a8ddf78ad0062998ae57e2b6cbeb76a2955c6044c5ca4d8c650e5fde0a3470674198b845d7383cd2c4b6dfc1c3f7f394951c33b1c8e250a0aeecb0a7e7ca43513b644a80737ef61ed93f347a1833b6a8142228dda3685e2a1d31c1464bd0a8a7f2cb2eb9395cddd3487b913e2d314863bef8a026e9cebe5f3c781247aada08e21437e55e9d545ca6bed6768c7763214de21a4a3c108809d6892a140a8968fc85fc350eef23f81aff98ea54e38b6bc9cd2a01877b9c26c9169fb2673d6befec1a273cfbf941aa614463219ce1dd9dba77e348d863f11d6495ccbb5c2ec6e16ff531ca4cfb8b0df81baa06eef5e28b6bc4ca5abd93c3fe64eabcaf937d2eeff0cd88677264747527fbda24abae4eb7663a3ba1b779692c627bcc097d97086e0709b79efcd27282795b7fe5635956a4224eb3c856837539b5cf9753ab0ae7ee1b102bdb4cb429b874c107d396a5aec43888df490b505c99076c9b188c5751d2c5977196f287ee79a2b30e79b611cbba016efa7e565ea3ecafc933b291fabade6f06157c8edc55687ba7f042621c11d82577a202c80cdf87476c1dcc6c63a743afc283d6621fe2e7781669c80b2325b11d196260c0f9540b46cba5c07c308bb4e073394f2cc11b891094b76511c58bc740eac802d192c5eb267e683931dffc94a98ec2313f6e53cfed9975b42671a8ad49622f738a6799a98efad1813dc06e85738bab472a86402e579b313fa9c5f0b58ef6253d5bf643c8b8a77e52e09045e9d6d050db6ea75516f72056622c3118929a3d25cab6ad58bb5c2acb08dabe37443c236f788c20073c34bf71c62e2174a6e3adcd963b1b4d03e1eb442d7ca8a7271bcb33a903aeeae0b8cf0fc61035997503ae794a49ce9544e26f763b56ee1a051e5e59e7559254b6cbe58cfc82dbfb7f72d5a5317325d5c0b63dedacfa0d04508c434ebe0278e911068965d3e6931f48a9a9fdf647bf633a05ccf71cc673fabc1e109e878ad11ca1f12146e6cbe9794320a1d00327f9d20339933ee55cc1618a2c5ca5ee6f2973cc04439cafa34d9e016043c7d29473b6aeda3731a11d63dd5d3f7e116d1fe06311c876d388fd3df205f106420f2dab65af501f5bda98d9c2a7dffb4d5e2da48ef5b621882d3a4919c34b6fdaf3540f838743b239fc4f91c5ec866ad66c18d43bea45ea26e70aed89bbe7f6ff39982e74c91da64870b23a3bbdbb33290151fe1e81f0174c50bf99a6724f223b4c7a76ddd75651f3f25121a87df6ead1a869908b4f6d6f44e4f8ec1468f987fba67b771344764be8dbcce6a0bfb2085cdbe02a2694e628bd3e174338127f7eccc20bbda9a3060a83a7560798f5850227162629650522fa11a6cb3da5f1399d3b49ab9925558e0450efacf315b1d86ecce1dc2ccb127c49fed96549c2a7c069a387ebc80ade66cfdd0f32379b6734a4bab94292cd4f8a9eb12075e632889c4ab2174c98cec028c384a076538ea8225a7d1729f9e00eb67ef5168d916a3635d6c3623ea9e58d6c95e42df9c583d719e68095d2c0a7e2885127461ce9de13159474134269e3b87aad78123d0c0f8693ef619fdd95897d88bbb419944e02b1c3ea3084e8674db40b80bcf7a095862918bb9c9fcad709023015482b943c6c84c96e7551a100981277963f38c5008c5120f1ae3ffb13ab4307044fd68d33902e8e87dee40ce4374647745b702acb86713527f2db1eb9f4a2860f37b4ffd211f19bdcc9b67c80bfe203a1ae184265092bddb5171b76585993257c9c316c86468069c3c2637054a6583484b3ab9c5b88c3832f975bc27d6ea77df2e9f643deb25d80d35555a8de6f2b42b3e8a4a91d99dabdfdd02663778851f7f8ad5e1629e9eb6981ff27568c9eddc6b5d99de92990f3e6a67df5d9f55b251c0452e3641651ac9c662c3339fd99e228e0f2e1ed1e1281b5cfed64a6753b93528c7720be229e3381e66913938004caf1ebb13b2559a32673d09add5955ce1f4417869074bd03f2c299423323e2441aaa3cb0e4126aa734d93f22da5335774b693c1dad3864477cd6d5243c4b62fc33ca3a6e8734dfb34f3e8201e63482bb8a2a4088f179b6bd2427409b797aa081b8da8b469f2d173bc81c3fb48b6ddc2f6e1ffb64e7a902f9ab4c6224854219791c4395d5863bafc5520adeb7247f903759a2934e0a46f77154ae903bea324c46c0adf097e71117d45f82d5866bea4d67ff6abe90d3e402a8d2d6716e12bba77f6862020a4c2ddddd530cbaaeac2e6235a1d0e3c9cf009324884c8c27995eb987561870a90fe26064df00f49c7fbc8d24f36da975761d4768f78926e4d88bf0f32c2992f0bcef4dff562829ec51251cca66a9561043aa8dea9314f8426ad3fc475d2e0f8dcda505014abab0fabaf8af7a7e0c9016c228e52e0d6866bccac72a086b8e3cbcdc94141f4f612054379793c9ac1fde157c28cba7a90c08b072c6189ac9d2a11a443d09adb6940e953192884c634ba688dc2adfec086844c9fd5126830a93e332af20443122cbc21a4369fb5746287fed5c9f607fae15a165b518f265a03a697277be525e1680e17fe79e5b8ec72ec0bf87f71bb70c8ca510445e0a972d4eaa763897b268f45bf31288a0176768d71f7bf8d250369645d65625c0bdbc04393caa5c2cf2f66ea56d9ec10fed65adb9f2bef9b1ac82fdc9aba3d3c1aa38c792867b6cee829ac805b7610b4e1bfdf83fd0d535059f008590ab85d8d14e81d9e31e85f56cefaaa2e576f5d1db41b4eae1406b255e9643d0333c88af80294bcd936b466028a8ca81dd12e9bf37fd1ef836a7fd351d20d15019f508b24eb8eb152c033937923c5ee74511a92e048c90a2b89de7fed1dd2da7cd6ba29bbd7be443256cdb064a18fc35c5f9b098a19ebe7cdf98c7ed1d19ad29b5e6c2c62cf0cbda181ea836a0dd171fd8419ca99f91fce9240f298a4f64f4787c1d05cc3d96063c6c8f2d6346e733e7e47fc9bb6f14d06a2e877950f95d87f67874c808600a27fcab34d6f69cc5c730831ad4589075dd82479823cb9b41dc364364a625349ba59d4ca6316b22f7657c2c99290b945378c40797d564b5e065aa65831c8d0be90390d969d95b7a0a834d5971443efb3c36a2072cfab6c987b8e5474697ba8660d679d9e61b31f26da5068239b28d258eab9e9ebe003c56c64a597135a438149172aab6a183793caf4f5a4f690050b3c92c3c66d1826fde1a9e896bc6ce7047097cc5f832beaba93df69b19759a34167a4cedd7fdfdcbdff329f7af70731d8e27693e27000943d8981f4b68e60ca1de2092356a99decadcfe7126a4c93e7a5a79ac85cb901fdc3b4c3e0db640c4146b4a70a5a73ba1f7458b1888f4478d215c8edb2f4e795ecf51d8d734aa0c4d265e568ca11669e3dbba3764b10661ebace4c569bd381232a7bcbc8f728caf243227e33ada209b10e29b620a1163bed67783bbcc9210f1580fcc65ab2a06afd5d2485eff935e45c59679b95d3c94a4ea0bc9e0985051ad2b320172dedd7094de8140586f7f48005e81c5abf28501ba72e427c2417a729c28e90c528eff82e4aac9903dfef05641681f1f984ead43661dab1ddf5c730c44dd8f4d8320229625c715c89e2299018f5ed8e82ce5f7c24e56ab1c964ddc873db58f359356c922cebfe059e77ecbe250cf49afc84d1716c9aa6ec4959a096bfd4d7364f18765d145f1c3b4b8682b612c15dbe708e86da96e7580764bc59c32fa01d65c2c368afa22093a697f731a1677ef2a1e5d4c7e02a3646ad237551764ca7f227ba1d8ab35f962bef8ab242a7adaa79ec633ddbabb1ee39848c6ccdd89c521e244010238ed229abbe2ca0fdef6bacbb46f3b30c62b376f934aa8a1811a90768055b847d6b8442ddba86a7a9a229ee80589b1ea02eb6384e6682b57948fb2f9a72145fde70fb47878c9fb08fe770d78fc96564e036449b00c21ed637a618337a12728a8fc5c1a272dc7fa4f8e7c6cfb242596e14a3e407d6ef85d69b528a79d18e7dedd8935eb966512f692acab63eaf6b7e24849c1fe49a96bf9bed74d96b668d3d70000258f62b93b6e96eb7c58c4febdc6e774a7b9b125ed50f75368b7003b8bbfc513939c0884b1c0a0bd67d225a6b7b3537d4829207f0ce197abe2aef6eb7fe771161887e46216ab64b5065669892645f0a63bc3240f3b2a046343e5270310ecb89a1ce9a2dbca7d4744d05c1d1099ed6391fb0e38710898e1fc14d00d1cff4de0122927b05c5db4ccff4e69ccc7731800b2fe60ea2ef5cca4e8de1615938b79ac10b5c8996e30e06a46e8f5d52852647cabce6195a37323c1abf81ddd0145fe51085b52ca8bf49e93be3886e2bdb8412bced396e779014cccd7fb6dcfd0df5a938b823cc020093dfdb7a5a351f2053c82beb6673c1a40962aef706c6a9c97fcd7fcb30d16d4ff5d0cd5b8c1cf6fc9b535dddf592001819e6044cfc039cf008392ee764a3b15476a25aafa6897719659a9bec6e32fb974c4018a91dfb9e2b95d58c3346aa96b61e3ec89e31e66b1cb8852c405aba7bc7ab583234f31777223089e3d85e4fe41ef58c5f4fb49a9ab09dfc5a00419448503d16991505bdee7ce03d79fd34f86233047469ebb70dcc7b1be76b55a9272adb0b639775db56cde1aed998cb510fd99e52df2c99c2a7c9253a2ea8661cdbe9101b25727cfe4bdafba045866a3cfa1106e7b3f1825ed0585702ba595c21184c9677467351f502de6fc1698b017d23d214ccda00cd12f043b97c71c65e41461c1627ace21d48e5a0e8162df1b89df0e470083aa1a3676f50f2af3c369502cd213731410707805bea0ca97afeb823cb0ec1a3bd1c2ce4b548aba404f328ef1623a29feb293824cb82838136fc29971b19afa64ab88f112af28b61af43408d87eafe799492d7bc9f31f6a64b31338247cee418c8bff57637183bf0266f0566893df4c523880dd03ebf0d219fe6fc6ab9f205012177859c4280625952be9e0185e62c8d805402e910f46ff91c62afdad850bd6a3c29680ab5f3a9a21a7a34e6e1ab4dd8933edd8e7d98c536a9ef72570cafb15a011cc548f639b8d565e9ee9e075500af448dc748ed72b6e12dd36d6bbdd68cd9589ac5df6f1a36f91d55f5b05dacec197b8be79ec84beb009257ca9d538ef4ef29e99056865ecb17290470a44d77ba1e207e661876eb0b9ebfc3ae75369f91a55c524d35a5cc2036713f88033d8011c61baf6b3e5f1abfc09c5f437ccfd10d02d91d2505332edd5edd4d6553978d9a1a54661f99eca0af701172b13984ec0d0e88923f4c984aaa9755782e1fc267fc21b3eba9b0834482b506462035beb73cd252f9c4953be82deac1060cec26d6e0e32185320b8ecfe1986321b7f6e6fb3f551d99db6586d2115e094026442ba1ee69847de233730a731f104c9e066280c1a0d3bbad46e0cffcfc156ea5ae3992cdbac61be0af9cbae154f50ffeed9c0e68b95aa761bfb1a697cbcdd8b0b3b86f26decda755076faad23ffbb1ff31fa6ddcaa9ca52059622089d31ac570d91001a0de836968c456a1efe7087cc85ce664c67b7ffd129a59057a1ce27f0caba910e4c1cea9426db866e05405b682f6c7bdce32edf65e0cff1d14af0f4cadaeec64998f98ae0a8afcc24c8edba85485053e9bd9cdd92d37bc2ffc9387757b6c3fc46851c8c1e9a48c7ddb9e709a679308b0d67706eea6a2f905ddd034419d6c0bf9f90e462a0742cf5f368baed4e2a737da2615827df2d51c655d6ffcfa3c36b9ccf3cefa318bec2d30055d7c9dee4afc8634ba28ce38588f182477c9e67f53af02ff99cc1e9e2a0eb7ef1cc13fb302be7aa86ee029a1b4b8e6dbf0824f8f4a5766c478a4386785dabd9dd16700585ae67f293992d5557001962ae20f7b93a318bfeb726ac80f84f90ab784552906d7da5d5f24261b7b14d1f2b85658b3b4e759d41b900616bdb0d466e43b7301e40303dcf33685433b288fc02e53443e1a9d846efdd9606a9a8fd199cc00a9d21b65c9c48d789595be35a5c933e2bd66ec4d00553855600cceab596a18dadfe2d28595dcd4f03f582cc37ad5700aab71537f3551750cef43808cd5a270d2fd7b32eccded71a86cd6ad5876ac8dd3f4a876bc8b2a5c07f359d8b8ab097beeebe36321dbbf0ba80255677e0115314581537e8b6aa7944d5594ffb94567e23891628cac251a4bf6eb1e85bc83d904693aba92753a92c6e6fe3d1d1709844cb8d842d51615c6d99c0d792d9a64c0b0460724db0163b199dbd59b595861286275a6c967e6118a5ca252ad88a10c92dae4d1db80b74dcdb633c1f8dc06b41acc77e5416aa483307d0ea004bd58e4172c4c7e25aa1f60adc4f6ac9acea8692331c67bf005d9d27ee3eae1c4f44852174e85f84b81c2051b6c2c7dca56c7ea0b3a6b521f610c663d363efc3657f7bf59e89725942c27a2dd56de1cd09cea9e9a8e6d5015a6c5a7342010d9a20bef94a6a18bef4ad4d6a1bc291470f4c999ed97d6d45f1cfb8cfd2d476a60503bb837c621683db3a05868808ed4637e055d3fccb9a8667a88ead0ee535379870dd812811136f619b93461f12c28dcb577bcfcffe0f24c7876668841edd40c91a9d98b9f19fe04c246 +0x7b87a9fb861a84bafcc146831ed9a54fe3512dad25668512b17339175b0c9523596209336b0ed0cde5648faf6c101043ba3a653bde0ab8a8c3959b33aa9f8624 +55672 +0x05b9f9936306166d89bfb097617128be79c69670b36416243e12627bc41ca6c5e5f98fc7e52ca5bca168dc99c8f76595475dcae905383ad4d16a22e3997afd6fdc386c6761a089502a017889a45f40d42015d91286be874e485666fd969d4584d1bcb7fb412b68310ad2aef05c6f6082eb37eb739fc0a2998c1e5652244d270dabcf990cec95eb682b23a4555af06ea7900b2795b60436bd840a1b69ac514a1154b73a21caa6b9fb733c824005a9114cf6d9b6ff3554e9c31762ddca94725898b3bcc1c243267bf5cc647139c564f27707e9c039827663b22f6dc3fe4578f6abb0285777bfdcd85b1de599c902e7b933aa826ccc07324d92b374f68c282bce50334123c9a69179374e05217724fb0d85c7eee23f2a524f6c8abf9efca452889124514e3f600d0590460d31cc9368967747734b1a559c10479e96e1d720b7cc766b9eff625518256fef45f34fb8f6fd10105acfe6efda392bd641eaa406204006f1715fb8ee7a81db30f48d88f96dea580beb952a60d271201a07dfebbd568f499c1196cb91fac0dcf16327ffbf940458206dc66e0f4d612f5232e935ad215f4755c8cb23a7628a7a1adbea3d7334f417382a893b6612b15f66082f083e48590905dc2646997889be94a2fdc97b15619d39680717cceb08b93fd2daefd89524969296d0becd0562af4500892b41fff4f30d70678da99e0e43c3d7116fe3ce68f6e63ef113add0c056163fb6ec2bba55209a8ad22266f46c07db61fd12c7bccf32e71cb0cba0a349b9efa6ab93a30d2b2ccafd706069b5ca0d70b6c55fec27ff517f7736700d44a5e2b97c91a810c21f20831368ce1ba9cf5b681f93debbd7a05b9599ab895e7c7dd95a0a8fb3da9fd803af12e3f4e49724fbade48c189a935b5910c8369ffa1379a4bc98ce3d686dffdd3543085b2d4971f5254dda94f224d852da4dff3949d1404dc56d76cd24f33bb7fdee008a5c855d4fbaa2a5da2c53be4eda702fdfb37e7bdc5fd3aeec75fb3598ef5bf209db149013532a1473aee6b555f878ee1aa0e1d15771109e21c34b9488f3d1076110beb349d72e50e6e2a567701caf637078c3ebc8e36d6ff477ad018ff19a6719654a6ef730f681bb2f5a79a62e5bb76ba3ec70369d3249edf7e624b6d1fc39b94082682745cacd7bfccb960016c51193892409aa86a75395acc1a4047b40a6ca0b2c4ae0fef25fadb3c16484bc359a6f93335e2b8814b673fe052a82d7add5d32d11bb2b43b55dd9bb048b3c09f27a8727e016c18ac0991056795d36ce8dee5c0ef9640ffc5df0887c5cb430e346d863aff4da7475f425f21ae7e62a46261bed16acec9411303f405e9187673477dc8c9138514d2ff882a3b4156c6628c2820fadf1fdc26a77738cc96aabe9e2ceb08937712453a114d7ab8acb98f05da74b493b913ca2f079b3f125b1c9bed69379e2076afa8fb3904c9006d312d2cc1d9f242855533b898028f9da2c88eff90e62206bea7c074eb30bdc8ef481145c6ea627dc02ea951ed2f92b50a49182328790cacab852c558c639168cf58dbcf7e087dac063a8b998b84f0fefe08b8268452e688b9d23d1bb1101c7679fdfd484bd6bc53a3f36aedd7a522e20aa1ff485916282186197315ddc897687ba1f63ea4b7971b35d3b7cd760290f49c8f5e270b354a1d8cc57ef286ff9ab540ef57213d3da659486602c6cb2fd3bd403b45311f32e4c33a50b1302117aef36620708e69cb52943824dc586b7f538272304505098150c91b65ba3d50c34c8957f002d4bf033462a19a94f0cb83a90acf08fe015ec33685ac5eda988a64ec1d92e86e92a157c43af131dd3e6fdf3cac932fa0b4835b0e8f69b6c2c0328f05f6a3541456b54b7a83c375057fcce496fe8b0f0d9d1bcb414ce007e352eda442cb05cdb48f7f50cfe384eebe6367364067033175398c9667548bccbcbf1036faf146df9fbb440a4cb0b2095857c336b17c983178086a4ee92cd96fcf634ec9c70fc2e46648b7da79a1c75f73eb658872b5a689969819475f3c657b9bedfdef1f8d169678d64f33df0d515b818cc28dfc98daa451472e2232199c7a92cda1f96cefce4077e28eb8c579dc8811ca6ec9c79c910c28b42d71fa3b0ae75470df7b47ae368cc3ebdadbf56dc55fa502cebe5c37763b9d6d7b9920171d4c51860b07385f0bc5ed40d81fc76fb85cabe476fe330fd6bd1fb1bd0a3c446013fa5bc91fa768aaa664bffaf6b3d60209a6eddbebd47c4f0b304f5667b7396fc8ef807e172d518f88ca87a7e363574ee1166d7219c9034ba06f84cc14196c88e58192be9022b046f77f5683882e69fb6d8b01ee0a894b59073e00a2a1eb6467f460e0ef1d3feb5d7d03ab0237ad74a429654994308dab03ca2c316e93a5a7797ffe19a400dd993f83e7d3a874390db58f4582f92e5eb8b843aa95846bc0ac39d2c9ab520d74106996ac8eeae0899bcc19ac6ca14664db031e49bb889cc4e925b743f49d759c07684fb22b4dfef7b53452fa55112b48a850b479f1ef994af4c9780da3daebcdd4b7f9a94746120bd0aab5cfeabd4f62a74d90cc072df39b4591af77279ed2821ed53ef24167dc4e748bdc8d8c2a255b3e465da039c83e6e622ac8210e5dcc412c5c8a1dc827b038174411b3b7dc4f9af3d755a72842dc1cb0d14c9bb69c3b93a39a559c4a0a30414f800ff30c48109a5e6d233141325f2ed831c737bede92e21b2b4bee3593cf0273bc21abd7f23ae1e49440ef12fb2a2d4ed8a295859974c4d99bb79419390ee43a54e14ed96f00fa1cd929312c11ef906b127925b95153b48548331e637e527ef9e6e96c5f23155b6da86697eb2af1e0d39bb578b89ab229a4dd48fdb2e84c3b38ee8484f792da7e5d8e6393de8ae3a71eb0e1ff11ea129c9ea753b275eb5e917dd85d192142e2eb72f7baa584d6374b831e793933a3e7a5f9530dcd2b1c0c1a4f30dda96ac7a11b3480d65d6c815f56c72105a7bc6cb3ae4b5cb1ae50eec74e139480a64275a7962896411bf400de414154f1db1ab9094deb10f9f675c822a5715fe0a036f168e4a5b47571c9f946a39846d843bcfd5aed7f3c4106085ca0a8cf0f6817b6af677f5277fdff4ccf0af62263236231ce2b056e2b218d8700c3d0a33f918d502425deb53d5504faf69da176365dc7179fec3e4e6a05dd80590eb5944cf77181e4167b2490e5335304914e1a3d01d2bcd730f08675887672c9d3aff8d40454ca53cbed46ff58faf37d684464e39a25b0287bb4acda03f8ecd7d558674142a79817b89d92f51adc4ac5a53d0cc691308ff83ef3281412d54d07662766312d0a89946f147f0e9547d771ba8078628173bacafd549e903f8c11dd18a55c103dce1d5e51ea819862de08062ac72e23d56fbf15292166ead48dd9dd6f4adf6aff92a1d9f378314f0dff8b076869949727950b6b551217809c7b136ccc9056adecd8d59be656148ef13caeda15f04248d2842e32138f370dd1b44d1fd30e6855800117188cfc91d4b716020295f3cd9570ada60dc6f13bcf2ec9e57af52d7afe43bbe4d469e43fbcba0c13257adc8d298c81f152e1f09c610e3c8ae2b5660504c269dd63ff9574a3949f5097372307518091aeb61705ef5fea7c9c0b96509d05668b5f2bd098e725b13058fc5d5fd2c9e76d1c8bc8999b086e1a973a0a75b97cba90f8a06f56fdbf9a7f8aa94ffb65ef4b74e96869342616e3971b12a43dd0d7293b18763e683eeddacd6442a18e372e073993b08b5e26f7f5628619d62189a15cca5cf1c045011cecba744cd470cd22b52b8a18a18004281e1d66b422b92a77afcf34c797660ad93ac7492c6b4bae59dfeb5ae53e324423c8183b661c7d59a6acca1e4c2653b2bf5f644165d887413fd1c974cad3fd6d778df382c425d69ddade3b9813ef867f1bc5220b8d9ebc3c415576762de549f69fca3fdb42c16d4d60beb420a36586e69b0670f6084042e60ab542cd72f4906609174d836691aa0ef4c894567f2acd8fa98de19f6a4fc3d4f88beee95e8479424fffad39b3f90548f3767c980ba1d2b0b3e5e466282fa78fa743bb6835175cf1d0edef5c9f7a0791d962dd63dd6d3f10668909f8c662768c736738b89b2fc41b385c846a9d87496032f8374868df5b152df1b2b5c97ab941f9810758f5203724f2e5fcf232c3133a8ca0fac4329acf4576ba9f3bb5fad846b60b77c7d7ab3e957cf4c97203902d974317c855cf01f417dd3dffd8f0455c1115712a93b72342e353137a686490d0ecf2b7008b92b77202ce16753c2cfccd27b45c903b282adc94f1cc6053fa27a5d217f933c4221db19cc5be9fd3a083a3f0ff28492c8f246430f58a4bb318c724bd2f68f29e01c74b5c50a0c01e1f7c7913725ea5f66092922dcac77d046511d624a5809d77962697b7fb679699de4994f5aa8a37175107bf11de1e84d6438a229f26dac4ff63ce3f46327d83d5816db01df4158d1db4f67353cbf9e397588292830fc1d9840f20aa6d724d083f9d6b33030b9b185820e1278a00e429c608adce86dcf07ba3dcc051b44770945686c4963b4d755975095a741b1967b7f0d86e1f012ac10bed712fddb13e62c8a8d20c622d365ed0e2f2b4c19d71ff2e964c360c8855ce0abf50b196caa3ae15b503952f5f52920f3061a29877a704ee24d8b82f930a720897f008258733acfbf9901146582ed974dbca8681302523872b0246e0a7a5478605c395f27d4b09fbe50be35f9e277f9243b1e2e45d78d58a275d74d83ca2d8f3976fed95f3762f8605db9dc3a7e8fef816ac4a6a661e9557984ec47ed8af80e1bb497188a031a83aea83a32aebcff216b31e1f5bd092ed8ffc5ab83cf217e9c0ffe4b432fa09ee8af19895fdf058e36ea78be46123523883d215c2ab1f787e21c3c6483d776b6ce6b99ed8a55c203d70627a4bf2e4e910e3a7e46631b74db884a5628ff09ed2cddeb0eb0dc965927abc827d98898bd4011ffc6b25796004135a135e0e04d6dc7be3662187c2c34c25b375ea5cad8e9f83a92dfe82ea90382912abfd34d2b5e4e19547b6e929fb99c8e5bb552ad77398131fdb3300fdde56645ecdd4b6f2c288a954e43f94875527ced3d142758fc17a29d4828d222b90eb5f9ef788e6dd73343db2ba003c438662b1fe4646bf4efea252679281591c5e637543c76e570b5e74093f37cd22e6f5c72cd588b67a8d919d0759a9a438189d6b4ffdac198a04cad4b64afbeafafa39e179fa273639d410e6c32b265a21c8e44f3a2d13fef2427eb2af6664ee26f5b93e23cc902a6faaf30c005ca737b8a5b99bde42ada3225cb0aa6f22014b3951fa39d4dd5227ae8abe79694e9ab15f3783eda6dec78a8cac2738700e5f76a4977360e79cfba258fbe9bb48a17f5ba7e6e9912e61f039a3c938d95c7bee24eb5ecb4ff69beb2f0166fb4e38d5c39b053c4142df7cc6250a2c6bf98f0b2baa8fe058636c5aaf223a6479aeb45c15f409b0216f247fa7d1225e3735722ca68c04f4b127b349c610666cdb6945c4d50b27eb1062a7fb13c28ed73109b060dd4dece45c1985e9ae9e17f896ea67709f24e23584e9d46f987d921fefe2c4483e64aa37bfb53ecaf71fb18032be841fb2e5cb37f551345db466fea0aa4d28334874bf775297686e0e29d5ac456235f2ded2355ae8354245e61306f216c556b299d2bf2bcb1c7d337220f6d53551f7ca715ec326e40278a8bc065d9cabd7ca5691130bbd7fd0f7cbb1a99783892a43e6f8fff7146f4561f684c554f8eff10d9fccca37b4e73152874b283a3fc737a4d8f44a43cbf07a78c00eb4afaf39bdaaeebb5cc59aa7da3806bd31418266268520f1b23b85fe2e37958868a0183f79fcd3db3f27e71827f2ca76395fc3ec638f5f5fbc30fb1ebd28d7a065e8dc67c2adefab05e112eea72d3304b4e7acc07b0dd4bcecd693a8b3b716d510ec6439242882a93593b661c441d0f7487b7598d99b3197b89ed842ae7cd3951e2d382a2ae73d6442924a382bdb44bc588de6cbfba1e65ea3fc416319f48e7ec22dd0b12374806aa16f36c83a53dec2598158e07ddc7390337157806298a7d0c150b674ca5afc0af6ad14a87c363fb7e018446ccc8559caeb80933134d3c069804861db6c04f0e3a6be5c4f6e0cb7fb709551c77447197d30cc8cebfd50687783775b5ba4fd1f73463586239c42080b8f9ad986e19c3305a7979d171878f0a94f601b7bf1cdc84839851acb63708076919b7431a0ff2712b4845c4932d8096d48952ac2ded19bb1053f92bd6012b1ab2b098a4e3eea7622ec153308c8d803420378f1c6b8b30a6c3db776601e933c47b087b44327d890a4c2bcc9dc47038eb604ae18de3bec84d847af4e5a0b9c50aac6786a96d8541716bd0d791a39d4fc37c086f89fc4d89b63c76983119378cf62d16e15dfece769f74f69d9691de6ec45cba62971e021debd1188ad1d62c2d8fe65db5e84b20d19d50e64533f6f93df7e8a7e140b1a329f42da8f34d3d5f53ddbf832ad0be43fa72e5e8f8f13ab763630919150a1df958d7366efa2eb89aa4e9a1d2679fbdfe98261d43de56c5e08910a556257fcbcc4f9ed6b1c8fbaea3c8ba729095dcb21b53c2df411eecff3c5607a5a73a2721e4b951f4bb843c874368581c06db100460d54c1228e13b5192734ff2547c8988083cf678d2577aaa422ccc857c62c21b96c3cfa0414eca21ac87f072a5122d69028097493f693b8168bb1d9739517a5f85c85070d48e21d8503bf30fe2259b2a982e3b514ae10a737dbe533887d1c138f48ad96a29c8c8df47375fb052dc5c3593eeeb773ae86ce848dc7752ac0a1d0eacb171768725489c59223c3d3e60f7f0ba67aea359a5eb4892be90ccf123194976e6217c38cd27794da5939deed8f4c5d7428cbded410efc230ba68e9e453a5118d1f06482e7f0dded676bbaaa6ddc1bb0268dae3fe35d6ac36cc280fb970a8e5a19e616ae9b2830ff11cc7bba4735590fbcba5c97b461fb3a89ea8a5042106906660b7b031359d94c4abec8658d8ae9baac1ab03ddca1174f092994e46dd448e2626879cb740a429cbb4a89f5686032799db5927882a627cc9584860041df94b8b304f94ce9c4d2b70b77a6b0ff419c163894eb91cef69177d40548ece6b8b64e01e7e4d0970ef164e34e08df7bb48f5724bea1d0e91bbf186fb3c2f083e7146cf51a209da970076debd595c903427306093b9e7dfb9d17790d96dd5440f518dc36a497fb45727c98ca1636b8c071b0e99114c8e02b02036157b77f5f466929656d8d2f34949db9ae2919d4f2d9ccaec962500941a2d4ea97f41d915abdcbaece42ded28fbd782476afe455c077d8d66d24f748e7889a34e48dd0fc8dcda411e05c9e6753e88c26ba0581a36ac21f8e9f80126d1b04dd4810cad9a6409c7ab96364d5d6c93f5f2840d2f8a438e1283f251da85f253e2490e3523f79bb55d80e1f018b0739e77b90d1bf4f4272fd7b52c8a5c1084d5ff77325ce0a5c451e4378dbdcc9e1ea0b68c7357490635f3da12d50bd654fdb8fde599de54336281f455f619d964e26d1ac363498c3f148ca213a850f9d1c16f562aa1440f1f1aa82652b77ebfb363361d14496d3eed375cb83e02f43705747ba0acf52871c74146c2c44e66eff7f5ae45f5822cf1bf12e6950861501e7e9b6055f2e1f61cca7ae07201375cfaa12e382dcdca1315133bbcc0f9600f009b8abffe83043760a72bf7bcbfeeeb604d71662d237dca49981631b4877b8b8dead6ed02d3d856fddbd91f0b56e17ca16b63badc8d198cefac3707f839105026eb0469fb6beaef44e706a8d64ccbab4e798998a4712a0577ce1281f494caf76c2aa7d940c1986ac6473937a627e9d1c7f637922d662bbe827c3d42421107dbbe18159d9b6b8d54027ae54e037ee89a8e701239dfd29b0290452bbb59445387ad31f23933c0163579f0af4e7698245032658df2244cf48c11a7427fb2953a85aa16a22ed275ef89ad56dbdb682a49bd34452f5d934bc4b5971125e1d68a29504524ca00dfd365bb1d0c1f5760abb51c14ad6aceb545881981215a944d99ac71feeace31b49f1554398ece54e872f30743fcb4e802c0cb1270463509805a405547e71344090f6aef836d8d567836700952b1b21bf453ea5ad4fe69b407326194b0885dba35caf2e7ab16b0ce885cd89cb17ad6ed1265823d3fc84d265ab8ac9ab97cf206e34839c6e118fd4fa16c892bf0a697cde57c0f44112273c2e3636de1c30374bc6a1dac27f5f2b73c5bdc0e5180c37950d61e0e09e99b622c49b942048dda5a3d52a1d6653a2263270021d487f25ffff86cb1eae929a19cc4e620a56d4a50171c357b25192e26a59246d48849c5ea903721de428c71b3882f514024a6b9133fdb8b0024be527de300887a76116be1de9f9e09914e227fb8ce138e3c2b3a7248fdbbe751cf47a6aff45d7a3a6964d44f9429ba43b8ec34a313956158754f1ba6f5408748b66e2f60d02e5a51dc314047b76d66f6571f90dbb26f60061f777dee54c166561e3686aa3683a138c461a46b6bc1a615933d02c70cfa10c1744407938eb71b1661513ae099f5d56bcc668f3f33dede2e17d518f995ddea173e25471b158a0c162a1ebab87ced6d775ec04f17a20da5ac3f7821e7df736273b7abbb098bc2bfc1d32f847651d2efd7e60f82a938e6631c8486dc266c6300638b37d1c353e9bc95e6e436beab5ec2fa1c94c8486af1bd0b8181a619af154a63236a39fcf077792effdd3005fbe98d7a4cf06e99aaa809d5b118fe462a12a6ff1aa3520af3e47be9688b0ec0c5fbb5c501b304018a81d0179d9d63406fe3bca3cb839861e0c94b51cb7e31939c1dc266d55d17148d07b65d918f737ce2f0e1ddc08b9bb6299e4de4931736d2e0c839dc325f263724b212f4477f8d7025d2bd19a41bca6c30cc2a3e49f68d23267382919319a00de4097c9829de3fbe9af1b4f3c0b4b2f8b8db36bb7a8cb2f8ffa84323924d12fd4d866995b34bf8bcc4e65fe8a106d3e0046419f88f5a36b8beeee20e9a49fd89b3b150997e1956ef36191454ef52abb6c5cf3a5202df8706f6bff5bf2590de37c902c7ffd4e6c8ea611288e4e658a8e15fa51e647f9d22583983d4b1ced2239bfff346556234cd22d86b140530696a04446e4cac4013a720e9e32582e05e7c0acb2b4226a073e22cfe7b4c2258055d7406833ba61ec373f5aa566ebf24c62618ace341e01a34866d65cb97e8c7cd01c5389c71ce463d274add4606a2e679d05a37e3cc1e39f7586880f49db50a20d58c3d12659160d12fa5053a83fab01a0923de85573d7a2ca6b2e25eb4138991671d967dadabf93ffb78b4bc6d031c071f2a134069ca75451fb0fc928180e0af351dd746b06a79ca194a5e44287884c1a0b178bd8a4195f111f752187c9989caade171f5f4495d10179e845a5cb774ea3c7e61552f3f66812c0a65590ba9ff84502ce9140fe53d9264f9a977703c76e120c58f9fcf1051a5dc4eb8ecb54eac5cba34cf1959ba75e18fc04013e99405371c4b3605e07101af9158cf4c1ff43ac45abd768e7835a05e06a6eac84f4aaa6c7d64071019bdd13ee99d1aef9247055ba01b81ebd1d3478857f1fbfd07ccd0e1d2a47556c1736ab453a02e5fb293a67328d373a9fd3fc5f0f256163ab9971347aa8103327e1e18a05de66c05078698bb6379be5150c7c6187437ac09cb35dbfe638e234bb63a659366f46687f77c5684ce72e46a8317a27f4c1b3fd2b325a586ac20780af034fc0e0d4ea04109015a7ff853686dfa8bf595e865443e07e30a7 +0xafbe632820e278b633260ee86ea0c2a88735afece12932ef44d5e762168bc28530a88bf49bd80ba36ceabafbeba7fea0ba783398109b10bf1373a3316e72ad68 +56464 +0x7a57070de9006a0eaba8e38cb24c0d088e08261a86dac157e8a9ba779d866fb800312d7df1dfe93b243a3195bfaa62c625d31a400c5ff092d6fd638f1ea911ad912f2aabffea2377b1d2af4efeb6eb2519c5d8482d530f41acdab0fbe43f9c27d357e4df3caa8189fa7745ff95f811ed13e6497a1040852a1149890216d078ee6eb34461cfa6693ba631dbefacf83ce5ba3f531ddeadba16ae50d6eedce20cca0b4b3278e16644535e0859676c3fd5d6b7d7df7bbe2316cc2bfa7f055fffc2835225976d9a737b9ac905a7affc544288b1b7d6dad92901162f4c6d90c7ae01e0ea4b5988215474d8902fad0f85bfedc351e51e835747e3ba625086d63c7832aa7cc562119f9199d55a8f54cf2f093c4f3f6ba1be5f0524816d0db321e5e3bba9af9998503bb35158d02b823621b999f3225145d219ec2c33f88bddb7ea7905a52cd1e58d1e41032b9a0d208d84576b78a29df409ae836398aad3eae174c278669a75300f6fc319145f3d171c7f6b1aa7685995a9465232772cecc4e7ab457cb3a28b611f57c2fadcc7c14d2b3b7e0e461c8c10fb08e2ff9a25de5111b68a7a56ec1d5f05fec50e4b7ca3ac02e017ae1d663f4d471dba33c73eb27ba7bd19d8151f3214098b54bd2823eb1be995bf64f6ec7933d5ad6337c71f6f28f0ea7b00b9e3d3677327f76f3d679f812782fd98975942acecdf6372626f1d42356337580ae207408af9378c50edc9c805d059b0c953a2a0d5db444b5fd7c5b0be50d54acfc1d687972a9b7c2a6070d7cba75b155482a2f5d9ca8d2c88fe6d5ad3dadd3dd22b4824e2e1aca793669d96c12e8c2f009049943ed4c77ca38d2028bc29d899d9c66600b347f07652a757ed2e8e73669522a0654c2079a2792be302c0644ec5ad3a37015284f14f31cda6c45cee9923dae3ad504dd72b08d281c0d029b3c52b1630c31006bf379bf67d9203917784cc98787a3e872066157636be7a3d3fc732db501316192048c36a6124921651becb978c0f154324b0312cf3e5e84530db42c6412ef9d1d0ae2d5521635933a3cf869fc572bfc90a94c4bd603e0388ae8ac39dac1ca377f7f1437f6558412f953d6778cbad2261fb9736f224d0b150e05a1d2938e6fa52bc976cafd40930545192d4e947c828531f43f091e8a4dbe3eed5b9328e93e8ac482a0faf16800fe8fc5537bce1c9b8e69d1f586253c06a8a0183fd80552b54cbc3329645d4c5c734c10ff7b740bab9649eb3d72f0e2e448d41eb52da36b725f85435683ab6de3e80c6477ca30da215134988d6bec0f65334d5952109d93e457b23bded5563d55e1433852e47ef8ab33cc725bbd8121e7dc7e509d0d6e5c89b9c59518d6084b20e373152756d8f797b263f12ef45acb0ac8d9bd0c906035e0fa31e7ab021c07b3532e834b9db9477551bdad8dbcd35b3c7cf1d717264da0689d799bebe62c03abd4d7fb5625aa78d2961c0fee6385630b6d5937435b713caf182f3a81fe92bf68dd01e5dd8b270c1df41180c774db62e61e7266279c655b22fea53bd3b7eaab88d03efb383ab961d5f030a8bf8d5feb5b04dfdc1a55a49c52c57e2877bebe587a52e173fcc0dc2a991efc002d099d5ce8b4e421c233b960bce13c88d45f7836bbd98c189199f9b6c5e4d5ff9675ee47fda341af85a31e58cfe652c5702692d6cbd8a131ad32aca6eac6412f825efd2d28545afdfb204de51a594366e1b0a8a938d4c35796376f6b7657dff88721348cf74ca2958937b2861a9e91059f6a243e71626502e2f4bc8506fe04e30b691ee7d8f0ab0ec65606cc4f4acdfa0fdf9ff703e608cc2a171e840b4d5287959326be4bf4f6a21907951836c25cecc97d66737ee4110bc20affd8f1aa4b5eac3be680ceadf82827c8f80a5fb9b02642b0222430f1205a413cfaf458b941c0b5cfd8cfef9031e949269a0328858a6f02346d99d871c9203e497a86beeee86648db680c1d50367e138d15a33faa2e0f8e668344b40a4e05ffad08d092afb1a7ebcb3eb5d642784f0d78d56af3bc2d805dc30da5720f51743bd420925290001e053ba76db90b79d49d8663bae3200b89e6d6874c811565e3495b4c2c9d2486212b894c94240fadc75a124b238c7a3a54c01d6a9a7fa0eddbceaef60fc0d1a669d55098b9a5c3967fb9c8f6256e2f5c996004422fbc266bd6224bc8cc7c2bd340890e064ebcbbc6663306ef40f6b3c4c04d27887cc53a626aeabe1ee30d97af6dbd3e3fe3e77cb0236c48b0f6c4ac1561edf3a7f2394163f29e8262d423b99d19f85d8fe9a47ae62fac2ac5c7368cc0d6d9054b2076dfd315a4155f102ce62efdb0d880f0823acb03a919a822eaba49c784b8cc980c6a523ca1f34e47a7b1c7817d5bbd78ff30f117b991d2aa5fc9329c779ac6c9687543effeb8dacb12b1194db4438fe379f1daf4742fcfcdf44dfdde3837a42529953aa830b26f1afc48769b0c2c92d08101fb225f4019fe469d1df53cfbff4bbe2ea8edee9c75c7d2fc7221db7340c0b2c5c429e17f2bcbc55b1589fc74229d94b601296eb3a94225519e5ab8b424247dc1e85391398fa70eec76f50d2cd8ab5bcff60357b4642a61dc4dae0a7bb78c409aba67e50bb02061e5a4ded5726bf561e0d9d4300b20e126e122b477167558b994dcbf537237b89cbb419fec0166fc557d3f446e2479f6d3249fd65520e82a376491d272e970efedf1bfc0c7465420851998bc888cd9ebf50b27bc4b377a61486eac39b9ee1636f41d81e9edbdbe229f2a78a505c0cb210b095caebfa6b6ae7b377e5d9f0c721e3d933a63c5d40f42f24441a67c5cb84693a3a156291b27623e337ad6a8a12f1638f73bc6e625b2323ceb963932bd4bcd1d6e882b2de1471d0007341d5d68a7af64be28abd52f5140cd84f8c5ff6ed01516ce939624b5903f7f174c9a23af665a4f5c635b095d672f2294bbd508fdffbf0e48363fa3e48d59f9e7f6e5a201f59757568e8d093c6e3deabf820f05c7153b626ff280221aa8fd0efdf5784efceff72b310c9a3b58d0fd6459ddac6c66db1ab1aa5af035b47d992ccdaaea80fc9ffa2980600b361f2a0e5df81165a3699bcd8a9bc218554e759ee1dba984ee8d8000e0a91b68800bf3b1062edfa3512bf1d44b98ea50e7452baebcac53fffe2c5aabcf2fa13a8fbba8a61b429aedec3a57cf733616428234fa292bb44cb426557a6b6398a3e9db8ac35dfbe7d5bddb2147ffa007e865ac9a8baead97e64a0d9559c04c58660efa15ce492683129bb46d3d154062d322cce23a9fb0abd30a0a68833ac8039a0241d943e839b8c3fffe6ac180d2fb590279a8917cd37475aca34b814b851ea27c6931aebb93dd7c631fc65fd2e6260c9d295a1ae69496608a6ebace72f1fe01c5d6db7943c375be5daefc727be877405b6283513d6265f63bd342e531ad464a86f1233e115725dc581279a3fc5853a6b59b90bf11cb87d92967504008057bef386ea56794bd5288dae0ca6ec4c46fa2445b2edee44e507bdb917f79769903624295de805e6470366e906b2d759b1fc570279a1b25497440eaf83cfc0de671464e1d3b02cefb23578bb7d88a7f7ae872d1678efe657b57dabff205422e5c49fda34b477976dfd07eaabd9ee052b25e4ce0b15a1325227fbbc31554e66898f20afac6805ed6810c1e54282ad99fffe5c6169ba7d3d4fd5036ace8c8433cfb0df0ad15722d7e9d3ab9006e08d0a7a21350fb6ce4db055a7e0dc5d2cbf32c10f24142aea96fdf62e0c14815b5501a477b7ff7cb9d7326d85d83c669dc70b669537f43f8728069a092e983b5ccf2586e62c5a42e2e46c9e5735af71466465c6285fd39898a29bda4c5745bb49c11f2757da4791b33b06f0053d5f07915ee8eab1e6d9be83ca63c0dfd043898cf49690b30aeff093a6a76b773974afe57c3dd919122d38b2690753aae1b92d8b3033c7e00579e7eaebf718957016f2aa870c9b462cf88e8b462e9b95d1cf2fb03c9ed6c8100efe21d3a0fe482c6b574948fc39227b6149782b81a189eaaf1862e27ec45176d6be9e26472576b39e662884b6ba944991f0dfdea76c6c727e7008e87b9a657df8aecaac9796084fd5a7b006e22683dcb00b2a28490428b267bd0c173e5feb6f9d570d2c3558e74538a349952786d97ee522c0d10f72a3f29089d5376f1bcb92ec3fd070cc73f9e0f1e15cf82de17d7458be09a1a0bdc77a215bcb10b6d7ed2f0ef0793e02f0286725e94ff89d3f570932666d60a5ed7a9143bc5669b99a398d2af2725f7fd65b21ff448c5d1fa84f849ba354d5c50ba6801d33de0c236c97f669cb219bec2d7a57a47979ef5a254d2cbafc26c9a91e3290d948cbbf9a55efb0f305f0b9f1fe6c523f108075f7bd394bb8f94b04f92e06069c83854bc65e2904ef27468335501b57f69208b99d79fb27bc222c4e5c440a2d916d7478518e2d3a85ba8abf612b6eb1f1867881f55f7b08ef002f6f7a66264cdd8d010de0eee39adf4526361c974da659743a96a77aa238791abd2efc9f42aaab6b92d41e84336c225081b00f9da08056e4b5c05acf56fe81f83f548af4469021909193b05a06f7796403f5e2444f850f5f51c6b66880a12f231ba9cb6f1a4667836413417842840a0814cc3c9543fead6c7672654c096aac22bbf56817a614a6cc751c77e4d15bfdc41cfec596623257948c8a0c83d7a1207d850008f4d34206f42a76faa899c47b2083542651956b365efbd75616d48eb3bde392540f8717ae82ede873cc8407aca5b19307cec5ef72522c21e80ce6788b693c72f46fabdcc7fe253b8a56796bb7da0f860f14d80832f885306d6df7a9d309f7698f1c28da78f13937e6505f39c44703f4e72bb8fb9ed96fcb8b41ee67b1267e3fcd1fe456eae293a430c120bafd75f6a4371b4b13e07c53bcea91b3fb4d4738bc587fc99b44599a4a0fb2a33388eb515fa6ec7b971d6997c933642eadd0f48da7d544bef0afdeb6f12c2ad0ef8d317aeddca72ece8029a5bb0ec347c462b5e5caef77aa9c53fa4f602e318f3535d0db1682544e012e43e35922b5e68a2a13a8eb4c1f77e85734cd60becfc84ca74fdaa240f9c279523fbb6d1842f34551953ed394440c1ce41599b9840d637d0c36e158bda0727b12a694bd9772563efec4104a70ee51802124193327f248108c0e5701a250465296ffd513484ef7bd5a26841888262e5b37e9b6955087604d4e5ea4659612264507d2e835d3ddbe098d45030483f38bf74decd8a9a6d3917b7bae2f4c42edfa9b8da834ebdf28946cbea9f6d7095e509a8cb6e835d2dec4e43a87627e4de9aa9d4f0721ff14355f2c16d8c359c46e658d1cce4c027bb0e2ceb46fa4c2600e1e93767a17371c0e0992bc5cd452592bb21824bc6ed84a52d18211f05ee223653fc529867e5d9cbb78e6d8bd8f8a739d2082cc09b57fe7cb7b487892f6a43df5f37a91b5be373f42967094815ec9b8cd95153e3c88bef923c66711dcd5d157c623fbd68e3f8eaaad49771632a8d6d0c2fa179fdd515e28629c290556633118e1b8911f996a2988047b458657d47a648438d11a7477281e91e4d47c88088b294d9882945fa5d27f4d13200d794c7d1c1c358bd48a62e180b886b19dfb2da83112ad165f67594f3792f951d31f77a79f91db8df8a67954f9dd690891363851d939dd97a539ef695ada1520ffd1bdbf96eb111eac5126482f0a772180c1934cc9c9124b915ecde88d2e4fd4b918868fa833be871812d184ca4697439125a461a8ca337c485d5d947a958fb72b7a3add7e70cc116671e0d1739ab1b8ece9d55a1f452870f5be0635c917bd0f7a814172bfaa2201bbf6bcf7d20caec6ba958dfed540d96fbe0a2f9222bcc125d1b5041614e9a8a2422acdbe8ea774b623b2331473c62ec3cbc842742b8d8341569de9902536463b20947bee4f70ecd04ec73165a0dc0fb34580a6a38f91ebab31c159aa9998e41380bd2f4ebf71fe5b645ceeb9058c648654bbc3e7f4d0e2aa8ba9bd2a19186a73882b4fa784b193a18cf9d2d749dd15851fff010803534e878cde7bd94cbdc0a3606845c1463891e8ef27458915d80af8cfd7c8cd6321198b5be7fd7fdb8fcfeb31fc7764ae0fe279b46daf9511832b278bc880ffbc4229fb214ca9e46d967d93236d4f58633d6c9c045478c4e4e861597c5c9166b8bf68220596e9cfabdbb3e25d4533640eca1998076308de370f92d7ca1a63cafd9fbc47304c240a3c655a21080b8d5257bfcfb7e422c8abb1fea7ea9c8a5ef333ea0fb1c9f6c15bca3c58994b48c4e8e523783fc4191ef3fbbf89d81a35eba903a948a9f91c2a8bfa69978f4f8340ef61fefb79ced1737dbc5a1ee96ea270b315e34f77e847c66276f3fd4e3b44692e725840ad2bd130129dd55067bd5957da10a00c63bdfefda7e6e2741d3814a76fc13a2f2302a1bb7a463a069832e306e69ce867b5a1ca3724f13fe3436e796278f6abb0227cca7e7d5e9128c6f2c7e79f62c448b4bb32dc9f4011310904fd0212b8b4abf3c1d3dfe28ee09d37288d60cc0a3b97a934be54e17b6048b72328ef05af5c08dff84448737d314f33fabedb373c563cdc33f608b249340f95f281911984abaf2c4aa620f6d38b250490e1bfa69f1c1f95e1635ed952966eea9a905116dfa98822de7fcf343af707f1137e74e2db95281c658cbf203f8d4d0042dd95c3675f7c0bdd5abdf5587bdd41ab1e62b399c940b8e8f9944db822941d13f1c6e9c5d4712d6ebc5201d5228f3d7f48f1e081c14db392334329645c2b8a35534d50a11050d2ba2ff61f5af1062db88489333a8438538ac1367cec43fb8fcf8b90c0a11c0240e83a11198ff228597d5a92726d1aeae1f92bd30ef7dfea730922f90170ff6ebf21660bb51b2cde08f7537466c18c4aa406fa84a62e39e1800c9fefdab4c17b998d394cbca7a711834ef697d7dfe13fe6dab5b00e3958c9fc008ad915166b1314533d3cf5da6ca713a9cb638d6e21b3ed9ce4be0cbf4488300d6c21783d041d7a9cfa432a5d828afe305b414f17548d03751018696806086459cb2eccd29480118ff7ca21d7f1a08c0d2d97e68283b56e8dc025ecdea52fe00f3268d87c24262255bc37a3f1c2d30765cace1b56b612760b7c4d5fc629e7eb55263766e4baf6f415d1f47853fc09b563b84fb43bf38e6518ccf888cb9b17ce5331033cb161d8d1f8bf6768a4a72ce02c818179db441081db398e319302a7d233da34238c1eb4ff260dfa3b8ccc23ceebaccb34dbb081147d4a7720c6667e3c1aa932e31dfb72c7c64314b8b571d6c7c6c297abe63fc76425881c1e0dcf8657322766440bfffb7100e91ca9c4a12d15e54a4ca7a2facbbafc79e3f21046a66aa3db360eff323545fe887cd4646110ff71cc51f0b7e8755d2aa7356676d2c6bc954e0b08a09d098be5a79b013bbb67cc92d1104ece12ae97d69a7b40e77cce962f064efc97475f8ae0cfe1faf1b61ac56fe0f0898f7e5cae28d81b490d4ba740998d65b08b39208b1487b6862f5a113231815968a13668eb49eb7f498d473702fc6bbaec257932d6ac57826c9db0355bff3cb3b5ad42bb96615b0d08127867248026b37a0d117fb3cec7ad75e2bf6c87029a67365aa83cf797ae2f4d42e720ed4c48ba21ea08ee6aa3609f69a6909fff6222dbb45172d255146e4ce1c59b48a7895936a86467664252a9c1109329b70c465d78f639a867fa0022cb8d449cc8985edf8fd82435d184032b79314f949af4d6d1a6c6bb50e22c8253161767f38908f4642c79d27a1679e06c309682d932ff3c08ceea7f742a34c2889447d5a77241726f7753163f1d660ef64f05d5fe65779d8a562b2c1b295ae949ade737c06a8a0189d72d968bce96b8513c47ef0d1da224dda8516a4ec6e51f1fc9bd34475b2ac938b4d0fd661150040361247a0d41caf68b2a24e314e91f8b90509375432c6af1077705f1d8cedb1a9625631b07b9353e1c466c3c757a4e5626aa2fa1bcc592a27b86921aeaed802392efce7c026d2b221663f0207962bba769405961ba0eea031e4a3f22a35687477d292b450645f6ca03e879352987aea7e078db5d46efb93d772bd6ae0cf138ade13a431e1c29dd5f6a3fcf238cd26e7e13bb7c3c675049770e921d692ba7da7e458adead4a012709d4cfba93aa2b45538a7203a72619e0da6ce5def80a5eb7e13281c49d9ab51defc800022d8c7b794ece0339458932c78e188ddf06b1ff15ff2f87bc94142d073ace3a6e9839a8539966d8e6bf9b8346ba9af3e93926733d00c4048f3abf512d116ee5c77db99c1b59da57d2bc61f4a4867b7ec33973a0770b79600539a30ad69d3169d583153d19b9b3eac4e5e56e2b1b429537afa0700b48d703e636c83e4b069e2f6053547595df78f885e22ed721a177a20b43b3ca40e06555fadc37d6d5733e9d30947e2bd6f3b1e9de5a4419cf3fa30c089cb6955ffbabbf09d0f7bbba0c971c0cef9c47251ee62494f5301a7d1e4d3bf663b0bbb0c032a7dabd10d342fb3315be0cb5b0ca87a013725cf9c47366fd979d3faa237b58817636498b08b7659aee0c92d1500d58661d3f37a7fdf83e3b88c4d9abb508eb2195e51c6f415f755211bf2af80e35b6c1aac22d43af55ce907635d8bb599ea0986aafdfc4668450e5e49f7b33d28ccb3822c4e7d3c1d33f83c9b6e5e2f7879f705f5c3a925e6c21dbd1732e898458bf53ee0d0d621bb8b99de910a82977091130dbb3d4e2135f0eba3e05ea030de2ba9a746546f5a54c63643e0bc897c16d1e61467d56bb6ca73f0c951b58a85372e3961d943a9647d96662316eee35befbed8a07826726518bdd583d7e1f803f5062ce5161924ce9a5ea1f2803c10a54faa733888ab02aaa5210279ef6e893b9c360ca7996f62073f916228c90ea1e6cb473e5305dd9cf5f45ff00204a5beaaa140513fbf90d18cd1d12f3c6de1079ef6f7a2667c2891d59acd36b2b441f8cf88c78304153803fdf59071a3cb5dc24c374e3819583681d7ecfb3f027aadd818d71e2a9b16bf69a92f51d1f58dcf626d20bd77b22661fd6b7f5c8187c453cd24f0b6a07b50b1833cc387b8b811d0587027b7e9e77345650ed673a6a92dde58628a439d1b4f98e11766c4ae61e3eb14f3d0eff71fab4b494066e306fd23a7fa5ff82768f16feff3c79d7b1b69908a4876a0a837c14b0e2a9ec50d2ada223b338bbee4aca42e214bdbbc1d9855943833771b831482dee8897855549ae6b6129454630dd08a26d749b2674e9dac6b7f9653a60325cae384d67bbc7bdfa96bd88d7879056d49d67c7dea1370a3e482bac1bac4aad40fd54d92074ec551789fc79f36656ddb39b97b78f1351643847694460b1bdcb7d840ad5ca9a0e3a8faee9a3a3cbc99c2f04c6eab4660b1e502b376a3d3003b49aaa24e96e147394ea6c4bafee9e32b8cf41bc085881ad610e5c5ec6b812628f1fd668bc13ca638aae2ae944ddc7d95c1bb841ba804c7f54fb43a6ffdc3d23849572a0f7c1a4284465528c0b762f06ae9cd21da836afc8209e46d6bdae9a8dbd83e59241808a09eb964bfcabc3bc01d6d9f717798192d2ec7fceb8aa3811ea5f7197074359644da7ca7d01cdcc5711fd5b90f9d56adde3e12744126c818b8095e7f0c6a5531a3d9f8850631998e9804ba8038966f77844271d0eadab91ee99856e58990e779421fc582ce9362f5894e74aba90d1324b3de5e996511071247b578d374626ccbb41e5c2795dcd998e96fac91bd5c1233f15431442c54228136e34cdf596965a75e4834f9f8585de71cdabab9022dcd13a166a257cd3eabea5bc44b5fa510629ab53fe8606290707eb83237a803dca44258682a4ab41b03cc0abaecdae3f1d4246d77df01613fb1ce3fe89bd53ef3484e9aeb21a36d83ba94e859b9d7a2784ac2cb62813380a0723408806fd7000c29a6cd6230e8760340d +0x6be720da8b47b9ff169100d51bc971bc9cf9968cfd305c6bc4b34f9fb233b3dfd4dd0eb59def8f329fb60a32be902dc8aa3aeeb8dd7c1896d0e0bc30ac1a007e +57256 +0x3a37e46306ac3e6aee3cf25d279bf920946f6c383af99a8af4f8576567ca97c339d53bcc7e252a9c7356a4466fb5d31916a2a322d039d4f17a314ea05b03b412594f3b796c7cbd1b54a00955879f7ee06e96d853d07a49e98ffccc8592b0b6f3026f8d71b9fa1e6ef7dfca9157a121fd0213b2d4230520f99b22791bf519c4ef9cfbd9bc4be4761dc6de8e03c802e4f93ce1d9acaf2282aa066cfe6a6c86078d8fbcc6630c85ecb12764feb1c00cf05b83c7f6e35e189783389f037ae03ea655437afd6de324a9b18438c2a528056dab3e8eb1821731860c99862f54378acacf21fd26e2b708d4a5442381e7e9368372d7feb18fc1b378cd92e82bff5bb29b848f0ce8cb727a9615cfede37de9e75836b5df9f1546e7944f898c9e8332fe40fbf671eb2ffbc2178a8d5e92711260178240f922198d150319e73b31e9a6b5e2bcbff2d8163a287e8ce63d33cb4be8e6dbe014e3a57e85ecb315bd8c389e21a8505058578817f4f4a1425471917bc8edcbfdf789c0017e78a679da56780188bb3e136a0f8e7a6da0530969f1cd8c4956d9ff6bbd73fe4acf797d5a38b1b933420e6ef2a92f4bdcab29a3455e8665b1468e4e3827c55d2f18b48804d9ecad6a6649cbb6cc7472893cab78b05ec5ee48e77052266ebe06767ce001a1e231c5754f7691802163d7bc7c62f07299910f58610974fc3b66e266228452f9fa86e99b241d2816500763bd92d57452b9f2b027dce11a8435c6d7493228e2d4caf501250ec6f8400065fcd3a78d6a1963f0b9fe7f7eae8405e5ce65d65419faf985f55b34fa69c8d9878b48e3103c8f41941225726a96c552cbb00434915f33303ead85bf40e3758574f9626de8507cfbe5a4e4de2d3c0fc581636c74661c46172912ebd621ce0ea9342c6a6e9c10a839eb5583eb4d062a060ed1e5bf5cb8fc554d0ad5a224925cf0d00ea70db5e3dba2af0e49c0545eddbc7ae0b93dfa9b1d93b37e8a4ad19727ff4f866373ba30dcde38b88086caabf18fce7a2e15c82e7178615753f7b0453681b97be4c7336174968f396e6435542f2911868e704ed7bfad617b78d14a05531c16d77432a9dd6b72ba7b5b831fc35c2f4bec1f7515ffd1d9bbd441ff263d44786f8159dca30c8919c364910a0f5f434c84942a4da40f6da57549f5aacc57d23ecb61dbeca9569534b1de57228e90ab26c566f61f836d5cb999c1def9c5b9c516335f448b4323596a8dd0f4f323be5b65154acd143b8365bc2e26421598cde5a7ae63dae0fadb9b645e21b1a456511cb27d28f55453b852573d5f6a25cdf9fa9a4455e71455e624c92cbbd65eafb1b6b504e8b7065373ea31cd549e52eda7cb96fd1db14eddacbc420085ab48b747f115b2725b52c31ef4f3e6ed26c47f3e2144e2a381b718962a77e167778bf579957a8fae29612c203944901249a20b26c44cfad09e77900a380fd749844ef1b0698ea484695b16e181cdd4ab501419c67c554e8a52b5cd71acb3ea1318ba345536f6f8dd626807c99335b9a0834432881107e4bae39955344f0a23ad7cf745cec45d939f5dae8940392548d92a57ddd34a0cc6499a4cb2b9e9bd8900f82cac85db697eb4a25823ae3945883e8d78a310f009fc1dbff66c6a427324f2d381f2e043c2c002798c5e7b5c3c81b8f4cd0ba5cba98c209abe09ae21d5fd6c571f9e49c31161732a72c00f6ab33b2da67e9dfba391803872cd13ec508a1b57ca2e382725fe6aeefc34d3d22b51bf87ecb4e17a406cdf4f914b128e953b879975d549e22f30e25a39f71f2d67bf14ac0e97608a6ae0b24c3d5f8cfbb990471ca03d58e2aa50d1a127e62b86e5a44286544ea194e8950017bf310b9b843065c6938eed8e5d0540aa0e267f466ea952fb05022cfe8335d1985fea16d6bdc4e88195ef905012f8355d38e2a3d6ca764bf56bda8a3203652eb764b236142ef3d934ef88ca8f8fd1bba2ec40209cc1b2355bccff429630cf1d5c18b0f1bd9d663fc7ea8222b49d37d76171687c021a0518157198dc94d11ba96fc10dd239d3c52221cc05212504d293821083426f9f19fd0aa2cee193b0f1d7d8a8f05ef098b78b2cdd384d4b8c4bf6ed11b9f74b1693eb24a7c9d8fb93f7b17f15821f4bb3e480cf6744318efd4a088bbc3125fd481eeb4ac7b0493343d83e4c4feb9cb0eef50cf2b05152571e76d242581453effd6004644babbca5883a8628a0525d880f92347d01863a0cb8785bfb2f890a88fd013e5b7be4bab829c692f94edfeb3cdf620259a20b701793f7ac9f87b9d1300faaa1159f80cad4f02369a9a2bccd32260e7d6cdb097cde779ccb14a9cc304ffd03367bffaa7561a3f9131ee40e8bd4ac3dad9ff4a8e7cb2c0fc244dde9af4d8db30475e38842c70bf299425c00ae8938989bdb340f374479f799156b38d793886313ec9242b96ff0b402fb52b7bdb894c74e06e567f7b328fd56719ae22f87b5ba6cc6550162bf1ae756330d5e40cb8671ce094dd7ac7fffc8033fb30f4092de6116ed74edc62050349ed1d61bbf29d73e24cdb488e010c701a767fee6901dc9ff1947372d6cfb5c43e1bdf516c33a4fd8573964a11ace474f4bd0c390a98e3f3d7ebee5eadcb604bb27dfb279d366b5e46f34a44be321495bf6644a35134e08c34c39c84b9fbb1144781f54697815d30d75a8bbaec27193ccb00adafb54c6ec388b9f26793c704a88dd65251039af6ff8707cf2f13f26ef4b81aabd0df65db34444da489b3b3f792c5d996b969e9c52506898913de2a82380722d3991817a24907ed176da258f64db01a36f232f4444bb66e4e0b9345ff7128a7997b07b8709c4416cf85e81c7d43bd06b79dd75100ce17048268ebcb435aad2771f916eeb28889593154ed75191f4d2d9d1eff766746c91acade3020da3ef500f185de10e4982832e16d2b09463af0fd6be7f3daf4201cef8bbe18fd30b8a0e2acc3b5d58365d1225431492f81214904889b6d0543f4a311499afea6f332214ae81546931b6bf4b60e43908e565ca5c197bbb37bb33efc1e88f779b47e360688580cf8d01905134c8416c97c3267a7b2fdab7fa4ee698865ce45e2bc5e5ec149511d551308dbad843a2d3c9fa1bcbf674eed1a2741fec8959e28e2150006d20c87b8e3e2675a23cba4e9625f20d66d4ce0132b694a893d1c5cf2f054ffb8b92040821db4b10b36a168ede3314c3f21d275901be184736668af468602c9fef7433feb7b0082593693daad37cc60718d9663f674367c57d518e9962b94eb441cd3ca67746c37eea4119ea9c87719f801173fb8ccce9e90f99bb0645981d0228a607488a24e5e161fb919562dc7e54d1cd36d597e1067d9546f782388501504d067c2c17d3d7179f9d8cf54c0453eeb3139715b00a2647b6612c566309626758f5839947d900e84d32f45083865a35d0ed7e0201d0b1111bf141cbefaba810f07c04d942c0c71b13bfb0ef2eeafaf1cd62d3e5afba0fa16bfe1e2704f43b11bda1e7322f0f967a984ea81a76b99ae9557a7e06e551a8bf4f91abb2c96b8432696e14ed364fd4cb85e6c419837aa4e60e3e67adc91be5356fb0d0b66798e93d99eb73518107e8d78190ec337cb57fb0a0b5762283a22cca726675790603d3f8f71feda835bf3c66355308b189f3930fb4e894ac3c6ee64501b88244cc35ab2d2b1268387d003740493700dbd4ba48cbf2dda7951c057c6fc3b0df5fe4b5d7a2ddcccd4b7f50412c6444bcf9829506ab019e98234af1541061557412740bc120b4560527633ac2f32e832453be0935788a33509fefbad8f082af29a5a5c0cf6e58b7f7145243225d51fb2131aea03dfa34a2b65132e66fd6cfc7e75f9e5b6b5672f78a5c74f5ca3272b499da7ae186f9a8f5b1803cff808befa4948a8864fc9eaa1fa846f0d7203a3cb776974b54783d8d342b75348d75d88b4e1a6c8a63ea0fa7353819ee718d3d540b9eb049827c8d8c650b794316b5834bce5f4dcde19c711244211e984c7a0265b8fb6d9bf2f8b34d9239d29124a854d62b4d7778667c8c92514d9d14ef4d5215c773156a2c567577c29cc8453eb615d56dcb31b478f127d066a3dd8ae270f50c3ff0f2ddb9fc9cb2fe1ea588ed478cef9dc0c2a9a1630c738a0b2823ae49b3f328594a1d2054f0a84da6af81b7c382cdc216737e683a0124c66dc406da4254728b966651e9c438feb71d30592792c017e4b48c5c55dfcf8b21b1fa5deec19f306f8e8ea29db63e5f44696e37c21c0b740b82556af1b83e4fa3c0124d73305dd6dc2b0a38c391c871fd73b24412ca2e8c406815d1c32e151954805400f0f6560bda54213ae3bd9fdce92343a79e02ef088a4e16b854aa1e903dda089eed7b527872f11cd086a28b4910626b89ee2d1890f21c9e482a921f5d65b6754ef22719c5abeb432433a853607b1670128bb46fcb7fbaf6a8cf4fe127d4fde439886272998e28de5b7237c1c831289b69fcfdbd6239106602cb4a2c9793959d873694279c219135a0cbb79b2a3a8134b7c972c9fc2807357ba4eac755a968e85f8525fe776e0e9019c790aa2d9f0783237b7a5d425585ad3de4967c081e5d0de9fc7dc0d27d8836eeed2ab67a67a4cfd6997c3fdcc773147012b81158fb5b534f2304355454e57048c5ed87b89a3f62f8abe2387186bab33bb7b74fef474c04b6822324a6fd0f864fd842e49041c082b0391310a99b40d2c75afbfe720a176648a240567080ecc02aad8f96aa630e7826cc778f2e0defb93c83ece68c4ca4c22d0ac59459e3666502cd3d66ad08138c83eb767da5e4aeafc1bbf2cee316db5f8d4218a4093064bffebeb5194238b605ef1f78a1b92964fd7e8875801f6fa4878fd3a34e296fcd14470a5e7a10fcdf2d91efe5c410e3fbec9c75ddc2e960e7805b44cc5c61a68bad04389f50c05b764a92e325ae521a5ac24307925de9f08c931a1dfd9458df85d25ed1e262f95e64a51983a02728d669c79ac8fc19c6277b08f4e79dc0b721a3cb7d5c8e79640c8f864f58bff73a201045ca3f83bd280d9c27102814a62575cddf88610b5da86de0345ce9e8e52fff3782faf49013b9abd737976bc90f4be1eb57a769c0d66e893ff967be84bbaf7cc6c7537089e11e081582b03526c2d070e57b04fb17ac5e69951b9860fc3f649ea55cfd3ad8f0022c3c4e841092895e27a393c49f77a61f14c8e31856b63af36dbd891fdae3080b2036e43b83752a9a100ee712dd488e5a92c2990f281c7307f1f496e2d914f0e1ebe98cfc17386e2e320cbf143ef32ab6ec6985a55f95b4463333ca6dbed2722d953f8eef52411dc2958662f249de43dc29a7ef008288c3583a636fe911845497271f313dbff9fffd426519d58772a07351631e4b195f69e60e6acb7d5b945fc6a870be0ee3c8db88408f2ce57e170b246d855bacad816e98b832265222695b63201c7d8948177b0a97eee349b8364a9783f4ee4bc5569a153fa1ca8ff16b1015980ab6d7754ca52c5069852abd3526739e9a1f51e946b506aba1fe5d4d0246851622b11ff2d1229672e75caf137e6761c35e36e6a1b98612051909e4c096c45ba54cb58a480cbaef0552ae014477d508fc287a317617d6e254f0344bd18f533e4a700c40fe6734e01291c447d88a371150e0345befc86d1da010c7bb0955bbd60f76fc689c485a109f8ce6aa551e5723c86fac8b9534136cf1600a5bee50c4ccfb46ce2baa19f228b72b5c52459afbe76abb2aeaeec4907750c844540ae935c816c9cab0b141c5cf5f566d662f68ec0440adf6a084deabe5c430bfcde586d87169e5372039289baea1f5620e9ceff223522d57d4dfec2d5f5680c1ef05917370fb835fa2c8363c6c84f083741397d4eca62497af8554df8c0da093e1f470cf6cd58c885fe8d36fb2102f18bd1cc85c064678fc5800808615f1797dcc3a8db40efde6fb7e2067fd284e9a69143fea501a3a13cff7d8d6eda10af1c6d85d4eeafe7d7b0028f85aaf75451abe9f056579cf88db57b693c0dbd961f1b82ce71d38e35d31de85f9144b42fe955e86f5a29fce3abadebbbba41764fd6299f160616766a3f2dfbcaafe99367ff492f298078abf5897aa2ed7ec6aece62ab24e4e813f2e59a549f6947e63fad220a20b74fd0148e859043870ff9c1625334b6c3be788e48632655a3dfd6f35ff00d6f813edce14f4ea34010d45758cc163ac73aefa0a2f33807b112fe486900c7b75e2fd3db7c9833182b03626bdf6c2a41c8a30228db86779d342f29970b3037bc9f0b85785109e16366d740a3bfb31dde5d948c7d8262a04b4160c86f545ebe7184bcea100904c8197624d59b84415f64d897e51b422840968b50711ddefcda6ab1ac785eff2955aeeb44b7bfc7976d69dc25a29e9547e7135466ba4ef58b0a2ca8629691bdd8189838ef6d9cf415c671cab65b53f631f2264f1bea6f4289cc2bdb77eb74dfa19f79e16d5d9f944d090146d265e7ef870053ce08a7fb5099aeecbd44dd64bf1648a877470e4412bd939cb2f258c6dba770207385696f7a1b00e3d051f2edd696a2b85d14f63709e804a8a1aeba8d5523e020b24ab558598e90b5b747b27cd0a34c3e255fbbc4e44ccac9956ff187e67cdeb92ca102326974acb6d46e929e27dc938e427fb59a3c6c545400ae94630a22aa7e2520d68a146dd37bba6f19ce36a3274d470d7a037cb73fec75f3298b3ab5f1c43e52a8dbf4ca9378dba1ce89978755dfa5718fbd2fcdfc0757c6178ce297434ffabf0f84852b6b42aaaf175cc509cdd9d0545d13b0110719489fe4d4bc46fd55dcbe61204ff0d94db9ff9ac439aaedb06a1e6893b810efa6ab0927ff0255ae9a46d9543bafcb5c1e8c1baf3c8fdb43e7e54838d9a25e2444017a47686f43c571dbb83f434f0b6219937beb32121b5f04b46a544209493365de6bc99d4d81e0710da3a8b3884199e352a8d5517afb9d8b59ed316947629b70b466252a47a07e1c4f542728f60e51f06c1ad3f724fc9de0685966bc075adb1905f1f09bc82ffcd8332210f012b228b5225a8dbfaa8ebea842275ab6a37260b35587a24e5970fb393b961cc558dd8cc627d0690776329e4799ef83e5b649cad4259fc0ce7613d7b3db38910553010c97ef24dc5b0278bb42b20a78d5ba5177fff8c2b298a8a930dc9482242c7b9d26aeeac07e46e9d1843e3d10bfe32a2a068b31792e396b719517f9fb3cc74d32497f9d2bb54796dd877e8d8abfaa7023e53a822b6a3d292d630a7e1c41524241038e88cf27d993ed339845e0fea836dfa2524d621cf07c3d2908835de859e549d35030433c796b81272fd8bc0348e8ddbc7705a5ad1fdf2155b6bc48884ac0cd376925f069a37849c089c8645429007e921d4d7e90f7cc6a87798b64a7a14f4bbe4ddc8f35e454a79e5a978267a51862c1b977557f34ce792ce5732accf9fb35c652c65837b89b1b2ef6c88ec4698b0ad9e035b2ae334fedb46f06037eb15f2bfe2c65e3d59c8624e102cdf1e0d2f2d73905eb2ed49feb38cc9aa6972373e58ea44f4dcaa60cd05552f33a44436dca686dbf1a1258c70adab3ecf75e519e28ee771fe0750f95f41d033c700e72b68c3ef6504515c145395438ca5ab19fac83bbe532c06b98a45bec606311b8e539b2bb518dfea19496e12599d75349543b90875d1c5026d7d48253f8fb91cc1163c87e0dac993e5938bcdf7588638e15a7d9c16d21322f238301e43b6a62c08dc157e79950c74475a706d24a522de86a9dca1a8405c8fd225c550db634272ec0decb98630eeb6c706e69be96c8f4e0b969ebc3402e97095aace640e7ed317f4118adf1293b881edffb5ff4d9516b1f88b8a97c10002eec1311501e5efa242a951b79922a6b1fc42ada5405809ff2fd6ef69da5722ef31e02160d0669ef71c91333a8fc05123504d797e0712ae92ef2c2a032dfe50f76079e278799b741acd3620dd68f37c54a496c907fb846d171a82a42036bf7263a315dc25a38c57527c208166cdc40f8d21a60609c5b52fd5d761c488a0a1707b243b772ef64030e851d5bc9e6539f216ef04994d0cadda154f4ff40211ad328708731b5d1cbfe82475df3b4dd95d0d373538e8987975571fa9d69c5831eaa0cf7a463078ba11654e10c6643bd03548381ccb5db5b4148f3b0e7e2250aa60a39ba03a1e487b3f91ae4910a12ff3cb8c60cb445f6a649269b1a6ceefb321172132a2d94d95044f538c494759f3ea26bff96a2b558131f8ccc8984e6b48411803dda9ab2527004c922f38f2f34d5c4ecb492309a9c0c54da2c90d86fed9af6a32e4dd370fc5153b38e03d9ad906f14c96991c65c2f0c599d2fc2cff112c1615958f65057139eb262ce780c672e652270a307dc708d9dce444a91e400a0b1c221325699db4492b14568c2afe26b427e70e586fb7e342b037e0180ad1533c699896f0138841be7d0e9e1763cb5d3a179589571abebbf4e9998e91193b5287a67f0536894d7f5f881beccf52b37f3ecb376576a563f8b83013365b730571b67bdf4740f374d5f6f54328fd2040f489ebd889fd382f02542dacc0bf3fb7178f8fc146567a85ad496b8e3ae9f4fa25e31e7ddd34fda94290876c1405a6daabdc8b2ce9c046096e2293050adbf76878130c30496219591e36e65b1a75cff59763162918c57e887f4715af811b511256e35ef8b5d1b7c7ff0cf482bb56e29042edd9bfbbae4a884a80989585f029802819bcde09c7fd7c4edc56e8ddf2093314417cf6bbc3d3933697c4bdffa4a73b547ecde82d8d13ff716cb795698f6a677529a6d6fe4c4130ab524331d87df5ca44da3a20096b22d8d284bd9248762db3cd6bff686d91bce8117bbaf9f6c438b55ef5aa8e86a85290d7ee10e660ef7ba084d030b3f0da6b41d1d8d41b43c09b850c96c6398a8ecaaeea7159999b417cb50220e1bf706e76c5513237a1a6bb43c1b5873629fe63b3ba72d440b4e0b6577ab023b995d39606fcfa508b9206fb5bf1c08ea166cb70343cd7e06c3e16943577f4a0613c039a436d34fc79f74dc9099d9774b0f9d7fd76bd805d863f27243d35376181bce6c254a068fca8d7626d754ea1000ae90c52a1c5d71335c0faae983be22cc01e6655611dfc19c23a2d2fc98b46fc573e51b6dcda43c922c7777a6d115bcac6696a9d946d5a1b6c2996572addee2e41008d734f862c49f55f86cfe5400c033ca5d9e01317e8ca50aa852cc2cb01606e38aacf2350fa59558d0ff7284f5b9ecadb9d6706a310ee16c8e2f7b9dde75886ee8f1380c016c2ea5bfa385dc6b26517129d7a9699394e66889500379b09df322824868d5fe64b5dd02fdbac2e781ecc52c161ea82cab3e6f4868f638ecdbc1af0517273b4d3be56f497273e0d159290a3f1632ce62de541139eec653d9cb9e54dfe1d594846e27cd018663beef1890c0e15c9814bc9ac1dedc35f6630df9c3b4813d068a1a57e786b9bdecb5674cbe89a15dc133b06d0238bde2f8ef0fc2ec6e778d3c849595bf1ce09d914cf061fcb50d9e10a3d4c18faf4d8a504045d372b34166ea0c8cb4190ff489d41e00f4e5d364a238eda034d4a309709f1f4687f1537d3e918a462f7fd0842727812f72147574ee9c5989337bd4805a37c4987cd2af7988b5a678547dff0dda2e1eb265d31b8ce7ada02659ef94309bace8a21ea127c4e9e8b989ef7dfc00374a6f504cdc263b31ff39ddf4aa6298a970e3f9d9f76cedb68d6c014d0a47f9b2fecb8fa38a35fe32039f36a036d03728365f165b2fef6293261664f9ad7358d1cdebb6e657cb448c5d38b6f90f6d8a8c4fb27e0eb51fb1e435412b71d1febc183a186c91df46bc956e9ed54bae8b014a2f769761418e5a4e5d84db42025a81eac60a17428b38a4d1aa5a28349eb939e67813f8ff3fabca25e159dae6d90748ede4195d54e621cbe5a2d316205a98a2e59c3329352a089fff7328d0dca0957f9626ce85657a926035ea9225bb5c79cacc2e2c9eaf7b154a5f857a23900385a45810a255e0a2fb2046e42fed423f0d200e8098dfdaad6237ba9ae669ad7c4845b8043d154309dc7a9d21f4b3715ca3212145e043235b70069515c60981656de23 +0x2e232557233b61c0aba3bf10b0cbbfb953974c8931e639b6efafbac76320ddd47100ab406ce17e216463658ec43bf0ec8acc2bc3d076ce08283477c5f6149ff2 +58048 +0x0728c948567a5850603cb2a1917ac5406ff16c6ad071441d4a85bbdaec5669aa2bcda45f1ff84e1cf0aff2178b770f9e99a6b458b1c84dcecc42bd29fa35ad3d54a523c732db56f39e07c122082a76e93b33b55d8f68bd8e6008e251c02fe04369f96f0af5ea17de528e4649705ca02a3ce09600d21a3a65ee2151d9a40baac15211afafd2ef3ae4f48aaa142bd5356986f580cae2a46c5c5fd333491093b5c1f7350c3f30b0660e6c44140ba15ddeac00ba9a4128cefd7a9967b02a6b8da64a40adae4177f74463a204adb73abc43fd92770def0a6292c88525ef031dc2286515c0bc3d0e8a7ceb7e129c9f5fb90b632473005cf126d64c0b54195c8efae1195eb85ebc5f31b5aee9b50a4b761edee79ef79c0e46e46e10143d55bd26fd796e03dbbe45d1b697b5c9361f44e9b1668fe84b088f6f62051c8629ccaf4d92996cec720160cce0cc0708dd02111e3b4865ebb76d67d66941764b5ea6b96b83e91c01c45295b876f9ac8cf2dc3a7f832f718d83f31ce1c0ca2849250a64e89610852b1bd76dfe41c9ad3fbdd4487253c1bab7f6c138fa31493a6ac520372c94b7af50bdb86f0409e111078613c26171a64852590043888266b2948811ba9f4485a359f31e243395ece0ce94c130b3a6872344f4d7c3f37cc89ab1b40575a97023682f053112f3af90227b30051ad0ba0c54770f6f42a2e718f9a89223f1b3de3806b83b18c3ad1d75e0f6a207092075dce2d1f2f047ff8bfdd8616a94b523576d86deddfcbfc7a844222732f0850b9fa0d53ce5815b712f203ec484804963a36aef8832048cab18a5eef628e814f9ffff359f2f4a05609d2833b9270e36d98ad6499e8359b4bf353f4e4bcb1640525ea20be11974cd349bbec0289c6603efd4599d071822bf6dc7bb490e64a3907e84305eeceb273b56f28aebf92cb1380c489cf2ad3988331c95c0e7273bb68ce5395237a7ed8ad82c6a33be141c175e97b04750772eb39a3368f7317e9878bdef45b09dfa66c62b1fca624161b7bffcfad202bf4d3eca7b1c08082efbc311aa056ff198cda002bc98dcbe7bc944d29a9c76734817b3f55f3e3d9ae78703a8dc8d80be3008e16714fd66f074320a77c0e56645f2bdd35ecd01cf556208a265d9f141be6e94721dbab7319f348652d7f73d691ec628e72a4dcd85e3a968e6712b97779a59579b4b362f0574c4ab6419c60c46a7ca3e3684670a28e9c48d18f459e9edf9fa3aa31a11cca9172b8b8867b6bac68708e80a92a4208012b9617f15ec4d6a845725d4b1d2f5e72f710c06e64eafb166880fa97c8b78550392ca65fd6b2db5e37a017439011485649f1825c01654cfee51995c6ba5786f6757b210d45ef097bd6bb4ccd927904c60bb962f1d960fe7c56a706b87788996e40e00c9c14efed8ba302824bacbd104c8d06d6a245749c393de7a1ef78e149122c19cd8ecc2bf4083d343c403753f7547e3871ffee06b2901b2a1bde46f7f29ca776d857e429b96c05ceff3ddad426683fecb95d2b9dbe2b6f0cb8f75a1332684395d189f56faa418d113fa70fc42a124282116c96b03b65ba0e2ddd3ae9950f70e53d876874430343c9721e3e9a7ecd36a71e80b7d4a6c98c8cdef251e186eccfe380f2c5ce103bca462b05efdd91038cba354bf7717ce1472740d9477174aab11f203e85e39e557125eef0bbe40d5fa53a0a20ee2d4a278a5bf7f484300aa3a506afcd313b49ead8d722610b64402c10a4e1a1f44e8b16b6a968c68093a5724c288441505bbf5671d869c956d4e6137f996041b28bbc396c8e17e1c522d190f6f3522d5bcb4b32dca839ac36ac4b8022760a72913b5a0a1c7889b8ea541b7a46057dd3bbf09a0a69d4f68c13510d0ca9c954c728f3e0f336f732ce38adefb8a9cd7be719620847b9dd34eb856987138611b3b1d23bed9f4c98b7846896cab692b9e0d9cc9632754d3f794d055c662f37ddcbc53589dc68edcb6c9dd2b5390eb169312e7e03851d745a48130bb016da4f8bf173cb4439ea6b0dd65d0f7fb72b6649d14786409c9affdc05e0110b058f3dbab93ffc11829e74ee9954876cd19721da65d77dd3d58820334736ada3dec872d8a79c507852ff6bdc0a16d2e2f4cc84a95330dd13cc6f95de90894a30ff109f64311b50df0777e054cd166a98ad55ff252df62ca6edbbb15c665a7f28e2f203ebea3f85bc2ca252f736d5c6f477ae11dc4a89d4f3b5e7133b2d2ca50226e750ee377b57964f093421fbc7606cc04f3d3d5d8e6e90b19c2bd979625443375b06d9ad515f03cb171463707ddf8833a3f1d6cb6671e46d257bd5cfae156290d7864cb044046b4d56744a396b8cdd2e66d02718945795452d73ae946260e6cfe75fa5e4d5d0633231c424bb1300b23ce258bcd9aab7f9d61eb3d26c21bf5641050373bf894b52064394b17a06d3cddbb0ebf6631bfba8ac63bcdfbb5e9927a0ab1234a4d0fdde5606564efaa96e76876d0a62595a9b1814b6ef25069b76d14b63fc77493f305e9df4997bb19d3952cc41448f21092ecebb62cb40d24ae0f9cdaa32a9f146bb694a98deb63334ecd917082aeb6e8a2f431d01f1c1a2ff6ff783f8554b4169c774e85d869cf412c17ff40c1df57660050b961ed315fd2b6c512ad8b4e9ce2b1d07f3dd217e78a98fbdefe7ae3bfd2d588ed313efcc45417ead0ec601f3dc0d0498f9724ff9458b802967054c3d47448253407bb8332ff40f51cc3aacf81f7226be75c7629bcf1b4b38f5ff886809382aef5ad0bd08f19596e5dfb12674fd1cebded546f9b489eb59731920d34aa79aaab9ae9d7ebc5eb8cdefa5c3fee8e94fcc80a46b85f21a7e334e5d33cd63a6ce9a48a84c7dababdffcc5daeda6c2889d612a6fbf97d2d54651511e82d7217b567222d4682a758d7dac0edb98aea04f881252a3cd9fb56ed64bf1f9a87132b9c4bacebf6b15a858046421245f86e0a292889fccf00e383b907bc75b1f2be5d68becb2c5efbf92b016bdb3419cb032263f1c4867c173d9c0177927df5187d9563e7065844098e31a27012bbfeacae34f004602f0dc60f880ddbcc9d2e9e57bbd3efe5d77182207fab7d7010bc437928168ae55e48b46331255cef3f232f55b801fdf011ad0fb8fd64bc7c991b376be61eabd97df78a407e912285ca9d717d72353ab06fbf585d931553bebfe3318c57508ec6f3e0efaf57985416a6640cd9d2b7cdac5771041729056abeeadbd8e561f35c3328cc8cb6a4841a283a40a971c0cedf6c3289bceea77d2a0583ccd57ded513ca9848209604d9b9d45f0f9f04b25c3987969d027ebf5c5ba1af07ecf5de4b057af6fcc0db23b2605f42f568871e7de1f5a620eee15fb2543859bb96f8b2c59d5cd517040b6546c7abe60201aebf0679d97870bb875a2e5edcfea455d11af94dd8b92374b7381b72329e91f4dbf26a639b93f8e2e11d04cdf7f47e940f753a897729ae9d6f1ab4d28bf331bcaf773e31c47f161f8f36ea3421d196ec04302df2c09d14e8839b877b208a6dc389bbe656dc9074abd2365323d31c89d86ffa37fc4d8a02d0a52927de98baa2940b1ef7555c8e81225a79b41f944bc3c3a321ed186686d5003441fa7f4d0a8cc8a43ed5bfccbfc81da89fa189edd5c1384e55b1d9b40a17d1c18493dfb5f068bbd58a25f895aab5e81d169ff538512ec0a1f41ab2be9a57dfdd5f68628c12e2f81f9f5c925fd5d73c585cf3d40c3468d77e8bac25de9e0184d8310cba17d8680802dcee0f73d7a864baf161b8e1f5ebf7148aeab59cab915b52b7e548e1b78455ffc15ed28a16a60be5625e16521c34aa04803af48139a3edcd3286918236b48c96eb238dfb295c9c483e4d7ec52ddf6aeefa214524dea596b86f652671ec74f648c8e0945f66488053d3b444c39148b404673229eff102f0949d056a294f323d85d8fa882f73d672b8c1272ac5fd1d001535e2355b176885f269ebff10b598ccee99e5cbd3d892cdb7851a7354a7a8e96204c5d9eec832c142448d37d0d6051ee39a46f1e4eb1a0bf0ae02c0f84798daab52319a2369fe2d14bb6db6e21703cdf548727ceb41b8b7f49a74961953495e318cd9f881a32733ea4d11eecd0f1134a4231cdf5f731b5c33e8f455303156ee9533037791da4a802367fe61ea04b9fd60c88a8ba9d5ae532ef7e6a0f5882df656e36299dc95e47c60aa9792c1be7a82cb976024630fde574665dfeba1be5b2ff6fc6bc1ba5c618312638203fc92bf6f351e221c138847b32ab154a7fd5a5ad5e60c73a1c3945e5ec9412237f318050d4ddb34e523b567014c48c96840d2a992b4823e9c70e44749e5c21ca13db4f7f7764d3d121c3db8bc1bbac2af14bdc3d0d30c11245ab298ef0844b5d234ffe4c83ee29f257577b96e2985c4def182363ad1f89fcbd985dfb8a167a23d916f77ca1849df91c809e571e618348a6fa67d1b21d63f1585e4983131995655bb7a0da782c172d97c4ac981e200b633d7b1050c53337373e8454ee3496846bd1ba632db1f07fd8f1ae0d1f89dcdbe6dc2386a88e67ed179692e50394942f7d64a8a73cf3d8bd4051c329b4089edb19ad7931a1b4c36dd98811668bdc1b7ee33b07d3d0e7ebbaade08d6921436df344d5057a03e04f9fc53e883e4fb33459e4806251b134315c69c693332de1510bae7f4fc795b9126c23dd7fd514c2e5a8ca583e88a783b28cbb2a5df09f8b520ba0d1e08120e814ba3a907e93a5b03853dbed25e07a7c7733ea34740940e879db62f33f116c145d73537d0ee0c926354260679ec1f1c687373f0e5fe4d8a1cd643c0ef4dd41e6f67db6ccb62447cce35da0ee3293d60aea8202dda6eb2f5d568c764a884f6706e6c2aba6ffc7e8494a8de5a867beefefa9fa7bccd2850cc51d3c57ce82cea51b35287a337031744672b875c0c8aa051ecb89f1006a193880295d28c36ac1c5cdeb996a9a91cab36a64c7995cdac0df3e5816aea4f6117c3783d53250c9928dc611fcc404eafb6c5e27a399a5276647f85988f8defed49e92318eba9e25a8c6abaf38d198042a69c9c332bdc2360503f4d5c918d60bca66383d6e0bd5096b3827cb37d67f66c17054415e4ddb8f06dcd9d4c056b6a45b9ed2ae5f6c1cfa43aae06fe01ee098264aa7a80e901abbcf9a505e55f9a352ef0c078d48249b8298e57ea21bf0e423c3bf69002acfa541ca05007c704bc79cee7a80e1107c7b28d2b2aa6dd093b28efe9642519952a4a95ee49235f9924a0ac0aee5b2a1bce47459d70cd6e75074614199dca44561407cf201ad92d8175424cd70dd09e22cfdef961c4be8496f4f25f38edc001544a040f022fa99f6220b737e8a10edbb13ef20ef4b0fa8dc386d617b3eed6ef142ee80bf10205439fa9a7e39c2276614bbe190cd2a022089f2f69d4371b5f5c1a54fc1c793c8cb8ae927cd67e2ca7cd56afcc59983ca5739e71261b2eedc9d6db3ed8d70729a05d235dbe971b0a038e7696849b91c0f55d25de736307f0b6edeb5f06b22773d0af727dd59bdf552a130004ca497bd7a233d9da0a325eaea71faf280e445685ae2e30756a5b57887bf9976d05c9930b2c863ef6331f9f820adaab4c37f410e98967c1d6d56c003e89b0a151efb293c604c2b9a58661571562ad741e4c47e31a02cacb04bf3455c1d3c6c235b09aea82cb87ce8a9cddf1d33f167e3093b659919af590a1704ae4ccdaba5e9b20c903dbd13401f7bebc0c4600944df5b6d5c0dac246d71fa12629ba0ee9faf498e36c3bc655e88f94a212d847a548001e1cc570195cf2e1ca4c911400f40bd48160a02d0b6be6b48716821484d810d231f1e3dbf096789a4424b765215725ad82d73c1a20f481093e8ff685489b1cdebb0b8888f891dc9ba74509181091ccf2159d9cada77e4be00384cca4f36ce097f1b0400181cd93888c3402b72f226654a25a4e31ff77abfb7e8b90fe15dbf0a07e8686c03ca831c33b6830cd0d877617b163dd51996f259e180acfeb3056c15aca04e95f79b03bee6d681fc41c4f90edeb60a67715c34d5a6888f606d36bd7595ca1d449d984166c7a9a3c36dbc93b3988c7463cf51287b2d89c9fdb7f89a70ecee3d3f9dc8265cfeb94f28fecb2d97d420e48fda7eb7929f0bc29d3754eb50d694164e9e3498e7b48eeef599f6b003b8fbc0b53beac7642394e2089851985b7d45103b48e2805011aee9f0e847023f6ca4719b9a9d4137e2ae910580f889da098893cd44dcc7e03ca3a6e293c50c9319a3600a9da00e5404e0375e9850a714a2e607cb3a2a53dc5ef58f924278b647e781f4c9effa1403b0b23cd98761d8536ee6d4fed1d20e8f9e2a0bca9c69e9a2fdc594a236b33d8b0ead083ff53305dd9810622eb2dedf4025cc8150499f8bed84f7aa5b1bd47036475803578ccf17fc46ec19228555ad361a635bedf2228571a3a09dbd4564954a833c96ebf13cf4f5a10362a4f14062baa67500693ffbc0738347d5905d6b9310e9df27c1cf828613d0dca37a9ea6e514f18cd88cd731233e4b74ba9c0af254d0a2cb20a3ccaab39dfbff456d358f1e8c222f4b1e63cc951924afb4a8f5ffbfd2d588e75790ba65da4cf5b1455e04f56a62e7c1e68ad5004b36812b7ec59dbc5dab9ce6a5c4bd8313e9454ecac00b52f5d83aa2adf5534b1da87187e423d133ba4c91835710b8f591fa7783c404af1d76adb2563b4b4e5ed7a30830a3b7a50c32dfef28331bb5a399a814bafad1f53e3508d7455835cf21c14ecc8e8328202f0b8d3c3c038ebb75761aa35a35d0e79d7a1230d8cc5bdc7c22d247094b1f4a858d7d02278d10d3536e7aaccb3da98c238df245755e6480574456010ac5432cf402d8c8509a4a0425cbedb774da03ecb6b5d19e86d8f9c09a6d0381f7b73dcd65b0c51721f1e456d3d39d4dbfd486103f3cd7c47100c1a62de6014f3aeab436c1e06d76015c85d145cfb2f513f2dbffa7682b3ea09f6539f8f777f33926516deedbf76d58a1d57e63065438d8fdaac1d482f694797c8c81e3e78df55e32bc7cd6e68c848f897e6416c2a99d77be9a5fb0d15f4f6661df87d7006dde10d89c6a5f4c54440cdc258b4449dcac56fa54e0229f8ff6cd140552ba883c36b6de994073537634386275fcd6e513edde7c804c1132ae11185ea7ea76c82583ba0d5c05f9451bdd7be213beb5db76e9770bc5ac67d4e328ae076d58f1084e4f832d8dc1d9686ac53e26aad9c7762f278a6ecb070bca56c4f7d7fea31590df217906d47dfb058c76e7f4e056f6fd632f7d6e3b65e55f306c5b9603d3c8a70182045fd7404763a878e0155d3c29b73d8abad3bdceddda99a9420b23f1f496dbf98c024112a5cce7518f51ca9348ede2bfa765f84bdb82b80214ff070480a6970e79b5b8fbfd86718b5e6fcf643ae87d56aeeb95e3c7a1b6ff393a5714541c5a493341e40437da6dadb43913b6e9ed34d8362f3b9f897dba281a84ba2a58434f33226e6f343b100340f8753f913c472fcca6f79385095eed061da5d84c74629b53af03fe94f1705dcb94ecfafd1b3c97ba680c45a0308e7720ab645a8590c0693140ca3c2a4142a0d6ef66ed036e16942ae336f8f5e4547ffe2d8ae8da94a6df563f89ce0014cdf7ea71abc0aa1d1b4da57f3c548e0ef72d2909df2955685c254912095f1e505a888e82821afb1194ebb2a4e8037297c0aa28a92bc6fdf42a64922312958adf317b4a8ab4a3fc30c895daba00aaa965f71e83733666da2158c4bad86c184ea79af9a6f10a04b7630174a4294df43c62e4b1c3d1c8b2f5d52d6c489bde917292dd2a2b1f49e5349385b0985a97863274ce896f2aa85255f9f285c4d331a8fc874135607d3ced7aa69e703eb3a60b9385ffd10fe59fed0276f036b7e72d04f66d0f42cd71aac5918691dc1f9d4129677cbdaf2c6c752b05326ca8a8419a4e672e907bfb645a158119a91ec2813288b741514b4d26f2b66517b1021f48402d58b1090671bf158452492d5bafc53fd18abc03cefa7bdd332a0c066da464e74ad0dec50bb7e8a3ba0dfc64be6fd331ace9d51a60bbd3004d5df8b211c0fd564cd79d0bb35649cc60ba1c976c8911cfc0db74e028199621aa05c5fe15fa7b56dc75d62225d548581e5f900f9085e9e3b668819b4f9b2c09f22a5a32a2db47afa2b371538abc4f0e9b06401150ecc2333598e494fccafe80ced49f96dfeac729459856e60a94c5b780b614e8d4450389e6748513582c724ee60c7c71f5af648b6e2d6e23cce4121b7478f4db451816ab71034c5f8b4bf13ae1d9d90d0bb2869fc4799f51f9349d022053c831cbee62617d4e22c2bcafe40d67449eb04a7c962bf084d2bab80dd0342b4f78338d4d4f75b25bed8214deb18f2254b3a3da94faf89956f0a432f512783e74ec29b4c045adba3497e8ba62c288b711002ee2821cce68f8df588f76cc9801cb0d5b67ccacd33ae1063cd6c37dc0d1836e988acf63750571891ef618645a1b5bc110cffbecaddd6824c692874cff16b3e32bfc0236b417c9d43d8f624387352cf19114d46d0448d3d7cd1438960c2ea8482d5da3ff544608aaff83dcd1e7f64786275ddf989f262a099b845dc2b0c26a86e7d83a251e3c37f2aafa0e764107b36618d2a5d3481d73a1760b7f3ab37a0283a1925010d79e5e94871b819b5e0f787bac9dad87c5d5b887a7d12565ddfd7729a3b66c274a178377de0fbca607b79fab2de37f1ddff800a376fdd7abf5f4d15f346a17d43e4db085f7fe470102a72fe0e1cfa4fb5e2b54dd2ab71e74c506190c9dd6d87f7ae8eca5190fab12178630011286a38b0a18bb1d0d29802813dc561a2724378ec79140bf8e6a6f4310fdabf606330434ab673d4b6578872fa81d90701779bc6aedf0b2bc9c381bfbb4b3a6a705fc505d08c0e24f7bcfbbf24c72cff6b800f07bb4ac4d828ca138a1ca512cfc59090e70eac9b3119754a3d7c6831c9451de5a29e46d16faa6cc4d9f1b7e42dd4983c6d4192db779012fc747e0f77e32293e83dd44dd170c31e2e25c6fe3f2321c9201f15d92f6700089afab6077feb88946f1fd9da257a1770a7f408d2743e31b5d452f7ea179dcdd8ae4690faaa30eb91e2ef3b764de9fbe6dadb33ff33ed88e0d1df6430147a7e159edebb539751d01efc2255accb5f04f32f31d4befe9f9bdc90eae755a68b7511f52971acb7ccba9e133fd4e81e37a7282dae67ac24e2fefbaa2bfdc56e5f678039cd70509c101f81b0be15a2c70276e85e976941575606d086091409bc54a9d2e5212409a4ba837c6d13b487565dd8d62a836618f647580dad08c69d1109d07c7fcaf912822a6af090e72de03c98615429f8ca9d925576e587b191fa1cfd6fff72218c1584fe5a50d49eee57fa4094f4c57e1339ac0ec7face89e29b309ddcde64db498d4d94b64f90a172490fe4e83a9579ec87b3b1efdfb9f8550aec69ab9bb04ebdd44c8c233f6da5565dfe03df98027293024a0d42e7029345c3a0ef50b9fd0255a4f2531592c3f106e1451bef8fa50ec333cf7f65c300d151500ead60ab938cad59ef77f1fc2c3b008d65ab9c93f594d986c466bcd66d38e42a86125ff32c44217d94696cde1ee9dfbcd0216b576cab6295b971dc9380409adda7cca3231fcf6e8a71a5dabb0473f0fa251bd02c82c8eacb1f1f39ace27ed1c3d42adebdf694c0fb07cbc005856ff0cfd4f96f85c053dea185dd58751c4a25879bbb6726392ad569d739b1600a343b985058ae15be02bab36e1abd7e964902937efce0ee6ff82831608e233d1b774dfe37a7f03ec42c0b7b3885dd3bd8e1f561fe7db099039315fc24279a0f319fb46bfb65ea838b564d53857d4c3f6cab7a9d8aac6a988c724b24a2949a58d513eb6bfc2101666c07fcf6d58f6efbba0c0e80b407837f731c14455c53889c7e8a7f78ea57c959fec796bf992ac9e3599a2dc5fb2d8fa040072dc8c1f2f96ca659dd0d267896f0bbfba72850ddf198c3cc54d7d07cd3cd8bb9e44973e1712be50870b341121ead1c3aaabb8d275a9e71191030c4741439aeaac421d2ad646cb32cf6e5baa2b501a80b1e03be858946ea16fc5b57a1b597316069fc6ec567a1791dcc2f03a8ee70d7d38d7b5576e224b73c55c20a943c48bc613223c8b7df6cdf816ce9aca34f8d342a559cf28a19da310fc91f4dca0cc09823b95240f350113ece55c026004ca9357622e3162d74ba1fe7d2ad9191cbb16d2e6be298165e411f7b132cf07 +0x3844eff6b7cc4eb3daab90181ccb8947842e8c702858e59089f96dd95600b866ae647f9cd9213d726b4fca636e6166a2088e2be0c27154c28732faf360e30e8a +58840 +0x7caec9d15fb000b65233a196a792aa486deec990e7d172e53d112e7770f8367093a1407a39a599822af874bc5a0d82e81b41c2d391769b2066fe2848c0bcd3e07085251b6dccdc8f807f3e3c402caeca41687d12897102e04312edf7b8c7d8567a221fbae26df264bd91a81c43375676492ca154b70ad0ac3b15268c3f636e5b1940d76182d0028a4af65a664a75a4759955d6a203892d0db6ce7a0d3fd6bd76b5a6f417343d35878d76fb223c2fbe4e9babc6035535408a1c0692849f69ec2fb61d1fe5e0fbb3e5f0d8335603adcc89b5f6177f955732abd68515f84764230e856d00d16e53a32bdae6ac0c8637f7af51fd711eab372af84a13ac721e0f8c9c885e3ee6c78d2de2b3660b4bad156647d6897de97f1d51fae178fff90eb14c6028b78229d1f17b91e221fb1c608e43d9ac62e2e7f951cf38037bb595ff948ee2cd4273a475c6b2c0d1df228587ebb3ed3b504920021acb3a19e6764ed7fe78abe0c5ba5e9c56fdf8e76828910a75e00cea1b5a9d80c26d89897fec2d7f383242c709fe5f2ce782bf8c83b645d171f2bd238abc655d8fdfacbd0fbd39df8ae52fecd6e8b00fc269a028fa74abc52a11894e6618807fca462b1b5d917bdf3bb9fbb5f420582b2fdb20239309cacce763f7d17715f7d0bacd8f0d3311f96895d52d8c2a4d5f6a7500c9e6171eaacfef138f15855cd136a9995ffa57e4bd60de624dd84117ceb2deff22d74d5a54b78b47d9825894169bddd5234a92b3cfb15f87e4010228acedb000b35fff66cf6a03285e81b766cfe69fa76464ac263541606d796f32250102342d05e7f3e923d29fdda5786c7a03ff3737a8b26de4f9fa293b94899cb9d5d9b2ac9fd5f28c59d6a78e36d03d77baceedae7a9b9d9623c2011abdb9078a315a72a50992c4f7785d62659af2f306fc3a09345f8703e3b98332327d673a401c6dbb41cc8731d188511987584456ced22dd2f0e1de6874c52402aa5bf9fe849ffad7a76f1b01c29299141ff8302d78438f910b870994f04e8dbaabe0d81bfec1e90c017ab5fb749c1d9b53031d42ab58468fadd96e4f005da6a15c926c59558a22a37476bfe98cb1c5f64b00735b10183b11fc6076614cf95701e6fc1d8031028de32aeaa091b5d6796c307799414e8b566223a389917b2a882070a354573c3213164b5ec0bb951521462af0f9bc0eb980c9482b10a836f82148231177a71b219a82fe5a8731d475a5cd60f4fa93f8ab9f8d947e716f246c0abf27cdf03879d70b716c675dba1bffed46fb0a0490b3689cf72e2616abee8d2bcda35f25d2fc5d4f29bd0caa1d12b9e1fc22bb7f79e8f8604f3eab65273b646cbcbf50803d4cba4cf318d2d62360ad6a36fe8ed3173e64d2ddee93c8aab4f7b6d2a526674012f6ec16a5404994ade36e3bb70b69325eb3d9e86468a6fb0150ef597a6c44a5f61a16dc8ede6b38a361d65474baa792efed5fbac8b167e3c977019769a77e329f2db28bf834a5d6e8318bc95d24f6fe9a1b4b9943f7722ab472d2d597617db0b637a76c0dcb5d38245b74e29cd0bf3f074385cefdc131986c4b4c5a2f21a9e6e241dfc7f52afc2400e578e75646681ddd70f4a01d970bf4960a567057706a9ecc5141e4d8d9eb6323d9811fb60f5b60c5a78259cb016808ddb5d75d37d5289e1c72b50add6191bd373e76d3e1b2fed066f216403188b09ae656b96af9d84baf79a923822c4955f9e11d3e4b02b7bb356958989c74b34c735cf4e3dfc2013b998b007395ee19a1e1cb7dc3cf3fa7f95675e2f1b6bf0ba25be5983d04bdd96024fb7e8d884b5adc3b9d66eca7c0091ffc339607d638171b1a2949af200fe72318712b5aa66a936dd0fee1a11aae6597ef4a7ec343075f1f77d20f217de3b3ea3c9410c036744cbe6897f4ca713144c8f763a20d47556b173b85f27b615fc61e590d34a87f900d36cb10aa50f5702c1adc2608ce284ac4692eecfba515aba7283783a0fbcae75f3dc0100819eb94a8f5653abaec2f0df17f18af3187e1f0de6e9e9f5a9f5fa1c93b103f180e9ec43dc15c48c051a4c77ac0c1769d0a0c56f45a56096c7e86e5d4988347e117552975e687f720e3cf9fe893f1e84514e00470532668dd7f87db06bde1cd6b1d57ebd7ccaef0e48cf7bec1626fad338ea323dac0d865b689a9acea10f27cbf06ed31ebdc9bdb1433664b9094046e6f619edabb0b32a7fe86368005fa7ef9e4bc5f233a7c155fb6c0626fda9178d3ff7319529a9bfdd7bd5d747ee1e44cefe225f5eb4b15e324d41a345229c09383edae5cb2ffd8009cfcf6accf05342504c22bf7aea610ced3752b241b048b1c2741f9ae23722a059fc239259af954d1e08bb5ac97d4d39e14a2da79f3f459dd66013b59cd7cf9d287170e290846aa182c45aa5dcb5cc81b8e620f7d0180939ce9375ea3d7a4ad31fd035dfe4173a0c290f8f45275c6560ceabdb2766e309f2257ea49d56a73aee7a98f0eed6c089c96b3ad7ad3bb9be43bcfbbacad618ce6375923e436ad7065bf32c2093eb28d085d3e6c2428c562dc6ee665e36a031dd0a297e91710c923388041a536393a8b4bdfd83bda98bca3a56ed7c240f57b6ac62db844caa9e51490f17d3e7d262d8acde42a24846cc8e7a70349daab95f2fb2e9e653ce54b2accd6dc8f97c74cb210f634dc2e0aed10b44af4e4b60d93905971be45da503cc0d270071eb8faf4f2a72e9695615460bd95f60b515d4c377c0bf8550125f4c4ceaec83ad3a7006614d6ddd4fdc64b10f60f130e38d752c9df992a2b4026b72d7ce9443f566ebfea41266bb4bd64d544e4ac09c6402d0591e08c6e07abe382bdf40a4edd4e1521c8a11d40ff7d44db43aff340fb12664fd7a86b2eb3e9663ebe5b994ddb63a20d475b45c47ce46c46567e6c2175568a17e25ebed1f5a3b7d176dc1ea9023e1f6ab0982660f59be6fcc579a012fbb3a245fb2b0ebf9681dc252e9c22c91a8793224b7f467a304abae7d8ca167c57d1b5c06a37e15f5e2adf202dc62d17ebe5071c60392f7cf798eeeed79656c84f59cb7277a9c21b1447c7acbd80c5fa3c01824037ed69cc102d8cf80908e95cacf3ec426aaa365a827f9db024f274dad6830c7618c47ad443b29befb74556a2354621188a61c7856e7b6813ab46c1208212ada64ae6ecfa5acf24ba29782500b4fb71dc20f7fc02a1e330bf9aa1343206566eb8167a47a81b2b2e41a7c7dfe0efb9e57674935d3ae35efe9b392d56792af95694c4a81145506fc16c795a0ba9b02984cfce5e7395fb94d98fcf12ae5db8a06e239c9ad439bf42e523e65a31c3bdf356cd7680c57cb32ec983a678c54776f5bd4be57517eb314da34e37efda96debe6359b320dc55d1d4d65f0486219d2ea04bf5e96463c56d3802d5b5408d8add32b45ccf663e891e2d090b32644cc8a649200aee8d3f2e3daa0ba0a576d20781f850bc107b758162e26970783bce31a79745703d18338e674bc59752b8317591b83f63bf8709a4659afe741d332d3ff832c1111e2ec74eb4c438a3032f333cd6198a3723b18059eefed1006b73f35963c39cd3d8f784d4ecbd6caaff035fc418c438228622640ac7b6e9fda824a7e9aef2dea0b59af189d7dd6a958f5b3d751e61510b2e023c1eb6694f511d6dd256a266905ffb3f97d53ccd394dfb5f56b8b297ded9647891fd84bf09e61277fb0807c8baf8f310fc21e535e1b98b3931f39a0ee57670acea0ff96221a2cf69aa67a5bf6252e532aad398bb6bc0870e57909f6f71c99ac7cfbbdcf79e6f9b6c68db43f4925719d029551e0ade4c36094ef5896287ba2af1c86cf7298934c0a8bbccab0e51eed610ff0d3fc84244e14fa08c208e313167515e87109de9d984442ea2a3b6a8ff661ab665c29e9f8fd00bd4bb2c9c76169b101875f0fec645306946c5f4949d730f17d6c37133fe174b6373ec74335f510c557f9e5ff229620b3e8d9d664f3b301a2fe591123066c39a7f0486c1fcf2cb0249196a242119175fec8a93c090871fcf896d366e3ce07b04880ff1db9f396ac714714209359e4c729ac50dccfe8b28754ef51a4d007327d2a61d948ac33c17a2dd0c8cd4d3c0e98e71c77450424e3455a506a5772327b04d00b5d9961002bbdacc74b14ea588d7f99917311503d829b8b7273fb34e04fcbabf5f27c630933cb80b301a3f53fdfcfb393daae3ea32f1e4ace050ca2913f4640aa3e7e3c8f78484bfc82e6f852741de79c249819f637222abb940855b5b80920a0a7fb58336798613c454a5e20f8ee8822d75b9c97396b9dc3b77aa8de4898be71b5804065905052dadf6ab12bccc637c069551106b43f368ed5e0166b7f598c85fda98fc680f4b350b7b47be36e1958fd613121e52631677575b548fdbae01d55c6d390b697e9e54644b428e86b7c7e12356c49830dd6b3002d769af589a0e389c7aaedb663c47b142ce6329b335409d78c62f290d993abc753b096f37a30716a767c01566308d762c6c7438c5424ae95acb1a77f27fcb4338edfc777fb0339a039e37617242bac8ab8d3b62c5c82bed53cd4f2ae67765ecd4570a6e38a8dbe93a85db66915a15d146998250baae2cd3ea3494ebf26951dfd0dffbfd6b75472ed48673cdcb60e5b985f80fa9acdc95c0a868b2621d3dd845b4ef96cb1ffebf8f5708c93d283c73a8f012aa16a439aede13d171366fdb404609eea4815c2b8b344d73a35fb1d707c5104f1d3fa8afbe55b5d8980ff02bd1095644edc62ae4f2463d2ecadb6d17e8386c182fcbc3250f4d16e3f197a916d5b72358394392113dedb0a3065865e5602a8cd3a763fa84e7edbc5c4273a1829277f994509f9b9ab5502d391e7e9f2ab5c3f9ea4eae57b28f5d31a9544ee05951725e5ffa834e679f983c58dcf725cc302a3ac3ec55e1984fc6fd34efce6f815acfdd21fe97b16146ec65680668ffb51988d7c849ffa01e6e50a663da9b55e4f5b7fb432582cf6ef17531d1657c33cbb804595f2c559d2d3622b6a0df5e9a686a52422b37edad77e75b27fcc1d9cbf854c747f25efedfabed65b552c4bf47f700c73942fc7f556571c5d04fe227ce2237f829e8a8a36e82dc4029e052656378013f68f03be1ce1ed7dbb2338f0f4533a7c088a9d0ec53984bdc9cb451f9f6d2b3e1589ebeba208c61c7571192383712ed47ea9d9e8095d782609535892209ef5fd690b24bb3549657ae474fb14caca751b4da2cdc083c25c8f59dcbc289a2b64c459896ab74702300bb0857b5f0adda1a2fddbe502b516c67c33bdec3d6cc0fc457f9b0a6a47f1da513248f65ce409392e27dbbc392db93a5f1f7d655b08ce20d343a6a03eb866b8ee123618b8e70bafff3418bfee5e282cba8591c40bfec177003e32b8cf38ff5034b8b34edd84237aa8ab196c6cb6f21200fea164cacf39735ed7d5a0761a1a34c79e66f5552c0f2dbd05644e6ec8858ee4f312d401fa948a4198f613de0c55db094bb7c89a7f1d4daecb7fe24f1380f7b8fb6c9e6bf171305afa1a7f616020b78c493c2517dddc3ee075d2a4a82842e11f80253043544e09fd93b94f9ab6095ed30f5a9777d8da86049ce321e46769df6b29c3163283998bbbde6901048e7e354016999c14e086c78d9947c69e6154472e40ccdcb41fc21a18329030195a0ddf85e77faf99856f57ee03772f209690bcfb6db8e0428976599548d559539926c2070a834e505802dba853d7a83587bdb535190dbd584114beb5899ee94ddc576135f83af4e3b8dfb74f130fee27b529a48ddb31e07fe73badeb6d537c62842e41a5291d4fbe28546f34b9765d819f632f481cdbe623dc49cbb97c996f3c3109f7d715809b6a371f880bcfb172dda7089a0666523aeea0cd8ca22fe74e255378e84e562b7452658f8636ce37ca968c78993b403b5b3ac54565380fb3a5c87c09877d637477112422ee482d7fc1468031917922fdc392ca3fe9ed8484e2901b2a79d6b5d1f020f37824b275fff35852d2072287200071101b8f3536e1a116a15a23fcd5ea9c0c740dcdf8204edd5654c88ed9f5389e604766c9919f404dc6af270a524c24c73df6424e9bc4d2ebcb06838d01f5bdf9ead0b02d951627651ab50fb17970f6fe202ac42b1fcc32ab20f8a1863cf106af7b3c762fb2341d739d2372add4ecf7cd6d61e1e7f6bec497f29b810eed8fc92b9bfb37447b8178f5c8aafe53e7289da1703c5a19b3153f4eaa8fc08b862a7c0ab78d52104386f068279c114832bc6f16d32a6b14c757d91bd315ee80a94985a9687374f7ccbcea3734774a0f5a00d29a00bcb37dc5ff48abe6fe5982c9657ca4293e1e7f597bed0f69dd16fd9fae6ea77353b1c91183f45b607990066916c767745d9d2b8c7c6f5d523de6a7a60d99cbb59fe46b4c8e62c6ca4820900ad60c8fd4529f60d816f78d680a5791ffb6fa7341e1d9f8c9671a5aaeca9994111b9269b3ad93d3bed3fc2c25c2e850ff32f73aa2d9f0e63ab691a3687159972e602fa1bccef8e8c35c03b60617f74936fa268e52d8c7a7f2f56f2d91ecef2db53c0ab43a475d0467e7a4b7a35a230f3974eefacc7eccd2949be955b59dd8ac4817da1dc6a72edb2f3f45bd6809f9f7794bd6ec9a3c8eea9212b6b84df494b7597c044adc6efcc18b9b6d13eeb7cab678e774f026827c547e024dc1c591a1c35be12fc805ef355c0fb4817771d433b0aac02f820be123a4bae3250ea6e59e44e1efa311bdd8670f1df33934cbffc36a917e8d3eb4f9035fcb2db2fb7c70d8d06de004b47e9b005f58dfeaf8479ad868cf7b1462ac0a99ea415aae14b0b3efea627acb2cc2a7afc122e31d2e6f26012fb73e3bba7bc655d89fe24ce6ee3f41f752087ce724aeb3d91ea54633cd31cc23eb3089928e9cd5af396d35ee8f738d8bdf2180801ee0cb1bae8f0cc4cc3ea7e9ce0a74876efe87e2c053efa80ee1111c4c4e7c640c0e33ed4518c74df6bd12e5f2249305977bfaf7b72ed08007188b2d4bf7d71f8687bcd294cb1c3bc73d9bacda075b9982958d6270569f22e27a4a3330a6172f18ed947ff02e621ad820a0a2f83b34bfdacbddc79e8391ed2b96dcc29cf1b2ff3d907929f9bb3f678406d07ccf28b4e4ea9f6a7b940e5f6b6ceeb1600333412c6f10c98513ea0aae6570997ee16862a54c709212f38f6e0a10f2767fe603382317ff03f5c1336a5bf6ce6a3db172b47d7af003122f5f3465a2328a96d7ea0e7fe2bbb710a43fc50cb2a0d14dc1c030d9f08e2bedca2648faab4f6c293b404a8f39c7615a1f67b11d13685d0394d95e5737bb8b2a365d12359679a9cb92be62fd97b29136a5339519b3b56c13ad369351cb089f4c066c36a2fe61b1d260bcee3776fda53ad83c079efdf89ce27d60766634e5d6c7bcec2ccf4d9812f247b442c972193bcb2ae98ef96ca25de477df8e10efe3d021bc554b16fe7d5b9f9a3d172ff385b38c0fa471d58a532dbe3f1c30de5672f9eea72038169b91ea2eeacfc1d785d3baf20925769fc18b9ac435af051b2323e282efe56a4aaf764d44bbe4e95ca3839071b9c503d4ccac039afdf07173b066f883091d582fa48af3658004e43bd706029f741b8000e64526a6fa891c6498ccca638510983215408b05d9b848d19aeb5fdfca8191a0b8d7427cade16c5a46b5c6a8d697910e6c4762aa1b778dca599426b74fafaf30bee30580aa91c7e144c27bd79ffae8f1240028c6d7ab3992ada0e5ca55ee4f3d62f8de575302d5861d73685423c2e6a6d6fb3be090fbc2a701821b6d8fd5e8233f794b6549cd0bb52b390ac31478307bffa91a9bd9c1bf93ffc846356fef008ebee4bb3ee148e0fb1893d188e4934d0d088a433d14a596c5f2e3e49648a22edc6bdbcc58dc1edbd440046b3a169ca2b68c2f5458c40fded975557524dc97d998c0cefd277cb772bd4c1b263b1d0cc824e508bc837a78fe3b119d86557e288740582eac3f559b4c22873891208a5c23c4bd96ea21aa697b67324c869ccfecbe7f9c8b7814f932bea0abfd4a7ec1135c12705a7bd7d669ecda61b2f48f244cf582f865ef3cda2640c404d9a0aa63cac79aa7e3dffa80e2b9212a915e912dd1b307063e500b7aee78e93c4e3237e4dafcc9be93852e2c7c76c7e74833473f038d88407569254de3ddacbcdb7dabb6cc622c4f1a19d75b9f9c3b32480115fa6acb6331bb890ed5bed56b00f1f17a7c37ae3eb3c7fc8a70b49007a6215681c270134454714e1ca4d7f6c093322c288775277d972dabac1e63f8999d64921f39abeb98132716f33db7b83a0e0c9c3a7b3d746563cba5d0a7164c7d82724242c276cacb085d721702d6a023bbf1b024c9d8fb92a422898ccd53f2201fdae590ff892779ae74fdfc86cd453a3772067bf5d04361c2b2b534d395903da02f0a9e432b8810701df9185c03fdda0b1e0db471cbe26f59fcc76d7c638d02ddcf1faf2006732bf7b921fed503508fa1564442d0244f27d4812eab0a366f3c033b936828825f289fc6d7249453d3c784ab38cba361d007ccb059520fa6bd25bb05143dcf27d292f2c7a70e0c6e0e1e3f9d59933e1d4babad3ad6071f0cdd7c8fac00b4867f43f77b4c002fcfca45f03c9d355e32aee87fe061333e9af1668ceba0e740e0f149c2a3c4711e30f141fa063b4a6113af5ce120c3ef7d25fcdef34984468751164a9106b1883de26b587826e8076043871f9bc8e369272277bd3c33b69cec6956cccf0ea3a423569110070933fac054de86fc53404ee1230a77c434c858d4ac5b56e9360b5343001aff3347afa305ca1e498f5a5aff2f9a2d9527c72a18f46c7c6f8c2769243171617c694cab9ea515becdc138a3f8571a49abd3556c3bb05c327d043d4d85631cfd2e3592c82c22ca489a3e98abd91c05e702538a0f6f9cee26160de218f54c75567b04b475fa034a341553d4e30fd2ff9e6f24bf73f31e84bfb0f5d06bf2721d05e9731c4576cb2819f5ad87da0b1069d818c3703a84b9c287d44862a71b6876740fed44a720eee65281a82c015948d71cb5bc36d3830329e70692336ade94142934ffd82b96e307866fe02bf98900c9e4bc8b9ddf7c6f2d75be5fad179a8968ae2f172133374c0e1e06c2221308cca4b8939dffaeef623fbc620d4a4dfdbd067b24cfca7e909e5c91ecda88fe67110a10e17ff6d24a90f3139827856e66a35008dc862e3e113e958a98a5db0c12526c861cbdfdda1c5fca23d73b090963d0e7efacd6e71257b12b50809092dc99154e70abb48f36e333376595b42faf83da20882c3e6f9bd2aa909c3b474ad069de2279251015792dcfcd416a2f73b13503bc7ab129322af07f57b63f265d9813217af80f4d4b015a79ee4fbb097fcf05f1fe300223d9505f940346f2aa65941363ca85c0b87a7007b63d090edeae495539783065cabfac7ead05c6fc6fdd44e939939af00e3e35a4291bd5dc2b79c0c12ebcf4726a7f8fbc1ef1aeb2d33f2b12f768bff3ab00d2be371d5eb95c8cb5d8663f04ae9f737ab66e3966cc7105c71f41bc5d721b6cc7c464b40c1cfe31a8e95470e970e6460dec0f4f979fc5bba96c8cf10bc1dbcc95453672667d9d131a929de50b7fbb61b9db96c6b9b34deb32995dc9438968cabbbf20cae66195ab7b52971df311ab50fef38911359d75ff030428878d2f4ec1bb90b840045f94555bb7d48e38dd229e5dc26ad1a3b4da719b6b71ce5139fa5c1578615458ce05cb2c20dab83548ad9446c6906a7c9fe7ed5c0dcdf0281007f449c4b08a5c4366577d2c1e2e70dac8ed5a8eae4e38c53abcc58991bf8a67d414d9142a5477462294bf3813438409f1040979191f60bb2f8a785d616ee0a7fb5833c54335424ce70d72e35eb9e75cb272c41475407ce842b0e507b1a0d336fa18fa767fcf35ce102c28ac54d4035989b41aff2743e5e320da8bf706d7cabb3ce18da64464da503a6b51019a347076e3328e87b3ac44222661edd9d5764fab504c7db345a8a869c2658c71934da74b5b889f4cbeec102befe17afea22eda6db0a44b4bd80d188144852b7ae4a2203d5f30bdcc9d85c276d9c3c3f40143e398faa366de9ff4a31d4d54ce8be2b473c36a957a75c3fbe38960a35948577803b38aa450c9f211e0c4294ed63322070a740a5155d6e6d0fbda30ea9b6a391da323dd31a9bc72c759ec74fde2ff371c5cd5caeec07e6a8763ffb7141ae80ab75a808ed5d2148697671ccccc654e8666f35f08b84acab391b4506faa483060c792400c0b6a70c204a0cb7d44edbf847966766058654a76827572c737a3d1bfe0d2f8d13cb34fa9918f7f12f1ecb0d5b61ec24e49a07c17cc2fdd5a26de5a9c7595017b047d0fa1b09bbe3a5dd2c0eebf94b94f067cee1bf13c0695123 +0x6064b25061c48d401846b922a6f28cf06001e0e9210a759b66b4cc6315b18a0bac5667e3edd91563ea3dc002c732d1b93857ffbee08e12939971704348edad9e +59632 +0x929548adf1febc8414d7aa90ac20dffd8090094f57e4bf541878c256301483943408e5f4c77b43f2bf00b5dc836a8f41b7e22ba71c36e97cb174734f1fb8464053426eb56dcb904fd9192e1dbbd2270f918e7dad142f5b085e7557f152cdf46a396a6b5aa997ab85ab4c9eba1cffae4e54bc88ca06781fe167a3f4a593fc96fa2ca9644a44879a7a7dbf8c1d6e9a2ce84996d266bbb93ded1425d5d1a8ed32d77527e2ed06426718979a80ad794aaac4b841e5eafc99bb16ad247fdf5a47d3eb5c0b6cabb6711a45400602d205b82ecae9e849bc8fc0a34379c77c3571b27e1d287e8bec1ebbb9ebc12b9bf4d98bc3e223b184463cd7fd5cc137523db5d83d5523a7c61804c94ef16230d27bbe6c6ef4b0c420efcd86cf48cd9b8c5dee5e177b93afa5973142e03f6b3d30d07c0339e8d64aa51e087423f1e51cafffe3ef1578c1bdb0d16dcf78bd247c3c59dbf72ba6de6b993db74a003e51e2458a5d313d32f5fa702f7f181d53d5137e7fa3f14c17104e86b3a0af6f175814d66624cc9992778d6c1731c4d7e9c52a7eaa9b98a521b31cf3e88c4c766444dae8fa006931808e9f2cf2497cae673deac5438c953dad11fc694442c9200d5b5d05b0b9b00be58358392990e7abb5857adab03e8f1da470176f2f8ccd72fbe6c5b4ef164831a79edf1a22ceaed5bbe503455b792f4bec19958d11300076142c3a7e20e0daabb0275d5747cb783562a5ad8faa051dd16f549d4b52f70b334177e3e9a9df0d7fe666f979ff4eeed1900c9f3f07a900b7136857325aa996b16b0de87ff3db8ab733a3dc07b121b8b32e6302ddd92e8003c29fecc9910e48f9783772c8669cf85b7e252d89c70a7de325f2fdf1885d46bf633f849860edca12523da94b6ae90071af351588a8d2e5675b01b9047cfcfaf2de9146282d10c304df67b490688c4a03ad1bbc8bbc419a49bad85e9d1cd344a51bdd5b00613ddcd809fdbb1fc64b7d18621f491a6b1e419129bf1345d2accadf016beba9653dbd95b646e881eeef41b9b589e5bd1d3385458ffd0083064d37a87a821da9a0d80d43d08b613d464040ed8ea0b7fd3a460b6fd6db4edf1e7f31086e6b198a79d575eb3e144edb38051fbcd5ade8612a207e16e5a125e1830a6008c36f08d35afe9c93e829d8e32b08892e72f89f7255898443a497ac129db66eaf62d4120daa192b46b61227de870f244c4ec905b62448c5fdfb040cf9d44b000633e25ebfd0efc90990166254b3e3981d4f6842b7fd27eb4cd2326c1f9190c1131ee3157136481fe65e7fb1cb194c8ea95e1c7dfd49ec9b381167f50a3a4e56e00c1d5eac43ecd4e408933dcd2011aef9642fde0e71607fcaa0eccf44394d6a75e3d962f65fa2910b769b2ee130fc9f1447e78e74db4b3f0967092155f455a3d88d5f48daf233fe6491deac90b1d30a02f18db5b7f17583fe4f0513c3d52ea913f0f739dd6468c2f63fa6de600b5f96cc48687a5d1aa5f2af3e2acf18429f252ef6e95d891e0786ca6939ecdba768ec7936c206f0bda534261dbe7adba572bf2f867cdb6586d8f1e6f8e0ff89ebb6b311a2e181f8443bf26bd50a3f95656d1e2087fadcf905a5ac54d2e33ff14010949d730e12fb1630d4844c5644cdea59eb08e3a987ce04345e1ce18ad39b0f3f37249391e1839b4b817b6ceab10b9cfdcdf081d2056be94eb0440b1de30fbe0c43aee9b217173b56a2581c0dafd8e3236ddf49bc7d581dbb4ad63ae399d6b73c61445db9dc405e17de21430866ba279172dd23b1181e0943d3d955251b77609a38ecd7ed57846c58dee0cb23fd3bd01085f3f7f7fe4414aef456442b917a23ed71b03f98b16ecddf499c9ba69ce346684e27add75652a5c35454ef3d246867fcb3987d001183e974c85e9bd96d39f16174832d9948d1264b9cdb3ea3fbc79390a7ab7a6da04d29e1032db30495c53ac3a00f5f85fe48fe0f73f419a440221171f4f11c298653f3eda111cb6e3f0f875579d22ce39d3f95d482a5688a18fe486743724c7bea1db05f4b12cb6091a041e0a8d47afa503e536570f8139bade5a03a3c37f3aaf434c900a8399b22b3ffd12cd41d33133dcea089e6f50220275e81b18647f7ffce1fa498618d24fcceb49d01a6b63d768c76e4078ca31d60aef25396caaa42c29d66abef1d164c360a480f27c6a6826b66bf87a8090a4da568277eafaf69ba3b8c9245cc85ddfc178e428e65dbf5e83af330f1340632783580886ac5de8b49b1c02ad9f840e91de8832a81858dab592a5a518a732a2487591c9a809ffe18d66e64b6d13cf74395f21089524d86d1bc84c4aabb2c1ee7635965e72607b81948b89ebe945e52f14e7a5ee568866b6ff89158c4ea298983f27d82f6c5c3b49589d896cb8a26f8fd2ecb95c92bf8e78bf7963f26813014011e0d9b4fc69c9994801676641b5e926e1f2cdcba036aa02fa0dea058e60a6768ce50da7b8f5a101e15b96312afccc74d08e45b4258a53e62dbb0a4e3837f29c0ea8f65018ac5c03c300b875cae3a40a1d03c3be892726a2d9053724ebe560211591264691ea452f5b9520aca806ea572617ca4341997cc96a710342101599c640521003cb2c16d5298d714e48d309dc9a2ecbdaf56dc0ba8092f0fe5b34e9cc0d5046000b0e2ba59b6e2cb333e4ad0ad7bd3afe0af0bcf689cf82d213bfead2eb102ae407fd0e014f9ba5a3ef982e726d47ba1508deac2e049b2b65d033175b581650f818753888b4aa9e78d27a28a3c952abc8559438a17f9a7d22172ae9c5d2d73ad4d30325ac592f59ba9317060f8a729280979dccf15921da7f6f03fcb2e9e75b02be237fdcab7e79d197db51261f0c00c64577d3ae3fd5d6063e5aaaa31bab240a405281aa2a3c716657538477f5936901c59f0728823af23f1b9b8e06d6a74833f01ce58563cdd2d1680c3a85bcad5debbe9fc200ceb5a1826d53116ea9701a4843ef160ec6c700bb3051cddfc2ce31bc96e68ec783ca8698d9fddf3b127a3c9fb2559d96f19cad7c46e0c8d6b65a972cc50fd7dd300df3bab808420c9049f1b2d1ccd6ce42d31bad2225b60ae5f6f094ef6837c251e48b90ae1ed443a1440c1a18c17c1558feedc6489d100cf007d08d6cac290767e2b083128e1080d41cde3dfdefd7fc9274964020b3612d5321a98ed338162cf08d053a8bf281449718dab7078484f49dd897a34105141c9dc8fe119998a9a37a47ec0f80c8a0ff68ec93fdbc4c0d8dc99f8488300eb32b2e6250ae564a3dfb73a7f77a879cfa11d7fcac7a8282cc38a43dcf37643cc909837213bd6fd95d956b219a1406cbe73c52cd56c600e55b75bc37ea69641bc0184b9ce9e76ca27311cf49566484f202df67d35558add045d580126876963832d7c5373584c34238f11e83bed4989bd77b85a30acaefdff5d88e61cbe790fe8be8bed5794e0a44f9a3e77525fcb825df714ab109654d60e5ef458a7744eaeb559b670c378bb8075fbaa8724e354a2c85811581b3d05d0fb08a24010d16ea9b0a807c2ff2c64315b5a5d01f7a26e51c540b8499ac948538d049c87a0fc6366a25385cc53d96320ca5d60ce14c4a0f71e581067d462a6c78bfaea139c1eb54f5202387607a741b489afbad4c37072fc99472198132ea694be9192ce4f5eeacb8a5c29a962bd855462f673fd4bce6dc8ffb5f3c59d58d022ee729e9f00e58c4110095f4bad44b76a1bdb9430f60718c3174c8fd7bc06acd9e245156df6da231badb2e2453163605d7d0524550a43fc56abb1fcb4b561c32264b100227a6635c029ffbb8033430795501d2b53d0a99fe7818f4246d3909c633a5e66a5d4b14c984c97f1e3fe0b347a5ccab21490628be0638c6a735dbbbf052df54fde4ce2ef0bde238c55d9e46f7468b5bf7f929548a717507a259a0cb571051ec4b52a22a781a64a95c00bf641eb3e855d7c1d6b5ca665847d43d3a9050e8a80cb12b598fa626db5130bdd683147a4e391f37a0c514317d078b551ba374384c46fdd366d7216fb0b0e1e9763c8f0637765ccf29fafe8f3db75635968d47aba91b5fef5c8970518f58fe1810e8c4e43e8e0efcb4dfcfcc34e7b3536da631af590a75d3ad2f0988c1b9c3ce29207c90bdf0a454d3dc2e74dd093132e3a6c8bfd694ce34db205351e2440170416c1ca8503ecb4c29888105a0ac4e58bad77349ac3ac7675915e4698b9805a2dc341b777fd8d257085d7e1b1a41693935d0d7f9446d0fffc978431c08166eda6c10ffaaa74f681a02d36c11c4591058f72b5d3b29bbf6728ebfe605f25f9b8b737b3f9e6112dae9bb72d1861953e23c614f898bd6a819442b654393c4c41a3a74db51ef27c3c96a64c444f493e24d682695d377e5a1f70911f0f26219f4797c02d9ed0985c2a1f0c1404cc9ce54b04099c6c16ba14a0e25f4fb68dd4c5127a48fcf6769e5900331336f4f82235bc96a5d3ad9e3c400cd1f26ed1d81e67aa3688e5437acd1cc5b905db9d3ba2d37e759b36a937cb856c2794a3e86ec72d18b1c80e0f43ed4d8199282a85fee66a998736efe74a2e8bc7cb8a1684b797be63d5509fe139c6943dbbc54c36a7b4a016b6bd23ef3d2efb25a51ff02c1b56c3938867c142c41f970007236838a0d51dfce977fd4a7a937d8e9d9a596902cbe3b1b4569bb94cc201d2658ca7114f118a5308ada27f6725b80b9b4278c2d4bfc7c4406657ce397578bbbd46314b1e2f8f24faa83d166eab55a3876176bff9fa17d414dc1a09f301a4c4f79a2d6d74f9d376a9adf498f6effb5f493d7ae8da447aea18030ff3e22e2ff4fbd0c300b835ff51fc07ef8c66b75345c91eadc6dd65980c34225b136fc3be54b1301d8b54acbabddbfc577a28cc0560f04e37e06b241a45508029f1008afcea01026096af26adc32ed654eaa3f6b8b5a4143fbeed4aa89a54669f16ff498ec0d48db7aa316b806adddb0d653ffc144eceb7ede9c99fe915281ce509d2c91fde101a484e4242dabbd154ab7264a8c33257806ae869eb86bdb4ea2452e3d2554a9ff13b0a4a7463bcf088559a7ac06a6925b7de4333f6269ae118847a982cd80e675ab966b1cac47723c13464e90db4fc22a47183918872b595ed2c085b9e5132529deaebdf09a5f4534570581a5746f2348e492fea681215b9b2458493f168bc4701f5203dfcad3a665e30fe7366cb5345bf91cfa55fadc236b0f677a7edc4b62dcf028d316a855146519cdf5d01e9273c7d6fec2c35ebc5f22c6868015a0e27ee503bbb241ad541d969de8241f2487701110b0de6b27625d771c2df0800ed1871c9c6317fd5441209ed1b6f85ff914a7cc38eba3b9df3eaccc62d6424a70a909e85cb77a8637acdbc247e2f93f16ca995da207b93c00d1db872d180bd160c975dcb7316098c207adc572c49d18f809b34a0e8d956e16ac585bed5ba3b169c3596e2e5950818de1f50cf5045a9a37628415b0f5becc9b2ea1af2629b076f627331134a7c0fce5bc600d110ac82f3f558a454bc8abe408e945f569faa87e9055816a6ca5485774076d4a89405c349a63445d318ec320ea6cc3c31b56f244b2eed2ee38ca4d2db3438b49b05d8d66b31c30c1f4b0bb1faa19999cdcb72465f84395f11b9f45dc2e01388f18bae22213d0ee2827c6fa4cd27045e700a3c56ebb044927a78cd90f4eb0f38f34d0d0f35721bad42d49e714fe21473639a54bab85916b064f2b5d238fe34ace97480056d7af457a87a22824877d1c0eea242dc8e28b89f184f368c58c18bcd1b278c6c93faa1c6fc96833d8091432e584a8f2335c53149deb6d8241adb1b81d08fbbac6d9d28e48652470cbfd673a3ebbcc2f674d78994fd4f220347f5ecb151d4942dc40893978dd4f856ccee6808ed1d63bf1406c86abf439c91a7b60746e71d9f585fe6eac95b441d8270822a46a798fae5defcf7b26abace3601c77326d892659308dd336136cb3ffa733ac243615210d0975e1e5447db415b1ecf383b6c5d6d47859578476791e5259dbd37e963762ce70ad743379ecf7c66c7775f6beda33fdd9fb8c06336bd976bb5b4911ff42ad794fe0d7045b7be07c1c267efa0a18f64bb1eeb149dea77de3485c6d9cc5d96983f3aa8ac65d9cf6bd2d746f0c1d246634bcad87bddcde940e8d39c16dae7e4f74e8751007f4e2a2f03d0bd6bb6c6f3c4f46b27fd0b253847ef68dd5030d7397c2aadb0727c5cf8dbbb74736667c5bc101dc880a20f3b8f7bb20c328fb678c0b03b746c0d424c61f8618a11ecbc19c9ce30aa8973d1571463978643dc54119e1ae9a42dd6ba668c0d5fdb3e029d09438694d9ed7739c1ef8707a0b73ef2e9fe439d049dd7ccf1a2a21c2fa3b2f2dc52c1b11d52b630c0496f6b2037be784906b1bd5d62176137ca3f004de703a3db1d05ef3e61399c9d4aa429cf6a63ce79deeeb377249e5f7e2d6d73ffb3fe984ecdddb603c10767a119adab75f935ddc1af82e51a8c75b00ff2b3dd0bafa9b97d89ce6e351a287711df1257da8b3c8b69a1f3bd0e41a33a32429aa63a820eefaf7a627f9c16a5b638c35c97c5c981c1b8dbcba11aec30e72e45a93654d535202dc82051005b850a5dee12d2005a0b68f78691fb0835259d4d2268f6214f2435409a904c2991d05dc787bc6f51e8e2666fc9ce329ec38946d5025f4c6999e5172e183bd9df618f96bfb7e2d881180fa565cd09aea53f64c90f0c17a1f35a80ac3f6ca85ee973c99d8da60d745894990b24b9cad7e450be0e4369175e883bfbdebdbb5f45106e865a797bc4ab9d048882f3b69a15259fa0fdb940e7e9f0e46094ee30e9f41cfaceb5cb5f90e51a0fe5f119ecffd02ed4117eb8ba10acf3fcb7b61cf0cdd5d5c0aa96ca79f88a955eb73fdf828370c8961a7989ff190d582c062b8d26934e026821e5bff28402d79906568da1ae5dbb8dc2d675368a76e91b57dd89f8c4c96d9a3c8af2f1bcb6a867da1d6b7007ffcf62117dc288ec4e6c71b1b35a8ee7addcfd026dab9f290ccf703c7cc01816bfccbd0f56b81cc5fdaad81d954711846218397b763223526d165d335bd6c063037945c54aa11ba0eb6bf6a16b97a92450e9f7af8ecea6bf4243d6c8a2f39177349fa33a3fc3ac02807773481d937d4edf16dfa79bc950f9f11f82023960b3d9bb067f761e68f8752495f8179483b68a7769986a86694887e4720ae909654d11fe767f82d0d626803f8f2d18b6af7b6080a8cb0038f7b7f181041585f84987a867b74e653c555fac392bb9526c5ef559629c1f7298bac4c0329c4cdfef568a255d909227492fcb7f7a3245cd9fd94cfc850d3dc78dfc987b5e0457fed7d27e1047cbf4d1e1aa91836a6b78923569a7d151c3cc0701035aaa6c02ddea96068bf28f2e1b6aeb10da4071a0fba818542e612f85753adb1933d6c65f86ac163ad7519c82b0fa4ea7cd3df89775172ee20b33851ce06903844b86d3e2fc4b3db68db8d68e5a8af4b8930265198fe8615d63d0bc51b49c608cc942fb55e4cff5c1d3aca51cc220c48a531722eef122970b61be3dea99d9dc7bd692a67ee94125a4d1b771f28fc7a667360595de42cdba362a876faf392a5e9799ff3c27b1a8b5a8b160a2d96a848295645328b12af2b124e9b2b96a3996cf2a3b102516e40c8c12982fa099fb61405d0489422e5397641dc4c885e14425157ae34eca142b75942db0add4fae965c9073e2f4a1f62c7bb6be3503add00e019d0ba3f91e82eecb4402161a4c4dd9803db3cceaa4a02879e556fd23f2615cec373e86de35c9478d49213d479be7e03d72123edc977d9e1f52290d7fe842cf8fcad946029360522dc6cad8cbcb275ad2d201e150f708fdca81b6de6debfed64aac4e69ec93f2bf1b5161713d366699fee2152cde4fccd809f882f87479eff1cb60107b12d3fabed45d87af128a203df006cea9db0e23bd6c3b1fd42a1eb0b2809ac1f21bbfe301e75fafeac2130eb774d490c0ddbeb80e5fadd00a0556cb88e8a0d5574dd43608d2ec3cace28d7c86ebc00e1a6cddf44b62d556028c9eaaf58206bd234fad7e341567d07dfa45e42cd34d890efef86314f45624463662c978eb510bee879836242d66edc65fd8e029b9f1a4171a7a7edba284ad4d794fc193630424019c40d859997de72ea9a2fb0e0e40f1eb25e0c20ffc0553a0ebc20dd5a784a804e423df34d8017f0f5e509f4a5ebfc4c3c7d7b7324f3cd9b9044618a017770a70f5bdd556678607f0f45e374f19c2cf6976abd8d33abf822e39687c83414fbdde577b352ed690047be2286dbccdfe642498f9a1833cf20f491185a41fa37354956fe8993e93a406f8de5bbcf3e9c7158dc53d9b92d478b3c2234a29a5bc86414ec5825bf62d3682001f448f850bb1661d81d441a28fb81201c51267e5fb0d1652fee4f7f601cc081a4b8f50009241d85c357a1e32cd34cc809d6af930fd5c465a626d17becfd8fbbfd998c8c72bfceeb2768b9bc42b7335d702d05817220843cd969725a0d5e1ff59400d347917570bc8bb8544b708f7d07dabdf0f190795b115020f9c5cc27b658f25394d6702c4d1f78af3a3bc04373edceee388b72c98f0c94b12f632f409d0c9efb95e417cdab3d75b532323abb5d38d428a4f61ff669572c86dcdd41911c3820619f178c41d33e0a3205d8e5df830f74d3fddb9fea3117a005c8da07027a0401ec7917d96e0d49bf8e7bd7c9982c9b37570be1fb8b2f777998ba038b7c0199c803ed8d063ea1861d315cd4eecca104a41d96b13ac3ab9d3ea67b00d4e5f71ffd10c1211998d61eab83707a5d642b71448b66f26479ecb17797d478ea27a5bd297abe7a1c63f539f1ed7f6e1d49100a9d0a424d82953bdcacd28a13d628539cd3a9ac41168946fe78d5505b366198f93903f46a9bfee04566c1687a9fd249e48305531d10f11196c7a4ace7b1960d63a0dc42f0b79e23162ccb35554d0bcebcc1f67ab711839e2967c35bba95cfb57358fff588de5c4b748758b84be9bd2b4c16e4ebb6212734dede98257deaf4da4eebd2d5d91920a289fed0ba0579cfa9bd09376cc348c51dddb68dd2d8b8ecc21fe1bfa98c6fd26e7d199c032b08298e372357c6868f459f4f7609297208a1b50cc02c3b48e95bf87860225b649bb322e1eaacc1a6fd8f035ca774f3f4e1fafd3d128351b68ea188a15ccb8a583c55afe4e89f24cc9b8c912bd035f8054cdfe1db5e2bb47d668d662094ff57b0f2f77b68a596b99f702290e579b6004e5038a80e2d8c2c467907d91e90278c14c681cf94a8fa46c8843a4ab12b5ed377f5ed9bfd060e80b9d0f82ac3d9a9ef2bbedbf390793494eedfbd05b86c95382743e702d171197a7d7246a236f6ef499ee5ed2f85a0aa6bba8a910a21c7c3f906430c25b1f615e03b67db87a06f5f611440a0cb9ba5c692d48ca0a115c150dcbdfc454bc61e6a7b9ab89d2128cd630136d9da0ef911efd3e3edd011bce4a5aaf4767bbd38708013436c76baf79762efacb78442c86c8cf48fb50ba43db7282a52ba94c42e75c070dd8b4d983455c4f41de287ad2f3c07be82ed38a0c1c2422680cf7aa6d0b39059111e09040890f0d83263c997570bc7f9619d3f4e6f8e5b6426bd13ab47b45997872b94469bce50639241344a6760346dd7cb08f670a2dcaeeb8d491dbb0084f3e6bdd5a6149a4b5de584af0d88c4b6e18a817ae0eb862bca77460242531d7732d7d9b46c9b79498dd5352127e2beb51f22c67f5309c3b28073f0286438959c1f018919df5af5b2bc085a74e19cd699ed48a3fe99f2e0d89a8794a2c992f05a810dd4ec487695efb226fe8f83df94ca14a41ee0f8cd6504de5a3958b988b4181fa2c315ef1ae16637d8265a55d281b15cdd420bb9c2dba01695e7327e426b40c2695c7d1c6c628013c6dcbd9e9e24b48c9b146823fbc91308dfa6185fe99c393209a90a17949fa50d9727a0a86a053c6e889edf809db7c57de17ff2a3a5d06b372bb2a527bb213eeff310ebb95fadb2c84ae75916d32d1e3c4379a8939d8e3e99777e3796096eb17f849d861aa5a37c6389f7bc2fc3b4860fac9d2277fa5e1a1f9415a6aaa5106886efd85913636f0407eed7f21195d365bcc4f24997e3c867932b7fdcacb88fc9cbdfc94debc19ab07b208ee1047213230c3480033a81558dbbe3c4bfe369713e18fa7748ece8abea89c824735282fb28c7a44f39a9fc8cf45f65ed3999e1402e33e8ea335c002a19f78ea28e41ec13dcb5bb68d42d7bf6044959023114478301e5522af78430a0a48e190f1c1bd9e3a89d22d2ba0c2619264065098e9ec4c31ef6e0407aaca194f5161273042670f4f2498195d58e267fc00b340c3a7d8087ef2e3933a61c7b8e735720d62eabdacd237f7fba0bfda3b03c736c121cf9a257db55060b621be5168619ec4182f13ef6a408c447469fc4330040b6241c5c53bb4a32eed095f207b596231ebbe842c5f8dcacf9476dbeb28f763ab94922ecba3ca48e9a8b29ea0af20b3e5d4d48e4965a3232c6bf68a0954f04281e +0x338a39c789636826a396214578166eb987b5f0b91ccdccf363ec13ad2262ce869fad36cd3eb7f89fea6b8135e2b2b24b9b0a2be7e57db1326c370dd7424e2a85 +60424 +0x0468d38487677dca2a631b79c1f0c0e6a11d0ec1064bb190b23f2c5bd775d8a937b729ac8aef34b9203a6efbc73db767efbc97f20c68c7023cf9f3232a7dbefc32f00781c60c6a6a10620ae3d8aa8e85a9586a852f70602be49a4686ec79095f3c39f26b026728c44106779abcdf4f26161810e0370884f2f24aadece410c2b99fba74d208a875b1fd4c3b893b8302347f25106decda3c3fad30b1bddbebf0f4a19d141e9e765a198a5ce0171d3ead962ca6f293168e8ffa5e75d96299b29bf78b075bb78d79dee2315feeab29ba5a3465c43fb97ccc860c4d40ae41e60ccbaaa522cf069c5a09f53a7debaf289c10f672a77e49e73b285bc2bab7c38aa189f53616fa7195c1e33aeddd618ae38fd8c49a7637aa1f837dd0050b7c504c1adcc0880b64613e55759992a8d7a41f39b986275af244ec4d8d535d5a8551f51fcdf3e128933f61bfc6fb7005d665a742bb245f7a387f164161cd14cf5b2c4d5763768a951171c4a7de46d01de5354253e6868bff90c3640600247094854b1c6ba631cb7b666130b3c664fa188c7cb7144395f21083789f457242bace8b142a029e0deb0218756c8e853b361d53a2cf2cd937ded698068fa5c00d39a8f6f13fc554f03451b11742de23b5cc54c30f5244b055957857d5fccff16f37484c49225ccfc4ec91b9ae784ca9b903e6632b0803d1d8601f484dae6a0d4ffad618849c6e176f5ce9b6a2d77f1e2e25fbbb5fb81243a687f3f4d76c1f1d94cb7bdf0975a335dbcc82325a27208afe78ba54112c180ea9521be2d900962728f25e2b4275a530ee8383b44030d6f610454cb5ab2abe3bc709c09abd307636f2b7a9839663191092cb15c5bbb94a694cd3d966937bacd1eaf309a5e9c5674fda6281706d09aadeaeea60ec338c23eb9a6c88f033e789d8f9591f8ac787137cc83a1079302dfea129298bb1106f0a84e25681daf135fd59dc8329d1bd3d1fc4a4887e264598bd61edd0bf9cbb2ba73d0cdaedac372fb25a7bb9500335b136305694f3ff15129026e12723369a88a11d0040f4ef6c9b4de6be43bca796a9fec6c7a6968d08631ff9ed76e006164da12ca7d0bd2af74279028d68944548ee1f90dd068f57875211e1f9041d9498444e73e7d271e542ecdcb8d0720165b348429681fc07e5f8a80ee7ed1a0369863351f9a98d37a9b4601e0f6fa72a903f7e0fdf9ccf26c0c42dc012b100ba0c49e351c7d64a38fcb568e8105250384d545a2d7314c8136f54a9cc6a2efe69054a1cf7e354519b69adcae2c161b452255aa2455ad32ff77a0fe4ddf74a5c38ddf0a5eb570dea8975044fb32c851da19fb91ffe9cbf4cf96a5ca599c2ee61501ba248d42be75d2aaa23bf0359a4d14c43d9990142c26642c6a5b6a8d20356d947cacb5a65ccf1a58f70e27c4ea7197c9922d8f554c3c6f91651ddb32f6f83faeacff7260fa3ef23ac5480c415773d592afda383d8a9b547e3c8e362e21c30dc8b1994e030549fcb8a386083b6fa850a7dd0c353d85e7954b371905cf2f0a5a7b2106a30d1c649c6b0824b62371a39b81a04010c5bc95a4711b6ab4a67d52982e71c40bcf9e3353ba69c0908a2bea08a8a0223566ad2a24882fefed34ab20695b3a5e02fb092ab53f5ec621ffece03a95431f1db0c61978190b24fa0a26e82099d13102ffebbf23624dc1e4c5431aa3c00f83540495e8317c238675877f3e6062ece9964ec46530bbbd20439abd1dd6c17c1b53029b1ac35a0f90ea4d1287ab3ec3e4378811c16fa4338dd8e0b95e46120f33a51b5435b01b35d0b2cb9f5853961cbd510c623832d437571f27d650642a3f58c4bf4fad7a382cd2897364251c015de19d7c144e1c943f1880e07298d37283173c7efbf6a4496af2b8e51f7246f8fddd5727c687af9cb14ea8ab4c9bf6a380eb76dac7b5a0c756cddb811fd476e5732d28cff7594e364465e0d892ee5005af41fe43514f022a96d06be7e3a02e6f543d8cb505578af95efae3f903e4624174b75d5927474afba196e47a0979cfff17aafd779ee6e86e777a0cad0e22cfcf67c7fe7c9812eda2ed7dcfc80fc5fe0d43e1e59822abd90e146fd535103ddb07fed06c3e42565cc8f111a84255291b226f6eef971efaff40bc48c851c87a2693a07d110ea4663ac642eee89977f7b9c6d0ce75e50278adbed5a17053858c34fb032aa77e4ce6ea3369621b0df6d65c733e7d13126b9976c106e647ead5c888968d757a0d9a4cfd98cb07ba30402965affef7419fc8d1ed0fb6a3d96847d3940ea5ca132d1b0ce75eee6c30a0e28587e5a8c98bfd98b672e36b468f5c4a11d9bbf2b50d6d5dab2a0e49fc38c06c6f15bcb2604cac59bb9af4ab6ad4475b27dc36eaa2c33eb0ac581f74441d2f3c4aa18da2581e3c9a55e7bbed6d62b9f97a1df7f43fcf21e284d41ae3b0684dd09cbde0ff1d7b2eb919cb91a7ea9514b38d1187b5d8aba731c930792edda49cc7f9cd4f3f2cede3547bc91e715f05f817d5596e95f9c34f4cedffc2ac284c9c90d65230d912d10afaf052cab0371fc474e748051b3fb07a8277947fe23ceaddb9b6df2e534beef60b2c1b2f1aff5d1a79378fe3bc06fdc970da81296767e9d0b12fd6a044547245036364b3e834386a834a73a30eec05bca69b5827b245d4060585db3f12a91568724ae1d1ce625c252194a59b7a5b52b4824e8c13496333fe256d5f4344d642e0e656f531240612dae2ba886594d17f5192489f74933c84199f4ad5556148854ecdfc113a9fac070c3500be79d4eae604653e04b4262e3ef8e1b2cffdee9c46f297cee85677a0a339a71b9a40b114215d69835e6a88d4ef1c8b19b1a5433e127ce233dd3d729071d3977fbe62bfc9bbbd1dacff0031bcfee4f9f42cd4159a826e1bcf5227e6f7ed7aa4819d5867880fb4003f790d9742f8f2cce69412cc5de116d2e5f9de6b53909f5ce5b98a3eebb7d2afaf5eeb400357b6625589e9dde4e937763c3699661fe5a20ef09580ac412e897a711331b26ab5a058b560b1c0cbf52094269b116dd967235956a3c44644ee58ff29387975157d612eaadb032b7f8f62ab3989bef8fc9fa3ba7c76dd834371b1bc3c211afe603959329a3b66647c228e39e994fa8e15e9a3b0d68124e9e94334202e7faeb4e753f933081454124e5903bebb5f6c93a1ff93caf95542f082fd40d974a69d3f1767d17e78f844ab729d53a8331b8da01d2c04675965b02dccea7826a3387f037cdf72936149c0966569fe84c58bc64a040966147b24e4f813a53ac64ea7cc9894454d0055ab5069a33984e2f712bef7e3124960d33559f5f3b81906bb66fe64da13c153ca7f5cabc89667314c32c01036d12ecaf5f9a78de98d93868e188d0edad59fec34487dc3220b15fe497e82497bb076c157f4265661b02ab44b1f10ecf305096827991c466c0221b853587dfa2e4ab1d27da78eb5f8aa5f1e56fcf285df2cce2618d3c0bbe3160aee1e530ba8cb1a707ceba629431ae691335624da7fdba73ec49caaf38a43a1420dfef0b3ebde7a332f06528e7444ff7181bd490121951edbb207613d37fa5e67a669a41f29e5146a77624f36c0135f6087e0bc3f11880e357d0da8f64b7387dc36030fa5f95b6396d493febacce270feb48500ccd620dfdc93f3e4c74b4bc8203b4f75d0b0bdd248c4ffe372e14eeeaca60eb932c5fc0e21857e9718addf89c424a389380698fad0d72a9007a3c522eacae24819977633b4cfe25272f9cb674890a3ac34615947ff799876d19ac1b849a1a43fe9912bcaf6e1e3896ea58bcb2dfdc4716e379b44052ace1a792ce11939b8c8f31b69895e7849e6be5437ad3fd4da8a5b4e1fbb7992692ffd56d09fc04b7ec51437771b48a9966063dc268c3fdda569dc4c80564317c35292033c4a37ef622d25c6405e141b25e51c5f08b545b8ece776f1efe84b15b7ca7b06b69cfaa611657a206bce6b4d96e94a6544b4ebf71f87bdc6d4edfc0cc4fc0ac9d5f482fffb12b40e4ff8a8a157e1607771178d08cbcf1343c5c3d07d696be3c520ed6b7d9d9955c8734946c6f762011df439b37e603209e1492662d8139e78a10de41e7f577dc1f75c5cd01ed3efaeb164b7f9c87b351437c5721dbd52184bb623750695d7449b03818fdf29abeecbfa48feca578b6cc4afc1338b9db34dcfacd81cde519b624375897ece67bdf3eb20f79aafdc0f2d9dc1c2f716e9a5b396ddb247e022f27b5de5ba861869a8737eee16f804a6751c021651195a31a7fe13c13882b69a9ae43cbcbb5257afe9f209ba1db383576bac8405e226cff64861d90fd159ec28e3218262f250169af1041e0d8249865f4143a6290cabd2b7f5a359122349eb4e79d7a181060bafbb6c0e2e60db26983e9495eae817252ce73e17166094bf2e7bbd6b2c9f5ce1bd91a994bd5c8ed72365e407c4dbb80f191490519383bc4630412c5076066d7ebabe382c4d4923d7d2759e1dc66c65e631c08ac742e3e05b9b3f552c305ebe3f1181962940bf10a50fde514c62228726f16b8c0cb719c78bc9b6a652ce20d5af6c9c52304a36fbcb56107c181a96b26df2862286628dc8333657ce68c1c53a4c266efac5cc494bb71fbc9d0562216e17af90dcc8d7c8790e8b830bd29de46291d969de5e495e76f4f7232298db5b20a0732c19488952406a13d90d24c4e6c51cf01d9b6e33ff041166f4ab56e8cc60b4f7a86689e9a3b4d279ca30d3c9450859f50aa07a3e937978d991a5a40ccda4b1a7a653019b355cd427c715743d9772b572b19c06abc45da7e99a9014da077322fd965d43f0af9edb9850396a7456badbd392cc981e0a173af160093db2e242858408f3c59c4af18566060b4b1ffb3719a23ed0a307cd3c8e8b925f6339e69955b57e951ae0cffb3dfb59097a930d7e1b590646cbeb96443f32a22149d19cee101c57ef9880872271d2b9c29d7ff5f63d82998d575bedb4b9710ffd360c7dc741233531d2de08fdcd86b8b508295d461c996912e9bb4c0479b13c21dc6cf1ab7564872a6e6bdde3ad81d65f6f419be42517e576079c29ca1c8dc75d91559101095ade27afbc7e8aae4e8330273b4a36e388af3525711f5c0e6131fef968f47e89609ab83b4253492c674fc5c488e0d4d46616ceb7dc8560cbd60c946919746a82205d6a759004b5b446ac8ecbbce834743abca15321044ed14697ac84e9995b6014969d0317fb36e27729f9a139d8ec4f61215b7bf1149cbb4d93a5c14bebd7cfb7c6fe585cbf63136338a4e9a22b52c283c56b86cf2ec0e665611ea2d2d4560d746edce9d0b9b0e3b5690f0968680e7a1d1950281dcb61ef088085bdf0fb5cc5f51ed73c1682b6cfc82ba6850f0775d297ad87c46f62d641a192695738c9627594276bc390a2db343600f9e108923f688df290e0369db46aeae748131cb6fd98ec491914c18294ad698977a1e780b1b85a78fa0ff5c482d72f2f80760f5c84ac67d45da44baa89b7dd15ae5c1e6b732ea7a131a83f8fa82308abc10493129e2c9159a7f671a310d02b361c542fbb0a57d02bb64d7647babae21c88235a81b095e359868fe5d4c082ce8b304e9de7dda07e4916743c95312b55d22476a8225274f85487d50ae81f4c2155888feb8a63b4fcb9d090f4f081d0ce6d44531e6d0a462acb1a7a733593a8de5593bc9b0b42e1f5de633821d24367d65e666d1fca3e86053dbcc49145b4055fdbd0392ef2e1d3d4274cee55c2fc4ce825e9094ed265b1021cfd57f7a106fe1088ccaa09d9c6f72234fc08033af2fc8e446adc0e1e1653cbf94ab918dfe2ffbacce773ce1868c86a880f39bcb2ede3334a5a49eff5d6faad43234c774afe969918cf2aee375dc41780e4d7e4c333bd719845d767021df2309b25a6958ab03f460ce233eccf1c76b3c01b871dd47ad7b3ceac0905cb51f6f061b04be6078e764c19af234c480b5cb9b611bbba6f19ce944dfb533eaa2955672751a0fb5a0fb815bfa47d7f2ac0e2a3e375da5d0b970e7da6c24a8426faba0f5c983a47eaba913d7f50a707ffc3a50cc8a68778327923ea697f5388da4c814381e29c5e41f58e1dc93234792f8a105ee632379e6c468b64f6a1028f3ca537ce37cf3ba0f866fb413dd7aa45429ab114cc976f222175b167eed5dc39b68b69e9eebc9ca2667585424daf7cfed16c13b8dc4492c5ea8d428da27c550ae0658420f74933f514b7a89b693830f8448494c5a5c846dc30039b20c202e16532ca132e11e395fbab93d1b710e04ae4145ad0d5a9a10fe79a6f37dbbe0825eb363f935baf2a473863909d1ff5564f24d9753433685d327a7226b519070a770f532c81243f6bac2e053467405708924d0c5a5b99526b62f76fd08f533d787944322769223346496ee905ccc2e655d8bf15809362083a1600dbe31334b1d0812c2ba6b7d02b48b35d877b4a11f3ec671d9d7e9817fa67d0095ed50d1804b14319c82109b8a7d15e8c791b4bb8303ae1cb0caac63599730583513cc987c67923bf902cbb36196ecf7e364c5e200bafcd59dbabaa4565ca4b016b70d50e47c697600c3058f2f0af6aa537a50dd3e6d98e4c82e7b0c1fffbf505f617bc1638f832bda4c27f59dde1d49405bbb75e62369915aae57625c886b7f39997eb29faac7a1ae2597ae521c471bd18d6f72a0e559247bc2b670b4fd8f86cce87eed40d41d22a5d7bf82f7cc5e692f9ad59c13ba4fe452f300fcd06813ad3fd5e338ef166df4e7e9063834f4497b810a54bae8aa341b08c89dcf58d0de3cbae9155c54779f609be3d39ab09ef099f0635396c7bdee0fc4caf5b1f33eda7b67aa7c2116ff9caeea4e906e14d13b0ba42f3cf656fc6608af7f706a49b9eeb26ca2804eddb64a26fbb0a47d07961218c4f576a3406e8450f17177c103490228f1598aad53a59210f794778f32f45d0a783e69652b1b312eb128707fc9f6ff261f5600041ed35cb3057f716c3df30427ea917d03c00c53e9172bc56c42c9cbf41d214c1ce64891584efbfadbcf9befb83f761a47a648d3ca4d02dc5017c94fda1442d4bd540d1747f98f7aa590f50704a275a8f785d79a1978351ff3f0ff73202c4102ae0f29d8c82fc459922a08325539178fdc07c28f1ec34cf41d7371200d8ca73db9c0a4bb231820ff6a42dc59f12ce337bed210992054d0c5954b293cea5dfceca40f87a79fdb2dd4f5837a6521a46209658ec9a2695349f9241e2fb0ffc6c67938a3d98685a17341fb92e93c2dc91a6b98e4f6913fe93df89295896594f08f4b3d25a23f1d9179ac431a31c85dc295c6217b9e4eeb3e362aa7574142f103deca7b3ceabaafd4c77e96c15beff9b85b83c6fdc9c0b479bbf72a0d5f2e5e263c5eba91badf8391e520bc2f6e9b48d2f208500f7fd1e4c255c7e55ee9132281306fc1cc1996e1f15cf87d0d72b39339e4bf865bc968c2438a029ef3e9d8863d4265599410c7101cb270a103701f2214b90e3289ae6d9521e5101e736665d282faa84a91a65a593972efefb86ec73d8cf75f1a4137c9a687eb592d8769a24e77e1a05c6ce337047021dc30d577932cc92819072a6b623d9b264692d7f97741457eb656cdcf4659eb49a12c01906b36f2d3a4c2ec5221a1851d3d170a1eccf5135950025b73709fcf71a5abe5c337a52f81681030f4ee1c6e58a782c8e089b00afbd826bfd69b20472250752917dfbfaab9cdbc9e5ab2f47e60ed9cbb4896bb52ebb48ba100b02278e30a5174954bcd88033b8cdd8b5372dcbc752d895ddb5e12b14ef9a7fa98ee8d3c3b096e436316f4e71a4a968fbbdeb1f4a9fdda2840e073d60c387ccb39ccacb54b63c02b10e414eed2bc706fd0802491f0d357afae8b9ce1580fc67b7d03fed7a3281255387d109fcbab14327c9f5e1ab179a7fc0ba5b55a99472e134bddaa29a9200bc7c42a11836dde29e0a685861756b573174177e8ca36a85b9a8aa0d834c612548b9d333f20211f58823678c5104650630636495bb899faf6182495b27e62c795a9a9e0c1014d34491e13c1438ee9121ed3d46336ac2905a69600045d91e6087527d279c0ab5be6a3bf27a82718a7c24d86010ca22e4e91141a063504f5b89b9c0fff4563a8b1fd0e6a59749a37e82a9725a78dc7c77065e7af1e6fcd304248b369188dd37eb9413429916fc3721410a5baad2eccfef74ac85a30fce0ccebd9623b049937b8d97aba03b7dfcb51933d1e4cfb37d95c4c085f25242266511a14508fadb1b8db7b6f4b01b40dd95ccd79abe479f01868d5675317e22a874539c3266cfa1d7e7106e98d296e41161c2b8bf4890fa1afaafb2f4d38535c6a32afac8bdbd324b002e2b02885cec3a918133da043a591c6aa2627f4915dff389fe49828e220107614768cc51dbcdabbd8ee55581a230986f1bf18f129e95d1815404ea58cc927f9312c450cf721cf74e5259cc317715116062ccaeb09e0bc331b2b98a9deb7b261e06ba2a41de3eafbc61eda8a4177b19f71d7058b372865b1390d3cdce2d0f8d6aa9c6c3697ec73790343d754a11e7149bb269179bdaba0b9f74e03e79ffd437f15256b696b22b21525fb5aca3d4cd83b6b83355ca34fb473de56b5721d27d984ab6f67e6a36feff8b3ad2d941fea2f9e0955badceffeeb08758d1a246534030ef4e2285447ba714935c316594fe1be991d04e9a2ab9f8ba0445cf9a67e0e094577e6755c5deb813134a4dec1d317cd5530f88856de1add62d4291c9f709b3350bce418a6efe967d837b84d76b576a4fac9985fa091572977ac5d49b844c5c9574b42d7d9049e6b65c6672a1dfde58baf714e3826cb3db7075561499901721284ad6a7b9da5f1d50169193f61b14bc99caf82d99394b6ce39559ce4e9af8c57fd69c2cc9cd9caecd3a93652e7db92a7ea0b9a0b8df4aab7353675e15157fae0ea07b4917ba811f9040d262c5a82a16dc10dff96bcf4ffbb247f560a78ffa4f5740fa794e51aae44bb1e519560af6063483e1942ca9b9e202eb9a62507b272dec30a039b80388a1521622054a169b7d0a82550d75cf26f2e7a6bccfba5754ce2fe802f6ff4098bb45e63f933c7b88efe084b0d1c1dff5a2f311d3254fb521a4b4df795d8ea959a6899a945f877a4cd339136b6dab2cc48697a583ff8b050c45fd9f99c9d0ae5a07bfaba6d6c5b365cb86b70b5d9c6611f257ea25bae6d773267ca0dac88fb008333aa20d7571b7523d5bd8170e1ffc4c9ab6486ee3fdad04daa48bc2d5f66ee2dd9d163ed815f6a0bd1afef51ba05ff2c43558960749e62fb727a8c87ebf2b884b4960916b1ce1bfaf66b44be2b811a323579351a1362362505880723f44865720e229cb9b11092d98a160721fe1b1bc2c8f71182e4cd52b4ac9bb567420ffdde2d9da44047ced791d6dbc1e1f97a0cc346f8a501b188c08eafdb1dbc9cf089af5a2ea7123cb0f00822e0f966e547f41ff5a37a00403a889d566fc78bcb9310cfddfd2f97575de728b64d37188929dcbd1e2117e55a8cb0c7e97f3b3a989f9a25fe33c337627ec4d8d94b045fafc9cb8508990419c72642f6af350233c8bd309905f8ec5a23ba8dffd402e6a31dcec95ffd34ca054faf4511f1b7a3dc2694d8133973306864ba4c87ef99674c9ce1df33431af010bad0c200f72da69f79cd9c7be4cd1ac9eb25085772380fc2f4aa13e92372fea1cf30c0ab09c094e3880f84b94c2d2fe580a4ca57a509656dedd06f69e5647d22577847fa6f97f30f1c0397b6b9bcf925eddf996fd031f1b64ffcfb9bd11af4fa1b4f60d570dc4e8dfd50dd5875a2ffeff97d7d873adb3b03e1d5be682fb9eb91e05e112456b42ac4f39f5e88c706c9ac6b277e872c2dccbd6c04c0b6466cea4f714c64cf6749111cc698232ff610e0c50c84a557ee4f2b4db830096f5f597a9c95c261beecc38afd3de233334beacba0a43df9e0c86ae0198d02a279c2a822e013680fd92c4a1ecf2226967e0eb912a7fbf9820802a6748bb32292beb7826b83b4e57609710453fa3b0b55f687a83e41d86149b8e32a6e0af137e124860fdced40e29e34011cb4e6513a7785fddcd6d5041c55d9b41f56fd11e997957676fd867f06904325b8c6fc2b5a0412ba8062cd48d3af51beacb5ced9e2bdf8d0e056b738fa531f250113a29314058404ba6a906a2e5d0a46fa11e412c75b34dd7470e63565efae491e22414f1081c524b2778632d469ea9731f5a784437733e25bd27d3cf06ddad9377b4228f580bc629210176a6edadbf878e67ff6fc1bdc2abc04e21643d48a1c76a70be66c0a51057fbeabd8a3b9c4b0f76ed4319a4e17fcc08f7f8b052ca65b012d06511c286c57a308aa461c0d8c08d7140efec619cc9f8efaba62de7d15de00959a30aee1f59e26767c7a81de1d48406095232882e35c50cdfd6578d0c1ed9c682e4dc93ed4233090893c79355eb859dbd2686794457b2b91af5a782c91d0fc2c2c6e1645f22ee7df3a56ac19379f4b0c2b972b54d84449cd370a899a6dce4a6cfb5c3c00350676eaf58ec39290473d7c09761ecc85fed209ff3d51213d31abad03dfe47786f5033923ae66a851f658b1d5cfe60335f3eecd6eba78c9e93f4979acbeb6b1ce41b7552d7c3c6463f5c435f5682b01ce69c3a2ec4ba79a5a414c575ec359b6f333b9c579c1eecdac8c +0xcbee0413f1f169a6512ecaefcf5a0c665ddbc5f5365749da16dd98a04b9939584004295aae3867f2697c52a28be0e42db6d1d20954e386dbdeec744770fdd2ba +61216 +0x41e9d65632f74f449a6842d5e6c4a86ef83791307b92161f74938f841a660690e86beb41f03a088a72e5b8aead7d54edf5d7ef62068f432c984eeacc3449d2ce450aebac727322ef2b009397824cfabd3dd76b77290644fcb16b5f08ae478c82814d3e5d60a984bced413b590d3b8327f7bf6f368bfe01d7e673550233681cf4c3bd4c1c61e51638df3119bcf551d5734c186268d57f61075fed348069b56a6c34e07db31d2ec0ad2a579387e396d9e96368acd5ae924fd34561634bf8355e32fc413ae83d8c6a61f53b12847e1377d0653ab545bf3db082c0574c2b89f1e18d4265e9856907fc9d6966ff796fcf98727913e480b08a6d5df75856e7c4efd9c72ed6f45048a85ea9ae5fc02f5dd22215c87da34d28816eac13ebe94950393026ea1bc112837679cdebaebf6ef125ff0279ff5a76cf299bb73b996d17d6d7ccf39bbcba92c179335149dc62fdd3cf1581b5226fc14e8adcc598e94a1afdcf97756c41459aabba757cef7013a6aad84ed9a46c4bf74dac1a1f5263e91a6e2b77f68333ccf0e940289805f2392f1e4990546d6756e073983b0e908fb0dfd0f356bc081ab65d221432ebb5eb3b61d929c538399bf843695529d87af60830cc2d1b10247c6ba9fe3c7dbe25e283048080d4ce2f8f9ae9d7ebcac5391f5ad60ae3ae3afee3539c27c2ef587d5f78e0be57a55e78cba29b6363081ff5920c9a311cf782c0d6d6fe42ad7203e6ea82bc38b520303bd77a1fb8c4ca2cd5d88842e9e1dd308fde5c96fa06ed05880c096299a22d8ba13c883d7c16f73602783496dc394b8b96824d2df4d447a78a4c75988726b4b9d28136bf58617983a4fa7a60b02c26dcfa4a118bdb1f6a3114332f27aa4a9d00f52eeb6bf3ae375be2e7c1660dc2576be6be107855f03deb50489dd7ac15d0a932cb0e0bf6041908e4c670719c04c6808067b2bc0a4ea81c6413286f329035fbb2e10965086c07d1d31ff14904f95b63f0cc601ea441930e781c38b9e7c1b5409df74342d2ede9fdd77babb6eea9ff5b5f758068c8d1e607b5ec367b70b236be1b962469fb8fa7d517600680021d98b2f5eb7c6020078950420a887e786ba1bf524514a42c5a2aa1bc596a6ee75c0faed9b5bacf54ea653148fe988aa5f2df896d8c7bb90d5758a9edeb3f4a466e4d98345ba47c0c8260f1ef51cd679f51d76492f3c171458d1a34d3a0eddac65c39b82d66a031efd863da5e8a8edc0f90709aea034e947d05598b95ffdce7102dba55ed5d18b4a5f35732be3145b29db594729c438bea5cc5fbf75d907538cbe9bab89bc873ced7dc224236ce59b1f0ca2a33d03cde3a8bd7e9be50dc1e97a099202a603019472d99ae52efea32a1b1d61926b074b04eb1420c28986a40ca3744d4f1641b72e74e34e1aa110c384a87e24b9361756aec770f4b7f5dc2449a37f2bd55ce14e676e3b4a591c3bdd3741bf5a7c20ec772dd85458d09c66d90cf49abc5a0c6a0ddbb9322e1512d846be6151715faddf032e982ecbc10fcf28e311478d3187649bf7f07857d3078e968691c507d84f67a10d7170dbfda27d9a5874160d0070496f48ae6e56077cc7432c5d8a9c7a882ed7671ebaf7eaf6dab3c9b776ca2b3980fe4a4d94b746d50ae31c2f229dcaea9cfcb7da7dae1d9f9efbd335fa332655b3df79588bda05c2d1ecd2712d9a2de92aa77c4f296d09ff12d8f18a00d686474a796249a46cc8a8a4d6fbedfbf02806605e20e75ec33487eee1a12e3b22cfa0cd6271bb8ebe04090c17d4d02e5e4db4c697423d7e3f21dc7b8c6e9d09b676d4b50144089b6c5c66704619d225331386d5d95cac184f566f516fb640ecfff06589fc35cb6ae6164369e8176e810cfdff169adcddbd6246b2f8d214c4656de0d5c4a9e36e6db9d62251547a0fc24a818ff1524f2cce168739ea7a0691f39eaca7eda0b98c24662075ef31ae20597a32bbfea62023dada7c769ebe083427f0d84e7d67448f1f6969d06bf6105ac71a75f5a6fcfc4d543cbb0bae14a6256302e85bec6400f1cf3226a480286d298bb9efef82dd3023daaba74b61244cd045535132c33d7b5eb46efb74a43f00e717d6f4ec0aad7821cea5e5b8705378ef4f4097759a4a10205f6e4cb340a0784e1bd0298db70410d1b0c9daf55428c6bcd1894f96ca106be130be8f02fe033fb8e853f2371077b6be21661b64752a92d38c6bde08eb26eb0bc8ee56c634bdc3a20dc0e39a9f5eb64181391ba86bcf89cdc086c76e66041a1a986c288f7d56a0a40cb5720abc4fbc0650815013908df7f62e589019d32e75982fb678c1306453396580221a0fb124673ffd5d389bfc89f7166fdcadab1c8a0eef6bcc0e165d57dc98ef784b02397bfe7ffb87a9e681ac5b291ae19c6634c3e957da86b867a83b082721e9102c3f4f46c11a83d9f8b3db7cc70853689d2dcfa209b16d72dcdb593680e5f90bf6390aaa83c8d63b5b1993e680b6a684a86de9d3755eb4afce7d4ef2469a3c80e8cd3ac43884d35076196212e6846f83106bcef81b5100d1b4f498c5d8bd08218c425c1e6fdd1fbbe239c2ac591ff2e67dadcb8a7c26d68b38d7b32bc7dd0060496eeb039a401fd017f131fd68e7f52148aa8c05084eaa2ec2ad1a9e846899cfb879642e384c582f9fe63c90865acac5f9e86cf25047005edadb5b88aeee58c2521853f8da506d4cd27f4f004207084719fe0acce49e5d7df9e8e294a7ecb1da9eb246fde10aa39a6822e5c72c7b22172151d20f25b3361e986c3c2cffd2298b06dd9997fcc9bfaac987ad4f8605acc8986a5f3394340eb34ebbe4cc273d44561300d8717e1bf5e06f03e2141f54fcdde7ce0ed4d08f6bde858e68ecae8c86ce5bb29ff4f5800afdd13e30bf38d7b6c9a7e36d5d3b23b1e2c52a3529065e655639693cacf3845335887d25ab731c5f1e5150f75764af95828635d5ebcf11648044ab5b03e897534a0d672d634e815a3e6c7d393dcd717b105127c7bf595408cf05ef67844547af8dc872a4713ba53cbc61feaf8ad617d72ebe76871e3584c6a4e5abdec8aa03bc835236474fbaf67b1aca2bc6c92f113e2016b8a082f42222a46c774d2b875a0ebd331872695d03a9dc1dab1b7328dc14b70254808815bab14022c82f376db91abdd39fb258924b2d72d4e32a037406ff35f9e0b3880accd6fa7114f176adbf64e7cc427397eb3b8a61786a5f0460f0523f75c3c61d53c718560fe43053f7cb71dd759752a1c863554a70b746f0a046b2360e9414b2813809c537cc6879bc7bd6017804cbf0ca40f27076405e52826893bc1cd84be203ae0fda812406327c2ee5f63c114c1f61530685c19c21a4b7d47b3428e6b8265b87bf0884919628a773361e4a536f981e27e5ed1b312d619128ed20db6605ea09537bc1ba8b94c6cee75b0c1b3182c5612e3538bb95ce03aec44e247cdca1c79dafeab88b788e9772e9a92237423251dad468db5b30a01571353291b591182978eb703f8feef01513f8b50326ebfab7dbc8e55752983011890a1f0afe49c59a3b94a0d9206545ba2293131152b55851e46a5f3f3a42fa8246a187e2bf5d56844639e117f5620c013f4737ff5334b7ca95372af59ac76bd24a99f1db815237923959d57e676bcf84ba93880f90c0b58c6ecddd1ccc7c00abf561d137ecaee52e7572e26f0ef8ecbf3506a7e4a40fbe11c17cea0767f75559e787ca9a49f9fbc39af39c8c4480001b3eff0bf0f5785de54de2d657f5bfd676817a32752199c7fc1a7a7838c0979613290b28c71d710191549e2690fe3c008c63b7ad5b2c24e6326465ea06dbb61b4193a982c984a0358085fd6f14ca027ff60ede9fae9211d301194476691e51fc20ff68ae9ab37c864d528ef4861199816dd34d8e022be72ad299a4a1f200f1d53bdcb7009d327c60523ac16b574d67c13e6192fcd8322b3a3175f501141c1c22fcbc132d537a165029af4347fae603cbf22a3d60a34d44adb82eb3f861d84761de0e0b895002d0d25e3072fef363e3ee23adab5df5e5c9d1a134701c4dcdfa1e7a431ea9155532634a6edf14d35f8ec44d5c6b5932943162b727a7c13a55bab53c1bbb1105f9c18f88aaf60e1d217adac9c70bc70bc101bd5468c9abda07efd2adc86f35c458f4c39385466f23622e8e436dfb3bc404b16df37864109f7d3fd33a09b9abb30b528bf58e4eac988a107b24d1b83c0dc7d6e12ef6f5b3ecfdf1438b2018c76489415519168d3aff11d71df862d12c4b92d8b36134fcfa5532caaffbdc0b3d4b4b67cb98be60bea991d8e338b1c4a10fee3d5134e2f8586a841285267e1f51f9da3c3bdef6979c2a729c67504f012ebd427b47045166529f9a6f4f7586b3c9d2ae1542665f6058143c9816f98b2519f63829016a30c57d56ce478b639666f9884fa95bb9497976d978627e7f069f172d27bd1ce0e1943d329821b59b2db7656d276f046255317d0c8e720a6b41dd9ad4a9bdf5e2e46116c590844a66ad139203ddbcc8dbf336df00175d4748bd6f197f268228ead9aa9e524fe5d670a509f3dedb3905a0b3d821668b6ac181d9d217af36c0328301ef389b1edcd62396092f70985a673b17b3c8925340e5c1379519c742fe8f262d8d89f295dfc60a00afa94bada75a058f5849361776306157369479e383ab6e8d23e6eb3d45228e755bd5d273965aba8b2437a440514dfca9251c1990f623a6d140f3f78dc3784b54ac49a792ade5a4bba5f87f56887afdbdef2528c3cc64797a4315aa0fc133ab2eff793d7354877e615c2029d28263eef5f32449f47d0a40e8c8e0752bd4e13874e3e8f6ae30bc824cc523363cb5853af1efaddfcb9e71b7bd40c8eb6a550d7dc6f82d859bb8f16aae5f96170db84b8c3223367c81a727286829536f53e814e5858a9b4cd463d28236b9dd6ebe01433d273c3282ef0db72d6a0104937104a3fa4139d6cee0a7bc8356328d8fd606f8d841a946954c589e31435640da3a1117468a84447e391b2bc88d781b0cee5fd8e831e8c716220e48de74a7bcb627c3fb34b1d888fd5634bcdc5ce90a685f626fd7487958a818a5437f8e63cca9b263dc5f57c508aeb06acc394513d014b1c52a3025e96fad98a41abef118f54772872720fcd83824e043f669c67700b47dde949d3aa760a91a813af73d35caf1e0b458141160bbd25e56b7e8618110aa2c453b58f731f02d16c320c2c358b24b75720bc3261cf84992f97d2f96c08478356f8b0dfc1782ac35f078ac33e05fb6b926ae98bb5b71ed26c2d2b9e6c3d0a131d41016b9d69c98c08f8f0e0f7b07c61468ad1f31babd5f72394511d1f999b79a09472da0eda2957ef6e082a6675efc2faea3c139993ef31dd340c1d8e0241de675ac9d41db3904a9dd2984a953d9bb537f1f2933a57b5a721752446bf61456afbfccf03d1dc478d998a69e78ceec9638407ba1a03e06f8277bf6042bc9fef44e3e04c0c323e96496b0043aa5271c1f369945d50fe1465e9677a89b68da28795a770089a48bfc4a69c9aed3beeafcb8e6e00a4de32dcde057a0e674d38545584d013ca531c481bcbb3c231416b8f2f5c1cb4546ca72124fd37e3c2adc79ca13ae5305bdfb5c2e1e138dfd565cef83484fa1638a166c97dfa2761627e4161b2df6e3184e71b135f0fb458a24e21d4232f918f172676bd3224d0f10f69af8dd19af37d0b135725dd7eae9760a46c0a44846788b8a2dfe68aa2bcf9901518074693fd7cb80a70dea355ae03d711b582dfac0667e4beaa2bcf9d73e3ae2c84b759f3139655756e28f8bd3c04ce3b06243ccef6956322de73473c7b153153fc8552e2be33a8fb5aea26dee1020fca66d8a313bd7bfd7583a83ca85ef9e1348659788785bb7b453b0c73df24656067de865ba3e5807a60a2b1f408a4f585772d1b140bf09694fa197528e98e968aba7416ada5f60ba18a4176b885d373e7c4f6b36e95872cbbc3fc0f8c23a6fb556a3270e14176863b9c6bdfcf4775dacdc1eb09ce4ed3e6ba48edc1e9b6f4fd8820207c3fa1ef58103d25d483751192001913067c5e5b2a5830f37385c90004ed8345230eeae8e9e816793d1a38300348727690bfeca7615c24170daa8553794a3ca94b9847eaa18bce6e02ddb759956c751d90e12040f48fcb60789e1274c268f254dd23de7ce8c10e0c0b141b14b036c90fef2823ad49b9ced69aa997eb490f4e4fc2f8d72626517e5c40078be9bc6c165493dd1d76caa2d4815c153c417506f7a1e05f5b70c304c5658afd306121d706f566473524de11866aa6282bfdad179652219f92e327a28c30cf403103473f3ff94fb0943eeccf8c98612c89a75b08d36b6c02a306baf37ac3f916b758966c6968355e624c5ea58d13736781c7e6a255f2a8ceb661e5be3828eec8eae777252d4b029ac6d79b5831e4c62238e6b6adc5f2bf4cf57d0ecd6d67989df138503333a99dace8660bb3211241a4d98b33f1ca7098c486e19fe6c286dddff5d38a5f228aeedcf181167d05a5cb378a3fc5360d761b7e9115fed2df8fa7d41d418e6fa2f6dd7209b0247d84a64e217389d443360b30c13fa295596b89ddc69209c32b5df652b5577c9d7c471cb1abbef1c8e1ec38bfd7b70fca420f7d67fb7bb3905df89135ee046ce942f60fdc1d90ff09d8d704b00622e4075772722dbc01c75fcb1ed06e66370970973887b6bf143cfff0a077eb97a8aab35e3d7016504cce973e75b9e56219d99b43b58d29d86f2f12f0ef9959d270e8352017800c0183509f7ea557832dd266d00d16281db2cc61aba26b73e0fea326f765a9a8f715cfd3e15357af2e0e893878bf03617893515830ccbd0c696468ed60f49af2bdd557e1c48533cbcf4c67d5fc1f233f23c4269e0b378d6cdd4de8c3d897936647894401b0dbe0b24f3093c7c2f61fca068d74bba2ab829c22ff4b33c7143c0b7d79bdbc0d1f076c94023596340b9e0a093563355ff044a322c3b8c295343ce947eceb9844174f02880a77c8b928490815061a96a9cd7c89c3e057faabbf3c088e2cf51fbb8c617b128f7fe7b813c8cb1046c265e70bd257efa051626f7de371387f04d9db45e4df19db757b9b95c25be43e822b8372ed148d49ce824a36da2b2f2e404d0c0c81368734820ac976e0c17736836fe4ca76c88524f5e3a5b1c83e5980d003b7a7e08943e3ce1eaa7ec904b376ecb972db147bbf79ef0ce6b756b3a0bfdd8342dfa8df352f803ea675252c7e45e692956d70362290e48577102c91eb318e56177c81414562c0f325229e42c2ed9980b547310098b0fbd7be84f1e021200c039c4615b65bc3b8c38f4eda4c66b42c0d3a3200e209225c8925db4da82cd27e123b0509465f998d394cc1815552e3c8c18cf685e35b2f302312dceaf2f3900d0b5b8008f9392d6adac4433c626ec19423135b670b771d9f2eef506dc55ea1e1776380b8d8d1c77530609cb37da298b9bb38294f624534d03123ff812a554f21debdcdc1ea0faed6c286938dadd6ae5e116127e4f1adbeecb416b1cc28c0e0f6c6d02fcc38dc2cb6189ff272fbf24dacaef81ecfbf98011a3f302ef6c7879d87b9046e81c81e873dbb147f0c6ddebbcb1963d6b7d4ec46835bd93da80f93cefd3ec15187a4bf0892324b03000e8240e2da0c17453993d54e8f79a88a09cabb7fde6fa187d4a5f7de05ae45f9e3c626197a59a921f573f6a464783543bc15ab361f7626285eba9c48bda40f9df693b39980b453f21076f1ad613ead7c315de8498c3fa8134ce43ef9e19427944ecf318a7484de6093830d900e33d7dc6e88b8e1aa30efefa60d2718f9e85687f364e614df30131585819476f3c07d0c7d7f642603b2c265721c9dce8d07641eee381b5d4722b7b6ee5acc86994b65b3662b333f1e2eeb1dbaf9e943265919004635179037c195eed7f5fee9873e587a2f736f55830a30be858c539e4b463dd6034224d334757462473a71c645ff1e09e23e5e8fbbb05af1dcbd2208853697472e46884ec8a61bbd46116f465cf87f0786764a164d86315dc674a0a85b91f0fccd2b8c2b7abc53a5dc623e91538f431c24027911c1f67cab4b9913a755bf109cebd8788fd21fe4c2121527ceb22e31f1c3ca34a9a06605827314c42cfb28bfd08d3594a4593896beef127226023c132e6bb6c2067040928b47cdfb60d635c540bd2a2792966d313e7b4167c0c921af7b24ae6d4fbcebec6dceac006a6d4ce993829f7b8112277cedbf8b4ec59244cd7ef79a7bad09cfdbd1109a1a7348d7f472e57cd69853cf4070c2d66e5ce20f37e2eb623547e154265f167d92a3f03caf84eca981ffe3cb45728d0c10ae43e9b44d09eee346cbe297bee73fb021ece5df72a10ec4df4a85539926137ce23c3a0b685826cdd150e1f4978bc6bc16c4384fe30c94e6600e63328d97d5fa21566b05dae0f33a11f6b906910bfcfea9019fc680342131a9b9cfa9f7e838d29317e26a4ba93b742d48d295556ec7be032a810bf1219eebe3d330827f1f264b5f09080265bce8c14ecb95698abc11434bc745e7dddbf45d35e2ee83cc4686aeaeb44594cd20e06a9c096849d9fec1d6aa615522ec6b09cfc870717587643f43a79f02ea2edd0db63e89b4feea3bbfbf487f1884c7d8c789c304201f57823b527352a5ca2efc55ef5dd3e251647bf3464ca9f6d5162a15d24f27654be5a76123395598fd7584a25b20705807f0c645b3df6757dc8069daf4945fa7bfd9db99fe2231414bac7ddb44b0e780eb35259d4d2842a362ae9e0035b9374f44da26cb2a566d0a7b7befe8f034c0c1c4dc9fe35d50c1422f48d16edee734c3a29091dff0fc915a5789e3b1a8d58482598c3dff2b7e6d9d0bf5080c3645e06ca1a423be983c2598a57f601db3bbba2d73ee06d9ffdbcc1abe5d4dc287fcc2b209bee54e6a3fb22e2e046f165b0dea29daa90259218f68220f29a778173362fea185dd78ad2dc083bac11784e6f49cde56663968d8c1c91ec7011f16301349b632a21525ab2ed5ff115e604d9d9759b4afcdb4ec6e997574ae8cbb8418c4fe4484bc953baa687b0afa82525ac81fa813ac857ace2940f68e8c7385aa176d090e5f7c63a4f306390c3ed5f693afb31263173793f752ded4d2295d85717736f37e8b8a8946ce2e976da50153e0997c1e0cb68a084e309a95aa4df3c2bf7e4843facf8d0f0b82091e95f7ab712ad0a154765227e0ba0d9dc37dbfdd447e76cb81ecf52efbd959be55edfc7d59579a4b3c09b2b523252f0fe5b248c21394a5e636bbc314579a9975c5db7c1f125140a25f2ea0ddd976df1784b3b04b38eb54c2e9cf02e72b358b58f4c83e39a4fe09cd444be2470b9565dd27e7bf1fba69ca87229079517d92778c6c1d0b7218483ff573ca419ac169098a56b63ce7a1f8515c6966f2f85799a53cb540ab72751628417511857f01dc13469a88f14af57f2f6947b93384c0325c8e559be6e2c34f0edad18a769dd5d5ca3879c5a4f1bfe5add743f1069ec145e6aad694846a0bdd37e70f9bdb9d443d78897dd51e83071413cee67631ee60ba89b9c0954cb154a7ec91b8ae7e2656fa63602e2127a9d3f3a975b6b07c1ba7798ee399050760a6957400532a25e114f5d3e6130f870b2d6ab6f53d08b1ce9e6a3d4feb4c7d1e098f195b6877997585161243b40805501c61847603e496ae4c76dd263dd27694867d21cb7ffda28bb246679e99756a20a9c0591f8fadf564b983b88f18feba6a2447d577212307cba16b191f4bbc7e25da6f7e1869cc9497ed7a14b3033a1047ecd67d88d55392dc5c6e71f051470904b9573b8a19a73bf0f1443aba86ee42d3e410612524f50967eb38b736337cd3684e5ed79d27a8b416ccc772cb298016b716dec877956f351354b0331c7ac5a3f7a06d9c781c36c6b386ed030e7559559b8a29fca5b02ade89a1bd2cc7ad894359b76dd04480b8386c289d37acf1e1c72647d743d8fd8ecc71da49ec62542f79379b44bc28d998d3ebb8bf54cd2680330155d1e6380504c672053bb913f7210e3955dca84db13d5fd8413aa3989a9f62d4bc002cec4ff296342c7bdc021fc6ca06eb1bdcda8f0fa4dac8f86c36d7a41d46844b5f1d63c1026056f09d595386744768eb9ff8fc76699a57e0f7cf65f92affb699c5f2cadad39e8c84433d1cc9d6a3d1333bcf7fda78c0f5da8b8aca0451a85ad4a8940ba3d095d51e18d801f7b6c330dbf686a0a397f3abce718f902f5ce976e34e2aae86c3ee39a662528a78dd4e8cca1946e7398fdb80a4f2073ee1116914ae00dd3cea7250c0056ad33fb513edeeeaeb36dd0527217c44541a5d813ad13b1d05d53c37a76473217882a9141f485d22b67f096d296da797dfef74799dc8f418a73936d428d259e3d3874ffecb06e15ac048f3da5b660a83ddaf0b3003f746872c31b22bbd417a33c50bb9dcddd0827a53ba24b587b5acf19481ab0e33053952dde739a33059dffa943670141e4d496bb5fd2364730295ca4d8eda7bf79bd561028052a448c38f1e892ffb1056263d132e387851e8f4cef450fd23df1561239ce3278696cc279289ec1fe2364d02675b0893ace2ad335e59e5f70ba256fe2aecc7025ce2852cf121052daef0ca8acd2b893746818c684de054a41c2c821bf237f8395cee3b7bb3d01b82e6a59766796cfb4cce954b3ba470e42bdde6615f8467bcf50e23b5bce07d784512bc7a3d7304a4f9cd86b3536af3dfb5d636ba73e7625c5efbe9bd968110629fbb9f3cb7c1ddcd67cabb8c59a7508b69908557fe23121f9baaa919b19d7022b868b5a5 +0xec4ae4e3668035491074838888491390f18c964bbf2aa16f44f76a167ea90043cbdce5fe79fe09c2e78cdb1fbfb8c3eab143299bb7ef98f9787a4a9f94ca413e +62008 +0x090d8832d14f33207b3bf973d374be0e88082e7b46fe01251f2e7dc82f563d25806932fa2b2ae731c0fa0958e8ee26514925b54baa5957f158b35ce0c8e4895f7d71184a2c4e01501faf785fd71bb75bf5c2fd165b10d77d8e829e0f5eb94194cacd440b1ee309e45e024f6fe722f89554860fc69f4c093288434b3c3bfced2b2d24be2347108855469a9572622c71652d1af241bf357678109d6c4fa5d6168e6f1e8c7cf0fe050a9f20524f8e60ab344a25ae7102f2a5b8ec38082fe56f43245864b8fd60d5086d313b8eeeb4e72d6b71504c3cb2ac1e58e5bd27c643eefc55af9e4a8de1bc19e5c39452371be87f706b43d38c158a6ac2c3d4d1fb067bc9893e744816b9dbc1da1fd2a5120d8c2aad00a54b4875b5105c4e240fb678403328cb8cbc7f315b87b40b9e9067d0fbb588f71fbd58185498904e56e8dfdf62c19a1f91adb09164f4dc50a01a1ead5ca86b1a5830a447908bc58a11655f840cfc4802292490211d8fb8b67f4b1fecd78cbd2ff9ac1349917062cbfe8d1caf646a983bfc280929afe0b104e42b52d596e8e6ffa9398f687ecfd1d9c568ffa89295f394b3c102f0426f300476c39fb0be444e5211e000ea7f31797c0dfef0b6bf05c2d3f6f764bffcc59b7cde1aefc47a285df0d8a84c18be1cc27c7e58d82213406bc16cd315de08695b35c338285af01d7ba0a79a5c3a601b14a0c17d9d35b5d05826be5cfe958ce3d9f7ce2634ba48aa102b26bc189890b3d7b17e752934ce3defca949b072cb1bc7c89a7ebf92cab58845afc186879746e73785c49626a850d9a74949619ea9e7babb5f58f61f841ae3ff3d2b6352734d351ba0400321e03cac0ee69571a187ca8d041601b53653134a9be4f9c65e8f96ad7421ea280976ffbc8feb9e6f4fe72cb52f69296b6bca4722a851cd4e205ebbc6ed75138331ef2291c6d2d498de4a96d999c30087446c1f12b0ee06692c631507e4045c835fbb4db23026c8acf1248150dfbe57a7448b138122244585f72f4ae7046a35d6d76dc9945871fb1a0cf784c16da56f29e0d9bcf4989f0b430535b5faab113fcc3d793eceac2edc4ea6561991c032e7bdadca83f360b8b82ecaf8fea96493caf1f65005a7a7d7fcd941a2a84873c131a10fcff0f4370bdc87dcfb7d79bd5c77d69694c6d5d7e7cd38637fc95bf4eaed928b6cac7d77f3090cafbfcaf201f5b6f892b9eadfc8e8ddfa803fe552c01a6bf0a522ef0590189e1bb7a86f98feda18b68f31fa1bd745af8e2c8594b361ca3d49f18551133bf73c438967c3d4f0841dbec09f6d109fa8a261ccc340046694f21cd4f67b2cc7e943f29950604c838e267feb44dc549e6c5713e59b8fac2ae4fad7d418b5b8c09945d76c04ed462442c35873e4906e301b5e230b50cc314b44e819834ea95db271c23085f793885f6c9506ded141b41130080da285ae3a243f2a30471ace7219fd49bc5bab2b599145ebd9a0ad68cc9e44e5424fcc7e0d623e31dab40f8dac63a63cc96181fd506679685f4dcb6e2e53b4864f7777d44171bcaf773e8f6f532c072be63c3e81f34b716b165addda4fce195ba39e3a496ccf44f3746b3d0c0cef9a87a1501361b8ccc8949d4c3735a759fde5ed486635f5f7619e70be7abc300acae07921b3152746d955328689f8cba3bcb56aea9e3263769d10eaacdb28731a32b6dc459004b5564e2d94be189c3327d03acb1934c73bc951eb50aad0a93caa4c8b59202cc8e987719e224795a86452f2f68c48ec5cf56c2a9e315cfde6f31782de6e360bca4a36fe2779b773a5e5b17f690cee076c06db71aa0b27a54a4d0e70108a1b9f914e013e49f982250d2dcff012eb9d288d0693d18f4c9f894b90eb8ec24b356aa66b52dc86203c4c56a30adf8496cac2387b21c4be8438fc73652b59840017ff8238c8335c8c4a3c0aec0e981eacfb66e6cb01c5c83068815a406a4aa67737b0bd2ccdfd4dac4076a27f27d4718ca389207cc04f3cefb2ba589914ecd9ef1940afbdd074d9fe93aeb5c2f2ff0db4579b7e06c9eb7cf0abfa0705b7ba7ef63101d2727c3471f1c836ad5e0c9253b28c20380fab051901c8e2ddeccf2e061b1386edc12dd6b6346290f1b6b118d415b5ba16edc03681917de755d4c7d21fcc35422a5061b60724d7504b53ad0d1f4c68cb7327c5fa570e5f8a07443e212c981ac64076b47ce551baf6e2bb3cd985d529d6e55408cb09f6c24d5ac19ea5acfd4875a8ca9275f12961f780640d28b82e5d5ed5e925130ae96a93c8b365da117a22f2cbb2884b9b3a80c47cd48a5526d687d5dd5d977cea349d1fe9b020391a7d5ea031c5025843f38c00608330f9426c4dde5427cc731886fe24364e6a4d089530107388ad469bf2d81db4068d8f9b3df3dae2ee5060164ef25326d480706c506bc5f963c570f3a7198eefb51c82b1ea3e5df217bffe840b1e2f43e91f5dc61d46234bfd07720b8eb4d68c455a7cf6ff71ca1a1a6798c239d61b05f2a36f967a73dad39acfc414283e77120dc3c90acc22c1c38ce3b95159be98f59799207de6693f38e3aae1cde21b030994e5013dfee5b776d5b0eac1f93c3b9b2e8d1abcff9ad2d45e0555997adeeceb614ab030f62f2dbc8b5ba79476d3855f5deba8f4147d384e708b8a0720fea73ff9415064506386fd24507a397118e8ca7c3165b3c3a4c20fb19a0977930ec45fd3756c488c2775c1271bdd317670d8552feadb7c9b96228097bd5e9b3f63b6f376535e7e07ef5c911a2a3b0ce58ff697df94749eead5bc49a951f3c284a211736877c145522fcdf554182e3c4caaa5fb11bacbcb5fc801e35d14639e115e4668003f1f5f096d2c568b4221301a6589075cca3b6268f195b62961187e53dcd839f435d32b8c2bfa4d2654be98ed54f235174f6df484e6ea6a94d49ce3cac24961bad8773b68f0da419bac50c723ed741cd7b6be12321c625935cb6b8ef4831c97aab395ff0e302ecc71d5726b5c83a12724acb61bff16b00a72c20eb05fb3b4246a4399e70a8e8a563f5cbdc605dbebdc747dd0a25a4a3606d254f0f86ab8c29060050d93ec405f676aae7d879e4ad6b55db6b815c24b76d6eaf0bcd7b426aa7432646b86021a20887a474c20b444d43a26e3b716c57ef4e31331bcdeba71ee48480e3e2e0a506031e4a39411b67e76e386917805e27922c3f1748b6dec2f0075175ef00c53a7b0ec40600feb334c2139f32c556397bea2e1ec55a305c7b2738326d31b918c74751ff3f8fa1da93285b5d330d9c053a3d7d58a319e56eba0da1b0d072b6e033b3f55a5eafd1996c5f6efcd3b9faca4ed440751b4c7a1b67e86752077a9e256807225ac92836f7a7b07304798f17919ef7a0fb94bd9a6c6a01b5a178111af04d8bff89e9c279fc2d6392fb8f599c6112edc5747632eb67aba0b1248cffd248ca87b56e264542b0e4c0f56b7cdd30439200d66728741516130d8363ab0b6d35c7426b91e978381cb50fc1dba8e47c3e0676fb5d144bc181888f54e63eff94bf2c054a7b98240447889721d47b35285a56985edda17e97aff36f4c36aba1eeefe1187ab39d114e3946a13bdd5d9adb9f6bae246f37d73ea83df692da5cba24cccfc322c15e07bdfbd575377eb6d93d162b00789b3e1c5f744c694f5ab711dd5edc4e6b2e45cef9941f5b3e3feebbf7c67fd580ea1e16a11c0a13aa3f2670c2aef1007c81b82dab0c0b9b78a96d08b1b84f7764e3408dada75e3bcc0f109d7ac3f7227e4221ee7b6c807c0c439b8812f2842c4d0f0a492a1d2f28dc55dd61aea6d4fc98fae7d710bb68472295e102c37e043d63f4e511c18667230396f484065d72d6f33072b11301aa45e428a5406c64b9f2cd1c3aae1aebed74695cbfce29f2b7f8b66c2a432b462ebb78835008b4aa8a92b40f6fe9dc53a963352ea507c06c8da90a3677570193dcf4062f4b23435a5e673f53ee88afc7833890950ef672d4db331717c1b33cef9c37b7b2fd59c27b1fb797721d533d4e633aa1186264e83189dc04967020856356cbb296cd71d916b4cbe3f466142bf031b2913f0a19ca8b7eedfa3cec6684f6f2f9206225352f3205eb4c5f309124b5d5e887926cddbfeba4ad208f9d4de0b05809299f6c6b6dd7fa5efa3de293cea63724ac9af1786f58e2669f19ec9d42997043f4d409dc3a0d7b6e1415e6e2d1ca40ae27de01b183da205e9e623f1d51ba23eeaa8966503fdd7061c270a346d62ad6cd21e60551a37946df46f0ff96b61a57547247ea8f244ec1802ed5818785cce2cbc23b6321763e3d2fbe4d95d118c1f5bb7594fd60906956137dcce86c85ba4dee316485e6a530eb962f01679320b8e66cdbfb078c2b351762dadd40bf7ffcfd7f97e9d16bd757395ec192dfa7760610afcb0170dc9ebaedb46b91f1461a98dcc51b53b177b5bc0fcd9b8a64d4c1b35dcc6d30a1159100be53586f63caff98d10ae6298cd1e766562de6715de1a9c8b40aea0f0002ab107485ca00ff12d503c3941ff3ca42145df4c4c9cd3497d84cfcb26a26f66a95f1f593e9ca2be845e29cadef3ad292e4aad3db6d2850bef3471f0c14feec14f7ab2bc5dc575012f73c439b7e840e890154d9b9fa09191ea5c20460111e48c97747fc62cc2fd7599219a0a6f35ce5ee1063f0a897f9f77e93c393f6890e7351c0cc52b4e0d82685bf829b187747bf8bbce0ffee6c7f52a76855b415a357d6747842140141dca75e257d1c3731cf0426aad2eed4a2239262ca7d4f078780d8fa48b12a9216c3c1ab6d150b4d4a7b1d888541a5a2616d1f7562454c125e11e0aad7227baf8813db363e4f50a0e9d37079f3360ba0d0e662a8d7b4937f5093584dce9cf19fbf565fc54135d378376066c19cb70a161815c1c5d1d20d96848da7abd42873ace213b4211dce7d1f5ca968272acf894b6082a592faa8a09e2387358c92cdea1c19d342127b2234dc7f37dc7442837188d1b677d9f73d35e154096ab8af933c388e1d7160033ae1f6c8902b708edda81593389d60739ab5a5409caef6d48252486679a9d25c1d6db6603ebee3b6e4173acd9081f014c506330ec76910a9a31494cc6f52312fd3be646fc9fc9562a0a63fa847895082c812d3e71303ccd5fd6a63e688d4452365be481cb74c4e391a3e6b4be41f4a66abbfccf307e4f301983dffdc4b97d6e1da53a9909218d5e359c507deefaaa46874f768592b744dd47d73aed74104ac103a67d1f3e1c7f30965255b8bf192272f2da1ed42071ca1f7b3f6b9fff0818e598ee1066c2dc170534744af78713e9b64dda5a4d52442b91142ac687be2774664dda99123fd6d1468060c4bcdf718c8ae8debd53b09505bcb337f02749f4f9ad82fa7ba41d935a6f1aa6376b30b8775b6445ac89b3eac50cd8d56d111ad6f535e8cc3c8ee4980f0953c337a5236f36c240adcc41e4cc05fbe58181b7b9641399dfde50551d6b7b8fdc3639dd1ffc4739fe75813ecbaf252479daf29d9e22b133e89f5b7930740c7d047db2858ef6353cfe4b7fb2c10acf00f630243541797abe839db27db6584e5b7d18363118c36d45d08dfc507d75500bfb2f9b014bfecc744147f9d5277ebd95a6743952261a6bdf15cb9b8a496544bfe927cba40619230f922c96020c5de6d60140307b3f31cd832e62d1e2cd51399750c73a70086f1aeb06ba2ba6cd7c36772ddab02edccfeebc9b0243dc61cf9b1cb27c6c07eb5710811f8f0f15e36039037cc23ccf773b5bf5dc2845f9bf46e5da9ec5e4ddf767a08c3d09d4e206907b058e853adfa70aa1c972237cad2e4da63b76121964e5174746ffb8f19d7f8368f7c3923ef1e4c44c91fda23c69475a68c9c90f8e2f1cfc715bc82b09aae6cf7f44cc87cd98a8eea909cf2329d092d38a00181cb7bf077dbb3536ce619cb4bb4a96f9c44b267be0637b7704b955897f9678d3b83a774d21816dbc11bdd5620d4748ebd65c3dc64ff87175e55f8aa3851a9e9c606afa566e705fd89362f7870bf1e5134c55412093d4864c33a0c269aa92dbc2a3edbaabeae4961cd1f5758c5dc6f5f084eac3134284248a8e11af54467bcaf6f1272ac5fd6aaae95be9d20a6952e6141e615606e283c691432693ebef51e6a9e69bed2d3c8f08de7fb48f59c5125fee877d5c73ea5006f0f15432a91b91b94bf2d0545a1ebe3a5cdbea2012e791adf04e8358f2c075403a272eee1441d7ad5d845902c51a64b9f4eeff16ce473d6ac9d217de0c0b601cdd331b38a5f8705d7f399a7b06b63ef2272767e5e46a8210cbc0af5e1831acf74ac3ada4d6a61823f171191f9788998d7423b91fedd80c2a7678be5bbfc9b85a13575ab53ee12bab84d95982e00800e65c526727430648326a98c9495b4a2edfb75cb6ec4730275e89c0d027789af1976042068e9c7ba2a3187f54b983195cd2b74226ac87f997b770c6118fd9d8081af050fbc852beb806f0bae52ecfddeeed83a64e8859c3f930ea57922e8c35a0dbad2ddb76fe3604d893c9ff1b8a0e318abd0773026515c8755703d686084a5873f73709ed07780592622b17024a00e124b3d458ad126581df37496318c66cab5e5eeb2bccf70b26befc6ca165a87c6a66289b43eafa49b1e91b96ac794f32f5f554d89589555604d8c2fd32c7fdc729a95bdae93e7528d51d648a370a1b33d4f3798dfb949aef1c5a465b5fabe287cb78edf1ad2a1b997806b282775db2d5c4c32d59b281404cd9cdf7156c83df24bc5f5fadf44075f1f71f761e01e69e9f51dee0ea5ed1edd5c9ae75aa0de24c2478c7113e72e3ece8fed23fcb4b2736f6e8b144ae5508ec4058661287a839c20d8d3ab3419db718e4dbc97008d7b2348315e4c9243998c3e3329f8e4cb01cd9566644b645d92c625c3a6fa7552bf9ffba45e3deda70f42d54b4c52957d9edea85905f8ac9b9a651d5773f464ebc70f1031529063f9fbd610b6b5174377a3f7e2197f5a12bb3c77fe73ea2fd43fdb9c0f3f04ecfc21a57077dc2df0f6a15842ca0e9a1aa1a6c0244e7ed550cd38426e81353afac107553993257b85b7e304e4e8a11de05e426e9397e0fa0257bd46acee7dbd62b9935358ebfa697d8d25f008c438d25353788ded600021eb7bb72d7edc7e55cbecaee6f608c1bd80814f65d4e73d7f1c87316759324814b3400c400dd5a0c9dd633e583b70e440389a49a970d816ede302534200941f9a03afa5c781604be341252cef4eadc9ba4ae0fb04051f2de44fcdc7670a0eed7a83ce6a0a0206e7699f3a61f45847daf3615b4ec0bb45e82c08ef761e9e281b7ddaa74350b64ddc249eabc4ae80c47db223142824b9d1b18cb77047afe46b0f6bb04219e3c8c093dce77f3c67efae1cc138127377284befcd04592161055e320cafa5d2095ee4725922beb365cc8c1ee6495d15022f3b09b796b1ee7d298aec277dda580ba143e262f67110f240e7ebeafefef80df72a69121680954b7775a686c2e99131b8644cc10b9f3b547346eb94fefc02dfa8a076a62bcefe1318a9c6ef27d867c2cbcf163c0a501bd38c3186aef25f1dc26923983b7ea4111d34aeb62b53b1c108040daa9c9b8c9ab9b43024fe813030fc623d3798b609b6b0f20adc02f07c864989a56ea8655c9f4c12cc2d4e547622d6bc75bb867c06d5167a47a23ba33fa0ce821fcc2a11c713d6cf8c09641239dd989f538dcd78a25695f5ec6fa01604f6df18042be846d6dc9d12f920086481488a3260133551e521768b82aaf7f1d270c372daf2acad90e3ea0499da04f2574bf49e23b686b0d71e016390bd09dbb2f6c4ba2c8b3ceefd1004ccf7a01f63c2ce1d0a25de873c81367da69e0f9e7daa7028157f5d60b0254c359498d82060cbb94e9fecf4019eea4f347b35087e7fc5c638ad5dd0e29b117dc38106ecd09079f4cf85025ebc7d1a526c0bdc10708808e13caa4d4c8958c88cf7bdc842f79cd468e8e3ef8680821a286e7d1b8f3d407da77c34d8391c8f5262197066445d2be4fbe1e139d21555f1b782fa7aedad512b013f7184ff64e7b8e571c16858c9e6b29601a96aac429da7e9efaa829288601ad7cf8cdc06290901ff46d957e8047445229160097bd00245a5ffb4bae79618531272ab65b7329d3597e2e0bb5bd77fa585d9319fa7882ed2d2f841aa529f1edd9871f7a978494a5d958bfd1a1907acdba92142b3982fc6565a2378db3c6a1dc05314972fb234b87fe08a58fe8a5fa5ee74b1bbcdb59075da24c882d40ec0bb052aa2b37fcebc90a662271aee16a612e6d0d0c5766872e164182f861d2e69a0b30465752232a97ad702a96b7325a39acca4c88834199cb2ff1e9fad3f062d75d2cba3039f48c31d1ca85a72141f1fe6a7d8df2b922ed791b01e621fc1fcd4e26b66a5857e77d2227c3c8058596ce29e7f535ed61510eb268100be032b7a258e84bdb32448269d3000a76444ca74b4695cff8db34727a01879acfc8106e7e92228b8140784bfedf0aecf4e5ff09f5def47c3b3e7afdbbe0fa00b63c3d9abe8455c3f1258baa98a0a909d85d15256a4d94787199dd5950cb5ff033dee2c2eeaa02a3af33c724c3c25aef953c178ff53cf653308fb42bb53af9d7dd02d88d7b7db999100dd3510cbe90eccfe57eb043078a8b0c6297db75ba8836266a67310169db12c81638a5dfe00bafccfbd32cb047d18e49b500eefec46b79845817741d18e7bf3bef6fa9b9e0fba730e18d5be9685bdb8d1987ecdce314309b5e71cd0ae57fecffebc0c3273c1141703935d43b039a014af2854b7c8122e9b0000e92676a043a68be0488a45bbd2d2f65351c41841c8e17c291817a49181386df366abf0105062ab88360bdca8fc8b2e8339a897443d0581c25354285543c743e91bc7e6502fe9a7dd5f1e002e982af4499e57f5eb086a061c8cd61d077c30cb0991e31e08e825c7064a2978f5b09690cd0639fadd30f6525e4b054a4e355b4d7c4f6562df81fc522b7f960da64bb94a38fcb66ec2bd93afb1184979d375301069ddb7787d0458927687cb87e9727a69b205361844b828633d7c0a703e44975ef9c43f288b7820cd0de932ae652cc13762ab21c109289db729feb0f836aa787d538b673cb1e63c4c182d3149c38176fa7175df31b915daf39e27a3d963b0bbb6a1ba967a96559357c0dc3222aa7982fb07ebd830fd87c65fc37d4bdb6e5d485108da33ace3cd0f352c7d9cffc31dcb824a9674867d874b43c18a11c6ffba0796b272a8983f5797308698d7a9b6743ad765fd1cfae01c50e6bfd65b61bdcde0cdc70a5c0753f9148ef3b54be82a86b7417ea93656ce4fbe91e6e7927551a0bc3d6e2ab7c0c7bd6c989d5d6083c85c2b09be202c60f1277b8c5e471fca623b812fd05b218d42ab8896ac177e4437fd7c784cec64e1eeac701f4e7e682899a419eb152402346cca50d0486c0df11f7194d4519448a070e68592de12d7579ee56ab9640ec27eee22ac8d97e375532ac15965f4a13e671ddea32c388dd31e18065ee1e5a0c93370bb8517c4041e32fef4b5755e9ab0fc9d9bb0368177c347b00ddcaac262801b999ec1b4f557705643128f4ab6070528992595f8e45611980d04cb5e20dc4dfd12d24aad5365d486a224ce2d2571a5b3b9853bba87b424dad8f215432a9799a3825f064a05b5b08cc2315c66d35ff865a4c289c4921864d4b8e0a1a1051acdd3924edfd233cf6d2e4d41203de759660603e4665d2e0b395056d557c2dced4f56eaa6bc8f073c7435e85d02fa89e7575d7df4bccf83140b1459d91fedd59989f4316f84c7a7832c683d8beae4e3923333bbf87260b8bb42ea6af4e16918a5e17410b121c33b2cfc91f4d5c0441ae1625064fb7059f5884698312f857fce99c1a02e757acbecc04e76b5436c62595d4c7c21029e02640480e65591f3771ffe903e34c27726e1c689e127dcd786c68c597f9a17e4a22ab6569e7f231499325ab617c9a1001e44c61498f2a8e7f889f8f22076412a827226318656ecce2c30389bf39619fdf93a485963bfaf85ffcb297d285e8958eb62dd7a6883f40a7a401da79a42325600edd5bf0c36fa9ae5b4a66460f9f556232262970aad43b1c98b9342d376f4f47b85f4ae59fe900cf06bf70d8df0900c72db3df2347de2a9623921d467da68bdb2292e8e14c079c56919a4e27aea5f6222b5f7f1b09ad8dc8d7150c51f15959aec020ac80323beab98e53549ee906c417ad717fe45ae2d30925ba67dc1d08473733810c2efd066a8c4f833acb08abe8fc16a2580ba5ee98fb820ad6415b23b318df2c8e59f6e79a336792672897f5d364095aadfd85415e048e8ede2e564c4ba8358bb99dda60083379194034117521c3f812d826738b90b8adaed60f78d27f89d9470476f2001320d6807c7a0fba42b055536d32fb1dbf7c61f354414d66ad222cb6f551e838797002506266ed35b49dc3a4d39f768858e44de4df804e7972f5c28412db277979a5af11a88724680600a58fb1c8905beb74b40bee28f67b5f991d06d35f3a63b2361f3c95575fd1957d8d6c7e4ab2f8f5a256d0e6c7dffcd170aee7bd7a9b57a1a5f549ef53fa031168edd3afa268efe60188cc8fd9556e6710fa8f47a9b4f5d679a3b1ed098d6cd857494dac4c1cb16af6dc671fca01508efe7265f85921aeaf35bd1d34e4847f78cd22432ab468edc306c4293d367e33b79dc91446256be2ba4e93d44d8169cb613efb4c7187b7e5acb5c29b5e9af6988f734112b78afe428638ea8f9d4cb7d1302146d23712a44976987a260a6434ef65138cd9d2f6534e819903a7bac2f9114418977cd1f19889bf033d61b72ea3b8e6f30ee21ef3f5573ac381a51c60a81c4b896f94d8b11f16f4aa9ec6eb56bd85739649b402006f0d106ce71038c24f42850831b2c1cd9271a5d310de1d78fcc59981bfd812a82ac0b0d9a661a6445934aef9707f1 +0xfa933b224e0912687b04a51ddbe1383a5c1ccfd2c0c15a3aa8b40844fe70f356afa3a3317175b664cd3e01854adfb1e2a6e20fb2a4720d53c4fa9ba555dd5e9d +62800 +0x97fa3fd1e776ca79582bd034ffebae7bc2141db6bd62b4ade507af3febfeee56649c411a2668e265f52c43775f4c0aece4575aeb5adc559f907fdfeb324ba459ec4a5c54d2534e98002412e67db19cfc66bb76c448a34dcccd81aff69b711371792d1ae7b3e114f8c03ac6e823c06b948f67f8ab4e60a41ae435a8c8ef154384516d023c91b83e6f7f97e6e417247f9da883680736bb63731cc451c9f5e23d7bbd319cb93480d3e48362fa442283e0fdf9394f3fc65b91bebe563262777d083f05a171c764e2dc3e16c48b6f0c86979ecaaf34bdc7e936e31212d4f93b91acb771e608cfe88560677ee520cd9dd4aa66630d9fe8000c5bc96021bef80bc432ca4928e9378913674603ec41c69d16243f0b7c18283b6d065af0ab78c5adbea162d48e9d680f31fac3ef0276c2d3f30a100c2428e53eb4427d09d78bcae92801665b41abcb42891fc6884e4829081466c1ac2c5687d288141af5cd7e6d89aa5bbd26699bc7e9c3e03718f93e6304203f3934bc2b76bf91861afab6d91853ebb6517d2cf6c3ce8745fee52ae1d88fc09e62ecfe2e1bcd789f6361ba253211941a09a8b54329b77b5504380ab7f1719c8a231b18e7dcc4e567de7200e923894c8fcdee2a0a606d4a182f58c14a14715b0b640a32de226b7fe77374b1ad5284bc1e8599b4d4d0b89a96688f7622aa59a5290d02759c568bef260bb1f4fa29c98cce19ef7a27e15f14d8982351c51cef24ed074908a8deecdc2c8c6ff2560f2263a87239a58efb2c5fe5a55d7bbdd0fc7d5e3827148a2456ef02e0f7d24c6c55e9b276be5c8e86e523c579851c9230475b8589e6c1cb8e91d0afed91bd61a92bc7f60ec8c8b1ea530a81fae35bcaa39a6468e2cd36f28664263b9d84db1f2c6ca57c239d107e8f3eba2012be61ef90bb40112c239c8773999aafd61a530d5ee02a4a9b865e7dde6edbaaa8605688617398884d311a12bdf6d31282994eb3a74eff6a60cbd7373daa1628a30f611e7d8a14d32f3fd91ccb447a6c884af39a7080cce458b4a53315bb13a1ed14aa384cc85bfcb894012c074a36c6d0756b491f3c38be6d89f0f9cf6a791d6db75a5e36f5160bd27ab9cbd8d2b0274262dd481e4beb028691df12d17df0a40b3f9919a3d8ec0664372980a6a28f97c6587220d3758eb88a159b0585bc223faff68eeffb3a86f756147ad3da847c1e44a15258a881c9e6635d4c5a52f1b4f54122626aa6e38be59059d44cda3d1fc5a483a47803394396f8b1189a9fe251cfa90c3c120c9ba4d9f94e5e740f981f93ce4791094e63a5cf31592a4cd6589fd3cffc456e962a79da7b3b41d2e15c2591aa344092f0c8969af69ca8f85e1b460b9c39a506aa57b1f0fd67a4efb950d8c52194d99b5130bffe2fc4bb279ff3ef7ff60d8362b2ebf523681bb051fd3ee13919ad86acd963c703c4178a5f01a84236c7be070b14afec7ca29f8d8217ece7f57bc96d4ef02858b19dde3e2bec01e638f5955b883a683f02943b620a6d2293ff302eb608fe481711a360fe10c8c8848d69daa4618ae195be2637576f69aa8d611f248a636b8cae2abce7f398fdc3c33e0cd50d1f6ee197b641da963b714b7c232ff511e69fb9c504d1b9444af3bb4c51c5cebb494d2fedf4cb6d44f5efcc084b4ae77219039a03a8cb1f1aae1277c6d17b0cd9678e943e80ae388c264af6dae35744d684fdf6111d90619d4dc3c1dac318d88d019bd83260d0839455ea919af23d5264b0f694966b0ac7f4ae6c5f3031837affa0dbc3729e1b96840a3765f081e65a4524573d3b9b1f99485a771a6f22a43a59cbb61ca64275b885ce9939829739a3a06886b9a8b4b91ec0d74aba3f9f635fc00b94ad7652c833bf2778d6fb3c1e779e05edd084bebf9f85af4f074aafa8335ee7dd3c88d8fb4d59a03c0501787d1c6782f24a78c21964be69ecc9355a5bfc5be7f99287dbf64f7bbe4d8c3c543edb2267ffee2bc6afb5948e8bc7aba86403df9351771964a1814f0b133356d74afcf73d7b8546d569da2fa593ca52a2ab9011744bb3e67ae42afa0ef7c4f40a87c70f8aced770f42f1ab6366c9ad24f19eb1911500d9725a793a74f5f05c1f3de8492d95fac522de9bf52ca7dffd4b8945b20f2c94ed46dd2057c57b4c0629c377aa8af98cc93877f0f2ae830c100e305294ea01c3e445b4dc6a1ad5fbb820d7bf27796e0ffdc0bd9536718eca7fdda559ecaa2b3a590f6001e3fd9c6bfc74d90342a159f0cd5bfdfd230e21a7a74a56a00bd80f44b6047d3577e645393d9636088e7b53ebc25ad7ad6aecf20020c4a2e974ec349f85a54afb885d56d01615ad236d6fc23d775dd90a5086667076ed388ada6f2197329277a887db47bcf0737cd852174b7256c550a88672f575141475f88ec95cb8573c81e108d8ae7c672043bbfeda5626db31fd1c7f3b358a72eaf9d714935c9f6e13d8198dedd18ae4bc9032a65168d79f143ccaad379d3d3dd1229b0e5597a8e1a908d679838764f398c0d0eae4f9e0fcfc7e279300a2e9bf578eb8de7894614c7c928c7e2206970e55741b5f3d8fff8f5b5fd7b31ecd3c81feacb50774d95528fee3cfee41f59dbf63187665a3a16fc0a1404f9ffa92822026eb140bf2ecf0e1b09b055c7bcae561523c7680bfc4de2b7edde3bc1c99770470f85a6e4b35c1112216c14b380d0aaea33e9042fa60b74a3477589a0d2877c95d22fca1165a5231d3f5883cff1289f1c6bd582eec0b778762ab02bc44e600c95c197f46cca100be46a5cea44991cfc54d3732a6fd3bbb7da9f776854c489e9eee3a66c1d6c06930eaa60903900158b3972ac43db667ef975acb28a79bd6cdb494042794dd3f08144074cbed7ac7c127450661759026805ef5c49d75ac070a94ee154652485349e2d8a08bc4627b75aac758aec122ee1a5f1b425982055fd1da4cdc576c90c3cb2723a7cd2adf9302b8aea010b2e72519f23be2c14f2047bfdf40c7bf565f06e85ba20914834a84d4cb6b6b1bcd45620bc2c814795f9565212e5a7602a1fb734deae422d6505be7887d7e184472c63b6c4b5055f615cd2eb2420a55b5c20ebf587f5aa397245c318a2957461f35f207c7f65535ac14401acfb4c0e53d48f13184638609eb71f3d94669a762f099516d8b5e57222fdd969fe5e12eb32db95b807e41f6a427cb9b6569b8befd8d1f5cb332ddc6a9d5d42944a161a43dfb75a61292951d20f093bb5c50913e74393a8c9f6b0f344b529a80af6ec0b1e42b00596e6dc77a0eca5cec34977d8675897d6988706d20751a832516ca58e844310bfe0a6c738dac09a9a674aaf8276ff24a5be50f720bb582309f3120c4a7eca1dafc5d1b03d8a752ec6293077ba1d208440c5b74b8568b4e2547852e8e813bf21fecfcf602eb7f2aa7a9164982863a3fdcd3526c9ab174c2d3c6693000f4c0a62d386099fb26a1f56e0284cda735070d87594043a37d0084ce9473c1d682f93295771e53471aae4791d75510443ec705d5f6cb966d499d08682a2b7079ac743bdb118cce9147f295c5c00dbe0424089d3b444ad15287c8c2530006b864e1900680a03278443f1d648c35253341653a4849ba5480fdb80246f1ae8c0622c2fb3708abb5ccea509d3837af21fc9672daab63d16f21b96ad80ad69e21e62db10451e58c7d58fe3ce0855aa68a967ded781b2c11f1303010c89264476ed5004c49cba9daff88fa4495e087b3d58d5225813c05048138dc3a42524d42d95f24e54a28c80fc2f959180bbe314f893dddcb84627121a5a82847e3ded408e7e1062c73ddb2a35e16b527d092d9e21c445b40004312e1c50a9eea0bacab1221174e72557f1c3e275d78e482e2f404152d651373424cdd75dcca71482034f6fb4e58676d714728b55a2ede7143123dfa5585c65be4916d1eab157e27fe041ffd02ae7c3a58d5fb9e8941964a17a6e8325937c9289e832945d21a71097a9b05ace0cb113a9a4b3f39674b7c6bf544ab53a4f5ac77f4948a820e43ea8b4a5c30614538d6fcba096c2c70c72165505dffe4c539e0c87b3819399c2c6b1bd1da38d0cc722def3cb2fade322ef5b4ad654e5c368ef67897005df3283e4349a5977771d2f1968096ba73c527fd99d880fd2f30756f5e26ec6fb1352ee423833a1684aae551915f5c925f77debd6e5f6f880ae80e559841cfe8bb860cd88c5703d9e9029ffcbee9f2dd267ca2d8e3a7cd987a096dcc3557c5fdf55c6e65ee3397440d0f5f6d6faefded613a20faba402f90e51b205da5e76331c72eb016a9b769077937a02e442ce2658836e57d22b70a13e483a2647a6f3c06d9837e857f40fd76a6020ea9acc224b804094ceadd8ae193f0d9808b235d950f84d1262cbf7ec9242bf4f78a2a2d59677d17e3ce4b2a5a938283273c1141229e51ce4366eabf50826386f72a4cccd4f65be92691fc13b995122722f1f4a84935d8a152dea1813833f54e8a14750f4be72903a1c050e5930b481bf0372df19d888210d0fe4462c49b49a22cd3438302bc4cedd1f3ea0e8b786d080b863dcb73f8d6835a4073e29a3ae9386be138c6bdd8600e2387380ce76f2941f169948480f94e7f3b3f807f3d955c57a3b8b528c1ddeafb3304cb4f5b51d5703e5bd2bb391c727b00662a97033d0ba670e44947b33f462b7ce704643bc32a094ed768ee00d4cafd563eb2d8af948fab6fde7592067f1a156dc883da2d257f83af66d78b7ca4b07c8933b9a2872e40bcdd11caa6300fdf4f8203ba2f941b4e65dc749f12012edb8f35efbf832e7cd7716518a8e2c483fe40564327c2f4f73f26529b301032b5949bd8bd34f8fa02ac6f747da0d6385e0f8e56e14d32e45b9a4bae453b1485eb8428de46aa829e5247eda79b32ff00007b901068ab0dd6bb185c4c0d008d7f3322ccd2f690ae7fee32926b1befdbb01ddadbff63c1a2408801cec85d30e9832ee8ee435777eb1328e4e43b5a37eacd08a5e8805d119eb6551f198fa03cc746315f03abe3d0b6fcb4e76994d09baacb43554c5faf2b51acb4a8d31e8094951cdceda379263b9090f4a28904398baa1f70715dc9e46f79a80937720178c8e19b942d5437890906847abec905ef98575df272b37b976e651cc5537cc4f35a1b26f9968c6396c9972ba984a0165d4230eb5bd1e3c13298a28f9b8569c58ac8c0637fa1c289da0db10b23acb4b21d09d56c0f374557308ec074ee35bfaf99857fb598d78d16cd45e2b75b8f6d65a96fa334aefb7e9a2ba13d712ffce4dfca1087b1c7c04296eaf2ba94c3b540ad7ce428f99d96e5f69e8077e8e3338fc2770a96dcaec48996bda49747feb6b50621f7e51f6da22218e3ad1e60aa8207143ad41b8a907cd872afdc07256efc60ec131b561a91a5a96d95778f5cd850e131700d94602f51a5c74bf998d1970eaadbdadefa7fac09e2614e8049521f38a4a6d0f78fe1cdeb78111c8dbab0f9561961e3b340a31f4763905947ead4c1a1d7e0b8526c841e92d5cc9c18eb68187b230ac828d7595e06b377604ed2597214e17ba08eb8cb73e03576452bb95b76d65e22f2b01cd6fa904892de059e54a31a67d4240d032c706c1d9a9226930f97002166edd99fb077aca95f2cfcbd4ad71ac196bd7dca3b969f04961daa06f8fb8123332415ce7a57944c48f7949dc080ae851fd7218c5d58e17115421683ac06c1da143ff527991cefa7eca87dee4a223e28ebfbc8a81639ebe984aa0ca79d6b5a9c769be839a12a2742c6da18fd5c4e523397a5a3cc0aac06d460bffcd1417ba400f6c26f830721d3b343e6e6695b67832b8f6f73668f31dad835ee57af3cca469e013e0b824f766d60006976a0dc0039775fb397e6286dc05b70dfad7ff3c9aada22794cb5feaa6cdf68cc3a3252aaedbd651c81e97ab27fe4adee7ef1eb1c592be71e93ac89304a9809a9b1ac63ba38545bf4d1eeeaa231ea59a54c739714ca29ab6880c4639a9f005f6c7d6d63c071d290f70844ecafaf02e09e86939c558659fc11949c325bc2ded69eedf3e75052bea07d85aa154d4f94ef24cdc04f51162355943f926a066e59fbbb83ee72ec238f0702ea8ce90d8c36d1e282884499e21c545ae2557f0cfa285b4cffab8af69cba2111974bdc62fd5f45623569f09282ab54e03d53d5d1eeb061cd81b983f206d6ab442c8563e00b74960e56c3f7cd6066f3cea0fc2317c498aba7eaa71280fa5af1f50ab813f74f2d60417754bebd13c59d70addcdb21043795766ae2ab060fbda1bec262613b30d020c6176ab9e4054dde60c46472a03613cbb3b2fab2038f75170be3f2d00e490343e6a7947dd4cd66233975316df7c2b39aea336dcc0c2227de66d007e4f3003d664db8507f01d4b5084540a231aa42ad9f846c9a5d72303c645a2710148beef4f445ba3d31eda3b0ea2eb755622a2e58460cef3eeaf8623955404999f32b7dc07a793da93b1ac2c0655039c97419fe4a3b0e0b99f8e110850dc3c803e57425066542a322fefbaa89f644485cfbdc3b09cae2725a0bdec3c61a5f12ec7fd88d5d415c9b38f212d364199583ae4df35d0d923483ed98440472e77ccac236db0f2b9b018669b8e2c5f54bae4c3c0ef1eccc0d6ee0c322a35af211a750138efe3307deebe523c80e0a9409093264935a52dbb91bf9894f9f2fea0559335f0ca49158897647f583d709e6ee30a6d69f8f37a311a63e9e537a0bb15f2ce513248092b4273b1f6d80e05c6447bf4a007822f3b8a3a83070f2d666fe7b7d05be5af4cfa14494ebea53bc7a82b1ff7c50b1982f92db9c7fbf8236da17e6d3e5ef348390964e3e2dfa50cddcc8c99bbe65c06143a845fd6cc8a60dcd942dcc35f435bf9e09b071662c2c970bacdafe90ae4910c89f6f45982ab2edca09bcb0568bd30b307227e924ee3b9a7fb582a293a8a01936beb3ff72645d3957cf103ac80490e90075f10fdabf025ab1693d1227d36a0d06acb0959bf3f982ef8ac4d61b0cf3fb866bc840082d055a393e86e7ddbd0b4ec0dff1a265581c5d099346fccff370952afa0a442da6d91b8fbbec7e15c41860edced3a07f1f3a2a2e9f131947569b5866773366cbbae2112d47ca6f7096f5e5f60fe31a4997d77cd6f4c5d611a4e8a7e189c03252d7b4cd8a98cd167e9438407209ac6a458078b78b3abb9ddf7ccd25f4985d31639bc5c33ff5510d804a53f2da52ac3b0337927cc3e770fae13ccd35483956ee6e659974a603f2df3637ed8f97514ee6f34bb93f19719257c7637d7824d349b3e3d3b464653b2ee5f0db497941ac20f8a62b5170e46f7c3f029f324142fca24c64448b04e61161dc40a31c4261c9af0a8c550fb4bd47bb3b133ea0230b1bfcf2505691f8b10d380cc63dba7d601065872667286d1c80cbc689c02bbff5c7c65048887d924eb51e01d1f9c88cd536d0e8f4c0401c8aa11a5bd6d2596a8b767ad0ad388274277f9045f465bae339937dba87fefb45803f43757ad3ada534be971e0f056510d3e31b63be100622f5ccb87650819e7a7591c3adf6429d02a9e6b772de7d79facc762bc58f772ece92393da6dee6ce2e037f176fc9adac0523a53889abef559489af5df60909b948a76f69c6939cfec2922dbb2575834f1f6a70a6ccf7f96c6084050e7f8b462a23add5c9400f2294faaa442b898a521ad3c6bf9eb7332a42f1540dd9cca6caf5d20e12d8bdb2064518d448e4e668a893a4c1087cd2edd06dc962203c67ebf6a0e6509d249a2cb673bf78b273d690e52e14f1e1bd9aa8aa415b46f292cbcb67cfd30deb196fcfb1a5512ff764c4a3965ea6d1b1fd88c40662297aeb9972b58cb72aae7333a91b965e6062ae145b113aa9dcd91fa937f08344a66671acf73ad40b5fbacc0fc0a0c3038fb94d1ee45a50942980714cf29e9f6d74a22b49c3dbdc30d4ab5c1a50ffd639118c3af11aff66b20f506d55732eb940f6a68efc631913dc4bf8b9cfd4793e63a8541e174970eb6800d15a5f24316f63befc03314f630942084b5bbcc5bd6a17b6b96d1e0a3f6d4aa08bcec67047305a200b3e84f35a2b26abebb84daf2ce7d9bf248e51c7eb5abe60d83127f1c09a78ec6c8763f95f07de9982661efb58460e441e187f2ce53257c44f37f0234e0c545688745acbf21dfe7387cb9d24cff349c81e91e283cd929b3d6939bb8f30148100f78bd5e5a3dbfaac648f44c5e47df0cd9e612876f4e9ed5ebebcf6802731637e324471c0f4d047b6b0f792593654b7c7262cad710ba6e28aa8481dc083e19020b1249b0865798a24e5bb22595605e3373e4b0e0c62680f53ce51bdaae6b37b9b0ca2de06666626799b306130940027b05f52b693a99bc83c996032b9c015aa3f9d55975577f4a1271a0ddb99a0e1e9a501ca33c131b0a1c7820a397790869090fba373703ac38ea00a9a0ddeed199d97be1801ffab45206710a61e5ed894c3319012ded0ff414386e56b548ad915d80afcc2bdb976d7c8adddca7dfa28aeb694033a5612660c644e32f85c2805651d713660a38914d70f0e41fdc4b3d162ef3acd70659eef6375686bd78130f295d26d03686fd915c1780ad5a67f26932fd188475b89e0fc04db67f87f702011169b40dc408f43ea357826115b29ccce84022f19523f832c6f1acf7156858fe175dcaf399f6e34129193d27d924100e3fdf571ac0af2eff0f0c7f16f034ddb04221b0aa3cb99341f746fa282c2518d840c200287dc40a1da38478039fc459bc9a9eae5935bacce713c4018b991d7ad2f1d1644255ca52358a43dfe7aa7f94cd27ba0c280d6055db877d9a79a574ffa35cf5cd91cf29cfeecc2ffce99acc5589f25e11404b12f8c45b570d1ada936ff38914813c734949f172321632f6156698027306c9773a7b4a953ca195bfe0926c7e17c96cc99288e5843376e946c18da35fdf33ea1a3fa7163f139f13dcc430b445e7ed495a6d53730819653713389352128ce0ccbb8944d060c44fbbbaa81073e66a35faad40734308ce2944e3e1404c22605597e2801a200136f9b6e0f2fb52678ae9a84a74b1fc8b390a3741265b3a9745d972178cf0ac2953e52bd60cb9f8d22e507aba72d3469a425238b26eaec37a22b685e315901fe0025b43255c120f2e3eb39984a1a1cb3cd14771c022ff90d2de32f9cd83c01f2e2ba226544cce3c84a15a2c3068e53079ce3307f2a81748a76396f65e3e49541cb603fbeb42b429db418d5c4731652059215c25d069be9401982aa31caef368b18cc6ea73a88d7e3b0594515063ea41e5b30bf1e3cdbb1ce9653529913b8500f693331d73e521e2add5b632d3653c3b246a8793b23dd88766b201b0454ec9c7f1b491b9736138fe37993d2758a123b71f2f1a34c61fdb7e8167d45fbf4d8562acd82ae9fb849a7ae4396f5a687e675ddceb0afca5dc8da8416df75e87a2827c2fe544d394b60efdb99e95f08a64cfd46584a012d9ddb6aeaeaab2d625b388bb80c5289fc55f5e2fc0aef61447bb25c5c2e4249fea891e37d0074cef21ea5fc7a95e1e7617e750ba0052dcec26ec2fd7f9f1deca5e478cecb06c0fd004aece49b29a6d8011b6ad4381738da0af5db6b3149515bcbf81ca7455c241a256669ee9a15f5fe43b343c754cf752596a7781001ab6139c949e9e79c7ef2b8c9d7c974e80973acb1dcac7f568c8733fe0a25a67143e1e936606d1a00fdd15b7635781215629475c40de146eddcc38799847079009147fc9bc202b933472464a2f5f24092cfdcec02bdaed86b4ede9301acc512201207e651e5673fa3e98086e8afc48af09fb171e662418e5f411cd8bef9b00c6054a6290140f737c3636a14bfb96b4baf50b699f7a265d34a5222db39e1adc231b7a757127b4f1c223345a080a9531d3f9150e6bee46861bcf0751cfafb3ace24e98fd31deabb6740d797bce3f6187a21b014ca94aee59417ba88108abcd3aaaa38c43f7c25d8a39fcef4cc423627ece65b76c811785a04fb1ed058619cf4c24243e8fec5a3234b9f97d15133d01dd00df1fb51cdb7321ec77be24708123abf7d89729372e937e9d0b0b1de215a46edf902271a2211fa5c1d70328ee6b301fccc77d5802c6e62e8d3b82ad5a34b5f71480a6e63b6ef3f376d8a4572a605e704bfad96572ab940d3090c80da3219a4146b7945e0d4c56d5b28289fa49e715651b789498b16406e32f12c685e464bd141e3ed51f4342b0111dde9b587689bdc7e5499439e779a37831c9645d45868438441c4f7103d96a7060f3c0bbd7cdbe5e5076c3903b72d293dfbe8bdcef0e59745f59ec9e7597eaba23cae169943b81f2050608e5d6d8fdfee1f8214b0a84a39117fe93edc30799b70d69e7abd65b6c4bab014a7fe0338b7fde7f0ff2bd71c95816112ca512aedf2ec7dab8c9c5b6e830eb7073a78009e4df7f5c3e19315c358e019d9e0f8d1625e9f9253e0b88d35e6b6d5a6aa5dee470e56b9695088ecd4efe83a7d37359c6d1ae4a505fb9483a34c2d8c717c1234b965b4a35fb06fb4c7c6f4239b219a1464d466265051a2c74d4fed5bf624377c7c107c6425a5da06227a8e65a23488b1fff79ea6b17775d08a4e70b4b337201df56b385c39953a696b77218130e493fd8510e8a6b7d18027e0e4423727297ea1bbe252fc3a03135719495806b5b65e6f9aacfe96c1f45445f78dfc43d07fa590361266d47573f747a27d9c56af3e1a80a7182b076e5464b324c7e97b2dae37720a77de759a6c48c39d6068f18bc08ac9410f08691b7623e7ff1ea43dcd49a6cf9f9f44400750aa5360ae3887e9f211b1feee114c67de345cfcfeb71c0db665f16bd512c45ac57e5fa2c3956a384731c31731d021c1f0f8aa84e48c968d89178005d5d492e33f4770ca2d0a18f5447d854076bf79c852f3295d6cbf2dbb461e13e3fe040c6f22981f4d670124bf5e5770f12949b4d978a681bcf3a9521551fbf58cda2bc12d13d2c3b2ee150de519520eafc6197373e6a52c4a15e5943a5123dd76d6a631cb97a9f6814ea04504f9ffb6e2d97936260151817b4ffe7488b8480428901ddeb90260303ef55d6aad64a31220e0136d7e6d4e39c71e5e638eebbb3 +0xd4292e3e757b4819873b554278a8c484e99c019a18d1073459c56ac454c2d518298050a78e46e2af85b25e05fcff6ad5fed4c436577a90a3107f25b99f1cc999 +63592 +0x7d130ba831a68bc3532c78bc6b1a47c23e3772faaaf37974d2fb275e7b0a1677b60275c7c03b098e261b727a2ce7b01c70d8e59dcb725cad7811cbbd78c5d56e345fd34965ccd4b031a2e21496f988690c7c91d766c011b3fad4aaad0119084b4153ae96e901f513bcea51f471f9d7905a4afc114585a06ca06b4b97e0aeb6f623068d161381739d0e1b4781858ea579a26bb0b12e6a0fc2b1fe36e1db2de756229ff831adf55638715c4a239a61fb0c2c073521ea16689c77b7f4f5bb3ea3558847774f7d04a7cb2bd5e4427719e0313f4511c74133b3e138bc0c394788f3da9b2593d84d576d3d85af9c46e55f5dd0254dce0dfa66f67b3d35061749b4decea562d334e395b078c712fa98acdb79d12448f35adf593b51ce4b6bf687696d17ec25c0cb076778633925879e94343c1c855e0915b6b4894b3225c13dcb50a79eb997e0058375cee62311cac16513ae9990b697a8481ee951b3ed9356db11944b53dfbe4b1e66b9e9ccfd4c69e61fd8318c79257a5d40614b97c866a87f533c070427df039fe342547d1293ffe001c1cac3ce3cf3bdc2fc2127e0c49b81bea8b81294cd97cf93700f7e7829e91b60714d7bde637b2f4bbfbcab5d3497a8fbdf47c6500f6d761f4b03175696915fe5f1a3fdd0227a7c83b4026b673f04bbb2e99d68832def5c2edb1690d4605d743848b291cd01586c14e2dcae246b4a838acfa04054af8348692931301c11b721007e647efd897dc7a35132bebf43d1c82c983a95ec1e9303773c3d405330062fe59ca00e87415255db0aede15e4c0251404c52b173028656021c2008a446b26791a94d8794b13dde6114f3602a1043e86df4d0da10e1c406afd2c4d035da238ea9ad55324b62a729e0772e834a16fd535b969b59eb45b5de28650fe02e74c06fd8b19f57d5dbf9fffe3c8591e6e6995bb33d9d762db5c1a515ddeb7fb89df3d1c4bb133e59a49928636adfd428097dc81deebd78feba50221d433ff7fbdb247b15d6992e0046f16cb80926923606136240b3e3a985dbca1ee99ef38e1eb9b93674071971f2486793a52241143865c2f1c593f74feba0976121f6ee8d49bc1bca89587b4d56326564d1bb18a257aff13c5397e2b357911fb36c531a3ca66eb2fffbd0a70b548d52a8e5df9383ba6b0a0c93c58a1df237cadc72be5ee25a56e69d727786f216e0962788939a018b2174292d27d8d4e41901a3dc3ea2c890fc206b9856fe4cc1b399a963e11562ef59975bc8c5b42254bf2ad252dcce376ee9c6321274f85f808fc2f61ed0ecef109cdb6a0ca5074d6ab2af2f7b9fcb751ca442ba8bda5d7579fa7bd5606807f01671a81da3d1b79e5079f683008f7fcac3b5facba98e13d4d47e2c10d1b24ead2961663d3251ae5d2b9c699588b4d3808ba5582d149a04c4baa33b6d1ab5aa6d6ff37d92642bd2d226a46e2fbc17afde9bfbc2a77505168f53f011b5e37a017a13af55e4de690d4566186f1744bffc2b1c3fa20374d8337cc6ed16afd3073d1a3b1d56fb4b1346fd1680d316c7b4a0b035fa5f07b81a42d23c22b2259366449610c6e99f512f65435c6502f4eeff85b50fb3617cead32bdadc184eddcb9f0036b931749798c7515f604d647960a79181d1f21029b10cd6dccf5650a122b857415ee661acc9e2f4994bc3616dc5b4ae5ea43fd4d8b6cc2b1f3c64223740bb3301296e16a68c893538454c6197c72fc392b023154fa11b12ed4ccb2a67ceaf7bbc4050fd4d88c3fc867572ccc00c1fb8661c253b571901738c2612d2fb749d17bbcb147c68669831c904bc0ab03c8c752211ceaeb8c6873645f4c181b9d98cee46f343fdc1cd10bd4a1ab2832f007ee10eb6a4d63a51b44360db619e6ba684eaa4df64e71e66348651dddd9f0500fee67234311ca562918225057993d7828ef21fb9ffa248d90b752678c4c7f9e3136b95b2fde6c0a024dbdc9a91c7c616b0effda69c9607cd9d721011f061d551c659c0598e9d54b47737ccc131a2ff0af4c787d0c42b22ebf36658d1e7d75ff41e963b516eaa2945927c3ea3e28c4c056263055ffec963da143747df338f6071230b4ec1257307fc7b947a682bed73af01abbf7bd3d8904208cf23645bf39f73dda041d13962b6813c65c837952d3db1d987fc4acac072cdd8143487e869e6a0553e5bab34defd7bddd97038a7b472b3f2e006f76be9d1218bf0c471615bfba092cbe5749e4ea69364d7b995e9ebda5c559c23a83ebb75e6294a19494e30a71c9c302757fd1c7770db46ed73e3383c5509a59c86cc9f25c5bb097c383850b2bc7c56697adbaf39bb491052fd1e04624516e1b9b89cfbab6548173566a623e4273924f305bf6fb31bb71c305821b812d5853ac1663638cd70d85b8cfa20110506db810c2132c4af392c52d1af74ba15ad5d97feba23bf548b74bdc91c2e82dc006b57fef6bb16f3bcb09a7c28a0743374a6dfb6daeaf70760222533f659de32beef8d0fabe2cd494d4bdc78eb2c4c33d368fc32ee1347b097ec7b13ad288dcfe7720b88682f51779406000e21a0acdf71acd5ba1f271915d8daa7b16c24f77b24f9b9b1572b0b4538e8ee86f285fbfdf779529594add400caf3925559d384fe1d8e7fd19d5d617de2fa8f288561a1560cd85b0d772ddf37153f22479cbf9d1f79384531654dbce53943c93b03bf06b259d0d868ed2fa48262c640ce5e70a8a7e100f31ad5848547e6cb8509932492d98569b1ef203c8aab5991d534c76d0f5ffcec71d215892269909aacd85e1aad9239abcfea38dbf978a1a7c7bffe3e380c7307a7a14ee4fd13e0b924f18c28bfa61d9f18a15c9559b3e31000b82c6b8d79ed567dd1a81e7c0f7d2fd79c44d730ded84c755bb5f11322c6d56667787c746d13e3dca94abe09241104ab21aead680013bbce626b778d8ef3fde3130bfa57af8db5aa705d4c0b1941408ac7f334cfd475f20cfca5af30be11905e050c6d9d0802d4d16f0851eab7b7ec5bd73bf4cd24a7fb15728b22647cc997be86a45bae401a4937ee74540dc61b100699ad74cbb650ded30c4757928ec318eddcfb4ef21f7e1bc634c8ddde0e14b27255723c2f5319a12d11fed620bda61ed24f38cdd16dd652648b2d74c4564bdc8953b1d463c3aa4e0acbdb2878d11aae55298461b3f1c9f7fb39cba22768689532da93c5cdceaaec548003d40092c9d25eb00690007400107287c9ee6f0a12e655344095d73cc284f279a16222c85891d52ee7e520be23a8b1bd50e10505f1d5dba7dfcfe8d4991dccfedb5b453a72f4a2e94ee57b97d9c4a02387014f20ae6daa7c99f8675fd8bfca56d946d0b1bd01ae2a641a79c7ca6e270197d9b625f1b3abfb959abea62672d4cbc4ab2df5e1c2df38500b83159fad2e9ea7eea3da61b1c66bfc3c546e2c3fd2a3c412c3ce873f1e5d3b40ff4a008a9d43e0ca7c09a76ee416f5679182912dac270004fa04577f54df4d42572e940b5c386af4aa786bf2eb42a9a2dda9fe454a9fa1083a5ef88a6707ad98f189043b53c56cf496f05446c5383f75a0aa1b8e9453cea7eba51368411d84ca3723f71f6b320e53a7380a715840e068424e8f10738ab06875a14f22c869f9618fc416c18ac67a98441a367b8ea1b4042b5d03d3cd8e6fd3411a55bee63235e46333092899cad54bd75c806d4da5e2d0c49f1ee08ca53270b5d8cc4782c260db1a39775c81864af4c7c78f4e7f92935573db893e961821c83aa25dc2835fa1ce1c9e09662842fe1c7c230c260bb1ee19a1dbebf5d52f66623942b039d3522046d12a664d78461c4a5e389efdd94a1ca6b765ed0e2f3126c6187e6cb359e306cba1a4361958d9ca07d5cdeedcd1a544841b4237908e688c7d411f3939fd597be3f4d623d2af4530da49aca3cadb098f39373a7083d91abd0e1aedc1d2a7fea6183286d38167d0784b229b66d0dfc0254f721440eff890e4010dafa9863f18b0f1c37dee2e67c3c7e2c863dff5c5102d4e339a51ddd21227df802f9c5dadf0c0f60f831ddf97664828a3ccb5417542cfbce492485451e7ae2fdd334060d9ceffb07f60089edf0020a41b9d91bcd79d3523ecc5d05d5c59a2798b843d96acf995a679db567227db7adf99a01a6fd46b840ab3fb8fffdbae2b46f2ea3c080cbba96066bdaf64573d7c5f839bf96152f2e7faa1fb2d42b72f701c7a2ce5bce25a6367afcebd7a576f4eae4357d59a3a7c847a1e8f532ed6249a868b14dfbc171fec42bad625be0fb919543f9c5723754f8312927da9cc21d5d0098d68d31091526c79f19d9238686205d7e1312703eab30d4a658ed62380893b2fe8f168be3a3b0a95bbeaaaef48b439c190e0ec4280f24aabff8a833bdc8a037f047747d0f922ef1d7f8715eb99f5de99b36f4ee9215361bcc839571d1b1e4f814ac2174db54e4399a73a7c34416e1be8b4a7f7ffb41d7a052963fbd0278e47be2099813e58082d929acc87d32a671935fa508c8c2099bf0f88cf165ce62215bdefc52daac998d58fc005ddcf3a27ff08ed32b8994f0f56614e4651ca4221de06200fc299f046641881ac27305bf8f6e9f514212c28c66784e490542122d5cd22193ce914b55a02b5458b0cfe742026617ac06f5093081bfeb075c6696d84079844174921001bd6ef746835426ce8b6f7e4fc4b0a781b99591cbd4fab0d77b7f008678bcbb9d2094d760c49042d98cf349b915d64bf480a1c8f2f98eee9f603b3ccf35617c8c7c258b33ff14a9e78989f07474c6551d796d07194493ae9481368fa84530f15422a9694c8d51ea7d03ac091e5c015141064fc29b40a97f5b71097f9e229ba898b69917f719c8730e7dc1f9f35637df13b9d282157810ef58922c931d581200ae9a6d1dd00ef8e2106a7459bfddaa4d09f68ddc04559a6d10770840a25034a81a60adc173e75396275c3b9eb06d0939a85eea16e45386871792353ec99563fd708bc3c93f3d792dc7c5703f918eb50353557ff9321c75abe2762bb3ffb2307f258e479bbe7bca175638bac2bfbd3e58bf7ca7c979fad869e5856466b1111abbcddac19f6e1cd6d1671883beb76315983136fa2e38892f4fa56277bd8a4c9321ce13aa6ababb2fea8ef7638a052adb504d06ff8dda320abbb67fce2ee7bf2a4f9aab6a8440b125c11257d2bb157ee00f878f206eebafdb3c7d4fd041660350a3d8149a528ca95903b5bc39d884d9d4246511f557e93d11408e55468b6193a6bcfae1b27bfb0e4a10cd973168cfc6184d6a41f6cf6f845d665e12697386fa8cf977953b57184a7976ee6b31c252ce3cd90b81ad3bcaf0002c5129e17022a283e7d2a19d8a610857a48ccab39bba4cb255cd737133a80aba012bee1727e1261c169089716c61a275381d185f4b62dc09422479eb3d735eeb6332e1a2f12eefc5f435cf2fa396b3529033e66d57f8f6a23ca51783bfa94704e10aa6fd72888a021f36e550967cb5605b55b78657c9272d93c3ded340d67da6f917908f127a6f60d6186e6cdb90132ee7f6fe32b16fd80bf605324257774d3229ee50e057711a52e76eccdcd95d772ec49c4cfb0b59a3bdb1edb4696a084046e1f34a99c8091568918e733916413be07fba0637ac22f4c375f1c7a0ff05e155bfcaf003da9eeb12830c140a28f7ebd487e4cc713a3855adb095fe919cfccadf11d9e3c705cef5d12a7c01b877ce018b6b8102403c2640ecd06ecba3ba59474396a4984bd015d034f632dedc89501775a9233a2d0869410173c0b16feda7f143accf701adfe004ae84e50ddee41a8803af4ff680456dc07c1950425e9d65532fc29f2dbc7bca0dbe44f701480e79fde60c7ba9f269c059cd1f81e0e8401de79886b803993a3055d4b4dd6b906f1ac37d4f1ad6ebfbfd876514ca2fa57c4e18ee578ea439a1cf6792532cbf508c698349c5c20fe56271a3e487bd810eb85281c1b3a7823638d3dd77be595f00fce2a7cc2ee5a76733c969bbf6c0879c7ad79c9339771fe775fa01e544e7cd1a2712cb84e91a5ff9f651336bd077a5c73a59d3d34791fff5cfbe8f7b955cac14a17648f462c47c1600d58b64a3476e278d45c2126c7c84b9cc7dd09b1e2c5e78e289caab4a789e341992ec46edb43335da17d1d1269b50dbf2d46fd44ddb76cf60c9ab09feab38ec7725d0832e42a76aa76cad8ff462e6b4b94ec7a7a2ee6770a2b274a10dc0de97c00ad299d3773d4e8ba09fbf5487a8dca6498295cbd9b3153ee0a200e67df1de7abe6d0b8bd66749ed4032dfc56e39cc30410b1f1721dc158bb0dd9a172705190dccfa48a5c4a7f542e80171d58afc0bfde1cbc4236b650a1fbf61dd1e609ae00f9314e1bfd691c922f48615f372720455986ef55efac06b7178e96a7a9f25cbe6cd47573890974e13f22b2cbd993e5dddd15f43487480a21759dea2aa47382529b80c29be673aec8c6d7b267273b360fd29073e7e4d285677febc163bfd44845f0fddc9afeeff3d02c300a3d09663c64a1c01374f0929e129c3fc458e35cd71ed1126d78b7c46b7fdaf26255685e1f63b06d7de591cf7ea933629a13f6545765a8891a3dfb3c3d6036e861b52a690695685e5942b1d34cb4ae1dec9ce104f0a3dc288df2b19d92f8a9d9b06739d01980315d4e9137e431bc743662f98db4c85ed5b86e9fc13091d19c8cf7737bdb82ae743004dc0b4b5548ed75a334e1ac0a21fb00644a123d637275cadddfdad166a797a0242a1550dfe081a45855c433dc71b6ca18fd8e0c2f639e5b0ab53dfcf0f1047556843d3af80c98892862209366d86edc32bf1ce41e2d7d0727fd8ba24516217741f16b53c7559aeebc65dc12d1dd8bff5999a40f58577c96dcbdae0c909e586e8e7987e17542ef99bb65e0f9450975fb35910fd3046901cfd0ff8d82f70f1021e424792d295cff52ce6b1490e9e294986fb243794aeb767bacca104ba2f3b059ecfb297f0c2933e39d7e601ee6f2519eaf0129485366426217271fb1bad1a2de4e057f1f4633f113cfa6aced64c112d49c88a98a4762cd4cba1ca2fa67324d78b14a6454fe02a2a90debe0438ad54003df4eac854e657f013cb4816fd09d19efbdd3be675c1caf6efe56e46980b844f3205b18838ef9c04847f4a4581e9a6e0a1ba777a0890b7e2a4beea0a76ff2846c06b8d7ca32a5f8eb80e6f4fd78b1b49273ce7547ad5779a49bbcfc447f096a36396ccfa260f28fb0919157a5076b53506c51a2a4ef8607a697c6e18ad7875d18627fea554066ed6022fdb69af34fb309af37e4ff78228ff6e71635bfa0f4c4dc29fa0e2afc8b7ac3da33fa2263e63d88e488259f70b37b5d32b4e22c01d6094835e42568b9e99fa0623a09867fb65794b24d4ccdfebf32a320a6ce1923b793252f451658a206c2c0611acd0e71496af4c18d41d14ad01c905af6e3cd2d1eca3abe25c942dc6c4dec80dc2d015e27df71ba50ecf37d6da1ec88ac0792489416518b8d266e92a3a6ea678710a971d61cd3459e357bbf1f297e52ce24ae9ca0df303d841523ea313782bd23604ccfe08be2098004b0376c1c0f5e66216a50ca8da07d137eaa0ca0667e2bb90433a3cd9365affd41db0edfe267577be60e8d9a8869f341494b21789da5584fe4a613239b26de1ed4446bfde34ee3165be27a99395346165e4e513f43beedf0e8ec476c0deb3feaa5337750888caa3e682e404e06261f9aa5fbc37fbf9291a1f84f682f507d7a699cf05a5f37e855fbf539064158a925d6079aa0bf7be9ed6cfc159ef5cca436a3a2c23bb2592c8c55ea4cf5fb98a501d16a720f88de8aa858dc871045e9271ba19df342d2571ef6552faf35032ce35a93b8cc3961503f6b6d80ede7a70fd0d26a77c9994697873c02acaaede17e28d925d7f046d239cedeb4d08f4aa3a6650306168d6596832e06654a85451ef43f268eb1265d630200a834b5b462c216af567e6486d14b82ddfb84ef876641f8efe8d62cb6a69d119d72f615a6578bc77671d947fe02ecfb5ac36984f978d2f1ffc70632e74a07cf6de300daab50872282ff1fa93b2301586e071cf223a25a47386d25aa03712aa437a45cea0c753c8d9aa65871865a1200e16fa31f4d0d6061627f3b7b50428cf9c55c122f11ef3471880e8d8727cfa85b7ba208f5bfe16ca945a8518f17e6b734ddb4288f01e6f73712e0c6d366ac4ad10449535bc0450686a88e6dcd9f8533bf4854a8f426810b4501c4093c8b1681ca430b8a389a61b76054d99a1d32458600cee39945c6e9fa051c6160addd37d4ae0191b776935e06a01232dd6716513a61360a046a2a464cdd2d60d20ba537cbe50682e1fcf4647caca841409394cfd7484a70f04a9abf8737fa68673f2c3eeed71a8711b2059a9feddeadca8af4e8e31fd0be65cf5d7c357a4d222831b773c6ed05484e800d29facb7e1e83327ec3e84d919b6ce0bda6dd0eec361cc991feda8d8e6ca04e563912af4e3e74747a896d3a55b00b650065085b9f4b4cf00108b2207f9c0f0426f171ff18b2a4392f61fb4ee4a44c476fe03dc93009be8c4eb9d70f9e7fa48ac6799e25a2251b67e67419f10520376c524004c0651a7c86c138d0c1b4be66c87efa2187b53de2e7e7e94f8b82ccd3bdf1ace5a808238ec7a2ae259d88005ea7959c838f18a200a27ae92584214f2822934d69e9dfcffa3639425f0de4ee920d55864ba395fd7d7fe79c2444ab523e84824b17ebb3c3cabacd1d05778e2f0ce304e1012df2f662657529d333e77c1ec904cd78164baa063da7669f454f6cd412ebd42d94f834b63e6db9baba9f76cfdb62fb12d3712ab4a61046b6deef4df081528858406f6081f11773623f99e759a0e4fe7088ebebdedd4ee5d1aa36796a17802409991f21cc66bb80522c9e78c502d1fe179f82968bc9a96a7811ec994abebfd1c907cf209e85a10712e776d11ae87322917efed3c4546bfd337bd854965d55b71ff24905ff3611312bdae99960391093648f27499065dac88b50c35358db8bfd93c25377f7615226246bbf789fdff1791b38c5a1f7e540f007f8753e9722a9ccaddfb61e8feead0d8504bf18e0c15efb3be39f8301bae3a030dcb6bc5c19f74bf6b13aa3cec56a0ed70cb31e2ac79e414ef77e95b7cd0cfe8c624e75aea8bda3f5a1a6aebdced153a1eb613586d9fb74dcdc2a8220060232a5f3041295b742fb3215c4e662f229016b089103fbdfbbbc6bf96bf0444d0f6503f8a13b192ecf7c36765af4c717bc43becd0d3091c1274085b809882c8b79bf2cd7ee9743f5ac4d882d317ff426d03f20a19c6550678729b180cbf1dfa68967aafab0cf1af52198b1a01130ef08ae1d1cec054a41ba239e78ba7ad36588878605c7b28aa61476823739c1afc2a39e06371711866ba042c860ccded8c717bb43c3a8bb71f03bf235a45f0ba375e1e722fb8888c2d7022ecff31fbfa60c3d6cc76e04922cff53ded97f79b5b50ea9d398efa832a58bc92ddab91be5e53ce1e4398d420062dc42829551f1888c97e2a8919bdfd6d891db88113928183e60eb69c2a9cccdbb8df22692a12e4cd11776af3488963e02f122879dfbaf1f587f42448a4909c1e11c4912f8f798c92b974c30aa3d3330ccb18571a68716c3dda1d0bdb8f561a37990318deedb97c6431e4c731a422075dddbeb905366c7cc72ce7c1b75363c3d2ef291e19cd6930dc0b45ebfad20c3d5df763e2acd1f2802c10f2ea8e8920255a54950542b6ff4644b616a5e8a5e8617778b65883c3aa32c726bceaa3a931bb4899d582fc32f22948c2e5896db84d0054f2148f2c73f9f142deb456a92c1f02280f790ba8b9d86652a2210b0c51b08650f40cfaf96b784809996793019a3e767325ee03cac41869ece467bf372aa98005ff0e209d22ab9395e745344f6c1694a49da30ff4ea38b091fa07fa90ab9e79ee53a6946a31ea807258dbbed52a3df946a736849974cfe6cc63b0518b4d05d074c254caf301db8b196ea9a7455d2af0d3f327163b2c345906a1cf68a997862023aba738ca2ae51015892d62126d5437d701e3195c590ca3db44d3845e1385e585800c625205adbbd148d593cee3401aca53f9126f93cf33a4bd5b592b399b9d14dff2ec1d3a7beae71e4090dd4785362859e7960754e2a51d9bc53b83722db35c1bf91aae31f639c189ed0dc0128a066b842d289624ed648030afc01975b2d4c5e49d926774a304fb0c395f09dcc4f81e73482eae7c45ee873c897b3f8cc15dec9a4ec7eb7af8e8ee25c4092cfecca7bba7a73cb2d392cf9d1fe0c1785fefcb2add8b4faccd6e622566fb80abf11781cd81e8b745b35a743c4b2437563784b91b0ee17e1de479ed4b307e7a096c2c12bea27b42c9a3e378df5ee2315bdc268437aedff7d148b206aa129b49c7c880d72979ed53c12de44a10cb9963eb965bd90b4dd53149729d2accadf074598eac4b7888ad6ecea9c3645b01c84397fe8b04006c6fbef8fa91e64d330c8e413704ec364f39e844b007642891dd34f38d3ab1a17b1de5623946b586725dfc114a2145ed4e2174c5c936a6040c76cc50caf15e790a5e6907b7020512cc43524c4097c4f805d288c46dc7b667d1f37e62202566f18abfae7c0c8a717ca17b0554b2cef600f6fb98b3064111ee72f1cf9a357d67a58ca02a11a216772ea26399bd093d6572a1db39243b1954e27fe0445b633fcd0f80ae707b005c82a34f7b9407bc797fd7871fce9a64d6dbfe594d513842032389f738f61abfb32064f95168a754f9c1aa2727dd882c00339c8fa79ab35a5e07cf50ee3f7328c0dd0e4053ac2e6b34b764f281ea7ff90be847837d655f04b6c62a4e2cb106e3ec14e9a500b2ff67c0ed8289cc89d444705679e53d659dd983fb351f730f6879cb6491a7f731bcb314c0ad4d561037a6c42abe25760fe2516c136a656f8efa42b55880b9a59cc905a6cd2fcdbd221c888dc18eb4a5b8ef04d5ab54b060d44ed7504d516a7a48b6b80d8f948b7043f57223b766234b14f65c473f6e80f553d8b012cf6e3b03ea0842af7475f70dea54fc2c78dee1d498aad0372c3247aba21a65736b419bc0e5304e03183ea0e479bd7f1e825380e0b86ef92c1e2a74e233a650088d760d4fcec132aee77909a296817350605e70edf8d54fac61b1a9377cef1838c2762fff0b2d89196e9fa1b6b55381989f6a426ade504c2eb382552a0267268a96cc445d2ee7c9c91a2d099f5aa6222d9c0 +0x06b3fe00a2c681dbc14f6e81ae1e7addedeeaaf4c7485d28beed0b52d128cb9e7b295838dad384054a826cd316fe20b8ea1aa35de2b39ae612342dd1911212d9 +64384 +0x20e0a77319b72144235b24a9ec5c53c5d816e9fc8e285804b727303f029341486c0904ccbebb379b571ec8fe2be2f44c0c27b0b829ee486dd4cd46dd88e895552a1ce6d58f7d53203f03420f78808d2a76d5e079f2666298e9cb970a9ec985cfe280153993e5bdfb63735c83da1e658a9f8940e9f378edae7e88eb6f4e1e58de1d9d599ed2dcbc554bd7dc035aa4c5920da999ae330d33d61b6c09b39fcf57a961db7aad5548995680958b36fffaf56a4a9fb370ba0b7a3949dfbb7f9ac4ca5939a23f0d23139d25891731c5d1093d3bded156d8915c0bfe8f49c77b45e5f9152a5a716644230debeec39657d8b7e52d4fa94a8dbfe62e4e7612f64eaa1b2b06be6bd862c16234cf380381951ded3467278d56384c932a5185a210a1d14ca9547c3d3ca7a1b659faee3ebc26a7947312ede744814149492e4462dd1bc061bc26ec3865ddec09c39398db0db47e92eb552a1eda0fa5f2d10e3bb825658143aaa497c51badab42bbc3be443de4abd1e159659ae18b80750b18f30daf261cd8bbf8044a25bfe54989b2e9e014603537a04526c3209cdaba3f75f3ca4407970a3947bb314cbaa2067587a01759d024ae6f42f60161ebbca9b54cc355acb0fcc06abc45e05846ea61c76b6c51d6db811d95785bbc6a202d2ab4c6ec18afc853e2987c29c1110cc642c685d4f6512a536b5b0edf5c04e23625850bf57914f8a25709b2ef3a3eb43d91bbfe606e9365a282092d0a49f7d9de82714266e2a5e7f309058420b5a9e65836eefd982264337649e7fc63eb0bae2d29be94c8ba283d4ddfd61a439918491e19a7ab05788b3cd8a83ca472ab08092b02b428a16966a4b9c1c39de04e548597222e2f2ed9d229cf87524cbfefb591e1f69d277c5727c23d971335803c2543cb3acab29baeffa264ce6f1dd320dbef56ebbfb8deec333fe4490f09aacb522bc347c55cd55ddb4e9e65dc3f35a742cb92ca6404519051c4b3c0ff42e663a5e48632655463502ed68535e1d96deab2cb9e7cd2325cab4bf9b4e22b07bc6ce4171ce4f3c3cdedc0e12124c5130453f39a81e8516b88a5e785ee98da81b54ed86b8e44b6d09c9e58187b1bd2168149ccde43f52bd75be6ee1169cb55d858714989e339f8a457cac0239a034e0a6c330740ed8da69d5fd627442e61e5332d3dff1823adff6686d8bea986c282174e7b6a6786970ce61cdd5cc74444d0babd1bc1c15687153fb2321b524842b663ad88befc16faa3d919645341b35a5e978f71582c85af8057623f9ec8e769321914c2caa6a6a0b49fded1d55b848dd9ef2ca88d00b80c88d51e6711b06b213d5f0891580e3c70865ff38eaabdbec387ed1a2926e5f58877e26e123ab5dd51205d135d2edbe3526342e1019a0e69e6b2b6e35beb85460a93a5dba8e37d44e1243dbc8e15b6a02e91702f946df68edda0750ea5a685b27b2647ec91d2b0a8b88e248b8cd5477dec591065aeea1f3390995024711d9041c176ef2a36d0f711c0a93c09c036358175034a0bb6db2e63e7e76fac26194cfcc5ccc61bfda4fa88e0bcadbd900029b4afd748aa1606ce23cad1fb2e2b6261ea6f6ff4494f186014000e9f3065faca1f831d2fc93533a57d219e1c33eac07814a8a9a03c95f2d1be08e839e8a8eec1c9d91c2af17b2c5b78d497f942cafb398056c0f27a35fbf78de192a36fbfa2b5bb9a1d5ea950b8991ccb04bbe333da4b3862fd138d99fb77897154064d14de4ffbac68f6791c9e0772ef2d899e8d275744b5a82bfd27bafcbaa1768a080d6c3793f94518e947a74c8126598cfc41a804aa3609615049ff2c295a3f562a1413148a68fced82399b105259d1ec84b526fb74cc67de106693afdd82f9933b909a8ee9e0d49ccb5b42fdeb71ded0bf5268e3aa610ccac4e53f2ede02ea68c1e9ca4eb74b164d4d1363b95654c6603380386552dc3e4cf530c95135c35afe46866bfcfc900b2a8ecac8ec9becd1c66aa85c297624468c2aaef9bfe9ac937c51d14540c197f85818e9373fc01f4927ec309dd61d236cb3ebc7992102a4dc0b6b311fc00d48280273d67959cfd774ae3f82c31450c0f7e9c1e36f1e89957cd31a0ec227e88be24e25fb56e4cffb9c80ed04968d16e33155326a455f8566bcfbe9d1f71b5a486d64b8bf9585c97307c87e20dee677746020c8c4e18bfeffe4ac5de084446c67126db48900e6c427fdac783d62ca7b5ccd710b5a0b4bfc483c0d00a4314c25d019919fc35dafc8ffc85465c2ebdf2b81c07182928d4788290b475985c8d88e6bcaf703d47588dee3afe9cc1941cd8ecc8048b5d52e26a98a9b81f0ec0f93ad216cc8672410170cbbf99336a92c3dac25571d2c8cb591685332e44e3fd0228cd8492b541bf6075c6fef792ada74d78e758b18701deb2fcb6c1998fae7d1303379a7495121eefed6e7d9c43014e0423ba2656308f298a9ddbd98c47c4ddb63a8edcf4ae69ec1a4810bff9bd0bf3927bb962d237c7184a6a32ef6905dd8b563f51a09559bfa37a365c4a8279343472d17372b83550476cf27a87d2524ef29d922ea9d92f99d18a08af81d900009d2fd566fa7a91a1237cc701173ab59fcfd6d3544d22a87ef2c46f990a7fda077a23e8025e8bd53039044865321498566fac6380ff145cd593b3ab9758c96f9f67e999e4137e8883e46df7254cf282f95e88d3235420a54410c27d28d148595ef30b6b7aadc51422d24463bfec570dff18f692c9d0da2a31068b34dc289effcc87e3cd34a1f220837f121e9374a481de2b6032d2f9a35432f178631fb31ffb4eb31d4fa08478063c4741785e9a7d872d027023dd330eaba04e149862056da47be112535cc9e95da3c76d115fb25496523a80f647119e992f98ea454183eab3dabe5d88b7e6a89f508bff7a4550ac37f4302d2abf19b5b5275e53ea4cd31981c1877940507f4843c8e173037df9e6d4698fdf2193bff6883e0afc07d2679c96e6f8d02aa4d84ad38374624d8812b70448b6018b7388d37aca1b4d1e80b5d67ba17f0c98239622c706b137c8e23f7f40182f5eb8cce8cf15522bc1aec64249a8978689295b3d52a6c9348e062ad4b2004e68214a0e646bd07ca8f439119178962fabc05eca426cfb515abf75a076f1cd520d03afb6901c44801f4f3df137e5dcd05b6c98ef29e42d25b056a8119ab11fc96a706a63d062da32fb5d2df38a13d52011c87838783ac4bcb1de0dccc472701b2ce20a84c9d219dbc98899871c7527a56b7e6d4491d34a9cfbd0275068a856ddb0f2f097c0dc8c01166c012a739c4cc6c4f8f8822b60373ceab7853b0be54c87830dbd1b7a0499394e61e56c040bad1acac29a7f994403130b0e97eb329bb98f3face09e49ccd9eaee24c6ba6225c0f7c955d3ab500146c5c94fefff513e367b335adb9eb4a7b6ac720f2593f27d31045d3d3474042a7aabc1f5edd60c6f3bc20a923e7b4f27c7e486ab7297599475c702f32d981a22076b719b120db891420a21dd69d26dcf762978643e22ebedf79636e23f56068a755b549a1d14da36e1aa15b6ee22b4f159f1e3c3f8c54e0c4f1885b4da5c5db66d11e78d4f6a05d2832852994bfaa95febc44565330ce451e4c46bd59f0984482715b6ef29abbff6bf0b650f03a8cf4d941709a26d584351410045beedfc1eb26bdd2f3a4c286d15edd9d98295eb7b5ceb70cd261835efacec72cfeb5782918783eeccf9278e91a2a80a0c8e730141f07a57fc4ab4244db75f8256e55c5b613a07b11c963c3cc24f66128aad4ba8b7ca9933139ad1b1e1f312c577377ce5123c7fdaaabbfac1735eb099e0496030512df098af80f15d40f29ea2ad5c39ae392154a1d3b5039b29631ff689fd513682bcf90f2cb78394ef386ba065be03152a6b1ecd442bb74858fefcbf0433af39e0da1afd178908e75136f2453cf779b88a8c46b3587ab6579674df69cb76caa8d007eef8fc8001c2fb60db179f72fe06bdf754daad4c61374687407d6c514401f4e8ed7948370eb652588e8e09bb109e595ed1c9aefb4865fd88c860533dabe3a3df8ef4871870400a90752f085a51edd10535f6da11ec62300bcfc90ca652bc817e5bf1459ee6ee688b275127cb1253a9ad09f8ab2acdca6282df0e1525e8fb0227cd05e054d31010ab2dbac478028e6798c635bea05cfd29807ea5f936cf2daa7e6a98f3b4b5637792f0c28afb82ec8f5ae334711d2a78e9771727255385d2eed4ad210c490e3721b508fec7c0240c8585f97b6eeba6cc16e9311825f6ad7943ed1d44868c5e3993a3eeb62760565cee8c618104a66275566964ef77aa969f4e0a2369eee925b941c21abf0646aa5c2ef0c3dbeed7de031c5a2b23a6e9d1a361ce7807c209e554b0920540010d8088cb3588f269fa89d3dd3dec4b103eff2423ac53b49c492d8a64b6370f940f897157dd395b1288f6861da730cc50047f9008266ee6ca315ed8d29138643bd72594394a4d7c74fd94885208912de2f4c38593cf2214f85d09be8ea581f464fed57ff42f5ddd1dd2f4691ee465f6556a7b633af905c59326aea9fd759c269bd119732cdeb30359b38686d8cd57ac03e007b78246928f2718ce29a383ff717d18723c27eb0575d4e9db802425ceb59affd900ee3a50c820bde8cc1553147b551f703999d6cdaafc1053e3658043b977149fcdf346b9171c907effd755838ac06083d9d72464295bb1901f215f4f1e14b8ac7d15fe33d2871b01334e1dc5464b863dbb8446715760381091fc35595a10669faceab379b0dcb80014fe2e423452fb0e4d15df7deba62e45ea3a84eaf3e6a8d9cbd628c3089a120c037be982cb8329661cf031d22c8a0ea09680c08c8203f9fb585ca0d8605b93758d2bd21f7238bbd599c7f016b0a853c115439aa67af4d464e102bdf24e7dc6ed20a29a70cef00ced41f19cc40e7d8827e51765d15535c2b6d45cf2d9298d26d35c64851f4855a71db4018a62ac7636358460a49597433f51d0cfd1d598163db89ee6448364b604d74e7c6b6b012ec88a81a3e95bb7a9b4d634dfcd700095761d769c3b45aabdc0baafc69255a313c9976b75a6ac3cd5cdb49f015840f9775a62621adbce80c945282674a1ab08a1b3dc804a6effad53e46d6de904c0e9586537efd6c8869d652cb0610b1be3b86511ca8e9694de7fa093712fdb556866a520fe7e547416570dc1e3de0e539828da5df1d4eedab13a584550636cbcbff7ea1836ac1850f6244faf22fbd30b20d08e02e2f1b7832043c7849b9721cd2ff393b560e796f19eab976efe590d851655dcab0e73853094429adba3397ee941003e831dcf64d88843717be6642264011f62b0e4c8ec65a5bd2eb517d8e8a39b9446fbcda1e6783b926a407bab962a49939cbf06703184acfa1fab69e4038e88364999e12da04330fefe671eadfd4a8869072fc3e8093032afca1909e9440c9f4cb2e808c136dc010f8a5a5fd9bc4715f62e7dddcee7dadf34da9878671e90596e1f6094fafeb5144aaa84bfbd4792aac17f33946331f6fb3fbdb445dc17cc4f10fb8e26398c40e326db90aed743cf9f6175eb98639c172f16efd6f2b6b412d8bbb3eb2d0b4402062aa9e8ada625506c3c9f004a2e6abde350ed7b0f9578069ee4f4e229eeda9af5cc72074ca860c7a9e9770c3a52424da084333adce6d819fa231b1dad62945e2a92e0770c5c8a87d0ce8a89d94da758ef075d711b2958bf82dcb2f8180525ee2d0451b25d410733697255e3b79f0e723770c8c82adb7e89c19838fbfa24f3ad75976243cfe46b3cec6b45b445b4dc0c125701aa8c8bbdeb2eec39b3e460821e8cd28e95c4c52b16d21fe676143db488f8109492d0a89b66332f219a373655d3db2c2332ec41cb539316b493a3881c9b61340e1b67c09b8d66f77d299324e35ff93aeca5a718d075d7d64cb764227895e637ba9ee24242b342cbc8ec68aabf056f5537687588beeff8e4fb3bd69b5d1adfa236a7a0cc059a4f22814d28364d7696219ff5d83ffb448ea95cab9b614e9ce5fa1ec053cc6884f48232e662561326161682c86f9d29f5f1b9fd810302a19e71a5bf735ba1f015cb615a22a798b49657ba8c6a7c2eaf86ca9d4a56ae0e0a921b4bb53b290b10cf4c46639c586c8639e3641956be73106991a9bf870cc1fe0a3b428c725c666f03ffb7fbbe05401c9341d9c61776f8e130cf85e9bc9fecd0896a20a1d366225f764e2c6f022ec1fc44eb51ff27662e865edca84541e7ed3672107c81b8c6ed5678c02a4a03455089a148833100ec82945651975ec17521a456d69cc8ad0f16089dee18292bd97a693af1d4182e7aa38fb9c6c982b5b8489eca1537d31a9f4ada58309c68f66bbdff947fcaf11aa0ffdcfb94b57d8931c07a3e64a43dac07ea403a202da5fd7c89d1203aee685ff006009e43e19bd66207eb164d8864bbc972dea645224cab7c6c7280cba4fa68d8449f047ce47a07d9ad55f4284ae4d474730a4f1830e98aebe45818aa8513bfda3a0cd0782474a7f91f4f5a9d623a806979577701dfe9066b7ff65a401530ef6654de84fe38283150ec3bbc0574e24a38e44ac09a65e7b84b9dc1e824bbfe521d3388945786012e71829f8b08e9589c635268ae6a89521b3ccc7f34d11fc8926f44af811c94ac19cb711f6a004619e1692215b2caa0b4a99f9a52b2dd872c2acd1697cdc5ea656ddf360fbb93f1b2c3cb01e65063528bede475f0f492a89575b707e5fcec0dd9a51d5ff5022c929fbdf9406f29ad054442bbfdde7ca8ea912dddb72e70e765855a164d63d042af5d3a848bf481003f7a6286707fbd78d3ab9d71a2b5dc5087e4f74a9cd0987e8e57c3fd333af915679aa7c49c59299aea415f43393091affb64f73aacdfed28d63bd4b3d487145524219cf6d00f538794feed930913236e16a1f4671bc620ea1d660758ee8d5537ebabacbd99e6ddb76a40c31180c21403901859406847e62aaa62b64cffa22e3624a5716978940aa2e0936a2f4ee1f618ce34a056f0b9af7323ae7c00866a11f8758b658afa7b6ce28e736d4cb1e72c164773642b63bfef5c0fc5c333f149a2d744ea03a27e2196feca7d271a5846287482710f3e3faf183dd5351637eec5435b192dd630921afb403afd31e8b0839dcc15ba2c0fc32bcc90fa78ff8ccd51960c78e357d5d4cc2c6f469008583923de75679b24f0bcaa8f0e161df9b32ba2fd53da8702d294a98cd473b234e980ab8d18fea094b17aafb20d8e707f4b680dfbd9b4a551d770579f0858f0221cf58f0c1f4166f5a29bafd807ea2cfaa631071406adbaef54e64af5735cc67a432642ee00e65ab2448e2f8395afa01663e522d8531c3415cb74f812bdf5a1882c816b955644087527c0a3272f45863cf512e5bb57869d7fbb8ae36940ba1dd619957db497e0dc98ccd1af454d522bf8ea38d42f7c837377a5c6917b9420980eaae0ddae4e5353a7944fa860784c2db4a3c552b74a7942b80a8696cc30bfac7c40e22ff4d2021a2c2e89230b2899e7fac25705e54a0e879b5a6947dd9efdc7c97c17c92adb738c90fc2ca3a7e6d20755b65c423be389ceac35dd391247517650dd005db2b33e17607d88beb92b7ae8400043bc2daf916464fd50ff1cc25134bcc42a321f01b86735234bb8d17efb273430bbc82d16abf5504172ee6f88738f57c1f40ae24f78e8699de4466349e930bcb812eadcb13ffde872a1ab6d024ef2dc670c3c8ed50617884dc0cbf124bb914416e7b89ef7d3fab8316b9a97d839eb9523c14b876ac6710ba38fddfd87e8c564cda8a5f662fe5829ee4f509272caf62c78b1bc6e5960818e4fafe10afbf749895ce437658b15b2c809bb41cf5a888f0cd65c0396393ac56a928f698bf97d9a4c4518e18ec8c0771d243e02c107e932b0ed3eb5b172dbb94b2cccfc02f8d2340806c538b4a4753183ce5607fa03636db2fdc84722aeb9d98a6ed70d0282aba3571267a189b6aa6eb65871c5dcc59dbc7db8973c7c355ba2a2e94c110d1f4064a4087eb07077e67b0f634fc10bc6ee9b8b8e1a0a20bf47a14f2c8aac75375704995978fa0b50a003096f1e8df99fdc8766eecf34a2a4f461d9991133fd5355ef8175f4c2bce96d833eec8c8118b8edfc9a6b2550947ef840cccf7e4be80bb39216fe60bef79aa5781a6c084efb9aa9879083cac258a5a9eaa3203058d7b8f6a8a4534b535dfcfe5e165e104c14cd85a4d3b91e2e71c1afabf74bc5ef4ef3957fc40523045278cea1cd33431cf6ba18e0ee8b9dd9725b70213392bd83a04416a3e084766677a6acefa99c0f1603f8c9a84b6bd877dccb71c6d2a5659a9e1300a1a461b3de300f0f9435f8e2dbdf021e7774ea4c6e13aa4b296ee47ca87af8e9e56a2d79f00e0a6d4bfcca4ce2fa5e8ddaf5776840a97052b572e06141d95e190bbc38273074314c536890cbafc866ae4f37a3ba8410a63ef7692991db3bcb347115224a14050c3356f3ecedb6cbc2e650d5ffc1acebb4566bbc10acf914c8b2b20f6c610f3303a8d3392f017c96fbcc6c3adc1c2f9d333f8f0646111fe6cf2a4af586eaa680a01334a2d7c5859c69d71de0c90880a7ab50ddb22a4ca44446f1a881f2756e707a1917cb8798566ea58cc2626735448d7540d46a4dde4a9fd8af571f4f6fcb74fa10d91dbf0863603754162a0710efc139760f792134676bfcb9d337fe58521098911503de84311387d375c25929e6e55076eb6934fd8f2b1bb7b9667fbd76d5ee204828769a341b1f716da5bdfece6c62a9f4d4f988267fce1f5615540dbe375324eef607c910d976b45a5ea5fe0ac8e8b5c826ff62c1bc7c5745ef0bd79ca7704575f7127f2bc12612e857b1b6307d4af0b1f9b71be573bf06153e1799a6c8bdd869a6274af9749623841b6195b41c02016ea7a12206380e92209cf7c240fda474567da6bb0e665f5cba34263b2a07c65e3acb5e03b87bd38214863cf01fc8bc9fc908113ddf18da34f71c8014e6d2d06dc2cf3e3f50b1b66c4d74579177bc7ec11db00741effeaf32c74eff919effe8b6734dd243736c1fa75801c8250d3b636ed11ff965c59a46dcb746055f970157dee8a1baaea52d77c9b0990f3924e7f31f8fa25827d48e2999239c21dd8369a64d8f7547ef4a587759d3b4bd3c7324b659a5d1b3f6b12cc00ea8abe579d8ab6c68d4330a63f78f76ce5def22ad6c841593c0389d50cff8b293c30fc0d30b4902d7536592cb1124fe9daba3001a7588a9544b5154d4a59479ceef4234679fc5220f898741734bdb874e496aa5f222a4da11c396aae0c6627e26a9cdb0b5faa21287e302c70afbf5a966b3c0b4c2f85b3062a572e003970548216f0ce63cd0528cc6fc7263e09615cd6d772f9d0b6b3e44bd8d90a4bbbbdf6045cbaa256a8568c9433250d892cebe6bd91011cf49ffa07f88d85a598799534f1a3c0ffecd9e578083212875affa522d2ffb11ebfd2a34495b025a8ee5b4236d052cb8e2e48fa12b1d4563cb86ad6369d8a49a43a37f5c4abab7fba56490b2529d3a3f623dddd821682b8d6ab55c84aa69a93596bb73aafc1e55c84d72b3729858d10e0d381d5f1bfa202fa3ba8c187769855e25c38b82d60c683ad79e90f696ae8daf4471a2c87359efa52714b0a1494ea58ea15a3b9640fb6bede446cdb0e634cc8d98691286bffdc69865427eb1a88fa64179ce1837f561dd3bf419ae33ff521a43898cf12c6a5c6163eec22abc1db2f4111fbd95ea4bd638bf7775c6e25aacf34b886bb32bfb0c2cb214225943014f0b6813a7294fccdf0ae2fef9bc5e709be4102573ccf7fa73a4ed75d19ec90bba78c0f5f966cae0d2d040eaf3d31af9a5792bd133c322d1295680946e4fc0858bb8b62742c2de20680543dc12bf8a2e600f192c3a2a4f27a3be15f03700cc174947b23801b20c23e5268632c4e62ea742224296e566bf6659481809ea364e3969a24f98c4d8d733f0c0629f98db9afcc26f4291c3fcf605e0810151e674b9547354e8d9fa9bc209114f7372fcf43187772293bd5471a58eaff55c58ca30bff0ecdc087c117f4efbad40334d6fe4a4efc708b06a255920893e11939ef3fea4a73ca438efa7f7e0844b2f1c9f7011479e387e1338a528196e01624184f22319efe949f4a53c9a294b7188b9d99c0e9bfb51ef56996242d2a59063e0bb536272238939c64d3dea8bb996d9759c423134bf99f8d51cdb4dfed87192fba276216ffa82f018483a4d8a47419dea48012d9433771729237eade06f1b8beccb08e445cd7d1985169047a78cf842827d67582d0f8fc6cd5dcae749e2049b5ea55a2fa624bdf27748fe6d55e33163d89cd345719c2a843c2c5e9e7dd9a36dabb208780398ec37794fd33327f2737e4736e37a04720ddbe00f98180eae9e5f6e818231e0828e3505abad1d903334fe78dc066a5819703a638806087ee94c0d018455f1cf79fa97a6eceaa1211dfc60c7ecbaaadf0b182c311636c4410242d32f4b024c1307d7cbc7741a525d1b4041cef97e901bbf5c2dd34a98ffe792096e223605857d849c3df1e1ba9596c3971de872d0dea0ceb2cbc485ab0ff501062a94e5de4241a8ce8ac0a65a0f80af7751cef94fcae081c2627f67fb78dbe7df94f1db0b1711ccd52e8e3277148d274799cced4a095d90f19e8e61e8bf1ebeec39c3760a6850694695e53670492ed3ae327cdf6dfe9a74c6ec5bf421673feeb28584575aaaa016a95d5002f411d83d11d859400a3f0995c8b872af03f5a20fc904aeef8a72635d53e1492861033bbbf8d7ecafdd3f4d8c6daf6ce32eef078aa633bdbf08442c95fcce4b275591abd8e9dda17f2573b8b12c1d9540f0b7b2f7c09f3b4652946e590a70d0802041bb2c5b46025e9170ddbc9aaf963907f446cfbea3a20607e7ab3ef37573b38f97ec2ed39d999e9fab4f072fc1fa4bb309358ad6ed8c7e76a255804e58af41c208b148d960e1efbea77f1951f11be9a07b01b1cfe945205d891ff57176ddab8618ad12d32c45a26cf9d07bb7b985a35ece2dcd0003769bfad04ce7136c99613a5c2205675c6f5728f6f596b787b2092c872c350de89b31fd2c7edd9ab66cf35d27c2a8ec7db98e71335102d7e84b7bb81a8f924fe52d92c2f228517dd0c2e27d200166090caeb8e43375389f579c8b801cca6d4ca5a82eeac5cbeb433835af08b960d51385c956e07bc4b084523fa8f2e26f1e8a869576e32bfbf371792fc98e78637eb27593f8f480e1f31d64af64af2fe03e9024600b3a791b128f003bc28cd17bbb5c68990faec73f88c10b664f1349b045f3fba24c5f51bbb10259c41a72492c2377bb331b6dd34fea25c2eea8adc461bd0c78d6bad02a506 +0x8bcf4c7df9b79044ab522ecb2d9bb9dcf54b6e131404f1f2bb413b2790968c2b83c4d34c61edef8302e3129e67e3f95b249d160ae5e0c4d3488079263e5ed128 +65176 +0x1e0c4f0f251137b65a35ba9f8a2a9525f240a345ed7ea453cff13eed1044412ead912f23cb77fc839d6d129a895598878655f4a7c9e28e51a01dd7c49e638b5df81f330e2fe3ed0befb86fc638b24a1ebbc76cd387e0e93ee431fb3f7fc64776c85f61b6997e93b618beda0ade663252593e13b26ea23c8263d4af46fd97fde0e5f9c304507075eddf285a4ec49cd88c2764f22ac84d0f85e5affdc15efb3503179461e09ee01b160e9ef87a337ac532eede1024db0cebae326aec98eb1c784726d84133c9f60e9b6bc7bb77712880ae76577689f105566711ac84b3ec224d14d96f6de31adcd5e2bf4cab2bc6cf916687752a3f5060da184c1dcefaa9353dd2f9feeddad9b7f855d1d4d07f7c9781c4e9e036304046ff27a966d156697bcfe94e30c7fe4eb2005a6b08335bdaa7d72e6341a1420bdf4cfdf12f96ad761f8bc1a0aa0539c1f2745b5390dba827281b0ebf40745ff8524902eb1f23e91647f9c2b717af7279a2dcbf5213d04cac41d6cbc384b66e4ec87e9e61df82f0921ca2555b1dcb91bfe8c1ee303a1b31b11b8fcd38b66f575668743a1917bbac32c50de05364637ddbeca950b5acc33d7dddce7ce57da802585bb23cdd6ed4033d6ac2cd68957e2015d71f4da911d05a5ab01b40948268579bc8c00e738cd7dffd354a8262582561b4d1a84dd3134b6f8ebcff810b6db73e69d82716a31acb27b84c2c6909545f280201ceb8fc583b64622801a713e59d9f08b26ebe37c0b9c3b7d7f0e82432345d459018f6ec88a8211e1daa1a74922362c1801d6df525a89a42ff1f697d99ace9c6a60e6f6b4c9a8d0ac28042f61d506fdc67bd8aa7f2a096a0eb4053da32d0b2cd69398b414c1a926e400d88612e2daea191d57f13ceaa9e1bc5db0e04a5a7a1a20420b3352f2f1791bed9527c6cc0075826edb30262cc9bf9b27802c399399e8c9d4c4d119de205bc656a0910801363484d8d8e3b56107383dca097deb78f92d45d43c39b403a42375d4a16e5112ea8ba2f3e7888517e0f016bda351fa6b063c36b8f7b9cbd3fb74acd01dfc3c817c0f6f487d9affb1d57bb87af444c0ea4fb9ff0b7dfdbbff94c3ddd15ce724dd89144c3f11979fdf533f856a62c2e997440b013445522ec71ea57b7104ab9477905ecc403a0aeff0e8c020347558ded271c40fdbd4737ecae77e1807aba625f0003352145d716a871481fb41a2731b2c57695d5aa1ce368b8dc2363d988333c777269ff3f2478a125519892a80be1915735f8c4943cee0898026586b71bf587e53cce897af09e91328db5c478676731e443b1f2020f207355d0ef119bdb6fe75348ace47da44e21a1e6bd7212a4893c748708867cfd4152f72d082d0e306b05c87e4d3bd0a651f97943fac6ff2b105710e945a88a6e184c8703fa029782af884cc6f8b4fc606fc0c28bb2e6c663c32cbe51af82b5ca6e0a0b390bb7be390519e708f47788386f1f84a82efaefb36c6388a78f3984790b338eb784740bbd3360a22c8aadfc981bbdc881b62b0385d1a476d32df880e3b7701565ad6307770104841a027ee1e7394395fe91a08940bc968fbed1e52f703a69aa2bcda939cd39ae96bba411bd8d9258f4070983094bf3e1db4ec3281b895bc554f12d712928a105dff5b78f1bf2eea5ec8464f90b103e2e626c4aeacc94e32d1c9f16e160f103b267b1851f807e15d1855deb2c18f667252d01b053c9fb9b48081dce21658e255c36d854ea7699ce85c77be644b765346d43f33b8a9a2448bf23539d5ac069cfac55506d1884abe269bbc49d6871c56fafac2c34b8c779b5397229cdb4fae8cb49cb0318d0331c1a24682157c1cd7fde927192e304d860a95fff88a5569a75e0dda0d79d3a09543c5fd77a5e7753f94abf990f8f975643ebd9d1566c692877d50ddcb6437f90bb10c10eb8f8b18b9c7add2c8a8198c989444ef07d6b142d567383888753c750b960f317c16e97fed0389533ea0230b79a7c6665e3ea80307982e7ac321539d0b7f29cfa7f085333fe4a8fb4195887aade5bca377230d4b94acae04e9ed1fe981b8f65bdd90d0ab28c7972bafecbc429bda9226e1087395030121778b5cf3d304ffff66ab6c7e704e48de64a81a510bd9f2d1513a735d77e932434315e561f21b90af608007c0fb06c4e956e8a2c92ececb04c2c1e83d5cadbc6de8281b0ccf1c3780ea09e75ad3e8e84242d01aa73410cfa6fc45db95cbd71c1bd7107236b2bd410e53978fae737b1f63e90ce65da4167d325e04c1f93ddbbdc7a09d6f82554539b24db7652e5223c6d899ddaa6f0766503168ad3fda3b522e1bd4fd77721f6aae2728e80c7d08799b1ad5e0bb4dc676f51ebc9da9ab3ca0f962d4df2e7889840aa785b7e9fd0ee2f8a53db4ad9c79ceb864ca6493feca6e8c5730a109281c37dbedd4958230ce066c0231b805bd99e436ae027083476d01634378e17be35fec9e54a61f69bade4a61ac426938339f4ddc55057ffc178d002ac20e2f1b4cbd18ce667aa404fda835761df046d991026235f433b172e1a2f13f4d60d84bc6cc42e8adb2c1f86bc44e15d1bbef4e585bd7b0062dd36c28674b0d60217ba1d406017994fef798a7bafadd6215a12aec1404f6f554445c6e12743184c0979216e2cb0db6afc38a13e4c219498e3ae3eec370675c3782d8256d033835beaab0e1fb15f17d55a42142da4a65e295eafdb2d2a08da5582d43e0af8e8dfd8c2372d7a758d173711812b723ea5fe7cd5ffceaca2bd66b26924422826caf46a9905c6a802a3a1392adb2d32a2843a384f855f92278de0823504d5d6e34189ba78fd21d0e0077e83ac3a649859addb05d529d5073fe0126fee5b413cb6b5686f6607851b952376bc9f8516c9ea86a98d6ed37a32741ec21f9d13cc84278e57326c0b3cb1ab5e508c0ba48cf0dd796b75226b943c4dafb93a4a13bfd3be341fab91f18cb9aa1fd69df97e0e33bbeceb68f9d96c4c52fbbf69fb436254040f8881dda1be5b18d0ce9470fde3ba0b49ef0cfc054a8b0c6b9c54ba8bfc2c8087595d580319c17fd8011c790855ae55f7400932d87521026517a28ed3d786bb055ce60b00e710669f37db1b87aa37225ea608a4383735bc52f9fb800339883bef57c5fd7e6e73568d37795e632b7cf8e6e8b1580ed6efc39b0a0996036b5a8aaf13a13666f810d60acb9f4a8220a662f7d0ab58439b789ea61271dabbb52530ab5823bfa1cb0f6e7eb9f5e8cdd1dce5f9249facbdcef8d5ddd9de54145e11b34dedf39f162f99a651ca223f2c85470b54ad345a66b796f1a726f60bf4b0459dfc9cb8deac6ed607ebc6cf5788860f5b7033136c259e7b796bc3610745f1ea751f2b1a854dcfed18b475a339c71a5b5db67ee3e9e1cacff59376c850ed6a27c42063c39be0990661159f47ecd38a539a8c554dda8484b9ee8608d3efd6632511660c58284c154b6b740b6278921e21995b81f946f51461ebac4129ebe6230be459ee84357b8be2bd3a829de6ee1deae28ccb8e351cc2f0746de8734c07f402c561d0edc85442f3e0d0cca03dced1d9fe85f8b5b0e1d68e1131c7581a201c323de67c3becbf84a75a9cb1128519801374b0d315bd2c97624b60a4815e18e4c2d350b817a6a49725b508f99bc7b973c3cc74235767e54e95a962489520d994db10074d2900ebc496787b6be40a95f20f8f38af22b3f4434eb49f7b3d664a74a47b730318017d53222c5dd0955695441f4466401fab41beb6f28004213a53cc469cfda18cb1408cf05815f056b3a1b31c73659ef556b507f5ed6bade8a3dce3e8fb0bf12f191db729840d93cd2aa1852ea59d914dbc3665322dc93c3baacd02b32107b9a640fc1bf439ac81a5c27d037c6076e1cfe6ad229638037ac1550e71cf9557c29c2fc6017afd5a8184841d752f2f585522db038448987f2f23ae887863df65d4b7ec61b1e35b7f5d13766a236e97abb7efa31ed470d5a72308bd215f978897b79f81b77356d883dbf9a24a546222d7cddd47e8593875e21d1989c26d94175732fdf5af8ffbfecfc4de10a6523357446095ce485dc60297e7fe1a54eb82140c0e7951304cfb54c9df6cc7676308be5a37be402526420430475e78bd2189071d13ba9c24f47e62daf649cf73d009e0821c01a669fdd5011406e1ace757cf79f40969de72cdabb16acf1d30b4e1604422d50607fb2aa783abec30bdb8d57ff2f8b82d200220abc8e23491f211dd3273a42b746bc3f5df115dc0f3b31ae2bff891e8af69bc34a62fa8eb4c1e710eaaf36ee6f4daa9a6a534924cd196f4c8b715276097c18853c36f26bcf7bcbebaed4eeace2d5d95842372b256736f2dcd91d022e98c304ec32a0fc3713ad2df2a260b7eaac8fb6fd87e5625a78145af3a72b1eb4b36bff6cd0497e6d0bc6abca67bb394446cbd1feae1655307a22161578441e84e3e7568b97990f9a3268b3d7514cd9362c2a98d027229a53d7e0a2b6bef0782b94c5b8ccfb08163b01f3e4ae11ae1e3cd71caa26859298113be08f5c0db8c215607774a57d2f28cc0508acb30b578ec4d22254463bfed504f0a23a79c6f562eeb18d38b98066bdc9a6177a8ab0c1915aa7dc45c3dccfe7bba09642a48d3ef0f41267735db7575bb08f90dc99a484cc8ab29aed33ca7e3681c64d2640c30df2e20da693268469791d0c055164590996d19cfeb8fa97924813dc3763e2faeacf250dcb36887a25ac6bb605678f30d896abc16847acc694a2de4cc56a0fb74e0c298d35dc180b145c2917e18d5eee7a3285ca7807beca0dcd3db2a7c73b6ab0208c1686d249a9ae0ed1ac5a4177c456f0fc129e779524562dde883f09da97a9b2b9442ed781e86b3b01dda0124e64f7688b245c15e478164b2d480b8081c0a3293d60ae4a7549c4771646837e6742f3ff9f9a31711117c6bba66c8de9a56824fa852675b9884052399b5154f436d0a53cb5ceaf07af85dfe5d68046a3da10b7bd1cf025933f6e8cf91d98950251b0b3867a4c35581464da603a0db62d843cd3c791482e660f26ed4c0986d4273c457783399d54d0e4173ea14d8f6d05385ef1d05ea900a07bfbfb98db9692e15b1199b9902c9e00933f852f8d6fcbb96af9aa3de19d4ce10a602066206241bf22a772700a846165a6203661763962c8809f5586c69f53963ef6044a6454711f47699a6d054f5f8e917bdafda466c2a13db29c317a29c54e9e200fac03f791802dfa89f70cc7d8d9e994db4a74925bd1e6c5d6c488b702688c60bb01abc633904abcc9b4ad888de6232dcfde73269ed9205badc65ed1ab729e5a8ee1b84ad7be3232c21c542bbf11b28921303cae2c355ee689ad890410fb585003d2b5efee7858ff1b949d1c0d0b3c4967d61d93646506f8e2e073c8e3712ef3a24b213fe83d33742eb3e4c3f83104e11c36b270d7f6bd054215cb9a8362a6b7f2c186c5659b56248400d7cdf101c0e2a6e887b10748f58e3fa3dce3914e340f7dbc62eae71145a2b3f1c294981bd4b0a051f9ee62fa25063411445e6d927b8c9bc2224add1d6651271d41a25dedd4fd8109a5938b88d00fc7f48e4598edd191e549515fc83e5cc255c9d191a2d6360bd186072ae1539b0d43a41743a3bedac1d2d88c8438f27d78e8ae0ecd07837c7e1a4d9b1ef508da816fd67bc30e63eb9efce610629fb86cd7283035cf0c641cc6b3c6de0a471702fe84d2286e499ba88bbbf8a9756d1e9f8fccd7031222069b6846884c5747ecc8f72b4da98fe5b4860aa8969437319379e51f28d330d8d97cf53b1862a0881880eddb9f7bb2535d08be4b368d228d95a089c7ac42a5a15b35d019edbd507818cf551e5e1b7012d3b4f90c5ed0b1c1b397e03eb7cddb0c0a5a9b5b8eb8e1a87c08cf5be00543b4e6ff5d64762b7f8e6bc47aecf1c15b89755fb98851f1fe99a0c1af2cebd5a7b9d55c4dfc22e9e6343cbadc6ad0e9a1aa1ab9bd28fdd4f1bc258e9709d7e906824d506d3beb98806384ef6730eb9347de690d08a5e8ee559078c3f96b1acbfabead801dac16b3d88d02d6bdc7985ab896feae3e8789baa4a7290658c94b0afecf744ff1a55ac84931050542a76dac6e743a31c15676a66970a4ca37bcef028d2540346be01e427cc02a0f9848d204e3f6aa1c339b365e0e7d8a8408be5d6f20508fb1eec4e7becddad03a11347bf0c38edce207be2f3e2e3e28d86e363c9d42e1b16d1ccc2d99c6e196296ff2b1fc57bd3107b047e7b323332e1bbacd03098f5963aa688e766ff264fa61e6fc2a944b024511bfc0f67997ed08e280db27504018051e445458bdcae56b5828b92c3507ee978498a1b1edf6cc27a152f93ffe1fbe142d42e62aefcad36790a7d25d6b08d296d4dd62c08cca6128fc939fa36f68ac1f5be68c83928ccf8d9fd6a034b2d86ec186f09c98d28d4c8b38e5470820d572952ea1eff9226b3a3bca57db2888f113a61f74b7b15ba9eead0aaa87c4bec0920419f768d23be093f0c48dbbcf79ed51c302cc3c8084baa82cd665ca6f95c49afaa2698fc52ba77d5b02fafa9ff217b996d579a3bcea3a397920a9976f425bfdd75c7add489e1a46b90a21fff07e2aaba00c0f759cf8a2f3207de8675a50f12b28acadd9b2ffa390c94e8534879a70b86d1af03ac74c8f65a142a4c2a72e2eb36d1774fdbabceddbda44b740bbc394605c86ce6bb2324a117a135121dc465f17233162c1b67253988a811aad13860023fce3ec70e4568d871964801d70461cd6d96ee9be4cac6f47488831c2155e3e73dc96fce2e435a4271dbab41df989f262fe448c5bd3c7bb7892ce9f3837b8c9e06a34525a283c3881e58a6f9bdeae4a5c1036cd22e250a2ad07c8b567f1221cfa24209f1f26f6a5281f68151fa60fbf22adda2e9bfee3cf45061b06e9e826b221a90025da76e1947a09b83721d64abb472583232f9fdd9be12c1a2636733323d75737a8e48e7960f8530f584ae5dbb93a25e63d663bba92f1c86a75c638e3ecbbbd5b7af5d44aa53389e1fae36b3f439c1d67ffd869073f07896088118f95672f49d02e66eec1dbbbfcb49193ccd1e4bd7a7cccee8e501a82edb0dfb10dd44da29b3a35b0447b7ee24a1bbed48150174edbb937213201900443bfdf2d3a3ceac62ffe238a6bd40956f07bc51e2f2645a09f91b118fab84a0c4a0228de7b1bd90a56807a2ddb67f57a6e4966d93cc10a53649aed1e2ec0a2fb5f1c2f5d671d82dfcd959c3309a3dddd3228f6ae20ccefe799392dd964d7256201626522849e92c6e3721c327d142cefda8f0705818640ddcbf105b333486bc0cf696cb63a3b634036ba8ca4ac356d32d5e01a67b599a7966b670743f0b0c0a817b598811e609eec45d33ff22d941946a2c0935d6373aea1f5efa4f4439cde7888cb9b2b97aa802b8f50d8a3679cab8bcfa5245ee1b0a0a10a0f615c92691fc2711fc71e4c75b17e81c7d940e0cbbe82bb022fd4d6bd47e4065abed573a20f068f36bec1935ecd55ab8ca4533fbdacbc036c2857a915ef1b793620075dd416c53184e4ce02c21e618b23dc42cadf00a82747a06fdf371097e136375ab77be18ef69edb8c114c4ef2af31e3a8189c44c7a5391a85ffbd46e9ccef67581705d9b44ce8f5945559b9b9662b5cebbf9203aaeb95192270f51c919ab63288030e79e5a307e57f3576f8f66e649a96163ca7b288f00eddd99aec2fe91f1b52f1f23c83a7500d954820776a26923f2fb318bb8f0bee7e00900b400526ae94516a6dbc2eb875e07ee3f2df650d28cd212ca2b990c2d4e9434ac2b2c1d1d93ffbe2bd533754ce00a4cf4a7b77a09ca712d9672c586c37c30e505dbed6892370cae18dac4e1aecd0af30b3e6227f525f6d4fd28e5666abbdda5738bec3ab11d936ed3b21d36946f2e6deaba9f6080e7898f6714a0b20951c3fb5e05d19b628dbd87c625e57ce50c9f40fbe3152c915654e73cff9f748787096f2e0f43938dceb28057fbc4bb8bed85f7a4816d9311bc7c63e4b18ab3cea5d8894b72ea2b1a2999e1f0fb64fc6d5a07174f5b4f9de65f2c8cc8f20878c5f357d21df66f6af1e69a33f8ef6a46739a4d2a633a6153f9888ae84e8ac1ca54b9afd10d627a59fa4ddffdd79d81a285f780b848e64ebc327ebe01df405eb1633e070e8180b2fe1ea58dc7f4cd4f178bb7c8476527bce0798bf15fe4dd8735dacb8812e216c0634338cf1ab9497cad6d234c6124c554c8b7f54b88c32ae35fa1a8596499ed4b90524ccb7c8dd8b16c1383358dec87bd7bd205f306e6ec1b36a11da48d0ccdfc8b342aa978d841965d661faa5426369f01b4031261b3eed6c2c0728e13a57d7b5ecf1a9293034dd2874c3ed43c389aa4634337cf1f94f7bd0ce7ee4180cbc76f110d63ae5774c40ef3ae2adbcf8b7b72a869e853caf0ce781bffdae55be57181aad54f244b946ef1a77529e69587a1b1d80d60c5e92e3caef8ee7ea12d5d4458330e241df7cb1224ad87841d1594d40afc17e54e05b80907a99e229e7d9a089db3a22bc0e4827a4e0dce83a9d71bdb241b6ec016a5f5fd2d38f50e04d30485f73378ac36991f6c18cd316db263827fa93dfc3944514ddfc5acdd89fab703820fba78efa69e0cb129f7978c5f4233883e6aa897019228797a0e3ddda8b2ffc98c508a3b397caf112b92ea26d9fb94be8dab5a2474eeee91f165fc50374b602017fd96da16ba7253c3a7118448160fe83e07fa26c6ef07f0d5b9042bcf0b8e5058ca841267e0bc419b3df4eed31b0bd0f98771e61e1ddc5ecc133cb69779f221f6be3c2c5177f4a15b5c7baba293f03c6532a5aca5ffd3a37e7a8c38b81df25a9ae2a76ffe06843cab0c8e05de0625f52a107fc0821d558695f6dcfb5a7ff7c5eb3cab259615d3da31561542affa14c3f129e769deffcbd0b68f1445a3286a2892d73194402c49439841f8ab3cf9246d6286c6f0e12e9b498b4e1d5fbe9fb14c36b8220625d44e3e86d61f88ae8abdbd242e029db2312fb9bc3add91d16c36f980e964c16d944a94a41c72212c364779e02985b87a90ede8f15b3d2205185ff61771e10e3ff5a50d991bdabddf832a6a3d80358960d43f9ed1ba255c812a960da5587f34c37ec7710ddb3da6effbcf58e43afc588d848ca2045e7e856e2a4204cfa6287d23b71988aa65852283269c0b7c5fc16c29283bbd33502ee6f3a0caa43f64c32f8428011a15c0987ac38bfa4aaef86c0e5b48b6b706961fc7391598b59d9a3893115ae8eef9f460f6d8b252de220be4864b6d6458243a3770671113ff904e6ff1efd437cdfc0ac3ddea230a907fa3131c221ead6736436028a61aa349c18a4f91491e547fc609ab7920678c266dc5e01808e4f9aee3ba81381ebab05dd855c2ba45c1a9cc00f9ff10a3053e68967b33c12446b0f3d4a682e8f678a2017cb8b0b50b449c7c52e2a7eb9b858a209fccf4609fcc3affb00f4a8057dce2fe55b9ffcbc42f975663cd8a522f70d71433c10b3da0fe009a20fec348686fd61c0c639841980b0123dcc1928c874c8c0df86061a05065688bcc79d48852b8e72249bb6362ae5e42ab64c7a6e3cca413d396b3dcd1d788db9c5b8b65873c407ddab3cb48752fb3c2b6a4e6ae9d26fdd32eb6c265175cefc29376395f8e4f8d010af39a30c1428fe80c44269303bce134e60093e5bc07238339c48da8e5b229d97bb130018f107c1e74eb8f3b5db7d79ec21b31420601ab8856ee8e29d48e9c6ff59496a527c101ccb8412a8ff33e68798cb0a1663e720f37b29b44caa30b6c2a4044d302d17ca7589ef0fe770c7a1a2d0a66ec37ab82d8fa1474b87499502371236aef02d569f42bef9d13dcf293782205e61b9f97578d384620f10dff8648ae67aef38c7ab172ad72f272a4ebb007c144d73685481cb6580e48f77e1dd46448d4b7e6870a7ca946f19722b940f9517091e243d007f7dcc43594d3b03b63fea7322ed0ddcbf1205f32342b013997dd98b2af4c6a1c1086e383ab8c8aa15b9e3349bab97506395f5eff7096661db233a270e5583acf903c1dbf362af397e3cd54e104aa37027beead1ef36acf3671dcf4932c7028689f86dab3dcb6d564231172c1b3aa0b09e056b25766af23cafd5ff8e32e9b1c2e64ed82254637175144f5f5b270c2d961901ed774716e4c227e44152890e1fe6a08f87dde1cb5a1a66efe457ce3f98953b2ce833bbbae31861b14b229fd4ab665b23034a605395babc8b6cae7b35703276fee1d76ed77ba3dfc5639af1bdf2d648b1b0d44a9c92da77ba4ecbb89e42f25ee070febaed1cf914a92118292a749b2bb437182b170ffe4ae5014bf0ca9f69558a0c063a7c558c82d50a26a0baaf3966930c926c533b9a88a43a8bce5ad3ebed44298a5805a3d2bcc19542f2ef11457be687bf98c1c433c3704127abbf8f1e98b74ff7be099660250748f98a283923ee175f1c3af3285e8dc1bb8c13793f55ea4be5dab6f88bc95e0eabb6e10695793fadf914cd57d67f3a21104590185346548a81afed632252ba50240791fa9499e332cc55ba706d2a7b06d5c09c0d694469fbb9e3cbd9c8a0ec7448681784d52a6b2e6f4bacdd4ac4a2fb72a9a1c8fff48d07e522dcbd0d4846d38f64ec25c59f59f94852feeefdf254678d5d5bfb75cb4047a9c98a9d5e9d6bf67f6a7a6df45d123bfe283b26051801e36c57f4e5693d26235e547ffb3b34ce658ef56ccdd008366ee727ec32eeca3de7c626374758bea133996007472192d0a934a21db5e71528fa99de7c66196d5afcf1448d71a2e443e0e158cb01b02c352a16dd17c6b8088c679cb886602395fb9b943f51f5063280c3accb35cb65854e709c22e560a156c35e464274918bc8923c15733f51c12dda547213c20490229f153afff124618450174d08d17ab079b1670b8ca018823ac30bd7ef1a3dee88a97089e0e5724715c55b1788279c402ddb94cce82ea9b7fddd5224a988e7cf2be01aff621ceae09f95722c2cd1669959735df0223585d0cb8be00edfa882c080f58d01f011eebc6632f4f173898a5a810b1b1ba74f5d7b38410decfdf3af512c3c4f38176f0e391e406c0e089a47d239156485f3e66105d8bf645580f4bdff8236ca18447ec9f53c204fe8389e5fbee624b2e5a495610f01396bcf05164f2a2777961903eb926f24650906a000026f1cbb9eb115d6be0566518cbff6e2d37f80712bc0d21008058b813fefbb6a0061514c805ee424d8775c9a5faed2f4db5e31a603963b968b66b6074d1a0726ba440849f0658bfa50d378665d222596d7449fa8b60face9acf15859c90c0fe09075b646776b79e1b7b82e67fda06b7347d14edbab93a283dd33c71b2c3c22023374ffc47db72a556d8402f1b9a01104bd72a3c15cd8c8efacbca6adff210a1613d029468bff39dff2c58aa639b7c2b598a752fc52356c979bea6b94ba611486a205e74f2a9a14dbd80b29f7d64ddd1079fdb0df24301a261b4b8a61d662ddfe7e84ae40c22e47f39db +0xc9c7d9b0413dd75496646779efd98d505921b9a547cbd5c460450b24fcb8119a769c27a9b63e300402cf04442e900cd496c0a05682f88c820d5a6d431005eff8 +65968 +0x8d41b809a8085d72a9906c95931a2e651adf0e7613b0aabf2ada269ed34cc51c83fcba731f863bcdb516d84f6a890b56b3cf1000c894f6ef561ff749747a0503d9d3a5604c2200b45b0c376e5007f85561c04f1227babeef52378fde9a5b69bdf98f22d81724d4b0063833fb2fde1deb8c7973b31869284884ea97642c381ad149f8d8e468d3de481b6472fcee54a39f9cc325ec83ea5c8156ffb7e412593fc733d5708b2778470403569c7c75b2b2faf9660dc4508683222f409665340601281df091d63c5b366c26d75a80ac4071830c2ad2436882c5b37673ddef7a87887b710fe4cb8fc4d409ecae54127b4509c23bd71c71b12949bd9561338acc23fb4896fb107509fb4962bea53139ca0ba23fef34955714c238c8f3d2413f12248218f47cbed99047bcff028299fe81d86283910ae3fc7994b95af88eaf1534d04771f35996010df25569220e366788f574158721ae68c9e8f5fd0c5c24151a706fdefb5c3ff469423e278411ad7fc7aafe7d3b419fa4ea06143897054846ac4b25e4744b62ba8a809cc19253a94b263e294413325db7c6363d930152c4b0d3ab8f0dc6efa65c5af39ac0b29bd0d58efb1cf179bb91a944c09897b208405b75d6d5e05910b4e1c0e55dab4eb2ca24e527000cd4a6e3834beb4ecb13f263507b1520e596763351a39c100acd614040150bfc1d8cb9fa4cc50187b88ad7d696ceb098a5e3e8ccb4ed61d966976eda3204ef39ad09bd7f0c99486ae4807e413554ef64a7a92f2713857ce04514a13f019c1ade43b27919cbaf0920d95eb04a36f71aad735113eb7553354e32acc418b5c3d61468f1b77192ef8bd01f8a359ca09e789a92415cc1e33fd44bb2c79d0c57636903a32d3d2f684118a33c6ed5dd7b3152548be3d2506431a0fe4fcdf6c4ed631cd27ccfd4fa568df6c1ba7058b6cf97f002e69e3d410011e290902695e782ab37aa7b3d447a63bb6e5121fa85cea5ba9acd2cd9643bbfc7e329fd3a421e1b2302b229e0555897b3c87cf77325ce048198dde4fe10e7aa3be8ef1f71c711c2b3c5130d20cf3cfa5d4c69c643005df5d43159967409ecc8563c0d7d34eb677e43c7f4b06679cd95a1424115d1de247f9baf69cba317f422fe26a9a0e975c958bb517e98181cb46f68f12b6d8787caaabe583709f302a4be1cedec0efa2ede5603abd84fa080999098a25055ccc2f87e2675e8dbcc91a6a699dafd51cdde4f83031d2c5d646d22011b9dd75508595604b94da7c6968ea2e25b3504f1cc4dc3e4a4ef9f48ceabfac9d72ae9f5a4128b43602a9a54b9bf3f784c462b745d42e383cc685b9a4401c7f0b691aebe06b640430452e90c9dec267253549864ea86576764d188da3039327f9f194d37970d1c0d8b0ebd76aadfffd757a97348dae2c69855724d91f919e27d790befe9bfdec8a8dfa63e1b495f71b0428be5a9951bd81f8593d346076a80f22eafbb5ae7f3eb1ce6629382e0332404fb43160e83fc3603de7c4281c2f3b3e7a54dda1475122e728a8ae534d924c1db6a182dff0c4c884c4775c1cb927e2462c62d739fd30439b1b1655bb79afaf03e7754520498d27502a7c578aadfd17a6e7997af816790b3e1453c1e958d7d58330a3dafa68f57a62ee8b590a811b65e10a6d2b6449b80450b2d5755551874a2c50b1d696c59a3c3d8f18d314d90f278523527af6fd69b963651fe2980a5a975f9623aabdf5e7e7306aa958220c4506f3b0edec28b7fa84f6a9979c29d9be27ad9f7dd9b8506b05ec2fb14aca91697ecd31a3f191f007017afed0f473462e8596cb24d61e9ba002d13cc54d670ec8e96233f91d9b3c0bb970e350ae0ce6283b9ba7cd42690e0388802059b29feafff1632661e2dd02750768e59b0b7f2027a42cc3bb81204e21e16958e32cddac8b01309782c3bfd9df95d38414af128ad979da9d9424ccc267b80d64f61e98c9d6936ae5b042bc28a7cf412d61fb9f8c8a072593cbafd7016166dcd316fa69d98f4272bf9ee26a756a2e227fe7935ebbc5e68e54e684c7818b986811aa62b9420188d88383154356933d07ca29e8d88f1992854f593626d962a73faf34ca1f99c9c10cb0217dcf32cf7651babd7ea57cf195aae1b8566d7f732db40a5aa2f55764959fe3ee6e66905b64a0bff6c74e1bfa5a5fca784813ca399675c1708fe2e15e71028d4e79c205d37265488a552ad2707b14581d9db260227be5530ae350fe13edd52ab62249f9d43a2ff2ccaad447005279191cc9b1c7ca48833dae3fd7d42156683ad9fa66e2ba26612d522ac2c0368afe8bfa4eaa779d76ffefcf07e02a03556c3c1e54b16711c19986af678ef46f7f053f3abef4e618919bf7d1ddf256367531acf7e3a1ed5786396d38e3814a37c93d91527d3999c822e7e47b2496ff3710591c0b09c0ec180ee16f832152481bd3f830d61bd10928a574141f7e366b91b162f7ac4996f9cfa5f1fc12a37a648849d58c3a1d63cab693c125334d6941b2f2bfde60258c8ceaf61ba16bdc5225f9755601f2f45a450e684f865b049818273ef01ecb102a1bf679aeedf35e72130be0ea30a5233d0e7cbd7fc5fb465b357b10745751abe82d7eab2c304d8c72a22c3702a6a53c849dadedf24298851b400af1ed16786b5f47eff52416def8ac59d6d25fc297a2b968fe8417aac74360ce736daabac3b0f7e1c70227102c15b7a0983d2212d0f853f70b0a806cec03c41720de3dd2a82f3a91903c95aac9860d2cfce22a2605afdcde300bacf78b38add0bfee26fcba289fcdd81f00451bac1545516ba86a8a3bcc7529e1fdd9396496819cf7f6775e5faffd0b13e78da70a789042245d5ef31eab52453803805b1a068044961cf12916e3a5a5d5cbd30023af744bc69971c4dae1fc1e785e9b84cb867333431ae89ef0c36e44bf1db39b8a1287eaaced5173f308e9122d5f792afb9ec1058960dc247fd7ad444a6dbdfda05a418b51d97c84f998afccc196a7d22ca80027c39f3a5e1698e941023c409af8df17ca5fee317c511996aacf84a60ec13aa716ac1681a0477fb8a770f9e9f806299104218c3ece8bf45438b1ba02256bdf2c5e8d77509f94f48204112728895ab243e54143e2f01cc15ef312973ada8f0e067bf23205a091afdbd35d547ae3691186da2995cc8585f91d666cbcce82ad3fdbdb74c73f57900a3c81d0025f8ab3cff04f550269f35a14260f2a9b2bb238fd03097fb76c29428c1abbf3b144e3bd3606d15e1a39ce0baaff69c6a2d0edd4be12929d730aaa1bbdfcde32c1d98307ec40fcaf3dca8a0d161fe2db745c99e30b90e3389a993e7e08596537e47bed067b252dc2ed7a9bf0edee26e3703d5af66df487eb8e967afc03c6ed6d79ba964b3b29e123c9e89839ab00824936e185814db40d20df90c41828bbd33e01f3f338d4c5b35c2392e359d5eda1a728f7be063365df630e06ce550fbeb3340dd69871b09f10d6bae821c3e71be177d6ce6917a7706b4c8a66de34f13609e9fdd10a68570c962dc076b82a6701ee25c0f42b18226a5d27d54f982a95b853ca7261ad9f40a49fcc04cd3adfde36144b6807589a2cca119f9f0f70c865bc0d4febf7168905ddaa3bd83a1e66a53ef0533c5696103f06251e1854ec70d9c7a304cb3fb9b80f3e51e7bb6bd75154730ed7ce80481cc1a5042e018e8fc67a51c163a07a2baed54d036a3ec0ea227478cc339f1303026d2d3b39cb3acf2bbfe0c4f6fc54c0cfe0604b3dd2e7eb5c8db6b5111e6d4b739a1536ebd5d82f33230b4a394f5e3dadc93ea5dd083f4f51f8c355dadd1d85e2c0e3839ec1f5245f4c27bd9519d4e6cae83e9fb25f359ac55e152b0b5b9236d27a2eaddd1000431283cc8bb4dc7750a9d5c68578486932091632a12d0a79f2c54e3d122130881fff727050f317a40fcd1a8d13793458b99fc98254ba6a233e3d95b55cf5a3faff78809999ea4bf978971ee8b64fd372961be0aac22e0b2c7d9de92dfae50ae7761046dec304f9d62fba5b7fea6686456bffe41256026df44578c0fd5859b5cc18492d8668dda1c8998978a92c47dd5f8fae4c4facd1f3290a50a5aa11de35176a95bd46f7cec44f4a96cefaf88e391f85b9a1b913174b2940b81fba93ed1967c1886e86fc62d1e8c754f6ebdb842a03f2a45ce5454cd6838d1197a57af0c32bd193c9dce3347b137466690241d440bb4af1065a9fed05a653ef960123a3d2d20f4a579f48bdf05de62d9dc4c7f8fd93e312169faf62892019b4a3541a50c908cf0e8064996a0236a12d1db9ea6cb12c7faa062ae057b18f530337f4eb92062eb562ecc361c2f12c19e76138059a1bf3650b6d62df372f22a45ddc8a03e22ab246e9e5221e437dacd4eef0e5b62b8e7737c8b4fdf88b42a872270979ffcb9731f80612073b75e84746a65549887ba9265c546542c8beac8f30f1375b3bb8ec3c4d49ebe955d4c17a039ff6b9d914cc8f6750f6e7cc6bbd25853eee9444249a2fbb27eb5ed9eaa9b3804e6ddd44718920dd3102337ffd0529d372a7bba5a9119ac61298be542201924134132a373c6f792266efec5ffd04faa03efb37dcb0e2fbf2ac6cbe41055974cae39f074dbfe006eb754848e8e64d267ff641af55d69ec1c557dfa51d1f220981df6a1ae4867b487cee83ffb7334e2bc72b2378bd74a58ab2a78a2964d9eb9f0a79fccb983a91bc6b252b67278e78791a60092a503587c55f0dc4a1a4c026c3c965cfafd516d3d13adbb715c6325c9cee177b4ada73c5f00f1d47b4596c640643057b2e27d5b2357054bf922fd98b15b6c3f24098c9e09957385bc7ff2913e50beb57cd0cd1ad4780329d52a0ee646208f7f6a237a2483fdbf1a95302a0b6ce887a1e02f0b535860ef7e8dde5eb7910591600f613979d41e1db98ec004ddd415d5416767fdadb8f51171aaa5b4b498f3bc099a2d904304e2d48b309849af7ebdeebd98e06cd1fb21b02bb3e6da8465d056a293ee482b1c302eb7021ec12870c91b3efc021f6629cb16d3300b96d00086a855830b29d823ef71658dbb33f1b422a4ec1936e0154bdb8992a97bb1406ffbfa48f1eefbf32109e6bf57d768b252aed1ee7ae2758667385290a79ef37bbc1994a365fe86231f65d5eaeadb29125057ea6da470a76088ccb9f4b1dc232aefc6bd8f67a3921123eb8611ce2d3cb9b804369021463e4bb37e05e7509d0bf40eecbe348045e6643883405a89376950929dfe8077ce02f1f23680900b4971822372dfb9374c4bc563154deda5607a7fe4098a64316ebbf74cdc70186a481e7b35406846152189dcae89f3f3aa0f35edb8322265d4903008ca591ea6f502da884d3ea105a12a685020c77b941eae644315ff0eabea9b2aca7293d26335e06c517254d21c63d0b0cac1b82df78ba4cd280458955dfbf771e54e73d476b1489e7dac6a42b3e37b28f19a425045785939458b2501a38d0bcd0266e16b08f1a336b503683af3aa94996eb24e2ea56e356f42b54e98a62a4106c9c0c6e0417e5afda0803602033f81cbe812c50d40f4a039c687bca38e5900e3e166087b48dfd3bbe72abce20c2aac8608c08d363e92025d790b556983a3b12df3609184469c7838310ae32236f47b9276c690f1c6d0c3a404480234ac8ebaaca6b44743623eb03b27269109a82458b6d92cb48500374bd60f46ac4a31a48428a36c1400c54ce28e7188afe08b42aabbd9f8e33c154e02bb410e39f43b6d77699190df02964e78f7b63826ef06d6d96a1f34045c2d9d511a43a7937af270fb3619269092fecdd93f9e3cdc7e42694d8953e7ff2e6fad9ebdbc19a0247d357959e3380ef825506d2ed39ebbd567826de01d1abcfa0405526a556d4a3a0444579896cd437c325f9c8bfa66aa3c9caaa33923d42208142ed6eab6aa7703b126ffbcdaee16664e82ce20be9a90fa0968575a101d1b9fc6ae910586d811c8aa62d78d59a26ffda0426bb3c4445758d744ef0c8afd8f08420fea826e00ffd1178049d2b8f1368a5126db0db76be69e2ec6d417397d648cb1d84b2b152829662108bc55a2e3535588b786f63d18251435776e43c7a483713b921bc6245b77cff08398dcbd81afa66e7bd535fe52fc0115de2558d97bd4ff07c4c11c429ed153ab794430b1d230c52bfc2e94a42153aff584621d1a083f803ef6a7f518fb1f3c7a702a1927debff9e6c2fad9d48d1264feef8b5b2f55ad3a07b134194d7949d086f2b15ec7ae458cc753a2cd389f216958a90adac36a04768b7bd04f8a203758f78641c93849a8c4f7398c38785e68062a3a45627c4d2e7cf1dfe36077f9d21bf5b5422023b7d2ea9efc22e23cd3d0829c28a6bb020811946262d515bb0b0063a7051c2c2f01a945e322cb922b043f27d8fd93acfea39706068e0f34ff5faa76350038b5052e171fef35ee12edfb9e3b034076ff1824a71904eaf785eafbb99dc82efc834c4603beeabdf5282bc0d607487ab67af795281785fef6d225e913208816d15dad52546bfb40479d8d59cdd3cd32bbe644fd0446b05375e15731a2479c40200cd059f46e4a484c38bad06de7baf0ed0aa66522efae70da7b29d94c5a2c344f595c63ca0f005c6cc35b2d9d8a383db4b0c6d46a59a6dd8e6843ebfba0627bc809fa79be9645050f04177644056f9f789e4b52c4cec123fa704c6e9662649cf1e751a1b84a40c99dc597b54ca086a0a19ddee8189427c9855bed6b05e85a1f34ba0ae5a0751a337ecc82f19ca3a5c89775279c4ef4ff5796f0cde9307a6d8df849cc4d5e5dfac81ae181331c56f69ec2eecd784e36715697f895f0ff60c46ca45d40e0db4a0912dace3c82b4019eaa8bd0798400a2a74def3cec895ae18947a2be0da6fd866f98245a5ae64cebc87458e2d2c74d80c6c406817bba2947e1a35934dca7ad5853e2614c8467cc5d9a8592ed81491b17f9434492e98d54d8f60a318755ecd407dd79fa6d610e1c9f3c64a2b92d1254b066531136df0ac3ddf003927e1f7c58dc37e455859ae225f9d799ee0e7f2bde93357bd53405385e9df717e4e3e35f231f86abdc5cd6ebcdb393ade0b41f9ba3088f44f855021f0e6231cc8f7c489e1b18f557f6b9be32fd149727df72b46a89579c35e2617fc7b972c9adfb12f7402a0ea96f0a65f9be9e650c8f5212e6a07ac783d6fb2023394816e53f916c974d374bcd7b8229309896ef196ea35a5f465da16dafac59977ca496ae0cb754d1ce29158703c5cb0bc6cff7e74a3913c464192e81495bd68298b33a4b9bd6904dcaeab5ff903b1331522fc89eae7c05c00098b3e82b725d8d965f4ae47457e9b24961735fa94ccb4b43a0a9651fd4f7f924c17bc9dd57b7607d8f0da320a027a9537696ccd760b900a209e16427a9b217d77ccd4de874aca2552bccae261b12d9f1116870a1dfa7f97651b9c44d63ffc322b1f09bd32f03fb261acf2d0e2f71eb2a1a2f738f315bdec76279ad196aa4a50b482ddd26f28615f9465e4961430e86077934fd29be9d569e236946142769649d2acc386a24fb95d596c129a5c1af538e17bf34f8ef3709027cd0b8c50018a8dd3d15d6262c2b26c3f23ff765101df9c9da1743832aefa0fb55f82ab55e771bd56a4fdfe274de6eca4222d826982021c0ab865052d88fc3919627c56aaa50638c9ac47b2663db15f26eb0f672c17f737a735284ee62dd19cd28a6b16e4a69280ab3bad07b61ecc4435f3279d0f30496ff18c406de2ea24bb6f1bd1549a88a13589e7a0968d6d723c6fbef89c9967533578424ffaaa6a50054dab319812a7dcb7d444c4c762a65d9822b314ce4129bf18b9dba96db31b0e1b0cbd2e7a03a09f9818c77c12bc65e8f7fd83eeda9cf3e79a14dcdf4f8368996d1ad60a42e3ff5456d5d459212108aecc6e86092a0362672a47aa740891ff9c6c066a67bb1a10a5648a1fce4b071b1995e45dc6452ad1a85990e8ea31753c81983e0ec92b3c710d51a3fe5e28f529a3d4fd5fd8a469de45a8af0cb45293abe3924017a11bb1bcf69eb1f48b136190e81a2820a2c046f4a987e08a64d473ca3cbaab3972152040ebbc4296d7c2d30d50d5e324a74158915e87e3e66e3f9c13e7a1edd8ceafeea9773ac459b69fdfdb7888bcf068800550df1917a5531c83158eb8767a2934a353038ac5b1ca02dea7c9a324087904d39f95cbfa4b95c3bf4b9c9ed381e44bb4ea2b2cb53364a455debec5a6d12b5859fa2d010a4db8fdb7229ba593a4b27db9bb48a1115328fcdc0cd260b3ef21e2feed1f68d6203f02e147066d154706131853068868958964e7aeaf04d9b6df5d38e4c763dc779a7be405577606ed41d4575dcf33398ef8850f30af0296ccd5ff9e7dbf729b984dd135fa2920b71c081a0d182d41f28418c5993f5d1a69958862a61482157216dbab3da1d61dc437cb5c902e8b3522294cbf3c27239cd0a5792ed645a9dd1e87d6528178f8cdacd50e24871d736d56f316da5e84bd1a5a811abcb58d8139ff4f907fa80bfbb0df78430a6851608aff56099f76d46403659d0f74ba58b2ac72f2cc7af7c77957eaa5fc66aa56fcfe89e687772b92c2e8806daa1f5b33b8b53805dced1727dc234cc2acd1c3ba834895193309d34c445a49879cf51eaafde4aced343e8cc9aeb37462e6c45ae8ade99f627ec0147d82a91f5f2aae8b3b1cab503d74f7af196b89001b0cc6c66dd7620746dd224582e8857079059417407f79b06b11a114939d046e4fb1419cb69a327b5ad0b90d19005ffb49a04e4967a0e04bfa9cb343c4bdc61d6566dd445f50eb4a02fbecd18c4498fe657d55a82d2b7f916078b6c329383eac108ff263c4b5ed21d3a14619792fd128410f22a9fd79980f312813f93da6ee88c5af19618313c86141735d6b4c4c98d760e83dc54515da43e13d637c7e844631f946cad417050da6d0f48b4d920540aa496b1f90b07aa6adf52b1dc3685ae6462fe97f11fd041d5106876816d704790f6f3a3082bc229dcbe173bb5497954f13ddf9bec1a18b87fe66ae6c7d87a4928546b83911c4a8201c4aa9b4a668bdd1598819f269b125ce1d55fc10d810703d9a648761c45675ce1d752fa23f785f2d55b2acc260884d602c68d2edcd2de1dabd4d0a63210e15f85e05980c9622d3a3b6e234a74cb37cdeba23d56bb32c93ea6c64c3b5ae47f34f4c80554c3114c5e4eb9b440984af3eaa24fb86032098e0ed364035d1d290a8336759f9f996aa905162424d61aef7fd531b74375c9c0f63739973f3202484bf354d16e88d4d70ed89c98bd368321a5359fc029bd09bdc95ee04546e591a7072d55c3bc38fbbe417ee7fbc5855b472bb2f554b05f7969cf2ed157629c52af09d94132cfd796890ba0ff3785ee28cbdaf53a5a2284a22ccf4c13b6d87fcec8189e2108f18c2d9f34e6ed32459774147aa676bac5530a6f9363ae48f3b88c5bfb24fc2c677f496884f7b8d64da8c68ad36db25ce2f53b98e119abf7fa6c14ce7b14da867cd9714cc37c6809e44aa795acf0f528c091bd11821611aa34c6ef8b6016c3fe77c22eb3b81c06b553a49e9dcfda4706a95016403e03e849eaeba4f872d1c07c9f6107052c8099c1e3e0330a02d1b0dee35ad08fdc8839bb6506bb7f78eed8e83edf84aae7502915d923ee440e7d3998b7d67265264c0beaea3dbd873c14142a9a632d0bb133bf99809858b3bb88e91c6dec8529e2f866bdc4b8317784ec7a2afb168b8e52d161351f64f8c0d097c9524dc69045d933521c39a09fb9191e15d1ab20259c91d31ad1fdb256d11755df229f891b20d3a6d8ef931d8fb4c351ea05f1a8839e37e1ef5563a8fb5056673575aa60af2298f9ff1e18568ad0492d03af14d62efa0ca2eaa9996e6ea35678d331b771d3b3efd3d09211741775755c67b85dd3ad1ad8bf12b5e72d3734df2ebf400ee40f3ba1dc5131c59ebf0b0d831e0614c7886463df6f62950ddf69b9310388f7e2eb2277bd8ce47efd09fada4d318381da484275ab0a96ea35edacab2aa7f3ba93f0d0361e899482b97daba45fa715eb32741bd5cbea3a2fcee9647ec1b1689e1ea5aea9a64f271bf9a384336488a69cfa94564ce61737adff5cf8fa9d2bceecab922297fee6878ee504ee4e02dc1dda58315da2a49a73a9f1cdd2e7671c0fed644095c7ce569a26a72752bfe1ac62ee74d2979faf7ad86ecbc4590dc68d12e66f367002bda74a2a6494164caaff5d2077ff6c0aacbf4d43b6c9f5346385bf22f4fc191073e27de147d4a4be05def6b7894044ad4672b96fda650e23e50cfee81c1bfab9990f1d94756e62dc995015fdd11e874e239a063b5e1f0ca3f52ab77f0e1a79c5d734118c19eaba700f5da23878209db6eb3f1bef6b80587c3be8d230f38100fbd45b410e59d113400e0d85b1a5cfefad4769e0d3280f58765e4d3743f3d9f624398b95655daad4163f69a6b081b1e3fbdf213d2ebe5475580762cf0035a9c308adcdf5d84efd67b84a78ed7c3450e2675a6e1a4a54d717ecdd2e80aee279ce6fd92849ae545333eed643435fe53455ba60595f6d1321a7f889b9339721d2812164a479309632a0828bd08e9fbde3a2bc9be9f4e023b98b45b20bd1011b3a43e5f7496da63d25163a1329b885e3e73335b026c1ebab272d9b012d4035f83b7d853a200e5870b1fde01356a7597fc86eed4a18afd5d3f4f4c21e266a7bdf5d95c7d430428d5860bd3a365d4563bb0cbdac0fc8a4e8c5a74781b0fe351af827f4746e81f28e1db9be11214878eabd3d8739a73d896aa6c890a15fbd8b5c6c210254af1c07a4e644692c7f1f2a38ade2335dbb7f47a4a1df36ebd56c538763d3272e40086715db8a2455f6e84293b4842be0f397c4dedb75a124b71375e404c6cccbc84dfc29261258522eada844faaad68af68cea607f113817b0b8d8bb788157f4f0f4ac2aec646eecd1754493a6dc9c226d66a071b33c658b66656654e78c326f6004615e5809cceb8449fec7e0a3e572ff2ecd5a9f7d9047812106f67870c304bf85020f8f88dc17f130be2ad285194055eb5b646d5c1f14aaf5a0eb53b4747db6807783bc690538c0326c02a10ca05516a531d442617bba89e71d79a1e0aca1ecfba8020535ae159957f09878c0e379eb6437f549150c01c50263e98a7dd2370a017dd69273417722a832347d2848737c31550ea7ff3ab1064b5b8335125008b797de468cab2526062c1a1ed8cc380d7013736687a86e91f6cced8ecb278ddc9cc7b3991b66c2eaebeb919db2341c0d701379460f960e6a3b8c02547344f17a6098e418662a808b7aee7dfa33e95a3c23384ff6675384047d93801b56f2e4acac13590b9682c7d05a3cc87e82725c62328adebeb867362765ea512c9bb8ce38283efabad2f3ff8233dd586ec857884744110ce62a588e9b9a985bcf6b1f17e77b23b06c43079069afda17152c2148b202d6c2b5e4b0f227c5a5884beeae27814eca616a1145e24d743aebbad757036d13e0e9740ff6cc958e1abeea4bed67ce4839f6fd63355df62a05bea4f081203e2137676cd2b383ab9cfee7f2ab643d96127a586b61606a2c7a44771ca02709eed1e426e2566e7f329859eaac359c12a053956dfc354d6fb60cfefe6a0fd22545cdee0c21c2af28f12933af60 +0x5169e69bf0e777581ca94e070b47454ad7f6af034dd3e2ed564d020f6557fd908f721e2b19e548fb0c41763fe0abdd89efdacce8e3546faf22f3fd089928b019 +66760 +0x07ab398f3a21e5a2fd2c0f8573ad22c683405d768b1d292e523caa503fbd948fc98640b22f2eff94691aae705ee58a5b57054612b4ac5bf6deeda0557c201aebea8715a9e63273b58d1f45b187a698407e1491c6d497bd70955aa275aaf09a9b50f6e1fcc9f4ec0a5185fcd154b8f47cdeb5671b53a4f6a360cad93631f5bba5e51bcb343f3e109d9e92fc572fe245176130f098999caf9828876c237af726138f3dfcd8afd687755a906dcb7fed331aeecc53c50e468f55d3d784c1ebbe82ed38a69b708385fa9a6fc577b6aba2688c6cd3b92a1b6c3fe44a03499aed117839c79cd18422131115c37a409e1dc68975c58b495026d4664d7652e235e9bab0012468c69df44873ed40f6f30e3c2441dee03d2cbe9947ad963e0e781a457fd14c3752a14261ecc92acd83b68b708335cea53089fcda8dbcc9897d32d26b298423e8a18bfcd1c6bad55167b19f21aa104dfcae8993536e3aed41e939e4c180708d1f9fab52ac9feff4b6eb0ed1b7627863cdfd540a6ab2cf0b4d98b4d8b14b3e92c4922acc5a3f0f92e357f2a99a731519006611e98920242a95d3cc37a154953abfc32ff2436ec3b4c0f387b033a591767d31e9b91782e15201e1a987fb611e8ef87ae34dd0f4b3643506f56de8c091822ca603007c9eae8b790c7253263b809557ff6d64679886a92ada6469228bc046f60d88491f3c31dee59a50208aaa6457c599f6bf7223e58c87b5fb2a4acfc3c9c1ad9f196a2615522dd46a788f7572dd2891a6e7575e771334e0e23ac654451477cf71fac42300f03902e9e29d66512e6a2fa463800ee54819a3422100e2ec2dfebb257395fa9bbff16cf4e71c43aa5271bb19bb53fed6331f4543655e41601e40b9e40d46748dc73e59b40d74d52452277d2c783af5f3db2c100c904a384aef2311d64e3d597e10061350df0de4683572bd06219cbae448294ac62a2b9152a6910a22c0e37118a333e0f1e250381d033cc2ce3ee0165082ff3c98b969121f4d71edf1eba0830087ab09bfa0a398ecc56cd5ad5870d1df92942eabc76c845aebaa026a56dd59e1c458d5e1a06fcd7d82ea3ecbf6b3b33a7fd26826db9baeaa892691b68900b96163208e806a1da077429e454fa011840951a031327e605ab82ecce2fc0c736c286bed7ac38713d6830d703262def20bf310e5d3f736224e2ce2843d65689c3adfe4a6e3d37ebb3a48ec484c2b39be11a1c58b949c8e4a53adad36e91924e5ea2ed6330fd7d77c936fe60edcd338dd5ebb7879bd4a0b3e31e398ca2f3fc8b546bc4a7c47f81bbda89f04aa2a8164b8bae82f9795283767b077aa2957ffdc7314324768d25ed1e842814d047e5e43b5edd0f4cd665f992d9811ec39a982e9891d37d6e1fa30816429bcc90420925f3dbe1cce037616b9f9b05864e36cf0775e2974fecf0597b39925f98093574440b9f674c6210f762031c1f51c10ea710c5a0091c7183cbaf0effee07b976d9c6c8f5d7fe20f77a7553f938f1ca6692b32e5693539a5e7c2bfce7b18c1f9a8c36d29bbe62cb5f6d0e089eecf6a8f324970672d085d5e4ed6a99e664a5aa251e1cbedd850acfcd6194a799a5d10b18df14e4814b43a2bb81f35c7851d4f79af1d0c457c6669ca5dab1a755ee016f6c14c55f0e6ded8f56fc4ebb1a13aa7650ca0ba986ed06b09d5aed8e70401824418810cc86b3040a2b9ee53c481486a50ae925c4d7735ba9f84490d3652675e85d8b8fc366b52791cdfc5f669eff0a021de1a7bce5f3e5f76b3a540ca11bab2a04a1baba3adec8b4928705b06b1da52c0e4609e82ee926174a9eaf90b08a4847db6cfa378faa57f13de180a0590ad8814088d4dd1ebdac883b03fc06101cbde0464ff6c1b1a255c6147e48ccc5412480792c9112320bd9c8a0ecc1e34c2d7c71d9bd18cf6d5152a1aadfd68c5c5b09c80c93b70e053e4e6700cba9aec157148b0a56d8d6ff31df228568a2656aa308b68f70cf4704df6ae1ff231bdf1c04167a5c8fcf7f03be4bb728bb44fe9cd391da56263253cd69cfa7e08580dab8bee2ee44da650e076138de093a36ae5f4745b2052698aaab67ed475955814834021a5557c9222a76c51705ab87effb2e8884cc11146ab23b44343ece3595adfa581d3e19ce9f4ade5476dc8406e96b8711ef971e6211010999350cb3882662884b7c06ef7d24f59a99d8b12749ab85e56de6816182242d72d1801faddfbc0c7a36a74e5d376ba157ffad3219c2bec0e616fa399f073c8e2387760621aedf022ca43f82f79fdbd4931064bdb0048bb30587ab2e3b6392a97825b75e936807ea3c3e95332318ee05b856afd29e71aac2a04a69bdbb29ff160d26a47787bdbf3b155068dd84251acb444cef1f49bc847652d9c68682bcaa4a4f24cdef82f27d7b3473faf08f66fa8bc36d92e22627b14499b0421746be5cbcaa8aa424f9b8bb013623ebfaa93105ddb2234bc9c855b9c3f1585cce6b816ee3cbd2c7c67073008386eabc8a5625b517ad187a34b4b8f66ad65c773a65b859661f9799226bb3d668a332dcfe3ab790eff0c79eb16fe40fafc51731d9b9c5c4aa1233a8f76fedb5371786dde4bb6921cd499b29de4e495e195a231d3afc2c093640516783e1a3256550713fcc5cacd015f40dbc19f47b7a2de1fa89cc917dbf81265b657665569f79ea6c632393052470acb9c5d2e6dcdc541928180d1e1d501130cc133d5f8a9beb41e2e878f314a753c009c7b799f00d325c16387b069d636d0c2e015754a19340036f403af13dd145ca9842268247853f276f7ba4cf70520af4ebb042d95e2e0e8b8c0ae821e32abd48cfb5be3465ccd0f77e5208ed28a46197af908e51f2b4ad56a3991ee9c72c20b72aa2dd24bd4c9e68cd4c15e448e30770c432985321dfb301608b3dcd3c4e2692238a01d7c0ad0de7f6ca6a59339672fcd4070f614e07a5f82d51c350c519156664ebcac2123695f1756d64908b272ab8599e41e0d9b4fcc7747d5df8f405a3a04948a67824a1dd11b3a5934eb22d951fcf58ee6677603ddbc06e5c4a4bac27dc5b11137e6a5739d54bf384c84b0258bf9fd7436689a1dfc1bbb54cb93e75387714e5902975cf3298a8e7a7b1a85ddc04659a0f75a2f25905a0e2bdba3ee94c1d0126bb2db9825de844f27a8f7c88957a9b01a0f835ca40142a671de1ef80d91a9a64e2dfb8192240ca948bb61a2b2baebaae8682c4a21b69b2c2ebb4a2c4760c6b10a5d3e3ec164e844e49ba13bdf50d4f014e99c2124192d476a5a70b3c997eddca828eef83a04e1c90332ffba98812b2aa6791d083591bfa02ea3d7b41b9ce7cf2f7851d6866ebfe0ad67c24765b5ba00a402f527dd861bde817ec958c6d97c31a734b1012c084a30eb22340ccf544718186b6da7a36007aa6cd38cc751b473ab194454a0b43c4a62c44b9b2e5dc69b1d099ccdb010884cacf68a6928449796e48c9083dca771861d41cb40d898747eb5807c5d69ab64b28b278ba8a328e9ab8508ff85dd8c0ec70a69886b3006c4b78884f565fbfc5d00f007be916284127b35957ba4caeb7dd5d1446b645e311f103f1dee2c8e8bdc00829f0b6c8ae07ace9d3cec26cb4d257819da5c728ba1ee4f825350fb48e14778eaf65b8046c4896c640438540a386e788a3444dedfdc973df82f011a54850731cf149416bcb9a71c33f64876ac37c09ccd5909f1816c84a24ab8ead1d8ff85f3da02a07614463ca7b21804d4dccf83ad8a5195f09ad91b4620f7f368fdd82885b3c765e877f4b0d6887454b5c08a1f746825ce2651a9c6f020f20526ea9757b1016bcdb40d4a6b6f5e12216380effdb610dc9edacf66ec6af5b30654c8c47c3d6cf7bf21fdd0d53adbf851244586833e2a7eec533b97f47a4542e03abee7fef29e722278700e5601a830ce4137d81ad35d149fdabec548e9b9a57920f58945983ce4e0028d8d578a6cc27e027d6c2a3c51a4a1b780774f7ef8e6bb4e9431b9f7f156e0047dd43e9ed0b44bae40ca1c42af39d932a8357103ab0d8c0bc468c2d662ce0ac9676b75057c101c8fa77b56ad1fd82f935f88163e7920d6a1adb5c8ff3a57469874db628717ded8ebdb064245488b8b21ccf6a6f90b29805676a033381ff67cb8cbab6fec4924690b03f347d1d359d525180989fa082f727348b16b4abab59472966303fbbcecb63748cbcc1b674bf5e76a49280a193b943f4a71d8fdb29b760efa8c857d153da7b6d2153be9ad67d4afeb3de9f0e654ce04a567e218afb00bd421ad5f3bff2024d2c859fb044db758c5c26d357616820808801cf2655bfd390b334ef8fa209b15d152207434ee436a701961756251cd2a9504166eaa5b89e9fd57f7b88520b962fc9af00e403811f3fa15a20f7d413e1cf158dfc0b05a5d04f0b63107a3a87ff49bc55431f2d52cd9a9e0b76d8f8cdcc664a6ff4e3ffe7f702d78834d1b60f7b1f6fed145106a9906c6a228f560dab0103813fc821feff917fcc476f2b6ef2882546bf1b263a2616098827e11b7d4c0e3b3c960c317d6d3dfa4c2915e3cfe1a4fff343be0b3228dd169a940285d2116251ff0b278f05b13b26f9c5cfa7534d6013d823738c89525407f3ff6a11b6abac0c2af7b0b7225c377a3775f2c283a637e577d6e2069a12f94246b28e6b757b29ae52f42e365ddea16897e235d1fb7c9b0954c670160eeb5b79d555f5ef98f089dcf988f68912a917669d62ff62054117e3e18aa447325be9035262271abbbc4b0ca11eb02beb5bf818baa0b5df4b942cf9c08c04f6bee53073306fa879382ecba1cc2dc19b3267c1e362040fc638d648df545308c0ff07b04de1c6e087b8d8aa50ed4ec153924d035b460553a3478809f92f6826129d43e6f8091065c2984a558e86fa35e1857c4af4b93d27e31249cedbb443f387f41a4305f8c4aec650d46bbf2ba885c18685f7244e140322036c35fb757ee78dbe0b630c336c31ef9d374b674de237800ffaa67e77125bdca59faddd056178903597b55f6b7f85bab7c3731b503fc189ac3ab767b6c0c87f7334b4f4c6943d3bf53fb883f36710c45b19714fe4f9ca6ac5d6c884af97af86e6cbd9d74baf8bed9773fb2e5dbb7978d199d4797ed8a88ff74f5839a41f978f9ad58af906ec1b2176c4eb931d051664c5d50b2c8034e285bb14c51b46c106f5e9e256de8b0231743da31876b3ac7df4924b93ed9ba71ec88bc7bd8e0a1484566e62bc0c3a6a855236bee02db44a26c4e17ded111397a3e4d3c8a0265082762d92d738e6b78d7d480c58f14c813697421dec954b9a9f18573da7fb58dca372e7f1d03c1264f38fc21901ba47cd2a45f8b2082b019315e28c33d64db9e0f0012205ce53f3d535436d0759b993da7dc9454850fcb79fa4a91020d405be1fe0974839221f2f8abb2e8531b16dd54ba977d44b77a8f212b3d27fbf41c1d9ec0dabd7168bdc09e80db7c732c945709346081235bcbe358edbd527598ff091d7cfb56b285c39379f95558f84d1eefa33dbc08b81c08ae6868547a37a1f107a55bf5a50e933a52cf3faae6aa28ba8d6cfc357acc9f3bda97c389070ab8fbff7f854e144d372be5e979618c51657319aa9a5240278f6b4e2e27e461b68523d9f421910a361b9d330fd003b4b4ac4e7ba63f9bc09192a1f274bbeef103af737d4a5843ef92e79826886c17c59ca3559ca8119963d250e4aeb3a82e1db9dff3d3c951ee2a294325a59e742527d1f58f62f73bd391b1733c6a31152d4e9fbcaac4bb351925c3d54a999710b6411b4804b6dde3d2b3f8a0b10e382b71ed7eefa036662b4d47284811e8bc6a517d4245bd81a0321c2f6d814c820e1184601e1fdd12145c11f81f42827b55a77e420d93c1a9894f3b6fd9be14aefbf0ee1147f56a410befeda0726ba43aaaf2c5f945da1818e062b7d903ff127b49f03566c1184eaa930d69a7e76d7f0d0271af08b2c4cbb4ed9516d7b5eb4ccf3e38e3c953329134f6de0e7647ed1bdda74cc3d81cf7e167f70ee2d0b52acc9424f17fa1c7e83cc97a89637359968190dfac89d14b1b621748f5a22ccc659ab041429256e3e455506937f107e70db810f3b98a5b07d957ae2673df52c244bc0dde54a35070cee7b0090f3e9ab7fdc8432b9a4ddf17d9c713dab020ac5f6e3c91424f3af6354df7d3a33ad495930cba13ce785bc344c2ba2eacd3eda16b8c2126b75ae0b2fc0a8fa07edf3b5e41e29567267a3a71563c38e7e304ce99ad4574b3839d1beb8badb6ffe427f95f8928612679c9744f15f14a26c96d4cfcee423c1fef41760aabdd75d81b3a98ff3586263a108c91c74886f7d3a433ee33f62a8154436e76752442d3136c3fa0a50ba3ed8a33ec1740b9a648d6bd813da48da64c39c74ba595be85d8991f5e97bbd528bdfe291190222ef743175c7dc0b87b5ea4b6c3018ad2414e8c507cc107a859bc9f7e3c2283d47021f27fc94fffd787f991b37eb7ad957444f821cb8d77d460089af2b24779c047cd5df44b20826a7b201b1841969744201023f453ed70a7b1b4b642d4aaf94d7aa38b5f2b18d2d71d7a4bcd54c6cf490d5a15b25d0779891667fb57ea708be3d34a84a9b25e768836b028bbff6edd0a03c9d74131031ae255c972173cc4b7ea186b50b8251bf6e38d69bac88ab74af1ca05708b170adb1a3783226b11cc06ca12adf876cf76db52ec4e0add3cc89d6429b7e87757444599843d143bb3b0ffec89b983caf798ab3c19061fe35eca5ecdea8748ec38d8dfc7049e4e7068992bb64536f99be4a8f109dd3a02c038e41693d31c97d403ee310d7e4fdaf079af10910dcd62d3dfcf32200092b95e123f4c1ead1fdd1601b0c4d1bcf8c0a52e1938e6aa26c7593035f8eb4ab54ea3340288d63f37229a77441f7c84400676ce002b1be5e82f151f01cad1834cc879e5565223530d6f48b0d2cb779fcfb64aa38b6f9a84bba3eff45c313a72fe30c76f63336daf48cb08f3834e29d54ed70bf3e38ec94f492acff66db48ee0748d751850b21c1c913fc2877e32f9ed6572a0072f10121037cc9d6e5ddb369556e76a294658986290d25eb5ecfe51b1bb8ef127987bdc8d309141a4532e98594b4790e96cab4949ec8cc4c5f53b98e7f933e69a46598e8fda82a3e078361df4fbb4cea2eb3598994e75dcffc0703558c66967aa603192dedda6ac6af37a2d2d0f360c9aea7eeb195d968faa762592cccb395c9d0e8c4f42e2064289ed8231cd2fd5321b920cab92c2f6c3103ee3160bb0aaadbc7af12d8391a84e878ed78f9d029a296b0a6941cd249d6177413029dc1cc5424fc9e894689196b9aafd00b162318cd7d27b1d138f2c945228a7973308b791039e26f9ecbb8bd8693b6385fde763b3259a0dae8ba382e27c6b979d9c582a16d9f0b7ad9d4226744881e7efddf34118fb09e7a610d0cd8fc98839cccd911d5caa8fa48b0fc60b743dc6b2c5b84d73c24269328d09ddb5a420c6b6ab2c7e376c60c1161cab0ee1df2f50eb8ff6bea0b9e00015e9e093e428686e36c222e6214de1cf35e6d7e451be0869bbd6fe0e7006bf17b944fcbaff238bc8e09a1890830717012873fc0e0318af574a203a058db0c5f54625c51ab19e701cddba744503a3e89e184b83559ef50c62bff8116a9cbfdce4e315a37a9f9fffb255aa9fcd4c283ef02cf4d281cb5e07d443e3eb07483ceb2ab89bfea3743120d16ff302f0049e003d8df8535a315988f3fd6b30a2362eda10ee3f3e5ed659bbc3531c0476d40d16ce62df6da779f1770916174904119d91dead89cb716e21b8ce2aad0c26637e67ebd42f87324a2bbc5cb56f9cf57f92f7dc1c020ea4e390ff3b1c2f84c95af8dddb0b720bc14d113f3403fc923d2813f65264316dc1ddae79525029d32760845fe82e2f601d29aae9db284594a3b62b7587ac9e518e06840c5aef2361081e29d65865efee0e87fea0984bd308f0cedf5dc41dd223d50319a19d20a596343bef2874da391d5c0f164db2942c57ec1a399451df54495c7f7621610c38da7260de3e84b29555ce68f9d9722cdaea5f4240037619ac2dec20a172efda63958c35ff00d0188bfe2d3baf2a203b652811eefc927bf463354c8ea47e8fb3af2f486159569f32a480412f412a04e85378cac5762aa79700cb4672872b88bfa3106f8df4293b286743d2edb6bf655c2e44516fb5b1432a0b56a07450632425c7a0c960d95fea235db0a81c16d38dbf7df36f95c11197d70d3e233b090da90ea3481d830fe2f54b0c2d8a656a4dc238c9edecdfa330ebc48dea9770b91160a1c06e359d9e98a4c7fe234270b9154def999990f462f8871913c4c4ba69579107a57cd7578f6b3ec0bbfb96e40b13760d7561227d064fb2ff273371c220c68467dad8cc59e9420d5dc91b4f6a682f84bae5ac6c21981fb69e529f6830e64880eae8ecdb4ab40457c7b2ed35a9d951c11d72e334891f4fd91d1b706fabc3c4cfb8561eced3f99b6525fed70f4a6561735fa36c435ca3c764a40b0f4fdbc023b7f8acd86c9bbfee7fa03343a7f41547e3a701b061432d6f9f5da8e2d069e44b81d373817c4b0ee5ec60db98c350f0eb591e131755e6c32fd16e7d52b9fd382574703280c78aee68f68c7d3e2c05fe351cec610ae9ec70ef43ff0fc8d43ec299daf8713f1501685fe34ca29daabc470e763873efe3fe39973e39e8aae7d58c90f992b8252d5783b2fccad11d041dd45cad2ad22f0cc3280f08438f61bb699ef01b67909ad935484a892b922604cfac090aec05332ce4443fe9468c5618a3fea3869e8006df43bd0dd29a6d20707bd7fbd5a394620b08950f2b6a68f0c52bb68f826011d20828ece41e3deb7311c85e1c567a082370d8246815d6aa968ca8ce9e59d5c9641c8dddb7b73c9387af5f4852d597e7e025fbf830eeb3dab233c34cb751243325e319976fe3c0eec412e79d879922bc00f01a1951ff2880ab83233ac1b476d47d257522f2ebf18293010965a2eb440ceb9add90b1905e25e944709fa6c8f236d5a948862a17f6da5a456da98b13246108ebeb643ae87d50d43e54844dd6c1e093383bcbfeaef87b82a6ba712a59ec42c1aaed9dd251ac8ad43875f09e250a5a219af6fa55fa1eef74ec99c36704c1387da18a446311135a51fc7beb81fff62de597201b194191bd97dfb1a92a5ecdcaa5966b60d471db48b3500f7edeaaade049f6613431cc786d5247ab2a5bad38809f5238f90db92cdc62fdd9af9d6f56fbb381634f85e3fc870feb2e4ee23a2ae2d49d9818f6312d9fc6cb8088a69619068dfecb73fdcd45943594e31ea74dca79ac3e33c3772107184781ad11e1671f8a3e3644a981d47a1c2c0a71a1922e40cc90ffb20578d0e1d04ee90751372a900f2ef174f8f93ec3a55b1582e08c24b563e6a6bde3e187e44d41c937508e26941bc5f703684d5449b92c7dbbe17b7851c717fcfb679a8e38198aeae416d0a451386b0f9a01655e34df0609c6ae49733b7f8cc915988b2d04bc8f14b7ace3ecf2ed8803e1cc29a4aca051834b4fdc5a9c13acd5b27e9dac70bcba0e5719b1469dc284997fd0826dd88276b1f1ca1e789b0cdee77b22b652a6a372a26e6520fa7b40c79a1d155603e00fdb5b6129f51461f18cc9188bbf68cbf81e96a1991a4fb3eeb9cd62a48facedcfe94b43744b75154a1d4130c1a1360a4428b39abb868e6d55c3fcf78413b1274908483eb107e4e0a0f9186bcd4204890ef7c101d64b00d3fb4bed83bdcc5ab505a119faea11a9ea79881673b68c1a70def3887def53ea0a6abb69af58a0eebf8b1a872026510c5a603102ed8466bfe83c84cfb71085973d2a7938235c79b76f64dd5a586eaf5558da5fa58440b73d19b112605740c94e92c1ef2286d13efbeb17505a49c913cb0e7177c8def169da2ac405010488075631b983ef80c0d7035b2cdd4e9c3f65b7a2ace231a39f63df43fec57b66ee27f8439a9f66bb302b17e82beb00f8d88d613c1308a97c528d948ee6ba96267d127cf0eaaa51dc29247eba9de136069d7311052f51f71113cf4030044d19ec3aae2a5f330c768eb3a982f80a29b96e95ff0f248726e509e9112c54e0e4ce5f2fe449b9fc2c9d77d7a369caf82a51d7c81aa2c2a4ed390cdd3ba12003e97b28639d2325ce74903f9cf87c59f14cc5e93faa14070c10bcc4f635e5bcf4c2e9efdebffecc304b168f0b9103cd7cf7df4d0198ab1a49f536d63ce740513bd9e05ba93323d6aa19f60f2a56464e229365ab16cdb024e3066fedb73afc0761942814cbe2da6ac447f966032f8c02698820aa87306a4c60a92eaf70146005ed5d88c34cb36bb0073be73c9e051f14dc3fd8f35ba823bb4a483dc46e5fb374679bc910358d1dd1fa5e883b01be45aa001e552e9a1f2198284a62d5b9013e7b57b5b3a28d5a39f52618a309364447ed5f8e5e024d7cae0c8317668a5ae4494346150e225c01074311d2024e457d6d0480f8bd177ba7103fe217108a58ee1bf4bc22a237aa6acfe445f26bb33453fe17ebc238162c878f58cdb22a7ebb09feb53f44378a807dd9004ae2a7df0dad4450295698a768067580cc507a0d8c1c38ae59e394c2e5226cbea6087e7cd87285d5c11aa471380b08de6859cae0d20e120891678288e241d246e3ceb72f9b8c0ace3b78261da37f929b2835e09e95c9d4eb6f39c9847ec251c1889b1ca260e21b6420d7e452b24859de954c84f0dd34c67e7cbf315dc18d32571ed6737d2e5cffbef69ea8b96c4fa6d03506807eb33730ea3f6282bcb38abd2f2ce985670ee20006483738fad97cc09893cc9bef1eba5956418a83485da239723a3b1a09065c64619b095cbc01b8f16034049cec27a58aeb08a0fdaac6bbf047d134fa0b21b274f9797cdea7ede97f4da2184c1cd5e00bd11e0ab889f6be28d7783cec1464cd78f669f88564a4f8b389646e73283054242f0b327c8ef6942a49b7bbb9ccd993b880f4e5189b2eced53c0270d9b740e71d2d557e1161cd233ec6161929dd87ed7bbda0ab60f394512d8d048445720e823df586583ea98355ab761ebe04ec76c30bd8f8b22515dd6b02a5f3148000a10ecdac2527cc0e2111bb80561312a4affeaef781632ea911039eac5787530b0171157dbb53843aae3eb40d467e1baa3984ad43c5244556390147c9b645833837955d8ecf442bd232c6df447768e6a91c3f50e34b5e30c45b4c46249ab6db314a60ed07e9618c81b690844e703a3c476116deff9b7ab89c82cee3e68a42229e42bc0c1192146eed4084eb52b95ae52c0ff0a1c13edea586b36e65370f511f26289004d450c598bedb8a5b79db32a9012eb7df4fbbf4bf29f814163eb04b9b7203c41b77aedad39d8c8a1eeb5d28506ec752e1d19a23ce2e58a83c24f5985e2adb3f9a2231bce7325d6c7acfc7a6a11ae0a9ef7064d2993cdc13201066a030f5b8ebc9ff63d39c245518b84da21365ae84a45053a06be9fc8a3b0a2b8ccbd97ba3afef33cb87ba1b7c771f8f75d764d1b82b4ea4d65586166c09419dee822065a37355e9f14108c1db6ff9bac85a662c86262f888ef838318a650f8d142bcf5bc11f44475e674fbb79e98cf924033367f57d3c2951bcc7f5ea38ba238730ac04049c0275996357b45fce22720f3c92290d18bdafa609fa0c96688b89cef7800974d0d79c2a9be8529304014d136d4d1ad7dffa4216479a1b96dfcae471ea121119a40de49a79ca3d1f7571b3b8fc2ae35abb3a0828de6fcdf083bf5ff96f2cc5fc00eb747063c41e0a07bccc8552f22c9f92 +0x68c34d5aec130f666c98d7088506e213c84ff3a7e86c21932039242a68b4b78e36b7b3948435d89d2a86a5194ba1b321832ae7b8ec286f86b6dbe3e39da2d2a1 +67552 +0xa6bfb8320576574a1f41ebef4ca72e04b0cffeffbdef03f8f90893ff02d1d2b3cff01e113870aa89b970685773182d1073d2107b37b613a36e45052a005ba6e04e5f0d94bbbd472b6b9641ef4bb6e72951c68ef105c28f4540ae35593385da2eac734c6695437657bd1b3c5edc67a675d11341082dfdc205f5aaed33a438b5c47093a52dceec7e353867224c2e14b01f7b21f169b94ef30c17a0f3605a5a80cb2229de926f9fa9ee63e2ba634aa64f4dd75865bcb09c69812efa10895dd4846a4b9cc03c7f443daac7f5ce483703c8286e2167a81bd16d8dc01f0c56b68f06ca725413d406c28390ea0624a6fd1566d7c7e2bdd501d447585777af6e6c7251121fb99f010d03c3c9567f8623a5c270826a0430ec6a8d3f097a6ac17a8764ac6bda332b6c9aee457c93c6ba6735f42d53e0f088955fe49dc9b2600921104f5efd2c2a81bcb86b50d22745881bb892e670b00d8d77e6c1a8bf85c1500c0e1ab0ef9c06679a6c622df39c62bae73384e40162c2073b0a0ca9147df55ee289adea6ab32fa6aec0bb25067a871672b0b26c2f7f79bd88d0ade8ef2264fb4c8af05495f70d069fbb5e7e34471b66653604c9218e997807428cad79fb77eff217cb3599f2084e16653480a48d867067ce624101178a0060679240d99094017b3b26d79d2c8948bac723757fd32ffd217fb41ef4a2b31d3a47a5e8386925fb90fbe980ca2cf6ba34e814a3eca280d43b51e2a624b87e973debaeefbe0f90a3d861fc79487ab96d2bd1f0531481e0bf5c4cd422b9e05235125a969b92093fc2fc74470a3e9e382948889dce1ef8b7842c7972d9dba397c0619c4335dddf981fa33cb27ad420ddb533170559338f6eec55dfa515b088b601d1ba9f04c61a058476c2261334890fdb93850e3f7bcf6bbf7c86531c631715bd0bbb91527641ecb71c0d891b8361356110dba2c61d3f17c54c7765381ad81dbfb7a7006515dcb7813e25c5dbec2eb9105320a8384268dac56ab9c4aefd5436ce7c87d687ca73cdaa8413c09b957a02b0045c08db11d01d89815456c93612c9b10262fafdbd8f96fa95de64a3a6cc7809cb98aaf8b30146d7375105d0ea9a3c31f240541217b77a391a8e973a48ad83e24edb76d64f83bf7834b7b80a4475f916f429cc0d0074e12eba2c43a9a2a48b05382d54bf0edcee34218e57c0692a6628af264a359f4d33a21ebf4f39de39f8382f962cf918963dd2a6dfc93b8441ed2ecc3eb6d41dcad85dee4fa32f21f43244db1fe6cd9438131c6ab1f8c0bb43f5f2f27af830a1733927d1e527d6965ea1f1e6cf6a83aa4bd7d8160ccb9a36b7e53acae0f89154d1bcc86f87c37562feae06f5afa0638456f3cf51f82a0f1e2527cffc7b9f415e6bca0771405f53b05cbf4db3c570b547e1cec9c47efd699b1522792f50d387e6c9ccad7f15e3b9a6013e8cc51bc3c01e75d08e17a52ceed4103eff0b697daa14742882401037ef6c74918cd6b97fcd2f9961e5f176a0e7f29de32b3acd86f311f3484e5d38433d2b3d22158ca58e24a2d5e997faf73f9b1c4579c36184d4aa05ce92d97d95f0eb0be557ef8fe9d60da0b1d06ddb32f2547b8f68902b975117188e70eb4930244033f39ae1888d41d051b67e2c3c2fa2583703195a3d0de38170ba494b6910c885ccef52b41f97b6b4dc6b5c9fc4f535f17729f2e942ee743238da84c2843dc503fd62e630fb111c026958d08d1c8c9564638a5c04e042eb7096778b1842c001ffefd3c01dc5025d03220643bdecfca8fc25adc075bf123084b218c5154da066c4c9ca4743247360fc2dfc1ef8db4d5800e21a840288652bb6b5459a804ae5db99b4cfe36ac16b0d38b2c2c70691888bb7c55a1274e344c44dc7867223e49847c5d86bfc5943f24cfedae1a8afb7b52b6af3f4d09277b6e3930f64b5c4c1c094915c25fad953100595cce027bbf5da1f6297702826edc370ceb666cb2c8965a945698646b299ce2046b147aef1f2014fe4d75781f6ec735347e3151d23e58f6e29261546acbc338559b19fa41a5731a33bdb3042cc1dcf7446bff711717d47cb84bc5a638e65481d16f36f71fecb7303aecc83d56e28debb12729610ddf894a8a052dd05223b14cec4a03f7c65f7ce5784d2d9a1a4b4a911f5237a8330fe7fedc31127952ee79f81addf982f17824a870614b80e3869365c35fb29d032390f823621bf797b10f11f17d900f1db15ef7b7cbbab84f0f18f861b212d61ab4e4c4f41a92d1bd15f138e4bb6012b7b58c61c2eee376b96f1bc75efbd0e9c63e83e3d2bd1fae2f87c0cb8919d2343bdf2d65063d6e62bf014c313f9f952eb22adee323ec3ad35b70ee48330b6eda26a8c2700649b3f2cc7ffae4680fb83b5af456317c0a4ce7ed7bda3d9722ae7b04acdc2157a64cad7e25d85f8ceeb2861d359a5d5fa9fe524213352a19d2199d5245eae75eb5910920bd44e1029f2ca595691bd5234d97b8f5a15f9c3fac28c7ac1e6f30affa498c6080c1376da38f0040094b278b67d17264d0e9e26d1364705ea0e9aba006aeadca2afdb1229e422ca980b8c2ec7b14253c1c44bb46aa552e0657eaa6f34d68f3aa162afcc5d1ee913e89d545bb09d837e7ddf07540c363671fadd2b10e50d0e4acdcf968cc010cb47b6f311e9ba6b620d4a08dbee01117a2273d42685593aef73ee9e983a98df52cecbb4cbbf2a406769f0e7cd6b8f5fa65a970aa1b6d883bb1ccb77bdbe2eb60611ef898ac54b471bfa3723e8b1ff4843802d28a78bac10f9af2d000e00cabb6e76e91a57e364a50528e76431a999f3d8fefed53dec1c0a3193dce492e8b4161266830e3901bc85ae5cc754b23ba489ed3bd2ba6dc16f99ec30a0c9515f33f07a4a830e39079c0d9cfca09972506a310a9f707e3ef2eee4b0ee4158544b90712f88b2c15edd4c6559723adb79ce3114b892a2cab967e11408358638a29614c0b88ad8d0b06c14b66d245dc3d09f42597e7c2e46e4089050796d3811432604069db6bde2379a3c285e7cd1f87ea9e529e5c5dd99c9be42c18dfe1f8d40e5ab6a677628a0fc500be2b6e05d238bd661ac74d5776c706f408fcb500352a0b950159d31e3b10677ca0dfcbacbec000c0009b315c466df04d3e1bbcbac086b8c3a2ec74eb4bf5df5c2d0b971e1fae43508692aeb8c30206641dfe6d8e258aa45b2de6d37646f0ab43854746d68f63f38c2f362c096713b7bd2b3d3dd6cea64cc004d1853bb6b149a77c0b516278719fd76d0e2fdabd2362dd0820a441365a1096ca24f0a805b8391c63d05d4e8567b6c6c27320893fb1b63817714739f7169e43e069bc47de660806cf3ea0f710b6c6deb21db4b1693f2052fb778d4d8b7c545bda083e978b5b24eb209ee2f8b4df5e83ce6642cfb43c1fa206dbecd85dfbc1432998fe13a7081e5e0a8999cfec41dc5a89d55150cb2922c9cbf6fc870915739e51847158bbed52c3ef772be9219ecec756f376d0f886c82edd5122c5f749d9c1e4634eb3247b70b131f01fe0ff46a45eb83909ccd6f58e45ad82f611b309625254addccf9b42e6aa947cec23cfca0b95402eb0a0e0d5c3a2af04fcf6c6e4abd414dca21a6ad433146986273e2da952ef613cd1f9a0a836ca644f9de19d6c24abc77845002d9fd48333a447ac936518d1bdfc043380fd26316fdb5f6ec0f05b5dcef92c3d5e16498b854fc3db9b6ddbf098d4bdeb2c45305c2420b7fabc21be7eade7ce0e76c80071c0e13267a0540ab0846f758ced00d3bf13c84e11f960dc72d6bcb11ff235a7ea991109cd3c9823862324a1955dc08eeec13a7841034e23cefbf06bde7aef9e6a5057b068eabac505d78ce890e8f4d04fceefcd04643a2307601b54b65b465255992ddce7152c5da43410b10c392e36767f50c2e886c558a0c5a612542dda7250d5ebc5b4567d5bd5ab488173a8cd2fd75525e049f570432f7f291b245d3c6cc0994a315d191e5e3ebfacd043c2623b0702a7bbb54abb70f7ff0cd5a383bca04945a1764df79fb333d3a62419108dd669ea8e9bc6d10740bee7d9d85e1c0bcb4f7d8a2b035c622959a9dd03401d9080949f1326eb230450d8ac08a9b0a08a3c47b38cb619c215ff1484b9e475441ad80b730dd38edb031fe9de21b0479bb871b659f1adfdc32bc2f906b54e151ead2b3308b7384e43b40c46d0ad929f78270a300371893bda04038ba257a69c279828afe2a7bb960777b4843614a704b05674393284ce30714f3f20ea399496d99c2ed68367d3e290ce972660ff8423feb73e3659a3f388135de46d40a38e81af09cc4b5d7027d07a3932b203b6b0899dc9d6bbfb477fbf5ac081c5385e0ae932617f72e3491ddc2e47f59b70d29282282ecc4e99e7e9229207a5dd43918039fe43b6e1b76b2c62176b7e574aebc0ca28268d42b81dc67e53a3aef9f51684f05d21112c4c4eda0ee0243b89f46ac1ae1871984cd8517e0f3a252bcfcf358fa8e97a0c97047cbd4ef2f29b980fc7fbca63708bd16d1b9671affc9ab3348716c02dbf17c6827d3c8eda673cf5ef9bf59ba3a3c65508e4a6321f9a8a38b773a0e29480a14f58b8ee5af0e29e48365f358e639bd65c1e3503cd139f68e4da83c46ca84f5775d9b8293ff1051df3567a423f0dc94a6b1f95559f267bb53c205fd7daf37ba8fe881393ba354f5a7bd275921a0cac80f6af7e0244c2b00da2fb3071c9e0a5f42e0623b4364811c2663ce9abac0ac618733067a04a62bcc0bdfdde28960a4ee7a8b690e150a3fcf436e84f056162968f8534ea961c91227ce19a9142ebdaf6e1e33bb3c175d3815e62870e15d6ceae44913f6f8a47e86190b243f27727cd0e8161e834db32511f6f7d7bbf7378896dd62bb27ec338b2fabaa49c8a3bc67b1634a94e7c75029757a5fc48cba4d32d65b2b93080f77b8b7e493d06c0e7644fae7a2df0f3455320aaa04370cb1053452678ce2c2e8d8cfc3cdae0152f207dc537d0646241b2c08788dcf776364c855b1086df27cffbf96fe6ce423a3d6d7f7622b5e104e053c73682ba8ceb85bff5c9c47b6095fdd92d70dcb1b8086434e5dd2fb9286b479ed3b828d7882331f1012ba2a4f709309ba589bf23c5e24c0d4d549f58af07fffa7276dba25dcfe37653fb4bc206f3f0ba0e24ee73006a5d5d1286f202e96d61fd200d2ba99243e2b64ab3102114d8b6cab3cceb4ddc0300aad1eee8467bfe262d68e5896baa21e84771dda060b54a0b34230c4612dd4ede8d07f6b291bb4cb4f1c99a855729ec4c9055e57cff4caa668cf84d8f4078905f6a213911833beb86f0ae969ffa85f588276374f65b6f8c414b901b1775228a0bc8ca205589823d1480945449d442e0337316d6ad13726233e686ff8f1f8f9e5c3f4f372f1302b40648277e1362d53ec71a0cb511a619ceb6e4496546be044fd9243cf7eece5202a4bdb45e7d24d163db72a18ac481aa1432cb53d6eecf25110b2e2fed1509e48ba837e78ff798bbe1b92371b22644c7e5301232eed7c166745a93748142543ed1596d1d8d034cf95b0892f9d5c74de7c4474f62f7a2334d0c401ac75ef73bb55660c3e2c030a01e124247b660283b8e13e0e9609bdea34d2b641a84c0943f0c8d36b2b3e3f040aeb9feb813ebb96c2f568556b845dd8feb643f293960b9cc990843d02d42d29d0fb4867aaed2fb7e402ebd3de6703f67bc4929bd41b9c872ef4a2092ab774813c59471f5e3a07ed064eef10557c564b9143ccc4d5a3650b073b55580bafbd14364cc59b06efeb4110229b933989ffdf297d18f6fdf60e303caec4b10d83b0eba71dea6408d282b9eac617e4f357a5ba2cb89fb7b4db3efeb695189c98fdf40d7515dd01ceac75607c828c8be9aef1e5803d8892621c9d7e5b3878a114e332828a7ac7fabe446b3baf9e221085558b670f54fc0c6f7fd4b714de0d49e9fe1153cc94cfd842640d54696100fc2e161a48bf4423af44cd8bb1cad0ff1b7f163a8725ad1e22c1d203b293154fd74bb746907a57240247cd6975635775a03ff354267c0bdb60a357f45d160036274601b94827d3288de149170ac9b9975e8f5c0839b8f72f1b4fbb895ed86ade7686bc1878ae0156d97a073d78e23e8edfd81afec6c3b942d92fc669bcc39d6e4b73b00e26f729d76d7bd182c8983082ab83f6ddd884993b25aa403c7fbee00f2f75a4415ce993d2d14a6d8e01d1d59a48f6b54e74e3df428428f0acb0b07ae9a9f46259216e86708e51a30a2b7777ff409b22f8a4c8d28180119f5f5583b4234158b0ff7e6d4cd92bf73d9e4f715cd91bd904846f1bbb1da0ce15fd791ed6e67f0957db79cf2b3430a301f174a7cc4f5f172299dec4e2416cc51a2f21692859ec701f941d7a6ca926bfb9aca201118996bf45e0f7ac8f136d5f769d574cf1a50ff3cfd26f57566294b22b76e16772b047383500c4b90abb2a04f0ee22af7bf170fb313f794e338402e420f83ac136ecfbeabaa24dd49a622c1d52ca8b7a0c6698f10b814248493af8bd5fdab4f7a664393d9c6e99e68930f91062db9895ed2c0e3b2640d22be2aaffa5b2c358f10a418999a20bb0d51d4c1b47e9c653e8666a5a434a2532e144fc9e04df5b2d98aaaa736696229a8b9fdf1a28ae36c45cbe48056f3ed76950b7595e42af4b3bd2cdc8800c3e5a5fee56107c1d7bd1f2d73fef9629ccff7f6285e9c6c7ea3b8a88bcc337f3625c08e88c08cb8d163fe5422f8795d8ba457dfdf4d35efb58d223a3c0c22183ccd09d6087ee8ee04829a586d7378be3d1506a0b4e40ae47c0b90d091fedc425435c243d91eb4e7dd9373b897f28ffb4d9c94e73d9573f11ec9850a4216daa3f8eaba769f02792ce9110ae356f8279b29a57311dde4198c2a216f55a106a5b3b76632dcbecc9e23a385d0671ee6c8145dca31cf1a42541c3abdb0215320b5e7fc32dbf4bcffac62995c54b24450ea0d5665516d7752cc37bcf9082bcd1793a753db064d1dfe1c70371f18638bd915dca011428b7977da551d5dd7a3733dc7a83ab95244566a76c319488bf949c1d418d7588597953426faf8769f46ea05ba313d783078faa733e19c633fc202ad9d3848a5ab105f1a0aafcabddf749621e3f8c87231698f46ec424cf9a47c4b1ee9b1807323843b9c1dd9f0ae08cb0c04ed556841d58468bbf86ba7664a768778421b1b6b7f71cf3cd90026c1bba8b0113eed99618d682b9900c44843a25f4c5c1eeb85d92f576e6eb4b8c993589c26e94117c84bc9635c406df28c2c3c750e3d08993c56b3a3bdb4497a558d7013d4ffac6aa18b2a245f54b86d0f5a8976519d77aacb6e8cf511a00fbb572a92be4ec6c96c818a2029c948789a2e8909d19afff4a6af8b4bba2eb460024b0520ea08c13073f4d33bc20e9e171086224e055ec6f803452750614963e2c5bd87bb2577817a3777f0edabb3b82c4692a0c68021a50a4748dd4b99162120ac0b2cb20f2f99ff2d876db6354d4920d2d09ef3d067fc93e917178db0099e71fbc08eb5f5a55d37bcbf94160d2fa38d1bbc775684b6303d7f3c60a744881e8f5b8a0827775d4dcc6b6d2e8d81ff69c9a7d2c47f0b71025f60254318d53623a131a4339712dc0e25b02c779d32210e7efdaff0ddd34cd582426e3962c088608014bb9b854695f0cc318a19c5ac38f41593a0a6e37a9e1c4e8c73ae05c4f347848b4caa62811fb83855e27f873eabdd15f05131307fd9590ca4d22b82210b3b26fbc3eacf60cda6f293e2336297fe0c089a4e3a4551a31e5522063c688334cdffecadc71c54444f7371f5bfd816a41355f7d42c827e7fdea09a8c5b195a147277d486d9e9da08343386999f6859328596af9f827874c40c8764d10225140ecb1759db9da8608de7cb483a3c93ce3dc543180cc6a7c3144a622780bc0c5f982a66e3188ce89649cca31d7411dae40a74d3c7b87390e7e4fad938f7f34f8b5532dee6ca221ad9c065439cc3d9ae493cf6c1450f13b461baa0453fc3425f25aa56f7fb6cf7cfb99644353ca5ee9e5c59ddb4069d2192bf19dd5ea25f23cbcd1c194a877d6877941febe08396bb2b9bc59bf482cf27bc6e66f45de7481215d03efc3f21780e9317d1beede822d9c69624b43b50319071de36a7eb94fa87bddd77724e3fe954b2b3604fb5f0b6c50fc9ebb8c0e550e683bd1d4a8022030f24534a0e00594dd546e52020c133def767a57f0c5db8a9a442596f6ea424ee22f9c04b31fe0421fad02bb5b49818080b5ec773314a50a8544e51c186d004184daea2ef808fa6e25fdef5757db313de5b559e5cca1f23c970f81498259c461de9b389ab7c4dd82b5ed3d1040eaabdae71fc98903954d8a974e04077bd51716ba188d30387a11e49825f5cc5c9d78c14e9b444b1f183b5b4fa8733d4c097fc8defcf1d8c2531cfe964c1f75f51d1f58e2d0d3136a51461885c6d8d33e1e86df13ed6c7a9f778836760ac1f2519228096b677dc92a69f527024f3ab0973cb4c3219307fe150dddf60209e52bb8231c3bb0074b55a888d0f18eeca2be9f8a90dcd098c94c6d3ea1a500ee920874f881557a59439f2cd460def04517e4a031a293e8a1bb4cef315eaa3964d171cc3ae2c191057090fe782c57f201a10ae059724e3059e3e7e20f9b6f7511a94e0711c4e6bdb2d70e659abdc25ac84818a828897671654b0390ffe15b7b9d22876ea4b12cc6088202ab639988f14415f740c96e747370fb893f2ab7d615b14404491c30fb73b1785516fa4a127f1b0f8df062a9aefe20f96238b7a54809f518aee0a0cabb8d52c1edef8758c7ccf53fc3001cc38eda1d4f74c3cf33192010a56b7a5905d4dc9666b47d34490e9f7bab82b71e437bce1005a9279aeab222abf324606f6caf28226e910a27a751c2545db05f91b1dda4a121e8ae3f5179d76d0bc2db0984b239a1e16bdc88f9f7fb295d363e9c961b2277ad189ee7f1d707fff42b314fd746d7b9c72c3c80c86813a2b1fd9c68789f113bb02340b950357908b649aa6aecd4c91229bb72379b0bd26663ecc31ce2d0389433f0dcdef8f9f6315a0290824bc2d8550e00c6d4fa4aff1e7beafae15916612b3d67ba7d718d4622e74029be7d79cc2a7fe3807f6d8c6471ffe188df67d952a7d67021bf4157318265eabf4709626d38834ce7627d3ac708f9b8b63d9381d4b206f35bccf2c17ff9dde8984577e48228222344a2b1baf18a7057cc246576aff1d6d8aecb0c31f7315622fcdf5066d5a16450df6a9275aaa06da612bb6621ab0e4d0763e4151162cfd87f353d1a522c4c52bb00e0a7d3b9f2f78ccf2b1de890b17469c14197c8887e6bea8a88600f50d1f34def2c783de82716f44d9b1334258151e4120719be31e4184842e8a70509d750ecf3778d19fde8d2c3d234ce6e3327ef619c61245b25a9e682a684799c1e066f8156e96fd0c1dc34e2a71dd8fc824a53c9a9753f072b76de80fe855d3c59085af55ea9a5cbfcac4339147fb948da9387027f6bf22a0df3062a9212dc4d8082192e54e0b77176ff08b06082f7b803aa92f6666cc52c91c76868a9547d375c1fb21680b52e29f67e8930d54d1cb6c4367c8ba8a04175809a0c238c73c862b5842f942951905d46d1d09fb909b0a9e7e04dab8c2eed6da116f84184964537535c978f98db68742c9fe5e755dd39f9324f0e3d593e517dbee136acd7e57d1cfd4df3f1167c3bd67190ceeef1f2410d6e2bc72958faf60b9da3ce4acd89f77a7dff4aa1e95c93eadd4d959ed5704f4f631e7e57d18863810705c605b0aa3bba991ca48759a2f71a377e42dd487eec26d8ce3daf0b102045c4ae28c4c66fd2421a490a8bb077f0ce49cbdb9593449efa96e30b1850bbb6c19c48fc6f5901437cc73082953402056cd9da6aadffebf0346606f17de6b0ac5b577848edaf8816ce6a79178d2f6cbe5db056f60dd29b673a0edff5c316188a7dbce81628102bd4a2c9ccce5be7dca30996e5889d547b8d75561522d3281bd98e95406d07c612045faecfb1e7a57b3dd8522f2745cfb4e94d08517d9564e020f6a827567218662e6ddf2dc719b0701333aedddbed896d032bea3a10f11290e71cbe46d7514d4fda34248c18da52e4ad807097ac7dcbcf6475c679e2d07952b76a9e45fb8caef4911c4795ad10d1ff94286104a3dddd02939562b5fb18e24f164712cbc70c837eda8d0eef8da576e84f9449cdc7f5072d18f1869764b395af8f1be08045b714143eef4342c07f89c8662bf09a21ad91797cf3fcc62487da99a74fd10e7c76a8df44aaac384f8852c662541d12b7eec20d46018beb437ef935e849ad1a743288077426127741a6180bca799add939ee412fe85faaeca7f39acd9723c4f36d1fdb356cb3ca79ec325bf26012da4bda73daf2de612b6c071e42602324552c93d4d0b7302f4716fc6bf08ff549f0f3bef160d5a8c9bac2d3e40caecf292ce355cc0385231007dbb972f11dbdab7c51760b6530ddf5d3719cd96c11e18e9698318a0627bc229728a1ebd0045fb3f6f59e167aace471f008d062d33200e13cbba5733b0771b37f8e443b0fec21ffdb407596f3a262cabaf90d14f477b3ad89de203c34bcda6f2b9d2ee5232dcaebb3d2bb2172a9cf6c7eb2b164225b606ff870403965b05c9225a5b07e9c51a103fb1ccd3a7a3b90d3c5c65bd4ff659d95230263ff407a8ee8e868876bede04ad51b9f3a467cc03d9d1ab46aebee2ed1a9741539f27773d7cffe3602319a623edbbfda70d9ece04c35080d6d2d710f9339761900b76d44cdb3d19ebf64145fe394424f0f696d044317f821e0fe2a9058b1a39e76b28465d7210d131d880e21ef7b3d7d64795fb4a8c285a254e26d4998ae8715fa786f4f9ab40b33baf1ca50991d1bd62e8e4769e3d11b0f378ecba3e98c8b000a7d807a7ed946610655eb7496d667f9bc1cb6ac8aa032b91737c827b1d839ed35466a6f0a1d593b8e08e4066f53ac48abb91ff503dc57306291e55d981e1e4df9477fa5b2dcbe13c0af467e68f143535bc805cbf5d21315a801a5bdf2caa2a2d50542b70fa3ef9a3c9d85553a5bd79a6addeaa9d71dd0d9662b7bb1587a617c3714660b770f682f5078132349efe39e577f41070e3c2aec1b63e9e03f89d54abdd93c1b9f7ba253aab382512e29d1df8000ab7c21a98bde364f72b32e85689ed7e8377fdf8548a7b9d455674d962cce93268c71a7e27e105532a8b29c09a5d8f3a60aa0bd98a58c0c5f0eee2eb17efc0f45567017736c32d6d1fe570e631789bfb70816c0425370f0b8115e480822d832d1bbffe6d8f0a66991e6290c4e38318a8fd25a7dfedd172573ff203006d2f3cc700f899c8f85fb5bf6e2a10c078260f294dbe44d4a9cbf09173aec6d39e9df2a94d3a5af03a6a24c858647844b7088766a873cc4a23d091a16570b661dd1eaebb49acca4e1dd2ba9a243951b769d28846586cc6a921865e6f5d615912f45a77e53e77704868407f1e1ad02181562b1bb4a4d2ba586c955ee3a3a93a4fa9fa550f72c2d447e55b7c3c8152730a46bc4695d3cd30c1cca69ae67e6fde7ec6a650212eb67fb45accb8dda3e6ccb9012d13d22e84b14b0861185e38dbcf0911057103ba7bf8f5903a3be7c6b5b6f84e258a53fd20c45eea6de2351717945653c0bf9e5e38c7744f4e0e4433e6b82ff74cb20088c8f262387300516448b5cf537e42d8621675975eb038da32a25bc4c24b93c116a5c2bfbb1a789c6699badadbe8039a0d3c89c88707c1930a11252078ca357ff0dfbcde3b0b54fc67302ce1b1a609cda9d28b6e90fbb255055aa0abe170a1205f9d682580ed9c5bad35934b9e5f5d577c0204f04236120a69a654cdc4e6de8ea9074ffd516956a081d175806abb0522cff27bb8655de9997f1cc8efead4f4af1646f8cf77278cb32b2b5ce8dd64 +0x9dce12e49fae09e0b1a60f44199449fa31b9bb277857a84efb874b0c23118bf8453f8435f47b161c9747e719a642f805bf14c06b6202535e7abacd53e25ab84f +68344 +0xb812e3064c1dac2b9d26def1775b3c204af669e1766f4d88c5efbab139094f8e09a59d7fe63c89e3824bf12f5301933d953b2ae68eb3d9d21574cd8f55921fe1cf17f7599e40f729ffead73710474c70d8d52f5f8891dbfe0068d7cc95eeb51f125239bcfc92bea51bebd632359431631dabc075ed7019b38fb11e8f8285d9f1da3dabcf8998a6fede3637484b4f08be6ba5244f43b75d9ac938eb01a2bf55ff30c095bbccbb77dd50b342a0d9e29a28cbaba51715d06d5bb6e585498005f0f01bc33ea74e63f8e97a4b3e6367b4af4a43a589f2e822119d5ea13691a1bd716da42eefbc95f9f2cb63e475b87e2d0fccde7b190a46151308ca5244fe8f51a11dd2e9f0222be32d2a13672dc8a5b58155a1169d87b6113a4501e1f8bad12748a9addd8900988b71af93bdafba64b4ce8d965c5d91c17e4dfc0b379aedefa92eb83df0027e62578602eacc43b74392be1ec436a04eedc415d4f13a72be713d1af38b0ba2c613b133ca207e30e7cbb719ad338cb0e9c54b5a76bad4c756e04dd5019e17b2fd320041af3ebac071838ca7e5ec47d388ce7ce38a6eece3ddc440288c7efa7a4e48ac795b4b67397ef377306bf64d525492bd7ab7166a0c7aa37ed839349e42dfdc1da0734f6fe435a4e17bea598875749877e5a5b8358b55076fb0b2c7e952d876ba81a253b909bf1d3351081edf83106813edfd5f37a897777b779f3fc5f1629fede38e5d2df043e6d37a6d4c39c6528bf75a671057aa687c0af4a7a51969a5dd1e8ddf78b3e0ea882bbec2eb808460888df48ad57ddbef9d84f07300cd00c8bbb3483ea93323dc8aa1e5af049b0662e73c830fb5918155625133ab58c8fff3be15dc53fa95ff40749fb6db9d729481316bce9db97ce5c153d985f6b5f4ae5070ac11c572c1bd3ecf8cfaefc1ed75e4ed849edde7244f5cf984aefc2038540458e0af3c19a0a40022d0799275f4f3b5a3eebb774972064edbbb7566a07c3a3afe1a7d62f818feabf5d3fb6dc36f5419db11ed12e74e54be81e4a4dc3ea8a918ebc044dc1612116ad1fc4828b246e13a1e55fc56c7a17fd47469010501a5e7c6a63ccc557c7727633cb5276a4a61e240f322afedf351d0ba3bb0558af1593c6db7f4dd73302d86bec06662db94a89f53e3e0cf7c73488f955e23671216adf235a7523fde3c1e76a4e575bf2497045f9975f724ae4d6c04906628014679895045fdbcb93fa730413d324b07ed5c5b6c3d31cf76288ba777d0da29e9ce21d69dc6419c153e7a4d2eb02f5001dde9970c659fd08d9535e02f80428de851167a22dffc591982bc5c842664ec779d489e883a4863319b51ff75c627bcc678615f27b9b55b8eb475458cc65a882fd5815a28e3b3ee29e2e9eb91ca0f1e4bea096bf37bf40a3b7baef08eb9988af32c9ab1338868db3e13048ecbb5851b3f4f1688d04e41ceea806e45d126a65c894a9d8df353f09038d6abcf6aaf0e1b6951919d045a250f616bbd2c9f360d64b9d891d5ae6ad277dfd2e596b8df348692968192d8c6273569e3a38d3e10540c4d7e7f71adf596f6fab0bacbfb6e7ec482c6ee4f94bbd0a8ca902950f7de03bb0be36e48381dc577531732577c84743d018ae0bb8060a6d04c1b565d12c5a3d8bdb066449609e661b0b0562083479f59d78a60c0e4de3316b72c339cd7efbbcd298c704c11e3811cda232d0f58e28681cb6d7545075cffe0d26ac6f58e84d30118209249efd01e109917bf0c427bb21ba7db283332039097667e19517eab73dc5114d62179fa46a5b43515008a3ba991317e8070adfb70a43b0f3496f08d24c69e0f44bdf7898043f52436d17949f54932fb85e5c06b276d19c61dae2c526d27c5b9e305b1a55552228c2a6955ce1dad71fd3f7ab37b3b5cc84bde7f7a21d7678fbbbbe1ee744c3a0417faae66f1aa23b82ab718cd5536d80f457ff32222e9eec4bdd43af821ed63636bad8af6db2315cd2af4a5571ea048b85d06f16b7f2b252c6637f615d2c03507304be44bb310ea79a6fe0a9901ff16893a7d609f5d25728e5febff8eb04e19b70fdda3aea2fa0a8446de30db24dda94b85eb2a04e7603eb44ff83babe21e753daf6ab167d068ddb6b19bfe65afc169c5e55936e24263f264df6794b390b8b25fbafaf5be64e2cbd7903d5b7ecb34bec103ce6c8399b6f467b73ff1f0e4a539e6d59657fb86f03cae8acd3170a0bd10058652b42e12e2ae857e8839a8046c7199aa44bf65601b98044851678155e4c75b17edf62ad56e8685dd4a56241895c142e10e154517ea47a171d4e5fa12314b895ea81ac00be2e6317b8e2fac49a993a722fc41e3d6e6b14dae5b9323012d0557028a0838dcc7354f015bac87be2f4e9214152c87c3953ed0a7f05943475f5b8fac9ca9da6fa3dba816bab5ffa1af59c95f61bc79068157f1039a1fa30f4fb6f703e5e3eded01400463b2325a17b11e14ace8da00c83262796b62cd8c7f867f59b06d9fbb7d66cc2b8f4b0be14abe043da3b36f66312fc931864e4b44bf8b1c7b5a3cc68a485ce7e4438d29dc625d730aebc961f16800f2defd698113f8e6f725aa5b3ea3766af9f8278172938617d3452d329aea962d474b77b857435220762147d1f14e2e196a30e22ecf4ddf738db410f70099e23e2e3f9d45b61bf4c00336dba6c5d398efa2521d9d285495f907203d1f7d4575bc1181171784e2074e052b0be2a479dd7609267fd466eecf31aa505bb2f837762f57da8c36abe1b253e4c9818e758925360776b1dd6f64b5a4de0e13b958b80e1d6812a4ab11601e5607d8e5b2204b97b605085ac02dfe71d90c200d3a870e6510acf1087da0a672dfd820de548c075c7e69a52383870328589a4ff0406c81a28f8b3f60b43efdd776be68157ea3059b169d15b43064bd05aaf26364d0ef5bee236dc35359d5ab75a4217a32374c8c7d070720b4ceae722d567a2413f4f8e27052ba468a724cf973f0691cdc886fe62ad7118ecc664c6bcbe49c5aa2b36f6051a7da90ad0a8b2ffae3ff17bb77f559c9112226a3ff26f005ddbfccbc163c1bb8a7356963267a9531034932780fc42e833aa1b1e2a1244803c84a430723485ccedc339954d0017341dbb037bb55c5ad7fdcf8f830542ebdee2da7872be4796abacd3de7290f081051f09dec2b53e01de67e8ec036212c95ee943d60d161b88fa502b91c8aec77b58acc761b7110fec8dfa9cbd49b0f06192a867496a1a1ee11b70411001e6d36aa14f6a48a359405f493e417fb0827a491cb8ab4f042ac0139175aab5b8e9d2d3716f690021ee8dfea29b7dafc2570ee45f82965375d8adb4fee8cf1f5818145a4b855a14ad41372f2caaa7ca099f2cd7cdaeaef339944629b63234996a0236438249a3e2c001da8539e4665af0db527809955bbac9fe080649fa61d05938a733c7f4dd16e4a0f6757cc12fef128c2e6975cf22f6a16691cf4ca9dd40b01be5bf8f4f6c1d959f099447d97ad2d9320f00a4b4ab434a7e41d910b90d67093c802b4a81e7635d6c82563d85bdb2df5d72f2190e4b3d4fa5b6d848a088bfcf0af52b8c64c584a689ff3fc06e8f1b7f7f0892350489210b6d5f315708d5b76c07b324b7409cfdfb87eeb572ec655944172e85ab6ffbbb1835b978be5a5aea8ad3489b7dadc43be6d6cf5bb797b718c7a65330ce790947f0bf4413010daec585de34142224d1cad3072f9720f91ac664ad152820e838741f3a8d94a1ab37d4f7890413571e4c275a997dfc217906dec5bbf2c045161fac1e67f47222ab8c955a74171d8f22a9dde7fe38ff4b9fe1ee45236abd9d8b157c58a827300697239329200b972caa615af5b5ef14f1f652617da3fb64bccfb051687b8462bff6833ade0d4014d24e193b2e411ee1d6e4ced4d99e135a055c86c7c862aa6ed1322208f39c631af26617dadc3036ca4d13cdb4d372411219a9ef4be2fde7c8ccd2969a047dc31e1f8b03d699f3c542e6ebc58e15d103016c40805a629deb151560474a8af20e92bc35639ae21c58f016d54cccfb3ae7bc7fa8b07fa1d322b84d63bab6f1c9a42d4afd9db43f1a50465f78c9fe0e005da7b65b16283b2e0d46d745775bc34512226e3c38af2b6e49aa434ed39dc8d1d367c2d017e0991f2935459df39599f4d7367889bad81188b3b054bfe028b61ff75107903c454616f4f80ad5b610c06961be0c5eaaeb9c1a1cecf644763b505b2818071409a2bcb60f23a9754549e113504d9c337f462562e3a4ba951c221203e40143f3f695777cc63ca3f517ad767311499a90ae744823b69c140a388985bac9c1308889aa10cbb8a78ceda3b7eb192356aa0ebef26ebce427851c61ee25e037cc7f7a493ce33364f8c6c77ff5d96604e92d06374d239f2adba0540eac7d04bc776311abea993439a4d40b12e3abfa4465a60f9de0e15ac92cd839b560f598d6769e17282f9d5ed5304730f30ded366070a793695a32706d9faf45ec981a2d043e82d354685a03962f92c1a6d117bac78ea42a1015916076b898012abe6531c433a3dea74169d31af7494584e9a5f808142e4c28bf78ab72ec24e3e630614794fa93a19737473dc23bdd353394326e90a59862199472d1f0bed876a5ba98bf04f7b4c4bab67cb42a41b109397d279f0fb785147950fa446ea51521ffa9763882bf99a0684b74d6c1bd8749ed110ff9b3ce76dbbe5189a35b437d8e3a897424acb6b4dd5662ba061713a26fe4dc561f4b6ee0105f32ab5f24fe74141cd73d13c18198c3db98d6d298c8a4e3b75b946034fd535ae250d9d87a5a9b4bed1f1b768f84a80c8e5a35bcd560f16dbb0b357cff0e3323de588fbfb9dc559e41dda9cd6544851fd52361354b613a468657d3c608261203a9a6477571e82593a17f52a8d15592664680d3cc693dc206afedd9cbeeb97272dab69b8a2122adc48280c079521c6278690f27f2cd7b3b367e29c1ff215cd6d9f825f67e460030997b8e5dbf662d77eea30ab848d69e085e979826e03e64b1d18860e2b26f05609ae304a4fb8bfd35019b201f2f131abbd772b5631f948585d1e1f3ead6faa6a0415f6010ae41f04c8997cbc7260175c839a60e20fdc223e553bb5b695c77689215574d2b5826cb00bf4f8a4abe3033a01d880ecb1b55b432ff6b03f8a363cf988f51187f8988d2044b18c804681dd8e5cbcf33dbf8bddb010d779a134c5e403627d34e67a306a9c9959a21aea438da0bfcb219de0678fcd226776a43c7b56efd77647b9e451eb6b3273a138402ffbb8508f73d3bc5059e18d2d100f4a617a050e67b1c6dd04f8d73887f1a3ef50101e378f4fa9fc4e233679b2afac057d388d30d8dad60e507926d31efa23a0abb2199d531ee54869d5120d7cbc4116d979ce64512ab01f3d56a12abf2380fb4acaf3aa64495047aa58be71159d97247d2311d35b091eb7d3779066f2d681a73441f2854936b2a2189282ce05bc76d86f209ea47ddfe67e1bc43bae3f7bef4d71fd5f578a4fd301bc6ca54cd280a6dab956bd004014d11e1c26e92b2f7892940ae88247b0fb7a0a9cce71120650eed163afb60f2b10a73cde83e4054936322506e9a27e42a17168c2a12c49289617667312d0f8c63b30836ac57263151d97a76de70823c8ab7ec136cb1f18c1b9ea40f36654e499fe3398c7d2dc6d1c9688c347ccfd5fca806abefe3692a858212c08ea958afa2dbf7a26fd946a4de507cf219d7fc75ad188fc0624c8cc207536a8656186ba6309e7cbd315f16328f9d9326876e8ae3b642bfe42b06b17a9a15f25005f212c46b5dfef4716d31129de757a41dbeffc2b0cd13619a806b96b62076a80ec4e28ccba0eae2b0821ba751e416f53d37cf75150e26e341681fb8d4393408e10f5f51d9fdbcf27f4c3a73741a7d8476677e9d6b8c66c3a01c42538c96c6fd2d4fedc60ecb01ce2e1a02095cd0e7ec49cc818e1cce5f9d472b67f937efabff33f5125be2af45b05d7a26cb74cde2a737e57cd9b15a8dcaa704151c7e9a5f89a5ad7185ee00e5537deb0d5c6457ea2fb130c4f2b1a75df63034ce2fb92d6e16e2c76fc699668d221ffb2a1ea4158ae0664d0e8ba63b5c8a733c07b5802f34318bd171b06d4699a6b4191194ac7d318397789de7079d1602009836406c066e63f15a3bb5e237974bcad33850f5f57a73e56217a74e32f6f748c7ee52c5495928c3d0025980a0029bc49812d60914c22bd097e04ef2939bd4bc59946f247ea0fa63c18a1dd126682141f635866e61b525d968ac408d456114ebabdce8120cb24371ad17655c114446c37c25049e52affc7072b01e86bed342475d0c60167a29be4df15ee27a2703a6b97845b3017e2f0a3644b05b67668ef76febb769aa5d63a5794cb4f7c3ae32bba4993c24302abef98b3d1169b7e2e08ec5b67267260cfca3841dbe27b13d6de0155d5cdac30eec24efea57dbf0aa7472d96bb1eb423f5122eec2cef4db4af1ce7c134c3902911326e4caf8249a23b76e2b79ea58673b0dce29fa8be19a5d8ad149797ee1a737e07a0a6d76c62ce525bb2c4fa0510da68eefc613696086fb75931dfe5946f989b098b130585311754c046c7b6847bdf8511233bbec14299b6e8e69f08feba20d200d89b2113df04a96b45c7ba6bef0b6f0dff332985eeab3b21dae1e77421918ab32e46135f931eb92458cdee0293e48eaa39545d2b342db0cdb6ac6a3dcc752aeb361dc3b176ebedb527e03a9090f44bb079a343fa3da87cb4210979a3e4531c7098271951b0f5abe55908865f0ec30ce6662ac33c31a4079ec4fefcec91b4c70afb6cfe8668c45c7b974dbab534d73a15a9f0c63738a7b9534696db61fa1f938107f55899c6de694088b8bedb2aba3e05eafd3235783bfa9a51d6fe4a481ce89c65c911d2f3cd38fcd5507a1919f47e7ed05af17c1ce7323d8ac84eefa2332e24bdf00f7917193376251ed6b6290b6448030ee9544a34c9029b73b19731edcde2b6733cd65948c1782128bbfc8189572a2c2104072aa827b22cdf108c1dd12d9bf9597e31e2e449c871780f314af6beeef39c28dce6cdb415e41554148d68b71a2eaabfd1da75352fbc16bc9eabd8035aff863f1aa32bd9f26c1c6378a938d126fc6fe6ff6881ec75aa08a88bcdb98d37f9e7300a8c48fc126bfc27009bcbe4860bafdb03b492d662e458bd3fd720c44c88c7e3f4c6ae873e8abe87f388a9590304728625e72f5bbe120ee104f2961063552f40207ce5e03c71696a9b9b5896658fc0cfad29e1e350dc30fe2046a2d94207262fd5d47371d4c705ba3ef962057453a29ee2a12ed6e1e8c8fbdcfacc87b247b5985cf6e2a0d0359b5e25cd4f0df7f91fdb0d78a19c39e1ddc080379c827bbde363fd0bbad7f762313e983da515b828406e76d5bf9d206d783554249b336510b878003b817d10f7d242de71ee877d890c3f65e112425e34a042a0ea500038e93cbfadadc1f9e49b83524192b1ca0fc48b3622c421f1badf5dcfabb04352bbef78214c8a01b53bf74e5607c877463680c53cf4a57413fe16b7c4be9ffd92b7cb738424f9ca18dcb23a36793ac763b965c33725ac9411f080b70921df0526f52435d27e23a38a91754fdadf112989621c8c11fb03085159c664861c97e3783aa3c7f1a230147320e8962a81742520f74d28b0bfcf583d0090c724f7ef20ee51f030cbd847a53c52b2160fa68c449041a0a0feb83b0d3caf85e6c9f91043f201b278466890df4bef7cd86f98810d4108bbfbe1306caeb52c4dcb5e6b22d4eb1191a84c99344909bfede2349d7a099c144941436d8dc31240917ecc954c5c414a37c7c4b55b6cde89ae3e44fe9fbe072cf07a0bb8c4d4bab3f905f9bfb7625b7449dd95022cce331766f4890319b6eb1a58af2159396a154d2c6acf318b6ea35772f3a9c9d0f96e2fbe0ae9f31079b1a42ae86d98160c8bd6d3b53532ef0880ba580fe7516f75f99a5e8a4e18ab8dbf930e2bd6bd8043841595ec120c0bb95a66a33c37e42fc83a20ed7b9fb8137c7faeab82470fa19668d31b19500508089a24fc7f81c83b7c9b8814e6c41c70ce57bfaaf4a5d7a18d9fd80c43d6660e7ea6ba0be2ad46b919829c7ad2a48ce909b18cb289d95ea8b091ec11738c7744a1e7f0776ca4a6d2255922c847294fa6b7f4df6c4acbe9dd88a7d7d2b05a7fd3fcc590e8254c30ad2a87e3a54e3aafd05f887e803e63c3689c4760f60228c8e314a96008168e2c73af74a7baedbff28f8ad531956e8a337274da512671de989b73f92a7c4653e14b3d8836ae2ea1610abf43c253e026802399c9700906643823a01fb4efbd81985e5b2b572a19c6446a863af7649e20f3a2927b8648c8a2f0a42381c707840199d391c5d4d6b517e3d667229a6db061d418e7575a8ac081074685892a6ca2bc2cd367be73590a7c8577eb6371191cd06bac21c7b678f4e7c7304d9da7c71f999986667efd5c20de74759965450dec54ff87c73160b96ebd768b032704c0047f2713156d39860023f6f7fa90ddf428d7d9d061ff21f636ec5d7e2f8e0afe58581fa3fcf4f180b1355425944d0374d64042b07898c1d7525bc4325a3a812a230bc95da479ebf13bfad628f2027d350077804f93640803ccf1f2ce0b9331eb6e806d6a9466f082a75cc328991914e0ad63dbd43acbbe23ac98317bcb01e1ea409f53f15421c8dbfc42654c13f8901de6ee9d67f535aadef837c76121ec5bcfa150c31b6d143ba3429302bde609b993b2ff0c324d0a95ddbab5fda795bc6541997b041066a511828139e3a39db257eb197f725ac9b247c8f9fc1b76afd9c8e831085ff7c73e1122c21b5025bd5d31cd2354150af2968846bef369f5f8ab4c6d70df1cf8194605280c21906bd07110dfd9673e684e1c20ff10822f4df79bb8785fe8833de325b33f6833ed9e5e56bccc42a0349c67add69cf791b4a5340fd6b0040cdbebad42e30ddd39ade6ed73fd3a66e741cfc5b273c57b08412638706cbe69316e2d00075f3a731b196a07329bd24e25ab29ee91c021a5cf1ef78a2743499640822962dbee6f32c1795333fa5d3b0140bbd16cb482597ccf9342b39a23fa912260075e265754231415c8fa340c1d8722b9f0c781841408eee82c3933d37964bd50f0795163904dfa34f2e2467022e9b1edad85628dfb521564dfa6591d6d17fb990c3dc2daccb95c20f9759951f02ed79e3130be64b6612d50838173c77fb0c3858231e284af6d231f043b95772f5e7b16a34ffcd2ec3e1cf43f53eb9a5639fc5a7bdd1928e273357a3bbba2aa8882859b2c6b869f45efcc983ca3285e9bb990611ecad0900cd37c79c77d29b1a2a1dc76f40bc3936b7e2384a2f992dbf53966e2947f6d82d693df63d009905527c36aef22b71b7503f20bff98dd91d80dc0662504845ac7e7bd45827de8415ebcf0164ddff8f60fb8546b5346d88d1f8a5678719762fd27e958981cf7a1a2940b31c8da5254bc272fab2ac6d571ee761503841074a0c069816dbf7a66bc1dbebc8d68dca455d58613ff32a16d311ca656d07248c5c60a575903a2e4f1c119a6770ddf9cfc83aaf40a596a2c359f8077f4c42a62af5d42b7192229a1c039fe12e3b813628365a139bcc0baae564380b098e895a55cecd25269d23cfbfcac33cba896ed766083231cd33c0a71f8a5851be942995bf4fb21f0ef1cc338cda022996faf551fbc659966f4d542bb414ef87e90dd1fca9e1297595607a6a15a9f3243e00c34a6bf9469dfc9944bd55cc53fa234be103c83ba9c54449ccd7ecc30cb93a2b470539097fd4ffa800b076f92c44f7eef52f7cb7a98aa62e220174adc554f5eaff36e58f6bb7e2fa16b98a33eed4c1577cf449ddbf32357e188b3fd293840bb06a33f3e3a0d340f0053d21f502463a35e6d6a21641587cba1eb9c0da1dd2e62c06a0e6bea5a3842a4acfb0c50d05acdac16b3819d679e682b3318a1ccaae1fae52f22078e095371965c5c91c658fa3d6ab165e20e4f30d3864670e13108202c7edac439ae844d44dc4d3dd73b260b9ba026c96f403604b7ba0eecf65860b4a091523c29d332ee628065e60537a1558e545d274dba85e3bad071d308c91866fd2981d200847bfd74898e9e4440319fbf903dc7a704a29584cf596f3e0d9afceb4b4ecee64ac7442100afaebce03eb3d65bb0f0a3a7f7e2bebfad06c1ab4c3e1401a17702ac7e8912ecb05e949e30577abe9eeb692aea9210a855e1b92b98f61d5262167d320895ee5578f6f502705453bfed012215e56c219338484d16e5eab14779f37e64ce305e44f1be069564720a698677f6f14f399a874082a5f29ae376e6cf562ecb36210abf02fef0de757847c151980c4490c1228d54d9ea4a21a914394a87b5eea93299d193fdda660b30b1d136ab8d9910cc62ac5c9344a3e1043448d3cd3a559029b47f8d04edb38f60f1a01ef7a075362202ec41f9da8742bc7e195372e58951cf02d3d65b504f67d1af36efc56e626c8aa955e953d57dac9899b7b0bcdf1156ec2cd4574a2cc2fd4b929c935d1fe71acefff03de95c0e87622e27d4f450750548d98af819a992b89642d9f007da8da6b4aec4250298c03be0e472a561603ec8aab2fea20fee49ff7968f5f00bc7da79055bd98ae8b11e30db64a10d4d35f306dc5e373b75246e3cbdacf97ab00f58fb88b03852e1ceadcf1a55bcf3fefa1c26a4863dac93728ad62ab5ec7540da8f940755e8673617f77e6760c93ebdd54292cbd219deb1012435882cd6cb014f06ad48f2f1af2fb583a6882dd2d8d2eeecb119e9d2b817f9c4c19fb8bf633c9745ac152e5c1413d0d9b04663dea8856ea2eb557470210d81f3e23702b02538d9d4fb34b1307d2c8f820269aaf6961e7deca8491afc03dac1370017b1b0f93f3e3c006d2475d1c01b0506b9ac218ae4425350bb847d45c7e21b83086ec8c797ee04258a2f34fa189cea23fe0e676c20e65e4b745afbcf1c0c24d3d2e1ff778910b4d1517974df7c39bac0ff7bd0241b9096023c437f892166dc583db15df15dcdd46b8cab3d68331afc478599659b1a6981dbdae70f5b1d19ca7a1187ea1d5b4ced5d016c977d8768381f58102db76899a93f18efb62d5a4c76a2150aafe4cbb6860e79658b06be4bf6b0408930614c479697bc0379e71e28693612e3b32cf43228e6bb3e20eb21eabf6205ac77820d9cce498fca6271b2d52aa0d0b9fedf1fe95a4d919e5f14f86e1a9d6e200900f4bfdbbf59ed78b35e7a4146173599e39402a4abc12d4e6a8bfe90c9448eefc549d8455fe213c39569403792afff8b229ba68e681494f8d321c3a84e4f9d2fb754119293f1e54c001d4e93ea5fbedc827cfda1ec527b623804e5ea9457f6d3c05c904cc2500b1adac0cdddb8f01a95ed7e2e64a0438996827a8bde042440e2c7ab7dfa53c52c350d9be49e632bbdbd4aea6260eaae679b97ccdd0d047d2465b3870125b019f0a67ff6bc5c53d54c5c8108c01b335dbd79614204fefd2c4a636e394454401401741a197ca2f0b9727b7920711fe4163238c723283958f759e4df086d0f6b7d04a7c44b4df5a29ed5201c7a9cf463a26ee1b0b970477ba7faf1ee3ea4df991ea44867d557dfd14b1d56515e6a201ac91a7c064a05afd004d4908322134a32bd875eeaffc1e7e589f3220013032d6f52de0fb01f0ff9bdd590cc86fbdfda9e2355f13511b4964620ff8e11e28ea3cc0761a49680b5aeace4d5aadf1233174618b70a305357725cd8e8a16d13330898ae4c42a0b41f5504f74c3477af3588906354afc30dd30590795663faee1ce63b1046f2b60576762dd79c7134190db5e5ced6ebd6864fd748caf3dda1ba6ec41df5f8bbc0b9e2998f4c6e69ff9ae426ae1fe2c35107f46eed9464164bc1542ba62509a5a6198a47921d6a25c178e264511f23411cd8e954e89f5416de49f4a23e6722b8506d97079e1437ac60fc2ef638963e6c1f4157119fb369e6449b76b14d84ebfda6fd30621bf77e06c66ef164c94cde4c438a662b7c984b8d63ff03e03b450b7b91107edf718fe63cd91652376e08 +0xe95fda82d0384a00d1aaf90744ec582cdbbe31f5c6b2ea26b963ff633c7224340fc4423203a8972fe7d90c2a2342cdb8fbe73e0ab036a29b81d08d859978281f +69136 +0x3a2a624bcfb908a61b03e422b256dd9e4d9e0475273319f5a6f551133e9b565c9348902fdd5fa32a919939e23e5501d7b42ff8a76cd3e78124142cddca38be6a9b966c488c646578e9cafd913c3aaeb470045dc13625dfcba860bcca2c9133909c3d7effa46d57786bbdba9675b0ed1dc846be2d4dd10cbc7a0488432e4dbdb6dc654ebaec257f135e9bf75bb15dc5fa031da052797e733ae12619ae961464c4a43465e22d31e72f0c8b3d47b7e93e336ab08d9882d41e2e27eff5742d9031a33cd54ae02f3c97b5bbb613c251fd60b045280c672f7d14819286a6febb672b39ec6e851abaec958eb44301344541345adcaca627491e5d196b13b4b308415b6ffc289ffa96e9eba03f5b8f055c5cc1177665e140986202e0f9c0a5fadbc7c72eb32a1fe78adca1d5a326469e5ef70fd05c7b481be4ee0abd86b3033dfea0795c5b9d8d49606dbd142acbad6513b9276ed715601ef56d7d97581455e3377579e23aa87287de4349441a734dc3434b10d72d5bb3b293856358b80c24544feecda99874540bcd074c4fbc45ac21b554d2f5a676c84085dec5e7eec3f7f70eb27f98bf28be3cf460cf1c586a54e5327d76ae8c8e272e9421aa2c426056363b6a9796f6ed35821df7d9933609cd79826e03ec25ca59e588f61b0ffc0bc978a0bd1b8d84eb43450e73729c9d4b9d436dce8196bb53e5ce29041f7863eed92603541564b2496fed907ea21fd7584eadbb45f994945153503ef4be4fc02e0da62dd68c03c83041e26bbd72042a57681d337d72cef8eb2cd2916d007c5bf6ee61e6ec89520ec7428d67dae933df7071fd9e1bf42b3149f6bee818eee77c6c03bff53e1338cb37f9544c7d10953dcdf3b4c4ca879686943c7b0c9d8f796bb8d429247332a049a7efa0e14ded108e9375aa6d3034f43ef48371c5a3ec186f03e9053934ee6fce40aadaeff38b8d18ed804761f5022ea2905508dad20badd275cbbcfd28508ea329b4683e16eff525019bf367c2fa2cfa9139a815d4f621da3501b738f85fe5108b95b4965f232efbf74e16493f22d68e1eb8b93c4eb55ad06c135db24b245c5c8ed324bf762e22e2f82118cd138414a56059a318eb4e42fc418a1532caa5dcd159f822800218b7242c9d61bce628cf887fa4ce7150cbc0a5ddec49821dec4bb5158c15a3ace9d708ba4959dd6214ed80a221a30f2833bb1467c46068eb019351e91565ee1baa69d5caad69fa2d5258d3f15988b9198f1d920897c2addcea9aedfe1d792af76355d48652f7d9efeaf6c995d3e639cbe6cd65e8efd61999b14ad17c2bbb1fea1a834d14bf6d4351e2b1acb6172655e840b3d52e530673ca5e89448ac892949ad9db879c7c3100fa4470c27baeaed615a6b72c034cba8517f7418f507a6652afa744cc4712add894181b550d1fe883fc1ec1b08e615815268659fbf7cca022d28da9623c084793c46499ab94f23a2645b3b9abf81a49eca212b9cea743a6caab91ef92a4e669f83432d40c37b00e85986a876368fff5d231a449508769e112e1beffa4a7357ad18c89b3c21ee0cb6a9b4d13210799c48e7b43f1cbc0c5b9c41d19c1e06c7ce2e473721e14720ad99bf963452cfc6f1fea29f7998579df97a606ac1d8e1c4308fa92f3fd495bb6a0e058b406ce70096cace3c829c7db40e182457efcf5de1356da911738aa006d880361493c4d8bf0149d50bf89d90e6f011e8197445edb72334e17e3b87f8ab6f9cabb29d1f274ab808519e3a10339f45d426300df113beb071ccc616310201a5bff0e5cab0554c2172ce63d598d85585fb892c0b35625033b0d5a9822a4eb20166804ebb4ce52be40595ed39abe19226d47b7dfaa75c14435e96690de84135092ce43ddd294972665d629af4ae01edaf1b67a66abb538355e789b527df9bf3237f8733aefa14b82ed69f0d95339bb0952ce825c9d60b25e1e819ee5e949174f6eb03d0bf23b945b40db5b579b121936f85778c96abc5648dece1a5108bc442e9dbc4957c3ab9d37c6f311330cb25fe94b1903b5f9124d7a0425b59fc49c6e572ee53e264a398ca1e77bbb758d63b6aab3dbcc2932a9bf7cfa4f17d6032fbc5387f3c4806f2c8a1e0b390023056b460298677b2cfdcbd3d72614e9feafbf57a912ae856e1acebe389af789475e1336786283b7c742beb112f23bd320af9267e135de26f733655176fc7bfde87fa3af9579f82801e9cb82b5c58e7c42ebf013845a4a5224a23a6a60998d050f5063d8df458d77e2da3a6e4906d38d6f4b238319e8bbaffc4f95327fd9f749c3b99adae02f0c4c72fe539c551fd3adacb772e02847f9e58722bdd15a2580700ca292dc209d3b4eba3b5e35617756850317245239decc9dcd04fc6e7ae3ef23f2f3910726f8e426c17aa260f57624bd7b538200d517fc7fd7db9831657d0d097e94e0827aa9cd7c8fa468469a8404fc1c53d41383595032ac91da43a559a2cbb76dc776a416bff72d9ff80ed709bfeaef0062b2cc0d915f540c0accc2e17610a6678d0b2ca9813fa2559ae1356d1d30fb407306379987add83670f3427b508151687c689bc9ddfdf6ac96e73b18e67649fc50374c66fac53ff554e1af91f9c5c259dab679dd99d9328e33477173e263df1d426c93dcb24e9133fdbe908a3a850123f01c4c4f7e7a5de2ba2a5fe4d9a0c7898fcd956376f1d6d7b4b16eced96914ac06c39e8654897f9073b78ed492d5092a7f83d964105617c9c1e2d0c59e1805de64d3f6eae3ada17fa61785acd6a9abe65cb6e74546245cf16c7a3ed7533bdca05173dde3f28fc9999b71ccd26dc4b7a76c8d4870e103ab37fda1406cbe799fd917cbdad94bd602c59aeeecb01fcf3454f931834ba99d0e83bb7e5feca97b5873fc047534b42b51ebeab66cacb4722bd549ca204065978cbdef3a22bfdae90e554946365cf636c0f4d4f0d430f354a312a47fa8b6df9c2dcde1fc124d196aca6745b8a6bad99e56c6a0c5ada3a51ea4f25478a215dd52fa9bd9edb5fe30a693913a834cb4240c1b4a965c7d6d92773760a0de96c42861fa0f1f35963be54671bb6eceb0b3a1271868fddecff682086241cfd90c2d88723612fafb3a6a02f26ccd2ac25b20169854091f7228a53d792f7e2a908db7c42db48ab4672bf54d518dafb687d4614c06d713424112e48a71a6fff92ca0caa6397e6193a3f0428f0cdb4a5a44a3e00b1aaa70af72141b3398ceac84d4cecef43f9c7de0d411bb8fca5e845e2251031a7cd406ae2eb7b0fe97af6d12b19e2b77e614c8e22516c617341f460948653443d35dbf869d810cb416512beceb984af7d7f028e3bc88cdedf22579a5de67da4cc74e8181e6fc971dbcbdcc5ba944913cb9388729c1ef37daab7903780ee05cfe02ae36e532b0b90032fa3aa5132b690d35f2ccfd5dd16ca60721cecbfe5724212985c5fba824db2620105b1252d43b33f328dfa7b7b8d419b027c0e5d654997de7dc160b71e063582c0819ec8ec76d779ae1a86ff92bd7fb4b92c310bf5f23d9e1ba115db46cbb5c01e95b79ee8d699fd2260e9d48b3dd13836bbe92e1012affc2279e389a5149fa45bb08039bad957345fefc78cfd74e2afdb998b463c116b5302ba5e64b1677fca1860ad0bdaf5bbd99715749b31f920864843bbe6d2850c4d3cf0eadee43ac28bc5348287b1c2243768708581f1311755ed58ef829bd3ef4551ac1d6ab604f483f29aa55fd7b51ce8549f7ed393c333993b379a9bd08490c5b15a6a8abf6ca22d111189e6c5452266dbe0c502921611bad26e41b5191d9d690c6a66d168c847f1b127a4af0308c13d7ee30c8184a01e55136b7940ee157189937a76b14abe526c434b8a2b095675d6be2499f2e407d5d29ecda5d1b7f299b217092eccbda55e1757fbbeed50e4bcbd0a1401b928a3b4cdd4f36bea1f3b927ce77503666a13c76d6fc69768620a027af33fe856db0a5791567b1fec8c66e844856c8910b8802ae8eb2ab81ec55ce37afa16a25e63b21ae783d3467b77faf793815e147e3180f5146aa6a582e343dc479f26b4226b219b1aed8a83f97a6e6cf46ba859f15d8cc27a5ea8c4476455695b42eeb25549df44b6041f3cf8fc37a4e194f9be0c9519ff7547cfa8be9117f74095ed11799851a44367eff5fc85fd3be5adb0a532909f18bfa679d75b11f21272089055e1df0f364d799b2376a0159e7b067bc405a8a2ba940b45c4cf6f7a577a0b76e420769e773ec99f69e9c327491c4fa98ef875cb31ace6a1e56df22712c32f0f60d7f755e381c87b2de86798c833e9c86a7d605f3a64b91cddd9527ef0e7d3d8405af9ec07c106ace3d515e0986c5556eb16f0f511460325027408e86e42aa50174bd6b75076f4a310425695362012e38557b02372eb4548f7c06e09d78e03153a0d164e5a1e230c57a2923d2df9b2ecddb22640cbaf0ff722612a49e9048e863d214127812112271e98613eec43b5e138b8bbf3881bb3be16c8a62f0f509d21951adfc9721a32b1d9763c210db88c4f3addf9a234bbe11c49597a3fb6fccf75d67c5aba8984150b1cde9b69eea2b6a5588457e35e0a08803ea60ed27c63960185a84a5153d929b16d3407902bacb582265e6f2d6070aa986b30ecbdcc1f7143073117444d93f1332f18f93a2131195408cea7e6e8aa47b3538c8c28229af1b8ffa959f9f33efc0ee6ffe8ae8bda529994578aa652f1506f9c0b75c81c6087e1b3737af8c154bab3394b7e83b7f2e1c14d8b8ff23bf0652b89402204160ab44be71202b7545fadbe7aadf3402225576988cd30410011e685cfdd3962bbf3f755ff2779bc18ca558f3f7a1f7a76fc1400fabf14294bf064fcb414f47a5aa6d1ae6006588d8b2f42b40c423b8912b1a82607b393f18bf650fefa8a0ba18ebdd393ae41279227f8e5bb5588dff28210a427345d48502cae4b1ae7cee77ed4836dd45e6a5f607bb1cf039fd0855d418378a3050ea9cbca82b3bf20360078a8a210bee4d4787ef2d45f3b6f9bc40fdd749617fe6a20aac21e1b8a2871ff1597945cd1d631fb5429eb26b1395d04a0b27e9d0484d24593cfdae2da64e52bdc0dc4b2aba6e560768d60b6038196cfb66d0bfdd73ce9910d3033ca4e6a022f4297cda2baeb71306c99df7db0dcdbada769a7293e8b129b8d8fc302449c7b71dfb229bd6df867f38cdbb1ee279f8df6fa44dabf78f3efbd8b5b135b6b90a38c09e9435353623c227ddf7298067e4064256b0111350bd38f8d1e7f1611eb0ce667a9b51509bd5035b5f1ac0babcd755dcf58c4dee147507a194690c2d5e02a096f7fe972df7e56a5bbdec8a9a611af4c4eaa90690c1af915966fe2f226248d7d87d87aed6309b20af5d3530273ef50c829ccfe50241b3fdabaf6d024912ca9ab474fc3f53303f4ddfa9bd59693bafc59f72c6914b7ac9741cd77f2ca956cf12b34426f1aadd191873074cae69419246a2d655b37356391e3646fc564a17a1665c55cd6de52171aaf4e1a9d72e36e4b8132f46f383bc4a228065ac27353b86bf370fb95b0ce38e2bea9e9d7bc004ee427be45ff8829345a9829a564871acc745cddbb161250bb9c2dba6f0422891f80d605f696b78c572dac54ec4600650ab1fa51f7e2a3a803a9751616ad66dc74a414d072bf36d3919ded0eabc18fd117c764844e85c522c59d3d337d2dc978c2b05c7446f396ad782dc2bd407185dd680713cb3b7a076f65e9eea90f2ffafcae581587efbe57687f5fd5f766d072e8601390bd3b39dadc6901f1cd490e5bc68bede871d989e9a31b969f337b58d790b45f53c0ba4fcff84387ff46b7536c64eff44dc890e0cddbd17476f7ea953454c95ce58c5516474189ee5f7bd699bd664efdae02b25d8471357bf5cb50f019a3138ece668837e156b0a7aaf3234bbf292d8c91a69a5aae01cc1fb4143b03f80a278766e5c02f2e963c466a3339d4025c0003813ac5529b1be9c20a69054b300879b9579089667f8e913d05b266dcf74d6b050515dfefec1e232591304c20821c8ea708ed607854be641e060756c13e9bc30395ee268d11871c9cc1107c4e4ec4ead30352d1cf5e94094c0398662b18b5ac81ac2a55b49bf51aaa1270120f067ff2cfcf6759e5fdae155956ec317546298c01b030c9f0ebd6c1d01de5a9fd39cc4aefd5a17566a27afcb8a889353a2775f5f66ab81fbc91aa86914bd7a093593867d5ae87909bfd79440c40e5ddd43d195ef20426b3922dfefd8014cc926c0532bdf3c29048206f277fa6e888b7ee07824b6744e321fc01328b0f113b0be1ae49c1dcba32088e6813f42ae7e84fe2175f2fd88593d764cbe3b3a0b9b9598eb4ec27e2ee036e2078bd660ac79b025adcfe90b84eaf6056de80fbe786be17ddc99844c8e68ac591218239c920177ba2d8ef02a918ac496cc9a8e845f0bfd3594cec9cd12c1ecb5af310e3e859c418748bbeea0d7bf0fef10dc9fd3e9044f88bcf57b4be3755cbe85dc7f8dafd47652a75dcdb67d1440d9e2b42af53ddd413efc14810c280c663b3d235ed238307ee4f17c74b4ab0ebd1cea2c1830851e3a1efb35c3590a0c71f67e0e93564838c105cf20cbe28b37ef80cf4b4fcde650a2f1625f2979b1ffe4b5f1a4075e0575a87ce952ba8742163ecd3a19b8138afae07fd89b9bb6446c29413eeda0359a6e9913e61929edfb3313cad29f3b4c99a45e9006f00156ecdca7620cf147222dabfd906f7e005adc17d44040e4c1be3ad683ec946643a2d0d6c6df03b9e56ce7b53dbc2b8827170d49ebf82bf030b39619b75a290549e219e2ee82cc4c605cef13bf5fc33f866cb751beb73ccc7271d5f462a46dd6fb5eee8887110fb2a23a6e4ded41deab06a002b8b7481b7f6d401ef0ec900ae0425d7851f95573f4914e8bec2e2925d58dfd15053c726f110b6a9993bee7a52b0429dec4ad16a11917df6f77e9e13fc404c919c0b7fce08b323670683e70e9c02b08496a091c41291b364176882fd680544d35728faf18f4ccebc8f4d5f57ba69d43e1c9762efa2d849c2a7272dc8f1263d192a22c53bc54c0d2ccc1eb3c06e54421cd6b5d16742b3c5752f20fb014811b9d57d8f6b077b4f633a156e90f308606ec36d8249a582e2aafe07ec7720dd563f8ad9c558dee1b5656723b3534a190cdea439635834e3b36eefc9e02ec2117222cbc77b1b3cc91c88265f93973020b80651d2ff698fd5c485ad0db28e4f94e427fabf072ebb71e3400a2175c96fb0007a3eb2bd1a30e98483d81bca1233d82aa3aa39000fb57cb8219521d056333764aedd6102d6a28f81edd3acad57194bb42a4cbddc3ab569f9a129d939ea45375308a066871b7f482b383218b2d95a602f2074c6124c559a36436aa028e1f0205a3c4a2ba07501a40ed765e890f591c5ea2a94da4890f0bddc9cca2f23d9de92f8be1d38f56fd413ab5001a4ce4839ed83ad4f72d5b531157af1bace913e5b0face2ac06ec6881177f4677d5a15dcd377a2ce728403571619006cf17178c1fe6f55e792dfbfb734ff90f4ae3d082c6443c3dfe531e7e4c029a2079911d4f77b940860706aa9544fda73efd67d273bf844835178bc71c1b7917f34cb528f50d073cfdc8398ec250d1183a01ca0d9d03883cb6a55ae08b8a4597d3bafba1194a51493a5f2f0f0f313aaaa4ea93085b5cc078474a18f138f2f8786636ed3c28ba17d3a01e6fb1e850cb0ce43a4b595b05bd894b587e5fc0fff2581f630250bfc6db8ae39873fdca59e28d9c536b5708a8dffe5762d3a2a00bd3a553a1c3652b1b1cdd594fc469319711cb21d87ba7e0b0c835dfebb15052a10cfec785b91007014c2995c6e98acaa2e934193be4b27fa7d6ce6975afff554a1eb2df714bb7e023ea1e1d704bb8d207d966e6e04f1d3208bc36787327f624818960001703d332fd872944fe739a043052c21f88032ea46dc8fc7176a1db4cc1cd84ddc97a086be8a3b9c0a3e9a4cdb6f5d42775b99d43218d8f08f2a6153a955bafcd1b06ce179fb06e0513264f8af6231b934bcabf9ade8a6c9379cd4a8a76c43f628e427ab26d4da486beb210e8887b16e77ccf2c27ef4023a56e5fd198d097c21295a5b4b8ebcc0bca29058f52e86e44a88b2f5956fe3f32b3630640f25d36b661c3b8f2b795cbe243c4a92156906d333ae973cdb465d82841da392f335731aae48ae4cb2af5cdf68824056d601af841232a350fdcc0cb62d54660e2b869091dff6dc1948f7632871bc9b2ca0bd2b01d05cfdb861c995970f23a26021e0d3d7e26eec7e551a19a32532829cdb661f525374cefc7105a32d10d17f113b0ae4f3a0f8070341e127576d2b1e2fefc4367d85c23da59447dc8119a824a8e3ce6af000dc55317511354c32f1966c449f168c4d8e733a3158e89a13eebaad80f20ed3e961fd8f5775ea8b5aca13dc42bf6786921f9843b2017080e4ec68a9793f77a645d028a650d4ef1bceffbd0552ecd2743ebed3487e081c3c76ea5723387d4d71fb71fdfcc9f5eb0477d7bb71daedfe5d38b34cd2fd3593d5af30aea324743a3af38ca51b28a1874f3c9c36a8448b954968462c6897527e53790596b1a5ebe40b1569478bd6a06b0304945530f68e3c41b6bf9b93b42584bfbbb337d623acf3eb49500cd23cba3e28b90941935abe9d4b0a65c0dabc784e205d80b899067d10e377881c7ac1b7a9c742412159d6e260724c81c4c51711837e46b54283b727e3f9875a9e0bcc5e53e687851e08d4c42dbb645bcedc2db8cce16099fc1b9c721337610eba0bc778e590701c602abb2aaa303a3b07a86737d15292760fe91e2549a5edec9a0419cd06cae5500e46f3dd82d8b76997b02b5539d8c492a275a50a2c4a143b637d2a255f9ece6751e5e4a55bbbc12ca57ce2d9ad7cde37de489ae7652ebc4540ff6248971313aa508ef649dee241ce5995f58cd445c9abebe963859b59ce50571129fe57319c6134c99193b2542095dc82ca36573b6b36f0e06aac77d433a5d03be70e470151d4241e1d497f1944ca56cbcb9fdd66ad2215b61623a0a6d18cd40504410e8a1b4a49160234ef3a97b4eef95f8e0fcf77b584f2ceb4bfd7924c8bf8e85f55d5e00dca38a81ca8be009dcd93edcc957db239621cfc257c705d2f1c9bfb30c3e88a63d00d77c952ad66cb1b21df22167844f4dabc073f7e77197baf76a67b01cdff95831cd8029610b387ff2c9c553ac9172f115b57ca6ef7b0796e124f0ab68c29ea0aed31901ceece19a13b8c30aa7712313280548ef3f509717ff660a38b2beeac8e08eb3c8b4f9fc92ad6177a0e8a1c4463b46653b67b0cab0aaa3f0f28b4382136f66fcc8b3b0edfc285a5fa0d0b1faecc7ef5e05f90a16e38b75616342eee932b3e2408c6bb03a290d19e79500102b8976669fe953db00430a40b7f58a2f848946871bae1d6665bbd416abf7f74adaae9f42a75008921b31bf9c8143b173e899afcc0a887951f53705e7194416c07ccedb1a00d497cdcc4213ff49b8695a79d6583789b5efe16cfd2ae1cc03ef2fa65c824338d181eca7f69fdf6dde0251dce1c85005b0e1c341a0bbbd10a1f0d6ebfa5d64cbf1478d12b1cbb38a2f2cd8862e888c2b040f45f7b420df93c8cc64920aa4d5169e691da11610221b16397cea2f01625629c908039a02afd1c2c2474d1ff13ac543671ce7a615819d4dc8bd8d65db69138c9f7809d4c9c4373a82fd71acdb0c348ab2193ac444888d105b08e4656f16efc703145ef6eeb3508a7ef5a423caa000deda813f03157d671850ed839044d25743847b977309d3aa5d26de693738bca6aa50e348d500f6c7c05ad9ff98e541c69ca40c37cb83cb910d1b061539bda88287b5ce0cdcaf7b0ba2c96c9cc1d8ebca2cd244a482e501c124bc0b5cbdb20a40f1699fef6c7970bf3a3d040fbd9826de9eafb3821bb5fca73e9a6c8435ce485e71fcd76516e78e6ee1163eacde9b89804c9ce745087f32bfb5269840345ae93783d003026e821a7741f58b18c76b8a3bc11a4e61cb993a7722e11cf52bf07368a193b13bd5d1ab84d75b67c7ea70bf8d96a8676cf79c8a69f27a7937af275d6e45a85095df4ec7f41ba8532eda538fd237e7b0cb0f118904be331b7c10582db4fa9e7fa4fd51e661896cdbd1f97c71c62f28b9006460ecd3e0aba237021b6ad93ae68ccdc2938d399b397045da640bc5d71beea1aa32fc5404547bfce6d98b4781010684a18c3308db6eaefeefa2c44dda11d02342e05e1193ce2732512b059c678e7b6e1c946e4bc4acf661cba131eaa2aafc09b0f178790969227bb378602448df69eeb654957ee154d512d0f7bb18cb57d0d996fed206ffb60c3da05a319bbf84409ae1354f1ebbf6c986a20ee654bea8dcf747610157c15522fc8a48e04f360d9dd73fcf01a7af134241b16f3a2ae70e9f0754b07cc80897353cd3bcf2db46ebe048247a43a6553aedb881813d07ef09956e4175aaf4202c81733f2effac6cafa64231df9b9728ce1a6f84fd4578311a3eb090192258c265b6440f275d5f01b95e79ea676ff6a45d66eb5e2c1a0857c11952b323695249d33203e63e925fb0998743a09a3741425931905fa5f114cd8eb3e94d1ce69d3105835736dd451b03e0af2416f08813ad5229031bf38139fce37cd8a07e2086127d3892836bcc3d45ff34bf9ff2e8ca2fc8bbc8058d30f4806ff2a56fcfbda9689ab06a4e92ce232175c66abe29cff1543d4843ceeb86b0d274a3d40d7a0473adfe89331aca916910b4c2b9e3fda405b5207cfaba87091b7da21ee8fc15ab714d0931715a7bdc7b8e6cb821c3f71b93cd02b8717af82e70ec68b258de1b092ed05b27c9904ef5d704ee1536b0ae8d080654993c62a76d7d99490ca80602a408d2550a905e8c74081eb9786d4c7c7efeeba68db0142d5c7e2eb38c5b1655029bcd97286a17dced9b367f4039f9f977d507790470f1f2521ef748cfe6819abb642c922fbb4eb8b8ece6700b214b9dee26c44c9bf3ae8f14cc9d6935deda3c24de69c67f0885a87c89996c47c7b3e27850ac71c2bc8c6beb038ba55cb872c1d5871fb4a4d63f148f0dd9947471b55f7d0f4ab907302e016b503c8db2e7fdc453dac8dd1fa8ed8586c621b92fd3d27d82af1962e7f305f80c3f4a72c701ddac1665cfb06df51383fa6f0c2ab8429db51fbc831fd379a6a8542d1005077a94f19394cecf1e5f33983044f369cc6279aebac42230584872aab9a637a502d6b62d620430999f2be02aef046206da97f8c2ca327144e4c41c67d3372be3378ab3c7f8208fa06eff8bc48d19f28241778d89e493faee1790e678076c6730142b0049cc6646640c5ea8ed70f20f5cbf75ba7c9065196c5f137353ec92642c372c3e3b6561ff5505adca1e51292306930702034432777029e03573e955bd380f02c01549901503d98161cf941bc8007acff6c676687f7a166bcf608432ecd40a43385fef7d21f0f66df289c06688eac5250b2ead93abea933a839253964d90b7620983cd85909ceab81ed54c85c02600aab1b4602087522ec11491ce1c89eea4e3a6197a45fb783514292acf061832bbc57cf024bb8c414793d4d75a221c5e414ca0996c3acd1363f6b4029e43fb916509df5a61b145288c2756eb9e336f502b018b7c29e08feed5d431e550dbe4d28afc5b5bad9e2c885ae00d46f0ed0d74b0a6c94a19b3be6b2931455b7d3a6e76abf1738c7efebcd142728a61f8ab712c70a0ec8bd230c328cc9240cd79fbe2ee269daa655c4f70a3c15330d51bfb34f7e99457a9e9f448a84e7bd6c3ed7cfcb9a965827eac0ce27055e6a308e158c36799d5bd2ca75ab95a0d5259d73e5a1659a2cd7e1104b37cb77eb15385df4096ebfff96f9cb0f09fcea7ba4c6fe2ffca5e815a0ff4ecdfb9e9ba47c4c47c4f4a058a83f1729d326666ac2840f681fa8338e37fba72caee24a7871e695d3ed13734d7f9d536a2bca7c27900ba1381b6cb6947c2f023356b474163b9d3a89d72f90a56bfad6187ebce629cf83a4f68d12d700ca8637ea2e39c67ee8e764f1ea0f9e68569cc8ba33c54b7865323f2bdc603ddc0b466eda9c39e8b7620d3b948f7d469e27cc50d9b4ad541d3c619b5e701f903026b8d189097b82c98f56e6f92c3f3050c6d296fc683ca81f3a57e017b1167a0203248581dec83bbd590c8ea82b1e03861af6c3abb739f086495e35 +0xa4245a5f76f6228113344929db4ea36401f1b48ecde3714ea7e9f90132f08658457e3b90d935c5e400da23671ab42ca836f0b070609d4dd94480b24531026eff +69928 +0xdde88aca45102cd4960f969e5b94cceed52a3a4ff05f495975262f32817b0b5536453192b080c2563b9b812dc31fe1858c9263b5239b1e3e94679f50dd4af490a3aa0418241922bf6dc1e19bcc0529c589658a5cd1a2d1cdf323d951cf98a4b78addaa638721719793475ef1608ccb35356b5a4de3be888efb25853d3eab435255a7cc7bc3e1da6417f6a13666fef05ef86b788f42346b0a14344a1d14cdf8e96bd01269bea183b060965272c6a1bfc63b2f8f2ad44fa4c8a717d0f83843eb053420233462a99402d6ef19ae68be61f7647d4527835658501a97c0d69258452d185fa8e4954036e3e1c89cf1349cfd79dd1e428d3690b22bd77cc2bf0a532eea7f54488241af90dae9eb86431285bcd20cda2f64d546d7e0448e7dbc887bcdc3d1c8ac154d3fcc6f561e7daceabfc68c5b78b4b547c1f2f7cb949ad4f41a4b4076837ca5a1350f2a902a2935a493422e31c27887764629f9d358c0103676cfe9d74d5f3b25dc8494ffd734e528495841f57e24e24920a46dc3a0987636d782475aeefdddc17b50340cec43c55e29324c11755fcea8958cdb0535ca11dd878ce1682dff965d599e921d3301db2e7bf5d7ec6fd2547bef09cb00dffde611cd143f6ad30d6be1bf94379c7213318186cc6bee34257baa7442c61c65d9ffbbf042eac6a8ce6635f55aaaef7224cf3d93dd8f7f8bff4c1e6d6053c1910863c4393f69e674eb8e4143197380fbdabb4cea50cb073d08cdbd218afb57292f1a12f0334430ff0bebeef1f91bb5d5ddff94d34ea7ee13e90870dae94546f6f92d8f5d46040e11d78622462129f8c7d6a3ff96ffac9cd24a0520dea5b9f7c00ba321c79e30e771f766c68bba25b09a6dad747a8a617a45d2cbb377e5dfd04f1084b278665022e81293c309eb9844164927dac8174eee332a6213ead1403a6aaed829b6c4ed293ed016ff05dd091e0313181bc9d0fc6163fad2268293639edb8da86ecae08e633bdbf664cab700a52972891ec2dbf23c9ee923d68650d0626856fb69fce3bb38a6d83bd99fa20541500f81cbfe60b8e5ac9f5e093d3310f0dab1da0293f5fc104972ee45cbc6a15a3f91080ac488d7c655c58ba9f061aaaef8454c21d93dda53ea4f1692974a5b58bfa126c35b7ad6456103b09de80526068cbb59ae14e4dc695217bba74b57bca498e7e4de0c5f3dcc9700d7cd6a450d5f5cba09918d118bbb4973e56c2f144ba4920a49431f5f95c2c0650721c149e62032eb65b28ced6daf970b9dc98aaa90c174b35edbdca1658fa4d94981343a39b3d4f674f958a00cae0386eaa6a640136308892a8c8a4e359a0b05a4d50a408f7f0a823f4f3b51f021568cd5ebc9ff5df31435b53f738d8e4dbd9020058c826eec9e37cc9a7b299f6e58c765803c0ff5d7615e07dddd87f60f8123c5f90229616256bf25c4614fa3ffd1dca24d47976379b7ad294c1164f74921669c9ab45ced49fcbf52b335eb843a8976943b31bf3040deca2276574b19616300accee9449c0956e259513f27c889483b443044b1e3939d5cfa41f664e3c0109afd7eea09f50a2dcd4484c629f953d5d3b915c69204dcbd0bb99738d8ddcef0db989300d280b5482b1b3614199efff9e7fbd3008d1b820781685f63cf8ff3ca6c84f371c7c67071a2e44e6f2040f77c1f13503ac7b1ed40630f81c070829867f4c98885124ea46edaa9b4206666a226220876bc6b4d84335cb4e497e43d23901c703886d8a0ba087d71506f129868be99e22ccd9f78b1a7126172305348fe0b8c80edba4445180730450aa34c5fb10e2baa59b68bb9dc632d1d12d2e42c8fa0eb018e6b7bc428339d2cca063e41e5dc8167e7c059986b3056f1acc7bf704019e2fc03dfa8a551546c2e78de0dc86cf14221bd302e9dc7d635e329550d9c783d1877345ef171fa314553fc74e47caf1517e0c3513551581d71fe6fc5f6399ed3367d09327eaf8d93cea43e10e9e4140fa8ade16a933b86cdb247675fa1ce1ca4e3136aa278e77142b22826fa448804a99c8fffc273e4baada2c8f96a37e35978c8433ff507a20e0697e79d791ef0e8a99c8f05a2fbd25a86e7880e30df00bd168c1470745266cca726ea89d69fa526d84fb4db52538fd020298f8cf7c2aeb048d88fe56782be13ec0638d45aee2e28fe5e066a1aa4a3824311e65d0807749ad454ba8616be2f4b9edfd9644a341354e3708d98421694dab7469467abd7dbe383a79f3cc82f43dc855bd623f198dd144e2e524e11d0ec3e4371a194275a6af31d7a46edc6fd812e692036f7964313cf093f5c75d0fb3218b13a16cac6b7a9336a74b582594f71a912d601ca805c3decda4db3f3c8beefcfc748faf3ce172009323ef6e4c74d9cb648264083f80ce3d58afd60b23e42aacb4e4455f688a158de3c7f11f9582189bbd2b8fa0a467b8ef1e1f96a987daeeb740dd52fbb3c7ed81b51e00cab56f0c02279333747b2d0c5a8a6e9d98fcc2b3b32cea4912a32d528263909f1e107e5ca51053fff2284341162a374b67e72e1206d5759822bb1cfd169bca1c883b5252eb23e855b8303cef9879e43084cb8f7248d719b0ba602945a4aa1519778a6db74abebad525278c7057f60fed7e3e696cffae41233836e4b4b33b2c068aa222d25a6d65fed772b46bdb3b14c2b2a44e5a81c786702aa3b1d2d8bb59642007343c80ac54233da6474aa8958d50d09190d375cf5428003b13186ba737d2e62e046e53f81fe2c636b78536a1f428468af350420224ab6771ab0e128b41b32b8b05e05add23ce0fb877b40bfcc3b992f4c8698d1c828abecbcc1c33d401859ea2cb2afbc7fa4588802a5faee2867534639287ad8af84674be18db661de1da8e19c6b6bd452dd9bf3221d0861fb6fba96be42329b9f04f37dcf3b41fc58d2298348b0c15d1190b125300cf27e0dfad60522fc498460535669cef4ed7674dee3b977aa3abf8564a305739941af25b1b07caf7f46fab91798f628e04037fbeade6c72815d627602787a35ed7c5b0d3c4fe4abf3b16474f9c20e2326c4a7b49d2382825cb2aeac11386ebc2f2be98b42bb235f80132c57a0db9809ef012e69a0b9e5ed63c20cee3aebc85288d7c3686bfd23134cf2b92bb5eb7b20627e35e09aa87bfbc014e205259a703d2007506b611cca0f82d973b7dffba1b1a8c322e234f92ef6983199ba794d4dc51e43f85ec920029a484dc2c5c711f103e8585f3716b3e424169f9ad3de0a4934ab1323074e12b2fdc6d80e1b143853604bc652a7e7de87cf5fe84c18fedb4bd0ee00393096f9c2812601bf826f75af0ef99465fa4f83fe3d9e9316537ec73ce31091a29f49dd196b8d503dc280d2ed56194afff7f8a831b6f929624a09d602b3384fc71d10c6a106254ef1a3ee56f680d370876887580884983197c6451186898fc00e7193bd4199168241ed6209b0d4518f6713a7986beea4331c8fda7fb0ac3d6ee06579c9e16b8875966783f4049ab82e06c0fe72423b45b85b6d7129696669e1a6bf6af369c5a2ad59dbfa1eda1933d6cc3934ed75b4a247bb28b21597fd3b9fc6481042c2ef8cb4f00f6e901b9ae70e2145f211eca1e468a487444d23badc32aac810bed2316f12c5cb8850ad65ff5e6dabe0e7904a32a37e54d0d9f6e57422b807156f82d3734d3ed9f0687ac2a14e1834a57647f6b581b255fdbff7c62af55accc55ebb1cbfefc5004ddf69f9f6678aa8e9c7faee9589a65374090da42735f7e0c89263567c80c10747be615125302ccf56e0927bf944c315dcbf22c99369f60cc71363c7d1869ab7870c4c135632647092cbf5e309387165dee71d7b951ac1166aeaa4b7e78bb7d8b5d11188b3f39b5545900d6eefef1909228be50355cfbfc6581e0d70e5168232791698f561fd3a441835c066d0f121ca4fb264a9fc1058e63ab78539f4b0628c79e2c9a58bd8a706b2c4f811d7c4f3700d6581b4b266f43cb7bef6593cdfbfaf603d8cdf570a4c63bd449cb929f2f5c306ab246e9e57fb92783a4719e42e0264d42fc9eaed1d9022debe94a4f103918bdf8c351de96dd5ae243360c1152291717dc1680f7699da0dbf39c81a557d2e8f43109d0aba30eb5864b12999f645d59e05fa51961a0494ea08bd20657dea3398d840427d3a27a35ae0bd8ae8b01e36b511e36cc700e82582615384cc92d10a6e46230dbd91da667b3f5e6bf86a351d7c4c82a2e951ccf59d7001dc96bcbb1ad936c1e614e6d19d822a9db40f4d13f0bd5be1d94634396c03e0d1100c222fcba15023b6c86195ae3848804d76813f183ee908fa24d2b6f27b57cb0876edb5858d3b5063222cad036542121e752d41fec89cfdeecc53cbefce7df6ac1c44d5b066a050d76a6ca102d1bf580f5379a209221cca9b86de00cbc4fc5ae5455018b4f4262cf8e84cfa1543685c095a8ee9a0161277eb9a9bdeee2579ff993a3905faff76ebb0e4f23fa384e525f2d0949e2d6a260ac54fb3ecc0b99feeb1442625e84f3795e6a586f8145dddbbb4feb24a17e7ff8d10ee4eb2aa48132e16a93ffee7ab1233827431adcf93f827352c1174c6554607b6bf93b9129980c7aeb1ae1a60ddafcc6b991ae73ef1df705fa2d9a4a27ca2819e0aab8861758cc263a69801b9abb5688b5c6b2dc83e3a9e18a731621323bc02b017bea800a4df261cce28395cdecd0fc9044908d541b0ba4a84413781143b92d42df39f55ee22fbc173834caf3e9eca0ddbdeffcdc3eacadc8232aa5415c839f29672f7ca1bfd4939dbd4c21c92d1a03f27529a198c90d9b6e72c44f4ef0b00f2986437c6f217196e4e412109a40d9a4831cd611f6449ecc0fb568bc96aabeebc7cf1e8b13c19724716f2f3e03afbbf0e4176dd4813bd0de208d9093c4d510c398a4091f2c1aa5dac7a10bf081d42177a9f7595fc6095430454dd46b362a4614f097abaf34973e185c1c30ee9158baa7492f311a41579970e2889c9976f4df5e743c6ec1b9c1c06ba343267ebe97e81e56318daa6f8100fe8cc051a513df3d0ea7e4dadd2814cd4341b86527663c2a3b35b0b776cd203b67a887ac147943ffb3e03368880c2ab54d9bee657f2490018c8c0f5705c6af991ada41046e33bd97dcd1aaa028d25e28d92647bffc764dfe90adafd4ee08a9baa6767ee328cfc685e7d0ad1a56273998748566dd15d7c081d63f34c985ff89108911b3d0da99d94a6381dd2f86573774be1dde3561d5922bcba5109d6417d82b31406245da4e7075ee599d683ffef25e0473f05146dc2d6cff63d5d91ede117b4d670ccace4a2668e6cc704cf98ad4b4e60c4fc95b680cc5c01ff704fcdecf712c1a35c81d1965c3cb5ef85639977909e16b6f061615cab6ec2df699b4866cad5bce6fd65d38a8f72a75980c768139cd74f5b08fed41b1c0a212570fac6163a06ae80d7df5248a7372c4c1e846f491801f5fd6df67988c63a0618aff6afc5edab81ba1177b6964d942b12872115e3ac25efe247d1b76a520559014b166c3b8bcf1cdcd4b5673d298f8df1e226c1a7ff4a2552bd15f588677402286fe26340bd77672e4722ce05e2333832571cdd5fba787f97f74c9dabae8dead541e3fd9c2bad4af7934551b52085151c108ad0d184b7e5f81efd169bce5af750e9a0a2167c78ad81dfa659178d8f0cf932f802c606103fbc5ab1c82070e312e090a2bb7858e1781254ce4ff1cf58060fe8eedb05e88a752cd2ef1b023c2f24cf5e6fae8869ee93f31a44990c8ee8e9a858f5c358d12e6f90af3f7708d94613637a91e50f54a9e66c5890a13073489f0aaa94228569031630182944fcf030c9e50d90c6d4c41a5ac4363bcd24257f0e7d07546055591150533636eaa428f52c9c3ef2bba15f48d545ddcc87b24d95204b97bce5904960064231edd1c82a9e26d236412b3ccd3b403575cb36a09393bbba815419fee0f9214630d761329e339ecd1c047e6eb7fb84dd25c141b79e80c914eea46566c7e387a55b7a03a92aba7bd719c41bffc5918785163512bf1764319f05352f92a62622a7db601df4793da73655086cb79e04337570af1080a547dba4ef8ee04824cbd896d81119dc31c30932f758d85eeb5c6ff45ab7a3c2f132af6ad337e151e9d893b879145d29fb558915283cc7bb53a1224bfcd6334ca32c953bdab999759e583a57e7f053a37efa0f250f3da1977fdc36c37f9328e7623e755d2b9b6f7beb50b5b94a30611163ba83acd5e2cfba161592a20b77eb5bd66f3719f065cd2d77caec26c959f13d519dcdf0a1b4b7ecc1521e30c709e270a8c7c3b74ea01a51ebcdc7e88cf56aedf1acd63a9c3ac2f5289dc2b7dcd176ed804e017f6fd3bdb0ee622e46bc8b34eaebee84d1edfc589cf2fd667d72570f9c050ddab97b8620122990098781a4b7fce66cc0ffbe82e2aac87bf2cbaf241643e00b34ac9941aa3f435f40f402c75aea8a2c730a3455c6e8511d4ee9bebff1abb950f9a1f28dc3fee5d7bbd5687c887e8038833b79fc6e1b36ed631fc5b00a9c36e50fe0aef1d318b7016272da4ca67e7098dadab5ff400e1ef317b5ed80c8de02d160b1f4f6425660e41e1281bd1db301525e2f0fe7a688b23653f25db69238c31cd25cec22797e8988d5fe855955e5dc70f981b03a07509abe00203edad27322cf4f28c000de58d9f6707f0da8b6dca9f9921ac083cb2f7d930485b774ef57c6f1be5f9515daaef935d8db4131a95f0ff61040664759ed03be4969f10d51ac588a064796ebd646904df35a4a7c9438b66e5d3cca101b52d546b516132c603a7fa31128e80938e94747ab465011e02d47696056156578259b3332d3465a84c9e442c64cb6f7695fc62ae7e57a79f6076af001d56fcfd830fc8da7e7b21e25202e720dfa263ed270b4fe8f81f13b3c8dc6092803ffd5a339a15dfb9b7e00ab080638ce796065dae4bacc8a60dddf1c8904bfbd26eeff420932ab1837d3887e49149ef1128df4e8827f9bc2ca65edfdc1cb17a88763d51b68567de503d83f06abffab5f0dd5736613ac731e09b1ee47ffc41bd16e87e0971eb5dd4a46b6acabf67067feb25f6bbb5fe85c8664ea6a610997d2212282a71ef2f8d22f4a9458d6f10edbb74854644f2edc5fe22238e7b5a7eb447eed7bb219adc7647c559bc9ed65820e7319dbe48a482f831a8cc2efaaa3687ad1159a8aee17c99c19b0f2895a1a7308186b1d75d4758ad117eab109a8c4b77b03e309b607f8a781efa3c32083d88ad28f87429e957c954fbf842cbe17d1804ffa9fedbeca18091ce4753314d2676f73c1b571e83526f707fba15c9460936affa091712ba13f9573e1706cefad8ec9f3953dd2d91c3b5901b48a6915e9d21e92dc01ba84f334f691cfda96387e16405bf2668efbb2836244d0887ac91b5544109536f35128c0d27b94fcd878acc87db2c279cdd660c5bbd839e1b7375ee68382b579421ba8abd23b1a1e5b369f6a2800ecbeb6f08ccb0bc5d5dd49e71b4b83ef2312cf68dabd9dd7478847fabfc4e94e587d72d3a05bfb138ec65861b84ded5fc749c3c328bddc5a0581c34d74a066a3eefe2807023e33cb4ae20b2e9fb469da896546b1f97536c93b52f7b526c44a07968801121c3c5af5f37b8bd536489e6951b07fbcb6ab542ed1440cbc3df93b823865257e541c189770d700dee7d135130770976bc528dd90ae9d2aea2107e11dbcdbbbd314a817bba93e91d21916d5e193eeb6468fb47af8bca578c63ab6e6df0a33ec97c3a6fc6886fa663733e027d9dd7202d67c16d36de2a61fd8f1ceefd10ab5df54c8df72a7ef52a8989ff7d306ce44a6a2f5188ff708e647a8ac16a7f9a5a8bd918d1b1f7fcc8d7f7ac423806d4cabc8336080569e16ae16bfd457b361c156add77921abf805f412670a2cd61840f1910f2617d26bf546b7a4d259be114705d8adf4bbbf1a82cf8ae6d9d97f0e935c28c0b0a5a9658bf650df0ce46e0f20fe659b66af03ee2c660e8099f320572b35b5ce65f28395c1060af9ecc06b6532897d2937c61e7be900c7bbb24264fcf2c362bfacc5090180bd0c79d9b45e1b67ed48e0d0c8b9c9a2e6dd228d8ef004cf50551defe8e2b3ae657fe73b8aef37a674ed47977d7be14061773a909f6f77a922b66f9521b7b334448acc7908c5c3d66495e7f5ad0dcaa9b7bd8d243d875d6a82ae3e06393007fba256aefdf789c6e1066746531f168cc730d8a2b22fe0bff9b86511a9f8f4b9eac90a182e1ee249aea28cee179c3f308016f001a03e23a43e0c0270e825acd1e800cf8f7447795325802b67abec30bdbeaf2c335732f81521c6ade32a8aff55df8ecd9d3738f5ec2ee76d3775d7903b6845b5bf40d306198a2d90f3d8ed964fb6bc2bc9dfba001cb1217ae8df2507b3661eb32dc2e8f6b8618ad027581718c655d2129bd4953fec967479024f9d3f2ca0824d06443b6ffa8e25980813d02ec3a418a99c7f915c63c529920b2f08ddaefdbbabd030921ae8f9460e1d71df804d8ad519534676ff8a2787ef8de62e8c416810f616edb69f898b355aeedb0eb56cf2538949920bcf67a2d8b50fdcd7f2eec6c8565de36fa5e62a39a503b7237628c1d82204cc1975051f620f1a79cbb7bc002cf22f7a84d405bf9c17e56ee76a8ae0ad0b0e5a689869876f233525d184b4fe84f3131abfd6f033a4d71b69223a99371a6defa6c0e19dc04519e848b301dca81880922be650af6c9a0e2d0f9c8d5eae66702d16e9f8a8b42c1abb4a37d53ee62fc23315c2ed4854c6e3a4c71c0cdf2edb3b5214aa8492496e4e379326a8e2a112e17e401b52c5d26f7f06fb6c5f269dbff7e607cd2e636952dce38b4724cebf0a04fb15b92a2dcdde09de12522d3be55bcb6f57189d24fb1fec479b64ef0c2a5d5333fa631b892f5caab174971e24ecf7e0776b5479dde71ea8ec2943b1a4c853f7ad58e3cde0df2f8a098803dbeb9cdb5e85ad496c94159736599fad139c833618f198ffea3ac59fd06db85d0c98db4e6c2284be1c536dd1be16636abcfe424cdd88208017a0c9f6a5666c6f5931939932d4587c3121d61669acdf4256d2eddf6ff95a2dfe18d37a307b0aff68c0ab05d926924c54073bac5ea279fd861e6b35f6ccacd047adcb759a34fbd6e44c0bd8899d98f42d0b81dcc6809b62f6eca696998a802f9a64992d0a19a7bc73de9b5a69c3d33c633891eec9cfac3b4e43854c80ba3d149d4725eba9b37678bd7d43d5a21fabee9f93532a8e16144e352cf09ed4e44b45fb5d57f69e89d1d46b31eb8f5b3989d08826afd83edd3a6454adcfd3bd90128a5aae189812231e9625027bd1bd9ad3acc7f88e3f00ad884453d10a346247faad63434e172d0ac68792f9dbe3f0c9f3480311d6a8fd0c65b8d99d8a09ec906b74bd23e3bc16c5326f5b1df30d1b4e4f6ce57a715b5d8539868e1b359a82f4cda91056bdcff6dcc9162877ab9767b251e2143a45a0479d6d771c52f42e4dfa881206e5c698f4d8f243a00decc8fb7c5f7139593cbfe3de6753284ab00e752a047845d7e45e394017c06be99cea0034e3e0fce03dff5acf90e25d0c4f83210ca9a27534016bed9c9f533213a5439d6344f804d62faad4f850eb609fbbd37929e05a3f0504053675f2c59d91ed1cfb90ea81fa43fc0678e21038dc0bda46a6080f664b51d5753f5178dd536d5ebc41433d43852f8b5c6f14368f77599626d031a08f40205c032ebb9965fdafdf6d9804a5054ea3c4f3e1162cb9d990d5b91e2df99dc67a81f62c38bd23425d5775285c8a91fda68f15f571587eabb88149b983845887682c9860524ce1cb81b01d18d254ad3941d408d3ac24a595da811cc9bba78828f1452ff390ae653f22d1ad91ef6b22aa7b7b15a44ff7f83efcbd7a755eccf4541eb4040c7a4b774749a26dba3937b7f95c6c8490e3383d4f291dade5f35a65b1f6615fd4998be18bfd0ba4bc3a2136ceec909dbeef513d6f6689fc4202b9a3e78134877374d76ab246f49cbe7a8f65d034cda857fba9c047bde9aeb41350769fc716c6109495d9652c459be980ea0ea83b0cec828fa88e7f35250c62af89a681d1ed62d37f2ff74bb8e6ea64d49bf7fe0936b26834b66ebed6255e755dcbfa34a6a3a4e5bf0b8c0df1bfd158fe08e979a7314230713b29aca9d2ec14a67f3b614e1ed46edc936052e0b997ed869babc11ce7e403cf9f87f2b512fd68110b31afd2483a955c2d3ac38bba864af5bb077f703ee009d54a503803ceda9926d8a4c739071e83c943e307fcabe498d3cfc35bac207d690ba54c2599efccce6d4e5c508b45c760aa3c24c73b75fafea641a8fcd774044cf9164362815b192f6fd520f3d0e97e538880c3ab4efe10a5f8787e0bf922bdd92806fc97c3fc09e5b3d6ba5811db8b84ea77885a3f306eb550dc0d2f1b11f0391fde406b65b8e618c1b7f0265603361c58893d7d16f25b5537d51c11432be5936604d7867179f6ef22e28b05a549c7435a1ea8bbd92b21ad34cb75587c57e41086e28991ee2683935dbd539f08958520799e93bd92c506e6cf26deadcb7d34d806de1e34e5a7d32cfab20f9986cfb9dc3c71c42b48a75328904e20b83a861e126e625d165de42ee18228899e27dfab9e2cff03ac04b94f9a00ac0320d058eae747d50fe05ec4deda7c878754f4ada38fcfb01ae8cde34465a6a64e8e95dce07e179ffc39f1322a407036d263f421e9d7b0edcf88ab0d78b00aa5cba992fa47006928ecca1c13593be69f32743024c49d541cec34a61f34a4b512401ace9b6994c2d7a73be950b4f267296e2fae9c7e0945a73793c701c0692e53768851a58c63ac16f43360d1838e7a3c503b78735d450af4794e159c6426fdd2359c2402f994ae4d9d5a887e0e36a8409e41968faa762b6d790c98d66804abf544fe4e98f85051e26859693f9c13789d21e80edaacc7307801765998132abf266d55d751d0bf1b3e1ed80bfd764d72bca1d9ea3aad5ea27fd7345fcbafc0c1cc7649c813cb0896c9877e779ee50b1e03e6bb3299f36309e9c4edb35582f03a4e288428c82f544aeb6af4b40c2f7505dbb737ecdec7ffeb1e90495b20d5e0b1164babff5745cabe0d90e2ca2d9cb4aeadddf522f17159d28603f26112efb8ae8ba76956a855937a95c2eec2eb76f0a1df219cdbba399b4589e58dcc151aa1b915036334a3a7d606edc6c3a32d035067db49d4202067eacd8ffdc5a5109cc35b1c2944a13082bceb7b640775da8dfd87071d47f80e4271f100143ff3eabe451b08dfb2a537306db0a9666340dc5a1f89cd679b6b6913553944f2a6be8dc84f8242ee5549a0f710ddde927e0d1ab2ddf694ed78811a22c12dc35fa00fe0020b17301ed7945320cdfa81b201e37cdf5f55c378874309b7db56e523d5edcbb39f623b36dd8f38f2cd90fc8c93cbea28ce2ec4d06fb81e1acb3b1305ef60362533ebcb00124038b73826b6e9ddcc4cd4520afebdd9e84292ba64b3cf9370099ef03b49421bb139b53645179086ee8a2c126fd9076ddc5b69d05a2f476b262c67fdd91bc5a3ea2436ed74874b37398d7837e8bd75d29b52e534a4ed361f8988c8834dab5150f1e280883b6ee098b63b00e8fa12d1b12d104f0fca576357a10308aa2060aecad05adb2d223418506c7d0b4e2f40e1b19b7cef8855d398ba77867199d9a1a3ba8f739105b241bb08643ce2900eaf6e7bec7d0cc8cccb9bf012fa497900d8f9c83417e93772fe9167a45eced81fc83fb628fdeff6b7a635a27b45d9711d6c789bc92d2aebebd1611636cc154bebf11e0b58e3e13b9fcc2e78b85169aab9c5e8dc559c9d4ba323f5bc216fff13f993d122831728bf0aa54e19d304414c5b4b1132e14e8a7c245d13026e2ed658d11721a2b1800ca983995d2ed348a87e8c66bb46742a39a9f6e5849024f0e041fce3d634ea08d7218f10225ec104e868d37eadc01618f1f89f25100d4b9f67f70161b87f3796cf51b8726652a4204733b8fbb047cf00fb91a9837e22ec22b1a268f88e2c9f133e5f8527f1b184830e07c3458c83a8ca9f9d9c6998760e610668ba0f22e22b656a737e978b246a17840b7dc4091da85f2544fe3e24b2b944b0747e103a4ae2759cb62c2afc535cc3f3686de0eebdd8a5d5ad596aeb7df5b3f6ec3c629f0bcc2b1b4f16490be5656fa1451c02050a3e85f7013455b580cb961ff97d6d19cef16f3167c55a82838a03d7cb109014ade4e7d26718674a6242d574c2c799703b5a2a2426bfc727d4d568dd22d3f4e44dd2b4af088c0871cc63583d70a54e6bf90e423db38ef6c3814d84fb71ed943d930fd2d60c18a0f4663507c22a9cf4d3b115a1c437b9511d31fa40 +0x2529d5d0f4625ae701397a41b5184bbd45b840c3fee6652a467ff1a49c622604991157b16393136cd123a515e4a0412dd2bf2b3227dffb652e11a6304523c31d +70720 +0xde4fbfd553cdf37019f25afa82dc6b9970f4bb1ebbc37f80d3084c88a70722cdc523a9e3c2afbad0dc0221bfdec9a2f944a23a10a0e6a65d3cc52aad01998b3897745dd3cefb85663d78f69f292abee8a8e0469705c6d565677e5722ae725da79e69640b3f595a1a837c5e022aa6c850e3d6691bb40b147f9b595c4e763ba001202b45f5dd7043d4f838e350aae6c7183ead2a04735e6993227ec298209c5c3066e188f76fe9477ce2d10cf27192c328018d11bb0b67de8a4216116a763c9a1bb8b4b67bbf6b6efa8a72614e4751c468749da7a644cd7a4a4449cf2b3ec462aa5dcc56e8939fc13638416bcdf4cbd3c0de06732ee53845bc703e864241dbbac59f50f0a6b42d47183466b1d73fa9f71889effebbb85248c80d1ebd19472aac54c4690d1deabc0989c50abcd5f1933958bb81ceb683c08a576510fd1718593f3f153e34b5fcf40d6f3455122dd2309f68bde46d850f2d134fbe3dcda47b0f7b6edaf8edd6b47f5db4ca6e3d49aa293430d73f6392243fec9a61cdb52839f469ca5bbec0e8d802013ecc7ec58f4125fd9850ba3644899e1c1e96e73d0b1ab11039dfb936533128fff785ac30695fcd0489727f700208f3abc5a4b3eeb6e6ee79a4b010d67f879661c53c21083ecbc950e983b3983667e6a275d55a4f8f6552aaf414ec28d4a2f72f923804d4764ec0e9a2cc8137476f1e08186f04e9ff5f86ad0f5475b5bb49f16f45c27e1d79b05bd89a950fd49de844e595bbd8426f9b328adfb8d2049a462c2bc622b76aaeb94124bb2685f7a09aff42d401ffe445e2fd474b872c9eda5f516afda0d6437f301ad5ebc60c29b84df826bd89a157ebfc8fee3a0baa09e45d0835d284043053df90f414beccf04dc8d799389ae421c7b19186968a75cf1f07f8932d1568ba938c49871d57ecd7c7d443a32d7df3cc43c9ab18464db477f227ca8cf69c2b68a500ed99eed694638e39e44d847bf4e0c50b84ab329c908ac7832628156174c3f203252f6f86ee1e0abf639e25da10e3b740c54742bf318f05e5b27072ac6c52e25d995388ae1f8fa32d689ff8e26e5f803015f45efdbe0e1313196bf5c53a9dded5f00c2195523ec24d9a56e6dd37db88a31dbb6e9f60905bd5012187f3082c4c34d2632284adb4cde5a2cdd51192e0376185a35aed3e9c44f5139b0e80fb889542e95e73c358782ebe270caec7a8f5f531f4b50a2f81ba3639f6e073b23d3822c7da08fc9a7c124ba0d2195a47a0a22add12f866ad5072996b52f89fd2f6c45a8b5066a651410b8e534bfec0d9a36f3e2b887457afd44dd651d1ec79274db5a455f182572fceea5e9e39c3c7c5d9e599e4fe31c37c34d253b419c3e8fb6b916aef6563f87d4c37224a456e5952698ba3d01b38945d998a795bd285d69478e3131f55117284e27b441f16095dca7ce9c5b68890b09a2bfbb010a53b2a3b9b3007ae6995ab89b93c2be5559bba733988655fed41017b11af619939eccc38fc02ad6448f68dd7f8053f64a92d5a96c9efed94f0546d47742ef2bf38a0a3d3c4e06f089b3cffb5c85be864bbc6247a53a6c31b3cd0de487bfecd4a475f99541b53b464096fe86a51c88eac326e0069003651bc77bd3bc44fa958021032950228e2e53e3b98323fbad39905b72dd6a9f826fd414a236c0417b7fdaf3b2080271415685fd8bfc47c2c057137f20c8e8362fe31705c0b5850fcae2318703240090674a68f89ea8669cee47e0a8a12113f66475413567ce9f026183106566fbef027880795f623604dc9fa2946284845252e88cef0df7f062bbc7c914195dfe2269fd8f43bc6713a7244cfd8b273b4137ddf4906d0a01b974ae763aa91d68a95f295ecd347a2ddfc1e68e9f4171460638ea413667a40588595ce54e4bec179bd9b314d0d82316d8e9a5dd2e63db2541ea1a36c55b8683eb6549ad7a78ffdb3436a9d820bb41c2bd82e4a1215ecf6972afe04df3b50c0d613cf72745bcd334010a7fe1334a50a1fc321572fe8ec873071edf0f1810bef27844e7fb468400a290b9a7f89ef1ca45035bdaeb3c9040f2adab68f2c8db19e39f218e81e37b02b751b8a456ba6e392c6174874261ffe338a4ca00817c80a74154376d63b2ee53d2c2ac17b41c0c07b89520bd40e51a09d5ab1f4843a9add1ac261b07191b6a6e9571f854794a57c07a2cc4ef4f5c9b3f5a2f0fb2a1e6cf43748320ee0aa38bdd7fce11fd1eabcdfdf186f59fc62eefee268f1fa234aa41574b0a0d74c0e1af0ae265ad742ce6fb0abf3227315de284b0db69c3c9646ac0979019255dc43c60816da71f4c2c525b9123bcce567f0df601e93d908ac9bea98ed43efceb9d3a2cdb9220ec0785947c0bdf957f819207b06bc0890a58cd0c889797fa18b0a4618063c0519818d113b8e5435aaf153f664058f1ba95c606daca6c4bc8fd4f8228e7d4a8c7b8029756aeb7ef5ad1b3ffb032540d60c754dfb00b57702a1f1abf16ef889bd1a05720e3c9ee34348bd02b6be2e7741a1387d012b7f3959bf294a3a1f40a1a2df5793631a712c26631ec7affee7db6351ec180795ccb3cad1c5fe86091d3b43b2c0b2fd6a2a01a7e687b46f2c19154402db4595a6648c5cbf0dee5c9456ffa67c86f862959209ccb940f17dae8ccdec9d4b2d34c60e6d187149434428b594d523f28c1c0471ed9fc591a761ee08aa640b85f86b5d94fe04d0c124c62d00a3d8914c96b31e8f5528f0c2fea4525554b332d1cdc3d3bce62bc2bdba6b0b00d3b5acdc40ad4ab3e76e231a1dcd443a74e1fc76d4c3904fce9230842cba2a7dcd765ee9b094f2a74e7947e22d642b81b2f750be37f3fc145d43035fa33cf33f38238ebd0eef7d313051426355f26ff0b5fc15ef1bdb80d53c4521964777cc0dbdc2249e8347531a36fffee2befe775026f83552aa04825812a074713ff51eb0045d07d53723dc29078a61aa8f10ad68acf3972f0cf56c66885ce337b43e52f1b4fb21aa510b7f284cfa5502f1b07802f0f623ce6936a4c746825532cdd8ce9675a55964f987a7ddac57c1310c6740e49908c176e8509443f31ab4a8b34dfc67f162974d5920b912d0aa8c8007bc6ed750325971b1caa2a2372ae7e28d25432ecd3ac3ab965d1e8d5ffba0370b3868a3bd7bd305ed2c38abbcbcd62884e60ab1b435c6c7dbc73e170250e49e3f61971087eb177bc4ffbd2727d769c2c01abbb94c5c86e94ee4817761b340fcccc263e6578a0e1b5dc999df238488f76848bd0e3db6ec59173f5077232b9c9bd9e035ecd4619e2ce115339856ca1b10a5f97878304be05e5f5d11ddf0c0e0c18f4573eba777b0f87768f51d68b10a559eb454bfcd244b414ec82e72727bf5b7167887ac77d42dc5484c463502413d0e7c01b9aabb48134b0b070dfe4e63c1c59501d7f4ed81fbdc7c488ea7cc839c8366680f03a3bf22c1bfa218492f812d323469cd8eb18504853ae5363c6d7e10fc8572be902c925eee9121b51abbdb21481d36cf416ae82e07aaa9a4bc8e3a7fc000a62e1affc8b119aa0d4e3a9a7c864d75f347d4c0b363acf51e41efd6c0d318008dc768c369028931ee4a727569428a67259c105ded8aba43cc759cee17f24cadadf244217e38874f4a1188f4ab3f47185636bde69e8b7abb3aa98d7d47c6a42e911574c10e3d5b2cab0b44be4b63ccb30d7da306ce4e3486f043882c593567acbe9ac14a21f84def98a0707c5198605ed3d9896386ba30cb76ad56a35429df4ebee7f365bf51a5c19a38d2d5c3c54c412fb238a5cdb9b5b3554dbf894089523d1766d2b9f130aac9383b3472abd2d986a9707975ac330c66148d8a86263d09a0547d25efbe7da530fa115cfa10a64c52c97b127b2a0e7e0b3bd481440d2c4ca0fa96b6ae2f20de1d68221216fb2bf0d0183bcb5e4f3351cb52896a68fd40636593184b9f4b029db90bd6206e73480c251d196ec6238acdcde2160e9dfe609516a76bad691a092a2b6a964da980e5e77c607bc15daffb3c3a72e2358919742bdcbcf7a4b5a41ecc9c0dc860702aebcafb6aca8ec8fa6fe4398b55a6d455656dde5c23f82bf22acd347dd6226a7a40fdcac26f9bb20ccc0ff3b4d72b27bb19a3450e5970720b13731a41265b4077cdc812f0d0b0c1eefc038f75d08a2a517915385b01d533f7c30777e122d2992a7a73fb7d57979da7e5083656a88c84216d0be0c981ef15bf20d072e630511e993045acf06b17ef3f716810e0c7f9dd33decc64e24286c16a141834d7ba9e77ced5874ed173f75fbf8769449a9699df8db2a1ed2eac62de008625e53c27824bd1528208a9d900942e0e55fb0d7b343039d3d2a334284a158a5d41ab9edfc542a8907b03ff04fa3794f0725cbfdf91783f27a7ad7c1c080e0e83b2b1834a2f055d76bd665b5cadeffa1409903a2b7960a59867348ef1627097dfc01d76d0883cf8eb8f5a4549e065676261be06c5b48f750d5c5ff31021e42a59b518fcd9978f7fd9380746335d41e3c2c40fa9170aafb76dcc5732df0d11d1d9d7c99fcd25a4fc270194e582ea2a761c78abad87436571a20043d3c8eda093477059e614fa2676bd322aab9e50c82958c6b99a7f265bad93404c5e328a38798bc6ef5916debbf68313f01ff056c4035ef661f6667c397228d49a5c85ad82898e21b4813b990b8361eb0fc9dec6c60c1650cd4ba40da6c949035455281c25cd36cbd0e5ecf2bf253f04ae31d167754d691c2220a1a14bb8de16a3cf85a0ca4d6c0b6a0e8fb37fe405a4f6e032007acd3da18bfec400d04acf55ae54030019101928aa828ea2f2c99b140f5d675a7c957c282e6c77f1dc8404089e6b0a06b91e236bb9cb4f88c1dbe99c2030da3d24ab0cf933f2223e177066779a9d0278537f741cbf713c2c9423d78351e2f1701a19d75cc3182bad2b15dbeacb70531f8e3cf283e3fabb5811a74e13ccfa16bd05e7c3990667fb07bd7b4ca8586e66c3135b87e74ef036d2e3713492b600b0ea8e1bbaf72366fa1378aba2fa6a1fa12c89e71a9228da1463b08973493a7c27c05cbfa3bf429e909b01acc328290a6d2199e592ca9841bdd321f5f1807df7e20718da653a8d9526650386997abcb7336beb5fd9d8c6ac99eaddbf987faaf94b876975eaad2ad5223b24420b374cae59d2265cd604dba310708def4e8de708c907f897196341e6eee30ce700a90078491ef3e57195ffae8a2cd88bfdf35caec4516c48daa3fb4ef025647d6216019c6917f90192d559566fe7679d8cfa3372a42b6e9015b47f9792cbd40d18c776a22385e1b8210a12222769e12ce3e791dcd25ea678b2dff6483b9b039d0a048813de2f5212067d519b1a7aef41ea05a075b4b2bb079a6c88ea525f9a3820155f7501def51829763f47b0e239e3899b88c4b3ee5646b3a35c0441dd40e342412253f65a72d1733c04b05268661aa8f0715238dc1e3be6cb9b1e6fde9ea858d1fa32246b7046ca19c75e66d61eee2f4d82a5a942bcf01c2e6cc144295c8e4a0d0e9cf3d9977d1853b0d856f20b6806fae3476fe9d76d3b12f8732888219d003d8718cb6b90804333e9a68885d38f153fbdc0f39918b82cc067bf83c195de62a98c2f14ea03573401975066561e6c456438969c1926dbd880e02abd9d615859994667361f9708d405e55e562f95057cb07b53d133abde269a8b3e3ee42d14cb54dc4b99cff59d0a87f959c2d6df64a36caf7efcad4cc7fd5591826f5ea018a2237760a6c5c51dbdcefbc91114a591a3e1fba08450b3a047fa1a7eb6d2636ec44e3f30c3c8ae91d7231434abb18f9262548840d1e48871ebd14dbb7c0a1e1e1b1d5b42599f58003fce6b24f8754471ca107de64b317240d12253c02acc782e8dd7f41ed1136c72dd172a2060286d36c25c031b5afe1a17e135541526e119a804c6314d91ec92f0994576b14b91b1e7317f4265661528fd03517743da11aa9367303b5603f271805ba27a5d2179b98e01c2614fd73c43fb1fc0e4d1ac23d3f89e5e39c18eecb22d0b745baf4aa82d32196d895e153c13171dc8c44706e13bde9098541799a4fcfc9104442c2ee6b4dc61c8e11c88dd415be5b23f2e4f118b4d2726b4de8ee0f8f7d59a5b5e35fbf693c11a921098e675cf5fc67c0def7c6a4e4a4f80a1d4694e25c07ec8ccc8ae9c5f21adc3c2ae21567a744ba46c4eea81e7e15ce1e5d307a58e38f7b4fe4dc84e4869c79dbb30548d640a8bded3d4237822d595fe34f381a53b264e477d2e12b35781b148828848c2950acc53cbe9eef6070c4200159ca1f73373cca8d0d151749351b3eb9f1cc59c165d572adbf514a39d6fab0e11362d437e05b6007fa0503805c214ae9b5693c3eee9748c8c605e28ece61851af29ee3025c657761301d6a8b3ba1ebafd9d79e025986aa16592912dfc5ad0f077ddac672f9df633135eaa6ca72217374d58409bc4518390eef37859d6b11c14f1bb2f90a471da5e071e952be9e3484d14f1b09bd1fb0582afecda5581d544e5a6293e528d2c4c2077a95f8d7fe3f922d8cf91895780399e31e37ec805ac908a1d90a355f1b594a1ec67d03c730c72e1245aab0c5bc7670dfb412d5b6b20472cde592442d8f4fa08eec0afddcd45fab07dfac6cde7b8d7f6956fafb6ba18b3f272ea8ac14ad1c67e031cc61b9375dab76d17a973023bd08288d3cc80fa7b1a0560ad9c7950343f2ab5e3db9bcf865b207b191da7b5389cd95bd74c623333c58c30082413f105ae358b7db708885fc3103068ea110797812296e2f6036e27fcb06b65e836362c5bc60d522208c7e85ab1126cd8580040c886c25b930cb33f0799982bb28b25918e06c4cae44393096a2bab8eae25a81cb82c66aceb2408632d6e3fc248bac91d8f1c374ec463f4aa39a68334361f08119b3c0a3cc6f4777bb758e892726a27b6a531ef448b0df2b3104920c836ef2708b7e03673ec23076fed7e1c03fa4349451a6d721601eb960c373c0cb0773c0dea563e73b9255ac0271709627da7ef36b334f74a2aeea5e79ef6a8cf56c1afc39dbe7e48763841ab8c7d2043684013f6e63cf8feea1ae3ed4f95b5ef20dcf0500b37c93e12ee7fcf8467ec462c8e5a92c8799717bd4d4cb1085b8af6788fa6bc1a0b47dcf50fbd35f81c94f3315969114035fd1c0a4e883ab292506cc5a37910b4801faa8863a2e3d1e541d2df68eb7b35b651953be6409133802ed76ee11353c0e07a3031b1d7e3f50a1b6c9f8586d89146bc0bb7dd1cbc756d4dc1dd0e198d26717ff759c3033d4ed34948d776e2313b2b6605e6fbc3c55ea3d4b179f536c6ce7c5786695fcff7c387f4eef104a88d1bad760b3007deb3d869ec30aa5d1007a0482965c74ee31b3b7043e753f780f5191615a5fdcb148fca06bdc5d80d4f57841f1e1ddd57e6b0a0d45fba671711701dac6a5cb50d0e601bc36ef86bce9cbf62475e35124481bfd9fc6fef932c04060fb99eb7c096732eb5e82851cb689f4622091035cddc5b4fce309c0f41fd00bfd783d83f862eec027fbd125961a3fff4acad5ca578e61d6867b80ea1d853aea45d53417a709c21e361895597934764d1e87b6b0e7a2b6e128cdbec2dc0f6b6bc8a7001f2e4aab9d943961893ca1b78e6bebb65f83b73f75625e25e3b60aebf1044243f2f4b1e5dec0d2a84d66fe8e03a17b472e923855f3b1a158e54224371a674b523b70ec1b425a78ec1e7e87647d5d9afb86b9a2b4fca53bca1ff6d7c7688036cd614935b678bfa0af64e9f8d53c0eef46205082b6f0ab81fc2c5aa2273bed79180ce44b41d26ece54b94faf5ac023ccb9640d54e66033286172d3ffd134eda6c486b88937fff6669e9406375fba3ad7c7ca2695cddbda738c8bf95d5fb42f2445775c6c2341d51dcf8da41d7e8ac284e3eb52c1d7b41017efe031472d6a10963d5746807e58993879febfce11a24948b01018759e99626a0e182249c4a74060fe9eed52b3a4916b207fafc5c3a13db79f00de0d7cec400e698c32e1affc2d191bb6d75f6da67c0a5588fa80fef82e4603061a060d3d475974c4e98b59f9352317478b02f6eea7ba7b9326ac4e277978aec8530bca0cd6ffd24accc35cff071363c98eea09ddb2e01526ca941bbfddc3e4a02f6b3dcb7d55e4964306239df16ea3a53970f1041c1fc4cc4ce4f21199bc3725e5c0c2f9a8f03e2fe2e03856b2993973413456f241bdecfc33fb6bcd5bc628d24c991437f843418032de25b99927a7ac0ca0a618d26ef02ef653e35382763c3d9a508bd6d9e3913fa95c5617339e70c8125258e82c9790ed3a8af344ac50e3b07573a486dc459fa6bcd754200062175fe8a609f0eecc21bf471d060147caa1e3549ef8a86deddf5de3fbaa448e272dcbf62813c36771350dc266a629d358193ece2ef2bc0d50d2edc525b3054b320694d16510c0453b4d5123145e1eed9d9c3b38a01d4238f31caec6e228d2b6374462f0c98b87f66edd31ef829860d4efbd612a9ef2db8f591f497fbd563d5d8b698edae1ee7af99067289e5def9047e2ff391a77fdd86ef75d264613d5c5bfc2e8a1063aa429dd546d9d95e2be1db4fbd42b9ed7a8d9566248cdb09221ec4b524411f9206715000f73199cddae798abecec11e1a7e4ee40e74b84594c5118eddfe8a2a5f81bd0035fa14e99b1b24579051922ecd08b98670637e8ba829e608ba8a5210349e826c7c652822a79ebe9a150f07277bb299bc1c9778e958eada377c7a02514c1825933766bbce8f9398d0a159a8be8316700387734fe503625e99984033540278e712eb615853bfb45389e9c3ff5a8faedceb35a95c15543ae3ad926f3daef45b777a2cd78648b45b6f2442c053620de620d19b8c35e0a7cf29f1ff79a9b89e1a2727604bbe140a135c3e40f17d8b7a56ec654dae55dd9ab961f533d200076c4fa6a92a30784c2d56ab4678b9b63d416ba004b082447299645c35d41ad911eb66568def283d679a9fcccb3e9ba5de1fbeec3e68aa8a36106a592254b67d7ea7e8b724238585ecee79414b1719b50451ab2170da798f9ebc35e9493a3795940e61693a6bfada42755d992496a67c3683bac05a8a81cd22e9519d19090099f89b4abd0f2cdab31edbd7450641e453fb22887949fd55eb492447e52025b40322eb1f4330eab798c89e50c56e8d35e4b8ba8e9cdda76832a7f97341ed34d459995a599c3e2a1413d61954aaabfd2d96f5b827bb642d3b6b95d58e43de9ac415c2858428856f628cddf97d656cf63df338a7fe45abd341deb944d35b82ec05b044e91968b53f458c36ab2576202cd98208067ccbe34e0e0478c3fd09688d3bc186e1a3dd3bfe1f9a769ad75d43e5a2bbda502ddec90202855aef55cdfe12b8b20f2b9e068840632024651d9b66d50c1926217bdebb73c1d9e6039829b2011f1a54137275388ab2c5b68662b0f76f881281d7014c3937ce6a90bd1ead32dcd162ec35bb99bb5180f3a37b412e8419a94063fd38b7d0b27acfe18863b8ff0a72143e0ef3f48f19402271b023748b67e21b53109c91f06879626ed201dd551e73a6c00b9606326682dab7c194237bdeb51bb5ada77b46ee2cda8f4673aaf38d48b328b83c5f33bddb94dc2c2dabe3e2b4ca2210d3d412a81780c942337248db7391ce91315001839ce9655c3a7e3218439f1f06cc2d022acc0db341bbf3c38d86fb38231f993a5c4930d9ee453b04e3f40312ebdaf683eabcd9c3e187800217f537dbfa719b2cac8313a03ef832dada38be942c9ab1266c5c6d719e20a7730f40d04063c1c686f8bd0a5edaae16127fa3fa196585fd58243d3152d411eaa4e7ec6d0c0b7abba7c5696d7c5df1554a28a87e2913273b97a6d1edce2fd5c9f6167a66756e16db2d971ae57f154c70e079d89329b1e8ec6368bccb7a0dd6b6052f5d4532e820b576e243eaddbd29e983f796d1c1ce558059ee5082bcfaaf4f50a71791cb2622cb123b76f62e92042f931665c257c4f7b7d9bc3f8c2d72c9e647023bc48494879c9e17168fd85085c39c4ae7ed724249c36136cc403202b12b76b52c6615afd99a68e9c520616509461e298fab97a2c6639f0299576126ff7f6e547beef4f4a3550147e540504c19177726bf853e72f7e8d184293a416bff627c54bcd788ff5f5d0595f9783b623fc865b70a22ed4f48f3a75ffe51492e5b754f3a41b8682c6802d47894208963e7c9387ef1ed1a7443f49eda7b44ef0a7e184569acfa090877f6fc5437e1a0bd9baa8dd2f94c4cae736c16a8427db96ce1cc0d877124f21fe999fbad473437dbe5dcc457a2d90a3a51daad3dc6742ee22120f60810b199df477c41085480a54b30e08a71610bc9c469c0d10f89b0b5e6a6879d702e3896c32c1e6ae9e26f7f9817563eb4c67d01b915af10820ecbf5070c9062340c124f67d1e0d7c673493d2f039e5fa6457558a4f005ea59c82e52bfadbbf2d84ce74a4a0364262279b6548c70396baa60ad25048355cceb3840557d146abdd153100dc61b28c482882f6c4d07a7f145aa8cfd544a2f46bae1aa83cbdb3d21c3d1350078a3af416b012ccacd147a7f0c758d4810bef2d65d56e554285ca3dd0429ced8ee17581b4087271699311163736436abc64c310a270a594d1f332f3e26df35ed72f0c3b0a78cc6d64de81d5cfef9118ee19c6a30bc7eaed51cd94fc3b06412b4c3ba62a0147454604793feba23a69677ff0a1f0882263e92adc9761c155addd54cfec577fbf0786b02ef260975ff3ded7b2fcff02c8380fc4e8e4295ea160fb56b186c96d263ab4d2c3423d95a559055e277ed65f0292e787b9225cf934820dbcaa1b88b4c50559d101d9898656c0647d16d07f891899fadc16fa037a543a9bed82539d3ae491fc15b05c4c51b852849a489a02665274cf29c81425c84ab02e5101d80fe9cb06250698768ede1437ec1f868365e0f74cefd79817cacd5e0d4d50ef4fe6a8c18b5d0c80cd5815b19724729633b2de5148e04f4bacfa70d779815213632b5e0f482a8f3209b1ded999b5fd4053f147a6912cf8ac7abe99ff1b51bf36bae5f5fe6617f774d3a221d26526264e8b28053f4e5a39822a1d301c1c45ff20fc1c54d40da9ac0fd332c6e524ff57868261ff64a8f37c9463201e77a3e57a99d2d863d9646a16cbb069b55afec9f7b2e1a31d5dc77e28abcece4958d9ba9969e4220a5794e19d6f124fd6791a0a6e984ff74771d283a58f122f9a06e64bc257d9013194c496aac5a3ed1189a14d2301756365e9f18b5a08d84bf9cbf1205e2d597ec0d91d12a393084a4fd4ba1780b4faf25f0d4e1db1dec82b4fed22c2d6b10ea09f6ec7dcf2a2ec6e76a08ef2ec7b88a91d250ec111d889d682b5a2b890ac9d6fb79be97cfdbaf56270364565cf1cc49288795cffe2c0c4547c6b998af6e5b1f3eea8ac7b2ea2cb2d23de06f9926058b486515e608d5c20ae23572fc16f26f0352ddc3760ec2417d779e0f9349b0fec1700f43c6b787546eb61c18ae46235023c5d81b3b39e068169598347a153f127c4dfab1fa90cd2dd131df0d57b39db901064dd47fdae11b0eaaa1018c522cdb2c209be2fa0b13d8e2f3f2d360f5be042ba2c381cc4830d4d6256cf932a716d3419687593dad07c0145aec0d527300cbf419bdc599385c2ffda4408e157a69756d2e31774dfcf58dd6054f1db4b2027b0ad9b1027ef1cf86f585c0329d42b14c0f461eef9351899cb851808700393f8bc07131bae62b07645e78607942a66ac1987cc404b66110772bee24cbbd8f1488c56ea461573a905288caa5e4ae0c1260a940b5691fa24697b129a06e551a2dfc7a20ad985ab6f6dc051b04e727ea24c3a210678f477b8898d8a297e15f70e8516f35a1c25906a76b63d8020358c73e45239a5ee9c67342d512c75fc74509e022152c2561eac03e7b258031cba939bb7f9e1d0ffb051021e6e0267c82ae6b81d8fc62ad19787a08a5bab1f892a1b828dd8236ff458be89248d14e7295e41c69f09587ad3b9a7ab255a3dbdb1acaa902e96066a15be3531065668de6939e72e51360f9aa5ab968a815617c6da69ca2d61dc92a9aa073e628e700832cee2625af8bff3738f96dca766f83f204d8802c1ef52d014fb5e61848284fccda1813ab05f4b0cebd8a2ff689ce8bfb55232dab4a19fc79450e927ffab394a952940f59a4d8363ebcaf68937eacd9f6b308fdb6e3d6c800ff0d0173cd138fc74b0451d7e890eff5cabbb027b1950e52c31c68c588b60016e243cbaa1bc291a517cb839c6dc96e824c418f09bf1189bdf9b0076d85524549a3455969733b2aa13d6c2d2d90ec0272d5d36dd013acec86cb7641f57615f817a68423587007eb6a4068b6f1fe736c35dbe3d5014bc1975bacd1b113e78ba8ef5072c1fd7e93345eb543a98002fa0c49e2e54d23c3fa2a9b3254cd4f362dd85f55b3adaf1b77a60d008f7d6e4ada533d7f7a3eae18a106c3e0620eee0e76f6d61aa95f03b32fa0e3b +0xc8b144ba9b9a8ae0ff3cf8a6444cf9291cb72feb3d8402237d2598a57d0d8389b198f67b5203576fa8f878ef2728644f706421fbc3db966b967cad4990a49480 +71512 +0x8a46ea29d6c39408e4d4eba3705a1a0c9415b712317245b790a4fde549f6ce5c6460a2efbf58e3f0afea3de9ea0ba68ca52b9cedf909aeef8bcb3efc6c4e85fa3ebbd87a995b2932adacd0ad28b48c415a95c44296621375dc3104c7b6711a3f607e14322b736eb623402b58f0fcd212fa7cb777d1247b31cbfdd6adef08941511d2de7f3f49bb645cced7530b8b82e6cf07fbf670f7ef0ba0583d16debafc639bdfbfc99b8417249f7f5a05410aa3a71f5f1a253b8576eba269c06a4c30591144cc3e7808cd8bde337a3ed559213e3c33ab9c6efc7318b91a59e7120112b30655c2e4f44ecc1e7a61e80a2d1d775a8d53140738796cdd5d504f3a74c507132c15e837a53528d8e071f1477453b5ff82c6c2e5ea7b16cebf8c7442f960b7806ace67c1f4858ac1f8abbc7c11c4823503d6dcbdeeca19f2c816ef860999cb02a8c6660a470599e2ab5672316e388705f8c98a18ab2e1e525e35e98e0d39eba1ce470e98077efe42dfbc3aeff2776c7649e8f67d896fcdf46a338ae36b09be66c59786f59db960e97d233d3c0548d891de7b4574f054cde2d556f90c8dceed5873fef7a96f7b68e06ed4a3a30f74735d9fcaa28548a7c72485e75f91d9531f7fc1c6893ae78fbe2e981793a978c4e6e2751c3339f92e62c0642de3fbb95ffde4973563326cbc09dbe53435d8a9fdd92846bb20176bb247c05972aed194b92f8ede95ae1965c9f1f03c72b2b708eaf338fced92a807fa1d2b4bfce79bd22a5c857c2c91753c7f2074841a32cefe52dd197dfbb17233d08d0a2415b7e2da7a2cd25b4335d058a63b6fa774dca6f4fc3fd3b32da4ff58fa3f64cb03462c1671497c6121c2b12106edea8cc8d9c650b1bf6f84ca94d7df41da41280ebb04edd6588b78105fa1ff66dbeb1b5e51b67b3908f4da1ca8802e6d07aa23803fefc7730408875634275a8fb07d3c7d6bffde5cc06a9c690984af466da5a49ff9770c0ef2fa763c6acb9a4a12a5d76f4f28e0e290d9b2fade6bc993b53d93b512232570cd692d0a2915275daa6dd47a26b9e8921f4a031750bbe31e8677d808b17b78613b5e9308988e6a901fdc1be7183b603516c4790787fe67ad895d5be0ff086ea9e4df927ee0bdc9ad19fa95fe4c35af931c50fb14aabbbc0965f605872451700f72f711b3282aad7a42d02806eb2f3d74daf57284e17b4afac34abc4447dfe45c8aabf9f0995e7fc13f65bd491cb172a0f7bbc4a056c579484b62695e90383358d605307d5be0a548bbc23d0d0844b6de1caadab02e21b1baa445f51e28e6c6cbfe0c9fa2953889d85ced8e9bd66f71f8f1cb9cfc94175a1977fb46cc3771047daac82ea770ef9138caf09a3bafbb0bb41d25f2cbae30dc2d6b8d46b0e45f54368142c6d3138c2732aed34734bbafecdb49c0c567a4f39fbe2902db11583a20bd2b814d6fa697b28cb09c7fd021d37c351ca5fb169fe90c945862ef39bb89cfdb518dadc353999a0f775529550aaf24893fdb7e21c7988976a1b6696e34d5c9589b6fcc1740194683ac052d0c9dcc4aa1596a34d0438a7f2eac0531f9eba575fcb02e94b3959f20b0f6b5733d03b15843135b076a3c47578220572f2209813d8e39d2ebde7bb38f5dfe6ce23063e6b43815b5de39d955773ba6b44b30b6f188d8dd64bbe21adefb546c32642ce6f4c8470680a083433e4921e5256d6d197ebfa045ebeb0599a7cc5be70fe07bb462fa3a8fc53791a18a33fb86b17d1f5baf48af186f639020976b3b170c3f63f4b8b4d8578b8aab1cbf9f933061638fa30d8ccdfff90bcbd9343ebca530672dcf7f5de807da8118dc67f4af8c3c07051a1ff3c1a28fcbfdea09aea5398441206c3e5c3346ba042208099a18414a51c8e86de655a83c8b6f7b9b24c07a0eb586f47d1b81bd34fb0fc82ef996f8932a22347fcb4fba05336ab57406d311d8aca58ec40199134f4e28465d79f05920785926de0b787ff4ab34bf1bbda7a5ea0cc7639c7645f114e6b5a71e82f00bf825b6e8110f98a010db15c218b204df4abf329a8ce24bff89a9fe16f97c5cb72317819fa03e77c461ab57e6f44cb16702ab2e5c1dae74e4b8804ab977cffd04aa38027614ffdc94f004415236f278e41aba05d1d5408849a953e3b81fe39b9b946e8193f3bc91b7c4cc1a2f660e1fff98d3fd203f014fd5630b0f3c7a20fe23e9a3451ec8dc5cd6e5ed2ba40c076f5f86dd6072e0599131ee8e176d0eefed45b1be974018c706995c4dbcdab14530acebc274ee42b1150452c6437266b631a9f5a7bf206de457a730d614f9dc302a90d06982bdec6fa4f7979ada7407de92f6bd4605e84e9d16a9696e7d28163024b13cbad10666fd06b2c6f1269a7bd0d8d50f83b0bd44590d4610ff3d8fe6ade8b7379dabf239c103dce7b56d0d49f3cbedf5460ac9d68102272c709d57d40f3c4bcafa56a9ec25621d00cdf8f4f9ae33e7767759348c7bbef4c5a9e5a868bee915fbb91b52078fed1f1b210f78136bd76a9afee626eeb00954e4925da92b22b7bcd4c2421512696a873f99f9c12091801f6ac3f9c68588aaef8f134d83a4a36de95dfd131b961aa200751d00f6a888f6adedaeda3cd86c6b6ed114fc5d5caad5439d53d68c1b0a5d30c4956a3f31b701be2ca8d0b16fc21279af7db360d99db5739caad29027a163bf34e980c5458869f72d97244dd3f368b73336bab4a5e6d62062ec504d44477b56cd018ab06b62f502fa651f378b6835d16427598048eb00f3f8ff98eef9646f9d98c5d0282cad6f879bf806981f88416e4a39d8ec4816fa9365cdf299ce60053b9c1e99540ed29d2d163a249718ba5337ee527e222fce8eaab13ca6774ca306d9e1f22f5c9b37479d7511c05dfd6835d4575b9447847a82dde536fbaffa95391e702bd8695b45377fc067211156f9adec8d3d6286d0849fd607a23a69619f68b350afdda3d564347afd2390dcacd5842799de30059a53ad3d2267accf0727593f8968863191fd0536362d55e68564822f822846ec6a4f74b93b6f96067697d56b243c1a3b1776735c726db8566c0d6ea95002eb64c8e0bbf35ca143393655a4df2815e3ebf0394694bacb0154e63b11400c5369953d6e4c938ce5fa8ecdcb8e429dda2767a3ac4685152f770a7d53349abd0506a65061ed40d423022dc55f5b3c8c732fd7b8393ad88b81639eb8be9d5f6bff0bbf8a2167a23a43a43fa67bd277fcc74364b747ec3424a90d381fe415381e29c00a72168262c92e28ecf686bd98f5c0aa36293d2242e98fbd013b2d63cddf6b6cac90a9052886cad65b3fe8e24a7f45ae749685a5aae11bbb20930251c5b5ad58d06c40ba9b7b00f5b508080933a33f954684863d1314364ebeb0c9a5c8a9d7cd9c8f456764afb9cf21da50fcfb6894a8d57da8b1258bc6c00318ec2880c2d11138801ed52b2adbaac83c27824bd72d2f490853cb894db4571655d1a29208836ccdc735cc97f54fcfd2b6f562cbf6f272caaeef51e762e95c20efe2dba983d62883edf0145017fe8666d0236522cfcbb87ef5e40ce6d34c16486c859a6b3cb08c8179b974ff98cf17ac131753f86aa14b90689bc42fa7c4cfb75624a9803afbdff0f3f7b54c81a9c9cd063af4f7cd5a71268c7a416ae63bcd943426ce91859d6af7e3119fded976e5f132f40fc502e07369ebea4a3e99985a088ff3d246268075bfd271fa5ea81db33f1dae6e0a111999800c54a953c7c3bc3beef37c46248a4770487e8e73f6867be051ced76f00ef2a93771e245278a33b54d98e963a87a52a31cba023c6cc9985fc56be139bd94970ccb5b284e3b422217cd82ce6c958b8642ae53f80fe313e18bab2e4ea38a40eb1514d7690ad8427b4da7435369c9eaa3e841dc36ec42e5d7e42efaa23eb6728364ac7d41259ef9b3e9734114c5a61650067fb95b5c0cadefdbd9477885e2c7e47e0ac33d08efe6405daa128f0aca9d0f2fa081b1d990da9de532ab2df39faf82b3a82fa94f5b86b52cc41e2ec3a7fd35c66cbbe6ef8ffa6692b38c5f123da7e2c82d493243625986c949fa807abea5685d2cde66f84a9bee56e461786c5d2f890dd276548f84dd49d5c40e008a8f341b66794fce9e612d79c43dd1066c7ed4ea07505d8cae339052b49aef4b8d8a17c374daa66a4c542dad4d3841858d03069a472f55471a0f0145f85704adfe4fcf050ab978e68ca42b0d645c3972588a52fe4fc804104d77aea81380e4c45730c8349a9e1dafd9d193feac222f595995389a7392c074c2fe06dd9891060b12eda1e697112b42ae5cf7157722a9a70a8425f3754840e11512987aea1fff0ecbc6daaf928b183b84a6d2d677c62ef7e607b9ada730dbf1ae55d1f4aa86363bfc7cd0d41f947af7076fa5a6009525a87660520d9bf51803192851df3c5c221eff40331890a5ba0170e7ee28b4083445265e8db7c5fd7ba1c00a768f220a69247ed16fc198375bd78bd02ac304a7c16a8032db20a7b27d6a4d8ceea8fe2961e8e5a0e58388d1e705a298ca0974ec53651e8db8ccd3dca3a91c2ff8a11331b2d8be2f42c3050dc2184fa27a60775e70e15bdfa530bcb4750ab654430c23abc27072ecf6047f33a36bfd9d8a6cae76904bc2a93ee0d4d267fba6aa4c4e8200174cae6a7dbc69ebd18d36ea98826cbd3820dd6ac451becf02e8578282fcc0c727c9cb18487f57bef2f8860a1346449aeefd16a50407ccf2cc7d538d657b62798a745376f4b1baf57e3a657c893cb8b81b3d08d84c77a2062b17252b825ed99fa5e8c216f0f81657d9df4fd278ba5b6d436d2e852c25b041a54246dd681bb8920073b178dbb70c3eac33bf7c50538f530df9f23c11968a5dd18b3313654661f930c18c0d0382ef125bf43f0abeace6e1b18fee5d9b4e92b3265e648e2843785dad3ecc5406c0318b6f7d48edf20ad491f49b9d6a37b26bea2a38657e2fb76e07dc67ecde540396026d5b6796b911dafc4d8969f26576684b43a5b093c9f6b5b054b9881c89c17f0fcbfb05a562368c8912e5ee86b2ef3a8f0922d03fa5a5e1bf9cc0089f069e4f1c01f8cd9a9c0d5bb0eb3d85878ea1350de13c4f02413964be1b07f8c658de98afb5c109d6b4fabb1c3cfce9857710fa50726e876c0b25c11465fdd3330f26ee434de054fa4b833d139eb065010ad2fcef231603dd81ef895ae41e225587eba26f30d32965de3b544f76d4a27a984baf3279ef5ee7341b200a4be560ae51b1779c051611b9db8783185bf60c52ce0fa3e2fd36f319a02d17aad3e008ce0b0cb05241258866c1fc6c16c4710d3a0a835d5913a96ad54499f2a5329a95150251ff1a6b8e07ed200e51b336f24f90ec4b4e0d539310ba9fe62391de719013d625b66cfabc1abd8431e69629e62de7d1bbf88843a0af2a10a63cf93e01845af4ec78b2553c3b685d0b9d0823b942bf5979df425a4e70b4553ea123e7c6ec5afd3ab893219ae47e28ffe7a1ab080877f1f984e40df91fe9cc23f2da524e22844d84e877e634905f568358fb264ef9b219cf6bb5d53d072ae3fa946513e3e167746f9ae8f9a5d99c844a536d2bfa80fe5f4006505686b1084b37186c83448394f03f426ef27b2aa630997980329758ad310fe74bf862c7f2504e014946cc936d4f88716267010e1cca153ddcc0a1cb4f2d838101415d967991c3c193c5088b80e0dfaa6badf3fe60df2212cb6ca66364a34f55f8b7d3b72e9e1cdbc49464f65062b940035db06602ee649ad48d11bb8e30d7f8cac261a461c3ddd2642b8e4e5c3389e491fcb2ff83564128a0a8803e1c6491cbdff783e8b3a17b27eaf0d10e14d1d60acfe1980552c53c6e88455e55afad2151b0ddc6eea4c5695ed19ad9b01adc3224f5c2cc2201a9dabf23fa18bca878eb2cd5db8740a59e4ce9b07004decea112c5ac06cbc00082909cdc2d5bbda76673afb7775169569a8a5af016eee4b0ceec5f6b341389efddf2aa495573e32ce44f7cfe47c1d30858a62518f5f45c51c44374bbc13fca101a7559d4191dc79970c2f6f2b345085b3724cab3a3b1b0320fac880634ad2b21c69d1e04de95c58d9a92b03d404793cfd48ace2896a38ac23f8c1bd304e8079570de79641c988769d0233b468565efd6bf4ca21055464692a266a2cac88ce9db97bdfe7a698267ceaff8ea96e91c96f045fee8e346167e23f6c0af25e5e86c74b9c01fa02beff11c988860c6e1c803ad06f6051a0fa08be69b2ea3ace396e9e145694f8e0a3dbde41856102f0614b07d70d6793d18510a6b1e0532a858250cb1c92e208c5af828a5ade68b57dc7f47e22224d7c4e6c48411dde8bea0a9ff2f56b3931533b4abbbe1c7ce34d9cb64146b89458339f157538b894daa3e5fa1cc50a31ca01c9dc4f2290451af1d696fc08a14dd1e14cea623287ea8a7d9ff998e20064f539f8cd075dbd2254cab2d0eb6be63300addd51d6d894c9e29fbf062df655b8fa234e85a918acfbdb00b8cad7188e302cc0dbb498d2e6172932cd88a2a6111720e8556cfdfa63b9f5ba70ed87b6a12b9e41ce7a71c785bea85d52e7c09c3d68b0b095eacdacec42eb2063a1c5ee280b9f593c0b295f7aa4a749d58a4f80e193f2a29568dfd54f80055c184f576829ba7530afcf8843ccb36d1ddedb17f9037f2ee7dd4cfc1e925a8a93175d06cbaf1f68edae2e561b83d14402f541dfb0ad16aca6f500ec2fbfb7c4f0e9359abfbf22c2b9c2905a8ea8e87220a324714de63fb30866ea77afdd81f998153ddbee63abc9bb715d5d4541df409e6fec9377b7e28d35b6746547f59f72b623df91fda2a2c71c46fd27e8599ef6a5e2020ed626e8805470057d9e0ef977709c82839785ef0203c6d8801ef50ddc5c82cca9133e37d58e1904885d30774fee078d7a62127bc3997b56308f1f143aecdab32ed604b8d40a3bdb4f2b63014459ec6a3e06532c5105ece0fee4de9b577c6f2063c68253c4f15df197b1b07f9cd9d380972c50ebf670a1dcb3c53b8a7c35cb79128cbff1ef6a08ae2b961ed9a09545374d7c10a1f80223b417d93cc9f13f752701d0c3789b9ec37ad283b6f798b6c9f7279d9b34a0e2f9cef2c9ec40fec1f593f93997d211b416bd53207fc1cc63e828ee38f98e3639ab940c3c50d8ebe3d424c16f42e599d589df7714812083c529326af43395022ec26c2ddb7277ffcf9941231bcc9b7a29a5480608c4fa0704147e637a4f334beac5c01c4e590683aacc54e5e53edafed7f161c8a351399e473172a171584f5b953cf7a23c0d6ebf9ff5c4d0749f8c6b08f690848e2fc391b60977eb8253d07856af79874e9795fbd39df9ac71f7980ae33a3e04706682287b23f60b554aa0eb55a7ae932bfe657f714b5b41834ee6239147d40ef2ff5caabb0755c79144a6fcbbacfe8d7b4ac5929f88525653ad5efe39a5b86bbc013b61a13efee8de4acaf2b044d13fe8839c7e85db46b5881be8e204da54e375740693524f5736e663f4175bf98f6f18b2d4894dcc9f24cba16c191a700f3dc560a589f9c2ca784e970cb1e552a0e6b3df54fc1ce3c56cc446d2e9a2ef504356ceff8bbc20bd78c1eefa0975d76c6c6210041f1da920551a12029bc4dd81bbcdc5fee0c3f09afce571a66734115cc9cd4fcc3975a518a6760de476aac4096ed54e89d237bac8cd6227f9124a87d6c49ba394944f6016297f4061c4792b5024147088a74007afb3e119d954dec1432674154476d16080a4deb25fcb5c9bbea43233e4a8055db7750a4d2f7318480cb702abc428232fc0e03a6bc7d5799bbbb8d89f831daf4748dd84cde4b821a3973fea6ffcf26e553ca53c748228f8b3af26aebd4e4e654acab1f8a1de6b215a4e86d769d51bda585eba8cd4770c026b02b75b942d8250f0a5ba0dcf07d43ff698536fa035ed8ec28de9d1938dcbbf4c1c33882c090398c041c06c61463ba4fedc705a1c06aeb31a30f8b3baaeac56dd6562dc8ec8176442078bbc5e82e778fa84a341e52ea770e9b1b0dc50c1f6efa6460c00c15407dcff5de2a6cfa521e273f7b5cc049720eeb677d9f15dadf2b43025f89bcd931b2a7eac8ed2bb96310af09d6ea28027605409ea3b9dea5ce8cb026bef56bb6f9a73475d58e72a3d5f19f9de956c61c8b1cb6a729d86fdb51f5ca581b9d992cfcee2e3d6058e2582f3371622f4d1af61597b6277c954a1a0e1909fcd1ecb5a9afd9cd981606eb24d348bd0d1517a73d9a18b786185b0db05748e7ab9e6d41cba70ccb1c53030dc866b3eae53750eb51ad12435989a42b5cc217fbdacd89ddf166f98f4093c7ba815e077391028367b0b316d2084d0b136de308bf10ebdceab96412829b74df820e2db5ff771319acf94098fc18eeea56621e9d99d465d0f882230a5d8362b4e4bd6a41e72dc5ae1b89da0b1a01cbec84e7e949249be80067fa282378aee9e2631d782db32ba69b43f0e3ffc469806bff5dd78dd7eddee5e97fe8005c5476e28dbcebfbfbd7427ba6acf2e983a688f356427dee3c20b6ebdd91e723814a962fb50a4a1f19d705c9c43c9b5ac04f621d0a1420ecca0b0cacc4beba0f7fc7c4448983f71995a18d001d2e21c602da88438b61850bf9d34c832f74b516b0728dab6bc8976e17ad34a921e03aadd3ce87f16aa90ece443003197e527cfbcbc15edeec369faef870894f72f15a84bb91ddb1286912964197acca51c686011a3ab4497b5c643eb092174d70dfe5ed22cae60d351055167a70b6302a4f44d924553a95a9b8a9afe8685b3dac1a814981e05d60213d3aa14761bbc5685b5de692973e2df7c9c4750889c19a952f912c817890546d5e37d940d13a14ac7925abbd875b8cd60e4920896ce6decc8db9f889da2b5489e1d110ff459d88573720bb3d8bff3cd4f4ac34e3983794a2b3505003ab8adb07669b0acb45729b0913f3776b3bb5b8652b6214cf723036c84ee8a5a7533b62565afa093d4745e7327e0272ff0cfb7a17010f5275b16d4fadaf077bbd67c984f74d72aeddc173d753f3d23041865d1c5b240870aeac4b49b3622144de6f91bd7aac996e255aa905fe03e721db2e46f9b1e2e1f1b2e966af79f6ca8382c130665106d2c99c6941dd813cb5ea346b45acabfc30582aef2c0b71db67da4313223a0acab343bb73dad89dfcc2dbe5d3d5afb9ae58068f2417c83b8e8d9b87bbf3831886cf5efb00d071a4c2928957ee637d6b97ddaf583ec670279eb059c94200ebfac96b8de3a6cf53262ca97513119b80223745950e85949dd67a5497904bf6df31e13c52fdcc23d792a97c219fe3ea628e0b046a2a9f2eabc8bffec7751031d75e8c9640b1f77a899ab79f0166ebbc9eff91be9124f1e1145ebe138bd0553e5ec12a2dd9a8af3fe37ed566b7008f9e900759c89c96144882391347374a7198e01a2857703a59e07fef918794e5460ce025c1a6fee67ce15fc85dee6c3c0bce15ba2597b6ff8e18a93d6a563d8db593f9eb67fe4aae9238179cdc9d9d3d7a4a3a3190831050c2251a18ce77138244a067c8cb22e2570ab934173db93cb74399f801079e1ee68ca22ce24c4ea93b89ce943e59b958683ce15fd7ffe5ed420e29c9b8e94d3519442c6c2a52618141db8b19cca2263f6abf4cd54f7198016610a619b9b414f5719f1052617f441e0dd04262e422fde9c6f8585efe51442b8c216b7293f689c287e3ea6a28316ae2280ea0fa255aa50a157e9037550d7ece3c86f66ed83f103eb4b9373ddf073a7008cd1359f0b7bff2ceb88108f4149c6befd7d368e6ec4ccc90957328066f573a28b2161ce6d8a3466b4cb73e5bf541872e8a8efb509ca3fe93ff1ac32ed835c31044159d682bf36763918f61ed2df2926115958095be9a37475cba99c8e05a8d5809be56153034f8502d85fe282d3420301f63a336c0a4291334cf1665064a0b58696cf14e63cc5bb987477dbd816ab313fe95dda4416626902dc4b373c868cfa9e9ade994554e13f825206afdb91acd7539889a7ecf34c2369e380b75854b4cb500fd9987831eb3a48dcd406942c8d1dc66d86416b8b48e8f1c9598faeb65f51255e89b885bd2bd37379a88909d0952c1fce1b52c9c49de020f79b674695d7b4a4edb6a276dee8338a904bdf44630d2ce625127f0e88953281d311e626d7621b562527fe537e6c81158b86b14dce3d45a4d9317243be760799c682b5586649aec16ea6732284fde69dd11fa72afa6d9ddf5241d3704e8986f239b57ce428d4976f31f9a9edd8e48aa9cade68e5cee55f22f809499b1f16d8139273e2d0074afbe8d4e949bb626994c1de8d9d8631ecb1f233537dce1b6524843b848f26eaf505b2c13efb950ad32d6d75f2ed130dccbbd96be5171029bd93ce9ab02ceeb81bda575ec06682b86c7c36f7d7019649cba65e0888be6a31684d7819bf612e5b05a55f1537338a547aaaa3cc028016cd329a0a72041ae21cac790a1e78d5f0bafb8c504d6a09b5c646de3d5c3b139c8149be631121d483d0d23f0c13a4313bbd44b7b46d22910cf618418a104c622f4d573bf34ea794523621c8075f0b1c184c2a4f12df277396cc38fb144efc14d719a639428f5d015936e33c836a753f8d4ff37cf30a41565b31ed33637f12d29ccd7cdfd63d0cc49fb95ec3069caa41a5aee865de5638e2640b8011fd0c57438751225539c17c852ca5dc831a5d71cc655151335b2bd3c0b84439be6c5b93109f8de0c4f38175eb09e4a3a746159485d721760df2f1db985fc2606238d68de0ed69fd548ae7bf9e3d5cfb55132cd91602049e1c2c101911626f3d24e7e40f5c77cec32c885a2147d0f72eb5070a0927eee3138890f052d4c831182d03ecdf2c47a278757541658ecb9b83f1ac17ec5fa4a71b78a7fa518999f238a51458c6f765cf6556d706511a3532412e8abc49672b36ff14f794ddd7de99e6b3a08f8c65d73bd2f83810ae9416a3b197275fe9e68b7a07860a27bd669e0e6a7f31f9f91fa7d006821fc743a376d61b510d6a9585cd5a7af3681cbadfe1390c324efed5cddd744b1d1593daf05eb3c787c44313ecf8bda28697d99ceaaf0214f48006e7177f11e7f1a1dc3922d522fc5fd2542bc2148dc56421c82b2e1151c9ec4d79f8a3978e23254b0a29e2e40b0301c103a7b02ab12cb88e502e540e0e744340bfd01c2cd347e29b8572d89256249619ba4e5d40111fa864d86f03af215d20de40372847c89b4f1ab6dcabe7eba74660e0e7726195e55c2dcab4e4fb72ccacb165f56fef5567954f032f04ebb2d43820dc3b969225c8fd708dc69ffae9090f4094d19a2c62f2dbc2d5328aa794f395e0181272dda90eb3b6896ddbb46f5b701336955106d7854afc95aee622774b8429fb33ad490900a58626704032ea0cf7b3b4073b869c680a84a96cbf6445252e82ed68f0de2de6fc68cc99777b4462cea774f001b399e342e27b31be76e4c9bb735677e3a5fd08dfe4e3ae289763a61a77e0174b96b73e1a9f71c88b5f3e7f52849f292da562ad7783d378fb8f311f06ac5f46c035dcc0bb42f5f8cd27398f1b3e2e4677e7421feccc04bf966a9417b7cd5843089af1b24d536e882cd7bf403f286c96687187a46548df4ba43076d4586235d7cccddf5cf75b44415276b7dce6cbc1e0a94d17850a7dcae3cbe9be9f0ff35dcab4d48c06e2e1deebe40c08a937ad96eee183dc0a04f52e51b39e54c0040938e467b9e2f8366da64e8da29cf05b585186b919bc7a7b38745b0557207f612b2eed8e84c8791a870331f33e5af87a545c71d919a11f96cc02ca691a09244be2a7acd03b25d3b6b85d5dbeeb2a0bba271d77e88a723f7e3b426586f1faf6ecb50bead6e8e34c33871d9b97aef46f465bfe5f8f7517235b0d9af605e3d83e6c2cc26f4792e92db97da9b12691a06d447865f375e1771354c874438df88c45f3cf3403cc421fbe6f206a67129b174ddd04bcf943d67c5691f63716c739fe50a827ca6e0dff6d467efbc88703d43f5738896a3aa05d0d363b1e4b355bad16aab3bbea77b1d1bb0f0e932cd7a34501d37e8ed77e357c12f97ac91868f05dbd9a3d13fde861c0f15f4672fc2197f54608d69c6b8da93d74e8757e06792e4fd9676eb86c87c4d5f77f4e1fa22b8aecf43f693a8e2ea5a8194b55c57d2ebf8d535a6d319e1d8317b5b74f2284be2233f4c05ef0a82bd1c4ea6a4126e551481f14bb6306fa71458f144e71040ca107d12fd3de46214ad499cf8c622aa6a8740b03d277c0ea4db343fa8edb4ca09ee2ce8cc011c56154572fb1fbe05828fce85b07e6d2e6d477743d50bdb682aa7b5b33f2ce1ef4d010018f76fde239d3144f170a409b0022b83185ff24292e910119074b462e5bd7487bc008db905310ba4f45f329fb973bd89221ee0b5dd9bdf8c5527e706883dcc26cca4ddd133145b490efaae71a32879f3e1b04b9790a9628061d7394f5f349477db62f4a9358dccbbb1c16c21f596ed5de7b2b78a64a8458856f12fafc33849f568b956c37523bc778d521043294584119474a8e0c20ef52ea5043eaa6ccf7929e51668928a5cc706e21b2f37d6cadac98894844d2143fdcdcc8eeab1b4508e8fd108cea8edcf58e4608b2d92568d5de03480fe221aedcbf03e0fb868226 +0xbcf7e3ac677b340318080a6212387096153ed60c24b1ac5c1744575e7f94fd0363d2e0ca6fa4d7445924963aafb47cec33632399c3533bbc144bbaffeeabe46f +72304 +0xc84f05b80fe8318cc378c25a1c625cc08f5ea853abcd5893414a651ec7829b23fe45581ad3dd91b2839e150b03be16269f67e59ae10bfd88b4f843d0c92c8c853a6a609f6e8dfef03c1d9f5a5320ff3ed9321a3752d83309c4121bd4182fb08ec4e5a4afa7a1802e341ce8add32f20f184e8cf94c6dd03feb7c076917c341024e3dfacb347c11f54b5c4766d4c948025eab08d1805c2744fd62cdb6fbde3b230e18001111794e44b053cd30387f627c351b3da2bd62e8fe4697bd2d6a2e3a09b04ef2a33dcc3d6f96cad87d549fe1eb40219413502c95ba5b8d8e32ef5dde24b9555af7f61f5fd47343f184d5d546cde4509479e523ce07b0a6997df7c787e2adbd9195f6dd3621da31910d28a9f192b62ab76cf8b2f264ca9567551005d7e1f20a4ef3ac7050c640364f7cb97872e82a028552e78493602dbc806ed4833e911aaddb978383203029a4753a24db6b2ca48a86c24e0331783e9e7d0191ea3c8eac3ad0080880250e1b1ebaebe74d1adeda252441a8a95d1b91bda5d3e48552291b13c4abc7f1ffae78f788f87d48328d2f64f64763f156d8ab8ca35c58ff0ffeebcb12293e42e09fe7e157f65347129618cc754a1c75ef2e00adede14bb1d68e92e350d6d81da860dc4ea05c05d46bb82abe19d04ea1668a2573fe2959483636a4def95b21cc878fcaa20a90018a8e31d9dc5c60670e6d7b8e814c9afe1cbfb59630841cb7ea3e7b378dff38d2b40ab1aa89c570e20754809058619c96c9c359eb6a7991e6f11dc19764e6cd05eb51a61158ed986c36cc27ff5bd5c4dfb9f1b218ef52614b7ba5d18ec969b2f7baf38db2cc2d3d521724e0102e019a2577bb4cb351a6f161d48759721de081348d80e6e3461cd630230f3787217d93048d90882f23dfd8a6a60297f5e4f3ce58fd5a30377924f982e4db9ca8e8c235f9661202f0c8656d966ac83b6eb11be0b165100833b7ee2dc6c72a8e09e647f9708ba03bbcc1e046cd9d48a25104b16efa6f22bd4c94c0d978647c9a2eaca7540678db90c7a2d8faa8b8046b41526cdf706602ee069255931427323f8b9e48ec27b814b0c5eda7dfa4457c04c41c96a8d0044118d62314d12699fbecb55da51850c3fc0a1bf4e58c6cb01ffd3dd5c75185a46dac5fe9771a2c372a30104d547f2e26e20b5e7b1a775e9270b3331097700dd0d936f83804d4a1795d9840ffdf66fc4b7742f1c2af36f6671ed5285f6f7ac514243733a136a702faf683abe79e8657cc2c3f7a7e1c31b0a86ac1a214b7d867e8cf3b96b794f7ed169590d5872a53dd03615f5d0ff9fe39c0f50714c3191f52b94aa285ed984dac66bb3e4270fb35d89bc7211deac0f2ee6b3e24150d0bc61220270aa5a5c92eed55c7ea671799c2f6ffbe3331b0f9c65ae1b6971734f8532297d4d26a92a0020c8e5c33d7fd7e819499c6f43cd51cdeebdeeede9fed675d109ad4a85916a56da66ad899099521d85e1461f293d992b32dbd57791398f12a48a3b6ead5b451d83765dd8870612c5dafda2facdb3103d99cf780d516ba0e71473cfc2874ee2dc82c19cb80a103e67806657081776de8b8c637eba11dd31798a8e104cfbb46a1b410f133201fdfe8cdfe40e51f0d02a9d715d9083b9d86b526ca1a716f2d304622727694d54167cbb5f3e6fde3e071cfcb186557231a275f923753b2852f5d93a9cd34712eca3dd7c683e21b6eb64de2fb5a6768e618378f618d275880560102a08d95587afec4c5762aacde1dd2f95bee4859adf31c59cd2b27ffd40f15cd2bbd4023ab68638efd5b54b1a68feb06c32a5ea6a6e8aaf081458467a580033477366169fa759d1ee7dc9e9b152342f8911629f8d425288e54474ed95d6192b96dd27dd2b6111fd72d8064c39a769f314e6826aac6373995aea6d3df5c4238ee87e7f1f87ec9405a36cd53b5b6f844536366d146fdad32a908fabfe422908a264e0d7a35a50cc31a8c49c7fbfb36d6d168b8a657dae5c82afba96f8260eafb0338a95324d95a0c8aa65c4e00c7b0cb3de6c43247fe7f4ebdef496f2477a00ff7c04239408c4f714d0d9b626ebcd495eb362ff1b1c8e85ab45c413b64d75e3d968d7e79132e5bb5b43a7d91903b30cb8bff42710fdaaf60b0db2750ae10840841f8a4bf073fed3e62a579481fd343d072aaa21ccca432f535e4624b7ab39ff49c8a5b57b751927fdae7151258058c4941c0c56172a6218cb5f098885521208708bb08ff8dd3d9fe7f77e77ce352889a7bca32eb8c50d99bb3982093b7f9b434191344030567323ee2c066e44c3ab748832f61279444f9a6a133a10a3d9db990402b930eb86c29b58758f9d4fd4ea6e7ea78d68204f2d032116b7038309daf00006c5c7f11532ef6efba36eb70deb5dd243f199768db1bc286a834ca4b6a0327ec3e26d09accb0778e6c9484318b82bcd2da90e43a7e2adc7362651ce893645c664978afdf396cbbe5e8a93bd9d59beb48e3d2e4f44c8bf46a2267cc829a313200f6c8693919a24878a6cb8eb43d400d28d3660610d6cd8ecd80d345c40ef82d4edeac9942fdff81d92f91d95b333d76e531b0e43aad5e102fd62e05073237c292598bbc7746e31c69fb92b85957e2dcf07749fbbc20bc3d03caeea6d6c45e868dfffc5f6094eb5cbd9334a8290bbe93ed2ca7b92fd17649ebb78b97bd360adda45a54de795876e7467efe3534cf4f303dca30a900500aeb4a248b5424f79b5c47c14bd63c122420871755cc1723033664c8ab37c7fce88591aa64689899ae771afd47b3235261bd1214e1f94aa7891af4a04e11f168ad9d74b1bd41a29ca2b28046bf11c989be0159d0192949bd3f525009bf942703b8b745c2ec7bbd6126930a36385e9928a791d0d161f88ee49471194d664ab35e9857975688735387889d2b544a160cdfacd319a152d3a4ae26fbb2e3d8a230e9caf2ec0507c50f80774566294ac4beef3c6986c87237058a7556bf759d371a35df1da626e0fd3bec41004d1dd0e70a07d4b9caaf46bf3c09fe16916b1a85f9b3333c6864aa68831b946232ba62e9789a145837ce26c8b29d2fcfcb4ce6fb39e275d3b526dab35faedfffd9778768a51669a960bdb8eff3b498c6ef93692365640577fee5e84a3c16821d83eda4d10a1d5331d7f6639199f0b7a050c7377b0688609da83a59b9a2d3395fd48541bf021f4f860000cd59ffd20af0a160d88e97f015c9639cb56e2e65544b4dc6e49f378cdd1a6b453ca5afc9112c43e8a2ba841ba36fa37571f4295d6154522b13de14e68a739c6c6811245658a7dad74cab756b8814da6d15d83e2bfeff743a460824dcb605f5cea608f80a4017b8a52ccdc670323d8adc1776d7417bc1367d01a9d1b00e6619f49d09854575e08fead99e01ca406e375b0d7c8f4e663e1b5bbd4fc600f1f87b66a3af76985896a310c998a1ca210b52626e45c0934cca956eff465c5fef518c9d50472683669e94af734a410052b98e7a906f15c0adfb372f4e4a1f1d74f5e021398d2f972e8cf72f6d2f49fd63ed2e0c3a54e946f844630500a788ea2149f87ab5cdec342ed62d092db44721c30ac3afb293c5a6ca3acb88dd0b141652e248025ba606fad61ec8d52b75a30dfeb6e1dd9fb835608242b33329d16b42a8435160a191ea4bc2ab3d0bfcefe82275660b0e681eb2f4bef0cc9c8d86d8ff8fe1970e0e0e20b763100c25f88fa10fd59ca1ca9243c8e3dec97a1d6eb7f79d8841ab83279724ce35e1a8abd4e158168dcf388ab4c3d1ae70413e4e43d141bd0fe7e13854b960e0b9a4b525e86167e71c7241d7262b77c501dcab97b36f41deb548eab63be18f9f7cbd93fcc9ac6ae1f02a50388cc725b80200249223ee6262e6f92a8533abfb6aeda0d7b8ef0edba7a76be6175f4366080f604bb61bdb3dea335d232de2752ed38b02f2e2cf253498a09b75fbf40cb3357851838c01b23ef518f956f8aed9a459e33877f2e06bf0458a4d727f01af87b0db785e8c8c0fefe4065258ae2f45f67e74d5c971d96fa92eb3067de8fe986e0ab7395f200150cb679a0c8a96ba568fb1be5f89e8109cd9d4b93afaf25153e0c38a08e7ff08015bc0326c7f5af667fa843e3a1bbe0c7fdca81b7f7c03906e5a4bc28b9b6216ae0bbe6e16a9535a06a16652ea016c43855c3948287395323465340f25ec01a3c36592bb8f8b185bcf2ee8cb03dd8b4c49c308cdea643fcd628bfcae6c5c4635cdf3ed992bb732820dfd8bd50bf2939d399b872b29e06ba87529065ec35eb8534a313f859f901a536f97b02f67030dacd15044de6b5a9189c8d6f16ecf85d072a4a8091f4fb8384650880628a96161f1ad8bc256134549b7ea104e7ce544171a89b2caa4b09224e14d38ee6f57a029022aa87020d6331cd9556f6df7a92bf4c155fc04e466a058aad234e941d641db64d530dedd18965354974ed06d9f9011fd95ee382cd6856c097c06876eb9b8f18049af7ed95ef1b5b03c29365d1d32c725c603e50c8493a783a72839447697f3ead49ed0b41de79c829098d034b666bce052d79bf1f56db3bfe0147f41a1415b1b226964ebe9ca703251186e930fce4b93e8c3bd7bad761904b345ea04ae57bf879fa9bbef271ce945da2241d66dbbfbd6f472ca18114f40089d46da0c124d69b6c8ca363c6a716043b840fa9d74b2562fe24f5245d54ba1220a91ffa65195123f1a657462285a6da257ef09469963e2f54ec3e6934e1de4e787b19b8200c1117720e5f6eef52a79e855a6fe7060331acd966ae76f001863cf91206e2d94441ff568d62e3135740d9c2de33a995d92761f55cee5577fddb650c368c7e780a076405eb09ae78dc9a1244d3e5e2fe6147d71194a60eb31d045017ae5396e4a68bcce7f0fbd60428dcd173002c9b29e3ba9593d87da78aa82985844304310760f6c26464e063a1852f9eb72fb1dbfea6a723e5ee1b2ae6e8748db9bd4758c87f70cbe40e625e3639bb0278261caa65f4370a6d9e299eae230bef20e4c3120f4d2071cfb727ceab8da7841eae1410461391d195b24f0ccaa216331f7f2167c4102f3b8d27d7bbe8c91cad118f4116894cdf00c4f0347b21adbee22058085fd011c5b186261b2dd4354103b9914cc316e74620612281f39d8b2a838a3521031998085c227c9b2d59193f107f7cdd20d52cf0b8d60edd7d2586849ec5df145a88ed23c3caf0fec25ebc3d5cc9179b33ae6305508a7df11fa2e4f1bb391e886c05573c6fe44cecf5cc67646d002b2f068ad3ac70e53665e3faee9b634eb92642791f7ce6da560fcd8962dccd8d8040a14fc50ea14f03e0d116ecaa1d6c7a95e3ca8e0ab212d70c527ef5cc04d6de770ae781536a30aa0af0de264672fb277d57e2ea0f5af6968e8c93685c98450d7c4b384fa254f0f48c483ae395e9638988a7a77bb267ec5d3b84b102b61341d4f66c2c7723e6f7a90ee1136dc20a0c685cda038b1c605ef2bb41be0cfffd31fd8e73aa4000a8ae9137c44f0af35d5e8ca1f8dd6074cdb31eb7cba3ce62dc7f4eeb6a99f45e227b73b0f8d803516bc2bc000a1c43e33753a9d72b4990053a9290b658e3d968ddc719208594a003bb9ec22017aa7c9125a65bc268979a109ed28a96466f374360fb4930746d2831d55b64ab276e53a51f14fc218a7433ac91a706343b25581a337dcc88cc4ae50542626b4643501047ad05539b9acaa5019a79ca373fed8313dfb76acf95121da5891a9e9b7138faa158e129d99e80363641b0a0485aafff56eb0feaaed7af193932eac752bb0e5ad8a7104682a17e2f730eb44e0f9553150cdfef16cc9b0821eac63cac1329ba781723fa723fa8acd8e28aee9c33f7c10d5d44beb4d2e8057cdfcc771785c2259c84520775b8bdf278a83cc4545d89e22f70a0e48d67c78e7442cc02ce508e350e47bea01694e73858f0ac9f3c34529cc26e7ec969343f8b4f384e47991d95d31589ef2b1e7c2f66c1e063e81e615ad8107e63d510e058e456ebdbad4294e0e8fb726c1256179b64f9a0e805c08ba97f5fc9d97049141a82d183fa9c8f5c765a0629bdbb830e361a4859c360ea5b4877f8776702dd788e4b0827347c4a1e5f137fd76a9070080570f8337d5f66783eaa23af96f395b3bb28420010b63981a4f9aea3fbf7e4ae124f50559d6cfb8c93fe2899ecab376eaa01c93616b0252e4cf6dab6f95aa6a8649d97e8abee703c4f5d4e5ef3928b5061bfe3f0ced3d5cc5ff14c37ec207f9d03441613304d8e327baede2633105b02ea48d956c1871304e6d14d4f5ab13735f82a15ffb3f01d161fd92018338e6d2b4d86f3927635a57ee7802326cd7596194a39dbd3bc41e58f41c55c5d7b728a74906078c9754354e16de516e3ccd464f10157b2b8d3a7ad46eb5cda1c93267a85bdbdb226471be8d57de870afe0366864266ee0d6818a3fe32485e17e04100505db87e7ce73232904217177b18f036b1bbf65ae544d52610df528bbab549af39df3a560ec81c5df136068751264a335bed724645bc068dc6c642eaeca0e2b0bf40cff65a6fa68d1ad43b5b0f9e47e8ef473934a12603277a97c7d0304b72a16b32e7d3d246573c878d041718f99fc3e659d9aa8a2b819fc6c42fe0280d901dd816107328f4a508c1c11f2fffb0a860cba5c21c5324d86315cc099f267fb172507ae858a0f3166e5420eb1a466bf82c19bb910eaeba9dfe022fd371de0a6d4b9ec1cdf8ecba31d9b92ce67a6f8415a25afba4f5ff5538dcf6601bec91461a060d9b4fd86ec27dd75b359fa4ed81774009f6ac66c77d3f9c7cfd5183f2ab4e3e1767dc7ba99460e3c4eb754e42fc93a1a12ce5e5999b28a8f05802bc74b2705056a7f2671fb8718b80af15bb024e0123bb1f0fd6d8577a7f1b10ae1a89f436e945ec200f53a7264b1900df9f9e0e3662a24d78cf160aabab37b7c202c4d8f8756f94f3f8c7d8f58ef871615098b5a9db0128bf42d55d32a9e0addd2997e94b612e42dc97fec675d39981196264ccd1f9524151b69897b5f7a0735de3859d86492c6648816b181dc596b0866994bc554a1017cebed2729c10f198c2c5107e5fa9c48fd6298f1653b15a7026caab1caa49b51c84b005566b824e9eba42caf43def912ff414fd79ce436f40890a0a662774dbe0122ec3bb9ac831e592e107a787a71cb720c8188ad3d84fc21bac55117357dee305af703aa05f261dfb247900e35cb1b5eab772f20b0c66455d25fdb7046f4895dda6ad2c12b3a5a841817188d76d1accc0579f27ea3c6d7acc0b76bf5127a388e8a8dd3878623b05048c93a7ba74923c304cef94e804afb2f6c152a2f02d7a3cd52a72b837e740c4b2aa420622ffc2b4c8fc06d18ae1b78e5bfc040a57cd271211a02053e7cf7157ea7f2efc976b26a6e8e9576659501f7d79f02d4dfe9344a93cae4873ee67274f0a5f9d239e4328831ea963bbb9dc3200bf5210e66b2c5d8294a96d90d26aed0a90d03ef39e1462e9d890be5a52e2b9a8baa6617c13d4dc0ed82602433a273d2b2c8566e51d5b404bb543c9ba8b0ff0e5fa4191778f494ade75b899036c4882212bd3a78092845b1923370864e8b08238dcd8235143e61451ebb5b44a0f3b767d1d3f935ea42c1de2a0ff1ce1e270e821f0ce99a1c827e309a8c1c69f896c649f8f4dacc7b8bf0328cce059aa0edd9d21c48956e182ab11763b41526c7177e728e072465446c9a56bf5af5125d4330bc8d6bcfd8919dc3a2821d8ea494dda7879bf3202ace4b86f1cb990960dc92dce8795cdf000e437c78feadce0ae750093328a21641a0917dacb97588a9a543a6fde8030d0f1784a342df4e1f8148d86b1c3bfb4dd243a7472f90d5bc1841bc53a4e348a12d34c802a72de7c73140dd97eadfe60f063df3ac2158a0ebd23767ae847013e281ee775f50f15f0f4156c75346194ba20418df742a1ac05e020fab7e469a4c1934ccf983e433a03fda13fe68d8f3124ff55bd266f3dd1c5dce52ef8a9166db8e6d57b6360cf9919f23feea9e4774245e018f344b24a99c2f5e879d9b0edea8895515173f704d1a77459ff4bc3ba467174f3b6ceb6586281edb361c7964099c5214908268b736230e677e828c5e8cc4c208e7e40e5c7da8706de8d4ec3cef9d30d15060778abd94adb224fed4553323a6531c037cb495046e3b232dbc3e99946db5db1a3590e8559c4e18ce5dcba26d0c596031fc13d724606e728fb0110e6a4fe7bb166a72c14f2362e25cef66df883c423ed6582249f18e2d5a62925e56051f8f78beded750688a160b0e52cef45e7e353b5a5688f5513fa1650e28cc7a4f24d7987958689c8918931a4e4dace8d61a5ae126bfede32dbdf21afb3b04812fa8e5a5aea2cdad9b16019783a9a8c4d757dab7a05afb1a6e4e47019192ad738cf1e127c782ad8b84cc880a142e698f4b7fdd4531f158a2fa3bc8a339f770595048f4a42bc1b03f2e824efc6ba4985119d88a14414aac83bbcc9f875930f53a62f546a642277fd07f807ef5efd3dc1329ab0aab392fa0c59848f1365b06e31eaa40feb4747bc246610d3e7b0883dedc633f85927f66db7178f9e936a541e30d10714457298720a9bb73b6181e7b46b4afde22527db7068f4525ac11a1a99c107ccf4215c911420274f810539984bba3f5ce09729aecc925e615654eb505b72ed6a31d79bce2d05876e571b4e266e5b21d58637a3dcbcb3d43113a764b1fdb70063500086ac271b4a88203c45fe96de80fc458f3d01eb5de44605310cabdb1dcf4cd114c3c78cd1df216ee0a79d4fb4eb35a0f64baab2e11d14cd9a49aa8e07d89b378cc98ce8d9b3ceb5a0f98f136eaf162b155633bdfddd21bf4bb23a81158ab2e5e10e78a59366e476e592506c7c6b223654e3395704a2f16cbdccc85ec774388eba19275d8f77173527286dc55eadce654d892838860d085878fff0618e13a074606ff57b3e52bb72fe2253b895c59f3a57ae8cbcf289db04f5c24f43e9e76f498c798f89209855a2d2f69eb0b260f9281bd9d36efa97fde4ccca11705b7e197086dc41f1b6967a673e3b9b38250e80b1028198c8deb5c59a666df3716336237bf7fea96f90fbae12a857f5c97e0cba57943c49554f71e6784b2461c181ae01de4857423d2036454799e22aff1e09fa9e5960718e9d4ab510e393f8db4744592a007c98f4f4b4f4789b50a7139574e5f7baa48dff78aed5f6e823054924a78dc1b8e51a117f1610181529f6d164ebf0f6406f0b02422cad8c916823759a361437ca17423d3fd84cc8afe486a31ccda01c732685418a32c064a7b9effb288e811ecc99adb2a759feecc3f702f31d9877dcdb717937c15fa2f163bea744400f58c928d2b93c5639ab06ea07c85bf7daeca9e1c6434f8811c9c58ded05db81370fe97758f114bce5d5a99a6d53483c1373161e9b90133ee799536eab783b5c941ad22092e1e65bfcf3474dbe30424ac0afa3fa77dc0d664fb61d8e907afe42b50e25cd27181bb3dda8628c60ebd4b47106d5fdd173a88eb894a676227a7ec4085e46c57be04f4506597dcefbf269f992fd1ea13f137f28c0b960bde81337711c9fd7b207e6db80059b0b9df5c08c9aa507007d1727fbc4e6a8eebe47c1d2aa40273b1b61a85b1569c19e71d4f2b70825c90dfa002d98d3a8c7a30fc802caf031a8f35a0f8148559171a8d31fe573d2a397a9907090e0d565aa201aef527ae36f799306682e2dc12b2fbd3a4d354d7a9d1765e8fefe7e5acbc4d878344d7ce4383d9c9911fb65f875603e2fd34e9e8070acb56be1d29bd449bc5ea02d304b834a49629a83659b5c2e97be2c48be0154ccec3a81ff99f3c24dd5051b40b751411441a7733319487cb54abfb823fff088104a47d37ec100b566c37e41f54f489e04aabdcbb772d7da880db53bdb80f69ae94b7fc905f43d2e22ec2cdcd1747bfab9e9280c770ec3e63545315005ed7dfd965444eb1b80138ce0d383146ba375f7928178adf849b7304b75a67d09921130c61939a226112e524f0e33b10a78c1153d081238b1b00c391933a71b7d1b3ad4e6feb096cc03e82ecbe0910b5440e7c407e1a72549de5d714cf395c3c6e5654a87796c3163f4db72c61f3dbbdfb8549481a28a0c17210569453a050e8d8d2b02062daefa844062beec0e9c2ae33b81f738cf4d45b0249e91a07b7744177ef6ac11600b5aa39328739c332ed125370a7cabcc637a8b65a38add3c5f1d1b4752a907c4f3ea58599721652188570c575895492e6f132f40aea559f14ef20f52b97977c11b2219003958b55e1b251f08f6c19f79b29812520a81a53ea95b4a3da5addff8c39a4c23897a3b4d69b3c3c86f822d12e071bb2651905d7900b17274a1b6aeb0af9b883ff2263573f69b91121d6760ae7b48a01a1e61d134e7ad1e74381472ad11de43b22dbd527644350d729ae1d880e58567c9bb66bef6b0a684d8d347ba229cbb152676c000a8c528af667272035eb1a058a1d32f55431e266c0efdd0e3d5c2ba530977dece901beeed6a0ea86f7c6232192ed02c528e62b53a7332409e1b1674a3d7ab5a2ad09ae05e09f9f57b8e69b32fed4cde355d30cb56c1fb073786fa428e2d7bd293ced4a557a2bed9c5f94a9be359a3b55c140ae16767c2a54e9df0dc585773c8980f5bc680d0b7c5cd418754f9f07f525567438fd2d1139b41c49c7ab9023dbcb606829c60208f59fffba286ca4e3a35bfab9d3f3f9a8869cf9f5fd6269a142f6c390bcf5bfea006dc8c2ea9eacf5edfd9755a77f4207b813682ad5707ab9181293b39a7fae7944cf1777e26b1f0679151491db2970f778225131775f29350628b71aeeec367c6accd422395e65def2aa59b59879eb406ed09c520cb7e0dcb33e170ddec2bebd196de70b16fce645fec54e0905f81caa412531d5bcfe0675c85f9bd3928bb002fab9387aa2cf0b03456ddbd54b2d69fd9a29f802aebe02c9ec902bb633ce7314b5b8afb7055e3adf70aae86091a03b0020e5da210b7e3ea0c8dbaffce9146fbbf17235096631dca327845df300dafb7c7c60bd79fac721c103470feedbe40cbe56f0b0baedd15a15110422d6c0620f3a55a28b53a42013f646dc33d432c6b2e78d390a10c4c51afed7311f51f8c0e1ff54b42af731117c0539a303f61542c9fc3e5529541095862521143dacd07dd796219d84adc822c5b783a3689bade1b9c6114df7cdfcca055496b3622e71205bc663657fbd91dc54d4cde5480d222aea0dac285ac5adebfe51de1877200331d456c215056eb5c69224be6f8d929ba6c599baee3c824e80dbe5a24b65caad39aa0fe8b4fd0a5c69e76eff4b1d7340dbb031e1a7844d051103d88a52127498bf44b97a4a4ed7ad4bbc7c3781e2f83a53149fc95c1a6efa27def23d376866ec4b0c1c23e0e21ed1f677140f17c268b1965aa91b15e62d5749d4fb64024ee7d06569ff897ca026f0f282ff2f17a70dcc2ae8187fd8cfd241004dbaa6b9ab416c96c32b5429703930c543053e88782db49928b39cafc0a4e2d3b1f8ac6669bae96583692dec3a9dbcf924ede5731d11916b80441ba19eec624a687d1d106f9b6f5b0f7fbccfe69bba168b81cbdf7d018a265a91a3b652f3e9edda11a2c0a52c25fed035a8d95d7b53a2e28799d48244c7541d64ddf7c4fe9e45707ce37df3b434d92e5599128585ae2790c8f65b1324717c3183716bdc58a9d99085874f417dc47192a539834701f42cfd0c8b7a18e7b027feb6061b83483331a3f6373e77cdfc5062ef2d338c364c3a911bff3b7ad6abdcecc7440d9f1564d612959a537ded04fd08f9202a3a6ddfd8b4bcfba61f398b23637cd54b1908634f442b59953b250500ea8cb8713aeed48eceb927c2f0587784cb9f5eddda695924a07f1b0d9abc27e2726f9d0f750154e447d82a97d57a98888cf68ac9c9806dde905b89c180fc912a066c780cd2ee876387e2ad2db7e916b60e4afe19cd94c8047a854abbd62b6c601049f17138fc9492f69e578d7ceb1897b96265d5d0ee911ec8c607038592df0cf7cfaf459174a4f9fdd6d1be0ec9c6b1f6086503b9d7f1b5e1e6689f747913b723c65b90c49ede210250c2c853cb498f2b02a6ad709510502dad14998a272fe8fcf69c5bb9c26b916fd5d3b43538c9b6c219d1dadc70157714e3b4f9b1e65c28ea261bad582872d1aa2dac899b5a6db021158e93e7b228b2fe4fefc5d0fcc2fe5520808e89181c6a1d20f44f6c775e03b2be84df78a1738a53ba6e07ceb288f2a5aa720634d991e32e76530e92d8c43adbdc5cc678871b867becd9c69550d78c428d991e41b4f8c447f673cff4c5c6da0636be50cdaa4b2fdfadd70b0c1ed65594919edd98f17996cf6af9997a858c6d9a9550866053290be5c510dd1b64aed4047d294c21d83ee02e9890750c623f7bffc1bd6f19c9dda4f6fb2d44aa698691f81be171c5b06c2acb48de6a92a2078a9c82ab13e05690827b18d648a1768715d9316f566ac32efd10448b80f48e0b24dba0c37b9e406a2bdae5b2f2e8d3d8e710887a03f957aadf645340bf1a6e74d023e2acae39d092297d276a4968c8a39003e8ab7e5bb5085b2f3ca530ed8a6917dd110eb49b4e3104caa9a555079d0d961c18aad1762571f6dac861da5329137f6ff59396aa026e422b320c1fae994083c2e21e0434ee0d3acbbf1dc635959a924256e15b5033726d078947ae460564de5c0cb01d7c5a03ae6be980fa7c1425d8befca00b742b640cc577fd0bb529a030545f07 +0xaa13b83b4db9a58a7684bad6b864abdad23bdd71b4e5bcab1a8750aa8e6b1ca70730a7b9ff684fa6b73a70ca75c55aee6afe1b6f573c8fb6ecf3962a30e0af0b +73096 +0x32670fb2a42da76362bfcca8bb8358c17a6595a05d7b51a9c8e935b6bb03525e02b2fd77ab19ddd9bd7842652750b846f7c8dd77cc4f6f858e83a9975c51d0abc65e09223da66d7fc7645f6cf8311dfe1d6f9639bae87cd737b39945d65866efe833dabd411e80dde94accc4146eaf6f542469ef0e8f9f242b42adc90f5d3db0cff9194f9ec73d7c89f33175654f952305adfda0b08c00f6d1f88c2af1ab7c79e3786de13eeacde311283488d11bf8a296d3fc548727c8d4939cdf7063894ccf8c787f7a08ce579ae7af8004421cff72715e0b137da81f47d8f84da34c3ed53c32c0f622e4bd042a7550bbf19f98d31dfc16d4e679562cd609d27fcc96133e473d197be1bafdfc1a21d58e57d0d89b2ba1c3ffd4647b18098cf31cf32850b079154bb6c072d766f25504a03fbc248022c72c34e6245d0a68ca23cd1eea3d5258221e4ec6f5936a3b78a79ab04dc4aa8cd51a1a23a2442b7c2b293a57c4214d6ecd5aecfc2979327cf28423b36aff40f035555993c67aa3cc18cf0aa59e46c8437cc63768f7d1e33d2a64e44ffb1e6bd74ea59a3e794699e0f7dbe61160f2ec5d982bd81447e2a8078a0e848ce96952c888d2852da1ef3541311675a1f26ee1468a51760802f5a760794cac721a281e4b4ba3c16727bea1762f48605f3c02ce86b900ba4b0e5208d35fe4040a77a3f6e8ffe1f7f4f4fb020758394e5327f5dba38c004be45541f4e5a59f335be82203280c54ceddefee837d13b0e884999132276d18d3debe0a9320b145e26d56ec6c92dbc4ef29ffde495fca77d6fa7b1cf89ac312f73e30f40c0bec9eb849a74a5aafd2f901e00e157f35e454bfbdb6df5882f5b4610e9548882ebe715ef6c584f5055abaad0b03d94b88c9104bd6302278696dc7b956d44f2e1290887b7c96e2641edcd19bb0c573d5dee073234cd32d80d69212a61cd54e273ec8a9b8e404abd082be0472da3e2b46c29344ef2786479952cc5fd16a80909a3ad09dbd35f62960b76a1cda8e5548c6b9494d566f30b9eb648374e247bd5cb08f0e2c317753a23d4746e17dd6f2147c4d6b54012dbbcc9d941f1a80bc74f990c4ec1dbdb3055f8ebabc1a00b9fdd591055f2298690ec5d76a081953cf8db06461d03a08f0f3a87c9632910e405fd42d698e7fc22911efc36fa739048af0c951ef2449bb3605c52f65120c4d71fe59760260322777ac91862a62423bf5858c81f54f137d8d23fdceaec3546556c3ab97573e05705ac7f24b23a2fb9f1735401cfbb960f7fe359982faad31fff79614b6f18ebe45db4a5b38e3d02dd9f8e62f4989caf8d09023e172d0386ac35a60dafc56b9264d001d1475f152a091a0819f3128eaa2b14cd51dc7b8ccc9588907469010280531d329652bd5921c6e18efd9fc5f812842383495a83ad114678c75a09aa74223995c54968218f66918671625d1b7f7502a5f26913edfaf149769903044a16e472ba287eea141e84e3895e0cad8b7b4e312c69458b02ece91912a423db488163b92adabb6b1d8cf9576ab34123be720a8a177673327b09753fcd7721112e3a1c57485a637d966130479b0f9431fcfa4698079856acbeb7021817608f2873b77ae7a3362b642721b64eaac19a6aef8a6ec56d4d845c369c2c4c811eb293b1700bd4bbec57e1384517c70a77b8310e990facc90470b38b2f60578af05fe55ffa3bc902eb9d675241c16b4aa07226d2ac85b8ab6b906514c72aa39593db8fd7bcb71f08b250590dbe4f85dbca5caec44b8d7374e187c37c1a07bb5167ba15d14dda614def0548b3012eb14e63dc5b5bec6367b5e4bb61199e74291eea7ff9a514221a32f040b8fac0cb7812fb759f1205c3f00f03afc085aaec578e9aa1bdfbb62ab46844872c3d53b244b9ffbcfc8f3e1bb6b0bcd96448e5fcd10106a3d52d8a50ba5e7a4d0503607fa1b3ef26f61bdbd7367b8eccbecbc6122016ad0ad1b33740b675f006f5d54d90098158280e509572c9afe7fe4296d1c8cf4ffc4b26351357134f4449513b917ff6b2b944c7b5c19b1ace56e292228f8d391d82f9552bc5206b6af598b9aec2bc03b8811194c406ac94675a1e200755dbe7ffcf79f0ffb31929297259919757b08b135df30803cb23b10b70057eadcb31767730615c3963cdd73b59106b8dd71a27539e8d93ed95ad0b1b274d009e662a4f04642429515d9aeff0f851ca1aa73552e9c125bae9dc850d26ee394841ad22ec37c956dae0172cedeb0ea21f967ebe884674700f91265831af437ec84016b7c871de6dd35e26e06b99da65eeb99402421a16e0e47c09930324b562031219658e5321cdb533e351c38dfa31b9ccadad1aa526fcebf2ecd21c17b2a78b205b98885c221af309f2fd8027fc7a0378121b7ca8232888ae4671c708d993b30323ed50ed5dca1f38cc404c085fc34e2477d9d273a9e84cf6ad1eae7888db3d2328b07297335f9c58e5c6619f72920c5a3564c69819d09b7497153cd74ed26c18b0ae67da514fecd2c5fc8b6df36ad0a1d148d396017606a08b11eca5aa1dd24c82139b37261f934ee35f03e440a20d63d1f263fdef2d20f2ff81588419020246e3aca72e30432215c46a65a2f8fc4548cdfdf220317a5cf46adfeac31a437e907bc5f63ffe6f1bdfffab4b2a7ace0a991bd828ad76e21d1d63aa2e132c4699a1b0fc12dceed7e2f5ebae1edb449bb00d41fd52163df903e6606c9cd4dd8ff60309bb879580220a001ecf4b45e4f9e7fde6ea28cae53383d7f793a1889c94162d0c70cefa60e213871fab6aeaea4d14e3613af76c0b063f7a8fbbf6bef7d77c982fd8436bff7c71e354aef84ab319c966474c485a2e0579369f41e6e85dde9bccfa5e9f7aba75b7bd54666dd5ede477ff1fbab615bc95c3a4acc20c855d1df643d2503d973042476da54e562cd941930640f2bb3f355bc14d4eb8d216742a0e856e69a851ef86c38cbde32bb02395bd245170b23736bbd488eba2d23c1167571a25076a2b46a79e9304b168f05b6568c1d7d1458e2f2a9ff019fc8746d37a627a8cc5ed93e4195af92035986dcf44f8773a80efb48d4c660b30325bc738b7b31f0c01cd2c26706b5776ec34991da91eacf00c1b3aef85d942e4f0da4d9fc3bb8029576344bc314216af41c802c4f63deb9edf4291b46b5c2fae948d3a97130e367b435a8de3d091cf0fd2bd3b33d0c8bbad7710597a618139d3b9ef3ebd1a0dba68321d585bd2bcd93f1b9e8308bd5185926feee2a00ccafa1abd7a9a506d4c7476c0164472bc45dda388e6aaa2106ae1f42648cdd3c1abd8ea3ba9fe1f714d0d2d69efc2d6f1af34d3a72ff2ae7e77493946a88b7424a65ea8a107da68ca81ed029c1463d7275b8755f2d4fb7c5bf933d82da8ac0faa4d13fc8a1eafdadd7d8c9cc30e9811a1fd4d910860359a3d832a5757b39014d702614c5358fec42ea274329b48e01505f6e02b347c31869787a54d6143e8121f58ff2e894147e332932c8a714ddc4fd7cae76b23636fdffe893d10b6e4049607c32609b8520b868dc22dfae1a7dd207bfbdbf731c050f4d70a4a47e51e85ff04d37e646d25ba4ca4b1e11a68c17335870c36560c0d8573b57d5569584decdbbb0c70c4f416f493fbe4fe4f73352f0d6d7e7eedfec55dbb2e7506ebad1c99ba7ed0a5b1f9b01afb07cdce20ad7d70f6b3b52e45a6627a598663a7454fe52cf9e4b275a1ea7bcdf06ceee9345404d9bfee62cce38f7f4bdd71dbef0cbd4207387134692b42f45e027fcad7e11355d99761e9c35e16765295554016b861bdc8e498e91894af947bafd4e402bd77faf13bd2ccaa0bd7e21f3fc532e6def9b2d29ce012ec946cf68766f0bd022fde6ea10ba58df973404d123b2616b7c6d1bbc4bfdb745da1277501b647d84eced32b79955e903a2aec01cbf61c7e022686530fcbef7ff4214b9a8b1c6ea85100d2bbdb576295d4a937babd1f0ceb7e6483f3244f908838bb65f18417c9bfa16c799a56c055e16164bfd256047bb155076726a2c9633fa3c5f2f47d16ed80c87824316c6ead1558f3e0e33754ed924e958c67fbb7ec08cde76f3de6c84e9e3e9a5f2b9cc0dca433bd4767d17ed6f0c3857021afa97f760f865718417a615a6c79a6e3685579008a476fcaa4e0cc4f5c6dcf0e2efca1f9f129372e2dcbca57ea6c87f34faae6dcb528a6a6222932106194d5680a4008270b568bda0c2aee1921097ed5b31fca7b4cc7a864f9c6ace67bb13fd9b211f66fc674c1c65d164110b8c6f7f54342787ed9aac1917c37913413497addc6c10146bb3a755d912c67d10a3b8fec70b18559b448aea62a0a938bc0a402dea8fbcd4e41ee131a58cbd6dcadbda335bbcb859e9527ac3d939e084ffc775476f920aee8f32627871482f2860bf3de3b951eedbfd4de66a2398074033f2a0c1107be1a9957693f2e44c06f7fbd44ad989d1a122ffbd35a8e9c507b57f14286477542b4e1e72da66a7a22822c3a467dc7245bb771828cf45d3c6c6280cb475f84c25cf2551afa09e62527ff1dfb6fdb31cb423226f181c0988a52ee4015aef4536f4b57657b44e60bc62f1ab789275273026c16b2e1484bcb16a2630878ffe12decbc58958094a755ddc689ab5c1350056a47d997aa56f25f51b9553c6d90a29ecb1e7a57b37fea5eec7cb04bfcaa70635343ff67e51450dfdc26596e5c37b5007af0314e8c5d0b7172c0232bd35320076e1efc85fa36e3c71667d410dd2b950d7cb011cc83b2a757f12f46cd88b3db8c0b075584820527af810c59c65902cf1050fc906432273a5cf818bfa385232f4bcabb9ee5f52598f3ac725ee16843cfa3983431a80011310ae82ae230415787d12d9a4d2ccc0ec42e0938581473652351a2e589fa860727ec51b45306559771b69421c4bb8f2715c927ccd9b212fd4685118eedfe2c7f8b7bc56396982a8979569ef0aa24b7152a6f78be585ccf62c5c8649ee2057bf0d823a3b7016848940b5bbe75720acc4f5e5b8c7b5876f13c0d960ca41ab2ecf19a8e7d1d37f9285da410732e90a0473c4e47c3926e8320ffaa787a2cdc8908084f26c204aecd523cd02f4d9aaab7a07256aece71ef23e71418da4d97cbea559b6257130bea474eb81c02be3814a3707823eb0db86ebbbc1fc545f7835d794e2170c9d0a15f098655f435458552e62fb42296f1d471cd18895c45f85df5986a3106e99b53918691acd52164110a0246bcdf3d1b347cda64c73a54d0b648da22507120c3910640e9134b719a599e8a5e08b6480a770466598febfd00fabbb11ef65c19f9f841bb052fd38068cd84e0ce2e4432101a9ce34f19eda919b9c2bfa899343faee7c8776e68e9e85feb51a82f7405a5fc7d9ae3be1bbbd37b61f24867cf760c42edfee89d451b03d0418932ea9076fdf03ea2fa4efbd316b691cf0dd4ffbe0a667979910a4ac38d7a5e902397fa14b4cbcc39794a40cfed5bb7bd5268a068a47a28bd034df09fcfaea10afca0176b64cfb4c2e358610ec1cb4241c8ab67f2750e7a3db1d0ccfc64fd975e20ab8ee7887c76d3eaf1f32c2e95c000c305ad07f683cc701f2b3665c7e7d01e3202b7258a7280e0d2af7d84ae3bcf5ef40fe605a38abdf8bdc5c36862edb9af935e3681f512617e4cd946c4ab3dbec0be42a9780673bd3c10290a70e07fd296e71663a952fca700bc080548b00c1ceaa4267ddb99ef48beb8dd621bbb3ea9788fb3e4e82e91b02ca2c43fad573778112823c9acc85dff051a4b70c54d7aaca90fcf20eae2721b3693963c4f0b404ef8bcd323682c303e83b70bad0a21e46accd9b0be1e190e56c2f0e6a1ca36a70fe5f4bd019a301695cf01867d56d2dc5248901102ee2cc6e1666d4e069b73dc498d4239eacf7e61735b9c546837caf2f190a55895f7a84c59754b24b12f5d707a4347e2455451b1759de9fe043994a8c759ac0ffdb7160f0d941d1358122dd410ac583eb7d574771b2a7cdbc7b8aa6e51f7f6af90a8f07f9c27758251d09fa7ab2d05b7a8df3132b275b786295186c41ff017aff549b22e73c3d70a44e71d4bb849c2d59ebe2274f9f44c75bf70b44a9fd6a1999215f58c32eda41397c21130b6873221101eb2ae404a8e32e0b2bd52401006e50d9a152947f97f26c0fe26073469b622936d8c5f33dd0f3633740c8baf30da2abe42ab76219bcacc56f7c63fa065d1429f1709f8332042083e511c473bbd7dc33aac23036e39196cd05b7c3a8900160999c7a619ccb8c92157c67725841a7456e94306517c55dd90b375b2885cccf6f029ebfb246f0af70a1640a7a706ec405e6083efd0da76a9c076e2f3c9aa20f69ec5f073b8a89b6e2af04c283c4287843236fb2a12071fe084a13fca4eefb0876dd4719a36f7ee912c8c657355a580927ab3255f8590b62455b8c8a0b89bd03bc5fbebf93feb790257311903a3ce7c0da08b7efabbf5ede7ac243a11774d24866f92cbfb33e1cf346394e363772bbe584c26848615a50b9cf089e0970b6201f9a34f9e2aa37965a9ba1e311d702bec04c5fac27c333ca3d6db40789bf5791d080968df021f10b0c4c3339e9bff6d6985b69ea567851b5b07c4ee5ebac600ca242a950b1bf7565528277b8869a55edb7d9688c9b29bdf75b235fa0f5ded878df05f5abed2dca8a7465f6c8b00e28ea63ede2f9bf7e7d7a868b6ea070fec7bfcdf401046b12f864ba1c37d22ec376b5e5bf61998a1e9b2479dc034c23b336c8b43455c4f41708d96bd0c23cc963473685786cd4c3b21edf7b3da60ed8a62b7bdef0795450e401d3d1a820704993a4558a408c1234e10f92d5d6e04d557fb1c0924ef61a4720eb3932cdd8d476fd93fa3e3e47bba3547525d0d0387263e5cd7f17765280a073cef3d76672d217491f0de79b2837d9b3587fb25337e3ca8089a0b69118ed2587b3e8089c77d1f61f4d76ce7eb4ee9ea5c18ac386630952f9ec0bb7c7cdc99c01a1020d976e39d925271d3b107549b9d2b62d4d92474cc3f8fea9623ffb7bce8ca1282d7edf718906b4ea7579f2aef4e34250969f6815e424c860fe22296d83ceba42b17952e3ce68fcc6c6e0b38615806adbe7d450ca7e265119d597e006836ff439e1b250f66ff40897746d413ae55038b7885986d559a5a2bd2dc7a7ae951857f3054e60123651df47c84a23302cfcb3cac157929c3d4ac1324fda06cd8371ec5965780b9fe92789bc0a9ce1d2b22be3fddaf6fd89f2bdb86283f785cb1321ba534956d80551200fe0828e04873e86d1391a5d4d023fa58f331146ad110ed1c9caf8104fad36e27899784513b69ab58464cbb50d71eeab4c8f40f005053b2822a4bbcff8fd6015ccd133ec96c98c5f04673325c23dc576f95d591d161064cfcccbdabb5c5e9662146ffca91527dd2c5a2b9ad6f6ce8daf9d85a4f4669b4f6dcf259dfb0239a271575b1ba4193855c68d974aef308c0dfd41ee699e7f0cc5ab349c4bb872f44ae99d7dd8072964bbd2a5928a99f9df0f09ec82f043e9cc8e3102172e1935f95772eebd7af7ce13d9fbab06a1fcd82f597aa62880092a4472a6417d8c47d2ae90b653034b9e8fad75e6a6dad83f55e4b5f977c8631bccdb39b2fab8ae69d17dbf5ad3379124f49a583e9ef6778bf866e92e684bdf9f57f8aafe34afdca8bbcdaa09774195b185424aa99c42c6074a1dbdc080973dbe51058f32f74a5e2c17051a6946099f6bcb0e12cfa6a60cdcd272fb58c895c59f4469aef64b717b1c6d8fd7224877f77d4d647a5ac70a933118cb699d462dbe6bb78ccff0390c7ca046d2a9dd8574e40d93ad48ef0456a12fa591d1380448724933d6bccbc803a9e22836584206e6af442652453867727ffd002df9d00acc27623faf3c2d013e4a079e23abf8d2b7a1498db939ddf74675c5b105a90e5ea326dd637f16bfeaa6a73a2d016ca8f1cd0045504cec86bcbacaac4183ab9a0ab3b7e327ae13288e2108a15f3861f96c12145ff87225dabfb7c8dc370ec61b16e6219c14a4fb10f298b464bb3053944a6c27c00c92ae810723b57d1b0dc1398822ae2fb1c9962120f4f4acc952092093c57f8f14164d249ce8dab676ea659d6a51a4c58686ab011f1b10a112044d464f0465f59965cb6b87ec7fb0cf0c7aefc35a4c851c410458f7f7506a1dafe5ae8711211a22e7effdcf19ec93aedbc8d69c25ee98fa6367cfb16ffb3072bc9aff43d4fb25370483837c5568869bbf16fbfc9ad225a9559d0d536a5b1a9a9134e189353b3e60244da4978a3cb11f202d06eba13f55af7e6ebbe8d2b6511c987bfe631c288f26af1709279fb13dc166d69e72227f509645a181758e55fc803837fbd8710b3d100da759347c0d520af9d76b9705d83de5140006048680444fd82f83f01c2c73a7a6c53dc70998178142f81764329344255251f39ca27f5110e22c3cb405d35771e33b5de62e9cb5aea70347e191f78fdd665def46ca994a4bbdf6ce2b144811f82ad0609cd35f541991bea5150b4e4395baeca309e6175789d155e25e32d2cac4e44befeee02a1a4b69f3d90886de8bd6b5c6b7edde41a2508611205345bbaa5b7a75b1e63d4532cb95688bc2ebf18d26bfb2d2fa9a5f502b44f12f143649d84752164f8bd2f8c2217fe6624c23cd711040799c3902b98c9f73beb8a9eec57d10d6f670e5878bf3d68d3406ad15ba6019a0e3bfb1ff977c367b4062185477c03c6ddcbdfd4545ec71291c20eda80282cb48b8e06a77404877c43fd66b4fa6ca557e91dddaf270d67aba645815c6ecfead9ec0aa6d54fd19eab683bbaac99bc2e373de79847852d879a8d5552b56bffc470bc3c2c17c161718bad3badba99fd16cb3893904bd331bf75a37c03a3fc4a622f888d36ed9d3698836f97b08d7f81f7aa65ac461ab5dc67c3a5240476b4322c5cbd8837d517b38c294bba5383aeed394b41bc3a32917028eafed7e5cc18398b8ee7b7af5ce58ab4f3ae2e074bccb16434592ddd31ea8f7b721d2218029ce3184c73961de37b0ebb69236d6c344d50f0dc188bbf87459cc7ef8c7d2bc8b6a14b0c0dae04174cc1f7f027e2c2dbb56e77d90c6051a1272aa6b9d953917cfa06bc43f259e256cf47033f4848dba0794c5181a116241e03bb8077604fd99deb85b49aee3449209700659cf0e9f7311d8d268c8347a76c6fb1fd9ecdbc74a9efa0ec674dc799032870879fbe50a5fc16935f400f5f6c0acfc066a68e43e33f8aeacc3f9d8e628cf829e1ce0d17786009117442b1e7e287a84964050e50b5bd41b5cc8a59f3361c9a9f2c9e6998ef1b496a0e1b275b9b518dcf6e50da7d5ca1b8a475ee0f80744064429087507f6a7c6c1f752fbc3506f6e4c50e108f24589b343950c12ad0ad76f9b6e61f5e158b01f5a451f70cfea5e651bc9baa88d039f868e6d5ba384e524ecf6e75dcef05b15a5a9b1d17863308be3938bfa5442b6147bb3f7d2fb464033669cbc8368fca8dd42f564ef7a45cafdd1fabe2876d706f179f95df982bbc20ac3d6165b2bcde610dd888601e03e5fbc189989cd75159d3d6aaac458a1aa14b3edec1d6e802abeb75ea83e8f111697d19eb81570b9c42000350c5678bedcde36ca26f843cddcd8d9ac9eb42275951c434d9f8a99aaac3a42c2683be0431ac79944cbd0637bacdb7eb1b211417483931a0c950fd1b094910cf9059b18962a77e64225cc54f35f70ae542b7d7576a7a75fc2e3cc9e3346cd65c22d9da921d49725ab7a15a09cc03e727d531f45e3cafe1959d2ea8b9b8897560526691a4ae2cf5c6913d2cedd96eed11470203923b44050b8a8911d502397e6aa3928f37b1ac69563382c6720a827d402cba7d99e2d160cc7ade8debadf741d99ae02bd1b4625d781314bf2ccbf92822dacddaebdfd28566e2b18554183d603bacd1efe922c932bab4556f749a3d6e37e5aea3fe6eb1d359568480a4ed967a1f5dda5414795b997c9bd75fffe1c9cffdd1ff51482c19db224ada18647a7ccfe3328be0ba4483e26c3e1d29155f28cdf334126b6fa4552d403424b5096b6b0225af492e6100fccdd81f99235b5ec4d8a6609a6acb440e1a31b6f6df0a1ceb916548a4959f3b008c6ec4de07386d4880860bf9d7e1a79f527527c30efd2b68fe107320aedb6f49ce8ea25e2d43170e46207ab33b593ba346991b0bbd49038db8b5d34fd28bfa3304b64c8c0df1c890a9f45158ed886c94670c1553727421a451d3dd74b9577856bf8437fa31db0e6a1c70144d96f5d6fd444c8b1cb715225749e8e641cb94661f6f66d92b314555152e323813a037f7486ee900ca038272111163a23971e9501784dcc49174e7490c5f99214d91b54a00375ffb0dd0729d6c38e285ce54bca2b9a0647ebf853736ca1143845df3f44bbf4e1ffe4ab63c00c330c40572dc84fa80428c5c27da9bcad8f39fc5c74f7b78c003b77ef32d6548a099b6a5b981e8a405dbb3014cfdab51b3672c6a0bfcc15dcd08a4e1a99e74d19ec408eb24ed4e5ba4ec86f2a156ec87d3fc67e5ae945c6730bd66ead091f1381840594a27672c6e07e556a4c78eb5c9d513e0dd219eb32195a27bef0a9040e8a7af1647439809778966d09c220dbd84115e059507844c2966586262aa220a7fb760ce770be87bf4b3d1534d334c5a63232b64b1c2edadcb1d3fa8ea51bfb449e1f5f03dd2e0fa6211c57d3c8dc322d3851c8cb7d6235ea334d8cdea73d1b4f391ef1a105b09eb4c2da3acee942a9d51a1a1cc2bd3ddb52e57a43fe792f0a2e951acbaa2e6dbe51f520c60d7e8bb206a234bc1622e6567e8c0327d7631a504b7abcf304a18cf6e583960478cfe2d5289648b0b1f5852ed4f38f404fac26730cb0ac7399a636ced835e3fbf8246d9ba3bffdfe797d44e9bee1c7974f9e7afddbfe91534f8493cf92d1b0b473c4548be0e5fcb058044911a21d5233c07f3f761f2d14991085ca807c1fa435d2f8c02e45d0edce35d0bc2dea70da1c88989c643f05dc4fc3ef046afce96888fe08d90a3b47765ef72ac6c6fda2045b9131ba51a54e927c500b68137bf5a3b5de3cc6a92b14426a885a8f63437b7af7c192c1c4b8d0dd299e211f05620cfec259dbb0937bfdf7f9cfa83e8c24c3e4f80202d846e053665d977950c817f621b9592fbe4e95cb3e14b45cfbca0841e9673bcb275e859ed420225a24e2047bb3a1c57e1964df46bec21fbdf0a357be324b5433d7940f7ad07a270ec3dd8f635d838411e85dc335200bf81442a1790267ac34831070e7af02748fdb54412275c666803054bfa7610bf727a91c4cd7d52f92c502f97b73051115400aff94247a9652a0238514f593288f95c4a42bd7ff3206eefabb3c1c44a66623e2ee60fd3b7750cc31a2e314911fda28ad02c6e247190f97b17d3b4a33686d20ad462c147d0f66eca3d3b56c2397e0c9ab5fa561768cb6a8706801669b003420b13281d30b069fe9c14211651338aa6108e351ba5432020a7fa415d64415c30938d8e6a1ac0500a9d3147f6728ab3fd60ab55157a9b4fba32658ff04f65020c58860e3e627b49315217487da2998a812fafe2d9e3db9a95cadad48567959553ae9f3000b45ba5f15f388b226dfa6ebfb20e56ef9d8ea151e5bca773694d76a52a5b9c676cec06c92907887b3127e127bc3939bcf41ef46cf7ad7140b117265f303d9bc908a6dc372416d8fea89c824792c2f3c87416f445850fea83db6d350074a7b6bc1406a6b9f4e8f50310e2b2adca4e2d98ba01318a22665ba344ca23275c3c95972ba5e6cffff0554f1674f2b8e71d4fb422682c9944334d2579a861425b6e81009bef2cf7c9bf823935ddd2f76db2c29149a645f15f19478106a28fdff6a0318f015ce9bfd6c8f437db87d3f7c2c13ec69c663e30f76ad35c78230f5eb2940f78d8799d869b8f33e1940d66188aab0cba970255c691ba690e2ab4505d139c7374adbfb8eaac84b9ccebd919f829f2c4e3c6152d20b28a712caad0f3399e3c15f8edb9ec6a7e4c0e303f655015251aefd8b61934ddde5da41e75038892b6f56f8c04d278848547a9d22b4cb8ee1095f61fc3890d6c69965a8a15c650f6f25ad894afa41da755fa05192bf9b4e150e6601f8adf074b18e70cc619840cc4e4def9a93aa92c6164e5a88bbdf6c49d7aaec65e8895b30830a24378dcd71c8ae2e43b40324c2531369d2c905dce6881023191632947b112556a8708fc3a00b7911d25e02327a8954f82d9cd87db212a6c2149b4096f51f7fba25ffcd42749e953ec420f89a6271c24396899c8b78ef83cf067c78577462797dc36db1129588ecfd40824d25211243923319b9cfdf288d921642449e9ee3fce9a940a1faacd164966e0d699b6075c02c2cd3970e90c4ae526d740b351ba9ee44000307c46182e7507748b5c4c6a0225aaa409e1333cbcd59329a34e294bc39d7ef3b4a365ba15c7583bb9768fc9d4f64d5e637a56f46d1ed8e3d296eb125c3ea9f72d2194339aa4bb9ef784ea9743192d44fc88bec3ca457a9e451a119eb76c5382f0734c04fbb1b426bc13f762baf2bd003bb8e53b52ddfaa171442751638afe1fb51517bed762c46b7d8030accb079f08876764cb954ccba5eda1b6caff3f2c25d18361b1ac3c8ec5c27620f5e1ec25d68630b7e51016800420bf2a7bc8ed404ddc4ac49df8a355ce114242aeae04f3e2be81492841cf9a54a0f90cd48f19ecf03bd7bad43b3bcbfce09100577de68bc576f5b2f5b8dc8d0ff4fbd875804974a586b6bee4e27a53dac6def480d0055ff765fa6fedc3c1daae731407df6af099e633744b508cc38fd02a8899bb42e5d2e0f20bea71112405b8c1ee35629da3af2ac87cda97a8bbd285822a6a47550c971ab1a6bd102f5780a767f6cbbfa6d736fbcc4cf73ab4d7be537420e0e574ee1f2d1b5 +0x6730a70ed95c48d1fa1c04dd32c192337ab47f4df3c6a1e9d101c0983cceded1a10ab25fe0437de24a6f9e3848f892c2327fc7fa6a0fb1854d81bf05d9733573 +73888 +0x645d27970ccce096d082fccfc1183955bad2611af0dd7c58c9d54430f28bd992ac04b65c66c5e4c6914d6dfdb0e4140eae93430675744557bc2cb57e20b537e377616601611b0dc61ff0993da9cfce6afa8dba76af2ce70cd05dd502ee43a73c6e7a1dcd2458c260247367d7d463cf3146c9acb1c590ca3cae728b0482be93633859c409d8036d5a45dcbe125a27802b394d0300e02557b2fe72becb04ae62217e0644fea4a5757d2c35883763a3471f7c23a5ab2875f435676658a09d997c3ee88783f1b1c542918186ac8e16608dd7b7537cfac4070a8c915540cb740949821de66b2d26eb3c5eebd5125f9ce5bb1991e36e34dd63028025475e94b38531b5c62be3f92ca0cbab132ca2f21dba37aeb2dd65a39a1242d9cb459a427f969c9e8a5cd29ceb6a5742a192448ec0686b5ec348488d249b345f2a55dc1f03c2f2061283225f8ad448e93c10e07dad76bdf06c2dff3ba2863fd9eb820c7164949bb506a7ba8a326306698cac5e050d6c972e549371f53d5cca11b5d11281cd91ff730dd182650aa1f98a3a70a66f08d360de248288031da33fcd314cd69764438608cf0862373b158913ee64a003c53280c983032bac69e605d607fa41fb5131993bf554424aec471fce4f8f35086d115fb71a1c42394aaa84f4dee339f4bde39ed527bd0ae446c0218106f94bc827f8657091d7b6f2e77924ee5e10a7cbd0e2ff9f0c4ca24e7107f9f5bbaacb891c70fabb8f3c6d1f69da4d8e308874c9b1b5225e4d08f2d094a40df215ab9e9473008661bc525008f756679afc53863389e471dd91fae3b1d720c740bc03aa315531712bc12147f5ba74dadb697ac7547ff852e381285b3b63028ea659bad9a7ea8a23de46b13b2dd9bc0e1920041e73bc782f37c59c43b460d2c9ed94d9124059930445f20b12f97db66c1cc9f972d767ec6fa2045e8465f619e2dd14663c42cbd47d276e36b6a1ceeb5aab0b62adc9a9dc7aece67404964b5d403e826c41f667d6f44b613a0d6df3e241908e46b691aad1b8dd15e8ad8f8a294bd885f008a45620d27a742001a415238a91fbad75779153913c36c26697d9026b73c6fc7994bf3a807c4fef79905b379b77fa9fd2c387e86dd3f40816f7607208d6ec977c0dcbad641999af5c77eea5de093225b5bcb31ab468f4c4a7f849008acaa0caf959a200e819fb6894a2f5f5b9114c4606ab3e70cec4e1fd00e0b93559178a9cd8be6bbb73431c23085999b09655ef0badd84f7223af61bc09f7da97dd85511501854f676c60a5e8a0e4025ddc9fc47a928b0fa91bf11c08aa87d4b07fdb9e3d5df5758b3d383dbd448a5784f3b5739e9e0ca59c1f51bce9cbd6cf08a5e3181dd25805af4d938dacdc94c1ad435fa37cb7a23ad49598e667542df225b96368bc49f4295b04393cbc504a67613467fc1ec697f6d7e78e448b2dd4659121243522ab130718caf2f3f588f472272e94288bb431002f7bfb7e5c3f1351d447ee2858defbc76d07855a606dda098899adcccb67b98163bba73ce27032de749189e965ccf492e323bb1804e544550bdd7b93e7c976a0fc0e5a2526a97833fb69bc1f515b489001865cd6ead9797d3862c622e6c1b28681dbdbe12fd32f79f136507225753de84f99303b1832c2aa97905524d036b35a7a8cf31906d49dd7dc5f0e8ce8011dc355c2fef098d66704b1d0f23fad12c34570886a75b1960a76464ebb12a2e72e489c6a909c72afb0b20d88631b863c286fea37089c3affc07db66a22af5b0fb9a0abfaace8aca4e4dd33227161629c2aff70019437a8f90615b51b0a091c6105f20ad81b7c509c4dacac04e4b94a1a131e8a4ed8ed046b2366cac93ac8ecc55c67426ea4ff65813148ff9884ca459e29f3c1869a67553c60977ddc7b95d4230427da23111af43ad9d8b444193d5b10b6a79c11a34ca35605d156bc9518db6346595a5e297404af8d8554726ab994580061a457bb45f7a05a3bded250f8096d6a254a89b3b69dc89577668940e7f95e504a5fc1a9fa5802a6fe9c8474dd6629b8b4330b7887c76d38d572f1636f910bed8a57b53712ce643341183bc871fb7f782e9d4c40908b86bfc700119bf865452148149c2b3661ae472ddb601559cf58f1bb0eb4d278f0fb72779953b02a7bf532ac1cdf4e0d1ac82bea6c592340ea9a6c8110abf8e8ffb4990ac41e69afdd0469dff9e46840009b279f5390bacc552f31ab2a997888bf997cab0adb8f2c93580e09331541761b0d8274196ba2a517fd885fe5e61bff38936380f2f0ea4ca3db695150d9a058740786924554a27438eeb9c5c7faa9f6728895b104c642b41773c1e0da974f8d127279215fb284e1c1e90b075a3dea1476625b67c8c55f0ff60a60de59b914befe34a448f0ed0e93b9d5c84a2618a6024b07fdcac755090349878c7253a6b8933e374f307f6d0933289c36b9b2f1a467f961c30188df073817d28ec452c603b3dc61c20194993c6817259d798631adec8956f43593c9225868d3aefddd81bcc7df9c44e2b7db71db8c5847b52a41893902d0da8d717d2208457233457d3fad7650cf1efb719a6e34921d7b93278700f56cb6bb32a961cff2b49767c3b8689c6936e29975493ffc1a2e5c803b036dd9c8cff0e04bc3dff0bec02a90a01964524899bcfb78c830e3356afd9fd6495ade5c34659101485e4f146e13f703259b97ba82478c2b74d6eb2e4de8208c7eb6d556a2ff167cbf46b29ac83ae41566763267f76a96b7d899dcaddf064b842ce8876122a5b6e3b0fee2fbd5879efe635bedf8030d5f4479e27d59293d67e7da5abc23bb3fba5ea3f0a7dd9de36fe5a4b38e15ab1830f9e11797db3276bedc11733c4475b66a172183c8e929349df2b2e7de65f97451fe97a2f2da039a968c589bce6d58f00e33b11f0fc68064714f145da591f4070a7c23e956ffa28f381f373a3c466dd6eedddc2c421caa593321527fab40a4baa39b0e568bf2193fecbc36b84c76bb50523b29122a95b0fd2b93f5b4b71b12766382de4f585a7090fa8bde7ec7a64a478175203a8fd79936a1ca846393ca4521945a1e3e87e0ad6ca9b5b6f2747d23a1c4b4490a398a6deedcf187f605f445a47c4a538ade2bdaba4262477d1da44d4863202debef57350c252e86d4d6411be8637b079b26e4fe620db9178888c2d022a6e053467be6f878c4a90a65ce5bced49314c1d926b2224b52e3b0797e80b519d41d4381a3debe1a018c9a11b4e7664f533e0aaca83e4d5f59089ab9c786031437fe860630e78fda23fcbf405290ec43ea21697c722f8785694e5bb12b7bc2fa15aca33be9ab74a07423005a6efb6797a1e466b14e2ed8a5cce07dc87207fbb5b74e228a98cf74543a29e5c7d1d3df33c0b089b302e349a8c8e4886563d3b52c650d8c5a03fe98debe36f6ef43be5dff8fac5bea56f5e174a68302f2c887f84767116812f3dee7264870bc3b8b64e7e3550163bf140da9f2aee475d667cbccee04813e1c301769142002be11736f88c75cd6299802d2a70a2730687908453a09858597df825226918d1284dac1844593ea5436deeaede5a55b8e644375a049803247f9c3b1372783d8c997ff3e4d282f48a211fa92056ba99027f09c7582023b53ecef30846d73d44a4e7ee6b2723883beea4252c2c33f000f2294eccf946b23309ffe8ec59d126a29cac1f9e59b7d779351525044cf6b9020a8d89b4c7d8f1e1186b0453a6e0d2fbd64e99f9e6f00f41101c85bdfd0f7430ae14511b4e573153dc98cbdac896b0950457d3fa796c8e07e222cda5a6ee9ff17f462b6cf7621f1fd911a5fe29534e228940543c6b9dd2523db07377e524bae8d0ab7f364d6a0989906e391a63b70a18e7a0a12c48048a94855e0d913242437b54acd2e3dadf8f4594f6ebcbe23282eca1f13146892105635b83f28e18b7d82d7dd2bd020a432ec84954349f3f4647124aaa8b17c983d12312bac8caf305d773bea5a42d662546764ffeb9e0d562a52e4435151c639d8c785d6b06d46bbccfe289ae0eb2790694f3fb6ed25d4f384b95114975c101ee85c7ae2d2336fd3d3ffe8154732dad6768b5ee1d1451070798eb442013a20ee75b956779b46f0207862c1821681b9db850309a92065887811b955f81853be5288c661bc920f914cc50ffc09d63f8a489d9f883661ef05b155227c5c6210b4f2276be5da3ff41cfcc2eee0d40ed316c4c74722af1c4a4fc34cb1719669d7c9755d9028f92a5e57da76e8b70846a725f80ae3203cdade2e57ff4f7bcfb511c4842f1d733fdcb60c8ee9e3c7d007227f8c6e5bca0721136a1574e2e42fcc276ec6a7fa0ed7dc6201c023c85a52d7aceb27fb9768357c51caa4b553f2dd387f8fe4cc0f41e7b2ccff172d80b6b641ad3271ba7f42f1700017adca8bee028183ef85a6445498e75acd3b0ef22325ca8d1c14b2fca061878819d7b97120c52d9a55523e828e11027635d5ce05ebc7fcb571b5ebf4c9ad485198cb8ceccf4fc62b8af29baf397b8b87fd8d76a355c35e8bf9ff6e5106fe3bc35c304be644c7d4a0570ec5b59bfd0af5ee0a0cb3a84178787c9742f99f7ce9472caffc46c856dd60824ec57afcc00827d0f59b1c2d6bd3e5c1286fd6dc4ed943d2f0a9f4a1246bd3d359a2e8a6eb0d876bf528c82c67f6389158fece049d9321149a59d71758056114d864e6e0a79f7c86b3bd9eec5d69dbb4cff6cb6190a047bb5515d9741b34720b72145bf11c486eebd66186b776b534f2365fb43950871f8fcbe4e1fe947e6e81d0b93122718fc560071d68d3d961ad13354271d504d00f57a1ced8ffec6ebd3f9a5b4fbbcffceaaeeef82c89b0f5acde73a6e97dd50481dd82dba4bd4a89c70a77029d045d18439d32fabb2120fa9b1c99930679ebaadce714142e81d759f5ad0fb70344446a39f47c2bfbe353f7e1954e11af106d4a883eff805e92ba65adee0b8169c5ab7b357d7394d5177174e6113b29cc8b836dedaaec271d3a1c3558971369b7cdbbd19dfec03c3104a1f9125808e24632579a73f2831251bf25525f6ece76d5a59bf6da400a2bf8f30c0fcd315c45034d0e5982e06b48e36afc43283ce5b0ab957572550bfa6a102cda3d7f66df58ec24d332823a4dd1bc83ca901dc8ff1f22e46ecb7526380063f7320c90bd3a25e9ffccaedbc9d0b6c252b6c2a5dcc5cc20dcb08ba15b6bf5d89c3c0368ff15b4e3252154f5559dfedf1ee960273edfbe8ec3633943703b52566222aa6ff4170bc0dffbac38a65bb1fa318bf20db7f4fd55e2ae5ec22e521ec79309890e63e9346a75823f0d83b3d8fbd1c300be0fac925b81ba81865d556112751b29ab153337c72fdd94dab54d7ac947b913a20eb1848ae8af2af7c5ef231f518011b0d39c1ac15435340805d09f4edb96b2217ca8dbc95eb4e27d2dc66dd66e60c98363cce73f2eb1a50038e54f71d48266a3203ca0ff2cf12f805f82461f16e2da8e8d6ca628037a71291933931a7ca4b690c313da169b8f9c6821ccb7e28f2ecb371b245d661cb71fea6f63723119252a502dd591f5f1b6ae9d3c4cc707226d24e8d39b16e0c19138ad011cf59ff42c4a4b262bcd84768def8778a97e7617c76e087f7ad87e3a3043d99807234a55e29fea76bd97ab743de68e9c8be417b6632fffe568ac28cebbc8d6fccb041b836fb093e432f65231ed1b1b729c02d2466af234ce0e98c6c65a500bf511a0fac8fa05af3a32f361f6c61794c081df9011033c110113a7406a3762e24b8100d06aab27a73e6795c00bf061634fe583375d5797fd4821de7e027786c2c5c22b83b2ab9de1b976e458b89281eee76ef7b1738e8a6069dd4769d64544132d7d29fde822efc7720ae80f45d5009f4fc442e49bcf9ea32df1e9e72ec7253e495903245438a6c033c9aacef9e065dd51906cba1d42592c5c05cce15125b0a9e2ffc0e23e134933c25b317e1edc380fb37a7e1a40104664bec0f94088886ebdbf16681eedde608ae8698505faf0029f3e297feb4d61eab31acb77ea1b18e5e2aa4704c0aabf742c6d9baf4dd54549f4ba4677178c5ccf823acd4ec952fc9f81693a9aafbdde0c811998b63cf9029876ef786f85452a7c37e46f87c4745d2400c59635d56e64b0f1b409a2bcad50748da5686d1dc0f2793ce15929c2cb62fac98604da190579e8e405957cb4385767a1a3be7cc744dd4ff7f9323cad9d34ab42742b9363c9443dc2d5e54b0be33ef81ab221a16b1b1385d2f3a3c96c33fabfd556b4679b03ee36f3eca017abf62eb0609a39e6f18bbba3339953d6e7d5ddbce9f6465faafb9e5cdf126fe87bb94e15db23af5241ddfe3184b1eb6e06cb052ce51a8a8176f97d35ef0ffac76373c7b1f4142bed445903b82c041296b15c9996338b27d7e845b34b89aae8bb4b6ec00c113754c0e046f3c0935a7158d0d1c1833a11c669e826672617ace2cd1bf062ac9c52d3d2feeef5cf217bafbb4b72a77a62730f3d5fe6c24cffde8f04bb42d41bfb2e4f2c8797326f3e2e75c70a877003137ba95d33cbeb47ab05986814ac3fe1989371d4618ad127523c6b85f55847a6b5ef3dd14e1e0a9f81eca4010c75cb84d949e1d4760ffb7fc56e38fcf52d52ecb098729f962649daeb5a5cd88ce79f8e28174634ac6dd800ff8a8535f04db95c6d3ef1d1f52dce824f1667f47d48e487ecc649faedee8f316958f936cf01a57f52a9626f5279c11e17e96f5dc5e1c1f58c1e913020d8499b69a23d097b913edbc8a06b7f94534b37aa9b191c4efa5f6272e7c7dd2d742dc4682ef8b6db45abfa38edb70ba503945470f40f38fedbe65505e9920afb0a6436cfc5d343d66415640856ec1a6cd1c3fdd1bcf9b9bfcb7d57adec9bbe74e21579042f76ba5638a39fa2a4b3b5d10500bb35ba7ea878144cefd2b789017f4369137134882242077e356c9fb3e3bce6751404b7470c11fc7ca5dc1305db0477888e7c9cb284811acdaed00e95ac15bd4792a67bfced71cc350134c8b755ecc499728f2e9be7fdb9b99034ba0018c4d2a1bd84ce445382cb9e8c409e46761d73c44511b3eb539d2c6a65026c9d30b26da91c0478c7472b43e0cd695d5b4780cb33916af44cd149ba07b4a1ea14fbc5d687378f402ed0547a224c17cc9dcefd160bdd01b66467e9acb80679fc0c81e65464968eef21f7e5b98d92b3b4b5157d9a77b240c4db20664aa7e2f26c2dcbfe3168c2674d47c3c7484926a3dd4a24e6a19d978ee55a01a6dcf9d0740120e0f3b3ba428422493ce06f7d90510f05012271a51453e0891492aad95867828dc9af23839e4b36ce6a1976525923128eb61752b8b1f87e0f6012fc6d0333b81b8c18c9ea5f26517f565ba4ef0883ad8c4baf8efef7e38795ed0f19dd58406b733318ec180c7c3a04078c437c25d8aaa7c6d06c9e6d7dc3c2c46f4a52e0f7623dc596d5342db4ba0485959923398acf88316433c09c2ef93fec1cd7f421be67204b79cd674a389928d95fef0acb01e5d793522c8e0a5ff3b36dfc08eaa5fe40c4ccab1ad9ec6f9f170ad18c5963a4b33bf5829f2d417677c750f9245df420b6d2501304b19ac1937920d2ba3989dd035d5edcd3c8c9dd4e239cfa7574948a91f2e099d518dd963ff8244cbfd2c6149be5d648128528fa406e59e641580fa699cb8225d3353c56693a1d26e44ba1af447a66aea28ce83714508fa7d130eddb9606409f48313f69dae7134871cca317c6c414f6cc0690fb947347246d25b4904f4a22ef7a336e385aa80e9aae7f52b4e96dea08d81ba9ad867c89455d5fee2f8d402ffeb2645229b1251703e28a39ee751af0cc0ef2bab7b3165bf2e805221f18906fb237eb72a5a605356e5715dd2e31752d2bb6b44b80e3e7c713573fd9c8b8e1eaf453f1561502f071c05349c8dae626a90b1788e570dd97d490f2379a9235dba9ad4c9e87df8d90d2e21f4d815c5cd56c567a970fef6bcf8a510112ede55627b3c36b198c6d0f8a60bc034a901a5b297ff2270951655337f23fccfb5a29e46d1020f88bed255089233646687e7eabcae9c96605333a5e7613409b186ac6a854c9aa3b1b33711733243932ced1ee1361b2c17fb33ed65435f63db591a4246785e54b7bf2e5b82e306aab0da514d45d96e3c4b93cf9a2fd1ba11f638f91abeca86cea02378b615b29fd762014cc974f1082b95ec8ec0421d11ecced3ab7c4fe64676e1613aed667c6e680b344839fb2789a87b47ea06587fe752e9bb9a0d56461ddc100aed57e1aae2cb30e5dc0544d75301804879c2ef84bac2cb435d448e748d6ca082f88c13b8ad7f578860c1eeab04e53950b68c53c5fcdad82d5d9834fc15a7175bf4f079401f0303be7ee654fd0fb20b1318d941be4df9b4bc239f06473729e9185b3b8ebbc7d4b9da9ee91457e40679e2192015d7febdd58237cf5ed072539a2aa3b3c0962892ee7f4940a94622410a504ff76c9daf85bf12128fcb4247c2af15570fcb69c19c160ef69380423af040e025d5a289d0efd5ee4c76c7f737d59c6afd85eb91237ec52c3f4845d6ae92921423315427035abe693e0ad179c32af69e0fdcbdc6bea970397bd5466dedb6826ed090fdff9764dd256fc274446a312210f67ace5503baabc944d11e8288caa642a68afc7e3d8cb6a57a242cd19d76b37649c679d68300dc5e22b24acef04d52422d65fc1d4640df6bb5a667cbfd6a3f3082666cc5cd4a866a8dff377dc4cd2aefcdd87977421fbbeadadfb17dda8a09d238d0f3ad32c63e70ff2e814976b8a4ae1058d0f6d177e0a532169671e564c7ddc57ccae7642278f3eeb6a49c769e440f9d5daf2644e7c21d540183427e68edb5c0e04f2ed1ddaa85d52e0e0144fc7d76bd5d60704cfde4c5c927046a3634dfecb391eccdfc5667896b0b49f28241d58608de918f2a18dd3109eda6438d2732f50618405f443b1480f8c4d4fa8f0cd0bff867cebd9cc70fe18ecbc588e3de7b6130d9d65d59ea55ff06e13b83fbbbf387147f54a5f596e149c047fe84eab91db3dc5d1b32ade290762de6ea1938edb27dd58befb2c4f715fc66f8cdd202559e6f61288b99a0c24868d65c6d34c7009206c423dc6e9b66025bcb44afeabb2271e657a2a3dce2e8025988a8317136a316a468cdc753e9622afa65b2015985ae3ccb3871f086e4f242cabd60d3390833b4e92be02ced2f8a145adec78e88e25753807c1d0e22174f8e3f0d0cdef6ac30f147961169b4ee3c42ff9f0b941361cc5aa8aafa3928fa7e4918c0029154932950422fc82a2596073b4b1ef4ae63846bc6a64d901e261efd080aaee8a6bd7d9b665b517adac9c76961dfd6f959f3bac40bfbcc753983f55a4f6702359bbb9bf58815c3aff80bf2d16b206fa0136e7543af3ba02ff7dd0df483c0626fccb9aec649e3deee0e8698dd9bbf417f671e648934c88116f59bd97a49a957fdd632069c30580bab8aa429fc880ef4fdc1add9031134b7c09f4ad85a15745b7624df33d5bfe4e27ef8ff36acb491e281cf77732fe8f2ecc371549b025bd3d55f550bc7016d0cfbced5f24f6cb5da92c1cd15a38e10a5688608639201912a6e1fd33230bdbc52a011be27c4cae05b9e3456f2ea9c1caee38eb0d24dd669fa7e3e2bfcf159123887edfdfa4735e8976d4ff9b9c8e88181c644273b3f0f2ac69e40bbc6996223310bca2204473c1310787b31b4bee1d3c0895cc7f8d60a781146ce2f29897753deb42cd6b0355c1449484c7b8e5d1687edc52f1fb5a356c65cf01ce28051e72894098c6898920450c4754a53a0f405126bd2419adc47728a2c22d37285836015e3847f7427fdc34cf467eb3697341c07bd592ac5f712fc57e167785b838e40a06fbd6c65d8d9278d6b98a5b0db9df9dc64c2412d709652a42f36721a14d3275c7b0cd9da45a49f869c90004ed891fd04f4a62b4de351f3f35808671aa40272aea7fb5e3dd8f099cd09d6915d2890b415ef6d5f83b9d67eca1e65bde9db9cb12b6911400d1d3da4c525f4df88464aad93b780447b8e84419cc4c6fd1415f2713750e755c48cfc5f038343214cbc0047e2ef9770a1bbebfaeffdb48b05ddb42166d1e5d5f0a2bd170cb46a2d16f4622197ea1b7a72dc9de9382bb70e4bad42504e8e75671de8e07b450bd2497379d0b9374974b88b6aeabb19d136fd620f3d6c32c94e7fa8da06da512c141ceec6dc7d25804bb137e182eee980bcbed56e05f3d814b9962e00a0e2958787fde56605fc0720f90b24cad6e33bacd0e902642c7583134f2119c74ef29690d69303d1cda4409e151cce91573694d7ebf2956c217fe83797c6f8c851a8e8ea6842a6949404566a186c81ef945769749671faf075616be3fbfe577e6963e0f6c5a35a2909aadd278b810b101ed44e1548ddaf9ba8c882bb142d9243f6b23348672baaf99ef63938e6e0b6ad472b972c7b9c2fc82c23c12f48db45c37a224451c541f590b474ff10a3021131bdcbf94cb743f7f08ff19bb3328dfe7764128895889ce688eaa59361486ba727d333d8d8844b94cf34b096d949cc08da553194960982da4cc2169a8d6f93e51a3801aa625b49829ecaef4713f6fc1166cdddecd5c09a6d46ab367917510157634cb4027ca4944df9b31c0105d2c494972e95f5d75659fc213693b371c54a8a9d91a9658a18d2536a7db568f1658bfef607e8441d23282346d49cde3f14b5db43a770480cf07a3f5b9b59e39917d8dd0dda535c09dfbb6f3205e05dc1c7f9d5efee972e97f3f27e678c58055f7221ab492655a23fb45a3c7d5adcc6cc678d16ece79c8d9d7be17cf8d15e52a6fd0ce6326c6dbb3169ab177344008d917bc5fad512dee99ff0bdd799fadb301220e11a442d0a0b5168148cde41ea36c36d5b1e3300fcd7120aedfac5793d42238644b418e8c91742383d08f8e4f836d4c4b2dd712274ba86230872f5dd12ed5d85ae400b10197376327b186d9dc922480a43d53a07b5188ec183ccc586fab622a7944aa5437984501f5537a6eccb6d8fb6a481d8216c857e7ee6549f07332105748d4071e377de723751f33f427d9d3e424b6fe5ffd965e7a3b6c6fcee7aa298750fadeb8082f65f2307b7814f5e25b645beebedf3aa5e5ce85b8069ad2fdf3e1171ff8c9b2950795add012763fb9b9a3965a25abd3db340a57b1d6fb3d12b78e27ac1efa3e9615347487cac10d4635c85d61fb6bd322925736bfa69a2fd1bcb6080716f3b31cd6f90e06669d657116fc386b07c63f6149ddac4a401fb0224c7f409aa85b190e930a02b7aeb45122a666b0e0126521809fc340ba6a31c8edad1459cc9edb7953948fd8016cabd8412b2f4c29e4f08066dd327b77ed78801a289bdb04bf1adad521b1194b662d02b6ee7e95ac450e65fd4a51e3e9919edf91053d4cacd2c1447b82974cff65e0d869377c12d2fd67d72c304902791d48ee3b8c21362ba077bf2dfe6bf984316c61424e504b03d3a4dedbd541608d5b20b4fe057020e9f1e554d3de52a842927aa62a7a24c8a8916d82f28262838f11ce39c3b751934e8cb20a566b76e2a150b2ad07041d1227fd69cc5a7fd4f5e508fa8573ebed16c23b87ea9ceaff2e0932bb80c33465b0eae041c3f914be3ef9084ba1f4e96b31adc40cfa8ea61515e2023e274452242a57019d70b88948e431d9699430f9f46c77f0e84414e6de1e9486e2a874a68109d82a23d97f259c71f742fd660d63b0508887c4d017f185d18787500d3978a5d3d4217e083732df6db20caf1f756ec664485147a47d1030b623cc2f5e7d0fb813b3af5405c6f63c5ec9ff26c84f635f3020161aca308b0856d11f28a127b4e14edc9c4ed616bad9cea6e30b69838aa23d769de44a16aa3438f746e3e01faf480eb9b013850ec5de44b0800508f82bb812b3af4e2a19b5dce4ff0a07224d4816dab1b34c1a956174494f9ebdaf988ec8384014007420f32ae34f333c7099c7733b2c6ca09b95d4c364eb04da654afbfb358394a13012ad44bc51892cd1eb7386b892a4b812f567f21dec7b0533f6b97993e6f6d964d92b52f76bd47d4d2b9578d94c233b869d6229fcbbcbe61f841169d9d004521a5cb57d1d07dbd7ec41757026c0b1d200740d928abebc2434dd4bf390a984b1598393ecb58c67e3b7155b97285716258764af524e5e156877e7af413fd83fa12a360cc947624048b58f8f15667919db23559294d003a059f28b84786ec7fdc8935d69395bf12eafee985811688f849cdc2dfc7e991623a0acb214c3a6dd86ce9fe0f3667aa0f9c06b1600b3b7ff1d12bbd5363830fd67e4ad42a5486d82a15c53a7ef782bd9682233f3cd25da33ade3c73588eb1d2234cefe25802f4e1e181ab99ba897f704447e4e15088c5991fbb7093539bfe9eb5206a641eda1ce19b1afd8a265e96587557bc566f813bd83d13787be93db1bc28833ad8033c677dc35c4b8a56d99fdcb63c29fcce7df8d70f50a4bb6dc683b0e9ffd1cc89cc5d0cd6b00628d09cd473836fae4311b1b51c030d95d075d8dd237600efa036ec661551d0cdd4081aecc3795cc9d7cdded92da4a4cc3975e7367a5900b4f18f2f3b3dd118f31a81d63132e4ae0d195757dd6280b0a8750274182bffa9f23ef70724dcb103267ac2514a4861bdd88642bf4a8113bbcb118ff20abef65707f70306bb788e29d8633e0eb08a8d16ccad0477a8dfda10947d930386b9d98266a8379077a7d4f779627970dc6fa3434a0c310360f54069a537a00b0492f5c6aed10956d1d111f68a06f92a566e60bde1125cf51b57f3216dce3b8b1ce0e79e40fffcac728ab191aaaf319d971d3201126dccdf307e4ed26ebfc9f6280a2b73bd838613a24b50732bf9b74d16e293976e6d14f428eecff7287adffecea53de1750a3a1f09896af5be44feab6e54f1fb459eca069d1ff2fa1b8de1e76918ab5228029d4110cb6d93b23f7c4b05eaf9a748716078e5986465c86774629ffad05016fb040c4087d4f7a837b4be662b0715e7935cbdaace70d4afa60bd2dbb26965f25212f321553d8c10dc3c4 +0xc49a67a96dccfe9597d5c1070077f46024b331f4b64d8713709f9ab3248ec7b95319da1ac43e0d67e2f3ac558943a5fd9ed2a67decbe6c873efe01f59db57cb8 +74680 +0x223674f89f44f89f54660b3e32ddb843409eef7086a885d329947cf9d76e855f65c3c329b7fbd216e1e908b48ba1fad09a8a42310db48086246b9f9cc80c5ad42717fed59f86717edd5d731e468324e895d0c6a1c667c59c3446f4e8fe1b1ac8ae59ad631d8cddbd91ead5e6292a3d727b9903287b6a5bff9f4d04464044cd2244b2593dfab51fbd45b6b473fd3f4d55920c802ff2644a95adaa561c572f7cca2f4a89cafdab3e6441ec9b2d89695d7b2352c51cf4fe9b48a88273d30c832fa7b748c572f013429cccb20f7c975173cb75925a5949e055fed600e1d425e8eca326d5959d9998344c2f309ac8ed9e9a2dd2f5c84cb9b180a181492a866a08bda5c21882b3c2e01b5cb390c37954f9d78980a3965f0c192518ef88d550a588a996d53a131c3193ffb39df712f7940a34c7c8c34cf909c24a4b68e36b9c9c13b85ca562d141af5ae83b388f10ab7578b8d0f27d72817a51fa22368273d1184ff3e07bb9428803dddfdbcb8044fbbfec6b8a46fb916125713a85a08e7556e1e4610a9e67f05af7c3eb7b9df23750390d56de0c623000d2c8145ced2ffa95bf7b0bc35893632051b41503f70c6f13ad8480b48bddd8c64bfe8f8f668c89f57abcf7f1ef652140da5a645c21f676aae1f8f2f50c91101b57bcb30653ceaaded94e2f7dac06b4245a5ae06c63d9d47f9d12b287d7a96067bdaa89aafc1ce5b8a6dabb50d79ea432995f911c05dd0ff8ab7aca54344b5012466f1861a89fc3eca707a151b85477d45e0f80554e29b17fd2d741436ba06984bab36914a07fcbe0a57eeb679651b7717212b4fd88e6427bd9d1203bc3cf3226e12082ac2de386fd67e6a17cbbbdeb709e1135fdf93b485489116e268500345e825c6d0f95f37aabb7e8c9776dbf9c3ba8b40c3ee9514d71aa3f33ebfa5df595670f322720d931535b2c6d3ff57f513958a240a7a24fd83c04037872670bff3456e2d7da18ba335b1c5994be9b2692d27884d91f6b5e721c5e0344a31735daa1187c6612c3c1062dc21747dba6dce86ece01e0908ba6a17981ea9f6651010c467587e6b66b13342f15108d7e60c8d97524c25ce14b4ef0bc365e91a35c971f8a34a860ae56db45cbdde96e8f0f13ef4f406e55faf37fe44b4307234281209bd41f89dbe2cc3fbf68e14df2f7fce4b265eaaed3c3cb60078f708f5c2b08c4068efcd25f3a17672c6deae2229c6f64a91dec2adf241a1ae0f0879b454639aaea1f942bf59e7e7c1344c0500567afbb5ce00d8980052ad4f7d74ed6e47c5bfbceefaf3aa3f648a6fd542b40a340061053171474bf4e41b7d5aa8fe543b3b8de3b6615aa732abe0c7105f35a0510ba8b1728ca92a2e7a8eb01d210736ad4967cb8ec8d216d2228d7f7bfdf4532bd14562f7df78c34b8a79703b89a265fc83efdcde9e04798c6ce2e17eab8aa32315c96237c63097aa985e364c3f4a62c75f88802c5d6c6fcfff73a5aee46300e52da767c8fd5b27ea38cf8ab5ae89cd9c50c45e0e83743a1b3ec2347345180cd0ad61cc11d162f478c02fe60e73cb06c9fc15deebacb6990cbf6106722a141774097b07a8eef27dd4e301c0cd1b989efea60f8b4a45addd0305b294021fd1c15dc665b2f49254249cf5e7b368027d06990313dbb0cab4a69c863985c9a2fb9aec58b4469b8832992f9d443665c4e2ce3787c558a5b8756647d588243f3fdbf4ae54e95af42d084c0b2d99b24cdf546648a8968aafab6a9c83680127b9630d7f123f6738a4fd3fadce4b6abf93be6c5f4ae9f9da14f00ec9ddb256d8ee990a8ac67cd0881475534ec76b49c6c0ee7529bcc081cf9c42dc7eb538dbe0456e4db8299197c1c931edafb50199606aec19562cc0a0e39c004e1bb88002b6343f6177ca223f7e399f6930e5a2dc04d833c355096ee9beaab4ee31461c8dc351a8c05a16833a05fc2a5072f7c3a43cbf61fdb6e13fcea93ecd374ffc62cfa01426f4cf9d4919f1776f2df659e8647086d342ec3297b24bced5b3d839f73ad502367958cce841d931ea7c3b9a85af38b5141d757c1b570ee15aee6a8d4e61ca9253b88633f55425c208a5a3182fe6fdc0b0f7d32c4f0f7afcc9316764ecd7094b0b5cc850d4d35f9e6644dd814bae4830166c95d1875e08a7ad475f6f370d0992c9b0afa22b21ff2d6fc43b347d67a089d0d63dfa78c54048737ac2fac16654101b6e9cb64cc27d05a1ce5cc019958f446cef2c0577c7ba75c8563296208571397ce12ffbde5761ad98adb2a2b4da7cf636f1e08128f7cfa5f8541edfb8fcd9857ab2c9e14433358bb0fccd5ae388e1f5eb991c0bf0b8085f901ef8261f1ef56a714e0b1502f8713677361d670a2366e9e74f0f04639aed192bf15f07a76e6d7f0d2d63e5bf19ad1477e41345bd5c6438b68e69e8f612f6593895a403068daa39baeb5501cd1931dc2f814f7561867278d5c19d481cb2ac962256679690df2400e6d26ec7b179a7c40a8842848b241a10c1a319906bec886695be2a30faf5738b3dad01c600ad978295737cd1bec7b397068d7f6058431230ff576c709943113f1bc5ce7b3f37598e6cdd5f1b60e3e77210fb3f167638c28bbb9c9ec3f04a7572fda71565c1a9964ddd207990160b1e488d76c9512a4011ed771841a9949e18ed7fdb86f44c76b65772e75cfe429fd070b87aae7ef8eba8ccae34e59ffaa083f50edd83c514213221ca8c69a47b3496813e917f1e66bdcfafcd8d0b2596e44f302727ac56cd2ba24350aa2031244be9009c359bae08192f0d517b22c8fdebc31555446117ec188f1281ab3102d25840653de184ac31a02f7bd6a9bd089429981b15ae3286d55a4135fa19ecb809ec2525b02fdaa797c54961c9733a530e2026b7e4efa1223d7371240660e3cf4f6a0fd87f6afe1e8efb1565a6723b36a05207824f632d7868e68743533a96a6f77478e4184d7f7fabd41bedfa2130220f41b2f0b1a348080c460c3a5ce175dda67df8df0721df5952c2b561310aa9b3bf81a199b84a815f8bf4686f800011d1e0f8f83fb8928e2a38698a65f789185a15745bc3dfb349cd5c9434695910fb321b780f7cc91a1c60b11af3729a470c83c59c5a25746831f01287f8ae649e826cda7da71ca522fa9b5169990da5aee6df248c253532e3ba5632421da52f0357e0926c4795d947b9489dc7d39db63b37aad6a6356977b0537e30752be414d9dc3bc7d6698ed1e2d8e6fad84bb938768fa5409d1328df588dc691739bf1b29c9fed0f5e955e2b9eca04fcfd59d698db5f2cf6b34729b636d9cdd9eff64494c60372cd47539a52d60d1118b9a67c73f416c06d8b39b2b8f5b7f27e2cb36317e0b74b86231cb9c4232299d29f8a21463b56fe19a7637a43ffb8e302cc6bc3c8772bf5ce9469330bf0ab0dbf119d5b7c2b80448f8a6cd6e3cf5d0dec3177ed22e3c1f00afdc19c96e8f6fb42b25881a24f33223396be6f14ef04e1af1e8045c3c129d8cfd19e6d0156a6d0e1e4343a4510d015aa6ec09943c940ecdfc5ed7407a9b3fe81b2881ab7d43b2d3139c8fbd10af79d58752bec2d08a1add2da37ee8ad800ffd512f72c46ec047e95258f3cd2a81a37c24c48ee0d07a7a34ccdf81baa06815b1e7574282b08c333a239ef83c682a8638c46bff57050b34b8213969201afc58ed24c7784c0a4d7eacce96247390532aefb06f9b8f37e6525373dabc81e2e4e09a52a89c8c45ac31299a6a02d86aa3988a31f7eaf02eb3dbec0cea0545c1c7b59eb72136a929505398d13f17d4c0c3d7f28d2b73e3b119d86a3290c9d37f4de0e39b5bcf0b7ee2ece0b940edd0585aef0d0c34bece8ac050b72ef49295e41f684f487dee1a0c0905eb9a920b32fb11e9c5f83a531a7f514bba483fe7f2b7e555cc05b01c3e9b6ea4a0be60f9637190cc019764bb305974d25bc7995152c246af41191ce0dff2b8d4e76cd040cc827ea0a933db7d76dfd0eb82f529571dcbeb7f95cde8c265da909aa8eb0a67d4f6846ea412c72156db0ea117181881bc9b7ccdb2693d4a381b9e00cb8437f6e294493ddc7c4f2f3713d5f902798d5795faa09f7f354201c07d890d397f7f756025761538bb9b308151cefd2b60b16211b0ffffe478206e65c8fac9d824096db571b2fea016d4ac9b5ba1b47b14ac29988442f4c97cfe1a90c3983d91bafe664940a601fcd42229eff9f526d8dfa534933f11861687058ba7370c704d8b85e6845af925343eac31e4f5725c2b07c40c68a913beb3e25c4b14ecfd6af2ddc777ce875473319c9b4be216c15d5dd53338818af1a389d52de23daa143469f9eca08f8e5ff1d936160051238a315491174044aa533e7ea79dd68c39f9d59b271bea2f38c1a9155346d69ae574e1fa839bad1bd1df957ba2d6b1676053556faf7cdb164d23a3ce3c53572324287436f3e4066dc640b3690c00fa38e8cabdccd838fdac952ce6ea3a640b55a74ef2ef281dd3a2521c9d2e2e423a669a07149ceb77d85ad7857a5393a17998388d640f6b6c9d223d1c5db450c5f8593cb262c63060f286ddd567ef8f3329559d8dd17d04f9ea544fe7f9e1bab1bc799673b032ef1cd59a6dc5b5a87842a3f29ff741213bed45a24f267c9fb32d0f2e72f005c870d209fc50fd6d6494f570d90673bce3577033730780ebd5846177e096d46970faab14164e24970d2d7517709aa84baba2a93e303d9e506b76767ef7cbc5e412d7cf804e2ee2398a89ea2021233ff56162c1ed3fba27b248cf94acdbd96b7f964d65d50ebae15dc3f07b145368dfc3ede0e0c80946c41a56d7e288f4887041e4a59699bdb8c60aa0ac50796d3231bb37642c58f6a81d8f7cd8899aaba07933e4278956c2f13c49090492dad949dde82836d0246faad919a218b16a66e8315b7f1a6793872de921e63f69bcfe758a4fa69df2b5da12a0c0b0e080818e293dc39bc857d97333759a1fa6fca9447ee0fa9ae3bb91a0a91c8d8f7821668c2b4873217782afeecd89bc9c817428132b89f0ed4e52422a37f3872528baa1c6b6f871fa700f9d60c1cd904618f8c2d3452a398527df50df84cdb75b3874bba692f5c70cfb272b31d8e81d03b2b1fdec946ede4cb58c41265753231aef763b9386e87d415ff2e2cada836bbc98c764c7e0fae629427f9f697a2cd54897e9a9f55c799980e69749918f45835a13617ccaf179590314e0f10fb301d5ce76f48e33da4f25b0d63fe9efbfd76cc369a7cf5e8f913fc474d8c080cb7a2995d4c070b7c91328bb7811484d31e02ee1e2c2e4ec81eaa153aa8f93238a3edb84fb74dae8f06cab881436f011ae09d29ac8da43da902d8698fe2cf262b7f6f3823239512e1903b5fff2d569a5fefa5fd8611675918402f77bb8d765a41c497779c0375ff10a7f4e085917396fe95add82f79f017a2510fbe41fba75527fe07150ee958b998c8a7e8b9324ead937d15580d09d6ffc3a009abb7cfaa9d2a962e8ef047c5d8e67c94e70e6230449af09ceba3437487e8d79dce817c28a8d6278e53e4a135e3963e6c59f9b3c0d291aa750176d95126ae424ca5338389feb71ca6f24078315004889ec01f9998fe04056e382c2e0582708a96be527847055a0ff8e8c85f30b4cdd59c97c4a5f11d6e9bc90e07a409f1dc1afc8842bcf8531b5c04a5b0a8cc686ebff67f9d4b91c73dd815e1adedc71b4d6dee7198e4167e879b4ac7adf75d0143a22cb61e1cd371fe34e561836dd555411e0d28d96019de3b484bbd14cd7b160926bff9ab7c3ea42c5cb7ec2ca6ad465385a91c68c38af892ed7804898daefd0bb820a8e9ec4bd44499fe000e1ac754f14f72aaeb80d2641ae5601c80da514ce7c0ef423e0f8398d387284bbc4cbc07a6d5ca72c61a98875fea94837f161a8c19fb8c543c486e58559ee70d9bcee3d4f0b340f27d033608ce4775d7f8d353111ea2786d59196499576b9ae440f3d7534b5256b894ed433ee29684686294a392526033fc19052ee23557b46e205e1ef9235d7c23921b48b0295250d360dc847671bf6f6ef09e05b99bfdd3e9de80233d251f41c1f91faef32ef56ba7580d6e43e90a6b5474368185d7c86a05cfec7ca5ad2218223e8cfe8e601a3532dcb9c96124ebb83b08813aed95420740791593b947f08fa2d6c5afd8491b2e2453743e84c1ede69151e08a4730f50c085e7e00ee622518f2567c4b675682e6ea50af35f52c6b76d5b4e70829574c08ec04883ccba81a446f31f349b214ebd00358cd3858d0eed9a6b6073d1a64d18e59ffe6afc7766a7297fddd335f00a079fdd070ce165c029f52d9c38180e60ffce0a50be268597053fb1e8c80b4b66b55385c1c5fb43a21288894ae8df34761e4fe985a7d24cdc6490728a3ca598286f241503275c8d7e515a68b1aaaf82561d7324e64c8934ff6d25a809578c4019dc1b75155a8bad1a8d73b01aa70e5fcaa33fa4bbd6d2a5c6c7053dae4047ac01a53f8d3f8510093e6fdc4bcd0787339858bd4f4c6c3607fb1a3817c1205e43a8729945c9d1740bb49e9c1f12f19f6789e6f40ee0373cc26410c7208a1e5a6cd5ea2f86fa653e1943c3bb16318de06165f2eccac05f6c3eca4fb93e5063c29152b50b361c6af69db28642177104d18af427ae69350b4ee3f47f165b5d171e19e57c353f750725feca8e38091c7efa4afd2a41d585636b1aac49e75ef760f76c57e7b3874e6552a45384a5d67822e40a4aa6adf4f8904a49b855332f6769d3f26f9d8ff8eeab05f7150f9165ce191630a141fbb0d8ba73dae14a02b6f5583d13f747d1799f02c65fd7d8059e658b1826cba332ef6b086f33efd05cdbe856ba37b58c7ff1a7921e4463870869879f735290755a9bfba3c5beaa914a868a8ad4c67315a34a4f82940e7fc3a3ae7a7dae1eb75f7c9bceb3fde1da32d39f211d1228f789446bdffbb125f434dd55874e51f10a089ed72c5fa006465e000ef636fcc509916b3c9f24fbf18983be46f63ae5324f19cb375fcf3594b7bbd8bb51fe1b0573d51fa5d626fcdb08584e6a0f68f14b4f3908a3ae2c44f3f5f1638e799df651fcfc688ece283c49375a96a71a01fda3d2115f03609e558ac8a9a970b83a160f6baf4edfcd5342a4e0329de65e2c91a2a049d73fbe4cf1c3f88bb34754fd01a98995da801cce9655c9886b10241236b08088783f105f9f054c3e88fd960f41851e57135903c2c0c2bb03090bb4da73353b764bec9efee8b98d6b3078c6985e0df29c0253c95748557d4b7ec156add19999bc572caf52534583b9b4a22cbfdea7cc0dad54b8b4b775d909d21852b3d7446202a5e88c836812f6d11b6110ad4bbd75511e451602958995e50efaef130d9f5eef3b097eb8af88ae5a6d9fb98a2cb6b6115d0f2c6868fb7a86394e76f6fb10552c2375cb19b10f72fdb243707d0afa55f57098420fba3250955bfc2f832a000e616516bbcff5100c62f3357dae6cf11aa461caa01f1296dfb97deb62e321d8523507d2980203f14230385d2846da03cfc7388c8dbff98fee9ba505573d68fee9501393a8d9641cdd0f87a3b96ddc983a05fbc55317f68547e2de3156ba88dc9b5b9040357d9ff7a5a9eaef774afb182507b45f385091e0b0372d57a68208d830fe87c185163cec61a36829ab06beeb56756a4185925208f2429c6090bc705c6fe0fffee0cbc462dba809399dc8ae7995f626538104c266d5aa32325c9149cf21aa00de90c4bec1d95ed60795b9512aac32ef7d76cf68602018f7b6522819990e03934cdc2ab270246dd67bdb01326761d2cda7aa1acc5f9d33f4d4b9aa6b22fe94be2d0b2528d9847e127eb6c7d6967e7ec8b9660e77cc12a43075db3ec4d1b9058b6a66dca963c03990f67033c721c9dde99bf2d3f00d4812b37ffe0dae1006fd02eb3578bc76a2455acd4f6f8c6e0b9837369690bf8c072686dc6b3eb047af242a98c020ea7af04b78e99ca0ade70b56ba709a6e6daf1688b0726afa53dc7a230b594efdbad773f2f0349ef1b2f293c07b32459481e03fdf392b42691d3830a2ad172837b4f6f3e3cc949f8824f9697e8165e12a838648d32aed3db298c3994819b897f5603d38c514f3e58d8b635637d5efb45afc08fa0e8aa2a1fe4ce57cbe5626e15f47150941ce38b9296d9822937dba074a73d01d356131b774c007a2ac6c474e9ef0e72fff044b63835400953c83ac2122704579f3b882c73d7c8fd4b8640528dae31973a6bd142bc5c70377d7eeaf4c0b7bcfd5ed967d198008e7d88d4547b53aa9159bde027a59144f098f0fc7aace2d1dd6fbce030af466ed7576d117f43fe7c9416f51da68349b737aa6891584f0afddc2b13c0711a217b2a3782de2f60c09cb07b9a54dc3057fbbbe84f0e027fab944fcc0dfab7a69badfd8a448af3464c738ce3f82637414ebaf3df1ea317a3475d9eaf061f62d9277fc7bc4cb8596914997fdca912563a905d85fb51f0f65e50924f50867f112647792f69e5d6d04dab870fe22799a780cf5bd8d973982d0579dad85d29ca21229e228b0fba76e66863c4c380fe3ca9c84e4e62d61dd92a3d05afd0314a5131327e04711a25090a4defcb1135977beb55bfadca9d9b548c699679bd5972d4cfea89776815d01dba72a212af7c7dc7dacd75e2667c869ab22faed0f6523da53bcf2323d68f2625855b2d23c4c23bb0f6a41394cd1f5a1c39d3a14e21a805432344dd7242e2a1a0e97bd38717a33bb7dd6e1b2d74d2a049920a3039b5b7544f14d03afb43bcdd20656947a50e9c085ced7fef24e452d3a34947be3c292cb5296f15be174f8a331467880c2610291c00a57e1203920c7ec9ddf0bdbdf264a252b079c95edcb73e0d8e6c7352d2b70153a3dd3652146c0c2daeb9b147b7fba66b7760ff5a51d0786c389b1fd3bcd232c65711ae98c1fe063f59e73b61d05e3bc4328fc26265725cc10488842135173ac93dafed30513ef78f5e2dae84e208dd0d604ab53f8df965ac60a922b3e1d283ecc62c94b118ab4a8e39e1ad295387f4a78f263a2a11f22d7edb919e1439b0a8919f0c17b3aecf89cc6ba799d7ab582d131da6d3bab7d90ec8e3c638caa32e036816d308907a183fba61d407185ff5e0d0aa411479e63aa40b07bb852fc4974ec0dbf5c9d00111d6e8cb1b6753f7edba70a3997ee0038367c5b5e625ec04a8c54c4cf8ee0aea48e9d7e5d25d22f9ac0473a7f47575b64fd4797cda8d67e9cf115ae850d7998c39d2f8709d3afdebcd794a05f69ab364fc74a6db0d1e3bfa76bd8d3c9239147d414cdac9d0935d24ae63746c144111a615c2ce4ef26ac09d3c2453c8416504141b91ef7020f8c95aeb6d7348e21b28e0283960572ef5ae788bd03f09c2fdd107055cb6f1e2ddbaf4e0f1d71ac48b61a9a0630d7217414de2e25bbf7fbb6613bcbaf7b1cdaab4aa694b9b1050501444691aba162e5fc03782dc2145a87f3034bb891d7071fd00304e77b3af88094849b4f3b92aea4d04e3ced5cb7202a2decc7a1c18637d3e62b50ae1e615204489fa03c7daac448391fb2d7bb4b51cbae4337ed0831b4df33ed13536bcd1c7b67bddec03b92abb77d9b6351a679f652bc3124042e80872c006fd43d27265ecc3705db443bf16bdbe4ecd6c4e7e915a6a0de154efb1ab7a194d91bd41d161edf01a0212e46700d9ab83a93994442b9b1a271923337a84c25395471801443669c0cb638e824b797de3fac2336862de75a0913231ba9d14fa235085ca9d3553deba26ea6d89d6d148ec36b0d057551a9891feb516e1a3ec7ffd11c66b723f5acb409f0f568793a89928a9ed96cd85706262a22a3945297bc2455b81712cccbb9df8a65acff7fc800d2dc6e10d578e6071a73dfa2f5198337f90906f622967e6f546df5540478bc8035030339a71ea7b24b424bd4f937aa3e65342b8b5049b7d3fbfac774e12dc112a54684dc4a904111a2df8ec30973b5dc5320525e02ac1defbc790494fd637dbd0aec1a8226975d2c0791cff78b964c16a813a1f8a18859ca8031d33dc0e598894a3eecb2a3faa30963a136f7e96816f64d5640e096a5126c2d6b5df5927abb7e4e8423f42983bab29c57ec4b89b1bc832a31589e48cbf1dead6fc947dbe98ea5fe06e6d020f84b2f9cfb197bd539e5c527eb11bb1ec29d27e68540b803fbb805420b5ecff022fd8649d5e40f33c83ac52dce92be8251bf4fc2f5ead27278e2a603ddb27801c979c18d2d76900d25638a2220042fdb42ff5f2806ee1c9128b39127c20b53bbb567e84f4af786ca19071cf02a8e97905b045eff01751ec6d2d4cd980391e987ad6d0177758e77d26cce847d34597c0b657754312ea6617a40ec623ce76bc1cb7a3616ecf663ed8de662c9b3868d69b327ff49a5d5aa6c1638a459fdb8c264f0e4682e98159f6f634e68f3786751e3f06b4546433ea8c70083a4b9c2bcbd585fb3ac52621a6a86bc6e8b0bb621cd742af7f152f3b1c9fba2e9938a723d85277fafa989324cebb8000c711854fa2aa3c994aa769d75358f633119d5f7814158b7a008dbf0f44b9097f1c2223a3b90f8350a18b929d3130baa25dfa138d11a74714d7050845ab193e9e52732502b26fcd721e4237f138bf8e18b8df61d743802147f8af1d7c6464b5eb0474e7e14153615a1b6bc887dc7dd6f2ccbdc8eb4c28a08fefec5cf80323f5f19cc81ac3c842f5851358d2a58ec42bcd03f5c73d7e195b49273d455cf9cf752e95bd0c2ec9c6d09fa0a9d4eee25af303e947db426bcaa8203912752fdacfca1e89f45a86c857a8e64ddf4dd8598ad334070483ae97c51d91801c5ac508cd5b2de3de7460466de5157559bbd666dc32d9c7cc3eb684812219a6bb64d11610aef93e0be84fc671fb89b1a99d8d9cd7a861b5ff8b0ea4976c35276031b875624bfcf2ed34b9bb2c72df7d5f61425e059a685c1ef72b9a6042505cbb300fc90aa8959cf2d812b6c5e17352ebb5b94cde8f5a24caf171b8845b07e12cee3b63a24b7fa6cd410f2c06ade1bccef946cbdafdc3aa640885917bfcc84f25dabfe7a1ab07aadd1de39d475e972589aa7f6d737c11477aaaeba7afce2de1367421c7815dca1392bd547d006a20179c47b7a44070df968f57088da8458551ef48f585e9da336b9eadc66dda67092d876fa402ba729b1202ab5095edd98b1bb0d7afa51386d03d417dadc23dbbbeb1cb80b8fb5a07b04485167872f9108ba91b8eb497b70a2ce33b9b9f2c930ecd5ee9096b109796dba88706d487428123749ffca8e04ccaa607dd860f0f72a6918f60884ec51ba669a8791af9556281df28aeaff1214d4ed815b7cb71ed7539b7cdb27bb89b2ecce6deebb15b5fd1b90b1fd80731ad111d4f875aea6c38e32eac946f524cf56960cfb64f787f29088d53d4ac90cf1660ac58f72751529474fbfc6de7ba70865408a0c924ced9238f8535e18cdb3def947290cfbdaec962833803c4cc02d7a0672af6820c22fde1cf272db0f955128b3516938b7e41353596597f437cc9c6f62b5e3d6b561351e65fe9a7ed828cc18bbafebdb4f9b72a8036d6ab348a8de2da1908e20f932e79a3aa4330d1b8e0ef63ae919bd6a07f2dc4ed46344275bd9fcea8c180c963c2e99c46da5517fd0fd0a57885aa5b13179396121e86e7bed7726652fea633187f0652ae05912adf5839b3b13155dcb20f00565dc63f8ec679ef23c046aec751c17449586b5184d0587f20d12b4ab62dc4089818e3bab24d038a7949001710702897f2de5222a0609f058f60e9e581b6e4f0ddebed84fc8302c8e985d17b89241305d198709128007a8131e8e3b2ca0dd07d9a3f4a2ac839062ef6df2158bbce2f22882f4d096640a966bac1af3ee99314f34f9b80189faf7c2123ed761b02decb9268fb2e17f5a17a2aac83a2e68ad730e6808935dafd86d343e319565ef8e676ca1694ba2940938b4169c77546085aa2ebbf70c1ee7c3faa0bc6eb38812875cf3df37477d9f1a74b4f94d58cd9fc9de9676efacacf763a7eed51eb931dfbfd23629222cd96634d48a99066601ed20172ee017f96fa7627b06ce692fca20dfd11cc652841db3005e1f3fed275911325ede43987dd0c1657fd0f2769eba9b8e618f00eed6b34c261c59322a253bd5a8ba8ee599c0350b17b935886e8e6919758b771d1fab02f94d1621bce6e810ff2a3426104349074f1d331bd778853f613c56ba660c8a72841d53602349f641585fd38e0abea0af5322f56c28bd0da43d8acb4123defb6bb340dbfcb07ad934a8f09faf1b314d93e0cc050ec365ad007307f0f49cbc8655505bb6dfaba21953b784a06f8dc4d81dbdc36debf097eebbcc5ccfbb18cfb4982119edef5ce83c054cc4dfb7a6a1cab4b4b035e9f77b563d1031707fe13e0c9cef1f86160a75ccb131586370b0edabbf8b3b63f21f3a6fee072dd9263d3217ca81188c3aff7051c12ce73480f1d301a80b0b01edb2fcc13778f9149a75d35b88a1aa04458102519c06195bd1b27956d6fcc916c1f6e8d27e2d3d29c1d048623f157df81ed95356aa8798df493a0731b1261cab5834272d2ceca01e8598bab458a63a6fad4f8ae7537609c8d2d3a61ba150adc799b3e057aa7ecafdcd1350d7391c8972da2ad08dff9c171f53c37e9b0e4424726cbd3cd95fab64ce808b33554c3f11088db44cce16c268ebb353b63960c828b4b998633cb23a169788468ab6f8d77b39ae33273500aea434dccb767dffa56196688d7c080df58762cc8d7e80a4ab6e0d25f0884725297402b573e8f054a3781f62e4b0c3d7a2603634a7373dba84938dda33988eeefa805e26923119c58915588de526f7770a481ca8dedc74a12a92c0b6447e91c1eb6f4f17727c80bb21df47d2d8072b57f5e81a107896aec16512af9f6a63d807c2e9de7059efae9f317ff61a047ae8de2be83b54be8c7282fdbb607eee6fec294898121990b22ad7829c6d4bb2a8b57473ef845df8e7484cb937dd3c18c9548d4521f3fb5fee7ccddcdfb34e2ab81a8196a5ff116eceb887622b2ebf309a989d812f89fc0dcb2de706f0cf0cb4d39f6d5db3b359676a4b9bc04259f17e0941c0c368dd05e470c48fca76cc6c9821cda18dc1a81e2de288f09b2268b94a3fd65dd474f6ff2a06c92cee1aaf551dc92b83f176e746065ff8eebb7362fedb64dfde7dfcdcd028b4c5253b8382b18cf4427c507b77 +0xabdeca34f0dfd5d9097f0ea9e44263d17d93c6e02372c2e8896e8bd8c32957ea39055a956e4f803ea2a341166a87edb91cf0adb758fd39eae9438d0b2cb2cd39 +75472 +0x03405c03ce1a5d8fb4030f73596050e5abba9945141cd6a6f4bd74894edfbbebc2f75e83bb0e5045e967da2af262eb3364a0afacef6862aed14a67e79102949df09fd1f11de4e16128ee7f91b917ad4b021b49c4f279e121ab1cc839373b699d767edcd65b62b7ed58de273117473f346b718f178617f9076c7cc008a853e2f13ddca8b8df517bf06380f99075b948f689eaaa2c14095269fbb277db4b12a6a32c035c221078d473301c1e383936719a42d0c28b0218954e4006143a8a3f5ebb2a3a219956a16b7da7fabdb1cd8662278069febdb90c6abf23c0bfadcca4b13f21c81fa71992e716b061ff819771c2a52aff8749a2ad78c38c27a2bd7a074839f8f67dd3c114f246339b0c3201bf391d28d885b724c268626384e2f1fa31cab0970c64a5b6ef311618ee0b4c71377196623c1f90a615e1a4901faad2b5eae0ade652fba661eb4e8d47a3245551a20f18bf757d5a926c8c92fb4020e713f93237cc0f6b5d28d0f1b4a90181d708c8beab2acac8a04f9011338d2f6cb87d286756348ddb537465c19124524759fe712458888228e7454917902c33b7cd593d28120312740eae73672fa1dca1649b65e926c2e6c4b9dc5e46afc19629af10011c7422e75d183cc28a9309e9b57f476bb61ec03ec59d7c99489a359ee9e50b3cec837954bff9881ad3c742bfab326a4d33466ad2521c8dc0c2596e9420f7b1b63f48f0a0c237f843ead236a6ac056cd107a8a8e994bd779c5ff256c0f56e6936bec970158d5cf60476bccbe8e081b5c0da4c63ccb308a2f5c46fd46991d09d861110dff949f0e927208debcc6e2dade1563881c4d68577939cd7cfd81ba8b46cdf2527951d7939728f4e7d997e91bdfe2176ec1725bd5c3d8d333156bc7b16b1d00e2e3132814dae6b0769983a364bdde30e8a0dc937babd3f8ae1299cd32a1d8dd5de15b08f8fa35ebe9711c8a3c147450645f0ea7bfad95ce4c799e2375a77be821d88be2c66180e7def4b50608504ee680406af12825a894acbf0b7300e890b1bd5d384de3ad6234b5890fbf601dc883caf994183bc0770c2d5744245ac191aaaed3f2b3074a64631bd26f0ec9b97b8882defc8560eaab957cd6facfe9df096364d12dba77a4e1f35035658cabdfc285668506b14e2090c0e9b271ce349d625c8dd94bbcdb596556213685b19ced580ad470652449fee0ff127e5bb7d18926f67850ff4298d4891bdd5a4206036e86796b258a66ead1f6d0759f0b05373ee1d1b2dc9ad436b2a7a503152d0275cfe8617918d8f1a7464cc581a9224edc0b0d7ecbd0b0fa4b506b92210b992f7aade853bccee34d15c87d5ed50113fd468a144e31d1d42d3d5a2f53b58228f5687520b074cc3be1acd4e2fcde5b6288fd4890d0735476d5831c6d7a4f3d5efcf5b20c085f754547e2f838200bfc908a66b30da61edd1b9bc333c0664c71ad9e78f114ebcb6e81f84eaec788fc89206a2945d52f72e024d8641cb2b83be39752889ed5ab472c847b46652b781e6584b0ab9da1dd3de24523ec53aee0abf79ec19b27c8f76113df3960b7ce7de0365ff66416de4fde77def6d2652f600b1246642728592097d8d4bb34234b1af06ff483f94df4f7b2f564d9accdbec6d7e800a2c32d20e759c0078927140bdfbd76f511b1af70557a0f6934d1f9d77590dd6015e5829a9c358e0a2bb0269b2ca5efd40853b7faf9921a7ea0e875f40cd466d73604e530bfa9773f0b75b77382483f03e025f3df44799af7a666cebefd0118f87bb7a18dd2243038b0de632f9122e92721ceefb7d6bf2576adc36072b6b568265f6463fc74443d69b4509629a9b4729055a507ff10c13e7e3f94d7c9ca5fd8f3699199270667f3447e82ecec6c8b6fe1e44ed91f933e4a70c431911eb86eefe222d5ad78193df67b77dbc3f23a06359e6632dfb3de74dde0e440390c0161217503973d7a1d04bb6148c1b7d592b3681853e7984643036d6108471bfc25e4f22e945cb5a7927ab68869db250117118c0225e37f3171687d53b8acc689a658e6614d9ca28b19fe7c63439eb80f37bef5ce549d111fda22824b6de7d51f033b82cfa7ed808f040e71847e72dd4a650a59ef789ada6bfdb010baa08ea436bd1b3bcc2bb5dc3de1394a6e630e115d3f820ce80a6357a04cafbd13f907d05b346695e9519c121241fd4b73a9b6d0b217c4a34a726cf547575fcc09cff9d61719ac05a9b1f6cea6a6d90946bb03a7e39e309189593e5fdb9e6ed1eeaddb11d4dd6a2f7fb55c7e65703b186a0f7b036c23547c17274de3e7925b73450b02302ee01f67ede4338dd94eb1dd301f937fa657aeb78655222dd5d38404af7025ad8fd23a4376b722896c92dbec3b73d3894cabbdd8596b419a20c2972a8075abe672145936acb6900da9dcf7aa0ea4b19ca980005302e222b572f003495a741b776036dad5f25b02671b8db3bb0c1ac4465774f4bc15524c0c26dc36d5bff3eadcf4aa6d95ea2d00423c358e83d65e71f2d11b2977f324340ad6f7c074038d908389ff5ffae6a5000b8664f698dfe8414e90b30d1b3ee0613dedd32e98d7a9a307aaa640898a4b884f748c7a6e8b30c8a6310d1e1a5b0f6a11d5eeefb89ec0a8e5d12fada647991f7a912c88698ac06e961c69eaf9da19952349ab7257eb7b088a880bf5e5a1061c1966b5bf4e412fa98acd59e23e3e97a8fe93a954fb2021487259bbc7cc192b34a86fc86d5130d70010ce6da26beaf1ebe06e690616ef6bff49a0cf81de3260cf9416d53126ec4f18b48a1589e781b0f495145b143fabb3835d07a7b2706f5f6388e65ca933d60049e2aad22755757d4969300ffde9e7807b48f8e4e847326f86f378cf240c80832a278b34091a488f50f93be8218a256b5d79ef0781a72e29b04028bd30156e502fffb5ab8dca6d9fa1a1b2843da4d7cc908c74701d34a516560b80a75bf301ffc1e7b4b943ca7706c21f1e6490de912cbaed03bf295459ae0eb21b0e1609fdda865c02ddc9bed75d38bde9f9d97bc4244308276524aa9e6940d04261ecee9478f3d91a996e0c111b5c0aafb45620f32bbf8a59d29d9bf5c082f2a1434ef5686380fb767ccf36b6b9c281da44b54290ab86d015b802acf25c4b75c202cad30c22b41fb0e85bc33ad0f2bff3fb65754f3c3f75d555e252168500f60f50defbd22f13d2346ca2261fc973117778f52d61565fe8336cbb2fc4e359dfe39df9c47cf1169f7b9a2103c83bba22ef1dd2cf89725ea39a4cfb9aafffacb0095aa9e14f1132f410d156b0d6703e60c58a8cf02a18c244847732271a227002cb077dc6caf80f6c7ea2b1c1cd3f7657952f9223c5d211278c9bed59a5f44a34c334d3e9931df2552f9ed0bb1ed20873d87d70dedf16c1d90cfb9ba6c5fda1e26c535ace2a0b826aae1622014dd05b51fa14a785f85f5ad5a046aba31ca70d8830f360e8e249460974b92448ccc2e55e9455a4bd842452b9c0ddbbb2fc88f392ab8584ce6e4f93be1df865d63e224d1611d106ea14fe3fd1f9514a6b07fbea9e569a34f3209721f4f444554df466e8f50d173ca02d5578dab421b64fa1a85907aca20fdbaba8474ab23d712492194f97d098b4542fc2a4208bcfadc55bf6c56b282d63fc520b9a2bb23457ee99a1f75b26c61c8abebe383fdacb9f50b97fc63553acefe9c62981148ed967f06da966db5a2fc3c83cb0aba53ba5e9963c9bc202b990e2088aaa92a1928d2ffe90881484f54658713c3274ed28df3afa47d35f3fb48a08ecf1d7553f87d02e5db4d696e482aa293a3fcc3a742ce7f1e17dded458fee8b31b9e583f5ab942d1922d1d44768cbbd467b9e652d6b240bd0040e6e7fad34d8f0902a5b79fb145b8206bb4d3b77e0bd8ae2d0964815389eacb33b40071ec28eb29a138645b0a6940ad13359b23c10ab4622badd6007b2409a6b8ae947aa3fb56121c98bc392f1e198c963821480048e628185c2dd0a39f9827523f3a5185456e46b74f25a689e491538714fc90b636ec54859cd27e675d24c192fe68b32a87823c03a4471fc54d56764854839a5d65459be5d87a6630fd2e19fd64860bee423066a46087214bc8c7796c8f6cc160546052dba77c248af02274f3fa38c85af5f75b0bec6c4797d762d1561e0eb25974fb1db9726e45ffc680771937e774fb23558d9cb07cff3409b712b798ffc9c357445111d1a726e9f0e694cf96289e494ac972e9451fb4aad042c1e3889694186bfaa1774ddd63e3ffc36299ad62a0bfecd1af7422fb0456bb84437c55898dd3337c635c3f77697853954509e62c28e989fc97cfc2656ad23bfa3be4983f337e3e482b332eebc4119cdad092c8eb933092a8d04ebc0554a7c222ffbeb93e0193fcfc7d8eb4c0f03a2c0289c6ce377c3fa764cd8368415e41fe8d235d40fc949eeff7bee1398d6a6c91aac5087e86405128cf04107faff43b31973b62b7f1590997c873bd55b7bf335e4236fa526e8c3fa735f8583ab792ee1befac4196c2cb6e84fd408571c65af8e26743fed236cc3593383ecd41eec6f51dd4ea8c65d7683827f499cc163fca57ee68709886956ced8d542c022dbc1ccaa8159aa59da5bbf1014cd413cb9a89cab2e44149e8010ac1f5f8647946b5e0e95af0211fb6b433139174a3df0a4d15bbd0593aa56ee0025d5dc36cb53552dfdb9713127d39996a2a68fa7d904aedfab5d745c11d83d9001a2513a9286219460bfcece320aebbcdaff84cc5da05f3a54338187924df4270730c87ae45658fd004ecfc27bc7ea1da1ebffa111ee3e4a1ee637fc75dd9c2c002448dd0beb81cfa60f7af34a331c21bf12060d3c13d378d11f9ba302afbc09b529da4d4e6c247218a9d94ae7760b31fb1da4fb283aa62a3485b76481ecdc25ebe585b2f402ca4e1fc5f4af99b73fb31eb4de501b8940c910c1922839bb85e86d0051f246d4facb820bd10ba91e3f11f07ebef55e2828be2d7a34d573453dba022346f68c0b3c510b227a445fd493b139244bd23940e6705359a65577b18f0371f66da60ece184880b3f7440301c3fdc14d8dcff3f903464a05ef8e8d28002b8320cdea13461718aa654ef1ddcc575b50a28dd5d67a06aad927176afdd21a9a004a6eabe59ac02951e18935355ed835adcb52ca28ec7703ca6727d00ed664b9b01b59cfcaf39be33dcfb0f752dfcef2a16fe4983276dfb8e36c26a7095d66ee5a3c95400b7931af35d5c91f7d76bffaf4364c253c41c433eddf1cd9368ea9a2c8542ae4ef5309f3029ede94fe4b35b56eca915b8e75b1dbaf67114ddd92b43ec00c21a5c0aaac186cd0f6401d87b78bd6d0bb206f392b18f3ad0eeb46900f280b0c816ac4a5a0873b141a0a2252cee4f6f3d35e29b5bc527f591a9bb9b143ca71fb521a456d6fa7371151da54d3002894d9e0fc0212ebf11c123e457d1dd78bb9819d9f8929a0df2870a398fc33d8bf792aeae24378405d928081d1dbfb53d2ad4769e0d902bc99d5d8182c6299db116d8ffaf8330e44ffa94ceb271b73400913f5bec57c204a3c07f2b97fce2e938638af16261cfd7e3d291e843085af2597b433a436bcaad23086668d77881a8787a1344954446c7780d99d55d260d48ae458a7241bdfc9dddc1adb9cfdd7843f7a71c3986af484b531827265f6f60df758c6fc455c2ea4f2aa8bf9effa059444c970070d50746dc2b6ec45bc858d80f55bc8d810e2f1649901a0698d5458741dda66a5afee0c4e2679dfbd63656e550b5524e48b9370305a4922d37ef5194952171b48862c044f67e023826180e1b5c2aea3c7c058f231beebdadecbc38f3e6ce757969bf3a39a0f557f3dbebc2dc8a1ce0d29b71ac18e4c4d8d337ba80478f2b1e137f5293354a63fbd9683039cb5301d2ab477bf23708dd8067a968bbe226cdf82d49cb8faa8b206a334b73c74a5f704c20e083061ff07f40c5a2553066262d80215998641bcbd11fac0624ffebf7fe99cdf7256c262440a667b2fea24605d0429a1f37d4fb84eca89e18c23822c4f3581d0bd1890c2cc80dd86bc376046e5cbbe21b2846ec5ee981a403ea24813ef513988f25d114625c03923d522023980958b3cdf82e40b23e3738480b3979de8a38cb0190f8f17d93042f980935163b8ca569b8161fab178145d56583eb9f1c19542f03815505c703abfb1c77296ec14d2e8e5a008f8df7291a05ed02cf439028e22ef59579d3e70457af2b2a71afc1c1509c3445f26bf9bc30443ef63919a34f6f55683bdbde563b83965481b22b959fc80dd764ecb767a1251aebdccd73ede3483ccbf2ffa78d0fdc5b291b4f94e52ed17da3dbd312f97e74e46434f104d88b294fa14959a20407be680955be6e18f519463a2949e107ba8c4b488d582eebad7f0888ad7e6043a9a63775df9309b9991c01facbb5b41adbf7c9f9444774afd0b5e1d29dd264d46c20640f07420a3f71363b7631ab0ebb5923bb070863589d8b6a861fa8fa222ec5b958356b6fe22314145d2cf9ae4361c8bcc8f238104d2d44094fe04d6a1acb5cdd9e798a5123fd0822d19f92141496910f6e3b51f2e4d7712eb994f986d1228819a15bd2ba3235b3de533e8980d4d248b80542f46fa244c9274dde4bf4c7dcedda0b5cd2ffaf55adc33caa4e89169d663338c98e0af7cd829f96fca3187152d4ab26ed19860de56c6e08336f715c60600d730f8d49680a53f40fa09d86501cf319ae8cf501b06d663b408a5afe18b3cca34eb580af7553a3d1324aa9a306a3cf81eccd23e7394621b7601f9f73ce100291162bf6a1a261f893895b4612e77fa0907c2df4ab2b08256f0153bb670f0db85374035dc4619dd8d77f62f14a95193ca1c71005c1e84bf7ce8ed72d6c3df54466f2bc248c456fbb09aef249be71f8fa527823c5c0135a0f52731a63e7ed7f4d47fcb6f96dd06015967279ade310a7401ee9c9c32a1eeae297588dfd6e8ff41972fca43aed65177f2a84799c4ce3acc453b6826c747d56f81999a26864b80c5f849cd4778fa5ee6e223f6293708d61edbd48ee4013a126d635d108236ed81085d937f81dd9056d691a1dd531f2507f32a81b5dec9c4ce30388792fcce182b912fd785fbc3df60cd67e9a41e626ef4d29a0c851b082b313e69e0c79b3612a6e8d7db8abd1430a555ccc5f293e92bc643933ba8a3a4b862215c30586757231995bb6834cdb6cb4df528fb6fb89ca4a4ce7dd8c37e87b38a617b3fec681795ac2045452b3593f87f36e354c4976320b7fcc0a981b59764d0842dd42ca75fae8912dc3c18fd91ff639e6598993827e92654c477874ebe125d14d9b9c02b18b8d5f3e713a32b9a2722b7168f95a1ce451a5ff2098054e2075899e9b44ffc28f9bb49d09373c995bae4095f0061dc427dbba3b02912cced89ea99c48e812379ba619efe8431de69fed01aa6b5a5f169d830aa679de5c0c6e13b9ed20f00a7f142ef79d9ae8473003c0f75547408e62da0a2fc802ea2375557722f7bfe71907adb8e63c9d8158f41bbc89fd20632c5751b381f61a4f13a8232b8d527247fe7fbcb66e336cc8c3a14c524218733cc9628931b9d74c779d035bc34163e4ad0b35b5b9e818850907c61a04b84dac27e5f304e72fe205fe301563b0f7d28360cfc84d35ec5272dc95e10956450357def2a749566c8cc33d6d5cdf8708f4db1dcca5d7bd0387c2be0e70aec980bff2ac8fedcaf1f85e20cfb55823b80d61682e826ce9a1961ed117d2035ed0e3f9f92b0e450e6c4bcc9b2fa885e4c66d9e973d717bf7a64c8e3a9470f7ae0ef737f7d50e2b8807ef6e9ed7a7747724b202f4a51a61861d7f6c7b9e7bec20c623006b35003fcc674baaa85232826f6573451d000dac1989a72ff0a0435f3ba90fd9cfb574c0500cf9074419fa5e420b19cb5cd89bba367d6c4f564477bf632a062a91e0dc7b976b600afea93f6673882e0c5099751a415b3750f8e5897b4bcbbe795e51b7b016f5293c348aa219986f189e84bd0a5adec580cb752de9414a00915c9152970c635cad018238a306152271e855cdcbea732ee1154768277fd25b173ab79deafee0e47401643db2aa6e34c27060564a478309c0d4dc3eb4a5994dc8aa4d8e33f6243f169267046185282872cd20c10600a2e8b870c01c1150f35b1e01df9df280b1befd5ae7172014c7700b6513987f94374e207f8f8aede075059ff7ca57b73d0e06a0c180f09ed7c0ae04ceb5672770d49ca15796f58af292dfb6f2aa45f2798d88994ca12b0e5ca834f77082978e34ff76b3af730678f5d14c0b690be324c4d4d75f72e4211ef1e2974be107c4244f1c4ecfdda0184878b4cd05e15bb9debd68555bdaa66d416604578a96b1577a2daf976e78bab579d9b1e52ef2062470a1bc9526ca848a15f781f82c081bcc005f4dd307f70f687db75d26eef1b7cd9b40460948e8fae1ed44effbb8cbb3bc57626ba434df2a9bd4901b04ee86dd1faee799442aac761f67ccb2d4b947f592dfc58d6d6d9798ea0ee28ff17617e2953c262ab8549b829cf5fd5f0596036dda1a0727b12ac6e6bd9d2d009f4e3b64c8b37a7ee84f2cacd528655920d794990c8695def1f4d37090ffde2140bf57d024b5530a5682d651726f8345990661e3a4b5fff7a24443e30eb784769841f3b123b25e5185882f1cdf3bd588e0aaf1fa3d18a4166491aeaa7144ae55088e9584502aeaf8e7d7ad6b863deab78a2ddb39203f30bf9b856a238337ba6103fdc3c6349f97451fe9c7ca01c621461817741d089a1467d9680d0a9f01471f3d07f4f34b70c1ea704714b4dc6517a8fcf0533260a9cd8380e20dbc3f21b2d3f635afa7ff5f193d9b780ac860ab4c74bb310f0592eedab7345bf2b4ee29bc43d22f6a30eaab0bd2e3e5105149092e2dd551fe0349e9ba67566e4281267991d3533dab4a77f4f82f0c26cbfc0fff3b38ddeba6b7e02aeb08897183ad72a1f206fbe8e93131cd8cc656a5a4350ffdf22a37669f9fe012fb3f200e2c964d334b532ec9baa1a285282d75fa2f88c3a5f176644b5f27d442596fccbca3d8209e1c4c8e4885f834cc68c8cc8cc453e557a7a1f7125bec3739841ee1d58fef9742d3577cfdd1c182f3bd2cdce60942cfb3933172442c59835909b1021157491bd20f088d523489f7ab93be199e74c1fd2a22a93869270c432168ea9fc8807118cc2de431de14ae1d449b11250e9d4df82c048debf9f250e13310203d93a2043881ce5efd09f8ca6e6f11ca61cec9634b498733ff6f14d4080eadd64deb125ed5a35eed515e675b557bb62e6247af9e6103494fd540e512020480815337780d8aa15e23e153c6dd8d0af6c1a911a65bc3d9b9461008097779c536b5e011497cc1fc5a770f82cdcd5f9d4228a8a554280e4d559b322cf890c9b13ee86700ed491614c27b4e53b2a7579326c7d38b1f9f8acebcd3be4818ea9c6917ad7a7ef9eee19b2485104f3c080f9d1333dc2b8f0ed3ee4d7406c200d14c5d4f597cf3e5cacef00f4917edb04be20ba5d1051f2902641c85e0ce23470163fe4490f0f8478938a3d12ba7b7b5ff797f4d43f0de6416d5e9f4ce56f431e77ddca5c879048596b93718a15225c3af205877e111d1c6c883d7288143bd77fff468d1847791267fcb1a444ea9c05fb78137c45d0aa1c77408548fae06d77fb7622356396f36b0a0e8ddf278111fe0c5169da10c2db6fcc5dde2a8a932dacfaa31bcb27be26d9aa68ce291d21a8d0d345aea9c631d99cd1a7f21f2074a5fce44fd7554b0539e6afd31d8b0e138902ba1c8af15163cb2bf0e6662fa4cafaf22142fedeb7b4551a8117220ce0a0dd1c279da7bb98a1daa490e1e562fede57131944396b5312a1fc88fc84b47c0ecca78491aa0e83322e90186115c116f8e2e9351d3006076946142d4aec8bcaa57d2a38c03ef3fa60ee77f22e9e53d45fc3fbdb948ab6bbff6bead6c8019ab2af192dabf20971e57143df85102921215d23d17473ef84571e3907ed3f6ce81d72c73845efb3902cae545239cf5e31e3382af469800976c30cd8f2d877d47df137b0d46e7ee558b85f4a577632e48d0439ffeb20847d97e7116f330138e2621846fb888e6947d26fcc4c77a402643d6aa8cb3e0346f6ecab772653ce4a3e9e78e7d1dd0d7680053a3c83382b078547ffcdb57679901a7ff88426d9a9748f39fb625a5a536e39fa02f916257409f0b5a9efe61ae9289157b482974df97f7d3c88febd87c81819b7ad492ec3e5d04c8f525885b2bdd7047cc9b7a1382534b2ae060523ecd53ec9462475f39ce72342dbe14ebbc65c651bf71d6c6a209758d3975fbdb312e0a6f0af50c48c37e3cc7aa33e1ab0df2e9a7dcf9ae81d90b6b68b007a6f9680531937f81880221c3f919bee51048b849b3ed30c2775e00dea157ff03f62f3be945f462b63efdcd4653b4ec50253753e0b18c4b7ab59db219b3c5a6f96e0f3550d40c44f1b5be3e6bb923a2f39519594e6f1f9d610dd385331f4c285672fbecc2484596d270a5edaab5d0834de44140e949119743d491c2b14055f3b9a987bab43f2ae8c6f4576399b665fdcd97519347dc0cd961ae5b132ad37db981763537bd1546bb4db535389f573e830122ccd8f0a46bd468ff81fef6252dba4c6d86dc2367038ed537e1c55204d4a3771b157a6a1ea908b84cc8eeb9c1d0a68903ff20bd90ebb40bf0cfa2284bc2ef9df4be001ac75ef6ee1a725acc4610deb5bdf09db24f89fb40746147a89873c7f4243902991b081f58ed20cbc40e68f361101dbbc7ef58a52137493e497781bd084e18ea5ba60ef2a73956ca37a74364f98ed8f354fcc2521cbde9ee9165574f48b6d03fd8d50e01579376de7d8d3aa40daeb4ecf0046172918cb5e0f6ee7eef4412f16ba7447fdbd86023612c4ca9411bd434010f72b0872e085fae107f632d78c6ff063d60cee2a833cf0aca5239cc82b3c8c829d43a2050d529be44a4ae7a55674b8801a685a64592ec23be3a4696f0b1f5bad5a558ae9857b69a29daab6678687979aaa23e974ee20d549e616a40d4434d418972b6b2632478ba269df472404f0b538ed0544612c5a505d1540f4abc0c3204bba8bebc5fa002a6c17b241e4b8f739e24bd61333fa235c00daec0250661466ce2d3eb2cdc7ec6d890de84daf8ae44c202c5dfdf23fc521b89ce076041e6fcf2a560c694680557d80b54c128e62fe157bf863aba7e586c610c4e5f7cfd01b83e69fbcb8380d8181d976a53988288ebd7a17b0c55ad3af748db8c32dba6461a98a6f1846ac56b9a21db7ba69a6c4dc6ba6f20cf211f18752b9e142c1ccc389699e2de6bca9424408d3e2544bef1e304885ef3fdad62758891ba72a5b0ed3dbecab43efc138bb6cda835e3b866b1ed27ca1771026b05d68403b7342a2867d9e5a3918fbfe60a97741b59337c322ad092e82f3487ea87b01a0a2ab533f3eaa1cdbce14d21b29f2ae64f2e910aa1db11f86aec9af89c46969d1d7b925d93e409b95f49f3bbf9b7f596cc1c88de263135aadaf630df00e0fe8fa620380198c2964b33221ff92bf38c080ab987814fcbc03cb0d272a5a8e56c843ccf32ca7324bbf5b1002e63e9c052ac937c197e7f19361074e7fce704b244fd59ceff02a3890f3b617aab8683acfe16eedabb304497fbe8afcd2c0da4d63c7d85a61964ba4de4aebce823dbaa27c2b9855be93120c6a607c9e87c93f9cf976738fb0e4b1801f0a22bef03ddcdbf6516ff86301ba423b9004bd08b14841d0a5cfc244a304d43a7c856d5d7f76ed239a1a5d00c3a4f4da964ae0bc409c43ce9b147b859aeea617e8396532cc2fe1ed50c20cffa2772a2eba778f0b3de4aadda26942db9315009e96692ed5ecafbe3bb98e8ec666dcea2144b3535d72c77ee400f6a0ae5421e9b7cd3b4eb0a79f8cf41fa76abfd77a3e9a7b25b21aa5eec8cafee41c66a7bb6a4ad7d74f29c5a75402c8342850bcfa2d82a9f636aa9f009079e45b3f6b528b893ffa66b9aa0d6e1d4cfd5e51e3df03bfbf144d677628a6dcd8fa828f251d38507e7f10129a489defba054d6cdf063efd3a0453cce40888b6cf878296fdd26bc7efaefce4613edbd2342a2801acfa52eedbc330ed5d064d2546d583dc5937cbf57bce53b667b7d1cfa2b21898b283e89b8b980b524aeb9d32252aace8a21601e208293c11137b27edece644ba5868a80a30ca0c84117f22e354cf25424135b4967f05e07ccf518435fb0ed5ee08733945b3a25d0a1c8a8142bc0c17729c5c8d1ac9ab677f030390adb572f2bd2a6a4454fd68236cd1d465574328aa001d553375cc63f8a21557f45f0359c4ae2416703df56489339a247429d26d05752be750af7274bb6e6e165853ce0d72495f3f660a82ddb4e6de4456c0522151592dd989d1a228d96a76086390fcd4251643adcec38e1dcf0d04fab424a98db5328df488e144c57a1f95f4be1e76f7059e39274f6e006a0030760f365ec1f95a8ab200f5ea3f94c51334a3110525bd3968a7779115c00d6fd89b4b837480ad67e804c577f17ddde3d0b9de034df070eafcf6633dbfb54e468cdb754471d0f005d5eb0ab700e5e8fcde8e6b3cffbe563fe38fb4fb75c974aad59e57205a980c5cd8cf995d1e5ffc37c31912652379b961a4d831723ee3c9c53a4cb7c039c047937918381054d362bc09c49d26bf08df77c73ba44b22eb93bf434d5ecb152fead3402eb078a92963b437f6d226dd5311aad51fd32d29ca1bc0780a14eaf7cf3c43b67ac83e25494547d6167b0e8442962255ec88c15c66a9ef62e9a0c5e687870c62624a0ad01c509c6d8e5e85bdbdb806cf0989afc2a884748853cc03ea3f1155cc4ffc83b388cedc84c544348facbd7ecbe09e9e6378f67872b15e4d0bdf24477daaa852d576052ea423f4c202f7eeb4d2d8913648bf4523a9691f4a5250060afcd9141f3ecf3ebb531038d81e8693cd6b5929207863ba9cb4e5d7a3c678ffc5d1460991f779c1aa1cf4d61eec41f4f41fcb2d04fb4e9d0c1b8b4eff704059a085574e50075ed6248437973b7311584f75976689da66369a67c54b0756905ac49f76ad057665c551154143d8bbdc0906f5239c581c95cc6f1ffa986382514c59a70aec584d75d558567ba29ccd8c4d4227d89619c9c2a9b2cb91fbbafc697586267bd4f093785062cf4b7b30b0076d2b941e1e73ead5138cf4f43db4cac21e74a3302d7650557c96091a983b6c37b0e8c35efa0e86b55325218a26faf6438e4ba693bf918cf4a21d8b51bf660a0260a23cfef393a54cb1a4dabb7d3488d30f32b70b51ea503d091edd56b9599152c3808868d1aa4f8174 +0x956d5ca8fb9c84cdc882eb0bf3f5ff0a61238f982286673bb9185a45858ea13827dee168b4abf313a0b82aa5e98d2a01510dfc9e2228c657425f2941ff0c6d63 +76264 +0x204047aeeeffcd141d9ac8fe0c003df086e2e352a20d2a66e7f77d7db497c46bdf7a2e389d142d18a254c29d897bfa2c752db9aef9c8b68735f6c7cc427e5fb0d16054400e20e651cb62feb6dab7b3b6bab712bd77501f51cb5d1748897af8383b1743300acc01a5dfec04afc85d6f769da779e6e34a6dabf055f559503499ea68ca836e59c085fe281c5df21b153754662573940661a97cee06ea67615449ae9f9f9a64c3a37a43ec1890e59b8612385c5b8a2ca93bdaae0b977dda8281116c27be1278101de95c740825f20f59080ac86f4517928008289030371a7c63f70c4950731407d8d9300815a480413521b2f2892cbd8ad93bd2c5fb9f8f17a306774d7d439f727952a9ef6796f6f7c3661822d2c88658ee7c94f11d3da21ae943937b6c0c8117ab5cae732583befaabde24a071a0dbc666d2565dc199b94fdcb8491a465521be140028da77f13f129491bfb38f3d229ae94600520d3c3e7c256c827432a7e9315c45fd6d866ae1062688cfa55425c59d21df7a1629ad976a6c6724cf598940372c3416747a750ca00aca3dbce7e22a97b3a5acf13e742ee158b21874e3838e972cd35b377b9b28a6e85ff24171fcbb504aa07f2d741a69a9915447abf71d3c1a032cb4fdaf629de16750d57b19f9de8f8cd9d911f226b289c05598bcbde0b08859470a104155d41930a4cdb40863fd1e2157a4e4e120704a8dbef2ee5e5353a9d82a43b657f93316eb63c43265c17fc3b222c6ef68900ab49f963f8a02ff8d4426df49381ad8239f3f96a13f599ccc47e743297ab0ffea8f9fe566d8d06ac723eb6e02deb1790d7ed4444c210c7b4c7167c1b3cce1f577a334b34f20f11e670cd0dd58ef446457795375ac20a5e6670bdba44e2f22f819b80709e2aa8da3d7c87c3632b5fd226b596431ab864d6585dbeaf5e1e99b923895bfee07bdcb7f7d1f99817776023aafe5ae8130992b810eab3dbb5343754a3c03056ba6a3d33cc3d8ccc4117b7b348de7da6c24a368c16a417bfe8e85d8a88eca8187a7a2ce6110bdbf09e70c91996c258ffb6dea2bae01654dc679f7eb3594b2da4af203e477cb941a57e1706befb3697635f4b79dce3be15b1cfce1d778b783b9bc6f0e3c055e2684b7e7f133c1cc793722a151e5ac817c4c07ff8ac3fa5f04c5e6070aff93303ba62fe1d50e941e1d79ca5d022dcd39fdc9906a3bd841f5fea7cfa04154aaa99b28cab76526f2111fe4360e109abbcd2d79be253c3ed7df39067f23f964d1310db18d52e9a3620d46216d9dc456fda3d4059919d51c44877d8bff797b5690305ae98298a9ad6d7a59d877f366891b25ba14292c4e9a0e5392de56880f536f0e4a7ab072ec6a99c021b05df63e5a9db9a64f7747eee2bfad3fa68c3afc83f733a5091fc8fc0571476652269093f20cc9615d8a53fe19defc4d8baa768c0daf083341d8831fa47a78ef66daa8af79f0bcb4e86a36c66af4a88537b723051a1ff3bcc7e2899e703eb986938226d816cffa649520da8efb8819ac4fbb2bb0d1d05d074645c4c1904473f18124f157f133eb3c0eb3259ef422b68d7ebf75d55b49afdd640a1bcf2c140ff9d9cbf37433a3f703fb2b013d7e4be9ef6ac9e9bcdf124f06c93875126e37f366437c137604a88680039155b5c1891a99bbe46fac86b4a74a1ed7bcd07c348900664139a78bc9007ccfec094ce467af541a15efef78b61d710bf0d7527e93388feb214d4df18ecdbf0744044b0f6a11e82f6651cbdca01b423789aee09ddd67da792538b15d7f551152a130fa6c1ca81da1de7d89dafb08864bad29c1009980aab953e01bf825003a580c74a02004dcbb18855c709c4e4c05ee61303fd14feac753b52ed2ea073701c28cb88656aa16893e64d4ca47214f87c9afaba035870df9ee530a205aad6030382ae4f53497bc50b882cedd06fd78d4849e822d56ca510832335d4b70a0e58d61ede133e25238d831e833f3ff6831b3c6369d2e5c9f1ebbc95f0d9c56672ce1e6dd95888963f0e94f9ce9525aece2ee3780e4eb6f8fdcdb58df045b318a9ff36e02e93e51534e4bbaa8da424011f14b808340abb521f3308ab928d02c92a48da265c59c61a9b8c51b13ec0dd95ec793494897b859ddcb8204f763436c06a5752a0d12e9e2ed98211ae609fa4c5bcc8d39d5d358814bcc9971a19cfb1c6e0974ad02b66efba855255e281850c2906803f934dad456f45f3d77bdbb4162533852d44d9b73d561579a90e10158628604bb316d9674ff5fea35be55a75d663b9ad746f5a73f97a00647571aac5a55c4067f8886ed7fa414d74aef704a9751b197cbab02c41c6aedcaf65cda019dc2d2d815a689c93f6f9c8c44b2178b364b3a97f5ad7dd95076d10b6d4729e86bd239e045347d11fa867e73ebae5152847b60021ef26dce24e2d33175bf0f490aac8088d9da6badf91142f2068c2687c70aaa400e22da8be0d77ca4d66c950cc37a2f37973f5a84843971735ff39e134820a0b98de6ccf7cc7c52cc58f7c219de61cf54490c5280e225925dbc8cc2dc4fe3cbd563e64cfc30fadf12c3089f58a38be749b5e85c885dff2d18e6ff99cb247eb2fd57c961815378abdcde4632b15a20ff7da47c7e853becca0ca5f32bc80e17de973337146f7e1f3c93725a850d4a479f58dd70c25dc516f2a1c01181bc56d7d50dbdda6cacf9171ca047eba052bc2950422a6b30f943a52c3f0100a28d45e521c5be5771210c87d36925a2896af8ee99a35115cf41fdc1014e2e689625216a4929fd592bb6ff97e758d4274a3b46bd03e31b17a71d3a90f83610f3666a328dd69f4486a3541971e2d41b21ebafeebe156a5019c076443d995f6f471946c2774f915986e0e1a33a4c44c43972ad371b57a1b8c2233261ee6c31130cb7a0174f3c660502ea46e51dab129516e91c6bf951ee1abbd73bdaccfa15c3eb495f7a3e268610a2ca6c274089a5576157e6d0838cba40abe477f7feca71498bd66d336c9459420d873ab1cb6d65d1c1c5f2aede8f6ef03b53d0ffac64ae6b9666b18a000e4763ec2997cae7e0bacddf3a284f35e270f3132b2d3c005135f2b10213c7221cb83ae6b96dbcbc690c1162be70faae0e2a11da7475f420186da586b07b31fc471490a43da3cd7190c367f359b2f6719a0211393692703441bd4ebd7ad111b316c32dcdc021462edd47953a14d68ca70e62bdd77a6bf865558fb3fe68fdaf72122dd90a47cf6f1dd90163def6c40478f3b1db5d47e8d3dadb4a9ef081e8535fc1ba5c03dc958f630b579b880865a60bcf573472a6f14bbd5b55d53bcd7845a2add37d5f865bef2bfbb203df519fb9892dbc90bf9e6ea6335d1a20885496cc645ede05c74e09d89b327b658cd95b87199248b7eb37472d666a00497f1f2b32cd5b45bde23a8790db37188736a88256e48863709f7965287e096f16c7351dbd042c6e6a5955bd5f1492f33186c7fa6f12967584836daedfa2c3cf51099e56b63259c3d7d3a4938f6ecc722d233dad1aca45e6bc3e1a0b99fb1f89c0ec63bc657e6aaacbf931f267106cff42b712819f341b1ede798964a0b1a5032c198b391111e88d0d7303c02e23fa0137e74e604579a285b2dbc0a23aebdda65c371eb403125bd366e822e72dceffe0d55dfa3155c16283020dc9abb0d150da1aef251484aa49e49e00974dac3a0203e4c11edc1733e28194b6ac694a8d85082ce9a643da013c287d6469dcf28e8bd42cbac048d3f8aae5317f6fc34f4404965bccac284d3ebb07cbbca07a49f322ba74f1ea5fd1374219a1101ca0092156ee6f403cab278a4fe94faf4511f791501d860ea30858193383ac10baeabe49027630ef60b4ae0c7e36d2e65e88458f9c6528b8f42bb2c6038d1a285288b7e79098667e1f2b2cedd3561c09f6c77b168ffb2397e3b125653d9eb2ffeb623c2189bbd89882f8e754d3b1f5bf12b6e14daf453e547b80fa1f661d3d3e8d60941f74464fe38f04286a08af25b0bc3dbf5d87ac4397c181791b0874848c406a090ad9a3930750353656f9b97385fb445c6d9c99f807bf9ce982aa0a4c920d68e10a40396cadcd745b412e35a8e6d8b301a67872274d7cba947bd54760f7fb4265463270a27d0daadd53308d8c7a5972f630a2a0961100c1c02f1093876413e0dde736b0fc1e18bd05b38627e7ea89698332a28c0efa549bb6c5e35688815c2a9114d5614339f6971b8ab86d81dd6d81f0d4019d56b07f2ebe66d6f82cf5de09c8f696eb3f75b01e67ff4fc522fc0fa08440463a38dc89641f3a72e13b69a163ccb501b7b87b4c3c303bd29991ef76af889bf9cd7a267b2323683e7a7d84ae22e3789e2b76f2d5d8c066c950975daa974410a2bde5355c551019c329b9ef0c2c5667f6b0408350d95da7bc52fcefb43e00c4ca7241b234e12f748757b951c36b6dac90afe0d6c72950263407884c9b8e04e2f85456440bafc8a2146d4353dcc56f6cf48e1c9241afe10cb9d7021c676e9790b5cbeb94eaa723caf2d1209d5e24a6d2abb7bd5fc7535781d12a340920c503f6883fca49d8b18715a7ed18d6516f58033c908be760fdfcac0668e4b9cf7d8e3ef918b90cdeb53eabbd28f2a6bd8ece2a2f834dcf149516b6dff9dbd47c7d818d90be8185039b8eb3bce978b7ab68506d0df6cdc2eb03eec6e445e1032dad240ed699ea5b4f4bc0552a9a70ae22e725f45d53d166ee2fcc059eb5beeeecf5bee65211bb37caad1bbb91a2a3362bf297e8a70122632402f79b94af393cc03d99408d8fbec07daae90a7869d9f5cd71ec71746888629662b9af4e9c1b95b26dfb420d79b99f6f28706d6857d993104d6db64af0ca0b4a38586955e52ca3c86d2d145c39757ba810fa0ae8d46db9fc6c62e0b401b2054a6d1df230f0340b0c2577df0235bafd314bcd0980485b0f9ab71316370306f99ee750726727fb78867e20cb85d74fcd11c03193b81b6c3cf116c7815d5e8f8e4c90391083f148903d5e72ff6f86fe92505670d019b568e90972c849ad7a156d5e4f20f50bb5e5fb39afb3a447a98df4f7f7d1e72a7e17bdebb15c95afc0603ddb0b4c4987dd986282572ce196aac59d0d8a9b0073df41619ebdcc8dec9637a7ccae063380d02a6d214025dfe3f06e329af617457d3ead7c2a7c605beb656353381f96db7df663c31d50e5c5b6e3505ea7258ddccf0424b798d85f243496ade82746446a06b70a0d7e71b6bc97eb32c73afe44edf29a6ebaefb81313508fda0fa20b5808a37be9f24c8adeec0f70de155e6986a16c66532c3703c24dc6bab56faf5619dcddaac61b9082a67ca5da1af1184e991fc7d29bb579a3b5fd1e7e05b1590fd00f3bac6a2f52435695e291af037295c6908a450dfebc7f3449e142917ca51ec5c846e99dd798b4365e4dfd65f27327551c3e2772af087f8659967022799d6b403084ca26bb6cbd8e006e87036623ea8eea6adf9270658bf556c56f804f48df896f7fb5cf82d546a5a2cd9553098bc7b92396d735e7dc8bc768f7a773a7ae60e7acbf135ed5dc37c46df3911b80b2a61dee4b7623bf746745b6b280c329d8d7a410ca4d9c5b8778338967e12476a17003740f24239e3607b7698162377ccd2d06c22ac951bde0f23a1db1ef36915e0bb3dd6d49ff2d285465a8e9b59949954856ea67f145a2ef8b21515a211979f3617550ea4d7d135434969c74e1af373912dbb2072c3fb3bb2c2f4ee9e194d7675991f5109966f8c290946da94e42efc072df4094e109984cbead3ce6967053c3da4ef5669381867951a54210641918324fa8bc967a69f8aa27e343d9a775940ecef67874a49863815d1243328cfe5b98937f4f935e287bde5119894b7e6b43501ccfa5c3347137e29e239a962cb760f925ac2115f50ecaef229739c4821a0792ac22a5daacd6aba4fb1f6cc5ae0dce5ded7759a3a7e28de584a479ca1b4a89db6636a041728d66d05b50e44578c84eccd3281fc6dc6e6bc85e8a71e7b1c271333255bd81f05e116ea8fc27a0f4b0874fbf069d04fc780da1978f4ba2ac4b66a2f8c524218d135484c96c605d888c22ed995af8e86fc91b7719fc2c8375ad1031a0cffea9b072d61ca6e8b5059e26c6af496c5bf79d293c53cb193e1372b018e712bb73a2c345403d27b74e1f9d441c9bb784ecbbef5f183c952da9d90c1b26cd36d1aa932d5239f034235433edafcbbcccead3bbcb35583a5f82955eabb8e1e9f459cc0456626a3cb572efcaf62f7c176ee5397f9a71a455115e2928b84df245359a007da63c7b2992ed466b1f8cd7b686bf4690c5dca396940a8dc199a300e9dfdd6f8785aa13bfb3dc829ed28d83a0fdbe2175b23efe04ceceeab1b882b4dbdc6a40a95b72da070087caeb77fb29ddb92bf3b6cb5f5da8a8f1687e7cb2b62512899c6c905d7a08623547db749e7076a44ee3dc770666880abd2eb24cfaadcf6b82ab578c3398cabf3021f5323e0172a56e1a6e1dfdc4aedd7865d4922342dfce9c94f2b7bcdf5601be7fc119a383d9a3d4bff4270a1d22076b346db5f61c5f222080c57abff4b30e2889c892949fb388c9fbf6fcf61aea72dec4041d38e456515696593b0682e9d0b6699103dbfd093b93f6fd0488621004183c2132b441cd4286ff3563572f012daf44a5d53e44e2a47ad790a78a9e9ca763c54d5b31dccbddf8e2e15b7ba3020f5d458a71861d47abc8c7384dc275944205870e03765c580af468e68a3a87f45d0691ca3d7b2f3f38c3ed7c5efa9002bd47a9ef8f4c6a7cb1c1b9cb575b83e0fff353eda3e423d233b572e442f896ed00715475687bae40baa8fc182ca83ecddc6cb1790a8aa00884e47df86185305ef2cbaf2af6cbcfab0df15a5670e761c3deb8d3f8da364fea139937412468065c7d9de395a10476c693e4fa0c8ae193caec21e2f17aaed77fc81bc746f16bbfef882e173ed2ed4a9832c805c2e45e7debeeed06ed54bae2d08cb4568f3154031ffcc774aeef4ff429d3e7a200e526c72dcd656673cf2415e345aa0ca54dec7cf5bfb0226c62f21b815f87fa4ff50018996fd12b0b53b31ac2dd46100fabfbd078ba314800919e68a9bcf134367cb51835bd797c3d482e99753ad08b55b549a7b1d5920ef3e61b82a8d46d793ee20e700b9fa48292175e39024690a400d29daaa6f91a9dccc73013868d42f1ed90d0c823fe9c6591260ba373e7cd849769c080610c121d139ea7c04bd1bac3ceecc6c783c0a74cc3defc7fd007d152a2e47bd2eaf7c2b651d2463300871b18665fb71635cf0e5faea7fb741f8de237aaaa944847a3728e0ccbd614ad97ae173f526a5d411119c8dceace2a6a61495b3623d38982f76ad0cff11e0a58e8bbe9e02ba843ad700facd50d3e4ab86b4ee5ceb7023ea3daf1a21face8be0b648ab5d154397083d33a361f7a137c129338fefacee70eb036512c8664fad8cdf262a49b33e58dcb21e08b449715677fc151cd43d04ca2b3f2d0978b811dffa77a8ddec53274428b444ad6ccce0cb407dddf7b3025f7a1b3f6b70bb76b19db9fe5518ad7b7ad36cd23c03d3d86bf0ab2cf2b2f4a35b0b4b92a4eaf908ab615c019f7d0592c591298a689e82126f712897f7d1217694183cc76dcaca047bc550fffc6d9d4f8407df5b5ef00ff187c7493d51d4c212771b5f4c2ab2a6f08f242967f08cdd0832a20ea3838ad60c316d7d8ba5204f0d807f339f60150833621855c8203d4d335dfa28217ad16cb8f8de3611465620ae5cce4a4fa2746663a11c669ee0114677626adc23a9664c8e4a84135cd9e8ff9b488313cb66535a07a8aacc6ad48b813aec9e6b48a3bbedf2a30995ccb45b345af02810a120245b76054df7aa520e660458ef75fede34d99c9ee92dff8a2f5743d047d14f7489d355336088dc0d3c6d4a33e88cb4cd8397d29a7d5c53afd7e10c554cd644b7d66a2bafacf08e4a882f930a140019060a914b3260a167b9d76a1b1bb1802f8eac784ff66dbf2fbe63f57557ec8089fc4c5e4cd32d8dba2cb04ad680106f4e4d7e9658943d553ecd62874789ec7e8634cb777e092e71b97cf50be52ee4044f98bf3ccc05864339fc062da03cae6aac33fa455550fe0de42f1835bd74a6efa1d500e420c6f319bfcec18115cc8cd55a6e7b70492716b2c8b79c50d5fdc381c3a6c624ed54ee392eba1709fed6023f1f68a150e01802f0e5aae3d5a526d44b43728167883be23215428920e1c5c91879a71e9fb0903d58b97d914cd18c53dc9fccc53487e87994f1fc9a7e65383be1d7ae4595111c404ac2a4271eb19acc96471a040472f71ec2434ccd7adf99c53be7e2a8d9a83896578fb317d3ebeea908c7eec06fcfc44c5a87b7949ed7570f76f8e8dae5dc61ba0f7f2ee604d6d463b490bf7ccef4ec7cbe4dd18262d31c7533a9253e42342425c31f8c041a08f8a72a3000abba98ec3a7df40f095f694680e2672c556735fc5412ff3f148c08d7cdca3456dfbb1220100a18e4abfcf061dd13b162b2dd5856ef8f8cdc79f34cde52250c268b38f74467f33ad6ecc40efac448266cd90d11c0329946c8b6b84b98cecb360430bccea5dcc9c87a4e3d1b8de0e024bf2a8f08c4d7c0cba84d739b83be1d205452cefee0d8ee402342c0bc77bd8c4abe49db93d1497679dfc08da31b8a9b79ab73e80e71d6d140865d075854b49ce70e996b5982025adff3929ef8ecced6a08e168083d5613338081f7985a150a2a804abb6a0338cce6c7846000363f55f1350bd30e5780254951cec8faafa3c2e0c54f3562e726341bdd25d59691d988560b7da71a9f634e5f65956c25eabb1af6253f2c25adb006542964b23807622fa1717e0bb47cc6347ba31d0ba17526ba768a64c739bb9fea9792891c6f00a1f1d84e58276556727fa8f3b0cbf4b6ac4967db042f287bba87ee03db3dc2e45f77058c5124b49630d8eb3d94d7a8171470d200688c7a53cb866061a33db91b64682f12b22a2aa2c6e74e69125545fe28d6bee0d805b5ad988ef5952a44dc0d786d5fc8c3604de3fc53d860726e51d5ae2433659bc263f0eb48b687b579b423632e9c96cbefa8c19cc49108fc4956036f013a76fbec0b848a5caa1f8f04c8c3ec52ee6414ffc0a56ce4824af80fdbf03316d9fb3eab36d13d71da46ff0ea056dd825d1ae4b71ff53658b20fade76904c20a1addad266b3fce2f4ce24cbfc545fc65f2a0843f4c1bc0cb293d64fa87a7e38605029086323603400adcbf3ebef712a4b4de3cc0cf7dd3e3f0bd656fbd416032a1532ff2131ea6491c1da0b413d3e6e6acbd5362318536480e78f86f933affb5f6b8d193975f7df5888c37484d4342d4e023134cf999b3a38b55652292fa89b80c1ac091456151e95810cb23f3adec155af9c2a7af23109c703bf3af41e9c5e2ec5f4213a68ce9d09493a56c8d7bad522228a99adb8a16dac414eb3f28707ddc9d71a04140490f5042fc0e4ca4144d333e97104e06368d068fc795f9d0f5774d273622449efe89116c334cebbfe0945fb82d3eeab78f3dc7da3c3906c0e27cde93980f44451520bc191fa77066474a7f98d47d9777fdedc6ac5b1f8d809d5437e87eb168bff49cf952aa690321b1363ae473137dcde867ab0d0c8fb79990c7ff2ecf4ed99205c56f1ebbd8ce79862139a6f149c341b8711d0537d0ac92219dde6d752fbf49ae63c7853b3ef6f52ed324e53867925bd5d4c49dc42b93f3ba9d7eae579c4169593da98f10e1a61e1214a2aa2fb511a4a75849dc9be89445c29184f85ddc877c6d1cbb45230a047a98ac5bfcbe7b69a397c454cba44fd90fa13f9b546f39ba0a52c8a8ae5c0038932962f8e3cd00c1e00be28c70c8a787d9be6f69c975f902996f0916d2a30d6bf12eff2167448d42e46c789ad5ed3ac92c83eb965f576586b32ea7aebae177c51a0d4c7d910b6a1336234f2502fc4ec58e577acb1efdc56fdff669176dfc876d98300eb5680bdf5e5f962fd6fdde2ca38aa2e3b00f5061e4a63018f9f3de858cf3fd1070f42a3448e52fdf55d0791c8ca5cdefec3936800e8e427cfe556db949b1de19573e51b0fb5255294983b765a8693e6628a5986c1521955dcc9a936acd5c3af0124d699c9f2d6fd35b1c7f511e5d5e100b595f6b20e791830bca37e23f7b785e482a58405bffe7a632a5b826170995b43e5f71c657679eb664ee4167c897022ba1db08e4584f246a77254c2dbaf64c1c68bfb8c5e32925bd7e0d984290373f1fc76a5fd0bea58ee7d1a522ae30abe90e327f1bafecb58c61032f26bbbee397015fde474bb4898de4e92c22f1a0b0d65343a981ce99943d6a985cd2197b24729b1440a79f6284892b66c2343d338e79b34544d468134d9ea0e79d84a6ee8038b38b976612f11dea82f16f40dc10cc3cf5dd59fbc6826819ca98f924a8408151126feb6eed89dd18b2323c2e1461f286e3b5efde300d6d15b253799b6898af26806645a678514b7c83d030e62e4b89be43750e65eddce5fa1ebf24cf2e1f911dc518acf6fa72ef7cbc74545171f8184edec5be784718582fd78402a942fcaf9fa82f2846bd14518127c5ae552790279d7c4b08ff84e94c1ea54b1b11eb589115f250c17e075dfaf48a6c49db963a3e13e5b2f3e2ed764b2e4fbc78f0725bc0e56b2580872178713bae102acc081fe618e0a08809cae8dcc79f7e202c1f2cc379db566c47538b3ec05b5a5b0ec367a61436bece5c636688515b3a1baf3af422370a8b8da7e4bfeae958f1e38b1039076fafb3cdc4ff19d5344c97725f0bda6689c06bec8f1e3bfc206f7fca2936bd909113278d27e8294dd93a3e2c26da0716d6c49e90e84728fccc66a918d27f1dc9e32ac4176f64bd78a6edd651ebeea3ba85dfcd8298a8ad72540619d66d317e3acbbc2f7282bcfddd042c08ea9690d5da00d9a0c88989f3e72217770ce2950b6cb29013a64a3812045cc07cfd0e08c5ffae7abe6ca13221e39d616ac019f3e9e6016f16bcad1f24751472d9953d9e9cb0f789d075caea60ec2dab9bfcf99343301e21e0bb95bb5ab99608c7b70a9a827643d07decebfad88c3abfb2c76cbc3fd3736e1aabe952dd57484af06d5d439ed8fa156ed8ecaab04a2c63562a5ab70556661e6c94912dd5d79402f9be1ee2195e84214a41b44211ae6c602f2ba9cdbe4161f87d7f749469c2e1f68db335bf1a904abcba302d0a2241607ee6d54243921dcbc5f6737ccec19e96ef52528b22caf7b2ad66ab3e4a0c8a7184232d0d64a8700c4d7e79902506f61db5f0a50653511a25bef5bdcf49f612073c8d3df27729c58c58be9898df604fdd1010b48f99d6810cb5106bc950095f8b6ccd0cdac33ca1b2ae5ed87d45f6333ec85a850f3e81b5cd5b5ebf12a76cfb63dd8ba2ab910a8ee8160541259ff129a8a475236c887b3dd27888c09396486ef9576e084f29bb13965a5bdc793578ba836e0a9390c0eca181d435763465c53eb4a21e45acd376b922400ab0614eb46c37ecc0de612dfc6a44360eeade5b0af5fb854461acd76306f591b7c5c634cdca2ce7400dc919d11f8268ba2377c1401a38c98865367cab8477140c248e2dea59cb263128afca9648a230e229e8df8e36d2369158310c76bb1093b1d4a38233a37a733c35fa89716e0e572e051afd1dd03194084287cdeb3229d44eddeb7bd12fa294093e949e8a182da545bef4631570bdab942b1f08337128a18a48505fec85ac523f4a64510ace67e1d05c5d599d9fde43de1ce104750077c00d1cb978ab2efe75866252ea191824d576e83f26dde3fc238d1cb50bda687cf980610d0c37b102c5888d46b0de7fcc47e0698113fec77f144a3483638a30a1168b203664b8961f0aead328ec828ac700b6e70b6828d0cfdebd6b3355ace04dddd5601bc85566bc0b573ce0e72cc27ec89f6bc56d828854498dc9ad296900e7180729a47f36a8439175d157e605ad576643fb97693576761d6356d927e819d98dc883b9d384e41b64ec99733435d5bba44ba269a668229e21e61ba09752b28a05c177420a67a2ac4c659c1d18e3c213485f65236a4415321ebf1fe8c0ce5462479a0c276d066b5e1188e33ed938fac51b264eadfef1d69cdc956a9beb8586c91dfa4b50448ac6997afc75bcc05b073be54964efaa96ed422311059f609ed0274d893aa6d71a3cc5506a5b81157471db6e6fafd1b55ce38ebbdbf7de6742bae4a0f0e40f6ddf544a5b799b7320adbe0f7d41383c696a3fe66b9a483e4899cd68ded74e745001969063d23f7c282c783edc6706160ce989b4fcf601a94aca901ccfe582bec6a78a00301c4e83771926cf51882149e7004a5f37992906b6fe8c663ac387d318f9b9008900d16f539d512ca54c92bb42d8084fe128c83dd45c47afe919659d8e20aaf93826cf2a05e080bca05d605665984eecc54ee735ec0d4b60a28e24036f44e5540335509bd4093be7096093009769a19eaab18cd8463820df2ecacdec058cf377b3d65daa0a400b15aa0034a321738bcd57f9c20d2a064c965576684296215bcc10b0fc3feeaf76ae49e34a264bdd93e195cf8ebcdf9f59ebde3afbec6b2ba5b9e16c3842c77b061aafb1dd715dd042422cdbfacdae2acf4893bd90d2ccd15aa8f0b1169bdecf43c2a413f66c9f731e58e4c40d29dfcf34143aa82edc003b01000328a0337bd1b40cefb09bff59efb18c8532cfb6bab812b79ca2def251922229e378ddf0e5a9e1615a32d712d26b8344d6cf495d860af0998154a7fc05fe458b584ad5bb6680522aab3eaf8d53101ae9a04082078df05722b16591e265a6f38e2946917d447e90cdab7f2d58240500e4ab30829a1590cebaf37ea48cb9b3b39a2013181cc8ca22b4229a585b8d73bd9bbf4552006712ddc91047e9e2494c0e17035a72823a8d9045d83a387fd682d778a427f91fcb9f0cb7d16767cd5c9a8b6d9bc2a895e2ee63ea9405d6aa4659d8e2217f7fe1885fe4ecfb8726333cc5b204b0f4c13f0716220a20a339c52621484100f5ed2ce879ecd0594e2ffe2ff40b440a97c566f32c550c42bd69b9be01adfc07304aea3115accbb26589147e4f1f967054bdf4ec59845ac3fb6f6c5622917dffd99e02ac5dad46cd733c5f71ff7560abd3b0d03bc5385b6a0452c836ac7b2baf97f25ca17776a7732151c54f2c950b84bba6e22897f87701811ab4a6c6f46ee1134de0588b90586c17cf3062fd0800c0b5a712faf84d164e19d017ed9883ae5bf5b77618c281bf80fcbe87f09b55a62a68bc48fb0fbea01b757bdb544bb053e6e438062b43d346777927b2422e0464897dec6c7105d37d2e3c23e7230703c54a88d978d7370d5418351198a0dd9ea4a49b4066a50114164f17d023a2f3056d4f8aa1b465c6b8502cd9842351d0aacd446bbe1edf2c0ad148ae8b7718383db1bd9299a21d175ba47b0c883a9f30b0473194707d67ad3c17e0a85bcbcffd33fa5b +0x46cf632194dc6c65bea19ef791b91ebd5a6d21f55a42893c09c77dd449af60cd2a8c70fcd2905cea2081c1043fd0d0b973cd86ccc936b735effa0ed01ef8c4d9 +77056 +0xfcbacddf3448c7464297ae53166793e2ed962de0d0947c5e5e17abe3cc103b072add5e3de8c0a1f19890ced3f5ae1172253b590c3b8801a400ceb056f3207ee88e9d58a1cbeaa55ee7e029e266812a6e5731d291d923d542de11542c2f300049b16382b2e6ae1bb6b6ee872970c828fe0ce06019b34b3f5e81465e0e89280a531995a51940f54a208e24b04f1b6b514ccab0cb49cfe986216fd797a307f0e42d509d897ee1a57bc5f6e96bfd6f53ee7d1c09dacb37e6f3b2322ac794b470d601dee1f687d2a8f6cc76a582db756646bc87535747f328ce3952a9b688959128f449cbb4df1ae4035e96c1bb90348da32f95f6086409995fe055ba2b28b43921301bc18a2cc143eaa3dfa3dfc5b4b14bfecd5ab5cb8320edcdc5c7ef1c18510adddb2d4217d0acf2c2d8b4b621feb88752b7e7282468a4c2282937cb0bc9c22b221276a2474e0664e40a5c074d198c9f53dc062816c10f241a0a72849dd072cc2847047365433b8830fb049cf00d13db28c31d7c4995485ccbefe0e57b344b3517023f7c18b832a6cf35123bb3e33783faf596ed66ec37b16260e9b54dfd34ae16cc8f8709b3d306e840f0ad3ea2dedef0f8d74315cfc46d07e5f5bbba33147e4d2b5c5adf3f06f0a4a204b93852f23533564a46fd44d7d6e4076cc06bdfd5eee5a90ebf4361b3ab2be5b8294afc5ad0ea9655bdc75658361e4db68c08095e4606ce0d7bdd23c280a49073c41ba7fef73e4162721a0a2fd3e0403be738b797ced721c159548c1bb7372c9c51545bc6f257ded82b9f6a44f650666399a3f368cd812a932051a4a7980e409d999c209a085cf51fb1fe7d7fe6964a9769f2c4b98d2b71e9977b744c6a4e54dd649cff6283750f9fccde4bc9eddb713d21cd337254fe7f2c887b03f37722f1c479fbff06a9ccb3bf43e7dd08514765bf87db467b6b22dbc5b9f85a8505b09ebaa262296ec38669eae0c23a265b01ad8364c507bc1abe0d1af29b7fe85d20e327a579838318ceb98569176a095332d1f37f327e1ea8fb9e95fd0c7c06c79b48734be7182bf2ca2cf9a78d769b81015975a2cbb2875f00159da1f259c58a4956065c55ed4f97a249ae62cd65c22c97ce739338abe085f6fa99a5f51c0ff0519449a06a0cd8507f980c627f3f689e1bb8541b2071126304d6f3d2becfcb3fdb8aa2dfcf7cac6589a27c6e4a0d741db69d80022c0d0441532f12f0f579e1c011c17ae02b45b51ee7ee6450d6d6cef290075f1003869d670a905ec7422338bb19c03a6c2770d9c3c2052dcecca25e65d07d590d4de4c71c527e3f1e4bd4ba781b0f484b6b03029b416d40b1d4790cbd9f88d6c0b42f69a953831dbebb944e3e40370e459e0917ef8db003c09564c04424af3ef2de706a5634266070386bdc57afbff22168870007cd55e0c5b86a6240887af96b73afb46b1ef070fa6a624d09912f5ea97387a52b2ae53e86e494dafaf2716ff31cf22e303867b624fb80879d0e10b9a36410eea3cce785cdc2e910ba8b1d08528143c0edab1598b890ce735b4de96bd8e62bc3b6dae31c60fa71ecc87a052d4f49a952e99e827f7cd452f98a7742dc109fdf0cae7c626d073334576be8b144b41c2dcc6d3a34d43a6c160273b3a374133734b1d1dcebdf8c153b37ecfdaab747a4d516c1a6b5fdb80322745f2a959ba857329a681f06dab64a8d7693e077ecd186ab192d0b8d64bf3f7c3994049fb999a7e2afba703bc64c7732faa8baa04d196db7bbf991426f16c82e375b684a36acce4bd911f5130c174733ad73b2ae40e9ff00e56c5f5e8887474058fb7e1d7aaa7575feb3d61512df5f97753cf1282f07e48e80cf9e6916d864b882be6fa0ed5a436907e93cca416b6a663c4a9f96813cc569726a75e981d2c6a09fea635bf786e12eddfb4fb801850ea8e9e6e3809e504a9aa5850d68303d16ff96c881d701f4f6cc66313669bbf3f3666458e56fee0b1a28ff688e6d8de1fbde4fa0f29b716d2b4c8cd31a65d57ec2a895e8ceebd935de1b6a5b1f81ff851e44b2bade2fb1b928b536282232b9ee237464dec67ac7953d7bcda5e82beef32639a75d6c1c27a0940f4c79775acd0bbdd4b981f4a620f4e0510f8f12f3c2f1bcc616d2c4e93dea1763b50e40657b9d39cf7c1a81f64c1a6ea41a61c561e44888f1e7620f1e5a5e5ab85b2fa6d92a6b3e6d95f194f2b3cf907dd56328febac031c402527544e5c605162524d140413e75b7ec4e5623bddbeee328dc6451ad2060474fed1de248e8c085fb34e8212ade86b46979ef10d3052fdefb16a0e22632bc81b77a3080ea8c310ec5a913054c13186df5b986425b16fc763657053a8bbcee7a2040d5a6337c03b86bc97c730fa5d3e87658433fbfd7fcb4c2e8bbe045879d3a748835dd8b7fdc8cd6dd48f3db5b612fd69c4f91650dd89f8511e95cbd5b72ca999a77ac5a5c6590ec2ca20d18fe674afbced2bfb78337406819b8375aff153179bec59c08dc45ce9600b04a2e56903fcf35f3521b00c29d534a4ff8833d2d77fa3c4434fdc7244ebd9f9a31862b8118381bdbd1fb4b21c02fead727a2db62a5065b1efca2e5ac174752894b8645e5dd20c6b2c4be2dfbb1e242774d1ea25ec184657b7c5dfd83301e61a51e976c62946e7f9fb4cc6ef876569a58f15f5ac6d65ba0823d97d951a4281415342267a0470a8eca288dd6c119713aa19bcdcb45e975555cc6b93fbf784fb302158dff48fddb3b5ca8692cfea21d697bd3d0bc8104b9cb309f29f874b67985934741fc02bfcbce7dbcc83a561741700e22d0f7222e0f4c275151cc196690d3f154a7267594c18e54ed12c67282c597810f3542d1705f1e69639882568e7be543c426444a84a6c50ac2af99faea9026fc23676636d1918a1d5d65e4d2382203b21d2520299760b9c6c4077b95588c65a9e4ce2bf8598ed86cc822b8366b6d7566e90e80b8d6d8b2b1798234ebd3a09caedcd258bf103c507d2a36c72930448286af482da248f6faf36b898ba563b4123393dcb735ff843a790e09d9548e8f743af83bef8df5a3d8b32282496b10b1106190520e002d4edd87f903b65f8d3691ac4b4f8d22e6c5931925d736e4e37dde5f5b9e26c8a28382d0758c25f13521220130ecd1082245744ffcee1ab9e301c4567c26c7366709717b090cefb28f396e642f7a81e7b10cc37a2f31bd9219250a6e7b54b8f183caf2b13eebdc4ca264bffbd16166699c01c8c54606e7158bd2f7cee18fc3a2fead4d9a9a91b464768b5bee9d094834ea0bca56cad75fed43eed49f363eaef1e199c95da7663fa514978b661cdbeff0a3141355430beec04962e90800cb42853378af23edd345b4836e978bd43d2246d003e9eb370a5c37a3177e32c99d4707fc314713f33e8d3ccbfac7844f98abdd78c09540303c71f95bf4db45181c851e44acd9564110e0e3f521637a1555505fa3325e7bb509f4af79e0486876b0c47314d1ad135fb2065108cdb294acdada7159438ec44fd9af0003c50cc36ac1cbae73880b73d68ac72f0ce5fdfb9e9110bda3da6c4584146895038a707f7cb763766ab93a9e2c02eb250a518cd673e0bceb88df3f23df22e8158017bcc434fa5473004c83bbec8139da08f9a74eb131a4a3113b5089e56bf729835438b91bf2664e3d292ef29b6e7af711c5968be2eb918c45d4e79d20585c7913292b87b80860af2938836dc33376232a9da0b48d764c4e2c934b87174fe1ac387edf5593a20c3dcd62c951eb37f5075d690ff13b3a9a92ce60c67052b94c6afa3b9a4c352a30a1308d4ac99ce2bf4bb111296c739f460034249e805aff665d6248a594250695835aa24cfa5d9c9b962f7d374abd0d163f65c51cdeb687f72b778d4854eba00389548a180fb6cd5390dd9580b6a1ecd4f8692d88b3eebbc77c42f2cab5105e425e252bf62e2fddade2c5424ed6a8a446d249422a268b029df9c96075de1baa19a8d56f2d8051357234ef6ae7d2599d35760cee496014c3434916bd8ff794eb51106d3d072ca33b6a2d61f694d33d3f688bba182f8811687f1531f3612a0488b23df47cca5aae585c7625cf9d01daf3a9ba5ca822c70a581a0520e8339df2eb04d87216bf34f8f411b743db4a83bb1fbeabf8856b4588fbdcc0ed864d78e67b0f88f0f22edf0b785297c104e382652d70059999522912b98cefa0b3f6e468a09bf674f85f866f4ae5bea931af256283877044cb1e9c31faf4393f59770901c26fc90910994faad492d5034af795388bcb96030319c56c26da47d45f180e384954aab4222662467d2384d53603f972ab041cdd2989cd4ba507c066ad211b969e12417f164ce8cbac5e7229df1b7a954df9addb26b7db56df434dfe2bda5aa227713571d45409bfcb0d48062c87402bd873ef03e0eb18163d5596a3c18bf1e44d392f924586ecac41f6ad75058e72bcb43a8a5f406dab122507425d577b08e47831d6eb4f29ba1976e24a7c527a38ce481627f72e84bdd2001ffa34d5f3c82b1122d383db879a8fd298c726fb91bbebfecf6ed1937976df37666531233b58407ed4cd63d2e6b595bde2cb78e91c239a3d2c06f75594fdc030a42c5b299be1ab290f6d911a8f33b39f86fe7c026298646ef698715e1d7bfd55a1f6bbd05b8bf5789b5b179dca3b71e04d09392fad41cff7f5cb45945c171f0d246c57fec27da5d53f3efd41def558e8ff94b75943466541f1487de199faadbff736399c19e043a7c4be49f0158aef1f6446ff666dd0aeb4b2b6212c1b4b2fd5e0fb6993a8db5756f3840591b522beee43c81840730731b8ffbe375d2b332eb6a863edc9b7976a4a9238380c07e44ebb66c10acd9d1276b6a208c95b11da31ca1718cf288e3c03ea6982eb4953f926ef93dadef733190514613bde101567c079f4bf179775f1aba04208252fe189cff393bb9ba47c46673c05ff7f637f03632b0903cbfdb3dee9d4e375eea8f8bbcf2e2e0b49bec1bf239456feb33c96d5a3481c89f544912c45ec156f4e9ce1b7b0072b73f12c4aacc1861bdd8283a3060738f6fc9c5357034751a09e4ef1e5a6f9e8549a99d65f36c9791e47f420eebd18635f02c9124d8a786b4cacf5904ab033386f294ca44885c4d525e212fcbf235c321e438369baea5fa2e13e4c6158fce55e45c70f7e4cc03a01f956e3fd5e605d0bfd69d240e84a855f26ff594c59b397c49e1dec4cb50fb167624c6f0c129ba357c219be7f1dd37008e494263a93fcd2d142d2eaf6c99bb36e276cbf1225fcb47f36fd500ea2adaa07e3a8bb114f001cedf88f1164d18cc77e125ddaf5ddac1ae921bd8fd5bfffbbc2ebe11ebbd5e6008089fc6a7f140a76ffe9c8c89f83d35dff4b0184bdbbf129a3c4e7591e6dd703f2bec0fc2ddc3c4659755492f65e9803287b7035ace0ad7e10356374245ffbafac5d84d0576f4ac1f57eaa3fe4b82496cb7bb2ac8b7458417308fd75b4f2798b142eefece6165d6f39cc71d750d79f9e521170f143c01dfb33035c66b5707a1f93fbaa5ac0199dd78e265263210430a12406520aba0c2233b8ef294e111f25f4928a5c22cfc031815d55f5ea4187ff29a921ff01daa08f716a930b36af48a39177a4ae4af95341f50c22017497a835bd492c20de8ac38d3eb1b9ab2577321b7eab1148dc2819f7bc05521f0a0baffae66ced5ca7b1be4420f527b0235127b6449799d1df435b795daeb0f6b285e3752a7a2e5c6639d9dba19ea6c339256d9c6aa204f25c3261ef6071032f76ed8ecf14dbb5c722095c7a4914fe8c6ddb4df4783319525add73824eb512715e2bf62f29f74a46e4098f4b9fbff7b2c95b0fe6f7b4a19ae12cd959ade1a665712863bef337b781b321ba732b0859de558dfb9c6e8c6571fa07da9e085f87b2b7ca1fa4f901c31f9739241d7555ebb7185a593b65232a80ab56c076e4967d0138fa7108c3be35c99839166f060f76e61aa870ee64e1bb6efe01d10bcbee50fafda1a012dad7d626bf09d891659fc212636189dbf42edfe4fbf0568544cfc7440da5f5ecc5b26edf1392b2ac1a6b97e4fc6bec2a9c725d8aa90b960cd8a1ac8870f0b8bb0cb9c59b9cbaece8aeddbd04ecb0e104e515fe07103bdbc60dccc56d2f6831aa3853a203636acd6ca85cfb193b16b091567f8a0438666bde6eb8db9c51f7a7ded0e7cebe6f8b9e61904f1bcbf187a0f87718c9282a758f7a80ceb5bcde8464825cdf1275c903a8eeef20e3c417eafa62d049821ced518fc3cd741d76dff6aebc64a234d077bc303c4b361ca9b52607f6ea787f8789e0b3e0dc13d9725b37ceb47198fc76839c81732ff98e25d1250cdd4c0f8612070c43f93514b2575a2e0c940a293410f48de2ba20d100de75ce543e7e7460656ebc863861dd70cee4c3af81b8bda245d3769a39a8263b7ca80926420911d527c6d8c5c3e7d8db7e02de01a502bc10be273ef2194e6008a873bec910744cac00174748c24f6cba10bb674828708e4423f8cf32829ae72d0adcd586d2478faf9a6af3575e2200d72b1846cd328a9b061b4f10a29b15247249ee37a5ad0b41a49ac6c33abee6fef8781f64d8e9d94c204e33e9898d467da10daeca6ecb47c954ab349f380c26cde69edaa7b078e4075865ac42317fb65b80002677285483918773bb6f9b6d67d5694651f89f0533357808c203e09aeb27d9c85d271d704700049a631ba90b337e48188b40ebb94f3f46de7e15df066f47720d5bc093451c7e95c9348cab0e11304dbb9065ddbbbf8b8b90e75e76eaca251378292bd3fe897300a837a8e89e8a533ed86851bd340b830ec505c7ec6e822786b0ce5125c117470ede7358aae1254fe4161cead34bbc8e9926e1388bbc21b7925e5219d0b64c638714f08537026a8c071eb21a66295913f25b829a99f92f3cfe2abe6a1e07b32d33f1b715d927e1736f9735c7c0f56a7ce20bf1d35f50321e93bb192e55d9d10eda1ecff2d579136ae32aaadb27d8783031de34cd25e7b4c419ba6b4cbe57306f43424002761f87da2d7f1b3de4fa0a97a77e556e33e63c9858cebcaca1a657b63706132f0341c52c133d8fd53f82a8190c905ba0d076530117a0153646f1ce4d7e124f5fc30956c65e0d0f8b7f98da1e27bf4f4a45bf7f6720d87dd2f45e1e9ae00dfc7cff9dc112d696a247ee66290ec1b03854dbe84b32391dfd68f515ce07259f236d00258e76428150f1d2111c51a20e1ea5d7193ccb2b179ce08f3f66fa1471cb1a0bca465c6b75217174c43c4f927f0a27847cdc98bd6f62220b046edd762bfc6b6bb3702b1a1b1eaf1ca50f7159ab02c12936b202b9cd5716b18b6f171375be48660a944b151b4e9412dc1f1dbe3c115b0d724672e5d884a5c8fdf110b3f51a9946f43a24241cba069d92f4bc8bd73cde7956214e0b39f0b59a817a301e561746519beb1e11c668ee06ef14b786268d30b50acafff198a32f6d4094df1b3ebe37d0272ea1a3c26235961a097478d10b3a09b7c9ee609ba6fc8a62c685745616550ac08c15a1b8b0c1923c5b5d2880bee4bd85a7821fed0002390e988aef452786498c8ce2d44f587c457c90d960daaf17189beb22f834b92bc16c935655b3f9b3d3b6b6700430644df603324fe687e5b963221d38b119da5e6ca53e516d4a95c5f2649227f803db1becf8c929833068b3e741c62b13436a8380e122e401af02a2ebbfa9707a6fc6d07084dbceff7d41eee9216d63e65b71814647c575d78d483409ee82b1501c2c53cacff2a622157751b4e99a48f208f8420600b16eb98a70619319a55343b3158c42009519b4a112c38fc2d542fef305ad08336e356d4e8013d06a9bbf1bdc8a6320404d8f7cc81b2ec1d4a7b9d4c3a3aa93098234bb8283310907eb5ca03e91c0abb6a07043339979934697153a21d721f0aa77d16dce7ea387181d919a82358b2c8b1824d189948c4d412ebef9b5abfa683dd57649d97b518fc6bac8d04f7bacebe63d13ee73154f37ecf21cd926261d41eb228a194c81236c3849680b4e6d0b30f096a6629922aa98706d97a11d5073c3dbe875a3ce9901649852d91327129143d0ab43f4a2c685baf427981b4132e23836ae9eb008cad3c10b5d82b08172246baf04546e3706c8e3a1a7850d3bd353e623fd6f07a21c81c9bbf3cdaa0496adf2b52a3f96ffec5b5c9f75c840b23caf16cb5c4f724397f3c5d09b21c85985151e09a46e35a37f266d1519c77c4f73dc115553a6b7934411fc72dee6d328474238d4fa4712cac7115d2b1bec88ba82c41cea6add9f3c2ac4b8c743859418e51e873db534f71dcd05760b049e2e9a704d82b22a5af2e351f23ffa5264d0d26690556d5c9baa4398e8feda5c443497466189d41a867833c284db3193ec52fed27fe88c77e6f4e530a43ec3a948635a0be77b79c3c9f8d18463d1948f85e14332d58ac18e7c9dab9e1f7eec7511838bc7c79ec8ab8c3c689f756c4dcd9844498d7980342ac56d3ce943067d47075cd283e93bea5c350a9e1ca4f381d58b44b9eb53150ed2292c4119f61d9fa892b5d5463599065e2e2b1b02d7ad5b30c8a93b544b90770f10a16137220c791f1a583f1893024537dd678859f6e30065b53b76d149389668e295454aae1c3534070bb601ebbccf71ac858d2ae8de9bfcbcc113693557946507d0955a8292f86fc197e20a2510cb93024fd17c97e3527e4405b925f733988ee81af87086b9ed59b0c46d3a29466126468bfd57ea3d4d72b4cd110b7714cb6ceb3b1692a2d839793d59fc9adfa6bbb1e202b8c3c932b56076e2c3269e44558679fa98cbbe360757ce203a302f78febc3d7cabc91c0cb2d0f10c767b520a5d64fb202620c21c7d7ccddfcc06020355d0bfc17e70cb116b4b8d12d2147cad0b8fd775679b96d2c36fa05f5d243e90e674d098d8c1bf8a0958b2be81f80576888e77c1044322a002b8b1689390cd67d930d8ca61c2debeb380c8d6282fd3adfce941cca4204fce62e066c2165495d0578c3f20c27d11f7924a372372c2d09a8f299f5ef03b03a30a6e29348f78801388116d5fa3fa417bce3e686d04b8e28467d5f83e909b276823ea6187a60275779346cb52ab4054948ee4c17c8919f3b5af75b3352b48a466d4dd758302fc5b45a0b3bfc083573487fac5ab17a7edea738d923a0b694b60e246cecff04c6d1cc6d9e1b270d347c79f3c688f08063daf0729b3f488f4ab4527a045d6962b5e9f3f64570d2b4218f7237955d3154f102ab9ac60497371703a7c0bcaf23d48d6ccfb699d36b978d3aa5adc15e1072a6f43d03e21a1968ba32628afe68bac4add8b41113c97e21e80ca8d8a2f1fa53e61e296067f64b7e84bf374b32009acda7bc45883bb966edc253e05ae2bf7b934eeef512d01fa9f307088a84001d505a0b95f89e8a29d2459ccee076e92d009b31e524ada30cc160c1acd0c7d10557f439e441c687a13cd3e7cc2def2eb115f64faf3c9369240e42452aae793d5f2e16c335c592aca6031323ea2d163be2481ef89ba1569b1bfd01f1f0783a9d814f5c27f8d87571aeb18de197627e9947037fbd490789a15b2a3a58acc26e8a22481ee8ac0f016f31e4ae9152629abf35d4b30e15b38f2447f25609ae11978ba884e975cdeda90db608efc3a9a1fd266538338ba059e98c8901ef5572ea480a8aa2466fecd8eed5c1aaebf91bb518572baa9b86774f2b4294b560fc99c0e28f5f1cb0377775454feb270d9216f06eda1fa835bee927c70ed1a9554f911a19a28c40a15cfc273ed48919df3f29f87327a7bdac6594583f29e64a26cee76a3fbc98daa440e9835e1c21ffdb40d341d7b85a675a4b0775162c3904600b0b45d7660b3743a3de0e058f4c457c579140ef04be11e9bf90f2ce9e50849b848b11730769e2d9c6482bd7967e974cd3e29a2bb53959b533ef55daf8b33733bbd57195492b5a0158965146da2f41d7565592301252bb57686112cdb3d798b32178daa083d62944bb6732d5c2d4f1865f58ed7ed4a0934a9da4be09584425b445f3a1374fe0dd0e6f2934f6d91602d44f6af08a44999e096418bc307e6f6a91a9c489dc25d1c1d8f46adc4c8559126bb71a4fc51aa4281e5c3b91b56edfd3e5bd69e8d17e2f843eeb8aad2960149ca716c55fb1af66bde3e68bd31ad21c0e2b015242e9e16090aaa5370c2ff1eefe00ff2aa4f27b47ec047397f4d3209a55cc162c2c77c80b73a6b1ce8dc2a33ed313c088b3fa16ce2efab3de7b70d2d157635c4609fdca96b9adb1dfa6740c8aa85a1b8e012b0a7ff33107cdeb6671579f6b544e6ffe4178bf3a05d8fad68658ea3e50991117beb3d541fff4a93684a37a5e8e93c2fbc54810d62e48df4cb930155b10486842bc304197fcd15973753b94b77bb4b778de8b3b0cabbde8590d96b61adafa7b3e7b4bc4bd8ee2507fdb865b009c2f91f7f598ba47fe968a8e0c034908014dde5d848cdb2d46b642ee102a59b47072f6eb9316fb02a7615a4e3cfc4aad33b0e6326069f16194bb8530cb8e0d6d891d6ad64f7c99e736bcbc3c08e84774d2a2376f8769a3f4f960bbda5627d276668d425a734003401cf744ba085dabf97eb0564762127f51f5544b5d588e6579695131bab6f7c3b7daaf785aa3d2f4958869a75ca8eacff318f4b83c4b3822e121f79da9730a57a8e043cb9073decde3901ccf3194593262c4c086f996ab973820ef0a99400e3bbdde62b2fde0d7746e26682248ecf4232b89463c17d36f3f08d6b5fcfca659ec41257ac2e58363a49fabda4524eb323eb7e7044c0979e986bdc3dad9560e93e5ed460a7ff9d3f9bae2a0c19c384799c1826e793b5102a10ad178cc4437f142b51cb0804ebd4b0043f195dcbbf56aa1783580238e80f62c47ee5608b214e6dcd65a057ab382612dcc26fb7a190eccdfbf2bbc81ba1bdcf1aa5eec2ea76f67c8d62fb55842ebaeb8b00d623837d6f6ab02ef741242841f87becdbb9c98c9ec9d10f830b7817b9c679c1f4a759cd070a9effb5753cc4c4655019544e10a96fdd0235e1806d394a280ecd714e0bc9db342d2c9d6d49bf6e9ffff50088a716913f899cbdbc4cde969bb2ebf61d82b91470c57f5630345f662df248886f771b2b77cc0cbdc8fe4cc4a6cde52b1ea4e5d946cebe89c6e6edd5978fda930b66ff650e354d8cab6acbfdd2c781b7585a94533fb0b2dd3846b0e2664072ca655d0c688b2b26d06d77a569a5088843d38d0faae2d323fb8d3bf2b6216cdad58445885c76156132170f202fa9f8c17698239f05b79fd98acdaff978507ad85b7004bc69585dc459b019867866fff6f9ae068a8c477d9b3300890f517cd435043284f0b5b76a18ee407c1d6b6386ed731d1c186919d3329e2fb17a692ce1b87ad1ab6c6b1ea42498d0222e3128f36f8dee4f93c1b60a6772620e82e7e8092b62556377b11273b20066f200f13db044ef288541bfa48b00579f8a71f438b45467c7935aaf1d3f88cd0dd4ddd42b233440d3a86c886dbdc5f7f00c8db7a54afd2f2e235e8fc6706fa8cab00b0279b60728f89f5a47980780f75c7d2059b633ec6292fac876956e2f39a76ed3a2afd084519d525322aed3f702ebc37001f4d8eaa9fb02e38e13a29027abf77ddc55d87560cda9a1413688f3bea6c7c6d8e59fbeac7222f6ffc7725a1bde3151daf438a0008d8c8bcdb88d3cd39471690613f13212fe4248f13a4754bc490597c11357cdd7e7e358eebd4c9aeabeaaa3b206370c83a84a228bf28a48b3f35b96bc3b9dc68de29651cbcc2cd5ab2a58ba0444d715a97723ccf579a1fca7e51c97f0f37252cb868dbe8d6d95b4bde264f725573b152973b38e5857f63841252ee288c33e3839dcb1e75b28ef01c9eeb7a23dc7c9d4aea4e3b0dc12efc629bd7bbfaa3369417eebe8135e86a38276543803731aeb19de139c79a834f66d06b4ea767fcc5b3542bc1b8bbe0e17006d1ece61f0da08ad61c7c433e54572f48013624e2e157ddc2f553398a249b44255546306dc8e8759e0c84424bacbcb2440e1cd90df9735fdebc0168032bde212d7fcde385ebfd2e3031f0594505068c5ee261285bcd8ec621e05ae8b98f40a369b2026409ef4501371d3eecdce5bb39f32eb1972ea620bd1712ae103f976927748c72566c5b569b3d3ece6165d751379b237caa294bdf8138b39992e80c9e49d86fac2f1fb8b8589d073d7b62524f01c19120d5ce06f1df01639bd5652776670ffc0e52b67fc0c5f116fa8f64df3b3510d84cae7f602e12fb73335c19a0882b85821765a329266fb3de8411efe67c2de3696e98cfffeab9a182ee9b77e029f3c3c255ec783d5fc25fde68a765f0a868b3e4f529323e9e5f7e132c18226ef24c551d583ba834c34a7f9726b4599636722cab8ed44894df60fba48a569bb567b1b3f38ce7a5a7f7748d893ccd5d3face6985d7a3e65ab146aa49767db365c00b06af5627512ff62ecf4352956c3658212a14b65ac3bd9e3d9039c631a94bb43c4e493877852a3abf05e1b5ae53ea04c92b225dfb21db9b43883040a99396ba76bab4e5a45f75d294b25bc7ffd216862f3555d26f49dc30c05bd6ebcdb96d5a2113996598273546139e588d7030e267ba0f551f9c83e7e51cd1d5cf8662f91da5219fc13925951fa6908111eab7772ed183cb4c6c172443bfb2d2f4bad7628a6bac6f0071a1bbe4b4517e5a53adfd63de575f5fc64cbcd111c678635261cf2ad97cb02a27e2cf1da5aaf670955b9b8f4854b862916bd7177bd56c233746688358580b484331fa52e060915c96097a3977427f5cb7bc9c9e63a6593c4fce571f510a2861acd6630ccf3ef82540ffc2e9d3e95b561f8734ed3202e5b78443c1862a58ae7d4c1934d2d90bd3d379849a27c410f557b114c78d51b1b89bbdebd13e4d0b46a40a41922d668ec96f2be12a7cb281f46755aa7c04267b7bf0e210acd120eb97dfce98a7a4de9083ff3d5f9b6f0502018ef3937bdc1b28d6bedaf87dc70dbf4a3580649bbfaad9a98e97441589255cc4d57315ed9c977f700e8feb6aa67a5106af09ee96063031e22121d8bf507a57e443bd79facd0249f2e7e8339bf8d16774544f7ebf02d960d6c2c365c24e6dba0ae1ba07c9f6c34e0352cd17394479ca3b2c3b5c3e3a0d2d2e786531460b644fddb65006839f44564c5626de6c13da42043fb5cf3c363562924cef85720ec8dc06ca68c04f51ec2975fbdbd15bec5c967796a620e17fb7c5a94449a96edf022a2c25eb7b5692238e2549d5382f5767903b38f498549cfd1f1c6b5be563067801f8d0bf80bfed514f0449fa5b0fdc63f6f92d897dbe156d3792c60e81790b942812d2ce17b3e7de32bb0233812404b891587e4b17467371d7b45f48c4d777bd692133fe875a0a3300f27c69f39656ce29013224b0153d70c52a3df2f8a6d25a8acdfb391adbddb68050c082fa8c5b0e869b51fb8e52fbd2ca9b68f5630da2d554c03366165fe8d07c7ed568dc2e99de6fcfe4b7fa2636feaeb0e9374d3571958f9fe36dc40db4e9ba24c301e1a59aa7ad45f1423cb9745e3910c7a20045c602031511366c0ec86a04e993375319e6d209a483839c32405933630a1dc366 +0xb5a4f6d83ff891451101726f1ad4d1caf87a5d9adb3ab3b90196fdbd440e75cfb8c2e70040f56a60f70da600fc144708597cec73d1ebf7b01f0fbc001a01c31b +77848 +0x8532190ee23ddd58861065fe170e971ed3ccc88cc7738a5f4166c5b089250a9ecc72239559b2efd110956d1d16f916e1ce0c705b05b1e02d6d26bf184de3b10776c5324f796b723517e163b1f97b1071a2043021a118fbea0bcf3c38289ca8c16d746ec3aa320f8c853a7040275c2ed735fc31650270849e03aa6399831796d497c6fe7955cd6edf41e9bc540864171a713c9aaf908122513dff5dc2c41d2449de050bf9e005363533356e74045b73423c0b9488b3137e0ca016523b5576fa272977bcccb5a20f974368ae298308ec5880b34776d3ed3fd61636698d9ceabf765f663a793a6ca30c59c9a6f9ed342862247ada0358d80eb887a8ca3f03411b3e6a18ac88d92b979c5d9f7b6faaa7cf6b10a976b7aa9c93b9d9b59ed9f042b88831d63b81f9a6964f3733581022298a782c874219310175e1f5a30de4cdb63b5b9ce70fed01a6462ecfcd6366be820193605e67b156cf5d38c3ba3ee701654fc093954f545bf34f400db4c4f8e479dbc394740c077fcdf2c72b445a6af4179abefe26243c6e555a8eda32a44efdd8c011b0135aa416c4dd95168788f50e94c45dc5e3b52fa2940f1e1c8d2bf172655a839c81790f817cc5aa6accf111b7a376a5d1142bb45f7715fabd0e8068a9e94e24400690d02abd530f115bbc45570e589f0801ad540dc7152aa3fdcc3b0c2b47f984ecc770774f2fcbf17c121a569b115253f16495144cb6b4b8a236f302f5eb0c51794776d2f900e6f4771b171c134ac79b2e7702ddcea1a2e244e717f20de2648df7386aa2846e690193fec4113daa04c6fe0f20ce157dfc0b2d062f463cd50922acc2d54eb9235bff1ae4a99ee3da13bdaa547950e8f3c81aa3bcc3654a6c04f6e10b3d405dc4c4d852f44f29cb81fc69796d94cc11ab10f7ef315cb7ff4e5cf3dd3e2ddf3bfcad7384573d1cbe48c5b1b583f9a8564cdb8a598c81a423241900ea812a931a701db8f734fbdd84d7787ca4bd314e807f32bb28f6bb947d9544044efcbec4c1cb1c8ff5b412d6e5d51cb49044c32457eb1c72a69691efd64ae3e952d970daf9b3b2e0c4ff096da9eaba40bf3f3794a239a19719958b1df6ea01963e3dc83d8ad0e893ad3c680c97bf59087ad716042b10c912ca1a3186a51ea3f35a524f563cccc590f894b81a79fc01f40834e6deb8199dcb014e0c93ab8ed3e8ed408c8bd74c51bfed2e7fff1549baecb37d328912fb24aa0658a3aacfe1985d412f084522fb9509d4334822334c8dd8c1db7f6d015f669820617e35dac0fb3a9c4649ede67e9854f4ca98ed9db081a07b7557f24ced6c7b9891269a95d2026747add9e9eb80638a961cf9c71a1b9f2c29744180bd4c3d3db60f2243c5c0b7cc8a8d40a3f9a7fc910250f2187136ee6413ffc67f1a25e1c4c204fa9635312252ac0e0481d89b6d53808f0c496ba87631803f6c572c1f61fa049737fdacce4adff757afed4f05beb65801cdc0d0193f79ba5bbe70bbe3c4c5c4f160dff13f375cb191c94e288df5a4d1cdbfe668335226077c41338f18120f4939fda3cd2bf1b223e3d80c29da1c04341c6a23fa9bb61eb0ca7f066f6754bfdc9897b3083a81c79576668f1b953abdc91555e050fc734bfc6cff52247891bdc536b5766a15ee854f71fa3ec56558b9d8e1088330fc9293358b498077f2d1f14c3adf54bb6440d398fd1d83f1f37ddfa9a70b7663431ae0a14ee6f62d7e1c43b9cd9db5c2ce7f98ba4255c565e7b1178490e71fb17a13198ade5d1e11c37b9b5316780148fcb4befb672d6deae8fc49b0c423e8e14985263662365fea6af5e1633ef7a01596e72ca4952ae1489e675d766a4738bd5779efee03fa207f1a93fd316ca3fbf1431ecafcf3d68a47b2f93c1eaadb760b4df65bf9e930cb997c5cd705c90278a4ab63804daab8d0afccbbccf0ad680c94d20554a13b60c700375857277d9e80f577bd36dde1581c4793b3f6339b7661208fadc22c22127c7cf48f66deafff7cad4f35d4f6c13fd4d8b0eba3319c8bdd772cf68be3c5cf52d55b0aea7487abd294dad142de72f4622aca6bb930d631e86050e8980e4d1eb1d213d0cc2f2e2cec72c19b68dd1bff2c058a39227974efeaa4a38cd1f5e188013dc5e9f558cc0a300fab9b2f3de4e99c31985fc4549c4d4b0bcfe91edfaa94aadc185e4c3688cb083341d87d44f63918759be5890877d4735d79076816cfca1478b536b8138bf9dba52b5a3c3c79770a9b3cd157df2c0bcb624bef95e079b2a7d843792335fd1b102e1029526b942cd969222d181fe37bb9e2eda88f86d0d5ccc66b2f74e505ba1196994ea91a70dfeda8f501b311c6aaa6a4073a3c4ffbbae908d561936bcb5d45a56dd027903518ae1f5f5310fdfa22fb7140ae868523e968672817670f788c142235b7b6170a5f8498062d172baa6b1e11400b546e6febafab0d57da1934d0e6d7980b3df5173dd7d99296b0e2fc0b794cb0598d540847289c2b2bd3d026af238a3fd5a37385390facac97c36c188c72ea38a11b7d158539012b9a3b7e77b33304d11dd2d97cdc94d7fc36380f277673b27feae532bf2e4ca4b4acf8694e647f0df7e9b16f23acce22297df714514fe36d2e3cd3ba2ec9c84b6f6af3d9d4496d6d5943287ca3332657dc74e8c3bda12ae3ec9fcd5f89de15bf03db141831ea66eb9e321f4a24f9023cbc22f46394f3b0dc621cbb67f9f59bc81908446d8ccfd3506ebf7e1fcd85cb9b728f013efdcedc2038ba851ba597c12d59f7691f0d811a6473f02d44c65fea3aa5c3f89a21b91876158214c3b64bf1b86ab26c77de87a5ef52cf1501380fc5e1fec7c2c0283ccca8a17a4ea7539a932ff54136bd2469dab9b6641c9d4b1dc65a24a245f839df5e7c85ac1c0ea50b0d5ba1aaae390ab0238945b62b622612546cc15c6b897c2b37bb69206742d326c80417f7bb32b5e3e729a7cd2b96f276d6de7afe1bbd1aa7bf2df4dd158906732cf2ff3047f2508a8d5f85b10282d6cfb679f98e3dda3bdc5e99cfeb0f2c667ba2ec005b39bf012d7ff4876b9a6efba75b05e617b82906507dc8a2523e721ac590bcc28279e2f05524b05401d9a288852d4ae89e76f2a48d8283141a89a54bd95f28eeaceea34789e45a957ea965a6f2940fa82d5e7d3d1bd790cd4cd70b204078f92ce282492b5227bcf1e7f1017d75f81ececb5811f880e2b776f012eec28141f6232b1c1ec637559c114699bc3496c13d01814cf7fd460dc2b70c2194582424e97c8fa46840c0d6c39ca288dff4dd5735e956227875f4bf7737aaec460bb28898de160370c17513f93b04a8b1e4d323cd2f52c2da88135fa09fd15b4b03b2d5cdf2c91f7e70df72059673e07c2dff8bcf7b7d15655d2a5703968a56ed67ac724e60afe1d975855cb154f71886f6e9f80174e001631dc10e69c5dcc5725f28c9e3cfd031cbf9ef3ac31e983819681ad32dc3826f1aef61ec99d3cf902315af4156e735f89a24a672049b5f297bab198219106b48d3fc90595d696b9f48aec8426e51e51c8f1d316e3c7453d1f4e66e6f8e02a472d66bd9bd7b2fb9da2955fc34f2b5e887f20d189433507d19ce41a200534134d76b65c180bcccc02a0d30d280abba471f0b1be44eb0d8e3e94fe53c9f3276235eda12d20ae8e988753e67d28c610909ce21701c037db48f2ac1fac4b3f1497aee6a9993c4c72d1aa5022384c1db4a367b7e33481a608b89c26aa7c3a45961407165238c1420417da0a28c7187e324d70e688df1fd2205d79b9315c0d932677dce11d74663bdccb95065c920473f3ff36e28a69e138bcb839c836c43bc440239edb7de481a6477d79b95031967b844928506a5d7c4628595ac84d3d4b456db7db69e5f1a9fdeeade6b7861e55116dbbc3a49b2247871db13b5dc72fc29329950111083455cf3ccd6a7580c0b6b21ab7a753bf70e977e73079ed47242839ee5bbe6537250b76ac6c8377b2b131fa15dd31e22991c8952f8784fb4fb2f2b6367c51db053c31a0d7fbb032ae786d45d98d01e47c3d7b7b5106fafc4344a8749c6769e6f4e27eca2a0b7f2ac68ebf11e05785bf29bc5876e63f3a84c461b0017abd651d88d0395f2d0c4ee4bd5cae0ac4cd3be6b497062479a0c2193592aff97bdee1e3335df7dc5b8ebdf4d56ac08cf14e92ff9f660b1065dc203e29300ea8fa5c5eec771430ce3ff33abfb1517d14f05c397e5ca1bda74531e34811f242ac80a63a7dd67b8aa134ea53b9d3796a3f3c868dc78ec2b475925279db8231e280a95d133bd3fc5bf1e4d47777be7aee68405e0e8f785185e7d7be626cfc8774b1cee1678af22f3b3cda32347dc4be902cb6334a1adbc6889a7fb61b80d35b6fac8bc3a60fb38c9eee6f941940a8bce608d8b6bf1e1baa52fa150a239bb93639fd4a746d2e8a8cfd831f6a7444bd0e56695258dbfdaa656b73120b193210906a1095941b5bf9b8dd978435f41e842b77daad8a3f2e1a9048b201494ac87c028682f7733f3c9388c5a818771712908cb0d934cb3743eeb361235d3556e35df505c0eac25734ba853c1156be3be554ba97f192ac82c399374b43a06fcbf728f07e56d9d1d1d90126a78fc97bf0fb632da39041ae7021aca47d9f5548f8988f8d46b16f526d9df9f5ae5feb20d4b92e6e5a51cc31ade28b735e9306618b3bd413f56cf5a458f7f76aa72e364d35c328e522a28ce68a8ac83c84cb1e39e255a93d00e61758427b9c1e28672571b29de53aa2ff2e2da48ee55886b41742ac7a61510fb94edea89d5a58b887430ec9add5d741e40a876a73656fcaca7c1c381ebf086852f6a7f9e1b4c2ce2b29a4f9779d3385edbc846abccadac78ad71713b6f4bbb15fc964c4cd2de4dfbf13b4a08f8dd7f578be9523df7842038192c3cdd7c4f3511c116587c4482763bfcbbe8d5a3a5cf7117b3a0460100e152b49c2d4f58237ee34795ac17b761300a9ac32ee7c250b31449d03bac304b763046674b794bf11ef156b94e0374a302d092fb26249d09b0a8e7e52859cd8d673897359f439fde9ba5b62a482ac36f75f5ad0ad7757bf65095ba9d70331fed3dd46eaf2f969a147f662e91a272ebed10e1b39949c2a63f1a438a9d1c2470947f6b947c055886bb519b879662c536475bfd6c4f85f4640d961b1f90341306aab564d2452973a9fa9aae89e0920aeaa2deaf9fd592f1fe884d83401cbee72b566729eeb2a1cd4cfae106fc1839295029226016d278a3bcd7c6e4b7e9c48a24c01e21b06a7750b6e3ae0ba8e56009b001ae7997ef40f1e52389a74aa04de33c1161b4e216b3e331dc8a2555f00e9452550a60ebd4f1c2c3931f32c2e962daba71b94a4a5d5b6d030dfbbccae14bb17d4bbf7fda2893009c500fefe66b0a57e507ad4bb2e879d8759f8b38d05f1f487b0b543d2b932f92b981e14480cf4d4207fcc51fe05f140bcfbac2012f12934292be5101a8bfcb60624f1e9b56bc33836677892f9c6835ee5985277fafa3ae850b8c3f3517517252dee24d5b32dbc5034aa182e1b0aee3695b29421b17ba79fa2e9ca44041f429507761f6ecdad40aa8fda2379ee2d726641cce9b3b31fefa8942170b8aee4efa4273f4a2b6164e0a5bc6a130cffc8c06c7e59abb49c3183b1b9124f97be507ec101bc5d721b0f2ce05ecc6f6dac4748c7afeb829ab96af449661ecf87bf0c807a2b7f920956e675d8cb83b10290338bf65af4e6dcb726c1be4fb978ff2d53954e08fbb027a1a55c0da72250622807fa8714085100f1ff7caeba74c47485d01dab3ea3107387a66fdd562af612f05f24d84f88499e164f75995ac33a6e550c8a2011283b63757401e67cffea8b75839b887207490a80a15cec8547536317638b2b44dda97df788b2a77033d632242fbf163007c7dcbdaf8336ee53a7f9597f714b2e45e3399a7f02aec44921bd78be0fefee0c5e9b499488f6ea8a908777aadd0e51f3611cbaa1625b0db255640fb92e94208765cca12afebb0e5eb5940e803ec33458bbadf4aa723aa101f9fc45ab6ba16bfb85c750cd34e1ce427fa59a9a07286a084b43b4f482dc22aa87bcb6ff777614fb3731d4e5cc09aec867428852e69c5764a894981a349e073e774bd03fa2a0dfe8e282aa1f34a1246304d174452dad81004c06fa86082ec31051103de6ada0115720304cd40f26c3b4c108dadb6cca6b6dbe2178b27ddcead2ada03c8ed9025db868d149aeac290110342f289024719aff776a8f39e646f2f7c5826892b53619af34dc0d09ac266107c6dada0de5418457f048aa8701eb5fe2612d4e8ce2b9d98e0cc7136f7f9d782e01828baf0f98cbe9b152472431389644e9176af7b20c11f76909095aa6fc9ad56ccca9fe3405b637530e019c04cd4a71d5b72a4dc3bb575dc2383b55a2c25db0710fb165d316e7c32dd25648ed07c10bafa3290998361e23b0db45eb039d4521a6c23e906d3ad51fda45c1c55a76be74df61c3a5a01aeb0bbd48958539dbd5ab868aade882e0029fc0eeb09bfda877400d59a6cc6bb822583026c6aed60c73d098df9be884a504e57a23bf37270bafef92113ec85bbc78bbc1ec45e238bdc4134627650b130830637e8b4a21671eacf6061ef83400963288db1f9fa9f24e3b062708a5ea8e7839ac469bede54e6012d5e1e95f99fab40451f4273070936c3d0ba3d9dae1877365225acc26ed4d6e6611bdf6f1649ab44299a59994c08c666ea6553180aa7e98675833a261b3d4981b3be2ce4a2e710591e257fd59345deb3458a3a6138fd445a4d059954ad3747ba6a6f8d5c6420e3666ae83a8ea26885922b5278e200c3909920d453b2ec6cd979d0588b3f259d2b52560c152d4218c4ebe2e597022ca1d52d3717f0aa9f8106a62b9eadf6ad05f0072ab995183bfda2a6b36a1f28823e1cfddaf7f6a39021d729c46c7ce7c4013b6c2e1644b855c027ace60996becc436cf1509cef0585f252eae3e87f7b32391369aa4ca97558095be3c3ec862bd057cef1e32d6237479c81d2d03a3e1abe5480e6e5824cb80b7f4734923876d7572349e5d9d2d8a39ec86cc7d28b412d32fb8acb28e1b6e737cbf2879a18ef2a284fe5b57bb5d8b0511e1ab23203111a54d53a00bb916e6ca49564c524b2788c0d82aa4a11fbeac62a45937c39c9354bed8b976ee6b9fcad1a84a6d4782e9965cc64a18ae3cf964defe6df0b2c063526c4c4a9fbf182e9146140bf9edeb5da1d2e9ed15e385765ad69a8074956e19a15a32979902313bc074072b70a9e6fc41cfbd843ae5abbde4f6034121dfe83ea7f50610e16c595fdf081c297ffff83decafbb9fd638f248a999c31086e6b13b0cc941571731f2f3536ead766674a19b090f5ea096320baeff4e448f126e6ba716337eda891790aeb41445a2c29c85bc3d4b3136f9855a497c90121d62cb7a0b7ae0190bd561b4da77956f2f12dbe6f9efffbdb35e9750b0a7ebc63be6826ec0914baa7b7ac4c21f146ea48be5b777dca7a96ea653dca16ce7ddbb6b2c27bc7f0fd29d99f7a56ae5210c6039a9b3aaecdac4ce9067e9aee6d2c26c4b922fd58f3d117cf7ca87f1b513fb3cc8ed54e2931fce48021932eba6ff56732db70f5c89af94c31561d1091773b794ba1f1fc177dd42856bd64cea35a3f64ab2094ab3e6ddb90a636c350374a6ce027dbd78ca03a9bde14e2d9c1d1b871e6d5917667e3f5e0abd623818936543bb009446f46ebefb8cf6198da516b10f5b55835ff71deb970646a253f01b51d0eb098e5a271212495c3e6e84fc499eb3299dd1515105841f4840a44e502dd2b4ea97dc55657696299824bd9206385d0905a0c37a18e7916d2d45d895cd2d50864645fec743eec2f2cd337743576544777bf8ca58c3168bf74190cfb8ab9c63cb6a6e763e56fd216b67f52c0764531d84f920667bc424ec4401ebea25801d84dae3abd318f32429c9f4f45c5cc17420c809921831b0852aea0aa1c87aef032c5b3e7885e5ccf644b5008b88b1d36af6a729d860390cd9d04fb84ceb175d0fd2c2c74f0f3338d61aa2f75521b53e8a17b8e65dcee02d7564eb9757b2893e7600883aa9ff7fbb56141a55dbc7c547640c53abbcc4d5b70a6154145cbf5f27e84e31f513a729e8f8b991b879eb60a28b3d2df65fe2782deb5dffdbc681f78dc914468316c6d03630839f7bc9ed25b45232ae62c19845f69aa3754a1f7ae0f4baeb4c611daee127900a9a2c467d73117b753b5d8c66dda5baea2aebe23ab9e1103baa1ba2f00b3189a7285679fcd73e498d7b631ace8dbfae8aa73d9911d0d77b9de61f511a8ce8afe1b076defbc09f5ed3e50fe74004a9081d60cbbec0c44c5f8a86e8829f04b15552c8f9dfeadda92df0eea09c5ba0f63a0aedf2cda812a43e7a1313b1edf1202c72e87c075a7d00296d1ee18482012bb6ebb55f40382a939af5010d8987d0c997ba8569efbb3d28f390ec3f4a4393ce21384d7da111aa8ee773d742541d31f219a2264ff39d8c97ff04ed165820d731fb692cba7a94e10ab68f1c6ecbee834e44b2419abd61e9b1be51880338aa5a0b97f6b9a237528c7b8aaf36cf3bac53428b737dd697b8d31ab3df438256308acf99799ad161dafb65d64cbd003db70053605e21803d02e7377236a6104b63e7d2726a46b4849ebc5e2bf0258e3c9f391565eae323f7c0849c6bd0363982a50fd8b53123b81a0e5dd8ee21f6e5d2d56becfea2293e628239ce23346a6a96845126c476d8788caa4e4aaf5aa7937af9f76ebd0c6a3c07b885211aebc93ff1725a6142a3cb6267030c47e222ce13af6d8a0f03922cb941e3e559c56eb9061e0f9a0c9230830233a9263528f2c0d2eab0824274cbf712cb84d8bcb525d06996bc8e8d45a585c47cfd1ab6e643267db7538ead83224ff4ef2bedee5cb9a5e6d5f9a667df8b4a459d8f58219cac65608fd6fd94b12d9dbc374983534e828fea66577020b25a46f23fc07d29de971427febb5dbc715676f52e5e377fed291500c2468a4c808b1266be40e8240e8ba9306e612d796635521c5eea88e8cb05dba66457434faca622ffa37127a4bef2ab266968fb6fe232b5be336ee6126ab12a67e6fa49aea9240f3989e1ca20628470567a4335e487e72847366bdd813eb3a7b1a4bffbee089d2da0cc132e2b8b99cf5d0b807b8bb9bb1033e251ddb9d975ca103808d8823d7a04d20475f22aacaaeeb6b7911aca1a370420c1c17520ad7018001b756e1fda332b29ad9a84a2584074dfe905b2340bd37a8a4f2b225a3d5b080db9863afb4151172431e17426f0e2e8452a4ed03e2128f9dd050f73db0b6f1095bcabbdc9157c4f6e3bfb3f2d091abf92f5ecd36cdc9ff8956deec8079a54c8347f6664edc8ed3a542638442923507135c6605a2490b10d5ff439bd745c84a5668c36defdde5c7e627b3931bfc21c939a3639d31a00048e793280c2a5e4772ea86dad7a5dc8226235c56e763557e79d5cafe9bca18cf3228da3446620a4b4da769e2ac5a208d7bc3a7f58804e6739f4e9ade0954fba153009c10516592fc61f6d884f4f5f22f4b2ed1387fe4f729c40cdbabeeb98f9d35d8a063351d3e81393d9c68b85e9a8f20cba2c6d3edcfc86f77550f53e01dec5f16afd6fa7155035ae57d35007d60d78104e1488c05b87729f7cfb03fb1ecb559249111a94821a94e574394d23a8b2cf7405865b316f85e79f41336ba144621ac680ebb4a8ce89c9cfab62c387d65b809e8cdc64f07d8a6e7d6e74acdf17158df4ced7ce324f303cc359ea6392e34a33f62091368c0a077fb0514947e30b6817a36f8fe7ef88a076672c2a9dd3541152117d4f3072998f83ee962bbd7b95dc40590f5e622f0f4d0f318ebde2d7ad435386ff50e322a085237ea9868e074ae4a09c1addfd8f47b85fb8fe1ec30e5352b0bd3360df4ab37ac6f718042a04af13b0e31e88fa7ec654e043e6c7def5fab2022a95d9852946e2f6ce4e0f21f216dbf9a486e9e97c0fb54988f543670ce7f3c065a335656cdf503b8ad811f65e36bfc376e06b5b05885bf3ee960c1bd1cfaa63e4f80f0073e144fdb322b727b76331d6c0b7a7cfb9c4bb77fb45ac6de2f618752ef0c0d6dd0133b5bdda59268c40d48c187909a7f759463e15908ecd9f1ff06cba19e56916939f1c215b92934b341a6bf4a11b844c9aaebee3e32dcb8481b4c30cf00737af2cf9697412ddce82d165eedbcc47d5382d3782ecca23e831efc8009e0f80b30541d5563cbca558a19d598d4467392b3865832286b1fb9405aebcbdf3c4fc6bc756b54ad1a583c255ec77efa4ee49e6cbf8140648470f5f9e43055384bcd4e253f01bbfd969f38bee63135e93ee04a871395ca6a7d5e9bb5a413459f743948739926b3dba766f25f985ee8297c2f3e0b6cdefac3c0b1537d82dcc399225c5faf6a2464d0b577120f5c95bd4072992100b1a2f6f6b331c45866d2f9b0baff39e09c41f56328983fd71a1ddcb886e69b6fca2ae68bc0a5974e383e0d6ba5e87e0e16c68e1d689221bdba3f6e1922dd565f9ebef30a4ed77367e06827524be0d741c0fb5985dd2d61cc25439be9ad48f7d817a545fcc48d01ac469870ee14aeec8282277b23f030a70941718ab28fed29e21c2903e98c90e92452160fc6691c64d844931f7f07659a7ef71064fb2f949286969055570da8d2d7ed292d63b0f0e74cee886b228c92e332306a504df707dacb6b2364d0af9c64cefd1bf24b53f31fe5684c8793e5802a2dd2c5772f4e0daaba842a58dbda3648106b328508b8edb1ab9a279c5a7cf71678c66a01299c6daa59c9ed5901f63c26a520b70f2249a648a66d63d200b7bf4f1af5a115c34af081b222b38dc86b77a59603f1b71f6ce58adfc747500c009f7e1b46b2db86be5ed7cd78c61fbba2af6eeafb2aa6898b741f5d921a3f06be604b84a0e47cf9617f56b0b16c355f01ac29a9f2a803e70d19b028b425c67658ca5d5ced8020a59b1aa465b7eef83ef1357ddccfb5f7c25a9de54917b00ee538a55dab14ceee10d5f969f470948fdfdb14128a7a97aaa1dac765c7a1023fdbc5b9f279fd160fc475e24e63c6a522ca250f91bbda96430cf561d9aa3c6580de67cec5cf90a0ab49e59efabca06bdb8839efa277d9fceb8b1331e8fbcf1ff97886ab7db4b5b3e9258bf51707e52ce0a07d7becc75e0fc9a79c013bc14179d3308a19c3315499f1e2d1ae4a4a7f31599a5b7d18b2521906e7f89779047cbb368edce03f4d5598ec071e933d8f55c26fff3abbcd419b60c9d48fbb4bcc672d491be2c89810a0f9021dd96a98dd4f26495581ffb47b222d3bf4c9375922ea17355e059977821d045aab6cfc023d55a711279a0f7568cfc783d20fd24a0dedc021e0ad1a83acb5001d393e1124b54f8becfaecb3b7108b78cbf3c753c79658713627431465954e377250b771a650251b0458dfb5227c3c8638e15b8377c413729cbd2d4fc445d1ef82773fe32f13c09f81c8dbdc5fb3cb3af423312a039f070b7a2ad59349c5277174363e306708065f8bd348ef16bd21dc2741b310122f1a84f8f4a1a89c1c360571151c20f836e0a248ff8eb7eea324b4f8c347fc4d7d352440a5fb556452e8f2a19d417b87a536b2e3d715fc906cbe09903257b75b90413477c44a63497024822b551609bf5ef1d582e04685a420d62517164a0ae67024fcc8daf69bf57dd1fb38c501924568f7544ea4871cd1c8544eb4f588ba9326c8c4596e67c20d81d9a6ef766bddc4cb32776eaa4187bf6a1fcd8f5979920cb913d4520804a33c8523cb79efbdb3e29089850a7add8f171121ead1c98559f931ef73dc313705288f97b2fdb85ddc47bee3c84c9dc1fc81c241eca2ce14d6019743eb1f6f68af79aa1da2a45ab5209c5d2a865a9a5796a487671d29ef8ed2cdf2f782424dfd6ad8db9de5965c2b47897645085cf9062529677bc38fb45b15054af2816d505ffeed2cffc1fa462918b50f1c967b433570b76b6627fba5e36750a71e30ca02f6335fa42b7ff8a1165cc9339777deff4e40f7990e91964b8e90561262d67eea2ad1d64b0a66baf45adb6ce79ef5afb5b85d91fb5c48882dc557c092a6bcb490649ffc2a82c065c75d5d4735195613eddb8f2c993896f8d3ee863630d22b927d0a6676487cd324a386aa0224f0e334301f9e70798bc10ec673e35ff3cf69403886eeefaee1e91d0e3f8944bc0be43a05ec5107a53b12f48dba37e4e383bee7493eff0d6297487892f0c4b50652a14df5aa71962532d1cfb02d496c08d774af399c61786e88385eb7ff21fe09ae619387c1c6c8ff5646cab832e3a06bb3d2bf8f06dbd9d99a03f704d569c7ce056e37439918423d91b90a2c33cb2813001f40d3e637d8acb7f06a01da63b75b410e5fb19a2fafe7ca71ba9497caab08a4a4598ea33b1ceec646e03676d977ba488a345a2dd3b503e9b70079c6a8d25389a93347a5b04ea7af4e802c1291aff3042addc5b8cbfc9bd5d30461282d44fb9575f586545d15e05a50736a1455060c5b35827aa5e02db6780defd72521a908b252c8d3180c1aa0af93e078e6eb240f37f54d025adaf05db9ace960254bab83c786d4b7598305ef9661f0dfee1bb2037fb064e44181ec9780fa19869074f073bc5a40b97f8b7dd5f700ca2696af58f11bafefa8c09cca6cb53da8d0ce6420e079163562f2ec2a5bbab998d5456dbde0f23a17d741f531e441bebec647e3e4d2e502da381a6eb588c7d47f75621f8ad8ee9803f82b52ca080ac581f163b9e452ea6658c560d9c6650699a98d578b66e2f613dd93e67c3ddff99a1cd88badc7676f89d6912af404f85f503ea58b7afa04f3f1ca30da3b3171f684b5042589351a5db47d22e188184bbb40654566b3ee48cb7bf4586f564fc7eacc75fb9b13d8729a2f7502ee5da96600b247f65000e9b667f983920d973ee8bbbb8347531455770f42e5b9b73b604f18ee0c3fb1279355afb39f671cc4a6dc5397086fb7535731a435f5cda6eae510e93cdba9f1f1952d8bf06e5e04a631ac98a82bfc2d9a84a9424fcfc82231dfb15de4dcbb78269746e4fa1bff2d05855f743815751faf84e6cfd9983292daf7385b2d39fdaf8e40a9a017ccd2ffa94afdce8ded62f45b00f0341b7b9160abd4afca6117f7fcf0395da990aa60e359298f8df0dc4c1466a0d05a5d9e6ff36d1f1d94c6a132c816296ae5addc303fdfc91c9ba90abae7980b8d28e72953b3e77f8ba0a4fc357cc6b9d93eb58aca7c01d4acdf009e34d5b9ea2f850045c608e39d00d64553887ec991b19bf2deb70388ef48413dc0424690e4bf5bf21a4f5a2720841ef0ccb438e758fae3aafe7e3b3bc4f6a9a79a6da2e6a2439103cf76117db11f60ec8f4010e7b7bc002612a78be4fbc0ff87513c5183cbc60f7c8cc395abf8da8482c5b470935500d9ae43bb5d493cae2b251038bb2f084dbda57bbf4f799cbc72fa9699bfb1dbcd5689b84118342ec716c9fde748b201e283c5c1f1a5b146ce139c2975650af02c5f019bc1236b7913a6bb40d361d35d8c492589e100199d174dafa7d3ca663d24dc5c11c3e8b6c69ac44202846c5bc554f70ef918c97b4a9f097d3738568d69bdb5e344d0cedfbd6559a86b81d313e04075c6391d669df46e304c022e71461dffd3de5c6f3dac057b4b33a252fcc0575bab9572784147448da865303c835a01f31c9580299de747e4842cd07f512dd1aa81c5ccb2c043e1035b10e8ebf492bca0794fd9 +0xe855da51d23beb4647c4ff3607c3ac88e94a705866fef02842b76be3cea65b43b545d673dbef9972f35d2658ecd60bd82373a5502376d1a407f83a369bfa6947 +78640 +0x3299530a2446fb395b9380a85417e9d1f13acd7f1f4a1485b6cb01afa10e71f93e055dff0755a6b573ad1258175691a4110cc648a60dc2972a6f138020b6fdc0a3a607560556ba37b586a5446632a4796d6862676b561de42da7a901d010b83c292558f76472bd29eac7415489d3a9b7cff4aac4b64eacd4871bcd1af84129d5972a59ca6cd039f2da17ee70c76028c5fd5ba547cf1cf7d0ff7286b3df74d8f4b75c10b86799b5fa4d1fb5806902aa0dbf435bd9fdea863e5e54ddb4cecf4eff4f6487a79bf4baa90b879d6cb7e0b6f6df55d5608adde2876c6bd8050d7a126028e9c680510acf67dbf6af1cf923d4e823381ac5bc1f9214f15c828ee49eac7d0a94d32cd1027c9c8714f27877f28c4b559432f1dcd81e4cb5d2e0389b63a5c0bd0db892630549b0d58a6e69797667883b1326cb312f0f967f73fce979f0849008fb7d994f3bbf0b8e002bd546d6ec059e5bfd3a054deb5c19e7dd8ac76ed154b407282bdccb65157a1d32a6273ba42b4514bf289e5a3d0549d78b04ce04157689d8c32f54dec337608a8ac264cd1562fae7757c457d8af9d8eb0f3dd3dbd65d4f17558cfd9b62d709ef3b1345b3c913837b261e42de5c9f8eca701f211a9f71ce6be72c202bc95f3ef24e7f111648a4a97adaf5dda63a61321db691ffeaf51ace7d80f604b58035c53ecaf0121d187f348999eb5efdada68e8be97ab47362c016f428d2f36210c36679b74d8ef1c30aec526ce70c0a3cd768bd12c489dc6dcb6f79e7a8335a006feb4c1d7eceb9d1af997d5ad231f66f5a895a3956c64e9fa3a1b4c6600dc4d8a31a5e056a1a9ec8d502b26c9213e8ce98b90b6418b3f07eb0744ccce3c9c821c6bd5876fbbac832e3f098a910fa09e2f9bf789df297eb945bb0ea0217af9062409ae17918f55e96432bd71934308132e66548ebccbc66690a1c356ee5074123787aa215a914897d5c7b18c4e7fc7746c57124578e688a832681d61a351806edd8244252975f706e96a803b30fa513a7ffacb3e720e47f6c18a7740ef02b0546c7626a38c81e3cf159793fed95747fdcfdde9ea56a786cac4756b851fc8866b9adfac2d02599148e0db7757a62b1e06d26cf8c99556b79c91a5649ea437752cbf3b5f121961821ce1a2a4c635da461e3e14626cac707d04dfb6ed1e4ac40f106ff5ba03304e28a38e99a6daf6d9427c5980d1440a99296c05168f5441e2a6af13ab4760f55407855e0cf7f667ccb5d9bb2eafd03e455f6a8830a5f14837ee6140c871cbc737a13ab68902b91718f29ee97a6891c5e98168ffb1db75cc2858cf8de9e394244d882c4eaa719363329b344ae09619201a31efc2068a422c384852416bf76aab2a1ee28ccdaf060ace1242861da2d6db4bd37785ab5cf706ec6f8201eb37bfba41f7e5d78f25814c3fea41f17e394b55e2f898a11cae04dab920e755c42ef3d01985bed54b7fb5c60ca5ab339ea3f73e9423bbaad707ec2622feeaa3a337b79b355ac60caf07e3f6b8b6f6b2db8d6af3c3b7590966f51d57be6c2471e50c6b6a19e9a3c40678cc6cd8a0bcf5c15006f3f656195358f0290deffafd5725f79fcb3bb4d0b20e2cbf76c0f54682ec865bdda072450f09839fb73c2dfdb9d293b53d1f3ec54d12ae3dc316175bd0c9baea0f568e94930519d1d23767ae10776b5c4e38fa0a0bb077d7d04ca94575c54832178d1d6095e83d7fed465a76f180e8e56d1d79076464041e0ce90dabc87bc8b464b8a1317e0f68fa66fd58f0e38b86f128313e55eda9fd60f75fc6e76f69b6f1957dbc9fb20726c1edd0f5a45cf3e00fee28bc6e0dfeae512e356780d10b9d7a2820c203e84bf166d045b2f9d4566e825d4875c85bdea15effee622073cdd69e8b5643f6776a4369bce00369d02f9d08c424eced4dc670fb0b0f392eee4d1d0f3d92c4ffe5deb74b1224899cd6ebe5f3d15294556a5297a5de0c7f0496f5bb2cbd4ad778ca15a77b6e7797db5f27f3e3f3360e9917ef7fffc76a865a14544b879902ce098a9bae8b207dc0cdef402149a863be10fd09a469759df197dce538904f3f4b1aadfd26ead69b96ecfde108a56f501565804dbf63573b433657152ce74e74c134aaa6cb2b0f558cb101671487c67fc6ff28080b7dfab6edbe199072ed1537b2e01724e5bc293004a2a06edf514c6725567ae51339ce9573b7aab3c52241eca2956a04112ec2bfb13a4144c3924f9ac2f3ff5180f7415b578b710b7e17532812dd29a0d7f35a58f4f06aa55beb6e8f22600bc9bf66f18d1bd21304184ca76e861fbc97a49a5e90526d92fd129d17b8c62346da38e96d8f3303e73a1e32dd246ee5c95501944e0a5bfa30b89257e9ac10a626ff87ff03e63f99942a1a5a52ee5fb7a6756961b70b643efa54258c42dda47132a627285326841b70307723a720bb1dfa55569318282d94267c76aab1c1f40ce06a90f5e9d4b3022209cf4f587013812b916398eff4faa26b8df043b4fd81e1b6b94fd826555ed61ff28d0dd530fb79b095eaf3bcd66de220051ce7dae4d0882c1ede5f974cba1fc0a73b1fbbf7c5603fff8733fd60f9cbfa8e66f7822c6278c707a6eccb0f8737ba7443d55b3923fd001ab2ca200910c8316669034918aa2c0e004410203238c6740641cf61897978d793e826d353657f8b399d8bae5e2a2a7795205a3549313483c9cf7e3d4d489bfce7a1fa75c44a5a6e746f01104164fc7a42e63b88a9131a403b27625d1913af06827a8585d041d141b377f41d86ed0abc75e03488f650e05fd6e40c5f516d5a7af0dc88820bee8cab5322e5347314ed84cab8c5b4a57d1f2929afecb2aaa806d0bf325408cba2d501f00a54e3ba9f0d899dda7f9a3afa3f42afc573d579663c9e4a267878b3f152fbf698b3a9b1cdf3118bcfb2b82b4ab922d5ef4256423a843a2e337660596c8eeff3488204fd3426e2f0f31f8cfaf125403867c8a38967463ad7c3de4e0086d15462b46073e16421448a0f06972e8ffc2143c9875bd3af2b26d35200905db2d2cfb146af7522d07adca35e18554a79b65c84af0edda5647b74bd888dd5c572fbc88b89ff8725fb8c11d97ab545b340dc488772bfa77319efaad2b1f69cdc69c4c54df8b1386f57ed6a98ef7de70d67e67ba8af2a47d141d04fcf88ab4416e9b65c750d64f77378076d5e26d2c7cd716d7c84cecf4d247ec5ca10574c69e99558e49d529b52b6de7280b5ab445657dfc9b1885c2f15f12348a021a83a8ce8df14f42342c4b8bdfda75b3bf75311511593b14fc1ba40cbd1d1789015f61b79298301a36861b7fd582e333d957f972da5440227ba013c28fce8a9d81b1f943f272ba39a3df2df09606fcf47003a466221631acc8f94867d1706ba561217959f3a6740843e187c46b8f485e4c203ad82fc79619accd4be4cc2a430b6a56e8e0df5de7edde3233e59c454eda3457c4af4b8df8d1efc42222c525993664f94ec2fcbe99513b7a3939714f96cef25048d5bc93dd3c5987d7080788f58e17b1b4e693f2149d23629faa31d6a8a34cb2d131caffd0c2b2be727dd97cdf7b4a272134eb20e0375e916f1f26010dc20b2664abbffa56cbc111f96b8229e065c7039d944e718389b4b1b17f96f94c91f7530b2be1abf9bf4f2676b94bb67fb454ec30ee020d87f9ed676bb4cae5ed7ad7e2cd997a3b400624a8f04f7c4c45d0ba8ae32a501b74f1d05da7a50aee78e4747ab3ddd0d1b308083d70155d12b922c086bd3080c3d0d8263b6c3a9e3c763797c4c3e02b96db2dc38dfdf3353163103088c6e8da2f2516b7a8c35bcdf66fda06670788d5b23fde1c419fd14ed0cb03d137073ba684fa134b4db2f0e045e9378a0c87be154c6881dd015e97ee187a646a3c870f2bedd836aad244e11f506eb5ea5b4a6b328cdc80cc74432d5e31f799c43e4f4eb29046e99bde7e16d24085bcf0fb5875759b2541b243557be642ca0ca7e665de8395cc94e8196a78413cb7b46295b9c626a1cb2e56169d69cd737c23dadcd3a9e625f29d572d0fedb46d8a0509d076448dc554ad829321e05dee944827c7a1952368416db1bf755e72fa8818ad5595d9f1304a28fc65ebc6dcd89ae25450d58c8185406cbd7aa5b4c40c395316cb216c9c0a34068d320305935c16592a1e797549a478024503a6d5f2cb241f0bdb1fe4d47a9baffda36f83ca9f911471da9437c4ef6f980f0580ab445ed1e5552d992be2a8068b145f392ac9cc937df12b2fbc378caf94e5263c1d01eec80bbc6896280ebdfd029a0f69e0d709a2fb71ba51ebeda3c0608d0ee11273a292fb08351fc39fe1087c565a058f3d7e48f6bb2e02ac2d5d2862cf667774e0a3b61b013b3be4df3bb06111e9171e44550cd695304ae73ee1710475d6072a9118bcd56f23f27314f47c199363a67531b37604c8683284695822ad4505971cce2a2d9019944c588733f50ca471bb7c4fc20fe61c7dc16cf6eac4c4099c3232df018fb3c837527b8021a1a20cbb5d1be5aa5ee5581800852dbedeb38742dd540bc46da844b40bc546e60a4492e8943a3a93ec6a46e0f5b855fdf8e188a0a26a9b9c4cd655b2801c23a9b85800a068c197a43fdbac7eaaeeb8ce9bb6d35e885cd7b0b6a5c3d9b76a5d9232481c8de2984405e1a15399270d9c5a4d9a322397120729327d55d2ba953dcb007aaf5509a789df5a2503da72fe4ac999f56b97d874732e49c6d44591860b79aa5880a0e6d7ae5a30ce83e895aa0a42042f4763526b63e881e809d942260fc7b84859177f0efa9ded039d6d98f824ed18b08e2f0edd1e7e654bb937d75c91dbb3b40061de35b6d1182e170e81cfdff35ce108a212b4ed197a58af07570fd8dd23033e270b352b1d3ab6ba755a19847c58287c6568d618e14a75b2f0cb292df68e9ddb110cf49eaada034e4a2bbd5baf95eeb420182de7fd5c0b899a3a91d84d7eea9fc6eb5c5a9f807d9b34faa3acb59a9c767a289fa1963883fdaeac2f210c7a5252efb054a625b58c68dcd1b3bfb6ef988b1ba21690d36743d6d42aeb4f580b3dbb3361c3c964ff987feab7d5dbd91d4cbbac8d79fadd70b5dcb3baadac5cb713a33b08930c83e909a605b5f14a46ab1ecdd5f2b028dbdb40d6f4675d7e3d093cd2afacabb7abf847a6d5d1ef522621788b3dd8a262f6314b8e3e36e30e268620103656f31203b6ba470315b73ca108c1bb8d4739f056f840ca3a3127a43db82725780d5364b4aaca5037893150dee761266c485c1922bb8653905f1288aa26bad81ed9b3f7e55ce08b183446d50646c09483e1f32683ff85f1e7c88a0196583ff2d0c2fb11bf5562be4f1edc1540ad46cd7a1ce75fa04ea56be775785829d7203c35d113fb6a1cbab2844fdc56b5a55b98f8011e0ca22f4e8b396dc5d68a2ac37bf60de3fd0d394e2f5ed02fe18cb567bea5978175b02be81785b857c0e2d9927aba7f545ed03588fd85a8bbfeee66d2082ae6f8e2f3c9dbd8725f1861586df3002a2d4c68dc97cfe3a2df6af4033f043b2ff66c9a92918f96a969ef00156d50d4ee21b46159e78aaa5d7e230df2c865225bd0c3e6b60b6d19d2dec3e4406110bfad6375926fae231a5d8bcd8fe4895e84577be70e87c0db2894c77e5602d19b890ff97543447201fb4b1152c3000b5528caffbe5a2c37428d972b079e834659fabeed9ebc03be8c15ce1599f16fd5b3d75d653211cef80b0e84124604ea48b2d95f47d744d2172c308fa18a61586fe159b8b42a7d948c9c74038423d0605d0ef09d0d0724d907491335bc0d5ae462457682f48de4a77a5f86bb8a86490c0fd5051d4918a542154b87696f0a263b3549f6642d458f2e4aba0e552b57b817e56fe18a02f10d32ca9a54d3c1690b847054a0056839c6528517d278707e65a867444c8a417aa4d3ac9e421aba1252e89ccd3d0ead51d13bb2dd9ccd5fe398e81ebc0ec50d9bb44d45c018e762ee428e401e95260275f710597432fc036f99fe9140eee56e3c83c81d66a0e1c2e3259ee4ae70f6718d81fa02445cac6108af134936b58f6c455a6bbafaa0b1e1da414210e596250181b72036b5e4858397244fcc082b6d109e815ea6e2e1fec7bce0a04d2bcf5cba39e1ab7c2f913170053ed9a41c1827613040ca69882b717d6f48e022e8e243a59e47c25d1a2a55303846da58dc446567e1dfd7895246b20addc12b18849881c996318e60de789ccc1a837971af77ce2b9aa5ac90aaf96876ec95a9b667b9bf2f0ae6360de343ab4b923fdf76fc780ab444dc7206f70d3bca860a8184fa0da4dde3afe3ec91522db587c033ef2d10c20bc5ca5071a04bd50d926adc0aa35bd9dd07d4bd86516fc812e3509e65a9079e3607b76f5b0f78db47f8fbe1d1cb6d0537609deb628960246b8d35485fd825453ff0edf64bab5ff880a006b960db09d1f1d5519608a3eeeac76db758652231602d6ab30ecadcc7d2c172d28b3f39f8e5154d3ae50105e1c22f6b20f7ffeff596095c50df5f0a77111156a980f74f01e8aab29e01d4190153aa6fb64cb6a73790daad0d90929d385e7934d1c00f84ee83b9ebc611094516464061c38011b2c0f5a847324aebfdd26100f493720f3f865d49e0fa3e29f3e742f9298dba9978586e7c110734f3930dc1ae7e37be7fea901f627982b0bb8a3df0deaf5d23d462c6a35df3d37731c5b1268bba05cde8ecd5700c9ea58e4772e0f8f6dc7ae34cd6d43b53d5e03a2dfc853aa09045c7d2ad1df95037ac00551298014a962e21893d48df669f74a670a152a2f4e93ed4c3952f61352cdf306ed42db3e0c6bf051100eb369f39d8e3811ae0098fab391a450cd551c4658643191f66b8c25576b86e8585e9058c5418e8d1f7157ac07ec4df7ad57104cae964df5c0cb5f8299b622836de9fa07e2f6d2e2c5f6ebc0e55f81a47f868fd4450b947f1e755882c762ac57abd0179f8b30bda95dfbd5d7f06de7cdb06dfb7b9026ad947bf3d7c444e39cfb8ecb697e3261a747341aa66fad8a08f9ec77d3b1348a01dc65c18db5b6db7ce5a31670325d1c1852e4bdcde661563dbf903eb90386a839cd6868cae5819cb48c755bcc3a8fc29942ec6fccdad0352e75281d0be12b03adde00441fc239b9dc767205ce152ef7a29da79b13cb6ea923b120ad5ce8761ee684a9fe1cda43b56d2a259f0640df1dbcc9c2ea43169144e5fa266a2c781c7c6c67e1f112ac3401ef2e0ca1f55c04b7406dbab7db7aec8acdc685ddeb1e728eb7ee24c7b1968f41cad893992bb53466e5e00b9e3d36d4dd438ceb63194a1cd8418e0edc7a57b9d798e056ff19ead28f15d71207e8f8eeceffe3b3b457996feba1ddfcc9dd3e4845c1abc34e307b839248997a8f7f2f9ed25b317b2bf67b003b51447afa3ad8bf1eedb174f10fc5bc3306dda19f60497989de1c9e44a67d6239c857f5f843a582b57587c8a21887e0c3d8ea33a22ce4e34800fbb998c80f0a797f8f1a4e682347cbe1954abbeb0095d727658d42457070bf5c654992dbae7d7d0f60445728e052a4ba7087b8e7ee5fef7ac63afa3a8ab63258dfcabd61da1fb6c06200ccf65b57e2889fec23af9f837f5b82a9348c7208538ec1b992fb2075b96b1adbfa50f2ac07a47a04869292b5094231748bbbe50b9556b1929df80013f747e13279e954e386c6a55d4c4176790fb739095a3952147a4935f248f8f78ee2ef5bb0c60fe072e23798430f3ca92415333ff44a9527d764eeb5351e6e852b1ed9e0b3693523fe9cafc97229d4a95a9c3e8cb1b74ff4b8f7bfc5e7a8d9279d0d9026c6ce09addb2877bf5736aa05910741c5ce3ada373da524ce9652b95d39319a84778efddc9d1827f06eb04d3c5c08d561a63fb47dc9ffc655adb69fa4a41d61802206723eb8ee58f325110ebc000371f6d6507f27026a1cf1aa4efc8c52437db072df0742b30d534e16f39f134179afebdaf78ac16b66710928864072b826578bc6634d971017cf57b0b24ec084edd7b720bf77db69979b2294f70c066a487778b95d859a547025a68ee7ce424ed291ef43f2c6e3915fd3d46c0bcfa5dd2c661db8087fdaf4b8feb10e0e7e2703ca570ab13be8685731c3753a5f0bdf8544abd13f0e7cc77554931dca80decd4827af8005156ce83fbfd2ab7c4b4111f713a139dada0cee5ad5bb33210980d3809cf3e59bf9b4c1bf4c99ddae5aeffba72beece07f5b0be29aebf97bde2d4a8417cdcb1f27360a36a8a71924d2898eb19f00ce442ec08c5465228c20db76ada0f59b26bb4fce10ba5dc025fd52ebc7ec40254431817658255727f387cf1b3d74eb63d793ff0c64915c3b49cd2c7db0549d58d30f4226773bb623b61a82c402e8404a6711019810a1ed410dfc29e654cffebf05463777f280ca3d5e40bb1805e53e7a5d9c1c191cd457fafaf211ceb846aa82613e2912d0dadd9e726044bf4d512b1b419b17378e10e48d9717acdfe6a2eaca6f60df9e1933356d7ae4e362e21650549c78bb9b703fda236cd4c1bfe5c906bfb81223c4d5721bd3ff3361a9cd1af54ef59ad0edc94882e3028f1a16bda54688c3bdbb2c0d7fd7f888b5853b15476231d4691ed4a21324f6e0b17d8d771df14e18ca707dc942b1039dd219c1c283de24c14d6cf9028808838fa3b3cb19185138409f0a5f0fa3f11cc6f2e3e2ddb8b24f45ae8304f18f75b395cc8479ae80ac6fc2a6517ce98ade6d8c7dad476dcd27dbe7f42c9c7810b5ae7c93b73f3b3c4b1a26460d795edfc11b76db3d977aaa83f030872d699df30e9bcb6216c4ca347662f5e60501768ae2510d745b7b0d370eb5a7d04e156a20c9a20ba067b16250756fb6f002ba3a738935d7b1d19b2c5c1253d4355945e77f2dedc3b473ad0c788f68f1cbcc4cb182feef5ef8669ee201d5f23f1f14a31bf984a17b080261cf940d752fdf2b60e4a088a82ab2e12d340ea0b871f749d70e7414e9bc03dc75b38c37c0f694e79ed9b37188c1480bef2c6bbbd0f123be89c8d927eb0c0dc890c048556ed152c7ad9aa4ffb6ad20ac8dd1006e60470d3c60521103cff68e8f5affb0afaa458194362f5c7b5b76a48cae2bb50191fc1b8a04b303f0beffeef97d77ad8d9adc8916e09ec22d9ea23b72fb4373bb8a97b7721ef39638e0b196ce9e302536661dd21554f1bd5ca8bb4c271b2020e674a048ba561bb4225c93ecd6683302f33790c45939303751a0494174b7caa6c8769f362b533144f55a2d59d980872a0c35bec8a938611755afd2811f774aeba9b91de88dbe402dfa0408469e913487c9872e44cff98e45aefde074f002a7d9d364a2c8a83e4d597980ab19ee4143ff715668a29123bea8a4b1fa82b101e9578da0b43d437c62afb9f69e3c9138bb7c4ec9f548b85efa2a81f4a913281b194c1e95ddaf281f8617048f6a154f1fa4e5a6095ca00c5449b28bed738f1ef93ea2cf6aa4861dd0c279a072960ef09e0722c23d251054aab3290cc5e35e5c436040e848912beb371dbdd6c9aa8d3b5ceb1aea8ed9025a0b40754aa37ee8a7a0870eb1562d045afb9fcceeb92ffcf90258b76624ffdde41df97f8eb0ce96cab8bcf471bdff7a31c5508c306cacc2f23756e07d261f09bb88e52f1f135ace8b3406da72a490f63a3c39e6e40aa947eea4ee7d78bcc2eea7f50c6e47f5aaf9b4bc6ea8fa3466de3b0961c251baaef3b5f127779f106ff46f0c77224c7e47800bf7fb4652940b9bfdd3d009c0a5442e0ec50ab43a47ae83dd742d3477d5b8c9598eb59cc2ee079648438fa179f3f260c3c89d1d918c0703b7d6368d1023853e6528a4939167e036e301a574c4cb41f19aa3ea9aec0503dcc6d99b135f8f3746f96ed111092920e298b41a69e955b8495cfef91492da2976d22663b0ab425548db0843ff705c4e042d04f7672fbbdfd0d180d071cc340139a364964b3e6467aed49d02460f27f3036b9b4358e0223eefc0d2799be23b148e003c3dcc5e1cf5dfacd517cc2eb396471a1e062342b45e0cf29cfc781c16e9dbb2565f1a549288432b5a897b1528bf38023848b09e99c69130855ff2c1ee09898259041f68efa74219d1603a0badf73eea8f12e73bf9fee44035acf01beafa0135ee34c2e15bdb443de5a5f0596ac4c19ccb6bb063fb8f6fea55eb59703346aa96bcf8eb09fdabb1603c5f874888b129de955cf35cc70098f88d221709f074eb6c6c578226fe9ff14a7e96e61e2f43de7995ec986f86d9c930845b112e4a0d2e7ea55a7081853f6cc35452f52386044835722387e460a3695ce39d2f276998da9510089b62bb148b93669c9ca1b67bcfd9d409a8037ce4e04251f1593b749d57795469ec10c8a5b4815b7bc3dee630dc2f65a7e313032795ab775d77b393a50cf21a854bd5d37a5057dbf852233facd5fdca04215e1cf1f25efcec71d7f03763c80a65a1f7041cc8db901a31b8e976240cae28482af0cc5e258aa32fefb0dbc3c2cb10d4bf841282d61fe949e50b162f24b71c42c0a73f41c6c68c9a43fe1994aa068ece757be4e80f336d80f2ce15600c8de7f56868d3040a5aae981b007a3f4662e87561111b615072afbf2659fa1e8ed9914b6a5b0e0db9ee1112bede852a5f8825b3cb6c3e545f84b6efcbd54dd07043232b0da97bc59b29bef175c1c3bebc1f4d6ffab7d52b05128af6276997e07b72a47c9a7a9f9477b4bc1b88d1ba6327d069913718694d0ac434be823e5eb5770f1c2859f504e31736137a3f35f48266437f00cab781223641bb2d267b2db72cc19416924331184158ccf5e116f981421f9aa6fbbda5125132272d5a49894e6231122e8d8bae9dbec2ee73b89b4fca830dbf6a12525d85223e81a565d0fce2e007a15891f604d8561b81de0aed80c3f1b4f834569d32e3720ed07c90370ddb6fea467ce8acba33d00c8e1d203314d653bd4cec10c7ab9409491c9c23a745a1d7820b82d8d45814f63c1b184296916a73cfc47b88f75100af986dec66472a9ce078f752aa9766e58e5433b7b83e81e6179366c70656aa902ca3cc54a0404635517412d5a61c6d0d61fbdbe2c9526bb408b03cb9d20c40aa471140bc1bb921d2f41d65f1138cf5f437da1d81befad83b0ecf4e3933409bb8c98bd20c1ddb41dd8f1cf78f3b0e8402d898007cdf604fe3f098a230731b41207bb8892cefcd30bceb18d19864cba49f0bde8cbb74a9581478b24284d8c4bc4c22416d05d9b876d9d0baf9f2d7eadc339954ca26c5007b366cc6361fab6394a289cd867d22c4999a06aa7987dc94b4264ba1c1a61a8b41b1957b84e733224f8c7705dd7d14182369548f593dbaf1b5e0e76e7a21ba7231eebb7a36c6ba277770b39079eef5dd9cad83129ffebb2866ca3562fb80eeded453a66b54a3869a93b8061862b60e3a8acd5bda55b12562504aff264eacfef7b0491df4e465e0a42ccb3842a1bfa7587733a490823e41c6f9c90b617b8c32e44f39eac0f0f6106dc91111b83def085fea4626db2f8c577debb022bc8807d1ce3989d3757f3d5e1cf2f259223e3078766c6ea9646385afaeae650cdf7f0725dcf4a3a1bc9a2212d930d6d727ad6941c58413f4d226109082c8529171677374370aed1c3c488d73ce092554709182a975ba9dd0ce80154421c3dd791b4932070603d10b9e9166ca20074798a5f262f9ae967505007a7d11b227708b842c2e267265b537897d955ffab2a56b6dd8f37897a1015b0f1b2e405d7a729054184e19a3ba0369a615037a8291a595704c1c705962aa9aa46c11184c464b5135167a27c08922679d609663e02cb0dd5755c5271b61d88966730ee3a4126293cd2c9a99f15b7af9156637613d0b2f0ccafcd6e60627f4f1fe3a0ee790672121c46597b760b773e9b630cfbec1b788ea704838f5423b649a13c9f76e36ccefc2c3c657c9322575fe29c544c093b7253ff241d19cf625924c4e26b3bebec9343d7259c317922de8ff162e80b0dc936cd3f7ef8a234b6ee4cf575b281f51e6595b7825c3e9a65834b5247169d6c3d4c76e285b4cd1689dc4ead57040db17acc4e47e324086962dc1e8fc98e97971019dd72d8cfdf0753a9967706be13937a2dea02b8920378b35f85f46aae7e20da255d7ad8a86c69ccecb0cd156f580d9510f5628314d44adf63fe4a9b04a5ac03f5936515ed09c03e0c2a2a03863f9273fc0d01c32adf523faff3dcdb1fc27b26110bcc00fc2b9d2f8e5f0841a13ec46f657d4b0952a9116c9a1335bb5e4910a8fe230a2a54367329e9ec02603eda061fe3e2b8c61ab62ade98b8efbc5eae2f152375ca1293dec4b5b55d82efbd95f9edddb9d579e17ae11e4271654e7f6608e31770663a2979144b67001430bbf6f251d98f1b95458be6942dc930f25f0550ab40af79018399e453858030d3987191f45dcf15c8c55dade8911ccd387c0078c6359f7d1930b5b786775a6368f19a5b4de0e63e54ef64a9843308a49144fbf3dc7cacece1cf40f03ce2fb263155d5b0b6f9810ffa02355bef7a09519d483c44467c6432ebadf040ef2efee3ed23c834d80e1c0508cc444782ec9b5eacf4560cacbb61f9976b180c25d1b236fce9c64a19a513a8019c15ff06f13b2640e7ed9f77c002ab95753cc46961d199e11674730445048384f02ee4b42e65330981478f2010e2c3365ad30c3255b9872a48374220646b020377039b42faa61f675f185e4e246edb2a8a7f361933f68938eda339e689b3bdfd8f18851bfc7a55daefb48f4a81234dc292a5f47662f50aad752ccccf3b7b11e3b6e224a79a5e40e4a1c084bdad9cb59ef1cba9e29951a5f88d586d52e03da8466d050c8e6ace9b1513b0f10000278d202674d8d61d88c59a74aabe1a1e57eba63fd5af38c457bedcc3fa36ca3f704ef6bf1603d98606f413f988117d5c664673adf88f2f5d6616ac2120d874a1f375731a43bd655958abe55a951a0510f5534f15d21eea9c964d13b9b95887de2d8b35c66257f21dfa779f36462a49d2619c8925e6f0e2e844cca3fc28298c4a8b1aaf521686083a68c1920b1fe4a427578cd24ccb87b0e71e1fcd76f1edea8d988e502bc4aa203520247e5786bbac7623ae8b08e455cd1f6ea100a8aaf83b0dd260b8e1f146d294bd1ab49a1f21db45726c33d8c5edafd7d31ade1fb7eae651d53c59e320de87ef9c1ec5415db9b92bb0506d3ae4b1d1c6d7c7c62aad3884dffd6bb3cdd7f3c89c59ab30eba6e5be8f69f597adc534cb52e94259780f639f2ec79946f08b090d21523a78079f3863e70bc623bfebf8f5128414f88632ee8dc4d02f9409be90de2522571b13bb1431d9024cc1dfcd71077c34aa23c3cc4bd91883a91b57e72db40e569b8a9e6f1bb0bc09e3d29bee3f4af6779c8bbf400e19b07e905d99993217434b4257163fb159268f45d662c2b66827c94660d712a7c8230d7fcb1d4940807a9d160109b177a3aeeecd6dc2ff78c766a64273b9d8ab5cc6dcb1f4718bcb780ab86108e758d128abb4f4d93ad8e8e1599b1b04b5f68b503258f16a24b555667a19dddf4d8a4040a37e46d948f3995e77143ac489e0ba4aebfe988ca57a50f45f5dc7149aea57942ca75dbe6be40c9735be1c13744bca956a5a21dc822f508a10e0c7195ded898bbddc8429121eb5141bd55972238c3ec823e827ea3968c690354f588e050858afcd6a7489e9f8155d90065d710626896baf25053639ab45bf32f5e5c33ecf4768d1fd89514224cffc48dda290aaaf3cf8729d6431115b306fa071095959a6d85f71e23d2fb91927589cb7b3417f8abbe6f4bdaf7b3f1d2919f44d4dc0f4237dfc13d52a75bd39cdfb02112a13f34d98cfcc02517541559246b4e70d9a8cc9bab73e32bbb3dd2b266c1f965178a46c560b6f17f4af96990e9e58eac336820e112 +0xd0eb914e0164d7b272e0b8bd16c18bb311fa528db3e31c84025f259641921649c222ba1be6a205439cc07bf44b8faa02c73caf3af31776cddef89e8e05c11a5f +79432 +0x78c5626c5f3fa6cfecba132e1896998c6e8927ea7742c20e754cd4835336c6e1ddf1d04f2d79104565b7da97a4a750af32b63219fe6ef7464b541c89a611bc661bd1610ca8e91a20f2bccdbc37dfcfb8847bb22828f35e2568c763d174b98e959a2ebbadbad6e9e7fa8f94a7ba873f2fcba1501ddb1b2035346d5361a77465f6c2cf86394a8aa822e5f9d66016e7c79c6ef1b302012c65fe180e9243258b6912fc7e6bb93f4b7d5a1ac23bed31479088d73083de816f54077a71c87fd846c170ae0111348362901503b26d58f5efc17b6d296aba432c16d8c35f9e1ba6ec9699422122b2fd170ade079111a9492683fb98a30e9d2fabd2f95ca0bb2179c70f131ea6433c95b1133a8e26d2e61436fe92c065178f2d33b1f3abfcc998381d5568ac581ed8337ad2b3003a5519406559c74d382e99250ddb4c1a3b6d89cb378f1f52ff5b91bfb870d0c6954549b4fcbd22a7e4fbc1ff82778f102451fb195de6c17a62a26c21b4151946ff487f5842512c37312511a3d8ae41f5801df60cd682d58b4a997342b6e717e94006c214813e6c63e75591f957a7ec301779838bec8ae3ed7febad08051151171f291ad0ffab6b94cd3248ea498b172bb10ba87fe5267407c93e225cebb9503966568f7406c1af33ac653e5cf4814b4d167e6fce0a800f43f03bdb27ae089ab5db372ae8dca7c2a64c957b38a2b20ffe0d78e061a3bd3c08bb89df4f9725b9f54774f214c9862c57756b08679945eba660a10220f80883bff3d036beee38355f71b5f0e1178673acef8eecd0216367add5a3ddf350876dce60bae95afb6b945d23a12a350cce210f81a82f5a84340c7c352379c3f562819ecaedff0d05e4605623e0aafaf287bde7f55edaef08df617947ccdf762dc24797f91180bd56cb20b23a1b78160fd8d09c115af376f78def0dd54316f641cf4821b5cf755434495dd830fa9a73aceae1969e4485d697653ca0a533262979b00ba5c5cfe5b9e8869e32cd241af710e5783c63c395f93190d29b814218f91c8e1989f2b8d8d4baa96b27d942ff8c85f01ef82a802dc60c3539642f18f34d7490f8370432568df1da4c1f1bfb521951335931b9235425727df765775ebf0cc7df3215c3e768ccd743ca825cf81a85bdd7b450d95313fea990960523bc84205ea24f8df67c1579b2096cb964e05fba1104b4bb52b87139fa959eabf9d94b708102d506679c667ccb57bb2afb5c2a9f95e1e3dbecfb76bfadb495c1c35e1be477274ee8dced61bd6a533e3ee914821c9197c8186fc42a760a1705ae47f2fd648a38419a1e171025d7257d5df5af6f194c4debdba2ba964759e375da4e3ef8d8005d3786f5c37b9a59f600f0e9d6f97e0f2cd58a4e86c11ae1436ead9fea142822c0b7132899a90539ee505d8b302933225c0d8f3bd0b3d8eb5d778f049d593d388649a98140a24fc034f40ea4660621cd041b50313f7567bf5918e843ffd0fd8ada75b0c6616e5e33f17469fb1f982e584d8837f87b0eb1a560d92025b980515fe2c490c0a3161cdd4c59d85a04e8430a5edbaa572d869de59a439f7273722101c6bdb237afa170056e29c287bcfd492c609c1318fde612c62eddcdf2d4ac56b6afe97cf32c1741f27e6f8f4bf0e026067a54d9019235fa91442f136c8538d6c7c5ce57bbc38079eda5b0a66e4897c4e0d58a64db957b3c8f06c2d7aa2e1e8b7c2ff6ac581ce5ff3e0b7671b86b2c090298c61c6dadc0c0059a1d827276645c1c16e9e193de4dbb2dd74857f102a6dfb3ec906981830d6e3e28c97d8d051430f1a12d6032b1c1950232afc0e0b40e2d3df971b3ddbe692e81d94c2fc38435f141f94c8ffd3f4875044332144e2a6bdbe6e6f0624a07dde815d430ffdb9bd0865545ced8be2dea437c3359bc030cc5d0f7dc96de900670844342fc579ff1ecd775ae39a23b26afe7b229ac1ec70125f6b702e98f77622aea534b399ed52f91cce85c17543dd0a049ee4eb4a362b19234708173dec7c413028d166e3b46fcc74df876ef588cd3c45278c9f8b39bc514726880bc3147d334b538cc2398ba019742eb244a15f0d824e897c300b73be5b398e9284af1c03894e99e94e11cf9e608930a90aff33187c6f4956455150bb8788f39a0a787fb9a3b8705972e2fca5223289ddfa65a1687b45fb8d37e37d0e76a3da0115b59bda23278b6fd9539f6edefe9ec3cb7b26981f60f493903835519918b68a3ecd1d1f880a2f9ed9ba2466074bf3ecd6b63f01c92ee8fbd6d6361f7f661d77de456fe432def168fcad37f53ba90ddba49d5740192e3d488433ebb29a0a837c8cb4f0b2b4246540ca9326c6dca460f2cda71bcd7fdd55ec10d7c2c569746ceab2726c15ac68efc8cc028d457abc71d4ba49d9247dcae779154847c26e425e54f8242e875c1b15636981e7eb965fd4f3e31c2bcf9365565209ec073438e2bc3dc630b48273c96aa33b87a333901ceec2e0949039413b270957697d8529d42b27953e9a8153d2540aba8a5bb8286243e42b2982fc17cade219617175fe1a51f84ed944d1eacf465fc5f108de3afce68ba3b6190827772e01d3e9b610ec0c40de847d848c4cf7e151a91a0a640a6bfc1c789d33556f0f1d17ec95cf72c77bf7ac43c7119fe4bfde5c80ab121499dc4d39eaed4de04049626a8bed226335705daab24054d2592e25c9722d8ab79056c3292130d16f432fe542d97a18abdef15c20fa6fb3ef534c9fe0a627d91596e2453644ed26cb1fc88fe9fec31a116c09db5542dc97bc7c2232e8452167f65487bca67badb4bc7d1c46a621518e5e84bdc392b310690379b7c72b76a39c22714d0ec2f0f7e30a0534f3c06aaadd5ad017fa1f75928f8af51447ef6236e060963c24d2c8531b7c5e177f80025870cdf81e6944afea731a963f987d30619b7a6b5de61e2e49c4db31cdd02e11e3ae7fa4daf8498aa17b7a0442a41d09ad353697b73ced486246ef255fd012bed1fe387b5490752d3e1174e825511615a1165dc3520f893e250980e3d4657332accabf25931711c0499cceeaee89b27bc5a6b796374538391b76561234799b95fb79dd4b9f77656d4b8451b1a7333764a14e0bb96dc84361caf3385b88f3d00e47735a958196b95acb30c5e65737eef7be7423d3fc7ef2ddbce9f066d7bb5bc5171ffeaa405e55af510af230077d1f5da382c58ded518cd679c144da29b984e3f3e79033e4b5809565799f38beec12bdd8deba8f47285b7387e1fd6086d592906332dad77685843490e596a6846e0e40e6f2c98012eaa5dd70b3e39ff7f7cff3f069a23ffdb5a7b359b69d2161ea5d0e5424bc095781b33bbc9dbd408307813521f2b112812d323a49557d515e49454eaade5ad11dd4cdb6f10955ea33edf17d7f36cff90bd56df3e628fedf82710f2971876a816ccb3a76995e71460e9167f4919dc39ca1959f04bb98e773d64b02c63086b5c04c4e44a23b04dafb1cdb2ac2df9057a24e5511954d0e02b460bf684e6f450337c6453162606358b265b4840ef17551b417fd0ccf26f0154b2ab687e8b62b1b8de1984ae08fe3b213f202bb0050b57a790675d6d9cda7e9df3c16a9bd8ea0c76ba630d74150ecb2c5caaf18c283b99a9a22a5b7dcca9c46199cc914f47e0ccd791bf320b02be61e71f5a1e37912e879be7375f900a636f3a154b510b60fd8f65e4aca6c53a939bfbe7cc2645086a9de8e02cee36ce8dcba1e6cc4e72bc76a0ac33b9d0552514d5d5566f8e36d656693b1d696bc4918f86139eadddf7a312bd14ff55531d6ac8ac0ddbb2da7f83a865ed0f7b7cdbebef1b199d8e742ccd28313ab80d839074059afff8348f91a8a7108936e175ef4632f72e63dcc564834db977ee410650c9820f363c73121fadf8e59a142a0b6138e1a6cca22736417de99267129e4fc0e394854b08fd067c2c04718a37b381f42c81a66eb8ec4b3605827882c583b4834ad3a9a8fe10d1297b6030f4022c9dfa998972af189a78d4c2beb855679ff8fa77b5d8da7c7d06ca3482b04213e3a3f7186f97e851c043803de4fe49792171a8e2b18f5a14801bb0efe25c0eed77387c21aa82b4f4dc3fdacf9b96f99ad6b311245d599246c884800605a0b4ef65cffc3dd0cf9f626cc246f0493ec01d1e31b5b52fb42d93c4d5ba0f732ace9a1ddef9d568daf23af07f5758844247a07672290daf2b867bf383c164a166d68e3de9e770e94177def5db8e60d34dfaa56df8cd96321c378fe32328be16c1473c147557a8b87f7adeeb4b4ea19cbe539c633a25f77f22bb1ff218627459d6ab145005cce57d0185ab4f632a73671fdd05f4bac4a9dccb7bcccef8111fd1237cb76f1fb9afad5422d4a097a48eb8ef1172a0ff2c25e1731416d826872913243685c037a06fa003ccdb7d7d4f3c08a87b52e68bbee403c5fe7e8c486718a645531001c203ce1b8d0e4034688d13ecd8853733c51f6cda10957479b22376f1237ce692536613664c4173740dd09ecbfbb980275fa038daff93992f183ebc8a3afe69f0704a0826ee11059ac1cc353c9ea2de2f9ff3d07cef634cfadf2b61e7f8621aba8d21f4c3def7774718e29f951dbb91bb2a8cbc367c7f008b7b7c0f70e842994f2e8061c39b6f38d79786068c157e5b6863cd549e0351644f71a30deb770a362cc8d7e7acafd2daeab2593287f2659ba5f058522a3084e8c55632e58e5133a1e1d0bafef588ecddeefdce8bff510bc2f244901d516083fe7b9d9e4effd3694cfcfa8c0024b2f7a262de487b789ddb61ebd5171eaa3fc925d0bc5782a689f597dc9add93c0ba9dc8c4d869998a554f18e1165fee9b1aeeef6336f12918e173230f362242400c49c1b380a46e8b03f12870accd05ba7e4fcbb191fdbadd765c7f1350ec642934762d8d4b8b5311264c4118fd00ec8ef6764b3a51dfa05ac53bfc777faea1e2afcd5cd0ad70ffa328bad3589b7e0b6f0ffcde6c0b0982273a7c2bba16fb6412fa99e01c3b17bcc7a7e75fadeca6faf1273df5d5022dd8a962a7ad49bb352320817657ce58c222e5104c5697751e33abd8d431f3eb9f0c77ba48c1a4d0ee7791f0ed14759b12ca81fe445883c9464e05913a13473befa618cdda395a0ca9d9fda568a690868c0c24de79c6115da18274ecea0a5d67822de2f9c654e7a2e9b2ba3b639ead9f9060541d572fceb6d2a9a0586e9794e3191c8ceab7a4cc5810aa5e1f786d3b3ab27f86476715fa493c0bee40324b8c52f6ea6d0d08b97670c1195fbe1182b80c74b241e913f942a95031d540cf86b22bce2019dd440384a17d9845b3c98fa2795990fd8f084a363bb1a3ebe6b0d994d1e15609d7e403654e98afa68d0ad48905d3a43f859e992394c2da988e60c4a2d9d2e4b389834996fcc4b7d8a65001ea3675648e895156b939266e71c469d86ac83564ad6e8c36a8206449729c2388348fa14a40e6cb23658d3eb7fe0526756b116b4e6df3896b074e09ecfadb0fe8067609ce1d4a565f97258e4f93ed413c125a071a6bb4e54732fa281ad7ff7fa1ce8df1786a10ad8bec8697ade9d9248d0ee67b413d2f2a6bb9a9414ba055fd35fb3c0ad1cdc61b38c424dd4b46456af8af5b4a6b38cee34919dfe807da8b03251b04b852aef739d6cc84e1c06fde6f0f722ce6e115209a5fc2027ec7fd0b1befbc8c7c83841083f6442b27759cf0ab21f5eff36b28a0aa2050b588146e62b2064e17e9dcf3ae8417f98c20f37428c9d0b8f8d23209ebad2b346d9675c50e6ff94e4b62d7642da4ac2b3c60c27be335ac29ec15fe2f4e1de0ebaf2c54978aa0494bab89fb5c1a70237790696b2abc6914c74e31280f6476d1e4debc393c43fd76b49cc1c141f1713e5d3c9d35e710ee9b2f73b63820ab328ece80b8bc49e6c1f217b39cc1cc4f222d4a959eeb678d30bfb11107b719aeeb67f749b42636dfa84bf3749d6541900da0de4fc0d3f29dc9f2fa9ac82d50dc1c1dfd7e313f999b2b04c644263448409e0976afb5983eaf34c57a7559f34cbf1ee15fb2b240d8a5948d0ec6d9a756ed4df7a259ef90924deba79f254fa183c49e728c6bb9d27a7baf754b612a46e402a7dbffc2c1559406692a074f1bc08c890542022daa7d05a9c63deaa79a8b760d3626dd6efd7fca4537cd114730d8dd78ddc06f6d26a8e0bc63479b0e9cfd93897378c9d2d6579ba6d1f16ba24142ed10928e12ae90dec2001132ab0ac415b2e3ea425382fe758e97c24764e4afa731ecce0b9a568b86f0215a8fb920825c5ac8f503e8f3d8622984732fab92ee6e4269eab96519795a119ca9af33e46a3a01953e4e28a9e695e3197f2a8e118010a5147318115bdc909cde8911a9dade573dd520716119cba941b340c8aaf4f736c088e1b81d9237f2f87363779958710c6605462e40c7d9e4cbee627a80b1d6392b13d119f8512dd9cad7d31170f1a4f2209219d53638a3f0f8275eb08dec8f905b61abae202d00bd7a9852afdf4b0c80d42805f6bfe0bc564cfa802b40e995f4c7deebf5236a53268e116c8312a8fa311733b5035c54858d40d4811b485d8baef7080c7f70adb7ad8bff8b3bd9bff09b6021819b8a1881ee6a41dc30e29cd3577f59a7bda66b90aaea9f294a82d4a228358e062fd78154222fcefbdcce4c0f56b7602830233860b7209ce13fbcab71500dd5ad20a3435ea107d86aaf69df825535a818677578ba4ad4652d7bd598d0bb5f95012e9bb313f3990aa30923cbeebb809df2d42bc10fee6c84789f6c2152b2b1588caa2f75168249b22f7aaa85a6f20ebe41f6a485c40a5f774d0afed979ee997cca13bcedc8d5908b7a845cb14da16685804f7e5b993723ba355efc25a8b77e9e23fbe2a1cd8613d31eb6c8c33541fe80286f27a6d1fd6fc9ac0be29a81b5e71924d32f2576fc3a4586726d30104c5d3ab4b62efc10b58a222b8240ac7752599a673a00ed67a07a3f3c57b88c4138f911bfb4f2cfd80819503e52a4d00c354c8e4580f65e122b6a4ccac7394c5a9058a1a3fc11869a5d73d05f0d7da9b2a746516a587e1bf8e570ea9c517dd4cecb02670bfc19d4da3e403f0813499e0d40cda02011169bae8724953b86e4ca10717cee42256a2f0a1304d8b3f477217e9a48e7115b3e618558fbd922c80c90b20c3e8401089109bc841849fd31a4e8790c4e92a89773e22ff37d22dca563dd3603ade4a3361cd9640a111f4e4b51379f2f553f704655a200ef1f0ee39f78e42ee0616cb30e6c22930d85a521b1eab3537be349e2e84225aaa467f9b216ba69ef3aefa8ab220d79cc06cc981205ffc0386a8f4e8b0dc7e17f9bde7fd2cbb6b2f96bbf0515f18f5361ae7c5489a80f02b073afb9d327557a126de90dc00eec73f00b462e6dfd5024063d1b57132876ef4e4fcb2855b58933e5731e200450ca1145821b712db5fe702c6b003c28f7e5da842767f67d48c1c37b53f4630a41ee0f7c78b579dfbbf8dc4690e16045a6ca78d4c31cb0d4419d8d4678f2236c42b6e307579aa4fe6fcdbce747256fe3a5a33eb27b4ff3d5408b15c95a9dfd84f3b3207897318f0451eb86710652b7ad84fe90cfe8781c0ac608e196916e6dfea5714c42b010947bf2e0ed9656efd3edb53b137f733bb5ef3295651095d9e123f85fcae85ace51dfd32c46a9a153414ec6e73b33a3f13ded26bf34d9d066e3bf6cfd20ebcfb143aa635c263d7e238c2b3a917c9f033f30af02f4c554e9ac020b73d7e2cfb77fe66633cf00c465e7210d70b85c14198c2a8f67c49b043a0fb8b29d6e95068a60b69dc5136ac0c1048c8019da6e354f4e8818b5bd2a8a6a08642f4a2f9c22b12a40ab87b7c8c548023b0d866607652d2cd5d58d3cf839c22cb0dc1a997c96d432f12a0c3aaf544376c92056e9cc462b7d90404ec288a4faf31b638f4acaf56c0164a3b2fa82d04bc89342fbd4313ad2d743d38aec605e7ce2003008a1eba0d11bf7732ca5e7cbd97e45eff5c3bac5bbb06d19c228f3c8b0800bec273d733bbbe94642c99b42c9751e3da1c526ed793eaf789d74f6c7664e43aad25b8bd62874ffbd8d2a69384b971f06f30a7c2dc7d40af2b923e45fd9aea3499d260ba8e9a4d5e9accf8e1cb4c7f72e4e06321024247967f74f5031754a257497073b5001b402473c197884a7704d102d68f72920a87144f267e8c0dba950b87a8fa950133aeb52b598c6e4963877491ba339dd4fc8792614fe1ca27f64ab91922fb44d70a21798a3dde7d0f3790c5593355891041cf767e9824a4ac2d49c7c88581a9cac720d85815959be61ca72b21eaff208e00e72a6ea95101e68a1b9f5c7991ac2493343a5c88bab2143a550eb387384995625814f9296fcb1b3247a79da835352b95e3075f3f53a9e2b821d6d5b109ec6f8fa89ee7c187e99450554953b7742c29f6b8a729e26b6898bf94ec501078f262ae622fff18a043990aceec4551577964dd3882821807d77e7634b6eb4d9041b7e80b2e0ad7c2c1718839f73c1ce4052573ed00328931dedc068c9d701056c2b6642d05d1a5f54b66f31ed400c025b6b3df5e8a00def065f996210aa500d45da64b4f1b192b42c9be7305ea59e62275584a1386b5bf4d541e4f7d6354c611fbd1c4fad8ad10b023c22f77a10f36e22b5adc955e19d34e9393592711430a15827df8b5a454fd4841ba50fb61e9576dbe02bc6b78f4c3fe0aa0dba77d3b73e9dcf30e08e7d59a110beefd1a92b0f2cb1898131d3e0e3662a28dfd860e03a994ef7b2f7b09f98e136aa55f5b9c2cae051f640834162fd58441a1e94b2b65551ea55c83977288825644299e46e8253421bdadc4376a1e486bd025c47e3e271f90e4e031e38b4a1de383c0e163dc632b2ad9bd6faea1a4361f3861b9a7ae12aef1964d62e8ba0608c10db3503be1ad3c255ada3021238948a95f9ded4fe3eeab49a2ec3d2c6886eaf8cc4a155560cd0f1c2a4d2f19589525102f218bfd4583bda0f005eb39fe906c91a6cc5539bf894b16305e951ea88f755c8f34b93a3c988dff68e09397e2ed369385833b7068aa981c54548ab67b41e29566209f8d30f7c26df2c45ecc7e65ef0650b5ec81c1f8a0357e79356b397112c49e2b677e896605f376fb746239bf3ff2efab93f4343a08699613bfc44ae8adf11e9e3695afaefe98dccbfce17ac5d06049ad5652273a7bc0846b4f49166e5c22cec1375b0a9754640c7d1ecfab3d475748025d2204be9f4330c90e8306cbc76196db8f5702e8b05fee5804b633f04fe0d3f4d1ec328f1cf9837424f980c695b55e366912006bb9926ba6d31d7aa68e02d2c9da3919759beb63b6b833ed286e270e18eb126ae6180469adb68de826acc52eca9f8f2137c41fb9d5f2bab6b9fcbd8eca3de1aa2274bdd1b7d38de53a5231cd3f4979b29f3e9f6e1afb154141e481c694880726e776c68c0a52a5d9a8284f9870ff7c3473b27368cdfbccf888d17b9fbdf40a48fcc62681ee5c5d2c39d52677a4ea220f7cc7a191361968425569b2ff8fa874772b0be597ad193e46b502be532532f2ab822633d09d7e708672542ed050cdcc1a3aed0cb88eb0cf8fe456201239fe74714d76300c49526c2ea53bf7f8498a9b9bf216a2cbd84998708e7a539e297631c7a460a12f83bce5a1b7c61661c20868611b2bafb7d40e224f7a155fdd3dc4b016508c8d2093e46247709c92f1026ebbd47dd73c66ca25f49571d04db9bc0d79c71aa1fcc7c1f36b889766739253e51c5cdfc04fbf01b697ab3b532419f07c1540c748f70c551188ccf6cbc12bfb9514610b8ef3aac3ea91f7a045ece41f360beb222884d79665427b537485a343a52a4bc7ea2d0f56e86ce3684eae049266e32ff2eaae10cd1820fd7708c7e4733ee782dc7c07d603d9afd65a17716091322673fe357a9f4251abba2a308dd5d387d26e12eb88e812e5e3383f483de063c25b210fb2f26c3d39691b3394e15eaba9737830dfb82bcb338f70df891a6c523f0aa0ed081d6006f8e4865cdbca6742cb52060002a08876ec3be8028011eca4d1bc5860e00361e4b5a4646bae51d8e116f88248f947e75a37700770d82948a29ff7b130e2ad5821992f1e29b47c99d0b2ec52d16fb631c03db435f0376b6894d2461324b5222e03cb0f1a5e96559357c6b6e0630af34cf02692da4c46dd35c2912ee606026ac9d373ccc2d2fbe4acbe7adf92c672082232198f5e4aac8995730539929c708e13d8bbec7d4c8c30cd4cf7eed2c150fc9ace3e352ab3117771f156ee7fafa895f35cc9f9b296f141df4a656b071d4cd89b0bbe0ba44e1faeb282abd51506518750a5c57bcb76d11fc800ecde98a20da30f33c19935e57c363e6f2c77bd6b146d14fcd8f82fb5d4d372b6b2d0ef183c65dd8c6e68453ed017ff00035bdda4994e26a92afa461ba364c3b4e2c973478027ed5feeff3d23c459dc7c550adf7a87326ef4e208786fe6daa541a24f8cf782f027f369e6835aff05bc2d4d0a29b58721d42528ab2d7b443dffa71aeca2efeac8739206a681ab2a23895910e5251d402440832669cd056696b82c74271df85fb7b982edc69ee0edb92a49c92239795b429a5701cdc0d6f4ecba19d58866da89c6e10c47ce41bfefd187459e4acf937f84cae9e45c6eb69548ecb66798e35d11fcd3783c47d412d9728894b7e44e3155f0b881f5a0406cf1b1364a52defd489f62770ef3b8be9f52a515803d781e1c84914d675c209cc2b12f801fbee31c65dafeb51695a9672f0371164f588fa71cb56c6fe24264eb7e7dcab27bd22da97a6bda76d749a2378994de734a2fb050f9908b073ccff59669fc8bb5a7b6460a50f9fea09a382c9677acf414b9eb63837abcf5febb2a5a034bd7796feb93b6a9af2d701da789ceecbff3bce1e4b330a868e2b23aa87c1b9cecb69dc98e9103ed5faf3ad3466511a12a133dc312b0a0258ba9cba54becc1c8133ffdabdad7b73d272664acbff47c1d80b17fa08d0a3a63abba4726eba3d3ee8a1da3fe158e5903d03bf48f595d97c889788b629be886ca90bc2ea4d1c8d97817f697a888dd72a62395f4635dc9ea0b0c0d68ef85720dc30158880946845bcd8373df937bed898ee5dd6b12135ffe4cd31b1e3193d256b4c8365e3c90ffe255953b85a535e52623e1ba6283c3485af4a448b60e0c2dea06abfdb725f760f57817f791c800eed2ccded5e09eb5ab866c483c37703aae4f2273569cacc5d01d9ecf4e09e3223013f4a3d5ed4b31b10b1b87a0a93e637a0f6ee8e814b94076e12f87e9f7dee4d27400f96391727e827068281c1560d0bcb254d15c2734b27bc993056f62a18efd7a59a827d5fbe5453dbdf55782bdc99abe3bf759dd0561065d321289531368d8af6778c8c0ceae23fb81b4faf83f953cbd8b23883f149640267575dfd11eba8c9a9231ef5bd42143311b2eac7fcd7ecb36ab1b9054499850abc2f818e4a9cb40c3439a43adf385ce67f52b16204fca6fb205a71b258db15f748261dc949de41db3e07c6dbe1424eb257673e0e2aec24fb80091ceb8c627950a1e79d5eae04d4bf1d39f14962044c3f406cdb1ced0ae94d004a05317de4319f4fc08a9ed5b4ef10582cbe13efd2e7d5b0d0231ea9ed66582799b524abb4d14ba86d600a6f62f377857c87bbd952a42e3f3db09400081eb57c84b7257478dade523aa831b9a3746d1b85d8c1bce7f3a12211de1d8dff94ed657785c48684a0dfc3a4dd9562daf46980f54b96092778c73fd9360b82184b5888fe9b82508ce5b873588ab5f98df5f56c373ac95c858618bf0042feab06b48f3d8682df40e5fc00f7b21a13cc40fb7913c830dc2586be0e46337f67672f631a19bbb63bf6246641b74e062f7988779d4e24b83ed29f83205bcf55c62516c951a3eab038deccb6e33888f9798fb8ecba41d95b72025477e76650609b834179fe42b00b567943507df1ff4e725d76ed58b55275162339fedc0c432a680023d7489c882205442ce56a8a1d9fba8136dc010f2caf8bc3b4aa76a4341dbc0a5273f917ff9ed5cdedc841576047a2897d4b4bc5c465434268ed3fc48fa4f82041d2682b72cc38750a8b8af063d0dae4bebd815fb630ed5dab499fe3d26abcd076651e6d7e44bde807a1bfcba4e5c4117f955a538e9cea4400322f9898d96aa964ce94449e92d68569ad586f8fe0ee9e34853f4799f3bab40c5967594f7b91f991516257403102dbb4f0dd52914ccae971ef988274efef1c3401df8c62cbb37f80aff10c0fa9c3695e2eb6fb6593d991bc46febabbebf7eafbedd0c87f346f79b73cd8d95957a8ace9b98de05950ab15782dea56bb7255bee8501383f16ff696b98a7245b9d52314cc23caa808fdaff339f6e3cd101d88f66ddaf05565b90944ec0b65e7adbcb34f99ffe598e1156899865463a4463812201100ff9348ba1802d3522c25a148e9abb7a077596e126596c1a8f272ba7c81da5654b9e416ed936f13d12d96413436b7c9a7f8602c8f17799077089f09354873c23887ce6cbe1bd8021ae29fe9f91b023488d12398e5fe9057412eafaf0ce68ad93f119896b601dc429203c917f207098cc59a3a3fb19b99aa89cd1b185ddc8e0fdabff9417ff5fa49c8d9a867c99b3c36e0cc0a8d7c7ef3eed37c77d1c2ab0bda9e1b66d95668a07c420c9435ea4818c76cef2b0e91191db890b53c67b5c272cdeb9c47ead3ca6d7e7fe5332ede8e3db2bc6bf23fa9da958c53ffdf46b1c3615e55bb32d292abcfb4e52c0baf00ee098d61db269d2163e9de9fc4d6fb412e46006f00be4d0d7d25b4142964231bd81abbffa50ea392259923d69cca01ee539f589a0520a69ecf3df07f65f34769ecdfc2e86230ff769011f09af01ed713e3dbcb6921206bd10246fea97a2f78859cc736be9b23ed3943e2c94f574bf74c4f99ed5efd24294ec6ff3304de8f32f9586f9bd4a85e0974b18a12764ae7ff02074812dde1b25b527db53223fb89032fa04746ed1255e093598660a243693aef9b64f07887417ea6a707708969a365b314dcec4a8191ef2fbc563855c946573f8c8eeab156580f95d37472a79164d70e269ed08f4e98a1945a881e034515b0ac5b14861ac76c9aba737accf11b53d3ab561bb81e01e0948ba47a662d5f4df3a07794371753058c8f1798c4186fe6e81503c1e79913f024502acbb54670558ca6629c922991a9618e203d1c6ff7a490d5e02003632d4dfd9c6dfa9fe110d2e838cc8c1be40bdeb6223df61a7a4af34a585bb4801e96507ccaee656a8fc93c82d1e5e128b919fc0705b15262c9e2798136d70de22de7be2e661cbac9a501f9090c7f4a6d2b54a7b0833ab069c156ade1dbf29aae13b9dd8ef8896921b3439ed732d9064dad44686f353abeb4130fe6c8c23ec9386255451aeca4def75d06a479ff83d34ed141947f9621cbc61186dac2740c38458c627b5ecd0faadee4d3907ddd100fe51a04d28e109076145f53f04b8bfb562a0469e6c7141a4b3cfd32f93f360e3aa4f9e6a8f75ef73c135eefade0547ca16a7cd41de05c654e96089d254a94ced212f37f6e67bbd68c6782b28a1d8810b88b282997470071137e898adb2c93d264939927b94bc1aef5758d550b5f7157fa00c8d2d9479abe385b128451619dd970bb5d8800100af0e5c1b14fb822aaa2f47fc1785a7ea5bd2bb016024e663d14750ea308e950f23cfbe0a0fb0703be82163c9482a1689bee7c12168d18c6dc43efe21c32cb8b01f3a636deff7e7f0795fddbc47a3481f7d297f5969d46e005c85fea2b8e2d2ad4b56348cdb584f1302f19e1d3d78a4733fa1def08bb6f6e3412339b538384bcc4e2b19aefc5c106a2edd8d345132944fad55c430f5fe8ae01c2096a26bb78bd6d1c1fb1d7a8a92bea22d9148ac587e796e4f1a5fd03494bd9585fcb078e6fa927b21c01f7c6b3dd609e994a27572ccba2b97c9c643e07b4353595528884d01caf55252fd2a857a7c09177d8bd509e5da8c33b8ad778ba73affa48852c2750644e65c97ffad63af764ac13449f4a431 +0x5c59f5748218446099dac3a2beebb570848a6ba3190f7c5ab97af95dbf50ba080a53d382aa213e9e6d8a27c249ff61cb424900a0043696d7477ce2bbfdd2605b +80224 +0x6e6a88abbb52a709b47365ad6aa8016fa9a03a9bd8345aea21f773b1d20fe9590344300f7a57d7bccb95c638c3abc4bb07bc3c94f9b1401ddbd1ceee379152517ead6df6ef77f5e8ba6f3dc06615961970fb1543351e973c117603dbc9cccf4f26ccc6c8e35b0874ca2b52ad198c7f712a854f125323682e0c119ae24f69673b45cac3ed1eab184840ee8d67a5b888ab7e8171681d67badd11c81c6a930f23fd21ceecce680e2e4c67e37756d243b8afb41704ac599395306bc310da5b67097d0201cad1892c5068862f97e367d2186514718f48d04e010f602bfe9c701924a4328be45f48ae8984e4fd75742e10aeb5e6b49aa34a4107623a286e179acc7958f893c2e16e3cde88ca739a73eda28488710bae258f14ae113fe1e9b3a02812829b41edbdc37d595c80b98d466d33a2c4fe9c5236666eff05b87ff6d84cd7f60b64beec5d0f1a01e84ef8d65776690e53d58f0e3e98f70024ec291eee647e2dd99b3247271abade157c58fe0cd0ecd21b3e0d6aa5ee58bb572508e85db1c8c0d688c58785ac06f9c951008ccf4265f606813eefd32d393887a944dc8efb5ab6e8729d33de8ca659ed16190807957c80fbe549243120417e9ac20482e70adf17f9a3e5d3998341066a14cafb1b91d87ae1b35691258e19957ab57063d1a5fdebf061c3f020597f0926903cec75fe22eba2348fbf183e69850dcdb206b5965c3bb5f55f11dad60a690bd596637ca401dc25ad1a3573f9d8563d51eff3f9a3a50e30a7e2be2fc1872e002a01e8984b1e5452691f7b9c870e11f08852b30795806d49be747f87e4a161ecd6a50431ba205b11afc71afdb0b4be10bb00cd4533945fe8843cdd4a05fe09b922a93eafbab0f94ac63999fc3c7263843324c91d478aecf53f635fe0ed462e4e56361f7b137637e5f79e8003f2ef0a3435e430f697091c5838108eb26422d893ba732efb8d191cca8a1e58799bd4ba080c688937edbaf8f9b76cf026323a10709589f398ef42b1e2c7e0a8c6ffc87ce8ffd95c4a0f4587c0039f0fa51e35ddcd319ff6ba0398fd13f50df851e67457bc555f3296c551d29666d07398f1bb4892d4dec0ca8fc408465eccd184187f536c57219183d986df612628a265737658a7c76ed82e5c6dda644846b9c65c9278e04d480479118eb80b8cce26766c0b15f45276c650323c7c53fca33a807c55cf017ffb10e0370e657ae0ea8731a4258762bc1e1397d9d9f5fdc20adc183e6f5fb534633f2011b1ec986aa64b00e36ab7d74f90466a18eb4d48e1a326f76b8930e5b5a818a1681c574b7128fc4af082ac3c51f1e733b81a8c1ea397a085cb4a4b7a4bf123cc03faae7d3f98217694166e7a0b6c7e598210bb664e0ed22a255bb75a3c66e907acf1f7151a1f43ee97ce0677c52694443b72e2082b2f454f42637c6fd031f1bb29a93cfb4be5e919c1517b1dc74ab05baeeb07eb8223805aeb0ba39f5177c35143cc84171a119b5fd948d55358fe5b08a22134f99b120bb5e6fb33d40563e82fc2ffd851cecbe228a95a1d00c16a1cb3debc7019bd236fc6fbda34f5361ae7bf6eec3f91b13d44dcf7305a0e4bb87bc22b65c433327e33f7f451afea2ac748680f3bc1bf098c4be38c7194643b0d009e51c43630404cdfaf9807aa9b299094916c9466c31fe37fa630c6d3eadc9434af1880d1f630b5fc55aea530f07d9d52a44e9d37853b68678baad7208875729e5d48419a6e4ae01153ffd246d16d170a087d013beda5438bfbc44b82264dd2c711a8b19b80d5f6a6105337f62640264525c1667ae4a49d735f44cb02acadda35310176db151b1e43f4717b47d73ff18963e275fd50819ea81df3fea702ddb272271b38621362817167234742ccb2a1612aa7d5cb1b856db19f998d791125830659bea03964f346b7d12f43edede15d52e2d92eec2bf533164bfe1f80bfcd757731b25567ee16969e9a5e165223134ee6f3402a696a1c17608be95dc5f51caf4f15be00f49b1299ad2a78697954919ca4c5a46f49be414216c624ee4f9c5b5a156fac49e95131766cea45e36869a46e14c0cda59411abdbc063757c269ad39d52a642d74dfab95663408d2d294b92ecbf4d8375534aa30be6cca5ac53d9c9a18d224953287df3601b9517eec4e0a3402cd28d878d5171fa11687c28dd3f888d4e4b886482c227bd1b52accf3f12218fe3b9b4824a0e5dcfc89fc198ccb6578a1e89c9b364b19d94ebdd1478a4c852046d68c00e9269afb394d93ea329257dc08344d2e8d5329c0e14a01790fbea80c4514979d46e4aaecdfc7eb9f2fb73435607e46caade2d6d531d017cc04a5ff1fa17c2a67ce599a34688f6fb2d4a8af17532d15fa1868a598a8e6a0daf9b11edcc483d11ae003ed645c0aaccfb1e51cf448b737376d531a6dcf0429005f5e7be626b218011c6218ff32d00f30480b024ec9a3370d1d30a9c70c9f1ce6c61c9abe508d6bc4d3f2a167756613af1778f3a94e7771d5989fe856fa4df8f8ae59ffb7da8c48d0b7342b2fac336676a0cd65765fba843b7fef3a70006749b078c51f751d253baf36b4fada4fde54316466dc4875d2faa933ad24c4c7918b98c5bc8e78a0eeb0dac2e3a4d9c8bd8969e2d3dc92195721a934684ba7a8433b3c15cea134fe4f44cdfc4ecdb0bf57528a9c92cad5b2cdb5b6229f039b3b02d4f4d96a0c2c9ddd64033364c9e18c426c0e02323ba5ea9d134a6ebfd131f836e56d911d33d2080f9b1518b41e0ec7f5228eb420b365294bb6f0895958ee5875e8f0cd669cd7b55c567e0cbb5e7aeae6026712eca6a5f7603d22f2e9ff42e4465c48fec4cb802e5a32989fe8ffd87daba831af04a9eabd51026c4be028b2141ecbb095b6246dfb7f9c0f42db7689f8ac706908f711a613c4a326e4ea89ce706593d232c95c1375430f5c86014701d46ef7978132925a73019c0d6e4786ea71b16128566cb6f3542b18ead9d905f2a969aa27d855908a53be596a38b5a4b8a098902d611ee9afe0be3534dee127bed03304b45ece90c85e4167d7e483679b8571cd5be36e588bd362d0e4d5a830e8f14193a7850c0766cb3143d0f25f441588d3652e7db9881984cf98558e9c95e3752be38bfb9c8918431489efd297deb92333e43f60befcfb7d4ae8114a4cdb40e43850cc230e8a4f5e51868f15cb7bf90d29e6e96cbd2b94356b3ca299277573c71d78028bc08f6e758ed6292c78b0577f1bd9b6d252986645b722840bcb091e8641d5a996610d0811030568971e104721903942320dc7f416a526301285ea83aa2bd63bf35e97aeb97470a7d63a205a6d1d82061c4d3ec030bbb4213e06ae55bb521633f31793c4e759c4617a3b4503ea1a406cf1af715d1c6158f1fecbd907325af22c462a95ed23095d4ff3b012d6011cf0f14292e41d424c910cc523ef1a978d167f4d162279e529c7bdc3270e435aac103d8fa61b934ac3d8ec31cd44f2638eefb77858ae1db6318025691e8bce4f3e3aac59379c618e7dad0ab5269f412ec6da7f6860ad2b0e97132165f53fe95759bcb81fe5caea85b08a02dfae426941db83119ddcb42466e0ed3c4a498f372b65230b443f4b90e9230c4f11e2c2ed45236618791b47bc47959ad08699fe0a040719f076827316f14b8059ec52b54fb134f01e9aaacc45393b98788b550104a9b5ee12177df5cf6670a2bdcf8c8df31e96bd7e6319d641b42962aef9093ca964d83beac770384c8158cfe55beeb199d5af2ad272d6ea44311595fe3025055ace047fd4d717bef10a6a846ae1f7c4868f04c4953a607ccf48568ec0c146ffab5dc1168ae6c2fe5f4a0c5ca922364b5b933e27313a4502455282c9914cdd801d9c74bc5777007b09c8d4a53a7d389a8b9aa1af50f3031f38f810d30a03673b23f2b5cdd5086eb9731f4a1a99536d46890dd5d96ee519283c91874775b552954108fac78dfb4c3e1db5e319405542d3f6554141d59105b1a2c76c738ea34e031737ca35ecf0477d7c15262dc9f367d736098a553f7737401e0226f39f8db818f9179a956c67eefc10c589c480ae3aa4dab307a007185c5800ca4d5432b50f5b7920e26296c2913e7e3f847a1ef639e156ba4f9ec6e4b36ded885601d2b9d22f19dc3829f6b0dcc906fbbcbaff5bf3f13cb7d8cde97cfb0656d4c7791a1caf285da21258068320005d828913ac5fe778ff1429a9f9418195bf381846535dd4cba72af77940ea1988f45c8ff0a06282dd0057b8bf80c2e5b0991adee628ee017d98df5e1a302617d74de217ee66146491f30b0c6aea71a5cb770571d5055da3d2a527cc974ef7a95fccdbd77987e5fb2c4996ab58c0ee306adb80779f731d4a5f5eacb98d07bf5ca71372450e6047b52076a30bf59e9913f3290456a1ecbd537827d6bb77f4ed9031947dc73999ca2102fc88b4cdcdf2df18f209a588fcae5db1832e28c49112e283e226f4679edddd486dd02c4de99bd030d918dab10d70c790131ba81f66cfc2026f365334da0338652d11d9027bf4c5df20ba7cb6a9a53f983a37afd4d064cd519e044a0df5cad0fdccc64167ff8dfe786b56e2065bac143e7b0ab681788252e611196f7f5ca52556cf560bfaeec808913b86c13c8e05f40757fd4291c99901345afe29f58912a414a7498f37b44362bdf3c290a5db334d674397daa24e2946c0ce2b100d05a3dbbbd72941bb0a80ab533682c6eeadc48ee2e052f52f70b3921ffd18a8224cd94ac0e17dd9d13bf020f5764fda83802a371e90c70895cbb871b66a5f58d1e9136fa868afae36d3229219359241e0fce4e45ee75cbb71d9a874089857a89844f2b8f6bf4735385a884d42f6f293a36e850548569c54400514079af9aa2de1fae7c51057cd15725ca1d0e72cd956377f7b184f510e899ce88baaf210cf4f4b757302a9e4b9b561340fbb8a69cf00098a379bf8891bb1c4ee6fec82802f93414f14f017c8859b818b126bb1103c07b6296b1ec8415c6364a1413ae0aa43704fd25e2bde85c94e4fcc6a7fdfb2b8f3b9d7561f332c3924f88ba01470f1b38cd3b9bef482aefd24487268568ae3be4a811eb8fbcdac4a6d0d27fd17d818f84f897fa81898a689e3f8179c8e3715c482a859e452ec43f8a1fee0b8a36a627a1ebd6eb9d6850ef7d3db16979558bb64229c3368a33375dc7a6a407345cc80c1910c3154dcdc3aef9a6e09c9ea845705a0d915c67b27d46e4ccbe1bd8d62d6674ce252198a02cca99e3d6ba42c3e7b3183eb8b8e294dc2169f802ee7d8c1d5c388cc3b687c9d36ee55a5b6c6a8eb9a6052500f106bf9d16df943a292b66e216efb4667d203100c06674375a20f10272a82830afd81c074fcd072c73ea4cc3bd20add61d6dbefbe8a399312b6bd40c3e89b0129c629364f1bbb9a175c326077954dfdb3f76590b0f25321387541f1d3331266c5eab0dfa27311260d7bddcf77112b23d8b42eb7a5d72a5a318e1ba7e7927f0079dbb701317b87a3340e156dbcee28ec3a8d95a8ef9145caa831c8d7737f378ab029ba6f5e9d759e058367dfbb74cdb373f4390900c93bdef730d814f951e241f345295e8c6171730c8c4379e55d9015ff78873c7bd75323c8ebb7c50bc2f5e2ddce82736d6ff1ceb38936d0dd010680379b1ed7d354422577c2e67c0d4ae8d9ba26642254017d0d94fac08914f7a78ed6dc6e5f89b87f509e66e2be8042418322dd3d0ff2de79cc1b616ee70fa9d9ae479cd428218c7121a7484ae10751869ba2637b80ac4f8e66d15d909f2fa0334af48d0ee61d48be352cd77da804f12e7fb349ae28f2ed117a313fe3f617734b01780d6d0ddf65bcf799a4f967fb99afabd000536d592fa982c588b7a0398b774e4cae8d040a7bf3e568214c956db390ac7327f9c2619fcd0d08d8ba1228613eadecd0dd6d00e4098b22ecf5d4ede767fe27111fcc8ea5e26565a039c0469d378cc324dcad754654655458839adeadac2d665c23e042fa8048866fd53f1687c8878a0b0949ba0b7ae07704545bb26ec396bb79a4a220d63d12c5a80ae33ab9881a8c03f1d651bbd3990571069c2bb344d680fa1086aae16f40bdd9595115baecb253a014b7cecff4fb7a1f08d08d13a669714e061243a49d7ed9843f0d2a047ceb7b5ff072a3d055945f7ee99d68e87edbe6f5e3b97d884e19a3292a7bfa1eaf125d93f3ab53358bd03001075741da248a6c823800cb1507ad9548aa220871f9f394fcbca66f87fe5b665600a2aa413e117c53816cbed340a73a634c93d796f3db9bfaba185b4023729cde63e404c631fd911a4e71cb3b9f931cf97055da060346ed0e5a55a8e6a1d23e1a9fafd3c1969b3526fd9472b65b0d978bb3cc9247cec202b83c02caf3dfe6b49b127ab9dbd296e31a2d6937fc3953348a957ca2c4bcd97788cd9453f0642caac06ab9096d7c6d25544c54ad4581109e8683fa6e054409a5e09d7eb654a5008b2b170f450f0a8a7675d8db255ae8d21ff00daa5691fabf38501a467499392ed04b95c21f28f37b50ef61813274c6f44367a1211ef347768967c270114686f404a26595ea53ddbc4f3154db775ba203a35ddce30991c0dc239834800ee524fcb2b004ef29181fc9bbdc514e5658109cba331f64c905ed3c8151cefaefed89a5450502226dde30203150b55e41f2891bf297f71abfc823344d35204516d82b9a4611ebf42b2eb55c4a3f1f8fdcc371fdd6ece2995041094fc1a2a6f3262d8128305700c8e37225da60e7ee67894361dee1b260554d0915eba93ae189906630eb9e450f151950f8271ffba059d9eaef2bad78fed2f898df844e6e5e8cd81aa150da7c556d5f33b2dec1dae3eb3132706094b12c96d578acc62bad7c518fa359048f6d723607a2cc4e011617a041a27c1a31eb68157611241deb78d98c0998de532788f403b516cb11582db9fd6dc388b50f984fe35d0acbf7f860e4a0e88397e93d6f496aea2835a531925967281e1ccd78482264fcbe1ae0ccf62c14aecc1c133b80f0b0092f729627e46482030abec0166bae2ec7b37774e3992e7bcf0ae18dac4e6887b4b52840958469c28111c539648341b550838800d6da5a3acb987ea4fa584f665f51bd5114f2e79d14dbe695ed1f7b7d3996c321013a3dc6172d49f5b01ee3b07b7db83430c05c9640c199720aa0ba0ac565af521d2957c24411e9fc6812e41a9ba19f66537d3732975b343a67a78bc28688a320652826a3d4eeb5158cc4aee93265d963f78a15f68b116d7b6ea46f591f7844f883c728ef4c2c61fd88b4d2c0c2230cb9b75767569e7cab919a27e312d2ad1b66f386dd090c5347010653ce25dd618fd3fd95a9d734055539749285a462af8cd83ed7c185b7ebfadc60321f8cf6b9f94f44a55bfd0e4410bf7874a57221f81fe8c04a64e9b16ee3cc30c0355a8094df8827070c3c6fa164b0306ee100930f5b05124f45a99b54986cf29ebe330d7a991b1f5b2919eab5a7a816b1b6d4585da4a9bf66c249d8159f3b102e089b1fe3bc8497e2411a01e97ff3a61da561d47bb3632221995efa5a5ec333eea2f71a68b0311b6cc2c137c5444f68e32b3d89e1ddbde4f0093d647b6d71b8511bdb9f522abd242b4c841ec1ab07c9a2b6cbfb18aa167252b079c90121d32815e1cd116872954cde4ce709770ab962ecd691aa989f0944ea1da87a7432740d8d832012f42e35ffd6227e9a4de9d0af2219331ada3302e6f6af2e0b4d15c0d3288e89169dc43bb7a38b9f43ceceea18d2ed04be65ec9fd338f39eee1422360387427c8ebdcb02fed6e6ed887230723a8fc09b17c4524c93f1796fb5420e60391a6d5f0deca9285fe0a2ddfac0a4e58ea9427ac96dda75a3e0af04d35f20cbce626db4f692f50835416dd4fd42a2c08fcfd10825cb0bb78d670312dad41fd54dffa222db59154f29899687126090afa853fae7bf745c9eaaf5240e3e4942093232c91d4e97b0599719cb58dcb314ef72e63e7e18f24377972b705b70173df405bc40f8b2e72cb428826acebea2a62c79f70a5fa4bd66eedc7a868f12c66a1252ec88699ac000eb3843f35d2ac7aac327f6ecf1054e2d70e552c51d88ff6cf084542dd478aac36b50fef388c39ab960076664d69d2d0d9a3c54ba8b54faacfb24739fcddf1feab10ce3f9d5fb84586f82e5f074dec29db76be0d55d0970b0aebddb6cba3087fd68c6b364c9451cee6e34c61e406ca73474de97b40718da0e87aafc031e0f8b61df18edd2e722ed01d897b74cfdb953984f1ee9c52e059f1d229645f19dee82ce906de3a294374d293b261a1ad137500fa2a7479716424862ebea59b68e30167a3940458264d4e5db026a6ef67f7915211bf2318864716e86502197d07386af1b163a73c0edae2f8dcacf367e5cf12b6317aa5837acf569ee0bd690cde254c527d3b70f0c730582b7f0ef00f0fe31fb5c2219fc233450d3006b73c51d5f1cf106de4077b3b97d97e011244f1cd7ae1d62c7dbcdb9bf162273eb73b52d5e61ab5eb2513e550598d7aca81971508dd80a1d756a1d8991a7e09f2870e19c44a56c95ec83d36f0bd9ba642229381a655239e2c74f9c01409886189ed5cae8c66aad22e932c77020a2b8ad2bfde3f9128f256919e6a9cf607a9b46bb2cd1713823f5ac24f88b06e8967afe01e2057af9e16506f9e9c73265a098cff9e0a5e43e63de884c4fbe71c82759cd60802cfea01b7142f3a394d8c4acf70af78bb8b02d9cb05dbb92b26f43c7dd91a452bb12997fc2b373be633102124e9e30a88a43aa411372ff7c074dd01a8ef169d450554aa0e1cf1684d2b9a252f7e011a17b3d2903809e94763dac2171d6530d8f5d15280156fc38b164012a019b7727113bfb2e368006f6fbc5e88c705c3d2bde51f0d6138ad176ae97760d8091c9ed722d1c2e5c8a62a37720b185988926316bdf66c979f5d54cf6cda6c162836ed13ecf0eae0818282692ee65a15cd594ba9245f57697307e2804a701ea19d8cc8ef1a24121aba1ce0cb97f93643fda0f13fc360b61edc33294529415fc391a69531547522dc9cfdaa27564b952a3ff0bf9f420471ff016a91e8b25615c22c0dbda241ec026e4fac4a4312e45d13bccf1c93485071540b33822f8cb62ae79548a90a8a909a18fab126e774cd78469cc870e17d4e9c65211764e45f69847af5dfc031d76ad222c695a8dd230dcc0b066024528b05db796c9d9fcdd5780dc3735b69decf8093d3dadf36ecc8ac43aa22219eae177d17d9144d9bb394eaab0938430edb1adcc3755f173adb0bb3c46a199247bdccbf36ce40afc05d44c748966c1f16ee61864c4e7cc61b7393293695133b87464fd2229e184c77958e18cbb03578e9e04c8414a75a73417c0916837137a5c7134bbec191c5ab26211ae41ca0bed4ef7882e005c720a614be14829247ae576dea668cfdf16f5437ca8f3323ae2dbe9080aca206f8f7e7fc005d764b5ea0d9e3944843bc043dd01058950dc821abbb34be71d0fe8007bf610c8cf9960034b48fd99aebe81458a61b93d67bf3435f5543fc7a74d7a877b5aba848145b73926fdb80048d6867e85ebe43f7848c5a721325006e9578b87052429d39ce8200e3922e532d2f24451481632fa3317baf0b7d4292f63cc9f8191c8eb2082ff3ef4fa6ef18bedc04f8049671208089a88a531c027cba70b2af9b9df8b15d3f9788fd3288985e99f0c7e12550de3694fb327277ce8561391b271d5de660df07541316be609bb670d0f9d3b667316e5a5df18f170c74949feca6c8e3c189378e13d7c1d2dfe96e688cd701d220e1d0e4b40dd2822612faab0d75c3b7f2f20ddcbd1d27f76d492d890ca99400e2b50339eacf644282273c6466dc3761df6408fa382d6fb472849bdc39b7b3c91676b061e57f6ddf8a7b01d3e0224c69f2a6d0ef6e4fc29256626168f94887b422ec7e658f6514dfa4d5f2fe6191295892820ec345cb481881ab273635a538496fdf164ccec982cc3afeb6efd26ff7b626be6a7fa7e828ce5c27944cd617ed1065171f1e8cf2df2db3bff6ae1c05dd0918238b2a7bef8b3c4d9e51b4c2e4ce926c5b42e3b029528b77de5a41259b04dbcf791acca92898ebbdd70676e3540456ed7527a422b6036dee2389b2d77994b3b388be6e18db7862159b5a981fb1b7e44e2b7569cae11b5b80582c0919e6b41a2c172016b2505229bbb2f52460410ec5f946d43890f2c2dd9543ea4cd22c8c97a2f0e7cf5ecf4fc919e480218d4e3280548eee1b5c301f7c95ae6c85ec9145b27dd9bc9e049f97c995f9a3988e1e4b9dc9ca681916e45bbfe85f5abb4e5e07f3259b478d8d0951b199b805904bf980a5bfc4ed3aa6569d2ff61e5bf7e0daf9e303fe2fa3df55a60a8cea4f11ab29f91f9e422387f4ce0e5227b517408a4f44097dc91de8e3cbbd5ad657282499f5df93cd0db207e894d6b3e4ea379e34030fedfcc6b86581b2bf2cdfc739cffaa45a89b6ed43c36bef1cd793876319c63f8318e9bba921a254d3050e022a1cb77f918ac0a97ec1632908489e5242ba284bc811aa7197242cf7226fcdcfa213b8cead1d530b0a0bba88c48d6b147d88436f0560a9b02b7709e4d3f184f849bbe5d9d5cbd7d990a95655752e6494bb8bfdf3638e4c3f0d211f630f149943c81c26e7321bb4dcb7a121d746b3ef9ca5cc3f1e0922fde8e42a58bbfe5e7579c73e6441ec9553dc28fd01585da576f2e352f23a1fa42371589b9a36c7598062ed2a85302ac11aa18ac5e01ee28c605f1c26fc8dcf9d25a3137bcf1a938d22c5e3e773fa142872f286ffa572feee15abf84e47603f946d46bad2deb08981c46b517d14e7d351c498c4b5389cd855fd9e21d4b9fa97116222f8a9af40d2bdcc1dddf552418fc4765cebee81e49a4880003cbf3ca5009c6cfe72072a1295c9a4a13256144e6f0af204a3b3679269500698f418b7a7a2bef3a4d3f4376dfb2eb2bff6a841589caa9e58960bd5ed70f4f72feee61149a4fe5fdac178be9b2c736041d2f3c3a53e2ce4226afeb03ed4bcbb8dd53134d32ee51969e49ca7e24f2015ed6d40817d7c192b28c794e1cdc030ba7a4f02078d6afa8719e667da8b8cbd388d7096632a7ef8da3356d650e25ad95cbe046072be7ec512b16ce23fdd0cd333e782fe51f36d515b0bbecbe5c5ca3e0a209e535db092ce22fb2113bf22f7e96dc44c7f331f71ad1578a87b89bd39e72a6ac2e3b0a9cf9e20bdaa0440a075884eeb7521f1f7b1927042bcef2214cf5d26621a1953f25cbc72c0b2bdaba1ac373e26a6ec74c3568bd430a12e9910b32764d14efc2fd362b082ccdf44e96bc77ea53b87e9a2cb871da90c0040d7fa0ecd4e7e06942a930903b7a9d9a3e146ece5ebf3bf1f64566dd2579c802ec31a07d84a33e9ea2d7c783c781e49e27a7c44f57816f797a3ad2f3146a9caff44b7c7cfc2b69f0521d4d8e32ff4d7079e54f635b56cd6574519f7c2dffa85bb441a753a1dd0d1eeece4508043f32a1c34152a2e08bc056933e0ea0e88595a6baa8c3aa2c34927ab78f4099c1ce3eb2823080a66dad02bd4564a329caa8cf1165e533e8d1ce94846ab4c2bbe228cc1345575bb67946ef1a195a1f7f4ae5cf1c447b7a8869078ddc66f33dd6fbdb65547b1a468b99c5fffd7d72b609ffa91037d4f02a01287bd8d34abf3473655284f691fdc37e25c6bfc7e06329624f8f3ce4a5d7a50bb6981019747d2929b52ab56a28766506c3a59919f09fcc10b0f49fb325a69de089e8ce0f72a19e6261c0712fbd18adcdfa0f36541c8d107dda65d313e2c1572818ea6d35d3e0f6a601b042c7be69003c1f5ff216c2bfb932127f51975bcc735afa19782cf6afe47d0b7694c2bacc0ec9ca1466c281ac18b5ff9da5adff2c64e1940269458962ca4ff590019110c62c0f70c90ef7e7d6a182084d49d84b65ce648d11db2fdaae2aa73678f3c37eebda65b9ea551753c3f61ea30ab8a6df1cf25c2be4283c88f6881b64bdf5ca53b1ac74fbf4c3b163f888f486526c8a1896832116d5eb0c02b0650506bb82262d9c14b5bd74f55686e8dc9bf8b0e0028686f36bc4838e0ed67043fc731e23676b2fa59074e744673b29538d90a2bd90b742c584cb59abc582ca978a504243fe9ad0d19dc8c84b73ff1e9031d4a45fc5197e6c1481e4aeb08603f20714b47e6c3b141b461f9464fd515d25413b4241002b8e79838ea111605ec0c62b47014d20da8e0521ffd84b73c04965044ae8fbe27bf7506a581b7e558b95964f5da50abcf79301a9c0104967ca87d2137a150aec693d933164b04ff08ae6d4ebcf1c61b0f0c7a35626b8f959ee7d1ef74f62d87ea1e5b4613b0c00d1db29249921d3dc8d74905cbf9a5ed5ca8abd8e18413eff2984742682418b2b6a0af0e7dfdc67c5a2e181b03e715e692a5dbdc20ee625e96daf6d8c0d2eba3a3988c2a1187544c7a1d610205b62542df9a5f23d33a49411cb7136377a4915b7c0d312e2db82f75d0aa0c03faed3cc8ed911ff523f132612b38872cb42372a2e8088662fb17bfbf03e001660a15c1416191029c389a84876c63387ba0d5f6408f8f720da02c6df2bcc428735cb51e76e6a3f25f39bda77986420f98634486fc1aade079477f9fd5a26069721955ba2c22ced7854fe3030022ddf4ca24f8889f3167b5ec1699be315ebbadaa687efd2ebd1a9757a19300e3e83ad05a0b7866f17bc7daaf350133ce97ddda6472b64f43608f1b1d585506ec7f638990414c86baa1d4370acd3f6574f6cfdae85e881832b3364b1f9bb17de1906009b4eefc52c24a96b44406dcbbeb2298937e5579c0c45d160fa49330cd8bc237360e391030d11f163aa7075f9ffac440ef6e7f13afc1073750f667595eb2bef2fae64b118aaec85baf79f950786b84d0d5ff03dd4ef158a2f45b40b4981e2c993c834c87c722ec6dfd030338ad04094f2c7a0a5f031bf95ee51c46cae496b232e42e63f84ff533550a8d4e9da88efcc5de27bb22370991730980a022a8e3fbc7d92fb8ee8aef471ac05f020ad0d0043ad24e3fad5381c9ea4ad177454dcdad5f05ce74f0e0d7cdc405c046048d94cab7f037bd88bd4c49ca8f55f2b93c1c71034f53bf87b977705cc3fa421547a0f643202a5e3cdf32b81bbf563a08dc98eeba9f05c0397d95d6e9e1531fc466bd2fe74a6e4a5020fabee6c41a76b99409cd8cdd2da09194faa7734714059952b31daa564ca84ce76e043285eacf55ce36b581f1138614666e8c03dd841b1d744a69942c0ca0b99e543207ea0d6d63f1e84fa2c4ff9b4c5bb92c9f8bed8ad7324abbadb5f65c1eac75f06ddbcd776b65e743f63c3907c0dca2315239957950f57abafed75101037999e46d407016f691fb38854208f1f84ff24021cfc5110e26a30f8e7b67baf06d87b90e013f718bdfecd658bfb6817d1e71041635c57a9b2b8d62658a7ead6ef00915590782b1b2b681c6769989e1d6afe7223853dddb7f6e005a8ceadf02046ae5a1543881fdf37e83b0e7baca368b6c1c458f11555c4055c49f0a85d2e23b43e404097d837ed7a0bb3bb408c0ab25bcd81324587427684aa0dae7419e759ae3cee680bfd25be582ee10e46db5652b06e234fe0e84617fb45eb32c088de2a9b26bf1c0e4b4bda68de7d77fd0ef8f25b40351251dcb350bfbc4d1e0c1e552f01983cbd1d572cca0296d378e18b74f9b2d0312a26b92c996869bdd0b54efecf87edd1cbb7b53af5dbf47d8182f55cd16d9aa1e7ce22045a7bfaa7eb5a8f3d9484a428d86bda18f65b53e6325fc11331e20bf1ebb69bfd2c70dbb5de7a7394068e67ac53b82a2933e751a80be6733a6396a0cb968e7b5987cd89421a938084ae1b84d6de2b4a0e47265a3d6e9580250f11f57988a464bbe5189fe730143aa1e3a2a832d813ae1a989efa00eb0b7c759cda76962296dc96ccb86c1fbf9b165e6fba3e3ac22fcae0b097adbcf1b6ccbe9556a0ac04d4477cc7438a560986882c7ad8b3693cce24e327c6d1ac23160532612d1015affb39c03d307724be65148ebd749448988d40b456932268ffa79aa3b8b4218d746a2823c705cef63ec54017a0147d5375dba2b6d5930c7dd7ea0174e482615e02bf96f9dd49de551b15af39bb3ecb145537cf7d1d3cfc454c6bee188d2e6c11cb5a0ac4e8634 +0xa3cfce930b5e8de54554e9c31cb3e4b754b24e6cfeb6b89ada2ca51b907a057d3814d11980367109c1f55b35d7b187e3be90cbb90867bb59b78cf6c04eb2587f +81016 +0x5d146aa439e41599b3a48574dd33f12144f8f8541773e1c28c182791805e350d5e136e9c41f270f45d779a8b9bf2cc4f83db6d985f65b35b9d551ea076154636cd04d7a55a11da640788364c9a2b764d9585cc605a7b56bc9324a14dd1db6c627392aea6ca69da517b7f619f24077882429f1d9352de544f362cb780dbd72df91963fa86da21f8237f03236c7fae5b5551d1661b8db5357b4e166821da321463851fc32fd261bc42dcbc859bf447a7308cc2b1df54297fa7a289bc181713a608806f1188fa53af175a538e15cbfbe27ab91b05c7ee62bc3dfb2ebc4ddaa36d51d1fbed79991c5808c07047c04cf1969aa1836bbba58773a421ad6fa96b09f0a4426a5eeaf9e73f7ed8bab685bf524afa0ca3e9a3bfc12d44dcadde12116eb76a99646dc360daede268dae54d6b458701c2238a6785377185f4d60f7115fa4b0c9f9321ec171de99a3977dcfe99f3d4178aaa53f03f12c7cf30d20cafbfd433f01c9c824e66d9bb10133aa2819183b9a42de04e243579b78a5946ddb25725f780d82a98cf9436ecaabdcb3ebf9b1ebe10746e82ecae95ca1e37dd8864251420239ae36c58eb5b03d201d1bb9fffec6cc424fcf731f48d87f3923d17ac71ca35402b6f05d2b17188efa5f51e0804144a260831b6d94d8a7771320e9171826fbe4154776b232f9f046872de71e4f3bfe19fe7b6c6cd02b42001dff9ff9da12a438ddba3a735ad0efea73034bc1a1414b79888322ff65a320c0960a5681716234d8c889ac0ee73e5fe13a7a10592af3c5677b44efa3b9f2dc3f37ebcd4c7298363a62505be38c84d8c149ecb56340c5e46a533b22e8317cccb2501e34c9522720e43788baafaf66e3112df5ab6e873a30d8bcd05d3b80c38ae09b1c4d6694817d5cb4bd58b1c436f747530f72e962b3335904af0f2c1c498f40555077d2be49b40a6648a6985f879dea65a4ac4267d35461b711a918688152383b75446c33e25d73c8b534c1f5cb3f60b25fa8280b1d1c6960b2cbbef9fd7c5ea9d513b199ede23f68ad83dd1b946440d58b0708c0f313f68e0cd75e4530561a2d0a963164ceeab3a28c0438355595014bd139533de7a38f9b8a6c94deac880131802c6a08f7cf7712cb4671d7a15a3891accf95b68d73ab15b5ebe12ad47a9a53c056da0b1b090045f5bb0886ea2c4d23882a4edf36eccf8919e5c1be4ab64c006595ffff8b3fd59895e26aa79273b59dfde9fd2c8677636210eac50d71b39cc3ca6a4a3adadc6da7264d16ce5cc9185d687f1f02febc0d3d455b59acdc0b131a796457617c574eee116bab6f8bb4dbde726a2316f223337721c80df10c153570fcf495f80248efc9f1ce871fc19f76bd863bb7cd23356cac30a1309e647a8a63cf9b8452ef29c6e751d6383371117f672e542b89e46b1f58ec878fe987a3787f5bd9b126a5627ab28c134d6f2c836c67d5542cf1c85cd1e9dfdb7a86d81886003c3f9ad7c78b61b83b162517469db43c15ac0a8941631afb652d6edaf85239a2fb2dafeac81d1264d95f5db071a8fd5069dc62b4e21650ea26fdfb7a4ad919e3f3246ed429900344d14f65ef103d9e413c65b4091cff2a529fbd9ed962259d3fbed466285e7ccad4cd76cc17b4e41d8b17c88cfa7475fda129fcd77cb0b03a02d88e145be94bcf912865feced204f19a86754c0d6b234172702c23d8c91176f9bae207e36c7598067c8d7c68fa48c0fc030c7fb6738fac32ecdc02620dc1ea70e0509f532a929ab1345dd39a8ff7f22c07fe969a2003845f0a7d01cd113a0af4e35a793fd62b6e0dda6782d825cb1bb72fbc3f0ce3376073539f807e55f23f123e7ff3ede1988888f93b18863e1a8409c4d5c7934f83d70c42a42cda5e731d455c31bdf1cf7250cefb38f3394b6ee1b071dbced1d7813e86723b65759d451c0ab70025f002317d2c6af1a165d040bb27b12ec32cfdb83d7e4cc5b8d494d0c1def97bca4d2c5e644db2e5a1905f3856fc0d4f332934812a504cc3957bc7be854e7df5298da0718c9f8d95825d6aae6b99d0cd9d3b0e74abb8fcc589efc856fcb5cf1cb225f0f37c8e3581b201652b5f7db62a7ff70e1b27f4d73c1484f9429eb15742f29ab05cbab6552abf40e127b93427d649d195ed25a066a7b3ffed09d1cdc11869704125ad9467011870613bff49a061895f48533b581588e69506053c77770d953b35e6eba4e5954c3467c0982aba4cbcf497f5cf687e603b08f6dd352af382f45ff108eb645b57c8e1576e2a53d0086326074d587e0bce1fb011ea6274c11915532504335f22e92d2bd29d0c517c150a8808b27ce54813031f09c53ac16a5066b9348139f1e6a9c7684bc5d4a02903219f2ecd935abddf83ca20e624bd599966f691d895c9111a562b358119cc615336bffc07322ac7a4203609d5b6b50984949fdfa2ad413ccb27e912473232bf75b87ed2f7eff20fd156e7171c773504828e1970580706c43cdb268490b48f9dfb25504608133cf117a651fb12ecd9d513a1f7e661296631dfde67eee6171f77441bd8e7c0426815c78d0b08616e0ff5c88ecfc4668afc2024b021d3cfe08ee5f0fa8d1aa8f40fe8617976d1709143e11182e57cd0b244f9cbdee8b5b6973a64724fc1613abe90d385fa39e8d8ed12117f4cfd822825bd3905e9210722a1ce7d589a3a5dedf89781a59da8b0f2e7f711724b5c76e55be158933d6f6a9ca6979b14583c634b48805d30c257bc66f86f6b8aeca6cd80db4df2d46a38329d0c423826086c13db14e7d0c816db8d9dc4f78a39cf40e8931a4f7249edf011ac494aef0e393dd205e43a76cbe988871fa40bf7ff61df7a849f826174374b6a42f40e3a5d591640643d04d9ccd8f34b653c292f5c22c6d5edd1734ae3e48ebed973287463e6a9c16e95b3543b63b03cf6e3ebbad0a09b9d37669e9909645e72087d1657e2705ce79d74e280a7f833fe5d31a004ed59c232e9b560d665352f463848544f2974a4156950fee99324e2e1f0bc02a812ccdf298d54667d77e5658de18b6eb4d96213fd6ac084f97d6861aa69d9601ed16847038aba1c08c1d3b5cbbcacc23352c720e21a39f13ac741249a111064c3b9ba9e337a5cfe02c3be8481f222fb4526225f75e023e018113da0439f076d512c32494bc4b388f60dd456434a948664e3f2242b6524ce3bebbc69296c050621b97ddcbf0264595d00d3af722e67d01cecb51375019317f0b74be3ddf0cfbbcfd1ebcd0fabd5cb923d2af4b1162374c7d0f9b1e55e2549d0e47aa4b3d59dfab6160aaea0398e7c402358ca628a3df100012e63eec321f07723b7205d73164f6ef668d6233404c7f143cb9518f33db1502dd1ce03e93f984dd59feb3d61bf2674e374f80b13cf5af02f11e946f9a95232976234c728c4adbf8a8369d61a0f1c427dbd68ca614481f735ca4b6f05e73021de7e5cab1a67bd56a30030aa146c9d6215b0cce3951af96108431013909df79873848a22367f23adbf94b44bd98e265e5bed78e937a91db8171aebb732340520f6f361bef5918d2f50cf891de1ba5391a0c2113db1755b76d2b042dc532fe535c96967e3e0455645d70f03a2c597819694ed1a63ab165f27cbb199f58c0814517b44f1337ef12babe2d1d86ced9c4ce7a8bcf8fd8cf28545728d759535430efe7d24b2203a2b59abe4c65bfed23f221f4cb0316dcf906a5a67a25a2df77751b75f771f3c9a5a8cd05d4b22bb0c068d7801655836fb767ac10b9eac424afb78f692ba9ceb281511b3ccdeb14403790bbc575ad1db892b3323eee100549875f146a76dbfae6bd1a4b0b3ff8c0c410d1946ceff32de01152ffd8217eae7784d37220e1efc08ce16a271933c17865d492291c8d0ffb0ebdaddb85581c06d5307c713473ce68cc75a8750fb02d834b0a3d437e56e9cf6b1c2a8eed9dd2578c12c2d94e355e3acf023efe94bf262b9d3a39aa395269f11fb832dfb9f788e7c3b20e71152d887dbd10938a516794b684ecee26f68978a851192e97916f2600a399c6023265357bbe250fe1eeb05d6d27a9c47f5d04fc3e29c5847e1c0b94e8544e54544ce54b7af8cb1aca12a26a98aff8237c15cadef9d0469e5c03d5bae7fd591e2f0cb3b4c396891c0e6546a37f436273e7c7e307226e24e2f9edd58147c6438e5b1ad9569ebee77d7591a3f0690c6e1c861a585e002ae5ba1d8312cf4ed8930a9f1d5f1b52996ea5c73bc13aa031a48622b730cadd2d138d8f6d948e465bd1fcc5be4be9294ea5fdcc0da9676adb8c1982457335ff9f35c2185263a4757686cb93a4a7aa690515eb4caf62611032af3e706d2986afa7d4c380db88fb245239dfd2777b455be844d80ec9f40ed95d945bb2d75ba5356d77f78faf0a799a1772a049e1cda2471cbc2ddb0268580f85c3da112a1179d91aa6c60c77f10821ecb976c288a7a975cc05507b02c526f8d1c521550f51ece3d6ea98c1da458ffff997c9031410422c1ea5abb672135fde6a219a462d25e59ac8c9d574810ff57d679301d62e1155b63a26a454fa5bed07775fabab2d944d4819cde5ee135724e35e3686017eb0ca594910a51c41a4b7bc2108be4eb6a60a33f07e31f7392303790506c04cabf7895e73e915d7f0f6a54490a33af5716405a376631f579b7d7a86858d18815eee7a0ddf3b5c4dae599fe9ebb8876905d526e2d30418d5e06c71540653f4663e9c86adb68de24624d68df15bcf0d721b0256372ee9853ab0f9d029afdfbdc5f40993881f680e8afa7457a5077133d75bf17be9af9bcc4eb52a7f4ea8b9dc64273d8ae443534ae0d73ce64d182563626cac7e4180a157d99409670b1a69b70b8041540a4ad6fe1263342031b57405d9f73b4887c6838ca3f89e6ea72d77b884a61cd7425b7990e64766ee9807e57f05a3a4c003accad57387f07d6c086c469643d6fdd39ec569252bda39cc35003aae19f1cdfc57fd9913e9077da0d4d0c808fc78ad073c41f197b697e713684d9e9c012a59bcf2a43f49c7eb548cb829a8a37b08cf245d76900391a5e1b6c855149602554b89a34731dec9a5ec78dd014d2f68914a7328eaaf32640c10fc7c9f0266c47c8bac926fd69a963b2bac6adf1f746a18083cc627b4edd6d45b2fadb3d1d2f0a6006de9a39644d7b8fb6f884c86392aa7f0c75fb509fa8f06a995821aeaa32edc9413cd6cd9a63321430b5fcfea485045ea5b1a1a142138aae478245bb3a025252ee8685107865380ebc616f0b36783fbde411fe03f2c79c6f31ebafe96937e89b632e2da88addedcdae9d637495f6bd0b4c2978ef1e1f964bed06d8cfa42e010153a638fc5e37d3efabbc62d15f7b1cc5424aaad910a618b2dd5658c4777f4c3314812f924efd8ad32860f597df9fdf7a7af7fc4896d58442877c986e4f862a9f3a3179f0e9b96316a90d843ea2bf65a93ad3f5b40d3879697fcc1023b8dd1ca43959b09ecad60d28a234a74c55745fc016411fb1e03958962ad7789b300e92f0a64c6c024eedd997b858d73744392e5da1d1e2a8bc72b2571d210a2b41853df2e59bf4b2026b68d23fec8c861b8841e04208d73efe5f173acb3b7d6a69cb7e299bcaf32461d92b76bd823fcf27dc3ae69b5875bb2268e7afc9792acf255bc4131d5bdfe009a1a1d3b59c796915cf89df024346c3c52ab4247c8c9acfe0b0b03e0eb1236b567f6c97ccbdc1ea51bcbf480b4bb2df631efd4778c855e33854c308d48d562cc4acdc31474891d9683e3ba03af4526468a0337722cee4bf98d26d120322f0baf0c4711ed9df71acb5ce9f7605bf9e095278e7322ef2bfab9e941ed80f248b8c5750dbdee8d4e9dae6e84b37f0100e24cce39916d1f65f3d962468c97d047f1764cc7cffe8eb52ea6805df748e881b4d148ac983d02c3bfc3c0ddb64c13543e2a5b1d4d07e654561b5c1bcaa35aa5df8e5d8e9079e26ee5ddcbad74870599284968b541f0de549c75c86735789d94eae9d4888209058ded914b5fcd30ec3b363b3c3ab2a1bedd891d8de93faffa755d4c774175d5b4496046079aca301165f1699f52a901ce16a4797348f030b970c11e0c6271c436cac563c807726dbc3ddf3958a52dfa562875f2412d50e322af9dc75c927ec0d537a452564ecdd035eb8a1431dc46739d3b84f1c13f68b07d5779af2f7aa5b1d7b8867a7916e341c3987a63f09ffc55ec755adcb9273f801193dd3e4dc1ed7d8577f143f907bda9af6c358c5e9558868b017e1cf28cdd39278952dc7d105f0d279970159dca62ee428e45f9436761efc205781a34174bc507615ff1880f0149054988582e07dafac127321067bd2078d9aad13d4670900af9448de53765dd1966adc37475652eb3775e823b913d9b0a171710ecf23eb4f2455a632050bbfb6694eda8d2378d6503ab5cbfe18b92dc8bc575bd91fe29c06432ca690a9bb86116d532bfd83f2787d1a44870691b62ebe52beb609333dbbb4709bd270be205191372a491ef54da9d04ab4b1e3d0a56cefe91a2825a59f9ad85135a268ceb492b43b36aa57f3d4ead86088d50c41f158fc03fc1aa4e382e9f0595caedf37f2d9d90dfad83f1c32cc23e03358e66244836117c7161d7971f97afda3404aa665979e14094b4abae1ce114e46c618bdf96c9db92da2e5d4077a06b29c1f4176874c71d1c48bf17c6c514f0f2594f9b1aa85205c7239948f9dcbf21c99844a44d268d2ebcf02c9cd2d062ba7625e2fe9b25d87764752a008bf7feb903e37cb8dc19d5fb68b584a19ce4d45ab8f7a21d2bb66419b0f76aedbe6f641b1fc725badef2a66c67bf4e90eaaa70b900f8165e9103fdd3f5d2e07759ecf930656ec6141c5c0969033512d085ca40bd964fc62a97b3ab8d792d15072618c6de1c00e72d5bfd04da823f59c935eb4c4fc1263aea036e762f86318f03eb98d20e8ea4106d667da2a72d07a9e3c1b59a58cba2fb049ede67a16205d8d5711726a90183ca3c0485e8b94cb28d86f3d235befaed90e230a985cb55d378e3803bc895bec59c02fcbde0f6276b8a1a91e7226b972f81ea8177d995a9c0f597e0acc2bc0d910f2717cc914705582a07649f6a45e98f578658f169e8a4f6d95858131c04350faa131d5b039430a1f4b5349f16363a36991d7ebe3faa909dab8db118dc578069f52fd6113fc6ee6f708dc9922e25d04ccf16bc8763c5b3dcf4a0b3620c9c34c478e109974cc388ea27f5ea1eb8f9f5f881dbd8f4db1f56dc3bf8269ab3bb9a4bbc92809432754639a05661ebbe9cee6238d39aacb1a2c0c508fdd267da9bfa2348ab01b1fac36f856319f4a247f506b37b66cc58ed353bbee4177f7288269c77a4925596ab944df5f9a46ceb5cec8413d3fc349f95bf0def55aef463c543c76d59b144ea4dd226b2e961906d0469afa9c7fd9c2ab32a7f81e52afae199dac52dee6f9555e96443e3bbb62ad14754d19edfd1caa14e5dd99c1cf359940dd4dce0eb3312818532ecb1f80d00be2d953019a3e186aa6f4063678171d925281755aed96781132c24684427cddcddbf1514439c939af01dbb650b9c0d413cf38c78be3e72abb6e32201c3d05e84d604bac7445150cc1960b626b0f52d5b80741b8c39a5bc5810b414fd567c28c050046d90434a81e6ce4019ef7c153bed9ab5addb4693ad4fc9a6e2a527b1935af4c817b668108caeb6c6cc089a839dc031be28ab0e92ad5a8ac174415bfa071869579e82dd2adbed7af9b7b930c7bd9cee957645b929243ffb0eb2191ddcecc457baec3cc720d46ac1e2c34a676a014979447df16ee17ac7c394857493e1aa2468f7e72c517be1ef3487d60266f3d38e79d327f6554017ba8a5cd39ce590a90142187999a0c269427bf2d92a56ea9a3497485a9e97d063e0fa6c86d73c7151228d2489cddf7dd42c3d2bb50a5ed7bd047aad002f5c19c701b9ce846ec00d0b51f224fe0e34358975223850eaa743a6c3ca0900f2cba2a9e46f8ab7a998eb3d54181fc2a5c770f2e5d423941258b6bc3c3165422f0df37252c5a605cfed9451f4a91dbcdac1b97644f8f468c99ab6673655c8ae2e49948b13622c582ae68eadf94a27d4f44a957d5939b1b35995cd0f78de3a2c36a80e5aeff0239700ac63bb2ba543f23d898e6fed3c645f0870821ccb75c4a49052e749ae1494aa9a669ae152627cfefba72bb5c8ac14531f545df6f7c26cfe856eaabf17788678403dbc893529d7e077ccf4b5b22fca77e568e706c46c3c225b25dc24f3c401eb3959501a9da05e81f91e72d8736d8db3a4d5a7b2fa1c3cf85a9e07df0aa00eeacfe1defc527218c7c8c82c86d21065efa2c2266360797369cc02b25a24b2b35e48fdef961c450d9b2ef0ab2899bd5a132958ea82bf2ce95bf77866fc09a5fa2dedd70a52c3c246e671bf75248e1e75077fbe7d75dfdca6b72529aa2d801feb400694b7970e90ca8eda5c14e47adbbdb3ec1d67a68832b3669c3c065553c88d7fdb5f7ecec657a17db1ef10ce249c3b00ba9d2e7b82d5174fa4da02dc484ae8d2b35ee85db3c1d4993ea2ef4c5608f5d42f655c5e946fda59872b272b284a0422d8b97cad9d746accc89b3bc5d6c7f519959e78b688a5056e8b56fca8ba73ea559099c2264c186bfc99027ba16d8243b5326f0beb24219e75fa840abcc86aa155242643308856e013f7003847e3e1e5924f019c65318bb0551adcd7cf18da3108dc87863418d6d0f82bbdf921008be596337cb38b768a40f83487ed4a7469a358ffe51498c53f43937d6046968c294aab2807d9c7bdc758458facd493a2bffe2cd76773c6573941cc3411a70e4e621db874ca9480cceaff24757412146a854a6baa362d24966ed38b9afaa5f10fdf65a460ee6f1f6c9a3e7d2c07313496638fffc179ca1c498300b8f540c7a897472a59349bef0a657f1c38fd8cb95aec00d6cf6459d0153a23d13b8e0e9699ae4375be38f89eaa7f42a13e302b30f0360526c3dafec9772ff44cfcad8a992d1c7b4dbbb42e0367828bd5750d0e205d3a1988c36d8f3ca9f19e7be49adc58cca896ba38ef64a6aa3501c1c6dc5a1009c1e503b76334b21548ca66d99c2d5bdf1c3dc41d32c310d9614d6c19e43a895c92119f870517b222fb2014c4fca52bcc3e177452c573c85ece17de576ed412be7744641c9b5dc438d4478d8e036b4ffdd7cdd1c0f09b569f44062066c250339736265b5c6d3170bf99e8d91df6a84fd8ae06e34dfb6443068bc2393028d7744f98608b30c2b93f1f13aa015b2083b4c78d6bb3e22df516f96af4319ce8915e4e659afd80e41db8c10a360c2fc82504313aa34868cf7757e2ab44119149a578fc657bb7351986640b4633028035b5ca7e7e57abc529118f281459e0f9943b4ac25facc335aa1cc9668e4aeb38b05c8b15212fe2e383ec45336edca6bb127d5d061dd5296adf06713bab23d03e8142d160ebd2f7a8252f016b80746bbf08913831659defbbff6de4f06665b87af08e23c6a4e9f1fe56034b3814ca38edc19f64ac00ac1f0f5478a8ef85b8acd445690aaf131bd9cc6090ac02f085142d84d067deb6abc0502450479ed0c6b334c7fa0d830111b6fa89fdab31dd4e0867984bcb2e4e42db65b81c49671134d582bf6ab4ab3673906f1a73d12da3cd1b834639170692187736580534b10ead1aa675e0878d7ae870155a19a45e0aa95569d6c2d4cd48d69cab4b3392e390d78b8831850f9295185dd39318ae2dda8bbe01900d89ea392352acdbcdea675f5a2f113b80d3224eac5f910b977700da1a5f34bb43bec72da8a2214efbc5a443df0f27dafa5ba66e4c7e370cbf8540d3ff3fe8a18bfccbec0d93f2ede7aa02040e31b3581b3084be9fc3aedcb762568ee16606880ec95e3df92e0700b621e9698e9f9efb0ad926034e35dcc3a896a8d069dd77b9f4b0e8e9147a48cf93b2c13c0861ce0cf0def20800dcaa0bbaa7a0643fab217c6436d1b9077f9ea1a4e6f243237d2dd2f4c852945ec100fa141fa5110ad8ee1986e582727a45efc01144e44788fda2973f1ead6e10ebc7dadf861e9e726dc5d7834461df14d525720355000fdee814a1f8686b5fbd62e5f1426275d421718dff83dbd7c77e362600a29fac65ce476d3a482ff32f0d2f4488663d117bbcec30d9ad334df16070dcb215ac510f002194a857f9afa6aa59cae6739e5a5beee795ad2ad32926608c2dcf850458d61b7e71334c51068b39e86155900eb83b5c68a4c32243d42e299103a1192d2782c867ec2550bc60a865e5f01be51493e4b17a4562bc0cb7d16187456efab128dbaee2edc48ac425c3d3575f819b38531f932260d420b539d7b176db7f4f18c2a876fa5c5a23f0bea52e4696cfda0260b2ab6add5f77c6c107c067ac1c41e85cb3c7b4212d42c891161cbb7c4dc9fb2365a059a44ce9c8b92a3761a28cf8ab60c24a1a248510d507de45bcfb4391aa02021af79ee39d428808bd6da4199be8359ea6334eacb59e89c45354faf85997664fc34db16bbcbc9669fb929b095228430f840785e958ac7d91eb8862b54a4bb8164062c62e6dbe4b1598d86da547f2f2dd8c9fb28321854c0db76219c28c4d5e1d3c3fc672d9d10fd33d4703359fceaacf6502bec339b35f005fe908674625c22d5dea9780277c4a6d92e845018544d3aeb8388ff1c8be1d328b2517eca15c4a0d4b6d23a0804864a93ec21b501fddd5422c4a0f55f52ced6be21f2f98c4796087afd050190cbcc550eadd6e6c952018536a3f2436e98739720cde36b4d7046b6131190835f260d52a3d42249b109605a9191fb8decc566810b26a16880486d3647852323a5bbcfdfee0f82726b8c5020be2f3b293c522e20d7cccb55c7186ff582d82b6716e59a3967a075d55b43778436dc2fa9efc720e31110bfd78468c5905f7b27c2254be31b8b478b06f2d74d017619478479ace56431a2fd423ac2048327fe96b9534730d2d365207be4a027050677114d5c7be210d3e4124a7cbcb34a96d2f6d113701a1bca79d4988346bc2b62662b692aacbd8552648d44aca148530688c69e085ef532fb062601612372c10476e46c46c7ce1e4794ccc55d184a4901809484845c58d4df8a833b00dec1828719eacb4345aa582e056f4100aa1f79126adf092a00cb6dd2877aa9d4d14edc44df9d0aa2bec8cf6036c34c29bf6e7fa3a814a05bd4b35a8e7d7ad27f93613ad82879aed79baff0a899974b4ac08dd95fb8b3eebc50a7476ded1249439dbf2abb950f3c7454c64841be29c2f66613f2812d5b58adfd1da0eb46cf72d378af2859a5dc17eb72b242d60519479f088767c2667952c3429cf3a12b10f3a18cb7b05ccb5ee5bf9dea8cd01ed44da7305eb59e047c817eb99bbc0a0a652030726f5f1f86060a630ed572ca5be949c17610586e87f34932daa07690555a9cf2a24c812c56701a787e19811f5cd6d0603232bcde517c3ea22e219fdeac6fce8a94c5c30dcd1b7a62440d5469821b55f60d3c7f480155c62f1cc5a44f6003494ad271913e4a66cea2f95759137c256f055f940c46083e645c3ed3206d20b371c5e3b688286ee07bcd165e0bb7ab936010b1efe052d684bd9bfcf0a0a25efefc8e313af466ab27064313a7d8c080d3fd9aac9697f91cd72670ef9481998b443df6534572737fa8f2a799bb6cb8ac657c25983e9f932b94336d7f356fbd3631aab0b28c9ed96cc4c55ce11f242a7ed680240d3e63db834a69043469a787d045e72fe766c602e328f2f5a239ab7088959e28841c811cc4783bb7a797e573e9df67d65a6a748a83340fe455914f355a212aa5955f73e16f8c200a3146862c038ca146940e46cabd7470bb73bc9be35417ba2da98db8c3d514ba7e69fc25fa8dcc27e32cd8a95e0278c9ed75221df506c7c123491dcc2ea5a06f86ca3f317a192c605e7d5018bee2af7ffcd2585204f2efd418ec963aac41adc3b5da863525161beefb0deb0167fe97175c23c5b47da8ce67811c6d60a7499b3b7e1347ad860519285b67201fe386ae049de200c1d98901fffe5129faba1df75b51ed1a070776a2a0f21185b0ac3b72ec44858016a3241901e31352455f4f5087d3f063de43eb56ed519592604c8d8412b296ca1f64fa7221d1db5cfcf14e256576a5bb9fa5c39471ec5bbcbb2eed303c9a8e5538898cbbb43d31c07e3abae458bc8597c7b7afe9b344dc8b0dcdeb25ae5ee4a81eab5b444d978f133575e62bf608087ee2e3f0d545dda083e4c407d30c6222392e24d6aa62737bdbdf4d704ab1fba6e78dd546d58e29402ddc9bb3a6cb56df9ee3908f6c77536070c82be9ff011a094804e6026910ba23ef61af7f3f6faf752fdb7905f910b9d5788c9ba38787b5783704a0c41e51f2c44ef089dafb6dde7b926238aadeb309535999074d92aa80ac3ae9900c53e685c9d325b557794a665b3d446a1e9bc2e462aa7a19489eedfdfdaa403e3ba832c58d025dbc652789c9bca6ce97b1aee4bd7bd1ac2c151ac67fe52b8505d299cb44865324f99484a08af8557d2c04868d070775abca3374c8990b354471819704855e4c0817561f232c96cfdca197b12053bdfcf57e346b78dbd83dfb2b992e92fa7d6363703a658621208c6982ebcd4315d7de25a2983d3bbac4cc157eb9ceeb365c3fe3aeb1e64e0b1e01b06a612969d01d9f98f1cf8895a869561fe5440681ab7317f52d4d1fff3cf7d62da298640924d7c7ebc65acc2b472e729719c853dadc6aa214666c80fe5946505dd611fba5669edd7aaaca7640f99c980776c7456b4bab54ce04a0a7dfc27226ad7f3e5ec317eb46e2198f258b423c3ced76c139b77bbdb68e6289f3281b13cfb908ae0bf6db45aa9e9d19487eb375d7c5a436cf43defa2dd21a79015bb59391ecfcc1919513266f2c90095d8fcfd20f0c899874a508195145970e40df448a33d5e6197e4242160b08acdfe322e9e9393e9186a83f6973973562ba30472a501bf03f262062fa8d04af4dfd67fca423fcd84661f89785a1863df7fd6e17f99dc0c87278369baf03f2acfdf25a61810aa07632bae421ef1b94dbe14848c614cbb8cb1a701f30c2135b7e374f38f60315ea74c101d982f84a497b993b5ec60e526a74b1be48e6f623859f8474922eacde31708bc7672f53d62ab99a471ebc68da5c51b2a352129dbd278d5ff2e47fd0bbfbd5fd9c1b7b6427aef25eec170d96bc14eeb7dfb9383b58a7c4345abe6e3137c03180c0451bbbb74cd271aac64e3a801aa81bb3ecec518e8ce0ac1c7e7e20ea150fdff49274cd1d9ac65cf3bad2a6bee41a58d06b9372b75d4f21a8a324324b70bd45a9721b0ab2ff3a9b67534f7dd0e7b219b5c3c2117b8f7c3f9fcaf4e7c459e66c4f7273173010cb97762e19125ecc1bc8c473fca033a9f440526474a3fd3707be66f21154ed45e5db90a9d426d0d793d09d0aa7b1881353ee70fe08194eae9db680af7a56632515f24764e50dafb0d6db9fe657c7e171f7946bf6339a411714df1cd9229e3a24d8661addd04963de31445d959155c84c7bdcb3fb9bb96d0709a29c2d8e9edadba9918b733a6c95b65fa54696c8eda4e93d21e96c84f93af4e8abaf0b22caad90061f09d367e9addf9e68fb7872e22ffed7fe6cc7a3cc33773e5495f083c45b187a69266d0d3324c09a19dca933e591e3c8dcbeab6cc4def48738118c35fe4bab82fa61ae8efb930fcf428aa7606aa34e8c577f763455a5f33fc0722c9deb07ef9c6d3c26618560f3aa4d5601ace3bc859ec8ffb6bf011109d4786850401d084b331c164319731732b7c4ef365de3462f6cdbeffb5159b89ef1da44a5b0f6c544f39190b33b473e337433b6b417dbe8b292faa0929fc1f528f460978b552ae7733a683bc53b644e8c6c043d195f501c95ad9fb24afecc6f4e78a5e17fc10bc74c940a68179e7cb0940bc0f2c498c24a7ef945a552f2fb8f65db14b301792bed378cf2b618d8d31ce0dff4784448b4faa51286fa6910b1ce05b8277c9ee20dd1da71ab96578f19dbf955192e1703aac5ce85de11ebdc91a3b48c68bed690140d9c0eaf993205b3865407a984cb4e060441cfb58c59cb0dc8e8c452ea1707f118f2a0793f56e122a47774102ccf8c696ea56c97ea4140a87618fc709efebe075c74d392e934a609aeda070786a243574d7fc90f8c20e1d463db814c4dec26d960a914872739d8bb0e025cda12d217322927818712873333fa871f30676dd6e9cdf5efb099f4ddc96a76c21261dd5c8c9a330298fdc29929a2c222e77c0242bafcf1c1b981f449b71cadf33ae42297e91938e8bfae81a828051 +0xd1089feae2a08019d9b7b121bc3fdb2e64d90647735608bf4e34be89f453d1fefa35e9144cd3a4f389d3b911b330af775ced000746dd0b526a1ffef1648e88bd +81808 +0xe5a4fde05da8f5310909de90db06ce4f2ea08da7a6f49aaa5ec76f7a426306b9b9a29c408848b514f3956095241bbcf9d1cebbf91a5a26cab0b9e24f3c04718dff89bb5fb51f0f6bc0b665548232e6320b7aae3ff4cbd0d28a539a9230fb1be3fe84e3a5aed50a1eb9937434bdf352e022ccecdffdf19fab34bd21a9e4ef0da4ffb89b7a3a13ae152655159d9c050aec5fedff43fd719b3bf620fffe20894db64a506b46208104394f23d0f7e911163f0a056fd1bcf6cc6b18a4baf7ae71e5032772db7129c613707b262eab6abe7cc06b3bc2f301263b24e170dcfe554edc72de4774631d8ae4a3f386b61fe8b54656c9b8821095a9ef4c9baded7adcc83beab6f6bd85c4777dbb006af1bc2a9d7ceb6ea4368f4128f0cc8c8273d30c880955f8a73f3de533e89ee8fa65eafa1f2466a02667dacb4b478dfc18f870ad364e9aed8480f44a662d36f3609c121ee348aea8669c58fbb9fb76359603bb877a13a1dab20a13b9b952696bc11e9a5f90efadce8d5d719b1b146e7e251d1b61fa5f520a5c6500fbd36121964871ec85ce224a59c3338d71189b5f1eedccf804613a95c4a81725d85e6145be1a1f6e5847e86d932fa414475997305e159bbb3955ac524fbeaae917ff5bbd2962b08aa0a049fec2fa3a6ee38510c986c60fcac67ebe71f4c7a6b3826056711f46aaa724844de62f4b7d040d450e12de27b28e738677dafbeb91eddf295a49eaee972cad99fd0b224bf43c8f419af3ad610b6f0a12e075ac51f5fef702702dd183fe8303876056e222277f3020bb543d9ba2d651cdff2b4e22594e92919e051b2d6813eef77eafb9f79e36b78b7a1dd4fe0029125cdee22b8546457881eeb911135c44369160ffedf2e2c7ed29dd36bbb2acd1136a858389a3434b70786831fb5e627ea2fc0d2cc73d7a9c9aa3ef873ade2e371d9dfaf7b1a4d8c8431e135521350229fbe18d208ffdee1b86a0b5f898aa0fc2f79d4724ebaf8d24b91df70ecac1c5ad09e7e9c18d5dc7ae78c939721f3fd6d96b1374f47fecebc79a1a1c423f2a327394b728f909838cbc39c682db15c50be63fa7874eb4847919aec08bdac997d2e164f852af4a97c5ad923e981dc36337503c008a19d39fbf83bdb44bbfae302b60405370cb99c2fae848d9841e7142e17f2ac7843f2464466b8ea164d7361fc759f27089343e2bb4d726404dc8678a91dbd1a37ea7effc953aea2ddf0cab892e3240f6a5d481fc7ae1f31bfb01ec62cfccf83d7f397c8f35599900c3455399e655f38ecc92a95ad56e761197b349f224ba693c8fdd1244ac2e63c3186a78747928d3df0756006f4ce678cb27c5c763170dea49b67bfb438423101ee66260456f15a7925d08cc6367b2c1f1b61facdd312d440cfdfb7db5449f67b8361753324e82394ed791565eae38192a49a94087f8823f2c6b45e1c2750a313a0f709b63a0d94fbc7cd7e687aae1481eea4bcd8af675a25209426f919ecb364b7a557f01ec81b28354c3c406e2151576a0ed990eb36c3725ded86e4b474c3e947eae4634bbe22a4c673d3704de3d4ada7477ed3ab6d0c44ef2f02817f9f411bd2363392394647ebfbe2e88a927bfadf16cd11136870a12744d73e31e3a2b766d715da0f7ff6f7883607c001c4405076493e34d2bae80e940f847e8879559374c7182c3d7846bde415511e586bd751fdaee96e941b39c105afa567f7b8fe61a032abbe9ecacc079a0a6d37f0e1b79bffc87d02c9f1fc551695b86ef22b23be83aa4f15b5efed611495aac18dde578ad72657a606e7a62721523c182a385be6898e80a625403166ee37983f61aa3dab2e3907dcbd54add3c085bee7e2790d864c6fdf044f641e657170c3f62eede0696f811bfb5fd199d77e70bf52cd55cf1a26ceb89496d42af958d19caa4811c662158ef2a680d6e0aeb5d39bed4d67072ec31bbbfbbe18edaf1ecab0b04fae8611bab32a52b2ed28c5f10ef30be5154c108bd7478e079abcd30ddc7eaca81c75f4b9be3174588cc8b9da83435316f9148beb91e9e025e23f21d07774f3d4043c87ace086aff42e46f6bce11b47758ae6ed8cdc21867b87eb07f13c222a65ce30570ecac85a185a2a0922a8c96d633339a1ca067ce57ae426e1da8b14b4d002f7cf59ed45073788f87da63b0c19728a93654db15a81c68f996c06f4ab37a52b096d18c8ab3bc44328a0a21821e016197a94625d48efd0f2a8f300f9740757aedbbcb5dd596c6101312ec0e0c955e03855bbb27ad6841cb5ec13531a0db85a16f54adb9bee1d705bb8846d0550ff439fbb47a89a71e31c31c94977d6c6df4efbcc73d4a4b7c384bb152e10f65720d29821c4df2cb981520ec701d9a03dc088b5e7e44b5864f31097dda857445a8effba1fbfa0a20bf350956bd91316d120a9edddf89a577430967a886f9a6fc97e2d8e1b94a7aae79d8a7e3e3b9e9b2f5414fbf54d6c0253e0a8eb9c0074e922930e8c9be05ea7daf47221a4a5d6bdb6ff7c78e44f1ae98297aa638ef751410441f52e172f301964acba1845a475ff067722dd117a318d8eda2d6ae7a0c9f7dd2f93fb13edb680030aa4ca77c3e6bf7c4fcaa1134b4a6ee70ca47a2cb9498e1ba04d6c28887c7c34b2c4c0d16093afa70db66d505ecffe19c3a219c49d5a644e489409bb9bdc5e8819bc93e92717200525788a5f113ccb958398b245c9772af38cfa4c43a460a75bc3deac1563ebc1252ba390960f0b47e8b10adc36ca1a4299e202bc672ea3f75e35cd81dcc38bf37584aa08aba4c60391f08b000e1bce3bbfec2fc28c8700cedde3ebbdd5a2624774c51e6af68ef77f2fb67bc6424b0d76c40fe4172a6a218e7952bba866ad292da16153201d0a1a2af0775f8769b4529444c1c1f2d73460c6af06dfda26302b2699fdfad075b2a897a2b7c8dbeaf42814b0a64c0e096258f7fd74badb8ad7f2c2bcdf67e497151d35a4fc2a3c4c871868a631e4c1379074a2d320cf251b011a72989a4cf4f7bdf29585b9060114f98e1083d91ea4e83b4e47ce9f9f3f4d37fcb69bc2fc5a2df9d327a372eef2caa803acd8206c31a1cf30674e45ad929819341f54ce08ac9075097cacce4769d43f137e218c5fffeac8d581e0b77cb791f13b1d523ff464c59c3ff5000fa1eed81b3834ee916c5839b4b81814797f26a16c8c20f27d420b43fbd1313bcb70ea3cb8dc419db413d2f52f32aa57e037686ce7a1dad42a6418720057b1be9656f478b48a34cd88d918d374dfa9399047e55aff16ab65bbfd1506464de706d4a686128acc7eec744e622b3239a5281e0325e22f450335965f79472a2e41b32ae227a0a81d9078fac67782f3bb1ea1cdfbb298d4d772b26e1dbddb48736231edbc419998f80a01a0d3916115ee864544b413e59c288a6a97ba6b291da7c901b1877c73d9e65bf4fb18784c254e7c7106aeb26ef1c2badca7a809c71655d6a10ac630b5e752f6f16df774babe5551b3886e268b522074671289022bcee82bae4e0af6d64dd87b557de31f233d9db69b3e54e8c159ec57c86cbffccdb3e938881fc8475b79e159bfaf7de01c1f720b86bcf561a76560c54f1acf422341d37dace4809acbf808028e872a600bf08cd10478e229b401485d89a1398ad305316bab30b6799e44b71640797b07894d489792f69db97da9ed80f6a4713f437a7d92f188fc5c58fc68f5840ad25f1a823fdfc0ba7a994aebcac0147928c7fb2e22841e51a4cb626ba830b7cfe2cf163bdd0a0c391b31c2338a9b71a3a2bd707ccaaf902f523f613eff485a1d0ee022d6aab6e406f22b6a1d97838cc881a83a02d085e5868740dbc2d8bcf986c93ab6ef1366c68891deb9066c18c43c47e0be3cdea79cdba64818b3cf0f04a1a42758e1b18a42426cd4159a82bbc693682f83a74f6504a351ddce6e3caf09e2223e6f5b0fa1e5d8f5a4262675fcf25264bd10ce9d7eeb81fc7a537ebc1d87bcb5f880b7883e1f90deb76146a05cd5edb041ec1f53358fdc18965e51d7eafcb5e1ee3393a5cf5e2e6a864d77bc4bffe9ed368c160b39803638ca3583fa97d7523877de5c02c62fe62ba94146044acecb7e03573f2feb4b04df8e7f819ea4b6162c3e079d09c3037cb498e31e22e9c106e54104172bdb7eec6f4ba2d75e7207763f9945b33546873677cdb98c92a97520a577e92aa97a6a417a8a25f194b049f6d521ff5b1fb129c807c02afdddfa69ad51009cf60358bba893d29f6cebcffc1caf60bad113934995c718be0e6f6d0d015a8385e5d3e6d1762dbd75a5ce21ac5c00ce0ed1db8d8524382ff92ab161edc134793a8695b55a5eaa933f38b675c9398bd241c9b1d05af7fd7e42cf5e896a61713a3154b344a4b6bd0c52a23f0ce139a3061a15413c4985799c5188c1443176937ef0ecd7054f12b781565eb28762e0d8e1ee610401cf512f027bd38412a1550d900f9b5b77b7f73c7ac0dacb45eca3bfee452964c15aef9039483c117558916225c3fccb3c8de8be8118b2e3f8ed06aa93a4db0e0b7ab54fb93d2ee40cb5c01398d49da0a42f4bb01cc45396f0c29e3b6a83f24a40bd56bffad12886194745a461b7ea764f2aa4b3b66a595ece2bbee4eb690bb3f1812853868ab5725b9bb68738c45fa6adee982bd6612095f1870d299eda93d5ae64bebce4f062331411875e66a089dc31097aab054f45f70b42fd9bed4f0729c7e69e6e8e789b4303472c7c73c2e5618909d093bb9b25dc6c0df49e6f4ce22aee752bcaeba9dd2c89ab3a73f8b1fee1164e4e7871bb6cc0a436a6b38d3ac143729f0b5494fab44a17cc25d76de422d5596538ebb056773e346b787ddfbf011e04d291be12e19d364e1873193bd01da8d2ed14500fc2d1cfad0aee5fcf404e1515ae7349de05047b9d2ea6bbeb0c3bf603248537e8a708df6e937ccbe444e4c3158114aa6ecb9684756d3522140f1a277ac9f015c36988f81993a864b75381a28508fa324dabbfdb7752a2fe1f4f14c79a3be97c3880dea40e99f59ca0f2812e04949873e33bdd0b037d74a29552c850f208d5dda093866dde04e8e639888fdfe4b26401c7d29a7dba5c2eb1fea0a14e12af39aca407fcb0087306c409abfa32d5e1115e743664be0c6d45aeb3bf4c396c9db98bab64be050e42b3d869c35cc138bef4dc70adc8466a3f3deb6d05058d7052a9dd3f1056e760228476027524058d9a931e35cf319154208c1a832879c4be7c9f23c7b133d19e610d4f4c27ec6a551270964c013d497adfc49e8e802579b76a0df1edcdf15e29ac92a6af52128a2f9511d71bfa47b91ecb5bf9f7a28516ebb97aba19acfbe79253d91eb48a32cf6db0fb433e00ed7ae051d6bf47160516dbc97a0ec3f4dff858f52539f446c9b49ff4a17d2abb9b093021b9410531421408386042853c0a2afe0f2b7ad70e43c456be88f75a80eceebea96831aabab878e184e207c5c906d9e2104043d5474d99029d362446073f85cc678813bfe8d4cff81d53c11e42429fa5a708379798238d241f1d8685a51f88e9da8d49bd621383cc805a00f72e69e6d911e7c87667822b4b92c3b091e11942b770ec461bad112edf5c4939d8f3d939dd0f6368fa3bc5fdd9b6bd14e351995d85d929bb63305a4ba0efc5ee3c191d1321edffbbab9b8b7f7ef96e46026d3c23f551c9fc1c823b4491d944a0a934b21d584c4112f2fd2f2a7bb94ba6779a5e5086a941aab01940b4529749d3a8ad1492e088ac1178d74d797094f9b8ab7f9c4dba1e2529b66c071543b849f9a308c11e4b51a539a5c05306fe0aed1f16736295e04ee90ba800fad1e5aac9a530ce443a0905c0fdf23edc3d64999a3c511c4da3c9aa01b2fd6ea894c8ed4d48ca642a509a3383d0f6a9359754af8582e3d0b9f1b6be13d23f0b7cb86dfe4966e870c01c8f5972451ba61b9f4eeb33953747342a480973cbe57df3c7356c4282136ac1d848e5f0dce99beadfa3ab38e5d3d64897ee0ac612792cba4bcfa5cd2cc3b88c1e6777a40ae9212fb2f38de9f7321463e519306f48729e2cb09d494dc981f0ab795b7ce05182ac66c3def1db3bea78127c7a28f3d05a58b7801ea558dac6998c63a5645a434eb40c8c967591366577d0d86142d83ca8d30754c46852f31a19cb57d5dc6642b5ce9d77ea9780892b9a2b736f1ca10fe69388893f00e084e507d4d05d3388f2505296001bc64d86a5659ef80424d2ac7c20b7a7eeed6612cfda3567bc0856b496f692dfda803cb17b5087b0c0e9e1a501e1112b44ac781f2307698862c9441c0210f0418763f2bc15e1924815da528bf08b21ade0cc8b2c9715edacf204d58b2a385aefa2dfe3e8fdaf2b287374a9b3d055658a33ac03ad949c3e6fea398fa467e31f34cd52a4eaab0fdedc8a575bdf19f6596acde9962493f0d82babe5d6da4397d9ab677aaa13a68a09de9ae0ed4045d479aa0ff3a7242dca477ab7884faf55cd06ddf19667f668b4589955bfd299dc7642c28a68bb2eba6f08c7ad9f5e96170913270c6463256a0537a72b32a04e5662416ecda74696d275a8bcfe999820ffc2ab210833201332f323828be7dac04c1f01f93a3dde1efe7483a51b1560d288802b5685a123325c0498b6084df6b21612e0ec609ae609a6d2363a93815d1d39c81032052ce1153dc023bc20e368764cc48ac2c15cf2f954154cc7f86bf1739c10f63df734ee3e60ac40ff5636c49f68ca4c16ece289609eb413e7aa43a27817e149e4dc67bf105d3f8d0a28b67f9ff29ac15333da2dc1ef3548042997049d45cf87c13523b82d9be0446708f11dfa629c66f2468234bfbe2f45c806d47c55ae223c5d92077df8a5351390876504314165c98e8599429c9408898dc29a9e23a98fe41463618513f1a477111480e6c7177d5592818debfaf937afdfdd47de99d06efb8039e041e209c4eb5340d32a3e4d599788cabe755d66531538c76ab22aab55ff1b860258e5660cfcf19cea43095b710bdbb1c9933663d156230181ad58a2cb7b50c8261eb09ee308567934c5bada5a2f25e73dba086a48ef192c0b44a64f35dcca70ea27b60cfdba0c662126c5427b7dd1cb694e65e2104ca597960c96193bbfe320bcf88848a36e8e045deaab1c6b7489eefae4b173cdfb32e480699a99337135582d0589da7ab245a43985eed090af98c251018d97d8775b9378f03637b3bd2b77a8d33d2afa11edf6428d02f7918b88d61a294cb6d65d8a14de14fb8d42e0401fbed634b29809c15b17648a09c494f49aa4c091693dfa38f92e5c5cf247871da0edb2f319daf67a4316a0e68fd06846908f6bde1775ea02a0f83acd1f681e1ebb93cdeac93984735eded69ae21b521958388f955a24b951bcba44ee5cfb01cdc06f9b9e394a20370ebe5a39a92c0ec7424ea059a9b0c4b09ce2ef134396fe954fdfa08ff273565fc353c0256d78daeaff20529d7ea0b8a9d210bdee5bb2612fba5271327d5b93382d3d8cf0778862eedf5bfad3518ae197fcb215d21de3b5d7a06682184259636a9cba351d8fd1136d73601d8dbac5fc256d45ab5102817937928a67b3e9f35361a2783d2efef988c15bcb4f4f12e854bca459c30d923227c9f14c76a7ccbfcfb7cef629874d682f94e90be47a127877d8525d114a557c4df95d1b5346632544c782927ec903837452ab8091a111ecf202c7ce0aa9b4b668503675621255ba6f2b6dfba166a9f1f38533e7bb4699bc4fc6a53b13ae4876e378fdf947be1ce58b6dd18035e2c92a29a6e29fe5fd226ced8e4b12c0ca79346bbe4405688c114d45e95dde90cfb9a2832268279617448557e459e39670df854d9a8928392eeb480b288355767023e19c92050d3037688c1b43322c0953e3d025b84dd05df9036c67c5c2832b86606dd27079bf68d006f7b435646a9dc61eab7071f2ac3b7ce230d82b9be6347527adc14816cc9473c84e9f35811dc859e87daa72280a564d002bc8d4800d25cec237e5836ca3478504f748bde8c41d71e9dd50134e8932dbf5b3d65b0f5673f5c882cbad0bd1f6a645884d593bdc11c09b30fdefe697559c3b7f7d29aa50b37cb314c04f44d7263a12882971cae429a8752f005270b3331039c529cae19a48e61a748fc4c8315ac2e46d49a2467ad9bbe01e04058d6b6fda895b68a93581b8a4571866b8066f18d343ae4a651eeeb65d948475539d3e405d9278b66f26a5974a017701838feec4ddb8d19834b4de340feaf8d0d7109a690bfdc39f67258459499226ccd1b54ef364ac6daf8bb8c7c7656bf1a30a981e5e7813b2803bc29c6315919e450d16fe38eaa6d91ce49b1a04e08ff57868841875349ccc15477e5c69407843f6a0358ae9e220aa5cd9cc6360f3cf8aad6b753751a3c186ab34c952c06ccece5e359153aaedb267ebd5dd225021c307ceaddbe988484a68ce6e340e0cdd0d73e837ab06d06fd48846633de576fcd313688a38bd7db49fe90b6e3eec9313ad0b2120f3031edaff91f90c7f1b39e7a833e79b1c11965b2a9dcebf5a7d17c325ca957bf9e6dad19c0b702c11321d649acfe85ae68486ce82eda4dc074dff4e2058b1b3301098c6425b485c84c89606236dc7343894b361315f1a3ed5cdce37052c0261261ecd3b8b07ee184a5d384eea9420d172b0a0b59e788b72368ae8f04cbb04005c700c93cea7dde9e25e88a158b9719d3566d35e52b094f0b9f3e41c7f9c331b4392cb8195a1943bed5aebafe6643601e125cfbdd69db344c097440e06362c0c6c258e67689bbda8bbb0e5cd2c1aeaaa168bfa46a2a662e8fae38d67892f3b7e4676c9c7cfdc969aee1f0b7b82540bf035f7e79b3f412057c977349b70ce0dcb53251225340adb9ce4f3d14d9196166ed0081c2e1524780bacb0be2c45b8ff8e22aedc022dacd92940cdbbb5d2579690752b0c71bc96d68f252eae9c8066ad2125729be115193bca820b4f46bd1f08ef85df4cf8ae3ec85cb35f6a6ea96d734eec2ee634a2f66feb193af072ba62e9e6929332355272c9fee7b1960539240e41d7222f9f2fbad21586db33bc62b9b6001bf570ca61d967e022c3a612a820cab486faec6343ed2ee44b7aada64e99f9e692646d0a24e90e9b05141ef98efa35117c27b13367f3c2a1d797b2a2c66a31e4866eab7734183aaa0f01553c5606d9e31727027204653a08db90e74472c0da94788290b417ed8877914a0d5d85dd25a3f87744c1b1c7f173a814bffddc347070e92ed12338ef549e4c2c9bcfa6e3a4ce80a71c84f872856ccd81a1515b1b700448f1d1672f844b888047852521c0d3dd5024ee4e311b626ecc763fc1780c75c9184a15d25442b9b0ee195dd09eeb3f5ae77f3e8ff42914f42540efd0cb7dee29f7b612f75fb14bb1d6209a6466d943c1a72481ccda12199758a03601cdf635b137b44d68aa466e15e8dbaf5321f18dac1f934c772b6cfcc2e6e2a6d6e7fc090988d34998bc789d3786c9112f58ea8964c17a233190901af140a6b6c2b1f5c46d4b819bfa1ede55a14077644b642aa3963d177a6e823200bd065afa47a489f486f04d991f39de23dda6452d49dc2888bad319c69078b95a80987dc5e8480f15d12795d57aa5fe846718d0b0ad396a854d33ef9c49fc9c74e6879dce27052ba4c65208d59edbb5f3b828a8b2e8046745c7c0076fed8661dc594429578674362de0f0051dee53aafe5b461b888cb5a526b5180fc61d9e901d436eaf16891dd51dbb9219230b963400cb01c7c60dd5bac48fac57133cbdada45f67ad7f915a7f00b0a8c369592be7a781ec3befdded1e9bc1ed7bfbdd5c20fde7bf92e741c29a535ab48275698d4c6f0a45c66a8f542718f65bfcc4720270a686e6fe021cdecd923435d4bbaf22c8a3dedf15ba94a38ac8979848219d49432aa76e4d4485177f59b7bd48c0bc94f2f279f898748063a0271ff2ec77a188eef6e3c61f231cf525f66fbb4d18f44c31e76632dd1cd51d1db11a2c685b4149fa97a68ed22247006814c6a0501908c12bef2e0e4217f52839f2f0853a30df14ec897a1914c685c1ac21470d00654c8c37663bfb65fa732dbb694d9dd09ced723b48d8f545846ba168988b61cc724215fb090a7ab738d185e8808be6d9f3eeda7d624db3e2e06b283406ee4f12c47bf6dd34241cc46792d967d535e094da75c6194242d57b7f06ee84e8fa2571d07c97547413520beb3990afe3c63bcfb4f4bda57542ca8d94b13cd1bb3965782aa680073552aafc4828342718c728b917fe398887d81387d61ccba0fa16bf84379c395c146c882413013c7400b3680f77f4c258d67d40f8c78bf389223c74349bc03bc98dbb8a01b037320d18154a21597ad09d0dacc36ecd914ce0cff533e7abb4ffd60dda2113c44c8d58eb677f9d30f2ecab79e11b487ccf405e5feb6f3bfbdd0e182152dde8a3a3d6fde72458e1a2ef9f2ac7a4c914398876485e8986a010cadef6448020eef2ff775287c6668d03e3309163825d60a87f4735485a3aa26ee0fb06f41c9a95269216fd69d838fdf8507955d9e438ac3df64babb9d7dbb17ac1eaa0bc729b89a31e1e54f9d440c2d4c9b20e8754fb556e9fec220f7cea5bd8d0167a1a1ca42b1cf5f60fb4450e6a4da17312184f05faaedeb12ec5c3f70ffdbe16f9798554f7e8bc568425950252b79a4516f95cf91a933523288947725c4dce548577472e8e9ad38838ca6ebd2a96f6a063a6e93533a025cab5a671fccf6da367c47fdc813da7ce23b41f1caf4080590dbebd8e5ab45a43004cc9ddf6b7c1bfb93d1fa00da3941eb17c90394932f833e55e89b6da3b35ff8c545fd5e0c3ee85d135c35c145ee457b9f8ca4f2b706319efe9a7fd2426a7cd9772d5045b6248884864f74b45be2cdb85cf39b8c697556d55d694cbd905342fda1eb5e3b721645977314808124fb24cdd564b209b0643c0efabec9d59656fb8ccbe9efe947fc65bf631221cfa82291e09248af1295bb296f5effbfc35b5cedad7d8ecbf73dbe3123ddb11e46f0405b1a1c085b4e1f6266201096f72ee74b62894042b90c5c44f1ec6959418f033bcba2fa0a7e6656413b4a98e936bf430da0489b6d83d0ad76ed418f725052e9fd29a1b4b8e0014241ef157f62471e7688ef111777efed373d6c4bd8641436ab6cbd3ed37948c8ec48cca84c67f1f288a6990c3ac9c608027fb831cb9855e45072cea2deb480625b3f182c8762fbe3824de5638fc9cfcc1726171cf174db04e0f6a5f45dd34e79970f1cc8b9ba2e9b6b671a3b9be0d4de7d18d234d0616d3d64df8b5dd93d7bb2a99e20a569d752bf4bdb81bfe8769be93c3f30a0f2c8d537e217c605d95acfb798d66cea1f212ffa2b916214fdf4ee935d817b89df0fd99b65859e13e59211306c9e47c063008cf11271056562c09384e7c8f9161da04211f2115daf854d0bc42eddfb4fbedc324f0863b1d8a0445265e2fbf47036e1d74093a3490342f3831ce57dcebeb71deaba154faf953ee7f5de5702b2beb23c62d14f23ac34a3ec42e099650936d72b7ada421d48c5c41042964dc57c291718a96b2f79cc6d31a010b7527df3dea46eaa5996b5c190ba290336cc2b99d9efdc76b7398ef2d47278b44919add6dfa84f44dc1aff651da999fe65dc1e53f5c1f28f5d77486591f0daf83ff5ddf8606b340e0ed4e47b9519c8fccc8686f0a616c1bc04f1906fcd332fa241eff5a38a7486d294ce4a4a1f901ec413d149b91375b1c754ae4f56b0c1e07bf60edd1d854bae5619101b1be4980320e1c650f665662a76f7b66b636124534b075a7eae7878126343a03d360cb8dfd6de6b83efc37194939211cede09e4f2da1bdbbea08b831cc0ba889ae3be791aafb3cacaeb561f57e4d0c85e0fcf8724efdb9a8639e8f5333727d0186a22611c7308eb0e3445f7db3256e1053ddc975054ef9ebfc3b456be8e327ea11261fa4dea84d43510b9828944cf67a9b2579ce0cffeef4f841a2c278e829c1c25a3cc16dbd08f29c8da46c7e4e15f34b4691c3b29b09620c54001d5ffc03170e90f5ddd109424d0a3cfcdfed834d38d8c3aa1c92aaf9a18cd4e5c30a9934687a7ce380b4f779914ebc19f97e971ca9c82f1b2f299a00321e66dc6a053a4e248a607e2096121f8dce6d742f8df404d49ddb7d81e3f2eda2256c5c68dc79b0d9b30e3e43e0e3b490fde3a408b8248637ce7b399b5e5ff2602667de45fcb1fcf688b8ac7111d6d9297191121b79a32141de60e801f51bbefab5ebda87e28d83197002313ec585edd5be0856be3eea5681423ef12c44c0b3d0486af9b53a66f3a11d7d74e3685b731437abea879474a6849e67fd90d9d9719f5257844440c8cf3bc58cd02566d1f973731e35fe06dc91ba577e55c600e068a6685432bba24d66281cb2eb6b6d83f151f4b1d198028c98a0e1d4a23266500993fec36d91eb4f691497721f3bd8ebfb6e311935dc140f2bb6d21d6b7c86b2f4d68a379d5d6859388faa5cf40d356467f6ccb6eb30b7ceeb8abcbb09face838aecaf235a74c5f564e7d9d5f2560f97c7aa0c1d5a3c6a56289ae6301633ca4c6c44b2092d8e609e7eabba7fa2acc400aae683af1b65a83f9346031f08cdf667f98d477b7ef0e4ded679b0bc8d880f09823ad80e9732fde59c3a87da6a1fcf70b314e3dcd742bf111ca0410f0b6e2d4cde255d9e663ad7e2a3d6d8e4b2afd2013979fbbfbf0a4befa1de0ff9b4d5bb352f2498e100c3d2b15ab99ad06af49a73fd3b1396aeae37c50681620f0235454ce5b72e68ef845acc1141322ffb9485436ec6aff41ea4ff3bdb18ebb18c23380ea26b72b89af2fcad880c3355fcf62f1a1eab454a97850eae70230183ab261ff4e5affa328b7614dfff8912e4e7aff4427d67682ca1d4e2b7662e47f7f794799a1ff3498949a45fde0826554f341871771b798cfcb60b17c13da92370fa14c168c1e3d50f4e041a1232927f077ac623026950184d5cae2a66670228911b2d73db6bd0214710fbf0370f2bf4a0143f857ef789be80fe24771162e7cbdad3252d7c8e76b2b33b126e96de715aaba8fb25674694d45a23049a4cc1c881b0dab24ac69a160df614dde1cc50f1258ca17f6f45c6fffe1b53c50092f412fea56a4b58442f5c976246c4f641e729c9b58632df850939906718fc566e8a55774b3a66d27faea8e39a395e18821199cbd8cfcc02bf7dc04fafeb00e849e50e9ff4a38b45d3a8897700750fc52750bfb048f691555fa5226058327952bfa4bced443e2f2edaad8cc6377250888c2509fb98932963e00fde871287dc122a39dec3bc72c8fa0f1e116591c9d6df3b2f17223a1e0aaadb2e632841739f933424e2d7bfe9ff33eb8ac5b9c1d3f935bebf55b8c00fab86bb814ed8875e3a7247f6778de0fc2868fa63f8572a394e2881564413ace082a41b98fffc36d0332be01eeb4aa221db15a64a47a24d623c341d9470e76329367f45d60527e242202c971eecb286139da6999e324f9dd749c4fdfa5a9885422d74f4d8ecd00c5c77f0d766ca4a0f29d6b82ee02693be10fd67bce86fab85d3de21931215793767b1152b972275afdd1ca6e0b0b3330097dda8b4ef2e94e756cf019b022da7d5fc5205fe2073c9dab5e61f5970569227e450f4709f25e91c338691873983d07aa2d14fd9834cbb323cb96de3bf9f35767efdc79a48d41ca7028b5de228b68797c3b55f48300bce28ea0d3f39eeeb918ed03abe7cacc7a42a3c53c336403421b00784b0c4c73f77314667ffa69eca2ac380ae35a21b5f13e859567dfe109b5345b6b5e0c9b9565aedca401bc43fc985d6f8ceb9a51538f093e229ca942a4a90eb89df7be176fecda0fe2c301d5248371bb0f2d6f03ab3aeaf5f4445b2fdd04ef3d947ce869087540d4a92c90c66e4931431d10a1dfc7db28d391c8bb4fbbaf2012da57533968e929547fa433bfe2d3e5303dfcf78cae5b0cff838e924b4692e960f7eec72e982edbb7ef93b0688709d5a9f8593bb368a0dea15200a7ca8695914f71ab0cf09f2e9f247e61d06865d348d7d49033fbfe94e6e38485c47584a16206d2f5e92885cfbcc3b6775b68841a88e15b07a80d771e6beba384aff4479ca2aea133277e53fb7cbd1e3b190fedc4dbf015276190db25b7e1376731eed7709a6e67cf8e991099253a3e16d206a7bb8a2c8958282d329310eec695120c3d03926fab30e622c49100619f714df4bae5dcbc3f03c38c854fbf3ada761af5803fd2d8f5bef7c077cb555bc8b253822f2c1bc9bf8efb54db410becfa721151a80aa1d2cee1891c322e6c504143ac580d778d7a9263982d3d513e2caff1becabe4e4985bc0163ddfca48c67938a201d5cad7cf83fe862c1b2679f247f5bea06c8f2101849864eacde15fec845f1777924b82e6a4e8721b5426b75f9f5185dadd1de3fb4fdd81231df670b9cdfde78166e7fecf947a79cb4f54509d6 +0xd440079d982249c51971bc2035b6dd4594766485424563d0e4d6822b26d385c9b415702dd7aaa6a1b4c180938c4d30b0ba63d09c57cb2312d49ddcb8b32602af +82600 +0x4ccdc1f4dd8a783bfc8e8aec74c836189d7ebbd2d3ef6dee28370809567244caf824aa66f9d9a56a4c08dcb5dd3dbfc3c8776032cacf857ef45bfb10a7522d77bc71f5f5039db13defc99a7b8f1a5195c049bbb0a24a0ff7482b2d97b43e320e027a49a6e31fc43c4d996b4671a71315eebc735744a634df8b6d47a9657e7b1831084f8381a704f0ce40f71f6b2c2ecbb898312c982b1bc025eaf04ba259311db0e3ae93c57c9ce0db85e70d65f0ca3f87a49c398623ed217e6ad18753197ca3e9d30fde98e8b295da31e319473c0dfac4a95d85f7d4d18bfeb592646004833443a01a6de0316f95350c924af9582283d56f1b18d187f0850d92daebb1636f572611764787a0fa6a52de9da8648c2f6224be7ffbfe85719713ca51222e7d6795faf0cc74737d7c9b9b6fab3b6e205d20175e313564137d497825a013c09c94742803c3fd8e101cb17687650c005bd3441816d8ceed7c3c24a46b6fc64d061e7e161304e9bea003334ded73220386ba568eb01ccf8006d5afff646541be042c3b2de73640ed7758a9876a7c855de939dee1f2a73f04fb7172f2d82b8efcdee632d549020b02db449c8cc6283ef8cc796578a51e2663a137f6e38e69b5eedc75eb77ff1051e515ef93c4c92154ba77a172bd912c8c844150c23b4fc6bc7b4601ee79d2071a7e6d8016973a0ccf8d31da8e177d777a4f22e35f63e3eaad8d63b1c4458a906eb52a1fad6de394b858444c40ee32a7f7ac8e1953c1127e8f0b7caef441ef52567296f6e1ae8a5f1603f61e10ab79650c83cb1a28bfa42a6bdcd92006d7c8f6d99df72a39c2f815f175907986b41859c0bc220d65c4609548eac22e826edf23001e96e63e11f55f519859842b72d72a1b3fdb1a93370f682e1c7f00f16dfa82d2ddbb50760449e53f539b68864d808025f43e6b3982794a265a57bfdb3ee2ba57c2ae906b01bb4ec28e9c4c20aed905e7c49325df0c66e4368c9493c6485f7497b6b6cfa5711442e331a6597ffbac5f689521730e3d9ede699a7ca33cf339589b9f1c35abbd1c6ba925ffb62d9ebf36b051317b4c7de8dfc46d5818c4a7370d6a6729e9044b9b6e1c50ef8db2fdda33c8de0b6524340e8f51eb6f19e7cc223c0cf422143b8559f6449bc0039482c7fdb726f75a1bcad69717fd0bcf2bcac28c8a3052ddd5d21da92aeeb8425d934d3d850f3d82bba7099f1e8c72621b0adfa6eb01006d5c99b12fd5322172949a339b3b8324048b346f4e6f7eedf93cf24131375173eb5844db314d4d41bac2fe42bee069f50813d7cf4d11bdc4bc18ebafd67607f4804f3a64579b2961436e27424f7ca8f9b8dcf9f2430c2f3fd4365ef33db10bcb54cbe31448c6adc835207dfbf5182a753a6d03a1d969bea6691eb1d30df045408e53a7b2add6c0c0b761683459bad6b4b64e5ba2b72f5140a2594e18ef399d9b5770ee082dd44c8ff1b750b7236d94fd55086bbd8466cf56a86e9b8a8a96fb23d6a820dc71c7387e0cad9d4afa364c973e229abce9162230a3e502f0870e47213486a5f720b76cd530c8b7b6861fe6cb9b244f658d483116ba47e9138da969dd988fe521e3accfdc849206c2702f4be19197f4821904e450151ababc4570499f2b4d492162af4bdb3192f338606e61214a02f0d934502325dde9dcb1566acfaf144737c144c7c7195e50e4defde511d2eeedab338736d6df3a39b7bb6aa0e4547c0518c732fd2cdf3455427ef09b443ea4e08d57b9bde5c45394b3a126186ed88b1055fcd3586075db2876dee098e0ab9564fe0f73ed381d5181382d34dc568168ef5428d0e04c237a51e6c776e5ce62e90066215dcfb8315b89ae253cf485983c2a7f13d09dd8313a59fc005a89f7abc73d2d561e6a4b4a9a327d52e566e2642e4a3d847c98ede642c71f53338c42cd57a2bb765fc7daae36070d7cd83c542f67d6f5457cd8718bbb23b686aaf79612c3b77849c7ec4ea6568dc76abd7ec53f0f56111c77654e68ccf62b6266d1ddc03004cd96ffe38d7a224e11e63b321cde4d52f8d215486ac59ec6e5af1022fe20c8122027aeb48172c3d154b6fa6241524953122fff88afea581e4c354ff3e17ab368dac27d6510d6619ef9a3a3151be32ce0c7fadd2d031e2383c8bbcc4b6e16198e6430140024ed233e6675de5494db1e827ffd564050ab277fc10b2e328d3b210d24391a8ca400323805f45226938046c0a2fe13c77dd78b999feb1eb02633f36c84a438127857b6143de8a893011ccd2298c6bccd72eb785aca2444ce2144b833eb3b1599883ad65b751887a3c4f5da30c91df857172e1548ab7e479366b798ebc1c45a29bcf1ba94174d985fc55396739eca6f6f54ea8beda8c0d008ddd4ba1b6d08aecafcc38b478a4f83ceec8029727d97ca1c116501d12ab486336fe2474b59cfba8530fa71fc36e6eff822c3bab5cf4ab16736e9a07a9a20121e022b6603ece1256140dc933c83da84e64d6371c5fdaccb56abbc8f725ecd1bd17ff540cc8e05986714b21a8ed9f2eb9f56a977296d85c1f45826f741e0834a52cf89fd2da705bb9e94c32d7ba0f7cc2b26ddf469899d3a462571006d860947abd82fc4af9fa7350ea959f58a40b2ce93a4470f0eb8bbdf56fbe3d180ba29b9e4842ebdd8dfb4afbf39ba9a4321e89adeb72ef19f61a9582bc0c69302e3a94803bad01133cdf3d0ba2d2f432eab64d81449dcc2a4ee2d4ccd5e606d7968529d12625be845d22e41066e0018d447ed2f3e4197a9a6c6106445bbfa886fb3ec601863186998572ba9abe37542bc5b4a476386a8ce2c5119479ac1db0c6b2b3f391ea74fbdb3c2b3b1b273d6e96e5144c98b02575abef7129dd4564d20f63812ce2b15480b1e7c8e0122086a34738fa35dbe9ceb75e420c110fc6496ec97422fca47954a7c62ee844003897a4c527f2faa053cae462734f04618d2ff99d6b15cd37a0f9e38067f5d165ddd4e599387af5967cae6f60e9b65e73388d04f3bee6291cd6b8d669296e02d39ee2e82bf11ed11ed2fdcac22bde99c526e51354f5f09ae47915d2f8e9dd72a9ea362ef5d84af7b9e51d891e903430d7f6cca74996d18cff16a56ba83fb08b895e431c9f548be3f821921cdedd33de1c16a8233a180599ed1dcc230f9183b7d2599e5380fc5e204a16f0187b6969dc02150c29bf00192c3f2d0e7b8765c3a2156aac4633463e272043cbee8cab52c54a506d2d40d568ce6592f0f7b842fcc4d30001773eb8a8832b266a117b396b2425774fa0580e90fae10df80a0aaf9b8a9bc81258fbda29aecb3d7f23cf9a3f7353f838257d221e3c31eca82507122c7dc011638e03113e1471075f9812243c2d36419b1f18a65cfce8bd65fb35f12c18f07a8968ecf4525ecd02afe0cb8dddcc4ce1fd0fb301f9c775fed5df0fe316e69d71d88c01fa02e83fbdd480543db0eb1857e279f4db61265a3f6c630d6e89513785f569eaa8dc3b39a76209549a41e42921cfe036892f9415fd9e09a6d9d0034f2544851f772ae24b3dccee454a0d41efce39d4f091b19b2997ef4574db975754ee6a6018eb8b57f51f99a19eb37faeecbba4bacb8b93a615bcd498efea5bd7e93fcb7d5f8c8a16c79b4cb5c97d1565907885242fed423f5acae296806c8a0f6c97dc4f6bc08399235f5abd7ded6b208b937f83862d49d179509da0def89e585f953158c62e2479a8ca480af4baed4a2e9ae86b66d21706f1cc6a5a4415256d42a65f2be73bd912b87aa930f63c184d09dd543e6a52364a44ccdd255828ab98b649ba3b47601e1ee2ced2c1db0788c3adf9479ee9442405f2a06a94a3c98d752afdd6f97f315fd8b85569301b939b387b6d36ef6c2e7ce47c05972a8f6e678cf1413a08f7263ada99acd0fe4066dc0602b7a6c27b678d40515af749a39db63ad9a257cc37c52bbf0713be9ee207d7c6c4471b9a8f85f1b4031eef8468cdf62924afb4c5c984aed0a14866a468ecfaf540ba09da210026ba11d0046d4775a3b272a7e57814fb30d9c8b98d715d8cd20bf88f0623d87cb8cd0e0cba66d82b4b7134594e75b28f6e151dc577b8287de9956c2474ea0e32145748239603936569efea0264212ab7932ce11ad9db62269e0c1c18fabf4af6b5f350c31bb5f1aa6b892451db1cd60a5c7be328184d831d8bfa78daebf607013a3bd859a0007b70dcd743b5f7cb4d0e26ac745ba79113c92fbb02f8ed30db080d6b1f55e785b93f4a44f8ad6ebf08299e1915442c489ccff5f85ae152e23f61ac3bc6464688038c106c93b6846a9fe30f5c56600ad676887b2ce122d1ac9cb493184db941ba12edebb8a54ffd406cd116e0b84dc7cd49992bb3263bddd27b675e7b161d6d8e4fbb18b3be082de3076a2140ab5be78f7e688435aaaacc0663f06aeecff12e67129a43e84e4d9ac4f814daf6b018eeaf9d7d112eeefe40baeee644eddbc308e71401d9b0c6aec868a777906d570341a01f4d5f095384c06264cf78f2ba018180cc6866b7c79a3b409df8de2f10b995038c6fda5f78fccf9f7e028397eb3b3cc694546767b1ae67df541f30b67d9a3d4c5d4aff8bdfb4c2b48325d1380fee7f1b144c584b2549d2b76251249dee23bedd1a654b38f85b4e542cbffe6d7889dd10b4c6b5dc92fb004b3145264ff2f4ae584c5559c1433ec6f0d32777a2b59beb2a0e4a0c867b30751d5961b2371c7b60205b8187cf50fdd11d0ef2c97257a30dd9894cc8f34e98a590331d54fdcb3698d7d07071ada216d13b48b85056cf2dd9a1ae45778dad82266666fe8b0eaf949cd133b8940697085bce08dec8ba9c9ab314e5da94cfe88b5be26d7bd0e41a3400cf0db05b44d040e557c7dc8f3840884e95d862ad24b022caa6af1ba3189b835903b6fe53f2ce5ee26b2e48003a4b64f0b6fe743d4664d70725a4648e16b410fa31d8090a9af1c0f77a8497e84b2dbf4dfab095a18fa71685e1f5dd0e58e45b88bbe956eba7daf57908634293d55805aad3a73d968ad77fbb6e1beb8069ccc17904536e73a3fa9b0b8752de9f836ab6bbd44ad268a276613c1c7f2690c3adf14fcdbeb63f09c0f01399dbd267bfd670e56f040ab46114697c8fa804cbf12849715a73d4aa53deb3259256b488f51b92bc266b3ce6613206e13a2f0c8e6ccc58825d2b30421c9442a6135c0b7fcdaabab47cf8ef9b0d4fb82eae5cb444b10aacf7283d6f92ce923d399f743dc8a4144742e535a93eefddfba95ee982ab4843a5545e32c928e458f1448917c1d012e8c6fbf199e04e635d4fe5be3dfe1ead37d00e51a3f350e8490d5b72bf3e328488c84414ae2b36125e33686ed29d1b5a37bb99c4f974b764e2efe2fee3197c8384b9cfe0daf0a2675134a5c33fc62dc9d3d69b0aaba3d8c4d7278f601bd9fa9a5d19d3c8b8b70ffcc6d2326dee3fc2968caf66a54327119266329548d1f659338277144eb014db2d2f7a72b15630762ac2a4a12758751e4840afa93bae04f4e9954fe5e56960a0830bbbfb50106eb5013664bf0343f44b70d6dd3faaf87c7a16f602ed1f4d40dc98ec1540ac95310bb4385e34bbae4b15869969dd0959c34566354e7e7ec42bfbd930f4c7397d2df6be48ff96d2ffd0290418d3e5e93a7fe331c3713e6676888abe8af9138900cbe279f8d749cba139e273d58a0ecd2318c01431199178ccfd15d35a909a1de8816b81c863e2183adede50401a9c17ac148877feb61c284fe009921039ef6a9ce50e702823e44b35357923f904327b2e0998f79cc532f767d7f2854c7377e1867d27af9895c4c728e44f5950b5564a215e7dfd8bc57a58bd5b4d277fdbb8254da0639aba48083e7e41cd7af7cc7c173e89b4145c3556eeb8d095e32ab144a85af53eebdda922f3bdf470034ea81864de11b7a68ea35d0bd2de4962cdb291ed16f205fda347a9995072d38cd5e6afb5789d055e838df142a3eaf400e94e24663a1d755a8b820091ee3374722df6c68ba6722996eb63b815947d1257fdf270961cddf98cf706dc6fefbcbf4da756e149d047a0da16a326172d0b20d28c3e0b1f47ca0f0f864471a5cd753089e28594829e63e7b2a5eaafa9f61bac0b048f58443348225cb9b984b6000354c1501134c8697d8a9b09a8c9606835105c1764ecb7780edfeef1d46a234fddb85e8078568db9fae5fdc24c17bcfbddfa50056d4cdb7e549450df23a67fd56ab7ebe4397e450842a67560630f12398cc6917ef6dd42cedfec0cc235de2e6940ffe40bb32070fd0b288c548c0422a9b8016ae490226fd1f7438d5b6965b143e6ecc16793c1a3d0ab089d1f05bb40b4e64776c6d7c0c53031374cfb6cc19b2dc2fb1e7859f6505bb8b332308e891ef39de53fa62c1ce5622443e6328e965e6f6bc755be541308d6aab4e63974e1ffde55771ff30bbb42d036d5c3916d487d8157ce01ba30cc3fd9f78a239a677a75ed9389a24e05006012ff897f88775c7b2c0d7b9cfc7e6657ee35af64b3c4a70399de79611796a0bf92c4bb74884b46c998035ca1f57b96038bcb9134461afc4b7bace2d6d03f00c3e84d084d31479c0b7dcfed9b15d6cfa52b5fdc2ca1d8ee900b75327e187ca51f7beedc63e3fac09345c9aaf30e0e77cf4538ec98579cf283b1ce04b140be0224d630c44340d35903888721442e9122e4820d4f01f7c5bc99072dc62af9a1ac768fa94c75b87fc9deae9ecd08f7fd55773a338013d2f1814283faf34593960876f0bed175bb4ea78720671aac0aa1840a06420c28a98ef512b0ec089bbf29aac8b1f7efcdd9de568f9676a6b7d72c332f5ecf5fdabc1c8c7c16479297cccb07ce3bdb13e8948d6b6a7953ddb6de0be739ac220784bb28cbf10cb41dc45d08a40a06deda406bfa6aba31754c239fbf14bb86e07fc1072218143ca8069be04103fe9b79bf7fd0a3b8d167515e889cc440477791450a208715580ea9f998e722bc3e72421ff152f7fa42738ea150359a0e5fe6aae3eaa7f6383efb104345e22c112c13be884f738593affe73a1052aceb3576c93c8cd0dcde52baa91802d51abb75a084584e4a2cb095c50a6ca21ccd0f3d061f2803bb29cc0c065a43ca9c640234ac88d924b7146efea22aea930ac2f245d7f2d96b146e14f7fe4bee565a087d970cced4d0e6f77abdbece1babc3957e9411cdb78c82b19e5bc7047f6cb80c13e6e9dfaf187eddbc1a407e67b1f04e9974db352a2daefc52828c0d60d55e7aae686a41d4c528cf1c5d50c2366f38f32d2b5db49a183f5618b373eff759f3593566b87ea99f8bd382cd1823f0ab448e2102c0d16f13dec8d835a431aebf20b28f28fa1e986d50f4d6b3bd28fd2ebb265d412c1511e733587a51485becd18c8ca6f659a708f91e3700576a5ac6c046c4c930c806e95ce510e64f87f51855dfef6118fda361099ea6e801453fb1288d6f4d17bd2e5d399df8047788889c14c3e4a8d50d990a66774877f976612730372fd13d3215d6480217bd10749bdfd6de716377b2126dd8522593862648919eed0c3deb5041bd4fbd75f76472b74962d8a17a441395f126d74625f27d7a553b560f79693f3c7817751a9bb9ab6342825a79d68559aafe1aadb21683a281ddcf1b3f6dff268e7168d30f9258472732fc0c035d81abd9fc7a7d714c82bee58f22e3a502f52dbd0e097f5bc2896d8b81999546f88232ab530fee8cb137f82cd5fb57471e927e53b9c420061594451897219e4a90ce15a76ca1a90a2ce979e016241e2faa1f3ed8d95f5e1972c0f855dd5cce180bae7d56adf855f3a4e16888b963e1658fe498d2d5a3e39bc056aecbb912ceb7536a923e7fdb9b500368eead288148efb329b2cb17585494e99e8e00940a452f4e4a7be94b13232830c433d6ca46fad70036b44a06465c0cd4e0c17ed70ddc89e69661df77699483133d5e8b0779a0255d52c7d80a34a10c69646fcde8e33bcc02956ba66da29769941d985547e4e1dfb1c713fc8beccb9b9071be73315409008990c2c89389d3e39baa08baf24d660fe6dbbf3ef13483c23151d9fa1828ee2d65cf8dcd53e5f1f8102ed744707dd7bce3d7f326a5d57188344ae6ea0726945c7d9af53b147d98b1dbef2c7b2a3cdbef9003d93d0d973cf581a50ec96517a095b939229c3d1a7114e43630e686511aafd5a6960a92418c1101aa78219ac3bdde01f33b773884232c144a0a0ded863d049a0955159c9d0be59aa04d790ef291413d1269556c8357fe5175e378c8a1ecf6c7753ce794715f7835d1b45a296cc4c555dcd3bd41dfb59484fde3b07d6bce8e44307307e08630d2bb83d64b53f8ff72319aa2371f5fe4f5962b313c76ac8cd3f98223fdeaa427fc12ffdad4f460ea51ba93fd4b6ecd8d296d47f6a4192ccdcecfb574521992ebfd248de97d746a2c69d6110d8296ef5739f3995971d0b23a85ac108d8dd41a25ddd7742bcf3bdf6dc36e5af963ff8deb2c0e68832a02087b027ada973685027da515fec751b18657656bb7ea771271f00aa8fe9c5716f4374d1f5cb9d693139a5cc571e68c3e299059b370084435620fdba8a1cb80763f166c85de1cf46615250acf16af064b8ec0a730cd7a54d127f0a8f69a382e89b1c26992a7e71866d0c5b71a354b493e7e9055c816692f4f893a787a310ce8b711e04b300143cafb0c236c9016e1dd81c1a76d6592fc5b155096541cad6f3768291b1b463258938d90e73118009a487a1faff6ee8a5c628d44ab43c45888a204bf18e0bb834dfa8425b80c9a3d9e1493604df94b46b0cc1e2c224d5a7880b1f39c82a2793c4b8848933e07ff1314c8334b2b7d640e211f2fd2a27ac6567eec9e88ff6a67a579c341a222292dcb24edc1aaf18a212ad7e52afcd4d3f03aabdc6b4a373f6d060035d7190c7a0dacf80aa74347286ae1f9a576735f5fc06b2f08c3acd42973a6076673c2a3038700b5a74cded360277db0e87bffed271f3331f80f747b3061ceb7dd7b6390cb840d864d1845403940442335a1672331f3d8d935b56bd65d1fc6382259c57bdaea1d9182733f34bc9d7f7b145075ab8726a350461f598db796d6b1bd73b00a39a376fed1c59357f02675df0df0ef2d319edcbeb3b3064846ac464a3733ece8ef9560f6bf760a53ddc47078a9e99e503545cb4b05db39ae134a5d2d160040bb04aa25a1d6ee6ccd8b5db66d6fa34abd9d01b81dc3febc672559647fe541752c81c80c269d96817003da90e7e887bb1c71bcea5f7583551c85bfa36b296053e26dd95cad9cd410e14c24460e9afbb814b75daa37a4d4cd75396662166cc4a286d0c45e605c11e3cb6e2120090f680b4d79cc40cdd758eb194b34e9ab35d52abfb3715a6564b6c0d472bb6601cf377a70bef1f44a967779b1c2137f500dfbb3361dc897e43c2970a45fd95f1d60cece258fb40dd669993de4a7ea6e2d7b9e049216b15f066dd4bbe43d6354864c97ce13f3fdd598d926015b01a0fc6c0726e67ca614f8f27e1e683c14408d631bf844e3f2b492b96d868bbdd81f723239fb219cd6d9abd1f76e4153ed5a52dd535bf63c94c18d60ae22a3b3354e18aa9a857d99ade8c0cb612e0cd2cf98eb1c7e27aec7e20c0eb6226013e51f1535f9b12dc21c33297f0743c59260c3e29f4723c4322ce37d5de353a9a2fa9e5c124a0659b7cc718530ae259b9ba6d020b887cb9a4a129ffdc10ec966179bba0bf8c3227225526ee21ae78f18ef4cfe3a7c03fd11c0211f7284600afd3b6f7c0b2d8c8ce1d455332a86db0aa455f9551934e441915b026ac6ec00a0d8d61feb42f9cecc0d8c7ec643bcb21da79655dea327511f82e25d88df4216135db0520f99a6b16b5d15753117049351897a09a0c19f73204c1ed982a7cdcce9f690b1f1f87b5cf03b36e17c8ca6a62db2c9bda35ce271cb57d71f5f04d748ac0a3fe39848bff8e30eb96aad8ce915398a4b18f05a3974a90bd4d727e0a6b2e30086910c6fbbaccd3d64b9cefe1705fd7ac8c38ea5eca440d1dfa8e322833317422b635657b7a135320076e6c976a002e80766852343281b0fbe3a9ab2b6f3cf37f6007de6fafea3545449fed74f0ecf3dd1a8debe8629bf2e3a36547887199347b1118906ceec9f0b2ad81d0fe977ece2ee31a05cfcceb6971b44195b3ecdebda223d839e7993b2bf48ce4b598e02e23d26aad3e7ee4087b1290bf24622396058132d7296441a63d877d1909d84d738b841bb8046a4a6bae32c34e61e7c82792a4a895ed677aa3bbe7f89f5c3141f76ba060bae616629d797eb66fecc94d3bfb68ff850455a6ac1da28a081b4860225aa3e4365207cf167342f4a4138b252b965ac224ecd35837d923abb3d5622a7ccf2b10aad6b2d25f222c088b74a1e27ef9f67b063554f1cf74f7c852f923037f3f927098f2ac3eefec866c768eb1f7be9cd8a4a94c6f15eb87ab7a36151f7d9222768e8124584731590e9af5d01ff763055db97eb0663714779b3c0db79c0b6e2e43b4e3fa4b9ddbee110e99d75043f4ba123406ffeed7c2cb63882a3f3d3f5ba986ae31c30a9538223a41d303077ffc21729ec2896d7a7f0970e91c3a878c033abbb50b4cf9efee7bf6ef21f19a0dd1e21b7441fb7681c1a86fc96437ff73cd386f73d0c6ade05771b33117117c602e52693f05b47e90032eacc39295f9793258fe6512eeab291baa0be222e143295a28e8697e42fa27ec02b44217f32a1edae2f4f35213562ca37b6d6cc5ef72dbfdac058e1c358dbbb4db12df74ddf5d71f8cefb91ed3536d776c642b70aa8fda81726d178ffa9dce260e34e62994e13488ad5b30c9bd076e1ff36cb8c3a0eea77e027b901a009ec19822b710b6d670b99ecaa3d4e31f0690f5b7039f3f4133e55be2bd727af6255883af05c99d0128c8da7b76100ba7c588a11da5493429e3f69389af48f339b5d59109bd8b5cb37e04c4263e9ca3b5c8b79a9dee3152b9837dcd6ddd8e4349c4db18c92ad0764be4dfd45159b53be784a05abe3b020b8e76cd5205a4bccbb4d6dbb373ea336a58f1cc9383741444ab8dd56a051815def74277d9f7a15efce96049c980782eb969295d7a430a144e8048b93108f1f74da27affbdaa5fdf7785f5c7f385611cd3eb0ff50116884fc9f449ee58107520c81e84e785944cd89be90bb8a9d911985a5cfa45b0547b11377605c737d20e1cdeaa04a1ca5bd4b50aa116ae5512262bad3d8ca210a35f23278400e668b4296611f35ec0e457a40f143cab1b9dc6fb415d1b4bac9a79a0d01abccfbe534d5376d28917c77c1e1731791a3d72ec4e2d73ea649bc7c65decb2717ed6d19fe418d9c0b9a427ea25cae689d85266b93e192dc5a811762ca69f44dc489aa2973ef6093d23a854c6f52b78c6e56e499d0d6af97f64315a260a3501abb89fb3e1b4578fd85588f08b02b572c0c005adf0428f4198076fc65aff5a63703d6a8807dac9c802adca6dbee4e56f08069d066b63f2a07030415d23ec5c04ba456f916218d96c4cbad13edaf257c7fd17b8d556e83190c84d4a812957c64ffa7f336298f4e2c726fb51e657e179182071cdbd5b55c88ce0dcefd4c3c835bfb1394a6e0505927321fdb0e6ce08c5ca02b36000e113240f5a5da5ba9bc406de6f0219264eb144eabe2072d295feca68244b045270d6d0a2a55e00c519b1d6169478142dce8e96b86c021c1c582a037cf5a72f2492e75ac1524c8566b6481012b1f9efe71d03f446ac1121367d10ed73076644f9bfeb2ee5d1a7a821f9cd413d5805f0e4b297da300eec06b38d59f4e4d9e6ea446048d9aaa3fdfd797cd7d600e72acb9917e0d4ef04e14116015bb63cddd783871c86c76a69cdd9ff87ee6b07ffe6d496c54560de1e9f64c061acbe059386a5445d3b84cf7385d206d3876cbcf2b8a040335c0aa7cc84f65526a358b98b92c40eaacdae2451b48a41b829578a702ec337fa8b3eb68f205a46d8f632c3367a64487db3800394e84712de4ab81af89791d0736979a4d6f02517f11bb8dd14ac1a844e93c707ad8fbcfc9e620ac8eca1a0cc465d47dd5482cb4af76a7751b6b63b34a5d4df9b1c1930818115dc2edcdb846ddc0d25da6846d1526488eabb8d175aec1bfd2628612366341ecc88a739839147bccfa01682bacbb0c0ed8f85184e0e1d1983574a0d2cb276c00cacec93587bec613b233c446d1ef8851ec248e8d8a94a06eddf7a8093a9dc3d3cc5496ac888ce51c63b961dcc3f9c29834f716f35d0f59cc32b345bf6b0d6bef34e5830326c6016f765ce9f56c21e36b173992be409922379c6f20fd45be8fdc6b49384447b3419551e40199b3af1352fdb1a9f71a7c233983f5e1cab2fa5520da485c77d59cce155e1953d180ea79d64e2804a5d5fe86594f0b2f2f9a07e545e8aa97a2b7c9cf7704c387a4bb1b3e7e73664bd058687020687ab233e32e68d3fc3693cfd5826d44aaa9451b4d8a89d3d23325808b020b14370913de76b7065080b5f505170fd003ba94343d1c7f835cd4573abe56137fbf2282fa383beae646dbf0684d65b71f3c9b4cfc12114254a1e1993391a1e5f4a992ab0e4a1a0f313c75ac92aea7c48377b59946a2141a232a62c2b80254be9158f04ef81bfc6d0ebbb6b41b30c57c233d7043baf60e511880bd9a701857e77e56a23160b3c74da64a06cfacdba72828153411ff15e52d5d2a5ce904db92a8e42b121dec1b65f72171cdc4edb8360fb98869ccbe0783f717b0a5771b53ee48eb5da6d9475abcb3a6b8735c85ce587bff1d773c9ed5cef6719b020c5e895111ba76c82f1778b6c95da8605f1d25f6b2215cc6294886b0749171da6f7584a5497afedfe5057e3a806fc8fc955cc6f9fd48cdbe5b632210b79fbd9569074cd039527b53c4b8732f2204a0b0c5ebb847a49cf9c89998b2d508c4049ac2bceabc296b778b94d95f7ff543b9e2b97103caef44674aad8f3ce9af27d053423e654f60ec79f11d0f4b1142559afc3797b06826699fae5defcb33f4f2a827b032c57328fe0aec26033ecd5062cb640805c60b90322a5a7260649b1f4a157ed643130fc7c9b1e4795c409b6991d584f4624d9a76c88fb8b48c110977599ec17a17560a8674f641dcc35963d30a3fc2c2564efd2052562eea18d9654547cb566556964ead28616c18e0920dd7f691883c8bcf1cd6f90826deafc597d13c24a65fa9dbc2840c7bcbf55af281bd7d543d28a6dbdfe0e52c0756f7db88635f321930b82e4e5349cbc73ada81a8cdc60f484f52772e853d4a391b98251e43d87c189f2a96da6106d9c9b10748684ffa4a137935adf10f2aea24f53bab42b9d08a0975a71c4ef76c2e37208a4eaa8a408e056df78410c4d39530ab8874dd0c6fe5557ad9c7925da3517a500a9c57c7c16186f5410573ed61d2c5072688d585dc146576659f8fdbd2cafb093038554ea44efed7bb3602d1fb2a4bcfbeef146c409fa031f6ac2bb921222112a42c8e6712dad5dc0c21a6baca242accf7b18009c20f6d7232f74f3eb9e053350d80e85a338f74ccdcce45eef548cac67ad703a38beb3603c187e4b3c28cfb38133a4d6e2ef4416fd543c8b6a51e9385ee698483c2bb62aa4c64d06063af80e45f64a4ec2c91a58d9d8a185a022feed0fc6deaf2900859307b97fd8dc5d04a019905d51c54ef09eddcab1b22330241704ced1f361d58825df52751821077c1576926c746cf95d3583bacbb56611ff52e85f00a97903647f8631cb6866b2c4dad75ce64b2c40b6d966197df3db30f73d04f7f935f11270fcb6c7f13e3fe7856cd680593a85cda3d6ff8736f205259221e54a1a2d4cab5439cb9574fdff2e2447de8d33c6fbf89adaba5495247658569e2395e1f40e0674934f1ac54c36ff37f869d41475014a02311122072fa151cb2e2a9bef2e97ec58a5bbd8609d79c316fb031569d9383a8096ae700b6818aa564e74aca0418ca586ed8c5ee5662a2267cc2491b24803628c67ecbf20623eba8e6b9c4893b14eca75e75b0eb23aea95a0f869096c55e52a8c21567fc4a2a60ada220c00480270d3bc0f827865801d8548ec2abd1697702b065f763296adc133dffe4e641bc97559afd2ad1c6dea4579c633f45d4f6116cc917eb667e4f8229df65ccdd4ad5adeb4e7ed357b39bdf4fbaf4c504a55675b87a40bb1805df63cd1c3ca24e27b5b1f8dfaabb605578f9e836ab1c904e6feb0f4c482d23c503c9257bed2ce0de42eba3d3e8a995b55d3c4999ef0b92d72bba99c6970a2cc6a4fa5984de333c7966a215b4a2679dda33ee9b6b275bb246702c7d709519de11a83f92bf787e09ff072075093fbb22cce0580532bdd497a52887e4d2ab24deadf9e0f8b523d7f0790fabec5b276ec9944ec2b078183eeafb3a14f5753ff1d7a27d25b2ed480499ee658ca231c1483c396373c3c4a06152518e1bd9e0bb4a6ff91e56e9ef4dceab66f10bbe13771023c309b5679fbd0578ae0ce4b79b85f54eb9c2bac4449cfdcfea9b6f6989b090253b27cec490d7f1031a9cb6b82f07ba1dea539a6c739b59ac804b02ca1cd58eeba8a507011f56ee9c9e26db0423a7638494b83e0804b4a9eb33e90a0a534cd31d126aa847d4a2c4eb4092 +0x97dd0fa2b0afe26af1ee630a4b1b0f7c075753a79e1f7303c0577d869d23f117c4a8611e845cc4065f6a85b9a2e0a684883236d6fa65cd772363f1a26ee85bdc +83392 +0x40021d58f36b960cb8bffa0798ec4acf50cdc63ab2ff6bdf49f0bbca3c38bc74742d43f201b1726cba4f80d12487b8c99665c5eb9a592c3195421aa8abcc606cddfcbcd474095aeaa36e9a1e683d143bb3b6da99ca18fc95ecb7523e344f7551c1980f68141a556eb943d1562ab7650cf0e78dac0be5e4f39477eaf3a16a040a6928c414a98d6be046f7ace1339cb3269521668c2568eb33d6a96a2eb9c4147f1dd56442fa09a42890b1b4274b950770ea8beea2e048193dfa755a594306ad9825c77659d037092ee09a6f91394a68d2364eac54042d76f9480443db08d7d73dc82582c1f3bfa1db7dda6785c762de34c391280b58c10b4f087ead1cd0e09b564f1710e12b487515b198246cbb86717ed77deb30a5a9df28810b1e8462c800cb02c7a923407a8bc5c2fc2cafde5d2a98bb3a7c29b390fa6afcd1207b88380f84295ad4eef9ffedd4f92f09b4f890106bb7ef63604a1c65ffc1fb3a6908d8cf690cfb1aab1f7ca3289e5943e5d1c62bdd12c4293b32f527cd18aff5b6ab4f4863f3d002c07a9cb3abf9a160a930a884d716e2552432c448be4915d7ca3946825825011496d20427435130ea67dfdd224209716f821431d1b99b576a0d7a648632ebb7d895ef5f06daf02e6989a40e0e04349800bd9ee3c9a5589a36e836525bd78d1ad725995359571cc2637648e34e07df808f3d9983386cc609c2c134b70931535198af978827a21e1462969303ec315251a469ccb827f52dc996013d3c99268485a399b2a878a33e4ded514c17ef6cd432c7ab012b9c28d7053a11198912a06add814db2585542c3958d0f3dc6609fae4b816afe84a2ed0be3375790457c864b82b9315f42c467f713c8382cb946b229c5590f8c6a3e2c108b133d6918dfc0709bd3af800ed0fa20f02934e298a98c8bc8d80073857acd2f26592a6eac44352151582edf647ee38753356b270a92171c7b84a67b7e5db8b0dc8e8665a6b2cfa6cccf1642ead80a74657646c2b7073a2607e8696cfdefd6dbd43cb817b132754633c0ce724be5572e4e732b7d4813ddef9489b20da9390df737ea2a4c73cb0f4aaeb3c0372dadb3ff35b4831e65bbe8c049f1e7272b42464e2c2143cc948586fa673153583939042d42c2b76eb50944e14ea772822a136a26dc686b5ebd68c09e83c1ef9f169034019f242d35e104d79acc33b9e64fb25fc86f470acc967da67e2decfcd26cba29c371624f3b90b48a33eb1e261b42290f7c0c4688dcc6cb20e28b39e2bae5c0cdbbe30584476b2246f3d2ee1fe8aa80608adbee4e57f65a1711c5300a1f27a906311a9433231a55f124aa2e0e1730bd3c3905c6c204cd3371540459dac9da7dbe6c4197c6954455740c9a635a6e7bea8ad2b2574dadf45d18f3703dbb7fa745dcb57e96a466912bb8f3cb176bb6340e329d0927581812e0f2363063160b36084854f91a355eabdea42364d1a9b602321be233c0490ed0c5e9646d5351332eceea91dcaae14437761fe38e1a7c388e5d2fe958aa8957d613e4c74e96d6c0379faab34ccf10e2e0fc137a71794c027f9755f99e6b81bbcbd2caa5fcb30b79fb84700473102afe4b776731347681de7ee8755c308d9802570b85479e325a281f8424ca79f5976123ef03500099839233597858349835f323c5fcf55d9c2a934ea8ae4e8606bfd30e6dcf1ffc6bbae645f14436d312c258d70817f76178e2832ef7f6d8c0cc0b1bb4f7b3e551738fa45db9c23e3485a6f71bdcbe94d14eecc06779e4b052cee103bf9897ec2639689222b7dab780784998954ad915d5a7af12a236611d6294aa51d455637aa446ae7a3df575ebde741305f05950c2970993418737536819a7cfce9d38ffd8f221ca22557b792077006c05d2120be33cff0014bd83a4da9e8eb642c248534e3a522252134fd09f72a4bc5fe47bf3c0ef0e5e55ed223ab91ad1c975eb8d4723a16220d41f7b60b0f8e86bdccd9feea1d6c015cabe1dff4db4f96f2ebf10c4a151d82b6f2007139a3155e1443583e5cd199c8d3cd97bd9e0958d0f37e6d8b00e723caaeabef9cfa74472865fc631c18de12a2f72e544b2b8e415135609edf5b32b17070ea25b7e1d5ac7c3f426b0682956f361368b80711eca1ae254d05879d8a5f0a9a3743407459addfecdfd08c4e99f7e8c4e7338fe5a6f23e4f8e22026c5084ff871db8d52672d3ba0b0f442bc14e5531983447441b4fab8810ce84de2c17bbc5c3f806d47cb3a6a1266b26437f44ffb6e9da63a22749361215689e8971526c03dd60bdcceb8eaf0bbb7e0791fcf06fdf564439489e164a72ca06ef82c0a32e203ff23e3cf786557026a26865bee31e115a0c0895e4492110ab03e8589e6c7ab168070883251d22651492b95d399f9303518c82189e54828234ea29896f10ca2df219cd5df8c59e60f1a98ad6f188671bf950165f20cac72e04442373b752a4fc4ac4cd2be70241ea3a614d717b2ff2c1adf135c8101e679a759c56d60b8493a2ee72a86b847585677b5481ab3b08ceaaebea70f1f0b1fc5e154d43fed038fec869cdef9b3572017f20fdc7e2b5a5731e3fa6584b2747fdcf7fe16b7ca9e27ec3291103398eaa2e77c7b770b67f8858c215af4c523822d484f1f34dcdfd137c29c8f673d504606517dc2c1ca4fd24180d0a7fdda5b7e5291537fd5b614e4e8f72a5d8b1ec2b375da5dac64c2cc30b19758a927c941b0153d6ae5a24e521e611246c525ded57b170c850105fbc459fd5821281b9cbc5f9fd6fb1a42ab7fc9cb9b578ddd8673e5136e5b894f7e21964e4b93ec805bb6d417e470e75ed5852b4d1ac57e5a1c83389188480ce752c92fccf917bcff0c1658a6ed30129ed54a8c1018f76045abecbdbbe3b551787fa66c9ee9136240b9c431747ba363a9b2b8363b1d57fb453898bcb7060821a80e9e94eda3f1a4ea69a7a7a81531a42874b670f7af4c1603cd6e7cad79ab441f069bf1e0b0174ba525a9046b44429bc2242b816c583e7b26715647c6c50482866f84c9a097ef1f1bf4b18ee48e3e1120c901b2c19f95f0572d386329717da38552416554e0dfe7f1dea88f3c7e8dcfea6b1f4b1f0cba3e3e08fc1900057c6ec3b6b90d2514516dd2eb744d9a99979ac7126d94ad28132d820a8bb1700a6bace9a3d6093bbaac776424fe112769c53d5fc7d3d4947a0984cc3bcb73a307b1259e217fa0bd5a58ce4f902e220a757d7e5b913955fb8b050dc3a4a5a7c184b6a18b399c1bd37dbd3a3c37edca6c4528276379875d0be16d8e104c0194f109e2e858f216c2a7aa4382d322214f75622ffe1e86a535eb06aad05a3bc8835c1f9dc1ac55d3dd5e695270bb58b3fa4c53f8cc35c07b25c582259b4a7ae0bc2a4d4ff62f68bcb4234252ca9de18c131aa0ed584f2ff274bedb45b688103387821c604d8a35b98f1cbeab5920c692e206d2756c15dcf06c009b71ebbb05a82c8c13388f65c4b3b57164c5e5ed0eafae3970f7ce2fce5e53b34913008b6226f272ba3f84671b906f4bbc0836abc1cac1db02dd47440d2572fe6e92bea22e97235999def339443a05d24fdd1303e8cb6113108e9ffca22b110a9156eda571e2056b397ba5834797bf2da4aa459d8a99d70923729e01945a78ff3ac7553f33efe1d0218063ec2a91e48544d89520af1e6be6c2f10cf8eb99ee04f24dbd167da6feb0d953f31cf70fbe01b5d0c8355f4164d27673b08cb0cfbc413f50efd256efa632ea5e1dbcb6f893ca81f9a983a3ea0cf4c6605363eae62bdfac38b11cc7b21f7edb07ab746d36ac072fbaffb38201a9753a20bd25a1c58106be6dcc9cd7d7b2bd34b863eb26b051e1487d916c056f847c5a1bb67bdd5406ddff5708f98e46a7177ed80fcae84eca8053a92857331ae532afba060da77b048df65e2cdbf4e746b33fcf75b8bcf85e0bd8a68c1b14eb13bfc06374820622c13d2beb02ec12a2d6ba02045e5ea89656aa60db8561b0ca584a157fca8203318616276450d1ef60a1534ce19163b710fa8772b2dbd110a0fafb3777ceb7a5909b407133df359307eda7a7cdd871ee4e92c7969255123b5342fbadb149c6f42848e291be77be078103de9a30f92d5739669554e3bdcd39cd7872ff97025af8dfd525106fdf1452b42b1fae73bd41f9b7be17350ed9a913f4e488b690c319ba9e893075ade1e07c8aad9269fcec55dcb1e175c079724fd0b2ce63590352ab414eae2c48df43ca8eead06056344e10091018d87e8d4f6678ee7d2e705a78b995d58a40126fce798fbbddb1fa83aa1b87baab68f5b23a9714903a0f84fcfdebbf1d659559c44a9687e71cacdf52ca1d5e99e24caf51f98aaa7f4d2e1c51a9e8c60c8952a8467fc87f55d57a8c0774bf979404ad34d055e645a5feb4c0c14459b28c3da0845d35b87ded5042890c71a939925bb20a991654eae995c9f8b495e58c84c8a77771330e8c97d42d5fc789824c7d2d84bb12047ba33359944d9265355bdb738e08ea4271b13bab6395a283f3d93cc34acfa5e604776b933e46c37cf0277b867ec0302a89f6c11b0bb30329a3e6b7652dccb986966f7a8bee6cafa2bff84b499e25abb3ff62116d4e4154413b7ed65b553cb5aada914689cd45bf9f4ad7330317c1c4a47bfd14e953c8fc9462a681ece9a6031b77e7b8d5035b593a38cb1bfe101ce1c7a4d0b0d643d063eac168a06111930aa11679b8b6b736e73c32ddeb80b2bc6ce223e2ce7e45dff10bffcb1b02f78a32035f4d2f76125ccf6edf148bd2242bcbbe9f3c5727827f0ebec5d7da17c013e30bf96d035b3b577b95e878e43c8ff16823c1e4311a213722ccbb95c5e897b6857f8de11eae5aaf517cf411dc051b94a9d931e4469f4b8f95fe880cc5bda2fc8028c2af66b699eabbeaace85c77ef9ef8a796447cfd2810cf1ad545c0dd096c3dce41e1c5bd1e921fa6b7044dd83497bc56990abd7edf4139e849469f91f58f2239b27f2209112ee779bf6d957111055caee140f06899ab39328d194b218eeb9830bb8f64e39b477a2b692c1e8aaf72427717edfd047dd438be48c6abd5fb0a087d071b7593e46440845f48ce6b3665d579e21acb9ab4469f552353a6f46574d8e63c2a3c61130da14c49c98f5bcd677d7cebce44726589d4bfc6ca26c8f3af723403c5a19550cb054aceb848a49cffa247d9114fd3b92341c4d8321297ce453c2f03f38c76c524d447971ce18cccb5aca355ebd407d89e4c2c029451aa1dbea09ee5bce54d97a2760b4cfd415c851104580765bc54e9825fbeebf7cd4909a0044a50289462f1cd545e9463525bee9c102e9686ed031455e1433b636dbcba75d2fced4082fdf92cd4081757fbd330dd39edab57505b83a13a849ce1194a57c4717a640b9566d7475fd07ee0240a725ce75ceddecda65bedd146b477b93c0816498c5c91b6e4b4a65e7f7107b549dda2834405254d2ac7c210542b3036daf7f2c2fc7ddbcec1b8d237dd97d397d89936736d9a34b631eda75e75aa11766c49e0449170f0c3430a5254b2994cb0ffcda0219f5511f201f5242370d924623a29683712ddd97fb3d3ae1bc61e7ae906a269f3a2dec6e7e208c1c80e5f70e28cbd1303486b9ce8593a6ff6e1cf662b343f18533ddc5b7f1e4e07b317e5fddfa92d6810fbc343e87c681c4cca54175cd3cc35a83af7d6a0fcee7d4d5312d43fdaa2f0c7f28dd56665843d844a5495652973495a5fd84134c310acfe898ffcec6744318ef7705b495db75a082978e92f7f5adbd17527a322bcde1a2f83037dcc983ab5ced014dc7baa29fc3f2f671aa11ca97374438b05522f7d5146071760c9b4ad04f0462260e39401aa9123c930a24a8999ad93ad6eac6318d9adde73acca05c4a45a2142f0696568ed66cf48341c4f22d6e42b35e618a2d538cad0be69b6d1a81f76291b92f563854c26f98a2df6749bb17fd4ca767e32dcf807a4a09f776180fdab2656506fd8814f396a372318011cb3e7561424c65c56a0cb24c357f4fd75c460df9a32bf0a837e08eaf81e6a3ecf628479bdfad8686bb97d16cc9915edaffeff1d903fce42b462f9417527d372da49be056a009c9e42ca8743666bc2785532efa8e07f82c73b82753655453ee765edfec1c53dfb46045b507337d7e3e78fe9984831fac4e34166e592408190e399d8aa7676b9dba7d8f5406de7e4608287aa62c52bb97ddcee97af1de0e2b2af9d912cec257c260ae71fbffb1f9a219162fdb5e677c393fb699c3d9fda708c939aa0eaeb798fc2b7596135e387020f5c4b6af974bd20f088dbfdf5e0d93306d6b88e4e3b1af999f655430aeec623102b687a9638a4d97acb6b4341a7833409c21ee1bea3b1c2910f034ea6e485060d45e1b4f4f7d5f51b0b42f588be807a7b9df524a4ede6f394498c09728d6bb1eff3dfa17b7cf87cba92879b31eb790d46b064dc67df609289ee18fcd4b1212e9c7d8ac7948eb4773ea663bea6f716f6504394936f42c8aa5744ceb035174e85fe2b09b0a5f4b1ed9190fee54eaafe3c839eadd024ddc540e894d7acfe889bbcfc4485e4187798e69a987f9891cbdae7c508d61cee7a005e23255b7895ccafdd7d1225e953df116a41050f5fd724510000cb37fe35df200bf041819d64ab34ef6bdb1249c0f4c3826e21d5c3887b0c8d1b2df9fe61d5ce50372e71a2d1edcffbade8738cc57d57350932fa4b0c99b299fe7744a4da24b234e035540f46592a082b817138cc44748cfa81a580cc46ec2991f03f79089473bfd49e526d2ab8ed1ecdee34d73c0fc38d2956ffe82e496247bce2130454edbaf9f9b19243e5d2c0457b76e3f07da7ec427ff9300d9b6cbbfa6793e7cd24f62eeb38b63d19df6f49861d62a60cf7d496b3e2b15f777c75a04b7a4ce45de178789c7af47a787f5733e89bfaa7b2125d69e73bc7b4ac372db840dd55323bf43c3f14a5b472e62f512474dd860b6a360c0fe673835836365cace478f6f8efc3072c5ca23e4ced5727c431cb4efdbdcba72db8702d739ddfca233c33775f02b8a4e77b5ada31155d9fbd274e9aa33139f76e661c0d2c679c3ec652f71f8efb3ad91779b4d049e5aa82b45e4cb12550e8c477f65e6bac1ed4823d2daa38ad62b070645f9767bbe5a69754dfaedcaca240d6f3731d8e1b49ee5c2fd53608e6c0842f7834ede8b09db9a842b15d6360aeaaf488e243bfa0715495445381d85f9c1ddff8009d9b4f964c7b29dc408e68fc8ce8de4db746631d6df525ae75ef407ee3488fcb8fc8c157c5daaf693ea4ec144f789ebb616b8dd5a1437aeef997b2ee3e31e39eabb72d688e8b7c5f41ef167f5c6d7035297646225849ea1cf416dd7596639c80d9b0bc520d5639c630b50cc41a8efbc2f7aeb58afacd1e3e50b5e89a53a7637a01fa969cac058ea6f23ff66bf0a5e86ab35c0397ef98be5ff4bcfbe6ddc3e0930bdee2ced25e220871d5fdfc4878de3545c857d1a0727184c87340e09d7fbad3dfa4c971e62b9ef394bf490089d1862c953adabf7322dfb7b421dc10f9a599426594720c5232a970434401ff1a7688568cfab4e9d172b1ffa010fafe5afb27e986f505277d3cec8666ad4d7f652f8bbc104f0cd723288f657486c033294b09cf2811ac4acf100f3de642560ad1c637640a830a12cf0d20ef18cc5636cc5beafc342e8dfeb078b99da94b4427c601365863dcd8213fe90da7742ae58fadf370799395d0ca883a92af98103f5facaa2da001a39b8cd984fd9571e795c732dd434d2b8e9e37bf1f437a9bd96e38ec87c742ce1f7edc07a599c0f54d8d65c5e00c80e6601fccbdef74069bedf93cec61aa48b19aa69830168930e9a2f6f1cdc3731bab557a11eb72cc5c7e9509f315ff7eb9915a3e48bb9d74ed362ff7f3b24f1f2561b3d88eaf6ff4832e19c6e4cf2bec9e58a86c7412030300c23cb9f4db4cb9a6f2c360cc72b0948391c1579783ab9bfeedcc58a59c0fdd707711647cb282e8a745cd3b529dfb536591d4e494974835e1380e2c62c18baa453cf51f119eb8552e421990a89619d930159c976475ca5f5021b60d34e93d1487f832123d07b8a846d1ee8857c7d2cfec045f968e83f9c351900b25a27cefc13f950e6687554888f4da964be696eddda24866099a2b9d09ef6d569c34e2675975fad24377f1319d42455700dd6d34aa59c8f91910d47dd92fa0df9a72846e852f0fc5d096413a9037fa7acfc5b36ddf196c60ed79e562d91b11ee46e5c8cbed77bc31366bae2d09dbe246e124d06123ea1ce2af5dc814b4baa9cbc81417483854e95c9c7fa1d1af37e3055e852cd81fd5c0c88442e45b10144ebe4987daab0ecf7e8f2b5880ed2b52e6fd6e6d2f9a7be1405b96b2a1ff9632e90ef1c777bd19ee63120b80b44a2435d4783766416ede1784e00d3467c7ed1b6304e75b5846febb812d637fa6b043e693bce4f7ca1df07d75a211519e7cbdd7a2e854cbe30e683ebe285bdbbde6306f0d119ba932705a1ef9e8c88faee6b06f90025fa082dcfd7e034a1d1e60b692d728c18402e12cc4fff9f95d7900cd6cea149931619c79658339ddcecff9e61227ce13c98c3f1cd52a5e1ef694faf9995015f6f19698ae495546279977ef3f5766e64e8fcfb50736a60e9fbc6a0532e0aa7d62c8c8e04151fd1471a49daa890a9c58bb0152a9b48f7bf3c4d6828a3fe9ff3323de7edbfa2482890217c9928cd2d20ca2449d84ec87b2f4d56c64efe95b571f815a40f1a36bec8f241b840f0f580fe94b8338af77c651f819a8999ef8deba29c664968a02cd430d1dd85489dc435bd9fde4ac901df563e9d9b0a8fd341c31393826090ee1f390ea3675c468b93cbec4018f7f91a6bcedae5dac197664bac33721c520e50684db10b71a59146feb4190a0ad3c19d9c2f92fedc5756f5263790bc76c647839292a66e8f19df5c6f7eb261f66688f7fb08e54d1224252c4bd599d73415b2d448a87d4101f17738509c56ec9e18d5d602db50550ed0b8683706ed56c6c8f6dee4ef94279cf4ff776c8d550e54732ea44e2752ab34b55735725bd9cfc1688a1fe1e89986927cee75fdd25b5babfe09ef376d6ab4366aa81078450d86967cc2f3da13dbe294f1bad09efbd8391721ee13492e070456691185d342e73fc86e58173801f9d0170beaf3ca7a3a4b288741bd1de9c61047393a01fde5f53fd9c5bfd6762371b38b24057bfade1fe65286ab490011167c7b337811629ec62b4d0b40de3f08b21183c280c5ca87f7bf27a89143aa44768d55105230abedc86684b7a18add22698e737fe35d9408302a0a758a4976e474d777385efc34437a9633434868eaf0d66eeca4b3cff1ef77ab9d760ca6e0818fff542404b086405b2ebb46bbe4e2f4a75751e958896eae2cd833127ef8819c26597e5bda0a2c64f8949f3a62ab5fbe3abc45a6781664b4de247de377cae4a4e66a58484575a111d16c5186d318bbbe3f222a7468f36ea3fa14c0618d7a643c3ec66491ed6f6ed7541a64c483b97164f31d92dbc1ad06fc0f2dccf506a38ab29de235a12873e0461f236b6c0b0a2b531502f13508afa81d8bd3d64699c2e2b892324dfe8d1fcfbe811bb7f5cf9744090366d828b477dc890eab8ebebd44f6aeaa5b101291bf67d12867ecea57cd55e75cddaa1f3b921eeef61958d5c7c6211544b12e75ccff530e839c7cc22a28db7e7fcc0991249ad98fe0b1c7146fb30c7cffd8ebb0954c1bc7112dea05bd363f4eeab6591705deb70c4ce95c030b9813564a36ea2b81222cab6fa0a74d87821bd92c212b2935fa11e499347a1a31e1c021a26fbc6f271e002bdd7946d22f78db9dc2a0f2405b5984a95437b3d2692cbd7fa6c7a4f3ed9c20b9093c4b5c0ba7091d3c9a40e4ec9989bb1c479bb417d545c0a5e366525b2928e3714e2743a2791ed80881998f40169b9a40089447c47803854e4762e2e641632b84436d119a8ba73e94fb5ec81c7d24d76ddf30060581714e0e781d5e15717a01d0908f5e3a4b1ce1807c22f7d829cff2f45fe167418e197b44da080c6f35c7f6e4d9f0823833fa41596868c6e998f76d81ff3af40f0a66ada001b5866a1af78b1f744315eac2c9ee6e64a29de76735b79531af24d462d345ae63a8448c7d633f0ef3f981e89406395de552e5480105518c8bb0822833f9e3ae9452cf4cf9a57321dd866ea81439c2a65f1c4591f2e0dbf681e184810a45084f0837af31fc38c806957c34bfcfcf0ab65641374bb942a751a8b4b455324f140e23d94cc21197ce1bb03d6c862340822c5f7422dbc0b5543c649c9a3b6862974a9bba2073b64cd5dfb25c8e91cb38b966df2790c8b5b362f54a1b9e9a094a22a2c45cd2dd76b27fc1105c03690412210449de29a8e4c7444addb43a07914016953233cc55cf733c7e5ebe73827a67597343fa25e2ea5b887b73f914fa8cff13a069c195732d098c55f1f657649a92b332522e4e0d330a9025b14c87e978d18a32df9896bc1befffe68e861785f14ececfd8ccea9e6b3f0bc82a413b6ad161eafb083b68a7089107be69003c7cfad62cba5c68840cdf734bd1235987d5231ac63777fc83ba9f87243c35d75ea033d33d705183b2df2c41e0ef5107f5eeea86ac96b38e707d4d4ce5ee598dc69618b071905c90ff9bbe256b6117df1dee941ffe872f5397557e5cbd5368863cd536187978e232b2b921883bd50c31687acc514c875fde90d9bf312af9c772f9d40855a5b866cb84bde2f4d2c982c15e09dfb50725d991d5708c64af401ab6b6190c0296dd7eddde207f05e0ad3fe167125ad5ced1011fedc07251cad4c6d3da2aada9cd367eec37775205b5fe88243c3ada1df4178adb323feda30e16505cde6f89b5a9720b791928f8aef33bf00c25d9ba082777cb564b456ab2d9834bb44b8e1cb0cc1e88f70bbbff5c08f40c0bbc75872ed9603703b187861bcdaa0d7ca9dcd315957a9c0887b6d28767a5309578a4ddfc7a6f7275dd6cac484b093a0861f2496ea634a900059ffecbafde025bd2de1afb8b03f22f576b69b2e21f55fa1c54fc266ecb34801dede09341fcf5a17387ba96abac3a92981a3b06136ac5d4317b47d76fbcc2fb29072478be808f18a34859782cf6b04217ef9c9c6f6a1df929ebc8fc2977d8f3cfa236e6760733140a8663fabf41f7a06f51faf0469bc30b9e1cfbff1c8aeaec6a15a457290f964611c86698b33c754006e7f2ac497e697de6956d6ac9647d6790f7d95517f80d014184ddfca934bdb36728001ae89055b2abcb79d9a0a304d7dcbf626af35f1bf82252368111d9354d1888afe694602c5c4645cd9642b515bf95d2bc032bb3577d3ca70cb08d7870af83905e79ed6c61dd4e9ab55b102924a154e862b821832412e909cd156cb1044d40c5985f44238ab84d10ed82a95dc60fb246d2e4854d264bbfe0f42a30114498d89efa014913fb6faa6ec2977ee15e7d06a4a932c78fc2aa49c31e6997f7c624a382d00a5cbc5885eefad113f152725bfa58420d58b98d90ef26b84de4f31d733a27c6c50f9b167d935b8582a10f863ed5f839eec958dba238923e61a791af0724e45adbd21eb9c93ff77c6e2e972e8851fafd4189fc5150be8c2d2f6031ef52cc4ee8b934e5a6eb3d551220ca87cfead6e708c02af2732ee97b11119f7272d8c8de1ce7b85e827613fae365353fdeb8dd32e8c52d09b58f31f576b2d5c1ce1b730843e1cd07c0ec7c6f6c85cf4dff84fd6519daf0709d042071ba7d73be459d83541a31f36fe6a0af192a1d292096d18ff4187c15e59e304d7678fc19b69dd15257fc42bc057845549e8895b36639213d7661231dc73d66118a2e9938492b59687a56ae9746da4ce5561489fe7d5ae65e52906a78940f48051337ef4ff472884e31d5d005c29119d9d65a548ad470b39b1f02aca6ea6848a0a84168d12707f07c24e6519807315eba95d69fb90a1efb5c4244743928ecda6cbfc7906c8f60346aaa04adce634f6e002af5c6299cba301a52e25b9fee118fd1d036e0626bff96a267bd3f09852fda32fc54625cfad6f46dc748cd5b885adb78701be3536b4ac9abb47cafe9eb7725db806efec3b309aacf260443fca64d4fb925e313dffbd63fff36cf5adfe499d3526d91f5ee33a6e5a6e59149e3b65d5f1c4838fc389c365c155521ca6c2f2c554ffa89d23d1b43179d8c6c69b146ff7c2a8d6a072ddacfb0769620991f29934e1ceda32e40d872c30b91120dd5c6c8496c3c02cef02626df9b80283159426300518d7a6499d99a7a898a1eb0d1b43c2949faafae500cb03c1c99b51dab28002e86706c1f98bd4ea08fddeeed25adcfae5c3fad3fae0d1058424963c895391f2b142d14a9ddf1f3c797030f3d5201f73b0b71a7fd6a95bba6d52590cca80404789329f0bdc9f61e7237affc0bd75f4771e0470c62263506ba1da4e894440754b97bed9ca5fd584312da2b31f3361434c5731667086169a604b44dc7aa09b1844046ee550cd886f63c071b4d5dfedf43b82c66244a9cb20e191196aa98599127bf7ca2c65cfc10ac4036e6bad6820ef8cc84bce0b348aca369be062dc9c434938995b16d00d873d9e1f213e6e77031c875049118dce5980a692212bdc8da0a6c311a80c5b2ee2f0373b1296dfb39c63744348939220422a7a9e652d71ffb81163883974ccdbda0bd980cadccac5f5ad9ac8cebce2d24cb0fbe632d0629a9473612697b7ecbb7876ca16d076f55416e0420865f4448b7ffa6e93137c79073bb20512493e8377c31a5224acce280905e6b42a94a382f3e4f11ecc8d997ceeb5b89775d77059b6c4ddbbd2e74a2d8ccca53857e43162b3827b52ba2a8f34f60b6b5f76cab4352181a84b4a0854cb84730716b7db06ad736281518571c669c844b5a53ea974e15f04644cb19753c99900f39571038a2ada8aec6454eaa7e30c687db0f4fc17231955f704321caff0747d50feaee426a39104a2d34f1e98696980abc9c14c05c4f77a4bbcf220cf08bdf10899950440de40d88de6a09402c587932638cd1fa58ca07d46bb1c2b1dd91b6502ae4fed42a58e0c94e56cd44ebd0fa9d8453f006142bd65d24bd6c3002a37e02685032792be23aa9e17de67e21aa9caa8384074a0b0f53bd6b24872e0c4b96a5c66da389af1a8b995c51bd428a3fcff7e58f705cb9cf10639399cbf2670480b8c98fcaac008c54260374ea38622b14f42ee8d3a48cf59cee528f73238f48ccc9e6490056ec9214ce7b59d5d665d6fc3dc42299b8011d49cc1c783547f182fb47a12becf0bfe65df128730892f1edf62359cf4b1db290a77b55d68ac63a6d6cc09eab092ff6d3803c9f430af492ba93433441603c2e1a467a934cec34d642b1b31338bd5b1df43c1f445c5581c4c7441bf81b61a9bff4a748592dc1fa31cd6a9db377a218b1b2e207bc3160b104be892c29dfc7ccf4ca3a731c0ba4ace947f7ef03ca3fdf4eba02946b34c508defae2e22de11b3c7905807960691cc3795cda3568b2ef1541541e33d608eaffbff6e1dc98d1d47ea93109c9aab892b45e6681ff76c44851462ba56491105b1c244cf689df147be9f1c746f26f9c9f15f51f9fab9260d429a9ab38a500dd9dd4a867a168854b8a250f52c8723367aa5ef9c283c8603b0af4f85d3883b9d31bbfb8c172f71fc987a64e4dfed77abc3d05c909cee454955559beac357f30935d43e204dbc3f320ecf43b235a70ca0cdf90ef5fe18de4126bae7932bff5f990faf7908c4c3dc3e42285527d8bfc85dbfa86d93f5c0383348689946b1896695e4d5160d254f2f685d0d010a6d3c9529c266e1312af03d67e6e71bcc00fcf244dfcc7bf7186520f88706b2259f275a4efeb9d29944afd42426bdd3edbe60eaef251e128e440f9735e79ccd3e1387ff129a2ca891ec06e5b430742b7094bd35dee152419a52547c69a656bb1e74646bbebf44cbe2cafb595d2d94891f291cbd5939f172e2e93db7daebbde48d68c78899948ba3548599166845a357c0268469a855820c2fb2d031d0df57b05297b73ded428899aec6e5051d9f2bfc1c32fe21125e8d77495517d095aaaf8837ab3c7200f0c313ba34e90ec364b3e0fbf691cde07c9b1af8791a7d70734ad202495e0f1cc7c57a3e78ac1aa3bbc46b251945565bd6335f04c6e021a862b2f77c1b26fd87ef15370339360f06cde505614422a2c895ddad34e671a286a16e606dc99b22898f3bb0d12090d732c29e16781f319a72e0216d517ed5ea525506749dfbc5676ccfc04f6fd5c15870c1770633517926a0e08805233914df54a9029ad358adb476d82b7ba7ffd17c07f2f93d5883022f99bd99de72bc376bd3c3eb3cd9885af2f1d2049b3f46c929417eab24af5cd59ba69edd6006b2467519cb49c17534d40723e5d4190054b049648d15210285f9540fabdaf3a7c147e46ceaa291700424dd5537215cb2ce8ec3b946c09d17a576401c0e1a001c9144a215478014919f515bcef376cc1d5f6b7f88d23301b765554915ec25ed2ecb44965b0c6ab2a2ae6368d83f58d108ad50651959f6b3aa6d9d5641708124a51750a8885ee9d369d863eeb94351d33d60445db302921db864564ee9bfb80b491c6fc0e36784dfb0c658d4ba29e83a8221504f9ff58ea5a9f3891b5504520ce183a9c6b34fc33e3d1f4a022316a66ea0987b23265b72b544c13da4cd65d58e37f306a2413e2e58d88c425f3c3411d75f6ccdc1 +0xcc785d5ed3094ac12e2069c46e3b81fe9830ac5f7d752880ac683a7c80433c8d9b2c9bf59c8e717af3b730aecf76dba6de4d4e6d4cf9fb60f550c6eb77baf5e2 +84184 +0x2d01188eaeb6996f1e6aa60468b7894337e18139f6fe5c4ffb5a48cdff19e79cd21ea1504c2c3e66874bb4c94b6e3d9bca52ad338ea90362af783efb49be72922d561a83d71eb037a1597ba23652a91048439d2286748a13c8a741408db447e8a8712b3036d4166ad35ca4960eacf2291a7af90ec6a71aebaeaff9a5b3448f26aa367b5e51969987871bd6aebcc4436fa6bf6800358ada71ca581031a4b672d59a6eb31510ac6117245fbaf128e2c26955dc92febd65f32d826a2bed4652177ce2e17a5d5b5d95a212f0f8673a4e979f8f972013457f8ca73facf5df8260a7a3e957793f1af35eaeb8963718db4feb99bdbaba44b621ce686ae71311412749d2179858c235b4e3c580191f0df12fe6e0450b079bf693e1f769e3308b69f02692d46bbeef94e94d6ed140594d6534affb9153b01fee1decdca668f253e303656a889a53cc20d9c33213d48de020a76f7207595cd8860717a0873e017398a830e39bebc064bfce6e97af9e62cf09d04dce11e7b4cfa7988cca762c06f36f27ac837627adbc5a0e75270b63812107f6729516c3600b371970e2dafca9d94fc703d57f16c1dedae2016a90ee92de046205527eb607941fd2ee701b74912f22d15d5e1f7fa5d125923ae7a6063c0ee75d2f8ab0885173480b2bfda15d67fdcf8de1a8be2b019d25664726b67227ba982d18c71601e8af990c5210d37ed2493e43b83ac5e37c4bc0a651af26fbfceafe1ae79017e97150f91c89321ba17b1d573b099c9a6dbee1e0997f0b606963a4036ec56e1b07975f5285f8eae08c098002bcfd57a791706a6c88fac1ca8403f28e6fd9e88a24ffe38b8dc9c08b08257b2710bcf253193aeb4cbbe959ce1385db88674c86cd0854e48c7d213c82dd7714ae7d6df505cbc36e687a755bd3e09068d79c45d04a7b3c6b3d9d2be72ed3a6557f4c39e82771b4faa80dc65041b1cd9f6457ed4f6a455f7e86340c48f7b25b4682c5475420d1b498f4bb03c07f4fe48a17df6b8a952d67284f8cefe846413deea02fc0c158b46c4f34ce5531f7827c31d87ee80934fdf96e80ebfa4d8149f555bfd4cbb537e18327508ce32d10113d9a907a8c55ad7bc05a019a550112922a83c8fa91ba2522a228303ed63b32c6d1cf251c7ef56a7061f3bae1298c5fe48581a4ea39578a3d715bbc2b55e4c567ddd881ace771d1a3874193079e74d207ae5639ecec15cefb97c7dd9d89ae31bd0cbb8a72ee524cded84d7556db43d1c24c0a7147d27a5924bd7479da9923df9003822ab5bc1f42e7fc1e46140980c6df07a63345121093808a6b792baecb35a86d3548bf78601b879cbcf08a4fb418248930662cd55fe5d6a7b3c6d8f02d9cccf0daccd64b9e3e8660305900d6662f5a77b3f44542eeb5f0bb54462986d17dc6347b9d435d5f15acef816bbdc51e73497c34c4d882456c946f57e366993f3e5ce21fa54ed52e07c1f2b70c0b45654cb83ebdbe2dbcec738b6bc384d650004957a2cfcb3edc907c8c10db26307ec122706555ca8b196c309d56a011c2d49b047e1b92f75d990fdcd6f2f4a07597bd5d3a9a05d03cc14b0d91d9f771724c98d99bf67011f1353290673f0a6222b9de65dc85d4b886db1471319bcf8e2ee1802f74da710243d781fe07a026547f0baea21ecdca6ab28f4cc44345304f3ebbd96dd3709eb09ba8858f7ebd4e5ed4b6b47dca1aefcf07077d6d907e229ce9012efd7e60fe0441d0c5ab933d8d6868e1785ca6164ccdcf682ed6e0efae5d79dc04463d5199e67c76cabb10c9e85a84b583a87c67e84d50dde866fb3fdb7a3473e5b0daec783f95c21a25bb08691c705a5cca12b5cb38d48b3285a817b2dc63ef58a31bd8a2f5d4dd3f535ca3179674f78b2830a9fe74a19d949bb11f39694d77e687cabd1ff281efc1abbd41fab1d8b4992ca0ea88ebff399610dcfe7a0a3c3415c4ad45f81ce41f2697a58b1b53e3ba0d3d292171833888c14df25d7da8764d70c28d16345d4596f87edb288165de316fc292f6c22693b19cb8bae3482944eb7cea31d8db9ceb7cbec828c134d011414825a41082bb57dcb0bafe39e577ee36c3a26334f6c11ff801dc54fe3d7ac4101ecd2718b92acd3383bc84065c78bc55cc53e9d18cb3293248242786a34d3fc97c22e3b56f5b3ddb9f2415f3b316f6711f668c59a55c51531b0769026e30c992e78c9f90ad35eeff8c5b79a8f437e3b14541147149a3df8302ede119a70aac93e97325517aa22ac5d0ca78cc27c5cc3ec54e49c381701ae9863e587455c52ef6093f3b9fdf8a3755f5d8da0752a7f93f27f4f3f754ab4bae2e6396bb804898e0d058aa22e3d35ed883ec66037fc5b2ddf49ad9b5cb3dbaf983c26395307b327bc42739838e66e7760070e565b5073f40b3aac4a4ed0caff30cc487aa6e4643ef6f12b26ae82b1a56f6cb20d8fd55e78fec8b7c6cc20172c451d1c9a3419115645982db7efa0a3fa1ec65dc025e97f4f327a5c9b652044a93da52f228b244ee0108e07e68cbec9d7e6ba6e48be0b5ac93ed60732aa6fe818830adcae0c84717ee069261d063b77d16faf6ff1c8b975898c524416fc5d55dcdda4c19748b82d854db024d5ccb55279121bdf45d68263f293859fc2eb77327876095a78b03de785b0d9609b70aace31668638cf57e48ab6fcd676c0e85be26e14bf23cce3941412a26b85f8728a6f9cd58508f8dd5e6e2910cb659b836a0a40121ca9fe5349579eaaecf15752e2ab0df78ecc5cc76e92db87dae8bd3d200e70f6d859977fcc069c22b43f428231f527450a0f55b6837d40ca9b8c90862c53834b48af22c9aac59db277bc4490f6f25b369d2e9e1b3ba1fb4173addffecd9df97804372ae153f905c29e14d7ffb0172c54aec6707605856d94f9e8d5f7b2324625817e0a27563586ebadc5673eebd80d27b54387576fbc0a2da4aa2d0148b4fbac56e06b3c3fff73961d4a9ccf08b9901857424d2fd8aa6383fa8e4fcc1f9a7c94eb1aa8706fab6e4a6310c330953037aefb2f2c6feed50c2061e1a88895575b77b4695c6463edd98115c485042fd076641786cfb7f0c0669b8160e1f758701acd4968f198bb2b47c2bbb25caa271eded042d58168bcf1055dcf786678b7893cfe2096028de3e83b97bb76a4a3198fd36bf387fc2271eb5adfa294b08d50e73482c08cf9a46ca917689b9e177f8587f6afa03a9a55de13f9a9a1425ab5b32e9403af9a517cc3e27dcde2750fafe9abab03ef59d673400f4434520dbf824cd3cdf9545aa4977828d13016a807a4c47f731117625b1b5631dd182b5379638c5b54cc455a6d54f7f0b427aeb39a0e8457e14feee072be6f2016bda3bff2e9f049cb04f9061665c1be991d2114214dc7e97828ac50c7cd196ea3ad41afc6761703932bf5da2a2a73f6e299043657d30d88aa33f64fc4c7e351e65f8baf6ea87f3d3fb9b26333137d4e3323ceb6883ea3d9e9ea4319f45f3b8e615ce83b55e1974b3326b52dabc14c090d35f7014cf14941c9c4195bd0d3a088a72dfde006c1dda2200b84960eb47edbd35803a3109b5c54cc49ff91d4c5b0b52a3b231a0bc9d0f668d08728d65d741b28027b187d9d6b7763f45c388ab5cab86d1cfe55ef5a0fac700e63728d3cca6b6dbdc3ddde57e54e234bb5dc6d147cf6d23bf6300bf2f838f81d7fffbdc2f03136e2846fdd8b583d8cc8a2d9f68235f50c209124ec45192043a6533cc29073f0f629234ad58832c9f2f399ddb15f94277d5355912a90e0f7050173964615c44f3dfa36fb60df137808450134182d0622a85cca212196ee219ee757a8b2d36f9070ce15fe0a1068dc3f358f99a57b0a6b1fa555417ba7af4483a085e08359e469212d66cf2b9cb14b0a6d8b6ae3ba2f6535b58d6e934392b445c574ea5209b13de190affb60046b58ec258b245d7ac3a5ad05d925030b470577debb0289736483148047ef21b8159a772605527d3d95a0c83edef1456f1acc7c54aed5a4176ced4c74c536fb584e641dc79071bd62e3fb2998f55fc4dfac5dd5bfe6e03c7638b0fbf6ae4f5745546a5282a30eb88b5cf933dcc2cd2bed7a5e1688f9aebd005682958e69b4c00fe5f1b7ffc385d9375f3f9952bdd5c508e321b1383d8d905654d6cb949df3b02871bea0976873a9c76942ac934ce63ac2956d2856492970d8a231e0b1b178b22f6605ced2085494ec1986f026f68ae79aff750e5b92feb927cd08875e2ad04075518b754829b544e5de910686513076029ffdb5c0b179e39443ef22028086e5aab2a4465252f2147526d55229d3834099e55bc12e1b178ace953a333749091c2017e4b4990ab7adfa90e86599f3dfe1b16e13b2ec367409373f9e5d74fad35e85efc14274b7525be69b2ea34f48c2d3f9a8b9fd939a0c095eb17fe3440c72173ca8ce628dff7ea8d9a43cadc238b891c303b323accc5be5b58953771cf461e0c4e160b74d39793f444a86e78b4a4d95be3d93a7a033c038dc25ad8b78492f45bf082c932afbfe69a70c91e31303ee7a3b84d00c0676e57d23150292de8136b07bab8698afcd6ad28268e222f1ec0799db97fcc357fc381d2ae5e72fc82324ab9b4a032a54044ae456cdfc199069458f0ed58e600d3a44b36406cfa4bda555b18e5236eab0670b29a4ca4459770214c455cbe954beb777ba6f0630a4379e664cd552763c4d3c480cfcdc5f453e5cf1d440f9a223b50a5dac9c529ea0ce64b2e7f0c955b1631a7e28bf72a17f2ec0692940dd5d5fa89973048c7a7e2cda9ee81d713569ccca7819e76d3bcf59f0e2e74de5e55f6b01eb445cafec53aae4b35257d71506e0cbebb7d396861d880d2af8bc90b04cd849763e0f8736c39d8538ae1182e6d1bfefcbb477cbf0206bdc0f29ffe1bc9a29f7d0ecb7a2d82287349547e505394eacceceac4e6de88c87f605d7824968bbc29581cccf734f04fa6b6fac5cfe6ad229b13b0bb20cfd966ee3b59dde485346449aef5ac18919ff69a21e67b3af29f0c96fb76f6d29adf2831d84f98e6efabe227090132844b766577127f6b3c7c54f0e22ba23ba345805671bfa56fd1dcd87eecf0a728e36a5ce364112d5c7b8eb316aa2b9e533bdaa637d579c52b4e54a380c0ec5254dff73bba89a758159f2fa4c51484d00643603814868d15940460f42fca8467801ef8fa300f5b685f51680f4648bda21b63e01e35ab83ff719c07b3d433404f724878818e1eb6c5023940dce26f5e7b5c426140e26de4e98cbd52c8b722a872f3067cb81cdd3fd8c6febff4deb1efc28f89eb8663f4373dab10471b20c04538ca000e8721757e077348ed3d8535f9e17ddf86d8ff670462973cf19557359e0ac1dd35d6e70efbbbd0c1d3a01e24043feeed3b1e00eed4c018ea551ca3a83b4e9e45fa8db4ce3f5da60f7805f0a59644aa5b1140acb32dbff5c27d994e41a56e2ae26394d1e0d153bddae45544e1395878d011264cdb9ac7f86b70f59e2a63d02d597bd3866a3907ddcb2076620074e321f442b82791a040e78e3616dc88fdde6f5547321a9500dfce8933529229cf4d6e70acdf87fbc9928bd2d8e64f86fcfeb77cd19ad788ad4557bd25d01c84d3fe24ec5781b2419c25ace05d4c4149e79ace7620f1036cc8a0420fffd7473a075f0e0f4c87f18ca162125fcd2ff8fc46197dec3c21e768d9585526c8515d73f4d6f38292da8c0461af84f83079bdc5a2e38a862e10cba569d559ab8825a45620cc9aed3160cbd06375cb538f11d8cc8160bdebfda8f64aff7e1545473b650c15aaccf63203f6192f1daf17f1df913a6ef8e0c4b1cfb28024bd539d0e7be7bc5bd651489caa54064e0df8ed5fcb3037ee13b9b8536f456f5ff9d95be4cd748f78baf189773d2ec047af6e7ce0bdfcea8b191270e96ff83e389b7026d21952adf6bc7462cba3cc6ea26ad96d7c9d3e7ccc72b1937eb713163709e0a6df47ca3d5d46a17aa1c67639e8a500673b533f1539865eca172fde1ee5acf184133f246833bf417a008d7449a0caac1326c744db5bbde3bdbebfa17fc9ec6b6876e9a855028f1c09f1e00dc55240a51844e298f9b98007137a4fa3606c3215f9112d9e2d511dfad07ba78bd5876fb3209e8a8295dc35917554c72dea54e4b8e0ebf44d17a9d3a376a6ca34a3c5bf9ed03aa849d84a464a8a520f87440b6c1cc50c24fe3c9118dea47a32515497982dd2222536e98d19fafb7f0ff9981930094e7da7f9c39154750200c5291382622ace5ee791f02d18696fe0b0cb0b049a4726456386d531f02e373f6c060610855b6bf4d8a217b0a95e8f7fd844c756109df36c42ed9afa52d2ec3f102e55c8698852eedfb084a036a2036370adf496fcd55efb2b753973e329c80997ea2932767b2b53e3055f8426fe7294614eb94dc5b50ef90567db250bfa74a4eb82aad715fb9d2ccee7d1e5e137841b916f3f02d306ac6eba0ba796330f9718f23eff3eaccf5080879f024acf18e2ffea58ae3d8e8fdf6331a9c650c12eda6e966651f0a5c0ed57f674193b5868344853512d875e1a50de52895fdb1f20e5adbd41c77366961cba03b03e40e4ee21feb3a1e466ab6da6ea05f39bbdb3ac5fdd51188a51591984af96999be2db73522af491fc64dd528a8c322ea280e79cf1073933c111e410ce41977955a8a5bf6fd4fd699d095c8ea4cec1839bab22b742325dda953c7145a175ee96971baa9a1f02b671eedc90ec9bb79a3aaec7cbc4fb66a5552e59677ea655833987c152cc0abe07f01865e233184fa69b055b4c8cc3abf9ebb3f02e8485e83ea94d25061cd90fd830422cb82ac29fcbedc5ef0cd7430a41e64c8a2e1fe536083012cc2c5434fe117795ba7b9b42aef27a190c736c228a658c23aece166e48c714fe402e3ac2919a0e3996944c3f8504882739e91509344d265de47933c925659e380872972cd25b3d55486905622ae76017fed698a00ee2fb25b4943c9ed5c816e9ac623219c93d4b1259649053a7854a12e3a2be8e230a55a1a788fa9461dac438b464d5327d26829750ecb4b904c48d4071b54f7c78ae7af944bd3554d081ef4ea9e2461ff6ff280db568383c478e73c82f78131117b7b356139bb5862aa7e15213434e873cb1869b1142e5857aca42d2a551d2f6070b48e09d8b41d17833e06d78efb5135823e46aeae1833ca46043885ca953d2509481be69f3a3ddc10d35c7624e436a513c8aa1cbadda09ce37be10dbe95f4efb38a619003ca1530d1d288758c8c0342fe6bf69390eb192ff39fb92aa77be120ee1fe18e8cf04db644b00d6e3c5f31bfa08cceabe6cd1823f4d413752bd38c59476d2e4ab12931ccf7f07db8aada5c5bb89f94be12f037f965bda265a21940f92df6aa4d06f18bf55a183bfd5e89eda7a538eb52bbf0d310d4c0c884a0d9c9a12040e81e04d596bff99bda94cdea6033d4dd34f2285b742ab062085abe8160b1bcd06a3621420c9d44ffdc278f785e80e5f104250e7cb5779725e44041acb0db6229931de2b3381dcab8b31e09c0230f4718cb53d4e0f1b7d780deedd0b8346eaeb1153ddfc5a3a1f96ae1f0c33e783f86b90d16f234d33c10176aabe23065ebf10b433e6ee5f9ca6f6afb48526fa8b203564bd70cc4b4a4df3e2a130ca1bfe3d79cbf68169095178b5d617d2db04ed76b850a2c8b3d206273897fbba688cce6d0e9dc736d51ffe9db96b717bbccc5402da9ca8fd3ea90f59b6dedfe5651f7556b874cc8e9b6a4e1eecb6e9092f1c66cb848ff699d79a0eeb57fe7538299d9c005d962d1021b2e60234ffa8039ebacbd99f72b524e56babe30141e63b1ccdea74e64c1345d0be71517b8dd6f1706f2c34118d0c24d0e58d4b9eed5a76a67908b93cdea6b310589513a8a99a5b0d0331e5c4282423ffd05d2a154bf87230679dd745940de44a46fa51a39b1ccadd3e81f39e8b25a8dcf4c2894ea3e9b6206052d7ebb67160e451491354ab85c648e8c56689fe363cce18656f313d55cae02ccfc0158bf9ad48412a5fa321fdd5b6c8a4466cc87f663d06ede4a6606337d693bb9aab5cce55dcde443f7844ab818fa7c79c2e3229ae918403f195553b846c5dbe6e947117e00af040babb5db8513b4dd56fb9845c9c335b4f9ce665063909518143ba12fdd4393ec5d854b44bcd228277c8f4063fb9895378ef81d5ecdf1439ac210487a8bbd0917ca22b918d7eac0e55aec7fffb8cfc3327f24ef014fdf7dbe7105a173f1c39b10d1f283ca6eb42b816291ab9b79df5c503ac36fda71b19ffd819a40cea80db661f5834fcbd9d4a496341d57a9c75dacfb5251f43ccc1e26f2a43caacd36e1e785a53351bfa1a2e8ae3ffe18bd29b141ae465f30bac78baf28397b5401f6e6aae681a15df86ec54403f6a243480970c6e3975989d6ec7094f8c1b4b0ff90827d1eeb5ba91899a26361e8b87bccff229925c5cf8413c37374fecd9756387c5bda9972a0e782aad0a332968f26de633d250f422f93f3b4facba4bd91c82f12c95fe0883f7de92ac6afe080b4e8deee2716ea9d085de9597d158532226b560c61598ecc85f09e91fad60627c81650e886db5256c836872970cf0aabb7d44fc19a63fe9ff2d42568f3b21dfc1753d6fac2eed0d01da23f9d8c64cf8af0777ecafb1baa73249d101837c0928e4105d38d61cde0c94745853e16832e603ae9659109cd2cf689afe1383d8dfe5ed3c0c928e9f4fc82f384ea73a586b1bc158e86ac2d04f09aa0a11b417b76dbde2e093a55d1f0ae9d90e4f1e6c00bf40f1efb6484fb6f9fcff80510bc8817959cde43a98ca04d5189bdea1e0fec7f5fd995a481a3fb597516fe508411d9ecc61b52f49935eb679fd7c908d147814d7f9c381e6091834f3b0021f7c7d9f762e7ca3ab08c09f9dbe3f840d5be363512bdd764cd83d649dd3bfc117f5e8d47167529e3fbf4517216b86bb3b537445e5ba50bba365ddaa570029b3b5bdaa46f83e8caed3b54a4eab4a7c2a03bdf0a9384cfb996ed71173ca4294e0e21bea7d717cd2db5033f8cba121c7d84de07e14b2a98618957403465e60a9518456d00046e9cb2e9c8176166db90fcd02054710bb9898400085d8ab7b240f0d84b78657dd4d20aea0e7edb775dafd1208747224bbe2d91a9851bb2a89546e1ccb86310aa070796444ad8536234b38ae497528d91a4ff3ad4322d24cf0b97087400bfca1f51a7c56711a651cded669a9ac5091b540a78b01ea3e4598181bbb55ca8d0da54612d48e0d77b6f10d41380c184cd44295b24c1f76ee3d976a42f78e53568c9efa212714010c9f3b1a554cde77b21a088238db0ecd7ae2cf4cf5cd3bc2aca212790f1eee362149846cda4e27b0ca8a8e6d00e3d6d92a5bca27fee463ffd8778b2ba4602693fedc536b98e5efabdc4d5cbfd30a808046d1106423e60ef121329078a796c4ffeb7f317f57ba3f50308afae179f813ac156b27692d784482d1fbaac8e267ce642f5aa510de751e870e6af139ba569744e05299a0e3440e992ffc5f831b7c4ea913963786f6bd9538bd15c7315ecc1530efadee6f0ff2731e825a3a111b7c4bb6df5b6f49673aab4b86b207302c0193588aa5ac40772a7cfa1340c0daaa10ce73dbd0d6c1f99568a8b169369ded9e1ca4f9625d7ae49330132ad47b478fe0dec84e1ef3577376d4378664dee2694ab5fc830b88851fd597520e3ef2be9493839d826c4e719f84f8e14cc8866668ae684872c8b6c9ed99b99f09a7ada87fd1c5dabde370794368db8c4dc0b791b2723c700cc36eae19879fe36137356e1944ad6748abe0d528ca8521cf71f8cb0e3d3a5c9a21389c694650045f1511762a92422c6beb26ef1650ff891b06d17c46b768f4630d9cfba77fd4ec4b6ac92a7a638d116dcccb2dd5a550aa79a5ca0c2089d021b1ad233399d934816d5de6f1d06094ff987556f92c6f806e30776ce4655b7ac9ca2954ac08fd77ad0c17ef32f63061dc320e4fbae45798bc8aa33e6addd46cd5f7aab8cebb92a55772bf6c57b27cfc9284c13fd7c5049f7bcd51c9074f9db02e8058d5027c41c767e57ee5c7cdec6b07d6b4adba971f9d9542ab9323845e4ebaad5a36ae11b2e3c4ae7ce3ea0f27b825700f21ca224f9bf131d6262745be4c63c6d9603c438c045815e0ed283fd6ebd299fb236f2e3d9f77e2fd0a795865b41012fcdd12da772f0a61d38ce927a00af89aa03c118290b40f9c46c58385fc8ea9daec339a9e1d6ec2dc7c47958d2e1f7ebb25f318e7f1dfa1a9d9e1ac962be01566d0ed3a5723c868cc04a6943a27314c44b2d1ed25082a154fdfe65b5199b43efed1905ccc3446e57a92314ef634494a7d715df6047c9c53d7805afa80ef110bea17a667c6f6ee1f2e4f712c88fd6e60ae881f9c4cf63d4489e3c7f0e9d4006471c9b7c30d11caff3062ed94ba29a8761e1f9f47c41d16ceac31b4a555f18731dd0f49d7692ee26dc7f42def5261ff74165f6660359a2eda8a91aa818beeb15a7412e60da2f53c523c2dbaa6194c7c42de6ffb4d67148e51692c30ec557283c87ffa15cc7f0de294d7341b1fd79326c8be78e67822343c19922ace4e7925076145ef5f7dc91fdc1de032d8c454dd06effea2b0472ea2421c4db20c0fc0b0440e10184a8648d230d39f4e7afc57d3229de514e0245205a840e1ec7397f2bb42b8269d6050c4cfe8a05cb1882eaa1d84bbbcf7fe765705746f98018a4ed7ed0a45d0a7294305bd0c6b5e828ac413623432cb7292a5064bb090b819d99d36efa39f565e2cc7d245a21ceeea09255b4a38e85aae2519257f638b8a5be9ead96815ac00e9f145f50fb49a54118cb94a7f9ac7b1d33e397c49964856f0419e860169561670002334c249cfd81e9be8a7a662b61808666fd54f50ae64006a220662a683df1de2cb58066aa2c23abe1a3c6a969cd6752423f63c99a7fbb2eadd2132d41da4161ea329851efb598c7eb7cf704063344300bba8b6791b642e4b369e1afc0bad833c156ee46dc2e63d6227296367f27a9a82a0b365f9f0e89d149747c12435428dc488f1ce5fdfb174f3d212e91431f0a1333adff3200fcd27ce67e2d05783ab5c3f6478e9fd3b025ab72151aa4e08dd819af1f405f7605bf3000d38ee9add2f173510ccdd4ebc2117387ab0501d5f8b61402eb94684cbdc2a32f311c4f72b18e62cf6b5535a4b55d2fe46f580891e406aab57f75bd13996f3ed8035f97555acf2ae7dfaf32ad1e8b38feee9e49b2d45c465d676efe690d277b71c6b361c433463420d6564c53420e375d854245a74e296f611fea8c9bad8dd1b2f7c23f5def761710ebc4f335e468a386efee8cfdc5e08e472572e849df04e9e213167070c3f13c1e8c85b7d35a1cf5e17aed7004b0344b95f482a1f2362f2ca5b50ab5bb652a1bc045131aaa37bdb713a2e99f7aa176ffc429b44a03375f02643a196f7c57934eac81f78c28f1ad6f94144d7bce2e3b43682162311b473713a42eed1e51ffcf4d29df9d9cee0c7e77c93b93955d9af39ee8782707990a29c8fc1fd032dae2308fceca8fcd580ca3684985466cc79c326acb9a6d2e1ae4b9aac2697d5d5583698f01bf588df566bec98b8df0729a966a4f9804cf250f6b59219da84efe7077cce3794a526f54af231415b20c37250e1db5b443a77ce502aad5f468cf86aa23ed058bd837d1d44a62c05e9e143b1587cf25c6d390a64a4f01305d177996711c4c6db005636612cd1066fcae82eeda87f118463115318da50eb93e20c79e53c56d949c4e5f8c9eab9e60466fd2d2f2832625a8e8af9f4da925d92e31441ec0b3c302870f96c5c67a6f54e26eae87ec0dd0a66576ca5008cfe93893b58988566bdf5036e5a392289e25bd4707606e258c73430247efe43d9dcb200529d27b635234d5f25d0082339b43f1ead683063d83906415e89adc5a773e57f90ae958960b462c6fd2381686063c9b546890d0a287ba8206e55598ee00c528f5d528b06cfb95cbf5e1a4bf8e4382320a1a146de31d54355baaaaba76aef21b72150b1346a7963d3b07f0fdbaf7b72e7287882e7d98fff69ac504b172f647b804471ae1b1a3e9d885b18741aa774e19342d56a2e09f003e3ab0ee0e615b388712e7d2bc3c54e3569c7ae23bcb66a95ab5681a5baaa41784b1eae121c06236f12473ccf3554f251fb5d08c3c9c3a7b9b7ce45dc94a2cb852a6ff68bc2e9fd59ebf8754378b0721ac883f0fd4ab571733f11e7b7c2dbd3530605aff0e0a58a6d85a7f22e94bf16b757a22c79467611ebcc872fdd4e3ba40a6a48a1ec7c240fd467be7939926b2650302385dec5edcf4be598e7f73fac85d1dba09325a04dd7b519a3d30c799be90fdc6cc3d5cf02f2b813acd5ac9e15bdd0e3754e435308293924c0c84e5137a81ae2e7ae056d9dc45cdd2bc3a5725d9530092f9bef9e3d4c870f7b1fa72226ab99cafb0d17a6a68b5fcb7d778ac36e5519d53640d187d489c9623ea2c1f5523ab51d0faab2830590e9650ab9029a2f45b2d0f3059019b62824a6701741d1a29d95618d4b7f0aa31b20343b53b5fe88ac2481ccb4d459c971c2627847d2bffe1b6321dcb9254566732fbf760b4cf761d496712a134751f6abcb1ec0fa1ac64efe44e264bc4d3c37e23c8e24ab6f8da203312676ec8f0826206762aff7c1ee7a8c622e8d1b9ff6ffae702aaef9c5c934821d2a160554863f16bcb7ad08703f6b0ee58cbfa0c27ba420f21a7abef7b2fd99810574263fd42ad6f5a422f3cfc207cbf58562115fd31080ebe6f2c1ac50e68f853df619f7f9d0a838b27681857e370db8a0de371d07291682177dcc8dacd7ae535c06a525fd18d3ad67127a3b7be41a59659bdaa51dd929e03482a542cdb93c10ea0b9171e9e9a17e4e5ca698c2f43cfe5c02c29e2006032cc56b1572bc7282e76d6da682c42d58d0ecbdcd455a51b8d00e79b6b1159aea8f539fe4c57fecc8fe6f93ac0196cb41cecb9eb6e94be1d9f602698086067c27316586dae5200d567d77e76b9567aba49d72652a2d9e8ee698c03be6c4fa9402398388bf77a6bf738d0ed0aae740b5c968697cf1b95a3e26e0d155b114facac2cf350d5a261ae96856bab6339f28d1f7553949d33487dbe2f4bc21a91d0d06b11d047d749783737eff0601cc6428e7788c693698462e4c63fc090595883b3015487740d575e944fab0771a3ede47df923681a907985679ee21416b3efc8c30377b17be456655462793976750b68da18e7b090ce9d2074ace8aebba6d2209ee5fdc6a608c12cd604ccded51cc940215b4828ac6069c49a749618f5ae8a2b953d593fa8c71235c7ab0890141781faf244b748c3f269c2578a9cbb5b37723a545e0c94fabbe3e077d9ced5c9d1e009bb49d7895df117da2a534f2e62de44dd3adc9a6ef26390dd84f582185ce84dfceaef0b72f0e8ee5c91633fea930f6c94d74d9516463ab38d6d92c4e043d736251fb8d59e134677da1b4ed178724743f1b8055f336ccdb670903609c6251b2342b81bc8533b962ec3265ac630771275643bb88b3ebc893417ab63b3226710bfb642ac463ae0548da8412b60db17fd7b7cf0cb9ba0dbe996e30d80639d807446005ddef1cd980e0f1a0a4553b0db64b0ac65a2f2f2418b69733520ad8017a260a158283d83d93f4d68d01ce16a47f4df6318f333bb63db2648c0d8c38283279a29c00c9be60a44a3453136cc5fd40a32317920d064d95557c42f0d780d59705cfa34109f7cc1dacb1fbc07670a062163a804b05b7708867885de232d99011913a302c8baa0964e0f58bf23341164e6ee375a26377a87eaf2fe6cde46be208e78a4ea996009de3aea90e90ec5ee66b73c5fc7f6e6d7bdff61ae498365d52e4cd6802a073211200e0758982eaef9820ed8920ca6fc2731304f05f2b70d8690d0c7c56f96b34f0253c0006b0721db5d7a3d6e66bae9d1882a15a606eda03adeb6c6d519cc462bdb98cf38c02cf0fc4f75e55584a7327f1959500ed49bb07a8e6b4e4fb72c6d2032496f5246047ef4de8e6ae7d50068786b2a78911a45d0be267ae885d61bbad49cd23afd5b224e2d81103885d63aee65f43a19ed1670638e2d420027e52e91a181efac9a7e0ac12eedc7d8b016cb56c05ae49e6377affb63097d3f9672e9942f77ee5eaa2d228a716b01b6070546140ff5d680a4ac590ac54168f161edb144c6e55aabacf70dfc9d9f5a6afb201fb8bd5b6c5b112300042d6bb1b01ad439f61050c12e335a31b9ebe14e71fd05dca7410232a8498a499a23fed41611b4c85a94509e50adc5122514d73a359d14f1824370a5d2ae307a1f11713c7de71e00c4bb5b5ebdacd633e080e7ba505bdbe2bc3d2d5274cfb43615ae4977621b6e67e70de78ebf80fc2b4eb8a94b4ca9d944d7869eb5092e93e210330e016d2f246213f46bbaf0faa54cf244827975078b8c36b85b4a0a3b4e2291482566f992ee83ee177e4fdc5a703d6d8d09a17405612d8c5ad98df286415c0b66361481c71b41c7df95d9ec20db61032ab57fc423f8ad3ae6affd4c802c12f105a696b06c392053c528c5aafe455c65760c40efd3c08fb4d4351482c95cdbf4cefd69efd2c6a3f460cdbf83435c74172774b141a54749acbc0f603fc2521b58faa10aaa9b52413c2aeb142f807f6c6a97953d84090b6f64f6957cddfbba55c04147f57b465a8c9d8c175fea462c9a024ed432018f6b65702c7da6e7d5d41fbd0b48c6cc345dea9b2cc91f5df4e28150c5b85b54a915d070c61e8ad7f16ddd91e129db3815baefb75576cef52d4fb6f894b805f7d66914d94bfea538deb613f14b71cf293b101064ceb6eb4a5fb2af4c2469ce5597f3b70c26a46284ee6b575da2a6ff2a4 +0x9e99388d377aac36afac4a8566b9d168c6f0faad772b3495379d680a83d5b482a617c89d9744f12694fd47d1c9dfffe91ad04bc3940faceb2eec299ac386c4d7 +84976 +0x12b89aa3e9a7ac15e01d78631b3ceae0720e36f7737307c0aa5ed9d12041a35721c6ba6542c0f28ba36106ab72ad3a08b02e3ea038ea56bcfd92b8c593fc3559f1d31c9e758e5cd6289ee83444ec60eef382ed945a886da0d673d04e8579c1ae094889f788f7311ef73de7a799e1a4bcc2710b7ce1379395bd69e815ffa08f7df18bc91785e5bb8a99a4cbac79744d97a6635fffd6de11c33bdccac10859e7ef3206a4a8733f4043953d5ceaed8da5a926c0b2c640652f51d7343cfba98c102c5320e24f5bed0971736f620afc14f21acaf1cc7827b335671ad9076be921535bdc404ab644d65e3abca1a4b3aff17d121a5c75be93b26b2f8b34f3b8d000f8a455d0a68536e486c9f73deb8e0d0c8eb89f6a75408d4919ceb2abc78b661247304737bc643afecb44acaaff431e4d6c34e08393a51c60866f17a74d8bb43d87273add54f9560c73d46450a879ea9d61af6510989649e0fb3843914b61c16a02b1b42a38ef94f7c7a0a597aed87ae2b351b7774dba1bafc051bdcf8ab49582fef43f862fecfca50fd1fae7d80ad506ab415d2277ba9ab61de30dcbd22d396bc41b6259009895ff938ee8a8efb403ef91a8df77e13dcedd5a16bcebea74b40f9c4ca60b749d67ed9a00f942bc810d87adadc6e052ecc00dbe1151999c300e54cdaf910453a07a586e4eb41d0416fab4467999c4916f772c92fd543cae095024a16eadac654cd72655a1a1a1921ed260a633e08b676dfb231e014d3be9a981665eae826c71468541982149372d3f9d721304249c9c8e55dbaa46c50015b5a9024d9a96aa41398c8f7ff533459c2164d2d614eb61f87b8c3b7ef444f2fad8d0dfb65774cf9bcbf5fa5146e735a86d2f68378ac04143dca82ae23250795fb8ffe7e110a14448a4c769583bee6d19cb041c7d8e28a44458b2921d2873fd0efd3e0115eba670106d0ac3dafdcf57b7e2edd6f24aadf2c498b15a78ff34e6cd5093159c100cbabacec6f220b31259495bf17edce3d6948b44ad6a3bdf1b9d6559080cbca85b8c106e04dd728640dd99dd18fc84842bf06103aeaaaeefb1889ebfa4ccbedb194dd8f6cc6c179ee04a6d116b383253356f0e7dbd0218587d103f2a6f3eead0d064db0d248759227a088e9ff11a2e787b79595be15ac341089d1244724a87b0073be15c16167e3b977fc42eb38bbf1c86770b45239af5d3d898ddb2b4d9dfa24739b28ba901cf10be17d666b7712e67dccfece289aaf7367767691f3dd138cf17c61541e53094ca77388ef107b6c48007ebc4db1e7211916d747e31161cdb5fff4ad326d38c15904a4ab274ab40c6908f315bd7e7da8a0c4026e39046a01079872db4e37afb998bc0b50b9aa9f97fbefa0b797feecbacd17ae462e5d5471e4538d88020e3666ae260e161080bc73633d2e0e57b3a2bbd05a218c1d8ccf74fec99b1ff8414b6cebeb2367c69d99432169e186872d3e406d34129c910329ae9963321f9b817d10e473f1d23631947bc90e71bca0dc2dccf61de7f42360f17356a8c913564f4a172a48efc209ed5c81cc93450d3f30efd60d70182f4f16c567b912e677c2fb10d41fe283c39c314ff9ae80d214accbf2d005e339aa7ea503f0333a10d96c158fcc57c9346377adfd47e16faf5f942de56f81efa2f22c9c3ba14766be94bc3f05844475981e16a3d2f0f7a8435a6fb715f913ee1a92e35cdaff785166563dd820807860154013c36f8963d32471a9f833010e66d7093d67706f5862ae7a5b615f4566214295d98d2175b868d941dd719b1c04028ec1955c8a754a22dd9daf7b10479031967bf241a74a67e1c84774b3dcae8719985875ac97a5c00a9a2ca475e20b7909875ed8b15f7bf4c6780efa2f663cfa448a4a78c806857c925aa3d4f253059321abdaf73cb89ed1af6ee4e844d64beffbeaf3f94f7578b242a59fbb70d1ca71026a6cf8545107a0d52375c9b48b5fdaa821018193630413a3f17cb261fcce953449813688a75ac4f02c4e18cf23ed4ce1c2dfac443dcc132ec4c774462286722fcfb45c4a2a1cc088efca50250e88b931570ad3d28425335b960c5bade1969a6d7382b43967b215f7f466fa36c996920f440f82bed493f6b2fbb7e309b8536065cb58e8b6deaf57d5b0c09174d3ab79e4104a43798dbccfbd5c56a4da256176b14db35442fd88e8aadb53907fbb4be348526790833df440e33e750bafa7254fd8512ea17e52c35adfaa9c81b7fedc30b460d3f47c53cedcbd287f91fabc335e339c373ab96ce320ecc4f7efae0cf114a0f21be9b57dc105b390f2e22be2f0146b85499aa4aa5cdd6aa11224d2641ef1a65cabeadf0a6f4e5f0e5b56e3aa0024d882f24b9099b4e2d1d567ebb592aa4a3d27006249882e392807356a927fd7e2133badc82dc97fc3aac8758ed8274790cdd7b5fa95758238a701fdb7c8d2ebee9415f89adca822126df0a798aa906b67e0f5391e43610fdf448530a8e751a0ace3885f2e2dc4203183e48a93bd4c8a320ee60647c3c93b9f89176ad88e6abaaf8a293e0c819c0ea3952a9afa80da2871b040ba01a72c79fc0d2f08a11e9c8e58e06f31b0789e420b1a29655785b7cac96d9ba0c65de95f77193286ad2855904b9ed0c6b483497eca7b6756154c73e58baf3d671068ae508365d881472c2474fa0de46983323bf954317af9ce357d0d4afdcc897a47ea01b35b677529aa8780e6c6109696f5d4564af4cadcece151a689c1cf746e8c1ac7896295deaf240d58944febda7a5ea12a110ddd6bfbc09055ba939ca46795af367823ba3a521914608513eca1a7cd30d9491539136563a77f700bdab5e01545c302176af4bd0a3b4d2baa8998a9d1f1d84573548fd44b05982c630015825b4ce1a9a61eaa4a67f0530a8c590bfafd62cbb8d0b62da2d739445261833fa8f84336e1684bc774c2c236a431b18805b01217f595e4796b98c0e8846ffab0de7cc7275bc688e8e69b2f4c8b2349a9749a6e319e3b45ef99102b1934e6cd058d4927374b594c6afa61a62911e987cca20d05cd1549811ca5ddd64ad67e80aa5ffe01eb62890cea3ab6b540faecd28e2888473eed48fc7d3c4250e1fb9fac1ba10bd5b823ee50c321fadb1888b5d04a72bcc10ba8a23e9da6fe399326b2a5d60ae32121f1e1aea23abe96345dcd07ae0aeaf1b7b9fdbdda8061fec2ba500465f81452bd6f2b7ce40f626518ecaacf057bc367d7a3b3f0c0530dfef559105e57f32008eefdf45224fa96c63ab7d7bd0d2fb671cff84d8deb8952d8af754c0a088696b23b20f4b4d196bc381e31cc4811a134ce151a52dbc8bde10a55819b9e041cd8dd366aa51b766e534937fd0106bf7adedb4bac4c70c44b39128c106790e73076e8455d7dfc8febec681c7c0e6f63071507e800a2c37acbbb6fb7a438790e6bf161fc5bf7ee8a89f82330315ce8a8f067f25ec9ee6a68b9f8907cbf96bd0629c8e8dff8ab57f2e306e927bf6508fda15829346a87dc0a9071232fc50ae34af46ddb44b5f0df556189584778cf56dda455faed65277eccd995865546fd72694660b7ef0660db2e900fcf23efe448c573f2060e3c25e94c10063891c7f6e0ddba421d238c93d1eae8fadc51975c65519aacd90b720b91f4be23b849da7fc514aa7269769ad25a26f6eafe35019012ee72f6c26989511f534e8e9401c100859aa1822b7cc3c4ea4f2440a362b117f808a760709cf49ed7e43b974a3e4e11a8fc29e1d19a99e3f8e00bac6a5f186c8b4cb26a523a463d52142fee4973c43ba5a5ce220a548fb80c66178ec17ec9f623070e74f5b5e0b5149f75e41036b5e71223e8b3243f07a9ab6dd2584766285d75e41630c99476bea5b2c8294ceba59c65031425cdbeb4314c43c6994a99c5fafa5083fe4c5a5a827c0a711e5e2715d424afdafa5557f7f765a45ee2698e256706c8b26dfc8c1ed91e031b43a26d8916b796a791599f55649dfc159412b7c92a41d93be0688e360ae2391139d82361ecc454049b49095ef13bb7955ee4ab13ad21fe8af60ee532909f291d515ded52bea1746c68b20a6735f55328834ddca7783da52a2f5e2587127b3f7a2aa22fbe14f554599a1327209b217b79a1bcc0f703eb6993fce4d3b6092d08c246537f16882690669feaf3fda9668cf34abffc84e8b1b842df215451dd1af18004d03ffe70bb94edfab7d560e92b041feed5e3d38f271dd156924bbd16cba63e16b6f6c8673afe8a3af86ffcc2f58d69fe8d2b657fc206a9e3c60e8a3eb57346dc563826f40b19b5c12b0813cf3c656c0a4417ad23090f47172b313bcd7f0544c66c887c7fd292eb2dde52687686389082a95d2d21729423513048343b8ec8c275384c4b92f7e6a4f170c34d51697362081b4067f37541e93283a816114b3a2a69581816a601817d8c80df44d84cb27afb1885e001b774e33b83f553e75ad5e7035a50605175ffdf8f8d0ae183a65225ec3f7217e48fc9bbccbfa470162428a2e3bda9ab0ddbbe355b03caa5dc0cff0d5beeb99204849cdd769539fd364daec87ad07869339949297f73b2f459f6f59bbaa4b0c0fa1c8ac2b9b32a4db02dd4e24951413d8b352d367d6b586f85eaf24b890ffc372dedfff61687f9f42c4b376acfae886a4d35d6c6d5490f89d85f61b7677ee067284f89020d922d82f32c42cc8e56d2a22221d255079b5cb5d9cab049a67021d371d7a2511f50497cbd5783a205d8a467727fbc8b84d0c475f2c38a8cf68224fe831cd87dbc40b243d3438675b6a2721ce6a5d1b4fd97db6ccbc04cfbb8336e5ae46597e274e20c6aed76a7a22142d044d74ace8ba24f15ecbd5774006bf2727b0e685d29d9c2cc74647783c1c6482371ccc51f5a4364e8985fef9c55925db5d1798bb4ae4b5156d2c0bc875f2610f0264fab20ab3187e7d21bff2245cbb3bcf0ae563afa5a1c50189abc4ec4b14bcad4d8739f18fd16782c8a0ca26b68b2fc5b253e3c9876922ca84b0d26bd083727ffefa4d71e169f3e2a22ae9930f9da086366ca4603314161246a15cb829b817c1a0db555151e909e3d6e4b83311f7745bbfb80e3c50aa881ff706c99cfdbb94bc5ab3bb5a865890cf8d579dce62a3958c75be8a2487345f3bbd6881dff492d2b55509e65429be72ecee09012baaa9e9617f067ee280b885acc34dec49b747b8f7b8653e07e124968322844d13920f5a210618533ce241e1ba2f4072a2eee22dc9ac4f2b3a5791e4db5050e74ec1dfcf16317d72fb56d45baf2ac67bb141691b72595015b7330d443ea1f339a4e1212f8629bc41e7837bdbd1db696f3f56e6693be6ef64441ca09ef23df7a9dd97db64ba155d2ac7123d496a6bb0b614d860ff6c7cb580aaba53da404be4a1c08d1755fa1ee89464aa238dc00123b8f86de0c54d4229d2b0b62de070f34088166bdcea8e6ce6e787f433901bc64bddb3bd6da32561d3c020b83698ca5f95c6a7d8330bbd26df8af6977738c5e2af8e0c710f813e003bb3c16777eb96b46ac33b7d22a0d07559e77a3cf76e057cd831cd31ce47de48ea145a6cf7bf1b1d48e69a02b4910f80de65da8bba1b22bc4c30bca4b3dd4e616749b46ebffea2c0b6998b0eeec6c270f56ce02bc82565cb95f1a273c52bd6723abc9716d58e73c53c44d849da28316c276452c5297616d13bde46460d19bda3ecd3ca0c4359d655624d475d7f9da49dfab5f900e6f47df5c45d72c391904d1e04f817f711451398b11da1efe50e622af8c89d850589e160bad8ec955b76cc080a924480453c71b5b01cadaa1564b43ca90306fb911c8c3aa4b67d6273b5838c86091a4ee92539d4e8b235331685e2fb94cffb0b8f94c4aa0b5fedd3df33bacf01c4610a04e7b41fdf48ff35f05b348e4195455d09dbd2d8763b048fa9dab9fc032de15b9f6c27bc1f44d556accdf11e38bbac9806d8feed6db28a3fd990c73912ab61eac19bddd330107d3e51c263d202abf8658f738f11782c468a753f2daeb8a6ab5e725c1d8d9812bf96e724d0d326cbf16bab94cf6b2011011987ce34857c868560ba972e11e1b4650677da81482c855f5362230424ecc98393162521e3e6b4b898a2345988925d353507ccbe5a9d4009c4bc08776365bc94a12b2c3ff27f960cad311ce61a3474f9cca2e2cf31ff63b867c22b70511152fcebcdcbd5dace95484870351dee4e6377724d04fbf4dd5834e47b7536167af4821804ea2ac35c1a36106568452d689178d0121a8bccbc8645e2f0cc13d92808f0d0d87187d4af8b9cae1a9ea8fe0b66c38ef80cc7e02655b309271a4dc2a2f80cbd52483435515143c997bd8c8abd4a225307c2f759a22d45022a452dfb702a9f857957790fcad5f30ae2ae3af909a55bc74824635eb976c4750136fba91a0870d056879e8aa07e7318055afa7274df3793c21b5318f198f909b2d6fff728f84947efbeeacd5db38d9d08a8141d88607e5f7e8d0eaed5fba967470c810b2364f0914ee5a60188de073ef17fcf23cc91f8d28264dd49ea089f37c7bfc80d93b32e577be51b4daa66aaa5cac974acc8d86c95d8860811ba25a2203bd91d26fe4dcb417ca48eda4ab33e7a9b6d4bdf059ea45088ddd72dccbb79caaa41c87dee9a8ff65b0c4acff02d8b646a539ce50a4c66aa984f91c6a833edde1cdf113cea02421f20049655253c580c4163afe65f487b4b12c68003d7f3c6049a9b3f887bedab63d173b9946f486f1a2785cb098dfcabdcfd29ea0de065cce32a5d9c8c27c3936b7843fcb359b9963525a13a761bcebd056260180b4bf0c624d70d6e6d79ecc2df1c5ba7db68f79605419f425691287b6d48525226a1fb7e6ea693fe56f6d00066c6a30233266a373385672cd17871abbdb7e9e08668f0ba6aa1d7946d28d715a87d0354e41a7a4067f9e1400e5711169cb80c09522b3643c0cfc278da966ac84e4963e715cc907b48a4f6c536b67084b351a316b36f35e117383af1c6c8efe20032ab01efc512ae7f8e8c05701df6bdaa8c974fd0be555b17e528485947d02c6541c3eb9a8c6aa2b4bf8c46e5150b882871cefcd29ffe7b69dd75c6ba9a736b267d93ed3da9fe1f8e40dfd1bc2517aed5073165e09b9807b52807b01249426aeaef044e00a538edb5186bee1ed682f85a56a8d223398bc8a2cfc85188dda3f05a9dfc580c077fd3d24f1ae433afb42b5f661c8ac2013f86d9d99ff045dd00c41e91645189573a9a8deed3fd223815128b4073d6e67b1d09024e73d470d1c0afddd325829f1ed30a8dfb7d7f14f90e7487eb97feb7308b18c4372e4632414b793f69253374e2b1eb7b8102b3307b0518fa6f6e4a5ca7f27dc79bb78eb3b609eaee5d4eac332e3c05fe8549e19f4563c78dd5e201fe68bbfeb482f6f41ab862c98fb787340287dc20bf113a5188df9149e824da6dc4fc4c6433f4d3c090cdbee0cd7db7140977f903652cbd4a14d2f566b2643dd4d7ea0f76ebfa36393c7f85f54db9c8957285fb7799dfba166ba5f9e6949df57f5eba6afe859b07a847551fd1ba72a1fd623a4a44033119fbb4e0049035d8e9b682f5c7c2a8e02e55d8d7f43cbab12a94031c4e324a2ac242180c7d2d3e1d01c16b228d8cfdcf9388188e6cfef57d4ba47db5700817d29e32beb0ce85567225e740c924222c731f892e01f0de15deec73f88d169011329315ce545e6026e13d712a72f44cdcd1b89f43b9e6a5bfdcf54a9b2aaa90e1518a3172809586557131a750a665d4b5f347147f3cb81b9d804e718e1692d12e376cd0d0bddbbf8c2ae9d1dbecdf8161e0b52e0914cc0857d1e030fad9381ba1ed1f38109298d273154e37f2cdca1a85a0e8360ac88c3495d791cf07f90236e27a8db15b883488b1394621bed08e68cc3cca73a9e15f67fe9b4a95dc005ae998e69c85d92617a9ef9fbad6667d9333dbbb422f0fe6ac683a24f4cca276a7fd6b3a36fab1f4aafdd44d939f135c41425d2537b0635fdd00f27b75ba80e1503b057d425a0c7a534b094db7c4edf6015ff8829340ced559f7cea6b7a79fcbbf680bb7a8eb11417b5d35a7108d1bd2395054db3d2578cf881575afa0dd26bb5b4f28f050f6e9d08bf901618541c67853de1a371da788d5d221909d1aa33e3a8cb7023122c2bbafe9e81585fd2a1571b5d1f29f1b10276f9fe5c6790c400fcfba6741810699b067fff1181a628e3144c9f1831a1fa67c265727c04a5dfdc0024d288ee9e4c1f07f34deb3299bb64179f50676b011b3b08162b02518f7227a5badc29170a483a27fef768db990ea6e99a3d77269d97dea0928489eecc1f7646343fdf11e2e27eeef9a804fd22972e02b3a2d204e5f4d534412b6d3cda3c3a7a175a156fb6af5fd589cc5a07c4e95beb722d028668c6a13bc86c46bc385d06a9dac756a104035f7425d0d29c0e79c30c5c28831ba461e51f9ed380fd64f64d6e05142d264992e0433451f91a5dccf60de841de35076af3581b0db660fe9c813f1cad039ff5b294ab5bcc5813415767389cf56e8320566e8de357519753c44485881e745ea706ef44f2ac5a1747ad9944f0cfce568d98b9298e6cecf102e1f9d9edc4f9e2cbe45288af7e8986df440e9b7a1d785f8dc665a352aad31e9a8a33b4a45cfedcd2ff60eec8bf60f2769f29a49f7af6decf43e693f68dce60793164ae42331dad6aac8d0ff4eb7adabc338d08d764c484b0b5de73e0a219773d5c1f1f5de3b0c4e1605934ba9f31b00e85ab30c8676bc1e0809fbb87745ec3358ec5904deb62c3d5df382570271002ec2a06a4d90f4716cd38bcd3717108c5102dfaa998a69e1ac66dac2abc2fa053e37511ed8fa8f113d542b8642524920d4bde10b3c4c1ed4a119047ecf5256d23731b7f6362e0f419a73304e6290ba4fc5703ba4768b9bad275eb8dc4c184d0e2197181bee923cab8918e44c1d3929c22b03369eceb0a913431d3d04a87ea6610451bdb48890ddf7152b8da9feb55f210e5d1821cd2110aeff3edc1f6eeb2b75e946eeea8d8fbccd4394748c8a6c241377682954f947982762a9dd5523c7a2efd760f3e584f79fd31d3be11e4bc73f406c0bb360dd8a0926744788cd5179d47ad78613ccf52f4fb4aa081b87c82c7a51f82efc6dfe532a523efe24b07f6b89bcf0a097c768a19416f2e46cee89049bee20b94da2e608c454c7b7fb253604895d2a97c70066b435a2feb51a7b17b86bbeee95ee271c139fd3185b5355fdac9b068d51eb9c76d0fcffd5656e58f9aeb26a69a8272528da837837d075685ccb895f22b74bc6215dafd57fdab0aab750389999db40c493c738eb2e00a985dbc9190ff0b12fa4eec317ce05fe289cda05c4f48717802be34085d305d137d4030f14bfff28de5e656bfc906eb71e53e93420233a423183a3af34d9c22d667e5b0341165802a11d0ebb26c3c2efd9fa6c4712cdba4599f3587b0ba46ffb7fab6c0e6abd0229c009721c5c100a8da2b7eba5639a100900a48c0cd3dd1323ca82bc99555b0583834918f7681f4d79c1b2efb6db344375b0bdc6ca532bb78c8f2cd50acb996afa310688b21097939b7e15ffe241405b70f0678f1d5537622016d13fca941f387514674bb71d20e4db2005a4915f6961e407ca6e6d9fa81cc6a6978042789477db7295e86c56644921f1ac652bfb545cb83e0deb22fb27ed6689a922d93fa0301694b7e73b8508c9553732ca18deac54d4dd598ea42f5cdee9052dadf6b0ec6a0dc2f6d18b70b76d5f3bbf5bc0d01752202cd5e05b03eef635634ca70395202da8447a2dc3e0173c274579a18c983d5c8472aa68b041863e33eb2d9a67b4e481cf616a834d9dd03e959d8b23e200c87de8f9ffae09afcbbccbe4f90d8ad5de6f6a62ee5c906f8b7b928a1b692bce5dba3407fd3bcf17667ae698d789d4c2b9fe618f303ef41ef0fc045552fcd0cba61d50e5cb966b3ffe806a4df095ad421b379c3055b4e171a6c8d547576337bf4bad24db934743ef3cd4414c6bb97d1cad20048d8843bf3256e7eba65326ca72f47298307ad7c1f1c88051dd717dac1916c47feeef75f627a76230ba6dcef0ab4875952eaacd4c0c498c84472a6aa201fe28f69ab2d1ee1942408acdcee21034efbd011b4bb14b0767fec0d4bd07c79c0f5652dafadf10cfce89e3259dea94d39252c640840c28abcbe0efca53dc84b1ef5579f6ef28c213f445220b036fe351d93dcae57e654ac01d39f87213723f0a462d5536b8336dab5c7d2fc728f865756b85f7526144190e0412c3142650616dbde7cde17e887a60ad39f2a1330d8209f13233ce5431fd5c297238f8b3ff53a3fb89c84168b04ffa8f7f53e14c36a2d3124d68a27fb55e7334613f65e3057c74a91e309c9f325641ac593ace9dfc2d9d77dd7d170b57a41ccce8c0a5deec43a76fabec3b4a96f6fda9ce8fb14be68b2dc7ea5a7320a0371d990da3fecb3b1206f43ae466926596f531e63ad2817d244bab7de7fee517803e45dad0b9d27b5057e1d200659f26a0f2eaaa2379654761c1cb9c0c028344e54975572f1d1d336463dd7c287f98617bbc7c2132ee1fcea856ce52b1c522afcf04d38ba974d1ebb8f2913f44fda59f8f1b90545078d89a62d15da4be90e8e1a739077e2404192cb3cca5233c27f06644d7ce496361b831f8fb1f9c1bab0061d3aeb93889171b7cbdb8c030f8459e4102b7dd0a54efe61dd09cbd41b05e90b7bd2c90c2c1f3ff663e7f8a6f609fdab53184669f0c6b8be6547cde9b65f1c16ccb7a3423b3e0ee6f9ee9ade75d7dca4c3906100e721dce12eb622bb323abba0767624e634628102146becea0d526968d820584616d4cd82bfc174b90d0d6a410f8aa868b64128c039cc698a3b2e36700744969a0e741d0b9f164e73a56b8a60fe61b83a1f4e58a9d09c9b0f7dafc652e789968d1c745df42310fa7ba9b99e98d987deeb0ddea3478f68ec1a437b9b79ef4bf29fef59e2d5024e0321789c3941278986ebd0969b01bc9de71b3af6186d85281532e5894e16a32a13159077dd024ed33acd25fa9260eec81682b2c3ef965f8a88e6ada712419c3184b89fc0ec54d5f184ff6c7f4bfdac53f4f14959639cc50fc84b9627b1de33f0e29ae52bf9a14360d00322990a206bee0ce77d2b26d95c044da23d9fcf5530e4c73d0f0d87801dbdb678d6dc6f91a3d2b8c5bcadabe49b24a3bb0253ad3ee9897d0f7bea1869db44a2b0f7cdee99face932c86756546f8dd44d692f7ee03e46bae82ca461ed6f2a21f5c03c209c1c72e267c6906d568fb9abb855df0f43ca7e7b64768a62d400a62a6ca996d43a19f7ded45e2d68ec329e97257c1e37251aa9a4ecde58ea64d68e2b39d17241ea1ea3a52197278f40dfa45f3ce7d23caeb730fb276bf642c47b4bed0340b9b0d5b4defef57a642a771e33cda49de46705287949be254cb21e77463873ff5169236210b3f80dcd81bc77b3a706a63d0053f5ee55581443819750e6d3311524b4fbb1a18ad35a4adc35738cb6090bc34fbfa7f6e99e41c1f959909288e48a19d98528f94c2e69c4820a9926c256d3609b72c5f8cb38b3af608cbeb41d3467171feb4f80c1b04021bc6471e9939406fb2e94d75ec4cd72f6ff5763b35bcbb308d052ae9fb002e94bd26b843ef06cad7c4e4c658f9c05877c1ee306f70a4e76d332e4cebce2cc6c280c46598ba286cfca44c2f8f31b8af92b05582fe8f268b8608ec9364120b5cfa2b11e7939728974cf581f17f20901d0eafbdd67eedabf82972b296e9430651ca00b1a6ab1251ea472d18b4bf42d1515a0499a34718cfbdb60532bff1fda855b096063b65a86ec689bf92d1b61506ccf3738b821d9cec5cca34cf77048e8bd92c7f920e49b5c9cc732162e0fa13aae06960e5fb38e69c55c485fb6497920b4cbc11e7a7dde6ed5ca2071b5af1cb384c2a513b674f825a29337d49013194c130ddf1799088a8540784b52eb843b83960c4c91e6eb7fc9047958f3ac5490328161092ba40d076984d99c00f81564718beb73ce16a08c1f951793033397459ba7cd27a3c315bce24af5fbc503ea00470b6802136f1c85edfa74d14e4c61a24e2c5c21c720a713b83ad551e7348c78cbc08ae1a819e6d4fcde98f81a203c0e15ba13dfdfe04b73b2fb8084afb48232c64f59f9d53b86df14e78cf2b0d7aff1b6f6fc4a332e89449a36fe7e65ab5498ff63dd30e2fe8510fcbd57a5589843b4fa8a1e480b30eaef3692582551418b1140a21f6f16896ace7e0901fb5a8b7ebda91e81c2ae0ef5da4fb89563bb9cae044fb4269fbb05bd80607393dbfdd9eb758b592ea165f1336eac4fbd1feae745dbf542faa6179907906ba2142c8aaa0f4467e42ccb78012a131700d9412748d9fdfaf4a46e726ece65673f8cd8492574930766832a2f6564325673efb0bae7f1d226712bdd16ab9d671cf104c68273a1c831883ca5d1466931324f0a56ebed15c2416297dd4a79f9fe526182de7dbb1e4daef25e23a8cbbf7a733d2f1a0282cd35126ef15555006c92d037110881267488464bf18efa1df073e1e468e446cda293623e402c80677d8b5f1ab62cd8dc2ae3c03cfecd1063848643edbc9c00f71b44f9798c4c13d7b551c7b27b32c804c8c4e66c8bc832c6011a63ff342b7827c1b09fc8dd9c56779a4cd0a867029ac7d6957e84a367a86ef19607c3d677f6861a401cd33c049070b6e541a48285964cddbd512b4b92b982db64f8e0ac69c23cb05a3741b06c0be99182e44dd5a103bc65a4270a8d31ae2a48ebfeffbee923700b68b9bb42bc0d0bb18d7f4c673f2b3ef4b2c8c8702ccf90bf93e0c812e0634bb1d06be8f9dcdffda06cdb48414854fb144ffb0efc6b64d9c8c468e2b234c8f42cfc1271ddb5c9e8e689c0ea69a2c71a4ce389843ad6b530ebe65cf6a6cf9b93045279fdf62d12f4094af6dae937ccc424d63bd131560abbb16185abf4972352bf3c67354d2d0448931944bfc9edaa212590d79eead1aaa2a19eabaaa676aa57e720a3c0e99ee50d0c5d73420faeab58d67a25926b30de0e4403969bc45376ca0368f648d266fe6afa7d4b0ac5611592c0faef56be5cee2720f90d245415d0d49c7b2872116f9788e7e394c0f2ee31f66979fb91eb3c2214bfe9daf060a6009d39c101e8ad9ff88f5af6160b9f3c47ad5b6012ecf8b7c1fea939c3a5efed4e4c62a24952aee068a6dc1e9994d3359fde1e15fc0fefb7150c645391ec0ad20209a086c7571d1931f5f4c3e40296c080b2380281a1d72364677a9d0c6cb83d63fe79d544a0013299a52a4dc0fef0c53451338d694bb9e2f7367381fbce0116ba5077f788d56212e9de0625f530ea2d01e297207bb49cde16a2d56527b9ed454f2a22555b9d48a368c711b14b3f8bde308dea22808488fe09d32ab359d685b36ab2015585a0bccc6089d25a8ad4dcc1087cb6fb4165862a17f0f9d257cdd04653109c60cd87c575174bd1887996e3bed3d4821283fd9c4a8921cb2ae945d6e7516d7bdffcfa6c86d63697a4e12eaabed7c0d7d111f4d547a7902723d9e6a07faef12738daa0b8e8e572ab148a4339a75e663c9fb2f33607b9629525ee5935f4b0c327d52f22b1818c2695423c7e9663aeee39e42da2c97307c29d98ef469e30a00c031cc3275f3a137bde94bf87cbd80f8156094ba89573d9d6c8e4a554e119c6f344775e58cbfcc1980d74da05e0f0cb471c74d4aea2f076c69d71d82c089969a1714dc75dfcade0a5aa4957a0db912967128e905bf9d027bba5a84f761a97d23d1205c7ddfa36b6cc3e7bfc01c6a57009c1bf4658a1fd34dd66efd4d920fa4af0af092681ce808c33507292d0a813e957af70c04ca25de5536aaf2dfd21ac17e2d1c0acf07f72a9026895e0b48ac3dc766607c4e005da81463951238b2594813aff9220d215f357620e4eb056739d90916eee1bbcd15b52dd593b7e2b359ad221c2e74cd199eddc7bcb05c85e6b894fce4d8b8d870ec79e4154d7068457a650bea127f693124781742620f1737b6f5f558d48e1e9c408ae99b28c833f95a0453a24bae7c088e98e75a808f33da937094fb58ce18cfc05ca0ef9c1bc03f770f7bcd309e70103bb4ba8d7259666ffc995e44ebe5315bea63ac8b3e07a7984ffaf6d377abefe8ca4ff333edfa293850d4b3bdf48002f10d345ee675085494433b474d776335e2a8ff43e629fde6e42ec737df091b080fc7434a89e79a51a3ff550fa3b660fc9e66170f2cdcb139f3e4c54d10a012ab089714f20dfc3a2947e2ec927ecb01ae9c703bc7606cd09ce81173760b4003868bfb2de7bb296436008c4682271be1c63d55d20f3950b88a21433645276f6a050a72029e49f5a5126e5a1751452f6dde21857e39103ef58c3fe8a23ced84b2b0f48a178812f77958d1eab382418c2240c99da4f77d6df40da4702bcfc6367a14eab1e127ae955d43ebaccf87b4a89bb895fccaace99450a8ff88576059eb3cab4d68040f8565cd9e1c1ebff4070b2680272173dbdd1887c8917fa9b1111956eead3ad4a23fcf56b1d3cef939c13a7f41fdba1506d08105f71af48714745765497aa8f78226586519a32c2fdb7bacf2787a1542b06c5457aeec55941d0c1bf4564610d111e19795401ab4b85b8ed92c8e3cc1615af918f97a9631452d40dd609f8020e5f3e9e343cfaaf7272c83458a1da65d15890f3567c499061ee7ab22568fd947ca8ab7e21d12c471f0e0e18897815726c3ad27302f27755285bea37122a18203e358c41a6da407a3a9fb3208d163bfecf049d99fbc1dbb951e24d240716f3ad3c4e0a6d2d21dd51ab6eded5cd43f50ee2fd18eea9b11cc4c5cbcb026bf536435e3b4d8c1d6cacd25ac3b8bdafc6ebac8d6f6cf9758ae37e6a5e8b58a68f89ea8c437c25de84550730e669629c69c4dfb8a0c042c513d7f029e3b6ae20ac92abaeafbfc1d8317ff8131e184cfdf229b04bd93d520215a121eba1738d4014fc8dacc740e7733ad2acecb4ed01382ac1252e620bb09559e81996 +0x0d61f8f4238bb647fd02199f8555a38d2eb4ac07cf948d499eabd9e77c89ca753963e95e036c6673b6c88e010f34c32c57d6f103de1b32291705486b29f93975 +85768 +0x8eb0ce96cab8bcf471bdff7a31c5508c306cacc2f23756e07d261f09bb88e52f1f135ace8b3406da72a490f63a3c39e6e40aa947eea4ee7d78bcc2eea7f50c6e47f5aaf9b4bc6ea8fa3466de3b0961c251baaef3b5f127779f106ff46f0c77224c7e47800bf7fb4652940b9bfdd3d009c0a5442e0ec50ab43a47ae83dd742d3477d5b8c9598eb59cc2ee079648438fa179f3f260c3c89d1d918c0703b7d6368d1023853e6528a4939167e036e301a574c4cb41f19aa3ea9aec0503dcc6d99b135f8f3746f96ed111092920e298b41a69e955b8495cfef91492da2976d22663b0ab425548db0843ff705c4e042d04f7672fbbdfd0d180d071cc340139a364964b3e6467aed49d02460f27f3036b9b4358e0223eefc0d2799be23b148e003c3dcc5e1cf5dfacd517cc2eb396471a1e062342b45e0cf29cfc781c16e9dbb2565f1a549288432b5a897b1528bf38023848b09e99c69130855ff2c1ee09898259041f68efa74219d1603a0badf73eea8f12e73bf9fee44035acf01beafa0135ee34c2e15bdb443de5a5f0596ac4c19ccb6bb063fb8f6fea55eb59703346aa96bcf8eb09fdabb1603c5f874888b129de955cf35cc70098f88d221709f074eb6c6c578226fe9ff14a7e96e61e2f43de7995ec986f86d9c930845b112e4a0d2e7ea55a7081853f6cc35452f52386044835722387e460a3695ce39d2f276998da9510089b62bb148b93669c9ca1b67bcfd9d409a8037ce4e04251f1593b749d57795469ec10c8a5b4815b7bc3dee630dc2f65a7e313032795ab775d77b393a50cf21a854bd5d37a5057dbf852233facd5fdca04215e1cf1f25efcec71d7f03763c80a65a1f7041cc8db901a31b8e976240cae28482af0cc5e258aa32fefb0dbc3c2cb10d4bf841282d61fe949e50b162f24b71c42c0a73f41c6c68c9a43fe1994aa068ece757be4e80f336d80f2ce15600c8de7f56868d3040a5aae981b007a3f4662e87561111b615072afbf2659fa1e8ed9914b6a5b0e0db9ee1112bede852a5f8825b3cb6c3e545f84b6efcbd54dd07043232b0da97bc59b29bef175c1c3bebc1f4d6ffab7d52b05128af6276997e07b72a47c9a7a9f9477b4bc1b88d1ba6327d069913718694d0ac434be823e5eb5770f1c2859f504e31736137a3f35f48266437f00cab781223641bb2d267b2db72cc19416924331184158ccf5e116f981421f9aa6fbbda5125132272d5a49894e6231122e8d8bae9dbec2ee73b89b4fca830dbf6a12525d85223e81a565d0fce2e007a15891f604d8561b81de0aed80c3f1b4f834569d32e3720ed07c90370ddb6fea467ce8acba33d00c8e1d203314d653bd4cec10c7ab9409491c9c23a745a1d7820b82d8d45814f63c1b184296916a73cfc47b88f75100af986dec66472a9ce078f752aa9766e58e5433b7b83e81e6179366c70656aa902ca3cc54a0404635517412d5a61c6d0d61fbdbe2c9526bb408b03cb9d20c40aa471140bc1bb921d2f41d65f1138cf5f437da1d81befad83b0ecf4e3933409bb8c98bd20c1ddb41dd8f1cf78f3b0e8402d898007cdf604fe3f098a230731b41207bb8892cefcd30bceb18d19864cba49f0bde8cbb74a9581478b24284d8c4bc4c22416d05d9b876d9d0baf9f2d7eadc339954ca26c5007b366cc6361fab6394a289cd867d22c4999a06aa7987dc94b4264ba1c1a61a8b41b1957b84e733224f8c7705dd7d14182369548f593dbaf1b5e0e76e7a21ba7231eebb7a36c6ba277770b39079eef5dd9cad83129ffebb2866ca3562fb80eeded453a66b54a3869a93b8061862b60e3a8acd5bda55b12562504aff264eacfef7b0491df4e465e0a42ccb3842a1bfa7587733a490823e41c6f9c90b617b8c32e44f39eac0f0f6106dc91111b83def085fea4626db2f8c577debb022bc8807d1ce3989d3757f3d5e1cf2f259223e3078766c6ea9646385afaeae650cdf7f0725dcf4a3a1bc9a2212d930d6d727ad6941c58413f4d226109082c8529171677374370aed1c3c488d73ce092554709182a975ba9dd0ce80154421c3dd791b4932070603d10b9e9166ca20074798a5f262f9ae967505007a7d11b227708b842c2e267265b537897d955ffab2a56b6dd8f37897a1015b0f1b2e405d7a729054184e19a3ba0369a615037a8291a595704c1c705962aa9aa46c11184c464b5135167a27c08922679d609663e02cb0dd5755c5271b61d88966730ee3a4126293cd2c9a99f15b7af9156637613d0b2f0ccafcd6e60627f4f1fe3a0ee790672121c46597b760b773e9b630cfbec1b788ea704838f5423b649a13c9f76e36ccefc2c3c657c9322575fe29c544c093b7253ff241d19cf625924c4e26b3bebec9343d7259c317922de8ff162e80b0dc936cd3f7ef8a234b6ee4cf575b281f51e6595b7825c3e9a65834b5247169d6c3d4c76e285b4cd1689dc4ead57040db17acc4e47e324086962dc1e8fc98e97971019dd72d8cfdf0753a9967706be13937a2dea02b8920378b35f85f46aae7e20da255d7ad8a86c69ccecb0cd156f580d9510f5628314d44adf63fe4a9b04a5ac03f5936515ed09c03e0c2a2a03863f9273fc0d01c32adf523faff3dcdb1fc27b26110bcc00fc2b9d2f8e5f0841a13ec46f657d4b0952a9116c9a1335bb5e4910a8fe230a2a54367329e9ec02603eda061fe3e2b8c61ab62ade98b8efbc5eae2f152375ca1293dec4b5b55d82efbd95f9edddb9d579e17ae11e4271654e7f6608e31770663a2979144b67001430bbf6f251d98f1b95458be6942dc930f25f0550ab40af79018399e453858030d3987191f45dcf15c8c55dade8911ccd387c0078c6359f7d1930b5b786775a6368f19a5b4de0e63e54ef64a9843308a49144fbf3dc7cacece1cf40f03ce2fb263155d5b0b6f9810ffa02355bef7a09519d483c44467c6432ebadf040ef2efee3ed23c834d80e1c0508cc444782ec9b5eacf4560cacbb61f9976b180c25d1b236fce9c64a19a513a8019c15ff06f13b2640e7ed9f77c002ab95753cc46961d199e11674730445048384f02ee4b42e65330981478f2010e2c3365ad30c3255b9872a48374220646b020377039b42faa61f675f185e4e246edb2a8a7f361933f68938eda339e689b3bdfd8f18851bfc7a55daefb48f4a81234dc292a5f47662f50aad752ccccf3b7b11e3b6e224a79a5e40e4a1c084bdad9cb59ef1cba9e29951a5f88d586d52e03da8466d050c8e6ace9b1513b0f10000278d202674d8d61d88c59a74aabe1a1e57eba63fd5af38c457bedcc3fa36ca3f704ef6bf1603d98606f413f988117d5c664673adf88f2f5d6616ac2120d874a1f375731a43bd655958abe55a951a0510f5534f15d21eea9c964d13b9b95887de2d8b35c66257f21dfa779f36462a49d2619c8925e6f0e2e844cca3fc28298c4a8b1aaf521686083a68c1920b1fe4a427578cd24ccb87b0e71e1fcd76f1edea8d988e502bc4aa203520247e5786bbac7623ae8b08e455cd1f6ea100a8aaf83b0dd260b8e1f146d294bd1ab49a1f21db45726c33d8c5edafd7d31ade1fb7eae651d53c59e320de87ef9c1ec5415db9b92bb0506d3ae4b1d1c6d7c7c62aad3884dffd6bb3cdd7f3c89c59ab30eba6e5be8f69f597adc534cb52e94259780f639f2ec79946f08b090d21523a78079f3863e70bc623bfebf8f5128414f88632ee8dc4d02f9409be90de2522571b13bb1431d9024cc1dfcd71077c34aa23c3cc4bd91883a91b57e72db40e569b8a9e6f1bb0bc09e3d29bee3f4af6779c8bbf400e19b07e905d99993217434b4257163fb159268f45d662c2b66827c94660d712a7c8230d7fcb1d4940807a9d160109b177a3aeeecd6dc2ff78c766a64273b9d8ab5cc6dcb1f4718bcb780ab86108e758d128abb4f4d93ad8e8e1599b1b04b5f68b503258f16a24b555667a19dddf4d8a4040a37e46d948f3995e77143ac489e0ba4aebfe988ca57a50f45f5dc7149aea57942ca75dbe6be40c9735be1c13744bca956a5a21dc822f508a10e0c7195ded898bbddc8429121eb5141bd55972238c3ec823e827ea3968c690354f588e050858afcd6a7489e9f8155d90065d710626896baf25053639ab45bf32f5e5c33ecf4768d1fd89514224cffc48dda290aaaf3cf8729d6431115b306fa071095959a6d85f71e23d2fb91927589cb7b3417f8abbe6f4bdaf7b3f1d2919f44d4dc0f4237dfc13d52a75bd39cdfb02112a13f34d98cfcc02517541559246b4e70d9a8cc9bab73e32bbb3dd2b266c1f965178a46c560b6f17f4af96990e9e58eac336820e112967778b7a8751c3245ba3e3f0116b7632444af38acd5be05956a52925726513bb163ff42a5a4216ac4cb63c1ab8df7bdce227f8a74412da3034b28a07ec7324e4c0e89053b470a36c4969c449191cc953cf4b5e85a9523e9b89af802e4e9ce75efe0dda872471fbfcf82b370b90b8013f7201af964b9e9ff3bbd886391756bd62341c5d2528aa82d6cf76eef2de45961861076669c95c70e141ea0698e5452996f99072be4f9eda8245d9766f502a0a4712a91d60a12043ecc230abce26ccbe75c506c5c2f7c36577d1df480174f9c0741d832f2b516eab6ea368d0595a71de871cebc0d3bfcca62019d4ee39db297af7d812362a58abf9ff6bef0ecb0ec92c3367cbfe5115ff2f238466c378e12d7c7ad8c2acde257cc207823fc183a2270a133c03c8db88ff62fa9801825f359a575596310dc75635962f9cc79323b3300a9f103fdad38721e40dcb41854d36e49e10a6d9c366598ae8d01232fe1bc068a04f7aec8ec9af2b14d5948356e36390b3547129883badd12c8168fe5cec38356d9cd2766f2e5f6f980a9a6371825a2339699baca6d7c19cf3bc27865a15b92ab51fcd89f6821653cff5334e6fca691082e87cdfc9ab4362b0f8c467501891bd3940b273af65729c3f2df5c0ac2c4eed32599b3f4b26a1b6f6cfc62de96570614c9827e01438e29d682d5856a1284a1dca357d57b5ea4b0e2799b326709cc3bb718ea44baf8ce4dbdd6be16cf92f0926bcf4a9958466cddce5ff01fda02f0a303aac9e12ebc1f7dbf18227901ed0faac8d1f9685511c98a79458492fe28cc2442a7aabd25388aa1256d8715c8c9e9cf3bd2ecab3867c49f2c54ddf19a2467a7ba371240671416a138ff7752eccf87ea0bfaacc8caf263042fb485a5779dca15b5808bd2bbf7cc653df6799834a6f0e48170c029d357b0a2ca8c04175d3cfb5479ad9cdbea89b2d67f7a164f69f62ca3e55db0341b41b35f4504e0ae13a9044e4ee4cec3bd73d3da45b1d4df536944117fe8055369567324e746a3d1638bece97e4da7f2f95d345ad6c63eb1baa53f15963a46ed863ef8dafa77d4ea138bbc0f5012b1d069eedf3f7bdfd92b66522596737afb693ba24a67c4c2fc60ec507ba70b5874c6d4cfdb6f7c252fb61f19ff7e5fd1ad314e2a72b58e4da29bb6833199f84a773a01a830d421bfc7bbaca2d4b4a067e3ac877d77aa9f404e0339cbe7cd5f0d4295b920e755b2d529a0d694ac207e632542b044613041c489003cd1a42a88cc5d40c4df06d97691decf65978faa43edfb5b8f26382eba01d9fa893c709abaad51a1ea8e984ab6196dae2155863a352fee5feecc058b531ec959e6b553053ed8a422f3d5a28fba955ea7d17398b89e4e85b693ddd0315443de851ce456515d76e12aa65b2e90ca2e3a203f9cce0cc47549c946029f07059aa2e6f37080675caf8d20ccc943352e0b878331762e1ef0cac0fed1e37cf5ad489ce43202da2f86aa326e2dc6ea662d56d03770a9c3d6697574befb276ee3967854e8a3416a912290577b91fb2a0b10349aa4c4de921d799fed728b777eb9065053580cd63a76778885afc00f0b0c20cf6f32f4bda5d96670b1804a7ab25f46f8209e366852c4cebb437281ab9551a24fd649caed03f4790f4a5200d914be9e994320e9a0b8656f51192c9e77d1c2e1dc58510c17b454faa5404e743bacbc555b4548ec26763fa2718f45dd1ac648249c7cb283e2c1e3315919de70498042b565ad7d09a1943caf432e25073d7cc9b2bacad4f7f7318765545f69baab9b3904e0032606b91843ddf07d35e487fc2ed45cca2030fd0c2ae0bd99571b0802878bf3d0adac170c3b76a005db3ba14d60d2ab05fcf59d5ab3e8bd500f5b08bf1692c79a79c363770ec07a4c80d5327746f4ce02d10f7f240ac67c0bfb4254d8cc6183ecf2134462a304a7dc8d7be383c782ed4908474a7217c2215282989458933f504b806363d4e2894f3d68f35c78cdc332630763a64ac223d5ad0c246f44527656418b7d68d5b39998f57b05445e3f00c3d7382b3db6f333bfa501af8ea6f14cbc557b27fa6dfe7aad8e2d7b443e0481c82d0269b4bd923808c1ca019985570aab10b82ac1a5ab75b490e51c031f068e6aeecce3b667877bd78acde237ea6ef74af8aa4e6784a2d2d6810daf2a092c6fd0a10062e9bdba445587731a10dc1d5dc297ba5a9113ccd93aeb0cfd60045e6b24ce05aef5c613dba9402470cd634c823a754e18e9590fd209554ace4e1984cb8bfd438f838b7b87fd3d49ae1687e3afdb18d04e175e54046a482fe99b4f87d82fb722cd3b12d8917607489a9251cb2ccd0aa6c5c32a84b8864b2318f0af4dd738830a2fc46514413e258bfdeac8ea4137d33a4594c6853684e68e21f53fbf13ceea637fc78c15df7d1f789ec6f5293641f9f296323941c68da1d8cd5109c5d317739583eb8dc5b35a7e7947ccde70521506387f468b9eb0c90569e4ad15485e3ea60804d9720a05fec8f5bea78da8dfd88273c978c4863b5f99a92eb0692efd690b24c93843ce1c918854ccfd0ab723b5f30a3c6fede0b078e50173030f61f8c12b529cb106f8413a43fd39775b8767d2e367a0d40e94573b72d77a4d0fc7976d8df843ecc570bc21835acdbc8afff257d9f1bd4e2d8978d1c7940c376f4a2295b9808790871ed56fcfd250759f060e6d5e105b8654a95b616da1f16939d1e0633850304555ead44cb0cd8949a086013cf92c41238adb4814ea64f18a75431afd91d206b536bc00dfadb341e1976614eb32ad38ced8078612c847d342298a188b4c6cd186327ca2514eed40e48b8e8fa291fc082f44155e828eb1613b5f8d2236f2885860511202c91be14efb85e5ba8b9f7f79edd9ee188cc50a611a1e3480250a8d64ec9c6668709df833ce8c55dccbe39f52b19c78fc5af4b99c8a6f6779821ce3bdd11a601c6e5b9ab604a8c63f8de5c45d22979c5111a328da31580e5672b0f22bb8d3e965eadd30a145e11e29f72e5760e9d14361dc5bbee3b7e411601f4f217649d0e78d0cac20ba3b4046e33145be24ad525372e1a2e37ec51858dcb180da652b1844dafe4fd4ca8ccc26b564b263711723b6cd4803ff7503fecc1550cc85c107b3e695e54eb298e08ea6e6b8feac0fcf4b52ba3a037a8e189d535222ba885284aab705ec3224eee08cafc054b003c57cd21180df2cbd92adfdd6da52d24ce04b049d743882919233d027896150cf5cc6c1d9695e052e4869273ef6069c393303c98228f4c6614d8262f88a0667789d571f94bbdf16367af52271ee67a1b81255024d6a4687fbe77548080b6c7c664dd4f429bf8ce83eeef8f6590a9c682f47e9b6e682564bc928b38c4154ba170037e84880bd8b02ac6d1bacdd92cd79079866ed35b84d9d32d8e53689ac19c0b022392481fd04ece9bf064be4cd245da9ce75af215453029ebeb24cca5db100ded56f8f14c6202f5eac60db5804c69b7bb1bd05949d8f0475a3c3d8ebada95ef01933922162065272fcd165207fdebbe708e7f676dc2a2a204fbfe1d4e52a634fb62d349017e0dd8c7603ef24869246549d9a8bad5a4cfc058a4f706d4c5b956374047d492ed35916e49b844c610ac32a367fcb225c1b038d1c1b8c9e2c657f941b607534ee094d770c442980576fbad09c3dbebd2dc2c620ccca3d4fcb6fa64b72eb253aa1aa4117b6a4e8a8b1e9b3b0977d6c671467ce2763058b6873a294ee424a94418dddbd5eac63c8acb89f3731eee7de065833a108aa737fd16a26d0e75328ca32fccb4ab4b52ad274b1bacdbb6b221b83424dc92d66bd2072f822e29c6d2bd0f6349c6f8198a10ce8e761feb6d4d72bc71addcefc628a773367be537758fbad737e77b52d1e6f80f1a1bd518af2ad17b9280d36df65838afdfd24a9dedb4169932184a3200f3c367526f64ea08d4de640b3038b3d365063b604796f3bc0a50d3d67edc1c233b2345dbf337d5e6d5ea04605e7547e9e980a48c2e82af5cdcea05996d7977c51778492b49c672d59894eb264e21a096503859980966474cb652acef76caeb433332efb4d5b93761a76f66c191c6448533bde9385aea4208111b486d2d48dd39f8f387fd295899f78cca35b6bbcbaa22fe51d1d1b567361b97b44686f37bc425e32ac088a75d2123b345a69a4eaa47fc3ac481e88b6589f394be55c15bcc46838c6917dbe20f5352b55257d0bd0ab47d535698015f8db42ca289c4a0d8b2cacf4f0f0c5b6c17a7210d80b7fe79356632e2b872a0a4184b234ba731aa0cd7c785c5ad0caba7eea30b1641558815e2e399634ab04afbcdc573faa71b413aa3d3336ac3973127fccd6d7a249ee2157ba32d5f8dcf64b8e6a9ab3a09e01b149f6444b8d34a805eda8ce4a39b12a0ea682b6b22122e828e2b6e1574303e7c1d32f1563a6c751dcf0077fd2d255f492740e2ef65485c28cde4995f43ca74f8a6f700d469ffd57e0af6f5137153b35f3e9e700693b0e6cc0aaaa1f5232932255464294bb1fdba056536bac40a96dd37a2c9496d37ec4ce0c6f61e539cecd466a802c128bce6b15890380f8b737f3b86f669d57fcc5b0d1b755f75171b85fa51144b7ef7e56b49ec0e8389d6266d3ca1abe8baaacb7d85b0b83f3cac197502692ba69945c5cbe24422a1a0309df17f3c25de4f9aafc46554e22ddb7f314a9b0340bcd67ed8b928d58f0ae93764ac71ab16a33abbf3d02a8c9593e82cdd6712d415f68d1f98837c34a627db3704ee9272d0efd28b322123ac4519d921886b084ffddc43b47feb5ac60aa0eccbe9387017f71ccd74e5280f58731824f9bcb6f9db7ae680ba0931532e2ede94729c2a892efba2722577654c059227521204eb560b0f9dcabccef5e3c1756978a798355c1c412977098359482844cff706db68ab534e7a98193bb98b1480a9fff767d957648a0a32ad7384a254ed6a7a44cacf68489a056f7bd9fcb7bbd34890de7597099c18dd3b6dd267d9000e9f62582d802b5f84b6b7311420081befade1b96beee137800af7d72a836abe1ac735cdae1b530c911705f584d3fab93842593495518cab522c0e75d667c5e3b48a6af1b7018dd4419ee225a678ee183fbe6dcc9c6f5a7c01a8d5d6807579154e417870c2c31a4b18c6d24df39f70bd787aa5edeb88d92e0119e455934cf2c76a94f4d77be0a6e579173cdaf6b8111d84ff7814fd3e9745e2f7c08f994ed17e7bfd56722cdab217f518a8591a434dbcb7c58ade6c01033829bae0f10d0b83bef4d313fd5021aa771f339b44f8c1952fb35524a69270ab9947ebcc1668f397ed87bec3b5a0561e675a009c2afcc375cafa36fc0a1afe0ecdcff2f85c27a76c9e8738dc5787d88c8d38080177a0c97e22eee3677560199b6a2478ec5ee387905695a9c44f6129534d2ba281b77f33fcdc13d2fd850c53dfe2d7d61e8b0724a18a15ba1209d6d9211bb778937702a3903b0b8e34956a2d5acc6ca3156d1d0efecd99b25c035368649d6de29d12b598d6e4389d933324068a7b556847619f972675845b08e86147ac36b189253722741f5c2d599ffaa48fed94248e5b24f96da73687fc8f157b07567c24c4c230b3c5f7f74c7ac1387629f29b5c9d9713d4e30f74f71f75171b27f1d23a3ddabbe41eef6a28499d99035547f5500ea1ca9ca7bda5645c4179dc1a0cdd545cf5155def7419437e8b78f6a24c36b169f195cb2c306c520b7a9a185e15f2159aa7f96ba8148920622174aa818dd3f3280d11ead1162e42c597045a849bb4f07f49c4b7e94f3e419ce608b9837b6197d16acb6636cd6fa9131d453cfe1caa77937103ad1382ad19974fa18e28934411fe813ee7ddc4a5177c83e91a4b07270d4fa422c5c76d5a2ae9d4db92d1640fe3f7f6c8ca369a62f05a414c9cfbe9cf443c69ce8c755dca07fd0c13821e7c39a056120597c1cd2dd634fbfc1f8133179ec228538b9de27103595be5c6703a35b9a18981db1fcb7a3ba51a842c6b81748f79665e2da189e3df774aceca772ca8a262c3ba0e9113bc832303613e1b438a98daaa5afd30b2a6eeef6f3b1883d1e6ed02370a9cd644796f276d0fef20f7ae3d6e7ab674cbfb1ea42a2fb73b36b8951c187a10205fcc45323aae0c9a1d1c740f9d4e0d2ec3d1cfa1a002cf9d004f27921df357138e29848ec55cd3d950306061efaacb75c8c54e69e99ef0d8611402f17b494bf0e1cadbd76feff2277ad1f7e6fdf78e044b440f6f8f4aa757d985dbbcb8d26b431b4e9fae82dde40eed5f9f0110daa134abec7724d9ac7fa5ea4306566f2521746b136466b6bd25ea3857ea42f0cac1919b1d3a1c811ac64d13aa175106b83b2f81c7beb273e43463dc495e1ef62e4ba57954bcc8ee3c37b7d649832f0811e4becfca02f433199be659b26f17999bcbdad72163bca9772070b29fde62fbb8cabcd598c5be8c93c8fc3101a1af6399aecc2511e36a2b623cf2292b8d7f4a2359a413c29b63d909481fe2e57a58ec8e80d3f394a053ec73d9c6ba5b24d68bc81dff0ac5e8a6b0d0a5bbffac6da68d00de9cb3382efc75228368e6cd192b394d94484b1131d99c804e7ad7e4f00add871480f46ae3d65e04b6532effeedfcafa38fa25330b9f04aebeb71c1db6084697cf2b27ab7383ff810f1ff3522a56b974889f49b9ea4981a2830b2cb5043160a96ae5dd783257e22dea19f4623032ad331fa22904326b8c0217e19a598ef8b432745b866fb4f49e61e3eb72aeb4f5eebc5aad43a088978c5409c4e5699ad0a9c97806a2e07fdc9cd3690f2e960d132676b60b1a2d51301b0ec54f8e63dc4bb9e4e251c379076265e8f5ff58c6cd0ccd08de661cf930e7b098c6cbf5e6a7ec7d0b5fc758a7c03872291736b1bf69654ae92028dc928c00e598aad4dc50a2156ba32cf1e2eb5ec149fa494fa9ce569f387e27ddd997e72e0264ddf472304f68fe52e64be2b2179f75f31894a192392d0e5e51ef8467c6b1cfb3dca588040459bd81284fe8aaaf255ea9e1b04999758154f03af87d809f5e85dc23526e5a656a21b44f78652379e59c65512d0252905e74ea4f631580f566cd644ea59591e70cb372e85fd8bafc6287dbc3655c4c1e0706930bd9fcd75d7d2ed2baf9ae590dc3eb336f60c3efcb2ed973d4e3c7e4730d8280fca783f23c03f2bdf4d9190e4e32417c6115a7205aace9a3f242c5ba33e4713a9e565b70059dd16c88ce56202cba5ec459f902fb2f6f3102a7ece64be52e4b366d80e3bf6e9d4384f333e63d2dce8b91b68557debdd85806525caa07eb3d78faf6a1ad6ecba4c19da0c469c3d601606af34526598a8ac735ae1c718ccab492fea62328dcb126c3fd3dda214299d565c6bcb2eeea1a08f7070796dd29180621c8189fd6a793a5c34a06ffdd380dcd141b6f59221ee0a57ff0fb766d8b37b49dddaa72474df7a4580ab8afde22865ae40f879260468312ba89f6157321ce427fa5f844eb3e5194fa95af54a480b8016de9a2091a2f55c34f48840ebe6b20323fc76e724307461a139177a8d0d0f7531a502b27c007ed29a6a331cc8fe5f1f666a89994df2729864b849df6e3a1e8b261c99f78e28ecdc849306bd9681098217ccff637201c907bfac57ed94d61f0c1ecbc7b6702125c21af56aeafe789a725fab400b3b665ff6db9fab6ca8e9f93e403bf5b9c9f313cc861ac86da7eaf938668db4594f281eaddf18ac24517c966ab5f389c642a79d42ed8a860c3bdf0e1c53fdc317574fec73f4a0c2dd3895ddd7a47beda68343aa6b7acb0e905f60c1654e80d50bfae4b39242be555e053fb6cf365c872133d224905267c6c0bd73fa5d81a052fee1ee5a50f0facd705f7f0998931dc1fefa59f2f9a0e61866fd23a14a12e4a2b9b475c9f627dc93dbee5fbe7be246020782e2fcee8ace6b48c7759e7529d42d011a82e8cb0eed0d675be6bec04c60b10270742ab738a92630c173d926eff95ba1bb1b9f19ceb4a4db4e1cefaff8f238b86f18649bd3feb3e496243ba58bda955f404bd6268eb9c0016e0a3a900e84fef125d592e38356792cec90aa39260041055117753c7785ca9f64b787aab89e6b743ab39cd86f38e0d26cc00f2be8f1c959958964a1b19f287ed72cbf461cc9e70b57ba6abfc02c509cbdbb53c3f8379324b5a88b9d638f4466706fc8ac628cda7c24f3e4e39dba315487895c497f5a092d587cd27ab5de851fd78a8c24b370ac904865f38b2f6bebc074331405a4e0913e270e227ed0135270b384f2f637fcc50f6c187dfe9ec6e6a92ac0623f9053951dca6561f3dcb61522ad66e16915b88ec137156b8511548bd651382d3e6a3a7c93e889791f005035fd6c3743c6762c6d6e5263a668b09b401192a45f4b5b1eae682983504b65681ac999ffff5581e1cbdd640a15efa4256e20950bdfae8b869364375ad0be33862c4edbc7fd5e5f5e11d716139f62157a7ecc017595af21fa934fb716e0c29132d354db962529372ba52410852e082a20d6dd7eea6996460216f054c0679da7f577a240745ffe32d1f18cf968a92a0ca1e01bb67343aa21278410b45f4f989e568001b369932478d75bd779c5f710e385034e4e170b34dbf045777ffb7ffb9ede5639dc7ea9e430c54dcc3aa30202d652a63df1dfa97c9be6c1ed5e9ddf0ece13611262ba898682242e34e10ab1480d9233b145d105ca8a8f603af84b5719577f0954ee261b52977a66d71902ec29b1cc1172f2f80866d0768b25f70fcf6361aab7c627c8488f97525d7d88949beeea89a848a15998979420a87800f12f35131bd131b6aaf687aa317aeed6c7a7e0df5060fbfafe9ea7fe1721f9bef85fd7955ac15d42d40e80f6a127f1aca4f644b9a9a152a4ee03dc37e25c71d62c479110efed12744c79c3a629cc50b23171659f1cd3164831ad7f6709c3a7f395d0abac63bf18f41c1d98e052cfd18f78008aba325e0f8dd086d7b514bc65bb3ce06c903c9d36694ce446cca2993deb818cfa3272aa051cd2752e4a8cb171d628601de505f1367be2b51794a3925b7052fbfe2e651fc09c3f61ca4ef90994ed613906d24322ded3e877515ddd22f5c4f537ded6912607b61f34f4e8e12c96a8f0516f808098f71965143d52d7b2d18f7226e2538025a4127bd5f440ce823faedc92a01643bb48f56273239819a8b97acfb252cdba865d575a2c127f477357a82de3e0bd15f39b0de67c4b5a2b6e722c16c2756bc5affb2dc52196cdd567a53dec2b799d7da8b60cf917fcbe966ac74e4f3d94562b0a463ec39cc751fec6f2162054b1dd03426298a32c80ece1067f88800df7b674fd052f5c85ef344df806dad145d1a62f296759eda31d0d94a96181b319e6b226f202ab98c4549d4765a93207e6201f8ac58df9de641c4937ba37e2ef49a972cb50035880413eb57675a3c6cb1fe8719b7f9c1d7f58c5c753a3c7523d85871fea7fd1de1be5f7a46191bb3d24d86fc3eabd5b6fd6655fb06fcbda7aa4b5cae10ce734e67296c691901fbb401bf9ff3e00e89397ee74342b149a37022cc1b8dfb8f0f3188b3df2a48c896976b76ade0964690c3dcc6e8a61c978a891dd919a427602d81b70c3c407dc358d880013544e9ea68e087a39aa7a16cdf3cfc00eb731ce85a998290e84df088df11dfeddab323709e1a0ffbfdc9d8301e166dc1e59d549e12f36bc087a5799f75cdebaae29dfb6f9ccae63e667f2997c3afb39aac6566e7e329e3398ed9416dd95723b70187da3de19daae9895a2dfa7c639e09b47dbc6c47a7795a527c107a665838909be33871f8ecbe9bcacd5dee84cc5d8d7248cd81cce6aeb196e04f4ba94b6ad63642ae926f42a1c3af5b21ca8964a2948a5922cecf71f3cdb0b856681eab5ae64518a515a129e4dfab86223506a6edcd512154a9dbe3d90d3466de5632f2894f6cf7a4723b2d086e33d0d7b4691d9f865b23cbb98e96df0e966e4f7c82ab66800242254e99a67cedfcbd9aaf4d33485e2ce30064440566205b5112618a408316999abff14930c2ed6abf13ac0f7278c33ae19b3088da1f10f791df9bb65c6f71b763dd10c6567acae267bb314c75913409a1e4a4e96f5a2effb30f8193597c2fd03ff513ad81f535082a09b57097325f1da67547d24fb7f8d8370ac9adc239bf7881a0704b4dd28a407877cf1861cc72eb51d59fcff5a8fd158089ca7211389f14cb67bd3c0483592ff59dd4a06fd03df7568df35efbbdaa4c41e51a6cd0f95d398f93610c5098103b03d47ca51bee0ec606f708fbcc669ec0ddb5101a8bec685b40ebf218bc714dd635c41d92e06673dbf5b93722d2243937c66261e7ac924f0e81b9e70da2bf70a61dd53df667d9ebad953d1460c78707f59e857670bd7b7fa7c495c637add3170efe90544c1cc8f4cf880b0741f6ff99aec886d422391888cb7bf80643284caf958a8e070079b42d9620aba622fb0e5ca7c6fef19899f9e8fe2a692daccc8cb8ce2416bcb0091bd4a6018777903e23cf953c4655306a801e945251a2d0e533b10d7dd2ebe74570a883ad26e2165ae070eb7b058586254ba842865a1c4c1ca226f7da3b2af2a95317a386127c31bbc4df1f15b4f90654dd046d38dae09add888901dbc7e07ebf23807a2ed2ac5eeb3168a49ecd263d6384b198dc6ca639923765bfe4f1b2f7f162919bf9d0091a63c6ac1068b69397fc034e4a0387c3a4e53f3b86a850f8daeaa0b97d89a308d0bfe527e72629d7a268b928f520a4cf79511088fa786e48b4056e768350c4223e4a2d5a9d396f58e94416d01ec65c2003405bcc8fe792190fcc1c4761e1abebafbcffc2a72 +0x5ed9a434feb7ce1332733e6378c7ec0d4b079cdc80eaf5a9a7204d871ae6bdc685c95a9aaefb7246f4e882428b9b545e9a93aedd4aaabe1dd14461fb1694b896 +86560 +0xce01369d08d37dcda2c899c9fc0d11ccf94a0051b2816a1d6c3ad07fc8dd02d73a5f3555bc205503c4149d06732264210fc93a7ab30933a1458183cea9d54b6a3452b3d164d53957cee84989572f0db5a70386acdb5cdcc67af4f227aba93e41a523d89a66b8d0cfa88cc5da11fdb390aa3e0d6d92410c94f4db461236238263731bcb372c92c3763a483a810754ffbbfec3f64840826b14997ea617b209c0d88880b5301c2ab9516d64d006a3fb993d8dda6ac24de5a24d52243bbf87249fa9ca9abd0ea04a5b6a2727aef24cbc281e3dca91652233594708162d911d3cc8dd23b30c581fb851c851dbfdcd695d5466f8dd92b82533370ba19da316dd19e27c7a11c996013d4273d4c6e41d64a7c71ea5599643bfafe5a007ffc5d42d82968fb6fd1d51ada1d77496308c6ca462264e2c87c48f586d0b0e2084bc5576408c1cc1bf300f8dacb7d281631c4191561cfc75af45235937505ed676b021211c6b2e829f295b08268a957ca6bd25934a4f326719408728d35c970f1bc8be94dbdccae1e530ba86d6fac66e40979f120867f7ec0cde442f09d8c1b5bd2db6394886fac6d86fb66f85ad6b417ad13776560d54ebd247e1d5a36ce5afa20791772a12c519c10bd62cfb4b8fdc9c947527fde94f4db1a2e68167bf0ae5127dd5b5482734c2e82fa223007d3727ee07e28ec5a2f3f8f217dc9d1f7a383f57b70c5d6b6e4daa9501a3bd5ceb6d0ab753051175e045d5dcd04a90914477a5b8debdd65b8e1ab710a96062d63c386d419f6619d74d4fccb9f2b8c286c6d0ff7c1a7188e030a3d2a050627b3818a138d2148e0fb18f18c6cfa8ae9bc5a84a35ec92afdbc2fcefe48f1e2f6e4829ae53b3da0459cc4ea8a96818b5831891ee2f506fff37c89906d3233a51a5cf1469a62c185061f033085fca6a54e24529c3d6f0d8e904bcb0f089a5cd50869484da1a84f6fb8de4e53fce3dc714201519d11013f6f6aa64e8b5ec5cfeb27b611f0895059d8c47720d55e00b577ca5500920c602f1ad9188ea5ee692f601ebfc8dfb00f5358bf66053537b7a4114d9bea0b9e106f09721f25ef35e8ddcc43e2e77bb449de58101775e4089d4ae64252687a347651b3ac369ea7a3b97d984dbbf85514745d6f5d27fd724f15fc5f5ef5266e6e2679b20ddb439fd67f615c82c775ec4f335306fd04065079b64af4ea008e48b985698d1d99cf183c9f2b718981eab1c2fb41a776382b1f26f2a93f7a111a998537839d41de9bb1549d5e8fc877b1361e20bbc96f30c63ec55fb9a7959355e18fa17a7b013633ebacfe5cffd61573f9cf6833f53e8a722fe351deb5b2f3bab1075790af021d1237a436c95a28f7ad6d55262cb37ab1b962ff7d9b0258ded378aace68919b1fd115d8db0617477ac8112def087c9a230688783770e60da11ab8d87a84cb52aadb16c96fa5cfa82b5e85d82779c9136ad400ec13f2f937d70ae22ee067c4bf4aaabae4491adbc185cb2bd263d3217cf5cc5cd9a793b46e0d2e950c947416477bca62c80bf7e42a26a883bb28b6fe4d603a0cbf46c59016aff031f00b4c2871aaa4aec33caf41586a811dd0ea97e7fb16b7910b961b24d83bea5977b95283c483e40f843fb39bc2edbf6ad23df8570ca5cf6a5cfa06eb193d877c122329a0c663e30589a9a75bf00cedeb3d775ad40889ec2912071b4b6021620a4ded2417ddd73c1121eefcfa7664872f613b21d7652f883dc921cace2393e494895be451915a59c30b94170fac7105a7ec0e0fe9a9233e28f0fe880c09e1899b6303fcd68769c69b952da80438bef3d53c4457734af1786b17e1f55d59a6eb9f5989b01f1691fcfb6d000260719adc37e0929b1cd116c184ac60756ab9606500db31a0a3c54f8762e1dfc8ad0db12950675d6d3ec20fa3f63d1e8a8c9f8a907076b0610d1a0ed07292016d52538e55bf3f293061a4489a402860c76b7291f86eaa7a53a39b6c72ab0c1952f8f98f0bc4d67a772dee5e0ee32cdbae6fe923074be4f41b1fbfc4d86c9e8c3bf9563f9611dbb5b3ec06bc8c6f88e3920259aa47a8c4a209d9fdc49c47f7de6aebf02c9f26bd8f793483e09d45eb1d24db4a8423f5b828a25adbd818bd768472395db28163da5c398ffc66bbf6b1fcd953326d36c33dec971ae07bf84db912e47a057de759d0a06766c6bb63027be721f2b7b1fa81c4624aa2a21c95792e1e24267deb2b892ef0a541896b1ce9b770814240fee9c1fa2e2f8a77567ab043ead3b72d96d87243c155b89ad2542ce33d99ba44a08ef43da4c82af6a63283a91d55a4aaed7895cd970b2491ada33c8d82bdd3594354a91d7aa71c96884773bc3a3c976c7b86741af6383e043984a924f47025e553c550f7f44ec7ed791400fba5fad7e8ad8c9dca435f3d492272f33817531a8f5e6b7c7bb611c5420532abf605131eb61ff5533a1302caf6d4e89b355fd9299dcfb19c1744a29d5a992de529cc17a44b3f4b6518f9a56f83ed6001bb2264ebb7243220490483a89db1504d055f6b311e880923b54bc98386c883d7282398d9620857b98f9a177f71ea64342753902db686b92fbdade1bf65f2ae8c0ac7e76b04c8bcb85959d09a7db0b43afe3d28f289a7d5d97074807ba7f84a90e183d3293601bbbd34e861821780dad1f87098383e87d9c1ac541830d34602663aebee8c7c2fef38b0aa2cbee5f74299a49250671b935f689fb12b775e6840ac75648c1d2dcfc1ab5b33b4b95f6085e2911703f7c766b14ee9104cc7cfdb9fb42f825e53e14dcd8573097c09ea791f5d3c730572b85e89d506e5deaaae1c7a1dd7c9b7b93d468d77b69fe5192d9d695a153ae76064f743ab87c653886fa76a69fcaf3ac578366bc2846ba26f7f3a0e7999d32c2963cd6932da266df98b18eaf91ca759f14889f3267af1268585fb793c68e046662b5d84fb7c8a607686cd667b965687d514ddbdf3f8c4d3f3a84e3402d0c6b88f32040165ed66ed67f9417732181166d9739e16bb8c5b4d227caec96d800b151cfe6d7922bb506776492197ed107c5986db47b7fda428f4aa699993fce531ce880706569254bb6109fcca42ecfe0be255b266fc3aeec26ce4059b3e017ebf5758e25b2435581c6cab9ac802b25f2493de9f786de3ba9c0877b720224bcb283227f6c85c9c1407dcc3999741edb27ad08a09088798962a69de24d4eb0c48f1015ddafa8a2736e253fa7fb4aaff76634ad07573d3ba1002137fa505f2f3769e2762f55e17773f4044a8c39c88583962455a7b56dcd8a69777d4de4fd471d2a426efec6f9f0c7bb62166ebdb74986a1c6270613dfd64c87f0986272efa07fb97825d169b8b479aa89cad8eedea2096e624caed75cfff040d6b0c160fee364feccc230a8e56c91a8c08f4f34073913e540eb276bacf07d7e6fecf317f2b8d5e1866da3ea4abf159f4e8d5df7f8b5aceea72df7359750fb2805757f0093c6d94aed50b398ad560f767ceb899f7ac0dc71e13aa89fe5c77326de73ed82a8b678214a90e718d7d8861592d25b9455ffac563439c20f5dffec60420dc604fb2fba4ee558c8d390ee8364d8695c3f511c2385e952cbefc89d6ebd7b6b90f052daa8b906cedd319f400d4a95d9130636bf4ae747af4da6ee4c0128d0b6d6ad765f494bf51aae9bce752cb213490952cb8f27629875cf9c97b2ae8688161da32f65a6eaf965c377e336e88198e2c48cd935c5df22cfda398b777cc0ecb2ef3a4494c57f5cd7a52ea72a4aa06dcbce1a285829472fe3f5e5914474be44b3d3da7f96b0f36497db29e2fa59f7da2daf6680a15d8005d9a80873c19c68d84052eba6106f2c5aceedcf5c4d1e6e2630edd6a9b86874ecda7b0af795fea6ef82f3d582ad081486a36487dccc9fee9bfb12d46a4452092e0ef753e668a261d2a13e00db1285922f3fc6bb2c1fe65d7fb7a6c78dee2329129ca34b07e48e7fcac4bbd579eaed8d9ec99ed212edfba51b8b2f17d85de4bbdfac075b24afccea1d13f3ba23db49ef1c6a713457dee4acb7a0372b14399da7de68ace90371648813b76d18a38da09fef4ac948c39bab5c9b1e456d092c54d557f6195f6dd35c43f6d8b158bfaafa855f902d781dcc589b0e2ce2447edc132d917ed6232a7cbe020c9d48e040d76089b665262c2f19f15359f294183cf1e196d6296c9f021692ad9f2fb91aedbed8933af03bcabf28806bc599e6520c14c7fb6c1e6239bd46de2bf5b68c6c90076d8b355af4bb96a40ccb98495d58b4edcb419c86405b22b6ac6656594a40ef5a2459edcad9677c339e5b1a298393fc23f851ae898f6cfb0e03450c407afdd45d07e5ab697336387d3d039562df6bae5f5313ea4ed6d40ef5ecb05e94a40b05bb1d17b65e4991942bf1ab4f1bf9499048e66f98fe9dfa24146d8f937d50d24a1a6ed858d2e3de56e5c23b917d5a936c87b84effc06d48041391caf42207ba6d23030ed7edca864752b99ba3b089b308c3d19668bdcc2578995d4ac9ac502b347de3a37cd685f22f1bddb3cddb0e0f2ca53a311b1d45f9464edbf55a42b48d69d0167d8fb69c89d6e8376b57277211a2d4fa0560075d2d37dc12b4ee0dba48d2c6a58658b498b20360cdac88bb3c1f31f919fc7fa39e2713e80a70ce35eac4380597a41ef900d7802ba95caac0f4a3a0bca0fdbf1a8f50a21dcc0f43e1cc696235f4c12bad5c5f13f2d365035d2304b8c496ef6a94b810ab205f7b9339e9a01affc5c4c5f635b2855d51addcbb50aa41ba03bcc638a2d0f89ccb9a0666c8cf260b119535ff11389d132d1e7c0103fd0345ef4b1c2fd4f64f371956e690f1604f00e01cc3ee7b5925bd6f9f2d58c465c50e6384b3a1d6ec7999509579deedb95d863a41b6ecf87de3021d1735e81c4a51bd664fd5b531183e6b784109794344184728ec5820120ca18b4170ddd892146df90194c8936ce465559a41dc897b6748e8b105efb3506e25ffe2916d51af2be26a3b3bd5640fb7b8febc7d3a351e8cb414de74c4cc3a0b370709622d7af9f777b91c2c4450a3f8fd0fe9dd6da5b31a2571b6211f94594ba14bbdcb647cfae1f68eac505d7eaf11fd2f2649bc02c27963a741f4473334972a7206b45c7e3a4f2590f48d6817bb6980077da96e74d310365f87d686d054559925ec055ba940aace68fbccac424f684e3ff5e5cc226f49664191ad22933fefb70b78a6aa24945bb7bec9f67228f4762e7e96e51e351d8bbaf4666364a57fcb4ccdb17f9118bec8a93967f102f031fbe96c6992acd4663ffb210ede942e9c532012a07957ad465b6b81dca7a4c38f5f47b275d2bd28d1cbf16f9208fa551cedfa834b7a460ab57bc73f30fea0c9950a10f8c38e9a59e6986487f9c7de438903a3c7bc6ba458938f831b6ce03d29cb650ce559af8c8e2d0e1c104b0587206afce487fb35babe660168bc9734c40cb9d60322411bd9ef2f95e0b390a93e134840836b0ebed065b8383ecbb9e27d99e8c6bc5783bcc9a573967a18d19b4b44aa37481afff02e75109ccdefdbd1b0f9df9e002b2578a6d88177b0e616c3f6dc1849fd3dd6b21b15f795dcd103eba55326c497463139b6afe2a24bc5650987031ade687b99ebe16df48b35183c17a4d046a24951aee643531d7d135fc85545e0395e537d5285c6a68fe69e6d8b3df498c69edef4a56793ecba72cf59468f799cfc3184eb086713e8500ee078fa46ded22e221dd61da4eea142e8495ee79f6b5eecbfc36cc4790f5ac06cc3e09018aaa70795cfa01e849e9a3c474714b46d634f8f70daa88da3042566660e4e559ca03ed75fbcf9b1f2ea0030f69223b4e1a99770ad8f486bcd3870ca658b6952ba07c029e8ac8adcd319fba65ff234f0e4845d14dcacf466dff46475d200da8e5b2954829767fba91074b227e92eef6e5c3ec90567f75387c18029ee13364811654c236cd6b4f32091434e3afc10fb38331d05cab4390ed55c24e6bd92f55ce4c2b9546e0d5d1a483ecef668005e01564f6a36eb2d39cc589628c46bb504be0e58b81011a2281929ff5cd3385de1a8ce9a6c87f038c1361958d3ea7fe62d159711907fdbfede98cbbd360d327c6199aafa6d1e623f97f41f8b6f80818c360988d38bc85689473e375ea5cbdec3a67bf259b323c9a984ad731542b0fa0ee844e888ef140aab2ab474ccef35c59b77f7ac9e87bfabde50091be095a071d60b6bbf17058a7ecd50a28aed5c746e6d9db5e2b131199246c3b221d2af786e4b6729166815533a5582ae82ab36b0619fe15c9b7af95b0549a54d8cd5da6179d5c323f4636796c6ad868363edc310279b0994e0e027aa8d4fbd8565d05c831bdce90461f0427cab3b24c7359a4dbd47c7dd07b8ce0231b1c0d4ffb3aa7e05dbc89f7265f7f02d70692623009c1adf498d275b2b29d315f904b2667e4d880f4202ae150960b7d09d9e523ecdda729db654ad3841dae281ed831f60cfa0c2cbd7f0de975413e08dba4172c1a33c9f1f1583384703c9779b16a5e395ad8b735f22fbf69d4ff8b28d50bc4c538baae88eee84902f78deda8bfbd3c5af20f6e5f3ab8bc0d200f877f8e676a99d8c0c9412cabe7d99a802527a24738f5330c95eb0fb0902db71f975f605d75046ae4aecd22f99c72d9c1b29901aef072be6ec27bd99db8563aae4f6ad34470bf7f94d38f7a87d35925b12a5f464adf6df494888430d6b1110b1a24048fb2ea05876fbc0a8bad29171edd00fcf8a17231761c3c86ae0206e8a901a9bede2f4d8102c3dcb0eef00a1715b3caf481593587a374631599961637a4f3351c572017bc824fca250ce6f2e3bac3dcc888c8b5bb0d2ba0939c098b988f4d7a9f732be5127641e8e98df88ff76e8bdafb67766f5623b059931dd2c385b89edeaabab9121d6f68cd50babb1decb18a3a1fb5f8cee387811296a7985a89c155c5d0b63e3b57ce12fbfd3b95391e243d7e87fca650ed993c4010c1b0bd1f2a10e4a3ce41dd3c22eee961891d7e1627140cc6943591dee9308683e4c267b0634eaf969b6a54450e4b0a001bca396f4aac897e14fd0e21e81c4a828933e6d80d6d8b1b85fe5d0cd0b5f27b7c121783ff7568f117832261264e007f378bb70078fc0bb5169433ee2ace2716228b84eec5fd3fe1f45e7b1714443cec783054c43688a5f5d5c295836ce21c6287acfe2a2eb252a333e574be42ad744cb3d84c9dd681fe504befee472790470343ed0fa0aa2355c76eceabc131c83b3282da0ae7d9865956d192aab3db573b6acfc225fcb8cebdb0fd609cba5252f6105dcc2c5cafe45b7c1f41575408b56dfb93d2dd98eb12ff127851a42434ac3978bd050d46da4a79227d8270a2202953482875930fb1aeae4e67f87e79495289de293b4a40d92746fc84cc8318c2318fd30650e2bb9ce02fd734eb683410d44bb31ad54fd53cf9296ccd860b426f5c782ea5cb49371d56184f77911ddf1ba0039a0a49aa7e763eb4f5a04575997808b0ad9f6b330ca38edc19989febf4da5455e5902ed69705666e29a5915e988cc4ade24ba73ca6dfe90fb8205e7effcd5f974814eb40c97b0ea96b55e022ba0e2ee47f5305d29012f317cd9753336a75205c143115959037a61b5d39c86e988c95d8b71e1d7142fd4b88ac7624a5cf625528ec5d243155cbcb2851b990ae9e78981f2c2544a559ff30c6e745394299055c7222f19da0b4c7cc54fb6dff4f4662b40c610111fb2f897177007d079651eea4bc7aa6f860279c4825accf6aed2adb5844d82a1bcf4e3c5c0d7a96161d747edc8c35e5aafc18b9bd1f084649e4b633234d1418b8be30787efed818fb448b465255f7264bd112b0a9a5706b32e2730a738987457f2460de48cf8b8e1da800d5a4ae30e1518ba0117c5d87b6ac52dbe1e78ea448e5be69ce5804175e03b47f9d51f975cf42884b4cd3abb0b12ca26b29edb11d9b72d8c5d90b110e1123f6520dc8bc281895637ed31e148dd32a7dbb7304b545a5ad0fef7ef08ad24014fa12b7a79aea85c089a534da2c71a52c31173dbb0faf000ac05130a6d5f6535d1c4c2b4cea1f7f6a7768f28667fe9fb86938ea7f04cc230296859e7c96fcc352f968c9473e496de9c9348ca13b973b35828b19cf492f972aff1709002258289cfdf322150bfae9c4eb9273c93bddf05a19784c3a414bc4ea666010d02c9afb91b675b634d7967b924b0d385ccd35676c9a9ae23e819344d7690b364afa37a4d79f6b063535ce8bc883ff5ada84300903826d8c4a9eb88f687372f9ff3fb0cce5353d92848ae5a2de13035bd0e5404da57d6a9afcdd0e1d141231dc6b5188dc410477dba16b8e49596493abce54f8bdc8c80caeb3e1167670d1b23dfdd4324b5189a4422a3c2af7a1153adb2177cbc1f40eee280e2f5413f51e8ecf452c4f92bd314d867d914e367b91535a78b23c02adce69a77a3c698e276521e0cfee335ada97cde919ef5a7e1f6597ba4298cbe85c6319ad768ca93d6e5216230c8e800c4029c01a9dcaf237230e527b0d9ffdfb9689789a8184b5ba5051d5f67981a81f6463ae7b67a8880a1cf82e0d483c34b4d29df0ff39d8f17d63d0ebeb956c2e1cedd1f38c060c9e6f63bf84e170f2129c970d3d5bfdedff0f2f7bb262eea2847d12f139dd076b97cfadd0f1a816561a1b6a7398314c3820e809aed40cf3d94dc89a4debdeca4a26b341b8fec1a6ecbdd9b35dac1fa34c298088e6cb4a3354ec87da547421fd2cada2d5e3f6beb10a60200827e357a19e5b7133a0029b2bb9d32359817d16ee87af26b0fe840fb343c3b6df6ec8a9b5a34922808714705b8cb423ae71615e3cefadb7894521352c3d3ae6bf9ee6666e0f752cf5f86b7a3121e2213f80cb3856c92bcdc57458bf9a3b48381f34a72e191761e90a7082194b3dff74835c1565caa8abd1dbe8950f7be27e3384cc9551656f81ff449c02ce18155ec6205fda471712908c533e50b54fa73f6176c33b70d18c77c82ab73819166ca26e8cf8745cba7b9c25c1d23641941e2e3a6bb5042cdbd295ec336ecc8ac4984d062fd28e27236801668e409024d7abad36da2e89c5e2e67ed3d52f2a83b11cc1058f6a8236f04c72a73ef608ef88d44edf587c26dc854c8507a684cc945a8ea0e5322cfafc9fbd52604a8efaf2261c85ac5d3a75e131696b002dec3d4d2f526f4dbe9642f8802f433a476800ed4e08e4165ef5f16485b17345b1e1f71ebe0c8e776b3314ab5006a79d9c1d95216f1ddcb5e41b23e6f0d95050f8e284796511711aee8fca957df801f2ef2c324ee7cff1f3733687e8e13564aa698a5ffdd305c9a0af08ef376867e4d286f062c666a3a67782c487daf55a32ca6a36040c865e0aa1233afd11addac2d51a16a1185a1d7c8aa941be4d9bbc3d399161fb35ed9e8674f1a26eb4ccc51e430f0b77c530a1d6c54d2a95a152d0066065bab00a772bffc480bbde8133bb79d4dc5b414d98d567bfe50ba886a93a00e76d9ccceab19ac8f856f3a717812247e31862a821e13c81c30751616e0d5ecf270f849c573b7f6498faf662d8239e1af639de26d2a82bd7873a984ab7fdb2c3b7c20ec8e0632e651ed3109c5399836596b70a17e06c47bb74e54ceef508da81022b97bd16c74c4d0275febe0a5186aa4d269325db9bf4a004adeba8c5ad4a79aeb2bbf35ae63d8edc6a0d327cf9fc7b71fee5cb14b5d747bedb01127a59673005edf8063d3e969d1515b8b41be1693bbda69e622c5844052c2309a6b3abd526b043b8603e3edc0a350fad9d87a6617d78c41995a2e1ef5aa4ec71ffd202f8d0363a898bce756268c4ce486910c759b34bcde3dfe8e12dcae1bdd66885fd66bef058f8036e50ee1b4cc815a167b2d67f9f2a89ab9ee483d83b0db39b2009836587256041ae8fc394258391c0fcf75c24fb607773055a8605495275e230a5f34653067ed10f508785e787496231134f65e91639d0ecb1a8c47532b9d848512af3fc92802bf161ae432b59a8efb4854494d0a24d5f958860a84714ec07d7a99ed0dc5030dd0521ac7e39613cd3f7cbc0445aab2e59905d4233477f78db5f0dc37f8aa5fd4eab2f0679ca4471b96b5546e6df7759598d9ec1c7fed90ced5efc2d42802a321b63c850d83659f3fa8fc04d1ee7bd6af9bddb6408c5c8049847f350ec45439badcfabf00c06381031e58b473efbe3bf94d171bd6844c2fc76ba91d2bf529886703f4878a7c26562da0d24c9e99470d3d539101258e43050f32746074e208f8f2d331c6f1df348786d571b498149eb54158535276d3cb6aeb80e9e731b479f121f6b9627e10177ad6663dd5a9874b99ce0263f4117b6bc621fd0e9aaa9204dbbe11944579385799e5fa3e951b1ad623abf9cbd13eadac817a52ed6126a5321e8fcfcb552a7e7a4b7a3a7ddd34f7c8baa2e693cf45911403be278e25ef148a225dd5647cd80b0af75fce01963e43a9c57971c1d86d502db4b523f7cc4b089550efce6aa0cd068f075a5dd2a67f29ffaef9415fd300127ffd26ef324083a9d90e0f60e2ab4f988fe2348ff9f740cf54dceaff74a744fe9044db334767de1ee0c58333d684a7e994f0b50e7d6fc85d2fb71452093e823debf29a963c2ba69032de14f04d131d202599a47f66f861fc19a73ee3257f01f615702cc01b73212655bf8a3f5040f866cb45ca8dbd7951d49914325ad0520b529725595aec269909d3d2adc7e6f382e20c5cf0de89d9e10c3766b65e129fe679fa78e80cb52e5460347e4531171401bd7346dc1ad20259cc7b059397f44edb92c6d3a37d80729b54fe2a1924eb8bbe1e856b57eaa0db013eee5a91ae7d4832c6819d505654dab50dbb40f2496b40012ecc3428f6fc4c208717cb774bb673333cb53db83e3a4eecb2f22798489e1c1214cf0719e5ed3d00d27ec10f15a5b8261de91da3de38b6866c2c47d3c88d0538f9164df05f7c96e745aca51fb554005290a6a4d9de59facc62f0086b713ee4bc052a6f760eb03f1e0828dd70d2cb3100be733a21e5a20306bdc6d227edbba2e65f92d373979121ed447ad3ca15113478ced847449b1db77ca4360dd0e10c25fe30d6e3afa527229b212bedf4262df202e95d330ba9d1ff7540c9212ef837574c9f7f06f1de7b2b72c6c295b8ac2a52e6378b673bb7c6c43bb8067609d8461f18d514a302ea9425b85cc732dc500d3b6bdfe9499f6c05ec1435767429294064a9fa1d24ab727af6b60ac32b29b9e097da0a0042fe71956049df9f8456942e10483522f0b21e3688b4f93dea678fab4d7bdf56bb1f6d7e0921dd0b0c57c0170a3daeac6fdf95cfc1fa50bdd65e7c74459687751acb09c9cee6584276f557033ad08e4209fc804d8bcf38cb57d52645677329e5c8caed7d96de77ca28f8fefb8849fd6d26cf86b9cd7dd9f0d59635259b5aee2c2ee4c0a24b53632d8c285f05dcef22b42e22501a6f4a5ab3b867521dc992fed4b3e12b41d48b43f3084c222c1e0b269f89bb8578587fe49d69112533d9648065be88d56019cf40a2062eef7536e530b69f62cedb72639e354e5c5571b3189c65b9a2670a026682c4ed946cea0cc56982d9e1d34ca440b103d00f8bdf3ff67c5e0bf78844779a30e02547449289f3f98a9dff3bd2d65c448f57f46e84664545d71c4fe11860b1737f160f1d7593b607565483af76f00180624cd1a7680e4f22595472198da5f4722828b3a09c1358bb6f6736d63fdb758d03156fdd93205a396b1b28d9ab2eab5663c3fd740ef21f3e5c3ce059357d0092fa1c96b90e85afb295d938c97be31e46b84fb341d31654b8a53d49df60bfecb7d0c80de2e02396b65ff66b9004ad946bb0349eb1f4693e50d3d13811c9897f260c809e0111e4566d52da89d74f7257ecd2da866a78d2272f6d5f769777c4030436ae0fbeaaaf39fef5ed5a45621cadf2a7a933146738557dfb51cc187256be7cd6b929c0b16b8591d098a5834791dfa5b60a6c58ca851161060eff3cc329f9b37509b4b0310283506c41343806bb342c8763fadea8a0a30315fedaac7124fbd49a0678352f5b7b615052cd0da580f6b0a21da64d0971538cb0892410842e0e05ce183df8b55eb5ec043139aa2eca6b5890a1364df5e069245f17a40f0531786e98a7caa1caf3781a114840b6a880dd4dd856728875d52cf2ab102352fb148239801be8d777020e12fefda9da1c8a92b602a324a39038e51f1bdc69816ebf748b0edc5f42c373bdfd53ba3ebd91d0d3bc96f212494ff1ddd238e33e436619968fcb52f78bb62ece0399e6c5080f39e7871daa0520b8e85934888e6a40ec0c2f6a3ee5775a581c894b57e807629faf183e1f32c5d0d606a46d9543b42107808947f0fea956b22335fe152acc74471aac0a22f41a02ae3105a4e76be68ec05bea4c67035328cb2c1b435c13dbe51160ec12b057cc5e4a52c302046fc62e1e869ba12d5e3e78ab208443b20bfe5e056a207f50c3a28bb15227ae76b51daa29e9e46fca7532ed5be5b626a27afb872a2090788ba06632eb1779d0c5a7b2a9e96c0cdec4b2f72fe265fa13b1c89b07886a8326e757defa018b019277ac4fd467f85d15a57c54e748869732695ea687273143b0ee4ed38cfa95061a162bbad3aa731d3df43a12bd9632d7ac51a2e4ae105b163f28ee0c8fde1cd2902a8ebc4dbac7957d3a56f958d35000a9f1fd1d254ad245fb1c9f53acb50aab1d393c1deba0da0dfefe37d16107c85b50d2d81893dd7c170b52ca6e8b8846dae9cd9da5546396cde7c845627f3a8230ca7b999ea1d243d69852d526d35eb8a61b6d191c300be11c6121e8745b7565c73f74aa77f7300ec8c9a52a432c404859dba2184929a1a544948f88ce9cbf5b67d646716b3cffc437c7d22f8d4035de3a53f202f5e52bc98ba79c8d39eb214c59b778584218474f69b9614eccb4456290a8e83fe80cb4353ac3d05f7df0a21ee60b92c5c3351196a7c8daeec73378bca4050937ea4741d1980fb26662524aba54fa1d22b7386481381cc6764763d7d4be90df53c33edc85efb4ca0bb0ba2108ebaba0d6e6cc49f866dcad5014ec69922571f1f93a988c3985d9a0b42ecf30f0f547a3491897c7e3773115e3f67737df23d1c79219fd5ad5a4a7bdcba53a7e5bb8f5aee31541e62ab4428897b5ac47a1fed8ea8726174c419246a8b6dda2132f7dde4a0ca473aeb665388dd41832a3c2ffade13e2a8b6d6597dde9df9eb0f8568c29fe2c8fd5286dd23aad02e8b253286e793421ec04c229fd9409acb00c34b62dff53ab9c0e5b3842716e89edd35dbd93636c97362855760a948f87da5dcf39a888d0f194c75000ff045bd2ef3ecb67b5941007ce9f2d32080503d7e54bd2c644ebfd663ea70dab4f1cf943b69aa5101e33a8db7d1252473d0fee039a8044444b51627364579c227be1d2450990f19f1469bc7a0b29cd9bf2d8d675bea12d9d03e1887ecc7e054eca7a6d41b2c8b9fce05ed54c408ba5186e8b46941c5996b8b5c4f6f13fc54e168610529d77e9040fca397ab9e4e1e2a5fb4ec3c87b4d867da821343285d48161f5ca0ac3219cdbc019233429bed28d29df49d779a22805d42621cbab6652a51961d11c19788845f717438a049707ac8e63a6090f5a901ba575ec42c2aae7c325104c100943564a9c0ac204b237274abbcf8ae1f26b2dd1d8dea921e1183ce26d4b646ff94cadf2973bc72a9b66db6c986b1fe88b9da92e55a981f16f7af90ad95941bf53593646d0f27b8528eccb1c0d7e8da540b8a93a041e9b38d496c64351840a8b7e33984d2f77059cbf909e610252fca17a83d8fece85208177344996bd12e858e2a27c0f9d118ef7ca1bfd445f2d9362a2c7db8199253751c21e2d0a054c02b0e76d8a9500093e1faf568fcb0c587a721e4c5dcc4f4709321c1b18a8117a811af55e69e642a73c9bd806fd00f11bda5958da04e5d633bdabedf2b377c9e48c1f743bc20a4933b1f3abf6eeebf7bddb9db63978d618317c459e6ca57f16d14c45cccd3c0afff5c4b092ed0b930488a4c8a23062a7fb896e86955196c8de8be81765dc80ed4a359e59f4b2fc0001c25e6283896a5e6982baf83b69305b0b58891aa83035bb143a6676380e683ad7b430f1c10a370549658923f87b183f838157d8fb90047d444d4590c8c9f74a6ca643ffc47c72a3827a028e3551f97c304d79d8c7c5953ac2b6632e0bab5237aae0be13f3a6c241fe094ec158b1791bf80618a275988ffa76bde7d8697c210978a9cab6b852d0e6a45a9444cb644023c5f25bbf6bce9bc548aafa164a030bc8bd4b8f6e7a46449a5cb5fda0f432f79c7e5b6bb6133260a420c4c3711609b97d630c34c6a24bc5650e61b15c3de2468e0b876f0fd48b879ee6546b703556d3305135e2439629fb50a2a7d7000d3ed40254bf905315a0b7bc82a2199c10b200e76f0dc06fbfa88f6201cf9714cb0c4aff404af609403a9905dcf6f67b0de5e8aca5def7d1859029a411211a21e1154f8eb972c8b9bc21d481dc982a9795b63486dbeeaef151a8701cbbe488afb6218cb6a77d2febf11d11386bcfdc7811ee8c7ef9870e5889b90dd4e8620944b2f8a97ff0b4522847f6f8336fe534a4e755979ae7ef3f8d978ba7d47ee1c36a3d614df17d5f5af726733079d1205ba581b3fee48d6e6818e1e6e72267aae1a8bf25201536c66ee1f65e62127ac9790345d06864d44eb182d19275c889058986a00cccf20330b76d1f7d35075127b5449d747e21a2d54352cd56f8cece39e48d48def690cde75c230999525f3d8438f2f066e823e14d46103ffc193a1c901944206348f87a31868b1c79602228262a94a56f4d7277fce1458e4a7f165d5050348e636a31f4575d2ec1e70858f956b2b3265756174e2b3d782209d26a78c2b3e3fba5044321a008935ea9f20a985cf8d6dae6aa194c2182316300bc3c552e67dbd0f2bd37eb56b0425d88c540ec80258529e3f2805b28d7f8b9f9e396dcdc97a473123d1439bf7cc4244c2a00df0a61497b18d554628664568cbaef7ff51369c44ecd2de2f22595a01dbdc8545841d3a8384bfc9e488452d2440d8900881d05c5c7eb35aa00ce225eaea24843406fa42cc8450e66f76ac9f549b8591f7d40942f4833fc734a034c8741c551d57ddafb5d94ceb4b25680f045038306e6bcc53e88386e2b45b80b3ba23dec8c13f8ca01c202ae968c4d0df04cdb38395d2df42a5aff646928323016370ae0a0049989dee37bac5bfbc45bf192379d998bb914812c05dd5f25a0b806ce106936b1495eb948 +0xd34e6a8ecef67262a956051b3418db500aec04c537088a86059baa48cbcd6f6504a7354880dbc1910f9ffb0cba8b77ff75ca9da6856a7ef522ff21d39658170b +87352 +0x1ebc2320c183fd3ab71a10bb418bc9ae56c6ea17f4a0811eb51b1b70a2e835e34b2af359187d15e6da372635a5eef627e23a4bbea0bbd43a2b5e5e81e0dd4ac43f853f60423c1c02edc2310f2737ae43c8de5b98f3208a69a6d44bd78fbdde6c22546efee8c8fcd61a4499126e70d848313a836c96d68df44e0348395891d8211b20e8fbb22a9baa8744c50623a05c7f44d7290430e5c3234a75be71e360202c5270141f4769e3c65c4a1fb3edd022302a3cb7266a56163dc3b21645d7329ed5f0cc5c31508dba71c2de0ee0750711a30af1939bec306d8ce040b67edd0f3a631dbc27fb749f0af5e189fa57634d131f0d7f272a5d7baf56caa908e49c00dc2000c9de435ca6ba98e0d24bde5eaa0fee5b6dd99d6640c6e4a875723ebd0c6c52c27ae7d2afaab2a3e7426a3e0e27ee561b4313bbae86997ea32a5e56e73cd2428a58ab7016b4da5e205fbd3f1ccb96a0768a3c4bde55106be35233f2c397f63881ea92e439ca1a10b1b4ada8309ff01393c9bb169db513f58f7459dbf825c07bcfb805f8bff75a02c2c6a343f1a9e4f99b88fae494af8a62cf1938d92fee19559b4a6a725140827d7c1f05d608f35b98b54f607c6a4a5dfbcdc838b310fbe70c0d292a1b96af7ac706463c2a1c853b3a0aa755a8c88f7508ae09c133425314e94fdcaebb374b2a2889c3b107d6656e25c117412e5684b8d19d643b1f6efe863486eb5d1adb1c7aea2d1fcb34de9ddaa103288dd7bb330f9dc0620e403b052735dddf9eff2b2b535419e1f17bdb3569f8f8609f6ba0a462b63f8aa25e526fdd347a3edb34ce7f9bad76918da276330270c74ae0b2acde9a6243655f415a44927885937b7f6d203c3e6bb7067256a18c53996bb87488e99deaf479aeb0fc8c2d4a2763e6a9b0171c4f21dcc4b32386f1e7954d9078dbcd55967951f574e05096f28738837a3e6b2527c0872f2d87eb1875e477ce874e92a9adfb729d55ad98b5b8cf99bcb9c0243d106f41afa728d7e944ad71dc6989418079a1660f1b0c6a72e3240ff830dd4b4e505691acebae524c9e19c420e633e2c44094b4b28ea4d0b5bdb021a0a53ee73f309eff8ebfc26529c950f704c5f47b5c4bfbe4ed761ed1668c9b571ae18b00f8f86f13bdec0c16680e7992eed0761630e2ff7e2a9a21756d990d39cfac6b9f61f0f056a13a336ff1b5bc1d48cd5eba284cc80bd0c356c5b22c2d5027cd86ca62604a4fa270e078ac064221798557702cd37d1347b964c81d8d23238b0e858ce38fa4872958ba3882493326e9c0073f24bd461cf644f5879703183a613510eaccc627849cb86ab759c5b7b20046162ff8534cb0472cae0806d7341e120bceee054dfbd0655997fd1bc3f44f26de2d4890ddb756a138395554529e560758689f766c47f3ea03ea13ae8b1584c352f493d4a3af976c323e7667b97f6aa7e48505086b3373957d0a00fc6540d93f681217adec5bf911e064712957fee35976ce29a191e9dacd91a1cceb999ed702e930dc0102e306f60a54508073444887d8eb122a278eaff9055480656e5605749cf5ebba2b7046847ab61b5654782198d083c88c754d7b83a2cd22512d90ecfe4b0a4bbeb02a4023f731d89243c3f7f4273e54adc34cc5d230b4bd961f761206bc1604f7d9387c3c486d911c884d5003a5c6bd7759b3154e77b0561e892d01f6b8c21f4bedc2823536134ddc6b3db72c11c00bd17eabf35f3e6af7d0b6e0413407b6a3a436f2db7889cb15ba34bbb1da34d747a27c5ce86d4f8aa794edb5582a719998e9faee0e6b093cf09e2af1c872d7b178d499ed7be070b76f5275d4d03ebe13070282dea3787d0fe6709605835dc0f6a64e1e8635206a9955f2976631dab5cef7d616eb2206afebff18c01f6a03b84fd9f853519d9505d9645d9b930165206f704ffd3d147c6579447ef06806cc86641aba7f733ba8081fa179c982ca47c5a17a5481fb01446861bc8a6e07de21f4dc707ceb1797bf3d12162f685c13e76c0a1ecee84d6fc5804a6f2581257b68c85fe426e0633a446a5bca68c24865afdf5263a37b5ce86774dc663573ea630bcb977da0a47fab9d58a2c50a1d6f4706e52252bc8250f3920ec0a8a38a7d2070c52943d27f947234cf8e10fec2f941544522f101455119ae149e3d580f073a017ec03ea5bbca186f97c7b22df90ddb02c8f94a5a0b85e0234f1d2e3b49af3724bd0277ff9f4824b877f6b37e0ad39e76364f65b01e17d35a87e68233829ea1434c97f5ca72371e7638c31cd83c74111957ce48e9c42d77b984a1412a00fbffc5f128c0ec7dbe8e10a2d5f425d818bd53f21cfdef46f056a90df574070defda12755de14f0806fdf07dd5434c26e6288dd1e18ca8ec87f793ec8a22b2efa2b9929fdd5fd95a37f37d916a11356e07dc2dbac6fbfefd1ae2dde7095312ee3b24ad39514274bd78f61fa63d67c8f8a3619d767254d8c3d3a0f1c71a0f1154e3a3cb0960930777f1903e83f54ced0be13d43cd8f9f1d84d8b83553645f9667c1bf54d9b35979d1cb4842f13bc98cf1e9fa8986c2e2b78951b21355904a8a71feffb06ff19cb4132ea694b8b7e58df0e41fd66bb5278d1a6717f29345d9d3b8c1ec4793c3649f8541339aa010a8d851fa3591421075877e416d39d72c135a85330c810fd1ba226f2d76bd71ef1a555c52c324d47ad58dff093f52e7ed00071f7beac7aac2a5251819f865f2fb44ed581551f6e99c4d87e3e412a48b2fa8c3d0c30b7f2b3f2e90c92e3ffbecdd2d868f6a686f491ee85d73fc70978d9a1474de30f9135bef5c4bca94d5e5273cdd09477a8ff7bba7abf8f779e093b4d74b0392ec3be9027b373f6372428d6bc15d5fc96c4ef608dfa03eb783eb00c78e5559341f596be88ac752dcf00c598014b46e5d692dd4f870ce18fa4017468f663b5c0cf0dbffd4c5156d7c38bdb32ddcea204a99b5f953ff3d6e0adbefcdd40804f661884a0f8fd328798c6fdc023bc1085cda236dcee137f6292d7af8fe5d1cb80e7d0f2e02e25e085c54c0f2ae736d15095330ddb96abd002fac46bc3ff449608ca6ac0d40920bbe001c51861f9a851911fee78e23b53c636acf66c2f95f370257258771316a84514b2c4a20bc7bb41d5b237107758b5a28c1dd029295678fa95942c9e13d3171c927cbd449efdda027cf0af5d015b4bf561b2044b579d4f95a79449ae6ccae792f7b4317872087f14255fa9c726df814f562de52b20f6e1c1f9f75210746aa458a2fda3a65b5425073d53d8e74e31f010e7d605411befda1ffb31b87cc13ed7de22ad9656817d665c43719f25ee1f02da754ee735bed482f039e7ff3bd9b3fc83f5688c21aae0bd73c63d7f0b9ce3441cbcfcfd61706186f3146e98e634668ceaa9a2e7602e2a94ee342beb20c12b3e47fd64da7cd7035099394a080457d2f382ade14aca81c7774c2ba185ddf1535bfcd51ae0b059367a43170eef0eba65eaec80a838a95c23eeee0b42b1cbb3e827abc283b2c48d776e811c31906de2bbbd78b07c138503ec6674619411526f761bc54433c321da4297f3d736aeca5720f5c7bbb16df61f6d785facfa070aaa89c2d9e8af9450d62490ebd6a29c7c8e521e4a00fcca7515439f006c09056cfb7f976a1e6b98b9f799e40978e9ec2d0eabb1803eb2ab7a7beb35171d25bef1c8d413f663dc62f5b51f0bad5c9110244eba3a0ab387738eb9e0f5044ef486219923b2ff3796657c95207277f02c9b2ac4fa223a0dcfc51a65b139486fe9ed84e2eb1ef5280e22c72e5ab2d9b210ff8917e804aebc1012b5f5d88c63fe7a67844ca69278b3c82d5dd70a374330d2bfc79e005bc93cdcded9e0c358d7892a86b82cc2d7ea4938d7a925db8a54eb065e7efddf921a0eaaac0ebd0e49238e7ebd8909ec39ca76f4d451a12b268f5f104e178dd23231bffdecccf115b7d87ceb9e8f7a6f32a9bb7085cfcf959642fb852119e484c680bf4b238d13763f56d2f58c23e4e87d0895307e7c078744204ed95a0e8863c9878b16e2d7aaac4a2f3f21190edfd4535782a920feff9cda97c7916b6deffbb5c6a1d5ad250d2462d20ff2c778d1af7027026f0fb10e32a42a0421d79091b915cea22be50dd18b13efd3ef1a1a50f63de7a2e6bd5ab9e54b57731f214f043853fffa7e1cea9e2cc7c9097a836bd4352729c2b49c2489213a9092edcad1cdd61adb2950c753a996090e3f3985d5d1e8b66e003d3ec70272ec75f22246d1353eb500ad2876d1aa63521fe380a3f0e08d8614e9f517baac56fb680f3137b5f0beccd0f479addd16f13d8e75046045769ff0bede70b977fd49c1e748bef00876f2bcfc9dc8dede55ec25da82194d3c1a9c90dc5c3486676bc7ea944d0002314e572fc417aa7c7e0da095749953cd4d330fe0fde1c521317e5ddfdf7ac900d8dd787fc7e0731904a4ab26fd0938531156766b841d86fc4eab781c29506e5e57aac3378886c7373a918834c4702b90f0fb4c8b1f5e1e8a2789b31a127c548d464cc3e186892b59687ab4597b5cc1e994a80eea1021d05d448f7b741b4d30102d29f708325603f216b6bbff723d8fcf44d349e3171760d82e234d94c441758964c8d9162c7bd583ddec0bb15980e9d4ba036a10949d34ad6cfbb6067e07995b85afe685c57934a126712ff981c5648c4ccf0bfd0921b02f696f3133c8ee1ff92855abe1adbc95bc78ec95529b798448758c8bf2f54387e0abf43bc735837df4954095b435e47d484db4d837072bcdabdcc286bcd9811063bd31521b446637d0850730780e5f5fd73d707511454aa528eb1778953658ee1b059d00ca65f4e21f5ff008a797abb1db9095d89be664bf4218d1de268c4975993d9db43f1abde1338eb19abd524817d81f9b8f115af85079feb823eb5bc14b409dba08e3e32fc9afa9c24333dec2f66f1308153c23741d52f500e65e155ed3b3ce886b735fd910063998beb58d8ad1e31351e756c0668a4fa46291e95970b365487f5847d13838b9a6ab498cff3e3ed6a90f91fbc25e0bd28543b32798b54ed784155bfbf7cbc84c89709054942b91dc4ca781b599b9368e003ac6a3438b1a7d19d0f2ea241223314a8f0f96fcf18f5666a0530ed7067ed4ad9e48c6fa70aae8723899acf699fdfa726d33be9a1e6bc79f807251dac46938f604b60d1de4848c15b2ccaedfc1ad1a89919945ec00dbb24fde6c3935817a3d72049b003e751bea7ce6088a5037a5240872acc7635733a900009d2f77cc26549a04742acca0f5863038e9a9f84a9a8977a6eabda070280e489da1af01e2e210e68abdf758d695d1a821cc9828a8e1bd4f94df9323ea0d74920c0622748451f4d00df4f063a4617f7d474ddf61a11f5208d2f7d25e33785e74e23744401eea62ff1495a06d890cc1f80fc9ea53e1a7ca2bc7c005cfcaed3e59a6b16ee521100dcc153c81e702ec5bd0e1ed434fd91fa83119c4a7f94ed096c8d0111cd4197737bfb6460f509084af70741464e605eb5ea11f72335b0dc6fa3ad4b2c8ad966483524e3eb34ab06a2f5f2ccbd996d6af60046f553265a634db385b231cd1f67c731c63a32825e1017e0572901bd2e9b04ec37ffa1fb996aeac39a9fe63d1d82379868d0fa882b0eefe0bebfda63abda29d76c7bd65c76d98ffc76781583daa0e291930d0eed19e8731cb0f61033eb10abe96ed3baf0f7988486a0a684475ea70e45ce59355a3186ebbdb4366ad4f623d349c46d1560278f1188a092fc30b28104dba11c36777ad09fea53e7b1efd4fde920f6b3af530ba77e2affa344e6dd140c7c94bedaebfcafd6cc1471ad2b8e8435958d0b5072adc6129644402612e74a6d5030a7e95fbf09da8b7f3d26312aa2fed110dfbf6514d516f1f7d3685cd909717efc402b7accc8f14e1cb1e4a8b33e8efc0796c5d348bdd266a0c3d36bba3b5e2f81ef67e52ad2643d7436ae392e3f2b3dfa982a6552648e1ac8782fe892c77d8a451d6747e1117b820e354e8ca58f1ebc724db6c239b49238f65a447a699516b8d233f149fa6b7d4272148a481f15afa2f71d3092059425e6b3d1d9ca488d71e0b097ce937ccab4a8293d2b15a5b925170f70627fbeeb914c8645b87f3697d52b65b3c6cc6f1566d9ba16f99d3e63ca4244ae122f6da31c94f71ea7423c9b8cc17beea09cdb34dc00ad09bb85f2fbe44c1d3f094a1aa30fe38ec46fbb6181dcc97aaf26adc90e5e438b7c3b78c969bc5c228b0f79cbd3b264d49fd891ad310e6be8601ea4408d33cadbd93f1ccc959a9bdcfbec648a1b4c3c5017a96d289369d14f68512c4998a5be258790190268c531d2f567b25e6327968b95acf6db903720362f87ebeb17fa47f2eef61874c887458ce2490b509389980b7fa7d5cd0ebe83261d87892ef37b8cc87638c1289e26ff932b5a196693bb6a5a3f63b106f64820a69a1baf1a1270b6328720bb28d3eb886e366281aa4b0535003ba8338f311b1f3e0e0905b85d21ecb58974af7c4d1e08a56d29ee24a4ae2183dd3d036fa67fa976e11a320fbcd557dbe4fd442af607a6c1377606db8400556d8cecc8ae3cbee6d77b16df2718d61f2b0083233cb5ee8b49fb1371d7d541fa45af7b2a55dd1ffde844c5b309576a6b2d46cef3b9711adfc523c6d8207dba3794b0b3d36b70e91631a5ef57bc63da636a1ca55daa14d4c9be1658e3bf66b335e1f65c68f8dc655b3b045b7248226e3169ebd10916856471bb3c9139bb76731bb4e93e94050bdbf28dcad2adb67e6dfab21c1b9e05ac120044fd38831c97441295f120fd98e49203b0601cb00d5e21e9ce1548c58071269ee1c11768eab06c420d76cc4bbc4fd4b72a2c012255a9d023444023258dbce7721bf0f4912ea834d2a3e008277634e735859849ab9749c3d39c04736737759ea579f298a5f069e4ebe0979d39d07b14a6480bbbf4da25421f5fc8ff328384935e842fcb4d36dac4b44b035328d10da332fced20a52625942f14f6902f7bd10ec6c21054310ae31c566c8df19c81d0dc0028a540668331032c43f5ee0526455705bdfbfdf8736c33f8cb9b413fe9ad0739549de3ddfa31d53e752de15d8cc6b542fd598c4b7a5d52c3f19709b6108c6b04093cd1b5920d538c300631dfb63d72a60893cad1259ec1df65e712acff56518acdead19454adc53fffe8a532ab93d458680f7f337e18c873aff524c7bcf101f32b0fad2346fa737e673b07ff73ae2480a53773188db1afa7582707af5147c366a8132b0972daa472f2671ded1778a94845726d295952bda4e7e7820dc53fdf0bce5f14eee036a24327d4b0a59ed8add6d227370eeae43b92e49c5e8921c09c0b24592f7c97f7b3188eea87ce10b57652d4c0976e484d7199d7ad63ca6cb4448e326a46599f032019b0126c1176f94de5d1a456f17c77a7df49845979ae021dbb81fa1f2d0044317014b22516d78b7ab7533b3c408d48258fc288083df09270bb987284a1c2a12d4243347b843b5345efe1ed100383aa32cfc82138bf394c84b6ff383b5cee015ebac3fe3604aa39f6b504229ce1668418c7e5b7b0a79118a3d33fb60c078c4e0afd1e7a1e3d2d25d4334242a6833fbd1da1a0b2399c00de133adf53c14aa26f7a36db0efad8cbff288e26b5f791153f8a82817b9b468f861d14677620cc3a4cf68b8324947c8daf3af135e357b2f1f1a79411789e4e45f809896089f3365bcdc5249d23b2d2791d5282f9358d8edabbbbffd712095c2b1c1fc051f3002f0eda312ab1731d819a32b869f91163ced88510eb5cb1a61747daa7e2c21c10605a5b80c5487c9d32f5d4b3cfbde09f1af337ec7f26be3b28a31be8163b6cea714738fb1ce9a5fa8d94ec8ddcce0b0a1934ba98e3bf9f913647c52b85454b5809dd59ea581c58fb397e638cb7b3f86c74a2f45c40afbe70ea39c2b856672120d025a695a069fd69dfbb1ff989f4118dd346ce7fbe7c82a0ec83f8d7b22a560b702608431d59fa0c26540a1c791abd34dc26304b84b052e8e32d51d0c11552e18ee8653ef773b8acb7500b3cb0ac632b3a4c0306bbd29811783db4eaaab07d6ad574a7cc553f9f1139b709a255326d3893c02df98a6bbbe452bd086e9683406dead1b4365f4618025591ee97913442249088986c1a0223261ab437a4ac1701b4780776c43f0f8949b3e7a1618c3b4ab6d8ae2aa6921f38a2772b28d415f32905251fd3bd1a235bacfac00a486dceedb8143acdf11b4b611f1229c346f89f21299920b56b1b08f7f4d32511965d7693f0eb326893dd0c096492b6f0427ea450e87d1203146748c3e9e51d9e9183baa42806a0e3d5ffed953aa0da970fcf891d0979fea501296b2952d9b09983082288260c8b26ffaa736e69e49ea0f612d6f25634eb827a87f790f856e6eab21336a7b3a6fc18590528fcb90509f33f7014369557e184c6a97660a405c87967cd7f6a967cfaa32b3993a7f2ac24793210ca508f89e8922fb86f001c8d5d2ee95d843799358daebc6d3cd8db80f618161b80aa0c730994fbdc6bda2898aef282eccd778279bd2255caacf53d2a87b935b8beabd4bd4b73733cf15592cbc1ab78a2e3931af293e53e786a68e051df45d5100dbbae0eb715df0189d921d0a04314a64df1294616e0bf9efe978c9e07a23f4af442630e53638752bbce9c4f53a09e2193fb771d4ffb2064f1ec09b806babb8ffca8bc662945b258109dccefe0ac5e3a3e18cb20441fa8f3cacd1e49e4739007ab567ebe41a4aa3b0fac7959514d9b1ad5afeef6ff32a07311a495f6a9b708d98cb274bda166b52241646a35ae6d9fe8e02aa948881d500c4fd834695e6d692e2425650c53751c352c2d692afdf3b0cde8f0c2bee5c900e40ad1c44a0b7dfc2dfd1818535fb7279e5a703ce048c717f1746901ff201df826cdf70c40b6ce09ff9ef15639cb161d825393ac0096d11c7b0cfd30b441007ff81db2d6f4694ad8cb8f1ae766a179480c9d008132f0f90694381415844e5cdf82846ae80e2bd8b0ba59f99383e9c7ee61c21d831d5d271f6381167a1851185eed89870b350560dbf483f82238a9ea58ac4a547a6ae543ad116e6b2517511c4561b5710711fdcb9fa0957d5b2cebc9ce13bb0c2dc09035f9c5887bde2a5750dc058e90a44b1eff45e617f20708b64c97be9fac65c867e54ba855af6ff96a9c6a029e4daa8b6de514ef92beee73135bfdd67d9eea2a713bebe25f6d9f2b92e839806d0ee078f46556e38e49d81608de4683de49848db620209a2e1e3569d71c8fa6813c0fbbba6851ea91fb8d98a0bdbbec4915fb993f7a33f8482bfa5a4220b59c6440fffcc7d44f2a253cd4a3e0e0a43a466a16f713336c2537fab6a7dadcf38b9e8078e2249396ced17477dcd23049945db09e4f3a31134983f530f7a838909bb5664215d88b6efc1e0b3ced7d93f123174f5c48bd5e708bb28332f3b21dd6f33359243eeba621dc9269ec7ee9f2e60ffbaf158ba3a0cb144e0b824302710bbca0c0e80566caf698b7f64f361f366e7f923994c0f4e16b0cdff7e98ea01e781d8205541150e13455151b2cbe2645d29b6253a08eb908999aebae2f7c920a653f638f310bb1d2243e323e4cbd06095a8df566009df9fd9de6fc981cb6e21f1949cac6469a91850e7898c978dcc8694d7ad3db7d96bca8bf19991d78e49843de6440125d67f9e23a2ecf2276c3734cf58d8218df210af1475b4ba50aaeba60fab84cdb3c19f0d1ef865db30e190f9c98eb8c87eee5ecc07cd398989bba525db66c7689ac597f3a76a8cce20a87a5407fbf798f718b69fda7aa0b5ef3b367225aa9468475cfad0517bda41931b43b20f22fcf9732ba8a901007295fda3f02972e9645355f22821a1aed6bbf4a49dc2438631809f71b5661ff137c0418062aa47a5cfa0232fb0661c75fab3b1eed8d349b84db4c8956d558bcf68bb374b1e7318522ed54b50142c3663cebf77549583861baa1c8b0120f5e8ed7ded5b8e841269811a794b1dd3d263eabb45a16044418d32cf1e533f70d59bfdefed3aa52416bfb51af28ef36ff7498d58dcccbc759bc3903530bdcaed633953572131398eee8f6098d7a34b59193bce2feb55a3aa00cdb664fa271df72d25901c2ffba625186d161caf04b02fa6df2f98f7e8c0420f1007e6e12bb32ea20526d77fe6957702bd382edf4fbc442e88242c98d29cee251f27337c3824d4503ca9e1877e61f55c045947eed0ba372eeb3e6334bf93fec16f76c331e8edb8b6507bf2dd4fa63082e6fbe064344499166cf0d5620c30048265891e889a682c42d52f63e7c6dcb8f5b99290c5d6e5ba7371cdeb87551b8fe6b5d0be06d94eaf943f36bd4d707fef4310bfd18a55184bd4be382e3b0691014cb4d02a3331ebc328f3248764d90a53f970c61b282b46ad9896b215f3bd4b09430729db7410da075f857b2ad46cf677674e67d635c60b506d9fee1b27c5a3f85811205a601283dcc69a9d3002a8deda3b2df7ab29c1e0e4923e2ed66ddc266f0a67662f8d9393c3ec771d3f76192decd38408028a8b41dac4f606b03c4d6ccdc86e6db33330644d3fbf8da1a53a6e3fdee51b64be9ea893646c0840f9b5c1a510ba998e17659fe94ed830ff26991a43abc5945a6c78afaefee4a5f14c91df7581c09c2890af81288855d9a06091ac88c8aa255beab5a1ae030462599b6e10cf7a14c81b457ab27b8accda4de9c0bf8fb40720d1dfb248e10f5fbfd27ca70003883bbfce9c53ce52a481a55038b2adb90c612954a21ae018723b210456d917c23a89e5cb0bc71f6e8428dd4fc3d401a5204ca16cd83c1194ea3b3857b070e28bff93dc891a414fffa836e4a5119145c4ae3e1b82f8b247e6c5e46855100adab145edf6915e5ebab66f205de8b89704a7e49a1a2f79fa1d9e93bb33850c037ae2ac0ce67c3e7bf9f367699b931f31a8bf81f50fdad29fed2ce2141c5ffaf73d80a0550e92412578672f97302cbc1dbc8c04e37f0d990041022fa3955e6362bd2bb17ae17becf7d062062dce2e25a7ba9dcbd9ea4043c7b3cedade30f8ebb254345dc301a1c84f7c74a991a81fd26c2d55653cc40b5952bfd3822871c7ea82ad4b13e1d1ac39b8e72f7857506a48d78f536fa0bed7503dbfc0a416da33e63022d0624bf3e3d7a0aaf301037995ff764b08299a1d3cbee55e16bf2ddcd575675f54c755caf108b3325fc21a664b7cc4faf4417d7193fbe5f53631d1ec250e74bd48b1b3d95c734d17d63a10c8c3374019a835ef5e859dbc2fafbaa79a9b1804b74ccfdaa17e7dfab5f6d76af3c5c58421848554367a2ad467f3a8136aa03883f7a1603ea5dfaf38a712389d89ab8dedad19ae409bfa19db28a298a9defcd67ed917215479088d8365e8cc2ceced16f906e81f38e17de11d0c2ceaef59d97841d5fe71b07d817f577ccb009db012f742d97056a1b98e27266d033d388dfea49998c7dfd735c31b415649847455b58537af32f31f86934293d5b60e29cdb4c1d28c13ca3d3455d7cd7cd4b625503d6763c2b06316db45d9c1d0c5bc47ab9486891a62df66fba24b686afd144532231433ee69250c29ee335cd8b2e5f6aa263939de257dc8ee40cc8eab433d387dfef2447cddc773e51505b177fe19db3be2704141ec33e7aeb9f1bcb8278f938639a801e88eb8f2af52b75c1917a659f341b24be01770579f66517f1c1a89db0d5b9be8cbec87eceb1fded9468039e742dc75b62347d17d42de524241acca7355ed5485917792e72ae4d2a58ad83327bd0b412ca5edd5ed3b9a7ab2b34ebfe102675854d3d08855e14a394d5070308fc4669afbc289dc1bdc23312cfb90d8c895421dd2fd57c6dd90a8793d21f8a083fb66e9c0139c727dc6f12c3d84e3a38e71162b8c98adecd2db8828f199c201a8b494c3f613b627a76e9cb240e9d7bea7484be7ee101358ca0471bf07027cd262a268a02a3d377a1d458e69f384ed78a76d6bf9740e589947bdfdb1ea0689a146277b04c91ab0d843ee3eb9b20095701362eed6caedce3cc06a7498271068ecc7c614784f16b2c0bfbb263808c750235fcb5cf63f38e4a1c88c8ed82aaaab237bf0ed6148cbbdc1e55eed6b5453ae00f1092ede5d6a5c66c4b6a4f8715fb0c3b75a6e5632a4126a592bfcaa41301f977b9eecf5b20c65fa495b3f8fa78a2a7c1e450fcd993a81188fb4cc9b4bd72565640f1fe2b999b1eadafce6f419c4688b25635a4de8e96a6afd8be5a4d0d34fe92edc201bf09cc0a6de1e13cc64990b9f4117d64dae4b4ec02713c06d7c9f0f915088a607d38012bcd7215e8ef462741715e4fc5355da9eb6a0def53baba4d50c5d970a4cfeee18ab5ac91fa265db5280f84d34e57c11dabcdf6ffcb5fa8f40a8ca89d541cf2142e0ed57efad254df76b8cd3387a9d8ba35157293f62c5b8c2f51bc39f8cb0d4320be3603705af44f34537f94f8916a259028cad35b8a9abec8fc5e6b1846071666af1749e52805ad6ac8e3212a783e09c4f046e882e22e32db74d65b3df4a8340ac7c077e1a34fa01eff41ffa4c71d0cda532dfaf39ae08f73a36c32ee3db74613f078b6ea3399d15adfe159eee4cfd6d93bc930371c767d95706818b489fef38a11882e8a40ade825520a5591391c10c98f60b3d5ceb8a64bc31134164043e4761238064832518c8840051b142ccc62b2373bab551a70af9c84b0af9cca4fc0dfdad067ac724e65898f1bd4ff27a6739d1aa23f40676443919b8db0ce90ea30ce5398783f666c1c332891a8db9173ec9122dc971c1c5d0830f1f06035f8dbdc4964d862887772598bf3b2be2ed2fb74973633dc74a323a6836c21e7586bec6b5bf5d74c100d2ac39bd8c53f835206b4b63eed36cd637ec692f5676cbf52e38609efde5f5d915a036ac011525f785c54f62353ccb1c4361063750c17f31389d45d3835c2f969cbc10091df204caec4fb5fcbadc7a72e122b01d256117b18a6fe5eb9249e6cff45a4663577d1d15c0851fa1f434e3809dcc071f68e82dfc702ab145af31b3cba9054a392218c77e8ee00ce075c8aeabd5a76bcc7fb92a88a64848804e960f301737abf922579c4bb3fade36c42a348b255f6eb2fe7675dc89630c19d4f96183eb7bec31ccac1423dc20242343bc0d75194e70615982c86e85e58c70e6de434d824c7b6175a8c79d641a7f24990092100e1f213605707ac5485a4a3408b73ce37823ea06d1b01f0ef8244fb9189a7ad2802bf1cfa6c205673d3bb5c1af16b6ec399ca890556492fee4f8066f66dc20332c0f528ca1fa00cad0f46fa83e7f39de431147ac7528bbe3d6e033a5f8681ac84e33c40b8b8af566a03ec8665b433e10211c37a9b59f02642a7767fb31a0d2f88333e6bac7e74bd12755607a7a154c58502809269b1a0ee67c4813edc728e14a578a0b18eba18c80d2e2c8531f67eced5ccf3c919a3c29e138bcb7ec1d62be442790d1a46b5c200c4f61509ebfbd8865a37c32793777fbeadc6fd474a8d0c26c9ff2bafbdb49beb9d94b999bdf78b747c0b99b4bf75fed79f3bbea15fe15a62a1d2a277d902cb1301d2c1408f34be20a40f1c7986e5687050b3b795e8183d2032ba1b7a83e679005976d50349f89a13380cf57dce0ee41228f5902acd7bdce9e47f3ec1a4a7ce380b499cecd38c47d4a2cacbc881399b448fcbf069f65260441fe8b253228ef1458113bf021538eceb4811476385aeb48eedfb7f584ce5f0ba4bbe2039e7e30aaf219ce54df743b2e194a91155c4b55878aa4ee602b57bb5d2d0c92f79d9ee43fc55abb7d662f7c03dec59d0a62496af8b2e8ccd6c1a5ed71416d1881de2f6c2b6840adda43c9a3f87baea2c5f8f98e04ee27ddba064d47d08869ed22ce945af64157ffebf6f7556486525cf87ec04144a2ce8b9a57926cf3786f7b6afd521338f72d3c230e1d02e0655cf5e262322720575970f83439cf6287fa6dcad90d376be02ced3fe7cf3ee4cf2b384451b3a230926508442a97d1a63da71eb2e01a29f792d37d6312625bf9fa498e7eabe944edea5dcc0eb92136271fd218c3b10d8d6495bd876d2c9afc989d3452f20f3781c0a5c036c86e8a4f7d9527e66daa5bc45b4f47759e84cd93391e78305eca22db517b18c3019927901233f4f2216a895114460dd277b97eb2640481a1158b3fc408d0e41b3ae78daa7d82e5e67f401ac658108d28994922dc91c5ed2fa6b0f2de5f2dae89e4c820e117f8671de7e994967f2521d263925e745af9273682d9c08ced07d4a98fc985f68a0af512ebb56b33f1fa788a8753860c1814ac405a743d420ae5f2f4ac5a213d4c311c600b32134169070d9b44db3e16618ef8e76e0eddb0615e85f5baf88737c711497fc6fe31214ce13d9f5cb7eb25bfeea9966e08063a68c80a174c232c78931208ec9f682966060fa5010f6811bc9bba1ad7bb0e6b5289b8fbe3d078857228c9d711050e80823ce8b06b0d6a564d8d57e925d570519b5ca7d7f5d85736a7009f3097886fbb084a130c27b74d0d4afd6e80fb5ddc7d675a2b2a97d44d94a9b308a1eaa9fa5d5ac60504e19d7ebb4774647ee2b4b12368faa9607444da43dca89ca784da3ccc1c29352703307df4c57ab02f566a8d07f2b6a91605ba7ba8c259d1cde0a9b5abaefc2a0f1710d92e4788f83ed0ffce8fa736b0c7b695a057fd5f3e619898e36095b76a1987af0eec40279319dcd5042ef8d346d21176f6b5d021391f2718448f62d36bd2ff7b8da341cf274cf49abc6a6a14e1e1a0dedd670d386862e6b8578c88e8b5c7c8f6e3d7bee81b4492b155c66d83f852ef2dc2dfe71d32c981e9aaec9a5fce649eb1901e2a1ae59d41a96ec7959910c256f4558500482eaf733cad23f9b11c35cb2c10db15d01cb38be375e254dcb1ac62b2f3eaeb31c2a12511ecc7397525c7d8d6e49304903733dc0ff9ab3dc7616dacfa2c95fa62853b2219c84adc248177624299da68e3bb7abc8f7886b2d196a2902a6e0ad062ecd9f4a4ee335437a5d0e1ef9f15d533100497d251194693c7d7b6d446bdefbb6ffa1753ccf524370970c24e72d9bc16eb7e088931b77b768b798b783533bac4953804a6d314deab32b39ddfa39a90079423890498f5d40238048896c7e0c426e300370e9f26e5fca835df23afdcf37da0b193e4d568c2cf840528b05d599e4aefef490b8f8fdcb3d05400aaf62548f1a784b3aa9564da26c5f7f64584029bb90261951e32d4255951ba9ce624e822fc0f3952b6579e7ca094597bd6da806ef9c0e3a5c70788526592c61e55aaa9f3f54e3c1ba87a6a4cd565b623d4af376a75a1f21586ac00d65119f31f99f5ff4e95fb0958e19c5cad3db07a78df90bc20b53c195eed6ef233b46dedfaf3a54c95368c1da5022bda20321b2305482d632440e5d5dc6beec0fd07e5033b13270 +0x9354325be0d8127722ab167c4ba9b8c04d6fb4b76ceff8e6f32c55300c70705a3c2bf20cd85706d3f67fef2f2815282456cb9042ca8a6a6b9cf57e9737ec2592 +88144 +0xf1ec3715e90feae7f5a926567eccc1b02bd2c3b158fd754ac45abaa089eba25852043d12c8f6ad334deb7fe8ed113c6891fb3a797644b835de752a0e0628d210576e9066e06ffb200450b033705aebc15158549bc3401b058c1646b90a0e4a2e6af1d9191bc1fc3582a0613ff0eef645d1b2b721263bc3413507b6a97ee3333af254c0346036d7fa30a339155316867c7ad00b12867bdb71400e21e64bf0b4bc5760ecbe9614b5f77420e1bc831ac3edb47cf977cd49891d17f43079577df63d00dd06bfa7a4bdb5b7e1013c6642d420e87c2857e2edf5ce21808a698cd221455793b5407a2e18bb62ac409ee6d5e19d7c9942baadaf490bc67cd7bed1365c5ac349a247f7faed91db4a46e9ea1d14edda9beca916d7aa5d6eaec1800df3cf06acc975df064f65c08c83bc2559609397684ad02a05ac424b81e0eeb82a4fa3d07ad9d50d8f77a8cfdb1e4a5b1de78623906e96486277395d67d8066e0f93004096426adb7ab8dd4632e597921dfa1619b9cee6081580b71b895fb2a8a4060ddf66cbdd50af5b2caef89e4cd241e16a024a336674060fe30e4d3c9a70d1f2f334533ed67417a7be8d9512102371e3ac66ad65c1931e6ce5bd1c3965cd7e9dd9c8c662fc5098e6bb6e71098c8e954901cb492c9d6d43dfe6b05f1cbbc89350e82125fef8eb1b5e4bd6f44b681a955c93bb8650a30b5eaf0e707cae4667f85348c9d9db714e8959944f869f4bd059618abdcc987a7458258484ddb7abb496ee20484bc1107fc81dc1608fceddb6caa30e5a83cdcab017897174e8ff95b753699824e2777d88c2f2f89277a1c7d7ce69451813b73dc88523fcc9074daa77180bdae705c75f705d22616ba6ddb1384efa5a82e51e79c3893a4e0aa16a92fcce1e0b181e775f4083f42675844d42e3339f731d5fca26a90a178ebf1d1ff64e5be85640945024ff1baf6c387ab823df63a0b973ea83ed83f203e571e5327e76a9b2e1e6cf1a57b50d9c5e3beee5fc34c845530bef10765828447ba7606bd17b9ec3d492379d9f6b41032106499d74eb49d6696dd43a6830942277e9f6949865246558cd34a0a5289e2ce021f4a8330acd9a252203c96b131ee701bf0f737a3c22de951d2eed10f40e5ec11555cee29c3edaadb1e285290aaed943b213d220097f77b20d8d4a89d779e2ec68d6d729a683de29a2db35471c2c4262496a7731d42578d722b980b8dac5018aa5de8aaf3284eec27e54a370528068890d7d2a56a3fb292ee61a574404db00c351d4b01d4729529fcbb7954ab29294de84b2b53780e9d1dce01896d65ea32abef622111aee5a51ea146bd47d474a0d893872df7b72d7ba0c981c0715ee05c6a41b2f754f2eff34c8ded828b216911db3b1266fcb82ad2ae4978c70aabeea1b9c4963a4630f004463b3665891294d0a8475342eceb6536a8c64d29a3cd63872cf072665ff9945c6e31a7d2ec187681d230e06e42d18b2c22d87544d743cd91365dde082cbd5b605709c8570eb38c89eb90402588fb0b079ef897c50fafab3468553f9c16eca3c4830c0e6e7b64557d56ddd92549d8436d9f9f1b16d7518b05357f2d9eb9180bdd64e0e085bcbb5fb0968231d9eff9f2d2874475a6a8d9cb7810441e9c8db0022f8f00e5494d1909e84d15d0bff5c067baf8714e110eb90af1ab4c98f1ff55154f63f49305971de278cd114c33f5cc30ab65bdead2737fb82648e1034b9867b3a186246057353a87e6a90cfaf26a8dcc0851730267718e617a8bba0415f3787bba6818d3cab1ef68b663516367ce85c8763e48fb4c73758562d63011cd7b07cc1e7c6a73bc77ace36c7e971c008c348469aea85bfe13c59273dacb92fe998623324571b6c8f113a67d7d369b593e2aae5705099af8bcef1721ec152e15f9842f8a55c7136cd884106dc1c857ee5ed894b2e3f54ec8e95291f19c85499005723fab2fe3200478aebfb1feb4e81c68bee621bde3cdeb23b081676ea45c1937e0d209364e534c6bd412ee8694b27fe64e0118156dbeebe6597407d4eafc0e1b408528fb8123912c94a877fbd04d854216740a6ceb9827cbddd83761d19feb2a21d78ef1f4177f3570fef2b1101fd926a8bd7d36f5c04b2ebe2c8a87e0ce3cdef537bfcc3fb56310f964c358acbfc7ee655bf50614eda2997aef85c9a0fd7fc44b341fbccc73e9398e988e552e93fe13eccde65cb176ea9684af9da98aa42054943b337622e97e39b10898391e32c821af91d5ad53d26fa06bdb56aa1658cb1a50db9f7abb7c9e7bf1139576e422d2b20e26476a94a6ce31a0f1254ddc91dc801193c82d2ea3c68adf67ea9128ca9a2fb919c036cc6a72d4c48fadf735d5d12046d2221fd4f582d0cc742c0a54c08b0510eab4749373ea0437154548ca9b5575713551c556f8600858a6ce54e07b11dcb5f7b8b66279b04a89208fb4f368b5ea113bbbb01d12ca7c049e46035470eb1108ef316eb1d252122b1fd1ce58b48f08b733e4629fdb4eb640b927983938634c9a3fa3201a244bf5ad81dff753155d5bd3dc504f77c849419d95e786074816d9da47a25d03d60a5f70e4fec28ae18d5de79373e91d5066a89ba30a4f3716725359b5a387f76e19ca25c7b2a268cfbb7962d7e3c1f90a0355ab6f0466512a124388f82b336d5306c03c88902965265458f638146ca36bcbc34d586a6dddf95324f89d9de1fe3b3ddc15d62bca089be456e2228a4b94ec1c8c020da0c8461ac17229049005f27d3b68520eca06eb86d80de735b9d16601721a59ed4c0821f4e9a58acba632129f8c1f61b10f52567dcbe855c027a06f4268f8c575d09fea1e48599e5124d8b728bc4bd55b705f01f72c70be80584b39355da1d545b312070d49e8f443a07c589f28881d6c716f5669762191c4c0045c40ec9ff9cb87e121388aee0d01ad9f8f697d5eba72a715cc7b3595702c039e410b925db375a39f912667c34929a0a4c42e073a3cfc65e4ec72e726ca14776b6febcb6582e2ba900f6d8d23490a3e4e8f4372950568524f3f071760101cafee61680441f8811184c46457687d41badf59403c09a454d0d72c9e22cbd2b321a9ae06d97d74df6cc088a1531d666ecae9aabac012ba3085ff3daea5e49266512fbe5ec762986c10e5a4bafcbc94cfc2f00c09ab1a8789d63a0acf2d24cfa4d2e30ac63abbd3a5a266a0f7d0c079035784e5b349bbcccf4619fc660516fb0d1b661bd3bfc3a71a95c6161e6bc393a7dd0ad04e4860da8f5a118b09da35a4fd8f1b8a1dd32493395f867c652a20650be81454412394313886a34f31290b4df4c285adfaf1591890841a3c8298717dcdfd13da2247d071695061a1626e0256914a372ff1b6cbb7aea803eeed43313e5c809bea7831a01b804bbf4a1405a57f318aa268a88016e0f21fe60c0b96ea3746170efd997d8d801bdd2e71dcac8ef8840859e075e9a534f96002fc741006f909250f9c3c87f34f9a8921d112bf0982d747b03fe0400114231d1d68ad4b01e4143ef03ea7fd6bfa9ae45be05cb9af8ec9cd57df7e4fb51f0dbb87b92db47598f5c9736d822a61e18b531f1811290b7cca0dc337b6552bb627afc4765bc8ec783c58eba141bb7fc4ea6a0df0e68997ed668d54e11efcff69ff7e6618de14a1124661cb626d0d1ff546ad8b033357cf510dc0bf542ea38abaf3bbef192b046de7b278b5297abbccf31e7228b79e102c384e5c55195be56819b2dcc21fa9349d78ef121b8ed123f15ed07c59867d4f3903a694a8a92d4f1216ab457174ff11aa467aa280db36f247991b10b01857617063851e3c7c192d13224baa9fb183282ec0e3ce67c6e2931a224cd3aeb5b3035cb8886d830ab61bd5dd22608f6debd4957898da42aa8a82f39ae429b807268178732ef71efd7aa7e4a7ae0bd3028fc378fe287a942e854e5e538fa76e8518783e33c73f629cdd3dca027cf0fd07e56133921113feab7951d4fc8dc134b80f64286b0fcae0916469f08dedd48fe6833a7004c12ac4a9cd39d1f69d0b9d0881c1c1a9571e2b439698f29a9f1afe46ffbb9896d74398c1f762efc20beb19ff060d844f4b9da55bea674ac8ff38ba71a17127f8b1e2ed5c8e6988ef78e44e1402c40aed4bede122e64153899cc2572f2ed7a88aff8d350208ba37ef528b7be01e71a003d673613100a3b76cd62c56b7ee6b94ce0ea6f22aece17742275555dbaf82fe1389c2981ec02ae0d359eb2ba466a967526dc4c76fa15bb17875b65e7f3c947facb4500844bb336a6d9683688d2e2daa889b6b0728dc958102bc32e8334c12af3014b0443b3859be9bfa997fdabb44d8f1260e43eee53b6061796f95a06489f73df947ae7afe0a47df1471e40584ab7d2c8c23003a5199da251ba0e94f0c66f226f09ad97c42c1b0b772c137a610be019b4c5dbe93b85d58ce319b5587ba362aab892e47c7cd1c63a573ebed24f5e900bdc4f2f1737fe256bd49a36ce2d4840b0c21866be5e376db39b676671a8ad8e504a4972b621eb57e82d24d81f911bd1df96817c84f2c7da1e4b8e557ef75fa391069ceded82b631aaf5a1e5732c85dddc3bb76ef6c1e7d4226d9bd122c1dc9776162ee8e5e1c67c5a34f8a3f188ef2b52b9a0843e520022670b752385908b32a684e9abc5c683ff9ff3115bc22cbf84e7192606812d7b8d962c0693ceebd63bca58b47db6b955842239d4540da05fb04362303beadbbedd57d93568265b247c899876a8e043a4d18a0e29d8fb6d35770f9ca56c9ee333da5119eaecb467debb8c4e19726aebd8b0807af82db41aaba1f3cf6fe1c8cd414b2df40d65a1976ac17a8184247d3a59e6ac86299c5f2f27f5960475e28e224ffa9272871c14733156fc3a9f0540b7903eb539a46d2534133ca1439fb71869c7ad299c3e5936849b41ba80525fdceae37f449c51e82db2d63ebb92d5a78f2a102d9a791b642e51114c5b5b8578785bbb7000b51855a031d8c38dfbfffb1bee92428c1106842562f93d88d3209a3d9381db928ee2fba5378193bf8505fce33bb5b3a76de8024340bcdde8f10b0b53199b86a12f9523654e3975f838cfef109ce14a9494a726af72c3f424bc2f13e1757339d69e1b1507fd6833e01d461fc9967ecdfb8e2d389280754ae33d72fc0f306fbed9e55a19b4cd7693203b50d337b3f4058364608013f339a6ce7abd0c07d1f9dc510c3c779444cb5e609bd652827aabbad51d2a465b5279d28c7df98deee0785ae619a876ceeccf5b4743c1e5d1730cb499c172d191259c94c64e0cc5efe554014116855f8b4deb547e3df7d44c277dba7659206adef50ab524f3e0fd2f69f4990a0abd7af2ed850fad9162671d1d679614ec1b596a482afd4d765b7cd9f4c2eae8fe370f2c5607567b45e9e669dd330e1c824de65ca96633eade678c130c25bb84f9db666010d7ef906373985bf047eb36239d59dd9d2521a234eb73053b85d5860391c7b7a15fa295f2eac618dd0df409d8f3f914aed08d1e7fce7ad9084b01952441795993053932fb35b8cb2cebf33ea8370f2a63cd4006c7fae9b4fbdd055965d3c56d6e337a0e853cb69a664bae7c9c51e34644850201155608c09da4a97ccd2ff31bb8502fd298e708ad1294ef6cbb2abd91da609ab770ca1e257508b7a3653e4b8dfbc41e253c1ef52db82e7cb60da8e533acc7d2d1e03e750b0c72f57834e614e8bef610b07ac9c642e1811d019ab4a253432070f76d9a5399e8482da3421098578a50cc1b59d0c41314f59cf56b373e1925d43dd020c601f793f325cc97a51d00e6391c0de21b34c9d9f2c03b8717ffaedc4c010500abc74e95dca69a3c8bec0b5a19c62e1c92618bb8e0507bf63e2e3af0ef843d152fecc6746a77b538ac4da16e5993270f1e92823a27155cc19212e4e7248d21683bba86ba0462c693ee87eaab5f4ba0c3a50ed6e62fd787effdf5d54b55e65900b877b7ee142d75553be40d9894b64041101eae44605da488661d35a3e9558ce68c6c809901a169877aaa32be609bb090480a32dd23715a95b4d32b7848a36220a1e10a4233864b31932283a32cc498b8341a8c38ded9511cd15fdf51da9885b8dd1e7c7112a4c2596d9425d15ef79ec2bb96e1defb5e3228a4097ab606fb9ab52a6affaf06c27709f24843d060fd6db5c7c55c55e0c8a5be1519242f37964c206f0fbb8277aa114809850326989eab993ff02227f7df51e80cd60445d22f40009453d775cd22391f9a958d5d70a101760a5f5edba66bdfad718a437f408f215d807f7c0d70f397948ebe0afd4ed01655125a36fa5733f6162c7b0866e97e95401ddad1d4c8e5d2b2cb49a28c9cf1933d3e29d20b71003f2926f17c8035c344b052aeff513ebf937e3a7e7c94c1cd1f3776135b965c9a62f04536c7588d28d8b507412d0c384b8102c3a4c19c252c634aa261f9247fc90673729110735773f65724dd848e1f4f45454f04982d30d6067eab5cd33c4455d3b996497f5bfc6d489f92c82c5e5c94864fc4e72ace4a92b1db77491266120573ca97a73e97e5de7694374a4c0455e2ed290c939f07db290c6aef73dd2a52a28bae5ff372af798e283efcad0c09740022da0d511e604b64be32fb215d116af4c66dd475462b1f4405a6c93795f420b8cc6ab168cf620209703b849abaa2c3c3c910e074e09441cab5d387320f4dc0d093e2de22db9469e0c98e70271b66c5d73f9f6a3a687246e6e1cd1ce4a29dbe1121497ec56a7ee6b37232a910a8e3d8f8ce20590d074b9661319d7296746a81431ba7789aa3a9e248122f159d8ba365ed1e9d9736e4a999024c4a708fb03f712e2c04b4e9af9cc668528e9e16e92ed27fd81d0bfc2913b793dbdcfd197ca1f699fa691afab6dff8dbda562bc2ed0a8976a4a99da9fb1258da855c037a001a784e2ddd9214dffbe269518fa3eabcc1f09a29483584842de4a1f3d169fb66315f136e6904805277eada6042f0d681db71b21002bbd4ececc3aecc4317e4d36f13b16514588738db7af5ae76f9ce62de738800df17e25bd75dc9b9bbf47d715afcf0b9e6766fb9b0f983e433a61a87545ee2a2e832f6f8771abc623fea0d687c839712e74680fc7dcf4ca981df0119c499899e24f257eb53634e6edae0dee05d0e701a20b1042aca6318a6698ccc40b78e459b9c404f5df39e468691bf360083074176989d416a201faf82f295c423b4a4dd4156052476e0356d516e6d5ef078d4d3d157f480e5056ad9e625e22eeb43431b3a5c271f5da18e8b7878d39ed9c4dfeed1669c09c204ac5d7a085c55bfecd3c52bb690883bbe1368a2b7d93de3ed8e591ecc7f242aa24e04e5a6e980c838bca4bf6a26a737c02acb78346885357d4bde619183194569b696d00472f62eae67809c82d3c37a2e3d7da1f666bcf8fc7d4342be922f3ae04ddbe22ce00018d73a216a057d262b90b347c605bd2b53f08b51685a93b0328f7b9ac42519e6ae399e4ed2fc0e16736ff4ef8f6a531a6fe3dfd07c6d6de254ffa99d1df707f01a5efcd17b6e6ddc7a51683da32c12d1735ce08825000a0ec9b73daa96ab916681ceba700f6382c067c177fbab53e09788e4f6410c19517bb83fa18ad7479e8f0e0f42f433e43509624489ef4ee8a7b6d60289c2d9c32a734a203b0587d618b4e6abfa2491f76e01956406e235f24e74843e01d433037d3ca7e175e24e5de61d342a4ccad1a715ee26a8569d0879bd1abb20c73fc2e3321ff60ab6ebd6e6f0121e129fac9bf912193d98e1e56e86dcefa23141cb2f6a3264602465e6c4781edbcced5a9495f74dca03bd0f850f1f933d62f8d83f22a063530cb6ec9cc31c58bf6742e7486aa8af499f9e4943944fca4a22fdf465428eae342248b2d579d98607179aad90c0141edd3ac4f5e9a51b69600bc9fe03383bfb4ecc621f588eb790fc037c1436404483cffcb57d3de98d58c545e35ce2abb033ea308d9befabbe5ee354708400913fc7670cfb470809ac7fc1f7d378ca44f33c5076508e6078f7d80731fe65b85b0dd0ed931ebd11ac80c69e4922b983ab0e00c8c73460749c69e7afc3af1f2448b788a9b8a445227b1216a2645786d48708669a4bc079f3c01c7122320a1a0dfe44d6e3a41749011e69551770fa498681ea550d297c42a58b195fa9a598bf3a25bca1e27efe30773c8d6d439494696140bbb76a8af02152a6679a8c44df74756628d3ef6fe2624c7d87446ff9ac4e2d6d8373f995a57fc1b80e09133869a284698f53529f4a47488b5ec4e2c7ca60b2af4b71027322c5bb6a179386a9beb230d5f9095335be47330b1ad4e6257607b8af1a99cd4bef59086489222cbe640a41526edd3a5ac6cad4a8c45bc13b39ab0614f8d3a24695a5704d6c9d4ea0e5147f8af7b74e35eb38f4086343bc329ab46587ed07c88c9b0fbbcdc9eb3477c937b2229b7fd8efb4f95bd3ff731f32228a9db0021d88448901b08ea7f6266a96daa1c5631d20afaa75d1b2a1d33262579576363efd2a96e8e218350ea56ca1d667151955796e9e53141e4c4f4b3debc33db8c2aa8ff6ab3e1abb6d06e04d451045d6c67c7c0ae43a3f094b13c387f5eeeb2afb4cbc33ab161161dc988f127ecddcac75dd0c3ba8e45c5c54f52359a75f05958a2e6a2bbef52ed22acb9b047394945fce82124b12dbd5dd12fc53fb299ef5c1165882240a65dbd500a8ea684dedd5b6787277804ba610552a303bb5a433217648d0ed67baed8034063565893360077a1cb521237bcd778b4799c4cf40a7f37cc8a0913cf41683b5e37cf4ae4e7692736154fa7bc9d870490f40d4902480d19a3dd058eae0664d213f85801ec6b6de69f056e9d25e5065552a2c54417949259a4f6629bba867463fc456ef22c2a9532470c3d56e62bdbd7841652d2a66875642a76cebf571a1d6d918f92b026ad55a6b8aa3a898fca5e07afcf4459314c4cc5bede988e1669b66b5e3761a06e7c45908e6ff49985492362302e086c4aa87efacc9e6e7c7acdd5c9dced3a67661febac12bdea0b6930b273bfc31d704515927ffe16af0ef6eef2256801ab699ff09e35f0149953ae1991b8991f01f9d31c1dc1ae07d8ba0d25a1eaba25331b8ea6f3eaa1247106b65c27ad66a2448d5714776c66c27a02400a5ba63dc84011b4ab8316903e0f9934811acea2ed539f53a735dcb2d7117c121585d45d5b70d0a466a26667f1c38f8b10b198d860bda44b3cef9f1cd62d8c05dfb6e1b36f33dcd060f84672c04b5e2c93a29871acf130c05dfb300f103cc69db1757aba64179abb32eb335b29f599bb825459f9128cc93572ef1bf435ad903c4337fbecea8a9ee75501b98baf60a6aa554d39f941fed23d2441cf76b72e8d83fd84e1b5630b5dc73fc2457ec0fb196b8503d4dcabb5e029da89d701150e22e758d2c8ce5e185bed6ba363ceff437681ba0e971dc040778e2e2daf2dcfead4e8eda81d723c402dbc512b90d6cad8228f3cc41d57102d1cfc67b3d4574833380b147b5c5bae0127d698d15930a407c1e6b5dab4032bea24d73fa2d3082e75a0b065d301e4f3d9eeaeab2b29672b70c91a8da9179c63f643c11e7127dae320c39b6a35baa8de48f6b6f0af8de4b1919cbd5cb5a49d78dfde2c7cb53f29f6d3050e9a29c3019dccb48201c50323e6f8d1218b86e780ab15788be2d5a58fea0ae99c6e05c7a9e2d3cc92670205bf3c04faf992a35ce09b258751e958e7672d16e5c76e7044ec2e0c936a98ed122111447ea81a917137c98eaf30e8b5716a40a57e1213ffa752dfc59d6d0ffcc4d41745d0af8bb7c0e0a6cf448b6981dfe3b52536fed6ea8b78889d6f2c44a78a42ae6795925eacc885c355dbd3f4348f7e0b24a4f05fe74db7b9027d2adf73cf17575831d31bd6f491afb0f9ad11540c93b3022ca8f77c8abad1734beb28e82fac926639f44bccd19ebc6f12793956e3cf3d7c426b45f0bedc729e5fefb98b188cf03012784704ec0779febacae4b3818b1ac18ab9b40a56a70cb22d9b19d30632e1345fc1c605b05678de5704abf07241cb906a36da1feea5107d399fc2369538f5e186832155ab16399c7bc8d7a4429dd057754510b7e3512e4e08403b4c3209aed60b1ef15b58c12ca79d8a20355ef9b98510770058d125a6b31e3efd7a691f6c707207aead25e1d28e40cafe2a43eff7b7e05f117934ad1a2aefde7157a704cf4f3fdfc1b1bef2bbbeea0dda097deb1b5e493fdc9f8a52093401c14f4a883437d0e909c31f607e58c80db53c49896584e6dfcbca424ebef46cd869efe969384693e2083b3cd6df3a283063ad60e309c4f0086552f7fe4e5c13e84acbbad67b6c06df7d82907eafc05dd69b95e617227bf847bf1f27258ab0e7c5e66b255c9828b825bc41c0c46a8be784cf9e5f8259ea6e321b776630ee9356e5cf56bf77f90d165956f134449a1d43af721f23d11ac0c04c1d042bbcf463cfbc6816ef952879afeed009617ba8c4f0db15a0e97fdf7facfa263dfe3636a2d0de33144c50a10ee35aa9f2ded631438d8c4ccc06eb227772c0e99d34192fe0f8bfc2e74c16fd2d6f21676612e0adf9683769e902bf9e58c034b9aa83f24aaeb5c59a086574876591d77aab942789571f510f9063498d9403ca28de544e015c86a42ae02ee5fa3809e1666be9175dfd118d904abf257aa9bbf5b9a13b78fe8ae9cff8071ed7a02525d3bd0f684c965bfd31be806cd0000a574beebb902f9caa6dad73f5bbe623ad7422e10eb813bce420e1ccca02e5985674413a55f8ce664b60c141346c8dff41736364f25f194c263b126d9ff7b2cdfe815a1f38ebd1e5ee91afc23bc73b9d81b1f9cb52b3d9ceb29a57f36ad1e3fb630d1b1fbccfd685f44edd8984427b78deae7a96984cb1bee9cd06f0d327d5ab3485e8be5a4b48e0fd16bef99674ca2bc8c74a294bb05d976c41b40831402477d37a677da9b4a5617977d8b4fab4a420c0ab0d25d55529d29aa6e38c2dd13cdbd058fbd023b27891f9e0cf2e29b8a5f266b8180eddc1931af55b2a1f2141ab31bbb03a4840bb4efceeffe6d79bc72c1b1b7d1f36bd8c45bb1cdcdc13a427ec23e60e9758893574fcd913d443c986b2f56f6877400cfbae4d71ba9e1c3eea7c2cffc2879385c7972c38cafbf54b6de73bd318b4bd44b6394c8462d48b5a0fd7b7598aaf5baed832159e93e26e99e31538d70c5c00ed327322d56404037e1e8b4d93a563436cedb2237afd1c022d9ce986fb91d1bd7f06e88ad54cc0f7137d037a3ed147dd588eb3d04e64fd628ee1b0a0a167ba35628a05cf147b8fe8c2d1dca7ab6cc17bea21a3c6996a2b023658270078ec7a1b4062577a037ec55b0483736069f664b1ba4cfe50dc8b1963ac769930d29e95d180f65a1632c4f5c04128642f0afcb6111177402998464d0959a3a3cc5f0c91fabcdc9a1e22fcb5bb11273b8e0eee1a1ca827059b4d0a3a55d695c31d6ea4f2f94c7b741c4474799ded0645e7d6591526e6d2bb307b6565fbab9373bea2064d4fc859847b27dac5fb4d5c2fe701bc4be24600dd7393d6544d3143321a698ee580b90d57c53d8e0f55ba8f65e6018602b15e47e8ff36db89dd101b8adb45cd601e86fd4a85060cca3fad16647f6654ee26980e6a1dd4f38b1db092ea5bc740518bcaaff93501d58b1bad97c80da09772b47bdadd69eeacbca1ab2fdd265e662e4aecabd04fc186d66c2479fd3b30cc24dd7223bf6df475a2eb6878dfc58bcd4afe75675c5fc58f10b3ba336062a7716924337f8c9476cce26d60d47ea3dfe45bf8fd6919cf7e5cee84c76abe2e6515d40b0844d167f630dfaa2ce9166bbb29c5ecdd2785295c8ea451e46652f90a27ea04892a0a72e3401f24351d4367ae2c1d2c9d392af7f082f6ad89eccb5cf7361fa33e85a42fde59056e11e792323959b63ac60477a5dad839ea303483b4ccbee96990ee4b09480a46da3bee6f55ed4145b9e02ff7dd6c0d02ba7ff418baeb20dbba18da4b99a0c2480b2b88574d2a61300c640227e9347fd570b191f6b9e30a6b373ec0424b892f8d73694bd682813819c4da218463c4df26bf8da4aa4c44ea1c438b36bbb951908ba56dbf598072344755ab0499d78d797ae95c82bfec713e637186b4144daa93c713a1497cd18df45d316f31e4aefefd46a0b6d284050885d543a9bed882e4a7c430bc70acf034e6c00a9f2fd174a9c91e58151aa3406b3ef62c7cbd94f3a05b07af17cb6666f78a2433a354fca31e7b66920fa1aa0929e82abe6836c61a5e1c05c13bc035a0466cde3f1457d2c4bd62b3c0ff2de4d9b51ff75c04c0e8518e794329a0e59726b1fd629f7a9ed054174d8a677c16003cad24f097dad27853b1e1443adfb20774caba65d74e9091dbac6a5f180ed0689c72b58af442f1f27b58e29d9750ac0324e1324c78f8e383b5fd67b6351003aa9396404ae3d585f342f3fb93a1ac3a1681a5e37ae711fe129d8ab404613826329c8833a5091b34d73503aadafc3ae2be45894c95c42246eadcc4ddee0edf9e8d21d92e2db68c552aec186ee809854c76dafbec11729264690e4c53b7a08ef336ce098e398e918d7ab292b63f5c23cdbcac7e306284eacd199c71a415b8cebabbfb99e27cf3d3342333132f35669eed1c4490b82d7da3e77921d54d6cda076b8924eab95c88b9efc0e81a288eab4f30f23dd3e1c6bf564a041907ce4166c17c2af4ac715cafce26e04c08309faccd2ffaf2a85bc2ec6a7b470c698527f195631dc53fa8f1eb886ffdd96dd5dced913072fd9e74a66768e1be567b30850cfbb6ee2114deb0de6121660adb96eae023f916d916daf5c2ca23d691cd2eed1b5cfdf892ec711ddaf0e1d57aa1e23e26fdd042ffb1ed158116983c38dffec4af419ed984f71ead63a037b88381564b14975c83ebf0299a14d6d53bd6141ea02b32100d91e515c42b07998bbfda51965b88f45628421ef810736161d40a1d0421b7081124372506738f6dcbaa1d62a44e3b4e362f284bc3e684a35acd4258652548dd60c66d9af8ffb04af4ccdb08097f36b0a08b232e62197331632c2d7f47a8500698f2e905f00202a7938293c01a50f3d221a6c335772bc792377b5bf0302d752a163439e4a02d0f1a2475c8196b860b19361c790f57901a2c34253e49931710ae54f4e0b56df33df92410f8728160e4fc5a56c50aa7e8c385d5c444e9f507bb09f1cf7df6ddd707eb1eee9579d08409f20ae037b5dc885c35b8e3105fea71fcd3692e5237646b056681593f8dfd61e2a0d43331af6a015c9249ec2129c7e83e81279c1df59601aed1d80b472d4c8d177f22ea4335c4e64d420549e7c631dcf899b993219fe74d7cd39f5f5ce6626810e3835ffd1791a996bb77a6e4b3acb2c3839bae1db4dc90e7e253dfe137c3755784821ecf9344bdc1751d6d98708d2c27e54a3752c2ea9e88648207649fd44763c88b912b5752b575e56328839b778b8e2541d9715895a8d6f09650579d3950ce262c71a0c24002fcb2e5422692e0636eda1f0ef9c462524c1d2d654aae5723ef33d11ab072a138fe34104501d55c36625a3e424cc4d52d5020a390be41b2334f681616eac6dac9d30f80cba5f14f96e14c2c0dfaa8629cabc1857d22f5def1773957d0b05d6138139b933073653ee7642674ec740d9f2287666f84f9493200ff2e32d291a4d8f6486ed40e0abfaeca736f85485952ff41ab95be32d1aa5fc43fcd23b70f1bb696ea0fdfcecc4f1392878df9bc0b16e78c60c5fe212ca7bccdc18ca6d8a9406eac60e4f2fd48b201d229082eb219d80c654f7dabba7aafed701cf338d1c0b185795584da03f0870e2bd074b0c50604b26ed02343793c51467dba87661d15cd7fb02075e19d642c7ce2063a1c5f402b9e0b9b6d61e7e20a6c2922bf9b24e912d1d36a2e96041410f2b742febdfb58cb13bdf9a263812c59d314de025473eb2010458b1583f270d2e3fe0f093233d051a8087378d4df4bbdffc345062ea47c53af991bc127b30af0e538d3000563175def8db137424cf0a566b7002196111d4c244094c7fdf052e95aea3769a433ce4e4e800b8418649bbe8c6297eb07545e6802de7e807324e92ad9a494bc9b1045b149b21ae5e3b0ad47f54864d91ee8b045cfc5419123bb2e33d5da736f56731e15658647b310bbb60025eb0f622948a353ef8776608c3da2a2c40e6bf862e6c7f9266f1a924be0464592ccf01cd2feb810e6a795751926e6f648b2e6ee4ce5d3cb00ef1c09d1b8cea6c060af7f98655f0b49a8174557015b8cc86a6cc770fab2098988c4606ebfcf92334895f0d62718b19d0b8467d25770f4c797760a8b9fe33334ce9c5c6f6fb9a66fd75c1738be759235445542f783d7bccabc8b2dd93007e677131c4450432d41dabf6a592c95e62bb6d5126d4330f053465c24b7f6657081d518bccebdd49af30843394d2e47fafca650445d51c94b36cef8db2f7faabd93e3220642048e73387d155169ba3f1473682853898fc758f5d91506fac17a5fab05d18144c0fb4690ad983b155cf5c33e90dfd87879a5aa1ed93340b0585ec725d1a9a64d7f85a58a2e6e6ef68306a79c94d93bb09c0e9f0053c600d6c0b29492bb1cedd29cc7e08353ea6573d8ec123c08c705b8534cd848ed5fcfd487304880469dd06aa52cb82ac2aea713ab10938b510bbef65bfac656ea6326400832436cf8bef67c354e6cdf0f2dac6c861ebc18f239d0010292f9c8ff728c9fe04325b745f2b89da987af1e8de9fdd50650ec5380b3e15ee3afd2fd71006b4a9bdd500da2dbaf359e82df77b36613e38861c4c9710c5b667babf293038f5ad6978b62beb3dc42da60aa7e693414772e98cba5f947c5b6be3701c8f81b91d3da6fb7de78ed670c02bc691c617487a00cc3f9204179527bdca25bd6bb2d9a5ebc80fd139ab42e6334ee693a0ee93227048664c4508a5523384a149c4aae1b540377c5a2b2bc74f0e7930547b026a654bc4cb902a4ff2035679ac69a3531977c35c0ac1c4f4aed3da136e7d5f3a156e18aa3404bad5c563ac120ec50f94c811fc9d81ae0cef3f991e8466b5547edb635f616a53fd80659abfb58e04105537ab7363a8c80c04c1ca6233e1a563b6066da9513523fb391ccf17cbf6ceae7eaf6eb11748b8cb1c7e8d2f8aa6f593cadcb37ce25c1dbde9302a3abd0ccdf2f876813d1f2925511dbc0b0bf07f4ceda3a65e637ca9e84a76ead4b2f199a6e3a9d40d9fe513b8a7f1c46b81cd32527727ab95e387e22caaca92f507d164048a7a133a60cfce19d47eded6168a88b03b3f3581866bd093e6cb70b4bfc4378ded537a2f074721efe0ae5174548d490e41d48a49d3903bc30563cb3a6431d8e9161d50151cb4d6e3d467676cc23f3d138fccf317525feb640f79edaf7d8210c10dbede13277eb39cb79366e7e8082b682f11b8108c3ea71f0df41c3a931ea7bdd8206c52b10c81c39119970c4f51ddb52989215e0896389c06bea1032d6d6584812941fa41c807ff6be142047e8019a1831e76294ed0678202bec433d3d712bf10c3a73260190ff94cd3aff6fdffa8 +0xfc85c2a27bac262772a53f8eaa19b3df653c10474adc10497637f246b32909b8b4c97bb19fb209bbbd217ec440e2953ddece86dd54f3000b00b37ff34a61d2e5 +88936 +0x8595ad7ef34cc6b60238f58a9a72827a4b199a47e29a8c583a2e385d55a4c332ab609006c2a46cbcff0e0991bc62ae009b8a2ce319db14da669a27f074bf0e7c4df84c46abf170ebc2d38f83610bf180394c0bd97cd7ad69abfa7d92a9d6a4251366c786d4bd390bf38f6fa6b0f3b4c4d0671d743515c0ccb15521881c72edf5a4b1eb0e658f2fe43a4b9143d2a45d9206e44cfb691db3cc21b3fb1df61a51b4a9e19e2587f0ba3d3d0edda1eea656b383ca7fb54378f031a31cf3985f573829c9ffca14616742e0a7e03b0a2d7f05eff0219eebe8adddc3de99f1407eb00a1dad1256241d7c2f931ec993c4b7b9d40df5f290e68344e4497b31dd5f7cad2f58fd222a9ae0b7e91f4ad2cd18b3db2ad739443feb3ac66c8d21ed9f3b80d610a260382ec1d5a1d84cd502d14e496e6e13651f924535badc5579d31f1cb3b413c37e5a4ae021c165e1646287aea3f90a8a208b713a9da89e6a2bee464c3dcea1820093663eef9ff6a8a2f8d780e60465041391c4149a181994de43fa1245ac23a88ee86a2465c4f56734ceaa0b3d18e749e63873195393b59a3adc24b5f3d7fffdcf633edaabb7c8e7c5ece698cebcf82040896792f1a0da46e9c0ad7e70d69f496c0bcaa8ea00d9f0fb58756fc1780052c98a86c69bc8f05e90f77bb5e43169540ce8f7d64a288e4a7e1c3dd83fd467a82a45b9ff7a925fabda8a78a27771c7e65803ababf2b651bcf740281b705995e70bc2e983b68690f56c808a8c4f1d20c6f863cf700b32890f0eca1d7f7b8ef3da1308fc9c762ce904f1e19bbd97bddbbd93104c6ebc259d0b6ac4034d88fbe748eb1fdc8fe20dd39f0fb5927b75da6293d11308ea2e16f778b435c4cec129daf83b0f6fa724b0b7906e05570f11fb1c105c73ed2f888dfe1e932647474c9f35b3aae09f2b619dfb9db7d8d2c194a871fbd938e284f3121ac5b09e740351e55e41e09b5262c45d098f9237ebd82669c91ef36bce30972eb334b2a53349f984bf6a864872957277472da6298a9eeec78c3f50139b7c9b68313442436c606b03bef644ede60d96731f419cb6975915492227983830b02849fd8d08810791d0eac5acc194960f56daf8911be6fa52c278f49e74e2751465587d07ab66ec2450c23b55a6446ae6da3339e7ccc29bd11eda686c8c1a52ef7b1d1a69d4fb0461121288b99a064ad94b064c095751621d51f9e75887e7af8b91203c7d2a47358f3f6213a046e11e2fd1dc98bf639c3880825dda2b0d52742ed0ea4c09565268f8fe3b46d251ddce31933b85d398a90340da8ca7adc86289216002b0d6ff2486e27823881664024227baae7b0ba082ada68010b8a65d1fd6ac68f0d2accec67596d5a44236275963596dbae231202f1cfa9c7173de77914416103d19536b3f1f5c3c46daf841e9170ed5e9220bc3b63a845835421dbcc1b9a98270ec927d976a7bd590b9255bba478f1ac2a3622e21ed8bdae68c2ad4b61eabe311b532acd6403dc90a47851cd5dc2563cdcefd0c781f594a0bb8ce68785c655ea8dbfca20588e8403cecdf2d41bc16d89309a603c1b734d12d30d12010591f18bec6b5042c2ac561af11fc3506d1aaa39bbd23bb069d6597d35bfba385ff213cdadd287d510d1c55ea1ca5dd2d012be96d533dde4eb934c385a1139adf35b2f0858a1cb37e1b35447577a0cdbd36dfd59231bc11a2f3e87dcc6ae3ac27e21b5c4635584eba3b5755d988b5acbe57108c91c168fe0933cbef2e1e318264f0a5aaa544a5f70e55ccb09db9ae23394c0439f26a094d8b61233e3525c6c39e4695ff2a20cb568052da7e497152d934fd03023e9366a63065399569e86a18ddcc36865e3192121b18cae766176877ba52570ffca648af0127551a51cde4292a6acf64c8dfc2d3e490e4127b15b9a4d0334789b40a7713058fbff5753dfe9d8c08a7c4f1932243e5a26f2810d20d0980881a98ef27bb784486be4f5da17e1d0c8e07cc5fb37b082537b550adb62b4dd13919633365dc87c7f29b50925f2d50b1e437a49ca995caac35fcb3db29dd19cc2e8c130b2ca1e795bd9f1f9be1d3df83f37f7530db383283868d782193e915774fbbcffce4d340b6cd0fe5008d38718aa12767a1b32ce7b110b0c8085c18e8dc85edc090f53a3c330c36c94acd23afcfd776a1799738923ebdaccb17ec323b03b66b0e4ec79e8113605bf400085e40597eb54c3ff126db3373cba8d6acffb5f2cb7ee0bec2c7b75eb3c58daaa5afce307c2d8f7c28bc69971c5388cd0247ffb3ad6c5e694f7d871decbdbdd00edffe5dbb2393b7a4c3e5729f8d928557d1c04e427db2d6d4879957f38bacfbaab67ae721e27f78cd02f6cce4c1ef851466a1c974fb018dbbae9414b07781b2e1fbead698b17c480b4345aed337c6559fce4a2e2a2c76176aba205c0bc9657e1b78f53307d7b2adc64c7a1f5436407e62d162854c5a36fb4b73e638ecc87fe6c0f34405559d483166e63c284f078587c33692d4c1cb6cc1c4a08eaf3bbdf87238357f546c4b675c53d933d0acf3bcf82cc7812573c73ef23f0bc0cae0f0f7aaec064d28332936b5f5ed081f53400e5a044ad77f4998d415237a2390c3a9a517422d568a927edec4b5ea631d2c36a233b3883eeb2b8557b2d8b65f09cc302940a374438171948611f997ebd3201fa10ea1495c6f01d5ef52c6871d3de4ccacad78a1bc16b8b157252abd4948154132703655d916b3d1c37c55b40535f1c756e7277d68504f1e7987b1242584f4e67ee3da735ee52ac1fcb8ed07bef8dc674e751ad0f0371f2313bff4942590a654aceef56d93e64cedc18ef646f18e8ef5bddfb762fbd30e074d565dd5f47312d3e51aef091f20029c3b87d83a4500eeb8caae68fa322d051450d353ae38351fad51ed3010ab9b3517922afbab6355e3fa9e6994623d4ced9044be3de99adfb72817f12049de60cba7edffc761f29557016098a260c338acc451a0854cc178c18e60ae277e6176ae92748fa5239bc8311739c4fcbd6cfa2cf89dff92a05608242553abae75dbe5c4205161fbba06f7598251740940e29953745366ccac0098ca3619701bf7f5b6f79ba9fe32efda2ab68acf3031b3ca1d0b7f995a9b3a682e9a08d985d8cc57f02d49a7ecb388bf673279dc80dcdccf8f3b629765671035d57ce5bc734bbca89b507470b5e54d5fb8b4959fed728597f6cb66770e98f710925813eac1de8f90c047622fe02f085f24252841fe5b74ca5aa2d05edd96b7a16f16db8af7f80cb965fa5b0af6fb7f6ab36b78e93c007211c3aaeb765bca188f739f85c49d00fdc89551a9297eb07b266e6fcec02dc746143acafee70f9ae283a6d959c23c602868553493b500b5c43b5c1971ee5b19ba7ac6ea50d9826fdc2411ad9fa95b7f553faf8b60d6057422528652ab9a4e5f94eb70f22a733ab2d01bbb039ea483c54ef5aa3e59b314545d13f200c2ec8cff9d113fcbd4ddc1c9840fadc49fd83b9ada334e35c675b5bd3c25aa0cff0d9f639d913b5b96409f1ec0a9edd6ea700b66c0a1a459ef4370178931b65faa250ff15c166c8bb8c45a174e918523c7927b91c9e6b3901b46cecb0ade1ce00b5b6213a146db4481907c1ef56e7c927e671483bdaa84c393a6563f88d5e67669d8223035c98f6c3bcd8d9a7ce8db0a56165da564971ddba08a91dccabd1c0b0ec4d6afe14890ec2ca213f3aca8a97598c7df5d855388be881a050a9a3fc486404607fa6b6be7ad9c3898904d56eeba8da42014ea86cd5693803c32be03e8ce48863c789bd99b96d5b6a3db279ab3c17ad2aa3359d9f2890be1bebaffb08fcd6eadfd913b3bb48e1e45bd3b011aff72aa7c05209bf301413668110c25eec26af9e3d3ad11383b7fbe0d6c18a481dab564c8b745787e01655e3abf8ef867888d334f4434e7793750fe353bdbd9754c72efde4a09b71ffbddc98250aa40c0e91e621ada8e83a5b0e926e6afea669e5e9194e746d32280f691bf664ac7c4a4ed06cf6b1d24ad65ae327e4752ae13a617fa9b0b310d7f49fa698a0e374c4db99d2bc26b945c2f613a134d81ab8faa3280954c71951e9722104d71a39ea3a3a700768242c79fd0405b74ddbb42f6f1ed9f4bee42f96e32b13e25bb4d08338e171ecf59173e5657ab1a3d741ea049b27c7e02cba5e66518a18ed9b133fc64d6b1001f8d1282e78d497d565bd24cf1b38a25a329c3e36b109808519b7e029e421cad4c675d1abc3ac38fa7dafece57bdbd9a1751c478e8e33eb375c155a2499b012d402f1d8e3b26c0551838caafe297bde7448bcf2d44593d972e6ae165cda90789e12d7d67ce18e9d992bf5f76f90b3314141f0c8be73a3abc62df4ad29334d7c819a9a32cdcd9e622fbb5e5ab06dfc7276e54a419394ee02bfa69b772010418f2cfeab765cd325e383d6383d770dc202a3973bf5fa35dd4ebdf4e50cb80e07310eb39e29a08e8f9243e1162819fcae7245fc484e68b2ec104f7d63f677992902954de4b54f7c660ede807aa31fb71c31ec78f1c355a8a4d7f2c4ba9ce52e01645f4211c1a01933b9b218c826fec985d1f591cafd57939206365f3b9867593ae6cb2497a758e163137d3e912c4da095c2ffdb2644c4e03e3b88a1894194873ffa776a08fec0618ebc7e56783b72d8a69569b9b632443b03e868200650f3547b2fd286c8307d26111563f4cfdd14de42c9d1b1dd5e4bf07d8d637f352eea2d96e77b1f67e4e58b94ae9c9e0a798a2df4c0b6581e2152ad15aaf903b8340f9efdc1cf786a74a01e83e8a6b6daa96954272a9620fb13eebd66b1a751f218ca152a3f4e364268235b596400d392e538cd7457ef80e6be76cdeb41ecee6545b02ca6c075dd7247e5deafa14978d5a56f0646e9210c8379914b1ddc383d94334841edf5e4e28c9c7df4d110cf1b156272ab294ed93833eda4b168d117d40179f8f18a3009ca03ce425a7843303ed4b4ea08960986788a73579d76c11a263f7248b7e61f53185a65d95bffa8eb6896153bcb07a9a761f9b2f06ba23cadb890c4ce019c046f31f2ebb995f1c27f0ccbfbfe5f189fba68f42525b885a4411fb7e9ef6b169faccb8fd85984d92059a008e1a821235c3e122c325de08b8882a0274a3360e0319a3963a43fa5203309d6bf5eafddc28fb0e1e4730f804e69d10e416e106f737ac5f020e7e263618b1df551db9bd1707ab15ccf5fc11428c8ba9e98de2cf35adb9ea44a1bc86c1788f4a082d0e2a8b7dd9de74f610928c515bdf5b012efa910c4b2ba41a8881bbcbd2c5cb4e72acff308f505e71f4e1a8dd149880994bedd0fd670a6aa1677febbb8337e5a86cab3dc8d455d18f31685ed9bebea27ec312bd27176fdd60e3e81aeea88a9f62848f0beeb1d417784e8e78ed623807d81ed01f336242467c8325100c4ca541a542c0324a2cb67653d3babcc007eef7cee28ebdc8516bed20cf9c95be747013982fa77a8350e137484956f4fbb5c8bc8899b6608fead31a7250b671ac2ad35c64d2aaaa41223ea18137c9e64574ae9d2fcaafd02f3760159a8ddb6b7d75b66630b3328c2eacb5fe23257b5b474d88e1ebfee1d55140fb25c10f744dd95e0177255ba8e6f0f52f94599bd41aa9473ed1e3bcb4379d0c8d940f5ce7dd6aeb9cd86b5172812f0592ad49223ced126bb8b5408c90bdbaa3fca8abfe9ee4d5266fd1291dfa2594e5c88f1b411b9a2ac0dfd529f6dd31510d32aabe7dff29c51763a98748a699c69cb782f881d9ea9a4e9978c7830359095215e16f5f7476e0c55eaaae59e0a76e3249d00869dea50a1dcfe742ba6afd8b7b8f97e72e6491ce38491ac6d80f1534b064bf7281929321366a6bc1247ae77f9087124d71374338780d42f64e9aacbf1df2995f515e7b88a0504a6c479cde8b97e49ccab15454c68e906a6742eb34b881daa4f662a827e7636bcc6cad36a95a9a907b8675258c1f81bcda413c6975c6e40429603bd95de588a13be9deb21192a072f7a84511b3ec5978d9abc47c37924f586fc4645ae62a15dcdd0a6176dedcb2725a59a98090d41eabb0cd638c41c4c9bec04b66928a5f1503fcf8bdecd8dfd778eac02adaec80d93fa8d0a0015c035b1e621cc8e8102c8dfededb7d7ac644176cf1064f888f97921b07dc044450f70c609e6112c6423887b5cbda268a72b27a36b552a1f041c24f27151816bbe549e46cbc3fcd93e62c0a100d1d4283a2d209bf7fcda77bcaa91a4b1cad5ecfe2a1eb2a04e080b6c5af1ff7ebcd58cd1f4ccbed969ee991f1f3fa6f62c364e811a62a83be6cb399a76acd52ac12f1d0b1c7c9a944efef9b7f49f87b3080b16f3801a85d310aeea354041c09991394f31feb09dccfe542ff3d521a57ce0fccca205a6da2a6e3ba3c93261404faf9c9a13361956c80aa6927f0b76aec84963d6391578238651f9ecc2d78be2b17eb193fb3d175439f66ec79631ff0209a3e8da153a3ee09b6e523bbeba1216737120a3668e2af477440545f5d33b3dc572e43eb2de4b9fbe15dcf72934a459ea39626ee1a3d4d6246612740a59bbb09058fe7abe8c3ecf82db12d57ed1a33b9a49ef5cf918a567b5ff1f08404fe108dea8801484ce78ee7e406c2d3c3baf2a18052fe429470d379051734924204bb524e421a2a21f9a7af4c87184fdbd18a3c7fdbc9aded97cb4681fb7dd42756c33e7be4b9b92fa0403aad59b631fe080474eb61de7962a846c91bc652b17a9c303bb897675d3e855f6f51a724e2f40767300a0bc60fbc4b4dea1aa03c91057d0a304c83ab7e154f0f367f97ebcb8575bb58260208d5c227e691c8b0c2dc8ea25a0480cf0d847da755777e51925379fb09d3856e2c353ee51ca66b1f6cfbdeb328a19ca415d73e353b1a97fea1e19740588b6f76ba96f62cf4114c14c254bd577aeee8294cdf20a0c80812c6a0dfa8edb0672e423b60b4a578bab3b84d50f3365ad3ab873904eb91042737d018b474a9194f09fb37fa3ef8af8ae733945747f9cf382fe565af66aff8604d4591c8c31d9c2b47c934ce5ccca16732ac1fd28248e105ba6c56465aa3ab9c9e4c91835df040e331d3bc43d8c9573ada4b77276cca9922954396338f1425c1700ea24d0acb0e600f4256c17998d8ec283a23c0cd28fe780894addccdab6fb80cb34b8e91560c88293d8bb006e12c63649eab036d0a19ed5a8421abdc10906aba6215aebb384444c6ede179484b5c89d6a2985a1416f06ad53d7c0683ea90bec2438615501abe7d2f7ae282077f6f45c66b712c89f78ed8bfe745578be1789b6b7f282b18a38119ad0b16340a256d7e7b24bee19553f81d61a90505bd9e4febfe3e8359da7c950286c804f71be45f1e3ef308e100d3382303ac4378dfc91d95c3a71d05604c021e02da343400644c0c5700d593921e54d0ed188718b90aeb8102e3809970bcd0576b692e51824e3c300e74b06112dd570e66145a4d1507c0970319347bd3740893079c7bb8694a3772aa771eb24ab746c4b7c8427fb96ba4bf0d72bf15511bb2bc209ca2cf7dff46ba7530a9ef00552bda295dc9166edc9fe16a16abcdb159d4b9fc912b00861670f0b5c8d87efd5e0d3702fb777afc02bae5602c800dbdd87872e3a29fb24b36befcb36733c8097bf5c58ac9d3132b87fcb338ddc43c3b3da5cf1ff7844c950836c6b7334335eb54ea6b0bf0654ac3106e333a5001c1f43364b8f7b965382c34e33709578f2e6d90f411cb98b5858b48164eadaebe06b060bc15b210c7ddd861ca35f0f9a01955d71b9f13e74c2d4cd4feeadb1e8472366cb5ce992334a36137f5a9b642fc5f6cd368fe2b08b1abce5f2ef00ac9da6d500057cbf41b33f28e606b7ca1592d697a2ae2145b216c65d98fac4983d6485fc4c4abf50b1f4d3228813494fa66bb9e478492caeb5b06c5350c82db8e6e56b05b5fb832255808cbf74559db08932c659a8a7e0922dd0632a97fb89072b98dc9dd7a866b8beeef26c351e13815060a283de3b0b74ad0f414ff90544f79de741012bc1e89860887a95450d49267e7dc4ef63830bda95b59d2fde660ffe90694eec2ce87725cce5abd72e83ad3475f2b3f8e31040487a7bbd66c2ae38a0b5873ccb457c9105569efcbe4c11ce2fd967e62cd7536732edba5871303e6d727fd9b10b100ed49bb01ce39738481a7d1b35d217aadcef1e5209c4dbc1a70ce851c94248171fa07d4bd8070e7d9720a0bde50e35f80d268f39e2a902d1689576cdee46eec51f831eac68cd90867f6f3f241e01142974cbfa17cd6b82fa1395a266b1558ba48f0af43447adb9dd7154acf019411ec9943de37e3282d8a6089bff9eaaf48b200e969275ed3dd70d0d7f7ea49f54c252fc0adfdfaa95806fd806e2e8338a89d1eeb46e03c1d4947fb45e28b3f8a2ab401ca133aeae09f6b2027500c603adf434dfe31b507e386eb0066f4fa0bdb1463b669fb38da566b8070844bdda63c556c332b0fede7aafc248643137ed67070f8f7a54a3df391250e96a248e780c772e07879c9d103fc13b935e22861c8d2a73c6b87e9925c1b33dd3986307414629e66c5f147a984603374b74d1ce9088822f7bb16c07f3e7cffb5023ae9ca8a9541c8c29971bd915fc41bb18cd55fbf1a48f18e5bb74bc13aef5e99c55d310be8c3cc167b2f5453802e77cea53d0b141180f18d5cb7400cdf6d9fa52f72f3bfe48c3b699f6ab7f24bd950b3a23b3430f334c16023a6a448f3e042cf801257cd1004dc650b082f95482e6e0b8ab6233a4bcb27aeb86ec09cfcb00dbec124a45df49479b0c9f302640093987c6698215b9eadec1f21f5dc318444c91afa90239919a2d8f2e1117888fa7198ae3dc874bb7641d85c6825402f12063e8d313e1ca70698c2d4594cdb29be31344b172e64815af1b20d95e433bd2f5d33bd7016d6af43dcfffd3b8b716ed53935f8fdb23bd6d32544daae1cfe0361b17152beff9bda59d857178fb68480c6f3625ff53c3fe168435469bdb4ea2a336bc1f524e4b14fcff292c75bb45a8719c585280ab4bacba1b4ab65c9943d5a2af1e94ea8aa61372d9477b7a96f3baa571964fb4102f2bb06e01174dba43fbad0acb104553af3bafc25d08f80ce71110756c97ea40e30da202f4d3efacc3a73ac04e3c0307cafffc30d63f6e9b943e5b1e47a5c3ac0bb4f760a296c2ef474ac466245294358dd2f0ab3f995ea18f84edd2b3f3b0b01dd4390d76ba67f04368e272ca1e895b7c4715a8159148ed3d9731493e2c420b7dcdef7ffdc93f6e4c841d6ccbda42e7fadee39de4d1adad32e7ddd84299e80cc014732eb44dc9a7c72ecdba86106179ae0ce32329b4fd8fe3f93c166de71332694a7c9026b2974b47cb8bf2a57b557eea538cae60c5d8f3d53de47a1c7e742afdd2545ab18218a752dcc09b8665af66544548b6068e90779b386f79dada6b44d23ea2d50156ce6a5cf5141bc559dfde6044bfc09779e4998a8b259c2575691eab01e095828b3902ea86ef09ded2573582f45a54900215c84788af6798fa0e26dcae7622b1a9e8ef6014c9dc3f69b60a50b690f89cd1d48236b3755281b2caebeba70be31b2d4eae72112d09638a6ccb4e1e0c12fa438165fcbe1fe39c4a1fdc5c8dfa8d2bafeace852e9117e7aefc06df8d243a54e1acd1edeaf7a1252a7d76a3b5da576f8c3dae0daf9e9e3861e43b89a661e51936c754aeeca501d8de845955d113f8536cc7eb90269df2d22da5e7d0dc4d99d3ad617ca415a08c03d094e2e7424fd673ac09f5a12627cc417cb18a49a15fcf00dffb9861f862b6529b5fb1dc9bd6784cc4846ab520b46102c9a7915898110b1d2906666d27640731a92534aa4050644b60c7a94098dc77a2bef89b9222f9c4a52302352a153cf52d8485e9d4c246110bfb343fd810f8768da715176ad4828225588fa32d34560692b8024ff0b41014eaee6a9ce00ba0d4303c9d83571f33ca1a340f2eeb1737c22dbe2ae5627846c684c4cb5efcfb5e1746c9f26dfb759612f03ff136e8306aae4af15038ce9162cc4618e6e4836298b61de9a445ac7a11e343e6d669b9125731870c22b87991fc9ccb553ddc27c3e937420623990e9f4fc181c33f25b22f95e24e6902f317fc6c9e60f440843eb1b8214fca00d67657a824365f9c0977faaf371d9281670e334b67c3808f9b4c9e9e0a838fcc9c9825a381ee166d638f15fba671131e82e0c9117f5f948b8fe5fcf339a9d1d749d89bda60f58233e24be403c6e5554ad52430475b918ac4b07f5f60551f3ac16cbc2ca557f91d800452e7600ef6f396ec4d0b557305ddbbcb9d386dd350250b83a75aaccd7552c22818b298e502587336cfbcd45c2927e13fb40a644ae91b260d4ea84937d6cc7aec21b806ffb40e602320c74c7d77d3c56b4867ec1246a791980698133db9e52abef28a42a568800e5fe4ad166d7e8be8fceeb37dcff534ee82639c93357b37522f0f8bd47cbc47ae3b8fe0da92a99acc530b8f91da715d9d7afa3831b5b72d71aadd3f24fc1beff0448704f193858ad01c234eb0d8578c1ed01efd8744ea4219b0d036bc9a03c355196e8c03c69ef694a6ca93633ff43af320565efc49811faaefbcf513dcf07c4d18aae889d262489a8165d01177e404aafa34cf196a1810b595c7ecc33b8e7558d0d09cec1d5c1b523a89975426b353b6bc4ee056fd0bcfca619590334c2a3908b0543ba32e08c94c40aa5ba3b2ceb296e4e9154d98f89749d1aa81fc755051cd55ca27677ad4ecf9225c9f78a2b2abdc12b7e055b46b21b4547b34775d9d3a273f86f2718a6ce0d95df4d55b8ceb99f6b41fd417e5bfd9aa688c1a4c5b6d6c96bc3f1f89d31d6f7d62178fb4c7f6276747a5530c8373399c8c61b5e3f55d63ac7a3720f8fb82c355cd49411cea5ebeae5bcd0f9c3421cbfb4e70a9c6b1c9b9c8f82389476a2996e30dee7c1c7a71da5c5f1b4c5f7e47fb571d5d486d274ec98c9478cb0d857e54a5829ba31beefc04c1c004abbeb8625230776c145fbc692d67fdab68a3f3fd873de9b54893be49c8af3d1da04278ed7af7fb41b016e7856fdb823fe4c32c23a8ec91efff2c6ee7804514cacc733665b04e07628e1b4f4feb57d09ac1b3a48d24622990194e8751e653e59072d987479c832a3320e54a052a8d5770722de396940f0f3a39628e15453c2e0355edd22fba47d257fb0d6e61c7cc8525886a6fdc7273b162d200f9be376e6c97c818ad7a73fcae357eec32d22d95e83e7721afcb4a10ce9e75c24099378b1fc25be27fa474220c504f0a2dc2d68a0f2fc0cc39ef8566a541870ef942bfe2c61773e3df5a15488b3cddffb5d05d09587df7c284c5af05d3f0a84f8a475b35de1bc29532f7e1e0995f9e3571772ba452bd7ebd16ca414ed9203c1c8a2373c4e623aa7f210a547ab53d1233c723cceb9c42e8147689c6c23354c4ee6f43a4407cd3bdea100e07876d69dc835d62ab3f83b2a6511a60ba006112d54da0446718e0b05f9e867f5597304a5f9c7ab06120a7914c0b790b8589e0cedfb2d39236bed03e01e4fadad91a9c630df7c599692f86534b9c28c6d3bf40fd66a66fa98db2c9c16765f3ad0c9210587a1db48a3dcc9e6d179b904f0f10f032eca0db16e6951c0ee289f7726a8e1a7f3696ce1f49785e63427245f0a23f8ce3e42aac56dbc6656af5c98ca76d7f395ba5cb88a536c354ca6ec8c058379b55a4efbc69e5d7d7245a23cd09c8afd5eb824a446ac8603e0006df0775e239a508da61de8a406537e770fedd15628c32bf77b699eb056038ee9d15a70d2b22fd0518dcf993f30e791d33e9a235e19d1613905d249fc8b1547f11c52fcc9f7df3e8d4d3960d7a2e1b34176694c1e25ce08680c08cefaede014ff9402a5abbb53a1292c84c5d425e8eca90082d6fc1363296bd633b511430dfcfc8390f2e0c632010c73d8509e81a445f3240e4962ad37cb2aab7987a8574308ce2f246bd0e0256720695c8a9d7ebec5082a352bb7b9f3f68dd505cb29ef2b3f5ee1e799e3d1d4d94c5839fa39e3de75ce5a1e0663003eb27c9bfd09fbd46ca994e000038260e66278869629db7aab5b2efcf261ce4ac108df448aca86ceaf4e58769832135704078c3c9c9de909ce811057d8c5605f23ff9e19d39432a59c3793e9d7ac007cd5d271c273e0cd59eeef5db4f9b981060da0a16201f26720da6b2b82e4fbaf9802ca0d60427aed32b4acfb5b7dc5990927f2d0673b698d0812f20a89e8a68a7232f7495e31f1b35cc8c0d4948b71102e18fd146faa830c25ebd516460a36f7d40e620e036acf869ed133cfa74b464e3e89c953c375c74c3f0e1b3900733260843d124299129bcdc1780dd3dbe6cbbb00215f77acc6bdb61e22cc5a014a222c4b680fce6654def28e6457ca7a8489bf3e89c66670c2eeb089d0f1618fb88fc3f137629bb3561f5cca3d199bca4c06c3be68060a5793e1a34ac09035f3e5008d3e511290c740e67340ad592e1467cc2d49672849ab611ef82799b4c075f8fdf2fa5f2794ec3bbc9fb75a216b9ffd6367a72e320db2532e15e90462e95c1a0e5aec08aa91686f2748f6ec783ab53551d7a0642f3db692986458a8a498f272bc2dddf5a26e8403b1d6c60c67839c3720e7fcb124c1fd45e44b3b2e81b57d298ed395ce1713881fe2b1ef62f42e9d2c57fe82bf1b81cf959b345b3d022946660db4dc3a1268bced414139952a23003c7f83fb331b6476aa4486817e2dda9552bf387ae19954679256ef6c4e0e4a0d8e1fe030b82d5439ab67a973980cb1b2152ec8366cb7c2d339a9214f34aa8b0c4bbf7ce6f458395fc18d05fa34a796e4d6e2cad98371974608c340abf005cf449ae8bfe88fa4f931133d02ddfa047274bd62a82bcdd1bc09272bb5482927fcfea42011fd32197df7caff08e6912d2baaf336c8f4f3de1964bf69e7ee8819fc8290f2daec85c0adf90d5b7fdba22aabcea0e694fc9ca0969ef8063d65b4e2b51887e3827e2fa0717e05dacf85d401d828ebfa720b71201c01f9892174568a1108b17d717bd9c1b2d0d90360acd0bc9c00fdfbcce81a6591d3eb7afae5161af799354710ab2a2c5635b25e9a183e63de9dfe71095c3e77df5df5622f7e9b994e143cc9c5d5cbe847f6b874e690c4fc864815e2912f855fece740c72a088e0f00c1ed8cf9c363fd6b5a12ccaadd0d917b496ad8cc299924a2b9f434524a9684f4e87117153b9b74acabe9ef4fc7bf29a7e826da22111fcee71a382e0f0e5c0112d1eff27f061b54f12f64633e1683cdf16d7171fbb1c266a554343fc91a888d42c490a6a1ec8aa52130acb2de920084411f7223bfcf28f3c3ad11eee837c1316c087cbae2b4907026f4e8639603df567f47527bd634f97d296ef7c3d42daff478e6dab6a928d6bce7c441ffd030c74b932d38fea8a8de0dbfde0d47f6c4fbde4ea6d223600e04914ce7df0df3e2616c66194d369df37ea96d477c01b4c44df7d7908e886e2fc2f73da7e91567e155c0de53b9aa1edc835c1bef6b7a77f44c48f9eb336d3b53b6f7a24a88a093f54a4fe422a3e2912c922bb11f0338a81da1d89d01ec5a2f418b986319e335e1e6e82261d0336760ab5620171f6cc5ad07f4afac18dfd8b2c3e7e3695c235cb87bd8403ba393c0f12174423537cda9f07aecd60c79346e2c9f73de9a5b6f9d807dc2b15ce4e875ae569799f3af4e6ad73e3154a76c14a5059ed693df5df081a2b54d7eaada5d0ffe12652e3ace1992cc1a6c316338a704a588b80a21accd8f84e822ae0fcf1715481c8608f0de53a936d845762a2714137425c34a468e2f508fe1e9497209410ff63da32fff2527357d3e632ae37f845adb3d9d5b374c3e4a2b674958bad101856f3d64ac4decbbc008156f5576891e624097ee45dd2d2107c141eae2d16f7f001be47086c47a37d1412410ffca8d0bb20cfc5f101f7b010fb73875ef9e2be50862f970c54b19c4f18f35ef31c9d372d2a83497c5e47c05e877149288094d5823ac460b72c90f8aa65a0eb3f35aa27c4b7a073f6c167a561c679de8b3fa1c02db6191ea9428a5b07b0b78054b654450a4ec3dff0b9cbb1b33f19a207a59e10bb7e9a3b4334f235ef5083b8d43d3ff1865659d7eac5e887db37cd5e1e50ee59b3fac44125726d1be9eba1ff2e28a1cf9174df065564428a4266f14d4fb026dd8fc133bac0995f6f5fd89ecdd3073e21d410bfe5b1236e5b7133420a1c41bc4ed758452295084dc2e9ade69f536769bac6b098f09e71c05df0332c1ef4842310032684f3235dbc98ffe1f5fe3fb7c8dcd1dae6b17ddded1437dd1be669060fb3abc28fb6ebf820640b0b6974e876b02a9e062592cfc64910c0979e1afa35b6bc29a2a1e86f661db6a3809d6dfe32d40683b8d23f04d968d612f92f072891dc9c154d88021e2618f351f82e73e16a88f31b7978f0dd75d0c6b7884b4564b8c5d5e7399e8e88c686cc8ec87911228c6392cdae96628a29f58516bb8f504f0926ec27ed42082fb5fb84c27829b03226d85832fe96fecb746b73c91947b2480164514fdf3ee99372fbce859dacebb0b87ba5b3b0074fe1d38725470810d5d04ff2b7d795d1bd249bec0c509f7f2dfebfb21df88963b09dc5fd0c092e8755782376625797a6fd738f60c0abf41cf1acbb102349d148eb3fda11ba97f2f79bb05a53e3385b2b1500cbee7e003202c11b291a58502e033a487e89936bdc0e2319231fdcf256dabe4cefd9b6f5efcd26fa88351f84064f285821b9490d601776033c3e923e213233c859d6ede573d8adab56f4fb5de0795fef72252de525c02f1ef434c54430ce2003985a956774b1afae23de8e56430e2b6ede51c49b738498bcf996c8dd1c0b0d7f29d93fe448e4a7936d561b05a49a3566c4b39f98ffc16d7d9ae92f412985469b9cd76ff486fe4fcba1f053d49b99e857c3ef31561122f7d176805b190fa985f95fd98800b54ae2e74041bb5b9e89cec26a690c6b6e15c2491b00fedd34f42618f1543aa14a672b46e6aea3f303e64337169593315d167744e6ff6d061001b16aefdbda5ebcef639b03bbb043823c00166709685064a1617568b0381c473eb27fa9e4e9818320363405dd62c58ff76fe0ba38fe311b433b2b1ee7e2984127a3b7bde40ab233c60da28ba83de193a4fd36aea8b76bf7784f0687eafef27448ffb3aa6d9089553d74770380a42013c13288b2ed46597fbd2768125ddfc3770f40f3edf63d4f6de2e521ec1b2819a6d8aa47455b0d922a9e4ef07c952773c006f1e8f6f243acc472ea23c3cc5c36c367bf02f4968fae6e78401ff545489bc5bc9d036406560a1f59fe0d190892ffdfdb0b4c4f043ef6d1e785473ad2c5a41e9cacf3a386d6efc5049b3e6a747eed82bef9739348be13fb789916abc2211521239c0a341868d66c0f3c4826846278229014198fc86f7e2187f60ed697dd7783edf4e7a42f6e566ad67bbadbbd003845eae5be92f7e5ae0ab2268039c87d339d5851fc622069d847f6b3f6f882baa6731bd8d32b7b931c1d73a52b43d862e203ff1db8fcbfedd489ec8f8d1b7a043b30cf87e7d7b80a50b038ec50834c30fb2e4ec2bdd2426cf3b73468fda3177f7ee5625d7d1631ade4899e76a0869869f792d3db7b915c598e464acac93dcf8eda2760d3f3757d103ff000de9bbc51705fc80ae262a862563cbdac4f602a16b4e +0x43767f4cee6749090fe23cb07e7db664d6c7c512f8afa70304f2f14b8a7204779e7223aaa2c8ff3e82f8cd72529e43d5df545e886f647a766ae4172baa56407d +89728 +0x7caae2640e734539d394d20a3b0f8c9c827eb6f726b4e9229ea1632e4976a275a50a3224c17cc3f7f51b7e44d082993b5207296c5b57388a645a186e6d5df65e366fb290b20befeab9f8660cfd6e7f903f7a2290c3a3ca6901cedcbf9d5f38c299a10dafca68f19988f53169aa196524b29e486c44e2c74addc5582ac1c58d273568e989efdbf28ccbd88764bfcc747d113a4407c75a57b2600734b6c1d81f17728cef270aab1a4ce86a120324cfd425c517bd6a3555a02bf25b176c85dd1619b8d4c6900421906049737750c26aaca437fd5c9b7419cd3cfb8aa952f61f9ab66f0916ccc3857d5054bb61537fe52480ceb3c9a46eee046ee35d9373fae5d174fff389e4311f08a57309761344876643f103ab8c091e6d4712997dd47a76e6ded15ac5df35365ae60d265e98fa9a97740ab3ab5c2ff03251f0090e7f5f1bff794b0672c5b6139a9b89dbc2ea8764e29c808c701bc7ab7814e674ef7b8f1c45cfd6bf399f9efff14d51ee4a12d52e6d42bb56a3d1b9986a175aa1c8d0f4c1df67db4cc274d4408783cc279d17ca3f60ee23d9eb87edff2de2b55940877552f5c9c076b44c401e83c56250640150e1e42920dcf1444a28ecfd6064ffa6f916b17eef05b72fcae30d9b7b2f46d84e5a21791a295c10ba5acdf1c18aae386a56390dcec175265ad54f8e7f8eeca5abf33e697986d5f325def8444293f542af5ab5fec7719338d83e6e25d633fd7051f4637ea5bc04f671fd96814a467bceb06a4eda40dfbc6e2c6495e9e9e6223f27a5ba420693902087fccf2d406ce9e355ce2b27a3d196ce3e90ea601e71031c154d683c04d2227a4f26cad28ecde68a86cd76705710c963f6099514de9b470e033698f40843610ab1c2b0f79b311bca2bb0543ac464fe323d19bf8d922b971ed9a670f378acf6da9617a825cf602fab2cc0ef0f5294dd45f9069051a0ea9a527fe618c0bed688f2e46edbe39221cb3571426f76696a0da314192fea72a0f9b4de3eb9e34089c058850f71b94c3e9771e281fcf871ac3754749ac5e06e145b4cdcf57be5688c46165f42912f657d3a6668c4bc1cd223026103d179b9fe1069206255854d9da9c1345c4f63ce45a75d1ce952da6af49717d1a70574ff895acb3b59a400a346a6d9b8637d101d5584a79c4e747c6a40d01dac4a80dd3977bb28a2a72b1370cd4c37ac5b16c0a5fbdbc1ed8072cba51c95bdfad388ddf02ffb285f3632e73a996383172e609aeca07552176694eea2f1af9fc42a669cab1be27478ec01a38c12b36402c3a4c77cad1b0323e7220de928e76a12376241f2a238b4f8b3df70eba003837402296fdd88937c18ed6352032703c6eae2c3f54d2cc48fe4721676e1ab1d8875d339b8959ba564fe5fa0e37758cb5d5613d3df45214fae4611ecdcf59bc71a0d1e1acd2e4d1b64de2421e8cd2209d45db2d82861eaa1b92577aacbb0d8cae145cb15d43005bc23bf262e8a8eec83d607a71bf72aed82578a8e976a98caee8724c272f6212d4f4aa94c0ff0412002095ddae4752793ba307c3dfde237dafab1b3ec795a8b2c9d80a47e0b446e254e1566337bc9e04410ed036c225a156eb809f92f7229f56a6e6eb9a46bab9d632fa32b9b271ddd694e3627034ffbb8f0ee37fe74a48ae84f89bbefa7784f57426d5bb2f83196a7683ab2f1ebccedaac665e3caa458a6eb43b8104f6d7758232acfe40534e15ec5ab9d0a680ae157735ae5b466a5d6a486aec115dfdfb3ee8a831fe72c357f9dbf983ee69549d66199123652d96166ad41f86d71a9e5733713b5230b2de5537a1e99e7ec7e90f235a6581f662bbe50e9a58984cdb568fe5e4628a4f9122aa51e68155ec72dc87ff82293699864a6db7f39c9ced0094e9d89ab446958e3eebcb128746c1daad7c3d5932adc8f8d00509885211323af8198e1cb723cd1a618e15ae31dd997fba707f2838740f4aeb4f75b12f71a6dafe7378d2d18e30c65905c41237a6ddc2a1f927779115d6ecda918f167b4ac570f6ac2b559a027b0273e758f6ff2f0953f26ae8dfe30fba6f4c9fb810dc19189d9f18083d870d065f50a746c50ed296940a6a15c994ce1432afbe8348a8491aa1563ba1d31f2a6d5d6dca0ff4dd3e1013786b40bd2cdd8ee7827263268677362c9aab8abec8c71a6d29c4271ee0de0042bae2fc2311ca84fe435fea22ed1015bffadc25692a8f880f132a2e9bb01ee1b25055aab3f9f190d790eb8ac652a013abe542045aaad040c3c8608903d18d3ee2c757ceb83bff2d13c989c7a94d93caa0f8719a2bc035df1ba80bc8efbba562448e6dfad85e4fd4237bcf13143487a51f82ef6925012cbd87309050a7d504165813ec917ce770009716301fcfbde83d78431003fef41166970072d2c4c405a5be0668351e5dec4cdf273120142031ee5b8787cd120fa054bb8647a1eeff46aac6c46558452831137c3d66d68a31f15239eecb5706ca5612753063505eed238002ec686d89eccafefeb725a5aa39a2e383d73f2425aa8f2a44ad7a50cd2448e002ccf60745023659c723120ffccdd32cd9df67a72726c806ba4bd145822b1325370472981f0effce661f9097ea54ee889c75e96263c59d32369a2c8146681eda202182a2607983d77bfb45bffb6561a15c2918e8741d8b275a26d0a66271b8795e828ab8c1c86edf494495fac885e8e189679aabc084fe70956062276ebe9c8d32c61f4dab720d708e8a05daba2cc0d3b4cfd32ed192738868d55586d3d527805d6a94c3960d0c259c4a19d248c095f26eb046d44fdc96e954f41f473a2be5ed2eceafdd1a0fe758f2f346640cf7e4c807b78a4e63b9b51dda5b43dafa49543e3780b4dc9fe10b95332410226f2929cf105401ffe5b07a80796967c4aca40efdf81f4854a036f564dd4b0b7007dac16238f4426b2e6743dba2bcdfa6c9c252a6f108dec7b358314241d69cef3f93684bb246c012a634ad69f6b42fc3ba3adbc3b2cbecc851fb4bb8015548e29ed97ac64c9a0f78f5af03c5d5eddcde266406ceadd6f6b8f466b120bc55a41cae13756c488c8510953d0379d0c87b4876e4703252b8813c2340ee26a34612dfd5d7e4c8368cc58bfd7518e077e26f85341284a931ff10a467007f3486a529cebead4554a729451da6ddb0b42bba3e26d694d06ddc092984282bc0d4b7016d4bc0fa138c1ac0887819ed674f7cbe7bafd6e1c02aa175307def397f81b4d931e97554dbe8f201141ddf1aa92cdb7d9c82dd6ff05a32a1d9d4449fe7b6109b3c1a44340af5cd695c616eec02d6d866053232b5dd67003d6a4990f5b60c5ad5d070d61e2d3d2d47d5f531d7e0d7e4066a507f49e3eb8aa686208ca156dee407936f7379cf19724b254bc074df9a9eed20402ba29052325b920b604946b85caee978c4ed4d353ce1bed7b3396ba96968cb93c0468f35b7eb325ce4440213154a672f42df33fafd89f72b529bf18ec437b0bdc5ac2cf05bd3dbb761381599be4880f575c62fe524c282a957232db54fa89440a449f63cce83e28d6f8bfd96b857cb5dc6488d8e6319d5e409555cb75c59dabf04b67755509a0b5187b626a483c6aadabcccc941090e556e11a92b0f8ab9f87b3f683ce4b274aaa6124d2d4da133a40ed1c98fc7a70ea5a9e8a505184b578217ece5936544b244fdc7c77dfca11d4b3cadd53d6ccd993b29f6cf677c2e90ec1775a5275187c16ebae0aba53c03e2151699664ebadd4c8a50d48eeea59514aaec622d65241c208c8025601f763a30761f3cf3503c667717c10a79f72f2f5143294ae4e967425e22cfee9b5945c476f2a8f102de6bf9d7780cf0f71d735db5593098720095bae8c60ca4a3ff2523342f566e2b45b3f7bc0f6730bcce0c90df31a4c34b6739e64eeac8f0105d9ee6d660aa0cc322bee0b3529232018575793d80f863d779ce550f15775977111d8ffc5b164570f1e7654be6008d8bd028673eabade2bca4cd7787baba393ea61b7f04632da09b4fc7c5e44e24aba23a9ffb713627d84194a1ce675ee427dd7933449d0d42b6d878dab32adf8104eb3166a673a518ad3cb5f5da2c86979dea26df6114de17f08f199a8d7e3ea821dd3106e8947cd2e9d485342b25a64713db2b8a650a49ffd645be71e55cc00caaeec5eb327211f916cf7ee7220152751226f3beb0fbd57ce082b40b3b552820d8967c9e248b28fdac742f796f4e0f9421541c06e558050197ccb6c0ffe5cb77637aa19a3f5e164323790385534a2246c9f900dd62ad5d40749a133db38d1e82a3f1f169d3596e8c0434a7758ea45eef647c4eccc96a429c0f6175dbf6b9b5d54292d877910b961ad73d67d461db0a009964522f8a2d5986b0b93b162a0a15e1a7e3b36de8e3318204f9d12c8d6cb81cc137c7a0155506931107ff86ddfcb33a4c5b3e975b8ea55426007fd861c7edb6846cfbb90b8fde4398e42fa872e01231b86fc69e695c7603a2d7d0827f7b1f404b7a7ac4cd1c451ac0d447f59972b77a74a7e7ed82db280313e65f9546f4c16c9ef6d17deaa8ef7b113ed4f8b2131786f97a1eff38994fe4f1c2899b48d3787df7587c2ed4b411f712aa531c4d4fb6b9cf8cd86e0b05322bb4e2fb0f0585b8f6dd15f7522bac71113d9d4efacb9729b55f26a0947aad9349e5ce106afd99e789b8c5bfa25010615c0a9e24fecd77c4fc30fe041cf800c7c1fcfa5629a16e988932de5189d28e873a020371a2c3702ce0ed697f62139d642672ee58e581925097a3c649632355472dac83b1713dfed615dcff8f0e5dd1ecd9d01085092ea38417b41403d8d32315b972957104ad92350d88369f6c275cc66ead17671f08f0c79bbc5e0d556266976fec9f1cb792d8ee3a97953d26008c755762496b9191287f86550ae26341ae30b3832731247e11562f5391f4a689ef9e26885d2efb67a93089f6811f7d01587626cec43ab5cff9f14e74c3327823f4955e97991dd6ed017ef91977111d21f3dc3c37dcb5e618e1642a439f93055f49ff5208a3c49ea1bfaf66564373de140ed75656f71f5fe9761345788d72f8ac4e30b363f39fcd26326654057c941a5817fc1794a9f36da21683226c237eac8b8fddf5220f1becdb182844cf990e5c8e9dbef2794bceb9e341384396e802bb8d7d6b99db6cc56830cf69ab1d1f4f3ef81ea4799d730daf1d84a71b9141ab8022954e13f88338e9d7c6af197685e31c4509210f49a62cc7c16f542ce3d6d594db6609e5f1f8c2cc309c6cf25443469ef5ebc946366bc88e7f5fc409f70e1d84187e33a250140f99cbcf27d83efdf6118b351190cc2a5d8d97e47b05535defc87a3c3fbbab8b8bdd19cd743daf1c8e2e65837e817368582fab8bedd1714cc8cc712ea2a46cc5b4009b15b6852d056b301545849ad4ac54ff3ab4a0e0e961351a8dd3e0ef0c39049ed0467361216f09e12af9a83f687cb076c5fd18a62421b13d30ba9f1e127c1a2259ce4f3434a0069c171e7e0197400720cdd3c9a3aa04c99f0a41219417f55115882b8e80cf5edddb5a326a63e9acc577c2c7486be390fada6b160cf3754b45f2ebccd5d969e1fc2974d3f1e8f7f9880645460961894ca159d387d5beb2d46545154099a08cdfee00e75199031adcab36a5ee7126d3ae79a7e445005869272b7665156e68b0bf2fec3259e444facccb93951f341e8b1cc04f1dac115300ba35218bc9b8b47de63e65d64b5810f02045a77356b6cae83e31b9d04b8d210213eeb0c9cc0cf63d1b95e853b46919939dc5dcd1236dbea3792a72bc91d864f5bac4bedf9acfb08695c2fe3b03aba16d9ba8ce2f13ed6c256436f4232d8771442553a61dc49565d30b4211ece7745ae6808ad5fd96aa55e675d3c8b45d2ed885ca17f104c7e2a8bad2afbdf9ae67a88702d89ebd3a28fe7f248d6ae0cf132d334f9e4a45133bdb9682487cd1e6fa0cd7891e82fe6cedd85806b05528f1e8d1c4fc32fc2f3505910ea0b8b9161fb00a4099c92d21ad7d85f9830911fd542458b376829143bbe44b8ba48d0d26b70e336aab64e7d77a3c59ec2fe41bfe643a34a73519a423063c6d860411e3945b88fabe347e5d8061bef69863eded7ca0bef7e8be54af4da28299865603c6ef6b94d2a3cb7208ace279de96d56301289807152078b00d142f5b321500cf418865d64db3e6ec53cd7b01646feafff152c8c70ec70ad86816fb3ae9ba9ac0cdffe8a1ee770d59c952a9ca3a7c2b1138bbb1636744eb2a2ad6948602ef9aa4d6d652ac1765a526f3eced58c343fc4341a3c05091327021dfd399e1200c66d7f67c32496af854e04decb411917ff51296ab94332f08505be18e69c0b3c9b5d6a782060e5bb7832241e2aca92758abebb2439b7f835ef234fa778299508fde2d54685c6f6c2bb6497a6f2573e796675b2f0c549a507eec49651f82ff68c76648a79f93e10ebd74e251d2bcf66481ddcd67564e1809009505dbf6d9577f28d4b4fba85b07c5e5356962cde1c520d375dee5c1e67d0f8c82f6a98df43605fcbffedb130048344b7e6b17a12254aee3a5fc44cfbc3de67b3c985855720f9fdb6e82c0502226bc58c653fb0cfd29613b04a1eee04def2045386782edb1689f4d86fd35e03f27c08593b08751d0b7da52085c5ea409e53f72fcf0a3a760c5a6cb9faac663c5d0036a6cfd47205b848cc137a81e7b8ec4b69cf0a02522debb28cdff37dc2b4493d76fc8b6b4e8ec140af1090198d72b12082bca1291d0a99da7cd4c00f1d73a07cf1e1d695b2c10eaa779f2f578678d31b697dfa474414ff1a6520cb2a1d824805cee0181946a488d14b48bf0177d23c84479a7f246e5305b96f497a956ae82b20367ebac0b14215fc5494a8e00b86d2a3439c968744d09401c1d9371aadad2f15514522529ca09e72ba0a53bce89e7fbf860aa9396d9292388458697f8eda3e2b46bcb997aec80c7ca433265db6212922376c1f0392a1e9a7df4c778db4763fac3e6be75690c145623a958a8a1e18ba127f4b60ab5b067f96fb3fcb0cc88919de60db1559e993336ca6bae80dc78a19d8862dd4f96fc83e4dffb8ccc4711cb60ad593a9666247bde20d2aa6ac5b7f2ebc739de3b777ef0c131440e27d5835fd77c41b0d46a3e3ca0b9a6b2e307f00e1056e20f5ab1a84d332625e75fe25dfd66f56fca7c1537244307207e660dd131afda140729e018e7af0109aed107f1f2938b3bde19e1af91299c08638061dc3c1ea3284c259d415e996477cb37b0effde1b02e622a7a2821c8eaa6e8be8e715be1549744da13a22086b2e8d2d077b86de606c00d1a290144a57584946d0e113f9c60f997b41dbbbbfb9ee54c47b6ebc0f4f189258588fb8843bf39ed384b6c45b45ab7ab5ff60ebf6c6ae59e0a18eaa5a302e241e914575b283a3f699cc0c30cad946a061a571b795dc9725ea3f8457a74ad83e8b145a53bc788fd800728c602fcb0891e9f9b5298441d13f481ef7ccdfe63c6907ab775a8a5fe0cc703cdd5b736318d7b3c4d548ab3d832f6406900fe84c822cfa1c44930483bd5a51f4a7297ce99ffa29cd781cf21ad57ea5bff72aacc4d310cc306805132b4f0b0b6094d334a5c480b1de47ae421ef0b37210d3241296579ce5af8cb89d9ebe6606494a6082dfb0f3b5bdea058193fc5635c2cd0601093558ae6157b58b2531f4ab7671d84dde8ada9c33082999bf20f0559d8cd7636696cc8d0e7203c608d03b60b1b2447feb7bbece08492370eb85083a69b99f1ff5a181eb7d84aa358fc4c58ec0b5abff4eab26b30457faf05e53264ceefb671dfe7ffe317736b3bf02351a9e6c2115b54f419ab3efd7b60062b1d2f3f4fb3645c957cbc5c430254ea84ac0f67d9e8a893666a236907460873dc795974260147f9e5271112c1908c9ca2c4100bbd613634a41c7a4b0d4ff6f38bef6a0a1d309b3c498777b77996517b0032523ee6eb72bd4fb9065179f9b9f9bbe7e76d9fc1ec98450656d6c5a4322a2f6f2c6dd117fc91cbb86e18d7e3dffaeeeb381b2825aa926a2c44ed401aad1e82d3253516571256aaa2f80da18eb77b9771f29f40ec63bf2b71a867739a20cc9d16c311212982806f016abc517afef03814ad7664768682fb7f27d1da834bb8e0a29c8e8c1f9b837b4c0c81820914fd533bbf1d1d64a1627cad19a8ef667c780fff0809b1a9ebe471eb74199de987f77b5fae1fd62742e2016414791cc4416e4d949c1f2c48e237c57827c11f6cc6731308f0db294ec9963c6c9ecf0d2d19105bfbcf3b668d1cd1f87a9e3471335f04bcc03dfb814bc3d3800f2ef71af18202adad27eafad70a677d5b4dc05dbdc000cb0dcbdd689ec04e6ec42b9dd0b21ac9a5212caa53c7295ce6a2cd111f6c880bd05a511d69b82d5b7b443b2fb90f21b9e4e053f60bcdf816a6e9929340d0159a6f2e3427ef38897f17d7d4295e495577ef63146a7d6bf549408814c36c890710fa020b897390534dd7277d271af12468273204544321bf594606ea2dfce7cb24036e3dbe8150293c3b8b9c8599a6fd2f2ed5aa6fd77fa4cb29fe793f7c8cd0380ddb5133b2d869ceb7acb8e124cb6e2158b65cf9b4d654136ed7587455d8c4b19bd1dc8562c99379cde368a676eef5d3476cb2ae65e63bc67719ee69236c07451fda36202b8434c200c81261fa8202d97d6141da54ffca58f54ed18a6fa716571c6cf4907798dc3bd2d34c901a1533986d2c612a2cb38e4f4bde7854952a706c03f2ae52d197e84bc69d7dad7028f6949926b70a3782061ded5169543e66b3f88913b9f3c3d1f7865e7f3c36772dda5273f8a9f71febb0597c401b15b5dc4f80fe38addfb8f7685ffd00feb7a9a44d56a01ac07d40612b666b1303f5b60bb199f5ea00833b78e94d44bb4bad722cce158ff581093382b5d92c42ca90996578a7e290489ac5d6c8e2a81699848b17db13a621622783b10e364277c552da8a033f46e3ec62e281a594a9ab6ed93ef602e57516ea549b8c92e24ffa8ad913d9efd4b52d72981c09fdf7cbd232181867c3ef9f5e901cf565c281a773917fcfe5acec9ff56196cce03060712399cda1bd9ca66760e9ed2bed3b88db4b6fd3592db90b89d43feb9fa4eb835c27fc7665980bbe7fb66e41a9735c5c7e1a7c605a329295e53273f2eeb89dc4cf57e08ece578f7c4ac783c6e8a8b390e2494da34d64d83044a8946944abc5a95d2bcc8366ac96845b2cc0c973fdcfbaba506a18ad54e84f1aaf17ab2beed1a5882c3700a8e7cf5b235eabd5e5d30f3e68d8583cf4834166f9ae74352f02603dd2d1b6631f99885525c5bb8898d9009060497e8cad60820c442f4093a876eff6bf94a14735425026e50a664e07602255531c6384428d18939cb9f34332ccef64b11dae097472c534e3953282dc1912f193d99db05e6973b165d712c05874ccec69b53346779b3603a3eea6e3615420f9b509839d5b7621da31ff15a783ff37022c03b77a993c5117a87f49dc41b1fad23904cba7c433b17283aa72454fdc8c4a7a71c11263c674e553df91c9f7a2ff1f8283cc7c1332911ecd61bf36068d5b29f797d6aa61da3ff15887f558fdb7ac4643ef1c66d2f35f33819d63065292123505de7eaf1de800c008f10af5ce6090cadfbf12148de66a5542e5f412be7b4fd037ce1f9ce26075d5f7b3392cd42e3b31c86c63e1ae9c410883b3e907a4b972a01fdf3ff069d3eda79737166ac98109ff908f787abf7571a1c69fc831afdd1908f09a56461ec2f6c98a05094bf8f99ba8ca80d62c3b128ac57df2084d2a46a19f8c88090a7bbe2f9022a5a82cfd085ea1c8f8f3929bf3eaf82c632fa6ce86bac82610beba0b15d6a00381799a302dc19f3e40573a6c8a109e545ba4dae73db3077fdcede1477aaa8daf20e4105cea72e57d0f87802745aa4c88541e461eac28f1dc352cfcab5d19ad881c7e3bbdced11917befb0056d706673ad4e294df828b0bddc1e278b12d827420dcae58ed3b6aae90c72837658eb392de66a833943167b9e6fbb4f1f36c9395fbda0b1465c0ae1a6ab09591fe0d40440581c5aee7393d80aa5afad4ecaabb778bad0adab1ef29e12823d9ac6ab32aff22aec173531a8af47a684abe0768788d52ce24384c275c973b695ae34610d218c856220d4255ce89e99c1b09ce16496be3a5eda9bef9c4a12729afd31ab6d44559007de93f6b76b57a6ef234bb44ac87b0ccdd9b64e6e0937dcd2f085315bff977462b93c4cc120baf7956eb596420653cbb7aa9e86f3ee2a1cc7edf79ade3a9858fc1a95d183f00fb13bf8a2305238909fa2b41b4033e2325b015d508effdda2655b67682b04c19dff6a29da2a854678af185ff52437cb98c107a958b7c5d1fbc2090a7b024c7dad07a869242be0195424a013f3d90693a5756037d7ba38fceb998e6996ff640a87f180204adb6d976b25c338de08a8209ea0977195426047bc0f70ee83c9535273e677b612e333a907db07367e58265cce6931be59f5469ab44e39ff0909213bb90e179345eb3a386e6ef7769b72872d7cf9b885ed7bf1de1d7e7006ef67d7afa090e720ab9a8b2ae905185efdfdd37def77b430177d69f93dc69e6afe8a7c9571946fc30b992d69c0c8f4576ba21233700cab26a0a3b7d55d4f4a93fe1b18d4754438e52e8f28db3be012caaf094d3747e027cf5094e259c441fce9b7c1b456f1c6c9efdd25856aa275fa1d8fd98c71bc1aaf93eef9f26cbcc33dd4f02556023042aa47de034bfd3cae35bad4bbd5c917e3ccda4479f0f88bfd93bc73ef09c079e16457f9d0827b52b44a07465632279f62040c18bde3e47a18890906c6d27813ca7e86f83532ce2cafc16eac53aa739dc0e291336cd318d13ca4237252bb124727803ba1d964dd12c62355cf5945955924ebd15d2fc87bd8906e727e3ccb775d1df3e0be6520904c21f62678110c751bb7a9355daecbf7d73d6e5ff42c0a8d9dd65edc15806ccf21e9c5486d2206fb2ba0a323fd90e373156a2c509ac9813d4e7a49976fd35282db46152377363c10d0086104037e19d8db4031ae3abc3770ba303c799305d991c05f701f5df2b49a54176c41381f740c71e704e29aac340c2721c0ea4bbf09e4195d5da4e9007882fdf44b40641cfcf81f862d52834281fade755c525da9eb642d67651ae10890b114c8866b4f1cb9842d463568bc26252327539919926a86f746a60ee90eb1020ee0baa629c0c8b499e24ea38b0fff286e49e3fea7b2abe386aa42e37938a4d880abf332e181c8f41d87c7ff22427693c28e4f1364851308faa262693326891af1bb9bb2fd58c381fa64d8d2971e326d093cbc60b9d24bff39762e2a7da207ce485ad9aee40e616416c1aaa2516bdcbe2a9c546e0c63fad02d6ecfadc072c6fe6dced5affe6b4ba45be664fab8f11b8f0df63fc4c6fec981bcd26d7a655f6fb1475fb83cb3362949af1a2f5f347798e79a92a5ea506c601cd0e92f1ad231aaf0c057aade6b39a25cfca7335b2dc7faceb9b7ad69107566a850fc3e1471b01ec2bffcd21c8e3a5fe329d397750ba7ea4c52af7fc870e0842e2453c2f0a9a4742f2d98597e840208e91ee7843636e0106a4dc0448fd77761b53436e237e1d4533ff071668cb5594473c32a2124173a132f92332447ad00a64568edc670830964fbf1cf22cf8a06bb8b00e697c9147c9ca4095046775944fae6a8bf9723f60b4f6a18fcb5ce69d31638bd610dad967052cf9b5ed3a7450b06a1dcf67dd8a2a2bb944e3f4611bb86fd83e2e5ac5606dcdeba2ea7f25fd81d717decd89f18ef96508279dffd21e9e8177257b89b4eca89e76dab71cc287a41e483c0ae266a45aeb73b8225038559c10d100422031d4c3f16eefb058989934107ba40bf39570cb398c7525980c575d98662d16d0c49f2c5134704ab500b8be3812a55550166ac6e9a2fd0c39b6aa4f72b72a7dfdd5c26e58580b0aa4934cbf0fbdbe5b6a61f8da4667ae3aa7dfb4de5a4476cc29fde4f65149fe64c9d8fb92f1cd6d92b4f0a1720a4b075584e00da6998e90a5c7955d40e69ae8ed774a1be6a8d221afc24b0b3a9fbda6d133502b24cb06167f6944b1fa82cb48f94f5f44367f5c78f714e98c70613ffb2245a883d5593b66dd7184797fb05bad3cb490faeeffdce1fd2f54abd0095272ed3e61ae34ee9f002492cd2a4ce9ac741c4977a68ca4d3eb466404ffb5f295ac86701400cfd5c181092f873aeeb96e3c1c608bedac08c1f3576582eebeb76a1682ad283202c92347efba5b21d189f163b1ac4626b996279894a656ff36b2503f662826a87a1334f34cc5b175a1e5d699709f2ee821c79559a2a8e9b7da9dd895b58387ea925e86e1a4d412bcbc57ae3bdd9bbea891376ba4f5efb39f06b473a7d541d45ef7f599b18c68075d9d49b8d96d246dfe74404b1902dd5d1b47a0b1e459d5949bf792ddd167e3f7dec156a6d083ebc550477c94145e144eb319ed03d9b7d131282d90c3dfcbea7cc6d4e8f8efc6344d248766d7256c06f10cf9e3ea0683a7426a168a0c1b2cee0e9c248b2f55b8b07e01b08994cac137fc7f644fe4e921da30f82ee8e7320f6115c55cb7aac0bfc2c06e5f4f5d82d219b990e56b84f036ec8558f33815b2f7e63ae8d9f8fbaf6fedccd0e03281dc234ec0d7f9d13aca1750d7e2ffe1f80c5adfd66d18b9a2702db3fbbfefddb2354929aabb1e1b86c567a9814c91810eacbcc070c8b5843fb19d97c5a1daab5f3c984ccfb0cea4f9709c4919fc74afda12a23ab2922ce313f2242bc32d4d15f940b52aa86f97f7f36a29c21a5905a8eaec8fa0f44feb50dfb055c26c9893c800e00445dd3de6af04f084a70b08c106a188f995be587d57e35aa70e3a9a5b1c16a92a20d6a24714bed2516a54723363ae76647b89425f62df7f9c51a5a91f9caafa8b3e1d4345d3815e047e8f3bd92a523344e4eda40dfc148daa5f462b4dc42e529c0029874f55ed12127633ac2ee54d5e3f4443e4059e3313556994b7521d115ff11983e4e036628d0fc3ba79a10ee055a82c2498d2c3bb8f221309d3e92204611eeca4f294df723d60f9bbfadc01cb9813ff2818f2070e8f94ee1de76f5d780479fc0526d9dbac819a8a90c64c886fb4075fa70aefc2bc63225d69884139ecb896ba3cf81b95721820f8d1525efd3d27f6a029e538a135c85ee3452d2b41b30bf9c9b4ecf697536f98b706259fcac4726683392e490d1b1dbf02695c79ff9b6d178cf58be77bc0d67657a7c69b8b8601db5b4d4cbd70ccd1a74d2e8cb9ede66a7486874b6a9d6b0b2e6d2eabbeba0274c99aeec6e276db92cc260d3467773462a538d2b1fc96827c453a134b95c0ba49c5e496337489c7cf722f9dea0f35f6140e36704629d1d7883f70ee3cad5a2def34aacbf8d01401e65dcc59242da4abcd23e1e87e5ee9aadd919427e551c0ddd3ba7008bd71b01a85d37eb7692f4de61c9add93c11838acead00648dc4fbf3a95abb6c4c7f5f8921c67c9313f909c0570b78c0ac4e2693e1e6f59d987e37fc4b3acf198cec927d918af4e7efe0e09ba682e7fc5e059d5df06e401528eb9bd1cac12a2fd2867f880090e40c94ad4215571442b5da9cb191022c29f3c473ee1a2ed916d5a7b5ed5077c0972d8acaf7d670abd012a97d2ad72008f860f57ef77e7f69d93392e1a37dfd025470579dc787fc2eda3c520ed0d651eaf48342747fa6c658bc721b726ab89b3e62fd85907ad00085a85b5db96b379dba668533bd4e3a0b9007bacad00aa9585c0afd9c09d7588698829653e5c2a10c60968d50c12ce154f8023228634bf73c4494982272a7c8954fb015bbf99ebda7c5ccc422e9e143ab78f503bc94f54a4fdf48f5a132b2c7369279011d5fc73375cf5051309b340917f827540ec9cf4c9a136d3da0b1c0fe70492782017e05aa7e67695d0240efdba160e14ea76ba2a324c94d97a85799154b5c00bff0be20cbcb7661102141d8604f986b190ee336f7f5ea2e2c408c04b3cfb34de17287df3d63e27e911404b8412b890ddccb9853f1165c5924f0b8cb800536550f0d410ba84f95090963f356263d190fc067f1c1388e0916a64043b426f4ce62724b546cb69575499f97757cb58c31b8ec6958477565d7addab995884aa461ba32b329ca0d3f6c887c37f1f09920ba51885934af50a4b065e9e2160e971ed8a676cd26ed5554610cc7cbd17b78019a22bec0ecbf70527b87fb432f10b2691c6e6622b49d37dd3b1fa9dc7ce5fb38bb73b425ea407e77205b37654654468d145a2b393ca15ae1e4074af15af6c9cb038c921095f9211c8629c6cfc5a4f993a7b2ed9a24c26868430cd192d3768bc55cb4810955b402479739d00912c67382bfbdd3ced5c8067b407867474f2ce82bad35a9999237c9033ad27c9c97825d6243c4065cb87bde20c391339936e18907de553147b44b1d55573ef20fbaa25f3c1a0faecc34a29861b4a15e0ff05d1560d65d419c23b8a647d7c35beae5ec20172ee6f1a7b007dc46fbee0f32e568353f7f95031f48460de0a0aadfb67f2a49fb6691fa74967050d681c16f887eca91abc0449d5889bdfa289b3ba5faf02281f0aa57efbb4da69f192c61a69b214ad0ac81b337cf4fe41428b0bdd63e9f9d71ffe282f9053d716f17e518dbf337b29a4aaa2bfa0d038404e7c87a990bf662c12ff6583fd8ce9869d9952c361629c8998e24f20d990b65716dc9b817e75c3b1889cf22eabf68e5346622e6e08e5d55727fd55099fbd14f04c39dc0775d39ee1e135327213f731e78c6768e01e33d20d026a68fc6bcbb0a65f02adae2f2f6447cd76bb10de2570cdf02776cc09b30f359897ff6bb63335d3bfc5a4d8030f905dadd0006d52f7c770f210fc746409d94b5b249cca178a0122ff01363789eabf9df2bf86fa3ae4b27b02b25e9bb59eecc8da9ea5a9f836aefe8d33f62f3c474e734cb3d349ce82ae36b29a018466f8a6389744ce8de0df8bd0fadc593182bbd9981c5b59dea648274e8226a9d0f09d921501d55bd869db4434b878d3e105aecd56d1f4af2b5aabca3ce1e6ac03faf43ce8bacef23bebc054b45687fab02d96b64a0e3e37a24433e36c52588c8feea3031e1270160aef1539ba45883211731a00ec319677e60b672f57740acff73400813fb9873bd7fc407fd115f81ea77e9f59a7ec7c046918bbfaa8976beabc73b333c80062d8259bd87363486614c4989d0d278f7d51add4b8c1ba6d0a61521631974197a16f763653c11b4d40b90b69a9b7c5ab08e426f7d431174544c85aa3f23836efb1864c6438e553a5267fde5a3bd61cbfbd3056da94b549b0c99428a57b73026911a10a9e0e6c96d065eddfe2c9e4974df8cad00580cacc4007396e8333f44ea44054435c2aa37f6fad6762bbda6fcfc64a1804f10eee19737c4c7ec5c2188611dbf48927344657c36b81292df3d410d92fac7835c59babbb9721ec059c7c134233164e77b1a1ba8c0edf75b19cbe14c7280c9c3c1b501d98e66e389b297ba0a5f43e05c60962322a25c6daff4b8a5630b19d038c96a7c98bf895e72f0fb3a8cd7de031bac1e4491e4ecbeb6f76c52fa65ae2209fbe0f4a152c2d7a09a5a086295e81649e61c459d8c873097aa50b3b88928085fdf7f309b52f8953e381bed33a14b611197f7efefa4140d7b95ca8f467e6dca62feb0fa2fc415e17252a8b1a701ed2c9946170a2f337a9b894143ad4b4c67b039dfd91805b200036471681c67bfb8bf097be45e0542a323ea3524d670fcfc020d0b6453c423a1433e1cc3f51be392618abfc6b217d876ecc5f9d3d25d9516070508b7731420e0e825dc21066b73655c4498 +0x9f0c0f9cc172a2780b8f378a51155eb7ecebd238579767af5cb643b5903e5ab7dce0202de501f061d467e4a8485e1ff211f9277bade2d389c9577d5495930f24 +90520 +0xafa4a2c4fbaffe838dd149c78ea7851ea9396304b41806a093a90aae59c0c5bdb170cc9a7d22b90cbce52cc1b105108942df20c29ef3a913223b915e7ebc98ef135adefaa0f0a6441ea05920e868ce9d1ff6c8fe4dbec06a4849e5e55ad0627f9e09dfcbad414a937aabd7ca7bf845c20a2764a00a9fd40ccd7b0f2d3525a9d41a26d7f7ec3c2f629aadaea9b2dcff61c91afa8f1dbe6c617978161c59e2f8564f58cf65a50adc17444fe7a4d43d84e0257695b5ce4410d114e9029c0d30d46d0548cdfd20d2d91c413989a22b425aa9e6e43af9655948c46575dc949837c781039edca7a4bdafd759129c8dfd140b22d40bf34329249da235c5abeb431e58fa1201014b7bf3e5b25383294c93da1fb5b694c77b63ce96d34c80778b560e1040fa1946d1eb9b0313f93336c735bd1cc95626bf8a5b7ebcbf724f485b192e75bb838fb2213dde916411cbcee62be58cc57a6ae156595d95cf6fda2743d3a711d4740b4d24b9e3180c64f2f691bc79f613eb0737c8a593ab690ac81b2bcea06cf1973420c0a6d32073ba51b8b031a1e31a71a6c9c8864786f70cc22dfb50420c7cb2b332de4ed52f01db8f1b2bd287da42d3ef9d3f46a2acdf3e6f649ba2b47bdb8e2f8c67f712cf1e8e5527eae75063f3db89bd132bcba78b6578c8f40c1f4178f3513441eab187329c4be5d5b82706954f1d312e7eeaff614c8461ecd5abe4b9a9c134566fdbdfa5ce185cd58d324c90f852ff7686293acbba3c386c477fee087726948ccdb860dfea6595d0ad99bc4d9ed131d58daee22f7647545da8c4e7cc26295acd4e6f9149b8d996af6185df320942cf32d9a17ef7494fbda541a1556c7e7190003829fb49021d695bf11e3ba8004bdf74b32b978afbf97c2e5a3fc25247a73d0dd40d24488ed816bba58b5a184d976b856374b45054ef98de3bc6b5e549726adb6a4496af25b3a3b6c4f5c4e8b6cc7a4c31a35db11cd9199f2b5db78d4c7b1e5442f5d9e48f561a369883ff82049315b165e01b151a5e0858742c4fb21769615fa349735194688222675e954cff93439c465574e417276cf15c5c05bc73e53be4d768ee5cfc92e4617aad0eb06e750cf51d27f286dbdc4d512c1561142897b5cc2479d26f8e7b47dd1999f0141ae078a432811d642e24b3622b7eec20fe26d6fdd3a4a5f113cbb37d8c4ac5e2cc7d9092cd897ce4d8a7a70ba3c02d49bd3ba7602b13f14a542c31291ae714814af45ba53667976fa00e3034da02acf72c7d2edd76eb3de11644c7c90c9866595cece1c6b444f66e4f0157c5196df2931495755dfa57122024bb8046aa8742d2cc0d2bde91482247ad2723a7a82986833d2a84c6017df76e453a61863cd93054610040d3139aa26482299cc0cf5df0316fe56102d1857433406974720ab9b847e26d298f8363fe2b96aecaf9d632b903726e16f7b29811d8deefc0f25c4d631318fbecf829cabf06b15fb63b04cf68630d6cab8feede57c3e7754def79bdb820cb5393f84cf86c5c9ae4676ca35c85b80a8726b0cc7ecd5d23a2244faa3240d7c21d257635148d941ae4e575f903996a2f68914493a0fc0e591f4cfc37d4819ec700ab592d47aa18f908393f4fea2be145b7f3328c6e6a3f5393cddc68ca05dea0a42c8b7ab94c4ffff76ab1ec39c384131b5562ff0da156d7a7b0d9843d540016b2b0f36491faa1f35980b21a19e9bd633dbebc33a829bdae03fcdad554f46af1d2407935f83d769fd8842c1fb226f4fbc53628726588daa04eb9c6a1386f86f9abe20533159c36c91a7d06442b018fa45ac68e026c48177430ef8731104dbbf6e6a07fa8119f493ac77328d1ac03f726a474d62ce6f0dbf453a704cd051470af2a82cfda13ce18ba886e7a0e5fb294494d4ae838fb098de65ce925bd3f4e0fed208fde1244b209110577e3426a99ced5fa50ac6ed21a9713f6bbd248e582ff7870cf9297cbd28506e5954eb7f53d0e91558d0b1694ab6043c727f3b71f39a818c14ad4b3d1b6f562d0d1a0b32928ba460609eb776845503d7734705217fa7295bb098dac7ee7bfed7032c27f2de13cbcb5cc36da776fcfcbafea3161f24dc5b60713a3cbf9ec4d6f6ac09c632af0fabb09dfd287e9b145b317521f2cdbba09444d7000586b4d05b0698316a648de5e0baa49a9c6e5931abe567320fbf8caa60834298a9bfb93517713841992ae31ce734112a1df939eb6b415561d15710404c765452bdbd245988e10ca8b6d8574b4bd7643a4191c59825dfb01ffc36ff18b4c88ccca6217eb41bb095d5680f42c77aff0e299bea84ce481b17eac4d1a17a45e44c74e76f30eb6c7a646601324e37f1258fa67145e0045e7ded50efb9900b5c4413da1608e355e7a8e8c936e3d2034ad5590f86467fc0e582b0c0c14153428472836aa680fe8a19b6a37d5d8666cfe4a90ae33f5ebc8a59c3f2d8de2b53963afa1ba51d59fafe7f4e150109bc74e45afb05b001111ed747bc43f7baba299d0c453d27ef16513984b9cdd2bfd894e71a55ea047fe01f2e1bd5f4bbdb803dcd54de78519028a9b1c6942e90e47d4f4eaf44284f005e45f5629ba583b510188dc1404dc0a5135d0dc167c79a1c0cfc91864030fe46ee2bd3a887d6eddbec4274cdf53dd39268f383e19f297ccb2a35464bd4a4909812293f5a250958b4673408d777c928fc9c05dab3c4b4a7763771d34c6be3b4886cd69ef3fd9d62d32365c07a42603f281efc78c45309b8a1c74adf14808ec8ac40ac88f27c338abca3702222df9374b9744fc47fd4890ed25c28b040ccf64b58402363f21b4c4ed569bba46dc9f368353e886462c3c3488c6883fd3d7bcacb20edc3d67f75481db1e8d0ddb77bd0880fd03edef9ab38c4347ef52c87477cb6aaac1656d6f4d775e6a338149c7feb62cddbcb7ac0e56a207ef1e4b4aa9a7c9c4a0d935ba5244ae5c81b5a0f89407466e3b3c6ee452cd7dba083db2c040f4afa7374b35b667e42fbeac3cf250a683c32d5eab99fe2cbf2546d8761094ff0884fdb840edc978d2016d33f0febac41832538f30c16465d4a391a8efec2daf8850ad6bdfe65c4bb92c505ef84c9cb86e9dc716f36d7dc5b5fe85bfd0cef3181f1b9f9851a7d5aa3fb94e747c645f482e0b713b1d25b1130a3e0967423e4e0173eebb87bdb89e5b0caf51bfa6cf6c3d00853946d67268197a6c04e66dc5a6332cd0e9804ca21d26c91640859c142a5e8b12077e45da0a9dae8e608578ea6377f3ca11ca26ecbcd51ef6020f86bb007578bac32c93e7ff684eaf048c8b36ed9370e31bae721ee22eb25881a58d4c58486e855598e721b04201d4d843d030ad4f4a23ef7459c1f6fb2e43a48fd95099a1167ca50a6a0f83f26f07c4f16c60097529927564025c620239c05314914f2a4618a69cca4439e142414fb0e08a4e6acbb73996c595778d0c7cd6767dddcf75ff1b0c201f9c2733f81fb584565083391b991f38e13c9adfe09f8df612e65ae196c7b41a539a62dfddb03f289ce686dc2b7a4c44fe1d4ec04849edb91bd477d6d1c6a873ac68714fb99df784fa75dfbdc300c9a365601a980a22ffa8e0cfafbc7abdf011732bdce9548de581b7251742add39d3b5e2e87cfefd3caaba9fe88fc575792deef0e2c17752910051d1db5d5b09cd0f630af1ccdbf0456abbd898cfc313a98c16a36e840e61980f9728641dd93036bbb250a61fb425cac8e65994325cf0e09a12ace98cb6d043d46ff8743c21faf75718368debf3f84d33ee95634dffb7cee6878fcc422d39350d20c4944eb1c49f60293f01c828024d3a191e7e7937b2b4efd9ce8f5acdf6dc087e1f4ccc25278f7559dcba2adcbe3b5a1a474e4a718c53148debcb2d15b3a954cc5af61ae88e57e52e920f8a6e96980256c27b4859aefa031869d84f90da4d70802a28d17883896e1be18a7d7a25f3c142f26de93c953a1a0dbb5f28cbf518fa5def6d765181844ea66db36a6bd6df2583699ea3b6d993f7d262c84f237e9c50aa2d3c701012d925527902d7d043aa9d8c9a960e44d697fb0af2ac2943e157f1f9560e6510a20870a4a5f15c33d6f697c307dc9f532696b21bed635d89b7dc7cc01c6bbbefd992bf2167174e031b33a2cb23fadd8e4440ab99b58642718c8a4f92c2ccfb1a13f87f3d5eed53ca8af25d0981492f42ba0645e8ed9d7ea7b9e1f8e5fbba890bdbba2f6cdfebd3f6a0b31502b2602b1cf2682f9de8117878da93e73e29bd0c41ab485e448c7b6513e6e6794b09d8477977d6b73d477ab68168e0b91fdf3cfb680d336a38c7447daed80cd8572a1a1ae4c4d27b2b8e41bf3def88ecef8eb2bcdb6c0bf1de12bf94240ea6e09b858dfbeb640bfa0d2eff092ac8dce131aad6e7086222738911452f1fc544f09c9edc9109dfc3a2469c1b1ac49f5d349ad5e1f09b6a277dee359dc4fec657a6eee86e40ac929a025c681e6a87ed9a556f729c7ff0fe7b6f61e1f1fc5d7c6f61e6f4cba150270fa8d325818f011e14d244134edba599aec688b91a2b9841fcb039466d29a0f794f43f36eceebcab4d299d2a719a25c62221c72d4ed94bc170204a5fcb4ffb9eba72f51ea900173fb3c9ff4abd41fdfe85ff91b1388bf4756a108e938e9aec86e0a3996f4e69ad25d931ded68a499acd3abe9cd74fca0ed85b3f9a940f80d04ac814908b6591eb183e0fa0605147889cc0ed4d11fcfa1764c3dbe2d3c6986344a1347f15570f5d6142b2087aaa9243f7b91a0703d8c29a952493fbd55c57f22f3c91b97fcb48809b97a76b881ed0596873b36eff6b89f4f40de64a1b29262944da9ad43d1ab3d141ad7e4e0af67835599157e9971dd6d30bd0515207d5b965300bee53cfcdf7dbede4952495f9f0746582560b5d782fa1472c53a83dba58327b50daccca6d8b1ceaed9a839b71ef72f6d75c58a4f30aec30626bb13f6fa91d714a0e839f71c3f0d318dcef9df6bbdd97f0d9361026ef10422308015f6e1282dc47e83cc16359143106fadd1000ebf0c37f3b48218c42ba16eec71d403e3b0ef6eaf63cd2cab0d37f2872b084290678f3d310e35b8bac46091617797438791e6b93c728460041db380db31e8cc781c2c38cf8bc20ad9240a349778a5e15533da4e2c9638dbca287d6276a8b7c74e45a9d0d3127037a8b467fe975d4703d5ff93d487b933c484965e3f5d76be5a9b4ccfae478a8967b0da3e98680fc5d2905bd8f455c2bb44bbce1ebf9a8545aee598667a32dd53c177ff58a9127567750db072569f991983f63a858b33bb94eab79136db9df2176e878c7eda9e767514d4672aa16d2695a8bd415b4b3302f237969f067a8fb11c9668e776d313fc36d96ee6c67dc55176dc984b67a69f41a9bd0c2aa0ff1002ac5fa07a083b79eef3ea62970e94b102064610c072458160ffa3a09aca1128cd0df4b9acfebbd933f46f38e1cc8b38218b0fac0944d0e0463d12db574d58e0fa887b3be41ffa3ab58191792bc60d62964e5ef58ca5eec5ddaa3143c9f17e3f71651dac8c32a1a45be277acdfc5c03849975c72b25d47370c902962597d284e1bec01960b00571f0d5e4b5964914cc122ae30abe333843ebb3521c06dbb0014de655080c951c5b4b33e320822f25a060ada042888f14de2d2e242e36f71ae99a31731f32eec926a36cb564281b0920de764fd72075d492c3adfb455c568dae5534bcd76a29b674a7c4adf8ee9929be0a3944510ca402123d9749e9ed9682b01d4494b918d24ec5a6e06f575c2621e8724b2048a37617dd098e92844113949f41059d4cc5750c8a4f446be7e74e6c20854066169b88a03395f857cd1d7a2ddc6edc390b068e7a430f751653167e7306d19d88533b4815e681792bfcd926c8f7f55cea6c428b127045d701016032c0fbe5d6f9873930f3465a6561cbea95f06282fc33f900076fa2a10ebe8b6b17f08010714c1aebcfc2e36f61ab92e8643ebc963ea829d56fdc4aaf60a1498d7a6c340ff0f286e9910f3e5ee25bea490e0e568d88b9872930f2e8af915bc44df6ae7822da8f63a91132c7a75c154a92ffe9d0f78eea8982074e0d400530a432f931cd07927539b0ccc80fb7534a3c4cb64bac52a5bdb9563f48190f20d241c31e90c31cbd3661872049872d5c7d27dccdbe593d61959f3c656b9c4b98b32574b345dad0bf558392c831be67dc2095c9b2bc67f64714939b064327a3c155d7de73bb74c21d55086a011b260546d72ea9e1c0494bdabd3f089e491b963f3cc156cc7c317f5bb7788377605e7440f32ae3e7548d7c70f219fb89f818a166ca9a742a028156feff5c65979bb8335f27430e30039526be458cea75da8f33dc919bbd18e8f4e78b8f1c86fe47c3c0d5c5ef9f683800c9274a306bde6aeffc05346da8059a0cbf6609317df7df21bb5961890ddc7c40d220528cd62013cb3874f588bb9c80293d32d053a130dc32715e8cb7d0294ae5e05e00faefe78fa197b087757e4a45eaef5686cb9715b976915999f49cbb2e606214d812ef9118f3882c5c9c567b55b254658f31d633117e79ef3bb7ba2e8130d6093a6d7bc95a41885cd795dabc3a2ffac47bfed5055eaab963c489beeffdd7ca8fca530adcbe0c26d69ada71896da44117bfbb1a090b9bde7bd6d3217c0ee5ae3cea6c1357dec3d20e18e2c17f5acfd5c3dcdf2baaa2c2377be53c785f0ebaff852d313bd716f91887d43730eaac03175d55d36086beae7308721e29f5a7f83cfd052adab7012c78c85f404667bbde8448bd408f19b9c11f85f000bcfc550df50904b1768427de61340cb6888314c2ab0a75aeddd01e9a7b99018cb7df806ca63d9e7da5daf57f607f7ed26da941400a370166f34667ab35a6090a90fbc4a4df0f54d7df17f48004ff285c6c66bbe71052f31155f92f63cc318912eeed9c46fdf2aa7888b79fa0ad379b9d1b380f186bc2dd367c44d064bdcff42e082171b3818c11a849567121f7bd4b1ce09995646b1af22eecc5f52e78d5fcc4a333ef7b08301d0f8760f3b442f4a96452f7f94b9cc004931df8f8118be7e56f16a1502e00934f16c96391b83d72490be8ffa54e7f6676eb966a63ce657a6095f8d65e1cf90a0a4685daf5ae35babc6c290d13ed9152bba0cc76d2a5a401d0d1b06f63f85018f12753338a16da32461d89acef996129554b46ca9f47b612b89ad3b90c20b4547631a809b982797da888915b72e26d6ed6439bb254152a21aa59e96fb12684211bee0aca1e61b2014645c69558492487b14211ea8bae5ec308b747dfed8a4e2344b4e1f12335124191dd9ff70a4e14f868af6fcf9073e25b760ba5a63bcc80cfa34ec41b629cf8c32da883dd0351bd558ee3fbde1cf6537f54ff594f065dba8a99e427b546e9f41a7c3f28c3ce049c1376985c828ba6008337daf936e7ce59d8ab3d933b6aac92ac0029e557d4d71fb6c234f8796723982b8156fbfa4a8efd5e59b38d2a286532ec5bc14fe5b239e6a3e432561f29cf88cce3dbe805c92ff37027ee7c1e1a94737fd1cddf19e0bd5f8f7f18fbe06e3a30dbb1d233e5ce220ab28836f673bbdac2cb14780940eac208cde57160698ec44efc8df26616d3f5719a0d2572b77678bf42968855173af860e3a9a41a27162e2193da84f515751ae69b39427775f51eb79ada5758f94bb106754e599f859eb867362a32776e2c12c83a6f168b2b923d4a28526d7b53a79c47d745ea571182f37e57ef53539d637d950c410a1434e844f57f814332d2d90ac39e12ded7575d8fd57dbc90100fa5abeb6541a5a94e61d62804f97125e35a9d083e57bf96d398be0b1bf45143417d3e29e9d361b0c49961806d3d6fab01a6c3644c67052bf2cf2e9db7391f53ef5494ef1e88d6d133e9676cfc9fa768ba380e862cd337fd516b51fbd3fd62c845c6508957d47d7118ec586c47c2a0b579a8eeec742ed0816bf7c8b406a3c427014cf1a74a48be26e01cd4fcd338f437cc53d4e596dc576e9efee334a3eeabe69e42e8b75a58114935f53d9d33551a562ec36120295e44fb86db321c4010928d6962b647fc752f8e670022dbccb97b972d92142a904711eea02745d97fcc00921f06dac7c542613d0fc7f52723d89081253a5e436009568e776d9eda97738e8b1bb9d6b539224efbaca7550dbd35119ab216a0290d278b7169189dbe4ba984deebe62aaecca75130aa38a30e1d51474a60c19a3a1c24192e11a2d2f2f0c09c040c365702f4340072a4f66f96b8afda269dc5ad050171982afdb6cef71b7b3ca0f904dc50447ae548096b2b3603b312a5e59d490851b270ee99aef259401bdf2c3efc3b1531ce78176401666aa30db94ec4a30eb281494bef5205dd87f3350c1c4a56f3d040b12167214391b30b121697a7915e9224b871a3c355f111a9493be7b7df870ff5c589bdedbc4dada062b3072ac2c93590829ab26a09dd74d6eaf714e3e07532c57e099215d5ea9907622713bac1df0b693a1f81c2bbe320007cb62a6af43ec7344d398a362b0923a4a2eb53d418f0821331889849c6b2a1ba9101aec9a5545bd6a581eccb2629cc0cb7682e0322ae48331b6e7c7bc4bc8869aa62086c5e466f01298b504141bcf0a3e23638c49978bc2d5a2994e5307132a22b4fcdef89955f684bae4b352833401ee5cdda94c7e05c867052780294614ed8b62375afd1c1cb508e734413243d28b224a7a9f04865b7b2f061ac405b1d1b81bda58649b14c317e6472b167d03b2912115c1d6395894c575cef984b1ef54741c41e763992950036501539afa6adafc34e43ab7b39cb88d80844c27f3a9a507d4c26cbfc004cd60ce3e3436732154b2a3df6ea839f9d0bb99519c159487ca5b8c8270dfd84d411869255450aed0289db630e4129517e336085d6fb55c30cd568bac7b2da9abb5127edf3d52751e5ca4b5fc245e8d9ff9e815cf5071124db5e21b661310fac73036559377a28eb3faaee76eb7f2ea391ab808d0c4b080858be682d8c2f09449ba6c366a88aac13809a595ab2438738c4f8e288755db6c815649092c0f3640d85b9c688cfad0d855927007def396f2419f52be1d8a589fe91ef5f8878248c41c1cae3420557e99b19cf7852dad762dff13ec12b9eb90e164ecd19713a48fe8bf048ae24e1f1bcef52f2257c0d93fee6fb2456c8401ebf99ac7c52df8fc7376661c19ba40e20f3dc853d9c4c0ff59fb39844314a653d2b134b7b9045e135d34bb6b41031b25c1afd311041555a82c1c0491cf51466aabcfdac495626c6fb3ec66f9eb070a719bebbe708b93a65b201b78e2d26d8cccdf1c33f741904a9ade640fce000c334d04bb30795683dca09dbf3e7e32aea103d760e857a6d6211c47655df3665bbe4164e5d1334d301eff0bcffe6dd95dad97fa63a0ecaa7b197b55b6f86f073cd4d524324aa659e19501d2145fb8adc1d70eafec04bf36c959416f21894ac9f69d92aa6a43da60dd692d5a560a66982448f260c5bcd733060af5ff6cb88c96d340ff5f5563d84b6dc10b0b5ca77f81cc28ca74b46f3d877b53206c602c3e5519e5a5abba53a703d9c5244ef0dd0c4f029e1f5382c5f71c705d491ec58e68ee11b60af763bb4f6f699fff89d85413ec0ed27865f7680fd82d4ff87d6385104803d8b8a91641d97665742526ddb59f3f38ed5d11dafd8ca5f952b6f101ba404d3776372b9c904c02146f1c8bc7a8b530c81756c2f52f776a1e8e09e269d4ffe4f4b60de3bd4eb0fabfb56e225ed45fa70577ecdd0ea3d70fe22a7cb8617c56f584c0c43b40240d45ae71a2516ae2a48c3936a6cbee04b47b8e4f94dbb25a4b692dbde499efb96ccd29c94182b2798dc7aa7b0df45df817986924dbb32415e92638d5f36790b6d47978e5d21cff422041a06fa7c02227074dbdd2d8a97e563515ed2f7b0cecc24e31e2eedd8719e567e0653aff98073b8c82d08013238ac4391e93f403f0cb86e1ddb00ceb2ac8096a8d40039ae2d2d9ae1fec57158a0e08fc2a734b147bf5a995662b66836fd456303178f202074cab760d577f6547d3c9861fd65d351531d472b298252dbd0476c1b25631be703d59eb32591f8bc0a1b0e0e70252ee2648af81aa4270717d210e25fa22e556846d8b15773c5f105f3f6511684051c71603e1c9367070d815f3c964ef243952aaa3e8fdc446687b8b778f218cd782494d2813523f694de9ee424c877ba3533b4ca918aa02c16254ab0fd61939110efb347fec25ab762e2d70d6429685e95b99d145c42417f3752429d0e40059341d6531d2154964df3b2a03775197f43c7af2a1409474ed25c7716c825eded389d610ade735c650ec9e6a10ec2194b2e5d7d024612fa16b9e83c6dcedefbb8f5862831187f5a559e57c75fdfe5b94a62b9cbac2723eb378a8cfa8e1d83da075e9e946c37afded661100d13475a7a0b858ee39e33968b3fe89d3a1e30df0946d8392e22d88f4a65eb94f081b19acbfd0b3f7d4ef8056a8e48ab9384a52b1a05f6f85deb57983d92b2594a21cb113f9d683df134e0daf9a12f3a6f67e7028cb33f6ebc2c514518db49df5259e078356b211ce7e68a81c926f0cc461e72ffc1dd15eec17c42207cae1699a1b09e1a5df4da5eb9ea51b4596e51c3b03ee56d59e21efaf641a6b4c989ad0ac0bc408219b8d865efa6e2dd1b15b6d3364f9af5d570cf35d312eb7c900c71b537e39449e935bfe501a29a569e8ba45d30a7200394f78b01d076ace25095093b6fbcf5cc4cda053e987404cb445e8ed437fbf12148e4f6f186c357809bc1d7dfe0aee1a3d5342ce50c819ea5bcfceadac4b4aad941d777875ebf77c1d1f17245233fe44ae2d2bb7ae651e47058e54cc36f479986103da135d0919a3083d24cfdbff67a3c26141562ae7b52a5b8b63940804b69d24485e88f85001b5731b2dc5c1f592ff1ff96ef2edd5485c04cde14b4b03688285f5ed1e6d47187a05c31b4f2b9ee5206dfc98d51eb73ea6a95cb83a2677f6102b116e1fe576c6b9673cd4b54180c9cd5573a945e616ffcef241cea9c2eaca0fbfa4c8d18766743c408e423f2d25a7d07e65888b6d78f39c86830de046e34b47e8b7e57d7c9e88c939c24c351415e5ef92da1defda6882da0e2a5b26dbebe1804f50ac6aeba66c29faded9de21d6edf336db50b8556b144e313fa2c5a989f4819c7a05e2fd0786242aedd38379f225a3146e0930080b11c198c9c903d745ec13763ad82bda48408171f4216c47f1f7c9d49e309d19cfe1fcebd0b8298ea732fe859a0d8ea9f1010a79fdabe1b159ca2b1e70ad48b03fecc4d15d577ef5382c0a72a18d53938b3085e70f592adfb4059398ee6879f6e49ae4f2768e4c357f43fee5573ec2bf9d37bb6633138efa8912c7ed1f4a7812455422f72645d97504dfa485c5092355af7d749c70c1562a61588fc30b398c2deb80488872646fde5069c2fbf2d6bd7f496a7731ce4bcb96c33fb5c3bb1efe6f5c881c4c64d35498ea4721eee78ed963f4668ece55993267372fff9436e216ff22d267ec037ad0ca5ae38907aa17bf2937d97f1b0e93d6c4459037de846b1c06c5c8f00f57412d9c29a4c2ee455bb7fa9b2b13bf0022fed676ca234baea358abcbd0815e6911b137def1934abf4109fea7c41263332cf1c551458c81bb711217be54e08140d0a6c30134c5c421b0fc5ce30d44aeb09af8b85f6a3928b3bc917125bbd61fe46852671bd420037292d93dd76c71497e555bd7269ff4e99f6e1ee2896d2be05ebffe4cb3396cb0bacee8c80c4a60dba544624b304d836c866e019271d2a76eb5bff19a51cb7172024c71260910da0d2e4e553c05ddaf5870a482a86552126ef14f75787df2f7f251f4bc7e5624a787205d7bd12bb5405565f8e94ded55338b1b56d00ec016c5d7afae11f97cf08ff083581d332c3ffe0d6e527da89243d36b3abe4b85a19fa4ca2462b7bf02da5af06026838a90e2b125929a87e2db84bab6566e2e05a9f55c73b9f8f7f7704ccf31beb1f5fddd052048dab84f225180b015784ec1b55e80b579755819c94fadb758a5e0bbb49d12141c4c941d917a9f7d2fa6464cbe4aa87785616a655e2565da101d9b1cd857705549f3173957e14ae8aeea3e1648f5d6693e831722de7ddc00ff2fca61919487ab78d427ea9b0be7bb374c1e687ae670544de5459a71dc79f1cde256d306dbbfde51f9ad7a8582e0bc75d3ce8a7ca5e000598fdd133dcca674233f25b760b480b57b69922f3ecd9bb40d8736c477ba8c350b87c8d66dd4cb53a94c2058c6a732f99f2cbc52ee74826aaa703f5e93aedebb0bd7ec2b277d4e5406132ffd613d3d72644b152abcfffba8f297cf9ff7073c5900873359934d9840e29c3bed59fd09e873cd8401d1f770348d03cfd0cc5010d9929d84aadbce11dee7ed2a71d570fe2373baf01d55e448d724bc2839390ec1016a23c664248821f8bb10e6d1fd1c85ea0d1a43c76f4ceb595fcbc02267cbb79a3020e3d099023154060d5555fa8b0407e9f6644747b9c182e53781d37d0e5a6b8c9dc2365fc4a7bc71ea6145f445e540ae553be506b2321a5f085293a460123e24a14bdea156edf5a3b1f1e812d08e5e0440b0e9d4c0a6e874471aac044847d9a334660f854169ca456aec877db6692995beab9ad86985b5cdfbc364c44e6105af5efb13330c8502ff1b3c6a5d7fdc6806d714423b383749112c34040dfac88af028f230d43fa86478cec8d9d9b151e50293d32724b2246ce9e255d306d5e430109933af906239ba598a781c19d62f662ffbd091bc61b4e6fd260e1bd8661ebfb4baa7d88efea2ca4958347a4675deb43516f4ca2bcc507ef4ff4722aa35dcfe869134f2f79a4a5df13fe43d8817c697bded2519987b5efe7776e832a5cb87b62e29c347f2bf993af94770ab06434fd66f864cc52bf7482c2d92d991f0af88af54873d1da8f4f72b0878c00de981e13bf2eb52170ec774d0bf5b0287b56945b19fb588bd41c1ccf6c6dbbdaa5859e48cef241d5766734cb4d4d94c5e19822884b7ba8e6fe4ae8064dd774dcc7c54c0920d3797cd5e84369f15159d5c468198ef459e357ab9447b3df25459b97df9dd15f52ea7c01b819c582916dfcb64eefdbcf1696728e90a2649b07bcaba82d1a3dd4e10347ac8f2e5a8bae4f8f19a52beb162240bbf9c89e74fbcf38617b3637bb1c1e628418b5f79576d88d2171134459741d70988f9472719c1c477183937cb5af6b76a5e8c51c02dec095384f11cf935358849cb29ce4f6d65f784053cd5fca1948be219f45022f2df6f658261924255e741b2d054a6c51450939425e3c6774c446b78b9ebe2076dedc3ef57891f88bdfe092edea055f3d62ba091c15791a323ad5d14889891d767bf0cd84c924a333623e9a53e38653f7a9e276221c0bee7f0786c9ecc24e4faa8fd520aa9a49cab88fee7fd39425e13ca502eef8d45d5ad794c9dfeceb763d8f84e9d6cb6e69c597b360e1f15e7c6d68ceac0204d0e5f5c87d2fa1cd67797d91f5af6e6bb81d2a3d77463f31a4e27f08913e2dda844e45be2b18ae02b8f0766e4ca6460ff9dc6f2635ff06192a008c989749e0ee80fea145292553317253ce51046f0c2cb6001afe8a0bc52c304f2c954b5fb9b5396fbee9f1d64fbe062bcc06b75a1f467f50a402edecfacf6a36c58b17d026c32029e5190f9be22cf6d115dbd007fdf1b82690ffdc2325974a4fede6974b969cc7a5ca5efcf6b8e2c6fc226ce8e92692f30a7821df4ec3f823030c344432a7b6b27bb53824674293f8f588166c8e37bea264b03551b05486b6f8b6f0a925d88553145c11207e0d94ff65ad84c5679fe958dddf96fdf865b7588964a83085879d3bf825866b9b788a6cb509249df5cd8788ce5cc31ea765feaa4d9bd774e25372df9f9804805021d8a37c317250b95f3db4cece364e1dd3e10eadd2ead0ccca9ab0832a27e93c88044623acfa8842b3506f479a8d06fc3df30832906eee953b69514b524d10a11991c733d2299ef268840ad15823c3a312a919646ae028dc44832440b700913e55059925478c2f78fd3d39f47d971ea2e077d4cba8cb1a12646cbc1bbecee554d8d45e90839e9426dfe05f197163828c35e3acd0f0ac3cd8297a8b34d0247795038269de0cdd778c8f01fcc8d9f579cf7171140cc8fffb8df2511414919de26f73945d9659c5442a8936857b2dd96edd21a4acd7a822e0b45d74e93389879054978eac31d0f284816ce2abb8d38bfc35c4f2d9ea04d186dbd95a6d2a2e9e1bd4edd5d83928c1a311989ab1fa71998c89e9f02d8c65785874d4763260d73def70e51e5424c7cf3a5baac35ac86e6eba29ff010a675083d0100d5cbb6039e385b92bacb28d2487b4e00200e89b4097ef9672ca02e33c80782db2827ab0bd2b690e102585cab567ad1f3cb7ee0b9e81976ff39fa988bffadb2e826be2cae77213f030fd1076210b8d99b96cfd61bed86c06e01660d0215f53a2eb8da6272f5410f01cb81507cddfc0c01694795647e8c80bc6a2cb52272a8c2b5c7c175e2b5dea9e21caf60832410122c2d30451b05f25ef25e93b7727f8ef18639bc8c831dc0b4aeeca25eff4fba9424c8d00dc9e9810117c4e43b7aa26e70a8f813cfdf96aed96d22a37376c5c33af2247016f59201123383686bc34411e623ea0e677d8972c028a6fac772eef3ab9d28578827683a384f85646dd4ce40fc00f9f57ce55cd210e760ef817a3211902dbbcf8ae8d3f31c71b1236935a6c15a460c0f35a0799772b038caca17f9e790abc71e44be3bf666a4efec886f365ca7fd0aa5bb3546898d8d16d2c9cfab3b541e338ddf340809bded2706f109e5db8c2dddff362c2d6f0a85e250a72db0d6838ee76483cfa2f5c95641bace8b1a04b0df6c65cd0e941290a0848c8bb67080c603caeb5719718133e62650447e3fa1bc1b9f1fa861e53bc8e7e4ce9ef45400c586c66a8499de77a3a5bc107d69bb7857e75e74f0b087b05961ea5e076ec220271ec22831d74f9dc09cec41a1d4f6522a4d91aecd80e23aed177f83efac23a695d4a76e875c2dbd33d29f2dd74758f6dc542013665b5ea0290f89877e37e05bb6af5b84aeafe19da34fbb1a484b492e1604f3ece4c863acb753f1b0db965f0733b7c7b2cd58d106b91c29511c6731c08066f3806e5059243feba0472f510a72b3f4d3400de067bf1d40d21a7a247875c18106192d79a8d168dd7d93a1f14863df6f687595ce0a9276c39dbc8a098615825e15fd49ceb87bdb336fde5afd80a45f2f6c9a8eaa21456dae7181769ec3686a030975e9d4f2e940f5606e82fd1cfbda3cc9f71ffd16a1a90838af636b9835227ac8c93515bce53e29378d40798331f89f65d4714d506ed3d9d98f7bf96b4651cb3c4156187f357dd9dc81bcfa1d0e625f2a79ab253774922a3c69e6cfa561a0fc4b257465a4a2a60c36921f075259c084fe2df60a337a8f024985cc75af4fb717dfbcb68591f461cb2f0a91298adcb917cb3a7a86ac4a7169e82a5474efd83d23df4f45ffb0f3551dae2f39e72d5df61e78e65e200aaae16701a2a653cfc3db293326495b68672b0a9c4b40c9a3a51fa4ed7acb61b56387057c33eb9ab6da3830c389e92220178a9adfa4cd57547cdbae123de8cf163d0a4a41264bd20ce3fd4077c04ddb42cc1bd66082091aa9a9d246cf79def493ff133f38c3ed8238a7d16137129e0e354e86c5072f1c9908f6ad730c74d458957349ea4a51fa32a4ee5d9cebc904436165726fbdf22d5cda29143eb178f381855f55555d1a996ab78048f87b2ba6032ed987dd681264ec880baeada6cb62f9c98cde885a64f3b3d9243b7ecf81add504716e16f1d8ead0786424cbd3b54a48cbc28d892a78309472a4de35cf1240424bf6cf22418ce79014fc1d9d2080d3f4f1c80a62b39e7796eac6d825642888d16b31510a3f7682b5c39a422d76722487a568fc1bdf1df03faa53d2567409ad0acce79dd5 +0x099417d1f998a3717c085abec333e1e3d577184352aabc843e23ec8cbd4b7cdfc5dc7e42ade402189f2b310e3ffd7e6fd2d722d1a7a7cfd3ed9ab6293160c972 +91312 +0x770620f0d9010dd17f72d665324dabeebc82d1709fddf2b7072ab89bfe9e9a83df72f5280dd15e9ce4f4378af08c80bf5d60f0e9af37449fb4f8d8a2b6107463f41468c554a7db23529f60953c63ca6fa197420b07fc96c9dc91d453afff1826a033a24e154d2b70afb9790e7d9b32076f71ee5d0df48f3b683ed53751322dd4ca19ca4bba89f78be58bac7e1afc5f8eae341c682ae6d8ff414703d405735c765a0c0944aa24e77ada5d1f6c7d4efa0c4829f6b2c69b191d4df485b531884d12375587c24de6a2477877fa600d59aa8a2498a1c54adcf99b768d845f3f3aa7b34b3c6b4c0b96d1faa52066e232e5180e2ac948291c6f2083a359275c9551125e7d08de6b4cfe1b994ba18b7b54b9eba342031164a61c37ddbca197329d95381db50307a678e4292e514290b2db9ecc4e549024004fade6afa8adfb6cbdcebef7db730f85f711a2c09f4b9d10305c631948b6aa857ee8d40351c57c8f5fc34ff5d8a11d90314d2f581d04dc1cb9bb570b06becb799d97aae09e314225ea3d911d92d55a508f5f78fdb3b5735edf83512c77f0ae6613800f4f773874b6c6042c79f257ed4c771124b749a58a5e0a7bf88581937cd3486cac56c4243ac85ae0c911e06eff0c5229dc8ec71d4aa5a36cf51d0df15c49a42229006d3bbde5109910eb4563b8198970478b1565daba101eeffd0450774f8f6c2d525bc625944ff6a811077e3ffa82ae0eb51bc56325bb598f2b4cf9f56d71106056740c9a5e80c03a8b1007bd37a7abd815c2850d6f0ae57db1cf34fd2bb2d76b13a15743c909bf6d5f464659595f2e4eb1f0ecff1f678960977348b712ba89f691cbed485f53bbea9793833ce7110118938e4362bd390ee0e3227f4ca9f1eea8d9d817d2a8c67c583bde058d6927eaddc385d25dd1e83da69fc31fe478c0cd2af2b21d092bcac960510f15756808b24547bbe119e4dcdc5ad23e71a6088df023e43f471470c86caae30dfb1c6b1c21fa291ab8be7d7cb3a4857bbdbbe0c11d3cb869dd1bff262bddf8c2ffa9facbfea171899f7325328c2abf614b4b89c51d1d75162648614ecfa1991569459d7d13e525efdd6063662d9788da627d8900b86d23306bc11da620a0cdee8017dd9a266b4f36bbaebf7e5f91e8ce4b796ad9b5d5cb9ef4aebb98e57f9c358d48418a00def6458185c1e3eac0e8234f68b3badefc73480938c38be8e90ed2d8ff52b569e42304770cf2fd96ce8fc2b472ed0af98b2616f287bee7ef842caea96596842825dd5be46cd9342b60e693c2be9f30cf29e9f0f6c23413c3f8fdaf48a2975d074b2c3212ccfff17021f37ec3755196287fc6be5f11ab792cee89befcdddda9ccfb18714755ea9a2eb6c06cfdbe8ca3cc34c468739dad80f10ed9c40f3eeed140dfaa00cc2f24992dca5543b9c2d6bf82f1ebd67b8ec190dcfff4a7c7ee543b2b9fe9c7e98135543503b8ed3fa8ba52135e44f1be0c7011b36ae2516d15975155e3deafe573a3350e09f350d799bdc44822d69f863e406b3ff6aca848da3d7a85528f9e0a2ff8a27f850e56c9bd697ee7e6aac9194cbb07484c5996a266d01d8594067d9edabb05521f0fe65c3b45e6b851c658c05f694b9613f102c1e1d8a41b524b35ea9f75c54d7e00e7da3cd965850c3432c39fd1a0f0f47dd3ee72db76103464ac36a4ad4a394be84389e7ae6414befc416a337b6f1f9704f3714163fb2be15bccca11ebfcdd2dd0e1b2654b492e10246bfd43ef1eeca38e499277f79b3602387ced0fb84303cdbfa99cdd387d9baab69ac3f9b6171cc124bd993c20bef73e01a3e8c69a8771d2bd839178fe692333b9b5057b57c07a98cc37cdb764cc383ec02b035d1b30f0e5d357d75e24748e5436a40bf15a83cdd1909f78114e2dbfa97cfb86fcc3a648ae070db7b63205a3b4344f1d8448c7dc1378dde071634954283efbb9cd195141d4638d79a8b1862bfcbb9e835ba7f370078bda4d002d89c1630d13e4f5a59aa300efbf655e285eefd3d47984a002715154d17c09e63353cd01f12b4e9fefe735d9b28cc3fd1ff5b4e285c86a78dea847a352ac5b4afd103fabf22b40f180a1c008b4dadab01eb345d0d8737b0dc5001a9c17538a541429e00819fb0213df310c34fd93f39dae006946d56200873ee191e62757df2eff0478c16d84dc2e94fde106969d56ec5644e7ec837d400ed2b3762a8aa2a2fd460bcf7df6ac166a286f072686e24bc69fe78869eaad85c807de8f0f491a1bec72a5ace5bd5cf7ee22ee453bd5481a531051146612d815e068caa53e6ba991200a39d8a0c97dc8e30ae165ed8bb90aba31ea538a04e7397c7ae07f5ef8364ec496311c5723f5d27069b22de6b11c64248a1b0c7ec7c339c5c786e718f9a898fe9ef43eb2d1ae5abec5c866cb4f5871b8a44a09e963525de2d625a31475e9b8f6abea0658dd8eabf5a98bd8476b57769f06e11074e17eedfb2f267cf974e0f6d6447b3ef24e7f0c3c9a634a000f00be003846eac7482e303a5bef3a70fe7599c3f20fac272d68c4bb22b8859e423b9004c3e35f89a04a6fc5e1eaa5201c90ebe73c0e1aa081301c9bc8f252ca0df033d22e1e3662f1b9f2c4497e84b2d519326aaae04e0552c15c041479772c7607f094016139fc446501601c12a1cd32f8b774c4ed10fda902cc1d8fb6bc6b88690f6fc5132efca035e4c0e010c21a3916c22b139e2a308ddbb30fc00feb2f48fcd88d019bde0d0e11e20e20dfb040f4599aba1e59624706345b0130edca22c0a992163d6311d595e1456f61e733e86baa89476d8782ea1cf50a1c65b923eaf759873201d28efc3d8d530d2d9012baa5f2d5fb899150c0d8070988e9d9bc2ff5f2fd07d6501f2b0efe55100b42175daa17c7fdf9dd95724150a06c44b75d9ac35d3dc043458a0a111a92a08465087a8203a77645d518a75fb916f0fcb9d0d268838f83d11998404dca54e31f61aeb8369cbd8df6e0a3083b2ab53e9b49dc80ec4b3a7806351176caf7e104649ed1c0cccc506b9365fc3ddc8cc37ba9ce484c589c88c96dffbd5391878329db8539394f79aa37a4ceeced4bc589d2acb0ddddb360bf9b8be06480a9647f7b0d7cadccc48d111ab2823bc08ebf4f692e5663dc057e2819ea41cda41a74202181ecf72135efce3c44e9b160af605d68b62aa2f056de0b681188c168eda1ad43bf3edddfa98729c4e26b1672b592faf8cd9361c2af68b0b3881f087429d16d0b50d828af293d69da147031a1a93c6f41f9f96afa17045e20d86c6a6fd6eea99fbb24a038bcf9d8a86360cb929246056ac5c4833f979a5fd788d9af01fddfaa2788880c236aa3bc5356a3acf07897019bb65d75393612f90120cc9ed3a58cb5cc406e35173b235e0676a19c616419aefe562a0791fc5475c628af008dd6dd15b56a3de4bd386106e749c3638d5cb353b82c9403eff1481b4d29e99dd798ba100c8e5ddfbd6846fc1e596fc81e6b4d37f4c0042ffa1ed732bfabe23d57f40bf0f63436eebed4b887d42e0e95b996d0a3d89be0555b8ae704433402a8b8f1b8fb9de530db6882a0f0314e099008e722df8c44913bba3d61d7024eb1a5a098a97a2928b36d647ce7805c43c682b3652c33394380aabd402ef4248057feb8f0c7b4c286276b5aca737c7e95af326218d6e7072114690f9a34a3d0525c79a701f8f38e86f49ef1722e2fbeca2b6abc0909421d65b44256535d2b2e4d28df15d3257db8b082ced27effe0456ca1f0693fab8da497cafb3b7490d667f823f7ac6f379c668c39c2a5f5cdd63a037b8d12c2a511c340bd5d6504b5eaa3dcb68b11dc1495c1a3824411e0825ac61520095f9be013a3e7f5307d0bb3b0097f4761ef22a6b3f07cc31abe4605b4112cf82cf7d143de6b14da3c2a927470c26b4043ec4ad33d1b9f650d552f3e2c42cf6bbe836cb5b9444fd448159fdf72f52807f7b05a857a6c95d1e57ea4150a8287e186aa7520eb56214b1ee53ddcfdcb3c0645e45da3b309e56e6ae0ab7295f8dac24d15f36bbdc811a7844371535a6c31a3f7305815311a17a364244f3d16cd5276db6bee7e77c3a85043d7452cd2ff8f48d33b55c339c8b4da9af1955ed5287765f8556f41616e6cae2348c04fabaddc5ca3ae5b95163a437ad5f087bd1a32d0f86c7b7c9cc2f2e729eb3feaa52d9da2472d3073730e9a4cebddc92c432d12e595fe842077e476a12a6563cc14a2f868703a6aa4456b0d57947a238cd655f13ea6781960ba0d232117575d6d8550e5b7419104f6f373bdeddf74a6b05fdcf76491a0e1464d8621ef5a8ad4d6e1808d1621fca571656fd2953392fb9fc7084bdec03f85d91897979359c6710d0e7b170d7841f51e83a674d8f89dca61f4221634991cac210387ad957ed2dc1cf686ac24af299e043662c93d975ebaffd0717fef8601ff27f7a08d7e3078bc0a7fec74e42c7c452b64e9fc4c769a7480423faf96edb425f2da285cd6d67eb9e093f396d45802959cf685338dfe1ca0ec31d2ceb138fec78a96684523daad7ca519e53b7d9b82335ed57b968997abe54c877403c8cea78df811a86eefa3cdad61f9088a655ec6ca79e7164fc7aa0eeba72b6a766417771e433530ffc199a6f41d1ba5ac16079400f6169d83cf9d0e5b0505ff500c7b362373e847212224fff7e06703c81800b57ddc49575d2ada73dd6efd7ab94962ab43911436fb99aca261b2c56c07f1aff1ea33688d025fc70518ebfb22d8a2349f27a4a046b7ae9955d89b1d26912b7e0fef045a889df6ce8bb583e741d69f59da77b474bc7ae953e104a4577a8d4dd4d93356098d547856cf5b3fa91ddac83a24daca78e36fd3420e8fd45bb023e018155f315ce74f6cc697b32529fe0da63d45f8ec9402bbf3cfa31e3411107d6bb48c1a9d3bdcb75a88ac6540502e97c0cb047a25b06089d1606a5cca61e2c0760f060da38eb6b4ca03d6189504f49f9e4d2a087ab446fff65f29eea0346d178a914be04a3dbb6d459fdc742e2e974dc9297f49f588fc45e932a97fbe70faa82ea2223a9b31340b52c4882312b760cac8c9cbe69d14ca843243b2b52affd19beaaa54c39c5068b57adaa0ca4985973e2393d6867a41f8e45af80c38eec73a194611aa245783a1944449ed14dc8284d163f168d295f5cd8ce8bb7eb112b27d4acb3fe905d4b325d0387a37a6d2946ea90f4a4872f51992a564f3d1c89ca7e155009ddc0d1ac63e90ded3462b33a59ff1af053f0da29690565707cd24968daf626d914ae531a631fcbfbde149079c5dcfcc8c154ba5520cc848613a6e074e309b9b84fa352139493e62a1d2a85761f16bed4692d605375122bf68e04df8d1a92611dfb5a4f269cd7b4fe5dff12adca3ee9a9b7d53ca2ca68d4484876a70fe652b570843daad1c04de0ff3d1cc89f5ba805bf3a06dfd185231601df66c77bdabd3f6696c805a3c378c29316fe07b948048b9b6c1caa5e59e359a9bf6fc15f6c2457568f83effb0afb0250983d608a13b6f3b4ca912ca7ad2c27b674fc25391f3aa5c6faebba660b1708ce2d3553804341c6a1e20ee74bf36ff8ae7c9653876862a34e557a0563488f4e523290614a5b378cc92ee06ac9c11154f842b8ecd8ec3ec8432bb9418147b65b8364b91a36cffabeb11da0179f9ad2b52a63fe419bff119d4bda240f3e8d1eb8e82019dee4262dc4f04ad87e4be506a1cb6cb1024f25ad8adf0d44bef98d3aded6f15d2fb0d22347ed12f42f4d343fa341a98b9f61044529532185e140cc9d460654ddad4b788da02e228d7b120ce02223c6e8898fff8af16ec38216b2dfb876ccc735a8126dcf6639d60f1238e38aa6f83152511a9be16b884fa3bfbe1b0ef9b0c4dfd084466b2276c9f365303cb1ca256543769f4ddaf02632755cc113134748da46873f76d34d8b6ac4e4868cd7d431ff466a8ca9fa37cf18716e7a6c77d7fb83f46ca293ba4fde250e20aa687f8da45be5cd7124a1aae96e1275386b8f245f3e83d13c1162b1f5a539aa2a341b2f03077befeb4273b21bbfe2f189b4cbd4da765f558a747f1c5857d1d174943d60c47ea3723977e2f5cc6a7d73fcbcd031f3d7f18a0c3161d77cb9514717fd48ab7f4de6d50a5971ee721a2c7cf0081ef441bfe4bf4fdcad7be946526b92c3df6789f1a088cc5b92f4b32b7a6d021b2a643abaa385b3dad492048b3fcf63ac744d7ae67b1e0df2e8a0f63b01d4b16a653a4544b87dd6b0598274f483d3090b7995c8a8d1052dc3c58bb1b54d346c7a51cf07da8e0826f1bef5b12ec926f165820909b54cceda22cc1d8c16a71cc1cf929ae908ae95331377443f766a3bcb4f1fefa49848db61a46ecedbfbb9ee2fde9a366f4b94d5799a14f676780171e52c95e23fde4fdb72cd102827c0f039252bcb2a111fdb29690a0a94fcb00979ed82966911d3dc2f7c1172a1f602d47e303bb7de54f1ec119fc7daa8489afca432e593ece1357847ebf5e8d4dd3df13def82e2dbd16e321e7c781798d0b5559153da10f6245faec5510ef52933deb0f89195de9aece157a08d7f13ff2b7baeb1ceb4901d31deea1839a12a27a061ae2ee4f8fda42df7c76851618233cf7a5296121983bab01fa4c10470ea58996343515800d2800b1e0bb656a3d4ef232e0baebc8d7e6715be89505fd2d82485601af049520fa70ac09f1b0bda7e79ccf3148c2c64f29ae927e2369a6b5623fac49f9c5770e781b39bfc16ff69f17c2386178ef05452de90e859f4429ef6cf701d3ba600c1fcc88bec9d3a9fd6d06edd438f4796b0419aa37c4b09e6e23c9f7be689bdb3e9d1b3fa5f0ce66ba59dba40b7d6468e2d3167a7505ff805d99a0c749d04440f4ce90c954fc5aae15abbf7045fa6fc551f94cdf300e34f1de981af00cd35c9716fc50ad35b5208af6aad9d8ea75be979fbfe263d0a8f6fad9695ff96d388ce68b6d8673aee2c801459f526462b7f9e6b66d018ebd9beda23655966ad6c97b373d6958a4294dfa1cead2519c1688c7ba7d4bd0e75fafc2f1dda2e8ccae4cd191133aeec70dbc5de2cd8bff096cafd01cdca078f61fac1defb6987ca55d8a38fdf5277164c2f8995bd6128332cdf6bd13bbb620436359a5a5aa817b804b4b5681cb770904b0c9578feeae069fa22336a802d3f157947f031a9fa30ce2e057d3287d73dd2e3ff63f87fba9b0d951ffe2e2994013b91be6df567e485855847558f7f463166ad749f84ae649a86744526ac96945adf15e56df6230b686609f6f8df8168fdb40e0882be098d717d1e1e475655829e788c797ae459c35bf8c990b1932cc3e5539c27c7f52f89a24a0927cacbf4f36ea05bd70f207a90f2b5fda12a5adffb9acdce5ed9da7eddcf85bbee4b7de37b2def0a7ab54b1418af163ca4bd872954907b1b1a32ce761e3ba8acce23dcaf6e6ebd2ef0e7b4a4bf03a20d1805b8878348e418f65d51a3bf993b6263fe68c761a3731fc6210daae872d1d5877d5f78ec26b13e5fc40496364ab6633c25c2b9d96ed98366eba6a5498f3e2c5f9efc8c13dc3b01c31147cc06c29225b3544af55a1338c05fc2200246ab3f782ce5102f7ebc19e9dcaf9b93c5b3672065e492185843197d1d2efa7064796e5f5bea2ad1a168a67cf8f990abe77f9df9c0711881588114002b9ca64e275c43388918ad211044992194a99762f0a9bf085f644ececf2f80f00795b41a03d6469a20eb377c4fd24a8e5c1a405755a432e2af48b55f40d108d34da494529e79e0faaffc2a71b4b43309abd60c079b01a1ff1c88ecc1420814104a43d7863bb9cae0a2a6267fe35cfb29f0675ae2353484d433cf458347273b4d99edee3370183cd295739c15502f0b75e648cd85c8df440891665023c4c0d6c1c92d58d8d007ef56f50efbc08fbcdc63e9f4d440aa4467e291f8bd115f677f33346c97f4e01b2ad44dc2d60ff688f67a77e5ffc16e167918d1f0bcda5b8dad1888263bf604c4a7d10c29bb623915d2201cb6b08698c7f011bde90fed5da5e8c81104b57ad296ced3bcbe0c55abd6080b54c186eeaedb5543d23c06d8ea32aae88b7284e1ce041862dbfa4968d35c00829ca0f38804b32145ab74321b65d67bf043ea2ad94b8f0cf4f66912fa542a443c60cf76e15f01ec8d963c222364e3c455d6e627bfffaa15107874d9a882a34b7f4dc79169022a0f924ede579f7bed2cafa0f10c044ef7e92beec80df20359aee1c003d3ad82ae02ea21d532de0f750d545e954854bdcac1cdd5bd30453adfb70a441eae1d75007efbbbdb546d840dfefa5c3d4d1fc0c5677ca9ded130bd882c3f667281474db3dc5d793b2cdc9e0a79e82663bac3fc6a229ef7a78132f005471783aa1da9715a9365e69f3c99a20cf6d459b2f1efc51b8bcb3b9190da76b9c029482fa3b284474ccb8051f42334880e1542858301bf6c1b87d247a085b6180fcb106de3f10b1c50f4e2fdf407ca0e18418d560e984fde5a3b781430c332c28e9368ff3ef35a4c58686b1dbcc5d6f1bddf96cec521fae4b07c8991c221713bd508de5e15280649cb9c952baedbeff557460b3a771d5501c6b1834ab50ef5d67ba1dd05170d93b713080d925ac8796b8d2b37436508c2d7f580f1a9ba0a3534dae4e18eb52296f6c74110fc30fa07d6c7e5b7544f72d8b9d551512921a1b3d98b4888456ff5649b70ce6bc3d21f1fc9800c17f776ca1b39eea92e538c53f636f5433dd3b7f4a11778065a83ae7625a64e14c5977b9ceeda99fee5b37a9f80cfb17b7eb41dbeb0fd759f89a636bdce1f9a863cdede69e81e6fd913c34ce2c8164847d76111a238bfd1e065b60b445d77fdd70a181f9f8b67e8be350da3dc40bd124eb465244d9cc1157f7b4d8ca87851d09da9edafcc3d599d14d5fcefda9f06a7d6a22ad62f51b3c8c326a73b68833fcb3098ca1f6e9265e583530bb16c178591963d4ca7b5ec0a5462148da7f3229446365337df051f1f6a7048c4791f6edc3803c225097fe03760c2b15b52d6bae1ca1565a17f1e37e8947233b1a752f95d3385fd5e8bebc2bd467b898abc91d0bacf644cb160187143ebef805ddca54baaecb32b539f98082e9de309a65592f891de9974c232825fd3d96edb238984ca27fc11f89ec4f324eddf9fce38be8896e9703b7a6e66fa57faf566909d2e801956ca08c1ba8c9bbd8d840823bc47b130241ca0ca106ddefe3bc87d4d354c15add9df2e331166e0168013c2b6ab81cb58f44c8ff042c7bec718bb095d8652c3fc13b3e8b94dd46ed4680745f3710d2575bc885f699ff508270455916e0ae3098886e0dec0ca65967b97e70876c74a6e1aff4885a2628649a2a110bbeb3d7d54d7b5de66e6019b0580a23b909cf8b9e3bd3f05994744ebf1de5184cf518872347e23151795add52a68296d64f29fec54d0fe5800a4b1a6af1ea81a723d966236c0511d675c09b473b67004fbf41742000abfb852672346c008175a1b0bc1ddca52b26feca5bfa98fd0188adc3e196b93aee59f14fb343cd30f11cc4058a5456db9d9850e0f3a34cd69a5777c2cf0c97e422284cecd4ef956b849d97880ab29af4a48e5520503d6bad78943524d47dc2e78d8f1c679ee2cd988021a2a206e0afda863093f03971fe69e4687050b892432977b7eb27d9c17d9f2ecf6ebb44869d738ba794b977e70bf426fbaeb043f221942ac740944d37ab68d6d0823c8e4b6da9fd1be0e4d3469d3586747aab3d45640fede8a416c1ea61dac04b668baad7266222b3fdd71237b9144cfb59a96d35158107429e15ff82a6df3369a31260d3d088449875fcff616979bfbad5129c683ad4c1fcb6f9cda8835e7952c0387ae77402a9f2d0ba616db44c28d6754f9286deef633f742af404fe40d82d4564beba19b899e89478ff02a375cf7ac1c6173806ba353261113c3d226b9922bb00f6f5c7925ea24ba0a2c93cddfccc42e0f326bc1d7efe04146cfbf4c8035ba973e83f86783f497c991269896af7f47f05edf7070088cae59c4ee87e3f60fd97255d415f528305b0cb178b9205071b019ecf53f04b99bf8d12a8aac7b9f6330d7e1ca3590873fd6e9e79d75e9776694e115fe47de6fa0583dc43e9d71c0f2394e6ef0c7d82575a3e7afff4f5068a05f0c8664fb8b9f3c34f64e74eb752f1f5b3c59c24d2a97743a8c7738b5f3c8c186f29ab3fa9adcb217a105b806e41e4d2f383ec9460631ae135ed9b43a41fc3c9519ef85a57a8cc488b4a692804d332e2db88a7042f99895c6c543fc5cd997941208e1348ca933c600a79d7ee82ee214cf33c951b48340ddbd66429b9e291f4a76361c5b20a57649080046e79ef7cfb39c3087d82b21aec86f98620c5e9ee7e24a37ed64020da8c017455f672536406d0d45229e175356e865f20eb94ec9a5de0674f0e991306fcdb6ed33780b68e8b3aad835fdf9a6bdd03909c53ccf27cd902373b3566ebc2fb45f6e6f94c21e2d19ed604e82427a67f2413602016047c3cb39baa124eb0f5d26795f6037e9b482225d83c8c5927cd9e126fd61a192982cc1a1c046efa6b89ca6ad26b1ebd2da8c4f63a9212269fc880f52f64087e6976d36041b211112465297636ae12b1deea003b84704432997f6df4d874b4eccc4097ac931ac33ce17137b24825a703b6f61e193f3de8261cdaaf37f46de40c5bc9612799a54c23ac953e479039a45bbdb466baf260c7a931c18de70ab761861df778f8dbbb736d8cb9845d9652d360fc0d20462543a964df1c4e2ca3baf3011bb32649e1c501c38ac5521ae3d9fabb7ae793e4604d56fe2ed33b2d46dd61255be6b13f3429bfccaca1f0a9fe34e2143f2c08bd2ce6952026ce9c137b8b759be77662045b517231fc36a6306fcd531154c2c7f910762f72d0f5b905cb29f50bc74d81c0dea3e599826abcd8bf0b155dc09318bf9565ed9b3331d92cbc20aa1c0151569a4689dfad452679c87555ef9e8b854337411c9544576845b0d8d85c779f6c28bb196a27154d5327291915aa7dbe828f8b9f01ef14458346b8a7b9d3c4a885414be2ae8678a2d70c2233b20ea1607146e0347dc5b4046b226cb02cd6aa2583e77126bcc47e4d9c70dc4c94e3b37939ae618af9ddcb9c0621f57b972fd11d5063556ffea9d055889d7eeb23f15a12c40f3328db0002163e8d7b9063a4e298d3fd2044dbfc16c285da3199c7003f31f9b381968cf60179faac2578f9fe859ff4fcfa2ebb87f79c7a6e1ddde8d709e1c0e1715d75876fcd22c81cbabf0461389baa0ab406101cec4ea2693fee3f612701e02b04fd7bf51b9d2788de1f801f6eb04d795e25602dbaebbe3e474100ef0da4f9d8138b993a6a5511906c803866461b2e6eb47e3fd10c380ac37e49e25a9a9274a01289aae7c231d05ced4af6dfcac495123f7a75b0ec1dcd216b6ead4bd6b199aa8a5e76a32b19ab15e9e480320194c98d8681c9736182517f97192869caeaaf1f0372c517aef5e9e3e6b89e06f371140611fc04c2734fdc0688b01c5d7d260026032d5fea52add3ed6e2d1a03a944bca56951ee442b6cb7ddc89d51cef74bd2e814f70cc5202ab15c08abbbd22af60a9415ea4fa290c22a2edf468f6541426e8dbd3893501e52cb573d9a481b7e6d46f89d2def84ab377c1e53159eca62f41c3c8758bd32560e680793638a85ae93b8fc8a84969082b4f7d7ae7045a46248241df8bf5214d047d194946c49b9c14fa8c563560b712022e18177c14d9b4a25cd599ad51a9d93e34f25c81e4c5fbf885d7eb00b17cd8a678343376f7f5821756018f503dc76a7cc28e2b6e15d1eb128204dfa0b824dca6d254675e2a183ef1f25818faf624614e8a4f4e61e429e9e16395ac7bd1498e61a0fb2b9827bc4bd0b64bdf24372b6e2210d83e03bc4888e3af0cea28b9457e95888ae8cb7d7c1922165f3a625d56e1a5da9b62da2ab84897c8cd110dccc31d80ed96274e97b2576496f4c31bf5315c486c2b654b9bf3998c4578a9b1982cfbd244bf7fb803096716bccf01d77b353e6839eabddeac850c2fa9722caa87fd89f812495a9e4bebc8c6fc206f2b7bfd28a3c85bc519c8d70100695c125f28bf5870fac63057ded41ce3d9ab736e63d37b799c1113636d74288d0998d355f6dce7cb52d8a97b485ca40bd9c2a736bf62d768299d317226e6e3541ebb18158ef0a865bed32e7ef4d02e8d80f8830b0b25acedf542a79c71a9b1c3fd2539243d751ade935817e970e8ed0743df8f61c3866c7983b3de68da37147b3989cee89ee4dfa484da2e3159019007a6ca34c1752fa69959635e5dcd09abd8683b31f93fca4745e7dbb9ecf9b497ed3e5b0ba09c6bebdbfad39ff1c6abb869edcc0adc8c9fe24140df5382ff7c65465f048c85a5d59cafcc772bab5397fabe5eaed1e8f1c0410534477389c6b398a1ad493ff73df7498352d08a110058b3342f760fc52bf5d42016c6a267ec14a26d9dbb8e6ba14b6305328223993968a269c4941ce7878b2c207cbf58b3cbfa032894be00698c4c8993cfee80ca7b4228cdd29b91d6910ab964ea941ed402ee4b5146d32e576b651dbdaf783a1b526fb6eecdff0708c4fefc8bd5075d7f1d5bdb86189d70dbab3faff135d1b8023b5bed3b1b30d4f4bfc27603b07baceb77ed44258e7f606ce836b0cd176d7325a2913c414ed38420de1fa64b215385cfaefd05be1ceb85618ee4b0afb8ce03ec34aa148fdd49bd23bc411de09c3160822f15b0be488458702bc420279e55e2cc5df116754b15b863b6e13d528597d5a974c1a5b495bc421f2b4fafb33c97885c7b20a2901cca3e776a7a952f71f94dbc2c8b752f8905daa529f18fd108256cf33893597ec6d997c54367b5c5d5c8412092ddaf9da6e3aac89454710fb572195702d3ab8fedc65cd3ee530fb455a7488d5422a56d53f80aeff6e2d3dd98f015ce666c0951d6030629a7a7137945f8dc38fd05074d2495a391ce2728b93731daefdfb6f34324322c4d1bee51933b4f64d9d9ff358bad6eed44868bf03114b9e121db6f19f26cb627a4c7935a80aa1d8ae6977bc0c732c6407ebcabcab3b5fab11ae5debdedf41190c727308ed016d5b6c59205397e793e55a6dce108df9f66d3218b908f747ed6e03aa7307ee0162a611d7615f01fc559956363d63b134590cfdc392edf445168ae55e43dab5f0c6e2254a0489529cb9a782aede5f1dd2d1affa18b045dcc005943df5a9284ab8e2362e1acf7893ae0637663e7baadbbda47eb27ddab6b8a203b590d76e99b33ffecbb6ae8bd4cc1a85738b4cdaecf3db1aa2ac5bdae88fd25615686b5ad6fa6f62c94470004703c87e817842c4ce6b167d43701b7685693846db4c1b3487272e555761c7f57742a03889b58601f74d551388872377324fbc1d30c54fc6544066209d931b330c9089fdb4cb825911a180269a78dda4994746213b5a6dd6e34ffe0cc465d583aff66e1329419c94c16d7efca1cbafc7625cbe9c2593de2ddf5bde5ff45c5bab087a34c3119f3e79b1bb39ddc40903a635930cd415f80a93ee6dee6154021673be27c455946ecfd2899298132bb9400bb8f61812341259cfb88c165c0dde6ea57a020611d935b765f0fb83e5ff63cebc968cca9da96834abe6c03e964678cc07e315e23f097c5dfb8ffce29a688f1581755d0bbf9d8201ed20114e5828599663a26741264bcc2b5b0ea09d7b8dc67d24fe72c1be38e9295e0d882eeadb08367f5e00090fc8ab884f14ec9dd0978f6e6bd8d2d6e3a12415c6562cc694860d1223c0e92442a8a4dc9d49eac8e1ad735020ab85307601bb2ceda306fe9e52f194196f297807123c900e57a107f5f8f98b092194b9bf7f37d59a9b1cbf4f663b222814c8efa62efd0a6ae3194355a0a987efe0065705441f7a97e678eff1eb73261757cf7066256eb379985b624acc0bac9990e3f49278fb82aa2d2278ca082207afdf45e2911f17f3021b6e4e1aa4a863d1da3477ac4154559c18204023e6cf2db855322f6d438133cf175aed0d5107125d6600c89ccab05b344e7c3143ac0200fa609e3e43ba33d9a63228296dfbb02306db4fcfaa399afc3c783e32748343e83ca992f75aacb54f5014dfe880c92cfc94e129741db797a07a3d6c2afc931b4d48d81542fc4090fb9566871490e40207cf22979f3f6b31afb846100324031197e49430076f9e4b473cd02994e374baaa7f43a038567eef91bc3a31a434fcae2ed985ea2efcef6e9a0ff9cb50c1a0dd4f6bef4d27ab1759ae4ec2d8f574a5787aee544b9feb5b825bd48a78307490f25d5ccca554865ff86e38860cde2b27f9e4eda95b4384090ef4542a351c436d813c1a82b0a72e7e533a412dd547a3a9b9d29c2b23000f229acc57820cfc755f12536dba7609ed9bf37830603b1822543fadc583aabfd3cdae4ba53a04b8538d2e0c1d1c006009de5e92cec64739f14f13de2e59f8691933d3d905f9253825205ccef14f5596cb701eeee308009258c3bdcba05416e4297b90de40677865333f2502b2fc7d917b79bbf637cd6f0c9ed8c5dee21c0b1a4bce6ec21e2d0425c413100e28ca813b6120bb1091be9a8d0db5b47ebe5adff1c754f4ed67f3d26121c4a55b1b62687ac58ea8a6ba828bfeeb831212fab69b53e434aac8e360e80293796c51536b3a38eeeb091f7bc24a48816965045fd74627eb9718b95a1d50ee605aee58978eff5c255e67e39a26dd51179037bbb566e85524a4c72993d2120fd090b2d9b173c0ceb20f495adf554e03f5200f9fc40a8ac4d7843e815726344b2d43403a67c18576dd2737ec14f8a54562407618536c325e4c5e05276ec1c08cbd9a21e58220543ceeceb901ffb6e8fea818f38e2c33eb0acb5ba585a04cbdb9cabedc40ca3a37082c2b58016a3821180dd10e691508bab09ba3a501b56f34ba9ad7f9b506b435c2e0679b541b26577ada934f11d793a939055d8d0574d12c77750c01ab0039565252a90b62da27930c56853fef3a7bbf8b51b2e6f8a61badd7a5857b8a7e6fa3a0ca1a2e9371e3dcb6cbd065690569048fc7c9364213f4c0c5716befb949fe239490e28f50a6033a607f9b49e80204812daecb084b83056b2620e6e5a2298fdf17eb28b3ff432fb5f2bb0f74d5f7f53d4e50dfe17abef6b8e3fb1de6ace5cadd0f2514240a0e0e5654c7546d96ade340d8f32e4b398b6eafe44a39793f4756276684d069d7d049246feb91bc95ec7793b5e0dfcdf0b4155711556127c315dcc50251810ad0508727296fefea387b593dcb5f1bf005ff94b85263be77a01803bdcdd3528f5b5871686b9a957ee924304604b70a3ae13593da90bd78f13f187419ad546981e2aeafee1eb6ab000fada4b74632d335ec1eb9c6b1acb61d06ddd6e18c1aee68cc1be8c228095bf911df5f977b169f698e81af839f76a0845e2ed21b516e0aca8167c4ea73dccbf0598206ee8aac955d30271d1940635fadb0d410d1e498e431695aed70e576236d4e5e44c55b3cde9938d9a9917ebd1b206298370a2de0a624ecbc085b68218cf8583abe23d60ea1a5105dfef240cafb66de40efcf138e752c7254c0b4e3232e1adfe01f10e369070a1e7bc2446dd428068a94e22781e97cd063ebba823dc5305a4b160d946a97384fccfd9e8fef21ca88d05eb61a5c3ae0982749a1cd604fba4105a530b853de5bfc81a939dcadf90875176413b08dc9cc0c26361b9e3309f6567355328386879899a4493c328fa60a54c66fa2f2fcde66b5c87ad0fc9e3a0a21feedb8feebd918af9fa34e9a7d6ff9ad47470ae791c1d61a76dc6aef892c1e2a0e376d2f6b1e03c5d980181b5f9bfd0901b4f49735b945c396268e7fdc255bfa0cf9f620ec9c8164baa741bd1d733dee5c7e080bce10db39921ee6b57f6ee8185efcfed9579db813aae27288a03fe2e7c06ced4a450cbf03d08d1a985b4fee0c6e082b609567d35a11f75385ce47137995484c5c83f61aa9ba3ad230560f955fa3e525bf8d42f8c157af8bbb90d2f92e43d8cc4a6f1613b4b6efb58659f80498645a95fe267850d1e4d2c333cf29bb8d32e5161bf0b3d3ab2e726ba14d50643f1b3023234a5002112128a2f37195831ecb36d1d7f0168116898c9d8a1860dcdc2f2f7638e011360a7478 +0xd3891d0e889883471e15525f8d4ddc25b68339c0c17e3a725c8f858e7784267ce0767b12ccefe62728983c53c6c847d0c38adc3f52249b6ac082c01722d86125 +92104 +0xddd32f165dc63f633c17c2bfbe0dacd72ed6495dc5d53afdce3dbb9308df279b4c40bde86fefa49a6a152d4ab84e598700b79b86f449de157965cad108af4399542033422d578a8ca43083557098280d90a0186a32d0885dd4bd8844a9dd87613e9b1a8b5da7f92332904a4aac94235126b74a7147123fbd266e7c54b211fbdb52d8f92bc886fa465b5c0d9035ea513c0a24b804fab80b1db99f2e6aedf2a6f0d700588a369d93dd68bd518fd341bab48310ea89146af465d37927ec20299086173abf106f94ced1a1daa0af4d4167a2daa3696a5ecf037dbd24ee44145ec18658afb7253a12b3084edc81586d935fef5804bc0d9d903f4dbfc70bd8913842d9e386c73160bf496bb7ea7df2f9dfaa81425c6bdc9c54b1be208a07125f5f1a6500e8789caa4498e2242d1be5bacc5142e3d2ff3d22c45fb62a966959457c5114f6fd51cedd49a856dccce39978035b19828fff9af688531e2313b9140c37f0cd0fecda2fc47582ad28f05d77fb2cd0ed66baf35ae14795df542980ad7c37fd7791de9b2826712dd150c112e50aeeb9a8d87c63e5aba92bdf05fe448b5d2583fcc5fa1d1fcae4b1a89c66894c6ff11d3120fdd8a31c581f087ebd901677a88743f369e77d7977171c53084a15f0de04708664dafcfbf97941068ce9b692691334635281abfbd26614bfcedea6565d764d52daef5812373f71e693d9d3750f2eb75cde740f189ca67726e1cc6968157cb0cb86a11f27b77b8267fce7d5e943e1b428354713987edf2fd1689cc4f0af1d813a9177b90324345bcfec9c24b6ad33130d7e821e421f1a23088cd721b4d262a8e722f98e6e2473e4668d7e28a4f42cbc54e2ae97df285f3b137504e77e27510d1a62b006305f3f057607174a7ac1d498448852e83740b45f394aab7e1456f5991b78238a107fa0a64582eff002bb348d2798f67812102377c334544e3e065332318ddb80d7299eaf1c258c84028b5384433c22af383fb36bf95a88bfc6df75c1a6c95e524d0742084318786c43d83966e29a5ff571766c2323e5ce39738b622fc05336663ac1939a02843b128d4bef194ada34b2845d578889fcaf240caf2262c854ea2666ff994ba1915bdca88c7c87c3252a4e3a9b7b8073c8b2e85af6be4405f303f999685d04676662345b42e89697a3c8315bd9e1f428705fed25053dbcc15908469aa4e6ae9e2cd8816f153c300c7b96c4afbe8fcdf11d3e9b3487a7b142ad8177325c3d2f8c0a432aadaf7f3c6cd61c6dfdf38ff116f7d85b5122040dd218f7f32938687179292d99dab5b9a2fddbe3950f1fe94adf25b493427e5db7b7c2f12247df715aafb01d35c1d2f24a08b372a5abeba3bf93d05aadd044b99739d2f76c53fa5fd475c89c6629ac331cd48551039affc7377c1f530fc31c2195a271913917303bc612993194d9eb8300ab7a0919a3025c9ce03b2623e3ad9c9938c648f1592a0c17cf4a64279a38ebded3ba214e909d6bd5084b5b4ff8a0328b45faa3fce28fdab1f404bd87343b729e956c21092877fbca3c787bfdc99ceb530f342bc27a08ae7bc9eec51d6f9b202839b891b432391463c4ea0d941f4ad0d9df9d66ace83d8f5d9531034f1300fd6407c7fab6778abe88e7c8997cc252e806fc5dde20f6d5853fa2f4ff86e714123a47c1e477bf130221ee3aa71c7a5b3cc0b09b1b876a7998093660422bb47c669340ced55fd17be716216ac0de0f0dd2f0417fa34a0dd0d1a39a9d53a442e301553b1457d6776b764fc87d6b294812b47ff83200cfa78337f616d2ba5b59efec6a80bef144778bb6b42b9e3166ee0fea531ddcba800039d2e8f12700b6c1482eb857f22c119a82af2e92f399fbc9af7a56f8a457c4df9bab6275c5ac1f4197cf2908d88ea5a8f969a344a42b51a1976e6ed0b361020e50c94de8d446fda384d8a4da9aa1686997edfd8ada6fd03e72cd85ef3160a45301358f937b57b8adb65010175dedc3a5054222acbdeee068e6a0829b45da117756f512bee366b828d63f57054cf91c23ea70fcf2742feae69bee4d1d1759b142f613bcb134fb64db8bae60ec8c4ddcacef8071a328ba54813bbfcebdd064ec7b8a9677b3959e26907ea3131648716c08bc796b09001888016b1cedc298842aecb9872a0d2ed8650d572958caa6ee32fff863d16a25d0ec2ed50b9276963fd35b2cedbd0828308a1bbd45174fce4a98584b468b0fbe6aeacf2197a51ff3204f918bd017eaab2ffb82580138eee91005dd5f2b8040f46fe9aef7c50e06d6ac06567d3922fbde5b210ad164a3ef1fc5e154d9199a45ef665191fd9fb573686d6171aa2ec585ea3f647bd076419a97f393866419c065d6d78941de2c82add1eac6acbbbae8cef7602d9cfc40f8367a21853ba632dae9d14afb8640745efe38ab9ecd58e2731f2c48e236fec9b10defd81e3b476cd1190a480e27cc802facc539529d28b04fc0b17eed117d1a55651f9fc64df0cf8b3da6582aee2957df00a21b48e4d42b62f9af8ab4f52239ca8732fee53b4964f19dd003b7a1ff015442f4d9ea6a035b95124ef5a1aa9530fabb4f7de3cbf932eb81aed01d09f88778bae6fc9ff65e49d152b5451af77d07cb499ea529c6a94162306847c5eebaf031b09d0bce528dfcfc030d0589a683c4277848fd1df3009a3cf327f01518ed44696b448ee144377cff6b7dba557d4e71f591750e281ca74463121354764e3a8c0734010d3f9504d2c3d22eeee64587151ddc4c5eb3074547bdd553fa515a49cff353fc11500d9e052f824728a4c5d5b986a1f677247d83ac3483106a0c02c11515105f217c73aa1d2ac2f1f1f7c7e1641a289be1e446097aaf66712d110f4a6655b24fc62b91d3239ed954d04711521ec0b861225c2a7eb915c49fcac6488ecb9b83f687c52dbe1e7210974dfc6dd1ef609b73c4f3f18a7250e6c1c99577324bcfc97cecb21016168eafe3f07ea106e0e317f74f1062d6ac471400b3e562e1efd9cd097d5a028114dafe5f42357598f82f7516491d470a6fe296840f1dd241bea1d7c3c326caa71e3e4434ca8ab330402dfdf73c8166cec309b37465a78ffac00f2fd5457c32323fa2cb8910e32175bec5f6c3afa487c8b1a4b4f83eea61b5fd0c1c658bc500c77ceed9879da989107ce0aaa12bee74a3409be13a204e101a7e7ee79c1e6afd10df0ab755f845b1a882645fba37c7f40579d6825f963b63d04a4fd9a185d1f1b56fdead1da91d61e6d63b5e355b97ce97623edf92251924806965389d4864a45e34520204399b6372824bef3b1fc6cb0006b940f9575019d1e4aa4cb7f08addb2374f00342f267ef38e7e59f40cbcb3e86a30ecbcb3480b6cc2045f1804aa66597fbbedd51325791100bae687a9e14ef9988c2c04c16ac1f80b5db7e70c2e05fc1480120e6e021d75e2e9dc1d7e9e63d997b348f90a1c051ec79c9d4d917d8343ff84b708c72432c73bf284dd1459bc306f8f88c215c79d86ffa959721affa7d547b124eba6f380ae14bd26f0f27b1fa7290733886ad452d7bb6c337d2f1c3b5bf4eda0de93d7ced374320a7da16d55e5cb02937292a9ecb901cd7396583c057c0f2274091738e5de633977ada7962693606aeea914b033d6dbb460e71ec7cfe19f37e995b97e8e76eabab7a88e5d5959ed268d547850efd35009439508255f31ac1445aa02118f430f9d1095dd2cb8de7c1eb89c47f0e75b68b464cb9fbe7d153fa1d06f795ab0efdccacb9c1d6a09cb143ab7a908fae4142c9d0baf69fbf3355ec6d40da6bfbb1f59292fe7d57e15c7be62d1a243d5aea6a3ac8069f0428838146b97ac11a9767d8da3869b8dd2a47b817e4faf81e90dbad6ca0a22bcfc03c7667862724381abb1801e16e3cecd7e8f657679fa489ec9f8cbddf30253922d895ed57d8ac3ad20633a8329e51ed76aaa723297a8235ca9078cce81303f6ace27036a301a19979e3ac4bb05c908583174b19af1e4978b76902186fdd508eeae485d1fc34bcea5ecde25adf2b811b89b972997cfd42e93f83a90ecaf183485949575dd7d446941d4f865403adac36070b8e20f78a06fdcf7aee3e7de224d9649b5528aa82e72d21c308d5e2456a5b67882e5ec3571e2ce3b932261d31adb8b9651fc108a3071c08d2da3eef7543f237b9a39144e6f10d28b925341d72964cb41117c556b73ef72ef98b2d7fcfe1a1040abe6710bc1804eb153806f307772be129cd943951e74520a18bf037b7abde3905bf5e9b390baac737db0d2262b8cccd39b1bc14f5a86c7a556d459bbf0b00633526d66900347529ab8ec54036e3b5d4ab54bb6e04faf398af9f8c106897cdff13956cfe843aeaaeeae3bdc0d6705d94093700c912476107faa3423a26ca8d892b8b90c0477771a3604a5538e3f75a87edd92aaaa0263b54d118f67d8c3bc57dd769d042cc82b0c3c65329fcc1d1032c93ab9787310ff8ebcd51176f0b341c69b1c0aa1a85e51e7c677eba9102a60e0ec52ee5e3377d104939fc2363266be8c945108cabf6071139de2d759a18dec18adce3844345e62809c16ab90e604bb1190bea067baf614f8894ffe98c96f3c43d656a012bcee38689de3d36c53b4c0bd570bd961e14ac1fe5166694ccef8d9ca2d912db0144edd255fad42b3c29f56f8b0dfbc9e7c81008dbfce1f5ef94f4a137b28e70684a8d920aa1d014b7bed042a65e24f07d3c6590d993028b7929d178887c2d6fd5321b2c045db171ec6c553bb3cbd9c842e3f55e6a8338d3de109c9901b08037bcbe3f26cfa8e8c13eb4fca13fe18abfed4147b80b48055da2dbce792fda275693216208e8fde691131b5f19a739a825b0e6e534385be8875c0def9f8f63734b0d1e1c58dcd75b502e21c50b962ec2b8524756698e2962ff6e0968729ce6f4936f06d68d17cf878cd44ae70d694b6ae625e503be594b05144d60c1a8d4df4bbe5d7e291c26412ba5aa093d85bd29f11dc03285b9364b3f649ea69398c3b6b92a4cd67c9c84c6984913df310aee24f5eda5d244c0b174826ec63d56d8e5f7fd75a1b24964bfea5dd5a65f5a1398c6f9d43b26d98b47816ea158b773dfb82d691f10a4283b3406fce9d5ec112629aa7d4014b2ac6f54ec649aca878313b6c18c850e0e91568db6f5e427180eb93d29e0dfb70845f3860ff4c9a03ffd1b6e5ee845fe540d6d2974c9531e65ab533fefd4f1969a3eae4776afac5e435a6d5b500ce0663704d593bae7b520576f6aae46ba3437daeef615bae5b16924237fea3f5ad2da0a00266913f198d15fd395f4d910f61f5cdf716d4747775574d0c9a79752abce5f97e5f5fa476cb601603bc00169e5b192a896daa6457cb797eae12fd2a4c9b7aa348ae6e889af22ceade28c7a4551931ea2dcda42502fe41fea4ccf8b91bb3a7c5e8b986918eecc2a1510b68e03e8485386b9e8c6080f8f7f5763231cd9feab488e7ea6e67599f6a62e5ceac7460825d3acc4928bcda9fe38badab720ce129e813cca8f0b303f56c5520d75b08c3fc0018d73441e217dd4de6d09e811ee8598d8f1f5ad21d95d50fa38d8f3d4370dbb7fb15c89e793f997c31677527acbc60e923696add4c16269c74b15e19ce6e05ca0b0c6d092a5bbbb992fb972c5e662844f8303fd9e98ed25bef16adb950c564816f468c489d712a4c31136c58dbed97e835ff418e9b06c0943d43e2e3727edf23504b8b24798cd07d37375c73cc59971c035bd8c40b84d88f85c06760dca05dfad5a1d46567b19494ccefcf44d8b30f278ace6c42e1130293f016a2f83533c84c27d2cdd30eea5ed817c42d94a802e652f1df65d1c4b826eaa6ccfd72264007626d66e035173e1692413dde2be34e06e561172b395c7d2cdace6ade9856cd0284d0e3745529b6a50a71e34ad1329f562801fc26425269fcac9178af306ee5a1fa78d3f0f9ed58f188d03cda4e3dfebe62fa18bfb34e847fa8167fd703158dcc0b8cbdbeea0a2ee35486d2f469ab7226dd73f35c56f7d79b158607bed9f4cf6b00342a45f0294063b5ba2d02eb250476df951367f1f669393d0896cc7ab2b266219aa1edd2f2945af595d36a9d52bb96b18702464df2434266c5b669adf83ea5b6e3aa1e5a0c34ae5a3e4e9644db9f6f9b72486332946b9cd9e4eefd3b6e7c10073acd404e2028492ddd26ecab67b8e7e47e6b246884eb31de8ec6f0edbb73905cc593bb77d57611b59ce1d6999f0fe7d6d2f5f3b669cbe7bcebc7aa89882c0bfcac83f89dd428f03ca109bad52aab58b7976e37e5ec11a8bd227894d77cad6a3018265d88c546cd0814250228b29420d0f45c57bdb4c75b275c6214a140009640310253ff4ed68f621ebe155adcd329691249bd066af4e843c00b93ad7b2d76741ea143cc1ae22092e75b5b33526f59ca19bcd088b5a1365977fd7ac4d63af113088b93b5cf7167e096843c7bbc709a3a303ef80b3ed52fb1a8c02faef931f1671646ad83168c4c9453c220f9c1dfd3037f569d56ac98ba927cda1c338b195db6715cf7fe963ab7f5489b6f760ac3ec6b2f8c2732a8f2bf461bd5a71b35fb1c494055dbedf883904c9a9991ba3f24ccbb6868ff67daec2713ac393a2d9ede1868acb7bf19e36fbfe17444ef8d070a5d3a51738bbde98dd842578c3c326eca385bdd0c0d4b00072dfcfc23efb70a7e8632133434fc7edebb1a465815f34fc86469fadb2c49f752c0e55abefafff1872fe9d53362eb40e5b8e59e242c35e7de84db2bad84db6f5861e3b79d792e642e40a8c0f97e53d8acb8e98a79ebc3de1781f99a097dcb1022f9403b49d20c0a7aa2b7fc0deefced3ba17030deb964dd78410b6c777fe083b76e420d496f618c733b5eb0f71cae28985dc0b8dbfedf8c0bad59cc7ff2e17020aa325625b6f59121f4e505406e3131cdd2214bf823fd92d7ad2be0aa3e977e6393583d661190c28db693226f4e4cafe2eadd11be8e8698e42ac8d07fcbca568a13fbeb93e7f9c7be67b22f0c23c94add8b3b31b4a842453b0a79c5870241a09c116487349ff947bcf08856a0556eabc89f82d363d9f842e33786e74849c603a274dc3ad1a358eb903a5ebdb24c047aaa0dfb21518a7236e497375d4c091f27a326a92cf35ade5a412c7b8cca6f525e8cbdee40082176ca4714d3501bab15b5a70e1384212c523cd7ad29ec702822007597a25b1008cda61395a4e73b957055b714646be4817e3b5ba7ae052ddf3a086d836198efa53f715001f04b3631f8aed920e208c3c128fdd40153fe88fa631d7d69711f2f6293d3064200a394e67569171ad7844654192a4aa360ff0ae265e7ab311b1957a693763e3f1c18db1bae2d79ea8906f5a3196bc5751d3239ff081001c3a7aef0d805ff00e08cd2953a6ca3067941b75914f0684e5ed1bda0b9143d87075d058162b219520d97f849aa7773c6ad46bef91065c8ec49c6c8c479501844e6854792ab626a3eae86b280d39744c16fe2445d004133a81b427c2fa585494046669bac1bdc9acbaba12ac11d94be00a85b710e4a4c5389bd8e0068a77b788311492a561aea5201ec308594f0358a8a3efa6c93584ecd9717f27df7e5fa4c162d761c1810523ae95a7bee81b44350671b075e74900f4cda11b51b65c9ca6d008435987a65ddf98adbca8b11d187b7a025ca6e3a5c56765b94210138b9b28449fccec605815338ed586484cbafc6683c468ac56c23edf321867c58fb1f7c39fa7f88cf40cd7c9e18ba920238b6cb0b4365918a924c9a6c34d10f473362ee3319f4addbb3af20d415e79c2dde4f5d47be6925e6354126899d5b22f76aead11bb1428311e7900681ecc9ca2c47e043c4b43c8f01dc6959f1630efd90271fec98c753539a63d9f74ea3476328fbd3462b2dc517020f2cfa4d8ed0e739f3690953650e649eaff0bbe24448b148808e2e2431ec041256f2d344278b2a1a5530eef3925b0044543f1ae7d6b6fab5607bc356c999a0583a23aa7f34260c5cd5dc642157226db4d92cdc02627887962300cc6afcb431fd422748a5c089d627fbd53385bb4bf417c621c8ddef76a0144f871307d3250028f767755fd09ccfa2508323c6c6bfdd95a485a72085988d576e775ed654d45502df49f8556e4741f65b4ffc8d80647055fac041732cc695860738767f89aa78b384369b2ea172724aa49f8581f223f580503a5e7cede801c9a33223a97a8db0626e9724937205abc7b4dc874b23e5b33d2f5ac6e6cfe6194ac9cd2cfc2e66463723d25c2be7e83495126fcb921b90f3b51d8a4057dba8252e01715b22ad1e825b2d510b9f0b0355db46be16ffe30dfd0fa432967718166da0d48676c0ff9bacf6147af996e33e56c2d933333a824519744cb88ef08e1939c6c87446812dc70c2f5eb7edb979827e715235e8ea001f8f0c9c85f1674597d0c867a3930a3d89ea2f956fb1b0d4b51710392bffb76682a6fe1c01868746797bcf397b25063ac88d1e40090b22fcc167c9177f3e4bbb58a773549417f598a88203c565c31b296e3e23e8efc4b7fa8cb7c273986e4b0788da92cda76a5c430b2d8b93c737f1146245661488a418d5004e23d5de576252fa87840ea049625089c38f2b0a4731028cea104c3c72ed95047615c5b9c036a596f6709fe97aafc60c8e391697bc83fcd475491973f8dd437f75c0cc91726f07446f7f09e8c5ecad7bd4afdbd55d8e09222d380195fc91e55b944b71ce36b681ec39d9d307f4c10dbdde19022bf4fb315e5b068e0a47b1867f1bde3dd8d2b31a769da585adcdd5efbcf4a0130347717c7047da483ba1e42bd352a3b7180e0ddacae30ca8411ad15a5f5e6c97c42099f34039ddb68ed1d2de3f80bf67f4b46cc9d05335c32da15c578e63a416d5451b9db77937606ca124a6abef5dd5d58a7af07134485ed82b1fed314c7016a07e9e83bb4e0fce3ed7828cffe5a38a245adc5693d06f01aa7fc2243161f9218c95caab35028d896a3c939623abb90d47ea3d031f6dd0350b67ec0474ea67be0150491f0edbdb185a9800ceff89c8e6a8024300fe54938163a94596e32fe2766779c0e72c221e0374b3703c7cc6f89ead6c965416cde16e1a0e76e1667891cf27d6da09791e81d322548ce780ac70bcc0efdf07511fe283985e27ede60c9c53a7303d8fdc19290fcb45fcd7f48159c84852c6229694bd484661ffc349342c8a504e91803c59413fd64c6714c18eda4aad5ef2accc729b458adea76a793869fb8afa7fe58327efebad3276a7cd1b1ccb56db0caddd02a303cd9fc7ea5c607a2ebefaaec598cb5b9cb7bed097027047d3ad91bb2eb08cfe09786a064cdcf387ab5217c828638dafd95cba1dec47d482e81947a8352d58d3dff1080c97e03bbafbb0197217ccb5102b04ec07ae8391f59402c77bcd3cad4b0ea24182d34f7e39a53ec85698bb8aa819171e34e6a0edc95ed0d7dbfbc5d58e1df1dc100913052c3166ec1cb618559f2bfd164c9c853126ceec4070c9b016c39448a35d401318bc278f4c6c76cb5e1de91f9df8d61aa4336dbcc9e33ee5b912fc0e5c128037ff101020b1ece2bced49dce37ae09e479019c2a93cdc624d05a4dbabd0d6d16701527483e34701d44a4b8bb277abfbf43bff561c60023ece44a1bc87c7523c8b67a7d91faa23dbf9bd4c7ef55a01f609ee0eaf7bfcfed951bc31240a092ec88b7a39c95cce2979148d743e12ec8c956ef16e572fd9773cbfb77a9d9c5d117e4f7f30cba21600e20e03ea5273f5f1e20c8c46d6a1bf166dfe7ba7aea58ca364c0c1b468594b501ecd67d7427e3ddbe5c907beb238758376f850dee08d5f8d85c487eb26e935c3363b0162979d8bf0a58ea900755bc5655e938047b9bc9b77e644180090bb9cff313f18b4d837a8d82a44bc31a67475652eb9520cc39a0b089129bd192b3548ac17c0f5f48db35d3c7cd1867cceea4e2aed510d52869076e98d59be5f81c00173f1a8e14b3f7b70c4a41f50077425185da343fa448904a3c2e2be63f919c58efcc6de22e175f6a917a91461fa208d9ba559776107545f5b3a993ff40f7baab8ee9e4a00ddb78cd2de939a037e5b8a9eab16d48ac66f0a66f9b8c3b8cb30d947f181d4c5678da5b1c06a987cbbab84eb16e244bca7636b8ca84a34f853bfb803af7864b7a980a9106637f515d89be3488fc5af40d2b6ec95ef5479fccfb0b1b3cd8ae220c81700b577029b16fdb00f7ebec8fb5f70f3f44875e07a0c688c2a21f6c03646efdb13689cd171c7547470554af2115ea99fea6ee3f51f7045d98d13d0204872445248f37dae5f6f026e6e94dc4cd988a44438cfe09c506f9022415203b500ebef06081dc1a04d58322672051bdc3b248a69453315dcf5526eecaea6388447fb197fbcad11b023c80a25e26eb0ac20798297796229bdf66209c13cd6179703e8ea43ca6c14e4c908b2f2289842c46ed0b5553c23c5473be4892853ac47f51efb89dc9c22734628605315aa4b7a2a0f714b2bf6409183ac2316aa5bee71a67e7c1fd29896d5de26171517d24e00e8e9a46ba10f7f34783266d6cebc653cb30db3d3ab2892e3b2ac771f7f076b7b06e6b13d40efa9572eb3f4f41cded95123b1e7cef1b3dc45cda3c69ad5b068938aeddfea8fff86a1ae1816961c2a1257fe5462372ba13da234f14dada2370ef17ee5789a17a5ddbbff4a14e55706d7f74cdd6a37e2597da2f18054816c03253de9b8c2745e4a774c2930360854dbf1d9163448f69d4564ee0a36233dbe7c751ed44d06a1ee571dfd35b1c4279b1229a46441449be4ccba2e8afd010a1d0ac53d468c8b494f3295762ab7056cb51145003ceca54f3f56460976bc38101315df42475d9b920745a75e102942fd29420d97a81db539374bd128d85b0e76270589d4dfa87ca7a0f71d5ef0eec3027f0c4b0eafbcba8253142333b7c1cc65e2428c9b175577aea2afbe1dd1f0d0a440d6c51059b1fd511c1704d11cd8b904ca34b041f64cd4d093d75144bb16b10af30a4443afe4c6cf19bd3caa0e871f7c6944bc6b8576db34fdd69f7ab648ad5e200f904fb83d5d23d26e926795b644f447d87ac3cbb9d40367147068cb6e0dc54f4d71dd7da50977cf93d0b0b94d7195ea5ab0f1d0fe06645af98bb501711a69092caf95040213f09992bc2c8335ee87dc30279d9c2eba805dedba0a61371972d514111e573ec3b8b7d51f84fa5403f1a5c4a76e382f387ef858c30ff1a955083c6d61217e3f61f7b1c2c0602793f8fbcb7cf80cabebc887b3a26f6bbbaf1551c59f65457fef35d410c3696610da14cfd8c2e120fd48b2c3173386c7c732a078f812e633643487785a3fe041bf12a19254fd2b5236303d59ab73d0ca1b183fa35d2eab9235f89e0b1a9eee973c21e56fc5949e495f8ab272f7cb151dc14b3afb7d5c7e0bf822c3b4d5475b118df1298cb5f102ae803e593584a11c67c1b1d9a7df022546b79a3e9b15a4ef56bc69b411ab7b1f289f337acbd95eae51213464cf0b8a69ea794857e9611c720fd170d027309abd60c6535d5b7f6b9383ebbb229d8a5a129f471456c64217abe3d2f0c3f6cbb6a3fdfc854a0efc2e93a4272d5c37e3dce80f28e682593ffd637bc9d0d6a504379aa84ab1880cda11755cdb745ac59e76b3e024a624cbe037627ebdf8515c63866a09b6bf607ca07b03551177647044923aba433c8443ad2b7095b74f7c457109dbc74b981a86d7d40334d01ec25f5c9746468e90eaea2f425568bebf9e85b529b48b0e22fe5406833ea42151bbbc6eed9f2b0c8a9ee8ede4d89eda300147b74ebffc0946530bb5f27c4b0af898ac02fc0d12c513e7646f7ac3df1388ebb100e1c2c343ed63d66d8885d196fba259a12b58a3c2110f863e6adcd572b0a5eb17488687c4fd74dbb4ad20dfca421eebd2e447850a6e5c78e11eec26fe90771e84edd3f19560cf4215c9171db0b6578a1e8fa361a510175fe0fcba7ac010a872d03671a9bdfcbc34154430324f3d945c0c9234de9ce18766c46e107abe19820e828d275644bb82d93e8734c7afc01c8c2456c2a5f6c7f6b214dbb4cd02914b1b2259bea033836b5817f8ea83d9283840ee43155dbbacaa6e58ab6f1c94624cc03902ff31913ebdd928001c0fd45b30a1f3c2f4aff477ecc01945090f7a72cd264ef0afae66d3c186fa089012a8434cd6ba392943a81004d0dd134a4dbeab1674e98a99c2ba2abf8514760f355ec7d407cb117ac0df5f3ac72f7cfa7f68f36ed3923a8413962bfffefeb36120fdce0f5eafb3b0cfa14bd6cd94e8e04c7e341f6bd268374901bec81a41284e7a8d424600ed859317f7be1f0996bfc55d0a556f63307a7b0d04cb6400643c9eeb170ac1180df1ea41e8a05ea4bc6a7159133ea7e435d91807a63a19daef56181da10ec8cc985e7ff47dd7dcc68e4face9a2d70e1567edd6deeff330cd6be086b53636a344153418d9bd4cde9595d73eb5be08ee1f511e7d3ae7def0035f41ae5edb6a99a90cda7e97b0e7af3c586aee646fb98d2978d5d4c597e4a3a453e158be9a92f32305ba79d75e9196e16071859fbdd2355c6678a42406eb8fd7cf284e7d7a96fad9893bd041d030daad3352cc0db13b2ce0a271b5023cdcfec55c7e5744845ef3f41fc54d7c0dadc4c75b77885752dcbadcb426cf0542a03696814b3abbbed2299b50c0b6311df19c5760468424a99d29782501bad51f1d8071c7f7c08932dbe3f7a394d40709e3aa87c829871dbc67bfde7b683d1bdb3d237eb5eab156e85f6830a0aa6fa7d86a357d1d8758ea9520c63341c5227f7fe769e7d38cd5cce647016dcf684fb892708761e6c8c0323cb284a2fc7f2fa8120398d1a946f391367cf6d6b9373be340dce65cac53879db703425036fe2d3f9c78f966c07ed54de0e58f95e580fcd0e8969b96f69275d510fd476876aae3eb2630d4ce9f9d41a9ea6914cfdba95a269585ed364cec517f4f87dd1045eb1b55b6127131ce0c004c5ef2ccaf241c1d8e4c93266436c9e5467a884a702a299b25570617b6d632dae04367005a473f0daf17a78d4a3d91f7cf9bead7b2adcc2c020ef40f853e76960aa2aff8fbcc7cf232fda9690de8ad50c5b994ccfb563c9694e5c4a2c78e42fe7482b4fcb83c3a93be078203d8c083b8cedd6e7176aee1a184e35e15a44ffdd8c6eb5d54b91ee0b9fc3b18a3d14c7cf7920e600d483c24157a10abb343080eeda7e6924727fad82c93a35490201400d4bb5452ea9c886bb91d7591c3cd41df05c0793b1e2a5989b42c471e14eea07818eeb72c4e981b1f561619f98c6982d7e8b9af4122e9c15b196f2d5f7563794a8bd540d682647ca9b40c05cc5740545e5d398d8a988dbdb622035ffdfca626e0f518f638ce29336f9ba83ff06c7a3edc2de81dffcb3dd2029991e5e2f1e02fa11e5fe23b790fc9dbd392d14f133ec9b92070668802228aa744c0c5f49c381df4ce510ac5cd3dc5542371c2d094b47b5efe76700e84646c0deb39091d44d77643cc9678bf10dcaf4155ee1b5a3605df318fa544779a2a009d58a4b94433e4c5f5e1d734128b13100c2fb0e3d743597a9b9ba2e9ad8c9ccfbd52a8db51af888f72d5bc44a4860b6f1c7a60222e01d7d605e9186796a2e460d6a0ed792b01eb5e2170ecb25f49eb54d9fda5e147b9a87ad542adc71c24273b510b1c9abc7134b96c7910862a1bdc47ab8228270ab2f3ee756e0910265990e9945bdd47eb468c29babacfc6ec4606d1facf90fc5f36e1bb4b35d54a9b8a44f10958d787a0ca1a3574f9d27c8f1090792eae86682e8b9a68c15fb97d65ff6edb17c9b362c343076500ffc0affac2a3c8afe4b2745ffa457d3db35cb26b003430257818e03dfa7a41c794426815a36645e63cbb27dacb0b8229fa67f195d5be779d2baf0af4379c52317f00aec8fd0278397d4a8a87461300ecfc8140cbc53538e6ab20e7d142941fa78aa189fb169ee9116e06a34eb3867fee8153a9f519c1fc68c0127fbc628b308f7bce0196386321d7d9987c18598b8597518533fb1a89498b312ddb9ee0a90e521b2e1f81a979a7f184a71dcb814b9c4f33bee6c50db6aab7c81a025d04154059326aeaa5b10703c937dc8c5173ed4b7ef1a6cb3c3d6fa4544b81fce316f84e0b88296be89a35bec5bcdfd390779a1b8c51e6e946f1ddc1ca8309d2165e79c1cfe414a833aa2d5f4fda57fa72d57a92e11c2649cc70288881385b8be024c1200f10d2ab6f2b146ece58ec07ded4b43ae5190df1b7037781e2321f2f28aff7f332d20c7c82631573aaff4704bbbd719b011244ebedf2f2355338fcc7d64844c3a0f36a21569b55f74a9710f8f3d8d83b9bcd733f5885c32b3d149a5ad137d016c03b93a4d11aff8218e8eeec6d6d12a41d1441f3df040feb098ca2f003c4c277fc71300cdd2a399a7bb98ae711c4465eedad561169b601fe1d69bc915337436bbb5fe86261112bc9dbd38cf1c7259def75605ba0e0e4beebe3728f46a9d77a7c66cb64ad4418ff96a1ff9b1277d73fe11bf7f8a92bd6713ac171c416eded9031637e4cf57087da8933035f53092353bc4938d43332d44074212c020a07c1ac121b404743cca6e62bfaa782bb6551010666ed9846dd2653206a6df229e09bf7a8f6d8fd9e40bc4b035eb5a95374a97349dadcebea1413d3c604fa3c7b5ec3997a5d10170eb413319ac8f37e221c72ce0c0cce7628bfe4e8ef579b87086a80b911b6ae3d9b10f1bf769e2ba93046f63dd8668ae107c6e2b922cb1a7bd9ed1c7ff36a7b164e3c9f1d214923d285db7be6344fdad39011526fe7c83ec1f5cddd14aae23f4b2e2165742332a4a02ac14af1a82f84f4ca887f31c6b6ce0164f40ca0be85c28343a58aec02c075bb26e2ab87bc6f51edbd14b02848fd93e22f48f04ab5bacb6796b158ac485a60cc8124e5d0f9750966719b2c7cf405550d5db3d33b19eb249f2e2e15dd7c6a2b7b437142f3e6aa7406ef063c545236db2af61cfb9b717f93d214020aa627579f6f75b008180c7659763e3e28d8ebf9efe0036ab19146dee1a84e177f30d08984511fc98069f142825e662a383246b457d78a873d451f70d6cbe653bca2ff68a2c847a3f20b1f74b56470b1b487ecd1dcb8965ae7e0849c39e0e3a008253d5cc07df728a6291e76bb3363bde30263b6462b2ccbf78afdcdd4924ee5ade110cda817363fe3e974ae5c7147350ec835cd5dd756c2b46a13686d862e0af1fd0323203f0dd0f373ab865fc724007d04e97ce9651b2768a94dd6cd678bf61da29bc6f19d82c41cf04b648edc030878dc082db17c84e2596e347fbcdb6e9378f7621ee3d8a001a788dab2af59eb34477819477ec597dccfe24ecb018adec84c25df94bd996c70dc62e2d78be5e56c3101a43218e85efb142d2623661ee37ddf539a8e4987f0f902a7ea3bea29f8987f9f3255478ce1286f7641edb13c859a7baa1c754d4b3385627e7b4694cc2ca17a794a1ad359274c27e52992ab8ecd086652ecb2928c3dfa45101c605077896d67b874e883f9384d85a4657b1cbcc2ade87292abe0f31742f18555f1e7d218e59183382820111c15d1d87d0fcc6e6c724b3297cafe28c843af04ae612284e0f13f031f40724cdb8a53acf9b5824bd43fd5bb8276b6d258e7c6b5b018c736e97ab860b099414f7e96524662d708fb01fdd035db16ce99d01480c1e27f9e8f3c6645c1749b55c50d2018ce40dc2427fb9282c82b140f2737b42350ccfc7138e09f2e4ef1ae76548e0feb6d192c9f77cbe8349af8d7412195aef889f7f806d8dd0bbb31b13b6ba40b4d144a772f409278e62dd6cdc72c32f2ea4795eadc26183c94348f3ca8fd5e8bc1da8fe14dd1210a73b7a22f4c97005750589c2d0e99a00421e093185ff42a17538761e0ee18cb8a791826a8ce4c33cbc872c549f827173d990862cfc618afb6eb62eafb7adf39ffdf998cbfb51174573ade38c5009826f0e6f427e94730967071b252ba59ec12718d82f9fd69af6b028ee51e2990b37424efec08ec4906864dcdc0c1a5f307ffe96a1b97e852eebfd4accd9ffe0f41aae19c382d6234602856e8d45e45b0faa86d60ab8e0ad99518d57cdee2cbe50a6f2fd51fbfd26f072492a8355121f98cb408567c06eb646e200ee762101879d66c1782eae6c564c3210af62dc3c13484ccbf35d426115d3f7c86d39f506e356d48a08be2c9c27a5bc7c4bb02dcaecbab979ce3fc16062ad1d7452adecb538097acd3d84c91511999c0caddfdc36f24c9bea6493c +0x661b576d9751845a0dbcb2bfca1d1cc2b556e22a0d671e35dbc349eb51baee0ded828f5288a01d700509fca206e4a39815dd85af1b7d706da78abb8e99701129 +92896 +0xcc5a4209a6a60dcf12621e17150b4576b918732e0ee8d9ba6ff94ea6065af1a4936310dd68a34985b81aefb212a8b06e29c6740ad67487b66072fb4ffab348788d0f36ecb838fd1316efaad3bf78c4a8114b30f7b00c529fcbbd75d2a1336d2344c67adf9d4d70a1b14a15212261cb4df90f6f9ba298809d384184d604c0a7cc40f1a65e20caeb581391fa45464c0b84697af89eb7005ad73066ef032943409b07f680104897b65fc32e1fe63022cd76eaf495a9f42c28763a9480021aa57eb9233fd19e1d9d19df49874cadeac9594a03e50c64630532a1df33fd7bdfccaa4e1c3260afa7c25c002e064b417b2bf7293db526760b71bf81a6ab2f157ea20b817839f7ecefefc6e9f911e34ceb2fef3b1fccab88f459193e1765de79010eeb7bc1bb5cfdfc0da0c33212db7342bc88a73192634127a686ffbac7d24f6ff790647e205889d60232b56170fc6089bc0c96fb70164aab3e4fec183ad23ed147436338cfb33886b8c4e80f930ebbc816c12f06cc8b4a880bbc2eb827a8ee2ee54ca0763235b413159e84c3e3d92b05b2f09bd90f8beac7f414ed22f41a088eb9f344c0b0a6a2850308b006c824594a78e001fca2ded26fe0a150df0bf134faab80779eb1cdade56949945faab9ed9e50db8af8eb4ca988b9a98076d2f41978a33a60999d737b3a2eaa5956f15e8e0a22275e54549d171b6675a56fb3ed6013896b2838dd60b48c3c73277305dce494d60da4984498c62ecf4de65314a2b0d04559f604d75c01e37aec253f4efa984754d5854d23065bccdc786ba95fddb2b9bf4cf384f42f0a48d05c7c413582522884c728fa58af81fa75405df9fb640ed5e08e47409ca076c2260d5301203ab9414e2bb6274d5bdec282ebe4cc50ff6b2c8e6619c03879ed5a6445d30878ec76999b48565c69d21a2bebc227a8c67871c7b21b918d2e801917734d24dda65e31385167312214dbde3d980d4f18c596c9ad35f6d92ee87e9f01396d6d09105991275ad06e00b640d201711483a1b5201be6fd3f162bcc3a2a209fecd71220a43e6d9ccb367fb7c79d7e5f1eeccdfedf0e7bf43e730d447e607d8d1489823d09e11201a0b1258039e7bd4875b123089b4b73013a165ab710e91fec2babe0ce4e221f7096067d775d5ac4165ffc2b3c1b7ad60b7d279d8db96e0ea27a67b53d3ca89bd0f65e0c05fd9c9daf25f26e002942adfc4dcf5b2d4197539949e388f19b1c8e0b08e05c92df5550fd0fbd73bd8b4bffbbf3351e01700bf5b7e047e1523325000814b5f487cc2ee3e66485c2dc0a3ed430b7836d700e73fce686bc48c8cb6cfaaf62045c4a8cce60546e71e4c36ec33443e0ded1e2e276710d846a46bb2d9883e83af61d45e7dfce2e73aa60dc7f8128dcb870d1bfb5bd5b14227862931f52a49be3b3bedfa506365cbc58be8e0521b7e38561f5704fefc2e2a80e25b86a4264b0a662c77f8ded9fc591a18740c74aea4090d9c55b78b5ae615e561693d60fcb0fcb2bc08f693c115339b0425c8ea5c8db21ffcae9f8b728788c75bd8a2a62e1a19a373276ff9b95edfeab774922da599c7ffb8b82969c370f7996a20630e2af4c5aaea59c17b0317b26bbaf6f4b90a56cf4f6908f1b0de40f6edf4e70ae383cf955b89f697b26efe6fa077036d16fb531c618627650b1365eb378482e6d0b9091d17baa45f2a3d714c2b845067b2190d53e8888a1fa3135e5908a18aa3504b4fa17224d9843cff0eec6f5b347124b3e3ea46f8a76e434e98c4d3d474acdcbaf1e6fd311ca3754425c4de744615f98c85640f4f15fd5635b3c31b85c78ff0789e320b67c4396d7d547a1b57fbc27ad3503594044c3946692db8524df9b91604b3374f5186b2803b2950888ecc035358d2f397a0b0aeae4965291a8581a4c80fcf5b1b56dabb47de030cb8814d650d6d8c126cbcf9b9f85708a9d6d505ff80ca4112021016904f067fe32dc7e643f381fa1695b16e07bf2276af19b4fd15daf4b6e095e5f0ede0250e984adb2d4cb046ab74a516b4046d3c3d9d559dbd8420ffaf6b4970c030b5ba2d80b22398cbce2bfeb10d55323c7cf4dc190cf7edc71d4b99068f291af53a465b20d649af6da792825051158f1c78fcc096b26bf45b0a78e246f9777797d85a161d39a5d78ec72ac4d6f2a01130ebb4899ae86267cc830839b0faf46cb53a55fcca5ed0b7cbc74534b974bd6ef64fac959a1163ce781169fdb9162840c9bada7dbca852b6910282607c59a60ee91f458318bff88efa201eacd3dd7bba31e447f768c8945a7b1362c69413f26785c52fc09b66893fcf59b6d595a3772faa413f1853122e29e67456e5a5263b1f68ebcbec9687ae37740892f6832a93278f5c204f0027789b6f9fdf2c0412e87ceefd9a459ea5d02c64c7638e00b568285d8f8c09f47b1c2573108c28557c7326a4752b9a184387853e10891ab2e66ea89165d2e7b48f715e9d50be68fd9573a305ece02897d33cb85c6e741afe300f2ec779a556a4c720bd4aeb164c81205258afcf689fa1f7885c3c5bc50d6714c2317c3573e559d492b80849f461649fa7ddfe87255dab02c2d77a42fc70622730470c23bef2581a5fd551f809463c55dc997ebe96e13797a4c082ce7ad293c9d1e603cef72c041ae0abc46fa5496cf57921acd04dd8bc28869de258d0a2608f1f750f81bcf10258bd91bc3b59097af105fcf566aa92cd37e0c6157c8e7e5ce9819a6bf660cfc7465f3db5c5a4f4eadafb8204dc3dadcf385bef98a414b4ed6ba0ccc5978336b7863de65da919aa3115d25747cb979856bc5050e85a03e49677d56288efa4b4777ae24200401787e22412f34a9f28c0e84656c08118cc8beca0c812426945d77ba6d4c73a453f1c729845dc69d161e5f838d784ff6adf295488d1526e8ed70e389c9dfc8802f0d666e4d389320ce3460b367b34bfcacc3b6272998989dae8c732cea6486623bd54339c54703fac2d8f95b18a464ea314409af0794e10d7eb90feaf7631410225046d213127ff2991112c2cbd3038ae37b772a5090690006009f0c1965dc528a86588061216dd1fbe89331a6c98ea26b72e6de2b15983eee680bda77f145f21c805f8dd4fd365f926364f0d10d6ffb70313f14c1aad68eddfa3b9c3a8fb7b67f45443f962d4364038d6d4775270c5d9bbe6b1439d78bba7bbd179a89c79a685bddf0dfcf39fba8f96b977ebaa0cf9094235126bc241f8871b9881c8d2257ce5a514ab4a6aac5f21a07c8dcc7ff1f5b0268d892721afac167f674696d2754b122a8390844060b0c0e68e9aac5cc63878e93ea9f8240842d047dc5ca525ffad85beaa721d1d834bc7e96e331db9005dcdfae6e97151e2693f15561876450b10dae207b4874a5a8cb129a9cb632d16c229ec04bc0523d46bcd68632e8ca84e216c2519dc555f7ce01717bfe84f11a002172d26b6362244e7159191e34ad83f3bc4185f4e09d5510254441f0e241f029a104ebb5c76c5ba47825150fb534d34ec7d0c46ae17448d50132f459174add4f69fb131136996bb299e082ecb188fe59ff1917e60f0157865be49d236c3368da42005267f611dbde9e33689d71d08c7e2cc48551b46d0a89fc01443529251a32f4bbb19f50fb33924dc5d0093d3503241579179116dfe947ac32ef77964779bf47d337a28c7ffc35703fc11a5ddfedb283dfd48f7d807d28321fa8d1fac20fea03f1ed56f2c7bd2fcd4844b718f5d1923e9ec43333784d95586f762b9fbd6419efbcd9a4caf8fee72d8960c8b7a0382b0e5fef667feee1f4e4cb626dcb61feb5d4dd05745b3d48c757a91d368207a9e5bbca5e0ea80ac2ae9fda727fc7d667277afb79afeebc2136155183e7c153ac280c861814f7f6772c5145b049db4327d6a9bf3c3bcb9d149c2d299bc4bcabc95cca3c2561b4d788d5c2b324b44ed0c42929d055023a09a66268d86cb5bb3889e9bd938edc27d87e10b9cdd5a66aa7c88ac1d8cfeb832861ee8e07fea305217338ad345a6c971ee047003bcb0875edbb603b7cafdded21cca9675d5a74e38f10af62c691fb4ed436e15da40ec3b8cd23125d66ffc2c11d6ffbba8387129daae6b7a3f23c709220094699b0a7bd7b6d8a0af03ec7814843d34d51208d637b997fb93a6061b2ac2adfdd7c089de006f577afbbab0d02c7bc7f05f2dd7551c485631bedb70babe41b4310cd54f813a08e73698856db2d89affb8d666246c3c2951847859f3f42811bba46563bc03d926005a01de738ead545d04b755608a0bbf228a3cac2075fcd51cee8dd66fe482592b5bc43052d21f2a585a9e662c4d2f8c31b9983c56aea0ee6065c2b7dba1b9e4c0b25c258c0ba29f9a20d832d8140c131778f7a5371cc8d02ea0b0827fa9e48b890446289fb9dc266b0e1126047d25e64c6ef751222eb92cb035d3b0cc8b96afbcb7feb40e6b20516368c5ca21e7016838f203daa8730646cd8bb8ed52b544b40443f242488e23931bc76299c0f0232b75b8a9ac4a8834d0bf28bc72a2c5734ad84edd6dee913a8deca0741f52170fa27b19553088bcd93d1d736afb2d1aa6d6a12efc916112e9846e9a76b565da2b6fc19a9321d3af47fe511250e1624363ea076afc573091c5291a0be7167c981ae5d1b2efdacbde2596f28bfacfe2de1ef773993929dd8c31ee678b419cf70f32a73408c7d5c1a7d6999a26b5010f394c716e205f73d860d436df8f12c3757e171650f2b7ad65baff6890993c4f77e380fa6f96cbefb1ce10b50a8dd71468834cc5c1174bcc1885f4a67e49ece59d6b3104e0730ad7ea126bcb410e1b2a50ad28380cccd0ac6a775ab5cbcf437df04ef0f3793b88d6f1dc69fc3b963b5fbe5a5def8ca9f2d8dc2d8629018fdc6300fd25788256e257598a8fca52acd43f1219424ed9353eebde072b72a802045f5ff462f6a45b93f391bb41b82eb85242fc7869f86ad4f13fe0a2af1527cc87ad5dc32de057c01a162add2438185f5205cdf6595eca2fd64fa47e85a32955a2f79af7dad8051af149957eabeca7f83ff206f184f46fac4ab569f9438ef523f2a888011e4044d29608620e4d28661998825818715bd3b0baebd1a17d4b43cdf34ab55d5cbb8f6d84dd010a8c8ddb49e84101c9a2f79ef3c36d5c15776a7d9a2148a38b1a9c5d724a3202f1fe8f6fefabc8c4939e4a19dbe0b469b3d66f0b4f194cc308dc8527576291d862f79faca14f53f0f4c7d5ecef9f5b9b0b1ebb852327a1945516e885a34a8701cc1c5109d56fad176bb42d70955bcd6099c4e273dcf8f1b80e6e48f0dc8e9c0f9be1261012792eb866e7b35d63a2744ade4d864fc2e9b77e832728e1698b1b6260ca9157def8435484d709fbd1000aca473ce9817b966d8861e5fadfe0ecbfaaa95d2539a179956c341693e473f0db5f72f7bea16d6b7e46092f5164b90fe338d3fd443de0599f7ff30ad39fb2f1708ad02268382ef574381777aee88881109d8f4f90ed3224cbf050485b96248e54cced3168ae36b0f9eeeb337603a5dcd26929b87dc01d67957dca339e602f3412a63899428bfb2a59db0307491eb77fa2fc31cc7d4ef8aea668cf711e76696f14a730ee885a02ce1e7d0d479ac223e60cf735f011f25a465951ee654e5139bbe5306495ac80d418d2556898dd7681ac6acab4b7de42b8eb38c995a4c07936870ee2422321a8f596ffe4836f93a4473f56e72ca824c8aae9cf2053a3f766c67cfc2d681b7a2addc511bb0c306ff3eb1b6bed1c4597fc96ee76f6b6e765929fea278234e3289ef32f9239517f94bde3ccf44cf1f4ba470355eadd2dd39d94f97b3b71471ebf6ddc32fbf001c1d49ad7c08a774c49ee4076ac7514271d01e6899c828b0d32a1200f7bd97f8b9b91e32da2b8fc89b9a661777eb06c311824ffc6caa72ff5a3704df376a5285d614f5f5bcfea6d48c895327c392725ea598959178213e09ef59f502e9fd99af5c77f47f8b4b919f80b1d2c0b6833d1a165a17b124f534d77bda0df2773f137f312a4357b0d8fb315d5c0c69b88810004a10fee3daedfb70e400733647f869fc3e750b05916d8a930dd028aa316793162a0271b002d23cdc14145056c3ef422f6ba0741298d4e6cc76554f0b89e96d669e78999e026c9e24f15dcbdb51ee471ea1f2a5052cd4b8e48235a91528d646f88fb99d374383ca4f65250d4c5bbb20d3c6b4c766b434a8e418b65d4f77f6c8d2e30ea6032ddf676557b23e31481f7456c32f01be9abd5dd31f229442dc1199fe84bfdc8929471e6fae4e841380e2ebad81a87c94453780b981bf7574c0ee6184581466519d859773543f0a786bcc2ee2e76a5f701d6ab89f25d6296f8c56c96a49546de3f25f797c30cdf6eb71a5e5fddcbcd3da8a1dae8cf3aed7bba61178ba3ec918c8919e6d8f2a4271f1fa34b8044ae5005bf41a0a88d391a8de78e7187c1eb99087e00a1ab62ae4a2146e424d01182e0d7ac327739badc5c46268a04eb6d36dfca8496a29f818fdb2db35974ffb2edf23c05f0d91ce699352cfe003c472442d85b33387415edcd3c8ceb7fb64fb744069b431930d28ef437aab47d922b759415331062a0bee5fae0d765c363408d29808de9f838fb1271d668005ea0f8efaf08daa29192eb287d8a95a8d0f682a303127c612a4be72fa693bd582fe34fd0f835ca4061d53b23d98c303b050a8697651eff5f3bd43724e6e243325dd390f8042e7a904fd22f56a3583f72fbf9bce8c4188f2a897c5ba0d754721584ec5c9357557408b834283f4f812c07025ea605a4919459bfaed501dc6cc27831b80351764d3f203755c64c52998e6dd493d28c8b0ca7732ad633e68a9dccd0c0a145a0c578445d49c17a1c3103cefdcf53a2cbfc0c50fd77ace8cd4669f9c5ce42640fd9591c367c01c40d8f42765d7ef8c7625bf2f95f127d7404b443c1bdb7061f0d36723f422a9124ceb1f81cf3500d90ee4f63391e87d2564b48cdbd3f1786a717415625f6e1ea2cae3d771b65ef0cafae2adf68c234461fff687a64a07c2eccbcae7758cb4e874c4aa651fa1ba870644092ca30e0c44321afb7ac30a83188d07bc2485035acf2f412711b418b18d36f43fba609d0a4441bcaab05a9bcf40f52c3116b94dca9b7c4a422258a3abc901106ea055c3850e35edeb7094835102cd4213033af16a1402e6e3e232cb100410a27d27ac07e568b7b5a601984c7328bd5249342f77a4026a1df2976b1748060ab154948af1931b6f1dc3ac8f7d9c786c62bbf1c168df2c5bf7578a2a10bb979846db32190af5ef042c2bb9a19f33bc837d5182184a825b7e7dfa03983cd17f6268fa4881d974ab1febc470f539a2baa9a8f32e5ba8f7577bb6c449dd25f3850f1f991deae7791967607718b4d3503b87ed893eb307a5e8f9ab9ba6205387734773a0fa7bba6aff85952dfb05f6a506c553fbfa47f1f4d6a0626960894df70fb46df7275cdcb0262092cc5f112809e50ae231aa40ed4ce819e514c0429ba922fc1486ecb6d5b456e15d3d8d00f4e49efea31396c58415e70c3c850e70c50773c7713691b12bdd566f0069cdf9df9efa4a9d8a06ff3cb79c206da5923e5377ccbe8aed5d746892f07483376724739fc196d97c4115a09accfe825b94d2ce63f38869949928133dea95ec8ea2aa3750bb895dd390303527424e828e5b54be32b1ce16148ef4b5450d7c4558c7b3b317afcc33753b7885c4c5b7762830eda94cce3897538101d51221d1967c1e66705d6707634c8a1417da1ce165105bc41919126df63bbd76fb0cee3be5e2efecf58ba9e1f33ec42d73d21075572e2403950145163bb3897cb09b3b633c72826dca073e02ed3533ea2212691b556ad2cfa66c2eda6ca22c3b7a27d2f1a2141e10783bee1358181d74ab04ef7a65acaf53d2c2966293f2efdae418798c20b00dfd868d80bc3dcfcbf2960f693b92dc01b4a46b4556b78a1a8273d6f9dcbc2e955d7c67bea4a341858d6c9aa105e1e2111da1cf035de152f55ab1c91a8a8076ff58e3306e749258936db30f5d815ca627b45356981f1832c78b2559a33e74709315425059d313fb3cb9f6d566570a118ba14169cb456412da3c57ef5e9f9f0598bd212f476a2c12c99aba54842ef309840df36e6577cdda7496d0f11156091b5877083500e1e786823789f47eae20775b20f2cf2f5c5c72dec117c9850bba9b196c80ca4bdf4c3dafb9ea1d1e8098445901c5f2ee9d18c260e4b4dd8265bb6e24c31056f10c6220984766372a4c6356c3d9f4416de10ab341273097d00c137ac1a54141bb113117850a84aa6bb98a97e4cf082273d1382bcbb3125e36a9caa9373a9af36e96c10bbd29ccdea97014ee030c88ffc715ac1344b0e2997de4e9e2d0a9a3d4d5421be289cdc63cac19094267b7fc3f32546e54f54629b26d64760cd21be44db7be4686311efb2a3b5b727d59f9ec4a7c3684d4269b6d10ced27c1186b7e6c4dbb14addfd43f21120de568621fae1886d65f87d1fda391b68d500d834a630a20ac430d13465335a214bbd4507e16361cc86d2362729123b03160c49240f4a500c9fff4920ab476b074aafa253d7f83d634418e687b082d8663ca74c9d1bbd34a9e9bf2c073eb5ae998235854c032a84f844d4778899105a5af0dac9e9f210b8a94b786432450589a19c56d63b8e809e54310dd070094529a7daaca84ebbcb43d36c33d8e9e9c066e53f1b7d689f82f33fb1ccd9872aa7ad15a125d1159f773cf0f5f87074526dac2f148a621b5fb9eb816c187a1724c04f6bee4d2d85c59b0dc88dcd141aa794c345c3ae6e9cf5acefe10cf99b661f187573682da2e855bf1d23ddbcac2411bd13eff38c87328ae46528367724bd423589f3b8cc1984796bd4c98ccc20dab77104f74c2e962746e7b71e949bfd64b5a1f1b485327ba357289a8243055884c237fe24789b84c1503f4b8bce6c0fa3a1e4177e7868ae8b177dd715aa703d6a5998693d1cdb3749d1738b378cf240c22e84611939759c84e2f3f34b6814b5d4a51bad0be3f79906f00cdeea75367908830b394c6f612bd8e01156ec26faa909cd48325672f69142d691ab6b313fa3bfc90106e0c23545cd385f69c08b280252faa760e574e00643aa8a5c836916a42d27ec2f9edcf8d1ad1365928e40a8a6f754c1a0828fbde253958058fac5c1669ac6561e4b62b2b7be98ac3a20ec827f40021d58f36b960cb8bffa0798ec4acf50cdc63ab2ff6bdf49f0bbca3c38bc74742d43f201b1726cba4f80d12487b8c99665c5eb9a592c3195421aa8abcc606cddfcbcd474095aeaa36e9a1e683d143bb3b6da99ca18fc95ecb7523e344f7551c1980f68141a556eb943d1562ab7650cf0e78dac0be5e4f39477eaf3a16a040a6928c414a98d6be046f7ace1339cb3269521668c2568eb33d6a96a2eb9c4147f1dd56442fa09a42890b1b4274b950770ea8beea2e048193dfa755a594306ad9825c77659d037092ee09a6f91394a68d2364eac54042d76f9480443db08d7d73dc82582c1f3bfa1db7dda6785c762de34c391280b58c10b4f087ead1cd0e09b564f1710e12b487515b198246cbb86717ed77deb30a5a9df28810b1e8462c800cb02c7a923407a8bc5c2fc2cafde5d2a98bb3a7c29b390fa6afcd1207b88380f84295ad4eef9ffedd4f92f09b4f890106bb7ef63604a1c65ffc1fb3a6908d8cf690cfb1aab1f7ca3289e5943e5d1c62bdd12c4293b32f527cd18aff5b6ab4f4863f3d002c07a9cb3abf9a160a930a884d716e2552432c448be4915d7ca3946825825011496d20427435130ea67dfdd224209716f821431d1b99b576a0d7a648632ebb7d895ef5f06daf02e6989a40e0e04349800bd9ee3c9a5589a36e836525bd78d1ad725995359571cc2637648e34e07df808f3d9983386cc609c2c134b70931535198af978827a21e1462969303ec315251a469ccb827f52dc996013d3c99268485a399b2a878a33e4ded514c17ef6cd432c7ab012b9c28d7053a11198912a06add814db2585542c3958d0f3dc6609fae4b816afe84a2ed0be3375790457c864b82b9315f42c467f713c8382cb946b229c5590f8c6a3e2c108b133d6918dfc0709bd3af800ed0fa20f02934e298a98c8bc8d80073857acd2f26592a6eac44352151582edf647ee38753356b270a92171c7b84a67b7e5db8b0dc8e8665a6b2cfa6cccf1642ead80a74657646c2b7073a2607e8696cfdefd6dbd43cb817b132754633c0ce724be5572e4e732b7d4813ddef9489b20da9390df737ea2a4c73cb0f4aaeb3c0372dadb3ff35b4831e65bbe8c049f1e7272b42464e2c2143cc948586fa673153583939042d42c2b76eb50944e14ea772822a136a26dc686b5ebd68c09e83c1ef9f169034019f242d35e104d79acc33b9e64fb25fc86f470acc967da67e2decfcd26cba29c371624f3b90b48a33eb1e261b42290f7c0c4688dcc6cb20e28b39e2bae5c0cdbbe30584476b2246f3d2ee1fe8aa80608adbee4e57f65a1711c5300a1f27a906311a9433231a55f124aa2e0e1730bd3c3905c6c204cd3371540459dac9da7dbe6c4197c6954455740c9a635a6e7bea8ad2b2574dadf45d18f3703dbb7fa745dcb57e96a466912bb8f3cb176bb6340e329d0927581812e0f2363063160b36084854f91a355eabdea42364d1a9b602321be233c0490ed0c5e9646d5351332eceea91dcaae14437761fe38e1a7c388e5d2fe958aa8957d613e4c74e96d6c0379faab34ccf10e2e0fc137a71794c027f9755f99e6b81bbcbd2caa5fcb30b79fb84700473102afe4b776731347681de7ee8755c308d9802570b85479e325a281f8424ca79f5976123ef03500099839233597858349835f323c5fcf55d9c2a934ea8ae4e8606bfd30e6dcf1ffc6bbae645f14436d312c258d70817f76178e2832ef7f6d8c0cc0b1bb4f7b3e551738fa45db9c23e3485a6f71bdcbe94d14eecc06779e4b052cee103bf9897ec2639689222b7dab780784998954ad915d5a7af12a236611d6294aa51d455637aa446ae7a3df575ebde741305f05950c2970993418737536819a7cfce9d38ffd8f221ca22557b792077006c05d2120be33cff0014bd83a4da9e8eb642c248534e3a522252134fd09f72a4bc5fe47bf3c0ef0e5e55ed223ab91ad1c975eb8d4723a16220d41f7b60b0f8e86bdccd9feea1d6c015cabe1dff4db4f96f2ebf10c4a151d82b6f2007139a3155e1443583e5cd199c8d3cd97bd9e0958d0f37e6d8b00e723caaeabef9cfa74472865fc631c18de12a2f72e544b2b8e415135609edf5b32b17070ea25b7e1d5ac7c3f426b0682956f361368b80711eca1ae254d05879d8a5f0a9a3743407459addfecdfd08c4e99f7e8c4e7338fe5a6f23e4f8e22026c5084ff871db8d52672d3ba0b0f442bc14e5531983447441b4fab8810ce84de2c17bbc5c3f806d47cb3a6a1266b26437f44ffb6e9da63a22749361215689e8971526c03dd60bdcceb8eaf0bbb7e0791fcf06fdf564439489e164a72ca06ef82c0a32e203ff23e3cf786557026a26865bee31e115a0c0895e4492110ab03e8589e6c7ab168070883251d22651492b95d399f9303518c82189e54828234ea29896f10ca2df219cd5df8c59e60f1a98ad6f188671bf950165f20cac72e04442373b752a4fc4ac4cd2be70241ea3a614d717b2ff2c1adf135c8101e679a759c56d60b8493a2ee72a86b847585677b5481ab3b08ceaaebea70f1f0b1fc5e154d43fed038fec869cdef9b3572017f20fdc7e2b5a5731e3fa6584b2747fdcf7fe16b7ca9e27ec3291103398eaa2e77c7b770b67f8858c215af4c523822d484f1f34dcdfd137c29c8f673d504606517dc2c1ca4fd24180d0a7fdda5b7e5291537fd5b614e4e8f72a5d8b1ec2b375da5dac64c2cc30b19758a927c941b0153d6ae5a24e521e611246c525ded57b170c850105fbc459fd5821281b9cbc5f9fd6fb1a42ab7fc9cb9b578ddd8673e5136e5b894f7e21964e4b93ec805bb6d417e470e75ed5852b4d1ac57e5a1c83389188480ce752c92fccf917bcff0c1658a6ed30129ed54a8c1018f76045abecbdbbe3b551787fa66c9ee9136240b9c431747ba363a9b2b8363b1d57fb453898bcb7060821a80e9e94eda3f1a4ea69a7a7a81531a42874b670f7af4c1603cd6e7cad79ab441f069bf1e0b0174ba525a9046b44429bc2242b816c583e7b26715647c6c50482866f84c9a097ef1f1bf4b18ee48e3e1120c901b2c19f95f0572d386329717da38552416554e0dfe7f1dea88f3c7e8dcfea6b1f4b1f0cba3e3e08fc1900057c6ec3b6b90d2514516dd2eb744d9a99979ac7126d94ad28132d820a8bb1700a6bace9a3d6093bbaac776424fe112769c53d5fc7d3d4947a0984cc3bcb73a307b1259e217fa0bd5a58ce4f902e220a757d7e5b913955fb8b050dc3a4a5a7c184b6a18b399c1bd37dbd3a3c37edca6c4528276379875d0be16d8e104c0194f109e2e858f216c2a7aa4382d322214f75622ffe1e86a535eb06aad05a3bc8835c1f9dc1ac55d3dd5e695270bb58b3fa4c53f8cc35c07b25c582259b4a7ae0bc2a4d4ff62f68bcb4234252ca9de18c131aa0ed584f2ff274bedb45b688103387821c604d8a35b98f1cbeab5920c692e206d2756c15dcf06c009b71ebbb05a82c8c13388f65c4b3b57164c5e5ed0eafae3970f7ce2fce5e53b34913008b6226f272ba3f84671b906f4bbc0836abc1cac1db02dd47440d2572fe6e92bea22e97235999def339443a05d24fdd1303e8cb6113108e9ffca22b110a9156eda571e2056b397ba5834797bf2da4aa459d8a99d70923729e01945a78ff3ac7553f33efe1d0218063ec2a91e48544d89520af1e6be6c2f10cf8eb99ee04f24dbd167da6feb0d953f31cf70fbe01b5d0c8355f4164d27673b08cb0cfbc413f50efd256efa632ea5e1dbcb6f893ca81f9a983a3ea0cf4c6605363eae62bdfac38b11cc7b21f7edb07ab746d36ac072fbaffb38201a9753a20bd25a1c58106be6dcc9cd7d7b2bd34b863eb26b051e1487d916c056f847c5a1bb67bdd5406ddff5708f98e46a7177ed80fcae84eca8053a92857331ae532afba060da77b048df65e2cdbf4e746b33fcf75b8bcf85e0bd8a68c1b14eb13bfc06374820622c13d2beb02ec12a2d6ba02045e5ea89656aa60db8561b0ca584a157fca8203318616276450d1ef60a1534ce19163b710fa8772b2dbd110a0fafb3777ceb7a5909b407133df359307eda7a7cdd871ee4e92c7969255123b5342fbadb149c6f42848e291be77be078103de9a30f92d5739669554e3bdcd39cd7872ff97025af8dfd525106fdf1452b42b1fae73bd41f9b7be17350ed9a913f4e488b690c319ba9e893075ade1e07c8aad9269fcec55dcb1e175c079724fd0b2ce63590352ab414eae2c48df43ca8eead06056344e10091018d87e8d4f6678ee7d2e705a78b995d58a40126fce798fbbddb1fa83aa1b87baab68f5b23a9714903a0f84fcfdebbf1d659559c44a9687e71cacdf52ca1d5e99e24caf51f98aaa7f4d2e1c51a9e8c60c8952a8467fc87f55d57a8c0774bf979404ad34d055e645a5feb4c0c14459b28c3da0845d35b87ded5042890c71a939925bb20a991654eae995c9f8b495e58c84c8a77771330e8c97d42d5fc789824c7d2d84bb12047ba33359944d9265355bdb738e08ea4271b13bab6395a283f3d93cc34acfa5e604776b933e46c37cf0277b867ec0302a89f6c11b0bb30329a3e6b7652dccb986966f7a8bee6cafa2bff84b499e25abb3ff62116d4e4154413b7ed65b553cb5aada914689cd45bf9f4ad7330317c1c4a47bfd14e953c8fc9462a681ece9a6031b77e7b8d5035b593a38cb1bfe101ce1c7a4d0b0d643d063eac168a06111930aa11679b8b6b736e73c32ddeb80b2bc6ce223e2ce7e45dff10bffcb1b02f78a32035f4d2f76125ccf6edf148bd2242bcbbe9f3c5727827f0ebec5d7da17c013e30bf96d035b3b577b95e878e43c8ff16823c1e4311a213722ccbb95c5e897b6857f8de11eae5aaf517cf411dc051b94a9d931e4469f4b8f95fe880cc5bda2fc8028c2af66b699eabbeaace85c77ef9ef8a796447cfd2810cf1ad545c0dd096c3dce41e1c5bd1e921fa6b7044dd83497bc56990abd7edf4139e849469f91f58f2239b27f2209112ee779bf6d957111055caee140f06899ab39328d194b218eeb9830bb8f64e39b477a2b692c1e8aaf72427717edfd047dd438be48c6abd5fb0a087d071b7593e46440845f48ce6b3665d579e21acb9ab4469f552353a6f46574d8e63c2a3c61130da14c49c98f5bcd677d7cebce44726589d4bfc6ca26c8f3af723403c5a19550cb054aceb848a49cffa247d9114fd3b92341c4d8321297ce453c2f03f38c76c524d447971ce18cccb5aca355ebd407d89e4c2c029451aa1dbea09ee5bce54d97a2760b4cfd415c851104580765bc54e9825fbeebf7cd4909a0044a50289462f1cd545e9463525bee9c102e9686ed031455e1433b636dbcba75d2fced4082fdf92cd4081757fbd330dd39edab57505b83a13a849ce1194a57c4717a640b9566d7475fd07ee0240a725ce75ceddecda65bedd146b477b93c0816498c5c91b6e4b4a65e7f7107b549dda2834405254d2ac7c210542b3036daf7f2c2fc7ddbcec1b8d237dd97d397d89936736d9a34b631eda75e75aa11766c49e0449170f0c3430a5254b2994cb0ffcda0219f5511f201f5242370d924623a29683712ddd97fb3d3ae1bc61e7ae906a269f3a2dec6e7e208c1c80e5f70e28cbd1303486b9ce8593a6ff6e1cf662b343f18533ddc5b7f1e4e07b317e5fddfa92d6810fbc343e87c681c4cca54175cd3cc35a83af7d6a0fcee7d4d5312d43fdaa2f0c7f28dd56665843d844a5495652973495a5fd84134c310acfe898ffcec6744318ef7705b495db75a082978e92f7f5adbd17527a322bcde1a2f83037dcc983ab5ced014dc7baa29fc3f2f671aa11ca97374438b05522f7d5146071760c9b4ad04f0462260e39401aa9123c930a24a8999ad93ad6eac6318d9adde73acca05c4a45a2142f0696568ed66cf48341c4f22d6e42b35e618a2d538cad0be69b6d1a81f76291b92f563854c26f98a2df6749bb17fd4ca767e32dcf807a4a09f776180fdab2656506fd8814f396a372318011cb3e7561424c65c56a0cb24c357f4fd75c460df9a32bf0a837e08eaf81e6a3ecf628479bdfad8686bb97d16cc9915edaffeff1d903fce42b462f9417527d372da49be056a009c9e42ca8743666bc2785532efa8e07f82c73b82753655453ee765edfec1c53dfb46045b507337d7e3e78fe9984831fac4e34166e592408190e399d8aa7676b9dba7d8f5406de7e4608287aa62c52bb97ddcee97af1de0e2b2af9d912cec257c260ae71fbffb1f9a219162fdb5e677c393fb699c3d9fda708c939aa0eaeb798fc2b7596135e387020f5c4b6af974bd20f088dbfdf5e0d93306d6b88e4e3b1af999f655430aeec623102b687a9638a4d97acb6b4341a7833409c21ee1bea3b1c2910f034ea6e485060d45e1b4f4f7d5f51b0b42f588be807a7b9df524a4ede6f394498c09728d6bb1eff3dfa17b7cf87cba92879b31eb790d46b064dc67df609289ee18fcd4b1212e9c7d8ac7948eb4773ea663bea6f716f6504394936f42c8aa5744ceb035174e85fe2b09b0a5f4b1ed9190fee54eaafe3c839eadd024ddc540e894d7acfe889bbcfc4485e4187798e69a987f9891cbdae7c508d61cee7a005e23255b7895ccafdd7d1225e953df116a41050f5fd724510000cb37fe35df200bf041819d64ab34ef6bdb1249c0f4c3826e21d5c3887b0c8d1b2df9fe61d5ce50372e71a2d1edcffbade8738cc57d57350932fa4b0c99b299fe7744a4da24b234e035540f46592a082b817138cc44748cfa81a580cc46ec2991f03f79089473bfd49e526d2ab8ed1ecdee34d73c0fc38d2956ffe82e496247bce2130454edbaf9f9b19243e5d2c0457b76e3f07da7ec427ff9300d9b6cbbfa6793e7cd24f62eeb38b63d19df6f49861d62a60cf7d496b3e2b15f777c75a04b7a4ce45de178789c7af47a787f5733e89bfaa7b2125d69e73bc7b4ac372db840dd55323bf43c3f14a5b472e62f512474dd860b6a360c0fe673835836365cace478f6f8efc3072c5ca23e4ced5727c431cb4efdbdcba72db8702d739ddfca233c33775f02b8a4e77b5ada31155d9fbd274e9aa33139f76e661c0d2c679c3ec652f71f8efb3ad91779b4d049e5aa82b45e4cb12550e8c477f65e6bac1ed4823d2daa38ad62b070645f9767bbe5a69754dfaedcaca240d6f3731d8e1b49ee5c2fd53608e6c0842f7834ede8b09db9a842b15d6360aeaaf488 +0x115f8631397ca4c7e373734bb7173658c109e88a9c236d29399005aa3a6cae0ea5552690c8ff8e0c27a19a6a435f801798c05b0b4b1a6583abcb4348773c43f4 +93688 +0x4538be7ef6502e3fba34393bb2c84119779aac77c4c539e66f1594369e6b28f5376334329835218689d913566e6fbe52c2dd7b41c0ba9a01636bfac9918bd8b29391e576c9ac9b779cf2d003b3ba8cd66a4618e080a657490fd859b3c2342ebf4208f8d2f17f4419dbc79bcaea7253ad591dabdc6a5018c75ca6d97a972ed1232b1096ce7874c6742e9f9a34795fbde075aa5ebbe8828481301ba1a87a406be635f3e7f3c754c6907ec4f5c8c9497076a8345707610243817581dac4d234a1114af712c844e6ef76b17cd50e42f81477d805be473d99fecf111eab5707d01daa516640d658f4e62db110628f4c3452ecef63bc04e30f5d71ee3b3de881dd87bc318698a36b4456bd64c8c3d250c4d2dcd49779c5bd2c0771f21fb8ffa722864cd4a043b9e6a0e52fb4eb2160b4713b4f6fe91c1232b8a5d607144325e369c36421fb68a02fce3b8a88c3a3bfe203354da8a0cd73aa7adea9146006e09c78e60b00e130deb09601d6c796727940426adf6706b6718d3b5bf1004c2abb3b18964a5998c3fdd0c2df1b5badb51638f57f0c9461fc9344c3c3b6b520d73b26117b2814694885f6187c622b50951c31e61fdd17faca6235dabf011a2434eac62b3ead1a9ce7fc8c6281b21fc63a1593dbf058d8194665c948f7d917a06a4f832e87e15179caecf96695141f59cb88c59d9a87c006982468d4124694dba0f2c6e1fdcda24816dca5ed618f134f70fe31f4c672b508e9277b48b950791eff5cf50d4978f550f655f8be8d2be3f153fe3ea71c20a06861f7686a9300aeb1af147a7a13ea33da90de5aa3c0f078879910548043996a6f271b9903495d1cdcd7a2bbf0022c422e0cff3362a2e7b8596dbcdb45e4e5f962641b74da826fa9e7a08f2237be450c949340ebc4dc178caef58b3bbfa60d378c3f8063b9e73f3e1931621516f03d78544d2aea911689dcd05904ddb632180b34e1d0cd661fd4c4bbb3a3fe57401d6db561449891f7439105c2b027f22f0e5ca171961aaad33721154ddb44c055ecd500f7165e8b284f91965815823a46f7141c1857b14dab6e3f6f28914f1ad8b2977e3929a24951b5c6cb42bd57571fdc1aedfe9dfc174e8304116b4d872c70779b744d04cd91197b17eba9300c1261c4565c4aef62d0657d5a423f9754c0c644c92d5b30482c28ab6b40b4f40b31b4b8b0b125d64b3f9765284cccf81e9c812009f08c337ae2274cac108c93ba7cc2bf1033b6d91f2d8d42567539f74d894a1443040797ca7abe67c1a4589583bd30e15e2b26804762ef1ccb06af1d494fc9275fb2f5e3a2be940392444180cdbaa92682e19c5329a664fc714655f07ab6a56145427ea06974522807376fdeff3cd397649d41db2ec194e92f7f54fa498687caddfcc95586659fde08c70936830b563beda73c9fbe7a28ebedf7d3c31c86166b1027ff8a6359242e7d3a3711c0efdb1b0346b627429ac80a93f8fbd15c7ffb4bc40d47c86718891f4ed923f61eb00a3d8fc4d7fc20ea1b4f0ac8f3ae723add72e2f4ca95fa6975ba63ecf26d05158aab7a67c6a5c22fcac138afe4e2c47c65e95325b07c84159006a4bbcffedde8046daa78acaa8e347c6806f7f6f3bc103bb7fde820026de5830bfa8de0320eef1f89093eb094eec0da4d5ce6506bc1bd06e4ca8542b11e9ef6d14bac4d9000f384097e03fbea499a8c7723c61bd23a4a6e79a1433f10fd0b9061815e3fa11cbbdaf4f00db434078b39ee41dd7eae91801d7d696b3fa773f3fac282ecdeebc811ca5349a604fb8f5b89bba074a2892d27b8f80c4569ffe91ddcfc389e51f86dbbfc2d701413c54bd226e526d2afea7607eaf37119e69fc552dc1889bbc1507482178a4d9f081da2b7b574bd41cc5ad4e75874802fde0f705aa51d5f8d5579432ec473c8910c88fcd4e1714c072160af90ad8621ce78d853fddd13a15a36fd4487aaeec9304690c1ef4fe3bb6dd7846fcb8f2e3c40dc81d5032d02376b8b64de54720638c6dfbc5ad1aad2f2bb164e7c5ea776b9cb33925d333cf308087d34785fc3c0fd99fe942d429847d83905473f119c6580b8a5945556b3edfe7834f77c6e462600f1cca1a30ac148572fcdf61eae16037a4f590e243439f90005d734514aa23f2a18716a25f0cfe056e495e382fbbf598dd778883295771ef7f58e745fbb80136155147819bd6714bea18697d4c23c6ea29a298ae7411464c991833e0e8988ab8eefdd51e83933ee75aec8997ac9384ba2de959dabffb9d35f21db1ac67b610e9a2ff57ffb2cdb7564538271ded959f673ece348e6990e74a1edc190ef5ab4446b5d848ab95e07b173d8dda866b94779ff0c3c1400d5ba4e773c5b29f1ee2856ebc1b1f889975eab8b8400c57c33abdc2c85c888617c6669ca58d16c34ff664b00a2a553d59e886a92a01350870d2d25e4a1ae2c7156b9ce80874ce22155152b944a8822043c2ef6727440d2ef10745e0ea61788992a5c848312f4111eb7deff8eff81ee7e39f8581148add21b04298e92dd2a253fc2f693b941f08394ef69ced60ab83eaa5d8d97596482d875b1f3be588e108acde430040c5b69c0ecc35da054b3569af26f96bb300fe86c64de7bf54701f03fa959b2de63aa864e8cfc637df041838abd39bacd809307175055693b497df3cd3de82329a57470b7de62226e92fe66977481a2d430360660a1dc6498454c41bbef5b2ceebc024e8348bc437a223028487d10f5d828410dd0c03c141524b40191297974348f9c493834d46daa8820f02641ae5ce250fc46ed133d22b9ccfe5cd85209a4030689896009704905ac16e7b828227ff890aed74203a6368d26717917d1d46363091335822f597e93765935869b360525d0a0e854f941f7971a5781d610a25a5d808075270e57b55ccf33011800b0976ef81ba2ad5bd40ee191f69b9d763a30f8531973d60e3196699dea73f7c059dcddf0652cd4922822737198f0f56b668e3d6b26541797b1c8c1cac7b5aa44f97d79a0c6af510705dc53a483a76557ec1c32aeef4372119df46c3c12ecb9f358214af08853ad2132e48b10ffe976a39581e105bb6670e4bec173dd1343ad343d7159c9f23f6f4779e1239f56deaeb529665258d4e59878dcd8dd9312e00c717214ad114b9c1fe3a07c2138cead98f670728c9080e97335bfe0b24856eb6111bdb34eb2dc91455c705c8fc2b17fb9ce324e9793089a87842e82fae3288d317ce7f64592ed476a1ab1297427457b9ba636a17b4bb41f5fcbf266be4cd0ed0619b884999bc5e615852b8dd94ed3cac5e44514409fcba18073d333066b96356752f70652b3ae95cf05a52ec51fa293bff2274fef76974774e59992d828c18add8e6e2379c4ee7c1f02e9b44082fcff1236a4f990ba5e3ac2880c2a3e6b9b16ef36e38415b5cec48de4bdc8535f2736451a83ba295269a1f2c3f4a43f1c6a0125b01fd12e6e9695a113ea12049e6c5fe0048e3cc42600a58c0018a7e32377730765eab1cdd78e16e4f738395d2713a26b5e8b24681e6a6e19a641dc33680a931ebd0bccf8d8fe70ddf86ee666e264286f8f431d1e22f123211d37ea36d36b89f1214ccbba592dca157f56c026b8a71974ff7ecded1adbec2accc27bf54de17e08f773561842644d12f2b670a58f239d001604dcddee71f2be1daa3476bcb59aeca849141c7beb215ebb579deb5121da9d3c9cf3f686fb5d6477b6bfc30a3004249d96aecdec0a6d814001f001e4e9fbd2d910ba41cac155a542b0c4e41d97e5383d22cb337e095901eb7b10ee32c326275526d8c5a30a0107e75eeadfdf3564b1efb41457172f0f68238fa7ba21f7842518a7f68af7208914cc88dabe3651aa161d163140a0c5b43d4f035a6e9bcc3c538a5abb99b04916545af83c890c32deef2e0ec9f602137309d9a0d310878b763a1409d0f9b4ced04ef975b746482129c58a65848223617253282ebaabcc7d5c601c7adcb2edf7de8a12c6f3ffd266b31e99e30cebedf7d9a3a475b64454e7134f0c7688cd410b68900bb499bb9249a385c24f0639471cd181b53c70e50614c68f4ac57c519a5498e94e0751837012217f70721d75181a8276c34d9095ca4b9ba6402f5f46df18941c4187c25e540857960815f7a64a371309366ebd5d88d3ba1e547cd9b5f8a084b14efb955426746b51f3fe3cd4c4bcacc376689f4328f54c7ff07394a5cc349130dc2d716dce9e853899f695076ef1772beb03df5293f9794f7bde351e451be32252e3ffb234ceced462c4aa48301d99c9fe06258faf2768185d8367284a9fa10f1ae6e72a404c6dacb732229ef2893d25153b180465c64261fd2ad0ccc406f37d9bfed0dddb5f8b49fe06a5129c7e89c89a6861b89e202eb3c59d1811999902f63df262d4eb515031a109ddab1642a539f356a8b3407b55951ca3e800b2a0f601688c46165968e3ee06036f71481dba008acd94fe3420df8f6a03e89ff763f727849224ab0eed6d0897bc066c1b59f0a6c595cda06357f3291886bff850292beef9cda39cf1271505bafb48a5753d6eb20e75fca1b468b9ec8cf41513a63cbde130056cf0e960046fd98add2340105daccc36c90a0e9a5a5f2f1594f6dfe2d3858f0227afe0de61cd5b2f6eee621be41c66a0dbe25b36fe0b69b0e2abe56496647f8b7be2bdeb55a8a8b3a30fc5a62c8b467bdb318284cc76a38fa73a9e0a2d05696a109068cd088728dd238d4ff85d81d38f70ff6bcced2a43788ca9f41bc0f0b3658fc1c8cca1f243779770ea5b9e8475a44355fe5689afb3343802cee179aec745a07dc73249716147a6c17d15171e9481fb3a2369c78b598b554d13a27ec60bd1eacd4c45278dea17f987ef6ff1d698ef41b7c24fcf489f448890ada7f7c0e9d316b8404f64cd46ad37ca2ab15434eab6bdd3c34eca6dec297bd583380d25c811cb47899627baddd10992152367c1f09e16960eafe083a700d6237d9ce77b0f55b281106399da174d17e8980d5304136ff5088bba38113a924083831daf4d2865736ebdfde1b85de808d39bb63f86bbf0013223b6fb9f0ca762fb7d018a207a09b51679ae29d91569855c066754cd51eae31bbced50b68507e4965391a27e6d0b20822abc96c7a999358ac168ba633b2542cb3fa560dd0d796d59ee151fee69325db9b97052097f40c165b50198d0e369c74b9527529c0cc6a54e34d529f9d64514c30f1285270126d0f5c87a169aaf7e1aa2a4bb4f7beab6367c0e18e6251c0deca912ea56a995120b43e31a5e4b092be2d856a87f030f11c5eb642881fda3528e72ac3fee18a5cd1956ef2a956a5839c7f6923809bbe49ffda41f4b2006d4dba226c45b75fc9820a436d2f2e680047173033fb1162bcf2883ae25caecca1572cfce428412dbd6d051ec76ba771475988b07475ccddc3973021160ed0cd0cfddbd700d03ed3fc7a8ca7fc1ca70ae1279ba0b918157558b4920d6b7fba8a06be515170f202fafd36fb7f79d69fad745dba6150568db1e2b728504113eeac34f527fc82f2200b462ecbf5df1e13d157685f7308b5882c083b6daa358fcf8c0e5eca28d555387d5dce88bb8a57860f30b4056610b9b74c2f9ddc7bc737efa1f947b276d69f9ed9aa92bc310a0778bf66dd46bb26d77d8acf7aef3554a0c1969c3c6b571545d598b317d0e6dcc26e8a80409dd2a9935d607e4f20779c5ed7c25dc96f59ffcc7f431dca614d810cc9c9038a754d1781c985a2871aa2dcc6b4ddb46b38f014a7ee613136d7e5854b2d23672757ab0f076432d2bf3857b47ccb11369e52a9f26cc56b93c9cf4f68021b023183cf4ceea8902095440406a1e59d256adf46e7f79f76cacc1f91db97d5f5ede94c46d344f9ffb740d1f8202395ad82b7aa705ab29485273084da2a931b405ef4cd58be805fe56f8be5af34c8017eb1b38c7942b20072d967b5f2ace856acddfaa37f6f4f6ee3c1dcdb73c4fdcd731ad4f1cc605447c289e80f95e3161c8dd3514b1575f08b9d56aa3ff051433e4d569276e40437fef681281e1e6d9ae155e79f40d563225a64867a8f9f5a16f84fdd72885adedb8a7187ae5e069ce529a7734b1119a7434fcbe9c446fb5007600d280bb29b309d7ed5e5f14be9019379f51edb386cc2d1d045e92e027ed3932a07beb4621faa1c3096247764302c1436b132c62339366c80651d0e2eb445289ab20a033362bbc66434dbd733767ce6048e67926e298261d49bedeb4816255656beb28e830ee63a7e2474673616949757cf25d675983750417ce45bcb1f049ad26020acfd7ea9d6e30776cde8aae396a505e5f8d61fb5b65b6a88c6445963749258dce4ef2c872a37306b61c7adea6270c530800c2a8e1286f763b1303fb2620b0b5fdcf4b2fea2ff41cac95f9a29893f8f8de2844330e358a5ddb30b5c81e1c0ea11eb9a8c80ef8fbdfd7b1cfa218985c766b6eaf44eb744f87f32521a42824897bb974d23be5e7d07abed9c3852d1d7ff43738ca827ecd061c0b5910384a2167685668912f77e4ba13ea739ff3e00baa9bc8ef5e96d129f643ab34492c8ef9f1927efdac4dcdd802d3e1e9299638482593a8fc3327ec6e68255c1e9627fc956f21b89bed3ceea9f1e12da12a133dbd38035fc511ded586a4eaa57fbdd19bdd293d8daa1aa4e241cd6655056915f7522b1373b4c0639657f2b90fbf87d373b9660c8492fc2fb286de89e27bb0426ff045ed6e30075d37cb9aba2146bcd58c1270b925bb5b8365626e735b6dc542ac7dcfb6d8a0b075bec9e317637d247eefce8d6af88dff4803bcc34b484271beb6e21199376e8152353817f55dca8677a3d706488671af27957b263a32627c5e960853bc1501439da3027c7f9896ac67b013237a56cd35c72289df68a035aec953d6dd47f9c1bdfd110e5ada9b4a5cf71f6c2b28f00a57d2b2cd36fc1a23cfa8f533f6636c16b91b8644fb31ee4c5fcff7c9687cdd91deed4e2f731e2894a6a28509e838f568fd9e0a8ca6aa1a067d964011209ca4c991c2fc97ddf853f0fc60093ff9ed1c1f532fa5cea26da6de7df5022e9cb0cd193af9c6edbdaf229f99898cbd72aa69a3817660f238a31a3e2993460724e1e1eb9f3ab4195b6e1e0945c6136b9b99655d4f1a42e0b074ff8d47191384ff5667a68a2ccd04ff5bcd96c8bfa831bbdf97b387c454815207db33a02e728d7739e7b1c1771994f19eb9afe91b52f71ba7870eef1b9dbb65853998fc7b6a0ad2afe9760cc4a0b278606aba71831aa50417bed751c8257733159e2423a703e359e2f65c35bb6b47dec96721299e0623bc57c3747372f49e02e0943fdc5b450154fa95cb020381396900384ad61521598b901e4f1dc213161b0ea251f03f394a0b1e4f2b3d45ea72622e659f438f702fbbea58ce195f89c9c6c651c228fae6a7c577abe5ac28afd8117a768637b5fd8e938cf85b2ef35e9d4b3027fa4a355500cc2d315f1855d755bd0df469792fcf5c5a9f865d23239a7cf175ae611e978c3e6667690248736ad0af0e67afd2a4ee83594a8b3cc199464d01bd6e5f6ec99547dc4ddc36062b713030a655c00abc63e9d8b68e5fd0fd6af8c32fee5d00727805760911641825f25f86fd4804e92035781e0a173018f60c647ff4b6c19d3b3b5f7bc090f24708f844f93ac7e337786c16756fae16602d367b7d334ef50dcce83c359de24a5b7c88c7d3865bc5bb6b11ad230ddc79724aef2404153f5f18cc8686eac58ed21c2bacd05a088a123ea22a24710b28c114f440475ec20f6986e41e24e3631cf452ba6b47d8e9df3288c5c263a7921b570fd32fcdd161497a1ebbb7fe689d1517c4d4ce149350df8d617bde520dc93ba12a90c79ca61b72f9a9fa59fcc09b00a23b1fdb20d466148b916c88d9ebd913082fd30d9d25171450f0480c06358665ff7f439c51e2520595df41c7e088e928f5e4430bb8957eb6e6b84ed9040d86cc9558e91990073d3a1114a2a44f2d2204ce1389c8d64077e123ccb3c7de91c2becc8eb959c6894f3c69f836250e22ac2efc824d4cdd6c2b1c6ff320df7c0963c20ce85a64d9b1af920353a65505afae2ee8fa36a0b762c1ef32f43d28c6bd9061bd2f7542b3c786c449ed99391d1c508df942eccb4a6a62e2d498b1aaa5f47222472bb1fc3a13fb5ba18eb8db3cb0bcd2962418d580cb367ebda7256dfff8318d13a4b79858dc37de75fdab424bb41785296662c73fcf644a56e9407abe0ff42a87622e21f46c62d52c03197633708c2e19d171a871bc15cf0525abd8c882e3820c2cbf9cf509a3c82e68ab80da2c4056ce2dee80fddb709333250d8f0799281c0bcc121345fc2240e3f408672a305e84b0428057cb749e2049af0fa8619be880ea08ce8dcb8d08c5b36ed8330ac30c4127d7d036c3cfc6fead8c592ac0d24e3713a99b136f037ddd06a0c5ec612f72149bb68524cd3311b3c984921d0b847fc8ec7723ac19a8a8124450759b19baba8574a5482ad1eaa7c9045e62892afaa6bbdf390b60b1c2b2ebd547904819ad091c1a6dc14fb73aafc8c5e47377047ce99952b9fe371f9ac2f0214dbff949508a62f5d6979b676c513676dc6aee835170e9afbda23a4b7801aa912aaab891ea62de6da77316c9c7b79d7e0ff2f78ec364335d0e9f701ea397a08ba5f88cd9c5bc19ebaafcc9c69506844545b1990d18ed00c4749ee27e65ab5a7887517e0927be99d5a5dbbb441c697433454fdce99932d64cb6479654046561c1985f94095990e89561b7f42ca606f4b0d975c8088e5c405d9e419689c9ee3ccca0c7d8c1a35b8e91a6397d6779058c24c7cb66533f92c35ff235ea03fc6e73036734521a4c4711333b095ddcdd8fc4f7d8f8bdb2f3fde9ba7bca98ace50c8fcdb44c09fa9e7bfbe2eace9c721ccc2591d4a5d50ef4c539d601a9aa6bccf1179151b7054bdf20d305793043137de3365a8379b74d88113b1c4c792727f84593b9041e4ef3585d2206b1d959a647fc7fbbad1d6a59f80978f223e318cab22f8cac9629eddc515b6f4c5a6ee612c341891a1938f6188cd777c14f8f843b42d789d2cf7fe9ec1141423f3c9af34139d8dbe0907364748ba0c0f299247362f066129376c94a0de23823471e03861af0e9fe76da76bb543f8fdcebc64bee270404af5755ae18260a689bccca51aa85329d7842bfe8039feec95216a1abfb72c5d8e98632d75c1ed2f83136062d646a451bd3ae0771453fe179aadaf1eda52b7c0b4788d6eb1edf82116eed9b3fbeb1728c962179ba881b60c56d9e7db8f13a71c452c50993645062dad959512ebf4301184a03de6bd41bb2d522cc0eb5e987ec2c90a692773859ba7cfae3efa26f063ae676bbfe2c312721d251cb6c8b94fb356b8b913b3ea1e2d11e59f13f45d7e3651fa2b3a1a3a827f3e483035fe3fa7c93a8cbefca91a8d3f0e97fed07bcfec2c9ea57528f7b400371323edcaf6524f3500cd629081753145f05f33d10b2ed8caf701b008f5a02a3e3e50dbe23b81949b2be36a5bd79ac8e66993d4b22cdaa275fd979256be9f4f0912475118585e16402e673cdb15ebb274dcde67d05b53f7d214cf629e9cf20d0c218003d9b73852e87ae1308ab6f87c85bca753d8013b3753df11c75d2b48e2cc0e935aa2e2b0c8e8b3ca0bd7554185ad9b872f25c8f0ff6faf1726fed4245edd1be9cc005547e6b54b8a256d5b476c30fbf650361d05aeaa2748080041f4df93ebfbee8ea97e4af2b4b9f3a9437aaed4505d7da577f9c387ba1cf10ddf3ae3a4f162288a39c4541581d21d17a86bbbec3b550de0643dec8cea1e688426770974be8510af90aa9092355af834e49b120d0f5567736c52782e29c4d4ef9229cf77c60d1d4b48a18efd41bd2b8da2794fab6ed730daead7f4e01b98dcccacd3a4428a32c509cc39bdbb29910d8e4c96d33bbc72e0837a2ee1471202d697f10506598dce9e4785e39b506f4f44b35d743b528a80fd1994c7dbc7bfab58cde92e842143191fa1202fb651857037995f81f6745ba9fce9c54332e676fae9fb1fc09c3e3caabf93058e7d330e8c7cbcbd4083159256568076219527da69f09bef5bcd04fd0bf499b0708e896cfc7a7a11406fbae11ea07a41d351005c81032ce2608519e6b56521bb8638a91358b76dd6021ad8aa5b414392e915146fc8982a837f52e19c2f77b781302a26b429ca1485f623036094df58f3c35fb896b936116cf8b4f08fe2a2e79bfec196a1d818eaabad06afa663d146ef027f8163cb537de96d39cb34677d3e76529d5d7efc2a7cb1974441de40ad89ef2712e3598786cc936d4fe61c367d08aacc2c0fadfe853722254a6e9aa3ea8e6e91b872ea763689f54965b5c9d818e2a3dbec11a167af969807a79a4e160ee0f7e2bea4890fe93289b229deafb4d758fbf25bf80bb000376d9eea397b0f911e258ab3ecc7cd1562bb07faa540554ee80dbffa475f702d862d6b60e0a4090792420a26d02926517723eb56ce2e51d5fc73955573ff209e0f41edca044b8ad8ea07d195e32fb413fc3ebcdc9dbc031312a802ec026d39c83f65a68438f41d9b71d1817f9a4deed37e75fceab89c116cd725993c774c344292e3160de31039a5f6298a426a064f266a643c0f9320d5699676b8b546fe9883a664cce5973257beb38a6c8cd6db5d733c73fac9b1fcf79ffd05f1e4f616ef01e6452b99c9dd001c467ea8cd654f8240814fa9978982d056676dc54a09079043df1ec2a8ef72bb652b70bf7299d56624c531d8f7ae44f8436228b362f45334d00d4c22819c95f21fdf0b212af90f618664d4f96884d5e7dd69a13cbe4c7c352cdd77bbb245a93ca2ed986e44e7401cec0ca39b78a198279b0a61e1ca860529b0dc0bfeb98f3f03a4b3b3075ef939e0cc19283f96991e2ff2b10512f615608b1295838c15bdc9ef8bede57cd7b33f65bd16cd4650bfda797af9f560ef9f20c1b87678c44565dc48ced8aa4f5d89d30425821d40159a5f8c9a41ad5c1567c876191b5637d71be8a7f4207bef4f019754abe7a2cd73bd0fe1e734a754e623ca00cae09667295461958231c4fd2a9eeedf96c3c84ef9ac8e11d82f7dfbf037980a3452c3c2da83e999ffa93fc97ed66bfdac832834f5cd3c84f3ae8bb1c237d4eaec0e78eb693ee32dd2e326f4ca3c714723b23d2016b3adb3a03e7b06ba98e33b6860004133f9e0a9827c250f9b35a134b2ed6190dad45446846ba66b67df55742ff3f454e93964c5b4d0a46a40467e5ec0714ff790c3b2861692a860487fae1da936efa6f761d1eab08d4fa578036b1dd30a52c4f6f66b2abd6ffb85eafe4fa06aa53ca7cd27da812c0e614190e0ea0a70f514997bd0c07d0f301a3cbddfdc94facb85e7f8efc1317dd093bf39639dad10ee0fe57e07652582af8f053f98b773c01635d7f92e38743c70517eb01fd86e39319f299bfecb9c9e2ab46feebd72b56111c7085c67a2b1ce6a2510c35a3cc6508c5ce6442b564ad82e34ed59b290e2345ad3f981208282ca3a8915b1b72d5e0d4ac39c1511b7c8b7468b0dff1c9482d03dd71c05ed7a6fb64de7ee29bb4c9dc5f96dcb6d46429ec1f021324d6fe00fcb473af05922dcc0f920dc1a89eafd0df114b5e4eb3d99257eb791fad30115e16c138a0709653c2f296fd02b50aad10735292698ed6c2e05440947d81e94a8b0590f4ed085291b12cd676e812c9f4b41f8a35a28026673a6b861cd5a8e7f1af518b6e3dd6ae2ec143bc401bc6c1cce26c21fab32b890fc92525dace2b144ef180197039e0937419c1af2244d9dc7fc2e07faa4497e804b5098593111156a97a1ca1c08930e7a9e22e16e60b5400547e050c0dfccd2c8c25a00f124662974972ad8d27d4ce941643105b52173e17923b6331ea84d43bf04170291e1427be7700b9446dc2c0800365f1e52f119f08822480540a83b4ff7833033c7e2367b37b4cca2e5afc1095b76f581c44a07fbb6c5ee6df36a2765f6b20e1b1fb1c2a5e9d7f67b3b62ac6b97c8ace685b6de71898141d3834892142133390ee5da778a725c1193b48f4e8d698deda313a1fde074d6cabc9ccdfbd92b6919a5d6c6b5a765a39662ed90080d3549204dfaa5f6d70d48e1af8c84d53369d658765ef11d7b38510d9f431f99598f8cfd4da73d59b3b75a3f22fef7ae91610d5dd6db040f846ee6df7f51885300dccbcd38b5d28705078d3b9d5080f8a1a560926df75a1c417dd794a9a564c581a188288583001f4972545f951dcb33b2ab92ae92207dc430e9a5c5949b2f715a723487baab30730f9c422390d330f062e7f60af9e2e987d146c3dac6bf62e6f9c363735eaafe32b5c9c910270d4caf20ef1d2ffbbb17d7b0f9d44cc69e8986fe199773d7eed3cedaaf6bbdbe2898d07b257a961e15a3444e9739b40a951de1c5e942f1bd032bb7fc91ac84ccb18004e02f90c5d78ef65e08837679095f8a87ffc6f8758464908e8a350dfdd944acacee71e247ce839b858d630d34594a79d9ea171a87b4af9ca301ee02817a3e79490471019459900d3b3b9a804e60d24658336e3ba0c4309a9602411cc8161b7059a0c151241f40c61f91be525fb6a38a936a40de49499424f7f9c2df3a43681c6f61c7637f65f240832e3305c0c12ab11bdd1374f9ab36c61956d7ac4068b0f7eac617bb1ee43127067f9d1d1a26d454422a7a923a6fb4f8aab81416831c627d6c2c16ba8b1099c42a04510ae44e3ceeb6d0daa8740d8b270c7bfc907ad51927642269043c5178b26e3ae35187bdc0dada4ea84a3f1b25ebbf40f5cc700921805337730abb4d7a6c33a1f8739cec0cb33d1287da040f21c14375940d3b4f3802c9e9c940806afb7c2ac7d4f39c5f7d024fbaedea6b6feb2239a85be5151da94928a7c0481410984ca41b1d640e8e9e4292b64efdcd93fe88f247c1e6a5db11ae0ff01c73eef4cd78402a36175c0ffcfea6832f76b341d8800dd24a84562dfdbbd0612276897e07698f63b3b00d49f580eba00407b4c015820ce66a40be7cc9fd2a5976a27c22d29ad2662ab0aac32493e29b61033ab512294fe2b59e375e02ec6e679d9a2f79bba6b98fef8bbd1216821be3cb0bbd877ac07755910f693834f42d19ebc02be92ef7c56f86b3acad37e60807a683c5bd9bf1f3cd9116bc91dccee6def5b6e9f7a928568394cb01faf52a278597fdebde122845a94a46b9f166b71c254fd0f23bb6931d4a8e344591fae90acbf3fc885f59fdfd771111e9ed6f574d8b6ec0dd1bd3d25a42c771fff8958d12695ee233b7ffcd8bc579fab4dc5319eb8fb6e8f32e8d50ce0af51689957190eeec4d51667e602161030973b344ce998690dccbdcca5fb8c8e18ba48b0f0b9ef0a333cca92927942dbe341f5dcd1e309f3d24ec02a5a754db84ff8e7cbbc001b84c96a6643eb29032658e502ccbee89a5f343bc0d1710cf8653b536c7223b63b6470a9130359d902f877cb898c79c0f3b41adde44b5088359ec615ff2d8da2f6b00f3ff9594453e759283bb3a56c33bbfa6b7a551e61b1ab6ad784ca85628df5728d753fcd145d5951537ca89efd099a39115b3bd50a4f03d157eaf2010a3fe0b1d4930ee731c000e9e0d78fff96093a7af3c8bdf5b529e5db2c8da22aee805e76cbe18d3003448528b79490519efd40c4f9080308c908f7913fb60086741817c85aa7e52ff3b09017c0fbd51b7dab57200b653696aeb4e4fa78ac349f05ceb4af692c3d6c67cec8bce45383e59adb259511257e25cbf5521ebfb967fd0a6bdd33e0b9be70c864d62109e6c5385f57522bf391023f8a93ea06fd23c126e9b8395da7968fc27f3b614e18fac19a33e687ea99f1eb6b525553b9183369a40c7a7134a70bdaebf21b1249fad89f967e4f6cdbec8d60328c04353ffa3188ffd97c2cc0c660c4718bcb911c95c888b1a95ba805d2ac8a1a9e683aa1896545bdba85130aeddc77deb11585cfd311a4751ad2e471349891adf14908e6af16c968165cce1905c81bb9cbbf97689bfd1a693a7cc725fb979c73ed6f4716538e3b8754ca04f6f46cd78b43926ef1d4d213157120fa2b0df2d3f3faa2a03a5d13c4a3de975da7a410d4db8056b37168d9b6022888248b54f15fb581a9ba59b4ee8c431b8b8336fbfc3a31ead30df13e5a2cb7c57aee4bb7db6841e84d3f7b4267baef736d1baae3773015e9d025783e9d9cbcb2bfff751dfa15209956d4a8eec577304e07d00c43cbde10e517a20e50e92f9a551f011070948fd9fa8c23e9a052ea8c141f4763023e6da9466e2dbb5c880cd81861992597f2fef475b6d44540543c8d2d7e2bb70a190569749e6e884ac05dfe624f71bb7a5c89f9719e8fc5b71494bb02ec221142a4cdd7d86f0c7c02da47959aaf31da01195871560afb70ebda1b9df931d4789226ee7bd8a8b0a06d1df4242a4a818a147394e48bc3c04ec5eef8bb7b14ebf4e2e990dddd1301fa71d38c3379e807d49bb065d87a9187672d97549df15e0c8d1a33d9865076a895f742364aef516ebf7e19f2d78a3bf8c40c1e57ccc1d7e14c234df4fd979a4c76e8b41bf2f44c5c54a5f66468238bba6c48cb28cf55471238e37f07ca1c4796a72a6f63b2f0a27a9af88fe214ad477667cbe6f02e1376475943103b7645442d2fa7bc35134b1b6f99602b95619038d3be7bb7d672652c27b82b4ab7887c5bbb1645e2b99c6d7fe359c314a5d935267a7842860322b2305a5c8473a4882852e564ee2b19d5bf9680e30b90390402d9129d079a9fc6614b894e34d429feb0f2552289dd7a46a728eb3e1ee8796960184436b23cd1e6dc455c9425b56f737e03b358fe4107788efccf72e6648e90b8acb8492ab4c10b8ae67a383d5e9d6ff94da60c359fe5f2dddbd288494ba001705e15e1594a98bcd3f58c416616dc788997d748153f3f3cfa8d9c8731e7d645f2f4030326467e821f3c39b88726541896abee1388683bdf4fdad677857e59e3a4362cb979ef9ae4d6812aa488d62cd6884f927676630162428a28602d595163f0ee350a3a8e156a608d060d506e8d3ac84c6b77c579ba4d3d64394b10c0e54e3de2c9ff516b169c262876fcc9369ecdbc6a22215eef8e29a731b23f18fa3d2af2db8e9ea7cec6038e192277da768816cd705f792910a47ce8b93a452c51828279a12cf122ff4d26012ab1896b75729e6328c9890e2325d168c47a64340bdcdb39fc4c00ab45d28de821cc37657c85ebe7580958f66f38ad8e1a1aa4197172bf9ab496d12bea7dc1a9c71a8baed3e887bfc9c7eec73d069ac482c10dc1cb6db50490b16f88347749aee4448c2fc2c4fa5543aa546bd5b71f72c617a81561f446df5a46dfac6ce8ad5d40f142d09141ca108e5a91c87f72c5feacc67cfd7a30f893d8fc2a7dd9f87620a2cab67a878681577180adc8835f12d1fd73916260495688d37c59e5c5cd2b5ed476ef13edbca694b5c4b15228a7905380c8f02a5966e527126d74cb7692547e9c9ef5840b0ac22e22cda44db872c7ecff6da03faeaf2fd65f788116356d7aeac3ead1b629995c8d80448ea379e73e05400aa987a74dbbfe80458ab04a86240911018a908f91fc1997d0773bb42f7d040d4614ec8b6811083e7b9680fd06da434d8c28f985192b3a2f1a68fdb0710c532cc9e855a427ba5a61c2ae6e961524004132b4db52596f580fc968d1b7d67458653c2da938b33d5eb1c4d9625cda8ba8b39c351d3f7a53db0086809f0f863c7d8247ecd29034227bf6261f44987e96a36c72b3a794a45c2bcaf9b74f01a8ec2949912cb7f4d1f218f79388fc9328ce5a345b376199fe14b035c915c9d5650cc384c3f540abb2349f7db11d739201b933d2ffc73395b102d2099fa2f5d3e425b5f9844f55ff0070775028e58fe031e19710076e05d2e4aefa0d2267bc434ebe66717d43de36e32e0838a1e839c4dfceefb41b31bf96c0a18e0afb6b046cca603eb356d8c39982f7bafdc42f5a853406a187e21a492a6d62f8c8d1b6b7978192a589b617ec700652f56638c1d86c5713175105308bd612799e0f4d51bb0c9adc03b94506420396c8213ca6a79dc1707db7da2b7b6de1d86feaa71743fa133ec6c00cacb0ab995be0a647b5e78fcca9caebe9fd04d895e6cb4257d6945af495d9444a931a107c7d22ec4f0e8b98d428841a4823d2b238651510e8324dc5f6c69cf83ba14e5af223165c1c589a9f231532abbd44ede5137cd6bb23d5752262fa9842a67f536f4475455c753c1d8bff995d0811085e576e5494abcd6414598058538b55d53139ba9c365524621b46b1dc8c980c192cf29114da48b18a33519809573c0e4af09f9bc071b0ef719cb7800547c3751c5f9cc3e52dfa96edd8f4f2342cbb9a86998831087fd39f12a9c6b63c17f116bc003f4def172943350e29d6025872c13234dec29de728fcec485b9aab828ab59f16c277591f3d810bdad88b9b65c74af6c78897a73115cda8845e737712f61b6da90d894cce9e181746e95a26db24ff795c6ef84de604dced62b78acb4f9e10cfc208cbefaab4d000 +0xc8a7f49e8f5e69ab5c99cccdcdea01c60765714043896cd560afe968ef583ab4cfa6e16b8600e930633ea7c6304c288b4f960937e36490d96459b1be8149b3f1 +94480 +0x21bcd76de4058121fa75603ad1cffbb2c901551398fb6fe8edc10f7253bfc09d585e1a32efd4434e1440b613aef6439db9175738a4667ed0f85626a93b68a65014b37fd1b0c4e12a63a9710093494991d2f740ea4a466c595e1ee6268e0fcd7e9be68eb0ec7e629c31d91867466f14745ac698905043426d6540d652145f3e10371dcf386eaace8bc4f833b29011ac309aafe5947f0607f357e57f9594fd00ef2d80cbd1fdef2ee1662d4a4839d71aabdad8b15d9f37c3d37a346758d8941b01c83909e460f589855ca0e691096865cf62698353787e7ff517561801a6ca98304f6d11d76065e75ff17a8ef5c86d9582798be4ded181424175721afac7477e6309476c14c5e750576ce3cbdc3d8db3ae68655b6674eb149fdeb1f3a903b4d5823feca1015722cd55140224ae3171c63a782170532762fdf7983b2d7821b9a6743a873808ddbf6541330021d36cc1d60eeee4ab0db38e0631ec374fceebfdf8233f3eba90216521030f044ab4b624ec1215d995fce019363522cde2122729d3769939ae00e9bd0783f03728b7d7420e2e3425b58975a896eb82276dae9ee43f558ea19cc2fe6f22aa20c1424596c4474a92f3931a3ce62c3b546a780918d745a8689e0c3d2822775ee6c920c7bc529c4e7869b819fb78020edfc18c8b5daaec576d5787d92e7e108889774ba3119317222eafabec7b09204a6c52309c34043d4be6f594feda2df41152f44a435d30bfaefceef4fd843f8cd94345eca4668d3e6a1a9fbc14f2d42bdf8968a50d68d09cdb2a4e1cb2dec250a1acc3480bbceef99d537e86833f1ebedc76fbe56bfa1cb78ffff6aa75503b748ceff4cd39fbcf76cdd7ba7ab489b0b4ee60d391c4dabc17b3c40f26ada352fe8153ff0297eed7bce0f07a200d983515ff911b317fd157c430c2c019c19faef867210c6f8b5cafd3c0e3e601f73353e9f64ff94e06a795c7ec3e320a1b0cf86928a2459d7e0cffc353fb28a4db24b239bbe3956fc0242027d1838c8122b2d75aab1bd013d9c76e94837f65911f31fb0c3695181c150f9decc6d8f7063e59f4d2d8d7d5590255a44f36b6c8512d23d66b4facaadd6d32b71fb2849b22d7c8f6d9971d7df8637e4afc56e9766b6bc1ea5dee72723b305314c77fd09f5c55c88677d034ef77620a08a1ca619a6743d5e0eafb2d99bdc63b5cec14042c3d21214cb56b65545e69c085487a635ace1c255f1a5e2646ec98b238965968694ca19bef9a50f8d436df696af84e3ade275d7b10f6ffa5a24e0c8050ce36437f113efd182f683596862ccd5eba2e2d4ffa709d9b85c6f1d56d8b6c4b9b93df951460116e7b9963c3d6b7b40a950283d5d0bc53a7d09c5406d17e3fd1065882d4de709d9a86cccc82afeae61591b285972fa967dcdd67145e004bc18c166d7564f6d46a4358eab6fc972c2a28b6267bbea29f9fe4b6117a04845cba21d3ba006ce4f64012fad96a5918e64aeb0d47ad71ae06c5646380ce20e517f23b45286a14313de7af738330c0ba7e0c059dfb62d9dd469f07ea9e58dca9e63180759dfd86641026c1cbce4f59045d391f6e2be31eb6c7f67255515f5e5a303e986a02ffe705d9c6f00aa4114d7eeb99e089c07967c1f29150ac832dce7f5ce22c2c40b9629cff90e639ecbcc4b090f3f1f5a06adc872d3a47f51b0855a1d4e5e4c43d731cb2ea4948608e99e523b510f9bab5fea78fe1b7ff3a01391b47ff0f6739e37540ce01bcc18571f0d95ec0b9a1e1e57fed6177d122821d0847f945275e931906f479aeb0f7b27f09c8e91bb491711a33d986555055d657bc01400ef770dbc66f603a59ec92ee9f2bd94d2cc970723b649085e5fc423d979f73a2c2454618d4f9ae9968393b42b9a034115dc2e7ed30583de68e9d91bfc5f7c2a9c9da87522ae9031e445f9ab4b6ae02bd15669de8e1570632b7faea64c90d19dd8c7edc91b08a8a525526564f7c9e6bdabb7c3b6e36ab13f0cadcf3358b299ec571f8edde4e2368bc03561718f4b896efb9cd6884179b8da82e0b5739f39379e9e1126140ecfbc8e5b7b687190643ac847621cd346c6e9ce34b4fbc78ea92d3d14592e1c0725bd053d70f4c599b89d4215a3f11851d6d67278970cbfb566fd40603411465c88ba890cd290ee099d0374fcdf1dd8012e017ff50352bc92173a30f85e7a337d7d37924ffcc76b7ea61fc9537fdd92b330fd3f0086784ea31e36974314c353e857b6b95d7c02be574844c7c002cac906941c48419ce8067700a4dbe71377383bbcaa56dbbccd67221804f8b9046ffb79abf1242eb32c547c42f7874ac72040d6209503315ba1f67d79f2c4a501379a6afd2e4b2e65bfb921799111e49c392e4608193704c50adcb80270c41a65bc36791c0625d7311cb5150914144b2f3c2119f7797abc85729a6036116f9fbe5840226d1b6caf81bdd8b575f306f4eca3e9b0536836cf1963a00489573f9b87a657d584f0581df42d848144b0526850fae8a7c05803c2fd789e2370b4ac943e20ee20e807a0b8e4e64906f9de9f2bf8cb9e7eb2bb6a1eae0be53b80ac4f206e5263930ae3aef6f072a6c509c035a640708b939f14c258a7a805cb3db09fb674a5688a51f70b5e834d2e39f917ce6dc494308509f6b50776d770410c7406cd0db45d9571b42e6639f04fe44c47b1e901a11dc177d3aa919814c53b71492cea85e9b332decd809470e67c4277d298be6411a3e76d2e2b8d97ea751900a26a7579c029f0fd95ba6fc4aa33d3004adb44788073555e88a051d2b2f0784f32582455d2023e529f346ea1b617148a030211cb580ca9c055b194e518d7c7915b6e4da699dca9725c77079484969559bda5bcb912c0433727d7bd5b869b858ba02577e8722990e1500ac119b022c403bd2e9bee4b4eb037717b3182869c40a2830629981579a3041c5821ada35c2f2c941535b76bf87f25b514a816938a776a7698e931de3d4e6f03f7bfcce8934528c4e220c0ef6e1e96854c777427c698381d561d4246f4f196b961e1f3fa78947ce22dd38760100d1e448b2617dde131bfc9b65c45da214affbf1f3ebf536c9bbd5e40c467487ec90185594a9e005ac2562e422cb92252a92e67883c9b7dffc95ebbd38a0d130ae104ca1f3b6349a3c88f9d71f52899f99a87455551f4e4a2bbd56d5e8ad54a64d37c8575af04044cc2e0a9de4bf0bb96adbefadf256831e5e1a5e53a4d5c78ed1efd39d4ebfceac62fedc5df97ce01ba4119dabe0d71c039b964d60f480f093431fb69b598ba47909e0b940e7efd06c4f34c874a909e1a3ec1869236116995baaafba7b02bc8b54c6bce76e3582a354742bb633d4539ca35889fcc572ff888e0e862462d1ba4be5a37aaf0e6b9c207d19deaf0eea1f13aee7cf4c6db0a486d5778e3f7a4feeacd3a703594811a4118c4935fd2d72d40f6aa2d3a244a16b5ad8eeae52eb03be76c7da3d2d46b0043c2c0918e7b9f4d9587f907d4572cfbdce3e7acea4dd769370684511732dcf236903636fb4daf998b696bab67f1ec203a8af24d67e772ed6645fef677228f76962b95e22adb70878f1572664967000a3b1d5f3af28e1b5ed1853e128735caf3eeef702191a79a9e1d069de70d3911307b155ef3fea44934254ed213abef47f0ad465583d4347643b1d75eac37ea9839570da206f0cc84e3be2d5b9879b16ef35ddaa67746f4ac2ef9e225044dfdfd6b7b50a8f28d594704289b2b0f652eb8827d16e38a7e7aa4a631c191ada3d5c96d4498d43508fd181be102c0f6e2a9ad149785bd1bff48e85005e01506fe2484a53f50c44d080a6071740ecddd96c4b530199173ca2dc1ef92e2e83f8ea14ca7b9e7f2f9b91f03c8cb4e19a221e612894b8fe4a813ae784305652471c321c0ab01caf9d4f7a29ba97ffbbdee7254e561ed76d9da66d5fe5b2de93f4c331423171354fff68727249b15f955e33d67e0079c4afb7b5258a6c0530b932f6cecd67475125fcef631211603c38c50e19384c2be98c42b549b23eb3b28cabbcf107d3b8d8fb3deb3452392fff6db980d6c362beadcbe3afc11d8644ced4041d82369e4e32976964cd7aeaa30efae292f5686bba773644aa75136a3eeb58e8216aa3ef91c8c1296216d24b46d2a7ea4b5e6f8fa5b1930dae4dde122b70e1fdd18f96ef08004325eef7a1859fb33e76b4f920f509c2abe6c431c5a792c737eb34da56c63b43e4040f5831bf361a8531d3afc2c66d124675f2090f51fc57225b52332d9bb2fa6b6fce21c822946d46c0b2669f295a092c6542bd0537f0886af534836196f68ba10d313aafd6401547ce5907fd47570f245cbc35ef82f6c2d660e1b03be18e604e87438b2e02c27b5101ce7b2548ec8cf70267591559966d2f4561a403a102df3a8409fc8ccea3062b011ba85f53a1e86d014b12bee559f13d4bbd450101db722cad8d7613636a1d9f774878f390ff8b4efe7046334ec6b7c81bfc7d7d27a080edaad6df09e99f2a730b5bd228288ddd62a4dfdebdbb6625985c2633be3bd9714622ec21b787cb9470645e9d4743d34771989fc3a254bfa474b7444f0d660eacfcbdd822656675c35e2b58c398085a2f4285b8db2a435b9d26d45db8b2cfc89bda24a1cc5bae251f0507522b63a0a9fe9e1133109fadc276745a7958f5a08ea5a7ff4f05e08663102ca153bdf033491d4de4174947bd7a9927f2a0161dfee9322af5ebb73d16b8fe9da0636186e8c0f217a76c6e6c980d6c0743dbda741360aa2caf7bc9bb87ab511ead8aff6fe798e7c4023a6654690359dbf6318c40077b7675d50a23a001c5717870d17ff15958631b9c8a1b4756e2c66db2ab15ca02c2fccd0e9dad34ab8cc673903fc9556689cee51e63748f87341d8320505b5a2bbea5fc023e4fc1ae8ab9d6b6ddc6e335b28fea2fce59732580c5e6e7284738aaf6d9c95af4f18d3247b06b89b25ce2ef5b10f278d2b23a584f265eb03bc1aba8f201febec87be15e4a14f8b2c6749cbb0db8c5a177672d4728a8b22392b2fc4d3b8361d5c0d5055a1b4e46d821f757c24eef2a51c561941b93b3ace7340074c058c9bb48e7e7414f42c41da4cccb5c2ba91deb30c586b7fb18af12a52995592ad139d3be429add6547e044becedaf31fa3aacee77ebfdd104004ad047a57f3b22f3d73e0dbd420c3b30985cd2f0a63c6c6ff9c1ef8f54f82921a45ad2e308c81f93c6156b97e54920ea6a679f745f64799821c7c3c0e5678975aa2474d076abeb79e66c7e481bff9de21706c2f72f2cba49c18aa51f4381ad52a8b7be0c3d692f2ca4adc65c3a921ade1ab4bdf79a07970b556503f8d3d91d6f3c9f1ed4e1825302ad53c432e5c31024e1fc10d42487a8436a0150fc3af05221e25507f8f789efc25cf8f86a91f5266d09374c3b432f56885bca1c87cd49d3f1164419b6e3e25db23ff7f371b39ac60cfd10c08b9a513a50c729d72a2f682b736516b4bd3b1e4578c2eb25c6ef36678b39f32e538ebfcc2328cb1161c5bdc12f4b37796a61a00f7c924d0008995a936e4c68e601a4ad7475ed084bbd24bd2d6b2510c85cfc1a44340a9822854679c23cb0ec784450bccbdfa08bf69ac108c8ddaf4d31e37eef6c45a8570deb7b068c6ce3e8556a27505ab6dfa092892f133bed364736bc4e91e017f7f41299aba34a7562072e019d2a7991f6f0b016c35eff2056995745ff9458318619d12e5cb294fcc7a34299368dd0f782e6dfb2225e7b0d8cbe140f16893d08bf12e9f802c6f4596157339f681cd96e001d61f9c094480b451fed7607c2f7242f899da53252d111eb9d8192c639fb5bfaeee74c3292dea01c59541967e42f1a33d89cb47fd8b3cca2d0ad01b567cf57dfe5e027dcccb7727ed4d8679b5f3d3188aa47942feb24d043bb266ada48cdd82b9ced1b33b46ae8e91cfaff36b6ba208a592ec2d6ecacc33a978e4c893f6f536a7e5ea4ebfc5189e7bc3c4ebe6d1e5db57fc2cf196fa42be400351566de3c5028f4c54349e703bc072cfcb48704e25f8688a4274be6b360fc8fcb53e787ad64c3bab174f2070a15a3d9ecef44f0ae9c9a0e335a02e45308d090a1868fde4af7d71a93c858fedd2d6a5d6d4d6cb2cb9b5c7b00d5c2dafb8a0cbd683bc4348d8fefaeec9c0310e559a7220e6d62edd1d24a498d28f04d157b0d508fd2294cfda369e23c9e750fcb1106c230bdcbe449e7e00448d23fcd49425f0478f8236a03c8c24f041e232df719e5a884bd0c58ac32ca35b46ff5be0f868e43b40c472e5866a56fc3b991fde1aae06f6ae9a89d615945586030b691c0adf798d18d090c34137faf0bef4612136a736163d2353511b1fde6dce2f70b152f376e51f8ed864f45ad973d3db3fd14cf1b390ff516a225d3505b7ae53b6c7580ca5ea5ee792f0273dbb2e81360016e5f4450bfd0d1873633f930dac5f8484a593cc45dcc1058e624768c8d0eded178817b32f3d40a369b6a35116ce3b2213c0eeb49ea1067a672ee0a7eac8e84efdbdc5c7a5c9d0542eddcb047b1ed0d89a3187259bb69c39a31270413c720f6bef0d634715a9a773ea601d77e3a404ee4281c5e7e7226d8a69975fff65d54b8b16fe5afc26e3ab48c4c80371f767c0ab32370fc128ed5fb5e14316a70ef982f79a1a12ae8181c61ae59be4b95f6fed5993dbcf7c07205c0135a1fb01dee79df8a2e9f325ce8adf3375642818c2c4713e8cf56ce02bc24bb88a3677d77ea685d456f26628b407ddd99ba83656c86f36a2460e4eb53ddb13200b8cf3ef953e20d3dfbdd181dbffaa557ff1783b1a7722cfe8adddc3e4749e81dd2ad512ccb8583f65d29df6ec7a2def4ac6558e60e41f0c9b5b81d2c993d3252b988608cb1b145e0fba33508f814eee24b0351941be14a0879fa2a993439a531b5f6f99396f3c7a06fcf9566b1af59c343680a2660ee8d4d301a811eb89db52d506f78dbfbdb7d9722059d229500a3fa3e09ff277dc85f0a809fbd2796f7e6b821585ab040c6fc37aaeba8a702875209836f8d11b2ed23c2d4003b4e4fc6ce64a1483bcb1644b82462f8448e9ac1e873cc1f407fa0eb7ff8b2d287fd5388b0b548c58886dcd335dff2b1ed23ce3eebbb708fb5bbd831c83e959d3faf32cc421c9056cd7e1500f9bcd28f2f010d5cb06309376960c95e90e704a6aeee7df0072d0052771b4f4c785d7b0676c0d8b9eaecfebcb808e4d06e9478a5723585925449216f11e8fc24463464ae50ddc0c50fcbe9764e1ecb25c5c98a10061efa31ce037bf32a51ac06c7d417fd49a2560c738221fa781cecdd1ae8815cf7054c4ce8ee68952cffcf8281af1d59ddc8f90edaa260cfe28daa44e2941702a172ec42296c7fab964de7261837ed6a69bc3a3a99aefe5d09dbb42bc13eb397b1f25acff3f039ccf2c6735fd010f0a589e69a1e24fa83285a917ac01b5adf92951e2834fd2c2f7fdee4049e6daccf81baf28938212777c851497ec0757b0379c730d51f9972b91a97410b60256de285894a880702b844937a6e208b4411c7b3c4d4e1fe5d667f43d8480843bbf6d227516927094e2f8240526a10bf2ba184e71a94bf4fbd79da81fe738bc775ba06fdcfd8e6bd67efb92565e7bfaa80bcc36a34dafd823e1f633b965df66a074a096f311437a1e49b41d931419dfbe7d61bd3a0220d3453e9a1f71c51d889d50951f241a5aa454894c4c221122c11b56ff6b9e9046ee4934b0f4b1d19c2c5637a693d6df7af26087eba76c1d3fa9a9decdc737bfcb30170c6138e04f0159b373fb7870294c6a2a8bb7b7d9ff189e4f5ff4596e5754a2970ed4756508f7189c4bbd595cc078179bdddb03d28154a8f51f9ca9a91f8c4ab2813232aac42470f90614bb016ca5fe99c47d14bd699bcf8367eb4051e018324eafa2f8164a3069b2ed2728c7f57b290d8ac6700380971ce27f0ca5cf62a36254de4d4e1164c40baf481f271622a49fe075dda10d8eee96f8af2560896dd3e0ad575abc03d8885fd95f234156bcc568f8ceea2f425b4846ae3f5ffae9c950b63f62f2ca546f236c16795cfcef8b898d3fdc17a009ae4e32ed76e1fa563dc3ecf4463d016df13e3a4fdff2e34a5795159ce98a7ecc51a7649b9ed4e83893d488b34d62e8b42680d26dda0c7bcde89408f63b6b50f20afce4a1fd5f4df6912a9463bd8a0892d6923b56b0d24ee1062c6e371be39fe3a2f5b8e8dbabaffa006e17eedfdce770c81b7df4a96de3ef78055046d11af206e139ea5782df99aba7471a3bfb810fb4c5c4a12d0f05c25d07c8b50ba537d1c58e7182d539249071505ea43259a008c89535aeeb28c174947b1da66edf62c4877344864c47a21eb4c15abdbb406258120015ac153eca80fd9cab2a57c6c554b5565b00a3f580cadcc3e56dbefaef89fcce0ca49397486eff311b49aea38508b5005df7c28be71c511ea4bd23cd6e23ecc6c49d4d7b62c70104140b5bbecd69f039f3749151fe9d7c9a41b4d20207ac4cb1e29f2a3440116ddb3f79465fc3fecec8c57ef78eeed4c3ff645bb4e0e4ae835711b215090bd7aa7f449a58ce8f4fb8777a1ddf8cde4a8f14b4b8afb12ab0f980f7dff341eb9e20b8ca7777525ae4140cbb592e91f78549a2dad6acbb043b16f43c2dad2507f0374d79168c354c464b502f3bcde6600f57717dba944898d6427a89a52bfd88545708fb8180bd8cfcc60b7fcaa4d342702349466e4d9e0e09e5dc864d55119553e8aff5c03933438eec05520f9b9fc52e13f2ddf9c1058f5c67e0da2f13a85774520b12d9a1df9885240551109b9410d39133e963d6c74358304f2d534e0bf63ffde4f7d69f08b467d8d524d78af84ce704d613b4762b5184a8f029bfec83993c52024fbe1af7bebf6f3b726c5214a0f0d4a102f58878e168388d747dd75668f4b72cc09afcf5df125100e3d5d9303578685d5e2ef4f71d8d46ecb695f5cc8cee952cf2712c483feae5ec201c099433062ad2d165a2f02b7a3cd6980d302f2db255c88f4b923805ce95c6d149c887c12381c701a47aaa33b78013c1ef6fc572c95dc93c31160f5a47c9589e6200520755d50596f2636f5ecd7c6bdb439ad884ba17f6a329a01365dce7682d71983e2e278f5539584885d34396a68b0f98ae8b0de9196c3e188e4f1558bf297d78915e1e157d92dc0e35bba1388b7b5d538fae4b3df83f7566c63f7a8425388f8893bec4d04548899ec73e70c9e45334b2c515fb7a5dc2d872045e94d36102aeb08e77a028770464e0838337b177ba9d9d97e9a5080ea06e248fd3eaae3d30e2d8c8b03a86d96d77bcb1b37e570d599efc4c52d14fd37f3f65b1c7047b7f6a33e88a921b50352cc91b98f5ce256dd842b72d7708b77608541bb0626ba3f057aac81c45caf051e862e38172ad8261de8eb78281d1a8bde2b430d5cba68f58a04e60c6f0cfccf54a4bfeb452a6d6af138ce29397b58a72b5678a682b3da67fed2898d0bcb34eebf98b5279bc3e8a20214321a7e23bc55b2b7613b1a9b94f2ce53e5981d0fddcfa9e2ac918d8ff047cadbb5d078aebc141eae8b1f76ea1f429309a89235535e0e9e1314ad8cf70ad8b62fd7cfcb64de6eb9ac54e84a27dfc3c774412fc72e4c18169a7bc03c919ed14e51068cc8eea9d23e416d19e6bd6cf2e6242da555091e78adf9409dfed832de1e1fc07bf3b494caf70e2228ef432d5c6989ecb7516c4baccea0018b56435d3b8fcca431fe5f25d58e531299c631c76cec260cca6ed05a20e33f4d1cc56b74962de810232b36e36e6eb0bce0fe1191a0c878ec42efddd071a62771c6eea92f5a730292e42ce4441212c79f93195b3294a90329d566dd351b61e92e1e1484d414e9acbae955efce4d14d829248a8710b4e84533e666670e8ab0f4c086e99709421c36d6a738a1f89bdf92f819d41db28e00cfa8fa60f3a34c0dead795d058455e6541a4a267a3497aed687ae78897ae8cad02e785d91bb9ebf33bd1df6b310ee66f4d736f557c3766c8c920120a8d5b4d377f7e1d5137b8c6eb585da81cc9cc6694cae162749548dbfc45863dfc575f2c2aa5db254be0167970d0c994577b045b704a6d2057770466f26e2bafb08e00c601069d323b9d59800e35a438bddd5d317c3c752d70a9e08435937f0bd9aa0687552222c8a2d7f8572de78be9b2592d852311a7fe529673c04065feb6da33d70c91791a6d0428798b4a66df4bd7870bc30f7a63f76fd52487ad46395534a3d8a2308bc273f1f763890e441cb39fef6e779bd747bd3aee7956d6c4ad4b7b82a204cccad981dedd4cccc40fd2d56deacc2f52a8a1c4563ae8ba5751c92e0158b990d0c6ce2b3d327be3161a8015d411ab36ce7f20812443092e998e1b61788e95d2c70ffeb49faf97587f04a2f964ec923a59cb429827af413037da228a439cbd4719f709d278ad1599694ec9e492e407b69f0d665df2d8274b9cb67d0cf51b966a642c7df94aa38d225f69438be080721808b62a66f84631fd42a3696e0f83b7b91000a98da82b548febd4de43d05a77fb2165fd37ca81e7a1c4419621e55da7bfc8243b23f3bd023e7921c8a0d4da7fbc739d6d44cc13bef58be171cd2911dcead7079140cfd11cba91d0b1377078fff869bce9127f643e5524338ac44d38ddc6c71b5a688ef01a90c052165c35ce8f2b8e54ff1576fbdc4d07985fabc44b00d032dfe50fd3a2723d7f366693973383c25be62df235531f39b0805ee820c11ca384d5cfab1050ba2d48ee30720750a4595cf0d40d2d027dc7b99c171dd523579d579d78ced79368fc97f9f28c289e374d0c05afdad0728e637d4bf69173ea684a05878eef9be2f507f6da2b265d84d339d3851fefc23bb79996009c076faeb51629346091dfb7e4fbe01f58f5289cfeac6dff92b074b69fd67e6a75c43ab8c4ae2d149c3a159acf24de39fa5d1c5f2ff115e5a6c15a8b9da6a0d9f27c57c11d5eabb8a05ccff40a3f6baa8de29b43cdb475d7caa6f6233796a7efb074693035c40f910b8e815c2c97f2e1920a47d37e6308368cb5ea05f402fe0c3e60c18ea46ad32e4c23bc5bbcbb1e9f95588496b88937925b9288ac69880dcfdab60344cfbf90e0c0d0e35b213549050641e3f5f2a39e7bb5a1549efea261ab33e8a0eb3e3ec37927fa88d2f0830ce2735ae889b32eb7333986f05629cea41ec87d2d0a6664e527d0253f6ba120c4885b0804ba70a6fc8945a7ce5a81892f9b16d809faeece60ad67d5598dc99b2a972bddbb10c188d8ce687861248c4e6ec09dbdba652dd7d04a4d7f79a1c05e897f64409e251c60f683109d3b4ca0ab0c0fcb62c0a1aa1dbebeffa812403bf77ba1a2d5005fe7bbb037ec7abf2b751b61d92e7bbf68ea0c865c0cd3b60182d27bce560f9429b9e5b06d4a958f49600c1acd456d09037420c1a1e386c74e3b8bf4260c54bc2b199b5183c9721e3ef819914c9ebb3009cf06eb411235e88ecc809f7914590adc7d392e2bd794de74b3b06fe798fab6f4510b8d8a17657c5bcc6cb8082c60e2b66b4b90b5f3725273096d012ed280205bb0cb030d719a052da18ce883b310f6215a4f43c2abaf1cc29fabef72c9ffee9854a1f64baf58158ce28dab5c26fd97d5c0b091d27e8f9fdbbcf9a563edde8442b34cc1c52f041ff215db7af2167b4a2c351c1555daa84e3707d2ad62cc9083d363081ffa8f32a6e5a1e2c1f6000eafad3dee48dd5e9dba5cf6c3720fd4aa5fd2da804b5c3e782ce01d502ad8524c2ac131b3a6c958b476d600588dbb94a08ab98031ee7acb292469ee901009aba83e00c6e8a9ba7790e60acaee7b069b07a7000a9973d693ea2ffbac2f1c1a6a976c044409ec1129c78a83ad01a4714644174eb02375e0471fa21dcc89a97b2dbe37145fa3c87dfdbcf6d92d4ea47c24da5dee476c6f38435e1d38d63c42bc537121e97022d95151d59d63d201f597b55f0d6706d0ba3f271a13d54fb3625e7a54aedc0c23992bc4c600cc21e812448636886194fcf17550d8088b9f8b92c200dd4064aa02727dd4f2a37a935d751306057146684daf6b5f0c7dc44c215e87957f892bd06c1fb7f0eff7d7bcceb873c3203a8df74f4e91b04bd607ec11202f96cfeb99f5bcdb7aa712909bf4d836f73c2b56b0d87e5988d30ac3dee5d7722a9322ea27a0714026660ef01fd1f68b0ddf8b484772674aa165cda9a1dff0eef8f92d076d5725e85bcc3988ebeaa62f382bc4a1ca6b76bc8bb7090a0910d9d12b5742b5c390473e7b3826dd7885639e06bf7bd5b20a4909986551677d4f1ed3223c1887d2d251ad15485b605e68bb41e9f8f56686f53acc67ef1b4466e11c6f8e05f2f01393d1deba6b4bb3f5db19c56266e5d6c1a2e86f6ab2db235e5d7f00cf438680fe5b442dcb1f8c3ae7730b92f097a1a8eaa9be8d216f2576ec3aa321567337bcfbaf2524d7d371779bb70d3524f9dd4f7a6049801c626ed168ff155bc4137af6a3f5f14e5135b00cab1dab26600bed5ce96d05f2cc3b2ba58d21622a88b2e4e08fd63524d7a4ac4c6e2d41d1425c5633c036705fb167f075a13805e814dff9ed07a67d22cbaeeab97d5c7de04c499c76974315215c6741b44da97d4f18d92e8eb40d15d2bdc2dff65121cbbdde824497c71960e23db78403fb0c34b9e55cf7381d70bbbf2e6f1065722397d48964d309e82fe00cc5e75bc731b6c8a30ac9e89b9c57bb428e3210a968c88ececd8fcc6f630d1f1b95652d807a5fa5a509be770bb948b1075d8a55149d86fcf72b51951ad0277a992cbf7dc23d6d583a6289271b0cba29683cf6523998f58ef81368d1aea8158f0fec64c10f13565cdd95e87d4c0f3270ff7cf48caae38aa15c2613e69d633dc8ea54d38bb964a13009242aee1129384447ce1388daf5bcd07dc40158699a26c4a306ba6273d9d45e378deefe0cf3320fab80c1db3c581298e78dbfab85a566eed47257b9a0cb7643f343933181e5c63fc5358dd85173126713e38d64841d64c3f9185a05d2b1fd9dc6d5b60d22894b511f6cd614bcef32c7ad5618f7e77aa6c08b792fdb8c35d0b82cc4d605614667e004974914d114fa36fe65e0fa2245a381060547af2fcfa61f9f81619ec0b572692f35455d209cef31918353cfc6f6e161f35d40055fd7d45089abe75dc35f1158f9d759624ddf7844014f000d4816f70fcde197527ef6e1e795a4e5b6db9bbb4bfeee03a89b652beac8297427182e5ad70022bc3b1f9565312dfcdb2e8c03d69e98f9c2b4abc680a240830ea1c995635434913d03b44bb4e9cd243649571009dd727b14fae16c0ce7151c5df1dee4c703d5dd8860df82876dedab858bcf58bb94f5f2890ffede3735b035d0bbcaa4ec625e382cb6e3c2233a2a03576a57366231adf08d583685762aac7015541f5e59fc5861a89a83833edaeccc1a698141a45004e590584b0a6022644b8a5f3f69763e3eca7a70115e20ccb0565d0dc002e86c854240a48ec57ba97238ae31bd6ef7a48bd310dc2fbb7f8c1f328dcba5e2a4d3c9a70cb1845f3f4c40b7ff701bc724cbca2c1a332113b1a583f12b27a56970422c845303be3011776a5a0caedd1aa4107425d519b80f5d858912b3b6412fc124386ab21fbed098b7599f442273d1ec2f04710ff436f6e9b88907c5dbfb7e1df677aab869e8c94b7898e8348f62756354056df9573072cccb1e50c01d570ced3554f4c476de729057a2c56c5a4b7db04bf1ad4fb7370b9d19b38e310ec634c56d7ab974db02750dc0f1c749f771734953538f6198bd19d140e300a704db8e2d0b337927eaf7391a41106e5c0b86ce9526a5b4dd703525efbd275880b409819a9b29a47c3b1f475c64991b20eaee183a22629e21e221d86f0aeb065c70c2b78499c7cbe0500d183a87c66e273a39b89ec304abcd432579d5a6c89aa8efb9887183987fe2ae23344b3752d7dd6ddc5839a5167e3e3792b29a1d2a75e475308ce7f51610f1ba0423e4ffb8d8c1ea585f9135128603140bfb42ca9b389da5da2d6e4abb2f9c18125fbe5d52e1635430374bff8343aa8ce3bc565b854332e618f26b01023c403cf0503dbccb92302ff697c060d34792f6dc8e5b3c933652da7f6464c485b79c8d009dc9ba8d6bc6d21dc97505acf26ad638e9a7ea2f727be7600bf1e1b0320face5a108b312ce75ef0864f05a5ae480cf9b46f2f0c497fc918d4189051c3bf800f1f27152e64aebdb58f2b8db778e7337762e92ccfd17737d39cd909b1426042dc81a7a069251972b91fb35058d60b0a25c292deb33616eef07d8bf104290a287ca81a93a8182f66415c70b74f70bd794af9f1ad802164d7b6a1b5af121fc61a39bb0758b4e5f87f9871e92866ed046830328e02fd396ada6f30dfada3cd9b0059e3f75655337ca60584a60c63f6e9bf1d93f243f3272fe0615191527fdb91c2254771f552aac4c4cfbe30cc0f3273665a44a4da2b92bbcfd62d54066df0b048e510fd9d75f3d7bf3f460ece324aaa452f6e2c2d6a23179114ecaf3137b4017ae16523b684b6bd819d45c87c94e59645e33913a67b824a0c63b52b3ba3d18b41606f6ca8489a7ff031e2e73dfcac404cc0cce0ab25565c2a0db04e8d7aec5683ac555fdc894824f64246f2783446af430c501ba62f4756d15907a38d83b06b2a0b4085b80f68b47a19987197025deb1310ec4dfe62ff3feb8edfafa488c2d11cc65864a5a1a13863ff01ed012f96fda214c9fd1b86231f5ff563fc3a4fcd904324c4860c099bb69b3aa9ed1e839becda600eb365635eff15d6b811b8a277b1856fad73530dff390912b7f956c514c0a23be4f744c055e6f57909768447683bcced3ab1e47675c695d1539911bfa882e1ef73522066b3dce7257cb408064936ffe894ca250ba46727bda756b737003981c2e24b611e1ee9d3233952aba9c2ab06a6e24680963523a720d8b7b0f6c4ed69fd5a6b6fae3e16a1bc69d8d4f67aa1c9704dab5cddcf03fd40114564c49ba681e70238b2debd6a393534ceedb71a202f8dfd8320aa1b0d126678863c682d6db1ca033c937840ee83d9c1bd5db249302247195536c3c14bccd935049eac2349e1ec84ff784272a868ef392d8cb0b0da8ae4caaa05f068c514e37147f3562543f997ae08ca06f8a2cebec3a4e278f7254dad3709f5fbb882d3ca54d5a42fda62e111a9dff28a7de49f8f88acc7d4c51a54ea89fa6eaa5b8aefd7053817ffebae82a29c0c5697a774c1aab0cca38ac2bf87e3e705d8c7f6e55252adf8b68eff2fc294af1760f41e5c1e57628dde63971ecedf7ab39b18349ce283739be8a3bfee8a2d0c89776b8ba49cdec675e027ec3f1228698b1f66bab589b180ab1408d3f2c3b7d8ea02c296522586050e119e68283904dd16cd78333b2d26fbb0a483e24353783ec06bc2e670a09947e0da8fb4e32dbcfeda0b184533b8280d30ffdd94ea24b9649519332405f45db371a1c47878d497f361420c98a71100deb58dde93ee1cc172f074ddf71a0b1b724ccf035bed18dfe533db1dd59e20f695c6b64d845725da915ae48708b6cc1aabf6cd15054ce0dafbd63c13a421cd515bece2f3122e264ae95ad1fbffe11fa487f802c21f9d13d25ed4cfb6ac37005b57ad7999e37a065aa178a3ff83a3ecff2edbd5d151e69b0d35b5fbce96e8a15ab294e3059f43af52e13cc25c3c051b74c727b00c42315fd4a9ff2722093c989793268800ef91087ad32f97dad30e954b7b62fa399b85476ee23cbd7bae3ccd5a23edd1517b6df9199cd88840f0c740cc71161a2103eb3b2507f324a12def29eb897024c2eade6a7967bffe583a36053fd2ca7a8c2369233f41adc45c2d5e9291ee37ea19e4ed43e05a6d62e85a65cdebc5078142a30ae705b7f10574568ff1957acb8c1f13a16c979d691ab9f75c7e197354970a2ad370bf92474fb0528c2f3f54b3709c1c02cee6593b9093ba220111033924ad60cea4b5f9370ad9c65d32d7a5770058aa184f14b66c2a3d4bbe3f1b9e3e90f4ee026c2e154a9eb75d08e4a594a0a31a63ecd86bdb835281513b1f7f6cec44a47c77b1740d077312bd972cf14ab5c0abef855231f1086f25759e888494caa688b13659cd0af7f1b28e11f102ef3ec1d4f7eba3af1f84e8f25ef164733f611f6736464d8234a0815f797f1d21aac30d5b2327b52d8e7e27b0b43c9a9494371808b2af76dab28c89e025e89796a3cd0c081a406ef3657e93272185122fbcd6f734ce7abb1fad4373fe3c5447a903e326a5853eb848cd0c941e4bd6b48cdec625b332ae03974c4ba58163cc15a2f28ec3f80b2a7a76eeb1925fda3668f3238d0b4d8553388cb82e89314456e9c897554bcb550b9cc3eff4f5b077ae16abb3b510ca70724144187485d587fdab641bc026e40ae90578f95e26daca44a6fdb5c69bf19a11060895a30337d4c643bea557bc0bd3cc9fdc33768ba57a0200315146168bac3b6f1f57456a1dd1bb991e5ea3760a58bd5139c6c48dd830f00c8fb1bfe8604df564d385e1225029e396cc6e2bbaa840c303d5d9d0943d9315b35efab879382649cd6a480093988246200ffc77f1ac34e79dfa9523099a4c79dbe857ba31dbde3e922dc72925bc85ed2031301084dfdb3008ee224452b802246d73ee4c78111edc9b642be44086d9df7f78337dd909dea62af9a7bbd95f5e1f5248e7f6b6a18e2cd0579b +0x7268dc371d074f606ba817ad4a8868e55f391724640f2f2bc85308b2b27aa312cedb9427424dd909abe8ba28b6ec7e693894f867712b86754bdbffdd5eb4654e +95272 +0x71dd3fd4d9b0e6c8835a2c63ac37d7e4e1a987fc67f83b39d95d18c5135966504f4bdc4b8e421d573a1082fd09a01a9f2489efae89e28b1ead59bb17667f93ee0966b253cf6ec8cc7e5c556245acb399e72956a61cba53dd347f1f69fd1c993fe7554b5566dced0e98662bf92804a9bc72b1434be727995eb3f8cb219ed9812d30412fb719339707d0578f2c795004ef0c4a3f05b4d2678975eb47a9125e529f2e51e4e3b11bcb9e6d5706620237cc19fe1cd13c4963c446c1811c672152147c27aef43ff63e93bbb98d1a0489620a24914e81586f81b97ddee1d1c5925ed0ae647fe735af41f646fa225278d779c6f70a08d7c1eed44c161535ee292f298d1c2ded432ba6cffd28793e3627b423067ab4745ce08e0587f9aea2fcfdbe5c53aeca20928ba18eae477e074f79e708d495d6b7971b17bc720ef15282a8089e2a4c823f5bbc6926138c50a824d73ad13730b7fc10db50a0143e256d0892d5981bde9e732726c64034df39473ea773263833a0695089025a756f941a1623edf12d4c66e37d317f8417297f0d23525baedd86d926de8bf5929d8a848235c31752697e22b8e5455e99c6506b215d41ba123012aa5c424bf1ef95783ecdecda1d63d55d1a19e7ca2928493e45ab74db58fa39bd5b33052fbe19641f0a22c4d0c5cb7ccf962f0c28a9d8a6d955d5ee87fc0cff7033d2aea123b912692fa9440dd83363bddd21dbc7a652e70be2c555af70f38a147b62c508ea77a83df78cf4f91d4294103818dd10e83d14bb36a330ba7a55e28f7c0ad3ccd9fa2d82a8f05cfd5ea116aeef3c9869364233d197980810e3db10cb7bf35f54b9eba9228bff057f61f7f1814ab4963b59094e344ecc6419722c1baec344f10a51f12404e8e176e9efed2d7090a95fef1a396ccea366cc3cf1f10b229b2611556bb5a71007be37a1d02bd3620b4279eb3f7a9686dd8ec8e426d1e80e4ac1489dcdde392e2fbdd111cc58eb4101a86e999076d344466ee176db75bb59193c1d4b4015e346aa06cb9fab1c7bf4bb02c660d7d22bf0242b9e5bd6848ced50c019c58c02ac40bec2adb534218d63817907a7da39a673c0f088fbe0a761b13774c274794c9c04b41900ba300c28769b35bbd862514db362e325bec086448d1581a3c0cf9cbb7bd4324a1668885515505d695a37c22799522c000d40c83c69340e41125599128b65361630a13b1b28e91a9a9521353c0dd7f49e4e2615512dda4426d0d4eca81db14ce972a6cd8297ae93d5f1e85295f83a6389eb3b178cc2504bd964153c851afe9d4d433ee7924ae7f1a2d653c03940c4a0484a4773f40ede4ae234dd32b2689551c90b30315429dc5b89ac2c2830cfbad463d512d492facb69caaaf77636f1be8fe6334552cf1dd5fa13db3931838b672662f263e06c6e61d2172c2aaf199bc07f2a2145f30b0c19f5c7cb4384395e12bfce0b033f8d53e6aa54243d856450e54a1f3ef8bb11e0f1752ee411c85a2f02c62f87bb9afa8fa31c06f9f9a21ef773184df22553e87fa5a2ce8f6da6efe580640bce5199bc0ce04db71326ab4f78b3103ba6966298d37da332321dc6ff6ad4c1ec488de3dcb0e568eeda8c4bffbbed5b71c011912ac2c0a1df37eacf92a54604595d39216265f99334b6f22837a7692077aa5f88a536b8c35f049c6ab07e1e56db751bfa541265f6100f21eafe266e88d6ca48ee1116ab323803fb3e62dda3def9f8fd17bc9f72bb0a4de23a5d2045bb158a936b774ae215f59acef4afaa1ec53b4ea51fa1f36507aad8fbc05b7b37e0bc510aa9deb9a5951b33df33a0cdd73229dfdbbb0cf889057918342300208a205386734d4e4d3cda3435f4a43c2f164e4c136993049525dafe76570b54f786a263939702cfedee0bc808d6ee8bb623402b53164e91b280b1c1582a2260e8758f73df3e6e6a8104515d144dba954b45314e05a995bb38e3b04b27770d2bdc9d0e0cd22f3926f2c6d37dc021b063d7c6493e93eb0f8b0d96ff234c0477bdb94848b5d4340c0c267cbaaf761977fc40ecaf8263a465081ae1c7d12d99061f69bc64f64d138f22066e2d7c9efeb86870008ca2df9b3e3b470c30de34006258d2418b57a59569727ae4556a9e981ab04d4907276d9a432a7d5e61d1c8003470de21e561448242046b255903dfaf46dbc111499877671cdfa22083325060247074a2999b93a2c4debf7a62cfc90be3f1b39e7a7d64cb70629f9bbd8a36e9d95f7b0ed08ef8bd950a602b9855c5739afb0a3ac05f9c8ee7b95d143860e163fc45ddabb1c0dc9a5d903480221d39b113ffb02b46c487782aeec3d61b3cb996342b81c265bba802c57625c029af8e8bf5088cb932378d51e109b8288fa626492a184f9a1307c2bd74c61a35d4942dcae91b862ead3d16e0b4102651bc27904686142f7de42a94931488fa254c537c36964286d0de608aee490df49ac9465f53ef2709b100ae844c4ac2afd9b874e596a58474e9ee2751434b070a4bdf8cfb390d5ac57f8e1bfcafc07e2099417fcfb3bdea38bf041ad3a7600750ac2580cdbf89b44b2fb6f763851ec335ad0ffda256877abb9a49c278e23014ae04c4aa3baf0b3d8309a2cc21960b9ad65c4976c545aa3ee3c4e5a6a9bb64360c9de392aed03afe565577219eaa3009ebef1870a249cf3e9984ff4fccfca47552bdabc18fe9bffeaa5a607f4189351b5caea375a0299e81c621bf434b6b97da68ad44be44c341466961836d74fac1d511e1130c27afbe0f50e44e0c8cd1e66c36b5d511372669dc79b208739fc77c41f3d08fbe9fa1d8f02115d432f9f53934a41c8643ced9dfcac495181928b61066e8c3401170c8932d1ffc783bf8a136389b2c81db73a64a183052dbe87890224cd9014d8f03ec98cc34e063b1f39b8882012beb618d5353cca7307867f71c5dfcafd3dfc0bed58ed8470bbd1b51acd51ac062ef5d84a9a1f01078171f0d24667d50811e2b0a4a1e563fc3ad027a9cc606be19b258bf70dd8b5273e296236ee8d7a65331585014f05006515bedd6330250e5985fdaa870aea65766ff569fc48913989041cff6fbabcd83fdf064cd3932001b261c69a670bd48069c96e7ebecf1380d82751966c7f8d69e0e94efc775fd1c4a0c118f213ab179475cd0cf6daec94eef6ff6bd06407e723fce6e172cb00cae599368d38194334102edd4988fd4b95e25a0eb43402ee6a94e83a76364b206bd300046bd2f47eba91f98cbc9b824686e975d7d347b58d783b376665cd7439452b79ed5d6911b80b887a5ddeb4f687f892deed4161e87fa0956efd488ed2b5e74d6b43da510d79b77205c3185be66a5b4cf9a17749383f742203519710f310b2b7589a6b31545e3ecd304f01f6ce783f965aa6fd341147537f7925c9fa31f437f7c663786062b012189e74142c1b2c15fd76603bd90021ceec54cc59913bbb079d39318a84c529c1e284b4d74259106ee0d16fcb9e814957170ac7ee7c5cef820625872a150825de999793c40004afaafef028150b11388c8e1faac11231fc37d12fd6df77982eb8cc5b9352bbaa646a96672bb0853c89cf9017e7a9f9378ba96c9c930342e1cf00f935360bfbb6d92e558add16c36f87a0eb7800e1a7f9f84757005e4dfd9161178ea8ee6836c678569affcec01c36eca0eea47900a4e5dca22f0fab081e139f8d1b4b3efff335bc83f51a7345160f13302841c29f5687a34a32fedbda1ae4d4d22d80aa2bc7913036f28f6d0e376485df16c47006535be6902172932c7a81ab7713edb2841a755ddff1a30e93f6e3cf1e38a103fe11df112478ff5387c3767dfc8ce6ea91623eafef9119fa6eeae9597e1c6be0bf288dad6787e98f746c3fe6d2e700a4cc4579a0f64f4893077a01bf6f1089b8f1ede425e9fce5b96b0b4a508ac0cf939d2a92cb849ab37ae62ab95b71e38edf0f087f152c366863e3f722558488a8199c8836aa0af1df1493836cd816d3efd59edebaf59ed2e61167d6546060cd2eb942f4c1a709e34ff297fab89fde80213f09f72441b240e3347f1f5cfba00cc7f518e6c05cf1fd7a875c27192d3966d77dd8d85774170ee46f8238b8a1b2b6184f96d4bf36638ee355686f0b0aa7f6570493f8a1173d9b6e0529c8d3dd2957744b35451acddf362eef35590aa2aacd3475c3eebdb58684e4a7de365b18746f705a8cce6f7db58191b75b6b94afc24a0453d110e9a99249ecca08079aee147ca10ff5c729d086efc040332d356c8efb2af15405d19dd168fade3fc33fc889fd6ade18d5d670d3df3f1c65046973516f3d00b543e1fcd4407376fdefa622556052376e60f1a92cde729e5987ad5eca04aef48d41b7311b8efb06cae35a960753ebce5eff0813e27bef58992d8d895959e53f3485bde507a306102f54e99e00268be57306963ba52629ddac7c667d7fed945353866283290b0925739acfa4e086d72f332e087ad56b969ffbead4c5ae2e20d362da4196104598b9605b794518c3420e27cbeb6c03cada021fff64dc749a1f31daf7d7882de1293e5ded72f9298a5104b966cb89b0b258c67130733c63bfe3f1344590f4024c2f36c4e7492b833a88957095055e5cb0873fa814ac5fec1e1383f76a0a440e053f455dcf6866c6625d52e5cd4554784409e01d125cd18e23227caccba002d19acdcc511c5d35638043af7175f7f683fb455a58c0211bba7d954dbce0febadd8b5f3e67349411db12d01dbc3589cf1044ce00e39485b9016be079b05072d68245683e08ceb976ad9897101e7297489d9f08663605f713f3aca8831f80b8d080577d2dbe4119fe4b9fed4910b39cfd9c88890cd89af1b6f18e31ec63081d432830029fe01251f34587570b5b7f07588d8fc46733da023c8baf2138233d3ca90a7d9d0716d8de001bed78f9374b62e3f1134f07e039a50f427e0ad8c8b6737ca78eb0f5db0b3aaf4f40a7753c9f3c1a67c19d615640569986793350dbfa7e388fe1c2eea50fd45b501f8701e3f0ff76420914061e749375f83f5f22c58fa96714255743fd7d578ebed87c41c5d7298220685758914ce82ee82ed2e12ddc7172d4b7f2b85cda20c3ec1a1b974ab856c8734debeb673fc11f06c622fe6d6782f65228099e3b8cbca58842d994fb1ae3a3cb48263108d3cae0b493e3fd1cc74a6c1cd42068222ba77de3e13aad4f856cce88e5bacbee9f41fe72268a4fb462344e856abbc8992d6de7bf73b352c07e6e834c850e0e90f8e2d2dfec8a68bccedd083c4a502219187c6d5b88d817e66c457c86c4849b88870a085e6468faae63a143920171f72a635f69488f1d8f39e5ae04b812d2d54db044096e1caa57f1d72d6b371e85ca359483761704f80b3360f4d6610e6d5e490b0d509f73c3233f8fddf98bf0201dd322851e4778fc2e5b64a65c0205b899130de268530847ced0043f791134c5647ba3e0cc4a599e6b1a675ef02b974918342f5fcb3958accd6bbade54674aea20a78f030a9025534408ff7b4d3e31934e14e5d1f3b2d376916b3a1735eea102f4df4a7843d97abf4baf9387cdca732bbd3dc7d57c401719dd4708867827d5a4339b7ccd1256b846d476aa00ec40ca76e8375bf6cf61721ae3878cb8a59367427f648c5df0c86c6e80d6c9734341b609516a08a257b7930e56b55d0a48c1c4723ab2ffc7698f15bad378685b4d4db4578b7e6474bf82f848a958f017dc237b97e80f5d75e71b32904eb41d2574b543f5f8cce5ca6183f07e5ddacc5dca490b3829e21c05e40d41a355123e6e5428e3491bde032fe80b39f3d6c36838bd92e1e752d3b1e40ad5d158793b6292660920e5773a4311bdb9236dc6ab5a5500a1ae0a054cc59ca5f550144d68204e24e67b3f9d6a3c1c5cfe5b308feaf92f4df5ae34b3c5bd9c5ffc4c8b2450edde0b3150dbf0d644bc304b3fe0a50aeb23ffff80dbe0d7005f834b3511905e21de938a502f0416f35de2404ff2a89396df813fb4840ee93472da72884c341862dc5851e7cd6994de9ded4e19eafd1d92be9c26c7b1a074d062a002e49f71f83733c418862b73e85cd8bbe50c3e34f1454d8b5528e958125abb8e6ca88fcc75f591514eb9cdc579f4bac8a5c560c2c75508e94b568f784a49c9f0106291b62a5461aa850118d0d24ca0be00a3f738f8187d3069ef388375042a7fae9149c18daa211a2beab12889bb26e66646660a1c2626eb3131692c3b40598797b32c71088d4c3ad3e51b2ef8c6a9ec771b31a8abf4729441fb95b50554e3925c569e3733646f86fd7ebb66a7f5c63a9390feb71009fca61c7c42c05bd8353a7cea23a686d5f789091626623fdef84b5c560197e0ed31ab115204d0a730eaea69fc61218b4870ab9749c0a3f8d8bcb921c90eddb7049e1dd10b30688ff5512cb3ebbb4ab932678928982eae9b898fee84685afadae6be78cc0669fa7eac247beb56b684892a488c2d7fc4e47057ee6614c29a71f51a0f3672e225f8ebabb14260cbc76173a6a03f266f37d81fca64ba335621d56e04fcf1661cd9066faaa43ac4998254112deb0c93f4dc0c02576f556091a587de3e24140615078562ff69af776e6beeea36959f069f45f2c0957ab23d138a1bae2c0128d37945f87e307e2b09a8e89457374c40eeccea2ec2fb237b294a4403566510aa7ea808f209d45e27ebe77ce6f0c65baccd1c5d0291fed5faa5a467d18f6fdf03382fb4f4ae618640ae98bd594f6a503d21fc0330a6272ecb32b069f881b2c8edc08efe62d45e82efb23b1e5dab79d67c7dea611b87fa7a57710ccf0af5c46aa4783439df0421d0afa74d1486cd9b4ae531761b35afef6549b1080b6b541b30d1ffbdfbcbc651fbeafe5d44470e4519f1fd1d8611968c6bfca340a3ac252db7f0a79ab8bb8375612c17da0220f5ede04d314f3631d447eafaa8352c4fc1827c7b0038f510d3f2bd0d9451e2a70d1c2a317e89a008d1a88ece305409c8e1afdafbba47358e20504be9e4336a3bcc465449156b58191734b3e1ec2bd099ee0c6fdd0613fe660124aa6b981d1d71ac02fb1ec652c2e53d52f6d03c3af5455f3eb7a9944db44aeed664ed107d50cb34c88b1ce1ee74ff8cb9c40390f00c6dadad2eebe542fbaf61ebe7e8fdb2c8baef0d80be087cf2cabdafa8169ae96a5561de521e799238f5d2ebc009b07bc9c34348788c9abca0d928cb1f63aa95b39f0458bdabb1ca00d0da4c79b9c936f866da1fdf0318fc139d5682968550735ccd1d92be3e2e48c7a2e0846163a852b9380bea20bc23d9df99df6cb9e61d00ea420612f0205f9d11fe7e3a33a1ee7da099613dfa022bc449512bffd62070ccd0a0666fe00cc64554461bc45cff0c06331d6291a79f914a0555b4a287aefc45a46ab6f00a4de2c0231c41b949d5719ae536987bc5cf04e9880a11fb5afc0009da036049db8e459be2d3788f86bfcf9a3b776b62e12ae7013600bc70ac922c67e60cfad3d0285f47381e28cd90287682aa4263cd763dc85fb3bc2c99190bf20e5cda0f3484c6a040876eeae9f2b9f6f2b64a1a31e162292375aedadb1cc3c15ba30ce5d265c3a9165528377b2acec148e3d0e726df527a1af05b5fcd14444ade5d184743ffa9ea4725dc86e7b4d18613b7895322bc694b94b84423d5bc17df14ef8e8befcf03e4317e1e61b60d8c85e1a5c606abf5210e3f31ebbf8b60b8fe8dded22c5c305c1793c240506ca13a612143394a2936144268f1c48b64aea239b7bf75b11fd00d04bc96f4bb822c85a850f435c630ebbd88a07c613fd7f26e1100e60bb2813aa12c3a60ae3b8cebd8cbff4d6de339827731743644158bd8670517f6e69946bcb30e8bb3df38e38bbe3c9ac32429d996ebdd62b3efd4c6cd37966b76a8edd6f2bd1c2f050a4c3c68907aa1e9fb126795860cea89c6d63f4d5a3559d9c518986919e5a2e8a1ddee2f1a16a31675358a1ad0107a0c5b924bd549728184bdb2217c63eb75b358767f3b95912cfd14fba77354b8afd020a172f18fce712c053308c935ae1619709e661aad6a8df24cdd464b8e35ea59b88c5b3e87b987244e2394cbe9ae126f8cce4938cc13748a9f72fd1fd748b82d85ab5af8ebc45201db0c7bf0fa5be94a2f7e9f327c1c4f4a8f35224cda41a7a00a96f8dd066f50393e4614d50248092dcb37be8427f59ca68e9c5c7f01b12775d9c7cb37721b105f0a7905e47be3007ed2824daa7a2fdb2330211202e827b60355c638b4b97800d7a20da5abd1cd5dd1e7d6b311cd3b9944f65bd994f815e1dd110ac7b136d6a047b78caa97be677fbb7dbd8566aba9458053c51981abfc29579e1e0ed994e77d039d6e5b346c31e490069f4af59fe96e79dac568758e5afb275f78648a3e0b05afd63b5e1e95bd3af405046a5b048c7275fdf53cdd19a2d5b0c7926f4facb1c8a0e46c1992a579d15c1b757a1393f300193fdd0d24d874578878f495966b8c349b6a89144d35f8563c9c7ad09ba8cd85d802d55fe9454fef22e6376dfae4fae7d3bb1ae4baa1a9281a1a7d246fcd6c7246f986bb96da861af491a35ee9c37e40fe6889f147831cc5791814ec1c7c6063ca866996ba22b749820df0eeef6196de8ff56ec09044b3bcee07aa7e1e2049c8f73be687cf9864195fbd88a47859c52eece421e911811e8ccd8bc670d1737910418c85f543b61d08f212d306111699a0b9a75bc137a2bda3abf6f15af2c07ee82deae065b3063276cdb0788a462274d26ad174ef9f3401901deba3a2eea1ebaf30f95e5fa9f355016718e1b793f7f74274d4f5caa4bf8ae077dc65df21921fd3ef1a78597517f53732be97046711916f5c3456f8e4afda036e4bb066381bbbf4bcd0c6d9c0fe8366d50411074c19c3b7a57220e0db8f4f7755ac0bee9e9920902eaec256f9f1803eb2abd816cf4b1eb9d500ec28f5c88bcab28fd0bec1b4ee24b926e367ac9b8c2d4ff864d95d5ff2f46f830127cff5ff6c2979b78d4dd98530e0bba27235770791218c3fb562b2f0e5d95b1863c6921ada1edc28a09f81863339ef980d40fe7328cbd9d1419bde891cb70b8a6376277e9307299cbf334751aa29353caf4bbc6f42a363c1f4554d3bf76d16efbd6b209b3577049c2fa5857804332ef8beb21b4c8d4cac7a442b897a047fffb0c7f207e12fe2df9f7872e689efec2f64e200a5ab472c2662c77b1dd3c264486619b767e0f0df2d2f3007c4d7bbc8d8f98fd3d5fc3ec66433e4e074d9cfce63783937ab3b16c07fc3dcf0bb11f63d9e3f3e9846dfa2afe83622e818ec7af2e37f9cdf5c20004b49e5d5aa33a93ddef1ae64ca5296315d251207fe949c52964ae4bb3ae5604bb41e1dc0b0b90de10175bfa8f693d05932ad301aa05259f50d0c402ac6f15c67af5ec41490d5c08e699ceb5189851e88d4d318c159ecb5c0eba9fa51ffea74d2a1ae8147b6f461a46bc9ca250fa0c15ec84944a297be2044a696abc7624b5a1b1f6fcde0bfaf51b17c9ed469f561793961724c14e6613a0ec264bd018a9e7cbf9d15125607612134308e82b6e76196a754e087bed250636db396a686d55e4d2e8f50e74e2ab440bb1c1b6d82320bba3707069006c8162d101eaf00cddf055be68a95c50f9613409493c7ed5281da5456ec76ed63542d07645810544d041e198603463430d5f8a18f3c069abe3357e5859994087ae30f72f8f45d099ae113167b7df4ad4866eed3d97979fe1be2fefe5182f069b41128003c77f7a92df28ec3357f23a8ccc5605821d0747ff1fd59ff293d1e99855b212fbd6772ab8cb4ebb0427b55af147df7bee6d598a8d70ed378ab2c7110851d6561da2750991db4b46e30f6fd38d60d0f78970d58f1418405eb25d58a5729f47f37314c13fa775e634d7f76acce87df3205c0cc27f1c7f96bd747ccdcd5fa6cd920514a2f38203e82ee9c7ec6e88080e9f6e2a6a812b0db7fbd7f76eb356ce2fdbd98b624ea8eb1adb20673ee0f767ea1bc8b313becb2a6ac1e3b6837cdf7f3775f95f4777a39741e484c0a84bbd044f3d708d065d833e78b7a1a154538221ab096d7a9a96fb6d28f01db871d7604505ad70a28b87dbb1aa8418a1295ec81c543e3bc2a2d536d796a8f438e3ab6a94d312d0d8e9645cebc6d1519c49c538d9fabd6d21a95ade3b52b3102944f06358821596196a1b8d559445527bfdb15bbe652e0b7ef54d7a0325bb7971ddcdd1f8da5dcc4c54d5f755de8925278d4ab7345c371bc0cfd79396d76538faf66b3edea3937959f0b920546a44d28741b7d6a4a983a7d17f20b05c305b54aad7f23171a55ea62786f092bb011f5f826021407412b8b6984d4f59bdf845d56bc7893319a8675aa05ea1d5f06bc2d60234af7b0e607f51fd818c1721f6cac4241058cb3e73559dabbff56f5d70d43eee038a11d85b7f7fe8620170f0f39328bdf8888148cfd17730f314ea68d8fea02d16d98a3cca61484139d3ee92b748091dc841dda08483f1184025ce7b6ae703a9b5c56ca076ccb4f04e2d19700a906f2ec7aa68ac5a121249ef50a1fdef376f492876416e2869ccdee93578f0b41363d73feca9d51927e3ac47bfed563098edf5b613900da6e097f15213937b7c7aec00762e288388696a29929739edf2b08395a8c4e2e5b8d81d12d0f0f27a2b6d1391b5996e1f7081b1a916030e2c00273c1246b3be5e28f9672aadf41e538993df734455020f9916c0121d29f37a21a61d52d805ace0bdec7c1f2f469e705e95588c6b896cbdcbd19d4eed31703f1cd5303ea6e534d33e5965db9f0ffa37721a86c5725e358fce5a5243ce440de4ba5b7cbef879df9f74e728444576bb128dcb7207a0fbe4ef6958e7db0a8a53cfc3e109bb15e934ac273fcf4468a46868765023383f880144667362fce82ac969ff0ee01b465ebc631e0961c251c089a0f650a141952f15f68b54cd90af4cf81a358b08c8d300fd2a23ece7a549f3a624d574f50beb16a76da1a32f7ea81a664b2fff89a804f6816afc9068d79665485bdb63267d88653f106f0791ae1bb99d62b3136ca52069d08c729eec3f803df6adcfc53c7eb6456549bf29fa084f5425c98a6fb8a6718070f64dbe7cc551a439827b4440f8bbdea28057b172748e1184e67cba75923d64eb1255971e514fc19842a58639d2e0577d1b004602da1e184423509cab53cd3cc94752d2dccbc4bd9b5516332ff46dd87f838290b0224892ece7d0bf63d0693190fc0b16be1bf6bfca2496f42a46aa8b2e20a539863454a70599c2c8a5f1596bca9b490ccb2a2ef0ae15ed7133afde96155a31e68cf88a7e16a3ef62779ee411fe8bd45c0bdeb377ce91e251511a5321b99aed41c9573240a76c1f33e3bf534bb53474ad8620cf7db2013e3c8d6c4f55a446a2f245379314415c19e3f03cee4376fef1a745d9c82ae3cbc9dcee8e1b595dc818a10882f6236bdba71ba6fdfd1ec95112f34fefe7a5e8594bd67c68ff566c8617f51b1ea395ad518f830eebc8073695a039ac4c741749118cd53fe242745aea679685f5e2918f269ac22fec97244632642065d6b7a78f5d537f40e52edaad5acf2d4eedfb3f9ac2908112e9b19d809023518177f77e41a46a7c865709b1f04019627ff035c8558e3967bdcb5f9b6d17a87408167ec3e74d977519221c20a8030bdc1ee5da5448f05d1d3a78e9469330ba30039a929f0ac2a312022caf505f0b6e4436b3300afc51c34a91da97c57c41202d79ed7c3a316a56fa485f0a699cc00941cc448013f81a3497c8d8b041b0b4a31472f684bbe4ad77d6f3a17492e88aa67cea7f1197c4b178abe9597ee1b5ef0b8df69df14babf3d04d0cdc37f3cad10b9c974c2dbde9805730fb4747ce155c203f0eca0d110fa4270899f799b5cafd014adc931aadeeed99cb0789542f5861a9d3c1651e36972845aea5dae3007076502ec03c21905b6205261407ed2d046870f018566de1cce8f2e8356d5cfb45a4c0ef4b308a8eb94664e92aa95af0a3d83b3f1985423b344af55e53984ecfd0f0193685559dce8f017ebc5157e29fbc19d368cedbe56c59b718b70643ffa399c022aa7794a27965fb1b4592f9ce62d89300123f3e9d9bc398219c5756b8a0297da4f428d6e0b6c49b032ff47766637eae89e57397b3f0f853d9b44cb9c1ee079068bba001a0ae324bfd2080b9f2c736d2388b72cf6f94825208a8f05462b4bb5f33a8e8fe2a883973d3c03da7bab98967d3a944cc19afe9fb761f480fe31bce54d06307b6c66d61794bb9332a065ffdd523eaf278f968b3b8eac25ed38b4ac7d605930510bc8531c62eb06a281de11c84f0f382ba57e86af02e393986a4692e4c9ce0ebf353f731c24350eb8a48686edc026fff797a57950a082be11274a28c205bf4c049d4ece9d5543ebd39cf1c7a4620046e9fabdcbd7041405f5d441b68b90b748cf9878be2682725e81cfa24c828145ad913329f6989a121ba515bfc4a7f740b57ebb4fda3e186ab751a10a8e0eba41a47bd57c921bdef76fad5036ebada5d5f2a07a369b4aa37786b1d5bd24bf899ecc18562826e74f5e628d0829941328f180c359cf89e290235d20c21c890b6ba774e539af1d616791a4a2c21a466efd3df065de6d2e8c8b18ab2ceabb2378cd164f60f483fe30b44ba6bd028b7b279ef5c1f67ca1e1aee0a1e144d41b9c8e4a45ac1a1b4931dbc1e6d90a4dffcac39ab365f3b9005bd02d79aff702b05cc25fd02b8f126160b8fcedbc3908d98dc95d115cec180ae586edea57c1fb0bdcbb6a204e2e8e6f035ed1ead0b7c7cb6caf627a375e2e1417399e8e8924219094b015b07486c3b48233fd48b7150f27cffc577855b84fde896ebbc0b49c2ae12d66df2b3f0666f465eebb91cfbf438120268876688901ac94acc24b5a985b700f3622db2e4bfc8146d5b9509b35096a15b491fec05ef810c16a4e68ebb747cfb2b48d6a92c5d8fd7d8f530f9a14d535193ce09bfd9877ada83dbcb3f8677452a0488b343ce2a0bba28235195ccd1b94931610c880c424c5b18d99b70127759b508888d26d40d86e2e44cc2853cc50eb2bd69efefa70741b65d071ec8685a01c5bfb12bfa45ed467a94d74970f9129bb3bf4e7b9bb1bd9f14dacb1bf08f0a8582b06b57682ab494a8c02eafff0c9ea875c0777835324eaf9c188e5c908f6d2d13631fd7178a49b894f1b8bbd97c537d20484eae6433a1b9779eb9a74f716d40a0603374b16d94fa68aedd37a6511861dbdd3ae4d1ba9e05ccf4b2c5d53cf108533011f6dbdc7da2498005e91093d49ece09a3e424d22ddac4a3e37ecbf8e0cb525a1f253fddecf761ee989bbd4b717a2253f174048036828732b299d9ae24d2c566c7c9857bc942d880fe135581d63eff438d5d19cea1433c2989e0a665a465d5dc70a955bbfccbd6bea01a813beb318c62dd660cc356660b11cf19db2548cca945818e55a76dda8231e477e983989df2374a5985673e321d70ec0d1ff6f84e6b296440304605b7046033f43460c5c8584b3dfd2bc33ff19ad148841be19c34400e80878ca0aaaa85d3f6570adb5afbe7241c19a7de42e9aab94b4677ed1cc7527e3d2b12be45fa2d13936915fa3f7ec74c5076a0c1306473b25d1ada23604cc90003f369a7bff023a774f2fac75d991f4b42dcbf72efa82043e6c9ec89510ecd1d3aa83963fed49017ffba644a9a9417a75912acfb69fdd7f54e1c562ad554845b4a122cfbecee9bec9e88f98adfb6d9eafce20e6384adc04efdd8c00bd56519459cf9e87670856dadb825618f15498a9b95128eb32aff05d85bc8d1363a8ab260962515dc71e22de2b45a4561229355438b6bd3f2423acb1bd1b332b2ea0b7836a15e5c36d94e0414fced4d09f0dd606946b58628b4a73d9ec5608b87cf30924e266b658b8f0f1acaf7a6208e656ed3952eb84e5e688e80e9a09883bed04128308b15d7e37b6d968c0d4f67f86b90d750ab3bd49b4537bf84cb23c25dd48564653a245a4685b2a0e2a6aec94fe98994202508bfe735e920f8acc9f16fc5456c74996098bd952462552a8def9cc6a2319004e5b84a20edcbcbad52b8f98ac968e51290364f930d016c01b280e7ec23d625b09b67cdec8ce9883585be050b5981410b7edf0567b3a8b094e525364254ad6991f27377820ba2b4ab2bac9a303dde0eeef039e5f95f7da749f08693b07cdbe30fb18551cab51dd9790c29c1e1bca9d722afecfa3158a8db899a4a051ee58b1b93a24461acd1837e06f0de81061f07210f83a149f8e852d4bdaa1a9574d5e39a838b59b111a6fb2cba9f72e287af22761d3300dc3455a3184be99d499a950be749356b49df7dae6afde08eec4cb1225db489b0bacfe8c2319d1f7c2b796d2c8a4b68232f009ec4c0377ddaa83d702f5f3c4b5aebafe9d8a719135e43f7a46e0cf3eb296d5a5164b6d03cfd1d43336f031d42a578bea00c00298fec97fd84f8f4a888240bd7deb6d530e6a05344410dd1bf363a68e25487c63459ce327453f3cad105bc0f5e8ce3a4c0436a5329e32f518befc0c3054f7080a23aab19425a8617d82b9a83d6a513ace61a0424db61fe0ce734e0910ed7f0b7dafa2b5651e1da6124c2666e296f6d730b3415ce4103a1893cce42dbe5352ff24661f7ef873016331d92c7d93e331a83985a465a42114050f3868da972b154b94d37b7efce8e63122b6266cbfd384264f3523fcfc8d205ea722269019d9288945743125b0d45e988b6fceb4c4ec80b9c86e4a735ba8f16de236a80ed4e22f20ccc4eb13d2c9bcf1c2626fd641929a0b5b8da2795ff909bb46d2877746da7bba815203c9c12d93e57e3a9441c46a42737f0fb66f6811dbdf5b722f99ee26a0af198815a81a9465dbf554d6a7bbd81c9a8980e0d60277ea3286b21ac7495b3086ebe39b3f3d82c55dee5d9148a6708ad9217dcc3dbd9fa77d5f0ed38fd6ecadca7ef0ff0fa87d14d3cf917ec502a81fc7cd52d31707fda5e84ae4e464256f6b02494cdb99e9e7e6e5ffbcd9ad5ef33ddef3ac8fe26026782be0d0c7e493380a96e1339b5e8067be0d151c4c6219f677972ae77d30648e60b0a75ee871cefb0f10cd61c8ddfa510ca1a65c4173d2065f78d990058163aa221f14ebe0ac370ceb086433de98c648554c09d9535305c7580c8632c3460c0e2eafa0042ae44a0220d65c4666ff52b21a84d63fec90239df3cac74c310ecc3ed91adf3431ca965f4312fc05dca24e32eeb491ec87bbba1ea52c0348d93c0290c3c928f88fbfaa98b446f9feba02172f2483a35bbf2647bdfeb8c0c5266e6dc8714323ddbf43d53306daac8d89af2c2b6e5aa129fd705af062e9962d93066c2a640146302af7c4b2bd46aa5ec5fa1bac1ea201c3cd1a424a7446e9feb9a46c5b1e8c06bc6d3be79c4a2369def9836415d8025bb5a894bc40a54942c504c90ccef36bfbbef080cc543ff9718a8ecb741d0cf4057c0a601767787916fd0ed4cbea95098bd45f86d17ef12147ee0042ea163fef95837d1cf223505efd232258085275ed3d79049e957110435385f87a2495e35d82787b2bbb08df535bc409e3608b189f97397a3886df1fc82aced1e1c20099e662a78f0d009c77fec95c0fd752f8ff891f823af5341d72384435271a310ab5e2acad13413132bcd9bc47bed46e208d523cefc1451bb0ba1c26555273f018ea0ac6f5c258eb70004cab33914af096545375dea7b8ac4d49dc47bc0e8f8d9f88a7582df6c48de904f02c9c21abb8cef72560cb58c07427c3f13eb595ed78132440c6923b0496e21d4c96edda86f53eb84074524eecf1f49b1361fe92fe3e184f7f98ef09a9a51fcbbaa0a5466d547a4a3d370004aea418418b57d370325e135cbc5570ed2426d692d2a05edfbf44e61f541f311476192749f196f0d83a36a8fe7f72e44ff49acaf52d3c87110d45169a5d9371f8e3bf8636be95c31566762d874177a5bc9b8f418512cb9a74c7e3905d923a4f2c6805d97a7adac6c2579b35999aea31cda962fea52bd415958f9ec7dbaa8a3519839a85979eec68698df435a7f43114cd7eb446e7f0fc94ddb4d54196fef9a06ac6dc1f10932144756a3fc234d5e2bb66bbf1becfea9b74c7e8358212080f2d7a92490a78004fd7708cdc4fb2c875b213c1b9cacf713741ee9a2dfdcf7e4148d3866fcc306e9e9dd5563852c44470954f206aff593d6698bc3b2d39319a266f0003cef8cc26b4042e66f26fcbc259b1836893c11f979fd5bb4bc1b8eb14252c7aaad514bdd116b6e62f88fb4bdaa7a35b0ab2b465384975566c69f15e54d3fdcddc208497f63d0297207a89b6e5c0e73077464ddc680a1437edb4770dd4a95f54282fdcbceead83bbea359fbf8c6bf9ae3eccf1d7cf482eba700fbe6c2c1bbdb80f5181cf52deb6bedd48a1a826df671ee1c55509d68a215873fa3c0bc3a1b56402342831ab57282a8a2234235db19c1cd0bdcbc5064698bc69f2747f23e1c2d2a1561476608d34996160cb9399792522bc14dabbe713f140d296fc08d54262ae5d25eb100b0788560372dc7b529c7ecae4791630f168c7704e36376b405a1131a6222091035c701ad0e6eb6d11a2257fea48e2d6adcb87d52d7ecb090d8f5b170ce9497c01d2a8426a1b8ccb7f0095ac4e02e50f74a2bee9f0df0b549558bcc901d9ba236f208d573faf1538c36e6bfa8045816e0e84d92958b58ce0604c92c215721749a3bc9bd3b2103917b71204c5117f4c54a3e8730da5b0d43ef6e1898cc850d531581d404261cd4cfa92b1fca6821e9a65fd53f921685f65c2e1ae1d939ad4788cf4b9372def54e5441eb4b00942b21014734de7ef20ffa61e8908ab7 +0x61dce069399909fa7f4ae87e5e9e814c1521d6555eae792393a7422e43135321cdef56adf36216eedabe1c6f0cd039fab855d837923391c2dcc9d31f1a2ff6ec +96064 +0xc38f4de032c8500e46f9bd0ac75742db703f1ae1f628316746d789770ed2dcf2801683e0530c96040aba55b37836c6e78461a0902ad1682ac20fda9485038a204daccbe79c15d05fe084112ff5f4f041ecc59d190bb33766140534d7cb060230b2b9ee9d17c9464650bfba234677081230d5d927a1b4e543c51f5ee8e7c48c4b37a5b5abcb113fe2e3d3183a71a95681d9f81b60f5bdbce85cc7226ee424709965d9e5b9c0d6055a2028f31a807122b76e952c6c0eb7027e61644612c70df541c3bb496efffeded79026136b7ab6b3dc7716d5f4f488002c5d5d937b9a69646cdab4a8738f721381b93640d6686252177ce2dca0b01afe1bd71cd151651f0541302dc96f781beb7f25be4102515c479006610917495344725708c83e2e1720e94f8c750bc3e0b0fa5c28df993d8cda709cfb2602c71d195a65893fe8ff39fd8bbf3a74ef77a8a819e4dae24035da53dfc718f908335fc7fb8a0700f7df6de45006a08ec29c5d1d05473e12a13f2ef9040e204cd29401947c4dead114d79b1c60ae258b2d3be655e50dba366466701508f97be507f2eac906379b7be7edabeee23f3032d75a2b99e2bcb81831af88ef1210918c505504adc0cf80c6172b85a2fe3f2b4c6904143024de9f7eae245ecf4bdccb0b55c6368ad39d02794d991180de387da18a3e8964d2fad73186ccdbfddbe48f29bd4c68a66629895e303e38cfa7b18ef9e312727b1599c8f95fafe5c0e9b046ad31f0824ba2fc7e3b6922e0d98433c61c1b87b7be1442da9de2d665629dc9596058b96dbfaf9d47d99f4df2e49b458dd2dba54075f87d75e7b648442920b62e0adbaf0f4ab4944e007bc85739146f4be2cb75f5e8e8d2019d830d685e9aff2f7361da5136d96afa77a49af5201839681592febf5e0dcae688f32ebb48322dc36293431bc948a6b208c3cbb6e0cf2c4c33d94984218eec8c70acb2243111c751a019f1564d26d0e079806481c360cf5f04475c2e7794c15b1d56a18a5f5f5543f69aece8089e70eb93826b3d0ff3aa0a4f8541a3a947d0bc569a04d71b43600029be3dbb43d50f3b1e72ebd40db246b3de3a00cdfecea115e420e2f2ade56ff0042eebb645f63438e2f7e92d05c32ac4770f9f92c052bccf908f43c35d6e0a7b4e92fec05827684aa7ba6f303f4edea3e3ac28dc35faaa53208f2f327306b909ce917fc3c29032d9346384c5027cebbaeab8a292a7eff2085ccaaf2736d405024dd475a6cc5b1a4d529931d49874d86f53dc169c5c581c550ee5ca8aef0175ce9303e851beada80ec9047d45475f2d2ce8bf8be29d5eb0a4fc8b8943e7b492d568c5e0abe0b16584614d7000586573586f0a094bb129375cef62f23a6316e28094c2669e798cd817e11c12ee13ad315ab16499c1e2e039e4af121058ae4fef35dea38112d3698a3013186cf5bf60ef9c7676412c76ac3ca60444e8830f86415d10103aed346e0135bdea85fea5a5368585e70b72b6b4ca09b6a084a4cde45e61f0b09818e5c3c790a83a65f20ea58c7da860ff7cea216a758ccdeba43190d0a7472ca37b2e9164a79caf15b740887ceca58924325a1aa5525074256983b21f99dc2b63fe56005ee461f19c3784758b3a4509827c4dc80109c83c3bdd0b74d19e7956e18aa7373faebea90258219443d0508921430d520800bdce34e710fc701de4552405675f8e6c7c7f5004610e2b148eb00a6de0e142a0f6d1186edc728480e6cf3459df9fd488631a8d228a0bcb6fc72744e40f9d36513deeef5cb5ff932e476d1a6c572098693b23c19ae5b2ac4ac295d78ee1ad6c7c58cdc298e4cb278fcfd6dd2817096277cc41f454ba2c550b48a3cc55a03a6c871015980ab0fdc70b46b285736683bb1ade1d2f3751a14e1c21f92a20926bbfdc2d6e7a9a63bdfc0a73ab1b378eb629ba385e792df13820e3153ef9d60169ece177826f3044354cf41f67a55bd5c936bfa3addb1ee31952caec1a4161335b7b00b6f67fb49a8a4231128e2ec784e56a91e7b25cf0706d6c376d370ba8716af4a0b175b20eaee7632914c9bb63e2314c98cc14048cde5cf794613a5e9302bee02831a51126c8723945edc0561739d6643d1a7cdbda750d7a4890ce430a307ec702fe2ea3e42f534beb641a06cbcffb3ae69891eac27fa97dbbc299c1f541d32f95e0b971312db32184437fd467eec957fd0ffc382d42578855bf43e03c7ee4a2499fee81f308ba44795099c6d3dc6842e84764cd010740247e4e75a8c82fdaa7860274dd14098f3b30540de7f7e1ff83110872b228168bd89e39d7227f9cdcc7b4d2f48d7a785b8e1316863cbb47b6a3de1aceee88b7612d1d4610554a0c13883bd715970f9d45c68960aacf0854b629b9441f890b32eaaa633ec94a12c9a67584d98005b9bf766af9f821a7c452279d094f0d8c98ce4dd7d8e8a907bd19be13f5a0dcdf62281502cda794ccd9873188350442fe16d5b33ce50e5996344583ecf7f3d22bf11e4b166c35ab472d3cfa70a72863e76f8d4362f07680ff60941c87f39c0af34eea402f3e6a0d1faab8ade0c6861b508a3f26d063e9c7482850b26c4f612b3e61d41bd4ab0e635c3745705dfae50f404f32830ea42fd67b73bf6c24750bde151223058e1be85407bb296b71ab0ceabfa6b083a51d10549f2b2b7336cb62ca7f492125e4f6c1892620adc8a341c452d577ff4e1c3454e9bd37daee2abb2d9884ee14a45ea461a9c44d19ac7b24d5ef8baa680bfb53c23edc7f150689ab36ef2ce945a9848d905de62ab54182bd076be82733e3cbe124fb04eb23e3d90543788022fc5ddf1a164d969fc8af3f72226bf4d6a8fd124640c83d634eaca5301dda878181e7f6b1ba20db949c1e3baced9ab8a00f825be9de4b90cfdc8a72948cbe49ef1b7051bc457fbef177b5fcd4319d3b6baf992b34c82f041716a4ca9957cccf52132079a18011459ea29c0c50b61f8621d16b0c8ec51aa223442334a748ab2094b11ef5ca307f7a8365fcf38a44c69fa8bd1f855f9cb571dbae2e39262504449b3d934d9d2070658907fd37e8a33a90eabbde1f1016a779289bee5f7eb77e4451ffa60a84178d0d96d2c662d49a2461cd13d06007fb98c2f0558a3117c6c2279c3f80b3e6dc7e7a930c80fcb5f32c183b0c1cd2ad1332551d222b345a1a77f5664448d02a38eab469fe528bf374f9bf1befebfd6a251a39954bf9f2ad7a46b7965727eabaf379c4fef06599f6e6345d54046468a7fbfb7642171bf279afd77414c04588fdd5d4b13c2ae0ad251084fbd093b09bca5b7b150ad0babc2782d134c8c7c9325ba6a3830af3ec50eabc92a076e4f61e3d0e421dd7bcfdd91db8ddff9ab4dc703c2d8d424f95b108acb006542e3f5f7a66dcf99690250dd0c51ca2de72cea5cb08333bf7f5565660d4b5871fe0eb1336af8c48881d5111298675c9d8385e4dca278055aae37f04ddc893bd0a743139da7fe8d6fc6689326dc78af9f6d4acfbf602dc82610157e209f112511cd359f9ee3db64cf952149823f224db3f2e00d8d5ff0f6a263728196bb7faeb5ee3ab7cfb53bf5188cb3c6ad36e0b16bb2ea20cf187e0b6006d38d08b831232d68d6eea8928cb8eb0b947d105a3075372bdd9bed203180ef88bd130f2bb23cf8ebaec6b1e24a2ab79027ef442f9e03a6dc1ef16fed97f191479396127c9f5698e506b2544af0b4feb8f29fc11d85d72b3232a3dff73dd805e1fb88ab21350a9dc3934438231cf220f489010fba848a44cccd35b5d37faeade6698d31c03fc37825b8feb6012b6ceec15fa5987d1677741a331979e8f9e009b341f65ecffc0ba88a0c34667ba88f88adfb1fe3dbb8394998f8e1a4ce2906a9d739768aa7166dbf4ee1a7b1e920d4af28cfb28a5ce63a25c7a300cee9799cfec094603dfc0b441d02fdab20e000d6c2b0621ff4873d14a924b60940d1881d891e0755f12547394244a4c15bd6d4f063d336aaaad10933444ea66da30cc102c93de6ba4cb956a7ef627b8c9b5429cbf31fd20525c0f72077a3e8a07df1b0d74faed72f992eb63a550ae66f97ee5bc3f0e4b891eded6366c3a311443a36d4257cef4d086f0be24b139c79dcb9ec0772fdc04ef37bacfa70a8eaa4bb5022a757e18dace746c76774bba5aa7679f399537a41298c478608c8a7d92798686ba6f90e089b4eb8f7b221bd94fcaf609baddfe6d5ccdeea1f3af930fcfe4ddb786f8362ce8ca12df35edc8a08e4fa062aa182d3fcad5ddbcefd6ce4d4ad4e31cf4d81806df5712e60da2fb17ff7e8c34710e6b2244fab851bccae23eeb93c03d6dd6dd7556a5132c69075b458b9ee3067787611fb282a8e8c25378eb9b689ba25abb2d8235fa3c38b2e6913218f9cc61234bb73dfcb6d40a6838385a409a9cd4214fb233649fb592510544e68fd570ccdf2114850bde653e1843c995c372ed5a2c5a1192ccdca7c2ac2c1d6ad97bf7cf13d320fdc542820d3a3ad4a40d38b3bce1a4f5a753f83a502d25c3c5dc3388f2252784af132954fe34e6008d05341983aaf40479e23d95c53bb7e0ff82444bbe7ee6e8a3dedd02996f0ff65a92ad4436ee14e61062f1e1a93da91921b2f869ba86d8f3e00ca4b566537d5e139eed5f5d14ca4474b95d45829dc4183154950a6fa5c44e6e86c795ee49f7dfbe103a908086dfc6aed1c9eadac2d0853a4f6455634473a155358dc9b8b7472165d0ddff28ab1b13c4907df738149507418dad7320c9ae939d00407a4c0633cd0fc51ed6dceb45d4c1e0c09525fbda4750f5b88c2e9e3bcc4fce26cf339f848bc5d9443a25ae27b0aaa8dcec28df69ed6e6fccc71329e2f5738989f1f4e801028ef399558a5c875089d01723c92808a0a4e3324c59d46db60f18af07174b74db72fb634f935d2e5b653fba63903e8008f93933448706a2b62d63e13a252fa3bd79daeb50c81ae47a47df0cd3068a98ce755915d726264b9ed45266b2a5fc5851ac76797fb2f970553697579cb2721a9a202c202cbd9e2e150dcd88961f19593f12b85404d8639c933a4fe1e51c5fcc1303989e6cd4d514c4dfbc8d0e1bf06e2eb388c608c2c12edd5beff4d7cdba78e22586d5bef433c4525207be4422e861c698cf15b3f979efdaa260d69a4ce9e4af8edf0e4ba32008686e96635dbb69f9b0c8738a2c04f5a7331688cf552156d9214789913a6c04a6ae3c51c4846fdbfd944b5e6d9c6b9b1e8fc0502930d5671ee0576ea6b4d44767cbc32128dfc5a736192a76062ab7d51b97a6a02a54ef867d95c67595e1655113680becd99645336ce86ca59cff6f0a68f3d2611ce9f71abce89d85a5e8a68b722c1d9c1dd277e866a919d279421ba1cb4a4c794516768ba480e38820f21f5b4bc000173dbbe42eee033ae5e31c44040d441ad2ee04f340fd06a0654c26592a68cbbc478078136eca9ed6c523b5719af68a46535edbf6a38f21dc0472addb618ff65a1230328c0ec323f55c81342acb4dc4d8e3dfc2071b217aa04dd9ae2d6689e9e1629310d878a13a9f9144c1f7ffdc9ad66cb7e1af107db8f328cb52d8a31e4b591ef33b7e122c8add4cb686619e69b24ad52f6175ea6984de7d8ec1637e15c5cb2e96da06462cbcb6751da8ef10bdb73b068f6ae212ae8668346b22566138fe3e7ac516f97b687733f5c2522abea04fb2e61f237dee14659935aa9d3ab34d9fbae9c717de18a9645bb2edaa980ed922b65f27b5cee762ca7968935c96dc1d4f4765e6043d87b72b3695e6d8c36932d94f58ee485d66625c11b56e84f24470b7eed668059f2f5a73cc86f4053338711c85babd02b3d1dac468058240d6530e7eb62296448a785ae4266e60596ee15f92616bdc0e579193a9863e18b6cb71be4da832b8e689ca7e274b3373fbfecec4e4ea549392d10f55b4744a780e580649cccaee1616218d8fe443bf72146b6568ba295d2ab7aab2e78d390fea71067a78a2263ef7fadc2956c217f8a8cb3b1012ba246fe8a469e113dbdd77b6075c351178c40ba5ba4107986acec85c49f8368c8fe570168296069f46696923f7e29fdcf5aa3b667fd88d20847016d5b5293e9cdf744afc78b9885478e4cc7a6a2020a3c2e2b883712a24b5b706c95c3857920b53d7e3e2af5bcffa16568a04879f212c86746844b7be341eab96cb39fa0999a0921825104e034359cbc88a0677e60840ea6635f07a1c2624092b03b422c7bb25453ff6cd7e3a4c383c40b4cb617d3fa796c206d1e1cd608f79ca5915d91a6060135240636787526114c9f09a6eed2c293190c22d15584c27a27db5a34688f01ba55bea183072bd9af96826bac5bd398e63d6534d3d4551b32d4bffa7929bd31ca261dc350283f5ac94273e749075cd9dd69ea079821dd6fdc13d1f69e4db722cb36dfe010443625f8c0d2010f49e4f1f2fef91f80c6745cb0759fe3165cf3312808638c65f396c7a8922b5d61bbf29dd19d20e1402ab05e6a7a982473cff7f98b0b472ca3aee7cc7356fe30d2d60c29c3a4dff138c727e16483594f293f3bf84ebff9457bee8f80c35fb93ff510982273a6b4c3ed442182292031d7c8f34599fdb7086b312b14a1234cfaef2b043d145c231deddffa63bd42f1e032b5a49b7b1260e302660d1d8a1d8f11a2f729517bd7aa99b3838234ff2c48b30481cba3f8274e27afacdce0c81c96bc1febe88bc5809da6c96a543bc45fc538a1afc105bd96ef24d7583324d79b04589a6bca328de18cc39416e8dea957c7ffbeb23d2727fbb488fe1aa84025235855c71966ec4174e88eb7fbc8942aaef176a01b988eb3d04ec2a84694d95d4ff3521a57171f6ca54156899b7c02a4bfb21bea6e5ba30d9f1e404a7e9146dc7b75cc08b783527c1d17b9ad786b90b4248a7e11fcff1a81b293a07915261f2f30403206bd041c0c26ec3688052fc4e557fb0bab7a0b4bbcd55f61a8ccbbd8c208f312b8da41d2796d3f4b9de4212594d484531b5808cd1b51c1e24de7caea31500eec8381a52c605a71677377f8296f14a6d2e609600529d27bc0fd08ebe9f9bfe42dfb65a6704d6923289d430d46b0b2e3099020b98a64b1ed7c2aa2975e87a3136594d8de448d33e4ed7fd7e9142619b965ae106dc3687a77825b4745ae67a42d11c46db52fcc2507549f9914082bd3aa85a45b055681b6da6203698f50262d91c11e96b37876c73acc712906993e5b36d7f78318aa5cd16699b77bdcea2fc9d1d207d661e51994dfd398ea395dda1adedb2c1b00356674bc97ec0096e300e37de324cf38cc210866f87b6f44ac8bbd131dc675549e1afb3cfb159a75c12614e672d9c3b0b429bc70a99d2a813bcf9c640e3b34ae3b06ef7821c8abd20b2bd8bbefbb666223900b8d7572aea7521253423b1edb459296bbeeba89b744376ea96ed82e29b5a0f0800ddaa05e0fa5f05c5e02c5dbe34b670b1103bd3f34cc8af16fcac6702392c7b472578adb229de621f813e4a8dfbbe4378fbbe7b63c30fd5b4f15f8fc449f82137b5ab68898a0603ea0dcefe4c36a9adbab41adbeb30b22517d685a00912dcc27697297f8da640b2cf8dc3bf216ede761f41353bb41c1b64e7b205e3f81b3e25acd3dc3ae504f235750807d63429c76651acf9e3e50fb15dce8ec7a0baec8713826faae0ba2d86558686818baef2cb45f5fd4d1aa78fdcd77271b31f760d20549f757dbb33a762daa7101925b74e52dab63a182a222604997b63b1a755076fb0adec3c1179fcf08c82acb7ee76c7c4ee396d44597d5b916c926da9817f60deef51ddcf2bb3b39633bf65432c14e48a49299db8f0e1b6eb185f9583f61ba3d4d8354f1d510a55be960640a528b92d0ab32cd35c3675c07b6589e5274c5255b934014a10caa669cf7efd47c62a8b2badf4ea1618756200a71bb9657dcb4b00f4cb5dd78fe0ae7731b34f818c79b565dbd30d6ed4f3cfffd801961c6ebd2f2bef65effc83d94a084bfda2f6e05f5d64fd1a3ae378fae54377e0c912e068255f11ca62c3d2fea4a387249fafab22acae798f1b7eecd0cb56ea80f94fbc165623c2c15c346597e1d04cefedb3d30bc9cdb9fb584618bdaac09ba9cfdceb0de9ff6a14855624ec2c170327340a4262dc4923259944e50baa07f023f2c05495077b71898731f744ab0112941ebdde6f0fa821d7857e3900f2b553b50c03def8d82040e907cdc7e98615e2fe51d3917988741ad7c4fefee6ab512b29c2ae737c83753dfbb0337a21e6dbdb2d755441ca6f3476eeffcc1a03fc64e045bec7fa6b3103d189276afa35f3dc65e93349d8a8ed719ce4deee77a00e75dad2a8595a0b09506459177a2d6dd49fe9f933b93d5c2ab2f681086efb04090c809727697da534e65f35266cfd10b2adcd261cac582e4d7feb8d2653907914b23c5ee4014a80d94d28e3fc475168b48c7b38962a11657e60e3cfdfa61d4557ed75ed8728a9e6210b292b421310bb03c659f74b3c504be7de4610dc6e89b1fb48940db7e7821d34aac9d7a0d82452c6e3d12ae0e9fd26ad807d18c4b3be052848ff861c45bd6e39b26fadbd9f747526694a9b003a003ffbcfeeaf407ea38905771f205f4a432158a98577426fe86b4be22c10513541def752029df8d62085bb5c5ca328fefa7ebb1972fbd651687e5cd5de527be4a94bc99121a993c31d40717f1fd61e6acbcd87899e02224cdcf481cbca29274f1ecd9a14b49dba4d82035069ce82ea959e55e7827153ce682c16e44b575cfd7d89ad9264213f147d371680a1d36f34875c5f018b53b881ad412caaddedb5a476d334d808d2584a5a25c128af9465a349eb33fd2cacf7e324017efe09f4fac542e2a795882daf03ec324c711c7b2cdfe2351904ede4d99dd455530658d4f407eaa051f06d9c0ee83c47fe826fee8b915a21593e57632657c625f5ea51f66b1375f479123d863ba0514d208430574c61ba963ad2f191a6b8005aaad37dc02790ebc566228353ffd4342afa9ee81d35f6097e05e843d720698cdabbe9629bef2754fd6149c46a222cebc8d4f91ea80ff94fc003aad69b5e12728f70538af08c80b983b2af8a356c4f800df6bc5a60a1119444793e3146265ab860103a7d25c742213fa17b5c1ba5e6fae3a71024adb5e7e1f2b2ccdd4141e96834e5c5c1a46615951976d6c38494986231311d05f711223db2f57d60f3776889f5351de0d331a31cf978e746d8020ebfdfda0a84a67e6bb16c897844c38f7f248a4969621cf291bec7f0d76d80b7f019d4eb002a22c46a4408b7e6101b53d540db69d2cde66f8a836b26cdc0e27be579faab267dd3abc6fe6ec7ef4d628913e5d0dc80ab98713474cd62f2c8671695e63864a50722fb28e78601ba82fffae01b51ec9a839cc03798d6ec6d0c774fa968765ca450757b370839ac70375c6ee5eb46df48de59243cf86c0b67147befc9079cdd4cde35f49c686d1238f5e0adca5c97feb4433765eb9a78090869d9bf9ccc932dc43bcb2ffe0f0b793b42f37e36772c91033a9e4aeb88e32c7792fb84cbbe419435ef9df10606fc2aa1a9fdaad143ede0604bf69de5ca93bddd174709fde58f5cc78015055c54266d91af66fa44c8c332f1ffa7248066720361812715db4a65cba1789a32a701738a33de9733370e94d1dedd19a8656667482c57026f0df4ac2bec5f933f8f16cac8b0bdf620511e4a03506eb5f03bd159d2652140e03aeb4ac2cfbb6af5be9a127030d4ec883bffcb116f38e1c6abb032eb356848300a3829d97316861cd99535cadaace2329db9014362c506f05d0ad9d9c4b2842727e22fb700f74f7c8b101a1ed7cc3ee71d55d2e0529d8d37f8e736e4398a5b8c36f146a69de72ddc7911a9b44fbc696f66da28326646dc6325503156bd753529e26e55ec726d88054ea3cad36905cc921e50ea7fc74a5d3c8b4bb27577fd7ac4d06044d2a811c8c0b0cb65c54d2ece18eebf00109c317789d3e3a18b90a99326abcffba0675b55d3489362d024bfd6c87d30512d0e819114a41de6de2f01e61719c4619ed6d49806bd02a93d16414e6b74aac71d45c415a3a70369b67d8edc5fc24560141e03f723b72023544a3b9dc97a36492a68816aff839c135da2d7dec5505ddf496670dbf0e0f6b65ce9352baa38dbc09a9f41f8f0e1f0ca1ac56552126811c786d7a4ad37dd8b4b9f1ab760d655a112b6148b273e690877340ebea10eb46bfe139926d3be59e8cb63064aa4147a9028c6ece75fb0c2eb03f4a66c3481dc726d38d37eb74efa131cf1d4755f2e4fb1ea1252dd080f95a154a2b5f77233882efc3dae35bfae68162891adc1f9ea7b0b40e16cf68a238933548662e5c2ec5fa8946951d255a84cf9d58ab9b5da11a7a6137d62b94db447a8e9e7d6c08e7309e71b05e4dde0024ec20d261fd96a6b7a8b492c5dafba8a7608fd0f390f3d912ff37b5991dfc885157bb7ab08b512bf9dc1cc37855e376cbf5c7744b25b370e79d59aad7e5f74f94a2bbb629bd238d7b75082e601502d24caab3fcf692be3b28e946249d3e54e2694db019301b7467971415580fa0d05783efd3df88707ab441738b974b9f9bdd39c92708661eca26e739b2c4f971b2531c45a59063477f68ebbca8978582429ca0a58f282e4fab67d6466ee990104f71703cb7b4397042d562351b99bd7edfad185356ed1b268e870edab85a75f50e1f1a4578bf5d935b665f6d531265edd99b1b532cdb9f2bea20eb571d8c1da854d894e0771652193fa83dd5fd961177a6c324356f583cd854b1e65c0cf2e9a2da2a5aae215db98a5617780f59993284fdc1bd7aacf766a444a69a4a05238c6cf480e5ff05f9e66f3540b86a25905b9e15236183443dcf28309b71b1a492586f4a78c163938f8b2053905986b0100f3ba3449affe3afb8ccaefcf71359c3e042327e677c6862fa464792e5d5a79cafd61eb1d43109a1d61a2647b4ffa34cb65e430e6299e338c66977d4e7e76a9ab005ee07a7d704d889892d0815d6ff714d4bf2a52d5c925571d26ac2da2c779ed243a7a27052839845a239caa429ece60773d7df3225046d8f49a6d927256d2d7907c20ee8240485bcfdb2ebea78fa1f976e59191b93a7c5711792a47952a9ab06dac3c959dbe61531e45ef8533495925fa40cef4418fb11b9c4e4a12b44bbbc1e25235e5fdac6bb670e647c78fd4dc2d2bd49de36357cc6dbe9e35bc77c21b5218f773a64a1150caec489f4b62381459302c6427c79bb5959ef3520d8596a4aa37225ea02ef6f7d8bbf25dda557de8f032cd8c88146354db66d40bcc87cf3c13665c5e9a4f624827046ceb3c10ac3f3c58417ecef3b591863bcac7c32476cdd3cd2cdb5e555d2b01f03faf393acd0383cb0fa1c10b9b54e0475cefb805923e33951a3db2e9f088aca7f213987be61b0eb2bf5c29051c852fb212e974d22b777be6aeec5fb3214771500d7d237d016f2536d919cd88400cbca4741ebf324a60f3e771502d5afa5098131857a0e525e70f7fe63f763d10d1cf440bf660cdf5e1e3c1ead1e387838b69199c08d85e5b6b16b46e36eccb93bcb0ba5eda214c37e2929ba2d84be1c3e12c8a21f8938eaae380fdf765f7dcd2b6a62ff530c857154b499e1fcb2b11c238288e2d8f991d1a3796830b365f15d3a5facb59611e95990450f2eb144cbe887aa64b4a35b1b4b34fa06e3110eb20a073f5b511d6ebafcaf5efbe8e1976911e8deeecff52a5fb7e13e6e6f25b65a54106dc16a5f6f74cb0076e2a8e4470318b5b4897d44e3b99826caf12d480934bbc48fa159e2809155420146075fc0448d7cafc7552913c37c740451a61e53dbb1b1f96db83d6ebb2bd292a85caa8f87b0bc451ad00836f7c5679ee2721f32d9d6675f78fdc6763caf30bf8c416b215742d309067678d9e1136fdf3619b122a98a331665a32433a05ffacc643e08123db48f502cd0d158f9d6fb69cef57abfb54dc3b2b640bd2380de8f6dc2ab07dea5761fdec047c850bc90a8a30f9dd24697a187b8ed4f27b2487b6d081a20e0e3191822f99373c43da3d0e63f9a9b6e73cb260d9d7d26ca9c71e7221ffd3839cc231b273508cd3b9c4a083283d25695a3ca3bb3d4d8803c1ea7823d39ce4968f63defab1582bcb4d919a72c145957ee730f6318f391c3e2c533dd1cda1fdd04fdd4060d1fa3dac6908d5e21559227df5e252cab7e3b6a552cb1684f75648b844f800efbc7eeafc74f3f6db0ec0f4efeb18608f9d937fc19b19ab453902ead6d77bc6ac582c5945d618a86593c4325c339bc88729919e197007a31b7bee0eb26e3039a18e4bb30ef63f91898dab044a343331ba44243c36375ba60fa563dad573dd02d547251fe03e32594ee2be934356a74331d496819e5ade5e289fa776c64c4bc9506900c64215b8a9bd7b4507ce01c1a7f3c22d94db3f58706e51020b0d6342351bdd25d0bce39829dc408888749d470508f7329e75509187e9a4bec1331e8aee3d8cdc64d6119b80b519ce3cbb920204795aecc6f2f35049a27e22bfbfe7ea9dbe5d6daa1905895650ef614e2e49ba4d4dd2a535dc925f5ea0c9752e39252beaa7371fcb0c282a55b3a887e4522837888c49a312ba94846feb6b0035293f157cff043bef38e24523e82e8927b198405c3fa63086156188248c4e0bfd189f70fcceab093d239ca468f767af3ed2029f716dd192b9746132248a58ddae8eac04111c14d1de57bc0dcde63d40513dcc1a701eb111d25ffc4c18ed73c06f11ce9964f227dbfa5cac49f9bf97868a7b607a015a30f7fa5e9a9ca7be86fa682b6df69c57cc6eb8b8d220968a5cc70f132486cb2a358a58faa3ec7a0478d4c263f1e46254ebd440f59859494d764c088d82087795a91415ba7f0238c73396a541c32b5ef06c53bb9a65bebc12cc5d9e72e1c6aca472db582796a68a0f9e88384e4993373337345130a01597e04641f848a88a135e79284ac750a218e5a1f2a411ece4962534bf293eb32781c0cc42409a411a54cba642122516bd8950241b101314e522cf4c3b6c4c05bc23b846a69bed133e16f3e273dac64ebe86590f4ca5da2a5f843865f241e3fe9c25d39cb633cb86c001df1301c734626eb6074acd8bf0941a6368682ad18a068e2e16b7ba30bb0267be96223503f6b895c262bee6e9ddbcde68683e2c43c9855be68b7dfaba46effaf520f857b694bafb517251dfe72708733b3fcd40c028e3cbf739d7bdf7f2b5424d867baf0796ce670c40ecffaf58e2a083f5ffad703088a60628ad4d124abc076fcf95841f855ea29ad3788f66f7b12ee893bbbd7a68ddb4be61e8f031d36d1003032d2026e9d175a533dbd7378ddde61420e8b6075848bdc4eb6eef7d172e27b02b2bc943488fa5d269ff1f48a1ce8daca470e13e893288c3ce29921d9d68121e4d76c89e2c00fdcb7ccaafc1bbebee5b283a86488204de6113002039ed849af674f865601c8c44387426cecb649ed0c7b22eed4ccb248746c1dae3fb90e887e0a598e7b1a19b41c05afac68e224ffa984d345d73edfc4b1be0a121890dfea183ea3e98b84295bd0c352edd3180643577fe3420e56ff2f288793c230bec2db0884ad2be9e87e280c40da95cdc0346490ccf167cc9d9704334929331aab6dc7b96ce3da28af8ea528fea558bb9355dfefec7c2ba47b4dd07c8368e928df275cb567c658ca51e15fb15d519b1ed9d111cf5ee21218987a106eb6a1590de285f68705e33c31780cc42ffd5dd17a3c3cb6a9b4d19fbb4da240846381071c2e0021a8b7c8f9107a675f1f5f389060130f1b195eb938ef336cdd581a7677e63a3c6a94fdc623c9d197ace9e3606c42f6bedb98ed178246c21063443bf02ffe9f813dc6688920d036041a2a3a63a9956fc254a2c05ae03472537ef3489c93c7c68517c7588094c5e033434ab4b0ecf9e6c032c17911f73adcac6ccfd0ca57c427ae85127e2ad41d98bb94e5f2e6aad2e42ed26f87cb1bec6971c9446517c0966b6402321a06834997f3ab66756377a2f064d0277cf4e2bb914a10eb65e38290ea4c1ba0eca216cc9671e356acb5b7fc8418a863b91dd01afc9bd04f63dbf2563cdd4de9466c0328fcccd931196c004227a0c7bedca4689cf3fd93caef6fb458cb8df565b7e2cce1334af9803be4c5064393ba83483710b42fd5b80858fd2d0b1ed4ceb0c194f887e2a2c0ce84be9adb7067fd7b9c346ce2f8bad9623122e10fcf581654f4010a7f833acb66a467e61436a40ce2492ad1cbf7235463186f64b9357e88ccbfa5775a8d9975f2fb6f3b52fece6561cf88e3b19395d5a57f412ca9e9be727294f0c38b7a355cfdfa330f1a415d93749fed17467688c983c6369d5464ae800104718394d194ece23151c5dc96b813954ab5e0fce8829ca89dbe5b3b2eb52dd29eb61c090c4ea24a315a141c7784724e5081d5478209eb6e5656dae0c068d871c42d015ab2b929806aaa6e4c5c491bfa31bf68b8db85225f907ea0c792301c690544d7fc4d7acf4f4dd148fecd5c8d337eed2fb34d8adde6dcb421623cb16612e2ac147044ea2fe17b5d18a64355528488997ed960917abe8b95e14328534229dcb12b6921ada7f143ac61d546c9e867ff22fa9dbd2f85212d8264ecedac3cf853f2a1297c2be3e9674db90e4000db5843380772abcb89c9430820b1d512b31908fefa33acfb405436cf92a3e7b097cfe54749fab4ebf5116c95b954a72d41064c24bb3a4c8269ac32906348765f9a5965bf268881076393fac97327bc52634a9e02588fc357bc6bfb3ebf6ea4447f6f352e11ce68a431bb8e0202bd9d38a6408f2646b6b9f1b51df1391b88da25a38be402b01f0458fc1286ddcc88b23666a28fff2a4198d6e03ca50dfc298069a329e2eb75fcbc8c3f1385cb550b93d230cb30fb67b2d87dca42972bc5b34f96fae3c236d80a29b457490b4920d8daa2a134e2b9838cf15cdfba38212cd890241723f2735ab9b477f12d77d5a452df1e246a359802229c0a9d1e186c85ebea978485042f727de53d792b6bff741c19ab26f5aa35682600fd8ee8a89c657fb767cf6177d9b3d9447b7bed4835049722e04541b1102a09f8bc21a4790f4006af2b6443bdf0935e5ac865cdad04da467343fbf8daa6dc40cbacf1dc0a53aa030a48cfc65712a57f808ac356fafd69cca34ca7658767d36cf2668be9ccf8080781467e43c3ae4eaf6e691113c27d377c0b60f41257d1b3d1157f3c68417aee968cbb0c66942203806cb9db8e8402c7e734375ea9cc83023fad4dafe1f83ac212850cd689391c787514138f11c02caf90b626437645ea22eb125832b161e6270e12b28926330bf20ffcfca8580769330af9c44f226475ba75fd2581810edb820bbe5270e8026f24b37febb3dbba3706a88787ee1898c41d62b63bf8cb6fa9778dd0534a3947b4650215473df769249f1be7e78cd36343e023e61224eb04ce5bf7013b6184437a576e65b5a335849070b78369b7dd4473974bf54e827a5eb8c3e9b9815363a63f606ae9bd8030ad29001de294fbb0cce1975d7c279df3de0723d871bb8c51e072148a09b56153335ce1b1adefd4d86cfc84bae353d3e213281035b24098d97290d84e5e33a327c78a8a051dd0bfce9552d3e6b349c0cf9e99fda403b6f554ed3a402a4fbee228da505daaeafe390dd6530983748fe106c0eb6085ee952e7eb0ccd09066cd8ad0dc3cf0f56dbebd10c09b99f39f7cb1323a7add6dcb51a0915dd70e333bc629ba5dbed8874e98d871b48b09d9acc6bddc6bf6c8ce3283084744c76d65276f3b3fcf4478d2e623079b52bfdd8814c4636fc5bdb729ac8fa1fb164c52b8c1ff2bebb16c565accd3b7080b889991701c4e66d85e2d02a20e1a4742a462a0841c98589494f5a17b2183424f93a2783724eb4c24469edbab54ed964a8e11aef63dfcd0f96cdb297992e8d4af6f9ccee274a69a3a158127311a7882ae57f45680e9c61f40427b6530be5439ab6afce80a922cdb7a297877dbb55776ee906f19cc96808e19c45ae748fa51dbb414276607f3ca8a7520e94ff3bc16fd7bd6067b21cab897e650fe221aed6e4569f9c0cb73102c21ab6a681211a52370d6873efd38fcdad72676e9983efe06012d9a3d8ac48dae3b9d845950ddf6f99b9f229d027ab363c66aa481dc2da2c5998f54121684b2ed22cbfd419e812825b83646854d5f74ffe013787b405f720978ffe5d3113c265581a733c55dd3bf24612c51ac106fc7ebaec1511a774cf25e1a0f9de4ed435e73d2cfd639111e327220f1d2660e1402c3ace4cd03e39e9a40173f0aec1d32d1c4909643315af9189b7217474798f4dc24450e5aac079cd03bdafeab4d239326c4359b09328ddce80ccf1d3ec5437aba6a11ae789775f04acdefcf0d8c82eca3ff5c6e96a14c321742b2641763802e04219d35a54a91015052c040902edd97ffd25f618a21f8b12cd9a69c7fa6f1876fd732346f39fb788786e6c3d1a8763d80e9c914522925a29f3e2626c603fa0f53e79b4b44da17ae66b6edf9408dff35dda224076d2b55bef4ecbb83890f1c2e36ff12bab4cf681b648f20317b43db297ca7fabb59acfb3eb461c143372cca8caf7a43334d7e8f58076c380cd07e8c80d447a7909622a8da6449f1d66ef1a77313e5a7256d6bdfecd5da9ffbfe72a5c47b1dc527b120c0fa6ae1a7cd8ed215aa1acda901932bec323656b28f33d4996ce7a6de01192be6175ee56d891552b77a1a9ee3685d1336d0df6d3a273f28e9f2905f5c8d5ca88ac9b6a1bda9a107ef6b99d5c0ca39c64231078a71647ec419fe0bc3cb5cfa3b1189e8c302afa05620071f0edb97a7b980eb653b02b7515aabd7c06094d060383cc08bb5f6fb91b21bd520a69e61257195686efb68a07541122844a263882d444f1605e6e51e03c0254e353983a74162d2208b581da0490bdf680f2591f4bfc3dae2fdf267a764f4cedac34425ea7a21d9a +0xaa3a8e590bd53d04fc0b064006660148bde3ac9c9e44b82db2616538cfd8e175d0855aa9fa4bd60ace4a01d04c8c2baea401e61eaafd966a27d11e037bc56f57 +96856 +0x7021f18b8f398a5999fcdcd128aeea78fa2308e697d59b7a3433214cd83b7163bd4a4329f933f21b5d8f81c59e55ddeeb2ab61107dfb9f0bad485e19e3c3df05139965982d10f355fdd25866508869d558ab8eff5197804665e25007cdebaccc3ab65ec273f7156d3f6c689a85701895b2ce959d5bd3c49524a700fce0dd5f1ff948368d1210dfccec06b94a8635719689b980d0e2d5f55fb13f75e162be806819f7f5e35484d9dacc47545f9cfefc41a417578230c59a0bd553b79f9cb9970e636da4ab7f7b8bffa6d840bf0df342fccd8e209a8bcc3c03588bcf1cd6f32d799c4f4bcddc1c7ea443608554213eca30cac6e5003c1262ae028ec4425897c9108f48f030b390392f6c882c0422041c466469ad9c8bbe94749a059ef869cbf43d03fe9dbe4cff440ae7f83cb95670c1a4631c8156bff85bbdea97662552b73568bf19595eee90289b7c57bd5a07a740b48f89681622ea3df1b8ed23b35c8514f78c422df8e36b6c4cf54eb8cf7bd421ddb0586ac4fab9c478cdaedd89cc5a195332211f7571b9988419843300fa1ded868d318f48909078bbf1839c8fed61cde4795d3abbe1a235aaafa239d5ceaa2b19efbae08a2c95e020eb1469ad06bfb712299e83b37b4dca28804fcf363ea463fd9e9e647216f0841085084bcb5e9f6046098e044586e3df655434ff0b91331e9a628323e995caecf485084bd13e274ee6e2d3c45a4c8bfcc9f2f8d03c107ee258031226d5f24ba132b4bb70a7ee7f0b5c7c15cbd8136eaabc24444bb103ae3a9f48f27420769a2a34dacac236b6d01f0e9ffd22a924b370a6b0c07652b2eaabd7facb15b066e00f60bfdc4964de4210661332d0b3c783d7ef5f135b08645bbf68e147126f0d44d9202a9a0e1aadfc68ca9f5ddde0430666fff9e602b96229fdbac50c7243b2ef0fdbe5ab18416c27aea40d265216e263a53f46e0714ef57bed356ec23d169c0839f8b6b96fbf64ea6b5b2334363feac31c150eaab2b063791842a4127ccf14b8dfe166691c7eda6e2657aa309142a44d54ea18ebcdc5f44d05472ea4365662278afdbd65266419da670069c16b07582ad4272d4cc877f21c3caed51f7393ce7cc1b48255955b6857b7be2a90cd764e8124321575adada31146dd612b3b6ea0e00d6e7fe0724a0e0d9cf9b345be77cd7bcd75980d844f5151aa3e9a7197cf1f7af5937aafc4185423a019cd8747f21e4056567dbd53444207f03747998e9e9473018b3c6a93af82c24b8640fe6fcf8af7473f8e2c2476be59a132324b29c347f2b9bf8db8e7f6e01124a8d4533ef657c929979102fecc0f6f4496212e6f268020a6953441c9d5b539b3e8512ebc4fcddd82c64fe9ea2e7c7261cbddea68af87244f76fbae40344b6180ac7e36f2c3365cdd349087ee844c8a81392e281c47a3273ccba8a755fbe8b2145d2414e738d86dbf491c8415b6c8de2b48db9094d41e51f6fa04d30f12d554f6640b70a397fd39b26dba8964ad3897e760aec9d73f3ec9046dd7db76625a6eae27fbf02fc9ebe73d08343ee54fe4dc3de96d7ced714cb8ee8ae96692d1be28c510bc3f92b5eaa0e982504a9f8513d6b64be150df518f453dbb011d6c484babc2861503d442448c3c43d7569a380eadd9eed2eeb4c651997867e9a80bb0471f2df0d0e5fe5a3fd2c0b39009df4e1e882e3a08fd74bad8db27f567ae77effbac8fb8b38c17e4259bfd3a450c75b1898f3e984a2627146e34d3cf44d7b9efaf786e4587a127c73c0e7a41bc06644797ec906e6111d6bc59cc035c47cdd896abae55ff13cb37edcd54bf2ebea0b5fa92c4ad2516658999e1ca3f043a35dcce3674c94e21b34d3d1f94546b13826fb0c0421b262fca469550570f2fe3bace7e99f2549a7700749f7cf7c25e83539a536b8b64d874ea1797ec9afc450c02b58e1d527d4bde5bb1fb2aa59071d6bb3fcad9ca0fa2af6a0388ffbc8dae7bb599e507b9ccc91e6c0e3972c5460bd36464fd5225a5eea6f5124ecfe44bd3f97c826da251ca7dffda92429c7f6c9344f314d420c4ad2322314dd2a53bbc1a4dff790d3542fecd494e45fcf0fd8b73ef1354378ad0afa8ebc6bbfcc8e96aec41e585ad07b4f122c36f3050b6642a129c6a2e0ed77134e7c95d65b58215ddb29bd6af3561ce29e537e65a2635dfd2d815a0a94150cec347849e51e319e79bd2247cfe8e8bb8307c6b5acc67b6930a2d215ecdb83d10e430e330896fd6882eb6a47c7a9ecd9b8e5127748cf981ab5a79874ca35ce65e1f0ab0bc154201201ec4e3812b4e6f9fc9ca35dca4c6de4d4a241011321392e1fd3eb1e9fb43e2d6f166a8311a87b8eb6b515c391bb515a26396845583c68ac10532af604559c0d33103bc344e2ff2a8fc4d6333faad6dd12c38abc29c5e1725c04f71c8fb6ee53f6502e833cf2f63fd0226137348982f022e704cfe87c17f35b4fdc1ca2369974116cdf2d6a6705313074334a10d5da45fefa731b14cd90a1b6ba5650ec7311f01cbcba2c4dad90c11920e8e6552e4110df9462084f18c02fc6dad263beeb0c5a80c64c2a67351d5202ceee8651e15c137d4b3e21e80c4ad03407fccf9a1cdd05e620018237ac2f5685b4b0b4c79d8fb0306583f29006855556e811ff2e7708a4a53076ee4f613b510aa8ec0c06b150699199cfe4a7a60401d7f1de7cbc881399569e18a90ef2c5d419e1dcd69fdb42b2295e6e92bf594b681f9baeb2f4ce926662cf734d06df53522c161faf1369db2c600a0c67479ec01a966bff4c47c8e99e623af364c795684dc9ac211fd1fb8e3ace4315ecd0f5068be4d96ca325f59d93dd67257ab1a379496b1a9d838beee05fdc80179dcbda832e837a63522fd323092cda95e965980ab798f7c19471d2562e03578df4c8ddca84eab57fd3c5f02e40d91ba14b43c1912adbba49ad54446407eb2fe57c387d412193111e9278caf3ed8a90f41aeceea1159bd8a2488393ae8ffc7fbaae9b278b870513cc28c8c2386189d0ead2b14dbefa51e957e0806e7a28afcd7a06816b1e17c94405012684404f8f6211fd418d5f6ba652c72feb337b647dafa01e5bb65d66581865b6227fc009e3baf6051e1be6cc01ab9c61246116b5fe8cc950baa7de052a174ab23d132c132f420394977809adec6a343ebc95c0afaaeb6247feae2456b7a7307fe6fce90dda9db6f64e301c83df052b1324302db3fb51e75ec837a4dda96ec399b08b7b5c6e34acd4b2c2b3e05202ed88ebdea2657846d51f87e2f42c47d4507a1a4d7781729d41aa65ae4435dde9f7fa83efc336aa40c804be2e86a54b5e83ab94b1520f504e11d1c7616206db30d7027ce20499f9b61ca8eb78d0fafc83b9a8a0659f78afbd99f5686a81e5e26e071b4753eb21ef3d6f769050577003ea8eebddc8b43fe962568fc95828358c0804bf73c3eb41033d2ce83d53aea6d9d9500f9d6944d795d2b40b5a88c97820755c6972a08989de4bd18852e13b21e6f6c96e7fb5a5d22d954ef29c9aea40585c8a93d4885a6ec8dfe9d161978163c3b94792e53c6bb2191083c01ffd0f009c23fbe909d9b2526b6ff25df9d515def8a757177e6c0ae9f0db0f1e553dac4b54523cb3931335f72e8277888c286d05ee377456abd317fc4d6b2d47ccbb4683196dd99df0c369af9a9de5db89000b7b2ce02bfaedfff77b77378ae6f724624a63dd3f02b378a1fe2848c9e1710a55a12d37ea5ec5414dca16c6846654d79403cc26f97c5b9193656fe99014e495e00a77b53c0cb2556f6a94aec66076633031aae1858549ac9267da16e4f054314f2994de9d8f459af0ff8946bd4fdc45db7698935f980e284397ef4714fe307ad790fd2a9b50ef8066db5d24d59ee6fe0a250d93043f39a31b5827f0bcb919c13db3190f91ec20b4259098df9bd8370a20cf82870fe52cab8e3b0cba489b70a2c60281142dcb8984d1b1c4bd9c863ce8d3f88fd5df24878010b315fa553fc5ae2521cddedb897aa0efb159754423691888229e15fe67baef3752cc374ef08931bf7347a607708466d411cf6d2f2a6c27a1c035bdea493737868ca807b2584bdc199997205e4b27652345bf2bba159674d563df342f239d0772e331d21bf18e1bb7e734d43c63e41a51df7127817f78be8780031f39915cbd90d8e22cd836b06f1eee99181e453b04e441bde6f1c293333ca739e5a61ce6f844e0318e93b26344b3323c829079ac936f1eddf097897691693bfc1dd110cc16138bc86dcadf073b1944a79a2f7ba96436c959caef2e834791d0b22e57379cb5815def40ea272cc0b58862d547c5c1f5efc3c9ec754c49d44ae804adb4dbb94522b94eae7e1544641c8fe6ba75e286b70eb0a6bba64d5aa5f8f46c025687a2435c404f1cf343dea3b2cdbbb0364c5825f7f268df1ebc065b208840c2d8c5f84eb2656902e61d5bfe2cc44a5d058dc6c1501b98cd2b030d6266062b7598011bb5a99b3506c31c5cd1cef62b27600143178b8eaeec77dcb04a1e10948130e39d16c6743b8f16cb51cd2de5d695d2416da72eee23d371839f70cd1a147c2fc7fcf07d62d5025da4cb5ede25c53ed8e8a6feae9c8008a4a23b75079513dcd138abc15309aa07142339f534187f68f0516f6c7f3c5c027db314d532142b19e1b03a07dbbb1313b6e12e2ee4307dca9506579f352010478930ac0ff119c2b9cdc918327c09b8aec249087a432048da5381dff554ea354e43a57183b9086332f1edd6efb867f33ed2d55945f54a590e985e791d531d438d397bf5deee72852bfa88f68e15786b5a5510a1406f3136cdfff6a365b41bb39ad73eb98025fab0fb4434e7ac179d7977b57570c815576aced6d4ff6cfc881dedb9682d15e3e37f377b7c2ab83359c61d909e386b8c2f5d57d993dd9190c4db0c3c82d0eeaccf3856ecc94030fd3fa9c262d57899384b871f649dde822564836ced194598e53084d02496c8a4d9b1bcfc98c5a1efae2e807c046d72ad0ed99f864785eb932199ed39bf8f14926d527822cee954cd523ad204358d2a80c1b6a7eee863437be67dba0a29fcc4780c8453db61baf1b0c902e43e6467668bf26e051d2c4bdd91a85ea3b7d07a58c45bd9e89cfda5193877194f814da6c74cf5725f87af7a2a92fbbf12c96f822215bfc5aeddff423bd2e0e06c832da5cd426f661fb4cea8aafe35119fc543aee0daccda0f24e32cca0eaaead39a90fed8eaa4bbbe3b2641ef21f8e89321e94af581e78981e855af544a19ab1d5e141c8ac459d5c36132c067accbc6a565ecf0e0b9b446cfcea3445b23c1b392442389535de366c7fd70be94fd021e3f07bb3b22d0a7b4111e68a65f1a4776dad35bbfb325c5c124365c96f7a15051d89dd0844c6526342e7e222fc09bff676f82094a2aaa958760c272e410281b23fa8ec966bdf5d44940544c5b30377e27c8d6c8933a5ac72c161840107effe6f72d61025d07e126862f3753b32e6b381a6f58263562c4df11bcbe40c68497383de9ab17c1aae5916d23ade4c20ba5b1d1db7c8e9b245741fabd1af150d19c737aa7c3764f2741a950c61e6c0268856fc095ba8e5f0fb09429afb4ee59e67e4d3ff040aa500da3d2e39f0f45eeb578e669169891db753f4a30fd12744c239b19f04bb9207ebe7ab29816f72ef182feaa5dd6ad35bb0571d8a33dca3fa219916e2e22837525ca34ace0b67c73b5418520016e6ed65830e6d3e2ea32ace648efbe6c0d4624dfa17036400605b0a481baebe64634103d780ca0927ae2589332048f1c74579c16e4abf3587e096249b3fe628ee6b36ff54b61d314686faf33558e54c1e05e6765f446487c971e051f68de386dd853420a3b74fffb5b213d4133dbb3fef9c0f34760edba3ee9aa158010b8b20583aa32d6c8b46bb99bad6f475d8b0115f905ec35baf0dd11de4410263c3c73d8810ecef563becad1d27ad1b012fad0c986b39eab52fe1597ed52817c5bd80269591752e0ace281d6680ff10624d9b76c2b40a722c973e823af7be5fce009c24a645a7b1304ce1529f4d349c3e37609804f4382469ee0e9579d26ca12794057de3b3ea426fbe0195ee17b4873ef7e6ba87b22bc6143c38da62ec98a77781a1797563a7a76f2b6f2e7b64e6990993132473764b20d58aa4991ecfac3767cf5a6284dd44a9d99b13656fbf34994816d11defc900fc52df3a1ad4030e1a9f87167e37aa2b105516d581f2ad0551a28507ee2331b2203643e2a4ad0e2818c6b1bf17b751c2a48aa59dcc2bb8c287c0ea9de03838c95527be8481d17a60f884533c732c5a732d214f538c4367d104494c7a395666ad63cd5908f767cf2084837775dabd4ea572c11ddf0a62429b90e6b48841a442c612d21b564f9893cf826824529692b3bf3c1315298eaed288f23f29ae424b547d2adb0d56d18b50d4bbde63bbeed4142b53bf421a60529e01f4fbb3d482732438729335f1c4698d99f78b3b9829abf6507f6ca998c7742f6c5cc25ae24a423b60b39f9d0d7259d385fd17b4d1903ee39688c2548c0d3d0b32f33e27c1e2e3205eb5aa4d932184a900972bd64e6bb66265356b4adf78d4bcbc81152157927c5b98405a4b6c1a1197728b6faaf8023afc254f0c93775161ca71ceef518da23675781c57a17ea5292543a28a37b59cf3373e9e50383edf0ebbb8a175bd4c5938f565104a57b309f4dcdca425856e82099e19eadc401b6c0119fbc44e6f7a01ab63c7e6db73f2909943a359e79d0cfda3b61cfb5bb3f53e626ba1fd236f00e0b6480564b1ff228041e3018979867553e909b0997399b69e5a3a12159cc3c73e822a895375022d2213425ffb824893cc041e3e8bccfb45d4110db5d46075b6653694ba7ace85fabe38ea2378abec4cb21c7d2c9a0fe08a28ae6cf401188db49cfb0b00a3658f719cd763b7c89c798a4b58afe38ee4516de259df36666b11ab2af919c394e1287a03193381b3fcf734e1e13bcc2ff255d6493cefe4c9020b825857456b16ec58fd3d26e4eb01736f32badfa94e44e2f4ada67c2364f38482216e3e1760f12b28e29025fe5b79abe86c1e7982d0975b36da4144041fac9a7f70b4d5180bed489f11453e073be4496ac957d74cbcee06244562ba197dbbec09567145cfd2d2ebc673a39b89f20af8fd34ac229279128bc5d75106eae7ea2128beefb5c51e67bba3eef4610be8b35eaa926482d96fcb9122765551ffc3ffe2e48d744e80587561416b7ebb1685a72378ccc81eab06e0c0410bb8c3e17ac3d646ac49378ae6c484a5d38bcf3131adf070ca201f8fa61bc22c7fc0831775fea65503b6996b321ccdd90c61c5e4548f6d9874b4ac0eb7423cebb8b6ba291b78f91a7a029ca9a245e4e40048c6b7561341fab2cbeeafa11ed984a0e28fa0d3f8789bfa7767cea00670ce958afa339f02149e6dae0dfacc773e011e8b2b020748cbe2695b236293291a9fb56e88df9723908a8ba63077a115166919fab5da1e2e99f7b1f7f7ebe3748960473b9843a7405bc8f6f97faf86bf07c57b7856ad80738ae0b8930cf3f7b06519333a54e8351f1d6094ef2329e43fb91c2b4b360594df47a768778a0139a558d061b3e255ab897f584fd2446d245bd67611bb7c69c4397854a7ea989e101a088fb9ed6a126f4628ba0ee80904acdc03dc15125162784bc5ed5f355e50e4d81d5d223215a8eb1ec28eb97b9b75e689ea541f96dc7716dbd47c77a105a21ea8404387c80a9e85d9f2da37d12248382c33e91791463007b25008d774b51924501947cdf8727ca73e62a87232c5060c8b86a0e549b615b398df9a67f6953f5f984f74dd0a75cbb817baff51e8ac36c9708983710755af825429390f71ce9b374a8bcf9f463a12202aa1e8bc3a0060d7a1e799a3124a85ddb0d7edb72b87b5152c7462fbf4ead94640c0699b6fe90c9ee646ea64b4be1f2a7291be476de9165f08b334da5baca99420bf8dd6d08ec386094f7f9a33d906d263feb5a77f1c457fa4ef4d22c4a9087194455956a5180cf7d0a95f2fd8c2c13e4bc7d9bfa947cadbc8d1b6bd7709814562fad70136ae705905fc9209eba2d8d5f294337733932edd3e007691bcf3997953880ec0ca7976146ef22112b4a0d4fe1f0cc9b86427f8ebcd259588db8fda732f94067caaa1a690d43113307ae53c239cd7a568862cb06f3ce81c891b06cb9cbec9c81b1f4d8835fe61704d879998ab2f9ecf71dfc9dfd054f0127bc680f45cc7cc5b876fa5a56cb62b415021e271fea1094db9b8270c76dde67f482224de1c1448c7a6e2d2849bc2378d2191eb4d84b9bf292a586dbfc99f716bd7781b10426be31562c2fcad2ceb2c5ca81fdab7a541696bab09c48031613adf100f8d123895454ca1554aa985f9b2b6cd12d834c9ffae19231154d816ede9e2db31a16d645a17744de5e5ff10b473a478b40c4e58bd373d7cb9444ee009257d20247fa8308101964db8f53733e4142d914b9f8cba41abde9d49bd6bf77e96b7c731504b03d4aab88916a1da5850405a0020b8765753b3056e09e6b5c313e598b8a03cdf4419bbe5e949116fe6c19d32ad7b809597bdf7b9d740e8b6ad92ba28dcb96aeb5d19db2255986e7e45ffd3bd80a31f70e3461e02c038eaf61bc1bc7019c403f7b59cb379b54ae08fdcd28b0362e2bc90a1b5d1e8113715fc766a947758082e8bb46aebf1f1a88e2b15026d0d397e7f7b3bd3b774b28690502753ea4582ce1430c24a2a92f1faa1d9575620e2efc091bb176879ad8b6d847a944565e37d5edc6d470518659e8840220b974d8a6af01ad89f3cbe9c853319022707ad583300afcbab635e71de99948d978d9b0e9456415839162f478622767147636bac8afcb5d1562ca4bf9a76c5a26400b375533a2fc54fbf73b87780c44f5b1f47e86c991507b1289155bb68fae9dab83cc791e30ca6480033f741962a22cd04e813c020f8f5221fce3d27b55beb617cdf0c359aff848c9f170acaacd17404daf7356ed9852412d8037fc8a5112f6216444d27a730e68364c6fbfc0ae1cc68691b575d0ce51bea1cd7218482443d434c12924f52c8549519e9d2bef781b36178fd7f77013f6210b3f22d45921b9e6ee7f1e195e3ef562a842795f7bdd9b057d144b8a300bc82ee65fdaaf21fbfd949af8b44e1a1cc75aa6f294e91a2124bb23a9907c9508402eafaa0a1736f58763e6b85c21bd588387da0970473ef540cda7ca476d23abe6a6e398219b0ca0dfeb4e58a632bc74a280bdf18c085ebc67c385f0c0ca4069343e1eb4c1a907a06f813e34030f9bf3bcbbcf65489afe0912232aa7ad128fc2a13abd8a5adfec66cecc22e4f306d0583acf9abf467d914dc86312795ce4663ac6534c836d8dff567622b8e606c70e0495028c8a062ebd0d0319e9c060ae78540bee383a7a51c501ee3b5ca1beae89ab541b313ff83cd5c95aadfd2748df1a80fa822d09f1c9d1fbaf6c8ac27b4bf79f1060055bad1680052795e9188604e1540aa5979c6444aaa6224ccfa2dd2dbc6222779557854a204302781a0ea8ae414fc4dee44c5250b383ff4297dd44a26c8732c84dde21564af563bb2c941139dec6b174afa44c7c91279ee48fdc52686c90a9e8bb3a01b974bec3d58d235045fe7b492d563ea336a81379a8f42a76ee50f0f05f5a0596f211e1cb6da847064144b0046f7466070d8cba181671323282ae3abe72a6cb517ec710c2da2a7973ba36176ba196c4e86f938e02a3939e15e3d8d05ce92df5e1dde8be42a17035592f4713f76a19e5a7eb7121c1d6b7d88170655474195c1f988e1b6cd35a15f4f70efc38202f9a22f5ff99f7ce367a5c05c6c8396c99bd93161dc38efd7a88530dd7c9e68e787407331a6292903937933345a5e1ded0cf0abafb65a7197943b9ee1834c19acb542cffca8f64b0559c387a7b52f013550ce127a59647bfece4a4185ec13bcd9ea6eeac9e64e0972204964bd663e6d29cf3b0ccbac9e3793bc7ac3d09f3c79f68d8e6d9f487b8bd14fd4737f55d38752f1ff41a9974fcbdec792c9cb840e798c0868ff87b6c4faaa502c5bf46a3677371fe15b1c02c15f67575cfe7c84d3e422c2c5498818707e868a19c5248eae6660bfabff2cd53a1cb7d59e07ed85d1e241236cf2aa56c83eeb65635918a7857c563b23d7e2f8032955a7218f26705299709327a3f55914636449d1bed79e01e0a0f9128b455464afc937ad3c2d2e9c34377abc0472079c14769e2d9d695c6bbbc6633fc35dcfa4d69cec0ab60ca6f7d91e40f4bc2849a77aabcc3d9dd7c80b3451df742633520dc5552dffa6cbbfadb1ae4d977420087ebc8a3bca6728c92874c8d7775ccec6e5a57c6455b4706305e36e0a6dd3602a6a049b549ba264490ba2b3b2110e3711759d99f8d48705794697e7dd3d82f298b177677d7af7942ffde79bd80ae4741d05d6355144c891e8b9f79f2fd128dd3b9b3f751f2d0ebf63446b06b12a858fd0dd78d7d76d1e1d9aa6282069ef6e2afa72844da37d8eedcc28557fa5399a8f1444aa08f21732b0765555f2f160fce0bc7c6d786f32202654f3cd8b1cfeca7dd084944f0a09ac52640da49b31ec79076b03237ded146b73e2ebfdb47e42be60ece35f34870c330b4c173da58f5a8ea8ee4dcee484ea18db5f5a0b8133cd1d404faa333fd1e86fe416bb49987574e2ca2da294369b7ece67b1861f7aa3679026e32037f9506509e4ab41f0fa4a001e75104ca0fa9c96361ec1b8622836d8bf188f8f94e96c4aa914f1f1595576c7e9b17f9218b8eefbf7087737fb1255e751213b3d71988e61f67ad113ad306191ec8762bb25f9f975ba2dbb4d13c1665eef46cf73f78c1c70992033ee13147326cefea110ee4325cc27967640d2bbd303409134794e4f8040390e00cbb488144d381f24d99c21dac7e54a8e595f8a029fed0950979d6920997f4b1ef2b814acd0d2f1d35e5618802f9d51ede0e3b55df99db60c150c60664313df77ab4640a375437c97e645b27fccf6b4791d85c54adbf9a1513ac5beb9059cd2f23e8695610534c856ba90763f66997a1c576e41330ba8d10550ed0a80a8c32c76f2a19a4e474cdefa2361ec29c52dabbdd8c5b17f52534e119dafcd25f52ff6ed11bfd8d20534c56967dd9da3b05b5044e6b39e9678a2215e6a318e0fb188383ee107d5560593858dce2e1016f1cb6f98ca608fe0453c51d3fe9bd5a6a778f851aba21b401012274ca27ccdeb4e2413a3ccf30cc581cae657a3162b529ea5400eb6b832faee59b19029ee5d88900f414c33959dadf3f3e9d49fca167b5db7175d4c70a0ea670f2e40adad47577f33037b496dcb00646061313bde2089ad578626b3f2ef7a43dca34474e013bee239601854a41d269cb95656bf7ad1e4562d93513467a611496a1a84c6b04a2782c8610c9d611c8763a5d12b73c8b0f420e049c617f74e16425e9ae7ed4573f928890c3d6ccd4e8b81ccd8979eed4522d319ad6da4c96ef3f7632c5730c6169c9a236b9409103d9bbdd776858a1418d4367fc92e23068e0f2d1fd7bcd65cbc78a13f86f9bb51711de06eb0da7d63b27312bba4f2dbd537d2af3aa3fc282eecf504856355cbb8717bb238907fc0029a682f74469f155fefa4445d98006e652e7b8d9c0c8e816ec51bfbde1d5c9b1a581a5553b81f19cb41edb330bfb0f0280a72022d898e259bf56783075f5955d375f04cff01582f42b215c55a1ff4f5a009422cdfe03bff6689c5125c5f5f38547854db2129349feccc844284c0b5c7f4b253d35b1b7f57f80a9f6f8524548ac6e9adcc61399ab0f016a3f255abd9ac4d8d0dbf4942417479005c6329b62294505162e5663871ab7718d89c76e74aedd323d9b74f5b699f10f164b6f01eaf9e1b36ddefd92ea3d8a85b8c0a8e7ceed1adfb1d841870de20e5671f308463e5f04f2385b16123177fac6628024673afa2049e42ee4a888a3f21e9f5988a8daad1139dc2f5a720b5e8aac1124d46d374a6ff92b1bd8eac5444ec004eb8ada5e88b8f2efc81532c655bcbf5b4b335a42427c761d1b98be324766d32925693b28664ec5d9b1e0c500f1f378975fbbbefa96b839209aaea35e21ecd0a293be4bc6ca552b207947a939b7d1505bcef81bbeabb5caec35752aa7684330d7b2f49cc8295e8b6a9ab46fdf1bd8df2f3552f10cf5e7a3c66896c4bc9f0c8c5f0fa69e8b07ed7f0e72b1896fa27c9d781f66df6409e04c45a08e01fc1aab4b9f163ee1bdea646e92adb97679c02ee3cce9ae17625c123cf069c552e47f91e71e4337d6af4565e27db846c77c09827a9420836976610fee4d40d738144272e763332c1dfdad6473460ee3fce4f2f9aa7450a1262ecd3be8b2b22e31f9e7a0e4f44285f81786e289823e1b7752f106fbd3f661edd9d528a4c73a44d103f3be38481dd0258b66629d98a257c734a83cf7498e5011262d48bb0155c585d0db1d89e5119506d7d057481ff8137d086cfe253b84f630924a3e83e770fad0df22612241ba3f1c7b3952e18e9bf9095cd3ecfe2076ceec9c905ca7f0288f428d5e0bc9e49448e6e425c8224b0a52ec90616bfa9ee04485a3a4359f91e8ed4b79d28fc9442c4cf6b10a3962fbbfcba7419a0d931d3de19c460a4bc3634e8f5c13446fa8f6eeb5bc507b192c0748bdb9eed2446011fc30a0f22721cbeaa5f004e8182e0173580db840ed09f60421c3a506cea2da13b7bc24467f3a017eabb9d676c24d3b2ff4df6b10c46e5958d757e927d39b79a8dceea6b197171cb5ac47312dd73fdea34185553eb5c8beabe5f506a085b0b737f842a8a1f32b66264412b59bcb886463caa9f72925ab9e43ba258e2f69653b4786429ab617f98626ffc6c44f13c964e7fcb7d16e988990d6d063d012d33b4e6e03790d5c79f3f55e2bbdfda6544538b66429748d82d50ecbc53a8cf967958901ec5061139dcd2c227472c23fe1be88457d9940f479309099150405519b2673a9cd634669f7c7a32a568fa27a5087bc1bb561d741e00eaed52c6ae9a9f24086cc132c2dce1c85e2cc4e5f1ef435235cbfb82d97e45bd1b1f697e99a60e1964aff5a0577be708a738ec88ba82be423d297d257135a412c5273c3daa8250d7a38aa0ea9b4c99847cde8517fde80020bc63ab078ca12446108e35ce89354ba6ec862ad63856e08306a7f75b612aef34d902ecefd3cbaba323dbbaf8ddc7e9d06729fc2dd3a1a24f6c1aab1c8f4f75c5bd8da7a7edba226f279635824e41109c3efe7cb61736c92ed7c007222f5f791c8f8c46f5847672f343480d3586aaaa51968a133ba91c3b696f1f7434e863e282788830a23d088177a078aad92a0a9e389a572982345be2475bc15b1c62619a3da008cd76c277394365ae7436e56ad4996fec27555efca412c42e22a0466488952e948538bbcb819ebb72d3135cd134bc40d1737acf066b10d1ec33893c7194d44ab4c0b2cf0d40d2ca4d2f393a47a6e8338f77b930811e8bab85f49eeb92a6401ef1e6aaa7446025b9c6f07125d4126670ad9adc2976a5c97981cfa9fccea623cfd25fe9eb78c8e0b1667e81c581607f20b343a961ece81364662b70162e7cc388e0933742b1604ad9b34131c45578786b29dcea81ebceb094be6fbde2b811696fa1eb5b54f810ad5a37a24bc759429c7898cc65307b41ea3010055608764b5cac9fcd1fca54c04f5b7a07957993a73270887be317a5290761e554032f7013e66862a2494cce587a0503d9d97f0d8d817a7f512bde706c504ec4c48effad524dcb70d3a2816dc074805a81dd84cfded2bf07b6072ce5f30d2035bdbd2235eedafc53c6f21239e185f307656a2edf806d67a7123da90aa686fec0a75a3d10d1d52493e501a63aa1f78692ef4725475d9a99e8cd96fee96d0211eeea2bfb47e1866ab69796e679e9106384863e120f5ba17d504fdad38a31cb8046eef901e00834f746437b7afda21aaf6591159d3d64c93c6900d1cff3d82774511c8bfae62c29f2cb537609ceb25b95bb7a956ddb5f5cfebb49429b2e4c5f1595daab8c5e37ab84cb2e503bf5031c3b10a8862bf033a0eacc90f7df4373ba8a9c911f5f521003d5d03cd1ba797ba4c9eb83b07e85cade29273eb642383782fceeaab01cc99f790c61e5c02b62043d68d573da0fa10b5de251bc486c177ffd92118b266bcccc54520791e639b9852d4055e0ce864cde673ed3717506e83275758f9e49f3627fdece48a80c8a85e5bd78f332528a8e2b426536c404b8b13a30ccf04ae15d93a05da9af92f8c6ce0e353837d12fc370da377e021fbf297c7e77c0baf6b55067171a0ac1b773969ce7ddaaaa262ddaf9d48eb2bde96c0250e69179770c8e75e7cc5d1a088044a2f858fcf3d397137732ff8f28f189d4ea365ac81eaef334741aa86e000b533591e949dc3e3a8dab41214482092569bf8a34c262d8e8136ff4099194e552990c0b78a2c3b16871bbe1d08cae7ce2f0f58a5506a8ceacd4079dba7018f166bb92baac4bfa74e4a90cfe47bd5caaaf863d919e0fe229829ec319372e424bce1f8f438d2dc9b0369f66418dc0d4ba1493604719c35810f2d96c0d88b15a1c122fcb51232e778de7b99052a97e5ed5997f2755cd0b51ac85edca24b3e3a88bbb520d8a77374e327e6154d8a6de4223c7b35763c2d01724c242a504c2ab74c150ef1e96903194c883fe787c89c7c7cb2595bb1801f8f0a13240c555bcf005e65970c71e760292767ff7c5e55c2336f63c8e1a1d916c254b5b50f2c0aa9ca4215e3cceca32949065f9b603bb27d9d7cb92073b197a15fd49c7d8f3ec9396999ae8bbfb41cbcdd6bc79a2faa8f0d1f273b166e7b5c5dac2c4fe4291837fc62c7a7e55182c4997aba487237152c1f3cf152114e69979a2bae386f4942a7714a5e9a972eb32b5d95945aca13261a127b6da687a006c9e572fcfe958c48b81684b0ef07a3efc167b26c66f84037e9955eeea10fffdd73de067afafd4e84ea8aa6712dbd5d73174645b505935ad51af65c06ca10aa4815c25abac5ed2ca1bf1c2411cf2eb7e7ad77e3f0af11af881ed3f7488a105be13060e42ee80b9309866982155be25fd7f48b01c1dbf9cabb75bcb52689a5713344083769c9cf1e3700e154fe5c6e91be7cee238b04b23909a00f2a13113686b8d146c8ddf3be2ab49f11f12f392a09f5b72fcddec1e186dd3e49aab0e95a08ec589b1d0dee4f44fcc189fb4a7abb352823be751f9bfe10b090facb625a7674485a73a87c21f8f99a08a7e7b2a9888fc053189dcfeb6e832e58a110b9ed125547577effab2741b4f6d4fa2b0a4e189658b5ccbc8238c94a90e5caff2a29b42873c00b970d76c003add70f59a3c0f1d54bdc5955b92c84c3a2d8d70b2598e26a5834b7e33588ea62296f45e831ba9ab924373d0df70f27aabea263b95ea313976f15e28895e6375cf40e3c4b169379de8c46e629ae89285c5ec2df7e17d0ce4c12f439dbb1172d6088446116d4d425a1be8bf35d51f31d550dcad8edf3ca88d50e402c71098432f960a242cffef514af6586d30d74056d21461abe7d74d8c9ee9b9a18cd21c5ee9427985fdaf78ecd540bc803aea718ae4d92431ea11d8407d55562ad647c44c6dd279716cc5109b63c0bb013d54da547366cd467fd4064d945c62a48cb9b994220eb4f16188dee75c3ffef7205ea53ce78403f38e6afe3a49c58618966e22be6fc0cf0cc4410b5728852d6acb50f7caa8fb6e3fff19e98f065a698ddcaf2852beae75cb7d39be742f5aef622572fb871e93b732ba2aefd532e1b40b45c3f3d976a14c3474b520c4da86ece8180bd6fab11386d4a8e5379334230e9bbbf4aadbfe61fc52920059d18fd0cd038c65b3acca45822eaf91ea5176e82043268876dec0b62e2abd619023b7023abc67c6b823cfef5447b8772f985ff7910d6cc87e6c23688ac6de1fee40bbe2da1a92770de92adaa427ace02fee571a0a0176fceb0c8f3eb72dde839ab201395625f5c0db8641ce19d7711212dec61733262c6ce4476c025e67a3d5bc01f3ce55e578e84a807e935b5ef156ffed14b7b384765f92a3237a267d175d7eb3f86b80630439816148f013c412f31ea5aac233233d1f1caa1a6fb8762162065277d67fa67ff9a9b006aee912be33988dee005a0c67f2abe4baa8bb5aa82e7c66dad8f9b6d371e9f62295844fdc5c952d4939d146de2167d86befd831960709758839979ce6e96aba036d8d8354b73c0e24343fd988f3770e960ab704d236d509e9c1005fa2a9538411feabb60e8cb6b7e5ba4dce4fb2040ea1c2ffda440207a96538dc07edf8cdddb41087f1f1232bb0f693a32c1aa43561f6df58bcd4b5c7de6465d59db120004b546ac83be7c3c282bd87e8fbd013338efb296cb16a963f2e4e119127d567135859d5179dd8b5a3b4a45ec4435b45251d1a68e0c1eeec94248b04b8b041162f8c2b191c1eaa42f7ce11dfe10da2833496ba635ff44800f1458306f33ddd747b6e32fe7ec646b0e6596ed3e4608d14888242e38f53601a7c1b9fdfead891cb2086d74ce69d944797dc22027845044248691cb018e51e815d2d455644884561455c80cafbac7c5133df953443c3ef539dd1af92a3b36b7fbd03de35a956e1801379974166fae714e1ea2f31ede23690ae446351d8c32d5ac426d342c3484d6eb2648279ce8fbbd9ca8658c01faac241a449a0b45e1f4e5b991d8a463769717349a5ab3adc74e2e8153a78ab812479aea669ce84decfb4ca65706d08b0be35d900c5784c38b04289eb8ff7b8ba57441edd2a5589ffd949ef4fa8e352d45182e6004b5376894bc504740c3db0734c0cdb70179e8b6a47f311804c53ea4b293ee471bfa381774e52a0d739b25a5309b72b88b50f52c6219c7a1fe42799be4e53197baacf36acc0d0a73d9ebf8003982e574d8e11a5bc6d2b7055f8c627d5c9a7ce4492415acda9295fcdc4cae82a015aa6e6290d4ef435883c4a11985c37a1244af70260b885124411b0323d5b714a22627c0e691315809b2625b605008ddeb1d7ba7f9417790209040d707ea1807d6dd136c68fbdc8574c750f7075da7e8935bbb593453e548160820d07f782fea1 +0x64fd89d0b09927194001a751b742427940c96104d7bc37489852000bebfed61055d2ac26076d5abb8c34fcee0d0fb3e0cb99ee1c7dc35d3bd35350c9fd1b5b52 +97648 +0x00c317f6b591269b94cc28ba064e5f1ef661bc877bd3a359b74dee92ffe034fe3be14bae90f70ba63d7255d6c3de544c49d803a73e21f0cf40f13fe33d8ef173d81c67f00eb7216019bfcc5694737c22e1c23645c85db12860115d0d3354a5459d1e71a375faf032ef5c9423c1355e0985c55b495fb06fcbdf5551f6295bd7dc538c74b10ee7ff8289f0b523924b826aff897c9a4c42b0228564228866ca0fa0c211750121a7d6b9ad2438404fde70ab15b7a022d73aff941ae7d8a934cad6f9b1537e7bf661fd4024a024613f15b13690f7d0c847c1e18965857c43d983b24fe9fa9607d43efd7db60b816eab19cc7137f01374e6fee0692fe7153d9e1c2e0a33afc68d05665cda2a0e584edb1149c6d44b710efa1a839d40b4ab7fcbbecf92551a15f5cf00a5be4a50b0eb1726b19c2daff27fcc3c528b609547f1a8901f4f17e28b277b345d91dc7a912ca7808a5a0cc59fada48dd69c5732ef7b7dbba5aa43af300c502c0ebaa93303f9d2465f6a37357f81ca359638ec32ae059166e9099f2b0d8a980d3fa379240f3ae2a1b53376a69ae3855b1bc8e93e89772dba74d5f5fc298a990279b314f4bcd71db8161d93c1f9bc1e27ebb214fd8ab999dfcd770bca8cf59d304352414c13b9ccb40990542da3f2ddc290603518b8b31dfc7c55a93e3fb1eac225e8cad41ac636bc17f48392a06f0a54923816361b4e01390ad999ff49a8c8dea7dd7533dbe7a5f9c6b1e69af919ed0477a47e00bc708cbffe6aa2b6b2c081ad529a0b125e055f92a12f46ebb5dacefbc90b341da20207b6e06f8b0b83e35c56ad855318a906adb02dd76a2ddc99f4610fd50136d5edba4639521da5c3f8a001410717eec6d4d77bf40f1c09773ea85dd269adf35e17ed958f7a202d7ae796d894891d3bbd55251a7d4022268db03217993100fb446ae8ce6d4f5c4ab098860030712ea89473dfb650d3452e26d9dab8ec94c2f78fcdf217583998a56ef2b7a49d2812dd55144c76f62e4dc64aa0e86853faba8e48275598daa09ee6bbdf73ea611791810822b583f6bb029802eda34e57cbb1697662577b7aec34b4a04700fa06a5733cb3846204d8e12c4c55a854937f706f30216541e5c18523b72410a7fd14397fb860229b222507928a4cba435e544fbc8a51185b0035d432984f23b01b113d7e9a16e4a8056497fdf9ee09b8d85dd1601f0f63ecf4603f2bff2968637b8718398ddeb2d0d41df83541437efb29225e2298622e3ee9ca2fd493bbc70846fd327537bf745db8d892020b530153782b5fcb9d53619706f90df7fd0c29e6a3fcf3fd40c11295d81ecd2cff277b0aed013a23d5e9e44073773f5ae5247446bb0bc39851ec74c15d76117ac4c6d266b22b59f2e92c9f8159cc2fc6f10c9270b6b20a0d124983286e69c6b50338f0b0ec31220080247ba1e07e4302cccb69acbb7930252adf2514347e54a56386bb2fc69cff1543da5eea2f17e5d81c69e342f2e99da842b643cbd63d23128db71d2d66f257f8da5532a26f1f7c0e8aefe7798489b95e01d7c6967d2e9bc428d3fdf0f4be9272ec9ddd12c71c706dbd645c9b99e1ed0e104994bd51da2582dde342c19985174b21bb4982609828bd5ed02cee587a9f821614978879c8271654edd6e87cd1504b23b65c39611a0ec6143c3ebbeadb3980bc41b53f1e800b4634fca0adc729a43997960081f32b894f88af7a49778c21d1aad7d829678b37db251588589f167bdf28641ca03e5201226131c8e22616c13d87dee78f7d70159dd14276302e1f3e037c2797df6917de0548ca10cc1f007f8bfb5fcab987b70b53dd8a527e9ccc536e3be75b869d0289c1e5833a508bd2c585b06069efaee983c7f4f6048a11a523e80eac4fdd019c681edf632eb69215faf14becac791a8de4bfbc8c759cb43316399d7f5b2cbe6ce4e3df72d5465b50859877087b9ef22b9604dd568bfcadfd95288f6767bafbfa66da8cb915480f0bd042dabebea85f4b015e005c2ff2258b067e8c6d5bd0e1cf54c98f3fd703d5cf42b61c155ddd88768d94cda54ac54466d2033e981fb6987217798f0d04c0d62243bee61640869633a270eb39c2be3115627f4af09cb4476b18b2352982c7398f3b20e0c74feab00ba8b80320812515201dba5b7db8121643be3b299d3b60279b92a5b1327353ff850735bc626d4217106a7b17485c172e8170de127115d3c8d0b115015f9207aa2927afbf08705c606cb38c2658710cb7ad986198abfa6743b5fe387a54954fda7f70eeb31a71bc17bc5fb331b5dd39d8509d8d6455d165c1d2e2d6c21b6573b7104bb9419e57ab6589d6b9e0688ae6baf1e72a1e76821569b0c6b681bce8bb68631ed9119e0c6f72597f66da785e5b8518de006e17f4bf64d610a1603d086f16005217ca21775065b7c481c8ed43df604dead6fa3f11abd9cc2a5f06a8acd6e87050391430809866280cd451d020bc731973766df6c021f11b7ab81d04bc39073a7f0799d20f8d9f36c0251e28dc38e703e1a66d44e968d44a6a744a5a1fe09ae6464bfe0f0c793568463dd6fd619ce4949c2fa23274c9a9e1605a37b1bf13cafd0fcbeeef5fa2534607e42257963091520cd9b6c74a8c9869c6338c11831abf0641500f7bf1511f596be1aa3f633b17c7996b4e0c51f9cb6903c7f083533ca08943a209baa8cdc128dbfe15bcb0079e7bacaf1507725767697fde0c0d17c3950e7f8985b56d60623cbd010cd765da4df5ab6bb0c296f097f1a24088bab7f5c81e5ccd2b7229502a1b7ab336976bfd4cbd0068ca45a30a818ad4b40b8f1c1b5e404235a2fbc2e6404f7bdc3c04a8b8c45b116e099683ee4dbb7d043d962c7c82fd998b9358226acd602744c5260552dd57484515bf1ce4240d05f6c8d6d0625adcca95a58f2f24f8d4e5b27a066a15be3a0cb497c858332e07d4535157f1130e653b1c81aad35bea351ff002abc047908cc48437b71d25923152e2832275d8c72055e7ceb0f459ca0a3cc4071ded317ad3da7d9c9655007913e86d033e46f9ad9680c035aa7c64c1dca4f72e65db1ba599b5676f6ce70d0a36fcba7cb34abee74e256d5e9f52c5f732be51218a704c3865bd0a5742bb946e21f893948a6b6f9ed0aab7f0975ec49394f4998894960e5cc05a2efd1fb9ddcc5c42bef3ca8f53f9a57966949b88a8be8aad990a8c34a73931f49a080bc92f4d704403427ba0b32154f842f1b1b8bb9f9d521750793260f640f317210fd3d419e4642c29a585d73d659112b0e4d6435f5449dc02637781bc75bf6df031bf1257400cff4f5126077661aba07839ca892538fbb0c752ed52b259c0641c7b75322f0da3465d876b8bf4cfadb2f2ba7cd51ad0d05a474f7b1b01735fc34ef5dd7bcad191c7fa4d3caade370111c56ed56f65a431a42b610923d04b02542da6e03750173d4bcfad81ae5c210e859a5dbb9e303c84541b9180b3486a13dd629664ace964119984ae22dd98163cd6199017aba0213233bee6c6139157f82794cd5224bb42747bc0580780b79df3cbe90ed2dedfdaa409bd68c48bd29a1bfa6c5493e5f138ceb72bb419dee43f9b2db3dfd27f15ef419ebf1f626333bce21e92320d37b1cf88166ec93e4145839cc41e0c01d669e870b96d1489e2dd44b75aad6faa64238d086031a05fef02f15f58d39c462b044e9b246f4e1f51f8ba0177651451b371fdb75d1b3f653144114ab1799788c50ea929a56cd50df8aba7273e6427ea6bc0a4fdd4d5b0364f336cc696b906b1edae7f82050db23c1f1f9293744fb35cd53b0c438f07fbbc91f6893cd13bf0a8eb0c5a0e0bf9ec930e7c03ace4d1bd913907bcef545826dd3fb6f01228a65d550751c13481d88bf90ce982da55904f70df4f3c6bec703b83a09a2ab264a355a089a53d5f2d549858638e98858e3470e10e39151d1ff84195fdcbbe824dd9e171b82f55f4d91319975994cc15586629cc0fedce6fb49841fb9e7034ecaaf108b0dd18915c4bbd199e3723a7f27bce81192b94efc875f7429dcbb215564592d345408779ff4cfb9d554562b085bf1380b1a756008f28be4c63ccb9e82ae465481829a59645a375afa4ca7a6f34ecdd2e7ace5a8a2e96946735e8ac35cf50117212e09a6f971ad2567310936c68c9d6945de7c9150c87229cfb69b385ad513f5619ac8d8c5b77ba9baa5dd3308a1fa4b94239ca2791c310f29d95f85e2cae97fe16d7a676fb83d78431fa654200b6efa5120d864a2511057203b5a04bb431c071f2a70fb4dd06ce1cf02f6f2a34566061b3ab2505303aa9231510d6d1ada063b79365edce6bc84a68cf431a718cc79ef40f5bcee01a07a50dbcf0c07a7fc427d9e3586b4d0b90f172b7808d9e72d052660d65a9644b3da138de9b86cd9265b5dec9caaeb827276b418e2cf1394d3b24c09410df182ca744ad645a51524f4bb4ce2c01e197265661dd3e906dca85cebb098ea69885230c3773377549921c3dcdb1f6462a7370e37b4fadf42ada8252c049e26dfb31993322923d3495146204a8900ee1b1d26d96609ec59f4ff0ab8eda8878ae31a6f7e5ab1360df5e608a68ec725c1a9f3f8539b9d26cdb05956a4cb2cf38b0616ca3ea7dfd87bdcbfffa314260c8391c3f20922df48cee74502652f0250abdb409070a3e589a1705781c2751613a854f5ca66b650a0c21c3a948693b93d61b5207890d972c803533535712c27d9a47611d7f8a081fd4bc1b2836593b20841362ee93ba2f82235f7e1912b93cbcd0c87a0a13b7bf38cc07a35659ea99d4fced0d448cdaaf616add0e51b7e56827c44dc0accabc325fdc4a84ba19e4fdb726f17a93dc35bed23df60a83ad5eedc55f215e8a0d60089beccce5dddf0e0ed2ea67d262ea9305dc84f49a385cec759f878b7a2d426aeaf5e4d6ef451131752c31963c3a20bc2b87271de8f62c57a5bb25d23d1bd3a37f73acb0c97c1915dacde1c7e1a2e577d9db0fba194885662723223fcede26d370202ca29d0a5d82e3bee442e822a18eb7e1221258b3cfe3a3df641a55fea5c264014df4907547403b06204f7a42bdc76ca0496fcbc17294c0f5d5abfc01b6370420f5edcc473d1688ad7f36bf8b9feba1206d179af9d641276f5c39e971c3fbf8840dd67907a9ce73bce83ede84b0c2fd6a7453eee363b48054e00e44d533d7e7357ef7be3ef22ea33a42b000b658132985486bef0882b472ad4b7036b66e90793c2e98c47380ffc12f77d44ca700a8cc79cfa7c4ef9908a58184a8e79bdcf157a00701b32ebb0874a46ef2ebe10e478f4ff34f96211279c2d873fd7e0ce5c12969f07ab2f80b13659f0f5204ececb91a0e9aaa8c2453cf71bb00b92391f1c7969fd04ae957d8e63b2b423cc04e00c514beae01cf82c6d25930132200b368cc474b91ba81d58a4b9f4deff74791b4352668169c86c2d149234294823af9b298e4751a12a2fa8907390ffeccc03c6fd0f713bac3da6ddefe76f66b1ffcec37f31423539a734d3de5b078570353d8985d30c782bef30a54b7fb5680426c125fa57f5f24991d560facad90e3e42aec99a5788c56d4f8219b3d5a69bb32b2f69375ce307559c79d6523d76088b66a00d970786b1e4f113b1b583a370539f71d392da99f2e209aaba814d7ef2fc33e9dc085d76bc27568df3bcf43c9449d6311bb93b7b23737be0741455446c151cc4ab6ae3e952a8f2295666c1e2662a71d597f70a17378e65a39967ef76b24a93c8f23b155ef3fe46ae501f57356459f4e7def8b0eeada7497ca118968684213b7f46f57c384e7be66587533e962d7cd1d0571aea71e432b9c41192d4e4501d66502026831590b633e752aee2951fe78b37a6f9f14179c519226153151084b3c6d4045ac4678941c1bc488eedb2ba4ea37645027fcddce2fa0026f5e1abb078bf7369eebabe8683125cef8faa6f9b069d2497c0e0879c00def5b8e7c51651d0c2d6d76ec07b171ea831ae0dc32c20a3eacb35b1cdff25933a6bcda539e0f7407356c367803dc958f5e31a95a288e9ab1ec295519295083e8eeaabbaaa7c0f6c437bb4457476fbe67dd99bc3d30654809bb34d2cc909b2575efaf994a17808a8a5ce30a517a75d3bb29dc7f4cf150fc90405b3afebadc2622d052dcfc945718a3cb6bee2d44f3bcd369815c5114569e8ca426f5774f1b7037ba1cec86c64e8955addb5ab54ff361f7c611ba12408016460e1d6bfff85eeafcd49332b0576cc3e92abcb5af407caa6f681301591ed54c06a7c9045e5daf7cb947411444ecbaafa7699567e4c2977f82760f98ec565d281496b1295b25150eb53aaefb08303e35d693eed81c7b4bc87a188ee9938f2093b7045d40c0f8998839d66050c6c8023ebfcf4f701f13a06d9d78175b18712773381956b3538041d28d42e179445f0eb0ab464197b4339e5634bb325642a679b2dffc23e8dd6217d5f9a7b9e04b9b6875e0204bb5a5834e6b860c6742d8d31e36f4d64c4925492377c52d6eeba2241a73a784f632b8aab795dd913f88a3a31fe9bfce5a3cf5db6ca138fb8a0413a32c94479ac976b651e1ba7f72418e6bbb83b1880dd42b13c0fa3c9b3a959264c0a4be0a8b4ce9661fd5c3b5d8f6bdf7c6527896bb427d48a1d52e361115fd5e228cdb367f07f392bd9a99c7ebe47d116a942532ff2c9a5c26066151a994acc972ebd2149d83fd00d23822fdd295377f4f52a0a4011bea17f694bb342a99096d57ca8bec0e476d7907b8489fb691510a1e94d134ea97d541ba872627bbad7b117a30ee06fadbadc50421f2f4be5e357a7f60a02ae226c3a119e7897184576a7f8225e3a988c823ac707b08451386499719c0f5cd10521c00bcbdcb5bae1f3e7d18b2521ee09539f6f3cf71dadc91f72995bbb8669da248264a10d62d618d60d4e4dd23ae2bca566a362417fb4205a6f79a59d13db09eafdb6ce9912fc42a364c8db03e9e91f0e1d2e182e1f06d6cbdcad1a3289a72cfb9e7ca4fe4a8007d29acbc338b39398e44f49cf1b700844da66ae2a0a5c50bbccf110b4ab7e23c0ea2be186df3c64c2ce6980d7a8175af31c89f74593105a2ee5722d8e2f223a16607484a665c8cf1522f88df242795189f8b312fd4b2a45febbbe3d8207eb4570cc113f926b0d45189878bb8f892a9e41f57e7bd1b12e86b3d6119b40b41dd858839e7ceb6d5e69358566841fca8f83e39948ac336371aee6bb38f13ac24e55463d68b711db50ae14804e8213a52cc4c76aae2ec2b0b810ffe170c9e090f16eb24ffc98963368860e0f9d300ba796b365d02b7dd047467f77df757fd2cebb673531e67be9142a73aa89ef18883031e257702d141c95c12ce70ba39d71d9e0e13799a2ebaadc0b1972859095f9cda2d414a13f8be80aacbbb60c87ad4e21266f41ddbe622c297ec9ee993e52d10e4e0b1609ef3fc3346dae6d489e29d852d063dc74957a1d5b1a17872b54b9be40b7f9e41098ba4e9178778546538da0ed93517ff4c48ddf0f5174c4b2504502235512f73bd885eab071a9968c4463283fd3caa4e4c837e1a4b9843fd4dd8f5d24c9f8d8023b2d180fdda70990ed24eee81631d3bb1ce2d5c9b6a850f948e32fa37b1dff0a2d0a670e211266eaba5d6564cf2984fe3f292bdcdd6390961f0aea4decf4e49a1ac85839c05e270038771c4483145104ab75445ca2488741ec412d7294102158a0c14c214fecd257e40c73f5c684a084ee41bfc789c99d632d3059c004e22dbc4b9fe3432460f17859781cf70decfbf584391ebc08695ba05e530fa4b40d624b77be9e1df24cfce7e55477c6ddcfdbcce9a5c198a29a3a5ffc23bf9f25d4877cb197ed201df35d1d342c04f39aafb871ab2248ebfceec218831cda1ddee9d5c685d640e81c06ba8ea26954fbd90f2a8a253925345bd97b508fb8efbf53a005bf60d439d480f96db2dc96e85e1d60aa7d0444d6f063ecdeae7e8280e208b97fdddf2c5883d14e1f202f3f1f78ec36a0d0b4ffeeae999b6468dc040e247278ac985d490d647167276d36bc9afaaa03b62ba3a4dcdd5157953624b818053570248577b4c8f505f71ef07fa9cb51eb5a42c47cee11fb4fb3f99cf5190ef2a632700b9aea2bc3f3507e30668130fd34acef519d363e86d932f9f3a991837b693207b14373964fce15cdc387dd5c7b0a7e14498117a30e82572ed0cecbf61dd2f1641d1dcbb8f6eaa976105008be59c1404a22c50cf000df92f0bae122d74897e30d85666cd457fdae0fbd5bbdc6f81d85f963d570a5fc4578f8286d30b78a1c997ca0d9c198f16b861301074716f463c1ba833efd256f586bad8fef701760d58729f5c4847741b8b3f8b1ef4f1ecd388606076e0cfec88cfd7987d45b674b573eaddad30fffd779ca591670305ef100455476ef2aa29657a0e476a86d37d8162270e671de8311033b9cc5468557fe5f723e484ec0b1574cf896f2f82ff96596c50b9f2d8aa18cf97a3c34bed88a43aabf1bf1e9899b99e156d973301e3c925db8d67b626eeba9c128cfeb5584666f766e861a6bcfd1cc996e548decb271dcdf5089f1bd25c2060ea9c06fb7239ce047130518221df46de98160998a7729b3903e6e989a29b510168fa62830307e34914f0171c8fe540c6642b62c95f6c49514c52cd6860545569d4cf9ab7d358aeae96513cdaceba1167424adbd9b9be31fe1a72d420d22e357e764237fea9d5351c417a4726a504c1ab799cfd317e105b26b36e8519c1d2f82a957cc0bf4f2582795b93c067dd6c597953484f377609cdb2606f69bbf4e7a6547ba4bd648bf19daf2dc630043e99e0b816765a546852918b699d066f351648e46ee3b65426e18ca4ff391e6790345e520b50a4f01d93af97161fe79b4a07e4c1b76134f7e89c5942191412f79be4dc2e7afbb7745e732dc0af1e91a9fc6185d59e45beb598cb0c6fc280941c27526034aba21b46f19a15ed7bc18eff13cc30076ab8ddf60015ab1543a52d3efb25f54ce56b56d09eb16f06c331640757f2ef3f65e11822e623401be4aa64c5e006a05e727ef2792f6041f2cf959e279078c965d5e9f7a1139cd269edb7c21a9e9d6b52980477a86a4e959be716c1c98509c76203f702db4f296ae7a6f6cea3fd915d10a0256bc7192472e853dc5754ff4bef1c3734c23961720f7d578d10c9c58b7e81d208583d0289e1c15a0ee830c6e64b7cb9c7be21131ec91347a410f4bd32d78b75d6c572ee26e80e46d4fac4a283e36ad0d97efc2bd6a091bf64578dae2f6f17d3b63bcea4a392b75d57177a5bcabdcfc5928b3372419ddf07f46cfa60294f0e32d141b9eea7e4a5e8bfc6b9b862e391e0196c2cb008c7e5677dd7a59bc97d56db4f5f9b92dae8be2e3490ea82f45d9a6997a951add2278c272721f427b703d916571ddc59e5a5eb79ddfb73812731d0a833cb093048c3ba8e19d151cb9ae97d2a1104e40b7023150fe291bd7da4691de51659bb0312a558e57c6f23501a352c61a69b1b70226b22396cda303e120d686767dbd1ecd7d54f747783d27fe0f1cd013e6aea4fa484fc3fa35d348b1a2399774fdab2b43f5985833396c61e9424485300fab7729d768969aea2322e64b5975df6ddc623f43be45ad82f66f5ded7859f15d2eb9fb64ab3ffb53190ed97ca4c61836c75009b8353418dd71cce64116b2da57bef9f97076048e293b8915b6b9fcb1f0f2715df37b97f7a15506fd1dae444d77b2a3ae7b57a8d5b4f10e25a9f78e2f14f44286561005dc87168a1cb3ad82dd35c03374f5de81648ed02a7396ebfef22b33402d8080f239f73cd2cfa3a2d31c2a5e4607605922bd2f5f5aaa3e05c3ad9c45f6bde35ce1926a4e7d808e1cc96ccdf347b05b8601421f051b13efe380b3f082e2a1fef2586868b1e6d9a389da418915a51a37b3a185c667d85b2cf39aa7c090709453efcb4e6b1dbb25b4588a5cf43c0aaf9580881abdde3eea85b485eb74f53cef52a3be96f9c8470f01276df187ecd4eae56b29537dfeab3c8ab4e7118607b42d9bcca6e49d6836f04a74d9b1cc8e9046b7d209d28f3fa9eb9c63129c8c6e52d99fb918b9be73e773d0af72102ac7c95d8d63be0a6a27b7524b4dbcfef09fb57ddf079878d551f5043455ab9f3afeeca9c68e9a8d872d501b07e32aab4af24874ca168ac49aa8cc1bf6060ab175ba869603c133be6ed710a062b20044042c7878e184740f46def945961f03e9537103acb58a2e2f99bb558cdc38c23bb4a4e1d4c5dff8cb927af8fb852f1bc96cb8f0786c67ce539030ab2ae4f5d504c4d20122e7676d8be5f347b853a4d6b41a08e96388e8b8ccdadd9e151d67dd31bd5a52ddb6d966c2b9de61f6722eb94bf3d73b08ab6b51fdd2188ae5d60d3f451694538fc4a468f296a2d450711b37e372aa71d2448e4e593e881de7bf647fb169268f938136d8ae04c71b30c0f8d73d2f093a5ad4bff2715892a3c529ec12f91d6763a38d2f5a577cd1a321f2561b9b8169e10cec8ee2d8b8ced8f8b6229daebc0d7c1a38ec5281675908ae859179910242f252ec6993f1e7a319ecd4a67424bd5f3562250c55be7cb3b830eb5975b02a3b0ad764de8a5f5d95d32c15d64afda9f33c35d1fdd860f5784e53a41c947b81a88714d66c3a63a34db130ea3066bc0a5fdcffb03f5f0b9a1d177130496a557111f365c17128c121012095d2436bd246fba41a504f5e20b328b024206e4bc0a10ddc74a6abd9da7f76adc56e9ddec2e86d3e2022bc5a42d911b4e6e4f9dd5f7a02aebc067ac2221704b53a0f9e1410871ae7abb7f4e7e4846e72340e8a73846486e696615c762a8041d38e45c2c04d7b8b5d1770876b884da594960d8ec2d2091110ae37cf7a762394851c91ba47dc6e44faedfcf269908d4d887752752fcad027b96e0a422377a9a3467f83d33f3fa7ce3da9adb476afdbccba727ddc3ec142314d50496315b16ac4a4118cac0b09e08db1e5135bf748a1b9c6f200326467e7c458ef8590d5b5ff9f0a9d2cb32fad8109e40ace378fcd877b2a805a162531296748b63f59c7f7c088f65ce47731ad01d940852ef584d0f5b751a81bd6158f9f80b92ee73c80f9561903eb3466a58b0b62540ec6049ae564c4d8c3a610aa05a2a706c41da7852d48d59fc2ad0fffb9d64b9ae213f3266d5d4a2c7d89445725eb50de1033294915f135467daee1a4dc1aeb81c9a93fabeb57adc94045ffa152c2048b8dc8303145e7be8466ca7a394441c8a50ff648bfe1ec663b966c811d2eef38bbb76d6af23fa4e7c63870482194e369712f7bbcc6e3741a0fea5da73f1c9b73db076327f065a127a84d40ba0240585482c2a9fa5552972f92d699a06bae7f3c56087a05b04a8524972fac6e3fc949003644118fefd1be2d70c5c12b374702f8d934f272b67099351f5a23d34eb21df3184e42ebfac3617a365244963698cf3fc1076cfd775a75ffad474777c37d5fb3b52baead1aba29bc3fe6947fcdf61c87aa1a5a04877aa3dacd9177ca129d76b87976c531a4286f6a19fd415671f1a356f0c84a364b43ab6cfca34548d0950b77f1aa17183b80aaea3120cba8d71ddc3431abadf14767d51cb707208261f67688aa5024df457584d331eba3e551cd2f85f93f05c41039e9608937a9e56b245050ffe37ee5665955bb88a86aaa66a235f293fcd23d1a5c30deffbf321030c111678eee75d8f2bec5e9a1f17056aa1f57d0ae6fa3baea1153fe66f86961773f4242c3dbaa089f183e040a51657880a73dc6b4f1eacbe42bbb356b9db07793016b693b35ac12aff826814e42aa8e8edc203b243e27febcfddf1a89f997b118b9e5415186cc75c9c127f7da3fc0172920d7a498aeebb1b8fa58242ea69fbc7cbb4861a339bbb06115babe3ac34690e407aca96ece96838cb39ed8e62f28e833a82d50acd8ca410a78477aec579e9a441317a03317b8f29ccc1baf2cedd3c2d1e2dc84daeea8a61a3b56847b773881cdb5b12f6204d37d6d76672d8f7d10dadc0e0e84b9e5b76e35018081449cb4e5e57201ad982076827374f9ca7a6770aeb68c1bb6d65876e7df5d2de7e45294352fda71b131f512a0432a6c0c7a1773ad05ef8cb19ca187d17d90e72ee713470e114199d0cbfd18655129066a0b078a642e9aea0b897b3a89a45f24dca9795dcf1e69d262c2a3283021d37179a9d22542a520bc0b39202f9ec81a6f67b7df48f6bb95c40db271a2af39cc35a1d2f1e4e71e236b57084ad77f6d553f56aecf79238d67e728180328211d65cb8912d149cfdde580759345c2aa08921d3feab49ec3e852a4486fb2193421528b85e60ab44b891983cd56cb61bd3e437179e8490a5670d883f52618f656f9f52e2ec908c5089421fde4bf26351752fbe49b43d75c69ab8c1ea4d79260181be00bea3845fc757381475258f0cd46fb3ddf2a79f9f56bfccfdcee00d8b6e5eb75bd5ec06cbb20cbca087ca0b59adaab5bd99df72b75dbd92637171e369b4f0d58aae2ddc78188f16eb9ea22ef1e30d8085c6c47e64e47e521c5d6ac566dc1d5fb5d1cfcf0f01c88e1c4115c07d7e7f5b5e01be8a4ff1e9544f1a31792aeccf9c06c73ba738769f6c5cf98b88a487ea8d70d335601f8fe6df252e30c75eefedd5a317d82c9a7dfcf7d24c6c4f0f05355fe2c391c67dc35d3cc623cd79aaea5f53b4490d26de21c778a7c420dd65004819dd5a3a85119736b459817255b5e70d5b62e6445cab67e83702e90ffa4f810b03881e98658212598d07ce862528eddf38d475e497aa59477c0c42a26e758e66640c99132d793caf0ff79471afaa05bd30347e559f83fecd8fec573f007e324186905314a79d1e1e84525a9abce4368f8da789fe3cdd5e60b7cbb0507a137284af3dd3019997bf8f323fa96b137e883d95571f49366082e93ed1d63ba2db5817283ba144cc0e28eb62e7084b7e1f03af916cc79d54b571516a25506a417febe239b1454308ab5f185d71ffa2c36fb0cdc80e0a625f84337e84f0a6431ea633cd29c7476814166e00680616d9ab18968084636f012074d15ad359613003f939c142a7301abaf65c89ceced656febfbdae0b967ee05c2e52cca1890897b61f04a4ca7688c0c0f3329dd5f0c682840f2e40a7cdbf68de5abebb34a823e200c19c600a5fd5c4efb6f723c7956fc504adf01f9d30bb016d9f1e11d6dd3a78a9870adb4a88a18d0fe7b303eae4578848440b3138e9f914d0a579b5cc50d6c1791855ffd2197383e82e6f2587060831167a8860bf1d0107d015d78f612a7e25381d85b2e93bd40e41313271e5220a2a37f76e9379f75c4435974087dc93bb0cad3da3ded8154b96e49b04cf4e61e3d97364c5b2af9c9131c7d2bd8584b214dea121b66ae8d160839712ed2708eb1da8916996a4aa3728384d6f5571a3b01103dc71c63e5e949b3d233ef6615ce73ffe5bade853afeeaac0911511337fb43ae426d4dc428589852c50c92665927dd24297d9c3a609e99e30596df7b360e718e747f2fe5ea4d5a5b9e558861bf2d75dde0e942f85fe518cf26e1f12da907132750674377a02a3834aac961c6bc41a6839888735d8d84efc6d98d2678e567910f72c028c7ee819a8496b28f23e4f717cbbcd5adc87dd0777099e2e00b8f9273bd3814307529e5f9b1cebb9107adc0220cca4b42d7b56a5842e4adde441c2a43a73cde0afde6c9ee42df4ef7c09b3f5dcd4d63d2e9a8a4fac4462841b0ff918953dd8808c0b9afe0ce24e7240d11c73383b2c9ee9cdc32e76b3afceae0ce6abd59b6acca7bf6fa69aa5c0eb64bc5fa4bd696b7f66fd476a6ae4f960a41ed08381f44a6c07e334bf16dd1302eeb1c3aff2c75e87ac10602a103d08e5052f01cb21af4107b460327009f10f5ee89791bc5fbbcc5fc3f05396f127a303d926bfa93e361745b71caee2fa4b7ca8595812f58dae7cafb3836bd8940b946229eb53455ff094d01701f33c715222874adb8b800309371e84b3ef15814fa1abfc6605c80c457f4ddcf648a7f66ec9a4c20847854932c5543f662678415d93865b7f1c5acd9da2670fe2f44b120738a6c9c78d2de893eefaec8659265b9b319a4d1ee2222b60c3c4b7af404f4c8538366700a49f67927ab891fad14a57734590da2b9d49adf6ab0cdc4474dc2d5191fca59bd5044e99303538aad30abe4c950f0a8e96f6dcc822e88689d8193cd10b9f8a806884260fd91ae87eaa8e178debc0e62f15523e3cf000be66b32f016e6dc81f98a546765c3d0eaa5e9dffeaa00d4b75f661855dbbdcfb8bc34f450490811e6bc9d373c6e724ba8532f385c0ecc357c0ccc4b6c1aeaf81f688f284cea00d4a76fc3c329f1a56c581e2f5471fd9d78ccd97840ef07b313c069de514e604daf3481a26ac875c9ad8a656eb6e92cf0f94a641eab4748c2ad1c3ea701cd426b0c2ea09da090816ba9bfd771d219e36351453b03ed0d54762eb3558dac4216d575f63b3a070aaae7cb58d2bd289cd760fb7dacec88c9916a13065cd6d3654409671bbfebf09f48da9cf5e5b53cea6f766224581cf0e4a60ae485a326f97f50936a0fad481fd6e1b099079f0e917b12201009cb39d7e6f8c52dc1c7029128c2f0096291c2c74a0c063a1e5d0da8c775daaf7e54b780591045594b46de3cca21ab9f850be099513e580a9aae56e577f1127af2a31a9cb372f7f172913e5f0be312c7175a160894ef02951d115ef9d51a741d2724d78f7e975970e834976a469de20a7a2af7978d94b2441614aa3897685c005c6872cb1303e6720cbf6df102a895c42decf9b893d5c3920626bd44075156cf22dc70f2392f2b5f60804695e8998a9eb32e910e4018d3297dd60c8edd6be0d41aff5677299f94a37425a59b30e74cf4aa4e61eb2ad45d64dd811c7b622e76a9a54f97dc9cdbcee8c81e0fa3a428596063fac0e1bcaebeceb5e661bc3e0fa4ca325bb994eb5a1689dce7e9318ac33c6c708242846dfe93d1874470b3d985e7b0729230329d9118211301c6b78d5e726370936b35c74a6917d249cde4cd37bbf6c681a0283c1750291b0a2cb8043077ffc49cbf984118aafc1754ddd1717b9e07beb86df84f633b1c455f8fb5880fd99bed0c940e73ffd618d704250c7ef80a5dbb951e353ffb5575327074329142f3c26a71ad1ac85676d891b637f83e038d734da6153196461bce52eb5eb1b850730dbd5a4f4fc6c309c5c8099b17474493e3057a07afdaea1a72373eb3a555deb3c866251f0ff7bc0b6afa7ca2fc2321ba27537f49f2864dce2b4fd92790023452acf57070fdc3a80832996df4294a216cbab824709c10e793342d490f143607cc05dbbb097bc31d6cb7357c130124da3817b418001f134e2637201cfe7479bf8c7d99633d1c6e92b5534f2564166ba288b8d7b87cfe05f7e3aee8b35a6335c2106eaf0780523e9e8ea156d88bfb5710fb2883844bbb516b57f5e7aac75302c5f4739d2677bfab97352bed23ef02afbbebe14809f0d99e2effc69d71b9b66911a506e43e87a74e23655d629601eeadf9f77da5c800cb34a9477b8a96961fc15baea304ce34bb9eb97ba0678d58f20a518a482d3cf012cd60cb9f3f8800f1b40a7dd27f44037f05c004bf5c9878bf2d6930fb4ee74342b0ec08ac1cc47edea9949f1fc43e78442bed8ce4b235d5c88f9777e17b457edd97b16b1ca2ea64292a809ee5741c07ad697870cb28f3f490b962cba532d60745da477f8b72585583af54d9bdff7b463d57275cdd0131599a3361a8b11617810e0114c2530bacc750b097ec13d6ca98566d40ad94dbac7957760a9b8f959850b8a4bfb01dcf463e22d6b052819a8882ab247aef7d2893e85b09c410bb21c70ab82d9ee5464db33e7c7a3489819b43a98e052c9f1078a60b175724a4ae5b22239f1438be66f7722cb013ab1d9e897a617197ec38d93c41660ef6b2c3e392482fcfe123c7ea6d119d804b7a7b22c59b3f1855104941f3f49db460e4faf5779773ed2cd68e6b1f00154f8a291ed8e034b6c4b55f4cd5204df6ba1e31b65e6b9eb4594fc76e437dcc0880584d950b59c55d29412fb02d51ac2562873f9278fecc55b6d28d041e09e40bc51e3e6a44a2cb869870f82f94f89d8e405454fbefa1bedc685d8ddc4563d6738074a20b0f4bc5e7a4dd4ef7b695a0b5f5de286f3ce4e4ace039405373ec11f434d3eef3e5c522e4c0de9ac50cb94410d5bd0078cb38bc6bd10e4b06043334f264b49bb1429f91029f0d71f401c3f64382499395153dc48d9d35146090b9adf2a2bf2ecfb04b6ec571e25b21304645b26e3c4830c5348b96c75622ff83efeb69412c1eabb9593aa1fbe5bcc902d090e1fbeda4f835ed7ffbc1da0d4f68567beaf2a3f1e1c839733c9f801d4813c39656ddd62047f1a920312f4919bca88dedec29bf3eee677ca6d9df6a034acdcf9485769e409c82f80adb522bfed3eee6afe148d66c3e0183541e3ddbf53d9b3539f248ae9c82646aae6efceb233185f1406ee271e06d40fdf97e2d8e799d2694e521d67f8a8610716940620f0d32185e3df9891a51d8803d158e30c9f6e5ea7f2498a2999114019cea0434103372105df6f5af48372c49d116a2ea46f3a4415486db3f7546b8d25daf3ee5973c5e08a109f7c783e6b5285a9b70bc6df654d5a57a4dffab21f0ed240744f8fc6e725ba7f5845446072f962a026c29b7857411e28d7575a3a938cc90a0aad0c8604b93d3380ff8171ee80dcff9e9a4ac179e80bc1ef643e7530ceb1409f52f83a8365bc3400f056f747b09ccd09dcfb433109c72cd24ccee95e9e33e81a847a6bceefdf8bc160ec7ce4514a124ed1d884e86efa716a57342086c2f70c628cbaa04c1f4d3faa996a872f2b8ed755be060e07dd4d969dcf95a20e03a4b361b2e16165bfaf58a2e2f9a18f050e2306eeb069f41f67a555fa1cf56029e2e6fe3d17378195acdf9382c1506ca875fe49a8fc1b19fcf2a57922eea3e2fc5bac217783a8086beddb64c2e91f2fdd6970063312aedd3b939ff18d3634fe44b40db2a64e3e62071954fdea9a933e6a928225d81baaa7a6f49aa5831a2e1bc898119a139f81f831d9524642fb3602179a3b8edf3f95e103bd9e7d4ec21ba051adc1bf069ff830b3d5de2711358fe3ae26a42990a5f9f21b96b461355782f7a79b240ac6762b7354b4ff88a16f264af5e1c3df32765d42b625e2397f01ec87920b42639d4ba22adb1fbe5138d2849db670a2960fd94a399c1532ed75e7 +0xb8f33fc394687880f8d658c24c4ef826cc1fa0387545762efdb7a546eef9128307f5ae8ee7b8ba5817b0e492aeca16149953b4557beb72117647968e8f12874e +98440 +0xf34105a04a4a02a1a07e020a6a4f4176e9c92bf40018ccac434988c650550c87625b84bd232d0e5ec20e6f6c46ba061b22a7fe36098bc7bf031ec6d6c1214bdb2d9fc4d7467331182b0ad81c756a3ab1ca734559b065cbf39ea3339859b76fc47e952eb65a24521902faa4e3a067c67e0cb66a269cafc2923c6137d6c11e5e887ac62821084959a770673b896fba93cb0ef7d462757193e204de3b56a05e026f4bb91be2f8e82d0b9dd805d6896a88dff8beebd8e5b1262c1fa4a5e19f8041c319f670bfd10cb88db0d56a92977f8c04f394174f927963b7b53bdf3f668a05ca0b068d813cbae174d2e6d2844002898027ffc08e24d032cded294f389c8735ce4a70dcf0e0fc900a2a94a5752dfa669cbb894e5e44bf7bb4eff85f94e97cb915fdbcc3d366d9ad95e1664b2d066f0ba0d7ba29879a4c26b5e42f761af77379e74d73acf3755a215e1ee52c74726a60d4a519b9d1cd821b18f457fb936b735c8e621cfe19b685d2ad0a97b01219f14c7f4a2e67048666422546f758c8f0854c51633f210bd064a9cacd0640cea40fbaebf18199e76c0283240397f47e2cb0317779657d926cff8efc8eba4271bbc98f5ec09bb843285dc75c52c03780c7fcf149cb157a75325c6a8c753a20c30529b421df032de0617ff4165cf889956a71750f82d7807ec98523c2ab0e408c2b36117c77415f86c071f49a48ca5284bd18a511c533f773da82a3e658be0c94d4f88eb6b0deb5fdec3aad303fbbfa1667f86996bdb2471d0c59d040a3d2eaa3a9781419b161990c8ee209206955e9131119aae891dbd84408149418b5d3448052bd89eba352727d4e72efb1ed1f884362844e4d6a3612b076bbd6b5b64981f476cfd775ad3aa716d3f1462cf4a13d6d03403f0e704c5e28fc547e60cdba09c7bdb7e4fff89fa2a0c667f8d9a564715b9b556372caa4227545e9736122b044c1d17c9ad1ac0ccae2cedcec0029ef8dd3d3cca4c3a1c7c75ff7819f00deb29aa95726df32f00687a694590ae9a7caf79e53ace9471c3bb6aebb25e98529497349fabe9d6cec1741b2c0e53adc487e1984c2fd1948648a562a38dc39372afb3767604bbbc5c9c660cff989642034925a4cc8c81e0ca03b0e9b17ae775f0a534ecc31d52186af9b4cc5e74c70fe928e21c00e14dfdcf9d748c8ffa38b45f0d620401665b7f6c51f6e5c333646be8afbd8a63ce944ff97e56b7a99c45e31050e158bb601655f34d92c5c854fcfa84660e6c7fa4f35bfa1eddf798d18d66b71829674bbb413072352ef8c84a0f103eb45b3ebee4f9a6240780b8d82a7dc3a5bba09c4ca83a937bb1020b5d9309519a432a7d9c3f05b319b0d597e207a59e8eb3fd8438e780f37249d259f2c07a43097b02a5b1f3b6174db343013109833bb4b9869b9ac9a2d4f85816812242e0491ec46a437ab3692732775f815fa0954fca04d26eecff1ebc706424fd669ac9f84cc7d7d360eebd775a8591a4d85d6a2f215e776aa9d8632e6d16a44b2a4895b505fdc1d20f06219c48567fc805a0607e7cfedc0b4be60e8f60b81ae707dce223fccebecbdfba23ea6e728077921a16a21f9e76ed5db87f73ddf0df5d69b82db973c3253d5d5b32f64f622a3ff81b0b2e9b95de7d59c044504739880ada7ad6ea1d63ab82f269dd545d9df39d9223ac98737d8937ca8debc92efa9b9bc4857c2a5c38a849497681793b9e72fd0ad4796439de0da91a81d43317cc907cd2789c1eb2aaa20cccf1ddc94bdc0efaccae0016510fb24de43cac127427ed2a6eb4b52ba3423f29f77c40e920ef4df35200bf234bab3d92922ec20bd685383103da35d5c087c64d5376394d3d30b693258d251f9c38f613bec8b473b16cd80d3c59bcb17d03ddd35b60456a0358bf46d193d06fd531724dc4aaf1ee9767632b72a3a8234b1efc5889dae3c405cfee7ac0c53fa8590d48bd3e4618d0eadd5018415886bfad5198396936a2efd6febacb8d91c13dca54dfcea61a87cf4e67256012d8e6eb364438127413f141d97dbaa5927a03a49b80ae0e76a8dd3e147d697f71b5374a585f526034f35d6e9fb5549569ee85813f294a093a6177a1ef8882e2f86df631a61b8daf164545ca9c4e1f179e7fb53837a72a2b6be4e59f32210816e173b2558201305bb28a58ea519070a88aae115e1792c5018593a59a7edf7fa7f766ea0a7e98f0f27452f55242350fc4c8ea38475164b118020e4608480c4ff294a80be51e4b261fe60fa97700943308d3c488a867a564cb8ba5357d004fffa333b7a659d3b076107240f3ecff4690c135cd80e5dccd56b86d18f27d4a0315266f3637fd21313780c3675308a0c48f9a5955cf7433551d5b30aa1b6d87de16f8a1743f33997600ed3413457e8786a600d8fda2f7edd51f2070f90ee24c297b9675223a91aec758c26eb5599336157a711f35d9d56eb5d2a498864b6ff98db98c4490a89bd3dda58cbdcdfe0b1ee95387a69ea291587fde5431c26f5b32736746aa7007b69b018dc8abdda13ac48ae790f988bbb01dbba8bbb74dd9586962fb522120d67676db67f2d364f1a6a962ad49a29473b640c1b847a38917dc10e4fc3b2323a35009d3ca87aee45dd34018fb0e1c327918445a938480f4a95abb61c06e2b18ecd796832c13b8ec44351b16774ae0f31a6aaacea10eca111c58eb720e77c3412171df5213136bdd4360bcd398ac7b56f601d6968723097edf5b038e3cc4666ccfc336d916034247e9ea87e8e59f45ce9a827a5abc7da99e70d5b62ec1e0aecc66202f708b6fc6bc96171ebed49ffaca6670e883978b34e06f5d55dc3468e710833d3bc109b5839be68ae3ddec2ae4fae831b399ceb835f52966650f0aa9b9b9855eee430770e36639ba79be92ccbea09e696e15c8a1273d3d65863fbb4f81280b29b96f1b2e70bc2e2a32e97ef1c28c076c7a7ffbc2733929ef1c06dcb6f7fc83022fad9b4ab60e326ec1d6f736aaed91df5b40fe88c4796d77b8cce56c68a76b9ca3972e522dccc4dc891fa217c275fc16a2f14780756e7673cf2a4bfc6da9434dd7b44ae1328874180b2be5f1c39574c6c4194d361088e387d18796d37182988a1e7d57548ec1ce85ba74596108ccba544121961620792308526d4c8e1eb3e9f5fa6b0a387cf912ca399172f21c9c2b43ac92a8ad1f8fb399e453e388bfcda605edf5aa19979f0f49eafba9017984561958f50b67786d23a0e9d3e25fff305b3e8bb5cd6469341279612b823baa05b949f8b114d1d571e1a1e555cf70377c78043623fa955c58aafd1e9994fd28a0c359ee6f8b78913e7c316952016603029afb8fb8b8490b6d573985de37b26fd602cdbc78a5c8463351c3e8713ebdec732298fafc6cebd0f295b329620117fa260619e5751a5d5ef110ddd50bcdc44e4ebd410a57aeea5778f4fe9bbd778a52113bd2fbdd4f8465e827e3d1ba3525c2e5a9983062e4e10970d3703f5911860218226d5229bbe9d589157a40e51b6ec4e89612ff96b55c617aefbc96bd559784ab385d9ae2f60a38745805b514d6ebdeb80125da7b86b8e9e778483462ba3b446b0c3838817442090a6e2aa0d1fe497ae469555379df831d472b879ad1b5eddba81c61bd9dbd4dc1ebc63d86a507e413fe2d35fd2a2647862a680f2c92ef2bb512c78e9c804779ed790ec2f8f67a685455fb3c3a0501828f01bc538c1ebc716b1bbc0357e19942f632966f5a5ecc32969c21cc8c82e7a0c25da6d91bedb45b68235854623a295586b8fb773d3683cf65215f8b773c5f3ebaaea6146e884d5636da3b165de27e1df97cbc9f142627bb4a8602ed8c89bec8c26538a9e6670dde4190c2bdad731e08c8ee482b71962e72b15a9a673f03acbb8421ecfe36127c7023078dbed3747fa29f9e2cc0c81f0e8223ffa48d0122af937a652175b002ff98557f0a9e626f2977c7fce8e3aa295e663ce5afc3757f1dfd1f9f74c506c12dd35387a7d0ccbb91f4fc9afb087a3d849b46bd2aaefe719e44ee4165508cc58d9d97b213fa84f24fa687e8d193cad427adebe683a41e92a6f750eb51acc4987573bc8ead702d9bb908f4770b3a0e75adfa96e26947585aaea0f20df83e30b29be21c5df2d6292074a8ecc6165fd7aa8e1dc2414a0d3e523bce4c199789739c576541d072a10a28f8e2cb46717998db4e841873947a22e1c4dbc9aede12efce4e79c766ab45330dbc530a88bb1be49075d9e409d6f2c8b1e055f52e2a6f17b0d79c07911b475647458634fd41cb2d628a6bcf64801b722b04c959280af28dfc8948acd0313bc67e1ad8d524a3ebd5b9f2d635243e68c1b5a8a2502d0e41b4f9da0c01a48b77161aa2e7658f5002900f5595afb9504f39fa427d849d92e11f415052b0ae98adb795842e50ade4a3cefb1916b9a464533d6178b7610a47354f5b72b9343ed7344d87250a3100c05404d5b3f5cd75f9096e73a1ec7fe379d2a7b0c7ac06d5c59f2a680c2791187177b457bcaf659e6cc62fa954992bc9c92dcae9b5b79313f262e0a0bff2cb5586a36fc9a9a01c9e6e3e039b172a1f1db3cb1b5ec3487379dc1402c9a6f87a586e5b89d3f1745ce64bc58ca1503ba46fa81f3b9876eb3267e127035b57a5189196f4b4ef3a98a116a3f12d54962a663034be8e1f572c3a6ea01064de48851081af235373db8973aff545583d6f92deffd81da56bda77f61ea76499bb00150cb9055bf82a5ac35f02ce36bfb432e1693f10b0f3f6774b1fc85598248a04d167a83803154b3ed2cdbf8d49a66186b2bf6e6d1d0c57b431f22c492fa7b3dd46bbcfb5ad3d8f0e344a46b0f2becde1732c1e4ba6410827b9279ad09f65d0dff173901cdec33e3f644f38d7d66b41c99f49bf4b015470483d2a94ba7c1169a34e19a9cc1c690158ff66f670492e75a5b392d1c9b299387c5a75ba352a2cd6cdc9387d51ca7150c1420c1008df8ac21c4c81e6661e91b95a8d937bff3e0ab0960f3a7b3c7d8ea52ef8b916001e12cf73c6b17daeb9d08b5942fe4a673c4d7fb26caa33eaaa1386f86ff869046938f672be8c07f218d8170f1730b60b89679ca98df227ead4927e9434448974657fcf6f908c05deb00af4c286b53f6ac9ebbfc1dfccd7cb91ade4a8d21807de7749b2e0f93c07c3240b9d39fe0656f3623c31b1ce74c3fb45a8619cb5fd64b13349596d35167e5dc93c88dbf99e8d33d6fb9afff6946cf885246df67c6f108b1dd12b6ae0a5e9fd3420401f060852aabc8c63e2d4a64351b4a4723c81e7abca9b8391709854cb2fd9494b79bfbe47d677712520e524d78578ab06d562f186fe30d33404a8bda2744d3a1372633acd359c3c4720a49a9a02259aa4679c1742a462428b9dbe4b0058f45520afbd0853569f6042789f622b666015d34999b35f4bc443f0b22587554c534d0b7809a19aa7f57fcf7f3225ec00ac8f0c11e8604d62db6a0bd89afd11cd0e642c61f590d3a832dd16db09505c9f6f78c75704a89d77fc3745776b06e6697a4d1bf3fd40ced5dc1ae0e2817c0d612d558d7f7af6bff9bb1e3625324f13902b5a52b47d4bcccf55bb964c47037f146ac7d6f1c7d535669c8146587d3059ef963e592a121c5de33421af6ea6711217ac222c5457be8e5d15230e87a85509c64f4ba7ab483d02c00c0fa4c03c6f66f96617062dc72d3b3bc955e7394027a3b2bb14b6de8c285bc421b81ef785390e182cf8fcd472abbc810dac78f3d112c8337e2c1f2a5a58b98e39cd666afd784822654a68ef06b492db76992c3dd7c0e7d6ecf439253f58bc8c98b223912197d576a3add2e3dfd25e9978ae898dc09c730b9bffad35a7a2c52de308cf108e3216a37c75d3498a7f6049a85f195a28100a501fc0d4023fc174008d23d15f8fb18c273454e2868326487a7a1d44297ab60e22ccca55e1443f39a31bb5c2d4c2a0b6708fad89314671979a528ba27245190f12378eab796166966403112c16b38a262dc2f21fb060bbae27e60cacdaf3937dacf4703d2123f21ae1d7d875abded84bad92b54eba5e9f2cb19922dbba22cfea317831937ee84c279b0e7e27faa115a77e63897e859c8663b5e050a7963f28d56e272536f94aef5d0e1b64cb99a6bcba2ea9c127c8a6fc13a35038a905c538bfa1a5eda016a8561ba9834ec8ff5c48041cfa0ef2ea0a7a9d086d2d587f317a098a68dd575dad0af3fbda7eb8923e4205f7c8c53860338c60639bb12e6920575376e486d544a5986673858702f8c935401d9a8680d1ceac2e336066a36a0e7b2df5ad6ca2424e68f3bf18fa40a9999c431ce3b564a5185426f65fb04fd8583ff9852811370cf4071c2d094aea1b0bd17f6438f45c60bd0f1b3afe209c6a8a1026b3e8f71bdb32fd504beaeb77c3bc8f65920ea5c07b39474b6fa02a016730b665f06490b95387a630aa126e724a08308604d95c397af99768130a4f2774d88d17d92f70a7fc6ebc2db6344652049b3f615b2d8a3fe69a79d1a371026709edfeccccae19504c5489b7fea505af89c23678038fa24c24786918bf98e658acfd95e54974ed5aa9d5a95ff2092ed35039a04a8c5456d6db3fdfbdc5c66d74b463ecf1ddf88f1fcb6e95962eb52475ee5df759542ffa78714d683134adfa33d6cd6e9308cd5127f79bd8eb035d78ffba9bb614f9871f996d2d7d03aaa42f2e8a9685194847e60bd4c9dddf2e56aee95b9f670dfade38c2455c98b5863d7ebd366beb251b1ca023d9852ee2fe3538cb37c584b4c6b9d87b804735b765fe6b786099eb270f9032187c6a5686f17da90dd5aa99a9eb9e613db499fe99b85b77d89fcd1f9f8466fe4243c5bf4ba6947239bbbb004dd7e0858138b13ddcfbd926665a51f30f17f58749b643f3919c1e16c7607363212a4497deb3398de1aefbe9aa16e4fff638c04f874a518e09307f194f5a603cc4512f2abe8a7f69485038440c5be2b0d5755bc993866ad903123bfc2a101df797cb04a099450f5a817e22c8059fc7903d4c1c77f6e11c7f2fafd931f007e92e1c1669bc076965dc2d972fe83e6920288e3ba6fd19e0d2eadf67db5d39c86e3ad1b1c2bf716e2f589d19c4171f4e78e458b28fab850c2aa6a2d8c6c05fd829b8593ba44d7fd9a86a609493f720963e5e2d4f1b15b0d9803d1a81002dda9d882102f282c88b228d8c0895f3eacaf6ece06c6fedce35cf700896ef2bd842af260f7f94e2b31bdf2b38057c8874a6d7012596a37c377c6476b3b871be6220836fde1f9158bfaa762df8e7d6a6272cbd17985c784ad40d2f00a8efc72c4dec90e21773663920cf7de2391032f164d52f9cb2fe5cee465085aa62bd4dea1e1f7e19361b8228a8f35d04932effded028951d001cdfbae0ff0ed06b91749c35319161c468738b9aaea9f17184bbe2db9f93f50a386f554661312f4e1cd9a735bb81784cfac8f68869db356eb1f591f9c282c12bd18a21d91f82f364bffb9f9215b4b93a32e0dde4bd674cd5571b60bd0a081dff68cec53b927ae959eb58d9dce8a1a106b159c65201d4a46fc4bbd3980e9a47ff6e9ba3c0529f5d983f500a78aceecc5ce6923432dfb9d8788b456f0d289ffba6637f3229e856ecaa1c9f95e7cad2978753389c19bf7d55aa2b5697aee0af858ee7f814babc37f2fa138610ccdb139f2077bb827929a5a85f254de1dfdf4f92035c84b00556c92d22a4a1ef7a46285fb2d4797bd396a94d01f9b9d2227cd69dbe41a3988c4070e79e50819672a47735b8fa10ecab9f1ec05d2928ed1931fb051a27d332d1f1c5bed79793aa687e86cd9d49005983ab7c8eab2409a716a71364a18fa21358f33e1f68fa66afbe2cdd93ea41d646de343914968ada74cd34c628eee98ebe93bd5075bcf958fad637f2052a94e1392dc1db0e89be19ea8f7379ee4cb607a914c8937e6e05092053485abdd882dfb4f4ecd8b8ff4e568cefeba52165758b475e9d8d95d6bdf5c4b7a67e0a7ecc202eb61db8c081ac0eb060f5de4ea3b8a82dc3b4953891748d4c760ae29777b1411b03cd01a1ab77a119752a9bd291ffecd1069640e328d95e1c00be1ed17dd2b11e408349c8c701cc1cbf025459baabb7b579cb1722075ce6d80a688934dbb0fe8d0ec8d7c27eface3e8115ae40785c975fafcb9e81a76f95f4d572b85e2bdc980bc116521b3dc355e37dcce03365830a440b003d6ea38209f7046532a9e8a5fbff09e43f3f8debc1c007a0b08f1caf8ef73e117a556644a14319d87ea48cbdc8fb3bcb05abd9e4b048b13995dfe832a3dd9b67ebe27a280a8d781502daa2745d74f9333beccc4e9fe1fcefe68252cce78bc58bf872499c942ac1c355b8a47a47f0a4a5487ebf79ff205d3c493306dea8762ee626a17f22dcaf696bedcb1d2006e2d0a9b1de3df74c8864b7245e5ed885214a1f0cec654b429fe177319e771628efffa91e97b257068e85e91e50e55afc11999f01bfb6867450cc6dd78f3ccd1c6ca43bd517d719bbb7333a8dd714c68bcbbfdeab87cd64d0767cb83629f8a55fed40ca7beaf6afea771f33f94d77bba2b40f5660f11456e57594fed40b154f61e677ed899dbb9a01528c5df720789adf6f1abed87845dd31e287aa478f2d1bd0fc9c1d748c70689eee1d20edfcb1f4905164406889cc783421d732f742aaab1b742fc2c353cf8c218e4415743e9e59740f7eb3a7a202b86ad8063169a2186dbff1c5760c60137527d793b3f062a829e90dbc610c6d930e5459971e2549e0e41cf9dfbfa65e06c4104e8e85090569f66db0cfd10d28f7fa7f4afc61a096beaed100f1082799f3f9894786f114a35e3f80bd0b9c20709c0d4a10c8946204ec1e7a8b8bd816a07575e1773f90a9a8ef75b067022afcd119a7534f6e3ef03103b3581e12b7e9fe05d9b741fadc4e92b8297b6335f5e8d6db59194b6fc9c197901e182d1820182f2f85793c5b4c6a0d22db501639957ade6ba30ab94fbd5ca50bbf392d2e9927a04d19b5cac3598254ca0bcd146f7239744515a60d708227e5f11719b2a88baefe08f6eb71e59c3e26182b40d26a249b14f21189bc94d0c9d6ca96584228800494cdbd98c6148ce3dd87ca69d49c15165cfd37144b0ef1a8f402ed6350211edf1115de3c3be2941a07b359969f87dc41a8b0e6e44d519d5bda346cd95124a084df7bc94447d24a572105695587afe29374c7b168180f1c38d5c99518e9a5cd9c6c5a1f4f7e663811b6086a254196b0826dac271e4f99f6e6835d06a07e16fe8c545b30cc4410b5d03336ec9451becea4efd8a8755874c5eb7f49320e930a9beb03d9be394d547c19251b51111c9ab55177d7b61bd732019e062897c1acf35e2f07600814deb3d3630810483a16bcdd4e9213e06020642294d475b85830639dceeb88befd9cb1543458c0325dd497dec2cb27b7e0e85db16646bb1440c1dde3511cae4341ebdf871393b5901adaae12748f9d9d2c73b12668f9531bf9e5b4b74c076b25806090e477454af1ffad8210ca6bb0109176f10a3358f86001f09a92165829d6478f67e4d5e9fac85aa196623acc39b2be568fc54bd1f560f796f1fc467b74f5f5bcd710b5fe6f93da7b6d8f5c3d84e41186fff02910e4af292d5d6e62edd6d5199d70e0ae0ef3d4fd7f79e0953c1c2519acc4134182309b35483f50e22bca24319597ed1478321c12423e1e7c547a06652c7e972ba283c5aa5c0a5c5ab1b933bc39ee8e8fe6a4d9d7584c8187f32908528a82045dfe38aed6fd60e9231c4eb447fed75d86b6c68ebb1607c23eb4a39b804b60d33ef1e9c76990b57fd1c7d5063358d4c28f8511ab1c200249070564406ce3ad9c6529f19fc0ba8a98ed40f6ba2cdc797600ce00df98face9e8752058786e7cab86712faa88adf42bcec142e3082fe37b090ee2e6ca00abf3b2646e1e14cdc4acfab295f721673906444bdd609d442922aa6820502dfd476976a4093ee4d15a03aa7e9ba7cf21bd6179dbaa8c6af2e0b4cb815ff1286ec673bd9db95ff06385da1e3e07629ac3ca65f3d76f0c76225258f4c16a71c63b713b0db745293e6c8f56df58a2d28b35a6393ca9f58bcabdc537ae9008790c4d90e6f15a7746d9d2bea17436349da95f9907dcb704af6ca98279805600b1048a6b9feeee155bc67f5be3653e856bfd29edf4596b642066d0d145f37b1bc0b5db498c8edbe8130e59ad433bda5ce58d7ce82a3d2cdc87c018f9c38e67214f272874d55889b813ba4afeea7d7182b2633ed4d10f61358c806b441dd983da05635a32a3d4614d06d2399400b36ac07b8759f710587437d6b0b0f8785c350d8b7057cc1e8bc96e925c0db9ac652fdce8ffb39a109fccaa0e57cf5effa0e6848856098a6d042ae55f62b0b2161c279ea0d53604f96cd156db7eafbed72cff05a51e57b3b9c7ed7816eb09ca675fbad04c11c97ff248eb03e62c3a602b88e6598acf2891295d78f05f000048c7b7503893b9535123b98278d769578b213d0548de71666ae64d3514e1a87d735dab51a01ed7bec3b549fe7e553dee89e1d2c399490df887171f8aae45eb689552c325ce9572f11dd080c7dd08b1e8a094cf871675a9c630e55ce18432d1a9f4cd87358a9e93d4a79be5455d99cc2b1962bdbb850750b8ac788ba160516329d8f780e79ee4414fa93f00e1c5b097a03c7222c6afaa07b645f73432084aa8ce8bf835a4d00d844a6ae45901dff4182f50ed89105c04d8a8418ae0fc44c4a88154f72ed5eac264ad33b0790f710e59c19ffa770153bdca76e95b1567de686c2b7a1cf4e0b2aaea604ccee77144a5623c6fc276015e7ee508858f5edb9cddfbb246910e2ff16e1d4bfd642b912062398a096d0d7843ef32465d5140c048cb5e00007b04286eb506578e9bced5cdede891b522c5cecbb7b819b8c7457ea8dc9bfbf0055f35f328ab6a469a57a712ed773bba09246bbe7e8067e019f47d85b6bc8d5d54a6bd466f166d6e8a4e6eb80bec6e624bb4b7e4ee901a1b70d525a601c89d9193612830314f494e923b9188ee5114f310fd1b05adf218b2f471dfd566c812d2e819dd79165ce42edba77a473ead14b67f86fde863ae4bedcc4f11d88cc3d6697b5446e9c84728568c1a90c0a50956f3c1d7c656b9ca991321f825781dc1d09e759dca48ec18fc0dce1a3bbac96cc2f2fd78df175650ec6e1af2817dbecbe8b8fe79d15d2dd5479dc931e3fc52de40fa5cf2aef3e4472b44e0c78faf19e706013d72c3f13088f34ca4e6f04fe968b85406cb9db208b83ede9afeb5d6d62012bf5b0f09cca038e76388c1ca7b36101249228e131b6caa0c8471205db99d7bf43b80d809b623ee0b299c4bda48e0e0361fd9c078f7b8257f7d8db4ee21140295bdd2562c7761b147e8090b867e90e00c1e52eb330e94327e131542d0d6e6bcdb8c7c10dad6048983e6f68a37e4ed177d90b696ae28a6d7f28c31536aa0b9b1aff2a48f7c9db17ea76d8c4e5643a08d6fbb2c4a500d991ec1310b6e264736eafa357359789212999bc3f2e14963504acbe9dd8e8184130fd44ac81b6b92046ea29e10f8387ecfe1473051cb7a0ca6577a60f0eaa957bcb1131f93e2a24acb459175a3f42228905f94fed1924f0649bb63688ee6304c3e0c66f7924c31373578ad0256d3a05afc19687399c03218e37e6d4bdf0b7f2c3e28b61cede08121e80ee08c4f1f19dabb19add9d2dc8a0c19a9824f0ae0fcbe670ee9d4cd26fad08c0f105db65ff57176674976a36fbfa8954289be38ee10cc5ec5e9685aa7040cca8427bbb41c9be7d5092693350039b5ff5469de90bb231cce559c20bbea089c4a740cef71dd75047f092a77b0175ffafee40cf83bd19e785dc7ec4319786c49b3e7a741142aea901d6e3f6c3b3d9b413bfc595360b8e7a6b322c01b9bd79adbade5e0f8c58b625256414cb8fef854505ea3383928f6686e796effee6a91f81ae2779f5eae894513d38938a422d3f3f00ee291f0bb15889a57b39305ad2ef0cdf7a4ccb9f4abfc9b3b4eed78cf53dee9f3c04cc1409daef0f4fa63a88d34e9be97754f52c27aedb23799527c2c027e03b64552f4df14443af94a571e322d4bb368f010713e7d81206f714ff862673b06ff7989d1c204b13e0dac57b1c3a07d75121ff85e903c20ac8adecc33980a7eb97565daa00ef45dc5d9274ba76816e9cc3e0aed60e13f332031e8b176f774ade5c1102da8ee6db09605c31b494b16f67f94b8d8c0590f20420b98e609a72c32528b826b3288f6127b3888b0df91280c58bb31a2c71f3351dbc1f55434cfba73c87ac47a860417eb3a1a7ff0b165d4931d5c7d31ba5c332cb2fa07e13f98a7da0f36dd44ec8b58a39c54afc406eda3f3971ea56fe437981b915fd77671297acdee68d5b0ac4542a2698e211428511c958eaab0438cd9e8853e976cfc13abbbb62fb8b5a50d595c50696fdbc95dbac8dfcaa7a694f969aed2824bcf596d45f3fc98cd840d58ef2e1663a0e7c9ee502d3a12be8f4c74106f6925230677c720a907f2504acfd631415a21c94dfe233ad50f2f97745245f6b5b4efc61b3c6963653f04e80fd3cc451c856991134f43a148c4ead95c8eb442071aa8dd15929a37af0c983edc018553480004a043a398ac0cc3092c50e8091dee03170ffd60a4c410d674f9b84148844b32ba9fe4e46884ab72543a57488baef1d70505da8ecd310f0561c2ac7b5cffaf825236fff9fc50ad3b95a87996831e98ff3a67b4035ea735012741bf970aedfb5a960c9bca9c3998859221beba39946be17edc94a99e4d08328e1df97d9a76b8214ccac03f8f67f6b7144b2f9cf539f3e6990c8167d74c12015eff621554c16d3e3d1776401f014e3be3ced325ff34b77652a083254fcbdbd45e8e03487ff7a21b319cc6b5922f2978c753b33b9eae3ffa7240a2cb50f3e9145773e3fc653fe01ff001b786311b0ed68882d5c71ccf14d8c293e74220ebc62a12550a1a4cc2adb241ed529b44ea85bded0243b2bfbebd7a0742597007dcfa7c54dd818b7da8943ced089edc13c71695c07c05e2d0a4c2460cf4003e4fee0b74e8b34f3540181a25bdfba332e5d84ac6c797214196a8aca69852e5943e488379957e7c02dd3ac9d6766e69830445a8b8cbfca1b65bf3020172040f5b1e13eaf222e611d99b3728b5e308f9b9b637b9d493528c2865ac4cbf63b186793576c649589515a1c337bf2bcb725aba44d60380e942eb81fefc1347330153d8cc9aa1e5ff3090449d6117a1f5549470f64910259374c5a86c0bdd03aa9e7d5e2aa7022edf628ba971deb77d2a54b0c113b9682c5a8f2285f700355a8f2d0cf599c4728cbfd00cb887d62728321db597e54d91fb063c0b00e904a0b4ac5909845f19786768251e592670f00bd555abd9b22e15fc5f228601883ea879c7c77bf3c5cf9c27a307c67498d4998ddba59a6fc3837c962cea9e701ed7d412a9226a2a130e6634361f0ef1232baa150bb48b4060754c30373b5835f1f6ace51a10df1091fd5ff7e914fdb8109dac0d2e2b8536d02c0f3446bebe3849c4b95be239e08f87c50ed6868e9bb2a75126dc0cb191385dcf4c09221ad762706982ddc847788e3c8dfb3ad337f1c52f70a0ea6defb62f4d868c1793f8ab99ad0c90d195dfacf6f97eaf8c9ab406daf221a29f198cfc01e97b56c6610043c647d569a011ab86ad06c0b132a1b0e3da368db563d7316b9779d3327e53d9a6d287ed97b304530d9cab7a8996b1d18eab44db609e71860cd945b9a8a7322cdca3b57ca271367f49ab30d5c01e91bf113764342cb8ad32e6af945341a9c6a0ee2319a910416fd643c3dcf8dd340b237464ddc0a01954de0102b0c984ecd7dee338fa9d6b8d760002caf80b683fe5a5bd1cf9a644292e3166b8df44fad92d8dc3cca2803abc14a68eaacc38eaa7e8ecf646fe0fa05102d41cbb6aec29d68f5697c6577906361170f049a0a5ead3dca126ca35223df79a6e2bf199e89b4cc7e1660e62b0566235052f91bc7af02d896b5690e608a285bca89c44b361d8a49bd5388c0b4eb2aa470e536867e0841cb6f38d7f59e85761312a769b027e6644d4db1528997ba275113265b8ebff2f082de1d381d5ebe5f5c09bc1ddcc68cf963a9a06ca565eaf2c591a6c688efe7859b4dc307da439d3a733a486f45a469b0094bb125a88206035e86d70609905e878148cad5c0cf9a9e151ecccc7f44150ecace542c078e83ef986d47a88543e05cb159a51045654f00ae11c9b3ee18178c148c19de46edfd0e0faf790c806cf5abb7eae255ec9712f89acdbfb416b2d9ae731f62baeb12d9e530e7dbd08f8e06cb1196f2f52af79eec87ad2f5b8d86d3fc62f2df4078bf930b8880f0630739ac513ac8679c94e93b52e12a8908b716beec6090e01d5426b0f7831547528bd24ec4a009a0ba9f0e80d233e06d5a37e4c2f4f894059021fadc2fcd1f511d81ea769bfdd54ebdcdb9f7d0fc494cae6473b8ac9756c04746ae4d1ab3099e228e04bc5d90a5c234857e18e5b6df9793d135e889c96390b156b3bc5ec15e9f1014a3787ff5159bbd7aed6c66d01deea902cddb030b45075cb6ad824294a8c4549a394379b78f4b97026a5b0ae48ea24c8d8e18bed97584a80aee379c9952be6ea34895d1448d427fa0977d1860ac62fcb60929f3c06fa921b80854934bf6eddca453f82d289a10c5f9d73b35e0e1913830c177783cade568428e51ed190fc31d31dde2d3d030571862bc2dd9c1d8cd8d72399982babab9ea3ee2d7f0acf7eeaeb068de7bd7da65d57fa8bd7aaffc787aeef3f8c9d710a70601982f546469b11fc467437bac12cd8ba54f72aee7c7128f2b632da40e4a2d6a3f30e07eebbfcaded26bca59c9540eb977f2e5dd25b32c18ac1990a7bcc1cd754c2f93d68f749c6a6ee8db9cbc28a9cd6c457f8bc66b45c5e589da4b8f01f7b5bcf6b1f1dc229650fe60efcaf10b1f55f6b9a8316639c0056c266315e1954cba0628b3675e34490105668f5b0465efe1abc2087471b95b65a491b39d50f62ce0bc38109d92443529185c22d372e38bef0ff118cb75645855233e442849af38d85397620af4bceb07abc452aaa8ee83dc77b9518cedc547526c9ead6d582ac0ef40d920460218cb4b3431976732f15838979d2b5f4746b8ebe53557c2f8e375b4288fc3c556e266524626599f8d968991c41f3ea91e832d902194dbdfa883c7c55efdd50f5fa43cbb6615119a35388866a1b1e3f0dfe505ddb62f91f9f366277178d5cc9a78c8cef4f870780db671f52594f7c3dd07f6e222f78812c846052566ea9a22ed5eea9d8d81dac5507dbd206d324346b42323331e8a10e6c12d0b421448ad607e6e6418e3a6b6b2191784ba8bfe36e52cce14891ec26c866b14d2fde807921dd423dfc1a5bb96a6be006324304d55478d452544a254fd6a2ca9e6b970abeab3651bb8483254fd1bb5c4d2edc8c3f0b67c44e0065796360a8c38c1153caa19b9d7a277ed17f74c9996d14e87d3e6cbea7029df4e9d2ac900106dfc91ba86a1997284a950d50727a8e7b25082d02a393bef807d7de17708c34f95f3af68c604faec0ed6f3e828f0b21ee4635f5c02bb2360c54514d30f87cc906d30dec5ecc6369abd6b46cfc14a4db2e4017db604d4497a84b0c3d048c89489405e90506f67d5051ce0d9fa6496f43a3db57eacb51716733b6adb67d73db3a0abb774a6c26c6ec1a9c22e0687591e1b6de9d27e77f6030155bdfc082f79927d2be5fc278a465c46f0a9a362ae1353dcd13909c9d1e3a79b5024864fc5eeb9553d6487513b78361b6de1daad4d681e05240d950d67826cb7d7590a9d1f1fa0ef5cada6c23a9484959e155434e9a9d51ab2e204b78d34dadd47b6098eaf8ee192064beae91c0db06bedbe7098075b21842a50c966c78d7a722db60372fbbef3f3c6a9c43464565204f947e0453b1e8be7d6d45389bafeb41d05e379088812306b1a51b34297f0d1d72d3c03dad9566cac64d7439ecc0b10444cc8dabde94b5f9e8dde48821b8fc87916255bb786855c4840e41a246f25277e7ed0c8e173acb9d47da9f47183659e51307e6869a73dc341e78537a938ef62321885a431dbc8e7c3763f37af5434dc0608b1ba7fdfe24a3fe5353c9badcc48e5b671fd2d662251d21428828a025009fe0b59b25875055998b67e897a324e542fb5004412c73b8086b3d07590024990afb4f0f0822b3969c2d7cbbed36ae81c76b0cb09a063971c67f1d1815ff8a4189191f1e59b56d0f364c5973d25bc1bfa31163cde54bfa76dec3a96265849d1fa5a2ef711f27c7e9ee50c7b94ffaa7c760571c0028e5ffefd8a1ab8e5078a75ce5fe85af6262094c4ca28e356bfba6c285a401f36dbb90053d80e943dfc1ee1fd295a9812a4d7b5fd9a8768e2e4607d89b5fd84ebbb5f4df93c72d2a1948bb91f2cf258f80d0654b1ccb476da0c3123029f26ab81bbb75a765e03deb06f555d9d015c0806bd30e379e73c879ca5b0ef3b7c47fda93b559823832e12daeb10621f1cd41fdf43ebf4ce509c25bb3f44548ce3ddf5c2e8be99a9625e3981a62148edf6171ad22f9c0b27bf3fdba6377fd58f5c551e5f1266d1706210ad551f1c84a21371839fded5990e89b413fe3cd7f4ab4c49e1de66c2d21118e1d8c5b476a7d3fb9fe488d00d20eb26756923adc134793a28eae144670de3dd4e564414a424ec14dea83db1b725663c1035a708e00771bc7e93d839c8079155b2a060ae497e6305da591ee27828d8210113f8eca9001d39c77753c57a3181e8cb31abefcb36d1450f81cce0a4ade98bc49eb9b77090e438700fb465d22e4e2cd4a47667adc0af38ea8c984ae126f2c2d70039f7fb4c5f4f14b7aa9984504e887b53508455be5577f804217f92268c6ca5132a3c9d94f6d4321986eef53a0b823bd8daf477827c78b472f8fd5c1f2effdb31ead3dc0d336e34afd9c4996e2db072af760677af8cc1ac437f52939352d2e5d6fc8c3b07ad83b8e523b9054f0d89dc41a258dab7fed94c00350ddd0580bc318cef943f36cdab1b53f54abd6f2374c539f05a151e5b261033ba8d8cf830e25ace34aa5cfd0c4af866bed826411817b9e2d098cb551a3e9558605047ee0c0bce155c2d18dce1f9cca7f11fd45743d946e6d37341fec49947e8c70482494a8f07fcc69b0749072e04922c504c345f3fe8b079982d6de2bcb45f6f08c0aca4e2a4df24828ce3b45e3cbfd137f24a92b21bda2375e244ed1f4746c8eb879a83bd0146c6622e1fa210c18b80256b1ca6e65cce617b14f64c479d19551b5b756f64c9ce5cc87f7f38cc5f7fa9a71b2d043327f7d4361a04a8bc0251a41690cfd0704ad03803d564e1076326be4b86fe333f09f0cc3585f25ae3337a266bdc2c5 +0x095cd23a91a9b7991155c63852ea124e6bf16af401ff3845011a428cfafdcfc2dabb8b6cabeb9ed9b7027126fd7d2cbf603268eacfab776c8ae48586fae3c093 +99232 +0xc4ff5c87f2dcce57509b470b16e2e41b6b8d23e0d950f554fe9e151a84ca97be536dc43d040725c899e9dec56c523e1766d8939f71094302305318aded21dc17d34726465da073950ef578b46321b7f0067351b544541b51c12af3fa6a7c5513ac5629abe3efdf471689bee1e1997930b228042a3979a5c819ec4e09e4222a3946627673803b9265186b5853cf00ac5ed4bd540737bf0befa061d0e0415c84110933b4a61bceb4777e64ed12169f7703d3fbeb532870724ebf5022896b728b245e908c4d9cee6c05af3c25279cbe03a617aa6e16f3d2046edc82ec0c48ac66f9ab42a66feae4e29813bbaa994ba578cf08928858802ee9d661c0d56fc2513e195912a914eff83fb712a921700a9bfd070e7adf22b7cb490eb4d085bcc0ab3a0ad1c53e449271abeb14cd35b5c0e9bad4912c1b7b80f34b9f3f7aa5fb290083567a260c08bb994dbb81f08c6f57d8d8c1f96ee56cc3ec17106888dd32e7994084bbfcbc6752b64eafc1dacea6b6ae7f53ae09e5fc68ffd6e999c0d46be1be9a1dfe0ef56a4011d54f3c53a462c5b3d61418c5c2335774b0b339ec33adffb7b9a8aa2560186bf20b245b23b6ac6c31068b9f6924197893ccf4b0d2a10129cbc4ad2709a479bca018b58411ab8b936e3640acbfb5b7b3a35337653bc76d4743e3b5dc826a951b65238a20e72b0822b38fbca58d1a14f1ee6c01c2ee4cfc4167404733585a757187542c986be02a01483986f49cfe3818ba40dc2eb5dab3ff7f00eb93521b20a44fd42252666ff919755b26ffb4072c1250f74f1156169c6ad34e29643a569e9e05cbf4b89f837d50821e25309cddf7c5f8b8e3d49aaabe68ab508a0fd6b2f845f1612b31e0c2bf8fb6a90aee1e29a11bfaab1edd493e21e24e2e95faefd835835bbc4e24efd4c6bf5b255da0009333fb9df98b952b79cec10511d38e4c6f5d3f8a07e5fb95629ac6b7b9a7b00bc2b44c2acaaf640704cceb1821ca33b7207961c768791d9a14448e128e6e85075f2cf8e94514b3a786234acf850452f6938fd05a0791f2c691cbfdb6cb3d87bc11a4e6229341e8d1a8dcc571660951d26faa768b0db5e2e18237fdea99991ef28122fe1ddbbe6d4e12fe4348eb5f9a135dcf3aa2a26d55b28e9175f5200cb27057b128214614a8e66b91ae9a3d909381040804e6ed42b3025ee04c20871dabff3a564c78fcca03605c9eedb08324a6e30d5cbca017bb6499992c6cb3f7557167d21b52682468e4868c2be8d2e6a13a031fd44b184761d03fe87dbcf6973a6c70c807223ae776b51ea44387488e91b6a7e3769796a6ba60bcf3dc2430905605e1c422a5366c7dddf14bebb259a27b8498004c89625c507ad761508cab0931a2846d75c1a3dc05c4c72a2d514e4ae80b9e1f5e09c390ab8859dbe2dcad2b51ad1f6c075fcb5e94d268e8104c6fb05fb380e8b200036b51f00b0899fc7f1d408c7b68e168f41bb46f9b2e9c8b04f968e4080252546814cc1cb2917dd5690886a9600a09c2673aec0329a4daf655508b06fc1646ef3bb3a472191d964db214a96a96fa89576ce4c4f6dbf1d176aadb518125cb94b7c3725f5c0755ed4da4683339e4df690d4a41c5b077be8af14ac241be4bca46964a77874043e089be852dac7d1362afce4b78769ac5b20b507e2ee42336bb647316eaa388966872869e8a9a9deb2a6581b5b2601a8f765e7c8e47c019ad44f43570f43c9bc892b18f37a8870334e0920ed11609999bb18b5cc2345f097a1000c6a0bdd9e1a1084dbf98affa16b62b3f5ce7cdfb80b20c98d7611e495963c58f0dee6c02c2e9724e0008c67c3e39b473553ffebe359c2f8fd7b52c0473310caaf2a22940a66777bd39d11594e3842236e020d2d82221c1774304871abdac8c585d031e19f5e4c0a15239c5ca6d601e90e5d471d3ad096b5902975613a19beea1365a70171728f5023289fea64595508a4da10237401bd43cfeb6c27585c7d98d65ef4ac275fbbde8c308e7b1d1eb5f2bfed0ad8a4220a4281ea9f3cad3f9f625d30ad2a17525c05cec00a9727a2af47ce1a89c561be185264ab71099f2f7ed7066f3303c806da76595b76b71a819b683de73f42232231d3c6a29416b4a89657607f18d1bff9c1a0ca6765637c4814e4ade77e077f1b114756747b0c7437906409f4e11c7587ac0580885924b342a63d9c7fe86dcbf5213d627598235458e79d51450e3c7f5cf4251a12c463562dc9e36834e0ed904cdc26993a7e23db88f663e50402ca33c6347ff5ab39b7eb45fa76bf8afa1f629ebc8359379f66804457481396613e497fe786b1c61b8ad947a2580106b67bc9474ce421016e63d91784ca8b909c1116d677d9ccd80c54a69f7c07bb1c987b2ae307b99f0c7db45c8ef96bab7725db22567fd9a5656ecde9b9c2166c5102961dfe678411dd4fd060f74f9c01aea104f29c6a16ea02c53f09232f0483389774f90606c427d85730acfcd1dc1ccb70271e04c101f92492208b580d42ae37c9606276400a5fa2166d971c3abc5b4215a9fb2c0f2b513f782ae6e507613bd30b10e0ebbdc717bf2fdf95b1e4bd5ba72416207ecf1390d7c9b6b25687e0ba9efeeedab2da7aee73e61f4f7a6a4f7c6f0de414796b3b2672194c64091931b8fff752d68810964284eb952ac235f35c0e55ac4da87e028092e954828935d4957a96f55ac81ac9c256a2e99e15c23979097dc73298721a3dbebc8774536869fe93504eedef3355ec6dae853001a99241f4f8dd79a5e1e2cc49f53deff42b3252deb5b7f68a04fb0f3e50e07702569e45354947796d37ecaaf945e02bf7e8ee20c139d90b150a09c94d4c83e99453adf15f01adb86afe9868110126debb3bfde6cf4f1aa21cad02991ef407fe342b41e4e69478cd0ba0967235c96a6eda9ee2137d7805420d8885fd27e9b52b6e380a8e4084211debc83757dc013352b28c2b4530472161640704740c9043f7af14685c11534f2167d02b87783b1a30ff8e39eaac3ee786bcb2fe8c118a1cf9735adbecbd844b8e2c42c39faef9776ffe0fae7225c1c0387416e4b3eb29a8975745e5aec989beaa95ba9ffec4aee3965aaaf98a516253ed36ad476a0e018f67c7901610b9f6010d208221237dddd71a81ca9b71a3b31b1b50e0a73cdea439c150b3ddc0f33bcb3c7943f7bc1f08da830ff914f681167e596f4b74aaf184205a6f1bad2e29dd75aefc7a74174cb2665651a0e6579e1f061dfe584012db13eb999f4214b6b25d88db268036c36b5cf31af37c90334f2f4adf6a918a22eff5e3e54dc1a4f9212e8d47841fa05f1f8b093761c6930818e9a5245081d349c48cb1e41714ce73fae2eb8a91835128cdaf213229297f548fb0ad732ca38c05ed5ace1c67a601a5a3fd3c0adb65b9eefa4bd391b61fb5971826dc427b6134d5cee2a0d4dc1fdf1cb0efe75ede315ae029d388ec9513c64e56beba28b9556e37edb6d2c3d0ccc727a63d85dcf660b4cad0f8c99952a031e8afeabf8c62fa98aace39cc5fe2475a750868902bc09e47fd840e0e2e5b3f7904983d64e404cb24bce4fdf61f8d19f9833be38ec1d9249506b795df222b5c1c10b41932d60b41c2dcc67608793daf24c0c540da158cae1c54e022b50b5f908b9b6810b1b902e8d398e7344bf370918cbc49031abd77955e96923718404447581338b65a23884ad76fcbbb6924c24b61d41bacc9200674cc1a42458177961b0206ba7ca4abe7c26ecff87dc863af4774b6d1a05dc3d5b6f57e84c07907b16609e451d629a8bdf9da37d1ede256941005b2ff80513f51f66b21be5a677712d2d04a834541a0774bda45fc9e5f741d3fc586e9bf4be8f79d8da27355f55c56cc1597e35c9529a052bf68ed019832b711147144cf96675326dd8f28558b1de9cc1a5ae68e8cbad5892a1f17ba1518de5e73208533c920e12ceb3661cb9132485d8f02015da0ca63798ae6f11a5e9d0f5272032f8e6cac2e0a3736a44ab03ffeeac43bc84c69def68e524f2dc4fd45d6a791a7a831f97f9669321e543560ad7a0e5a56afdd507eeb3220b6122c5999b0b8427c83b0e7f1b6a47c3c162e1af14642c1f12c72fd10de2f76ba32c2fc0f1a2f14f0469dc0c90b56764e5e9747b1e0029b89c2bfb83b3bb0b4da242b6d1c9f5679a1655b0c6c10f9a09392039f55e3c8378f07162a6470807b845ac82558ace8f11e647b334143f88bca54e55a53ae2e267f6e18bc1338f92b574b1bad49bf311bb5d870ddef20fda8411bdf3131bb8f08e97c29e5cde19554b179a86d4662c94a1615ce54cc445386a65b339c86a8852f4b95ec5ffb06df88217af0fdf5243c0c9db106307f0aa497489794f4b8d18b3a145fb2633115522625a387d7cc7fe3f3db4e9b196e006b6ac65575e24ee30b99e24e2e97f69977bf4c97df8342d27b605d230f481fa21261ae2948edcf39a0cf23c5b376c20fcac3f4cc6a78ded84d0271f2c5751a8c242c5e67a06fa061d55a577ad38819e4c5d4bcc5ab2116dde33ad8227ff8d51b3b2b55a4fef068e803cc0bc2213464c4f35212f82424816fc879ee26717bd5cba1df2275c7088f38c684af200f14390ccddc85f867fb950a875032935c56933a02c8533e9b2099c09824b0390f901d38dfd4842ae90ec84a8a4e33ed9311a3d2c8675683edd11f3bf31ccd61a54077e583caac2419d6918c5be46099b8557e228d3caada218265f751ed353e629ddf7f642f5c689d0b976c7683572c3e6a98a5abd8ce95f8bd248f5f16b623ba10ca82fb83135cc4f6304764cb661987e979d8ceac406bb5f9c16055199eb63e41bf7ca4667f95342ef2c9a12d4be6375a98384027aebffbc0c326ee667d6a419924e91939ef966d2e555fa6294716cf367a50baeb48072c9ab02f759dc0b4768fa144a48de1d4d26cee65fe20062fb1f5a69e8967cad5eaf00ef6a52007393fad9b1be0c2f4d4f683249913d1f7a58210938e561d95a099594628e78dcf4d2f7ba8db5889a71b5bd97e55819f99fcb22fc7bc8b7d46fbca4edc12a7477774a872210f7642671c84f87227c1f97ba9b4abc985a4273d4bf04957507eddae545d09ba24b47dc35cd468968c4f600b411c0d0f963a7c0725adc14e7ed8c0b2409fdacab7ad9c2a60fca261ff9463c7375adc004ab91c32fd554f07ea3f9141ede34de934dc3e3aad501e4afe3b954e10f381523f9a683f47796b3a1f3dbfcb90e9db7c289ad442a66164e814af54fe5268a56bd168e08aa8ac7e4baa3dbccdfe062c1a0f93eef0f0b2fe9fbf6a2356603ca0b39cbf25a3754120c307ca08b779ba88496641feb3f0c753f86af690f4eef21bd01de7a82851e9db26b46d34169889a870a91f840a4b10fd78b3cf2e48430b7f37c17cd877a2f905ed3c91bf79def5d52654970f7254225397066e4bcf00eb3351240947100d11499d0cc21b4fa181c6d10542f16a906e1ee9ff5e79f7ad33d0b2b1f7648fe4a51e9ca198c806a4afd61717adea81a46697d7eb1a5960ac57ffe2f7e1c155be36ed929760563d5ce28b4f28325b25f4ae56e7761c3a8882e9e9586232de001e493ee55ac346621edc6f1fa36ab3e605a7e4af0cfecdedc54c55999d652afd795eab2b683c09037ecff9df05c195305be5b9753c1c63eee801ad0ce61338cc53d98acb4c252eaff16fa423ebd16fa36bda6e00700f9d3a6f9c5848e8b777eb326c864b833917a61b2e0674b214b3adba084aa74542ea2ed09effd421bc78e8996a063289c264a4607d8957f505f1bdcb01f7f02840db5a9f6c0c150dacac22fd648306ec6b862945e0b534211fba521329fe6195a3d13c4095f5a229029248e2ee953f079f0c835ffa129fc2ec7e192712c68219c67c4248af5501e048bbc8ce5ab55187c76860f32c19f156d6ad618b4ec8c821332d1b3c1a929ae0099901245b5bd4d99f1a40c3f933ef5978d8c99420adaa487474157f5a46f394afbab09943013f6960928136d408d0574d70cfe64acdaf0c04d1cfa700da927ab5812571b43e07d3c671c0b06f015abcbf15d3062fb15cc85ed6a83780d60dfeb58cfe62217aa4953b387de50ca5c5065828716841e12a19fcf34da56cc1bcbd2a4e89cf1d3fcc2a394727394f7ec5d0b339397123d59d8d79a82e75271625228e46863cfa05b50f3b3e4b2199f4d3883ac889d538273d7f3f65a92b325bddcb4bf542206a6515b0db8e58329e8054b95946e0f9013e708bb8dc6c3c30fb5d13fdeb6c1dc0c654bb74a7dce0afd9efd0b944ed411183dd2f904cd62c858d19a91e995279afb2088ba11b57b0504a0b5ac532fd61ebafe9c730677570b279a9d7287fa3e879a087adeb79472622691dd3f7a19fcff20b1d0f239cd8ad4a59743aa60eceded12a78aeae1239c698afbdc8db0142efb74ded53e45d6e36bf950f4001d731c128a851ea83969df6259651a5e9e29545bdb0d131fd39b4b174d4d193e6697b33f2b28a0de676e2494ba58ff79eb5f57687fc7f25d8b22a821c617182ae2619bbc1d1a7655133a5448d65bf3a840bf1d678893dabf1475e4d18e355b8d3ad8bad187e30ad5e4d655c6d4f65eb1454f8fa31efa330f179ce56fcd2f482e1605f9c69109c22682491156ddb1a85da1199563678365133b9d9543aa8e49d71cee40e26516080f969b6e4019153974fd2518ee8eb6d8942982da954ed8c54ef79d786f28924359c8d456cbafa979be0079fe8db91bf45988539eace198245c4d1a87b30503daccbffdb040c8f5d103531f3188113b222c0116c8d18a53cdc9c76b57f722f33730241e64e78b82a70a9d1f9727bd9dc8d33cd5404c71932a5d0c9acf82a7e9c14d9e3d590821d7649c877f1ab2e5c95017e097ee65bfdfa2e0c5afd69ebd6ee0ebd66479ebb17d7181b949a170b34820c09565ba649cc09d1999b056918c09fcd1739aabd864fa3481da8513aa4da1a29605468c902fbd83d131a736a43b427dc81ee8d71662d8176392395aa8db5c3c61d6424c32a15ebdd0349b5e1ff2a1cc987f54e5eed29e81f18b6f5db2860258e8b061e292192bb1de4b95b54adbaf4f093de9bea8dcd5daf16a2e0410751a5df43cac36f8c0adc8c31e9c256c1bf36fe201ac488caa04892cda7f3709d22cb34d212a30acbe6b6a4654b896cfddf594ed72a76ce161b3f86a8168dee6c2c0c2bb08e3b9f53aed003195f1eeb9473e27f039e113f12c6b8e7307f4e1f06f5ff10699e0b71d5cbcf04a8b50167381558eb4fd62230231b2b30e1528286c0190aaf57b28146a4e5fa45adcdcf645b4c233016733865d9813cf05530e9ca5a0dc555157c3b625355e8228309e7676080e7c9f1f5b224a8a134a1e68ad23e272ca58e2d4ba87953c42f47e309c7f50a4c0d355cce2e1102f3c8d22fd0da66aa2e21c709b146d048892612283e0f719b1609fec16d1a9f9ae15fed8b9370e8656ac09c353d952b844d631ddd272c81a5677482da72f644b2f26060a4532417eb7b188a2a5121dfa9697cb77c558d89bbc8c36dd2404f94fdcf80e7e4806299aec78ffd739c6b612a65b99b8039c11e40a27d0c73858504ddb127cfd6bbcad221d89d728b6fd05489dad02683546593c69d080b28934518d54fcb94f565bb45d746d795ec5bff1e4a3126e4e025c9aed0110ae65bf9fe456703f2e3cb0eb289416ab4b410d15642ddf14453313e8bb3df96ec0a983a2f1f25662428c2175f00f2ecbb7983706466c7a3af0df0ff1a4757a731f467d4460a730ed5c0653fff416e256242dea9b7dea9c0cd51a9f803ddcaba53304548d19be2369e674eb941cf15ad3fac6cfdbf2ec6b135dac6b9c6ebcb58f64abb085047e595d479c943950e7bfcaa02c8dce8dbd12d6f05c1a4d1f5bbfb61b023b350a31fa51e746f4f8784139c38027cd7c37a4b7def7f3559b3803f2a4bed29aa4111d2dcd2e3cb3d87c48ef47017e37eed6e883b1d83ac38fa1fa76e0b7e378da028c1b5a84457ae244410add8bfb722b53d29dd9fdf60d30428872f26cfd7be0c6c4ec7f5128f11cb877b10e8664273b97aa2ddeccf2da8703f70e6347e84bbd430ec7c5fdaebf90c1310d615a82fd2789b85d46aff5d39acd8d74b9ae6b917963b1d4b3f09f8c4645b6465e701d9df61043539b0dc6a0738694c97f0b50f51d0df73dd192c302442d4f838d2efdaeb0169537644e2ee81a1852383ac55d1eb0292627a74ce1c7946244ec77fde9d95e82f4322ad9f553956910e674445bb53a9e87bcbe84c3833ecbddaba346aac6063ca96c7418e38bee6315feb4f01161c45662249da32fdf484f62e5996f081cb32bfb0cca72bf352dedaba6833149cb5438ff87cc12ee82bcd81ac5e2e2cb846a39343ab44f53fc58ee1806686fc99bf52ca50cd438c816a14d4e700505bba5354d9b20bb1765857950a548eb125a78ac1a9ddb3c7c8440009546118a42a0281b4f77e36633be7b97fa9a919482c40a83ea301d8c48ecaae09a4acefa0041b4252811ae3e092684bbd43f0cec27cffa8184a3fa4d03c6fc4943a2cfdca667f259beb1a7ca026548ecc6dbde7a6a43f0aed141990614dbdd4478953db89eda89c1fa9ef69286427132b8b832c6b1e79313b751233fe5f3f6d7216c40174f622265c422c41efe86a495921c2e5965848cb71f1abf80ddd6ef0d2770ff7f21c7654b058339f7d0f98b1e3c50fabaefe282a3f2e59652644b6feb70e6a37b7cd0f97da30a7ca46663ced49e9cbf71b5c91edd16fad03ce21b1e7be5195390c847870388ffb6ad278c15c0a147a5072101086f75a194c7bf0ea6c46e5038486df2b6e39aaa0e9b7a3c07e82b9bd3039a51e760f6220a7964ecaccef4d27a2ad3992f27c352adf4c93a4c5625de72ed878364b980c45bdd377ddba25de840be63069ad7ea41ba437b4f8d127859a94e525d2681fdd1af78a189d84793dab28d83009ef9f7bd5e0df84372220a54a1ad62a8d6c0548f2dd40bd74ec57cf0fa1e9c4ee397d10fc1dca7dea290c51781921f2b1b7f6d47fe78db30e32502723df917b912b8627f0a37f2e7c66490e97285f1b09ec5304049ec7b5c3f6e0ca7a6a75a09d365915462a7402885a452149c0f40fd069a85c437b951230ba881d85aafcf06cda546d8f0b3fa67885af5de26b774dcfc065419f066c74defdb4b4d8499dd77a9806951dde3866d768d60903906f512281285889b7b43a19210514e4aeeeb260efee30850bf4d02f8467b71fc832c6a31c5005961802fe89d4f7b23d43563d9a5289a4572d0b7edb68c2ecb98b67fabc028add469fef2eab79eb1134bf6ac59160577506a9d2df8576761e43427579c7c417441dc7df46f8907db67d7ba2e6e089d627061ae15e984dffc06f95f1d070e1a3ee7e1839d3fbb91e1689f0751df23f944ee7f8cd889e4fde7770fe537b21dbbf10fa19a5521f444ab5bcc687d7610200312ebbedfa020c80b7f9d410f65522a7701434984dfdc29228b85621af9771a8924cecc91f6df494e68cbfc0bea5571b605f019923f1c472c3ff37f9031fff0bc6c4f3f5552ca869978c39d9508cd989863d090e70a5ca7b2be3e4647e651a98632979e957e8889d5f9aaac148662a504620a38eb07434f9d518d3fa8e0154dcebdcd71b840c25ae831abb1f02dbda2e14bc79907007a49d34008f319e6f2e57c561a41266120ffbc69eb3590c5869619662e39a1bba99d3ed3d9e903c290787745a69446a9498237e895c05e16648a93fb68a223027751c55225a9cf3a980ea9d298f582dfe6ea43f8cfd8c1e7008537529c5cf39b8c6f4f0417bce317b2aff94519e941cd9e40c7dfc1072101028fedb3f3ed7b4e91fec632d4a9a92085644fe550faec391a8baae695d4e72d11b09d6595df21e52e07112487f8871fba3493fb66afe9ec02d3d65570c77931d5f12fb1a9ba4f260a9118225632e7daf828adcf8290a1aefd2132747c6940d5f8598bdf57046cdbcea4c37469de301be84786a9cd267c46b37ca68ae141a4e31ff19a37c947e0ca2148fa61e984caa8329904d16ff8e37ecdec1ae1c7d80e21f4c04200240a12bcac86a532fead1d497d26108e8f8f3c1cf37976bf55b4e4591fce6c8493d66c781765ac30cfe091c871f7932a5571f0e9cc2ca26db35f8f51482301093c3255c809eef7a085a58eecb71373ebea2868ad010c87330a6178d216c8e7d847a635722a286ecd47847c7cf7829a1a763c0b3039210b58824006a331c40839ddba753f231bfafe3e06c341d84deefe203340391d7417264286a08e421f4a7326f77bf79ccf817a92b2cb03037b59e111977192550c94e373bab059f1e197d049e4b0623c4dec8a6a10fc892014c20971ef050188f268d83c659dcde513d6966e0a7c47ac9c2476eea9bf9dd62110bf67c4644f5e2c7d4dc60ecfb2c7bdef0ebfef487094c4108648047a05cda82d4b1b9df64481c4b98a383daed03ee5c980611d7aa39ace97029daa978aaeb400f5b60222a796c106d6bb7ba2eef3954e347f1c7ca969c1a33118217cf4214a7105607b5342482c4b7b774e13d68dd465713f72b44aa7a51b5cdef3930bcd7468c24091eedb3c0c70bf9341694eb5abf681c9a98c4dfd82e6cb1aa742975b39cd767fcb5c3b1d695ceb38d90c1f1320eaaa46496a7c1261eec6f2c6f35f72a2886744b2052a914cf9468da064114e3e2735ded8b89d8f491a958ed70d2cbbb582ddb8cc516f40bc2e1abb1ddaeb0f0a966ab8e0dd791b43527f1762f8c6de7ca12203a4a9d4d4c1e3ade9d8d477fd8e1f90fde841d85f567ecdb5f01bf582ffce7d4cbf731ff2630049405abb7bc1d1abf0d4794c82028a87c88f08e0814f45f235bba7181944ab6e34e82af8c002db20d3661a663eade753b5ce32ae31ef56f3937ae3018a72a013b608d0f10e69b5687fdb53f7d50876cbdf99f6eece073abbdfaefb953a244ad819c8d5102c9e66693d5aac6710ba3ed78d19dd062042f9306182773bf001b2a5a351c0bce448f60d540bae1eb56c476006766e5fef459c3c601ce05d76b1df639ecb195cfc0f6e3a0e17e0858cc59a4c93d7326103bb2bc626a4be6292ddd9f8505e695a3d9dd5dab1a6ca025f6e3e857c64af74244aacb5f94397b20d2da94e0230361d6f9733d486dff5fef40e3bf109476f01199a29f32220f5b5ae48564cfb6c0b0d5aa89010d5ebe8e2144e9a7a82a5fa6eab54a967e8655fd33fd7e8d985386d92c576f576e6f22b1487d662072ea9d625a22035f995375e74868168dfe6bce6147aa969ee001b47fe154d9b7f56788d8cc6a5d49170c079004defdd456722fdfb3feaf5606c8ec306865c4ecc423da70dde8c8e17c02838df5ac84ff3508f3bafdde1a0b473742796a1aa82d53a1eaa0fb47c6b73ce97237975b5c7d0e92d26981c3572d25bf5fc152fe03f82864320fa0e1e748ee234c336685e4bc67924481fc38e73a26c38c9ebf8a58dbb6dd59035b51ab04e43279f7ffa6ae6bc4a9c29aa9c96ac0df066167fc4a2756838fc832a7117289c3b993fbaf2829d9ba2bc4fa36df224f92da66c3b5b7efe7130df804009bde26110b22c51194d7a49caac4470ff4de3506c21518685e231be9aa70fdf47b6e8830b99edaa377484af0a95907b1a4df2f8f5fe50c809761438c17bb86ff1a742ec74770a2f149ec3b5a99fb92a859a58db1066ee6ab0e1b2c5ec840458d03bf68293730c4677744044f1f149e70add1ddf0581b5d242cc104e62ea7a03ac180e2fafb67a59299d024228b4c8196fbe4aee1b762c6987de38bc6cd4a3d64de691d91267dccff3c21199970fbc277de4e6ef9c6edb9746c031f5526a053a7a4e886a02afbb109b8b762f862baf7bfcf8f9c9ce904bc5491903e35cd62a98fdf7fac9c8b69d84e99f38ee3d2f287cb4a18c66fa0503595692b76dd23d9a569c8befdeaca30d93a7a75fbc0344b0926d88a5ad67f48bbd36d3537afbcadbde20af7091f59e90a59b4af4832292ce25ee554f865f866c57b183e2f420a27796500d83caedd1b0228e31fe2ae0400a9d00af8fd928e32d918e4a69c289f0f6e8f64d3371da62f472490485998677ec636b3e6f8e0b3256d297d2f2cc7edade3bd817856e0579e4fd916a92b85b5efdddf7abf68e509c708192c084fa4788b9f6c01183a9b63f092b310b2b6fa91ec4746b9e2cbf3f48020848bf28342b230e8374e6340b35dbea65ef905ba6b6dec99091be1a0a205e94ce8175e56273d36649bc3ca07ac976101195a12745ccc7959a2fb4c7573a08ae3b048ac36c68bf48b062bcd0dfbb380199e9e599343101aff80e273c8fd66cd9b79ba7ca3a4f103c202c0dcb2353484763b405b85b2db39f14f6c07f983cb29caa0c7403b473edca01e4d7992cd9cf6ad9bda88ca20a05ee55af279a5cb403807c209875c31b7f7bbb50c443e495f4f061ce771ef20e202322000394c286870c959fbc284d8eeed6b6397ad032cfe06365ad1a7531832cc6e5b2fd76b1f965c85e5187253b1561645b66a148fdceba4a4c23389949af5060058dbc471356c63c3dfea27376f800ab10a1e2b42fdbab2e7ef8799320dbb578ea59e90fcfe5d1f19b6db41ae57ff4353eb0e51baf3edb9663f4876aa04e8396fcde2bd7cdeeaf6ee16766236ff2658a4e5c5185653f710a63df0726b052e142a3e42ba6f5b9873b75b46095fe987a30a66dcefa39269612e680a4d0372df705473290842f8e82e1c11c497879ba5cb1b0ab0683133a713754a0046f1f28ee665091037963b4c8e72b67c9d5c7a03395d3de9e27dbc42b001507cf0b4f8beeee26c92c8e797480d51d5c8ab3d292266276cd41ef790cebf6917daeadaf9e1e2331a2b2ca5916d234fec4311a81d85da2034195e1d55ada9f30ca485b27a9a78fd9e43e36ebe2e78a36676912bcb901dce1024208d8f620865bb5471f9ff3b1ba875677d8181fe7622d0dd8a46b7e3a9978d8f1696827e43078085001ffc5632ba1c106bac617fa414a7e26d777702f60308b4a0e6e374e27f1890e082f67e56a91ed92e4de1046b1f781fcb4c6d409b971e2f4fed36c87f22c01263c172160ffbda2c45c4953f6399ce0024141f5ef2ca3a698417d0fb719933743a5a03bfc738fa8442ced2830629f61df88d01a0a422e9fdde0566705248cf50b4cb0fce04c6dc6b95cb4d61cb269cd3b915c8a82827a956ce245be9a9c8101263830ad3515c1c6cbf285a7e4b362ebc062cb8e7e75ef50ec4f315a9e09d9243d7109962253f26e23f847e1adedf2851405076e26a1f697062f048438f1fc26f80021ffd09068876975e4cda2e78261df82f672a390f534628ba58490de52cffeec623066538bd8457243b3e8297849cadf82e21dca56eda76afca2cf5743e7f83db3700d25c32b5df64cdbaa3b3e027c269205bbd57f8b7dd5f1261de537358dfcfb09ed8d78465c09e78c0ea63a579e5f0d24a63bdad68ed36c57a10e9682663024412d1312f2e8b3fc103cf1d60fd890dd870684cd957f6c557f845dc8962ae11561f63ff9f7a9fd73ad5da479f1d1c3e9760236c292fba894e4ed5735398217b6b06f9a951d49ee34ac99478ac732ff1939c2db2093a89011ce0586453316dbef78c1ab4f2c6d8f285517637357a24d55176ffa4f612e2bb587f471614b8d34a8ff13fa8debbfe635ef007f9b6acab4855a311cb7c436826656e1a0ef4b902bc98f8e10b823e7fe44c47b246ac7523c91482fc8c083689b0d82f49c59f9c6c73a6e5974399c8ddc3e1ab1d94838e1ed612a9286d2686b80935457ec051dd810e3e49eae761e588a093aca269d831fd0de4781de5539e839de142f185d816d0ead3b8247d971f00f8f6ced93d171b6eceee92559b1bf86ccd80aa7a9c7ec2eca7eb92fc6c95cfe73b6f742a94cca4b497a56a67e4ec2ee43687de426ad25c24b40a8cdb3aea92abe6825f2ef775689f06bd72bd6940ac7a575b7111776f5d399d94e8397ef1e1bf98c3c25eeb8dc15e8a7b4dce8ec5ebafbe9fe54048a2406bd33f47af9f6847a2c0a85022c78269a391835e23cbc876f4cab9bd576517a05be34e1da612aa2ee5dca48b23320fabeeca5a2655a6d4e8da0a3d6bdf533bf78a4c65fca57f3422096b3cd5d8b1621290835428ccb6879bd00b9f6340798ba0678d0b47264b92ab7deaf5b29bac4638495b25e801614d0a672d5456136e83458413929fb0fe4235c3ea63b414a9087779c033e69c3d81df101df096d098bf51607eb068de1dcf5b7bc7eb6cbc3e457a923102a6e5a1e2645b2bf8b8008e9c5e7d2cd934f610a686f632012f0ab2799c335c16ab7644db44b8f5d13c0bc6a6c73abc7186a17d4442d387497d78cc1166cd7fe456d69cc8faa9fa1e858ac77b16399c1dc068ba3509845628fa9ed1a964d13af05b8ef057f0bea74546e61765d5fa5a3284946e0555991d3408d579ae10ef0bcf0bf805f4c1679bc9d2b61d1380ed655445ecff11b1724adf3ac51a9be56770d4faba342bd7253630cb636ee0a1934c0786bae406a7b07daf12d63aff6cdae8a69a3e1169cc8804fe93867379b27c7ca0c996c330a2d41407f391514511c9f1c88d0c044afbf096a7cd87d12b3e1985c470f9034c2d4dac9e8f8f04097eb52a9f25aca32bf00f59a0cbfffe919efae5f72f6a2aa5c18db5c72917b9b90e1cd1af068874993324cc9e314752396f811b9d5752afd9ea34be0672d3e8e04a71a58ca227ef1f5fe17de47006828f2a4ca54b8b5b194511a323f0df3c27fbae5414ac8b13793ab0c5dc181ab5f60f59de01663ddbed93d289860ad0c8ed77b4248d7323d3a957e03265ad93ce23366885be91d16da332973862b8e9f2bff0f6639e94fed1061368c7a9196db79090f1044b430888c0adea30388fad51f5d3efa1b6768ea405d9b4e624e02b2ad4ab6dba25fe25a5cc72561185f37d6f45bd0a6f738c55c52f374f2e57963e6055e24917dd17cb5d2d0c455cc988ec931608c11d446ae6ace8a8b1f0cfa02a20aad21dbddf445c0778e8326271b47d65fd33be4ba786b3c3d89a67edeb9270c42a07561cbaf87a4d2692c7c31d0aa27051ea5c6b2b643fb275a8eb6639e1a4c379de7ca4eea88886cca8501f3a0ffe1aba89260c2e880cf12640b70a392228b710d40be6f8d9295cb17585b74718d2fdad9ca5af5f668df880fe554a77b88f1775948e73581ebf279ba6b32bc2d9d371819145b50c9445410c3e309764395a5d0e7c7eaa8acdbc9fe19862fd4ba7721f0d03a0bdd475b5533e8ce3818d08ed007218572d0f7ac3fe09e73f9c3026316e7660213a359f70b77e66e88960cbe99a16e4925b64aa47ea9aff93991eba93e8743351baae85e9e67268ba2f7dd6c292835ddab618e0daee0b6df97475f90c057d09bcafbdad935880eed2d432ddfa724e007add9a92df60e1aeebaec4561c4df73fbc99d19b0f864075bd282e3603c1bd690d327854d7fba43ee4b88846574a8951ebf988b2b10827a9f39bde73710977f40c45209b4716c99a7f12406e1f6399fcd55f51a92a56acd7f09fc21ac4a1f43de29621cacf3ad84e055c6b220721af7ce33bbad2cdea56ac4eb457907133c8a34a960a87b2d036c631f79706911d407e900f22b42e4bab73686a2d78f9274bc08ed53946a48f9b9f6f6422803faee36e865a27e1cdf311e9c831a238df05241239c43c8c16c14d362822bc23757f0eb9109d48d02f69305bf89b54549545b814d5f382bc8c0de226e6c3b274d4d6390ae9590403c5166d668417c250be719e54dde3ba7c76dde0fe45c7a3d8d06ce8c05b0dc7f111935f85d5276ab1bd013d3edc05323059a9c008af9f1ed3eaab9475f03c232cb7685d36766acc0c038d1b4f3ae8988cb70a15e2aeca720aa60ac2983354941b08fe0cf4d22244a4447dcf1284fe4bc611774928adca4bc1751309a3bef7994098dcd54d930e832ed24bbf0544c6ca80fb69d027372f1aacea5cc024dd95b141d97d5cad138006104f8f61b3f4c29341d76a518ac5695d3178309c9829af6a736d67e99fee172bed0ea16d9b0f82449d27e133bff2f981e39136e57a2db53369a72532928d448309b23a29171f864cd77f76fd232a603727e7f8314754378aa9292d9e316b98aa1abcb22ad48f3f1aa540842470e62ddb92cecd069c27b6fe9665e9a2d92373ef84a091e94fe91d4c6b1da12015b0c2eda8c84debc532a40dd5eff1d7062f66e1dbe051fae5b7b140bd6946a68e14bffbde66f3476eef9f16cc29dea154f9f21f74fe8ac632659b95f0a5fcfe467c8574a82d55a005c908c80d95f8a8221da607047da4e1b29d2ccac9763cbddb72a3e69a7ddd9c065961800ec6e8421a04e326fec028c3e2a8f53d9c3c7e5bb971abc029faf3820d0b49ed443f2605994a49fdd8889ee34f23859ced7b4a6e6d040dafdb074ff87679125e42612a791c483afa06196fc654974e3731a5194c72a439f422354b75df0d6b518ddf6e033f9946ba1bf523f3af6ebfbb0d6c739c46ccc14b94076e709342a5658afc793a6fb7fdac8ece53e19c346a86d513d1d4660823f4b4e0317f5fb36118ce6ad485292eb04fe2f76816b762df392d5dcc6b6cc0e2ade9722cf880da1ed9cc8cf889f8680f229cf2d9199d847e207a8cbbe7a7917dd5b61fc982a3114f3709e56daf59ee7ab321533f509b13d80b412338dfc2f465eabf5b9f94331372af0af69c7bca3c8370249b03525c9b6d2815d3cb9a2b543b7b49b807b3bd3b19a054531d65c5eca9f80b3cbda54e75be257cf0dccd6d5b5f0609a79a47be02b4b95a6d68f3d9496ea939aad6bfdd5d4b71cb2cf4eff55440f963ccdff691f4c46891b7f7ac710d42025487e708a59c859ba4ca9c584fe991e3ec7a4116e5abd92caec542063992b4a1d036572623ce0d117e6c4bbcf985c243f842564f35725373f617e0877f6436f62148af8ed45c3261dc748b747eb352a83bb797f5edf2d3ecfc225ba6df0c597dec3168a933e1960b2395c4254beca37f1b4c7ea18ba7dae645670bfab4f59ca785731b0bced8c88c08228e35edbc65371b6382e8ab0bc8fe566889e9bdba611181a02f3d01cc2a42eebd522cd08cf86eb0af4d21b8992e9393a95dfa35b5573a652b2da379163bfe4bc8b870a0e8dd947f9225e320ca9c54a1abe0b2d990df90b4868ee591518deca3d719b7bb5aa536dc9eb5a3903a62aff4e2ba9a05b77aa2d444db59f6f890bc8b6b0e589c4cbfd46c2764f97343421401d0541646a3b8ef58d89b96f695d4dc66e6fed9c059addb82eecc5b467f9b1f5d1745be18e00ad4b6d438232c93cadacaed73c1d3ebffeac537442f8669de206b09f807f8e6e10182aa4965158d03162be10597238e2650b7b3750cbf8c9bc5c03af37a6342ebe420dd37f32debee3d0e641cc05bbaa1cbbec5c7695e42548dd11cb09be46e8bfb35ef8c53f23b1cbdf6e931e3d8fbf2aa6ee0c3dbef3588d72241c7d2f8d431c51653deedfee4ff0759d2dd6817bca97 +0x24735a57531628f9491400828455cb7c7756b74dc997b40728961c275d3245128fec89dfc189ba7cde92e849311e662604eec6d8e5e85346b43b1b35e859ec33 +100024 +0xf040505326c87eba5d23b28cdb0c0f71778ec0f75cbcdee20ba394c49f7d81cd55285de34bd6e0f58805df8d3db2b9a54ac9f1bc04e11c293626feae6696f05059718466d9ea6cf1b523982b0a589f63c15b60075940e903e65998495a657fb104040d04566eeb53eb65258ec9688a52e32a5501e2420d182424a9bd0550f8985ec940e44cc926c633b3cddd0249421ab81f18d2274f4f11f76f7b32efc021ac70a8652f4263e2f094f5da413d638f644822f0a1b0d07896682254cf9e1ec496418ac30cc1a4ea79161392e1031e39d89c1c2796062b504e7e257dbc9cd0a7fed955a3a450f4050ac1f53ee6dbe2071dbbf303dbb0ca9fe241603e227140938a41f34d1f77bbfa4b9e8425774e17c2dcad91cd9536132df9b9bcde29a3d44fe5804a09a4be6192e3b4a691bde32532bc7bdcccef2170c23cef1fa7f8bcf6a5b59e441f5bae4e957b0b44c8df22741f662cbe4a0ff7482553ea73dfb8440d5ba3a4c8d66dceeacbbaac471306936c5181c81e8d1d43031fe5b29ecf90c1813a5699bd7802a69efb499e95ba5abf768fb658e3de428a08789a508abfa9bdb90a77850d4b41bfd0efcfe91805022df8a3ade2f785a556c1f81ccb1df62abf1f93ad719f9853a0ea6df596b63c27655c530d7141ca702e9566102b41be3c501a9ca1645ba660d1523e63ac59a6f0f008687e0aa9f5c89bec8c2179dd5d07f712effa6629bf8fdb722ac033e88c865566aaaab7174dd7242f30f5bcd81cb23c6f52617ff1290845b0f8b4344b36101cdce0367f731bc551c41b34fc1c4366a79a8e7eb89b2df4977672e9b56aecb7ced4d4cd6ba5a7baaa14158741901a4ac1f96bf8180f137b5a2b5e04c12df6a3f2b54c15819639ddb887e696941ce98711f5b078a73623c4153685b05d7c9bfb10e711b6cb2c195602865508fca8f7441ff727a56ef6a5f85001af93933f25e8b0d2eb5951508f4e10772b85821c8daa746596287438e03e94f3a3556a5eda915bdea1a61aebe2ed6bc330b72d60f3e197a8c6a8c2e51dbf67742b9febc1031f9873fd442ee35b5a9ad32c43055d711010297fce5ee3a4a254ec0d191c50e7b9f0f9c5dc952242be250ee7d412f94f5f684f8842521cbd10e0c3126a07f4d088ead8c215578edf4095db28105d1dd4f72681ababa676b0319562023ab49304b30e78bc987d11790971a4b99fedb24900d229aeb160dbc42cfa2fa5332916cc63e4417b0c0f92594041d0602aca9ef6a1f5ae5afd8a32422a9793c3fb706670c0f59cc61a13f8c80e8ec7e659fdcb2303167877372b637252f5f7233a916938f1c8ef666a932d0c9bdef013d38d1f184ebdefcd074c559ccd9bc18e9992096c1fe5a324a396186d0ebcb5ae4182841ca9727b2313f4f208c2115bccbf7d2d5371d521c66d25a1358fad7d814ae5e1793cbe8443062b21fe5ae02ba55659bd36101fd0147247b0aa483bb15297bd1d75302872f386f9cac5bd8f9be1032fa05d234b17d857042d165eedb7eacf122259ad39adfc3b67d5a612a611477006c010d3e260d8c76400bffc4bf8119becd76dda779d26cf7c2be981aef7a045e60497486b12dd687012ee48dedc8ea35424f8e06caa38e741b2d6342eb4b429d85439a96e94afe22f49ea6a2dcc2b8e51f144e7a03dfc2ebc53b450aeb04bc5e298401e735016deaa8efd8bc12eae05ec2697169abc3849f7f7cd00b6532dc10fb8f2d103adda04e7ca6dd3206be0af2cac3a95e291b5e3fa84676acf0521c4649d98e7a513c2fbf0e38369d4ec89351969758d00223ba2cbe4cbb6802ef176eb2d798be2ea986ccdc387766518713ebb468f267cd9922e74fd410d52366381ab51dfe3419b22fe8450c12159565f731b2bd287df1d8130fdb91097cc85408aacf210174a8c295a1f7478933a101d7b400184d9b155d1506cfe827b76834f3cf7f6555085267427a515f6f38fad710032aeee4378eb4a35cbb6dde2d8995a3c9347f6b67bd1cd0e1f1d816ae19524a7fa1c58eebe46b48821c86af37b2d273588cb3b70b3f6fab794736220b72ffe1a9f3109010aced7f0771c71d7e6a980cddf6c6ca7b5fbc4c90cffe13c99e5c60129d74ba5e5eb7b16d49a3ab5a1732bac9f10d0820a4af3ed90a945e70f1e4603a1f56402d60567a1402a0cb635f5f07bd0a1b02a39494fca2659d848a24344c90e739d3f6584643ac4b43102299599e27a0654c6ca629f09d9f7e088d9ba89fb78383e851ad03a896620efc005bdec88a627047f46fcad51ae6ba6ce3decdd40e72e8ffb7e51b13530568f1852d4b3165cec087d347e3f4baf9d724355410740643cd8ca187090e72a3e58339642b433a23da7e71c521e9ee3768c0ea922d1a4f64a60197093a1465bc194395c6eb88882022be586df12f352dc3b59c1f50114a64170110f24aafbcbc5895229c286bd0323daa1fb8de3f205b8c849262360377b0750da7c8974ad823381a487a5e8792d88fd4002c4584203f37b085f15b6b67d85489b3f2cc70589f4c25afd7fa464091adbed24ec3a8c54739cbef432cb38b4a3a07ce1736babe7ee949a14b983279ebfbecee86d5177012273926de16666294a9fa6e9c82746a40b418c52b94d6af560ec0bd6b065ac11e748ad538c51e8e3608e41df92c47ec932105a42e8cad414e6aecd761b3ed28ca962372e9a5265eaceb5744c380bfd5c4b482969aec10e05374c3c5117a3927b520a5784733286477d5c68b724c168683d32245174fcc0d03d0e7fee0d5e94e5c98835df7fb8f20154cb45a8bdb16af2f2167081a041917bde3cbfd563357fd2f624fac625ae51203a4932a76ba2a904513c38819c592910041d238f83f1fc4ac126cec2d0da4dad1920573d965bcda542eba2dace0c319696fad4a3d35ab25612d5d85ae5068caed896ddf1a6a57fdead6cd613a02151167c1bf999bd374afdd17a4116cdf8b62e5ff4ec4c034867b67a08fdb4796230979ec8bbfaa7526b48e65d307ef07974329682abd5160c2c3592043f45c0957721e449424dfb71be3d39c6ce1bb6506ec46587431445b97663dbabc34fdf83cdbc36e5b51a205deae7b3fd437488474bebb44ddc91f916ef493e44b25a3df4db717ce63cea7ede984b3a49b611cc24b3b06b1a9cd59bec3deea31633ec42b049479e9201437dbb7073b7f44f7becb050197237ae679103085af36a6f8f567ebe47843229b085be1966134438394eb3c731b1ec38cf4523f99614888ecae127e278160ddfb6fead3c2c348296d35cf5c3fd108063961d14b7a9f0b8b7254b745ee23d6d49df505180ce04f594d27c3dea87783d5643839deb9b6e421229fc2ada8ddf988fb2e3728e536ae757bd1854e4d6cf693a5ede883d75756dc85d5d14fd82e5d7dab720d80dc34d9e0a1c97035af2ff4d366f969b543eef83014ad4f970c8387252776d4aa6269763d3786110f4e4ee3173ff139fd9fec3cae476caa0db67beb11e79339101852f7eda57de4359b3865c1895bc5b73bdd98b9a6ba8d2e46861dc6745db75c5e7fd37484476663267ad184ebafb99cb84190d4ab1d45736d2083a5464cbbe9b55e9d645c4913f26094dab3df5371f895a6b9a1dceb8f777ad9b140e5d6d342ad6dba2f8619798de9f4d5e0cced9b65448b7783b4cba7a500101b2bcb8289f1b72bbe48aa2f03701349579e4cd4726d455e5f0cbb344a768d7245c87fe63c6153171e5230f04e438cd0d44ec7bea37b289dd4af689bd476836eb5a97b68872c11ce5eae9313b692b749d074d5f2ab196ec87cee3588d22f7273ef31368fe6bc63a003e078ffe8d81302d092e02705b2787cbc4bba71b00beb10571239d2d79ce94a828a3b2b317e30aa593b8ea22fe0e619273a5ffd1a964dc281af1db7d647e30c6efe620c4d0f808eded12a1aa62f382c224cae716e492b09037a2ad56f3801843dcf76397806935ed5f66af6e4f7cf3451f51e7527bf036230f619820f07c540537fe0396efdd968e31d99ad88d54bb01ac6387ee342575caec5426432119eaf648258627e4fd35b6aa95ec4ee321e2e013285050d8da756e14a3de274e00e4fd569276b42871194e13c22c3a1b8c71c99bc7c9e12fb63ff5d077483441d94901ab6d5aa484e04a3fb487e303fb3c6fa38d697b090062da4968f8edd3c14b22ec8ddfbb5fbdf2d16fd50d98114cdae4583135ec3115854e50244d546a95fe76a54510204d9e50b5c8be7cd3ccd50dd9cfcf54a6bf34c8a4f44c9f0663869b4d141a2711d6eea2fe31b7fb1d9c607e54f0afed311d26d3e31b271589245ccab021564c1662748fb49107b2fce9b3d460a3192913b1b24d13affed86717df32a5b43fa9b859f9c0e0d2f7cafa1b98b802d05430d6e5a2df3d97190f27a2d67c37b51f637e2345dd8adbcf6b9f9ad4d2445fa9290120bd3068bbc0e3522f0b4f6b0c3ca5f128208db894d7bc72ce32c92d38603c1dc9cae99c033b7c6f2544544ba1df9597d0527874e556e6fb207946c544c193b14a92b1e157d10106ec4a33de5c4f5bfb84a247c5b69610c2f670f015691353450add31409fcc9aa0ece5932c26d620a2aadaa2b4efdd6350b9e1702490a0a762717210c0c37271c48cdc1c3ee5ba0c16acc030477874072cd2926dfba2aeb58fe71bf76aab0cabfa37f9771b834446def01d9a8839a323dea74b90a08586a554d49e8e4440e173ca52024ccbe6bcf782e0b8877f1bb1e0efa2d6811d2370a039a0c47c59683befbd46c04257f86a468ae25ba03304e865e62afae77a62b3cec7b3556aae0c60475a7bfb02c69f955c7f60cc8dacdd8edb4ba67e6abd2c9956857619ff4d1599a429597b3420c58760e9c1d4f5f28fec69a7802bb3f0686860fb4fd8e43d692e2eb349077f6e51867b4e6d3b810e014a38801fc96a1afe6916b2a759c086f2670c7fb1698bb72bdbd538ccc9d8071af06f61eb203744d5e49e31e7653c31968c6716fa6701033bce952e4646a2e5c42537cf4cf7c075d721200075c400443fe466fe8dca895a69a6e4b9437989b0e632b854aa17b0b5eb67c5a8bb3eb3cad4b832c1d059cac59dade9602b2b3371675f19776d49ad0cf900b4b01f9afdc83d50f2e62dde6d4bbf29cdab6624483031f483c1fd535f83ea3216a00ba2884862f4cff60b1f19f5b763b7225c2c71f32b391db8c3fd7021a4461301e61cf9512becf178d2e677ca6da3d04e750b56c43d7610e6251185ef1084d25a18d1fbec807f7ff4e9f92fd2c9313fb61a889eaa4ff283d38c5549f316337c330989342049f7a1f3ba20e815b4542de2b16df1ae49f69f05619361379f9c3814210c4cf56e9a81fcac254a9c1455c25ba480f9d613ca8b060a9178c391082f86c821ec73d7b1449727cfff6ed37c25a8598a5b2c96b6705ef118349dd6bd89106692bca36c83154c93e5ac93d7117f513a52c2b8b80276937cef3dcf54046d3b6325638c165a1aa45930fc140a5cf7dfada2d48162f5c42f15e03c61f524038e27a38a36bb7c7b26df7894f852a5b6d91c40398f7dd883ba23b1d9599f6774911ad3d8aa4432615b8e841f479933e4c7eef59aeaeff3daba0e2bbbc13c13e8cca47ff6ef9ac4f4c9ce1e4309c64fa8318b899f9ba28ef2b93d168ba0b37186c82e6d8b0da37a5bfa080ca847c1412aa05bc4efa97cf1f33e1a3af0ffecc9770c1e66400d499cbf76a217f7097251939cc66e331c676404d20c5e93e5cf63e320de32bdf6737147c30607d855c1c70bab344e12fc4a2e4dfc7b4c1b5a4486f18dd499a9d009421c6b9aa4f23596eab9570d2d35520c98f744cfca3167337bc9da6a63aca4f25765f6c8b6eeb0d903c627b9d3432597ea2a3271a17d12848b948f07576f7918f84beaf70473ce725a59a3a008e57ed26c0d4fc799a6651ffb7a35123f9a57626df6d18e572a9849379b542a94c364a565c9223a795568ec16a253f5e1d546b8fd8d32f777bb1546e2b4c1c03e84dff81f8533330b3122d42335711705c64f02f23896992ccd4e52a2cb73c8cfd1f7b3e06a0b1815e39bbd695a17e075187928922184dc3e084953c108f0ac1051b5bff1a031526012db91313aceb8f871cd13266d8428741610338594c2d2c6ad20029a4e2d4ab467eb36c3fc1d07557a51a9f5471ee5979cabd8379770a4bc8c4165229d8867d88ad29667ca8d3555da0fd349d5db7b6f45202c1e388388b9971ed0d3b4c9109622989765c9a5aac0390f7a683f4253c4b6791584a082e88476c12cf3bc78afb4d746230423edcf5e4158849baedcd35e9abe7daff7f52be6d0325fcbdc1eabfb53e2218e00ed0af698f1db2a4a2f640597f54be86465b9a74d7753a33d426c333b777849872ec452e6e5655d3ac56f80552867770f59fa8f969aeec3066c5a243a0a127ee1376638d4390c7ca7265a987d5eb8a42159566553a31a726024dd95f6a5d6743590567109f7b6ceb8d88e15b7a028b7c2ed35f32b98bef973f35d50174fac75acc2fec52e274d9c966574bfaaf59ef7199effffc783c2a06660421b46117cc76e54c5fbebcfb82e6855735dff6503ae4ff31c52cf6b0daf61f4f4bf2bf22eb3a2ce12dde7f9dfcc572ef2b95ef83d228b75f4b4ea59896e8e35db046dfaab8171b94f31cbacaabe8b7a5b996db7359bf6aaefedc0541d2513ad5fb1b431d979029be3c03ef1014b2bc015c6d7a9d363b81c76c4fa64b11b18e4e990aaa0a1e37eff3652e9cfccbd5f89880842d600c1f853ef0240912e99c661df67f54eeb060c6ab0af744ef35a515c1c265747a2fcded6c46f39e47ae744acabff3d43a02bd566b99e86765e6b26c139eabd03a25d942d5bd38e647e4dbb4db3202b88a69a007ab9e8c750f6370940471a1c12e92c3fe01ef6e71a221353cc61916624e79bb62f1855e1e3a1082062ae7f1e7d5eb10a7773a0ea0c4f8033b21c1c971f4a761f0b3ead7937482493aed6e1694be8331b7bc4984244ebdd84874b876682b672629893b83a55d4d48bad2808a58471fc9a7478a795cadf726dd1589b7a5415d8a85e803ec9442b6030e50abb7b31e052b0e8f7958ca41487171aaa207c9d4ef018e46b06d10c3710a9e0e5c492591d7e8561a92acedc7164aae9a9de13654902dbb2bdd9f8b6de2c1f2622e994040fc74066f62d047add514dc7bd9de8b5ee561850df7fe6490afbb93d27f3263aa07709804668d5844295283b4e24a3942534f84737c044cda2c6a0af5ea9f204b7d50a3501a1ea04877964cdc43ceb0bd6e3a31d2f64ba4b8ed5fb042dd5a0693c2868108fa1ea019445290587ad6821e9ac405d2e32efc9b670f3c2fe3dd87218b94e9658307e8451419e6cff3fc3de46d7f78c9bf38c5202dfb07338aa412631d0e251c5154e94a6b4ec8995b9a44ad5acf234e06f38eb5a69599e43e5838d70b44cc83c1a01397be83ae4afe5b26e7f7256dc646e9c9ea65816cc87b347afbdafb58326053f7bb823b106b78996512a734e0d8fb86072cef211846cdf35950107450bec9fb26345ae7976136ef8fbbff5ff4ec9142b70ba806f4e5a2ff446220523e7f4b000f80ad1b9bc2d5c7e75274194277a4ca59e52495bb2b96d2dca0af1789fa800d143efd39a616b1bd3c6489f33200a2677067f97fb39f15f872a9f136bbc6f56ce4addfe43ec37729df60c5605c2e26b49b027b0776a6aceab6dcbb225c5b07c9e17ba98dce5f82a850e5ab0319468e3c2a233ddf8ce8c81409b7518cd42d538eab270ea8fd5150b321519f3df1f05558be68c66a6ebc042efbd858b8cbb45535a21e53c8243f8dd4d13336839e9218a4c841893a84c6cd760d9e2548ab96895956e03d6ddb708687d118f57647c254bac82c1ac2776fa093afa76bbeec3a6c544a1b0ffc9b9ad746b1515088b60775e53ea6ef84af3d0a025252807e16267ad0ec0d6006ed24fc8be2aadc2d41b818beac407c03a495864cb64e0828a1d13139cd55c21f389562d1f553fcf6737aa9c1916734c1e03f81dd1be8672127c12c095e72aaa80672b6b36a0b3756d3c595787ea9ce41fa61a92e23c0320a007cc7ca2ff28e33ff3344aaa12f1fd0eb0f886dd4769d065bc258ca4e43dd45d47aa0e6b243e1456b5da9224b3e2af711deeefc236c25717cd81d3bfc01dd670c31240975e5484ed35850a4b8c6cd2bf0aa35bdfbd8fc35d5f952fdcd88b6d02036dd8cfb5527c2dfc9e7bc8a478b01f007f91dce7b85a60fccb68a33270e23b90249fba3220443d918bad4204ef8fba86ea5b60b92665482b8a45bbd8b27d42f19d5d01dca624467cb66862b2b7b8b8244c7f133dbf2b3d753b8fcdd23b8640ae42da4bbccd6470468574d0b8ba7340620dc69e7a6cf66660440e8026f1455c507add41d87b4be2766298331ede077ac995f8a978160ceb760e8a7ddebe02bf5eac308b3a9922c594b49d33ea0dbe8fe04cdddb40a3b6f53f01cb6b02890490604299d0ea10314028e34c79262edea72f9b3cddd9fd3cac428598f3983a94f8dfa3e1b8eec6c07cbb576badd929b0e93fe8df564b0ae6370703bbbdaab8fa1f6237d0ed50a517a1d477c2770ce67c7e979c8cef9fb4fcbe16e1fa703fed7e2c71662d1418947ed6fcad1b7dc64c8a8ec0200c50dce1c56bf8891eb460c068489498c2d84c7a3c43ba613c6a0f45214040db27200a7b8a643461ef331419ff9a543555def6419a1196f9eee4efb98abca134a408326993d152d3349263e08c4b38a5afd11dd0e06818def9936f8e0e2b6a954daf5a9328dbda46b77c55fd5782c9509857ca0f566fc978252196adf3b52465e8be8de191aa55223e97f359a8688d9fd71804e6434f302f3a336dfe8181560b3edcd03b15654bce928b44dac7250ef836bed33df12fd66cff74fa6902b888f117b22d89fe3442b47b015069fbe0d4c47bee3ffca63841953d8947d7bc81437e3be7abb39240c43bc0a120ef8ec1656c6f52510bab92fb14bc1d5c2ef8050d1a712452a11ab158cb2b12bb52c6f14b56da92105248648c4f44d63f58fe6b712d82112b3cddaf87cc82fd297cec980eec845685bac4d67ab09d5cfa3b16dcf41f37553d6a2561d7a68e09735347dd34953445b62969124f9d8e5895c1888020595699911438efd2c217dfa0c121e947b8b407ad887d3d9280e17216d19b7e7c41a7842d235f820086e526b8adc0e4cfbfca4572c04982ccc05c51875299ff9040f4bf1b7de242e85bbf87c4fe6df552113fa70bb7150784c5c89eef2ec82ae5bf03f1630c095612aa6eaacb9e70445a16dad4825729f442f7ec00574c712802249dc30bb61ce606d9bb36d57411fa6e366575df87cc728fbe9220c694db206fd88add1d65621c4d526bd4eb68983f17d9a631282e47a9f18280a544ee503bb54492e6a000241e6e7b492b13624c3adb6767b16736e2c0f2ab7f38da4216a15bcf7d879d6faa14f1be1ce4574a771445486e9ca386e5df1aa157818e787679e9e012671b9a3c275f82aba6bf085ff4dae4839be5069830f0ccd0276a78b8ebe8e11a2f2269227e3e2ebf1a52854c0324a47056349e43d8fc95b2d3762a2421df395e86bbc4a343192c20e718a78869aaeefc7498362d02c662c42cb97702405650a315ec93099b75e396b619575a4df42bee9e19b69fd4d79ccfdb3b459973d58eb483bfbe9ab0dcbbe92f5e7e09d78bc40f7bc006e176b6ac9b87047e32e0e55b58793c2d9faad51ce0f9ee02de31f61f27b4940f3b11ebf8f0d91d0815af0d1f569f6ac85fb1e96e45bdd1cd2180bda6fef09db7f5cdffea96798dcd8a09d642779c517824eb9e19de2210c51aef69c05bd8e4e756d179e9540e5cb3d916c72c8319f92334837f8574d1b2d410a381d407137088a746e15cf44092a449fd684542bd6bb2d89f111bce71bfe14dc78d4ccb4a4a803153c0ad3cb9388723e741f67b31ae0e5868de41b6ab40d31781158f6d2578b939219c43f51e5643b0fbdba5f81cca1dfc056d60f2273c94b7f9a205b54b04190ad80086e71af2c23562bdbc7f27c8c90c9e46e14b8cbb0b7559bb166d65f58aeb9f71ded95316ebfd436fa1d9faaff9cf5df22a8983c52098c6e92a5b1a54f3239e79b39471c9a64fc77abece3c87958e68f8a574b363bb6a6ab3a94913283bfbfe9f6de11d14db721565792595588491e7e0b9d3c59cc4316da1fbfdf8794cbbe76b7486fffd72af57b83ca8af2bb0200333cd7060792336f73b883f70500dab8066314bbe8f544eb2fc6e1d2f070083e3774b112d00c1c12e0ab9d923b46612f2170afa02cf679750b8764dc0f55c01b1379a7fd33b84193d95f491baad3f3a6407685975c794d15974be0008fcace492f82282fb3255884a64a231dd438069ffbcb432bd7ec446f5b8adfdaf24d872b0444be14dec1d547e002c7f337f12e8ebc0544b82fcdd3c4a0dab0e5e75c9f433a27d667071c2c600f0f8446568dbff4f9bb26c6d4ac8fc83fa20f9bdf865b1439b20d70dc92e26f9bc70471a06c4f553d3345f256f6ecec608748773b495f306b69cfdcbfd47bc90edfb52fb62b51421f244eb5373b6f93bbd108029b14200a77b59a05313f7cfee0a002bb08397a2de8049d79f5f87c70ca45aac86f852224c72c0884c1624a93a9be99be07250e8b503abecb03acb7e5e42bbd33390af9e1e24377c5f0bb8909d291d6a3335ca2ecc05d1f22f0c69675c219cbcd7813fbf4418274634fc9acd3f3b046053d6ebbc4b0d25b1c3dd49ca2bc863301bd4eccce6d6f9ac72f0b2a847590645e55c9dd95ba40ef015b653eff6bf7af7a7909c0c2ee71377c2f0e868dd0b8be094d0c7ce2450f479cd9e6f1de38f47d922bd39c842d2df6fcb0324572bdafbfa053951e4cd9c3f12929e859e1abf349e3464aa494a1fc35b36314ebb564dbe5be39f22607e0d58840cbd7db8c4d7a70d868cd7d46f572904aa824edd89ed3ccbd40b248d612da596e4033fb4095f0aefc03da8b4d8017833d0ff0c05ea40de1280833eb29b838f12c278b3da10e0c40c8a7f052fafa518ae50af717ba1d00af79112581657977fbe4d25c27102e23d2c8a5bd68f19cb713dd19b6386d7252944acbd5b02bbf2db642e1152c306ebdd176bd8031a40fcebaafbc9cb6fb4c5a4bf7b8e2dbeef1b0cca0d444c1645850c94d3ff74194cbfeebc7743927f5f3ae131a68cb7921c9a7bb990c799b3e737326d6bd712d3659de23aed119efb010c4a61d5bfe1c66af88ff862a11fe21389b768da68c392b11d2fed0439d92ec1c14619af3094a100bcaf5129dac8eaf104034ec8ba709c5bc73d9d65c52a5fc8e33c1fdce6b66c076e458a8e7b7b15aa2f7ee6dfd6023b89237411b8bc78d53dfa963c05e93070a697b86c388b20a9669391fac4c35fb464ba3d13a427add9498cbb38d242ebf206be70bfd0129eef4cb6a250228971521313fe69d10db0b3142313dbeaf8ce3d4e6bd54bfd19df2f85221bb29f311e5cbeb620dce87669abc54606edf613c098a7264fd768a6cab1385f62e6e3c150198f2c0c34916bc009857efc359d9cab4a3978462db8c447bc8ef3e1b49744eed2acfc293973f29d147b515d7c889a769c2be8221396783e99af68fee663bfe0d03daedeb33716e815d049918a5e1509d6a6ff4b52aacc9791c2462342ee3c0e586bcb956984dc8954abee0027c8164c40d14329b29bc73aeaf013b792e1c260b55ddab524034e681935c7131b6ea32721d53e24fa127110ec6059229ce35abe2d3d63a6ac5c736eac955c302df7c782c3d978a5f4b6d3ffe13b9fcb299d0b100a30eecfc936538154f435c1270c87456c0678126630f4f00fa86e1c00b7dd3e9260049a4339f78a5b7adb2ccf54ed586584c6d51927ddccbfd04d7cebd8d8300ef52c6ee10e6672074ed5dbee7800a3f67aea54d54494793adac453b0a805cec517efb36c5da81fa199ab344b1fc80e66106cf9612f23e1c5ef5b0a18d16b0101ecd4d2adcdc67b7082e6a1b0f24e82ff70d52b878f91eaab379b07ebf812af089f63316907c76dbe320d88e39899e507bfad510d0ce77e32d90bb3f1c803c1245624396bb3b3dcd1d1a853adbab121c7287ad5bc4f2c84a4fe3476f1e645209a39a0527a7893b2f3863f69d6009f1c87d1c61e5c0068e447cd9cb9b5fde0b2b5725ee55dfe6ed669795b3226116ac08fe21894b5c7a486646fcde203b3dd61bc26e658ddee4c307ed3831665961af32684f99f8e4ae752420b4f5ba4b04314f680c115c2f035a879bc407d5a36b89f95def0a7b13439302bcaa88a609d1ab3aca57682d4ab3226a15b19cfce9a4bab251a8514e42ba20865d462d9fe226b2527c08d09dac84a9240d99674896adbff1b5d404ef0d72bc2395004af48e63d54acf78f119eee86d49c5d3fd5534d7183c2d2aabd9de2db46ef6617730492982786720301e6c6ecd4fd109d58f4eb131f619e4acab2f1bb7ccf40228ffbcd8486fb5a71437bf8877bad1a376633edccbb3feca8dbf9afd14c2103ad6af5400a5955d7613e252b5caff3a29568d9fba13fa5e24d5a38c1279f2cda416cba933188da105c5aab07755916d040c4aebc9c93dba8c0ad38d2c55b39eb65fd116d02fcd32ee9ffd736d9625fcdbfe47ad9c49f2967893ec188b16a905ea185c376839b875891956f5d90b016c19a2e05f9214cd74731739b8bf5b2795c7d6c9957be4e40b7db843c27a32d83d45a0c17c5bc802c6f3fb68d84991d3c0d821a58b8bbfe44734f35063919bfed2c86e577e59c2471083b6e601ba392209837f8cb408191ddb3750e953efa509ef4a620ee00c921ef39ae02dcf71df86e25246cb99818f1509fd678b0dc4ec7dc52432744be4c5deb2b1fdcc9c10e396fded2dfe9688804e861f9dc21bb1e0cf06ee46141c92cc2b0051663ef207f3c68e9c8ba2457d9b4ec1e66a0ae84710722711136acc6713785f01bff16bd77e9a46e8e63320d14e7a301a62e20df50a0b983520e4f6024a3b114b718053ffe286a96ad44db334187562f40ec3e73c2bfffcb3051f03d4cf07d987116854f1ce10188acc3e771667b4ed3bc44d2e9cf4c3a7232675805f10531a5d2625e95dafcb26d134a1d6e8dabd013a39da2e87f2fb39fe1b94f611bca1562616258b83f61c56d6b4046d3bdff27177c5e7819db50b27bc3ad9df9d32770f8a67f3a6154f982af3b0d2a47ff5f9a08cff11a24ea977e2e62ac097420048c8e2921ce3720aa305c0b1891735ab3700e25bd50b0b5ed61df461f5c7a0b49af4d73b1dae3ab5d199b64cb43fed6e3f250042ae4654238a1b7f56c5eb59bde225d0b95270cfdfb8395cc8d07917bd768f7f7a09ced9b6287ddf9fdd7cad8ab2de579377d5b1f6ab772cdc7a7d452781a2a838742edc8515b79da388f64ca99170d46fea4781894fd59efdfe96e62ac4f1232479c10cfef65b51e874e297a8e2afff951630af05f9c72b93e9608b35c50d78b4873fbba22ecb74f51dbc1ef73ace01a9a83b9afb5dee6b34c76494e7166a016f38e5991d43aa7f4fdffd53131e6db3140cd2f5e7d09dd657150da3ad1d7955caeb7d05aec95ae96f5820d49ae2015c7ab0611059f667e5816ed627f66ebe0e4e2b4081f5246f4bca02c103ed4a2b96342f90aaa023df213a1168a2616eca636f84eabe7ee95a0ee66c487188ab3ed8e6f6dc05790d6611e7c91fa36cb2012db564d5ebba8c9dab5af1419e0b79cd9cf9a29db133078f2020d2659b76cd1495a6679cba2682ccc97e3e26f9d45a6a7ae29f604e7ca6dcd46be9f50b2e145763b8f9a9aa416049b1e6af730571b167cb3859ce3d947fb1b72f6c3862d12c4bf07387773c99a9a72d2ad1b05162137836716e31ff48d6b040f1c59a433e7984c45cbd9fc1adc36773a121596e33f50e1514493603d8505afa49a2a51c94808467daf88e09ec420d2de02af8ac55da8c1fa787350be171045b9d7fe36f91d5bd5384c4cc55d3b9fac46e6af8ac5638849e8184c957e2cd6edd63b9cfaca4eda20fc0aed546027fc2dfb24de3dea3938a1a58ee6d785aa9dd0842ece4645c3cd5054513234ae72807c8426044c3cc800f2b94009bfdc7bae154a185ac270647c8cc589e40d4f0270c26952e95ec3f62864aa987df48a8551e5b1610915551a2efdd91acb894cc117263312541c88acf71e02fc091f97b2cd684071a3e8fccb2ccb176caf4eac95bcd169cd0f2d92d3b64948d677e80ce86cc57fb1f0e26b60bf1d07e758047768a6ea93eae03be951ae0c058d8df6f0117425f687b8acacc22d1b32f48e54b6211e9a39d390eb96102490c08914f24b142eaf2e5cc2edc7d7beef1ff918e670a86c09e4efe7e7a0f663fc0132d38325d9e28cae99d74ec289bcbe5660bf61ade5d85e1ba6acd70fedb27951f094528748d8e3fea4bf77a7bf6db3608f4b6d75c0aac26760a962ecdc582f362b1d07784957dda7e7420f7e611bf3c4f084b3d121295c4f85a4313eaa9e453a4b374901c4a8a230c827bf4d560ca90ae931dbc8f09e555b7d66ec0d41cce4e5b8aac029a1145921b1382e1e8888fbbbe41c8d631551d413b1b73a61882a33beda3e15f8c8e12b03093b04f8ded9115e480b70a9788a0200875ec34367ff5b4d1abbf07621573f5c38f9ebe44046147b7dc72ca2019106a9682530bac695831adee8f8ac95c0beb7a63a89e896162c9beb186a5699ad0996bdd229cf8d32d4ae8f8ed6a10a62cf99bbc6860fc8928045fac5d2ce26283350ec2e5589a41f76909675325d69879b8cdf648b5ebf02390112980b119148ab5e5f015df0f4a490485965b2e99b7549177ade40df61ae7e579b57be27c3569a487c13e80c63084a5f4226014c877402c3f4fa4c9997dd78d0fdcb9219a3992797ad2b9fe6da95cd5cb87fc58e14ceee16b58158944ad84ff3a0bc30ee185b7bd259132a85429141c7223aa7b82cc9349a253a0bd960e82a48ecf23fae0ce2bd81e79130f18145ce29ea1d4ed1b6affdd7acef0e6fc35331584a3468616678162dc16e593381f99a0877f163e199c67054b366085e59618eaa204b53100e63ae5d4e714f5228f5d0ef317d8df1bf57b699a068a2af0c5c66c7d700a7c3ebebac99f664b75660809663808b75070fa9f62eddbd8469c28ae435d8190c80e75a3969210d3c4810e314eecce1c22e7106599cd02d559465352d7e8a5e2c51e9f67c563736842f206774177d481d6bcdb4076ae380bd39dca36c295499ac3dda099ee7a0a537137751db66fb882ec80bfc27207d7d665e0f1cc7bfa090374ca0d9c6a5c523fefcffec7364af699c4c1426e14605eef50ee6ea66c7d50c738724af1d160c7781f39f7f6498ffb310ffce7a5f65e599154e495472c95ad508f54ed2cbc4de6b67ff3f51d68b542d31ea2240c60484466c2820a1134e99b39f9f078cf737a4c55829c7abf0c317a1a814f8bf41ac4abfa2a3531a70ddf96ee08b3523c9f5c44efe7820d5dacaaed51c863940f5e49fcb60c7ca07b2fee2cd72c3c1e06a88a8cefef43017bd2883913646cb0b0d34eb314e9d6eb00039bc9afe4f940b0278b60d03a5e0b9c163fc9f9e5e9868af2496ba132c255c8317f09b2b3595ecb84b58d2b39419020d0583c6fbd5879f043d082e577dd854631fe499a27fabcab58bf5e6b6c8c13cca967fcdf5b47ff73306aa55c49670e1c7da015b0a35c0ef21bff412b549c1ad1f9c587d35026ab96408e2f60081d349d7ceafab0c5dbba12370bf1c5820029d35a1759e63c72f2ec1c919dbb346ebd4bd85574f50018329e325bdcc46546b56332c40f8270cb69b6fd3b8ca86eb9ecc9e875f107d2802cf8a6656ec28ede31f42c6205227d8e74b99ae258c207ad677a55a31b63bdb1fda40bcf242a5f4543f8af57d750e33aa8565e0cae92bfa7a1ff78833093421c2942cadf9986670a5ff3244c02a8225e790fbf30ea84c74720abf99cfd10d02d34377c3d3b41269bea763384f372bb786b5846f58932defa68023136cd571863b304886e95e52e7877f445b9364b3f06f3c28da12707673fecb4b8071de06b6e0a3c87da160cef3e8cefe34f47bbfd98a6d0ebea308cf096232606748b47499abe31f3064812d94c9deb84bdb42fa78c08f5fa27323deb7bafc8a51581f6437843a74279b8818d312f59b29ae8309d7f7ec420fea894e87ee72f0c509e77e9954eeefebac3e36b6ab5ccf55d60497fe18cae08c7001c581e6dcbb4bc3d369c60148ba03016b30487c5b7b57bc8e4af30c7261a16d54ebac8a82126beeaccec67590faf700d7ad8e6d39c7b8c7e8cac0b92cecd6494a6a10c3ab1eaef23a54a2960eda50134956926740dcff5edcc06d0940a9b46cabe7b577a0079b3845a4614e0a8095a18ad35b50b6e2b4eb30d400e3f5c1c23e3f0da48faaf4bb2695650b84cb144e1263cbf112e40060d5adad832e945c8828ce81e4f40f0d9425f140a9209abf03cd99e65d93125f8a841bf4fdd465a18f901fee7d8c177cb09e23dd4209bfa83d3cf7cda6bd8827ba60425077bcb0b95edffbfa78410c6697f7f1e3de2982f983c64428d4768d7f78d1e96af8cebdcc7e7e2a4ddcfa34f6cf9a24fb85672ad75ed3479ef0a86a8f4d3fdae988f2d30175d37490b19fd951e2ed84cc40ab016c55cbc9d8003a6880c012db762f103c80cd48a16bff1741a2585ad8ff16dd4de0f017927e0f14cd7a5ab2b5b9f6103e720d447885cf4cb40fb747ea3b10e6575bb71d6a37221ee1a4a1873059e4da22ffbe2fc28728257cc0891e802935ac6704334619ab4340ee271ffa13ff0257304e67704718138ae0de554663708d18c503ebfa668379623a2b5c712852576daf889071cfe197632791a4275bb92012b88167a21b67cd6c0ed7df5535fbeb05e9d4c299228abc989a00fd292facf78389a630a4fefe4546b253300f03a1c608245b835007ba8a128154e8b4a9f019518199cd6ad8f1ecd86ec8d7055aedf15ca9445efe48190ab724b4ed308f2e8e66e683c65a70e7c70b8a5e5ca1018773ebc0b8d80bab504370ca499505aa0d5fa8008ba4de9089e0c54d3c484ac216549bb0df7be0f9073d26bc3b679bc236930119daee5dfe7f3eef018b236763429c56c3e0cee3f9e501bf43b1ec5b9f50325877972c3f8370e972ec727362adb554033fe4597d75939625a5d3aaab0804459463ebe7ebe705ea34561ac2a26814848a6d12a51633b9043e2aca2bf4c6fad29f25fea5cbf2e5481f89aa978f5c0a32d395933917fdfe54f41cbef79fa2d9e46005f7f1466cb80b1acc4b7b91503d68c5ff8e9de6990a8d2dc1d69412614a80bf4bfe50c41c283c0c6625f5100e552d4af22c5aedcf86b7d3633b8cb7cef4b0a43e3d4cadcbdbe1dfa05f8d745cfb8a49b895f793691adbcd481567f5b0807bf727d96c6a4179057ac222cb2503d785ab97f0fc3f2d6d0003b88bab33ce95eaa04efd386146abadc51495388ccb902956d865f25be5282e5dfdc5e2dbf1dc0388fbcf39fba219e3a8dde15b0f7bce7b33c21e604e57f26dc35eec9354e1fcd0957677f6a01c6aae0b672dbc17dd3b852a9f40ce804c74c61d22284706669e59b0061ef8b97e4617d6f8a2e40db77d4e24b5f6c4598b56405392a08559486aa5c2f5ecc5ac8e +0xc51b6cbae292fa009679f7a0fde52d8eee0f40b6a2f333989a493097ead9ef6e9d95bd20dd54caec38002f428b828526ed5a92863b15524a134f6ed85219236b +100816 +0x095fae3bd3408b6360cb9972cef30a9e0943535c427c3b269d80327c2a6ee529170f0fc72471928556d1c628f0be11509f7cb8fdf5a7f45118184998bc0d13854e8362be72e7079cb0eeef2b6ac2b079125e620d9a3bb0b52b2c2e851986ee1c17854e29a7eb132ed5eabc84254410a0cab1fa94188196d83c828c4b2b249d75d8db7b0faac5dec52d8dd43a088f584d2f3d279b59c1cf44b5e409f3d82e4818fa4e927863bd8fe8209fe055faeab108a9c9922844438281fc184d830aeb198ee6a63b6dba1b4f2016e787dee59c435aa01fe246c14ed8157be60106a8a4365e03ab1df4972645f3772e72dcb0ee35ca7c05c0fab82bf98a9818cd819aa2c710b825e118e2279aebab3c48574328b0e1a544d44e11230c68bd7458fec82af52d6fdb2ede836675901ad9b2588692db2583a4c549b47c3a3551c44b841a87e73c8f96ad50622bff692dcd58e56173df207eec3cf38a7eaa7bbcce4d1c78ffc7c5801e067568be5ffe4adfe109bc15e35affe6e055797385c1655b07cdcadcba50a93be0557b66bed7dbd9f6c97fbe105a6c585a766aa1f290b632219ff864ea6674b5e3f9846d447d46813e2f92b78ea82f0b515f46511a6f161d429aeae07f8e4853b8686c191877f5a06242dd4884ccaec76e16f3cc24e6ede212c78897a1518dde07aa19b3634d4efd090a48b81a4e535359a55b57397da44a3b2dbbd37636ac1f77c875824c88bb62dc90bc517ab78579b913643d81bda11d62d469da29c50bdbb1c967d0fcafa29582db1f59c98fabff3669f8c4232d4d2332c57bf6e08613dd5db5d6e39b4a6d5fa4f35b19325c2fae79aefe36485610235007da6cc3022cec2295ac0550e18388eae156d9dba8784e2aea5ed917be53e767a26c87fcc0bfcfa870d07b43fd4cd8fbacfae1ecfaeea7f12600f6b9ef7c351d9f1b8eb048324f984e2a909d253017805c2d788edbf9807469ccd45571f5d61a05cec80a23ef349a37a28b86e2970c20fad9e7e8d201a35ebbaabd14ca249207dc6d7e2fd85c46553420b325bbe980848de57724676ed6552482f71e8473308c2ddff94aefe34c724c8c52a3388e3b541d396d6722a8e201ad3ccb9a26497a50ff0e7e81f1eb109888ceae27e1ef0537b3bd14dc8c178f0c5dc081b0390d36fc5ae158fc65db5870eece0fda3f72a6d55559b3a82c24a41b3df6618a44292d374640cde4d31deda28975bfe4d980e5d70ef591f68a35ebd953c6b34dcf0427aacc132761c31897d55ea9056c37828be5e379f7ec2fb42aeba919be246306ecfdf342ac9abe341db17753289ae2de60a6decd2db2a2072afc47d5cb35879743d7c4b6a5b84bd949e0db5c719761fe2cc306d97b716b98b3b233e422a8c31ff5e0455559e2f36fe10792aa288b3c48b7e36386295113cd8db5772c0ba69f06cbc1800812413d5eaed1a527959efc26c9affeba7e7921107fae1b97ce57a4b48a227db816fdb10f78e31bb9fff628ff29cfde5ec3121dc85245250cb2e25992fdaa434baf3dd7e807e8fc4ab0be483aa0ea0b5b4143905cce219f72006f4606eb02daab22293852228650c1ee1ce541f6a88e973d350136bbeb90b30128f4791bd24abebaeb5bb6936520060238867bf3b36efc020ff8bde14a01b6fa33ea5456c19b6ebea8c87a202e7301343bb3505eb0b371d7fafd5908e7f96336b8b0fd6477d6a1758b08089289529acb4df428014a66dd031e9972f76980a2fce0cfde0d9d034128b9a2c6b01dc4b91195d26ba2278e2acfa2537077799e5b93d2ce5d19db2835205d1e1e4493d1464c3cd4810aef333f83afb4bc50bf5c7644b735e44fd84f65a29d057714928129c56983d3014b5d04676c43bc4ae2c1db57b78dda783d7fb9f9a1de38eac3dd4ac44565c74fe31561c20288d92c8bd67314f95da75cb1c1196c9231cb8cceec9190f804c6bb5e623ede980b7bc061a224c2a62db2c3dd1c6d42988797c25ab7e773a9e8390e644d830157550bcc0d2dd7abe586657568989dc4da6604560f4432b3819786109fdd187467edef19367f7515dfee2739fb3d913a81597a0e979d5c99a79b1789b41ae57fef5b916f85a1e449bcef61d93e1432ecb4e561b497ca4b6d437c52414e0cd36917285896a29a0e8fa311791bd82466219c94210ebad1e9777fc0a10013bcc87c09dbab553472d92ebcdbd8c87275162261ed22e5a5bc1cfe81f16b8dab31adfeeafcf475e3312f7030d5e6a8b3102b382a78cd000393ce4c719617b1bf736b38e5139abf59e0f79b27870b8244fc8ba91fbe88297a5ce6a778380f34f78be8721fa905f83b8719f8c87ab01fcc4120bd6a46bc26b2214c58be5ebadefa800ef4c3459ceb342c7ccf3c353b48f4e8d0be3098d2c055e9e8a76a908076715ac405f770c95fead90a68ab4016c364f885f29c3d30bf08bda2dba457c9c60322f1eee3b1f41b0595aa0a3c24a758c37926a3d3bc40eb75a4623e9639fd9459df7ff8b19083e82e6944ff176858d1ba749b17009d690c44a6101665c084a91a9955688695df8e0d5bc18d659490f5f0efcc96496912e91dcb94ac3c74c7cdef585b898d4970d5497607fd4e31b68b0ef5a16ad6a7a54ba61cd64841dc2cc7802579a2eb339e858abfff97f9c6345cbb8b02dad0df89fa8aa0be329c801c61740797facbdcd2657a4091a28fdb7130a0bbd72d5f9a26be6f5f35b176e8006174079dda53ca723ebf00a66837f8d5ce648c08acaa5ee45ffe62210ef79d3e90272c738aab87e8d80107242f1aa6c800b0077d9fdab62ba4deb06c92462640b6367e0252fc9b9afbe95ef5405f6cb28c2c321e4e16276356b751fc828c0b6c9b4805307a6e8cf26f1e0cffe32fd3fb3b7f17d400873bf43d334ebb29f0d52c0606cae64928e456fb49192c5fb2620bd552be85fe55794621f8ae8fce9b0be7c117d40d08532a3069128e62fe0fa14b224c2d1a91a769c1caae7962b8b4350492252b8b0016e7e77f20728b066f1821ea166e7cffa594ce00feb81b3064dbed42d5d84a769aa2e3061ccd8ec0f950f6f4578991907981d38a9072a27ed3860999d1e230b506e38cc5ada75374d6d03309b884438e48b83a310bafdfea28bdc05ec151270483334a867c09c26a2d203ef1e169793f3dc269bd1777babc8c097a5b4c2e16aa3918850f31fac3e927c9817479401bed7d26caf65dd31b3b26f19f561b80e4f04f1ca52973833e3aec526259290f10de336cc3a385caeab01ffd9718d64f7b1eeec7129ceaab1ba6a3434b6a98e0425a851dbe8e37650f639eb5cb6924a3c27c3da034303f7a42737525a36d6eba98ab9bc0227d1aab729ccca2a110ad85a151652f74ad1af89be9897ed22b55a6fa189edd5739d6a4fba3d04b82d71afc00e78dfc38da222e0f5208d9406cf3aa50e8b6fdc58a145893bfd338d7841311c784de90e980002384f419bb55f8f0d182640aa7d4377cd0203afdf206e03fcbde718072f0675cdfe319e5ae7996f52079d4c363ec0ab5138b5a750079b347322ef69a2ab357dc6b150793391410aaa11b8008b975c96829bd6864ea96c5d24e9d5a54419c182bce01064ce58e2cb65b51af0232d73d3c1b9dabf139c7dd892814e7d73e1271ef108e6038384fb3c25604aad9557a2edaf0126d457473c514c77ce34ba97c2cd13aa65b7ebcbf6c759b1abab4aac664e9b006f4872301431a33bb97d80b440f7853304147f9462178317d25bbba24a61263608ae0cfdb204375bb4ba4ead1e38d631358ba764d9872201333180cfabdfd12087578ff682339946247dad18b6fb77339e900bb3a9a0c71c62ef029b17251c5e5fd763b1016a1989ad2a045da7d9f89893b405077efee2b7c5c6e97b28bb682e16c030b3bbf268a4a351ed026d3ecb0eb98a3be6a5fbf561f07b7e064d0d653e30846f851e86e715ab97ef9d73a47ed4746518c7db227fb9675f68b2e0b563fd41b6889ba572155b1a3e548557a584a858e714217afd020c9ee51217a02e14e9aeb9047dfd5e83e393e7d46095bc6ce8eb82b689f205fd0a0bcf029af7e1d891ec1e7b826296b35d9d16e7a59a53a81480ca9877fcb7f100326fc2b3447b2f748e49566f81d514179a3e06dae1f5b6c9cd210261e78d6eada739db0732549a1019ec1d9be77426b01fdfaa57193d29672518bcee4f10c650decfa3fd3e08a8d2f359397de00e8ba5a27e4ac08c74608b3d23f0639fdca8984d93c60bc3f1cc5bbf2342ac280e8366a69c70add8360c8459d57568563b85f28828a9b960ca8518e1dcc1ad0bfede71a0bcb455691c8e012faf94630ec7deedf2e0d79ca0dd5378ffe82ed72849dd6535417e7ddb8255701314e5fa260c13f9226ed81be0b4c81a5dc7f2d0f98a00afb8ed478d9bf1f36f9897d2844872e582ab3513cdbcdb437ba01eb610ec49f8bfbff297eb26f5f84e44bae2a7c286a438d1b6130891db65fb5b3ed12d9ce42623cef3f83cf908d49a9c00bebb30d1d08a5a647e731c1fa037d3badc7d77e3096a5a83d0e9aea518e302db9f552fcf0ad589e28e93982272afce15408709e122f1d714ca87a44515a61dde3d0bfbe8a3c90492fbc0b28e5dd19ec0a5e0cf48f368e9194d7d76738b52417af02641b95bc34f181ea0d7bde23bca6f64f134a50b2df513c261a1caca761224515a8dab6362cdc49fba943b704cd554165ed66fcabf8f96d1aa92955390047ce91f2c597b16052ad7546471b883542122803103c29c1d14e3ded56dd72e9ce72fcaca2e035b89dd5e24b50b0b8dab5921fbb12b835222008164e6de95b04ff58e03d3a39cb1c04eac922261e9ba5f5e9d27e3317d60330c22d353424fa3a21a9c40d55487974ce14b332910e397e4c3ec9b53a02154c47a50b08753359717e8c3184bbb849a8447a27e359289b4e00b98dc6f020f8e5aed93730f6c180925c2aae0a332f43a0ae45ad9d4513c8fb5a84a51b1d1a8ab6ad8539168074758604abc30786556e44549ccdc81e78c86fa2c4991a8997d0a78bd19a21daf44233be36f8e37cd4d27d7da810ccacfea49020a4f22dfb40d4a192e6e1b8ceeaef83d2f3d606dd5177317291fd12b74e63481c4a37bb3cbd9d8a08ec964522fe825d870be4d8717766497c7e1d00070f0d7edddef02c15b5334c360a422f9fd705a826a6aac200eba6aee197f6ff63eaab1aac89a5e74bd09fcd64696cde0d1e7f4ef7ebb12a51583f46e906127895874403d172df56a9b7e8f7da319cba347af936420380792d643afbdef0f9d1638de02394c325e0f61216b0df895a2bdb947a484f16a0185cb79eb40680317496a587613ca100edf98832e2bc992f99cc130a6c654b976da6fa7359abdb44c7f67642a51336f7e57bc24274ba8aa26ccda0b18acecaefe2d3d5c1d1132cba344aa918d75faa92314468514e1f843c0ca7e3788ad0bc2fdeaaef9106869919215ce512e0692559371c21645833ae83e122836654b449e0c9f4f1eadf4e4aebf8f2d337a679ced560cb95857a40310154052984d1c298890a7982d544b268b720d51a8f12d7cd8d14186dbb9c8c353ecb1a7cd9e741d2b20b014b591df91b0601cd63220cca4b09bccd510fa660e1c1af27256d7f7b1ee43354f47e526c8a5f03a156f97d9b70d2beb0e88780045d1269f5cb4882b6a5a5ea39244ccc53de4a8e1b9a1b4b93636f848adb2e12c0d2b95f4c1773d63b8e80987a83cc71f63e4f0a01d89060f84d687422d10945dc683efbf3b1f5655202faa5ddba052a9cd3f7df1cb761a2125546f8427322ff9f462aa4b440d61542299d7a2b71ffe08ec5c97534e095fb2ba49077b0698029539505c1556c1ed0552af07d2b4fc379153b4e3511fa34528961ce59355a2bac3e7c55bc9fdfd67dd12e7b17a7fd58df775d0c857aae478e75b5890599ef2c6ea824a4fc5a3e0604ff5cc7b06523c6f8fc548dce38a4d49937c847e5a4cf8a59dbb479e94e34b44d27dd5bb12f6816aeee4859791483e65a17c193601ea24d541e555deb4267ea3f91d8bf80cb744fe79360f6ecd3f482b95dc8f2dece127e46b82fd76a007fafc484767c8701f0798d35c5ee91409eb29e5007eec77dc52319f2696fce4e250cc34adf192d9b849d871a9fc9cf222a7df139a30e84f36347b4142cad7ff5010725293a1ed95fd7c2bd8a150d0d403fec9a60c7da7bf895efff669f1ae6bdbaabd06aaf14f51792f017cf4f44b5638605820d99db15540325e22feb3d696df8fdad546882e8895c2f7d3076f52e53a6d28f884198bace54f045b9379e71cf6507a4318af01a7ede88d7f4b2a9e0d8485baa18e89ad3303059104aacc667a9a7d09e4740e6f3bdc0020d642ae733ba14a7bc07b667c64041662b2b723cb1c4666081e0b0eddb10a9a607c807378fc0b1beab9bd289fdc72c217ea4b088b9e84bc03742028c3a3d417bae6870215cb4c8a8611d6588de8c9c92f2fc8e33e5dcfdf7a6b55f4c780d3189e88b8e2e025c006dc4d496ead35937c06d7d35c49f6a250db883efb4fd4821d89e7a89e5e9800216be0a8e3943f4a5b3d86dcdc34e586b0b53f2d94c31b6b871b97e88cf79ea76ab360574fc96268f731c157db9596f76f8614c469c7d1e9f5b1fddb3721b610232130f71bc33b79d091fbd6e2d2a77efdcc9d75d2d474a7e9ebadf335835ac51b53f6ead00846f767ccbadc8a728387dbf73dc4786f800fc4370ce30093194093ba16a4f50f016c3d4072cb2afbb7ac9aa47a22b2ff909c1502bf0d10c75e1d3cd214d8034df732b19ba8354ce4b047ba42d7332b1b12d76d0d28f3fe86b5b5672a75d6735b94f5754cefbd78b409f3ab60d9583938733c3c84df1a22879c93b321be42ddae772ee8d2ada636f0313aee7cf51485de5e54f42845e215109f529156528f9accfa499cab6681f01fa28803f5befa6983209c3455f20e4ed82a5c9246e72f432daad00155aef34c98ea558c699b7c7cbd568c6dac67e14834ca2c3661c0945f47054ca75feb5ca4f2754dd8572f1d37e38ca0108a1bfd99ccfb4bee45837167afa62a0f38a03071c2efbb883cce4f139c2f71bd7d82c5abf72a262a40b428c4ddea02995e62116b7096391c891d94a85dbb6bd4f530dc074a03658b01b73d1f486d30e65fb571da822540e5da71806e9ebd08f79faaa3244be36481072120df758c6f66bafed4578e096da49f8e94cee5a0e385cb64ad9b5356bd9caf66767dfbe408aaeeb2ab5aeaaf09b946a94441a913661006d36dd516d9db4e891b908321f087236985896d2ea2bfa47e76018f8f610b16e08b765a0ce9481712a52187be3e7550b9cbd0f6c070f9e695697ed0df266d1ad70139929c117e76ea878be3f71a5db36e1a14905696430029e7feee3eefe68c58b92a274acf08ee6f5742208330aadbe4d4e6b2478f2571ba960400150a11fbf437ea809f8e51fe1f88e6d5d90dd73abca0b9e529c81bcba5e840eef81179ea27f1dd2710ebf4268990dc7c7f0e8d4053f1f0a163dd806eaa5327e36ea288c7627b9493354459e81c03b57cdbbf179d593d3d6f8c3c0deb066b1b85df29c9244229835d73441dc37555e46f75ac10a23b06f2b809601ec16894ae5ec003a57135a02bde51579a38f40bfbbcd33202ef57d3b30371e63d723f7452d6b7ecb84ebb64109e65fb79c9369a6dfd8afd68d55e27e0ea4c3ae48df96eab763d317c0d41e9c426279c16f4ab95ada9f36aad04ac782ec50eea9e6534f80ac5c67e6b4d77a5a90dfcd5fc3bc1625d3aa31659fdc148df3c1051d5a860b5133dca20007fbb2c41ae7c25b40f2694df28206cfa114b1e84a8172d24b80b0a3756dec2d6249af220901c07c8ff39b1b61ae1fb07ff987db1b189b90624a27bf9a96ad346dc757bc84b62f8958c792d745b6e2d0e1947cad8b0cea1f47eb59edc9e04ddecf7f93d9b48c784b427738c9c923b9f76deb79a8c4e7c546a16b2d752ad134f331794cc2c10d018af60a7439127c0becce096712ee3096ce18d38a9ee6f3ca3b3abc68c0d2c1330d1c882d6e4b494078aaf32c343070c480552a5ab125ce787d9350d1190f2f769e5bfa4db19a13c063aab3b256b32eb722007884f60ee8a483e33d6d15a1df33035b67bb4a2760f275754fdfc09ff2d77cc1c6f0b5cacbb813d38b26feb059d005c5d75f811bbb4075b4d29db91b458c583e1b863680ff1af60b43e21a6326b76c4152219d9ea9112d0e41d38a4fad3e7c227f2ec0590a34f4326d8bb3e3cd4e0076e1e9e8d7b4ce632ca6697c64b455b113fad09d7d766cd4f00f080f58d6ff890d8b9fa8ef63dde0b50846d582e239bfb995541313cb2c60ef334176e9ca31cead592b260e3ea76c527054ddd0be526ebe57a26b448fdb5ed4e01e32be2f4b98ff5175aa5ace94ceabe57ade77d00986c749a2ed374ce0974a1f878a0090b7afab7e667cfe9a0dd0676fa01e9fa0c4ce7f713de01589a5d3f7f764c5d772dcdb58e5e4e3202b78382e16aee66eb7ec0f8bd9598e05cf91d983709d2c6a5f22e4ae90d829e9073ecfaae38d7e0f9cea119689df3d30a50c7397921a07e2def19157862b9480b8c85d81dd232ea8d7249c4687b836bd937e67db66c49e6678b1abf8cfc36d0dc67daa5b0d593e62f1047843ddcac1d5214f7ef6f381381fb3cafa3c748afbbab7c47de17918f56471f16c3693ff25a0d8e88091413a1e351aa546c87c6788ad1507a0ba2b469dd7df5342c7af3eac453faf355359d899cf32a85747ef415a0e67add98f2bcc7ce2c491c09d3b6e9ceddf0d65e54241ef15853cf55fd502ba06361ef1087f93daaea615af613e793ebf3e6bd7ee045f68309acae7b83791f0bd09c1b0cc318201621046d6bac146dae4e62f5417a8184e48f9b8f6fb1cd6445a6800dd8449803827878cff51cbbdb8835fc3a4083556e7842b6fead08db9fe05db4242d7cd77c625954ff0cd64c61fc52f8d8f68b3007d0db7588bde912265e8ebf0a56ec74ef483c1f772d8944959d2e0f7dddf2bfe560b25daa0ce30f9c2281f70cff03eed0a6a93ec4d17642eacd1fa675517a438baa5fe5cf34772265df0002b88063b3c500194974934db5d61ea0347c0b52695f303c8484af260917e6615899758c5220d714b5e2ed702bfbf4785fee664b900484e0e056e7701236db2e6f3c68de48a8be141aac3a7df3a100d07f48fca665e00ae55fb277d5ec271fdfbcfdb4ea059107afce4d14d7db79a671291838f3498644a27923cac7d57d46fdd869f420278e56306722070e11fa77b2d3d895c2c96bc4b0b3277ae68cbdc2f1381da1211cf52c5e7be78b915587d71e0606bd9544050d88a439e282704d26625275465d6469ec8252ea1d0204c6472b362efadb67e671a2b2d7ac5c0ecfe3b9cdfd4e457c613934a2c625c0ae1a6a62fabde805a394a397658d32a3d6aa7d7fe1324379e35f74fde1f8506db018a34dba3fffc4657425cf32d7102a5651661d62a0a05b37d9323676fd0759c9357443fb31cc784c295ab2b121bf301c79402a98c4ff69c842f386f830c51557f5600e441fb891c608b4fa5709ba5587767e201a0bbb3633413b67dc501440cadcf8e51b765eb141b6e70e9b0b7c2b25dd72865d015e4107386c41a9c76f4cb0509160e7b229476da8435803838ef18612efd5e842731a92bd18acc703409996e4ec1a4f7fa2e4a8517c7f172e5d6906bb2887322b74038433d311eaa042c7fd3e4b69a91b55e96036d4ec4c4881f2563adf22c138ebcc4a310e195b0ac058319141e78b31ace643ecef18298e772dc31656211bf744b563392c1bbebf43bb0292621c7c4f326bb1d84d8b255cc75bfbd2301ab8e3095f5db0dfa17c3a6770beb62e60e2c060da488d62cdc63fdd3d5ef2ef681e98c43a983c7b331a188609e471096d5521c2c25670b15882a423226b0d06a1b364efd7a13091592eb649f70267758a5a0fc2b49a26cba3f12653bbbe64f8502de3f6a71731b48c10b00db896ee055047d70b11522414488832c959b7bf46ebd4a2733958b4573466724bdf20993b57d513e6693cdd2daece561e8ce55074ed4e1ce00ef43cfbfaa699aecb2ddd89f95852ff4ca8c66a5f2a0cade5d5ed04cd00afb788584005374772911d1d4f73bd67f0b00c24846cd221c301d4f7c9691382f7843613422582cfb98d458d537b2c7a89a3584e7bb7904c15a4dac99a34594b70b0a8b3d7bf55b5cb0dc4ec7e22cf068a33817530bd121f812177d9c3d8e6d0a7d7509855453880239d2bb943ed0da28f0b483727efe00271e23c96dad974990952be5f6f4993b55fb5da72394c70c4e474fd12e5e2829b8471898f43b86b3b11dd52777a5f0fcbdbd261b5c2b390e4471b1086df1762511559ef2192e8430d5db1ad5efad8054a249d51e274d4d69703683301981117b9c105fe0c4d0b84a6499a3f9485570ca6c6511b96c402ba43c5d6d52195421b3bf400069dd674b88c61d179a69e5e9e783da82f3134dfc470fb0167455b2cd56e4ac2c964c3c6472632f1fc13aa512314f6fd1d404bce8db50f527a1b5e53deb721d896ef9972c91a3996375a3dc143239eea66428d516e769f547de21349afad15bbff9ccbfcb6cef228abe8cd41672a71da8ac65e0aff3c1781f3581e60c0b682e773faefe688cad913da4ddd3417802c680b3a424da87c04657adbd44baa7a15e5949859a2b7747af23307e22bcccb3afd681ceeac02cce26964ebd96cd55e3b20c1e3bdc3db72344e5695709b0f620a1511fc97a886953e184216a246c9e97f339c6b60cc6d4ab182a5851cf457eb36399947f1c5bc7b73fca2daa35c00923e9874ae072ed5445f29b0352bea2edd3bf57e8d61861cd6208107b6612f11ef05c9fb19f56dbc15b9bdf74431cf0cbe77b3324b8b5c103bd04fd118704266566142803ddffb8a254dc9fb30d32569e5960d44f0c3ca4f12efb3af9f3518767edd8cb4881b6ab80987b83c69648fdf09036e371baf531201eb46f3b94413dabee72308973c3dce28f4032b7c8a60d48f4c50793a9289117f6f843dd501e70b9cfa8fece9b6e7450a1f5558e8a93ad2fedd4e9bbc31deb5e1c8f5ee9112e471afa43dd1de1ff9b5236609351c359052ce32d30f4ef1c687efa416966bebbeb55d50b77802dbd7871b64b950a5d3e3ec73e968543156c30fef6d60c5d3f0b84f2cac771fe67f13434897c03c03f8b808866d890b21e566a667a15eed57c66397a4041769f77e3f62417bb847c5187f2f8c4bbf848f0223f3fedc7b8d65c1632749f3f2c6c45dbe7c7c8d2c0457b7cbd9ebe06660d7418d60fb7b41169ca6298684e8a3b6cb9212fa805876023a5b00802bd83810a927f586140a4a294ab9193deb7ea4ca8bcfcf54c34a40c1eb76cfcad2af8f24633a1ecbaef5f1361e8ec4a5f4126072634b6613dbfef6b3f99f8c1266b2e60c93dc4bba42eac0bd869bbe672540813f00b959d020c31268d349c7ef5eaed749c9a31eca66555320016468ea05856190e27e2ce238531e4106ea05ca30dfcd6c63030a849fa2031e1d7d46b70b5d9c08672e41f2890b94ed1304b82b73e252d4fe908171356d6b08395aea56ad459b162d2e5b69a978f0cd763e718b9e42e2140ab03608ee13f56ef361d63161b9e93aa312bbb01017cc52bedba483266e05ca06067ac420322cc2ca467cdfdf36f0f6476ff57e3364821d3b80d38a92e038377ef7d22b62548ba42c5d40ca6c595cd9a89a9b1ca9ebbcad9aa2710a6a35f41ce408deb72ad7ac63a83ae4899f7d974535271f33da19d6544ad52f9b12dbb3bac3bdf2efe057e9b1bc53ba85ff301ac98b89f42c5a7b59d1da8d41b5334e11c19c8ba14e3931cdfed72c5557f1fd51f70a67ac9e918cc176b82f69d1320978a1dcf68c5a8c11e3bb874927781e51f73e3014bad315caa7e362500a77a5aa62dc1382f68d5f64a5685b2ea35eeaca550f9b25a1925db177887783a630f48d6af0ceb5825f2996ad95b1417b74ddb305fbba1ef334efddbad6563ebf75a53eeb507d02a258814446b4382602626dc884730b65223332bbdc7d8ce5d8be3e3b8eab8d0ef901ecea1b544e40caa021675b160daca125ccb876be8a1d6483361faf329d1ed8e3d2f485e6622646a67f1bf4554f3a1285247ff439ec49f55d1337d7b62bc6e456c9f030fb125b08fe0d52daa13ea1d8c9c05eef7012000db45c30928697ab8e0338698702ed33840f22a8989a5a88767c26f1b2f199b4002187866a248f213851a4cd028e41543a627589989131427e04deb5092ef1ea9f1d1b95b92070bc95daa5973e0dcd41ae806c7265364154420c4e353c88a9281d1f8f0b1a0acaf218f6a16493f1cf6063017e0f78ea095274eafbeed7af3dd11c91584307341c56243e3e919eeae644da3e309d6e3d07b199397e4e65030e9a102b1dda0b4cd34d5a39b3bad949907376bf1ab89fafbaf601702bd06f14b9c79a45363c90a59e6c2d41c75cbdae6c60eb0c92fd97a291844017bb115064be0e0d6847e731eecc27101eefd3c689c881899f4fb8e0c62a00f798728da36399c20c0cb9665988eb02950973dc8e5c3379f4ff9797057af2e07a9b08a1e2a1cb87f8bb013681f479833e9a19b36fa64bae9fa6010460417ab76b77d3fa989fc1b465fbb5d445b2062d7f59481504e86f93ec0b227dabaa3fda2cb76af43fce2afbc6375dcc1f520f75d9cf656dc8a31dce8cc7628f2225a0dd40e2442b42bd45b2bc065f8a695503d0d055182a3556d4b2e44347a57e344c353a70e61c3bddd07d99d141abde2b61d2f592c6d6d58432e57517585d1a6690769bfbd723a5b029b0f2308a8cc855c7f0abf107f023aba6dac1abfb12813d2c25c7eb7dfdfac4d00157acb0c9c254a4ce760842029a4dbf075c89d6623d186da750b860e7b59c51c33c9e5acf56b876a0e6410b8ac3ead9ffa82940c8b898d39fc8fb169d50972d8b138dcf29fff1bc3c7f23caf51af386382712e0b28e2f0c53931c156b7655d1dd6f13a4561880e3e5a32916de1a0842256bcf2cbc285b668731a3d3fe7148dd1ec19860c04af68c20e4d965a23b89ac6bf8d68b52119e709f471ad8b2ebf0add39db49b1511b32392d6bd4dee1a081350309192f0c478c90025f9aa2540edd2a065d0a9b0d74748afdb3d162e1ff41596a5a8ca24db7abe4e60c8bec21a80d9f9ac751320364349dc74e174cec7ee3183ea84977aa104fefe89f08d15d36a2233f42a7defa917c5ad2642e06cac56d5cc51ad914ecfb7d984f4199b9cf5fa5a03bf69207b9a353a9681c9cf6437bea0c49d9c3e3db1f3fc76519c70c40cc1dfdd70a9c150943c272cf9eeb861f485f10100c8f4a3e259c6470501932782512225ba64d70b219cf9d5013a21d25d6d65062dcc6b3deb49d58b90d18933f118df70ff42c807ccc851233a34a221eca56b38971ef858475488988794a975d3894633a19c1ae2f05e9b9c0756affd3cfe823ccf29228f60fa7e025bc39a79943325126409460926b057a3fb28a1b098b938872883804fd2bc245d7fd6d29bcda6ca6198f2eff6ea7e03ef78133de8ba65fc8c45a688160719fa1e7646d878ea44c4b5c2e16f48b6082eb310bebb020c954cc0a91aa07e98848da9d1ac127d74ad9283746d4a6b13ff46b35773df98f9c7b7c8c5486fe5e19c5da4147f1735f731b25f1fff17ca8eb3da44beeae21a1c6dbc091cc85ce88cb1c871b1285d1eec81b2bd480f4e0370d6580bb98c8901ef07c8163202edf2f4757cb73a406ab4bf1e02026f26539284d75e6cc9c12afcec167a5487909991b357e8d9025fc683f9572ee307ccdee415274bdc72314e478e2a31689ff9f65133b97b5bbbced70925cda7b3a47b2694bc56aeff4545798e6fa38ba6dd977a9e004ac2a3c91632b0cf01fb18c7b9f110d4d5f639b586234deb22f7b3e301ace4a36c4d65bcde50174f649766d3f194e51935c010456bd1e29b28f40422b0e3d197ae8a06098fc5a941961b427bbaa88dd3f68b17777f1c08fa160f0c3f3dd5d15771f7092192e9e32ff6e520018d9277af88c5b3be38581d727ab7507af0e9506d6712e3a79063517507838417e2e93f066cfe799c101c8cbed77b657882a4fb33ee6c2a0df09870bb5884e311432350732393dd939eeff319bcc9bfaa6b8f2e55887150c74c1fcd6d5a47c1a036c738704d2464375d38dd2d9b20c3a3040e664cc5b0dc660b5fd3f5ad7aa427265b63783a3e81e9a38da764d32f15d4f4b92f8416a9315ca6df00fe926c0f28aa367e058b30cb4d3a54ee4a25332ac2a6060695fbd9043da723f0e2d9ba67273b0ec4a2b0a9b4b46a351e67e1eb86fea07b77ecf5bea96ba4b5004cb3d440a5414af3da3b17b2c1bb94b428a9969eeb6c8ff00394c8b578f808db96e1482025555168168af969f7b70a4c16dce2e70b72ca1b8449959cd849a5df5bc2949a1a0fd8bdd230cd2eb8e4fc42bcfc5f03f14ba036b99493e42be20277f5d837f315a94751b7cd1195a7bde13485a8595a1f6fb8ee4e06421fc689a5520fa2a0ef8aea03c011a0552326ba5fae0b41606df8575aaeac0f3e944a8904ea03b27dc3fc2ab4758a6b065bc852ddfba85802c40e8b2c044e1fd8062a68b7ac7c781d34dbe3c00e7c7da3940f2fd2b9f76cbee0e483a36bbec8acd9e8c13415c4740da6ccbdcce78268cb806d99d47572e00338fcc93761789a3b8407fae0b29626dd8e2111119d16acec955639699aa5627e50d9d47e6205f4e298fa9e640f4c10fb7f8b7664abb3ca65477b76f8b609646ebcee2def09d179508d4324248860b2e5ef6e560c7fe441e42b2ffb0844095672d1bc4defb5858803d58424a8ba7e9d2b524c589f962293d794f60e2ec13fc91933b6bd16e17cb16b160ff87721e0304a4c97c6848af940be295048c2aa172cd0578fe3eb3a3185f4a37948063b500cb132f35851dac2c9165ce1336a8b2a0226b18a6ae31c4e663f12427bdc7328930ea9c1669de229ad6eb40b468cd0e2e98ad648aa85041dd2b8f6ee1c7075e453a1159479bf5da85e25a3510ab017cc337b3a4d3b478e4a6be0a5ee9258901ddf170aef1a3c89996be9cf34f86acc607086520a85a1173e9244c3c685fb7e3f85df0e23c0ac12a757197c2988236b2a412ac1f322383b74d663b5085fef8cb3f87773f4f574654c90335ec132508093f5d6eeb989637787b8bc1e16989b3835976ee0b5312c1de3a7d5cb8eafa889283f295ca033c937e1b9bc5383b8852d1f0323e8f6fc4999172e6f66d42861f1715d807059b9b0090d49f2e9e24843c7ea9c44d13ccf436351646ea544653355ea017aee3873de7784e9de6594c04d9522e3305df912a0092d1a620b51be83331cab870aef0aaaefc32a0d4b1da90911427874d3ae7ee5f6f480d80d8eccd7f563bc237acfd68bfe528ade0f0f6b0cc8e3bc90c6ef6c9bb952683f204df8b83959c3dea27d70180fad7cef25ccaedf28613002cc1e5427ccd11105e821ca9a6b895327165a5fd5b05e80af23f7bce6bc55734947cdde20addb1bdac9bccaf4f85cda8b4af90e2b7cc026ac8df34dc9f13ae6d2ce6052fcd8db091c4941725e8c6eda79a4cc03afb19cef45d851b9df737c0b4dc4986b32ea7b3958eb82494d8419c370d865c8c91b2f4b29778589bd9fb36108ceb87f693f165cff34e1c8487bf8361f5a38d61e05f1bac5f02145eae25b88a2416317f65356b49d99d267b5d074a2c38ec7a4050eaebe99e69776cdf7eed298c10acd60d39700b2aee6b03c2e398a1bfa94cb149190e713af6a84fd2ce7ef5ad211f83f1c61a1bcc8913a31e1915c672222a3c33b6294c1df1d08ff1dd12f66d93b20e7ba31183a9b645e4d9726aa5399e3d6a7687e7832da216b2a3725235b5ac8f00129afe4ba7bd294c5bb63f46fd67acc27a55ed1c5450a3424f57e6b96eb6dbe11d718979b0e5e8650cad3bafa4c3a0cda8e7e62278459ec75f52758a7ef7c13706f15917ab78aab7551e07ea18fb41116607789a83c730c73a2ca7b1cfb8678c34e2172c7fbc96c89cd34bff3f56b6181d7b4b8e5c1f81cc48ad26354740f5670f0c6ac116fad5234a92aef4031e286a360c0805eb95b85df19c971ed0d99451ff36fbdd57798e4dc824d8d34b99be8d178257081870fe039dc2a57551c96cd16c2a72882a83eacf7d5172a4fe11a10b2aa5df9ecbfa7a44b4e8f641b159a46fbeae76ca775e1132d0e0246d06ccf86cd63d49cfec7955ab9ed4328adad164b35d8bafac26532afe2b9b95384a13ec3682113ca36336b6bdc34f0258b379d626b289c63520aa5eb9f5486e0cb22da5f398ea61231879c6048c200eb424981f4f236f636e4babd4ed95b056f226644a2a7f906056f48aac075f11fda515786ab619072d5d909eb521759bf6f08efe04649fcbe045ddb0914ea5e877346e5fdde4fd17cd0cd8ca28defcd1f611d244fa28606389f6bc349d62c76e26681796a0603568ea83097856ab9219fd5adb7e55fe2a1f05737a5ef7ca2b6baf49f965dcb22bc22dc90cf066109f3cb3d58ff43c6e65c8f9c4fd76c80e3ba7bddffa13b96345ec3ee5ca7a81958b03c189d7edd801792610ef2fc437b75ee9f63303ea5efaedb0c4e22a5ecfc3bf33cf7e9cb3503ece01f0fef7906d4cfbfa024cfd30f4ff8ad468c513e37721a19784bdc48ccdaecc2141f83c2192557ca38a32ce2ea2fb8321d1986f52a2389af6894d38c177d7dc4eace6e8c0cd5a48aa36ee602c9175425fa76325f3778e13178536e1997543644fd8cfe2b546e4c7d7ad879972e8f52e56942c1d0e1fad72c32181a65ef07aceed6fbb1248267a61f498056347d003afcd3efd3febc11d20c205356e560f0280f016b360c195a57ec79e71a5f571282d8e4ddd73d2866486dcd85a23cbfb65e42077bdb467baec861a68d247c2f2eb105f6ad5a10a960c0bd943f9ac03db2b60443ae4f683bed7e1b39d3030f77cd5c1093debb1dc189d1680ed18f147d8da5e26072d0e5dc8eef75ae6934adb366da6546d298b90349d119a7fc2dade1afc458c84a2e43d01ba31d9eb047cb8493b2807a397176e149663efa0fc4f12c8187d3f5c4a616b91c2f5f7538aaed4dcc7afec863c3ebddd0f7447f9d038290bb76e07352d6b2e9f8eac7bc72ec879189aa4c9bf20e6c7ba91ac6a31457d6c0a6080abb854ebd053a7bf2eeef7b3ed253b6d67f54bf8d2d1a37320f1630623ee9b1bf58cc6ca97d69494d871ed55782a32748ed1c65d274acd3130e133bb96def0a7ab598beecc50dd9541f71897644f082005fa98fb0e4e974e63a8bc850c03e88c96c9ac41b6e80b2930298161f7be44d89619c9bcce058a3281ef074acf840a327e8230aa9fc7a5b76eaf2f9c7b9c6e0607d66287b1962d45525d1af4258adf012b2c1f10cd1533a9c4302a2e36140e1121d86943fd2908f09d9bff69573dee626470825d89f93e66f7547b01714bad61acc8e9dafbe8a4992c50be93acc4bfbbf2f660781b9b4d56d2c429fc736cd25e704de733f3f988aac5255d586e48da759e65c149cb24e8e11c283c06869d067035106d362d843c8931c2e6a2e3f0c8f92e65adb8e1bc976f9c27bd09f006d0ffc2b982cbf0b249a038ce605855e510ae6aa02dada48ae3681b6ab3ecfad1b873e0ef2fda86aa3655a1f2d4620a4e3afb1cbb48105db7533461992697ec234634575a7b4b35958b1236d549a84b54ce4a0a6107c9556a703b365b1ef10e2703aaefa36e06469bd13ebd +0x2ab21ec8d42db385b3ee428eaf71aa18a9c7e2a66a462125ed710500e71049bc448d6dad35b66edaec37ff39997a052e98dd6ae78c141fcd4a23f4469a57fab0 +101608 +0xcd36720371f56dace87c59a7fa7eec63aa03de4517bcf09ea4932dda578770fa7fb726449abc5538753cdec795bcffc0d6b61b8b52ecbe1984fbdc1bae33597277a6cee7d97f8b1d3a96d8c3d941810e6c6c916708ec5d614010c4ed9179b6d1fe2cf356f7e615417fb0d1058eb27a37b44cc6420063d55c20f96fb9c9018efe5a711cf8bc98fd8e8cb250f47cbaf222f67f448503fa2ff46cdf65e51f72e9e1d39cd135ef3e4beba8c5def86afff2b77a2d9396d95972106be92cdb5875cf62b3d69b755a7f053f1d110279222981de877c39df4a27a69766404e013fb1496940460020c304357431bd44df6ae1a87f6797c0c61e0cd373a50b53c19bcf5edec4158a9ef375e2712df12c930bcf6e8260a4b0b51cb2028b7073c182337617a9856ac158b279151e59d743fbcd9adbcfbbcc8f130dbe3bc70fa022abd04f7ab2cc6e2cb4c7b8d563fc94108077eaf74fc036e748b9db840fc9b9fda63a0192e2e048531bfcdb2a285f531b8ad369cbe8b60b3fbce8afe74be8e7dbda3935641f0b21bef6178a1c55cb3aed82a7bd5e83e77220d762e26b63b25143af9593fa529321f6abe16cb4d286710dcebc8eb80999941101ee1d183f7020bd8d15c25b64c16f82a4222af987d82103d8da85e26015989aa25608f7c8697bd1dc836b8f3bdd34ea47a26bf45d0b725807c849e372a3a74322604a0fe4e78b0804a5359fc12f97b7fe28d8ab3a668b93c25083c3258ae995e9d58b697c3077e96d43c992dcfec170307e19280830953c7338db8b631485175f7c750b798d68fd8027ce707694da9d446ad573adb2b7dc8149f8421387a452ec1faeffc14686caa318ed41763709c6a4b5b49213341afa544b83f01d2c6dccf984de4d3ea3f8da3fddce0ec4307674b727608f20fde51e5406239d684b090fec74aefbd6ece7b5bd3f18de48c74a2ee5877e71be5741d0e9428152de2c9fa32fb7c51373687ae1830674baea43ad7d969fb941d48856997bc645176616580e2815cd9cfc60dae8fbfa89a992eec6e83235b60649d94b00725b16f2e8535cda41566b9f591c2e528ce200b3280ebef7211220c80792498e36c99ced4d29d28ee141492372e49fa59d8880e094ecbc32ccfe9d90f5fb77c92fd8800f7be1e2b36fa00f302f00556b98b2b239bed0e92299c0d565fb5cfe3bc54f6a605bc2b6d0553965ce78b7772be4293dc58e016d4ef122724f01fc056c61f801e9d516736dfad4f10635532e6ee9b5cb8dedc96f3e3dea1956ef24b5e36999eeb1d2234413c63b5edf4e1aa1bb0f1d0197c16e177be3e17483ad1c362847fbd9c038334f4821355262ab55f99abe2b89edf4398e8c4dcf2bdd242cafc361e6681ff18cbc9773897596344b5d935ea50b976c72fcf9e17ce66c3a9c483d212246d5e376b48524007183d246f62f57542e9b1361894b09af4c39d8b32b1cee7619eaf83b5f9c9c62eb316b8cebf511009b03cf4e5b092c32054be7ba7deb2fab8a671622e46344778ea9e866656ef571fad78a809dbbb1cbbaab4df9692f4e89405327726b628206fff2321c8c20696ef21d2b4075ea0243135ff4b81472b2d8e4b612741e22bfd9e9142ff68795d6c12bdf9ad60b1d8661b771c23fa93bc3601d99bf70232a64b6f218c93c7f55a5304e24bf8a88dca5ef4fe8a1d54e13e9e9940316ada202d766c205e7359be63c8403f582a314afc7b382cd78c42b818c3af0fcff75c43382b102e3712a04d20584f159cb6bd61f5477f9272e526a0d141cda8c620eb044cc5e5aba4e63e1a166fac1588228f7b3b4015bfeadc8303fe957fabc27c18fbd1c37719368285bd9c9ac1afa8f239ef45019515bdc6ea8a073b3f79336d68927dc02f075a6c19a049564a548daa4f4688e898345a38bf7b71bf87a197795c50973887e69f075c5a932e80a494bf32199d71898c4ea68480c47ed2a57d3466ceb4991c4762e8e05510800f005cb574c0f948d39e0994ec128605bb0543030a555c6e56aa4485281837f76ff85401a9e502bb10da299838a92cf0ab319789c99d0524b17fb270a62c7ff11e0d094823ee6064cbd11d04fccd2fbc2dcac91d270e3558c7384b1fdcfa5f0983beeadd854598b26f03527fcaf714b4bd317651a511737702746cf75f1a6bad4b7e875630a2f24064f1786d15af6296c3f62dabc64f360bfdb496ab8ef51c58dfdc5d26d86f238b581bed615f6e9fcefc893daffd3ff38413696680ff22f798ab58dae3cf0292efc2f32fd11aad32b9a17b44c2dc3c328bee134b3c222c63f958649f019715d70a1017ce50d9f3b2036d4cc178c5ec896fd842b3119a6a17d741800804c3115656c9ea37450fca9428aa7e42565cc95ebc7c684cc5ca7459cf014ba461d57d97527afaf9424eaa5f96036035dff35b290e44f466ad24c3c05d1227f29d40b310898dba92ccf91b8ad7e2c31a7a4c0a8eb1cc879f5c4be0d1fdfe95814b877a68689cb98249a1869c6ad2f76eb9a95fe6637d926547a244051e2124cec12c0bf58c0278464cda841acb5e7db112add3c68fc29546f3ca75d05a144649a2a1105e4059676d3b068c7c85efe67029cc0eb5834610b2e526feda2e528a7064890ff9322c0745b8b818380701923a4386592a0a728537903a3789076661d18b46535cddd4e89e3a51afd3db2e315e046f5b9a71d273538996c84361ca5ceb9b5b92ffb00e8ba54475cbe68ed01479f0d97e8d55e06b8535af19bfe9f8dc3cf95b4768351351194b96f4d67e91ec1c7d674a892316ce5b28f5b444fc6c703439a7d91cf99de958c437a32a46ee08941e9b380466001c23e7fd108915afb96fe0d3d08459f8a4e242da5f68544efa9f68e7ef959b16e5add747c6d2d24d085e7361b644f2de24545be1a207432f429cd0dfa9934ed5bb278b483fd89e9efd7e55c402b54098e81d53ffe38d802970fadad51eb3ddc6fd4f8880f400e740094e2c8d3e8bcfc350abdf87cc6197a7f6580b7ab74dd4553c7433848bd248caac4c5c3fd20eece7fe9e631b9539f6355332d732fbe7cf1af93430c55fc34f895707693e65d544716253732e066d184c07f9c29065083a92a41de4c5f85a4816aa0dc80b526552f9fc69742178819a76953b52157b258336cd7fe3f8de1deefd15ae1d49304594dc5d5f0ab8640de92f7b660a24b6d65571e608a2e0897480a71a86cd5a77ec86a2d5929b35716890e13b185f60a0811dfe8e16a61f72f4c99f39166cd1a1c0b4e825a2aa3af9280e3654a0c63bb0bc3917164862083315166fe1eb502136688c16ae1dbc3b93d2cd9948bdd3287fee53762f0c6b3d426bf373b5542bdbbe5a88b8df4245a9a9ef5b8497ce0ab956ade97628e12611196fdd55240f5453920d373959eedb27d3e44472b24fe150ed7167a1a45527463077508eae7b6e4b69f724327e41e1188a37f4fe38b1dba19cbf5a7311d6e32f1038e97ab506ee05aebebc1eed09fc0e357109818b926e0dfd0e3e8501e4ee4e411b04c3f8503824c8ba8b68f695807b7e25dea73b702d0876d48031f51dad163ba43ed4b8e5f12b5070fe9b5b7312d2ccad00d9c8c97d23a2b8cc145bdfb439784af437a7168d8bce88a2406c3137c6999cfc83a40cf2d209017ea6b6a9780a7f95d167138081b8ab5802d2a94e43a97d6c4e5f5dc912b60265146386197d1bca1b32edbeb262546f659cdca328eb0dd0a162a7766c4122375a39c55a9e47efe031a525e90aa3c19347ccc8ea6f72664bc2d6065e9522b900473b6694a64cf94a7fb4ca2317ba92bf553f21df709e35374714f6a6a22bed05b2a5a1d4d010ca715bce250d583b4a3c44507202daa31d3bb4abe2cf31c130a02315119b9a27c5ed6c7dd1085a9a4aa26bad23e51c4560c172076538b28716782ee6304962f68e27182048948d5c367a51a1c206a3e9b25135b40883b2e220f61cb5787ed8f185a6e57216426ef5703c8cead6d800048473463e2730a166c292a2ff749c5acd4ef56adfa4827e0a9a5173c4dce9cf2a59904a024bb00c898dd628209f3266de4c9afeb59de548e01761bcdc4ebc4fcfa440a7bd008252ded55932b562c18ba8f0f047b04ceb4e2a79e5be9d96b03068e6fce5aac04822bb5b64494a69da47b1feadac4c3bf4fc4e24460f956f75ef8aa43d9a682551eab362bfe24c1edd198da81bb2e605a2e1dfb90b0630136dfba96e8b2c818a30196bad948436ec5a8fa09fd2e21a14658d33aabd591a2d18d349a85e126369734d287ebaa5977cd2f87f385bc05502bd5d0e7bd57e9036f704ffe42ef2aa6d8be49e587accea2ac7028e242eb4233b3aefa4aedbcd5ebb991f10948633b2f0fa7e11ed6d70bb80b73c61c5b46401384ea3bab648ebc2156f70304bfc5c098e4f88479ffb27680913e47eaf95268b746917a514a54066eefaa6e37cf9e23aafeb8193d2ac678c4e7db9594449920e9a2ac9f85c6971a9a2cb318ea9e74cb2d06ef88b381997a4ab452966263a2d16f3f42918f00de626db419eb6557d220e9a3a5b92329b5e2dba1a9349c7ff5e412c75b3ab721b145af30e4ceef203d8aa57ee393d44da2193f56ea5589bf1bbf9adfff814551982b27471da8d2213f712b3fb0001013e6883e7a1de3724c9bcccf31374e80b71c7c9ea2cb6354845f3d418d15e81da30b96a0b548c59f4dfd7279650a89b17cc4a1dce9f6e6be6e2656b0101931442699aa2cb175e358ebca185f23811b20c71900a9c3a61958091a253f71c4c4cdc4162eab13ab25e54e89284a12a3ea15c1a202cdd8e4e4697dc510b8581e8900a40c89e686f3738d9dc20902da78dfd892e70f0fd1b72f3bf2af80e16c306825ef0223a2b054b59a01fd234f2408e2b0617090385628e2148f5ede8456014a83cc8164aa39d6d352a1c3def9985cdce756c6eb100e3ee53d7c5c9067be9915636410b4c5ca81b5fea69ba2c7dd7bb3c39b708a5fa20120fee23100534a01b30ddf377bba0b5e44e5370ed7829c6d518d55f6d3edb9797c9ee963940fa5400ac9647e2152a37466517da3e5f27c3b9c8cafe13082fcafdf67b87cb665755e04df1b6e0e553bcb04889fe234df26ec7e0acfb708e513aa339f7804cd1b636488962d8eaa8b7a6c07d3c6532c114188de4ddd03c3dfa5725e8f508141fa16597d38c2665ebb095e557a1a7f364f7618a39e024ac8385a104a7f697d79ca3745cd0b017f90af8fa9d8c5c2edb8636da2b745651681b8dc8bddb6ea7fdf536d315f581360aa2db55676fce7251c13cd31018a30ee5526d0eb017efc10da5c61241b66209112fe236c1966b0b0c8283eca69b5885bac4ce1399d1dc7b7d2afba26e97f4f9b32ea80f3a84c4615266a6a77d70d97e4eff0b57c98dc72fc2f12213fb1e9c80570b874f40bf6d0dc9ca0f63f33db851184dbf4bcdc0326675a4e3e785bedb4573632a9752aac778e94948d2b65677a6ad4d5470150da0a81b92bb8d8cfd33b1aeb1ec481edb663b2750cd54156f99d7847a65654dca947d1b5703867f6e384d5f645701d3c5bbbd0a7d1768becd916c24615c8bc68b704dfb7e7652eb665b810c16f5353ffe5a87092ab1911104f0ed037eb4542dc4d6a342556e834f8a0fe54b363152a1e9a511b9e6166daaba2ad2b83f077ed20b3a15768866882a5dd7f2734eb5fab81c3df5833bd04eea31b1a5a93ec03c51d31d0d0e93f8e1ea3646214accdd9dc10a779b0b9859c55e2027ee5cea794d2b90f1f280f480212dc7dd0a083d22ac7b49048aa9882d5174e9f00559be8d01ddd94b7e6416b6b663670f15522c2fa7453c473ce387c583dd139c93164795fad7209c092e96e71209b84ecbaef65f3e9d68c23a4013bcccf521900019020ea8a5eb661b56e1abd4af202ea575383bb30263080b55c86dad3b888ce4e87a619bd8be3c3d63837f7eb233212b5b7e3fa5129f8b188af262a53edcc5b9eb0d3934ddfd80e7daf8dc70c155c8d5b814e5952c92cdfa563e46356d82dce7c756e014244dc69323be3d3b4b2c882d11b8c7f3ded133195e1862de561f54f6d3d410aa5a139fc7e4403c6ebe1be1aa0eb6516197df6d0df90d43207706a08fb7112577ddd35f0e832b346b98a857d4f5ba1c3ef601de30bd79817c4edd61ead77aa8fd2e2196df96dbcfb279566d266d10730c680d093a220988724c07fbc0bb8d15bac972d9a375de68f3ceba9416eb76005a6c457082bd29d2830d2ae089e9c4e6314e4b8a02c6af8a7017296f4ee7474e99814f9692e546fa2ef09aa2aed8ceb4e11b104a760fdbcee7c1374106e700b85a25800de3310d69e6a4ebd4b81ee6ec5ace657d65a7cf809b7b78dc07613ed81cf78b291c36d9ac4a78a2d93e02ba06fec6cfa55a25175a3ba44272a8fc5e184245d58a765d382bbb0a3432994ac49f5d929354dc0e2fb628ba48b7640eeb136abed394ba2aa582c8d83473625d831fe7b064fe63c9952ee34bd01cd12f623416b119fa3015be2be441081e119161f33dbeb92479fdd41f0bd79d0578c45004a6cb2d0d70a4ce91adf343853fad0dd3b00c14499711591102cbe423b36430ffcb7b6151045e634e765d5b6b34f6d31c0f26eae0338ab0af58b769da298591afc5307b6763b918dcedfdd412aa155e467badc18ae7e067448e1882ab33bede7f5488bfb3073b6ba77543322e077efbeda5ff1c9c1ca8e97b037dc3197a669408d9f2c2c6775bb8489ccbfa1fc59a586c1e9970b65a5ab3bd6945afa756133eb6c5fd09042ca0ab3ad506905a7cfde06c361b524c296c5276100eacc76f5b5b03b906170eaf9090f8ae619980862030489ce335dff254424fa8474f1c2e95559a23ac614868a225fc999b7a048997a49bb38f8fe45da90fa4926e0af80c57dac4866e7c43f06bc6d116e2b668efdac9d00a7ee4fbb3e1171f5f0164fd8129473d61cacc83df43eff0b6f5d32031501c70024fc988ad83050a7eafe18f3560274f362fd67a7dc12de5ea3364cce69e29164b60a20d9305361061b8154f91c2e784842c2eba5469fd2b3129cfb1981b5c1d4660130d1cfe46abb8b854912e982467dc3e39a61bb4da3b2c5788809e6e320f73bc7109a3c49346d42f341644765a839ed48bd00c2841802c3b33bc81fd576763d45085bffec87c549b4821abd3f6424c9da9bade4acfa4c14335c7eb4f28bf87463603ca1332b6ba7ae545ad47943e75e7f7e8ea82d1137c1e233522da12626e90a5f66a988e70664cb014c12790d2ab520accb9670256cd1a7086d134c11a8a3204e019f52843e89f2d01a02a88a94d4a66e8d36dbfe924c6922f7ee5a1225aa8e75340cf8cbbd1c0b08e9296e81cec5f70cfc11d763523b12ca174433f246073d1c2877e4812828fdf2e41134bc8090fdce3faecd1e54a58948f59f3f78b2c1148b05687d712ab2b2d630416001513b9efc7f9523f53f92b6e4ba86e56e11e0fa09f2672b6269c411fcf8415c19e9d0c4dde34f43b1bc0a81e68e82909a0d6dd9e017fd561b8d6502ab629a8eccf15656ba9463931a7216d295981aa5c64c6e98569db166653f9e6d2c96d360e111d63cdbb9597df70abd913a01d68db876ee1fb4ac0cc30827763ac8bd743922f0575e887bba67122b08a61df03eb03934f256426b95d6ccecf552c4ff05805537e1a409020dbb317efdf9868edb76102e84254703d4057936239b6b830f9f438d7cf6a575dae01daaa773bd033448070bab740d9c51b9d6af09fe04721afdb49b313ca6fcaa3e9e580bfa0976d18ce473702bda5c955bacfdae63d6f3ac027009075e52c1033d7b303377b40f3bac7010d932f76e2751c3c81ab32a2f4f163e7e0744f2e970457ed926d304f8f90e7387f171acf88f05e3b956d4484e8aa1e7a238d6cd9f76be6dfcecf44256931cb583bdd0402356ddd47769b07877e50b341ea2fd2d099f1011408ec4b554923cfdaa4738fd1603435dab5b2e02d2e9bcea9a4d9f584f72a3324e132aa7177dd814a4968f29fa1e9e48fd35352d881d1dd4bd42a5979a77e098cd830d5ecadc57c31ab2bf0df62f565b14feaf43c10a94b93088f83212372d0a66e65723933821d0b4a4aef133bfd35f99be838aa4368a609b277e71de39f351c145ef3e9a179e031973461cd8557c1b337d994b5a2b6892a428219c27059b3585a7bdf708043626f2276dd80e7abb598b44d9cd0a719417f692c8fa14248b7e5b15a996058451ffe6c90d6bfdb5f7df491a2b5add8e78b7376d5bd4ce1d2df4ea969b62b82157589e5f0d1ecc8e997614087738fb0c7a3a10c1c1727c78e85fdb327ba44a62b0f7c1f45539a48d07e69415a5b08b7304672897e41c47be2386d5f131a5e3cfc4a4f88dcd04ac3baaf772499d0ab6497d0728f6ab1a5776483281dca5aaa9f1fb29eb345dc70d1fea7156ac478ea3184de2b7e7feb3d328be2b86fac0fec74fbe4d41f0edc9eec2301be7478b847b67dbc07e71c531e35ded398e5468e8637273d7a3ca655378aae2bece21523365bf9169249ce8dab19b3d243ef086afa6e08490b8c8adadd2616a22b34282e48aa7d6a4527050f7626d16b340d8039cb723574029f5ad1f266f2e0f3cb305df11a7123bb0f6e3cf2158e0b03c14c5f7bec356af9d564ef1995a984d147bc16c2347aef4e5358aac14e603e1d9aab608e546e7a4bdf5766a55ac0ea3e1a2a0d3e81010989a352ed4639ee70ec0a4bd16523674e831d90ed382ecfadb4c31895b8789a1ef76ffb5903708f4019909c16b2d1a6444a00aff7447a3c3bbfc2f634d293bc9c0229a0928b8ad93810be2ac4d9f7b1f7db2912f95cd58d10c9aa418f1f5acf1d5450e10e40d142a55be366505d0e00d5e1075887e3c938c95cd998f8f14667ff48864b40c5fc623465b0dd4dae7d196ae62bef177bbdd5c203e14b06fadf1dde693a3dbe7d549e41c8a70e1160cd622344f7451c772bca973942063d9e9d371720dd36fbe9827d79ff26574ff697819b980a092b78abadb5878c29014f096a5629ffd57d9cfe762963cf775df233ee3059d4a9b8f2b5f5a9492041f69e9c1e07df0287b80a312efcb0f2bccfc65b1e8e04d7854977c328ef289edf820fcdd898aa95cc3fb3c2fe504140b619f555790123834a516a6bbe0390685048153710a5271a11791c1c6ac0af39e1c0f1bbb446207857656d082b630b0d529d31305ca9df1005f8c5a60aca553ece696e0626a9a6274af9d231079a130e4506067223132d080833231844c9cdcfea57accd66c80f0073834c7ec92522dbb626e754fa7dbb72a6bcc6bbaf7b937db4304069eb0dd5a48f963e39e670b506045466514945e4e0400a1338a12c20c8ba67cb742a078473fdb71a0af629641dde33060f960843c1928fbaf7d06800217b82a064aa21b60f3c4a825a6eabaa73a22738e8773152a6ecc20071a3bbbc2865f551c3f208c4d6c9d4e9b0b663e2a7dec59164536d9bf0dd55964e9193bf4e0854720a98194b5b24fac296740eb73b0282820bb0f98a4fd29eeee7309c73f2e11463b0e2dfb41cec10af840df892adabe29d67267198046b227cc3f71294b77eb9b95f88c8998c7dab02f21abe0f70495a45ef1a725fcf1564c27d6ba27c1c3fb8e55ee060662a584e5f78f0cb7803597e1e0c03584c004ffa426be4d8a491a2966a47903394970a6f278146ad77075ab2785687bfe738a9478f28190198a855d6da920ebebf331271fd9372d096dccb9c07470df5abd88fd10b2a6ed9e2d0b7fe98d6b26e408f0f1b44381bd131f43aaf2d660cb62480822b48fb6cbdfd9b5772377e21cec31b3ebf9dd7883bd30e16406d3c1a6dcb911ebacb13892a6378a2d63900e35cb1684fd36d0a6e5d145afd044921ad891bbac403f3fb4a9b9ef9289f1ff76da485e6a0fb243934c1509b3d6f33cf3c949f4e009b761b37ae0a8d57414eda2712db16e09b65fc5215321f75f5cf8d4e1cc0cb52e5a41bc6ce50a5cd415821b6440b996d38a4bc6ca51388351c8ef4688e1ac3397710457e78fbf2e933ce568194a1bec5676301eb1d8f45d967d49d026527c632c43d50c53a56c5397d13f11fa12827878c236533caffd8f14c42dfb23e5234cd61ada6419f0bcd4ca1cb79f6d62944122b584efd5a0fc21b5e4c34ee7634af67b3c3be69f3854b812657699dc00f94f3d98437ae37199195f273451da93986a04f2211b4e44df0759f3a487aeb55aaaafb39a7aceeb7b81fcd3a88c643fb6af5a84b4898ede03c9860f68f14b495f5b624eb279fdd64b6073314688ee2d4bcd633a1bbac8cc68078101ea601b84af693cb1b3fedafab0bfac8937ccde2600cd095c7f3662d7b7c93211535c862ef3dc2724c492cc1e53a58f23a3e09ef27db633310783c6c798158187cb6bf40ed2bc0aee0dbc3b0cdb1a0446b14d94596990c902dc2b5a64b2f556aa7917cdedf512cc58b7048f8af127f33b899a2a236c64b21725b68876ae7099c386e7799303e557aaeaf231613dd2444b544fc7172f39d8b80baab7c4338e321a196360c8a53e922ccd0f87596625dfbb3af5d2ff5a17222db6914e17ea5809f75b14ea548324652589e2fa391528acd66213b5a1950678bd4df2b7377bd506a2748180fe449fb8df45f3f3cbf1e294e3f531d7c5860fc2b2f85659ec8d0e12628b33888f91b773a02acbd8d5a35b7d291ad7a035d839e852e1449cfec8091381c8b06cd011757fb160f11220d29b51f1fa8e78b8318dd3e62d44e834d6d0f345548292866de0c25a0eed0a7427abf683bcddc7153a1169b507dea5575c6b98f75730647c4c0125e25d4827984a9256278a4df5159acf9309959b3b2f05e0ecdef843487957de90937489d056e258572589656a80f9cf3a28ff0213847639d5446042a8443681ecb37c386f749706e3c4e3ad8f1e0118445b6e9c931e5a7e3d6fb7b5eba690f21f8b9cde6bbb13a2e14ec0adcab658b19bea0aef24c557b50ba8242579670d371363fd022cf3fb37380947ee8412a6a5251dfa852f4015e82737cf19ba4f565aae83c62c1ae4facad23ea1f726f894f9cc3c67e61a583d1e7864e11916251363da3220e49d55b6659634f5501631c9b7768e78984ed57760e87782adf5b3eb587eb933b31d10d70f6c356c82be85eee70d5c5625347f6ab55eb7d95ebfbf87438260262002db06d13c872e1485bbab8f78ee2815331dbf25c36e0fb3dc128f2bcd6f21b4b47febb2ee73628ed29da7b99f8c17eeb2791eb8fde24b35b474aa19492e4ef59bc42dba6b4131790ff18b6c6a7e4b3a1b592d77f55bb66aafad8014dde5d36d1f7174f19939c25ba380feb1c10beb80d5869769932378dc3684ba2471dbd8a4a9506a6061a33ebff612a98f8c7d1f4948c80296c081b813afc20051ee5986219f27b50eabc6cc2a706f340eb31a111cdce6170762bc9e96842ff9a43aa7046c6bbffd0360eb9526795e46361e2be681f9aa7dc3621d54ed1b934e243e0d7b0d73e0eb48665ac03a79a88710b6f7c90007dadcd2a9ecffa0deb6a7dae2d3138c215126e4a75b76efd815a1a361c8e0226e3fde3d1e71ca373360aacc0f40f372dcdc57df0a36dfcbfe6d39f708e4536e96a1290ba8f3db3b84580204ab9d44470b472642763222585378fa1594944b6de8c8654431bc5a343867558a9f322d91185b3a14d598681e40fe8904eb20f0a5ca7b3bf1a01270a8b7554c64d447d7da6ae03c5d0eb0d8a42bc691ccf7d069a0a5845219dd3e452169ea8e9c31246aa9699ed32509c29b727d99b8769eecdfe6e2a954c4cf870026b6edc43a9d110d877d5da875ae16d8109f3fa609cabb79fde7b3e6fa6037c940062895440255e8fb0ee46354e5f4b807f780048d6286606f1e69b2c47795caf5c161aac44739248d84fcabcb96a363ddef247a0b4e95bbc4ed956029fce828d04f61aac15405e9c5476d28e1a96c001deef2af897630b382befd9832d8790e5618f03e4411015e2cbfff839e0697b74c5bb34c12c29f7033f86a01e6f190a21185d50e546674ac495579640a956cb2f4a02ff8ab1a29195e03a5434d30740c88fcdac1f93ba8faa46fa5722e3f32169c242e5c5e6618d68c4773076f7d6f7543e6c5ff3b78e371c677495611ea330ecd4f7820328eb2d1442c9ff555c1c705cbac5f7223056e3936d32eb8bb7fb5bf0e89d4eb307a402f0e1aefb406e2c5e3a7b470c0b8ca91797ced1c3e35e70154e73a0c655e12091b72792ded8acab1385f68c09103af935a212bdb9386085ff3e0cae637c63f57bbf9b11f47ea5fd32b7c2f168e0a9dbe03acf7325db6cc16c582a22b0970e770372a2a8e6b2d8b72e585703c5ed77a589ca5b8ea45ce1a70f15428a38262f39db88e4c41005b35d88d0295f8aa7230aa4f95d5cbf2d5d9b39fdfc5154ba64c2666ab8002af7d454b4c7b05131ae1a5fc4203b89d0dd3f328f9a9e14a0c44d853680c2c972099a2144a792855552ec3969d77c8283dd14f17243ce50b6c42816ce736bac9faba367bae836685046170bf89796d342bd5d5c84b20371e13aa2eb80ab39060e5e5e8c7a122276dce8096c02e920f887eea6d8294db414baa84c780fa0918248b24a0424addd3d35c951ce1b34916eddf15ff8f27f76a5cd9d6330cdec3b8dd917e4632d23cd28055a7ea6a4027eb2bf66073352dfc191747aa5ca4df66da52a2fcc3e060c78c3c62bfe8a3ffb3f40a6ad2b1bdce70b8469d072990257ce54c64a4fd941d076ace2be4fed416759a52e473a26f31ddaeaf82f68217d78d41937f80dd963083d200571e1444adf545ca0b4c2c927fca631b9f7d4f831d1f55ef9c984b2dc2c32d988f75123cedbc5e3b88643870dfc03f519ca7781a20bc8b2863f230a2fb50e45f7af2e004fd514b6d02c4af4f7a46aa1b2079e62508eb4a057b98723d02b15d1dc19c66e4063c76282272777878e40c3fd3fd7febfd35fb4f8d92fb46006e029a0b7c8d243006453490787a330022cd865e3a2cb6262004ce40e6b1051c103a9d01983b0ba2362258f3de9ec73a8955b86938d6ccab36ce4a3d9e7ec27f1e6cf04bfa59e28554745df3aacd7e4fa00c9d9b006376b5ffc18b2bc249c45020025990aad0f100e8a30c39e6ee9e67ef5bfc9d99bdfc6c024558b358fa54b89f63a178ae86803c7b172b6d99e970a9ffa89f160bcaa6f7c7c37b7d6a78badf22f790ad1065d76194378237cca63c3e575c4caf5f74bc7ed6a1ba30ffad3eec3126edd4d8543e96bc6ddb3d860c4a4e80e0cc109ca1852bb849de7420802808545882980c3afc037a21fc2acf05e100009be7e0ca3b4a24f421aff3d4d9bf5a14f5159eb6015ad156b9aea4af794a7c61f464c8f22953911293f45223a04c0bf8656f91dd90a028d89eb9532f4eceeb2a550d6f1a53e89b9a06773c15bd1742891058178acf162f8938e5e1566db375e425a87e4da1516a15e2fe57b31968284d5f97d8c4a6030ff0effaf32dbe414116cbfe9c90fbd5250b8e524b049a87e5ceb8f67e93fdb1ef962cbf34ba29c27848b1d772ed49bef402743bc11029bba094843baeffbc66f80155fd4907977c41033efba76b73520084fb8061e0af4e81252c2f1211cb6b52bbd47cdd1ceeb8c5cdda31e41261da71188bebd27b1286b10b169a52d01208244c0f0496ff18be2b31ed42d1ebfc9d6f478c42bde93cac58ceac4416457a84963a705d1cbafbd69cb4dff715fd2ae52197664ec93313079df455f40576e929d20f5d4e1855814840e019165951d4f8af9282d79f6081e1a9077874c76d483dfd5240a132d6915b3e3c016744ede31f42c046a5e6786d80a48f7f8a05328009428c801c11471259bf5000b47fdb3da202a81b7f4784be2db512d1ff67cb77d5c74485885eafee88eaa57fc3b123ccc916d26a2e6a8b5e30041ad69a944217e9b402b7acc0170c31e8c2e45d83cb76dca6c6997bf69534d1ba2ef625359f478c324f7e52e086549be02f984a9ddd2522dc0d122b94ab2858ffd79966f1e8ee0769b142406504ae10fb750452a660c0e4de2e3b09ebd3220cfa9b27277127f6a280b26b3ff89a02d6611b8f3d475d2f6ad4b17edca4170a37d405082e5c6346a59fda6117414e383639a9a0d227db5afce71f426b667fc81fb49aa4435ba5c658f0b08c90e72a3878aba8a1daefe229e23efeee7fda12450cc3e4643016f45e0398bc55729336eae4e19ff91e467b846303d9ece0a7d86748296aaebc3458f6edc2862284ec7937c200161063d5ac53c95b35a35676d9171a0db4ebae5ed9765f94975c8f9bfb055933954e74437f7e5a709c7ba9ef1e3ec9974b84cf3b80c6a136766c5b47c43ef2a0a51b1839fced5f6a95dca0b9aec29ef1b6dfe77454cffbd1abb8b099ddc8d56fcddf165f2a881f71a92e057d918de1407d66beb05d77b58dbfaa56394d8d4ac99602375c1138e4ab5ed99ee2d085daaf29801b98a4a7169139a914ce1c7399d687ec43d9b9e3f4433f4534917294d0634194c7d330486706a11cb400526409bd2805027d2b72985fd1db8e317fa10d874d0c8b0a0a40f113806dfc79f847e3a701b63bf16ece18289e01766b0093d741d54f2de53879f9e15c03b5de160370bb9b65b8dc8addbcc52d20b2e7fc5477b962c5750bc4d9ca98c046a7dab282f5227d7c3fe78889cc5e06a10b4c7bcb35197bd62d25b54aab5f319e9913d6abbd032f6199ba6fb98f1db2ea494385e05886a9ea1bda14b3e35e3973543189660f873a7e8efc47554e28b8653473237b2a2a736909d3e8fbbbbe5f2da1ddd49b32d52539e555184451a7a07993855c84f12d61bbbdb8390c7ba72b3446bfbd326f1778fc686feb70e0c3f38d302039e3f6b7fb48ff3010cd6b4026f10b7e4f140e72bc2eddefc7c043a3370bd1edc08181eeca7999e37426d2b2d7cabac28f27571078360d80b51cc171f75a3f93fb44d9fd55b4517a6dfffa24c728193587549119347ec0c8bc6ca452b8e242bbf215480a2462f19d034029bf7c74f27d3e8406b5786dbd6fe4983270040ba10dacdd143ec0ec3ff33fd2a8ab80140b42bc9dfc0acd6bce1e3589b4f3623d2630318286c0b0b80425289bbf0f5b722c2d0a88bc43bae0b97db82571035be097cd89eee6b97c3007dac684b51393f41fe52f2e8e86c83447337455b3c6765cbd8bbd077c50adbb12bb2275d4e1b204ab133376b9fb7dd040e97102c0673b196013d3b78faecac0eb704357629e4009975f1f4787cc641a6c46b812e20c3280480cd6e469fa5ba95ba03210a875c36bac70fa8b3e1e027b93f3506f5edee4f73c1fcb78505de9dd2af3f58aee8cc591b2efcc29271ce15c7c9741ff7f04d8e706f4bc5a8dfffbc4201396ab7c0bcde571839d098aeb8823f0db94ac8ca696b96c32b072680719c605a51c5d991b64ceb0d57613afb67f3ab767505ccceea7d33782b0a8289dcb4ba05490878ee410b4398d5e2fdda34f0799e27df98802929f2f8bc3e417eb9abbbac5f911a48d5cffd2525e455eda7ff45ef4246a090adf831bf6f10e7b160d7e1ba35fe2203ecd1844cc7d3d78849767cd464c97942f17e9c46a420e9d49adfc8b94cbe44d21ed6556a4c3ff74c91fcaaf80fd687498c138f390bfccc5aa009ed24043fe725b434fd28238739ad0a084cc4a3fc5ef6f65d86e106f313b6190cab751d218d617573f7e0de58231c2a2fdec4a1b964fd98b31fd915b234697e5e9046c7d1bc27bb29b24eed11283c6ab9dd72b98c3da00bcab6abb898b2f7485647f3b4eed7eafdbcc8acd040cd60545cc5493bf34d90c7fae7c3703523f1ffaa1f1664c7752dc5a3b7950875973a7f7f22d2b97d293255da2faadd15ebbc1cc0a21957fa1862ab84fb82261dfa2d34977289a28835271ddefadc4f999ee818106d96ff05461c07c6f11e99a88aab1c4c30e887a305c1b87fd5d2585ea1f88a3fcdf9ca6762cc72e054a4e3b3bd56aef3ea69f96c2fb49e334d1787c3895fdba56fcc5a9f0306657782cf84be069265351ba84831f74247afdd364e76d99094c7bf89202abb2c67e307f90d25eaf0c766210e2493112d3d3be2991cd7073d4e3d39baab88efd0e2b950bbdd99fef45e2db725ff1de1c7e76e09ca836296b8506c6adb6d3805867e60f9728668a71f81f22a6a38110d94fecccf4512b80c9453ebcf55d5c6b0af93806ed7884077c4eb3a1745704ae926cbce9f933b25dd43b111d3c485a365ceba8e2d35638fe596f28bea6237fa090fd6e9e73f7d6a8d59009514a1ed5c99666bf0b126a8c57518206e302aefcce182b8b5529449c49146baec0e788d60c009103e9725b87faaab0d37752a18220751d9a75e4c30e28d9f587d3db2e63e7e195fee4bad231d0ac2019e25ca31a7eedfd23666c1c332e6c551cf0edb7874283993865b47693bfa1fb5f8be95dcbd0caf0ae8f89f6134114b4f581e7cc47052cc638d226f0b4b0cf682edcc0779dfe5220c45a03f9b74a1b3a9bec8f14ad1825448695d9e79d8c7f900d3cab9898f0ceb5ec2ea1ce2632c70e959bae38c063b63aaa1495045439fa9a84137068c58e85d7af732c1d68df61596bf40bdf88ce26d02cb921efe3a185af1bcad8912bc1c1ac94926d8d863b3042a66170b20e42bf3095eb474f51aa6bf75bc7abb8d26fc85f23f129c7872d7ef2cd48a35859a5c77f6d11cdcca73ef299cb73b188c381e416e4f92b73739c919168136d7a71e187e83a957c0fec4464bef436b1a605e05af960123a385372b346ff2996c05fdc479186de1cc028a4078d5c7975bda07275321ea51dbe2e9629391bf2e6d12a804fa2d85475876446242f8da2c3739d217ce6a6189dae0cf03e9343d62556dab3e644b95f4e0aa71202cb0f1b647003d4b64081d582b0f568397c003d1af6785f559eb06771f4f9f0eb8a684a205dda736c653642946bf2e6611bd98f8e5a0b6be5da45d4a4eb62c825942299bee22be5e7804dc99a880a5200995634492a9bbfdb1d000eb097eb82f910c46f08a6fd146cb74fd15eae46945c1dff95130d314382926a7d5da29b06af26d733c45258e74632c3c1a686ac94bdd05d18b4abd3df215e0a8a72b17b3c8f00e24fbb8d4446bb1a31033bb8473b6ddaf726f3ad8c7bffac689bb96f910ce1c36d2ab500ca19159721fee5eb1c6fb362552899bb61ff65a20d1af881e75fec9a012c7a53f1489ad01c1a6bc73519d69000846e7c5c539b68806df892851bf9ab25bdd12dc2bc93eea9bf97f699221f8d7fa43a99845fe92749fe8148712a501e61458336435b471851552f1d5070d6815aeec5b9e10c9707f1335b4bb572391c3d2c59177e0e00779b44fce763ed43941accd7857c40ec2fff764d4459ddfccd42da18787bbe04330ff5c6f9d97fadec46a537a55ce431c8fb2e20db6352e058f7b88b0041519d7335ce55feba105eb466e0aec089e1aff96ec29cb7ddb82ee5e42c7958d8b1105f9638709c0e879c1203e7047e0c1dabebdf9c8981cef92f9e929fa92848c4a821b99ce17bdeccb02ea4210189ec8270c5d623afe03ffc28a9887ae4179974acde26606e4431c7e231d1f66c8631f745b0dbbfd67d37a9642e4e23f2cdd4a763c166eee09f1060794312ce0f20e46371d477d8c5ffbee82a566d049bf3014716ef00acfe33827fbf8bf011b0fd0cb03d5831d6450fdca1c1486c83a731263b0e937c0492a98f0cfa32f22718c5b1c5f16592221e559abc722dd30add2e4d6b90d3635d62a83fef735fa1790f21db8ad52221221878ff21852d2b0006937dbfe7d73c1e38d99b10723b836d5db993e730b8663ffa2114b9426ffbcdea07bf1f5ac88fb1dae4aa573eee226cc934e0c44c4ee9e18ef7e06af01ccbd851331a7330cee57d107075ad219f06df1c3acb096f0d33719aa36b1dd95b248b03be96a3b210c4eaa4 +0x061e0be7fa3c164f342ce81295dbafdcc5fbc47486f2c8240d8f9e30399973c959b57f7cc6ea4b93a5f2d0354717eea8641191539c47f736dcaf46487f7390c0 +102400 +0xa1ed9fbb03c366c30f7513bc64f45ad979ad888031c6bba8afa553866bb3a468855fede15a658e26565075b8093dda437ce32cc6c5d04bf5d9f5f7dca26589c4515ae05af6799f0e4d5796badb3b7d843a26e805b21077ab09754d5b9b10c45bade75f70fe8701439f915c090575ab635d7ea4831f0fa891e62c3e4d7f3bbff53f0c53699a181b8df206b0efad74cdaa8af3488a355347701922b0f8756fe15ab2d3a28ef4b357b4efbf7bb2fcbe491f6b8ebc601b66ba10495f8ca6a6339251ac44352731e01c7f3dc3a39b19dd898ba856e84dfad06b391fecbb9d390f3aa4d566f47c7c27d3b7841a12f22c59f3b5e954b59bfa17c0b342d02425578b4119d741c7d4fb11e2246ecdaeff5fb8f167d58e099042c523455c13ae882830107957dd9779d625b28ea1e36109d884ea67140ece76fb61fbb912be430cd3850d8b00434ab136ebabbdc564115abf44467e4fdcea934c74b0d50ed7cafb8113a119777acac543ec35798359a8383d816c742efe47305e85aa62f8692a9b596034e9678afdfd24afb98983c90dec7ac2c611587ecb94591c502777794d3584f62fc5767ccda002bd9db66cbc28be9d8fbb1d7663600964c20cee34111a10295df8734c5721f8049c4bc8e63ae1f5ce70b35f2fb6edd5a7fd457dd7387976711bf9bb9223e04b53d629879b4c20db37ee16a02c7e59414b58649d07f752ad84ba9967f0e8f4e216f3a1ba30f9cdb6fd904da814c38e957858cf166c558dfe89c23f3d0daf440576791a2b504ad0cf4bdfbe3f908e73195587efb0af5a13b1a8b95507927fb8fb9bf2fca0a145116e4762d22d48e6f0150b6c2c33780eca0e0b29428b2661380eace5aee2cbf479db19a1f139e3d3edd0c18fef666e7a9b5dd7996e92725cac84d1db9ab9775fee5dea24842d0a5d5293a0799e123aa56ee5379241e31e78fca6345b27ec4d8d593de274f1cf648d07a6d0b1a3ff84972cef519b2348d1bd11bcfaedbd45f486a3c42818a2e89a6af55178bf64f5f359bbc34d3c7c873334d10e4e19c48a1552b237e598fd3f53fc02dcc12c4bbc2ff205a954fdb469ede425e35668a48457fa70e1407d6c9e384c178ed27fbe1be16af1e98e6733b6a7d6f5853a61c6fb6385c409624d56cbf0611db0d44027dcb1ca66ca2201613608102a3a238d90b7e0fb95f67293238f2444fa8aeef8edc546194e953853a7b0b99caa4b39726b7f7764cdf199d43ab27cfb9864492e789f495f9093fae66bee62825f00a39ac01cd0c95342ff9a05fc9f90dd860c6a303161a414098e4116b6aac830a08a8df55792310f31cb6ceb35360ab33760347d4537f1c2421ced11d13978047515d174f665a5e90626d35424e87201c16d15c7a1724d8285cd70c307b899c5c56df0a3c1f32cc9083756a8925ecfaf6a5a94760ebbc13c19c854931fcf345ad9b972ec82e1ce9780277d50474029a47b503af254ba54d8473620ebe32550abf922ddb6ffda933bb61dd0b20b3589ca3b768da33b160e3e573f5d321963f5a06cd0bb680184849df242d837a6e5f608f4f517f28b78f756910a92cf8a302b217cea936c5087a8a67cbd1c47dff97846ecf460450b8718093cc0472cfe35fb166f98ee29b48c083c9bb7244b7f19176c6d9cee0584ec783da28805b03d1a6c678e045307f53baa48995879a94fecdc63bd144b9bbf4e1fdb098b52c30e8687fc21534a6eda3b98b3bcc7a2cb141bce112485ff6d815616ccbaf1b9cd3a2153bd70b05bc62d35da634d2d2717994df55fec1790e595ac64f6fde1bf368a94d893c2410f77b4d0764293b191f7a52b5a355bf1886ac2f711431a83ee67c3871e64612eede938b57637d87c67d2ff5d047cbb3c6f63cfdf269a5800cdc6b0a12e1a93a07e85808be12962b53110708afb1a521fcb3a850eaae20080e4bc188b0f9ba1bf48b156fbc0027b857818c05a48f969c32656ac29a5055a2abcb2c2edc9d1d3b2d5d680ad1aa96914c254b777f2ff4750071f0cdb20eaae27dc0e776d65a270a2ad5dc748f70674899a2b1c86011636edf7fd6cc92179449fcc39ffb6eaf8c2b656acf3756001e60d8505b9327e257cc27d58959eb39a63b9159c226e60ba0f175a2dccdb5b8205c70d4a5420701462f821985000db35559d3e9ea83ecfd0a0ec41471923f3711be0b963b6fbdfcb30b76b256398a3326074cfa658cd4021bd5e9161a4f42db66e7f11b6a769d4312e26e468960d1279cd66511efbc4ba97ad95d4e533f7133946cd9eacef125530a46e13c7b30730f3e49a4b6d59ca4619bab8913a8fd3ace3edf2e7ae55a06dafd9b680ab80300686ec3945fb3a88eb902aef51c88031009aaa157522a2b821971627b47dc72d9b1b2f6ac73066a5b1e246649bf7ceb91847c45ece719e047bcea3e936a34ea9f89bf3565a74a4caa0f8563cf72f4012fbd384f67c04112c823dc8238e87de4a23ec8124852fbe9fc1baa2a2edd89fe5b12432050742c3d83ecccdfe458f3eb826f821fdd1c97acb1b1071bc065ab3d9432416b2f5927cafb864f9a1e225389c09a51a09c5aaa1f7b6e30db2c91d4497b8b97726d05e0359f7eb9534edb0929ed2ddb66fe93afbca9b19bcadbf8a1ac618cd9f891f0d217f034be9e1ef9815658b873b58c5e24fedd19cc7d56e07fc0f6c47d4026b079ec9e56a3dce6f44899a3b8bf2ebe20867076052765160fdb41abb0f5fb93bb342dea432d923f51eb6e4ebd12351c71609c15125104a1dd5088e0d0d88d7177bd46748890409098d63eca24016b1fc72fec3abfcdfe72bf5c1146a29968487c61e0bda5908a834f95a5a68c212340a860db476be295114c7a753db4bd3e714fde67361892b27fdca61d5453e610278b8003dbb5537af60b181f4675b85294586f546e501b6aeed694105429d4942ce729e0581a8512a951d199e1741f571a3ca132d6fa9f1678a3cc29366c5131d951baeb5d09fbeea3d7235faf2e56be8b53107d0056923785facab27ba9f06ba541af9f4b022c816df189eaf002f2eb603249bd6b2299509f122c66844136c4293d9476b2a19b5d604771c6649088802150995e87bd19043ca04d9ff0e0a8bdcdabf5fc1456cce5433f776c7d656bff47449bead6a495a4d71bbad93206aadb1b2340b9f0a045bb5f4007679ae031cb6a74ddece86793b506eb00acd801d18e8a2a011ad7fc7a424cffae225d9f5e76d367cbdf2d7497d744a4ab755380914aa336c3a92ae9ef0c74d4d837260166844aa3d22c266a267e08cf07ed25018eb1febfe4ef79f7189c6f56121094a4ce76189fad7e53a6a40bdbc0c25edce31e36e55bf15835929b54a509e84919f81abec5e1aa2045b8b51326205754dbc3b46c0f61757dfe4acbd7be46d73b3679cfd0eae054cc7d2ebe2680743369a21205a3c586fdbb248e4e9803c34b717ab8525ee03229dd5a6743a87322e307e06c7680b022d6aa58db88082dd5c186473246bb6e4db5cd7df0ca3b66c2e2a9f7218b7547cbbcc60bc0fcca8514e5e43c561168bda975374869d631d3cabeea56dfb91404f7fc98addd3131b1f71515bab2470976cbf4855a20ec3e52a0d423900583cf702e328cbf6eb9e02cf2cb9552c55bf0222b904223b470b36bebcef03311701a01d4db3cd113fb586e9e95dd850dc4cf484ee4f825a3083378120bdaa0a2028632827303535b79fcff60f068d20a15f941bc6f01d05b17311faa173d7935bf969acd868ae6b3ba6047e067c1ba38c400a6eaab19c47b222ebb2a8db31d3b1bcda31c823debab3104d0735872ce286367f050058a7251bd9ee2f9bbb61d208b8de3d5f296d2a0726d31b06ef65e3758a1b6931aee5a9d4e042fbe4dc0e984a369b5a054104c31f30be41e07b70b043850521a67bffdac57f0e9ee906e12e5d7e3c0f22354b8ee37636022bf5f551d66c66b5c6879cc0d7fe7a9e1400819b2bd8e7e41ecbe9923c3f62e450239bcc188a65aef8996564f0a4b085cc9498e79a8cc56261cc87d710d56a71b5cd0b2bef262b93a67b02cdf9bad5da7888cb1b94e1fd1053ffcc66497e7731c3bded764587dfec37f31a03db88142682a5c43d0020b7775d2e6146cd83b1abe2bae8b301f6aa4213ca550f7c5693f051b32b58c5921d1de51fed7f862c3f677b8ba4ec0bbbb41ba2c85df8c66c7ac04d7aa771cd7c548c559b191a5ac049edf4f9ca284b1e24024bb4d7c6a011f21edec1e192ff29874c136a8d1e3389f9c6b7cc0270a967227c79576e82f18f23936c5281c243e0dce38954f093f8cd75792accf3cb0dddd813917ac833a32c34a65ff32e0a81e87bdb1d21ea8291d5e58eb7c046415fc96c4efce38de19d314de01f6d9070a18a8dbc399825f2e5e9728dc572a2da877306b5225b6694c7e698c8148850ff8c0e3a0c448346ebde5044ffbba8b09f6d23cfd16ba9fb5509923ae6a70b16bc28bca955a6a8f8756354826c032b1897f921ee294097f32b4b7e5ec23ec089b15edb031ec6cfe1995d3b545a04c381ca14b48c4607ebf61f75f32ae5436d52e517b56ff00ec2a95eb24ee35326379341a426d1ae2a6eae386f37c6d61cdb196039901652e548f9cd4bd557ded151f70392bde4eb0fe8c07e21925b1d33d2852badb520ccb32879ec1018d8846dd75518c7c2ee852021d7f9744e1143ee1a3e4d5c6cb4e6e12bd0c5e95e8ccb629254892a7c1602c3e099b24eb20fcfb77aedce2dfdfa29d519a660bff19e3e194a9d5da23585ec62efaeb099057e49f5bb3ab707af1b1cf8baa5c378173462f8c7d89c193362ca6414bffb3b9085390fa5cc0fd4cb3f48b2d573f8fe1977c168d0ac4f76c0d6253118749c1e9b4d286f004cde7b998d336c34b807373f8ee2d22fc17da122098431c2749a286dfe9e7c94612ce4612e678c9d1df60dd0a14d9caac02e81a1226fccdc68fd4350bf219e29b402f76b4a6c7cd949cf6716da8b300a516a00874a6e6a2cf7ce568ab83b3d86ec679cfe08c8a2b0e69a2c575f23f4161b3a051aa80a737cca1448641273c174b264bb64900568e9995d46dc589d5298c7a579a465ca4f9288d70326f55193bbae003ce30baa354e0c229cedee82b156fcb4426ba8376636da1f6e18885e1923874307c4a14070a5e7f016d14858781a636e49b89ad7203268f57182f421bc74e635044f794e83b7d1d09cd290aa11aaa4db76d26235e64dd960f4ab6023e47572df1ccbbc5cd54c73c81636ebfde3ce6603b2032ad61e4ed669dfdcf5eafaefd448358291f3ce2c75e36c4683db565051efe391174432fe06171a5ddb0064aab37838ba219ad61e7e26874a80cbd2f70ea6f2c55306882512728e7639ed8c6eb8780ebc93d955eb369b4d8a0a56bf8a4530c8e706a48a8ba182216f3737d8038b4f9dd01038b35b4749a74d470285d29d964b3f57a69ef75c50bc8fff68b230d305cf3dc040583656387ddd625a8c97bfdf65146f952e32eae3481fb60781be38a38b4dca78ad440e71b88081e33da05313fdb076f9a105f543ab67879dad766430b8465768184d14fb3e7fcd27feb7003bfb5993585f352279cfaf98b19e1dfcb440718e99021813def9226dad38a26e5d4658ee3cd08d1b8c9a3f11cbbb7eab380a169892d46eb123d0b089fd542a4684c8f5b02c5cd48884f65e1b746e6017c2fe7d9cdbf41796d1aa734ba0b81730b5687701b16bd1106aca56de321f8ae85d04edc3fdccdb6bf071b1d91dce31d3fa0e280852654d5c45fe6d819034c5c70e04b0357fc282d8890cb35bfcfd40d85aa24eee97b210141d79ec2c1316d95cdfe60c19e940d384a263c1fac6ac0be6de0d32da08bae2dffa251b09452d8e4ed7924a97c4ad9718465e22dd02455ba68c351cf52ee58b65e5e9413dade1ac45fef1b1d99771963b7ae5202e382ff8c06e035367909cd24fe5ada7f3d39bfaeb5de98b04eaf4989648e00112f0d2aadb8c5f2157b64581450359965140c141e5fb631e43469d65d1b7370eb3b396399fec32cced294a5eee46d6547f7bbd49dee148b4bc31d6c493cfd28f3908e36cb698629d53701132f3b60a29a60cf5da7c157e939735077f849999cccc78210cc598d9dcae1304c4fb5bde5fee7cd3bc67a1ef03fdda965c4d1c750c928ab8e177f27dd1299b89deaf3e3a3d7e52bdb6488c814e16a7ec2496614c99b6c610b371b038c4e98f0a46b766070a7f161d92c7df1ebb0924719e066e08b95eb4914a5edaf1fc1977eec5badb2b0f18515a168ba1ad91ffd98d94464d8fb5b3dda46ee47690c2dfdc9d2361a69094728adc0b3dda16191f4fa9ccfe06cbd5dcc8afe6ab8efc5e63447f2853ce1ce0b4490b388493419b920d2b10d59fa26001fd1c7b5c291f18ce3afc9c385bb93d07164f6709d3165e7f9b7d267322fea04c0551f59f50e03748437c46ba564ef1937a105e74a27dac0f8205d68196c6dbe367b81c1b0a2705f8e967ef7fc6c3457ffcb6e66c085ecb69492deaa704e25aeeabb7b7795fdcc807b3255f2fb30081f425a9c7990ea104b7785c288c733965965ab8906057e8c99d291e5e7325eced197b51c9a4bb2e9f1e98f95ad9ebb54302fb226d79fb3150e0d4bab4f32571d1178817b43518ede4c8306e4635753d3e5c165d176c52a0a5fb3b622856ba767415d4614ff32bc61bddc822b54917ba9cc933d156e0641d0f14e77c8444ede41f3ce5986387fea28b84e87d6ebddb12a673dbe6f17e3a91d7545e728e67c5a11ab44525b89899677de619e73b38c92ea4829504b2eddbe246e22aaa0f644a96ada47c6e16cf02ff392be2c8e262e8f6de1eea935fd54ffaa2e7d28ecee684ab203410dd45d44350077acc882ce440529b6d61fbc1e09fbf338adf8495937cc9ba8e8bd90c4e64442ffb5e8fe166d92b259a82a4a0b4d21b43f4d8f62a1339d6c4d775c935e66bc2f8d82046c98fbc67c2cbd5f6c4f9f0f5184c454b560fc3bb863a5417864362b1ac369a13ab08f0f0bb29e35af4580234fbbbafebe12f236148ddb22ac80e50fb9140555f51787dac58db3336fa780fc234699d3e931a60af52e8166ac2ee3e87ef1bd89381886c85e0094df39c031f860b7d97ac3479828ceb84093f3e8c333d10f2ab1504e0c4629dddbafaa39e3b68c81f259d8bf392e25dd91211028f37053beb574fa2278d2ad57d01b2d6f36950b279d07961319698ee0eb948d8a052c7b72e63a72206cfc7d111aa82ffaab32612b01fa87eda9996e74b864c86678d6bcde457874e249320d9c23ed4e46b21d230ef9b92aa97a0c490ba0286d48befd9c535bc56ec2ae01d34b7440f4fddba3d545cca9fad10b50a3080b45c8cb581fae748187cc5bfbfa62c1a449a06a8864dc61f36384eecdf5010c82437748c4ab47a46f661a18c37a30710c6dfd1758debcd6167c356d4277e79b8db8056b952f0c856db6d483850fc0ec353457aecd800b34ae4aa8e6f937cb178609df8e3a19717a15108816c129a895b7234c7b46e72be013553bb662e3200313bf822b3408fb04fdf9a15d08663c0ffac148276572b37afe228a860fd88b00bf5f79ed036c2db870e8bcd0bb340fad8884e71d99c11667b738f1c060a67082d150433e48b16e07164436fc6a219810e8e485d86440e928e71f2de005cb54fc02386a894477506366b2ac3a859d79bc8466b0d245709040f64b8b7f5fb5cceeba8e5c68a73c696feaba8935ae260912e391f4b5cdee90527d2496f8df042cdd72b88556e17f1d8f0ab26a583459eab6aeecdddd6df98dbfe450dce71425193ab34d91de739dd1435f30ac2cc887830a1eddb8c3965fdcebb446c9c49f96f6a904b3fe59ee37492f40bbeb2ddb5d56afebfb3202d7500288758cea0bc1e8698aef922773b1c9d99567ca83d5dd39f9fa6ebbb615c19892f89079ba373b77d662cc5ea9965ed407383cc322bf5ebbd18c4f95d176b58802deadc3b6d16cf3c1c33380014c45c4666a286c3434c04171d7e720009053bcd68d15c16c64c6bab02ead8caaf017495bbdc2fc24e0b2695f5fcdd0b00d0c8592967119476bd95b2607a30b134c43a16ba58519915d9591fea67c2e8c474090ab7d3821e441254397d0ac51e69b4b8b1aa3f73af5d5fa69d42e7a9fe1d9a06c95c3e371af9f3b128a2c32177187af54fd5b81e6cf14414f746a31bb5d3eac67f5ed0b9f25d07b26717cdcb2507bef9d681ecd9389831ac153ec49f75ad0b511206b08f0c38f762de244f4b91ff27cd30f7022c7b19ce75df7271bea674a6af6c9c0741d2526ac67611712a22c75d78437f239f9d3dc2773e29d3ffb0f062e97368fc58aa7309e815255def3f290902f96077bb06ccb6ba18ad12eafce9e80511b1b85bfe627ccfa4a9382252ebd37438e425071f8e514757445507f027df0e2dc163d235e86a830ce52d4bc2d662d5ea51560c4e4a3c25e137c4dff571f009aede2445b7cd7c0d332161f3f7b25f2df6f03150fcca1e5ca0ce89f97491c3007e51233decd9597403a5ffa1594771844409df5d92d4a0f57a50c9ddd34dfffa846289423cd3a9c063b82dde505c41e3bce487bb76316af75907af147c6e4c00a8587eda0f8516f93aa4133144bb765146c852f012a9236a24396025d5bc5419d27d298fcdb5462872afdb229d2ab9d7caff6886cd037356c32f079848febc4dea17b3e8de2ce155f222aa39c372b27c30cff0050e0904c41d31caf63bfe2fa4d86f436daab29086a245abff1e5b0848608112f33f817bbb1c86d1c61882532784cd02a79a0ffbc56a5f03fb16ac6443425cf8dac7348344a77845904653d0ddd778181d140ac91932baddb6142f6d76bfaac7410eeac266a64d4edd2d394fcfb7baac57816ca28be29c5fb67eaacce8bdb1aab17c6ae029024e133335fb78030dd9e6de4afd3021624eb185bee628a125bbc7b1797e8695a1c3bd1dc663f283c21eef39d58518e59a18fcab3aab2aaae00e46c96dec5cb36cf4732048376657bcd1eff08ccc05df734168ae5cc07a0ad5f25081c07d098a4b285ec623407b85e53a0d8cd6999d16d3131c188befbfc9ebb10d62daf9362227a9a696bf46da1724a172941ab68892a4d441702efea1f00c92a4f323288a84e6bd721885112a14604d4690c2e96f5bcccdfe3fafb6ca861fdc3dbc04d2aeb772adead5db6814858387b00935fbfa7a35467c0c75dfdf930bd80246e3be49c3b1c138542a1440717497d886dbb4d0f6c586e25fe8418b20bace191829b504b18d40811ddbde55e01bc5e78f1cdb9ad766d759c070a374331305aabb3f7f8788ed74f0b9548bfcdb605905ac603aff25ff7f09b875cf42d7fec7deb58be47950b8a3aaafffe6dc682b9a59660f97a8e977c719ce5f8b9e11635adc9077ac8212d816da8743b69e9264d10c4491bb3c2bb8f7b28b96a030eb2a07cdd36a9e4bd53415a6ca87c2e95ef34645cf4e6e64f1a957fb7682d69f6c3c16d907cc837ca1b4e736ff35d366d6c0412d8daf77c845322f1d178cf4939c7fcf27b30423bd7e40d6b3aeb4b1bc01b40aec081aa00f2e3bc63ff61ac4b684dc7ae05f7c46b475c02845606c2494e7b5e8a9c8f8afe2b5ac658a9c960cad2b3b5e2b949bb40c8d1c26139bc5f49691ac258d53b26de8e06d5426906695239a85c431d8c9346bcf3c1846ea27e869068207bf33aea2cab967db3a5af427bed7a0f41ab66e907a41094605d2facab64e1dd767f056162f488042ee83a68a26ec76360db3f28ee0ed69f779dda660247267dcaf101190c094a1d06b92e68504e0eed23259bef745db4575ca9293735c794760bd1d46da25a5b3ced90f1be100bcef0fb22f3892531286061f7929ca056ba4a9b99f5fba05839c846082ac66c1876337b5bdc929b09a12f3a01bd12fc8516800cc1cc3f90837463a267403dcf0493190628cd982047bd38477fff1684d327aad1e1eda5fd7c89738566d870b340b4163e223d167f8bdb000c9aef33e3b16c2f8d62c0cb31a3e79c516f3a0bb36d47bf75d0a179e336990b1c1ae3d793b0528291ccfc1bf78a1d32b8e90b6b39eacc796faca15ef5e875ddd848939e1f40894871a8d61499afa8cb0e8cb31bc139b0d86e1ea3224211dfecd3dc64d3d0f26ee5bf5f1541a28508e9d492c7a9e3daa35103bf2d50323355bc912eee35733681eedd88002fac9acc03adb3cf721c5e0277c306b68560dd65c182b8862f509d40c85e9c4d4b025150acec682110c5346cb12e7dc52e38609e904b11c32e03875a16b50443006e59354a3328730298ee2091a89cdfb7337d5ead3cc33bbe06950c3e636887fc2b12e86ff46d1bd3e1fbecadb3dc6cbcdc84247cea35464bd446f5b40c3192aad30ef892b2aea1e14ade2f49e2c502abbe058e83d5f07973e70d952bf1e7e978f0bdd436f075abd73e15471ab7df280032720b56827d4bc2c96968eac703f3030ea019d1205a70123631e274a5935356e47a197962444394f5daff94fe0e55c5773617f5e4b5b51ebda4800c3e8a0b1c4e5e374117ede776f6e2b7aef97f782ce5107d29902fd1794efd8e35d51bb5ccdacef361f5c2ade547012f8d5bcfd0c5b2afb7c0c5116bae749d8b761bd0e9f5041ccc309e6b1d7c50c6c5d4a787f61c7a74367ff612da2a9914f66175322e0174f82051746fac88cea429094f306e9d96fe979b959ca37a56e46d7c73c7e88e87c1ae290a18e1a6fb19b79fb54190c5b2bf59c846276e0a289c4f2b99faa008c709b44be22f336370a8000c9c4413213826db7a6a4b7086789d19f35a52fafcbd40d12e7eeb382ac9cf80d446a05c3cb1d5bb268461814bd1775c6827694fc6c5079345430566895100b88b66fed2749a3c67512711e6d6cdbb94fe9396151398be6914d0e624fbb0dc15965fa81c656bdb7e7ec4c537b3c7ca422b2171f15f82e5c1319b0619fe73c23689a344a09b91335f23e003ea6f5a33f28253755af72e0e3a1023fdabfdf44389d9c44cf563c4c487d4fb467575ef7914789c28b896f4a84234ee356196bcf09e1b5539816a510f871689157f44021a26828df490ab714468246c35c1455829c1a2b892eb2bd094eb4d1bf95e763c87a7448b7189a11e532a4320874186407fb32470d18904cdd512fd265a9968f95225132717fa146654e725ad9268d5f062e0f5108de1a1a340acab3ab1c6b8c2fa1e92e3607871f3da4d4055ffbdc0f263b9b91a109b7eeb77f6ebbba75cc2140ff22832e36b561153cb37dc27a6b3c102cbc4e0120ce910dba0133ba3c23186d44e67b809791d7941cf508292ca3ad6c095cd24fabc9ccdfc36c63d3fad73760791c5c55af8448634e84efbc97ec2ce1d86263b4330f65d5a098932b355047c1a6ac6fd408f77b2ada467aa545af7f17a3b64a583f0824965b6c0bed78f60f37d17dfc2629503990c625f009be526fb77140cf62571cd3cbfccf123f4831596b04794b729af94a3d1c089b13883fc4694be839fb03b3381b89abf2492f69eb054687a3e1e45876dae4d6c1e82ddc46d43896d24acc351d2f0ce7f134b4068eaca08f4e9b8ed7850f2479abb33593bda14032e078390a48ae8c6b582860700a08187a92c720dc3e83e6d8a19a26cbf0776ba4acacd39a8141121f6f4cb90f27c2b92eb88d22d16adf31dbeac58aeba8ffc2d47e0f204e9290a5eb7dc9494cad82889407161d1dd1ca0e6ad05de85dade14caa9ec9aa8c42424db7ccc7988d63ef8f94c98a99283bed836d998ac988c7c4110f5301f9bd5800126ba26d2c3b12b2d51744111c5a70ef9bcc8e73b4d4be501ae9e6df934a9d71fdef48e38fbf82736203c2d1301b377a5b6ff74131a9592e6e229f8c0299d93e152b0652497f7bd93f4289f55cd35a33cd3f1c1bc86f610615a0c630ce14d30e630723e2e0e5c58c73bae1a329ea9fc4f822442a028e9f7f184da3f27d22558aed6ce9bade582735065514031dc8cfd5e401b996666ed8427e0f7efb992a255abd409e03cb3f6b7c01f9693fc2d5b20d9ac5c1867d78d7f74fd09e73aa960c25db6d8be42d0457086b90277ca07a0f152154a522cd12634594774c8136cdd2934dd9f8868e0eb4824c0197e53d1daf948198ad94e0a543d454ecd04dc7373f4d1d6e2c1075c54991ac34019f23285b33c37820013e9a404d97177200e43c1bfb531271ab6b91e0de9411add5da01d99aeedb48946d57225865e07ac216442d45f5af0d7ff7da3f100b80e2ade812f1700aab6b72f746b19cc72f2fbae3b73ed10d2c49b3a1082fd01a69e94fd7c16d5e20cfd2c664ceb4c2c4ecda11d6fd164aa2716d70f18378c6c8b40ae42f78140b362fc5b63a56f57165ffc3ee747e7d56bd66c1dd70b4e2991d498d94769ead2057b38b6a03483a52b150327a47a33b9d65f38d23a50135f22110ba86369a014488436e0b460b4c0db0c76fddd6d217c8a200186918d33878ddf2d9e3f6d6d820d3c7b4c18c07f3496a4dc13ea974db7f7c75abd85293b4d458d531d23fb9f95b3f27a6b35ca4f6aee8c872c549f24d69fc3a8e98daa772ad9aa30b7c98ab2e9ed44b8c0a3e4a1fe53122c89c3db2362f293709d0387937acac42af0989143d919b1baeedba6134964d410ce80d1e5d790c5564a8f56fce79959c65a09a5defdb9b8053855951fe69450f85d4429d8ceeab7ae64998f3febb5d97756954ec0c25dd60c5faa282450420727d8563968936108fd8dba96c8e1a0d1d268d3e2a5c1667a54a731e5dd112e6543a26f8731dfa437d8285b1424740ac15c234e17fa65743352b18534869399f9c05dd899b10e24a2a2c7037dcf1d242668f85c354b48f79fab012cbacd721543226d29f762a952f801ec4c3a4547bd8fad6a96e0f4c670fda20890ef2e1730dfee52fc16c33bcfa669fa8dd0137e174b8dec86a1a37870fbfc5a4a28050d7d0e78a1978e5f2feb1c3f9440e5b63ac2188f1083ddb3d968090e58c11c0ebf4a7d85cba4b4930045e8172c1dd1ba185e452559471bc253d6b35c969e3187c7399b6a43ac200b57508875347d3a7b714c7fe53928e23b923d795b9629ef2c9fbae6aabc1657249fab8bde4fd76686d00d175332b1a7abff1cc9afc9fccb59c35efdcb676bd08b43b750b6c0c51c68df10a9d3d869f28004e532bdc49f4c9bbc963f410815128bddf4759359ce92add917b5fb9cca49544e372309f889f96ee5e139b000ba93b2e8f368f85d4c8fa27852ba4ee24b229535733928e835484ff9c05b7cd3c4eaacdf24b95a5dc75a03178225225b7504cf4539e37f1639bfbb42d4331c03bc7dc63b18d53dddd7882c4106952a6ac0666f17fba08104ffc63d7b6d5f221319c38b77305b274ff5a0aa7f5078db92c5cdf10828fed327000242ee2c1e13845562893e1b998b469a29ea4d004eaa65fdb1f1a0525cfa1ee2ea6825611e54ca07c12bda2b3eee344d8a881496950b46c0a8ed6af8594a3f00f519abdcde8a6699660fe5ffb9d4ab7848f07073da92c7c71950e29b626819e298e40bdfbd18fc92d791ec0978c31eb2fbbfeb388dc56b6999a881ac06b832107c33afea5884de8c8c5e56c91a2df0760942ef453d17a4309070d2bac4df0a12e5a5129d2f428edefac1b0cf1c99e34a0825e73a570e04a4942650481b3124528b94de68bff6a002a968747bde8b49a76ed58d886a1d0f4e2b5584c47842f367b4af6dcd790594b02ebf2c6ffe66a606a3de2cafe4c91695bc6aeab06aa909cb27314b4be903ff3fe132431bead08af04dac5f116596cd03cdf2ecbc70c7d9e529e6e1648e56223a777e52f0324d6aecd2cc9f6d5b0a9510e67a25191923d64e532cda87e780b01837dfd68d5331c864c9cb5814439901658c6d0e86d241a17f397f915673181b51c8e33853cc2215e0990533969dd6844a263803662aa5adf0234ba030bf80e68fa13502e40b92e5f8d7169c74e827b0675a87ce3780c46e39c73d81b73b6f842a3721d0aea008bb05fa8c0d2fb110f8257fc8b98b732264c48bb1a04a651886aa1155fc24180807b089b200376736de0d3c774fd280542418f754966acb306097c62e1fd4d1f55e50eb45002c98edd496e7200b9d26be1ebf7072deb8ec2ba46bac36a6417c65118fb5a1a76fc4ca6e5b263f775be4d4d720ada8e395368eb4ae59fc19fa65ebd3c56f44408159412db260321d8f294ccfd505634f8038ce33c845daf5503cde178a8ec975f1e4d675452ba458b7826a7b450e3e7d1a716e8452067fc2e34fd05f578a9db241e61ee77bff12d3558ed26c092ea6e6b46ed438d402470d443d471db4e93d8fe1eb7ef6df40e9f7f98d090499ed19270e8fb3c3b6cfcd2ec373c6c51b21255962537b25d797b641042b62f76fd021b8595271a782d57ec21191c407f2d8e1c933bc97e70d79e44925d89497036e3d1545659276b099d8418f05b338e466ff39e68559dcd95e106aaf230275fd1de7b853279a93d8a36637cc4e38ea6861da35fb5c3559e3bab74020893116a565ae3c03270e915388b51f39e9b99ee7401f47d29fbef0852635442a79a4eb94ebfcfac5d242f1c9a021625856b9b8f9881ada1cde6b23561736f12d72d2875417408f1bb7ec379380479bc813bdeb17a069872a76ae84df0428d18a134e5c6b5e356385466ec559afa435d9af3a87aa3f97b99c270d777873876ff0c97ced33473802931c5f3d8494a3cb2d97c42159ac01fbd23e1c9dcafbdf16d213e2bc5458c506b59812029cc5e2c6345bcf4a8e7c54c87d4a304a4ef39c70be71144c371968ca7d484bb71ab9cdb18e69c055c136ec99edca0d1f6d014c08066f960f63ef9fd84abb40cd76f6e1178c504bf58a52560ac43be77fad9b6a474a6dcc986361e6babe5fb5b849f3b952be9dd68c52551d75611e740da92883b91b0a4c59ae16b9ec38a40efa0c36a30da5b0d49ca1b59f7464f0272bb83f04d7c8b379d5ac6495d75a36b11526365aa2d217eaa9010a7882405f756c83557a1e03f7f99ef6d217169366309c20893cbcb4516d33e8ca2529739ae34262f260063d56200815e59a3464e121f19395c5a5dcebf0bfd15b21c48f50e5400f9c332ad54ca1c37225bb9b4f05f9b7f7f28218ac5609bf5353fb0df4001fd7c1c98ff67c49e333a408d7b5d2632c41b615fe6fb31e1cb4d73b1d403236f78c21f0b2f392dc68eb24059b3e6f773e316676972571a29e32e5771515ca43e0efb8a8689ca982975c6ab2627fa6c0a409719af8d4789222bbf6ae5ef93ce57044fe670d6c30cb12f9e075ba03f8be023c70097fe7384b3eb2933767550a6a2a5e5b931decb92450663df62e65d5edbd4cea38a8f8216c46a933b8cad3a360738e68e31698b31cd403db8a2c1fdede49ad38af1061d443ef12608905dfa856f0479ead73fabf13226531c83f9c73ee4bffe3e322ceb1807c80924e84e389bc052c7578d27d2da5a00ce926d55625cc1897846b7c9959908376517fe489b81e46af85cbbeba8f52e16d5a3c89f774c6541692ae6a5c2cf298662673913cb3ec1943382c751d74996af91d5fc9dad17b62ef97329871bc353fc279e007671da4118a04f1a2204de7b152ab37118adc69e9a4ea8e739477c6ce2dd43bd3a355e4b3d684d1c25d9bdc38ec7c290d71e6104cb93518781ef025d80abdfd727bed1c64db3043524feed5863908cbfa4a9eecf0aeef77328bb5e0f1ebaf9b605b53b9c8ea8fbcee51b7620dcae986745f677e99f872112f6529769043219c29cc1a4b44970ba4d32d7610540496ef183ac0339d28757ccb25db5527a3ac863b48b15f6c532c91cd1dab5eed98897c326739ba7eb1621092683c1b4c7fa8c0114ba954a4c17b1a18acd7ac2ed949a47f6f5461b315b0831186dc276349bf00485f72d982447f9462758b96bc595ffe4bbd70c7ded7f93ac51c3c080094579d4cfeae4c896e929726e2279d0a9b24f013cc4f5b568a94be3992cc4ba8e1fb1d9ba3ac2c2ea26c98c29d4c2d9e013110842620aace702b63cb750d40c0a521f7b0e90cf6e682562fe1e159c6eb4e1cd6095595248b5b25e2075d8fb5ec7054b23929314b5580f7b2f168e10776b440b71fd52d57219e0cbf8996c3e980b61be370fec987d010b9d87d8e725dc4e6354a342f59c135ab5832aecb3a7a21f8eff214d4263b0ac424f6e2ec7e485a5672f5e2be9ae11c158102036563d644bb39647143e7e34a1db194cded6535bb877250a81d7145696f1fa403ffc08c6d6f90c132c88f0f328ff8389b1bd7d44cebcbd0f0c66d4c821aac7f4ce4e11b10a87e8eb5cc7c1d389d6168d6f246729315e7fd5943ff851a9a901a3adf45f0b2d86b2396da3fabe0b8759c1e0b21bf32784f3c5e10987d878162fb4a295fabe881df36428c6a29bf73bd58bcb10a088f956a245ba6d8a44d41ada9176d9ebb0637531d452d5c15295191054fae6fed2effd13bee913087f06dd89a1f16a39cb06b5f7f1b67b60ca2d4a948533db3db850a1ce9934a209705586c44cdaedecf5b806ca231b5e85ed07f5e9843f97662166695c3c64c396ff0b3d14fafb0d0d18c29034d248263ba26b4395bbe6c381f7777e4411411db5146f2cff131a70a31b6c7abc66067c87d1a05c2290ef079421cc080e7e92597197c8780fff00beb6e6feedeb471d087362ef67186d240aa987ad2e43ed211ecf705f4ccc2775a04f61c01047dd5571063ea08cfdb94b75c71161186ac5b415d9887ccebdf140bd7474fa0c5a91765f484bfbf55bdc2deff7a732ef0b6e14e596c566266ac62bbf3007f308acc9477c427247c7b93e9221403166dbae5009370e10677d5b0ffc4b8802f42dc3ee916dfb9cce2da04742b2aa974603dcd35ab34a52c5fb19327c0c864d45a229691cdd7bafd64d975f044b3dc11a901c5fd1005171c9c72b9973a731d02e9066a0b072cb95a84f26eea19402972aa9f75c34c72b57bb0a19aaa9c79174f71f00fd15d4f2348c5cd55ce2340002bd77f4324cafe1eae3eb6ccfe512af1fe77681e712acf876c99c2d118cd43fe81d229b49e1617a148893ab6ff13092ba47be71c671a2e641a936b5756a1bc83390d17409bb84febbf4295ef193ca422e5f1e5601f85dc37f7252f5f043b2a2c95fac08dba1c176c96dd60dbf9488c86177bfba02708697176d1a76ebde40d594d2dcde255cc0e9253cc24140bb112b3dd7c92430a0c46bf1e2b4bfcc046e6a7a30897e50b5285fb7a91481dcd20e73a9c7631df352c046f5194859fd7de46865c3da71c571a2e067fbf556fb9f26a98c8eb52cb34c22300b59ffcae41149d73cd1f83eeb5bd5751d7c8c4705ec02d4d075e8d9d85791311bec009ceb8846c0e7a30b6d293a6a25c17202dc627f49fc5cc424acca3bb5520d18745679a9822a4d813a87e9d508f93b267e9d7b20a42918c3902ef2c0379ac9268381f53da61d58b2ad1392f558f773e02913b699bb64ecb955e6b6aebf12375e54a4c90c59a1ef808d998c62012952e82ac57cb135b4c0f09a5c7fccf4c0400710475cde44bffa3102a13ee4ac97be85aa3b362fbb227cae8819b6e37faeca6adef3167b0e7e620e33b412430148a000d1fe4adcf4b5083c47a4c1bb07e4bed0e72e5fab60e70d5f49596f46a744e1a1c695228089754ce2fe850a1c3568057f53839f35e200e46c6b19bdb7479367b0b28824e3216a31e7d645f7ceb14485c049773ee23bd3cf7cc27b655c883e1c75bc60bacc659d9d95f66bf298228028daf194a47a1468b7d97607cdfd134be7380da44b04fc157932867f62443122d51774613ac514c582c9ae455e648fc5af40ccdc3e5490daae07b00aaf98853474bdfa66668ae4f41a9592be8058a5b15ed62291fd82c6f5235c9a93405dc7bdec15aa2c91932bfd65854bf99ca0fd19db423749ef56486dbf796ca27f5a9ec62767ad3a24a692e64de0017e18053e040ecc328f7c9abe4a6ca54fbfd359b3560cfb2b18858cc1b9b9f0dbd65e4f117bdfbc3ce80c14cf9511296b73a420ad7583184b4f1e0d5f7e90fb0288d4461d8536597cde078d2455954de7455b79352b7407356656f0 +0x26263445024bbdbd0518b331a7ab88e7bdc8d8344a3480d1c19ad0e7c7cb22447cf88e53d2536fd215e25c5158dbc52ef56585f7ab5b771387811a9f9afbdb7f diff --git a/src/sha512/formal/model/SHA512.luref b/src/sha512/formal/model/SHA512.luref new file mode 100644 index 000000000..262cdb555 --- /dev/null +++ b/src/sha512/formal/model/SHA512.luref @@ -0,0 +1,490 @@ +{ + "version": 17, + "module": { + "name": "SHA512", + "reset_signal": { + "signal": "(sha512_core.reset_n) && !(sha512_core.zeroize)", + "is_active_low": true + }, + "clock_signal": { + "signal": "clk", + "is_falling_edge": false + }, + "next_shift_amount": 0, + "rtl_module_name": "sha512_core", + "instance_name": "inst", + "default_assertion_duration": 1, + "default_disable_iff": "", + "reset": { + "documentation_comment": "" + }, + "additional_includes": "fv_constraints.sv", + "additional_imports": "", + "sync_macros": [ + { + "name": "SHA_Input_sync", + "datatype": "bool", + "refinement": "((sha512_core.init_cmd) || (sha512_core.next_cmd))", + "create_commitments": true, + "timing": 0, + "unused": false + } + ], + "notify_macros": [ + { + "name": "out_notify", + "datatype": "bool", + "refinement": "(sha512_core.digest_valid) && ((sha512_core.sha512_ctrl_reg==2'h0) && $past(sha512_core.sha512_ctrl_reg==2'h2) )", + "create_commitments": true, + "timing": 0, + "unused": false + }, + { + "name": "SHA_Input_notify", + "datatype": "bool", + "refinement": "sha512_core.ready", + "create_commitments": true, + "timing": 0, + "unused": false + } + ], + "input_datapath_macros": [ + { + "name": "SHA_Input_sig_in", + "datatype": "sc_big_unsigned_1024", + "refinement": "sha512_core.block_msg", + "create_commitments": true, + "timing": 0, + "unused": false + }, + { + "name": "SHA_Input_sig_init", + "datatype": "bool", + "refinement": "sha512_core.init_cmd", + "create_commitments": true, + "timing": 0, + "unused": false + }, + { + "name": "SHA_Input_sig_next", + "datatype": "bool", + "refinement": "sha512_core.next_cmd", + "create_commitments": true, + "timing": 0, + "unused": false + }, + { + "name": "SHA_Input_sig_SHA_Mode", + "datatype": "signed_32", + "refinement": "if(sha512_core.mode==0)\n\treturn 224;\nelse if(sha512_core.mode==1)\n\treturn 256;\nelse if(sha512_core.mode==2)\n\treturn 384;\nelse\n\treturn 512;", + "create_commitments": true, + "timing": 0, + "unused": false + }, + { + "name": "SHA_Input_sig_zeroize", + "datatype": "bool", + "refinement": "sha512_core.zeroize", + "create_commitments": true, + "timing": 0, + "unused": false + } + ], + "output_datapath_macros": [ + { + "name": "out_sig", + "datatype": "sc_big_unsigned_512", + "refinement": "sha512_core.digest", + "create_commitments": true, + "timing": 0, + "unused": false + } + ], + "state_macros": [ + { + "name": "DONE", + "datatype": "bool", + "refinement": "sha512_core.sha512_ctrl_reg==2'h2", + "create_commitments": true, + "timing": 0, + "unused": false + }, + { + "name": "IDLE", + "datatype": "bool", + "refinement": "sha512_core.sha512_ctrl_reg==2'h0", + "create_commitments": true, + "timing": 0, + "unused": false + }, + { + "name": "SHA_Rounds", + "datatype": "bool", + "refinement": "sha512_core.sha512_ctrl_reg==2'h1", + "create_commitments": true, + "timing": 0, + "unused": false + } + ], + "register_macros": [ + { + "name": "a", + "datatype": "sc_big_unsigned_64", + "refinement": "sha512_core.a_reg", + "create_commitments": true, + "timing": 0, + "unused": false + }, + { + "name": "b", + "datatype": "sc_big_unsigned_64", + "refinement": "sha512_core.b_reg", + "create_commitments": true, + "timing": 0, + "unused": false + }, + { + "name": "c", + "datatype": "sc_big_unsigned_64", + "refinement": "sha512_core.c_reg", + "create_commitments": true, + "timing": 0, + "unused": false + }, + { + "name": "d", + "datatype": "sc_big_unsigned_64", + "refinement": "sha512_core.d_reg", + "create_commitments": true, + "timing": 0, + "unused": false + }, + { + "name": "e", + "datatype": "sc_big_unsigned_64", + "refinement": "sha512_core.e_reg", + "create_commitments": true, + "timing": 0, + "unused": false + }, + { + "name": "f", + "datatype": "sc_big_unsigned_64", + "refinement": "sha512_core.f_reg", + "create_commitments": true, + "timing": 0, + "unused": false + }, + { + "name": "g", + "datatype": "sc_big_unsigned_64", + "refinement": "sha512_core.g_reg", + "create_commitments": true, + "timing": 0, + "unused": false + }, + { + "name": "h", + "datatype": "sc_big_unsigned_64", + "refinement": "sha512_core.h_reg", + "create_commitments": true, + "timing": 0, + "unused": false + }, + { + "name": "H_0", + "datatype": "sc_big_unsigned_64", + "refinement": "sha512_core.H0_reg", + "create_commitments": true, + "timing": 0, + "unused": false + }, + { + "name": "H_1", + "datatype": "sc_big_unsigned_64", + "refinement": "sha512_core.H1_reg", + "create_commitments": true, + "timing": 0, + "unused": false + }, + { + "name": "H_2", + "datatype": "sc_big_unsigned_64", + "refinement": "sha512_core.H2_reg", + "create_commitments": true, + "timing": 0, + "unused": false + }, + { + "name": "H_3", + "datatype": "sc_big_unsigned_64", + "refinement": "sha512_core.H3_reg", + "create_commitments": true, + "timing": 0, + "unused": false + }, + { + "name": "H_4", + "datatype": "sc_big_unsigned_64", + "refinement": "sha512_core.H4_reg", + "create_commitments": true, + "timing": 0, + "unused": false + }, + { + "name": "H_5", + "datatype": "sc_big_unsigned_64", + "refinement": "sha512_core.H5_reg", + "create_commitments": true, + "timing": 0, + "unused": false + }, + { + "name": "H_6", + "datatype": "sc_big_unsigned_64", + "refinement": "sha512_core.H6_reg", + "create_commitments": true, + "timing": 0, + "unused": false + }, + { + "name": "H_7", + "datatype": "sc_big_unsigned_64", + "refinement": "sha512_core.H7_reg", + "create_commitments": true, + "timing": 0, + "unused": false + }, + { + "name": "i", + "datatype": "signed_32", + "refinement": "sha512_core.round_ctr_reg", + "create_commitments": true, + "timing": 0, + "unused": false + }, + { + "name": "W_0", + "datatype": "sc_big_unsigned_64", + "refinement": "sha512_core.w_mem_inst.w_mem[00]", + "create_commitments": true, + "timing": 0, + "unused": false + }, + { + "name": "W_1", + "datatype": "sc_big_unsigned_64", + "refinement": "sha512_core.w_mem_inst.w_mem[01]", + "create_commitments": true, + "timing": 0, + "unused": false + }, + { + "name": "W_10", + "datatype": "sc_big_unsigned_64", + "refinement": "sha512_core.w_mem_inst.w_mem[10]", + "create_commitments": true, + "timing": 0, + "unused": false + }, + { + "name": "W_11", + "datatype": "sc_big_unsigned_64", + "refinement": "sha512_core.w_mem_inst.w_mem[11]", + "create_commitments": true, + "timing": 0, + "unused": false + }, + { + "name": "W_12", + "datatype": "sc_big_unsigned_64", + "refinement": "sha512_core.w_mem_inst.w_mem[12]", + "create_commitments": true, + "timing": 0, + "unused": false + }, + { + "name": "W_13", + "datatype": "sc_big_unsigned_64", + "refinement": "sha512_core.w_mem_inst.w_mem[13]", + "create_commitments": true, + "timing": 0, + "unused": false + }, + { + "name": "W_14", + "datatype": "sc_big_unsigned_64", + "refinement": "sha512_core.w_mem_inst.w_mem[14]", + "create_commitments": true, + "timing": 0, + "unused": false + }, + { + "name": "W_15", + "datatype": "sc_big_unsigned_64", + "refinement": "sha512_core.w_mem_inst.w_mem[15]", + "create_commitments": true, + "timing": 0, + "unused": false + }, + { + "name": "W_2", + "datatype": "sc_big_unsigned_64", + "refinement": "sha512_core.w_mem_inst.w_mem[02]", + "create_commitments": true, + "timing": 0, + "unused": false + }, + { + "name": "W_3", + "datatype": "sc_big_unsigned_64", + "refinement": "sha512_core.w_mem_inst.w_mem[03]", + "create_commitments": true, + "timing": 0, + "unused": false + }, + { + "name": "W_4", + "datatype": "sc_big_unsigned_64", + "refinement": "sha512_core.w_mem_inst.w_mem[04]", + "create_commitments": true, + "timing": 0, + "unused": false + }, + { + "name": "W_5", + "datatype": "sc_big_unsigned_64", + "refinement": "sha512_core.w_mem_inst.w_mem[05]", + "create_commitments": true, + "timing": 0, + "unused": false + }, + { + "name": "W_6", + "datatype": "sc_big_unsigned_64", + "refinement": "sha512_core.w_mem_inst.w_mem[06]", + "create_commitments": true, + "timing": 0, + "unused": false + }, + { + "name": "W_7", + "datatype": "sc_big_unsigned_64", + "refinement": "sha512_core.w_mem_inst.w_mem[07]", + "create_commitments": true, + "timing": 0, + "unused": false + }, + { + "name": "W_8", + "datatype": "sc_big_unsigned_64", + "refinement": "sha512_core.w_mem_inst.w_mem[08]", + "create_commitments": true, + "timing": 0, + "unused": false + }, + { + "name": "W_9", + "datatype": "sc_big_unsigned_64", + "refinement": "sha512_core.w_mem_inst.w_mem[09]", + "create_commitments": true, + "timing": 0, + "unused": false + }, + { + "name": "MSG_digest", + "datatype": "sc_big_unsigned_512", + "refinement": "", + "create_commitments": true, + "timing": 0, + "unused": true + } + ], + "assertions": [ + { + "name": "DONE_to_IDLE", + "disable_iff": "", + "duration": -1, + "documentation_comment": "", + "unused": false + }, + { + "name": "IDLE_to_SHA_Rounds", + "disable_iff": "", + "duration": -1, + "documentation_comment": "", + "unused": false + }, + { + "name": "IDLE_to_SHA_Rounds_1", + "disable_iff": "", + "duration": -1, + "documentation_comment": "", + "unused": false + }, + { + "name": "IDLE_to_SHA_Rounds_2", + "disable_iff": "", + "duration": -1, + "documentation_comment": "", + "unused": false + }, + { + "name": "IDLE_to_SHA_Rounds_3", + "disable_iff": "", + "duration": -1, + "documentation_comment": "", + "unused": false + }, + { + "name": "IDLE_to_SHA_Rounds_4", + "disable_iff": "", + "duration": -1, + "documentation_comment": "", + "unused": false + }, + { + "name": "SHA_Rounds_to_DONE", + "disable_iff": "", + "duration": -1, + "documentation_comment": "", + "unused": false + }, + { + "name": "SHA_Rounds_to_SHA_Rounds", + "disable_iff": "", + "duration": -1, + "documentation_comment": "", + "unused": false + }, + { + "name": "SHA_Rounds_to_SHA_Rounds_1", + "disable_iff": "", + "duration": -1, + "documentation_comment": "", + "unused": false + }, + { + "name": "IDLE_to_IDLE", + "disable_iff": "", + "duration": -1, + "documentation_comment": "", + "unused": true + }, + { + "name": "IDLE_to_SHA_Rounds_5", + "disable_iff": "", + "duration": -1, + "documentation_comment": "", + "unused": true + } + ], + "waits": [ + { + "name": "IDLE_wait", + "documentation_comment": "", + "unused": false + } + ] + } +} \ No newline at end of file diff --git a/src/sha512/formal/model/refinement.luctrl b/src/sha512/formal/model/refinement.luctrl new file mode 100644 index 000000000..7b7979b22 --- /dev/null +++ b/src/sha512/formal/model/refinement.luctrl @@ -0,0 +1,9 @@ +{ + "version": 13, + "modules": [ + { + "name": "SHA512", + "path": "SHA512.luref" + } + ] +} \ No newline at end of file diff --git a/src/sha512/formal/model/sha512.h b/src/sha512/formal/model/sha512.h new file mode 100644 index 000000000..357080d88 --- /dev/null +++ b/src/sha512/formal/model/sha512.h @@ -0,0 +1,393 @@ +#ifndef SHA +#define SHA + +#include +#include "systemc.h" +#include "string.h" +#include "Interfaces.h" +using namespace std; +#define NUM_ROUNDS 80 + +//----------------------------------------------------------------------------- +//----------------------------------------------------------------------------- + + sc_biguint<64> slicer(sc_biguint<1024> block, int index) { + switch (index){ + case 0: + return static_cast> (block >> sc_biguint<1024>(64 * 0)); + break; + case 1: + return static_cast> (block >> sc_biguint<1024>(64 * 1)); + break; + case 2: + return static_cast> (block >> sc_biguint<1024>(64 * 2)); + break; + case 3: + return static_cast> (block >> sc_biguint<1024>(64 * 3)); + break; + case 4: + return static_cast> (block >> sc_biguint<1024>(64 * 4)); + break; + case 5: + return static_cast> (block >> sc_biguint<1024>(64 * 5)); + break; + case 6: + return static_cast> (block >> sc_biguint<1024>(64 * 6)); + break; + case 7: + return static_cast> (block >> sc_biguint<1024>(64 * 7)); + break; + case 8: + return static_cast> (block >> sc_biguint<1024>(64 * 8)); + break; + case 9: + return static_cast> (block >> sc_biguint<1024>(64 * 9)); + break; + case 10: + return static_cast> (block >> sc_biguint<1024>(64 * 10)); + break; + case 11: + return static_cast> (block >> sc_biguint<1024>(64 * 11)); + break; + case 12: + return static_cast> (block >> sc_biguint<1024>(64 * 12)); + break; + case 13: + return static_cast> (block >> sc_biguint<1024>(64 * 13)); + break; + case 14: + return static_cast> (block >> sc_biguint<1024>(64 * 14)); + break; + case 15: + return static_cast> (block >> sc_biguint<1024>(64 * 15)); + break; + default: + return static_cast> (block >> sc_biguint<1024>(64 * 15)); + break; + } +} + +sc_biguint<64> Ch(sc_biguint<64> a, sc_biguint<64> b, sc_biguint<64> c) { + return static_cast>((a & b) ^ (~a & c)); +} + +sc_biguint<64> Maj(sc_biguint<64> x, sc_biguint<64> y, sc_biguint<64> z) { + return static_cast>((x & y) ^ (x & z) ^ (y & z)); +} + +sc_biguint<64> shr6(sc_biguint<64> n) { + return static_cast>(n >> sc_biguint<64>(6)); +} + +sc_biguint<64> shr7(sc_biguint<64> n) { + return static_cast>(n >> sc_biguint<64>(7)); +} + +sc_biguint<64> rotr1(sc_biguint<64> n) { + return static_cast>((n >> (sc_biguint<64>(1))) | (n << (sc_biguint<64>(63)))); +} + +sc_biguint<64> rotr8(sc_biguint<64> n) { + return static_cast>((n >> (sc_biguint<64>(8))) | (n << (sc_biguint<64>(56)))); +} + +sc_biguint<64> rotr14(sc_biguint<64> n) { + return static_cast>((n >> (sc_biguint<64>(14))) | (n << (sc_biguint<64>(50)))); +} + +sc_biguint<64> rotr18(sc_biguint<64> n) { + return static_cast>((n >> (sc_biguint<64>(18))) | (n << (sc_biguint<64>(46)))); +} + +sc_biguint<64> rotr19(sc_biguint<64> n) { + return static_cast>((n >> (sc_biguint<64>(19))) | (n << (sc_biguint<64>(45)))); +} + +sc_biguint<64> rotr28(sc_biguint<64> n) { + return static_cast>((n >> (sc_biguint<64>(28))) | (n << (sc_biguint<64>(36)))); +} + +sc_biguint<64> rotr34(sc_biguint<64> n) { + return static_cast>((n >> (sc_biguint<64>(34))) | (n << (sc_biguint<64>(30)))); +} + +sc_biguint<64> rotr39(sc_biguint<64> n) { + return static_cast>((n >> (sc_biguint<64>(39))) | (n << (sc_biguint<64>(25)))); +} + +sc_biguint<64> rotr41(sc_biguint<64> n) { + return static_cast>((n >> (sc_biguint<64>(41))) | (n << (sc_biguint<64>(23)))); +} + +sc_biguint<64> rotr61(sc_biguint<64> n) { + return static_cast>((n >> (sc_biguint<64>(61))) | (n << (sc_biguint<64>(3)))); +} + +sc_biguint<64> sigma0(sc_biguint<64> x){ + return static_cast> (rotr28(x) ^ rotr34(x) ^ rotr39(x)); +} + +sc_biguint<64> sigma1(sc_biguint<64> x) { + return static_cast> (rotr14(x) ^ rotr18(x) ^ rotr41(x)); +} + +sc_biguint<64> delta0(sc_biguint<64> x) { + return static_cast> (rotr1(x) ^ rotr8(x) ^ shr7(x)); +} + +sc_biguint<64> delta1(sc_biguint<64> x) { + return static_cast> (rotr19(x) ^ rotr61(x) ^ shr6(x)); +} + +sc_biguint<64> T1(sc_biguint<64> e, sc_biguint<64> f, sc_biguint<64> g, sc_biguint<64> h, sc_biguint<64> k, sc_biguint<64> w) { + return static_cast>(h + sigma1(e) + Ch(e, f, g) + k + w); +} + +sc_biguint<64> T2(sc_biguint<64> a, sc_biguint<64> b, sc_biguint<64> c) { + return static_cast>(sigma0(a) + Maj(a, b, c)); +} +sc_biguint<64> compute_e(sc_biguint<64> d,sc_biguint<64> e, sc_biguint<64> f, sc_biguint<64> g, sc_biguint<64> h, sc_biguint<64> k, sc_biguint<64> w) { + return static_cast>(d+ h + sigma1(e) + Ch(e, f, g) + k + w); +} +sc_biguint<64> compute_a(sc_biguint<64> e, sc_biguint<64> f, sc_biguint<64> g, sc_biguint<64> h, sc_biguint<64> k, sc_biguint<64> w,sc_biguint<64> a, sc_biguint<64> b, sc_biguint<64> c) { + return static_cast>((static_cast>(h + sigma1(e) + Ch(e, f, g) + k + w))+(static_cast>(sigma0(a) + Maj(a, b, c)))); +} + +sc_biguint<64> compute_w(sc_biguint<64> w14, sc_biguint<64> w9, sc_biguint<64> w1, sc_biguint<64> w0) { + return static_cast>(delta1(w14) + w9 + delta0(w1) + w0); +} + +sc_biguint<512> compute_dig (sc_biguint<512> dig,sc_biguint<64> h7, sc_biguint<64> h6, sc_biguint<64> h5, sc_biguint<64> h4,sc_biguint<64> h3,sc_biguint<64> h2, sc_biguint<64> h1, sc_biguint<64> h0){ + dig += static_cast> (h6 << sc_biguint<64>(448)); + dig = static_cast> (dig >> sc_biguint<512>(64)); + dig += static_cast> (h6 << sc_biguint<64>(448)); + dig = static_cast> (dig >> sc_biguint<512>(64)); + dig += static_cast> (h5 << sc_biguint<64>(448)); + dig = static_cast> (dig >> sc_biguint<512>(64)); + dig += static_cast> (h4 << sc_biguint<64>(448)); + dig = static_cast> (dig >> sc_biguint<512>(64)); + dig += static_cast> (h3 << sc_biguint<64>(448)); + dig = static_cast> (dig >> sc_biguint<512>(64)); + dig += static_cast> (h2 << sc_biguint<64>(448)); + dig = static_cast> (dig >> sc_biguint<512>(64)); + dig += static_cast> (h1 << sc_biguint<64>(448)); + dig = static_cast> (dig >> sc_biguint<512>(64)); + dig += static_cast> (h0 << sc_biguint<64>(448)); + + return(dig); + +} +struct SHA_Args{ + sc_biguint<1024> in; + int SHA_Mode; + bool init; + bool next; + bool zeroize; +}; +//----------------------------------------------------------------------------- +//----------------------------------------------------------------------------- + const array , 80> K = + {sc_biguint<64>(0x428a2f98d728ae22), sc_biguint<64>(0x7137449123ef65cd), sc_biguint<64>(0xb5c0fbcfec4d3b2f),\ + sc_biguint<64>(0xe9b5dba58189dbbc), sc_biguint<64>(0x3956c25bf348b538), sc_biguint<64>(0x59f111f1b605d019),\ + sc_biguint<64>(0x923f82a4af194f9b), sc_biguint<64>(0xab1c5ed5da6d8118), sc_biguint<64>(0xd807aa98a3030242),\ + sc_biguint<64>(0x12835b0145706fbe), sc_biguint<64>(0x243185be4ee4b28c), sc_biguint<64>(0x550c7dc3d5ffb4e2),\ + sc_biguint<64>(0x72be5d74f27b896f), sc_biguint<64>(0x80deb1fe3b1696b1), sc_biguint<64>(0x9bdc06a725c71235),\ + sc_biguint<64>(0xc19bf174cf692694), sc_biguint<64>(0xe49b69c19ef14ad2), sc_biguint<64>(0xefbe4786384f25e3),\ + sc_biguint<64>(0x0fc19dc68b8cd5b5), sc_biguint<64>(0x240ca1cc77ac9c65), sc_biguint<64>(0x2de92c6f592b0275),\ + sc_biguint<64>(0x4a7484aa6ea6e483), sc_biguint<64>(0x5cb0a9dcbd41fbd4), sc_biguint<64>(0x76f988da831153b5),\ + sc_biguint<64>(0x983e5152ee66dfab), sc_biguint<64>(0xa831c66d2db43210), sc_biguint<64>(0xb00327c898fb213f),\ + sc_biguint<64>(0xbf597fc7beef0ee4), sc_biguint<64>(0xc6e00bf33da88fc2), sc_biguint<64>(0xd5a79147930aa725),\ + sc_biguint<64>(0x06ca6351e003826f), sc_biguint<64>(0x142929670a0e6e70), sc_biguint<64>(0x27b70a8546d22ffc),\ + sc_biguint<64>(0x2e1b21385c26c926), sc_biguint<64>(0x4d2c6dfc5ac42aed), sc_biguint<64>(0x53380d139d95b3df),\ + sc_biguint<64>(0x650a73548baf63de), sc_biguint<64>(0x766a0abb3c77b2a8), sc_biguint<64>(0x81c2c92e47edaee6),\ + sc_biguint<64>(0x92722c851482353b), sc_biguint<64>(0xa2bfe8a14cf10364), sc_biguint<64>(0xa81a664bbc423001),\ + sc_biguint<64>(0xc24b8b70d0f89791), sc_biguint<64>(0xc76c51a30654be30), sc_biguint<64>(0xd192e819d6ef5218),\ + sc_biguint<64>(0xd69906245565a910), sc_biguint<64>(0xf40e35855771202a), sc_biguint<64>(0x106aa07032bbd1b8),\ + sc_biguint<64>(0x19a4c116b8d2d0c8), sc_biguint<64>(0x1e376c085141ab53), sc_biguint<64>(0x2748774cdf8eeb99),\ + sc_biguint<64>(0x34b0bcb5e19b48a8), sc_biguint<64>(0x391c0cb3c5c95a63), sc_biguint<64>(0x4ed8aa4ae3418acb),\ + sc_biguint<64>(0x5b9cca4f7763e373), sc_biguint<64>(0x682e6ff3d6b2b8a3), sc_biguint<64>(0x748f82ee5defb2fc),\ + sc_biguint<64>(0x78a5636f43172f60), sc_biguint<64>(0x84c87814a1f0ab72), sc_biguint<64>(0x8cc702081a6439ec),\ + sc_biguint<64>(0x90befffa23631e28), sc_biguint<64>(0xa4506cebde82bde9), sc_biguint<64>(0xbef9a3f7b2c67915),\ + sc_biguint<64>(0xc67178f2e372532b), sc_biguint<64>(0xca273eceea26619c), sc_biguint<64>(0xd186b8c721c0c207),\ + sc_biguint<64>(0xeada7dd6cde0eb1e), sc_biguint<64>(0xf57d4f7fee6ed178), sc_biguint<64>(0x06f067aa72176fba),\ + sc_biguint<64>(0x0a637dc5a2c898a6), sc_biguint<64>(0x113f9804bef90dae), sc_biguint<64>(0x1b710b35131c471b),\ + sc_biguint<64>(0x28db77f523047d84), sc_biguint<64>(0x32caab7b40c72493), sc_biguint<64>(0x3c9ebe0a15c9bebc),\ + sc_biguint<64>(0x431d67c49c100d4c), sc_biguint<64>(0x4cc5d4becb3e42b6), sc_biguint<64>(0x597f299cfc657e2a),\ + sc_biguint<64>(0x5fcb6fab3ad6faec), sc_biguint<64>(0x6c44198c4a475817)};; + +SC_MODULE(SHA512) { + + blocking_in SHA_Input; + master_out > out; + + array , 16> W; + array , 8> H; + + sc_biguint<64> t1 = sc_biguint<64> (0), t2 = sc_biguint<64> (0), + a = sc_biguint<64> (0), b = sc_biguint<64> (0), + c = sc_biguint<64> (0), d = sc_biguint<64> (0), + e = sc_biguint<64> (0), f = sc_biguint<64> (0), + g = sc_biguint<64> (0), h = sc_biguint<64> (0), + w = sc_biguint<64> (0), k = sc_biguint<64> (0); + sc_biguint<64> tmp_w; + + sc_biguint<1024> block_in; + sc_biguint<1024> block_copy; + sc_biguint<512> MSG_digest; + + SHA_Args SHA_in; + int SHA_Mode_in; + bool init, next, success, zeroize; + + int i, j, m=0; + + void fsm(); + + SC_CTOR(SHA512){ + SC_THREAD(fsm); + } +}; + +void SHA512::fsm(){ + +while(true){ + + SHA_Input->read(SHA_in, "IDLE"); + + block_in = SHA_in.in; + SHA_Mode_in = SHA_in.SHA_Mode; + init = SHA_in.init; + next = SHA_in.next; + zeroize = SHA_in.zeroize; + + if (init){ + switch (SHA_Mode_in){ + case 224: + H ={sc_biguint<64>(0x8c3d37c819544da2), sc_biguint<64>(0x73e1996689dcd4d6),\ + sc_biguint<64>(0x1dfab7ae32ff9c82), sc_biguint<64>(0x679dd514582f9fcf),\ + sc_biguint<64>(0x0f6d2b697bd44da8), sc_biguint<64>(0x77e36f7304c48942),\ + sc_biguint<64>(0x3f9d85a86a1d36c8), sc_biguint<64>(0x1112e6ad91d692a1)}; + break; + case 256: + H ={sc_biguint<64>(0x22312194fc2bf72c), sc_biguint<64>(0x9f555fa3c84c64c2),\ + sc_biguint<64>(0x2393b86b6f53b151), sc_biguint<64>(0x963877195940eabd),\ + sc_biguint<64>(0x96283ee2a88effe3), sc_biguint<64>(0xbe5e1e2553863992),\ + sc_biguint<64>(0x2b0199fc2c85b8aa), sc_biguint<64>(0x0eb72ddc81c52ca2)}; + break; + /*case 384: + H ={sc_biguint<64>(0xcbbb9d5dc1059ed8), sc_biguint<64>(0x629a292a367cd507),\ + sc_biguint<64>(0x9159015a3070dd17), sc_biguint<64>(0x152fecd8f70e5939),\ + sc_biguint<64>(0x67332667ffc00b31), sc_biguint<64>(0x8eb44a8768581511),\ + sc_biguint<64>(0xdb0c2e0d64f98fa7), sc_biguint<64>(0x47b5481dbefa4fa4)}; + break;*/ + case 512: + H ={sc_biguint<64>(0x6a09e667f3bcc908), sc_biguint<64>(0xbb67ae8584caa73b),\ + sc_biguint<64>(0x3c6ef372fe94f82b), sc_biguint<64>(0xa54ff53a5f1d36f1),\ + sc_biguint<64>(0x510e527fade682d1), sc_biguint<64>(0x9b05688c2b3e6c1f),\ + sc_biguint<64>(0x1f83d9abfb41bd6b), sc_biguint<64>(0x5be0cd19137e2179)}; + + break; + default: + H ={sc_biguint<64>(0xcbbb9d5dc1059ed8), sc_biguint<64>(0x629a292a367cd507),\ + sc_biguint<64>(0x9159015a3070dd17), sc_biguint<64>(0x152fecd8f70e5939),\ + sc_biguint<64>(0x67332667ffc00b31), sc_biguint<64>(0x8eb44a8768581511),\ + sc_biguint<64>(0xdb0c2e0d64f98fa7), sc_biguint<64>(0x47b5481dbefa4fa4)}; + break; + } + + t1 = sc_biguint<64> (0); t2 = sc_biguint<64> (0); + a = sc_biguint<64> (0); b = sc_biguint<64> (0); + c = sc_biguint<64> (0); d = sc_biguint<64> (0); + e = sc_biguint<64> (0); f = sc_biguint<64> (0); + g = sc_biguint<64> (0); h = sc_biguint<64> (0); + w = sc_biguint<64> (0); k = sc_biguint<64> (0); + W = {sc_biguint<64>(0)}; + } + + //next(block_in); + //W_schedule(block_in); + block_copy = block_in; + + for (j=0; j<16; ++j) { + W[15-j] = slicer(block_copy, j); + }; + + //copy_digest(); + a = H[0]; b = H[1];c = H[2]; d = H[3]; + e = H[4]; f = H[5];g = H[6]; h = H[7]; + + for (i=0; i> (H[7] << (sc_biguint<64>(448))); + for (j=6; j > -1; --j) { + MSG_digest = static_cast> (MSG_digest >> sc_biguint<512>(64)); + MSG_digest += static_cast> (H[j] << sc_biguint<64>(448)); + } + //MSG_digest = compute_dig(static_cast>(0),H[7],H[6],H[5],H[4],H[3],H[2],H[1],H[0]); + //MSG_digest = concati(MSG_digest, H, j); + /* BYME: to comply with rtl + switch (SHA_Mode_in){ + case 224: + MSG_digest = static_cast> (MSG_digest >> sc_biguint<512>(288)); + break; + case 256: + MSG_digest = static_cast> (MSG_digest >> sc_biguint<512>(256)); + break; + case 384: + MSG_digest = static_cast> (MSG_digest >> sc_biguint<512>(128)); + break; + default: + MSG_digest = static_cast> (MSG_digest); + break; + }*/ + + out->master_write(static_cast> (MSG_digest)); + + //}; + + //out->write(static_cast> (MSG_digest >> static_cast>(512-SHA_Mode_in))); + } +}; +#endif diff --git a/src/sha512/formal/properties/fv_constraints.sv b/src/sha512/formal/properties/fv_constraints.sv new file mode 100644 index 000000000..2ffc12032 --- /dev/null +++ b/src/sha512/formal/properties/fv_constraints.sv @@ -0,0 +1,49 @@ +// ------------------------------------------------- +// Contact: contact@lubis-eda.com +// Author: Tobias Ludwig, Michael Schwarz +// ------------------------------------------------- +// SPDX-License-Identifier: Apache-2.0 +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +module fv_constraints_m(init_cmd, next_cmd, reset_n, clk); + input bit init_cmd, next_cmd, reset_n, clk; + reg init_reg; +default clocking default_clk @(posedge clk); endclocking + + remove_init_next_together_a: assume property (remove_init_next_together); + property remove_init_next_together; + !(init_cmd && next_cmd); + endproperty + + init_next_order_a: assume property (init_next_order); + property init_next_order; + !init_reg |-> !next_cmd; + endproperty + + always @ (posedge clk or negedge reset_n) + begin : init_reg_order + if (!reset_n) + init_reg <= 1'b0; + else if (init_cmd) + init_reg <= 1'b1; + end + +endmodule + +bind sha512_core fv_constraints_m fv_constraints( + .init_cmd(init_cmd), + .next_cmd(next_cmd), + .reset_n(reset_n), + .clk(clk) +); \ No newline at end of file diff --git a/src/sha512/formal/properties/fv_sha512.sv b/src/sha512/formal/properties/fv_sha512.sv new file mode 100644 index 000000000..f36f06ff0 --- /dev/null +++ b/src/sha512/formal/properties/fv_sha512.sv @@ -0,0 +1,644 @@ +// ------------------------------------------------- +// Contact: contact@lubis-eda.com +// Author: Tobias Ludwig, Michael Schwarz +// ------------------------------------------------- +// SPDX-License-Identifier: Apache-2.0 +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +import fv_sha512_pkg::*; + + +module fv_sha_512_m( + input bit rst, + input bit clk, + input bit unsigned [1023:0] block_in, + input bit unsigned [31:0] block_sha_mode, + input bit block_init, + input bit block_next, + input bit block_zeroize, + input bit unsigned [511:0] digest_out, + input bit block_in_valid, + input bit block_in_ready, + input bit digest_valid, + input bit unsigned [63:0] H_0, + input bit unsigned [63:0] H_1, + input bit unsigned [63:0] H_2, + input bit unsigned [63:0] H_3, + input bit unsigned [63:0] H_4, + input bit unsigned [63:0] H_5, + input bit unsigned [63:0] H_6, + input bit unsigned [63:0] H_7, + input bit unsigned [63:0] W_0, + input bit unsigned [63:0] W_1, + input bit unsigned [63:0] W_2, + input bit unsigned [63:0] W_3, + input bit unsigned [63:0] W_4, + input bit unsigned [63:0] W_5, + input bit unsigned [63:0] W_6, + input bit unsigned [63:0] W_7, + input bit unsigned [63:0] W_8, + input bit unsigned [63:0] W_9, + input bit unsigned [63:0] W_10, + input bit unsigned [63:0] W_11, + input bit unsigned [63:0] W_12, + input bit unsigned [63:0] W_13, + input bit unsigned [63:0] W_14, + input bit unsigned [63:0] W_15, + input bit unsigned [63:0] a, + input bit unsigned [63:0] b, + input bit unsigned [63:0] c, + input bit unsigned [63:0] d, + input bit unsigned [63:0] e, + input bit unsigned [63:0] f, + input bit unsigned [63:0] g, + input bit unsigned [63:0] h, + input bit unsigned [6:0] i, + input bit IDLE, + input bit SHA_Rounds, + input bit DONE +); + + +default clocking default_clk @(posedge clk); endclocking + +logic [15:0][63:0] W; +logic [3:0] j; + +assign j = i[3:0]; +assign W = {W_15,W_14,W_13,W_12,W_11,W_10,W_9,W_8,W_7,W_6,W_5,W_4,W_3,W_2,W_1,W_0}; + + +sequence reset_sequence; + !rst ##1 rst; +endsequence + + +reset_a: assert property (reset_p); +property reset_p; + reset_sequence |-> + IDLE && + H_0 == 64'd0 && + H_1 == 64'd0 && + H_2 == 64'd0 && + H_3 == 64'd0 && + H_4 == 64'd0 && + H_5 == 64'd0 && + H_6 == 64'd0 && + H_7 == 64'd0 && + W_0 == 64'd0 && + W_10 == 64'd0 && + W_11 == 64'd0 && + W_12 == 64'd0 && + W_13 == 64'd0 && + W_14 == 64'd0 && + W_15 == 64'd0 && + W_1 == 64'd0 && + W_2 == 64'd0 && + W_3 == 64'd0 && + W_4 == 64'd0 && + W_5 == 64'd0 && + W_6 == 64'd0 && + W_7 == 64'd0 && + W_8 == 64'd0 && + W_9 == 64'd0 && + a == 64'd0 && + b == 64'd0 && + c == 64'd0 && + d == 64'd0 && + e == 64'd0 && + f == 64'd0 && + g == 64'd0 && + h == 64'd0 && + i == 'sd0 && + block_in_ready == 1 && + digest_valid == 0; +endproperty + + +DONE_to_IDLE_a: assert property (disable iff(!rst) DONE_to_IDLE_p); +property DONE_to_IDLE_p; + DONE +|-> + ##1 + IDLE && + H_0 == 64'(($past(H_0, 1) + $past(a, 1))) && + H_1 == 64'(($past(H_1, 1) + $past(b, 1))) && + H_2 == 64'(($past(H_2, 1) + $past(c, 1))) && + H_3 == 64'(($past(H_3, 1) + $past(d, 1))) && + H_4 == 64'(($past(H_4, 1) + $past(e, 1))) && + H_5 == 64'(($past(H_5, 1) + $past(f, 1))) && + H_6 == 64'(($past(H_6, 1) + $past(g, 1))) && + H_7 == 64'(($past(H_7, 1) + $past(h, 1))) && + W_0 == $past(W_0, 1) && + W_10 == $past(W_10, 1) && + W_11 == $past(W_11, 1) && + W_12 == $past(W_12, 1) && + W_13 == $past(W_13, 1) && + W_14 == $past(W_14, 1) && + W_15 == $past(W_15, 1) && + W_1 == $past(W_1, 1) && + W_2 == $past(W_2, 1) && + W_3 == $past(W_3, 1) && + W_4 == $past(W_4, 1) && + W_5 == $past(W_5, 1) && + W_6 == $past(W_6, 1) && + W_7 == $past(W_7, 1) && + W_8 == $past(W_8, 1) && + W_9 == $past(W_9, 1) && + a == $past(a, 1) && + b == $past(b, 1) && + c == $past(c, 1) && + d == $past(d, 1) && + e == $past(e, 1) && + f == $past(f, 1) && + g == $past(g, 1) && + h == $past(h, 1) && + i == $past(i, 1) && + digest_out == $past(compute_digest(H_7,h,H_6,g,H_5,f,H_4,e,H_3,d,H_2,c,H_1,b,H_0,a)) && + block_in_ready == 1 && + digest_valid == 1; +endproperty + + +IDLE_to_SHA_Rounds_a: assert property (disable iff(!rst) IDLE_to_SHA_Rounds_p); +property IDLE_to_SHA_Rounds_p; + IDLE && + block_in_valid && + block_init && + (block_sha_mode == 'sd224) +|-> + ##1 (block_in_ready == 0) and + ##1 (digest_valid == 0) and + ##1 + SHA_Rounds && + H_0 == 64'd10105294471447203234 && + H_1 == 64'd8350123849800275158 && + H_2 == 64'd2160240930085379202 && + H_3 == 64'd7466358040605728719 && + H_4 == 64'd1111592415079452072 && + H_5 == 64'd8638871050018654530 && + H_6 == 64'd4583966954114332360 && + H_7 == 64'd1230299281376055969 && + W_0 == slicer($past(block_in, 1), 32'sd15) && + W_10 == slicer($past(block_in, 1),32'sd5) && + W_11 == slicer($past(block_in, 1),32'sd4) && + W_12 == slicer($past(block_in, 1),32'sd3) && + W_13 == slicer($past(block_in, 1),32'sd2) && + W_14 == slicer($past(block_in, 1),32'sd1) && + W_15 == slicer($past(block_in, 1),32'sd0) && + W_1 == slicer($past(block_in, 1), 32'sd14) && + W_2 == slicer($past(block_in, 1), 32'sd13) && + W_3 == slicer($past(block_in, 1), 32'sd12) && + W_4 == slicer($past(block_in, 1), 32'sd11) && + W_5 == slicer($past(block_in, 1), 32'sd10) && + W_6 == slicer($past(block_in, 1), 32'sd9) && + W_7 == slicer($past(block_in, 1), 32'sd8) && + W_8 == slicer($past(block_in, 1), 32'sd7) && + W_9 == slicer($past(block_in, 1), 32'sd6) && + a == 64'd10105294471447203234 && + b == 64'd8350123849800275158 && + c == 64'd2160240930085379202 && + d == 64'd7466358040605728719 && + e == 64'd1111592415079452072 && + f == 64'd8638871050018654530 && + g == 64'd4583966954114332360 && + h == 64'd1230299281376055969 && + i == 'sd0; +endproperty + + +IDLE_to_SHA_Rounds_1_a: assert property (disable iff(!rst) IDLE_to_SHA_Rounds_1_p); +property IDLE_to_SHA_Rounds_1_p; + IDLE && + block_in_valid && + block_init && + (block_sha_mode == 'sd256) +|-> + ##1 (block_in_ready == 0) and + ##1 (digest_valid == 0) and + ##1 + SHA_Rounds && + H_0 == 64'd2463787394917988140 && + H_1 == 64'd11481187982095705282 && + H_2 == 64'd2563595384472711505 && + H_3 == 64'd10824532655140301501 && + H_4 == 64'd10819967247969091555 && + H_5 == 64'd13717434660681038226 && + H_6 == 64'd3098927326965381290 && + H_7 == 64'd1060366662362279074 && + W_0 == slicer($past(block_in, 1), 32'sd15) && + W_10 == slicer($past(block_in, 1),32'sd5) && + W_11 == slicer($past(block_in, 1),32'sd4) && + W_12 == slicer($past(block_in, 1),32'sd3) && + W_13 == slicer($past(block_in, 1),32'sd2) && + W_14 == slicer($past(block_in, 1),32'sd1) && + W_15 == slicer($past(block_in, 1),32'sd0) && + W_1 == slicer($past(block_in, 1), 32'sd14) && + W_2 == slicer($past(block_in, 1), 32'sd13) && + W_3 == slicer($past(block_in, 1), 32'sd12) && + W_4 == slicer($past(block_in, 1), 32'sd11) && + W_5 == slicer($past(block_in, 1), 32'sd10) && + W_6 == slicer($past(block_in, 1), 32'sd9) && + W_7 == slicer($past(block_in, 1), 32'sd8) && + W_8 == slicer($past(block_in, 1), 32'sd7) && + W_9 == slicer($past(block_in, 1), 32'sd6) && + a == 64'd2463787394917988140 && + b == 64'd11481187982095705282 && + c == 64'd2563595384472711505 && + d == 64'd10824532655140301501 && + e == 64'd10819967247969091555 && + f == 64'd13717434660681038226 && + g == 64'd3098927326965381290 && + h == 64'd1060366662362279074 && + i == 'sd0; +endproperty + + +IDLE_to_SHA_Rounds_2_a: assert property (disable iff(!rst) IDLE_to_SHA_Rounds_2_p); +property IDLE_to_SHA_Rounds_2_p; + IDLE && + block_in_valid && + block_init && + (block_sha_mode == 'sd512) +|-> + ##1 (block_in_ready == 0) and + ##1 (digest_valid == 0) and + ##1 + SHA_Rounds && + H_0 == 64'd7640891576956012808 && + H_1 == 64'd13503953896175478587 && + H_2 == 64'd4354685564936845355 && + H_3 == 64'd11912009170470909681 && + H_4 == 64'd5840696475078001361 && + H_5 == 64'd11170449401992604703 && + H_6 == 64'd2270897969802886507 && + H_7 == 64'd6620516959819538809 && + W_0 == slicer($past(block_in, 1), 32'sd15) && + W_10 == slicer($past(block_in, 1),32'sd5) && + W_11 == slicer($past(block_in, 1),32'sd4) && + W_12 == slicer($past(block_in, 1),32'sd3) && + W_13 == slicer($past(block_in, 1),32'sd2) && + W_14 == slicer($past(block_in, 1),32'sd1) && + W_15 == slicer($past(block_in, 1),32'sd0) && + W_1 == slicer($past(block_in, 1), 32'sd14) && + W_2 == slicer($past(block_in, 1), 32'sd13) && + W_3 == slicer($past(block_in, 1), 32'sd12) && + W_4 == slicer($past(block_in, 1), 32'sd11) && + W_5 == slicer($past(block_in, 1), 32'sd10) && + W_6 == slicer($past(block_in, 1), 32'sd9) && + W_7 == slicer($past(block_in, 1), 32'sd8) && + W_8 == slicer($past(block_in, 1), 32'sd7) && + W_9 == slicer($past(block_in, 1), 32'sd6) && + a == 64'd7640891576956012808 && + b == 64'd13503953896175478587 && + c == 64'd4354685564936845355 && + d == 64'd11912009170470909681 && + e == 64'd5840696475078001361 && + f == 64'd11170449401992604703 && + g == 64'd2270897969802886507 && + h == 64'd6620516959819538809 && + i == 'sd0; +endproperty + + +IDLE_to_SHA_Rounds_3_a: assert property (disable iff(!rst) IDLE_to_SHA_Rounds_3_p); +property IDLE_to_SHA_Rounds_3_p; + IDLE && + block_in_valid && + block_init && + (block_sha_mode != 'sd224) && + (block_sha_mode != 'sd256) && + (block_sha_mode != 'sd512) +|-> + ##1 (block_in_ready == 0) and + ##1 (digest_valid == 0) and + ##1 + SHA_Rounds && + H_0 == 64'd14680500436340154072 && + H_1 == 64'd7105036623409894663 && + H_2 == 64'd10473403895298186519 && + H_3 == 64'd1526699215303891257 && + H_4 == 64'd7436329637833083697 && + H_5 == 64'd10282925794625328401 && + H_6 == 64'd15784041429090275239 && + H_7 == 64'd5167115440072839076 && + W_0 == slicer($past(block_in, 1), 32'sd15) && + W_10 == slicer($past(block_in, 1),32'sd5) && + W_11 == slicer($past(block_in, 1),32'sd4) && + W_12 == slicer($past(block_in, 1),32'sd3) && + W_13 == slicer($past(block_in, 1),32'sd2) && + W_14 == slicer($past(block_in, 1),32'sd1) && + W_15 == slicer($past(block_in, 1),32'sd0) && + W_1 == slicer($past(block_in, 1), 32'sd14) && + W_2 == slicer($past(block_in, 1), 32'sd13) && + W_3 == slicer($past(block_in, 1), 32'sd12) && + W_4 == slicer($past(block_in, 1), 32'sd11) && + W_5 == slicer($past(block_in, 1), 32'sd10) && + W_6 == slicer($past(block_in, 1), 32'sd9) && + W_7 == slicer($past(block_in, 1), 32'sd8) && + W_8 == slicer($past(block_in, 1), 32'sd7) && + W_9 == slicer($past(block_in, 1), 32'sd6) && + a == 64'd14680500436340154072 && + b == 64'd7105036623409894663 && + c == 64'd10473403895298186519 && + d == 64'd1526699215303891257 && + e == 64'd7436329637833083697 && + f == 64'd10282925794625328401 && + g == 64'd15784041429090275239 && + h == 64'd5167115440072839076 && + i == 'sd0; +endproperty + + +IDLE_to_SHA_Rounds_4_a: assert property (disable iff(!rst) IDLE_to_SHA_Rounds_4_p); +property IDLE_to_SHA_Rounds_4_p; + IDLE && + block_in_valid && + !block_init +|-> + ##1 (block_in_ready == 0) and + ##1 (digest_valid == 0) and + ##1 + SHA_Rounds && + H_0 == $past(H_0, 1) && + H_1 == $past(H_1, 1) && + H_2 == $past(H_2, 1) && + H_3 == $past(H_3, 1) && + H_4 == $past(H_4, 1) && + H_5 == $past(H_5, 1) && + H_6 == $past(H_6, 1) && + H_7 == $past(H_7, 1) && + W_0 == slicer($past(block_in, 1), 32'sd15) && + W_10 == slicer($past(block_in, 1),32'sd5) && + W_11 == slicer($past(block_in, 1),32'sd4) && + W_12 == slicer($past(block_in, 1),32'sd3) && + W_13 == slicer($past(block_in, 1),32'sd2) && + W_14 == slicer($past(block_in, 1),32'sd1) && + W_15 == slicer($past(block_in, 1),32'sd0) && + W_1 == slicer($past(block_in, 1), 32'sd14) && + W_2 == slicer($past(block_in, 1), 32'sd13) && + W_3 == slicer($past(block_in, 1), 32'sd12) && + W_4 == slicer($past(block_in, 1), 32'sd11) && + W_5 == slicer($past(block_in, 1), 32'sd10) && + W_6 == slicer($past(block_in, 1), 32'sd9) && + W_7 == slicer($past(block_in, 1), 32'sd8) && + W_8 == slicer($past(block_in, 1), 32'sd7) && + W_9 == slicer($past(block_in, 1), 32'sd6) && + a == $past(H_0, 1) && + b == $past(H_1, 1) && + c == $past(H_2, 1) && + d == $past(H_3, 1) && + e == $past(H_4, 1) && + f == $past(H_5, 1) && + g == $past(H_6, 1) && + h == $past(H_7, 1) && + i == 'sd0; +endproperty + + +SHA_Rounds_to_DONE_a: assert property (disable iff(!rst) SHA_Rounds_to_DONE_p); +property SHA_Rounds_to_DONE_p; + SHA_Rounds && + (i >= 'sd16) && + (('sd1 + i) >= 'sd80) +|-> + ##1 (block_in_ready == 0) and + ##1 (digest_valid == 0) and + ##1 + DONE && + H_0 == $past(H_0, 1) && + H_1 == $past(H_1, 1) && + H_2 == $past(H_2, 1) && + H_3 == $past(H_3, 1) && + H_4 == $past(H_4, 1) && + H_5 == $past(H_5, 1) && + H_6 == $past(H_6, 1) && + H_7 == $past(H_7, 1) && + W_0 == $past(W_1, 1) && + W_10 == $past(W_11, 1) && + W_11 == $past(W_12, 1) && + W_12 == $past(W_13, 1) && + W_13 == $past(W_14, 1) && + W_14 == $past(W_15, 1) && + W_15 == $past(compute_w(W_14,W_9,W_1,W_0)) && + W_1 == $past(W_2, 1) && + W_2 == $past(W_3, 1) && + W_3 == $past(W_4, 1) && + W_4 == $past(W_5, 1) && + W_5 == $past(W_6, 1) && + W_6 == $past(W_7, 1) && + W_7 == $past(W_8, 1) && + W_8 == $past(W_9, 1) && + W_9 == $past(W_10, 1) && + a == $past(64'(T1(e,f,g,h,K[i],compute_w(W_14,W_9,W_1,W_0))+T2(a,b,c))) && + b == $past(a, 1) && + c == $past(b, 1) && + d == $past(c, 1) && + e == $past(64'(d+T1(e,f,g,h,K[i],compute_w(W_14,W_9,W_1,W_0)))) && + f == $past(e, 1) && + g == $past(f, 1) && + h == $past(g, 1) && + i == ('sd1 + $past(i, 1)); +endproperty + + +SHA_Rounds_to_SHA_Rounds_a: assert property (disable iff(!rst) SHA_Rounds_to_SHA_Rounds_p); +property SHA_Rounds_to_SHA_Rounds_p; + SHA_Rounds && + (i < 'sd16) +|-> + ##1 (block_in_ready == 0) and + ##1 (digest_valid == 0) and + ##1 + SHA_Rounds && + H_0 == $past(H_0, 1) && + H_1 == $past(H_1, 1) && + H_2 == $past(H_2, 1) && + H_3 == $past(H_3, 1) && + H_4 == $past(H_4, 1) && + H_5 == $past(H_5, 1) && + H_6 == $past(H_6, 1) && + H_7 == $past(H_7, 1) && + W_0 == $past(W_0, 1) && + W_10 == $past(W_10, 1) && + W_11 == $past(W_11, 1) && + W_12 == $past(W_12, 1) && + W_13 == $past(W_13, 1) && + W_14 == $past(W_14, 1) && + W_15 == $past(W_15, 1) && + W_1 == $past(W_1, 1) && + W_2 == $past(W_2, 1) && + W_3 == $past(W_3, 1) && + W_4 == $past(W_4, 1) && + W_5 == $past(W_5, 1) && + W_6 == $past(W_6, 1) && + W_7 == $past(W_7, 1) && + W_8 == $past(W_8, 1) && + W_9 == $past(W_9, 1) && + a == $past(64'(T1(e,f,g,h,K[i],W[j])+T2(a,b,c))) && + b == $past(a, 1) && + c == $past(b, 1) && + d == $past(c, 1) && + e == $past(64'(d+T1(e,f,g,h,K[i],W[j]))) && + f == $past(e, 1) && + g == $past(f, 1) && + h == $past(g, 1) && + i == ('sd1 + $past(i, 1)); +endproperty + + +SHA_Rounds_to_SHA_Rounds_1_a: assert property (disable iff(!rst) SHA_Rounds_to_SHA_Rounds_1_p); +property SHA_Rounds_to_SHA_Rounds_1_p; + SHA_Rounds && + (i >= 'sd16) && + (('sd1 + i) < 'sd80) +|-> + ##1 (block_in_ready == 0) and + ##1 (digest_valid == 0) and + ##1 + SHA_Rounds && + H_0 == $past(H_0, 1) && + H_1 == $past(H_1, 1) && + H_2 == $past(H_2, 1) && + H_3 == $past(H_3, 1) && + H_4 == $past(H_4, 1) && + H_5 == $past(H_5, 1) && + H_6 == $past(H_6, 1) && + H_7 == $past(H_7, 1) && + W_0 == $past(W_1, 1) && + W_10 == $past(W_11, 1) && + W_11 == $past(W_12, 1) && + W_12 == $past(W_13, 1) && + W_13 == $past(W_14, 1) && + W_14 == $past(W_15, 1) && + W_15 == $past(compute_w(W_14,W_9,W_1,W_0)) && + W_1 == $past(W_2, 1) && + W_2 == $past(W_3, 1) && + W_3 == $past(W_4, 1) && + W_4 == $past(W_5, 1) && + W_5 == $past(W_6, 1) && + W_6 == $past(W_7, 1) && + W_7 == $past(W_8, 1) && + W_8 == $past(W_9, 1) && + W_9 == $past(W_10, 1) && + a == $past(64'(T1(e,f,g,h,K[i],compute_w(W_14,W_9,W_1,W_0))+T2(a,b,c))) && + b == $past(a, 1) && + c == $past(b, 1) && + d == $past(c, 1) && + e == $past(64'(d+T1(e,f,g,h,K[i],compute_w(W_14,W_9,W_1,W_0)))) && + f == $past(e, 1) && + g == $past(f, 1) && + h == $past(g, 1) && + i == ('sd1 + $past(i, 1)); +endproperty + + +IDLE_wait_a: assert property (disable iff(!rst) IDLE_wait_p); +property IDLE_wait_p; + IDLE && + !block_in_valid +|-> + ##1 + IDLE && + H_0 == $past(H_0, 1) && + H_1 == $past(H_1, 1) && + H_2 == $past(H_2, 1) && + H_3 == $past(H_3, 1) && + H_4 == $past(H_4, 1) && + H_5 == $past(H_5, 1) && + H_6 == $past(H_6, 1) && + H_7 == $past(H_7, 1) && + W_0 == $past(W_0, 1) && + W_10 == $past(W_10, 1) && + W_11 == $past(W_11, 1) && + W_12 == $past(W_12, 1) && + W_13 == $past(W_13, 1) && + W_14 == $past(W_14, 1) && + W_15 == $past(W_15, 1) && + W_1 == $past(W_1, 1) && + W_2 == $past(W_2, 1) && + W_3 == $past(W_3, 1) && + W_4 == $past(W_4, 1) && + W_5 == $past(W_5, 1) && + W_6 == $past(W_6, 1) && + W_7 == $past(W_7, 1) && + W_8 == $past(W_8, 1) && + W_9 == $past(W_9, 1) && + a == $past(a, 1) && + b == $past(b, 1) && + c == $past(c, 1) && + d == $past(d, 1) && + e == $past(e, 1) && + f == $past(f, 1) && + g == $past(g, 1) && + h == $past(h, 1) && + i == $past(i, 1) && + block_in_ready == 1 && + digest_valid == $past(digest_valid); +endproperty + + +endmodule + + bind sha512_core fv_sha_512_m fv_sha512( + .rst((sha512_core.reset_n) && !(sha512_core.zeroize)), + .clk(sha512_core.clk), + .block_in(sha512_core.block_msg), + .block_sha_mode(get_block_sha_mode(sha512_core.mode)), + .block_init(sha512_core.init_cmd), + .block_next(sha512_core.next_cmd), + .block_zeroize(sha512_core.zeroize), + .digest_out(sha512_core.digest), + .block_in_valid(((sha512_core.init_cmd) || (sha512_core.next_cmd))), + .block_in_ready(sha512_core.ready), + .digest_valid((sha512_core.digest_valid) ), + .H_0(sha512_core.H0_reg), + .H_1(sha512_core.H1_reg), + .H_2(sha512_core.H2_reg), + .H_3(sha512_core.H3_reg), + .H_4(sha512_core.H4_reg), + .H_5(sha512_core.H5_reg), + .H_6(sha512_core.H6_reg), + .H_7(sha512_core.H7_reg), + .W_0(sha512_core.w_mem_inst.w_mem[00]), + .W_1(sha512_core.w_mem_inst.w_mem[01]), + .W_2(sha512_core.w_mem_inst.w_mem[02]), + .W_3(sha512_core.w_mem_inst.w_mem[03]), + .W_4(sha512_core.w_mem_inst.w_mem[04]), + .W_5(sha512_core.w_mem_inst.w_mem[05]), + .W_6(sha512_core.w_mem_inst.w_mem[06]), + .W_7(sha512_core.w_mem_inst.w_mem[07]), + .W_8(sha512_core.w_mem_inst.w_mem[08]), + .W_9(sha512_core.w_mem_inst.w_mem[09]), + .W_10(sha512_core.w_mem_inst.w_mem[10]), + .W_11(sha512_core.w_mem_inst.w_mem[11]), + .W_12(sha512_core.w_mem_inst.w_mem[12]), + .W_13(sha512_core.w_mem_inst.w_mem[13]), + .W_14(sha512_core.w_mem_inst.w_mem[14]), + .W_15(sha512_core.w_mem_inst.w_mem[15]), + .a(sha512_core.a_reg), + .b(sha512_core.b_reg), + .c(sha512_core.c_reg), + .d(sha512_core.d_reg), + .e(sha512_core.e_reg), + .f(sha512_core.f_reg), + .g(sha512_core.g_reg), + .h(sha512_core.h_reg), + .i(sha512_core.round_ctr_reg), + .IDLE(sha512_core.sha512_ctrl_reg==2'h0), + .SHA_Rounds(sha512_core.sha512_ctrl_reg==2'h1), + .DONE(sha512_core.sha512_ctrl_reg==2'h2) +); + diff --git a/src/sha512/formal/properties/fv_sha512_pkg.sv b/src/sha512/formal/properties/fv_sha512_pkg.sv new file mode 100644 index 000000000..45ab5eb0c --- /dev/null +++ b/src/sha512/formal/properties/fv_sha512_pkg.sv @@ -0,0 +1,183 @@ +// ------------------------------------------------- +// Contact: contact@lubis-eda.com +// Author: Tobias Ludwig, Michael Schwarz +// ------------------------------------------------- +// SPDX-License-Identifier: Apache-2.0 +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +package fv_sha512_pkg; + + +typedef bit unsigned [63:0] a_sc_big_unsigned_64_80 [79:0]; + + +// Constants + +parameter a_sc_big_unsigned_64_80 K = '{ 0:64'd4794697086780616226, 1:64'd8158064640168781261, 2:64'd13096744586834688815, 3:64'd16840607885511220156, 4:64'd4131703408338449720, 5:64'd6480981068601479193, 6:64'd10538285296894168987, 7:64'd12329834152419229976, 8:64'd15566598209576043074, 9:64'd1334009975649890238, 10:64'd2608012711638119052, 11:64'd6128411473006802146, 12:64'd8268148722764581231, 13:64'd9286055187155687089, 14:64'd11230858885718282805, 15:64'd13951009754708518548, 16:64'd16472876342353939154, 17:64'd17275323862435702243, 18:64'd1135362057144423861, 19:64'd2597628984639134821, 20:64'd3308224258029322869, 21:64'd5365058923640841347, 22:64'd6679025012923562964, 23:64'd8573033837759648693, 24:64'd10970295158949994411, 25:64'd12119686244451234320, 26:64'd12683024718118986047, 27:64'd13788192230050041572, 28:64'd14330467153632333762, 29:64'd15395433587784984357, 30:64'd489312712824947311, 31:64'd1452737877330783856, 32:64'd2861767655752347644, 33:64'd3322285676063803686, 34:64'd5560940570517711597, 35:64'd5996557281743188959, 36:64'd7280758554555802590, 37:64'd8532644243296465576, 38:64'd9350256976987008742, 39:64'd10552545826968843579, 40:64'd11727347734174303076, 41:64'd12113106623233404929, 42:64'd14000437183269869457, 43:64'd14369950271660146224, 44:64'd15101387698204529176, 45:64'd15463397548674623760, 46:64'd17586052441742319658, 47:64'd1182934255886127544, 48:64'd1847814050463011016, 49:64'd2177327727835720531, 50:64'd2830643537854262169, 51:64'd3796741975233480872, 52:64'd4115178125766777443, 53:64'd5681478168544905931, 54:64'd6601373596472566643, 55:64'd7507060721942968483, 56:64'd8399075790359081724, 57:64'd8693463985226723168, 58:64'd9568029438360202098, 59:64'd10144078919501101548, 60:64'd10430055236837252648, 61:64'd11840083180663258601, 62:64'd13761210420658862357, 63:64'd14299343276471374635, 64:64'd14566680578165727644, 65:64'd15097957966210449927, 66:64'd16922976911328602910, 67:64'd17689382322260857208, 68:64'd500013540394364858, 69:64'd748580250866718886, 70:64'd1242879168328830382, 71:64'd1977374033974150939, 72:64'd2944078676154940804, 73:64'd3659926193048069267, 74:64'd4368137639120453308, 75:64'd4836135668995329356, 76:64'd5532061633213252278, 77:64'd6448918945643986474, 78:64'd6902733635092675308, 79:64'd7801388544844847127 }; + + +// Functions + +function bit unsigned [63:0] Ch(bit unsigned [63:0] a, bit unsigned [63:0] b, bit unsigned [63:0] c); + return ((a & b) ^ (~a & c)); +endfunction + +function bit unsigned [63:0] Maj(bit unsigned [63:0] x, bit unsigned [63:0] y, bit unsigned [63:0] z); + return (((x & y) ^ (x & z)) ^ (y & z)); +endfunction + +function bit unsigned [63:0] T1(bit unsigned [63:0] e, bit unsigned [63:0] f, bit unsigned [63:0] g, bit unsigned [63:0] h, bit unsigned [63:0] k, bit unsigned [63:0] w); + return 64'(((((h + sigma1(e)) + Ch(e, f, g)) + k) + w)); +endfunction + +function bit unsigned [63:0] T2(bit unsigned [63:0] a, bit unsigned [63:0] b, bit unsigned [63:0] c); + return 64'((sigma0(a) + Maj(a, b, c))); +endfunction + +function bit unsigned [63:0] compute_w(bit unsigned [63:0] w14, bit unsigned [63:0] w9, bit unsigned [63:0] w1, bit unsigned [63:0] w0); + return 64'((((delta1(w14) + w9) + delta0(w1)) + w0)); +endfunction + +function bit unsigned [511:0] compute_digest(bit unsigned [63:0] H_7,bit unsigned [63:0] h,bit unsigned [63:0] H_6,bit unsigned [63:0] g,bit unsigned [63:0] H_5,bit unsigned [63:0] f,bit unsigned [63:0] H_4,bit unsigned [63:0] e,bit unsigned [63:0] H_3,bit unsigned [63:0] d,bit unsigned [63:0] H_2,bit unsigned [63:0] c,bit unsigned [63:0] H_1,bit unsigned [63:0] b,bit unsigned [63:0] H_0,bit unsigned [63:0] a); + bit unsigned [511:0] temp; + temp[63:0] = 64'(H_7+h); + temp[127:64] = 64'(H_6+g); + temp[191:128] = 64'(H_5+f); + temp[255:192] = 64'(H_4+e); + temp[319:256] = 64'(H_3+d); + temp[383:320] = 64'(H_2+c); + temp[447:384] = 64'(H_1+b); + temp[511:448] = 64'(H_0+a); + return temp; + endfunction + +function bit unsigned [63:0] delta0(bit unsigned [63:0] x); + return ((rotr1(x) ^ rotr8(x)) ^ shr7(x)); +endfunction + +function bit unsigned [63:0] delta1(bit unsigned [63:0] x); + return ((rotr19(x) ^ rotr61(x)) ^ shr6(x)); +endfunction + +function bit unsigned [31:0] get_block_sha_mode(input logic[1:0] mode ); +if(mode==0) + return 224; +else if(mode==1) + return 256; +else if(mode==2) + return 384; +else + return 512; +endfunction + +function bit unsigned [63:0] past_w(bit unsigned [6:0]i,bit unsigned [63:0]W_0,bit unsigned [63:0]W_1,bit unsigned [63:0]W_2,bit unsigned [63:0]W_3,bit unsigned [63:0]W_4,bit unsigned [63:0]W_5,bit unsigned [63:0]W_6,bit unsigned [63:0]W_7,bit unsigned [63:0]W_8,bit unsigned [63:0]W_9,bit unsigned [63:0]W_10,bit unsigned [63:0]W_11,bit unsigned [63:0]W_12,bit unsigned [63:0]W_13,bit unsigned [63:0]W_14,bit unsigned [63:0]W_15); + return ((i == 'sd0) ? W_0 : ((i == 'sd1) ? W_1 : ((i == 'sd2) ? W_2 : ((i == 'sd3) ? W_3 : ((i == 'sd4) ? W_4 : ((i == 'sd5) ? W_5 : ((i == 'sd6) ? W_6 : ((i == 'sd7) ? W_7 : ((i == 'sd8) ? W_8 : ((i == 'sd9) ? W_9 : ((i == 'sd10) ? W_10 : ((i == 'sd11) ? W_11 : ((i == 'sd12) ? W_12 : ((i == 'sd13) ? W_13 : ((i == 'sd14) ? W_14 : W_15))))))))))))))); +endfunction + +function bit unsigned [63:0] rotr1(bit unsigned [63:0] n); + return 64'(((n >> 64'd1) | (n << 64'd63))); +endfunction + +function bit unsigned [63:0] rotr14(bit unsigned [63:0] n); + return 64'(((n >> 64'd14) | (n << 64'd50))); +endfunction + +function bit unsigned [63:0] rotr18(bit unsigned [63:0] n); + return 64'(((n >> 64'd18) | (n << 64'd46))); +endfunction + +function bit unsigned [63:0] rotr19(bit unsigned [63:0] n); + return 64'(((n >> 64'd19) | (n << 64'd45))); +endfunction + +function bit unsigned [63:0] rotr28(bit unsigned [63:0] n); + return 64'(((n >> 64'd28) | (n << 64'd36))); +endfunction + +function bit unsigned [63:0] rotr34(bit unsigned [63:0] n); + return 64'(((n >> 64'd34) | (n << 64'd30))); +endfunction + +function bit unsigned [63:0] rotr39(bit unsigned [63:0] n); + return 64'(((n >> 64'd39) | (n << 64'd25))); +endfunction + +function bit unsigned [63:0] rotr41(bit unsigned [63:0] n); + return 64'(((n >> 64'd41) | (n << 64'd23))); +endfunction + +function bit unsigned [63:0] rotr61(bit unsigned [63:0] n); + return 64'(((n >> 64'd61) | (n << 64'd3))); +endfunction + +function bit unsigned [63:0] rotr8(bit unsigned [63:0] n); + return 64'(((n >> 64'd8) | (n << 64'd56))); +endfunction + +function bit unsigned [63:0] shr6(bit unsigned [63:0] n); + return (n >> 64'd6); +endfunction + +function bit unsigned [63:0] shr7(bit unsigned [63:0] n); + return (n >> 64'd7); +endfunction + +function bit unsigned [63:0] sigma0(bit unsigned [63:0] x); + return ((rotr28(x) ^ rotr34(x)) ^ rotr39(x)); +endfunction + +function bit unsigned [63:0] sigma1(bit unsigned [63:0] x); + return ((rotr14(x) ^ rotr18(x)) ^ rotr41(x)); +endfunction + +function bit unsigned [63:0] slicer(bit unsigned [1023:0] block, bit signed [31:0] index); + if ((index == 'sd0)) + return 64'((block >> 1024'd0)); + else if ((index == 'sd1)) + return 64'((block >> 1024'd64)); + else if ((index == 'sd2)) + return 64'((block >> 1024'd128)); + else if ((index == 'sd3)) + return 64'((block >> 1024'd192)); + else if ((index == 'sd4)) + return 64'((block >> 1024'd256)); + else if ((index == 'sd5)) + return 64'((block >> 1024'd320)); + else if ((index == 'sd6)) + return 64'((block >> 1024'd384)); + else if ((index == 'sd7)) + return 64'((block >> 1024'd448)); + else if ((index == 'sd8)) + return 64'((block >> 1024'd512)); + else if ((index == 'sd9)) + return 64'((block >> 1024'd576)); + else if ((index == 'sd10)) + return 64'((block >> 1024'd640)); + else if ((index == 'sd11)) + return 64'((block >> 1024'd704)); + else if ((index == 'sd12)) + return 64'((block >> 1024'd768)); + else if ((index == 'sd13)) + return 64'((block >> 1024'd832)); + else if ((index == 'sd14)) + return 64'((block >> 1024'd896)); + else if ((index == 'sd15)) + return 64'((block >> 1024'd960)); + else + return 64'((block >> 1024'd960)); +endfunction + + +endpackage diff --git a/src/sha512/formal/readme.md b/src/sha512/formal/readme.md new file mode 100644 index 000000000..8bfb89433 --- /dev/null +++ b/src/sha512/formal/readme.md @@ -0,0 +1,72 @@ +# SHA512 +Date: 28-06-2023 +Author: LUBIS EDA + +## Folder Structure +The following subdirectories are part of the main directory **formal** + +- model: Contains the high level abstracted model +- properties: Contains the assertion IP(AIP) named as **fv_sha512.sv** and the constraints in place for the respective AIP **fv_constraints.sv** + + +## DUT Overview + +The DUT sha512_core has the primary inputs and primary outputs as shown below. + +| S.No | Port | Direction | Description | +| ---- | ----------------- | --------- | --------------------------------------------------------------------------------- | +| 1 | clk | input | The positive edge of the clk is used for all the signals | +| 2 | reset_n | input | The reset signal is active low and resets the core | +| 3 | zeroize | input | The core is reseted when this signal is triggered. | +| 4 | init | input | The core is initialised with respective mode constants and processes the message. | +| 5 | next | input | The core processes the message block with the previously computed results | +| 6 | mode[1:0] | input | Define which hash function: SHA512,SHA384,SHA224,SHA256 | +| 7 | block_msg[1023:0] | input | The padded block message | +| 8 | ready | output | When triggered indicates that the core is ready | +| 9 | digest[511:0] | output | The hashed value of the given message block | +| 10 | digest_valid | output | When triggered indicates that the computed digest is ready | + +When the respective mode is selected and initalised the core iterates for 80 rounds to process the hash value, if the next is triggered then the previous values of the **H** registers are in place for processing the hash value. The digest is always generated of 512 bits, in which if the mode changes to 384 then from MSB 384 bits is a valid output and rest is garbage value. +## Assertion IP Overview + +The Assertion IP signals are bound with the respective signals in the dut, where for the **rst** reset_n && !zeroize is used, which ensures the reset functionality. And another AIP signal block_in_valid is triggered whenever the init or next is high. + +- reset_a: Checks that all the resgiters are resetted and the state is idle, with the ready to high. + +- DONE_to_IDLE_a: Checks the necessary registers,outputs holds the values when state transits from Done to idle, + +- IDLE_to_SHA_Rounds_a: Checks if the state is in idle ,the mode choosen as 224,the init is triggered then the registers should be initialised with the respective constants of 224. + +- IDLE_to_SHA_Rounds_1_a: Checks if the state is in idle ,the mode choosen as 256,the init is triggered then the registers should be initialised with the respective constants of 256. + +- IDLE_to_SHA_Rounds_2_a: Checks if the state is in idle ,the mode choosen as 512,the init is triggered then the registers should be initialised with the respective constants of 512. + +- IDLE_to_SHA_Rounds_3_a: Checks if the state is in idle ,the mode choosen is neither 512,256 nor 224,the init is triggered then the registers should be initialised with the respective constants of default, which covers 384 mode also. + +- IDLE_to_SHA_Rounds_4_a: Checks if the state is in idle and there is no init signal and the next signal asserts then the register holds the past values. + +- SHA_Rounds_to_DONE_a: Checks if the rounds are done then the registers are updated correctly. + +- SHA_Rounds_to_SHA_Rounds_a: Checks if the the rounds less than 16 then the necessary registers are updated correctly and the round increments. + +- SHA_Rounds_to_SHA_Rounds_1_a: Checks if the rounds are greater than 16 and less than 80 then the respective registers are updated correctly and the round increments. + +- IDLE_wait_a: Checks if there isn't either init or next signal triggered in idle state then the state stays in idle and holds the past values and the core is ready. +- +## Loading the AIP + + +For onespin:
+ 1. Open onespin, select file, run source.
+ 2. Select the prove.tcl in onespin folder for running the properties.
+ +For VCformal:
+ 1. Navigate to the vcf folder containing tcl scripts.
+ 2. open terminal
+ 3. run the cmd vcf -f prove.tcl (for running the properties).
+ +For JasperGold: + 1. Open Jaspergold, click on file -> Tcl scripts -> Source.
+ 2. Now Navigate to the script location and select the prove.tcl.
+ 3. All the checkers and constraints would be loaded to the interface, right click on them and click on prove task.
+ diff --git a/src/sha512/rtl/sha512.sv b/src/sha512/rtl/sha512.sv index ca975fbbe..95d8690d0 100644 --- a/src/sha512/rtl/sha512.sv +++ b/src/sha512/rtl/sha512.sv @@ -41,6 +41,7 @@ module sha512 import sha512_reg_pkg::*; + import sha512_params_pkg::*; import kv_defines_pkg::*; import pv_defines_pkg::*; #( @@ -77,14 +78,10 @@ module sha512 // Interrupts output wire error_intr, - output wire notif_intr + output wire notif_intr, + input logic debugUnlock_or_scan_mode_switch ); - //---------------------------------------------------------------- - // Internal constant and parameter definitions. - //---------------------------------------------------------------- - `include "sha512_param.sv" - //---------------------------------------------------------------- // Registers including update variables and write enable. //---------------------------------------------------------------- @@ -100,6 +97,7 @@ module sha512 localparam BLOCK_NUM_DWORDS = BLOCK_SIZE / DATA_WIDTH; localparam DIG_NUM_DWORDS = DIG_SIZE / DATA_WIDTH; + localparam NONCE_NUM_DWORDS = PV_SIZE_OF_NONCE / DATA_WIDTH; reg [DATA_WIDTH-1 : 0][BLOCK_NUM_DWORDS-1 : 0] block_reg ; reg [DIG_NUM_DWORDS-1 : 0][DATA_WIDTH-1 : 0] digest_reg; @@ -137,6 +135,9 @@ module sha512 kv_write_ctrl_reg_t kv_write_ctrl_reg_q; kv_read_ctrl_reg_t kv_read_ctrl_reg; + //KV Read Data Present + logic kv_read_data_present; + logic kv_read_data_present_set, kv_read_data_present_reset; //PCR Hash Extend Function logic pcr_hash_extend_ip; logic pcr_hash_extend_set, pcr_hash_extend_reset; @@ -152,6 +153,8 @@ module sha512 logic gen_hash_block_write_en; logic [4:0] gen_hash_block_write_offset; logic [31:0] gen_hash_block_write_data; + + logic [NONCE_NUM_DWORDS-1 : 0][DATA_WIDTH-1 : 0] pv_nonce; //---------------------------------------------------------------- // Wires. //---------------------------------------------------------------- @@ -210,29 +213,31 @@ module sha512 //---------------------------------------------------------------- always @ (posedge clk or negedge reset_n) begin : reg_update if (!reset_n) begin - ready_reg <= '0; - digest_reg <= '0; - digest_valid_reg <= '0; - kv_reg <= '0; - pcr_sign_reg <= '0; - block_reg_lock <= '0; - pcr_hash_extend_ip <= '0; - hash_extend_entry <= '0; + ready_reg <= '0; + digest_reg <= '0; + digest_valid_reg <= '0; + kv_reg <= '0; + pcr_sign_reg <= '0; + block_reg_lock <= '0; + pcr_hash_extend_ip <= '0; + hash_extend_entry <= '0; + kv_read_data_present <= '0; end else if (zeroize_reg) begin - ready_reg <= '0; - digest_reg <= '0; - digest_valid_reg <= '0; - kv_reg <= '0; - pcr_sign_reg <= '0; + ready_reg <= '0; + digest_reg <= '0; + digest_valid_reg <= '0; + kv_reg <= '0; + pcr_sign_reg <= '0; + kv_read_data_present <= '0; end else begin ready_reg <= core_ready; digest_valid_reg <= core_digest_valid; - if (core_digest_valid & ~digest_valid_reg & ~dest_keyvault) + if (core_digest_valid & ~digest_valid_reg & ~(dest_keyvault | kv_read_data_present)) digest_reg <= core_digest & get_mask; - if (core_digest_valid & ~digest_valid_reg & dest_keyvault) + if (core_digest_valid & ~digest_valid_reg & (dest_keyvault | kv_read_data_present)) kv_reg <= core_digest[DIG_NUM_DWORDS-1:DIG_NUM_DWORDS-KV_NUM_DWORDS] & get_mask[DIG_NUM_DWORDS-1:DIG_NUM_DWORDS-KV_NUM_DWORDS]; if (pcr_sign_we) pcr_sign_reg <= pcr_sign; @@ -241,6 +246,8 @@ module sha512 pcr_hash_extend_ip <= pcr_hash_extend_set ? '1 : pcr_hash_extend_reset ? '0 : pcr_hash_extend_ip; hash_extend_entry <= pcr_hash_extend_set ? kv_read_ctrl_reg.read_entry : hash_extend_entry; + kv_read_data_present <= kv_read_data_present_set ? '1 : + kv_read_data_present_reset ? '0 : kv_read_data_present; end end // reg_update @@ -262,16 +269,16 @@ module sha512 //register hw interface always_comb begin - hwif_in.SHA512_NAME[0].NAME.next = CORE_NAME0; - hwif_in.SHA512_NAME[1].NAME.next = CORE_NAME1; + hwif_in.SHA512_NAME[0].NAME.next = SHA512_CORE_NAME0; + hwif_in.SHA512_NAME[1].NAME.next = SHA512_CORE_NAME1; - hwif_in.SHA512_VERSION[0].VERSION.next = CORE_VERSION0; - hwif_in.SHA512_VERSION[1].VERSION.next = CORE_VERSION1; + hwif_in.SHA512_VERSION[0].VERSION.next = SHA512_CORE_VERSION0; + hwif_in.SHA512_VERSION[1].VERSION.next = SHA512_CORE_VERSION1; init_reg = gen_hash_ip ? gen_hash_init_reg : hwif_out.SHA512_CTRL.INIT.value; next_reg = gen_hash_ip ? gen_hash_next_reg : hwif_out.SHA512_CTRL.NEXT.value; mode_reg = gen_hash_ip ? 2'b10 : hwif_out.SHA512_CTRL.MODE.value; - zeroize_reg = hwif_out.SHA512_CTRL.ZEROIZE.value; + zeroize_reg = hwif_out.SHA512_CTRL.ZEROIZE.value || debugUnlock_or_scan_mode_switch; last_reg = gen_hash_ip ? gen_hash_last_reg : hwif_out.SHA512_CTRL.LAST.value; hwif_in.SHA512_CTRL.LAST.hwclr = core_digest_valid & ~digest_valid_reg; @@ -291,10 +298,11 @@ module sha512 for (int dword=0; dword< BLOCK_NUM_DWORDS; dword++) begin block_reg[dword] = hwif_out.SHA512_BLOCK[dword].BLOCK.value; - hwif_in.SHA512_BLOCK[dword].BLOCK.we = gen_hash_ip ? gen_hash_block_write_en & (gen_hash_block_write_offset == dword) : + hwif_in.SHA512_BLOCK[dword].BLOCK.we = zeroize_reg? 0 : + gen_hash_ip ? gen_hash_block_write_en & (gen_hash_block_write_offset == dword) : (kv_src_write_en & (kv_src_write_offset == dword)); hwif_in.SHA512_BLOCK[dword].BLOCK.next = gen_hash_ip ? gen_hash_block_write_data : kv_src_write_data; - hwif_in.SHA512_BLOCK[dword].BLOCK.hwclr = zeroize_reg & ~block_reg_lock[dword]; + hwif_in.SHA512_BLOCK[dword].BLOCK.hwclr = (zeroize_reg & ~block_reg_lock[dword]) | kv_read_data_present_reset; hwif_in.SHA512_BLOCK[dword].BLOCK.swwel = block_reg_lock[dword]; end //Set valid when fsm is done @@ -323,6 +331,10 @@ module sha512 `CALIPTRA_KV_WRITE_CTRL_REG2STRUCT(kv_write_ctrl_reg, SHA512_KV_WR_CTRL) `CALIPTRA_KV_READ_CTRL_REG2STRUCT(kv_read_ctrl_reg, SHA512_VAULT_RD_CTRL) +//Force result into KV reg whenever source came from KV + always_comb kv_read_data_present_set = kv_read_ctrl_reg.read_en & ~kv_read_ctrl_reg.pcr_hash_extend; + always_comb kv_read_data_present_reset = kv_read_data_present & dest_data_avail; + //Hash extend logic always_comb pcr_hash_extend_set = kv_read_ctrl_reg.read_en & kv_read_ctrl_reg.pcr_hash_extend; always_comb pcr_hash_extend_reset = pcr_hash_extend_ip & kv_dest_done; @@ -389,6 +401,7 @@ sha512_block_kv_read ( .clk(clk), .rst_b(reset_n), + .zeroize(zeroize_reg), //client control register .read_ctrl_reg(kv_read_ctrl_reg), @@ -428,6 +441,12 @@ end //write out the dest data to KV or PCR on last iteration of SHA always_comb dest_data_avail = core_digest_valid & ~digest_valid_reg & last_reg; +always_comb begin + for (int dword=0; dword< NONCE_NUM_DWORDS; dword++) begin + pv_nonce[dword] = hwif_out.SHA512_GEN_PCR_HASH_NONCE[dword].NONCE.value; + end +end + kv_write_client #( .DATA_WIDTH(384) ) @@ -435,6 +454,7 @@ sha512_result_kv_write ( .clk(clk), .rst_b(reset_n), + .zeroize(zeroize_reg), //client control register .write_ctrl_reg(kv_write_ctrl_reg_q), @@ -463,7 +483,7 @@ pv_gen_hash1 .core_digest_valid(gen_hash_ip & dest_data_avail), .start(gen_hash_start), - .nonce(hwif_out.SHA512_GEN_PCR_HASH_NONCE.NONCE.value), + .nonce(pv_nonce), .gen_hash_ip(gen_hash_ip), .gen_hash_init_reg(gen_hash_init_reg), diff --git a/src/sha512/rtl/sha512_ctrl.sv b/src/sha512/rtl/sha512_ctrl.sv index fd8e17bbd..310a26244 100644 --- a/src/sha512/rtl/sha512_ctrl.sv +++ b/src/sha512/rtl/sha512_ctrl.sv @@ -64,7 +64,8 @@ module sha512_ctrl // Interrupt output logic error_intr, - output logic notif_intr + output logic notif_intr, + input logic debugUnlock_or_scan_mode_switch ); //---------------------------------------------------------------- @@ -101,7 +102,8 @@ module sha512_ctrl .pv_wr_resp(pv_wr_resp), .pcr_signing_hash(pcr_signing_hash), .error_intr(error_intr), - .notif_intr(notif_intr) + .notif_intr(notif_intr), + .debugUnlock_or_scan_mode_switch(debugUnlock_or_scan_mode_switch) ); //instantiate ahb lite module diff --git a/src/sha512/rtl/sha512_param.sv b/src/sha512/rtl/sha512_param.sv deleted file mode 100644 index 74219698c..000000000 --- a/src/sha512/rtl/sha512_param.sv +++ /dev/null @@ -1,59 +0,0 @@ -// SPDX-License-Identifier: Apache-2.0 -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// - //---------------------------------------------------------------- - // Internal constant and parameter definitions. - //---------------------------------------------------------------- - localparam ADDR_NAME0 = 32'h00000000; - localparam ADDR_NAME1 = 32'h00000004; - localparam ADDR_VERSION0 = 32'h00000008; - localparam ADDR_VERSION1 = 32'h0000000c; - - localparam ADDR_CTRL = 32'h00000010; - localparam CTRL_INIT_BIT = 0; - localparam CTRL_NEXT_BIT = 1; - localparam CTRL_MODE_LOW_BIT = 2; - localparam CTRL_MODE_HIGH_BIT = 3; - localparam CTRL_WORK_FACTOR_BIT = 7; - - localparam ADDR_STATUS = 32'h00000018; - //localparam STATUS_READY_BIT = 0; - //localparam STATUS_VALID_BIT = 1; - - localparam ADDR_WORK_FACTOR_NUM = 32'h00000020; - - localparam ADDR_BLOCK_START = 32'h00000080; - localparam ADDR_BLOCK_END = 32'h000000ff; - - localparam ADDR_DIGEST_START = 32'h00000100; - localparam ADDR_DIGEST_END = 32'h0000013f; - - localparam SHA512_ADDR_INTR_START = 32'h00000800; - localparam SHA512_ADDR_INTR_END = 32'h00000BFC; - - localparam CORE_NAME0 = 32'h61327368; // "sha2" - localparam CORE_NAME1 = 32'h31322d35; // "-512" - localparam CORE_VERSION0 = 32'h3830302e; // "0.80" - localparam CORE_VERSION1 = 32'h00000000; // "0" - - localparam MODE_SHA_512_224 = 2'h0; - localparam MODE_SHA_512_256 = 2'h1; - localparam MODE_SHA_384 = 2'h2; - localparam MODE_SHA_512 = 2'h3; - - localparam DEFAULT_WORK_FACTOR_NUM = 32'h000f0000; - -//====================================================================== -// EOF sha512_param.sv -//====================================================================== diff --git a/src/sha512/rtl/sha512_params_pkg.sv b/src/sha512/rtl/sha512_params_pkg.sv new file mode 100644 index 000000000..292503a66 --- /dev/null +++ b/src/sha512/rtl/sha512_params_pkg.sv @@ -0,0 +1,31 @@ +// SPDX-License-Identifier: Apache-2.0 +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// +package sha512_params_pkg; + + localparam SHA512_CORE_NAME0 = 32'h61327368; // "sha2" + localparam SHA512_CORE_NAME1 = 32'h31322d35; // "-512" + localparam SHA512_CORE_VERSION0 = 32'h3830302e; // "0.80" + localparam SHA512_CORE_VERSION1 = 32'h00000000; // "0" + + localparam MODE_SHA_512_224 = 2'h0; + localparam MODE_SHA_512_256 = 2'h1; + localparam MODE_SHA_384 = 2'h2; + localparam MODE_SHA_512 = 2'h3; + +endpackage +//====================================================================== +// EOF sha512_params_pkg.sv +//====================================================================== diff --git a/src/sha512/rtl/sha512_reg.rdl b/src/sha512/rtl/sha512_reg.rdl index 3b383c2f2..71ec241ae 100644 --- a/src/sha512/rtl/sha512_reg.rdl +++ b/src/sha512/rtl/sha512_reg.rdl @@ -84,8 +84,8 @@ addrmap sha512_reg { field {desc = "Control next command bit"; singlepulse;} NEXT = 1'b0; field {desc = "Control mode command bits";} MODE[2] = 2'b10; field {desc = "Zeroize all internal registers"; singlepulse;} ZEROIZE = 1'b0; - field {desc = "Indicates last iteration for hash extend function. - Result of this INIT or NEXT cycle will be written back to PCR"; hwclr;} LAST = 1'b0; + field {desc = "Indicates last iteration for keyvault or hash extend function. + Result of this INIT or NEXT cycle will be written back to the appropriate vault"; hwclr;} LAST = 1'b0; } SHA512_CTRL @0x00000010; @@ -100,7 +100,7 @@ addrmap sha512_reg { This register is located at SHA512_base_address + 0x0000_0018."; default sw = r; - default hw = rw; + default hw = w; default resetsignal = reset_b; field {desc = "Status ready bit";} READY = 1'b0; field {desc = "Status valid bit";} VALID = 1'b0; @@ -150,7 +150,7 @@ addrmap sha512_reg { default hw = r; default resetsignal = reset_b; field {desc = "Nonce value for PCR Gen Hash Function";} NONCE[32] = 32'b0; - } SHA512_GEN_PCR_HASH_NONCE; + } SHA512_GEN_PCR_HASH_NONCE[8]; reg { name = "SHA512 PCR Hash Control"; desc = "Control register for PCR Gen Hash Function"; diff --git a/src/sha512/rtl/sha512_reg.sv b/src/sha512/rtl/sha512_reg.sv index 229e3545c..bd97bf079 100644 --- a/src/sha512/rtl/sha512_reg.sv +++ b/src/sha512/rtl/sha512_reg.sv @@ -74,7 +74,7 @@ module sha512_reg ( logic SHA512_VAULT_RD_STATUS; logic SHA512_KV_WR_CTRL; logic SHA512_KV_WR_STATUS; - logic SHA512_GEN_PCR_HASH_NONCE; + logic [8-1:0]SHA512_GEN_PCR_HASH_NONCE; logic SHA512_GEN_PCR_HASH_CTRL; logic SHA512_GEN_PCR_HASH_STATUS; logic [12-1:0]SHA512_GEN_PCR_HASH_DIGEST; @@ -125,11 +125,13 @@ module sha512_reg ( decoded_reg_strb.SHA512_VAULT_RD_STATUS = cpuif_req_masked & (cpuif_addr == 'h604); decoded_reg_strb.SHA512_KV_WR_CTRL = cpuif_req_masked & (cpuif_addr == 'h608); decoded_reg_strb.SHA512_KV_WR_STATUS = cpuif_req_masked & (cpuif_addr == 'h60c); - decoded_reg_strb.SHA512_GEN_PCR_HASH_NONCE = cpuif_req_masked & (cpuif_addr == 'h610); - decoded_reg_strb.SHA512_GEN_PCR_HASH_CTRL = cpuif_req_masked & (cpuif_addr == 'h614); - decoded_reg_strb.SHA512_GEN_PCR_HASH_STATUS = cpuif_req_masked & (cpuif_addr == 'h618); + for(int i0=0; i0<8; i0++) begin + decoded_reg_strb.SHA512_GEN_PCR_HASH_NONCE[i0] = cpuif_req_masked & (cpuif_addr == 'h610 + i0*'h4); + end + decoded_reg_strb.SHA512_GEN_PCR_HASH_CTRL = cpuif_req_masked & (cpuif_addr == 'h630); + decoded_reg_strb.SHA512_GEN_PCR_HASH_STATUS = cpuif_req_masked & (cpuif_addr == 'h634); for(int i0=0; i0<12; i0++) begin - decoded_reg_strb.SHA512_GEN_PCR_HASH_DIGEST[i0] = cpuif_req_masked & (cpuif_addr == 'h61c + i0*'h4); + decoded_reg_strb.SHA512_GEN_PCR_HASH_DIGEST[i0] = cpuif_req_masked & (cpuif_addr == 'h638 + i0*'h4); end decoded_reg_strb.intr_block_rf.global_intr_en_r = cpuif_req_masked & (cpuif_addr == 'h800); decoded_reg_strb.intr_block_rf.error_intr_en_r = cpuif_req_masked & (cpuif_addr == 'h804); @@ -188,16 +190,6 @@ module sha512_reg ( logic load_next; } LAST; } SHA512_CTRL; - struct packed{ - struct packed{ - logic next; - logic load_next; - } READY; - struct packed{ - logic next; - logic load_next; - } VALID; - } SHA512_STATUS; struct packed{ struct packed{ logic [31:0] next; @@ -279,7 +271,7 @@ module sha512_reg ( logic [31:0] next; logic load_next; } NONCE; - } SHA512_GEN_PCR_HASH_NONCE; + } [8-1:0]SHA512_GEN_PCR_HASH_NONCE; struct packed{ struct packed{ logic next; @@ -495,14 +487,6 @@ module sha512_reg ( logic value; } LAST; } SHA512_CTRL; - struct packed{ - struct packed{ - logic value; - } READY; - struct packed{ - logic value; - } VALID; - } SHA512_STATUS; struct packed{ struct packed{ logic [31:0] value; @@ -567,7 +551,7 @@ module sha512_reg ( struct packed{ logic [31:0] value; } NONCE; - } SHA512_GEN_PCR_HASH_NONCE; + } [8-1:0]SHA512_GEN_PCR_HASH_NONCE; struct packed{ struct packed{ logic value; @@ -820,44 +804,6 @@ module sha512_reg ( end end assign hwif_out.SHA512_CTRL.LAST.value = field_storage.SHA512_CTRL.LAST.value; - // Field: sha512_reg.SHA512_STATUS.READY - always_comb begin - automatic logic [0:0] next_c = field_storage.SHA512_STATUS.READY.value; - automatic logic load_next_c = '0; - if(1) begin // HW Write - next_c = hwif_in.SHA512_STATUS.READY.next; - load_next_c = '1; - end - field_combo.SHA512_STATUS.READY.next = next_c; - field_combo.SHA512_STATUS.READY.load_next = load_next_c; - end - always_ff @(posedge clk or negedge hwif_in.reset_b) begin - if(~hwif_in.reset_b) begin - field_storage.SHA512_STATUS.READY.value <= 'h0; - end else if(field_combo.SHA512_STATUS.READY.load_next) begin - field_storage.SHA512_STATUS.READY.value <= field_combo.SHA512_STATUS.READY.next; - end - end - assign hwif_out.SHA512_STATUS.READY.value = field_storage.SHA512_STATUS.READY.value; - // Field: sha512_reg.SHA512_STATUS.VALID - always_comb begin - automatic logic [0:0] next_c = field_storage.SHA512_STATUS.VALID.value; - automatic logic load_next_c = '0; - if(1) begin // HW Write - next_c = hwif_in.SHA512_STATUS.VALID.next; - load_next_c = '1; - end - field_combo.SHA512_STATUS.VALID.next = next_c; - field_combo.SHA512_STATUS.VALID.load_next = load_next_c; - end - always_ff @(posedge clk or negedge hwif_in.reset_b) begin - if(~hwif_in.reset_b) begin - field_storage.SHA512_STATUS.VALID.value <= 'h0; - end else if(field_combo.SHA512_STATUS.VALID.load_next) begin - field_storage.SHA512_STATUS.VALID.value <= field_combo.SHA512_STATUS.VALID.next; - end - end - assign hwif_out.SHA512_STATUS.VALID.value = field_storage.SHA512_STATUS.VALID.value; for(genvar i0=0; i0<32; i0++) begin // Field: sha512_reg.SHA512_BLOCK[].BLOCK always_comb begin @@ -1184,25 +1130,27 @@ module sha512_reg ( field_storage.SHA512_KV_WR_STATUS.VALID.value <= field_combo.SHA512_KV_WR_STATUS.VALID.next; end end - // Field: sha512_reg.SHA512_GEN_PCR_HASH_NONCE.NONCE - always_comb begin - automatic logic [31:0] next_c = field_storage.SHA512_GEN_PCR_HASH_NONCE.NONCE.value; - automatic logic load_next_c = '0; - if(decoded_reg_strb.SHA512_GEN_PCR_HASH_NONCE && decoded_req_is_wr) begin // SW write - next_c = (field_storage.SHA512_GEN_PCR_HASH_NONCE.NONCE.value & ~decoded_wr_biten[31:0]) | (decoded_wr_data[31:0] & decoded_wr_biten[31:0]); - load_next_c = '1; + for(genvar i0=0; i0<8; i0++) begin + // Field: sha512_reg.SHA512_GEN_PCR_HASH_NONCE[].NONCE + always_comb begin + automatic logic [31:0] next_c = field_storage.SHA512_GEN_PCR_HASH_NONCE[i0].NONCE.value; + automatic logic load_next_c = '0; + if(decoded_reg_strb.SHA512_GEN_PCR_HASH_NONCE[i0] && decoded_req_is_wr) begin // SW write + next_c = (field_storage.SHA512_GEN_PCR_HASH_NONCE[i0].NONCE.value & ~decoded_wr_biten[31:0]) | (decoded_wr_data[31:0] & decoded_wr_biten[31:0]); + load_next_c = '1; + end + field_combo.SHA512_GEN_PCR_HASH_NONCE[i0].NONCE.next = next_c; + field_combo.SHA512_GEN_PCR_HASH_NONCE[i0].NONCE.load_next = load_next_c; end - field_combo.SHA512_GEN_PCR_HASH_NONCE.NONCE.next = next_c; - field_combo.SHA512_GEN_PCR_HASH_NONCE.NONCE.load_next = load_next_c; - end - always_ff @(posedge clk or negedge hwif_in.reset_b) begin - if(~hwif_in.reset_b) begin - field_storage.SHA512_GEN_PCR_HASH_NONCE.NONCE.value <= 'h0; - end else if(field_combo.SHA512_GEN_PCR_HASH_NONCE.NONCE.load_next) begin - field_storage.SHA512_GEN_PCR_HASH_NONCE.NONCE.value <= field_combo.SHA512_GEN_PCR_HASH_NONCE.NONCE.next; + always_ff @(posedge clk or negedge hwif_in.reset_b) begin + if(~hwif_in.reset_b) begin + field_storage.SHA512_GEN_PCR_HASH_NONCE[i0].NONCE.value <= 'h0; + end else if(field_combo.SHA512_GEN_PCR_HASH_NONCE[i0].NONCE.load_next) begin + field_storage.SHA512_GEN_PCR_HASH_NONCE[i0].NONCE.value <= field_combo.SHA512_GEN_PCR_HASH_NONCE[i0].NONCE.next; + end end + assign hwif_out.SHA512_GEN_PCR_HASH_NONCE[i0].NONCE.value = field_storage.SHA512_GEN_PCR_HASH_NONCE[i0].NONCE.value; end - assign hwif_out.SHA512_GEN_PCR_HASH_NONCE.NONCE.value = field_storage.SHA512_GEN_PCR_HASH_NONCE.NONCE.value; // Field: sha512_reg.SHA512_GEN_PCR_HASH_CTRL.START always_comb begin automatic logic [0:0] next_c = field_storage.SHA512_GEN_PCR_HASH_CTRL.START.value; @@ -1987,8 +1935,8 @@ module sha512_reg ( for(genvar i0=0; i0<2; i0++) begin assign readback_array[i0*1 + 2][31:0] = (decoded_reg_strb.SHA512_VERSION[i0] && !decoded_req_is_wr) ? hwif_in.SHA512_VERSION[i0].VERSION.next : '0; end - assign readback_array[4][0:0] = (decoded_reg_strb.SHA512_STATUS && !decoded_req_is_wr) ? field_storage.SHA512_STATUS.READY.value : '0; - assign readback_array[4][1:1] = (decoded_reg_strb.SHA512_STATUS && !decoded_req_is_wr) ? field_storage.SHA512_STATUS.VALID.value : '0; + assign readback_array[4][0:0] = (decoded_reg_strb.SHA512_STATUS && !decoded_req_is_wr) ? hwif_in.SHA512_STATUS.READY.next : '0; + assign readback_array[4][1:1] = (decoded_reg_strb.SHA512_STATUS && !decoded_req_is_wr) ? hwif_in.SHA512_STATUS.VALID.next : '0; assign readback_array[4][31:2] = '0; for(genvar i0=0; i0<16; i0++) begin assign readback_array[i0*1 + 5][31:0] = (decoded_reg_strb.SHA512_DIGEST[i0] && !decoded_req_is_wr) ? field_storage.SHA512_DIGEST[i0].DIGEST.value : '0; diff --git a/src/sha512/rtl/sha512_reg_pkg.sv b/src/sha512/rtl/sha512_reg_pkg.sv index 8038ef5a3..6d2cfe3a6 100644 --- a/src/sha512/rtl/sha512_reg_pkg.sv +++ b/src/sha512/rtl/sha512_reg_pkg.sv @@ -199,19 +199,6 @@ package sha512_reg_pkg; sha512_reg__SHA512_CTRL__LAST__out_t LAST; } sha512_reg__SHA512_CTRL__out_t; - typedef struct packed{ - logic value; - } sha512_reg__SHA512_STATUS__READY__out_t; - - typedef struct packed{ - logic value; - } sha512_reg__SHA512_STATUS__VALID__out_t; - - typedef struct packed{ - sha512_reg__SHA512_STATUS__READY__out_t READY; - sha512_reg__SHA512_STATUS__VALID__out_t VALID; - } sha512_reg__SHA512_STATUS__out_t; - typedef struct packed{ logic [31:0] value; } sha512_reg__SHA512_BLOCK__BLOCK__out_t; @@ -327,11 +314,10 @@ package sha512_reg_pkg; typedef struct packed{ sha512_reg__SHA512_CTRL__out_t SHA512_CTRL; - sha512_reg__SHA512_STATUS__out_t SHA512_STATUS; sha512_reg__SHA512_BLOCK__out_t [32-1:0]SHA512_BLOCK; __kv_read_ctrl_reg__out_t SHA512_VAULT_RD_CTRL; __kv_write_ctrl_reg__out_t SHA512_KV_WR_CTRL; - sha512_reg__SHA512_GEN_PCR_HASH_NONCE__out_t SHA512_GEN_PCR_HASH_NONCE; + sha512_reg__SHA512_GEN_PCR_HASH_NONCE__out_t [8-1:0]SHA512_GEN_PCR_HASH_NONCE; sha512_reg__SHA512_GEN_PCR_HASH_CTRL__out_t SHA512_GEN_PCR_HASH_CTRL; sha512_reg__intr_block_t__out_t intr_block_rf; } sha512_reg__out_t; diff --git a/src/sha512/rtl/sha512_reg_uvm.sv b/src/sha512/rtl/sha512_reg_uvm.sv index 43974f339..3e6d35748 100644 --- a/src/sha512/rtl/sha512_reg_uvm.sv +++ b/src/sha512/rtl/sha512_reg_uvm.sv @@ -3,37 +3,79 @@ package sha512_reg_uvm; `include "uvm_macros.svh" import uvm_pkg::*; - + `include "sha512_reg_covergroups.svh" // Reg - sha512_reg::SHA512_NAME class sha512_reg__SHA512_NAME extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + sha512_reg__SHA512_NAME_bit_cg NAME_bit_cg[32]; + sha512_reg__SHA512_NAME_fld_cg fld_cg; rand uvm_reg_field NAME; function new(string name = "sha512_reg__SHA512_NAME"); - super.new(name, 32, UVM_NO_COVERAGE); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); virtual function void build(); this.NAME = new("NAME"); this.NAME.configure(this, 32, 0, "RO", 1, 'h0, 0, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(NAME_bit_cg[bt]) NAME_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); endfunction : build endclass : sha512_reg__SHA512_NAME // Reg - sha512_reg::SHA512_VERSION class sha512_reg__SHA512_VERSION extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + sha512_reg__SHA512_VERSION_bit_cg VERSION_bit_cg[32]; + sha512_reg__SHA512_VERSION_fld_cg fld_cg; rand uvm_reg_field VERSION; function new(string name = "sha512_reg__SHA512_VERSION"); - super.new(name, 32, UVM_NO_COVERAGE); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); virtual function void build(); this.VERSION = new("VERSION"); this.VERSION.configure(this, 32, 0, "RO", 1, 'h0, 0, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(VERSION_bit_cg[bt]) VERSION_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); endfunction : build endclass : sha512_reg__SHA512_VERSION // Reg - sha512_reg::SHA512_CTRL class sha512_reg__SHA512_CTRL extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + sha512_reg__SHA512_CTRL_bit_cg INIT_bit_cg[1]; + sha512_reg__SHA512_CTRL_bit_cg NEXT_bit_cg[1]; + sha512_reg__SHA512_CTRL_bit_cg MODE_bit_cg[2]; + sha512_reg__SHA512_CTRL_bit_cg ZEROIZE_bit_cg[1]; + sha512_reg__SHA512_CTRL_bit_cg LAST_bit_cg[1]; + sha512_reg__SHA512_CTRL_fld_cg fld_cg; rand uvm_reg_field INIT; rand uvm_reg_field NEXT; rand uvm_reg_field MODE; @@ -41,8 +83,13 @@ package sha512_reg_uvm; rand uvm_reg_field LAST; function new(string name = "sha512_reg__SHA512_CTRL"); - super.new(name, 32, UVM_NO_COVERAGE); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); virtual function void build(); this.INIT = new("INIT"); @@ -55,64 +102,137 @@ package sha512_reg_uvm; this.ZEROIZE.configure(this, 1, 4, "WO", 0, 'h0, 1, 1, 0); this.LAST = new("LAST"); this.LAST.configure(this, 1, 5, "WO", 1, 'h0, 1, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(INIT_bit_cg[bt]) INIT_bit_cg[bt] = new(); + foreach(NEXT_bit_cg[bt]) NEXT_bit_cg[bt] = new(); + foreach(MODE_bit_cg[bt]) MODE_bit_cg[bt] = new(); + foreach(ZEROIZE_bit_cg[bt]) ZEROIZE_bit_cg[bt] = new(); + foreach(LAST_bit_cg[bt]) LAST_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); endfunction : build endclass : sha512_reg__SHA512_CTRL // Reg - sha512_reg::SHA512_STATUS class sha512_reg__SHA512_STATUS extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + sha512_reg__SHA512_STATUS_bit_cg READY_bit_cg[1]; + sha512_reg__SHA512_STATUS_bit_cg VALID_bit_cg[1]; + sha512_reg__SHA512_STATUS_fld_cg fld_cg; rand uvm_reg_field READY; rand uvm_reg_field VALID; function new(string name = "sha512_reg__SHA512_STATUS"); - super.new(name, 32, UVM_NO_COVERAGE); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); virtual function void build(); this.READY = new("READY"); this.READY.configure(this, 1, 0, "RO", 1, 'h0, 1, 1, 0); this.VALID = new("VALID"); this.VALID.configure(this, 1, 1, "RO", 1, 'h0, 1, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(READY_bit_cg[bt]) READY_bit_cg[bt] = new(); + foreach(VALID_bit_cg[bt]) VALID_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); endfunction : build endclass : sha512_reg__SHA512_STATUS // Reg - sha512_reg::SHA512_BLOCK class sha512_reg__SHA512_BLOCK extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + sha512_reg__SHA512_BLOCK_bit_cg BLOCK_bit_cg[32]; + sha512_reg__SHA512_BLOCK_fld_cg fld_cg; rand uvm_reg_field BLOCK; function new(string name = "sha512_reg__SHA512_BLOCK"); - super.new(name, 32, UVM_NO_COVERAGE); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); virtual function void build(); this.BLOCK = new("BLOCK"); this.BLOCK.configure(this, 32, 0, "WO", 1, 'h0, 1, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(BLOCK_bit_cg[bt]) BLOCK_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); endfunction : build endclass : sha512_reg__SHA512_BLOCK // Reg - sha512_reg::SHA512_DIGEST class sha512_reg__SHA512_DIGEST extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + sha512_reg__SHA512_DIGEST_bit_cg DIGEST_bit_cg[32]; + sha512_reg__SHA512_DIGEST_fld_cg fld_cg; rand uvm_reg_field DIGEST; function new(string name = "sha512_reg__SHA512_DIGEST"); - super.new(name, 32, UVM_NO_COVERAGE); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); virtual function void build(); this.DIGEST = new("DIGEST"); this.DIGEST.configure(this, 32, 0, "RO", 1, 'h0, 1, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(DIGEST_bit_cg[bt]) DIGEST_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); endfunction : build endclass : sha512_reg__SHA512_DIGEST // Reg - kv_read_ctrl_reg class kv_read_ctrl_reg extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + kv_read_ctrl_reg_bit_cg read_en_bit_cg[1]; + kv_read_ctrl_reg_bit_cg read_entry_bit_cg[5]; + kv_read_ctrl_reg_bit_cg pcr_hash_extend_bit_cg[1]; + kv_read_ctrl_reg_bit_cg rsvd_bit_cg[25]; + kv_read_ctrl_reg_fld_cg fld_cg; rand uvm_reg_field read_en; rand uvm_reg_field read_entry; rand uvm_reg_field pcr_hash_extend; rand uvm_reg_field rsvd; function new(string name = "kv_read_ctrl_reg"); - super.new(name, 32, UVM_NO_COVERAGE); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); virtual function void build(); this.read_en = new("read_en"); @@ -123,18 +243,39 @@ package sha512_reg_uvm; this.pcr_hash_extend.configure(this, 1, 6, "RW", 0, 'h0, 1, 1, 0); this.rsvd = new("rsvd"); this.rsvd.configure(this, 25, 7, "RW", 0, 'h0, 1, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(read_en_bit_cg[bt]) read_en_bit_cg[bt] = new(); + foreach(read_entry_bit_cg[bt]) read_entry_bit_cg[bt] = new(); + foreach(pcr_hash_extend_bit_cg[bt]) pcr_hash_extend_bit_cg[bt] = new(); + foreach(rsvd_bit_cg[bt]) rsvd_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); endfunction : build endclass : kv_read_ctrl_reg // Reg - kv_status_reg class kv_status_reg extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + kv_status_reg_bit_cg READY_bit_cg[1]; + kv_status_reg_bit_cg VALID_bit_cg[1]; + kv_status_reg_bit_cg ERROR_bit_cg[8]; + kv_status_reg_fld_cg fld_cg; rand uvm_reg_field READY; rand uvm_reg_field VALID; rand uvm_reg_field ERROR; function new(string name = "kv_status_reg"); - super.new(name, 32, UVM_NO_COVERAGE); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); virtual function void build(); this.READY = new("READY"); @@ -143,11 +284,31 @@ package sha512_reg_uvm; this.VALID.configure(this, 1, 1, "RO", 1, 'h0, 1, 1, 0); this.ERROR = new("ERROR"); this.ERROR.configure(this, 8, 2, "RO", 1, 'h0, 1, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(READY_bit_cg[bt]) READY_bit_cg[bt] = new(); + foreach(VALID_bit_cg[bt]) VALID_bit_cg[bt] = new(); + foreach(ERROR_bit_cg[bt]) ERROR_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); endfunction : build endclass : kv_status_reg // Reg - kv_write_ctrl_reg class kv_write_ctrl_reg extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + kv_write_ctrl_reg_bit_cg write_en_bit_cg[1]; + kv_write_ctrl_reg_bit_cg write_entry_bit_cg[5]; + kv_write_ctrl_reg_bit_cg hmac_key_dest_valid_bit_cg[1]; + kv_write_ctrl_reg_bit_cg hmac_block_dest_valid_bit_cg[1]; + kv_write_ctrl_reg_bit_cg sha_block_dest_valid_bit_cg[1]; + kv_write_ctrl_reg_bit_cg ecc_pkey_dest_valid_bit_cg[1]; + kv_write_ctrl_reg_bit_cg ecc_seed_dest_valid_bit_cg[1]; + kv_write_ctrl_reg_bit_cg rsvd_bit_cg[21]; + kv_write_ctrl_reg_fld_cg fld_cg; rand uvm_reg_field write_en; rand uvm_reg_field write_entry; rand uvm_reg_field hmac_key_dest_valid; @@ -158,8 +319,13 @@ package sha512_reg_uvm; rand uvm_reg_field rsvd; function new(string name = "kv_write_ctrl_reg"); - super.new(name, 32, UVM_NO_COVERAGE); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); virtual function void build(); this.write_en = new("write_en"); @@ -178,95 +344,205 @@ package sha512_reg_uvm; this.ecc_seed_dest_valid.configure(this, 1, 10, "RW", 0, 'h0, 1, 1, 0); this.rsvd = new("rsvd"); this.rsvd.configure(this, 21, 11, "RW", 0, 'h0, 1, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(write_en_bit_cg[bt]) write_en_bit_cg[bt] = new(); + foreach(write_entry_bit_cg[bt]) write_entry_bit_cg[bt] = new(); + foreach(hmac_key_dest_valid_bit_cg[bt]) hmac_key_dest_valid_bit_cg[bt] = new(); + foreach(hmac_block_dest_valid_bit_cg[bt]) hmac_block_dest_valid_bit_cg[bt] = new(); + foreach(sha_block_dest_valid_bit_cg[bt]) sha_block_dest_valid_bit_cg[bt] = new(); + foreach(ecc_pkey_dest_valid_bit_cg[bt]) ecc_pkey_dest_valid_bit_cg[bt] = new(); + foreach(ecc_seed_dest_valid_bit_cg[bt]) ecc_seed_dest_valid_bit_cg[bt] = new(); + foreach(rsvd_bit_cg[bt]) rsvd_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); endfunction : build endclass : kv_write_ctrl_reg // Reg - sha512_reg::SHA512_GEN_PCR_HASH_NONCE class sha512_reg__SHA512_GEN_PCR_HASH_NONCE extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + sha512_reg__SHA512_GEN_PCR_HASH_NONCE_bit_cg NONCE_bit_cg[32]; + sha512_reg__SHA512_GEN_PCR_HASH_NONCE_fld_cg fld_cg; rand uvm_reg_field NONCE; function new(string name = "sha512_reg__SHA512_GEN_PCR_HASH_NONCE"); - super.new(name, 32, UVM_NO_COVERAGE); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); virtual function void build(); this.NONCE = new("NONCE"); this.NONCE.configure(this, 32, 0, "WO", 0, 'h0, 1, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(NONCE_bit_cg[bt]) NONCE_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); endfunction : build endclass : sha512_reg__SHA512_GEN_PCR_HASH_NONCE // Reg - sha512_reg::SHA512_GEN_PCR_HASH_CTRL class sha512_reg__SHA512_GEN_PCR_HASH_CTRL extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + sha512_reg__SHA512_GEN_PCR_HASH_CTRL_bit_cg START_bit_cg[1]; + sha512_reg__SHA512_GEN_PCR_HASH_CTRL_fld_cg fld_cg; rand uvm_reg_field START; function new(string name = "sha512_reg__SHA512_GEN_PCR_HASH_CTRL"); - super.new(name, 32, UVM_NO_COVERAGE); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); virtual function void build(); this.START = new("START"); this.START.configure(this, 1, 0, "WO", 0, 'h0, 1, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(START_bit_cg[bt]) START_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); endfunction : build endclass : sha512_reg__SHA512_GEN_PCR_HASH_CTRL // Reg - sha512_reg::SHA512_GEN_PCR_HASH_STATUS class sha512_reg__SHA512_GEN_PCR_HASH_STATUS extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + sha512_reg__SHA512_GEN_PCR_HASH_STATUS_bit_cg READY_bit_cg[1]; + sha512_reg__SHA512_GEN_PCR_HASH_STATUS_bit_cg VALID_bit_cg[1]; + sha512_reg__SHA512_GEN_PCR_HASH_STATUS_fld_cg fld_cg; rand uvm_reg_field READY; rand uvm_reg_field VALID; function new(string name = "sha512_reg__SHA512_GEN_PCR_HASH_STATUS"); - super.new(name, 32, UVM_NO_COVERAGE); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); virtual function void build(); this.READY = new("READY"); this.READY.configure(this, 1, 0, "RO", 1, 'h0, 1, 1, 0); this.VALID = new("VALID"); this.VALID.configure(this, 1, 1, "RO", 1, 'h0, 1, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(READY_bit_cg[bt]) READY_bit_cg[bt] = new(); + foreach(VALID_bit_cg[bt]) VALID_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); endfunction : build endclass : sha512_reg__SHA512_GEN_PCR_HASH_STATUS // Reg - sha512_reg::SHA512_GEN_PCR_HASH_DIGEST class sha512_reg__SHA512_GEN_PCR_HASH_DIGEST extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + sha512_reg__SHA512_GEN_PCR_HASH_DIGEST_bit_cg DIGEST_bit_cg[32]; + sha512_reg__SHA512_GEN_PCR_HASH_DIGEST_fld_cg fld_cg; rand uvm_reg_field DIGEST; function new(string name = "sha512_reg__SHA512_GEN_PCR_HASH_DIGEST"); - super.new(name, 32, UVM_NO_COVERAGE); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); virtual function void build(); this.DIGEST = new("DIGEST"); this.DIGEST.configure(this, 32, 0, "RO", 1, 'h0, 1, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(DIGEST_bit_cg[bt]) DIGEST_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); endfunction : build endclass : sha512_reg__SHA512_GEN_PCR_HASH_DIGEST // Reg - sha512_reg::global_intr_en_t class sha512_reg__global_intr_en_t extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + sha512_reg__global_intr_en_t_bit_cg error_en_bit_cg[1]; + sha512_reg__global_intr_en_t_bit_cg notif_en_bit_cg[1]; + sha512_reg__global_intr_en_t_fld_cg fld_cg; rand uvm_reg_field error_en; rand uvm_reg_field notif_en; function new(string name = "sha512_reg__global_intr_en_t"); - super.new(name, 32, UVM_NO_COVERAGE); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); virtual function void build(); this.error_en = new("error_en"); this.error_en.configure(this, 1, 0, "RW", 0, 'h0, 1, 1, 0); this.notif_en = new("notif_en"); this.notif_en.configure(this, 1, 1, "RW", 0, 'h0, 1, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(error_en_bit_cg[bt]) error_en_bit_cg[bt] = new(); + foreach(notif_en_bit_cg[bt]) notif_en_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); endfunction : build endclass : sha512_reg__global_intr_en_t // Reg - sha512_reg::error_intr_en_t class sha512_reg__error_intr_en_t extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + sha512_reg__error_intr_en_t_bit_cg error0_en_bit_cg[1]; + sha512_reg__error_intr_en_t_bit_cg error1_en_bit_cg[1]; + sha512_reg__error_intr_en_t_bit_cg error2_en_bit_cg[1]; + sha512_reg__error_intr_en_t_bit_cg error3_en_bit_cg[1]; + sha512_reg__error_intr_en_t_fld_cg fld_cg; rand uvm_reg_field error0_en; rand uvm_reg_field error1_en; rand uvm_reg_field error2_en; rand uvm_reg_field error3_en; function new(string name = "sha512_reg__error_intr_en_t"); - super.new(name, 32, UVM_NO_COVERAGE); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); virtual function void build(); this.error0_en = new("error0_en"); @@ -277,61 +553,131 @@ package sha512_reg_uvm; this.error2_en.configure(this, 1, 2, "RW", 0, 'h0, 1, 1, 0); this.error3_en = new("error3_en"); this.error3_en.configure(this, 1, 3, "RW", 0, 'h0, 1, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(error0_en_bit_cg[bt]) error0_en_bit_cg[bt] = new(); + foreach(error1_en_bit_cg[bt]) error1_en_bit_cg[bt] = new(); + foreach(error2_en_bit_cg[bt]) error2_en_bit_cg[bt] = new(); + foreach(error3_en_bit_cg[bt]) error3_en_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); endfunction : build endclass : sha512_reg__error_intr_en_t // Reg - sha512_reg::notif_intr_en_t class sha512_reg__notif_intr_en_t extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + sha512_reg__notif_intr_en_t_bit_cg notif_cmd_done_en_bit_cg[1]; + sha512_reg__notif_intr_en_t_fld_cg fld_cg; rand uvm_reg_field notif_cmd_done_en; function new(string name = "sha512_reg__notif_intr_en_t"); - super.new(name, 32, UVM_NO_COVERAGE); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); virtual function void build(); this.notif_cmd_done_en = new("notif_cmd_done_en"); this.notif_cmd_done_en.configure(this, 1, 0, "RW", 0, 'h0, 1, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(notif_cmd_done_en_bit_cg[bt]) notif_cmd_done_en_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); endfunction : build endclass : sha512_reg__notif_intr_en_t // Reg - sha512_reg::global_intr_t_agg_sts_dd3dcf0a class sha512_reg__global_intr_t_agg_sts_dd3dcf0a extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + sha512_reg__global_intr_t_agg_sts_dd3dcf0a_bit_cg agg_sts_bit_cg[1]; + sha512_reg__global_intr_t_agg_sts_dd3dcf0a_fld_cg fld_cg; rand uvm_reg_field agg_sts; function new(string name = "sha512_reg__global_intr_t_agg_sts_dd3dcf0a"); - super.new(name, 32, UVM_NO_COVERAGE); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); virtual function void build(); this.agg_sts = new("agg_sts"); this.agg_sts.configure(this, 1, 0, "RO", 1, 'h0, 1, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(agg_sts_bit_cg[bt]) agg_sts_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); endfunction : build endclass : sha512_reg__global_intr_t_agg_sts_dd3dcf0a // Reg - sha512_reg::global_intr_t_agg_sts_e6399b4a class sha512_reg__global_intr_t_agg_sts_e6399b4a extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + sha512_reg__global_intr_t_agg_sts_e6399b4a_bit_cg agg_sts_bit_cg[1]; + sha512_reg__global_intr_t_agg_sts_e6399b4a_fld_cg fld_cg; rand uvm_reg_field agg_sts; function new(string name = "sha512_reg__global_intr_t_agg_sts_e6399b4a"); - super.new(name, 32, UVM_NO_COVERAGE); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); virtual function void build(); this.agg_sts = new("agg_sts"); this.agg_sts.configure(this, 1, 0, "RO", 1, 'h0, 1, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(agg_sts_bit_cg[bt]) agg_sts_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); endfunction : build endclass : sha512_reg__global_intr_t_agg_sts_e6399b4a // Reg - sha512_reg::error_intr_t_error0_sts_28545624_error1_sts_40e0d3e1_error2_sts_b1cf2205_error3_sts_74a35378 class sha512_reg__error_intr_t_error0_sts_28545624_error1_sts_40e0d3e1_error2_sts_b1cf2205_error3_sts_74a35378 extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + sha512_reg__error_intr_t_error0_sts_28545624_error1_sts_40e0d3e1_error2_sts_b1cf2205_error3_sts_74a35378_bit_cg error0_sts_bit_cg[1]; + sha512_reg__error_intr_t_error0_sts_28545624_error1_sts_40e0d3e1_error2_sts_b1cf2205_error3_sts_74a35378_bit_cg error1_sts_bit_cg[1]; + sha512_reg__error_intr_t_error0_sts_28545624_error1_sts_40e0d3e1_error2_sts_b1cf2205_error3_sts_74a35378_bit_cg error2_sts_bit_cg[1]; + sha512_reg__error_intr_t_error0_sts_28545624_error1_sts_40e0d3e1_error2_sts_b1cf2205_error3_sts_74a35378_bit_cg error3_sts_bit_cg[1]; + sha512_reg__error_intr_t_error0_sts_28545624_error1_sts_40e0d3e1_error2_sts_b1cf2205_error3_sts_74a35378_fld_cg fld_cg; rand uvm_reg_field error0_sts; rand uvm_reg_field error1_sts; rand uvm_reg_field error2_sts; rand uvm_reg_field error3_sts; function new(string name = "sha512_reg__error_intr_t_error0_sts_28545624_error1_sts_40e0d3e1_error2_sts_b1cf2205_error3_sts_74a35378"); - super.new(name, 32, UVM_NO_COVERAGE); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); virtual function void build(); this.error0_sts = new("error0_sts"); @@ -342,33 +688,71 @@ package sha512_reg_uvm; this.error2_sts.configure(this, 1, 2, "W1C", 1, 'h0, 1, 1, 0); this.error3_sts = new("error3_sts"); this.error3_sts.configure(this, 1, 3, "W1C", 1, 'h0, 1, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(error0_sts_bit_cg[bt]) error0_sts_bit_cg[bt] = new(); + foreach(error1_sts_bit_cg[bt]) error1_sts_bit_cg[bt] = new(); + foreach(error2_sts_bit_cg[bt]) error2_sts_bit_cg[bt] = new(); + foreach(error3_sts_bit_cg[bt]) error3_sts_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); endfunction : build endclass : sha512_reg__error_intr_t_error0_sts_28545624_error1_sts_40e0d3e1_error2_sts_b1cf2205_error3_sts_74a35378 // Reg - sha512_reg::notif_intr_t_notif_cmd_done_sts_1c68637e class sha512_reg__notif_intr_t_notif_cmd_done_sts_1c68637e extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + sha512_reg__notif_intr_t_notif_cmd_done_sts_1c68637e_bit_cg notif_cmd_done_sts_bit_cg[1]; + sha512_reg__notif_intr_t_notif_cmd_done_sts_1c68637e_fld_cg fld_cg; rand uvm_reg_field notif_cmd_done_sts; function new(string name = "sha512_reg__notif_intr_t_notif_cmd_done_sts_1c68637e"); - super.new(name, 32, UVM_NO_COVERAGE); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); virtual function void build(); this.notif_cmd_done_sts = new("notif_cmd_done_sts"); this.notif_cmd_done_sts.configure(this, 1, 0, "W1C", 1, 'h0, 1, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(notif_cmd_done_sts_bit_cg[bt]) notif_cmd_done_sts_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); endfunction : build endclass : sha512_reg__notif_intr_t_notif_cmd_done_sts_1c68637e // Reg - sha512_reg::error_intr_trig_t class sha512_reg__error_intr_trig_t extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + sha512_reg__error_intr_trig_t_bit_cg error0_trig_bit_cg[1]; + sha512_reg__error_intr_trig_t_bit_cg error1_trig_bit_cg[1]; + sha512_reg__error_intr_trig_t_bit_cg error2_trig_bit_cg[1]; + sha512_reg__error_intr_trig_t_bit_cg error3_trig_bit_cg[1]; + sha512_reg__error_intr_trig_t_fld_cg fld_cg; rand uvm_reg_field error0_trig; rand uvm_reg_field error1_trig; rand uvm_reg_field error2_trig; rand uvm_reg_field error3_trig; function new(string name = "sha512_reg__error_intr_trig_t"); - super.new(name, 32, UVM_NO_COVERAGE); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); virtual function void build(); this.error0_trig = new("error0_trig"); @@ -379,160 +763,344 @@ package sha512_reg_uvm; this.error2_trig.configure(this, 1, 2, "W1S", 0, 'h0, 1, 1, 0); this.error3_trig = new("error3_trig"); this.error3_trig.configure(this, 1, 3, "W1S", 0, 'h0, 1, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(error0_trig_bit_cg[bt]) error0_trig_bit_cg[bt] = new(); + foreach(error1_trig_bit_cg[bt]) error1_trig_bit_cg[bt] = new(); + foreach(error2_trig_bit_cg[bt]) error2_trig_bit_cg[bt] = new(); + foreach(error3_trig_bit_cg[bt]) error3_trig_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); endfunction : build endclass : sha512_reg__error_intr_trig_t // Reg - sha512_reg::notif_intr_trig_t class sha512_reg__notif_intr_trig_t extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + sha512_reg__notif_intr_trig_t_bit_cg notif_cmd_done_trig_bit_cg[1]; + sha512_reg__notif_intr_trig_t_fld_cg fld_cg; rand uvm_reg_field notif_cmd_done_trig; function new(string name = "sha512_reg__notif_intr_trig_t"); - super.new(name, 32, UVM_NO_COVERAGE); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); virtual function void build(); this.notif_cmd_done_trig = new("notif_cmd_done_trig"); this.notif_cmd_done_trig.configure(this, 1, 0, "W1S", 0, 'h0, 1, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(notif_cmd_done_trig_bit_cg[bt]) notif_cmd_done_trig_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); endfunction : build endclass : sha512_reg__notif_intr_trig_t // Reg - sha512_reg::intr_count_t_cnt_35ace267 class sha512_reg__intr_count_t_cnt_35ace267 extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + sha512_reg__intr_count_t_cnt_35ace267_bit_cg cnt_bit_cg[32]; + sha512_reg__intr_count_t_cnt_35ace267_fld_cg fld_cg; rand uvm_reg_field cnt; function new(string name = "sha512_reg__intr_count_t_cnt_35ace267"); - super.new(name, 32, UVM_NO_COVERAGE); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); virtual function void build(); this.cnt = new("cnt"); this.cnt.configure(this, 32, 0, "RW", 1, 'h0, 1, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(cnt_bit_cg[bt]) cnt_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); endfunction : build endclass : sha512_reg__intr_count_t_cnt_35ace267 // Reg - sha512_reg::intr_count_t_cnt_73c42c28 class sha512_reg__intr_count_t_cnt_73c42c28 extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + sha512_reg__intr_count_t_cnt_73c42c28_bit_cg cnt_bit_cg[32]; + sha512_reg__intr_count_t_cnt_73c42c28_fld_cg fld_cg; rand uvm_reg_field cnt; function new(string name = "sha512_reg__intr_count_t_cnt_73c42c28"); - super.new(name, 32, UVM_NO_COVERAGE); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); virtual function void build(); this.cnt = new("cnt"); this.cnt.configure(this, 32, 0, "RW", 1, 'h0, 1, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(cnt_bit_cg[bt]) cnt_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); endfunction : build endclass : sha512_reg__intr_count_t_cnt_73c42c28 // Reg - sha512_reg::intr_count_t_cnt_d8af96ff class sha512_reg__intr_count_t_cnt_d8af96ff extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + sha512_reg__intr_count_t_cnt_d8af96ff_bit_cg cnt_bit_cg[32]; + sha512_reg__intr_count_t_cnt_d8af96ff_fld_cg fld_cg; rand uvm_reg_field cnt; function new(string name = "sha512_reg__intr_count_t_cnt_d8af96ff"); - super.new(name, 32, UVM_NO_COVERAGE); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); virtual function void build(); this.cnt = new("cnt"); this.cnt.configure(this, 32, 0, "RW", 1, 'h0, 1, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(cnt_bit_cg[bt]) cnt_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); endfunction : build endclass : sha512_reg__intr_count_t_cnt_d8af96ff // Reg - sha512_reg::intr_count_t_cnt_9bd7f809 class sha512_reg__intr_count_t_cnt_9bd7f809 extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + sha512_reg__intr_count_t_cnt_9bd7f809_bit_cg cnt_bit_cg[32]; + sha512_reg__intr_count_t_cnt_9bd7f809_fld_cg fld_cg; rand uvm_reg_field cnt; function new(string name = "sha512_reg__intr_count_t_cnt_9bd7f809"); - super.new(name, 32, UVM_NO_COVERAGE); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); virtual function void build(); this.cnt = new("cnt"); this.cnt.configure(this, 32, 0, "RW", 1, 'h0, 1, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(cnt_bit_cg[bt]) cnt_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); endfunction : build endclass : sha512_reg__intr_count_t_cnt_9bd7f809 // Reg - sha512_reg::intr_count_t_cnt_be67d6d5 class sha512_reg__intr_count_t_cnt_be67d6d5 extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + sha512_reg__intr_count_t_cnt_be67d6d5_bit_cg cnt_bit_cg[32]; + sha512_reg__intr_count_t_cnt_be67d6d5_fld_cg fld_cg; rand uvm_reg_field cnt; function new(string name = "sha512_reg__intr_count_t_cnt_be67d6d5"); - super.new(name, 32, UVM_NO_COVERAGE); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); virtual function void build(); this.cnt = new("cnt"); this.cnt.configure(this, 32, 0, "RW", 1, 'h0, 1, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(cnt_bit_cg[bt]) cnt_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); endfunction : build endclass : sha512_reg__intr_count_t_cnt_be67d6d5 // Reg - sha512_reg::intr_count_incr_t_pulse_37026c97 class sha512_reg__intr_count_incr_t_pulse_37026c97 extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + sha512_reg__intr_count_incr_t_pulse_37026c97_bit_cg pulse_bit_cg[1]; + sha512_reg__intr_count_incr_t_pulse_37026c97_fld_cg fld_cg; rand uvm_reg_field pulse; function new(string name = "sha512_reg__intr_count_incr_t_pulse_37026c97"); - super.new(name, 32, UVM_NO_COVERAGE); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); virtual function void build(); this.pulse = new("pulse"); this.pulse.configure(this, 1, 0, "RO", 1, 'h0, 1, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(pulse_bit_cg[bt]) pulse_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); endfunction : build endclass : sha512_reg__intr_count_incr_t_pulse_37026c97 // Reg - sha512_reg::intr_count_incr_t_pulse_d860d977 class sha512_reg__intr_count_incr_t_pulse_d860d977 extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + sha512_reg__intr_count_incr_t_pulse_d860d977_bit_cg pulse_bit_cg[1]; + sha512_reg__intr_count_incr_t_pulse_d860d977_fld_cg fld_cg; rand uvm_reg_field pulse; function new(string name = "sha512_reg__intr_count_incr_t_pulse_d860d977"); - super.new(name, 32, UVM_NO_COVERAGE); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); virtual function void build(); this.pulse = new("pulse"); this.pulse.configure(this, 1, 0, "RO", 1, 'h0, 1, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(pulse_bit_cg[bt]) pulse_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); endfunction : build endclass : sha512_reg__intr_count_incr_t_pulse_d860d977 // Reg - sha512_reg::intr_count_incr_t_pulse_87b45fe7 class sha512_reg__intr_count_incr_t_pulse_87b45fe7 extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + sha512_reg__intr_count_incr_t_pulse_87b45fe7_bit_cg pulse_bit_cg[1]; + sha512_reg__intr_count_incr_t_pulse_87b45fe7_fld_cg fld_cg; rand uvm_reg_field pulse; function new(string name = "sha512_reg__intr_count_incr_t_pulse_87b45fe7"); - super.new(name, 32, UVM_NO_COVERAGE); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); virtual function void build(); this.pulse = new("pulse"); this.pulse.configure(this, 1, 0, "RO", 1, 'h0, 1, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(pulse_bit_cg[bt]) pulse_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); endfunction : build endclass : sha512_reg__intr_count_incr_t_pulse_87b45fe7 // Reg - sha512_reg::intr_count_incr_t_pulse_c1689ee6 class sha512_reg__intr_count_incr_t_pulse_c1689ee6 extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + sha512_reg__intr_count_incr_t_pulse_c1689ee6_bit_cg pulse_bit_cg[1]; + sha512_reg__intr_count_incr_t_pulse_c1689ee6_fld_cg fld_cg; rand uvm_reg_field pulse; function new(string name = "sha512_reg__intr_count_incr_t_pulse_c1689ee6"); - super.new(name, 32, UVM_NO_COVERAGE); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); virtual function void build(); this.pulse = new("pulse"); this.pulse.configure(this, 1, 0, "RO", 1, 'h0, 1, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(pulse_bit_cg[bt]) pulse_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); endfunction : build endclass : sha512_reg__intr_count_incr_t_pulse_c1689ee6 // Reg - sha512_reg::intr_count_incr_t_pulse_6173128e class sha512_reg__intr_count_incr_t_pulse_6173128e extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + sha512_reg__intr_count_incr_t_pulse_6173128e_bit_cg pulse_bit_cg[1]; + sha512_reg__intr_count_incr_t_pulse_6173128e_fld_cg fld_cg; rand uvm_reg_field pulse; function new(string name = "sha512_reg__intr_count_incr_t_pulse_6173128e"); - super.new(name, 32, UVM_NO_COVERAGE); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); virtual function void build(); this.pulse = new("pulse"); this.pulse.configure(this, 1, 0, "RO", 1, 'h0, 1, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(pulse_bit_cg[bt]) pulse_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); endfunction : build endclass : sha512_reg__intr_count_incr_t_pulse_6173128e @@ -674,7 +1242,7 @@ package sha512_reg_uvm; rand kv_status_reg SHA512_VAULT_RD_STATUS; rand kv_write_ctrl_reg SHA512_KV_WR_CTRL; rand kv_status_reg SHA512_KV_WR_STATUS; - rand sha512_reg__SHA512_GEN_PCR_HASH_NONCE SHA512_GEN_PCR_HASH_NONCE; + rand sha512_reg__SHA512_GEN_PCR_HASH_NONCE SHA512_GEN_PCR_HASH_NONCE[8]; rand sha512_reg__SHA512_GEN_PCR_HASH_CTRL SHA512_GEN_PCR_HASH_CTRL; rand sha512_reg__SHA512_GEN_PCR_HASH_STATUS SHA512_GEN_PCR_HASH_STATUS; rand sha512_reg__SHA512_GEN_PCR_HASH_DIGEST SHA512_GEN_PCR_HASH_DIGEST[12]; @@ -744,27 +1312,29 @@ package sha512_reg_uvm; this.SHA512_KV_WR_STATUS.build(); this.default_map.add_reg(this.SHA512_KV_WR_STATUS, 'h60c); - this.SHA512_GEN_PCR_HASH_NONCE = new("SHA512_GEN_PCR_HASH_NONCE"); - this.SHA512_GEN_PCR_HASH_NONCE.configure(this); - - this.SHA512_GEN_PCR_HASH_NONCE.build(); - this.default_map.add_reg(this.SHA512_GEN_PCR_HASH_NONCE, 'h610); + foreach(this.SHA512_GEN_PCR_HASH_NONCE[i0]) begin + this.SHA512_GEN_PCR_HASH_NONCE[i0] = new($sformatf("SHA512_GEN_PCR_HASH_NONCE[%0d]", i0)); + this.SHA512_GEN_PCR_HASH_NONCE[i0].configure(this); + + this.SHA512_GEN_PCR_HASH_NONCE[i0].build(); + this.default_map.add_reg(this.SHA512_GEN_PCR_HASH_NONCE[i0], 'h610 + i0*'h4); + end this.SHA512_GEN_PCR_HASH_CTRL = new("SHA512_GEN_PCR_HASH_CTRL"); this.SHA512_GEN_PCR_HASH_CTRL.configure(this); this.SHA512_GEN_PCR_HASH_CTRL.build(); - this.default_map.add_reg(this.SHA512_GEN_PCR_HASH_CTRL, 'h614); + this.default_map.add_reg(this.SHA512_GEN_PCR_HASH_CTRL, 'h630); this.SHA512_GEN_PCR_HASH_STATUS = new("SHA512_GEN_PCR_HASH_STATUS"); this.SHA512_GEN_PCR_HASH_STATUS.configure(this); this.SHA512_GEN_PCR_HASH_STATUS.build(); - this.default_map.add_reg(this.SHA512_GEN_PCR_HASH_STATUS, 'h618); + this.default_map.add_reg(this.SHA512_GEN_PCR_HASH_STATUS, 'h634); foreach(this.SHA512_GEN_PCR_HASH_DIGEST[i0]) begin this.SHA512_GEN_PCR_HASH_DIGEST[i0] = new($sformatf("SHA512_GEN_PCR_HASH_DIGEST[%0d]", i0)); this.SHA512_GEN_PCR_HASH_DIGEST[i0].configure(this); this.SHA512_GEN_PCR_HASH_DIGEST[i0].build(); - this.default_map.add_reg(this.SHA512_GEN_PCR_HASH_DIGEST[i0], 'h61c + i0*'h4); + this.default_map.add_reg(this.SHA512_GEN_PCR_HASH_DIGEST[i0], 'h638 + i0*'h4); end this.intr_block_rf = new("intr_block_rf"); this.intr_block_rf.configure(this); @@ -773,4 +1343,5 @@ package sha512_reg_uvm; endfunction : build endclass : sha512_reg + `include "sha512_reg_sample.svh" endpackage: sha512_reg_uvm diff --git a/src/sha512/tb/sha512_ctrl_32bit_tb.sv b/src/sha512/tb/sha512_ctrl_32bit_tb.sv index cc212f031..adc8ddc1e 100644 --- a/src/sha512/tb/sha512_ctrl_32bit_tb.sv +++ b/src/sha512/tb/sha512_ctrl_32bit_tb.sv @@ -160,6 +160,9 @@ module sha512_ctrl_32bit_tb reg [31 : 0] read_data; reg [511 : 0] digest_data; + //bind coverage file + sha512_ctrl_cov_bind i_sha512_ctrl_cov_bind(); + //---------------------------------------------------------------- // Device Under Test. //---------------------------------------------------------------- @@ -195,7 +198,8 @@ module sha512_ctrl_32bit_tb .pv_wr_resp(pv_wr_resp_tb), .error_intr(error_intr_tb), - .notif_intr(notif_intr_tb) + .notif_intr(notif_intr_tb), + .debugUnlock_or_scan_mode_switch('0) ); //---------------------------------------------------------------- @@ -564,6 +568,8 @@ module sha512_ctrl_32bit_tb end_time = cycle_ctr - start_time; $display("*** Single block test processing time = %01d cycles", end_time); + write_single_word(ADDR_CTRL, {27'h0, 1'b1, 4'b0}); //zeroize + mask = get_mask(mode); masked_data = digest_data & mask; @@ -651,7 +657,8 @@ module sha512_ctrl_32bit_tb $display("*** Double block test processing time = %01d cycles", end_time); read_digest(); - + write_single_word(ADDR_CTRL, {27'h0, 1'b1, 4'b0}); //zeroize + masked_data1 = digest_data & mask; if (masked_data1 == expected1) @@ -736,6 +743,203 @@ module sha512_ctrl_32bit_tb endtask // double_block_test + //---------------------------------------------------------------- + // continuous_cmd_test() + // + // + // Perform test of a double block digest. + //---------------------------------------------------------------- + task continuous_cmd_test(input [7 : 0] tc_number, + input [1 : 0] mode, + input [1023 : 0] block0, + input [1023 : 0] block1, + input [511 : 0] expected + ); + reg [511 : 0] mask; + reg [511 : 0] masked_data; + reg [31 : 0] start_time; + reg [31 : 0] end_time; + + begin + $display("*** TC%01d - continuous command test started.", tc_ctr); + + // First block + write_block(block0); + write_single_word(ADDR_CTRL, {28'h0, mode, CTRL_INIT_VALUE}); + start_time = cycle_ctr; + #CLK_PERIOD; + hsel_i_tb = 0; + + #(CLK_PERIOD); + + for (int i=0; i<10; i++) + begin + write_single_word(ADDR_CTRL, {28'h0, mode, CTRL_INIT_VALUE}); + #CLK_PERIOD; + write_single_word(ADDR_CTRL, {28'h0, mode, CTRL_NEXT_VALUE}); + #CLK_PERIOD; + end + + wait_ready(); + + write_block(block1); + + // Final block + write_single_word(ADDR_CTRL, {28'h0, mode, CTRL_NEXT_VALUE}); + #CLK_PERIOD; + hsel_i_tb = 0; + + #(CLK_PERIOD); + + for (int i=0; i<10; i++) + begin + write_single_word(ADDR_CTRL, {28'h0, mode, CTRL_INIT_VALUE}); + #CLK_PERIOD; + write_single_word(ADDR_CTRL, {28'h0, mode, CTRL_NEXT_VALUE}); + #CLK_PERIOD; + end + + wait_ready(); + + end_time = cycle_ctr - start_time; + $display("*** Continuous command test processing time = %01d cycles", end_time); + read_digest(); + + mask = get_mask(mode); + masked_data = digest_data & mask; + + if (masked_data == expected) + begin + $display("TC%01d final block: OK.", tc_ctr); + end + else + begin + $display("TC%01d: ERROR in final digest", tc_ctr); + $display("TC%01d: Expected: 0x%0128x", tc_ctr, expected); + $display("TC%01d: Got: 0x%0128x", tc_ctr, masked_data); + error_ctr = error_ctr + 1; + end + + $display("*** TC%01d - Continuous command test done.", tc_ctr); + tc_ctr = tc_ctr + 1; + end + endtask // continuous_cmd_test + + + //---------------------------------------------------------------- + // zeroize_test() + // + //---------------------------------------------------------------- + task zeroize_test(input [7 : 0] tc_number, + input [1 : 0] mode, + input [1023 : 0] block0, + input [1023 : 0] block1, + input [511 : 0] expected + ); + begin + + $display("*** TC%01d - zeroize test started.", tc_ctr); + + // First test: assert zeroize when engine is working + write_block(block0); + + write_single_word(ADDR_CTRL, {27'h0, 1'b0, mode, CTRL_INIT_VALUE}); + #(10 * CLK_PERIOD); + + write_single_word(ADDR_CTRL, {27'h0, 1'b1, 4'b0}); //zeroize + #CLK_PERIOD; + hsel_i_tb = 0; + + wait_ready(); + read_digest(); + if (digest_data == 0) + begin + $display("TC%01d final block: OK.", tc_ctr); + end + else + begin + $display("TC%01d: ERROR in final digest", tc_ctr); + $display("TC%01d: Expected: 0x%128x", tc_ctr, 0); + $display("TC%01d: Got: 0x%128x", tc_ctr, digest_data); + error_ctr = error_ctr + 1; + end + tc_ctr = tc_ctr + 1; + + // Second test: assert zeroize with INIT + write_block(block0); + + write_single_word(ADDR_CTRL, {27'h0, 1'b1, mode, CTRL_INIT_VALUE}); //zeroize + #CLK_PERIOD; + hsel_i_tb = 0; + #(CLK_PERIOD); + + wait_ready(); + read_digest(); + if (digest_data == 0) + begin + $display("TC%01d final block: OK.", tc_ctr); + end + else + begin + $display("TC%01d: ERROR in final digest", tc_ctr); + $display("TC%01d: Expected: 0x%128x", tc_ctr, 0); + $display("TC%01d: Got: 0x%128x", tc_ctr, digest_data); + error_ctr = error_ctr + 1; + end + tc_ctr = tc_ctr + 1; + + // Third test: assert zeroize with NEXT + write_block(block0); + + write_single_word(ADDR_CTRL, {27'h0, 1'b1, mode, CTRL_NEXT_VALUE}); //zeroize + #CLK_PERIOD; + hsel_i_tb = 0; + #(CLK_PERIOD); + + wait_ready(); + read_digest(); + if (digest_data == 0) + begin + $display("TC%01d final block: OK.", tc_ctr); + end + else + begin + $display("TC%01d: ERROR in final digest", tc_ctr); + $display("TC%01d: Expected: 0x%128x", tc_ctr, 0); + $display("TC%01d: Got: 0x%128x", tc_ctr, digest_data); + error_ctr = error_ctr + 1; + end + tc_ctr = tc_ctr + 1; + + // Forth test: assert zeroize after NEXT + write_block(block0); + + write_single_word(ADDR_CTRL, {27'h0, 1'b0, mode, CTRL_NEXT_VALUE}); + #(10 * CLK_PERIOD); + + write_single_word(ADDR_CTRL, {27'h0, 1'b1, 4'b0}); //zeroize + #CLK_PERIOD; + hsel_i_tb = 0; + + wait_ready(); + read_digest(); + if (digest_data == 0) + begin + $display("TC%01d final block: OK.", tc_ctr); + end + else + begin + $display("TC%01d: ERROR in final digest", tc_ctr); + $display("TC%01d: Expected: 0x%128x", tc_ctr, 0); + $display("TC%01d: Got: 0x%128x", tc_ctr, digest_data); + error_ctr = error_ctr + 1; + end + + $display("*** TC%01d - zeroize test done.", tc_ctr); + tc_ctr = tc_ctr + 1; + end + endtask // zeroize_test + //---------------------------------------------------------------- // sha512_test // The main test functionality. @@ -815,6 +1019,10 @@ module sha512_ctrl_32bit_tb double_block_test_pipelined(8'h09, MODE_SHA_512, double_block_one, double_block_two, tc6_expected); + continuous_cmd_test(8'h0a, MODE_SHA_384, double_block_one, double_block_two, tc12_expected); + + zeroize_test(8'h0b, MODE_SHA_384, double_block_one, double_block_two, tc12_expected); + display_test_result(); $display(" -- Testbench for sha512 done. --"); diff --git a/src/sha512/uvmf_sha512/config/compile.yml b/src/sha512/uvmf_sha512/config/compile.yml index a6cf5f361..04c377aaa 100644 --- a/src/sha512/uvmf_sha512/config/compile.yml +++ b/src/sha512/uvmf_sha512/config/compile.yml @@ -4,6 +4,7 @@ schema_version: 2.4.0 requires: - uvmf_lib - sha512_ctrl + - sha512_coverage targets: tb: directories: diff --git a/src/sha512/uvmf_sha512/uvmf_template_output/project_benches/SHA512/tb/testbench/hdl_top.sv b/src/sha512/uvmf_sha512/uvmf_template_output/project_benches/SHA512/tb/testbench/hdl_top.sv index 295f78d9a..bf5448523 100644 --- a/src/sha512/uvmf_sha512/uvmf_template_output/project_benches/SHA512/tb/testbench/hdl_top.sv +++ b/src/sha512/uvmf_sha512/uvmf_template_output/project_benches/SHA512/tb/testbench/hdl_top.sv @@ -96,7 +96,19 @@ import uvmf_base_pkg_hdl::*; .hresp_o(SHA512_out_agent_bus.hresp), .hreadyout_o(SHA512_out_agent_bus.hreadyout), - .hrdata_o(SHA512_out_agent_bus.hrdata) + .hrdata_o(SHA512_out_agent_bus.hrdata), + .kv_read (), + .kv_write (), + .kv_rd_resp(), + .kv_wr_resp(), + .pv_read (), + .pv_write (), + .pv_rd_resp(), + .pv_wr_resp(), + .pcr_signing_hash(), + .error_intr(), + .notif_intr(), + .debugUnlock_or_scan_mode_switch('0) ); // pragma uvmf custom dut_instantiation end diff --git a/src/sha512_masked/config/sha512_masked_core.vf b/src/sha512_masked/config/sha512_masked_core.vf index 70acd2d05..e9d04af99 100644 --- a/src/sha512_masked/config/sha512_masked_core.vf +++ b/src/sha512_masked/config/sha512_masked_core.vf @@ -15,6 +15,7 @@ ${CALIPTRA_ROOT}/src/libs/rtl/apb_slv_sif.sv ${CALIPTRA_ROOT}/src/libs/rtl/ahb_slv_sif.sv ${CALIPTRA_ROOT}/src/libs/rtl/caliptra_icg.sv ${CALIPTRA_ROOT}/src/libs/rtl/clk_gate.sv +${CALIPTRA_ROOT}/src/libs/rtl/caliptra_2ff_sync.sv ${CALIPTRA_ROOT}/src/keyvault/rtl/kv_defines_pkg.sv ${CALIPTRA_ROOT}/src/keyvault/rtl/kv_macros.svh ${CALIPTRA_ROOT}/src/pcrvault/rtl/pv_defines_pkg.sv @@ -31,9 +32,9 @@ ${CALIPTRA_ROOT}/src/pcrvault/rtl/pv_reg_pkg.sv ${CALIPTRA_ROOT}/src/pcrvault/rtl/pv_reg.sv ${CALIPTRA_ROOT}/src/pcrvault/rtl/pv.sv ${CALIPTRA_ROOT}/src/sha512/rtl/sha512_reg_pkg.sv +${CALIPTRA_ROOT}/src/sha512/rtl/sha512_params_pkg.sv ${CALIPTRA_ROOT}/src/sha512/rtl/sha512_ctrl.sv ${CALIPTRA_ROOT}/src/sha512/rtl/sha512.sv -${CALIPTRA_ROOT}/src/sha512/rtl/sha512_param.sv ${CALIPTRA_ROOT}/src/sha512/rtl/sha512_core.v ${CALIPTRA_ROOT}/src/sha512/rtl/sha512_h_constants.v ${CALIPTRA_ROOT}/src/sha512/rtl/sha512_k_constants.v diff --git a/src/sha512_masked/config/sha512_masked_core_tb.vf b/src/sha512_masked/config/sha512_masked_core_tb.vf index f0139b6d1..b9fa2a419 100644 --- a/src/sha512_masked/config/sha512_masked_core_tb.vf +++ b/src/sha512_masked/config/sha512_masked_core_tb.vf @@ -16,6 +16,7 @@ ${CALIPTRA_ROOT}/src/libs/rtl/apb_slv_sif.sv ${CALIPTRA_ROOT}/src/libs/rtl/ahb_slv_sif.sv ${CALIPTRA_ROOT}/src/libs/rtl/caliptra_icg.sv ${CALIPTRA_ROOT}/src/libs/rtl/clk_gate.sv +${CALIPTRA_ROOT}/src/libs/rtl/caliptra_2ff_sync.sv ${CALIPTRA_ROOT}/src/keyvault/rtl/kv_defines_pkg.sv ${CALIPTRA_ROOT}/src/keyvault/rtl/kv_macros.svh ${CALIPTRA_ROOT}/src/pcrvault/rtl/pv_defines_pkg.sv @@ -33,9 +34,9 @@ ${CALIPTRA_ROOT}/src/pcrvault/rtl/pv_reg_pkg.sv ${CALIPTRA_ROOT}/src/pcrvault/rtl/pv_reg.sv ${CALIPTRA_ROOT}/src/pcrvault/rtl/pv.sv ${CALIPTRA_ROOT}/src/sha512/rtl/sha512_reg_pkg.sv +${CALIPTRA_ROOT}/src/sha512/rtl/sha512_params_pkg.sv ${CALIPTRA_ROOT}/src/sha512/rtl/sha512_ctrl.sv ${CALIPTRA_ROOT}/src/sha512/rtl/sha512.sv -${CALIPTRA_ROOT}/src/sha512/rtl/sha512_param.sv ${CALIPTRA_ROOT}/src/sha512/rtl/sha512_core.v ${CALIPTRA_ROOT}/src/sha512/rtl/sha512_h_constants.v ${CALIPTRA_ROOT}/src/sha512/rtl/sha512_k_constants.v diff --git a/src/soc_ifc/.gitignore b/src/soc_ifc/.gitignore new file mode 100644 index 000000000..dac06b307 --- /dev/null +++ b/src/soc_ifc/.gitignore @@ -0,0 +1,8 @@ +# This file tells git which files and/or directories to ignore in the repo +# Read the docs here: https://git-scm.com/docs/gitignore + +# Explicitly ignore html docs folder after removing it +# since it is now maintained in GitHub automatically +docs + +tb/EXP diff --git a/src/soc_ifc/config/compile.yml b/src/soc_ifc/config/compile.yml index 06b1e056a..203ddb636 100644 --- a/src/soc_ifc/config/compile.yml +++ b/src/soc_ifc/config/compile.yml @@ -13,12 +13,9 @@ targets: tb: directories: - $COMPILE_ROOT/rtl - - $COMPILE_ROOT/coverage files: - $COMPILE_ROOT/rtl/soc_ifc_pkg.sv - $COMPILE_ROOT/rtl/soc_ifc_reg_pkg.sv - - $COMPILE_ROOT/coverage/soc_ifc_cov_if.sv - - $COMPILE_ROOT/coverage/soc_ifc_cov_bind.sv --- provides: [soc_ifc_uvm_pkg] schema_version: 2.4.0 @@ -32,6 +29,19 @@ targets: - $COMPILE_ROOT/rtl/sha512_acc_csr_uvm.sv - $COMPILE_ROOT/rtl/soc_ifc_reg_uvm.sv --- +provides: [soc_ifc_coverage] +schema_version: 2.4.0 +requires: + - libs + - soc_ifc_pkg +targets: + tb: + directories: + - $COMPILE_ROOT/coverage + files: + - $COMPILE_ROOT/coverage/soc_ifc_cov_if.sv + - $COMPILE_ROOT/coverage/soc_ifc_cov_bind.sv +--- provides: [soc_ifc_top] schema_version: 2.4.0 requires: @@ -40,6 +50,7 @@ requires: - el2_veer_pkg - soc_ifc_pkg - sha512_ctrl + - caliptra_top_defines targets: rtl: directories: @@ -73,6 +84,7 @@ targets: provides: [soc_ifc_tb] schema_version: 2.4.0 requires: + - soc_ifc_coverage - soc_ifc_top - caliptra_top_defines targets: diff --git a/src/soc_ifc/config/soc_ifc_cov.vf b/src/soc_ifc/config/soc_ifc_cov.vf deleted file mode 100644 index e166015ce..000000000 --- a/src/soc_ifc/config/soc_ifc_cov.vf +++ /dev/null @@ -1,3 +0,0 @@ -+incdir+${CALIPTRA_ROOT}/src/soc_ifc/coverage -${CALIPTRA_ROOT}/src/soc_ifc/coverage/soc_ifc_cov_if.sv -${CALIPTRA_ROOT}/src/soc_ifc/coverage/soc_ifc_cov_bind.sv \ No newline at end of file diff --git a/src/soc_ifc/config/soc_ifc_coverage.vf b/src/soc_ifc/config/soc_ifc_coverage.vf new file mode 100644 index 000000000..59f66f789 --- /dev/null +++ b/src/soc_ifc/config/soc_ifc_coverage.vf @@ -0,0 +1,23 @@ ++incdir+${CALIPTRA_ROOT}/src/integration/rtl ++incdir+${CALIPTRA_ROOT}/src/libs/rtl ++incdir+${CALIPTRA_ROOT}/src/soc_ifc/rtl ++incdir+${CALIPTRA_ROOT}/src/soc_ifc/coverage +${CALIPTRA_ROOT}/src/integration/rtl/config_defines.svh +${CALIPTRA_ROOT}/src/integration/rtl/caliptra_reg_defines.svh +${CALIPTRA_ROOT}/src/libs/rtl/caliptra_sva.svh +${CALIPTRA_ROOT}/src/libs/rtl/caliptra_macros.svh +${CALIPTRA_ROOT}/src/libs/rtl/caliptra_sram.sv +${CALIPTRA_ROOT}/src/libs/rtl/ahb_defines_pkg.sv +${CALIPTRA_ROOT}/src/libs/rtl/caliptra_ahb_srom.sv +${CALIPTRA_ROOT}/src/libs/rtl/apb_slv_sif.sv +${CALIPTRA_ROOT}/src/libs/rtl/ahb_slv_sif.sv +${CALIPTRA_ROOT}/src/libs/rtl/caliptra_icg.sv +${CALIPTRA_ROOT}/src/libs/rtl/clk_gate.sv +${CALIPTRA_ROOT}/src/soc_ifc/rtl/soc_ifc_pkg.sv +${CALIPTRA_ROOT}/src/soc_ifc/rtl/soc_ifc_reg_pkg.sv +${CALIPTRA_ROOT}/src/soc_ifc/coverage/soc_ifc_cov_if.sv +${CALIPTRA_ROOT}/src/soc_ifc/coverage/soc_ifc_cov_bind.sv +${CALIPTRA_ROOT}/src/libs/rtl/ahb_to_reg_adapter.sv +${CALIPTRA_ROOT}/src/soc_ifc/rtl/mbox_csr_pkg.sv +${CALIPTRA_ROOT}/src/soc_ifc/rtl/sha512_acc_csr_pkg.sv +${CALIPTRA_ROOT}/src/soc_ifc/rtl/soc_ifc_reg_pkg.sv \ No newline at end of file diff --git a/src/soc_ifc/config/soc_ifc_pkg.vf b/src/soc_ifc/config/soc_ifc_pkg.vf index 06d681ba8..0ba5a33ba 100644 --- a/src/soc_ifc/config/soc_ifc_pkg.vf +++ b/src/soc_ifc/config/soc_ifc_pkg.vf @@ -1,9 +1,6 @@ +incdir+${CALIPTRA_ROOT}/src/soc_ifc/rtl -+incdir+${CALIPTRA_ROOT}/src/soc_ifc/coverage ${CALIPTRA_ROOT}/src/soc_ifc/rtl/soc_ifc_pkg.sv ${CALIPTRA_ROOT}/src/soc_ifc/rtl/soc_ifc_reg_pkg.sv -${CALIPTRA_ROOT}/src/soc_ifc/coverage/soc_ifc_cov_if.sv -${CALIPTRA_ROOT}/src/soc_ifc/coverage/soc_ifc_cov_bind.sv ${CALIPTRA_ROOT}/src/soc_ifc/rtl/mbox_csr_pkg.sv ${CALIPTRA_ROOT}/src/soc_ifc/rtl/sha512_acc_csr_pkg.sv ${CALIPTRA_ROOT}/src/soc_ifc/rtl/soc_ifc_reg_pkg.sv \ No newline at end of file diff --git a/src/soc_ifc/config/soc_ifc_tb.vf b/src/soc_ifc/config/soc_ifc_tb.vf index db6ea3cff..55dbfb700 100644 --- a/src/soc_ifc/config/soc_ifc_tb.vf +++ b/src/soc_ifc/config/soc_ifc_tb.vf @@ -18,6 +18,7 @@ ${CALIPTRA_ROOT}/src/libs/rtl/apb_slv_sif.sv ${CALIPTRA_ROOT}/src/libs/rtl/ahb_slv_sif.sv ${CALIPTRA_ROOT}/src/libs/rtl/caliptra_icg.sv ${CALIPTRA_ROOT}/src/libs/rtl/clk_gate.sv +${CALIPTRA_ROOT}/src/libs/rtl/caliptra_2ff_sync.sv ${CALIPTRA_ROOT}/src/soc_ifc/rtl/soc_ifc_pkg.sv ${CALIPTRA_ROOT}/src/soc_ifc/rtl/soc_ifc_reg_pkg.sv ${CALIPTRA_ROOT}/src/soc_ifc/coverage/soc_ifc_cov_if.sv @@ -46,9 +47,9 @@ ${CALIPTRA_ROOT}/src/pcrvault/rtl/pv_reg_pkg.sv ${CALIPTRA_ROOT}/src/pcrvault/rtl/pv_reg.sv ${CALIPTRA_ROOT}/src/pcrvault/rtl/pv.sv ${CALIPTRA_ROOT}/src/sha512/rtl/sha512_reg_pkg.sv +${CALIPTRA_ROOT}/src/sha512/rtl/sha512_params_pkg.sv ${CALIPTRA_ROOT}/src/sha512/rtl/sha512_ctrl.sv ${CALIPTRA_ROOT}/src/sha512/rtl/sha512.sv -${CALIPTRA_ROOT}/src/sha512/rtl/sha512_param.sv ${CALIPTRA_ROOT}/src/sha512/rtl/sha512_core.v ${CALIPTRA_ROOT}/src/sha512/rtl/sha512_h_constants.v ${CALIPTRA_ROOT}/src/sha512/rtl/sha512_k_constants.v diff --git a/src/soc_ifc/config/soc_ifc_top.vf b/src/soc_ifc/config/soc_ifc_top.vf index 03566f14d..4e1965ce5 100644 --- a/src/soc_ifc/config/soc_ifc_top.vf +++ b/src/soc_ifc/config/soc_ifc_top.vf @@ -1,7 +1,6 @@ +incdir+${CALIPTRA_ROOT}/src/integration/rtl +incdir+${CALIPTRA_ROOT}/src/libs/rtl +incdir+${CALIPTRA_ROOT}/src/soc_ifc/rtl -+incdir+${CALIPTRA_ROOT}/src/soc_ifc/coverage +incdir+${CALIPTRA_ROOT}/src/riscv_core/veer_el2/rtl +incdir+${CALIPTRA_ROOT}/src/keyvault/rtl +incdir+${CALIPTRA_ROOT}/src/pcrvault/rtl @@ -17,10 +16,9 @@ ${CALIPTRA_ROOT}/src/libs/rtl/apb_slv_sif.sv ${CALIPTRA_ROOT}/src/libs/rtl/ahb_slv_sif.sv ${CALIPTRA_ROOT}/src/libs/rtl/caliptra_icg.sv ${CALIPTRA_ROOT}/src/libs/rtl/clk_gate.sv +${CALIPTRA_ROOT}/src/libs/rtl/caliptra_2ff_sync.sv ${CALIPTRA_ROOT}/src/soc_ifc/rtl/soc_ifc_pkg.sv ${CALIPTRA_ROOT}/src/soc_ifc/rtl/soc_ifc_reg_pkg.sv -${CALIPTRA_ROOT}/src/soc_ifc/coverage/soc_ifc_cov_if.sv -${CALIPTRA_ROOT}/src/soc_ifc/coverage/soc_ifc_cov_bind.sv ${CALIPTRA_ROOT}/src/riscv_core/veer_el2/rtl/el2_pdef.vh ${CALIPTRA_ROOT}/src/riscv_core/veer_el2/rtl/include/el2_def.sv ${CALIPTRA_ROOT}/src/riscv_core/veer_el2/rtl/common_defines.sv @@ -43,9 +41,9 @@ ${CALIPTRA_ROOT}/src/pcrvault/rtl/pv_reg_pkg.sv ${CALIPTRA_ROOT}/src/pcrvault/rtl/pv_reg.sv ${CALIPTRA_ROOT}/src/pcrvault/rtl/pv.sv ${CALIPTRA_ROOT}/src/sha512/rtl/sha512_reg_pkg.sv +${CALIPTRA_ROOT}/src/sha512/rtl/sha512_params_pkg.sv ${CALIPTRA_ROOT}/src/sha512/rtl/sha512_ctrl.sv ${CALIPTRA_ROOT}/src/sha512/rtl/sha512.sv -${CALIPTRA_ROOT}/src/sha512/rtl/sha512_param.sv ${CALIPTRA_ROOT}/src/sha512/rtl/sha512_core.v ${CALIPTRA_ROOT}/src/sha512/rtl/sha512_h_constants.v ${CALIPTRA_ROOT}/src/sha512/rtl/sha512_k_constants.v diff --git a/src/soc_ifc/coverage/soc_ifc_cov_bind.sv b/src/soc_ifc/coverage/soc_ifc_cov_bind.sv index 45c07393a..47a39dbf2 100644 --- a/src/soc_ifc/coverage/soc_ifc_cov_bind.sv +++ b/src/soc_ifc/coverage/soc_ifc_cov_bind.sv @@ -15,6 +15,13 @@ module soc_ifc_cov_bind; `ifdef FCOV - bind soc_ifc_top soc_ifc_cov_if i_soc_ifc_cov_if(.*); + bind soc_ifc_top soc_ifc_cov_if #( + .AHB_ADDR_WIDTH(`CALIPTRA_SLAVE_ADDR_WIDTH(`CALIPTRA_SLAVE_SEL_SOC_IFC)), + .AHB_DATA_WIDTH(`CALIPTRA_AHB_HDATA_SIZE), + .APB_ADDR_WIDTH(`CALIPTRA_SLAVE_ADDR_WIDTH(`CALIPTRA_SLAVE_SEL_SOC_IFC)), + .APB_DATA_WIDTH(`CALIPTRA_APB_DATA_WIDTH), + .APB_USER_WIDTH(`CALIPTRA_APB_USER_WIDTH) + ) + i_soc_ifc_cov_if (.*); `endif endmodule diff --git a/src/soc_ifc/coverage/soc_ifc_cov_if.sv b/src/soc_ifc/coverage/soc_ifc_cov_if.sv index 48a80457f..74d9d4177 100644 --- a/src/soc_ifc/coverage/soc_ifc_cov_if.sv +++ b/src/soc_ifc/coverage/soc_ifc_cov_if.sv @@ -12,31 +12,3099 @@ // See the License for the specific language governing permissions and // limitations under the License. + + +// -- What the section under 'SCRIPT_OUTPUT' output covers -- +// +// Covergroups. +// - One per register; array of wide registers are under a single covergroup. +// +// Coverpoints: +// - Bins for total addressible space per register (including all fields) +// - Transition bins: An APB or AHB Write followed by APB or AHB Read within 1000 cycles +// - Ignore bins: IDLE (no read/write activity), simultaneous RD and WR over APB or AHB. +// +// Not covered and TODO. +// - Bins for individual fields within a register for special behavior. +// - New covergroups likely needed for cross coverage of related registers. +// - Registers that don't have storage allocated (CPTRA_SECURITY_STATE, CPTRA_HW_REV_ID, CPTRA_HW_CONFIG) +// - Possibly reduce the number of unique covergroup definitions + + `ifndef VERILATOR interface soc_ifc_cov_if import soc_ifc_pkg::*; import soc_ifc_reg_pkg::*; + #( + parameter APB_ADDR_WIDTH = 18 + ,parameter APB_DATA_WIDTH = 32 + ,parameter APB_USER_WIDTH = 32 + ,parameter AHB_ADDR_WIDTH = 18 + ,parameter AHB_DATA_WIDTH = 32 + ) ( input logic clk, - input logic trng_req, + input logic clk_cg, + input logic soc_ifc_clk_cg, + + //SoC boot signals + input logic cptra_pwrgood, + input logic cptra_rst_b, + input logic uc_req_dv, + input soc_ifc_req_t uc_req, + input logic soc_req_dv, + input soc_ifc_req_t soc_req, + input soc_ifc_req_t soc_ifc_reg_req_data, + input logic ready_for_fuses, input logic ready_for_fw_push, - input logic ready_for_runtime + input logic ready_for_runtime, + + input logic mailbox_data_avail, + input logic mailbox_flow_done, + + input var security_state_t security_state, + + input logic [1:0][31:0] generic_input_wires, + input logic BootFSM_BrkPoint, + input logic [1:0][31:0] generic_output_wires, + + //SoC APB Interface + input logic [APB_ADDR_WIDTH-1:0] paddr_i, + input logic psel_i, + input logic penable_i, + input logic pwrite_i, + input logic [APB_DATA_WIDTH-1:0] pwdata_i, + input logic [APB_USER_WIDTH-1:0] pauser_i, + input logic pready_o, + input logic [APB_DATA_WIDTH-1:0] prdata_o, + input logic pslverr_o, + + //uC AHB Lite Interface + input logic [AHB_ADDR_WIDTH-1:0] haddr_i, + input logic [AHB_DATA_WIDTH-1:0] hwdata_i, + input logic hsel_i, + input logic hwrite_i, + input logic hready_i, + input logic [1:0] htrans_i, + input logic [2:0] hsize_i, + + input logic hresp_o, + input logic hreadyout_o, + input logic [AHB_DATA_WIDTH-1:0] hrdata_o, + + //SoC Interrupts + input logic cptra_error_fatal, + input logic cptra_error_non_fatal, + input logic trng_req, + + //uC Interrupts + input wire soc_ifc_error_intr, + input wire soc_ifc_notif_intr, + input wire sha_error_intr, + input wire sha_notif_intr, + + //SRAM interface + input mbox_sram_req_t mbox_sram_req, + input mbox_sram_resp_t mbox_sram_resp, + + //Obfuscated UDS and FE + input logic clear_obf_secrets, + input logic scan_mode_f, + input logic [`CLP_OBF_KEY_DWORDS-1:0][31:0] cptra_obf_key, + input logic [`CLP_OBF_KEY_DWORDS-1:0][31:0] cptra_obf_key_reg, + input logic [`CLP_OBF_FE_DWORDS-1 :0][31:0] obf_field_entropy, + input logic [`CLP_OBF_UDS_DWORDS-1:0][31:0] obf_uds_seed, + + // NMI Vector + input logic [31:0] nmi_vector, + input logic nmi_intr, + + // ICCM Lock + input logic iccm_lock, + input logic iccm_axs_blocked, + + //Other blocks reset + input logic cptra_noncore_rst_b, + //uC reset + input logic cptra_uc_rst_b, + //Clock gating + input logic clk_gating_en ); - logic req_collision = i_soc_ifc_arb.req_collision; + enum bit [3:0] {IDLE = '0, AHB_RD = 4'h8, AHB_WR = 4'h4, APB_RD = 4'h2, APB_WR = 4'h1} bus_event_e; + + logic uc_rd, uc_wr, soc_rd, soc_wr; + + assign uc_rd = uc_req_dv & ~uc_req.write; + assign uc_wr = uc_req_dv & uc_req.write; + assign soc_rd = soc_req_dv & ~soc_req.write; + assign soc_wr = soc_req_dv & soc_req.write; covergroup soc_ifc_top_cov_grp @(posedge clk); - trng_req_cp: coverpoint trng_req; + //IO + cptra_pwrgood_cp: coverpoint cptra_pwrgood; + cptra_rst_b_cp: coverpoint cptra_rst_b; + cptra_noncore_rst_b_cp: coverpoint cptra_noncore_rst_b; + cptra_uc_rst_b_cp: coverpoint cptra_uc_rst_b; + clk_gating_en_cp: coverpoint clk_gating_en; + security_state_cp: coverpoint security_state; + scan_mode_f_cp: coverpoint scan_mode_f; ready_for_fuses_cp: coverpoint ready_for_fuses; ready_for_fw_push_cp: coverpoint ready_for_fw_push; ready_for_runtime_cp: coverpoint ready_for_runtime; - req_collision_cp: coverpoint req_collision; + mailbox_data_avail_cp: coverpoint mailbox_data_avail; + mailbox_flow_done_cp: coverpoint mailbox_flow_done; + cptra_error_fatal_cp: coverpoint cptra_error_fatal; + cptra_error_non_fatal_cp: coverpoint cptra_error_non_fatal; + trng_req_cp: coverpoint trng_req; + BootFSM_BrkPoint_cp: coverpoint BootFSM_BrkPoint; + generic_input_wires_cp: coverpoint generic_input_wires; + generic_output_wires_cp: coverpoint generic_output_wires; + nmi_vector_cp: coverpoint nmi_vector; + nmi_intr_cp: coverpoint nmi_intr; + soc_ifc_error_intr_cp: coverpoint soc_ifc_error_intr; + soc_ifc_notif_intr_cp: coverpoint soc_ifc_notif_intr; + sha_error_intr_cp: coverpoint sha_error_intr; + sha_notif_intr_cp: coverpoint sha_notif_intr; + mbox_sram_req_cp: coverpoint mbox_sram_req; + mbox_sram_resp_cp: coverpoint mbox_sram_resp; + clear_obf_secrets_cp: coverpoint clear_obf_secrets; + cptra_obf_key_reg_cp: coverpoint cptra_obf_key_reg; + obf_field_entropy_cp: coverpoint obf_field_entropy; + obf_uds_seed_cp: coverpoint obf_uds_seed; + iccm_lock_cp: coverpoint iccm_lock; + iccm_axs_blocked_cp: coverpoint iccm_axs_blocked; + endgroup + logic valid_arb_cycle; + assign valid_arb_cycle = i_soc_ifc_arb.uc_req_dv | i_soc_ifc_arb.soc_req_dv; + + covergroup soc_ifc_arb_cov_grp @(posedge clk iff (cptra_rst_b & valid_arb_cycle)); + req_collision_cp: coverpoint i_soc_ifc_arb.req_collision; + soc_has_priority_cp: coverpoint i_soc_ifc_arb.soc_has_priority; + valid_mbox_req_cp: coverpoint i_soc_ifc_arb.valid_mbox_req; + soc_mbox_addr_cp: coverpoint i_soc_ifc_arb.soc_req_data.addr inside {[MBOX_REG_START_ADDR:MBOX_REG_END_ADDR]}; + + soc_mbox_req_ip_cp: coverpoint i_soc_ifc_arb.soc_mbox_req_ip; + soc_reg_req_ip_cp: coverpoint i_soc_ifc_arb.soc_reg_req_ip; + soc_sha_req_ip_cp: coverpoint i_soc_ifc_arb.soc_sha_req_ip; + + uc_mbox_req_ip_cp: coverpoint i_soc_ifc_arb.uc_mbox_req_ip; + uc_reg_req_ip_cp: coverpoint i_soc_ifc_arb.uc_reg_req_ip; + uc_sha_req_ip_cp: coverpoint i_soc_ifc_arb.uc_sha_req_ip; + + uc_mbox_reg_req_cp: coverpoint i_soc_ifc_arb.uc_mbox_reg_req; + uc_mbox_dir_req_cp: coverpoint i_soc_ifc_arb.uc_mbox_dir_req; + soc_mbox_req_cp: coverpoint i_soc_ifc_arb.soc_mbox_req; + + uc_reg_req_cp: coverpoint i_soc_ifc_arb.uc_reg_req; + soc_reg_req_cp: coverpoint i_soc_ifc_arb.soc_reg_req; + + uc_sha_req_cp: coverpoint i_soc_ifc_arb.uc_sha_req; + soc_sha_req_cp: coverpoint i_soc_ifc_arb.soc_sha_req; + + //Cover soc req to mbox addr range with and without valid pauser. + soc_mbox_reqXvalid_mbox_req: cross soc_mbox_addr_cp, valid_mbox_req_cp; + + + + endgroup + + covergroup soc_ifc_boot_fsm_cov_grp @(posedge clk iff cptra_rst_b); + //FSM + boot_fsm_ps_cp: coverpoint i_soc_ifc_boot_fsm.boot_fsm_ps; + arc_BOOT_FUSE_BOOT_DONE_cp: coverpoint i_soc_ifc_boot_fsm.arc_BOOT_FUSE_BOOT_DONE; + arc_BOOT_FUSE_BOOT_WAIT_cp: coverpoint i_soc_ifc_boot_fsm.arc_BOOT_FUSE_BOOT_WAIT; + arc_BOOT_DONE_BOOT_IDLE_cp: coverpoint i_soc_ifc_boot_fsm.arc_BOOT_DONE_BOOT_IDLE; + arc_BOOT_DONE_BOOT_FWRST_cp: coverpoint i_soc_ifc_boot_fsm.arc_BOOT_DONE_BOOT_FWRST; + arc_BOOT_WAIT_BOOT_DONE_cp: coverpoint i_soc_ifc_boot_fsm.arc_BOOT_WAIT_BOOT_DONE; + fsm_iccm_unlock_cp: coverpoint i_soc_ifc_boot_fsm.fsm_iccm_unlock; + + + endgroup + + sha_fsm_state_e sha_fsm_ps; + assign sha_fsm_ps = sha_fsm_state_e'(i_sha512_acc_top.sha_fsm_ps); + + covergroup sha512_acc_cov_grp @(posedge clk iff cptra_rst_b); + //FSM + sha_fsm_ps_cp: coverpoint sha_fsm_ps; + arc_SHA_IDLE_SHA_BLOCK_0_cp: coverpoint i_sha512_acc_top.arc_SHA_IDLE_SHA_BLOCK_0; + arc_SHA_BLOCK_0_SHA_BLOCK_N_cp: coverpoint i_sha512_acc_top.arc_SHA_BLOCK_0_SHA_BLOCK_N; + arc_SHA_BLOCK_0_SHA_PAD0_cp: coverpoint i_sha512_acc_top.arc_SHA_BLOCK_0_SHA_PAD0; + arc_SHA_BLOCK_N_SHA_BLOCK_N_cp: coverpoint i_sha512_acc_top.arc_SHA_BLOCK_N_SHA_BLOCK_N; + arc_SHA_BLOCK_N_SHA_PAD0_cp: coverpoint i_sha512_acc_top.arc_SHA_BLOCK_N_SHA_PAD0; + arc_SHA_PAD0_SHA_PAD1_cp: coverpoint i_sha512_acc_top.arc_SHA_PAD0_SHA_PAD1; + arc_SHA_PAD0_SHA_DONE_cp: coverpoint i_sha512_acc_top.arc_SHA_PAD0_SHA_DONE; + arc_SHA_PAD1_SHA_DONE_cp: coverpoint i_sha512_acc_top.arc_SHA_PAD1_SHA_DONE; + arc_IDLE_cp: coverpoint (i_sha512_acc_top.arc_IDLE & (sha_fsm_ps != SHA_IDLE)); + + //controls + extra_pad_block_required_cp: coverpoint i_sha512_acc_top.extra_pad_block_required; + num_bytes_data_cp: coverpoint i_sha512_acc_top.num_bytes_data; + mailbox_mode_cp: coverpoint i_sha512_acc_top.mailbox_mode; + sha_mode_cp: coverpoint i_sha512_acc_top.sha_mode { + option.comment = "SHA Mode Encoding"; + bins MODE_SHA_384 = {2'h2}; + bins MODE_SHA_512 = {2'h3}; + } + + //crosses + mailbox_modeXextra_pad: cross mailbox_mode_cp, extra_pad_block_required_cp; + mailbox_modeXnum_bytes_data: cross mailbox_mode_cp, num_bytes_data_cp; + mailbox_modeXsha_mode_cpXsha_fsm_ps: cross mailbox_mode_cp, sha_mode_cp, sha_fsm_ps_cp; + + endgroup + + mbox_fsm_state_e mbox_fsm_ps; + assign mbox_fsm_ps = mbox_fsm_state_e'(i_mbox.mbox_fsm_ps); + + covergroup mbox_cov_grp @(posedge clk iff cptra_rst_b); + //FSM + mbox_fsm_ps_cp: coverpoint mbox_fsm_ps; + arc_FORCE_MBOX_UNLOCK_cp: coverpoint i_mbox.arc_FORCE_MBOX_UNLOCK; + arc_MBOX_IDLE_MBOX_RDY_FOR_CMD_cp: coverpoint i_mbox.arc_MBOX_IDLE_MBOX_RDY_FOR_CMD; + arc_MBOX_RDY_FOR_CMD_MBOX_RDY_FOR_DLEN_cp: coverpoint i_mbox.arc_MBOX_RDY_FOR_CMD_MBOX_RDY_FOR_DLEN; + arc_MBOX_RDY_FOR_DLEN_MBOX_RDY_FOR_DATA_cp: coverpoint i_mbox.arc_MBOX_RDY_FOR_DLEN_MBOX_RDY_FOR_DATA; + arc_MBOX_RDY_FOR_DATA_MBOX_EXECUTE_UC_cp: coverpoint i_mbox.arc_MBOX_RDY_FOR_DATA_MBOX_EXECUTE_UC; + arc_MBOX_RDY_FOR_DATA_MBOX_EXECUTE_SOC_cp: coverpoint i_mbox.arc_MBOX_RDY_FOR_DATA_MBOX_EXECUTE_SOC; + arc_MBOX_EXECUTE_UC_MBOX_IDLE_cp: coverpoint i_mbox.arc_MBOX_EXECUTE_UC_MBOX_IDLE; + arc_MBOX_EXECUTE_SOC_MBOX_IDLE_cp: coverpoint i_mbox.arc_MBOX_EXECUTE_SOC_MBOX_IDLE; + arc_MBOX_EXECUTE_UC_MBOX_EXECUTE_SOC_cp: coverpoint i_mbox.arc_MBOX_EXECUTE_UC_MBOX_EXECUTE_SOC; + arc_MBOX_EXECUTE_SOC_MBOX_EXECUTE_UC_cp: coverpoint i_mbox.arc_MBOX_EXECUTE_SOC_MBOX_EXECUTE_UC; + + //controls + soc_has_lock_cp: coverpoint i_mbox.soc_has_lock; + mask_rdata_cp: coverpoint i_mbox.mask_rdata; + dlen_in_dws_cp: coverpoint i_mbox.dlen_in_dws { + bins zero = {0}; + bins one = {1}; + bins range[32] = {[2:MBOX_SIZE_DWORDS-2]}; + bins almost_full = {MBOX_SIZE_DWORDS-1}; + bins full = {MBOX_SIZE_DWORDS};} + + sram_single_ecc_error_cp: coverpoint i_mbox.sram_single_ecc_error; + sram_double_ecc_error_cp: coverpoint i_mbox.sram_double_ecc_error; + + //req hold varieties + req_hold0_cp: coverpoint i_mbox.req_dv & (i_mbox.dir_req_dv_q & ~i_mbox.req_data.write); + req_hold1_cp: coverpoint i_mbox.req_dv & (i_mbox.dir_req_dv & i_mbox.sha_sram_req_dv); + req_hold2_cp: coverpoint i_mbox.req_dv & (i_mbox.hwif_out.mbox_dataout.dataout.swacc & i_mbox.mbox_protocol_sram_rd_f); + sha_sram_hold_cp: coverpoint i_mbox.sha_sram_hold; + + //special scenarios - only care about bin of 1 + dlen_gt_mbox_size_cp: coverpoint i_mbox.hwif_out.mbox_dlen.length.value > MBOX_SIZE_BYTES { + option.comment = "DLEN is programmed greater than mailbox size"; + bins one = {1};} + req_wrptr_gt_dlen_cp: coverpoint (mbox_fsm_ps == MBOX_RDY_FOR_DATA) & (i_mbox.mbox_wrptr > i_mbox.dlen_in_dws) { + option.comment = "Requester caused write pointer to increment past DLEN"; + bins one = {1};} + resp_wrptr_gt_dlen_cp: coverpoint (mbox_fsm_ps inside {MBOX_EXECUTE_UC,MBOX_EXECUTE_SOC}) & (i_mbox.mbox_wrptr > i_mbox.dlen_in_dws) { + option.comment = "Receiver caused write pointer to increment past DLEN"; + bins one = {1};} + wrptr_rollover_cp: coverpoint i_mbox.inc_wrptr & ~i_mbox.wrptr_inc_valid { + option.comment = "Write pointer tried to increment past mailbox size"; + bins one = {1};} + rdptr_gt_dlen_cp: coverpoint i_mbox.inc_rdptr & ~(i_mbox.mbox_rdptr <= i_mbox.dlen_in_dws) { + option.comment = "Read pointer tried to increment passed DLEN"; + bins one = {1};} + rdptr_rollover_cp: coverpoint i_mbox.inc_rdptr & ~(i_mbox.mbox_rdptr < (MBOX_SIZE_DWORDS-1)) { + option.comment = "Read pointer tried to increment passed mailbox size"; + bins one = {1};} + + endgroup + soc_ifc_top_cov_grp soc_ifc_top_cov_grp1 = new(); + soc_ifc_arb_cov_grp soc_ifc_arb_cov_grp1 = new(); + soc_ifc_boot_fsm_cov_grp soc_ifc_boot_fsm_cov_grp1 = new(); + sha512_acc_cov_grp sha512_acc_cov_grp1 = new(); + mbox_cov_grp mbox_cov_grp1 = new(); + +/* -- Working Reference -- + for(genvar i = 0; i < 4; i++) begin : fuse_runtime_svn_blk + covergroup soc_ifc_fuse_runtime_svn_cg @(posedge clk); + option.comment = {"fuse_runtime_svn", "_cp"}; + coverpoint i_soc_ifc_reg.field_storage.fuse_runtime_svn[i]; + endgroup + soc_ifc_fuse_runtime_svn_cg fuse_runtime_svn_cg = new(); + end +*/ + + + + + // ------------------------------------------------------------------- + // begin SCRIPT_OUTPUT + // ------------------------------------------------------------------- + + + // ------------------- COVERGROUP related signals & assigns ------------------- + + logic hit_CPTRA_HW_ERROR_FATAL; + logic [3:0] bus_CPTRA_HW_ERROR_FATAL; + logic [31:0] full_addr_CPTRA_HW_ERROR_FATAL = `CLP_SOC_IFC_REG_CPTRA_HW_ERROR_FATAL; + + logic hit_CPTRA_HW_ERROR_NON_FATAL; + logic [3:0] bus_CPTRA_HW_ERROR_NON_FATAL; + logic [31:0] full_addr_CPTRA_HW_ERROR_NON_FATAL = `CLP_SOC_IFC_REG_CPTRA_HW_ERROR_NON_FATAL; + + logic hit_CPTRA_FW_ERROR_FATAL; + logic [3:0] bus_CPTRA_FW_ERROR_FATAL; + logic [31:0] full_addr_CPTRA_FW_ERROR_FATAL = `CLP_SOC_IFC_REG_CPTRA_FW_ERROR_FATAL; + + logic hit_CPTRA_FW_ERROR_NON_FATAL; + logic [3:0] bus_CPTRA_FW_ERROR_NON_FATAL; + logic [31:0] full_addr_CPTRA_FW_ERROR_NON_FATAL = `CLP_SOC_IFC_REG_CPTRA_FW_ERROR_NON_FATAL; + + logic hit_CPTRA_HW_ERROR_ENC; + logic [3:0] bus_CPTRA_HW_ERROR_ENC; + logic [31:0] full_addr_CPTRA_HW_ERROR_ENC = `CLP_SOC_IFC_REG_CPTRA_HW_ERROR_ENC; + + logic hit_CPTRA_FW_ERROR_ENC; + logic [3:0] bus_CPTRA_FW_ERROR_ENC; + logic [31:0] full_addr_CPTRA_FW_ERROR_ENC = `CLP_SOC_IFC_REG_CPTRA_FW_ERROR_ENC; + + logic hit_CPTRA_FW_EXTENDED_ERROR_INFO[0:7]; + logic [3:0] bus_CPTRA_FW_EXTENDED_ERROR_INFO[0:7]; + logic [31:0] full_addr_CPTRA_FW_EXTENDED_ERROR_INFO[0:7]; + assign full_addr_CPTRA_FW_EXTENDED_ERROR_INFO[0] = `CLP_SOC_IFC_REG_CPTRA_FW_EXTENDED_ERROR_INFO_0; + assign full_addr_CPTRA_FW_EXTENDED_ERROR_INFO[1] = `CLP_SOC_IFC_REG_CPTRA_FW_EXTENDED_ERROR_INFO_1; + assign full_addr_CPTRA_FW_EXTENDED_ERROR_INFO[2] = `CLP_SOC_IFC_REG_CPTRA_FW_EXTENDED_ERROR_INFO_2; + assign full_addr_CPTRA_FW_EXTENDED_ERROR_INFO[3] = `CLP_SOC_IFC_REG_CPTRA_FW_EXTENDED_ERROR_INFO_3; + assign full_addr_CPTRA_FW_EXTENDED_ERROR_INFO[4] = `CLP_SOC_IFC_REG_CPTRA_FW_EXTENDED_ERROR_INFO_4; + assign full_addr_CPTRA_FW_EXTENDED_ERROR_INFO[5] = `CLP_SOC_IFC_REG_CPTRA_FW_EXTENDED_ERROR_INFO_5; + assign full_addr_CPTRA_FW_EXTENDED_ERROR_INFO[6] = `CLP_SOC_IFC_REG_CPTRA_FW_EXTENDED_ERROR_INFO_6; + assign full_addr_CPTRA_FW_EXTENDED_ERROR_INFO[7] = `CLP_SOC_IFC_REG_CPTRA_FW_EXTENDED_ERROR_INFO_7; + + logic hit_CPTRA_BOOT_STATUS; + logic [3:0] bus_CPTRA_BOOT_STATUS; + logic [31:0] full_addr_CPTRA_BOOT_STATUS = `CLP_SOC_IFC_REG_CPTRA_BOOT_STATUS; + + logic hit_CPTRA_FLOW_STATUS; + logic [3:0] bus_CPTRA_FLOW_STATUS; + logic [31:0] full_addr_CPTRA_FLOW_STATUS = `CLP_SOC_IFC_REG_CPTRA_FLOW_STATUS; + + logic hit_CPTRA_RESET_REASON; + logic [3:0] bus_CPTRA_RESET_REASON; + logic [31:0] full_addr_CPTRA_RESET_REASON = `CLP_SOC_IFC_REG_CPTRA_RESET_REASON; + + // logic hit_CPTRA_SECURITY_STATE; + // logic [3:0] bus_CPTRA_SECURITY_STATE; + // logic [31:0] full_addr_CPTRA_SECURITY_STATE = `CLP_SOC_IFC_REG_CPTRA_SECURITY_STATE; + + logic hit_CPTRA_MBOX_VALID_PAUSER[0:4]; + logic [3:0] bus_CPTRA_MBOX_VALID_PAUSER[0:4]; + logic [31:0] full_addr_CPTRA_MBOX_VALID_PAUSER[0:4]; + assign full_addr_CPTRA_MBOX_VALID_PAUSER[0] = `CLP_SOC_IFC_REG_CPTRA_MBOX_VALID_PAUSER_0; + assign full_addr_CPTRA_MBOX_VALID_PAUSER[1] = `CLP_SOC_IFC_REG_CPTRA_MBOX_VALID_PAUSER_1; + assign full_addr_CPTRA_MBOX_VALID_PAUSER[2] = `CLP_SOC_IFC_REG_CPTRA_MBOX_VALID_PAUSER_2; + assign full_addr_CPTRA_MBOX_VALID_PAUSER[3] = `CLP_SOC_IFC_REG_CPTRA_MBOX_VALID_PAUSER_3; + assign full_addr_CPTRA_MBOX_VALID_PAUSER[4] = `CLP_SOC_IFC_REG_CPTRA_MBOX_VALID_PAUSER_4; + + logic hit_CPTRA_MBOX_PAUSER_LOCK[0:4]; + logic [3:0] bus_CPTRA_MBOX_PAUSER_LOCK[0:4]; + logic [31:0] full_addr_CPTRA_MBOX_PAUSER_LOCK[0:4]; + assign full_addr_CPTRA_MBOX_PAUSER_LOCK[0] = `CLP_SOC_IFC_REG_CPTRA_MBOX_PAUSER_LOCK_0; + assign full_addr_CPTRA_MBOX_PAUSER_LOCK[1] = `CLP_SOC_IFC_REG_CPTRA_MBOX_PAUSER_LOCK_1; + assign full_addr_CPTRA_MBOX_PAUSER_LOCK[2] = `CLP_SOC_IFC_REG_CPTRA_MBOX_PAUSER_LOCK_2; + assign full_addr_CPTRA_MBOX_PAUSER_LOCK[3] = `CLP_SOC_IFC_REG_CPTRA_MBOX_PAUSER_LOCK_3; + assign full_addr_CPTRA_MBOX_PAUSER_LOCK[4] = `CLP_SOC_IFC_REG_CPTRA_MBOX_PAUSER_LOCK_4; + + logic hit_CPTRA_TRNG_VALID_PAUSER; + logic [3:0] bus_CPTRA_TRNG_VALID_PAUSER; + logic [31:0] full_addr_CPTRA_TRNG_VALID_PAUSER = `CLP_SOC_IFC_REG_CPTRA_TRNG_VALID_PAUSER; + + logic hit_CPTRA_TRNG_PAUSER_LOCK; + logic [3:0] bus_CPTRA_TRNG_PAUSER_LOCK; + logic [31:0] full_addr_CPTRA_TRNG_PAUSER_LOCK = `CLP_SOC_IFC_REG_CPTRA_TRNG_PAUSER_LOCK; + + logic hit_CPTRA_TRNG_DATA[0:11]; + logic [3:0] bus_CPTRA_TRNG_DATA[0:11]; + logic [31:0] full_addr_CPTRA_TRNG_DATA[0:11]; + assign full_addr_CPTRA_TRNG_DATA[0] = `CLP_SOC_IFC_REG_CPTRA_TRNG_DATA_0; + assign full_addr_CPTRA_TRNG_DATA[1] = `CLP_SOC_IFC_REG_CPTRA_TRNG_DATA_1; + assign full_addr_CPTRA_TRNG_DATA[2] = `CLP_SOC_IFC_REG_CPTRA_TRNG_DATA_2; + assign full_addr_CPTRA_TRNG_DATA[3] = `CLP_SOC_IFC_REG_CPTRA_TRNG_DATA_3; + assign full_addr_CPTRA_TRNG_DATA[4] = `CLP_SOC_IFC_REG_CPTRA_TRNG_DATA_4; + assign full_addr_CPTRA_TRNG_DATA[5] = `CLP_SOC_IFC_REG_CPTRA_TRNG_DATA_5; + assign full_addr_CPTRA_TRNG_DATA[6] = `CLP_SOC_IFC_REG_CPTRA_TRNG_DATA_6; + assign full_addr_CPTRA_TRNG_DATA[7] = `CLP_SOC_IFC_REG_CPTRA_TRNG_DATA_7; + assign full_addr_CPTRA_TRNG_DATA[8] = `CLP_SOC_IFC_REG_CPTRA_TRNG_DATA_8; + assign full_addr_CPTRA_TRNG_DATA[9] = `CLP_SOC_IFC_REG_CPTRA_TRNG_DATA_9; + assign full_addr_CPTRA_TRNG_DATA[10] = `CLP_SOC_IFC_REG_CPTRA_TRNG_DATA_10; + assign full_addr_CPTRA_TRNG_DATA[11] = `CLP_SOC_IFC_REG_CPTRA_TRNG_DATA_11; + + logic hit_CPTRA_TRNG_CTRL; + logic [3:0] bus_CPTRA_TRNG_CTRL; + logic [31:0] full_addr_CPTRA_TRNG_CTRL = `CLP_SOC_IFC_REG_CPTRA_TRNG_CTRL; + + logic hit_CPTRA_TRNG_STATUS; + logic [3:0] bus_CPTRA_TRNG_STATUS; + logic [31:0] full_addr_CPTRA_TRNG_STATUS = `CLP_SOC_IFC_REG_CPTRA_TRNG_STATUS; + + logic hit_CPTRA_FUSE_WR_DONE; + logic [3:0] bus_CPTRA_FUSE_WR_DONE; + logic [31:0] full_addr_CPTRA_FUSE_WR_DONE = `CLP_SOC_IFC_REG_CPTRA_FUSE_WR_DONE; + + logic hit_CPTRA_TIMER_CONFIG; + logic [3:0] bus_CPTRA_TIMER_CONFIG; + logic [31:0] full_addr_CPTRA_TIMER_CONFIG = `CLP_SOC_IFC_REG_CPTRA_TIMER_CONFIG; + + logic hit_CPTRA_BOOTFSM_GO; + logic [3:0] bus_CPTRA_BOOTFSM_GO; + logic [31:0] full_addr_CPTRA_BOOTFSM_GO = `CLP_SOC_IFC_REG_CPTRA_BOOTFSM_GO; + + logic hit_CPTRA_DBG_MANUF_SERVICE_REG; + logic [3:0] bus_CPTRA_DBG_MANUF_SERVICE_REG; + logic [31:0] full_addr_CPTRA_DBG_MANUF_SERVICE_REG = `CLP_SOC_IFC_REG_CPTRA_DBG_MANUF_SERVICE_REG; + + logic hit_CPTRA_CLK_GATING_EN; + logic [3:0] bus_CPTRA_CLK_GATING_EN; + logic [31:0] full_addr_CPTRA_CLK_GATING_EN = `CLP_SOC_IFC_REG_CPTRA_CLK_GATING_EN; + + logic hit_CPTRA_GENERIC_INPUT_WIRES[0:1]; + logic [3:0] bus_CPTRA_GENERIC_INPUT_WIRES[0:1]; + logic [31:0] full_addr_CPTRA_GENERIC_INPUT_WIRES[0:1]; + assign full_addr_CPTRA_GENERIC_INPUT_WIRES[0] = `CLP_SOC_IFC_REG_CPTRA_GENERIC_INPUT_WIRES_0; + assign full_addr_CPTRA_GENERIC_INPUT_WIRES[1] = `CLP_SOC_IFC_REG_CPTRA_GENERIC_INPUT_WIRES_1; + + logic hit_CPTRA_GENERIC_OUTPUT_WIRES[0:1]; + logic [3:0] bus_CPTRA_GENERIC_OUTPUT_WIRES[0:1]; + logic [31:0] full_addr_CPTRA_GENERIC_OUTPUT_WIRES[0:1]; + assign full_addr_CPTRA_GENERIC_OUTPUT_WIRES[0] = `CLP_SOC_IFC_REG_CPTRA_GENERIC_OUTPUT_WIRES_0; + assign full_addr_CPTRA_GENERIC_OUTPUT_WIRES[1] = `CLP_SOC_IFC_REG_CPTRA_GENERIC_OUTPUT_WIRES_1; + + // logic hit_CPTRA_HW_REV_ID; + // logic [3:0] bus_CPTRA_HW_REV_ID; + // logic [31:0] full_addr_CPTRA_HW_REV_ID = `CLP_SOC_IFC_REG_CPTRA_HW_REV_ID; + + logic hit_CPTRA_FW_REV_ID[0:1]; + logic [3:0] bus_CPTRA_FW_REV_ID[0:1]; + logic [31:0] full_addr_CPTRA_FW_REV_ID[0:1]; + assign full_addr_CPTRA_FW_REV_ID[0] = `CLP_SOC_IFC_REG_CPTRA_FW_REV_ID_0; + assign full_addr_CPTRA_FW_REV_ID[1] = `CLP_SOC_IFC_REG_CPTRA_FW_REV_ID_1; + + // logic hit_CPTRA_HW_CONFIG; + // logic [3:0] bus_CPTRA_HW_CONFIG; + // logic [31:0] full_addr_CPTRA_HW_CONFIG = `CLP_SOC_IFC_REG_CPTRA_HW_CONFIG; + + logic hit_CPTRA_WDT_TIMER1_EN; + logic [3:0] bus_CPTRA_WDT_TIMER1_EN; + logic [31:0] full_addr_CPTRA_WDT_TIMER1_EN = `CLP_SOC_IFC_REG_CPTRA_WDT_TIMER1_EN; + + logic hit_CPTRA_WDT_TIMER1_CTRL; + logic [3:0] bus_CPTRA_WDT_TIMER1_CTRL; + logic [31:0] full_addr_CPTRA_WDT_TIMER1_CTRL = `CLP_SOC_IFC_REG_CPTRA_WDT_TIMER1_CTRL; + + logic hit_CPTRA_WDT_TIMER1_TIMEOUT_PERIOD[0:1]; + logic [3:0] bus_CPTRA_WDT_TIMER1_TIMEOUT_PERIOD[0:1]; + logic [31:0] full_addr_CPTRA_WDT_TIMER1_TIMEOUT_PERIOD[0:1]; + assign full_addr_CPTRA_WDT_TIMER1_TIMEOUT_PERIOD[0] = `CLP_SOC_IFC_REG_CPTRA_WDT_TIMER1_TIMEOUT_PERIOD_0; + assign full_addr_CPTRA_WDT_TIMER1_TIMEOUT_PERIOD[1] = `CLP_SOC_IFC_REG_CPTRA_WDT_TIMER1_TIMEOUT_PERIOD_1; + + logic hit_CPTRA_WDT_TIMER2_EN; + logic [3:0] bus_CPTRA_WDT_TIMER2_EN; + logic [31:0] full_addr_CPTRA_WDT_TIMER2_EN = `CLP_SOC_IFC_REG_CPTRA_WDT_TIMER2_EN; + + logic hit_CPTRA_WDT_TIMER2_CTRL; + logic [3:0] bus_CPTRA_WDT_TIMER2_CTRL; + logic [31:0] full_addr_CPTRA_WDT_TIMER2_CTRL = `CLP_SOC_IFC_REG_CPTRA_WDT_TIMER2_CTRL; + + logic hit_CPTRA_WDT_TIMER2_TIMEOUT_PERIOD[0:1]; + logic [3:0] bus_CPTRA_WDT_TIMER2_TIMEOUT_PERIOD[0:1]; + logic [31:0] full_addr_CPTRA_WDT_TIMER2_TIMEOUT_PERIOD[0:1]; + assign full_addr_CPTRA_WDT_TIMER2_TIMEOUT_PERIOD[0] = `CLP_SOC_IFC_REG_CPTRA_WDT_TIMER2_TIMEOUT_PERIOD_0; + assign full_addr_CPTRA_WDT_TIMER2_TIMEOUT_PERIOD[1] = `CLP_SOC_IFC_REG_CPTRA_WDT_TIMER2_TIMEOUT_PERIOD_1; + + logic hit_CPTRA_WDT_STATUS; + logic [3:0] bus_CPTRA_WDT_STATUS; + logic [31:0] full_addr_CPTRA_WDT_STATUS = `CLP_SOC_IFC_REG_CPTRA_WDT_STATUS; + + logic hit_CPTRA_FUSE_VALID_PAUSER; + logic [3:0] bus_CPTRA_FUSE_VALID_PAUSER; + logic [31:0] full_addr_CPTRA_FUSE_VALID_PAUSER = `CLP_SOC_IFC_REG_CPTRA_FUSE_VALID_PAUSER; + + logic hit_CPTRA_FUSE_PAUSER_LOCK; + logic [3:0] bus_CPTRA_FUSE_PAUSER_LOCK; + logic [31:0] full_addr_CPTRA_FUSE_PAUSER_LOCK = `CLP_SOC_IFC_REG_CPTRA_FUSE_PAUSER_LOCK; + + logic hit_CPTRA_WDT_CFG[0:1]; + logic [3:0] bus_CPTRA_WDT_CFG[0:1]; + logic [31:0] full_addr_CPTRA_WDT_CFG[0:1]; + assign full_addr_CPTRA_WDT_CFG[0] = `CLP_SOC_IFC_REG_CPTRA_WDT_CFG_0; + assign full_addr_CPTRA_WDT_CFG[1] = `CLP_SOC_IFC_REG_CPTRA_WDT_CFG_1; + + logic hit_CPTRA_iTRNG_ENTROPY_CONFIG_0; + logic [3:0] bus_CPTRA_iTRNG_ENTROPY_CONFIG_0; + logic [31:0] full_addr_CPTRA_iTRNG_ENTROPY_CONFIG_0 = `CLP_SOC_IFC_REG_CPTRA_ITRNG_ENTROPY_CONFIG_0; + + logic hit_CPTRA_iTRNG_ENTROPY_CONFIG_1; + logic [3:0] bus_CPTRA_iTRNG_ENTROPY_CONFIG_1; + logic [31:0] full_addr_CPTRA_iTRNG_ENTROPY_CONFIG_1 = `CLP_SOC_IFC_REG_CPTRA_ITRNG_ENTROPY_CONFIG_1; + + logic hit_CPTRA_RSVD_REG[0:1]; + logic [3:0] bus_CPTRA_RSVD_REG[0:1]; + logic [31:0] full_addr_CPTRA_RSVD_REG[0:1]; + assign full_addr_CPTRA_RSVD_REG[0] = `CLP_SOC_IFC_REG_CPTRA_RSVD_REG_0; + assign full_addr_CPTRA_RSVD_REG[1] = `CLP_SOC_IFC_REG_CPTRA_RSVD_REG_1; + + logic hit_fuse_uds_seed[0:11]; + logic [3:0] bus_fuse_uds_seed[0:11]; + logic [31:0] full_addr_fuse_uds_seed[0:11]; + assign full_addr_fuse_uds_seed[0] = `CLP_SOC_IFC_REG_FUSE_UDS_SEED_0; + assign full_addr_fuse_uds_seed[1] = `CLP_SOC_IFC_REG_FUSE_UDS_SEED_1; + assign full_addr_fuse_uds_seed[2] = `CLP_SOC_IFC_REG_FUSE_UDS_SEED_2; + assign full_addr_fuse_uds_seed[3] = `CLP_SOC_IFC_REG_FUSE_UDS_SEED_3; + assign full_addr_fuse_uds_seed[4] = `CLP_SOC_IFC_REG_FUSE_UDS_SEED_4; + assign full_addr_fuse_uds_seed[5] = `CLP_SOC_IFC_REG_FUSE_UDS_SEED_5; + assign full_addr_fuse_uds_seed[6] = `CLP_SOC_IFC_REG_FUSE_UDS_SEED_6; + assign full_addr_fuse_uds_seed[7] = `CLP_SOC_IFC_REG_FUSE_UDS_SEED_7; + assign full_addr_fuse_uds_seed[8] = `CLP_SOC_IFC_REG_FUSE_UDS_SEED_8; + assign full_addr_fuse_uds_seed[9] = `CLP_SOC_IFC_REG_FUSE_UDS_SEED_9; + assign full_addr_fuse_uds_seed[10] = `CLP_SOC_IFC_REG_FUSE_UDS_SEED_10; + assign full_addr_fuse_uds_seed[11] = `CLP_SOC_IFC_REG_FUSE_UDS_SEED_11; + + logic hit_fuse_field_entropy[0:7]; + logic [3:0] bus_fuse_field_entropy[0:7]; + logic [31:0] full_addr_fuse_field_entropy[0:7]; + assign full_addr_fuse_field_entropy[0] = `CLP_SOC_IFC_REG_FUSE_FIELD_ENTROPY_0; + assign full_addr_fuse_field_entropy[1] = `CLP_SOC_IFC_REG_FUSE_FIELD_ENTROPY_1; + assign full_addr_fuse_field_entropy[2] = `CLP_SOC_IFC_REG_FUSE_FIELD_ENTROPY_2; + assign full_addr_fuse_field_entropy[3] = `CLP_SOC_IFC_REG_FUSE_FIELD_ENTROPY_3; + assign full_addr_fuse_field_entropy[4] = `CLP_SOC_IFC_REG_FUSE_FIELD_ENTROPY_4; + assign full_addr_fuse_field_entropy[5] = `CLP_SOC_IFC_REG_FUSE_FIELD_ENTROPY_5; + assign full_addr_fuse_field_entropy[6] = `CLP_SOC_IFC_REG_FUSE_FIELD_ENTROPY_6; + assign full_addr_fuse_field_entropy[7] = `CLP_SOC_IFC_REG_FUSE_FIELD_ENTROPY_7; + + logic hit_fuse_key_manifest_pk_hash[0:11]; + logic [3:0] bus_fuse_key_manifest_pk_hash[0:11]; + logic [31:0] full_addr_fuse_key_manifest_pk_hash[0:11]; + assign full_addr_fuse_key_manifest_pk_hash[0] = `CLP_SOC_IFC_REG_FUSE_KEY_MANIFEST_PK_HASH_0; + assign full_addr_fuse_key_manifest_pk_hash[1] = `CLP_SOC_IFC_REG_FUSE_KEY_MANIFEST_PK_HASH_1; + assign full_addr_fuse_key_manifest_pk_hash[2] = `CLP_SOC_IFC_REG_FUSE_KEY_MANIFEST_PK_HASH_2; + assign full_addr_fuse_key_manifest_pk_hash[3] = `CLP_SOC_IFC_REG_FUSE_KEY_MANIFEST_PK_HASH_3; + assign full_addr_fuse_key_manifest_pk_hash[4] = `CLP_SOC_IFC_REG_FUSE_KEY_MANIFEST_PK_HASH_4; + assign full_addr_fuse_key_manifest_pk_hash[5] = `CLP_SOC_IFC_REG_FUSE_KEY_MANIFEST_PK_HASH_5; + assign full_addr_fuse_key_manifest_pk_hash[6] = `CLP_SOC_IFC_REG_FUSE_KEY_MANIFEST_PK_HASH_6; + assign full_addr_fuse_key_manifest_pk_hash[7] = `CLP_SOC_IFC_REG_FUSE_KEY_MANIFEST_PK_HASH_7; + assign full_addr_fuse_key_manifest_pk_hash[8] = `CLP_SOC_IFC_REG_FUSE_KEY_MANIFEST_PK_HASH_8; + assign full_addr_fuse_key_manifest_pk_hash[9] = `CLP_SOC_IFC_REG_FUSE_KEY_MANIFEST_PK_HASH_9; + assign full_addr_fuse_key_manifest_pk_hash[10] = `CLP_SOC_IFC_REG_FUSE_KEY_MANIFEST_PK_HASH_10; + assign full_addr_fuse_key_manifest_pk_hash[11] = `CLP_SOC_IFC_REG_FUSE_KEY_MANIFEST_PK_HASH_11; + + logic hit_fuse_key_manifest_pk_hash_mask; + logic [3:0] bus_fuse_key_manifest_pk_hash_mask; + logic [31:0] full_addr_fuse_key_manifest_pk_hash_mask = `CLP_SOC_IFC_REG_FUSE_KEY_MANIFEST_PK_HASH_MASK; + + logic hit_fuse_owner_pk_hash[0:11]; + logic [3:0] bus_fuse_owner_pk_hash[0:11]; + logic [31:0] full_addr_fuse_owner_pk_hash[0:11]; + assign full_addr_fuse_owner_pk_hash[0] = `CLP_SOC_IFC_REG_FUSE_OWNER_PK_HASH_0; + assign full_addr_fuse_owner_pk_hash[1] = `CLP_SOC_IFC_REG_FUSE_OWNER_PK_HASH_1; + assign full_addr_fuse_owner_pk_hash[2] = `CLP_SOC_IFC_REG_FUSE_OWNER_PK_HASH_2; + assign full_addr_fuse_owner_pk_hash[3] = `CLP_SOC_IFC_REG_FUSE_OWNER_PK_HASH_3; + assign full_addr_fuse_owner_pk_hash[4] = `CLP_SOC_IFC_REG_FUSE_OWNER_PK_HASH_4; + assign full_addr_fuse_owner_pk_hash[5] = `CLP_SOC_IFC_REG_FUSE_OWNER_PK_HASH_5; + assign full_addr_fuse_owner_pk_hash[6] = `CLP_SOC_IFC_REG_FUSE_OWNER_PK_HASH_6; + assign full_addr_fuse_owner_pk_hash[7] = `CLP_SOC_IFC_REG_FUSE_OWNER_PK_HASH_7; + assign full_addr_fuse_owner_pk_hash[8] = `CLP_SOC_IFC_REG_FUSE_OWNER_PK_HASH_8; + assign full_addr_fuse_owner_pk_hash[9] = `CLP_SOC_IFC_REG_FUSE_OWNER_PK_HASH_9; + assign full_addr_fuse_owner_pk_hash[10] = `CLP_SOC_IFC_REG_FUSE_OWNER_PK_HASH_10; + assign full_addr_fuse_owner_pk_hash[11] = `CLP_SOC_IFC_REG_FUSE_OWNER_PK_HASH_11; + + logic hit_fuse_fmc_key_manifest_svn; + logic [3:0] bus_fuse_fmc_key_manifest_svn; + logic [31:0] full_addr_fuse_fmc_key_manifest_svn = `CLP_SOC_IFC_REG_FUSE_FMC_KEY_MANIFEST_SVN; + + logic hit_fuse_runtime_svn[0:3]; + logic [3:0] bus_fuse_runtime_svn[0:3]; + logic [31:0] full_addr_fuse_runtime_svn[0:3]; + assign full_addr_fuse_runtime_svn[0] = `CLP_SOC_IFC_REG_FUSE_RUNTIME_SVN_0; + assign full_addr_fuse_runtime_svn[1] = `CLP_SOC_IFC_REG_FUSE_RUNTIME_SVN_1; + assign full_addr_fuse_runtime_svn[2] = `CLP_SOC_IFC_REG_FUSE_RUNTIME_SVN_2; + assign full_addr_fuse_runtime_svn[3] = `CLP_SOC_IFC_REG_FUSE_RUNTIME_SVN_3; + + logic hit_fuse_anti_rollback_disable; + logic [3:0] bus_fuse_anti_rollback_disable; + logic [31:0] full_addr_fuse_anti_rollback_disable = `CLP_SOC_IFC_REG_FUSE_ANTI_ROLLBACK_DISABLE; + + logic hit_fuse_idevid_cert_attr[0:23]; + logic [3:0] bus_fuse_idevid_cert_attr[0:23]; + logic [31:0] full_addr_fuse_idevid_cert_attr[0:23]; + assign full_addr_fuse_idevid_cert_attr[0] = `CLP_SOC_IFC_REG_FUSE_IDEVID_CERT_ATTR_0; + assign full_addr_fuse_idevid_cert_attr[1] = `CLP_SOC_IFC_REG_FUSE_IDEVID_CERT_ATTR_1; + assign full_addr_fuse_idevid_cert_attr[2] = `CLP_SOC_IFC_REG_FUSE_IDEVID_CERT_ATTR_2; + assign full_addr_fuse_idevid_cert_attr[3] = `CLP_SOC_IFC_REG_FUSE_IDEVID_CERT_ATTR_3; + assign full_addr_fuse_idevid_cert_attr[4] = `CLP_SOC_IFC_REG_FUSE_IDEVID_CERT_ATTR_4; + assign full_addr_fuse_idevid_cert_attr[5] = `CLP_SOC_IFC_REG_FUSE_IDEVID_CERT_ATTR_5; + assign full_addr_fuse_idevid_cert_attr[6] = `CLP_SOC_IFC_REG_FUSE_IDEVID_CERT_ATTR_6; + assign full_addr_fuse_idevid_cert_attr[7] = `CLP_SOC_IFC_REG_FUSE_IDEVID_CERT_ATTR_7; + assign full_addr_fuse_idevid_cert_attr[8] = `CLP_SOC_IFC_REG_FUSE_IDEVID_CERT_ATTR_8; + assign full_addr_fuse_idevid_cert_attr[9] = `CLP_SOC_IFC_REG_FUSE_IDEVID_CERT_ATTR_9; + assign full_addr_fuse_idevid_cert_attr[10] = `CLP_SOC_IFC_REG_FUSE_IDEVID_CERT_ATTR_10; + assign full_addr_fuse_idevid_cert_attr[11] = `CLP_SOC_IFC_REG_FUSE_IDEVID_CERT_ATTR_11; + assign full_addr_fuse_idevid_cert_attr[12] = `CLP_SOC_IFC_REG_FUSE_IDEVID_CERT_ATTR_12; + assign full_addr_fuse_idevid_cert_attr[13] = `CLP_SOC_IFC_REG_FUSE_IDEVID_CERT_ATTR_13; + assign full_addr_fuse_idevid_cert_attr[14] = `CLP_SOC_IFC_REG_FUSE_IDEVID_CERT_ATTR_14; + assign full_addr_fuse_idevid_cert_attr[15] = `CLP_SOC_IFC_REG_FUSE_IDEVID_CERT_ATTR_15; + assign full_addr_fuse_idevid_cert_attr[16] = `CLP_SOC_IFC_REG_FUSE_IDEVID_CERT_ATTR_16; + assign full_addr_fuse_idevid_cert_attr[17] = `CLP_SOC_IFC_REG_FUSE_IDEVID_CERT_ATTR_17; + assign full_addr_fuse_idevid_cert_attr[18] = `CLP_SOC_IFC_REG_FUSE_IDEVID_CERT_ATTR_18; + assign full_addr_fuse_idevid_cert_attr[19] = `CLP_SOC_IFC_REG_FUSE_IDEVID_CERT_ATTR_19; + assign full_addr_fuse_idevid_cert_attr[20] = `CLP_SOC_IFC_REG_FUSE_IDEVID_CERT_ATTR_20; + assign full_addr_fuse_idevid_cert_attr[21] = `CLP_SOC_IFC_REG_FUSE_IDEVID_CERT_ATTR_21; + assign full_addr_fuse_idevid_cert_attr[22] = `CLP_SOC_IFC_REG_FUSE_IDEVID_CERT_ATTR_22; + assign full_addr_fuse_idevid_cert_attr[23] = `CLP_SOC_IFC_REG_FUSE_IDEVID_CERT_ATTR_23; + + logic hit_fuse_idevid_manuf_hsm_id[0:3]; + logic [3:0] bus_fuse_idevid_manuf_hsm_id[0:3]; + logic [31:0] full_addr_fuse_idevid_manuf_hsm_id[0:3]; + assign full_addr_fuse_idevid_manuf_hsm_id[0] = `CLP_SOC_IFC_REG_FUSE_IDEVID_MANUF_HSM_ID_0; + assign full_addr_fuse_idevid_manuf_hsm_id[1] = `CLP_SOC_IFC_REG_FUSE_IDEVID_MANUF_HSM_ID_1; + assign full_addr_fuse_idevid_manuf_hsm_id[2] = `CLP_SOC_IFC_REG_FUSE_IDEVID_MANUF_HSM_ID_2; + assign full_addr_fuse_idevid_manuf_hsm_id[3] = `CLP_SOC_IFC_REG_FUSE_IDEVID_MANUF_HSM_ID_3; + + logic hit_fuse_life_cycle; + logic [3:0] bus_fuse_life_cycle; + logic [31:0] full_addr_fuse_life_cycle = `CLP_SOC_IFC_REG_FUSE_LIFE_CYCLE; + + logic hit_fuse_lms_verify; + logic [3:0] bus_fuse_lms_verify; + logic [31:0] full_addr_fuse_lms_verify = `CLP_SOC_IFC_REG_FUSE_LMS_VERIFY; + + logic hit_fuse_lms_revocation; + logic [3:0] bus_fuse_lms_revocation; + logic [31:0] full_addr_fuse_lms_revocation = `CLP_SOC_IFC_REG_FUSE_LMS_REVOCATION; + + logic hit_fuse_soc_stepping_id; + logic [3:0] bus_fuse_soc_stepping_id; + logic [31:0] full_addr_fuse_soc_stepping_id = `CLP_SOC_IFC_REG_FUSE_SOC_STEPPING_ID; + + logic hit_internal_obf_key[0:7]; + logic [3:0] bus_internal_obf_key[0:7]; + logic [31:0] full_addr_internal_obf_key[0:7]; + assign full_addr_internal_obf_key[0] = `CLP_SOC_IFC_REG_INTERNAL_OBF_KEY_0; + assign full_addr_internal_obf_key[1] = `CLP_SOC_IFC_REG_INTERNAL_OBF_KEY_1; + assign full_addr_internal_obf_key[2] = `CLP_SOC_IFC_REG_INTERNAL_OBF_KEY_2; + assign full_addr_internal_obf_key[3] = `CLP_SOC_IFC_REG_INTERNAL_OBF_KEY_3; + assign full_addr_internal_obf_key[4] = `CLP_SOC_IFC_REG_INTERNAL_OBF_KEY_4; + assign full_addr_internal_obf_key[5] = `CLP_SOC_IFC_REG_INTERNAL_OBF_KEY_5; + assign full_addr_internal_obf_key[6] = `CLP_SOC_IFC_REG_INTERNAL_OBF_KEY_6; + assign full_addr_internal_obf_key[7] = `CLP_SOC_IFC_REG_INTERNAL_OBF_KEY_7; + + logic hit_internal_iccm_lock; + logic [3:0] bus_internal_iccm_lock; + logic [31:0] full_addr_internal_iccm_lock = `CLP_SOC_IFC_REG_INTERNAL_ICCM_LOCK; + + logic hit_internal_fw_update_reset; + logic [3:0] bus_internal_fw_update_reset; + logic [31:0] full_addr_internal_fw_update_reset = `CLP_SOC_IFC_REG_INTERNAL_FW_UPDATE_RESET; + + logic hit_internal_fw_update_reset_wait_cycles; + logic [3:0] bus_internal_fw_update_reset_wait_cycles; + logic [31:0] full_addr_internal_fw_update_reset_wait_cycles = `CLP_SOC_IFC_REG_INTERNAL_FW_UPDATE_RESET_WAIT_CYCLES; + + logic hit_internal_nmi_vector; + logic [3:0] bus_internal_nmi_vector; + logic [31:0] full_addr_internal_nmi_vector = `CLP_SOC_IFC_REG_INTERNAL_NMI_VECTOR; + + logic hit_internal_hw_error_fatal_mask; + logic [3:0] bus_internal_hw_error_fatal_mask; + logic [31:0] full_addr_internal_hw_error_fatal_mask = `CLP_SOC_IFC_REG_INTERNAL_HW_ERROR_FATAL_MASK; + + logic hit_internal_hw_error_non_fatal_mask; + logic [3:0] bus_internal_hw_error_non_fatal_mask; + logic [31:0] full_addr_internal_hw_error_non_fatal_mask = `CLP_SOC_IFC_REG_INTERNAL_HW_ERROR_NON_FATAL_MASK; + + logic hit_internal_fw_error_fatal_mask; + logic [3:0] bus_internal_fw_error_fatal_mask; + logic [31:0] full_addr_internal_fw_error_fatal_mask = `CLP_SOC_IFC_REG_INTERNAL_FW_ERROR_FATAL_MASK; + + logic hit_internal_fw_error_non_fatal_mask; + logic [3:0] bus_internal_fw_error_non_fatal_mask; + logic [31:0] full_addr_internal_fw_error_non_fatal_mask = `CLP_SOC_IFC_REG_INTERNAL_FW_ERROR_NON_FATAL_MASK; + + logic hit_internal_rv_mtime_l; + logic [3:0] bus_internal_rv_mtime_l; + logic [31:0] full_addr_internal_rv_mtime_l = `CLP_SOC_IFC_REG_INTERNAL_RV_MTIME_L; + + logic hit_internal_rv_mtime_h; + logic [3:0] bus_internal_rv_mtime_h; + logic [31:0] full_addr_internal_rv_mtime_h = `CLP_SOC_IFC_REG_INTERNAL_RV_MTIME_H; + + logic hit_internal_rv_mtimecmp_l; + logic [3:0] bus_internal_rv_mtimecmp_l; + logic [31:0] full_addr_internal_rv_mtimecmp_l = `CLP_SOC_IFC_REG_INTERNAL_RV_MTIMECMP_L; + + logic hit_internal_rv_mtimecmp_h; + logic [3:0] bus_internal_rv_mtimecmp_h; + logic [31:0] full_addr_internal_rv_mtimecmp_h = `CLP_SOC_IFC_REG_INTERNAL_RV_MTIMECMP_H; + + logic hit_intr_brf_global_intr_en_r; + logic [3:0] bus_intr_brf_global_intr_en_r; + logic [31:0] full_addr_intr_brf_global_intr_en_r = `CLP_SOC_IFC_REG_INTR_BLOCK_RF_GLOBAL_INTR_EN_R; + + logic hit_intr_brf_error_intr_en_r; + logic [3:0] bus_intr_brf_error_intr_en_r; + logic [31:0] full_addr_intr_brf_error_intr_en_r = `CLP_SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTR_EN_R; + + logic hit_intr_brf_notif_intr_en_r; + logic [3:0] bus_intr_brf_notif_intr_en_r; + logic [31:0] full_addr_intr_brf_notif_intr_en_r = `CLP_SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTR_EN_R; + + logic hit_intr_brf_error_global_intr_r; + logic [3:0] bus_intr_brf_error_global_intr_r; + logic [31:0] full_addr_intr_brf_error_global_intr_r = `CLP_SOC_IFC_REG_INTR_BLOCK_RF_ERROR_GLOBAL_INTR_R; + + logic hit_intr_brf_notif_global_intr_r; + logic [3:0] bus_intr_brf_notif_global_intr_r; + logic [31:0] full_addr_intr_brf_notif_global_intr_r = `CLP_SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_GLOBAL_INTR_R; + + logic hit_intr_brf_error_internal_intr_r; + logic [3:0] bus_intr_brf_error_internal_intr_r; + logic [31:0] full_addr_intr_brf_error_internal_intr_r = `CLP_SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R; + + logic hit_intr_brf_notif_internal_intr_r; + logic [3:0] bus_intr_brf_notif_internal_intr_r; + logic [31:0] full_addr_intr_brf_notif_internal_intr_r = `CLP_SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R; + + logic hit_intr_brf_error_intr_trig_r; + logic [3:0] bus_intr_brf_error_intr_trig_r; + logic [31:0] full_addr_intr_brf_error_intr_trig_r = `CLP_SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTR_TRIG_R; + + logic hit_intr_brf_notif_intr_trig_r; + logic [3:0] bus_intr_brf_notif_intr_trig_r; + logic [31:0] full_addr_intr_brf_notif_intr_trig_r = `CLP_SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTR_TRIG_R; + + logic hit_intr_brf_error_internal_intr_count_r; + logic [3:0] bus_intr_brf_error_internal_intr_count_r; + logic [31:0] full_addr_intr_brf_error_internal_intr_count_r = `CLP_SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_COUNT_R; + + logic hit_intr_brf_error_inv_dev_intr_count_r; + logic [3:0] bus_intr_brf_error_inv_dev_intr_count_r; + logic [31:0] full_addr_intr_brf_error_inv_dev_intr_count_r = `CLP_SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INV_DEV_INTR_COUNT_R; + + logic hit_intr_brf_error_cmd_fail_intr_count_r; + logic [3:0] bus_intr_brf_error_cmd_fail_intr_count_r; + logic [31:0] full_addr_intr_brf_error_cmd_fail_intr_count_r = `CLP_SOC_IFC_REG_INTR_BLOCK_RF_ERROR_CMD_FAIL_INTR_COUNT_R; + + logic hit_intr_brf_error_bad_fuse_intr_count_r; + logic [3:0] bus_intr_brf_error_bad_fuse_intr_count_r; + logic [31:0] full_addr_intr_brf_error_bad_fuse_intr_count_r = `CLP_SOC_IFC_REG_INTR_BLOCK_RF_ERROR_BAD_FUSE_INTR_COUNT_R; + + logic hit_intr_brf_error_iccm_blocked_intr_count_r; + logic [3:0] bus_intr_brf_error_iccm_blocked_intr_count_r; + logic [31:0] full_addr_intr_brf_error_iccm_blocked_intr_count_r = `CLP_SOC_IFC_REG_INTR_BLOCK_RF_ERROR_ICCM_BLOCKED_INTR_COUNT_R; + + logic hit_intr_brf_error_mbox_ecc_unc_intr_count_r; + logic [3:0] bus_intr_brf_error_mbox_ecc_unc_intr_count_r; + logic [31:0] full_addr_intr_brf_error_mbox_ecc_unc_intr_count_r = `CLP_SOC_IFC_REG_INTR_BLOCK_RF_ERROR_MBOX_ECC_UNC_INTR_COUNT_R; + + logic hit_intr_brf_error_wdt_timer1_timeout_intr_count_r; + logic [3:0] bus_intr_brf_error_wdt_timer1_timeout_intr_count_r; + logic [31:0] full_addr_intr_brf_error_wdt_timer1_timeout_intr_count_r = `CLP_SOC_IFC_REG_INTR_BLOCK_RF_ERROR_WDT_TIMER1_TIMEOUT_INTR_COUNT_R; + + logic hit_intr_brf_error_wdt_timer2_timeout_intr_count_r; + logic [3:0] bus_intr_brf_error_wdt_timer2_timeout_intr_count_r; + logic [31:0] full_addr_intr_brf_error_wdt_timer2_timeout_intr_count_r = `CLP_SOC_IFC_REG_INTR_BLOCK_RF_ERROR_WDT_TIMER2_TIMEOUT_INTR_COUNT_R; + + logic hit_intr_brf_notif_cmd_avail_intr_count_r; + logic [3:0] bus_intr_brf_notif_cmd_avail_intr_count_r; + logic [31:0] full_addr_intr_brf_notif_cmd_avail_intr_count_r = `CLP_SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_CMD_AVAIL_INTR_COUNT_R; + + logic hit_intr_brf_notif_mbox_ecc_cor_intr_count_r; + logic [3:0] bus_intr_brf_notif_mbox_ecc_cor_intr_count_r; + logic [31:0] full_addr_intr_brf_notif_mbox_ecc_cor_intr_count_r = `CLP_SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_MBOX_ECC_COR_INTR_COUNT_R; + + logic hit_intr_brf_notif_debug_locked_intr_count_r; + logic [3:0] bus_intr_brf_notif_debug_locked_intr_count_r; + logic [31:0] full_addr_intr_brf_notif_debug_locked_intr_count_r = `CLP_SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_DEBUG_LOCKED_INTR_COUNT_R; + + logic hit_intr_brf_notif_scan_mode_intr_count_r; + logic [3:0] bus_intr_brf_notif_scan_mode_intr_count_r; + logic [31:0] full_addr_intr_brf_notif_scan_mode_intr_count_r = `CLP_SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_SCAN_MODE_INTR_COUNT_R; + + logic hit_intr_brf_notif_soc_req_lock_intr_count_r; + logic [3:0] bus_intr_brf_notif_soc_req_lock_intr_count_r; + logic [31:0] full_addr_intr_brf_notif_soc_req_lock_intr_count_r = `CLP_SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_SOC_REQ_LOCK_INTR_COUNT_R; + + logic hit_intr_brf_notif_gen_in_toggle_intr_count_r; + logic [3:0] bus_intr_brf_notif_gen_in_toggle_intr_count_r; + logic [31:0] full_addr_intr_brf_notif_gen_in_toggle_intr_count_r = `CLP_SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_GEN_IN_TOGGLE_INTR_COUNT_R; + + logic hit_intr_brf_error_internal_intr_count_incr_r; + logic [3:0] bus_intr_brf_error_internal_intr_count_incr_r; + logic [31:0] full_addr_intr_brf_error_internal_intr_count_incr_r = `CLP_SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_COUNT_INCR_R; + + logic hit_intr_brf_error_inv_dev_intr_count_incr_r; + logic [3:0] bus_intr_brf_error_inv_dev_intr_count_incr_r; + logic [31:0] full_addr_intr_brf_error_inv_dev_intr_count_incr_r = `CLP_SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INV_DEV_INTR_COUNT_INCR_R; + + logic hit_intr_brf_error_cmd_fail_intr_count_incr_r; + logic [3:0] bus_intr_brf_error_cmd_fail_intr_count_incr_r; + logic [31:0] full_addr_intr_brf_error_cmd_fail_intr_count_incr_r = `CLP_SOC_IFC_REG_INTR_BLOCK_RF_ERROR_CMD_FAIL_INTR_COUNT_INCR_R; + + logic hit_intr_brf_error_bad_fuse_intr_count_incr_r; + logic [3:0] bus_intr_brf_error_bad_fuse_intr_count_incr_r; + logic [31:0] full_addr_intr_brf_error_bad_fuse_intr_count_incr_r = `CLP_SOC_IFC_REG_INTR_BLOCK_RF_ERROR_BAD_FUSE_INTR_COUNT_INCR_R; + + logic hit_intr_brf_error_iccm_blocked_intr_count_incr_r; + logic [3:0] bus_intr_brf_error_iccm_blocked_intr_count_incr_r; + logic [31:0] full_addr_intr_brf_error_iccm_blocked_intr_count_incr_r = `CLP_SOC_IFC_REG_INTR_BLOCK_RF_ERROR_ICCM_BLOCKED_INTR_COUNT_INCR_R; + + logic hit_intr_brf_error_mbox_ecc_unc_intr_count_incr_r; + logic [3:0] bus_intr_brf_error_mbox_ecc_unc_intr_count_incr_r; + logic [31:0] full_addr_intr_brf_error_mbox_ecc_unc_intr_count_incr_r = `CLP_SOC_IFC_REG_INTR_BLOCK_RF_ERROR_MBOX_ECC_UNC_INTR_COUNT_INCR_R; + + logic hit_intr_brf_error_wdt_timer1_timeout_intr_count_incr_r; + logic [3:0] bus_intr_brf_error_wdt_timer1_timeout_intr_count_incr_r; + logic [31:0] full_addr_intr_brf_error_wdt_timer1_timeout_intr_count_incr_r = `CLP_SOC_IFC_REG_INTR_BLOCK_RF_ERROR_WDT_TIMER1_TIMEOUT_INTR_COUNT_INCR_R; + + logic hit_intr_brf_error_wdt_timer2_timeout_intr_count_incr_r; + logic [3:0] bus_intr_brf_error_wdt_timer2_timeout_intr_count_incr_r; + logic [31:0] full_addr_intr_brf_error_wdt_timer2_timeout_intr_count_incr_r = `CLP_SOC_IFC_REG_INTR_BLOCK_RF_ERROR_WDT_TIMER2_TIMEOUT_INTR_COUNT_INCR_R; + + logic hit_intr_brf_notif_cmd_avail_intr_count_incr_r; + logic [3:0] bus_intr_brf_notif_cmd_avail_intr_count_incr_r; + logic [31:0] full_addr_intr_brf_notif_cmd_avail_intr_count_incr_r = `CLP_SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_CMD_AVAIL_INTR_COUNT_INCR_R; + + logic hit_intr_brf_notif_mbox_ecc_cor_intr_count_incr_r; + logic [3:0] bus_intr_brf_notif_mbox_ecc_cor_intr_count_incr_r; + logic [31:0] full_addr_intr_brf_notif_mbox_ecc_cor_intr_count_incr_r = `CLP_SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_MBOX_ECC_COR_INTR_COUNT_INCR_R; + + logic hit_intr_brf_notif_debug_locked_intr_count_incr_r; + logic [3:0] bus_intr_brf_notif_debug_locked_intr_count_incr_r; + logic [31:0] full_addr_intr_brf_notif_debug_locked_intr_count_incr_r = `CLP_SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_DEBUG_LOCKED_INTR_COUNT_INCR_R; + + logic hit_intr_brf_notif_soc_req_lock_intr_count_incr_r; + logic [3:0] bus_intr_brf_notif_soc_req_lock_intr_count_incr_r; + logic [31:0] full_addr_intr_brf_notif_soc_req_lock_intr_count_incr_r = `CLP_SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_SOC_REQ_LOCK_INTR_COUNT_INCR_R; + + + assign hit_CPTRA_HW_ERROR_FATAL = (soc_ifc_reg_req_data.addr == full_addr_CPTRA_HW_ERROR_FATAL[APB_ADDR_WIDTH-1:0]); + assign bus_CPTRA_HW_ERROR_FATAL = {uc_rd, uc_wr, soc_rd, soc_wr} & {4{hit_CPTRA_HW_ERROR_FATAL}}; + + assign hit_CPTRA_HW_ERROR_NON_FATAL = (soc_ifc_reg_req_data.addr == full_addr_CPTRA_HW_ERROR_NON_FATAL[APB_ADDR_WIDTH-1:0]); + assign bus_CPTRA_HW_ERROR_NON_FATAL = {uc_rd, uc_wr, soc_rd, soc_wr} & {4{hit_CPTRA_HW_ERROR_NON_FATAL}}; + + assign hit_CPTRA_FW_ERROR_FATAL = (soc_ifc_reg_req_data.addr == full_addr_CPTRA_FW_ERROR_FATAL[APB_ADDR_WIDTH-1:0]); + assign bus_CPTRA_FW_ERROR_FATAL = {uc_rd, uc_wr, soc_rd, soc_wr} & {4{hit_CPTRA_FW_ERROR_FATAL}}; + + assign hit_CPTRA_FW_ERROR_NON_FATAL = (soc_ifc_reg_req_data.addr == full_addr_CPTRA_FW_ERROR_NON_FATAL[APB_ADDR_WIDTH-1:0]); + assign bus_CPTRA_FW_ERROR_NON_FATAL = {uc_rd, uc_wr, soc_rd, soc_wr} & {4{hit_CPTRA_FW_ERROR_NON_FATAL}}; + + assign hit_CPTRA_HW_ERROR_ENC = (soc_ifc_reg_req_data.addr == full_addr_CPTRA_HW_ERROR_ENC[APB_ADDR_WIDTH-1:0]); + assign bus_CPTRA_HW_ERROR_ENC = {uc_rd, uc_wr, soc_rd, soc_wr} & {4{hit_CPTRA_HW_ERROR_ENC}}; + + assign hit_CPTRA_FW_ERROR_ENC = (soc_ifc_reg_req_data.addr == full_addr_CPTRA_FW_ERROR_ENC[APB_ADDR_WIDTH-1:0]); + assign bus_CPTRA_FW_ERROR_ENC = {uc_rd, uc_wr, soc_rd, soc_wr} & {4{hit_CPTRA_FW_ERROR_ENC}}; + + assign hit_CPTRA_FW_EXTENDED_ERROR_INFO[0] = (soc_ifc_reg_req_data.addr == full_addr_CPTRA_FW_EXTENDED_ERROR_INFO[0][18-1:0]); + assign bus_CPTRA_FW_EXTENDED_ERROR_INFO[0] = {uc_rd, uc_wr, soc_rd, soc_wr} & {4{hit_CPTRA_FW_EXTENDED_ERROR_INFO[0]}}; + + assign hit_CPTRA_FW_EXTENDED_ERROR_INFO[1] = (soc_ifc_reg_req_data.addr == full_addr_CPTRA_FW_EXTENDED_ERROR_INFO[1][18-1:0]); + assign bus_CPTRA_FW_EXTENDED_ERROR_INFO[1] = {uc_rd, uc_wr, soc_rd, soc_wr} & {4{hit_CPTRA_FW_EXTENDED_ERROR_INFO[1]}}; + + assign hit_CPTRA_FW_EXTENDED_ERROR_INFO[2] = (soc_ifc_reg_req_data.addr == full_addr_CPTRA_FW_EXTENDED_ERROR_INFO[2][18-1:0]); + assign bus_CPTRA_FW_EXTENDED_ERROR_INFO[2] = {uc_rd, uc_wr, soc_rd, soc_wr} & {4{hit_CPTRA_FW_EXTENDED_ERROR_INFO[2]}}; + + assign hit_CPTRA_FW_EXTENDED_ERROR_INFO[3] = (soc_ifc_reg_req_data.addr == full_addr_CPTRA_FW_EXTENDED_ERROR_INFO[3][18-1:0]); + assign bus_CPTRA_FW_EXTENDED_ERROR_INFO[3] = {uc_rd, uc_wr, soc_rd, soc_wr} & {4{hit_CPTRA_FW_EXTENDED_ERROR_INFO[3]}}; + + assign hit_CPTRA_FW_EXTENDED_ERROR_INFO[4] = (soc_ifc_reg_req_data.addr == full_addr_CPTRA_FW_EXTENDED_ERROR_INFO[4][18-1:0]); + assign bus_CPTRA_FW_EXTENDED_ERROR_INFO[4] = {uc_rd, uc_wr, soc_rd, soc_wr} & {4{hit_CPTRA_FW_EXTENDED_ERROR_INFO[4]}}; + + assign hit_CPTRA_FW_EXTENDED_ERROR_INFO[5] = (soc_ifc_reg_req_data.addr == full_addr_CPTRA_FW_EXTENDED_ERROR_INFO[5][18-1:0]); + assign bus_CPTRA_FW_EXTENDED_ERROR_INFO[5] = {uc_rd, uc_wr, soc_rd, soc_wr} & {4{hit_CPTRA_FW_EXTENDED_ERROR_INFO[5]}}; + + assign hit_CPTRA_FW_EXTENDED_ERROR_INFO[6] = (soc_ifc_reg_req_data.addr == full_addr_CPTRA_FW_EXTENDED_ERROR_INFO[6][18-1:0]); + assign bus_CPTRA_FW_EXTENDED_ERROR_INFO[6] = {uc_rd, uc_wr, soc_rd, soc_wr} & {4{hit_CPTRA_FW_EXTENDED_ERROR_INFO[6]}}; + + assign hit_CPTRA_FW_EXTENDED_ERROR_INFO[7] = (soc_ifc_reg_req_data.addr == full_addr_CPTRA_FW_EXTENDED_ERROR_INFO[7][18-1:0]); + assign bus_CPTRA_FW_EXTENDED_ERROR_INFO[7] = {uc_rd, uc_wr, soc_rd, soc_wr} & {4{hit_CPTRA_FW_EXTENDED_ERROR_INFO[7]}}; + + assign hit_CPTRA_BOOT_STATUS = (soc_ifc_reg_req_data.addr == full_addr_CPTRA_BOOT_STATUS[APB_ADDR_WIDTH-1:0]); + assign bus_CPTRA_BOOT_STATUS = {uc_rd, uc_wr, soc_rd, soc_wr} & {4{hit_CPTRA_BOOT_STATUS}}; + + assign hit_CPTRA_FLOW_STATUS = (soc_ifc_reg_req_data.addr == full_addr_CPTRA_FLOW_STATUS[APB_ADDR_WIDTH-1:0]); + assign bus_CPTRA_FLOW_STATUS = {uc_rd, uc_wr, soc_rd, soc_wr} & {4{hit_CPTRA_FLOW_STATUS}}; + + assign hit_CPTRA_RESET_REASON = (soc_ifc_reg_req_data.addr == full_addr_CPTRA_RESET_REASON[APB_ADDR_WIDTH-1:0]); + assign bus_CPTRA_RESET_REASON = {uc_rd, uc_wr, soc_rd, soc_wr} & {4{hit_CPTRA_RESET_REASON}}; + + // assign hit_CPTRA_SECURITY_STATE = (soc_ifc_reg_req_data.addr == full_addr_CPTRA_SECURITY_STATE[APB_ADDR_WIDTH-1:0]); + // assign bus_CPTRA_SECURITY_STATE = {uc_rd, uc_wr, soc_rd, soc_wr} & {4{hit_CPTRA_SECURITY_STATE}}; + + assign hit_CPTRA_MBOX_VALID_PAUSER[0] = (soc_ifc_reg_req_data.addr == full_addr_CPTRA_MBOX_VALID_PAUSER[0][18-1:0]); + assign bus_CPTRA_MBOX_VALID_PAUSER[0] = {uc_rd, uc_wr, soc_rd, soc_wr} & {4{hit_CPTRA_MBOX_VALID_PAUSER[0]}}; + + assign hit_CPTRA_MBOX_VALID_PAUSER[1] = (soc_ifc_reg_req_data.addr == full_addr_CPTRA_MBOX_VALID_PAUSER[1][18-1:0]); + assign bus_CPTRA_MBOX_VALID_PAUSER[1] = {uc_rd, uc_wr, soc_rd, soc_wr} & {4{hit_CPTRA_MBOX_VALID_PAUSER[1]}}; + + assign hit_CPTRA_MBOX_VALID_PAUSER[2] = (soc_ifc_reg_req_data.addr == full_addr_CPTRA_MBOX_VALID_PAUSER[2][18-1:0]); + assign bus_CPTRA_MBOX_VALID_PAUSER[2] = {uc_rd, uc_wr, soc_rd, soc_wr} & {4{hit_CPTRA_MBOX_VALID_PAUSER[2]}}; + + assign hit_CPTRA_MBOX_VALID_PAUSER[3] = (soc_ifc_reg_req_data.addr == full_addr_CPTRA_MBOX_VALID_PAUSER[3][18-1:0]); + assign bus_CPTRA_MBOX_VALID_PAUSER[3] = {uc_rd, uc_wr, soc_rd, soc_wr} & {4{hit_CPTRA_MBOX_VALID_PAUSER[3]}}; + + assign hit_CPTRA_MBOX_VALID_PAUSER[4] = (soc_ifc_reg_req_data.addr == full_addr_CPTRA_MBOX_VALID_PAUSER[4][18-1:0]); + assign bus_CPTRA_MBOX_VALID_PAUSER[4] = {uc_rd, uc_wr, soc_rd, soc_wr} & {4{hit_CPTRA_MBOX_VALID_PAUSER[4]}}; + + assign hit_CPTRA_MBOX_PAUSER_LOCK[0] = (soc_ifc_reg_req_data.addr == full_addr_CPTRA_MBOX_PAUSER_LOCK[0][18-1:0]); + assign bus_CPTRA_MBOX_PAUSER_LOCK[0] = {uc_rd, uc_wr, soc_rd, soc_wr} & {4{hit_CPTRA_MBOX_PAUSER_LOCK[0]}}; + + assign hit_CPTRA_MBOX_PAUSER_LOCK[1] = (soc_ifc_reg_req_data.addr == full_addr_CPTRA_MBOX_PAUSER_LOCK[1][18-1:0]); + assign bus_CPTRA_MBOX_PAUSER_LOCK[1] = {uc_rd, uc_wr, soc_rd, soc_wr} & {4{hit_CPTRA_MBOX_PAUSER_LOCK[1]}}; + + assign hit_CPTRA_MBOX_PAUSER_LOCK[2] = (soc_ifc_reg_req_data.addr == full_addr_CPTRA_MBOX_PAUSER_LOCK[2][18-1:0]); + assign bus_CPTRA_MBOX_PAUSER_LOCK[2] = {uc_rd, uc_wr, soc_rd, soc_wr} & {4{hit_CPTRA_MBOX_PAUSER_LOCK[2]}}; + + assign hit_CPTRA_MBOX_PAUSER_LOCK[3] = (soc_ifc_reg_req_data.addr == full_addr_CPTRA_MBOX_PAUSER_LOCK[3][18-1:0]); + assign bus_CPTRA_MBOX_PAUSER_LOCK[3] = {uc_rd, uc_wr, soc_rd, soc_wr} & {4{hit_CPTRA_MBOX_PAUSER_LOCK[3]}}; + + assign hit_CPTRA_MBOX_PAUSER_LOCK[4] = (soc_ifc_reg_req_data.addr == full_addr_CPTRA_MBOX_PAUSER_LOCK[4][18-1:0]); + assign bus_CPTRA_MBOX_PAUSER_LOCK[4] = {uc_rd, uc_wr, soc_rd, soc_wr} & {4{hit_CPTRA_MBOX_PAUSER_LOCK[4]}}; + + assign hit_CPTRA_TRNG_VALID_PAUSER = (soc_ifc_reg_req_data.addr == full_addr_CPTRA_TRNG_VALID_PAUSER[APB_ADDR_WIDTH-1:0]); + assign bus_CPTRA_TRNG_VALID_PAUSER = {uc_rd, uc_wr, soc_rd, soc_wr} & {4{hit_CPTRA_TRNG_VALID_PAUSER}}; + + assign hit_CPTRA_TRNG_PAUSER_LOCK = (soc_ifc_reg_req_data.addr == full_addr_CPTRA_TRNG_PAUSER_LOCK[APB_ADDR_WIDTH-1:0]); + assign bus_CPTRA_TRNG_PAUSER_LOCK = {uc_rd, uc_wr, soc_rd, soc_wr} & {4{hit_CPTRA_TRNG_PAUSER_LOCK}}; + + assign hit_CPTRA_TRNG_DATA[0] = (soc_ifc_reg_req_data.addr == full_addr_CPTRA_TRNG_DATA[0][18-1:0]); + assign bus_CPTRA_TRNG_DATA[0] = {uc_rd, uc_wr, soc_rd, soc_wr} & {4{hit_CPTRA_TRNG_DATA[0]}}; + + assign hit_CPTRA_TRNG_DATA[1] = (soc_ifc_reg_req_data.addr == full_addr_CPTRA_TRNG_DATA[1][18-1:0]); + assign bus_CPTRA_TRNG_DATA[1] = {uc_rd, uc_wr, soc_rd, soc_wr} & {4{hit_CPTRA_TRNG_DATA[1]}}; + + assign hit_CPTRA_TRNG_DATA[2] = (soc_ifc_reg_req_data.addr == full_addr_CPTRA_TRNG_DATA[2][18-1:0]); + assign bus_CPTRA_TRNG_DATA[2] = {uc_rd, uc_wr, soc_rd, soc_wr} & {4{hit_CPTRA_TRNG_DATA[2]}}; + + assign hit_CPTRA_TRNG_DATA[3] = (soc_ifc_reg_req_data.addr == full_addr_CPTRA_TRNG_DATA[3][18-1:0]); + assign bus_CPTRA_TRNG_DATA[3] = {uc_rd, uc_wr, soc_rd, soc_wr} & {4{hit_CPTRA_TRNG_DATA[3]}}; + + assign hit_CPTRA_TRNG_DATA[4] = (soc_ifc_reg_req_data.addr == full_addr_CPTRA_TRNG_DATA[4][18-1:0]); + assign bus_CPTRA_TRNG_DATA[4] = {uc_rd, uc_wr, soc_rd, soc_wr} & {4{hit_CPTRA_TRNG_DATA[4]}}; + + assign hit_CPTRA_TRNG_DATA[5] = (soc_ifc_reg_req_data.addr == full_addr_CPTRA_TRNG_DATA[5][18-1:0]); + assign bus_CPTRA_TRNG_DATA[5] = {uc_rd, uc_wr, soc_rd, soc_wr} & {4{hit_CPTRA_TRNG_DATA[5]}}; + + assign hit_CPTRA_TRNG_DATA[6] = (soc_ifc_reg_req_data.addr == full_addr_CPTRA_TRNG_DATA[6][18-1:0]); + assign bus_CPTRA_TRNG_DATA[6] = {uc_rd, uc_wr, soc_rd, soc_wr} & {4{hit_CPTRA_TRNG_DATA[6]}}; + + assign hit_CPTRA_TRNG_DATA[7] = (soc_ifc_reg_req_data.addr == full_addr_CPTRA_TRNG_DATA[7][18-1:0]); + assign bus_CPTRA_TRNG_DATA[7] = {uc_rd, uc_wr, soc_rd, soc_wr} & {4{hit_CPTRA_TRNG_DATA[7]}}; + + assign hit_CPTRA_TRNG_DATA[8] = (soc_ifc_reg_req_data.addr == full_addr_CPTRA_TRNG_DATA[8][18-1:0]); + assign bus_CPTRA_TRNG_DATA[8] = {uc_rd, uc_wr, soc_rd, soc_wr} & {4{hit_CPTRA_TRNG_DATA[8]}}; + + assign hit_CPTRA_TRNG_DATA[9] = (soc_ifc_reg_req_data.addr == full_addr_CPTRA_TRNG_DATA[9][18-1:0]); + assign bus_CPTRA_TRNG_DATA[9] = {uc_rd, uc_wr, soc_rd, soc_wr} & {4{hit_CPTRA_TRNG_DATA[9]}}; + + assign hit_CPTRA_TRNG_DATA[10] = (soc_ifc_reg_req_data.addr == full_addr_CPTRA_TRNG_DATA[10][18-1:0]); + assign bus_CPTRA_TRNG_DATA[10] = {uc_rd, uc_wr, soc_rd, soc_wr} & {4{hit_CPTRA_TRNG_DATA[10]}}; + + assign hit_CPTRA_TRNG_DATA[11] = (soc_ifc_reg_req_data.addr == full_addr_CPTRA_TRNG_DATA[11][18-1:0]); + assign bus_CPTRA_TRNG_DATA[11] = {uc_rd, uc_wr, soc_rd, soc_wr} & {4{hit_CPTRA_TRNG_DATA[11]}}; + + assign hit_CPTRA_TRNG_CTRL = (soc_ifc_reg_req_data.addr == full_addr_CPTRA_TRNG_CTRL[APB_ADDR_WIDTH-1:0]); + assign bus_CPTRA_TRNG_CTRL = {uc_rd, uc_wr, soc_rd, soc_wr} & {4{hit_CPTRA_TRNG_CTRL}}; + + assign hit_CPTRA_TRNG_STATUS = (soc_ifc_reg_req_data.addr == full_addr_CPTRA_TRNG_STATUS[APB_ADDR_WIDTH-1:0]); + assign bus_CPTRA_TRNG_STATUS = {uc_rd, uc_wr, soc_rd, soc_wr} & {4{hit_CPTRA_TRNG_STATUS}}; + + assign hit_CPTRA_FUSE_WR_DONE = (soc_ifc_reg_req_data.addr == full_addr_CPTRA_FUSE_WR_DONE[APB_ADDR_WIDTH-1:0]); + assign bus_CPTRA_FUSE_WR_DONE = {uc_rd, uc_wr, soc_rd, soc_wr} & {4{hit_CPTRA_FUSE_WR_DONE}}; + + assign hit_CPTRA_TIMER_CONFIG = (soc_ifc_reg_req_data.addr == full_addr_CPTRA_TIMER_CONFIG[APB_ADDR_WIDTH-1:0]); + assign bus_CPTRA_TIMER_CONFIG = {uc_rd, uc_wr, soc_rd, soc_wr} & {4{hit_CPTRA_TIMER_CONFIG}}; + + assign hit_CPTRA_BOOTFSM_GO = (soc_ifc_reg_req_data.addr == full_addr_CPTRA_BOOTFSM_GO[APB_ADDR_WIDTH-1:0]); + assign bus_CPTRA_BOOTFSM_GO = {uc_rd, uc_wr, soc_rd, soc_wr} & {4{hit_CPTRA_BOOTFSM_GO}}; + + assign hit_CPTRA_DBG_MANUF_SERVICE_REG = (soc_ifc_reg_req_data.addr == full_addr_CPTRA_DBG_MANUF_SERVICE_REG[APB_ADDR_WIDTH-1:0]); + assign bus_CPTRA_DBG_MANUF_SERVICE_REG = {uc_rd, uc_wr, soc_rd, soc_wr} & {4{hit_CPTRA_DBG_MANUF_SERVICE_REG}}; + + assign hit_CPTRA_CLK_GATING_EN = (soc_ifc_reg_req_data.addr == full_addr_CPTRA_CLK_GATING_EN[APB_ADDR_WIDTH-1:0]); + assign bus_CPTRA_CLK_GATING_EN = {uc_rd, uc_wr, soc_rd, soc_wr} & {4{hit_CPTRA_CLK_GATING_EN}}; + + assign hit_CPTRA_GENERIC_INPUT_WIRES[0] = (soc_ifc_reg_req_data.addr == full_addr_CPTRA_GENERIC_INPUT_WIRES[0][18-1:0]); + assign bus_CPTRA_GENERIC_INPUT_WIRES[0] = {uc_rd, uc_wr, soc_rd, soc_wr} & {4{hit_CPTRA_GENERIC_INPUT_WIRES[0]}}; + + assign hit_CPTRA_GENERIC_INPUT_WIRES[1] = (soc_ifc_reg_req_data.addr == full_addr_CPTRA_GENERIC_INPUT_WIRES[1][18-1:0]); + assign bus_CPTRA_GENERIC_INPUT_WIRES[1] = {uc_rd, uc_wr, soc_rd, soc_wr} & {4{hit_CPTRA_GENERIC_INPUT_WIRES[1]}}; + + assign hit_CPTRA_GENERIC_OUTPUT_WIRES[0] = (soc_ifc_reg_req_data.addr == full_addr_CPTRA_GENERIC_OUTPUT_WIRES[0][18-1:0]); + assign bus_CPTRA_GENERIC_OUTPUT_WIRES[0] = {uc_rd, uc_wr, soc_rd, soc_wr} & {4{hit_CPTRA_GENERIC_OUTPUT_WIRES[0]}}; + + assign hit_CPTRA_GENERIC_OUTPUT_WIRES[1] = (soc_ifc_reg_req_data.addr == full_addr_CPTRA_GENERIC_OUTPUT_WIRES[1][18-1:0]); + assign bus_CPTRA_GENERIC_OUTPUT_WIRES[1] = {uc_rd, uc_wr, soc_rd, soc_wr} & {4{hit_CPTRA_GENERIC_OUTPUT_WIRES[1]}}; + + // assign hit_CPTRA_HW_REV_ID = (soc_ifc_reg_req_data.addr == full_addr_CPTRA_HW_REV_ID[APB_ADDR_WIDTH-1:0]); + // assign bus_CPTRA_HW_REV_ID = {uc_rd, uc_wr, soc_rd, soc_wr} & {4{hit_CPTRA_HW_REV_ID}}; + + assign hit_CPTRA_FW_REV_ID[0] = (soc_ifc_reg_req_data.addr == full_addr_CPTRA_FW_REV_ID[0][18-1:0]); + assign bus_CPTRA_FW_REV_ID[0] = {uc_rd, uc_wr, soc_rd, soc_wr} & {4{hit_CPTRA_FW_REV_ID[0]}}; + + assign hit_CPTRA_FW_REV_ID[1] = (soc_ifc_reg_req_data.addr == full_addr_CPTRA_FW_REV_ID[1][18-1:0]); + assign bus_CPTRA_FW_REV_ID[1] = {uc_rd, uc_wr, soc_rd, soc_wr} & {4{hit_CPTRA_FW_REV_ID[1]}}; + + // assign hit_CPTRA_HW_CONFIG = (soc_ifc_reg_req_data.addr == full_addr_CPTRA_HW_CONFIG[APB_ADDR_WIDTH-1:0]); + // assign bus_CPTRA_HW_CONFIG = {uc_rd, uc_wr, soc_rd, soc_wr} & {4{hit_CPTRA_HW_CONFIG}}; + + assign hit_CPTRA_WDT_TIMER1_EN = (soc_ifc_reg_req_data.addr == full_addr_CPTRA_WDT_TIMER1_EN[APB_ADDR_WIDTH-1:0]); + assign bus_CPTRA_WDT_TIMER1_EN = {uc_rd, uc_wr, soc_rd, soc_wr} & {4{hit_CPTRA_WDT_TIMER1_EN}}; + + assign hit_CPTRA_WDT_TIMER1_CTRL = (soc_ifc_reg_req_data.addr == full_addr_CPTRA_WDT_TIMER1_CTRL[APB_ADDR_WIDTH-1:0]); + assign bus_CPTRA_WDT_TIMER1_CTRL = {uc_rd, uc_wr, soc_rd, soc_wr} & {4{hit_CPTRA_WDT_TIMER1_CTRL}}; + + assign hit_CPTRA_WDT_TIMER1_TIMEOUT_PERIOD[0] = (soc_ifc_reg_req_data.addr == full_addr_CPTRA_WDT_TIMER1_TIMEOUT_PERIOD[0][18-1:0]); + assign bus_CPTRA_WDT_TIMER1_TIMEOUT_PERIOD[0] = {uc_rd, uc_wr, soc_rd, soc_wr} & {4{hit_CPTRA_WDT_TIMER1_TIMEOUT_PERIOD[0]}}; + + assign hit_CPTRA_WDT_TIMER1_TIMEOUT_PERIOD[1] = (soc_ifc_reg_req_data.addr == full_addr_CPTRA_WDT_TIMER1_TIMEOUT_PERIOD[1][18-1:0]); + assign bus_CPTRA_WDT_TIMER1_TIMEOUT_PERIOD[1] = {uc_rd, uc_wr, soc_rd, soc_wr} & {4{hit_CPTRA_WDT_TIMER1_TIMEOUT_PERIOD[1]}}; + + assign hit_CPTRA_WDT_TIMER2_EN = (soc_ifc_reg_req_data.addr == full_addr_CPTRA_WDT_TIMER2_EN[APB_ADDR_WIDTH-1:0]); + assign bus_CPTRA_WDT_TIMER2_EN = {uc_rd, uc_wr, soc_rd, soc_wr} & {4{hit_CPTRA_WDT_TIMER2_EN}}; + + assign hit_CPTRA_WDT_TIMER2_CTRL = (soc_ifc_reg_req_data.addr == full_addr_CPTRA_WDT_TIMER2_CTRL[APB_ADDR_WIDTH-1:0]); + assign bus_CPTRA_WDT_TIMER2_CTRL = {uc_rd, uc_wr, soc_rd, soc_wr} & {4{hit_CPTRA_WDT_TIMER2_CTRL}}; + + assign hit_CPTRA_WDT_TIMER2_TIMEOUT_PERIOD[0] = (soc_ifc_reg_req_data.addr == full_addr_CPTRA_WDT_TIMER2_TIMEOUT_PERIOD[0][18-1:0]); + assign bus_CPTRA_WDT_TIMER2_TIMEOUT_PERIOD[0] = {uc_rd, uc_wr, soc_rd, soc_wr} & {4{hit_CPTRA_WDT_TIMER2_TIMEOUT_PERIOD[0]}}; + + assign hit_CPTRA_WDT_TIMER2_TIMEOUT_PERIOD[1] = (soc_ifc_reg_req_data.addr == full_addr_CPTRA_WDT_TIMER2_TIMEOUT_PERIOD[1][18-1:0]); + assign bus_CPTRA_WDT_TIMER2_TIMEOUT_PERIOD[1] = {uc_rd, uc_wr, soc_rd, soc_wr} & {4{hit_CPTRA_WDT_TIMER2_TIMEOUT_PERIOD[1]}}; + + assign hit_CPTRA_WDT_STATUS = (soc_ifc_reg_req_data.addr == full_addr_CPTRA_WDT_STATUS[APB_ADDR_WIDTH-1:0]); + assign bus_CPTRA_WDT_STATUS = {uc_rd, uc_wr, soc_rd, soc_wr} & {4{hit_CPTRA_WDT_STATUS}}; + + assign hit_CPTRA_FUSE_VALID_PAUSER = (soc_ifc_reg_req_data.addr == full_addr_CPTRA_FUSE_VALID_PAUSER[APB_ADDR_WIDTH-1:0]); + assign bus_CPTRA_FUSE_VALID_PAUSER = {uc_rd, uc_wr, soc_rd, soc_wr} & {4{hit_CPTRA_FUSE_VALID_PAUSER}}; + + assign hit_CPTRA_FUSE_PAUSER_LOCK = (soc_ifc_reg_req_data.addr == full_addr_CPTRA_FUSE_PAUSER_LOCK[APB_ADDR_WIDTH-1:0]); + assign bus_CPTRA_FUSE_PAUSER_LOCK = {uc_rd, uc_wr, soc_rd, soc_wr} & {4{hit_CPTRA_FUSE_PAUSER_LOCK}}; + + assign hit_CPTRA_WDT_CFG[0] = (soc_ifc_reg_req_data.addr == full_addr_CPTRA_WDT_CFG[0][18-1:0]); + assign bus_CPTRA_WDT_CFG[0] = {uc_rd, uc_wr, soc_rd, soc_wr} & {4{hit_CPTRA_WDT_CFG[0]}}; + + assign hit_CPTRA_WDT_CFG[1] = (soc_ifc_reg_req_data.addr == full_addr_CPTRA_WDT_CFG[1][18-1:0]); + assign bus_CPTRA_WDT_CFG[1] = {uc_rd, uc_wr, soc_rd, soc_wr} & {4{hit_CPTRA_WDT_CFG[1]}}; + + assign hit_CPTRA_iTRNG_ENTROPY_CONFIG_0 = (soc_ifc_reg_req_data.addr == full_addr_CPTRA_iTRNG_ENTROPY_CONFIG_0[APB_ADDR_WIDTH-1:0]); + assign bus_CPTRA_iTRNG_ENTROPY_CONFIG_0 = {uc_rd, uc_wr, soc_rd, soc_wr} & {4{hit_CPTRA_iTRNG_ENTROPY_CONFIG_0}}; + + assign hit_CPTRA_iTRNG_ENTROPY_CONFIG_1 = (soc_ifc_reg_req_data.addr == full_addr_CPTRA_iTRNG_ENTROPY_CONFIG_1[APB_ADDR_WIDTH-1:0]); + assign bus_CPTRA_iTRNG_ENTROPY_CONFIG_1 = {uc_rd, uc_wr, soc_rd, soc_wr} & {4{hit_CPTRA_iTRNG_ENTROPY_CONFIG_1}}; + + assign hit_CPTRA_RSVD_REG[0] = (soc_ifc_reg_req_data.addr == full_addr_CPTRA_RSVD_REG[0][18-1:0]); + assign bus_CPTRA_RSVD_REG[0] = {uc_rd, uc_wr, soc_rd, soc_wr} & {4{hit_CPTRA_RSVD_REG[0]}}; + + assign hit_CPTRA_RSVD_REG[1] = (soc_ifc_reg_req_data.addr == full_addr_CPTRA_RSVD_REG[1][18-1:0]); + assign bus_CPTRA_RSVD_REG[1] = {uc_rd, uc_wr, soc_rd, soc_wr} & {4{hit_CPTRA_RSVD_REG[1]}}; + + assign hit_fuse_uds_seed[0] = (soc_ifc_reg_req_data.addr == full_addr_fuse_uds_seed[0][18-1:0]); + assign bus_fuse_uds_seed[0] = {uc_rd, uc_wr, soc_rd, soc_wr} & {4{hit_fuse_uds_seed[0]}}; + + assign hit_fuse_uds_seed[1] = (soc_ifc_reg_req_data.addr == full_addr_fuse_uds_seed[1][18-1:0]); + assign bus_fuse_uds_seed[1] = {uc_rd, uc_wr, soc_rd, soc_wr} & {4{hit_fuse_uds_seed[1]}}; + + assign hit_fuse_uds_seed[2] = (soc_ifc_reg_req_data.addr == full_addr_fuse_uds_seed[2][18-1:0]); + assign bus_fuse_uds_seed[2] = {uc_rd, uc_wr, soc_rd, soc_wr} & {4{hit_fuse_uds_seed[2]}}; + + assign hit_fuse_uds_seed[3] = (soc_ifc_reg_req_data.addr == full_addr_fuse_uds_seed[3][18-1:0]); + assign bus_fuse_uds_seed[3] = {uc_rd, uc_wr, soc_rd, soc_wr} & {4{hit_fuse_uds_seed[3]}}; + + assign hit_fuse_uds_seed[4] = (soc_ifc_reg_req_data.addr == full_addr_fuse_uds_seed[4][18-1:0]); + assign bus_fuse_uds_seed[4] = {uc_rd, uc_wr, soc_rd, soc_wr} & {4{hit_fuse_uds_seed[4]}}; + + assign hit_fuse_uds_seed[5] = (soc_ifc_reg_req_data.addr == full_addr_fuse_uds_seed[5][18-1:0]); + assign bus_fuse_uds_seed[5] = {uc_rd, uc_wr, soc_rd, soc_wr} & {4{hit_fuse_uds_seed[5]}}; + + assign hit_fuse_uds_seed[6] = (soc_ifc_reg_req_data.addr == full_addr_fuse_uds_seed[6][18-1:0]); + assign bus_fuse_uds_seed[6] = {uc_rd, uc_wr, soc_rd, soc_wr} & {4{hit_fuse_uds_seed[6]}}; + + assign hit_fuse_uds_seed[7] = (soc_ifc_reg_req_data.addr == full_addr_fuse_uds_seed[7][18-1:0]); + assign bus_fuse_uds_seed[7] = {uc_rd, uc_wr, soc_rd, soc_wr} & {4{hit_fuse_uds_seed[7]}}; + + assign hit_fuse_uds_seed[8] = (soc_ifc_reg_req_data.addr == full_addr_fuse_uds_seed[8][18-1:0]); + assign bus_fuse_uds_seed[8] = {uc_rd, uc_wr, soc_rd, soc_wr} & {4{hit_fuse_uds_seed[8]}}; + + assign hit_fuse_uds_seed[9] = (soc_ifc_reg_req_data.addr == full_addr_fuse_uds_seed[9][18-1:0]); + assign bus_fuse_uds_seed[9] = {uc_rd, uc_wr, soc_rd, soc_wr} & {4{hit_fuse_uds_seed[9]}}; + + assign hit_fuse_uds_seed[10] = (soc_ifc_reg_req_data.addr == full_addr_fuse_uds_seed[10][18-1:0]); + assign bus_fuse_uds_seed[10] = {uc_rd, uc_wr, soc_rd, soc_wr} & {4{hit_fuse_uds_seed[10]}}; + + assign hit_fuse_uds_seed[11] = (soc_ifc_reg_req_data.addr == full_addr_fuse_uds_seed[11][18-1:0]); + assign bus_fuse_uds_seed[11] = {uc_rd, uc_wr, soc_rd, soc_wr} & {4{hit_fuse_uds_seed[11]}}; + + assign hit_fuse_field_entropy[0] = (soc_ifc_reg_req_data.addr == full_addr_fuse_field_entropy[0][18-1:0]); + assign bus_fuse_field_entropy[0] = {uc_rd, uc_wr, soc_rd, soc_wr} & {4{hit_fuse_field_entropy[0]}}; + + assign hit_fuse_field_entropy[1] = (soc_ifc_reg_req_data.addr == full_addr_fuse_field_entropy[1][18-1:0]); + assign bus_fuse_field_entropy[1] = {uc_rd, uc_wr, soc_rd, soc_wr} & {4{hit_fuse_field_entropy[1]}}; + + assign hit_fuse_field_entropy[2] = (soc_ifc_reg_req_data.addr == full_addr_fuse_field_entropy[2][18-1:0]); + assign bus_fuse_field_entropy[2] = {uc_rd, uc_wr, soc_rd, soc_wr} & {4{hit_fuse_field_entropy[2]}}; + + assign hit_fuse_field_entropy[3] = (soc_ifc_reg_req_data.addr == full_addr_fuse_field_entropy[3][18-1:0]); + assign bus_fuse_field_entropy[3] = {uc_rd, uc_wr, soc_rd, soc_wr} & {4{hit_fuse_field_entropy[3]}}; + + assign hit_fuse_field_entropy[4] = (soc_ifc_reg_req_data.addr == full_addr_fuse_field_entropy[4][18-1:0]); + assign bus_fuse_field_entropy[4] = {uc_rd, uc_wr, soc_rd, soc_wr} & {4{hit_fuse_field_entropy[4]}}; + + assign hit_fuse_field_entropy[5] = (soc_ifc_reg_req_data.addr == full_addr_fuse_field_entropy[5][18-1:0]); + assign bus_fuse_field_entropy[5] = {uc_rd, uc_wr, soc_rd, soc_wr} & {4{hit_fuse_field_entropy[5]}}; + + assign hit_fuse_field_entropy[6] = (soc_ifc_reg_req_data.addr == full_addr_fuse_field_entropy[6][18-1:0]); + assign bus_fuse_field_entropy[6] = {uc_rd, uc_wr, soc_rd, soc_wr} & {4{hit_fuse_field_entropy[6]}}; + + assign hit_fuse_field_entropy[7] = (soc_ifc_reg_req_data.addr == full_addr_fuse_field_entropy[7][18-1:0]); + assign bus_fuse_field_entropy[7] = {uc_rd, uc_wr, soc_rd, soc_wr} & {4{hit_fuse_field_entropy[7]}}; + + assign hit_fuse_key_manifest_pk_hash[0] = (soc_ifc_reg_req_data.addr == full_addr_fuse_key_manifest_pk_hash[0][18-1:0]); + assign bus_fuse_key_manifest_pk_hash[0] = {uc_rd, uc_wr, soc_rd, soc_wr} & {4{hit_fuse_key_manifest_pk_hash[0]}}; + + assign hit_fuse_key_manifest_pk_hash[1] = (soc_ifc_reg_req_data.addr == full_addr_fuse_key_manifest_pk_hash[1][18-1:0]); + assign bus_fuse_key_manifest_pk_hash[1] = {uc_rd, uc_wr, soc_rd, soc_wr} & {4{hit_fuse_key_manifest_pk_hash[1]}}; + + assign hit_fuse_key_manifest_pk_hash[2] = (soc_ifc_reg_req_data.addr == full_addr_fuse_key_manifest_pk_hash[2][18-1:0]); + assign bus_fuse_key_manifest_pk_hash[2] = {uc_rd, uc_wr, soc_rd, soc_wr} & {4{hit_fuse_key_manifest_pk_hash[2]}}; + + assign hit_fuse_key_manifest_pk_hash[3] = (soc_ifc_reg_req_data.addr == full_addr_fuse_key_manifest_pk_hash[3][18-1:0]); + assign bus_fuse_key_manifest_pk_hash[3] = {uc_rd, uc_wr, soc_rd, soc_wr} & {4{hit_fuse_key_manifest_pk_hash[3]}}; + + assign hit_fuse_key_manifest_pk_hash[4] = (soc_ifc_reg_req_data.addr == full_addr_fuse_key_manifest_pk_hash[4][18-1:0]); + assign bus_fuse_key_manifest_pk_hash[4] = {uc_rd, uc_wr, soc_rd, soc_wr} & {4{hit_fuse_key_manifest_pk_hash[4]}}; + + assign hit_fuse_key_manifest_pk_hash[5] = (soc_ifc_reg_req_data.addr == full_addr_fuse_key_manifest_pk_hash[5][18-1:0]); + assign bus_fuse_key_manifest_pk_hash[5] = {uc_rd, uc_wr, soc_rd, soc_wr} & {4{hit_fuse_key_manifest_pk_hash[5]}}; + + assign hit_fuse_key_manifest_pk_hash[6] = (soc_ifc_reg_req_data.addr == full_addr_fuse_key_manifest_pk_hash[6][18-1:0]); + assign bus_fuse_key_manifest_pk_hash[6] = {uc_rd, uc_wr, soc_rd, soc_wr} & {4{hit_fuse_key_manifest_pk_hash[6]}}; + + assign hit_fuse_key_manifest_pk_hash[7] = (soc_ifc_reg_req_data.addr == full_addr_fuse_key_manifest_pk_hash[7][18-1:0]); + assign bus_fuse_key_manifest_pk_hash[7] = {uc_rd, uc_wr, soc_rd, soc_wr} & {4{hit_fuse_key_manifest_pk_hash[7]}}; + + assign hit_fuse_key_manifest_pk_hash[8] = (soc_ifc_reg_req_data.addr == full_addr_fuse_key_manifest_pk_hash[8][18-1:0]); + assign bus_fuse_key_manifest_pk_hash[8] = {uc_rd, uc_wr, soc_rd, soc_wr} & {4{hit_fuse_key_manifest_pk_hash[8]}}; + + assign hit_fuse_key_manifest_pk_hash[9] = (soc_ifc_reg_req_data.addr == full_addr_fuse_key_manifest_pk_hash[9][18-1:0]); + assign bus_fuse_key_manifest_pk_hash[9] = {uc_rd, uc_wr, soc_rd, soc_wr} & {4{hit_fuse_key_manifest_pk_hash[9]}}; + + assign hit_fuse_key_manifest_pk_hash[10] = (soc_ifc_reg_req_data.addr == full_addr_fuse_key_manifest_pk_hash[10][18-1:0]); + assign bus_fuse_key_manifest_pk_hash[10] = {uc_rd, uc_wr, soc_rd, soc_wr} & {4{hit_fuse_key_manifest_pk_hash[10]}}; + + assign hit_fuse_key_manifest_pk_hash[11] = (soc_ifc_reg_req_data.addr == full_addr_fuse_key_manifest_pk_hash[11][18-1:0]); + assign bus_fuse_key_manifest_pk_hash[11] = {uc_rd, uc_wr, soc_rd, soc_wr} & {4{hit_fuse_key_manifest_pk_hash[11]}}; + + assign hit_fuse_key_manifest_pk_hash_mask = (soc_ifc_reg_req_data.addr == full_addr_fuse_key_manifest_pk_hash_mask[APB_ADDR_WIDTH-1:0]); + assign bus_fuse_key_manifest_pk_hash_mask = {uc_rd, uc_wr, soc_rd, soc_wr} & {4{hit_fuse_key_manifest_pk_hash_mask}}; + + assign hit_fuse_owner_pk_hash[0] = (soc_ifc_reg_req_data.addr == full_addr_fuse_owner_pk_hash[0][18-1:0]); + assign bus_fuse_owner_pk_hash[0] = {uc_rd, uc_wr, soc_rd, soc_wr} & {4{hit_fuse_owner_pk_hash[0]}}; + + assign hit_fuse_owner_pk_hash[1] = (soc_ifc_reg_req_data.addr == full_addr_fuse_owner_pk_hash[1][18-1:0]); + assign bus_fuse_owner_pk_hash[1] = {uc_rd, uc_wr, soc_rd, soc_wr} & {4{hit_fuse_owner_pk_hash[1]}}; + + assign hit_fuse_owner_pk_hash[2] = (soc_ifc_reg_req_data.addr == full_addr_fuse_owner_pk_hash[2][18-1:0]); + assign bus_fuse_owner_pk_hash[2] = {uc_rd, uc_wr, soc_rd, soc_wr} & {4{hit_fuse_owner_pk_hash[2]}}; + + assign hit_fuse_owner_pk_hash[3] = (soc_ifc_reg_req_data.addr == full_addr_fuse_owner_pk_hash[3][18-1:0]); + assign bus_fuse_owner_pk_hash[3] = {uc_rd, uc_wr, soc_rd, soc_wr} & {4{hit_fuse_owner_pk_hash[3]}}; + + assign hit_fuse_owner_pk_hash[4] = (soc_ifc_reg_req_data.addr == full_addr_fuse_owner_pk_hash[4][18-1:0]); + assign bus_fuse_owner_pk_hash[4] = {uc_rd, uc_wr, soc_rd, soc_wr} & {4{hit_fuse_owner_pk_hash[4]}}; + + assign hit_fuse_owner_pk_hash[5] = (soc_ifc_reg_req_data.addr == full_addr_fuse_owner_pk_hash[5][18-1:0]); + assign bus_fuse_owner_pk_hash[5] = {uc_rd, uc_wr, soc_rd, soc_wr} & {4{hit_fuse_owner_pk_hash[5]}}; + + assign hit_fuse_owner_pk_hash[6] = (soc_ifc_reg_req_data.addr == full_addr_fuse_owner_pk_hash[6][18-1:0]); + assign bus_fuse_owner_pk_hash[6] = {uc_rd, uc_wr, soc_rd, soc_wr} & {4{hit_fuse_owner_pk_hash[6]}}; + + assign hit_fuse_owner_pk_hash[7] = (soc_ifc_reg_req_data.addr == full_addr_fuse_owner_pk_hash[7][18-1:0]); + assign bus_fuse_owner_pk_hash[7] = {uc_rd, uc_wr, soc_rd, soc_wr} & {4{hit_fuse_owner_pk_hash[7]}}; + + assign hit_fuse_owner_pk_hash[8] = (soc_ifc_reg_req_data.addr == full_addr_fuse_owner_pk_hash[8][18-1:0]); + assign bus_fuse_owner_pk_hash[8] = {uc_rd, uc_wr, soc_rd, soc_wr} & {4{hit_fuse_owner_pk_hash[8]}}; + + assign hit_fuse_owner_pk_hash[9] = (soc_ifc_reg_req_data.addr == full_addr_fuse_owner_pk_hash[9][18-1:0]); + assign bus_fuse_owner_pk_hash[9] = {uc_rd, uc_wr, soc_rd, soc_wr} & {4{hit_fuse_owner_pk_hash[9]}}; + + assign hit_fuse_owner_pk_hash[10] = (soc_ifc_reg_req_data.addr == full_addr_fuse_owner_pk_hash[10][18-1:0]); + assign bus_fuse_owner_pk_hash[10] = {uc_rd, uc_wr, soc_rd, soc_wr} & {4{hit_fuse_owner_pk_hash[10]}}; + + assign hit_fuse_owner_pk_hash[11] = (soc_ifc_reg_req_data.addr == full_addr_fuse_owner_pk_hash[11][18-1:0]); + assign bus_fuse_owner_pk_hash[11] = {uc_rd, uc_wr, soc_rd, soc_wr} & {4{hit_fuse_owner_pk_hash[11]}}; + + assign hit_fuse_fmc_key_manifest_svn = (soc_ifc_reg_req_data.addr == full_addr_fuse_fmc_key_manifest_svn[APB_ADDR_WIDTH-1:0]); + assign bus_fuse_fmc_key_manifest_svn = {uc_rd, uc_wr, soc_rd, soc_wr} & {4{hit_fuse_fmc_key_manifest_svn}}; + + assign hit_fuse_runtime_svn[0] = (soc_ifc_reg_req_data.addr == full_addr_fuse_runtime_svn[0][18-1:0]); + assign bus_fuse_runtime_svn[0] = {uc_rd, uc_wr, soc_rd, soc_wr} & {4{hit_fuse_runtime_svn[0]}}; + + assign hit_fuse_runtime_svn[1] = (soc_ifc_reg_req_data.addr == full_addr_fuse_runtime_svn[1][18-1:0]); + assign bus_fuse_runtime_svn[1] = {uc_rd, uc_wr, soc_rd, soc_wr} & {4{hit_fuse_runtime_svn[1]}}; + + assign hit_fuse_runtime_svn[2] = (soc_ifc_reg_req_data.addr == full_addr_fuse_runtime_svn[2][18-1:0]); + assign bus_fuse_runtime_svn[2] = {uc_rd, uc_wr, soc_rd, soc_wr} & {4{hit_fuse_runtime_svn[2]}}; + + assign hit_fuse_runtime_svn[3] = (soc_ifc_reg_req_data.addr == full_addr_fuse_runtime_svn[3][18-1:0]); + assign bus_fuse_runtime_svn[3] = {uc_rd, uc_wr, soc_rd, soc_wr} & {4{hit_fuse_runtime_svn[3]}}; + + assign hit_fuse_anti_rollback_disable = (soc_ifc_reg_req_data.addr == full_addr_fuse_anti_rollback_disable[APB_ADDR_WIDTH-1:0]); + assign bus_fuse_anti_rollback_disable = {uc_rd, uc_wr, soc_rd, soc_wr} & {4{hit_fuse_anti_rollback_disable}}; + + assign hit_fuse_idevid_cert_attr[0] = (soc_ifc_reg_req_data.addr == full_addr_fuse_idevid_cert_attr[0][18-1:0]); + assign bus_fuse_idevid_cert_attr[0] = {uc_rd, uc_wr, soc_rd, soc_wr} & {4{hit_fuse_idevid_cert_attr[0]}}; + + assign hit_fuse_idevid_cert_attr[1] = (soc_ifc_reg_req_data.addr == full_addr_fuse_idevid_cert_attr[1][18-1:0]); + assign bus_fuse_idevid_cert_attr[1] = {uc_rd, uc_wr, soc_rd, soc_wr} & {4{hit_fuse_idevid_cert_attr[1]}}; + + assign hit_fuse_idevid_cert_attr[2] = (soc_ifc_reg_req_data.addr == full_addr_fuse_idevid_cert_attr[2][18-1:0]); + assign bus_fuse_idevid_cert_attr[2] = {uc_rd, uc_wr, soc_rd, soc_wr} & {4{hit_fuse_idevid_cert_attr[2]}}; + + assign hit_fuse_idevid_cert_attr[3] = (soc_ifc_reg_req_data.addr == full_addr_fuse_idevid_cert_attr[3][18-1:0]); + assign bus_fuse_idevid_cert_attr[3] = {uc_rd, uc_wr, soc_rd, soc_wr} & {4{hit_fuse_idevid_cert_attr[3]}}; + + assign hit_fuse_idevid_cert_attr[4] = (soc_ifc_reg_req_data.addr == full_addr_fuse_idevid_cert_attr[4][18-1:0]); + assign bus_fuse_idevid_cert_attr[4] = {uc_rd, uc_wr, soc_rd, soc_wr} & {4{hit_fuse_idevid_cert_attr[4]}}; + + assign hit_fuse_idevid_cert_attr[5] = (soc_ifc_reg_req_data.addr == full_addr_fuse_idevid_cert_attr[5][18-1:0]); + assign bus_fuse_idevid_cert_attr[5] = {uc_rd, uc_wr, soc_rd, soc_wr} & {4{hit_fuse_idevid_cert_attr[5]}}; + + assign hit_fuse_idevid_cert_attr[6] = (soc_ifc_reg_req_data.addr == full_addr_fuse_idevid_cert_attr[6][18-1:0]); + assign bus_fuse_idevid_cert_attr[6] = {uc_rd, uc_wr, soc_rd, soc_wr} & {4{hit_fuse_idevid_cert_attr[6]}}; + + assign hit_fuse_idevid_cert_attr[7] = (soc_ifc_reg_req_data.addr == full_addr_fuse_idevid_cert_attr[7][18-1:0]); + assign bus_fuse_idevid_cert_attr[7] = {uc_rd, uc_wr, soc_rd, soc_wr} & {4{hit_fuse_idevid_cert_attr[7]}}; + + assign hit_fuse_idevid_cert_attr[8] = (soc_ifc_reg_req_data.addr == full_addr_fuse_idevid_cert_attr[8][18-1:0]); + assign bus_fuse_idevid_cert_attr[8] = {uc_rd, uc_wr, soc_rd, soc_wr} & {4{hit_fuse_idevid_cert_attr[8]}}; + + assign hit_fuse_idevid_cert_attr[9] = (soc_ifc_reg_req_data.addr == full_addr_fuse_idevid_cert_attr[9][18-1:0]); + assign bus_fuse_idevid_cert_attr[9] = {uc_rd, uc_wr, soc_rd, soc_wr} & {4{hit_fuse_idevid_cert_attr[9]}}; + + assign hit_fuse_idevid_cert_attr[10] = (soc_ifc_reg_req_data.addr == full_addr_fuse_idevid_cert_attr[10][18-1:0]); + assign bus_fuse_idevid_cert_attr[10] = {uc_rd, uc_wr, soc_rd, soc_wr} & {4{hit_fuse_idevid_cert_attr[10]}}; + + assign hit_fuse_idevid_cert_attr[11] = (soc_ifc_reg_req_data.addr == full_addr_fuse_idevid_cert_attr[11][18-1:0]); + assign bus_fuse_idevid_cert_attr[11] = {uc_rd, uc_wr, soc_rd, soc_wr} & {4{hit_fuse_idevid_cert_attr[11]}}; + + assign hit_fuse_idevid_cert_attr[12] = (soc_ifc_reg_req_data.addr == full_addr_fuse_idevid_cert_attr[12][18-1:0]); + assign bus_fuse_idevid_cert_attr[12] = {uc_rd, uc_wr, soc_rd, soc_wr} & {4{hit_fuse_idevid_cert_attr[12]}}; + + assign hit_fuse_idevid_cert_attr[13] = (soc_ifc_reg_req_data.addr == full_addr_fuse_idevid_cert_attr[13][18-1:0]); + assign bus_fuse_idevid_cert_attr[13] = {uc_rd, uc_wr, soc_rd, soc_wr} & {4{hit_fuse_idevid_cert_attr[13]}}; + + assign hit_fuse_idevid_cert_attr[14] = (soc_ifc_reg_req_data.addr == full_addr_fuse_idevid_cert_attr[14][18-1:0]); + assign bus_fuse_idevid_cert_attr[14] = {uc_rd, uc_wr, soc_rd, soc_wr} & {4{hit_fuse_idevid_cert_attr[14]}}; + + assign hit_fuse_idevid_cert_attr[15] = (soc_ifc_reg_req_data.addr == full_addr_fuse_idevid_cert_attr[15][18-1:0]); + assign bus_fuse_idevid_cert_attr[15] = {uc_rd, uc_wr, soc_rd, soc_wr} & {4{hit_fuse_idevid_cert_attr[15]}}; + + assign hit_fuse_idevid_cert_attr[16] = (soc_ifc_reg_req_data.addr == full_addr_fuse_idevid_cert_attr[16][18-1:0]); + assign bus_fuse_idevid_cert_attr[16] = {uc_rd, uc_wr, soc_rd, soc_wr} & {4{hit_fuse_idevid_cert_attr[16]}}; + + assign hit_fuse_idevid_cert_attr[17] = (soc_ifc_reg_req_data.addr == full_addr_fuse_idevid_cert_attr[17][18-1:0]); + assign bus_fuse_idevid_cert_attr[17] = {uc_rd, uc_wr, soc_rd, soc_wr} & {4{hit_fuse_idevid_cert_attr[17]}}; + + assign hit_fuse_idevid_cert_attr[18] = (soc_ifc_reg_req_data.addr == full_addr_fuse_idevid_cert_attr[18][18-1:0]); + assign bus_fuse_idevid_cert_attr[18] = {uc_rd, uc_wr, soc_rd, soc_wr} & {4{hit_fuse_idevid_cert_attr[18]}}; + + assign hit_fuse_idevid_cert_attr[19] = (soc_ifc_reg_req_data.addr == full_addr_fuse_idevid_cert_attr[19][18-1:0]); + assign bus_fuse_idevid_cert_attr[19] = {uc_rd, uc_wr, soc_rd, soc_wr} & {4{hit_fuse_idevid_cert_attr[19]}}; + + assign hit_fuse_idevid_cert_attr[20] = (soc_ifc_reg_req_data.addr == full_addr_fuse_idevid_cert_attr[20][18-1:0]); + assign bus_fuse_idevid_cert_attr[20] = {uc_rd, uc_wr, soc_rd, soc_wr} & {4{hit_fuse_idevid_cert_attr[20]}}; + + assign hit_fuse_idevid_cert_attr[21] = (soc_ifc_reg_req_data.addr == full_addr_fuse_idevid_cert_attr[21][18-1:0]); + assign bus_fuse_idevid_cert_attr[21] = {uc_rd, uc_wr, soc_rd, soc_wr} & {4{hit_fuse_idevid_cert_attr[21]}}; + + assign hit_fuse_idevid_cert_attr[22] = (soc_ifc_reg_req_data.addr == full_addr_fuse_idevid_cert_attr[22][18-1:0]); + assign bus_fuse_idevid_cert_attr[22] = {uc_rd, uc_wr, soc_rd, soc_wr} & {4{hit_fuse_idevid_cert_attr[22]}}; + + assign hit_fuse_idevid_cert_attr[23] = (soc_ifc_reg_req_data.addr == full_addr_fuse_idevid_cert_attr[23][18-1:0]); + assign bus_fuse_idevid_cert_attr[23] = {uc_rd, uc_wr, soc_rd, soc_wr} & {4{hit_fuse_idevid_cert_attr[23]}}; + + assign hit_fuse_idevid_manuf_hsm_id[0] = (soc_ifc_reg_req_data.addr == full_addr_fuse_idevid_manuf_hsm_id[0][18-1:0]); + assign bus_fuse_idevid_manuf_hsm_id[0] = {uc_rd, uc_wr, soc_rd, soc_wr} & {4{hit_fuse_idevid_manuf_hsm_id[0]}}; + + assign hit_fuse_idevid_manuf_hsm_id[1] = (soc_ifc_reg_req_data.addr == full_addr_fuse_idevid_manuf_hsm_id[1][18-1:0]); + assign bus_fuse_idevid_manuf_hsm_id[1] = {uc_rd, uc_wr, soc_rd, soc_wr} & {4{hit_fuse_idevid_manuf_hsm_id[1]}}; + + assign hit_fuse_idevid_manuf_hsm_id[2] = (soc_ifc_reg_req_data.addr == full_addr_fuse_idevid_manuf_hsm_id[2][18-1:0]); + assign bus_fuse_idevid_manuf_hsm_id[2] = {uc_rd, uc_wr, soc_rd, soc_wr} & {4{hit_fuse_idevid_manuf_hsm_id[2]}}; + + assign hit_fuse_idevid_manuf_hsm_id[3] = (soc_ifc_reg_req_data.addr == full_addr_fuse_idevid_manuf_hsm_id[3][18-1:0]); + assign bus_fuse_idevid_manuf_hsm_id[3] = {uc_rd, uc_wr, soc_rd, soc_wr} & {4{hit_fuse_idevid_manuf_hsm_id[3]}}; + + assign hit_fuse_life_cycle = (soc_ifc_reg_req_data.addr == full_addr_fuse_life_cycle[APB_ADDR_WIDTH-1:0]); + assign bus_fuse_life_cycle = {uc_rd, uc_wr, soc_rd, soc_wr} & {4{hit_fuse_life_cycle}}; + + assign hit_fuse_lms_verify = (soc_ifc_reg_req_data.addr == full_addr_fuse_lms_verify[APB_ADDR_WIDTH-1:0]); + assign bus_fuse_lms_verify = {uc_rd, uc_wr, soc_rd, soc_wr} & {4{hit_fuse_lms_verify}}; + + assign hit_fuse_lms_revocation = (soc_ifc_reg_req_data.addr == full_addr_fuse_lms_revocation[APB_ADDR_WIDTH-1:0]); + assign bus_fuse_lms_revocation = {uc_rd, uc_wr, soc_rd, soc_wr} & {4{hit_fuse_lms_revocation}}; + + assign hit_fuse_soc_stepping_id = (soc_ifc_reg_req_data.addr == full_addr_fuse_soc_stepping_id[APB_ADDR_WIDTH-1:0]); + assign bus_fuse_soc_stepping_id = {uc_rd, uc_wr, soc_rd, soc_wr} & {4{hit_fuse_soc_stepping_id}}; + + assign hit_internal_obf_key[0] = (soc_ifc_reg_req_data.addr == full_addr_internal_obf_key[0][18-1:0]); + assign bus_internal_obf_key[0] = {uc_rd, uc_wr, soc_rd, soc_wr} & {4{hit_internal_obf_key[0]}}; + + assign hit_internal_obf_key[1] = (soc_ifc_reg_req_data.addr == full_addr_internal_obf_key[1][18-1:0]); + assign bus_internal_obf_key[1] = {uc_rd, uc_wr, soc_rd, soc_wr} & {4{hit_internal_obf_key[1]}}; + + assign hit_internal_obf_key[2] = (soc_ifc_reg_req_data.addr == full_addr_internal_obf_key[2][18-1:0]); + assign bus_internal_obf_key[2] = {uc_rd, uc_wr, soc_rd, soc_wr} & {4{hit_internal_obf_key[2]}}; + + assign hit_internal_obf_key[3] = (soc_ifc_reg_req_data.addr == full_addr_internal_obf_key[3][18-1:0]); + assign bus_internal_obf_key[3] = {uc_rd, uc_wr, soc_rd, soc_wr} & {4{hit_internal_obf_key[3]}}; + + assign hit_internal_obf_key[4] = (soc_ifc_reg_req_data.addr == full_addr_internal_obf_key[4][18-1:0]); + assign bus_internal_obf_key[4] = {uc_rd, uc_wr, soc_rd, soc_wr} & {4{hit_internal_obf_key[4]}}; + + assign hit_internal_obf_key[5] = (soc_ifc_reg_req_data.addr == full_addr_internal_obf_key[5][18-1:0]); + assign bus_internal_obf_key[5] = {uc_rd, uc_wr, soc_rd, soc_wr} & {4{hit_internal_obf_key[5]}}; + + assign hit_internal_obf_key[6] = (soc_ifc_reg_req_data.addr == full_addr_internal_obf_key[6][18-1:0]); + assign bus_internal_obf_key[6] = {uc_rd, uc_wr, soc_rd, soc_wr} & {4{hit_internal_obf_key[6]}}; + + assign hit_internal_obf_key[7] = (soc_ifc_reg_req_data.addr == full_addr_internal_obf_key[7][18-1:0]); + assign bus_internal_obf_key[7] = {uc_rd, uc_wr, soc_rd, soc_wr} & {4{hit_internal_obf_key[7]}}; + + assign hit_internal_iccm_lock = (soc_ifc_reg_req_data.addr == full_addr_internal_iccm_lock[APB_ADDR_WIDTH-1:0]); + assign bus_internal_iccm_lock = {uc_rd, uc_wr, soc_rd, soc_wr} & {4{hit_internal_iccm_lock}}; + + assign hit_internal_fw_update_reset = (soc_ifc_reg_req_data.addr == full_addr_internal_fw_update_reset[APB_ADDR_WIDTH-1:0]); + assign bus_internal_fw_update_reset = {uc_rd, uc_wr, soc_rd, soc_wr} & {4{hit_internal_fw_update_reset}}; + + assign hit_internal_fw_update_reset_wait_cycles = (soc_ifc_reg_req_data.addr == full_addr_internal_fw_update_reset_wait_cycles[APB_ADDR_WIDTH-1:0]); + assign bus_internal_fw_update_reset_wait_cycles = {uc_rd, uc_wr, soc_rd, soc_wr} & {4{hit_internal_fw_update_reset_wait_cycles}}; + + assign hit_internal_nmi_vector = (soc_ifc_reg_req_data.addr == full_addr_internal_nmi_vector[APB_ADDR_WIDTH-1:0]); + assign bus_internal_nmi_vector = {uc_rd, uc_wr, soc_rd, soc_wr} & {4{hit_internal_nmi_vector}}; + + assign hit_internal_hw_error_fatal_mask = (soc_ifc_reg_req_data.addr == full_addr_internal_hw_error_fatal_mask[APB_ADDR_WIDTH-1:0]); + assign bus_internal_hw_error_fatal_mask = {uc_rd, uc_wr, soc_rd, soc_wr} & {4{hit_internal_hw_error_fatal_mask}}; + + assign hit_internal_hw_error_non_fatal_mask = (soc_ifc_reg_req_data.addr == full_addr_internal_hw_error_non_fatal_mask[APB_ADDR_WIDTH-1:0]); + assign bus_internal_hw_error_non_fatal_mask = {uc_rd, uc_wr, soc_rd, soc_wr} & {4{hit_internal_hw_error_non_fatal_mask}}; + + assign hit_internal_fw_error_fatal_mask = (soc_ifc_reg_req_data.addr == full_addr_internal_fw_error_fatal_mask[APB_ADDR_WIDTH-1:0]); + assign bus_internal_fw_error_fatal_mask = {uc_rd, uc_wr, soc_rd, soc_wr} & {4{hit_internal_fw_error_fatal_mask}}; + + assign hit_internal_fw_error_non_fatal_mask = (soc_ifc_reg_req_data.addr == full_addr_internal_fw_error_non_fatal_mask[APB_ADDR_WIDTH-1:0]); + assign bus_internal_fw_error_non_fatal_mask = {uc_rd, uc_wr, soc_rd, soc_wr} & {4{hit_internal_fw_error_non_fatal_mask}}; + + assign hit_internal_rv_mtime_l = (soc_ifc_reg_req_data.addr == full_addr_internal_rv_mtime_l[APB_ADDR_WIDTH-1:0]); + assign bus_internal_rv_mtime_l = {uc_rd, uc_wr, soc_rd, soc_wr} & {4{hit_internal_rv_mtime_l}}; + + assign hit_internal_rv_mtime_h = (soc_ifc_reg_req_data.addr == full_addr_internal_rv_mtime_h[APB_ADDR_WIDTH-1:0]); + assign bus_internal_rv_mtime_h = {uc_rd, uc_wr, soc_rd, soc_wr} & {4{hit_internal_rv_mtime_h}}; + + assign hit_internal_rv_mtimecmp_l = (soc_ifc_reg_req_data.addr == full_addr_internal_rv_mtimecmp_l[APB_ADDR_WIDTH-1:0]); + assign bus_internal_rv_mtimecmp_l = {uc_rd, uc_wr, soc_rd, soc_wr} & {4{hit_internal_rv_mtimecmp_l}}; + + assign hit_internal_rv_mtimecmp_h = (soc_ifc_reg_req_data.addr == full_addr_internal_rv_mtimecmp_h[APB_ADDR_WIDTH-1:0]); + assign bus_internal_rv_mtimecmp_h = {uc_rd, uc_wr, soc_rd, soc_wr} & {4{hit_internal_rv_mtimecmp_h}}; + + assign hit_intr_brf_global_intr_en_r = (soc_ifc_reg_req_data.addr == full_addr_intr_brf_global_intr_en_r[APB_ADDR_WIDTH-1:0]); + assign bus_intr_brf_global_intr_en_r = {uc_rd, uc_wr, soc_rd, soc_wr} & {4{hit_intr_brf_global_intr_en_r}}; + + assign hit_intr_brf_error_intr_en_r = (soc_ifc_reg_req_data.addr == full_addr_intr_brf_error_intr_en_r[APB_ADDR_WIDTH-1:0]); + assign bus_intr_brf_error_intr_en_r = {uc_rd, uc_wr, soc_rd, soc_wr} & {4{hit_intr_brf_error_intr_en_r}}; + + assign hit_intr_brf_notif_intr_en_r = (soc_ifc_reg_req_data.addr == full_addr_intr_brf_notif_intr_en_r[APB_ADDR_WIDTH-1:0]); + assign bus_intr_brf_notif_intr_en_r = {uc_rd, uc_wr, soc_rd, soc_wr} & {4{hit_intr_brf_notif_intr_en_r}}; + + assign hit_intr_brf_error_global_intr_r = (soc_ifc_reg_req_data.addr == full_addr_intr_brf_error_global_intr_r[APB_ADDR_WIDTH-1:0]); + assign bus_intr_brf_error_global_intr_r = {uc_rd, uc_wr, soc_rd, soc_wr} & {4{hit_intr_brf_error_global_intr_r}}; + + assign hit_intr_brf_notif_global_intr_r = (soc_ifc_reg_req_data.addr == full_addr_intr_brf_notif_global_intr_r[APB_ADDR_WIDTH-1:0]); + assign bus_intr_brf_notif_global_intr_r = {uc_rd, uc_wr, soc_rd, soc_wr} & {4{hit_intr_brf_notif_global_intr_r}}; + + assign hit_intr_brf_error_internal_intr_r = (soc_ifc_reg_req_data.addr == full_addr_intr_brf_error_internal_intr_r[APB_ADDR_WIDTH-1:0]); + assign bus_intr_brf_error_internal_intr_r = {uc_rd, uc_wr, soc_rd, soc_wr} & {4{hit_intr_brf_error_internal_intr_r}}; + + assign hit_intr_brf_notif_internal_intr_r = (soc_ifc_reg_req_data.addr == full_addr_intr_brf_notif_internal_intr_r[APB_ADDR_WIDTH-1:0]); + assign bus_intr_brf_notif_internal_intr_r = {uc_rd, uc_wr, soc_rd, soc_wr} & {4{hit_intr_brf_notif_internal_intr_r}}; + + assign hit_intr_brf_error_intr_trig_r = (soc_ifc_reg_req_data.addr == full_addr_intr_brf_error_intr_trig_r[APB_ADDR_WIDTH-1:0]); + assign bus_intr_brf_error_intr_trig_r = {uc_rd, uc_wr, soc_rd, soc_wr} & {4{hit_intr_brf_error_intr_trig_r}}; + + assign hit_intr_brf_notif_intr_trig_r = (soc_ifc_reg_req_data.addr == full_addr_intr_brf_notif_intr_trig_r[APB_ADDR_WIDTH-1:0]); + assign bus_intr_brf_notif_intr_trig_r = {uc_rd, uc_wr, soc_rd, soc_wr} & {4{hit_intr_brf_notif_intr_trig_r}}; + + assign hit_intr_brf_error_internal_intr_count_r = (soc_ifc_reg_req_data.addr == full_addr_intr_brf_error_internal_intr_count_r[APB_ADDR_WIDTH-1:0]); + assign bus_intr_brf_error_internal_intr_count_r = {uc_rd, uc_wr, soc_rd, soc_wr} & {4{hit_intr_brf_error_internal_intr_count_r}}; + + assign hit_intr_brf_error_inv_dev_intr_count_r = (soc_ifc_reg_req_data.addr == full_addr_intr_brf_error_inv_dev_intr_count_r[APB_ADDR_WIDTH-1:0]); + assign bus_intr_brf_error_inv_dev_intr_count_r = {uc_rd, uc_wr, soc_rd, soc_wr} & {4{hit_intr_brf_error_inv_dev_intr_count_r}}; + + assign hit_intr_brf_error_cmd_fail_intr_count_r = (soc_ifc_reg_req_data.addr == full_addr_intr_brf_error_cmd_fail_intr_count_r[APB_ADDR_WIDTH-1:0]); + assign bus_intr_brf_error_cmd_fail_intr_count_r = {uc_rd, uc_wr, soc_rd, soc_wr} & {4{hit_intr_brf_error_cmd_fail_intr_count_r}}; + + assign hit_intr_brf_error_bad_fuse_intr_count_r = (soc_ifc_reg_req_data.addr == full_addr_intr_brf_error_bad_fuse_intr_count_r[APB_ADDR_WIDTH-1:0]); + assign bus_intr_brf_error_bad_fuse_intr_count_r = {uc_rd, uc_wr, soc_rd, soc_wr} & {4{hit_intr_brf_error_bad_fuse_intr_count_r}}; + + assign hit_intr_brf_error_iccm_blocked_intr_count_r = (soc_ifc_reg_req_data.addr == full_addr_intr_brf_error_iccm_blocked_intr_count_r[APB_ADDR_WIDTH-1:0]); + assign bus_intr_brf_error_iccm_blocked_intr_count_r = {uc_rd, uc_wr, soc_rd, soc_wr} & {4{hit_intr_brf_error_iccm_blocked_intr_count_r}}; + + assign hit_intr_brf_error_mbox_ecc_unc_intr_count_r = (soc_ifc_reg_req_data.addr == full_addr_intr_brf_error_mbox_ecc_unc_intr_count_r[APB_ADDR_WIDTH-1:0]); + assign bus_intr_brf_error_mbox_ecc_unc_intr_count_r = {uc_rd, uc_wr, soc_rd, soc_wr} & {4{hit_intr_brf_error_mbox_ecc_unc_intr_count_r}}; + + assign hit_intr_brf_error_wdt_timer1_timeout_intr_count_r = (soc_ifc_reg_req_data.addr == full_addr_intr_brf_error_wdt_timer1_timeout_intr_count_r[APB_ADDR_WIDTH-1:0]); + assign bus_intr_brf_error_wdt_timer1_timeout_intr_count_r = {uc_rd, uc_wr, soc_rd, soc_wr} & {4{hit_intr_brf_error_wdt_timer1_timeout_intr_count_r}}; + + assign hit_intr_brf_error_wdt_timer2_timeout_intr_count_r = (soc_ifc_reg_req_data.addr == full_addr_intr_brf_error_wdt_timer2_timeout_intr_count_r[APB_ADDR_WIDTH-1:0]); + assign bus_intr_brf_error_wdt_timer2_timeout_intr_count_r = {uc_rd, uc_wr, soc_rd, soc_wr} & {4{hit_intr_brf_error_wdt_timer2_timeout_intr_count_r}}; + + assign hit_intr_brf_notif_cmd_avail_intr_count_r = (soc_ifc_reg_req_data.addr == full_addr_intr_brf_notif_cmd_avail_intr_count_r[APB_ADDR_WIDTH-1:0]); + assign bus_intr_brf_notif_cmd_avail_intr_count_r = {uc_rd, uc_wr, soc_rd, soc_wr} & {4{hit_intr_brf_notif_cmd_avail_intr_count_r}}; + + assign hit_intr_brf_notif_mbox_ecc_cor_intr_count_r = (soc_ifc_reg_req_data.addr == full_addr_intr_brf_notif_mbox_ecc_cor_intr_count_r[APB_ADDR_WIDTH-1:0]); + assign bus_intr_brf_notif_mbox_ecc_cor_intr_count_r = {uc_rd, uc_wr, soc_rd, soc_wr} & {4{hit_intr_brf_notif_mbox_ecc_cor_intr_count_r}}; + + assign hit_intr_brf_notif_debug_locked_intr_count_r = (soc_ifc_reg_req_data.addr == full_addr_intr_brf_notif_debug_locked_intr_count_r[APB_ADDR_WIDTH-1:0]); + assign bus_intr_brf_notif_debug_locked_intr_count_r = {uc_rd, uc_wr, soc_rd, soc_wr} & {4{hit_intr_brf_notif_debug_locked_intr_count_r}}; + + assign hit_intr_brf_notif_scan_mode_intr_count_r = (soc_ifc_reg_req_data.addr == full_addr_intr_brf_notif_scan_mode_intr_count_r[APB_ADDR_WIDTH-1:0]); + assign bus_intr_brf_notif_scan_mode_intr_count_r = {uc_rd, uc_wr, soc_rd, soc_wr} & {4{hit_intr_brf_notif_scan_mode_intr_count_r}}; + + assign hit_intr_brf_notif_soc_req_lock_intr_count_r = (soc_ifc_reg_req_data.addr == full_addr_intr_brf_notif_soc_req_lock_intr_count_r[APB_ADDR_WIDTH-1:0]); + assign bus_intr_brf_notif_soc_req_lock_intr_count_r = {uc_rd, uc_wr, soc_rd, soc_wr} & {4{hit_intr_brf_notif_soc_req_lock_intr_count_r}}; + + assign hit_intr_brf_notif_gen_in_toggle_intr_count_r = (soc_ifc_reg_req_data.addr == full_addr_intr_brf_notif_gen_in_toggle_intr_count_r[APB_ADDR_WIDTH-1:0]); + assign bus_intr_brf_notif_gen_in_toggle_intr_count_r = {uc_rd, uc_wr, soc_rd, soc_wr} & {4{hit_intr_brf_notif_gen_in_toggle_intr_count_r}}; + + assign hit_intr_brf_error_internal_intr_count_incr_r = (soc_ifc_reg_req_data.addr == full_addr_intr_brf_error_internal_intr_count_incr_r[APB_ADDR_WIDTH-1:0]); + assign bus_intr_brf_error_internal_intr_count_incr_r = {uc_rd, uc_wr, soc_rd, soc_wr} & {4{hit_intr_brf_error_internal_intr_count_incr_r}}; + + assign hit_intr_brf_error_inv_dev_intr_count_incr_r = (soc_ifc_reg_req_data.addr == full_addr_intr_brf_error_inv_dev_intr_count_incr_r[APB_ADDR_WIDTH-1:0]); + assign bus_intr_brf_error_inv_dev_intr_count_incr_r = {uc_rd, uc_wr, soc_rd, soc_wr} & {4{hit_intr_brf_error_inv_dev_intr_count_incr_r}}; + + assign hit_intr_brf_error_cmd_fail_intr_count_incr_r = (soc_ifc_reg_req_data.addr == full_addr_intr_brf_error_cmd_fail_intr_count_incr_r[APB_ADDR_WIDTH-1:0]); + assign bus_intr_brf_error_cmd_fail_intr_count_incr_r = {uc_rd, uc_wr, soc_rd, soc_wr} & {4{hit_intr_brf_error_cmd_fail_intr_count_incr_r}}; + + assign hit_intr_brf_error_bad_fuse_intr_count_incr_r = (soc_ifc_reg_req_data.addr == full_addr_intr_brf_error_bad_fuse_intr_count_incr_r[APB_ADDR_WIDTH-1:0]); + assign bus_intr_brf_error_bad_fuse_intr_count_incr_r = {uc_rd, uc_wr, soc_rd, soc_wr} & {4{hit_intr_brf_error_bad_fuse_intr_count_incr_r}}; + + assign hit_intr_brf_error_iccm_blocked_intr_count_incr_r = (soc_ifc_reg_req_data.addr == full_addr_intr_brf_error_iccm_blocked_intr_count_incr_r[APB_ADDR_WIDTH-1:0]); + assign bus_intr_brf_error_iccm_blocked_intr_count_incr_r = {uc_rd, uc_wr, soc_rd, soc_wr} & {4{hit_intr_brf_error_iccm_blocked_intr_count_incr_r}}; + + assign hit_intr_brf_error_mbox_ecc_unc_intr_count_incr_r = (soc_ifc_reg_req_data.addr == full_addr_intr_brf_error_mbox_ecc_unc_intr_count_incr_r[APB_ADDR_WIDTH-1:0]); + assign bus_intr_brf_error_mbox_ecc_unc_intr_count_incr_r = {uc_rd, uc_wr, soc_rd, soc_wr} & {4{hit_intr_brf_error_mbox_ecc_unc_intr_count_incr_r}}; + + assign hit_intr_brf_error_wdt_timer1_timeout_intr_count_incr_r = (soc_ifc_reg_req_data.addr == full_addr_intr_brf_error_wdt_timer1_timeout_intr_count_incr_r[APB_ADDR_WIDTH-1:0]); + assign bus_intr_brf_error_wdt_timer1_timeout_intr_count_incr_r = {uc_rd, uc_wr, soc_rd, soc_wr} & {4{hit_intr_brf_error_wdt_timer1_timeout_intr_count_incr_r}}; + + assign hit_intr_brf_error_wdt_timer2_timeout_intr_count_incr_r = (soc_ifc_reg_req_data.addr == full_addr_intr_brf_error_wdt_timer2_timeout_intr_count_incr_r[APB_ADDR_WIDTH-1:0]); + assign bus_intr_brf_error_wdt_timer2_timeout_intr_count_incr_r = {uc_rd, uc_wr, soc_rd, soc_wr} & {4{hit_intr_brf_error_wdt_timer2_timeout_intr_count_incr_r}}; + + assign hit_intr_brf_notif_cmd_avail_intr_count_incr_r = (soc_ifc_reg_req_data.addr == full_addr_intr_brf_notif_cmd_avail_intr_count_incr_r[APB_ADDR_WIDTH-1:0]); + assign bus_intr_brf_notif_cmd_avail_intr_count_incr_r = {uc_rd, uc_wr, soc_rd, soc_wr} & {4{hit_intr_brf_notif_cmd_avail_intr_count_incr_r}}; + + assign hit_intr_brf_notif_mbox_ecc_cor_intr_count_incr_r = (soc_ifc_reg_req_data.addr == full_addr_intr_brf_notif_mbox_ecc_cor_intr_count_incr_r[APB_ADDR_WIDTH-1:0]); + assign bus_intr_brf_notif_mbox_ecc_cor_intr_count_incr_r = {uc_rd, uc_wr, soc_rd, soc_wr} & {4{hit_intr_brf_notif_mbox_ecc_cor_intr_count_incr_r}}; + + assign hit_intr_brf_notif_debug_locked_intr_count_incr_r = (soc_ifc_reg_req_data.addr == full_addr_intr_brf_notif_debug_locked_intr_count_incr_r[APB_ADDR_WIDTH-1:0]); + assign bus_intr_brf_notif_debug_locked_intr_count_incr_r = {uc_rd, uc_wr, soc_rd, soc_wr} & {4{hit_intr_brf_notif_debug_locked_intr_count_incr_r}}; + + assign hit_intr_brf_notif_soc_req_lock_intr_count_incr_r = (soc_ifc_reg_req_data.addr == full_addr_intr_brf_notif_soc_req_lock_intr_count_incr_r[APB_ADDR_WIDTH-1:0]); + assign bus_intr_brf_notif_soc_req_lock_intr_count_incr_r = {uc_rd, uc_wr, soc_rd, soc_wr} & {4{hit_intr_brf_notif_soc_req_lock_intr_count_incr_r}}; + + // ----------------------- COVERGROUP CPTRA_HW_ERROR_FATAL ----------------------- + covergroup soc_ifc_CPTRA_HW_ERROR_FATAL_cg (ref logic [3:0] bus_event) @(posedge clk); + CPTRA_HW_ERROR_FATAL_cp : coverpoint i_soc_ifc_reg.field_storage.CPTRA_HW_ERROR_FATAL; + bus_CPTRA_HW_ERROR_FATAL_cp : coverpoint bus_event { + bins wr_rd[] = (AHB_WR, APB_WR => IDLE [*1:1000] => AHB_RD, APB_RD); + ignore_bins dont_care = {IDLE, 4'hf, (APB_RD | APB_WR), (AHB_RD | AHB_WR)}; + } + endgroup + + // ----------------------- COVERGROUP CPTRA_HW_ERROR_NON_FATAL ----------------------- + covergroup soc_ifc_CPTRA_HW_ERROR_NON_FATAL_cg (ref logic [3:0] bus_event) @(posedge clk); + CPTRA_HW_ERROR_NON_FATAL_cp : coverpoint i_soc_ifc_reg.field_storage.CPTRA_HW_ERROR_NON_FATAL; + bus_CPTRA_HW_ERROR_NON_FATAL_cp : coverpoint bus_event { + bins wr_rd[] = (AHB_WR, APB_WR => IDLE [*1:1000] => AHB_RD, APB_RD); + ignore_bins dont_care = {IDLE, 4'hf, (APB_RD | APB_WR), (AHB_RD | AHB_WR)}; + } + endgroup + + // ----------------------- COVERGROUP CPTRA_FW_ERROR_FATAL ----------------------- + covergroup soc_ifc_CPTRA_FW_ERROR_FATAL_cg (ref logic [3:0] bus_event) @(posedge clk); + CPTRA_FW_ERROR_FATAL_cp : coverpoint i_soc_ifc_reg.field_storage.CPTRA_FW_ERROR_FATAL; + bus_CPTRA_FW_ERROR_FATAL_cp : coverpoint bus_event { + bins wr_rd[] = (AHB_WR, APB_WR => IDLE [*1:1000] => AHB_RD, APB_RD); + ignore_bins dont_care = {IDLE, 4'hf, (APB_RD | APB_WR), (AHB_RD | AHB_WR)}; + } + endgroup + + // ----------------------- COVERGROUP CPTRA_FW_ERROR_NON_FATAL ----------------------- + covergroup soc_ifc_CPTRA_FW_ERROR_NON_FATAL_cg (ref logic [3:0] bus_event) @(posedge clk); + CPTRA_FW_ERROR_NON_FATAL_cp : coverpoint i_soc_ifc_reg.field_storage.CPTRA_FW_ERROR_NON_FATAL; + bus_CPTRA_FW_ERROR_NON_FATAL_cp : coverpoint bus_event { + bins wr_rd[] = (AHB_WR, APB_WR => IDLE [*1:1000] => AHB_RD, APB_RD); + ignore_bins dont_care = {IDLE, 4'hf, (APB_RD | APB_WR), (AHB_RD | AHB_WR)}; + } + endgroup + + // ----------------------- COVERGROUP CPTRA_HW_ERROR_ENC ----------------------- + covergroup soc_ifc_CPTRA_HW_ERROR_ENC_cg (ref logic [3:0] bus_event) @(posedge clk); + CPTRA_HW_ERROR_ENC_cp : coverpoint i_soc_ifc_reg.field_storage.CPTRA_HW_ERROR_ENC; + bus_CPTRA_HW_ERROR_ENC_cp : coverpoint bus_event { + bins wr_rd[] = (AHB_WR, APB_WR => IDLE [*1:1000] => AHB_RD, APB_RD); + ignore_bins dont_care = {IDLE, 4'hf, (APB_RD | APB_WR), (AHB_RD | AHB_WR)}; + } + endgroup + + // ----------------------- COVERGROUP CPTRA_FW_ERROR_ENC ----------------------- + covergroup soc_ifc_CPTRA_FW_ERROR_ENC_cg (ref logic [3:0] bus_event) @(posedge clk); + CPTRA_FW_ERROR_ENC_cp : coverpoint i_soc_ifc_reg.field_storage.CPTRA_FW_ERROR_ENC; + bus_CPTRA_FW_ERROR_ENC_cp : coverpoint bus_event { + bins wr_rd[] = (AHB_WR, APB_WR => IDLE [*1:1000] => AHB_RD, APB_RD); + ignore_bins dont_care = {IDLE, 4'hf, (APB_RD | APB_WR), (AHB_RD | AHB_WR)}; + } + endgroup + + // ----------------------- COVERGROUP CPTRA_FW_EXTENDED_ERROR_INFO [0:7] ----------------------- + covergroup soc_ifc_CPTRA_FW_EXTENDED_ERROR_INFO_cg (ref logic [3:0] bus_event[0:7]) @(posedge clk); + CPTRA_FW_EXTENDED_ERROR_INFO0_cp : coverpoint i_soc_ifc_reg.field_storage.CPTRA_FW_EXTENDED_ERROR_INFO[0]; + bus_CPTRA_FW_EXTENDED_ERROR_INFO0_cp : coverpoint bus_event[0] { + bins wr_rd[] = (AHB_WR, APB_WR => IDLE [*1:1000] => AHB_RD, APB_RD); + ignore_bins dont_care = {IDLE, 4'hf, (APB_RD | APB_WR), (AHB_RD | AHB_WR)}; + } + CPTRA_FW_EXTENDED_ERROR_INFO1_cp : coverpoint i_soc_ifc_reg.field_storage.CPTRA_FW_EXTENDED_ERROR_INFO[1]; + bus_CPTRA_FW_EXTENDED_ERROR_INFO1_cp : coverpoint bus_event[1] { + bins wr_rd[] = (AHB_WR, APB_WR => IDLE [*1:1000] => AHB_RD, APB_RD); + ignore_bins dont_care = {IDLE, 4'hf, (APB_RD | APB_WR), (AHB_RD | AHB_WR)}; + } + CPTRA_FW_EXTENDED_ERROR_INFO2_cp : coverpoint i_soc_ifc_reg.field_storage.CPTRA_FW_EXTENDED_ERROR_INFO[2]; + bus_CPTRA_FW_EXTENDED_ERROR_INFO2_cp : coverpoint bus_event[2] { + bins wr_rd[] = (AHB_WR, APB_WR => IDLE [*1:1000] => AHB_RD, APB_RD); + ignore_bins dont_care = {IDLE, 4'hf, (APB_RD | APB_WR), (AHB_RD | AHB_WR)}; + } + CPTRA_FW_EXTENDED_ERROR_INFO3_cp : coverpoint i_soc_ifc_reg.field_storage.CPTRA_FW_EXTENDED_ERROR_INFO[3]; + bus_CPTRA_FW_EXTENDED_ERROR_INFO3_cp : coverpoint bus_event[3] { + bins wr_rd[] = (AHB_WR, APB_WR => IDLE [*1:1000] => AHB_RD, APB_RD); + ignore_bins dont_care = {IDLE, 4'hf, (APB_RD | APB_WR), (AHB_RD | AHB_WR)}; + } + CPTRA_FW_EXTENDED_ERROR_INFO4_cp : coverpoint i_soc_ifc_reg.field_storage.CPTRA_FW_EXTENDED_ERROR_INFO[4]; + bus_CPTRA_FW_EXTENDED_ERROR_INFO4_cp : coverpoint bus_event[4] { + bins wr_rd[] = (AHB_WR, APB_WR => IDLE [*1:1000] => AHB_RD, APB_RD); + ignore_bins dont_care = {IDLE, 4'hf, (APB_RD | APB_WR), (AHB_RD | AHB_WR)}; + } + CPTRA_FW_EXTENDED_ERROR_INFO5_cp : coverpoint i_soc_ifc_reg.field_storage.CPTRA_FW_EXTENDED_ERROR_INFO[5]; + bus_CPTRA_FW_EXTENDED_ERROR_INFO5_cp : coverpoint bus_event[5] { + bins wr_rd[] = (AHB_WR, APB_WR => IDLE [*1:1000] => AHB_RD, APB_RD); + ignore_bins dont_care = {IDLE, 4'hf, (APB_RD | APB_WR), (AHB_RD | AHB_WR)}; + } + CPTRA_FW_EXTENDED_ERROR_INFO6_cp : coverpoint i_soc_ifc_reg.field_storage.CPTRA_FW_EXTENDED_ERROR_INFO[6]; + bus_CPTRA_FW_EXTENDED_ERROR_INFO6_cp : coverpoint bus_event[6] { + bins wr_rd[] = (AHB_WR, APB_WR => IDLE [*1:1000] => AHB_RD, APB_RD); + ignore_bins dont_care = {IDLE, 4'hf, (APB_RD | APB_WR), (AHB_RD | AHB_WR)}; + } + CPTRA_FW_EXTENDED_ERROR_INFO7_cp : coverpoint i_soc_ifc_reg.field_storage.CPTRA_FW_EXTENDED_ERROR_INFO[7]; + bus_CPTRA_FW_EXTENDED_ERROR_INFO7_cp : coverpoint bus_event[7] { + bins wr_rd[] = (AHB_WR, APB_WR => IDLE [*1:1000] => AHB_RD, APB_RD); + ignore_bins dont_care = {IDLE, 4'hf, (APB_RD | APB_WR), (AHB_RD | AHB_WR)}; + } + endgroup + + // ----------------------- COVERGROUP CPTRA_BOOT_STATUS ----------------------- + covergroup soc_ifc_CPTRA_BOOT_STATUS_cg (ref logic [3:0] bus_event) @(posedge clk); + CPTRA_BOOT_STATUS_cp : coverpoint i_soc_ifc_reg.field_storage.CPTRA_BOOT_STATUS; + bus_CPTRA_BOOT_STATUS_cp : coverpoint bus_event { + bins wr_rd[] = (AHB_WR, APB_WR => IDLE [*1:1000] => AHB_RD, APB_RD); + ignore_bins dont_care = {IDLE, 4'hf, (APB_RD | APB_WR), (AHB_RD | AHB_WR)}; + } + endgroup + + // ----------------------- COVERGROUP CPTRA_FLOW_STATUS ----------------------- + covergroup soc_ifc_CPTRA_FLOW_STATUS_cg (ref logic [3:0] bus_event) @(posedge clk); + CPTRA_FLOW_STATUS_cp : coverpoint i_soc_ifc_reg.field_storage.CPTRA_FLOW_STATUS; + bus_CPTRA_FLOW_STATUS_cp : coverpoint bus_event { + bins wr_rd[] = (AHB_WR, APB_WR => IDLE [*1:1000] => AHB_RD, APB_RD); + ignore_bins dont_care = {IDLE, 4'hf, (APB_RD | APB_WR), (AHB_RD | AHB_WR)}; + } + endgroup + + // ----------------------- COVERGROUP CPTRA_RESET_REASON ----------------------- + covergroup soc_ifc_CPTRA_RESET_REASON_cg (ref logic [3:0] bus_event) @(posedge clk); + CPTRA_RESET_REASON_cp : coverpoint i_soc_ifc_reg.field_storage.CPTRA_RESET_REASON; + bus_CPTRA_RESET_REASON_cp : coverpoint bus_event { + bins wr_rd[] = (AHB_WR, APB_WR => IDLE [*1:1000] => AHB_RD, APB_RD); + ignore_bins dont_care = {IDLE, 4'hf, (APB_RD | APB_WR), (AHB_RD | AHB_WR)}; + } + endgroup + + // // ----------------------- COVERGROUP CPTRA_SECURITY_STATE ----------------------- + // covergroup soc_ifc_CPTRA_SECURITY_STATE_cg (ref logic [3:0] bus_event) @(posedge clk); + // CPTRA_SECURITY_STATE_cp : coverpoint i_soc_ifc_reg.field_storage.CPTRA_SECURITY_STATE; + // bus_CPTRA_SECURITY_STATE_cp : coverpoint bus_event { + // bins wr_rd[] = (AHB_WR, APB_WR => IDLE [*1:1000] => AHB_RD, APB_RD); + // ignore_bins dont_care = {IDLE, 4'hf, (APB_RD | APB_WR), (AHB_RD | AHB_WR)}; + // } + // endgroup + + // ----------------------- COVERGROUP CPTRA_MBOX_VALID_PAUSER [0:4] ----------------------- + covergroup soc_ifc_CPTRA_MBOX_VALID_PAUSER_cg (ref logic [3:0] bus_event[0:4]) @(posedge clk); + CPTRA_MBOX_VALID_PAUSER0_cp : coverpoint i_soc_ifc_reg.field_storage.CPTRA_MBOX_VALID_PAUSER[0]; + bus_CPTRA_MBOX_VALID_PAUSER0_cp : coverpoint bus_event[0] { + bins wr_rd[] = (AHB_WR, APB_WR => IDLE [*1:1000] => AHB_RD, APB_RD); + ignore_bins dont_care = {IDLE, 4'hf, (APB_RD | APB_WR), (AHB_RD | AHB_WR)}; + } + CPTRA_MBOX_VALID_PAUSER1_cp : coverpoint i_soc_ifc_reg.field_storage.CPTRA_MBOX_VALID_PAUSER[1]; + bus_CPTRA_MBOX_VALID_PAUSER1_cp : coverpoint bus_event[1] { + bins wr_rd[] = (AHB_WR, APB_WR => IDLE [*1:1000] => AHB_RD, APB_RD); + ignore_bins dont_care = {IDLE, 4'hf, (APB_RD | APB_WR), (AHB_RD | AHB_WR)}; + } + CPTRA_MBOX_VALID_PAUSER2_cp : coverpoint i_soc_ifc_reg.field_storage.CPTRA_MBOX_VALID_PAUSER[2]; + bus_CPTRA_MBOX_VALID_PAUSER2_cp : coverpoint bus_event[2] { + bins wr_rd[] = (AHB_WR, APB_WR => IDLE [*1:1000] => AHB_RD, APB_RD); + ignore_bins dont_care = {IDLE, 4'hf, (APB_RD | APB_WR), (AHB_RD | AHB_WR)}; + } + CPTRA_MBOX_VALID_PAUSER3_cp : coverpoint i_soc_ifc_reg.field_storage.CPTRA_MBOX_VALID_PAUSER[3]; + bus_CPTRA_MBOX_VALID_PAUSER3_cp : coverpoint bus_event[3] { + bins wr_rd[] = (AHB_WR, APB_WR => IDLE [*1:1000] => AHB_RD, APB_RD); + ignore_bins dont_care = {IDLE, 4'hf, (APB_RD | APB_WR), (AHB_RD | AHB_WR)}; + } + CPTRA_MBOX_VALID_PAUSER4_cp : coverpoint i_soc_ifc_reg.field_storage.CPTRA_MBOX_VALID_PAUSER[4]; + bus_CPTRA_MBOX_VALID_PAUSER4_cp : coverpoint bus_event[4] { + bins wr_rd[] = (AHB_WR, APB_WR => IDLE [*1:1000] => AHB_RD, APB_RD); + ignore_bins dont_care = {IDLE, 4'hf, (APB_RD | APB_WR), (AHB_RD | AHB_WR)}; + } + endgroup + + // ----------------------- COVERGROUP CPTRA_MBOX_PAUSER_LOCK [0:4] ----------------------- + covergroup soc_ifc_CPTRA_MBOX_PAUSER_LOCK_cg (ref logic [3:0] bus_event[0:4]) @(posedge clk); + CPTRA_MBOX_PAUSER_LOCK0_cp : coverpoint i_soc_ifc_reg.field_storage.CPTRA_MBOX_PAUSER_LOCK[0]; + bus_CPTRA_MBOX_PAUSER_LOCK0_cp : coverpoint bus_event[0] { + bins wr_rd[] = (AHB_WR, APB_WR => IDLE [*1:1000] => AHB_RD, APB_RD); + ignore_bins dont_care = {IDLE, 4'hf, (APB_RD | APB_WR), (AHB_RD | AHB_WR)}; + } + CPTRA_MBOX_PAUSER_LOCK1_cp : coverpoint i_soc_ifc_reg.field_storage.CPTRA_MBOX_PAUSER_LOCK[1]; + bus_CPTRA_MBOX_PAUSER_LOCK1_cp : coverpoint bus_event[1] { + bins wr_rd[] = (AHB_WR, APB_WR => IDLE [*1:1000] => AHB_RD, APB_RD); + ignore_bins dont_care = {IDLE, 4'hf, (APB_RD | APB_WR), (AHB_RD | AHB_WR)}; + } + CPTRA_MBOX_PAUSER_LOCK2_cp : coverpoint i_soc_ifc_reg.field_storage.CPTRA_MBOX_PAUSER_LOCK[2]; + bus_CPTRA_MBOX_PAUSER_LOCK2_cp : coverpoint bus_event[2] { + bins wr_rd[] = (AHB_WR, APB_WR => IDLE [*1:1000] => AHB_RD, APB_RD); + ignore_bins dont_care = {IDLE, 4'hf, (APB_RD | APB_WR), (AHB_RD | AHB_WR)}; + } + CPTRA_MBOX_PAUSER_LOCK3_cp : coverpoint i_soc_ifc_reg.field_storage.CPTRA_MBOX_PAUSER_LOCK[3]; + bus_CPTRA_MBOX_PAUSER_LOCK3_cp : coverpoint bus_event[3] { + bins wr_rd[] = (AHB_WR, APB_WR => IDLE [*1:1000] => AHB_RD, APB_RD); + ignore_bins dont_care = {IDLE, 4'hf, (APB_RD | APB_WR), (AHB_RD | AHB_WR)}; + } + CPTRA_MBOX_PAUSER_LOCK4_cp : coverpoint i_soc_ifc_reg.field_storage.CPTRA_MBOX_PAUSER_LOCK[4]; + bus_CPTRA_MBOX_PAUSER_LOCK4_cp : coverpoint bus_event[4] { + bins wr_rd[] = (AHB_WR, APB_WR => IDLE [*1:1000] => AHB_RD, APB_RD); + ignore_bins dont_care = {IDLE, 4'hf, (APB_RD | APB_WR), (AHB_RD | AHB_WR)}; + } + endgroup + + // ----------------------- COVERGROUP CPTRA_TRNG_VALID_PAUSER ----------------------- + covergroup soc_ifc_CPTRA_TRNG_VALID_PAUSER_cg (ref logic [3:0] bus_event) @(posedge clk); + CPTRA_TRNG_VALID_PAUSER_cp : coverpoint i_soc_ifc_reg.field_storage.CPTRA_TRNG_VALID_PAUSER; + bus_CPTRA_TRNG_VALID_PAUSER_cp : coverpoint bus_event { + bins wr_rd[] = (AHB_WR, APB_WR => IDLE [*1:1000] => AHB_RD, APB_RD); + ignore_bins dont_care = {IDLE, 4'hf, (APB_RD | APB_WR), (AHB_RD | AHB_WR)}; + } + endgroup + + // ----------------------- COVERGROUP CPTRA_TRNG_PAUSER_LOCK ----------------------- + covergroup soc_ifc_CPTRA_TRNG_PAUSER_LOCK_cg (ref logic [3:0] bus_event) @(posedge clk); + CPTRA_TRNG_PAUSER_LOCK_cp : coverpoint i_soc_ifc_reg.field_storage.CPTRA_TRNG_PAUSER_LOCK; + bus_CPTRA_TRNG_PAUSER_LOCK_cp : coverpoint bus_event { + bins wr_rd[] = (AHB_WR, APB_WR => IDLE [*1:1000] => AHB_RD, APB_RD); + ignore_bins dont_care = {IDLE, 4'hf, (APB_RD | APB_WR), (AHB_RD | AHB_WR)}; + } + endgroup + + // ----------------------- COVERGROUP CPTRA_TRNG_DATA [0:11] ----------------------- + covergroup soc_ifc_CPTRA_TRNG_DATA_cg (ref logic [3:0] bus_event[0:11]) @(posedge clk); + CPTRA_TRNG_DATA0_cp : coverpoint i_soc_ifc_reg.field_storage.CPTRA_TRNG_DATA[0]; + bus_CPTRA_TRNG_DATA0_cp : coverpoint bus_event[0] { + bins wr_rd[] = (AHB_WR, APB_WR => IDLE [*1:1000] => AHB_RD, APB_RD); + ignore_bins dont_care = {IDLE, 4'hf, (APB_RD | APB_WR), (AHB_RD | AHB_WR)}; + } + CPTRA_TRNG_DATA1_cp : coverpoint i_soc_ifc_reg.field_storage.CPTRA_TRNG_DATA[1]; + bus_CPTRA_TRNG_DATA1_cp : coverpoint bus_event[1] { + bins wr_rd[] = (AHB_WR, APB_WR => IDLE [*1:1000] => AHB_RD, APB_RD); + ignore_bins dont_care = {IDLE, 4'hf, (APB_RD | APB_WR), (AHB_RD | AHB_WR)}; + } + CPTRA_TRNG_DATA2_cp : coverpoint i_soc_ifc_reg.field_storage.CPTRA_TRNG_DATA[2]; + bus_CPTRA_TRNG_DATA2_cp : coverpoint bus_event[2] { + bins wr_rd[] = (AHB_WR, APB_WR => IDLE [*1:1000] => AHB_RD, APB_RD); + ignore_bins dont_care = {IDLE, 4'hf, (APB_RD | APB_WR), (AHB_RD | AHB_WR)}; + } + CPTRA_TRNG_DATA3_cp : coverpoint i_soc_ifc_reg.field_storage.CPTRA_TRNG_DATA[3]; + bus_CPTRA_TRNG_DATA3_cp : coverpoint bus_event[3] { + bins wr_rd[] = (AHB_WR, APB_WR => IDLE [*1:1000] => AHB_RD, APB_RD); + ignore_bins dont_care = {IDLE, 4'hf, (APB_RD | APB_WR), (AHB_RD | AHB_WR)}; + } + CPTRA_TRNG_DATA4_cp : coverpoint i_soc_ifc_reg.field_storage.CPTRA_TRNG_DATA[4]; + bus_CPTRA_TRNG_DATA4_cp : coverpoint bus_event[4] { + bins wr_rd[] = (AHB_WR, APB_WR => IDLE [*1:1000] => AHB_RD, APB_RD); + ignore_bins dont_care = {IDLE, 4'hf, (APB_RD | APB_WR), (AHB_RD | AHB_WR)}; + } + CPTRA_TRNG_DATA5_cp : coverpoint i_soc_ifc_reg.field_storage.CPTRA_TRNG_DATA[5]; + bus_CPTRA_TRNG_DATA5_cp : coverpoint bus_event[5] { + bins wr_rd[] = (AHB_WR, APB_WR => IDLE [*1:1000] => AHB_RD, APB_RD); + ignore_bins dont_care = {IDLE, 4'hf, (APB_RD | APB_WR), (AHB_RD | AHB_WR)}; + } + CPTRA_TRNG_DATA6_cp : coverpoint i_soc_ifc_reg.field_storage.CPTRA_TRNG_DATA[6]; + bus_CPTRA_TRNG_DATA6_cp : coverpoint bus_event[6] { + bins wr_rd[] = (AHB_WR, APB_WR => IDLE [*1:1000] => AHB_RD, APB_RD); + ignore_bins dont_care = {IDLE, 4'hf, (APB_RD | APB_WR), (AHB_RD | AHB_WR)}; + } + CPTRA_TRNG_DATA7_cp : coverpoint i_soc_ifc_reg.field_storage.CPTRA_TRNG_DATA[7]; + bus_CPTRA_TRNG_DATA7_cp : coverpoint bus_event[7] { + bins wr_rd[] = (AHB_WR, APB_WR => IDLE [*1:1000] => AHB_RD, APB_RD); + ignore_bins dont_care = {IDLE, 4'hf, (APB_RD | APB_WR), (AHB_RD | AHB_WR)}; + } + CPTRA_TRNG_DATA8_cp : coverpoint i_soc_ifc_reg.field_storage.CPTRA_TRNG_DATA[8]; + bus_CPTRA_TRNG_DATA8_cp : coverpoint bus_event[8] { + bins wr_rd[] = (AHB_WR, APB_WR => IDLE [*1:1000] => AHB_RD, APB_RD); + ignore_bins dont_care = {IDLE, 4'hf, (APB_RD | APB_WR), (AHB_RD | AHB_WR)}; + } + CPTRA_TRNG_DATA9_cp : coverpoint i_soc_ifc_reg.field_storage.CPTRA_TRNG_DATA[9]; + bus_CPTRA_TRNG_DATA9_cp : coverpoint bus_event[9] { + bins wr_rd[] = (AHB_WR, APB_WR => IDLE [*1:1000] => AHB_RD, APB_RD); + ignore_bins dont_care = {IDLE, 4'hf, (APB_RD | APB_WR), (AHB_RD | AHB_WR)}; + } + CPTRA_TRNG_DATA10_cp : coverpoint i_soc_ifc_reg.field_storage.CPTRA_TRNG_DATA[10]; + bus_CPTRA_TRNG_DATA10_cp : coverpoint bus_event[10] { + bins wr_rd[] = (AHB_WR, APB_WR => IDLE [*1:1000] => AHB_RD, APB_RD); + ignore_bins dont_care = {IDLE, 4'hf, (APB_RD | APB_WR), (AHB_RD | AHB_WR)}; + } + CPTRA_TRNG_DATA11_cp : coverpoint i_soc_ifc_reg.field_storage.CPTRA_TRNG_DATA[11]; + bus_CPTRA_TRNG_DATA11_cp : coverpoint bus_event[11] { + bins wr_rd[] = (AHB_WR, APB_WR => IDLE [*1:1000] => AHB_RD, APB_RD); + ignore_bins dont_care = {IDLE, 4'hf, (APB_RD | APB_WR), (AHB_RD | AHB_WR)}; + } + endgroup + + // ----------------------- COVERGROUP CPTRA_TRNG_CTRL ----------------------- + covergroup soc_ifc_CPTRA_TRNG_CTRL_cg (ref logic [3:0] bus_event) @(posedge clk); + CPTRA_TRNG_CTRL_cp : coverpoint i_soc_ifc_reg.field_storage.CPTRA_TRNG_CTRL; + bus_CPTRA_TRNG_CTRL_cp : coverpoint bus_event { + bins wr_rd[] = (AHB_WR, APB_WR => IDLE [*1:1000] => AHB_RD, APB_RD); + ignore_bins dont_care = {IDLE, 4'hf, (APB_RD | APB_WR), (AHB_RD | AHB_WR)}; + } + endgroup + + // ----------------------- COVERGROUP CPTRA_TRNG_STATUS ----------------------- + covergroup soc_ifc_CPTRA_TRNG_STATUS_cg (ref logic [3:0] bus_event) @(posedge clk); + CPTRA_TRNG_STATUS_cp : coverpoint i_soc_ifc_reg.field_storage.CPTRA_TRNG_STATUS; + bus_CPTRA_TRNG_STATUS_cp : coverpoint bus_event { + bins wr_rd[] = (AHB_WR, APB_WR => IDLE [*1:1000] => AHB_RD, APB_RD); + ignore_bins dont_care = {IDLE, 4'hf, (APB_RD | APB_WR), (AHB_RD | AHB_WR)}; + } + endgroup + + // ----------------------- COVERGROUP CPTRA_FUSE_WR_DONE ----------------------- + covergroup soc_ifc_CPTRA_FUSE_WR_DONE_cg (ref logic [3:0] bus_event) @(posedge clk); + CPTRA_FUSE_WR_DONE_cp : coverpoint i_soc_ifc_reg.field_storage.CPTRA_FUSE_WR_DONE; + bus_CPTRA_FUSE_WR_DONE_cp : coverpoint bus_event { + bins wr_rd[] = (AHB_WR, APB_WR => IDLE [*1:1000] => AHB_RD, APB_RD); + ignore_bins dont_care = {IDLE, 4'hf, (APB_RD | APB_WR), (AHB_RD | AHB_WR)}; + } + endgroup + + // ----------------------- COVERGROUP CPTRA_TIMER_CONFIG ----------------------- + covergroup soc_ifc_CPTRA_TIMER_CONFIG_cg (ref logic [3:0] bus_event) @(posedge clk); + CPTRA_TIMER_CONFIG_cp : coverpoint i_soc_ifc_reg.field_storage.CPTRA_TIMER_CONFIG; + bus_CPTRA_TIMER_CONFIG_cp : coverpoint bus_event { + bins wr_rd[] = (AHB_WR, APB_WR => IDLE [*1:1000] => AHB_RD, APB_RD); + ignore_bins dont_care = {IDLE, 4'hf, (APB_RD | APB_WR), (AHB_RD | AHB_WR)}; + } + endgroup + + // ----------------------- COVERGROUP CPTRA_BOOTFSM_GO ----------------------- + covergroup soc_ifc_CPTRA_BOOTFSM_GO_cg (ref logic [3:0] bus_event) @(posedge clk); + CPTRA_BOOTFSM_GO_cp : coverpoint i_soc_ifc_reg.field_storage.CPTRA_BOOTFSM_GO; + bus_CPTRA_BOOTFSM_GO_cp : coverpoint bus_event { + bins wr_rd[] = (AHB_WR, APB_WR => IDLE [*1:1000] => AHB_RD, APB_RD); + ignore_bins dont_care = {IDLE, 4'hf, (APB_RD | APB_WR), (AHB_RD | AHB_WR)}; + } + endgroup + + // ----------------------- COVERGROUP CPTRA_DBG_MANUF_SERVICE_REG ----------------------- + covergroup soc_ifc_CPTRA_DBG_MANUF_SERVICE_REG_cg (ref logic [3:0] bus_event) @(posedge clk); + CPTRA_DBG_MANUF_SERVICE_REG_cp : coverpoint i_soc_ifc_reg.field_storage.CPTRA_DBG_MANUF_SERVICE_REG; + bus_CPTRA_DBG_MANUF_SERVICE_REG_cp : coverpoint bus_event { + bins wr_rd[] = (AHB_WR, APB_WR => IDLE [*1:1000] => AHB_RD, APB_RD); + ignore_bins dont_care = {IDLE, 4'hf, (APB_RD | APB_WR), (AHB_RD | AHB_WR)}; + } + endgroup + + // ----------------------- COVERGROUP CPTRA_CLK_GATING_EN ----------------------- + covergroup soc_ifc_CPTRA_CLK_GATING_EN_cg (ref logic [3:0] bus_event) @(posedge clk); + CPTRA_CLK_GATING_EN_cp : coverpoint i_soc_ifc_reg.field_storage.CPTRA_CLK_GATING_EN; + bus_CPTRA_CLK_GATING_EN_cp : coverpoint bus_event { + bins wr_rd[] = (AHB_WR, APB_WR => IDLE [*1:1000] => AHB_RD, APB_RD); + ignore_bins dont_care = {IDLE, 4'hf, (APB_RD | APB_WR), (AHB_RD | AHB_WR)}; + } + endgroup + + // ----------------------- COVERGROUP CPTRA_GENERIC_INPUT_WIRES [0:1] ----------------------- + covergroup soc_ifc_CPTRA_GENERIC_INPUT_WIRES_cg (ref logic [3:0] bus_event[0:1]) @(posedge clk); + CPTRA_GENERIC_INPUT_WIRES0_cp : coverpoint i_soc_ifc_reg.field_storage.CPTRA_GENERIC_INPUT_WIRES[0]; + bus_CPTRA_GENERIC_INPUT_WIRES0_cp : coverpoint bus_event[0] { + bins wr_rd[] = (AHB_WR, APB_WR => IDLE [*1:1000] => AHB_RD, APB_RD); + ignore_bins dont_care = {IDLE, 4'hf, (APB_RD | APB_WR), (AHB_RD | AHB_WR)}; + } + CPTRA_GENERIC_INPUT_WIRES1_cp : coverpoint i_soc_ifc_reg.field_storage.CPTRA_GENERIC_INPUT_WIRES[1]; + bus_CPTRA_GENERIC_INPUT_WIRES1_cp : coverpoint bus_event[1] { + bins wr_rd[] = (AHB_WR, APB_WR => IDLE [*1:1000] => AHB_RD, APB_RD); + ignore_bins dont_care = {IDLE, 4'hf, (APB_RD | APB_WR), (AHB_RD | AHB_WR)}; + } + endgroup + + // ----------------------- COVERGROUP CPTRA_GENERIC_OUTPUT_WIRES [0:1] ----------------------- + covergroup soc_ifc_CPTRA_GENERIC_OUTPUT_WIRES_cg (ref logic [3:0] bus_event[0:1]) @(posedge clk); + CPTRA_GENERIC_OUTPUT_WIRES0_cp : coverpoint i_soc_ifc_reg.field_storage.CPTRA_GENERIC_OUTPUT_WIRES[0]; + bus_CPTRA_GENERIC_OUTPUT_WIRES0_cp : coverpoint bus_event[0] { + bins wr_rd[] = (AHB_WR, APB_WR => IDLE [*1:1000] => AHB_RD, APB_RD); + ignore_bins dont_care = {IDLE, 4'hf, (APB_RD | APB_WR), (AHB_RD | AHB_WR)}; + } + CPTRA_GENERIC_OUTPUT_WIRES1_cp : coverpoint i_soc_ifc_reg.field_storage.CPTRA_GENERIC_OUTPUT_WIRES[1]; + bus_CPTRA_GENERIC_OUTPUT_WIRES1_cp : coverpoint bus_event[1] { + bins wr_rd[] = (AHB_WR, APB_WR => IDLE [*1:1000] => AHB_RD, APB_RD); + ignore_bins dont_care = {IDLE, 4'hf, (APB_RD | APB_WR), (AHB_RD | AHB_WR)}; + } + endgroup + + // // ----------------------- COVERGROUP CPTRA_HW_REV_ID ----------------------- + // covergroup soc_ifc_CPTRA_HW_REV_ID_cg (ref logic [3:0] bus_event) @(posedge clk); + // CPTRA_HW_REV_ID_cp : coverpoint i_soc_ifc_reg.field_storage.CPTRA_HW_REV_ID; + // bus_CPTRA_HW_REV_ID_cp : coverpoint bus_event { + // bins wr_rd[] = (AHB_WR, APB_WR => IDLE [*1:1000] => AHB_RD, APB_RD); + // ignore_bins dont_care = {IDLE, 4'hf, (APB_RD | APB_WR), (AHB_RD | AHB_WR)}; + // } + // endgroup + + // ----------------------- COVERGROUP CPTRA_FW_REV_ID [0:1] ----------------------- + covergroup soc_ifc_CPTRA_FW_REV_ID_cg (ref logic [3:0] bus_event[0:1]) @(posedge clk); + CPTRA_FW_REV_ID0_cp : coverpoint i_soc_ifc_reg.field_storage.CPTRA_FW_REV_ID[0]; + bus_CPTRA_FW_REV_ID0_cp : coverpoint bus_event[0] { + bins wr_rd[] = (AHB_WR, APB_WR => IDLE [*1:1000] => AHB_RD, APB_RD); + ignore_bins dont_care = {IDLE, 4'hf, (APB_RD | APB_WR), (AHB_RD | AHB_WR)}; + } + CPTRA_FW_REV_ID1_cp : coverpoint i_soc_ifc_reg.field_storage.CPTRA_FW_REV_ID[1]; + bus_CPTRA_FW_REV_ID1_cp : coverpoint bus_event[1] { + bins wr_rd[] = (AHB_WR, APB_WR => IDLE [*1:1000] => AHB_RD, APB_RD); + ignore_bins dont_care = {IDLE, 4'hf, (APB_RD | APB_WR), (AHB_RD | AHB_WR)}; + } + endgroup + + // // ----------------------- COVERGROUP CPTRA_HW_CONFIG ----------------------- + // covergroup soc_ifc_CPTRA_HW_CONFIG_cg (ref logic [3:0] bus_event) @(posedge clk); + // CPTRA_HW_CONFIG_cp : coverpoint i_soc_ifc_reg.field_storage.CPTRA_HW_CONFIG; + // bus_CPTRA_HW_CONFIG_cp : coverpoint bus_event { + // bins wr_rd[] = (AHB_WR, APB_WR => IDLE [*1:1000] => AHB_RD, APB_RD); + // ignore_bins dont_care = {IDLE, 4'hf, (APB_RD | APB_WR), (AHB_RD | AHB_WR)}; + // } + // endgroup + + // ----------------------- COVERGROUP CPTRA_WDT_TIMER1_EN ----------------------- + covergroup soc_ifc_CPTRA_WDT_TIMER1_EN_cg (ref logic [3:0] bus_event) @(posedge clk); + CPTRA_WDT_TIMER1_EN_cp : coverpoint i_soc_ifc_reg.field_storage.CPTRA_WDT_TIMER1_EN; + bus_CPTRA_WDT_TIMER1_EN_cp : coverpoint bus_event { + bins wr_rd[] = (AHB_WR, APB_WR => IDLE [*1:1000] => AHB_RD, APB_RD); + ignore_bins dont_care = {IDLE, 4'hf, (APB_RD | APB_WR), (AHB_RD | AHB_WR)}; + } + endgroup + + // ----------------------- COVERGROUP CPTRA_WDT_TIMER1_CTRL ----------------------- + covergroup soc_ifc_CPTRA_WDT_TIMER1_CTRL_cg (ref logic [3:0] bus_event) @(posedge clk); + CPTRA_WDT_TIMER1_CTRL_cp : coverpoint i_soc_ifc_reg.field_storage.CPTRA_WDT_TIMER1_CTRL; + bus_CPTRA_WDT_TIMER1_CTRL_cp : coverpoint bus_event { + bins wr_rd[] = (AHB_WR, APB_WR => IDLE [*1:1000] => AHB_RD, APB_RD); + ignore_bins dont_care = {IDLE, 4'hf, (APB_RD | APB_WR), (AHB_RD | AHB_WR)}; + } + endgroup + + // ----------------------- COVERGROUP CPTRA_WDT_TIMER1_TIMEOUT_PERIOD [0:1] ----------------------- + covergroup soc_ifc_CPTRA_WDT_TIMER1_TIMEOUT_PERIOD_cg (ref logic [3:0] bus_event[0:1]) @(posedge clk); + CPTRA_WDT_TIMER1_TIMEOUT_PERIOD0_cp : coverpoint i_soc_ifc_reg.field_storage.CPTRA_WDT_TIMER1_TIMEOUT_PERIOD[0]; + bus_CPTRA_WDT_TIMER1_TIMEOUT_PERIOD0_cp : coverpoint bus_event[0] { + bins wr_rd[] = (AHB_WR, APB_WR => IDLE [*1:1000] => AHB_RD, APB_RD); + ignore_bins dont_care = {IDLE, 4'hf, (APB_RD | APB_WR), (AHB_RD | AHB_WR)}; + } + CPTRA_WDT_TIMER1_TIMEOUT_PERIOD1_cp : coverpoint i_soc_ifc_reg.field_storage.CPTRA_WDT_TIMER1_TIMEOUT_PERIOD[1]; + bus_CPTRA_WDT_TIMER1_TIMEOUT_PERIOD1_cp : coverpoint bus_event[1] { + bins wr_rd[] = (AHB_WR, APB_WR => IDLE [*1:1000] => AHB_RD, APB_RD); + ignore_bins dont_care = {IDLE, 4'hf, (APB_RD | APB_WR), (AHB_RD | AHB_WR)}; + } + endgroup + + // ----------------------- COVERGROUP CPTRA_WDT_TIMER2_EN ----------------------- + covergroup soc_ifc_CPTRA_WDT_TIMER2_EN_cg (ref logic [3:0] bus_event) @(posedge clk); + CPTRA_WDT_TIMER2_EN_cp : coverpoint i_soc_ifc_reg.field_storage.CPTRA_WDT_TIMER2_EN; + bus_CPTRA_WDT_TIMER2_EN_cp : coverpoint bus_event { + bins wr_rd[] = (AHB_WR, APB_WR => IDLE [*1:1000] => AHB_RD, APB_RD); + ignore_bins dont_care = {IDLE, 4'hf, (APB_RD | APB_WR), (AHB_RD | AHB_WR)}; + } + endgroup + + // ----------------------- COVERGROUP CPTRA_WDT_TIMER2_CTRL ----------------------- + covergroup soc_ifc_CPTRA_WDT_TIMER2_CTRL_cg (ref logic [3:0] bus_event) @(posedge clk); + CPTRA_WDT_TIMER2_CTRL_cp : coverpoint i_soc_ifc_reg.field_storage.CPTRA_WDT_TIMER2_CTRL; + bus_CPTRA_WDT_TIMER2_CTRL_cp : coverpoint bus_event { + bins wr_rd[] = (AHB_WR, APB_WR => IDLE [*1:1000] => AHB_RD, APB_RD); + ignore_bins dont_care = {IDLE, 4'hf, (APB_RD | APB_WR), (AHB_RD | AHB_WR)}; + } + endgroup + + // ----------------------- COVERGROUP CPTRA_WDT_TIMER2_TIMEOUT_PERIOD [0:1] ----------------------- + covergroup soc_ifc_CPTRA_WDT_TIMER2_TIMEOUT_PERIOD_cg (ref logic [3:0] bus_event[0:1]) @(posedge clk); + CPTRA_WDT_TIMER2_TIMEOUT_PERIOD0_cp : coverpoint i_soc_ifc_reg.field_storage.CPTRA_WDT_TIMER2_TIMEOUT_PERIOD[0]; + bus_CPTRA_WDT_TIMER2_TIMEOUT_PERIOD0_cp : coverpoint bus_event[0] { + bins wr_rd[] = (AHB_WR, APB_WR => IDLE [*1:1000] => AHB_RD, APB_RD); + ignore_bins dont_care = {IDLE, 4'hf, (APB_RD | APB_WR), (AHB_RD | AHB_WR)}; + } + CPTRA_WDT_TIMER2_TIMEOUT_PERIOD1_cp : coverpoint i_soc_ifc_reg.field_storage.CPTRA_WDT_TIMER2_TIMEOUT_PERIOD[1]; + bus_CPTRA_WDT_TIMER2_TIMEOUT_PERIOD1_cp : coverpoint bus_event[1] { + bins wr_rd[] = (AHB_WR, APB_WR => IDLE [*1:1000] => AHB_RD, APB_RD); + ignore_bins dont_care = {IDLE, 4'hf, (APB_RD | APB_WR), (AHB_RD | AHB_WR)}; + } + endgroup + + // ----------------------- COVERGROUP CPTRA_WDT_STATUS ----------------------- + covergroup soc_ifc_CPTRA_WDT_STATUS_cg (ref logic [3:0] bus_event) @(posedge clk); + CPTRA_WDT_STATUS_cp : coverpoint i_soc_ifc_reg.field_storage.CPTRA_WDT_STATUS; + bus_CPTRA_WDT_STATUS_cp : coverpoint bus_event { + bins wr_rd[] = (AHB_WR, APB_WR => IDLE [*1:1000] => AHB_RD, APB_RD); + ignore_bins dont_care = {IDLE, 4'hf, (APB_RD | APB_WR), (AHB_RD | AHB_WR)}; + } + endgroup + + // ----------------------- COVERGROUP CPTRA_FUSE_VALID_PAUSER ----------------------- + covergroup soc_ifc_CPTRA_FUSE_VALID_PAUSER_cg (ref logic [3:0] bus_event) @(posedge clk); + CPTRA_FUSE_VALID_PAUSER_cp : coverpoint i_soc_ifc_reg.field_storage.CPTRA_FUSE_VALID_PAUSER; + bus_CPTRA_FUSE_VALID_PAUSER_cp : coverpoint bus_event { + bins wr_rd[] = (AHB_WR, APB_WR => IDLE [*1:1000] => AHB_RD, APB_RD); + ignore_bins dont_care = {IDLE, 4'hf, (APB_RD | APB_WR), (AHB_RD | AHB_WR)}; + } + endgroup + + // ----------------------- COVERGROUP CPTRA_FUSE_PAUSER_LOCK ----------------------- + covergroup soc_ifc_CPTRA_FUSE_PAUSER_LOCK_cg (ref logic [3:0] bus_event) @(posedge clk); + CPTRA_FUSE_PAUSER_LOCK_cp : coverpoint i_soc_ifc_reg.field_storage.CPTRA_FUSE_PAUSER_LOCK; + bus_CPTRA_FUSE_PAUSER_LOCK_cp : coverpoint bus_event { + bins wr_rd[] = (AHB_WR, APB_WR => IDLE [*1:1000] => AHB_RD, APB_RD); + ignore_bins dont_care = {IDLE, 4'hf, (APB_RD | APB_WR), (AHB_RD | AHB_WR)}; + } + endgroup + + // ----------------------- COVERGROUP CPTRA_WDT_CFG [0:1] ----------------------- + covergroup soc_ifc_CPTRA_WDT_CFG_cg (ref logic [3:0] bus_event[0:1]) @(posedge clk); + CPTRA_WDT_CFG0_cp : coverpoint i_soc_ifc_reg.field_storage.CPTRA_WDT_CFG[0]; + bus_CPTRA_WDT_CFG0_cp : coverpoint bus_event[0] { + bins wr_rd[] = (AHB_WR, APB_WR => IDLE [*1:1000] => AHB_RD, APB_RD); + ignore_bins dont_care = {IDLE, 4'hf, (APB_RD | APB_WR), (AHB_RD | AHB_WR)}; + } + CPTRA_WDT_CFG1_cp : coverpoint i_soc_ifc_reg.field_storage.CPTRA_WDT_CFG[1]; + bus_CPTRA_WDT_CFG1_cp : coverpoint bus_event[1] { + bins wr_rd[] = (AHB_WR, APB_WR => IDLE [*1:1000] => AHB_RD, APB_RD); + ignore_bins dont_care = {IDLE, 4'hf, (APB_RD | APB_WR), (AHB_RD | AHB_WR)}; + } + endgroup + + // ----------------------- COVERGROUP CPTRA_iTRNG_ENTROPY_CONFIG_0 ----------------------- + covergroup soc_ifc_CPTRA_iTRNG_ENTROPY_CONFIG_0_cg (ref logic [3:0] bus_event) @(posedge clk); + CPTRA_iTRNG_ENTROPY_CONFIG_0_cp : coverpoint i_soc_ifc_reg.field_storage.CPTRA_iTRNG_ENTROPY_CONFIG_0; + bus_CPTRA_iTRNG_ENTROPY_CONFIG_0_cp : coverpoint bus_event { + bins wr_rd[] = (AHB_WR, APB_WR => IDLE [*1:1000] => AHB_RD, APB_RD); + ignore_bins dont_care = {IDLE, 4'hf, (APB_RD | APB_WR), (AHB_RD | AHB_WR)}; + } + endgroup + + // ----------------------- COVERGROUP CPTRA_iTRNG_ENTROPY_CONFIG_1 ----------------------- + covergroup soc_ifc_CPTRA_iTRNG_ENTROPY_CONFIG_1_cg (ref logic [3:0] bus_event) @(posedge clk); + CPTRA_iTRNG_ENTROPY_CONFIG_1_cp : coverpoint i_soc_ifc_reg.field_storage.CPTRA_iTRNG_ENTROPY_CONFIG_1; + bus_CPTRA_iTRNG_ENTROPY_CONFIG_1_cp : coverpoint bus_event { + bins wr_rd[] = (AHB_WR, APB_WR => IDLE [*1:1000] => AHB_RD, APB_RD); + ignore_bins dont_care = {IDLE, 4'hf, (APB_RD | APB_WR), (AHB_RD | AHB_WR)}; + } + endgroup + + // ----------------------- COVERGROUP CPTRA_RSVD_REG [0:1] ----------------------- + covergroup soc_ifc_CPTRA_RSVD_REG_cg (ref logic [3:0] bus_event[0:1]) @(posedge clk); + CPTRA_RSVD_REG0_cp : coverpoint i_soc_ifc_reg.field_storage.CPTRA_RSVD_REG[0]; + bus_CPTRA_RSVD_REG0_cp : coverpoint bus_event[0] { + bins wr_rd[] = (AHB_WR, APB_WR => IDLE [*1:1000] => AHB_RD, APB_RD); + ignore_bins dont_care = {IDLE, 4'hf, (APB_RD | APB_WR), (AHB_RD | AHB_WR)}; + } + CPTRA_RSVD_REG1_cp : coverpoint i_soc_ifc_reg.field_storage.CPTRA_RSVD_REG[1]; + bus_CPTRA_RSVD_REG1_cp : coverpoint bus_event[1] { + bins wr_rd[] = (AHB_WR, APB_WR => IDLE [*1:1000] => AHB_RD, APB_RD); + ignore_bins dont_care = {IDLE, 4'hf, (APB_RD | APB_WR), (AHB_RD | AHB_WR)}; + } + endgroup + + // ----------------------- COVERGROUP fuse_uds_seed [0:11] ----------------------- + covergroup soc_ifc_fuse_uds_seed_cg (ref logic [3:0] bus_event[0:11]) @(posedge clk); + fuse_uds_seed0_cp : coverpoint i_soc_ifc_reg.field_storage.fuse_uds_seed[0]; + bus_fuse_uds_seed0_cp : coverpoint bus_event[0] { + bins wr_rd[] = (AHB_WR, APB_WR => IDLE [*1:1000] => AHB_RD, APB_RD); + ignore_bins dont_care = {IDLE, 4'hf, (APB_RD | APB_WR), (AHB_RD | AHB_WR)}; + } + fuse_uds_seed1_cp : coverpoint i_soc_ifc_reg.field_storage.fuse_uds_seed[1]; + bus_fuse_uds_seed1_cp : coverpoint bus_event[1] { + bins wr_rd[] = (AHB_WR, APB_WR => IDLE [*1:1000] => AHB_RD, APB_RD); + ignore_bins dont_care = {IDLE, 4'hf, (APB_RD | APB_WR), (AHB_RD | AHB_WR)}; + } + fuse_uds_seed2_cp : coverpoint i_soc_ifc_reg.field_storage.fuse_uds_seed[2]; + bus_fuse_uds_seed2_cp : coverpoint bus_event[2] { + bins wr_rd[] = (AHB_WR, APB_WR => IDLE [*1:1000] => AHB_RD, APB_RD); + ignore_bins dont_care = {IDLE, 4'hf, (APB_RD | APB_WR), (AHB_RD | AHB_WR)}; + } + fuse_uds_seed3_cp : coverpoint i_soc_ifc_reg.field_storage.fuse_uds_seed[3]; + bus_fuse_uds_seed3_cp : coverpoint bus_event[3] { + bins wr_rd[] = (AHB_WR, APB_WR => IDLE [*1:1000] => AHB_RD, APB_RD); + ignore_bins dont_care = {IDLE, 4'hf, (APB_RD | APB_WR), (AHB_RD | AHB_WR)}; + } + fuse_uds_seed4_cp : coverpoint i_soc_ifc_reg.field_storage.fuse_uds_seed[4]; + bus_fuse_uds_seed4_cp : coverpoint bus_event[4] { + bins wr_rd[] = (AHB_WR, APB_WR => IDLE [*1:1000] => AHB_RD, APB_RD); + ignore_bins dont_care = {IDLE, 4'hf, (APB_RD | APB_WR), (AHB_RD | AHB_WR)}; + } + fuse_uds_seed5_cp : coverpoint i_soc_ifc_reg.field_storage.fuse_uds_seed[5]; + bus_fuse_uds_seed5_cp : coverpoint bus_event[5] { + bins wr_rd[] = (AHB_WR, APB_WR => IDLE [*1:1000] => AHB_RD, APB_RD); + ignore_bins dont_care = {IDLE, 4'hf, (APB_RD | APB_WR), (AHB_RD | AHB_WR)}; + } + fuse_uds_seed6_cp : coverpoint i_soc_ifc_reg.field_storage.fuse_uds_seed[6]; + bus_fuse_uds_seed6_cp : coverpoint bus_event[6] { + bins wr_rd[] = (AHB_WR, APB_WR => IDLE [*1:1000] => AHB_RD, APB_RD); + ignore_bins dont_care = {IDLE, 4'hf, (APB_RD | APB_WR), (AHB_RD | AHB_WR)}; + } + fuse_uds_seed7_cp : coverpoint i_soc_ifc_reg.field_storage.fuse_uds_seed[7]; + bus_fuse_uds_seed7_cp : coverpoint bus_event[7] { + bins wr_rd[] = (AHB_WR, APB_WR => IDLE [*1:1000] => AHB_RD, APB_RD); + ignore_bins dont_care = {IDLE, 4'hf, (APB_RD | APB_WR), (AHB_RD | AHB_WR)}; + } + fuse_uds_seed8_cp : coverpoint i_soc_ifc_reg.field_storage.fuse_uds_seed[8]; + bus_fuse_uds_seed8_cp : coverpoint bus_event[8] { + bins wr_rd[] = (AHB_WR, APB_WR => IDLE [*1:1000] => AHB_RD, APB_RD); + ignore_bins dont_care = {IDLE, 4'hf, (APB_RD | APB_WR), (AHB_RD | AHB_WR)}; + } + fuse_uds_seed9_cp : coverpoint i_soc_ifc_reg.field_storage.fuse_uds_seed[9]; + bus_fuse_uds_seed9_cp : coverpoint bus_event[9] { + bins wr_rd[] = (AHB_WR, APB_WR => IDLE [*1:1000] => AHB_RD, APB_RD); + ignore_bins dont_care = {IDLE, 4'hf, (APB_RD | APB_WR), (AHB_RD | AHB_WR)}; + } + fuse_uds_seed10_cp : coverpoint i_soc_ifc_reg.field_storage.fuse_uds_seed[10]; + bus_fuse_uds_seed10_cp : coverpoint bus_event[10] { + bins wr_rd[] = (AHB_WR, APB_WR => IDLE [*1:1000] => AHB_RD, APB_RD); + ignore_bins dont_care = {IDLE, 4'hf, (APB_RD | APB_WR), (AHB_RD | AHB_WR)}; + } + fuse_uds_seed11_cp : coverpoint i_soc_ifc_reg.field_storage.fuse_uds_seed[11]; + bus_fuse_uds_seed11_cp : coverpoint bus_event[11] { + bins wr_rd[] = (AHB_WR, APB_WR => IDLE [*1:1000] => AHB_RD, APB_RD); + ignore_bins dont_care = {IDLE, 4'hf, (APB_RD | APB_WR), (AHB_RD | AHB_WR)}; + } + endgroup + + // ----------------------- COVERGROUP fuse_field_entropy [0:7] ----------------------- + covergroup soc_ifc_fuse_field_entropy_cg (ref logic [3:0] bus_event[0:7]) @(posedge clk); + fuse_field_entropy0_cp : coverpoint i_soc_ifc_reg.field_storage.fuse_field_entropy[0]; + bus_fuse_field_entropy0_cp : coverpoint bus_event[0] { + bins wr_rd[] = (AHB_WR, APB_WR => IDLE [*1:1000] => AHB_RD, APB_RD); + ignore_bins dont_care = {IDLE, 4'hf, (APB_RD | APB_WR), (AHB_RD | AHB_WR)}; + } + fuse_field_entropy1_cp : coverpoint i_soc_ifc_reg.field_storage.fuse_field_entropy[1]; + bus_fuse_field_entropy1_cp : coverpoint bus_event[1] { + bins wr_rd[] = (AHB_WR, APB_WR => IDLE [*1:1000] => AHB_RD, APB_RD); + ignore_bins dont_care = {IDLE, 4'hf, (APB_RD | APB_WR), (AHB_RD | AHB_WR)}; + } + fuse_field_entropy2_cp : coverpoint i_soc_ifc_reg.field_storage.fuse_field_entropy[2]; + bus_fuse_field_entropy2_cp : coverpoint bus_event[2] { + bins wr_rd[] = (AHB_WR, APB_WR => IDLE [*1:1000] => AHB_RD, APB_RD); + ignore_bins dont_care = {IDLE, 4'hf, (APB_RD | APB_WR), (AHB_RD | AHB_WR)}; + } + fuse_field_entropy3_cp : coverpoint i_soc_ifc_reg.field_storage.fuse_field_entropy[3]; + bus_fuse_field_entropy3_cp : coverpoint bus_event[3] { + bins wr_rd[] = (AHB_WR, APB_WR => IDLE [*1:1000] => AHB_RD, APB_RD); + ignore_bins dont_care = {IDLE, 4'hf, (APB_RD | APB_WR), (AHB_RD | AHB_WR)}; + } + fuse_field_entropy4_cp : coverpoint i_soc_ifc_reg.field_storage.fuse_field_entropy[4]; + bus_fuse_field_entropy4_cp : coverpoint bus_event[4] { + bins wr_rd[] = (AHB_WR, APB_WR => IDLE [*1:1000] => AHB_RD, APB_RD); + ignore_bins dont_care = {IDLE, 4'hf, (APB_RD | APB_WR), (AHB_RD | AHB_WR)}; + } + fuse_field_entropy5_cp : coverpoint i_soc_ifc_reg.field_storage.fuse_field_entropy[5]; + bus_fuse_field_entropy5_cp : coverpoint bus_event[5] { + bins wr_rd[] = (AHB_WR, APB_WR => IDLE [*1:1000] => AHB_RD, APB_RD); + ignore_bins dont_care = {IDLE, 4'hf, (APB_RD | APB_WR), (AHB_RD | AHB_WR)}; + } + fuse_field_entropy6_cp : coverpoint i_soc_ifc_reg.field_storage.fuse_field_entropy[6]; + bus_fuse_field_entropy6_cp : coverpoint bus_event[6] { + bins wr_rd[] = (AHB_WR, APB_WR => IDLE [*1:1000] => AHB_RD, APB_RD); + ignore_bins dont_care = {IDLE, 4'hf, (APB_RD | APB_WR), (AHB_RD | AHB_WR)}; + } + fuse_field_entropy7_cp : coverpoint i_soc_ifc_reg.field_storage.fuse_field_entropy[7]; + bus_fuse_field_entropy7_cp : coverpoint bus_event[7] { + bins wr_rd[] = (AHB_WR, APB_WR => IDLE [*1:1000] => AHB_RD, APB_RD); + ignore_bins dont_care = {IDLE, 4'hf, (APB_RD | APB_WR), (AHB_RD | AHB_WR)}; + } + endgroup + + // ----------------------- COVERGROUP fuse_key_manifest_pk_hash [0:11] ----------------------- + covergroup soc_ifc_fuse_key_manifest_pk_hash_cg (ref logic [3:0] bus_event[0:11]) @(posedge clk); + fuse_key_manifest_pk_hash0_cp : coverpoint i_soc_ifc_reg.field_storage.fuse_key_manifest_pk_hash[0]; + bus_fuse_key_manifest_pk_hash0_cp : coverpoint bus_event[0] { + bins wr_rd[] = (AHB_WR, APB_WR => IDLE [*1:1000] => AHB_RD, APB_RD); + ignore_bins dont_care = {IDLE, 4'hf, (APB_RD | APB_WR), (AHB_RD | AHB_WR)}; + } + fuse_key_manifest_pk_hash1_cp : coverpoint i_soc_ifc_reg.field_storage.fuse_key_manifest_pk_hash[1]; + bus_fuse_key_manifest_pk_hash1_cp : coverpoint bus_event[1] { + bins wr_rd[] = (AHB_WR, APB_WR => IDLE [*1:1000] => AHB_RD, APB_RD); + ignore_bins dont_care = {IDLE, 4'hf, (APB_RD | APB_WR), (AHB_RD | AHB_WR)}; + } + fuse_key_manifest_pk_hash2_cp : coverpoint i_soc_ifc_reg.field_storage.fuse_key_manifest_pk_hash[2]; + bus_fuse_key_manifest_pk_hash2_cp : coverpoint bus_event[2] { + bins wr_rd[] = (AHB_WR, APB_WR => IDLE [*1:1000] => AHB_RD, APB_RD); + ignore_bins dont_care = {IDLE, 4'hf, (APB_RD | APB_WR), (AHB_RD | AHB_WR)}; + } + fuse_key_manifest_pk_hash3_cp : coverpoint i_soc_ifc_reg.field_storage.fuse_key_manifest_pk_hash[3]; + bus_fuse_key_manifest_pk_hash3_cp : coverpoint bus_event[3] { + bins wr_rd[] = (AHB_WR, APB_WR => IDLE [*1:1000] => AHB_RD, APB_RD); + ignore_bins dont_care = {IDLE, 4'hf, (APB_RD | APB_WR), (AHB_RD | AHB_WR)}; + } + fuse_key_manifest_pk_hash4_cp : coverpoint i_soc_ifc_reg.field_storage.fuse_key_manifest_pk_hash[4]; + bus_fuse_key_manifest_pk_hash4_cp : coverpoint bus_event[4] { + bins wr_rd[] = (AHB_WR, APB_WR => IDLE [*1:1000] => AHB_RD, APB_RD); + ignore_bins dont_care = {IDLE, 4'hf, (APB_RD | APB_WR), (AHB_RD | AHB_WR)}; + } + fuse_key_manifest_pk_hash5_cp : coverpoint i_soc_ifc_reg.field_storage.fuse_key_manifest_pk_hash[5]; + bus_fuse_key_manifest_pk_hash5_cp : coverpoint bus_event[5] { + bins wr_rd[] = (AHB_WR, APB_WR => IDLE [*1:1000] => AHB_RD, APB_RD); + ignore_bins dont_care = {IDLE, 4'hf, (APB_RD | APB_WR), (AHB_RD | AHB_WR)}; + } + fuse_key_manifest_pk_hash6_cp : coverpoint i_soc_ifc_reg.field_storage.fuse_key_manifest_pk_hash[6]; + bus_fuse_key_manifest_pk_hash6_cp : coverpoint bus_event[6] { + bins wr_rd[] = (AHB_WR, APB_WR => IDLE [*1:1000] => AHB_RD, APB_RD); + ignore_bins dont_care = {IDLE, 4'hf, (APB_RD | APB_WR), (AHB_RD | AHB_WR)}; + } + fuse_key_manifest_pk_hash7_cp : coverpoint i_soc_ifc_reg.field_storage.fuse_key_manifest_pk_hash[7]; + bus_fuse_key_manifest_pk_hash7_cp : coverpoint bus_event[7] { + bins wr_rd[] = (AHB_WR, APB_WR => IDLE [*1:1000] => AHB_RD, APB_RD); + ignore_bins dont_care = {IDLE, 4'hf, (APB_RD | APB_WR), (AHB_RD | AHB_WR)}; + } + fuse_key_manifest_pk_hash8_cp : coverpoint i_soc_ifc_reg.field_storage.fuse_key_manifest_pk_hash[8]; + bus_fuse_key_manifest_pk_hash8_cp : coverpoint bus_event[8] { + bins wr_rd[] = (AHB_WR, APB_WR => IDLE [*1:1000] => AHB_RD, APB_RD); + ignore_bins dont_care = {IDLE, 4'hf, (APB_RD | APB_WR), (AHB_RD | AHB_WR)}; + } + fuse_key_manifest_pk_hash9_cp : coverpoint i_soc_ifc_reg.field_storage.fuse_key_manifest_pk_hash[9]; + bus_fuse_key_manifest_pk_hash9_cp : coverpoint bus_event[9] { + bins wr_rd[] = (AHB_WR, APB_WR => IDLE [*1:1000] => AHB_RD, APB_RD); + ignore_bins dont_care = {IDLE, 4'hf, (APB_RD | APB_WR), (AHB_RD | AHB_WR)}; + } + fuse_key_manifest_pk_hash10_cp : coverpoint i_soc_ifc_reg.field_storage.fuse_key_manifest_pk_hash[10]; + bus_fuse_key_manifest_pk_hash10_cp : coverpoint bus_event[10] { + bins wr_rd[] = (AHB_WR, APB_WR => IDLE [*1:1000] => AHB_RD, APB_RD); + ignore_bins dont_care = {IDLE, 4'hf, (APB_RD | APB_WR), (AHB_RD | AHB_WR)}; + } + fuse_key_manifest_pk_hash11_cp : coverpoint i_soc_ifc_reg.field_storage.fuse_key_manifest_pk_hash[11]; + bus_fuse_key_manifest_pk_hash11_cp : coverpoint bus_event[11] { + bins wr_rd[] = (AHB_WR, APB_WR => IDLE [*1:1000] => AHB_RD, APB_RD); + ignore_bins dont_care = {IDLE, 4'hf, (APB_RD | APB_WR), (AHB_RD | AHB_WR)}; + } + endgroup + + // ----------------------- COVERGROUP fuse_key_manifest_pk_hash_mask ----------------------- + covergroup soc_ifc_fuse_key_manifest_pk_hash_mask_cg (ref logic [3:0] bus_event) @(posedge clk); + fuse_key_manifest_pk_hash_mask_cp : coverpoint i_soc_ifc_reg.field_storage.fuse_key_manifest_pk_hash_mask; + bus_fuse_key_manifest_pk_hash_mask_cp : coverpoint bus_event { + bins wr_rd[] = (AHB_WR, APB_WR => IDLE [*1:1000] => AHB_RD, APB_RD); + ignore_bins dont_care = {IDLE, 4'hf, (APB_RD | APB_WR), (AHB_RD | AHB_WR)}; + } + endgroup + + // ----------------------- COVERGROUP fuse_owner_pk_hash [0:11] ----------------------- + covergroup soc_ifc_fuse_owner_pk_hash_cg (ref logic [3:0] bus_event[0:11]) @(posedge clk); + fuse_owner_pk_hash0_cp : coverpoint i_soc_ifc_reg.field_storage.fuse_owner_pk_hash[0]; + bus_fuse_owner_pk_hash0_cp : coverpoint bus_event[0] { + bins wr_rd[] = (AHB_WR, APB_WR => IDLE [*1:1000] => AHB_RD, APB_RD); + ignore_bins dont_care = {IDLE, 4'hf, (APB_RD | APB_WR), (AHB_RD | AHB_WR)}; + } + fuse_owner_pk_hash1_cp : coverpoint i_soc_ifc_reg.field_storage.fuse_owner_pk_hash[1]; + bus_fuse_owner_pk_hash1_cp : coverpoint bus_event[1] { + bins wr_rd[] = (AHB_WR, APB_WR => IDLE [*1:1000] => AHB_RD, APB_RD); + ignore_bins dont_care = {IDLE, 4'hf, (APB_RD | APB_WR), (AHB_RD | AHB_WR)}; + } + fuse_owner_pk_hash2_cp : coverpoint i_soc_ifc_reg.field_storage.fuse_owner_pk_hash[2]; + bus_fuse_owner_pk_hash2_cp : coverpoint bus_event[2] { + bins wr_rd[] = (AHB_WR, APB_WR => IDLE [*1:1000] => AHB_RD, APB_RD); + ignore_bins dont_care = {IDLE, 4'hf, (APB_RD | APB_WR), (AHB_RD | AHB_WR)}; + } + fuse_owner_pk_hash3_cp : coverpoint i_soc_ifc_reg.field_storage.fuse_owner_pk_hash[3]; + bus_fuse_owner_pk_hash3_cp : coverpoint bus_event[3] { + bins wr_rd[] = (AHB_WR, APB_WR => IDLE [*1:1000] => AHB_RD, APB_RD); + ignore_bins dont_care = {IDLE, 4'hf, (APB_RD | APB_WR), (AHB_RD | AHB_WR)}; + } + fuse_owner_pk_hash4_cp : coverpoint i_soc_ifc_reg.field_storage.fuse_owner_pk_hash[4]; + bus_fuse_owner_pk_hash4_cp : coverpoint bus_event[4] { + bins wr_rd[] = (AHB_WR, APB_WR => IDLE [*1:1000] => AHB_RD, APB_RD); + ignore_bins dont_care = {IDLE, 4'hf, (APB_RD | APB_WR), (AHB_RD | AHB_WR)}; + } + fuse_owner_pk_hash5_cp : coverpoint i_soc_ifc_reg.field_storage.fuse_owner_pk_hash[5]; + bus_fuse_owner_pk_hash5_cp : coverpoint bus_event[5] { + bins wr_rd[] = (AHB_WR, APB_WR => IDLE [*1:1000] => AHB_RD, APB_RD); + ignore_bins dont_care = {IDLE, 4'hf, (APB_RD | APB_WR), (AHB_RD | AHB_WR)}; + } + fuse_owner_pk_hash6_cp : coverpoint i_soc_ifc_reg.field_storage.fuse_owner_pk_hash[6]; + bus_fuse_owner_pk_hash6_cp : coverpoint bus_event[6] { + bins wr_rd[] = (AHB_WR, APB_WR => IDLE [*1:1000] => AHB_RD, APB_RD); + ignore_bins dont_care = {IDLE, 4'hf, (APB_RD | APB_WR), (AHB_RD | AHB_WR)}; + } + fuse_owner_pk_hash7_cp : coverpoint i_soc_ifc_reg.field_storage.fuse_owner_pk_hash[7]; + bus_fuse_owner_pk_hash7_cp : coverpoint bus_event[7] { + bins wr_rd[] = (AHB_WR, APB_WR => IDLE [*1:1000] => AHB_RD, APB_RD); + ignore_bins dont_care = {IDLE, 4'hf, (APB_RD | APB_WR), (AHB_RD | AHB_WR)}; + } + fuse_owner_pk_hash8_cp : coverpoint i_soc_ifc_reg.field_storage.fuse_owner_pk_hash[8]; + bus_fuse_owner_pk_hash8_cp : coverpoint bus_event[8] { + bins wr_rd[] = (AHB_WR, APB_WR => IDLE [*1:1000] => AHB_RD, APB_RD); + ignore_bins dont_care = {IDLE, 4'hf, (APB_RD | APB_WR), (AHB_RD | AHB_WR)}; + } + fuse_owner_pk_hash9_cp : coverpoint i_soc_ifc_reg.field_storage.fuse_owner_pk_hash[9]; + bus_fuse_owner_pk_hash9_cp : coverpoint bus_event[9] { + bins wr_rd[] = (AHB_WR, APB_WR => IDLE [*1:1000] => AHB_RD, APB_RD); + ignore_bins dont_care = {IDLE, 4'hf, (APB_RD | APB_WR), (AHB_RD | AHB_WR)}; + } + fuse_owner_pk_hash10_cp : coverpoint i_soc_ifc_reg.field_storage.fuse_owner_pk_hash[10]; + bus_fuse_owner_pk_hash10_cp : coverpoint bus_event[10] { + bins wr_rd[] = (AHB_WR, APB_WR => IDLE [*1:1000] => AHB_RD, APB_RD); + ignore_bins dont_care = {IDLE, 4'hf, (APB_RD | APB_WR), (AHB_RD | AHB_WR)}; + } + fuse_owner_pk_hash11_cp : coverpoint i_soc_ifc_reg.field_storage.fuse_owner_pk_hash[11]; + bus_fuse_owner_pk_hash11_cp : coverpoint bus_event[11] { + bins wr_rd[] = (AHB_WR, APB_WR => IDLE [*1:1000] => AHB_RD, APB_RD); + ignore_bins dont_care = {IDLE, 4'hf, (APB_RD | APB_WR), (AHB_RD | AHB_WR)}; + } + endgroup + + // ----------------------- COVERGROUP fuse_fmc_key_manifest_svn ----------------------- + covergroup soc_ifc_fuse_fmc_key_manifest_svn_cg (ref logic [3:0] bus_event) @(posedge clk); + fuse_fmc_key_manifest_svn_cp : coverpoint i_soc_ifc_reg.field_storage.fuse_fmc_key_manifest_svn; + bus_fuse_fmc_key_manifest_svn_cp : coverpoint bus_event { + bins wr_rd[] = (AHB_WR, APB_WR => IDLE [*1:1000] => AHB_RD, APB_RD); + ignore_bins dont_care = {IDLE, 4'hf, (APB_RD | APB_WR), (AHB_RD | AHB_WR)}; + } + endgroup + + // ----------------------- COVERGROUP fuse_runtime_svn [0:3] ----------------------- + covergroup soc_ifc_fuse_runtime_svn_cg (ref logic [3:0] bus_event[0:3]) @(posedge clk); + fuse_runtime_svn0_cp : coverpoint i_soc_ifc_reg.field_storage.fuse_runtime_svn[0]; + bus_fuse_runtime_svn0_cp : coverpoint bus_event[0] { + bins wr_rd[] = (AHB_WR, APB_WR => IDLE [*1:1000] => AHB_RD, APB_RD); + ignore_bins dont_care = {IDLE, 4'hf, (APB_RD | APB_WR), (AHB_RD | AHB_WR)}; + } + fuse_runtime_svn1_cp : coverpoint i_soc_ifc_reg.field_storage.fuse_runtime_svn[1]; + bus_fuse_runtime_svn1_cp : coverpoint bus_event[1] { + bins wr_rd[] = (AHB_WR, APB_WR => IDLE [*1:1000] => AHB_RD, APB_RD); + ignore_bins dont_care = {IDLE, 4'hf, (APB_RD | APB_WR), (AHB_RD | AHB_WR)}; + } + fuse_runtime_svn2_cp : coverpoint i_soc_ifc_reg.field_storage.fuse_runtime_svn[2]; + bus_fuse_runtime_svn2_cp : coverpoint bus_event[2] { + bins wr_rd[] = (AHB_WR, APB_WR => IDLE [*1:1000] => AHB_RD, APB_RD); + ignore_bins dont_care = {IDLE, 4'hf, (APB_RD | APB_WR), (AHB_RD | AHB_WR)}; + } + fuse_runtime_svn3_cp : coverpoint i_soc_ifc_reg.field_storage.fuse_runtime_svn[3]; + bus_fuse_runtime_svn3_cp : coverpoint bus_event[3] { + bins wr_rd[] = (AHB_WR, APB_WR => IDLE [*1:1000] => AHB_RD, APB_RD); + ignore_bins dont_care = {IDLE, 4'hf, (APB_RD | APB_WR), (AHB_RD | AHB_WR)}; + } + endgroup + + // ----------------------- COVERGROUP fuse_anti_rollback_disable ----------------------- + covergroup soc_ifc_fuse_anti_rollback_disable_cg (ref logic [3:0] bus_event) @(posedge clk); + fuse_anti_rollback_disable_cp : coverpoint i_soc_ifc_reg.field_storage.fuse_anti_rollback_disable; + bus_fuse_anti_rollback_disable_cp : coverpoint bus_event { + bins wr_rd[] = (AHB_WR, APB_WR => IDLE [*1:1000] => AHB_RD, APB_RD); + ignore_bins dont_care = {IDLE, 4'hf, (APB_RD | APB_WR), (AHB_RD | AHB_WR)}; + } + endgroup + + // ----------------------- COVERGROUP fuse_idevid_cert_attr [0:23] ----------------------- + covergroup soc_ifc_fuse_idevid_cert_attr_cg (ref logic [3:0] bus_event[0:23]) @(posedge clk); + fuse_idevid_cert_attr0_cp : coverpoint i_soc_ifc_reg.field_storage.fuse_idevid_cert_attr[0]; + bus_fuse_idevid_cert_attr0_cp : coverpoint bus_event[0] { + bins wr_rd[] = (AHB_WR, APB_WR => IDLE [*1:1000] => AHB_RD, APB_RD); + ignore_bins dont_care = {IDLE, 4'hf, (APB_RD | APB_WR), (AHB_RD | AHB_WR)}; + } + fuse_idevid_cert_attr1_cp : coverpoint i_soc_ifc_reg.field_storage.fuse_idevid_cert_attr[1]; + bus_fuse_idevid_cert_attr1_cp : coverpoint bus_event[1] { + bins wr_rd[] = (AHB_WR, APB_WR => IDLE [*1:1000] => AHB_RD, APB_RD); + ignore_bins dont_care = {IDLE, 4'hf, (APB_RD | APB_WR), (AHB_RD | AHB_WR)}; + } + fuse_idevid_cert_attr2_cp : coverpoint i_soc_ifc_reg.field_storage.fuse_idevid_cert_attr[2]; + bus_fuse_idevid_cert_attr2_cp : coverpoint bus_event[2] { + bins wr_rd[] = (AHB_WR, APB_WR => IDLE [*1:1000] => AHB_RD, APB_RD); + ignore_bins dont_care = {IDLE, 4'hf, (APB_RD | APB_WR), (AHB_RD | AHB_WR)}; + } + fuse_idevid_cert_attr3_cp : coverpoint i_soc_ifc_reg.field_storage.fuse_idevid_cert_attr[3]; + bus_fuse_idevid_cert_attr3_cp : coverpoint bus_event[3] { + bins wr_rd[] = (AHB_WR, APB_WR => IDLE [*1:1000] => AHB_RD, APB_RD); + ignore_bins dont_care = {IDLE, 4'hf, (APB_RD | APB_WR), (AHB_RD | AHB_WR)}; + } + fuse_idevid_cert_attr4_cp : coverpoint i_soc_ifc_reg.field_storage.fuse_idevid_cert_attr[4]; + bus_fuse_idevid_cert_attr4_cp : coverpoint bus_event[4] { + bins wr_rd[] = (AHB_WR, APB_WR => IDLE [*1:1000] => AHB_RD, APB_RD); + ignore_bins dont_care = {IDLE, 4'hf, (APB_RD | APB_WR), (AHB_RD | AHB_WR)}; + } + fuse_idevid_cert_attr5_cp : coverpoint i_soc_ifc_reg.field_storage.fuse_idevid_cert_attr[5]; + bus_fuse_idevid_cert_attr5_cp : coverpoint bus_event[5] { + bins wr_rd[] = (AHB_WR, APB_WR => IDLE [*1:1000] => AHB_RD, APB_RD); + ignore_bins dont_care = {IDLE, 4'hf, (APB_RD | APB_WR), (AHB_RD | AHB_WR)}; + } + fuse_idevid_cert_attr6_cp : coverpoint i_soc_ifc_reg.field_storage.fuse_idevid_cert_attr[6]; + bus_fuse_idevid_cert_attr6_cp : coverpoint bus_event[6] { + bins wr_rd[] = (AHB_WR, APB_WR => IDLE [*1:1000] => AHB_RD, APB_RD); + ignore_bins dont_care = {IDLE, 4'hf, (APB_RD | APB_WR), (AHB_RD | AHB_WR)}; + } + fuse_idevid_cert_attr7_cp : coverpoint i_soc_ifc_reg.field_storage.fuse_idevid_cert_attr[7]; + bus_fuse_idevid_cert_attr7_cp : coverpoint bus_event[7] { + bins wr_rd[] = (AHB_WR, APB_WR => IDLE [*1:1000] => AHB_RD, APB_RD); + ignore_bins dont_care = {IDLE, 4'hf, (APB_RD | APB_WR), (AHB_RD | AHB_WR)}; + } + fuse_idevid_cert_attr8_cp : coverpoint i_soc_ifc_reg.field_storage.fuse_idevid_cert_attr[8]; + bus_fuse_idevid_cert_attr8_cp : coverpoint bus_event[8] { + bins wr_rd[] = (AHB_WR, APB_WR => IDLE [*1:1000] => AHB_RD, APB_RD); + ignore_bins dont_care = {IDLE, 4'hf, (APB_RD | APB_WR), (AHB_RD | AHB_WR)}; + } + fuse_idevid_cert_attr9_cp : coverpoint i_soc_ifc_reg.field_storage.fuse_idevid_cert_attr[9]; + bus_fuse_idevid_cert_attr9_cp : coverpoint bus_event[9] { + bins wr_rd[] = (AHB_WR, APB_WR => IDLE [*1:1000] => AHB_RD, APB_RD); + ignore_bins dont_care = {IDLE, 4'hf, (APB_RD | APB_WR), (AHB_RD | AHB_WR)}; + } + fuse_idevid_cert_attr10_cp : coverpoint i_soc_ifc_reg.field_storage.fuse_idevid_cert_attr[10]; + bus_fuse_idevid_cert_attr10_cp : coverpoint bus_event[10] { + bins wr_rd[] = (AHB_WR, APB_WR => IDLE [*1:1000] => AHB_RD, APB_RD); + ignore_bins dont_care = {IDLE, 4'hf, (APB_RD | APB_WR), (AHB_RD | AHB_WR)}; + } + fuse_idevid_cert_attr11_cp : coverpoint i_soc_ifc_reg.field_storage.fuse_idevid_cert_attr[11]; + bus_fuse_idevid_cert_attr11_cp : coverpoint bus_event[11] { + bins wr_rd[] = (AHB_WR, APB_WR => IDLE [*1:1000] => AHB_RD, APB_RD); + ignore_bins dont_care = {IDLE, 4'hf, (APB_RD | APB_WR), (AHB_RD | AHB_WR)}; + } + fuse_idevid_cert_attr12_cp : coverpoint i_soc_ifc_reg.field_storage.fuse_idevid_cert_attr[12]; + bus_fuse_idevid_cert_attr12_cp : coverpoint bus_event[12] { + bins wr_rd[] = (AHB_WR, APB_WR => IDLE [*1:1000] => AHB_RD, APB_RD); + ignore_bins dont_care = {IDLE, 4'hf, (APB_RD | APB_WR), (AHB_RD | AHB_WR)}; + } + fuse_idevid_cert_attr13_cp : coverpoint i_soc_ifc_reg.field_storage.fuse_idevid_cert_attr[13]; + bus_fuse_idevid_cert_attr13_cp : coverpoint bus_event[13] { + bins wr_rd[] = (AHB_WR, APB_WR => IDLE [*1:1000] => AHB_RD, APB_RD); + ignore_bins dont_care = {IDLE, 4'hf, (APB_RD | APB_WR), (AHB_RD | AHB_WR)}; + } + fuse_idevid_cert_attr14_cp : coverpoint i_soc_ifc_reg.field_storage.fuse_idevid_cert_attr[14]; + bus_fuse_idevid_cert_attr14_cp : coverpoint bus_event[14] { + bins wr_rd[] = (AHB_WR, APB_WR => IDLE [*1:1000] => AHB_RD, APB_RD); + ignore_bins dont_care = {IDLE, 4'hf, (APB_RD | APB_WR), (AHB_RD | AHB_WR)}; + } + fuse_idevid_cert_attr15_cp : coverpoint i_soc_ifc_reg.field_storage.fuse_idevid_cert_attr[15]; + bus_fuse_idevid_cert_attr15_cp : coverpoint bus_event[15] { + bins wr_rd[] = (AHB_WR, APB_WR => IDLE [*1:1000] => AHB_RD, APB_RD); + ignore_bins dont_care = {IDLE, 4'hf, (APB_RD | APB_WR), (AHB_RD | AHB_WR)}; + } + fuse_idevid_cert_attr16_cp : coverpoint i_soc_ifc_reg.field_storage.fuse_idevid_cert_attr[16]; + bus_fuse_idevid_cert_attr16_cp : coverpoint bus_event[16] { + bins wr_rd[] = (AHB_WR, APB_WR => IDLE [*1:1000] => AHB_RD, APB_RD); + ignore_bins dont_care = {IDLE, 4'hf, (APB_RD | APB_WR), (AHB_RD | AHB_WR)}; + } + fuse_idevid_cert_attr17_cp : coverpoint i_soc_ifc_reg.field_storage.fuse_idevid_cert_attr[17]; + bus_fuse_idevid_cert_attr17_cp : coverpoint bus_event[17] { + bins wr_rd[] = (AHB_WR, APB_WR => IDLE [*1:1000] => AHB_RD, APB_RD); + ignore_bins dont_care = {IDLE, 4'hf, (APB_RD | APB_WR), (AHB_RD | AHB_WR)}; + } + fuse_idevid_cert_attr18_cp : coverpoint i_soc_ifc_reg.field_storage.fuse_idevid_cert_attr[18]; + bus_fuse_idevid_cert_attr18_cp : coverpoint bus_event[18] { + bins wr_rd[] = (AHB_WR, APB_WR => IDLE [*1:1000] => AHB_RD, APB_RD); + ignore_bins dont_care = {IDLE, 4'hf, (APB_RD | APB_WR), (AHB_RD | AHB_WR)}; + } + fuse_idevid_cert_attr19_cp : coverpoint i_soc_ifc_reg.field_storage.fuse_idevid_cert_attr[19]; + bus_fuse_idevid_cert_attr19_cp : coverpoint bus_event[19] { + bins wr_rd[] = (AHB_WR, APB_WR => IDLE [*1:1000] => AHB_RD, APB_RD); + ignore_bins dont_care = {IDLE, 4'hf, (APB_RD | APB_WR), (AHB_RD | AHB_WR)}; + } + fuse_idevid_cert_attr20_cp : coverpoint i_soc_ifc_reg.field_storage.fuse_idevid_cert_attr[20]; + bus_fuse_idevid_cert_attr20_cp : coverpoint bus_event[20] { + bins wr_rd[] = (AHB_WR, APB_WR => IDLE [*1:1000] => AHB_RD, APB_RD); + ignore_bins dont_care = {IDLE, 4'hf, (APB_RD | APB_WR), (AHB_RD | AHB_WR)}; + } + fuse_idevid_cert_attr21_cp : coverpoint i_soc_ifc_reg.field_storage.fuse_idevid_cert_attr[21]; + bus_fuse_idevid_cert_attr21_cp : coverpoint bus_event[21] { + bins wr_rd[] = (AHB_WR, APB_WR => IDLE [*1:1000] => AHB_RD, APB_RD); + ignore_bins dont_care = {IDLE, 4'hf, (APB_RD | APB_WR), (AHB_RD | AHB_WR)}; + } + fuse_idevid_cert_attr22_cp : coverpoint i_soc_ifc_reg.field_storage.fuse_idevid_cert_attr[22]; + bus_fuse_idevid_cert_attr22_cp : coverpoint bus_event[22] { + bins wr_rd[] = (AHB_WR, APB_WR => IDLE [*1:1000] => AHB_RD, APB_RD); + ignore_bins dont_care = {IDLE, 4'hf, (APB_RD | APB_WR), (AHB_RD | AHB_WR)}; + } + fuse_idevid_cert_attr23_cp : coverpoint i_soc_ifc_reg.field_storage.fuse_idevid_cert_attr[23]; + bus_fuse_idevid_cert_attr23_cp : coverpoint bus_event[23] { + bins wr_rd[] = (AHB_WR, APB_WR => IDLE [*1:1000] => AHB_RD, APB_RD); + ignore_bins dont_care = {IDLE, 4'hf, (APB_RD | APB_WR), (AHB_RD | AHB_WR)}; + } + endgroup + + // ----------------------- COVERGROUP fuse_idevid_manuf_hsm_id [0:3] ----------------------- + covergroup soc_ifc_fuse_idevid_manuf_hsm_id_cg (ref logic [3:0] bus_event[0:3]) @(posedge clk); + fuse_idevid_manuf_hsm_id0_cp : coverpoint i_soc_ifc_reg.field_storage.fuse_idevid_manuf_hsm_id[0]; + bus_fuse_idevid_manuf_hsm_id0_cp : coverpoint bus_event[0] { + bins wr_rd[] = (AHB_WR, APB_WR => IDLE [*1:1000] => AHB_RD, APB_RD); + ignore_bins dont_care = {IDLE, 4'hf, (APB_RD | APB_WR), (AHB_RD | AHB_WR)}; + } + fuse_idevid_manuf_hsm_id1_cp : coverpoint i_soc_ifc_reg.field_storage.fuse_idevid_manuf_hsm_id[1]; + bus_fuse_idevid_manuf_hsm_id1_cp : coverpoint bus_event[1] { + bins wr_rd[] = (AHB_WR, APB_WR => IDLE [*1:1000] => AHB_RD, APB_RD); + ignore_bins dont_care = {IDLE, 4'hf, (APB_RD | APB_WR), (AHB_RD | AHB_WR)}; + } + fuse_idevid_manuf_hsm_id2_cp : coverpoint i_soc_ifc_reg.field_storage.fuse_idevid_manuf_hsm_id[2]; + bus_fuse_idevid_manuf_hsm_id2_cp : coverpoint bus_event[2] { + bins wr_rd[] = (AHB_WR, APB_WR => IDLE [*1:1000] => AHB_RD, APB_RD); + ignore_bins dont_care = {IDLE, 4'hf, (APB_RD | APB_WR), (AHB_RD | AHB_WR)}; + } + fuse_idevid_manuf_hsm_id3_cp : coverpoint i_soc_ifc_reg.field_storage.fuse_idevid_manuf_hsm_id[3]; + bus_fuse_idevid_manuf_hsm_id3_cp : coverpoint bus_event[3] { + bins wr_rd[] = (AHB_WR, APB_WR => IDLE [*1:1000] => AHB_RD, APB_RD); + ignore_bins dont_care = {IDLE, 4'hf, (APB_RD | APB_WR), (AHB_RD | AHB_WR)}; + } + endgroup + + // ----------------------- COVERGROUP fuse_life_cycle ----------------------- + covergroup soc_ifc_fuse_life_cycle_cg (ref logic [3:0] bus_event) @(posedge clk); + fuse_life_cycle_cp : coverpoint i_soc_ifc_reg.field_storage.fuse_life_cycle; + bus_fuse_life_cycle_cp : coverpoint bus_event { + bins wr_rd[] = (AHB_WR, APB_WR => IDLE [*1:1000] => AHB_RD, APB_RD); + ignore_bins dont_care = {IDLE, 4'hf, (APB_RD | APB_WR), (AHB_RD | AHB_WR)}; + } + endgroup + + // ----------------------- COVERGROUP fuse_lms_verify ----------------------- + covergroup soc_ifc_fuse_lms_verify_cg (ref logic [3:0] bus_event) @(posedge clk); + fuse_lms_verify_cp : coverpoint i_soc_ifc_reg.field_storage.fuse_lms_verify; + bus_fuse_lms_verify_cp : coverpoint bus_event { + bins wr_rd[] = (AHB_WR, APB_WR => IDLE [*1:1000] => AHB_RD, APB_RD); + ignore_bins dont_care = {IDLE, 4'hf, (APB_RD | APB_WR), (AHB_RD | AHB_WR)}; + } + endgroup + + // ----------------------- COVERGROUP fuse_lms_revocation ----------------------- + covergroup soc_ifc_fuse_lms_revocation_cg (ref logic [3:0] bus_event) @(posedge clk); + fuse_lms_revocation_cp : coverpoint i_soc_ifc_reg.field_storage.fuse_lms_revocation; + bus_fuse_lms_revocation_cp : coverpoint bus_event { + bins wr_rd[] = (AHB_WR, APB_WR => IDLE [*1:1000] => AHB_RD, APB_RD); + ignore_bins dont_care = {IDLE, 4'hf, (APB_RD | APB_WR), (AHB_RD | AHB_WR)}; + } + endgroup + + // ----------------------- COVERGROUP fuse_soc_stepping_id ----------------------- + covergroup soc_ifc_fuse_soc_stepping_id_cg (ref logic [3:0] bus_event) @(posedge clk); + fuse_soc_stepping_id_cp : coverpoint i_soc_ifc_reg.field_storage.fuse_soc_stepping_id; + bus_fuse_soc_stepping_id_cp : coverpoint bus_event { + bins wr_rd[] = (AHB_WR, APB_WR => IDLE [*1:1000] => AHB_RD, APB_RD); + ignore_bins dont_care = {IDLE, 4'hf, (APB_RD | APB_WR), (AHB_RD | AHB_WR)}; + } + endgroup + + // ----------------------- COVERGROUP internal_obf_key [0:7] ----------------------- + covergroup soc_ifc_internal_obf_key_cg (ref logic [3:0] bus_event[0:7]) @(posedge clk); + internal_obf_key0_cp : coverpoint i_soc_ifc_reg.field_storage.internal_obf_key[0]; + bus_internal_obf_key0_cp : coverpoint bus_event[0] { + bins wr_rd[] = (AHB_WR, APB_WR => IDLE [*1:1000] => AHB_RD, APB_RD); + ignore_bins dont_care = {IDLE, 4'hf, (APB_RD | APB_WR), (AHB_RD | AHB_WR)}; + } + internal_obf_key1_cp : coverpoint i_soc_ifc_reg.field_storage.internal_obf_key[1]; + bus_internal_obf_key1_cp : coverpoint bus_event[1] { + bins wr_rd[] = (AHB_WR, APB_WR => IDLE [*1:1000] => AHB_RD, APB_RD); + ignore_bins dont_care = {IDLE, 4'hf, (APB_RD | APB_WR), (AHB_RD | AHB_WR)}; + } + internal_obf_key2_cp : coverpoint i_soc_ifc_reg.field_storage.internal_obf_key[2]; + bus_internal_obf_key2_cp : coverpoint bus_event[2] { + bins wr_rd[] = (AHB_WR, APB_WR => IDLE [*1:1000] => AHB_RD, APB_RD); + ignore_bins dont_care = {IDLE, 4'hf, (APB_RD | APB_WR), (AHB_RD | AHB_WR)}; + } + internal_obf_key3_cp : coverpoint i_soc_ifc_reg.field_storage.internal_obf_key[3]; + bus_internal_obf_key3_cp : coverpoint bus_event[3] { + bins wr_rd[] = (AHB_WR, APB_WR => IDLE [*1:1000] => AHB_RD, APB_RD); + ignore_bins dont_care = {IDLE, 4'hf, (APB_RD | APB_WR), (AHB_RD | AHB_WR)}; + } + internal_obf_key4_cp : coverpoint i_soc_ifc_reg.field_storage.internal_obf_key[4]; + bus_internal_obf_key4_cp : coverpoint bus_event[4] { + bins wr_rd[] = (AHB_WR, APB_WR => IDLE [*1:1000] => AHB_RD, APB_RD); + ignore_bins dont_care = {IDLE, 4'hf, (APB_RD | APB_WR), (AHB_RD | AHB_WR)}; + } + internal_obf_key5_cp : coverpoint i_soc_ifc_reg.field_storage.internal_obf_key[5]; + bus_internal_obf_key5_cp : coverpoint bus_event[5] { + bins wr_rd[] = (AHB_WR, APB_WR => IDLE [*1:1000] => AHB_RD, APB_RD); + ignore_bins dont_care = {IDLE, 4'hf, (APB_RD | APB_WR), (AHB_RD | AHB_WR)}; + } + internal_obf_key6_cp : coverpoint i_soc_ifc_reg.field_storage.internal_obf_key[6]; + bus_internal_obf_key6_cp : coverpoint bus_event[6] { + bins wr_rd[] = (AHB_WR, APB_WR => IDLE [*1:1000] => AHB_RD, APB_RD); + ignore_bins dont_care = {IDLE, 4'hf, (APB_RD | APB_WR), (AHB_RD | AHB_WR)}; + } + internal_obf_key7_cp : coverpoint i_soc_ifc_reg.field_storage.internal_obf_key[7]; + bus_internal_obf_key7_cp : coverpoint bus_event[7] { + bins wr_rd[] = (AHB_WR, APB_WR => IDLE [*1:1000] => AHB_RD, APB_RD); + ignore_bins dont_care = {IDLE, 4'hf, (APB_RD | APB_WR), (AHB_RD | AHB_WR)}; + } + endgroup + + // ----------------------- COVERGROUP internal_iccm_lock ----------------------- + covergroup soc_ifc_internal_iccm_lock_cg (ref logic [3:0] bus_event) @(posedge clk); + internal_iccm_lock_cp : coverpoint i_soc_ifc_reg.field_storage.internal_iccm_lock; + bus_internal_iccm_lock_cp : coverpoint bus_event { + bins wr_rd[] = (AHB_WR, APB_WR => IDLE [*1:1000] => AHB_RD, APB_RD); + ignore_bins dont_care = {IDLE, 4'hf, (APB_RD | APB_WR), (AHB_RD | AHB_WR)}; + } + endgroup + + // ----------------------- COVERGROUP internal_fw_update_reset ----------------------- + covergroup soc_ifc_internal_fw_update_reset_cg (ref logic [3:0] bus_event) @(posedge clk); + internal_fw_update_reset_cp : coverpoint i_soc_ifc_reg.field_storage.internal_fw_update_reset; + bus_internal_fw_update_reset_cp : coverpoint bus_event { + bins wr_rd[] = (AHB_WR, APB_WR => IDLE [*1:1000] => AHB_RD, APB_RD); + ignore_bins dont_care = {IDLE, 4'hf, (APB_RD | APB_WR), (AHB_RD | AHB_WR)}; + } + endgroup + + // ----------------------- COVERGROUP internal_fw_update_reset_wait_cycles ----------------------- + covergroup soc_ifc_internal_fw_update_reset_wait_cycles_cg (ref logic [3:0] bus_event) @(posedge clk); + internal_fw_update_reset_wait_cycles_cp : coverpoint i_soc_ifc_reg.field_storage.internal_fw_update_reset_wait_cycles; + bus_internal_fw_update_reset_wait_cycles_cp : coverpoint bus_event { + bins wr_rd[] = (AHB_WR, APB_WR => IDLE [*1:1000] => AHB_RD, APB_RD); + ignore_bins dont_care = {IDLE, 4'hf, (APB_RD | APB_WR), (AHB_RD | AHB_WR)}; + } + endgroup + + // ----------------------- COVERGROUP internal_nmi_vector ----------------------- + covergroup soc_ifc_internal_nmi_vector_cg (ref logic [3:0] bus_event) @(posedge clk); + internal_nmi_vector_cp : coverpoint i_soc_ifc_reg.field_storage.internal_nmi_vector; + bus_internal_nmi_vector_cp : coverpoint bus_event { + bins wr_rd[] = (AHB_WR, APB_WR => IDLE [*1:1000] => AHB_RD, APB_RD); + ignore_bins dont_care = {IDLE, 4'hf, (APB_RD | APB_WR), (AHB_RD | AHB_WR)}; + } + endgroup + + // ----------------------- COVERGROUP internal_hw_error_fatal_mask ----------------------- + covergroup soc_ifc_internal_hw_error_fatal_mask_cg (ref logic [3:0] bus_event) @(posedge clk); + internal_hw_error_fatal_mask_cp : coverpoint i_soc_ifc_reg.field_storage.internal_hw_error_fatal_mask; + bus_internal_hw_error_fatal_mask_cp : coverpoint bus_event { + bins wr_rd[] = (AHB_WR, APB_WR => IDLE [*1:1000] => AHB_RD, APB_RD); + ignore_bins dont_care = {IDLE, 4'hf, (APB_RD | APB_WR), (AHB_RD | AHB_WR)}; + } + endgroup + + // ----------------------- COVERGROUP internal_hw_error_non_fatal_mask ----------------------- + covergroup soc_ifc_internal_hw_error_non_fatal_mask_cg (ref logic [3:0] bus_event) @(posedge clk); + internal_hw_error_non_fatal_mask_cp : coverpoint i_soc_ifc_reg.field_storage.internal_hw_error_non_fatal_mask; + bus_internal_hw_error_non_fatal_mask_cp : coverpoint bus_event { + bins wr_rd[] = (AHB_WR, APB_WR => IDLE [*1:1000] => AHB_RD, APB_RD); + ignore_bins dont_care = {IDLE, 4'hf, (APB_RD | APB_WR), (AHB_RD | AHB_WR)}; + } + endgroup + + // ----------------------- COVERGROUP internal_fw_error_fatal_mask ----------------------- + covergroup soc_ifc_internal_fw_error_fatal_mask_cg (ref logic [3:0] bus_event) @(posedge clk); + internal_fw_error_fatal_mask_cp : coverpoint i_soc_ifc_reg.field_storage.internal_fw_error_fatal_mask; + bus_internal_fw_error_fatal_mask_cp : coverpoint bus_event { + bins wr_rd[] = (AHB_WR, APB_WR => IDLE [*1:1000] => AHB_RD, APB_RD); + ignore_bins dont_care = {IDLE, 4'hf, (APB_RD | APB_WR), (AHB_RD | AHB_WR)}; + } + endgroup + + // ----------------------- COVERGROUP internal_fw_error_non_fatal_mask ----------------------- + covergroup soc_ifc_internal_fw_error_non_fatal_mask_cg (ref logic [3:0] bus_event) @(posedge clk); + internal_fw_error_non_fatal_mask_cp : coverpoint i_soc_ifc_reg.field_storage.internal_fw_error_non_fatal_mask; + bus_internal_fw_error_non_fatal_mask_cp : coverpoint bus_event { + bins wr_rd[] = (AHB_WR, APB_WR => IDLE [*1:1000] => AHB_RD, APB_RD); + ignore_bins dont_care = {IDLE, 4'hf, (APB_RD | APB_WR), (AHB_RD | AHB_WR)}; + } + endgroup + + // ----------------------- COVERGROUP internal_rv_mtime_l ----------------------- + covergroup soc_ifc_internal_rv_mtime_l_cg (ref logic [3:0] bus_event) @(posedge clk); + internal_rv_mtime_l_cp : coverpoint i_soc_ifc_reg.field_storage.internal_rv_mtime_l; + bus_internal_rv_mtime_l_cp : coverpoint bus_event { + bins wr_rd[] = (AHB_WR, APB_WR => IDLE [*1:1000] => AHB_RD, APB_RD); + ignore_bins dont_care = {IDLE, 4'hf, (APB_RD | APB_WR), (AHB_RD | AHB_WR)}; + } + endgroup + + // ----------------------- COVERGROUP internal_rv_mtime_h ----------------------- + covergroup soc_ifc_internal_rv_mtime_h_cg (ref logic [3:0] bus_event) @(posedge clk); + internal_rv_mtime_h_cp : coverpoint i_soc_ifc_reg.field_storage.internal_rv_mtime_h; + bus_internal_rv_mtime_h_cp : coverpoint bus_event { + bins wr_rd[] = (AHB_WR, APB_WR => IDLE [*1:1000] => AHB_RD, APB_RD); + ignore_bins dont_care = {IDLE, 4'hf, (APB_RD | APB_WR), (AHB_RD | AHB_WR)}; + } + endgroup + + // ----------------------- COVERGROUP internal_rv_mtimecmp_l ----------------------- + covergroup soc_ifc_internal_rv_mtimecmp_l_cg (ref logic [3:0] bus_event) @(posedge clk); + internal_rv_mtimecmp_l_cp : coverpoint i_soc_ifc_reg.field_storage.internal_rv_mtimecmp_l; + bus_internal_rv_mtimecmp_l_cp : coverpoint bus_event { + bins wr_rd[] = (AHB_WR, APB_WR => IDLE [*1:1000] => AHB_RD, APB_RD); + ignore_bins dont_care = {IDLE, 4'hf, (APB_RD | APB_WR), (AHB_RD | AHB_WR)}; + } + endgroup + + // ----------------------- COVERGROUP internal_rv_mtimecmp_h ----------------------- + covergroup soc_ifc_internal_rv_mtimecmp_h_cg (ref logic [3:0] bus_event) @(posedge clk); + internal_rv_mtimecmp_h_cp : coverpoint i_soc_ifc_reg.field_storage.internal_rv_mtimecmp_h; + bus_internal_rv_mtimecmp_h_cp : coverpoint bus_event { + bins wr_rd[] = (AHB_WR, APB_WR => IDLE [*1:1000] => AHB_RD, APB_RD); + ignore_bins dont_care = {IDLE, 4'hf, (APB_RD | APB_WR), (AHB_RD | AHB_WR)}; + } + endgroup + + // ----------------------- COVERGROUP intr_brf_global_intr_en_r ----------------------- + covergroup soc_ifc_intr_brf_global_intr_en_r_cg (ref logic [3:0] bus_event) @(posedge clk); + intr_brf_global_intr_en_r_cp : coverpoint i_soc_ifc_reg.field_storage.intr_block_rf.global_intr_en_r; + bus_intr_brf_global_intr_en_r_cp : coverpoint bus_event { + bins wr_rd[] = (AHB_WR, APB_WR => IDLE [*1:1000] => AHB_RD, APB_RD); + ignore_bins dont_care = {IDLE, 4'hf, (APB_RD | APB_WR), (AHB_RD | AHB_WR)}; + } + endgroup + + // ----------------------- COVERGROUP intr_brf_error_intr_en_r ----------------------- + covergroup soc_ifc_intr_brf_error_intr_en_r_cg (ref logic [3:0] bus_event) @(posedge clk); + intr_brf_error_intr_en_r_cp : coverpoint i_soc_ifc_reg.field_storage.intr_block_rf.error_intr_en_r; + bus_intr_brf_error_intr_en_r_cp : coverpoint bus_event { + bins wr_rd[] = (AHB_WR, APB_WR => IDLE [*1:1000] => AHB_RD, APB_RD); + ignore_bins dont_care = {IDLE, 4'hf, (APB_RD | APB_WR), (AHB_RD | AHB_WR)}; + } + endgroup + + // ----------------------- COVERGROUP intr_brf_notif_intr_en_r ----------------------- + covergroup soc_ifc_intr_brf_notif_intr_en_r_cg (ref logic [3:0] bus_event) @(posedge clk); + intr_brf_notif_intr_en_r_cp : coverpoint i_soc_ifc_reg.field_storage.intr_block_rf.notif_intr_en_r; + bus_intr_brf_notif_intr_en_r_cp : coverpoint bus_event { + bins wr_rd[] = (AHB_WR, APB_WR => IDLE [*1:1000] => AHB_RD, APB_RD); + ignore_bins dont_care = {IDLE, 4'hf, (APB_RD | APB_WR), (AHB_RD | AHB_WR)}; + } + endgroup + + // ----------------------- COVERGROUP intr_brf_error_global_intr_r ----------------------- + covergroup soc_ifc_intr_brf_error_global_intr_r_cg (ref logic [3:0] bus_event) @(posedge clk); + intr_brf_error_global_intr_r_cp : coverpoint i_soc_ifc_reg.field_storage.intr_block_rf.error_global_intr_r; + bus_intr_brf_error_global_intr_r_cp : coverpoint bus_event { + bins wr_rd[] = (AHB_WR, APB_WR => IDLE [*1:1000] => AHB_RD, APB_RD); + ignore_bins dont_care = {IDLE, 4'hf, (APB_RD | APB_WR), (AHB_RD | AHB_WR)}; + } + endgroup + + // ----------------------- COVERGROUP intr_brf_notif_global_intr_r ----------------------- + covergroup soc_ifc_intr_brf_notif_global_intr_r_cg (ref logic [3:0] bus_event) @(posedge clk); + intr_brf_notif_global_intr_r_cp : coverpoint i_soc_ifc_reg.field_storage.intr_block_rf.notif_global_intr_r; + bus_intr_brf_notif_global_intr_r_cp : coverpoint bus_event { + bins wr_rd[] = (AHB_WR, APB_WR => IDLE [*1:1000] => AHB_RD, APB_RD); + ignore_bins dont_care = {IDLE, 4'hf, (APB_RD | APB_WR), (AHB_RD | AHB_WR)}; + } + endgroup + + // ----------------------- COVERGROUP intr_brf_error_internal_intr_r ----------------------- + covergroup soc_ifc_intr_brf_error_internal_intr_r_cg (ref logic [3:0] bus_event) @(posedge clk); + intr_brf_error_internal_intr_r_cp : coverpoint i_soc_ifc_reg.field_storage.intr_block_rf.error_internal_intr_r; + bus_intr_brf_error_internal_intr_r_cp : coverpoint bus_event { + bins wr_rd[] = (AHB_WR, APB_WR => IDLE [*1:1000] => AHB_RD, APB_RD); + ignore_bins dont_care = {IDLE, 4'hf, (APB_RD | APB_WR), (AHB_RD | AHB_WR)}; + } + endgroup + + // ----------------------- COVERGROUP intr_brf_notif_internal_intr_r ----------------------- + covergroup soc_ifc_intr_brf_notif_internal_intr_r_cg (ref logic [3:0] bus_event) @(posedge clk); + intr_brf_notif_internal_intr_r_cp : coverpoint i_soc_ifc_reg.field_storage.intr_block_rf.notif_internal_intr_r; + bus_intr_brf_notif_internal_intr_r_cp : coverpoint bus_event { + bins wr_rd[] = (AHB_WR, APB_WR => IDLE [*1:1000] => AHB_RD, APB_RD); + ignore_bins dont_care = {IDLE, 4'hf, (APB_RD | APB_WR), (AHB_RD | AHB_WR)}; + } + endgroup + + // ----------------------- COVERGROUP intr_brf_error_intr_trig_r ----------------------- + covergroup soc_ifc_intr_brf_error_intr_trig_r_cg (ref logic [3:0] bus_event) @(posedge clk); + intr_brf_error_intr_trig_r_cp : coverpoint i_soc_ifc_reg.field_storage.intr_block_rf.error_intr_trig_r; + bus_intr_brf_error_intr_trig_r_cp : coverpoint bus_event { + bins wr_rd[] = (AHB_WR, APB_WR => IDLE [*1:1000] => AHB_RD, APB_RD); + ignore_bins dont_care = {IDLE, 4'hf, (APB_RD | APB_WR), (AHB_RD | AHB_WR)}; + } + endgroup + + // ----------------------- COVERGROUP intr_brf_notif_intr_trig_r ----------------------- + covergroup soc_ifc_intr_brf_notif_intr_trig_r_cg (ref logic [3:0] bus_event) @(posedge clk); + intr_brf_notif_intr_trig_r_cp : coverpoint i_soc_ifc_reg.field_storage.intr_block_rf.notif_intr_trig_r; + bus_intr_brf_notif_intr_trig_r_cp : coverpoint bus_event { + bins wr_rd[] = (AHB_WR, APB_WR => IDLE [*1:1000] => AHB_RD, APB_RD); + ignore_bins dont_care = {IDLE, 4'hf, (APB_RD | APB_WR), (AHB_RD | AHB_WR)}; + } + endgroup + + // ----------------------- COVERGROUP intr_brf_error_internal_intr_count_r ----------------------- + covergroup soc_ifc_intr_brf_error_internal_intr_count_r_cg (ref logic [3:0] bus_event) @(posedge clk); + intr_brf_error_internal_intr_count_r_cp : coverpoint i_soc_ifc_reg.field_storage.intr_block_rf.error_internal_intr_count_r; + bus_intr_brf_error_internal_intr_count_r_cp : coverpoint bus_event { + bins wr_rd[] = (AHB_WR, APB_WR => IDLE [*1:1000] => AHB_RD, APB_RD); + ignore_bins dont_care = {IDLE, 4'hf, (APB_RD | APB_WR), (AHB_RD | AHB_WR)}; + } + endgroup + + // ----------------------- COVERGROUP intr_brf_error_inv_dev_intr_count_r ----------------------- + covergroup soc_ifc_intr_brf_error_inv_dev_intr_count_r_cg (ref logic [3:0] bus_event) @(posedge clk); + intr_brf_error_inv_dev_intr_count_r_cp : coverpoint i_soc_ifc_reg.field_storage.intr_block_rf.error_inv_dev_intr_count_r; + bus_intr_brf_error_inv_dev_intr_count_r_cp : coverpoint bus_event { + bins wr_rd[] = (AHB_WR, APB_WR => IDLE [*1:1000] => AHB_RD, APB_RD); + ignore_bins dont_care = {IDLE, 4'hf, (APB_RD | APB_WR), (AHB_RD | AHB_WR)}; + } + endgroup + + // ----------------------- COVERGROUP intr_brf_error_cmd_fail_intr_count_r ----------------------- + covergroup soc_ifc_intr_brf_error_cmd_fail_intr_count_r_cg (ref logic [3:0] bus_event) @(posedge clk); + intr_brf_error_cmd_fail_intr_count_r_cp : coverpoint i_soc_ifc_reg.field_storage.intr_block_rf.error_cmd_fail_intr_count_r; + bus_intr_brf_error_cmd_fail_intr_count_r_cp : coverpoint bus_event { + bins wr_rd[] = (AHB_WR, APB_WR => IDLE [*1:1000] => AHB_RD, APB_RD); + ignore_bins dont_care = {IDLE, 4'hf, (APB_RD | APB_WR), (AHB_RD | AHB_WR)}; + } + endgroup + + // ----------------------- COVERGROUP intr_brf_error_bad_fuse_intr_count_r ----------------------- + covergroup soc_ifc_intr_brf_error_bad_fuse_intr_count_r_cg (ref logic [3:0] bus_event) @(posedge clk); + intr_brf_error_bad_fuse_intr_count_r_cp : coverpoint i_soc_ifc_reg.field_storage.intr_block_rf.error_bad_fuse_intr_count_r; + bus_intr_brf_error_bad_fuse_intr_count_r_cp : coverpoint bus_event { + bins wr_rd[] = (AHB_WR, APB_WR => IDLE [*1:1000] => AHB_RD, APB_RD); + ignore_bins dont_care = {IDLE, 4'hf, (APB_RD | APB_WR), (AHB_RD | AHB_WR)}; + } + endgroup + + // ----------------------- COVERGROUP intr_brf_error_iccm_blocked_intr_count_r ----------------------- + covergroup soc_ifc_intr_brf_error_iccm_blocked_intr_count_r_cg (ref logic [3:0] bus_event) @(posedge clk); + intr_brf_error_iccm_blocked_intr_count_r_cp : coverpoint i_soc_ifc_reg.field_storage.intr_block_rf.error_iccm_blocked_intr_count_r; + bus_intr_brf_error_iccm_blocked_intr_count_r_cp : coverpoint bus_event { + bins wr_rd[] = (AHB_WR, APB_WR => IDLE [*1:1000] => AHB_RD, APB_RD); + ignore_bins dont_care = {IDLE, 4'hf, (APB_RD | APB_WR), (AHB_RD | AHB_WR)}; + } + endgroup + + // ----------------------- COVERGROUP intr_brf_error_mbox_ecc_unc_intr_count_r ----------------------- + covergroup soc_ifc_intr_brf_error_mbox_ecc_unc_intr_count_r_cg (ref logic [3:0] bus_event) @(posedge clk); + intr_brf_error_mbox_ecc_unc_intr_count_r_cp : coverpoint i_soc_ifc_reg.field_storage.intr_block_rf.error_mbox_ecc_unc_intr_count_r; + bus_intr_brf_error_mbox_ecc_unc_intr_count_r_cp : coverpoint bus_event { + bins wr_rd[] = (AHB_WR, APB_WR => IDLE [*1:1000] => AHB_RD, APB_RD); + ignore_bins dont_care = {IDLE, 4'hf, (APB_RD | APB_WR), (AHB_RD | AHB_WR)}; + } + endgroup + + // ----------------------- COVERGROUP intr_brf_error_wdt_timer1_timeout_intr_count_r ----------------------- + covergroup soc_ifc_intr_brf_error_wdt_timer1_timeout_intr_count_r_cg (ref logic [3:0] bus_event) @(posedge clk); + intr_brf_error_wdt_timer1_timeout_intr_count_r_cp : coverpoint i_soc_ifc_reg.field_storage.intr_block_rf.error_wdt_timer1_timeout_intr_count_r; + bus_intr_brf_error_wdt_timer1_timeout_intr_count_r_cp : coverpoint bus_event { + bins wr_rd[] = (AHB_WR, APB_WR => IDLE [*1:1000] => AHB_RD, APB_RD); + ignore_bins dont_care = {IDLE, 4'hf, (APB_RD | APB_WR), (AHB_RD | AHB_WR)}; + } + endgroup + + // ----------------------- COVERGROUP intr_brf_error_wdt_timer2_timeout_intr_count_r ----------------------- + covergroup soc_ifc_intr_brf_error_wdt_timer2_timeout_intr_count_r_cg (ref logic [3:0] bus_event) @(posedge clk); + intr_brf_error_wdt_timer2_timeout_intr_count_r_cp : coverpoint i_soc_ifc_reg.field_storage.intr_block_rf.error_wdt_timer2_timeout_intr_count_r; + bus_intr_brf_error_wdt_timer2_timeout_intr_count_r_cp : coverpoint bus_event { + bins wr_rd[] = (AHB_WR, APB_WR => IDLE [*1:1000] => AHB_RD, APB_RD); + ignore_bins dont_care = {IDLE, 4'hf, (APB_RD | APB_WR), (AHB_RD | AHB_WR)}; + } + endgroup + + // ----------------------- COVERGROUP intr_brf_notif_cmd_avail_intr_count_r ----------------------- + covergroup soc_ifc_intr_brf_notif_cmd_avail_intr_count_r_cg (ref logic [3:0] bus_event) @(posedge clk); + intr_brf_notif_cmd_avail_intr_count_r_cp : coverpoint i_soc_ifc_reg.field_storage.intr_block_rf.notif_cmd_avail_intr_count_r; + bus_intr_brf_notif_cmd_avail_intr_count_r_cp : coverpoint bus_event { + bins wr_rd[] = (AHB_WR, APB_WR => IDLE [*1:1000] => AHB_RD, APB_RD); + ignore_bins dont_care = {IDLE, 4'hf, (APB_RD | APB_WR), (AHB_RD | AHB_WR)}; + } + endgroup + + // ----------------------- COVERGROUP intr_brf_notif_mbox_ecc_cor_intr_count_r ----------------------- + covergroup soc_ifc_intr_brf_notif_mbox_ecc_cor_intr_count_r_cg (ref logic [3:0] bus_event) @(posedge clk); + intr_brf_notif_mbox_ecc_cor_intr_count_r_cp : coverpoint i_soc_ifc_reg.field_storage.intr_block_rf.notif_mbox_ecc_cor_intr_count_r; + bus_intr_brf_notif_mbox_ecc_cor_intr_count_r_cp : coverpoint bus_event { + bins wr_rd[] = (AHB_WR, APB_WR => IDLE [*1:1000] => AHB_RD, APB_RD); + ignore_bins dont_care = {IDLE, 4'hf, (APB_RD | APB_WR), (AHB_RD | AHB_WR)}; + } + endgroup + + // ----------------------- COVERGROUP intr_brf_notif_debug_locked_intr_count_r ----------------------- + covergroup soc_ifc_intr_brf_notif_debug_locked_intr_count_r_cg (ref logic [3:0] bus_event) @(posedge clk); + intr_brf_notif_debug_locked_intr_count_r_cp : coverpoint i_soc_ifc_reg.field_storage.intr_block_rf.notif_debug_locked_intr_count_r; + bus_intr_brf_notif_debug_locked_intr_count_r_cp : coverpoint bus_event { + bins wr_rd[] = (AHB_WR, APB_WR => IDLE [*1:1000] => AHB_RD, APB_RD); + ignore_bins dont_care = {IDLE, 4'hf, (APB_RD | APB_WR), (AHB_RD | AHB_WR)}; + } + endgroup + + // ----------------------- COVERGROUP intr_brf_notif_scan_mode_intr_count_r ----------------------- + covergroup soc_ifc_intr_brf_notif_scan_mode_intr_count_r_cg (ref logic [3:0] bus_event) @(posedge clk); + intr_brf_notif_scan_mode_intr_count_r_cp : coverpoint i_soc_ifc_reg.field_storage.intr_block_rf.notif_scan_mode_intr_count_r; + bus_intr_brf_notif_scan_mode_intr_count_r_cp : coverpoint bus_event { + bins wr_rd[] = (AHB_WR, APB_WR => IDLE [*1:1000] => AHB_RD, APB_RD); + ignore_bins dont_care = {IDLE, 4'hf, (APB_RD | APB_WR), (AHB_RD | AHB_WR)}; + } + endgroup + + // ----------------------- COVERGROUP intr_brf_notif_soc_req_lock_intr_count_r ----------------------- + covergroup soc_ifc_intr_brf_notif_soc_req_lock_intr_count_r_cg (ref logic [3:0] bus_event) @(posedge clk); + intr_brf_notif_soc_req_lock_intr_count_r_cp : coverpoint i_soc_ifc_reg.field_storage.intr_block_rf.notif_soc_req_lock_intr_count_r; + bus_intr_brf_notif_soc_req_lock_intr_count_r_cp : coverpoint bus_event { + bins wr_rd[] = (AHB_WR, APB_WR => IDLE [*1:1000] => AHB_RD, APB_RD); + ignore_bins dont_care = {IDLE, 4'hf, (APB_RD | APB_WR), (AHB_RD | AHB_WR)}; + } + endgroup + + // ----------------------- COVERGROUP intr_brf_notif_gen_in_toggle_intr_count_r ----------------------- + covergroup soc_ifc_intr_brf_notif_gen_in_toggle_intr_count_r_cg (ref logic [3:0] bus_event) @(posedge clk); + intr_brf_notif_gen_in_toggle_intr_count_r_cp : coverpoint i_soc_ifc_reg.field_storage.intr_block_rf.notif_gen_in_toggle_intr_count_r; + bus_intr_brf_notif_gen_in_toggle_intr_count_r_cp : coverpoint bus_event { + bins wr_rd[] = (AHB_WR, APB_WR => IDLE [*1:1000] => AHB_RD, APB_RD); + ignore_bins dont_care = {IDLE, 4'hf, (APB_RD | APB_WR), (AHB_RD | AHB_WR)}; + } + endgroup + + // ----------------------- COVERGROUP intr_brf_error_internal_intr_count_incr_r ----------------------- + covergroup soc_ifc_intr_brf_error_internal_intr_count_incr_r_cg (ref logic [3:0] bus_event) @(posedge clk); + intr_brf_error_internal_intr_count_incr_r_cp : coverpoint i_soc_ifc_reg.field_storage.intr_block_rf.error_internal_intr_count_incr_r; + bus_intr_brf_error_internal_intr_count_incr_r_cp : coverpoint bus_event { + bins wr_rd[] = (AHB_WR, APB_WR => IDLE [*1:1000] => AHB_RD, APB_RD); + ignore_bins dont_care = {IDLE, 4'hf, (APB_RD | APB_WR), (AHB_RD | AHB_WR)}; + } + endgroup + + // ----------------------- COVERGROUP intr_brf_error_inv_dev_intr_count_incr_r ----------------------- + covergroup soc_ifc_intr_brf_error_inv_dev_intr_count_incr_r_cg (ref logic [3:0] bus_event) @(posedge clk); + intr_brf_error_inv_dev_intr_count_incr_r_cp : coverpoint i_soc_ifc_reg.field_storage.intr_block_rf.error_inv_dev_intr_count_incr_r; + bus_intr_brf_error_inv_dev_intr_count_incr_r_cp : coverpoint bus_event { + bins wr_rd[] = (AHB_WR, APB_WR => IDLE [*1:1000] => AHB_RD, APB_RD); + ignore_bins dont_care = {IDLE, 4'hf, (APB_RD | APB_WR), (AHB_RD | AHB_WR)}; + } + endgroup + + // ----------------------- COVERGROUP intr_brf_error_cmd_fail_intr_count_incr_r ----------------------- + covergroup soc_ifc_intr_brf_error_cmd_fail_intr_count_incr_r_cg (ref logic [3:0] bus_event) @(posedge clk); + intr_brf_error_cmd_fail_intr_count_incr_r_cp : coverpoint i_soc_ifc_reg.field_storage.intr_block_rf.error_cmd_fail_intr_count_incr_r; + bus_intr_brf_error_cmd_fail_intr_count_incr_r_cp : coverpoint bus_event { + bins wr_rd[] = (AHB_WR, APB_WR => IDLE [*1:1000] => AHB_RD, APB_RD); + ignore_bins dont_care = {IDLE, 4'hf, (APB_RD | APB_WR), (AHB_RD | AHB_WR)}; + } + endgroup + + // ----------------------- COVERGROUP intr_brf_error_bad_fuse_intr_count_incr_r ----------------------- + covergroup soc_ifc_intr_brf_error_bad_fuse_intr_count_incr_r_cg (ref logic [3:0] bus_event) @(posedge clk); + intr_brf_error_bad_fuse_intr_count_incr_r_cp : coverpoint i_soc_ifc_reg.field_storage.intr_block_rf.error_bad_fuse_intr_count_incr_r; + bus_intr_brf_error_bad_fuse_intr_count_incr_r_cp : coverpoint bus_event { + bins wr_rd[] = (AHB_WR, APB_WR => IDLE [*1:1000] => AHB_RD, APB_RD); + ignore_bins dont_care = {IDLE, 4'hf, (APB_RD | APB_WR), (AHB_RD | AHB_WR)}; + } + endgroup + + // ----------------------- COVERGROUP intr_brf_error_iccm_blocked_intr_count_incr_r ----------------------- + covergroup soc_ifc_intr_brf_error_iccm_blocked_intr_count_incr_r_cg (ref logic [3:0] bus_event) @(posedge clk); + intr_brf_error_iccm_blocked_intr_count_incr_r_cp : coverpoint i_soc_ifc_reg.field_storage.intr_block_rf.error_iccm_blocked_intr_count_incr_r; + bus_intr_brf_error_iccm_blocked_intr_count_incr_r_cp : coverpoint bus_event { + bins wr_rd[] = (AHB_WR, APB_WR => IDLE [*1:1000] => AHB_RD, APB_RD); + ignore_bins dont_care = {IDLE, 4'hf, (APB_RD | APB_WR), (AHB_RD | AHB_WR)}; + } + endgroup + + // ----------------------- COVERGROUP intr_brf_error_mbox_ecc_unc_intr_count_incr_r ----------------------- + covergroup soc_ifc_intr_brf_error_mbox_ecc_unc_intr_count_incr_r_cg (ref logic [3:0] bus_event) @(posedge clk); + intr_brf_error_mbox_ecc_unc_intr_count_incr_r_cp : coverpoint i_soc_ifc_reg.field_storage.intr_block_rf.error_mbox_ecc_unc_intr_count_incr_r; + bus_intr_brf_error_mbox_ecc_unc_intr_count_incr_r_cp : coverpoint bus_event { + bins wr_rd[] = (AHB_WR, APB_WR => IDLE [*1:1000] => AHB_RD, APB_RD); + ignore_bins dont_care = {IDLE, 4'hf, (APB_RD | APB_WR), (AHB_RD | AHB_WR)}; + } + endgroup + + // ----------------------- COVERGROUP intr_brf_error_wdt_timer1_timeout_intr_count_incr_r ----------------------- + covergroup soc_ifc_intr_brf_error_wdt_timer1_timeout_intr_count_incr_r_cg (ref logic [3:0] bus_event) @(posedge clk); + intr_brf_error_wdt_timer1_timeout_intr_count_incr_r_cp : coverpoint i_soc_ifc_reg.field_storage.intr_block_rf.error_wdt_timer1_timeout_intr_count_incr_r; + bus_intr_brf_error_wdt_timer1_timeout_intr_count_incr_r_cp : coverpoint bus_event { + bins wr_rd[] = (AHB_WR, APB_WR => IDLE [*1:1000] => AHB_RD, APB_RD); + ignore_bins dont_care = {IDLE, 4'hf, (APB_RD | APB_WR), (AHB_RD | AHB_WR)}; + } + endgroup + + // ----------------------- COVERGROUP intr_brf_error_wdt_timer2_timeout_intr_count_incr_r ----------------------- + covergroup soc_ifc_intr_brf_error_wdt_timer2_timeout_intr_count_incr_r_cg (ref logic [3:0] bus_event) @(posedge clk); + intr_brf_error_wdt_timer2_timeout_intr_count_incr_r_cp : coverpoint i_soc_ifc_reg.field_storage.intr_block_rf.error_wdt_timer2_timeout_intr_count_incr_r; + bus_intr_brf_error_wdt_timer2_timeout_intr_count_incr_r_cp : coverpoint bus_event { + bins wr_rd[] = (AHB_WR, APB_WR => IDLE [*1:1000] => AHB_RD, APB_RD); + ignore_bins dont_care = {IDLE, 4'hf, (APB_RD | APB_WR), (AHB_RD | AHB_WR)}; + } + endgroup + + // ----------------------- COVERGROUP intr_brf_notif_cmd_avail_intr_count_incr_r ----------------------- + covergroup soc_ifc_intr_brf_notif_cmd_avail_intr_count_incr_r_cg (ref logic [3:0] bus_event) @(posedge clk); + intr_brf_notif_cmd_avail_intr_count_incr_r_cp : coverpoint i_soc_ifc_reg.field_storage.intr_block_rf.notif_cmd_avail_intr_count_incr_r; + bus_intr_brf_notif_cmd_avail_intr_count_incr_r_cp : coverpoint bus_event { + bins wr_rd[] = (AHB_WR, APB_WR => IDLE [*1:1000] => AHB_RD, APB_RD); + ignore_bins dont_care = {IDLE, 4'hf, (APB_RD | APB_WR), (AHB_RD | AHB_WR)}; + } + endgroup + + // ----------------------- COVERGROUP intr_brf_notif_mbox_ecc_cor_intr_count_incr_r ----------------------- + covergroup soc_ifc_intr_brf_notif_mbox_ecc_cor_intr_count_incr_r_cg (ref logic [3:0] bus_event) @(posedge clk); + intr_brf_notif_mbox_ecc_cor_intr_count_incr_r_cp : coverpoint i_soc_ifc_reg.field_storage.intr_block_rf.notif_mbox_ecc_cor_intr_count_incr_r; + bus_intr_brf_notif_mbox_ecc_cor_intr_count_incr_r_cp : coverpoint bus_event { + bins wr_rd[] = (AHB_WR, APB_WR => IDLE [*1:1000] => AHB_RD, APB_RD); + ignore_bins dont_care = {IDLE, 4'hf, (APB_RD | APB_WR), (AHB_RD | AHB_WR)}; + } + endgroup + + // ----------------------- COVERGROUP intr_brf_notif_debug_locked_intr_count_incr_r ----------------------- + covergroup soc_ifc_intr_brf_notif_debug_locked_intr_count_incr_r_cg (ref logic [3:0] bus_event) @(posedge clk); + intr_brf_notif_debug_locked_intr_count_incr_r_cp : coverpoint i_soc_ifc_reg.field_storage.intr_block_rf.notif_debug_locked_intr_count_incr_r; + bus_intr_brf_notif_debug_locked_intr_count_incr_r_cp : coverpoint bus_event { + bins wr_rd[] = (AHB_WR, APB_WR => IDLE [*1:1000] => AHB_RD, APB_RD); + ignore_bins dont_care = {IDLE, 4'hf, (APB_RD | APB_WR), (AHB_RD | AHB_WR)}; + } + endgroup + + // ----------------------- COVERGROUP intr_brf_notif_soc_req_lock_intr_count_incr_r ----------------------- + covergroup soc_ifc_intr_brf_notif_soc_req_lock_intr_count_incr_r_cg (ref logic [3:0] bus_event) @(posedge clk); + intr_brf_notif_soc_req_lock_intr_count_incr_r_cp : coverpoint i_soc_ifc_reg.field_storage.intr_block_rf.notif_soc_req_lock_intr_count_incr_r; + bus_intr_brf_notif_soc_req_lock_intr_count_incr_r_cp : coverpoint bus_event { + bins wr_rd[] = (AHB_WR, APB_WR => IDLE [*1:1000] => AHB_RD, APB_RD); + ignore_bins dont_care = {IDLE, 4'hf, (APB_RD | APB_WR), (AHB_RD | AHB_WR)}; + } + endgroup + + + // ----------------------- COVERGROUP Instantiations ----------------------- + + soc_ifc_CPTRA_HW_ERROR_FATAL_cg CPTRA_HW_ERROR_FATAL_cg = new(bus_CPTRA_HW_ERROR_FATAL); + soc_ifc_CPTRA_HW_ERROR_NON_FATAL_cg CPTRA_HW_ERROR_NON_FATAL_cg = new(bus_CPTRA_HW_ERROR_NON_FATAL); + soc_ifc_CPTRA_FW_ERROR_FATAL_cg CPTRA_FW_ERROR_FATAL_cg = new(bus_CPTRA_FW_ERROR_FATAL); + soc_ifc_CPTRA_FW_ERROR_NON_FATAL_cg CPTRA_FW_ERROR_NON_FATAL_cg = new(bus_CPTRA_FW_ERROR_NON_FATAL); + soc_ifc_CPTRA_HW_ERROR_ENC_cg CPTRA_HW_ERROR_ENC_cg = new(bus_CPTRA_HW_ERROR_ENC); + soc_ifc_CPTRA_FW_ERROR_ENC_cg CPTRA_FW_ERROR_ENC_cg = new(bus_CPTRA_FW_ERROR_ENC); + soc_ifc_CPTRA_FW_EXTENDED_ERROR_INFO_cg CPTRA_FW_EXTENDED_ERROR_INFO_cg = new(bus_CPTRA_FW_EXTENDED_ERROR_INFO); + soc_ifc_CPTRA_BOOT_STATUS_cg CPTRA_BOOT_STATUS_cg = new(bus_CPTRA_BOOT_STATUS); + soc_ifc_CPTRA_FLOW_STATUS_cg CPTRA_FLOW_STATUS_cg = new(bus_CPTRA_FLOW_STATUS); + soc_ifc_CPTRA_RESET_REASON_cg CPTRA_RESET_REASON_cg = new(bus_CPTRA_RESET_REASON); + // soc_ifc_CPTRA_SECURITY_STATE_cg CPTRA_SECURITY_STATE_cg = new(bus_CPTRA_SECURITY_STATE); + soc_ifc_CPTRA_MBOX_VALID_PAUSER_cg CPTRA_MBOX_VALID_PAUSER_cg = new(bus_CPTRA_MBOX_VALID_PAUSER); + soc_ifc_CPTRA_MBOX_PAUSER_LOCK_cg CPTRA_MBOX_PAUSER_LOCK_cg = new(bus_CPTRA_MBOX_PAUSER_LOCK); + soc_ifc_CPTRA_TRNG_VALID_PAUSER_cg CPTRA_TRNG_VALID_PAUSER_cg = new(bus_CPTRA_TRNG_VALID_PAUSER); + soc_ifc_CPTRA_TRNG_PAUSER_LOCK_cg CPTRA_TRNG_PAUSER_LOCK_cg = new(bus_CPTRA_TRNG_PAUSER_LOCK); + soc_ifc_CPTRA_TRNG_DATA_cg CPTRA_TRNG_DATA_cg = new(bus_CPTRA_TRNG_DATA); + soc_ifc_CPTRA_TRNG_CTRL_cg CPTRA_TRNG_CTRL_cg = new(bus_CPTRA_TRNG_CTRL); + soc_ifc_CPTRA_TRNG_STATUS_cg CPTRA_TRNG_STATUS_cg = new(bus_CPTRA_TRNG_STATUS); + soc_ifc_CPTRA_FUSE_WR_DONE_cg CPTRA_FUSE_WR_DONE_cg = new(bus_CPTRA_FUSE_WR_DONE); + soc_ifc_CPTRA_TIMER_CONFIG_cg CPTRA_TIMER_CONFIG_cg = new(bus_CPTRA_TIMER_CONFIG); + soc_ifc_CPTRA_BOOTFSM_GO_cg CPTRA_BOOTFSM_GO_cg = new(bus_CPTRA_BOOTFSM_GO); + soc_ifc_CPTRA_DBG_MANUF_SERVICE_REG_cg CPTRA_DBG_MANUF_SERVICE_REG_cg = new(bus_CPTRA_DBG_MANUF_SERVICE_REG); + soc_ifc_CPTRA_CLK_GATING_EN_cg CPTRA_CLK_GATING_EN_cg = new(bus_CPTRA_CLK_GATING_EN); + soc_ifc_CPTRA_GENERIC_INPUT_WIRES_cg CPTRA_GENERIC_INPUT_WIRES_cg = new(bus_CPTRA_GENERIC_INPUT_WIRES); + soc_ifc_CPTRA_GENERIC_OUTPUT_WIRES_cg CPTRA_GENERIC_OUTPUT_WIRES_cg = new(bus_CPTRA_GENERIC_OUTPUT_WIRES); + // soc_ifc_CPTRA_HW_REV_ID_cg CPTRA_HW_REV_ID_cg = new(bus_CPTRA_HW_REV_ID); + soc_ifc_CPTRA_FW_REV_ID_cg CPTRA_FW_REV_ID_cg = new(bus_CPTRA_FW_REV_ID); + // soc_ifc_CPTRA_HW_CONFIG_cg CPTRA_HW_CONFIG_cg = new(bus_CPTRA_HW_CONFIG); + soc_ifc_CPTRA_WDT_TIMER1_EN_cg CPTRA_WDT_TIMER1_EN_cg = new(bus_CPTRA_WDT_TIMER1_EN); + soc_ifc_CPTRA_WDT_TIMER1_CTRL_cg CPTRA_WDT_TIMER1_CTRL_cg = new(bus_CPTRA_WDT_TIMER1_CTRL); + soc_ifc_CPTRA_WDT_TIMER1_TIMEOUT_PERIOD_cg CPTRA_WDT_TIMER1_TIMEOUT_PERIOD_cg = new(bus_CPTRA_WDT_TIMER1_TIMEOUT_PERIOD); + soc_ifc_CPTRA_WDT_TIMER2_EN_cg CPTRA_WDT_TIMER2_EN_cg = new(bus_CPTRA_WDT_TIMER2_EN); + soc_ifc_CPTRA_WDT_TIMER2_CTRL_cg CPTRA_WDT_TIMER2_CTRL_cg = new(bus_CPTRA_WDT_TIMER2_CTRL); + soc_ifc_CPTRA_WDT_TIMER2_TIMEOUT_PERIOD_cg CPTRA_WDT_TIMER2_TIMEOUT_PERIOD_cg = new(bus_CPTRA_WDT_TIMER2_TIMEOUT_PERIOD); + soc_ifc_CPTRA_WDT_STATUS_cg CPTRA_WDT_STATUS_cg = new(bus_CPTRA_WDT_STATUS); + soc_ifc_CPTRA_FUSE_VALID_PAUSER_cg CPTRA_FUSE_VALID_PAUSER_cg = new(bus_CPTRA_FUSE_VALID_PAUSER); + soc_ifc_CPTRA_FUSE_PAUSER_LOCK_cg CPTRA_FUSE_PAUSER_LOCK_cg = new(bus_CPTRA_FUSE_PAUSER_LOCK); + soc_ifc_CPTRA_WDT_CFG_cg CPTRA_WDT_CFG_cg = new(bus_CPTRA_WDT_CFG); + soc_ifc_CPTRA_iTRNG_ENTROPY_CONFIG_0_cg CPTRA_iTRNG_ENTROPY_CONFIG_0_cg = new(bus_CPTRA_iTRNG_ENTROPY_CONFIG_0); + soc_ifc_CPTRA_iTRNG_ENTROPY_CONFIG_1_cg CPTRA_iTRNG_ENTROPY_CONFIG_1_cg = new(bus_CPTRA_iTRNG_ENTROPY_CONFIG_1); + soc_ifc_CPTRA_RSVD_REG_cg CPTRA_RSVD_REG_cg = new(bus_CPTRA_RSVD_REG); + soc_ifc_fuse_uds_seed_cg fuse_uds_seed_cg = new(bus_fuse_uds_seed); + soc_ifc_fuse_field_entropy_cg fuse_field_entropy_cg = new(bus_fuse_field_entropy); + soc_ifc_fuse_key_manifest_pk_hash_cg fuse_key_manifest_pk_hash_cg = new(bus_fuse_key_manifest_pk_hash); + soc_ifc_fuse_key_manifest_pk_hash_mask_cg fuse_key_manifest_pk_hash_mask_cg = new(bus_fuse_key_manifest_pk_hash_mask); + soc_ifc_fuse_owner_pk_hash_cg fuse_owner_pk_hash_cg = new(bus_fuse_owner_pk_hash); + soc_ifc_fuse_fmc_key_manifest_svn_cg fuse_fmc_key_manifest_svn_cg = new(bus_fuse_fmc_key_manifest_svn); + soc_ifc_fuse_runtime_svn_cg fuse_runtime_svn_cg = new(bus_fuse_runtime_svn); + soc_ifc_fuse_anti_rollback_disable_cg fuse_anti_rollback_disable_cg = new(bus_fuse_anti_rollback_disable); + soc_ifc_fuse_idevid_cert_attr_cg fuse_idevid_cert_attr_cg = new(bus_fuse_idevid_cert_attr); + soc_ifc_fuse_idevid_manuf_hsm_id_cg fuse_idevid_manuf_hsm_id_cg = new(bus_fuse_idevid_manuf_hsm_id); + soc_ifc_fuse_life_cycle_cg fuse_life_cycle_cg = new(bus_fuse_life_cycle); + soc_ifc_fuse_lms_verify_cg fuse_lms_verify_cg = new(bus_fuse_lms_verify); + soc_ifc_fuse_lms_revocation_cg fuse_lms_revocation_cg = new(bus_fuse_lms_revocation); + soc_ifc_fuse_soc_stepping_id_cg fuse_soc_stepping_id_cg = new(bus_fuse_soc_stepping_id); + soc_ifc_internal_obf_key_cg internal_obf_key_cg = new(bus_internal_obf_key); + soc_ifc_internal_iccm_lock_cg internal_iccm_lock_cg = new(bus_internal_iccm_lock); + soc_ifc_internal_fw_update_reset_cg internal_fw_update_reset_cg = new(bus_internal_fw_update_reset); + soc_ifc_internal_fw_update_reset_wait_cycles_cg internal_fw_update_reset_wait_cycles_cg = new(bus_internal_fw_update_reset_wait_cycles); + soc_ifc_internal_nmi_vector_cg internal_nmi_vector_cg = new(bus_internal_nmi_vector); + soc_ifc_internal_hw_error_fatal_mask_cg internal_hw_error_fatal_mask_cg = new(bus_internal_hw_error_fatal_mask); + soc_ifc_internal_hw_error_non_fatal_mask_cg internal_hw_error_non_fatal_mask_cg = new(bus_internal_hw_error_non_fatal_mask); + soc_ifc_internal_fw_error_fatal_mask_cg internal_fw_error_fatal_mask_cg = new(bus_internal_fw_error_fatal_mask); + soc_ifc_internal_fw_error_non_fatal_mask_cg internal_fw_error_non_fatal_mask_cg = new(bus_internal_fw_error_non_fatal_mask); + soc_ifc_internal_rv_mtime_l_cg internal_rv_mtime_l_cg = new(bus_internal_rv_mtime_l); + soc_ifc_internal_rv_mtime_h_cg internal_rv_mtime_h_cg = new(bus_internal_rv_mtime_h); + soc_ifc_internal_rv_mtimecmp_l_cg internal_rv_mtimecmp_l_cg = new(bus_internal_rv_mtimecmp_l); + soc_ifc_internal_rv_mtimecmp_h_cg internal_rv_mtimecmp_h_cg = new(bus_internal_rv_mtimecmp_h); + soc_ifc_intr_brf_global_intr_en_r_cg intr_brf_global_intr_en_r_cg = new(bus_intr_brf_global_intr_en_r); + soc_ifc_intr_brf_error_intr_en_r_cg intr_brf_error_intr_en_r_cg = new(bus_intr_brf_error_intr_en_r); + soc_ifc_intr_brf_notif_intr_en_r_cg intr_brf_notif_intr_en_r_cg = new(bus_intr_brf_notif_intr_en_r); + soc_ifc_intr_brf_error_global_intr_r_cg intr_brf_error_global_intr_r_cg = new(bus_intr_brf_error_global_intr_r); + soc_ifc_intr_brf_notif_global_intr_r_cg intr_brf_notif_global_intr_r_cg = new(bus_intr_brf_notif_global_intr_r); + soc_ifc_intr_brf_error_internal_intr_r_cg intr_brf_error_internal_intr_r_cg = new(bus_intr_brf_error_internal_intr_r); + soc_ifc_intr_brf_notif_internal_intr_r_cg intr_brf_notif_internal_intr_r_cg = new(bus_intr_brf_notif_internal_intr_r); + soc_ifc_intr_brf_error_intr_trig_r_cg intr_brf_error_intr_trig_r_cg = new(bus_intr_brf_error_intr_trig_r); + soc_ifc_intr_brf_notif_intr_trig_r_cg intr_brf_notif_intr_trig_r_cg = new(bus_intr_brf_notif_intr_trig_r); + soc_ifc_intr_brf_error_internal_intr_count_r_cg intr_brf_error_internal_intr_count_r_cg = new(bus_intr_brf_error_internal_intr_count_r); + soc_ifc_intr_brf_error_inv_dev_intr_count_r_cg intr_brf_error_inv_dev_intr_count_r_cg = new(bus_intr_brf_error_inv_dev_intr_count_r); + soc_ifc_intr_brf_error_cmd_fail_intr_count_r_cg intr_brf_error_cmd_fail_intr_count_r_cg = new(bus_intr_brf_error_cmd_fail_intr_count_r); + soc_ifc_intr_brf_error_bad_fuse_intr_count_r_cg intr_brf_error_bad_fuse_intr_count_r_cg = new(bus_intr_brf_error_bad_fuse_intr_count_r); + soc_ifc_intr_brf_error_iccm_blocked_intr_count_r_cg intr_brf_error_iccm_blocked_intr_count_r_cg = new(bus_intr_brf_error_iccm_blocked_intr_count_r); + soc_ifc_intr_brf_error_mbox_ecc_unc_intr_count_r_cg intr_brf_error_mbox_ecc_unc_intr_count_r_cg = new(bus_intr_brf_error_mbox_ecc_unc_intr_count_r); + soc_ifc_intr_brf_error_wdt_timer1_timeout_intr_count_r_cg intr_brf_error_wdt_timer1_timeout_intr_count_r_cg = new(bus_intr_brf_error_wdt_timer1_timeout_intr_count_r); + soc_ifc_intr_brf_error_wdt_timer2_timeout_intr_count_r_cg intr_brf_error_wdt_timer2_timeout_intr_count_r_cg = new(bus_intr_brf_error_wdt_timer2_timeout_intr_count_r); + soc_ifc_intr_brf_notif_cmd_avail_intr_count_r_cg intr_brf_notif_cmd_avail_intr_count_r_cg = new(bus_intr_brf_notif_cmd_avail_intr_count_r); + soc_ifc_intr_brf_notif_mbox_ecc_cor_intr_count_r_cg intr_brf_notif_mbox_ecc_cor_intr_count_r_cg = new(bus_intr_brf_notif_mbox_ecc_cor_intr_count_r); + soc_ifc_intr_brf_notif_debug_locked_intr_count_r_cg intr_brf_notif_debug_locked_intr_count_r_cg = new(bus_intr_brf_notif_debug_locked_intr_count_r); + soc_ifc_intr_brf_notif_scan_mode_intr_count_r_cg intr_brf_notif_scan_mode_intr_count_r_cg = new(bus_intr_brf_notif_scan_mode_intr_count_r); + soc_ifc_intr_brf_notif_soc_req_lock_intr_count_r_cg intr_brf_notif_soc_req_lock_intr_count_r_cg = new(bus_intr_brf_notif_soc_req_lock_intr_count_r); + soc_ifc_intr_brf_notif_gen_in_toggle_intr_count_r_cg intr_brf_notif_gen_in_toggle_intr_count_r_cg = new(bus_intr_brf_notif_gen_in_toggle_intr_count_r); + soc_ifc_intr_brf_error_internal_intr_count_incr_r_cg intr_brf_error_internal_intr_count_incr_r_cg = new(bus_intr_brf_error_internal_intr_count_incr_r); + soc_ifc_intr_brf_error_inv_dev_intr_count_incr_r_cg intr_brf_error_inv_dev_intr_count_incr_r_cg = new(bus_intr_brf_error_inv_dev_intr_count_incr_r); + soc_ifc_intr_brf_error_cmd_fail_intr_count_incr_r_cg intr_brf_error_cmd_fail_intr_count_incr_r_cg = new(bus_intr_brf_error_cmd_fail_intr_count_incr_r); + soc_ifc_intr_brf_error_bad_fuse_intr_count_incr_r_cg intr_brf_error_bad_fuse_intr_count_incr_r_cg = new(bus_intr_brf_error_bad_fuse_intr_count_incr_r); + soc_ifc_intr_brf_error_iccm_blocked_intr_count_incr_r_cg intr_brf_error_iccm_blocked_intr_count_incr_r_cg = new(bus_intr_brf_error_iccm_blocked_intr_count_incr_r); + soc_ifc_intr_brf_error_mbox_ecc_unc_intr_count_incr_r_cg intr_brf_error_mbox_ecc_unc_intr_count_incr_r_cg = new(bus_intr_brf_error_mbox_ecc_unc_intr_count_incr_r); + soc_ifc_intr_brf_error_wdt_timer1_timeout_intr_count_incr_r_cg intr_brf_error_wdt_timer1_timeout_intr_count_incr_r_cg = new(bus_intr_brf_error_wdt_timer1_timeout_intr_count_incr_r); + soc_ifc_intr_brf_error_wdt_timer2_timeout_intr_count_incr_r_cg intr_brf_error_wdt_timer2_timeout_intr_count_incr_r_cg = new(bus_intr_brf_error_wdt_timer2_timeout_intr_count_incr_r); + soc_ifc_intr_brf_notif_cmd_avail_intr_count_incr_r_cg intr_brf_notif_cmd_avail_intr_count_incr_r_cg = new(bus_intr_brf_notif_cmd_avail_intr_count_incr_r); + soc_ifc_intr_brf_notif_mbox_ecc_cor_intr_count_incr_r_cg intr_brf_notif_mbox_ecc_cor_intr_count_incr_r_cg = new(bus_intr_brf_notif_mbox_ecc_cor_intr_count_incr_r); + soc_ifc_intr_brf_notif_debug_locked_intr_count_incr_r_cg intr_brf_notif_debug_locked_intr_count_incr_r_cg = new(bus_intr_brf_notif_debug_locked_intr_count_incr_r); + soc_ifc_intr_brf_notif_soc_req_lock_intr_count_incr_r_cg intr_brf_notif_soc_req_lock_intr_count_incr_r_cg = new(bus_intr_brf_notif_soc_req_lock_intr_count_incr_r); + + // ------------------------------------------------------------------- + // end SCRIPT_OUTPUT + // ------------------------------------------------------------------- endinterface -`endif \ No newline at end of file + +`endif + diff --git a/src/soc_ifc/rtl/caliptra_top_reg.h b/src/soc_ifc/rtl/caliptra_top_reg.h index 90c555aa1..e2c597f16 100644 --- a/src/soc_ifc/rtl/caliptra_top_reg.h +++ b/src/soc_ifc/rtl/caliptra_top_reg.h @@ -47,6 +47,8 @@ #define MBOX_CSR_MBOX_STATUS_MBOX_FSM_PS_MASK (0x1c0) #define MBOX_CSR_MBOX_STATUS_SOC_HAS_LOCK_LOW (9) #define MBOX_CSR_MBOX_STATUS_SOC_HAS_LOCK_MASK (0x200) +#define MBOX_CSR_MBOX_STATUS_MBOX_RDPTR_LOW (10) +#define MBOX_CSR_MBOX_STATUS_MBOX_RDPTR_MASK (0x1fffc00) #define CALIPTRA_TOP_REG_MBOX_CSR_MBOX_UNLOCK (0x30020020) #define MBOX_CSR_MBOX_UNLOCK (0x20) #define MBOX_CSR_MBOX_UNLOCK_UNLOCK_LOW (0) @@ -78,6 +80,8 @@ #define SHA512_ACC_CSR_STATUS (0x1c) #define SHA512_ACC_CSR_STATUS_VALID_LOW (0) #define SHA512_ACC_CSR_STATUS_VALID_MASK (0x1) +#define SHA512_ACC_CSR_STATUS_SOC_HAS_LOCK_LOW (1) +#define SHA512_ACC_CSR_STATUS_SOC_HAS_LOCK_MASK (0x2) #define CALIPTRA_TOP_REG_SHA512_ACC_CSR_DIGEST_0 (0x30021020) #define SHA512_ACC_CSR_DIGEST_0 (0x20) #define CALIPTRA_TOP_REG_SHA512_ACC_CSR_DIGEST_1 (0x30021024) @@ -117,8 +121,20 @@ #define CALIPTRA_TOP_REG_GENERIC_AND_FUSE_REG_BASE_ADDR (0x30030000) #define CALIPTRA_TOP_REG_GENERIC_AND_FUSE_REG_CPTRA_HW_ERROR_FATAL (0x30030000) #define GENERIC_AND_FUSE_REG_CPTRA_HW_ERROR_FATAL (0x0) +#define GENERIC_AND_FUSE_REG_CPTRA_HW_ERROR_FATAL_ICCM_ECC_UNC_LOW (0) +#define GENERIC_AND_FUSE_REG_CPTRA_HW_ERROR_FATAL_ICCM_ECC_UNC_MASK (0x1) +#define GENERIC_AND_FUSE_REG_CPTRA_HW_ERROR_FATAL_DCCM_ECC_UNC_LOW (1) +#define GENERIC_AND_FUSE_REG_CPTRA_HW_ERROR_FATAL_DCCM_ECC_UNC_MASK (0x2) +#define GENERIC_AND_FUSE_REG_CPTRA_HW_ERROR_FATAL_NMI_PIN_LOW (2) +#define GENERIC_AND_FUSE_REG_CPTRA_HW_ERROR_FATAL_NMI_PIN_MASK (0x4) #define CALIPTRA_TOP_REG_GENERIC_AND_FUSE_REG_CPTRA_HW_ERROR_NON_FATAL (0x30030004) #define GENERIC_AND_FUSE_REG_CPTRA_HW_ERROR_NON_FATAL (0x4) +#define GENERIC_AND_FUSE_REG_CPTRA_HW_ERROR_NON_FATAL_MBOX_PROT_NO_LOCK_LOW (0) +#define GENERIC_AND_FUSE_REG_CPTRA_HW_ERROR_NON_FATAL_MBOX_PROT_NO_LOCK_MASK (0x1) +#define GENERIC_AND_FUSE_REG_CPTRA_HW_ERROR_NON_FATAL_MBOX_PROT_OOO_LOW (1) +#define GENERIC_AND_FUSE_REG_CPTRA_HW_ERROR_NON_FATAL_MBOX_PROT_OOO_MASK (0x2) +#define GENERIC_AND_FUSE_REG_CPTRA_HW_ERROR_NON_FATAL_MBOX_ECC_UNC_LOW (2) +#define GENERIC_AND_FUSE_REG_CPTRA_HW_ERROR_NON_FATAL_MBOX_ECC_UNC_MASK (0x4) #define CALIPTRA_TOP_REG_GENERIC_AND_FUSE_REG_CPTRA_FW_ERROR_FATAL (0x30030008) #define GENERIC_AND_FUSE_REG_CPTRA_FW_ERROR_FATAL (0x8) #define CALIPTRA_TOP_REG_GENERIC_AND_FUSE_REG_CPTRA_FW_ERROR_NON_FATAL (0x3003000c) @@ -148,7 +164,11 @@ #define CALIPTRA_TOP_REG_GENERIC_AND_FUSE_REG_CPTRA_FLOW_STATUS (0x3003003c) #define GENERIC_AND_FUSE_REG_CPTRA_FLOW_STATUS (0x3c) #define GENERIC_AND_FUSE_REG_CPTRA_FLOW_STATUS_STATUS_LOW (0) -#define GENERIC_AND_FUSE_REG_CPTRA_FLOW_STATUS_STATUS_MASK (0xfffffff) +#define GENERIC_AND_FUSE_REG_CPTRA_FLOW_STATUS_STATUS_MASK (0xffffff) +#define GENERIC_AND_FUSE_REG_CPTRA_FLOW_STATUS_IDEVID_CSR_READY_LOW (24) +#define GENERIC_AND_FUSE_REG_CPTRA_FLOW_STATUS_IDEVID_CSR_READY_MASK (0x1000000) +#define GENERIC_AND_FUSE_REG_CPTRA_FLOW_STATUS_BOOT_FSM_PS_LOW (25) +#define GENERIC_AND_FUSE_REG_CPTRA_FLOW_STATUS_BOOT_FSM_PS_MASK (0xe000000) #define GENERIC_AND_FUSE_REG_CPTRA_FLOW_STATUS_READY_FOR_FW_LOW (28) #define GENERIC_AND_FUSE_REG_CPTRA_FLOW_STATUS_READY_FOR_FW_MASK (0x10000000) #define GENERIC_AND_FUSE_REG_CPTRA_FLOW_STATUS_READY_FOR_RUNTIME_LOW (29) @@ -233,80 +253,116 @@ #define GENERIC_AND_FUSE_REG_CPTRA_TRNG_DATA_10 (0xa0) #define CALIPTRA_TOP_REG_GENERIC_AND_FUSE_REG_CPTRA_TRNG_DATA_11 (0x300300a4) #define GENERIC_AND_FUSE_REG_CPTRA_TRNG_DATA_11 (0xa4) -#define CALIPTRA_TOP_REG_GENERIC_AND_FUSE_REG_CPTRA_TRNG_STATUS (0x300300a8) -#define GENERIC_AND_FUSE_REG_CPTRA_TRNG_STATUS (0xa8) +#define CALIPTRA_TOP_REG_GENERIC_AND_FUSE_REG_CPTRA_TRNG_CTRL (0x300300a8) +#define GENERIC_AND_FUSE_REG_CPTRA_TRNG_CTRL (0xa8) +#define GENERIC_AND_FUSE_REG_CPTRA_TRNG_CTRL_CLEAR_LOW (0) +#define GENERIC_AND_FUSE_REG_CPTRA_TRNG_CTRL_CLEAR_MASK (0x1) +#define CALIPTRA_TOP_REG_GENERIC_AND_FUSE_REG_CPTRA_TRNG_STATUS (0x300300ac) +#define GENERIC_AND_FUSE_REG_CPTRA_TRNG_STATUS (0xac) #define GENERIC_AND_FUSE_REG_CPTRA_TRNG_STATUS_DATA_REQ_LOW (0) #define GENERIC_AND_FUSE_REG_CPTRA_TRNG_STATUS_DATA_REQ_MASK (0x1) #define GENERIC_AND_FUSE_REG_CPTRA_TRNG_STATUS_DATA_WR_DONE_LOW (1) #define GENERIC_AND_FUSE_REG_CPTRA_TRNG_STATUS_DATA_WR_DONE_MASK (0x2) -#define CALIPTRA_TOP_REG_GENERIC_AND_FUSE_REG_CPTRA_FUSE_WR_DONE (0x300300ac) -#define GENERIC_AND_FUSE_REG_CPTRA_FUSE_WR_DONE (0xac) +#define CALIPTRA_TOP_REG_GENERIC_AND_FUSE_REG_CPTRA_FUSE_WR_DONE (0x300300b0) +#define GENERIC_AND_FUSE_REG_CPTRA_FUSE_WR_DONE (0xb0) #define GENERIC_AND_FUSE_REG_CPTRA_FUSE_WR_DONE_DONE_LOW (0) #define GENERIC_AND_FUSE_REG_CPTRA_FUSE_WR_DONE_DONE_MASK (0x1) -#define CALIPTRA_TOP_REG_GENERIC_AND_FUSE_REG_CPTRA_TIMER_CONFIG (0x300300b0) -#define GENERIC_AND_FUSE_REG_CPTRA_TIMER_CONFIG (0xb0) -#define CALIPTRA_TOP_REG_GENERIC_AND_FUSE_REG_CPTRA_BOOTFSM_GO (0x300300b4) -#define GENERIC_AND_FUSE_REG_CPTRA_BOOTFSM_GO (0xb4) +#define CALIPTRA_TOP_REG_GENERIC_AND_FUSE_REG_CPTRA_TIMER_CONFIG (0x300300b4) +#define GENERIC_AND_FUSE_REG_CPTRA_TIMER_CONFIG (0xb4) +#define CALIPTRA_TOP_REG_GENERIC_AND_FUSE_REG_CPTRA_BOOTFSM_GO (0x300300b8) +#define GENERIC_AND_FUSE_REG_CPTRA_BOOTFSM_GO (0xb8) #define GENERIC_AND_FUSE_REG_CPTRA_BOOTFSM_GO_GO_LOW (0) #define GENERIC_AND_FUSE_REG_CPTRA_BOOTFSM_GO_GO_MASK (0x1) -#define CALIPTRA_TOP_REG_GENERIC_AND_FUSE_REG_CPTRA_DBG_MANUF_SERVICE_REG (0x300300b8) -#define GENERIC_AND_FUSE_REG_CPTRA_DBG_MANUF_SERVICE_REG (0xb8) -#define CALIPTRA_TOP_REG_GENERIC_AND_FUSE_REG_CPTRA_CLK_GATING_EN (0x300300bc) -#define GENERIC_AND_FUSE_REG_CPTRA_CLK_GATING_EN (0xbc) +#define CALIPTRA_TOP_REG_GENERIC_AND_FUSE_REG_CPTRA_DBG_MANUF_SERVICE_REG (0x300300bc) +#define GENERIC_AND_FUSE_REG_CPTRA_DBG_MANUF_SERVICE_REG (0xbc) +#define CALIPTRA_TOP_REG_GENERIC_AND_FUSE_REG_CPTRA_CLK_GATING_EN (0x300300c0) +#define GENERIC_AND_FUSE_REG_CPTRA_CLK_GATING_EN (0xc0) #define GENERIC_AND_FUSE_REG_CPTRA_CLK_GATING_EN_CLK_GATING_EN_LOW (0) #define GENERIC_AND_FUSE_REG_CPTRA_CLK_GATING_EN_CLK_GATING_EN_MASK (0x1) -#define CALIPTRA_TOP_REG_GENERIC_AND_FUSE_REG_CPTRA_GENERIC_INPUT_WIRES_0 (0x300300c0) -#define GENERIC_AND_FUSE_REG_CPTRA_GENERIC_INPUT_WIRES_0 (0xc0) -#define CALIPTRA_TOP_REG_GENERIC_AND_FUSE_REG_CPTRA_GENERIC_INPUT_WIRES_1 (0x300300c4) -#define GENERIC_AND_FUSE_REG_CPTRA_GENERIC_INPUT_WIRES_1 (0xc4) -#define CALIPTRA_TOP_REG_GENERIC_AND_FUSE_REG_CPTRA_GENERIC_OUTPUT_WIRES_0 (0x300300c8) -#define GENERIC_AND_FUSE_REG_CPTRA_GENERIC_OUTPUT_WIRES_0 (0xc8) -#define CALIPTRA_TOP_REG_GENERIC_AND_FUSE_REG_CPTRA_GENERIC_OUTPUT_WIRES_1 (0x300300cc) -#define GENERIC_AND_FUSE_REG_CPTRA_GENERIC_OUTPUT_WIRES_1 (0xcc) -#define CALIPTRA_TOP_REG_GENERIC_AND_FUSE_REG_CPTRA_HW_REV_ID (0x300300d0) -#define GENERIC_AND_FUSE_REG_CPTRA_HW_REV_ID (0xd0) -#define CALIPTRA_TOP_REG_GENERIC_AND_FUSE_REG_CPTRA_FW_REV_ID_0 (0x300300d4) -#define GENERIC_AND_FUSE_REG_CPTRA_FW_REV_ID_0 (0xd4) -#define CALIPTRA_TOP_REG_GENERIC_AND_FUSE_REG_CPTRA_FW_REV_ID_1 (0x300300d8) -#define GENERIC_AND_FUSE_REG_CPTRA_FW_REV_ID_1 (0xd8) -#define CALIPTRA_TOP_REG_GENERIC_AND_FUSE_REG_CPTRA_HW_CONFIG (0x300300dc) -#define GENERIC_AND_FUSE_REG_CPTRA_HW_CONFIG (0xdc) +#define CALIPTRA_TOP_REG_GENERIC_AND_FUSE_REG_CPTRA_GENERIC_INPUT_WIRES_0 (0x300300c4) +#define GENERIC_AND_FUSE_REG_CPTRA_GENERIC_INPUT_WIRES_0 (0xc4) +#define CALIPTRA_TOP_REG_GENERIC_AND_FUSE_REG_CPTRA_GENERIC_INPUT_WIRES_1 (0x300300c8) +#define GENERIC_AND_FUSE_REG_CPTRA_GENERIC_INPUT_WIRES_1 (0xc8) +#define CALIPTRA_TOP_REG_GENERIC_AND_FUSE_REG_CPTRA_GENERIC_OUTPUT_WIRES_0 (0x300300cc) +#define GENERIC_AND_FUSE_REG_CPTRA_GENERIC_OUTPUT_WIRES_0 (0xcc) +#define CALIPTRA_TOP_REG_GENERIC_AND_FUSE_REG_CPTRA_GENERIC_OUTPUT_WIRES_1 (0x300300d0) +#define GENERIC_AND_FUSE_REG_CPTRA_GENERIC_OUTPUT_WIRES_1 (0xd0) +#define CALIPTRA_TOP_REG_GENERIC_AND_FUSE_REG_CPTRA_HW_REV_ID (0x300300d4) +#define GENERIC_AND_FUSE_REG_CPTRA_HW_REV_ID (0xd4) +#define GENERIC_AND_FUSE_REG_CPTRA_HW_REV_ID_CPTRA_GENERATION_LOW (0) +#define GENERIC_AND_FUSE_REG_CPTRA_HW_REV_ID_CPTRA_GENERATION_MASK (0xffff) +#define GENERIC_AND_FUSE_REG_CPTRA_HW_REV_ID_SOC_STEPPING_ID_LOW (16) +#define GENERIC_AND_FUSE_REG_CPTRA_HW_REV_ID_SOC_STEPPING_ID_MASK (0xffff0000) +#define CALIPTRA_TOP_REG_GENERIC_AND_FUSE_REG_CPTRA_FW_REV_ID_0 (0x300300d8) +#define GENERIC_AND_FUSE_REG_CPTRA_FW_REV_ID_0 (0xd8) +#define CALIPTRA_TOP_REG_GENERIC_AND_FUSE_REG_CPTRA_FW_REV_ID_1 (0x300300dc) +#define GENERIC_AND_FUSE_REG_CPTRA_FW_REV_ID_1 (0xdc) +#define CALIPTRA_TOP_REG_GENERIC_AND_FUSE_REG_CPTRA_HW_CONFIG (0x300300e0) +#define GENERIC_AND_FUSE_REG_CPTRA_HW_CONFIG (0xe0) #define GENERIC_AND_FUSE_REG_CPTRA_HW_CONFIG_ITRNG_EN_LOW (0) #define GENERIC_AND_FUSE_REG_CPTRA_HW_CONFIG_ITRNG_EN_MASK (0x1) #define GENERIC_AND_FUSE_REG_CPTRA_HW_CONFIG_QSPI_EN_LOW (1) #define GENERIC_AND_FUSE_REG_CPTRA_HW_CONFIG_QSPI_EN_MASK (0x2) #define GENERIC_AND_FUSE_REG_CPTRA_HW_CONFIG_I3C_EN_LOW (2) #define GENERIC_AND_FUSE_REG_CPTRA_HW_CONFIG_I3C_EN_MASK (0x4) -#define CALIPTRA_TOP_REG_GENERIC_AND_FUSE_REG_CPTRA_WDT_TIMER1_EN (0x300300e0) -#define GENERIC_AND_FUSE_REG_CPTRA_WDT_TIMER1_EN (0xe0) +#define GENERIC_AND_FUSE_REG_CPTRA_HW_CONFIG_UART_EN_LOW (3) +#define GENERIC_AND_FUSE_REG_CPTRA_HW_CONFIG_UART_EN_MASK (0x8) +#define CALIPTRA_TOP_REG_GENERIC_AND_FUSE_REG_CPTRA_WDT_TIMER1_EN (0x300300e4) +#define GENERIC_AND_FUSE_REG_CPTRA_WDT_TIMER1_EN (0xe4) #define GENERIC_AND_FUSE_REG_CPTRA_WDT_TIMER1_EN_TIMER1_EN_LOW (0) #define GENERIC_AND_FUSE_REG_CPTRA_WDT_TIMER1_EN_TIMER1_EN_MASK (0x1) -#define CALIPTRA_TOP_REG_GENERIC_AND_FUSE_REG_CPTRA_WDT_TIMER1_CTRL (0x300300e4) -#define GENERIC_AND_FUSE_REG_CPTRA_WDT_TIMER1_CTRL (0xe4) +#define CALIPTRA_TOP_REG_GENERIC_AND_FUSE_REG_CPTRA_WDT_TIMER1_CTRL (0x300300e8) +#define GENERIC_AND_FUSE_REG_CPTRA_WDT_TIMER1_CTRL (0xe8) #define GENERIC_AND_FUSE_REG_CPTRA_WDT_TIMER1_CTRL_TIMER1_RESTART_LOW (0) #define GENERIC_AND_FUSE_REG_CPTRA_WDT_TIMER1_CTRL_TIMER1_RESTART_MASK (0x1) -#define CALIPTRA_TOP_REG_GENERIC_AND_FUSE_REG_CPTRA_WDT_TIMER1_TIMEOUT_PERIOD_0 (0x300300e8) -#define GENERIC_AND_FUSE_REG_CPTRA_WDT_TIMER1_TIMEOUT_PERIOD_0 (0xe8) -#define CALIPTRA_TOP_REG_GENERIC_AND_FUSE_REG_CPTRA_WDT_TIMER1_TIMEOUT_PERIOD_1 (0x300300ec) -#define GENERIC_AND_FUSE_REG_CPTRA_WDT_TIMER1_TIMEOUT_PERIOD_1 (0xec) -#define CALIPTRA_TOP_REG_GENERIC_AND_FUSE_REG_CPTRA_WDT_TIMER2_EN (0x300300f0) -#define GENERIC_AND_FUSE_REG_CPTRA_WDT_TIMER2_EN (0xf0) +#define CALIPTRA_TOP_REG_GENERIC_AND_FUSE_REG_CPTRA_WDT_TIMER1_TIMEOUT_PERIOD_0 (0x300300ec) +#define GENERIC_AND_FUSE_REG_CPTRA_WDT_TIMER1_TIMEOUT_PERIOD_0 (0xec) +#define CALIPTRA_TOP_REG_GENERIC_AND_FUSE_REG_CPTRA_WDT_TIMER1_TIMEOUT_PERIOD_1 (0x300300f0) +#define GENERIC_AND_FUSE_REG_CPTRA_WDT_TIMER1_TIMEOUT_PERIOD_1 (0xf0) +#define CALIPTRA_TOP_REG_GENERIC_AND_FUSE_REG_CPTRA_WDT_TIMER2_EN (0x300300f4) +#define GENERIC_AND_FUSE_REG_CPTRA_WDT_TIMER2_EN (0xf4) #define GENERIC_AND_FUSE_REG_CPTRA_WDT_TIMER2_EN_TIMER2_EN_LOW (0) #define GENERIC_AND_FUSE_REG_CPTRA_WDT_TIMER2_EN_TIMER2_EN_MASK (0x1) -#define CALIPTRA_TOP_REG_GENERIC_AND_FUSE_REG_CPTRA_WDT_TIMER2_CTRL (0x300300f4) -#define GENERIC_AND_FUSE_REG_CPTRA_WDT_TIMER2_CTRL (0xf4) +#define CALIPTRA_TOP_REG_GENERIC_AND_FUSE_REG_CPTRA_WDT_TIMER2_CTRL (0x300300f8) +#define GENERIC_AND_FUSE_REG_CPTRA_WDT_TIMER2_CTRL (0xf8) #define GENERIC_AND_FUSE_REG_CPTRA_WDT_TIMER2_CTRL_TIMER2_RESTART_LOW (0) #define GENERIC_AND_FUSE_REG_CPTRA_WDT_TIMER2_CTRL_TIMER2_RESTART_MASK (0x1) -#define CALIPTRA_TOP_REG_GENERIC_AND_FUSE_REG_CPTRA_WDT_TIMER2_TIMEOUT_PERIOD_0 (0x300300f8) -#define GENERIC_AND_FUSE_REG_CPTRA_WDT_TIMER2_TIMEOUT_PERIOD_0 (0xf8) -#define CALIPTRA_TOP_REG_GENERIC_AND_FUSE_REG_CPTRA_WDT_TIMER2_TIMEOUT_PERIOD_1 (0x300300fc) -#define GENERIC_AND_FUSE_REG_CPTRA_WDT_TIMER2_TIMEOUT_PERIOD_1 (0xfc) -#define CALIPTRA_TOP_REG_GENERIC_AND_FUSE_REG_CPTRA_WDT_STATUS (0x30030100) -#define GENERIC_AND_FUSE_REG_CPTRA_WDT_STATUS (0x100) +#define CALIPTRA_TOP_REG_GENERIC_AND_FUSE_REG_CPTRA_WDT_TIMER2_TIMEOUT_PERIOD_0 (0x300300fc) +#define GENERIC_AND_FUSE_REG_CPTRA_WDT_TIMER2_TIMEOUT_PERIOD_0 (0xfc) +#define CALIPTRA_TOP_REG_GENERIC_AND_FUSE_REG_CPTRA_WDT_TIMER2_TIMEOUT_PERIOD_1 (0x30030100) +#define GENERIC_AND_FUSE_REG_CPTRA_WDT_TIMER2_TIMEOUT_PERIOD_1 (0x100) +#define CALIPTRA_TOP_REG_GENERIC_AND_FUSE_REG_CPTRA_WDT_STATUS (0x30030104) +#define GENERIC_AND_FUSE_REG_CPTRA_WDT_STATUS (0x104) #define GENERIC_AND_FUSE_REG_CPTRA_WDT_STATUS_T1_TIMEOUT_LOW (0) #define GENERIC_AND_FUSE_REG_CPTRA_WDT_STATUS_T1_TIMEOUT_MASK (0x1) #define GENERIC_AND_FUSE_REG_CPTRA_WDT_STATUS_T2_TIMEOUT_LOW (1) #define GENERIC_AND_FUSE_REG_CPTRA_WDT_STATUS_T2_TIMEOUT_MASK (0x2) +#define CALIPTRA_TOP_REG_GENERIC_AND_FUSE_REG_CPTRA_FUSE_VALID_PAUSER (0x30030108) +#define GENERIC_AND_FUSE_REG_CPTRA_FUSE_VALID_PAUSER (0x108) +#define CALIPTRA_TOP_REG_GENERIC_AND_FUSE_REG_CPTRA_FUSE_PAUSER_LOCK (0x3003010c) +#define GENERIC_AND_FUSE_REG_CPTRA_FUSE_PAUSER_LOCK (0x10c) +#define GENERIC_AND_FUSE_REG_CPTRA_FUSE_PAUSER_LOCK_LOCK_LOW (0) +#define GENERIC_AND_FUSE_REG_CPTRA_FUSE_PAUSER_LOCK_LOCK_MASK (0x1) +#define CALIPTRA_TOP_REG_GENERIC_AND_FUSE_REG_CPTRA_WDT_CFG_0 (0x30030110) +#define GENERIC_AND_FUSE_REG_CPTRA_WDT_CFG_0 (0x110) +#define CALIPTRA_TOP_REG_GENERIC_AND_FUSE_REG_CPTRA_WDT_CFG_1 (0x30030114) +#define GENERIC_AND_FUSE_REG_CPTRA_WDT_CFG_1 (0x114) +#define CALIPTRA_TOP_REG_GENERIC_AND_FUSE_REG_CPTRA_ITRNG_ENTROPY_CONFIG_0 (0x30030118) +#define GENERIC_AND_FUSE_REG_CPTRA_ITRNG_ENTROPY_CONFIG_0 (0x118) +#define GENERIC_AND_FUSE_REG_CPTRA_ITRNG_ENTROPY_CONFIG_0_LOW_THRESHOLD_LOW (0) +#define GENERIC_AND_FUSE_REG_CPTRA_ITRNG_ENTROPY_CONFIG_0_LOW_THRESHOLD_MASK (0xffff) +#define GENERIC_AND_FUSE_REG_CPTRA_ITRNG_ENTROPY_CONFIG_0_HIGH_THRESHOLD_LOW (16) +#define GENERIC_AND_FUSE_REG_CPTRA_ITRNG_ENTROPY_CONFIG_0_HIGH_THRESHOLD_MASK (0xffff0000) +#define CALIPTRA_TOP_REG_GENERIC_AND_FUSE_REG_CPTRA_ITRNG_ENTROPY_CONFIG_1 (0x3003011c) +#define GENERIC_AND_FUSE_REG_CPTRA_ITRNG_ENTROPY_CONFIG_1 (0x11c) +#define GENERIC_AND_FUSE_REG_CPTRA_ITRNG_ENTROPY_CONFIG_1_REPETITION_COUNT_LOW (0) +#define GENERIC_AND_FUSE_REG_CPTRA_ITRNG_ENTROPY_CONFIG_1_REPETITION_COUNT_MASK (0xffff) +#define GENERIC_AND_FUSE_REG_CPTRA_ITRNG_ENTROPY_CONFIG_1_RSVD_LOW (16) +#define GENERIC_AND_FUSE_REG_CPTRA_ITRNG_ENTROPY_CONFIG_1_RSVD_MASK (0xffff0000) +#define CALIPTRA_TOP_REG_GENERIC_AND_FUSE_REG_CPTRA_RSVD_REG_0 (0x30030120) +#define GENERIC_AND_FUSE_REG_CPTRA_RSVD_REG_0 (0x120) +#define CALIPTRA_TOP_REG_GENERIC_AND_FUSE_REG_CPTRA_RSVD_REG_1 (0x30030124) +#define GENERIC_AND_FUSE_REG_CPTRA_RSVD_REG_1 (0x124) #define CALIPTRA_TOP_REG_GENERIC_AND_FUSE_REG_FUSE_UDS_SEED_0 (0x30030200) #define GENERIC_AND_FUSE_REG_FUSE_UDS_SEED_0 (0x200) #define CALIPTRA_TOP_REG_GENERIC_AND_FUSE_REG_FUSE_UDS_SEED_1 (0x30030204) @@ -473,6 +529,16 @@ #define GENERIC_AND_FUSE_REG_FUSE_LIFE_CYCLE (0x33c) #define GENERIC_AND_FUSE_REG_FUSE_LIFE_CYCLE_LIFE_CYCLE_LOW (0) #define GENERIC_AND_FUSE_REG_FUSE_LIFE_CYCLE_LIFE_CYCLE_MASK (0x3) +#define CALIPTRA_TOP_REG_GENERIC_AND_FUSE_REG_FUSE_LMS_VERIFY (0x30030340) +#define GENERIC_AND_FUSE_REG_FUSE_LMS_VERIFY (0x340) +#define GENERIC_AND_FUSE_REG_FUSE_LMS_VERIFY_LMS_VERIFY_LOW (0) +#define GENERIC_AND_FUSE_REG_FUSE_LMS_VERIFY_LMS_VERIFY_MASK (0x1) +#define CALIPTRA_TOP_REG_GENERIC_AND_FUSE_REG_FUSE_LMS_REVOCATION (0x30030344) +#define GENERIC_AND_FUSE_REG_FUSE_LMS_REVOCATION (0x344) +#define CALIPTRA_TOP_REG_GENERIC_AND_FUSE_REG_FUSE_SOC_STEPPING_ID (0x30030348) +#define GENERIC_AND_FUSE_REG_FUSE_SOC_STEPPING_ID (0x348) +#define GENERIC_AND_FUSE_REG_FUSE_SOC_STEPPING_ID_SOC_STEPPING_ID_LOW (0) +#define GENERIC_AND_FUSE_REG_FUSE_SOC_STEPPING_ID_SOC_STEPPING_ID_MASK (0xffff) #endif diff --git a/src/soc_ifc/rtl/caliptra_top_reg_defines.svh b/src/soc_ifc/rtl/caliptra_top_reg_defines.svh index 4eb915d3e..9677a065e 100644 --- a/src/soc_ifc/rtl/caliptra_top_reg_defines.svh +++ b/src/soc_ifc/rtl/caliptra_top_reg_defines.svh @@ -48,6 +48,8 @@ `define MBOX_CSR_MBOX_STATUS_MBOX_FSM_PS_MASK (32'h1c0) `define MBOX_CSR_MBOX_STATUS_SOC_HAS_LOCK_LOW (9) `define MBOX_CSR_MBOX_STATUS_SOC_HAS_LOCK_MASK (32'h200) +`define MBOX_CSR_MBOX_STATUS_MBOX_RDPTR_LOW (10) +`define MBOX_CSR_MBOX_STATUS_MBOX_RDPTR_MASK (32'h1fffc00) `define CALIPTRA_TOP_REG_MBOX_CSR_MBOX_UNLOCK (32'h30020020) `define MBOX_CSR_MBOX_UNLOCK (32'h20) `define MBOX_CSR_MBOX_UNLOCK_UNLOCK_LOW (0) @@ -79,6 +81,8 @@ `define SHA512_ACC_CSR_STATUS (32'h1c) `define SHA512_ACC_CSR_STATUS_VALID_LOW (0) `define SHA512_ACC_CSR_STATUS_VALID_MASK (32'h1) +`define SHA512_ACC_CSR_STATUS_SOC_HAS_LOCK_LOW (1) +`define SHA512_ACC_CSR_STATUS_SOC_HAS_LOCK_MASK (32'h2) `define CALIPTRA_TOP_REG_SHA512_ACC_CSR_DIGEST_0 (32'h30021020) `define SHA512_ACC_CSR_DIGEST_0 (32'h20) `define CALIPTRA_TOP_REG_SHA512_ACC_CSR_DIGEST_1 (32'h30021024) @@ -118,8 +122,20 @@ `define CALIPTRA_TOP_REG_GENERIC_AND_FUSE_REG_BASE_ADDR (32'h30030000) `define CALIPTRA_TOP_REG_GENERIC_AND_FUSE_REG_CPTRA_HW_ERROR_FATAL (32'h30030000) `define GENERIC_AND_FUSE_REG_CPTRA_HW_ERROR_FATAL (32'h0) +`define GENERIC_AND_FUSE_REG_CPTRA_HW_ERROR_FATAL_ICCM_ECC_UNC_LOW (0) +`define GENERIC_AND_FUSE_REG_CPTRA_HW_ERROR_FATAL_ICCM_ECC_UNC_MASK (32'h1) +`define GENERIC_AND_FUSE_REG_CPTRA_HW_ERROR_FATAL_DCCM_ECC_UNC_LOW (1) +`define GENERIC_AND_FUSE_REG_CPTRA_HW_ERROR_FATAL_DCCM_ECC_UNC_MASK (32'h2) +`define GENERIC_AND_FUSE_REG_CPTRA_HW_ERROR_FATAL_NMI_PIN_LOW (2) +`define GENERIC_AND_FUSE_REG_CPTRA_HW_ERROR_FATAL_NMI_PIN_MASK (32'h4) `define CALIPTRA_TOP_REG_GENERIC_AND_FUSE_REG_CPTRA_HW_ERROR_NON_FATAL (32'h30030004) `define GENERIC_AND_FUSE_REG_CPTRA_HW_ERROR_NON_FATAL (32'h4) +`define GENERIC_AND_FUSE_REG_CPTRA_HW_ERROR_NON_FATAL_MBOX_PROT_NO_LOCK_LOW (0) +`define GENERIC_AND_FUSE_REG_CPTRA_HW_ERROR_NON_FATAL_MBOX_PROT_NO_LOCK_MASK (32'h1) +`define GENERIC_AND_FUSE_REG_CPTRA_HW_ERROR_NON_FATAL_MBOX_PROT_OOO_LOW (1) +`define GENERIC_AND_FUSE_REG_CPTRA_HW_ERROR_NON_FATAL_MBOX_PROT_OOO_MASK (32'h2) +`define GENERIC_AND_FUSE_REG_CPTRA_HW_ERROR_NON_FATAL_MBOX_ECC_UNC_LOW (2) +`define GENERIC_AND_FUSE_REG_CPTRA_HW_ERROR_NON_FATAL_MBOX_ECC_UNC_MASK (32'h4) `define CALIPTRA_TOP_REG_GENERIC_AND_FUSE_REG_CPTRA_FW_ERROR_FATAL (32'h30030008) `define GENERIC_AND_FUSE_REG_CPTRA_FW_ERROR_FATAL (32'h8) `define CALIPTRA_TOP_REG_GENERIC_AND_FUSE_REG_CPTRA_FW_ERROR_NON_FATAL (32'h3003000c) @@ -149,7 +165,11 @@ `define CALIPTRA_TOP_REG_GENERIC_AND_FUSE_REG_CPTRA_FLOW_STATUS (32'h3003003c) `define GENERIC_AND_FUSE_REG_CPTRA_FLOW_STATUS (32'h3c) `define GENERIC_AND_FUSE_REG_CPTRA_FLOW_STATUS_STATUS_LOW (0) -`define GENERIC_AND_FUSE_REG_CPTRA_FLOW_STATUS_STATUS_MASK (32'hfffffff) +`define GENERIC_AND_FUSE_REG_CPTRA_FLOW_STATUS_STATUS_MASK (32'hffffff) +`define GENERIC_AND_FUSE_REG_CPTRA_FLOW_STATUS_IDEVID_CSR_READY_LOW (24) +`define GENERIC_AND_FUSE_REG_CPTRA_FLOW_STATUS_IDEVID_CSR_READY_MASK (32'h1000000) +`define GENERIC_AND_FUSE_REG_CPTRA_FLOW_STATUS_BOOT_FSM_PS_LOW (25) +`define GENERIC_AND_FUSE_REG_CPTRA_FLOW_STATUS_BOOT_FSM_PS_MASK (32'he000000) `define GENERIC_AND_FUSE_REG_CPTRA_FLOW_STATUS_READY_FOR_FW_LOW (28) `define GENERIC_AND_FUSE_REG_CPTRA_FLOW_STATUS_READY_FOR_FW_MASK (32'h10000000) `define GENERIC_AND_FUSE_REG_CPTRA_FLOW_STATUS_READY_FOR_RUNTIME_LOW (29) @@ -234,44 +254,52 @@ `define GENERIC_AND_FUSE_REG_CPTRA_TRNG_DATA_10 (32'ha0) `define CALIPTRA_TOP_REG_GENERIC_AND_FUSE_REG_CPTRA_TRNG_DATA_11 (32'h300300a4) `define GENERIC_AND_FUSE_REG_CPTRA_TRNG_DATA_11 (32'ha4) -`define CALIPTRA_TOP_REG_GENERIC_AND_FUSE_REG_CPTRA_TRNG_STATUS (32'h300300a8) -`define GENERIC_AND_FUSE_REG_CPTRA_TRNG_STATUS (32'ha8) +`define CALIPTRA_TOP_REG_GENERIC_AND_FUSE_REG_CPTRA_TRNG_CTRL (32'h300300a8) +`define GENERIC_AND_FUSE_REG_CPTRA_TRNG_CTRL (32'ha8) +`define GENERIC_AND_FUSE_REG_CPTRA_TRNG_CTRL_CLEAR_LOW (0) +`define GENERIC_AND_FUSE_REG_CPTRA_TRNG_CTRL_CLEAR_MASK (32'h1) +`define CALIPTRA_TOP_REG_GENERIC_AND_FUSE_REG_CPTRA_TRNG_STATUS (32'h300300ac) +`define GENERIC_AND_FUSE_REG_CPTRA_TRNG_STATUS (32'hac) `define GENERIC_AND_FUSE_REG_CPTRA_TRNG_STATUS_DATA_REQ_LOW (0) `define GENERIC_AND_FUSE_REG_CPTRA_TRNG_STATUS_DATA_REQ_MASK (32'h1) `define GENERIC_AND_FUSE_REG_CPTRA_TRNG_STATUS_DATA_WR_DONE_LOW (1) `define GENERIC_AND_FUSE_REG_CPTRA_TRNG_STATUS_DATA_WR_DONE_MASK (32'h2) -`define CALIPTRA_TOP_REG_GENERIC_AND_FUSE_REG_CPTRA_FUSE_WR_DONE (32'h300300ac) -`define GENERIC_AND_FUSE_REG_CPTRA_FUSE_WR_DONE (32'hac) +`define CALIPTRA_TOP_REG_GENERIC_AND_FUSE_REG_CPTRA_FUSE_WR_DONE (32'h300300b0) +`define GENERIC_AND_FUSE_REG_CPTRA_FUSE_WR_DONE (32'hb0) `define GENERIC_AND_FUSE_REG_CPTRA_FUSE_WR_DONE_DONE_LOW (0) `define GENERIC_AND_FUSE_REG_CPTRA_FUSE_WR_DONE_DONE_MASK (32'h1) -`define CALIPTRA_TOP_REG_GENERIC_AND_FUSE_REG_CPTRA_TIMER_CONFIG (32'h300300b0) -`define GENERIC_AND_FUSE_REG_CPTRA_TIMER_CONFIG (32'hb0) -`define CALIPTRA_TOP_REG_GENERIC_AND_FUSE_REG_CPTRA_BOOTFSM_GO (32'h300300b4) -`define GENERIC_AND_FUSE_REG_CPTRA_BOOTFSM_GO (32'hb4) +`define CALIPTRA_TOP_REG_GENERIC_AND_FUSE_REG_CPTRA_TIMER_CONFIG (32'h300300b4) +`define GENERIC_AND_FUSE_REG_CPTRA_TIMER_CONFIG (32'hb4) +`define CALIPTRA_TOP_REG_GENERIC_AND_FUSE_REG_CPTRA_BOOTFSM_GO (32'h300300b8) +`define GENERIC_AND_FUSE_REG_CPTRA_BOOTFSM_GO (32'hb8) `define GENERIC_AND_FUSE_REG_CPTRA_BOOTFSM_GO_GO_LOW (0) `define GENERIC_AND_FUSE_REG_CPTRA_BOOTFSM_GO_GO_MASK (32'h1) -`define CALIPTRA_TOP_REG_GENERIC_AND_FUSE_REG_CPTRA_DBG_MANUF_SERVICE_REG (32'h300300b8) -`define GENERIC_AND_FUSE_REG_CPTRA_DBG_MANUF_SERVICE_REG (32'hb8) -`define CALIPTRA_TOP_REG_GENERIC_AND_FUSE_REG_CPTRA_CLK_GATING_EN (32'h300300bc) -`define GENERIC_AND_FUSE_REG_CPTRA_CLK_GATING_EN (32'hbc) +`define CALIPTRA_TOP_REG_GENERIC_AND_FUSE_REG_CPTRA_DBG_MANUF_SERVICE_REG (32'h300300bc) +`define GENERIC_AND_FUSE_REG_CPTRA_DBG_MANUF_SERVICE_REG (32'hbc) +`define CALIPTRA_TOP_REG_GENERIC_AND_FUSE_REG_CPTRA_CLK_GATING_EN (32'h300300c0) +`define GENERIC_AND_FUSE_REG_CPTRA_CLK_GATING_EN (32'hc0) `define GENERIC_AND_FUSE_REG_CPTRA_CLK_GATING_EN_CLK_GATING_EN_LOW (0) `define GENERIC_AND_FUSE_REG_CPTRA_CLK_GATING_EN_CLK_GATING_EN_MASK (32'h1) -`define CALIPTRA_TOP_REG_GENERIC_AND_FUSE_REG_CPTRA_GENERIC_INPUT_WIRES_0 (32'h300300c0) -`define GENERIC_AND_FUSE_REG_CPTRA_GENERIC_INPUT_WIRES_0 (32'hc0) -`define CALIPTRA_TOP_REG_GENERIC_AND_FUSE_REG_CPTRA_GENERIC_INPUT_WIRES_1 (32'h300300c4) -`define GENERIC_AND_FUSE_REG_CPTRA_GENERIC_INPUT_WIRES_1 (32'hc4) -`define CALIPTRA_TOP_REG_GENERIC_AND_FUSE_REG_CPTRA_GENERIC_OUTPUT_WIRES_0 (32'h300300c8) -`define GENERIC_AND_FUSE_REG_CPTRA_GENERIC_OUTPUT_WIRES_0 (32'hc8) -`define CALIPTRA_TOP_REG_GENERIC_AND_FUSE_REG_CPTRA_GENERIC_OUTPUT_WIRES_1 (32'h300300cc) -`define GENERIC_AND_FUSE_REG_CPTRA_GENERIC_OUTPUT_WIRES_1 (32'hcc) -`define CALIPTRA_TOP_REG_GENERIC_AND_FUSE_REG_CPTRA_HW_REV_ID (32'h300300d0) -`define GENERIC_AND_FUSE_REG_CPTRA_HW_REV_ID (32'hd0) -`define CALIPTRA_TOP_REG_GENERIC_AND_FUSE_REG_CPTRA_FW_REV_ID_0 (32'h300300d4) -`define GENERIC_AND_FUSE_REG_CPTRA_FW_REV_ID_0 (32'hd4) -`define CALIPTRA_TOP_REG_GENERIC_AND_FUSE_REG_CPTRA_FW_REV_ID_1 (32'h300300d8) -`define GENERIC_AND_FUSE_REG_CPTRA_FW_REV_ID_1 (32'hd8) -`define CALIPTRA_TOP_REG_GENERIC_AND_FUSE_REG_CPTRA_HW_CONFIG (32'h300300dc) -`define GENERIC_AND_FUSE_REG_CPTRA_HW_CONFIG (32'hdc) +`define CALIPTRA_TOP_REG_GENERIC_AND_FUSE_REG_CPTRA_GENERIC_INPUT_WIRES_0 (32'h300300c4) +`define GENERIC_AND_FUSE_REG_CPTRA_GENERIC_INPUT_WIRES_0 (32'hc4) +`define CALIPTRA_TOP_REG_GENERIC_AND_FUSE_REG_CPTRA_GENERIC_INPUT_WIRES_1 (32'h300300c8) +`define GENERIC_AND_FUSE_REG_CPTRA_GENERIC_INPUT_WIRES_1 (32'hc8) +`define CALIPTRA_TOP_REG_GENERIC_AND_FUSE_REG_CPTRA_GENERIC_OUTPUT_WIRES_0 (32'h300300cc) +`define GENERIC_AND_FUSE_REG_CPTRA_GENERIC_OUTPUT_WIRES_0 (32'hcc) +`define CALIPTRA_TOP_REG_GENERIC_AND_FUSE_REG_CPTRA_GENERIC_OUTPUT_WIRES_1 (32'h300300d0) +`define GENERIC_AND_FUSE_REG_CPTRA_GENERIC_OUTPUT_WIRES_1 (32'hd0) +`define CALIPTRA_TOP_REG_GENERIC_AND_FUSE_REG_CPTRA_HW_REV_ID (32'h300300d4) +`define GENERIC_AND_FUSE_REG_CPTRA_HW_REV_ID (32'hd4) +`define GENERIC_AND_FUSE_REG_CPTRA_HW_REV_ID_CPTRA_GENERATION_LOW (0) +`define GENERIC_AND_FUSE_REG_CPTRA_HW_REV_ID_CPTRA_GENERATION_MASK (32'hffff) +`define GENERIC_AND_FUSE_REG_CPTRA_HW_REV_ID_SOC_STEPPING_ID_LOW (16) +`define GENERIC_AND_FUSE_REG_CPTRA_HW_REV_ID_SOC_STEPPING_ID_MASK (32'hffff0000) +`define CALIPTRA_TOP_REG_GENERIC_AND_FUSE_REG_CPTRA_FW_REV_ID_0 (32'h300300d8) +`define GENERIC_AND_FUSE_REG_CPTRA_FW_REV_ID_0 (32'hd8) +`define CALIPTRA_TOP_REG_GENERIC_AND_FUSE_REG_CPTRA_FW_REV_ID_1 (32'h300300dc) +`define GENERIC_AND_FUSE_REG_CPTRA_FW_REV_ID_1 (32'hdc) +`define CALIPTRA_TOP_REG_GENERIC_AND_FUSE_REG_CPTRA_HW_CONFIG (32'h300300e0) +`define GENERIC_AND_FUSE_REG_CPTRA_HW_CONFIG (32'he0) `define GENERIC_AND_FUSE_REG_CPTRA_HW_CONFIG_ITRNG_EN_LOW (0) `define GENERIC_AND_FUSE_REG_CPTRA_HW_CONFIG_ITRNG_EN_MASK (32'h1) `define GENERIC_AND_FUSE_REG_CPTRA_HW_CONFIG_QSPI_EN_LOW (1) @@ -280,36 +308,62 @@ `define GENERIC_AND_FUSE_REG_CPTRA_HW_CONFIG_I3C_EN_MASK (32'h4) `define GENERIC_AND_FUSE_REG_CPTRA_HW_CONFIG_UART_EN_LOW (3) `define GENERIC_AND_FUSE_REG_CPTRA_HW_CONFIG_UART_EN_MASK (32'h8) -`define CALIPTRA_TOP_REG_GENERIC_AND_FUSE_REG_CPTRA_WDT_TIMER1_EN (32'h300300e0) -`define GENERIC_AND_FUSE_REG_CPTRA_WDT_TIMER1_EN (32'he0) +`define CALIPTRA_TOP_REG_GENERIC_AND_FUSE_REG_CPTRA_WDT_TIMER1_EN (32'h300300e4) +`define GENERIC_AND_FUSE_REG_CPTRA_WDT_TIMER1_EN (32'he4) `define GENERIC_AND_FUSE_REG_CPTRA_WDT_TIMER1_EN_TIMER1_EN_LOW (0) `define GENERIC_AND_FUSE_REG_CPTRA_WDT_TIMER1_EN_TIMER1_EN_MASK (32'h1) -`define CALIPTRA_TOP_REG_GENERIC_AND_FUSE_REG_CPTRA_WDT_TIMER1_CTRL (32'h300300e4) -`define GENERIC_AND_FUSE_REG_CPTRA_WDT_TIMER1_CTRL (32'he4) +`define CALIPTRA_TOP_REG_GENERIC_AND_FUSE_REG_CPTRA_WDT_TIMER1_CTRL (32'h300300e8) +`define GENERIC_AND_FUSE_REG_CPTRA_WDT_TIMER1_CTRL (32'he8) `define GENERIC_AND_FUSE_REG_CPTRA_WDT_TIMER1_CTRL_TIMER1_RESTART_LOW (0) `define GENERIC_AND_FUSE_REG_CPTRA_WDT_TIMER1_CTRL_TIMER1_RESTART_MASK (32'h1) -`define CALIPTRA_TOP_REG_GENERIC_AND_FUSE_REG_CPTRA_WDT_TIMER1_TIMEOUT_PERIOD_0 (32'h300300e8) -`define GENERIC_AND_FUSE_REG_CPTRA_WDT_TIMER1_TIMEOUT_PERIOD_0 (32'he8) -`define CALIPTRA_TOP_REG_GENERIC_AND_FUSE_REG_CPTRA_WDT_TIMER1_TIMEOUT_PERIOD_1 (32'h300300ec) -`define GENERIC_AND_FUSE_REG_CPTRA_WDT_TIMER1_TIMEOUT_PERIOD_1 (32'hec) -`define CALIPTRA_TOP_REG_GENERIC_AND_FUSE_REG_CPTRA_WDT_TIMER2_EN (32'h300300f0) -`define GENERIC_AND_FUSE_REG_CPTRA_WDT_TIMER2_EN (32'hf0) +`define CALIPTRA_TOP_REG_GENERIC_AND_FUSE_REG_CPTRA_WDT_TIMER1_TIMEOUT_PERIOD_0 (32'h300300ec) +`define GENERIC_AND_FUSE_REG_CPTRA_WDT_TIMER1_TIMEOUT_PERIOD_0 (32'hec) +`define CALIPTRA_TOP_REG_GENERIC_AND_FUSE_REG_CPTRA_WDT_TIMER1_TIMEOUT_PERIOD_1 (32'h300300f0) +`define GENERIC_AND_FUSE_REG_CPTRA_WDT_TIMER1_TIMEOUT_PERIOD_1 (32'hf0) +`define CALIPTRA_TOP_REG_GENERIC_AND_FUSE_REG_CPTRA_WDT_TIMER2_EN (32'h300300f4) +`define GENERIC_AND_FUSE_REG_CPTRA_WDT_TIMER2_EN (32'hf4) `define GENERIC_AND_FUSE_REG_CPTRA_WDT_TIMER2_EN_TIMER2_EN_LOW (0) `define GENERIC_AND_FUSE_REG_CPTRA_WDT_TIMER2_EN_TIMER2_EN_MASK (32'h1) -`define CALIPTRA_TOP_REG_GENERIC_AND_FUSE_REG_CPTRA_WDT_TIMER2_CTRL (32'h300300f4) -`define GENERIC_AND_FUSE_REG_CPTRA_WDT_TIMER2_CTRL (32'hf4) +`define CALIPTRA_TOP_REG_GENERIC_AND_FUSE_REG_CPTRA_WDT_TIMER2_CTRL (32'h300300f8) +`define GENERIC_AND_FUSE_REG_CPTRA_WDT_TIMER2_CTRL (32'hf8) `define GENERIC_AND_FUSE_REG_CPTRA_WDT_TIMER2_CTRL_TIMER2_RESTART_LOW (0) `define GENERIC_AND_FUSE_REG_CPTRA_WDT_TIMER2_CTRL_TIMER2_RESTART_MASK (32'h1) -`define CALIPTRA_TOP_REG_GENERIC_AND_FUSE_REG_CPTRA_WDT_TIMER2_TIMEOUT_PERIOD_0 (32'h300300f8) -`define GENERIC_AND_FUSE_REG_CPTRA_WDT_TIMER2_TIMEOUT_PERIOD_0 (32'hf8) -`define CALIPTRA_TOP_REG_GENERIC_AND_FUSE_REG_CPTRA_WDT_TIMER2_TIMEOUT_PERIOD_1 (32'h300300fc) -`define GENERIC_AND_FUSE_REG_CPTRA_WDT_TIMER2_TIMEOUT_PERIOD_1 (32'hfc) -`define CALIPTRA_TOP_REG_GENERIC_AND_FUSE_REG_CPTRA_WDT_STATUS (32'h30030100) -`define GENERIC_AND_FUSE_REG_CPTRA_WDT_STATUS (32'h100) +`define CALIPTRA_TOP_REG_GENERIC_AND_FUSE_REG_CPTRA_WDT_TIMER2_TIMEOUT_PERIOD_0 (32'h300300fc) +`define GENERIC_AND_FUSE_REG_CPTRA_WDT_TIMER2_TIMEOUT_PERIOD_0 (32'hfc) +`define CALIPTRA_TOP_REG_GENERIC_AND_FUSE_REG_CPTRA_WDT_TIMER2_TIMEOUT_PERIOD_1 (32'h30030100) +`define GENERIC_AND_FUSE_REG_CPTRA_WDT_TIMER2_TIMEOUT_PERIOD_1 (32'h100) +`define CALIPTRA_TOP_REG_GENERIC_AND_FUSE_REG_CPTRA_WDT_STATUS (32'h30030104) +`define GENERIC_AND_FUSE_REG_CPTRA_WDT_STATUS (32'h104) `define GENERIC_AND_FUSE_REG_CPTRA_WDT_STATUS_T1_TIMEOUT_LOW (0) `define GENERIC_AND_FUSE_REG_CPTRA_WDT_STATUS_T1_TIMEOUT_MASK (32'h1) `define GENERIC_AND_FUSE_REG_CPTRA_WDT_STATUS_T2_TIMEOUT_LOW (1) `define GENERIC_AND_FUSE_REG_CPTRA_WDT_STATUS_T2_TIMEOUT_MASK (32'h2) +`define CALIPTRA_TOP_REG_GENERIC_AND_FUSE_REG_CPTRA_FUSE_VALID_PAUSER (32'h30030108) +`define GENERIC_AND_FUSE_REG_CPTRA_FUSE_VALID_PAUSER (32'h108) +`define CALIPTRA_TOP_REG_GENERIC_AND_FUSE_REG_CPTRA_FUSE_PAUSER_LOCK (32'h3003010c) +`define GENERIC_AND_FUSE_REG_CPTRA_FUSE_PAUSER_LOCK (32'h10c) +`define GENERIC_AND_FUSE_REG_CPTRA_FUSE_PAUSER_LOCK_LOCK_LOW (0) +`define GENERIC_AND_FUSE_REG_CPTRA_FUSE_PAUSER_LOCK_LOCK_MASK (32'h1) +`define CALIPTRA_TOP_REG_GENERIC_AND_FUSE_REG_CPTRA_WDT_CFG_0 (32'h30030110) +`define GENERIC_AND_FUSE_REG_CPTRA_WDT_CFG_0 (32'h110) +`define CALIPTRA_TOP_REG_GENERIC_AND_FUSE_REG_CPTRA_WDT_CFG_1 (32'h30030114) +`define GENERIC_AND_FUSE_REG_CPTRA_WDT_CFG_1 (32'h114) +`define CALIPTRA_TOP_REG_GENERIC_AND_FUSE_REG_CPTRA_ITRNG_ENTROPY_CONFIG_0 (32'h30030118) +`define GENERIC_AND_FUSE_REG_CPTRA_ITRNG_ENTROPY_CONFIG_0 (32'h118) +`define GENERIC_AND_FUSE_REG_CPTRA_ITRNG_ENTROPY_CONFIG_0_LOW_THRESHOLD_LOW (0) +`define GENERIC_AND_FUSE_REG_CPTRA_ITRNG_ENTROPY_CONFIG_0_LOW_THRESHOLD_MASK (32'hffff) +`define GENERIC_AND_FUSE_REG_CPTRA_ITRNG_ENTROPY_CONFIG_0_HIGH_THRESHOLD_LOW (16) +`define GENERIC_AND_FUSE_REG_CPTRA_ITRNG_ENTROPY_CONFIG_0_HIGH_THRESHOLD_MASK (32'hffff0000) +`define CALIPTRA_TOP_REG_GENERIC_AND_FUSE_REG_CPTRA_ITRNG_ENTROPY_CONFIG_1 (32'h3003011c) +`define GENERIC_AND_FUSE_REG_CPTRA_ITRNG_ENTROPY_CONFIG_1 (32'h11c) +`define GENERIC_AND_FUSE_REG_CPTRA_ITRNG_ENTROPY_CONFIG_1_REPETITION_COUNT_LOW (0) +`define GENERIC_AND_FUSE_REG_CPTRA_ITRNG_ENTROPY_CONFIG_1_REPETITION_COUNT_MASK (32'hffff) +`define GENERIC_AND_FUSE_REG_CPTRA_ITRNG_ENTROPY_CONFIG_1_RSVD_LOW (16) +`define GENERIC_AND_FUSE_REG_CPTRA_ITRNG_ENTROPY_CONFIG_1_RSVD_MASK (32'hffff0000) +`define CALIPTRA_TOP_REG_GENERIC_AND_FUSE_REG_CPTRA_RSVD_REG_0 (32'h30030120) +`define GENERIC_AND_FUSE_REG_CPTRA_RSVD_REG_0 (32'h120) +`define CALIPTRA_TOP_REG_GENERIC_AND_FUSE_REG_CPTRA_RSVD_REG_1 (32'h30030124) +`define GENERIC_AND_FUSE_REG_CPTRA_RSVD_REG_1 (32'h124) `define CALIPTRA_TOP_REG_GENERIC_AND_FUSE_REG_FUSE_UDS_SEED_0 (32'h30030200) `define GENERIC_AND_FUSE_REG_FUSE_UDS_SEED_0 (32'h200) `define CALIPTRA_TOP_REG_GENERIC_AND_FUSE_REG_FUSE_UDS_SEED_1 (32'h30030204) @@ -476,6 +530,16 @@ `define GENERIC_AND_FUSE_REG_FUSE_LIFE_CYCLE (32'h33c) `define GENERIC_AND_FUSE_REG_FUSE_LIFE_CYCLE_LIFE_CYCLE_LOW (0) `define GENERIC_AND_FUSE_REG_FUSE_LIFE_CYCLE_LIFE_CYCLE_MASK (32'h3) +`define CALIPTRA_TOP_REG_GENERIC_AND_FUSE_REG_FUSE_LMS_VERIFY (32'h30030340) +`define GENERIC_AND_FUSE_REG_FUSE_LMS_VERIFY (32'h340) +`define GENERIC_AND_FUSE_REG_FUSE_LMS_VERIFY_LMS_VERIFY_LOW (0) +`define GENERIC_AND_FUSE_REG_FUSE_LMS_VERIFY_LMS_VERIFY_MASK (32'h1) +`define CALIPTRA_TOP_REG_GENERIC_AND_FUSE_REG_FUSE_LMS_REVOCATION (32'h30030344) +`define GENERIC_AND_FUSE_REG_FUSE_LMS_REVOCATION (32'h344) +`define CALIPTRA_TOP_REG_GENERIC_AND_FUSE_REG_FUSE_SOC_STEPPING_ID (32'h30030348) +`define GENERIC_AND_FUSE_REG_FUSE_SOC_STEPPING_ID (32'h348) +`define GENERIC_AND_FUSE_REG_FUSE_SOC_STEPPING_ID_SOC_STEPPING_ID_LOW (0) +`define GENERIC_AND_FUSE_REG_FUSE_SOC_STEPPING_ID_SOC_STEPPING_ID_MASK (32'hffff) `endif diff --git a/src/soc_ifc/rtl/mbox.sv b/src/soc_ifc/rtl/mbox.sv index 8ab16b1b8..2413f6954 100644 --- a/src/soc_ifc/rtl/mbox.sv +++ b/src/soc_ifc/rtl/mbox.sv @@ -33,6 +33,7 @@ module mbox output logic mbox_error, output logic [DATA_W-1:0] rdata, + output logic [DATA_W-1:0] dir_rdata, input logic sha_sram_req_dv, input logic [MBOX_ADDR_W-1:0] sha_sram_req_addr, @@ -51,6 +52,8 @@ module mbox output logic uc_mbox_data_avail, output logic soc_mbox_data_avail, output logic soc_req_mbox_lock, + output mbox_protocol_error_t mbox_protocol_error, + output logic mbox_inv_pauser_axs, //DMI reg access input logic dmi_inc_rdptr, @@ -58,8 +61,9 @@ module mbox ); -localparam DEPTH = (SIZE_KB * 1024 * 8) / DATA_W; -localparam MBOX_SIZE_IN_DW = (SIZE_KB*1024)/4; +localparam MBOX_SIZE_IN_BYTES = SIZE_KB*1024; +localparam MBOX_SIZE_IN_DW = (MBOX_SIZE_IN_BYTES)/4; +localparam DEPTH = (MBOX_SIZE_IN_DW * 32) / DATA_W; //this module is used to instantiate a single mailbox instance //requests within the address space of this mailbox are routed here from the top level @@ -84,18 +88,26 @@ logic arc_MBOX_EXECUTE_UC_MBOX_IDLE; logic arc_MBOX_EXECUTE_SOC_MBOX_IDLE; logic arc_MBOX_EXECUTE_UC_MBOX_EXECUTE_SOC; logic arc_MBOX_EXECUTE_SOC_MBOX_EXECUTE_UC; +logic arc_MBOX_RDY_FOR_CMD_MBOX_ERROR; +logic arc_MBOX_RDY_FOR_DLEN_MBOX_ERROR; +logic arc_MBOX_RDY_FOR_DATA_MBOX_ERROR; +logic arc_MBOX_EXECUTE_UC_MBOX_ERROR; +logic arc_MBOX_EXECUTE_SOC_MBOX_ERROR; //sram logic [DATA_W-1:0] sram_wdata; logic [MBOX_ECC_DATA_W-1:0] sram_wdata_ecc; logic [$clog2(DEPTH)-1:0] sram_waddr; logic [$clog2(DEPTH)-1:0] mbox_wrptr, mbox_wrptr_nxt; +logic mbox_wr_full, mbox_wr_full_nxt; logic inc_wrptr; logic [$clog2(DEPTH)-1:0] sram_rdaddr; logic [$clog2(DEPTH)-1:0] mbox_rdptr, mbox_rdptr_nxt; +logic mbox_rd_full, mbox_rd_full_nxt; logic inc_rdptr; logic rst_mbox_rdptr; logic rst_mbox_wrptr; +logic sram_rd_ecc_en; logic [DATA_W-1:0] sram_rdata; logic [MBOX_ECC_DATA_W-1:0] sram_rdata_ecc; logic [DATA_W-1:0] sram_rdata_cor; @@ -103,8 +115,6 @@ logic [MBOX_ECC_DATA_W-1:0] sram_rdata_cor_ecc; logic sram_we; logic mbox_protocol_sram_we; logic mbox_protocol_sram_rd, mbox_protocol_sram_rd_f; -logic sram_ecc_cor_we; -logic [$clog2(DEPTH)-1:0] sram_ecc_cor_waddr; logic dir_req_dv_q, dir_req_rd_phase; logic dir_req_wr_ph; logic mask_rdata; @@ -114,6 +124,15 @@ logic soc_has_lock, soc_has_lock_nxt; logic valid_requester; logic valid_receiver; +logic [$clog2(DEPTH):0] mbox_dlen_in_dws; +logic latch_dlen_in_dws; +logic [$clog2(DEPTH):0] dlen_in_dws, dlen_in_dws_nxt; +logic rdptr_inc_valid; +logic mbox_rd_valid, mbox_rd_valid_f; +logic wrptr_inc_valid; + +mbox_protocol_error_t mbox_protocol_error_nxt; + //csr logic [DATA_W-1:0] csr_rdata; logic read_error; @@ -133,14 +152,16 @@ always_comb valid_requester = hwif_out.mbox_lock.lock.value & //Determine if this is a valid request from the receiver side always_comb valid_receiver = hwif_out.mbox_lock.lock.value & - //Receiver is valid when they don't have the lock - ((~req_data.soc_req & soc_has_lock) | (req_data.soc_req & ~soc_has_lock) | + //Receiver is valid when in their execute state + //if they don't have the lock + ((~req_data.soc_req & soc_has_lock & (mbox_fsm_ps == MBOX_EXECUTE_UC )) | + ( req_data.soc_req & ~soc_has_lock & (mbox_fsm_ps == MBOX_EXECUTE_SOC)) | //Receiver is valid when they are reading a response to their request (valid_requester & ((soc_has_lock & (mbox_fsm_ps == MBOX_EXECUTE_SOC)) | (~soc_has_lock & (mbox_fsm_ps == MBOX_EXECUTE_UC))))); //We want to mask read data when -//Invalid user is trying to access the mailbox data, or we're not in execute state +//Invalid user is trying to access the mailbox data always_comb mask_rdata = hwif_out.mbox_dataout.dataout.swacc & ~valid_receiver; //move from idle to rdy for command when lock is acquired @@ -162,27 +183,55 @@ always_comb arc_MBOX_EXECUTE_SOC_MBOX_IDLE = (mbox_fsm_ps == MBOX_EXECUTE_SOC) & always_comb arc_MBOX_EXECUTE_SOC_MBOX_EXECUTE_UC = (mbox_fsm_ps == MBOX_EXECUTE_SOC) & ~soc_has_lock & (hwif_out.mbox_status.status.value != CMD_BUSY); //move back to IDLE and unlock when force unlock is set always_comb arc_FORCE_MBOX_UNLOCK = hwif_out.mbox_unlock.unlock.value; - -logic [$clog2(DEPTH)-1:0] mbox_dlen_in_dws; -logic latch_dlen_in_dws; -logic [$clog2(DEPTH)-1:0] dlen_in_dws, dlen_in_dws_nxt; -logic rdptr_inc_valid; -logic mbox_rd_valid; -logic wrptr_inc_valid; +// Detect error conditions and peg to the error state until serviced. +// Any register write (or read from mbox_dataout) by a VALID agent +// while in the incorrect state for access to that register results +// in transition to MBOX_ERROR and assertion of the protocol_error. +// Any register write or read by an INVALID agent results in the access +// being silently dropped. +// Assumption: uC (ROM, FMC, RT) will never make an invalid request. +// NOTE: Any APB agent can trigger the error at any point during a uC->SOC flow +// by writing to mbox_status (since it's a valid_receiver). +// FIXED! valid_receiver is restricted by FSM state now. +always_comb arc_MBOX_RDY_FOR_CMD_MBOX_ERROR = (mbox_fsm_ps == MBOX_RDY_FOR_CMD) && + req_dv && req_data.soc_req && ~req_hold && valid_requester && + (req_data.write ? (!hwif_out.mbox_cmd.command.swmod) : + (hwif_out.mbox_dataout.dataout.swacc)); +always_comb arc_MBOX_RDY_FOR_DLEN_MBOX_ERROR = (mbox_fsm_ps == MBOX_RDY_FOR_DLEN) && + req_dv && req_data.soc_req && ~req_hold && valid_requester && + (req_data.write ? (!hwif_out.mbox_dlen.length.swmod) : + (hwif_out.mbox_dataout.dataout.swacc)); +always_comb arc_MBOX_RDY_FOR_DATA_MBOX_ERROR = (mbox_fsm_ps == MBOX_RDY_FOR_DATA) && + req_dv && req_data.soc_req && ~req_hold && valid_requester && + (req_data.write ? (!(hwif_out.mbox_datain.datain.swmod || hwif_out.mbox_execute.execute.swmod)) : + (hwif_out.mbox_dataout.dataout.swacc)); +always_comb arc_MBOX_EXECUTE_UC_MBOX_ERROR = (mbox_fsm_ps == MBOX_EXECUTE_UC) && + req_dv && req_data.soc_req && ~req_hold && valid_requester && + (req_data.write ? (1'b1/* any write by 'valid' soc is illegal here */) : + (hwif_out.mbox_dataout.dataout.swacc)); +always_comb arc_MBOX_EXECUTE_SOC_MBOX_ERROR = (mbox_fsm_ps == MBOX_EXECUTE_SOC) && + req_dv && req_data.soc_req && ~req_hold && + (req_data.write ? ((valid_requester && !(hwif_out.mbox_execute.execute.swmod)) || + (~soc_has_lock && !(hwif_out.mbox_status.status.swmod))) : + (1'b0 /* any read allowed by SoC during this stage; dataout consumption is expected */)); //capture the dlen when we change to execute states, this ensures that only the dlen programmed //by the client filling the mailbox is used for masking the data //Store the dlen as a ptr to the last entry always_comb latch_dlen_in_dws = arc_MBOX_RDY_FOR_DATA_MBOX_EXECUTE_UC | arc_MBOX_RDY_FOR_DATA_MBOX_EXECUTE_SOC | arc_MBOX_EXECUTE_UC_MBOX_EXECUTE_SOC; -always_comb mbox_dlen_in_dws = (hwif_out.mbox_dlen.length.value >> 2) + (hwif_out.mbox_dlen.length.value[0] | hwif_out.mbox_dlen.length.value[1]) - 1; -//latched dlen is the smaller of the programmed dlen or the actual write pointer +always_comb mbox_dlen_in_dws = (hwif_out.mbox_dlen.length.value >= MBOX_SIZE_IN_BYTES) ? MBOX_SIZE_IN_DW : + (hwif_out.mbox_dlen.length.value >> 2) + (hwif_out.mbox_dlen.length.value[0] | hwif_out.mbox_dlen.length.value[1]); +//latched dlen is the smaller of the programmed dlen or the current wrptr //this avoids a case where a sender writes less than programmed and the receiver can read beyond that -always_comb dlen_in_dws_nxt = (mbox_wrptr < mbox_dlen_in_dws) ? mbox_wrptr : mbox_dlen_in_dws; +//if the mailbox is full (flag set when writing last entry), always take the programmed dlen +always_comb dlen_in_dws_nxt = (~mbox_wr_full & ({1'b0,mbox_wrptr} < mbox_dlen_in_dws)) ? {1'b0,mbox_wrptr} : mbox_dlen_in_dws; // Restrict the read pointer from passing the dlen or rolling over -always_comb rdptr_inc_valid = (mbox_rdptr <= dlen_in_dws) & (mbox_rdptr < (MBOX_SIZE_IN_DW-1)); +always_comb rdptr_inc_valid = ({1'b0,mbox_rdptr} < dlen_in_dws) & (mbox_rdptr < (MBOX_SIZE_IN_DW-1)); +// No more valid reads if we read the last entry +// On pre-load of entry 0, ensure that next dlen isn't 0 // Restrict reads once read pointer has passed the dlen -always_comb mbox_rd_valid = mbox_rdptr <= dlen_in_dws; +always_comb mbox_rd_valid = (rst_mbox_rdptr & (dlen_in_dws_nxt != 0)) | (~rst_mbox_rdptr & ~mbox_rd_full & ({1'b0,mbox_rdptr} < dlen_in_dws)); // Restrict the write pointer from rolling over always_comb wrptr_inc_valid = mbox_wrptr < (MBOX_SIZE_IN_DW-1); @@ -191,9 +240,11 @@ always_comb begin : mbox_fsm_combo soc_has_lock_nxt = 0; rst_mbox_rdptr = 0; //resetting the read pointer will pre-load dataout rst_mbox_wrptr = 0; - inc_rdptr = 0; inc_wrptr = 0; + inc_rdptr = 0; + inc_wrptr = 0; uc_mbox_data_avail = 0; soc_mbox_data_avail = 0; + mbox_protocol_error_nxt = '{default: 0}; mbox_fsm_ns = mbox_fsm_ps; unique casez (mbox_fsm_ps) @@ -202,25 +253,40 @@ always_comb begin : mbox_fsm_combo mbox_fsm_ns = MBOX_RDY_FOR_CMD; soc_has_lock_nxt = req_data.soc_req; //remember if soc or uc requested the lock end + // Flag a non-fatal error, but don't change states, if mbox is already IDLE + // when an unexpected SOC access happens + if (req_dv && req_data.soc_req && !req_hold && (req_data.write || hwif_out.mbox_dataout.dataout.swacc)) begin + mbox_protocol_error_nxt.axs_without_lock = 1'b1; + end end MBOX_RDY_FOR_CMD: begin if (arc_MBOX_RDY_FOR_CMD_MBOX_RDY_FOR_DLEN) begin mbox_fsm_ns = MBOX_RDY_FOR_DLEN; end + else if (arc_MBOX_RDY_FOR_CMD_MBOX_ERROR) begin + mbox_fsm_ns = MBOX_ERROR; + mbox_protocol_error_nxt.axs_incorrect_order = 1'b1; + end if (arc_FORCE_MBOX_UNLOCK) begin mbox_fsm_ns = MBOX_IDLE; rst_mbox_wrptr = 1; rst_mbox_rdptr = 1; + mbox_protocol_error_nxt = '{default: 0}; end end MBOX_RDY_FOR_DLEN: begin if (arc_MBOX_RDY_FOR_DLEN_MBOX_RDY_FOR_DATA) begin mbox_fsm_ns = MBOX_RDY_FOR_DATA; end + else if (arc_MBOX_RDY_FOR_DLEN_MBOX_ERROR) begin + mbox_fsm_ns = MBOX_ERROR; + mbox_protocol_error_nxt.axs_incorrect_order = 1'b1; + end if (arc_FORCE_MBOX_UNLOCK) begin mbox_fsm_ns = MBOX_IDLE; rst_mbox_wrptr = 1; rst_mbox_rdptr = 1; + mbox_protocol_error_nxt = '{default: 0}; end end MBOX_RDY_FOR_DATA: begin @@ -238,10 +304,17 @@ always_comb begin : mbox_fsm_combo rst_mbox_wrptr = 1; rst_mbox_rdptr = 1; end + else if (arc_MBOX_RDY_FOR_DATA_MBOX_ERROR) begin + mbox_fsm_ns = MBOX_ERROR; + mbox_protocol_error_nxt.axs_incorrect_order = 1'b1; + end if (arc_FORCE_MBOX_UNLOCK) begin mbox_fsm_ns = MBOX_IDLE; + inc_wrptr = 0; + inc_rdptr = 0; rst_mbox_wrptr = 1; rst_mbox_rdptr = 1; + mbox_protocol_error_nxt = '{default: 0}; end end //SoC set execute, data is for the uC @@ -261,10 +334,17 @@ always_comb begin : mbox_fsm_combo rst_mbox_wrptr = 1; rst_mbox_rdptr = 1; end + else if (arc_MBOX_EXECUTE_UC_MBOX_ERROR) begin + mbox_fsm_ns = MBOX_ERROR; + mbox_protocol_error_nxt.axs_incorrect_order = 1'b1; + end if (arc_FORCE_MBOX_UNLOCK) begin mbox_fsm_ns = MBOX_IDLE; + inc_wrptr = 0; + inc_rdptr = 0; rst_mbox_wrptr = 1; rst_mbox_rdptr = 1; + mbox_protocol_error_nxt = '{default: 0}; end end //uC set execute, data is for the SoC @@ -284,10 +364,26 @@ always_comb begin : mbox_fsm_combo rst_mbox_wrptr = 1; rst_mbox_rdptr = 1; end + else if (arc_MBOX_EXECUTE_SOC_MBOX_ERROR) begin + mbox_fsm_ns = MBOX_ERROR; + mbox_protocol_error_nxt.axs_incorrect_order = 1'b1; + end if (arc_FORCE_MBOX_UNLOCK) begin mbox_fsm_ns = MBOX_IDLE; + inc_wrptr = 0; + inc_rdptr = 0; rst_mbox_wrptr = 1; rst_mbox_rdptr = 1; + mbox_protocol_error_nxt = '{default: 0}; + end + end + MBOX_ERROR: begin + mbox_protocol_error_nxt = '{default: 0}; + if (arc_FORCE_MBOX_UNLOCK) begin + mbox_fsm_ns = MBOX_IDLE; + rst_mbox_wrptr = 1; + rst_mbox_rdptr = 1; + mbox_protocol_error_nxt = '{default: 0}; end end @@ -297,10 +393,17 @@ always_comb begin : mbox_fsm_combo endcase end +// Any ol' PAUSER is fine for reg-reads (except dataout) +// NOTE: This only captures accesses by APB agents that are valid, but do not +// have lock. Invalid agent accesses are blocked by arbiter. +assign mbox_inv_pauser_axs = req_dv && req_data.soc_req && !req_hold && + !valid_requester && !valid_receiver && + (req_data.write || hwif_out.mbox_dataout.dataout.swacc); + //increment read ptr only if its allowed -always_comb mbox_protocol_sram_rd = (inc_rdptr & mbox_rd_valid) | rst_mbox_rdptr; -always_comb mbox_protocol_sram_we = inc_wrptr; +always_comb mbox_protocol_sram_rd = inc_rdptr | rst_mbox_rdptr; +always_comb mbox_protocol_sram_we = inc_wrptr & ~mbox_wr_full; //flops always_ff @(posedge clk or negedge rst_b) begin @@ -309,10 +412,13 @@ always_ff @(posedge clk or negedge rst_b) begin soc_has_lock <= '0; dir_req_rd_phase <= '0; mbox_wrptr <= '0; + mbox_wr_full <= '0; mbox_rdptr <= '0; + mbox_rd_full <= '0; mbox_protocol_sram_rd_f <= '0; - sram_ecc_cor_waddr <= '0; dlen_in_dws <= '0; + mbox_protocol_error <= '0; + sram_rd_ecc_en <= '0; end else begin mbox_fsm_ps <= mbox_fsm_ns; @@ -320,12 +426,16 @@ always_ff @(posedge clk or negedge rst_b) begin hwif_out.mbox_lock.lock.value ? soc_has_lock : '0; dir_req_rd_phase <= dir_req_dv_q & ~sha_sram_req_dv & ~req_data.write; mbox_wrptr <= ((inc_wrptr & wrptr_inc_valid) | rst_mbox_wrptr) ? mbox_wrptr_nxt : mbox_wrptr; + mbox_wr_full <= (inc_wrptr | rst_mbox_wrptr) ? mbox_wr_full_nxt : mbox_wr_full; mbox_rdptr <= (mbox_protocol_sram_rd) ? mbox_rdptr_nxt : mbox_rdptr; - mbox_protocol_sram_rd_f <= (mbox_protocol_sram_rd | mbox_protocol_sram_rd_f) ? (mbox_protocol_sram_rd) : mbox_protocol_sram_rd_f; - sram_ecc_cor_waddr <= /*dir_req_rd_phase ? sram_ecc_cor_waddr :*/ - sram_rdaddr; + mbox_protocol_sram_rd_f <= (mbox_protocol_sram_rd | mbox_protocol_sram_rd_f) ? mbox_protocol_sram_rd : mbox_protocol_sram_rd_f; + mbox_rd_full <= (inc_rdptr | rst_mbox_rdptr) ? mbox_rd_full_nxt : mbox_rd_full; + mbox_rd_valid_f <= (mbox_rd_valid | mbox_rd_valid_f) ? mbox_rd_valid : mbox_rd_valid_f; dlen_in_dws <= latch_dlen_in_dws ? dlen_in_dws_nxt : dlen_in_dws; + mbox_protocol_error <= mbox_protocol_error_nxt; + //enable ecc for mbox protocol, direct reads, or SHA direct reads + sram_rd_ecc_en <= mbox_protocol_sram_rd | (dir_req_dv_q & ~sha_sram_req_dv & ~req_data.write) | sha_sram_req_dv; end end @@ -345,27 +455,26 @@ always_comb req_hold = (dir_req_dv_q & ~req_data.write) | (dir_req_dv & sha_sram_req_dv) | (hwif_out.mbox_dataout.dataout.swacc & mbox_protocol_sram_rd_f); -always_comb sha_sram_hold = sram_single_ecc_error/* || sram_ecc_cor_we*/; +always_comb sha_sram_hold = 1'b0; //SRAM interface -always_comb sram_ecc_cor_we = sram_single_ecc_error; // TODO we probably want this to be a reg-stage to reduce combo logic SRAM -> rdata -> wdata -> SRAM -always_comb sram_we = dir_req_wr_ph | mbox_protocol_sram_we | sram_ecc_cor_we; +always_comb sram_we = dir_req_wr_ph | mbox_protocol_sram_we; //align the direct address to a word always_comb sram_rdaddr = dir_req_dv_q ? dir_req_addr : rst_mbox_rdptr ? 'd0 : mbox_rdptr; -always_comb sram_waddr = sram_ecc_cor_we ? sram_ecc_cor_waddr : - dir_req_dv_q ? dir_req_addr : mbox_wrptr; +always_comb sram_waddr = dir_req_dv_q ? dir_req_addr : mbox_wrptr; //data phase after request for direct access //We want to mask the read data for certain accesses -always_comb rdata = dir_req_rd_phase ? sram_rdata_cor : ({DATA_W{~mask_rdata}} & csr_rdata); +always_comb rdata = ({DATA_W{~mask_rdata}} & csr_rdata); +always_comb dir_rdata = dir_req_rd_phase ? sram_rdata_cor : '0; always_comb begin: mbox_sram_inf //read live on direct access, or when pointer has been incremented, for pre-load on read pointer reset, or ecc correction - mbox_sram_req.cs = dir_req_dv_q | mbox_protocol_sram_we | mbox_protocol_sram_rd | sram_ecc_cor_we; + mbox_sram_req.cs = dir_req_dv_q | mbox_protocol_sram_we | mbox_protocol_sram_rd; mbox_sram_req.we = sram_we; mbox_sram_req.addr = sram_we ? sram_waddr : sram_rdaddr; - mbox_sram_req.wdata.data = sram_ecc_cor_we ? sram_rdata_cor : sram_wdata; - mbox_sram_req.wdata.ecc = sram_ecc_cor_we ? sram_rdata_cor_ecc : sram_wdata_ecc; + mbox_sram_req.wdata.data = sram_wdata; + mbox_sram_req.wdata.ecc = sram_wdata_ecc; sram_rdata = mbox_sram_resp.rdata.data; sram_rdata_ecc = mbox_sram_resp.rdata.ecc; @@ -384,7 +493,7 @@ initial assert(DATA_W == 32) else $error("%m::rvecc_encode supports 32-bit data width; must change SRAM ECC implementation to support DATA_W = %d", DATA_W); // synthesis translate_on rvecc_decode ecc_decode ( - .en (dir_req_rd_phase | mbox_protocol_sram_rd_f), + .en (sram_rd_ecc_en ), .sed_ded ( 1'b0 ), // 1 : means only detection .din (sram_rdata ), .ecc_in (sram_rdata_ecc ), @@ -404,12 +513,15 @@ always_comb mbox_wrptr_nxt = rst_mbox_wrptr ? '0 : (inc_wrptr & wrptr_inc_valid) ? mbox_wrptr + 'd1 : mbox_wrptr; +always_comb mbox_wr_full_nxt = rst_mbox_wrptr ? '0 : inc_wrptr & (mbox_wrptr == (DEPTH-1)); //in execute state we increment the pointer each time we write always_comb mbox_rdptr_nxt = rst_mbox_rdptr ? 'd1 : (inc_rdptr & rdptr_inc_valid) ? mbox_rdptr + 'd1 : mbox_rdptr; +always_comb mbox_rd_full_nxt = rst_mbox_rdptr ? '0 : inc_rdptr & (mbox_rdptr == (DEPTH-1)); + //Intterupts //Notify uC when it has the lock and SoC is requesting the lock always_comb soc_req_mbox_lock = hwif_out.mbox_lock.lock.value & ~soc_has_lock & hwif_out.mbox_lock.lock.swmod & req_data.soc_req; @@ -434,7 +546,7 @@ always_comb hwif_in.mbox_dataout.dataout.swwe = '0; //no sw write enable, but ne //update dataout whenever we read from the sram for a dataout access //we load the first entry on the arc to execute always_comb hwif_in.mbox_dataout.dataout.we = mbox_protocol_sram_rd_f; -always_comb hwif_in.mbox_dataout.dataout.next = sram_rdata_cor; +always_comb hwif_in.mbox_dataout.dataout.next = mbox_rd_valid_f ? sram_rdata_cor : '0; //clear the lock when moving from execute to idle always_comb hwif_in.mbox_lock.lock.hwclr = arc_MBOX_EXECUTE_SOC_MBOX_IDLE | arc_MBOX_EXECUTE_UC_MBOX_IDLE | arc_FORCE_MBOX_UNLOCK; //clear the mailbox status when we go back to IDLE @@ -445,10 +557,12 @@ always_comb hwif_in.mbox_execute.execute.hwclr = arc_FORCE_MBOX_UNLOCK; always_comb hwif_in.mbox_status.ecc_single_error.hwset = sram_single_ecc_error; always_comb hwif_in.mbox_status.ecc_double_error.hwset = sram_double_ecc_error; always_comb hwif_in.mbox_status.soc_has_lock.next = soc_has_lock; +always_comb hwif_in.mbox_status.mbox_rdptr.next = mbox_rdptr; always_comb dmi_reg.MBOX_DLEN = hwif_out.mbox_dlen.length.value; always_comb dmi_reg.MBOX_DOUT = hwif_out.mbox_dataout.dataout.value; -always_comb dmi_reg.MBOX_STATUS = {22'd0, /* [31:10] */ +always_comb dmi_reg.MBOX_STATUS = {7'd0, /* [31:25] */ + hwif_out.mbox_status.mbox_rdptr.value, /* [24:10]*/ hwif_out.mbox_status.soc_has_lock.value, /* [9] */ hwif_out.mbox_status.mbox_fsm_ps.value, /* [8:6] */ hwif_out.mbox_status.ecc_double_error.value, /* [5] */ @@ -483,7 +597,8 @@ mbox_csr1( .hwif_out(hwif_out) ); -`CALIPTRA_ASSERT_MUTEX(ERR_MBOX_ACCESS_MUTEX, {dir_req_dv_q | mbox_protocol_sram_we | mbox_protocol_sram_rd | sram_ecc_cor_we}, clk, rst_b) +`CALIPTRA_ASSERT_MUTEX(ERR_MBOX_ACCESS_MUTEX, {dir_req_dv_q , mbox_protocol_sram_we , mbox_protocol_sram_rd }, clk, rst_b) `CALIPTRA_ASSERT_MUTEX(ERR_MBOX_DIR_SHA_COLLISION, {dir_req_dv, sha_sram_req_dv}, clk, rst_b) +`CALIPTRA_ASSERT_NEVER(ERR_MBOX_DIR_REQ_FROM_SOC, (dir_req_dv & req_data.soc_req), clk, rst_b) endmodule diff --git a/src/soc_ifc/rtl/mbox_csr.rdl b/src/soc_ifc/rtl/mbox_csr.rdl index 02223d3a4..8a67121be 100644 --- a/src/soc_ifc/rtl/mbox_csr.rdl +++ b/src/soc_ifc/rtl/mbox_csr.rdl @@ -36,7 +36,7 @@ addrmap mbox_csr { desc="Mailbox lock register for mailbox access, reading 0 will set the lock [br]Caliptra Access: RO [br]SOC Access: RO"; - field {rset; sw=r; hw=r; hwclr=true; swmod=true;} lock=0; + field {rset; sw=r; hw=r; hwclr=true; precedence=hw; swmod=true;} lock=0; } mbox_lock; // user register @@ -88,7 +88,7 @@ addrmap mbox_csr { desc="Mailbox execute register indicates to receiver that the sender is done [br]Caliptra Access: RW [br]SOC Access: RW"; - field {sw=rw; hw=r; swwe=valid_requester; hwclr;} execute=0; + field {sw=rw; hw=r; swwe=valid_requester; hwclr; precedence=hw; swmod=true;} execute=0; } mbox_execute; reg { @@ -115,7 +115,7 @@ addrmap mbox_csr { desc = "The requested command experienced a failure."; }; }; - sw=rw; hw=r; swwe=valid_receiver; encode = mbox_status_e; hwclr;} status[4]=0; + sw=rw; hw=r; swwe=valid_receiver; encode = mbox_status_e; hwclr; precedence=hw; swmod=true;} status[4]=0; field { name = "Mailbox ECC Single Error"; desc = "Indicates a correctable ECC single-bit error was @@ -164,6 +164,9 @@ addrmap mbox_csr { MBOX_EXECUTE_SOC = 3'b100 { desc = "Mailbox has data for SoC"; }; + MBOX_ERROR = 3'b111 { + desc = "Mailbox Protocol Error detected"; + }; }; sw=r; hw=rw; encode = mbox_fsm_e; } mbox_fsm_ps[3] = 0; @@ -174,6 +177,13 @@ addrmap mbox_csr { [br]SOC Access: RO [br]TAP Access [in debug/manuf mode]: RO"; sw=r; hw=rw;} soc_has_lock=1'b0; + field { + name = "Current Mailbox Read Pointer"; + desc = "Returns the current read pointer for the mailbox + [br]Caliptra Access: RO + [br]SOC Access: RO + [br]TAP Access [in debug/manuf mode]: RO"; + sw=r; hw=rw;} mbox_rdptr[15] = 0; } mbox_status; reg { diff --git a/src/soc_ifc/rtl/mbox_csr.sv b/src/soc_ifc/rtl/mbox_csr.sv index 543af60b3..cefd5b73d 100644 --- a/src/soc_ifc/rtl/mbox_csr.sv +++ b/src/soc_ifc/rtl/mbox_csr.sv @@ -169,6 +169,10 @@ module mbox_csr ( logic next; logic load_next; } soc_has_lock; + struct packed{ + logic [14:0] next; + logic load_next; + } mbox_rdptr; } mbox_status; struct packed{ struct packed{ @@ -231,6 +235,9 @@ module mbox_csr ( struct packed{ logic value; } soc_has_lock; + struct packed{ + logic [14:0] value; + } mbox_rdptr; } mbox_status; struct packed{ struct packed{ @@ -244,12 +251,12 @@ module mbox_csr ( always_comb begin automatic logic [0:0] next_c = field_storage.mbox_lock.lock.value; automatic logic load_next_c = '0; - if(decoded_reg_strb.mbox_lock && !decoded_req_is_wr) begin // SW set on read - next_c = '1; - load_next_c = '1; - end else if(hwif_in.mbox_lock.lock.hwclr) begin // HW Clear + if(hwif_in.mbox_lock.lock.hwclr) begin // HW Clear next_c = '0; load_next_c = '1; + end else if(decoded_reg_strb.mbox_lock && !decoded_req_is_wr) begin // SW set on read + next_c = '1; + load_next_c = '1; end field_combo.mbox_lock.lock.next = next_c; field_combo.mbox_lock.lock.load_next = load_next_c; @@ -367,12 +374,12 @@ module mbox_csr ( always_comb begin automatic logic [0:0] next_c = field_storage.mbox_execute.execute.value; automatic logic load_next_c = '0; - if(decoded_reg_strb.mbox_execute && decoded_req_is_wr && hwif_in.valid_requester) begin // SW write - next_c = (field_storage.mbox_execute.execute.value & ~decoded_wr_biten[0:0]) | (decoded_wr_data[0:0] & decoded_wr_biten[0:0]); - load_next_c = '1; - end else if(hwif_in.mbox_execute.execute.hwclr) begin // HW Clear + if(hwif_in.mbox_execute.execute.hwclr) begin // HW Clear next_c = '0; load_next_c = '1; + end else if(decoded_reg_strb.mbox_execute && decoded_req_is_wr && hwif_in.valid_requester) begin // SW write + next_c = (field_storage.mbox_execute.execute.value & ~decoded_wr_biten[0:0]) | (decoded_wr_data[0:0] & decoded_wr_biten[0:0]); + load_next_c = '1; end field_combo.mbox_execute.execute.next = next_c; field_combo.mbox_execute.execute.load_next = load_next_c; @@ -385,16 +392,17 @@ module mbox_csr ( end end assign hwif_out.mbox_execute.execute.value = field_storage.mbox_execute.execute.value; + assign hwif_out.mbox_execute.execute.swmod = decoded_reg_strb.mbox_execute && decoded_req_is_wr; // Field: mbox_csr.mbox_status.status always_comb begin automatic logic [3:0] next_c = field_storage.mbox_status.status.value; automatic logic load_next_c = '0; - if(decoded_reg_strb.mbox_status && decoded_req_is_wr && hwif_in.valid_receiver) begin // SW write - next_c = (field_storage.mbox_status.status.value & ~decoded_wr_biten[3:0]) | (decoded_wr_data[3:0] & decoded_wr_biten[3:0]); - load_next_c = '1; - end else if(hwif_in.mbox_status.status.hwclr) begin // HW Clear + if(hwif_in.mbox_status.status.hwclr) begin // HW Clear next_c = '0; load_next_c = '1; + end else if(decoded_reg_strb.mbox_status && decoded_req_is_wr && hwif_in.valid_receiver) begin // SW write + next_c = (field_storage.mbox_status.status.value & ~decoded_wr_biten[3:0]) | (decoded_wr_data[3:0] & decoded_wr_biten[3:0]); + load_next_c = '1; end field_combo.mbox_status.status.next = next_c; field_combo.mbox_status.status.load_next = load_next_c; @@ -407,6 +415,7 @@ module mbox_csr ( end end assign hwif_out.mbox_status.status.value = field_storage.mbox_status.status.value; + assign hwif_out.mbox_status.status.swmod = decoded_reg_strb.mbox_status && decoded_req_is_wr; // Field: mbox_csr.mbox_status.ecc_single_error always_comb begin automatic logic [0:0] next_c = field_storage.mbox_status.ecc_single_error.value; @@ -489,6 +498,25 @@ module mbox_csr ( end end assign hwif_out.mbox_status.soc_has_lock.value = field_storage.mbox_status.soc_has_lock.value; + // Field: mbox_csr.mbox_status.mbox_rdptr + always_comb begin + automatic logic [14:0] next_c = field_storage.mbox_status.mbox_rdptr.value; + automatic logic load_next_c = '0; + if(1) begin // HW Write + next_c = hwif_in.mbox_status.mbox_rdptr.next; + load_next_c = '1; + end + field_combo.mbox_status.mbox_rdptr.next = next_c; + field_combo.mbox_status.mbox_rdptr.load_next = load_next_c; + end + always_ff @(posedge clk or negedge hwif_in.cptra_rst_b) begin + if(~hwif_in.cptra_rst_b) begin + field_storage.mbox_status.mbox_rdptr.value <= 'h0; + end else if(field_combo.mbox_status.mbox_rdptr.load_next) begin + field_storage.mbox_status.mbox_rdptr.value <= field_combo.mbox_status.mbox_rdptr.next; + end + end + assign hwif_out.mbox_status.mbox_rdptr.value = field_storage.mbox_status.mbox_rdptr.value; // Field: mbox_csr.mbox_unlock.unlock always_comb begin automatic logic [0:0] next_c = field_storage.mbox_unlock.unlock.value; @@ -534,7 +562,8 @@ module mbox_csr ( assign readback_array[7][5:5] = (decoded_reg_strb.mbox_status && !decoded_req_is_wr) ? field_storage.mbox_status.ecc_double_error.value : '0; assign readback_array[7][8:6] = (decoded_reg_strb.mbox_status && !decoded_req_is_wr) ? field_storage.mbox_status.mbox_fsm_ps.value : '0; assign readback_array[7][9:9] = (decoded_reg_strb.mbox_status && !decoded_req_is_wr) ? field_storage.mbox_status.soc_has_lock.value : '0; - assign readback_array[7][31:10] = '0; + assign readback_array[7][24:10] = (decoded_reg_strb.mbox_status && !decoded_req_is_wr) ? field_storage.mbox_status.mbox_rdptr.value : '0; + assign readback_array[7][31:25] = '0; assign readback_array[8][0:0] = (decoded_reg_strb.mbox_unlock && !decoded_req_is_wr) ? field_storage.mbox_unlock.unlock.value : '0; assign readback_array[8][31:1] = '0; diff --git a/src/soc_ifc/rtl/mbox_csr_covergroups.svh b/src/soc_ifc/rtl/mbox_csr_covergroups.svh new file mode 100644 index 000000000..3664e1fc3 --- /dev/null +++ b/src/soc_ifc/rtl/mbox_csr_covergroups.svh @@ -0,0 +1,324 @@ +// SPDX-License-Identifier: Apache-2.0 +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +`ifndef MBOX_CSR_COVERGROUPS + `define MBOX_CSR_COVERGROUPS + + import soc_ifc_pkg::*; + + /*----------------------- MBOX_CSR__MBOX_LOCK COVERGROUPS -----------------------*/ + covergroup mbox_csr__mbox_lock_bit_cg with function sample(input bit reg_bit); + option.per_instance = 1; + reg_bit_cp : coverpoint reg_bit { + bins value[2] = {0,1}; + } + reg_bit_edge_cp : coverpoint reg_bit { + bins rise = (0 => 1); + bins fall = (1 => 0); + } + + endgroup + covergroup mbox_csr__mbox_lock_fld_cg with function sample( + input bit [1-1:0] lock + ); + option.per_instance = 1; + lock_cp : coverpoint lock; + lock_edge_cp : coverpoint lock { + bins rise = (0 => 1); + bins fall = (1 => 0); + } + + endgroup + + /*----------------------- MBOX_CSR__MBOX_USER COVERGROUPS -----------------------*/ + covergroup mbox_csr__mbox_user_bit_cg with function sample(input bit reg_bit); + option.per_instance = 1; + reg_bit_cp : coverpoint reg_bit { + bins value[2] = {0,1}; + } + reg_bit_edge_cp : coverpoint reg_bit { + bins rise = (0 => 1); + bins fall = (1 => 0); + } + + endgroup + covergroup mbox_csr__mbox_user_fld_cg with function sample( + input bit [32-1:0] user + ); + option.per_instance = 1; + user_cp : coverpoint user { + bins zero_val = {32'h0}; + bins rand_val[64] = {[1:32'hFFFF_FFFE]}; + bins ones_val = {{32{1'b1}}}; + wildcard bins set = (0 => 32'h????_????); + wildcard bins clr = (32'h????_???? => 0); + } + + endgroup + + /*----------------------- MBOX_CSR__MBOX_CMD COVERGROUPS -----------------------*/ + covergroup mbox_csr__mbox_cmd_bit_cg with function sample(input bit reg_bit); + option.per_instance = 1; + reg_bit_cp : coverpoint reg_bit { + bins value[2] = {0,1}; + } + reg_bit_edge_cp : coverpoint reg_bit { + bins rise = (0 => 1); + bins fall = (1 => 0); + } + + endgroup + covergroup mbox_csr__mbox_cmd_fld_cg with function sample( + input bit [32-1:0] command + ); + option.per_instance = 1; + command_cp : coverpoint command { + bins zero_val = {32'h0}; + bins rand_val[64] = {[1:32'hFFFF_FFFE]}; + bins ones_val = {{32{1'b1}}}; + wildcard bins set = (0 => 32'h????_????); + wildcard bins clr = (32'h????_???? => 0); + } + + endgroup + + /*----------------------- MBOX_CSR__MBOX_DLEN COVERGROUPS -----------------------*/ + covergroup mbox_csr__mbox_dlen_bit_cg with function sample(input bit reg_bit); + option.per_instance = 1; + reg_bit_cp : coverpoint reg_bit { + bins value[2] = {0,1}; + } + reg_bit_edge_cp : coverpoint reg_bit { + bins rise = (0 => 1); + bins fall = (1 => 0); + } + + endgroup + covergroup mbox_csr__mbox_dlen_fld_cg with function sample( + input bit [32-1:0] length + ); + option.per_instance = 1; + // TODO These need a cross with lock/execute/fsm state to properly get coverage... + length_cp : coverpoint length { + bins zero_val = {32'h0}; + bins tiny_val = {[1:3]}; + bins small_val = {[4:15]}; + bins medium_val = {[16:4095]}; + bins large_val = {[4096:32768]}; + bins legal_word_aligned_val = {[1:32'h8000]} with (~|item[0]); + bins legal_dword_aligned_val = {[1:32'h8000]} with (~|item[1:0]); + bins legal_qword_aligned_val = {[1:32'h8000]} with (~|item[2:0]); + bins legal_oword_aligned_val = {[1:32'h8000]} with (~|item[3:0]); + bins oversize_val = {[32769:32'hFFFF_FFFE]}; /* Value larger than mailbox size */ + bins ones_val = {{32{1'b1}}}; + wildcard bins set = (0 => 32'h????_????); + wildcard bins clr = (32'h????_???? => 0); + } + + endgroup + + /*----------------------- MBOX_CSR__MBOX_DATAIN COVERGROUPS -----------------------*/ + covergroup mbox_csr__mbox_datain_bit_cg with function sample(input bit reg_bit); + option.per_instance = 1; + reg_bit_cp : coverpoint reg_bit { + bins value[2] = {0,1}; + } + reg_bit_edge_cp : coverpoint reg_bit { + bins rise = (0 => 1); + bins fall = (1 => 0); + } + + endgroup + covergroup mbox_csr__mbox_datain_fld_cg with function sample( + input bit [32-1:0] datain + ); + option.per_instance = 1; + datain_cp : coverpoint datain { + bins zero_val = {32'h0}; + bins rand_val[64] = {[1:32'hFFFF_FFFE]}; + bins ones_val = {{32{1'b1}}}; + wildcard bins set = (0 => 32'h????_????); + wildcard bins clr = (32'h????_???? => 0); + } + + endgroup + + /*----------------------- MBOX_CSR__MBOX_DATAOUT COVERGROUPS -----------------------*/ + covergroup mbox_csr__mbox_dataout_bit_cg with function sample(input bit reg_bit); + option.per_instance = 1; + reg_bit_cp : coverpoint reg_bit { + bins value[2] = {0,1}; + } + reg_bit_edge_cp : coverpoint reg_bit { + bins rise = (0 => 1); + bins fall = (1 => 0); + } + + endgroup + covergroup mbox_csr__mbox_dataout_fld_cg with function sample( + input bit [32-1:0] dataout + ); + option.per_instance = 1; + dataout_cp : coverpoint dataout { + bins zero_val = {32'h0}; + bins rand_val[64] = {[1:32'hFFFF_FFFE]}; + bins ones_val = {{32{1'b1}}}; + wildcard bins set = (0 => 32'h????_????); + wildcard bins clr = (32'h????_???? => 0); + } + + endgroup + + /*----------------------- MBOX_CSR__MBOX_EXECUTE COVERGROUPS -----------------------*/ + covergroup mbox_csr__mbox_execute_bit_cg with function sample(input bit reg_bit); + option.per_instance = 1; + reg_bit_cp : coverpoint reg_bit { + bins value[2] = {0,1}; + } + reg_bit_edge_cp : coverpoint reg_bit { + bins rise = (0 => 1); + bins fall = (1 => 0); + } + + endgroup + covergroup mbox_csr__mbox_execute_fld_cg with function sample( + input bit [1-1:0] execute + ); + option.per_instance = 1; + execute_cp : coverpoint execute; + execute_edge_cp : coverpoint execute { + bins rise = (0 => 1); + bins fall = (1 => 0); + } + + endgroup + + /*----------------------- MBOX_CSR__MBOX_STATUS_ECC_DOUBLE_ERROR_38CEC4B0_ECC_SINGLE_ERROR_9C62B760 COVERGROUPS -----------------------*/ + covergroup mbox_csr__mbox_status_ecc_double_error_38cec4b0_ecc_single_error_9c62b760_bit_cg with function sample(input bit reg_bit); + option.per_instance = 1; + reg_bit_cp : coverpoint reg_bit { + bins value[2] = {0,1}; + } + reg_bit_edge_cp : coverpoint reg_bit { + bins rise = (0 => 1); + bins fall = (1 => 0); + } + + endgroup + covergroup mbox_csr__mbox_status_ecc_double_error_38cec4b0_ecc_single_error_9c62b760_fld_cg with function sample( + input bit [4-1:0] status, + input bit [1-1:0] ecc_single_error, + input bit [1-1:0] ecc_double_error, + input bit [3-1:0] mbox_fsm_ps, + input bit [1-1:0] soc_has_lock + ); + option.per_instance = 1; + status_cp : coverpoint status; + ecc_single_error_cp : coverpoint ecc_single_error; + ecc_double_error_cp : coverpoint ecc_double_error; + mbox_fsm_ps_cp : coverpoint mbox_fsm_ps { + bins MBOX_IDLE = {mbox_fsm_state_e'(MBOX_IDLE )}; + bins MBOX_RDY_FOR_CMD = {mbox_fsm_state_e'(MBOX_RDY_FOR_CMD )}; + bins MBOX_RDY_FOR_DLEN = {mbox_fsm_state_e'(MBOX_RDY_FOR_DLEN)}; + bins MBOX_RDY_FOR_DATA = {mbox_fsm_state_e'(MBOX_RDY_FOR_DATA)}; + bins MBOX_EXECUTE_UC = {mbox_fsm_state_e'(MBOX_EXECUTE_UC )}; + bins MBOX_EXECUTE_SOC = {mbox_fsm_state_e'(MBOX_EXECUTE_SOC )}; + bins MBOX_ERROR = {mbox_fsm_state_e'(MBOX_ERROR )}; + } + mbox_fsm_ps_edge_cp : coverpoint mbox_fsm_ps { + bins TRANSITION_IDLE_RDY_FOR_CMD = (mbox_fsm_state_e'(MBOX_IDLE) => mbox_fsm_state_e'(MBOX_RDY_FOR_CMD)); + bins TRANSITION_RDY_FOR_CMD_RDY_FOR_DLEN = (mbox_fsm_state_e'(MBOX_RDY_FOR_CMD) => mbox_fsm_state_e'(MBOX_RDY_FOR_DLEN)); + bins TRANSITION_RDY_FOR_DLEN_RDY_FOR_DATA = (mbox_fsm_state_e'(MBOX_RDY_FOR_DLEN) => mbox_fsm_state_e'(MBOX_RDY_FOR_DATA)); + bins TRANSITION_RDY_FOR_DATA_EXECUTE_UC = (mbox_fsm_state_e'(MBOX_RDY_FOR_DATA) => mbox_fsm_state_e'(MBOX_EXECUTE_UC)); + bins TRANSITION_RDY_FOR_DATA_EXECUTE_SOC = (mbox_fsm_state_e'(MBOX_RDY_FOR_DATA) => mbox_fsm_state_e'(MBOX_EXECUTE_SOC)); + bins TRANSITION_EXECUTE_UC_EXECUTE_SOC = (mbox_fsm_state_e'(MBOX_EXECUTE_UC) => mbox_fsm_state_e'(MBOX_EXECUTE_SOC)); + bins TRANSITION_EXECUTE_SOC_EXECUTE_UC = (mbox_fsm_state_e'(MBOX_EXECUTE_SOC) => mbox_fsm_state_e'(MBOX_EXECUTE_UC)); + bins TRANSITION_EXECUTE_UC_IDLE = (mbox_fsm_state_e'(MBOX_EXECUTE_UC) => mbox_fsm_state_e'(MBOX_IDLE)); + bins TRANSITION_EXECUTE_SOC_IDLE = (mbox_fsm_state_e'(MBOX_EXECUTE_SOC) => mbox_fsm_state_e'(MBOX_IDLE)); + bins TRANSITION_RDY_FOR_CMD_ERROR = (mbox_fsm_state_e'(MBOX_RDY_FOR_CMD) => mbox_fsm_state_e'(MBOX_ERROR)); + bins TRANSITION_RDY_FOR_DLEN_ERROR = (mbox_fsm_state_e'(MBOX_RDY_FOR_DLEN) => mbox_fsm_state_e'(MBOX_ERROR)); + bins TRANSITION_RDY_FOR_DATA_ERROR = (mbox_fsm_state_e'(MBOX_RDY_FOR_DATA) => mbox_fsm_state_e'(MBOX_ERROR)); + bins TRANSITION_EXECUTE_UC_ERROR = (mbox_fsm_state_e'(MBOX_EXECUTE_UC) => mbox_fsm_state_e'(MBOX_ERROR)); + bins TRANSITION_EXECUTE_SOC_ERROR = (mbox_fsm_state_e'(MBOX_EXECUTE_SOC) => mbox_fsm_state_e'(MBOX_ERROR)); + bins TRANSITION_ERROR_IDLE = (mbox_fsm_state_e'(MBOX_ERROR) => mbox_fsm_state_e'(MBOX_IDLE)); +// illegal_bins TRANSITION_IDLE_ERROR = (mbox_fsm_state_e'(MBOX_IDLE) => mbox_fsm_state_e'(MBOX_ERROR)); +// illegal_bins TRANSITION_IDLE_RDY_FOR_DLEN = (mbox_fsm_state_e'(MBOX_IDLE) => mbox_fsm_state_e'(MBOX_RDY_FOR_DLEN)); +// illegal_bins TRANSITION_IDLE_RDY_FOR_DATA = (mbox_fsm_state_e'(MBOX_IDLE) => mbox_fsm_state_e'(MBOX_RDY_FOR_DATA)); +// illegal_bins TRANSITION_IDLE_EXECUTE_UC = (mbox_fsm_state_e'(MBOX_IDLE) => mbox_fsm_state_e'(MBOX_EXECUTE_UC)); +// illegal_bins TRANSITION_IDLE_EXECUTE_SOC = (mbox_fsm_state_e'(MBOX_IDLE) => mbox_fsm_state_e'(MBOX_EXECUTE_SOC)); +// illegal_bins TRANSITION_RDY_FOR_CMD_RDY_FOR_DATA = (mbox_fsm_state_e'(MBOX_RDY_FOR_CMD) => mbox_fsm_state_e'(MBOX_RDY_FOR_DATA)); +// illegal_bins TRANSITION_RDY_FOR_CMD_EXECUTE_UC = (mbox_fsm_state_e'(MBOX_RDY_FOR_CMD) => mbox_fsm_state_e'(MBOX_EXECUTE_UC)); +// illegal_bins TRANSITION_RDY_FOR_CMD_EXECUTE_SOC = (mbox_fsm_state_e'(MBOX_RDY_FOR_CMD) => mbox_fsm_state_e'(MBOX_EXECUTE_SOC)); +// illegal_bins TRANSITION_RDY_FOR_DLEN_RDY_FOR_CMD = (mbox_fsm_state_e'(MBOX_RDY_FOR_DLEN) => mbox_fsm_state_e'(MBOX_RDY_FOR_CMD)); +// illegal_bins TRANSITION_RDY_FOR_DLEN_EXECUTE_UC = (mbox_fsm_state_e'(MBOX_RDY_FOR_DLEN) => mbox_fsm_state_e'(MBOX_EXECUTE_UC)); +// illegal_bins TRANSITION_RDY_FOR_DLEN_EXECUTE_SOC = (mbox_fsm_state_e'(MBOX_RDY_FOR_DLEN) => mbox_fsm_state_e'(MBOX_EXECUTE_SOC)); +// illegal_bins TRANSITION_RDY_FOR_DATA_RDY_FOR_CMD = (mbox_fsm_state_e'(MBOX_RDY_FOR_DATA) => mbox_fsm_state_e'(MBOX_RDY_FOR_CMD)); +// illegal_bins TRANSITION_RDY_FOR_DATA_RDY_FOR_DLEN = (mbox_fsm_state_e'(MBOX_RDY_FOR_DATA) => mbox_fsm_state_e'(MBOX_RDY_FOR_DLEN)); +// illegal_bins TRANSITION_EXECUTE_UC_RDY_FOR_CMD = (mbox_fsm_state_e'(MBOX_EXECUTE_UC) => mbox_fsm_state_e'(MBOX_RDY_FOR_CMD)); +// illegal_bins TRANSITION_EXECUTE_UC_RDY_FOR_DLEN = (mbox_fsm_state_e'(MBOX_EXECUTE_UC) => mbox_fsm_state_e'(MBOX_RDY_FOR_DLEN)); +// illegal_bins TRANSITION_EXECUTE_UC_RDY_FOR_DATA = (mbox_fsm_state_e'(MBOX_EXECUTE_UC) => mbox_fsm_state_e'(MBOX_RDY_FOR_DATA)); +// illegal_bins TRANSITION_EXECUTE_SOC_RDY_FOR_CMD = (mbox_fsm_state_e'(MBOX_EXECUTE_SOC) => mbox_fsm_state_e'(MBOX_RDY_FOR_CMD)); +// illegal_bins TRANSITION_EXECUTE_SOC_RDY_FOR_DLEN = (mbox_fsm_state_e'(MBOX_EXECUTE_SOC) => mbox_fsm_state_e'(MBOX_RDY_FOR_DLEN)); +// illegal_bins TRANSITION_EXECUTE_SOC_RDY_FOR_DATA = (mbox_fsm_state_e'(MBOX_EXECUTE_SOC) => mbox_fsm_state_e'(MBOX_RDY_FOR_DATA)); +// illegal_bins TRANSITION_ERROR_RDY_FOR_CMD = (mbox_fsm_state_e'(MBOX_ERROR) => mbox_fsm_state_e'(MBOX_RDY_FOR_CMD)); +// illegal_bins TRANSITION_ERROR_RDY_FOR_DLEN = (mbox_fsm_state_e'(MBOX_ERROR) => mbox_fsm_state_e'(MBOX_RDY_FOR_DLEN)); +// illegal_bins TRANSITION_ERROR_RDY_FOR_DATA = (mbox_fsm_state_e'(MBOX_ERROR) => mbox_fsm_state_e'(MBOX_RDY_FOR_DATA)); +// illegal_bins TRANSITION_ERROR_EXECUTE_UC = (mbox_fsm_state_e'(MBOX_ERROR) => mbox_fsm_state_e'(MBOX_EXECUTE_UC)); +// illegal_bins TRANSITION_ERROR_EXECUTE_SOC = (mbox_fsm_state_e'(MBOX_ERROR) => mbox_fsm_state_e'(MBOX_EXECUTE_SOC)); + } + soc_has_lock_cp : coverpoint soc_has_lock; + status_edge_cp : coverpoint status { + bins rise = (0 => 1); + bins fall = (1 => 0); + } + ecc_single_error_edge_cp : coverpoint ecc_single_error { + bins rise = (0 => 1); + bins fall = (1 => 0); + } + ecc_double_error_edge_cp : coverpoint ecc_double_error { + bins rise = (0 => 1); + bins fall = (1 => 0); + } + soc_has_lock_edge_cp : coverpoint soc_has_lock { + bins rise = (0 => 1); + bins fall = (1 => 0); + } + + endgroup + + /*----------------------- MBOX_CSR__MBOX_UNLOCK COVERGROUPS -----------------------*/ + covergroup mbox_csr__mbox_unlock_bit_cg with function sample(input bit reg_bit); + option.per_instance = 1; + reg_bit_cp : coverpoint reg_bit { + bins value[2] = {0,1}; + } + reg_bit_edge_cp : coverpoint reg_bit { + bins rise = (0 => 1); + bins fall = (1 => 0); + } + + endgroup + covergroup mbox_csr__mbox_unlock_fld_cg with function sample( + input bit [1-1:0] unlock + ); + option.per_instance = 1; + unlock_cp : coverpoint unlock; + unlock_edge_cp : coverpoint unlock { + bins rise = (0 => 1); + bins fall = (1 => 0); + } + + endgroup + +`endif diff --git a/src/soc_ifc/rtl/mbox_csr_pkg.sv b/src/soc_ifc/rtl/mbox_csr_pkg.sv index a44b467db..1c9766e24 100644 --- a/src/soc_ifc/rtl/mbox_csr_pkg.sv +++ b/src/soc_ifc/rtl/mbox_csr_pkg.sv @@ -56,12 +56,17 @@ package mbox_csr_pkg; logic next; } mbox_csr__mbox_status__soc_has_lock__in_t; + typedef struct packed{ + logic [14:0] next; + } mbox_csr__mbox_status__mbox_rdptr__in_t; + typedef struct packed{ mbox_csr__mbox_status__status__in_t status; mbox_csr__mbox_status__ecc_single_error_next_e066e214_wel_e066e214__in_t ecc_single_error; mbox_csr__mbox_status__ecc_double_error_next_e066e214_wel_e066e214__in_t ecc_double_error; mbox_csr__mbox_status__mbox_fsm_ps__in_t mbox_fsm_ps; mbox_csr__mbox_status__soc_has_lock__in_t soc_has_lock; + mbox_csr__mbox_status__mbox_rdptr__in_t mbox_rdptr; } mbox_csr__mbox_status_ecc_double_error_38cec4b0_ecc_single_error_9c62b760__in_t; typedef struct packed{ @@ -130,6 +135,7 @@ package mbox_csr_pkg; typedef struct packed{ logic value; + logic swmod; } mbox_csr__mbox_execute__execute__out_t; typedef struct packed{ @@ -138,6 +144,7 @@ package mbox_csr_pkg; typedef struct packed{ logic [3:0] value; + logic swmod; } mbox_csr__mbox_status__status__out_t; typedef struct packed{ @@ -156,12 +163,17 @@ package mbox_csr_pkg; logic value; } mbox_csr__mbox_status__soc_has_lock__out_t; + typedef struct packed{ + logic [14:0] value; + } mbox_csr__mbox_status__mbox_rdptr__out_t; + typedef struct packed{ mbox_csr__mbox_status__status__out_t status; mbox_csr__mbox_status__ecc_single_error_next_e066e214_wel_e066e214__out_t ecc_single_error; mbox_csr__mbox_status__ecc_double_error_next_e066e214_wel_e066e214__out_t ecc_double_error; mbox_csr__mbox_status__mbox_fsm_ps__out_t mbox_fsm_ps; mbox_csr__mbox_status__soc_has_lock__out_t soc_has_lock; + mbox_csr__mbox_status__mbox_rdptr__out_t mbox_rdptr; } mbox_csr__mbox_status_ecc_double_error_38cec4b0_ecc_single_error_9c62b760__out_t; typedef struct packed{ diff --git a/src/soc_ifc/rtl/mbox_csr_sample.svh b/src/soc_ifc/rtl/mbox_csr_sample.svh new file mode 100644 index 000000000..29ef7be05 --- /dev/null +++ b/src/soc_ifc/rtl/mbox_csr_sample.svh @@ -0,0 +1,251 @@ +// SPDX-License-Identifier: Apache-2.0 +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +`ifndef MBOX_CSR_SAMPLE + `define MBOX_CSR_SAMPLE + + /*----------------------- MBOX_CSR__MBOX_LOCK SAMPLE FUNCTIONS -----------------------*/ + function void mbox_csr__mbox_lock::sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); + m_current = get(); + m_data = data; + m_is_read = is_read; + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(lock_bit_cg[bt]) this.lock_bit_cg[bt].sample(data[0 + bt]); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( data[0:0]/*lock*/ ); + end + endfunction + + function void mbox_csr__mbox_lock::sample_values(); + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(lock_bit_cg[bt]) this.lock_bit_cg[bt].sample(lock.get_mirrored_value() >> bt); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( lock.get_mirrored_value() ); + end + endfunction + + /*----------------------- MBOX_CSR__MBOX_USER SAMPLE FUNCTIONS -----------------------*/ + function void mbox_csr__mbox_user::sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); + m_current = get(); + m_data = data; + m_is_read = is_read; + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(user_bit_cg[bt]) this.user_bit_cg[bt].sample(data[0 + bt]); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( data[31:0]/*user*/ ); + end + endfunction + + function void mbox_csr__mbox_user::sample_values(); + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(user_bit_cg[bt]) this.user_bit_cg[bt].sample(user.get_mirrored_value() >> bt); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( user.get_mirrored_value() ); + end + endfunction + + /*----------------------- MBOX_CSR__MBOX_CMD SAMPLE FUNCTIONS -----------------------*/ + function void mbox_csr__mbox_cmd::sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); + m_current = get(); + m_data = data; + m_is_read = is_read; + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(command_bit_cg[bt]) this.command_bit_cg[bt].sample(data[0 + bt]); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( data[31:0]/*command*/ ); + end + endfunction + + function void mbox_csr__mbox_cmd::sample_values(); + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(command_bit_cg[bt]) this.command_bit_cg[bt].sample(command.get_mirrored_value() >> bt); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( command.get_mirrored_value() ); + end + endfunction + + /*----------------------- MBOX_CSR__MBOX_DLEN SAMPLE FUNCTIONS -----------------------*/ + function void mbox_csr__mbox_dlen::sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); + m_current = get(); + m_data = data; + m_is_read = is_read; + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(length_bit_cg[bt]) this.length_bit_cg[bt].sample(data[0 + bt]); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( data[31:0]/*length*/ ); + end + endfunction + + function void mbox_csr__mbox_dlen::sample_values(); + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(length_bit_cg[bt]) this.length_bit_cg[bt].sample(length.get_mirrored_value() >> bt); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( length.get_mirrored_value() ); + end + endfunction + + /*----------------------- MBOX_CSR__MBOX_DATAIN SAMPLE FUNCTIONS -----------------------*/ + function void mbox_csr__mbox_datain::sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); + m_current = get(); + m_data = data; + m_is_read = is_read; + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(datain_bit_cg[bt]) this.datain_bit_cg[bt].sample(data[0 + bt]); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( data[31:0]/*datain*/ ); + end + endfunction + + function void mbox_csr__mbox_datain::sample_values(); + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(datain_bit_cg[bt]) this.datain_bit_cg[bt].sample(datain.get_mirrored_value() >> bt); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( datain.get_mirrored_value() ); + end + endfunction + + /*----------------------- MBOX_CSR__MBOX_DATAOUT SAMPLE FUNCTIONS -----------------------*/ + function void mbox_csr__mbox_dataout::sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); + m_current = get(); + m_data = data; + m_is_read = is_read; + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(dataout_bit_cg[bt]) this.dataout_bit_cg[bt].sample(data[0 + bt]); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( data[31:0]/*dataout*/ ); + end + endfunction + + function void mbox_csr__mbox_dataout::sample_values(); + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(dataout_bit_cg[bt]) this.dataout_bit_cg[bt].sample(dataout.get_mirrored_value() >> bt); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( dataout.get_mirrored_value() ); + end + endfunction + + /*----------------------- MBOX_CSR__MBOX_EXECUTE SAMPLE FUNCTIONS -----------------------*/ + function void mbox_csr__mbox_execute::sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); + m_current = get(); + m_data = data; + m_is_read = is_read; + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(execute_bit_cg[bt]) this.execute_bit_cg[bt].sample(data[0 + bt]); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( data[0:0]/*execute*/ ); + end + endfunction + + function void mbox_csr__mbox_execute::sample_values(); + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(execute_bit_cg[bt]) this.execute_bit_cg[bt].sample(execute.get_mirrored_value() >> bt); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( execute.get_mirrored_value() ); + end + endfunction + + /*----------------------- MBOX_CSR__MBOX_STATUS_ECC_DOUBLE_ERROR_38CEC4B0_ECC_SINGLE_ERROR_9C62B760 SAMPLE FUNCTIONS -----------------------*/ + function void mbox_csr__mbox_status_ecc_double_error_38cec4b0_ecc_single_error_9c62b760::sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); + m_current = get(); + m_data = data; + m_is_read = is_read; + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(status_bit_cg[bt]) this.status_bit_cg[bt].sample(data[0 + bt]); + foreach(ecc_single_error_bit_cg[bt]) this.ecc_single_error_bit_cg[bt].sample(data[4 + bt]); + foreach(ecc_double_error_bit_cg[bt]) this.ecc_double_error_bit_cg[bt].sample(data[5 + bt]); + foreach(mbox_fsm_ps_bit_cg[bt]) this.mbox_fsm_ps_bit_cg[bt].sample(data[6 + bt]); + foreach(soc_has_lock_bit_cg[bt]) this.soc_has_lock_bit_cg[bt].sample(data[9 + bt]); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( data[3:0]/*status*/ , data[4:4]/*ecc_single_error*/ , data[5:5]/*ecc_double_error*/ , data[8:6]/*mbox_fsm_ps*/ , data[9:9]/*soc_has_lock*/ ); + end + endfunction + + function void mbox_csr__mbox_status_ecc_double_error_38cec4b0_ecc_single_error_9c62b760::sample_values(); + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(status_bit_cg[bt]) this.status_bit_cg[bt].sample(status.get_mirrored_value() >> bt); + foreach(ecc_single_error_bit_cg[bt]) this.ecc_single_error_bit_cg[bt].sample(ecc_single_error.get_mirrored_value() >> bt); + foreach(ecc_double_error_bit_cg[bt]) this.ecc_double_error_bit_cg[bt].sample(ecc_double_error.get_mirrored_value() >> bt); + foreach(mbox_fsm_ps_bit_cg[bt]) this.mbox_fsm_ps_bit_cg[bt].sample(mbox_fsm_ps.get_mirrored_value() >> bt); + foreach(soc_has_lock_bit_cg[bt]) this.soc_has_lock_bit_cg[bt].sample(soc_has_lock.get_mirrored_value() >> bt); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( status.get_mirrored_value() , ecc_single_error.get_mirrored_value() , ecc_double_error.get_mirrored_value() , mbox_fsm_ps.get_mirrored_value() , soc_has_lock.get_mirrored_value() ); + end + endfunction + + /*----------------------- MBOX_CSR__MBOX_UNLOCK SAMPLE FUNCTIONS -----------------------*/ + function void mbox_csr__mbox_unlock::sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); + m_current = get(); + m_data = data; + m_is_read = is_read; + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(unlock_bit_cg[bt]) this.unlock_bit_cg[bt].sample(data[0 + bt]); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( data[0:0]/*unlock*/ ); + end + endfunction + + function void mbox_csr__mbox_unlock::sample_values(); + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(unlock_bit_cg[bt]) this.unlock_bit_cg[bt].sample(unlock.get_mirrored_value() >> bt); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( unlock.get_mirrored_value() ); + end + endfunction + +`endif \ No newline at end of file diff --git a/src/soc_ifc/rtl/mbox_csr_uvm.sv b/src/soc_ifc/rtl/mbox_csr_uvm.sv index 97f3e3ae5..760853a1a 100644 --- a/src/soc_ifc/rtl/mbox_csr_uvm.sv +++ b/src/soc_ifc/rtl/mbox_csr_uvm.sv @@ -3,116 +3,245 @@ package mbox_csr_uvm; `include "uvm_macros.svh" import uvm_pkg::*; - + `include "mbox_csr_covergroups.svh" // Reg - mbox_csr::mbox_lock class mbox_csr__mbox_lock extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + mbox_csr__mbox_lock_bit_cg lock_bit_cg[1]; + mbox_csr__mbox_lock_fld_cg fld_cg; rand uvm_reg_field lock; function new(string name = "mbox_csr__mbox_lock"); - super.new(name, 32, UVM_NO_COVERAGE); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); virtual function void build(); this.lock = new("lock"); this.lock.configure(this, 1, 0, "RS", 1, 'h0, 1, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(lock_bit_cg[bt]) lock_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); endfunction : build endclass : mbox_csr__mbox_lock // Reg - mbox_csr::mbox_user class mbox_csr__mbox_user extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + mbox_csr__mbox_user_bit_cg user_bit_cg[32]; + mbox_csr__mbox_user_fld_cg fld_cg; rand uvm_reg_field user; function new(string name = "mbox_csr__mbox_user"); - super.new(name, 32, UVM_NO_COVERAGE); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); virtual function void build(); this.user = new("user"); this.user.configure(this, 32, 0, "RO", 1, 'h0, 1, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(user_bit_cg[bt]) user_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); endfunction : build endclass : mbox_csr__mbox_user // Reg - mbox_csr::mbox_cmd class mbox_csr__mbox_cmd extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + mbox_csr__mbox_cmd_bit_cg command_bit_cg[32]; + mbox_csr__mbox_cmd_fld_cg fld_cg; rand uvm_reg_field command; function new(string name = "mbox_csr__mbox_cmd"); - super.new(name, 32, UVM_NO_COVERAGE); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); virtual function void build(); this.command = new("command"); this.command.configure(this, 32, 0, "RW", 0, 'h0, 1, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(command_bit_cg[bt]) command_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); endfunction : build endclass : mbox_csr__mbox_cmd // Reg - mbox_csr::mbox_dlen class mbox_csr__mbox_dlen extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + mbox_csr__mbox_dlen_bit_cg length_bit_cg[32]; + mbox_csr__mbox_dlen_fld_cg fld_cg; rand uvm_reg_field length; function new(string name = "mbox_csr__mbox_dlen"); - super.new(name, 32, UVM_NO_COVERAGE); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); virtual function void build(); this.length = new("length"); this.length.configure(this, 32, 0, "RW", 0, 'h0, 1, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(length_bit_cg[bt]) length_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); endfunction : build endclass : mbox_csr__mbox_dlen // Reg - mbox_csr::mbox_datain class mbox_csr__mbox_datain extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + mbox_csr__mbox_datain_bit_cg datain_bit_cg[32]; + mbox_csr__mbox_datain_fld_cg fld_cg; rand uvm_reg_field datain; function new(string name = "mbox_csr__mbox_datain"); - super.new(name, 32, UVM_NO_COVERAGE); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); virtual function void build(); this.datain = new("datain"); this.datain.configure(this, 32, 0, "RW", 0, 'h0, 1, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(datain_bit_cg[bt]) datain_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); endfunction : build endclass : mbox_csr__mbox_datain // Reg - mbox_csr::mbox_dataout class mbox_csr__mbox_dataout extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + mbox_csr__mbox_dataout_bit_cg dataout_bit_cg[32]; + mbox_csr__mbox_dataout_fld_cg fld_cg; rand uvm_reg_field dataout; function new(string name = "mbox_csr__mbox_dataout"); - super.new(name, 32, UVM_NO_COVERAGE); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); virtual function void build(); this.dataout = new("dataout"); this.dataout.configure(this, 32, 0, "RW", 1, 'h0, 1, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(dataout_bit_cg[bt]) dataout_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); endfunction : build endclass : mbox_csr__mbox_dataout // Reg - mbox_csr::mbox_execute class mbox_csr__mbox_execute extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + mbox_csr__mbox_execute_bit_cg execute_bit_cg[1]; + mbox_csr__mbox_execute_fld_cg fld_cg; rand uvm_reg_field execute; function new(string name = "mbox_csr__mbox_execute"); - super.new(name, 32, UVM_NO_COVERAGE); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); virtual function void build(); this.execute = new("execute"); this.execute.configure(this, 1, 0, "RW", 1, 'h0, 1, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(execute_bit_cg[bt]) execute_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); endfunction : build endclass : mbox_csr__mbox_execute // Reg - mbox_csr::mbox_status_ecc_double_error_38cec4b0_ecc_single_error_9c62b760 class mbox_csr__mbox_status_ecc_double_error_38cec4b0_ecc_single_error_9c62b760 extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + mbox_csr__mbox_status_ecc_double_error_38cec4b0_ecc_single_error_9c62b760_bit_cg status_bit_cg[4]; + mbox_csr__mbox_status_ecc_double_error_38cec4b0_ecc_single_error_9c62b760_bit_cg ecc_single_error_bit_cg[1]; + mbox_csr__mbox_status_ecc_double_error_38cec4b0_ecc_single_error_9c62b760_bit_cg ecc_double_error_bit_cg[1]; + mbox_csr__mbox_status_ecc_double_error_38cec4b0_ecc_single_error_9c62b760_bit_cg mbox_fsm_ps_bit_cg[3]; + mbox_csr__mbox_status_ecc_double_error_38cec4b0_ecc_single_error_9c62b760_bit_cg soc_has_lock_bit_cg[1]; + mbox_csr__mbox_status_ecc_double_error_38cec4b0_ecc_single_error_9c62b760_bit_cg mbox_rdptr_bit_cg[15]; + mbox_csr__mbox_status_ecc_double_error_38cec4b0_ecc_single_error_9c62b760_fld_cg fld_cg; rand uvm_reg_field status; rand uvm_reg_field ecc_single_error; rand uvm_reg_field ecc_double_error; rand uvm_reg_field mbox_fsm_ps; rand uvm_reg_field soc_has_lock; + rand uvm_reg_field mbox_rdptr; function new(string name = "mbox_csr__mbox_status_ecc_double_error_38cec4b0_ecc_single_error_9c62b760"); - super.new(name, 32, UVM_NO_COVERAGE); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); virtual function void build(); this.status = new("status"); @@ -125,20 +254,48 @@ package mbox_csr_uvm; this.mbox_fsm_ps.configure(this, 3, 6, "RO", 1, 'h0, 1, 1, 0); this.soc_has_lock = new("soc_has_lock"); this.soc_has_lock.configure(this, 1, 9, "RO", 1, 'h0, 1, 1, 0); + this.mbox_rdptr = new("mbox_rdptr"); + this.mbox_rdptr.configure(this, 15, 10, "RO", 1, 'h0, 1, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(status_bit_cg[bt]) status_bit_cg[bt] = new(); + foreach(ecc_single_error_bit_cg[bt]) ecc_single_error_bit_cg[bt] = new(); + foreach(ecc_double_error_bit_cg[bt]) ecc_double_error_bit_cg[bt] = new(); + foreach(mbox_fsm_ps_bit_cg[bt]) mbox_fsm_ps_bit_cg[bt] = new(); + foreach(soc_has_lock_bit_cg[bt]) soc_has_lock_bit_cg[bt] = new(); + foreach(mbox_rdptr_bit_cg[bt]) mbox_rdptr_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); endfunction : build endclass : mbox_csr__mbox_status_ecc_double_error_38cec4b0_ecc_single_error_9c62b760 // Reg - mbox_csr::mbox_unlock class mbox_csr__mbox_unlock extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + mbox_csr__mbox_unlock_bit_cg unlock_bit_cg[1]; + mbox_csr__mbox_unlock_fld_cg fld_cg; rand uvm_reg_field unlock; function new(string name = "mbox_csr__mbox_unlock"); - super.new(name, 32, UVM_NO_COVERAGE); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); virtual function void build(); this.unlock = new("unlock"); this.unlock.configure(this, 1, 0, "RW", 0, 'h0, 1, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(unlock_bit_cg[bt]) unlock_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); endfunction : build endclass : mbox_csr__mbox_unlock @@ -208,4 +365,5 @@ package mbox_csr_uvm; endfunction : build endclass : mbox_csr + `include "mbox_csr_sample.svh" endpackage: mbox_csr_uvm diff --git a/src/soc_ifc/rtl/sha512_acc_csr.sv b/src/soc_ifc/rtl/sha512_acc_csr.sv index c5b3c22fa..1188e3192 100644 --- a/src/soc_ifc/rtl/sha512_acc_csr.sv +++ b/src/soc_ifc/rtl/sha512_acc_csr.sv @@ -201,6 +201,10 @@ module sha512_acc_csr ( logic next; logic load_next; } VALID; + struct packed{ + logic next; + logic load_next; + } SOC_HAS_LOCK; } STATUS; struct packed{ struct packed{ @@ -436,6 +440,9 @@ module sha512_acc_csr ( struct packed{ logic value; } VALID; + struct packed{ + logic value; + } SOC_HAS_LOCK; } STATUS; struct packed{ struct packed{ @@ -593,7 +600,7 @@ module sha512_acc_csr ( end always_ff @(posedge clk or negedge hwif_in.cptra_rst_b) begin if(~hwif_in.cptra_rst_b) begin - field_storage.LOCK.LOCK.value <= 'h0; + field_storage.LOCK.LOCK.value <= 'h1; end else if(field_combo.LOCK.LOCK.load_next) begin field_storage.LOCK.LOCK.value <= field_combo.LOCK.LOCK.next; end @@ -719,7 +726,7 @@ module sha512_acc_csr ( always_comb begin automatic logic [0:0] next_c = field_storage.EXECUTE.EXECUTE.value; automatic logic load_next_c = '0; - if(decoded_reg_strb.EXECUTE && decoded_req_is_wr) begin // SW write + if(decoded_reg_strb.EXECUTE && decoded_req_is_wr && hwif_in.valid_user) begin // SW write next_c = (field_storage.EXECUTE.EXECUTE.value & ~decoded_wr_biten[0:0]) | (decoded_wr_data[0:0] & decoded_wr_biten[0:0]); load_next_c = '1; end else if(hwif_in.EXECUTE.EXECUTE.hwclr) begin // HW Clear @@ -756,6 +763,25 @@ module sha512_acc_csr ( end end assign hwif_out.STATUS.VALID.value = field_storage.STATUS.VALID.value; + // Field: sha512_acc_csr.STATUS.SOC_HAS_LOCK + always_comb begin + automatic logic [0:0] next_c = field_storage.STATUS.SOC_HAS_LOCK.value; + automatic logic load_next_c = '0; + if(1) begin // HW Write + next_c = hwif_in.STATUS.SOC_HAS_LOCK.next; + load_next_c = '1; + end + field_combo.STATUS.SOC_HAS_LOCK.next = next_c; + field_combo.STATUS.SOC_HAS_LOCK.load_next = load_next_c; + end + always_ff @(posedge clk or negedge hwif_in.cptra_rst_b) begin + if(~hwif_in.cptra_rst_b) begin + field_storage.STATUS.SOC_HAS_LOCK.value <= 'h0; + end else if(field_combo.STATUS.SOC_HAS_LOCK.load_next) begin + field_storage.STATUS.SOC_HAS_LOCK.value <= field_combo.STATUS.SOC_HAS_LOCK.next; + end + end + assign hwif_out.STATUS.SOC_HAS_LOCK.value = field_storage.STATUS.SOC_HAS_LOCK.value; for(genvar i0=0; i0<16; i0++) begin // Field: sha512_acc_csr.DIGEST[].DIGEST always_comb begin @@ -1525,7 +1551,8 @@ module sha512_acc_csr ( assign readback_array[6][0:0] = (decoded_reg_strb.EXECUTE && !decoded_req_is_wr) ? field_storage.EXECUTE.EXECUTE.value : '0; assign readback_array[6][31:1] = '0; assign readback_array[7][0:0] = (decoded_reg_strb.STATUS && !decoded_req_is_wr) ? field_storage.STATUS.VALID.value : '0; - assign readback_array[7][31:1] = '0; + assign readback_array[7][1:1] = (decoded_reg_strb.STATUS && !decoded_req_is_wr) ? field_storage.STATUS.SOC_HAS_LOCK.value : '0; + assign readback_array[7][31:2] = '0; for(genvar i0=0; i0<16; i0++) begin assign readback_array[i0*1 + 8][31:0] = (decoded_reg_strb.DIGEST[i0] && !decoded_req_is_wr) ? field_storage.DIGEST[i0].DIGEST.value : '0; end diff --git a/src/soc_ifc/rtl/sha512_acc_csr_covergroups.svh b/src/soc_ifc/rtl/sha512_acc_csr_covergroups.svh new file mode 100644 index 000000000..68cab6060 --- /dev/null +++ b/src/soc_ifc/rtl/sha512_acc_csr_covergroups.svh @@ -0,0 +1,640 @@ +// SPDX-License-Identifier: Apache-2.0 +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +`ifndef SHA512_ACC_CSR_COVERGROUPS + `define SHA512_ACC_CSR_COVERGROUPS + + /*----------------------- SHA512_ACC_CSR__LOCK COVERGROUPS -----------------------*/ + covergroup sha512_acc_csr__LOCK_bit_cg with function sample(input bit reg_bit); + option.per_instance = 1; + reg_bit_cp : coverpoint reg_bit { + bins value[2] = {0,1}; + } + reg_bit_edge_cp : coverpoint reg_bit { + bins rise = (0 => 1); + bins fall = (1 => 0); + } + + endgroup + covergroup sha512_acc_csr__LOCK_fld_cg with function sample( + input bit [1-1:0] LOCK + ); + option.per_instance = 1; + LOCK_cp : coverpoint LOCK; + + endgroup + + /*----------------------- SHA512_ACC_CSR__USER COVERGROUPS -----------------------*/ + covergroup sha512_acc_csr__USER_bit_cg with function sample(input bit reg_bit); + option.per_instance = 1; + reg_bit_cp : coverpoint reg_bit { + bins value[2] = {0,1}; + } + reg_bit_edge_cp : coverpoint reg_bit { + bins rise = (0 => 1); + bins fall = (1 => 0); + } + + endgroup + covergroup sha512_acc_csr__USER_fld_cg with function sample( + input bit [32-1:0] USER + ); + option.per_instance = 1; + USER_cp : coverpoint USER; + + endgroup + + /*----------------------- SHA512_ACC_CSR__MODE COVERGROUPS -----------------------*/ + covergroup sha512_acc_csr__MODE_bit_cg with function sample(input bit reg_bit); + option.per_instance = 1; + reg_bit_cp : coverpoint reg_bit { + bins value[2] = {0,1}; + } + reg_bit_edge_cp : coverpoint reg_bit { + bins rise = (0 => 1); + bins fall = (1 => 0); + } + + endgroup + covergroup sha512_acc_csr__MODE_fld_cg with function sample( + input bit [2-1:0] MODE, + input bit [1-1:0] ENDIAN_TOGGLE + ); + option.per_instance = 1; + MODE_cp : coverpoint MODE; + ENDIAN_TOGGLE_cp : coverpoint ENDIAN_TOGGLE; + + endgroup + + /*----------------------- SHA512_ACC_CSR__START_ADDRESS COVERGROUPS -----------------------*/ + covergroup sha512_acc_csr__START_ADDRESS_bit_cg with function sample(input bit reg_bit); + option.per_instance = 1; + reg_bit_cp : coverpoint reg_bit { + bins value[2] = {0,1}; + } + reg_bit_edge_cp : coverpoint reg_bit { + bins rise = (0 => 1); + bins fall = (1 => 0); + } + + endgroup + covergroup sha512_acc_csr__START_ADDRESS_fld_cg with function sample( + input bit [32-1:0] ADDR + ); + option.per_instance = 1; + ADDR_cp : coverpoint ADDR { + bins zero_val = {32'h0}; + bins legal_val = {[1:32'h7FFF]}; + bins illegal_val = {[32'h8000:32'hFFFF_FFFE]}; + bins ones_val = {{32{1'b1}}}; + wildcard bins set = (0 => 32'h????_????); + wildcard bins clr = (32'h????_???? => 0); + } + + endgroup + + /*----------------------- SHA512_ACC_CSR__DLEN COVERGROUPS -----------------------*/ + covergroup sha512_acc_csr__DLEN_bit_cg with function sample(input bit reg_bit); + option.per_instance = 1; + reg_bit_cp : coverpoint reg_bit { + bins value[2] = {0,1}; + } + reg_bit_edge_cp : coverpoint reg_bit { + bins rise = (0 => 1); + bins fall = (1 => 0); + } + + endgroup + covergroup sha512_acc_csr__DLEN_fld_cg with function sample( + input bit [32-1:0] LENGTH + ); + option.per_instance = 1; + LENGTH_cp : coverpoint LENGTH { + bins zero_val = {32'h0}; + bins legal_byte_aligned_val = {[1:32'h8000]}; + bins legal_word_aligned_val = {[1:32'h8000]} with (~|item[0]); + bins legal_dword_aligned_val = {[1:32'h8000]} with (~|item[1:0]); + bins legal_qword_aligned_val = {[1:32'h8000]} with (~|item[2:0]); + bins legal_oword_aligned_val = {[1:32'h8000]} with (~|item[3:0]); + bins illegal_val = {[32'h8001:32'hFFFF_FFFE]}; + bins ones_val = {{32{1'b1}}}; + wildcard bins set = (0 => 32'h????_????); + wildcard bins clr = (32'h????_???? => 0); + } + + endgroup + + /*----------------------- SHA512_ACC_CSR__DATAIN COVERGROUPS -----------------------*/ + covergroup sha512_acc_csr__DATAIN_bit_cg with function sample(input bit reg_bit); + option.per_instance = 1; + reg_bit_cp : coverpoint reg_bit { + bins value[2] = {0,1}; + } + reg_bit_edge_cp : coverpoint reg_bit { + bins rise = (0 => 1); + bins fall = (1 => 0); + } + + endgroup + covergroup sha512_acc_csr__DATAIN_fld_cg with function sample( + input bit [32-1:0] DATAIN + ); + option.per_instance = 1; + DATAIN_cp : coverpoint DATAIN; + + endgroup + + /*----------------------- SHA512_ACC_CSR__EXECUTE COVERGROUPS -----------------------*/ + covergroup sha512_acc_csr__EXECUTE_bit_cg with function sample(input bit reg_bit); + option.per_instance = 1; + reg_bit_cp : coverpoint reg_bit { + bins value[2] = {0,1}; + } + reg_bit_edge_cp : coverpoint reg_bit { + bins rise = (0 => 1); + bins fall = (1 => 0); + } + + endgroup + covergroup sha512_acc_csr__EXECUTE_fld_cg with function sample( + input bit [1-1:0] EXECUTE + ); + option.per_instance = 1; + EXECUTE_cp : coverpoint EXECUTE; + + endgroup + + /*----------------------- SHA512_ACC_CSR__STATUS COVERGROUPS -----------------------*/ + covergroup sha512_acc_csr__STATUS_bit_cg with function sample(input bit reg_bit); + option.per_instance = 1; + reg_bit_cp : coverpoint reg_bit { + bins value[2] = {0,1}; + } + reg_bit_edge_cp : coverpoint reg_bit { + bins rise = (0 => 1); + bins fall = (1 => 0); + } + + endgroup + covergroup sha512_acc_csr__STATUS_fld_cg with function sample( + input bit [1-1:0] VALID, + input bit [1-1:0] SOC_HAS_LOCK + ); + option.per_instance = 1; + VALID_cp : coverpoint VALID; + SOC_HAS_LOCK_cp : coverpoint SOC_HAS_LOCK; + + endgroup + + /*----------------------- SHA512_ACC_CSR__DIGEST COVERGROUPS -----------------------*/ + covergroup sha512_acc_csr__DIGEST_bit_cg with function sample(input bit reg_bit); + option.per_instance = 1; + reg_bit_cp : coverpoint reg_bit { + bins value[2] = {0,1}; + } + reg_bit_edge_cp : coverpoint reg_bit { + bins rise = (0 => 1); + bins fall = (1 => 0); + } + + endgroup + covergroup sha512_acc_csr__DIGEST_fld_cg with function sample( + input bit [32-1:0] DIGEST + ); + option.per_instance = 1; + DIGEST_cp : coverpoint DIGEST; + + endgroup + + /*----------------------- SHA512_ACC_CSR__CONTROL COVERGROUPS -----------------------*/ + covergroup sha512_acc_csr__CONTROL_bit_cg with function sample(input bit reg_bit); + option.per_instance = 1; + reg_bit_cp : coverpoint reg_bit { + bins value[2] = {0,1}; + } + reg_bit_edge_cp : coverpoint reg_bit { + bins rise = (0 => 1); + bins fall = (1 => 0); + } + + endgroup + covergroup sha512_acc_csr__CONTROL_fld_cg with function sample( + input bit [1-1:0] ZEROIZE + ); + option.per_instance = 1; + ZEROIZE_cp : coverpoint ZEROIZE; + + endgroup + + /*----------------------- SHA512_ACC_CSR__GLOBAL_INTR_EN_T COVERGROUPS -----------------------*/ + covergroup sha512_acc_csr__global_intr_en_t_bit_cg with function sample(input bit reg_bit); + option.per_instance = 1; + reg_bit_cp : coverpoint reg_bit { + bins value[2] = {0,1}; + } + reg_bit_edge_cp : coverpoint reg_bit { + bins rise = (0 => 1); + bins fall = (1 => 0); + } + + endgroup + covergroup sha512_acc_csr__global_intr_en_t_fld_cg with function sample( + input bit [1-1:0] error_en, + input bit [1-1:0] notif_en + ); + option.per_instance = 1; + error_en_cp : coverpoint error_en; + notif_en_cp : coverpoint notif_en; + + endgroup + + /*----------------------- SHA512_ACC_CSR__ERROR_INTR_EN_T COVERGROUPS -----------------------*/ + covergroup sha512_acc_csr__error_intr_en_t_bit_cg with function sample(input bit reg_bit); + option.per_instance = 1; + reg_bit_cp : coverpoint reg_bit { + bins value[2] = {0,1}; + } + reg_bit_edge_cp : coverpoint reg_bit { + bins rise = (0 => 1); + bins fall = (1 => 0); + } + + endgroup + covergroup sha512_acc_csr__error_intr_en_t_fld_cg with function sample( + input bit [1-1:0] error0_en, + input bit [1-1:0] error1_en, + input bit [1-1:0] error2_en, + input bit [1-1:0] error3_en + ); + option.per_instance = 1; + error0_en_cp : coverpoint error0_en; + error1_en_cp : coverpoint error1_en; + error2_en_cp : coverpoint error2_en; + error3_en_cp : coverpoint error3_en; + + endgroup + + /*----------------------- SHA512_ACC_CSR__NOTIF_INTR_EN_T COVERGROUPS -----------------------*/ + covergroup sha512_acc_csr__notif_intr_en_t_bit_cg with function sample(input bit reg_bit); + option.per_instance = 1; + reg_bit_cp : coverpoint reg_bit { + bins value[2] = {0,1}; + } + reg_bit_edge_cp : coverpoint reg_bit { + bins rise = (0 => 1); + bins fall = (1 => 0); + } + + endgroup + covergroup sha512_acc_csr__notif_intr_en_t_fld_cg with function sample( + input bit [1-1:0] notif_cmd_done_en + ); + option.per_instance = 1; + notif_cmd_done_en_cp : coverpoint notif_cmd_done_en; + + endgroup + + /*----------------------- SHA512_ACC_CSR__GLOBAL_INTR_T_AGG_STS_DD3DCF0A COVERGROUPS -----------------------*/ + covergroup sha512_acc_csr__global_intr_t_agg_sts_dd3dcf0a_bit_cg with function sample(input bit reg_bit); + option.per_instance = 1; + reg_bit_cp : coverpoint reg_bit { + bins value[2] = {0,1}; + } + reg_bit_edge_cp : coverpoint reg_bit { + bins rise = (0 => 1); + bins fall = (1 => 0); + } + + endgroup + covergroup sha512_acc_csr__global_intr_t_agg_sts_dd3dcf0a_fld_cg with function sample( + input bit [1-1:0] agg_sts + ); + option.per_instance = 1; + agg_sts_cp : coverpoint agg_sts; + + endgroup + + /*----------------------- SHA512_ACC_CSR__GLOBAL_INTR_T_AGG_STS_E6399B4A COVERGROUPS -----------------------*/ + covergroup sha512_acc_csr__global_intr_t_agg_sts_e6399b4a_bit_cg with function sample(input bit reg_bit); + option.per_instance = 1; + reg_bit_cp : coverpoint reg_bit { + bins value[2] = {0,1}; + } + reg_bit_edge_cp : coverpoint reg_bit { + bins rise = (0 => 1); + bins fall = (1 => 0); + } + + endgroup + covergroup sha512_acc_csr__global_intr_t_agg_sts_e6399b4a_fld_cg with function sample( + input bit [1-1:0] agg_sts + ); + option.per_instance = 1; + agg_sts_cp : coverpoint agg_sts; + + endgroup + + /*----------------------- SHA512_ACC_CSR__ERROR_INTR_T_ERROR0_STS_5EE134BF_ERROR1_STS_AAD9583F_ERROR2_STS_6CAD4575_ERROR3_STS_735BBEBA COVERGROUPS -----------------------*/ + covergroup sha512_acc_csr__error_intr_t_error0_sts_5ee134bf_error1_sts_aad9583f_error2_sts_6cad4575_error3_sts_735bbeba_bit_cg with function sample(input bit reg_bit); + option.per_instance = 1; + reg_bit_cp : coverpoint reg_bit { + bins value[2] = {0,1}; + } + reg_bit_edge_cp : coverpoint reg_bit { + bins rise = (0 => 1); + bins fall = (1 => 0); + } + + endgroup + covergroup sha512_acc_csr__error_intr_t_error0_sts_5ee134bf_error1_sts_aad9583f_error2_sts_6cad4575_error3_sts_735bbeba_fld_cg with function sample( + input bit [1-1:0] error0_sts, + input bit [1-1:0] error1_sts, + input bit [1-1:0] error2_sts, + input bit [1-1:0] error3_sts + ); + option.per_instance = 1; + error0_sts_cp : coverpoint error0_sts; + error1_sts_cp : coverpoint error1_sts; + error2_sts_cp : coverpoint error2_sts; + error3_sts_cp : coverpoint error3_sts; + + endgroup + + /*----------------------- SHA512_ACC_CSR__NOTIF_INTR_T_NOTIF_CMD_DONE_STS_1C68637E COVERGROUPS -----------------------*/ + covergroup sha512_acc_csr__notif_intr_t_notif_cmd_done_sts_1c68637e_bit_cg with function sample(input bit reg_bit); + option.per_instance = 1; + reg_bit_cp : coverpoint reg_bit { + bins value[2] = {0,1}; + } + reg_bit_edge_cp : coverpoint reg_bit { + bins rise = (0 => 1); + bins fall = (1 => 0); + } + + endgroup + covergroup sha512_acc_csr__notif_intr_t_notif_cmd_done_sts_1c68637e_fld_cg with function sample( + input bit [1-1:0] notif_cmd_done_sts + ); + option.per_instance = 1; + notif_cmd_done_sts_cp : coverpoint notif_cmd_done_sts; + + endgroup + + /*----------------------- SHA512_ACC_CSR__ERROR_INTR_TRIG_T COVERGROUPS -----------------------*/ + covergroup sha512_acc_csr__error_intr_trig_t_bit_cg with function sample(input bit reg_bit); + option.per_instance = 1; + reg_bit_cp : coverpoint reg_bit { + bins value[2] = {0,1}; + } + reg_bit_edge_cp : coverpoint reg_bit { + bins rise = (0 => 1); + bins fall = (1 => 0); + } + + endgroup + covergroup sha512_acc_csr__error_intr_trig_t_fld_cg with function sample( + input bit [1-1:0] error0_trig, + input bit [1-1:0] error1_trig, + input bit [1-1:0] error2_trig, + input bit [1-1:0] error3_trig + ); + option.per_instance = 1; + error0_trig_cp : coverpoint error0_trig; + error1_trig_cp : coverpoint error1_trig; + error2_trig_cp : coverpoint error2_trig; + error3_trig_cp : coverpoint error3_trig; + + endgroup + + /*----------------------- SHA512_ACC_CSR__NOTIF_INTR_TRIG_T COVERGROUPS -----------------------*/ + covergroup sha512_acc_csr__notif_intr_trig_t_bit_cg with function sample(input bit reg_bit); + option.per_instance = 1; + reg_bit_cp : coverpoint reg_bit { + bins value[2] = {0,1}; + } + reg_bit_edge_cp : coverpoint reg_bit { + bins rise = (0 => 1); + bins fall = (1 => 0); + } + + endgroup + covergroup sha512_acc_csr__notif_intr_trig_t_fld_cg with function sample( + input bit [1-1:0] notif_cmd_done_trig + ); + option.per_instance = 1; + notif_cmd_done_trig_cp : coverpoint notif_cmd_done_trig; + + endgroup + + /*----------------------- SHA512_ACC_CSR__INTR_COUNT_T_CNT_130AB269 COVERGROUPS -----------------------*/ + covergroup sha512_acc_csr__intr_count_t_cnt_130ab269_bit_cg with function sample(input bit reg_bit); + option.per_instance = 1; + reg_bit_cp : coverpoint reg_bit { + bins value[2] = {0,1}; + } + reg_bit_edge_cp : coverpoint reg_bit { + bins rise = (0 => 1); + bins fall = (1 => 0); + } + + endgroup + covergroup sha512_acc_csr__intr_count_t_cnt_130ab269_fld_cg with function sample( + input bit [32-1:0] cnt + ); + option.per_instance = 1; + cnt_cp : coverpoint cnt; + + endgroup + + /*----------------------- SHA512_ACC_CSR__INTR_COUNT_T_CNT_324DFC53 COVERGROUPS -----------------------*/ + covergroup sha512_acc_csr__intr_count_t_cnt_324dfc53_bit_cg with function sample(input bit reg_bit); + option.per_instance = 1; + reg_bit_cp : coverpoint reg_bit { + bins value[2] = {0,1}; + } + reg_bit_edge_cp : coverpoint reg_bit { + bins rise = (0 => 1); + bins fall = (1 => 0); + } + + endgroup + covergroup sha512_acc_csr__intr_count_t_cnt_324dfc53_fld_cg with function sample( + input bit [32-1:0] cnt + ); + option.per_instance = 1; + cnt_cp : coverpoint cnt; + + endgroup + + /*----------------------- SHA512_ACC_CSR__INTR_COUNT_T_CNT_791A4799 COVERGROUPS -----------------------*/ + covergroup sha512_acc_csr__intr_count_t_cnt_791a4799_bit_cg with function sample(input bit reg_bit); + option.per_instance = 1; + reg_bit_cp : coverpoint reg_bit { + bins value[2] = {0,1}; + } + reg_bit_edge_cp : coverpoint reg_bit { + bins rise = (0 => 1); + bins fall = (1 => 0); + } + + endgroup + covergroup sha512_acc_csr__intr_count_t_cnt_791a4799_fld_cg with function sample( + input bit [32-1:0] cnt + ); + option.per_instance = 1; + cnt_cp : coverpoint cnt; + + endgroup + + /*----------------------- SHA512_ACC_CSR__INTR_COUNT_T_CNT_E9DE7334 COVERGROUPS -----------------------*/ + covergroup sha512_acc_csr__intr_count_t_cnt_e9de7334_bit_cg with function sample(input bit reg_bit); + option.per_instance = 1; + reg_bit_cp : coverpoint reg_bit { + bins value[2] = {0,1}; + } + reg_bit_edge_cp : coverpoint reg_bit { + bins rise = (0 => 1); + bins fall = (1 => 0); + } + + endgroup + covergroup sha512_acc_csr__intr_count_t_cnt_e9de7334_fld_cg with function sample( + input bit [32-1:0] cnt + ); + option.per_instance = 1; + cnt_cp : coverpoint cnt; + + endgroup + + /*----------------------- SHA512_ACC_CSR__INTR_COUNT_T_CNT_BE67D6D5 COVERGROUPS -----------------------*/ + covergroup sha512_acc_csr__intr_count_t_cnt_be67d6d5_bit_cg with function sample(input bit reg_bit); + option.per_instance = 1; + reg_bit_cp : coverpoint reg_bit { + bins value[2] = {0,1}; + } + reg_bit_edge_cp : coverpoint reg_bit { + bins rise = (0 => 1); + bins fall = (1 => 0); + } + + endgroup + covergroup sha512_acc_csr__intr_count_t_cnt_be67d6d5_fld_cg with function sample( + input bit [32-1:0] cnt + ); + option.per_instance = 1; + cnt_cp : coverpoint cnt; + + endgroup + + /*----------------------- SHA512_ACC_CSR__INTR_COUNT_INCR_T_PULSE_37026C97 COVERGROUPS -----------------------*/ + covergroup sha512_acc_csr__intr_count_incr_t_pulse_37026c97_bit_cg with function sample(input bit reg_bit); + option.per_instance = 1; + reg_bit_cp : coverpoint reg_bit { + bins value[2] = {0,1}; + } + reg_bit_edge_cp : coverpoint reg_bit { + bins rise = (0 => 1); + bins fall = (1 => 0); + } + + endgroup + covergroup sha512_acc_csr__intr_count_incr_t_pulse_37026c97_fld_cg with function sample( + input bit [1-1:0] pulse + ); + option.per_instance = 1; + pulse_cp : coverpoint pulse; + + endgroup + + /*----------------------- SHA512_ACC_CSR__INTR_COUNT_INCR_T_PULSE_D860D977 COVERGROUPS -----------------------*/ + covergroup sha512_acc_csr__intr_count_incr_t_pulse_d860d977_bit_cg with function sample(input bit reg_bit); + option.per_instance = 1; + reg_bit_cp : coverpoint reg_bit { + bins value[2] = {0,1}; + } + reg_bit_edge_cp : coverpoint reg_bit { + bins rise = (0 => 1); + bins fall = (1 => 0); + } + + endgroup + covergroup sha512_acc_csr__intr_count_incr_t_pulse_d860d977_fld_cg with function sample( + input bit [1-1:0] pulse + ); + option.per_instance = 1; + pulse_cp : coverpoint pulse; + + endgroup + + /*----------------------- SHA512_ACC_CSR__INTR_COUNT_INCR_T_PULSE_87B45FE7 COVERGROUPS -----------------------*/ + covergroup sha512_acc_csr__intr_count_incr_t_pulse_87b45fe7_bit_cg with function sample(input bit reg_bit); + option.per_instance = 1; + reg_bit_cp : coverpoint reg_bit { + bins value[2] = {0,1}; + } + reg_bit_edge_cp : coverpoint reg_bit { + bins rise = (0 => 1); + bins fall = (1 => 0); + } + + endgroup + covergroup sha512_acc_csr__intr_count_incr_t_pulse_87b45fe7_fld_cg with function sample( + input bit [1-1:0] pulse + ); + option.per_instance = 1; + pulse_cp : coverpoint pulse; + + endgroup + + /*----------------------- SHA512_ACC_CSR__INTR_COUNT_INCR_T_PULSE_C1689EE6 COVERGROUPS -----------------------*/ + covergroup sha512_acc_csr__intr_count_incr_t_pulse_c1689ee6_bit_cg with function sample(input bit reg_bit); + option.per_instance = 1; + reg_bit_cp : coverpoint reg_bit { + bins value[2] = {0,1}; + } + reg_bit_edge_cp : coverpoint reg_bit { + bins rise = (0 => 1); + bins fall = (1 => 0); + } + + endgroup + covergroup sha512_acc_csr__intr_count_incr_t_pulse_c1689ee6_fld_cg with function sample( + input bit [1-1:0] pulse + ); + option.per_instance = 1; + pulse_cp : coverpoint pulse; + + endgroup + + /*----------------------- SHA512_ACC_CSR__INTR_COUNT_INCR_T_PULSE_6173128E COVERGROUPS -----------------------*/ + covergroup sha512_acc_csr__intr_count_incr_t_pulse_6173128e_bit_cg with function sample(input bit reg_bit); + option.per_instance = 1; + reg_bit_cp : coverpoint reg_bit { + bins value[2] = {0,1}; + } + reg_bit_edge_cp : coverpoint reg_bit { + bins rise = (0 => 1); + bins fall = (1 => 0); + } + + endgroup + covergroup sha512_acc_csr__intr_count_incr_t_pulse_6173128e_fld_cg with function sample( + input bit [1-1:0] pulse + ); + option.per_instance = 1; + pulse_cp : coverpoint pulse; + + endgroup + +`endif diff --git a/src/soc_ifc/rtl/sha512_acc_csr_pkg.sv b/src/soc_ifc/rtl/sha512_acc_csr_pkg.sv index fd30268ab..6cb6af010 100644 --- a/src/soc_ifc/rtl/sha512_acc_csr_pkg.sv +++ b/src/soc_ifc/rtl/sha512_acc_csr_pkg.sv @@ -22,8 +22,13 @@ package sha512_acc_csr_pkg; logic next; } sha512_acc_csr__STATUS__VALID__in_t; + typedef struct packed{ + logic next; + } sha512_acc_csr__STATUS__SOC_HAS_LOCK__in_t; + typedef struct packed{ sha512_acc_csr__STATUS__VALID__in_t VALID; + sha512_acc_csr__STATUS__SOC_HAS_LOCK__in_t SOC_HAS_LOCK; } sha512_acc_csr__STATUS__in_t; typedef struct packed{ @@ -151,8 +156,13 @@ package sha512_acc_csr_pkg; logic value; } sha512_acc_csr__STATUS__VALID__out_t; + typedef struct packed{ + logic value; + } sha512_acc_csr__STATUS__SOC_HAS_LOCK__out_t; + typedef struct packed{ sha512_acc_csr__STATUS__VALID__out_t VALID; + sha512_acc_csr__STATUS__SOC_HAS_LOCK__out_t SOC_HAS_LOCK; } sha512_acc_csr__STATUS__out_t; typedef struct packed{ diff --git a/src/soc_ifc/rtl/sha512_acc_csr_sample.svh b/src/soc_ifc/rtl/sha512_acc_csr_sample.svh new file mode 100644 index 000000000..cb752d1e8 --- /dev/null +++ b/src/soc_ifc/rtl/sha512_acc_csr_sample.svh @@ -0,0 +1,767 @@ +// SPDX-License-Identifier: Apache-2.0 +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +`ifndef SHA512_ACC_CSR_SAMPLE + `define SHA512_ACC_CSR_SAMPLE + + /*----------------------- SHA512_ACC_CSR__LOCK SAMPLE FUNCTIONS -----------------------*/ + function void sha512_acc_csr__LOCK::sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); + m_current = get(); + m_data = data; + m_is_read = is_read; + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(LOCK_bit_cg[bt]) this.LOCK_bit_cg[bt].sample(data[0 + bt]); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( data[0:0]/*LOCK*/ ); + end + endfunction + + function void sha512_acc_csr__LOCK::sample_values(); + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(LOCK_bit_cg[bt]) this.LOCK_bit_cg[bt].sample(LOCK.get_mirrored_value() >> bt); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( LOCK.get_mirrored_value() ); + end + endfunction + + /*----------------------- SHA512_ACC_CSR__USER SAMPLE FUNCTIONS -----------------------*/ + function void sha512_acc_csr__USER::sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); + m_current = get(); + m_data = data; + m_is_read = is_read; + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(USER_bit_cg[bt]) this.USER_bit_cg[bt].sample(data[0 + bt]); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( data[31:0]/*USER*/ ); + end + endfunction + + function void sha512_acc_csr__USER::sample_values(); + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(USER_bit_cg[bt]) this.USER_bit_cg[bt].sample(USER.get_mirrored_value() >> bt); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( USER.get_mirrored_value() ); + end + endfunction + + /*----------------------- SHA512_ACC_CSR__MODE SAMPLE FUNCTIONS -----------------------*/ + function void sha512_acc_csr__MODE::sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); + m_current = get(); + m_data = data; + m_is_read = is_read; + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(MODE_bit_cg[bt]) this.MODE_bit_cg[bt].sample(data[0 + bt]); + foreach(ENDIAN_TOGGLE_bit_cg[bt]) this.ENDIAN_TOGGLE_bit_cg[bt].sample(data[2 + bt]); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( data[1:0]/*MODE*/ , data[2:2]/*ENDIAN_TOGGLE*/ ); + end + endfunction + + function void sha512_acc_csr__MODE::sample_values(); + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(MODE_bit_cg[bt]) this.MODE_bit_cg[bt].sample(MODE.get_mirrored_value() >> bt); + foreach(ENDIAN_TOGGLE_bit_cg[bt]) this.ENDIAN_TOGGLE_bit_cg[bt].sample(ENDIAN_TOGGLE.get_mirrored_value() >> bt); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( MODE.get_mirrored_value() , ENDIAN_TOGGLE.get_mirrored_value() ); + end + endfunction + + /*----------------------- SHA512_ACC_CSR__START_ADDRESS SAMPLE FUNCTIONS -----------------------*/ + function void sha512_acc_csr__START_ADDRESS::sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); + m_current = get(); + m_data = data; + m_is_read = is_read; + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(ADDR_bit_cg[bt]) this.ADDR_bit_cg[bt].sample(data[0 + bt]); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( data[31:0]/*ADDR*/ ); + end + endfunction + + function void sha512_acc_csr__START_ADDRESS::sample_values(); + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(ADDR_bit_cg[bt]) this.ADDR_bit_cg[bt].sample(ADDR.get_mirrored_value() >> bt); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( ADDR.get_mirrored_value() ); + end + endfunction + + /*----------------------- SHA512_ACC_CSR__DLEN SAMPLE FUNCTIONS -----------------------*/ + function void sha512_acc_csr__DLEN::sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); + m_current = get(); + m_data = data; + m_is_read = is_read; + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(LENGTH_bit_cg[bt]) this.LENGTH_bit_cg[bt].sample(data[0 + bt]); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( data[31:0]/*LENGTH*/ ); + end + endfunction + + function void sha512_acc_csr__DLEN::sample_values(); + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(LENGTH_bit_cg[bt]) this.LENGTH_bit_cg[bt].sample(LENGTH.get_mirrored_value() >> bt); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( LENGTH.get_mirrored_value() ); + end + endfunction + + /*----------------------- SHA512_ACC_CSR__DATAIN SAMPLE FUNCTIONS -----------------------*/ + function void sha512_acc_csr__DATAIN::sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); + m_current = get(); + m_data = data; + m_is_read = is_read; + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(DATAIN_bit_cg[bt]) this.DATAIN_bit_cg[bt].sample(data[0 + bt]); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( data[31:0]/*DATAIN*/ ); + end + endfunction + + function void sha512_acc_csr__DATAIN::sample_values(); + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(DATAIN_bit_cg[bt]) this.DATAIN_bit_cg[bt].sample(DATAIN.get_mirrored_value() >> bt); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( DATAIN.get_mirrored_value() ); + end + endfunction + + /*----------------------- SHA512_ACC_CSR__EXECUTE SAMPLE FUNCTIONS -----------------------*/ + function void sha512_acc_csr__EXECUTE::sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); + m_current = get(); + m_data = data; + m_is_read = is_read; + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(EXECUTE_bit_cg[bt]) this.EXECUTE_bit_cg[bt].sample(data[0 + bt]); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( data[0:0]/*EXECUTE*/ ); + end + endfunction + + function void sha512_acc_csr__EXECUTE::sample_values(); + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(EXECUTE_bit_cg[bt]) this.EXECUTE_bit_cg[bt].sample(EXECUTE.get_mirrored_value() >> bt); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( EXECUTE.get_mirrored_value() ); + end + endfunction + + /*----------------------- SHA512_ACC_CSR__STATUS SAMPLE FUNCTIONS -----------------------*/ + function void sha512_acc_csr__STATUS::sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); + m_current = get(); + m_data = data; + m_is_read = is_read; + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(VALID_bit_cg[bt]) this.VALID_bit_cg[bt].sample(data[0 + bt]); + foreach(SOC_HAS_LOCK_bit_cg[bt]) this.SOC_HAS_LOCK_bit_cg[bt].sample(data[1 + bt]); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( data[0:0]/*VALID*/ , data[1:1]/*SOC_HAS_LOCK*/ ); + end + endfunction + + function void sha512_acc_csr__STATUS::sample_values(); + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(VALID_bit_cg[bt]) this.VALID_bit_cg[bt].sample(VALID.get_mirrored_value() >> bt); + foreach(SOC_HAS_LOCK_bit_cg[bt]) this.SOC_HAS_LOCK_bit_cg[bt].sample(SOC_HAS_LOCK.get_mirrored_value() >> bt); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( VALID.get_mirrored_value() , SOC_HAS_LOCK.get_mirrored_value() ); + end + endfunction + + /*----------------------- SHA512_ACC_CSR__DIGEST SAMPLE FUNCTIONS -----------------------*/ + function void sha512_acc_csr__DIGEST::sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); + m_current = get(); + m_data = data; + m_is_read = is_read; + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(DIGEST_bit_cg[bt]) this.DIGEST_bit_cg[bt].sample(data[0 + bt]); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( data[31:0]/*DIGEST*/ ); + end + endfunction + + function void sha512_acc_csr__DIGEST::sample_values(); + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(DIGEST_bit_cg[bt]) this.DIGEST_bit_cg[bt].sample(DIGEST.get_mirrored_value() >> bt); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( DIGEST.get_mirrored_value() ); + end + endfunction + + /*----------------------- SHA512_ACC_CSR__CONTROL SAMPLE FUNCTIONS -----------------------*/ + function void sha512_acc_csr__CONTROL::sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); + m_current = get(); + m_data = data; + m_is_read = is_read; + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(ZEROIZE_bit_cg[bt]) this.ZEROIZE_bit_cg[bt].sample(data[0 + bt]); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( data[0:0]/*ZEROIZE*/ ); + end + endfunction + + function void sha512_acc_csr__CONTROL::sample_values(); + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(ZEROIZE_bit_cg[bt]) this.ZEROIZE_bit_cg[bt].sample(ZEROIZE.get_mirrored_value() >> bt); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( ZEROIZE.get_mirrored_value() ); + end + endfunction + + /*----------------------- SHA512_ACC_CSR__GLOBAL_INTR_EN_T SAMPLE FUNCTIONS -----------------------*/ + function void sha512_acc_csr__global_intr_en_t::sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); + m_current = get(); + m_data = data; + m_is_read = is_read; + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(error_en_bit_cg[bt]) this.error_en_bit_cg[bt].sample(data[0 + bt]); + foreach(notif_en_bit_cg[bt]) this.notif_en_bit_cg[bt].sample(data[1 + bt]); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( data[0:0]/*error_en*/ , data[1:1]/*notif_en*/ ); + end + endfunction + + function void sha512_acc_csr__global_intr_en_t::sample_values(); + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(error_en_bit_cg[bt]) this.error_en_bit_cg[bt].sample(error_en.get_mirrored_value() >> bt); + foreach(notif_en_bit_cg[bt]) this.notif_en_bit_cg[bt].sample(notif_en.get_mirrored_value() >> bt); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( error_en.get_mirrored_value() , notif_en.get_mirrored_value() ); + end + endfunction + + /*----------------------- SHA512_ACC_CSR__ERROR_INTR_EN_T SAMPLE FUNCTIONS -----------------------*/ + function void sha512_acc_csr__error_intr_en_t::sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); + m_current = get(); + m_data = data; + m_is_read = is_read; + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(error0_en_bit_cg[bt]) this.error0_en_bit_cg[bt].sample(data[0 + bt]); + foreach(error1_en_bit_cg[bt]) this.error1_en_bit_cg[bt].sample(data[1 + bt]); + foreach(error2_en_bit_cg[bt]) this.error2_en_bit_cg[bt].sample(data[2 + bt]); + foreach(error3_en_bit_cg[bt]) this.error3_en_bit_cg[bt].sample(data[3 + bt]); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( data[0:0]/*error0_en*/ , data[1:1]/*error1_en*/ , data[2:2]/*error2_en*/ , data[3:3]/*error3_en*/ ); + end + endfunction + + function void sha512_acc_csr__error_intr_en_t::sample_values(); + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(error0_en_bit_cg[bt]) this.error0_en_bit_cg[bt].sample(error0_en.get_mirrored_value() >> bt); + foreach(error1_en_bit_cg[bt]) this.error1_en_bit_cg[bt].sample(error1_en.get_mirrored_value() >> bt); + foreach(error2_en_bit_cg[bt]) this.error2_en_bit_cg[bt].sample(error2_en.get_mirrored_value() >> bt); + foreach(error3_en_bit_cg[bt]) this.error3_en_bit_cg[bt].sample(error3_en.get_mirrored_value() >> bt); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( error0_en.get_mirrored_value() , error1_en.get_mirrored_value() , error2_en.get_mirrored_value() , error3_en.get_mirrored_value() ); + end + endfunction + + /*----------------------- SHA512_ACC_CSR__NOTIF_INTR_EN_T SAMPLE FUNCTIONS -----------------------*/ + function void sha512_acc_csr__notif_intr_en_t::sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); + m_current = get(); + m_data = data; + m_is_read = is_read; + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(notif_cmd_done_en_bit_cg[bt]) this.notif_cmd_done_en_bit_cg[bt].sample(data[0 + bt]); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( data[0:0]/*notif_cmd_done_en*/ ); + end + endfunction + + function void sha512_acc_csr__notif_intr_en_t::sample_values(); + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(notif_cmd_done_en_bit_cg[bt]) this.notif_cmd_done_en_bit_cg[bt].sample(notif_cmd_done_en.get_mirrored_value() >> bt); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( notif_cmd_done_en.get_mirrored_value() ); + end + endfunction + + /*----------------------- SHA512_ACC_CSR__GLOBAL_INTR_T_AGG_STS_DD3DCF0A SAMPLE FUNCTIONS -----------------------*/ + function void sha512_acc_csr__global_intr_t_agg_sts_dd3dcf0a::sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); + m_current = get(); + m_data = data; + m_is_read = is_read; + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(agg_sts_bit_cg[bt]) this.agg_sts_bit_cg[bt].sample(data[0 + bt]); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( data[0:0]/*agg_sts*/ ); + end + endfunction + + function void sha512_acc_csr__global_intr_t_agg_sts_dd3dcf0a::sample_values(); + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(agg_sts_bit_cg[bt]) this.agg_sts_bit_cg[bt].sample(agg_sts.get_mirrored_value() >> bt); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( agg_sts.get_mirrored_value() ); + end + endfunction + + /*----------------------- SHA512_ACC_CSR__GLOBAL_INTR_T_AGG_STS_E6399B4A SAMPLE FUNCTIONS -----------------------*/ + function void sha512_acc_csr__global_intr_t_agg_sts_e6399b4a::sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); + m_current = get(); + m_data = data; + m_is_read = is_read; + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(agg_sts_bit_cg[bt]) this.agg_sts_bit_cg[bt].sample(data[0 + bt]); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( data[0:0]/*agg_sts*/ ); + end + endfunction + + function void sha512_acc_csr__global_intr_t_agg_sts_e6399b4a::sample_values(); + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(agg_sts_bit_cg[bt]) this.agg_sts_bit_cg[bt].sample(agg_sts.get_mirrored_value() >> bt); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( agg_sts.get_mirrored_value() ); + end + endfunction + + /*----------------------- SHA512_ACC_CSR__ERROR_INTR_T_ERROR0_STS_5EE134BF_ERROR1_STS_AAD9583F_ERROR2_STS_6CAD4575_ERROR3_STS_735BBEBA SAMPLE FUNCTIONS -----------------------*/ + function void sha512_acc_csr__error_intr_t_error0_sts_5ee134bf_error1_sts_aad9583f_error2_sts_6cad4575_error3_sts_735bbeba::sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); + m_current = get(); + m_data = data; + m_is_read = is_read; + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(error0_sts_bit_cg[bt]) this.error0_sts_bit_cg[bt].sample(data[0 + bt]); + foreach(error1_sts_bit_cg[bt]) this.error1_sts_bit_cg[bt].sample(data[1 + bt]); + foreach(error2_sts_bit_cg[bt]) this.error2_sts_bit_cg[bt].sample(data[2 + bt]); + foreach(error3_sts_bit_cg[bt]) this.error3_sts_bit_cg[bt].sample(data[3 + bt]); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( data[0:0]/*error0_sts*/ , data[1:1]/*error1_sts*/ , data[2:2]/*error2_sts*/ , data[3:3]/*error3_sts*/ ); + end + endfunction + + function void sha512_acc_csr__error_intr_t_error0_sts_5ee134bf_error1_sts_aad9583f_error2_sts_6cad4575_error3_sts_735bbeba::sample_values(); + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(error0_sts_bit_cg[bt]) this.error0_sts_bit_cg[bt].sample(error0_sts.get_mirrored_value() >> bt); + foreach(error1_sts_bit_cg[bt]) this.error1_sts_bit_cg[bt].sample(error1_sts.get_mirrored_value() >> bt); + foreach(error2_sts_bit_cg[bt]) this.error2_sts_bit_cg[bt].sample(error2_sts.get_mirrored_value() >> bt); + foreach(error3_sts_bit_cg[bt]) this.error3_sts_bit_cg[bt].sample(error3_sts.get_mirrored_value() >> bt); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( error0_sts.get_mirrored_value() , error1_sts.get_mirrored_value() , error2_sts.get_mirrored_value() , error3_sts.get_mirrored_value() ); + end + endfunction + + /*----------------------- SHA512_ACC_CSR__NOTIF_INTR_T_NOTIF_CMD_DONE_STS_1C68637E SAMPLE FUNCTIONS -----------------------*/ + function void sha512_acc_csr__notif_intr_t_notif_cmd_done_sts_1c68637e::sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); + m_current = get(); + m_data = data; + m_is_read = is_read; + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(notif_cmd_done_sts_bit_cg[bt]) this.notif_cmd_done_sts_bit_cg[bt].sample(data[0 + bt]); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( data[0:0]/*notif_cmd_done_sts*/ ); + end + endfunction + + function void sha512_acc_csr__notif_intr_t_notif_cmd_done_sts_1c68637e::sample_values(); + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(notif_cmd_done_sts_bit_cg[bt]) this.notif_cmd_done_sts_bit_cg[bt].sample(notif_cmd_done_sts.get_mirrored_value() >> bt); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( notif_cmd_done_sts.get_mirrored_value() ); + end + endfunction + + /*----------------------- SHA512_ACC_CSR__ERROR_INTR_TRIG_T SAMPLE FUNCTIONS -----------------------*/ + function void sha512_acc_csr__error_intr_trig_t::sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); + m_current = get(); + m_data = data; + m_is_read = is_read; + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(error0_trig_bit_cg[bt]) this.error0_trig_bit_cg[bt].sample(data[0 + bt]); + foreach(error1_trig_bit_cg[bt]) this.error1_trig_bit_cg[bt].sample(data[1 + bt]); + foreach(error2_trig_bit_cg[bt]) this.error2_trig_bit_cg[bt].sample(data[2 + bt]); + foreach(error3_trig_bit_cg[bt]) this.error3_trig_bit_cg[bt].sample(data[3 + bt]); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( data[0:0]/*error0_trig*/ , data[1:1]/*error1_trig*/ , data[2:2]/*error2_trig*/ , data[3:3]/*error3_trig*/ ); + end + endfunction + + function void sha512_acc_csr__error_intr_trig_t::sample_values(); + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(error0_trig_bit_cg[bt]) this.error0_trig_bit_cg[bt].sample(error0_trig.get_mirrored_value() >> bt); + foreach(error1_trig_bit_cg[bt]) this.error1_trig_bit_cg[bt].sample(error1_trig.get_mirrored_value() >> bt); + foreach(error2_trig_bit_cg[bt]) this.error2_trig_bit_cg[bt].sample(error2_trig.get_mirrored_value() >> bt); + foreach(error3_trig_bit_cg[bt]) this.error3_trig_bit_cg[bt].sample(error3_trig.get_mirrored_value() >> bt); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( error0_trig.get_mirrored_value() , error1_trig.get_mirrored_value() , error2_trig.get_mirrored_value() , error3_trig.get_mirrored_value() ); + end + endfunction + + /*----------------------- SHA512_ACC_CSR__NOTIF_INTR_TRIG_T SAMPLE FUNCTIONS -----------------------*/ + function void sha512_acc_csr__notif_intr_trig_t::sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); + m_current = get(); + m_data = data; + m_is_read = is_read; + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(notif_cmd_done_trig_bit_cg[bt]) this.notif_cmd_done_trig_bit_cg[bt].sample(data[0 + bt]); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( data[0:0]/*notif_cmd_done_trig*/ ); + end + endfunction + + function void sha512_acc_csr__notif_intr_trig_t::sample_values(); + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(notif_cmd_done_trig_bit_cg[bt]) this.notif_cmd_done_trig_bit_cg[bt].sample(notif_cmd_done_trig.get_mirrored_value() >> bt); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( notif_cmd_done_trig.get_mirrored_value() ); + end + endfunction + + /*----------------------- SHA512_ACC_CSR__INTR_COUNT_T_CNT_130AB269 SAMPLE FUNCTIONS -----------------------*/ + function void sha512_acc_csr__intr_count_t_cnt_130ab269::sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); + m_current = get(); + m_data = data; + m_is_read = is_read; + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(cnt_bit_cg[bt]) this.cnt_bit_cg[bt].sample(data[0 + bt]); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( data[31:0]/*cnt*/ ); + end + endfunction + + function void sha512_acc_csr__intr_count_t_cnt_130ab269::sample_values(); + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(cnt_bit_cg[bt]) this.cnt_bit_cg[bt].sample(cnt.get_mirrored_value() >> bt); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( cnt.get_mirrored_value() ); + end + endfunction + + /*----------------------- SHA512_ACC_CSR__INTR_COUNT_T_CNT_324DFC53 SAMPLE FUNCTIONS -----------------------*/ + function void sha512_acc_csr__intr_count_t_cnt_324dfc53::sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); + m_current = get(); + m_data = data; + m_is_read = is_read; + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(cnt_bit_cg[bt]) this.cnt_bit_cg[bt].sample(data[0 + bt]); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( data[31:0]/*cnt*/ ); + end + endfunction + + function void sha512_acc_csr__intr_count_t_cnt_324dfc53::sample_values(); + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(cnt_bit_cg[bt]) this.cnt_bit_cg[bt].sample(cnt.get_mirrored_value() >> bt); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( cnt.get_mirrored_value() ); + end + endfunction + + /*----------------------- SHA512_ACC_CSR__INTR_COUNT_T_CNT_791A4799 SAMPLE FUNCTIONS -----------------------*/ + function void sha512_acc_csr__intr_count_t_cnt_791a4799::sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); + m_current = get(); + m_data = data; + m_is_read = is_read; + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(cnt_bit_cg[bt]) this.cnt_bit_cg[bt].sample(data[0 + bt]); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( data[31:0]/*cnt*/ ); + end + endfunction + + function void sha512_acc_csr__intr_count_t_cnt_791a4799::sample_values(); + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(cnt_bit_cg[bt]) this.cnt_bit_cg[bt].sample(cnt.get_mirrored_value() >> bt); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( cnt.get_mirrored_value() ); + end + endfunction + + /*----------------------- SHA512_ACC_CSR__INTR_COUNT_T_CNT_E9DE7334 SAMPLE FUNCTIONS -----------------------*/ + function void sha512_acc_csr__intr_count_t_cnt_e9de7334::sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); + m_current = get(); + m_data = data; + m_is_read = is_read; + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(cnt_bit_cg[bt]) this.cnt_bit_cg[bt].sample(data[0 + bt]); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( data[31:0]/*cnt*/ ); + end + endfunction + + function void sha512_acc_csr__intr_count_t_cnt_e9de7334::sample_values(); + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(cnt_bit_cg[bt]) this.cnt_bit_cg[bt].sample(cnt.get_mirrored_value() >> bt); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( cnt.get_mirrored_value() ); + end + endfunction + + /*----------------------- SHA512_ACC_CSR__INTR_COUNT_T_CNT_BE67D6D5 SAMPLE FUNCTIONS -----------------------*/ + function void sha512_acc_csr__intr_count_t_cnt_be67d6d5::sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); + m_current = get(); + m_data = data; + m_is_read = is_read; + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(cnt_bit_cg[bt]) this.cnt_bit_cg[bt].sample(data[0 + bt]); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( data[31:0]/*cnt*/ ); + end + endfunction + + function void sha512_acc_csr__intr_count_t_cnt_be67d6d5::sample_values(); + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(cnt_bit_cg[bt]) this.cnt_bit_cg[bt].sample(cnt.get_mirrored_value() >> bt); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( cnt.get_mirrored_value() ); + end + endfunction + + /*----------------------- SHA512_ACC_CSR__INTR_COUNT_INCR_T_PULSE_37026C97 SAMPLE FUNCTIONS -----------------------*/ + function void sha512_acc_csr__intr_count_incr_t_pulse_37026c97::sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); + m_current = get(); + m_data = data; + m_is_read = is_read; + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(pulse_bit_cg[bt]) this.pulse_bit_cg[bt].sample(data[0 + bt]); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( data[0:0]/*pulse*/ ); + end + endfunction + + function void sha512_acc_csr__intr_count_incr_t_pulse_37026c97::sample_values(); + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(pulse_bit_cg[bt]) this.pulse_bit_cg[bt].sample(pulse.get_mirrored_value() >> bt); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( pulse.get_mirrored_value() ); + end + endfunction + + /*----------------------- SHA512_ACC_CSR__INTR_COUNT_INCR_T_PULSE_D860D977 SAMPLE FUNCTIONS -----------------------*/ + function void sha512_acc_csr__intr_count_incr_t_pulse_d860d977::sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); + m_current = get(); + m_data = data; + m_is_read = is_read; + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(pulse_bit_cg[bt]) this.pulse_bit_cg[bt].sample(data[0 + bt]); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( data[0:0]/*pulse*/ ); + end + endfunction + + function void sha512_acc_csr__intr_count_incr_t_pulse_d860d977::sample_values(); + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(pulse_bit_cg[bt]) this.pulse_bit_cg[bt].sample(pulse.get_mirrored_value() >> bt); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( pulse.get_mirrored_value() ); + end + endfunction + + /*----------------------- SHA512_ACC_CSR__INTR_COUNT_INCR_T_PULSE_87B45FE7 SAMPLE FUNCTIONS -----------------------*/ + function void sha512_acc_csr__intr_count_incr_t_pulse_87b45fe7::sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); + m_current = get(); + m_data = data; + m_is_read = is_read; + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(pulse_bit_cg[bt]) this.pulse_bit_cg[bt].sample(data[0 + bt]); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( data[0:0]/*pulse*/ ); + end + endfunction + + function void sha512_acc_csr__intr_count_incr_t_pulse_87b45fe7::sample_values(); + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(pulse_bit_cg[bt]) this.pulse_bit_cg[bt].sample(pulse.get_mirrored_value() >> bt); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( pulse.get_mirrored_value() ); + end + endfunction + + /*----------------------- SHA512_ACC_CSR__INTR_COUNT_INCR_T_PULSE_C1689EE6 SAMPLE FUNCTIONS -----------------------*/ + function void sha512_acc_csr__intr_count_incr_t_pulse_c1689ee6::sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); + m_current = get(); + m_data = data; + m_is_read = is_read; + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(pulse_bit_cg[bt]) this.pulse_bit_cg[bt].sample(data[0 + bt]); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( data[0:0]/*pulse*/ ); + end + endfunction + + function void sha512_acc_csr__intr_count_incr_t_pulse_c1689ee6::sample_values(); + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(pulse_bit_cg[bt]) this.pulse_bit_cg[bt].sample(pulse.get_mirrored_value() >> bt); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( pulse.get_mirrored_value() ); + end + endfunction + + /*----------------------- SHA512_ACC_CSR__INTR_COUNT_INCR_T_PULSE_6173128E SAMPLE FUNCTIONS -----------------------*/ + function void sha512_acc_csr__intr_count_incr_t_pulse_6173128e::sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); + m_current = get(); + m_data = data; + m_is_read = is_read; + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(pulse_bit_cg[bt]) this.pulse_bit_cg[bt].sample(data[0 + bt]); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( data[0:0]/*pulse*/ ); + end + endfunction + + function void sha512_acc_csr__intr_count_incr_t_pulse_6173128e::sample_values(); + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(pulse_bit_cg[bt]) this.pulse_bit_cg[bt].sample(pulse.get_mirrored_value() >> bt); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( pulse.get_mirrored_value() ); + end + endfunction + +`endif \ No newline at end of file diff --git a/src/soc_ifc/rtl/sha512_acc_csr_uvm.sv b/src/soc_ifc/rtl/sha512_acc_csr_uvm.sv index ec1ea1517..d5f30e46e 100644 --- a/src/soc_ifc/rtl/sha512_acc_csr_uvm.sv +++ b/src/soc_ifc/rtl/sha512_acc_csr_uvm.sv @@ -3,177 +3,376 @@ package sha512_acc_csr_uvm; `include "uvm_macros.svh" import uvm_pkg::*; - + `include "sha512_acc_csr_covergroups.svh" // Reg - sha512_acc_csr::LOCK class sha512_acc_csr__LOCK extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + sha512_acc_csr__LOCK_bit_cg LOCK_bit_cg[1]; + sha512_acc_csr__LOCK_fld_cg fld_cg; rand uvm_reg_field LOCK; function new(string name = "sha512_acc_csr__LOCK"); - super.new(name, 32, UVM_NO_COVERAGE); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); virtual function void build(); this.LOCK = new("LOCK"); - this.LOCK.configure(this, 1, 0, "W1CRS", 0, 'h0, 1, 1, 0); + this.LOCK.configure(this, 1, 0, "W1CRS", 0, 'h1, 1, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(LOCK_bit_cg[bt]) LOCK_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); endfunction : build endclass : sha512_acc_csr__LOCK // Reg - sha512_acc_csr::USER class sha512_acc_csr__USER extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + sha512_acc_csr__USER_bit_cg USER_bit_cg[32]; + sha512_acc_csr__USER_fld_cg fld_cg; rand uvm_reg_field USER; function new(string name = "sha512_acc_csr__USER"); - super.new(name, 32, UVM_NO_COVERAGE); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); virtual function void build(); this.USER = new("USER"); this.USER.configure(this, 32, 0, "RO", 1, 'h0, 1, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(USER_bit_cg[bt]) USER_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); endfunction : build endclass : sha512_acc_csr__USER // Reg - sha512_acc_csr::MODE class sha512_acc_csr__MODE extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + sha512_acc_csr__MODE_bit_cg MODE_bit_cg[2]; + sha512_acc_csr__MODE_bit_cg ENDIAN_TOGGLE_bit_cg[1]; + sha512_acc_csr__MODE_fld_cg fld_cg; rand uvm_reg_field MODE; rand uvm_reg_field ENDIAN_TOGGLE; function new(string name = "sha512_acc_csr__MODE"); - super.new(name, 32, UVM_NO_COVERAGE); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); virtual function void build(); this.MODE = new("MODE"); this.MODE.configure(this, 2, 0, "RW", 0, 'h0, 1, 1, 0); this.ENDIAN_TOGGLE = new("ENDIAN_TOGGLE"); this.ENDIAN_TOGGLE.configure(this, 1, 2, "RW", 0, 'h0, 1, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(MODE_bit_cg[bt]) MODE_bit_cg[bt] = new(); + foreach(ENDIAN_TOGGLE_bit_cg[bt]) ENDIAN_TOGGLE_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); endfunction : build endclass : sha512_acc_csr__MODE // Reg - sha512_acc_csr::START_ADDRESS class sha512_acc_csr__START_ADDRESS extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + sha512_acc_csr__START_ADDRESS_bit_cg ADDR_bit_cg[32]; + sha512_acc_csr__START_ADDRESS_fld_cg fld_cg; rand uvm_reg_field ADDR; function new(string name = "sha512_acc_csr__START_ADDRESS"); - super.new(name, 32, UVM_NO_COVERAGE); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); virtual function void build(); this.ADDR = new("ADDR"); this.ADDR.configure(this, 32, 0, "RW", 0, 'h0, 1, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(ADDR_bit_cg[bt]) ADDR_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); endfunction : build endclass : sha512_acc_csr__START_ADDRESS // Reg - sha512_acc_csr::DLEN class sha512_acc_csr__DLEN extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + sha512_acc_csr__DLEN_bit_cg LENGTH_bit_cg[32]; + sha512_acc_csr__DLEN_fld_cg fld_cg; rand uvm_reg_field LENGTH; function new(string name = "sha512_acc_csr__DLEN"); - super.new(name, 32, UVM_NO_COVERAGE); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); virtual function void build(); this.LENGTH = new("LENGTH"); this.LENGTH.configure(this, 32, 0, "RW", 0, 'h0, 1, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(LENGTH_bit_cg[bt]) LENGTH_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); endfunction : build endclass : sha512_acc_csr__DLEN // Reg - sha512_acc_csr::DATAIN class sha512_acc_csr__DATAIN extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + sha512_acc_csr__DATAIN_bit_cg DATAIN_bit_cg[32]; + sha512_acc_csr__DATAIN_fld_cg fld_cg; rand uvm_reg_field DATAIN; function new(string name = "sha512_acc_csr__DATAIN"); - super.new(name, 32, UVM_NO_COVERAGE); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); virtual function void build(); this.DATAIN = new("DATAIN"); this.DATAIN.configure(this, 32, 0, "RW", 0, 'h0, 1, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(DATAIN_bit_cg[bt]) DATAIN_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); endfunction : build endclass : sha512_acc_csr__DATAIN // Reg - sha512_acc_csr::EXECUTE class sha512_acc_csr__EXECUTE extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + sha512_acc_csr__EXECUTE_bit_cg EXECUTE_bit_cg[1]; + sha512_acc_csr__EXECUTE_fld_cg fld_cg; rand uvm_reg_field EXECUTE; function new(string name = "sha512_acc_csr__EXECUTE"); - super.new(name, 32, UVM_NO_COVERAGE); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); virtual function void build(); this.EXECUTE = new("EXECUTE"); this.EXECUTE.configure(this, 1, 0, "RW", 1, 'h0, 1, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(EXECUTE_bit_cg[bt]) EXECUTE_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); endfunction : build endclass : sha512_acc_csr__EXECUTE // Reg - sha512_acc_csr::STATUS class sha512_acc_csr__STATUS extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + sha512_acc_csr__STATUS_bit_cg VALID_bit_cg[1]; + sha512_acc_csr__STATUS_bit_cg SOC_HAS_LOCK_bit_cg[1]; + sha512_acc_csr__STATUS_fld_cg fld_cg; rand uvm_reg_field VALID; + rand uvm_reg_field SOC_HAS_LOCK; function new(string name = "sha512_acc_csr__STATUS"); - super.new(name, 32, UVM_NO_COVERAGE); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); virtual function void build(); this.VALID = new("VALID"); this.VALID.configure(this, 1, 0, "RO", 1, 'h0, 1, 1, 0); + this.SOC_HAS_LOCK = new("SOC_HAS_LOCK"); + this.SOC_HAS_LOCK.configure(this, 1, 1, "RO", 1, 'h0, 1, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(VALID_bit_cg[bt]) VALID_bit_cg[bt] = new(); + foreach(SOC_HAS_LOCK_bit_cg[bt]) SOC_HAS_LOCK_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); endfunction : build endclass : sha512_acc_csr__STATUS // Reg - sha512_acc_csr::DIGEST class sha512_acc_csr__DIGEST extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + sha512_acc_csr__DIGEST_bit_cg DIGEST_bit_cg[32]; + sha512_acc_csr__DIGEST_fld_cg fld_cg; rand uvm_reg_field DIGEST; function new(string name = "sha512_acc_csr__DIGEST"); - super.new(name, 32, UVM_NO_COVERAGE); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); virtual function void build(); this.DIGEST = new("DIGEST"); this.DIGEST.configure(this, 32, 0, "RO", 1, 'h0, 1, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(DIGEST_bit_cg[bt]) DIGEST_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); endfunction : build endclass : sha512_acc_csr__DIGEST // Reg - sha512_acc_csr::CONTROL class sha512_acc_csr__CONTROL extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + sha512_acc_csr__CONTROL_bit_cg ZEROIZE_bit_cg[1]; + sha512_acc_csr__CONTROL_fld_cg fld_cg; rand uvm_reg_field ZEROIZE; function new(string name = "sha512_acc_csr__CONTROL"); - super.new(name, 32, UVM_NO_COVERAGE); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); virtual function void build(); this.ZEROIZE = new("ZEROIZE"); this.ZEROIZE.configure(this, 1, 0, "RW", 0, 'h0, 1, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(ZEROIZE_bit_cg[bt]) ZEROIZE_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); endfunction : build endclass : sha512_acc_csr__CONTROL // Reg - sha512_acc_csr::global_intr_en_t class sha512_acc_csr__global_intr_en_t extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + sha512_acc_csr__global_intr_en_t_bit_cg error_en_bit_cg[1]; + sha512_acc_csr__global_intr_en_t_bit_cg notif_en_bit_cg[1]; + sha512_acc_csr__global_intr_en_t_fld_cg fld_cg; rand uvm_reg_field error_en; rand uvm_reg_field notif_en; function new(string name = "sha512_acc_csr__global_intr_en_t"); - super.new(name, 32, UVM_NO_COVERAGE); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); virtual function void build(); this.error_en = new("error_en"); this.error_en.configure(this, 1, 0, "RW", 0, 'h0, 1, 1, 0); this.notif_en = new("notif_en"); this.notif_en.configure(this, 1, 1, "RW", 0, 'h0, 1, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(error_en_bit_cg[bt]) error_en_bit_cg[bt] = new(); + foreach(notif_en_bit_cg[bt]) notif_en_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); endfunction : build endclass : sha512_acc_csr__global_intr_en_t // Reg - sha512_acc_csr::error_intr_en_t class sha512_acc_csr__error_intr_en_t extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + sha512_acc_csr__error_intr_en_t_bit_cg error0_en_bit_cg[1]; + sha512_acc_csr__error_intr_en_t_bit_cg error1_en_bit_cg[1]; + sha512_acc_csr__error_intr_en_t_bit_cg error2_en_bit_cg[1]; + sha512_acc_csr__error_intr_en_t_bit_cg error3_en_bit_cg[1]; + sha512_acc_csr__error_intr_en_t_fld_cg fld_cg; rand uvm_reg_field error0_en; rand uvm_reg_field error1_en; rand uvm_reg_field error2_en; rand uvm_reg_field error3_en; function new(string name = "sha512_acc_csr__error_intr_en_t"); - super.new(name, 32, UVM_NO_COVERAGE); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); virtual function void build(); this.error0_en = new("error0_en"); @@ -184,61 +383,131 @@ package sha512_acc_csr_uvm; this.error2_en.configure(this, 1, 2, "RW", 0, 'h0, 1, 1, 0); this.error3_en = new("error3_en"); this.error3_en.configure(this, 1, 3, "RW", 0, 'h0, 1, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(error0_en_bit_cg[bt]) error0_en_bit_cg[bt] = new(); + foreach(error1_en_bit_cg[bt]) error1_en_bit_cg[bt] = new(); + foreach(error2_en_bit_cg[bt]) error2_en_bit_cg[bt] = new(); + foreach(error3_en_bit_cg[bt]) error3_en_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); endfunction : build endclass : sha512_acc_csr__error_intr_en_t // Reg - sha512_acc_csr::notif_intr_en_t class sha512_acc_csr__notif_intr_en_t extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + sha512_acc_csr__notif_intr_en_t_bit_cg notif_cmd_done_en_bit_cg[1]; + sha512_acc_csr__notif_intr_en_t_fld_cg fld_cg; rand uvm_reg_field notif_cmd_done_en; function new(string name = "sha512_acc_csr__notif_intr_en_t"); - super.new(name, 32, UVM_NO_COVERAGE); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); virtual function void build(); this.notif_cmd_done_en = new("notif_cmd_done_en"); this.notif_cmd_done_en.configure(this, 1, 0, "RW", 0, 'h0, 1, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(notif_cmd_done_en_bit_cg[bt]) notif_cmd_done_en_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); endfunction : build endclass : sha512_acc_csr__notif_intr_en_t // Reg - sha512_acc_csr::global_intr_t_agg_sts_dd3dcf0a class sha512_acc_csr__global_intr_t_agg_sts_dd3dcf0a extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + sha512_acc_csr__global_intr_t_agg_sts_dd3dcf0a_bit_cg agg_sts_bit_cg[1]; + sha512_acc_csr__global_intr_t_agg_sts_dd3dcf0a_fld_cg fld_cg; rand uvm_reg_field agg_sts; function new(string name = "sha512_acc_csr__global_intr_t_agg_sts_dd3dcf0a"); - super.new(name, 32, UVM_NO_COVERAGE); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); virtual function void build(); this.agg_sts = new("agg_sts"); this.agg_sts.configure(this, 1, 0, "RO", 1, 'h0, 1, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(agg_sts_bit_cg[bt]) agg_sts_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); endfunction : build endclass : sha512_acc_csr__global_intr_t_agg_sts_dd3dcf0a // Reg - sha512_acc_csr::global_intr_t_agg_sts_e6399b4a class sha512_acc_csr__global_intr_t_agg_sts_e6399b4a extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + sha512_acc_csr__global_intr_t_agg_sts_e6399b4a_bit_cg agg_sts_bit_cg[1]; + sha512_acc_csr__global_intr_t_agg_sts_e6399b4a_fld_cg fld_cg; rand uvm_reg_field agg_sts; function new(string name = "sha512_acc_csr__global_intr_t_agg_sts_e6399b4a"); - super.new(name, 32, UVM_NO_COVERAGE); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); virtual function void build(); this.agg_sts = new("agg_sts"); this.agg_sts.configure(this, 1, 0, "RO", 1, 'h0, 1, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(agg_sts_bit_cg[bt]) agg_sts_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); endfunction : build endclass : sha512_acc_csr__global_intr_t_agg_sts_e6399b4a // Reg - sha512_acc_csr::error_intr_t_error0_sts_5ee134bf_error1_sts_aad9583f_error2_sts_6cad4575_error3_sts_735bbeba class sha512_acc_csr__error_intr_t_error0_sts_5ee134bf_error1_sts_aad9583f_error2_sts_6cad4575_error3_sts_735bbeba extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + sha512_acc_csr__error_intr_t_error0_sts_5ee134bf_error1_sts_aad9583f_error2_sts_6cad4575_error3_sts_735bbeba_bit_cg error0_sts_bit_cg[1]; + sha512_acc_csr__error_intr_t_error0_sts_5ee134bf_error1_sts_aad9583f_error2_sts_6cad4575_error3_sts_735bbeba_bit_cg error1_sts_bit_cg[1]; + sha512_acc_csr__error_intr_t_error0_sts_5ee134bf_error1_sts_aad9583f_error2_sts_6cad4575_error3_sts_735bbeba_bit_cg error2_sts_bit_cg[1]; + sha512_acc_csr__error_intr_t_error0_sts_5ee134bf_error1_sts_aad9583f_error2_sts_6cad4575_error3_sts_735bbeba_bit_cg error3_sts_bit_cg[1]; + sha512_acc_csr__error_intr_t_error0_sts_5ee134bf_error1_sts_aad9583f_error2_sts_6cad4575_error3_sts_735bbeba_fld_cg fld_cg; rand uvm_reg_field error0_sts; rand uvm_reg_field error1_sts; rand uvm_reg_field error2_sts; rand uvm_reg_field error3_sts; function new(string name = "sha512_acc_csr__error_intr_t_error0_sts_5ee134bf_error1_sts_aad9583f_error2_sts_6cad4575_error3_sts_735bbeba"); - super.new(name, 32, UVM_NO_COVERAGE); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); virtual function void build(); this.error0_sts = new("error0_sts"); @@ -249,33 +518,71 @@ package sha512_acc_csr_uvm; this.error2_sts.configure(this, 1, 2, "W1C", 1, 'h0, 1, 1, 0); this.error3_sts = new("error3_sts"); this.error3_sts.configure(this, 1, 3, "W1C", 1, 'h0, 1, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(error0_sts_bit_cg[bt]) error0_sts_bit_cg[bt] = new(); + foreach(error1_sts_bit_cg[bt]) error1_sts_bit_cg[bt] = new(); + foreach(error2_sts_bit_cg[bt]) error2_sts_bit_cg[bt] = new(); + foreach(error3_sts_bit_cg[bt]) error3_sts_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); endfunction : build endclass : sha512_acc_csr__error_intr_t_error0_sts_5ee134bf_error1_sts_aad9583f_error2_sts_6cad4575_error3_sts_735bbeba // Reg - sha512_acc_csr::notif_intr_t_notif_cmd_done_sts_1c68637e class sha512_acc_csr__notif_intr_t_notif_cmd_done_sts_1c68637e extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + sha512_acc_csr__notif_intr_t_notif_cmd_done_sts_1c68637e_bit_cg notif_cmd_done_sts_bit_cg[1]; + sha512_acc_csr__notif_intr_t_notif_cmd_done_sts_1c68637e_fld_cg fld_cg; rand uvm_reg_field notif_cmd_done_sts; function new(string name = "sha512_acc_csr__notif_intr_t_notif_cmd_done_sts_1c68637e"); - super.new(name, 32, UVM_NO_COVERAGE); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); virtual function void build(); this.notif_cmd_done_sts = new("notif_cmd_done_sts"); this.notif_cmd_done_sts.configure(this, 1, 0, "W1C", 1, 'h0, 1, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(notif_cmd_done_sts_bit_cg[bt]) notif_cmd_done_sts_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); endfunction : build endclass : sha512_acc_csr__notif_intr_t_notif_cmd_done_sts_1c68637e // Reg - sha512_acc_csr::error_intr_trig_t class sha512_acc_csr__error_intr_trig_t extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + sha512_acc_csr__error_intr_trig_t_bit_cg error0_trig_bit_cg[1]; + sha512_acc_csr__error_intr_trig_t_bit_cg error1_trig_bit_cg[1]; + sha512_acc_csr__error_intr_trig_t_bit_cg error2_trig_bit_cg[1]; + sha512_acc_csr__error_intr_trig_t_bit_cg error3_trig_bit_cg[1]; + sha512_acc_csr__error_intr_trig_t_fld_cg fld_cg; rand uvm_reg_field error0_trig; rand uvm_reg_field error1_trig; rand uvm_reg_field error2_trig; rand uvm_reg_field error3_trig; function new(string name = "sha512_acc_csr__error_intr_trig_t"); - super.new(name, 32, UVM_NO_COVERAGE); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); virtual function void build(); this.error0_trig = new("error0_trig"); @@ -286,160 +593,344 @@ package sha512_acc_csr_uvm; this.error2_trig.configure(this, 1, 2, "W1S", 0, 'h0, 1, 1, 0); this.error3_trig = new("error3_trig"); this.error3_trig.configure(this, 1, 3, "W1S", 0, 'h0, 1, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(error0_trig_bit_cg[bt]) error0_trig_bit_cg[bt] = new(); + foreach(error1_trig_bit_cg[bt]) error1_trig_bit_cg[bt] = new(); + foreach(error2_trig_bit_cg[bt]) error2_trig_bit_cg[bt] = new(); + foreach(error3_trig_bit_cg[bt]) error3_trig_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); endfunction : build endclass : sha512_acc_csr__error_intr_trig_t // Reg - sha512_acc_csr::notif_intr_trig_t class sha512_acc_csr__notif_intr_trig_t extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + sha512_acc_csr__notif_intr_trig_t_bit_cg notif_cmd_done_trig_bit_cg[1]; + sha512_acc_csr__notif_intr_trig_t_fld_cg fld_cg; rand uvm_reg_field notif_cmd_done_trig; function new(string name = "sha512_acc_csr__notif_intr_trig_t"); - super.new(name, 32, UVM_NO_COVERAGE); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); virtual function void build(); this.notif_cmd_done_trig = new("notif_cmd_done_trig"); this.notif_cmd_done_trig.configure(this, 1, 0, "W1S", 0, 'h0, 1, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(notif_cmd_done_trig_bit_cg[bt]) notif_cmd_done_trig_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); endfunction : build endclass : sha512_acc_csr__notif_intr_trig_t // Reg - sha512_acc_csr::intr_count_t_cnt_130ab269 class sha512_acc_csr__intr_count_t_cnt_130ab269 extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + sha512_acc_csr__intr_count_t_cnt_130ab269_bit_cg cnt_bit_cg[32]; + sha512_acc_csr__intr_count_t_cnt_130ab269_fld_cg fld_cg; rand uvm_reg_field cnt; function new(string name = "sha512_acc_csr__intr_count_t_cnt_130ab269"); - super.new(name, 32, UVM_NO_COVERAGE); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); virtual function void build(); this.cnt = new("cnt"); this.cnt.configure(this, 32, 0, "RW", 1, 'h0, 1, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(cnt_bit_cg[bt]) cnt_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); endfunction : build endclass : sha512_acc_csr__intr_count_t_cnt_130ab269 // Reg - sha512_acc_csr::intr_count_t_cnt_324dfc53 class sha512_acc_csr__intr_count_t_cnt_324dfc53 extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + sha512_acc_csr__intr_count_t_cnt_324dfc53_bit_cg cnt_bit_cg[32]; + sha512_acc_csr__intr_count_t_cnt_324dfc53_fld_cg fld_cg; rand uvm_reg_field cnt; function new(string name = "sha512_acc_csr__intr_count_t_cnt_324dfc53"); - super.new(name, 32, UVM_NO_COVERAGE); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); virtual function void build(); this.cnt = new("cnt"); this.cnt.configure(this, 32, 0, "RW", 1, 'h0, 1, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(cnt_bit_cg[bt]) cnt_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); endfunction : build endclass : sha512_acc_csr__intr_count_t_cnt_324dfc53 // Reg - sha512_acc_csr::intr_count_t_cnt_791a4799 class sha512_acc_csr__intr_count_t_cnt_791a4799 extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + sha512_acc_csr__intr_count_t_cnt_791a4799_bit_cg cnt_bit_cg[32]; + sha512_acc_csr__intr_count_t_cnt_791a4799_fld_cg fld_cg; rand uvm_reg_field cnt; function new(string name = "sha512_acc_csr__intr_count_t_cnt_791a4799"); - super.new(name, 32, UVM_NO_COVERAGE); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); virtual function void build(); this.cnt = new("cnt"); this.cnt.configure(this, 32, 0, "RW", 1, 'h0, 1, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(cnt_bit_cg[bt]) cnt_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); endfunction : build endclass : sha512_acc_csr__intr_count_t_cnt_791a4799 // Reg - sha512_acc_csr::intr_count_t_cnt_e9de7334 class sha512_acc_csr__intr_count_t_cnt_e9de7334 extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + sha512_acc_csr__intr_count_t_cnt_e9de7334_bit_cg cnt_bit_cg[32]; + sha512_acc_csr__intr_count_t_cnt_e9de7334_fld_cg fld_cg; rand uvm_reg_field cnt; function new(string name = "sha512_acc_csr__intr_count_t_cnt_e9de7334"); - super.new(name, 32, UVM_NO_COVERAGE); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); virtual function void build(); this.cnt = new("cnt"); this.cnt.configure(this, 32, 0, "RW", 1, 'h0, 1, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(cnt_bit_cg[bt]) cnt_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); endfunction : build endclass : sha512_acc_csr__intr_count_t_cnt_e9de7334 // Reg - sha512_acc_csr::intr_count_t_cnt_be67d6d5 class sha512_acc_csr__intr_count_t_cnt_be67d6d5 extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + sha512_acc_csr__intr_count_t_cnt_be67d6d5_bit_cg cnt_bit_cg[32]; + sha512_acc_csr__intr_count_t_cnt_be67d6d5_fld_cg fld_cg; rand uvm_reg_field cnt; function new(string name = "sha512_acc_csr__intr_count_t_cnt_be67d6d5"); - super.new(name, 32, UVM_NO_COVERAGE); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); virtual function void build(); this.cnt = new("cnt"); this.cnt.configure(this, 32, 0, "RW", 1, 'h0, 1, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(cnt_bit_cg[bt]) cnt_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); endfunction : build endclass : sha512_acc_csr__intr_count_t_cnt_be67d6d5 // Reg - sha512_acc_csr::intr_count_incr_t_pulse_37026c97 class sha512_acc_csr__intr_count_incr_t_pulse_37026c97 extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + sha512_acc_csr__intr_count_incr_t_pulse_37026c97_bit_cg pulse_bit_cg[1]; + sha512_acc_csr__intr_count_incr_t_pulse_37026c97_fld_cg fld_cg; rand uvm_reg_field pulse; function new(string name = "sha512_acc_csr__intr_count_incr_t_pulse_37026c97"); - super.new(name, 32, UVM_NO_COVERAGE); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); virtual function void build(); this.pulse = new("pulse"); this.pulse.configure(this, 1, 0, "RO", 1, 'h0, 1, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(pulse_bit_cg[bt]) pulse_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); endfunction : build endclass : sha512_acc_csr__intr_count_incr_t_pulse_37026c97 // Reg - sha512_acc_csr::intr_count_incr_t_pulse_d860d977 class sha512_acc_csr__intr_count_incr_t_pulse_d860d977 extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + sha512_acc_csr__intr_count_incr_t_pulse_d860d977_bit_cg pulse_bit_cg[1]; + sha512_acc_csr__intr_count_incr_t_pulse_d860d977_fld_cg fld_cg; rand uvm_reg_field pulse; function new(string name = "sha512_acc_csr__intr_count_incr_t_pulse_d860d977"); - super.new(name, 32, UVM_NO_COVERAGE); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); virtual function void build(); this.pulse = new("pulse"); this.pulse.configure(this, 1, 0, "RO", 1, 'h0, 1, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(pulse_bit_cg[bt]) pulse_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); endfunction : build endclass : sha512_acc_csr__intr_count_incr_t_pulse_d860d977 // Reg - sha512_acc_csr::intr_count_incr_t_pulse_87b45fe7 class sha512_acc_csr__intr_count_incr_t_pulse_87b45fe7 extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + sha512_acc_csr__intr_count_incr_t_pulse_87b45fe7_bit_cg pulse_bit_cg[1]; + sha512_acc_csr__intr_count_incr_t_pulse_87b45fe7_fld_cg fld_cg; rand uvm_reg_field pulse; function new(string name = "sha512_acc_csr__intr_count_incr_t_pulse_87b45fe7"); - super.new(name, 32, UVM_NO_COVERAGE); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); virtual function void build(); this.pulse = new("pulse"); this.pulse.configure(this, 1, 0, "RO", 1, 'h0, 1, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(pulse_bit_cg[bt]) pulse_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); endfunction : build endclass : sha512_acc_csr__intr_count_incr_t_pulse_87b45fe7 // Reg - sha512_acc_csr::intr_count_incr_t_pulse_c1689ee6 class sha512_acc_csr__intr_count_incr_t_pulse_c1689ee6 extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + sha512_acc_csr__intr_count_incr_t_pulse_c1689ee6_bit_cg pulse_bit_cg[1]; + sha512_acc_csr__intr_count_incr_t_pulse_c1689ee6_fld_cg fld_cg; rand uvm_reg_field pulse; function new(string name = "sha512_acc_csr__intr_count_incr_t_pulse_c1689ee6"); - super.new(name, 32, UVM_NO_COVERAGE); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); virtual function void build(); this.pulse = new("pulse"); this.pulse.configure(this, 1, 0, "RO", 1, 'h0, 1, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(pulse_bit_cg[bt]) pulse_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); endfunction : build endclass : sha512_acc_csr__intr_count_incr_t_pulse_c1689ee6 // Reg - sha512_acc_csr::intr_count_incr_t_pulse_6173128e class sha512_acc_csr__intr_count_incr_t_pulse_6173128e extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + sha512_acc_csr__intr_count_incr_t_pulse_6173128e_bit_cg pulse_bit_cg[1]; + sha512_acc_csr__intr_count_incr_t_pulse_6173128e_fld_cg fld_cg; rand uvm_reg_field pulse; function new(string name = "sha512_acc_csr__intr_count_incr_t_pulse_6173128e"); - super.new(name, 32, UVM_NO_COVERAGE); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); virtual function void build(); this.pulse = new("pulse"); this.pulse.configure(this, 1, 0, "RO", 1, 'h0, 1, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(pulse_bit_cg[bt]) pulse_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); endfunction : build endclass : sha512_acc_csr__intr_count_incr_t_pulse_6173128e @@ -648,4 +1139,5 @@ package sha512_acc_csr_uvm; endfunction : build endclass : sha512_acc_csr + `include "sha512_acc_csr_sample.svh" endpackage: sha512_acc_csr_uvm diff --git a/src/soc_ifc/rtl/sha512_acc_external_csr.rdl b/src/soc_ifc/rtl/sha512_acc_external_csr.rdl index 5a80b3757..4f273224a 100644 --- a/src/soc_ifc/rtl/sha512_acc_external_csr.rdl +++ b/src/soc_ifc/rtl/sha512_acc_external_csr.rdl @@ -19,7 +19,7 @@ reg { desc="SHA lock register for SHA access, reading 0 will set the lock, Write 1 to clear the lock [br]Caliptra Access: RW [br]SOC Access: RW"; - field {rset; woclr; sw=rw; hw=r; swwe=valid_user; swmod=true;} LOCK=0; + field {rset; woclr; sw=rw; hw=r; swwe=valid_user; swmod=true;} LOCK=1; } LOCK; reg { @@ -95,7 +95,7 @@ reg { For the Mailbox SHA Function, indicates that the SHA can begin execution. [br]Caliptra Access: RW [br]SOC Access: RW"; - field {sw=rw; hw=r; hwclr;} EXECUTE=0; + field {sw=rw; hw=r; hwclr; swwe=valid_user;} EXECUTE=0; } EXECUTE; reg { @@ -108,6 +108,8 @@ reg { default hw = rw; default resetsignal = cptra_rst_b; field {desc = "Valid bit, indicating that the digest is complete";} VALID = 1'b0; + field {name = "SoC Acquired the Lock"; + desc = "Indicates that the current lock was acquired by the SoC";} SOC_HAS_LOCK=1'b0; } STATUS; diff --git a/src/soc_ifc/rtl/sha512_acc_top.sv b/src/soc_ifc/rtl/sha512_acc_top.sv index fd8032c62..79b52410a 100644 --- a/src/soc_ifc/rtl/sha512_acc_top.sv +++ b/src/soc_ifc/rtl/sha512_acc_top.sv @@ -14,7 +14,8 @@ module sha512_acc_top import soc_ifc_pkg::*; - import sha512_acc_csr_pkg::*; + import sha512_acc_csr_pkg::*; + import sha512_params_pkg::*; #( parameter DATA_WIDTH = 32 )( @@ -44,22 +45,12 @@ module sha512_acc_top //---------------------------------------------------------------- // Internal constant and parameter definitions. //---------------------------------------------------------------- - `include "sha512_param.sv" localparam DATA_NUM_BYTES = DATA_WIDTH / 8; localparam BLOCK_NO = 1024 / DATA_WIDTH; localparam BYTE_NO = 1024 / 8; localparam BLOCK_OFFSET_W = $clog2(BLOCK_NO); localparam BYTE_OFFSET_W = $clog2(1024/8); - typedef enum logic [2:0] { - SHA_IDLE = 3'b000, - SHA_BLOCK_0 = 3'b001, - SHA_BLOCK_N = 3'b011, - SHA_PAD0 = 3'b010, - SHA_PAD1 = 3'b110, - SHA_DONE = 3'b100 - } sha_fsm_state_e; - logic lock_set; logic datain_write; logic stall_write; @@ -102,7 +93,6 @@ module sha512_acc_top logic block_we; logic mbox_mode_last_dword_wr; logic block_full; - logic pad_last_block; logic [31:0] num_bytes_wr; logic [BLOCK_OFFSET_W:0] block_wptr; logic [DATA_NUM_BYTES-1:0][7:0] mbox_rdata; @@ -189,17 +179,17 @@ always_comb core_digest_valid_q = core_digest_valid & ~(init_reg | next_reg); always_comb hwif_in.valid_user = hwif_out.LOCK.LOCK.value & ((~soc_has_lock & ~req_data.soc_req) | (soc_has_lock & req_data.soc_req & (req_data.user == hwif_out.USER.USER.value))); always_comb hwif_in.soc_req = req_data.soc_req; - + always_comb hwif_in.STATUS.SOC_HAS_LOCK.next = soc_has_lock; + always_comb mode = hwif_out.MODE.MODE.value; //mode encoding bit 0 determines 512 or 384. always_comb sha_mode = mode[0] ? MODE_SHA_512 : MODE_SHA_384; - always_comb streaming_mode = ~mode[1]; - always_comb mailbox_mode = mode[1]; + //determine streaming or mailbox mode - SoC is limited to streaming mode only + always_comb streaming_mode = ~mode[1] | soc_has_lock; + always_comb mailbox_mode = mode[1] & ~soc_has_lock; //Detect writes to datain register always_comb datain_write = hwif_in.valid_user & hwif_out.DATAIN.DATAIN.swmod; always_comb execute_set = hwif_out.EXECUTE.EXECUTE.value; - //flag to indicate that our last block will need the padding added to it - always_comb pad_last_block = (|hwif_out.DLEN.LENGTH.value[1:0]); //When we reach the end of a block we indicate block full //If this is also the end of the entire DLEN, mask block full so that we properly pad the last dword diff --git a/src/soc_ifc/rtl/soc_ifc_arb.sv b/src/soc_ifc/rtl/soc_ifc_arb.sv index b1d273cb8..8660009a9 100644 --- a/src/soc_ifc/rtl/soc_ifc_arb.sv +++ b/src/soc_ifc/rtl/soc_ifc_arb.sv @@ -21,6 +21,7 @@ module soc_ifc_arb input logic rst_b, input logic [4:0][APB_USER_WIDTH-1:0] valid_mbox_users, + input logic valid_fuse_user, //UC inf input logic uc_req_dv, output logic uc_req_hold, @@ -39,6 +40,7 @@ module soc_ifc_arb input logic mbox_req_hold, output soc_ifc_req_t mbox_req_data, input logic [SOC_IFC_DATA_W-1:0] mbox_rdata, + input logic [SOC_IFC_DATA_W-1:0] mbox_dir_rdata, input logic mbox_error, //SHA inf output logic sha_req_dv, @@ -135,8 +137,11 @@ always_comb uc_mbox_dir_req = (uc_req_dv & (uc_req_data.addr inside {[MBOX_DIR_S //SoC requests to mailbox always_comb soc_mbox_req = (valid_mbox_req & (soc_req_data.addr inside {[MBOX_REG_START_ADDR:MBOX_REG_END_ADDR]})); //Requests to arch/fuse register block +//Ensure that requests to fuse block match the appropriate user value always_comb uc_reg_req = (uc_req_dv & (uc_req_data.addr inside {[SOC_IFC_REG_START_ADDR:SOC_IFC_REG_END_ADDR]})); -always_comb soc_reg_req = (soc_req_dv & (soc_req_data.addr inside {[SOC_IFC_REG_START_ADDR:SOC_IFC_REG_END_ADDR]})); +always_comb soc_reg_req = (soc_req_dv & (soc_req_data.addr inside {[SOC_IFC_REG_START_ADDR:SOC_IFC_REG_END_ADDR]}) & + (~(soc_req_data.addr inside {[SOC_IFC_FUSE_START_ADDR:SOC_IFC_FUSE_END_ADDR]}) | valid_fuse_user)); + //Requests to SHA always_comb uc_sha_req = (uc_req_dv & (uc_req_data.addr inside {[SHA_REG_START_ADDR:SHA_REG_END_ADDR]})); always_comb soc_sha_req = (soc_req_dv & (soc_req_data.addr inside {[SHA_REG_START_ADDR:SHA_REG_END_ADDR]})); @@ -153,19 +158,21 @@ always_comb begin end //check for collisions -always_comb req_collision = (uc_mbox_req & soc_mbox_req) | - (uc_reg_req & soc_reg_req) | - (uc_sha_req & soc_sha_req); +//don't toggle priority if the request was held +always_comb req_collision = (uc_mbox_req & soc_mbox_req & ~mbox_req_hold) | + (uc_reg_req & soc_reg_req & ~soc_ifc_reg_req_hold) | + (uc_sha_req & soc_sha_req & ~sha_req_hold); //drive the dv to the appropriate destination if either client is trying to always_comb mbox_req_dv = uc_mbox_reg_req | soc_mbox_req; -always_comb mbox_dir_req_dv = uc_mbox_dir_req; +always_comb mbox_dir_req_dv = uc_mbox_dir_req & uc_mbox_gnt; always_comb soc_ifc_reg_req_dv = uc_reg_req | soc_reg_req; always_comb sha_req_dv = uc_sha_req | soc_sha_req; //determine which requests get granted //if a request is colliding with another, grant the one with priority //ignore priority if one of the requests was already in progress +//this prevents the "priority" request from interrupting an in progress request always_comb soc_mbox_gnt = soc_mbox_req & (~uc_mbox_req | soc_has_priority) & ~uc_mbox_req_ip; always_comb soc_reg_gnt = soc_reg_req & (~uc_reg_req | soc_has_priority) & ~uc_reg_req_ip; always_comb soc_sha_gnt = soc_sha_req & (~uc_sha_req | soc_has_priority) & ~uc_sha_req_ip; @@ -186,7 +193,8 @@ always_comb sha_req_data = ({$bits(soc_ifc_req_t){soc_sha_gnt}} & soc_req_data) //drive the appropriate read data back to uc or soc //AND/OR mux here, assert that requests are always mutex -always_comb uc_rdata = ({MBOX_DATA_W{uc_mbox_req}} & mbox_rdata) | +always_comb uc_rdata = ({MBOX_DATA_W{uc_mbox_reg_req}} & mbox_rdata) | + ({MBOX_DATA_W{uc_mbox_dir_req}} & mbox_dir_rdata) | ({MBOX_DATA_W{uc_reg_req}} & soc_ifc_reg_rdata) | ({MBOX_DATA_W{uc_sha_req}} & sha_rdata); diff --git a/src/soc_ifc/rtl/soc_ifc_boot_fsm.sv b/src/soc_ifc/rtl/soc_ifc_boot_fsm.sv index c869a1988..e5b522184 100644 --- a/src/soc_ifc/rtl/soc_ifc_boot_fsm.sv +++ b/src/soc_ifc/rtl/soc_ifc_boot_fsm.sv @@ -19,6 +19,7 @@ module soc_ifc_boot_fsm input logic clk, input logic cptra_pwrgood, input logic cptra_rst_b, + input logic scan_mode, input logic fw_update_rst, input logic [7:0] fw_update_rst_wait_cycles, @@ -27,6 +28,7 @@ module soc_ifc_boot_fsm input logic BootFSM_Continue, output logic ready_for_fuses, + output boot_fsm_state_e boot_fsm_ps, input logic fuse_done, input logic fuse_wr_done_observed, @@ -34,25 +36,31 @@ module soc_ifc_boot_fsm output logic cptra_noncore_rst_b, //Global rst that goes to all other blocks output logic cptra_uc_rst_b, //Global + fw update rst that goes to VeeR core only, output logic iccm_unlock, - output logic fw_upd_rst_executed + output logic fw_upd_rst_executed, + output logic rdc_clk_dis, + output logic fw_update_rst_window ); `include "caliptra_sva.svh" +logic cptra_uc_rst_b_nq; +logic cptra_noncore_rst_b_nq; + //present and next state boot_fsm_state_e boot_fsm_ns; -boot_fsm_state_e boot_fsm_ps; //arcs between states - global rst +logic arc_BOOT_IDLE_BOOT_FUSE; logic arc_BOOT_FUSE_BOOT_DONE; logic arc_BOOT_FUSE_BOOT_WAIT; logic arc_BOOT_DONE_BOOT_IDLE; //arcs for fw update rst logic arc_BOOT_DONE_BOOT_FWRST; +logic arc_BOOT_FWRST_BOOT_WAIT; logic arc_BOOT_WAIT_BOOT_DONE; +logic arc_IDLE; //reset generation -logic propagate_reset_en; -logic propagate_uc_reset_en; logic fsm_synch_noncore_rst_b; +logic synch_noncore_rst_b; logic fsm_synch_uc_rst_b; logic synch_uc_rst_b; @@ -61,8 +69,11 @@ logic [7:0] wait_count; logic wait_count_rst; logic wait_count_decr; -//move to fuse state when SoC de-asserts reset +logic cptra_rst_window; +logic cptra_rst_window_sync, cptra_rst_window_sync_f, cptra_rst_window_sync_2f; +//move to fuse state when SoC de-asserts reset +always_comb arc_BOOT_IDLE_BOOT_FUSE = (boot_fsm_ps == BOOT_IDLE) & ~cptra_rst_window_sync & ~cptra_rst_window_sync_f & ~cptra_rst_window_sync_2f; //move from fuse state to done when fuse done register is set OR //if it was already set (since its locked across warm reset), that the write was observed from SOC always_comb arc_BOOT_FUSE_BOOT_DONE = fuse_done & fuse_wr_done_observed; @@ -73,59 +84,72 @@ always_comb arc_BOOT_FUSE_BOOT_WAIT = BootFSM_BrkPoint; //dummy arc for terminal state lint check always_comb arc_BOOT_DONE_BOOT_IDLE = '0; +always_comb arc_IDLE = cptra_rst_window_sync; + +//Masks combo paths from uc reset flops into other reset domains +always_comb fw_update_rst_window = boot_fsm_ps inside {BOOT_FW_RST,BOOT_WAIT}; +//clock gate all flops on warm reset to prevent RDC metastability issues +//cover 2 clocks after synchronized reset assertion (cptra_rst_window_sync) to handle bootfsm transitions +always_comb rdc_clk_dis = cptra_rst_window_sync | cptra_rst_window_sync_f | cptra_rst_window_sync_2f; + +//move to rst state when reg bit is set to 1. This state will assert fw_rst to uc +always_comb arc_BOOT_DONE_BOOT_FWRST = (boot_fsm_ps == BOOT_DONE) & fw_update_rst; +//advance to boot wait when reset starts to propagate +always_comb arc_BOOT_FWRST_BOOT_WAIT = ~synch_uc_rst_b; + +// TODO: Capture BootFSM_BrkPoint only at the point of cold or warm reset exit +// Move to BOOT_DONE state when +// a fixed time is met AND +// if the BootFSM breakpoint is asserted and the BootFSM continue is not set, stay put in WAIT state +always_comb arc_BOOT_WAIT_BOOT_DONE = (wait_count == '0) & ~(BootFSM_BrkPoint & ~BootFSM_Continue); -always_comb begin - //move to rst state when reg bit is set to 1. This state will assert fw_rst to uc - arc_BOOT_DONE_BOOT_FWRST = fw_update_rst; - - // TODO: Capture BootFSM_BrkPoint only at the point of cold or warm reset exit - // Move to BOOT_DONE state when - // a fixed time is met AND - // if the BootFSM breakpoint is asserted and the BootFSM continue is not set, stay put in WAIT state - arc_BOOT_WAIT_BOOT_DONE = (wait_count == '0) & ~(BootFSM_BrkPoint & ~BootFSM_Continue); -end always_comb begin boot_fsm_ns = boot_fsm_ps; - ready_for_fuses = '0; - propagate_reset_en = '0; - propagate_uc_reset_en = '0; - fw_upd_rst_executed = 0; + fw_upd_rst_executed = '0; + fsm_synch_noncore_rst_b = '0; + fsm_iccm_unlock = '0; + fsm_synch_uc_rst_b = '0; + wait_count_decr = 0; + wait_count_rst = 0; - unique casez (boot_fsm_ps) + unique case (boot_fsm_ps) inside BOOT_IDLE: begin - boot_fsm_ns = BOOT_FUSE; - + if (arc_BOOT_IDLE_BOOT_FUSE) begin + boot_fsm_ns = BOOT_FUSE; + end //reset flags in IDLE // NOTE: FSM is only in BOOT_IDLE when system reset is asserted, so // also assert the internal core/noncore resets fsm_synch_uc_rst_b = '0; + fsm_synch_noncore_rst_b = '0; fsm_iccm_unlock = '0; wait_count_decr = 0; wait_count_rst = 0; end BOOT_FUSE: begin if (arc_BOOT_FUSE_BOOT_DONE) begin - if (arc_BOOT_FUSE_BOOT_WAIT) begin - boot_fsm_ns = BOOT_WAIT; - end - else begin - boot_fsm_ns = BOOT_DONE; - end + if (arc_BOOT_FUSE_BOOT_WAIT) begin + boot_fsm_ns = BOOT_WAIT; + end + else begin + boot_fsm_ns = BOOT_DONE; + end end - ready_for_fuses = 1'b1; //reset flags fsm_synch_uc_rst_b = '0; + fsm_synch_noncore_rst_b = '1; fsm_iccm_unlock = '0; wait_count_decr = 0; wait_count_rst = 0; end BOOT_FW_RST: begin - boot_fsm_ns = BOOT_WAIT; + if (arc_BOOT_FWRST_BOOT_WAIT) boot_fsm_ns = BOOT_WAIT; //Assert core reset fsm_synch_uc_rst_b = '0; + fsm_synch_noncore_rst_b = '1; //Keep ICCM locked until end of fw rst fsm_iccm_unlock = '0; //Start timer @@ -143,6 +167,7 @@ always_comb begin fsm_iccm_unlock = '0; end fsm_synch_uc_rst_b = '0; + fsm_synch_noncore_rst_b = '1; wait_count_decr = 1; wait_count_rst = 0; end @@ -159,11 +184,9 @@ always_comb begin fw_upd_rst_executed = 1; end - //propagate reset de-assertion from synchronizer when boot fsm is in BOOT_DONE state - propagate_reset_en = 1'b1; - propagate_uc_reset_en = 1'b1; - //Deassert core reset + //Deassert reset fsm_synch_uc_rst_b = '1; + fsm_synch_noncore_rst_b = '1; fsm_iccm_unlock = '0; //Timer re-init wait_count_rst = 0; @@ -171,48 +194,82 @@ always_comb begin end default: begin boot_fsm_ns = boot_fsm_ps; - fsm_synch_uc_rst_b = '1; + fw_upd_rst_executed = '0; + fsm_synch_noncore_rst_b = '0; fsm_iccm_unlock = '0; + fsm_synch_uc_rst_b = '0; wait_count_decr = 0; wait_count_rst = 0; end endcase end -//uC reset generation - //next state -> present state -//reset boot fsm to idle on cptra_rst_b +//reset boot fsm to idle on cptra_pwrgood +always_ff @(posedge clk or negedge cptra_pwrgood) begin + if (~cptra_pwrgood) begin + boot_fsm_ps <= BOOT_IDLE; + synch_noncore_rst_b <= '0; + synch_uc_rst_b <= 0; + cptra_noncore_rst_b_nq <= '0; + cptra_uc_rst_b_nq <= '0; + + cptra_rst_window_sync_f <= '1; + cptra_rst_window_sync_2f <= '1; + end + else begin + boot_fsm_ps <= arc_IDLE ? BOOT_IDLE : boot_fsm_ns; + synch_noncore_rst_b <= fsm_synch_noncore_rst_b; + synch_uc_rst_b <= fsm_synch_uc_rst_b; + cptra_noncore_rst_b_nq <= synch_noncore_rst_b; + cptra_uc_rst_b_nq <= synch_noncore_rst_b && synch_uc_rst_b; //uc comes out of rst only when both global and fw rsts are deasserted (through 2FF sync) + + cptra_rst_window_sync_f <= cptra_rst_window_sync; + cptra_rst_window_sync_2f <= cptra_rst_window_sync_f; + end +end + +//protect resets during scan mode +//TODO dft override for reset? +assign cptra_noncore_rst_b = cptra_noncore_rst_b_nq | scan_mode; +assign cptra_uc_rst_b = cptra_uc_rst_b_nq | scan_mode; + +//uC reset generation always_ff @(posedge clk or negedge cptra_rst_b) begin if (~cptra_rst_b) begin - boot_fsm_ps <= BOOT_IDLE; - fsm_synch_noncore_rst_b <= '0; - cptra_noncore_rst_b <= '0; - cptra_uc_rst_b <= '0; + cptra_rst_window <= '1; + end + else begin + cptra_rst_window <= 0; + end +end + +// Ready for fuses output signal +always_ff @(posedge clk or negedge cptra_noncore_rst_b) begin + if (~cptra_noncore_rst_b) begin + ready_for_fuses <= 1'b0; wait_count <= '0; - synch_uc_rst_b <= 0; iccm_unlock <= 0; end else begin - boot_fsm_ps <= boot_fsm_ns; - fsm_synch_noncore_rst_b <= propagate_reset_en ? '1 : fsm_synch_noncore_rst_b; - synch_uc_rst_b <= propagate_uc_reset_en ? '1 : fsm_synch_uc_rst_b; - cptra_noncore_rst_b <= fsm_synch_noncore_rst_b; - cptra_uc_rst_b <= fsm_synch_noncore_rst_b && fsm_synch_uc_rst_b && synch_uc_rst_b; //uc comes out of rst only when both global and fw rsts are deasserted (through 2FF sync) - - wait_count <= (wait_count_decr && (wait_count != '0)) ? wait_count - 1 - : wait_count_rst ? fw_update_rst_wait_cycles - : wait_count ; + ready_for_fuses <= (boot_fsm_ps == BOOT_FUSE) && !fuse_wr_done_observed; + wait_count <= (wait_count_decr && (wait_count != '0)) ? wait_count - 1 : + wait_count_rst ? fw_update_rst_wait_cycles : + wait_count ; iccm_unlock <= fsm_iccm_unlock; end end +caliptra_2ff_sync #(.WIDTH(1), .RST_VAL('d1)) i_rst_window_sync (.clk(clk), .rst_b(cptra_pwrgood), .din(cptra_rst_window), .dout(cptra_rst_window_sync)); + +//Check for x prop `CALIPTRA_ASSERT_KNOWN(ERR_FSM_ARC_X, {arc_BOOT_FUSE_BOOT_DONE, arc_BOOT_DONE_BOOT_FWRST, arc_BOOT_WAIT_BOOT_DONE}, clk, cptra_rst_b) `CALIPTRA_ASSERT_KNOWN(ERR_FSM_STATE_X, boot_fsm_ps, clk, cptra_rst_b) `CALIPTRA_ASSERT_KNOWN(ERR_UC_RST_X, cptra_noncore_rst_b, clk, cptra_rst_b) `CALIPTRA_ASSERT_KNOWN(ERR_UC_FWRST_X, cptra_uc_rst_b, clk, cptra_rst_b) -`CALIPTRA_ASSERT_NEVER(ERR_UC_RST_ASSERT_AND_BOOT_NOT_DONE, cptra_noncore_rst_b && ((boot_fsm_ps == BOOT_IDLE) || (boot_fsm_ps == BOOT_FUSE)), clk, cptra_rst_b) -`CALIPTRA_ASSERT(ERR_UC_RST_ASSERT_AND_BOOT_NOT_DONE2, ~cptra_noncore_rst_b || (boot_fsm_ps == BOOT_DONE) || (boot_fsm_ps == BOOT_FW_RST) || (boot_fsm_ps == BOOT_WAIT), clk, cptra_rst_b) -`CALIPTRA_ASSERT_NEVER(ERR_UC_FWRST_ASSERT_AND_BOOT_NOT_DONE, cptra_uc_rst_b && (boot_fsm_ps == BOOT_WAIT), clk, cptra_rst_b) + +//Reset got asserted, but cptra rst window wasn't asserted to protect RDC +`CALIPTRA_ASSERT_NEVER(ERR_RST_ASSERT_NO_WINDOW, $fell(cptra_noncore_rst_b) && ~rdc_clk_dis, clk, cptra_pwrgood) +`CALIPTRA_ASSERT_NEVER(ERR_UC_RST_ASSERT_NO_WINDOW, $fell(cptra_uc_rst_b) && ~(fw_update_rst_window || rdc_clk_dis), clk, cptra_pwrgood) endmodule diff --git a/src/soc_ifc/rtl/soc_ifc_external_reg.rdl b/src/soc_ifc/rtl/soc_ifc_external_reg.rdl index 4e6e12a98..bd3aa0ac3 100644 --- a/src/soc_ifc/rtl/soc_ifc_external_reg.rdl +++ b/src/soc_ifc/rtl/soc_ifc_external_reg.rdl @@ -17,16 +17,20 @@ reg { name = "Hardware Error Fatal"; desc = "Indicates fatal hardware error. - [br]Caliptra Access: RW - [br]SOC Access: RW"; - rw_rw_sticky_hw error_code[32]=0; + [br]Caliptra Access: RW1C + [br]SOC Access: RW1C"; + rw_rw_sticky_hw iccm_ecc_unc=0; /* Uncorrectable double-bit error in ICCM */ + rw_rw_sticky_hw dccm_ecc_unc=0; /* Uncorrectable double-bit error in DCCM */ + rw_rw_sticky_hw nmi_pin=0; /* Non-Maskable Interrupt due to WDT timeout */ } CPTRA_HW_ERROR_FATAL; reg { name = "Hardware Error Non-Fatal"; desc = "Indicates non-fatal hardware error. - [br]Caliptra Access: RW - [br]SOC Access: RW"; - rw_rw_sticky_hw error_code[32]=0; + [br]Caliptra Access: RW1C + [br]SOC Access: RW1C"; + rw_rw_sticky_hw mbox_prot_no_lock=0; /* SOC access while not locked */ + rw_rw_sticky_hw mbox_prot_ooo=0; /* Register access out-of-order */ + rw_rw_sticky_hw mbox_ecc_unc=0; /* Uncorrectable double-bit error in DCCM */ } CPTRA_HW_ERROR_NON_FATAL; reg { name = "Firmware Error Fatal"; @@ -78,13 +82,14 @@ reg { desc = "Reports the status of the firmware flows. [br]Caliptra Access: RW [br]SOC Access: RO"; - rw_ro status[28]=0; - //TRNG request bit - field {desc="Indicates Caliptra is ready for Firmware Download"; sw=rw; swwel = soc_req; hw=r ; resetsignal = cptra_rst_b;} ready_for_fw[1]=0; - field {desc="Indicates Caliptra is ready for Runtime Firmware Download"; sw=rw; swwel = soc_req; hw=r ; resetsignal = cptra_rst_b;} ready_for_runtime[1]=0; - field {desc="Indicates Caliptra is ready for Fuses to be programmed. - Read-only to both Caliptra and SOC."; sw=r; hw=rw; resetsignal = cptra_rst_b;} ready_for_fuses[1]; - field {desc="Indicates Caliptra is has completed Mailbox Flow."; sw=rw; swwel = soc_req; hw=r ; resetsignal = cptra_rst_b;} mailbox_flow_done[1]=0; + rw_ro status[24]=0; + field {desc="DEV ID CSR ready"; sw=rw; swwel = soc_req; hw=r ; resetsignal = cptra_rst_b;} idevid_csr_ready[1]=0; + field {desc="Boot FSM State"; sw=r; hw=w ; /* no storage, no reset */} boot_fsm_ps[3]; + field {desc="Indicates Caliptra is ready for Firmware Download"; sw=rw; swwel = soc_req; hw=r ; resetsignal = cptra_rst_b;} ready_for_fw[1]=0; + field {desc="Indicates Caliptra is ready for RT flows"; sw=rw; swwel = soc_req; hw=r ; resetsignal = cptra_rst_b;} ready_for_runtime[1]=0; + field {desc="Indicates Caliptra is ready for Fuses to be programmed. + Read-only to both Caliptra and SOC."; sw=r; hw=w ; /* no storage, no reset */} ready_for_fuses[1]; + field {desc="Indicates Caliptra is has completed Mailbox Flow."; sw=rw; swwel = soc_req; hw=r ; resetsignal = cptra_rst_b;} mailbox_flow_done[1]=0; } CPTRA_FLOW_STATUS; reg { name = "Reset Reason"; @@ -167,9 +172,17 @@ reg { desc = "Storage for the requested TRNG Data. [br]Caliptra Access: RO [br]SOC Access: RW"; - field {sw=rw; hw=na; swwe; swacc; resetsignal=cptra_rst_b;} DATA[32]=0; + field {sw=rw; hw=na; swwe; swacc; hwclr; resetsignal=cptra_rst_b;} DATA[32]=0; } CPTRA_TRNG_DATA[12]; + reg { + name = "TRNG Ctrl"; + desc = "TRNG Control register to clear data registers"; + field {desc = "Indicates that TRNG Data can be cleared + [br]Caliptra Access: RW + [br]SOC Access: RO"; sw=rw; hw=r; singlepulse; swwel=soc_req; resetsignal=cptra_rst_b;} clear=0; +} CPTRA_TRNG_CTRL; + reg { name = "TRNG Status"; desc = "TRNG Status register to indicate request and done"; @@ -244,9 +257,11 @@ reg { reg { name = "Caliptra HW RevID"; desc = "Caliptra HW revision ID that matches the official final release milestone + SoC stepping ID is repopulated with the value in the fuse register on every warm reset [br]Caliptra Access: RO [br]SOC Access: RO"; - field {sw=r; hw=r; resetsignal = cptra_rst_b;} REV_ID[32]=1; + field {sw=r; resetsignal = cptra_rst_b;} CPTRA_GENERATION[16]=1; + field {sw=r; hw=w; resetsignal = cptra_rst_b;} SOC_STEPPING_ID[16]=0; } CPTRA_HW_REV_ID; reg { name = "Caliptra FW RevID"; @@ -322,8 +337,55 @@ reg { reg { name = "Caliptra WDT STATUS register"; desc = "Caliptra watchdog timer status register - [br]Caliptra Access: RO + [br]Caliptra Access: RW [br]SOC Access: RO"; field {desc = "Timer1 timed out, timer2 enabled"; hw = rw; sw = rw; swwel = soc_req; resetsignal = cptra_rst_b;} t1_timeout = 1'b0; field {desc = "Timer2 timed out"; hw = rw; sw = rw; swwel = soc_req; resetsignal = cptra_rst_b;} t2_timeout = 1'b0; -} CPTRA_WDT_STATUS; \ No newline at end of file +} CPTRA_WDT_STATUS; + +reg { + name = "Valid User for FUSE"; + desc = "Valid PAUSER attributes for FUSE on SoC APB Interface. Only valid once LOCK is set. + [br]Caliptra Access: RW + [br]SOC Access: RW + [br]Read-Only once locked by FUSE_PAUSER_LOCK."; + field {sw=rw; hw=r; swwel; resetsignal = cptra_pwrgood;} PAUSER[32]=0xFFFF_FFFF; + } CPTRA_FUSE_VALID_PAUSER; + +reg { + name = "Valid User for FUSE PAUSER Lock"; + desc = "Valid PAUSER attributes for requests from SoC APB Interface. + [br]Each bit corresponds to locking the associated FUSE_VALID_PAUSER register. + [br]Associated FUSE_VALID_PAUSER register is only valid once locked by this bit. + [br]Caliptra FW RW access for survivability but cannot unlock once locked + [br]Caliptra Access: RW + [br]SOC Access: RW + [br]Read-Only once locked."; + field {sw=rw; hw=r; swwel; resetsignal=cptra_pwrgood;} LOCK=0; + } CPTRA_FUSE_PAUSER_LOCK; + +reg { + name = "Caliptra WDT1 Config"; + desc = "SOC provided count in cycles for WDT1 timeout."; + field {sw=rw; hw=na; resetsignal = cptra_pwrgood;} TIMEOUT[32]=0; + } CPTRA_WDT_CFG[2]; + +reg { + name = "Caliptra iTRNG Entropy Configuration 0"; + desc = "Adaptive threshold values for entropy source health tests."; + field {sw=rw; resetsignal=cptra_rst_b;} low_threshold[16]=0; + field {sw=rw; resetsignal=cptra_rst_b;} high_threshold[16]=0; + } CPTRA_iTRNG_ENTROPY_CONFIG_0; + +reg { + name = "Caliptra iTRNG Entropy Configuration 1"; + desc = "Repetition count value for entropy source health tests."; + field {sw=rw; resetsignal=cptra_rst_b;} repetition_count[16]=0; + field {sw=rw; resetsignal=cptra_rst_b;} RSVD[16]=0; + } CPTRA_iTRNG_ENTROPY_CONFIG_1; + +reg { + name = "Caliptra Reserved Registers"; + desc = "Set of reserved registers for survivability"; + field {sw=rw; resetsignal=cptra_rst_b;} RSVD[32]=0; + } CPTRA_RSVD_REG[2]; \ No newline at end of file diff --git a/src/soc_ifc/rtl/soc_ifc_fuse_reg.rdl b/src/soc_ifc/rtl/soc_ifc_fuse_reg.rdl index f9f84ef3c..3ab2cf632 100644 --- a/src/soc_ifc/rtl/soc_ifc_fuse_reg.rdl +++ b/src/soc_ifc/rtl/soc_ifc_fuse_reg.rdl @@ -88,3 +88,22 @@ reg { [br]SOC Access: RWL-S"; Fuse life_cycle[2]=0; } fuse_life_cycle; +reg { + desc = "0 - Verify Caliptra firmware images with ECDSA-only; 1 - Verify Caliptra firmware images with both ECDSA and LMS + [br]Caliptra Access: RO + [br]SOC Access: RWL-S"; + Fuse lms_verify[1]=0; +} fuse_lms_verify; +reg { + desc = "Bits for revoking LMS public keys in the key manifest + [br]Caliptra Access: RO + [br]SOC Access: RWL-S"; + Fuse lms_revocation[32]=0; +} fuse_lms_revocation; +reg { + desc = "SOC stepping ID + [br]Caliptra Access: RO + [br]SOC Access: RWL-S"; + Fuse soc_stepping_id[16]=0; +} fuse_soc_stepping_id; + diff --git a/src/soc_ifc/rtl/soc_ifc_internal_reg.rdl b/src/soc_ifc/rtl/soc_ifc_internal_reg.rdl index e067d86f6..47d8b1c75 100644 --- a/src/soc_ifc/rtl/soc_ifc_internal_reg.rdl +++ b/src/soc_ifc/rtl/soc_ifc_internal_reg.rdl @@ -65,6 +65,93 @@ reg { field {desc = "NMI Vector"; hw = r; sw = rw; swwel = soc_req; resetsignal = cptra_rst_b;} vec[32] = 32'h0; } internal_nmi_vector; +reg { + name = "Hardware Error Fatal Mask"; + desc = "Bit mask for the register CPTRA_HW_ERROR_FATAL to determine + which bits are disabled for interrupt generation on the + cptra_error_fatal output signal. + A value of 1 in a field of this register means the corresponding bit + position in CPTRA_HW_ERROR_FATAL will not produce an interrupt + output assertion. + [br]Caliptra Access: RW + [br]SOC Access: RO"; + rw_ro_hw mask_iccm_ecc_unc=0; /* Uncorrectable double-bit error in ICCM */ + rw_ro_hw mask_dccm_ecc_unc=0; /* Uncorrectable double-bit error in DCCM */ + rw_ro_hw mask_nmi_pin=0; /* Non-Maskable Interrupt due to WDT timeout */ +} internal_hw_error_fatal_mask; +reg { + name = "Hardware Error Non-Fatal Mask"; + desc = "Bit mask for the register CPTRA_HW_ERROR_NON_FATAL to determine + which bits are disabled for interrupt generation on the + cptra_error_non_fatal output signal. + A value of 1 in a field of this register means the corresponding bit + position in CPTRA_HW_ERROR_NON_FATAL will not produce an interrupt + output assertion. + [br]Caliptra Access: RW + [br]SOC Access: RO"; + rw_ro_hw mask_mbox_prot_no_lock=0; /* SOC access while not locked */ + rw_ro_hw mask_mbox_prot_ooo=0; /* Register access out-of-order */ + rw_ro_hw mask_mbox_ecc_unc=0; /* Uncorrectable double-bit error in DCCM */ +} internal_hw_error_non_fatal_mask; +reg { + name = "Firmware Error Fatal Mask"; + desc = "Bit mask for the register CPTRA_FW_ERROR_FATAL to determine + which bits are disabled for interrupt generation on the + cptra_error_fatal output signal. + A value of 1 in a field of this register means the corresponding bit + position in CPTRA_FW_ERROR_FATAL will not produce an interrupt + output assertion. + [br]Caliptra Access: RW + [br]SOC Access: RO"; + rw_ro_hw mask[32]=0; +} internal_fw_error_fatal_mask; +reg { + name = "Firmware Error Non-Fatal Mask"; + desc = "Bit mask for the register CPTRA_FW_ERROR_NON_FATAL to determine + which bits are disabled for interrupt generation on the + cptra_error_non_fatal output signal. + A value of 1 in a field of this register means the corresponding bit + position in CPTRA_FW_ERROR_NON_FATAL will not produce an interrupt + output assertion. + [br]Caliptra Access: RW + [br]SOC Access: RO"; + rw_ro_hw mask[32]=0; +} internal_fw_error_non_fatal_mask; + +reg { + name = "mtime low"; + desc = "RISC-V Standard Machine-mode Time Counter, lower 32-bits. + [br]Frequency of counter is indicated in CPTRA_TIMER_CONFIG.clk_period. + [br]Caliptra Access: RW + [br]SOC Access: RO"; + field {desc = "Counter Low" ; sw = rw; precedence = sw; swmod = true; hw = r; swwel = soc_req; counter = true; incrvalue = 1; overflow = true; resetsignal = cptra_pwrgood;} count_l[32] = 32'h0; +} internal_rv_mtime_l; + +reg { + name = "mtime high"; + desc = "RISC-V Standard Machine-mode Time Counter, upper 32-bits. + [br]Frequency of counter is indicated in CPTRA_TIMER_CONFIG.clk_period. + [br]Caliptra Access: RW + [br]SOC Access: RO"; + field {desc = "Counter High"; sw = rw; precedence = sw; swmod = true; hw = r; swwel = soc_req; counter = true; incrvalue = 1; resetsignal = cptra_pwrgood;} count_h[32] = 32'h0; +} internal_rv_mtime_h; + +reg { + name = "mtimecmp low"; + desc = "RISC-V Standard Machine-mode Time Counter Compare Value, lower 32-bits. + [br]Caliptra Access: RW + [br]SOC Access: RO"; + field {desc = "Count Compare Low" ; sw = rw; hw = r; swwel = soc_req; resetsignal = cptra_pwrgood;} compare_l[32] = 32'h0; +} internal_rv_mtimecmp_l; + +reg { + name = "mtimecmp high"; + desc = "RISC-V Standard Machine-mode Time Counter Compare Value, upper 32-bits. + [br]Caliptra Access: RW + [br]SOC Access: RO"; + field {desc = "Count Compare High"; sw = rw; hw = r; swwel = soc_req; resetsignal = cptra_pwrgood;} compare_h[32] = 32'h0; +} internal_rv_mtimecmp_h; + //////////////////////////////////////////////////////////////// // Interrupts @@ -123,13 +210,13 @@ regfile intr_block_t { // Specific enables for the events defined in this // event type in the instantiating peripheral. - field {desc = "Enable bit for Internal Errors"; } error_internal_en = 1'b0; - field {desc = "Enable bit for Invalid Device in Pauser field"; } error_inv_dev_en = 1'b0; - field {desc = "Enable bit for Failed Commands"; } error_cmd_fail_en = 1'b0; - field {desc = "Enable bit for Bad Fuse received from SoC"; } error_bad_fuse_en = 1'b0; - field {desc = "Enable bit for ICCM access blocked by lock"; } error_iccm_blocked_en = 1'b0; - field {desc = "Enable bit for Mailbox ECC Double-bit Error (uncorrectable)";} error_mbox_ecc_unc_en = 1'b0; - field {desc = "Enable bit for WDT Timer1 timeout"; } error_wdt_timer1_timeout_en = 1'b0; + field {desc = "Enable bit for Internal Errors"; } error_internal_en = 1'b0; + field {desc = "Enable bit for Invalid Device in Pauser field"; } error_inv_dev_en = 1'b0; + field {desc = "Enable bit for Failed Commands (invalid protocol or FW Fail Status)"; } error_cmd_fail_en = 1'b0; + field {desc = "Enable bit for Bad Fuse received from SoC"; } error_bad_fuse_en = 1'b0; + field {desc = "Enable bit for ICCM access blocked by lock"; } error_iccm_blocked_en = 1'b0; + field {desc = "Enable bit for Mailbox ECC Double-bit Error (uncorrectable)"; } error_mbox_ecc_unc_en = 1'b0; + field {desc = "Enable bit for WDT Timer1 timeout"; } error_wdt_timer1_timeout_en = 1'b0; field {desc = "Enable bit for WDT Timer2 timeout, applicable if timer2 is enabled as an independent timer";} error_wdt_timer2_timeout_en = 1'b0; }; @@ -146,7 +233,9 @@ regfile intr_block_t { field {desc = "Enable bit for Command Available"; } notif_cmd_avail_en = 1'b0; field {desc = "Enable bit for Mailbox ECC Single-bit Error (correctable)";} notif_mbox_ecc_cor_en = 1'b0; field {desc = "Enable bit for Security State, Debug Locked transition"; } notif_debug_locked_en = 1'b0; + field {desc = "Enable bit for Scan mode"; } notif_scan_mode_en = 1'b0; field {desc = "Enable bit for SoC requested the mailbox while locked"; } notif_soc_req_lock_en = 1'b0; + field {desc = "Enable bit for Generic Input Wires Toggle"; } notif_gen_in_toggle_en = 1'b0; }; /* ---- Error Interrupt Status ---- */ @@ -162,14 +251,14 @@ regfile intr_block_t { default woclr = true; default level intr; - field {desc = "Internal Errors status bit"; } error_internal_sts = 1'b0; - field {desc = "Invalid Device in Pauser field status bit"; } error_inv_dev_sts = 1'b0; - field {desc = "Failed Commands status bit"; } error_cmd_fail_sts = 1'b0; - field {desc = "Bad Fuse received from SoC status bit"; } error_bad_fuse_sts = 1'b0; - field {desc = "ICCM access blocked by lock status bit"; } error_iccm_blocked_sts = 1'b0; - field {desc = "Mailbox ECC Double-bit Error (uncorrectable) status bit";} error_mbox_ecc_unc_sts = 1'b0; - field {desc = "WDT Timer1 timeout status bit"; } error_wdt_timer1_timeout_sts = 1'b0; - field {desc = "WDT Timer2 timeout status bit"; } error_wdt_timer2_timeout_sts = 1'b0; + field {desc = "Internal Errors status bit"; } error_internal_sts = 1'b0; + field {desc = "Invalid Device in Pauser field status bit"; } error_inv_dev_sts = 1'b0; + field {desc = "Failed Commands status bit (invalid protocol or FW Fail Status)"; } error_cmd_fail_sts = 1'b0; + field {desc = "Bad Fuse received from SoC status bit"; } error_bad_fuse_sts = 1'b0; + field {desc = "ICCM access blocked by lock status bit"; } error_iccm_blocked_sts = 1'b0; + field {desc = "Mailbox ECC Double-bit Error (uncorrectable) status bit"; } error_mbox_ecc_unc_sts = 1'b0; + field {desc = "WDT Timer1 timeout status bit"; } error_wdt_timer1_timeout_sts = 1'b0; + field {desc = "WDT Timer2 timeout status bit"; } error_wdt_timer2_timeout_sts = 1'b0; }; /* ---- Notification Interrupt Status ---- */ @@ -185,10 +274,12 @@ regfile intr_block_t { default woclr = true; default level intr; - field {desc = "Command Available status bit";} notif_cmd_avail_sts = 1'b0; + field {desc = "Command Available status bit"; } notif_cmd_avail_sts = 1'b0; field {desc = "Mailbox ECC Single-bit Error (correctable) status bit";} notif_mbox_ecc_cor_sts = 1'b0; field {desc = "Security State, Debug Locked transition status bit"; } notif_debug_locked_sts = 1'b0; + field {desc = "Scan mode status bit"; } notif_scan_mode_sts = 1'b0; field {desc = "SoC requested the mailbox while locked status bit"; } notif_soc_req_lock_sts = 1'b0; + field {desc = "Generic Input Wires Toggle status bit"; } notif_gen_in_toggle_sts = 1'b0; }; /* ---- Aggregated Interrupt Status ---- */ @@ -250,7 +341,9 @@ regfile intr_block_t { field {desc = "Command Available trigger bit"; } notif_cmd_avail_trig = 1'b0; field {desc = "Mailbox ECC Single-bit Error (correctable) trigger bit";} notif_mbox_ecc_cor_trig = 1'b0; field {desc = "Security State, Debug Locked transition trigger bit"; } notif_debug_locked_trig = 1'b0; + field {desc = "Scan mode trigger bit"; } notif_scan_mode_trig = 1'b0; field {desc = "SoC requested the mailbox while locked trigger bit"; } notif_soc_req_lock_trig = 1'b0; + field {desc = "Generic Input Wires Toggle trigger bit"; } notif_gen_in_toggle_trig = 1'b0; }; /* ---- Interrupt Statistics Counter Incrementor ---- */ @@ -315,7 +408,9 @@ regfile intr_block_t { intr_count_t notif_cmd_avail_intr_count_r @0x180; /* Per notification */ // intr_count_t notif_mbox_ecc_cor_intr_count_r; /* Per notification */ // intr_count_t notif_debug_locked_intr_count_r; /* Per notification */ // + intr_count_t notif_scan_mode_intr_count_r; /* Per notification */ // intr_count_t notif_soc_req_lock_intr_count_r; /* Per notification */ // + intr_count_t notif_gen_in_toggle_intr_count_r; /* Per notification */ // // // These registers should be treated by SW as reserved, and ignored. // // Offset at 0x200 gives enough space for 32 Errors and 32 Notifications // @@ -333,7 +428,9 @@ regfile intr_block_t { intr_count_incr_t notif_cmd_avail_intr_count_incr_r; /* Per notification count incrementor pulse */ // intr_count_incr_t notif_mbox_ecc_cor_intr_count_incr_r; /* Per notification count incrementor pulse */ // intr_count_incr_t notif_debug_locked_intr_count_incr_r; /* Per notification count incrementor pulse */ // + intr_count_incr_t notif_scan_mode_intr_count_incr_r; /* Per notification count incrementor pulse */ // intr_count_incr_t notif_soc_req_lock_intr_count_incr_r; /* Per notification count incrementor pulse */ // + intr_count_incr_t notif_gen_in_toggle_intr_count_incr_r; /* Per notification count incrementor pulse */ // /* ------------------------------------------------------------------------------------------------------------- */ /* ---- Reset assignment for Error Events ---- */ @@ -364,10 +461,12 @@ regfile intr_block_t { error_internal_intr_r.error_mbox_ecc_unc_sts -> enable = error_intr_en_r.error_mbox_ecc_unc_en; error_internal_intr_r.error_wdt_timer1_timeout_sts -> enable = error_intr_en_r.error_wdt_timer1_timeout_en; error_internal_intr_r.error_wdt_timer2_timeout_sts -> enable = error_intr_en_r.error_wdt_timer2_timeout_en; - notif_internal_intr_r.notif_cmd_avail_sts -> enable = notif_intr_en_r.notif_cmd_avail_en; - notif_internal_intr_r.notif_mbox_ecc_cor_sts -> enable = notif_intr_en_r.notif_mbox_ecc_cor_en; - notif_internal_intr_r.notif_debug_locked_sts -> enable = notif_intr_en_r.notif_debug_locked_en; - notif_internal_intr_r.notif_soc_req_lock_sts -> enable = notif_intr_en_r.notif_soc_req_lock_en; + notif_internal_intr_r.notif_cmd_avail_sts -> enable = notif_intr_en_r.notif_cmd_avail_en; + notif_internal_intr_r.notif_mbox_ecc_cor_sts -> enable = notif_intr_en_r.notif_mbox_ecc_cor_en; + notif_internal_intr_r.notif_debug_locked_sts -> enable = notif_intr_en_r.notif_debug_locked_en; + notif_internal_intr_r.notif_scan_mode_sts -> enable = notif_intr_en_r.notif_scan_mode_en; + notif_internal_intr_r.notif_soc_req_lock_sts -> enable = notif_intr_en_r.notif_soc_req_lock_en; + notif_internal_intr_r.notif_gen_in_toggle_sts -> enable = notif_intr_en_r.notif_gen_in_toggle_en; error_internal_intr_r.error_internal_sts -> next = error_intr_trig_r.error_internal_trig; error_internal_intr_r.error_inv_dev_sts -> next = error_intr_trig_r.error_inv_dev_trig; @@ -377,10 +476,12 @@ regfile intr_block_t { error_internal_intr_r.error_mbox_ecc_unc_sts -> next = error_intr_trig_r.error_mbox_ecc_unc_trig; error_internal_intr_r.error_wdt_timer1_timeout_sts -> next = error_intr_trig_r.error_wdt_timer1_timeout_trig; error_internal_intr_r.error_wdt_timer2_timeout_sts -> next = error_intr_trig_r.error_wdt_timer2_timeout_trig; - notif_internal_intr_r.notif_cmd_avail_sts -> next = notif_intr_trig_r.notif_cmd_avail_trig; - notif_internal_intr_r.notif_mbox_ecc_cor_sts -> next = notif_intr_trig_r.notif_mbox_ecc_cor_trig; - notif_internal_intr_r.notif_debug_locked_sts -> next = notif_intr_trig_r.notif_debug_locked_trig; - notif_internal_intr_r.notif_soc_req_lock_sts -> next = notif_intr_trig_r.notif_soc_req_lock_trig; + notif_internal_intr_r.notif_cmd_avail_sts -> next = notif_intr_trig_r.notif_cmd_avail_trig; + notif_internal_intr_r.notif_mbox_ecc_cor_sts -> next = notif_intr_trig_r.notif_mbox_ecc_cor_trig; + notif_internal_intr_r.notif_debug_locked_sts -> next = notif_intr_trig_r.notif_debug_locked_trig; + notif_internal_intr_r.notif_scan_mode_sts -> next = notif_intr_trig_r.notif_scan_mode_trig; + notif_internal_intr_r.notif_soc_req_lock_sts -> next = notif_intr_trig_r.notif_soc_req_lock_trig; + notif_internal_intr_r.notif_gen_in_toggle_sts -> next = notif_intr_trig_r.notif_gen_in_toggle_trig; // NOTE: hwset for events is implicitly defined as module input @@ -463,12 +564,24 @@ regfile intr_block_t { notif_debug_locked_intr_count_incr_r.pulse -> decr = notif_debug_locked_intr_count_incr_r.pulse; // Auto-clear to generate pulse output notif_debug_locked_intr_count_r.cnt -> incr = notif_debug_locked_intr_count_incr_r.pulse; // Increment coincides with rising edge of interrupt sts bit + notif_scan_mode_intr_count_incr_r.pulse -> hwset = notif_internal_intr_r.notif_scan_mode_sts -> hwset; // \_____ Capture both firmware and hardware triggered events + notif_scan_mode_intr_count_incr_r.pulse -> next = notif_internal_intr_r.notif_scan_mode_sts -> next; // / as a pulse to increment the intr_count_r register + notif_scan_mode_intr_count_incr_r.pulse -> we = notif_internal_intr_r.notif_scan_mode_sts -> next; // Generate a pulse from SW trigger, if set, or default to use the hwset input + notif_scan_mode_intr_count_incr_r.pulse -> decr = notif_scan_mode_intr_count_incr_r.pulse; // Auto-clear to generate pulse output + notif_scan_mode_intr_count_r.cnt -> incr = notif_scan_mode_intr_count_incr_r.pulse; // Increment coincides with rising edge of interrupt sts bit + notif_soc_req_lock_intr_count_incr_r.pulse -> hwset = notif_internal_intr_r.notif_soc_req_lock_sts -> hwset; // \_____ Capture both firmware and hardware triggered events notif_soc_req_lock_intr_count_incr_r.pulse -> next = notif_internal_intr_r.notif_soc_req_lock_sts -> next; // / as a pulse to increment the intr_count_r register notif_soc_req_lock_intr_count_incr_r.pulse -> we = notif_internal_intr_r.notif_soc_req_lock_sts -> next; // Generate a pulse from SW trigger, if set, or default to use the hwset input notif_soc_req_lock_intr_count_incr_r.pulse -> decr = notif_soc_req_lock_intr_count_incr_r.pulse; // Auto-clear to generate pulse output notif_soc_req_lock_intr_count_r.cnt -> incr = notif_soc_req_lock_intr_count_incr_r.pulse; // Increment coincides with rising edge of interrupt sts bit + notif_gen_in_toggle_intr_count_incr_r.pulse -> hwset = notif_internal_intr_r.notif_gen_in_toggle_sts -> hwset; // \_____ Capture both firmware and hardware triggered events + notif_gen_in_toggle_intr_count_incr_r.pulse -> next = notif_internal_intr_r.notif_gen_in_toggle_sts -> next; // / as a pulse to increment the intr_count_r register + notif_gen_in_toggle_intr_count_incr_r.pulse -> we = notif_internal_intr_r.notif_gen_in_toggle_sts -> next; // Generate a pulse from SW trigger, if set, or default to use the hwset input + notif_gen_in_toggle_intr_count_incr_r.pulse -> decr = notif_gen_in_toggle_intr_count_incr_r.pulse; // Auto-clear to generate pulse output + notif_gen_in_toggle_intr_count_r.cnt -> incr = notif_gen_in_toggle_intr_count_incr_r.pulse; // Increment coincides with rising edge of interrupt sts bit + }; diff --git a/src/soc_ifc/rtl/soc_ifc_pkg.sv b/src/soc_ifc/rtl/soc_ifc_pkg.sv index dcd60b425..8934bdb55 100644 --- a/src/soc_ifc/rtl/soc_ifc_pkg.sv +++ b/src/soc_ifc/rtl/soc_ifc_pkg.sv @@ -15,6 +15,8 @@ `ifndef SOC_IFC_PKG `define SOC_IFC_PKG +`include "caliptra_top_reg_defines.svh" + package soc_ifc_pkg; parameter SOC_IFC_ADDR_W = 18; @@ -22,7 +24,8 @@ package soc_ifc_pkg; parameter SOC_IFC_USER_W = 32; parameter MBOX_SIZE_KB = 128; - parameter MBOX_SIZE_BYTES = 128 * 1024; + parameter MBOX_SIZE_BYTES = MBOX_SIZE_KB * 1024; + parameter MBOX_SIZE_DWORDS = MBOX_SIZE_BYTES/4; parameter MBOX_DATA_W = 32; parameter MBOX_ECC_DATA_W = 7; parameter MBOX_DATA_AND_ECC_W = MBOX_DATA_W + MBOX_ECC_DATA_W; @@ -32,15 +35,19 @@ package soc_ifc_pkg; parameter WDT_TIMEOUT_PERIOD_NUM_DWORDS = 2; parameter WDT_TIMEOUT_PERIOD_W = WDT_TIMEOUT_PERIOD_NUM_DWORDS * 32; + parameter SOC_IFC_REG_OFFSET = 32'h3000_0000; + //memory map - parameter MBOX_DIR_START_ADDR = 18'h0_0000; - parameter MBOX_DIR_END_ADDR = 18'h1_FFFF; - parameter MBOX_REG_START_ADDR = 18'h2_0000; - parameter MBOX_REG_END_ADDR = 18'h2_0FFF; - parameter SHA_REG_START_ADDR = 18'h2_1000; - parameter SHA_REG_END_ADDR = 18'h2_1FFF; - parameter SOC_IFC_REG_START_ADDR = 18'h3_0000; - parameter SOC_IFC_REG_END_ADDR = 18'h3_FFFF; + parameter MBOX_DIR_START_ADDR = 32'h0000_0000; + parameter MBOX_DIR_END_ADDR = 32'h0001_FFFF; + parameter MBOX_REG_START_ADDR = `CALIPTRA_TOP_REG_MBOX_CSR_BASE_ADDR - SOC_IFC_REG_OFFSET; + parameter MBOX_REG_END_ADDR = MBOX_REG_START_ADDR + 32'h0000_0FFF; + parameter SHA_REG_START_ADDR = `CALIPTRA_TOP_REG_SHA512_ACC_CSR_BASE_ADDR - SOC_IFC_REG_OFFSET; + parameter SHA_REG_END_ADDR = SHA_REG_START_ADDR + 32'h0000_0FFF; + parameter SOC_IFC_REG_START_ADDR = `CALIPTRA_TOP_REG_GENERIC_AND_FUSE_REG_BASE_ADDR - SOC_IFC_REG_OFFSET; + parameter SOC_IFC_REG_END_ADDR = SOC_IFC_REG_START_ADDR + 32'h0000_FFFF; + parameter SOC_IFC_FUSE_START_ADDR = SOC_IFC_REG_START_ADDR + 32'h0000_0200; + parameter SOC_IFC_FUSE_END_ADDR = SOC_IFC_REG_START_ADDR + 32'h0000_05FF; //Valid PAUSER //Lock the PAUSER values from integration time @@ -48,6 +55,9 @@ package soc_ifc_pkg; parameter [4:0][31:0] CPTRA_MBOX_VALID_PAUSER = {32'h4444_4444, 32'h3333_3333, 32'h2222_2222, 32'h1111_1111, 32'h0000_0000}; parameter [31:0] CPTRA_DEF_MBOX_VALID_PAUSER = 32'hFFFF_FFFF; + parameter CPTRA_SET_FUSE_PAUSER_INTEG = 1'b0; + parameter [31:0] CPTRA_FUSE_VALID_PAUSER = 32'h0000_0000; + //DMI Register encodings //Read only registers parameter DMI_REG_MBOX_DLEN = 7'h50; @@ -60,6 +70,14 @@ package soc_ifc_pkg; parameter DMI_REG_CPTRA_DBG_MANUF_SERVICE_REG = 7'h60; parameter DMI_REG_BOOTFSM_GO = 7'h61; + // This parameter describes the hard-coded implementation in the BOOT FSM + // that results in noncore reset assertion being delayed from the soft reset + // (cptra_rst_b) by some integer number of clock cycles, due to synchronization + // stages and the rst window signaling. + // This is useful in validation environments for controlling the predicted + // timing in a reset event. + parameter SOC_IFC_CPTRA_RST_NONCORE_RST_DELAY = 4; + //BOOT FSM typedef enum logic [2:0] { BOOT_IDLE = 3'b000, @@ -76,9 +94,20 @@ package soc_ifc_pkg; MBOX_RDY_FOR_DLEN = 3'b011, MBOX_RDY_FOR_DATA = 3'b010, MBOX_EXECUTE_UC = 3'b110, - MBOX_EXECUTE_SOC = 3'b100 + MBOX_EXECUTE_SOC = 3'b100, + MBOX_ERROR = 3'b111 } mbox_fsm_state_e; + //SHA FSM + typedef enum logic [2:0] { + SHA_IDLE = 3'b000, + SHA_BLOCK_0 = 3'b001, + SHA_BLOCK_N = 3'b011, + SHA_PAD0 = 3'b010, + SHA_PAD1 = 3'b110, + SHA_DONE = 3'b100 + } sha_fsm_state_e; + //MAILBOX Status typedef enum logic [3:0] { CMD_BUSY = 4'd0, @@ -112,6 +141,18 @@ package soc_ifc_pkg; mbox_sram_data_t rdata; } mbox_sram_resp_t; + typedef struct packed { + logic cptra_iccm_ecc_single_error; + logic cptra_iccm_ecc_double_error; + logic cptra_dccm_ecc_single_error; + logic cptra_dccm_ecc_double_error; + } rv_ecc_sts_t; + + typedef struct packed { + logic axs_without_lock; + logic axs_incorrect_order; + } mbox_protocol_error_t; + typedef enum logic [1:0] { DEVICE_UNPROVISIONED = 2'b00, DEVICE_MANUFACTURING = 2'b01, diff --git a/src/soc_ifc/rtl/soc_ifc_reg.sv b/src/soc_ifc/rtl/soc_ifc_reg.sv index 88e8b9e8b..c81364f56 100644 --- a/src/soc_ifc/rtl/soc_ifc_reg.sv +++ b/src/soc_ifc/rtl/soc_ifc_reg.sv @@ -80,6 +80,7 @@ module soc_ifc_reg ( logic CPTRA_TRNG_VALID_PAUSER; logic CPTRA_TRNG_PAUSER_LOCK; logic [12-1:0]CPTRA_TRNG_DATA; + logic CPTRA_TRNG_CTRL; logic CPTRA_TRNG_STATUS; logic CPTRA_FUSE_WR_DONE; logic CPTRA_TIMER_CONFIG; @@ -98,6 +99,12 @@ module soc_ifc_reg ( logic CPTRA_WDT_TIMER2_CTRL; logic [2-1:0]CPTRA_WDT_TIMER2_TIMEOUT_PERIOD; logic CPTRA_WDT_STATUS; + logic CPTRA_FUSE_VALID_PAUSER; + logic CPTRA_FUSE_PAUSER_LOCK; + logic [2-1:0]CPTRA_WDT_CFG; + logic CPTRA_iTRNG_ENTROPY_CONFIG_0; + logic CPTRA_iTRNG_ENTROPY_CONFIG_1; + logic [2-1:0]CPTRA_RSVD_REG; logic [12-1:0]fuse_uds_seed; logic [8-1:0]fuse_field_entropy; logic [12-1:0]fuse_key_manifest_pk_hash; @@ -109,11 +116,22 @@ module soc_ifc_reg ( logic [24-1:0]fuse_idevid_cert_attr; logic [4-1:0]fuse_idevid_manuf_hsm_id; logic fuse_life_cycle; + logic fuse_lms_verify; + logic fuse_lms_revocation; + logic fuse_soc_stepping_id; logic [8-1:0]internal_obf_key; logic internal_iccm_lock; logic internal_fw_update_reset; logic internal_fw_update_reset_wait_cycles; logic internal_nmi_vector; + logic internal_hw_error_fatal_mask; + logic internal_hw_error_non_fatal_mask; + logic internal_fw_error_fatal_mask; + logic internal_fw_error_non_fatal_mask; + logic internal_rv_mtime_l; + logic internal_rv_mtime_h; + logic internal_rv_mtimecmp_l; + logic internal_rv_mtimecmp_h; struct packed{ logic global_intr_en_r; logic error_intr_en_r; @@ -135,7 +153,9 @@ module soc_ifc_reg ( logic notif_cmd_avail_intr_count_r; logic notif_mbox_ecc_cor_intr_count_r; logic notif_debug_locked_intr_count_r; + logic notif_scan_mode_intr_count_r; logic notif_soc_req_lock_intr_count_r; + logic notif_gen_in_toggle_intr_count_r; logic error_internal_intr_count_incr_r; logic error_inv_dev_intr_count_incr_r; logic error_cmd_fail_intr_count_incr_r; @@ -147,7 +167,9 @@ module soc_ifc_reg ( logic notif_cmd_avail_intr_count_incr_r; logic notif_mbox_ecc_cor_intr_count_incr_r; logic notif_debug_locked_intr_count_incr_r; + logic notif_scan_mode_intr_count_incr_r; logic notif_soc_req_lock_intr_count_incr_r; + logic notif_gen_in_toggle_intr_count_incr_r; } intr_block_rf; } decoded_reg_strb_t; decoded_reg_strb_t decoded_reg_strb; @@ -181,34 +203,45 @@ module soc_ifc_reg ( for(int i0=0; i0<12; i0++) begin decoded_reg_strb.CPTRA_TRNG_DATA[i0] = cpuif_req_masked & (cpuif_addr == 'h78 + i0*'h4); end - decoded_reg_strb.CPTRA_TRNG_STATUS = cpuif_req_masked & (cpuif_addr == 'ha8); - decoded_reg_strb.CPTRA_FUSE_WR_DONE = cpuif_req_masked & (cpuif_addr == 'hac); - decoded_reg_strb.CPTRA_TIMER_CONFIG = cpuif_req_masked & (cpuif_addr == 'hb0); - decoded_reg_strb.CPTRA_BOOTFSM_GO = cpuif_req_masked & (cpuif_addr == 'hb4); - decoded_reg_strb.CPTRA_DBG_MANUF_SERVICE_REG = cpuif_req_masked & (cpuif_addr == 'hb8); - decoded_reg_strb.CPTRA_CLK_GATING_EN = cpuif_req_masked & (cpuif_addr == 'hbc); + decoded_reg_strb.CPTRA_TRNG_CTRL = cpuif_req_masked & (cpuif_addr == 'ha8); + decoded_reg_strb.CPTRA_TRNG_STATUS = cpuif_req_masked & (cpuif_addr == 'hac); + decoded_reg_strb.CPTRA_FUSE_WR_DONE = cpuif_req_masked & (cpuif_addr == 'hb0); + decoded_reg_strb.CPTRA_TIMER_CONFIG = cpuif_req_masked & (cpuif_addr == 'hb4); + decoded_reg_strb.CPTRA_BOOTFSM_GO = cpuif_req_masked & (cpuif_addr == 'hb8); + decoded_reg_strb.CPTRA_DBG_MANUF_SERVICE_REG = cpuif_req_masked & (cpuif_addr == 'hbc); + decoded_reg_strb.CPTRA_CLK_GATING_EN = cpuif_req_masked & (cpuif_addr == 'hc0); for(int i0=0; i0<2; i0++) begin - decoded_reg_strb.CPTRA_GENERIC_INPUT_WIRES[i0] = cpuif_req_masked & (cpuif_addr == 'hc0 + i0*'h4); + decoded_reg_strb.CPTRA_GENERIC_INPUT_WIRES[i0] = cpuif_req_masked & (cpuif_addr == 'hc4 + i0*'h4); end for(int i0=0; i0<2; i0++) begin - decoded_reg_strb.CPTRA_GENERIC_OUTPUT_WIRES[i0] = cpuif_req_masked & (cpuif_addr == 'hc8 + i0*'h4); + decoded_reg_strb.CPTRA_GENERIC_OUTPUT_WIRES[i0] = cpuif_req_masked & (cpuif_addr == 'hcc + i0*'h4); end - decoded_reg_strb.CPTRA_HW_REV_ID = cpuif_req_masked & (cpuif_addr == 'hd0); + decoded_reg_strb.CPTRA_HW_REV_ID = cpuif_req_masked & (cpuif_addr == 'hd4); for(int i0=0; i0<2; i0++) begin - decoded_reg_strb.CPTRA_FW_REV_ID[i0] = cpuif_req_masked & (cpuif_addr == 'hd4 + i0*'h4); + decoded_reg_strb.CPTRA_FW_REV_ID[i0] = cpuif_req_masked & (cpuif_addr == 'hd8 + i0*'h4); end - decoded_reg_strb.CPTRA_HW_CONFIG = cpuif_req_masked & (cpuif_addr == 'hdc); - decoded_reg_strb.CPTRA_WDT_TIMER1_EN = cpuif_req_masked & (cpuif_addr == 'he0); - decoded_reg_strb.CPTRA_WDT_TIMER1_CTRL = cpuif_req_masked & (cpuif_addr == 'he4); + decoded_reg_strb.CPTRA_HW_CONFIG = cpuif_req_masked & (cpuif_addr == 'he0); + decoded_reg_strb.CPTRA_WDT_TIMER1_EN = cpuif_req_masked & (cpuif_addr == 'he4); + decoded_reg_strb.CPTRA_WDT_TIMER1_CTRL = cpuif_req_masked & (cpuif_addr == 'he8); for(int i0=0; i0<2; i0++) begin - decoded_reg_strb.CPTRA_WDT_TIMER1_TIMEOUT_PERIOD[i0] = cpuif_req_masked & (cpuif_addr == 'he8 + i0*'h4); + decoded_reg_strb.CPTRA_WDT_TIMER1_TIMEOUT_PERIOD[i0] = cpuif_req_masked & (cpuif_addr == 'hec + i0*'h4); end - decoded_reg_strb.CPTRA_WDT_TIMER2_EN = cpuif_req_masked & (cpuif_addr == 'hf0); - decoded_reg_strb.CPTRA_WDT_TIMER2_CTRL = cpuif_req_masked & (cpuif_addr == 'hf4); + decoded_reg_strb.CPTRA_WDT_TIMER2_EN = cpuif_req_masked & (cpuif_addr == 'hf4); + decoded_reg_strb.CPTRA_WDT_TIMER2_CTRL = cpuif_req_masked & (cpuif_addr == 'hf8); for(int i0=0; i0<2; i0++) begin - decoded_reg_strb.CPTRA_WDT_TIMER2_TIMEOUT_PERIOD[i0] = cpuif_req_masked & (cpuif_addr == 'hf8 + i0*'h4); + decoded_reg_strb.CPTRA_WDT_TIMER2_TIMEOUT_PERIOD[i0] = cpuif_req_masked & (cpuif_addr == 'hfc + i0*'h4); + end + decoded_reg_strb.CPTRA_WDT_STATUS = cpuif_req_masked & (cpuif_addr == 'h104); + decoded_reg_strb.CPTRA_FUSE_VALID_PAUSER = cpuif_req_masked & (cpuif_addr == 'h108); + decoded_reg_strb.CPTRA_FUSE_PAUSER_LOCK = cpuif_req_masked & (cpuif_addr == 'h10c); + for(int i0=0; i0<2; i0++) begin + decoded_reg_strb.CPTRA_WDT_CFG[i0] = cpuif_req_masked & (cpuif_addr == 'h110 + i0*'h4); + end + decoded_reg_strb.CPTRA_iTRNG_ENTROPY_CONFIG_0 = cpuif_req_masked & (cpuif_addr == 'h118); + decoded_reg_strb.CPTRA_iTRNG_ENTROPY_CONFIG_1 = cpuif_req_masked & (cpuif_addr == 'h11c); + for(int i0=0; i0<2; i0++) begin + decoded_reg_strb.CPTRA_RSVD_REG[i0] = cpuif_req_masked & (cpuif_addr == 'h120 + i0*'h4); end - decoded_reg_strb.CPTRA_WDT_STATUS = cpuif_req_masked & (cpuif_addr == 'h100); for(int i0=0; i0<12; i0++) begin decoded_reg_strb.fuse_uds_seed[i0] = cpuif_req_masked & (cpuif_addr == 'h200 + i0*'h4); end @@ -234,6 +267,9 @@ module soc_ifc_reg ( decoded_reg_strb.fuse_idevid_manuf_hsm_id[i0] = cpuif_req_masked & (cpuif_addr == 'h32c + i0*'h4); end decoded_reg_strb.fuse_life_cycle = cpuif_req_masked & (cpuif_addr == 'h33c); + decoded_reg_strb.fuse_lms_verify = cpuif_req_masked & (cpuif_addr == 'h340); + decoded_reg_strb.fuse_lms_revocation = cpuif_req_masked & (cpuif_addr == 'h344); + decoded_reg_strb.fuse_soc_stepping_id = cpuif_req_masked & (cpuif_addr == 'h348); for(int i0=0; i0<8; i0++) begin decoded_reg_strb.internal_obf_key[i0] = cpuif_req_masked & (cpuif_addr == 'h600 + i0*'h4); end @@ -241,6 +277,14 @@ module soc_ifc_reg ( decoded_reg_strb.internal_fw_update_reset = cpuif_req_masked & (cpuif_addr == 'h624); decoded_reg_strb.internal_fw_update_reset_wait_cycles = cpuif_req_masked & (cpuif_addr == 'h628); decoded_reg_strb.internal_nmi_vector = cpuif_req_masked & (cpuif_addr == 'h62c); + decoded_reg_strb.internal_hw_error_fatal_mask = cpuif_req_masked & (cpuif_addr == 'h630); + decoded_reg_strb.internal_hw_error_non_fatal_mask = cpuif_req_masked & (cpuif_addr == 'h634); + decoded_reg_strb.internal_fw_error_fatal_mask = cpuif_req_masked & (cpuif_addr == 'h638); + decoded_reg_strb.internal_fw_error_non_fatal_mask = cpuif_req_masked & (cpuif_addr == 'h63c); + decoded_reg_strb.internal_rv_mtime_l = cpuif_req_masked & (cpuif_addr == 'h640); + decoded_reg_strb.internal_rv_mtime_h = cpuif_req_masked & (cpuif_addr == 'h644); + decoded_reg_strb.internal_rv_mtimecmp_l = cpuif_req_masked & (cpuif_addr == 'h648); + decoded_reg_strb.internal_rv_mtimecmp_h = cpuif_req_masked & (cpuif_addr == 'h64c); decoded_reg_strb.intr_block_rf.global_intr_en_r = cpuif_req_masked & (cpuif_addr == 'h800); decoded_reg_strb.intr_block_rf.error_intr_en_r = cpuif_req_masked & (cpuif_addr == 'h804); decoded_reg_strb.intr_block_rf.notif_intr_en_r = cpuif_req_masked & (cpuif_addr == 'h808); @@ -261,7 +305,9 @@ module soc_ifc_reg ( decoded_reg_strb.intr_block_rf.notif_cmd_avail_intr_count_r = cpuif_req_masked & (cpuif_addr == 'h980); decoded_reg_strb.intr_block_rf.notif_mbox_ecc_cor_intr_count_r = cpuif_req_masked & (cpuif_addr == 'h984); decoded_reg_strb.intr_block_rf.notif_debug_locked_intr_count_r = cpuif_req_masked & (cpuif_addr == 'h988); - decoded_reg_strb.intr_block_rf.notif_soc_req_lock_intr_count_r = cpuif_req_masked & (cpuif_addr == 'h98c); + decoded_reg_strb.intr_block_rf.notif_scan_mode_intr_count_r = cpuif_req_masked & (cpuif_addr == 'h98c); + decoded_reg_strb.intr_block_rf.notif_soc_req_lock_intr_count_r = cpuif_req_masked & (cpuif_addr == 'h990); + decoded_reg_strb.intr_block_rf.notif_gen_in_toggle_intr_count_r = cpuif_req_masked & (cpuif_addr == 'h994); decoded_reg_strb.intr_block_rf.error_internal_intr_count_incr_r = cpuif_req_masked & (cpuif_addr == 'ha00); decoded_reg_strb.intr_block_rf.error_inv_dev_intr_count_incr_r = cpuif_req_masked & (cpuif_addr == 'ha04); decoded_reg_strb.intr_block_rf.error_cmd_fail_intr_count_incr_r = cpuif_req_masked & (cpuif_addr == 'ha08); @@ -273,7 +319,9 @@ module soc_ifc_reg ( decoded_reg_strb.intr_block_rf.notif_cmd_avail_intr_count_incr_r = cpuif_req_masked & (cpuif_addr == 'ha20); decoded_reg_strb.intr_block_rf.notif_mbox_ecc_cor_intr_count_incr_r = cpuif_req_masked & (cpuif_addr == 'ha24); decoded_reg_strb.intr_block_rf.notif_debug_locked_intr_count_incr_r = cpuif_req_masked & (cpuif_addr == 'ha28); - decoded_reg_strb.intr_block_rf.notif_soc_req_lock_intr_count_incr_r = cpuif_req_masked & (cpuif_addr == 'ha2c); + decoded_reg_strb.intr_block_rf.notif_scan_mode_intr_count_incr_r = cpuif_req_masked & (cpuif_addr == 'ha2c); + decoded_reg_strb.intr_block_rf.notif_soc_req_lock_intr_count_incr_r = cpuif_req_masked & (cpuif_addr == 'ha30); + decoded_reg_strb.intr_block_rf.notif_gen_in_toggle_intr_count_incr_r = cpuif_req_masked & (cpuif_addr == 'ha34); end // Pass down signals to next stage @@ -292,15 +340,31 @@ module soc_ifc_reg ( typedef struct packed{ struct packed{ struct packed{ - logic [31:0] next; + logic next; logic load_next; - } error_code; + } iccm_ecc_unc; + struct packed{ + logic next; + logic load_next; + } dccm_ecc_unc; + struct packed{ + logic next; + logic load_next; + } nmi_pin; } CPTRA_HW_ERROR_FATAL; struct packed{ struct packed{ - logic [31:0] next; + logic next; logic load_next; - } error_code; + } mbox_prot_no_lock; + struct packed{ + logic next; + logic load_next; + } mbox_prot_ooo; + struct packed{ + logic next; + logic load_next; + } mbox_ecc_unc; } CPTRA_HW_ERROR_NON_FATAL; struct packed{ struct packed{ @@ -340,21 +404,21 @@ module soc_ifc_reg ( } CPTRA_BOOT_STATUS; struct packed{ struct packed{ - logic [27:0] next; + logic [23:0] next; logic load_next; } status; struct packed{ logic next; logic load_next; - } ready_for_fw; + } idevid_csr_ready; struct packed{ logic next; logic load_next; - } ready_for_runtime; + } ready_for_fw; struct packed{ logic next; logic load_next; - } ready_for_fuses; + } ready_for_runtime; struct packed{ logic next; logic load_next; @@ -400,6 +464,12 @@ module soc_ifc_reg ( logic load_next; } DATA; } [12-1:0]CPTRA_TRNG_DATA; + struct packed{ + struct packed{ + logic next; + logic load_next; + } clear; + } CPTRA_TRNG_CTRL; struct packed{ struct packed{ logic next; @@ -504,6 +574,50 @@ module soc_ifc_reg ( logic load_next; } t2_timeout; } CPTRA_WDT_STATUS; + struct packed{ + struct packed{ + logic [31:0] next; + logic load_next; + } PAUSER; + } CPTRA_FUSE_VALID_PAUSER; + struct packed{ + struct packed{ + logic next; + logic load_next; + } LOCK; + } CPTRA_FUSE_PAUSER_LOCK; + struct packed{ + struct packed{ + logic [31:0] next; + logic load_next; + } TIMEOUT; + } [2-1:0]CPTRA_WDT_CFG; + struct packed{ + struct packed{ + logic [15:0] next; + logic load_next; + } low_threshold; + struct packed{ + logic [15:0] next; + logic load_next; + } high_threshold; + } CPTRA_iTRNG_ENTROPY_CONFIG_0; + struct packed{ + struct packed{ + logic [15:0] next; + logic load_next; + } repetition_count; + struct packed{ + logic [15:0] next; + logic load_next; + } RSVD; + } CPTRA_iTRNG_ENTROPY_CONFIG_1; + struct packed{ + struct packed{ + logic [31:0] next; + logic load_next; + } RSVD; + } [2-1:0]CPTRA_RSVD_REG; struct packed{ struct packed{ logic [31:0] next; @@ -570,6 +684,24 @@ module soc_ifc_reg ( logic load_next; } life_cycle; } fuse_life_cycle; + struct packed{ + struct packed{ + logic next; + logic load_next; + } lms_verify; + } fuse_lms_verify; + struct packed{ + struct packed{ + logic [31:0] next; + logic load_next; + } lms_revocation; + } fuse_lms_revocation; + struct packed{ + struct packed{ + logic [15:0] next; + logic load_next; + } soc_stepping_id; + } fuse_soc_stepping_id; struct packed{ struct packed{ logic [31:0] next; @@ -600,6 +732,74 @@ module soc_ifc_reg ( logic load_next; } vec; } internal_nmi_vector; + struct packed{ + struct packed{ + logic next; + logic load_next; + } mask_iccm_ecc_unc; + struct packed{ + logic next; + logic load_next; + } mask_dccm_ecc_unc; + struct packed{ + logic next; + logic load_next; + } mask_nmi_pin; + } internal_hw_error_fatal_mask; + struct packed{ + struct packed{ + logic next; + logic load_next; + } mask_mbox_prot_no_lock; + struct packed{ + logic next; + logic load_next; + } mask_mbox_prot_ooo; + struct packed{ + logic next; + logic load_next; + } mask_mbox_ecc_unc; + } internal_hw_error_non_fatal_mask; + struct packed{ + struct packed{ + logic [31:0] next; + logic load_next; + } mask; + } internal_fw_error_fatal_mask; + struct packed{ + struct packed{ + logic [31:0] next; + logic load_next; + } mask; + } internal_fw_error_non_fatal_mask; + struct packed{ + struct packed{ + logic [31:0] next; + logic load_next; + logic incrthreshold; + logic overflow; + } count_l; + } internal_rv_mtime_l; + struct packed{ + struct packed{ + logic [31:0] next; + logic load_next; + logic incrthreshold; + logic overflow; + } count_h; + } internal_rv_mtime_h; + struct packed{ + struct packed{ + logic [31:0] next; + logic load_next; + } compare_l; + } internal_rv_mtimecmp_l; + struct packed{ + struct packed{ + logic [31:0] next; + logic load_next; + } compare_h; + } internal_rv_mtimecmp_h; struct packed{ struct packed{ struct packed{ @@ -658,10 +858,18 @@ module soc_ifc_reg ( logic next; logic load_next; } notif_debug_locked_en; + struct packed{ + logic next; + logic load_next; + } notif_scan_mode_en; struct packed{ logic next; logic load_next; } notif_soc_req_lock_en; + struct packed{ + logic next; + logic load_next; + } notif_gen_in_toggle_en; } notif_intr_en_r; struct packed{ struct packed{ @@ -722,10 +930,18 @@ module soc_ifc_reg ( logic next; logic load_next; } notif_debug_locked_sts; + struct packed{ + logic next; + logic load_next; + } notif_scan_mode_sts; struct packed{ logic next; logic load_next; } notif_soc_req_lock_sts; + struct packed{ + logic next; + logic load_next; + } notif_gen_in_toggle_sts; } notif_internal_intr_r; struct packed{ struct packed{ @@ -774,10 +990,18 @@ module soc_ifc_reg ( logic next; logic load_next; } notif_debug_locked_trig; + struct packed{ + logic next; + logic load_next; + } notif_scan_mode_trig; struct packed{ logic next; logic load_next; } notif_soc_req_lock_trig; + struct packed{ + logic next; + logic load_next; + } notif_gen_in_toggle_trig; } notif_intr_trig_r; struct packed{ struct packed{ @@ -867,6 +1091,14 @@ module soc_ifc_reg ( logic incrsaturate; } cnt; } notif_debug_locked_intr_count_r; + struct packed{ + struct packed{ + logic [31:0] next; + logic load_next; + logic incrthreshold; + logic incrsaturate; + } cnt; + } notif_scan_mode_intr_count_r; struct packed{ struct packed{ logic [31:0] next; @@ -875,6 +1107,14 @@ module soc_ifc_reg ( logic incrsaturate; } cnt; } notif_soc_req_lock_intr_count_r; + struct packed{ + struct packed{ + logic [31:0] next; + logic load_next; + logic incrthreshold; + logic incrsaturate; + } cnt; + } notif_gen_in_toggle_intr_count_r; struct packed{ struct packed{ logic next; @@ -963,6 +1203,14 @@ module soc_ifc_reg ( logic underflow; } pulse; } notif_debug_locked_intr_count_incr_r; + struct packed{ + struct packed{ + logic next; + logic load_next; + logic decrthreshold; + logic underflow; + } pulse; + } notif_scan_mode_intr_count_incr_r; struct packed{ struct packed{ logic next; @@ -971,6 +1219,14 @@ module soc_ifc_reg ( logic underflow; } pulse; } notif_soc_req_lock_intr_count_incr_r; + struct packed{ + struct packed{ + logic next; + logic load_next; + logic decrthreshold; + logic underflow; + } pulse; + } notif_gen_in_toggle_intr_count_incr_r; } intr_block_rf; } field_combo_t; field_combo_t field_combo; @@ -978,13 +1234,25 @@ module soc_ifc_reg ( typedef struct packed{ struct packed{ struct packed{ - logic [31:0] value; - } error_code; + logic value; + } iccm_ecc_unc; + struct packed{ + logic value; + } dccm_ecc_unc; + struct packed{ + logic value; + } nmi_pin; } CPTRA_HW_ERROR_FATAL; struct packed{ struct packed{ - logic [31:0] value; - } error_code; + logic value; + } mbox_prot_no_lock; + struct packed{ + logic value; + } mbox_prot_ooo; + struct packed{ + logic value; + } mbox_ecc_unc; } CPTRA_HW_ERROR_NON_FATAL; struct packed{ struct packed{ @@ -1018,17 +1286,17 @@ module soc_ifc_reg ( } CPTRA_BOOT_STATUS; struct packed{ struct packed{ - logic [27:0] value; + logic [23:0] value; } status; struct packed{ logic value; - } ready_for_fw; + } idevid_csr_ready; struct packed{ logic value; - } ready_for_runtime; + } ready_for_fw; struct packed{ logic value; - } ready_for_fuses; + } ready_for_runtime; struct packed{ logic value; } mailbox_flow_done; @@ -1066,6 +1334,11 @@ module soc_ifc_reg ( logic [31:0] value; } DATA; } [12-1:0]CPTRA_TRNG_DATA; + struct packed{ + struct packed{ + logic value; + } clear; + } CPTRA_TRNG_CTRL; struct packed{ struct packed{ logic value; @@ -1152,6 +1425,42 @@ module soc_ifc_reg ( logic value; } t2_timeout; } CPTRA_WDT_STATUS; + struct packed{ + struct packed{ + logic [31:0] value; + } PAUSER; + } CPTRA_FUSE_VALID_PAUSER; + struct packed{ + struct packed{ + logic value; + } LOCK; + } CPTRA_FUSE_PAUSER_LOCK; + struct packed{ + struct packed{ + logic [31:0] value; + } TIMEOUT; + } [2-1:0]CPTRA_WDT_CFG; + struct packed{ + struct packed{ + logic [15:0] value; + } low_threshold; + struct packed{ + logic [15:0] value; + } high_threshold; + } CPTRA_iTRNG_ENTROPY_CONFIG_0; + struct packed{ + struct packed{ + logic [15:0] value; + } repetition_count; + struct packed{ + logic [15:0] value; + } RSVD; + } CPTRA_iTRNG_ENTROPY_CONFIG_1; + struct packed{ + struct packed{ + logic [31:0] value; + } RSVD; + } [2-1:0]CPTRA_RSVD_REG; struct packed{ struct packed{ logic [31:0] value; @@ -1207,6 +1516,21 @@ module soc_ifc_reg ( logic [1:0] value; } life_cycle; } fuse_life_cycle; + struct packed{ + struct packed{ + logic value; + } lms_verify; + } fuse_lms_verify; + struct packed{ + struct packed{ + logic [31:0] value; + } lms_revocation; + } fuse_lms_revocation; + struct packed{ + struct packed{ + logic [15:0] value; + } soc_stepping_id; + } fuse_soc_stepping_id; struct packed{ struct packed{ logic [31:0] value; @@ -1232,6 +1556,58 @@ module soc_ifc_reg ( logic [31:0] value; } vec; } internal_nmi_vector; + struct packed{ + struct packed{ + logic value; + } mask_iccm_ecc_unc; + struct packed{ + logic value; + } mask_dccm_ecc_unc; + struct packed{ + logic value; + } mask_nmi_pin; + } internal_hw_error_fatal_mask; + struct packed{ + struct packed{ + logic value; + } mask_mbox_prot_no_lock; + struct packed{ + logic value; + } mask_mbox_prot_ooo; + struct packed{ + logic value; + } mask_mbox_ecc_unc; + } internal_hw_error_non_fatal_mask; + struct packed{ + struct packed{ + logic [31:0] value; + } mask; + } internal_fw_error_fatal_mask; + struct packed{ + struct packed{ + logic [31:0] value; + } mask; + } internal_fw_error_non_fatal_mask; + struct packed{ + struct packed{ + logic [31:0] value; + } count_l; + } internal_rv_mtime_l; + struct packed{ + struct packed{ + logic [31:0] value; + } count_h; + } internal_rv_mtime_h; + struct packed{ + struct packed{ + logic [31:0] value; + } compare_l; + } internal_rv_mtimecmp_l; + struct packed{ + struct packed{ + logic [31:0] value; + } compare_h; + } internal_rv_mtimecmp_h; struct packed{ struct packed{ struct packed{ @@ -1277,9 +1653,15 @@ module soc_ifc_reg ( struct packed{ logic value; } notif_debug_locked_en; + struct packed{ + logic value; + } notif_scan_mode_en; struct packed{ logic value; } notif_soc_req_lock_en; + struct packed{ + logic value; + } notif_gen_in_toggle_en; } notif_intr_en_r; struct packed{ struct packed{ @@ -1327,9 +1709,15 @@ module soc_ifc_reg ( struct packed{ logic value; } notif_debug_locked_sts; + struct packed{ + logic value; + } notif_scan_mode_sts; struct packed{ logic value; } notif_soc_req_lock_sts; + struct packed{ + logic value; + } notif_gen_in_toggle_sts; } notif_internal_intr_r; struct packed{ struct packed{ @@ -1367,9 +1755,15 @@ module soc_ifc_reg ( struct packed{ logic value; } notif_debug_locked_trig; + struct packed{ + logic value; + } notif_scan_mode_trig; struct packed{ logic value; } notif_soc_req_lock_trig; + struct packed{ + logic value; + } notif_gen_in_toggle_trig; } notif_intr_trig_r; struct packed{ struct packed{ @@ -1426,11 +1820,21 @@ module soc_ifc_reg ( logic [31:0] value; } cnt; } notif_debug_locked_intr_count_r; + struct packed{ + struct packed{ + logic [31:0] value; + } cnt; + } notif_scan_mode_intr_count_r; struct packed{ struct packed{ logic [31:0] value; } cnt; } notif_soc_req_lock_intr_count_r; + struct packed{ + struct packed{ + logic [31:0] value; + } cnt; + } notif_gen_in_toggle_intr_count_r; struct packed{ struct packed{ logic value; @@ -1486,59 +1890,157 @@ module soc_ifc_reg ( logic value; } pulse; } notif_debug_locked_intr_count_incr_r; + struct packed{ + struct packed{ + logic value; + } pulse; + } notif_scan_mode_intr_count_incr_r; struct packed{ struct packed{ logic value; } pulse; } notif_soc_req_lock_intr_count_incr_r; + struct packed{ + struct packed{ + logic value; + } pulse; + } notif_gen_in_toggle_intr_count_incr_r; } intr_block_rf; } field_storage_t; field_storage_t field_storage; - // Field: soc_ifc_reg.CPTRA_HW_ERROR_FATAL.error_code + // Field: soc_ifc_reg.CPTRA_HW_ERROR_FATAL.iccm_ecc_unc always_comb begin - automatic logic [31:0] next_c = field_storage.CPTRA_HW_ERROR_FATAL.error_code.value; + automatic logic [0:0] next_c = field_storage.CPTRA_HW_ERROR_FATAL.iccm_ecc_unc.value; automatic logic load_next_c = '0; if(decoded_reg_strb.CPTRA_HW_ERROR_FATAL && decoded_req_is_wr) begin // SW write 1 clear - next_c = field_storage.CPTRA_HW_ERROR_FATAL.error_code.value & ~(decoded_wr_data[31:0] & decoded_wr_biten[31:0]); + next_c = field_storage.CPTRA_HW_ERROR_FATAL.iccm_ecc_unc.value & ~(decoded_wr_data[0:0] & decoded_wr_biten[0:0]); + load_next_c = '1; + end else if(hwif_in.CPTRA_HW_ERROR_FATAL.iccm_ecc_unc.we) begin // HW Write - we + next_c = hwif_in.CPTRA_HW_ERROR_FATAL.iccm_ecc_unc.next; + load_next_c = '1; + end + field_combo.CPTRA_HW_ERROR_FATAL.iccm_ecc_unc.next = next_c; + field_combo.CPTRA_HW_ERROR_FATAL.iccm_ecc_unc.load_next = load_next_c; + end + always_ff @(posedge clk or negedge hwif_in.cptra_pwrgood) begin + if(~hwif_in.cptra_pwrgood) begin + field_storage.CPTRA_HW_ERROR_FATAL.iccm_ecc_unc.value <= 'h0; + end else if(field_combo.CPTRA_HW_ERROR_FATAL.iccm_ecc_unc.load_next) begin + field_storage.CPTRA_HW_ERROR_FATAL.iccm_ecc_unc.value <= field_combo.CPTRA_HW_ERROR_FATAL.iccm_ecc_unc.next; + end + end + assign hwif_out.CPTRA_HW_ERROR_FATAL.iccm_ecc_unc.value = field_storage.CPTRA_HW_ERROR_FATAL.iccm_ecc_unc.value; + // Field: soc_ifc_reg.CPTRA_HW_ERROR_FATAL.dccm_ecc_unc + always_comb begin + automatic logic [0:0] next_c = field_storage.CPTRA_HW_ERROR_FATAL.dccm_ecc_unc.value; + automatic logic load_next_c = '0; + if(decoded_reg_strb.CPTRA_HW_ERROR_FATAL && decoded_req_is_wr) begin // SW write 1 clear + next_c = field_storage.CPTRA_HW_ERROR_FATAL.dccm_ecc_unc.value & ~(decoded_wr_data[1:1] & decoded_wr_biten[1:1]); + load_next_c = '1; + end else if(hwif_in.CPTRA_HW_ERROR_FATAL.dccm_ecc_unc.we) begin // HW Write - we + next_c = hwif_in.CPTRA_HW_ERROR_FATAL.dccm_ecc_unc.next; + load_next_c = '1; + end + field_combo.CPTRA_HW_ERROR_FATAL.dccm_ecc_unc.next = next_c; + field_combo.CPTRA_HW_ERROR_FATAL.dccm_ecc_unc.load_next = load_next_c; + end + always_ff @(posedge clk or negedge hwif_in.cptra_pwrgood) begin + if(~hwif_in.cptra_pwrgood) begin + field_storage.CPTRA_HW_ERROR_FATAL.dccm_ecc_unc.value <= 'h0; + end else if(field_combo.CPTRA_HW_ERROR_FATAL.dccm_ecc_unc.load_next) begin + field_storage.CPTRA_HW_ERROR_FATAL.dccm_ecc_unc.value <= field_combo.CPTRA_HW_ERROR_FATAL.dccm_ecc_unc.next; + end + end + assign hwif_out.CPTRA_HW_ERROR_FATAL.dccm_ecc_unc.value = field_storage.CPTRA_HW_ERROR_FATAL.dccm_ecc_unc.value; + // Field: soc_ifc_reg.CPTRA_HW_ERROR_FATAL.nmi_pin + always_comb begin + automatic logic [0:0] next_c = field_storage.CPTRA_HW_ERROR_FATAL.nmi_pin.value; + automatic logic load_next_c = '0; + if(decoded_reg_strb.CPTRA_HW_ERROR_FATAL && decoded_req_is_wr) begin // SW write 1 clear + next_c = field_storage.CPTRA_HW_ERROR_FATAL.nmi_pin.value & ~(decoded_wr_data[2:2] & decoded_wr_biten[2:2]); + load_next_c = '1; + end else if(hwif_in.CPTRA_HW_ERROR_FATAL.nmi_pin.we) begin // HW Write - we + next_c = hwif_in.CPTRA_HW_ERROR_FATAL.nmi_pin.next; + load_next_c = '1; + end + field_combo.CPTRA_HW_ERROR_FATAL.nmi_pin.next = next_c; + field_combo.CPTRA_HW_ERROR_FATAL.nmi_pin.load_next = load_next_c; + end + always_ff @(posedge clk or negedge hwif_in.cptra_pwrgood) begin + if(~hwif_in.cptra_pwrgood) begin + field_storage.CPTRA_HW_ERROR_FATAL.nmi_pin.value <= 'h0; + end else if(field_combo.CPTRA_HW_ERROR_FATAL.nmi_pin.load_next) begin + field_storage.CPTRA_HW_ERROR_FATAL.nmi_pin.value <= field_combo.CPTRA_HW_ERROR_FATAL.nmi_pin.next; + end + end + assign hwif_out.CPTRA_HW_ERROR_FATAL.nmi_pin.value = field_storage.CPTRA_HW_ERROR_FATAL.nmi_pin.value; + // Field: soc_ifc_reg.CPTRA_HW_ERROR_NON_FATAL.mbox_prot_no_lock + always_comb begin + automatic logic [0:0] next_c = field_storage.CPTRA_HW_ERROR_NON_FATAL.mbox_prot_no_lock.value; + automatic logic load_next_c = '0; + if(decoded_reg_strb.CPTRA_HW_ERROR_NON_FATAL && decoded_req_is_wr) begin // SW write 1 clear + next_c = field_storage.CPTRA_HW_ERROR_NON_FATAL.mbox_prot_no_lock.value & ~(decoded_wr_data[0:0] & decoded_wr_biten[0:0]); + load_next_c = '1; + end else if(hwif_in.CPTRA_HW_ERROR_NON_FATAL.mbox_prot_no_lock.we) begin // HW Write - we + next_c = hwif_in.CPTRA_HW_ERROR_NON_FATAL.mbox_prot_no_lock.next; + load_next_c = '1; + end + field_combo.CPTRA_HW_ERROR_NON_FATAL.mbox_prot_no_lock.next = next_c; + field_combo.CPTRA_HW_ERROR_NON_FATAL.mbox_prot_no_lock.load_next = load_next_c; + end + always_ff @(posedge clk or negedge hwif_in.cptra_pwrgood) begin + if(~hwif_in.cptra_pwrgood) begin + field_storage.CPTRA_HW_ERROR_NON_FATAL.mbox_prot_no_lock.value <= 'h0; + end else if(field_combo.CPTRA_HW_ERROR_NON_FATAL.mbox_prot_no_lock.load_next) begin + field_storage.CPTRA_HW_ERROR_NON_FATAL.mbox_prot_no_lock.value <= field_combo.CPTRA_HW_ERROR_NON_FATAL.mbox_prot_no_lock.next; + end + end + assign hwif_out.CPTRA_HW_ERROR_NON_FATAL.mbox_prot_no_lock.value = field_storage.CPTRA_HW_ERROR_NON_FATAL.mbox_prot_no_lock.value; + // Field: soc_ifc_reg.CPTRA_HW_ERROR_NON_FATAL.mbox_prot_ooo + always_comb begin + automatic logic [0:0] next_c = field_storage.CPTRA_HW_ERROR_NON_FATAL.mbox_prot_ooo.value; + automatic logic load_next_c = '0; + if(decoded_reg_strb.CPTRA_HW_ERROR_NON_FATAL && decoded_req_is_wr) begin // SW write 1 clear + next_c = field_storage.CPTRA_HW_ERROR_NON_FATAL.mbox_prot_ooo.value & ~(decoded_wr_data[1:1] & decoded_wr_biten[1:1]); load_next_c = '1; - end else if(hwif_in.CPTRA_HW_ERROR_FATAL.error_code.we) begin // HW Write - we - next_c = hwif_in.CPTRA_HW_ERROR_FATAL.error_code.next; + end else if(hwif_in.CPTRA_HW_ERROR_NON_FATAL.mbox_prot_ooo.we) begin // HW Write - we + next_c = hwif_in.CPTRA_HW_ERROR_NON_FATAL.mbox_prot_ooo.next; load_next_c = '1; end - field_combo.CPTRA_HW_ERROR_FATAL.error_code.next = next_c; - field_combo.CPTRA_HW_ERROR_FATAL.error_code.load_next = load_next_c; + field_combo.CPTRA_HW_ERROR_NON_FATAL.mbox_prot_ooo.next = next_c; + field_combo.CPTRA_HW_ERROR_NON_FATAL.mbox_prot_ooo.load_next = load_next_c; end always_ff @(posedge clk or negedge hwif_in.cptra_pwrgood) begin if(~hwif_in.cptra_pwrgood) begin - field_storage.CPTRA_HW_ERROR_FATAL.error_code.value <= 'h0; - end else if(field_combo.CPTRA_HW_ERROR_FATAL.error_code.load_next) begin - field_storage.CPTRA_HW_ERROR_FATAL.error_code.value <= field_combo.CPTRA_HW_ERROR_FATAL.error_code.next; + field_storage.CPTRA_HW_ERROR_NON_FATAL.mbox_prot_ooo.value <= 'h0; + end else if(field_combo.CPTRA_HW_ERROR_NON_FATAL.mbox_prot_ooo.load_next) begin + field_storage.CPTRA_HW_ERROR_NON_FATAL.mbox_prot_ooo.value <= field_combo.CPTRA_HW_ERROR_NON_FATAL.mbox_prot_ooo.next; end end - assign hwif_out.CPTRA_HW_ERROR_FATAL.error_code.value = field_storage.CPTRA_HW_ERROR_FATAL.error_code.value; - // Field: soc_ifc_reg.CPTRA_HW_ERROR_NON_FATAL.error_code + assign hwif_out.CPTRA_HW_ERROR_NON_FATAL.mbox_prot_ooo.value = field_storage.CPTRA_HW_ERROR_NON_FATAL.mbox_prot_ooo.value; + // Field: soc_ifc_reg.CPTRA_HW_ERROR_NON_FATAL.mbox_ecc_unc always_comb begin - automatic logic [31:0] next_c = field_storage.CPTRA_HW_ERROR_NON_FATAL.error_code.value; + automatic logic [0:0] next_c = field_storage.CPTRA_HW_ERROR_NON_FATAL.mbox_ecc_unc.value; automatic logic load_next_c = '0; if(decoded_reg_strb.CPTRA_HW_ERROR_NON_FATAL && decoded_req_is_wr) begin // SW write 1 clear - next_c = field_storage.CPTRA_HW_ERROR_NON_FATAL.error_code.value & ~(decoded_wr_data[31:0] & decoded_wr_biten[31:0]); + next_c = field_storage.CPTRA_HW_ERROR_NON_FATAL.mbox_ecc_unc.value & ~(decoded_wr_data[2:2] & decoded_wr_biten[2:2]); load_next_c = '1; - end else if(hwif_in.CPTRA_HW_ERROR_NON_FATAL.error_code.we) begin // HW Write - we - next_c = hwif_in.CPTRA_HW_ERROR_NON_FATAL.error_code.next; + end else if(hwif_in.CPTRA_HW_ERROR_NON_FATAL.mbox_ecc_unc.we) begin // HW Write - we + next_c = hwif_in.CPTRA_HW_ERROR_NON_FATAL.mbox_ecc_unc.next; load_next_c = '1; end - field_combo.CPTRA_HW_ERROR_NON_FATAL.error_code.next = next_c; - field_combo.CPTRA_HW_ERROR_NON_FATAL.error_code.load_next = load_next_c; + field_combo.CPTRA_HW_ERROR_NON_FATAL.mbox_ecc_unc.next = next_c; + field_combo.CPTRA_HW_ERROR_NON_FATAL.mbox_ecc_unc.load_next = load_next_c; end always_ff @(posedge clk or negedge hwif_in.cptra_pwrgood) begin if(~hwif_in.cptra_pwrgood) begin - field_storage.CPTRA_HW_ERROR_NON_FATAL.error_code.value <= 'h0; - end else if(field_combo.CPTRA_HW_ERROR_NON_FATAL.error_code.load_next) begin - field_storage.CPTRA_HW_ERROR_NON_FATAL.error_code.value <= field_combo.CPTRA_HW_ERROR_NON_FATAL.error_code.next; + field_storage.CPTRA_HW_ERROR_NON_FATAL.mbox_ecc_unc.value <= 'h0; + end else if(field_combo.CPTRA_HW_ERROR_NON_FATAL.mbox_ecc_unc.load_next) begin + field_storage.CPTRA_HW_ERROR_NON_FATAL.mbox_ecc_unc.value <= field_combo.CPTRA_HW_ERROR_NON_FATAL.mbox_ecc_unc.next; end end - assign hwif_out.CPTRA_HW_ERROR_NON_FATAL.error_code.value = field_storage.CPTRA_HW_ERROR_NON_FATAL.error_code.value; + assign hwif_out.CPTRA_HW_ERROR_NON_FATAL.mbox_ecc_unc.value = field_storage.CPTRA_HW_ERROR_NON_FATAL.mbox_ecc_unc.value; // Field: soc_ifc_reg.CPTRA_FW_ERROR_FATAL.error_code always_comb begin automatic logic [31:0] next_c = field_storage.CPTRA_FW_ERROR_FATAL.error_code.value; @@ -1561,6 +2063,7 @@ module soc_ifc_reg ( end end assign hwif_out.CPTRA_FW_ERROR_FATAL.error_code.value = field_storage.CPTRA_FW_ERROR_FATAL.error_code.value; + assign hwif_out.CPTRA_FW_ERROR_FATAL.error_code.swmod = decoded_reg_strb.CPTRA_FW_ERROR_FATAL && decoded_req_is_wr; // Field: soc_ifc_reg.CPTRA_FW_ERROR_NON_FATAL.error_code always_comb begin automatic logic [31:0] next_c = field_storage.CPTRA_FW_ERROR_NON_FATAL.error_code.value; @@ -1583,6 +2086,7 @@ module soc_ifc_reg ( end end assign hwif_out.CPTRA_FW_ERROR_NON_FATAL.error_code.value = field_storage.CPTRA_FW_ERROR_NON_FATAL.error_code.value; + assign hwif_out.CPTRA_FW_ERROR_NON_FATAL.error_code.swmod = decoded_reg_strb.CPTRA_FW_ERROR_NON_FATAL && decoded_req_is_wr; // Field: soc_ifc_reg.CPTRA_HW_ERROR_ENC.error_code always_comb begin automatic logic [31:0] next_c = field_storage.CPTRA_HW_ERROR_ENC.error_code.value; @@ -1663,10 +2167,10 @@ module soc_ifc_reg ( assign hwif_out.CPTRA_BOOT_STATUS.status.value = field_storage.CPTRA_BOOT_STATUS.status.value; // Field: soc_ifc_reg.CPTRA_FLOW_STATUS.status always_comb begin - automatic logic [27:0] next_c = field_storage.CPTRA_FLOW_STATUS.status.value; + automatic logic [23:0] next_c = field_storage.CPTRA_FLOW_STATUS.status.value; automatic logic load_next_c = '0; if(decoded_reg_strb.CPTRA_FLOW_STATUS && decoded_req_is_wr && !(hwif_in.soc_req)) begin // SW write - next_c = (field_storage.CPTRA_FLOW_STATUS.status.value & ~decoded_wr_biten[27:0]) | (decoded_wr_data[27:0] & decoded_wr_biten[27:0]); + next_c = (field_storage.CPTRA_FLOW_STATUS.status.value & ~decoded_wr_biten[23:0]) | (decoded_wr_data[23:0] & decoded_wr_biten[23:0]); load_next_c = '1; end field_combo.CPTRA_FLOW_STATUS.status.next = next_c; @@ -1679,6 +2183,25 @@ module soc_ifc_reg ( field_storage.CPTRA_FLOW_STATUS.status.value <= field_combo.CPTRA_FLOW_STATUS.status.next; end end + // Field: soc_ifc_reg.CPTRA_FLOW_STATUS.idevid_csr_ready + always_comb begin + automatic logic [0:0] next_c = field_storage.CPTRA_FLOW_STATUS.idevid_csr_ready.value; + automatic logic load_next_c = '0; + if(decoded_reg_strb.CPTRA_FLOW_STATUS && decoded_req_is_wr && !(hwif_in.soc_req)) begin // SW write + next_c = (field_storage.CPTRA_FLOW_STATUS.idevid_csr_ready.value & ~decoded_wr_biten[24:24]) | (decoded_wr_data[24:24] & decoded_wr_biten[24:24]); + load_next_c = '1; + end + field_combo.CPTRA_FLOW_STATUS.idevid_csr_ready.next = next_c; + field_combo.CPTRA_FLOW_STATUS.idevid_csr_ready.load_next = load_next_c; + end + always_ff @(posedge clk or negedge hwif_in.cptra_rst_b) begin + if(~hwif_in.cptra_rst_b) begin + field_storage.CPTRA_FLOW_STATUS.idevid_csr_ready.value <= 'h0; + end else if(field_combo.CPTRA_FLOW_STATUS.idevid_csr_ready.load_next) begin + field_storage.CPTRA_FLOW_STATUS.idevid_csr_ready.value <= field_combo.CPTRA_FLOW_STATUS.idevid_csr_ready.next; + end + end + assign hwif_out.CPTRA_FLOW_STATUS.idevid_csr_ready.value = field_storage.CPTRA_FLOW_STATUS.idevid_csr_ready.value; // Field: soc_ifc_reg.CPTRA_FLOW_STATUS.ready_for_fw always_comb begin automatic logic [0:0] next_c = field_storage.CPTRA_FLOW_STATUS.ready_for_fw.value; @@ -1717,23 +2240,6 @@ module soc_ifc_reg ( end end assign hwif_out.CPTRA_FLOW_STATUS.ready_for_runtime.value = field_storage.CPTRA_FLOW_STATUS.ready_for_runtime.value; - // Field: soc_ifc_reg.CPTRA_FLOW_STATUS.ready_for_fuses - always_comb begin - automatic logic [0:0] next_c = field_storage.CPTRA_FLOW_STATUS.ready_for_fuses.value; - automatic logic load_next_c = '0; - if(1) begin // HW Write - next_c = hwif_in.CPTRA_FLOW_STATUS.ready_for_fuses.next; - load_next_c = '1; - end - field_combo.CPTRA_FLOW_STATUS.ready_for_fuses.next = next_c; - field_combo.CPTRA_FLOW_STATUS.ready_for_fuses.load_next = load_next_c; - end - always_ff @(posedge clk) begin - if(field_combo.CPTRA_FLOW_STATUS.ready_for_fuses.load_next) begin - field_storage.CPTRA_FLOW_STATUS.ready_for_fuses.value <= field_combo.CPTRA_FLOW_STATUS.ready_for_fuses.next; - end - end - assign hwif_out.CPTRA_FLOW_STATUS.ready_for_fuses.value = field_storage.CPTRA_FLOW_STATUS.ready_for_fuses.value; // Field: soc_ifc_reg.CPTRA_FLOW_STATUS.mailbox_flow_done always_comb begin automatic logic [0:0] next_c = field_storage.CPTRA_FLOW_STATUS.mailbox_flow_done.value; @@ -1879,6 +2385,9 @@ module soc_ifc_reg ( if(decoded_reg_strb.CPTRA_TRNG_DATA[i0] && decoded_req_is_wr && hwif_in.CPTRA_TRNG_DATA[i0].DATA.swwe) begin // SW write next_c = (field_storage.CPTRA_TRNG_DATA[i0].DATA.value & ~decoded_wr_biten[31:0]) | (decoded_wr_data[31:0] & decoded_wr_biten[31:0]); load_next_c = '1; + end else if(hwif_in.CPTRA_TRNG_DATA[i0].DATA.hwclr) begin // HW Clear + next_c = '0; + load_next_c = '1; end field_combo.CPTRA_TRNG_DATA[i0].DATA.next = next_c; field_combo.CPTRA_TRNG_DATA[i0].DATA.load_next = load_next_c; @@ -1892,6 +2401,28 @@ module soc_ifc_reg ( end assign hwif_out.CPTRA_TRNG_DATA[i0].DATA.swacc = decoded_reg_strb.CPTRA_TRNG_DATA[i0]; end + // Field: soc_ifc_reg.CPTRA_TRNG_CTRL.clear + always_comb begin + automatic logic [0:0] next_c = field_storage.CPTRA_TRNG_CTRL.clear.value; + automatic logic load_next_c = '0; + if(decoded_reg_strb.CPTRA_TRNG_CTRL && decoded_req_is_wr && !(hwif_in.soc_req)) begin // SW write + next_c = (field_storage.CPTRA_TRNG_CTRL.clear.value & ~decoded_wr_biten[0:0]) | (decoded_wr_data[0:0] & decoded_wr_biten[0:0]); + load_next_c = '1; + end else if(1) begin // singlepulse clears back to 0 + next_c = '0; + load_next_c = '1; + end + field_combo.CPTRA_TRNG_CTRL.clear.next = next_c; + field_combo.CPTRA_TRNG_CTRL.clear.load_next = load_next_c; + end + always_ff @(posedge clk or negedge hwif_in.cptra_rst_b) begin + if(~hwif_in.cptra_rst_b) begin + field_storage.CPTRA_TRNG_CTRL.clear.value <= 'h0; + end else if(field_combo.CPTRA_TRNG_CTRL.clear.load_next) begin + field_storage.CPTRA_TRNG_CTRL.clear.value <= field_combo.CPTRA_TRNG_CTRL.clear.next; + end + end + assign hwif_out.CPTRA_TRNG_CTRL.clear.value = field_storage.CPTRA_TRNG_CTRL.clear.value; // Field: soc_ifc_reg.CPTRA_TRNG_STATUS.DATA_REQ always_comb begin automatic logic [0:0] next_c = field_storage.CPTRA_TRNG_STATUS.DATA_REQ.value; @@ -2075,7 +2606,6 @@ module soc_ifc_reg ( end assign hwif_out.CPTRA_GENERIC_OUTPUT_WIRES[i0].generic_wires.value = field_storage.CPTRA_GENERIC_OUTPUT_WIRES[i0].generic_wires.value; end - assign hwif_out.CPTRA_HW_REV_ID.REV_ID.value = 'h1; for(genvar i0=0; i0<2; i0++) begin // Field: soc_ifc_reg.CPTRA_FW_REV_ID[].REV_ID always_comb begin @@ -2265,6 +2795,156 @@ module soc_ifc_reg ( end end assign hwif_out.CPTRA_WDT_STATUS.t2_timeout.value = field_storage.CPTRA_WDT_STATUS.t2_timeout.value; + // Field: soc_ifc_reg.CPTRA_FUSE_VALID_PAUSER.PAUSER + always_comb begin + automatic logic [31:0] next_c = field_storage.CPTRA_FUSE_VALID_PAUSER.PAUSER.value; + automatic logic load_next_c = '0; + if(decoded_reg_strb.CPTRA_FUSE_VALID_PAUSER && decoded_req_is_wr && !(hwif_in.CPTRA_FUSE_VALID_PAUSER.PAUSER.swwel)) begin // SW write + next_c = (field_storage.CPTRA_FUSE_VALID_PAUSER.PAUSER.value & ~decoded_wr_biten[31:0]) | (decoded_wr_data[31:0] & decoded_wr_biten[31:0]); + load_next_c = '1; + end + field_combo.CPTRA_FUSE_VALID_PAUSER.PAUSER.next = next_c; + field_combo.CPTRA_FUSE_VALID_PAUSER.PAUSER.load_next = load_next_c; + end + always_ff @(posedge clk or negedge hwif_in.cptra_pwrgood) begin + if(~hwif_in.cptra_pwrgood) begin + field_storage.CPTRA_FUSE_VALID_PAUSER.PAUSER.value <= 'hffffffff; + end else if(field_combo.CPTRA_FUSE_VALID_PAUSER.PAUSER.load_next) begin + field_storage.CPTRA_FUSE_VALID_PAUSER.PAUSER.value <= field_combo.CPTRA_FUSE_VALID_PAUSER.PAUSER.next; + end + end + assign hwif_out.CPTRA_FUSE_VALID_PAUSER.PAUSER.value = field_storage.CPTRA_FUSE_VALID_PAUSER.PAUSER.value; + // Field: soc_ifc_reg.CPTRA_FUSE_PAUSER_LOCK.LOCK + always_comb begin + automatic logic [0:0] next_c = field_storage.CPTRA_FUSE_PAUSER_LOCK.LOCK.value; + automatic logic load_next_c = '0; + if(decoded_reg_strb.CPTRA_FUSE_PAUSER_LOCK && decoded_req_is_wr && !(hwif_in.CPTRA_FUSE_PAUSER_LOCK.LOCK.swwel)) begin // SW write + next_c = (field_storage.CPTRA_FUSE_PAUSER_LOCK.LOCK.value & ~decoded_wr_biten[0:0]) | (decoded_wr_data[0:0] & decoded_wr_biten[0:0]); + load_next_c = '1; + end + field_combo.CPTRA_FUSE_PAUSER_LOCK.LOCK.next = next_c; + field_combo.CPTRA_FUSE_PAUSER_LOCK.LOCK.load_next = load_next_c; + end + always_ff @(posedge clk or negedge hwif_in.cptra_pwrgood) begin + if(~hwif_in.cptra_pwrgood) begin + field_storage.CPTRA_FUSE_PAUSER_LOCK.LOCK.value <= 'h0; + end else if(field_combo.CPTRA_FUSE_PAUSER_LOCK.LOCK.load_next) begin + field_storage.CPTRA_FUSE_PAUSER_LOCK.LOCK.value <= field_combo.CPTRA_FUSE_PAUSER_LOCK.LOCK.next; + end + end + assign hwif_out.CPTRA_FUSE_PAUSER_LOCK.LOCK.value = field_storage.CPTRA_FUSE_PAUSER_LOCK.LOCK.value; + for(genvar i0=0; i0<2; i0++) begin + // Field: soc_ifc_reg.CPTRA_WDT_CFG[].TIMEOUT + always_comb begin + automatic logic [31:0] next_c = field_storage.CPTRA_WDT_CFG[i0].TIMEOUT.value; + automatic logic load_next_c = '0; + if(decoded_reg_strb.CPTRA_WDT_CFG[i0] && decoded_req_is_wr) begin // SW write + next_c = (field_storage.CPTRA_WDT_CFG[i0].TIMEOUT.value & ~decoded_wr_biten[31:0]) | (decoded_wr_data[31:0] & decoded_wr_biten[31:0]); + load_next_c = '1; + end + field_combo.CPTRA_WDT_CFG[i0].TIMEOUT.next = next_c; + field_combo.CPTRA_WDT_CFG[i0].TIMEOUT.load_next = load_next_c; + end + always_ff @(posedge clk or negedge hwif_in.cptra_pwrgood) begin + if(~hwif_in.cptra_pwrgood) begin + field_storage.CPTRA_WDT_CFG[i0].TIMEOUT.value <= 'h0; + end else if(field_combo.CPTRA_WDT_CFG[i0].TIMEOUT.load_next) begin + field_storage.CPTRA_WDT_CFG[i0].TIMEOUT.value <= field_combo.CPTRA_WDT_CFG[i0].TIMEOUT.next; + end + end + end + // Field: soc_ifc_reg.CPTRA_iTRNG_ENTROPY_CONFIG_0.low_threshold + always_comb begin + automatic logic [15:0] next_c = field_storage.CPTRA_iTRNG_ENTROPY_CONFIG_0.low_threshold.value; + automatic logic load_next_c = '0; + if(decoded_reg_strb.CPTRA_iTRNG_ENTROPY_CONFIG_0 && decoded_req_is_wr) begin // SW write + next_c = (field_storage.CPTRA_iTRNG_ENTROPY_CONFIG_0.low_threshold.value & ~decoded_wr_biten[15:0]) | (decoded_wr_data[15:0] & decoded_wr_biten[15:0]); + load_next_c = '1; + end + field_combo.CPTRA_iTRNG_ENTROPY_CONFIG_0.low_threshold.next = next_c; + field_combo.CPTRA_iTRNG_ENTROPY_CONFIG_0.low_threshold.load_next = load_next_c; + end + always_ff @(posedge clk or negedge hwif_in.cptra_rst_b) begin + if(~hwif_in.cptra_rst_b) begin + field_storage.CPTRA_iTRNG_ENTROPY_CONFIG_0.low_threshold.value <= 'h0; + end else if(field_combo.CPTRA_iTRNG_ENTROPY_CONFIG_0.low_threshold.load_next) begin + field_storage.CPTRA_iTRNG_ENTROPY_CONFIG_0.low_threshold.value <= field_combo.CPTRA_iTRNG_ENTROPY_CONFIG_0.low_threshold.next; + end + end + // Field: soc_ifc_reg.CPTRA_iTRNG_ENTROPY_CONFIG_0.high_threshold + always_comb begin + automatic logic [15:0] next_c = field_storage.CPTRA_iTRNG_ENTROPY_CONFIG_0.high_threshold.value; + automatic logic load_next_c = '0; + if(decoded_reg_strb.CPTRA_iTRNG_ENTROPY_CONFIG_0 && decoded_req_is_wr) begin // SW write + next_c = (field_storage.CPTRA_iTRNG_ENTROPY_CONFIG_0.high_threshold.value & ~decoded_wr_biten[31:16]) | (decoded_wr_data[31:16] & decoded_wr_biten[31:16]); + load_next_c = '1; + end + field_combo.CPTRA_iTRNG_ENTROPY_CONFIG_0.high_threshold.next = next_c; + field_combo.CPTRA_iTRNG_ENTROPY_CONFIG_0.high_threshold.load_next = load_next_c; + end + always_ff @(posedge clk or negedge hwif_in.cptra_rst_b) begin + if(~hwif_in.cptra_rst_b) begin + field_storage.CPTRA_iTRNG_ENTROPY_CONFIG_0.high_threshold.value <= 'h0; + end else if(field_combo.CPTRA_iTRNG_ENTROPY_CONFIG_0.high_threshold.load_next) begin + field_storage.CPTRA_iTRNG_ENTROPY_CONFIG_0.high_threshold.value <= field_combo.CPTRA_iTRNG_ENTROPY_CONFIG_0.high_threshold.next; + end + end + // Field: soc_ifc_reg.CPTRA_iTRNG_ENTROPY_CONFIG_1.repetition_count + always_comb begin + automatic logic [15:0] next_c = field_storage.CPTRA_iTRNG_ENTROPY_CONFIG_1.repetition_count.value; + automatic logic load_next_c = '0; + if(decoded_reg_strb.CPTRA_iTRNG_ENTROPY_CONFIG_1 && decoded_req_is_wr) begin // SW write + next_c = (field_storage.CPTRA_iTRNG_ENTROPY_CONFIG_1.repetition_count.value & ~decoded_wr_biten[15:0]) | (decoded_wr_data[15:0] & decoded_wr_biten[15:0]); + load_next_c = '1; + end + field_combo.CPTRA_iTRNG_ENTROPY_CONFIG_1.repetition_count.next = next_c; + field_combo.CPTRA_iTRNG_ENTROPY_CONFIG_1.repetition_count.load_next = load_next_c; + end + always_ff @(posedge clk or negedge hwif_in.cptra_rst_b) begin + if(~hwif_in.cptra_rst_b) begin + field_storage.CPTRA_iTRNG_ENTROPY_CONFIG_1.repetition_count.value <= 'h0; + end else if(field_combo.CPTRA_iTRNG_ENTROPY_CONFIG_1.repetition_count.load_next) begin + field_storage.CPTRA_iTRNG_ENTROPY_CONFIG_1.repetition_count.value <= field_combo.CPTRA_iTRNG_ENTROPY_CONFIG_1.repetition_count.next; + end + end + // Field: soc_ifc_reg.CPTRA_iTRNG_ENTROPY_CONFIG_1.RSVD + always_comb begin + automatic logic [15:0] next_c = field_storage.CPTRA_iTRNG_ENTROPY_CONFIG_1.RSVD.value; + automatic logic load_next_c = '0; + if(decoded_reg_strb.CPTRA_iTRNG_ENTROPY_CONFIG_1 && decoded_req_is_wr) begin // SW write + next_c = (field_storage.CPTRA_iTRNG_ENTROPY_CONFIG_1.RSVD.value & ~decoded_wr_biten[31:16]) | (decoded_wr_data[31:16] & decoded_wr_biten[31:16]); + load_next_c = '1; + end + field_combo.CPTRA_iTRNG_ENTROPY_CONFIG_1.RSVD.next = next_c; + field_combo.CPTRA_iTRNG_ENTROPY_CONFIG_1.RSVD.load_next = load_next_c; + end + always_ff @(posedge clk or negedge hwif_in.cptra_rst_b) begin + if(~hwif_in.cptra_rst_b) begin + field_storage.CPTRA_iTRNG_ENTROPY_CONFIG_1.RSVD.value <= 'h0; + end else if(field_combo.CPTRA_iTRNG_ENTROPY_CONFIG_1.RSVD.load_next) begin + field_storage.CPTRA_iTRNG_ENTROPY_CONFIG_1.RSVD.value <= field_combo.CPTRA_iTRNG_ENTROPY_CONFIG_1.RSVD.next; + end + end + for(genvar i0=0; i0<2; i0++) begin + // Field: soc_ifc_reg.CPTRA_RSVD_REG[].RSVD + always_comb begin + automatic logic [31:0] next_c = field_storage.CPTRA_RSVD_REG[i0].RSVD.value; + automatic logic load_next_c = '0; + if(decoded_reg_strb.CPTRA_RSVD_REG[i0] && decoded_req_is_wr) begin // SW write + next_c = (field_storage.CPTRA_RSVD_REG[i0].RSVD.value & ~decoded_wr_biten[31:0]) | (decoded_wr_data[31:0] & decoded_wr_biten[31:0]); + load_next_c = '1; + end + field_combo.CPTRA_RSVD_REG[i0].RSVD.next = next_c; + field_combo.CPTRA_RSVD_REG[i0].RSVD.load_next = load_next_c; + end + always_ff @(posedge clk or negedge hwif_in.cptra_rst_b) begin + if(~hwif_in.cptra_rst_b) begin + field_storage.CPTRA_RSVD_REG[i0].RSVD.value <= 'h0; + end else if(field_combo.CPTRA_RSVD_REG[i0].RSVD.load_next) begin + field_storage.CPTRA_RSVD_REG[i0].RSVD.value <= field_combo.CPTRA_RSVD_REG[i0].RSVD.next; + end + end + end for(genvar i0=0; i0<12; i0++) begin // Field: soc_ifc_reg.fuse_uds_seed[].seed always_comb begin @@ -2473,134 +3153,438 @@ module soc_ifc_reg ( field_storage.fuse_idevid_manuf_hsm_id[i0].hsm_id.value <= field_combo.fuse_idevid_manuf_hsm_id[i0].hsm_id.next; end end - assign hwif_out.fuse_idevid_manuf_hsm_id[i0].hsm_id.value = field_storage.fuse_idevid_manuf_hsm_id[i0].hsm_id.value; + assign hwif_out.fuse_idevid_manuf_hsm_id[i0].hsm_id.value = field_storage.fuse_idevid_manuf_hsm_id[i0].hsm_id.value; + end + // Field: soc_ifc_reg.fuse_life_cycle.life_cycle + always_comb begin + automatic logic [1:0] next_c = field_storage.fuse_life_cycle.life_cycle.value; + automatic logic load_next_c = '0; + if(decoded_reg_strb.fuse_life_cycle && decoded_req_is_wr && !(hwif_in.fuse_life_cycle.life_cycle.swwel)) begin // SW write + next_c = (field_storage.fuse_life_cycle.life_cycle.value & ~decoded_wr_biten[1:0]) | (decoded_wr_data[1:0] & decoded_wr_biten[1:0]); + load_next_c = '1; + end + field_combo.fuse_life_cycle.life_cycle.next = next_c; + field_combo.fuse_life_cycle.life_cycle.load_next = load_next_c; + end + always_ff @(posedge clk or negedge hwif_in.cptra_pwrgood) begin + if(~hwif_in.cptra_pwrgood) begin + field_storage.fuse_life_cycle.life_cycle.value <= 'h0; + end else if(field_combo.fuse_life_cycle.life_cycle.load_next) begin + field_storage.fuse_life_cycle.life_cycle.value <= field_combo.fuse_life_cycle.life_cycle.next; + end + end + assign hwif_out.fuse_life_cycle.life_cycle.value = field_storage.fuse_life_cycle.life_cycle.value; + // Field: soc_ifc_reg.fuse_lms_verify.lms_verify + always_comb begin + automatic logic [0:0] next_c = field_storage.fuse_lms_verify.lms_verify.value; + automatic logic load_next_c = '0; + if(decoded_reg_strb.fuse_lms_verify && decoded_req_is_wr && !(hwif_in.fuse_lms_verify.lms_verify.swwel)) begin // SW write + next_c = (field_storage.fuse_lms_verify.lms_verify.value & ~decoded_wr_biten[0:0]) | (decoded_wr_data[0:0] & decoded_wr_biten[0:0]); + load_next_c = '1; + end + field_combo.fuse_lms_verify.lms_verify.next = next_c; + field_combo.fuse_lms_verify.lms_verify.load_next = load_next_c; + end + always_ff @(posedge clk or negedge hwif_in.cptra_pwrgood) begin + if(~hwif_in.cptra_pwrgood) begin + field_storage.fuse_lms_verify.lms_verify.value <= 'h0; + end else if(field_combo.fuse_lms_verify.lms_verify.load_next) begin + field_storage.fuse_lms_verify.lms_verify.value <= field_combo.fuse_lms_verify.lms_verify.next; + end + end + assign hwif_out.fuse_lms_verify.lms_verify.value = field_storage.fuse_lms_verify.lms_verify.value; + // Field: soc_ifc_reg.fuse_lms_revocation.lms_revocation + always_comb begin + automatic logic [31:0] next_c = field_storage.fuse_lms_revocation.lms_revocation.value; + automatic logic load_next_c = '0; + if(decoded_reg_strb.fuse_lms_revocation && decoded_req_is_wr && !(hwif_in.fuse_lms_revocation.lms_revocation.swwel)) begin // SW write + next_c = (field_storage.fuse_lms_revocation.lms_revocation.value & ~decoded_wr_biten[31:0]) | (decoded_wr_data[31:0] & decoded_wr_biten[31:0]); + load_next_c = '1; + end + field_combo.fuse_lms_revocation.lms_revocation.next = next_c; + field_combo.fuse_lms_revocation.lms_revocation.load_next = load_next_c; + end + always_ff @(posedge clk or negedge hwif_in.cptra_pwrgood) begin + if(~hwif_in.cptra_pwrgood) begin + field_storage.fuse_lms_revocation.lms_revocation.value <= 'h0; + end else if(field_combo.fuse_lms_revocation.lms_revocation.load_next) begin + field_storage.fuse_lms_revocation.lms_revocation.value <= field_combo.fuse_lms_revocation.lms_revocation.next; + end + end + assign hwif_out.fuse_lms_revocation.lms_revocation.value = field_storage.fuse_lms_revocation.lms_revocation.value; + // Field: soc_ifc_reg.fuse_soc_stepping_id.soc_stepping_id + always_comb begin + automatic logic [15:0] next_c = field_storage.fuse_soc_stepping_id.soc_stepping_id.value; + automatic logic load_next_c = '0; + if(decoded_reg_strb.fuse_soc_stepping_id && decoded_req_is_wr && !(hwif_in.fuse_soc_stepping_id.soc_stepping_id.swwel)) begin // SW write + next_c = (field_storage.fuse_soc_stepping_id.soc_stepping_id.value & ~decoded_wr_biten[15:0]) | (decoded_wr_data[15:0] & decoded_wr_biten[15:0]); + load_next_c = '1; + end + field_combo.fuse_soc_stepping_id.soc_stepping_id.next = next_c; + field_combo.fuse_soc_stepping_id.soc_stepping_id.load_next = load_next_c; + end + always_ff @(posedge clk or negedge hwif_in.cptra_pwrgood) begin + if(~hwif_in.cptra_pwrgood) begin + field_storage.fuse_soc_stepping_id.soc_stepping_id.value <= 'h0; + end else if(field_combo.fuse_soc_stepping_id.soc_stepping_id.load_next) begin + field_storage.fuse_soc_stepping_id.soc_stepping_id.value <= field_combo.fuse_soc_stepping_id.soc_stepping_id.next; + end + end + assign hwif_out.fuse_soc_stepping_id.soc_stepping_id.value = field_storage.fuse_soc_stepping_id.soc_stepping_id.value; + for(genvar i0=0; i0<8; i0++) begin + // Field: soc_ifc_reg.internal_obf_key[].key + always_comb begin + automatic logic [31:0] next_c = field_storage.internal_obf_key[i0].key.value; + automatic logic load_next_c = '0; + if(decoded_reg_strb.internal_obf_key[i0] && decoded_req_is_wr && hwif_in.internal_obf_key[i0].key.swwe) begin // SW write + next_c = (field_storage.internal_obf_key[i0].key.value & ~decoded_wr_biten[31:0]) | (decoded_wr_data[31:0] & decoded_wr_biten[31:0]); + load_next_c = '1; + end else if(!hwif_in.internal_obf_key[i0].key.wel) begin // HW Write - wel + next_c = hwif_in.internal_obf_key[i0].key.next; + load_next_c = '1; + end else if(hwif_in.internal_obf_key[i0].key.hwclr) begin // HW Clear + next_c = '0; + load_next_c = '1; + end + field_combo.internal_obf_key[i0].key.next = next_c; + field_combo.internal_obf_key[i0].key.load_next = load_next_c; + end + always_ff @(posedge clk) begin + if(field_combo.internal_obf_key[i0].key.load_next) begin + field_storage.internal_obf_key[i0].key.value <= field_combo.internal_obf_key[i0].key.next; + end + end + assign hwif_out.internal_obf_key[i0].key.value = field_storage.internal_obf_key[i0].key.value; + end + // Field: soc_ifc_reg.internal_iccm_lock.lock + always_comb begin + automatic logic [0:0] next_c = field_storage.internal_iccm_lock.lock.value; + automatic logic load_next_c = '0; + if(hwif_in.internal_iccm_lock.lock.hwclr) begin // HW Clear + next_c = '0; + load_next_c = '1; + end else if(decoded_reg_strb.internal_iccm_lock && decoded_req_is_wr && !(hwif_in.soc_req)) begin // SW write 1 set + next_c = field_storage.internal_iccm_lock.lock.value | (decoded_wr_data[0:0] & decoded_wr_biten[0:0]); + load_next_c = '1; + end + field_combo.internal_iccm_lock.lock.next = next_c; + field_combo.internal_iccm_lock.lock.load_next = load_next_c; + end + always_ff @(posedge clk or negedge hwif_in.cptra_rst_b) begin + if(~hwif_in.cptra_rst_b) begin + field_storage.internal_iccm_lock.lock.value <= 'h0; + end else if(field_combo.internal_iccm_lock.lock.load_next) begin + field_storage.internal_iccm_lock.lock.value <= field_combo.internal_iccm_lock.lock.next; + end + end + assign hwif_out.internal_iccm_lock.lock.value = field_storage.internal_iccm_lock.lock.value; + // Field: soc_ifc_reg.internal_fw_update_reset.core_rst + always_comb begin + automatic logic [0:0] next_c = field_storage.internal_fw_update_reset.core_rst.value; + automatic logic load_next_c = '0; + if(decoded_reg_strb.internal_fw_update_reset && decoded_req_is_wr && !(hwif_in.soc_req)) begin // SW write + next_c = (field_storage.internal_fw_update_reset.core_rst.value & ~decoded_wr_biten[0:0]) | (decoded_wr_data[0:0] & decoded_wr_biten[0:0]); + load_next_c = '1; + end else if(1) begin // singlepulse clears back to 0 + next_c = '0; + load_next_c = '1; + end + field_combo.internal_fw_update_reset.core_rst.next = next_c; + field_combo.internal_fw_update_reset.core_rst.load_next = load_next_c; + end + always_ff @(posedge clk or negedge hwif_in.cptra_rst_b) begin + if(~hwif_in.cptra_rst_b) begin + field_storage.internal_fw_update_reset.core_rst.value <= 'h0; + end else if(field_combo.internal_fw_update_reset.core_rst.load_next) begin + field_storage.internal_fw_update_reset.core_rst.value <= field_combo.internal_fw_update_reset.core_rst.next; + end + end + assign hwif_out.internal_fw_update_reset.core_rst.value = field_storage.internal_fw_update_reset.core_rst.value; + // Field: soc_ifc_reg.internal_fw_update_reset_wait_cycles.wait_cycles + always_comb begin + automatic logic [7:0] next_c = field_storage.internal_fw_update_reset_wait_cycles.wait_cycles.value; + automatic logic load_next_c = '0; + if(decoded_reg_strb.internal_fw_update_reset_wait_cycles && decoded_req_is_wr && !(hwif_in.soc_req)) begin // SW write + next_c = (field_storage.internal_fw_update_reset_wait_cycles.wait_cycles.value & ~decoded_wr_biten[7:0]) | (decoded_wr_data[7:0] & decoded_wr_biten[7:0]); + load_next_c = '1; + end + field_combo.internal_fw_update_reset_wait_cycles.wait_cycles.next = next_c; + field_combo.internal_fw_update_reset_wait_cycles.wait_cycles.load_next = load_next_c; + end + always_ff @(posedge clk or negedge hwif_in.cptra_rst_b) begin + if(~hwif_in.cptra_rst_b) begin + field_storage.internal_fw_update_reset_wait_cycles.wait_cycles.value <= 'h5; + end else if(field_combo.internal_fw_update_reset_wait_cycles.wait_cycles.load_next) begin + field_storage.internal_fw_update_reset_wait_cycles.wait_cycles.value <= field_combo.internal_fw_update_reset_wait_cycles.wait_cycles.next; + end + end + assign hwif_out.internal_fw_update_reset_wait_cycles.wait_cycles.value = field_storage.internal_fw_update_reset_wait_cycles.wait_cycles.value; + // Field: soc_ifc_reg.internal_nmi_vector.vec + always_comb begin + automatic logic [31:0] next_c = field_storage.internal_nmi_vector.vec.value; + automatic logic load_next_c = '0; + if(decoded_reg_strb.internal_nmi_vector && decoded_req_is_wr && !(hwif_in.soc_req)) begin // SW write + next_c = (field_storage.internal_nmi_vector.vec.value & ~decoded_wr_biten[31:0]) | (decoded_wr_data[31:0] & decoded_wr_biten[31:0]); + load_next_c = '1; + end + field_combo.internal_nmi_vector.vec.next = next_c; + field_combo.internal_nmi_vector.vec.load_next = load_next_c; + end + always_ff @(posedge clk or negedge hwif_in.cptra_rst_b) begin + if(~hwif_in.cptra_rst_b) begin + field_storage.internal_nmi_vector.vec.value <= 'h0; + end else if(field_combo.internal_nmi_vector.vec.load_next) begin + field_storage.internal_nmi_vector.vec.value <= field_combo.internal_nmi_vector.vec.next; + end + end + assign hwif_out.internal_nmi_vector.vec.value = field_storage.internal_nmi_vector.vec.value; + // Field: soc_ifc_reg.internal_hw_error_fatal_mask.mask_iccm_ecc_unc + always_comb begin + automatic logic [0:0] next_c = field_storage.internal_hw_error_fatal_mask.mask_iccm_ecc_unc.value; + automatic logic load_next_c = '0; + if(decoded_reg_strb.internal_hw_error_fatal_mask && decoded_req_is_wr && !(hwif_in.soc_req)) begin // SW write + next_c = (field_storage.internal_hw_error_fatal_mask.mask_iccm_ecc_unc.value & ~decoded_wr_biten[0:0]) | (decoded_wr_data[0:0] & decoded_wr_biten[0:0]); + load_next_c = '1; + end + field_combo.internal_hw_error_fatal_mask.mask_iccm_ecc_unc.next = next_c; + field_combo.internal_hw_error_fatal_mask.mask_iccm_ecc_unc.load_next = load_next_c; + end + always_ff @(posedge clk or negedge hwif_in.cptra_rst_b) begin + if(~hwif_in.cptra_rst_b) begin + field_storage.internal_hw_error_fatal_mask.mask_iccm_ecc_unc.value <= 'h0; + end else if(field_combo.internal_hw_error_fatal_mask.mask_iccm_ecc_unc.load_next) begin + field_storage.internal_hw_error_fatal_mask.mask_iccm_ecc_unc.value <= field_combo.internal_hw_error_fatal_mask.mask_iccm_ecc_unc.next; + end + end + assign hwif_out.internal_hw_error_fatal_mask.mask_iccm_ecc_unc.value = field_storage.internal_hw_error_fatal_mask.mask_iccm_ecc_unc.value; + // Field: soc_ifc_reg.internal_hw_error_fatal_mask.mask_dccm_ecc_unc + always_comb begin + automatic logic [0:0] next_c = field_storage.internal_hw_error_fatal_mask.mask_dccm_ecc_unc.value; + automatic logic load_next_c = '0; + if(decoded_reg_strb.internal_hw_error_fatal_mask && decoded_req_is_wr && !(hwif_in.soc_req)) begin // SW write + next_c = (field_storage.internal_hw_error_fatal_mask.mask_dccm_ecc_unc.value & ~decoded_wr_biten[1:1]) | (decoded_wr_data[1:1] & decoded_wr_biten[1:1]); + load_next_c = '1; + end + field_combo.internal_hw_error_fatal_mask.mask_dccm_ecc_unc.next = next_c; + field_combo.internal_hw_error_fatal_mask.mask_dccm_ecc_unc.load_next = load_next_c; + end + always_ff @(posedge clk or negedge hwif_in.cptra_rst_b) begin + if(~hwif_in.cptra_rst_b) begin + field_storage.internal_hw_error_fatal_mask.mask_dccm_ecc_unc.value <= 'h0; + end else if(field_combo.internal_hw_error_fatal_mask.mask_dccm_ecc_unc.load_next) begin + field_storage.internal_hw_error_fatal_mask.mask_dccm_ecc_unc.value <= field_combo.internal_hw_error_fatal_mask.mask_dccm_ecc_unc.next; + end + end + assign hwif_out.internal_hw_error_fatal_mask.mask_dccm_ecc_unc.value = field_storage.internal_hw_error_fatal_mask.mask_dccm_ecc_unc.value; + // Field: soc_ifc_reg.internal_hw_error_fatal_mask.mask_nmi_pin + always_comb begin + automatic logic [0:0] next_c = field_storage.internal_hw_error_fatal_mask.mask_nmi_pin.value; + automatic logic load_next_c = '0; + if(decoded_reg_strb.internal_hw_error_fatal_mask && decoded_req_is_wr && !(hwif_in.soc_req)) begin // SW write + next_c = (field_storage.internal_hw_error_fatal_mask.mask_nmi_pin.value & ~decoded_wr_biten[2:2]) | (decoded_wr_data[2:2] & decoded_wr_biten[2:2]); + load_next_c = '1; + end + field_combo.internal_hw_error_fatal_mask.mask_nmi_pin.next = next_c; + field_combo.internal_hw_error_fatal_mask.mask_nmi_pin.load_next = load_next_c; + end + always_ff @(posedge clk or negedge hwif_in.cptra_rst_b) begin + if(~hwif_in.cptra_rst_b) begin + field_storage.internal_hw_error_fatal_mask.mask_nmi_pin.value <= 'h0; + end else if(field_combo.internal_hw_error_fatal_mask.mask_nmi_pin.load_next) begin + field_storage.internal_hw_error_fatal_mask.mask_nmi_pin.value <= field_combo.internal_hw_error_fatal_mask.mask_nmi_pin.next; + end + end + assign hwif_out.internal_hw_error_fatal_mask.mask_nmi_pin.value = field_storage.internal_hw_error_fatal_mask.mask_nmi_pin.value; + // Field: soc_ifc_reg.internal_hw_error_non_fatal_mask.mask_mbox_prot_no_lock + always_comb begin + automatic logic [0:0] next_c = field_storage.internal_hw_error_non_fatal_mask.mask_mbox_prot_no_lock.value; + automatic logic load_next_c = '0; + if(decoded_reg_strb.internal_hw_error_non_fatal_mask && decoded_req_is_wr && !(hwif_in.soc_req)) begin // SW write + next_c = (field_storage.internal_hw_error_non_fatal_mask.mask_mbox_prot_no_lock.value & ~decoded_wr_biten[0:0]) | (decoded_wr_data[0:0] & decoded_wr_biten[0:0]); + load_next_c = '1; + end + field_combo.internal_hw_error_non_fatal_mask.mask_mbox_prot_no_lock.next = next_c; + field_combo.internal_hw_error_non_fatal_mask.mask_mbox_prot_no_lock.load_next = load_next_c; + end + always_ff @(posedge clk or negedge hwif_in.cptra_rst_b) begin + if(~hwif_in.cptra_rst_b) begin + field_storage.internal_hw_error_non_fatal_mask.mask_mbox_prot_no_lock.value <= 'h0; + end else if(field_combo.internal_hw_error_non_fatal_mask.mask_mbox_prot_no_lock.load_next) begin + field_storage.internal_hw_error_non_fatal_mask.mask_mbox_prot_no_lock.value <= field_combo.internal_hw_error_non_fatal_mask.mask_mbox_prot_no_lock.next; + end + end + assign hwif_out.internal_hw_error_non_fatal_mask.mask_mbox_prot_no_lock.value = field_storage.internal_hw_error_non_fatal_mask.mask_mbox_prot_no_lock.value; + // Field: soc_ifc_reg.internal_hw_error_non_fatal_mask.mask_mbox_prot_ooo + always_comb begin + automatic logic [0:0] next_c = field_storage.internal_hw_error_non_fatal_mask.mask_mbox_prot_ooo.value; + automatic logic load_next_c = '0; + if(decoded_reg_strb.internal_hw_error_non_fatal_mask && decoded_req_is_wr && !(hwif_in.soc_req)) begin // SW write + next_c = (field_storage.internal_hw_error_non_fatal_mask.mask_mbox_prot_ooo.value & ~decoded_wr_biten[1:1]) | (decoded_wr_data[1:1] & decoded_wr_biten[1:1]); + load_next_c = '1; + end + field_combo.internal_hw_error_non_fatal_mask.mask_mbox_prot_ooo.next = next_c; + field_combo.internal_hw_error_non_fatal_mask.mask_mbox_prot_ooo.load_next = load_next_c; + end + always_ff @(posedge clk or negedge hwif_in.cptra_rst_b) begin + if(~hwif_in.cptra_rst_b) begin + field_storage.internal_hw_error_non_fatal_mask.mask_mbox_prot_ooo.value <= 'h0; + end else if(field_combo.internal_hw_error_non_fatal_mask.mask_mbox_prot_ooo.load_next) begin + field_storage.internal_hw_error_non_fatal_mask.mask_mbox_prot_ooo.value <= field_combo.internal_hw_error_non_fatal_mask.mask_mbox_prot_ooo.next; + end + end + assign hwif_out.internal_hw_error_non_fatal_mask.mask_mbox_prot_ooo.value = field_storage.internal_hw_error_non_fatal_mask.mask_mbox_prot_ooo.value; + // Field: soc_ifc_reg.internal_hw_error_non_fatal_mask.mask_mbox_ecc_unc + always_comb begin + automatic logic [0:0] next_c = field_storage.internal_hw_error_non_fatal_mask.mask_mbox_ecc_unc.value; + automatic logic load_next_c = '0; + if(decoded_reg_strb.internal_hw_error_non_fatal_mask && decoded_req_is_wr && !(hwif_in.soc_req)) begin // SW write + next_c = (field_storage.internal_hw_error_non_fatal_mask.mask_mbox_ecc_unc.value & ~decoded_wr_biten[2:2]) | (decoded_wr_data[2:2] & decoded_wr_biten[2:2]); + load_next_c = '1; + end + field_combo.internal_hw_error_non_fatal_mask.mask_mbox_ecc_unc.next = next_c; + field_combo.internal_hw_error_non_fatal_mask.mask_mbox_ecc_unc.load_next = load_next_c; + end + always_ff @(posedge clk or negedge hwif_in.cptra_rst_b) begin + if(~hwif_in.cptra_rst_b) begin + field_storage.internal_hw_error_non_fatal_mask.mask_mbox_ecc_unc.value <= 'h0; + end else if(field_combo.internal_hw_error_non_fatal_mask.mask_mbox_ecc_unc.load_next) begin + field_storage.internal_hw_error_non_fatal_mask.mask_mbox_ecc_unc.value <= field_combo.internal_hw_error_non_fatal_mask.mask_mbox_ecc_unc.next; + end end - // Field: soc_ifc_reg.fuse_life_cycle.life_cycle + assign hwif_out.internal_hw_error_non_fatal_mask.mask_mbox_ecc_unc.value = field_storage.internal_hw_error_non_fatal_mask.mask_mbox_ecc_unc.value; + // Field: soc_ifc_reg.internal_fw_error_fatal_mask.mask always_comb begin - automatic logic [1:0] next_c = field_storage.fuse_life_cycle.life_cycle.value; + automatic logic [31:0] next_c = field_storage.internal_fw_error_fatal_mask.mask.value; automatic logic load_next_c = '0; - if(decoded_reg_strb.fuse_life_cycle && decoded_req_is_wr && !(hwif_in.fuse_life_cycle.life_cycle.swwel)) begin // SW write - next_c = (field_storage.fuse_life_cycle.life_cycle.value & ~decoded_wr_biten[1:0]) | (decoded_wr_data[1:0] & decoded_wr_biten[1:0]); + if(decoded_reg_strb.internal_fw_error_fatal_mask && decoded_req_is_wr && !(hwif_in.soc_req)) begin // SW write + next_c = (field_storage.internal_fw_error_fatal_mask.mask.value & ~decoded_wr_biten[31:0]) | (decoded_wr_data[31:0] & decoded_wr_biten[31:0]); load_next_c = '1; end - field_combo.fuse_life_cycle.life_cycle.next = next_c; - field_combo.fuse_life_cycle.life_cycle.load_next = load_next_c; + field_combo.internal_fw_error_fatal_mask.mask.next = next_c; + field_combo.internal_fw_error_fatal_mask.mask.load_next = load_next_c; end - always_ff @(posedge clk or negedge hwif_in.cptra_pwrgood) begin - if(~hwif_in.cptra_pwrgood) begin - field_storage.fuse_life_cycle.life_cycle.value <= 'h0; - end else if(field_combo.fuse_life_cycle.life_cycle.load_next) begin - field_storage.fuse_life_cycle.life_cycle.value <= field_combo.fuse_life_cycle.life_cycle.next; + always_ff @(posedge clk or negedge hwif_in.cptra_rst_b) begin + if(~hwif_in.cptra_rst_b) begin + field_storage.internal_fw_error_fatal_mask.mask.value <= 'h0; + end else if(field_combo.internal_fw_error_fatal_mask.mask.load_next) begin + field_storage.internal_fw_error_fatal_mask.mask.value <= field_combo.internal_fw_error_fatal_mask.mask.next; end end - assign hwif_out.fuse_life_cycle.life_cycle.value = field_storage.fuse_life_cycle.life_cycle.value; - for(genvar i0=0; i0<8; i0++) begin - // Field: soc_ifc_reg.internal_obf_key[].key - always_comb begin - automatic logic [31:0] next_c = field_storage.internal_obf_key[i0].key.value; - automatic logic load_next_c = '0; - if(decoded_reg_strb.internal_obf_key[i0] && decoded_req_is_wr && hwif_in.internal_obf_key[i0].key.swwe) begin // SW write - next_c = (field_storage.internal_obf_key[i0].key.value & ~decoded_wr_biten[31:0]) | (decoded_wr_data[31:0] & decoded_wr_biten[31:0]); - load_next_c = '1; - end else if(!hwif_in.internal_obf_key[i0].key.wel) begin // HW Write - wel - next_c = hwif_in.internal_obf_key[i0].key.next; - load_next_c = '1; - end else if(hwif_in.internal_obf_key[i0].key.hwclr) begin // HW Clear - next_c = '0; - load_next_c = '1; - end - field_combo.internal_obf_key[i0].key.next = next_c; - field_combo.internal_obf_key[i0].key.load_next = load_next_c; + assign hwif_out.internal_fw_error_fatal_mask.mask.value = field_storage.internal_fw_error_fatal_mask.mask.value; + // Field: soc_ifc_reg.internal_fw_error_non_fatal_mask.mask + always_comb begin + automatic logic [31:0] next_c = field_storage.internal_fw_error_non_fatal_mask.mask.value; + automatic logic load_next_c = '0; + if(decoded_reg_strb.internal_fw_error_non_fatal_mask && decoded_req_is_wr && !(hwif_in.soc_req)) begin // SW write + next_c = (field_storage.internal_fw_error_non_fatal_mask.mask.value & ~decoded_wr_biten[31:0]) | (decoded_wr_data[31:0] & decoded_wr_biten[31:0]); + load_next_c = '1; end - always_ff @(posedge clk) begin - if(field_combo.internal_obf_key[i0].key.load_next) begin - field_storage.internal_obf_key[i0].key.value <= field_combo.internal_obf_key[i0].key.next; - end + field_combo.internal_fw_error_non_fatal_mask.mask.next = next_c; + field_combo.internal_fw_error_non_fatal_mask.mask.load_next = load_next_c; + end + always_ff @(posedge clk or negedge hwif_in.cptra_rst_b) begin + if(~hwif_in.cptra_rst_b) begin + field_storage.internal_fw_error_non_fatal_mask.mask.value <= 'h0; + end else if(field_combo.internal_fw_error_non_fatal_mask.mask.load_next) begin + field_storage.internal_fw_error_non_fatal_mask.mask.value <= field_combo.internal_fw_error_non_fatal_mask.mask.next; end - assign hwif_out.internal_obf_key[i0].key.value = field_storage.internal_obf_key[i0].key.value; end - // Field: soc_ifc_reg.internal_iccm_lock.lock + assign hwif_out.internal_fw_error_non_fatal_mask.mask.value = field_storage.internal_fw_error_non_fatal_mask.mask.value; + // Field: soc_ifc_reg.internal_rv_mtime_l.count_l always_comb begin - automatic logic [0:0] next_c = field_storage.internal_iccm_lock.lock.value; + automatic logic [31:0] next_c = field_storage.internal_rv_mtime_l.count_l.value; automatic logic load_next_c = '0; - if(hwif_in.internal_iccm_lock.lock.hwclr) begin // HW Clear - next_c = '0; + if(decoded_reg_strb.internal_rv_mtime_l && decoded_req_is_wr && !(hwif_in.soc_req)) begin // SW write + next_c = (field_storage.internal_rv_mtime_l.count_l.value & ~decoded_wr_biten[31:0]) | (decoded_wr_data[31:0] & decoded_wr_biten[31:0]); load_next_c = '1; - end else if(decoded_reg_strb.internal_iccm_lock && decoded_req_is_wr && !(hwif_in.soc_req)) begin // SW write 1 set - next_c = field_storage.internal_iccm_lock.lock.value | (decoded_wr_data[0:0] & decoded_wr_biten[0:0]); + end + if(hwif_in.internal_rv_mtime_l.count_l.incr) begin // increment + field_combo.internal_rv_mtime_l.count_l.overflow = (((33)'(next_c) + 'h1) > 'hffffffff); + next_c = next_c + 'h1; load_next_c = '1; + end else begin + field_combo.internal_rv_mtime_l.count_l.overflow = '0; end - field_combo.internal_iccm_lock.lock.next = next_c; - field_combo.internal_iccm_lock.lock.load_next = load_next_c; + field_combo.internal_rv_mtime_l.count_l.incrthreshold = (field_storage.internal_rv_mtime_l.count_l.value >= 'hffffffff); + field_combo.internal_rv_mtime_l.count_l.next = next_c; + field_combo.internal_rv_mtime_l.count_l.load_next = load_next_c; end - always_ff @(posedge clk or negedge hwif_in.cptra_rst_b) begin - if(~hwif_in.cptra_rst_b) begin - field_storage.internal_iccm_lock.lock.value <= 'h0; - end else if(field_combo.internal_iccm_lock.lock.load_next) begin - field_storage.internal_iccm_lock.lock.value <= field_combo.internal_iccm_lock.lock.next; + always_ff @(posedge clk or negedge hwif_in.cptra_pwrgood) begin + if(~hwif_in.cptra_pwrgood) begin + field_storage.internal_rv_mtime_l.count_l.value <= 'h0; + end else if(field_combo.internal_rv_mtime_l.count_l.load_next) begin + field_storage.internal_rv_mtime_l.count_l.value <= field_combo.internal_rv_mtime_l.count_l.next; end end - assign hwif_out.internal_iccm_lock.lock.value = field_storage.internal_iccm_lock.lock.value; - // Field: soc_ifc_reg.internal_fw_update_reset.core_rst + assign hwif_out.internal_rv_mtime_l.count_l.value = field_storage.internal_rv_mtime_l.count_l.value; + assign hwif_out.internal_rv_mtime_l.count_l.swmod = decoded_reg_strb.internal_rv_mtime_l && decoded_req_is_wr; + assign hwif_out.internal_rv_mtime_l.count_l.overflow = field_combo.internal_rv_mtime_l.count_l.overflow; + // Field: soc_ifc_reg.internal_rv_mtime_h.count_h always_comb begin - automatic logic [0:0] next_c = field_storage.internal_fw_update_reset.core_rst.value; + automatic logic [31:0] next_c = field_storage.internal_rv_mtime_h.count_h.value; automatic logic load_next_c = '0; - if(decoded_reg_strb.internal_fw_update_reset && decoded_req_is_wr && !(hwif_in.soc_req)) begin // SW write - next_c = (field_storage.internal_fw_update_reset.core_rst.value & ~decoded_wr_biten[0:0]) | (decoded_wr_data[0:0] & decoded_wr_biten[0:0]); + if(decoded_reg_strb.internal_rv_mtime_h && decoded_req_is_wr && !(hwif_in.soc_req)) begin // SW write + next_c = (field_storage.internal_rv_mtime_h.count_h.value & ~decoded_wr_biten[31:0]) | (decoded_wr_data[31:0] & decoded_wr_biten[31:0]); load_next_c = '1; - end else if(1) begin // singlepulse clears back to 0 - next_c = '0; + end + if(hwif_in.internal_rv_mtime_h.count_h.incr) begin // increment + field_combo.internal_rv_mtime_h.count_h.overflow = (((33)'(next_c) + 'h1) > 'hffffffff); + next_c = next_c + 'h1; load_next_c = '1; + end else begin + field_combo.internal_rv_mtime_h.count_h.overflow = '0; end - field_combo.internal_fw_update_reset.core_rst.next = next_c; - field_combo.internal_fw_update_reset.core_rst.load_next = load_next_c; + field_combo.internal_rv_mtime_h.count_h.incrthreshold = (field_storage.internal_rv_mtime_h.count_h.value >= 'hffffffff); + field_combo.internal_rv_mtime_h.count_h.next = next_c; + field_combo.internal_rv_mtime_h.count_h.load_next = load_next_c; end - always_ff @(posedge clk or negedge hwif_in.cptra_rst_b) begin - if(~hwif_in.cptra_rst_b) begin - field_storage.internal_fw_update_reset.core_rst.value <= 'h0; - end else if(field_combo.internal_fw_update_reset.core_rst.load_next) begin - field_storage.internal_fw_update_reset.core_rst.value <= field_combo.internal_fw_update_reset.core_rst.next; + always_ff @(posedge clk or negedge hwif_in.cptra_pwrgood) begin + if(~hwif_in.cptra_pwrgood) begin + field_storage.internal_rv_mtime_h.count_h.value <= 'h0; + end else if(field_combo.internal_rv_mtime_h.count_h.load_next) begin + field_storage.internal_rv_mtime_h.count_h.value <= field_combo.internal_rv_mtime_h.count_h.next; end end - assign hwif_out.internal_fw_update_reset.core_rst.value = field_storage.internal_fw_update_reset.core_rst.value; - // Field: soc_ifc_reg.internal_fw_update_reset_wait_cycles.wait_cycles + assign hwif_out.internal_rv_mtime_h.count_h.value = field_storage.internal_rv_mtime_h.count_h.value; + assign hwif_out.internal_rv_mtime_h.count_h.swmod = decoded_reg_strb.internal_rv_mtime_h && decoded_req_is_wr; + // Field: soc_ifc_reg.internal_rv_mtimecmp_l.compare_l always_comb begin - automatic logic [7:0] next_c = field_storage.internal_fw_update_reset_wait_cycles.wait_cycles.value; + automatic logic [31:0] next_c = field_storage.internal_rv_mtimecmp_l.compare_l.value; automatic logic load_next_c = '0; - if(decoded_reg_strb.internal_fw_update_reset_wait_cycles && decoded_req_is_wr && !(hwif_in.soc_req)) begin // SW write - next_c = (field_storage.internal_fw_update_reset_wait_cycles.wait_cycles.value & ~decoded_wr_biten[7:0]) | (decoded_wr_data[7:0] & decoded_wr_biten[7:0]); + if(decoded_reg_strb.internal_rv_mtimecmp_l && decoded_req_is_wr && !(hwif_in.soc_req)) begin // SW write + next_c = (field_storage.internal_rv_mtimecmp_l.compare_l.value & ~decoded_wr_biten[31:0]) | (decoded_wr_data[31:0] & decoded_wr_biten[31:0]); load_next_c = '1; end - field_combo.internal_fw_update_reset_wait_cycles.wait_cycles.next = next_c; - field_combo.internal_fw_update_reset_wait_cycles.wait_cycles.load_next = load_next_c; + field_combo.internal_rv_mtimecmp_l.compare_l.next = next_c; + field_combo.internal_rv_mtimecmp_l.compare_l.load_next = load_next_c; end - always_ff @(posedge clk or negedge hwif_in.cptra_rst_b) begin - if(~hwif_in.cptra_rst_b) begin - field_storage.internal_fw_update_reset_wait_cycles.wait_cycles.value <= 'h5; - end else if(field_combo.internal_fw_update_reset_wait_cycles.wait_cycles.load_next) begin - field_storage.internal_fw_update_reset_wait_cycles.wait_cycles.value <= field_combo.internal_fw_update_reset_wait_cycles.wait_cycles.next; + always_ff @(posedge clk or negedge hwif_in.cptra_pwrgood) begin + if(~hwif_in.cptra_pwrgood) begin + field_storage.internal_rv_mtimecmp_l.compare_l.value <= 'h0; + end else if(field_combo.internal_rv_mtimecmp_l.compare_l.load_next) begin + field_storage.internal_rv_mtimecmp_l.compare_l.value <= field_combo.internal_rv_mtimecmp_l.compare_l.next; end end - assign hwif_out.internal_fw_update_reset_wait_cycles.wait_cycles.value = field_storage.internal_fw_update_reset_wait_cycles.wait_cycles.value; - // Field: soc_ifc_reg.internal_nmi_vector.vec + assign hwif_out.internal_rv_mtimecmp_l.compare_l.value = field_storage.internal_rv_mtimecmp_l.compare_l.value; + // Field: soc_ifc_reg.internal_rv_mtimecmp_h.compare_h always_comb begin - automatic logic [31:0] next_c = field_storage.internal_nmi_vector.vec.value; + automatic logic [31:0] next_c = field_storage.internal_rv_mtimecmp_h.compare_h.value; automatic logic load_next_c = '0; - if(decoded_reg_strb.internal_nmi_vector && decoded_req_is_wr && !(hwif_in.soc_req)) begin // SW write - next_c = (field_storage.internal_nmi_vector.vec.value & ~decoded_wr_biten[31:0]) | (decoded_wr_data[31:0] & decoded_wr_biten[31:0]); + if(decoded_reg_strb.internal_rv_mtimecmp_h && decoded_req_is_wr && !(hwif_in.soc_req)) begin // SW write + next_c = (field_storage.internal_rv_mtimecmp_h.compare_h.value & ~decoded_wr_biten[31:0]) | (decoded_wr_data[31:0] & decoded_wr_biten[31:0]); load_next_c = '1; end - field_combo.internal_nmi_vector.vec.next = next_c; - field_combo.internal_nmi_vector.vec.load_next = load_next_c; + field_combo.internal_rv_mtimecmp_h.compare_h.next = next_c; + field_combo.internal_rv_mtimecmp_h.compare_h.load_next = load_next_c; end - always_ff @(posedge clk or negedge hwif_in.cptra_rst_b) begin - if(~hwif_in.cptra_rst_b) begin - field_storage.internal_nmi_vector.vec.value <= 'h0; - end else if(field_combo.internal_nmi_vector.vec.load_next) begin - field_storage.internal_nmi_vector.vec.value <= field_combo.internal_nmi_vector.vec.next; + always_ff @(posedge clk or negedge hwif_in.cptra_pwrgood) begin + if(~hwif_in.cptra_pwrgood) begin + field_storage.internal_rv_mtimecmp_h.compare_h.value <= 'h0; + end else if(field_combo.internal_rv_mtimecmp_h.compare_h.load_next) begin + field_storage.internal_rv_mtimecmp_h.compare_h.value <= field_combo.internal_rv_mtimecmp_h.compare_h.next; end end - assign hwif_out.internal_nmi_vector.vec.value = field_storage.internal_nmi_vector.vec.value; + assign hwif_out.internal_rv_mtimecmp_h.compare_h.value = field_storage.internal_rv_mtimecmp_h.compare_h.value; // Field: soc_ifc_reg.intr_block_rf.global_intr_en_r.error_en always_comb begin automatic logic [0:0] next_c = field_storage.intr_block_rf.global_intr_en_r.error_en.value; @@ -2835,12 +3819,30 @@ module soc_ifc_reg ( field_storage.intr_block_rf.notif_intr_en_r.notif_debug_locked_en.value <= field_combo.intr_block_rf.notif_intr_en_r.notif_debug_locked_en.next; end end + // Field: soc_ifc_reg.intr_block_rf.notif_intr_en_r.notif_scan_mode_en + always_comb begin + automatic logic [0:0] next_c = field_storage.intr_block_rf.notif_intr_en_r.notif_scan_mode_en.value; + automatic logic load_next_c = '0; + if(decoded_reg_strb.intr_block_rf.notif_intr_en_r && decoded_req_is_wr && !(hwif_in.soc_req)) begin // SW write + next_c = (field_storage.intr_block_rf.notif_intr_en_r.notif_scan_mode_en.value & ~decoded_wr_biten[3:3]) | (decoded_wr_data[3:3] & decoded_wr_biten[3:3]); + load_next_c = '1; + end + field_combo.intr_block_rf.notif_intr_en_r.notif_scan_mode_en.next = next_c; + field_combo.intr_block_rf.notif_intr_en_r.notif_scan_mode_en.load_next = load_next_c; + end + always_ff @(posedge clk or negedge hwif_in.cptra_rst_b) begin + if(~hwif_in.cptra_rst_b) begin + field_storage.intr_block_rf.notif_intr_en_r.notif_scan_mode_en.value <= 'h0; + end else if(field_combo.intr_block_rf.notif_intr_en_r.notif_scan_mode_en.load_next) begin + field_storage.intr_block_rf.notif_intr_en_r.notif_scan_mode_en.value <= field_combo.intr_block_rf.notif_intr_en_r.notif_scan_mode_en.next; + end + end // Field: soc_ifc_reg.intr_block_rf.notif_intr_en_r.notif_soc_req_lock_en always_comb begin automatic logic [0:0] next_c = field_storage.intr_block_rf.notif_intr_en_r.notif_soc_req_lock_en.value; automatic logic load_next_c = '0; if(decoded_reg_strb.intr_block_rf.notif_intr_en_r && decoded_req_is_wr && !(hwif_in.soc_req)) begin // SW write - next_c = (field_storage.intr_block_rf.notif_intr_en_r.notif_soc_req_lock_en.value & ~decoded_wr_biten[3:3]) | (decoded_wr_data[3:3] & decoded_wr_biten[3:3]); + next_c = (field_storage.intr_block_rf.notif_intr_en_r.notif_soc_req_lock_en.value & ~decoded_wr_biten[4:4]) | (decoded_wr_data[4:4] & decoded_wr_biten[4:4]); load_next_c = '1; end field_combo.intr_block_rf.notif_intr_en_r.notif_soc_req_lock_en.next = next_c; @@ -2853,6 +3855,24 @@ module soc_ifc_reg ( field_storage.intr_block_rf.notif_intr_en_r.notif_soc_req_lock_en.value <= field_combo.intr_block_rf.notif_intr_en_r.notif_soc_req_lock_en.next; end end + // Field: soc_ifc_reg.intr_block_rf.notif_intr_en_r.notif_gen_in_toggle_en + always_comb begin + automatic logic [0:0] next_c = field_storage.intr_block_rf.notif_intr_en_r.notif_gen_in_toggle_en.value; + automatic logic load_next_c = '0; + if(decoded_reg_strb.intr_block_rf.notif_intr_en_r && decoded_req_is_wr && !(hwif_in.soc_req)) begin // SW write + next_c = (field_storage.intr_block_rf.notif_intr_en_r.notif_gen_in_toggle_en.value & ~decoded_wr_biten[5:5]) | (decoded_wr_data[5:5] & decoded_wr_biten[5:5]); + load_next_c = '1; + end + field_combo.intr_block_rf.notif_intr_en_r.notif_gen_in_toggle_en.next = next_c; + field_combo.intr_block_rf.notif_intr_en_r.notif_gen_in_toggle_en.load_next = load_next_c; + end + always_ff @(posedge clk or negedge hwif_in.cptra_rst_b) begin + if(~hwif_in.cptra_rst_b) begin + field_storage.intr_block_rf.notif_intr_en_r.notif_gen_in_toggle_en.value <= 'h0; + end else if(field_combo.intr_block_rf.notif_intr_en_r.notif_gen_in_toggle_en.load_next) begin + field_storage.intr_block_rf.notif_intr_en_r.notif_gen_in_toggle_en.value <= field_combo.intr_block_rf.notif_intr_en_r.notif_gen_in_toggle_en.next; + end + end // Field: soc_ifc_reg.intr_block_rf.error_global_intr_r.agg_sts always_comb begin automatic logic [0:0] next_c = field_storage.intr_block_rf.error_global_intr_r.agg_sts.value; @@ -3166,6 +4186,30 @@ module soc_ifc_reg ( field_storage.intr_block_rf.notif_internal_intr_r.notif_debug_locked_sts.value <= field_combo.intr_block_rf.notif_internal_intr_r.notif_debug_locked_sts.next; end end + // Field: soc_ifc_reg.intr_block_rf.notif_internal_intr_r.notif_scan_mode_sts + always_comb begin + automatic logic [0:0] next_c = field_storage.intr_block_rf.notif_internal_intr_r.notif_scan_mode_sts.value; + automatic logic load_next_c = '0; + if(field_storage.intr_block_rf.notif_intr_trig_r.notif_scan_mode_trig.value) begin // stickybit + next_c = field_storage.intr_block_rf.notif_internal_intr_r.notif_scan_mode_sts.value | field_storage.intr_block_rf.notif_intr_trig_r.notif_scan_mode_trig.value; + load_next_c = '1; + end else if(hwif_in.intr_block_rf.notif_internal_intr_r.notif_scan_mode_sts.hwset) begin // HW Set + next_c = '1; + load_next_c = '1; + end else if(decoded_reg_strb.intr_block_rf.notif_internal_intr_r && decoded_req_is_wr && !(hwif_in.soc_req)) begin // SW write 1 clear + next_c = field_storage.intr_block_rf.notif_internal_intr_r.notif_scan_mode_sts.value & ~(decoded_wr_data[3:3] & decoded_wr_biten[3:3]); + load_next_c = '1; + end + field_combo.intr_block_rf.notif_internal_intr_r.notif_scan_mode_sts.next = next_c; + field_combo.intr_block_rf.notif_internal_intr_r.notif_scan_mode_sts.load_next = load_next_c; + end + always_ff @(posedge clk or negedge hwif_in.cptra_rst_b) begin + if(~hwif_in.cptra_rst_b) begin + field_storage.intr_block_rf.notif_internal_intr_r.notif_scan_mode_sts.value <= 'h0; + end else if(field_combo.intr_block_rf.notif_internal_intr_r.notif_scan_mode_sts.load_next) begin + field_storage.intr_block_rf.notif_internal_intr_r.notif_scan_mode_sts.value <= field_combo.intr_block_rf.notif_internal_intr_r.notif_scan_mode_sts.next; + end + end // Field: soc_ifc_reg.intr_block_rf.notif_internal_intr_r.notif_soc_req_lock_sts always_comb begin automatic logic [0:0] next_c = field_storage.intr_block_rf.notif_internal_intr_r.notif_soc_req_lock_sts.value; @@ -3177,7 +4221,7 @@ module soc_ifc_reg ( next_c = '1; load_next_c = '1; end else if(decoded_reg_strb.intr_block_rf.notif_internal_intr_r && decoded_req_is_wr && !(hwif_in.soc_req)) begin // SW write 1 clear - next_c = field_storage.intr_block_rf.notif_internal_intr_r.notif_soc_req_lock_sts.value & ~(decoded_wr_data[3:3] & decoded_wr_biten[3:3]); + next_c = field_storage.intr_block_rf.notif_internal_intr_r.notif_soc_req_lock_sts.value & ~(decoded_wr_data[4:4] & decoded_wr_biten[4:4]); load_next_c = '1; end field_combo.intr_block_rf.notif_internal_intr_r.notif_soc_req_lock_sts.next = next_c; @@ -3190,11 +4234,37 @@ module soc_ifc_reg ( field_storage.intr_block_rf.notif_internal_intr_r.notif_soc_req_lock_sts.value <= field_combo.intr_block_rf.notif_internal_intr_r.notif_soc_req_lock_sts.next; end end + // Field: soc_ifc_reg.intr_block_rf.notif_internal_intr_r.notif_gen_in_toggle_sts + always_comb begin + automatic logic [0:0] next_c = field_storage.intr_block_rf.notif_internal_intr_r.notif_gen_in_toggle_sts.value; + automatic logic load_next_c = '0; + if(field_storage.intr_block_rf.notif_intr_trig_r.notif_gen_in_toggle_trig.value) begin // stickybit + next_c = field_storage.intr_block_rf.notif_internal_intr_r.notif_gen_in_toggle_sts.value | field_storage.intr_block_rf.notif_intr_trig_r.notif_gen_in_toggle_trig.value; + load_next_c = '1; + end else if(hwif_in.intr_block_rf.notif_internal_intr_r.notif_gen_in_toggle_sts.hwset) begin // HW Set + next_c = '1; + load_next_c = '1; + end else if(decoded_reg_strb.intr_block_rf.notif_internal_intr_r && decoded_req_is_wr && !(hwif_in.soc_req)) begin // SW write 1 clear + next_c = field_storage.intr_block_rf.notif_internal_intr_r.notif_gen_in_toggle_sts.value & ~(decoded_wr_data[5:5] & decoded_wr_biten[5:5]); + load_next_c = '1; + end + field_combo.intr_block_rf.notif_internal_intr_r.notif_gen_in_toggle_sts.next = next_c; + field_combo.intr_block_rf.notif_internal_intr_r.notif_gen_in_toggle_sts.load_next = load_next_c; + end + always_ff @(posedge clk or negedge hwif_in.cptra_rst_b) begin + if(~hwif_in.cptra_rst_b) begin + field_storage.intr_block_rf.notif_internal_intr_r.notif_gen_in_toggle_sts.value <= 'h0; + end else if(field_combo.intr_block_rf.notif_internal_intr_r.notif_gen_in_toggle_sts.load_next) begin + field_storage.intr_block_rf.notif_internal_intr_r.notif_gen_in_toggle_sts.value <= field_combo.intr_block_rf.notif_internal_intr_r.notif_gen_in_toggle_sts.next; + end + end assign hwif_out.intr_block_rf.notif_internal_intr_r.intr = |(field_storage.intr_block_rf.notif_internal_intr_r.notif_cmd_avail_sts.value & field_storage.intr_block_rf.notif_intr_en_r.notif_cmd_avail_en.value) || |(field_storage.intr_block_rf.notif_internal_intr_r.notif_mbox_ecc_cor_sts.value & field_storage.intr_block_rf.notif_intr_en_r.notif_mbox_ecc_cor_en.value) || |(field_storage.intr_block_rf.notif_internal_intr_r.notif_debug_locked_sts.value & field_storage.intr_block_rf.notif_intr_en_r.notif_debug_locked_en.value) - || |(field_storage.intr_block_rf.notif_internal_intr_r.notif_soc_req_lock_sts.value & field_storage.intr_block_rf.notif_intr_en_r.notif_soc_req_lock_en.value); + || |(field_storage.intr_block_rf.notif_internal_intr_r.notif_scan_mode_sts.value & field_storage.intr_block_rf.notif_intr_en_r.notif_scan_mode_en.value) + || |(field_storage.intr_block_rf.notif_internal_intr_r.notif_soc_req_lock_sts.value & field_storage.intr_block_rf.notif_intr_en_r.notif_soc_req_lock_en.value) + || |(field_storage.intr_block_rf.notif_internal_intr_r.notif_gen_in_toggle_sts.value & field_storage.intr_block_rf.notif_intr_en_r.notif_gen_in_toggle_en.value); // Field: soc_ifc_reg.intr_block_rf.error_intr_trig_r.error_internal_trig always_comb begin automatic logic [0:0] next_c = field_storage.intr_block_rf.error_intr_trig_r.error_internal_trig.value; @@ -3426,12 +4496,33 @@ module soc_ifc_reg ( field_storage.intr_block_rf.notif_intr_trig_r.notif_debug_locked_trig.value <= field_combo.intr_block_rf.notif_intr_trig_r.notif_debug_locked_trig.next; end end + // Field: soc_ifc_reg.intr_block_rf.notif_intr_trig_r.notif_scan_mode_trig + always_comb begin + automatic logic [0:0] next_c = field_storage.intr_block_rf.notif_intr_trig_r.notif_scan_mode_trig.value; + automatic logic load_next_c = '0; + if(decoded_reg_strb.intr_block_rf.notif_intr_trig_r && decoded_req_is_wr && !(hwif_in.soc_req)) begin // SW write 1 set + next_c = field_storage.intr_block_rf.notif_intr_trig_r.notif_scan_mode_trig.value | (decoded_wr_data[3:3] & decoded_wr_biten[3:3]); + load_next_c = '1; + end else if(1) begin // singlepulse clears back to 0 + next_c = '0; + load_next_c = '1; + end + field_combo.intr_block_rf.notif_intr_trig_r.notif_scan_mode_trig.next = next_c; + field_combo.intr_block_rf.notif_intr_trig_r.notif_scan_mode_trig.load_next = load_next_c; + end + always_ff @(posedge clk or negedge hwif_in.cptra_rst_b) begin + if(~hwif_in.cptra_rst_b) begin + field_storage.intr_block_rf.notif_intr_trig_r.notif_scan_mode_trig.value <= 'h0; + end else if(field_combo.intr_block_rf.notif_intr_trig_r.notif_scan_mode_trig.load_next) begin + field_storage.intr_block_rf.notif_intr_trig_r.notif_scan_mode_trig.value <= field_combo.intr_block_rf.notif_intr_trig_r.notif_scan_mode_trig.next; + end + end // Field: soc_ifc_reg.intr_block_rf.notif_intr_trig_r.notif_soc_req_lock_trig always_comb begin automatic logic [0:0] next_c = field_storage.intr_block_rf.notif_intr_trig_r.notif_soc_req_lock_trig.value; automatic logic load_next_c = '0; if(decoded_reg_strb.intr_block_rf.notif_intr_trig_r && decoded_req_is_wr && !(hwif_in.soc_req)) begin // SW write 1 set - next_c = field_storage.intr_block_rf.notif_intr_trig_r.notif_soc_req_lock_trig.value | (decoded_wr_data[3:3] & decoded_wr_biten[3:3]); + next_c = field_storage.intr_block_rf.notif_intr_trig_r.notif_soc_req_lock_trig.value | (decoded_wr_data[4:4] & decoded_wr_biten[4:4]); load_next_c = '1; end else if(1) begin // singlepulse clears back to 0 next_c = '0; @@ -3447,6 +4538,27 @@ module soc_ifc_reg ( field_storage.intr_block_rf.notif_intr_trig_r.notif_soc_req_lock_trig.value <= field_combo.intr_block_rf.notif_intr_trig_r.notif_soc_req_lock_trig.next; end end + // Field: soc_ifc_reg.intr_block_rf.notif_intr_trig_r.notif_gen_in_toggle_trig + always_comb begin + automatic logic [0:0] next_c = field_storage.intr_block_rf.notif_intr_trig_r.notif_gen_in_toggle_trig.value; + automatic logic load_next_c = '0; + if(decoded_reg_strb.intr_block_rf.notif_intr_trig_r && decoded_req_is_wr && !(hwif_in.soc_req)) begin // SW write 1 set + next_c = field_storage.intr_block_rf.notif_intr_trig_r.notif_gen_in_toggle_trig.value | (decoded_wr_data[5:5] & decoded_wr_biten[5:5]); + load_next_c = '1; + end else if(1) begin // singlepulse clears back to 0 + next_c = '0; + load_next_c = '1; + end + field_combo.intr_block_rf.notif_intr_trig_r.notif_gen_in_toggle_trig.next = next_c; + field_combo.intr_block_rf.notif_intr_trig_r.notif_gen_in_toggle_trig.load_next = load_next_c; + end + always_ff @(posedge clk or negedge hwif_in.cptra_rst_b) begin + if(~hwif_in.cptra_rst_b) begin + field_storage.intr_block_rf.notif_intr_trig_r.notif_gen_in_toggle_trig.value <= 'h0; + end else if(field_combo.intr_block_rf.notif_intr_trig_r.notif_gen_in_toggle_trig.load_next) begin + field_storage.intr_block_rf.notif_intr_trig_r.notif_gen_in_toggle_trig.value <= field_combo.intr_block_rf.notif_intr_trig_r.notif_gen_in_toggle_trig.next; + end + end // Field: soc_ifc_reg.intr_block_rf.error_internal_intr_count_r.cnt always_comb begin automatic logic [31:0] next_c = field_storage.intr_block_rf.error_internal_intr_count_r.cnt.value; @@ -3799,6 +4911,38 @@ module soc_ifc_reg ( field_storage.intr_block_rf.notif_debug_locked_intr_count_r.cnt.value <= field_combo.intr_block_rf.notif_debug_locked_intr_count_r.cnt.next; end end + // Field: soc_ifc_reg.intr_block_rf.notif_scan_mode_intr_count_r.cnt + always_comb begin + automatic logic [31:0] next_c = field_storage.intr_block_rf.notif_scan_mode_intr_count_r.cnt.value; + automatic logic load_next_c = '0; + if(decoded_reg_strb.intr_block_rf.notif_scan_mode_intr_count_r && decoded_req_is_wr && !(hwif_in.soc_req)) begin // SW write + next_c = (field_storage.intr_block_rf.notif_scan_mode_intr_count_r.cnt.value & ~decoded_wr_biten[31:0]) | (decoded_wr_data[31:0] & decoded_wr_biten[31:0]); + load_next_c = '1; + end + if(field_storage.intr_block_rf.notif_scan_mode_intr_count_incr_r.pulse.value) begin // increment + if(((33)'(next_c) + 'h1) > 'hffffffff) begin // up-counter saturated + next_c = 'hffffffff; + end else begin + next_c = next_c + 'h1; + end + load_next_c = '1; + end + field_combo.intr_block_rf.notif_scan_mode_intr_count_r.cnt.incrthreshold = (field_storage.intr_block_rf.notif_scan_mode_intr_count_r.cnt.value >= 'hffffffff); + field_combo.intr_block_rf.notif_scan_mode_intr_count_r.cnt.incrsaturate = (field_storage.intr_block_rf.notif_scan_mode_intr_count_r.cnt.value >= 'hffffffff); + if(next_c > 'hffffffff) begin + next_c = 'hffffffff; + load_next_c = '1; + end + field_combo.intr_block_rf.notif_scan_mode_intr_count_r.cnt.next = next_c; + field_combo.intr_block_rf.notif_scan_mode_intr_count_r.cnt.load_next = load_next_c; + end + always_ff @(posedge clk or negedge hwif_in.cptra_rst_b) begin + if(~hwif_in.cptra_rst_b) begin + field_storage.intr_block_rf.notif_scan_mode_intr_count_r.cnt.value <= 'h0; + end else if(field_combo.intr_block_rf.notif_scan_mode_intr_count_r.cnt.load_next) begin + field_storage.intr_block_rf.notif_scan_mode_intr_count_r.cnt.value <= field_combo.intr_block_rf.notif_scan_mode_intr_count_r.cnt.next; + end + end // Field: soc_ifc_reg.intr_block_rf.notif_soc_req_lock_intr_count_r.cnt always_comb begin automatic logic [31:0] next_c = field_storage.intr_block_rf.notif_soc_req_lock_intr_count_r.cnt.value; @@ -3831,6 +4975,38 @@ module soc_ifc_reg ( field_storage.intr_block_rf.notif_soc_req_lock_intr_count_r.cnt.value <= field_combo.intr_block_rf.notif_soc_req_lock_intr_count_r.cnt.next; end end + // Field: soc_ifc_reg.intr_block_rf.notif_gen_in_toggle_intr_count_r.cnt + always_comb begin + automatic logic [31:0] next_c = field_storage.intr_block_rf.notif_gen_in_toggle_intr_count_r.cnt.value; + automatic logic load_next_c = '0; + if(decoded_reg_strb.intr_block_rf.notif_gen_in_toggle_intr_count_r && decoded_req_is_wr && !(hwif_in.soc_req)) begin // SW write + next_c = (field_storage.intr_block_rf.notif_gen_in_toggle_intr_count_r.cnt.value & ~decoded_wr_biten[31:0]) | (decoded_wr_data[31:0] & decoded_wr_biten[31:0]); + load_next_c = '1; + end + if(field_storage.intr_block_rf.notif_gen_in_toggle_intr_count_incr_r.pulse.value) begin // increment + if(((33)'(next_c) + 'h1) > 'hffffffff) begin // up-counter saturated + next_c = 'hffffffff; + end else begin + next_c = next_c + 'h1; + end + load_next_c = '1; + end + field_combo.intr_block_rf.notif_gen_in_toggle_intr_count_r.cnt.incrthreshold = (field_storage.intr_block_rf.notif_gen_in_toggle_intr_count_r.cnt.value >= 'hffffffff); + field_combo.intr_block_rf.notif_gen_in_toggle_intr_count_r.cnt.incrsaturate = (field_storage.intr_block_rf.notif_gen_in_toggle_intr_count_r.cnt.value >= 'hffffffff); + if(next_c > 'hffffffff) begin + next_c = 'hffffffff; + load_next_c = '1; + end + field_combo.intr_block_rf.notif_gen_in_toggle_intr_count_r.cnt.next = next_c; + field_combo.intr_block_rf.notif_gen_in_toggle_intr_count_r.cnt.load_next = load_next_c; + end + always_ff @(posedge clk or negedge hwif_in.cptra_rst_b) begin + if(~hwif_in.cptra_rst_b) begin + field_storage.intr_block_rf.notif_gen_in_toggle_intr_count_r.cnt.value <= 'h0; + end else if(field_combo.intr_block_rf.notif_gen_in_toggle_intr_count_r.cnt.load_next) begin + field_storage.intr_block_rf.notif_gen_in_toggle_intr_count_r.cnt.value <= field_combo.intr_block_rf.notif_gen_in_toggle_intr_count_r.cnt.next; + end + end // Field: soc_ifc_reg.intr_block_rf.error_internal_intr_count_incr_r.pulse always_comb begin automatic logic [0:0] next_c = field_storage.intr_block_rf.error_internal_intr_count_incr_r.pulse.value; @@ -4150,6 +5326,35 @@ module soc_ifc_reg ( field_storage.intr_block_rf.notif_debug_locked_intr_count_incr_r.pulse.value <= field_combo.intr_block_rf.notif_debug_locked_intr_count_incr_r.pulse.next; end end + // Field: soc_ifc_reg.intr_block_rf.notif_scan_mode_intr_count_incr_r.pulse + always_comb begin + automatic logic [0:0] next_c = field_storage.intr_block_rf.notif_scan_mode_intr_count_incr_r.pulse.value; + automatic logic load_next_c = '0; + if(field_storage.intr_block_rf.notif_intr_trig_r.notif_scan_mode_trig.value) begin // HW Write - we + next_c = field_storage.intr_block_rf.notif_intr_trig_r.notif_scan_mode_trig.value; + load_next_c = '1; + end else if(hwif_in.intr_block_rf.notif_internal_intr_r.notif_scan_mode_sts.hwset) begin // HW Set + next_c = '1; + load_next_c = '1; + end + if(field_storage.intr_block_rf.notif_scan_mode_intr_count_incr_r.pulse.value) begin // decrement + field_combo.intr_block_rf.notif_scan_mode_intr_count_incr_r.pulse.underflow = (next_c < ('h1)); + next_c = next_c - 'h1; + load_next_c = '1; + end else begin + field_combo.intr_block_rf.notif_scan_mode_intr_count_incr_r.pulse.underflow = '0; + end + field_combo.intr_block_rf.notif_scan_mode_intr_count_incr_r.pulse.decrthreshold = (field_storage.intr_block_rf.notif_scan_mode_intr_count_incr_r.pulse.value <= 'd0); + field_combo.intr_block_rf.notif_scan_mode_intr_count_incr_r.pulse.next = next_c; + field_combo.intr_block_rf.notif_scan_mode_intr_count_incr_r.pulse.load_next = load_next_c; + end + always_ff @(posedge clk or negedge hwif_in.cptra_rst_b) begin + if(~hwif_in.cptra_rst_b) begin + field_storage.intr_block_rf.notif_scan_mode_intr_count_incr_r.pulse.value <= 'h0; + end else if(field_combo.intr_block_rf.notif_scan_mode_intr_count_incr_r.pulse.load_next) begin + field_storage.intr_block_rf.notif_scan_mode_intr_count_incr_r.pulse.value <= field_combo.intr_block_rf.notif_scan_mode_intr_count_incr_r.pulse.next; + end + end // Field: soc_ifc_reg.intr_block_rf.notif_soc_req_lock_intr_count_incr_r.pulse always_comb begin automatic logic [0:0] next_c = field_storage.intr_block_rf.notif_soc_req_lock_intr_count_incr_r.pulse.value; @@ -4179,6 +5384,35 @@ module soc_ifc_reg ( field_storage.intr_block_rf.notif_soc_req_lock_intr_count_incr_r.pulse.value <= field_combo.intr_block_rf.notif_soc_req_lock_intr_count_incr_r.pulse.next; end end + // Field: soc_ifc_reg.intr_block_rf.notif_gen_in_toggle_intr_count_incr_r.pulse + always_comb begin + automatic logic [0:0] next_c = field_storage.intr_block_rf.notif_gen_in_toggle_intr_count_incr_r.pulse.value; + automatic logic load_next_c = '0; + if(field_storage.intr_block_rf.notif_intr_trig_r.notif_gen_in_toggle_trig.value) begin // HW Write - we + next_c = field_storage.intr_block_rf.notif_intr_trig_r.notif_gen_in_toggle_trig.value; + load_next_c = '1; + end else if(hwif_in.intr_block_rf.notif_internal_intr_r.notif_gen_in_toggle_sts.hwset) begin // HW Set + next_c = '1; + load_next_c = '1; + end + if(field_storage.intr_block_rf.notif_gen_in_toggle_intr_count_incr_r.pulse.value) begin // decrement + field_combo.intr_block_rf.notif_gen_in_toggle_intr_count_incr_r.pulse.underflow = (next_c < ('h1)); + next_c = next_c - 'h1; + load_next_c = '1; + end else begin + field_combo.intr_block_rf.notif_gen_in_toggle_intr_count_incr_r.pulse.underflow = '0; + end + field_combo.intr_block_rf.notif_gen_in_toggle_intr_count_incr_r.pulse.decrthreshold = (field_storage.intr_block_rf.notif_gen_in_toggle_intr_count_incr_r.pulse.value <= 'd0); + field_combo.intr_block_rf.notif_gen_in_toggle_intr_count_incr_r.pulse.next = next_c; + field_combo.intr_block_rf.notif_gen_in_toggle_intr_count_incr_r.pulse.load_next = load_next_c; + end + always_ff @(posedge clk or negedge hwif_in.cptra_rst_b) begin + if(~hwif_in.cptra_rst_b) begin + field_storage.intr_block_rf.notif_gen_in_toggle_intr_count_incr_r.pulse.value <= 'h0; + end else if(field_combo.intr_block_rf.notif_gen_in_toggle_intr_count_incr_r.pulse.load_next) begin + field_storage.intr_block_rf.notif_gen_in_toggle_intr_count_incr_r.pulse.value <= field_combo.intr_block_rf.notif_gen_in_toggle_intr_count_incr_r.pulse.next; + end + end //-------------------------------------------------------------------------- // Readback //-------------------------------------------------------------------------- @@ -4187,9 +5421,15 @@ module soc_ifc_reg ( logic [31:0] readback_data; // Assign readback values to a flattened array - logic [162-1:0][31:0] readback_array; - assign readback_array[0][31:0] = (decoded_reg_strb.CPTRA_HW_ERROR_FATAL && !decoded_req_is_wr) ? field_storage.CPTRA_HW_ERROR_FATAL.error_code.value : '0; - assign readback_array[1][31:0] = (decoded_reg_strb.CPTRA_HW_ERROR_NON_FATAL && !decoded_req_is_wr) ? field_storage.CPTRA_HW_ERROR_NON_FATAL.error_code.value : '0; + logic [186-1:0][31:0] readback_array; + assign readback_array[0][0:0] = (decoded_reg_strb.CPTRA_HW_ERROR_FATAL && !decoded_req_is_wr) ? field_storage.CPTRA_HW_ERROR_FATAL.iccm_ecc_unc.value : '0; + assign readback_array[0][1:1] = (decoded_reg_strb.CPTRA_HW_ERROR_FATAL && !decoded_req_is_wr) ? field_storage.CPTRA_HW_ERROR_FATAL.dccm_ecc_unc.value : '0; + assign readback_array[0][2:2] = (decoded_reg_strb.CPTRA_HW_ERROR_FATAL && !decoded_req_is_wr) ? field_storage.CPTRA_HW_ERROR_FATAL.nmi_pin.value : '0; + assign readback_array[0][31:3] = '0; + assign readback_array[1][0:0] = (decoded_reg_strb.CPTRA_HW_ERROR_NON_FATAL && !decoded_req_is_wr) ? field_storage.CPTRA_HW_ERROR_NON_FATAL.mbox_prot_no_lock.value : '0; + assign readback_array[1][1:1] = (decoded_reg_strb.CPTRA_HW_ERROR_NON_FATAL && !decoded_req_is_wr) ? field_storage.CPTRA_HW_ERROR_NON_FATAL.mbox_prot_ooo.value : '0; + assign readback_array[1][2:2] = (decoded_reg_strb.CPTRA_HW_ERROR_NON_FATAL && !decoded_req_is_wr) ? field_storage.CPTRA_HW_ERROR_NON_FATAL.mbox_ecc_unc.value : '0; + assign readback_array[1][31:3] = '0; assign readback_array[2][31:0] = (decoded_reg_strb.CPTRA_FW_ERROR_FATAL && !decoded_req_is_wr) ? field_storage.CPTRA_FW_ERROR_FATAL.error_code.value : '0; assign readback_array[3][31:0] = (decoded_reg_strb.CPTRA_FW_ERROR_NON_FATAL && !decoded_req_is_wr) ? field_storage.CPTRA_FW_ERROR_NON_FATAL.error_code.value : '0; assign readback_array[4][31:0] = (decoded_reg_strb.CPTRA_HW_ERROR_ENC && !decoded_req_is_wr) ? field_storage.CPTRA_HW_ERROR_ENC.error_code.value : '0; @@ -4198,10 +5438,12 @@ module soc_ifc_reg ( assign readback_array[i0*1 + 6][31:0] = (decoded_reg_strb.CPTRA_FW_EXTENDED_ERROR_INFO[i0] && !decoded_req_is_wr) ? field_storage.CPTRA_FW_EXTENDED_ERROR_INFO[i0].error_info.value : '0; end assign readback_array[14][31:0] = (decoded_reg_strb.CPTRA_BOOT_STATUS && !decoded_req_is_wr) ? field_storage.CPTRA_BOOT_STATUS.status.value : '0; - assign readback_array[15][27:0] = (decoded_reg_strb.CPTRA_FLOW_STATUS && !decoded_req_is_wr) ? field_storage.CPTRA_FLOW_STATUS.status.value : '0; + assign readback_array[15][23:0] = (decoded_reg_strb.CPTRA_FLOW_STATUS && !decoded_req_is_wr) ? field_storage.CPTRA_FLOW_STATUS.status.value : '0; + assign readback_array[15][24:24] = (decoded_reg_strb.CPTRA_FLOW_STATUS && !decoded_req_is_wr) ? field_storage.CPTRA_FLOW_STATUS.idevid_csr_ready.value : '0; + assign readback_array[15][27:25] = (decoded_reg_strb.CPTRA_FLOW_STATUS && !decoded_req_is_wr) ? hwif_in.CPTRA_FLOW_STATUS.boot_fsm_ps.next : '0; assign readback_array[15][28:28] = (decoded_reg_strb.CPTRA_FLOW_STATUS && !decoded_req_is_wr) ? field_storage.CPTRA_FLOW_STATUS.ready_for_fw.value : '0; assign readback_array[15][29:29] = (decoded_reg_strb.CPTRA_FLOW_STATUS && !decoded_req_is_wr) ? field_storage.CPTRA_FLOW_STATUS.ready_for_runtime.value : '0; - assign readback_array[15][30:30] = (decoded_reg_strb.CPTRA_FLOW_STATUS && !decoded_req_is_wr) ? field_storage.CPTRA_FLOW_STATUS.ready_for_fuses.value : '0; + assign readback_array[15][30:30] = (decoded_reg_strb.CPTRA_FLOW_STATUS && !decoded_req_is_wr) ? hwif_in.CPTRA_FLOW_STATUS.ready_for_fuses.next : '0; assign readback_array[15][31:31] = (decoded_reg_strb.CPTRA_FLOW_STATUS && !decoded_req_is_wr) ? field_storage.CPTRA_FLOW_STATUS.mailbox_flow_done.value : '0; assign readback_array[16][0:0] = (decoded_reg_strb.CPTRA_RESET_REASON && !decoded_req_is_wr) ? field_storage.CPTRA_RESET_REASON.FW_UPD_RESET.value : '0; assign readback_array[16][1:1] = (decoded_reg_strb.CPTRA_RESET_REASON && !decoded_req_is_wr) ? field_storage.CPTRA_RESET_REASON.WARM_RESET.value : '0; @@ -4223,163 +5465,210 @@ module soc_ifc_reg ( for(genvar i0=0; i0<12; i0++) begin assign readback_array[i0*1 + 30][31:0] = (decoded_reg_strb.CPTRA_TRNG_DATA[i0] && !decoded_req_is_wr) ? field_storage.CPTRA_TRNG_DATA[i0].DATA.value : '0; end - assign readback_array[42][0:0] = (decoded_reg_strb.CPTRA_TRNG_STATUS && !decoded_req_is_wr) ? field_storage.CPTRA_TRNG_STATUS.DATA_REQ.value : '0; - assign readback_array[42][1:1] = (decoded_reg_strb.CPTRA_TRNG_STATUS && !decoded_req_is_wr) ? field_storage.CPTRA_TRNG_STATUS.DATA_WR_DONE.value : '0; - assign readback_array[42][31:2] = '0; - assign readback_array[43][0:0] = (decoded_reg_strb.CPTRA_FUSE_WR_DONE && !decoded_req_is_wr) ? field_storage.CPTRA_FUSE_WR_DONE.done.value : '0; - assign readback_array[43][31:1] = '0; - assign readback_array[44][31:0] = (decoded_reg_strb.CPTRA_TIMER_CONFIG && !decoded_req_is_wr) ? field_storage.CPTRA_TIMER_CONFIG.clk_period.value : '0; - assign readback_array[45][0:0] = (decoded_reg_strb.CPTRA_BOOTFSM_GO && !decoded_req_is_wr) ? field_storage.CPTRA_BOOTFSM_GO.GO.value : '0; - assign readback_array[45][31:1] = '0; - assign readback_array[46][31:0] = (decoded_reg_strb.CPTRA_DBG_MANUF_SERVICE_REG && !decoded_req_is_wr) ? field_storage.CPTRA_DBG_MANUF_SERVICE_REG.DATA.value : '0; - assign readback_array[47][0:0] = (decoded_reg_strb.CPTRA_CLK_GATING_EN && !decoded_req_is_wr) ? field_storage.CPTRA_CLK_GATING_EN.clk_gating_en.value : '0; - assign readback_array[47][31:1] = '0; + assign readback_array[42][0:0] = (decoded_reg_strb.CPTRA_TRNG_CTRL && !decoded_req_is_wr) ? field_storage.CPTRA_TRNG_CTRL.clear.value : '0; + assign readback_array[42][31:1] = '0; + assign readback_array[43][0:0] = (decoded_reg_strb.CPTRA_TRNG_STATUS && !decoded_req_is_wr) ? field_storage.CPTRA_TRNG_STATUS.DATA_REQ.value : '0; + assign readback_array[43][1:1] = (decoded_reg_strb.CPTRA_TRNG_STATUS && !decoded_req_is_wr) ? field_storage.CPTRA_TRNG_STATUS.DATA_WR_DONE.value : '0; + assign readback_array[43][31:2] = '0; + assign readback_array[44][0:0] = (decoded_reg_strb.CPTRA_FUSE_WR_DONE && !decoded_req_is_wr) ? field_storage.CPTRA_FUSE_WR_DONE.done.value : '0; + assign readback_array[44][31:1] = '0; + assign readback_array[45][31:0] = (decoded_reg_strb.CPTRA_TIMER_CONFIG && !decoded_req_is_wr) ? field_storage.CPTRA_TIMER_CONFIG.clk_period.value : '0; + assign readback_array[46][0:0] = (decoded_reg_strb.CPTRA_BOOTFSM_GO && !decoded_req_is_wr) ? field_storage.CPTRA_BOOTFSM_GO.GO.value : '0; + assign readback_array[46][31:1] = '0; + assign readback_array[47][31:0] = (decoded_reg_strb.CPTRA_DBG_MANUF_SERVICE_REG && !decoded_req_is_wr) ? field_storage.CPTRA_DBG_MANUF_SERVICE_REG.DATA.value : '0; + assign readback_array[48][0:0] = (decoded_reg_strb.CPTRA_CLK_GATING_EN && !decoded_req_is_wr) ? field_storage.CPTRA_CLK_GATING_EN.clk_gating_en.value : '0; + assign readback_array[48][31:1] = '0; for(genvar i0=0; i0<2; i0++) begin - assign readback_array[i0*1 + 48][31:0] = (decoded_reg_strb.CPTRA_GENERIC_INPUT_WIRES[i0] && !decoded_req_is_wr) ? field_storage.CPTRA_GENERIC_INPUT_WIRES[i0].generic_wires.value : '0; + assign readback_array[i0*1 + 49][31:0] = (decoded_reg_strb.CPTRA_GENERIC_INPUT_WIRES[i0] && !decoded_req_is_wr) ? field_storage.CPTRA_GENERIC_INPUT_WIRES[i0].generic_wires.value : '0; end for(genvar i0=0; i0<2; i0++) begin - assign readback_array[i0*1 + 50][31:0] = (decoded_reg_strb.CPTRA_GENERIC_OUTPUT_WIRES[i0] && !decoded_req_is_wr) ? field_storage.CPTRA_GENERIC_OUTPUT_WIRES[i0].generic_wires.value : '0; + assign readback_array[i0*1 + 51][31:0] = (decoded_reg_strb.CPTRA_GENERIC_OUTPUT_WIRES[i0] && !decoded_req_is_wr) ? field_storage.CPTRA_GENERIC_OUTPUT_WIRES[i0].generic_wires.value : '0; end - assign readback_array[52][31:0] = (decoded_reg_strb.CPTRA_HW_REV_ID && !decoded_req_is_wr) ? 'h1 : '0; + assign readback_array[53][15:0] = (decoded_reg_strb.CPTRA_HW_REV_ID && !decoded_req_is_wr) ? 'h1 : '0; + assign readback_array[53][31:16] = (decoded_reg_strb.CPTRA_HW_REV_ID && !decoded_req_is_wr) ? hwif_in.CPTRA_HW_REV_ID.SOC_STEPPING_ID.next : '0; for(genvar i0=0; i0<2; i0++) begin - assign readback_array[i0*1 + 53][31:0] = (decoded_reg_strb.CPTRA_FW_REV_ID[i0] && !decoded_req_is_wr) ? field_storage.CPTRA_FW_REV_ID[i0].REV_ID.value : '0; - end - assign readback_array[55][0:0] = (decoded_reg_strb.CPTRA_HW_CONFIG && !decoded_req_is_wr) ? hwif_in.CPTRA_HW_CONFIG.iTRNG_en.next : '0; - assign readback_array[55][1:1] = (decoded_reg_strb.CPTRA_HW_CONFIG && !decoded_req_is_wr) ? hwif_in.CPTRA_HW_CONFIG.QSPI_en.next : '0; - assign readback_array[55][2:2] = (decoded_reg_strb.CPTRA_HW_CONFIG && !decoded_req_is_wr) ? hwif_in.CPTRA_HW_CONFIG.I3C_en.next : '0; - assign readback_array[55][3:3] = (decoded_reg_strb.CPTRA_HW_CONFIG && !decoded_req_is_wr) ? hwif_in.CPTRA_HW_CONFIG.UART_en.next : '0; - assign readback_array[55][31:4] = '0; - assign readback_array[56][0:0] = (decoded_reg_strb.CPTRA_WDT_TIMER1_EN && !decoded_req_is_wr) ? field_storage.CPTRA_WDT_TIMER1_EN.timer1_en.value : '0; - assign readback_array[56][31:1] = '0; - assign readback_array[57][0:0] = (decoded_reg_strb.CPTRA_WDT_TIMER1_CTRL && !decoded_req_is_wr) ? field_storage.CPTRA_WDT_TIMER1_CTRL.timer1_restart.value : '0; + assign readback_array[i0*1 + 54][31:0] = (decoded_reg_strb.CPTRA_FW_REV_ID[i0] && !decoded_req_is_wr) ? field_storage.CPTRA_FW_REV_ID[i0].REV_ID.value : '0; + end + assign readback_array[56][0:0] = (decoded_reg_strb.CPTRA_HW_CONFIG && !decoded_req_is_wr) ? hwif_in.CPTRA_HW_CONFIG.iTRNG_en.next : '0; + assign readback_array[56][1:1] = (decoded_reg_strb.CPTRA_HW_CONFIG && !decoded_req_is_wr) ? hwif_in.CPTRA_HW_CONFIG.QSPI_en.next : '0; + assign readback_array[56][2:2] = (decoded_reg_strb.CPTRA_HW_CONFIG && !decoded_req_is_wr) ? hwif_in.CPTRA_HW_CONFIG.I3C_en.next : '0; + assign readback_array[56][3:3] = (decoded_reg_strb.CPTRA_HW_CONFIG && !decoded_req_is_wr) ? hwif_in.CPTRA_HW_CONFIG.UART_en.next : '0; + assign readback_array[56][31:4] = '0; + assign readback_array[57][0:0] = (decoded_reg_strb.CPTRA_WDT_TIMER1_EN && !decoded_req_is_wr) ? field_storage.CPTRA_WDT_TIMER1_EN.timer1_en.value : '0; assign readback_array[57][31:1] = '0; + assign readback_array[58][0:0] = (decoded_reg_strb.CPTRA_WDT_TIMER1_CTRL && !decoded_req_is_wr) ? field_storage.CPTRA_WDT_TIMER1_CTRL.timer1_restart.value : '0; + assign readback_array[58][31:1] = '0; for(genvar i0=0; i0<2; i0++) begin - assign readback_array[i0*1 + 58][31:0] = (decoded_reg_strb.CPTRA_WDT_TIMER1_TIMEOUT_PERIOD[i0] && !decoded_req_is_wr) ? field_storage.CPTRA_WDT_TIMER1_TIMEOUT_PERIOD[i0].timer1_timeout_period.value : '0; + assign readback_array[i0*1 + 59][31:0] = (decoded_reg_strb.CPTRA_WDT_TIMER1_TIMEOUT_PERIOD[i0] && !decoded_req_is_wr) ? field_storage.CPTRA_WDT_TIMER1_TIMEOUT_PERIOD[i0].timer1_timeout_period.value : '0; end - assign readback_array[60][0:0] = (decoded_reg_strb.CPTRA_WDT_TIMER2_EN && !decoded_req_is_wr) ? field_storage.CPTRA_WDT_TIMER2_EN.timer2_en.value : '0; - assign readback_array[60][31:1] = '0; - assign readback_array[61][0:0] = (decoded_reg_strb.CPTRA_WDT_TIMER2_CTRL && !decoded_req_is_wr) ? field_storage.CPTRA_WDT_TIMER2_CTRL.timer2_restart.value : '0; + assign readback_array[61][0:0] = (decoded_reg_strb.CPTRA_WDT_TIMER2_EN && !decoded_req_is_wr) ? field_storage.CPTRA_WDT_TIMER2_EN.timer2_en.value : '0; assign readback_array[61][31:1] = '0; + assign readback_array[62][0:0] = (decoded_reg_strb.CPTRA_WDT_TIMER2_CTRL && !decoded_req_is_wr) ? field_storage.CPTRA_WDT_TIMER2_CTRL.timer2_restart.value : '0; + assign readback_array[62][31:1] = '0; + for(genvar i0=0; i0<2; i0++) begin + assign readback_array[i0*1 + 63][31:0] = (decoded_reg_strb.CPTRA_WDT_TIMER2_TIMEOUT_PERIOD[i0] && !decoded_req_is_wr) ? field_storage.CPTRA_WDT_TIMER2_TIMEOUT_PERIOD[i0].timer2_timeout_period.value : '0; + end + assign readback_array[65][0:0] = (decoded_reg_strb.CPTRA_WDT_STATUS && !decoded_req_is_wr) ? field_storage.CPTRA_WDT_STATUS.t1_timeout.value : '0; + assign readback_array[65][1:1] = (decoded_reg_strb.CPTRA_WDT_STATUS && !decoded_req_is_wr) ? field_storage.CPTRA_WDT_STATUS.t2_timeout.value : '0; + assign readback_array[65][31:2] = '0; + assign readback_array[66][31:0] = (decoded_reg_strb.CPTRA_FUSE_VALID_PAUSER && !decoded_req_is_wr) ? field_storage.CPTRA_FUSE_VALID_PAUSER.PAUSER.value : '0; + assign readback_array[67][0:0] = (decoded_reg_strb.CPTRA_FUSE_PAUSER_LOCK && !decoded_req_is_wr) ? field_storage.CPTRA_FUSE_PAUSER_LOCK.LOCK.value : '0; + assign readback_array[67][31:1] = '0; for(genvar i0=0; i0<2; i0++) begin - assign readback_array[i0*1 + 62][31:0] = (decoded_reg_strb.CPTRA_WDT_TIMER2_TIMEOUT_PERIOD[i0] && !decoded_req_is_wr) ? field_storage.CPTRA_WDT_TIMER2_TIMEOUT_PERIOD[i0].timer2_timeout_period.value : '0; + assign readback_array[i0*1 + 68][31:0] = (decoded_reg_strb.CPTRA_WDT_CFG[i0] && !decoded_req_is_wr) ? field_storage.CPTRA_WDT_CFG[i0].TIMEOUT.value : '0; + end + assign readback_array[70][15:0] = (decoded_reg_strb.CPTRA_iTRNG_ENTROPY_CONFIG_0 && !decoded_req_is_wr) ? field_storage.CPTRA_iTRNG_ENTROPY_CONFIG_0.low_threshold.value : '0; + assign readback_array[70][31:16] = (decoded_reg_strb.CPTRA_iTRNG_ENTROPY_CONFIG_0 && !decoded_req_is_wr) ? field_storage.CPTRA_iTRNG_ENTROPY_CONFIG_0.high_threshold.value : '0; + assign readback_array[71][15:0] = (decoded_reg_strb.CPTRA_iTRNG_ENTROPY_CONFIG_1 && !decoded_req_is_wr) ? field_storage.CPTRA_iTRNG_ENTROPY_CONFIG_1.repetition_count.value : '0; + assign readback_array[71][31:16] = (decoded_reg_strb.CPTRA_iTRNG_ENTROPY_CONFIG_1 && !decoded_req_is_wr) ? field_storage.CPTRA_iTRNG_ENTROPY_CONFIG_1.RSVD.value : '0; + for(genvar i0=0; i0<2; i0++) begin + assign readback_array[i0*1 + 72][31:0] = (decoded_reg_strb.CPTRA_RSVD_REG[i0] && !decoded_req_is_wr) ? field_storage.CPTRA_RSVD_REG[i0].RSVD.value : '0; end - assign readback_array[64][0:0] = (decoded_reg_strb.CPTRA_WDT_STATUS && !decoded_req_is_wr) ? field_storage.CPTRA_WDT_STATUS.t1_timeout.value : '0; - assign readback_array[64][1:1] = (decoded_reg_strb.CPTRA_WDT_STATUS && !decoded_req_is_wr) ? field_storage.CPTRA_WDT_STATUS.t2_timeout.value : '0; - assign readback_array[64][31:2] = '0; for(genvar i0=0; i0<12; i0++) begin - assign readback_array[i0*1 + 65][31:0] = (decoded_reg_strb.fuse_key_manifest_pk_hash[i0] && !decoded_req_is_wr) ? field_storage.fuse_key_manifest_pk_hash[i0].hash.value : '0; + assign readback_array[i0*1 + 74][31:0] = (decoded_reg_strb.fuse_key_manifest_pk_hash[i0] && !decoded_req_is_wr) ? field_storage.fuse_key_manifest_pk_hash[i0].hash.value : '0; end - assign readback_array[77][3:0] = (decoded_reg_strb.fuse_key_manifest_pk_hash_mask && !decoded_req_is_wr) ? field_storage.fuse_key_manifest_pk_hash_mask.mask.value : '0; - assign readback_array[77][31:4] = '0; + assign readback_array[86][3:0] = (decoded_reg_strb.fuse_key_manifest_pk_hash_mask && !decoded_req_is_wr) ? field_storage.fuse_key_manifest_pk_hash_mask.mask.value : '0; + assign readback_array[86][31:4] = '0; for(genvar i0=0; i0<12; i0++) begin - assign readback_array[i0*1 + 78][31:0] = (decoded_reg_strb.fuse_owner_pk_hash[i0] && !decoded_req_is_wr) ? field_storage.fuse_owner_pk_hash[i0].hash.value : '0; + assign readback_array[i0*1 + 87][31:0] = (decoded_reg_strb.fuse_owner_pk_hash[i0] && !decoded_req_is_wr) ? field_storage.fuse_owner_pk_hash[i0].hash.value : '0; end - assign readback_array[90][31:0] = (decoded_reg_strb.fuse_fmc_key_manifest_svn && !decoded_req_is_wr) ? field_storage.fuse_fmc_key_manifest_svn.svn.value : '0; + assign readback_array[99][31:0] = (decoded_reg_strb.fuse_fmc_key_manifest_svn && !decoded_req_is_wr) ? field_storage.fuse_fmc_key_manifest_svn.svn.value : '0; for(genvar i0=0; i0<4; i0++) begin - assign readback_array[i0*1 + 91][31:0] = (decoded_reg_strb.fuse_runtime_svn[i0] && !decoded_req_is_wr) ? field_storage.fuse_runtime_svn[i0].svn.value : '0; + assign readback_array[i0*1 + 100][31:0] = (decoded_reg_strb.fuse_runtime_svn[i0] && !decoded_req_is_wr) ? field_storage.fuse_runtime_svn[i0].svn.value : '0; end - assign readback_array[95][0:0] = (decoded_reg_strb.fuse_anti_rollback_disable && !decoded_req_is_wr) ? field_storage.fuse_anti_rollback_disable.dis.value : '0; - assign readback_array[95][31:1] = '0; + assign readback_array[104][0:0] = (decoded_reg_strb.fuse_anti_rollback_disable && !decoded_req_is_wr) ? field_storage.fuse_anti_rollback_disable.dis.value : '0; + assign readback_array[104][31:1] = '0; for(genvar i0=0; i0<24; i0++) begin - assign readback_array[i0*1 + 96][31:0] = (decoded_reg_strb.fuse_idevid_cert_attr[i0] && !decoded_req_is_wr) ? field_storage.fuse_idevid_cert_attr[i0].cert.value : '0; + assign readback_array[i0*1 + 105][31:0] = (decoded_reg_strb.fuse_idevid_cert_attr[i0] && !decoded_req_is_wr) ? field_storage.fuse_idevid_cert_attr[i0].cert.value : '0; end for(genvar i0=0; i0<4; i0++) begin - assign readback_array[i0*1 + 120][31:0] = (decoded_reg_strb.fuse_idevid_manuf_hsm_id[i0] && !decoded_req_is_wr) ? field_storage.fuse_idevid_manuf_hsm_id[i0].hsm_id.value : '0; - end - assign readback_array[124][1:0] = (decoded_reg_strb.fuse_life_cycle && !decoded_req_is_wr) ? field_storage.fuse_life_cycle.life_cycle.value : '0; - assign readback_array[124][31:2] = '0; - assign readback_array[125][0:0] = (decoded_reg_strb.internal_iccm_lock && !decoded_req_is_wr) ? field_storage.internal_iccm_lock.lock.value : '0; - assign readback_array[125][31:1] = '0; - assign readback_array[126][0:0] = (decoded_reg_strb.internal_fw_update_reset && !decoded_req_is_wr) ? field_storage.internal_fw_update_reset.core_rst.value : '0; - assign readback_array[126][31:1] = '0; - assign readback_array[127][7:0] = (decoded_reg_strb.internal_fw_update_reset_wait_cycles && !decoded_req_is_wr) ? field_storage.internal_fw_update_reset_wait_cycles.wait_cycles.value : '0; - assign readback_array[127][31:8] = '0; - assign readback_array[128][31:0] = (decoded_reg_strb.internal_nmi_vector && !decoded_req_is_wr) ? field_storage.internal_nmi_vector.vec.value : '0; - assign readback_array[129][0:0] = (decoded_reg_strb.intr_block_rf.global_intr_en_r && !decoded_req_is_wr) ? field_storage.intr_block_rf.global_intr_en_r.error_en.value : '0; - assign readback_array[129][1:1] = (decoded_reg_strb.intr_block_rf.global_intr_en_r && !decoded_req_is_wr) ? field_storage.intr_block_rf.global_intr_en_r.notif_en.value : '0; - assign readback_array[129][31:2] = '0; - assign readback_array[130][0:0] = (decoded_reg_strb.intr_block_rf.error_intr_en_r && !decoded_req_is_wr) ? field_storage.intr_block_rf.error_intr_en_r.error_internal_en.value : '0; - assign readback_array[130][1:1] = (decoded_reg_strb.intr_block_rf.error_intr_en_r && !decoded_req_is_wr) ? field_storage.intr_block_rf.error_intr_en_r.error_inv_dev_en.value : '0; - assign readback_array[130][2:2] = (decoded_reg_strb.intr_block_rf.error_intr_en_r && !decoded_req_is_wr) ? field_storage.intr_block_rf.error_intr_en_r.error_cmd_fail_en.value : '0; - assign readback_array[130][3:3] = (decoded_reg_strb.intr_block_rf.error_intr_en_r && !decoded_req_is_wr) ? field_storage.intr_block_rf.error_intr_en_r.error_bad_fuse_en.value : '0; - assign readback_array[130][4:4] = (decoded_reg_strb.intr_block_rf.error_intr_en_r && !decoded_req_is_wr) ? field_storage.intr_block_rf.error_intr_en_r.error_iccm_blocked_en.value : '0; - assign readback_array[130][5:5] = (decoded_reg_strb.intr_block_rf.error_intr_en_r && !decoded_req_is_wr) ? field_storage.intr_block_rf.error_intr_en_r.error_mbox_ecc_unc_en.value : '0; - assign readback_array[130][6:6] = (decoded_reg_strb.intr_block_rf.error_intr_en_r && !decoded_req_is_wr) ? field_storage.intr_block_rf.error_intr_en_r.error_wdt_timer1_timeout_en.value : '0; - assign readback_array[130][7:7] = (decoded_reg_strb.intr_block_rf.error_intr_en_r && !decoded_req_is_wr) ? field_storage.intr_block_rf.error_intr_en_r.error_wdt_timer2_timeout_en.value : '0; - assign readback_array[130][31:8] = '0; - assign readback_array[131][0:0] = (decoded_reg_strb.intr_block_rf.notif_intr_en_r && !decoded_req_is_wr) ? field_storage.intr_block_rf.notif_intr_en_r.notif_cmd_avail_en.value : '0; - assign readback_array[131][1:1] = (decoded_reg_strb.intr_block_rf.notif_intr_en_r && !decoded_req_is_wr) ? field_storage.intr_block_rf.notif_intr_en_r.notif_mbox_ecc_cor_en.value : '0; - assign readback_array[131][2:2] = (decoded_reg_strb.intr_block_rf.notif_intr_en_r && !decoded_req_is_wr) ? field_storage.intr_block_rf.notif_intr_en_r.notif_debug_locked_en.value : '0; - assign readback_array[131][3:3] = (decoded_reg_strb.intr_block_rf.notif_intr_en_r && !decoded_req_is_wr) ? field_storage.intr_block_rf.notif_intr_en_r.notif_soc_req_lock_en.value : '0; - assign readback_array[131][31:4] = '0; - assign readback_array[132][0:0] = (decoded_reg_strb.intr_block_rf.error_global_intr_r && !decoded_req_is_wr) ? field_storage.intr_block_rf.error_global_intr_r.agg_sts.value : '0; - assign readback_array[132][31:1] = '0; - assign readback_array[133][0:0] = (decoded_reg_strb.intr_block_rf.notif_global_intr_r && !decoded_req_is_wr) ? field_storage.intr_block_rf.notif_global_intr_r.agg_sts.value : '0; - assign readback_array[133][31:1] = '0; - assign readback_array[134][0:0] = (decoded_reg_strb.intr_block_rf.error_internal_intr_r && !decoded_req_is_wr) ? field_storage.intr_block_rf.error_internal_intr_r.error_internal_sts.value : '0; - assign readback_array[134][1:1] = (decoded_reg_strb.intr_block_rf.error_internal_intr_r && !decoded_req_is_wr) ? field_storage.intr_block_rf.error_internal_intr_r.error_inv_dev_sts.value : '0; - assign readback_array[134][2:2] = (decoded_reg_strb.intr_block_rf.error_internal_intr_r && !decoded_req_is_wr) ? field_storage.intr_block_rf.error_internal_intr_r.error_cmd_fail_sts.value : '0; - assign readback_array[134][3:3] = (decoded_reg_strb.intr_block_rf.error_internal_intr_r && !decoded_req_is_wr) ? field_storage.intr_block_rf.error_internal_intr_r.error_bad_fuse_sts.value : '0; - assign readback_array[134][4:4] = (decoded_reg_strb.intr_block_rf.error_internal_intr_r && !decoded_req_is_wr) ? field_storage.intr_block_rf.error_internal_intr_r.error_iccm_blocked_sts.value : '0; - assign readback_array[134][5:5] = (decoded_reg_strb.intr_block_rf.error_internal_intr_r && !decoded_req_is_wr) ? field_storage.intr_block_rf.error_internal_intr_r.error_mbox_ecc_unc_sts.value : '0; - assign readback_array[134][6:6] = (decoded_reg_strb.intr_block_rf.error_internal_intr_r && !decoded_req_is_wr) ? field_storage.intr_block_rf.error_internal_intr_r.error_wdt_timer1_timeout_sts.value : '0; - assign readback_array[134][7:7] = (decoded_reg_strb.intr_block_rf.error_internal_intr_r && !decoded_req_is_wr) ? field_storage.intr_block_rf.error_internal_intr_r.error_wdt_timer2_timeout_sts.value : '0; - assign readback_array[134][31:8] = '0; - assign readback_array[135][0:0] = (decoded_reg_strb.intr_block_rf.notif_internal_intr_r && !decoded_req_is_wr) ? field_storage.intr_block_rf.notif_internal_intr_r.notif_cmd_avail_sts.value : '0; - assign readback_array[135][1:1] = (decoded_reg_strb.intr_block_rf.notif_internal_intr_r && !decoded_req_is_wr) ? field_storage.intr_block_rf.notif_internal_intr_r.notif_mbox_ecc_cor_sts.value : '0; - assign readback_array[135][2:2] = (decoded_reg_strb.intr_block_rf.notif_internal_intr_r && !decoded_req_is_wr) ? field_storage.intr_block_rf.notif_internal_intr_r.notif_debug_locked_sts.value : '0; - assign readback_array[135][3:3] = (decoded_reg_strb.intr_block_rf.notif_internal_intr_r && !decoded_req_is_wr) ? field_storage.intr_block_rf.notif_internal_intr_r.notif_soc_req_lock_sts.value : '0; - assign readback_array[135][31:4] = '0; - assign readback_array[136][0:0] = (decoded_reg_strb.intr_block_rf.error_intr_trig_r && !decoded_req_is_wr) ? field_storage.intr_block_rf.error_intr_trig_r.error_internal_trig.value : '0; - assign readback_array[136][1:1] = (decoded_reg_strb.intr_block_rf.error_intr_trig_r && !decoded_req_is_wr) ? field_storage.intr_block_rf.error_intr_trig_r.error_inv_dev_trig.value : '0; - assign readback_array[136][2:2] = (decoded_reg_strb.intr_block_rf.error_intr_trig_r && !decoded_req_is_wr) ? field_storage.intr_block_rf.error_intr_trig_r.error_cmd_fail_trig.value : '0; - assign readback_array[136][3:3] = (decoded_reg_strb.intr_block_rf.error_intr_trig_r && !decoded_req_is_wr) ? field_storage.intr_block_rf.error_intr_trig_r.error_bad_fuse_trig.value : '0; - assign readback_array[136][4:4] = (decoded_reg_strb.intr_block_rf.error_intr_trig_r && !decoded_req_is_wr) ? field_storage.intr_block_rf.error_intr_trig_r.error_iccm_blocked_trig.value : '0; - assign readback_array[136][5:5] = (decoded_reg_strb.intr_block_rf.error_intr_trig_r && !decoded_req_is_wr) ? field_storage.intr_block_rf.error_intr_trig_r.error_mbox_ecc_unc_trig.value : '0; - assign readback_array[136][6:6] = (decoded_reg_strb.intr_block_rf.error_intr_trig_r && !decoded_req_is_wr) ? field_storage.intr_block_rf.error_intr_trig_r.error_wdt_timer1_timeout_trig.value : '0; - assign readback_array[136][7:7] = (decoded_reg_strb.intr_block_rf.error_intr_trig_r && !decoded_req_is_wr) ? field_storage.intr_block_rf.error_intr_trig_r.error_wdt_timer2_timeout_trig.value : '0; - assign readback_array[136][31:8] = '0; - assign readback_array[137][0:0] = (decoded_reg_strb.intr_block_rf.notif_intr_trig_r && !decoded_req_is_wr) ? field_storage.intr_block_rf.notif_intr_trig_r.notif_cmd_avail_trig.value : '0; - assign readback_array[137][1:1] = (decoded_reg_strb.intr_block_rf.notif_intr_trig_r && !decoded_req_is_wr) ? field_storage.intr_block_rf.notif_intr_trig_r.notif_mbox_ecc_cor_trig.value : '0; - assign readback_array[137][2:2] = (decoded_reg_strb.intr_block_rf.notif_intr_trig_r && !decoded_req_is_wr) ? field_storage.intr_block_rf.notif_intr_trig_r.notif_debug_locked_trig.value : '0; - assign readback_array[137][3:3] = (decoded_reg_strb.intr_block_rf.notif_intr_trig_r && !decoded_req_is_wr) ? field_storage.intr_block_rf.notif_intr_trig_r.notif_soc_req_lock_trig.value : '0; - assign readback_array[137][31:4] = '0; - assign readback_array[138][31:0] = (decoded_reg_strb.intr_block_rf.error_internal_intr_count_r && !decoded_req_is_wr) ? field_storage.intr_block_rf.error_internal_intr_count_r.cnt.value : '0; - assign readback_array[139][31:0] = (decoded_reg_strb.intr_block_rf.error_inv_dev_intr_count_r && !decoded_req_is_wr) ? field_storage.intr_block_rf.error_inv_dev_intr_count_r.cnt.value : '0; - assign readback_array[140][31:0] = (decoded_reg_strb.intr_block_rf.error_cmd_fail_intr_count_r && !decoded_req_is_wr) ? field_storage.intr_block_rf.error_cmd_fail_intr_count_r.cnt.value : '0; - assign readback_array[141][31:0] = (decoded_reg_strb.intr_block_rf.error_bad_fuse_intr_count_r && !decoded_req_is_wr) ? field_storage.intr_block_rf.error_bad_fuse_intr_count_r.cnt.value : '0; - assign readback_array[142][31:0] = (decoded_reg_strb.intr_block_rf.error_iccm_blocked_intr_count_r && !decoded_req_is_wr) ? field_storage.intr_block_rf.error_iccm_blocked_intr_count_r.cnt.value : '0; - assign readback_array[143][31:0] = (decoded_reg_strb.intr_block_rf.error_mbox_ecc_unc_intr_count_r && !decoded_req_is_wr) ? field_storage.intr_block_rf.error_mbox_ecc_unc_intr_count_r.cnt.value : '0; - assign readback_array[144][31:0] = (decoded_reg_strb.intr_block_rf.error_wdt_timer1_timeout_intr_count_r && !decoded_req_is_wr) ? field_storage.intr_block_rf.error_wdt_timer1_timeout_intr_count_r.cnt.value : '0; - assign readback_array[145][31:0] = (decoded_reg_strb.intr_block_rf.error_wdt_timer2_timeout_intr_count_r && !decoded_req_is_wr) ? field_storage.intr_block_rf.error_wdt_timer2_timeout_intr_count_r.cnt.value : '0; - assign readback_array[146][31:0] = (decoded_reg_strb.intr_block_rf.notif_cmd_avail_intr_count_r && !decoded_req_is_wr) ? field_storage.intr_block_rf.notif_cmd_avail_intr_count_r.cnt.value : '0; - assign readback_array[147][31:0] = (decoded_reg_strb.intr_block_rf.notif_mbox_ecc_cor_intr_count_r && !decoded_req_is_wr) ? field_storage.intr_block_rf.notif_mbox_ecc_cor_intr_count_r.cnt.value : '0; - assign readback_array[148][31:0] = (decoded_reg_strb.intr_block_rf.notif_debug_locked_intr_count_r && !decoded_req_is_wr) ? field_storage.intr_block_rf.notif_debug_locked_intr_count_r.cnt.value : '0; - assign readback_array[149][31:0] = (decoded_reg_strb.intr_block_rf.notif_soc_req_lock_intr_count_r && !decoded_req_is_wr) ? field_storage.intr_block_rf.notif_soc_req_lock_intr_count_r.cnt.value : '0; - assign readback_array[150][0:0] = (decoded_reg_strb.intr_block_rf.error_internal_intr_count_incr_r && !decoded_req_is_wr) ? field_storage.intr_block_rf.error_internal_intr_count_incr_r.pulse.value : '0; - assign readback_array[150][31:1] = '0; - assign readback_array[151][0:0] = (decoded_reg_strb.intr_block_rf.error_inv_dev_intr_count_incr_r && !decoded_req_is_wr) ? field_storage.intr_block_rf.error_inv_dev_intr_count_incr_r.pulse.value : '0; - assign readback_array[151][31:1] = '0; - assign readback_array[152][0:0] = (decoded_reg_strb.intr_block_rf.error_cmd_fail_intr_count_incr_r && !decoded_req_is_wr) ? field_storage.intr_block_rf.error_cmd_fail_intr_count_incr_r.pulse.value : '0; + assign readback_array[i0*1 + 129][31:0] = (decoded_reg_strb.fuse_idevid_manuf_hsm_id[i0] && !decoded_req_is_wr) ? field_storage.fuse_idevid_manuf_hsm_id[i0].hsm_id.value : '0; + end + assign readback_array[133][1:0] = (decoded_reg_strb.fuse_life_cycle && !decoded_req_is_wr) ? field_storage.fuse_life_cycle.life_cycle.value : '0; + assign readback_array[133][31:2] = '0; + assign readback_array[134][0:0] = (decoded_reg_strb.fuse_lms_verify && !decoded_req_is_wr) ? field_storage.fuse_lms_verify.lms_verify.value : '0; + assign readback_array[134][31:1] = '0; + assign readback_array[135][31:0] = (decoded_reg_strb.fuse_lms_revocation && !decoded_req_is_wr) ? field_storage.fuse_lms_revocation.lms_revocation.value : '0; + assign readback_array[136][15:0] = (decoded_reg_strb.fuse_soc_stepping_id && !decoded_req_is_wr) ? field_storage.fuse_soc_stepping_id.soc_stepping_id.value : '0; + assign readback_array[136][31:16] = '0; + assign readback_array[137][0:0] = (decoded_reg_strb.internal_iccm_lock && !decoded_req_is_wr) ? field_storage.internal_iccm_lock.lock.value : '0; + assign readback_array[137][31:1] = '0; + assign readback_array[138][0:0] = (decoded_reg_strb.internal_fw_update_reset && !decoded_req_is_wr) ? field_storage.internal_fw_update_reset.core_rst.value : '0; + assign readback_array[138][31:1] = '0; + assign readback_array[139][7:0] = (decoded_reg_strb.internal_fw_update_reset_wait_cycles && !decoded_req_is_wr) ? field_storage.internal_fw_update_reset_wait_cycles.wait_cycles.value : '0; + assign readback_array[139][31:8] = '0; + assign readback_array[140][31:0] = (decoded_reg_strb.internal_nmi_vector && !decoded_req_is_wr) ? field_storage.internal_nmi_vector.vec.value : '0; + assign readback_array[141][0:0] = (decoded_reg_strb.internal_hw_error_fatal_mask && !decoded_req_is_wr) ? field_storage.internal_hw_error_fatal_mask.mask_iccm_ecc_unc.value : '0; + assign readback_array[141][1:1] = (decoded_reg_strb.internal_hw_error_fatal_mask && !decoded_req_is_wr) ? field_storage.internal_hw_error_fatal_mask.mask_dccm_ecc_unc.value : '0; + assign readback_array[141][2:2] = (decoded_reg_strb.internal_hw_error_fatal_mask && !decoded_req_is_wr) ? field_storage.internal_hw_error_fatal_mask.mask_nmi_pin.value : '0; + assign readback_array[141][31:3] = '0; + assign readback_array[142][0:0] = (decoded_reg_strb.internal_hw_error_non_fatal_mask && !decoded_req_is_wr) ? field_storage.internal_hw_error_non_fatal_mask.mask_mbox_prot_no_lock.value : '0; + assign readback_array[142][1:1] = (decoded_reg_strb.internal_hw_error_non_fatal_mask && !decoded_req_is_wr) ? field_storage.internal_hw_error_non_fatal_mask.mask_mbox_prot_ooo.value : '0; + assign readback_array[142][2:2] = (decoded_reg_strb.internal_hw_error_non_fatal_mask && !decoded_req_is_wr) ? field_storage.internal_hw_error_non_fatal_mask.mask_mbox_ecc_unc.value : '0; + assign readback_array[142][31:3] = '0; + assign readback_array[143][31:0] = (decoded_reg_strb.internal_fw_error_fatal_mask && !decoded_req_is_wr) ? field_storage.internal_fw_error_fatal_mask.mask.value : '0; + assign readback_array[144][31:0] = (decoded_reg_strb.internal_fw_error_non_fatal_mask && !decoded_req_is_wr) ? field_storage.internal_fw_error_non_fatal_mask.mask.value : '0; + assign readback_array[145][31:0] = (decoded_reg_strb.internal_rv_mtime_l && !decoded_req_is_wr) ? field_storage.internal_rv_mtime_l.count_l.value : '0; + assign readback_array[146][31:0] = (decoded_reg_strb.internal_rv_mtime_h && !decoded_req_is_wr) ? field_storage.internal_rv_mtime_h.count_h.value : '0; + assign readback_array[147][31:0] = (decoded_reg_strb.internal_rv_mtimecmp_l && !decoded_req_is_wr) ? field_storage.internal_rv_mtimecmp_l.compare_l.value : '0; + assign readback_array[148][31:0] = (decoded_reg_strb.internal_rv_mtimecmp_h && !decoded_req_is_wr) ? field_storage.internal_rv_mtimecmp_h.compare_h.value : '0; + assign readback_array[149][0:0] = (decoded_reg_strb.intr_block_rf.global_intr_en_r && !decoded_req_is_wr) ? field_storage.intr_block_rf.global_intr_en_r.error_en.value : '0; + assign readback_array[149][1:1] = (decoded_reg_strb.intr_block_rf.global_intr_en_r && !decoded_req_is_wr) ? field_storage.intr_block_rf.global_intr_en_r.notif_en.value : '0; + assign readback_array[149][31:2] = '0; + assign readback_array[150][0:0] = (decoded_reg_strb.intr_block_rf.error_intr_en_r && !decoded_req_is_wr) ? field_storage.intr_block_rf.error_intr_en_r.error_internal_en.value : '0; + assign readback_array[150][1:1] = (decoded_reg_strb.intr_block_rf.error_intr_en_r && !decoded_req_is_wr) ? field_storage.intr_block_rf.error_intr_en_r.error_inv_dev_en.value : '0; + assign readback_array[150][2:2] = (decoded_reg_strb.intr_block_rf.error_intr_en_r && !decoded_req_is_wr) ? field_storage.intr_block_rf.error_intr_en_r.error_cmd_fail_en.value : '0; + assign readback_array[150][3:3] = (decoded_reg_strb.intr_block_rf.error_intr_en_r && !decoded_req_is_wr) ? field_storage.intr_block_rf.error_intr_en_r.error_bad_fuse_en.value : '0; + assign readback_array[150][4:4] = (decoded_reg_strb.intr_block_rf.error_intr_en_r && !decoded_req_is_wr) ? field_storage.intr_block_rf.error_intr_en_r.error_iccm_blocked_en.value : '0; + assign readback_array[150][5:5] = (decoded_reg_strb.intr_block_rf.error_intr_en_r && !decoded_req_is_wr) ? field_storage.intr_block_rf.error_intr_en_r.error_mbox_ecc_unc_en.value : '0; + assign readback_array[150][6:6] = (decoded_reg_strb.intr_block_rf.error_intr_en_r && !decoded_req_is_wr) ? field_storage.intr_block_rf.error_intr_en_r.error_wdt_timer1_timeout_en.value : '0; + assign readback_array[150][7:7] = (decoded_reg_strb.intr_block_rf.error_intr_en_r && !decoded_req_is_wr) ? field_storage.intr_block_rf.error_intr_en_r.error_wdt_timer2_timeout_en.value : '0; + assign readback_array[150][31:8] = '0; + assign readback_array[151][0:0] = (decoded_reg_strb.intr_block_rf.notif_intr_en_r && !decoded_req_is_wr) ? field_storage.intr_block_rf.notif_intr_en_r.notif_cmd_avail_en.value : '0; + assign readback_array[151][1:1] = (decoded_reg_strb.intr_block_rf.notif_intr_en_r && !decoded_req_is_wr) ? field_storage.intr_block_rf.notif_intr_en_r.notif_mbox_ecc_cor_en.value : '0; + assign readback_array[151][2:2] = (decoded_reg_strb.intr_block_rf.notif_intr_en_r && !decoded_req_is_wr) ? field_storage.intr_block_rf.notif_intr_en_r.notif_debug_locked_en.value : '0; + assign readback_array[151][3:3] = (decoded_reg_strb.intr_block_rf.notif_intr_en_r && !decoded_req_is_wr) ? field_storage.intr_block_rf.notif_intr_en_r.notif_scan_mode_en.value : '0; + assign readback_array[151][4:4] = (decoded_reg_strb.intr_block_rf.notif_intr_en_r && !decoded_req_is_wr) ? field_storage.intr_block_rf.notif_intr_en_r.notif_soc_req_lock_en.value : '0; + assign readback_array[151][5:5] = (decoded_reg_strb.intr_block_rf.notif_intr_en_r && !decoded_req_is_wr) ? field_storage.intr_block_rf.notif_intr_en_r.notif_gen_in_toggle_en.value : '0; + assign readback_array[151][31:6] = '0; + assign readback_array[152][0:0] = (decoded_reg_strb.intr_block_rf.error_global_intr_r && !decoded_req_is_wr) ? field_storage.intr_block_rf.error_global_intr_r.agg_sts.value : '0; assign readback_array[152][31:1] = '0; - assign readback_array[153][0:0] = (decoded_reg_strb.intr_block_rf.error_bad_fuse_intr_count_incr_r && !decoded_req_is_wr) ? field_storage.intr_block_rf.error_bad_fuse_intr_count_incr_r.pulse.value : '0; + assign readback_array[153][0:0] = (decoded_reg_strb.intr_block_rf.notif_global_intr_r && !decoded_req_is_wr) ? field_storage.intr_block_rf.notif_global_intr_r.agg_sts.value : '0; assign readback_array[153][31:1] = '0; - assign readback_array[154][0:0] = (decoded_reg_strb.intr_block_rf.error_iccm_blocked_intr_count_incr_r && !decoded_req_is_wr) ? field_storage.intr_block_rf.error_iccm_blocked_intr_count_incr_r.pulse.value : '0; - assign readback_array[154][31:1] = '0; - assign readback_array[155][0:0] = (decoded_reg_strb.intr_block_rf.error_mbox_ecc_unc_intr_count_incr_r && !decoded_req_is_wr) ? field_storage.intr_block_rf.error_mbox_ecc_unc_intr_count_incr_r.pulse.value : '0; - assign readback_array[155][31:1] = '0; - assign readback_array[156][0:0] = (decoded_reg_strb.intr_block_rf.error_wdt_timer1_timeout_intr_count_incr_r && !decoded_req_is_wr) ? field_storage.intr_block_rf.error_wdt_timer1_timeout_intr_count_incr_r.pulse.value : '0; - assign readback_array[156][31:1] = '0; - assign readback_array[157][0:0] = (decoded_reg_strb.intr_block_rf.error_wdt_timer2_timeout_intr_count_incr_r && !decoded_req_is_wr) ? field_storage.intr_block_rf.error_wdt_timer2_timeout_intr_count_incr_r.pulse.value : '0; - assign readback_array[157][31:1] = '0; - assign readback_array[158][0:0] = (decoded_reg_strb.intr_block_rf.notif_cmd_avail_intr_count_incr_r && !decoded_req_is_wr) ? field_storage.intr_block_rf.notif_cmd_avail_intr_count_incr_r.pulse.value : '0; - assign readback_array[158][31:1] = '0; - assign readback_array[159][0:0] = (decoded_reg_strb.intr_block_rf.notif_mbox_ecc_cor_intr_count_incr_r && !decoded_req_is_wr) ? field_storage.intr_block_rf.notif_mbox_ecc_cor_intr_count_incr_r.pulse.value : '0; - assign readback_array[159][31:1] = '0; - assign readback_array[160][0:0] = (decoded_reg_strb.intr_block_rf.notif_debug_locked_intr_count_incr_r && !decoded_req_is_wr) ? field_storage.intr_block_rf.notif_debug_locked_intr_count_incr_r.pulse.value : '0; - assign readback_array[160][31:1] = '0; - assign readback_array[161][0:0] = (decoded_reg_strb.intr_block_rf.notif_soc_req_lock_intr_count_incr_r && !decoded_req_is_wr) ? field_storage.intr_block_rf.notif_soc_req_lock_intr_count_incr_r.pulse.value : '0; - assign readback_array[161][31:1] = '0; + assign readback_array[154][0:0] = (decoded_reg_strb.intr_block_rf.error_internal_intr_r && !decoded_req_is_wr) ? field_storage.intr_block_rf.error_internal_intr_r.error_internal_sts.value : '0; + assign readback_array[154][1:1] = (decoded_reg_strb.intr_block_rf.error_internal_intr_r && !decoded_req_is_wr) ? field_storage.intr_block_rf.error_internal_intr_r.error_inv_dev_sts.value : '0; + assign readback_array[154][2:2] = (decoded_reg_strb.intr_block_rf.error_internal_intr_r && !decoded_req_is_wr) ? field_storage.intr_block_rf.error_internal_intr_r.error_cmd_fail_sts.value : '0; + assign readback_array[154][3:3] = (decoded_reg_strb.intr_block_rf.error_internal_intr_r && !decoded_req_is_wr) ? field_storage.intr_block_rf.error_internal_intr_r.error_bad_fuse_sts.value : '0; + assign readback_array[154][4:4] = (decoded_reg_strb.intr_block_rf.error_internal_intr_r && !decoded_req_is_wr) ? field_storage.intr_block_rf.error_internal_intr_r.error_iccm_blocked_sts.value : '0; + assign readback_array[154][5:5] = (decoded_reg_strb.intr_block_rf.error_internal_intr_r && !decoded_req_is_wr) ? field_storage.intr_block_rf.error_internal_intr_r.error_mbox_ecc_unc_sts.value : '0; + assign readback_array[154][6:6] = (decoded_reg_strb.intr_block_rf.error_internal_intr_r && !decoded_req_is_wr) ? field_storage.intr_block_rf.error_internal_intr_r.error_wdt_timer1_timeout_sts.value : '0; + assign readback_array[154][7:7] = (decoded_reg_strb.intr_block_rf.error_internal_intr_r && !decoded_req_is_wr) ? field_storage.intr_block_rf.error_internal_intr_r.error_wdt_timer2_timeout_sts.value : '0; + assign readback_array[154][31:8] = '0; + assign readback_array[155][0:0] = (decoded_reg_strb.intr_block_rf.notif_internal_intr_r && !decoded_req_is_wr) ? field_storage.intr_block_rf.notif_internal_intr_r.notif_cmd_avail_sts.value : '0; + assign readback_array[155][1:1] = (decoded_reg_strb.intr_block_rf.notif_internal_intr_r && !decoded_req_is_wr) ? field_storage.intr_block_rf.notif_internal_intr_r.notif_mbox_ecc_cor_sts.value : '0; + assign readback_array[155][2:2] = (decoded_reg_strb.intr_block_rf.notif_internal_intr_r && !decoded_req_is_wr) ? field_storage.intr_block_rf.notif_internal_intr_r.notif_debug_locked_sts.value : '0; + assign readback_array[155][3:3] = (decoded_reg_strb.intr_block_rf.notif_internal_intr_r && !decoded_req_is_wr) ? field_storage.intr_block_rf.notif_internal_intr_r.notif_scan_mode_sts.value : '0; + assign readback_array[155][4:4] = (decoded_reg_strb.intr_block_rf.notif_internal_intr_r && !decoded_req_is_wr) ? field_storage.intr_block_rf.notif_internal_intr_r.notif_soc_req_lock_sts.value : '0; + assign readback_array[155][5:5] = (decoded_reg_strb.intr_block_rf.notif_internal_intr_r && !decoded_req_is_wr) ? field_storage.intr_block_rf.notif_internal_intr_r.notif_gen_in_toggle_sts.value : '0; + assign readback_array[155][31:6] = '0; + assign readback_array[156][0:0] = (decoded_reg_strb.intr_block_rf.error_intr_trig_r && !decoded_req_is_wr) ? field_storage.intr_block_rf.error_intr_trig_r.error_internal_trig.value : '0; + assign readback_array[156][1:1] = (decoded_reg_strb.intr_block_rf.error_intr_trig_r && !decoded_req_is_wr) ? field_storage.intr_block_rf.error_intr_trig_r.error_inv_dev_trig.value : '0; + assign readback_array[156][2:2] = (decoded_reg_strb.intr_block_rf.error_intr_trig_r && !decoded_req_is_wr) ? field_storage.intr_block_rf.error_intr_trig_r.error_cmd_fail_trig.value : '0; + assign readback_array[156][3:3] = (decoded_reg_strb.intr_block_rf.error_intr_trig_r && !decoded_req_is_wr) ? field_storage.intr_block_rf.error_intr_trig_r.error_bad_fuse_trig.value : '0; + assign readback_array[156][4:4] = (decoded_reg_strb.intr_block_rf.error_intr_trig_r && !decoded_req_is_wr) ? field_storage.intr_block_rf.error_intr_trig_r.error_iccm_blocked_trig.value : '0; + assign readback_array[156][5:5] = (decoded_reg_strb.intr_block_rf.error_intr_trig_r && !decoded_req_is_wr) ? field_storage.intr_block_rf.error_intr_trig_r.error_mbox_ecc_unc_trig.value : '0; + assign readback_array[156][6:6] = (decoded_reg_strb.intr_block_rf.error_intr_trig_r && !decoded_req_is_wr) ? field_storage.intr_block_rf.error_intr_trig_r.error_wdt_timer1_timeout_trig.value : '0; + assign readback_array[156][7:7] = (decoded_reg_strb.intr_block_rf.error_intr_trig_r && !decoded_req_is_wr) ? field_storage.intr_block_rf.error_intr_trig_r.error_wdt_timer2_timeout_trig.value : '0; + assign readback_array[156][31:8] = '0; + assign readback_array[157][0:0] = (decoded_reg_strb.intr_block_rf.notif_intr_trig_r && !decoded_req_is_wr) ? field_storage.intr_block_rf.notif_intr_trig_r.notif_cmd_avail_trig.value : '0; + assign readback_array[157][1:1] = (decoded_reg_strb.intr_block_rf.notif_intr_trig_r && !decoded_req_is_wr) ? field_storage.intr_block_rf.notif_intr_trig_r.notif_mbox_ecc_cor_trig.value : '0; + assign readback_array[157][2:2] = (decoded_reg_strb.intr_block_rf.notif_intr_trig_r && !decoded_req_is_wr) ? field_storage.intr_block_rf.notif_intr_trig_r.notif_debug_locked_trig.value : '0; + assign readback_array[157][3:3] = (decoded_reg_strb.intr_block_rf.notif_intr_trig_r && !decoded_req_is_wr) ? field_storage.intr_block_rf.notif_intr_trig_r.notif_scan_mode_trig.value : '0; + assign readback_array[157][4:4] = (decoded_reg_strb.intr_block_rf.notif_intr_trig_r && !decoded_req_is_wr) ? field_storage.intr_block_rf.notif_intr_trig_r.notif_soc_req_lock_trig.value : '0; + assign readback_array[157][5:5] = (decoded_reg_strb.intr_block_rf.notif_intr_trig_r && !decoded_req_is_wr) ? field_storage.intr_block_rf.notif_intr_trig_r.notif_gen_in_toggle_trig.value : '0; + assign readback_array[157][31:6] = '0; + assign readback_array[158][31:0] = (decoded_reg_strb.intr_block_rf.error_internal_intr_count_r && !decoded_req_is_wr) ? field_storage.intr_block_rf.error_internal_intr_count_r.cnt.value : '0; + assign readback_array[159][31:0] = (decoded_reg_strb.intr_block_rf.error_inv_dev_intr_count_r && !decoded_req_is_wr) ? field_storage.intr_block_rf.error_inv_dev_intr_count_r.cnt.value : '0; + assign readback_array[160][31:0] = (decoded_reg_strb.intr_block_rf.error_cmd_fail_intr_count_r && !decoded_req_is_wr) ? field_storage.intr_block_rf.error_cmd_fail_intr_count_r.cnt.value : '0; + assign readback_array[161][31:0] = (decoded_reg_strb.intr_block_rf.error_bad_fuse_intr_count_r && !decoded_req_is_wr) ? field_storage.intr_block_rf.error_bad_fuse_intr_count_r.cnt.value : '0; + assign readback_array[162][31:0] = (decoded_reg_strb.intr_block_rf.error_iccm_blocked_intr_count_r && !decoded_req_is_wr) ? field_storage.intr_block_rf.error_iccm_blocked_intr_count_r.cnt.value : '0; + assign readback_array[163][31:0] = (decoded_reg_strb.intr_block_rf.error_mbox_ecc_unc_intr_count_r && !decoded_req_is_wr) ? field_storage.intr_block_rf.error_mbox_ecc_unc_intr_count_r.cnt.value : '0; + assign readback_array[164][31:0] = (decoded_reg_strb.intr_block_rf.error_wdt_timer1_timeout_intr_count_r && !decoded_req_is_wr) ? field_storage.intr_block_rf.error_wdt_timer1_timeout_intr_count_r.cnt.value : '0; + assign readback_array[165][31:0] = (decoded_reg_strb.intr_block_rf.error_wdt_timer2_timeout_intr_count_r && !decoded_req_is_wr) ? field_storage.intr_block_rf.error_wdt_timer2_timeout_intr_count_r.cnt.value : '0; + assign readback_array[166][31:0] = (decoded_reg_strb.intr_block_rf.notif_cmd_avail_intr_count_r && !decoded_req_is_wr) ? field_storage.intr_block_rf.notif_cmd_avail_intr_count_r.cnt.value : '0; + assign readback_array[167][31:0] = (decoded_reg_strb.intr_block_rf.notif_mbox_ecc_cor_intr_count_r && !decoded_req_is_wr) ? field_storage.intr_block_rf.notif_mbox_ecc_cor_intr_count_r.cnt.value : '0; + assign readback_array[168][31:0] = (decoded_reg_strb.intr_block_rf.notif_debug_locked_intr_count_r && !decoded_req_is_wr) ? field_storage.intr_block_rf.notif_debug_locked_intr_count_r.cnt.value : '0; + assign readback_array[169][31:0] = (decoded_reg_strb.intr_block_rf.notif_scan_mode_intr_count_r && !decoded_req_is_wr) ? field_storage.intr_block_rf.notif_scan_mode_intr_count_r.cnt.value : '0; + assign readback_array[170][31:0] = (decoded_reg_strb.intr_block_rf.notif_soc_req_lock_intr_count_r && !decoded_req_is_wr) ? field_storage.intr_block_rf.notif_soc_req_lock_intr_count_r.cnt.value : '0; + assign readback_array[171][31:0] = (decoded_reg_strb.intr_block_rf.notif_gen_in_toggle_intr_count_r && !decoded_req_is_wr) ? field_storage.intr_block_rf.notif_gen_in_toggle_intr_count_r.cnt.value : '0; + assign readback_array[172][0:0] = (decoded_reg_strb.intr_block_rf.error_internal_intr_count_incr_r && !decoded_req_is_wr) ? field_storage.intr_block_rf.error_internal_intr_count_incr_r.pulse.value : '0; + assign readback_array[172][31:1] = '0; + assign readback_array[173][0:0] = (decoded_reg_strb.intr_block_rf.error_inv_dev_intr_count_incr_r && !decoded_req_is_wr) ? field_storage.intr_block_rf.error_inv_dev_intr_count_incr_r.pulse.value : '0; + assign readback_array[173][31:1] = '0; + assign readback_array[174][0:0] = (decoded_reg_strb.intr_block_rf.error_cmd_fail_intr_count_incr_r && !decoded_req_is_wr) ? field_storage.intr_block_rf.error_cmd_fail_intr_count_incr_r.pulse.value : '0; + assign readback_array[174][31:1] = '0; + assign readback_array[175][0:0] = (decoded_reg_strb.intr_block_rf.error_bad_fuse_intr_count_incr_r && !decoded_req_is_wr) ? field_storage.intr_block_rf.error_bad_fuse_intr_count_incr_r.pulse.value : '0; + assign readback_array[175][31:1] = '0; + assign readback_array[176][0:0] = (decoded_reg_strb.intr_block_rf.error_iccm_blocked_intr_count_incr_r && !decoded_req_is_wr) ? field_storage.intr_block_rf.error_iccm_blocked_intr_count_incr_r.pulse.value : '0; + assign readback_array[176][31:1] = '0; + assign readback_array[177][0:0] = (decoded_reg_strb.intr_block_rf.error_mbox_ecc_unc_intr_count_incr_r && !decoded_req_is_wr) ? field_storage.intr_block_rf.error_mbox_ecc_unc_intr_count_incr_r.pulse.value : '0; + assign readback_array[177][31:1] = '0; + assign readback_array[178][0:0] = (decoded_reg_strb.intr_block_rf.error_wdt_timer1_timeout_intr_count_incr_r && !decoded_req_is_wr) ? field_storage.intr_block_rf.error_wdt_timer1_timeout_intr_count_incr_r.pulse.value : '0; + assign readback_array[178][31:1] = '0; + assign readback_array[179][0:0] = (decoded_reg_strb.intr_block_rf.error_wdt_timer2_timeout_intr_count_incr_r && !decoded_req_is_wr) ? field_storage.intr_block_rf.error_wdt_timer2_timeout_intr_count_incr_r.pulse.value : '0; + assign readback_array[179][31:1] = '0; + assign readback_array[180][0:0] = (decoded_reg_strb.intr_block_rf.notif_cmd_avail_intr_count_incr_r && !decoded_req_is_wr) ? field_storage.intr_block_rf.notif_cmd_avail_intr_count_incr_r.pulse.value : '0; + assign readback_array[180][31:1] = '0; + assign readback_array[181][0:0] = (decoded_reg_strb.intr_block_rf.notif_mbox_ecc_cor_intr_count_incr_r && !decoded_req_is_wr) ? field_storage.intr_block_rf.notif_mbox_ecc_cor_intr_count_incr_r.pulse.value : '0; + assign readback_array[181][31:1] = '0; + assign readback_array[182][0:0] = (decoded_reg_strb.intr_block_rf.notif_debug_locked_intr_count_incr_r && !decoded_req_is_wr) ? field_storage.intr_block_rf.notif_debug_locked_intr_count_incr_r.pulse.value : '0; + assign readback_array[182][31:1] = '0; + assign readback_array[183][0:0] = (decoded_reg_strb.intr_block_rf.notif_scan_mode_intr_count_incr_r && !decoded_req_is_wr) ? field_storage.intr_block_rf.notif_scan_mode_intr_count_incr_r.pulse.value : '0; + assign readback_array[183][31:1] = '0; + assign readback_array[184][0:0] = (decoded_reg_strb.intr_block_rf.notif_soc_req_lock_intr_count_incr_r && !decoded_req_is_wr) ? field_storage.intr_block_rf.notif_soc_req_lock_intr_count_incr_r.pulse.value : '0; + assign readback_array[184][31:1] = '0; + assign readback_array[185][0:0] = (decoded_reg_strb.intr_block_rf.notif_gen_in_toggle_intr_count_incr_r && !decoded_req_is_wr) ? field_storage.intr_block_rf.notif_gen_in_toggle_intr_count_incr_r.pulse.value : '0; + assign readback_array[185][31:1] = '0; // Reduce the array always_comb begin @@ -4387,13 +5676,11 @@ module soc_ifc_reg ( readback_done = decoded_req & ~decoded_req_is_wr; readback_err = '0; readback_data_var = '0; - for(int i=0; i<162; i++) readback_data_var |= readback_array[i]; + for(int i=0; i<186; i++) readback_data_var |= readback_array[i]; readback_data = readback_data_var; end assign cpuif_rd_ack = readback_done; assign cpuif_rd_data = readback_data; assign cpuif_rd_err = readback_err; - -endmodule - +endmodule \ No newline at end of file diff --git a/src/soc_ifc/rtl/soc_ifc_reg_covergroups.svh b/src/soc_ifc/rtl/soc_ifc_reg_covergroups.svh new file mode 100644 index 000000000..0b835415e --- /dev/null +++ b/src/soc_ifc/rtl/soc_ifc_reg_covergroups.svh @@ -0,0 +1,2376 @@ +// SPDX-License-Identifier: Apache-2.0 +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +`ifndef SOC_IFC_REG_COVERGROUPS + `define SOC_IFC_REG_COVERGROUPS + + /*----------------------- SOC_IFC_REG__CPTRA_HW_ERROR_FATAL COVERGROUPS -----------------------*/ + covergroup soc_ifc_reg__CPTRA_HW_ERROR_FATAL_bit_cg with function sample(input bit reg_bit); + option.per_instance = 1; + reg_bit_cp : coverpoint reg_bit { + bins value[2] = {0,1}; + } + reg_bit_edge_cp : coverpoint reg_bit { + bins rise = (0 => 1); + bins fall = (1 => 0); + } + + endgroup + covergroup soc_ifc_reg__CPTRA_HW_ERROR_FATAL_fld_cg with function sample( + input bit [1-1:0] iccm_ecc_unc, + input bit [1-1:0] dccm_ecc_unc, + input bit [1-1:0] nmi_pin + ); + option.per_instance = 1; + iccm_ecc_unc_cp : coverpoint iccm_ecc_unc; + dccm_ecc_unc_cp : coverpoint dccm_ecc_unc; + nmi_pin_cp : coverpoint nmi_pin; + + endgroup + + /*----------------------- SOC_IFC_REG__CPTRA_HW_ERROR_NON_FATAL COVERGROUPS -----------------------*/ + covergroup soc_ifc_reg__CPTRA_HW_ERROR_NON_FATAL_bit_cg with function sample(input bit reg_bit); + option.per_instance = 1; + reg_bit_cp : coverpoint reg_bit { + bins value[2] = {0,1}; + } + reg_bit_edge_cp : coverpoint reg_bit { + bins rise = (0 => 1); + bins fall = (1 => 0); + } + + endgroup + covergroup soc_ifc_reg__CPTRA_HW_ERROR_NON_FATAL_fld_cg with function sample( + input bit [1-1:0] mbox_prot_no_lock, + input bit [1-1:0] mbox_prot_ooo, + input bit [1-1:0] mbox_ecc_unc + ); + option.per_instance = 1; + mbox_prot_no_lock_cp : coverpoint mbox_prot_no_lock; + mbox_prot_ooo_cp : coverpoint mbox_prot_ooo; + mbox_ecc_unc_cp : coverpoint mbox_ecc_unc; + + endgroup + + /*----------------------- SOC_IFC_REG__CPTRA_FW_ERROR_FATAL COVERGROUPS -----------------------*/ + covergroup soc_ifc_reg__CPTRA_FW_ERROR_FATAL_bit_cg with function sample(input bit reg_bit); + option.per_instance = 1; + reg_bit_cp : coverpoint reg_bit { + bins value[2] = {0,1}; + } + reg_bit_edge_cp : coverpoint reg_bit { + bins rise = (0 => 1); + bins fall = (1 => 0); + } + + endgroup + covergroup soc_ifc_reg__CPTRA_FW_ERROR_FATAL_fld_cg with function sample( + input bit [32-1:0] error_code + ); + option.per_instance = 1; + error_code_cp : coverpoint error_code; + + endgroup + + /*----------------------- SOC_IFC_REG__CPTRA_FW_ERROR_NON_FATAL COVERGROUPS -----------------------*/ + covergroup soc_ifc_reg__CPTRA_FW_ERROR_NON_FATAL_bit_cg with function sample(input bit reg_bit); + option.per_instance = 1; + reg_bit_cp : coverpoint reg_bit { + bins value[2] = {0,1}; + } + reg_bit_edge_cp : coverpoint reg_bit { + bins rise = (0 => 1); + bins fall = (1 => 0); + } + + endgroup + covergroup soc_ifc_reg__CPTRA_FW_ERROR_NON_FATAL_fld_cg with function sample( + input bit [32-1:0] error_code + ); + option.per_instance = 1; + error_code_cp : coverpoint error_code; + + endgroup + + /*----------------------- SOC_IFC_REG__CPTRA_HW_ERROR_ENC COVERGROUPS -----------------------*/ + covergroup soc_ifc_reg__CPTRA_HW_ERROR_ENC_bit_cg with function sample(input bit reg_bit); + option.per_instance = 1; + reg_bit_cp : coverpoint reg_bit { + bins value[2] = {0,1}; + } + reg_bit_edge_cp : coverpoint reg_bit { + bins rise = (0 => 1); + bins fall = (1 => 0); + } + + endgroup + covergroup soc_ifc_reg__CPTRA_HW_ERROR_ENC_fld_cg with function sample( + input bit [32-1:0] error_code + ); + option.per_instance = 1; + error_code_cp : coverpoint error_code; + + endgroup + + /*----------------------- SOC_IFC_REG__CPTRA_FW_ERROR_ENC COVERGROUPS -----------------------*/ + covergroup soc_ifc_reg__CPTRA_FW_ERROR_ENC_bit_cg with function sample(input bit reg_bit); + option.per_instance = 1; + reg_bit_cp : coverpoint reg_bit { + bins value[2] = {0,1}; + } + reg_bit_edge_cp : coverpoint reg_bit { + bins rise = (0 => 1); + bins fall = (1 => 0); + } + + endgroup + covergroup soc_ifc_reg__CPTRA_FW_ERROR_ENC_fld_cg with function sample( + input bit [32-1:0] error_code + ); + option.per_instance = 1; + error_code_cp : coverpoint error_code; + + endgroup + + /*----------------------- SOC_IFC_REG__CPTRA_FW_EXTENDED_ERROR_INFO COVERGROUPS -----------------------*/ + covergroup soc_ifc_reg__CPTRA_FW_EXTENDED_ERROR_INFO_bit_cg with function sample(input bit reg_bit); + option.per_instance = 1; + reg_bit_cp : coverpoint reg_bit { + bins value[2] = {0,1}; + } + reg_bit_edge_cp : coverpoint reg_bit { + bins rise = (0 => 1); + bins fall = (1 => 0); + } + + endgroup + covergroup soc_ifc_reg__CPTRA_FW_EXTENDED_ERROR_INFO_fld_cg with function sample( + input bit [32-1:0] error_info + ); + option.per_instance = 1; + error_info_cp : coverpoint error_info; + + endgroup + + /*----------------------- SOC_IFC_REG__CPTRA_BOOT_STATUS COVERGROUPS -----------------------*/ + covergroup soc_ifc_reg__CPTRA_BOOT_STATUS_bit_cg with function sample(input bit reg_bit); + option.per_instance = 1; + reg_bit_cp : coverpoint reg_bit { + bins value[2] = {0,1}; + } + reg_bit_edge_cp : coverpoint reg_bit { + bins rise = (0 => 1); + bins fall = (1 => 0); + } + + endgroup + covergroup soc_ifc_reg__CPTRA_BOOT_STATUS_fld_cg with function sample( + input bit [32-1:0] status + ); + option.per_instance = 1; + status_cp : coverpoint status; + + endgroup + + /*----------------------- SOC_IFC_REG__CPTRA_FLOW_STATUS COVERGROUPS -----------------------*/ + covergroup soc_ifc_reg__CPTRA_FLOW_STATUS_bit_cg with function sample(input bit reg_bit); + option.per_instance = 1; + reg_bit_cp : coverpoint reg_bit { + bins value[2] = {0,1}; + } + reg_bit_edge_cp : coverpoint reg_bit { + bins rise = (0 => 1); + bins fall = (1 => 0); + } + + endgroup + covergroup soc_ifc_reg__CPTRA_FLOW_STATUS_fld_cg with function sample( + input bit [24-1:0] status, + input bit [1-1:0] idevid_csr_ready, + input bit [3-1:0] boot_fsm_ps, + input bit [1-1:0] ready_for_fw, + input bit [1-1:0] ready_for_runtime, + input bit [1-1:0] ready_for_fuses, + input bit [1-1:0] mailbox_flow_done + ); + option.per_instance = 1; + status_cp : coverpoint status; + idevid_csr_ready_cp : coverpoint idevid_csr_ready; + boot_fsm_ps_cp : coverpoint boot_fsm_ps; + ready_for_fw_cp : coverpoint ready_for_fw; + ready_for_runtime_cp : coverpoint ready_for_runtime; + ready_for_fuses_cp : coverpoint ready_for_fuses; + mailbox_flow_done_cp : coverpoint mailbox_flow_done; + + endgroup + + /*----------------------- SOC_IFC_REG__CPTRA_RESET_REASON COVERGROUPS -----------------------*/ + covergroup soc_ifc_reg__CPTRA_RESET_REASON_bit_cg with function sample(input bit reg_bit); + option.per_instance = 1; + reg_bit_cp : coverpoint reg_bit { + bins value[2] = {0,1}; + } + reg_bit_edge_cp : coverpoint reg_bit { + bins rise = (0 => 1); + bins fall = (1 => 0); + } + + endgroup + covergroup soc_ifc_reg__CPTRA_RESET_REASON_fld_cg with function sample( + input bit [1-1:0] FW_UPD_RESET, + input bit [1-1:0] WARM_RESET + ); + option.per_instance = 1; + FW_UPD_RESET_cp : coverpoint FW_UPD_RESET; + WARM_RESET_cp : coverpoint WARM_RESET; + + endgroup + + /*----------------------- SOC_IFC_REG__CPTRA_SECURITY_STATE COVERGROUPS -----------------------*/ + covergroup soc_ifc_reg__CPTRA_SECURITY_STATE_bit_cg with function sample(input bit reg_bit); + option.per_instance = 1; + reg_bit_cp : coverpoint reg_bit { + bins value[2] = {0,1}; + } + reg_bit_edge_cp : coverpoint reg_bit { + bins rise = (0 => 1); + bins fall = (1 => 0); + } + + endgroup + covergroup soc_ifc_reg__CPTRA_SECURITY_STATE_fld_cg with function sample( + input bit [2-1:0] device_lifecycle, + input bit [1-1:0] debug_locked, + input bit [1-1:0] scan_mode, + input bit [28-1:0] rsvd + ); + option.per_instance = 1; + device_lifecycle_cp : coverpoint device_lifecycle; + debug_locked_cp : coverpoint debug_locked; + scan_mode_cp : coverpoint scan_mode; + rsvd_cp : coverpoint rsvd; + + endgroup + + /*----------------------- SOC_IFC_REG__CPTRA_MBOX_VALID_PAUSER COVERGROUPS -----------------------*/ + covergroup soc_ifc_reg__CPTRA_MBOX_VALID_PAUSER_bit_cg with function sample(input bit reg_bit); + option.per_instance = 1; + reg_bit_cp : coverpoint reg_bit { + bins value[2] = {0,1}; + } + reg_bit_edge_cp : coverpoint reg_bit { + bins rise = (0 => 1); + bins fall = (1 => 0); + } + + endgroup + covergroup soc_ifc_reg__CPTRA_MBOX_VALID_PAUSER_fld_cg with function sample( + input bit [32-1:0] PAUSER + ); + option.per_instance = 1; + PAUSER_cp : coverpoint PAUSER; + + endgroup + + /*----------------------- SOC_IFC_REG__CPTRA_MBOX_PAUSER_LOCK COVERGROUPS -----------------------*/ + covergroup soc_ifc_reg__CPTRA_MBOX_PAUSER_LOCK_bit_cg with function sample(input bit reg_bit); + option.per_instance = 1; + reg_bit_cp : coverpoint reg_bit { + bins value[2] = {0,1}; + } + reg_bit_edge_cp : coverpoint reg_bit { + bins rise = (0 => 1); + bins fall = (1 => 0); + } + + endgroup + covergroup soc_ifc_reg__CPTRA_MBOX_PAUSER_LOCK_fld_cg with function sample( + input bit [1-1:0] LOCK + ); + option.per_instance = 1; + LOCK_cp : coverpoint LOCK; + + endgroup + + /*----------------------- SOC_IFC_REG__CPTRA_TRNG_VALID_PAUSER COVERGROUPS -----------------------*/ + covergroup soc_ifc_reg__CPTRA_TRNG_VALID_PAUSER_bit_cg with function sample(input bit reg_bit); + option.per_instance = 1; + reg_bit_cp : coverpoint reg_bit { + bins value[2] = {0,1}; + } + reg_bit_edge_cp : coverpoint reg_bit { + bins rise = (0 => 1); + bins fall = (1 => 0); + } + + endgroup + covergroup soc_ifc_reg__CPTRA_TRNG_VALID_PAUSER_fld_cg with function sample( + input bit [32-1:0] PAUSER + ); + option.per_instance = 1; + PAUSER_cp : coverpoint PAUSER { + bins zero_val = {32'h0}; + bins rand_val[64] = {[1:32'hFFFF_FFFE]}; + bins ones_val = {{32{1'b1}}}; + wildcard bins set = (0 => 32'h????_????); + wildcard bins clr = (32'h????_???? => 0); + } + + endgroup + + /*----------------------- SOC_IFC_REG__CPTRA_TRNG_PAUSER_LOCK COVERGROUPS -----------------------*/ + covergroup soc_ifc_reg__CPTRA_TRNG_PAUSER_LOCK_bit_cg with function sample(input bit reg_bit); + option.per_instance = 1; + reg_bit_cp : coverpoint reg_bit { + bins value[2] = {0,1}; + } + reg_bit_edge_cp : coverpoint reg_bit { + bins rise = (0 => 1); + bins fall = (1 => 0); + } + + endgroup + covergroup soc_ifc_reg__CPTRA_TRNG_PAUSER_LOCK_fld_cg with function sample( + input bit [1-1:0] LOCK + ); + option.per_instance = 1; + LOCK_cp : coverpoint LOCK; + + endgroup + + /*----------------------- SOC_IFC_REG__CPTRA_TRNG_DATA COVERGROUPS -----------------------*/ + covergroup soc_ifc_reg__CPTRA_TRNG_DATA_bit_cg with function sample(input bit reg_bit); + option.per_instance = 1; + reg_bit_cp : coverpoint reg_bit { + bins value[2] = {0,1}; + } + reg_bit_edge_cp : coverpoint reg_bit { + bins rise = (0 => 1); + bins fall = (1 => 0); + } + + endgroup + covergroup soc_ifc_reg__CPTRA_TRNG_DATA_fld_cg with function sample( + input bit [32-1:0] DATA + ); + option.per_instance = 1; + DATA_cp : coverpoint DATA { + bins zero_val = {32'h0}; + bins rand_val[64] = {[1:32'hFFFF_FFFE]}; + bins ones_val = {{32{1'b1}}}; + wildcard bins set = (0 => 32'h????_????); + wildcard bins clr = (32'h????_???? => 0); + } + + endgroup + + /*----------------------- SOC_IFC_REG__CPTRA_TRNG_CTRL COVERGROUPS -----------------------*/ + covergroup soc_ifc_reg__CPTRA_TRNG_CTRL_bit_cg with function sample(input bit reg_bit); + option.per_instance = 1; + reg_bit_cp : coverpoint reg_bit { + bins value[2] = {0,1}; + } + reg_bit_edge_cp : coverpoint reg_bit { + bins rise = (0 => 1); + bins fall = (1 => 0); + } + + endgroup + covergroup soc_ifc_reg__CPTRA_TRNG_CTRL_fld_cg with function sample( + input bit [1-1:0] clear + ); + option.per_instance = 1; + clear_cp : coverpoint clear; + + endgroup + + /*----------------------- SOC_IFC_REG__CPTRA_TRNG_STATUS COVERGROUPS -----------------------*/ + covergroup soc_ifc_reg__CPTRA_TRNG_STATUS_bit_cg with function sample(input bit reg_bit); + option.per_instance = 1; + reg_bit_cp : coverpoint reg_bit { + bins value[2] = {0,1}; + } + reg_bit_edge_cp : coverpoint reg_bit { + bins rise = (0 => 1); + bins fall = (1 => 0); + } + + endgroup + covergroup soc_ifc_reg__CPTRA_TRNG_STATUS_fld_cg with function sample( + input bit [1-1:0] DATA_REQ, + input bit [1-1:0] DATA_WR_DONE + ); + option.per_instance = 1; + DATA_REQ_cp : coverpoint DATA_REQ; + DATA_WR_DONE_cp : coverpoint DATA_WR_DONE; + + endgroup + + /*----------------------- SOC_IFC_REG__CPTRA_FUSE_WR_DONE COVERGROUPS -----------------------*/ + covergroup soc_ifc_reg__CPTRA_FUSE_WR_DONE_bit_cg with function sample(input bit reg_bit); + option.per_instance = 1; + reg_bit_cp : coverpoint reg_bit { + bins value[2] = {0,1}; + } + reg_bit_edge_cp : coverpoint reg_bit { + bins rise = (0 => 1); + bins fall = (1 => 0); + } + + endgroup + covergroup soc_ifc_reg__CPTRA_FUSE_WR_DONE_fld_cg with function sample( + input bit [1-1:0] done + ); + option.per_instance = 1; + done_cp : coverpoint done; + + endgroup + + /*----------------------- SOC_IFC_REG__CPTRA_TIMER_CONFIG COVERGROUPS -----------------------*/ + covergroup soc_ifc_reg__CPTRA_TIMER_CONFIG_bit_cg with function sample(input bit reg_bit); + option.per_instance = 1; + reg_bit_cp : coverpoint reg_bit { + bins value[2] = {0,1}; + } + reg_bit_edge_cp : coverpoint reg_bit { + bins rise = (0 => 1); + bins fall = (1 => 0); + } + + endgroup + covergroup soc_ifc_reg__CPTRA_TIMER_CONFIG_fld_cg with function sample( + input bit [32-1:0] clk_period + ); + option.per_instance = 1; + clk_period_cp : coverpoint clk_period; + + endgroup + + /*----------------------- SOC_IFC_REG__CPTRA_BOOTFSM_GO COVERGROUPS -----------------------*/ + covergroup soc_ifc_reg__CPTRA_BOOTFSM_GO_bit_cg with function sample(input bit reg_bit); + option.per_instance = 1; + reg_bit_cp : coverpoint reg_bit { + bins value[2] = {0,1}; + } + reg_bit_edge_cp : coverpoint reg_bit { + bins rise = (0 => 1); + bins fall = (1 => 0); + } + + endgroup + covergroup soc_ifc_reg__CPTRA_BOOTFSM_GO_fld_cg with function sample( + input bit [1-1:0] GO + ); + option.per_instance = 1; + GO_cp : coverpoint GO; + + endgroup + + /*----------------------- SOC_IFC_REG__CPTRA_DBG_MANUF_SERVICE_REG COVERGROUPS -----------------------*/ + covergroup soc_ifc_reg__CPTRA_DBG_MANUF_SERVICE_REG_bit_cg with function sample(input bit reg_bit); + option.per_instance = 1; + reg_bit_cp : coverpoint reg_bit { + bins value[2] = {0,1}; + } + reg_bit_edge_cp : coverpoint reg_bit { + bins rise = (0 => 1); + bins fall = (1 => 0); + } + + endgroup + covergroup soc_ifc_reg__CPTRA_DBG_MANUF_SERVICE_REG_fld_cg with function sample( + input bit [32-1:0] DATA + ); + option.per_instance = 1; + DATA_cp : coverpoint DATA { + bins zero_val = {32'h0}; + bins rand_val[64] = {[1:32'hFFFF_FFFE]}; + bins ones_val = {{32{1'b1}}}; + wildcard bins set = (0 => 32'h????_????); + wildcard bins clr = (32'h????_???? => 0); + } + + endgroup + + /*----------------------- SOC_IFC_REG__CPTRA_CLK_GATING_EN COVERGROUPS -----------------------*/ + covergroup soc_ifc_reg__CPTRA_CLK_GATING_EN_bit_cg with function sample(input bit reg_bit); + option.per_instance = 1; + reg_bit_cp : coverpoint reg_bit { + bins value[2] = {0,1}; + } + reg_bit_edge_cp : coverpoint reg_bit { + bins rise = (0 => 1); + bins fall = (1 => 0); + } + + endgroup + covergroup soc_ifc_reg__CPTRA_CLK_GATING_EN_fld_cg with function sample( + input bit [1-1:0] clk_gating_en + ); + option.per_instance = 1; + clk_gating_en_cp : coverpoint clk_gating_en; + + endgroup + + /*----------------------- SOC_IFC_REG__CPTRA_GENERIC_INPUT_WIRES COVERGROUPS -----------------------*/ + covergroup soc_ifc_reg__CPTRA_GENERIC_INPUT_WIRES_bit_cg with function sample(input bit reg_bit); + option.per_instance = 1; + reg_bit_cp : coverpoint reg_bit { + bins value[2] = {0,1}; + } + reg_bit_edge_cp : coverpoint reg_bit { + bins rise = (0 => 1); + bins fall = (1 => 0); + } + + endgroup + covergroup soc_ifc_reg__CPTRA_GENERIC_INPUT_WIRES_fld_cg with function sample( + input bit [32-1:0] generic_wires + ); + option.per_instance = 1; + generic_wires_cp : coverpoint generic_wires { + bins byte_none = {64'h0000_0000_0000_0000}; + bins byte_0 = {[0:$]} with ($countones(item[ 7: 0] > 0)); + bins byte_1 = {[0:$]} with ($countones(item[15: 8] > 0)); + bins byte_2 = {[0:$]} with ($countones(item[23:16] > 0)); + bins byte_3 = {[0:$]} with ($countones(item[31:24] > 0)); + } + + endgroup + + /*----------------------- SOC_IFC_REG__CPTRA_GENERIC_OUTPUT_WIRES COVERGROUPS -----------------------*/ + covergroup soc_ifc_reg__CPTRA_GENERIC_OUTPUT_WIRES_bit_cg with function sample(input bit reg_bit); + option.per_instance = 1; + reg_bit_cp : coverpoint reg_bit { + bins value[2] = {0,1}; + } + reg_bit_edge_cp : coverpoint reg_bit { + bins rise = (0 => 1); + bins fall = (1 => 0); + } + + endgroup + covergroup soc_ifc_reg__CPTRA_GENERIC_OUTPUT_WIRES_fld_cg with function sample( + input bit [32-1:0] generic_wires + ); + option.per_instance = 1; + generic_wires_cp : coverpoint generic_wires { + bins byte_none = {64'h0000_0000_0000_0000}; + bins byte_0 = {[0:$]} with ($countones(item[ 7: 0] > 0)); + bins byte_1 = {[0:$]} with ($countones(item[15: 8] > 0)); + bins byte_2 = {[0:$]} with ($countones(item[23:16] > 0)); + bins byte_3 = {[0:$]} with ($countones(item[31:24] > 0)); + } + + endgroup + + /*----------------------- SOC_IFC_REG__CPTRA_HW_REV_ID COVERGROUPS -----------------------*/ + covergroup soc_ifc_reg__CPTRA_HW_REV_ID_bit_cg with function sample(input bit reg_bit); + option.per_instance = 1; + reg_bit_cp : coverpoint reg_bit { + bins value[2] = {0,1}; + } + reg_bit_edge_cp : coverpoint reg_bit { + bins rise = (0 => 1); + bins fall = (1 => 0); + } + + endgroup + covergroup soc_ifc_reg__CPTRA_HW_REV_ID_fld_cg with function sample( + input bit [16-1:0] CPTRA_GENERATION, + input bit [16-1:0] SOC_STEPPING_ID + ); + option.per_instance = 1; + CPTRA_GENERATION_cp : coverpoint CPTRA_GENERATION; // FIXME + SOC_STEPPING_ID_cp : coverpoint SOC_STEPPING_ID; // FIXME + + endgroup + + /*----------------------- SOC_IFC_REG__CPTRA_FW_REV_ID COVERGROUPS -----------------------*/ + covergroup soc_ifc_reg__CPTRA_FW_REV_ID_bit_cg with function sample(input bit reg_bit); + option.per_instance = 1; + reg_bit_cp : coverpoint reg_bit { + bins value[2] = {0,1}; + } + reg_bit_edge_cp : coverpoint reg_bit { + bins rise = (0 => 1); + bins fall = (1 => 0); + } + + endgroup + covergroup soc_ifc_reg__CPTRA_FW_REV_ID_fld_cg with function sample( + input bit [32-1:0] REV_ID + ); + option.per_instance = 1; + REV_ID_cp : coverpoint REV_ID; // FIXME + + endgroup + + /*----------------------- SOC_IFC_REG__CPTRA_HW_CONFIG COVERGROUPS -----------------------*/ + covergroup soc_ifc_reg__CPTRA_HW_CONFIG_bit_cg with function sample(input bit reg_bit); + option.per_instance = 1; + reg_bit_cp : coverpoint reg_bit { + bins value[2] = {0,1}; + } + reg_bit_edge_cp : coverpoint reg_bit { + bins rise = (0 => 1); + bins fall = (1 => 0); + } + + endgroup + covergroup soc_ifc_reg__CPTRA_HW_CONFIG_fld_cg with function sample( + input bit [1-1:0] iTRNG_en, + input bit [1-1:0] QSPI_en, + input bit [1-1:0] I3C_en, + input bit [1-1:0] UART_en + ); + option.per_instance = 1; + iTRNG_en_cp : coverpoint iTRNG_en; + QSPI_en_cp : coverpoint QSPI_en; + I3C_en_cp : coverpoint I3C_en; + UART_en_cp : coverpoint UART_en; + + endgroup + + /*----------------------- SOC_IFC_REG__CPTRA_WDT_TIMER1_EN COVERGROUPS -----------------------*/ + covergroup soc_ifc_reg__CPTRA_WDT_TIMER1_EN_bit_cg with function sample(input bit reg_bit); + option.per_instance = 1; + reg_bit_cp : coverpoint reg_bit { + bins value[2] = {0,1}; + } + reg_bit_edge_cp : coverpoint reg_bit { + bins rise = (0 => 1); + bins fall = (1 => 0); + } + + endgroup + covergroup soc_ifc_reg__CPTRA_WDT_TIMER1_EN_fld_cg with function sample( + input bit [1-1:0] timer1_en + ); + option.per_instance = 1; + timer1_en_cp : coverpoint timer1_en; + + endgroup + + /*----------------------- SOC_IFC_REG__CPTRA_WDT_TIMER1_CTRL COVERGROUPS -----------------------*/ + covergroup soc_ifc_reg__CPTRA_WDT_TIMER1_CTRL_bit_cg with function sample(input bit reg_bit); + option.per_instance = 1; + reg_bit_cp : coverpoint reg_bit { + bins value[2] = {0,1}; + } + reg_bit_edge_cp : coverpoint reg_bit { + bins rise = (0 => 1); + bins fall = (1 => 0); + } + + endgroup + covergroup soc_ifc_reg__CPTRA_WDT_TIMER1_CTRL_fld_cg with function sample( + input bit [1-1:0] timer1_restart + ); + option.per_instance = 1; + timer1_restart_cp : coverpoint timer1_restart; + + endgroup + + /*----------------------- SOC_IFC_REG__CPTRA_WDT_TIMER1_TIMEOUT_PERIOD COVERGROUPS -----------------------*/ + covergroup soc_ifc_reg__CPTRA_WDT_TIMER1_TIMEOUT_PERIOD_bit_cg with function sample(input bit reg_bit); + option.per_instance = 1; + reg_bit_cp : coverpoint reg_bit { + bins value[2] = {0,1}; + } + reg_bit_edge_cp : coverpoint reg_bit { + bins rise = (0 => 1); + bins fall = (1 => 0); + } + + endgroup + covergroup soc_ifc_reg__CPTRA_WDT_TIMER1_TIMEOUT_PERIOD_fld_cg with function sample( + input bit [32-1:0] timer1_timeout_period + ); + option.per_instance = 1; + timer1_timeout_period_cp : coverpoint timer1_timeout_period; + + endgroup + + /*----------------------- SOC_IFC_REG__CPTRA_WDT_TIMER2_EN COVERGROUPS -----------------------*/ + covergroup soc_ifc_reg__CPTRA_WDT_TIMER2_EN_bit_cg with function sample(input bit reg_bit); + option.per_instance = 1; + reg_bit_cp : coverpoint reg_bit { + bins value[2] = {0,1}; + } + reg_bit_edge_cp : coverpoint reg_bit { + bins rise = (0 => 1); + bins fall = (1 => 0); + } + + endgroup + covergroup soc_ifc_reg__CPTRA_WDT_TIMER2_EN_fld_cg with function sample( + input bit [1-1:0] timer2_en + ); + option.per_instance = 1; + timer2_en_cp : coverpoint timer2_en; + + endgroup + + /*----------------------- SOC_IFC_REG__CPTRA_WDT_TIMER2_CTRL COVERGROUPS -----------------------*/ + covergroup soc_ifc_reg__CPTRA_WDT_TIMER2_CTRL_bit_cg with function sample(input bit reg_bit); + option.per_instance = 1; + reg_bit_cp : coverpoint reg_bit { + bins value[2] = {0,1}; + } + reg_bit_edge_cp : coverpoint reg_bit { + bins rise = (0 => 1); + bins fall = (1 => 0); + } + + endgroup + covergroup soc_ifc_reg__CPTRA_WDT_TIMER2_CTRL_fld_cg with function sample( + input bit [1-1:0] timer2_restart + ); + option.per_instance = 1; + timer2_restart_cp : coverpoint timer2_restart; + + endgroup + + /*----------------------- SOC_IFC_REG__CPTRA_WDT_TIMER2_TIMEOUT_PERIOD COVERGROUPS -----------------------*/ + covergroup soc_ifc_reg__CPTRA_WDT_TIMER2_TIMEOUT_PERIOD_bit_cg with function sample(input bit reg_bit); + option.per_instance = 1; + reg_bit_cp : coverpoint reg_bit { + bins value[2] = {0,1}; + } + reg_bit_edge_cp : coverpoint reg_bit { + bins rise = (0 => 1); + bins fall = (1 => 0); + } + + endgroup + covergroup soc_ifc_reg__CPTRA_WDT_TIMER2_TIMEOUT_PERIOD_fld_cg with function sample( + input bit [32-1:0] timer2_timeout_period + ); + option.per_instance = 1; + timer2_timeout_period_cp : coverpoint timer2_timeout_period; + + endgroup + + /*----------------------- SOC_IFC_REG__CPTRA_WDT_STATUS COVERGROUPS -----------------------*/ + covergroup soc_ifc_reg__CPTRA_WDT_STATUS_bit_cg with function sample(input bit reg_bit); + option.per_instance = 1; + reg_bit_cp : coverpoint reg_bit { + bins value[2] = {0,1}; + } + reg_bit_edge_cp : coverpoint reg_bit { + bins rise = (0 => 1); + bins fall = (1 => 0); + } + + endgroup + covergroup soc_ifc_reg__CPTRA_WDT_STATUS_fld_cg with function sample( + input bit [1-1:0] t1_timeout, + input bit [1-1:0] t2_timeout + ); + option.per_instance = 1; + t1_timeout_cp : coverpoint t1_timeout; + t2_timeout_cp : coverpoint t2_timeout; + + endgroup + + /*----------------------- SOC_IFC_REG__CPTRA_FUSE_VALID_PAUSER COVERGROUPS -----------------------*/ + covergroup soc_ifc_reg__CPTRA_FUSE_VALID_PAUSER_bit_cg with function sample(input bit reg_bit); + option.per_instance = 1; + reg_bit_cp : coverpoint reg_bit { + bins value[2] = {0,1}; + } + reg_bit_edge_cp : coverpoint reg_bit { + bins rise = (0 => 1); + bins fall = (1 => 0); + } + + endgroup + covergroup soc_ifc_reg__CPTRA_FUSE_VALID_PAUSER_fld_cg with function sample( + input bit [32-1:0] PAUSER + ); + option.per_instance = 1; + PAUSER_cp : coverpoint PAUSER { + bins zero_val = {32'h0}; + bins rand_val[64] = {[1:32'hFFFF_FFFE]}; + bins ones_val = {{32{1'b1}}}; + wildcard bins set = (0 => 32'h????_????); + wildcard bins clr = (32'h????_???? => 0); + } + + endgroup + + /*----------------------- SOC_IFC_REG__CPTRA_FUSE_PAUSER_LOCK COVERGROUPS -----------------------*/ + covergroup soc_ifc_reg__CPTRA_FUSE_PAUSER_LOCK_bit_cg with function sample(input bit reg_bit); + option.per_instance = 1; + reg_bit_cp : coverpoint reg_bit { + bins value[2] = {0,1}; + } + reg_bit_edge_cp : coverpoint reg_bit { + bins rise = (0 => 1); + bins fall = (1 => 0); + } + + endgroup + covergroup soc_ifc_reg__CPTRA_FUSE_PAUSER_LOCK_fld_cg with function sample( + input bit [1-1:0] LOCK + ); + option.per_instance = 1; + LOCK_cp : coverpoint LOCK; + + endgroup + + /*----------------------- SOC_IFC_REG__CPTRA_WDT_CFG COVERGROUPS -----------------------*/ + covergroup soc_ifc_reg__CPTRA_WDT_CFG_bit_cg with function sample(input bit reg_bit); + option.per_instance = 1; + reg_bit_cp : coverpoint reg_bit { + bins value[2] = {0,1}; + } + reg_bit_edge_cp : coverpoint reg_bit { + bins rise = (0 => 1); + bins fall = (1 => 0); + } + + endgroup + covergroup soc_ifc_reg__CPTRA_WDT_CFG_fld_cg with function sample( + input bit [32-1:0] TIMEOUT + ); + option.per_instance = 1; + TIMEOUT_cp : coverpoint TIMEOUT; + + endgroup + + /*----------------------- SOC_IFC_REG__CPTRA_ITRNG_ENTROPY_CONFIG_0 COVERGROUPS -----------------------*/ + covergroup soc_ifc_reg__CPTRA_iTRNG_ENTROPY_CONFIG_0_bit_cg with function sample(input bit reg_bit); + option.per_instance = 1; + reg_bit_cp : coverpoint reg_bit { + bins value[2] = {0,1}; + } + reg_bit_edge_cp : coverpoint reg_bit { + bins rise = (0 => 1); + bins fall = (1 => 0); + } + + endgroup + covergroup soc_ifc_reg__CPTRA_iTRNG_ENTROPY_CONFIG_0_fld_cg with function sample( + input bit [16-1:0] low_threshold, + input bit [16-1:0] high_threshold + ); + option.per_instance = 1; + low_threshold_cp : coverpoint low_threshold; + high_threshold_cp : coverpoint high_threshold; + + endgroup + + /*----------------------- SOC_IFC_REG__CPTRA_ITRNG_ENTROPY_CONFIG_1 COVERGROUPS -----------------------*/ + covergroup soc_ifc_reg__CPTRA_iTRNG_ENTROPY_CONFIG_1_bit_cg with function sample(input bit reg_bit); + option.per_instance = 1; + reg_bit_cp : coverpoint reg_bit { + bins value[2] = {0,1}; + } + reg_bit_edge_cp : coverpoint reg_bit { + bins rise = (0 => 1); + bins fall = (1 => 0); + } + + endgroup + covergroup soc_ifc_reg__CPTRA_iTRNG_ENTROPY_CONFIG_1_fld_cg with function sample( + input bit [16-1:0] repetition_count, + input bit [16-1:0] RSVD + ); + option.per_instance = 1; + repetition_count_cp : coverpoint repetition_count; + RSVD_cp : coverpoint RSVD; + + endgroup + + /*----------------------- SOC_IFC_REG__CPTRA_RSVD_REG COVERGROUPS -----------------------*/ + covergroup soc_ifc_reg__CPTRA_RSVD_REG_bit_cg with function sample(input bit reg_bit); + option.per_instance = 1; + reg_bit_cp : coverpoint reg_bit { + bins value[2] = {0,1}; + } + reg_bit_edge_cp : coverpoint reg_bit { + bins rise = (0 => 1); + bins fall = (1 => 0); + } + + endgroup + covergroup soc_ifc_reg__CPTRA_RSVD_REG_fld_cg with function sample( + input bit [32-1:0] RSVD + ); + option.per_instance = 1; + RSVD_cp : coverpoint RSVD; + + endgroup + + /*----------------------- SOC_IFC_REG__FUSE_UDS_SEED COVERGROUPS -----------------------*/ + covergroup soc_ifc_reg__fuse_uds_seed_bit_cg with function sample(input bit reg_bit); + option.per_instance = 1; + reg_bit_cp : coverpoint reg_bit { + bins value[2] = {0,1}; + } + reg_bit_edge_cp : coverpoint reg_bit { + bins rise = (0 => 1); + bins fall = (1 => 0); + } + + endgroup + covergroup soc_ifc_reg__fuse_uds_seed_fld_cg with function sample( + input bit [32-1:0] seed + ); + option.per_instance = 1; + seed_cp : coverpoint seed { + bins zero_val = {32'h0}; + bins rand_val[64] = {[1:32'hFFFF_FFFE]}; + bins ones_val = {{32{1'b1}}}; + wildcard bins set = (0 => 32'h????_????); + wildcard bins clr = (32'h????_???? => 0); + } + + endgroup + + /*----------------------- SOC_IFC_REG__FUSE_FIELD_ENTROPY COVERGROUPS -----------------------*/ + covergroup soc_ifc_reg__fuse_field_entropy_bit_cg with function sample(input bit reg_bit); + option.per_instance = 1; + reg_bit_cp : coverpoint reg_bit { + bins value[2] = {0,1}; + } + reg_bit_edge_cp : coverpoint reg_bit { + bins rise = (0 => 1); + bins fall = (1 => 0); + } + + endgroup + covergroup soc_ifc_reg__fuse_field_entropy_fld_cg with function sample( + input bit [32-1:0] seed + ); + option.per_instance = 1; + seed_cp : coverpoint seed { + bins zero_val = {32'h0}; + bins rand_val[64] = {[1:32'hFFFF_FFFE]}; + bins ones_val = {{32{1'b1}}}; + wildcard bins set = (0 => 32'h????_????); + wildcard bins clr = (32'h????_???? => 0); + } + + endgroup + + /*----------------------- SOC_IFC_REG__FUSE_KEY_MANIFEST_PK_HASH COVERGROUPS -----------------------*/ + covergroup soc_ifc_reg__fuse_key_manifest_pk_hash_bit_cg with function sample(input bit reg_bit); + option.per_instance = 1; + reg_bit_cp : coverpoint reg_bit { + bins value[2] = {0,1}; + } + reg_bit_edge_cp : coverpoint reg_bit { + bins rise = (0 => 1); + bins fall = (1 => 0); + } + + endgroup + covergroup soc_ifc_reg__fuse_key_manifest_pk_hash_fld_cg with function sample( + input bit [32-1:0] hash + ); + option.per_instance = 1; + hash_cp : coverpoint hash { + bins zero_val = {32'h0}; + bins rand_val[64] = {[1:32'hFFFF_FFFE]}; + bins ones_val = {{32{1'b1}}}; + wildcard bins set = (0 => 32'h????_????); + wildcard bins clr = (32'h????_???? => 0); + } + + endgroup + + /*----------------------- SOC_IFC_REG__FUSE_KEY_MANIFEST_PK_HASH_MASK COVERGROUPS -----------------------*/ + covergroup soc_ifc_reg__fuse_key_manifest_pk_hash_mask_bit_cg with function sample(input bit reg_bit); + option.per_instance = 1; + reg_bit_cp : coverpoint reg_bit { + bins value[2] = {0,1}; + } + reg_bit_edge_cp : coverpoint reg_bit { + bins rise = (0 => 1); + bins fall = (1 => 0); + } + + endgroup + covergroup soc_ifc_reg__fuse_key_manifest_pk_hash_mask_fld_cg with function sample( + input bit [4-1:0] mask + ); + option.per_instance = 1; + mask_cp : coverpoint mask { + bins zero_val = {4'h0}; + bins rand_val[4] = {[1:4'hE]}; + bins ones_val = {{4{1'b1}}}; + wildcard bins set = (0 => 4'h?); + wildcard bins clr = (4'h? => 0); + } + + endgroup + + /*----------------------- SOC_IFC_REG__FUSE_OWNER_PK_HASH COVERGROUPS -----------------------*/ + covergroup soc_ifc_reg__fuse_owner_pk_hash_bit_cg with function sample(input bit reg_bit); + option.per_instance = 1; + reg_bit_cp : coverpoint reg_bit { + bins value[2] = {0,1}; + } + reg_bit_edge_cp : coverpoint reg_bit { + bins rise = (0 => 1); + bins fall = (1 => 0); + } + + endgroup + covergroup soc_ifc_reg__fuse_owner_pk_hash_fld_cg with function sample( + input bit [32-1:0] hash + ); + option.per_instance = 1; + hash_cp : coverpoint hash { + bins zero_val = {32'h0}; + bins rand_val[64] = {[1:32'hFFFF_FFFE]}; + bins ones_val = {{32{1'b1}}}; + wildcard bins set = (0 => 32'h????_????); + wildcard bins clr = (32'h????_???? => 0); + } + + endgroup + + /*----------------------- SOC_IFC_REG__FUSE_FMC_KEY_MANIFEST_SVN COVERGROUPS -----------------------*/ + covergroup soc_ifc_reg__fuse_fmc_key_manifest_svn_bit_cg with function sample(input bit reg_bit); + option.per_instance = 1; + reg_bit_cp : coverpoint reg_bit { + bins value[2] = {0,1}; + } + reg_bit_edge_cp : coverpoint reg_bit { + bins rise = (0 => 1); + bins fall = (1 => 0); + } + + endgroup + covergroup soc_ifc_reg__fuse_fmc_key_manifest_svn_fld_cg with function sample( + input bit [32-1:0] svn + ); + option.per_instance = 1; + svn_cp : coverpoint svn { + bins zero_val = {32'h0}; + bins rand_val[64] = {[1:32'hFFFF_FFFE]}; + bins ones_val = {{32{1'b1}}}; + wildcard bins set = (0 => 32'h????_????); + wildcard bins clr = (32'h????_???? => 0); + } + + endgroup + + /*----------------------- SOC_IFC_REG__FUSE_RUNTIME_SVN COVERGROUPS -----------------------*/ + covergroup soc_ifc_reg__fuse_runtime_svn_bit_cg with function sample(input bit reg_bit); + option.per_instance = 1; + reg_bit_cp : coverpoint reg_bit { + bins value[2] = {0,1}; + } + reg_bit_edge_cp : coverpoint reg_bit { + bins rise = (0 => 1); + bins fall = (1 => 0); + } + + endgroup + covergroup soc_ifc_reg__fuse_runtime_svn_fld_cg with function sample( + input bit [32-1:0] svn + ); + option.per_instance = 1; + svn_cp : coverpoint svn { + bins zero_val = {32'h0}; + bins rand_val[64] = {[1:32'hFFFF_FFFE]}; + bins ones_val = {{32{1'b1}}}; + wildcard bins set = (0 => 32'h????_????); + wildcard bins clr = (32'h????_???? => 0); + } + + endgroup + + /*----------------------- SOC_IFC_REG__FUSE_ANTI_ROLLBACK_DISABLE COVERGROUPS -----------------------*/ + covergroup soc_ifc_reg__fuse_anti_rollback_disable_bit_cg with function sample(input bit reg_bit); + option.per_instance = 1; + reg_bit_cp : coverpoint reg_bit { + bins value[2] = {0,1}; + } + reg_bit_edge_cp : coverpoint reg_bit { + bins rise = (0 => 1); + bins fall = (1 => 0); + } + + endgroup + covergroup soc_ifc_reg__fuse_anti_rollback_disable_fld_cg with function sample( + input bit [1-1:0] dis + ); + option.per_instance = 1; + dis_cp : coverpoint dis; + + endgroup + + /*----------------------- SOC_IFC_REG__FUSE_IDEVID_CERT_ATTR COVERGROUPS -----------------------*/ + covergroup soc_ifc_reg__fuse_idevid_cert_attr_bit_cg with function sample(input bit reg_bit); + option.per_instance = 1; + reg_bit_cp : coverpoint reg_bit { + bins value[2] = {0,1}; + } + reg_bit_edge_cp : coverpoint reg_bit { + bins rise = (0 => 1); + bins fall = (1 => 0); + } + + endgroup + covergroup soc_ifc_reg__fuse_idevid_cert_attr_fld_cg with function sample( + input bit [32-1:0] cert + ); + option.per_instance = 1; + cert_cp : coverpoint cert { + bins zero_val = {32'h0}; + bins rand_val[64] = {[1:32'hFFFF_FFFE]}; + bins ones_val = {{32{1'b1}}}; + wildcard bins set = (0 => 32'h????_????); + wildcard bins clr = (32'h????_???? => 0); + } + + endgroup + + /*----------------------- SOC_IFC_REG__FUSE_IDEVID_MANUF_HSM_ID COVERGROUPS -----------------------*/ + covergroup soc_ifc_reg__fuse_idevid_manuf_hsm_id_bit_cg with function sample(input bit reg_bit); + option.per_instance = 1; + reg_bit_cp : coverpoint reg_bit { + bins value[2] = {0,1}; + } + reg_bit_edge_cp : coverpoint reg_bit { + bins rise = (0 => 1); + bins fall = (1 => 0); + } + + endgroup + covergroup soc_ifc_reg__fuse_idevid_manuf_hsm_id_fld_cg with function sample( + input bit [32-1:0] hsm_id + ); + option.per_instance = 1; + hsm_id_cp : coverpoint hsm_id { + bins zero_val = {32'h0}; + bins rand_val[64] = {[1:32'hFFFF_FFFE]}; + bins ones_val = {{32{1'b1}}}; + wildcard bins set = (0 => 32'h????_????); + wildcard bins clr = (32'h????_???? => 0); + } + + endgroup + + /*----------------------- SOC_IFC_REG__FUSE_LIFE_CYCLE COVERGROUPS -----------------------*/ + covergroup soc_ifc_reg__fuse_life_cycle_bit_cg with function sample(input bit reg_bit); + option.per_instance = 1; + reg_bit_cp : coverpoint reg_bit { + bins value[2] = {0,1}; + } + reg_bit_edge_cp : coverpoint reg_bit { + bins rise = (0 => 1); + bins fall = (1 => 0); + } + + endgroup + covergroup soc_ifc_reg__fuse_life_cycle_fld_cg with function sample( + input bit [2-1:0] life_cycle + ); + option.per_instance = 1; + life_cycle_cp : coverpoint life_cycle; + + endgroup + + /*----------------------- SOC_IFC_REG__FUSE_LMS_VERIFY COVERGROUPS -----------------------*/ + covergroup soc_ifc_reg__fuse_lms_verify_bit_cg with function sample(input bit reg_bit); + option.per_instance = 1; + reg_bit_cp : coverpoint reg_bit { + bins value[2] = {0,1}; + } + reg_bit_edge_cp : coverpoint reg_bit { + bins rise = (0 => 1); + bins fall = (1 => 0); + } + + endgroup + covergroup soc_ifc_reg__fuse_lms_verify_fld_cg with function sample( + input bit [1-1:0] lms_verify + ); + option.per_instance = 1; + lms_verify_cp : coverpoint lms_verify; + + endgroup + + /*----------------------- SOC_IFC_REG__FUSE_LMS_REVOCATION COVERGROUPS -----------------------*/ + covergroup soc_ifc_reg__fuse_lms_revocation_bit_cg with function sample(input bit reg_bit); + option.per_instance = 1; + reg_bit_cp : coverpoint reg_bit { + bins value[2] = {0,1}; + } + reg_bit_edge_cp : coverpoint reg_bit { + bins rise = (0 => 1); + bins fall = (1 => 0); + } + + endgroup + covergroup soc_ifc_reg__fuse_lms_revocation_fld_cg with function sample( + input bit [32-1:0] lms_revocation + ); + option.per_instance = 1; + lms_revocation_cp : coverpoint lms_revocation; + + endgroup + + /*----------------------- SOC_IFC_REG__FUSE_SOC_STEPPING_ID COVERGROUPS -----------------------*/ + covergroup soc_ifc_reg__fuse_soc_stepping_id_bit_cg with function sample(input bit reg_bit); + option.per_instance = 1; + reg_bit_cp : coverpoint reg_bit { + bins value[2] = {0,1}; + } + reg_bit_edge_cp : coverpoint reg_bit { + bins rise = (0 => 1); + bins fall = (1 => 0); + } + + endgroup + covergroup soc_ifc_reg__fuse_soc_stepping_id_fld_cg with function sample( + input bit [16-1:0] soc_stepping_id + ); + option.per_instance = 1; + soc_stepping_id_cp : coverpoint soc_stepping_id; + + endgroup + + /*----------------------- SOC_IFC_REG__INTERNAL_OBF_KEY COVERGROUPS -----------------------*/ + covergroup soc_ifc_reg__internal_obf_key_bit_cg with function sample(input bit reg_bit); + option.per_instance = 1; + reg_bit_cp : coverpoint reg_bit { + bins value[2] = {0,1}; + } + reg_bit_edge_cp : coverpoint reg_bit { + bins rise = (0 => 1); + bins fall = (1 => 0); + } + + endgroup + covergroup soc_ifc_reg__internal_obf_key_fld_cg with function sample( + input bit [32-1:0] key + ); + option.per_instance = 1; + key_cp : coverpoint key { + bins zero_val = {32'h0}; + bins rand_val[64] = {[1:32'hFFFF_FFFE]}; + bins ones_val = {{32{1'b1}}}; + wildcard bins set = (0 => 32'h????_????); + wildcard bins clr = (32'h????_???? => 0); + } + + endgroup + + /*----------------------- SOC_IFC_REG__INTERNAL_ICCM_LOCK COVERGROUPS -----------------------*/ + covergroup soc_ifc_reg__internal_iccm_lock_bit_cg with function sample(input bit reg_bit); + option.per_instance = 1; + reg_bit_cp : coverpoint reg_bit { + bins value[2] = {0,1}; + } + reg_bit_edge_cp : coverpoint reg_bit { + bins rise = (0 => 1); + bins fall = (1 => 0); + } + + endgroup + covergroup soc_ifc_reg__internal_iccm_lock_fld_cg with function sample( + input bit [1-1:0] lock + ); + option.per_instance = 1; + lock_cp : coverpoint lock; + + endgroup + + /*----------------------- SOC_IFC_REG__INTERNAL_FW_UPDATE_RESET COVERGROUPS -----------------------*/ + covergroup soc_ifc_reg__internal_fw_update_reset_bit_cg with function sample(input bit reg_bit); + option.per_instance = 1; + reg_bit_cp : coverpoint reg_bit { + bins value[2] = {0,1}; + } + reg_bit_edge_cp : coverpoint reg_bit { + bins rise = (0 => 1); + bins fall = (1 => 0); + } + + endgroup + covergroup soc_ifc_reg__internal_fw_update_reset_fld_cg with function sample( + input bit [1-1:0] core_rst + ); + option.per_instance = 1; + core_rst_cp : coverpoint core_rst; + + endgroup + + /*----------------------- SOC_IFC_REG__INTERNAL_FW_UPDATE_RESET_WAIT_CYCLES COVERGROUPS -----------------------*/ + covergroup soc_ifc_reg__internal_fw_update_reset_wait_cycles_bit_cg with function sample(input bit reg_bit); + option.per_instance = 1; + reg_bit_cp : coverpoint reg_bit { + bins value[2] = {0,1}; + } + reg_bit_edge_cp : coverpoint reg_bit { + bins rise = (0 => 1); + bins fall = (1 => 0); + } + + endgroup + covergroup soc_ifc_reg__internal_fw_update_reset_wait_cycles_fld_cg with function sample( + input bit [8-1:0] wait_cycles + ); + option.per_instance = 1; + wait_cycles_cp : coverpoint wait_cycles { + bins zero_val = {8'h0}; + bins one_val = {1}; + bins two_val = {2}; + bins three_val = {3}; + bins small_val = {[4:15]}; + bins rand_val[16] = {[16:8'hFE]}; + bins ones_val = {{8{1'b1}}}; + wildcard bins set = (0 => 8'h??); + wildcard bins clr = (8'h?? => 0); + } + + endgroup + + /*----------------------- SOC_IFC_REG__INTERNAL_NMI_VECTOR COVERGROUPS -----------------------*/ + covergroup soc_ifc_reg__internal_nmi_vector_bit_cg with function sample(input bit reg_bit); + option.per_instance = 1; + reg_bit_cp : coverpoint reg_bit { + bins value[2] = {0,1}; + } + reg_bit_edge_cp : coverpoint reg_bit { + bins rise = (0 => 1); + bins fall = (1 => 0); + } + + endgroup + covergroup soc_ifc_reg__internal_nmi_vector_fld_cg with function sample( + input bit [32-1:0] vec + ); + option.per_instance = 1; + vec_cp : coverpoint vec { + wildcard bins ROM [16] = {32'h0000????}; + wildcard bins ICCM0[16] = {32'h4000????}; + wildcard bins ICCM1[16] = {32'h4001????}; + } + + endgroup + + /*----------------------- SOC_IFC_REG__INTERNAL_HW_ERROR_FATAL_MASK COVERGROUPS -----------------------*/ + covergroup soc_ifc_reg__internal_hw_error_fatal_mask_bit_cg with function sample(input bit reg_bit); + option.per_instance = 1; + reg_bit_cp : coverpoint reg_bit { + bins value[2] = {0,1}; + } + reg_bit_edge_cp : coverpoint reg_bit { + bins rise = (0 => 1); + bins fall = (1 => 0); + } + + endgroup + covergroup soc_ifc_reg__internal_hw_error_fatal_mask_fld_cg with function sample( + input bit [1-1:0] mask_iccm_ecc_unc, + input bit [1-1:0] mask_dccm_ecc_unc, + input bit [1-1:0] mask_nmi_pin + ); + option.per_instance = 1; + option.auto_bin_max = 64; + mask_iccm_ecc_unc_cp : coverpoint mask_iccm_ecc_unc; + mask_dccm_ecc_unc_cp : coverpoint mask_dccm_ecc_unc; + mask_nmi_pin_cp : coverpoint mask_nmi_pin; + + endgroup + + /*----------------------- SOC_IFC_REG__INTERNAL_HW_ERROR_NON_FATAL_MASK COVERGROUPS -----------------------*/ + covergroup soc_ifc_reg__internal_hw_error_non_fatal_mask_bit_cg with function sample(input bit reg_bit); + option.per_instance = 1; + reg_bit_cp : coverpoint reg_bit { + bins value[2] = {0,1}; + } + reg_bit_edge_cp : coverpoint reg_bit { + bins rise = (0 => 1); + bins fall = (1 => 0); + } + + endgroup + covergroup soc_ifc_reg__internal_hw_error_non_fatal_mask_fld_cg with function sample( + input bit [1-1:0] mask_mbox_prot_no_lock, + input bit [1-1:0] mask_mbox_prot_ooo, + input bit [1-1:0] mask_mbox_ecc_unc + ); + option.per_instance = 1; + option.auto_bin_max = 64; + mask_mbox_prot_no_lock_cp : coverpoint mask_mbox_prot_no_lock; + mask_mbox_prot_ooo_cp : coverpoint mask_mbox_prot_ooo; + mask_mbox_ecc_unc_cp : coverpoint mask_mbox_ecc_unc; + + endgroup + + /*----------------------- SOC_IFC_REG__INTERNAL_FW_ERROR_FATAL_MASK COVERGROUPS -----------------------*/ + covergroup soc_ifc_reg__internal_fw_error_fatal_mask_bit_cg with function sample(input bit reg_bit); + option.per_instance = 1; + reg_bit_cp : coverpoint reg_bit { + bins value[2] = {0,1}; + } + reg_bit_edge_cp : coverpoint reg_bit { + bins rise = (0 => 1); + bins fall = (1 => 0); + } + + endgroup + covergroup soc_ifc_reg__internal_fw_error_fatal_mask_fld_cg with function sample( + input bit [32-1:0] mask + ); + option.per_instance = 1; + option.auto_bin_max = 64; + mask_cp : coverpoint mask; + + endgroup + + /*----------------------- SOC_IFC_REG__INTERNAL_FW_ERROR_NON_FATAL_MASK COVERGROUPS -----------------------*/ + covergroup soc_ifc_reg__internal_fw_error_non_fatal_mask_bit_cg with function sample(input bit reg_bit); + option.per_instance = 1; + reg_bit_cp : coverpoint reg_bit { + bins value[2] = {0,1}; + } + reg_bit_edge_cp : coverpoint reg_bit { + bins rise = (0 => 1); + bins fall = (1 => 0); + } + + endgroup + covergroup soc_ifc_reg__internal_fw_error_non_fatal_mask_fld_cg with function sample( + input bit [32-1:0] mask + ); + option.per_instance = 1; + option.auto_bin_max = 64; + mask_cp : coverpoint mask; + + endgroup + + /*----------------------- SOC_IFC_REG__INTERNAL_RV_MTIME_L COVERGROUPS -----------------------*/ + covergroup soc_ifc_reg__internal_rv_mtime_l_bit_cg with function sample(input bit reg_bit); + option.per_instance = 1; + reg_bit_cp : coverpoint reg_bit { + bins value[2] = {0,1}; + } + reg_bit_edge_cp : coverpoint reg_bit { + bins rise = (0 => 1); + bins fall = (1 => 0); + } + + endgroup + covergroup soc_ifc_reg__internal_rv_mtime_l_fld_cg with function sample( + input bit [32-1:0] count_l + ); + option.per_instance = 1; + option.auto_bin_max = 64; + count_l_cp : coverpoint count_l; + + endgroup + + /*----------------------- SOC_IFC_REG__INTERNAL_RV_MTIME_H COVERGROUPS -----------------------*/ + covergroup soc_ifc_reg__internal_rv_mtime_h_bit_cg with function sample(input bit reg_bit); + option.per_instance = 1; + reg_bit_cp : coverpoint reg_bit { + bins value[2] = {0,1}; + } + reg_bit_edge_cp : coverpoint reg_bit { + bins rise = (0 => 1); + bins fall = (1 => 0); + } + + endgroup + covergroup soc_ifc_reg__internal_rv_mtime_h_fld_cg with function sample( + input bit [32-1:0] count_h + ); + option.per_instance = 1; + option.auto_bin_max = 4; /* Will have to manually force mtime to this, since it won't be reached normally in random sims */ + count_h_cp : coverpoint count_h; + + endgroup + + /*----------------------- SOC_IFC_REG__INTERNAL_RV_MTIMECMP_L COVERGROUPS -----------------------*/ + covergroup soc_ifc_reg__internal_rv_mtimecmp_l_bit_cg with function sample(input bit reg_bit); + option.per_instance = 1; + reg_bit_cp : coverpoint reg_bit { + bins value[2] = {0,1}; + } + reg_bit_edge_cp : coverpoint reg_bit { + bins rise = (0 => 1); + bins fall = (1 => 0); + } + + endgroup + covergroup soc_ifc_reg__internal_rv_mtimecmp_l_fld_cg with function sample( + input bit [32-1:0] compare_l + ); + option.per_instance = 1; + option.auto_bin_max = 4; + compare_l_cp : coverpoint compare_l; + + endgroup + + /*----------------------- SOC_IFC_REG__INTERNAL_RV_MTIMECMP_H COVERGROUPS -----------------------*/ + covergroup soc_ifc_reg__internal_rv_mtimecmp_h_bit_cg with function sample(input bit reg_bit); + option.per_instance = 1; + reg_bit_cp : coverpoint reg_bit { + bins value[2] = {0,1}; + } + reg_bit_edge_cp : coverpoint reg_bit { + bins rise = (0 => 1); + bins fall = (1 => 0); + } + + endgroup + covergroup soc_ifc_reg__internal_rv_mtimecmp_h_fld_cg with function sample( + input bit [32-1:0] compare_h + ); + option.per_instance = 1; + option.auto_bin_max = 4; + compare_h_cp : coverpoint compare_h; + + endgroup + + /*----------------------- SOC_IFC_REG__INTR_BLOCK_T__GLOBAL_INTR_EN_T COVERGROUPS -----------------------*/ + covergroup soc_ifc_reg__intr_block_t__global_intr_en_t_bit_cg with function sample(input bit reg_bit); + option.per_instance = 1; + reg_bit_cp : coverpoint reg_bit { + bins value[2] = {0,1}; + } + reg_bit_edge_cp : coverpoint reg_bit { + bins rise = (0 => 1); + bins fall = (1 => 0); + } + + endgroup + covergroup soc_ifc_reg__intr_block_t__global_intr_en_t_fld_cg with function sample( + input bit [1-1:0] error_en, + input bit [1-1:0] notif_en + ); + option.per_instance = 1; + error_en_cp : coverpoint error_en; + notif_en_cp : coverpoint notif_en; + + endgroup + + /*----------------------- SOC_IFC_REG__INTR_BLOCK_T__ERROR_INTR_EN_T COVERGROUPS -----------------------*/ + covergroup soc_ifc_reg__intr_block_t__error_intr_en_t_bit_cg with function sample(input bit reg_bit); + option.per_instance = 1; + reg_bit_cp : coverpoint reg_bit { + bins value[2] = {0,1}; + } + reg_bit_edge_cp : coverpoint reg_bit { + bins rise = (0 => 1); + bins fall = (1 => 0); + } + + endgroup + covergroup soc_ifc_reg__intr_block_t__error_intr_en_t_fld_cg with function sample( + input bit [1-1:0] error_internal_en, + input bit [1-1:0] error_inv_dev_en, + input bit [1-1:0] error_cmd_fail_en, + input bit [1-1:0] error_bad_fuse_en, + input bit [1-1:0] error_iccm_blocked_en, + input bit [1-1:0] error_mbox_ecc_unc_en, + input bit [1-1:0] error_wdt_timer1_timeout_en, + input bit [1-1:0] error_wdt_timer2_timeout_en + ); + option.per_instance = 1; + error_internal_en_cp : coverpoint error_internal_en; + error_inv_dev_en_cp : coverpoint error_inv_dev_en; + error_cmd_fail_en_cp : coverpoint error_cmd_fail_en; + error_bad_fuse_en_cp : coverpoint error_bad_fuse_en; + error_iccm_blocked_en_cp : coverpoint error_iccm_blocked_en; + error_mbox_ecc_unc_en_cp : coverpoint error_mbox_ecc_unc_en; + error_wdt_timer1_timeout_en_cp : coverpoint error_wdt_timer1_timeout_en; + error_wdt_timer2_timeout_en_cp : coverpoint error_wdt_timer2_timeout_en; + + endgroup + + /*----------------------- SOC_IFC_REG__INTR_BLOCK_T__NOTIF_INTR_EN_T COVERGROUPS -----------------------*/ + covergroup soc_ifc_reg__intr_block_t__notif_intr_en_t_bit_cg with function sample(input bit reg_bit); + option.per_instance = 1; + reg_bit_cp : coverpoint reg_bit { + bins value[2] = {0,1}; + } + reg_bit_edge_cp : coverpoint reg_bit { + bins rise = (0 => 1); + bins fall = (1 => 0); + } + + endgroup + covergroup soc_ifc_reg__intr_block_t__notif_intr_en_t_fld_cg with function sample( + input bit [1-1:0] notif_cmd_avail_en, + input bit [1-1:0] notif_mbox_ecc_cor_en, + input bit [1-1:0] notif_debug_locked_en, + input bit [1-1:0] notif_scan_mode_en, + input bit [1-1:0] notif_soc_req_lock_en, + input bit [1-1:0] notif_gen_in_toggle_en + ); + option.per_instance = 1; + notif_cmd_avail_en_cp : coverpoint notif_cmd_avail_en; + notif_mbox_ecc_cor_en_cp : coverpoint notif_mbox_ecc_cor_en; + notif_debug_locked_en_cp : coverpoint notif_debug_locked_en; + notif_scan_mode_en_cp : coverpoint notif_scan_mode_en; + notif_soc_req_lock_en_cp : coverpoint notif_soc_req_lock_en; + notif_gen_in_toggle_en_cp : coverpoint notif_gen_in_toggle_en; + + endgroup + + /*----------------------- SOC_IFC_REG__INTR_BLOCK_T__GLOBAL_INTR_T_AGG_STS_DD3DCF0A COVERGROUPS -----------------------*/ + covergroup soc_ifc_reg__intr_block_t__global_intr_t_agg_sts_dd3dcf0a_bit_cg with function sample(input bit reg_bit); + option.per_instance = 1; + reg_bit_cp : coverpoint reg_bit { + bins value[2] = {0,1}; + } + reg_bit_edge_cp : coverpoint reg_bit { + bins rise = (0 => 1); + bins fall = (1 => 0); + } + + endgroup + covergroup soc_ifc_reg__intr_block_t__global_intr_t_agg_sts_dd3dcf0a_fld_cg with function sample( + input bit [1-1:0] agg_sts + ); + option.per_instance = 1; + agg_sts_cp : coverpoint agg_sts; + + endgroup + + /*----------------------- SOC_IFC_REG__INTR_BLOCK_T__GLOBAL_INTR_T_AGG_STS_E6399B4A COVERGROUPS -----------------------*/ + covergroup soc_ifc_reg__intr_block_t__global_intr_t_agg_sts_e6399b4a_bit_cg with function sample(input bit reg_bit); + option.per_instance = 1; + reg_bit_cp : coverpoint reg_bit { + bins value[2] = {0,1}; + } + reg_bit_edge_cp : coverpoint reg_bit { + bins rise = (0 => 1); + bins fall = (1 => 0); + } + + endgroup + covergroup soc_ifc_reg__intr_block_t__global_intr_t_agg_sts_e6399b4a_fld_cg with function sample( + input bit [1-1:0] agg_sts + ); + option.per_instance = 1; + agg_sts_cp : coverpoint agg_sts; + + endgroup + + /*----------------------- SOC_IFC_REG__INTR_BLOCK_T__ERROR_INTR_T_ERROR_BAD_FUSE_STS_23F67582_ERROR_CMD_FAIL_STS_B85845F8_ERROR_ICCM_BLOCKED_STS_E81E6AD2_ERROR_INTERNAL_STS_CAAD62E2_ERROR_INV_DEV_STS_6693E7DB_ERROR_MBOX_ECC_UNC_STS_30BFF330_ERROR_WDT_TIMER1_TIMEOUT_STS_6AAA9655_ERROR_WDT_TIMER2_TIMEOUT_STS_CDA8789F COVERGROUPS -----------------------*/ + covergroup soc_ifc_reg__intr_block_t__error_intr_t_error_bad_fuse_sts_23f67582_error_cmd_fail_sts_b85845f8_error_iccm_blocked_sts_e81e6ad2_error_internal_sts_caad62e2_error_inv_dev_sts_6693e7db_error_mbox_ecc_unc_sts_30bff330_error_wdt_timer1_timeout_sts_6aaa9655_error_wdt_timer2_timeout_sts_cda8789f_bit_cg with function sample(input bit reg_bit); + option.per_instance = 1; + reg_bit_cp : coverpoint reg_bit { + bins value[2] = {0,1}; + } + reg_bit_edge_cp : coverpoint reg_bit { + bins rise = (0 => 1); + bins fall = (1 => 0); + } + + endgroup + covergroup soc_ifc_reg__intr_block_t__error_intr_t_error_bad_fuse_sts_23f67582_error_cmd_fail_sts_b85845f8_error_iccm_blocked_sts_e81e6ad2_error_internal_sts_caad62e2_error_inv_dev_sts_6693e7db_error_mbox_ecc_unc_sts_30bff330_error_wdt_timer1_timeout_sts_6aaa9655_error_wdt_timer2_timeout_sts_cda8789f_fld_cg with function sample( + input bit [1-1:0] error_internal_sts, + input bit [1-1:0] error_inv_dev_sts, + input bit [1-1:0] error_cmd_fail_sts, + input bit [1-1:0] error_bad_fuse_sts, + input bit [1-1:0] error_iccm_blocked_sts, + input bit [1-1:0] error_mbox_ecc_unc_sts, + input bit [1-1:0] error_wdt_timer1_timeout_sts, + input bit [1-1:0] error_wdt_timer2_timeout_sts + ); + option.per_instance = 1; + error_internal_sts_cp : coverpoint error_internal_sts; + error_inv_dev_sts_cp : coverpoint error_inv_dev_sts; + error_cmd_fail_sts_cp : coverpoint error_cmd_fail_sts; + error_bad_fuse_sts_cp : coverpoint error_bad_fuse_sts; + error_iccm_blocked_sts_cp : coverpoint error_iccm_blocked_sts; + error_mbox_ecc_unc_sts_cp : coverpoint error_mbox_ecc_unc_sts; + error_wdt_timer1_timeout_sts_cp : coverpoint error_wdt_timer1_timeout_sts; + error_wdt_timer2_timeout_sts_cp : coverpoint error_wdt_timer2_timeout_sts; + + endgroup + + /*----------------------- SOC_IFC_REG__INTR_BLOCK_T__NOTIF_INTR_T_NOTIF_CMD_AVAIL_STS_1871606B_NOTIF_DEBUG_LOCKED_STS_5F024102_NOTIF_GEN_IN_TOGGLE_STS_59F84B64_NOTIF_MBOX_ECC_COR_STS_5C3D26BB_NOTIF_SCAN_MODE_STS_122F6367_NOTIF_SOC_REQ_LOCK_STS_DEDDDE70 COVERGROUPS -----------------------*/ + covergroup soc_ifc_reg__intr_block_t__notif_intr_t_notif_cmd_avail_sts_1871606b_notif_debug_locked_sts_5f024102_notif_gen_in_toggle_sts_59f84b64_notif_mbox_ecc_cor_sts_5c3d26bb_notif_scan_mode_sts_122f6367_notif_soc_req_lock_sts_deddde70_bit_cg with function sample(input bit reg_bit); + option.per_instance = 1; + reg_bit_cp : coverpoint reg_bit { + bins value[2] = {0,1}; + } + reg_bit_edge_cp : coverpoint reg_bit { + bins rise = (0 => 1); + bins fall = (1 => 0); + } + + endgroup + covergroup soc_ifc_reg__intr_block_t__notif_intr_t_notif_cmd_avail_sts_1871606b_notif_debug_locked_sts_5f024102_notif_gen_in_toggle_sts_59f84b64_notif_mbox_ecc_cor_sts_5c3d26bb_notif_scan_mode_sts_122f6367_notif_soc_req_lock_sts_deddde70_fld_cg with function sample( + input bit [1-1:0] notif_cmd_avail_sts, + input bit [1-1:0] notif_mbox_ecc_cor_sts, + input bit [1-1:0] notif_debug_locked_sts, + input bit [1-1:0] notif_scan_mode_sts, + input bit [1-1:0] notif_soc_req_lock_sts, + input bit [1-1:0] notif_gen_in_toggle_sts + ); + option.per_instance = 1; + notif_cmd_avail_sts_cp : coverpoint notif_cmd_avail_sts; + notif_mbox_ecc_cor_sts_cp : coverpoint notif_mbox_ecc_cor_sts; + notif_debug_locked_sts_cp : coverpoint notif_debug_locked_sts; + notif_scan_mode_sts_cp : coverpoint notif_scan_mode_sts; + notif_soc_req_lock_sts_cp : coverpoint notif_soc_req_lock_sts; + notif_gen_in_toggle_sts_cp : coverpoint notif_gen_in_toggle_sts; + + endgroup + + /*----------------------- SOC_IFC_REG__INTR_BLOCK_T__ERROR_INTR_TRIG_T COVERGROUPS -----------------------*/ + covergroup soc_ifc_reg__intr_block_t__error_intr_trig_t_bit_cg with function sample(input bit reg_bit); + option.per_instance = 1; + reg_bit_cp : coverpoint reg_bit { + bins value[2] = {0,1}; + } + reg_bit_edge_cp : coverpoint reg_bit { + bins rise = (0 => 1); + bins fall = (1 => 0); + } + + endgroup + covergroup soc_ifc_reg__intr_block_t__error_intr_trig_t_fld_cg with function sample( + input bit [1-1:0] error_internal_trig, + input bit [1-1:0] error_inv_dev_trig, + input bit [1-1:0] error_cmd_fail_trig, + input bit [1-1:0] error_bad_fuse_trig, + input bit [1-1:0] error_iccm_blocked_trig, + input bit [1-1:0] error_mbox_ecc_unc_trig, + input bit [1-1:0] error_wdt_timer1_timeout_trig, + input bit [1-1:0] error_wdt_timer2_timeout_trig + ); + option.per_instance = 1; + error_internal_trig_cp : coverpoint error_internal_trig; + error_inv_dev_trig_cp : coverpoint error_inv_dev_trig; + error_cmd_fail_trig_cp : coverpoint error_cmd_fail_trig; + error_bad_fuse_trig_cp : coverpoint error_bad_fuse_trig; + error_iccm_blocked_trig_cp : coverpoint error_iccm_blocked_trig; + error_mbox_ecc_unc_trig_cp : coverpoint error_mbox_ecc_unc_trig; + error_wdt_timer1_timeout_trig_cp : coverpoint error_wdt_timer1_timeout_trig; + error_wdt_timer2_timeout_trig_cp : coverpoint error_wdt_timer2_timeout_trig; + + endgroup + + /*----------------------- SOC_IFC_REG__INTR_BLOCK_T__NOTIF_INTR_TRIG_T COVERGROUPS -----------------------*/ + covergroup soc_ifc_reg__intr_block_t__notif_intr_trig_t_bit_cg with function sample(input bit reg_bit); + option.per_instance = 1; + reg_bit_cp : coverpoint reg_bit { + bins value[2] = {0,1}; + } + reg_bit_edge_cp : coverpoint reg_bit { + bins rise = (0 => 1); + bins fall = (1 => 0); + } + + endgroup + covergroup soc_ifc_reg__intr_block_t__notif_intr_trig_t_fld_cg with function sample( + input bit [1-1:0] notif_cmd_avail_trig, + input bit [1-1:0] notif_mbox_ecc_cor_trig, + input bit [1-1:0] notif_debug_locked_trig, + input bit [1-1:0] notif_scan_mode_trig, + input bit [1-1:0] notif_soc_req_lock_trig, + input bit [1-1:0] notif_gen_in_toggle_trig + ); + option.per_instance = 1; + notif_cmd_avail_trig_cp : coverpoint notif_cmd_avail_trig; + notif_mbox_ecc_cor_trig_cp : coverpoint notif_mbox_ecc_cor_trig; + notif_debug_locked_trig_cp : coverpoint notif_debug_locked_trig; + notif_scan_mode_trig_cp : coverpoint notif_scan_mode_trig; + notif_soc_req_lock_trig_cp : coverpoint notif_soc_req_lock_trig; + notif_gen_in_toggle_trig_cp : coverpoint notif_gen_in_toggle_trig; + + endgroup + + /*----------------------- SOC_IFC_REG__INTR_BLOCK_T__INTR_COUNT_T_CNT_608F1141 COVERGROUPS -----------------------*/ + covergroup soc_ifc_reg__intr_block_t__intr_count_t_cnt_608f1141_bit_cg with function sample(input bit reg_bit); + option.per_instance = 1; + reg_bit_cp : coverpoint reg_bit { + bins value[2] = {0,1}; + } + reg_bit_edge_cp : coverpoint reg_bit { + bins rise = (0 => 1); + bins fall = (1 => 0); + } + + endgroup + covergroup soc_ifc_reg__intr_block_t__intr_count_t_cnt_608f1141_fld_cg with function sample( + input bit [32-1:0] cnt + ); + option.per_instance = 1; + option.auto_bin_max = 64; + cnt_cp : coverpoint cnt; + + endgroup + + /*----------------------- SOC_IFC_REG__INTR_BLOCK_T__INTR_COUNT_T_CNT_916AB5DF COVERGROUPS -----------------------*/ + covergroup soc_ifc_reg__intr_block_t__intr_count_t_cnt_916ab5df_bit_cg with function sample(input bit reg_bit); + option.per_instance = 1; + reg_bit_cp : coverpoint reg_bit { + bins value[2] = {0,1}; + } + reg_bit_edge_cp : coverpoint reg_bit { + bins rise = (0 => 1); + bins fall = (1 => 0); + } + + endgroup + covergroup soc_ifc_reg__intr_block_t__intr_count_t_cnt_916ab5df_fld_cg with function sample( + input bit [32-1:0] cnt + ); + option.per_instance = 1; + option.auto_bin_max = 64; + cnt_cp : coverpoint cnt; + + endgroup + + /*----------------------- SOC_IFC_REG__INTR_BLOCK_T__INTR_COUNT_T_CNT_B2A56031 COVERGROUPS -----------------------*/ + covergroup soc_ifc_reg__intr_block_t__intr_count_t_cnt_b2a56031_bit_cg with function sample(input bit reg_bit); + option.per_instance = 1; + reg_bit_cp : coverpoint reg_bit { + bins value[2] = {0,1}; + } + reg_bit_edge_cp : coverpoint reg_bit { + bins rise = (0 => 1); + bins fall = (1 => 0); + } + + endgroup + covergroup soc_ifc_reg__intr_block_t__intr_count_t_cnt_b2a56031_fld_cg with function sample( + input bit [32-1:0] cnt + ); + option.per_instance = 1; + option.auto_bin_max = 64; + cnt_cp : coverpoint cnt; + + endgroup + + /*----------------------- SOC_IFC_REG__INTR_BLOCK_T__INTR_COUNT_T_CNT_FB7D2433 COVERGROUPS -----------------------*/ + covergroup soc_ifc_reg__intr_block_t__intr_count_t_cnt_fb7d2433_bit_cg with function sample(input bit reg_bit); + option.per_instance = 1; + reg_bit_cp : coverpoint reg_bit { + bins value[2] = {0,1}; + } + reg_bit_edge_cp : coverpoint reg_bit { + bins rise = (0 => 1); + bins fall = (1 => 0); + } + + endgroup + covergroup soc_ifc_reg__intr_block_t__intr_count_t_cnt_fb7d2433_fld_cg with function sample( + input bit [32-1:0] cnt + ); + option.per_instance = 1; + option.auto_bin_max = 64; + cnt_cp : coverpoint cnt; + + endgroup + + /*----------------------- SOC_IFC_REG__INTR_BLOCK_T__INTR_COUNT_T_CNT_25E76B6F COVERGROUPS -----------------------*/ + covergroup soc_ifc_reg__intr_block_t__intr_count_t_cnt_25e76b6f_bit_cg with function sample(input bit reg_bit); + option.per_instance = 1; + reg_bit_cp : coverpoint reg_bit { + bins value[2] = {0,1}; + } + reg_bit_edge_cp : coverpoint reg_bit { + bins rise = (0 => 1); + bins fall = (1 => 0); + } + + endgroup + covergroup soc_ifc_reg__intr_block_t__intr_count_t_cnt_25e76b6f_fld_cg with function sample( + input bit [32-1:0] cnt + ); + option.per_instance = 1; + option.auto_bin_max = 64; + cnt_cp : coverpoint cnt; + + endgroup + + /*----------------------- SOC_IFC_REG__INTR_BLOCK_T__INTR_COUNT_T_CNT_26B97E39 COVERGROUPS -----------------------*/ + covergroup soc_ifc_reg__intr_block_t__intr_count_t_cnt_26b97e39_bit_cg with function sample(input bit reg_bit); + option.per_instance = 1; + reg_bit_cp : coverpoint reg_bit { + bins value[2] = {0,1}; + } + reg_bit_edge_cp : coverpoint reg_bit { + bins rise = (0 => 1); + bins fall = (1 => 0); + } + + endgroup + covergroup soc_ifc_reg__intr_block_t__intr_count_t_cnt_26b97e39_fld_cg with function sample( + input bit [32-1:0] cnt + ); + option.per_instance = 1; + option.auto_bin_max = 64; + cnt_cp : coverpoint cnt; + + endgroup + + /*----------------------- SOC_IFC_REG__INTR_BLOCK_T__INTR_COUNT_T_CNT_A2F61F82 COVERGROUPS -----------------------*/ + covergroup soc_ifc_reg__intr_block_t__intr_count_t_cnt_a2f61f82_bit_cg with function sample(input bit reg_bit); + option.per_instance = 1; + reg_bit_cp : coverpoint reg_bit { + bins value[2] = {0,1}; + } + reg_bit_edge_cp : coverpoint reg_bit { + bins rise = (0 => 1); + bins fall = (1 => 0); + } + + endgroup + covergroup soc_ifc_reg__intr_block_t__intr_count_t_cnt_a2f61f82_fld_cg with function sample( + input bit [32-1:0] cnt + ); + option.per_instance = 1; + option.auto_bin_max = 64; + cnt_cp : coverpoint cnt; + + endgroup + + /*----------------------- SOC_IFC_REG__INTR_BLOCK_T__INTR_COUNT_T_CNT_D46457CD COVERGROUPS -----------------------*/ + covergroup soc_ifc_reg__intr_block_t__intr_count_t_cnt_d46457cd_bit_cg with function sample(input bit reg_bit); + option.per_instance = 1; + reg_bit_cp : coverpoint reg_bit { + bins value[2] = {0,1}; + } + reg_bit_edge_cp : coverpoint reg_bit { + bins rise = (0 => 1); + bins fall = (1 => 0); + } + + endgroup + covergroup soc_ifc_reg__intr_block_t__intr_count_t_cnt_d46457cd_fld_cg with function sample( + input bit [32-1:0] cnt + ); + option.per_instance = 1; + option.auto_bin_max = 64; + cnt_cp : coverpoint cnt; + + endgroup + + /*----------------------- SOC_IFC_REG__INTR_BLOCK_T__INTR_COUNT_T_CNT_A06F0954 COVERGROUPS -----------------------*/ + covergroup soc_ifc_reg__intr_block_t__intr_count_t_cnt_a06f0954_bit_cg with function sample(input bit reg_bit); + option.per_instance = 1; + reg_bit_cp : coverpoint reg_bit { + bins value[2] = {0,1}; + } + reg_bit_edge_cp : coverpoint reg_bit { + bins rise = (0 => 1); + bins fall = (1 => 0); + } + + endgroup + covergroup soc_ifc_reg__intr_block_t__intr_count_t_cnt_a06f0954_fld_cg with function sample( + input bit [32-1:0] cnt + ); + option.per_instance = 1; + option.auto_bin_max = 64; + cnt_cp : coverpoint cnt; + + endgroup + + /*----------------------- SOC_IFC_REG__INTR_BLOCK_T__INTR_COUNT_T_CNT_00E49272 COVERGROUPS -----------------------*/ + covergroup soc_ifc_reg__intr_block_t__intr_count_t_cnt_00e49272_bit_cg with function sample(input bit reg_bit); + option.per_instance = 1; + reg_bit_cp : coverpoint reg_bit { + bins value[2] = {0,1}; + } + reg_bit_edge_cp : coverpoint reg_bit { + bins rise = (0 => 1); + bins fall = (1 => 0); + } + + endgroup + covergroup soc_ifc_reg__intr_block_t__intr_count_t_cnt_00e49272_fld_cg with function sample( + input bit [32-1:0] cnt + ); + option.per_instance = 1; + option.auto_bin_max = 64; + cnt_cp : coverpoint cnt; + + endgroup + + /*----------------------- SOC_IFC_REG__INTR_BLOCK_T__INTR_COUNT_T_CNT_EE53DED8 COVERGROUPS -----------------------*/ + covergroup soc_ifc_reg__intr_block_t__intr_count_t_cnt_ee53ded8_bit_cg with function sample(input bit reg_bit); + option.per_instance = 1; + reg_bit_cp : coverpoint reg_bit { + bins value[2] = {0,1}; + } + reg_bit_edge_cp : coverpoint reg_bit { + bins rise = (0 => 1); + bins fall = (1 => 0); + } + + endgroup + covergroup soc_ifc_reg__intr_block_t__intr_count_t_cnt_ee53ded8_fld_cg with function sample( + input bit [32-1:0] cnt + ); + option.per_instance = 1; + option.auto_bin_max = 64; + cnt_cp : coverpoint cnt; + + endgroup + + /*----------------------- SOC_IFC_REG__INTR_BLOCK_T__INTR_COUNT_T_CNT_FBF3C714 COVERGROUPS -----------------------*/ + covergroup soc_ifc_reg__intr_block_t__intr_count_t_cnt_fbf3c714_bit_cg with function sample(input bit reg_bit); + option.per_instance = 1; + reg_bit_cp : coverpoint reg_bit { + bins value[2] = {0,1}; + } + reg_bit_edge_cp : coverpoint reg_bit { + bins rise = (0 => 1); + bins fall = (1 => 0); + } + + endgroup + covergroup soc_ifc_reg__intr_block_t__intr_count_t_cnt_fbf3c714_fld_cg with function sample( + input bit [32-1:0] cnt + ); + option.per_instance = 1; + option.auto_bin_max = 64; + cnt_cp : coverpoint cnt; + + endgroup + + /*----------------------- SOC_IFC_REG__INTR_BLOCK_T__INTR_COUNT_T_CNT_B9BDDABE COVERGROUPS -----------------------*/ + covergroup soc_ifc_reg__intr_block_t__intr_count_t_cnt_b9bddabe_bit_cg with function sample(input bit reg_bit); + option.per_instance = 1; + reg_bit_cp : coverpoint reg_bit { + bins value[2] = {0,1}; + } + reg_bit_edge_cp : coverpoint reg_bit { + bins rise = (0 => 1); + bins fall = (1 => 0); + } + + endgroup + covergroup soc_ifc_reg__intr_block_t__intr_count_t_cnt_b9bddabe_fld_cg with function sample( + input bit [32-1:0] cnt + ); + option.per_instance = 1; + option.auto_bin_max = 64; + cnt_cp : coverpoint cnt; + + endgroup + + /*----------------------- SOC_IFC_REG__INTR_BLOCK_T__INTR_COUNT_T_CNT_57528CC1 COVERGROUPS -----------------------*/ + covergroup soc_ifc_reg__intr_block_t__intr_count_t_cnt_57528cc1_bit_cg with function sample(input bit reg_bit); + option.per_instance = 1; + reg_bit_cp : coverpoint reg_bit { + bins value[2] = {0,1}; + } + reg_bit_edge_cp : coverpoint reg_bit { + bins rise = (0 => 1); + bins fall = (1 => 0); + } + + endgroup + covergroup soc_ifc_reg__intr_block_t__intr_count_t_cnt_57528cc1_fld_cg with function sample( + input bit [32-1:0] cnt + ); + option.per_instance = 1; + option.auto_bin_max = 64; + cnt_cp : coverpoint cnt; + + endgroup + + /*----------------------- SOC_IFC_REG__INTR_BLOCK_T__INTR_COUNT_INCR_T_PULSE_15E6ED7E COVERGROUPS -----------------------*/ + covergroup soc_ifc_reg__intr_block_t__intr_count_incr_t_pulse_15e6ed7e_bit_cg with function sample(input bit reg_bit); + option.per_instance = 1; + reg_bit_cp : coverpoint reg_bit { + bins value[2] = {0,1}; + } + reg_bit_edge_cp : coverpoint reg_bit { + bins rise = (0 => 1); + bins fall = (1 => 0); + } + + endgroup + covergroup soc_ifc_reg__intr_block_t__intr_count_incr_t_pulse_15e6ed7e_fld_cg with function sample( + input bit [1-1:0] pulse + ); + option.per_instance = 1; + pulse_cp : coverpoint pulse; + + endgroup + + /*----------------------- SOC_IFC_REG__INTR_BLOCK_T__INTR_COUNT_INCR_T_PULSE_F762EA9C COVERGROUPS -----------------------*/ + covergroup soc_ifc_reg__intr_block_t__intr_count_incr_t_pulse_f762ea9c_bit_cg with function sample(input bit reg_bit); + option.per_instance = 1; + reg_bit_cp : coverpoint reg_bit { + bins value[2] = {0,1}; + } + reg_bit_edge_cp : coverpoint reg_bit { + bins rise = (0 => 1); + bins fall = (1 => 0); + } + + endgroup + covergroup soc_ifc_reg__intr_block_t__intr_count_incr_t_pulse_f762ea9c_fld_cg with function sample( + input bit [1-1:0] pulse + ); + option.per_instance = 1; + pulse_cp : coverpoint pulse; + + endgroup + + /*----------------------- SOC_IFC_REG__INTR_BLOCK_T__INTR_COUNT_INCR_T_PULSE_AA8718C6 COVERGROUPS -----------------------*/ + covergroup soc_ifc_reg__intr_block_t__intr_count_incr_t_pulse_aa8718c6_bit_cg with function sample(input bit reg_bit); + option.per_instance = 1; + reg_bit_cp : coverpoint reg_bit { + bins value[2] = {0,1}; + } + reg_bit_edge_cp : coverpoint reg_bit { + bins rise = (0 => 1); + bins fall = (1 => 0); + } + + endgroup + covergroup soc_ifc_reg__intr_block_t__intr_count_incr_t_pulse_aa8718c6_fld_cg with function sample( + input bit [1-1:0] pulse + ); + option.per_instance = 1; + pulse_cp : coverpoint pulse; + + endgroup + + /*----------------------- SOC_IFC_REG__INTR_BLOCK_T__INTR_COUNT_INCR_T_PULSE_26FA5955 COVERGROUPS -----------------------*/ + covergroup soc_ifc_reg__intr_block_t__intr_count_incr_t_pulse_26fa5955_bit_cg with function sample(input bit reg_bit); + option.per_instance = 1; + reg_bit_cp : coverpoint reg_bit { + bins value[2] = {0,1}; + } + reg_bit_edge_cp : coverpoint reg_bit { + bins rise = (0 => 1); + bins fall = (1 => 0); + } + + endgroup + covergroup soc_ifc_reg__intr_block_t__intr_count_incr_t_pulse_26fa5955_fld_cg with function sample( + input bit [1-1:0] pulse + ); + option.per_instance = 1; + pulse_cp : coverpoint pulse; + + endgroup + + /*----------------------- SOC_IFC_REG__INTR_BLOCK_T__INTR_COUNT_INCR_T_PULSE_3E43D258 COVERGROUPS -----------------------*/ + covergroup soc_ifc_reg__intr_block_t__intr_count_incr_t_pulse_3e43d258_bit_cg with function sample(input bit reg_bit); + option.per_instance = 1; + reg_bit_cp : coverpoint reg_bit { + bins value[2] = {0,1}; + } + reg_bit_edge_cp : coverpoint reg_bit { + bins rise = (0 => 1); + bins fall = (1 => 0); + } + + endgroup + covergroup soc_ifc_reg__intr_block_t__intr_count_incr_t_pulse_3e43d258_fld_cg with function sample( + input bit [1-1:0] pulse + ); + option.per_instance = 1; + pulse_cp : coverpoint pulse; + + endgroup + + /*----------------------- SOC_IFC_REG__INTR_BLOCK_T__INTR_COUNT_INCR_T_PULSE_9F1632FD COVERGROUPS -----------------------*/ + covergroup soc_ifc_reg__intr_block_t__intr_count_incr_t_pulse_9f1632fd_bit_cg with function sample(input bit reg_bit); + option.per_instance = 1; + reg_bit_cp : coverpoint reg_bit { + bins value[2] = {0,1}; + } + reg_bit_edge_cp : coverpoint reg_bit { + bins rise = (0 => 1); + bins fall = (1 => 0); + } + + endgroup + covergroup soc_ifc_reg__intr_block_t__intr_count_incr_t_pulse_9f1632fd_fld_cg with function sample( + input bit [1-1:0] pulse + ); + option.per_instance = 1; + pulse_cp : coverpoint pulse; + + endgroup + + /*----------------------- SOC_IFC_REG__INTR_BLOCK_T__INTR_COUNT_INCR_T_PULSE_AA999FDC COVERGROUPS -----------------------*/ + covergroup soc_ifc_reg__intr_block_t__intr_count_incr_t_pulse_aa999fdc_bit_cg with function sample(input bit reg_bit); + option.per_instance = 1; + reg_bit_cp : coverpoint reg_bit { + bins value[2] = {0,1}; + } + reg_bit_edge_cp : coverpoint reg_bit { + bins rise = (0 => 1); + bins fall = (1 => 0); + } + + endgroup + covergroup soc_ifc_reg__intr_block_t__intr_count_incr_t_pulse_aa999fdc_fld_cg with function sample( + input bit [1-1:0] pulse + ); + option.per_instance = 1; + pulse_cp : coverpoint pulse; + + endgroup + + /*----------------------- SOC_IFC_REG__INTR_BLOCK_T__INTR_COUNT_INCR_T_PULSE_404E12DB COVERGROUPS -----------------------*/ + covergroup soc_ifc_reg__intr_block_t__intr_count_incr_t_pulse_404e12db_bit_cg with function sample(input bit reg_bit); + option.per_instance = 1; + reg_bit_cp : coverpoint reg_bit { + bins value[2] = {0,1}; + } + reg_bit_edge_cp : coverpoint reg_bit { + bins rise = (0 => 1); + bins fall = (1 => 0); + } + + endgroup + covergroup soc_ifc_reg__intr_block_t__intr_count_incr_t_pulse_404e12db_fld_cg with function sample( + input bit [1-1:0] pulse + ); + option.per_instance = 1; + pulse_cp : coverpoint pulse; + + endgroup + + /*----------------------- SOC_IFC_REG__INTR_BLOCK_T__INTR_COUNT_INCR_T_PULSE_90D52137 COVERGROUPS -----------------------*/ + covergroup soc_ifc_reg__intr_block_t__intr_count_incr_t_pulse_90d52137_bit_cg with function sample(input bit reg_bit); + option.per_instance = 1; + reg_bit_cp : coverpoint reg_bit { + bins value[2] = {0,1}; + } + reg_bit_edge_cp : coverpoint reg_bit { + bins rise = (0 => 1); + bins fall = (1 => 0); + } + + endgroup + covergroup soc_ifc_reg__intr_block_t__intr_count_incr_t_pulse_90d52137_fld_cg with function sample( + input bit [1-1:0] pulse + ); + option.per_instance = 1; + pulse_cp : coverpoint pulse; + + endgroup + + /*----------------------- SOC_IFC_REG__INTR_BLOCK_T__INTR_COUNT_INCR_T_PULSE_A6DB6FFF COVERGROUPS -----------------------*/ + covergroup soc_ifc_reg__intr_block_t__intr_count_incr_t_pulse_a6db6fff_bit_cg with function sample(input bit reg_bit); + option.per_instance = 1; + reg_bit_cp : coverpoint reg_bit { + bins value[2] = {0,1}; + } + reg_bit_edge_cp : coverpoint reg_bit { + bins rise = (0 => 1); + bins fall = (1 => 0); + } + + endgroup + covergroup soc_ifc_reg__intr_block_t__intr_count_incr_t_pulse_a6db6fff_fld_cg with function sample( + input bit [1-1:0] pulse + ); + option.per_instance = 1; + pulse_cp : coverpoint pulse; + + endgroup + + /*----------------------- SOC_IFC_REG__INTR_BLOCK_T__INTR_COUNT_INCR_T_PULSE_51891FB1 COVERGROUPS -----------------------*/ + covergroup soc_ifc_reg__intr_block_t__intr_count_incr_t_pulse_51891fb1_bit_cg with function sample(input bit reg_bit); + option.per_instance = 1; + reg_bit_cp : coverpoint reg_bit { + bins value[2] = {0,1}; + } + reg_bit_edge_cp : coverpoint reg_bit { + bins rise = (0 => 1); + bins fall = (1 => 0); + } + + endgroup + covergroup soc_ifc_reg__intr_block_t__intr_count_incr_t_pulse_51891fb1_fld_cg with function sample( + input bit [1-1:0] pulse + ); + option.per_instance = 1; + pulse_cp : coverpoint pulse; + + endgroup + + /*----------------------- SOC_IFC_REG__INTR_BLOCK_T__INTR_COUNT_INCR_T_PULSE_F5D8AFE0 COVERGROUPS -----------------------*/ + covergroup soc_ifc_reg__intr_block_t__intr_count_incr_t_pulse_f5d8afe0_bit_cg with function sample(input bit reg_bit); + option.per_instance = 1; + reg_bit_cp : coverpoint reg_bit { + bins value[2] = {0,1}; + } + reg_bit_edge_cp : coverpoint reg_bit { + bins rise = (0 => 1); + bins fall = (1 => 0); + } + + endgroup + covergroup soc_ifc_reg__intr_block_t__intr_count_incr_t_pulse_f5d8afe0_fld_cg with function sample( + input bit [1-1:0] pulse + ); + option.per_instance = 1; + pulse_cp : coverpoint pulse; + + endgroup + + /*----------------------- SOC_IFC_REG__INTR_BLOCK_T__INTR_COUNT_INCR_T_PULSE_246489BD COVERGROUPS -----------------------*/ + covergroup soc_ifc_reg__intr_block_t__intr_count_incr_t_pulse_246489bd_bit_cg with function sample(input bit reg_bit); + option.per_instance = 1; + reg_bit_cp : coverpoint reg_bit { + bins value[2] = {0,1}; + } + reg_bit_edge_cp : coverpoint reg_bit { + bins rise = (0 => 1); + bins fall = (1 => 0); + } + + endgroup + covergroup soc_ifc_reg__intr_block_t__intr_count_incr_t_pulse_246489bd_fld_cg with function sample( + input bit [1-1:0] pulse + ); + option.per_instance = 1; + pulse_cp : coverpoint pulse; + + endgroup + + /*----------------------- SOC_IFC_REG__INTR_BLOCK_T__INTR_COUNT_INCR_T_PULSE_D6ED4D1E COVERGROUPS -----------------------*/ + covergroup soc_ifc_reg__intr_block_t__intr_count_incr_t_pulse_d6ed4d1e_bit_cg with function sample(input bit reg_bit); + option.per_instance = 1; + reg_bit_cp : coverpoint reg_bit { + bins value[2] = {0,1}; + } + reg_bit_edge_cp : coverpoint reg_bit { + bins rise = (0 => 1); + bins fall = (1 => 0); + } + + endgroup + covergroup soc_ifc_reg__intr_block_t__intr_count_incr_t_pulse_d6ed4d1e_fld_cg with function sample( + input bit [1-1:0] pulse + ); + option.per_instance = 1; + pulse_cp : coverpoint pulse; + + endgroup + +`endif diff --git a/src/soc_ifc/rtl/soc_ifc_reg_pkg.sv b/src/soc_ifc/rtl/soc_ifc_reg_pkg.sv index bda73281f..960293743 100644 --- a/src/soc_ifc/rtl/soc_ifc_reg_pkg.sv +++ b/src/soc_ifc/rtl/soc_ifc_reg_pkg.sv @@ -3,16 +3,20 @@ package soc_ifc_reg_pkg; typedef struct packed{ - logic [31:0] next; + logic next; logic we; - } soc_ifc_reg__rw_rw_sticky_hw_w32__in_t; + } soc_ifc_reg__rw_rw_sticky_hw__in_t; typedef struct packed{ - soc_ifc_reg__rw_rw_sticky_hw_w32__in_t error_code; + soc_ifc_reg__rw_rw_sticky_hw__in_t iccm_ecc_unc; + soc_ifc_reg__rw_rw_sticky_hw__in_t dccm_ecc_unc; + soc_ifc_reg__rw_rw_sticky_hw__in_t nmi_pin; } soc_ifc_reg__CPTRA_HW_ERROR_FATAL__in_t; typedef struct packed{ - soc_ifc_reg__rw_rw_sticky_hw_w32__in_t error_code; + soc_ifc_reg__rw_rw_sticky_hw__in_t mbox_prot_no_lock; + soc_ifc_reg__rw_rw_sticky_hw__in_t mbox_prot_ooo; + soc_ifc_reg__rw_rw_sticky_hw__in_t mbox_ecc_unc; } soc_ifc_reg__CPTRA_HW_ERROR_NON_FATAL__in_t; typedef struct packed{ @@ -28,11 +32,16 @@ package soc_ifc_reg_pkg; soc_ifc_reg__rw_rw_sticky_w32__in_t error_code; } soc_ifc_reg__CPTRA_FW_ERROR_NON_FATAL__in_t; + typedef struct packed{ + logic [2:0] next; + } soc_ifc_reg__CPTRA_FLOW_STATUS__boot_fsm_ps__in_t; + typedef struct packed{ logic next; } soc_ifc_reg__CPTRA_FLOW_STATUS__ready_for_fuses__in_t; typedef struct packed{ + soc_ifc_reg__CPTRA_FLOW_STATUS__boot_fsm_ps__in_t boot_fsm_ps; soc_ifc_reg__CPTRA_FLOW_STATUS__ready_for_fuses__in_t ready_for_fuses; } soc_ifc_reg__CPTRA_FLOW_STATUS__in_t; @@ -102,6 +111,7 @@ package soc_ifc_reg_pkg; typedef struct packed{ logic swwe; + logic hwclr; } soc_ifc_reg__CPTRA_TRNG_DATA__DATA__in_t; typedef struct packed{ @@ -151,6 +161,14 @@ package soc_ifc_reg_pkg; soc_ifc_reg__CPTRA_GENERIC_INPUT_WIRES__generic_wires__in_t generic_wires; } soc_ifc_reg__CPTRA_GENERIC_INPUT_WIRES__in_t; + typedef struct packed{ + logic [15:0] next; + } soc_ifc_reg__CPTRA_HW_REV_ID__SOC_STEPPING_ID__in_t; + + typedef struct packed{ + soc_ifc_reg__CPTRA_HW_REV_ID__SOC_STEPPING_ID__in_t SOC_STEPPING_ID; + } soc_ifc_reg__CPTRA_HW_REV_ID__in_t; + typedef struct packed{ logic next; } soc_ifc_reg__CPTRA_HW_CONFIG__iTRNG_en__in_t; @@ -187,6 +205,22 @@ package soc_ifc_reg_pkg; soc_ifc_reg__CPTRA_WDT_STATUS__t2_timeout__in_t t2_timeout; } soc_ifc_reg__CPTRA_WDT_STATUS__in_t; + typedef struct packed{ + logic swwel; + } soc_ifc_reg__CPTRA_FUSE_VALID_PAUSER__PAUSER__in_t; + + typedef struct packed{ + soc_ifc_reg__CPTRA_FUSE_VALID_PAUSER__PAUSER__in_t PAUSER; + } soc_ifc_reg__CPTRA_FUSE_VALID_PAUSER__in_t; + + typedef struct packed{ + logic swwel; + } soc_ifc_reg__CPTRA_FUSE_PAUSER_LOCK__LOCK__in_t; + + typedef struct packed{ + soc_ifc_reg__CPTRA_FUSE_PAUSER_LOCK__LOCK__in_t LOCK; + } soc_ifc_reg__CPTRA_FUSE_PAUSER_LOCK__in_t; + typedef struct packed{ logic swwel; logic hwclr; @@ -252,6 +286,22 @@ package soc_ifc_reg_pkg; soc_ifc_reg__Fuse_w2__in_t life_cycle; } soc_ifc_reg__fuse_life_cycle__in_t; + typedef struct packed{ + soc_ifc_reg__Fuse__in_t lms_verify; + } soc_ifc_reg__fuse_lms_verify__in_t; + + typedef struct packed{ + soc_ifc_reg__Fuse_w32__in_t lms_revocation; + } soc_ifc_reg__fuse_lms_revocation__in_t; + + typedef struct packed{ + logic swwel; + } soc_ifc_reg__Fuse_w16__in_t; + + typedef struct packed{ + soc_ifc_reg__Fuse_w16__in_t soc_stepping_id; + } soc_ifc_reg__fuse_soc_stepping_id__in_t; + typedef struct packed{ logic [31:0] next; logic wel; @@ -271,6 +321,22 @@ package soc_ifc_reg_pkg; soc_ifc_reg__internal_iccm_lock__lock__in_t lock; } soc_ifc_reg__internal_iccm_lock__in_t; + typedef struct packed{ + logic incr; + } soc_ifc_reg__internal_rv_mtime_l__count_l__in_t; + + typedef struct packed{ + soc_ifc_reg__internal_rv_mtime_l__count_l__in_t count_l; + } soc_ifc_reg__internal_rv_mtime_l__in_t; + + typedef struct packed{ + logic incr; + } soc_ifc_reg__internal_rv_mtime_h__count_h__in_t; + + typedef struct packed{ + soc_ifc_reg__internal_rv_mtime_h__count_h__in_t count_h; + } soc_ifc_reg__internal_rv_mtime_h__in_t; + typedef struct packed{ logic hwset; } soc_ifc_reg__intr_block_t__error_intr_t__error_internal_sts_enable_d33001bb_next_52b75ffa_resetsignal_f7aac87a__in_t; @@ -326,20 +392,30 @@ package soc_ifc_reg_pkg; logic hwset; } soc_ifc_reg__intr_block_t__notif_intr_t__notif_debug_locked_sts_enable_097fcd5b_next_36fa44d8__in_t; + typedef struct packed{ + logic hwset; + } soc_ifc_reg__intr_block_t__notif_intr_t__notif_scan_mode_sts_enable_ed1d9036_next_eb34855d__in_t; + typedef struct packed{ logic hwset; } soc_ifc_reg__intr_block_t__notif_intr_t__notif_soc_req_lock_sts_enable_52b75726_next_228b63de__in_t; + typedef struct packed{ + logic hwset; + } soc_ifc_reg__intr_block_t__notif_intr_t__notif_gen_in_toggle_sts_enable_9918ab15_next_e02c99b9__in_t; + typedef struct packed{ soc_ifc_reg__intr_block_t__notif_intr_t__notif_cmd_avail_sts_enable_f40f37a0_next_6afe0a88__in_t notif_cmd_avail_sts; soc_ifc_reg__intr_block_t__notif_intr_t__notif_mbox_ecc_cor_sts_enable_c4f9db68_next_96c01bef__in_t notif_mbox_ecc_cor_sts; soc_ifc_reg__intr_block_t__notif_intr_t__notif_debug_locked_sts_enable_097fcd5b_next_36fa44d8__in_t notif_debug_locked_sts; + soc_ifc_reg__intr_block_t__notif_intr_t__notif_scan_mode_sts_enable_ed1d9036_next_eb34855d__in_t notif_scan_mode_sts; soc_ifc_reg__intr_block_t__notif_intr_t__notif_soc_req_lock_sts_enable_52b75726_next_228b63de__in_t notif_soc_req_lock_sts; - } soc_ifc_reg__intr_block_t__notif_intr_t_notif_cmd_avail_sts_1871606b_notif_debug_locked_sts_5f024102_notif_mbox_ecc_cor_sts_5c3d26bb_notif_soc_req_lock_sts_deddde70__in_t; + soc_ifc_reg__intr_block_t__notif_intr_t__notif_gen_in_toggle_sts_enable_9918ab15_next_e02c99b9__in_t notif_gen_in_toggle_sts; + } soc_ifc_reg__intr_block_t__notif_intr_t_notif_cmd_avail_sts_1871606b_notif_debug_locked_sts_5f024102_notif_gen_in_toggle_sts_59f84b64_notif_mbox_ecc_cor_sts_5c3d26bb_notif_scan_mode_sts_122f6367_notif_soc_req_lock_sts_deddde70__in_t; typedef struct packed{ soc_ifc_reg__intr_block_t__error_intr_t_error_bad_fuse_sts_23f67582_error_cmd_fail_sts_b85845f8_error_iccm_blocked_sts_e81e6ad2_error_internal_sts_caad62e2_error_inv_dev_sts_6693e7db_error_mbox_ecc_unc_sts_30bff330_error_wdt_timer1_timeout_sts_6aaa9655_error_wdt_timer2_timeout_sts_cda8789f__in_t error_internal_intr_r; - soc_ifc_reg__intr_block_t__notif_intr_t_notif_cmd_avail_sts_1871606b_notif_debug_locked_sts_5f024102_notif_mbox_ecc_cor_sts_5c3d26bb_notif_soc_req_lock_sts_deddde70__in_t notif_internal_intr_r; + soc_ifc_reg__intr_block_t__notif_intr_t_notif_cmd_avail_sts_1871606b_notif_debug_locked_sts_5f024102_notif_gen_in_toggle_sts_59f84b64_notif_mbox_ecc_cor_sts_5c3d26bb_notif_scan_mode_sts_122f6367_notif_soc_req_lock_sts_deddde70__in_t notif_internal_intr_r; } soc_ifc_reg__intr_block_t__in_t; typedef struct packed{ @@ -363,8 +439,11 @@ package soc_ifc_reg_pkg; soc_ifc_reg__CPTRA_BOOTFSM_GO__in_t CPTRA_BOOTFSM_GO; soc_ifc_reg__CPTRA_DBG_MANUF_SERVICE_REG__in_t CPTRA_DBG_MANUF_SERVICE_REG; soc_ifc_reg__CPTRA_GENERIC_INPUT_WIRES__in_t [2-1:0]CPTRA_GENERIC_INPUT_WIRES; + soc_ifc_reg__CPTRA_HW_REV_ID__in_t CPTRA_HW_REV_ID; soc_ifc_reg__CPTRA_HW_CONFIG__in_t CPTRA_HW_CONFIG; soc_ifc_reg__CPTRA_WDT_STATUS__in_t CPTRA_WDT_STATUS; + soc_ifc_reg__CPTRA_FUSE_VALID_PAUSER__in_t CPTRA_FUSE_VALID_PAUSER; + soc_ifc_reg__CPTRA_FUSE_PAUSER_LOCK__in_t CPTRA_FUSE_PAUSER_LOCK; soc_ifc_reg__fuse_uds_seed__in_t [12-1:0]fuse_uds_seed; soc_ifc_reg__fuse_field_entropy__in_t [8-1:0]fuse_field_entropy; soc_ifc_reg__fuse_key_manifest_pk_hash__in_t [12-1:0]fuse_key_manifest_pk_hash; @@ -376,25 +455,35 @@ package soc_ifc_reg_pkg; soc_ifc_reg__fuse_idevid_cert_attr__in_t [24-1:0]fuse_idevid_cert_attr; soc_ifc_reg__fuse_idevid_manuf_hsm_id__in_t [4-1:0]fuse_idevid_manuf_hsm_id; soc_ifc_reg__fuse_life_cycle__in_t fuse_life_cycle; + soc_ifc_reg__fuse_lms_verify__in_t fuse_lms_verify; + soc_ifc_reg__fuse_lms_revocation__in_t fuse_lms_revocation; + soc_ifc_reg__fuse_soc_stepping_id__in_t fuse_soc_stepping_id; soc_ifc_reg__internal_obf_key__in_t [8-1:0]internal_obf_key; soc_ifc_reg__internal_iccm_lock__in_t internal_iccm_lock; + soc_ifc_reg__internal_rv_mtime_l__in_t internal_rv_mtime_l; + soc_ifc_reg__internal_rv_mtime_h__in_t internal_rv_mtime_h; soc_ifc_reg__intr_block_t__in_t intr_block_rf; } soc_ifc_reg__in_t; typedef struct packed{ - logic [31:0] value; - } soc_ifc_reg__rw_rw_sticky_hw_w32__out_t; + logic value; + } soc_ifc_reg__rw_rw_sticky_hw__out_t; typedef struct packed{ - soc_ifc_reg__rw_rw_sticky_hw_w32__out_t error_code; + soc_ifc_reg__rw_rw_sticky_hw__out_t iccm_ecc_unc; + soc_ifc_reg__rw_rw_sticky_hw__out_t dccm_ecc_unc; + soc_ifc_reg__rw_rw_sticky_hw__out_t nmi_pin; } soc_ifc_reg__CPTRA_HW_ERROR_FATAL__out_t; typedef struct packed{ - soc_ifc_reg__rw_rw_sticky_hw_w32__out_t error_code; + soc_ifc_reg__rw_rw_sticky_hw__out_t mbox_prot_no_lock; + soc_ifc_reg__rw_rw_sticky_hw__out_t mbox_prot_ooo; + soc_ifc_reg__rw_rw_sticky_hw__out_t mbox_ecc_unc; } soc_ifc_reg__CPTRA_HW_ERROR_NON_FATAL__out_t; typedef struct packed{ logic [31:0] value; + logic swmod; } soc_ifc_reg__rw_rw_sticky_w32__out_t; typedef struct packed{ @@ -439,24 +528,24 @@ package soc_ifc_reg_pkg; typedef struct packed{ logic value; - } soc_ifc_reg__CPTRA_FLOW_STATUS__ready_for_fw__out_t; + } soc_ifc_reg__CPTRA_FLOW_STATUS__idevid_csr_ready__out_t; typedef struct packed{ logic value; - } soc_ifc_reg__CPTRA_FLOW_STATUS__ready_for_runtime__out_t; + } soc_ifc_reg__CPTRA_FLOW_STATUS__ready_for_fw__out_t; typedef struct packed{ logic value; - } soc_ifc_reg__CPTRA_FLOW_STATUS__ready_for_fuses__out_t; + } soc_ifc_reg__CPTRA_FLOW_STATUS__ready_for_runtime__out_t; typedef struct packed{ logic value; } soc_ifc_reg__CPTRA_FLOW_STATUS__mailbox_flow_done__out_t; typedef struct packed{ + soc_ifc_reg__CPTRA_FLOW_STATUS__idevid_csr_ready__out_t idevid_csr_ready; soc_ifc_reg__CPTRA_FLOW_STATUS__ready_for_fw__out_t ready_for_fw; soc_ifc_reg__CPTRA_FLOW_STATUS__ready_for_runtime__out_t ready_for_runtime; - soc_ifc_reg__CPTRA_FLOW_STATUS__ready_for_fuses__out_t ready_for_fuses; soc_ifc_reg__CPTRA_FLOW_STATUS__mailbox_flow_done__out_t mailbox_flow_done; } soc_ifc_reg__CPTRA_FLOW_STATUS__out_t; @@ -513,6 +602,14 @@ package soc_ifc_reg_pkg; soc_ifc_reg__CPTRA_TRNG_DATA__DATA__out_t DATA; } soc_ifc_reg__CPTRA_TRNG_DATA__out_t; + typedef struct packed{ + logic value; + } soc_ifc_reg__CPTRA_TRNG_CTRL__clear__out_t; + + typedef struct packed{ + soc_ifc_reg__CPTRA_TRNG_CTRL__clear__out_t clear; + } soc_ifc_reg__CPTRA_TRNG_CTRL__out_t; + typedef struct packed{ logic value; } soc_ifc_reg__CPTRA_TRNG_STATUS__DATA_REQ__out_t; @@ -570,14 +667,6 @@ package soc_ifc_reg_pkg; soc_ifc_reg__CPTRA_GENERIC_OUTPUT_WIRES__generic_wires__out_t generic_wires; } soc_ifc_reg__CPTRA_GENERIC_OUTPUT_WIRES__out_t; - typedef struct packed{ - logic [31:0] value; - } soc_ifc_reg__CPTRA_HW_REV_ID__REV_ID__out_t; - - typedef struct packed{ - soc_ifc_reg__CPTRA_HW_REV_ID__REV_ID__out_t REV_ID; - } soc_ifc_reg__CPTRA_HW_REV_ID__out_t; - typedef struct packed{ logic [31:0] value; } soc_ifc_reg__CPTRA_FW_REV_ID__REV_ID__out_t; @@ -647,6 +736,22 @@ package soc_ifc_reg_pkg; soc_ifc_reg__CPTRA_WDT_STATUS__t2_timeout__out_t t2_timeout; } soc_ifc_reg__CPTRA_WDT_STATUS__out_t; + typedef struct packed{ + logic [31:0] value; + } soc_ifc_reg__CPTRA_FUSE_VALID_PAUSER__PAUSER__out_t; + + typedef struct packed{ + soc_ifc_reg__CPTRA_FUSE_VALID_PAUSER__PAUSER__out_t PAUSER; + } soc_ifc_reg__CPTRA_FUSE_VALID_PAUSER__out_t; + + typedef struct packed{ + logic value; + } soc_ifc_reg__CPTRA_FUSE_PAUSER_LOCK__LOCK__out_t; + + typedef struct packed{ + soc_ifc_reg__CPTRA_FUSE_PAUSER_LOCK__LOCK__out_t LOCK; + } soc_ifc_reg__CPTRA_FUSE_PAUSER_LOCK__out_t; + typedef struct packed{ logic [31:0] value; } soc_ifc_reg__secret_w32__out_t; @@ -711,6 +816,22 @@ package soc_ifc_reg_pkg; soc_ifc_reg__Fuse_w2__out_t life_cycle; } soc_ifc_reg__fuse_life_cycle__out_t; + typedef struct packed{ + soc_ifc_reg__Fuse__out_t lms_verify; + } soc_ifc_reg__fuse_lms_verify__out_t; + + typedef struct packed{ + soc_ifc_reg__Fuse_w32__out_t lms_revocation; + } soc_ifc_reg__fuse_lms_revocation__out_t; + + typedef struct packed{ + logic [15:0] value; + } soc_ifc_reg__Fuse_w16__out_t; + + typedef struct packed{ + soc_ifc_reg__Fuse_w16__out_t soc_stepping_id; + } soc_ifc_reg__fuse_soc_stepping_id__out_t; + typedef struct packed{ logic [31:0] value; } soc_ifc_reg__key_w32__out_t; @@ -751,6 +872,69 @@ package soc_ifc_reg_pkg; soc_ifc_reg__internal_nmi_vector__vec__out_t vec; } soc_ifc_reg__internal_nmi_vector__out_t; + typedef struct packed{ + logic value; + } soc_ifc_reg__rw_ro_hw__out_t; + + typedef struct packed{ + soc_ifc_reg__rw_ro_hw__out_t mask_iccm_ecc_unc; + soc_ifc_reg__rw_ro_hw__out_t mask_dccm_ecc_unc; + soc_ifc_reg__rw_ro_hw__out_t mask_nmi_pin; + } soc_ifc_reg__internal_hw_error_fatal_mask__out_t; + + typedef struct packed{ + soc_ifc_reg__rw_ro_hw__out_t mask_mbox_prot_no_lock; + soc_ifc_reg__rw_ro_hw__out_t mask_mbox_prot_ooo; + soc_ifc_reg__rw_ro_hw__out_t mask_mbox_ecc_unc; + } soc_ifc_reg__internal_hw_error_non_fatal_mask__out_t; + + typedef struct packed{ + logic [31:0] value; + } soc_ifc_reg__rw_ro_hw_w32__out_t; + + typedef struct packed{ + soc_ifc_reg__rw_ro_hw_w32__out_t mask; + } soc_ifc_reg__internal_fw_error_fatal_mask__out_t; + + typedef struct packed{ + soc_ifc_reg__rw_ro_hw_w32__out_t mask; + } soc_ifc_reg__internal_fw_error_non_fatal_mask__out_t; + + typedef struct packed{ + logic [31:0] value; + logic swmod; + logic overflow; + } soc_ifc_reg__internal_rv_mtime_l__count_l__out_t; + + typedef struct packed{ + soc_ifc_reg__internal_rv_mtime_l__count_l__out_t count_l; + } soc_ifc_reg__internal_rv_mtime_l__out_t; + + typedef struct packed{ + logic [31:0] value; + logic swmod; + } soc_ifc_reg__internal_rv_mtime_h__count_h__out_t; + + typedef struct packed{ + soc_ifc_reg__internal_rv_mtime_h__count_h__out_t count_h; + } soc_ifc_reg__internal_rv_mtime_h__out_t; + + typedef struct packed{ + logic [31:0] value; + } soc_ifc_reg__internal_rv_mtimecmp_l__compare_l__out_t; + + typedef struct packed{ + soc_ifc_reg__internal_rv_mtimecmp_l__compare_l__out_t compare_l; + } soc_ifc_reg__internal_rv_mtimecmp_l__out_t; + + typedef struct packed{ + logic [31:0] value; + } soc_ifc_reg__internal_rv_mtimecmp_h__compare_h__out_t; + + typedef struct packed{ + soc_ifc_reg__internal_rv_mtimecmp_h__compare_h__out_t compare_h; + } soc_ifc_reg__internal_rv_mtimecmp_h__out_t; + typedef struct packed{ logic intr; } soc_ifc_reg__intr_block_t__global_intr_t_agg_sts_dd3dcf0a__out_t; @@ -765,13 +949,13 @@ package soc_ifc_reg_pkg; typedef struct packed{ logic intr; - } soc_ifc_reg__intr_block_t__notif_intr_t_notif_cmd_avail_sts_1871606b_notif_debug_locked_sts_5f024102_notif_mbox_ecc_cor_sts_5c3d26bb_notif_soc_req_lock_sts_deddde70__out_t; + } soc_ifc_reg__intr_block_t__notif_intr_t_notif_cmd_avail_sts_1871606b_notif_debug_locked_sts_5f024102_notif_gen_in_toggle_sts_59f84b64_notif_mbox_ecc_cor_sts_5c3d26bb_notif_scan_mode_sts_122f6367_notif_soc_req_lock_sts_deddde70__out_t; typedef struct packed{ soc_ifc_reg__intr_block_t__global_intr_t_agg_sts_dd3dcf0a__out_t error_global_intr_r; soc_ifc_reg__intr_block_t__global_intr_t_agg_sts_e6399b4a__out_t notif_global_intr_r; soc_ifc_reg__intr_block_t__error_intr_t_error_bad_fuse_sts_23f67582_error_cmd_fail_sts_b85845f8_error_iccm_blocked_sts_e81e6ad2_error_internal_sts_caad62e2_error_inv_dev_sts_6693e7db_error_mbox_ecc_unc_sts_30bff330_error_wdt_timer1_timeout_sts_6aaa9655_error_wdt_timer2_timeout_sts_cda8789f__out_t error_internal_intr_r; - soc_ifc_reg__intr_block_t__notif_intr_t_notif_cmd_avail_sts_1871606b_notif_debug_locked_sts_5f024102_notif_mbox_ecc_cor_sts_5c3d26bb_notif_soc_req_lock_sts_deddde70__out_t notif_internal_intr_r; + soc_ifc_reg__intr_block_t__notif_intr_t_notif_cmd_avail_sts_1871606b_notif_debug_locked_sts_5f024102_notif_gen_in_toggle_sts_59f84b64_notif_mbox_ecc_cor_sts_5c3d26bb_notif_scan_mode_sts_122f6367_notif_soc_req_lock_sts_deddde70__out_t notif_internal_intr_r; } soc_ifc_reg__intr_block_t__out_t; typedef struct packed{ @@ -790,6 +974,7 @@ package soc_ifc_reg_pkg; soc_ifc_reg__CPTRA_TRNG_VALID_PAUSER__out_t CPTRA_TRNG_VALID_PAUSER; soc_ifc_reg__CPTRA_TRNG_PAUSER_LOCK__out_t CPTRA_TRNG_PAUSER_LOCK; soc_ifc_reg__CPTRA_TRNG_DATA__out_t [12-1:0]CPTRA_TRNG_DATA; + soc_ifc_reg__CPTRA_TRNG_CTRL__out_t CPTRA_TRNG_CTRL; soc_ifc_reg__CPTRA_TRNG_STATUS__out_t CPTRA_TRNG_STATUS; soc_ifc_reg__CPTRA_FUSE_WR_DONE__out_t CPTRA_FUSE_WR_DONE; soc_ifc_reg__CPTRA_BOOTFSM_GO__out_t CPTRA_BOOTFSM_GO; @@ -797,7 +982,6 @@ package soc_ifc_reg_pkg; soc_ifc_reg__CPTRA_CLK_GATING_EN__out_t CPTRA_CLK_GATING_EN; soc_ifc_reg__CPTRA_GENERIC_INPUT_WIRES__out_t [2-1:0]CPTRA_GENERIC_INPUT_WIRES; soc_ifc_reg__CPTRA_GENERIC_OUTPUT_WIRES__out_t [2-1:0]CPTRA_GENERIC_OUTPUT_WIRES; - soc_ifc_reg__CPTRA_HW_REV_ID__out_t CPTRA_HW_REV_ID; soc_ifc_reg__CPTRA_FW_REV_ID__out_t [2-1:0]CPTRA_FW_REV_ID; soc_ifc_reg__CPTRA_WDT_TIMER1_EN__out_t CPTRA_WDT_TIMER1_EN; soc_ifc_reg__CPTRA_WDT_TIMER1_CTRL__out_t CPTRA_WDT_TIMER1_CTRL; @@ -806,6 +990,8 @@ package soc_ifc_reg_pkg; soc_ifc_reg__CPTRA_WDT_TIMER2_CTRL__out_t CPTRA_WDT_TIMER2_CTRL; soc_ifc_reg__CPTRA_WDT_TIMER2_TIMEOUT_PERIOD__out_t [2-1:0]CPTRA_WDT_TIMER2_TIMEOUT_PERIOD; soc_ifc_reg__CPTRA_WDT_STATUS__out_t CPTRA_WDT_STATUS; + soc_ifc_reg__CPTRA_FUSE_VALID_PAUSER__out_t CPTRA_FUSE_VALID_PAUSER; + soc_ifc_reg__CPTRA_FUSE_PAUSER_LOCK__out_t CPTRA_FUSE_PAUSER_LOCK; soc_ifc_reg__fuse_uds_seed__out_t [12-1:0]fuse_uds_seed; soc_ifc_reg__fuse_field_entropy__out_t [8-1:0]fuse_field_entropy; soc_ifc_reg__fuse_key_manifest_pk_hash__out_t [12-1:0]fuse_key_manifest_pk_hash; @@ -817,11 +1003,22 @@ package soc_ifc_reg_pkg; soc_ifc_reg__fuse_idevid_cert_attr__out_t [24-1:0]fuse_idevid_cert_attr; soc_ifc_reg__fuse_idevid_manuf_hsm_id__out_t [4-1:0]fuse_idevid_manuf_hsm_id; soc_ifc_reg__fuse_life_cycle__out_t fuse_life_cycle; + soc_ifc_reg__fuse_lms_verify__out_t fuse_lms_verify; + soc_ifc_reg__fuse_lms_revocation__out_t fuse_lms_revocation; + soc_ifc_reg__fuse_soc_stepping_id__out_t fuse_soc_stepping_id; soc_ifc_reg__internal_obf_key__out_t [8-1:0]internal_obf_key; soc_ifc_reg__internal_iccm_lock__out_t internal_iccm_lock; soc_ifc_reg__internal_fw_update_reset__out_t internal_fw_update_reset; soc_ifc_reg__internal_fw_update_reset_wait_cycles__out_t internal_fw_update_reset_wait_cycles; soc_ifc_reg__internal_nmi_vector__out_t internal_nmi_vector; + soc_ifc_reg__internal_hw_error_fatal_mask__out_t internal_hw_error_fatal_mask; + soc_ifc_reg__internal_hw_error_non_fatal_mask__out_t internal_hw_error_non_fatal_mask; + soc_ifc_reg__internal_fw_error_fatal_mask__out_t internal_fw_error_fatal_mask; + soc_ifc_reg__internal_fw_error_non_fatal_mask__out_t internal_fw_error_non_fatal_mask; + soc_ifc_reg__internal_rv_mtime_l__out_t internal_rv_mtime_l; + soc_ifc_reg__internal_rv_mtime_h__out_t internal_rv_mtime_h; + soc_ifc_reg__internal_rv_mtimecmp_l__out_t internal_rv_mtimecmp_l; + soc_ifc_reg__internal_rv_mtimecmp_h__out_t internal_rv_mtimecmp_h; soc_ifc_reg__intr_block_t__out_t intr_block_rf; } soc_ifc_reg__out_t; diff --git a/src/soc_ifc/rtl/soc_ifc_reg_properties.rdl b/src/soc_ifc/rtl/soc_ifc_reg_properties.rdl index 07a3092ed..4738904d4 100644 --- a/src/soc_ifc/rtl/soc_ifc_reg_properties.rdl +++ b/src/soc_ifc/rtl/soc_ifc_reg_properties.rdl @@ -29,9 +29,10 @@ //defined fields by access type //first is uc access type, second is soc access type - field rw_ro {swwel = soc_req;}; //writes enabled only for uc - field rw_rw_sticky_hw {hw = rw; sw = rw; we = true; woclr = true; resetsignal = cptra_pwrgood;}; //writes enabled for both uc and soc - used by HW ERROR regs - field rw_rw_sticky {hw = rw; sw = rw; we = true; resetsignal = cptra_pwrgood;}; //writes enabled for both uc and soc - used by FW ERROR regs + field rw_ro {swwel = soc_req;}; //writes enabled only for uc + field rw_ro_hw {swwel = soc_req; hw = r;}; //writes enabled only for uc, hw readable + field rw_rw_sticky_hw {hw = rw; sw = rw; we = true; woclr = true; resetsignal = cptra_pwrgood;}; //W1C enabled for both uc and soc - used by HW ERROR regs + field rw_rw_sticky {hw = rw; sw = rw; we = true; swmod = true; resetsignal = cptra_pwrgood;}; //writes enabled for both uc and soc - used by FW ERROR regs field ro_rw {swwe = soc_req;}; //writes enabled only for soc field ro_ro {sw = r;}; field rw_rw { }; diff --git a/src/soc_ifc/rtl/soc_ifc_reg_sample.svh b/src/soc_ifc/rtl/soc_ifc_reg_sample.svh new file mode 100644 index 000000000..e677131de --- /dev/null +++ b/src/soc_ifc/rtl/soc_ifc_reg_sample.svh @@ -0,0 +1,2769 @@ +// SPDX-License-Identifier: Apache-2.0 +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +`ifndef SOC_IFC_REG_SAMPLE + `define SOC_IFC_REG_SAMPLE + + /*----------------------- SOC_IFC_REG__CPTRA_HW_ERROR_FATAL SAMPLE FUNCTIONS -----------------------*/ + function void soc_ifc_reg__CPTRA_HW_ERROR_FATAL::sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); + m_current = get(); + m_data = data; + m_is_read = is_read; + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(iccm_ecc_unc_bit_cg[bt]) this.iccm_ecc_unc_bit_cg[bt].sample(data[0 + bt]); + foreach(dccm_ecc_unc_bit_cg[bt]) this.dccm_ecc_unc_bit_cg[bt].sample(data[1 + bt]); + foreach(nmi_pin_bit_cg[bt]) this.nmi_pin_bit_cg[bt].sample(data[2 + bt]); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( data[0:0]/*iccm_ecc_unc*/ , data[1:1]/*dccm_ecc_unc*/ , data[2:2]/*nmi_pin*/ ); + end + endfunction + + function void soc_ifc_reg__CPTRA_HW_ERROR_FATAL::sample_values(); + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(iccm_ecc_unc_bit_cg[bt]) this.iccm_ecc_unc_bit_cg[bt].sample(iccm_ecc_unc.get_mirrored_value() >> bt); + foreach(dccm_ecc_unc_bit_cg[bt]) this.dccm_ecc_unc_bit_cg[bt].sample(dccm_ecc_unc.get_mirrored_value() >> bt); + foreach(nmi_pin_bit_cg[bt]) this.nmi_pin_bit_cg[bt].sample(nmi_pin.get_mirrored_value() >> bt); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( iccm_ecc_unc.get_mirrored_value() , dccm_ecc_unc.get_mirrored_value() , nmi_pin.get_mirrored_value() ); + end + endfunction + + /*----------------------- SOC_IFC_REG__CPTRA_HW_ERROR_NON_FATAL SAMPLE FUNCTIONS -----------------------*/ + function void soc_ifc_reg__CPTRA_HW_ERROR_NON_FATAL::sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); + m_current = get(); + m_data = data; + m_is_read = is_read; + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(mbox_prot_no_lock_bit_cg[bt]) this.mbox_prot_no_lock_bit_cg[bt].sample(data[0 + bt]); + foreach(mbox_prot_ooo_bit_cg[bt]) this.mbox_prot_ooo_bit_cg[bt].sample(data[1 + bt]); + foreach(mbox_ecc_unc_bit_cg[bt]) this.mbox_ecc_unc_bit_cg[bt].sample(data[2 + bt]); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( data[0:0]/*mbox_prot_no_lock*/ , data[1:1]/*mbox_prot_ooo*/ , data[2:2]/*mbox_ecc_unc*/ ); + end + endfunction + + function void soc_ifc_reg__CPTRA_HW_ERROR_NON_FATAL::sample_values(); + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(mbox_prot_no_lock_bit_cg[bt]) this.mbox_prot_no_lock_bit_cg[bt].sample(mbox_prot_no_lock.get_mirrored_value() >> bt); + foreach(mbox_prot_ooo_bit_cg[bt]) this.mbox_prot_ooo_bit_cg[bt].sample(mbox_prot_ooo.get_mirrored_value() >> bt); + foreach(mbox_ecc_unc_bit_cg[bt]) this.mbox_ecc_unc_bit_cg[bt].sample(mbox_ecc_unc.get_mirrored_value() >> bt); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( mbox_prot_no_lock.get_mirrored_value() , mbox_prot_ooo.get_mirrored_value() , mbox_ecc_unc.get_mirrored_value() ); + end + endfunction + + /*----------------------- SOC_IFC_REG__CPTRA_FW_ERROR_FATAL SAMPLE FUNCTIONS -----------------------*/ + function void soc_ifc_reg__CPTRA_FW_ERROR_FATAL::sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); + m_current = get(); + m_data = data; + m_is_read = is_read; + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(error_code_bit_cg[bt]) this.error_code_bit_cg[bt].sample(data[0 + bt]); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( data[31:0]/*error_code*/ ); + end + endfunction + + function void soc_ifc_reg__CPTRA_FW_ERROR_FATAL::sample_values(); + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(error_code_bit_cg[bt]) this.error_code_bit_cg[bt].sample(error_code.get_mirrored_value() >> bt); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( error_code.get_mirrored_value() ); + end + endfunction + + /*----------------------- SOC_IFC_REG__CPTRA_FW_ERROR_NON_FATAL SAMPLE FUNCTIONS -----------------------*/ + function void soc_ifc_reg__CPTRA_FW_ERROR_NON_FATAL::sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); + m_current = get(); + m_data = data; + m_is_read = is_read; + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(error_code_bit_cg[bt]) this.error_code_bit_cg[bt].sample(data[0 + bt]); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( data[31:0]/*error_code*/ ); + end + endfunction + + function void soc_ifc_reg__CPTRA_FW_ERROR_NON_FATAL::sample_values(); + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(error_code_bit_cg[bt]) this.error_code_bit_cg[bt].sample(error_code.get_mirrored_value() >> bt); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( error_code.get_mirrored_value() ); + end + endfunction + + /*----------------------- SOC_IFC_REG__CPTRA_HW_ERROR_ENC SAMPLE FUNCTIONS -----------------------*/ + function void soc_ifc_reg__CPTRA_HW_ERROR_ENC::sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); + m_current = get(); + m_data = data; + m_is_read = is_read; + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(error_code_bit_cg[bt]) this.error_code_bit_cg[bt].sample(data[0 + bt]); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( data[31:0]/*error_code*/ ); + end + endfunction + + function void soc_ifc_reg__CPTRA_HW_ERROR_ENC::sample_values(); + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(error_code_bit_cg[bt]) this.error_code_bit_cg[bt].sample(error_code.get_mirrored_value() >> bt); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( error_code.get_mirrored_value() ); + end + endfunction + + /*----------------------- SOC_IFC_REG__CPTRA_FW_ERROR_ENC SAMPLE FUNCTIONS -----------------------*/ + function void soc_ifc_reg__CPTRA_FW_ERROR_ENC::sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); + m_current = get(); + m_data = data; + m_is_read = is_read; + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(error_code_bit_cg[bt]) this.error_code_bit_cg[bt].sample(data[0 + bt]); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( data[31:0]/*error_code*/ ); + end + endfunction + + function void soc_ifc_reg__CPTRA_FW_ERROR_ENC::sample_values(); + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(error_code_bit_cg[bt]) this.error_code_bit_cg[bt].sample(error_code.get_mirrored_value() >> bt); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( error_code.get_mirrored_value() ); + end + endfunction + + /*----------------------- SOC_IFC_REG__CPTRA_FW_EXTENDED_ERROR_INFO SAMPLE FUNCTIONS -----------------------*/ + function void soc_ifc_reg__CPTRA_FW_EXTENDED_ERROR_INFO::sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); + m_current = get(); + m_data = data; + m_is_read = is_read; + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(error_info_bit_cg[bt]) this.error_info_bit_cg[bt].sample(data[0 + bt]); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( data[31:0]/*error_info*/ ); + end + endfunction + + function void soc_ifc_reg__CPTRA_FW_EXTENDED_ERROR_INFO::sample_values(); + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(error_info_bit_cg[bt]) this.error_info_bit_cg[bt].sample(error_info.get_mirrored_value() >> bt); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( error_info.get_mirrored_value() ); + end + endfunction + + /*----------------------- SOC_IFC_REG__CPTRA_BOOT_STATUS SAMPLE FUNCTIONS -----------------------*/ + function void soc_ifc_reg__CPTRA_BOOT_STATUS::sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); + m_current = get(); + m_data = data; + m_is_read = is_read; + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(status_bit_cg[bt]) this.status_bit_cg[bt].sample(data[0 + bt]); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( data[31:0]/*status*/ ); + end + endfunction + + function void soc_ifc_reg__CPTRA_BOOT_STATUS::sample_values(); + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(status_bit_cg[bt]) this.status_bit_cg[bt].sample(status.get_mirrored_value() >> bt); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( status.get_mirrored_value() ); + end + endfunction + + /*----------------------- SOC_IFC_REG__CPTRA_FLOW_STATUS SAMPLE FUNCTIONS -----------------------*/ + function void soc_ifc_reg__CPTRA_FLOW_STATUS::sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); + m_current = get(); + m_data = data; + m_is_read = is_read; + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(status_bit_cg[bt]) this.status_bit_cg[bt].sample(data[0 + bt]); + foreach(idevid_csr_ready_bit_cg[bt]) this.idevid_csr_ready_bit_cg[bt].sample(data[24 + bt]); + foreach(boot_fsm_ps_bit_cg[bt]) this.boot_fsm_ps_bit_cg[bt].sample(data[25 + bt]); + foreach(ready_for_fw_bit_cg[bt]) this.ready_for_fw_bit_cg[bt].sample(data[28 + bt]); + foreach(ready_for_runtime_bit_cg[bt]) this.ready_for_runtime_bit_cg[bt].sample(data[29 + bt]); + foreach(ready_for_fuses_bit_cg[bt]) this.ready_for_fuses_bit_cg[bt].sample(data[30 + bt]); + foreach(mailbox_flow_done_bit_cg[bt]) this.mailbox_flow_done_bit_cg[bt].sample(data[31 + bt]); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( data[23:0]/*status*/ , data[24:24]/*idevid_csr_ready*/ , data[27:25]/*boot_fsm_ps*/ , data[28:28]/*ready_for_fw*/ , data[29:29]/*ready_for_runtime*/ , data[30:30]/*ready_for_fuses*/ , data[31:31]/*mailbox_flow_done*/ ); + end + endfunction + + function void soc_ifc_reg__CPTRA_FLOW_STATUS::sample_values(); + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(status_bit_cg[bt]) this.status_bit_cg[bt].sample(status.get_mirrored_value() >> bt); + foreach(idevid_csr_ready_bit_cg[bt]) this.idevid_csr_ready_bit_cg[bt].sample(idevid_csr_ready.get_mirrored_value() >> bt); + foreach(boot_fsm_ps_bit_cg[bt]) this.boot_fsm_ps_bit_cg[bt].sample(boot_fsm_ps.get_mirrored_value() >> bt); + foreach(ready_for_fw_bit_cg[bt]) this.ready_for_fw_bit_cg[bt].sample(ready_for_fw.get_mirrored_value() >> bt); + foreach(ready_for_runtime_bit_cg[bt]) this.ready_for_runtime_bit_cg[bt].sample(ready_for_runtime.get_mirrored_value() >> bt); + foreach(ready_for_fuses_bit_cg[bt]) this.ready_for_fuses_bit_cg[bt].sample(ready_for_fuses.get_mirrored_value() >> bt); + foreach(mailbox_flow_done_bit_cg[bt]) this.mailbox_flow_done_bit_cg[bt].sample(mailbox_flow_done.get_mirrored_value() >> bt); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( status.get_mirrored_value() , idevid_csr_ready.get_mirrored_value() , boot_fsm_ps.get_mirrored_value() , ready_for_fw.get_mirrored_value() , ready_for_runtime.get_mirrored_value() , ready_for_fuses.get_mirrored_value() , mailbox_flow_done.get_mirrored_value() ); + end + endfunction + + /*----------------------- SOC_IFC_REG__CPTRA_RESET_REASON SAMPLE FUNCTIONS -----------------------*/ + function void soc_ifc_reg__CPTRA_RESET_REASON::sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); + m_current = get(); + m_data = data; + m_is_read = is_read; + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(FW_UPD_RESET_bit_cg[bt]) this.FW_UPD_RESET_bit_cg[bt].sample(data[0 + bt]); + foreach(WARM_RESET_bit_cg[bt]) this.WARM_RESET_bit_cg[bt].sample(data[1 + bt]); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( data[0:0]/*FW_UPD_RESET*/ , data[1:1]/*WARM_RESET*/ ); + end + endfunction + + function void soc_ifc_reg__CPTRA_RESET_REASON::sample_values(); + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(FW_UPD_RESET_bit_cg[bt]) this.FW_UPD_RESET_bit_cg[bt].sample(FW_UPD_RESET.get_mirrored_value() >> bt); + foreach(WARM_RESET_bit_cg[bt]) this.WARM_RESET_bit_cg[bt].sample(WARM_RESET.get_mirrored_value() >> bt); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( FW_UPD_RESET.get_mirrored_value() , WARM_RESET.get_mirrored_value() ); + end + endfunction + + /*----------------------- SOC_IFC_REG__CPTRA_SECURITY_STATE SAMPLE FUNCTIONS -----------------------*/ + function void soc_ifc_reg__CPTRA_SECURITY_STATE::sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); + m_current = get(); + m_data = data; + m_is_read = is_read; + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(device_lifecycle_bit_cg[bt]) this.device_lifecycle_bit_cg[bt].sample(data[0 + bt]); + foreach(debug_locked_bit_cg[bt]) this.debug_locked_bit_cg[bt].sample(data[2 + bt]); + foreach(scan_mode_bit_cg[bt]) this.scan_mode_bit_cg[bt].sample(data[3 + bt]); + foreach(rsvd_bit_cg[bt]) this.rsvd_bit_cg[bt].sample(data[4 + bt]); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( data[1:0]/*device_lifecycle*/ , data[2:2]/*debug_locked*/ , data[3:3]/*scan_mode*/ , data[31:4]/*rsvd*/ ); + end + endfunction + + function void soc_ifc_reg__CPTRA_SECURITY_STATE::sample_values(); + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(device_lifecycle_bit_cg[bt]) this.device_lifecycle_bit_cg[bt].sample(device_lifecycle.get_mirrored_value() >> bt); + foreach(debug_locked_bit_cg[bt]) this.debug_locked_bit_cg[bt].sample(debug_locked.get_mirrored_value() >> bt); + foreach(scan_mode_bit_cg[bt]) this.scan_mode_bit_cg[bt].sample(scan_mode.get_mirrored_value() >> bt); + foreach(rsvd_bit_cg[bt]) this.rsvd_bit_cg[bt].sample(rsvd.get_mirrored_value() >> bt); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( device_lifecycle.get_mirrored_value() , debug_locked.get_mirrored_value() , scan_mode.get_mirrored_value() , rsvd.get_mirrored_value() ); + end + endfunction + + /*----------------------- SOC_IFC_REG__CPTRA_MBOX_VALID_PAUSER SAMPLE FUNCTIONS -----------------------*/ + function void soc_ifc_reg__CPTRA_MBOX_VALID_PAUSER::sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); + m_current = get(); + m_data = data; + m_is_read = is_read; + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(PAUSER_bit_cg[bt]) this.PAUSER_bit_cg[bt].sample(data[0 + bt]); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( data[31:0]/*PAUSER*/ ); + end + endfunction + + function void soc_ifc_reg__CPTRA_MBOX_VALID_PAUSER::sample_values(); + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(PAUSER_bit_cg[bt]) this.PAUSER_bit_cg[bt].sample(PAUSER.get_mirrored_value() >> bt); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( PAUSER.get_mirrored_value() ); + end + endfunction + + /*----------------------- SOC_IFC_REG__CPTRA_MBOX_PAUSER_LOCK SAMPLE FUNCTIONS -----------------------*/ + function void soc_ifc_reg__CPTRA_MBOX_PAUSER_LOCK::sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); + m_current = get(); + m_data = data; + m_is_read = is_read; + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(LOCK_bit_cg[bt]) this.LOCK_bit_cg[bt].sample(data[0 + bt]); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( data[0:0]/*LOCK*/ ); + end + endfunction + + function void soc_ifc_reg__CPTRA_MBOX_PAUSER_LOCK::sample_values(); + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(LOCK_bit_cg[bt]) this.LOCK_bit_cg[bt].sample(LOCK.get_mirrored_value() >> bt); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( LOCK.get_mirrored_value() ); + end + endfunction + + /*----------------------- SOC_IFC_REG__CPTRA_TRNG_VALID_PAUSER SAMPLE FUNCTIONS -----------------------*/ + function void soc_ifc_reg__CPTRA_TRNG_VALID_PAUSER::sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); + m_current = get(); + m_data = data; + m_is_read = is_read; + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(PAUSER_bit_cg[bt]) this.PAUSER_bit_cg[bt].sample(data[0 + bt]); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( data[31:0]/*PAUSER*/ ); + end + endfunction + + function void soc_ifc_reg__CPTRA_TRNG_VALID_PAUSER::sample_values(); + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(PAUSER_bit_cg[bt]) this.PAUSER_bit_cg[bt].sample(PAUSER.get_mirrored_value() >> bt); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( PAUSER.get_mirrored_value() ); + end + endfunction + + /*----------------------- SOC_IFC_REG__CPTRA_TRNG_PAUSER_LOCK SAMPLE FUNCTIONS -----------------------*/ + function void soc_ifc_reg__CPTRA_TRNG_PAUSER_LOCK::sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); + m_current = get(); + m_data = data; + m_is_read = is_read; + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(LOCK_bit_cg[bt]) this.LOCK_bit_cg[bt].sample(data[0 + bt]); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( data[0:0]/*LOCK*/ ); + end + endfunction + + function void soc_ifc_reg__CPTRA_TRNG_PAUSER_LOCK::sample_values(); + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(LOCK_bit_cg[bt]) this.LOCK_bit_cg[bt].sample(LOCK.get_mirrored_value() >> bt); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( LOCK.get_mirrored_value() ); + end + endfunction + + /*----------------------- SOC_IFC_REG__CPTRA_TRNG_DATA SAMPLE FUNCTIONS -----------------------*/ + function void soc_ifc_reg__CPTRA_TRNG_DATA::sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); + m_current = get(); + m_data = data; + m_is_read = is_read; + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(DATA_bit_cg[bt]) this.DATA_bit_cg[bt].sample(data[0 + bt]); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( data[31:0]/*DATA*/ ); + end + endfunction + + function void soc_ifc_reg__CPTRA_TRNG_DATA::sample_values(); + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(DATA_bit_cg[bt]) this.DATA_bit_cg[bt].sample(DATA.get_mirrored_value() >> bt); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( DATA.get_mirrored_value() ); + end + endfunction + + /*----------------------- SOC_IFC_REG__CPTRA_TRNG_CTRL SAMPLE FUNCTIONS -----------------------*/ + function void soc_ifc_reg__CPTRA_TRNG_CTRL::sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); + m_current = get(); + m_data = data; + m_is_read = is_read; + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(clear_bit_cg[bt]) this.clear_bit_cg[bt].sample(data[0 + bt]); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( data[0:0]/*clear*/ ); + end + endfunction + + function void soc_ifc_reg__CPTRA_TRNG_CTRL::sample_values(); + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(clear_bit_cg[bt]) this.clear_bit_cg[bt].sample(clear.get_mirrored_value() >> bt); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( clear.get_mirrored_value() ); + end + endfunction + + /*----------------------- SOC_IFC_REG__CPTRA_TRNG_STATUS SAMPLE FUNCTIONS -----------------------*/ + function void soc_ifc_reg__CPTRA_TRNG_STATUS::sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); + m_current = get(); + m_data = data; + m_is_read = is_read; + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(DATA_REQ_bit_cg[bt]) this.DATA_REQ_bit_cg[bt].sample(data[0 + bt]); + foreach(DATA_WR_DONE_bit_cg[bt]) this.DATA_WR_DONE_bit_cg[bt].sample(data[1 + bt]); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( data[0:0]/*DATA_REQ*/ , data[1:1]/*DATA_WR_DONE*/ ); + end + endfunction + + function void soc_ifc_reg__CPTRA_TRNG_STATUS::sample_values(); + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(DATA_REQ_bit_cg[bt]) this.DATA_REQ_bit_cg[bt].sample(DATA_REQ.get_mirrored_value() >> bt); + foreach(DATA_WR_DONE_bit_cg[bt]) this.DATA_WR_DONE_bit_cg[bt].sample(DATA_WR_DONE.get_mirrored_value() >> bt); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( DATA_REQ.get_mirrored_value() , DATA_WR_DONE.get_mirrored_value() ); + end + endfunction + + /*----------------------- SOC_IFC_REG__CPTRA_FUSE_WR_DONE SAMPLE FUNCTIONS -----------------------*/ + function void soc_ifc_reg__CPTRA_FUSE_WR_DONE::sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); + m_current = get(); + m_data = data; + m_is_read = is_read; + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(done_bit_cg[bt]) this.done_bit_cg[bt].sample(data[0 + bt]); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( data[0:0]/*done*/ ); + end + endfunction + + function void soc_ifc_reg__CPTRA_FUSE_WR_DONE::sample_values(); + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(done_bit_cg[bt]) this.done_bit_cg[bt].sample(done.get_mirrored_value() >> bt); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( done.get_mirrored_value() ); + end + endfunction + + /*----------------------- SOC_IFC_REG__CPTRA_TIMER_CONFIG SAMPLE FUNCTIONS -----------------------*/ + function void soc_ifc_reg__CPTRA_TIMER_CONFIG::sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); + m_current = get(); + m_data = data; + m_is_read = is_read; + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(clk_period_bit_cg[bt]) this.clk_period_bit_cg[bt].sample(data[0 + bt]); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( data[31:0]/*clk_period*/ ); + end + endfunction + + function void soc_ifc_reg__CPTRA_TIMER_CONFIG::sample_values(); + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(clk_period_bit_cg[bt]) this.clk_period_bit_cg[bt].sample(clk_period.get_mirrored_value() >> bt); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( clk_period.get_mirrored_value() ); + end + endfunction + + /*----------------------- SOC_IFC_REG__CPTRA_BOOTFSM_GO SAMPLE FUNCTIONS -----------------------*/ + function void soc_ifc_reg__CPTRA_BOOTFSM_GO::sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); + m_current = get(); + m_data = data; + m_is_read = is_read; + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(GO_bit_cg[bt]) this.GO_bit_cg[bt].sample(data[0 + bt]); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( data[0:0]/*GO*/ ); + end + endfunction + + function void soc_ifc_reg__CPTRA_BOOTFSM_GO::sample_values(); + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(GO_bit_cg[bt]) this.GO_bit_cg[bt].sample(GO.get_mirrored_value() >> bt); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( GO.get_mirrored_value() ); + end + endfunction + + /*----------------------- SOC_IFC_REG__CPTRA_DBG_MANUF_SERVICE_REG SAMPLE FUNCTIONS -----------------------*/ + function void soc_ifc_reg__CPTRA_DBG_MANUF_SERVICE_REG::sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); + m_current = get(); + m_data = data; + m_is_read = is_read; + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(DATA_bit_cg[bt]) this.DATA_bit_cg[bt].sample(data[0 + bt]); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( data[31:0]/*DATA*/ ); + end + endfunction + + function void soc_ifc_reg__CPTRA_DBG_MANUF_SERVICE_REG::sample_values(); + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(DATA_bit_cg[bt]) this.DATA_bit_cg[bt].sample(DATA.get_mirrored_value() >> bt); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( DATA.get_mirrored_value() ); + end + endfunction + + /*----------------------- SOC_IFC_REG__CPTRA_CLK_GATING_EN SAMPLE FUNCTIONS -----------------------*/ + function void soc_ifc_reg__CPTRA_CLK_GATING_EN::sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); + m_current = get(); + m_data = data; + m_is_read = is_read; + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(clk_gating_en_bit_cg[bt]) this.clk_gating_en_bit_cg[bt].sample(data[0 + bt]); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( data[0:0]/*clk_gating_en*/ ); + end + endfunction + + function void soc_ifc_reg__CPTRA_CLK_GATING_EN::sample_values(); + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(clk_gating_en_bit_cg[bt]) this.clk_gating_en_bit_cg[bt].sample(clk_gating_en.get_mirrored_value() >> bt); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( clk_gating_en.get_mirrored_value() ); + end + endfunction + + /*----------------------- SOC_IFC_REG__CPTRA_GENERIC_INPUT_WIRES SAMPLE FUNCTIONS -----------------------*/ + function void soc_ifc_reg__CPTRA_GENERIC_INPUT_WIRES::sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); + m_current = get(); + m_data = data; + m_is_read = is_read; + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(generic_wires_bit_cg[bt]) this.generic_wires_bit_cg[bt].sample(data[0 + bt]); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( data[31:0]/*generic_wires*/ ); + end + endfunction + + function void soc_ifc_reg__CPTRA_GENERIC_INPUT_WIRES::sample_values(); + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(generic_wires_bit_cg[bt]) this.generic_wires_bit_cg[bt].sample(generic_wires.get_mirrored_value() >> bt); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( generic_wires.get_mirrored_value() ); + end + endfunction + + /*----------------------- SOC_IFC_REG__CPTRA_GENERIC_OUTPUT_WIRES SAMPLE FUNCTIONS -----------------------*/ + function void soc_ifc_reg__CPTRA_GENERIC_OUTPUT_WIRES::sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); + m_current = get(); + m_data = data; + m_is_read = is_read; + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(generic_wires_bit_cg[bt]) this.generic_wires_bit_cg[bt].sample(data[0 + bt]); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( data[31:0]/*generic_wires*/ ); + end + endfunction + + function void soc_ifc_reg__CPTRA_GENERIC_OUTPUT_WIRES::sample_values(); + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(generic_wires_bit_cg[bt]) this.generic_wires_bit_cg[bt].sample(generic_wires.get_mirrored_value() >> bt); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( generic_wires.get_mirrored_value() ); + end + endfunction + + /*----------------------- SOC_IFC_REG__CPTRA_HW_REV_ID SAMPLE FUNCTIONS -----------------------*/ + function void soc_ifc_reg__CPTRA_HW_REV_ID::sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); + m_current = get(); + m_data = data; + m_is_read = is_read; + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(CPTRA_GENERATION_bit_cg[bt]) this.CPTRA_GENERATION_bit_cg[bt].sample(data[0 + bt]); + foreach(SOC_STEPPING_ID_bit_cg[bt]) this.SOC_STEPPING_ID_bit_cg[bt].sample(data[16 + bt]); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( data[15:0]/*CPTRA_GENERATION*/ , data[31:16]/*SOC_STEPPING_ID*/ ); + end + endfunction + + function void soc_ifc_reg__CPTRA_HW_REV_ID::sample_values(); + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(CPTRA_GENERATION_bit_cg[bt]) this.CPTRA_GENERATION_bit_cg[bt].sample(CPTRA_GENERATION.get_mirrored_value() >> bt); + foreach(SOC_STEPPING_ID_bit_cg[bt]) this.SOC_STEPPING_ID_bit_cg[bt].sample(SOC_STEPPING_ID.get_mirrored_value() >> bt); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( CPTRA_GENERATION.get_mirrored_value() , SOC_STEPPING_ID.get_mirrored_value() ); + end + endfunction + + /*----------------------- SOC_IFC_REG__CPTRA_FW_REV_ID SAMPLE FUNCTIONS -----------------------*/ + function void soc_ifc_reg__CPTRA_FW_REV_ID::sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); + m_current = get(); + m_data = data; + m_is_read = is_read; + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(REV_ID_bit_cg[bt]) this.REV_ID_bit_cg[bt].sample(data[0 + bt]); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( data[31:0]/*REV_ID*/ ); + end + endfunction + + function void soc_ifc_reg__CPTRA_FW_REV_ID::sample_values(); + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(REV_ID_bit_cg[bt]) this.REV_ID_bit_cg[bt].sample(REV_ID.get_mirrored_value() >> bt); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( REV_ID.get_mirrored_value() ); + end + endfunction + + /*----------------------- SOC_IFC_REG__CPTRA_HW_CONFIG SAMPLE FUNCTIONS -----------------------*/ + function void soc_ifc_reg__CPTRA_HW_CONFIG::sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); + m_current = get(); + m_data = data; + m_is_read = is_read; + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(iTRNG_en_bit_cg[bt]) this.iTRNG_en_bit_cg[bt].sample(data[0 + bt]); + foreach(QSPI_en_bit_cg[bt]) this.QSPI_en_bit_cg[bt].sample(data[1 + bt]); + foreach(I3C_en_bit_cg[bt]) this.I3C_en_bit_cg[bt].sample(data[2 + bt]); + foreach(UART_en_bit_cg[bt]) this.UART_en_bit_cg[bt].sample(data[3 + bt]); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( data[0:0]/*iTRNG_en*/ , data[1:1]/*QSPI_en*/ , data[2:2]/*I3C_en*/ , data[3:3]/*UART_en*/ ); + end + endfunction + + function void soc_ifc_reg__CPTRA_HW_CONFIG::sample_values(); + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(iTRNG_en_bit_cg[bt]) this.iTRNG_en_bit_cg[bt].sample(iTRNG_en.get_mirrored_value() >> bt); + foreach(QSPI_en_bit_cg[bt]) this.QSPI_en_bit_cg[bt].sample(QSPI_en.get_mirrored_value() >> bt); + foreach(I3C_en_bit_cg[bt]) this.I3C_en_bit_cg[bt].sample(I3C_en.get_mirrored_value() >> bt); + foreach(UART_en_bit_cg[bt]) this.UART_en_bit_cg[bt].sample(UART_en.get_mirrored_value() >> bt); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( iTRNG_en.get_mirrored_value() , QSPI_en.get_mirrored_value() , I3C_en.get_mirrored_value() , UART_en.get_mirrored_value() ); + end + endfunction + + /*----------------------- SOC_IFC_REG__CPTRA_WDT_TIMER1_EN SAMPLE FUNCTIONS -----------------------*/ + function void soc_ifc_reg__CPTRA_WDT_TIMER1_EN::sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); + m_current = get(); + m_data = data; + m_is_read = is_read; + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(timer1_en_bit_cg[bt]) this.timer1_en_bit_cg[bt].sample(data[0 + bt]); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( data[0:0]/*timer1_en*/ ); + end + endfunction + + function void soc_ifc_reg__CPTRA_WDT_TIMER1_EN::sample_values(); + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(timer1_en_bit_cg[bt]) this.timer1_en_bit_cg[bt].sample(timer1_en.get_mirrored_value() >> bt); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( timer1_en.get_mirrored_value() ); + end + endfunction + + /*----------------------- SOC_IFC_REG__CPTRA_WDT_TIMER1_CTRL SAMPLE FUNCTIONS -----------------------*/ + function void soc_ifc_reg__CPTRA_WDT_TIMER1_CTRL::sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); + m_current = get(); + m_data = data; + m_is_read = is_read; + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(timer1_restart_bit_cg[bt]) this.timer1_restart_bit_cg[bt].sample(data[0 + bt]); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( data[0:0]/*timer1_restart*/ ); + end + endfunction + + function void soc_ifc_reg__CPTRA_WDT_TIMER1_CTRL::sample_values(); + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(timer1_restart_bit_cg[bt]) this.timer1_restart_bit_cg[bt].sample(timer1_restart.get_mirrored_value() >> bt); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( timer1_restart.get_mirrored_value() ); + end + endfunction + + /*----------------------- SOC_IFC_REG__CPTRA_WDT_TIMER1_TIMEOUT_PERIOD SAMPLE FUNCTIONS -----------------------*/ + function void soc_ifc_reg__CPTRA_WDT_TIMER1_TIMEOUT_PERIOD::sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); + m_current = get(); + m_data = data; + m_is_read = is_read; + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(timer1_timeout_period_bit_cg[bt]) this.timer1_timeout_period_bit_cg[bt].sample(data[0 + bt]); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( data[31:0]/*timer1_timeout_period*/ ); + end + endfunction + + function void soc_ifc_reg__CPTRA_WDT_TIMER1_TIMEOUT_PERIOD::sample_values(); + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(timer1_timeout_period_bit_cg[bt]) this.timer1_timeout_period_bit_cg[bt].sample(timer1_timeout_period.get_mirrored_value() >> bt); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( timer1_timeout_period.get_mirrored_value() ); + end + endfunction + + /*----------------------- SOC_IFC_REG__CPTRA_WDT_TIMER2_EN SAMPLE FUNCTIONS -----------------------*/ + function void soc_ifc_reg__CPTRA_WDT_TIMER2_EN::sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); + m_current = get(); + m_data = data; + m_is_read = is_read; + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(timer2_en_bit_cg[bt]) this.timer2_en_bit_cg[bt].sample(data[0 + bt]); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( data[0:0]/*timer2_en*/ ); + end + endfunction + + function void soc_ifc_reg__CPTRA_WDT_TIMER2_EN::sample_values(); + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(timer2_en_bit_cg[bt]) this.timer2_en_bit_cg[bt].sample(timer2_en.get_mirrored_value() >> bt); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( timer2_en.get_mirrored_value() ); + end + endfunction + + /*----------------------- SOC_IFC_REG__CPTRA_WDT_TIMER2_CTRL SAMPLE FUNCTIONS -----------------------*/ + function void soc_ifc_reg__CPTRA_WDT_TIMER2_CTRL::sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); + m_current = get(); + m_data = data; + m_is_read = is_read; + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(timer2_restart_bit_cg[bt]) this.timer2_restart_bit_cg[bt].sample(data[0 + bt]); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( data[0:0]/*timer2_restart*/ ); + end + endfunction + + function void soc_ifc_reg__CPTRA_WDT_TIMER2_CTRL::sample_values(); + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(timer2_restart_bit_cg[bt]) this.timer2_restart_bit_cg[bt].sample(timer2_restart.get_mirrored_value() >> bt); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( timer2_restart.get_mirrored_value() ); + end + endfunction + + /*----------------------- SOC_IFC_REG__CPTRA_WDT_TIMER2_TIMEOUT_PERIOD SAMPLE FUNCTIONS -----------------------*/ + function void soc_ifc_reg__CPTRA_WDT_TIMER2_TIMEOUT_PERIOD::sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); + m_current = get(); + m_data = data; + m_is_read = is_read; + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(timer2_timeout_period_bit_cg[bt]) this.timer2_timeout_period_bit_cg[bt].sample(data[0 + bt]); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( data[31:0]/*timer2_timeout_period*/ ); + end + endfunction + + function void soc_ifc_reg__CPTRA_WDT_TIMER2_TIMEOUT_PERIOD::sample_values(); + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(timer2_timeout_period_bit_cg[bt]) this.timer2_timeout_period_bit_cg[bt].sample(timer2_timeout_period.get_mirrored_value() >> bt); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( timer2_timeout_period.get_mirrored_value() ); + end + endfunction + + /*----------------------- SOC_IFC_REG__CPTRA_WDT_STATUS SAMPLE FUNCTIONS -----------------------*/ + function void soc_ifc_reg__CPTRA_WDT_STATUS::sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); + m_current = get(); + m_data = data; + m_is_read = is_read; + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(t1_timeout_bit_cg[bt]) this.t1_timeout_bit_cg[bt].sample(data[0 + bt]); + foreach(t2_timeout_bit_cg[bt]) this.t2_timeout_bit_cg[bt].sample(data[1 + bt]); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( data[0:0]/*t1_timeout*/ , data[1:1]/*t2_timeout*/ ); + end + endfunction + + function void soc_ifc_reg__CPTRA_WDT_STATUS::sample_values(); + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(t1_timeout_bit_cg[bt]) this.t1_timeout_bit_cg[bt].sample(t1_timeout.get_mirrored_value() >> bt); + foreach(t2_timeout_bit_cg[bt]) this.t2_timeout_bit_cg[bt].sample(t2_timeout.get_mirrored_value() >> bt); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( t1_timeout.get_mirrored_value() , t2_timeout.get_mirrored_value() ); + end + endfunction + + /*----------------------- SOC_IFC_REG__CPTRA_FUSE_VALID_PAUSER SAMPLE FUNCTIONS -----------------------*/ + function void soc_ifc_reg__CPTRA_FUSE_VALID_PAUSER::sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); + m_current = get(); + m_data = data; + m_is_read = is_read; + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(PAUSER_bit_cg[bt]) this.PAUSER_bit_cg[bt].sample(data[0 + bt]); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( data[31:0]/*PAUSER*/ ); + end + endfunction + + function void soc_ifc_reg__CPTRA_FUSE_VALID_PAUSER::sample_values(); + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(PAUSER_bit_cg[bt]) this.PAUSER_bit_cg[bt].sample(PAUSER.get_mirrored_value() >> bt); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( PAUSER.get_mirrored_value() ); + end + endfunction + + /*----------------------- SOC_IFC_REG__CPTRA_FUSE_PAUSER_LOCK SAMPLE FUNCTIONS -----------------------*/ + function void soc_ifc_reg__CPTRA_FUSE_PAUSER_LOCK::sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); + m_current = get(); + m_data = data; + m_is_read = is_read; + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(LOCK_bit_cg[bt]) this.LOCK_bit_cg[bt].sample(data[0 + bt]); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( data[0:0]/*LOCK*/ ); + end + endfunction + + function void soc_ifc_reg__CPTRA_FUSE_PAUSER_LOCK::sample_values(); + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(LOCK_bit_cg[bt]) this.LOCK_bit_cg[bt].sample(LOCK.get_mirrored_value() >> bt); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( LOCK.get_mirrored_value() ); + end + endfunction + + /*----------------------- SOC_IFC_REG__CPTRA_WDT_CFG SAMPLE FUNCTIONS -----------------------*/ + function void soc_ifc_reg__CPTRA_WDT_CFG::sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); + m_current = get(); + m_data = data; + m_is_read = is_read; + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(TIMEOUT_bit_cg[bt]) this.TIMEOUT_bit_cg[bt].sample(data[0 + bt]); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( data[31:0]/*TIMEOUT*/ ); + end + endfunction + + function void soc_ifc_reg__CPTRA_WDT_CFG::sample_values(); + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(TIMEOUT_bit_cg[bt]) this.TIMEOUT_bit_cg[bt].sample(TIMEOUT.get_mirrored_value() >> bt); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( TIMEOUT.get_mirrored_value() ); + end + endfunction + + /*----------------------- SOC_IFC_REG__CPTRA_ITRNG_ENTROPY_CONFIG_0 SAMPLE FUNCTIONS -----------------------*/ + function void soc_ifc_reg__CPTRA_iTRNG_ENTROPY_CONFIG_0::sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); + m_current = get(); + m_data = data; + m_is_read = is_read; + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(low_threshold_bit_cg[bt]) this.low_threshold_bit_cg[bt].sample(data[0 + bt]); + foreach(high_threshold_bit_cg[bt]) this.high_threshold_bit_cg[bt].sample(data[16 + bt]); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( data[15:0]/*low_threshold*/ , data[31:16]/*high_threshold*/ ); + end + endfunction + + function void soc_ifc_reg__CPTRA_iTRNG_ENTROPY_CONFIG_0::sample_values(); + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(low_threshold_bit_cg[bt]) this.low_threshold_bit_cg[bt].sample(low_threshold.get_mirrored_value() >> bt); + foreach(high_threshold_bit_cg[bt]) this.high_threshold_bit_cg[bt].sample(high_threshold.get_mirrored_value() >> bt); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( low_threshold.get_mirrored_value() , high_threshold.get_mirrored_value() ); + end + endfunction + + /*----------------------- SOC_IFC_REG__CPTRA_ITRNG_ENTROPY_CONFIG_1 SAMPLE FUNCTIONS -----------------------*/ + function void soc_ifc_reg__CPTRA_iTRNG_ENTROPY_CONFIG_1::sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); + m_current = get(); + m_data = data; + m_is_read = is_read; + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(repetition_count_bit_cg[bt]) this.repetition_count_bit_cg[bt].sample(data[0 + bt]); + foreach(RSVD_bit_cg[bt]) this.RSVD_bit_cg[bt].sample(data[16 + bt]); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( data[15:0]/*repetition_count*/ , data[31:16]/*RSVD*/ ); + end + endfunction + + function void soc_ifc_reg__CPTRA_iTRNG_ENTROPY_CONFIG_1::sample_values(); + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(repetition_count_bit_cg[bt]) this.repetition_count_bit_cg[bt].sample(repetition_count.get_mirrored_value() >> bt); + foreach(RSVD_bit_cg[bt]) this.RSVD_bit_cg[bt].sample(RSVD.get_mirrored_value() >> bt); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( repetition_count.get_mirrored_value() , RSVD.get_mirrored_value() ); + end + endfunction + + /*----------------------- SOC_IFC_REG__CPTRA_RSVD_REG SAMPLE FUNCTIONS -----------------------*/ + function void soc_ifc_reg__CPTRA_RSVD_REG::sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); + m_current = get(); + m_data = data; + m_is_read = is_read; + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(RSVD_bit_cg[bt]) this.RSVD_bit_cg[bt].sample(data[0 + bt]); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( data[31:0]/*RSVD*/ ); + end + endfunction + + function void soc_ifc_reg__CPTRA_RSVD_REG::sample_values(); + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(RSVD_bit_cg[bt]) this.RSVD_bit_cg[bt].sample(RSVD.get_mirrored_value() >> bt); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( RSVD.get_mirrored_value() ); + end + endfunction + + /*----------------------- SOC_IFC_REG__FUSE_UDS_SEED SAMPLE FUNCTIONS -----------------------*/ + function void soc_ifc_reg__fuse_uds_seed::sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); + m_current = get(); + m_data = data; + m_is_read = is_read; + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(seed_bit_cg[bt]) this.seed_bit_cg[bt].sample(data[0 + bt]); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( data[31:0]/*seed*/ ); + end + endfunction + + function void soc_ifc_reg__fuse_uds_seed::sample_values(); + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(seed_bit_cg[bt]) this.seed_bit_cg[bt].sample(seed.get_mirrored_value() >> bt); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( seed.get_mirrored_value() ); + end + endfunction + + /*----------------------- SOC_IFC_REG__FUSE_FIELD_ENTROPY SAMPLE FUNCTIONS -----------------------*/ + function void soc_ifc_reg__fuse_field_entropy::sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); + m_current = get(); + m_data = data; + m_is_read = is_read; + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(seed_bit_cg[bt]) this.seed_bit_cg[bt].sample(data[0 + bt]); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( data[31:0]/*seed*/ ); + end + endfunction + + function void soc_ifc_reg__fuse_field_entropy::sample_values(); + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(seed_bit_cg[bt]) this.seed_bit_cg[bt].sample(seed.get_mirrored_value() >> bt); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( seed.get_mirrored_value() ); + end + endfunction + + /*----------------------- SOC_IFC_REG__FUSE_KEY_MANIFEST_PK_HASH SAMPLE FUNCTIONS -----------------------*/ + function void soc_ifc_reg__fuse_key_manifest_pk_hash::sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); + m_current = get(); + m_data = data; + m_is_read = is_read; + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(hash_bit_cg[bt]) this.hash_bit_cg[bt].sample(data[0 + bt]); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( data[31:0]/*hash*/ ); + end + endfunction + + function void soc_ifc_reg__fuse_key_manifest_pk_hash::sample_values(); + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(hash_bit_cg[bt]) this.hash_bit_cg[bt].sample(hash.get_mirrored_value() >> bt); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( hash.get_mirrored_value() ); + end + endfunction + + /*----------------------- SOC_IFC_REG__FUSE_KEY_MANIFEST_PK_HASH_MASK SAMPLE FUNCTIONS -----------------------*/ + function void soc_ifc_reg__fuse_key_manifest_pk_hash_mask::sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); + m_current = get(); + m_data = data; + m_is_read = is_read; + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(mask_bit_cg[bt]) this.mask_bit_cg[bt].sample(data[0 + bt]); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( data[3:0]/*mask*/ ); + end + endfunction + + function void soc_ifc_reg__fuse_key_manifest_pk_hash_mask::sample_values(); + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(mask_bit_cg[bt]) this.mask_bit_cg[bt].sample(mask.get_mirrored_value() >> bt); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( mask.get_mirrored_value() ); + end + endfunction + + /*----------------------- SOC_IFC_REG__FUSE_OWNER_PK_HASH SAMPLE FUNCTIONS -----------------------*/ + function void soc_ifc_reg__fuse_owner_pk_hash::sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); + m_current = get(); + m_data = data; + m_is_read = is_read; + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(hash_bit_cg[bt]) this.hash_bit_cg[bt].sample(data[0 + bt]); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( data[31:0]/*hash*/ ); + end + endfunction + + function void soc_ifc_reg__fuse_owner_pk_hash::sample_values(); + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(hash_bit_cg[bt]) this.hash_bit_cg[bt].sample(hash.get_mirrored_value() >> bt); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( hash.get_mirrored_value() ); + end + endfunction + + /*----------------------- SOC_IFC_REG__FUSE_FMC_KEY_MANIFEST_SVN SAMPLE FUNCTIONS -----------------------*/ + function void soc_ifc_reg__fuse_fmc_key_manifest_svn::sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); + m_current = get(); + m_data = data; + m_is_read = is_read; + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(svn_bit_cg[bt]) this.svn_bit_cg[bt].sample(data[0 + bt]); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( data[31:0]/*svn*/ ); + end + endfunction + + function void soc_ifc_reg__fuse_fmc_key_manifest_svn::sample_values(); + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(svn_bit_cg[bt]) this.svn_bit_cg[bt].sample(svn.get_mirrored_value() >> bt); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( svn.get_mirrored_value() ); + end + endfunction + + /*----------------------- SOC_IFC_REG__FUSE_RUNTIME_SVN SAMPLE FUNCTIONS -----------------------*/ + function void soc_ifc_reg__fuse_runtime_svn::sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); + m_current = get(); + m_data = data; + m_is_read = is_read; + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(svn_bit_cg[bt]) this.svn_bit_cg[bt].sample(data[0 + bt]); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( data[31:0]/*svn*/ ); + end + endfunction + + function void soc_ifc_reg__fuse_runtime_svn::sample_values(); + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(svn_bit_cg[bt]) this.svn_bit_cg[bt].sample(svn.get_mirrored_value() >> bt); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( svn.get_mirrored_value() ); + end + endfunction + + /*----------------------- SOC_IFC_REG__FUSE_ANTI_ROLLBACK_DISABLE SAMPLE FUNCTIONS -----------------------*/ + function void soc_ifc_reg__fuse_anti_rollback_disable::sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); + m_current = get(); + m_data = data; + m_is_read = is_read; + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(dis_bit_cg[bt]) this.dis_bit_cg[bt].sample(data[0 + bt]); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( data[0:0]/*dis*/ ); + end + endfunction + + function void soc_ifc_reg__fuse_anti_rollback_disable::sample_values(); + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(dis_bit_cg[bt]) this.dis_bit_cg[bt].sample(dis.get_mirrored_value() >> bt); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( dis.get_mirrored_value() ); + end + endfunction + + /*----------------------- SOC_IFC_REG__FUSE_IDEVID_CERT_ATTR SAMPLE FUNCTIONS -----------------------*/ + function void soc_ifc_reg__fuse_idevid_cert_attr::sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); + m_current = get(); + m_data = data; + m_is_read = is_read; + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(cert_bit_cg[bt]) this.cert_bit_cg[bt].sample(data[0 + bt]); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( data[31:0]/*cert*/ ); + end + endfunction + + function void soc_ifc_reg__fuse_idevid_cert_attr::sample_values(); + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(cert_bit_cg[bt]) this.cert_bit_cg[bt].sample(cert.get_mirrored_value() >> bt); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( cert.get_mirrored_value() ); + end + endfunction + + /*----------------------- SOC_IFC_REG__FUSE_IDEVID_MANUF_HSM_ID SAMPLE FUNCTIONS -----------------------*/ + function void soc_ifc_reg__fuse_idevid_manuf_hsm_id::sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); + m_current = get(); + m_data = data; + m_is_read = is_read; + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(hsm_id_bit_cg[bt]) this.hsm_id_bit_cg[bt].sample(data[0 + bt]); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( data[31:0]/*hsm_id*/ ); + end + endfunction + + function void soc_ifc_reg__fuse_idevid_manuf_hsm_id::sample_values(); + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(hsm_id_bit_cg[bt]) this.hsm_id_bit_cg[bt].sample(hsm_id.get_mirrored_value() >> bt); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( hsm_id.get_mirrored_value() ); + end + endfunction + + /*----------------------- SOC_IFC_REG__FUSE_LIFE_CYCLE SAMPLE FUNCTIONS -----------------------*/ + function void soc_ifc_reg__fuse_life_cycle::sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); + m_current = get(); + m_data = data; + m_is_read = is_read; + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(life_cycle_bit_cg[bt]) this.life_cycle_bit_cg[bt].sample(data[0 + bt]); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( data[1:0]/*life_cycle*/ ); + end + endfunction + + function void soc_ifc_reg__fuse_life_cycle::sample_values(); + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(life_cycle_bit_cg[bt]) this.life_cycle_bit_cg[bt].sample(life_cycle.get_mirrored_value() >> bt); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( life_cycle.get_mirrored_value() ); + end + endfunction + + /*----------------------- SOC_IFC_REG__FUSE_LMS_VERIFY SAMPLE FUNCTIONS -----------------------*/ + function void soc_ifc_reg__fuse_lms_verify::sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); + m_current = get(); + m_data = data; + m_is_read = is_read; + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(lms_verify_bit_cg[bt]) this.lms_verify_bit_cg[bt].sample(data[0 + bt]); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( data[0:0]/*lms_verify*/ ); + end + endfunction + + function void soc_ifc_reg__fuse_lms_verify::sample_values(); + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(lms_verify_bit_cg[bt]) this.lms_verify_bit_cg[bt].sample(lms_verify.get_mirrored_value() >> bt); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( lms_verify.get_mirrored_value() ); + end + endfunction + + /*----------------------- SOC_IFC_REG__FUSE_LMS_REVOCATION SAMPLE FUNCTIONS -----------------------*/ + function void soc_ifc_reg__fuse_lms_revocation::sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); + m_current = get(); + m_data = data; + m_is_read = is_read; + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(lms_revocation_bit_cg[bt]) this.lms_revocation_bit_cg[bt].sample(data[0 + bt]); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( data[31:0]/*lms_revocation*/ ); + end + endfunction + + function void soc_ifc_reg__fuse_lms_revocation::sample_values(); + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(lms_revocation_bit_cg[bt]) this.lms_revocation_bit_cg[bt].sample(lms_revocation.get_mirrored_value() >> bt); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( lms_revocation.get_mirrored_value() ); + end + endfunction + + /*----------------------- SOC_IFC_REG__FUSE_SOC_STEPPING_ID SAMPLE FUNCTIONS -----------------------*/ + function void soc_ifc_reg__fuse_soc_stepping_id::sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); + m_current = get(); + m_data = data; + m_is_read = is_read; + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(soc_stepping_id_bit_cg[bt]) this.soc_stepping_id_bit_cg[bt].sample(data[0 + bt]); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( data[15:0]/*soc_stepping_id*/ ); + end + endfunction + + function void soc_ifc_reg__fuse_soc_stepping_id::sample_values(); + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(soc_stepping_id_bit_cg[bt]) this.soc_stepping_id_bit_cg[bt].sample(soc_stepping_id.get_mirrored_value() >> bt); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( soc_stepping_id.get_mirrored_value() ); + end + endfunction + + /*----------------------- SOC_IFC_REG__INTERNAL_OBF_KEY SAMPLE FUNCTIONS -----------------------*/ + function void soc_ifc_reg__internal_obf_key::sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); + m_current = get(); + m_data = data; + m_is_read = is_read; + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(key_bit_cg[bt]) this.key_bit_cg[bt].sample(data[0 + bt]); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( data[31:0]/*key*/ ); + end + endfunction + + function void soc_ifc_reg__internal_obf_key::sample_values(); + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(key_bit_cg[bt]) this.key_bit_cg[bt].sample(key.get_mirrored_value() >> bt); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( key.get_mirrored_value() ); + end + endfunction + + /*----------------------- SOC_IFC_REG__INTERNAL_ICCM_LOCK SAMPLE FUNCTIONS -----------------------*/ + function void soc_ifc_reg__internal_iccm_lock::sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); + m_current = get(); + m_data = data; + m_is_read = is_read; + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(lock_bit_cg[bt]) this.lock_bit_cg[bt].sample(data[0 + bt]); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( data[0:0]/*lock*/ ); + end + endfunction + + function void soc_ifc_reg__internal_iccm_lock::sample_values(); + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(lock_bit_cg[bt]) this.lock_bit_cg[bt].sample(lock.get_mirrored_value() >> bt); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( lock.get_mirrored_value() ); + end + endfunction + + /*----------------------- SOC_IFC_REG__INTERNAL_FW_UPDATE_RESET SAMPLE FUNCTIONS -----------------------*/ + function void soc_ifc_reg__internal_fw_update_reset::sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); + m_current = get(); + m_data = data; + m_is_read = is_read; + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(core_rst_bit_cg[bt]) this.core_rst_bit_cg[bt].sample(data[0 + bt]); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( data[0:0]/*core_rst*/ ); + end + endfunction + + function void soc_ifc_reg__internal_fw_update_reset::sample_values(); + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(core_rst_bit_cg[bt]) this.core_rst_bit_cg[bt].sample(core_rst.get_mirrored_value() >> bt); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( core_rst.get_mirrored_value() ); + end + endfunction + + /*----------------------- SOC_IFC_REG__INTERNAL_FW_UPDATE_RESET_WAIT_CYCLES SAMPLE FUNCTIONS -----------------------*/ + function void soc_ifc_reg__internal_fw_update_reset_wait_cycles::sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); + m_current = get(); + m_data = data; + m_is_read = is_read; + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(wait_cycles_bit_cg[bt]) this.wait_cycles_bit_cg[bt].sample(data[0 + bt]); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( data[7:0]/*wait_cycles*/ ); + end + endfunction + + function void soc_ifc_reg__internal_fw_update_reset_wait_cycles::sample_values(); + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(wait_cycles_bit_cg[bt]) this.wait_cycles_bit_cg[bt].sample(wait_cycles.get_mirrored_value() >> bt); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( wait_cycles.get_mirrored_value() ); + end + endfunction + + /*----------------------- SOC_IFC_REG__INTERNAL_NMI_VECTOR SAMPLE FUNCTIONS -----------------------*/ + function void soc_ifc_reg__internal_nmi_vector::sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); + m_current = get(); + m_data = data; + m_is_read = is_read; + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(vec_bit_cg[bt]) this.vec_bit_cg[bt].sample(data[0 + bt]); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( data[31:0]/*vec*/ ); + end + endfunction + + function void soc_ifc_reg__internal_nmi_vector::sample_values(); + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(vec_bit_cg[bt]) this.vec_bit_cg[bt].sample(vec.get_mirrored_value() >> bt); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( vec.get_mirrored_value() ); + end + endfunction + + /*----------------------- SOC_IFC_REG__INTERNAL_HW_ERROR_FATAL_MASK SAMPLE FUNCTIONS -----------------------*/ + function void soc_ifc_reg__internal_hw_error_fatal_mask::sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); + m_current = get(); + m_data = data; + m_is_read = is_read; + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(mask_iccm_ecc_unc_bit_cg[bt]) this.mask_iccm_ecc_unc_bit_cg[bt].sample(data[0 + bt]); + foreach(mask_dccm_ecc_unc_bit_cg[bt]) this.mask_dccm_ecc_unc_bit_cg[bt].sample(data[1 + bt]); + foreach(mask_nmi_pin_bit_cg[bt]) this.mask_nmi_pin_bit_cg[bt].sample(data[2 + bt]); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( data[0:0]/*mask_iccm_ecc_unc*/ , data[1:1]/*mask_dccm_ecc_unc*/ , data[2:2]/*mask_nmi_pin*/ ); + end + endfunction + + function void soc_ifc_reg__internal_hw_error_fatal_mask::sample_values(); + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(mask_iccm_ecc_unc_bit_cg[bt]) this.mask_iccm_ecc_unc_bit_cg[bt].sample(mask_iccm_ecc_unc.get_mirrored_value() >> bt); + foreach(mask_dccm_ecc_unc_bit_cg[bt]) this.mask_dccm_ecc_unc_bit_cg[bt].sample(mask_dccm_ecc_unc.get_mirrored_value() >> bt); + foreach(mask_nmi_pin_bit_cg[bt]) this.mask_nmi_pin_bit_cg[bt].sample(mask_nmi_pin.get_mirrored_value() >> bt); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( mask_iccm_ecc_unc.get_mirrored_value() , mask_dccm_ecc_unc.get_mirrored_value() , mask_nmi_pin.get_mirrored_value() ); + end + endfunction + + /*----------------------- SOC_IFC_REG__INTERNAL_HW_ERROR_NON_FATAL_MASK SAMPLE FUNCTIONS -----------------------*/ + function void soc_ifc_reg__internal_hw_error_non_fatal_mask::sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); + m_current = get(); + m_data = data; + m_is_read = is_read; + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(mask_mbox_prot_no_lock_bit_cg[bt]) this.mask_mbox_prot_no_lock_bit_cg[bt].sample(data[0 + bt]); + foreach(mask_mbox_prot_ooo_bit_cg[bt]) this.mask_mbox_prot_ooo_bit_cg[bt].sample(data[1 + bt]); + foreach(mask_mbox_ecc_unc_bit_cg[bt]) this.mask_mbox_ecc_unc_bit_cg[bt].sample(data[2 + bt]); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( data[0:0]/*mask_mbox_prot_no_lock*/ , data[1:1]/*mask_mbox_prot_ooo*/ , data[2:2]/*mask_mbox_ecc_unc*/ ); + end + endfunction + + function void soc_ifc_reg__internal_hw_error_non_fatal_mask::sample_values(); + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(mask_mbox_prot_no_lock_bit_cg[bt]) this.mask_mbox_prot_no_lock_bit_cg[bt].sample(mask_mbox_prot_no_lock.get_mirrored_value() >> bt); + foreach(mask_mbox_prot_ooo_bit_cg[bt]) this.mask_mbox_prot_ooo_bit_cg[bt].sample(mask_mbox_prot_ooo.get_mirrored_value() >> bt); + foreach(mask_mbox_ecc_unc_bit_cg[bt]) this.mask_mbox_ecc_unc_bit_cg[bt].sample(mask_mbox_ecc_unc.get_mirrored_value() >> bt); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( mask_mbox_prot_no_lock.get_mirrored_value() , mask_mbox_prot_ooo.get_mirrored_value() , mask_mbox_ecc_unc.get_mirrored_value() ); + end + endfunction + + /*----------------------- SOC_IFC_REG__INTERNAL_FW_ERROR_FATAL_MASK SAMPLE FUNCTIONS -----------------------*/ + function void soc_ifc_reg__internal_fw_error_fatal_mask::sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); + m_current = get(); + m_data = data; + m_is_read = is_read; + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(mask_bit_cg[bt]) this.mask_bit_cg[bt].sample(data[0 + bt]); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( data[31:0]/*mask*/ ); + end + endfunction + + function void soc_ifc_reg__internal_fw_error_fatal_mask::sample_values(); + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(mask_bit_cg[bt]) this.mask_bit_cg[bt].sample(mask.get_mirrored_value() >> bt); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( mask.get_mirrored_value() ); + end + endfunction + + /*----------------------- SOC_IFC_REG__INTERNAL_FW_ERROR_NON_FATAL_MASK SAMPLE FUNCTIONS -----------------------*/ + function void soc_ifc_reg__internal_fw_error_non_fatal_mask::sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); + m_current = get(); + m_data = data; + m_is_read = is_read; + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(mask_bit_cg[bt]) this.mask_bit_cg[bt].sample(data[0 + bt]); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( data[31:0]/*mask*/ ); + end + endfunction + + function void soc_ifc_reg__internal_fw_error_non_fatal_mask::sample_values(); + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(mask_bit_cg[bt]) this.mask_bit_cg[bt].sample(mask.get_mirrored_value() >> bt); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( mask.get_mirrored_value() ); + end + endfunction + + /*----------------------- SOC_IFC_REG__INTERNAL_RV_MTIME_L SAMPLE FUNCTIONS -----------------------*/ + function void soc_ifc_reg__internal_rv_mtime_l::sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); + m_current = get(); + m_data = data; + m_is_read = is_read; + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(count_l_bit_cg[bt]) this.count_l_bit_cg[bt].sample(data[0 + bt]); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( data[31:0]/*count_l*/ ); + end + endfunction + + function void soc_ifc_reg__internal_rv_mtime_l::sample_values(); + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(count_l_bit_cg[bt]) this.count_l_bit_cg[bt].sample(count_l.get_mirrored_value() >> bt); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( count_l.get_mirrored_value() ); + end + endfunction + + /*----------------------- SOC_IFC_REG__INTERNAL_RV_MTIME_H SAMPLE FUNCTIONS -----------------------*/ + function void soc_ifc_reg__internal_rv_mtime_h::sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); + m_current = get(); + m_data = data; + m_is_read = is_read; + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(count_h_bit_cg[bt]) this.count_h_bit_cg[bt].sample(data[0 + bt]); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( data[31:0]/*count_h*/ ); + end + endfunction + + function void soc_ifc_reg__internal_rv_mtime_h::sample_values(); + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(count_h_bit_cg[bt]) this.count_h_bit_cg[bt].sample(count_h.get_mirrored_value() >> bt); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( count_h.get_mirrored_value() ); + end + endfunction + + /*----------------------- SOC_IFC_REG__INTERNAL_RV_MTIMECMP_L SAMPLE FUNCTIONS -----------------------*/ + function void soc_ifc_reg__internal_rv_mtimecmp_l::sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); + m_current = get(); + m_data = data; + m_is_read = is_read; + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(compare_l_bit_cg[bt]) this.compare_l_bit_cg[bt].sample(data[0 + bt]); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( data[31:0]/*compare_l*/ ); + end + endfunction + + function void soc_ifc_reg__internal_rv_mtimecmp_l::sample_values(); + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(compare_l_bit_cg[bt]) this.compare_l_bit_cg[bt].sample(compare_l.get_mirrored_value() >> bt); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( compare_l.get_mirrored_value() ); + end + endfunction + + /*----------------------- SOC_IFC_REG__INTERNAL_RV_MTIMECMP_H SAMPLE FUNCTIONS -----------------------*/ + function void soc_ifc_reg__internal_rv_mtimecmp_h::sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); + m_current = get(); + m_data = data; + m_is_read = is_read; + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(compare_h_bit_cg[bt]) this.compare_h_bit_cg[bt].sample(data[0 + bt]); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( data[31:0]/*compare_h*/ ); + end + endfunction + + function void soc_ifc_reg__internal_rv_mtimecmp_h::sample_values(); + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(compare_h_bit_cg[bt]) this.compare_h_bit_cg[bt].sample(compare_h.get_mirrored_value() >> bt); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( compare_h.get_mirrored_value() ); + end + endfunction + + /*----------------------- SOC_IFC_REG__INTR_BLOCK_T__GLOBAL_INTR_EN_T SAMPLE FUNCTIONS -----------------------*/ + function void soc_ifc_reg__intr_block_t__global_intr_en_t::sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); + m_current = get(); + m_data = data; + m_is_read = is_read; + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(error_en_bit_cg[bt]) this.error_en_bit_cg[bt].sample(data[0 + bt]); + foreach(notif_en_bit_cg[bt]) this.notif_en_bit_cg[bt].sample(data[1 + bt]); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( data[0:0]/*error_en*/ , data[1:1]/*notif_en*/ ); + end + endfunction + + function void soc_ifc_reg__intr_block_t__global_intr_en_t::sample_values(); + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(error_en_bit_cg[bt]) this.error_en_bit_cg[bt].sample(error_en.get_mirrored_value() >> bt); + foreach(notif_en_bit_cg[bt]) this.notif_en_bit_cg[bt].sample(notif_en.get_mirrored_value() >> bt); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( error_en.get_mirrored_value() , notif_en.get_mirrored_value() ); + end + endfunction + + /*----------------------- SOC_IFC_REG__INTR_BLOCK_T__ERROR_INTR_EN_T SAMPLE FUNCTIONS -----------------------*/ + function void soc_ifc_reg__intr_block_t__error_intr_en_t::sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); + m_current = get(); + m_data = data; + m_is_read = is_read; + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(error_internal_en_bit_cg[bt]) this.error_internal_en_bit_cg[bt].sample(data[0 + bt]); + foreach(error_inv_dev_en_bit_cg[bt]) this.error_inv_dev_en_bit_cg[bt].sample(data[1 + bt]); + foreach(error_cmd_fail_en_bit_cg[bt]) this.error_cmd_fail_en_bit_cg[bt].sample(data[2 + bt]); + foreach(error_bad_fuse_en_bit_cg[bt]) this.error_bad_fuse_en_bit_cg[bt].sample(data[3 + bt]); + foreach(error_iccm_blocked_en_bit_cg[bt]) this.error_iccm_blocked_en_bit_cg[bt].sample(data[4 + bt]); + foreach(error_mbox_ecc_unc_en_bit_cg[bt]) this.error_mbox_ecc_unc_en_bit_cg[bt].sample(data[5 + bt]); + foreach(error_wdt_timer1_timeout_en_bit_cg[bt]) this.error_wdt_timer1_timeout_en_bit_cg[bt].sample(data[6 + bt]); + foreach(error_wdt_timer2_timeout_en_bit_cg[bt]) this.error_wdt_timer2_timeout_en_bit_cg[bt].sample(data[7 + bt]); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( data[0:0]/*error_internal_en*/ , data[1:1]/*error_inv_dev_en*/ , data[2:2]/*error_cmd_fail_en*/ , data[3:3]/*error_bad_fuse_en*/ , data[4:4]/*error_iccm_blocked_en*/ , data[5:5]/*error_mbox_ecc_unc_en*/ , data[6:6]/*error_wdt_timer1_timeout_en*/ , data[7:7]/*error_wdt_timer2_timeout_en*/ ); + end + endfunction + + function void soc_ifc_reg__intr_block_t__error_intr_en_t::sample_values(); + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(error_internal_en_bit_cg[bt]) this.error_internal_en_bit_cg[bt].sample(error_internal_en.get_mirrored_value() >> bt); + foreach(error_inv_dev_en_bit_cg[bt]) this.error_inv_dev_en_bit_cg[bt].sample(error_inv_dev_en.get_mirrored_value() >> bt); + foreach(error_cmd_fail_en_bit_cg[bt]) this.error_cmd_fail_en_bit_cg[bt].sample(error_cmd_fail_en.get_mirrored_value() >> bt); + foreach(error_bad_fuse_en_bit_cg[bt]) this.error_bad_fuse_en_bit_cg[bt].sample(error_bad_fuse_en.get_mirrored_value() >> bt); + foreach(error_iccm_blocked_en_bit_cg[bt]) this.error_iccm_blocked_en_bit_cg[bt].sample(error_iccm_blocked_en.get_mirrored_value() >> bt); + foreach(error_mbox_ecc_unc_en_bit_cg[bt]) this.error_mbox_ecc_unc_en_bit_cg[bt].sample(error_mbox_ecc_unc_en.get_mirrored_value() >> bt); + foreach(error_wdt_timer1_timeout_en_bit_cg[bt]) this.error_wdt_timer1_timeout_en_bit_cg[bt].sample(error_wdt_timer1_timeout_en.get_mirrored_value() >> bt); + foreach(error_wdt_timer2_timeout_en_bit_cg[bt]) this.error_wdt_timer2_timeout_en_bit_cg[bt].sample(error_wdt_timer2_timeout_en.get_mirrored_value() >> bt); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( error_internal_en.get_mirrored_value() , error_inv_dev_en.get_mirrored_value() , error_cmd_fail_en.get_mirrored_value() , error_bad_fuse_en.get_mirrored_value() , error_iccm_blocked_en.get_mirrored_value() , error_mbox_ecc_unc_en.get_mirrored_value() , error_wdt_timer1_timeout_en.get_mirrored_value() , error_wdt_timer2_timeout_en.get_mirrored_value() ); + end + endfunction + + /*----------------------- SOC_IFC_REG__INTR_BLOCK_T__NOTIF_INTR_EN_T SAMPLE FUNCTIONS -----------------------*/ + function void soc_ifc_reg__intr_block_t__notif_intr_en_t::sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); + m_current = get(); + m_data = data; + m_is_read = is_read; + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(notif_cmd_avail_en_bit_cg[bt]) this.notif_cmd_avail_en_bit_cg[bt].sample(data[0 + bt]); + foreach(notif_mbox_ecc_cor_en_bit_cg[bt]) this.notif_mbox_ecc_cor_en_bit_cg[bt].sample(data[1 + bt]); + foreach(notif_debug_locked_en_bit_cg[bt]) this.notif_debug_locked_en_bit_cg[bt].sample(data[2 + bt]); + foreach(notif_scan_mode_en_bit_cg[bt]) this.notif_scan_mode_en_bit_cg[bt].sample(data[3 + bt]); + foreach(notif_soc_req_lock_en_bit_cg[bt]) this.notif_soc_req_lock_en_bit_cg[bt].sample(data[4 + bt]); + foreach(notif_gen_in_toggle_en_bit_cg[bt]) this.notif_gen_in_toggle_en_bit_cg[bt].sample(data[5 + bt]); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( data[0:0]/*notif_cmd_avail_en*/ , data[1:1]/*notif_mbox_ecc_cor_en*/ , data[2:2]/*notif_debug_locked_en*/ , data[3:3]/*notif_scan_mode_en*/ , data[4:4]/*notif_soc_req_lock_en*/ , data[5:5]/*notif_gen_in_toggle_en*/ ); + end + endfunction + + function void soc_ifc_reg__intr_block_t__notif_intr_en_t::sample_values(); + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(notif_cmd_avail_en_bit_cg[bt]) this.notif_cmd_avail_en_bit_cg[bt].sample(notif_cmd_avail_en.get_mirrored_value() >> bt); + foreach(notif_mbox_ecc_cor_en_bit_cg[bt]) this.notif_mbox_ecc_cor_en_bit_cg[bt].sample(notif_mbox_ecc_cor_en.get_mirrored_value() >> bt); + foreach(notif_debug_locked_en_bit_cg[bt]) this.notif_debug_locked_en_bit_cg[bt].sample(notif_debug_locked_en.get_mirrored_value() >> bt); + foreach(notif_scan_mode_en_bit_cg[bt]) this.notif_scan_mode_en_bit_cg[bt].sample(notif_scan_mode_en.get_mirrored_value() >> bt); + foreach(notif_soc_req_lock_en_bit_cg[bt]) this.notif_soc_req_lock_en_bit_cg[bt].sample(notif_soc_req_lock_en.get_mirrored_value() >> bt); + foreach(notif_gen_in_toggle_en_bit_cg[bt]) this.notif_gen_in_toggle_en_bit_cg[bt].sample(notif_gen_in_toggle_en.get_mirrored_value() >> bt); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( notif_cmd_avail_en.get_mirrored_value() , notif_mbox_ecc_cor_en.get_mirrored_value() , notif_debug_locked_en.get_mirrored_value() , notif_scan_mode_en.get_mirrored_value() , notif_soc_req_lock_en.get_mirrored_value() , notif_gen_in_toggle_en.get_mirrored_value() ); + end + endfunction + + /*----------------------- SOC_IFC_REG__INTR_BLOCK_T__GLOBAL_INTR_T_AGG_STS_DD3DCF0A SAMPLE FUNCTIONS -----------------------*/ + function void soc_ifc_reg__intr_block_t__global_intr_t_agg_sts_dd3dcf0a::sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); + m_current = get(); + m_data = data; + m_is_read = is_read; + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(agg_sts_bit_cg[bt]) this.agg_sts_bit_cg[bt].sample(data[0 + bt]); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( data[0:0]/*agg_sts*/ ); + end + endfunction + + function void soc_ifc_reg__intr_block_t__global_intr_t_agg_sts_dd3dcf0a::sample_values(); + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(agg_sts_bit_cg[bt]) this.agg_sts_bit_cg[bt].sample(agg_sts.get_mirrored_value() >> bt); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( agg_sts.get_mirrored_value() ); + end + endfunction + + /*----------------------- SOC_IFC_REG__INTR_BLOCK_T__GLOBAL_INTR_T_AGG_STS_E6399B4A SAMPLE FUNCTIONS -----------------------*/ + function void soc_ifc_reg__intr_block_t__global_intr_t_agg_sts_e6399b4a::sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); + m_current = get(); + m_data = data; + m_is_read = is_read; + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(agg_sts_bit_cg[bt]) this.agg_sts_bit_cg[bt].sample(data[0 + bt]); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( data[0:0]/*agg_sts*/ ); + end + endfunction + + function void soc_ifc_reg__intr_block_t__global_intr_t_agg_sts_e6399b4a::sample_values(); + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(agg_sts_bit_cg[bt]) this.agg_sts_bit_cg[bt].sample(agg_sts.get_mirrored_value() >> bt); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( agg_sts.get_mirrored_value() ); + end + endfunction + + /*----------------------- SOC_IFC_REG__INTR_BLOCK_T__ERROR_INTR_T_ERROR_BAD_FUSE_STS_23F67582_ERROR_CMD_FAIL_STS_B85845F8_ERROR_ICCM_BLOCKED_STS_E81E6AD2_ERROR_INTERNAL_STS_CAAD62E2_ERROR_INV_DEV_STS_6693E7DB_ERROR_MBOX_ECC_UNC_STS_30BFF330_ERROR_WDT_TIMER1_TIMEOUT_STS_6AAA9655_ERROR_WDT_TIMER2_TIMEOUT_STS_CDA8789F SAMPLE FUNCTIONS -----------------------*/ + function void soc_ifc_reg__intr_block_t__error_intr_t_error_bad_fuse_sts_23f67582_error_cmd_fail_sts_b85845f8_error_iccm_blocked_sts_e81e6ad2_error_internal_sts_caad62e2_error_inv_dev_sts_6693e7db_error_mbox_ecc_unc_sts_30bff330_error_wdt_timer1_timeout_sts_6aaa9655_error_wdt_timer2_timeout_sts_cda8789f::sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); + m_current = get(); + m_data = data; + m_is_read = is_read; + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(error_internal_sts_bit_cg[bt]) this.error_internal_sts_bit_cg[bt].sample(data[0 + bt]); + foreach(error_inv_dev_sts_bit_cg[bt]) this.error_inv_dev_sts_bit_cg[bt].sample(data[1 + bt]); + foreach(error_cmd_fail_sts_bit_cg[bt]) this.error_cmd_fail_sts_bit_cg[bt].sample(data[2 + bt]); + foreach(error_bad_fuse_sts_bit_cg[bt]) this.error_bad_fuse_sts_bit_cg[bt].sample(data[3 + bt]); + foreach(error_iccm_blocked_sts_bit_cg[bt]) this.error_iccm_blocked_sts_bit_cg[bt].sample(data[4 + bt]); + foreach(error_mbox_ecc_unc_sts_bit_cg[bt]) this.error_mbox_ecc_unc_sts_bit_cg[bt].sample(data[5 + bt]); + foreach(error_wdt_timer1_timeout_sts_bit_cg[bt]) this.error_wdt_timer1_timeout_sts_bit_cg[bt].sample(data[6 + bt]); + foreach(error_wdt_timer2_timeout_sts_bit_cg[bt]) this.error_wdt_timer2_timeout_sts_bit_cg[bt].sample(data[7 + bt]); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( data[0:0]/*error_internal_sts*/ , data[1:1]/*error_inv_dev_sts*/ , data[2:2]/*error_cmd_fail_sts*/ , data[3:3]/*error_bad_fuse_sts*/ , data[4:4]/*error_iccm_blocked_sts*/ , data[5:5]/*error_mbox_ecc_unc_sts*/ , data[6:6]/*error_wdt_timer1_timeout_sts*/ , data[7:7]/*error_wdt_timer2_timeout_sts*/ ); + end + endfunction + + function void soc_ifc_reg__intr_block_t__error_intr_t_error_bad_fuse_sts_23f67582_error_cmd_fail_sts_b85845f8_error_iccm_blocked_sts_e81e6ad2_error_internal_sts_caad62e2_error_inv_dev_sts_6693e7db_error_mbox_ecc_unc_sts_30bff330_error_wdt_timer1_timeout_sts_6aaa9655_error_wdt_timer2_timeout_sts_cda8789f::sample_values(); + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(error_internal_sts_bit_cg[bt]) this.error_internal_sts_bit_cg[bt].sample(error_internal_sts.get_mirrored_value() >> bt); + foreach(error_inv_dev_sts_bit_cg[bt]) this.error_inv_dev_sts_bit_cg[bt].sample(error_inv_dev_sts.get_mirrored_value() >> bt); + foreach(error_cmd_fail_sts_bit_cg[bt]) this.error_cmd_fail_sts_bit_cg[bt].sample(error_cmd_fail_sts.get_mirrored_value() >> bt); + foreach(error_bad_fuse_sts_bit_cg[bt]) this.error_bad_fuse_sts_bit_cg[bt].sample(error_bad_fuse_sts.get_mirrored_value() >> bt); + foreach(error_iccm_blocked_sts_bit_cg[bt]) this.error_iccm_blocked_sts_bit_cg[bt].sample(error_iccm_blocked_sts.get_mirrored_value() >> bt); + foreach(error_mbox_ecc_unc_sts_bit_cg[bt]) this.error_mbox_ecc_unc_sts_bit_cg[bt].sample(error_mbox_ecc_unc_sts.get_mirrored_value() >> bt); + foreach(error_wdt_timer1_timeout_sts_bit_cg[bt]) this.error_wdt_timer1_timeout_sts_bit_cg[bt].sample(error_wdt_timer1_timeout_sts.get_mirrored_value() >> bt); + foreach(error_wdt_timer2_timeout_sts_bit_cg[bt]) this.error_wdt_timer2_timeout_sts_bit_cg[bt].sample(error_wdt_timer2_timeout_sts.get_mirrored_value() >> bt); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( error_internal_sts.get_mirrored_value() , error_inv_dev_sts.get_mirrored_value() , error_cmd_fail_sts.get_mirrored_value() , error_bad_fuse_sts.get_mirrored_value() , error_iccm_blocked_sts.get_mirrored_value() , error_mbox_ecc_unc_sts.get_mirrored_value() , error_wdt_timer1_timeout_sts.get_mirrored_value() , error_wdt_timer2_timeout_sts.get_mirrored_value() ); + end + endfunction + + /*----------------------- SOC_IFC_REG__INTR_BLOCK_T__NOTIF_INTR_T_NOTIF_CMD_AVAIL_STS_1871606B_NOTIF_DEBUG_LOCKED_STS_5F024102_NOTIF_GEN_IN_TOGGLE_STS_59F84B64_NOTIF_MBOX_ECC_COR_STS_5C3D26BB_NOTIF_SCAN_MODE_STS_122F6367_NOTIF_SOC_REQ_LOCK_STS_DEDDDE70 SAMPLE FUNCTIONS -----------------------*/ + function void soc_ifc_reg__intr_block_t__notif_intr_t_notif_cmd_avail_sts_1871606b_notif_debug_locked_sts_5f024102_notif_gen_in_toggle_sts_59f84b64_notif_mbox_ecc_cor_sts_5c3d26bb_notif_scan_mode_sts_122f6367_notif_soc_req_lock_sts_deddde70::sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); + m_current = get(); + m_data = data; + m_is_read = is_read; + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(notif_cmd_avail_sts_bit_cg[bt]) this.notif_cmd_avail_sts_bit_cg[bt].sample(data[0 + bt]); + foreach(notif_mbox_ecc_cor_sts_bit_cg[bt]) this.notif_mbox_ecc_cor_sts_bit_cg[bt].sample(data[1 + bt]); + foreach(notif_debug_locked_sts_bit_cg[bt]) this.notif_debug_locked_sts_bit_cg[bt].sample(data[2 + bt]); + foreach(notif_scan_mode_sts_bit_cg[bt]) this.notif_scan_mode_sts_bit_cg[bt].sample(data[3 + bt]); + foreach(notif_soc_req_lock_sts_bit_cg[bt]) this.notif_soc_req_lock_sts_bit_cg[bt].sample(data[4 + bt]); + foreach(notif_gen_in_toggle_sts_bit_cg[bt]) this.notif_gen_in_toggle_sts_bit_cg[bt].sample(data[5 + bt]); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( data[0:0]/*notif_cmd_avail_sts*/ , data[1:1]/*notif_mbox_ecc_cor_sts*/ , data[2:2]/*notif_debug_locked_sts*/ , data[3:3]/*notif_scan_mode_sts*/ , data[4:4]/*notif_soc_req_lock_sts*/ , data[5:5]/*notif_gen_in_toggle_sts*/ ); + end + endfunction + + function void soc_ifc_reg__intr_block_t__notif_intr_t_notif_cmd_avail_sts_1871606b_notif_debug_locked_sts_5f024102_notif_gen_in_toggle_sts_59f84b64_notif_mbox_ecc_cor_sts_5c3d26bb_notif_scan_mode_sts_122f6367_notif_soc_req_lock_sts_deddde70::sample_values(); + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(notif_cmd_avail_sts_bit_cg[bt]) this.notif_cmd_avail_sts_bit_cg[bt].sample(notif_cmd_avail_sts.get_mirrored_value() >> bt); + foreach(notif_mbox_ecc_cor_sts_bit_cg[bt]) this.notif_mbox_ecc_cor_sts_bit_cg[bt].sample(notif_mbox_ecc_cor_sts.get_mirrored_value() >> bt); + foreach(notif_debug_locked_sts_bit_cg[bt]) this.notif_debug_locked_sts_bit_cg[bt].sample(notif_debug_locked_sts.get_mirrored_value() >> bt); + foreach(notif_scan_mode_sts_bit_cg[bt]) this.notif_scan_mode_sts_bit_cg[bt].sample(notif_scan_mode_sts.get_mirrored_value() >> bt); + foreach(notif_soc_req_lock_sts_bit_cg[bt]) this.notif_soc_req_lock_sts_bit_cg[bt].sample(notif_soc_req_lock_sts.get_mirrored_value() >> bt); + foreach(notif_gen_in_toggle_sts_bit_cg[bt]) this.notif_gen_in_toggle_sts_bit_cg[bt].sample(notif_gen_in_toggle_sts.get_mirrored_value() >> bt); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( notif_cmd_avail_sts.get_mirrored_value() , notif_mbox_ecc_cor_sts.get_mirrored_value() , notif_debug_locked_sts.get_mirrored_value() , notif_scan_mode_sts.get_mirrored_value() , notif_soc_req_lock_sts.get_mirrored_value() , notif_gen_in_toggle_sts.get_mirrored_value() ); + end + endfunction + + /*----------------------- SOC_IFC_REG__INTR_BLOCK_T__ERROR_INTR_TRIG_T SAMPLE FUNCTIONS -----------------------*/ + function void soc_ifc_reg__intr_block_t__error_intr_trig_t::sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); + m_current = get(); + m_data = data; + m_is_read = is_read; + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(error_internal_trig_bit_cg[bt]) this.error_internal_trig_bit_cg[bt].sample(data[0 + bt]); + foreach(error_inv_dev_trig_bit_cg[bt]) this.error_inv_dev_trig_bit_cg[bt].sample(data[1 + bt]); + foreach(error_cmd_fail_trig_bit_cg[bt]) this.error_cmd_fail_trig_bit_cg[bt].sample(data[2 + bt]); + foreach(error_bad_fuse_trig_bit_cg[bt]) this.error_bad_fuse_trig_bit_cg[bt].sample(data[3 + bt]); + foreach(error_iccm_blocked_trig_bit_cg[bt]) this.error_iccm_blocked_trig_bit_cg[bt].sample(data[4 + bt]); + foreach(error_mbox_ecc_unc_trig_bit_cg[bt]) this.error_mbox_ecc_unc_trig_bit_cg[bt].sample(data[5 + bt]); + foreach(error_wdt_timer1_timeout_trig_bit_cg[bt]) this.error_wdt_timer1_timeout_trig_bit_cg[bt].sample(data[6 + bt]); + foreach(error_wdt_timer2_timeout_trig_bit_cg[bt]) this.error_wdt_timer2_timeout_trig_bit_cg[bt].sample(data[7 + bt]); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( data[0:0]/*error_internal_trig*/ , data[1:1]/*error_inv_dev_trig*/ , data[2:2]/*error_cmd_fail_trig*/ , data[3:3]/*error_bad_fuse_trig*/ , data[4:4]/*error_iccm_blocked_trig*/ , data[5:5]/*error_mbox_ecc_unc_trig*/ , data[6:6]/*error_wdt_timer1_timeout_trig*/ , data[7:7]/*error_wdt_timer2_timeout_trig*/ ); + end + endfunction + + function void soc_ifc_reg__intr_block_t__error_intr_trig_t::sample_values(); + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(error_internal_trig_bit_cg[bt]) this.error_internal_trig_bit_cg[bt].sample(error_internal_trig.get_mirrored_value() >> bt); + foreach(error_inv_dev_trig_bit_cg[bt]) this.error_inv_dev_trig_bit_cg[bt].sample(error_inv_dev_trig.get_mirrored_value() >> bt); + foreach(error_cmd_fail_trig_bit_cg[bt]) this.error_cmd_fail_trig_bit_cg[bt].sample(error_cmd_fail_trig.get_mirrored_value() >> bt); + foreach(error_bad_fuse_trig_bit_cg[bt]) this.error_bad_fuse_trig_bit_cg[bt].sample(error_bad_fuse_trig.get_mirrored_value() >> bt); + foreach(error_iccm_blocked_trig_bit_cg[bt]) this.error_iccm_blocked_trig_bit_cg[bt].sample(error_iccm_blocked_trig.get_mirrored_value() >> bt); + foreach(error_mbox_ecc_unc_trig_bit_cg[bt]) this.error_mbox_ecc_unc_trig_bit_cg[bt].sample(error_mbox_ecc_unc_trig.get_mirrored_value() >> bt); + foreach(error_wdt_timer1_timeout_trig_bit_cg[bt]) this.error_wdt_timer1_timeout_trig_bit_cg[bt].sample(error_wdt_timer1_timeout_trig.get_mirrored_value() >> bt); + foreach(error_wdt_timer2_timeout_trig_bit_cg[bt]) this.error_wdt_timer2_timeout_trig_bit_cg[bt].sample(error_wdt_timer2_timeout_trig.get_mirrored_value() >> bt); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( error_internal_trig.get_mirrored_value() , error_inv_dev_trig.get_mirrored_value() , error_cmd_fail_trig.get_mirrored_value() , error_bad_fuse_trig.get_mirrored_value() , error_iccm_blocked_trig.get_mirrored_value() , error_mbox_ecc_unc_trig.get_mirrored_value() , error_wdt_timer1_timeout_trig.get_mirrored_value() , error_wdt_timer2_timeout_trig.get_mirrored_value() ); + end + endfunction + + /*----------------------- SOC_IFC_REG__INTR_BLOCK_T__NOTIF_INTR_TRIG_T SAMPLE FUNCTIONS -----------------------*/ + function void soc_ifc_reg__intr_block_t__notif_intr_trig_t::sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); + m_current = get(); + m_data = data; + m_is_read = is_read; + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(notif_cmd_avail_trig_bit_cg[bt]) this.notif_cmd_avail_trig_bit_cg[bt].sample(data[0 + bt]); + foreach(notif_mbox_ecc_cor_trig_bit_cg[bt]) this.notif_mbox_ecc_cor_trig_bit_cg[bt].sample(data[1 + bt]); + foreach(notif_debug_locked_trig_bit_cg[bt]) this.notif_debug_locked_trig_bit_cg[bt].sample(data[2 + bt]); + foreach(notif_scan_mode_trig_bit_cg[bt]) this.notif_scan_mode_trig_bit_cg[bt].sample(data[3 + bt]); + foreach(notif_soc_req_lock_trig_bit_cg[bt]) this.notif_soc_req_lock_trig_bit_cg[bt].sample(data[4 + bt]); + foreach(notif_gen_in_toggle_trig_bit_cg[bt]) this.notif_gen_in_toggle_trig_bit_cg[bt].sample(data[5 + bt]); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( data[0:0]/*notif_cmd_avail_trig*/ , data[1:1]/*notif_mbox_ecc_cor_trig*/ , data[2:2]/*notif_debug_locked_trig*/ , data[3:3]/*notif_scan_mode_trig*/ , data[4:4]/*notif_soc_req_lock_trig*/ , data[5:5]/*notif_gen_in_toggle_trig*/ ); + end + endfunction + + function void soc_ifc_reg__intr_block_t__notif_intr_trig_t::sample_values(); + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(notif_cmd_avail_trig_bit_cg[bt]) this.notif_cmd_avail_trig_bit_cg[bt].sample(notif_cmd_avail_trig.get_mirrored_value() >> bt); + foreach(notif_mbox_ecc_cor_trig_bit_cg[bt]) this.notif_mbox_ecc_cor_trig_bit_cg[bt].sample(notif_mbox_ecc_cor_trig.get_mirrored_value() >> bt); + foreach(notif_debug_locked_trig_bit_cg[bt]) this.notif_debug_locked_trig_bit_cg[bt].sample(notif_debug_locked_trig.get_mirrored_value() >> bt); + foreach(notif_scan_mode_trig_bit_cg[bt]) this.notif_scan_mode_trig_bit_cg[bt].sample(notif_scan_mode_trig.get_mirrored_value() >> bt); + foreach(notif_soc_req_lock_trig_bit_cg[bt]) this.notif_soc_req_lock_trig_bit_cg[bt].sample(notif_soc_req_lock_trig.get_mirrored_value() >> bt); + foreach(notif_gen_in_toggle_trig_bit_cg[bt]) this.notif_gen_in_toggle_trig_bit_cg[bt].sample(notif_gen_in_toggle_trig.get_mirrored_value() >> bt); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( notif_cmd_avail_trig.get_mirrored_value() , notif_mbox_ecc_cor_trig.get_mirrored_value() , notif_debug_locked_trig.get_mirrored_value() , notif_scan_mode_trig.get_mirrored_value() , notif_soc_req_lock_trig.get_mirrored_value() , notif_gen_in_toggle_trig.get_mirrored_value() ); + end + endfunction + + /*----------------------- SOC_IFC_REG__INTR_BLOCK_T__INTR_COUNT_T_CNT_608F1141 SAMPLE FUNCTIONS -----------------------*/ + function void soc_ifc_reg__intr_block_t__intr_count_t_cnt_608f1141::sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); + m_current = get(); + m_data = data; + m_is_read = is_read; + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(cnt_bit_cg[bt]) this.cnt_bit_cg[bt].sample(data[0 + bt]); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( data[31:0]/*cnt*/ ); + end + endfunction + + function void soc_ifc_reg__intr_block_t__intr_count_t_cnt_608f1141::sample_values(); + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(cnt_bit_cg[bt]) this.cnt_bit_cg[bt].sample(cnt.get_mirrored_value() >> bt); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( cnt.get_mirrored_value() ); + end + endfunction + + /*----------------------- SOC_IFC_REG__INTR_BLOCK_T__INTR_COUNT_T_CNT_916AB5DF SAMPLE FUNCTIONS -----------------------*/ + function void soc_ifc_reg__intr_block_t__intr_count_t_cnt_916ab5df::sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); + m_current = get(); + m_data = data; + m_is_read = is_read; + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(cnt_bit_cg[bt]) this.cnt_bit_cg[bt].sample(data[0 + bt]); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( data[31:0]/*cnt*/ ); + end + endfunction + + function void soc_ifc_reg__intr_block_t__intr_count_t_cnt_916ab5df::sample_values(); + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(cnt_bit_cg[bt]) this.cnt_bit_cg[bt].sample(cnt.get_mirrored_value() >> bt); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( cnt.get_mirrored_value() ); + end + endfunction + + /*----------------------- SOC_IFC_REG__INTR_BLOCK_T__INTR_COUNT_T_CNT_B2A56031 SAMPLE FUNCTIONS -----------------------*/ + function void soc_ifc_reg__intr_block_t__intr_count_t_cnt_b2a56031::sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); + m_current = get(); + m_data = data; + m_is_read = is_read; + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(cnt_bit_cg[bt]) this.cnt_bit_cg[bt].sample(data[0 + bt]); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( data[31:0]/*cnt*/ ); + end + endfunction + + function void soc_ifc_reg__intr_block_t__intr_count_t_cnt_b2a56031::sample_values(); + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(cnt_bit_cg[bt]) this.cnt_bit_cg[bt].sample(cnt.get_mirrored_value() >> bt); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( cnt.get_mirrored_value() ); + end + endfunction + + /*----------------------- SOC_IFC_REG__INTR_BLOCK_T__INTR_COUNT_T_CNT_FB7D2433 SAMPLE FUNCTIONS -----------------------*/ + function void soc_ifc_reg__intr_block_t__intr_count_t_cnt_fb7d2433::sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); + m_current = get(); + m_data = data; + m_is_read = is_read; + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(cnt_bit_cg[bt]) this.cnt_bit_cg[bt].sample(data[0 + bt]); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( data[31:0]/*cnt*/ ); + end + endfunction + + function void soc_ifc_reg__intr_block_t__intr_count_t_cnt_fb7d2433::sample_values(); + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(cnt_bit_cg[bt]) this.cnt_bit_cg[bt].sample(cnt.get_mirrored_value() >> bt); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( cnt.get_mirrored_value() ); + end + endfunction + + /*----------------------- SOC_IFC_REG__INTR_BLOCK_T__INTR_COUNT_T_CNT_25E76B6F SAMPLE FUNCTIONS -----------------------*/ + function void soc_ifc_reg__intr_block_t__intr_count_t_cnt_25e76b6f::sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); + m_current = get(); + m_data = data; + m_is_read = is_read; + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(cnt_bit_cg[bt]) this.cnt_bit_cg[bt].sample(data[0 + bt]); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( data[31:0]/*cnt*/ ); + end + endfunction + + function void soc_ifc_reg__intr_block_t__intr_count_t_cnt_25e76b6f::sample_values(); + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(cnt_bit_cg[bt]) this.cnt_bit_cg[bt].sample(cnt.get_mirrored_value() >> bt); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( cnt.get_mirrored_value() ); + end + endfunction + + /*----------------------- SOC_IFC_REG__INTR_BLOCK_T__INTR_COUNT_T_CNT_26B97E39 SAMPLE FUNCTIONS -----------------------*/ + function void soc_ifc_reg__intr_block_t__intr_count_t_cnt_26b97e39::sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); + m_current = get(); + m_data = data; + m_is_read = is_read; + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(cnt_bit_cg[bt]) this.cnt_bit_cg[bt].sample(data[0 + bt]); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( data[31:0]/*cnt*/ ); + end + endfunction + + function void soc_ifc_reg__intr_block_t__intr_count_t_cnt_26b97e39::sample_values(); + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(cnt_bit_cg[bt]) this.cnt_bit_cg[bt].sample(cnt.get_mirrored_value() >> bt); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( cnt.get_mirrored_value() ); + end + endfunction + + /*----------------------- SOC_IFC_REG__INTR_BLOCK_T__INTR_COUNT_T_CNT_A2F61F82 SAMPLE FUNCTIONS -----------------------*/ + function void soc_ifc_reg__intr_block_t__intr_count_t_cnt_a2f61f82::sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); + m_current = get(); + m_data = data; + m_is_read = is_read; + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(cnt_bit_cg[bt]) this.cnt_bit_cg[bt].sample(data[0 + bt]); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( data[31:0]/*cnt*/ ); + end + endfunction + + function void soc_ifc_reg__intr_block_t__intr_count_t_cnt_a2f61f82::sample_values(); + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(cnt_bit_cg[bt]) this.cnt_bit_cg[bt].sample(cnt.get_mirrored_value() >> bt); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( cnt.get_mirrored_value() ); + end + endfunction + + /*----------------------- SOC_IFC_REG__INTR_BLOCK_T__INTR_COUNT_T_CNT_D46457CD SAMPLE FUNCTIONS -----------------------*/ + function void soc_ifc_reg__intr_block_t__intr_count_t_cnt_d46457cd::sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); + m_current = get(); + m_data = data; + m_is_read = is_read; + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(cnt_bit_cg[bt]) this.cnt_bit_cg[bt].sample(data[0 + bt]); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( data[31:0]/*cnt*/ ); + end + endfunction + + function void soc_ifc_reg__intr_block_t__intr_count_t_cnt_d46457cd::sample_values(); + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(cnt_bit_cg[bt]) this.cnt_bit_cg[bt].sample(cnt.get_mirrored_value() >> bt); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( cnt.get_mirrored_value() ); + end + endfunction + + /*----------------------- SOC_IFC_REG__INTR_BLOCK_T__INTR_COUNT_T_CNT_A06F0954 SAMPLE FUNCTIONS -----------------------*/ + function void soc_ifc_reg__intr_block_t__intr_count_t_cnt_a06f0954::sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); + m_current = get(); + m_data = data; + m_is_read = is_read; + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(cnt_bit_cg[bt]) this.cnt_bit_cg[bt].sample(data[0 + bt]); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( data[31:0]/*cnt*/ ); + end + endfunction + + function void soc_ifc_reg__intr_block_t__intr_count_t_cnt_a06f0954::sample_values(); + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(cnt_bit_cg[bt]) this.cnt_bit_cg[bt].sample(cnt.get_mirrored_value() >> bt); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( cnt.get_mirrored_value() ); + end + endfunction + + /*----------------------- SOC_IFC_REG__INTR_BLOCK_T__INTR_COUNT_T_CNT_00E49272 SAMPLE FUNCTIONS -----------------------*/ + function void soc_ifc_reg__intr_block_t__intr_count_t_cnt_00e49272::sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); + m_current = get(); + m_data = data; + m_is_read = is_read; + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(cnt_bit_cg[bt]) this.cnt_bit_cg[bt].sample(data[0 + bt]); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( data[31:0]/*cnt*/ ); + end + endfunction + + function void soc_ifc_reg__intr_block_t__intr_count_t_cnt_00e49272::sample_values(); + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(cnt_bit_cg[bt]) this.cnt_bit_cg[bt].sample(cnt.get_mirrored_value() >> bt); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( cnt.get_mirrored_value() ); + end + endfunction + + /*----------------------- SOC_IFC_REG__INTR_BLOCK_T__INTR_COUNT_T_CNT_EE53DED8 SAMPLE FUNCTIONS -----------------------*/ + function void soc_ifc_reg__intr_block_t__intr_count_t_cnt_ee53ded8::sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); + m_current = get(); + m_data = data; + m_is_read = is_read; + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(cnt_bit_cg[bt]) this.cnt_bit_cg[bt].sample(data[0 + bt]); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( data[31:0]/*cnt*/ ); + end + endfunction + + function void soc_ifc_reg__intr_block_t__intr_count_t_cnt_ee53ded8::sample_values(); + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(cnt_bit_cg[bt]) this.cnt_bit_cg[bt].sample(cnt.get_mirrored_value() >> bt); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( cnt.get_mirrored_value() ); + end + endfunction + + /*----------------------- SOC_IFC_REG__INTR_BLOCK_T__INTR_COUNT_T_CNT_FBF3C714 SAMPLE FUNCTIONS -----------------------*/ + function void soc_ifc_reg__intr_block_t__intr_count_t_cnt_fbf3c714::sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); + m_current = get(); + m_data = data; + m_is_read = is_read; + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(cnt_bit_cg[bt]) this.cnt_bit_cg[bt].sample(data[0 + bt]); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( data[31:0]/*cnt*/ ); + end + endfunction + + function void soc_ifc_reg__intr_block_t__intr_count_t_cnt_fbf3c714::sample_values(); + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(cnt_bit_cg[bt]) this.cnt_bit_cg[bt].sample(cnt.get_mirrored_value() >> bt); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( cnt.get_mirrored_value() ); + end + endfunction + + /*----------------------- SOC_IFC_REG__INTR_BLOCK_T__INTR_COUNT_T_CNT_B9BDDABE SAMPLE FUNCTIONS -----------------------*/ + function void soc_ifc_reg__intr_block_t__intr_count_t_cnt_b9bddabe::sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); + m_current = get(); + m_data = data; + m_is_read = is_read; + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(cnt_bit_cg[bt]) this.cnt_bit_cg[bt].sample(data[0 + bt]); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( data[31:0]/*cnt*/ ); + end + endfunction + + function void soc_ifc_reg__intr_block_t__intr_count_t_cnt_b9bddabe::sample_values(); + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(cnt_bit_cg[bt]) this.cnt_bit_cg[bt].sample(cnt.get_mirrored_value() >> bt); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( cnt.get_mirrored_value() ); + end + endfunction + + /*----------------------- SOC_IFC_REG__INTR_BLOCK_T__INTR_COUNT_T_CNT_57528CC1 SAMPLE FUNCTIONS -----------------------*/ + function void soc_ifc_reg__intr_block_t__intr_count_t_cnt_57528cc1::sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); + m_current = get(); + m_data = data; + m_is_read = is_read; + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(cnt_bit_cg[bt]) this.cnt_bit_cg[bt].sample(data[0 + bt]); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( data[31:0]/*cnt*/ ); + end + endfunction + + function void soc_ifc_reg__intr_block_t__intr_count_t_cnt_57528cc1::sample_values(); + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(cnt_bit_cg[bt]) this.cnt_bit_cg[bt].sample(cnt.get_mirrored_value() >> bt); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( cnt.get_mirrored_value() ); + end + endfunction + + /*----------------------- SOC_IFC_REG__INTR_BLOCK_T__INTR_COUNT_INCR_T_PULSE_15E6ED7E SAMPLE FUNCTIONS -----------------------*/ + function void soc_ifc_reg__intr_block_t__intr_count_incr_t_pulse_15e6ed7e::sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); + m_current = get(); + m_data = data; + m_is_read = is_read; + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(pulse_bit_cg[bt]) this.pulse_bit_cg[bt].sample(data[0 + bt]); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( data[0:0]/*pulse*/ ); + end + endfunction + + function void soc_ifc_reg__intr_block_t__intr_count_incr_t_pulse_15e6ed7e::sample_values(); + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(pulse_bit_cg[bt]) this.pulse_bit_cg[bt].sample(pulse.get_mirrored_value() >> bt); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( pulse.get_mirrored_value() ); + end + endfunction + + /*----------------------- SOC_IFC_REG__INTR_BLOCK_T__INTR_COUNT_INCR_T_PULSE_F762EA9C SAMPLE FUNCTIONS -----------------------*/ + function void soc_ifc_reg__intr_block_t__intr_count_incr_t_pulse_f762ea9c::sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); + m_current = get(); + m_data = data; + m_is_read = is_read; + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(pulse_bit_cg[bt]) this.pulse_bit_cg[bt].sample(data[0 + bt]); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( data[0:0]/*pulse*/ ); + end + endfunction + + function void soc_ifc_reg__intr_block_t__intr_count_incr_t_pulse_f762ea9c::sample_values(); + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(pulse_bit_cg[bt]) this.pulse_bit_cg[bt].sample(pulse.get_mirrored_value() >> bt); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( pulse.get_mirrored_value() ); + end + endfunction + + /*----------------------- SOC_IFC_REG__INTR_BLOCK_T__INTR_COUNT_INCR_T_PULSE_AA8718C6 SAMPLE FUNCTIONS -----------------------*/ + function void soc_ifc_reg__intr_block_t__intr_count_incr_t_pulse_aa8718c6::sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); + m_current = get(); + m_data = data; + m_is_read = is_read; + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(pulse_bit_cg[bt]) this.pulse_bit_cg[bt].sample(data[0 + bt]); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( data[0:0]/*pulse*/ ); + end + endfunction + + function void soc_ifc_reg__intr_block_t__intr_count_incr_t_pulse_aa8718c6::sample_values(); + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(pulse_bit_cg[bt]) this.pulse_bit_cg[bt].sample(pulse.get_mirrored_value() >> bt); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( pulse.get_mirrored_value() ); + end + endfunction + + /*----------------------- SOC_IFC_REG__INTR_BLOCK_T__INTR_COUNT_INCR_T_PULSE_26FA5955 SAMPLE FUNCTIONS -----------------------*/ + function void soc_ifc_reg__intr_block_t__intr_count_incr_t_pulse_26fa5955::sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); + m_current = get(); + m_data = data; + m_is_read = is_read; + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(pulse_bit_cg[bt]) this.pulse_bit_cg[bt].sample(data[0 + bt]); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( data[0:0]/*pulse*/ ); + end + endfunction + + function void soc_ifc_reg__intr_block_t__intr_count_incr_t_pulse_26fa5955::sample_values(); + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(pulse_bit_cg[bt]) this.pulse_bit_cg[bt].sample(pulse.get_mirrored_value() >> bt); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( pulse.get_mirrored_value() ); + end + endfunction + + /*----------------------- SOC_IFC_REG__INTR_BLOCK_T__INTR_COUNT_INCR_T_PULSE_3E43D258 SAMPLE FUNCTIONS -----------------------*/ + function void soc_ifc_reg__intr_block_t__intr_count_incr_t_pulse_3e43d258::sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); + m_current = get(); + m_data = data; + m_is_read = is_read; + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(pulse_bit_cg[bt]) this.pulse_bit_cg[bt].sample(data[0 + bt]); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( data[0:0]/*pulse*/ ); + end + endfunction + + function void soc_ifc_reg__intr_block_t__intr_count_incr_t_pulse_3e43d258::sample_values(); + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(pulse_bit_cg[bt]) this.pulse_bit_cg[bt].sample(pulse.get_mirrored_value() >> bt); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( pulse.get_mirrored_value() ); + end + endfunction + + /*----------------------- SOC_IFC_REG__INTR_BLOCK_T__INTR_COUNT_INCR_T_PULSE_9F1632FD SAMPLE FUNCTIONS -----------------------*/ + function void soc_ifc_reg__intr_block_t__intr_count_incr_t_pulse_9f1632fd::sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); + m_current = get(); + m_data = data; + m_is_read = is_read; + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(pulse_bit_cg[bt]) this.pulse_bit_cg[bt].sample(data[0 + bt]); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( data[0:0]/*pulse*/ ); + end + endfunction + + function void soc_ifc_reg__intr_block_t__intr_count_incr_t_pulse_9f1632fd::sample_values(); + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(pulse_bit_cg[bt]) this.pulse_bit_cg[bt].sample(pulse.get_mirrored_value() >> bt); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( pulse.get_mirrored_value() ); + end + endfunction + + /*----------------------- SOC_IFC_REG__INTR_BLOCK_T__INTR_COUNT_INCR_T_PULSE_AA999FDC SAMPLE FUNCTIONS -----------------------*/ + function void soc_ifc_reg__intr_block_t__intr_count_incr_t_pulse_aa999fdc::sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); + m_current = get(); + m_data = data; + m_is_read = is_read; + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(pulse_bit_cg[bt]) this.pulse_bit_cg[bt].sample(data[0 + bt]); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( data[0:0]/*pulse*/ ); + end + endfunction + + function void soc_ifc_reg__intr_block_t__intr_count_incr_t_pulse_aa999fdc::sample_values(); + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(pulse_bit_cg[bt]) this.pulse_bit_cg[bt].sample(pulse.get_mirrored_value() >> bt); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( pulse.get_mirrored_value() ); + end + endfunction + + /*----------------------- SOC_IFC_REG__INTR_BLOCK_T__INTR_COUNT_INCR_T_PULSE_404E12DB SAMPLE FUNCTIONS -----------------------*/ + function void soc_ifc_reg__intr_block_t__intr_count_incr_t_pulse_404e12db::sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); + m_current = get(); + m_data = data; + m_is_read = is_read; + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(pulse_bit_cg[bt]) this.pulse_bit_cg[bt].sample(data[0 + bt]); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( data[0:0]/*pulse*/ ); + end + endfunction + + function void soc_ifc_reg__intr_block_t__intr_count_incr_t_pulse_404e12db::sample_values(); + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(pulse_bit_cg[bt]) this.pulse_bit_cg[bt].sample(pulse.get_mirrored_value() >> bt); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( pulse.get_mirrored_value() ); + end + endfunction + + /*----------------------- SOC_IFC_REG__INTR_BLOCK_T__INTR_COUNT_INCR_T_PULSE_90D52137 SAMPLE FUNCTIONS -----------------------*/ + function void soc_ifc_reg__intr_block_t__intr_count_incr_t_pulse_90d52137::sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); + m_current = get(); + m_data = data; + m_is_read = is_read; + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(pulse_bit_cg[bt]) this.pulse_bit_cg[bt].sample(data[0 + bt]); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( data[0:0]/*pulse*/ ); + end + endfunction + + function void soc_ifc_reg__intr_block_t__intr_count_incr_t_pulse_90d52137::sample_values(); + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(pulse_bit_cg[bt]) this.pulse_bit_cg[bt].sample(pulse.get_mirrored_value() >> bt); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( pulse.get_mirrored_value() ); + end + endfunction + + /*----------------------- SOC_IFC_REG__INTR_BLOCK_T__INTR_COUNT_INCR_T_PULSE_A6DB6FFF SAMPLE FUNCTIONS -----------------------*/ + function void soc_ifc_reg__intr_block_t__intr_count_incr_t_pulse_a6db6fff::sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); + m_current = get(); + m_data = data; + m_is_read = is_read; + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(pulse_bit_cg[bt]) this.pulse_bit_cg[bt].sample(data[0 + bt]); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( data[0:0]/*pulse*/ ); + end + endfunction + + function void soc_ifc_reg__intr_block_t__intr_count_incr_t_pulse_a6db6fff::sample_values(); + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(pulse_bit_cg[bt]) this.pulse_bit_cg[bt].sample(pulse.get_mirrored_value() >> bt); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( pulse.get_mirrored_value() ); + end + endfunction + + /*----------------------- SOC_IFC_REG__INTR_BLOCK_T__INTR_COUNT_INCR_T_PULSE_51891FB1 SAMPLE FUNCTIONS -----------------------*/ + function void soc_ifc_reg__intr_block_t__intr_count_incr_t_pulse_51891fb1::sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); + m_current = get(); + m_data = data; + m_is_read = is_read; + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(pulse_bit_cg[bt]) this.pulse_bit_cg[bt].sample(data[0 + bt]); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( data[0:0]/*pulse*/ ); + end + endfunction + + function void soc_ifc_reg__intr_block_t__intr_count_incr_t_pulse_51891fb1::sample_values(); + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(pulse_bit_cg[bt]) this.pulse_bit_cg[bt].sample(pulse.get_mirrored_value() >> bt); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( pulse.get_mirrored_value() ); + end + endfunction + + /*----------------------- SOC_IFC_REG__INTR_BLOCK_T__INTR_COUNT_INCR_T_PULSE_F5D8AFE0 SAMPLE FUNCTIONS -----------------------*/ + function void soc_ifc_reg__intr_block_t__intr_count_incr_t_pulse_f5d8afe0::sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); + m_current = get(); + m_data = data; + m_is_read = is_read; + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(pulse_bit_cg[bt]) this.pulse_bit_cg[bt].sample(data[0 + bt]); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( data[0:0]/*pulse*/ ); + end + endfunction + + function void soc_ifc_reg__intr_block_t__intr_count_incr_t_pulse_f5d8afe0::sample_values(); + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(pulse_bit_cg[bt]) this.pulse_bit_cg[bt].sample(pulse.get_mirrored_value() >> bt); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( pulse.get_mirrored_value() ); + end + endfunction + + /*----------------------- SOC_IFC_REG__INTR_BLOCK_T__INTR_COUNT_INCR_T_PULSE_246489BD SAMPLE FUNCTIONS -----------------------*/ + function void soc_ifc_reg__intr_block_t__intr_count_incr_t_pulse_246489bd::sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); + m_current = get(); + m_data = data; + m_is_read = is_read; + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(pulse_bit_cg[bt]) this.pulse_bit_cg[bt].sample(data[0 + bt]); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( data[0:0]/*pulse*/ ); + end + endfunction + + function void soc_ifc_reg__intr_block_t__intr_count_incr_t_pulse_246489bd::sample_values(); + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(pulse_bit_cg[bt]) this.pulse_bit_cg[bt].sample(pulse.get_mirrored_value() >> bt); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( pulse.get_mirrored_value() ); + end + endfunction + + /*----------------------- SOC_IFC_REG__INTR_BLOCK_T__INTR_COUNT_INCR_T_PULSE_D6ED4D1E SAMPLE FUNCTIONS -----------------------*/ + function void soc_ifc_reg__intr_block_t__intr_count_incr_t_pulse_d6ed4d1e::sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); + m_current = get(); + m_data = data; + m_is_read = is_read; + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(pulse_bit_cg[bt]) this.pulse_bit_cg[bt].sample(data[0 + bt]); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( data[0:0]/*pulse*/ ); + end + endfunction + + function void soc_ifc_reg__intr_block_t__intr_count_incr_t_pulse_d6ed4d1e::sample_values(); + if (get_coverage(UVM_CVR_REG_BITS)) begin + foreach(pulse_bit_cg[bt]) this.pulse_bit_cg[bt].sample(pulse.get_mirrored_value() >> bt); + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample( pulse.get_mirrored_value() ); + end + endfunction + +`endif \ No newline at end of file diff --git a/src/soc_ifc/rtl/soc_ifc_reg_uvm.sv b/src/soc_ifc/rtl/soc_ifc_reg_uvm.sv index e85e404c5..249f71bb5 100644 --- a/src/soc_ifc/rtl/soc_ifc_reg_uvm.sv +++ b/src/soc_ifc/rtl/soc_ifc_reg_uvm.sv @@ -3,134 +3,305 @@ package soc_ifc_reg_uvm; `include "uvm_macros.svh" import uvm_pkg::*; - + `include "soc_ifc_reg_covergroups.svh" // Reg - soc_ifc_reg::CPTRA_HW_ERROR_FATAL class soc_ifc_reg__CPTRA_HW_ERROR_FATAL extends uvm_reg; - rand uvm_reg_field error_code; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + soc_ifc_reg__CPTRA_HW_ERROR_FATAL_bit_cg iccm_ecc_unc_bit_cg[1]; + soc_ifc_reg__CPTRA_HW_ERROR_FATAL_bit_cg dccm_ecc_unc_bit_cg[1]; + soc_ifc_reg__CPTRA_HW_ERROR_FATAL_bit_cg nmi_pin_bit_cg[1]; + soc_ifc_reg__CPTRA_HW_ERROR_FATAL_fld_cg fld_cg; + rand uvm_reg_field iccm_ecc_unc; + rand uvm_reg_field dccm_ecc_unc; + rand uvm_reg_field nmi_pin; function new(string name = "soc_ifc_reg__CPTRA_HW_ERROR_FATAL"); - super.new(name, 32, UVM_NO_COVERAGE); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); virtual function void build(); - this.error_code = new("error_code"); - this.error_code.configure(this, 32, 0, "W1C", 1, 'h0, 1, 1, 0); + this.iccm_ecc_unc = new("iccm_ecc_unc"); + this.iccm_ecc_unc.configure(this, 1, 0, "W1C", 1, 'h0, 1, 1, 0); + this.dccm_ecc_unc = new("dccm_ecc_unc"); + this.dccm_ecc_unc.configure(this, 1, 1, "W1C", 1, 'h0, 1, 1, 0); + this.nmi_pin = new("nmi_pin"); + this.nmi_pin.configure(this, 1, 2, "W1C", 1, 'h0, 1, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(iccm_ecc_unc_bit_cg[bt]) iccm_ecc_unc_bit_cg[bt] = new(); + foreach(dccm_ecc_unc_bit_cg[bt]) dccm_ecc_unc_bit_cg[bt] = new(); + foreach(nmi_pin_bit_cg[bt]) nmi_pin_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); endfunction : build endclass : soc_ifc_reg__CPTRA_HW_ERROR_FATAL // Reg - soc_ifc_reg::CPTRA_HW_ERROR_NON_FATAL class soc_ifc_reg__CPTRA_HW_ERROR_NON_FATAL extends uvm_reg; - rand uvm_reg_field error_code; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + soc_ifc_reg__CPTRA_HW_ERROR_NON_FATAL_bit_cg mbox_prot_no_lock_bit_cg[1]; + soc_ifc_reg__CPTRA_HW_ERROR_NON_FATAL_bit_cg mbox_prot_ooo_bit_cg[1]; + soc_ifc_reg__CPTRA_HW_ERROR_NON_FATAL_bit_cg mbox_ecc_unc_bit_cg[1]; + soc_ifc_reg__CPTRA_HW_ERROR_NON_FATAL_fld_cg fld_cg; + rand uvm_reg_field mbox_prot_no_lock; + rand uvm_reg_field mbox_prot_ooo; + rand uvm_reg_field mbox_ecc_unc; function new(string name = "soc_ifc_reg__CPTRA_HW_ERROR_NON_FATAL"); - super.new(name, 32, UVM_NO_COVERAGE); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); virtual function void build(); - this.error_code = new("error_code"); - this.error_code.configure(this, 32, 0, "W1C", 1, 'h0, 1, 1, 0); + this.mbox_prot_no_lock = new("mbox_prot_no_lock"); + this.mbox_prot_no_lock.configure(this, 1, 0, "W1C", 1, 'h0, 1, 1, 0); + this.mbox_prot_ooo = new("mbox_prot_ooo"); + this.mbox_prot_ooo.configure(this, 1, 1, "W1C", 1, 'h0, 1, 1, 0); + this.mbox_ecc_unc = new("mbox_ecc_unc"); + this.mbox_ecc_unc.configure(this, 1, 2, "W1C", 1, 'h0, 1, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(mbox_prot_no_lock_bit_cg[bt]) mbox_prot_no_lock_bit_cg[bt] = new(); + foreach(mbox_prot_ooo_bit_cg[bt]) mbox_prot_ooo_bit_cg[bt] = new(); + foreach(mbox_ecc_unc_bit_cg[bt]) mbox_ecc_unc_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); endfunction : build endclass : soc_ifc_reg__CPTRA_HW_ERROR_NON_FATAL // Reg - soc_ifc_reg::CPTRA_FW_ERROR_FATAL class soc_ifc_reg__CPTRA_FW_ERROR_FATAL extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + soc_ifc_reg__CPTRA_FW_ERROR_FATAL_bit_cg error_code_bit_cg[32]; + soc_ifc_reg__CPTRA_FW_ERROR_FATAL_fld_cg fld_cg; rand uvm_reg_field error_code; function new(string name = "soc_ifc_reg__CPTRA_FW_ERROR_FATAL"); - super.new(name, 32, UVM_NO_COVERAGE); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); virtual function void build(); this.error_code = new("error_code"); this.error_code.configure(this, 32, 0, "RW", 1, 'h0, 1, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(error_code_bit_cg[bt]) error_code_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); endfunction : build endclass : soc_ifc_reg__CPTRA_FW_ERROR_FATAL // Reg - soc_ifc_reg::CPTRA_FW_ERROR_NON_FATAL class soc_ifc_reg__CPTRA_FW_ERROR_NON_FATAL extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + soc_ifc_reg__CPTRA_FW_ERROR_NON_FATAL_bit_cg error_code_bit_cg[32]; + soc_ifc_reg__CPTRA_FW_ERROR_NON_FATAL_fld_cg fld_cg; rand uvm_reg_field error_code; function new(string name = "soc_ifc_reg__CPTRA_FW_ERROR_NON_FATAL"); - super.new(name, 32, UVM_NO_COVERAGE); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); virtual function void build(); this.error_code = new("error_code"); this.error_code.configure(this, 32, 0, "RW", 1, 'h0, 1, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(error_code_bit_cg[bt]) error_code_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); endfunction : build endclass : soc_ifc_reg__CPTRA_FW_ERROR_NON_FATAL // Reg - soc_ifc_reg::CPTRA_HW_ERROR_ENC class soc_ifc_reg__CPTRA_HW_ERROR_ENC extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + soc_ifc_reg__CPTRA_HW_ERROR_ENC_bit_cg error_code_bit_cg[32]; + soc_ifc_reg__CPTRA_HW_ERROR_ENC_fld_cg fld_cg; rand uvm_reg_field error_code; function new(string name = "soc_ifc_reg__CPTRA_HW_ERROR_ENC"); - super.new(name, 32, UVM_NO_COVERAGE); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); virtual function void build(); this.error_code = new("error_code"); this.error_code.configure(this, 32, 0, "RW", 0, 'h0, 1, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(error_code_bit_cg[bt]) error_code_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); endfunction : build endclass : soc_ifc_reg__CPTRA_HW_ERROR_ENC // Reg - soc_ifc_reg::CPTRA_FW_ERROR_ENC class soc_ifc_reg__CPTRA_FW_ERROR_ENC extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + soc_ifc_reg__CPTRA_FW_ERROR_ENC_bit_cg error_code_bit_cg[32]; + soc_ifc_reg__CPTRA_FW_ERROR_ENC_fld_cg fld_cg; rand uvm_reg_field error_code; function new(string name = "soc_ifc_reg__CPTRA_FW_ERROR_ENC"); - super.new(name, 32, UVM_NO_COVERAGE); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); virtual function void build(); this.error_code = new("error_code"); this.error_code.configure(this, 32, 0, "RW", 0, 'h0, 1, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(error_code_bit_cg[bt]) error_code_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); endfunction : build endclass : soc_ifc_reg__CPTRA_FW_ERROR_ENC // Reg - soc_ifc_reg::CPTRA_FW_EXTENDED_ERROR_INFO class soc_ifc_reg__CPTRA_FW_EXTENDED_ERROR_INFO extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + soc_ifc_reg__CPTRA_FW_EXTENDED_ERROR_INFO_bit_cg error_info_bit_cg[32]; + soc_ifc_reg__CPTRA_FW_EXTENDED_ERROR_INFO_fld_cg fld_cg; rand uvm_reg_field error_info; function new(string name = "soc_ifc_reg__CPTRA_FW_EXTENDED_ERROR_INFO"); - super.new(name, 32, UVM_NO_COVERAGE); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); virtual function void build(); this.error_info = new("error_info"); this.error_info.configure(this, 32, 0, "RW", 0, 'h0, 1, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(error_info_bit_cg[bt]) error_info_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); endfunction : build endclass : soc_ifc_reg__CPTRA_FW_EXTENDED_ERROR_INFO // Reg - soc_ifc_reg::CPTRA_BOOT_STATUS class soc_ifc_reg__CPTRA_BOOT_STATUS extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + soc_ifc_reg__CPTRA_BOOT_STATUS_bit_cg status_bit_cg[32]; + soc_ifc_reg__CPTRA_BOOT_STATUS_fld_cg fld_cg; rand uvm_reg_field status; function new(string name = "soc_ifc_reg__CPTRA_BOOT_STATUS"); - super.new(name, 32, UVM_NO_COVERAGE); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); virtual function void build(); this.status = new("status"); this.status.configure(this, 32, 0, "RW", 0, 'h0, 1, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(status_bit_cg[bt]) status_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); endfunction : build endclass : soc_ifc_reg__CPTRA_BOOT_STATUS // Reg - soc_ifc_reg::CPTRA_FLOW_STATUS class soc_ifc_reg__CPTRA_FLOW_STATUS extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + soc_ifc_reg__CPTRA_FLOW_STATUS_bit_cg status_bit_cg[24]; + soc_ifc_reg__CPTRA_FLOW_STATUS_bit_cg idevid_csr_ready_bit_cg[1]; + soc_ifc_reg__CPTRA_FLOW_STATUS_bit_cg boot_fsm_ps_bit_cg[3]; + soc_ifc_reg__CPTRA_FLOW_STATUS_bit_cg ready_for_fw_bit_cg[1]; + soc_ifc_reg__CPTRA_FLOW_STATUS_bit_cg ready_for_runtime_bit_cg[1]; + soc_ifc_reg__CPTRA_FLOW_STATUS_bit_cg ready_for_fuses_bit_cg[1]; + soc_ifc_reg__CPTRA_FLOW_STATUS_bit_cg mailbox_flow_done_bit_cg[1]; + soc_ifc_reg__CPTRA_FLOW_STATUS_fld_cg fld_cg; rand uvm_reg_field status; + rand uvm_reg_field idevid_csr_ready; + rand uvm_reg_field boot_fsm_ps; rand uvm_reg_field ready_for_fw; rand uvm_reg_field ready_for_runtime; rand uvm_reg_field ready_for_fuses; rand uvm_reg_field mailbox_flow_done; function new(string name = "soc_ifc_reg__CPTRA_FLOW_STATUS"); - super.new(name, 32, UVM_NO_COVERAGE); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); virtual function void build(); this.status = new("status"); - this.status.configure(this, 28, 0, "RW", 0, 'h0, 1, 1, 0); + this.status.configure(this, 24, 0, "RW", 0, 'h0, 1, 1, 0); + this.idevid_csr_ready = new("idevid_csr_ready"); + this.idevid_csr_ready.configure(this, 1, 24, "RW", 0, 'h0, 1, 1, 0); + this.boot_fsm_ps = new("boot_fsm_ps"); + this.boot_fsm_ps.configure(this, 3, 25, "RO", 1, 'h0, 0, 1, 0); this.ready_for_fw = new("ready_for_fw"); this.ready_for_fw.configure(this, 1, 28, "RW", 0, 'h0, 1, 1, 0); this.ready_for_runtime = new("ready_for_runtime"); @@ -139,36 +310,79 @@ package soc_ifc_reg_uvm; this.ready_for_fuses.configure(this, 1, 30, "RO", 1, 'h0, 0, 1, 0); this.mailbox_flow_done = new("mailbox_flow_done"); this.mailbox_flow_done.configure(this, 1, 31, "RW", 0, 'h0, 1, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(status_bit_cg[bt]) status_bit_cg[bt] = new(); + foreach(idevid_csr_ready_bit_cg[bt]) idevid_csr_ready_bit_cg[bt] = new(); + foreach(boot_fsm_ps_bit_cg[bt]) boot_fsm_ps_bit_cg[bt] = new(); + foreach(ready_for_fw_bit_cg[bt]) ready_for_fw_bit_cg[bt] = new(); + foreach(ready_for_runtime_bit_cg[bt]) ready_for_runtime_bit_cg[bt] = new(); + foreach(ready_for_fuses_bit_cg[bt]) ready_for_fuses_bit_cg[bt] = new(); + foreach(mailbox_flow_done_bit_cg[bt]) mailbox_flow_done_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); endfunction : build endclass : soc_ifc_reg__CPTRA_FLOW_STATUS // Reg - soc_ifc_reg::CPTRA_RESET_REASON class soc_ifc_reg__CPTRA_RESET_REASON extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + soc_ifc_reg__CPTRA_RESET_REASON_bit_cg FW_UPD_RESET_bit_cg[1]; + soc_ifc_reg__CPTRA_RESET_REASON_bit_cg WARM_RESET_bit_cg[1]; + soc_ifc_reg__CPTRA_RESET_REASON_fld_cg fld_cg; rand uvm_reg_field FW_UPD_RESET; rand uvm_reg_field WARM_RESET; function new(string name = "soc_ifc_reg__CPTRA_RESET_REASON"); - super.new(name, 32, UVM_NO_COVERAGE); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); virtual function void build(); this.FW_UPD_RESET = new("FW_UPD_RESET"); this.FW_UPD_RESET.configure(this, 1, 0, "RO", 1, 'h0, 1, 1, 0); this.WARM_RESET = new("WARM_RESET"); this.WARM_RESET.configure(this, 1, 1, "RO", 1, 'h0, 1, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(FW_UPD_RESET_bit_cg[bt]) FW_UPD_RESET_bit_cg[bt] = new(); + foreach(WARM_RESET_bit_cg[bt]) WARM_RESET_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); endfunction : build endclass : soc_ifc_reg__CPTRA_RESET_REASON // Reg - soc_ifc_reg::CPTRA_SECURITY_STATE class soc_ifc_reg__CPTRA_SECURITY_STATE extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + soc_ifc_reg__CPTRA_SECURITY_STATE_bit_cg device_lifecycle_bit_cg[2]; + soc_ifc_reg__CPTRA_SECURITY_STATE_bit_cg debug_locked_bit_cg[1]; + soc_ifc_reg__CPTRA_SECURITY_STATE_bit_cg scan_mode_bit_cg[1]; + soc_ifc_reg__CPTRA_SECURITY_STATE_bit_cg rsvd_bit_cg[28]; + soc_ifc_reg__CPTRA_SECURITY_STATE_fld_cg fld_cg; rand uvm_reg_field device_lifecycle; rand uvm_reg_field debug_locked; rand uvm_reg_field scan_mode; rand uvm_reg_field rsvd; function new(string name = "soc_ifc_reg__CPTRA_SECURITY_STATE"); - super.new(name, 32, UVM_NO_COVERAGE); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); virtual function void build(); this.device_lifecycle = new("device_lifecycle"); @@ -179,232 +393,531 @@ package soc_ifc_reg_uvm; this.scan_mode.configure(this, 1, 3, "RO", 1, 'h0, 1, 1, 0); this.rsvd = new("rsvd"); this.rsvd.configure(this, 28, 4, "RO", 0, 'h0, 1, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(device_lifecycle_bit_cg[bt]) device_lifecycle_bit_cg[bt] = new(); + foreach(debug_locked_bit_cg[bt]) debug_locked_bit_cg[bt] = new(); + foreach(scan_mode_bit_cg[bt]) scan_mode_bit_cg[bt] = new(); + foreach(rsvd_bit_cg[bt]) rsvd_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); endfunction : build endclass : soc_ifc_reg__CPTRA_SECURITY_STATE // Reg - soc_ifc_reg::CPTRA_MBOX_VALID_PAUSER class soc_ifc_reg__CPTRA_MBOX_VALID_PAUSER extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + soc_ifc_reg__CPTRA_MBOX_VALID_PAUSER_bit_cg PAUSER_bit_cg[32]; + soc_ifc_reg__CPTRA_MBOX_VALID_PAUSER_fld_cg fld_cg; rand uvm_reg_field PAUSER; function new(string name = "soc_ifc_reg__CPTRA_MBOX_VALID_PAUSER"); - super.new(name, 32, UVM_NO_COVERAGE); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); virtual function void build(); this.PAUSER = new("PAUSER"); this.PAUSER.configure(this, 32, 0, "RW", 0, 'hffffffff, 1, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(PAUSER_bit_cg[bt]) PAUSER_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); endfunction : build endclass : soc_ifc_reg__CPTRA_MBOX_VALID_PAUSER // Reg - soc_ifc_reg::CPTRA_MBOX_PAUSER_LOCK class soc_ifc_reg__CPTRA_MBOX_PAUSER_LOCK extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + soc_ifc_reg__CPTRA_MBOX_PAUSER_LOCK_bit_cg LOCK_bit_cg[1]; + soc_ifc_reg__CPTRA_MBOX_PAUSER_LOCK_fld_cg fld_cg; rand uvm_reg_field LOCK; function new(string name = "soc_ifc_reg__CPTRA_MBOX_PAUSER_LOCK"); - super.new(name, 32, UVM_NO_COVERAGE); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); virtual function void build(); this.LOCK = new("LOCK"); this.LOCK.configure(this, 1, 0, "RW", 0, 'h0, 1, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(LOCK_bit_cg[bt]) LOCK_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); endfunction : build endclass : soc_ifc_reg__CPTRA_MBOX_PAUSER_LOCK // Reg - soc_ifc_reg::CPTRA_TRNG_VALID_PAUSER class soc_ifc_reg__CPTRA_TRNG_VALID_PAUSER extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + soc_ifc_reg__CPTRA_TRNG_VALID_PAUSER_bit_cg PAUSER_bit_cg[32]; + soc_ifc_reg__CPTRA_TRNG_VALID_PAUSER_fld_cg fld_cg; rand uvm_reg_field PAUSER; function new(string name = "soc_ifc_reg__CPTRA_TRNG_VALID_PAUSER"); - super.new(name, 32, UVM_NO_COVERAGE); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); virtual function void build(); this.PAUSER = new("PAUSER"); this.PAUSER.configure(this, 32, 0, "RW", 0, 'hffffffff, 1, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(PAUSER_bit_cg[bt]) PAUSER_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); endfunction : build endclass : soc_ifc_reg__CPTRA_TRNG_VALID_PAUSER // Reg - soc_ifc_reg::CPTRA_TRNG_PAUSER_LOCK class soc_ifc_reg__CPTRA_TRNG_PAUSER_LOCK extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + soc_ifc_reg__CPTRA_TRNG_PAUSER_LOCK_bit_cg LOCK_bit_cg[1]; + soc_ifc_reg__CPTRA_TRNG_PAUSER_LOCK_fld_cg fld_cg; rand uvm_reg_field LOCK; function new(string name = "soc_ifc_reg__CPTRA_TRNG_PAUSER_LOCK"); - super.new(name, 32, UVM_NO_COVERAGE); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); virtual function void build(); this.LOCK = new("LOCK"); this.LOCK.configure(this, 1, 0, "RW", 0, 'h0, 1, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(LOCK_bit_cg[bt]) LOCK_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); endfunction : build endclass : soc_ifc_reg__CPTRA_TRNG_PAUSER_LOCK // Reg - soc_ifc_reg::CPTRA_TRNG_DATA class soc_ifc_reg__CPTRA_TRNG_DATA extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + soc_ifc_reg__CPTRA_TRNG_DATA_bit_cg DATA_bit_cg[32]; + soc_ifc_reg__CPTRA_TRNG_DATA_fld_cg fld_cg; rand uvm_reg_field DATA; function new(string name = "soc_ifc_reg__CPTRA_TRNG_DATA"); - super.new(name, 32, UVM_NO_COVERAGE); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); virtual function void build(); this.DATA = new("DATA"); - this.DATA.configure(this, 32, 0, "RW", 0, 'h0, 1, 1, 0); + this.DATA.configure(this, 32, 0, "RW", 1, 'h0, 1, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(DATA_bit_cg[bt]) DATA_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); endfunction : build endclass : soc_ifc_reg__CPTRA_TRNG_DATA + // Reg - soc_ifc_reg::CPTRA_TRNG_CTRL + class soc_ifc_reg__CPTRA_TRNG_CTRL extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + soc_ifc_reg__CPTRA_TRNG_CTRL_bit_cg clear_bit_cg[1]; + soc_ifc_reg__CPTRA_TRNG_CTRL_fld_cg fld_cg; + rand uvm_reg_field clear; + + function new(string name = "soc_ifc_reg__CPTRA_TRNG_CTRL"); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); + endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); + + virtual function void build(); + this.clear = new("clear"); + this.clear.configure(this, 1, 0, "RW", 0, 'h0, 1, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(clear_bit_cg[bt]) clear_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); + endfunction : build + endclass : soc_ifc_reg__CPTRA_TRNG_CTRL + // Reg - soc_ifc_reg::CPTRA_TRNG_STATUS class soc_ifc_reg__CPTRA_TRNG_STATUS extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + soc_ifc_reg__CPTRA_TRNG_STATUS_bit_cg DATA_REQ_bit_cg[1]; + soc_ifc_reg__CPTRA_TRNG_STATUS_bit_cg DATA_WR_DONE_bit_cg[1]; + soc_ifc_reg__CPTRA_TRNG_STATUS_fld_cg fld_cg; rand uvm_reg_field DATA_REQ; rand uvm_reg_field DATA_WR_DONE; function new(string name = "soc_ifc_reg__CPTRA_TRNG_STATUS"); - super.new(name, 32, UVM_NO_COVERAGE); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); virtual function void build(); this.DATA_REQ = new("DATA_REQ"); this.DATA_REQ.configure(this, 1, 0, "RW", 0, 'h0, 1, 1, 0); this.DATA_WR_DONE = new("DATA_WR_DONE"); this.DATA_WR_DONE.configure(this, 1, 1, "RW", 1, 'h0, 1, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(DATA_REQ_bit_cg[bt]) DATA_REQ_bit_cg[bt] = new(); + foreach(DATA_WR_DONE_bit_cg[bt]) DATA_WR_DONE_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); endfunction : build endclass : soc_ifc_reg__CPTRA_TRNG_STATUS // Reg - soc_ifc_reg::CPTRA_FUSE_WR_DONE class soc_ifc_reg__CPTRA_FUSE_WR_DONE extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + soc_ifc_reg__CPTRA_FUSE_WR_DONE_bit_cg done_bit_cg[1]; + soc_ifc_reg__CPTRA_FUSE_WR_DONE_fld_cg fld_cg; rand uvm_reg_field done; function new(string name = "soc_ifc_reg__CPTRA_FUSE_WR_DONE"); - super.new(name, 32, UVM_NO_COVERAGE); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); virtual function void build(); this.done = new("done"); this.done.configure(this, 1, 0, "RW", 0, 'h0, 1, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(done_bit_cg[bt]) done_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); endfunction : build endclass : soc_ifc_reg__CPTRA_FUSE_WR_DONE // Reg - soc_ifc_reg::CPTRA_TIMER_CONFIG class soc_ifc_reg__CPTRA_TIMER_CONFIG extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + soc_ifc_reg__CPTRA_TIMER_CONFIG_bit_cg clk_period_bit_cg[32]; + soc_ifc_reg__CPTRA_TIMER_CONFIG_fld_cg fld_cg; rand uvm_reg_field clk_period; function new(string name = "soc_ifc_reg__CPTRA_TIMER_CONFIG"); - super.new(name, 32, UVM_NO_COVERAGE); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); virtual function void build(); this.clk_period = new("clk_period"); this.clk_period.configure(this, 32, 0, "RW", 0, 'h0, 1, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(clk_period_bit_cg[bt]) clk_period_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); endfunction : build endclass : soc_ifc_reg__CPTRA_TIMER_CONFIG // Reg - soc_ifc_reg::CPTRA_BOOTFSM_GO class soc_ifc_reg__CPTRA_BOOTFSM_GO extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + soc_ifc_reg__CPTRA_BOOTFSM_GO_bit_cg GO_bit_cg[1]; + soc_ifc_reg__CPTRA_BOOTFSM_GO_fld_cg fld_cg; rand uvm_reg_field GO; function new(string name = "soc_ifc_reg__CPTRA_BOOTFSM_GO"); - super.new(name, 32, UVM_NO_COVERAGE); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); virtual function void build(); this.GO = new("GO"); this.GO.configure(this, 1, 0, "RW", 1, 'h0, 1, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(GO_bit_cg[bt]) GO_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); endfunction : build endclass : soc_ifc_reg__CPTRA_BOOTFSM_GO // Reg - soc_ifc_reg::CPTRA_DBG_MANUF_SERVICE_REG class soc_ifc_reg__CPTRA_DBG_MANUF_SERVICE_REG extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + soc_ifc_reg__CPTRA_DBG_MANUF_SERVICE_REG_bit_cg DATA_bit_cg[32]; + soc_ifc_reg__CPTRA_DBG_MANUF_SERVICE_REG_fld_cg fld_cg; rand uvm_reg_field DATA; function new(string name = "soc_ifc_reg__CPTRA_DBG_MANUF_SERVICE_REG"); - super.new(name, 32, UVM_NO_COVERAGE); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); virtual function void build(); this.DATA = new("DATA"); this.DATA.configure(this, 32, 0, "RW", 1, 'h0, 1, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(DATA_bit_cg[bt]) DATA_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); endfunction : build endclass : soc_ifc_reg__CPTRA_DBG_MANUF_SERVICE_REG // Reg - soc_ifc_reg::CPTRA_CLK_GATING_EN class soc_ifc_reg__CPTRA_CLK_GATING_EN extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + soc_ifc_reg__CPTRA_CLK_GATING_EN_bit_cg clk_gating_en_bit_cg[1]; + soc_ifc_reg__CPTRA_CLK_GATING_EN_fld_cg fld_cg; rand uvm_reg_field clk_gating_en; function new(string name = "soc_ifc_reg__CPTRA_CLK_GATING_EN"); - super.new(name, 32, UVM_NO_COVERAGE); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); virtual function void build(); this.clk_gating_en = new("clk_gating_en"); this.clk_gating_en.configure(this, 1, 0, "RW", 0, 'h0, 1, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(clk_gating_en_bit_cg[bt]) clk_gating_en_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); endfunction : build endclass : soc_ifc_reg__CPTRA_CLK_GATING_EN // Reg - soc_ifc_reg::CPTRA_GENERIC_INPUT_WIRES class soc_ifc_reg__CPTRA_GENERIC_INPUT_WIRES extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + soc_ifc_reg__CPTRA_GENERIC_INPUT_WIRES_bit_cg generic_wires_bit_cg[32]; + soc_ifc_reg__CPTRA_GENERIC_INPUT_WIRES_fld_cg fld_cg; rand uvm_reg_field generic_wires; function new(string name = "soc_ifc_reg__CPTRA_GENERIC_INPUT_WIRES"); - super.new(name, 32, UVM_NO_COVERAGE); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); virtual function void build(); this.generic_wires = new("generic_wires"); this.generic_wires.configure(this, 32, 0, "RO", 1, 'h0, 1, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(generic_wires_bit_cg[bt]) generic_wires_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); endfunction : build endclass : soc_ifc_reg__CPTRA_GENERIC_INPUT_WIRES // Reg - soc_ifc_reg::CPTRA_GENERIC_OUTPUT_WIRES class soc_ifc_reg__CPTRA_GENERIC_OUTPUT_WIRES extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + soc_ifc_reg__CPTRA_GENERIC_OUTPUT_WIRES_bit_cg generic_wires_bit_cg[32]; + soc_ifc_reg__CPTRA_GENERIC_OUTPUT_WIRES_fld_cg fld_cg; rand uvm_reg_field generic_wires; function new(string name = "soc_ifc_reg__CPTRA_GENERIC_OUTPUT_WIRES"); - super.new(name, 32, UVM_NO_COVERAGE); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); virtual function void build(); this.generic_wires = new("generic_wires"); this.generic_wires.configure(this, 32, 0, "RW", 0, 'h0, 1, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(generic_wires_bit_cg[bt]) generic_wires_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); endfunction : build endclass : soc_ifc_reg__CPTRA_GENERIC_OUTPUT_WIRES // Reg - soc_ifc_reg::CPTRA_HW_REV_ID class soc_ifc_reg__CPTRA_HW_REV_ID extends uvm_reg; - rand uvm_reg_field REV_ID; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + soc_ifc_reg__CPTRA_HW_REV_ID_bit_cg CPTRA_GENERATION_bit_cg[16]; + soc_ifc_reg__CPTRA_HW_REV_ID_bit_cg SOC_STEPPING_ID_bit_cg[16]; + soc_ifc_reg__CPTRA_HW_REV_ID_fld_cg fld_cg; + rand uvm_reg_field CPTRA_GENERATION; + rand uvm_reg_field SOC_STEPPING_ID; function new(string name = "soc_ifc_reg__CPTRA_HW_REV_ID"); - super.new(name, 32, UVM_NO_COVERAGE); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); virtual function void build(); - this.REV_ID = new("REV_ID"); - this.REV_ID.configure(this, 32, 0, "RO", 0, 'h1, 1, 1, 0); + this.CPTRA_GENERATION = new("CPTRA_GENERATION"); + this.CPTRA_GENERATION.configure(this, 16, 0, "RO", 0, 'h1, 1, 1, 0); + this.SOC_STEPPING_ID = new("SOC_STEPPING_ID"); + this.SOC_STEPPING_ID.configure(this, 16, 16, "RO", 1, 'h0, 1, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(CPTRA_GENERATION_bit_cg[bt]) CPTRA_GENERATION_bit_cg[bt] = new(); + foreach(SOC_STEPPING_ID_bit_cg[bt]) SOC_STEPPING_ID_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); endfunction : build endclass : soc_ifc_reg__CPTRA_HW_REV_ID // Reg - soc_ifc_reg::CPTRA_FW_REV_ID class soc_ifc_reg__CPTRA_FW_REV_ID extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + soc_ifc_reg__CPTRA_FW_REV_ID_bit_cg REV_ID_bit_cg[32]; + soc_ifc_reg__CPTRA_FW_REV_ID_fld_cg fld_cg; rand uvm_reg_field REV_ID; function new(string name = "soc_ifc_reg__CPTRA_FW_REV_ID"); - super.new(name, 32, UVM_NO_COVERAGE); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); virtual function void build(); this.REV_ID = new("REV_ID"); this.REV_ID.configure(this, 32, 0, "RW", 0, 'h0, 1, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(REV_ID_bit_cg[bt]) REV_ID_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); endfunction : build endclass : soc_ifc_reg__CPTRA_FW_REV_ID // Reg - soc_ifc_reg::CPTRA_HW_CONFIG class soc_ifc_reg__CPTRA_HW_CONFIG extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + soc_ifc_reg__CPTRA_HW_CONFIG_bit_cg iTRNG_en_bit_cg[1]; + soc_ifc_reg__CPTRA_HW_CONFIG_bit_cg QSPI_en_bit_cg[1]; + soc_ifc_reg__CPTRA_HW_CONFIG_bit_cg I3C_en_bit_cg[1]; + soc_ifc_reg__CPTRA_HW_CONFIG_bit_cg UART_en_bit_cg[1]; + soc_ifc_reg__CPTRA_HW_CONFIG_fld_cg fld_cg; rand uvm_reg_field iTRNG_en; rand uvm_reg_field QSPI_en; rand uvm_reg_field I3C_en; rand uvm_reg_field UART_en; function new(string name = "soc_ifc_reg__CPTRA_HW_CONFIG"); - super.new(name, 32, UVM_NO_COVERAGE); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); virtual function void build(); this.iTRNG_en = new("iTRNG_en"); @@ -415,353 +928,1302 @@ package soc_ifc_reg_uvm; this.I3C_en.configure(this, 1, 2, "RO", 1, 'h0, 0, 1, 0); this.UART_en = new("UART_en"); this.UART_en.configure(this, 1, 3, "RO", 1, 'h0, 0, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(iTRNG_en_bit_cg[bt]) iTRNG_en_bit_cg[bt] = new(); + foreach(QSPI_en_bit_cg[bt]) QSPI_en_bit_cg[bt] = new(); + foreach(I3C_en_bit_cg[bt]) I3C_en_bit_cg[bt] = new(); + foreach(UART_en_bit_cg[bt]) UART_en_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); endfunction : build endclass : soc_ifc_reg__CPTRA_HW_CONFIG // Reg - soc_ifc_reg::CPTRA_WDT_TIMER1_EN class soc_ifc_reg__CPTRA_WDT_TIMER1_EN extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + soc_ifc_reg__CPTRA_WDT_TIMER1_EN_bit_cg timer1_en_bit_cg[1]; + soc_ifc_reg__CPTRA_WDT_TIMER1_EN_fld_cg fld_cg; rand uvm_reg_field timer1_en; function new(string name = "soc_ifc_reg__CPTRA_WDT_TIMER1_EN"); - super.new(name, 32, UVM_NO_COVERAGE); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); virtual function void build(); this.timer1_en = new("timer1_en"); this.timer1_en.configure(this, 1, 0, "RW", 0, 'h0, 1, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(timer1_en_bit_cg[bt]) timer1_en_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); endfunction : build endclass : soc_ifc_reg__CPTRA_WDT_TIMER1_EN // Reg - soc_ifc_reg::CPTRA_WDT_TIMER1_CTRL class soc_ifc_reg__CPTRA_WDT_TIMER1_CTRL extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + soc_ifc_reg__CPTRA_WDT_TIMER1_CTRL_bit_cg timer1_restart_bit_cg[1]; + soc_ifc_reg__CPTRA_WDT_TIMER1_CTRL_fld_cg fld_cg; rand uvm_reg_field timer1_restart; function new(string name = "soc_ifc_reg__CPTRA_WDT_TIMER1_CTRL"); - super.new(name, 32, UVM_NO_COVERAGE); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); virtual function void build(); this.timer1_restart = new("timer1_restart"); this.timer1_restart.configure(this, 1, 0, "RW", 0, 'h0, 1, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(timer1_restart_bit_cg[bt]) timer1_restart_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); endfunction : build endclass : soc_ifc_reg__CPTRA_WDT_TIMER1_CTRL // Reg - soc_ifc_reg::CPTRA_WDT_TIMER1_TIMEOUT_PERIOD class soc_ifc_reg__CPTRA_WDT_TIMER1_TIMEOUT_PERIOD extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + soc_ifc_reg__CPTRA_WDT_TIMER1_TIMEOUT_PERIOD_bit_cg timer1_timeout_period_bit_cg[32]; + soc_ifc_reg__CPTRA_WDT_TIMER1_TIMEOUT_PERIOD_fld_cg fld_cg; rand uvm_reg_field timer1_timeout_period; function new(string name = "soc_ifc_reg__CPTRA_WDT_TIMER1_TIMEOUT_PERIOD"); - super.new(name, 32, UVM_NO_COVERAGE); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); virtual function void build(); this.timer1_timeout_period = new("timer1_timeout_period"); this.timer1_timeout_period.configure(this, 32, 0, "RW", 0, 'hffffffff, 1, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(timer1_timeout_period_bit_cg[bt]) timer1_timeout_period_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); endfunction : build endclass : soc_ifc_reg__CPTRA_WDT_TIMER1_TIMEOUT_PERIOD // Reg - soc_ifc_reg::CPTRA_WDT_TIMER2_EN class soc_ifc_reg__CPTRA_WDT_TIMER2_EN extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + soc_ifc_reg__CPTRA_WDT_TIMER2_EN_bit_cg timer2_en_bit_cg[1]; + soc_ifc_reg__CPTRA_WDT_TIMER2_EN_fld_cg fld_cg; rand uvm_reg_field timer2_en; function new(string name = "soc_ifc_reg__CPTRA_WDT_TIMER2_EN"); - super.new(name, 32, UVM_NO_COVERAGE); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); virtual function void build(); this.timer2_en = new("timer2_en"); this.timer2_en.configure(this, 1, 0, "RW", 0, 'h0, 1, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(timer2_en_bit_cg[bt]) timer2_en_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); endfunction : build endclass : soc_ifc_reg__CPTRA_WDT_TIMER2_EN // Reg - soc_ifc_reg::CPTRA_WDT_TIMER2_CTRL class soc_ifc_reg__CPTRA_WDT_TIMER2_CTRL extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + soc_ifc_reg__CPTRA_WDT_TIMER2_CTRL_bit_cg timer2_restart_bit_cg[1]; + soc_ifc_reg__CPTRA_WDT_TIMER2_CTRL_fld_cg fld_cg; rand uvm_reg_field timer2_restart; function new(string name = "soc_ifc_reg__CPTRA_WDT_TIMER2_CTRL"); - super.new(name, 32, UVM_NO_COVERAGE); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); virtual function void build(); this.timer2_restart = new("timer2_restart"); this.timer2_restart.configure(this, 1, 0, "RW", 0, 'h0, 1, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(timer2_restart_bit_cg[bt]) timer2_restart_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); endfunction : build endclass : soc_ifc_reg__CPTRA_WDT_TIMER2_CTRL // Reg - soc_ifc_reg::CPTRA_WDT_TIMER2_TIMEOUT_PERIOD class soc_ifc_reg__CPTRA_WDT_TIMER2_TIMEOUT_PERIOD extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + soc_ifc_reg__CPTRA_WDT_TIMER2_TIMEOUT_PERIOD_bit_cg timer2_timeout_period_bit_cg[32]; + soc_ifc_reg__CPTRA_WDT_TIMER2_TIMEOUT_PERIOD_fld_cg fld_cg; rand uvm_reg_field timer2_timeout_period; function new(string name = "soc_ifc_reg__CPTRA_WDT_TIMER2_TIMEOUT_PERIOD"); - super.new(name, 32, UVM_NO_COVERAGE); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); virtual function void build(); this.timer2_timeout_period = new("timer2_timeout_period"); this.timer2_timeout_period.configure(this, 32, 0, "RW", 0, 'hffffffff, 1, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(timer2_timeout_period_bit_cg[bt]) timer2_timeout_period_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); endfunction : build endclass : soc_ifc_reg__CPTRA_WDT_TIMER2_TIMEOUT_PERIOD // Reg - soc_ifc_reg::CPTRA_WDT_STATUS class soc_ifc_reg__CPTRA_WDT_STATUS extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + soc_ifc_reg__CPTRA_WDT_STATUS_bit_cg t1_timeout_bit_cg[1]; + soc_ifc_reg__CPTRA_WDT_STATUS_bit_cg t2_timeout_bit_cg[1]; + soc_ifc_reg__CPTRA_WDT_STATUS_fld_cg fld_cg; rand uvm_reg_field t1_timeout; rand uvm_reg_field t2_timeout; function new(string name = "soc_ifc_reg__CPTRA_WDT_STATUS"); - super.new(name, 32, UVM_NO_COVERAGE); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); virtual function void build(); this.t1_timeout = new("t1_timeout"); this.t1_timeout.configure(this, 1, 0, "RW", 1, 'h0, 1, 1, 0); this.t2_timeout = new("t2_timeout"); this.t2_timeout.configure(this, 1, 1, "RW", 1, 'h0, 1, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(t1_timeout_bit_cg[bt]) t1_timeout_bit_cg[bt] = new(); + foreach(t2_timeout_bit_cg[bt]) t2_timeout_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); endfunction : build endclass : soc_ifc_reg__CPTRA_WDT_STATUS + // Reg - soc_ifc_reg::CPTRA_FUSE_VALID_PAUSER + class soc_ifc_reg__CPTRA_FUSE_VALID_PAUSER extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + soc_ifc_reg__CPTRA_FUSE_VALID_PAUSER_bit_cg PAUSER_bit_cg[32]; + soc_ifc_reg__CPTRA_FUSE_VALID_PAUSER_fld_cg fld_cg; + rand uvm_reg_field PAUSER; + + function new(string name = "soc_ifc_reg__CPTRA_FUSE_VALID_PAUSER"); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); + endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); + + virtual function void build(); + this.PAUSER = new("PAUSER"); + this.PAUSER.configure(this, 32, 0, "RW", 0, 'hffffffff, 1, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(PAUSER_bit_cg[bt]) PAUSER_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); + endfunction : build + endclass : soc_ifc_reg__CPTRA_FUSE_VALID_PAUSER + + // Reg - soc_ifc_reg::CPTRA_FUSE_PAUSER_LOCK + class soc_ifc_reg__CPTRA_FUSE_PAUSER_LOCK extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + soc_ifc_reg__CPTRA_FUSE_PAUSER_LOCK_bit_cg LOCK_bit_cg[1]; + soc_ifc_reg__CPTRA_FUSE_PAUSER_LOCK_fld_cg fld_cg; + rand uvm_reg_field LOCK; + + function new(string name = "soc_ifc_reg__CPTRA_FUSE_PAUSER_LOCK"); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); + endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); + + virtual function void build(); + this.LOCK = new("LOCK"); + this.LOCK.configure(this, 1, 0, "RW", 0, 'h0, 1, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(LOCK_bit_cg[bt]) LOCK_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); + endfunction : build + endclass : soc_ifc_reg__CPTRA_FUSE_PAUSER_LOCK + + // Reg - soc_ifc_reg::CPTRA_WDT_CFG + class soc_ifc_reg__CPTRA_WDT_CFG extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + soc_ifc_reg__CPTRA_WDT_CFG_bit_cg TIMEOUT_bit_cg[32]; + soc_ifc_reg__CPTRA_WDT_CFG_fld_cg fld_cg; + rand uvm_reg_field TIMEOUT; + + function new(string name = "soc_ifc_reg__CPTRA_WDT_CFG"); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); + endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); + + virtual function void build(); + this.TIMEOUT = new("TIMEOUT"); + this.TIMEOUT.configure(this, 32, 0, "RW", 0, 'h0, 1, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(TIMEOUT_bit_cg[bt]) TIMEOUT_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); + endfunction : build + endclass : soc_ifc_reg__CPTRA_WDT_CFG + + // Reg - soc_ifc_reg::CPTRA_iTRNG_ENTROPY_CONFIG_0 + class soc_ifc_reg__CPTRA_iTRNG_ENTROPY_CONFIG_0 extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + soc_ifc_reg__CPTRA_iTRNG_ENTROPY_CONFIG_0_bit_cg low_threshold_bit_cg[16]; + soc_ifc_reg__CPTRA_iTRNG_ENTROPY_CONFIG_0_bit_cg high_threshold_bit_cg[16]; + soc_ifc_reg__CPTRA_iTRNG_ENTROPY_CONFIG_0_fld_cg fld_cg; + rand uvm_reg_field low_threshold; + rand uvm_reg_field high_threshold; + + function new(string name = "soc_ifc_reg__CPTRA_iTRNG_ENTROPY_CONFIG_0"); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); + endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); + + virtual function void build(); + this.low_threshold = new("low_threshold"); + this.low_threshold.configure(this, 16, 0, "RW", 0, 'h0, 1, 1, 0); + this.high_threshold = new("high_threshold"); + this.high_threshold.configure(this, 16, 16, "RW", 0, 'h0, 1, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(low_threshold_bit_cg[bt]) low_threshold_bit_cg[bt] = new(); + foreach(high_threshold_bit_cg[bt]) high_threshold_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); + endfunction : build + endclass : soc_ifc_reg__CPTRA_iTRNG_ENTROPY_CONFIG_0 + + // Reg - soc_ifc_reg::CPTRA_iTRNG_ENTROPY_CONFIG_1 + class soc_ifc_reg__CPTRA_iTRNG_ENTROPY_CONFIG_1 extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + soc_ifc_reg__CPTRA_iTRNG_ENTROPY_CONFIG_1_bit_cg repetition_count_bit_cg[16]; + soc_ifc_reg__CPTRA_iTRNG_ENTROPY_CONFIG_1_bit_cg RSVD_bit_cg[16]; + soc_ifc_reg__CPTRA_iTRNG_ENTROPY_CONFIG_1_fld_cg fld_cg; + rand uvm_reg_field repetition_count; + rand uvm_reg_field RSVD; + + function new(string name = "soc_ifc_reg__CPTRA_iTRNG_ENTROPY_CONFIG_1"); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); + endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); + + virtual function void build(); + this.repetition_count = new("repetition_count"); + this.repetition_count.configure(this, 16, 0, "RW", 0, 'h0, 1, 1, 0); + this.RSVD = new("RSVD"); + this.RSVD.configure(this, 16, 16, "RW", 0, 'h0, 1, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(repetition_count_bit_cg[bt]) repetition_count_bit_cg[bt] = new(); + foreach(RSVD_bit_cg[bt]) RSVD_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); + endfunction : build + endclass : soc_ifc_reg__CPTRA_iTRNG_ENTROPY_CONFIG_1 + + // Reg - soc_ifc_reg::CPTRA_RSVD_REG + class soc_ifc_reg__CPTRA_RSVD_REG extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + soc_ifc_reg__CPTRA_RSVD_REG_bit_cg RSVD_bit_cg[32]; + soc_ifc_reg__CPTRA_RSVD_REG_fld_cg fld_cg; + rand uvm_reg_field RSVD; + + function new(string name = "soc_ifc_reg__CPTRA_RSVD_REG"); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); + endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); + + virtual function void build(); + this.RSVD = new("RSVD"); + this.RSVD.configure(this, 32, 0, "RW", 0, 'h0, 1, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(RSVD_bit_cg[bt]) RSVD_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); + endfunction : build + endclass : soc_ifc_reg__CPTRA_RSVD_REG + // Reg - soc_ifc_reg::fuse_uds_seed class soc_ifc_reg__fuse_uds_seed extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + soc_ifc_reg__fuse_uds_seed_bit_cg seed_bit_cg[32]; + soc_ifc_reg__fuse_uds_seed_fld_cg fld_cg; rand uvm_reg_field seed; function new(string name = "soc_ifc_reg__fuse_uds_seed"); - super.new(name, 32, UVM_NO_COVERAGE); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); virtual function void build(); this.seed = new("seed"); this.seed.configure(this, 32, 0, "WO1", 1, 'h0, 1, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(seed_bit_cg[bt]) seed_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); endfunction : build endclass : soc_ifc_reg__fuse_uds_seed // Reg - soc_ifc_reg::fuse_field_entropy class soc_ifc_reg__fuse_field_entropy extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + soc_ifc_reg__fuse_field_entropy_bit_cg seed_bit_cg[32]; + soc_ifc_reg__fuse_field_entropy_fld_cg fld_cg; rand uvm_reg_field seed; function new(string name = "soc_ifc_reg__fuse_field_entropy"); - super.new(name, 32, UVM_NO_COVERAGE); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); virtual function void build(); this.seed = new("seed"); this.seed.configure(this, 32, 0, "WO1", 1, 'h0, 1, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(seed_bit_cg[bt]) seed_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); endfunction : build endclass : soc_ifc_reg__fuse_field_entropy // Reg - soc_ifc_reg::fuse_key_manifest_pk_hash class soc_ifc_reg__fuse_key_manifest_pk_hash extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + soc_ifc_reg__fuse_key_manifest_pk_hash_bit_cg hash_bit_cg[32]; + soc_ifc_reg__fuse_key_manifest_pk_hash_fld_cg fld_cg; rand uvm_reg_field hash; function new(string name = "soc_ifc_reg__fuse_key_manifest_pk_hash"); - super.new(name, 32, UVM_NO_COVERAGE); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); virtual function void build(); this.hash = new("hash"); this.hash.configure(this, 32, 0, "RW", 0, 'h0, 1, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(hash_bit_cg[bt]) hash_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); endfunction : build endclass : soc_ifc_reg__fuse_key_manifest_pk_hash // Reg - soc_ifc_reg::fuse_key_manifest_pk_hash_mask class soc_ifc_reg__fuse_key_manifest_pk_hash_mask extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + soc_ifc_reg__fuse_key_manifest_pk_hash_mask_bit_cg mask_bit_cg[4]; + soc_ifc_reg__fuse_key_manifest_pk_hash_mask_fld_cg fld_cg; rand uvm_reg_field mask; function new(string name = "soc_ifc_reg__fuse_key_manifest_pk_hash_mask"); - super.new(name, 32, UVM_NO_COVERAGE); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); virtual function void build(); this.mask = new("mask"); this.mask.configure(this, 4, 0, "RW", 0, 'h0, 1, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(mask_bit_cg[bt]) mask_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); endfunction : build endclass : soc_ifc_reg__fuse_key_manifest_pk_hash_mask // Reg - soc_ifc_reg::fuse_owner_pk_hash class soc_ifc_reg__fuse_owner_pk_hash extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + soc_ifc_reg__fuse_owner_pk_hash_bit_cg hash_bit_cg[32]; + soc_ifc_reg__fuse_owner_pk_hash_fld_cg fld_cg; rand uvm_reg_field hash; function new(string name = "soc_ifc_reg__fuse_owner_pk_hash"); - super.new(name, 32, UVM_NO_COVERAGE); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); virtual function void build(); this.hash = new("hash"); this.hash.configure(this, 32, 0, "RW", 0, 'h0, 1, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(hash_bit_cg[bt]) hash_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); endfunction : build endclass : soc_ifc_reg__fuse_owner_pk_hash // Reg - soc_ifc_reg::fuse_fmc_key_manifest_svn class soc_ifc_reg__fuse_fmc_key_manifest_svn extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + soc_ifc_reg__fuse_fmc_key_manifest_svn_bit_cg svn_bit_cg[32]; + soc_ifc_reg__fuse_fmc_key_manifest_svn_fld_cg fld_cg; rand uvm_reg_field svn; function new(string name = "soc_ifc_reg__fuse_fmc_key_manifest_svn"); - super.new(name, 32, UVM_NO_COVERAGE); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); virtual function void build(); this.svn = new("svn"); this.svn.configure(this, 32, 0, "RW", 0, 'h0, 1, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(svn_bit_cg[bt]) svn_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); endfunction : build endclass : soc_ifc_reg__fuse_fmc_key_manifest_svn // Reg - soc_ifc_reg::fuse_runtime_svn class soc_ifc_reg__fuse_runtime_svn extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + soc_ifc_reg__fuse_runtime_svn_bit_cg svn_bit_cg[32]; + soc_ifc_reg__fuse_runtime_svn_fld_cg fld_cg; rand uvm_reg_field svn; function new(string name = "soc_ifc_reg__fuse_runtime_svn"); - super.new(name, 32, UVM_NO_COVERAGE); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); virtual function void build(); this.svn = new("svn"); this.svn.configure(this, 32, 0, "RW", 0, 'h0, 1, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(svn_bit_cg[bt]) svn_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); endfunction : build endclass : soc_ifc_reg__fuse_runtime_svn // Reg - soc_ifc_reg::fuse_anti_rollback_disable class soc_ifc_reg__fuse_anti_rollback_disable extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + soc_ifc_reg__fuse_anti_rollback_disable_bit_cg dis_bit_cg[1]; + soc_ifc_reg__fuse_anti_rollback_disable_fld_cg fld_cg; rand uvm_reg_field dis; function new(string name = "soc_ifc_reg__fuse_anti_rollback_disable"); - super.new(name, 32, UVM_NO_COVERAGE); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); virtual function void build(); this.dis = new("dis"); this.dis.configure(this, 1, 0, "RW", 0, 'h0, 1, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(dis_bit_cg[bt]) dis_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); endfunction : build endclass : soc_ifc_reg__fuse_anti_rollback_disable // Reg - soc_ifc_reg::fuse_idevid_cert_attr class soc_ifc_reg__fuse_idevid_cert_attr extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + soc_ifc_reg__fuse_idevid_cert_attr_bit_cg cert_bit_cg[32]; + soc_ifc_reg__fuse_idevid_cert_attr_fld_cg fld_cg; rand uvm_reg_field cert; function new(string name = "soc_ifc_reg__fuse_idevid_cert_attr"); - super.new(name, 32, UVM_NO_COVERAGE); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); virtual function void build(); this.cert = new("cert"); this.cert.configure(this, 32, 0, "RW", 0, 'h0, 1, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(cert_bit_cg[bt]) cert_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); endfunction : build endclass : soc_ifc_reg__fuse_idevid_cert_attr // Reg - soc_ifc_reg::fuse_idevid_manuf_hsm_id class soc_ifc_reg__fuse_idevid_manuf_hsm_id extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + soc_ifc_reg__fuse_idevid_manuf_hsm_id_bit_cg hsm_id_bit_cg[32]; + soc_ifc_reg__fuse_idevid_manuf_hsm_id_fld_cg fld_cg; rand uvm_reg_field hsm_id; function new(string name = "soc_ifc_reg__fuse_idevid_manuf_hsm_id"); - super.new(name, 32, UVM_NO_COVERAGE); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); virtual function void build(); this.hsm_id = new("hsm_id"); this.hsm_id.configure(this, 32, 0, "RW", 0, 'h0, 1, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(hsm_id_bit_cg[bt]) hsm_id_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); endfunction : build endclass : soc_ifc_reg__fuse_idevid_manuf_hsm_id // Reg - soc_ifc_reg::fuse_life_cycle class soc_ifc_reg__fuse_life_cycle extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + soc_ifc_reg__fuse_life_cycle_bit_cg life_cycle_bit_cg[2]; + soc_ifc_reg__fuse_life_cycle_fld_cg fld_cg; rand uvm_reg_field life_cycle; function new(string name = "soc_ifc_reg__fuse_life_cycle"); - super.new(name, 32, UVM_NO_COVERAGE); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); virtual function void build(); this.life_cycle = new("life_cycle"); this.life_cycle.configure(this, 2, 0, "RW", 0, 'h0, 1, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(life_cycle_bit_cg[bt]) life_cycle_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); endfunction : build endclass : soc_ifc_reg__fuse_life_cycle + // Reg - soc_ifc_reg::fuse_lms_verify + class soc_ifc_reg__fuse_lms_verify extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + soc_ifc_reg__fuse_lms_verify_bit_cg lms_verify_bit_cg[1]; + soc_ifc_reg__fuse_lms_verify_fld_cg fld_cg; + rand uvm_reg_field lms_verify; + + function new(string name = "soc_ifc_reg__fuse_lms_verify"); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); + endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); + + virtual function void build(); + this.lms_verify = new("lms_verify"); + this.lms_verify.configure(this, 1, 0, "RW", 0, 'h0, 1, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(lms_verify_bit_cg[bt]) lms_verify_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); + endfunction : build + endclass : soc_ifc_reg__fuse_lms_verify + + // Reg - soc_ifc_reg::fuse_lms_revocation + class soc_ifc_reg__fuse_lms_revocation extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + soc_ifc_reg__fuse_lms_revocation_bit_cg lms_revocation_bit_cg[32]; + soc_ifc_reg__fuse_lms_revocation_fld_cg fld_cg; + rand uvm_reg_field lms_revocation; + + function new(string name = "soc_ifc_reg__fuse_lms_revocation"); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); + endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); + + virtual function void build(); + this.lms_revocation = new("lms_revocation"); + this.lms_revocation.configure(this, 32, 0, "RW", 0, 'h0, 1, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(lms_revocation_bit_cg[bt]) lms_revocation_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); + endfunction : build + endclass : soc_ifc_reg__fuse_lms_revocation + + // Reg - soc_ifc_reg::fuse_soc_stepping_id + class soc_ifc_reg__fuse_soc_stepping_id extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + soc_ifc_reg__fuse_soc_stepping_id_bit_cg soc_stepping_id_bit_cg[16]; + soc_ifc_reg__fuse_soc_stepping_id_fld_cg fld_cg; + rand uvm_reg_field soc_stepping_id; + + function new(string name = "soc_ifc_reg__fuse_soc_stepping_id"); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); + endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); + + virtual function void build(); + this.soc_stepping_id = new("soc_stepping_id"); + this.soc_stepping_id.configure(this, 16, 0, "RW", 0, 'h0, 1, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(soc_stepping_id_bit_cg[bt]) soc_stepping_id_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); + endfunction : build + endclass : soc_ifc_reg__fuse_soc_stepping_id + // Reg - soc_ifc_reg::internal_obf_key class soc_ifc_reg__internal_obf_key extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + soc_ifc_reg__internal_obf_key_bit_cg key_bit_cg[32]; + soc_ifc_reg__internal_obf_key_fld_cg fld_cg; rand uvm_reg_field key; function new(string name = "soc_ifc_reg__internal_obf_key"); - super.new(name, 32, UVM_NO_COVERAGE); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); virtual function void build(); this.key = new("key"); this.key.configure(this, 32, 0, "WO", 1, 'h0, 0, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(key_bit_cg[bt]) key_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); endfunction : build endclass : soc_ifc_reg__internal_obf_key // Reg - soc_ifc_reg::internal_iccm_lock class soc_ifc_reg__internal_iccm_lock extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + soc_ifc_reg__internal_iccm_lock_bit_cg lock_bit_cg[1]; + soc_ifc_reg__internal_iccm_lock_fld_cg fld_cg; rand uvm_reg_field lock; function new(string name = "soc_ifc_reg__internal_iccm_lock"); - super.new(name, 32, UVM_NO_COVERAGE); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); virtual function void build(); this.lock = new("lock"); this.lock.configure(this, 1, 0, "W1S", 1, 'h0, 1, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(lock_bit_cg[bt]) lock_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); endfunction : build endclass : soc_ifc_reg__internal_iccm_lock // Reg - soc_ifc_reg::internal_fw_update_reset class soc_ifc_reg__internal_fw_update_reset extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + soc_ifc_reg__internal_fw_update_reset_bit_cg core_rst_bit_cg[1]; + soc_ifc_reg__internal_fw_update_reset_fld_cg fld_cg; rand uvm_reg_field core_rst; function new(string name = "soc_ifc_reg__internal_fw_update_reset"); - super.new(name, 32, UVM_NO_COVERAGE); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); virtual function void build(); this.core_rst = new("core_rst"); this.core_rst.configure(this, 1, 0, "RW", 0, 'h0, 1, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(core_rst_bit_cg[bt]) core_rst_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); endfunction : build endclass : soc_ifc_reg__internal_fw_update_reset // Reg - soc_ifc_reg::internal_fw_update_reset_wait_cycles class soc_ifc_reg__internal_fw_update_reset_wait_cycles extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + soc_ifc_reg__internal_fw_update_reset_wait_cycles_bit_cg wait_cycles_bit_cg[8]; + soc_ifc_reg__internal_fw_update_reset_wait_cycles_fld_cg fld_cg; rand uvm_reg_field wait_cycles; function new(string name = "soc_ifc_reg__internal_fw_update_reset_wait_cycles"); - super.new(name, 32, UVM_NO_COVERAGE); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); virtual function void build(); this.wait_cycles = new("wait_cycles"); this.wait_cycles.configure(this, 8, 0, "RW", 0, 'h5, 1, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(wait_cycles_bit_cg[bt]) wait_cycles_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); endfunction : build endclass : soc_ifc_reg__internal_fw_update_reset_wait_cycles // Reg - soc_ifc_reg::internal_nmi_vector class soc_ifc_reg__internal_nmi_vector extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + soc_ifc_reg__internal_nmi_vector_bit_cg vec_bit_cg[32]; + soc_ifc_reg__internal_nmi_vector_fld_cg fld_cg; rand uvm_reg_field vec; function new(string name = "soc_ifc_reg__internal_nmi_vector"); - super.new(name, 32, UVM_NO_COVERAGE); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); virtual function void build(); this.vec = new("vec"); this.vec.configure(this, 32, 0, "RW", 0, 'h0, 1, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(vec_bit_cg[bt]) vec_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); endfunction : build endclass : soc_ifc_reg__internal_nmi_vector + // Reg - soc_ifc_reg::internal_hw_error_fatal_mask + class soc_ifc_reg__internal_hw_error_fatal_mask extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + soc_ifc_reg__internal_hw_error_fatal_mask_bit_cg mask_iccm_ecc_unc_bit_cg[1]; + soc_ifc_reg__internal_hw_error_fatal_mask_bit_cg mask_dccm_ecc_unc_bit_cg[1]; + soc_ifc_reg__internal_hw_error_fatal_mask_bit_cg mask_nmi_pin_bit_cg[1]; + soc_ifc_reg__internal_hw_error_fatal_mask_fld_cg fld_cg; + rand uvm_reg_field mask_iccm_ecc_unc; + rand uvm_reg_field mask_dccm_ecc_unc; + rand uvm_reg_field mask_nmi_pin; + + function new(string name = "soc_ifc_reg__internal_hw_error_fatal_mask"); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); + endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); + + virtual function void build(); + this.mask_iccm_ecc_unc = new("mask_iccm_ecc_unc"); + this.mask_iccm_ecc_unc.configure(this, 1, 0, "RW", 0, 'h0, 1, 1, 0); + this.mask_dccm_ecc_unc = new("mask_dccm_ecc_unc"); + this.mask_dccm_ecc_unc.configure(this, 1, 1, "RW", 0, 'h0, 1, 1, 0); + this.mask_nmi_pin = new("mask_nmi_pin"); + this.mask_nmi_pin.configure(this, 1, 2, "RW", 0, 'h0, 1, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(mask_iccm_ecc_unc_bit_cg[bt]) mask_iccm_ecc_unc_bit_cg[bt] = new(); + foreach(mask_dccm_ecc_unc_bit_cg[bt]) mask_dccm_ecc_unc_bit_cg[bt] = new(); + foreach(mask_nmi_pin_bit_cg[bt]) mask_nmi_pin_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); + endfunction : build + endclass : soc_ifc_reg__internal_hw_error_fatal_mask + + // Reg - soc_ifc_reg::internal_hw_error_non_fatal_mask + class soc_ifc_reg__internal_hw_error_non_fatal_mask extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + soc_ifc_reg__internal_hw_error_non_fatal_mask_bit_cg mask_mbox_prot_no_lock_bit_cg[1]; + soc_ifc_reg__internal_hw_error_non_fatal_mask_bit_cg mask_mbox_prot_ooo_bit_cg[1]; + soc_ifc_reg__internal_hw_error_non_fatal_mask_bit_cg mask_mbox_ecc_unc_bit_cg[1]; + soc_ifc_reg__internal_hw_error_non_fatal_mask_fld_cg fld_cg; + rand uvm_reg_field mask_mbox_prot_no_lock; + rand uvm_reg_field mask_mbox_prot_ooo; + rand uvm_reg_field mask_mbox_ecc_unc; + + function new(string name = "soc_ifc_reg__internal_hw_error_non_fatal_mask"); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); + endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); + + virtual function void build(); + this.mask_mbox_prot_no_lock = new("mask_mbox_prot_no_lock"); + this.mask_mbox_prot_no_lock.configure(this, 1, 0, "RW", 0, 'h0, 1, 1, 0); + this.mask_mbox_prot_ooo = new("mask_mbox_prot_ooo"); + this.mask_mbox_prot_ooo.configure(this, 1, 1, "RW", 0, 'h0, 1, 1, 0); + this.mask_mbox_ecc_unc = new("mask_mbox_ecc_unc"); + this.mask_mbox_ecc_unc.configure(this, 1, 2, "RW", 0, 'h0, 1, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(mask_mbox_prot_no_lock_bit_cg[bt]) mask_mbox_prot_no_lock_bit_cg[bt] = new(); + foreach(mask_mbox_prot_ooo_bit_cg[bt]) mask_mbox_prot_ooo_bit_cg[bt] = new(); + foreach(mask_mbox_ecc_unc_bit_cg[bt]) mask_mbox_ecc_unc_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); + endfunction : build + endclass : soc_ifc_reg__internal_hw_error_non_fatal_mask + + // Reg - soc_ifc_reg::internal_fw_error_fatal_mask + class soc_ifc_reg__internal_fw_error_fatal_mask extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + soc_ifc_reg__internal_fw_error_fatal_mask_bit_cg mask_bit_cg[32]; + soc_ifc_reg__internal_fw_error_fatal_mask_fld_cg fld_cg; + rand uvm_reg_field mask; + + function new(string name = "soc_ifc_reg__internal_fw_error_fatal_mask"); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); + endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); + + virtual function void build(); + this.mask = new("mask"); + this.mask.configure(this, 32, 0, "RW", 0, 'h0, 1, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(mask_bit_cg[bt]) mask_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); + endfunction : build + endclass : soc_ifc_reg__internal_fw_error_fatal_mask + + // Reg - soc_ifc_reg::internal_fw_error_non_fatal_mask + class soc_ifc_reg__internal_fw_error_non_fatal_mask extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + soc_ifc_reg__internal_fw_error_non_fatal_mask_bit_cg mask_bit_cg[32]; + soc_ifc_reg__internal_fw_error_non_fatal_mask_fld_cg fld_cg; + rand uvm_reg_field mask; + + function new(string name = "soc_ifc_reg__internal_fw_error_non_fatal_mask"); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); + endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); + + virtual function void build(); + this.mask = new("mask"); + this.mask.configure(this, 32, 0, "RW", 0, 'h0, 1, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(mask_bit_cg[bt]) mask_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); + endfunction : build + endclass : soc_ifc_reg__internal_fw_error_non_fatal_mask + + // Reg - soc_ifc_reg::internal_rv_mtime_l + class soc_ifc_reg__internal_rv_mtime_l extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + soc_ifc_reg__internal_rv_mtime_l_bit_cg count_l_bit_cg[32]; + soc_ifc_reg__internal_rv_mtime_l_fld_cg fld_cg; + rand uvm_reg_field count_l; + + function new(string name = "soc_ifc_reg__internal_rv_mtime_l"); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); + endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); + + virtual function void build(); + this.count_l = new("count_l"); + this.count_l.configure(this, 32, 0, "RW", 1, 'h0, 1, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(count_l_bit_cg[bt]) count_l_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); + endfunction : build + endclass : soc_ifc_reg__internal_rv_mtime_l + + // Reg - soc_ifc_reg::internal_rv_mtime_h + class soc_ifc_reg__internal_rv_mtime_h extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + soc_ifc_reg__internal_rv_mtime_h_bit_cg count_h_bit_cg[32]; + soc_ifc_reg__internal_rv_mtime_h_fld_cg fld_cg; + rand uvm_reg_field count_h; + + function new(string name = "soc_ifc_reg__internal_rv_mtime_h"); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); + endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); + + virtual function void build(); + this.count_h = new("count_h"); + this.count_h.configure(this, 32, 0, "RW", 1, 'h0, 1, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(count_h_bit_cg[bt]) count_h_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); + endfunction : build + endclass : soc_ifc_reg__internal_rv_mtime_h + + // Reg - soc_ifc_reg::internal_rv_mtimecmp_l + class soc_ifc_reg__internal_rv_mtimecmp_l extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + soc_ifc_reg__internal_rv_mtimecmp_l_bit_cg compare_l_bit_cg[32]; + soc_ifc_reg__internal_rv_mtimecmp_l_fld_cg fld_cg; + rand uvm_reg_field compare_l; + + function new(string name = "soc_ifc_reg__internal_rv_mtimecmp_l"); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); + endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); + + virtual function void build(); + this.compare_l = new("compare_l"); + this.compare_l.configure(this, 32, 0, "RW", 0, 'h0, 1, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(compare_l_bit_cg[bt]) compare_l_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); + endfunction : build + endclass : soc_ifc_reg__internal_rv_mtimecmp_l + + // Reg - soc_ifc_reg::internal_rv_mtimecmp_h + class soc_ifc_reg__internal_rv_mtimecmp_h extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + soc_ifc_reg__internal_rv_mtimecmp_h_bit_cg compare_h_bit_cg[32]; + soc_ifc_reg__internal_rv_mtimecmp_h_fld_cg fld_cg; + rand uvm_reg_field compare_h; + + function new(string name = "soc_ifc_reg__internal_rv_mtimecmp_h"); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); + endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); + + virtual function void build(); + this.compare_h = new("compare_h"); + this.compare_h.configure(this, 32, 0, "RW", 0, 'h0, 1, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(compare_h_bit_cg[bt]) compare_h_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); + endfunction : build + endclass : soc_ifc_reg__internal_rv_mtimecmp_h + // Reg - soc_ifc_reg::intr_block_t::global_intr_en_t class soc_ifc_reg__intr_block_t__global_intr_en_t extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + soc_ifc_reg__intr_block_t__global_intr_en_t_bit_cg error_en_bit_cg[1]; + soc_ifc_reg__intr_block_t__global_intr_en_t_bit_cg notif_en_bit_cg[1]; + soc_ifc_reg__intr_block_t__global_intr_en_t_fld_cg fld_cg; rand uvm_reg_field error_en; rand uvm_reg_field notif_en; function new(string name = "soc_ifc_reg__intr_block_t__global_intr_en_t"); - super.new(name, 32, UVM_NO_COVERAGE); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); virtual function void build(); this.error_en = new("error_en"); this.error_en.configure(this, 1, 0, "RW", 0, 'h0, 1, 1, 0); this.notif_en = new("notif_en"); this.notif_en.configure(this, 1, 1, "RW", 0, 'h0, 1, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(error_en_bit_cg[bt]) error_en_bit_cg[bt] = new(); + foreach(notif_en_bit_cg[bt]) notif_en_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); endfunction : build endclass : soc_ifc_reg__intr_block_t__global_intr_en_t // Reg - soc_ifc_reg::intr_block_t::error_intr_en_t class soc_ifc_reg__intr_block_t__error_intr_en_t extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + soc_ifc_reg__intr_block_t__error_intr_en_t_bit_cg error_internal_en_bit_cg[1]; + soc_ifc_reg__intr_block_t__error_intr_en_t_bit_cg error_inv_dev_en_bit_cg[1]; + soc_ifc_reg__intr_block_t__error_intr_en_t_bit_cg error_cmd_fail_en_bit_cg[1]; + soc_ifc_reg__intr_block_t__error_intr_en_t_bit_cg error_bad_fuse_en_bit_cg[1]; + soc_ifc_reg__intr_block_t__error_intr_en_t_bit_cg error_iccm_blocked_en_bit_cg[1]; + soc_ifc_reg__intr_block_t__error_intr_en_t_bit_cg error_mbox_ecc_unc_en_bit_cg[1]; + soc_ifc_reg__intr_block_t__error_intr_en_t_bit_cg error_wdt_timer1_timeout_en_bit_cg[1]; + soc_ifc_reg__intr_block_t__error_intr_en_t_bit_cg error_wdt_timer2_timeout_en_bit_cg[1]; + soc_ifc_reg__intr_block_t__error_intr_en_t_fld_cg fld_cg; rand uvm_reg_field error_internal_en; rand uvm_reg_field error_inv_dev_en; rand uvm_reg_field error_cmd_fail_en; @@ -772,8 +2234,13 @@ package soc_ifc_reg_uvm; rand uvm_reg_field error_wdt_timer2_timeout_en; function new(string name = "soc_ifc_reg__intr_block_t__error_intr_en_t"); - super.new(name, 32, UVM_NO_COVERAGE); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); virtual function void build(); this.error_internal_en = new("error_internal_en"); @@ -792,19 +2259,49 @@ package soc_ifc_reg_uvm; this.error_wdt_timer1_timeout_en.configure(this, 1, 6, "RW", 0, 'h0, 1, 1, 0); this.error_wdt_timer2_timeout_en = new("error_wdt_timer2_timeout_en"); this.error_wdt_timer2_timeout_en.configure(this, 1, 7, "RW", 0, 'h0, 1, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(error_internal_en_bit_cg[bt]) error_internal_en_bit_cg[bt] = new(); + foreach(error_inv_dev_en_bit_cg[bt]) error_inv_dev_en_bit_cg[bt] = new(); + foreach(error_cmd_fail_en_bit_cg[bt]) error_cmd_fail_en_bit_cg[bt] = new(); + foreach(error_bad_fuse_en_bit_cg[bt]) error_bad_fuse_en_bit_cg[bt] = new(); + foreach(error_iccm_blocked_en_bit_cg[bt]) error_iccm_blocked_en_bit_cg[bt] = new(); + foreach(error_mbox_ecc_unc_en_bit_cg[bt]) error_mbox_ecc_unc_en_bit_cg[bt] = new(); + foreach(error_wdt_timer1_timeout_en_bit_cg[bt]) error_wdt_timer1_timeout_en_bit_cg[bt] = new(); + foreach(error_wdt_timer2_timeout_en_bit_cg[bt]) error_wdt_timer2_timeout_en_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); endfunction : build endclass : soc_ifc_reg__intr_block_t__error_intr_en_t // Reg - soc_ifc_reg::intr_block_t::notif_intr_en_t class soc_ifc_reg__intr_block_t__notif_intr_en_t extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + soc_ifc_reg__intr_block_t__notif_intr_en_t_bit_cg notif_cmd_avail_en_bit_cg[1]; + soc_ifc_reg__intr_block_t__notif_intr_en_t_bit_cg notif_mbox_ecc_cor_en_bit_cg[1]; + soc_ifc_reg__intr_block_t__notif_intr_en_t_bit_cg notif_debug_locked_en_bit_cg[1]; + soc_ifc_reg__intr_block_t__notif_intr_en_t_bit_cg notif_scan_mode_en_bit_cg[1]; + soc_ifc_reg__intr_block_t__notif_intr_en_t_bit_cg notif_soc_req_lock_en_bit_cg[1]; + soc_ifc_reg__intr_block_t__notif_intr_en_t_bit_cg notif_gen_in_toggle_en_bit_cg[1]; + soc_ifc_reg__intr_block_t__notif_intr_en_t_fld_cg fld_cg; rand uvm_reg_field notif_cmd_avail_en; rand uvm_reg_field notif_mbox_ecc_cor_en; rand uvm_reg_field notif_debug_locked_en; + rand uvm_reg_field notif_scan_mode_en; rand uvm_reg_field notif_soc_req_lock_en; + rand uvm_reg_field notif_gen_in_toggle_en; function new(string name = "soc_ifc_reg__intr_block_t__notif_intr_en_t"); - super.new(name, 32, UVM_NO_COVERAGE); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); virtual function void build(); this.notif_cmd_avail_en = new("notif_cmd_avail_en"); @@ -813,41 +2310,100 @@ package soc_ifc_reg_uvm; this.notif_mbox_ecc_cor_en.configure(this, 1, 1, "RW", 0, 'h0, 1, 1, 0); this.notif_debug_locked_en = new("notif_debug_locked_en"); this.notif_debug_locked_en.configure(this, 1, 2, "RW", 0, 'h0, 1, 1, 0); + this.notif_scan_mode_en = new("notif_scan_mode_en"); + this.notif_scan_mode_en.configure(this, 1, 3, "RW", 0, 'h0, 1, 1, 0); this.notif_soc_req_lock_en = new("notif_soc_req_lock_en"); - this.notif_soc_req_lock_en.configure(this, 1, 3, "RW", 0, 'h0, 1, 1, 0); + this.notif_soc_req_lock_en.configure(this, 1, 4, "RW", 0, 'h0, 1, 1, 0); + this.notif_gen_in_toggle_en = new("notif_gen_in_toggle_en"); + this.notif_gen_in_toggle_en.configure(this, 1, 5, "RW", 0, 'h0, 1, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(notif_cmd_avail_en_bit_cg[bt]) notif_cmd_avail_en_bit_cg[bt] = new(); + foreach(notif_mbox_ecc_cor_en_bit_cg[bt]) notif_mbox_ecc_cor_en_bit_cg[bt] = new(); + foreach(notif_debug_locked_en_bit_cg[bt]) notif_debug_locked_en_bit_cg[bt] = new(); + foreach(notif_scan_mode_en_bit_cg[bt]) notif_scan_mode_en_bit_cg[bt] = new(); + foreach(notif_soc_req_lock_en_bit_cg[bt]) notif_soc_req_lock_en_bit_cg[bt] = new(); + foreach(notif_gen_in_toggle_en_bit_cg[bt]) notif_gen_in_toggle_en_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); endfunction : build endclass : soc_ifc_reg__intr_block_t__notif_intr_en_t // Reg - soc_ifc_reg::intr_block_t::global_intr_t_agg_sts_dd3dcf0a class soc_ifc_reg__intr_block_t__global_intr_t_agg_sts_dd3dcf0a extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + soc_ifc_reg__intr_block_t__global_intr_t_agg_sts_dd3dcf0a_bit_cg agg_sts_bit_cg[1]; + soc_ifc_reg__intr_block_t__global_intr_t_agg_sts_dd3dcf0a_fld_cg fld_cg; rand uvm_reg_field agg_sts; function new(string name = "soc_ifc_reg__intr_block_t__global_intr_t_agg_sts_dd3dcf0a"); - super.new(name, 32, UVM_NO_COVERAGE); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); virtual function void build(); this.agg_sts = new("agg_sts"); this.agg_sts.configure(this, 1, 0, "RO", 1, 'h0, 1, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(agg_sts_bit_cg[bt]) agg_sts_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); endfunction : build endclass : soc_ifc_reg__intr_block_t__global_intr_t_agg_sts_dd3dcf0a // Reg - soc_ifc_reg::intr_block_t::global_intr_t_agg_sts_e6399b4a class soc_ifc_reg__intr_block_t__global_intr_t_agg_sts_e6399b4a extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + soc_ifc_reg__intr_block_t__global_intr_t_agg_sts_e6399b4a_bit_cg agg_sts_bit_cg[1]; + soc_ifc_reg__intr_block_t__global_intr_t_agg_sts_e6399b4a_fld_cg fld_cg; rand uvm_reg_field agg_sts; function new(string name = "soc_ifc_reg__intr_block_t__global_intr_t_agg_sts_e6399b4a"); - super.new(name, 32, UVM_NO_COVERAGE); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); virtual function void build(); this.agg_sts = new("agg_sts"); this.agg_sts.configure(this, 1, 0, "RO", 1, 'h0, 1, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(agg_sts_bit_cg[bt]) agg_sts_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); endfunction : build endclass : soc_ifc_reg__intr_block_t__global_intr_t_agg_sts_e6399b4a // Reg - soc_ifc_reg::intr_block_t::error_intr_t_error_bad_fuse_sts_23f67582_error_cmd_fail_sts_b85845f8_error_iccm_blocked_sts_e81e6ad2_error_internal_sts_caad62e2_error_inv_dev_sts_6693e7db_error_mbox_ecc_unc_sts_30bff330_error_wdt_timer1_timeout_sts_6aaa9655_error_wdt_timer2_timeout_sts_cda8789f class soc_ifc_reg__intr_block_t__error_intr_t_error_bad_fuse_sts_23f67582_error_cmd_fail_sts_b85845f8_error_iccm_blocked_sts_e81e6ad2_error_internal_sts_caad62e2_error_inv_dev_sts_6693e7db_error_mbox_ecc_unc_sts_30bff330_error_wdt_timer1_timeout_sts_6aaa9655_error_wdt_timer2_timeout_sts_cda8789f extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + soc_ifc_reg__intr_block_t__error_intr_t_error_bad_fuse_sts_23f67582_error_cmd_fail_sts_b85845f8_error_iccm_blocked_sts_e81e6ad2_error_internal_sts_caad62e2_error_inv_dev_sts_6693e7db_error_mbox_ecc_unc_sts_30bff330_error_wdt_timer1_timeout_sts_6aaa9655_error_wdt_timer2_timeout_sts_cda8789f_bit_cg error_internal_sts_bit_cg[1]; + soc_ifc_reg__intr_block_t__error_intr_t_error_bad_fuse_sts_23f67582_error_cmd_fail_sts_b85845f8_error_iccm_blocked_sts_e81e6ad2_error_internal_sts_caad62e2_error_inv_dev_sts_6693e7db_error_mbox_ecc_unc_sts_30bff330_error_wdt_timer1_timeout_sts_6aaa9655_error_wdt_timer2_timeout_sts_cda8789f_bit_cg error_inv_dev_sts_bit_cg[1]; + soc_ifc_reg__intr_block_t__error_intr_t_error_bad_fuse_sts_23f67582_error_cmd_fail_sts_b85845f8_error_iccm_blocked_sts_e81e6ad2_error_internal_sts_caad62e2_error_inv_dev_sts_6693e7db_error_mbox_ecc_unc_sts_30bff330_error_wdt_timer1_timeout_sts_6aaa9655_error_wdt_timer2_timeout_sts_cda8789f_bit_cg error_cmd_fail_sts_bit_cg[1]; + soc_ifc_reg__intr_block_t__error_intr_t_error_bad_fuse_sts_23f67582_error_cmd_fail_sts_b85845f8_error_iccm_blocked_sts_e81e6ad2_error_internal_sts_caad62e2_error_inv_dev_sts_6693e7db_error_mbox_ecc_unc_sts_30bff330_error_wdt_timer1_timeout_sts_6aaa9655_error_wdt_timer2_timeout_sts_cda8789f_bit_cg error_bad_fuse_sts_bit_cg[1]; + soc_ifc_reg__intr_block_t__error_intr_t_error_bad_fuse_sts_23f67582_error_cmd_fail_sts_b85845f8_error_iccm_blocked_sts_e81e6ad2_error_internal_sts_caad62e2_error_inv_dev_sts_6693e7db_error_mbox_ecc_unc_sts_30bff330_error_wdt_timer1_timeout_sts_6aaa9655_error_wdt_timer2_timeout_sts_cda8789f_bit_cg error_iccm_blocked_sts_bit_cg[1]; + soc_ifc_reg__intr_block_t__error_intr_t_error_bad_fuse_sts_23f67582_error_cmd_fail_sts_b85845f8_error_iccm_blocked_sts_e81e6ad2_error_internal_sts_caad62e2_error_inv_dev_sts_6693e7db_error_mbox_ecc_unc_sts_30bff330_error_wdt_timer1_timeout_sts_6aaa9655_error_wdt_timer2_timeout_sts_cda8789f_bit_cg error_mbox_ecc_unc_sts_bit_cg[1]; + soc_ifc_reg__intr_block_t__error_intr_t_error_bad_fuse_sts_23f67582_error_cmd_fail_sts_b85845f8_error_iccm_blocked_sts_e81e6ad2_error_internal_sts_caad62e2_error_inv_dev_sts_6693e7db_error_mbox_ecc_unc_sts_30bff330_error_wdt_timer1_timeout_sts_6aaa9655_error_wdt_timer2_timeout_sts_cda8789f_bit_cg error_wdt_timer1_timeout_sts_bit_cg[1]; + soc_ifc_reg__intr_block_t__error_intr_t_error_bad_fuse_sts_23f67582_error_cmd_fail_sts_b85845f8_error_iccm_blocked_sts_e81e6ad2_error_internal_sts_caad62e2_error_inv_dev_sts_6693e7db_error_mbox_ecc_unc_sts_30bff330_error_wdt_timer1_timeout_sts_6aaa9655_error_wdt_timer2_timeout_sts_cda8789f_bit_cg error_wdt_timer2_timeout_sts_bit_cg[1]; + soc_ifc_reg__intr_block_t__error_intr_t_error_bad_fuse_sts_23f67582_error_cmd_fail_sts_b85845f8_error_iccm_blocked_sts_e81e6ad2_error_internal_sts_caad62e2_error_inv_dev_sts_6693e7db_error_mbox_ecc_unc_sts_30bff330_error_wdt_timer1_timeout_sts_6aaa9655_error_wdt_timer2_timeout_sts_cda8789f_fld_cg fld_cg; rand uvm_reg_field error_internal_sts; rand uvm_reg_field error_inv_dev_sts; rand uvm_reg_field error_cmd_fail_sts; @@ -858,8 +2414,13 @@ package soc_ifc_reg_uvm; rand uvm_reg_field error_wdt_timer2_timeout_sts; function new(string name = "soc_ifc_reg__intr_block_t__error_intr_t_error_bad_fuse_sts_23f67582_error_cmd_fail_sts_b85845f8_error_iccm_blocked_sts_e81e6ad2_error_internal_sts_caad62e2_error_inv_dev_sts_6693e7db_error_mbox_ecc_unc_sts_30bff330_error_wdt_timer1_timeout_sts_6aaa9655_error_wdt_timer2_timeout_sts_cda8789f"); - super.new(name, 32, UVM_NO_COVERAGE); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); virtual function void build(); this.error_internal_sts = new("error_internal_sts"); @@ -878,19 +2439,49 @@ package soc_ifc_reg_uvm; this.error_wdt_timer1_timeout_sts.configure(this, 1, 6, "W1C", 1, 'h0, 1, 1, 0); this.error_wdt_timer2_timeout_sts = new("error_wdt_timer2_timeout_sts"); this.error_wdt_timer2_timeout_sts.configure(this, 1, 7, "W1C", 1, 'h0, 1, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(error_internal_sts_bit_cg[bt]) error_internal_sts_bit_cg[bt] = new(); + foreach(error_inv_dev_sts_bit_cg[bt]) error_inv_dev_sts_bit_cg[bt] = new(); + foreach(error_cmd_fail_sts_bit_cg[bt]) error_cmd_fail_sts_bit_cg[bt] = new(); + foreach(error_bad_fuse_sts_bit_cg[bt]) error_bad_fuse_sts_bit_cg[bt] = new(); + foreach(error_iccm_blocked_sts_bit_cg[bt]) error_iccm_blocked_sts_bit_cg[bt] = new(); + foreach(error_mbox_ecc_unc_sts_bit_cg[bt]) error_mbox_ecc_unc_sts_bit_cg[bt] = new(); + foreach(error_wdt_timer1_timeout_sts_bit_cg[bt]) error_wdt_timer1_timeout_sts_bit_cg[bt] = new(); + foreach(error_wdt_timer2_timeout_sts_bit_cg[bt]) error_wdt_timer2_timeout_sts_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); endfunction : build endclass : soc_ifc_reg__intr_block_t__error_intr_t_error_bad_fuse_sts_23f67582_error_cmd_fail_sts_b85845f8_error_iccm_blocked_sts_e81e6ad2_error_internal_sts_caad62e2_error_inv_dev_sts_6693e7db_error_mbox_ecc_unc_sts_30bff330_error_wdt_timer1_timeout_sts_6aaa9655_error_wdt_timer2_timeout_sts_cda8789f - // Reg - soc_ifc_reg::intr_block_t::notif_intr_t_notif_cmd_avail_sts_1871606b_notif_debug_locked_sts_5f024102_notif_mbox_ecc_cor_sts_5c3d26bb_notif_soc_req_lock_sts_deddde70 - class soc_ifc_reg__intr_block_t__notif_intr_t_notif_cmd_avail_sts_1871606b_notif_debug_locked_sts_5f024102_notif_mbox_ecc_cor_sts_5c3d26bb_notif_soc_req_lock_sts_deddde70 extends uvm_reg; + // Reg - soc_ifc_reg::intr_block_t::notif_intr_t_notif_cmd_avail_sts_1871606b_notif_debug_locked_sts_5f024102_notif_gen_in_toggle_sts_59f84b64_notif_mbox_ecc_cor_sts_5c3d26bb_notif_scan_mode_sts_122f6367_notif_soc_req_lock_sts_deddde70 + class soc_ifc_reg__intr_block_t__notif_intr_t_notif_cmd_avail_sts_1871606b_notif_debug_locked_sts_5f024102_notif_gen_in_toggle_sts_59f84b64_notif_mbox_ecc_cor_sts_5c3d26bb_notif_scan_mode_sts_122f6367_notif_soc_req_lock_sts_deddde70 extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + soc_ifc_reg__intr_block_t__notif_intr_t_notif_cmd_avail_sts_1871606b_notif_debug_locked_sts_5f024102_notif_gen_in_toggle_sts_59f84b64_notif_mbox_ecc_cor_sts_5c3d26bb_notif_scan_mode_sts_122f6367_notif_soc_req_lock_sts_deddde70_bit_cg notif_cmd_avail_sts_bit_cg[1]; + soc_ifc_reg__intr_block_t__notif_intr_t_notif_cmd_avail_sts_1871606b_notif_debug_locked_sts_5f024102_notif_gen_in_toggle_sts_59f84b64_notif_mbox_ecc_cor_sts_5c3d26bb_notif_scan_mode_sts_122f6367_notif_soc_req_lock_sts_deddde70_bit_cg notif_mbox_ecc_cor_sts_bit_cg[1]; + soc_ifc_reg__intr_block_t__notif_intr_t_notif_cmd_avail_sts_1871606b_notif_debug_locked_sts_5f024102_notif_gen_in_toggle_sts_59f84b64_notif_mbox_ecc_cor_sts_5c3d26bb_notif_scan_mode_sts_122f6367_notif_soc_req_lock_sts_deddde70_bit_cg notif_debug_locked_sts_bit_cg[1]; + soc_ifc_reg__intr_block_t__notif_intr_t_notif_cmd_avail_sts_1871606b_notif_debug_locked_sts_5f024102_notif_gen_in_toggle_sts_59f84b64_notif_mbox_ecc_cor_sts_5c3d26bb_notif_scan_mode_sts_122f6367_notif_soc_req_lock_sts_deddde70_bit_cg notif_scan_mode_sts_bit_cg[1]; + soc_ifc_reg__intr_block_t__notif_intr_t_notif_cmd_avail_sts_1871606b_notif_debug_locked_sts_5f024102_notif_gen_in_toggle_sts_59f84b64_notif_mbox_ecc_cor_sts_5c3d26bb_notif_scan_mode_sts_122f6367_notif_soc_req_lock_sts_deddde70_bit_cg notif_soc_req_lock_sts_bit_cg[1]; + soc_ifc_reg__intr_block_t__notif_intr_t_notif_cmd_avail_sts_1871606b_notif_debug_locked_sts_5f024102_notif_gen_in_toggle_sts_59f84b64_notif_mbox_ecc_cor_sts_5c3d26bb_notif_scan_mode_sts_122f6367_notif_soc_req_lock_sts_deddde70_bit_cg notif_gen_in_toggle_sts_bit_cg[1]; + soc_ifc_reg__intr_block_t__notif_intr_t_notif_cmd_avail_sts_1871606b_notif_debug_locked_sts_5f024102_notif_gen_in_toggle_sts_59f84b64_notif_mbox_ecc_cor_sts_5c3d26bb_notif_scan_mode_sts_122f6367_notif_soc_req_lock_sts_deddde70_fld_cg fld_cg; rand uvm_reg_field notif_cmd_avail_sts; rand uvm_reg_field notif_mbox_ecc_cor_sts; rand uvm_reg_field notif_debug_locked_sts; + rand uvm_reg_field notif_scan_mode_sts; rand uvm_reg_field notif_soc_req_lock_sts; + rand uvm_reg_field notif_gen_in_toggle_sts; - function new(string name = "soc_ifc_reg__intr_block_t__notif_intr_t_notif_cmd_avail_sts_1871606b_notif_debug_locked_sts_5f024102_notif_mbox_ecc_cor_sts_5c3d26bb_notif_soc_req_lock_sts_deddde70"); - super.new(name, 32, UVM_NO_COVERAGE); + function new(string name = "soc_ifc_reg__intr_block_t__notif_intr_t_notif_cmd_avail_sts_1871606b_notif_debug_locked_sts_5f024102_notif_gen_in_toggle_sts_59f84b64_notif_mbox_ecc_cor_sts_5c3d26bb_notif_scan_mode_sts_122f6367_notif_soc_req_lock_sts_deddde70"); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); virtual function void build(); this.notif_cmd_avail_sts = new("notif_cmd_avail_sts"); @@ -899,13 +2490,40 @@ package soc_ifc_reg_uvm; this.notif_mbox_ecc_cor_sts.configure(this, 1, 1, "W1C", 1, 'h0, 1, 1, 0); this.notif_debug_locked_sts = new("notif_debug_locked_sts"); this.notif_debug_locked_sts.configure(this, 1, 2, "W1C", 1, 'h0, 1, 1, 0); + this.notif_scan_mode_sts = new("notif_scan_mode_sts"); + this.notif_scan_mode_sts.configure(this, 1, 3, "W1C", 1, 'h0, 1, 1, 0); this.notif_soc_req_lock_sts = new("notif_soc_req_lock_sts"); - this.notif_soc_req_lock_sts.configure(this, 1, 3, "W1C", 1, 'h0, 1, 1, 0); + this.notif_soc_req_lock_sts.configure(this, 1, 4, "W1C", 1, 'h0, 1, 1, 0); + this.notif_gen_in_toggle_sts = new("notif_gen_in_toggle_sts"); + this.notif_gen_in_toggle_sts.configure(this, 1, 5, "W1C", 1, 'h0, 1, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(notif_cmd_avail_sts_bit_cg[bt]) notif_cmd_avail_sts_bit_cg[bt] = new(); + foreach(notif_mbox_ecc_cor_sts_bit_cg[bt]) notif_mbox_ecc_cor_sts_bit_cg[bt] = new(); + foreach(notif_debug_locked_sts_bit_cg[bt]) notif_debug_locked_sts_bit_cg[bt] = new(); + foreach(notif_scan_mode_sts_bit_cg[bt]) notif_scan_mode_sts_bit_cg[bt] = new(); + foreach(notif_soc_req_lock_sts_bit_cg[bt]) notif_soc_req_lock_sts_bit_cg[bt] = new(); + foreach(notif_gen_in_toggle_sts_bit_cg[bt]) notif_gen_in_toggle_sts_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); endfunction : build - endclass : soc_ifc_reg__intr_block_t__notif_intr_t_notif_cmd_avail_sts_1871606b_notif_debug_locked_sts_5f024102_notif_mbox_ecc_cor_sts_5c3d26bb_notif_soc_req_lock_sts_deddde70 + endclass : soc_ifc_reg__intr_block_t__notif_intr_t_notif_cmd_avail_sts_1871606b_notif_debug_locked_sts_5f024102_notif_gen_in_toggle_sts_59f84b64_notif_mbox_ecc_cor_sts_5c3d26bb_notif_scan_mode_sts_122f6367_notif_soc_req_lock_sts_deddde70 // Reg - soc_ifc_reg::intr_block_t::error_intr_trig_t class soc_ifc_reg__intr_block_t__error_intr_trig_t extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + soc_ifc_reg__intr_block_t__error_intr_trig_t_bit_cg error_internal_trig_bit_cg[1]; + soc_ifc_reg__intr_block_t__error_intr_trig_t_bit_cg error_inv_dev_trig_bit_cg[1]; + soc_ifc_reg__intr_block_t__error_intr_trig_t_bit_cg error_cmd_fail_trig_bit_cg[1]; + soc_ifc_reg__intr_block_t__error_intr_trig_t_bit_cg error_bad_fuse_trig_bit_cg[1]; + soc_ifc_reg__intr_block_t__error_intr_trig_t_bit_cg error_iccm_blocked_trig_bit_cg[1]; + soc_ifc_reg__intr_block_t__error_intr_trig_t_bit_cg error_mbox_ecc_unc_trig_bit_cg[1]; + soc_ifc_reg__intr_block_t__error_intr_trig_t_bit_cg error_wdt_timer1_timeout_trig_bit_cg[1]; + soc_ifc_reg__intr_block_t__error_intr_trig_t_bit_cg error_wdt_timer2_timeout_trig_bit_cg[1]; + soc_ifc_reg__intr_block_t__error_intr_trig_t_fld_cg fld_cg; rand uvm_reg_field error_internal_trig; rand uvm_reg_field error_inv_dev_trig; rand uvm_reg_field error_cmd_fail_trig; @@ -916,8 +2534,13 @@ package soc_ifc_reg_uvm; rand uvm_reg_field error_wdt_timer2_timeout_trig; function new(string name = "soc_ifc_reg__intr_block_t__error_intr_trig_t"); - super.new(name, 32, UVM_NO_COVERAGE); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); virtual function void build(); this.error_internal_trig = new("error_internal_trig"); @@ -936,19 +2559,49 @@ package soc_ifc_reg_uvm; this.error_wdt_timer1_timeout_trig.configure(this, 1, 6, "W1S", 0, 'h0, 1, 1, 0); this.error_wdt_timer2_timeout_trig = new("error_wdt_timer2_timeout_trig"); this.error_wdt_timer2_timeout_trig.configure(this, 1, 7, "W1S", 0, 'h0, 1, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(error_internal_trig_bit_cg[bt]) error_internal_trig_bit_cg[bt] = new(); + foreach(error_inv_dev_trig_bit_cg[bt]) error_inv_dev_trig_bit_cg[bt] = new(); + foreach(error_cmd_fail_trig_bit_cg[bt]) error_cmd_fail_trig_bit_cg[bt] = new(); + foreach(error_bad_fuse_trig_bit_cg[bt]) error_bad_fuse_trig_bit_cg[bt] = new(); + foreach(error_iccm_blocked_trig_bit_cg[bt]) error_iccm_blocked_trig_bit_cg[bt] = new(); + foreach(error_mbox_ecc_unc_trig_bit_cg[bt]) error_mbox_ecc_unc_trig_bit_cg[bt] = new(); + foreach(error_wdt_timer1_timeout_trig_bit_cg[bt]) error_wdt_timer1_timeout_trig_bit_cg[bt] = new(); + foreach(error_wdt_timer2_timeout_trig_bit_cg[bt]) error_wdt_timer2_timeout_trig_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); endfunction : build endclass : soc_ifc_reg__intr_block_t__error_intr_trig_t // Reg - soc_ifc_reg::intr_block_t::notif_intr_trig_t class soc_ifc_reg__intr_block_t__notif_intr_trig_t extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + soc_ifc_reg__intr_block_t__notif_intr_trig_t_bit_cg notif_cmd_avail_trig_bit_cg[1]; + soc_ifc_reg__intr_block_t__notif_intr_trig_t_bit_cg notif_mbox_ecc_cor_trig_bit_cg[1]; + soc_ifc_reg__intr_block_t__notif_intr_trig_t_bit_cg notif_debug_locked_trig_bit_cg[1]; + soc_ifc_reg__intr_block_t__notif_intr_trig_t_bit_cg notif_scan_mode_trig_bit_cg[1]; + soc_ifc_reg__intr_block_t__notif_intr_trig_t_bit_cg notif_soc_req_lock_trig_bit_cg[1]; + soc_ifc_reg__intr_block_t__notif_intr_trig_t_bit_cg notif_gen_in_toggle_trig_bit_cg[1]; + soc_ifc_reg__intr_block_t__notif_intr_trig_t_fld_cg fld_cg; rand uvm_reg_field notif_cmd_avail_trig; rand uvm_reg_field notif_mbox_ecc_cor_trig; rand uvm_reg_field notif_debug_locked_trig; + rand uvm_reg_field notif_scan_mode_trig; rand uvm_reg_field notif_soc_req_lock_trig; + rand uvm_reg_field notif_gen_in_toggle_trig; function new(string name = "soc_ifc_reg__intr_block_t__notif_intr_trig_t"); - super.new(name, 32, UVM_NO_COVERAGE); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); virtual function void build(); this.notif_cmd_avail_trig = new("notif_cmd_avail_trig"); @@ -957,347 +2610,865 @@ package soc_ifc_reg_uvm; this.notif_mbox_ecc_cor_trig.configure(this, 1, 1, "W1S", 0, 'h0, 1, 1, 0); this.notif_debug_locked_trig = new("notif_debug_locked_trig"); this.notif_debug_locked_trig.configure(this, 1, 2, "W1S", 0, 'h0, 1, 1, 0); + this.notif_scan_mode_trig = new("notif_scan_mode_trig"); + this.notif_scan_mode_trig.configure(this, 1, 3, "W1S", 0, 'h0, 1, 1, 0); this.notif_soc_req_lock_trig = new("notif_soc_req_lock_trig"); - this.notif_soc_req_lock_trig.configure(this, 1, 3, "W1S", 0, 'h0, 1, 1, 0); + this.notif_soc_req_lock_trig.configure(this, 1, 4, "W1S", 0, 'h0, 1, 1, 0); + this.notif_gen_in_toggle_trig = new("notif_gen_in_toggle_trig"); + this.notif_gen_in_toggle_trig.configure(this, 1, 5, "W1S", 0, 'h0, 1, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(notif_cmd_avail_trig_bit_cg[bt]) notif_cmd_avail_trig_bit_cg[bt] = new(); + foreach(notif_mbox_ecc_cor_trig_bit_cg[bt]) notif_mbox_ecc_cor_trig_bit_cg[bt] = new(); + foreach(notif_debug_locked_trig_bit_cg[bt]) notif_debug_locked_trig_bit_cg[bt] = new(); + foreach(notif_scan_mode_trig_bit_cg[bt]) notif_scan_mode_trig_bit_cg[bt] = new(); + foreach(notif_soc_req_lock_trig_bit_cg[bt]) notif_soc_req_lock_trig_bit_cg[bt] = new(); + foreach(notif_gen_in_toggle_trig_bit_cg[bt]) notif_gen_in_toggle_trig_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); endfunction : build endclass : soc_ifc_reg__intr_block_t__notif_intr_trig_t // Reg - soc_ifc_reg::intr_block_t::intr_count_t_cnt_608f1141 class soc_ifc_reg__intr_block_t__intr_count_t_cnt_608f1141 extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + soc_ifc_reg__intr_block_t__intr_count_t_cnt_608f1141_bit_cg cnt_bit_cg[32]; + soc_ifc_reg__intr_block_t__intr_count_t_cnt_608f1141_fld_cg fld_cg; rand uvm_reg_field cnt; function new(string name = "soc_ifc_reg__intr_block_t__intr_count_t_cnt_608f1141"); - super.new(name, 32, UVM_NO_COVERAGE); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); virtual function void build(); this.cnt = new("cnt"); this.cnt.configure(this, 32, 0, "RW", 1, 'h0, 1, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(cnt_bit_cg[bt]) cnt_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); endfunction : build endclass : soc_ifc_reg__intr_block_t__intr_count_t_cnt_608f1141 // Reg - soc_ifc_reg::intr_block_t::intr_count_t_cnt_916ab5df class soc_ifc_reg__intr_block_t__intr_count_t_cnt_916ab5df extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + soc_ifc_reg__intr_block_t__intr_count_t_cnt_916ab5df_bit_cg cnt_bit_cg[32]; + soc_ifc_reg__intr_block_t__intr_count_t_cnt_916ab5df_fld_cg fld_cg; rand uvm_reg_field cnt; function new(string name = "soc_ifc_reg__intr_block_t__intr_count_t_cnt_916ab5df"); - super.new(name, 32, UVM_NO_COVERAGE); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); virtual function void build(); this.cnt = new("cnt"); this.cnt.configure(this, 32, 0, "RW", 1, 'h0, 1, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(cnt_bit_cg[bt]) cnt_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); endfunction : build endclass : soc_ifc_reg__intr_block_t__intr_count_t_cnt_916ab5df // Reg - soc_ifc_reg::intr_block_t::intr_count_t_cnt_b2a56031 class soc_ifc_reg__intr_block_t__intr_count_t_cnt_b2a56031 extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + soc_ifc_reg__intr_block_t__intr_count_t_cnt_b2a56031_bit_cg cnt_bit_cg[32]; + soc_ifc_reg__intr_block_t__intr_count_t_cnt_b2a56031_fld_cg fld_cg; rand uvm_reg_field cnt; function new(string name = "soc_ifc_reg__intr_block_t__intr_count_t_cnt_b2a56031"); - super.new(name, 32, UVM_NO_COVERAGE); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); virtual function void build(); this.cnt = new("cnt"); this.cnt.configure(this, 32, 0, "RW", 1, 'h0, 1, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(cnt_bit_cg[bt]) cnt_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); endfunction : build endclass : soc_ifc_reg__intr_block_t__intr_count_t_cnt_b2a56031 // Reg - soc_ifc_reg::intr_block_t::intr_count_t_cnt_fb7d2433 class soc_ifc_reg__intr_block_t__intr_count_t_cnt_fb7d2433 extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + soc_ifc_reg__intr_block_t__intr_count_t_cnt_fb7d2433_bit_cg cnt_bit_cg[32]; + soc_ifc_reg__intr_block_t__intr_count_t_cnt_fb7d2433_fld_cg fld_cg; rand uvm_reg_field cnt; function new(string name = "soc_ifc_reg__intr_block_t__intr_count_t_cnt_fb7d2433"); - super.new(name, 32, UVM_NO_COVERAGE); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); virtual function void build(); this.cnt = new("cnt"); this.cnt.configure(this, 32, 0, "RW", 1, 'h0, 1, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(cnt_bit_cg[bt]) cnt_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); endfunction : build endclass : soc_ifc_reg__intr_block_t__intr_count_t_cnt_fb7d2433 // Reg - soc_ifc_reg::intr_block_t::intr_count_t_cnt_25e76b6f class soc_ifc_reg__intr_block_t__intr_count_t_cnt_25e76b6f extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + soc_ifc_reg__intr_block_t__intr_count_t_cnt_25e76b6f_bit_cg cnt_bit_cg[32]; + soc_ifc_reg__intr_block_t__intr_count_t_cnt_25e76b6f_fld_cg fld_cg; rand uvm_reg_field cnt; function new(string name = "soc_ifc_reg__intr_block_t__intr_count_t_cnt_25e76b6f"); - super.new(name, 32, UVM_NO_COVERAGE); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); virtual function void build(); this.cnt = new("cnt"); this.cnt.configure(this, 32, 0, "RW", 1, 'h0, 1, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(cnt_bit_cg[bt]) cnt_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); endfunction : build endclass : soc_ifc_reg__intr_block_t__intr_count_t_cnt_25e76b6f // Reg - soc_ifc_reg::intr_block_t::intr_count_t_cnt_26b97e39 class soc_ifc_reg__intr_block_t__intr_count_t_cnt_26b97e39 extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + soc_ifc_reg__intr_block_t__intr_count_t_cnt_26b97e39_bit_cg cnt_bit_cg[32]; + soc_ifc_reg__intr_block_t__intr_count_t_cnt_26b97e39_fld_cg fld_cg; rand uvm_reg_field cnt; function new(string name = "soc_ifc_reg__intr_block_t__intr_count_t_cnt_26b97e39"); - super.new(name, 32, UVM_NO_COVERAGE); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); virtual function void build(); this.cnt = new("cnt"); this.cnt.configure(this, 32, 0, "RW", 1, 'h0, 1, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(cnt_bit_cg[bt]) cnt_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); endfunction : build endclass : soc_ifc_reg__intr_block_t__intr_count_t_cnt_26b97e39 // Reg - soc_ifc_reg::intr_block_t::intr_count_t_cnt_a2f61f82 class soc_ifc_reg__intr_block_t__intr_count_t_cnt_a2f61f82 extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + soc_ifc_reg__intr_block_t__intr_count_t_cnt_a2f61f82_bit_cg cnt_bit_cg[32]; + soc_ifc_reg__intr_block_t__intr_count_t_cnt_a2f61f82_fld_cg fld_cg; rand uvm_reg_field cnt; function new(string name = "soc_ifc_reg__intr_block_t__intr_count_t_cnt_a2f61f82"); - super.new(name, 32, UVM_NO_COVERAGE); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); virtual function void build(); this.cnt = new("cnt"); this.cnt.configure(this, 32, 0, "RW", 1, 'h0, 1, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(cnt_bit_cg[bt]) cnt_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); endfunction : build endclass : soc_ifc_reg__intr_block_t__intr_count_t_cnt_a2f61f82 // Reg - soc_ifc_reg::intr_block_t::intr_count_t_cnt_d46457cd class soc_ifc_reg__intr_block_t__intr_count_t_cnt_d46457cd extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + soc_ifc_reg__intr_block_t__intr_count_t_cnt_d46457cd_bit_cg cnt_bit_cg[32]; + soc_ifc_reg__intr_block_t__intr_count_t_cnt_d46457cd_fld_cg fld_cg; rand uvm_reg_field cnt; function new(string name = "soc_ifc_reg__intr_block_t__intr_count_t_cnt_d46457cd"); - super.new(name, 32, UVM_NO_COVERAGE); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); virtual function void build(); this.cnt = new("cnt"); this.cnt.configure(this, 32, 0, "RW", 1, 'h0, 1, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(cnt_bit_cg[bt]) cnt_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); endfunction : build endclass : soc_ifc_reg__intr_block_t__intr_count_t_cnt_d46457cd // Reg - soc_ifc_reg::intr_block_t::intr_count_t_cnt_a06f0954 class soc_ifc_reg__intr_block_t__intr_count_t_cnt_a06f0954 extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + soc_ifc_reg__intr_block_t__intr_count_t_cnt_a06f0954_bit_cg cnt_bit_cg[32]; + soc_ifc_reg__intr_block_t__intr_count_t_cnt_a06f0954_fld_cg fld_cg; rand uvm_reg_field cnt; function new(string name = "soc_ifc_reg__intr_block_t__intr_count_t_cnt_a06f0954"); - super.new(name, 32, UVM_NO_COVERAGE); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); virtual function void build(); this.cnt = new("cnt"); this.cnt.configure(this, 32, 0, "RW", 1, 'h0, 1, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(cnt_bit_cg[bt]) cnt_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); endfunction : build endclass : soc_ifc_reg__intr_block_t__intr_count_t_cnt_a06f0954 // Reg - soc_ifc_reg::intr_block_t::intr_count_t_cnt_00e49272 class soc_ifc_reg__intr_block_t__intr_count_t_cnt_00e49272 extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + soc_ifc_reg__intr_block_t__intr_count_t_cnt_00e49272_bit_cg cnt_bit_cg[32]; + soc_ifc_reg__intr_block_t__intr_count_t_cnt_00e49272_fld_cg fld_cg; rand uvm_reg_field cnt; function new(string name = "soc_ifc_reg__intr_block_t__intr_count_t_cnt_00e49272"); - super.new(name, 32, UVM_NO_COVERAGE); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); virtual function void build(); this.cnt = new("cnt"); this.cnt.configure(this, 32, 0, "RW", 1, 'h0, 1, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(cnt_bit_cg[bt]) cnt_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); endfunction : build endclass : soc_ifc_reg__intr_block_t__intr_count_t_cnt_00e49272 // Reg - soc_ifc_reg::intr_block_t::intr_count_t_cnt_ee53ded8 class soc_ifc_reg__intr_block_t__intr_count_t_cnt_ee53ded8 extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + soc_ifc_reg__intr_block_t__intr_count_t_cnt_ee53ded8_bit_cg cnt_bit_cg[32]; + soc_ifc_reg__intr_block_t__intr_count_t_cnt_ee53ded8_fld_cg fld_cg; rand uvm_reg_field cnt; function new(string name = "soc_ifc_reg__intr_block_t__intr_count_t_cnt_ee53ded8"); - super.new(name, 32, UVM_NO_COVERAGE); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); virtual function void build(); this.cnt = new("cnt"); this.cnt.configure(this, 32, 0, "RW", 1, 'h0, 1, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(cnt_bit_cg[bt]) cnt_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); endfunction : build endclass : soc_ifc_reg__intr_block_t__intr_count_t_cnt_ee53ded8 + // Reg - soc_ifc_reg::intr_block_t::intr_count_t_cnt_fbf3c714 + class soc_ifc_reg__intr_block_t__intr_count_t_cnt_fbf3c714 extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + soc_ifc_reg__intr_block_t__intr_count_t_cnt_fbf3c714_bit_cg cnt_bit_cg[32]; + soc_ifc_reg__intr_block_t__intr_count_t_cnt_fbf3c714_fld_cg fld_cg; + rand uvm_reg_field cnt; + + function new(string name = "soc_ifc_reg__intr_block_t__intr_count_t_cnt_fbf3c714"); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); + endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); + + virtual function void build(); + this.cnt = new("cnt"); + this.cnt.configure(this, 32, 0, "RW", 1, 'h0, 1, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(cnt_bit_cg[bt]) cnt_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); + endfunction : build + endclass : soc_ifc_reg__intr_block_t__intr_count_t_cnt_fbf3c714 + // Reg - soc_ifc_reg::intr_block_t::intr_count_t_cnt_b9bddabe class soc_ifc_reg__intr_block_t__intr_count_t_cnt_b9bddabe extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + soc_ifc_reg__intr_block_t__intr_count_t_cnt_b9bddabe_bit_cg cnt_bit_cg[32]; + soc_ifc_reg__intr_block_t__intr_count_t_cnt_b9bddabe_fld_cg fld_cg; rand uvm_reg_field cnt; function new(string name = "soc_ifc_reg__intr_block_t__intr_count_t_cnt_b9bddabe"); - super.new(name, 32, UVM_NO_COVERAGE); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); virtual function void build(); this.cnt = new("cnt"); this.cnt.configure(this, 32, 0, "RW", 1, 'h0, 1, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(cnt_bit_cg[bt]) cnt_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); endfunction : build endclass : soc_ifc_reg__intr_block_t__intr_count_t_cnt_b9bddabe + // Reg - soc_ifc_reg::intr_block_t::intr_count_t_cnt_57528cc1 + class soc_ifc_reg__intr_block_t__intr_count_t_cnt_57528cc1 extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + soc_ifc_reg__intr_block_t__intr_count_t_cnt_57528cc1_bit_cg cnt_bit_cg[32]; + soc_ifc_reg__intr_block_t__intr_count_t_cnt_57528cc1_fld_cg fld_cg; + rand uvm_reg_field cnt; + + function new(string name = "soc_ifc_reg__intr_block_t__intr_count_t_cnt_57528cc1"); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); + endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); + + virtual function void build(); + this.cnt = new("cnt"); + this.cnt.configure(this, 32, 0, "RW", 1, 'h0, 1, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(cnt_bit_cg[bt]) cnt_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); + endfunction : build + endclass : soc_ifc_reg__intr_block_t__intr_count_t_cnt_57528cc1 + // Reg - soc_ifc_reg::intr_block_t::intr_count_incr_t_pulse_15e6ed7e class soc_ifc_reg__intr_block_t__intr_count_incr_t_pulse_15e6ed7e extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + soc_ifc_reg__intr_block_t__intr_count_incr_t_pulse_15e6ed7e_bit_cg pulse_bit_cg[1]; + soc_ifc_reg__intr_block_t__intr_count_incr_t_pulse_15e6ed7e_fld_cg fld_cg; rand uvm_reg_field pulse; function new(string name = "soc_ifc_reg__intr_block_t__intr_count_incr_t_pulse_15e6ed7e"); - super.new(name, 32, UVM_NO_COVERAGE); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); virtual function void build(); this.pulse = new("pulse"); this.pulse.configure(this, 1, 0, "RO", 1, 'h0, 1, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(pulse_bit_cg[bt]) pulse_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); endfunction : build endclass : soc_ifc_reg__intr_block_t__intr_count_incr_t_pulse_15e6ed7e // Reg - soc_ifc_reg::intr_block_t::intr_count_incr_t_pulse_f762ea9c class soc_ifc_reg__intr_block_t__intr_count_incr_t_pulse_f762ea9c extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + soc_ifc_reg__intr_block_t__intr_count_incr_t_pulse_f762ea9c_bit_cg pulse_bit_cg[1]; + soc_ifc_reg__intr_block_t__intr_count_incr_t_pulse_f762ea9c_fld_cg fld_cg; rand uvm_reg_field pulse; function new(string name = "soc_ifc_reg__intr_block_t__intr_count_incr_t_pulse_f762ea9c"); - super.new(name, 32, UVM_NO_COVERAGE); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); virtual function void build(); this.pulse = new("pulse"); this.pulse.configure(this, 1, 0, "RO", 1, 'h0, 1, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(pulse_bit_cg[bt]) pulse_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); endfunction : build endclass : soc_ifc_reg__intr_block_t__intr_count_incr_t_pulse_f762ea9c // Reg - soc_ifc_reg::intr_block_t::intr_count_incr_t_pulse_aa8718c6 class soc_ifc_reg__intr_block_t__intr_count_incr_t_pulse_aa8718c6 extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + soc_ifc_reg__intr_block_t__intr_count_incr_t_pulse_aa8718c6_bit_cg pulse_bit_cg[1]; + soc_ifc_reg__intr_block_t__intr_count_incr_t_pulse_aa8718c6_fld_cg fld_cg; rand uvm_reg_field pulse; function new(string name = "soc_ifc_reg__intr_block_t__intr_count_incr_t_pulse_aa8718c6"); - super.new(name, 32, UVM_NO_COVERAGE); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); virtual function void build(); this.pulse = new("pulse"); this.pulse.configure(this, 1, 0, "RO", 1, 'h0, 1, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(pulse_bit_cg[bt]) pulse_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); endfunction : build endclass : soc_ifc_reg__intr_block_t__intr_count_incr_t_pulse_aa8718c6 // Reg - soc_ifc_reg::intr_block_t::intr_count_incr_t_pulse_26fa5955 class soc_ifc_reg__intr_block_t__intr_count_incr_t_pulse_26fa5955 extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + soc_ifc_reg__intr_block_t__intr_count_incr_t_pulse_26fa5955_bit_cg pulse_bit_cg[1]; + soc_ifc_reg__intr_block_t__intr_count_incr_t_pulse_26fa5955_fld_cg fld_cg; rand uvm_reg_field pulse; function new(string name = "soc_ifc_reg__intr_block_t__intr_count_incr_t_pulse_26fa5955"); - super.new(name, 32, UVM_NO_COVERAGE); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); virtual function void build(); this.pulse = new("pulse"); this.pulse.configure(this, 1, 0, "RO", 1, 'h0, 1, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(pulse_bit_cg[bt]) pulse_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); endfunction : build endclass : soc_ifc_reg__intr_block_t__intr_count_incr_t_pulse_26fa5955 // Reg - soc_ifc_reg::intr_block_t::intr_count_incr_t_pulse_3e43d258 class soc_ifc_reg__intr_block_t__intr_count_incr_t_pulse_3e43d258 extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + soc_ifc_reg__intr_block_t__intr_count_incr_t_pulse_3e43d258_bit_cg pulse_bit_cg[1]; + soc_ifc_reg__intr_block_t__intr_count_incr_t_pulse_3e43d258_fld_cg fld_cg; rand uvm_reg_field pulse; function new(string name = "soc_ifc_reg__intr_block_t__intr_count_incr_t_pulse_3e43d258"); - super.new(name, 32, UVM_NO_COVERAGE); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); virtual function void build(); this.pulse = new("pulse"); this.pulse.configure(this, 1, 0, "RO", 1, 'h0, 1, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(pulse_bit_cg[bt]) pulse_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); endfunction : build endclass : soc_ifc_reg__intr_block_t__intr_count_incr_t_pulse_3e43d258 // Reg - soc_ifc_reg::intr_block_t::intr_count_incr_t_pulse_9f1632fd class soc_ifc_reg__intr_block_t__intr_count_incr_t_pulse_9f1632fd extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + soc_ifc_reg__intr_block_t__intr_count_incr_t_pulse_9f1632fd_bit_cg pulse_bit_cg[1]; + soc_ifc_reg__intr_block_t__intr_count_incr_t_pulse_9f1632fd_fld_cg fld_cg; rand uvm_reg_field pulse; function new(string name = "soc_ifc_reg__intr_block_t__intr_count_incr_t_pulse_9f1632fd"); - super.new(name, 32, UVM_NO_COVERAGE); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); virtual function void build(); this.pulse = new("pulse"); this.pulse.configure(this, 1, 0, "RO", 1, 'h0, 1, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(pulse_bit_cg[bt]) pulse_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); endfunction : build endclass : soc_ifc_reg__intr_block_t__intr_count_incr_t_pulse_9f1632fd // Reg - soc_ifc_reg::intr_block_t::intr_count_incr_t_pulse_aa999fdc class soc_ifc_reg__intr_block_t__intr_count_incr_t_pulse_aa999fdc extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + soc_ifc_reg__intr_block_t__intr_count_incr_t_pulse_aa999fdc_bit_cg pulse_bit_cg[1]; + soc_ifc_reg__intr_block_t__intr_count_incr_t_pulse_aa999fdc_fld_cg fld_cg; rand uvm_reg_field pulse; function new(string name = "soc_ifc_reg__intr_block_t__intr_count_incr_t_pulse_aa999fdc"); - super.new(name, 32, UVM_NO_COVERAGE); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); virtual function void build(); this.pulse = new("pulse"); this.pulse.configure(this, 1, 0, "RO", 1, 'h0, 1, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(pulse_bit_cg[bt]) pulse_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); endfunction : build endclass : soc_ifc_reg__intr_block_t__intr_count_incr_t_pulse_aa999fdc // Reg - soc_ifc_reg::intr_block_t::intr_count_incr_t_pulse_404e12db class soc_ifc_reg__intr_block_t__intr_count_incr_t_pulse_404e12db extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + soc_ifc_reg__intr_block_t__intr_count_incr_t_pulse_404e12db_bit_cg pulse_bit_cg[1]; + soc_ifc_reg__intr_block_t__intr_count_incr_t_pulse_404e12db_fld_cg fld_cg; rand uvm_reg_field pulse; function new(string name = "soc_ifc_reg__intr_block_t__intr_count_incr_t_pulse_404e12db"); - super.new(name, 32, UVM_NO_COVERAGE); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); virtual function void build(); this.pulse = new("pulse"); this.pulse.configure(this, 1, 0, "RO", 1, 'h0, 1, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(pulse_bit_cg[bt]) pulse_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); endfunction : build endclass : soc_ifc_reg__intr_block_t__intr_count_incr_t_pulse_404e12db // Reg - soc_ifc_reg::intr_block_t::intr_count_incr_t_pulse_90d52137 class soc_ifc_reg__intr_block_t__intr_count_incr_t_pulse_90d52137 extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + soc_ifc_reg__intr_block_t__intr_count_incr_t_pulse_90d52137_bit_cg pulse_bit_cg[1]; + soc_ifc_reg__intr_block_t__intr_count_incr_t_pulse_90d52137_fld_cg fld_cg; rand uvm_reg_field pulse; function new(string name = "soc_ifc_reg__intr_block_t__intr_count_incr_t_pulse_90d52137"); - super.new(name, 32, UVM_NO_COVERAGE); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); virtual function void build(); this.pulse = new("pulse"); this.pulse.configure(this, 1, 0, "RO", 1, 'h0, 1, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(pulse_bit_cg[bt]) pulse_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); endfunction : build endclass : soc_ifc_reg__intr_block_t__intr_count_incr_t_pulse_90d52137 // Reg - soc_ifc_reg::intr_block_t::intr_count_incr_t_pulse_a6db6fff class soc_ifc_reg__intr_block_t__intr_count_incr_t_pulse_a6db6fff extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + soc_ifc_reg__intr_block_t__intr_count_incr_t_pulse_a6db6fff_bit_cg pulse_bit_cg[1]; + soc_ifc_reg__intr_block_t__intr_count_incr_t_pulse_a6db6fff_fld_cg fld_cg; rand uvm_reg_field pulse; function new(string name = "soc_ifc_reg__intr_block_t__intr_count_incr_t_pulse_a6db6fff"); - super.new(name, 32, UVM_NO_COVERAGE); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); virtual function void build(); this.pulse = new("pulse"); this.pulse.configure(this, 1, 0, "RO", 1, 'h0, 1, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(pulse_bit_cg[bt]) pulse_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); endfunction : build endclass : soc_ifc_reg__intr_block_t__intr_count_incr_t_pulse_a6db6fff // Reg - soc_ifc_reg::intr_block_t::intr_count_incr_t_pulse_51891fb1 class soc_ifc_reg__intr_block_t__intr_count_incr_t_pulse_51891fb1 extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + soc_ifc_reg__intr_block_t__intr_count_incr_t_pulse_51891fb1_bit_cg pulse_bit_cg[1]; + soc_ifc_reg__intr_block_t__intr_count_incr_t_pulse_51891fb1_fld_cg fld_cg; rand uvm_reg_field pulse; function new(string name = "soc_ifc_reg__intr_block_t__intr_count_incr_t_pulse_51891fb1"); - super.new(name, 32, UVM_NO_COVERAGE); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); virtual function void build(); this.pulse = new("pulse"); this.pulse.configure(this, 1, 0, "RO", 1, 'h0, 1, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(pulse_bit_cg[bt]) pulse_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); endfunction : build endclass : soc_ifc_reg__intr_block_t__intr_count_incr_t_pulse_51891fb1 + // Reg - soc_ifc_reg::intr_block_t::intr_count_incr_t_pulse_f5d8afe0 + class soc_ifc_reg__intr_block_t__intr_count_incr_t_pulse_f5d8afe0 extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + soc_ifc_reg__intr_block_t__intr_count_incr_t_pulse_f5d8afe0_bit_cg pulse_bit_cg[1]; + soc_ifc_reg__intr_block_t__intr_count_incr_t_pulse_f5d8afe0_fld_cg fld_cg; + rand uvm_reg_field pulse; + + function new(string name = "soc_ifc_reg__intr_block_t__intr_count_incr_t_pulse_f5d8afe0"); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); + endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); + + virtual function void build(); + this.pulse = new("pulse"); + this.pulse.configure(this, 1, 0, "RO", 1, 'h0, 1, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(pulse_bit_cg[bt]) pulse_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); + endfunction : build + endclass : soc_ifc_reg__intr_block_t__intr_count_incr_t_pulse_f5d8afe0 + // Reg - soc_ifc_reg::intr_block_t::intr_count_incr_t_pulse_246489bd class soc_ifc_reg__intr_block_t__intr_count_incr_t_pulse_246489bd extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + soc_ifc_reg__intr_block_t__intr_count_incr_t_pulse_246489bd_bit_cg pulse_bit_cg[1]; + soc_ifc_reg__intr_block_t__intr_count_incr_t_pulse_246489bd_fld_cg fld_cg; rand uvm_reg_field pulse; function new(string name = "soc_ifc_reg__intr_block_t__intr_count_incr_t_pulse_246489bd"); - super.new(name, 32, UVM_NO_COVERAGE); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); virtual function void build(); this.pulse = new("pulse"); this.pulse.configure(this, 1, 0, "RO", 1, 'h0, 1, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(pulse_bit_cg[bt]) pulse_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); endfunction : build endclass : soc_ifc_reg__intr_block_t__intr_count_incr_t_pulse_246489bd + // Reg - soc_ifc_reg::intr_block_t::intr_count_incr_t_pulse_d6ed4d1e + class soc_ifc_reg__intr_block_t__intr_count_incr_t_pulse_d6ed4d1e extends uvm_reg; + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; + + soc_ifc_reg__intr_block_t__intr_count_incr_t_pulse_d6ed4d1e_bit_cg pulse_bit_cg[1]; + soc_ifc_reg__intr_block_t__intr_count_incr_t_pulse_d6ed4d1e_fld_cg fld_cg; + rand uvm_reg_field pulse; + + function new(string name = "soc_ifc_reg__intr_block_t__intr_count_incr_t_pulse_d6ed4d1e"); + super.new(name, 32, build_coverage(UVM_CVR_ALL)); + endfunction : new + extern virtual function void sample_values(); + extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); + + virtual function void build(); + this.pulse = new("pulse"); + this.pulse.configure(this, 1, 0, "RO", 1, 'h0, 1, 1, 0); + if (has_coverage(UVM_CVR_REG_BITS)) begin + foreach(pulse_bit_cg[bt]) pulse_bit_cg[bt] = new(); + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); + endfunction : build + endclass : soc_ifc_reg__intr_block_t__intr_count_incr_t_pulse_d6ed4d1e + // Regfile - soc_ifc_reg::intr_block_t class soc_ifc_reg__intr_block_t extends uvm_reg_block; rand soc_ifc_reg__intr_block_t__global_intr_en_t global_intr_en_r; @@ -1306,7 +3477,7 @@ package soc_ifc_reg_uvm; rand soc_ifc_reg__intr_block_t__global_intr_t_agg_sts_dd3dcf0a error_global_intr_r; rand soc_ifc_reg__intr_block_t__global_intr_t_agg_sts_e6399b4a notif_global_intr_r; rand soc_ifc_reg__intr_block_t__error_intr_t_error_bad_fuse_sts_23f67582_error_cmd_fail_sts_b85845f8_error_iccm_blocked_sts_e81e6ad2_error_internal_sts_caad62e2_error_inv_dev_sts_6693e7db_error_mbox_ecc_unc_sts_30bff330_error_wdt_timer1_timeout_sts_6aaa9655_error_wdt_timer2_timeout_sts_cda8789f error_internal_intr_r; - rand soc_ifc_reg__intr_block_t__notif_intr_t_notif_cmd_avail_sts_1871606b_notif_debug_locked_sts_5f024102_notif_mbox_ecc_cor_sts_5c3d26bb_notif_soc_req_lock_sts_deddde70 notif_internal_intr_r; + rand soc_ifc_reg__intr_block_t__notif_intr_t_notif_cmd_avail_sts_1871606b_notif_debug_locked_sts_5f024102_notif_gen_in_toggle_sts_59f84b64_notif_mbox_ecc_cor_sts_5c3d26bb_notif_scan_mode_sts_122f6367_notif_soc_req_lock_sts_deddde70 notif_internal_intr_r; rand soc_ifc_reg__intr_block_t__error_intr_trig_t error_intr_trig_r; rand soc_ifc_reg__intr_block_t__notif_intr_trig_t notif_intr_trig_r; rand soc_ifc_reg__intr_block_t__intr_count_t_cnt_608f1141 error_internal_intr_count_r; @@ -1320,7 +3491,9 @@ package soc_ifc_reg_uvm; rand soc_ifc_reg__intr_block_t__intr_count_t_cnt_a06f0954 notif_cmd_avail_intr_count_r; rand soc_ifc_reg__intr_block_t__intr_count_t_cnt_00e49272 notif_mbox_ecc_cor_intr_count_r; rand soc_ifc_reg__intr_block_t__intr_count_t_cnt_ee53ded8 notif_debug_locked_intr_count_r; + rand soc_ifc_reg__intr_block_t__intr_count_t_cnt_fbf3c714 notif_scan_mode_intr_count_r; rand soc_ifc_reg__intr_block_t__intr_count_t_cnt_b9bddabe notif_soc_req_lock_intr_count_r; + rand soc_ifc_reg__intr_block_t__intr_count_t_cnt_57528cc1 notif_gen_in_toggle_intr_count_r; rand soc_ifc_reg__intr_block_t__intr_count_incr_t_pulse_15e6ed7e error_internal_intr_count_incr_r; rand soc_ifc_reg__intr_block_t__intr_count_incr_t_pulse_f762ea9c error_inv_dev_intr_count_incr_r; rand soc_ifc_reg__intr_block_t__intr_count_incr_t_pulse_aa8718c6 error_cmd_fail_intr_count_incr_r; @@ -1332,7 +3505,9 @@ package soc_ifc_reg_uvm; rand soc_ifc_reg__intr_block_t__intr_count_incr_t_pulse_90d52137 notif_cmd_avail_intr_count_incr_r; rand soc_ifc_reg__intr_block_t__intr_count_incr_t_pulse_a6db6fff notif_mbox_ecc_cor_intr_count_incr_r; rand soc_ifc_reg__intr_block_t__intr_count_incr_t_pulse_51891fb1 notif_debug_locked_intr_count_incr_r; + rand soc_ifc_reg__intr_block_t__intr_count_incr_t_pulse_f5d8afe0 notif_scan_mode_intr_count_incr_r; rand soc_ifc_reg__intr_block_t__intr_count_incr_t_pulse_246489bd notif_soc_req_lock_intr_count_incr_r; + rand soc_ifc_reg__intr_block_t__intr_count_incr_t_pulse_d6ed4d1e notif_gen_in_toggle_intr_count_incr_r; function new(string name = "soc_ifc_reg__intr_block_t"); super.new(name); @@ -1440,11 +3615,21 @@ package soc_ifc_reg_uvm; this.notif_debug_locked_intr_count_r.build(); this.default_map.add_reg(this.notif_debug_locked_intr_count_r, 'h188); + this.notif_scan_mode_intr_count_r = new("notif_scan_mode_intr_count_r"); + this.notif_scan_mode_intr_count_r.configure(this); + + this.notif_scan_mode_intr_count_r.build(); + this.default_map.add_reg(this.notif_scan_mode_intr_count_r, 'h18c); this.notif_soc_req_lock_intr_count_r = new("notif_soc_req_lock_intr_count_r"); this.notif_soc_req_lock_intr_count_r.configure(this); this.notif_soc_req_lock_intr_count_r.build(); - this.default_map.add_reg(this.notif_soc_req_lock_intr_count_r, 'h18c); + this.default_map.add_reg(this.notif_soc_req_lock_intr_count_r, 'h190); + this.notif_gen_in_toggle_intr_count_r = new("notif_gen_in_toggle_intr_count_r"); + this.notif_gen_in_toggle_intr_count_r.configure(this); + + this.notif_gen_in_toggle_intr_count_r.build(); + this.default_map.add_reg(this.notif_gen_in_toggle_intr_count_r, 'h194); this.error_internal_intr_count_incr_r = new("error_internal_intr_count_incr_r"); this.error_internal_intr_count_incr_r.configure(this); @@ -1500,11 +3685,21 @@ package soc_ifc_reg_uvm; this.notif_debug_locked_intr_count_incr_r.build(); this.default_map.add_reg(this.notif_debug_locked_intr_count_incr_r, 'h228); + this.notif_scan_mode_intr_count_incr_r = new("notif_scan_mode_intr_count_incr_r"); + this.notif_scan_mode_intr_count_incr_r.configure(this); + + this.notif_scan_mode_intr_count_incr_r.build(); + this.default_map.add_reg(this.notif_scan_mode_intr_count_incr_r, 'h22c); this.notif_soc_req_lock_intr_count_incr_r = new("notif_soc_req_lock_intr_count_incr_r"); this.notif_soc_req_lock_intr_count_incr_r.configure(this); this.notif_soc_req_lock_intr_count_incr_r.build(); - this.default_map.add_reg(this.notif_soc_req_lock_intr_count_incr_r, 'h22c); + this.default_map.add_reg(this.notif_soc_req_lock_intr_count_incr_r, 'h230); + this.notif_gen_in_toggle_intr_count_incr_r = new("notif_gen_in_toggle_intr_count_incr_r"); + this.notif_gen_in_toggle_intr_count_incr_r.configure(this); + + this.notif_gen_in_toggle_intr_count_incr_r.build(); + this.default_map.add_reg(this.notif_gen_in_toggle_intr_count_incr_r, 'h234); endfunction : build endclass : soc_ifc_reg__intr_block_t @@ -1526,6 +3721,7 @@ package soc_ifc_reg_uvm; rand soc_ifc_reg__CPTRA_TRNG_VALID_PAUSER CPTRA_TRNG_VALID_PAUSER; rand soc_ifc_reg__CPTRA_TRNG_PAUSER_LOCK CPTRA_TRNG_PAUSER_LOCK; rand soc_ifc_reg__CPTRA_TRNG_DATA CPTRA_TRNG_DATA[12]; + rand soc_ifc_reg__CPTRA_TRNG_CTRL CPTRA_TRNG_CTRL; rand soc_ifc_reg__CPTRA_TRNG_STATUS CPTRA_TRNG_STATUS; rand soc_ifc_reg__CPTRA_FUSE_WR_DONE CPTRA_FUSE_WR_DONE; rand soc_ifc_reg__CPTRA_TIMER_CONFIG CPTRA_TIMER_CONFIG; @@ -1544,6 +3740,12 @@ package soc_ifc_reg_uvm; rand soc_ifc_reg__CPTRA_WDT_TIMER2_CTRL CPTRA_WDT_TIMER2_CTRL; rand soc_ifc_reg__CPTRA_WDT_TIMER2_TIMEOUT_PERIOD CPTRA_WDT_TIMER2_TIMEOUT_PERIOD[2]; rand soc_ifc_reg__CPTRA_WDT_STATUS CPTRA_WDT_STATUS; + rand soc_ifc_reg__CPTRA_FUSE_VALID_PAUSER CPTRA_FUSE_VALID_PAUSER; + rand soc_ifc_reg__CPTRA_FUSE_PAUSER_LOCK CPTRA_FUSE_PAUSER_LOCK; + rand soc_ifc_reg__CPTRA_WDT_CFG CPTRA_WDT_CFG[2]; + rand soc_ifc_reg__CPTRA_iTRNG_ENTROPY_CONFIG_0 CPTRA_iTRNG_ENTROPY_CONFIG_0; + rand soc_ifc_reg__CPTRA_iTRNG_ENTROPY_CONFIG_1 CPTRA_iTRNG_ENTROPY_CONFIG_1; + rand soc_ifc_reg__CPTRA_RSVD_REG CPTRA_RSVD_REG[2]; rand soc_ifc_reg__fuse_uds_seed fuse_uds_seed[12]; rand soc_ifc_reg__fuse_field_entropy fuse_field_entropy[8]; rand soc_ifc_reg__fuse_key_manifest_pk_hash fuse_key_manifest_pk_hash[12]; @@ -1555,11 +3757,22 @@ package soc_ifc_reg_uvm; rand soc_ifc_reg__fuse_idevid_cert_attr fuse_idevid_cert_attr[24]; rand soc_ifc_reg__fuse_idevid_manuf_hsm_id fuse_idevid_manuf_hsm_id[4]; rand soc_ifc_reg__fuse_life_cycle fuse_life_cycle; + rand soc_ifc_reg__fuse_lms_verify fuse_lms_verify; + rand soc_ifc_reg__fuse_lms_revocation fuse_lms_revocation; + rand soc_ifc_reg__fuse_soc_stepping_id fuse_soc_stepping_id; rand soc_ifc_reg__internal_obf_key internal_obf_key[8]; rand soc_ifc_reg__internal_iccm_lock internal_iccm_lock; rand soc_ifc_reg__internal_fw_update_reset internal_fw_update_reset; rand soc_ifc_reg__internal_fw_update_reset_wait_cycles internal_fw_update_reset_wait_cycles; rand soc_ifc_reg__internal_nmi_vector internal_nmi_vector; + rand soc_ifc_reg__internal_hw_error_fatal_mask internal_hw_error_fatal_mask; + rand soc_ifc_reg__internal_hw_error_non_fatal_mask internal_hw_error_non_fatal_mask; + rand soc_ifc_reg__internal_fw_error_fatal_mask internal_fw_error_fatal_mask; + rand soc_ifc_reg__internal_fw_error_non_fatal_mask internal_fw_error_non_fatal_mask; + rand soc_ifc_reg__internal_rv_mtime_l internal_rv_mtime_l; + rand soc_ifc_reg__internal_rv_mtime_h internal_rv_mtime_h; + rand soc_ifc_reg__internal_rv_mtimecmp_l internal_rv_mtimecmp_l; + rand soc_ifc_reg__internal_rv_mtimecmp_h internal_rv_mtimecmp_h; rand soc_ifc_reg__intr_block_t intr_block_rf; function new(string name = "soc_ifc_reg"); @@ -1656,106 +3869,145 @@ package soc_ifc_reg_uvm; this.CPTRA_TRNG_DATA[i0].build(); this.default_map.add_reg(this.CPTRA_TRNG_DATA[i0], 'h78 + i0*'h4); end + this.CPTRA_TRNG_CTRL = new("CPTRA_TRNG_CTRL"); + this.CPTRA_TRNG_CTRL.configure(this); + + this.CPTRA_TRNG_CTRL.build(); + this.default_map.add_reg(this.CPTRA_TRNG_CTRL, 'ha8); this.CPTRA_TRNG_STATUS = new("CPTRA_TRNG_STATUS"); this.CPTRA_TRNG_STATUS.configure(this); this.CPTRA_TRNG_STATUS.build(); - this.default_map.add_reg(this.CPTRA_TRNG_STATUS, 'ha8); + this.default_map.add_reg(this.CPTRA_TRNG_STATUS, 'hac); this.CPTRA_FUSE_WR_DONE = new("CPTRA_FUSE_WR_DONE"); this.CPTRA_FUSE_WR_DONE.configure(this); this.CPTRA_FUSE_WR_DONE.build(); - this.default_map.add_reg(this.CPTRA_FUSE_WR_DONE, 'hac); + this.default_map.add_reg(this.CPTRA_FUSE_WR_DONE, 'hb0); this.CPTRA_TIMER_CONFIG = new("CPTRA_TIMER_CONFIG"); this.CPTRA_TIMER_CONFIG.configure(this); this.CPTRA_TIMER_CONFIG.build(); - this.default_map.add_reg(this.CPTRA_TIMER_CONFIG, 'hb0); + this.default_map.add_reg(this.CPTRA_TIMER_CONFIG, 'hb4); this.CPTRA_BOOTFSM_GO = new("CPTRA_BOOTFSM_GO"); this.CPTRA_BOOTFSM_GO.configure(this); this.CPTRA_BOOTFSM_GO.build(); - this.default_map.add_reg(this.CPTRA_BOOTFSM_GO, 'hb4); + this.default_map.add_reg(this.CPTRA_BOOTFSM_GO, 'hb8); this.CPTRA_DBG_MANUF_SERVICE_REG = new("CPTRA_DBG_MANUF_SERVICE_REG"); this.CPTRA_DBG_MANUF_SERVICE_REG.configure(this); this.CPTRA_DBG_MANUF_SERVICE_REG.build(); - this.default_map.add_reg(this.CPTRA_DBG_MANUF_SERVICE_REG, 'hb8); + this.default_map.add_reg(this.CPTRA_DBG_MANUF_SERVICE_REG, 'hbc); this.CPTRA_CLK_GATING_EN = new("CPTRA_CLK_GATING_EN"); this.CPTRA_CLK_GATING_EN.configure(this); this.CPTRA_CLK_GATING_EN.build(); - this.default_map.add_reg(this.CPTRA_CLK_GATING_EN, 'hbc); + this.default_map.add_reg(this.CPTRA_CLK_GATING_EN, 'hc0); foreach(this.CPTRA_GENERIC_INPUT_WIRES[i0]) begin this.CPTRA_GENERIC_INPUT_WIRES[i0] = new($sformatf("CPTRA_GENERIC_INPUT_WIRES[%0d]", i0)); this.CPTRA_GENERIC_INPUT_WIRES[i0].configure(this); this.CPTRA_GENERIC_INPUT_WIRES[i0].build(); - this.default_map.add_reg(this.CPTRA_GENERIC_INPUT_WIRES[i0], 'hc0 + i0*'h4); + this.default_map.add_reg(this.CPTRA_GENERIC_INPUT_WIRES[i0], 'hc4 + i0*'h4); end foreach(this.CPTRA_GENERIC_OUTPUT_WIRES[i0]) begin this.CPTRA_GENERIC_OUTPUT_WIRES[i0] = new($sformatf("CPTRA_GENERIC_OUTPUT_WIRES[%0d]", i0)); this.CPTRA_GENERIC_OUTPUT_WIRES[i0].configure(this); this.CPTRA_GENERIC_OUTPUT_WIRES[i0].build(); - this.default_map.add_reg(this.CPTRA_GENERIC_OUTPUT_WIRES[i0], 'hc8 + i0*'h4); + this.default_map.add_reg(this.CPTRA_GENERIC_OUTPUT_WIRES[i0], 'hcc + i0*'h4); end this.CPTRA_HW_REV_ID = new("CPTRA_HW_REV_ID"); this.CPTRA_HW_REV_ID.configure(this); this.CPTRA_HW_REV_ID.build(); - this.default_map.add_reg(this.CPTRA_HW_REV_ID, 'hd0); + this.default_map.add_reg(this.CPTRA_HW_REV_ID, 'hd4); foreach(this.CPTRA_FW_REV_ID[i0]) begin this.CPTRA_FW_REV_ID[i0] = new($sformatf("CPTRA_FW_REV_ID[%0d]", i0)); this.CPTRA_FW_REV_ID[i0].configure(this); this.CPTRA_FW_REV_ID[i0].build(); - this.default_map.add_reg(this.CPTRA_FW_REV_ID[i0], 'hd4 + i0*'h4); + this.default_map.add_reg(this.CPTRA_FW_REV_ID[i0], 'hd8 + i0*'h4); end this.CPTRA_HW_CONFIG = new("CPTRA_HW_CONFIG"); this.CPTRA_HW_CONFIG.configure(this); this.CPTRA_HW_CONFIG.build(); - this.default_map.add_reg(this.CPTRA_HW_CONFIG, 'hdc); + this.default_map.add_reg(this.CPTRA_HW_CONFIG, 'he0); this.CPTRA_WDT_TIMER1_EN = new("CPTRA_WDT_TIMER1_EN"); this.CPTRA_WDT_TIMER1_EN.configure(this); this.CPTRA_WDT_TIMER1_EN.build(); - this.default_map.add_reg(this.CPTRA_WDT_TIMER1_EN, 'he0); + this.default_map.add_reg(this.CPTRA_WDT_TIMER1_EN, 'he4); this.CPTRA_WDT_TIMER1_CTRL = new("CPTRA_WDT_TIMER1_CTRL"); this.CPTRA_WDT_TIMER1_CTRL.configure(this); this.CPTRA_WDT_TIMER1_CTRL.build(); - this.default_map.add_reg(this.CPTRA_WDT_TIMER1_CTRL, 'he4); + this.default_map.add_reg(this.CPTRA_WDT_TIMER1_CTRL, 'he8); foreach(this.CPTRA_WDT_TIMER1_TIMEOUT_PERIOD[i0]) begin this.CPTRA_WDT_TIMER1_TIMEOUT_PERIOD[i0] = new($sformatf("CPTRA_WDT_TIMER1_TIMEOUT_PERIOD[%0d]", i0)); this.CPTRA_WDT_TIMER1_TIMEOUT_PERIOD[i0].configure(this); this.CPTRA_WDT_TIMER1_TIMEOUT_PERIOD[i0].build(); - this.default_map.add_reg(this.CPTRA_WDT_TIMER1_TIMEOUT_PERIOD[i0], 'he8 + i0*'h4); + this.default_map.add_reg(this.CPTRA_WDT_TIMER1_TIMEOUT_PERIOD[i0], 'hec + i0*'h4); end this.CPTRA_WDT_TIMER2_EN = new("CPTRA_WDT_TIMER2_EN"); this.CPTRA_WDT_TIMER2_EN.configure(this); this.CPTRA_WDT_TIMER2_EN.build(); - this.default_map.add_reg(this.CPTRA_WDT_TIMER2_EN, 'hf0); + this.default_map.add_reg(this.CPTRA_WDT_TIMER2_EN, 'hf4); this.CPTRA_WDT_TIMER2_CTRL = new("CPTRA_WDT_TIMER2_CTRL"); this.CPTRA_WDT_TIMER2_CTRL.configure(this); this.CPTRA_WDT_TIMER2_CTRL.build(); - this.default_map.add_reg(this.CPTRA_WDT_TIMER2_CTRL, 'hf4); + this.default_map.add_reg(this.CPTRA_WDT_TIMER2_CTRL, 'hf8); foreach(this.CPTRA_WDT_TIMER2_TIMEOUT_PERIOD[i0]) begin this.CPTRA_WDT_TIMER2_TIMEOUT_PERIOD[i0] = new($sformatf("CPTRA_WDT_TIMER2_TIMEOUT_PERIOD[%0d]", i0)); this.CPTRA_WDT_TIMER2_TIMEOUT_PERIOD[i0].configure(this); this.CPTRA_WDT_TIMER2_TIMEOUT_PERIOD[i0].build(); - this.default_map.add_reg(this.CPTRA_WDT_TIMER2_TIMEOUT_PERIOD[i0], 'hf8 + i0*'h4); + this.default_map.add_reg(this.CPTRA_WDT_TIMER2_TIMEOUT_PERIOD[i0], 'hfc + i0*'h4); end this.CPTRA_WDT_STATUS = new("CPTRA_WDT_STATUS"); this.CPTRA_WDT_STATUS.configure(this); this.CPTRA_WDT_STATUS.build(); - this.default_map.add_reg(this.CPTRA_WDT_STATUS, 'h100); + this.default_map.add_reg(this.CPTRA_WDT_STATUS, 'h104); + this.CPTRA_FUSE_VALID_PAUSER = new("CPTRA_FUSE_VALID_PAUSER"); + this.CPTRA_FUSE_VALID_PAUSER.configure(this); + + this.CPTRA_FUSE_VALID_PAUSER.build(); + this.default_map.add_reg(this.CPTRA_FUSE_VALID_PAUSER, 'h108); + this.CPTRA_FUSE_PAUSER_LOCK = new("CPTRA_FUSE_PAUSER_LOCK"); + this.CPTRA_FUSE_PAUSER_LOCK.configure(this); + + this.CPTRA_FUSE_PAUSER_LOCK.build(); + this.default_map.add_reg(this.CPTRA_FUSE_PAUSER_LOCK, 'h10c); + foreach(this.CPTRA_WDT_CFG[i0]) begin + this.CPTRA_WDT_CFG[i0] = new($sformatf("CPTRA_WDT_CFG[%0d]", i0)); + this.CPTRA_WDT_CFG[i0].configure(this); + + this.CPTRA_WDT_CFG[i0].build(); + this.default_map.add_reg(this.CPTRA_WDT_CFG[i0], 'h110 + i0*'h4); + end + this.CPTRA_iTRNG_ENTROPY_CONFIG_0 = new("CPTRA_iTRNG_ENTROPY_CONFIG_0"); + this.CPTRA_iTRNG_ENTROPY_CONFIG_0.configure(this); + + this.CPTRA_iTRNG_ENTROPY_CONFIG_0.build(); + this.default_map.add_reg(this.CPTRA_iTRNG_ENTROPY_CONFIG_0, 'h118); + this.CPTRA_iTRNG_ENTROPY_CONFIG_1 = new("CPTRA_iTRNG_ENTROPY_CONFIG_1"); + this.CPTRA_iTRNG_ENTROPY_CONFIG_1.configure(this); + + this.CPTRA_iTRNG_ENTROPY_CONFIG_1.build(); + this.default_map.add_reg(this.CPTRA_iTRNG_ENTROPY_CONFIG_1, 'h11c); + foreach(this.CPTRA_RSVD_REG[i0]) begin + this.CPTRA_RSVD_REG[i0] = new($sformatf("CPTRA_RSVD_REG[%0d]", i0)); + this.CPTRA_RSVD_REG[i0].configure(this); + + this.CPTRA_RSVD_REG[i0].build(); + this.default_map.add_reg(this.CPTRA_RSVD_REG[i0], 'h120 + i0*'h4); + end foreach(this.fuse_uds_seed[i0]) begin this.fuse_uds_seed[i0] = new($sformatf("fuse_uds_seed[%0d]", i0)); this.fuse_uds_seed[i0].configure(this); @@ -1825,6 +4077,21 @@ package soc_ifc_reg_uvm; this.fuse_life_cycle.build(); this.default_map.add_reg(this.fuse_life_cycle, 'h33c); + this.fuse_lms_verify = new("fuse_lms_verify"); + this.fuse_lms_verify.configure(this); + + this.fuse_lms_verify.build(); + this.default_map.add_reg(this.fuse_lms_verify, 'h340); + this.fuse_lms_revocation = new("fuse_lms_revocation"); + this.fuse_lms_revocation.configure(this); + + this.fuse_lms_revocation.build(); + this.default_map.add_reg(this.fuse_lms_revocation, 'h344); + this.fuse_soc_stepping_id = new("fuse_soc_stepping_id"); + this.fuse_soc_stepping_id.configure(this); + + this.fuse_soc_stepping_id.build(); + this.default_map.add_reg(this.fuse_soc_stepping_id, 'h348); foreach(this.internal_obf_key[i0]) begin this.internal_obf_key[i0] = new($sformatf("internal_obf_key[%0d]", i0)); this.internal_obf_key[i0].configure(this); @@ -1852,6 +4119,46 @@ package soc_ifc_reg_uvm; this.internal_nmi_vector.build(); this.default_map.add_reg(this.internal_nmi_vector, 'h62c); + this.internal_hw_error_fatal_mask = new("internal_hw_error_fatal_mask"); + this.internal_hw_error_fatal_mask.configure(this); + + this.internal_hw_error_fatal_mask.build(); + this.default_map.add_reg(this.internal_hw_error_fatal_mask, 'h630); + this.internal_hw_error_non_fatal_mask = new("internal_hw_error_non_fatal_mask"); + this.internal_hw_error_non_fatal_mask.configure(this); + + this.internal_hw_error_non_fatal_mask.build(); + this.default_map.add_reg(this.internal_hw_error_non_fatal_mask, 'h634); + this.internal_fw_error_fatal_mask = new("internal_fw_error_fatal_mask"); + this.internal_fw_error_fatal_mask.configure(this); + + this.internal_fw_error_fatal_mask.build(); + this.default_map.add_reg(this.internal_fw_error_fatal_mask, 'h638); + this.internal_fw_error_non_fatal_mask = new("internal_fw_error_non_fatal_mask"); + this.internal_fw_error_non_fatal_mask.configure(this); + + this.internal_fw_error_non_fatal_mask.build(); + this.default_map.add_reg(this.internal_fw_error_non_fatal_mask, 'h63c); + this.internal_rv_mtime_l = new("internal_rv_mtime_l"); + this.internal_rv_mtime_l.configure(this); + + this.internal_rv_mtime_l.build(); + this.default_map.add_reg(this.internal_rv_mtime_l, 'h640); + this.internal_rv_mtime_h = new("internal_rv_mtime_h"); + this.internal_rv_mtime_h.configure(this); + + this.internal_rv_mtime_h.build(); + this.default_map.add_reg(this.internal_rv_mtime_h, 'h644); + this.internal_rv_mtimecmp_l = new("internal_rv_mtimecmp_l"); + this.internal_rv_mtimecmp_l.configure(this); + + this.internal_rv_mtimecmp_l.build(); + this.default_map.add_reg(this.internal_rv_mtimecmp_l, 'h648); + this.internal_rv_mtimecmp_h = new("internal_rv_mtimecmp_h"); + this.internal_rv_mtimecmp_h.configure(this); + + this.internal_rv_mtimecmp_h.build(); + this.default_map.add_reg(this.internal_rv_mtimecmp_h, 'h64c); this.intr_block_rf = new("intr_block_rf"); this.intr_block_rf.configure(this); this.intr_block_rf.build(); @@ -1859,4 +4166,5 @@ package soc_ifc_reg_uvm; endfunction : build endclass : soc_ifc_reg + `include "soc_ifc_reg_sample.svh" endpackage: soc_ifc_reg_uvm diff --git a/src/soc_ifc/rtl/soc_ifc_top.sv b/src/soc_ifc/rtl/soc_ifc_top.sv index 4347ec15a..5629dd4b5 100644 --- a/src/soc_ifc/rtl/soc_ifc_top.sv +++ b/src/soc_ifc/rtl/soc_ifc_top.sv @@ -14,6 +14,7 @@ `include "caliptra_sva.svh" `include "caliptra_macros.svh" +`include "caliptra_reg_defines.svh" module soc_ifc_top import soc_ifc_pkg::*; @@ -29,6 +30,7 @@ module soc_ifc_top input logic clk, input logic clk_cg, input logic soc_ifc_clk_cg, + input logic rdc_clk_cg, //SoC boot signals input logic cptra_pwrgood, @@ -81,11 +83,15 @@ module soc_ifc_top output wire soc_ifc_notif_intr, output wire sha_error_intr, output wire sha_notif_intr, + output wire timer_intr, //SRAM interface output mbox_sram_req_t mbox_sram_req, input mbox_sram_resp_t mbox_sram_resp, + // RV ECC Status Interface + input rv_ecc_sts_t rv_ecc_sts, + //Obfuscated UDS and FE input logic clear_obf_secrets, input logic scan_mode_f, @@ -108,6 +114,8 @@ module soc_ifc_top output logic cptra_uc_rst_b, //Clock gating output logic clk_gating_en, + output logic rdc_clk_dis, + output logic fw_update_rst_window, //caliptra uncore jtag ports input logic cptra_uncore_dmi_reg_en, @@ -135,6 +143,7 @@ logic mbox_dir_req_dv; logic mbox_req_hold; soc_ifc_req_t mbox_req_data; logic [SOC_IFC_DATA_W-1:0] mbox_rdata; +logic [SOC_IFC_DATA_W-1:0] mbox_dir_rdata; logic mbox_error; //sha req inf @@ -165,18 +174,28 @@ logic uc_mbox_data_avail_d; logic uc_cmd_avail_p; logic security_state_debug_locked_d; logic security_state_debug_locked_p; +logic scan_mode_d; +logic scan_mode_p; logic sram_single_ecc_error; logic sram_double_ecc_error; logic soc_req_mbox_lock; +logic [1:0] generic_input_toggle; +mbox_protocol_error_t mbox_protocol_error; +logic mbox_inv_user_p; logic iccm_unlock; logic fw_upd_rst_executed; logic fuse_wr_done_reg_write_observed; +logic unmasked_hw_error_fatal_write; +logic unmasked_hw_error_non_fatal_write; +logic unmasked_hw_error_non_fatal_is_set; + logic pwrgood_toggle_hint; logic Warm_Reset_Capture_Flag; logic BootFSM_BrkPoint_Latched; +logic BootFSM_BrkPoint_valid; logic BootFSM_BrkPoint_Flag; logic dmi_inc_rdptr; @@ -202,9 +221,11 @@ logic t2_timeout_f; //To generate interrupt pulse logic t2_timeout_p; logic wdt_error_t1_intr_serviced; logic wdt_error_t2_intr_serviced; -logic soc_ifc_error_intr_f; logic valid_trng_user; +logic valid_fuse_user; + +boot_fsm_state_e boot_fsm_ps; //Boot FSM //This module contains the logic required to control the Caliptra Boot Flow @@ -214,20 +235,24 @@ soc_ifc_boot_fsm i_soc_ifc_boot_fsm ( .clk(clk), .cptra_pwrgood(cptra_pwrgood), .cptra_rst_b (cptra_rst_b), + .scan_mode(scan_mode_f), .fw_update_rst (soc_ifc_reg_hwif_out.internal_fw_update_reset.core_rst.value), .fw_update_rst_wait_cycles (soc_ifc_reg_hwif_out.internal_fw_update_reset_wait_cycles.wait_cycles.value), .ready_for_fuses(ready_for_fuses), + .boot_fsm_ps(boot_fsm_ps), .fuse_done(soc_ifc_reg_hwif_out.CPTRA_FUSE_WR_DONE.done.value), .fuse_wr_done_observed(fuse_wr_done_reg_write_observed), - .BootFSM_BrkPoint(BootFSM_BrkPoint_Latched), + .BootFSM_BrkPoint(BootFSM_BrkPoint_valid), .BootFSM_Continue(soc_ifc_reg_hwif_out.CPTRA_BOOTFSM_GO.GO.value), .cptra_noncore_rst_b(cptra_noncore_rst_b), //goes to all other blocks .cptra_uc_rst_b(cptra_uc_rst_b), //goes to veer core .iccm_unlock(iccm_unlock), - .fw_upd_rst_executed(fw_upd_rst_executed) + .fw_upd_rst_executed(fw_upd_rst_executed), + .rdc_clk_dis(rdc_clk_dis), + .fw_update_rst_window(fw_update_rst_window) ); always_comb soc_ifc_reg_hwif_in.CPTRA_RESET_REASON.FW_UPD_RESET.we = fw_upd_rst_executed; @@ -245,7 +270,7 @@ apb_slv_sif #( i_apb_slv_sif_soc_ifc ( //AMBA APB INF .PCLK(soc_ifc_clk_cg), - .PRESETn(cptra_rst_b), + .PRESETn(cptra_noncore_rst_b), .PADDR(paddr_i), .PPROT('0), .PSEL(psel_i), @@ -320,8 +345,9 @@ soc_ifc_arb #( ) i_soc_ifc_arb ( .clk(soc_ifc_clk_cg), - .rst_b(cptra_rst_b), + .rst_b(cptra_noncore_rst_b), .valid_mbox_users(valid_mbox_users), + .valid_fuse_user(valid_fuse_user), //UC inf .uc_req_dv(uc_req_dv), .uc_req_hold(uc_req_hold), @@ -340,6 +366,7 @@ soc_ifc_arb #( .mbox_req_hold(mbox_req_hold), .mbox_req_data(mbox_req_data), .mbox_rdata(mbox_rdata), + .mbox_dir_rdata(mbox_dir_rdata), .mbox_error(mbox_error), //SHA inf .sha_req_dv(sha_req_dv), @@ -363,7 +390,7 @@ soc_ifc_arb #( //Read and Write permissions are controlled within this block always_comb soc_ifc_reg_error = soc_ifc_reg_read_error | soc_ifc_reg_write_error; -always_comb soc_ifc_reg_hwif_in.cptra_rst_b = cptra_rst_b; +always_comb soc_ifc_reg_hwif_in.cptra_rst_b = cptra_noncore_rst_b; always_comb soc_ifc_reg_hwif_in.cptra_pwrgood = cptra_pwrgood; always_comb soc_ifc_reg_hwif_in.soc_req = soc_ifc_reg_req_data.soc_req; @@ -384,6 +411,11 @@ always_comb soc_ifc_reg_hwif_in.CPTRA_HW_CONFIG.UART_en.next = 1'b1; always_comb soc_ifc_reg_hwif_in.CPTRA_HW_CONFIG.UART_en.next = 1'b0; `endif +//SOC Stepping ID update +always_comb begin + soc_ifc_reg_hwif_in.CPTRA_HW_REV_ID.SOC_STEPPING_ID.next = soc_ifc_reg_hwif_out.fuse_soc_stepping_id.soc_stepping_id.value[15:0]; +end + always_comb begin for (int i = 0; i < `CLP_OBF_KEY_DWORDS; i++) begin soc_ifc_reg_hwif_in.internal_obf_key[i].key.swwe = '0; //sw can't write to obf key @@ -407,6 +439,7 @@ always_comb begin ready_for_fw_push = soc_ifc_reg_hwif_out.CPTRA_FLOW_STATUS.ready_for_fw.value; ready_for_runtime = soc_ifc_reg_hwif_out.CPTRA_FLOW_STATUS.ready_for_runtime.value; soc_ifc_reg_hwif_in.CPTRA_FLOW_STATUS.ready_for_fuses.next = ready_for_fuses; + soc_ifc_reg_hwif_in.CPTRA_FLOW_STATUS.boot_fsm_ps.next = boot_fsm_ps; soc_ifc_reg_hwif_in.CPTRA_SECURITY_STATE.device_lifecycle.next = security_state.device_lifecycle; soc_ifc_reg_hwif_in.CPTRA_SECURITY_STATE.debug_locked.next = security_state.debug_locked; soc_ifc_reg_hwif_in.CPTRA_SECURITY_STATE.scan_mode.next = scan_mode_f; @@ -414,6 +447,12 @@ always_comb begin for (int i = 0; i < 2; i++) begin generic_output_wires[i] = soc_ifc_reg_hwif_out.CPTRA_GENERIC_OUTPUT_WIRES[i].generic_wires.value; soc_ifc_reg_hwif_in.CPTRA_GENERIC_INPUT_WIRES[i].generic_wires.next = generic_input_wires[i]; + if (|(soc_ifc_reg_hwif_out.CPTRA_GENERIC_INPUT_WIRES[i].generic_wires.value ^ generic_input_wires[i])) begin + generic_input_toggle[i] = 1; + end + else begin + generic_input_toggle[i] = 0; + end end end @@ -426,21 +465,23 @@ logic cptra_in_dbg_or_manuf_mode; assign cptra_in_dbg_or_manuf_mode = ~(security_state.debug_locked) | ((security_state.debug_locked) & (security_state.device_lifecycle == DEVICE_MANUFACTURING)); -always_ff @(posedge clk or negedge cptra_rst_b) begin - if (~cptra_rst_b) begin +always_ff @(posedge rdc_clk_cg or negedge cptra_noncore_rst_b) begin + if (~cptra_noncore_rst_b) begin BootFSM_BrkPoint_Latched <= 0; BootFSM_BrkPoint_Flag <= 0; end // Breakpoint value captured on a Caliptra reset deassertion (0->1 signal transition) and is reset on BootFSM_Continue is set // BootFSM_Continue's reset value is zero else if(!BootFSM_BrkPoint_Flag) begin - BootFSM_BrkPoint_Latched <= BootFSM_BrkPoint & cptra_in_dbg_or_manuf_mode; + BootFSM_BrkPoint_Latched <= BootFSM_BrkPoint; BootFSM_BrkPoint_Flag <= 1; end end +assign BootFSM_BrkPoint_valid = BootFSM_BrkPoint_Latched & cptra_in_dbg_or_manuf_mode; + // pwrgood_hint informs if the powergood toggled -always_ff @(posedge clk or negedge cptra_pwrgood) begin +always_ff @(posedge rdc_clk_cg or negedge cptra_pwrgood) begin if(~cptra_pwrgood) begin pwrgood_toggle_hint <= 1; end @@ -450,8 +491,8 @@ always_ff @(posedge clk or negedge cptra_pwrgood) begin end end -always_ff @(posedge clk or negedge cptra_rst_b) begin - if (~cptra_rst_b) begin +always_ff @(posedge rdc_clk_cg or negedge cptra_noncore_rst_b) begin + if (~cptra_noncore_rst_b) begin Warm_Reset_Capture_Flag <= 0; end else if(!Warm_Reset_Capture_Flag) begin @@ -476,7 +517,7 @@ end // Generate a pulse to set the interrupt bit -always_ff @(posedge soc_ifc_clk_cg or negedge cptra_noncore_rst_b) begin +always_ff @(posedge rdc_clk_cg or negedge cptra_noncore_rst_b) begin if (~cptra_noncore_rst_b) begin security_state_debug_locked_d <= '0; end @@ -487,6 +528,18 @@ end always_comb security_state_debug_locked_p = security_state.debug_locked ^ security_state_debug_locked_d; +// Generate a pulse to set the interrupt bit +always_ff @(posedge clk or negedge cptra_noncore_rst_b) begin + if (~cptra_noncore_rst_b) begin + scan_mode_d <= '0; + end + else begin + scan_mode_d <= scan_mode_f; + end +end + +always_comb scan_mode_p = scan_mode_f & ~scan_mode_d; + //Filtering by PAUSER always_comb begin for (int i=0; i<5; i++) begin @@ -500,16 +553,21 @@ always_comb begin soc_ifc_reg_hwif_out.CPTRA_MBOX_VALID_PAUSER[i].PAUSER.value[APB_USER_WIDTH-1:0] : CPTRA_DEF_MBOX_VALID_PAUSER; end end + //can't write to trng valid user after it is locked always_comb soc_ifc_reg_hwif_in.CPTRA_TRNG_VALID_PAUSER.PAUSER.swwel = soc_ifc_reg_hwif_out.CPTRA_TRNG_PAUSER_LOCK.LOCK.value; always_comb soc_ifc_reg_hwif_in.CPTRA_TRNG_PAUSER_LOCK.LOCK.swwel = soc_ifc_reg_hwif_out.CPTRA_TRNG_PAUSER_LOCK.LOCK.value; +//fuse register pauser fields +always_comb soc_ifc_reg_hwif_in.CPTRA_FUSE_VALID_PAUSER.PAUSER.swwel = soc_ifc_reg_hwif_out.CPTRA_FUSE_PAUSER_LOCK.LOCK.value; +always_comb soc_ifc_reg_hwif_in.CPTRA_FUSE_PAUSER_LOCK.LOCK.swwel = soc_ifc_reg_hwif_out.CPTRA_FUSE_PAUSER_LOCK.LOCK.value; + ///////////////////////////////////////////////////////////////////////////////////////////////////////////////// // Can't write to RW-able fuses once fuse_done is set (implies the register is being locked using the fuse_wr_done) ///////////////////////////////////////////////////////////////////////////////////////////////////////////////// -always_ff @(posedge clk or negedge cptra_rst_b) begin - if(~cptra_rst_b) begin +always_ff @(posedge soc_ifc_clk_cg or negedge cptra_noncore_rst_b) begin + if(~cptra_noncore_rst_b) begin fuse_wr_done_reg_write_observed <= 0; end else begin @@ -550,6 +608,9 @@ always_comb soc_ifc_reg_hwif_in.fuse_key_manifest_pk_hash_mask.mask.swwel = soc always_comb soc_ifc_reg_hwif_in.fuse_fmc_key_manifest_svn.svn.swwel = soc_ifc_reg_hwif_out.CPTRA_FUSE_WR_DONE.done.value; always_comb soc_ifc_reg_hwif_in.fuse_anti_rollback_disable.dis.swwel = soc_ifc_reg_hwif_out.CPTRA_FUSE_WR_DONE.done.value; always_comb soc_ifc_reg_hwif_in.fuse_life_cycle.life_cycle.swwel = soc_ifc_reg_hwif_out.CPTRA_FUSE_WR_DONE.done.value; +always_comb soc_ifc_reg_hwif_in.fuse_lms_verify.lms_verify.swwel = soc_ifc_reg_hwif_out.CPTRA_FUSE_WR_DONE.done.value; +always_comb soc_ifc_reg_hwif_in.fuse_lms_revocation.lms_revocation.swwel = soc_ifc_reg_hwif_out.CPTRA_FUSE_WR_DONE.done.value; +always_comb soc_ifc_reg_hwif_in.fuse_soc_stepping_id.soc_stepping_id.swwel = soc_ifc_reg_hwif_out.CPTRA_FUSE_WR_DONE.done.value; // Fuse write done can be written by SOC if it is already NOT '1. uController can only read this bit. The bit gets reset on cold reset always_comb soc_ifc_reg_hwif_in.CPTRA_FUSE_WR_DONE.done.swwe = soc_ifc_reg_req_data.soc_req & ~soc_ifc_reg_hwif_out.CPTRA_FUSE_WR_DONE.done.value; @@ -565,12 +626,21 @@ always_comb soc_ifc_reg_hwif_in.CPTRA_TRNG_STATUS.DATA_WR_DONE.swwe = valid_trng always_comb begin for (int i = 0; i < 12; i++) begin soc_ifc_reg_hwif_in.CPTRA_TRNG_DATA[i].DATA.swwe = valid_trng_user; + soc_ifc_reg_hwif_in.CPTRA_TRNG_DATA[i].DATA.hwclr = soc_ifc_reg_hwif_out.CPTRA_TRNG_CTRL.clear.value; end end //Clear the DATA_WR_DONE when FW clears the req bit always_comb soc_ifc_reg_hwif_in.CPTRA_TRNG_STATUS.DATA_WR_DONE.hwclr = ~soc_ifc_reg_hwif_out.CPTRA_TRNG_STATUS.DATA_REQ.value; +generate + if (CPTRA_SET_FUSE_PAUSER_INTEG) begin + always_comb valid_fuse_user = soc_req_dv & (soc_req.user == CPTRA_FUSE_VALID_PAUSER); + end else begin + always_comb valid_fuse_user = soc_req_dv & (~soc_ifc_reg_hwif_out.CPTRA_FUSE_PAUSER_LOCK.LOCK.value | + (soc_req.user == soc_ifc_reg_hwif_out.CPTRA_FUSE_VALID_PAUSER.PAUSER.value[APB_USER_WIDTH-1:0])); + end +endgenerate // Generate a pulse to set the interrupt bit always_ff @(posedge soc_ifc_clk_cg or negedge cptra_noncore_rst_b) begin if (~cptra_noncore_rst_b) begin @@ -583,16 +653,18 @@ end always_comb uc_cmd_avail_p = uc_mbox_data_avail & !uc_mbox_data_avail_d; // Pulse input to soc_ifc_reg to set the interrupt status bit and generate interrupt output (if enabled) -always_comb soc_ifc_reg_hwif_in.intr_block_rf.error_internal_intr_r.error_internal_sts.hwset = 1'b0; // TODO -always_comb soc_ifc_reg_hwif_in.intr_block_rf.error_internal_intr_r.error_inv_dev_sts.hwset = 1'b0; // TODO should decode from APB PAUSER -always_comb soc_ifc_reg_hwif_in.intr_block_rf.error_internal_intr_r.error_cmd_fail_sts.hwset = 1'b0; // TODO should this be set by write of "FAIL" to mbox_csr.status if soc_req is set? (i.e. SoC cmd execution failed) -always_comb soc_ifc_reg_hwif_in.intr_block_rf.error_internal_intr_r.error_bad_fuse_sts.hwset = 1'b0; // TODO -always_comb soc_ifc_reg_hwif_in.intr_block_rf.error_internal_intr_r.error_iccm_blocked_sts.hwset = iccm_axs_blocked; -always_comb soc_ifc_reg_hwif_in.intr_block_rf.error_internal_intr_r.error_mbox_ecc_unc_sts.hwset = sram_double_ecc_error; -always_comb soc_ifc_reg_hwif_in.intr_block_rf.notif_internal_intr_r.notif_cmd_avail_sts.hwset = uc_cmd_avail_p; // TODO confirm signal correctness -always_comb soc_ifc_reg_hwif_in.intr_block_rf.notif_internal_intr_r.notif_mbox_ecc_cor_sts.hwset = sram_single_ecc_error; -always_comb soc_ifc_reg_hwif_in.intr_block_rf.notif_internal_intr_r.notif_debug_locked_sts.hwset = security_state_debug_locked_p; // Any transition results in interrupt -always_comb soc_ifc_reg_hwif_in.intr_block_rf.notif_internal_intr_r.notif_soc_req_lock_sts.hwset = soc_req_mbox_lock; +always_comb soc_ifc_reg_hwif_in.intr_block_rf.error_internal_intr_r.error_internal_sts.hwset = 1'b0; // TODO +always_comb soc_ifc_reg_hwif_in.intr_block_rf.error_internal_intr_r.error_inv_dev_sts.hwset = mbox_inv_user_p; // All invalid users, or only 'valid user but != mbox_user.user'? +always_comb soc_ifc_reg_hwif_in.intr_block_rf.error_internal_intr_r.error_cmd_fail_sts.hwset = |mbox_protocol_error; // Set by any protocol error violation (mirrors the bits in CPTRA_HW_ERROR_NON_FATAL) +always_comb soc_ifc_reg_hwif_in.intr_block_rf.error_internal_intr_r.error_bad_fuse_sts.hwset = 1'b0; // TODO +always_comb soc_ifc_reg_hwif_in.intr_block_rf.error_internal_intr_r.error_iccm_blocked_sts.hwset = iccm_axs_blocked; +always_comb soc_ifc_reg_hwif_in.intr_block_rf.error_internal_intr_r.error_mbox_ecc_unc_sts.hwset = sram_double_ecc_error; +always_comb soc_ifc_reg_hwif_in.intr_block_rf.notif_internal_intr_r.notif_cmd_avail_sts.hwset = uc_cmd_avail_p; +always_comb soc_ifc_reg_hwif_in.intr_block_rf.notif_internal_intr_r.notif_mbox_ecc_cor_sts.hwset = sram_single_ecc_error; +always_comb soc_ifc_reg_hwif_in.intr_block_rf.notif_internal_intr_r.notif_debug_locked_sts.hwset = security_state_debug_locked_p; // Any transition results in interrupt +always_comb soc_ifc_reg_hwif_in.intr_block_rf.notif_internal_intr_r.notif_scan_mode_sts.hwset = scan_mode_p; // Any transition results in interrupt +always_comb soc_ifc_reg_hwif_in.intr_block_rf.notif_internal_intr_r.notif_soc_req_lock_sts.hwset = soc_req_mbox_lock; +always_comb soc_ifc_reg_hwif_in.intr_block_rf.notif_internal_intr_r.notif_gen_in_toggle_sts.hwset = |generic_input_toggle; always_comb soc_ifc_reg_hwif_in.intr_block_rf.error_internal_intr_r.error_wdt_timer1_timeout_sts.hwset = t1_timeout_p; always_comb soc_ifc_reg_hwif_in.intr_block_rf.error_internal_intr_r.error_wdt_timer2_timeout_sts.hwset = t2_timeout_p && timer2_en; @@ -607,7 +679,7 @@ logic s_cpuif_rd_ack_nc; logic s_cpuif_wr_ack_nc; soc_ifc_reg i_soc_ifc_reg ( - .clk(soc_ifc_clk_cg), + .clk(rdc_clk_cg), .rst('0), //qualify request so no addresses alias .s_cpuif_req(soc_ifc_reg_req_dv & (soc_ifc_reg_req_data.addr[SOC_IFC_ADDR_W-1:SOC_IFC_REG_ADDR_WIDTH] == SOC_IFC_REG_START_ADDR[SOC_IFC_ADDR_W-1:SOC_IFC_REG_ADDR_WIDTH])), @@ -645,12 +717,67 @@ assign nmi_vector = soc_ifc_reg_hwif_out.internal_nmi_vector.vec.value; assign iccm_lock = soc_ifc_reg_hwif_out.internal_iccm_lock.lock.value; assign clk_gating_en = soc_ifc_reg_hwif_out.CPTRA_CLK_GATING_EN.clk_gating_en.value; assign nmi_intr = t2_timeout && !timer2_en; //Only issue nmi if WDT timers are cascaded and t2 times out -assign cptra_error_fatal = t2_timeout && !timer2_en; //Only issue fatal error if WDT timers are cascaded and t2 times out -// TODO -assign cptra_error_non_fatal = 1'b0; // FIXME +// Interrupt output is set, for any enabled conditions, when a new write +// sets CPTRA_FW_ERROR_FATAL or when a HW condition occurs that sets a bit +// in CPTRA_HW_ERROR_FATAL +// Interrupt only deasserts on reset +always_ff@(posedge rdc_clk_cg or negedge cptra_noncore_rst_b) begin + if(~cptra_noncore_rst_b) begin + cptra_error_fatal <= 1'b0; + end + // FW write that SETS a new (non-masked) bit results in interrupt assertion + else if (soc_ifc_reg_req_dv && + soc_ifc_reg_hwif_out.CPTRA_FW_ERROR_FATAL.error_code.swmod && + |(soc_ifc_reg_req_data.wdata & ~soc_ifc_reg_hwif_out.internal_fw_error_fatal_mask.mask.value & ~soc_ifc_reg_hwif_out.CPTRA_FW_ERROR_FATAL.error_code.value)) begin + cptra_error_fatal <= 1'b1; + end + // HW event that SETS a new (non-masked) bit results in interrupt assertion + else if (unmasked_hw_error_fatal_write) begin + cptra_error_fatal <= 1'b1; + end + // NOTE: There is no mechanism to clear interrupt assertion by design. + // Platform MUST perform cptra_rst_b in order to clear cptra_error_fatal + // output signal, per the integration spec. + else begin + cptra_error_fatal <= cptra_error_fatal; + end +end +always_ff@(posedge rdc_clk_cg or negedge cptra_noncore_rst_b) begin + if(~cptra_noncore_rst_b) begin + cptra_error_non_fatal <= 1'b0; + end + // FW write that SETS a new (non-masked) bit results in interrupt assertion + else if (soc_ifc_reg_req_dv && + soc_ifc_reg_hwif_out.CPTRA_FW_ERROR_NON_FATAL.error_code.swmod && + |(soc_ifc_reg_req_data.wdata & ~soc_ifc_reg_hwif_out.internal_fw_error_non_fatal_mask.mask.value & ~soc_ifc_reg_hwif_out.CPTRA_FW_ERROR_NON_FATAL.error_code.value)) begin + cptra_error_non_fatal <= 1'b1; + end + // HW event that SETS a new (non-masked) bit results in interrupt assertion + else if (unmasked_hw_error_non_fatal_write) begin + cptra_error_non_fatal <= 1'b1; + end + // If FW performs a write that clears all outstanding (unmasked) ERROR_NON_FATAL events, deassert interrupt + else if (~unmasked_hw_error_non_fatal_is_set && + ~|(~soc_ifc_reg_hwif_out.internal_fw_error_non_fatal_mask.mask.value & soc_ifc_reg_hwif_out.CPTRA_FW_ERROR_NON_FATAL.error_code.value)) begin + cptra_error_non_fatal <= 1'b0; + end + else begin + cptra_error_non_fatal <= cptra_error_non_fatal; + end +end + assign trng_req = soc_ifc_reg_hwif_out.CPTRA_TRNG_STATUS.DATA_REQ.value; +// mtime always increments, but if it's being written by software the write +// value will update the register. Deasserting incr in this case prevents the +// SW write from being dropped (due to RDL compiler failing to give SW precedence properly). +assign soc_ifc_reg_hwif_in.internal_rv_mtime_l.count_l.incr = !(soc_ifc_reg_req_dv && soc_ifc_reg_hwif_out.internal_rv_mtime_l.count_l.swmod); +assign soc_ifc_reg_hwif_in.internal_rv_mtime_h.count_h.incr = !(soc_ifc_reg_req_dv && soc_ifc_reg_hwif_out.internal_rv_mtime_h.count_h.swmod) && soc_ifc_reg_hwif_out.internal_rv_mtime_l.count_l.overflow; +assign timer_intr = {soc_ifc_reg_hwif_out.internal_rv_mtime_h.count_h.value ,soc_ifc_reg_hwif_out.internal_rv_mtime_l.count_l.value} + >= + {soc_ifc_reg_hwif_out.internal_rv_mtimecmp_h.compare_h.value,soc_ifc_reg_hwif_out.internal_rv_mtimecmp_l.compare_l.value}; + //SHA Accelerator sha512_acc_top #( .DATA_WIDTH(APB_DATA_WIDTH) @@ -693,6 +820,7 @@ i_mbox ( .req_data(mbox_req_data), .mbox_error(mbox_error), .rdata(mbox_rdata), + .dir_rdata(mbox_dir_rdata), .sha_sram_req_dv(sha_sram_req_dv), .sha_sram_req_addr(sha_sram_req_addr), .sha_sram_resp(sha_sram_resp), @@ -704,6 +832,8 @@ i_mbox ( .soc_mbox_data_avail(mailbox_data_avail), .uc_mbox_data_avail(uc_mbox_data_avail), .soc_req_mbox_lock(soc_req_mbox_lock), + .mbox_protocol_error(mbox_protocol_error), + .mbox_inv_pauser_axs(mbox_inv_user_p), .dmi_inc_rdptr(dmi_inc_rdptr), .dmi_reg(mbox_dmi_reg) ); @@ -728,8 +858,8 @@ always_comb begin end //Generate t1 and t2 timeout interrupt pulse -always_ff @(posedge clk or negedge cptra_rst_b) begin - if(!cptra_rst_b) begin +always_ff @(posedge rdc_clk_cg or negedge cptra_noncore_rst_b) begin + if(!cptra_noncore_rst_b) begin t1_timeout_f <= 'b0; t2_timeout_f <= 'b0; end @@ -742,34 +872,28 @@ end always_comb t1_timeout_p = t1_timeout & ~t1_timeout_f; always_comb t2_timeout_p = t2_timeout & ~t2_timeout_f; -//Detect falling edge on soc_ifc_error_intr to indicate that the interrupt has been serviced -always_ff @(posedge clk or negedge cptra_rst_b) begin - if(!cptra_rst_b) begin - soc_ifc_error_intr_f <= 'b0; +// NOTE: Since error_internal_intr_r is Write-1-to-clear, capture writes to the +// WDT interrupt bits to detect the interrupt being serviced. +// It would be preferable to decode this from interrupt signals somehow, +// but that would require modifying interrupt register RDL which has been +// standardized. +always_ff @(posedge soc_ifc_clk_cg or negedge cptra_noncore_rst_b) begin + if(!cptra_noncore_rst_b) begin + wdt_error_t1_intr_serviced <= 1'b0; + wdt_error_t2_intr_serviced <= 1'b0; + end + else if (soc_ifc_reg_req_dv && soc_ifc_reg_req_data.write && (soc_ifc_reg_req_data.addr[SOC_IFC_REG_ADDR_WIDTH-1:0] == `SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R)) begin + wdt_error_t1_intr_serviced <= soc_ifc_reg_req_data.wdata[`SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_WDT_TIMER1_TIMEOUT_STS_LOW] && t1_timeout; + wdt_error_t2_intr_serviced <= soc_ifc_reg_req_data.wdata[`SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_WDT_TIMER2_TIMEOUT_STS_LOW] && t2_timeout && timer2_en; end else begin - soc_ifc_error_intr_f <= soc_ifc_error_intr; + wdt_error_t1_intr_serviced <= 1'b0; + wdt_error_t2_intr_serviced <= 1'b0; end end -assign wdt_error_t1_intr_serviced = !soc_ifc_error_intr && soc_ifc_error_intr_f && t1_timeout; -assign wdt_error_t2_intr_serviced = !soc_ifc_error_intr && soc_ifc_error_intr_f && t2_timeout && timer2_en; - -//Set HW FATAL ERROR reg when timer2 times out in cascaded mode -always_comb soc_ifc_reg_hwif_in.CPTRA_HW_ERROR_FATAL.error_code.we = cptra_error_fatal; -always_comb soc_ifc_reg_hwif_in.CPTRA_HW_ERROR_FATAL.error_code.next = {31'b0, cptra_error_fatal}; //bit 0 will indicate if timer2 has timed out - -//TIE-OFFS -always_comb begin - soc_ifc_reg_hwif_in.CPTRA_HW_ERROR_NON_FATAL.error_code.we = 'b0; - soc_ifc_reg_hwif_in.CPTRA_HW_ERROR_NON_FATAL.error_code.next = 'h0; - soc_ifc_reg_hwif_in.CPTRA_FW_ERROR_FATAL.error_code.we = 'b0; - soc_ifc_reg_hwif_in.CPTRA_FW_ERROR_FATAL.error_code.next = 'h0; - soc_ifc_reg_hwif_in.CPTRA_FW_ERROR_NON_FATAL.error_code.we = 'b0; - soc_ifc_reg_hwif_in.CPTRA_FW_ERROR_NON_FATAL.error_code.next = 'h0; -end wdt i_wdt ( - .clk(clk), + .clk(rdc_clk_cg), .cptra_rst_b(cptra_noncore_rst_b), .timer1_en(timer1_en), .timer2_en(timer2_en), @@ -782,6 +906,48 @@ wdt i_wdt ( .t1_timeout(t1_timeout), .t2_timeout(t2_timeout) ); + +//////////////////////////////////////////////////////// +// Write-enables for CPTRA_HW_ERROR_FATAL and CPTRA_HW_ERROR_NON_FATAL +// Also calculate whether or not an unmasked event is being set, so we can +// trigger the SOC interrupt signal +always_comb soc_ifc_reg_hwif_in.CPTRA_HW_ERROR_FATAL.iccm_ecc_unc.we = rv_ecc_sts.cptra_iccm_ecc_double_error & ~fw_update_rst_window; +always_comb soc_ifc_reg_hwif_in.CPTRA_HW_ERROR_FATAL.dccm_ecc_unc.we = rv_ecc_sts.cptra_dccm_ecc_double_error & ~fw_update_rst_window; +always_comb soc_ifc_reg_hwif_in.CPTRA_HW_ERROR_FATAL.nmi_pin .we = nmi_intr; +// Using we+next instead of hwset allows us to encode the reserved fields in some fashion +// other than bit-hot in the future, if needed (e.g. we need to encode > 32 FATAL events) +always_comb soc_ifc_reg_hwif_in.CPTRA_HW_ERROR_FATAL.iccm_ecc_unc.next = 1'b1; +always_comb soc_ifc_reg_hwif_in.CPTRA_HW_ERROR_FATAL.dccm_ecc_unc.next = 1'b1; +always_comb soc_ifc_reg_hwif_in.CPTRA_HW_ERROR_FATAL.nmi_pin .next = 1'b1; +// Flag the write even if the field being written to is already set to 1 - this is a new occurrence of the error and should trigger a new interrupt +always_comb unmasked_hw_error_fatal_write = (soc_ifc_reg_hwif_in.CPTRA_HW_ERROR_FATAL.iccm_ecc_unc.we && ~soc_ifc_reg_hwif_out.internal_hw_error_fatal_mask.mask_iccm_ecc_unc.value && |soc_ifc_reg_hwif_in.CPTRA_HW_ERROR_FATAL.iccm_ecc_unc.next) || + (soc_ifc_reg_hwif_in.CPTRA_HW_ERROR_FATAL.dccm_ecc_unc.we && ~soc_ifc_reg_hwif_out.internal_hw_error_fatal_mask.mask_dccm_ecc_unc.value && |soc_ifc_reg_hwif_in.CPTRA_HW_ERROR_FATAL.dccm_ecc_unc.next) || + (soc_ifc_reg_hwif_in.CPTRA_HW_ERROR_FATAL.nmi_pin .we && ~soc_ifc_reg_hwif_out.internal_hw_error_fatal_mask.mask_nmi_pin .value && |soc_ifc_reg_hwif_in.CPTRA_HW_ERROR_FATAL.nmi_pin .next); + +always_comb soc_ifc_reg_hwif_in.CPTRA_HW_ERROR_NON_FATAL.mbox_prot_no_lock.we = mbox_protocol_error.axs_without_lock; +always_comb soc_ifc_reg_hwif_in.CPTRA_HW_ERROR_NON_FATAL.mbox_prot_ooo .we = mbox_protocol_error.axs_incorrect_order; +always_comb soc_ifc_reg_hwif_in.CPTRA_HW_ERROR_NON_FATAL.mbox_ecc_unc .we = sram_double_ecc_error; +// Using we+next instead of hwset allows us to encode the reserved fields in some fashion +// other than bit-hot in the future, if needed (e.g. we need to encode > 32 NON-FATAL events) +always_comb soc_ifc_reg_hwif_in.CPTRA_HW_ERROR_NON_FATAL.mbox_prot_no_lock.next = 1'b1; +always_comb soc_ifc_reg_hwif_in.CPTRA_HW_ERROR_NON_FATAL.mbox_prot_ooo .next = 1'b1; +always_comb soc_ifc_reg_hwif_in.CPTRA_HW_ERROR_NON_FATAL.mbox_ecc_unc .next = 1'b1; +// Flag the write even if the field being written to is already set to 1 - this is a new occurrence of the error and should trigger a new interrupt +always_comb unmasked_hw_error_non_fatal_write = (soc_ifc_reg_hwif_in.CPTRA_HW_ERROR_NON_FATAL.mbox_prot_no_lock.we && ~soc_ifc_reg_hwif_out.internal_hw_error_non_fatal_mask.mask_mbox_prot_no_lock.value && |soc_ifc_reg_hwif_in.CPTRA_HW_ERROR_NON_FATAL.mbox_prot_no_lock.next) || + (soc_ifc_reg_hwif_in.CPTRA_HW_ERROR_NON_FATAL.mbox_prot_ooo .we && ~soc_ifc_reg_hwif_out.internal_hw_error_non_fatal_mask.mask_mbox_prot_ooo .value && |soc_ifc_reg_hwif_in.CPTRA_HW_ERROR_NON_FATAL.mbox_prot_ooo .next) || + (soc_ifc_reg_hwif_in.CPTRA_HW_ERROR_NON_FATAL.mbox_ecc_unc .we && ~soc_ifc_reg_hwif_out.internal_hw_error_non_fatal_mask.mask_mbox_ecc_unc .value && |soc_ifc_reg_hwif_in.CPTRA_HW_ERROR_NON_FATAL.mbox_ecc_unc .next); +always_comb unmasked_hw_error_non_fatal_is_set = (soc_ifc_reg_hwif_out.CPTRA_HW_ERROR_NON_FATAL.mbox_prot_no_lock.value && ~soc_ifc_reg_hwif_out.internal_hw_error_non_fatal_mask.mask_mbox_prot_no_lock.value) || + (soc_ifc_reg_hwif_out.CPTRA_HW_ERROR_NON_FATAL.mbox_prot_ooo .value && ~soc_ifc_reg_hwif_out.internal_hw_error_non_fatal_mask.mask_mbox_prot_ooo .value) || + (soc_ifc_reg_hwif_out.CPTRA_HW_ERROR_NON_FATAL.mbox_ecc_unc .value && ~soc_ifc_reg_hwif_out.internal_hw_error_non_fatal_mask.mask_mbox_ecc_unc .value); + +//TIE-OFFS +always_comb begin + soc_ifc_reg_hwif_in.CPTRA_FW_ERROR_FATAL.error_code.we = 'b0; + soc_ifc_reg_hwif_in.CPTRA_FW_ERROR_FATAL.error_code.next = 'h0; + soc_ifc_reg_hwif_in.CPTRA_FW_ERROR_NON_FATAL.error_code.we = 'b0; + soc_ifc_reg_hwif_in.CPTRA_FW_ERROR_NON_FATAL.error_code.next = 'h0; +end + //DMI register writes always_comb soc_ifc_reg_hwif_in.CPTRA_BOOTFSM_GO.GO.we = cptra_uncore_dmi_reg_wr_en & cptra_uncore_dmi_reg_en & (cptra_uncore_dmi_reg_addr == DMI_REG_BOOTFSM_GO); @@ -804,7 +970,7 @@ always_comb cptra_uncore_dmi_reg_rdata_in = ({32{(cptra_uncore_dmi_reg_addr == D //This assumes that reg_en goes low between read accesses always_comb dmi_inc_rdptr = cptra_uncore_dmi_reg_dout_access_f & ~cptra_uncore_dmi_reg_en; -always_ff @(posedge clk or negedge cptra_pwrgood) begin +always_ff @(posedge rdc_clk_cg or negedge cptra_pwrgood) begin if (~cptra_pwrgood) begin cptra_uncore_dmi_reg_rdata <= '0; cptra_uncore_dmi_reg_dout_access_f <= '0; @@ -815,7 +981,7 @@ always_ff @(posedge clk or negedge cptra_pwrgood) begin end end -`CALIPTRA_ASSERT_KNOWN(ERR_AHB_INF_X, {hreadyout_o,hresp_o}, soc_ifc_clk_cg, cptra_rst_b) +`CALIPTRA_ASSERT_KNOWN(ERR_AHB_INF_X, {hreadyout_o,hresp_o}, clk, cptra_noncore_rst_b) //this generates an NMI in the core, but we don't have a handler so it just hangs -`CALIPTRA_ASSERT_NEVER(ERR_SOC_IFC_AHB_ERR, hresp_o, soc_ifc_clk_cg, cptra_rst_b) +`CALIPTRA_ASSERT_NEVER(ERR_SOC_IFC_AHB_ERR, hresp_o, clk, cptra_noncore_rst_b) endmodule diff --git a/src/soc_ifc/stimulus/tests/directed/fuse_reg_pauser_test.yml b/src/soc_ifc/stimulus/tests/directed/fuse_reg_pauser_test.yml new file mode 100644 index 000000000..9b06b5312 --- /dev/null +++ b/src/soc_ifc/stimulus/tests/directed/fuse_reg_pauser_test.yml @@ -0,0 +1,20 @@ +# SPDX-License-Identifier: Apache-2.0 +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +--- +plusargs: + - +SOC_IFC_TEST='fuse_reg_pauser_test' + +testname: fuse_reg_pauser_test +seed: ${PLAYBOOK_RANDOM_SEED} diff --git a/src/soc_ifc/stimulus/tests/directed/fuse_reg_perm_test.yml b/src/soc_ifc/stimulus/tests/directed/fuse_reg_perm_test.yml index 768ed209f..014e9b8eb 100644 --- a/src/soc_ifc/stimulus/tests/directed/fuse_reg_perm_test.yml +++ b/src/soc_ifc/stimulus/tests/directed/fuse_reg_perm_test.yml @@ -17,4 +17,5 @@ plusargs: - +SOC_IFC_TEST='fuse_reg_perm_test' testname: fuse_reg_perm_test -seed: ${PLAYBOOK_RANDOM_SEED} +# seed: ${PLAYBOOK_RANDOM_SEED} +seed: 1692834441 diff --git a/src/soc_ifc/stimulus/tests/directed/rvtime_reg_test.yml b/src/soc_ifc/stimulus/tests/directed/rvtime_reg_test.yml new file mode 100644 index 000000000..e9729ee2d --- /dev/null +++ b/src/soc_ifc/stimulus/tests/directed/rvtime_reg_test.yml @@ -0,0 +1,20 @@ +# SPDX-License-Identifier: Apache-2.0 +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +--- +plusargs: + - +SOC_IFC_TEST='rvtime_reg_test' + +testname: rvtime_reg_test +seed: ${PLAYBOOK_RANDOM_SEED} diff --git a/src/soc_ifc/stimulus/tests/directed/sha_acc_intrblk_test.yml b/src/soc_ifc/stimulus/tests/directed/sha_acc_intrblk_test.yml new file mode 100644 index 000000000..44349ce5b --- /dev/null +++ b/src/soc_ifc/stimulus/tests/directed/sha_acc_intrblk_test.yml @@ -0,0 +1,20 @@ +# SPDX-License-Identifier: Apache-2.0 +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +--- +plusargs: + - +SOC_IFC_TEST='sha_acc_intrblk_test' + +testname: sha_acc_intrblk_test +seed: ${PLAYBOOK_RANDOM_SEED} diff --git a/src/soc_ifc/stimulus/tests/directed/single_socreg_test.yml b/src/soc_ifc/stimulus/tests/directed/single_socreg_test.yml index c5606f968..d5c2b18d4 100644 --- a/src/soc_ifc/stimulus/tests/directed/single_socreg_test.yml +++ b/src/soc_ifc/stimulus/tests/directed/single_socreg_test.yml @@ -15,7 +15,10 @@ --- plusargs: - +SOC_IFC_TEST='single_socreg_test' - - +SOCREG_METHOD_NAME='APB.CPTRA_TIMER_CONFIG' + # - +SOCREG_METHOD_NAME='APB.CPTRA_TIMER_CONFIG' + - +SOCREG_METHOD_NAME='AHB.INTR_BRF_NOTIF_INTERNAL_INTR_R' + - +SOCREG_WRCOUNT=20 testname: single_socreg_test -seed: ${PLAYBOOK_RANDOM_SEED} +# seed: ${PLAYBOOK_RANDOM_SEED} +seed: 1687838882 diff --git a/src/soc_ifc/stimulus/tests/directed/soc_reg_intrblk_test.yml b/src/soc_ifc/stimulus/tests/directed/soc_reg_intrblk_test.yml new file mode 100644 index 000000000..a77dad5af --- /dev/null +++ b/src/soc_ifc/stimulus/tests/directed/soc_reg_intrblk_test.yml @@ -0,0 +1,21 @@ +# SPDX-License-Identifier: Apache-2.0 +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +--- +plusargs: + - +SOC_IFC_TEST='soc_reg_intrblk_test' + +testname: soc_reg_intrblk_test +seed: ${PLAYBOOK_RANDOM_SEED} +# seed: 1692153169 diff --git a/src/soc_ifc/stimulus/tests/directed/soc_reg_test.yml b/src/soc_ifc/stimulus/tests/directed/soc_reg_test.yml index bde3dabd0..3207db555 100644 --- a/src/soc_ifc/stimulus/tests/directed/soc_reg_test.yml +++ b/src/soc_ifc/stimulus/tests/directed/soc_reg_test.yml @@ -17,7 +17,6 @@ plusargs: - +SOC_IFC_TEST='soc_reg_test' testname: soc_reg_test -seed: 1680126531 -# seed: ${PLAYBOOK_RANDOM_SEED} -# seed: 1679445419 -# seed: 1680126531 +seed: ${PLAYBOOK_RANDOM_SEED} +#seed: 1680126531 + diff --git a/src/soc_ifc/stimulus/testsuites/soc_ifc_commit_regress.yml b/src/soc_ifc/stimulus/testsuites/soc_ifc_commit_regress.yml new file mode 100644 index 000000000..292d387ba --- /dev/null +++ b/src/soc_ifc/stimulus/testsuites/soc_ifc_commit_regress.yml @@ -0,0 +1,20 @@ +document: + schema: 1.0 + +contents: + - tests: + tags: ["L0", "directed", "SOC_IFC"] + paths: + - ${CALIPTRA_ROOT}/src/soc_ifc/stimulus/tests/directed/soc_ifc_test.yml + - ${CALIPTRA_ROOT}/src/soc_ifc/stimulus/tests/directed/fuse_reg_pauser_test.yml + - ${CALIPTRA_ROOT}/src/soc_ifc/stimulus/tests/directed/fuse_reg_prod_test.yml + - ${CALIPTRA_ROOT}/src/soc_ifc/stimulus/tests/directed/fuse_reg_perm_test.yml + - ${CALIPTRA_ROOT}/src/soc_ifc/stimulus/tests/directed/fuse_reg_lifecycle_test.yml + - ${CALIPTRA_ROOT}/src/soc_ifc/stimulus/tests/directed/soc_reg_test.yml + - ${CALIPTRA_ROOT}/src/soc_ifc/stimulus/tests/directed/single_socreg_test.yml + - ${CALIPTRA_ROOT}/src/soc_ifc/stimulus/tests/directed/soc_reg_pwron_test.yml + - ${CALIPTRA_ROOT}/src/soc_ifc/stimulus/tests/directed/soc_reg_wrmrst_test.yml + - ${CALIPTRA_ROOT}/src/soc_ifc/stimulus/tests/directed/soc_reg_invalid_test.yml + - ${CALIPTRA_ROOT}/src/soc_ifc/stimulus/tests/directed/soc_reg_intrblk_test.yml + - ${CALIPTRA_ROOT}/src/soc_ifc/stimulus/tests/directed/sha_acc_intrblk_test.yml + - ${CALIPTRA_ROOT}/src/soc_ifc/stimulus/tests/directed/rvtime_reg_test.yml diff --git a/src/soc_ifc/stimulus/testsuites/soc_ifc_nightly_directed_regression.yml b/src/soc_ifc/stimulus/testsuites/soc_ifc_nightly_directed_regression.yml index f3b4789fa..430c2d8a2 100644 --- a/src/soc_ifc/stimulus/testsuites/soc_ifc_nightly_directed_regression.yml +++ b/src/soc_ifc/stimulus/testsuites/soc_ifc_nightly_directed_regression.yml @@ -2,14 +2,24 @@ document: schema: 1.0 contents: - - tests: + - generator: tags: ["L0", "directed", "nightly", "SOC_IFC"] - paths: - - ${CALIPTRA_ROOT}/src/soc_ifc/stimulus/tests/directed/soc_ifc_test.yml - - ${CALIPTRA_ROOT}/src/soc_ifc/stimulus/tests/directed/fuse_reg_prod_test.yml - - ${CALIPTRA_ROOT}/src/soc_ifc/stimulus/tests/directed/fuse_reg_perm_test.yml - - ${CALIPTRA_ROOT}/src/soc_ifc/stimulus/tests/directed/fuse_reg_lifecycle_test.yml - - ${CALIPTRA_ROOT}/src/soc_ifc/stimulus/tests/directed/soc_reg_test.yml - - ${CALIPTRA_ROOT}/src/soc_ifc/stimulus/tests/directed/soc_reg_pwron_test.yml - - ${CALIPTRA_ROOT}/src/soc_ifc/stimulus/tests/directed/soc_reg_wrmrst_test.yml - - ${CALIPTRA_ROOT}/src/soc_ifc/stimulus/tests/directed/soc_reg_invalid_test.yml + path: "" + weight: 100 + generations: 100 + formats: + generate: "reseed {template}.yml -seed {seed}" + path: "{template_basename}__{seed}.yml" + templates: + ${CALIPTRA_ROOT}/src/soc_ifc/stimulus/tests/directed/soc_ifc_test : {weight 12} + ${CALIPTRA_ROOT}/src/soc_ifc/stimulus/tests/directed/fuse_reg_pauser_test : {weight 3} + ${CALIPTRA_ROOT}/src/soc_ifc/stimulus/tests/directed/fuse_reg_prod_test : {weight 12} + ${CALIPTRA_ROOT}/src/soc_ifc/stimulus/tests/directed/fuse_reg_perm_test: {weight 12} + ${CALIPTRA_ROOT}/src/soc_ifc/stimulus/tests/directed/fuse_reg_lifecycle_test: {weight 6} + ${CALIPTRA_ROOT}/src/soc_ifc/stimulus/tests/directed/soc_reg_test: {weight 16} + ${CALIPTRA_ROOT}/src/soc_ifc/stimulus/tests/directed/soc_reg_pwron_test: {weight 12} + ${CALIPTRA_ROOT}/src/soc_ifc/stimulus/tests/directed/soc_reg_wrmrst_test: {weight 12} + ${CALIPTRA_ROOT}/src/soc_ifc/stimulus/tests/directed/soc_reg_invalid_test: {weight 6} + ${CALIPTRA_ROOT}/src/soc_ifc/stimulus/tests/directed/rvtime_reg_test: {weight 3} + ${CALIPTRA_ROOT}/src/soc_ifc/stimulus/tests/directed/sha_acc_intrblk_test: {weight 3} + ${CALIPTRA_ROOT}/src/soc_ifc/stimulus/tests/directed/soc_reg_intrblk_test: {weight 3} diff --git a/src/soc_ifc/stimulus/testsuites/soc_ifc_nightly_random_regression.yml b/src/soc_ifc/stimulus/testsuites/soc_ifc_nightly_random_regression.yml index e875f32d0..2ab056642 100644 --- a/src/soc_ifc/stimulus/testsuites/soc_ifc_nightly_random_regression.yml +++ b/src/soc_ifc/stimulus/testsuites/soc_ifc_nightly_random_regression.yml @@ -5,11 +5,15 @@ contents: - generator: tags: ["L1", "SOC_IFC", "random"] path: "" + config: + params: + # 12 hours to accommodate certain longer-running tests + timeout: 720 weight: 100 - generations: 100 + generations: 500 formats: generate: "reseed {template}.yml -seed {seed}" path: "{template_basename}__{seed}.yml" templates: - $CALIPTRA_ROOT/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/project_benches/soc_ifc/tb/tests/src/soc_ifc_rand_test : { weight 75 } - $CALIPTRA_ROOT/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/project_benches/soc_ifc/tb/tests/src/soc_ifc_trng_test : { weight 25 } + $CALIPTRA_ROOT/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/project_benches/soc_ifc/tb/tests/src/soc_ifc_rand_test : { weight 95 } + $CALIPTRA_ROOT/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/project_benches/soc_ifc/tb/tests/src/soc_ifc_trng_test : { weight 5 } diff --git a/src/soc_ifc/stimulus/testsuites/uvmf_soc_ifc_promote_regression.yml b/src/soc_ifc/stimulus/testsuites/uvmf_soc_ifc_promote_regression.yml new file mode 100644 index 000000000..b49a59d56 --- /dev/null +++ b/src/soc_ifc/stimulus/testsuites/uvmf_soc_ifc_promote_regression.yml @@ -0,0 +1,15 @@ +document: + schema: 1.0 + +contents: + - generator: + tags: ["L0", "SOC_IFC", "directed", "smoke_test"] + path: "" + weight: 100 + generations: 6 + formats: + generate: "reseed {template}.yml -seed {seed}" + path: "{template_basename}__{seed}.yml" + templates: + $CALIPTRA_ROOT/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/project_benches/soc_ifc/tb/tests/src/soc_ifc_cmdline_test : { weight 100 } + $CALIPTRA_ROOT/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/project_benches/soc_ifc/tb/tests/src/soc_ifc_rand_test : { weight 500 } diff --git a/src/soc_ifc/tb/fuse_reg_pauser_test.svh b/src/soc_ifc/tb/fuse_reg_pauser_test.svh new file mode 100644 index 000000000..6a8a979fa --- /dev/null +++ b/src/soc_ifc/tb/fuse_reg_pauser_test.svh @@ -0,0 +1,342 @@ +// SPDX-License-Identifier: Apache-2.0 +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +//====================================================================== + + + +// Declarations for internal signal probing +logic [31:0] fuse_uds_seed [0:11]; +logic [31:0] fuse_field_entropy [0:7]; +logic [31:0] fuse_key_manifest_pk_hash [0:11]; +logic [3:0] fuse_key_manifest_pk_hash_mask; +logic [31:0] fuse_owner_pk_hash [0:11]; +logic [31:0] fuse_fmc_key_manifest_svn; +logic [31:0] fuse_runtime_svn [0:3]; +logic fuse_anti_rollback_disable; +logic [31:0] fuse_idevid_cert_attr [0:23]; +logic [31:0] fuse_idevid_manuf_hsm_id [0:3]; +logic [1:0] fuse_life_cycle ; +logic fuse_lms_verify ; +logic [31:0] fuse_lms_revocation; + + +`FORLOOP_COMB( 12 ) fuse_uds_seed[j] = `REG_HIER_PFX.fuse_uds_seed[j].seed.value; +`FORLOOP_COMB( 8 ) fuse_field_entropy[j] = `REG_HIER_PFX.fuse_field_entropy[j].seed.value; +`FORLOOP_COMB( 12 ) fuse_key_manifest_pk_hash[j] = `REG_HIER_PFX.fuse_key_manifest_pk_hash[j].hash.value; + always_comb fuse_key_manifest_pk_hash_mask = `REG_HIER_PFX.fuse_key_manifest_pk_hash_mask.mask.value; +`FORLOOP_COMB( 12 ) fuse_owner_pk_hash[j] = `REG_HIER_PFX.fuse_owner_pk_hash[j].hash.value; + always_comb fuse_fmc_key_manifest_svn = `REG_HIER_PFX.fuse_fmc_key_manifest_svn.svn.value; +`FORLOOP_COMB( 4 ) fuse_runtime_svn[j] = `REG_HIER_PFX.fuse_runtime_svn[j].svn.value; + always_comb fuse_anti_rollback_disable = `REG_HIER_PFX.fuse_anti_rollback_disable.dis.value; +`FORLOOP_COMB( 24 ) fuse_idevid_cert_attr[j] = `REG_HIER_PFX.fuse_idevid_cert_attr[j].cert.value; +`FORLOOP_COMB( 4 ) fuse_idevid_manuf_hsm_id[j] = `REG_HIER_PFX.fuse_idevid_manuf_hsm_id[j].hsm_id.value; + always_comb fuse_life_cycle = `REG_HIER_PFX.fuse_life_cycle.life_cycle.value; + always_comb fuse_lms_verify = `REG_HIER_PFX.fuse_lms_verify.lms_verify.value; + always_comb fuse_lms_revocation = `REG_HIER_PFX.fuse_lms_revocation.lms_revocation.value; + + +//---------------------------------------------------------------- +// fuse_reg_pauser_test() +// +// Checks fuse permission tests depending on PAUSER bit status +//---------------------------------------------------------------- +task fuse_reg_pauser_test; + // Fuse Register PA-USER Test + + automatic word_addr_t addr; + automatic int tid = 0; // optional to increment UNLESS multiple writes to same address + automatic strq_t fuse_regnames; // ordered list of fuse register names + automatic dwordq_t fuse_regdata; // corresponding data to fuse register names + automatic dword_t valid_pauser; + automatic logic lock_status; + automatic WordTransaction wrtrans, rdtrans; + automatic string rname; + automatic dword_t fuse_regval_actual; + + begin + $display("Executing task fuse_reg_pauser_test"); + $display("-----------------------------------\n"); + + $display("Current security state = 0b%03b", security_state); + tc_ctr = tc_ctr + 1; + + wrtrans = new(); + rdtrans = new(); + + fuse_regnames = get_fuse_regnames(); + + init_sim(); + reset_dut(); + + wait (ready_for_fuses); + + //------------------------------------------------------------------------------------------- + print_banner("1a. Default pauser and unlocked. APB write to registers, check values"); + tphase = "1a"; + + write_regs(SET_APB, fuse_regnames, tid, 3); // effect changes & + repeat (5) @(posedge clk_tb); + read_regs(GET_APB, fuse_regnames, tid, 3); // expect same values on read + + //------------------------------------------------------------------------------------------- + print_banner("1b. With unlocked non-default pauser, repeat 1a"); + tphase = "1b"; + + // NOTE. simulate_caliptra_boot() is necessary for noncore_rst_b to be deasserted + //simulate_caliptra_boot(); + //wait (cptra_noncore_rst_b_tb == 1'b1); + + // Set pauser valid to non-default + wrtrans.update_byname("CPTRA_FUSE_VALID_PAUSER", 0, tid); + wrtrans.randomize(); + valid_pauser = wrtrans.data; + write_reg_trans(SET_APB, wrtrans); + repeat (3) @(posedge clk_tb); + rdtrans.update_byname("CPTRA_FUSE_VALID_PAUSER", 0, tid); + read_reg_trans(GET_APB, rdtrans); + $display ("Pauser value programmed = 0x%08x", rdtrans.data); + assert (rdtrans.data == valid_pauser) else begin + $display("TB ERROR. fuse_pauser_valid modfication failed"); + error_ctr += 1; + end + + write_regs(SET_APB, fuse_regnames, tid, 3); // effect changes & + repeat (5) @(posedge clk_tb); + read_regs(GET_APB, fuse_regnames, tid, 3); // expect same values on read + + //------------------------------------------------------------------------------------------- + print_banner("1c. Lock pauser with non-default value. repeat 1a but read with and w/o valid pauser"); + tphase = "1c"; + + set_fuse_pauser_lock(1'b1, tid, lock_status); + if (lock_status == 1'b0) begin + $display("TB ERROR. Setting fuse_pauser_lock failed!"); + error_ctr += 1; + end + + $display ("TB INFO. Storing last modified fuse register values with valid pauser writes"); + foreach (fuse_regnames[i]) begin // store last-modified values + rname = fuse_regnames[i]; + fuse_regval_actual = get_fuse_regval(rname); + fuse_regdata.push_back(fuse_regval_actual); + $display ("TB INFO. For %-30s storing last modified value 0x%08x", rname, fuse_regval_actual); + end + + write_regs(SET_APB, fuse_regnames, tid, 3); // should be ineffectual + repeat (5) @(posedge clk_tb); + + // Read twice, with and without valid pauser + foreach (fuse_regnames[i]) begin + rname = fuse_regnames[i]; + rdtrans.update_byname(rname, 0, tid); + fuse_regval_actual = get_fuse_regval(rname); + read_reg_chk_inrange(GET_APB, rname, tid, '0, '0); // get 0's on default pauser + repeat (3) @(posedge clk_tb); + read_reg_trans(GET_APB, rdtrans, valid_pauser); // expect older (stored) values + repeat (3) @(posedge clk_tb); + + if (str_startswith(rname, "FUSE_UDS_SEED") || str_startswith(rname, "FUSE_FIELD_ENTROPY")) + assert (rdtrans.data == '0) else error_ctr += 1; + continue; + + if (rdtrans.data != fuse_regval_actual) begin + $display("TB ERROR. Mismatch on APB read w/valid pauser for reg %-30s (0x%08x). Read value = 0x%08x | expected probed = 0x%08x", + rname, rdtrans.addr, rdtrans.data, fuse_regval_actual) ; + error_ctr += 1; + end + @(posedge clk_tb); + end + + + //------------------------------------------------------------------------------------------- + print_banner("1d. With matching locked non-default pauser, repeat 1a"); + tphase = "1d"; + + // Programming a non-default valid_pauser and locking it requires waiting for cptra_noncore_rst_b + // to be deasserted after a reset, ie, Caliptra boot. + // + // At the same time ready_for_fuses drops low followed by cptra_noncore_rst_b goingh high, ergo + // writes to fuse regs no longer work (for any pauser value) until a warm reset occurs. + // HOWEVER, a warm reset also resets the valid_pauser register. + // + // The net result (a bug) is that fuse registers can ONLY be written using a default pauser value; + // fuse registers can be read out though using any programmed and locked valid_pauser. + + sb.del_all(); + + foreach (fuse_regnames[i]) begin + rname = fuse_regnames[i]; + wrtrans.update_byname(rname, 0, tid); + wrtrans.randomize(); + rdtrans.update_byname(rname, 0, tid); + + write_reg_trans(SET_APB, wrtrans, valid_pauser); + @(posedge clk_tb); + read_reg_trans(GET_APB, rdtrans, valid_pauser); + repeat (3) @(posedge clk_tb); + + if (str_startswith(rname, "FUSE_UDS_SEED") || str_startswith(rname, "FUSE_FIELD_ENTROPY")) + continue; + + if (rdtrans.data != (get_mask(rname) & wrtrans.data)) begin + $display("TB ERROR. Mismatch on APB write and read w/valid pauser for reg %-30s (0x%08x). Read value = 0x%08x | expected value = 0x%08x", + rname, rdtrans.addr, rdtrans.data, get_mask(rname) & wrtrans.data); + error_ctr += 1; + end + + repeat (3) @(posedge clk_tb); + end + + + //------------------------------------------------------------------------------------------- + print_banner("2a. for completeness try to unlock pauser by writing"); + tphase = "2a"; + + set_fuse_pauser_lock(1'b0, tid, lock_status); + assert (lock_status == 1'b1) else begin + $display("TB ERROR. Resetting of fuse_pauser_lock via APB was allowed!"); + error_ctr += 1; + end + + + //------------------------------------------------------------------------------------------- + print_banner("2b. then attempt to unlock pauser by warm reseting"); + tphase = "2b"; + + warm_reset_dut(); + warm_reset_exp_data(); + sb.del_all(); + + simulate_caliptra_boot(); + wait (cptra_noncore_rst_b_tb == 1'b1); + + // if (cptra_noncore_rst_b_tb == 1'b0) begin + // $display("TB. WARNING Non core reset is not deasserted. Waiting 1000 cycles"); + // repeat (1000) @(posedge clk_tb); + // $display("TB. DEBUG if status of cptra_noncore_rst_b_tb = 1'b%b", cptra_noncore_rst_b_tb); + // end + + read_reg_chk_inrange(GET_APB, "CPTRA_FUSE_PAUSER_LOCK", tid, 'd1, 'd1); + @(posedge clk_tb); + + + //------------------------------------------------------------------------------------------- + print_banner("2c. finally unlock pauser by cold reseting"); + tphase = "2c"; + + reset_dut(); // expect to be clearing CPTRA_FUSE_WR_DONE effect + reset_exp_data(); + // simulate_caliptra_boot(); + sb.del_all(); + + simulate_caliptra_boot(); + wait (cptra_noncore_rst_b_tb == 1'b1); + + // if (cptra_noncore_rst_b_tb == 1'b0) begin + // $display("TB. WARNING Non core reset is not deasserted. Waiting 1000 cycles"); + // repeat (1000) @(posedge clk_tb); + // $display("TB. DEBUG if status of cptra_noncore_rst_b_tb = 1'b%b", cptra_noncore_rst_b_tb); + // end + + read_reg_chk_inrange(GET_APB, "CPTRA_FUSE_PAUSER_LOCK", tid, '0, '0); + @(posedge clk_tb); + + + error_ctr += sb.err_count; + + end + +endtask // fuse_reg_pauser_test + + + +//---------------------------------------------------------------- +// function get_fuse_regval() +// +// Probes to get the intenral fuse register value inside dut +//---------------------------------------------------------------- +function dword_t get_fuse_regval(string rname); + + automatic dword_t regval; + string pfx = "unknown"; + automatic int j; + + strq_t prefixes = {"FUSE_UDS_SEED", "FUSE_FIELD_ENTROPY", "FUSE_KEY_MANIFEST_PK_HASH", + "FUSE_OWNER_PK_HASH", "FUSE_RUNTIME_SVN", "FUSE_IDEVID_CERT_ATTR", "FUSE_IDEVID_MANUF_HSM_ID"}; + + begin + case (rname) + "FUSE_KEY_MANIFEST_PK_HASH_MASK" : regval = fuse_key_manifest_pk_hash_mask; + "FUSE_FMC_KEY_MANIFEST_SVN" : regval = fuse_fmc_key_manifest_svn; + "FUSE_ANTI_ROLLBACK_DISABLE" : regval = fuse_anti_rollback_disable; + "FUSE_LIFE_CYCLE" : regval = fuse_life_cycle ; + "FUSE_LMS_VERIFY" : regval = fuse_lms_verify ; + "FUSE_LMS_REVOCATION" : regval = fuse_lms_revocation; + + default: begin + foreach (prefixes[i]) begin + if (str_startswith(rname, prefixes[i])) begin + pfx = prefixes[i]; + break; + end + end + + if (pfx == "unknown") begin + $display ("TB ERROR. Unknown prefix in fuse register name %s", rname); + error_ctr += 1; + end else begin + j = `STR_RMPFX(rname, pfx); + // $display ("prefix = %s, j = %d", pfx, j); + regval = (pfx == "FUSE_UDS_SEED" ) ? fuse_uds_seed[j]: + (pfx == "FUSE_FIELD_ENTROPY" ) ? fuse_field_entropy[j] : + (pfx == "FUSE_KEY_MANIFEST_PK_HASH") ? fuse_key_manifest_pk_hash[j] : + (pfx == "FUSE_OWNER_PK_HASH" ) ? fuse_owner_pk_hash[j] : + (pfx == "FUSE_RUNTIME_SVN" ) ? fuse_runtime_svn[j] : + (pfx == "FUSE_IDEVID_CERT_ATTR" ) ? fuse_idevid_cert_attr[j] : + (pfx == "FUSE_IDEVID_MANUF_HSM_ID" ) ? fuse_idevid_manuf_hsm_id[j] : 'x; + end + end + + endcase + + return regval; + end + +endfunction // get_fuse_regval + + +//---------------------------------------------------------------- +// task set_fuse_pauser_lock() +// +// Sets fuse pauser lock register & checks value +//---------------------------------------------------------------- +task set_fuse_pauser_lock(input logic lock_value, input int tid, output logic lock_status); + + automatic WordTransaction wrtrans, rdtrans; + begin + wrtrans = new(); + rdtrans = new(); + + wrtrans.update_byname("CPTRA_FUSE_PAUSER_LOCK", lock_value, tid); + write_reg_trans(SET_APB, wrtrans); + repeat (3) @(posedge clk_tb); + rdtrans.update_byname("CPTRA_FUSE_PAUSER_LOCK", 0, tid); + read_reg_trans(GET_APB, rdtrans); // FIXME. + $display ("Pauser lock status = 0x%08x", rdtrans.data); + + lock_status = rdtrans.data[0]; + end +endtask // set_fuse_pauser_lock + diff --git a/src/soc_ifc/tb/fuse_reg_perm_test.svh b/src/soc_ifc/tb/fuse_reg_perm_test.svh index 6a0728c43..88b60898b 100644 --- a/src/soc_ifc/tb/fuse_reg_perm_test.svh +++ b/src/soc_ifc/tb/fuse_reg_perm_test.svh @@ -17,6 +17,8 @@ //---------------------------------------------------------------- // fuse_reg_perm_test() +// +// Checks fuse permission tests depending on lock status from FUSE_WR_DONE //---------------------------------------------------------------- task fuse_reg_perm_test; // Fuse Register Test @@ -50,11 +52,13 @@ any subsequent writes to a fuse register will be dropped unless init_sim(); reset_dut(); + wait(ready_for_fuses); // ----------------------------------------------------------------- // PHASE 1. Normal sequence // ----------------------------------------------------------------- $display ("1a. APB write twice to registers, lock fuses and attempt to modify\n"); + tphase = "1a"; write_regs(SET_APB, fuse_regnames, 0, 3); // effect changes repeat (5) @(posedge clk_tb); @@ -72,6 +76,7 @@ any subsequent writes to a fuse register will be dropped unless repeat (5) @(posedge clk_tb); $display ("\n1b. Following writes should have no effect on locked state -- which is still set!\n"); + tphase = "1b"; sb.del_all(); @@ -86,11 +91,14 @@ any subsequent writes to a fuse register will be dropped unless // ----------------------------------------------------------------- // PHASE 2. Perform Cold Reset and Repeat APB Write & Read from 1a // ----------------------------------------------------------------- + $display ("\n2a. Write to registers after cold boot and check back writes"); + tphase = "2a"; + reset_dut(); // expect to be clearing CPTRA_FUSE_WR_DONE effect reset_exp_data(); sb.del_all(); - - $display ("\n2a. Write to registers after cold boot and check back writes"); + wait(ready_for_fuses); + @(posedge clk_tb); write_regs(SET_APB, fuse_regnames, 0, 3); read_regs(GET_APB, fuse_regnames, 0, 3); @@ -105,9 +113,12 @@ any subsequent writes to a fuse register will be dropped unless // PHASE 3. Perform Warm Reset, read values & Repeat APB Write & Read from 1a // ----------------------------------------------------------------- $display ("\n3a. Perform a warm reset then repeat steps 1a (just APB)"); + tphase = "3a"; warm_reset_dut(); warm_reset_exp_data(); + wait(ready_for_fuses); + @(posedge clk_tb); read_regs(GET_APB, fuse_regnames, 0, 3); // should be old sticky values sb.del_all(); diff --git a/src/soc_ifc/tb/rvtime_reg_test.svh b/src/soc_ifc/tb/rvtime_reg_test.svh new file mode 100644 index 000000000..d2857fe88 --- /dev/null +++ b/src/soc_ifc/tb/rvtime_reg_test.svh @@ -0,0 +1,244 @@ +// SPDX-License-Identifier: Apache-2.0 +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +//====================================================================== + + + //---------------------------------------------------------------- + // rvtime_reg_test() + // + // Test writing & reading of RV_MTIME LOW/HIGH Registers + //---------------------------------------------------------------- + task rvtime_reg_test; + // Check RVTIME_L update operations, then effect on RVTIME_H + // These registers are treated differently from the scoreboard based checks + // since they are self-updated without a need for an external event + + string rvtime_l = "INTERNAL_RV_MTIME_L"; + string rvtime_h = "INTERNAL_RV_MTIME_H"; + + word_addr_t rvtime_haddr, rvtime_laddr; + dword_t rvtime_hval, rvtime_lval; // most recent value during a fetch or update + + logic [31:0] update_ctr = 'h0; + logic [31:0] fetch_ctr = 'h0; + + dword_t flow_status; + dword_t reset_reason; + + int tid = 0; // TID is to be updated ONLY if multiple writes to an address + + WordTransaction wrtrans; + + + begin + $display(); + $display("Executing task rvtime_reg_test"); + $display("------------------------------\n"); + + // TODO. Randomize + set_security_state('{device_lifecycle: DEVICE_PRODUCTION, debug_locked: DEBUG_UNLOCKED}); + + tc_ctr = tc_ctr + 1; + + wrtrans = new(); + + rvtime_haddr = socregs.get_addr(rvtime_h); + rvtime_laddr = socregs.get_addr(rvtime_l); + + // Skip wrting & reading over AHB until post reset sequencing is done + // THEN, update scoreboard entry accordingly for a couple of registers which + // are written using APB as part of Caliptra boot. Scoreboard update not + // needed for readonly fields which are set directly by wires. + simulate_caliptra_boot(); + + repeat (20) @(posedge clk_tb); + sb.del_all(); + error_ctr = 0; + + update_CPTRA_FLOW_STATUS(ready_for_fuses, `REG_HIER_BOOT_FSM_PS); + + + $display ("\n-------------------------------------------------------------"); + $display ("1a. Writing/Reading using AHB/AHB"); + $display ("-------------------------------------------------------------"); + + // ** Write & check RV_MTIME_H not close to overflow ** + wrtrans.update(rvtime_haddr, 0, tid); + wrtrans.randomize(); + wrtrans.update_data(wrtrans.data & 32'h7fff_ffff); + + write_reg_trans(SET_AHB, wrtrans); + read_regs(GET_AHB, {rvtime_h}, tid, 3); + + // ** Write to RV_MTIME_L & check val not close to overflow ** + wrtrans.update(rvtime_laddr, 0, tid); + wrtrans.randomize(); + wrtrans.update_data(wrtrans.data & 32'h7fff_ffff); + + rvtime_lval = wrtrans.data; + write_reg_trans(SET_AHB, wrtrans); + update_ctr = cycle_ctr_since_pwrgood; + + repeat (3) @(posedge clk_tb); + read_reg_chk_inrange(GET_AHB, rvtime_l, tid, rvtime_lval + 'd3 , rvtime_lval + 'd23); + + // ** Write to RV_MTIME_L & check for overflow + update of both RV_MTIME_L + RV_MTIME_H ** + rvtime_lval = 32'hffff_fff0; // 16 cycles from wraparound + wrtrans.update(rvtime_laddr, rvtime_lval, tid); + update_ctr = cycle_ctr_since_pwrgood; + write_reg_trans(SET_AHB, wrtrans); + + repeat (3) @(posedge clk_tb); + wrtrans.update(rvtime_haddr, 32'hffff_fffe, tid); // < 16 cycles from increment + write_reg_trans(SET_AHB, wrtrans); + + repeat (13) @(posedge clk_tb); + read_reg_chk_inrange(GET_AHB, rvtime_l, tid, 'h1, 'h14); + + repeat (3) @(posedge clk_tb); + read_reg_chk_inrange(GET_AHB, rvtime_h, tid, 32'hffff_ffff, 32'hffff_ffff); + + @(posedge clk_tb); + rvtime_lval = 32'hffff_fff0 + (cycle_ctr_since_pwrgood - update_ctr); + rvtime_hval = 32'hffff_ffff; + + $display ("\n-------------------------------------------------------------"); + $display ("1b. Writing/Reading using APB/APB + AHB"); + $display ("-------------------------------------------------------------"); + + // ** Write & check RV_MTIME_H ** + wrtrans.update(rvtime_haddr, 0, tid); + wrtrans.randomize(); + + write_reg_trans(SET_APB, wrtrans); + read_regs(GET_APB, {rvtime_h}, tid, 3); + + // ** Write to RV_MTIME_L & check val ** + wrtrans.update(rvtime_laddr, 0, tid); + wrtrans.randomize(); + + write_reg_trans(SET_APB, wrtrans); + + repeat (3) @(posedge clk_tb); + rvtime_lval = 32'hffff_fff0 + (cycle_ctr_since_pwrgood - update_ctr); + + read_reg_chk_inrange(GET_AHB, rvtime_l, tid, rvtime_lval - 'd5, rvtime_lval + 'd15); + @(posedge clk_tb); + + + // ** Repeat reads over AHB ** + repeat (3) @(posedge clk_tb); + rvtime_lval = 32'hffff_fff0 + (cycle_ctr_since_pwrgood - update_ctr); + + read_reg_chk_inrange(GET_AHB, rvtime_l, tid, rvtime_lval - 'd5, rvtime_lval + 'd15); + @(posedge clk_tb); + + read_reg_chk_inrange(GET_AHB, rvtime_h, tid, rvtime_hval, rvtime_hval); + @(posedge clk_tb); + + // There's no overflow of eiter MTIME register with APB writes since MTIME_L just + // rolled passed 0. -- no check needed + + + $display ("\n-------------------------------------------------------------"); + $display ("1c. Writing/Reading using AHB/APB"); + $display ("-------------------------------------------------------------"); + + // ** Write & check RV_MTIME_H this time preparing for rolloever ** + wrtrans.update(rvtime_haddr, 32'hffff_ffff, tid); + write_reg_trans(SET_AHB, wrtrans); + repeat (3) @(posedge clk_tb); + + // ** Write to RV_MTIME_L & check val ** + wrtrans.update(rvtime_laddr, 32'hffff_ffff, tid); + write_reg_trans(SET_AHB, wrtrans); + + + repeat (3) @(posedge clk_tb); + read_reg_chk_inrange(GET_APB, rvtime_h, tid, 'h0, 'h0); + repeat (3) @(posedge clk_tb); + read_reg_chk_inrange(GET_APB, rvtime_l, tid, 'h1, 'h20); + + // ** Write random values to RV_TIME_H/L preparing for warm reset ** + wrtrans.update(rvtime_haddr, 0, tid); + wrtrans.randomize(); + write_reg_trans(SET_AHB, wrtrans); + rvtime_hval = wrtrans.data; + repeat (3) @(posedge clk_tb); + + wrtrans.update(rvtime_laddr, 0, tid); + wrtrans.randomize(); + wrtrans.update_data(wrtrans.data & 32'h7fff_ffff); + write_reg_trans(SET_AHB, wrtrans); + rvtime_lval = wrtrans.data; + update_ctr = cycle_ctr_since_pwrgood; + repeat (3) @(posedge clk_tb); + + // There's no overflow of eiter MTIME register -- no check needed + + + // ----------------------------------------------------------------- + // Phase 2. Perform Warm Reset, read values over APB + // ----------------------------------------------------------------- + $display ("\n-------------------------------------------------------------"); + $display ("2a. Perform a warm reset then just read regs"); + $display ("-------------------------------------------------------------"); + + sb.del_all(); + warm_reset_dut(); + + sb.record_reset_values(0, WARM_RESET); + wait (ready_for_fuses == 1'b1); + + // Some registers need update for specific fields + flow_status = update_CPTRA_FLOW_STATUS(ready_for_fuses, `REG_HIER_BOOT_FSM_PS); + reset_reason = update_CPTRA_RESET_REASON(1, 0); + + // expect old sticky values which are different from power-on values + read_reg_chk_inrange(GET_APB, {rvtime_h}, tid, rvtime_hval, rvtime_hval); + @(posedge clk_tb); + + rvtime_lval = rvtime_lval + (cycle_ctr_since_pwrgood - update_ctr); + read_reg_chk_inrange(GET_APB, {rvtime_l}, tid, rvtime_lval - 'd5, rvtime_lval + 'd15); + @(posedge clk_tb); + + // ----------------------------------------------------------------- + // Phase 3. Perform Cold Reset, read values over APB + // ----------------------------------------------------------------- + $display ("\n-------------------------------------------------------------"); + $display ("3a. Perform a cold reset then just read regs"); + $display ("-------------------------------------------------------------"); + + reset_dut(); + sb.del_all(); + + sb.record_reset_values(0, COLD_RESET); + wait (ready_for_fuses == 1'b1); + + // Some registers need update for specific fields + flow_status = update_CPTRA_FLOW_STATUS(ready_for_fuses, `REG_HIER_BOOT_FSM_PS); + reset_reason = update_CPTRA_RESET_REASON(1, 0); + + // expect old sticky values which are different from power-on values + read_reg_chk_inrange(GET_APB, {rvtime_h}, tid, 0, 0); + @(posedge clk_tb); + read_reg_chk_inrange(GET_APB, {rvtime_l}, tid, 'd1, 'd20); + @(posedge clk_tb); + + error_ctr += sb.err_count; + + end + + endtask // check_rvtime_regs diff --git a/src/soc_ifc/tb/sha_acc_intrblk_test.svh b/src/soc_ifc/tb/sha_acc_intrblk_test.svh new file mode 100644 index 000000000..84a39a9f4 --- /dev/null +++ b/src/soc_ifc/tb/sha_acc_intrblk_test.svh @@ -0,0 +1,236 @@ +// SPDX-License-Identifier: Apache-2.0 +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +//====================================================================== + + + //---------------------------------------------------------------- + // sha_acc_intrblk_test() + // + // Tests that SHA ACC Interrupt Block Registers are RO over APB + //---------------------------------------------------------------- + + + task sha_acc_intrblk_test; + + automatic word_addr_t addr; + automatic int tid = 0; // TID is to be updated ONLY if multiple writes to an address + automatic strq_t sha_acc_intrblk_regnames; + automatic strq_t nonmatching_regnames; + automatic dword_t rddata; + automatic dwordq_t nonmatching_rddata; + automatic string rname; + automatic dword_t ahb_wrdata, exp_regval; + automatic dword_t apb_wrdata, apb_rddata; + automatic WordTransaction wrtrans, rdtrans; + + // Interrupt Register Block Fields + // -------------------------------- + // logic global_intr_en_r.error_en; + // logic global_intr_en_r.notif_en; + // logic error_intr_en_r.error0_en; + // logic error_intr_en_r.error1_en; + // logic error_intr_en_r.error2_en; + // logic error_intr_en_r.error3_en; + // logic notif_intr_en_r.notif_cmd_done_en; + // logic error_global_intr_r.agg_sts; + // logic notif_global_intr_r.agg_sts; + logic [3:0] error_internal_intr_r; // represent next 4 fields + // logic error_internal_intr_r.error0_sts; + // logic error_internal_intr_r.error1_sts; + // logic error_internal_intr_r.error2_sts; + // logic error_internal_intr_r.error3_sts; + logic notif_internal_intr_r; // proxy for next field + // logic notif_internal_intr_r.notif_cmd_done_sts; + logic [3:0] error_intr_trig_r; // represent next 4 fields + // logic error_intr_trig_r.error0_trig; + // logic error_intr_trig_r.error1_trig; + // logic error_intr_trig_r.error2_trig; + // logic error_intr_trig_r.error3_trig; + logic notif_intr_trig_r; // proxy for next field; + // logic notif_intr_trig_r.notif_cmd_done_trig; + // logic error0_intr_count_r.cnt; + // logic error1_intr_count_r.cnt; + // logic error2_intr_count_r.cnt; + // logic error3_intr_count_r.cnt; + // logic notif_cmd_done_intr_count_r.cnt; + // logic error0_intr_count_incr_r.pulse; + // logic error1_intr_count_incr_r.pulse; + // logic error2_intr_count_incr_r.pulse; + // logic error3_intr_count_incr_r.pulse; + // logic notif_cmd_done_intr_count_incr_r.pulse; + + begin + $display("Executing task sha_acc_intrblk_test"); + $display("---------------------------------\n"); + + // set_security_state_byname("DEBUG_UNLOCKED_PRODCUTION"); + + tc_ctr = tc_ctr + 1; + wrtrans = new(); + rdtrans = new(); + + sha_acc_intrblk_regnames = get_sha_acc_intrblk_regnames(); + + // Skip wrting & reading over AHB until post reset sequencing is done + // THEN, update scoreboard entry accordingly for a couple of registers which + // are written using APB as part of Caliptra boot. Scoreboard update not + // needed for readonly fields which are set directly by wires. + simulate_caliptra_boot(); + + // PHASE I. 1a. Write (AHB, then APB) and Read register over APB + // ------------------------------------------------------------ + + repeat (20) @(posedge clk_tb); + sb.del_all(); + + update_CPTRA_FLOW_STATUS(ready_for_fuses, `REG_HIER_BOOT_FSM_PS); + + $display ("\n1a. Writing over AHB, APB then reading back over APB"); + + foreach (sha_acc_intrblk_regnames[i]) begin + rname = sha_acc_intrblk_regnames[i]; + addr = socregs.get_addr(rname); + wrtrans.update(addr, 0, tid); + wrtrans.randomize(); + + ahb_wrdata = wrtrans.data; + apb_wrdata = ~ahb_wrdata; + + write_reg_trans(SET_AHB, wrtrans); + repeat (3) @(posedge clk_tb); + wrtrans.update_data(apb_wrdata); + write_reg_trans(SET_APB, wrtrans); + repeat (3) @(posedge clk_tb); + + rdtrans.update(addr, 0, tid); + read_reg_trans(GET_APB, rdtrans); + @(posedge clk_tb); + + apb_rddata = rdtrans.data; + exp_regval = socregs.get_exp_regval(rname); + + if (apb_rddata == exp_regval) + continue; // all good; move on to next + + if (apb_rddata == apb_wrdata) begin + $display ("TB ERROR for addr 0x%08x (%s). apb_rddata matches apb_wrdata 0x%08x", addr, rname, apb_rddata); + error_ctr = error_ctr + 1; + end else if (apb_rddata != exp_regval) begin + if (rddata != '0) begin + $display ("TB ERROR for addr 0x%08x (%s). Unexpected non-zero apb_rddata 0x%08x", addr, rname, rddata); + error_ctr = error_ctr + 1; + end else begin + $display ("TB Warning for addr 0x%08x (%s). apb_rddata 0x%08x does not match exp_regval 0x%08x", addr, rname, apb_rddata, exp_regval); + nonmatching_regnames.push_back(rname); + nonmatching_rddata.push_back(apb_rddata); + end + end + end + + // control launch of assertions using directed writes + // Expect issues w/the 4 registers + assign error_internal_intr_r = {dut.i_sha512_acc_top.i_sha512_acc_csr.field_storage.intr_block_rf.error_internal_intr_r.error0_sts.value , + dut.i_sha512_acc_top.i_sha512_acc_csr.field_storage.intr_block_rf.error_internal_intr_r.error1_sts.value , + dut.i_sha512_acc_top.i_sha512_acc_csr.field_storage.intr_block_rf.error_internal_intr_r.error2_sts.value , + dut.i_sha512_acc_top.i_sha512_acc_csr.field_storage.intr_block_rf.error_internal_intr_r.error3_sts.value}; + + assign notif_internal_intr_r = dut.i_sha512_acc_top.i_sha512_acc_csr.field_storage.intr_block_rf.notif_internal_intr_r.notif_cmd_done_sts.value; + + assign error_intr_trig_r = {dut.i_sha512_acc_top.i_sha512_acc_csr.field_storage.intr_block_rf.error_intr_trig_r.error0_trig.value , + dut.i_sha512_acc_top.i_sha512_acc_csr.field_storage.intr_block_rf.error_intr_trig_r.error1_trig.value , + dut.i_sha512_acc_top.i_sha512_acc_csr.field_storage.intr_block_rf.error_intr_trig_r.error2_trig.value , + dut.i_sha512_acc_top.i_sha512_acc_csr.field_storage.intr_block_rf.error_intr_trig_r.error3_trig.value}; + + assign notif_intr_trig_r = dut.i_sha512_acc_top.i_sha512_acc_csr.field_storage.intr_block_rf.notif_intr_trig_r.notif_cmd_done_trig.value; + + + foreach (nonmatching_regnames[i]) begin + rname = nonmatching_regnames[i]; + rddata = nonmatching_rddata[i]; + + addr = socregs.get_addr(rname); + wrtrans.update(addr, 32'hffff_ffff, tid); + write_reg_trans(SET_AHB, wrtrans); // This should clear the register to all 0's + repeat (10) @(posedge clk_tb); + + fork // Try to set again over apb - should be unsuccessful + begin + write_reg_trans(SET_APB, wrtrans); + repeat (10) @(posedge clk_tb); + end + + begin + repeat (10) begin + // $display ( "TB DEBUG. checking for assertion"); + @(posedge clk_tb); + case (rname) + "SHA_ACC_INTR_BRF_ERROR_INTERNAL_INTR_R": assert ((|error_internal_intr_r) == 1'b0) + else begin + $display ("TB ERROR aserted for addr 0x%08x (%s). Register bit-field(s) mutable over APB! agg value is 0b%b", addr, rname, error_internal_intr_r); + error_ctr += 1; + break; + end + + "SHA_ACC_INTR_BRF_NOTIF_INTERNAL_INTR_R": assert ((|notif_internal_intr_r) == 1'b0) + else begin + $display ("TB ERROR aserted for addr 0x%08x (%s). Register bit-field(s) mutable over APB! agg value is 0b%b", addr, rname, notif_internal_intr_r); + error_ctr += 1; + break; + end + + "SHA_ACC_INTR_BRF_ERROR_INTR_TRIG_R": assert ((|error_intr_trig_r) == 1'b0) + else begin + $display ("TB ERROR aserted for addr 0x%08x (%s). Register bit-field(s) mutable over APB! agg value is 0b%b", addr, rname, error_intr_trig_r); + error_ctr += 1; + break; + end + + "SHA_ACC_INTR_BRF_NOTIF_INTR_TRIG_R": assert ((|notif_intr_trig_r) == 1'b0) + else begin + $display ("TB ERROR aserted for addr 0x%08x (%s). Register bit-field(s) mutable over APB! agg value is 0b%b", addr, rname, notif_intr_trig_r); + error_ctr += 1; + break; + end + + default: $display ("TB ERROR for addr 0x%08x (%s). Unexpected mismatch; no handler found", addr, rname); + endcase + end + end + join_any + + end + + end + + endtask // sha_acc_intrblk_test + +/* +// Placeholder for concurrent assertions in future + +sequence remain_low__sha_acc_error_internal_intr_r; + (| ({ dut.i_sha512_acc_top.i_sha512_acc_csr.field_storage.intr_block_rf.error_internal_intr_r.error0_sts.value, + dut.i_sha512_acc_top.i_sha512_acc_csr.field_storage.intr_block_rf.error_internal_intr_r.error1_sts.value, + dut.i_sha512_acc_top.i_sha512_acc_csr.field_storage.intr_block_rf.error_internal_intr_r.error2_sts.value, + dut.i_sha512_acc_top.i_sha512_acc_csr.field_storage.intr_block_rf.error_internal_intr_r.error3_sts.value }) == 1'b0); +endsequence + +property reg_remains_low; + @(posedge clk_tb) + disable iff (reg_sva_off) remain_low__sha_acc_error_internal_intr_r; +endproperty + +monitor_trans2ones: assert property(reg_remains_low); +*/ + diff --git a/src/soc_ifc/tb/single_soc_reg_test.svh b/src/soc_ifc/tb/single_soc_reg_test.svh index 4711f0ded..d66a67338 100644 --- a/src/soc_ifc/tb/single_soc_reg_test.svh +++ b/src/soc_ifc/tb/single_soc_reg_test.svh @@ -20,16 +20,21 @@ // // Tests out write/read single soc register test using same bus protocol //---------------------------------------------------------------- - task single_socreg_test(input string meth_name); + task single_socreg_test(input string meth_name, int wrcount); + // Example + // meth_name: AHB.CPTRA_TIMER_CONFIG -- for back2back AHB write+read + // wrcount: 20 -- number of times to perform write-read pairs access_t access; string meth, rname; word_addr_t addr; int tid = 0; + strq_t reglist; WordTransaction wrtrans, rdtrans; begin + $display("Executing single_socreg_test: %s", meth_name); $display("----------------------------%s\n", {meth_name.len(){"-"}}); @@ -38,38 +43,48 @@ wrtrans = new(); rdtrans = new(); + meth = meth_name.substr(0, 2); rname = meth_name.substr(4, meth_name.len()-1); addr = socregs.get_addr(rname); - - // Write over a method & read over same method - wrtrans.update(addr, 0, tid); - wrtrans.randomize(); + reglist.push_back(rname); - if (str_startswith(meth_name, "APB.")) begin - write_single_word_apb(addr, wrtrans.data); - sb.record_entry(wrtrans, SET_APB); + if (wrcount < 1) begin + error_ctr = 1; + $display("ERROR performing %s operations on register %s %d times -- wrcount MUST be > 0", meth, rname, wrcount); + end else begin + $display("-- Performing %s operations on register %s %d times --", meth, rname, wrcount); + end - repeat (10) @(posedge clk_tb); - read_single_word_apb(addr); - $display("Read over APB: addr = %30s (0x%08x), data = 0x%08x", rname, addr, prdata_o_tb); - rdtrans.update(addr, prdata_o_tb, tid); - sb.check_entry(rdtrans); + if (meth == "AHB") begin // Perform Caliptra boot - end else if (str_startswith(meth_name, "AHB.")) begin - write_single_word_ahb(addr, wrtrans.data); - sb.record_entry(wrtrans, SET_AHB); + simulate_caliptra_boot(); + repeat (20) @(posedge clk_tb); + sb.del_all(); + update_CPTRA_FLOW_STATUS(ready_for_fuses, `REG_HIER_BOOT_FSM_PS); - repeat (10) @(posedge clk_tb); - read_single_word_apb(addr); - $display("Read over AHB: addr = %30s (0x%08x), data = 0x%08x", rname, addr, prdata_o_tb); - rdtrans.update(addr, hrdata_o_tb, tid); - sb.check_entry(rdtrans); end - - error_ctr = sb.err_count; + + update_INTR_BRF_NOTIF_INTERNAL_INTR_R(gen_input_wire_toggle, security_state.debug_locked); + + // Write over a method & read over same method + + for (int i = 0; i < wrcount; i++) begin + + wrtrans.update(addr, 0, tid); + wrtrans.randomize(); + + if (str_startswith(meth_name, "APB.")) + write_read_regs(SET_APB, GET_APB, reglist, tid, 1); + else if (str_startswith(meth_name, "AHB.")) + write_read_regs(SET_AHB, GET_AHB, reglist, tid, 1); + + end + + error_ctr = sb.err_count; + end endtask // single_socreg_test diff --git a/src/soc_ifc/tb/soc_ifc_tb.sv b/src/soc_ifc/tb/soc_ifc_tb.sv index 4853d1eb4..7a50704d0 100644 --- a/src/soc_ifc/tb/soc_ifc_tb.sv +++ b/src/soc_ifc/tb/soc_ifc_tb.sv @@ -22,17 +22,19 @@ // Probably should be deprecated and utilize UVMF environment only //====================================================================== -/* -`define PRINT_TESTNAME(_SOC_IFC_TESTNAME) \ - string tmpstr = `"_SOC_IFC_TESTNAME`"; - $display(`"Executing test: _SOC_IFC_TESTNAME`"); - $display({{tmpstr.len(){`"-`"}}); -//---------------------------------------------------------------- -*/ - import "DPI-C" function string getenv(input string env_name); +`define AHB64_HI 63:32 +`define AHB64_LO 31:0 + +`define REG_HIER_BOOT_FSM_PS dut.boot_fsm_ps +`define REG_HIER_PFX dut.i_soc_ifc_reg.field_storage + +`define FORLOOP_COMB(x) always_comb for (int j = 0; j < x; j++) +`define STR_RMPFX(astr, bstr) astr.substr(bstr.len(), astr.len() - 1).atoi() + + module soc_ifc_tb import soc_ifc_pkg::*; import soc_ifc_tb_pkg::*; @@ -41,10 +43,13 @@ module soc_ifc_tb enum logic {DEBUG_UNLOCKED = 1'b0, DEBUG_LOCKED = 1'b1} debug_state_e; - // Strings for plusargs + // plusargs and other test related string soc_ifc_testname; string socreg_method_name = ""; string security_state_testname; + int socreg_wrcount = 1; + + string tphase; //---------------------------------------------------------------- @@ -69,21 +74,25 @@ module soc_ifc_tb parameter MBOX_DLEN_VAL = 32'h0000001C; - parameter MBOX_UDS_ADDR = 32'h3003_0200; - parameter MBOX_FE_ADDR = 32'h3003_0230; - parameter MBOX_FUSE_DONE_ADDR = 32'h3003_00ac; + parameter MBOX_UDS_ADDR = SOCIFC_BASE + `SOC_IFC_REG_FUSE_UDS_SEED_0; + parameter MBOX_FE_ADDR = SOCIFC_BASE + `SOC_IFC_REG_FUSE_FIELD_ENTROPY_0; + parameter MBOX_FUSE_DONE_ADDR = SOCIFC_BASE + `SOC_IFC_REG_CPTRA_FUSE_WR_DONE; + + parameter AHB_ADDR_WIDTH = `CALIPTRA_SLAVE_ADDR_WIDTH(`CALIPTRA_SLAVE_SEL_SOC_IFC); // 18 + parameter AHB_DATA_WIDTH = `CALIPTRA_AHB_HDATA_SIZE; // 32 + parameter APB_ADDR_WIDTH = `CALIPTRA_SLAVE_ADDR_WIDTH(`CALIPTRA_SLAVE_SEL_SOC_IFC); // 18 + parameter APB_DATA_WIDTH = `CALIPTRA_APB_DATA_WIDTH; // 32 + parameter APB_USER_WIDTH = `CALIPTRA_APB_USER_WIDTH; // 32 - parameter AHB_ADDR_WIDTH = 18; - parameter AHB_DATA_WIDTH = 32; - parameter APB_ADDR_WIDTH = 18; - parameter APB_DATA_WIDTH = 32; - parameter APB_USER_WIDTH = 32; parameter AHB_HTRANS_IDLE = 0; parameter AHB_HTRANS_BUSY = 1; parameter AHB_HTRANS_NONSEQ = 2; parameter AHB_HTRANS_SEQ = 3; + localparam PAUSER_DEFAULT = 32'hffff_ffff; + + //---------------------------------------------------------------- // Register and Wire declarations. //---------------------------------------------------------------- @@ -153,6 +162,23 @@ module soc_ifc_tb //MH. Initialize to default device lifecycle later rather than TIE OFF security_state_t security_state, tmp_ss; // '{device_lifecycle: DEVICE_PRODUCTION, debug_locked: DEBUG_LOCKED}; + logic gen_input_wire_toggle; + + logic [31:0] generic_input_wires0_q; + logic [31:0] generic_input_wires1_q; + + //MH. Tick timers + logic [31:0] cycle_ctr_since_pwrgood; + logic [31:0] cycle_ctr_since_rst; + + bit reg_sva_off = 1'b1; // Enable only during register assertion checks + + logic [APB_DATA_WIDTH-1:0] prdata_o_latched; + + + always @(negedge clk_tb) begin + prdata_o_latched <= prdata_o_tb; + end always_comb begin mbox_sram_cs = mbox_sram_req.cs; @@ -171,19 +197,22 @@ module soc_ifc_tb // Device Under Test. //---------------------------------------------------------------- soc_ifc_top #( - .AHB_DATA_WIDTH(32), - .AHB_ADDR_WIDTH(18), - .APB_USER_WIDTH(32), - .APB_ADDR_WIDTH(18), - .APB_DATA_WIDTH(32) + .AHB_DATA_WIDTH(AHB_DATA_WIDTH), + .AHB_ADDR_WIDTH(AHB_ADDR_WIDTH), + .APB_USER_WIDTH(APB_USER_WIDTH), + .APB_ADDR_WIDTH(APB_ADDR_WIDTH), + .APB_DATA_WIDTH(APB_DATA_WIDTH) ) dut ( .clk(clk_tb), .clk_cg(clk_tb), .soc_ifc_clk_cg(clk_tb), + .rdc_clk_cg(clk_tb), .cptra_pwrgood(cptra_pwrgood_tb), .cptra_rst_b(cptra_rst_b_tb), + .rdc_clk_dis(), + .fw_update_rst_window(), .ready_for_fuses(ready_for_fuses), .ready_for_fw_push(ready_for_fw_push), @@ -228,10 +257,13 @@ module soc_ifc_tb .soc_ifc_notif_intr(), .sha_error_intr(), .sha_notif_intr(), + .timer_intr(), .mbox_sram_req(mbox_sram_req), .mbox_sram_resp(mbox_sram_resp), + .rv_ecc_sts(rv_ecc_sts_t'{default:1'b0}), + .clear_obf_secrets(clear_obf_secrets), .scan_mode_f(scan_mode_f), .cptra_obf_key('0), @@ -278,6 +310,7 @@ module soc_ifc_tb ); + // Other special and aggregate data type instantiations struct { string reg_name; WordTransaction wr_trans; @@ -323,6 +356,45 @@ module soc_ifc_tb end + //---------------------------------------------------------------- + // tick_timer + // + // Counts number of clock ticks since power good and reset + //---------------------------------------------------------------- + always @(posedge clk_tb or negedge cptra_pwrgood_tb) begin : tick_timer_pwrgood + if (!cptra_pwrgood_tb) + cycle_ctr_since_pwrgood <= '0; + else + cycle_ctr_since_pwrgood <= cycle_ctr_since_pwrgood + 1'b1; + end + + always @(posedge clk_tb or negedge cptra_rst_b_tb) begin : tick_timer_outofrst + if (!cptra_rst_b_tb) + cycle_ctr_since_rst <= '0; + else + cycle_ctr_since_rst <= cycle_ctr_since_pwrgood + 1'b1; + end + + + //---------------------------------------------------------------- + // generic_input_detetor + // + // pulses high when generic input wires change + //---------------------------------------------------------------- + always @(posedge clk_tb or negedge cptra_rst_b_tb) begin : generic_input_detector + if (!cptra_rst_b_tb) begin + generic_input_wires0_q <= '0; + generic_input_wires1_q <= '0; + end else begin + generic_input_wires0_q <= cptra_noncore_rst_b_tb ? generic_input_wires0 : generic_input_wires0_q; + generic_input_wires1_q <= cptra_noncore_rst_b_tb ? generic_input_wires1 : generic_input_wires1_q; + end + end + + assign gen_input_wire_toggle = (generic_input_wires0 != generic_input_wires0_q) | + (generic_input_wires1 != generic_input_wires1_q); + + //---------------------------------------------------------------- // pulse_trig_handler // @@ -350,11 +422,13 @@ module soc_ifc_tb // CPTRA SECUIRTY_STATE, FLOW_STATUS, GENERIC_INPUT_WIRES //---------------------------------------------------------------- - always_comb begin - update_CPTRA_SECURITY_STATE(scan_mode_f, security_state.debug_locked, security_state.device_lifecycle); - update_CPTRA_FLOW_STATUS(ready_for_fuses); - update_CPTRA_GENERIC_INPUT_WIRES(generic_input_wires1, generic_input_wires0); - end + always_comb update_CPTRA_SECURITY_STATE(scan_mode_f, security_state.debug_locked, security_state.device_lifecycle); + always_comb update_CPTRA_FLOW_STATUS(ready_for_fuses, `REG_HIER_BOOT_FSM_PS); + always_comb update_CPTRA_GENERIC_INPUT_WIRES(generic_input_wires1_q, 1'b1); + always_comb update_CPTRA_GENERIC_INPUT_WIRES(generic_input_wires0_q, 1'b0); + always_comb update_INTR_BRF_NOTIF_INTERNAL_INTR_R(gen_input_wire_toggle, security_state.debug_locked); + + //---------------------------------------------------------------- // reset_dut() @@ -365,11 +439,14 @@ module soc_ifc_tb begin $display("*** Toggle reset."); - reset_generic_input_wires(-1, -1); + set_generic_input_wires(-1, -1); cptra_pwrgood_tb = '0; cptra_rst_b_tb = 0; + set_initval("CPTRA_GENERIC_INPUT_WIRES0", generic_input_wires0); // The init val will take effect + set_initval("CPTRA_GENERIC_INPUT_WIRES1", generic_input_wires1); // after reset deassertion + repeat (5) @(posedge clk_tb); socregs.unlock_fuses(); @@ -379,6 +456,7 @@ module soc_ifc_tb repeat (5) @(posedge clk_tb); cptra_rst_b_tb = 1; + repeat (5) @(posedge clk_tb); $display(""); end endtask // reset_dut @@ -393,7 +471,7 @@ module soc_ifc_tb begin $display("*** Perform warm reset. ***"); - reset_generic_input_wires(-1, -1); + set_generic_input_wires(-1, -1); reset_flow_status(); cptra_rst_b_tb = 0; @@ -401,6 +479,7 @@ module soc_ifc_tb repeat (5) @(posedge clk_tb); cptra_rst_b_tb = 1; + repeat (5) @(posedge clk_tb); $display(""); end endtask // reset_dut @@ -508,6 +587,7 @@ module soc_ifc_tb //---------------------------------------------------------------- task write_single_word_ahb(input [31 : 0] address, input [31 : 0] word); + begin hsel_i_tb <= 1; haddr_i_tb <= address; @@ -517,7 +597,7 @@ module soc_ifc_tb @(posedge clk_tb); haddr_i_tb <= 'Z; - hwdata_i_tb <= word; + hwdata_i_tb <= address[2] ? {word, 32'h0}: {32'h0, word}; hwrite_i_tb <= 0; htrans_i_tb <= AHB_HTRANS_IDLE; wait(hreadyout_o_tb == 1'b1); @@ -555,6 +635,33 @@ module soc_ifc_tb endtask // write_single_word_apb + //---------------------------------------------------------------- + // write_single_word_apb_wpauser() + // + // Write the given word to the DUT using the APB interface setting pauser. + //---------------------------------------------------------------- + task write_single_word_apb_wpauser(input [31 : 0] address, + input [31 : 0] word, + input [31 : 0] pauser); + begin + paddr_i_tb <= address; + psel_i_tb <= 1; + penable_i_tb <= 0; + pwrite_i_tb <= 1; + pwdata_i_tb <= word; + pauser_i_tb <= pauser; + wait(pready_o_tb == 1'b1); + + @(posedge clk_tb); + penable_i_tb <= 1; + wait(pready_o_tb == 1'b1); + + @(posedge clk_tb); + psel_i_tb <= 0; + penable_i_tb <= 0; + end + endtask // write_single_word_apb_wpauser + //---------------------------------------------------------------- // write_block_ahb() @@ -630,7 +737,34 @@ module soc_ifc_tb psel_i_tb <= 0; penable_i_tb <= 0; end - endtask // read_single_word_ahb + endtask // read_single_word_apb + + //---------------------------------------------------------------- + // read_single_word_apb_wpauser() + // + // Read the given word to the DUT using the APB interface setting pauser. + //---------------------------------------------------------------- + task read_single_word_apb_wpauser(input [31 : 0] address, + input [31 : 0] word, + input [31 : 0] pauser); + begin + paddr_i_tb <= address; + psel_i_tb <= 1; + penable_i_tb <= 0; + pwrite_i_tb <= 0; + pwdata_i_tb <= 0; + pauser_i_tb <= pauser; + wait(pready_o_tb == 1'b1); + + @(posedge clk_tb); + penable_i_tb <= 1; + wait(pready_o_tb == 1'b1); + + @(posedge clk_tb); + psel_i_tb <= 0; + penable_i_tb <= 0; + end + endtask // read_single_word_apb_wpauser //---------------------------------------------------------------- // read_result_ahb() @@ -641,13 +775,13 @@ module soc_ifc_tb begin read_single_word_ahb(MBOX_ADDR_DATAOUT); - r_data[127 : 96] = hrdata_o_tb; + r_data[127 : 96] = MBOX_ADDR_DATAOUT[2] ? hrdata_o_tb[`AHB64_HI] : hrdata_o_tb[`AHB64_LO]; read_single_word_ahb(MBOX_ADDR_DATAOUT); - r_data[95 : 64] = hrdata_o_tb; + r_data[95 : 64] = MBOX_ADDR_DATAOUT[2] ? hrdata_o_tb[`AHB64_HI] : hrdata_o_tb[`AHB64_LO]; read_single_word_ahb(MBOX_ADDR_DATAOUT); - r_data[63 : 32] = hrdata_o_tb; + r_data[63 : 32] = MBOX_ADDR_DATAOUT[2] ? hrdata_o_tb[`AHB64_HI] : hrdata_o_tb[`AHB64_LO]; read_single_word_ahb(MBOX_ADDR_DATAOUT); - r_data[31 : 0] = hrdata_o_tb; + r_data[31 : 0] = MBOX_ADDR_DATAOUT[2] ? hrdata_o_tb[`AHB64_HI] : hrdata_o_tb[`AHB64_LO]; end endtask // read_result_ahb @@ -677,11 +811,16 @@ module soc_ifc_tb // wait for the mailbox to unlock before send in anything //---------------------------------------------------------------- task wait_unlock_ahb; + + automatic logic [31:0] valid_hrdata; + begin read_single_word_ahb(MBOX_ADDR_LOCK); - while (hrdata_o_tb != 0) + valid_hrdata = MBOX_ADDR_LOCK[2] ? hrdata_o_tb[`AHB64_HI] :hrdata_o_tb[`AHB64_LO]; + while (valid_hrdata != 0) begin read_single_word_ahb(MBOX_ADDR_LOCK); + valid_hrdata = MBOX_ADDR_LOCK[2] ? hrdata_o_tb[`AHB64_HI] :hrdata_o_tb[`AHB64_LO]; end end endtask // wait_unlock_ahb @@ -702,50 +841,23 @@ module soc_ifc_tb endtask // wait_unlock_apb - //---------------------------------------------------------------- - // set_security_state() - // - // sets the security state explicily to any valid value - //---------------------------------------------------------------- - task set_security_state(input security_state_t ss); - // TODO. Has hardwired mask bit positions in here. Ideally they should be pulled from tb package. - - dword_t intr_notif_val; - - begin - security_state = '{device_lifecycle: ss.device_lifecycle, debug_locked: ss.debug_locked}; - - set_initval("CPTRA_SECURITY_STATE", ss & 32'h7); - update_exp_regval("CPTRA_SECURITY_STATE", ss & 32'h7, SET_DIRECT); - - - intr_notif_val = get_initval("INTR_BRF_NOTIF_INTERNAL_INTR_R") & 32'hffff_fffb | ss.debug_locked & 32'h4; - set_initval("INTR_BRF_NOTIF_INTERNAL_INTR_R", intr_notif_val); - update_exp_regval("INTR_BRF_NOTIF_INTERNAL_INTR_R", intr_notif_val, SET_DIRECT); - end - endtask - - //---------------------------------------------------------------- - // reset_generic_input_wires() + // set_generic_input_wires() // // sets the generic_input_wires to a predetermined or random value //---------------------------------------------------------------- - task reset_generic_input_wires(input int v0, int v1); + task set_generic_input_wires(input int v0, int v1); begin generic_input_wires0 = (v0 < 0) ? $urandom() : v0; generic_input_wires1 = (v1 < 0) ? $urandom() : v1; - set_initval("CPTRA_GENERIC_INPUT_WIRES0", generic_input_wires0); - set_initval("CPTRA_GENERIC_INPUT_WIRES1", generic_input_wires1); - update_exp_regval("CPTRA_GENERIC_INPUT_WIRES0", generic_input_wires0, SET_DIRECT); - update_exp_regval("CPTRA_GENERIC_INPUT_WIRES1", generic_input_wires1, SET_DIRECT); - - @(posedge clk_tb); + repeat (2) @(posedge clk_tb); + update_CPTRA_GENERIC_INPUT_WIRES(generic_input_wires0_q, 1'b0); + update_CPTRA_GENERIC_INPUT_WIRES(generic_input_wires1_q, 1'b1); end - endtask + endtask // set_generic_input_wires //---------------------------------------------------------------- @@ -757,7 +869,7 @@ module soc_ifc_tb begin set_initval("CPTRA_FLOW_STATUS", '0); - update_CPTRA_FLOW_STATUS('0); + update_CPTRA_FLOW_STATUS('0, `REG_HIER_BOOT_FSM_PS); end endtask @@ -918,11 +1030,16 @@ module soc_ifc_tb //---------------------------------------------------------------- task sim_dut_init; - int sscode = -1; + // int sscode = -1; + string ssname = "UNSET"; begin - sscode = int'(security_state); - if (!((sscode >= 0) || (sscode <= 7))) + // sscode = int'(security_state); + // if (!((sscode >= 0) || (sscode <= 7))) + // $error("Have to explictily set security_state for soc_ifc_top for test to run!"); + + ssname = get_ss_name(int'(security_state)); + if ((ssname == "") || (ssname == "UNSET")) $error("Have to explictily set security_state for soc_ifc_top for test to run!"); else begin @@ -930,8 +1047,9 @@ module soc_ifc_tb reset_dut(); wait (ready_for_fuses == 1'b1); - set_initval("CPTRA_FLOW_STATUS", 32'h4000_0000); - update_exp_regval("CPTRA_FLOW_STATUS", 32'h4000_0000, SET_DIRECT); + update_CPTRA_FLOW_STATUS(ready_for_fuses, `REG_HIER_BOOT_FSM_PS); + // set_initval("CPTRA_FLOW_STATUS", 32'h4000_0000); + // update_exp_regval("CPTRA_FLOW_STATUS", 32'h4000_0000, SET_DIRECT); repeat (5) @(posedge clk_tb); end @@ -1006,7 +1124,118 @@ module soc_ifc_tb repeat (wait_cycles) @(posedge clk_tb); end end - endtask + endtask // write_regs + + + //----------------------------------------------------------------------------- + // read_reg_chk_inrange() + // + // Utility for reading single register over APB/AHB and check if within range. + // NOTE. Wait times must be added explcitly outside routine + //----------------------------------------------------------------------------- + task read_reg_chk_inrange(input access_t modifier, string rname, int tid, int minval, int maxval); + + word_addr_t addr; + WordTransaction rdtrans; + automatic logic [31:0] valid_hrdata; + + begin + rdtrans = new(); + addr = socregs.get_addr(rname); + + if (modifier == GET_AHB) begin + read_single_word_ahb(addr); + valid_hrdata = addr[2] ? hrdata_o_tb[`AHB64_HI] :hrdata_o_tb[`AHB64_LO]; + $display(" Read over AHB: addr = %-40s (0x%08x), data = 0x%08x", rname, addr, valid_hrdata); + rdtrans.update(addr, valid_hrdata, tid); + end else if (modifier == GET_APB) begin + read_single_word_apb(addr); + $display(" Read over APB: addr = %-40s (0x%08x), data = 0x%08x", rname, addr, prdata_o_tb); + rdtrans.update_byname(rname, prdata_o_tb, tid); + end else + $error("TB ERROR. Unsupported access modifier %s", modifier.name()); + + sb.record_entry(rdtrans, SET_DIRECT); + sb.check_entry_inrange(rdtrans, minval, maxval); + end + + endtask // read_reg_chk_inrange + + + //---------------------------------------------------------------- + // write_reg_trans() + // + // Utility for tracking/writing transaction to a register over APB/AHB + // NOTE. Wait times must be added explcitly outside routine + //---------------------------------------------------------------- + task write_reg_trans(access_t modifier, WordTransaction wrtrans, logic [31:0] pauser=PAUSER_DEFAULT); + string rname; + word_addr_t addr; + + begin + addr = wrtrans.addr; + rname = socregs.get_name(addr); + + if (modifier == SET_AHB) begin + write_single_word_ahb(addr, wrtrans.data); + $display("Write over AHB: addr = %-40s (0x%08x), data = 0x%08x", rname, addr, wrtrans.data); + end else if (modifier == SET_APB) begin + if (pauser != PAUSER_DEFAULT) begin + write_single_word_apb_wpauser(addr, wrtrans.data, pauser); + $display("Write over APB with non-default pauser: addr = %-40s (0x%08x), data = 0x%08x", + rname, addr, wrtrans.data); + end else begin + write_single_word_apb(addr, wrtrans.data); + $display("Write over APB: addr = %-40s (0x%08x), data = 0x%08x", rname, addr, wrtrans.data); + end + end else + $error("TB ERROR. Unsupported access modifier %s", modifier.name()); + + sb.record_entry(wrtrans, modifier); + end + endtask // write_reg_trans + + + //---------------------------------------------------------------- + // read_reg_trans() + // + // Utility for reading transaction to a register over APB/AHB + // NOTES. 1. No scoreboard checking + // 2. Wait times must be added explcitly outside routine + //---------------------------------------------------------------- + task read_reg_trans(input access_t modifier, + inout WordTransaction rdtrans, + input logic [31:0] pauser=PAUSER_DEFAULT); + string rname; + word_addr_t addr; + automatic logic [31:0] valid_hrdata; + + begin + addr = rdtrans.addr; + rname = socregs.get_name(addr); + + if (modifier == GET_AHB) begin + read_single_word_ahb(addr); + valid_hrdata = addr[2] ? hrdata_o_tb[`AHB64_HI] :hrdata_o_tb[`AHB64_LO]; + rdtrans.data = valid_hrdata; + $display(" Read over AHB: addr = %-40s (0x%08x), data = 0x%08x", rname, addr, rdtrans.data); + end else if (modifier == GET_APB) begin + if (pauser != PAUSER_DEFAULT) begin + read_single_word_apb_wpauser(addr, rdtrans.data, pauser); + rdtrans.data = prdata_o_tb; + $display(" Read over APB with explicit pauser: addr = %-40s (0x%08x), data = 0x%08x", + rname, addr, rdtrans.data); + end else begin + read_single_word_apb(addr); + rdtrans.data = prdata_o_tb; + $display(" Read over APB: addr = %-40s (0x%08x), data = 0x%08x", rname, addr, rdtrans.data); + end + end else + $error("TB ERROR. Unsupported access modifier %s", modifier.name()); + + // sb.check_entry(rdtrans) + end + endtask // read_reg_trans //---------------------------------------------------------------- @@ -1020,6 +1249,7 @@ module soc_ifc_tb WordTransaction rdtrans; int tid_autoinc; + automatic logic [31:0] valid_hrdata; begin rdtrans = new(); @@ -1039,12 +1269,15 @@ module soc_ifc_tb if (modifier == GET_AHB) begin read_single_word_ahb(addr); - $display("Read over AHB: addr = %-40s (0x%08x), data = 0x%08x", rname, addr, hrdata_o_tb); - rdtrans.update(addr, hrdata_o_tb, tid); + valid_hrdata = addr[2] ? hrdata_o_tb[`AHB64_HI] :hrdata_o_tb[`AHB64_LO]; + $display(" Read over AHB: addr = %-40s (0x%08x), data = 0x%08x on cycle %08d", rname, addr, valid_hrdata, cycle_ctr); + rdtrans.update(addr, valid_hrdata, tid); end else if (modifier == GET_APB) begin read_single_word_apb(addr); - $display("Read over APB: addr = %-40s (0x%08x), data = 0x%08x", rname, addr, prdata_o_tb); - rdtrans.update(addr, prdata_o_tb, tid); + // $display(" Read over APB: addr = %-40s (0x%08x), data = 0x%08x at time %12t (cycle %08d)", rname, addr, prdata_o_latched, $realtime, cycle_ctr); // used to be prdata_o_tb + $display(" Read over APB: addr = %-40s (0x%08x), data = 0x%08x on cycle %08d", rname, addr, prdata_o_tb, cycle_ctr); // used to be prdata_o_tb + // rdtrans.update(addr, prdata_o_latched, tid); // used to be prdata_o_tb + rdtrans.update(addr, prdata_o_tb, tid); end else $error("TB ERROR. Unsupported access modifier %s", modifier.name()); @@ -1056,7 +1289,7 @@ module soc_ifc_tb end end - endtask + endtask // read_regs //---------------------------------------------------------------- @@ -1072,6 +1305,7 @@ module soc_ifc_tb WordTransaction wrtrans; int tid_autoinc; + automatic logic [31:0] valid_hrdata; begin wrtrans = new(); @@ -1122,11 +1356,12 @@ module soc_ifc_tb // read phase if (rd_modifier == GET_AHB) begin read_single_word_ahb(addr); - $display("Read over AHB: addr = %-40s (0x%08x), data = 0x%08x", rname, addr, hrdata_o_tb); - rdtrans.update(addr, hrdata_o_tb, tid); + valid_hrdata = addr[2] ? hrdata_o_tb[`AHB64_HI] : hrdata_o_tb[`AHB64_LO]; + $display(" Read over AHB: addr = %-40s (0x%08x), data = 0x%08x", rname, addr, valid_hrdata); + rdtrans.update(addr, valid_hrdata, tid); end else if (rd_modifier == GET_APB) begin read_single_word_apb(addr); - $display("Read over APB: addr = %-40s (0x%08x), data = 0x%08x", rname, addr, prdata_o_tb); + $display(" Read over APB: addr = %-40s (0x%08x), data = 0x%08x", rname, addr, prdata_o_tb); rdtrans.update(addr, prdata_o_tb, tid); end else $error("TB ERROR. Unsupported access rd_modifier %s", rd_modifier.name()); @@ -1143,6 +1378,50 @@ module soc_ifc_tb endtask // write_read_regs + //================================================================ + // Function Definitions + //================================================================ + + + //---------------------------------------------------------------- + // set_security_state() + // + // sets the security state explicily to any value between 0..7 + //---------------------------------------------------------------- + function automatic void set_security_state(input security_state_t ss); + + dword_t intr_notif_val; + + begin + security_state = '{device_lifecycle: ss.device_lifecycle, debug_locked: ss.debug_locked}; + + // TODO. Has hardwired mask bit positions in here. Ideally they should be pulled from tb package. + // Eg: in update_CPTRA_SECURITY_STATE(...) + set_initval("CPTRA_SECURITY_STATE", ss & 32'h7); + update_exp_regval("CPTRA_SECURITY_STATE", ss & 32'h7, SET_DIRECT); + + intr_notif_val = get_initval("INTR_BRF_NOTIF_INTERNAL_INTR_R") & 32'hffff_fffb | ss.debug_locked & 32'h4; + set_initval("INTR_BRF_NOTIF_INTERNAL_INTR_R", intr_notif_val); + update_exp_regval("INTR_BRF_NOTIF_INTERNAL_INTR_R", intr_notif_val, SET_DIRECT); + end + endfunction // set_security_state + + + //---------------------------------------------------------------- + // set_security_state_byname() + // + // sets security state by name, eg: "DEBUG_LOCKED_PRODUCTION", "RANDOM" + //---------------------------------------------------------------- + function automatic security_state_t set_security_state_byname(input string ss_name="RANDOM"); + + bit [2:0] ss_code; + + begin + ss_code = (ss_name == "RANDOM") ? $urandom_range(0, 7) : get_ss_code(ss_name); + set_security_state(security_state_t'(ss_code)); + return security_state_t'(ss_code); + end + endfunction // set_security_state_byname //---------------------------------------------------------------- @@ -1150,14 +1429,17 @@ module soc_ifc_tb // or as programs. For now, this is the only modularization for // directed tests planned. //---------------------------------------------------------------- -// `include "fuse_reg_lifecycle_test.svh" `include "fuse_reg_perm_test.svh" + `include "fuse_reg_pauser_test.svh" `include "fuse_reg_test.svh" `include "single_soc_reg_test.svh" `include "soc_reg_reset_test.svh" `include "soc_reg_test.svh" + `include "rvtime_reg_test.svh" `include "soc_reg_invalid_test.svh" + `include "soc_reg_intrblk_test.svh" + `include "sha_acc_intrblk_test.svh" //---------------------------------------------------------------- @@ -1172,8 +1454,8 @@ module soc_ifc_tb // common initialization steps for all tests - // set_security_state(DEVICE_PRODUCTION, DEBUG_LOCKED); - // update_exp_regval(socregs.get_addr("CPTRA_SECURITY_STATE"), dword_t'(security_state), SET_DIRECT); + generic_input_wires0 = 32'h0; + generic_input_wires1 = 32'h0; $write("PLAYBOOK_RANDOM_SEED = %s\n", getenv("PLAYBOOK_RANDOM_SEED")); @@ -1183,10 +1465,6 @@ module soc_ifc_tb $display(" Running SOC_IFC_TEST = %s", soc_ifc_testname); $display(" ================================================================="); - //if (!($value$plusargs("SECURITY_STATE=%s", security_state_testname))) - // security_state_testname = "RANDOM"; - // soc_reg_pwron_test(security_state_testname); - if (soc_ifc_testname == "soc_reg_pwron_test") begin if (!($value$plusargs("SECURITY_STATE=%s", security_state_testname))) security_state_testname = "RANDOM"; @@ -1206,25 +1484,41 @@ module soc_ifc_tb if ($value$plusargs("SECURITY_STATE=%s", security_state_testname)) fuse_reg_lifecycle_test(security_state_testname); else - fuse_reg_lifecycle_test("RANDOM"); // 'ALL' is the other option that isn't working fully + fuse_reg_lifecycle_test("RANDOM"); end else if (soc_ifc_testname == "soc_reg_test") begin set_security_state('{device_lifecycle: DEVICE_PRODUCTION, debug_locked: DEBUG_LOCKED}); sim_dut_init(); soc_reg_test(); + end else if (soc_ifc_testname == "rvtime_reg_test") begin + set_security_state('{device_lifecycle: DEVICE_PRODUCTION, debug_locked: DEBUG_LOCKED}); + sim_dut_init(); + rvtime_reg_test(); + end else if (soc_ifc_testname == "soc_reg_invalid_test") begin set_security_state('{device_lifecycle: DEVICE_PRODUCTION, debug_locked: DEBUG_LOCKED}); sim_dut_init(); soc_reg_invalid_test(); + end else if (soc_ifc_testname == "soc_reg_intrblk_test") begin + set_security_state('{device_lifecycle: DEVICE_PRODUCTION, debug_locked: DEBUG_LOCKED}); + sim_dut_init(); + soc_reg_intrblk_test(); + + end else if (soc_ifc_testname == "sha_acc_intrblk_test") begin + set_security_state('{device_lifecycle: DEVICE_PRODUCTION, debug_locked: DEBUG_LOCKED}); + sim_dut_init(); + sha_acc_intrblk_test(); + end else if (soc_ifc_testname == "single_socreg_test") begin if (!($value$plusargs("SOCREG_METHOD_NAME=%s", socreg_method_name))) $display("ERROR with testing one soc_register; must provide method & name for +scoreg_method_name,eg. APB.CPTRA_TIMER_CONFIG"); else begin + $value$plusargs("SOCREG_WRCOUNT=%d", socreg_wrcount); set_security_state('{device_lifecycle: DEVICE_PRODUCTION, debug_locked: DEBUG_LOCKED}); sim_dut_init(); - single_socreg_test(socreg_method_name); + single_socreg_test(socreg_method_name, socreg_wrcount); end end else if (soc_ifc_testname == "fuse_reg_perm_test") begin @@ -1232,6 +1526,11 @@ module soc_ifc_tb sim_dut_init(); fuse_reg_perm_test(); + end else if (soc_ifc_testname == "fuse_reg_pauser_test") begin + set_security_state_byname("RANDOM"); + sim_dut_init(); + fuse_reg_pauser_test(); + end @(posedge clk_tb); @@ -1243,7 +1542,8 @@ module soc_ifc_tb else begin : default_test // Keeping original default test structure - $display(" =============================="); + + $display(" =============================="); $display(" -= Testbench for MBOX started =-"); $display(" =============================="); $display(""); diff --git a/src/soc_ifc/tb/soc_ifc_tb_pkg.sv b/src/soc_ifc/tb/soc_ifc_tb_pkg.sv index 9ef6d1eb6..4115bdd98 100644 --- a/src/soc_ifc/tb/soc_ifc_tb_pkg.sv +++ b/src/soc_ifc/tb/soc_ifc_tb_pkg.sv @@ -24,6 +24,7 @@ package soc_ifc_tb_pkg; `include "caliptra_reg_defines.svh" // This is from integration/rtl level localparam SOCIFC_BASE = `CLP_SOC_IFC_REG_BASE_ADDR; + localparam SHAACC_BASE = `CLP_SHA512_ACC_CSR_BASE_ADDR; localparam ADDR_WIDTH = 32; // SHould be 18; will let APB & AHB bus widths truncate as needed @@ -46,9 +47,16 @@ package soc_ifc_tb_pkg; int tid; } transaction_t; + // Useful struct to qualify an int "d" with a valid "v" status + typedef struct { + int d; + int v; + } intpair_t; + typedef transaction_t transq_t [$]; typedef string strq_t [$]; + typedef dword_t dwordq_t [$]; typedef enum { COLD_RESET, WARM_RESET, @@ -88,7 +96,6 @@ package soc_ifc_tb_pkg; // The whole thing could probably be done slickly using enums but dictionaries // are easier to use and lookup stuff. To be updated if overhead is too high. - // TODO. This will be merged into register dict at some point as a pair word_addr_t _wide_register_dict [string] = { "CPTRA_FW_EXTENDED_ERROR_INFO" : 8, "CPTRA_MBOX_VALID_PAUSER" : 5, @@ -97,6 +104,10 @@ package soc_ifc_tb_pkg; "CPTRA_GENERIC_INPUT_WIRES" : 2, "CPTRA_GENERIC_OUTPUT_WIRES" : 2, "CPTRA_FW_REV_ID" : 2, + "CPTRA_WDT_TIMER1_TIMEOUT_PERIOD" : 2, + "CPTRA_WDT_TIMER2_TIMEOUT_PERIOD" : 2, + "CPTRA_WDT_CFG" : 2, + "CPTRA_RSVD_REG" : 2, "FUSE_UDS_SEED" : 12, "FUSE_FIELD_ENTROPY" : 8, "FUSE_KEY_MANIFEST_PK_HASH" : 12, @@ -110,109 +121,153 @@ package soc_ifc_tb_pkg; // ** NOTE. INTR_BRF (== INTR_BLOCK_RF) registers are NOT explictly tested. Only provided to check for undefined ranges, and for future ** // - // Identifier Base Addr Offset // Offset Description + // Identifier Base Addr Offset // Offset Description word_addr_t _soc_register_dict [string] = { - "CPTRA_HW_ERROR_FATAL" : SOCIFC_BASE + `SOC_IFC_REG_CPTRA_HW_ERROR_FATAL, // 0x000 Hardware Error Fatal - "CPTRA_HW_ERROR_NON_FATAL" : SOCIFC_BASE + `SOC_IFC_REG_CPTRA_HW_ERROR_NON_FATAL, // 0x004 Hardware Error Non-Fatal - "CPTRA_FW_ERROR_FATAL" : SOCIFC_BASE + `SOC_IFC_REG_CPTRA_FW_ERROR_FATAL, // 0x008 Firmware Error Fatal - "CPTRA_FW_ERROR_NON_FATAL" : SOCIFC_BASE + `SOC_IFC_REG_CPTRA_FW_ERROR_NON_FATAL, // 0x00c Firmware Error Non-Fatal - "CPTRA_HW_ERROR_ENC" : SOCIFC_BASE + `SOC_IFC_REG_CPTRA_HW_ERROR_ENC, // 0x010 Hardware Error Encoding - "CPTRA_FW_ERROR_ENC" : SOCIFC_BASE + `SOC_IFC_REG_CPTRA_FW_ERROR_ENC, // 0x014 Firmware Error Encoding - "CPTRA_FW_EXTENDED_ERROR_INFO" : SOCIFC_BASE + `SOC_IFC_REG_CPTRA_FW_EXTENDED_ERROR_INFO_0, // 0x018 [8] Firmware Extended Error Information - "CPTRA_BOOT_STATUS" : SOCIFC_BASE + `SOC_IFC_REG_CPTRA_BOOT_STATUS, // 0x038 Boot Status - "CPTRA_FLOW_STATUS" : SOCIFC_BASE + `SOC_IFC_REG_CPTRA_FLOW_STATUS, // 0x03c Flow Status - "CPTRA_RESET_REASON" : SOCIFC_BASE + `SOC_IFC_REG_CPTRA_RESET_REASON, // 0x040 Reset Reason - "CPTRA_SECURITY_STATE" : SOCIFC_BASE + `SOC_IFC_REG_CPTRA_SECURITY_STATE, // 0x044 Security State - "CPTRA_MBOX_VALID_PAUSER" : SOCIFC_BASE + `SOC_IFC_REG_CPTRA_MBOX_VALID_PAUSER_0, // 0x048 [5] Valid User Registers - "CPTRA_MBOX_PAUSER_LOCK" : SOCIFC_BASE + `SOC_IFC_REG_CPTRA_MBOX_PAUSER_LOCK_0, // 0x05c [5] Valid User Register Lock - "CPTRA_TRNG_VALID_PAUSER" : SOCIFC_BASE + `SOC_IFC_REG_CPTRA_TRNG_VALID_PAUSER, // 0x070 Valid User for TRNG - "CPTRA_TRNG_PAUSER_LOCK" : SOCIFC_BASE + `SOC_IFC_REG_CPTRA_TRNG_PAUSER_LOCK, // 0x074 Valid User for TRNG PAUSER Lock - "CPTRA_TRNG_DATA" : SOCIFC_BASE + `SOC_IFC_REG_CPTRA_TRNG_DATA_0, // 0x078 [12] TRNG Data - "CPTRA_TRNG_STATUS" : SOCIFC_BASE + `SOC_IFC_REG_CPTRA_TRNG_STATUS, // 0x0a8 TRNG Status - "CPTRA_FUSE_WR_DONE" : SOCIFC_BASE + `SOC_IFC_REG_CPTRA_FUSE_WR_DONE, // 0x0ac Fuse Write Done - "CPTRA_TIMER_CONFIG" : SOCIFC_BASE + `SOC_IFC_REG_CPTRA_TIMER_CONFIG, // 0x0b0 Timer Config - "CPTRA_BOOTFSM_GO" : SOCIFC_BASE + `SOC_IFC_REG_CPTRA_BOOTFSM_GO, // 0x0b4 BOOTFSM GO - "CPTRA_DBG_MANUF_SERVICE_REG" : SOCIFC_BASE + `SOC_IFC_REG_CPTRA_DBG_MANUF_SERVICE_REG, // 0x0b8 DEBUG & MANUF SERVICE REG - "CPTRA_CLK_GATING_EN" : SOCIFC_BASE + `SOC_IFC_REG_CPTRA_CLK_GATING_EN, // 0x0bc Global Caliptra Clk gating enable - "CPTRA_GENERIC_INPUT_WIRES" : SOCIFC_BASE + `SOC_IFC_REG_CPTRA_GENERIC_INPUT_WIRES_0, // 0x0c0 [2] Generic Input Wires - "CPTRA_GENERIC_OUTPUT_WIRES" : SOCIFC_BASE + `SOC_IFC_REG_CPTRA_GENERIC_OUTPUT_WIRES_0, // 0x0c8 [2] Generic Output Wires - "CPTRA_HW_REV_ID" : SOCIFC_BASE + `SOC_IFC_REG_CPTRA_HW_REV_ID, // 0x0d0 Caliptra HW RevID - "CPTRA_FW_REV_ID" : SOCIFC_BASE + `SOC_IFC_REG_CPTRA_FW_REV_ID_0, // 0x0d4 Caliptra FW RevID - "CPTRA_HW_CONFIG" : SOCIFC_BASE + `SOC_IFC_REG_CPTRA_HW_CONFIG, // 0x0dc Caliptra HW Config - "CPTRA_WDT_TIMER1_EN" : SOCIFC_BASE + `SOC_IFC_REG_CPTRA_WDT_TIMER1_EN, // 0x0e0 Caliptra WDT Timer1 EN register - "CPTRA_WDT_TIMER1_CTRL" : SOCIFC_BASE + `SOC_IFC_REG_CPTRA_WDT_TIMER1_CTRL, // 0x0e4 Caliptra WDT Timer1 CTRL register - "CPTRA_WDT_TIMER1_TIMEOUT_PERIOD" : SOCIFC_BASE + `SOC_IFC_REG_CPTRA_WDT_TIMER1_TIMEOUT_PERIOD_0, // 0x0e8 [2] Caliptra WDT Timer1 Timeout Period register - "CPTRA_WDT_TIMER2_EN" : SOCIFC_BASE + `SOC_IFC_REG_CPTRA_WDT_TIMER2_EN, // 0x0f0 Caliptra WDT Timer2 EN register - "CPTRA_WDT_TIMER2_CTRL" : SOCIFC_BASE + `SOC_IFC_REG_CPTRA_WDT_TIMER2_CTRL, // 0x0f4 Caliptra WDT Timer2 CTRL register - "CPTRA_WDT_TIMER2_TIMEOUT_PERIOD" : SOCIFC_BASE + `SOC_IFC_REG_CPTRA_WDT_TIMER2_TIMEOUT_PERIOD_0, // 0x0f8 [2] Caliptra WDT Timer2 Timeout Period register - "CPTRA_WDT_STATUS" : SOCIFC_BASE + `SOC_IFC_REG_CPTRA_WDT_STATUS, // 0x100 Caliptra WDT STATUS register - // 0x104..0x1fc - "FUSE_UDS_SEED" : SOCIFC_BASE + `SOC_IFC_REG_FUSE_UDS_SEED_0, // 0x200 [12] Unique Device Secret - "FUSE_FIELD_ENTROPY" : SOCIFC_BASE + `SOC_IFC_REG_FUSE_FIELD_ENTROPY_0, // 0x230 [8] Field Entropy - "FUSE_KEY_MANIFEST_PK_HASH" : SOCIFC_BASE + `SOC_IFC_REG_FUSE_KEY_MANIFEST_PK_HASH_0, // 0x250 [12] - - "FUSE_KEY_MANIFEST_PK_HASH_MASK" : SOCIFC_BASE + `SOC_IFC_REG_FUSE_KEY_MANIFEST_PK_HASH_MASK, // 0x280 - - "FUSE_OWNER_PK_HASH" : SOCIFC_BASE + `SOC_IFC_REG_FUSE_OWNER_PK_HASH_0, // 0x284 [12] - - "FUSE_FMC_KEY_MANIFEST_SVN" : SOCIFC_BASE + `SOC_IFC_REG_FUSE_FMC_KEY_MANIFEST_SVN, // 0x2b4 - - "FUSE_RUNTIME_SVN" : SOCIFC_BASE + `SOC_IFC_REG_FUSE_RUNTIME_SVN_0, // 0x2b8 [4] - - "FUSE_ANTI_ROLLBACK_DISABLE" : SOCIFC_BASE + `SOC_IFC_REG_FUSE_ANTI_ROLLBACK_DISABLE, // 0x2c8 - - "FUSE_IDEVID_CERT_ATTR" : SOCIFC_BASE + `SOC_IFC_REG_FUSE_IDEVID_CERT_ATTR_0, // 0x2cc [24] - - "FUSE_IDEVID_MANUF_HSM_ID" : SOCIFC_BASE + `SOC_IFC_REG_FUSE_IDEVID_MANUF_HSM_ID_0, // 0x32c [4] - - "FUSE_LIFE_CYCLE" : SOCIFC_BASE + `SOC_IFC_REG_FUSE_LIFE_CYCLE, // 0x33c - - // 0x340..0x5fc - "INTERNAL_OBF_KEY" : SOCIFC_BASE + `SOC_IFC_REG_INTERNAL_OBF_KEY_0, // 0x600 [8] De-Obfuscation Key - "INTERNAL_ICCM_LOCK" : SOCIFC_BASE + `SOC_IFC_REG_INTERNAL_ICCM_LOCK, // 0x620 ICCM Lock - "INTERNAL_FW_UPDATE_RESET" : SOCIFC_BASE + `SOC_IFC_REG_INTERNAL_FW_UPDATE_RESET, // 0x624 FW Update Reset - "INTERNAL_FW_UPDATE_RESET_WAIT_CYCLES" : SOCIFC_BASE + `SOC_IFC_REG_INTERNAL_FW_UPDATE_RESET_WAIT_CYCLES, // 0x628 FW Update Reset Wait Cycles - "INTERNAL_NMI_VECTOR" : SOCIFC_BASE + `SOC_IFC_REG_INTERNAL_NMI_VECTOR, // 0x62c NMI Vector - // 0x630..0x7fc - // "intr_block_rf" - "INTR_BRF_GLOBAL_INTR_EN_R" : SOCIFC_BASE + `SOC_IFC_REG_INTR_BLOCK_RF_GLOBAL_INTR_EN_R, // 0x800 - "INTR_BRF_ERROR_INTR_EN_R" : SOCIFC_BASE + `SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTR_EN_R, // 0x804 - "INTR_BRF_NOTIF_INTR_EN_R" : SOCIFC_BASE + `SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTR_EN_R, // 0x808 - "INTR_BRF_ERROR_GLOBAL_INTR_R" : SOCIFC_BASE + `SOC_IFC_REG_INTR_BLOCK_RF_ERROR_GLOBAL_INTR_R, // 0x80c - "INTR_BRF_NOTIF_GLOBAL_INTR_R" : SOCIFC_BASE + `SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_GLOBAL_INTR_R, // 0x810 - "INTR_BRF_ERROR_INTERNAL_INTR_R" : SOCIFC_BASE + `SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R, // 0x814 - "INTR_BRF_NOTIF_INTERNAL_INTR_R" : SOCIFC_BASE + `SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R, // 0x818 - "INTR_BRF_ERROR_INTR_TRIG_R" : SOCIFC_BASE + `SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTR_TRIG_R, // 0x81c - "INTR_BRF_NOTIF_INTR_TRIG_R" : SOCIFC_BASE + `SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTR_TRIG_R, // 0x820 + "CPTRA_HW_ERROR_FATAL" : SOCIFC_BASE + `SOC_IFC_REG_CPTRA_HW_ERROR_FATAL, // 0x000 Hardware Error Fatal + "CPTRA_HW_ERROR_NON_FATAL" : SOCIFC_BASE + `SOC_IFC_REG_CPTRA_HW_ERROR_NON_FATAL, // 0x004 Hardware Error Non-Fatal + "CPTRA_FW_ERROR_FATAL" : SOCIFC_BASE + `SOC_IFC_REG_CPTRA_FW_ERROR_FATAL, // 0x008 Firmware Error Fatal + "CPTRA_FW_ERROR_NON_FATAL" : SOCIFC_BASE + `SOC_IFC_REG_CPTRA_FW_ERROR_NON_FATAL, // 0x00c Firmware Error Non-Fatal + "CPTRA_HW_ERROR_ENC" : SOCIFC_BASE + `SOC_IFC_REG_CPTRA_HW_ERROR_ENC, // 0x010 Hardware Error Encoding + "CPTRA_FW_ERROR_ENC" : SOCIFC_BASE + `SOC_IFC_REG_CPTRA_FW_ERROR_ENC, // 0x014 Firmware Error Encoding + "CPTRA_FW_EXTENDED_ERROR_INFO" : SOCIFC_BASE + `SOC_IFC_REG_CPTRA_FW_EXTENDED_ERROR_INFO_0, // 0x018 [8] Firmware Extended Error Information + "CPTRA_BOOT_STATUS" : SOCIFC_BASE + `SOC_IFC_REG_CPTRA_BOOT_STATUS, // 0x038 Boot Status + "CPTRA_FLOW_STATUS" : SOCIFC_BASE + `SOC_IFC_REG_CPTRA_FLOW_STATUS, // 0x03c Flow Status + "CPTRA_RESET_REASON" : SOCIFC_BASE + `SOC_IFC_REG_CPTRA_RESET_REASON, // 0x040 Reset Reason + "CPTRA_SECURITY_STATE" : SOCIFC_BASE + `SOC_IFC_REG_CPTRA_SECURITY_STATE, // 0x044 Security State + "CPTRA_MBOX_VALID_PAUSER" : SOCIFC_BASE + `SOC_IFC_REG_CPTRA_MBOX_VALID_PAUSER_0, // 0x048 [5] Valid User Registers + "CPTRA_MBOX_PAUSER_LOCK" : SOCIFC_BASE + `SOC_IFC_REG_CPTRA_MBOX_PAUSER_LOCK_0, // 0x05c [5] Valid User Register Lock + "CPTRA_TRNG_VALID_PAUSER" : SOCIFC_BASE + `SOC_IFC_REG_CPTRA_TRNG_VALID_PAUSER, // 0x070 Valid User for TRNG + "CPTRA_TRNG_PAUSER_LOCK" : SOCIFC_BASE + `SOC_IFC_REG_CPTRA_TRNG_PAUSER_LOCK, // 0x074 Valid User for TRNG PAUSER Lock + "CPTRA_TRNG_DATA" : SOCIFC_BASE + `SOC_IFC_REG_CPTRA_TRNG_DATA_0, // 0x078 [12] TRNG Data + "CPTRA_TRNG_CTRL" : SOCIFC_BASE + `SOC_IFC_REG_CPTRA_TRNG_CTRL, // 0x0a8 TRNG Ctrl + "CPTRA_TRNG_STATUS" : SOCIFC_BASE + `SOC_IFC_REG_CPTRA_TRNG_STATUS, // 0x0ac TRNG Status + "CPTRA_FUSE_WR_DONE" : SOCIFC_BASE + `SOC_IFC_REG_CPTRA_FUSE_WR_DONE, // 0x0b0 Fuse Write Done + "CPTRA_TIMER_CONFIG" : SOCIFC_BASE + `SOC_IFC_REG_CPTRA_TIMER_CONFIG, // 0x0b4 Timer Config + "CPTRA_BOOTFSM_GO" : SOCIFC_BASE + `SOC_IFC_REG_CPTRA_BOOTFSM_GO, // 0x0b8 BOOTFSM GO + "CPTRA_DBG_MANUF_SERVICE_REG" : SOCIFC_BASE + `SOC_IFC_REG_CPTRA_DBG_MANUF_SERVICE_REG, // 0x0bc DEBUG & MANUF SERVICE REG + "CPTRA_CLK_GATING_EN" : SOCIFC_BASE + `SOC_IFC_REG_CPTRA_CLK_GATING_EN, // 0x0c0 Global Caliptra Clk gating enable + "CPTRA_GENERIC_INPUT_WIRES" : SOCIFC_BASE + `SOC_IFC_REG_CPTRA_GENERIC_INPUT_WIRES_0, // 0x0c8 [2] Generic Input Wires + "CPTRA_GENERIC_OUTPUT_WIRES" : SOCIFC_BASE + `SOC_IFC_REG_CPTRA_GENERIC_OUTPUT_WIRES_0, // 0x0d0 [2] Generic Output Wires + "CPTRA_HW_REV_ID" : SOCIFC_BASE + `SOC_IFC_REG_CPTRA_HW_REV_ID, // 0x0d4 Caliptra HW RevID + "CPTRA_FW_REV_ID" : SOCIFC_BASE + `SOC_IFC_REG_CPTRA_FW_REV_ID_0, // 0x0dc Caliptra FW RevID + "CPTRA_HW_CONFIG" : SOCIFC_BASE + `SOC_IFC_REG_CPTRA_HW_CONFIG, // 0x0e0 Caliptra HW Config + "CPTRA_WDT_TIMER1_EN" : SOCIFC_BASE + `SOC_IFC_REG_CPTRA_WDT_TIMER1_EN, // 0x0e4 Caliptra WDT Timer1 EN register + "CPTRA_WDT_TIMER1_CTRL" : SOCIFC_BASE + `SOC_IFC_REG_CPTRA_WDT_TIMER1_CTRL, // 0x0e8 Caliptra WDT Timer1 CTRL register + "CPTRA_WDT_TIMER1_TIMEOUT_PERIOD" : SOCIFC_BASE + `SOC_IFC_REG_CPTRA_WDT_TIMER1_TIMEOUT_PERIOD_0, // 0x0f0 [2] Caliptra WDT Timer1 Timeout Period register + "CPTRA_WDT_TIMER2_EN" : SOCIFC_BASE + `SOC_IFC_REG_CPTRA_WDT_TIMER2_EN, // 0x0f4 Caliptra WDT Timer2 EN register + "CPTRA_WDT_TIMER2_CTRL" : SOCIFC_BASE + `SOC_IFC_REG_CPTRA_WDT_TIMER2_CTRL, // 0x0f8 Caliptra WDT Timer2 CTRL register + "CPTRA_WDT_TIMER2_TIMEOUT_PERIOD" : SOCIFC_BASE + `SOC_IFC_REG_CPTRA_WDT_TIMER2_TIMEOUT_PERIOD_0, // 0x100 [2] Caliptra WDT Timer2 Timeout Period register + "CPTRA_WDT_STATUS" : SOCIFC_BASE + `SOC_IFC_REG_CPTRA_WDT_STATUS, // 0x104 Caliptra WDT STATUS register + "CPTRA_FUSE_VALID_PAUSER" : SOCIFC_BASE + `SOC_IFC_REG_CPTRA_FUSE_VALID_PAUSER, // 0x108 Valid User for FUSE + "CPTRA_FUSE_PAUSER_LOCK" : SOCIFC_BASE + `SOC_IFC_REG_CPTRA_FUSE_PAUSER_LOCK, // 0x10c Valid User for FUSE PAUSER Lock + "CPTRA_WDT_CFG" : SOCIFC_BASE + `SOC_IFC_REG_CPTRA_WDT_CFG_0, // 0x110 [2] Caliptra WDT1 Config + "CPTRA_ITRNG_ENTROPY_CONFIG_0" : SOCIFC_BASE + `SOC_IFC_REG_CPTRA_ITRNG_ENTROPY_CONFIG_0, // 0x118 Caliptra iTRNG Entropy Configuration 0 + "CPTRA_ITRNG_ENTROPY_CONFIG_1" : SOCIFC_BASE + `SOC_IFC_REG_CPTRA_ITRNG_ENTROPY_CONFIG_1, // 0x11c Caliptra iTRNG Entropy Configuration 1 + "CPTRA_RSVD_REG" : SOCIFC_BASE + `SOC_IFC_REG_CPTRA_RSVD_REG_0, // 0x120 [2] Caliptra Reserved Registers + // 0x128..0x1fc + "FUSE_UDS_SEED" : SOCIFC_BASE + `SOC_IFC_REG_FUSE_UDS_SEED_0, // 0x200 [12] Unique Device Secret + "FUSE_FIELD_ENTROPY" : SOCIFC_BASE + `SOC_IFC_REG_FUSE_FIELD_ENTROPY_0, // 0x230 [8] Field Entropy + "FUSE_KEY_MANIFEST_PK_HASH" : SOCIFC_BASE + `SOC_IFC_REG_FUSE_KEY_MANIFEST_PK_HASH_0, // 0x250 [12] - + "FUSE_KEY_MANIFEST_PK_HASH_MASK" : SOCIFC_BASE + `SOC_IFC_REG_FUSE_KEY_MANIFEST_PK_HASH_MASK, // 0x280 - + "FUSE_OWNER_PK_HASH" : SOCIFC_BASE + `SOC_IFC_REG_FUSE_OWNER_PK_HASH_0, // 0x284 [12] - + "FUSE_FMC_KEY_MANIFEST_SVN" : SOCIFC_BASE + `SOC_IFC_REG_FUSE_FMC_KEY_MANIFEST_SVN, // 0x2b4 - + "FUSE_RUNTIME_SVN" : SOCIFC_BASE + `SOC_IFC_REG_FUSE_RUNTIME_SVN_0, // 0x2b8 [4] - + "FUSE_ANTI_ROLLBACK_DISABLE" : SOCIFC_BASE + `SOC_IFC_REG_FUSE_ANTI_ROLLBACK_DISABLE, // 0x2c8 - + "FUSE_IDEVID_CERT_ATTR" : SOCIFC_BASE + `SOC_IFC_REG_FUSE_IDEVID_CERT_ATTR_0, // 0x2cc [24] - + "FUSE_IDEVID_MANUF_HSM_ID" : SOCIFC_BASE + `SOC_IFC_REG_FUSE_IDEVID_MANUF_HSM_ID_0, // 0x32c [4] - + "FUSE_LIFE_CYCLE" : SOCIFC_BASE + `SOC_IFC_REG_FUSE_LIFE_CYCLE, // 0x33c - + "FUSE_LMS_VERIFY" : SOCIFC_BASE + `SOC_IFC_REG_FUSE_LMS_VERIFY, // 0x340 - + "FUSE_LMS_REVOCATION" : SOCIFC_BASE + `SOC_IFC_REG_FUSE_LMS_REVOCATION, // 0x344 - + "FUSE_SOC_STEPPING_ID" : SOCIFC_BASE + `SOC_IFC_REG_FUSE_SOC_STEPPING_ID, // 0x348 - + // 0x34c..0x5fc + "INTERNAL_OBF_KEY" : SOCIFC_BASE + `SOC_IFC_REG_INTERNAL_OBF_KEY_0, // 0x600 [8] De-Obfuscation Key + "INTERNAL_ICCM_LOCK" : SOCIFC_BASE + `SOC_IFC_REG_INTERNAL_ICCM_LOCK, // 0x620 ICCM Lock + "INTERNAL_FW_UPDATE_RESET" : SOCIFC_BASE + `SOC_IFC_REG_INTERNAL_FW_UPDATE_RESET, // 0x624 FW Update Reset + "INTERNAL_FW_UPDATE_RESET_WAIT_CYCLES" : SOCIFC_BASE + `SOC_IFC_REG_INTERNAL_FW_UPDATE_RESET_WAIT_CYCLES, // 0x628 FW Update Reset Wait Cycles + "INTERNAL_NMI_VECTOR" : SOCIFC_BASE + `SOC_IFC_REG_INTERNAL_NMI_VECTOR, // 0x62c NMI Vector + "INTERNAL_HW_ERROR_FATAL_MASK" : SOCIFC_BASE + `SOC_IFC_REG_INTERNAL_HW_ERROR_FATAL_MASK, // 0x630 Hardware Error Fatal Mask + "INTERNAL_HW_ERROR_NON_FATAL_MASK" : SOCIFC_BASE + `SOC_IFC_REG_INTERNAL_HW_ERROR_NON_FATAL_MASK, // 0x634 Hardware Error Non-Fatal Mask + "INTERNAL_FW_ERROR_FATAL_MASK" : SOCIFC_BASE + `SOC_IFC_REG_INTERNAL_FW_ERROR_FATAL_MASK, // 0x638 Firmware Error Fatal Mask + "INTERNAL_FW_ERROR_NON_FATAL_MASK" : SOCIFC_BASE + `SOC_IFC_REG_INTERNAL_FW_ERROR_NON_FATAL_MASK, // 0x63C Firmware Error Non-Fatal Mask 0 + "INTERNAL_RV_MTIME_L" : SOCIFC_BASE + `SOC_IFC_REG_INTERNAL_RV_MTIME_L, // 0x640 mtime low + "INTERNAL_RV_MTIME_H" : SOCIFC_BASE + `SOC_IFC_REG_INTERNAL_RV_MTIME_H, // 0x644 mtime high + "INTERNAL_RV_MTIMECMP_L" : SOCIFC_BASE + `SOC_IFC_REG_INTERNAL_RV_MTIMECMP_L, // 0x648 mtimecmp low + "INTERNAL_RV_MTIMECMP_H" : SOCIFC_BASE + `SOC_IFC_REG_INTERNAL_RV_MTIMECMP_H, // 0x64C mtimecmp high + // 0x650..0x7fc + // SoC IFC Interrupt Block Register + "INTR_BRF_GLOBAL_INTR_EN_R" : SOCIFC_BASE + `SOC_IFC_REG_INTR_BLOCK_RF_GLOBAL_INTR_EN_R, // 0x800 + "INTR_BRF_ERROR_INTR_EN_R" : SOCIFC_BASE + `SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTR_EN_R, // 0x804 + "INTR_BRF_NOTIF_INTR_EN_R" : SOCIFC_BASE + `SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTR_EN_R, // 0x808 + "INTR_BRF_ERROR_GLOBAL_INTR_R" : SOCIFC_BASE + `SOC_IFC_REG_INTR_BLOCK_RF_ERROR_GLOBAL_INTR_R, // 0x80c + "INTR_BRF_NOTIF_GLOBAL_INTR_R" : SOCIFC_BASE + `SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_GLOBAL_INTR_R, // 0x810 + "INTR_BRF_ERROR_INTERNAL_INTR_R" : SOCIFC_BASE + `SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R, // 0x814 + "INTR_BRF_NOTIF_INTERNAL_INTR_R" : SOCIFC_BASE + `SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R, // 0x818 + "INTR_BRF_ERROR_INTR_TRIG_R" : SOCIFC_BASE + `SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTR_TRIG_R, // 0x81c + "INTR_BRF_NOTIF_INTR_TRIG_R" : SOCIFC_BASE + `SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTR_TRIG_R, // 0x820 // 0x824..0x8fc - "INTR_BRF_ERROR_INTERNAL_INTR_COUNT_R" : SOCIFC_BASE + `SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_COUNT_R, // 0x900 - "INTR_BRF_ERROR_INV_DEV_INTR_COUNT_R" : SOCIFC_BASE + `SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INV_DEV_INTR_COUNT_R, // 0x904 - "INTR_BRF_ERROR_CMD_FAIL_INTR_COUNT_R" : SOCIFC_BASE + `SOC_IFC_REG_INTR_BLOCK_RF_ERROR_CMD_FAIL_INTR_COUNT_R, // 0x908 - "INTR_BRF_ERROR_BAD_FUSE_INTR_COUNT_R" : SOCIFC_BASE + `SOC_IFC_REG_INTR_BLOCK_RF_ERROR_BAD_FUSE_INTR_COUNT_R, // 0x90c - "INTR_BRF_ERROR_ICCM_BLOCKED_INTR_COUNT_R" : SOCIFC_BASE + `SOC_IFC_REG_INTR_BLOCK_RF_ERROR_ICCM_BLOCKED_INTR_COUNT_R, // 0x910 - "INTR_BRF_ERROR_MBOX_ECC_UNC_INTR_COUNT_R" : SOCIFC_BASE + `SOC_IFC_REG_INTR_BLOCK_RF_ERROR_MBOX_ECC_UNC_INTR_COUNT_R, // 0x914 - "INTR_BRF_ERROR_WDT_TIMER1_TIMEOUT_INTR_COUNT_R": SOCIFC_BASE + `SOC_IFC_REG_INTR_BLOCK_RF_ERROR_WDT_TIMER1_TIMEOUT_INTR_COUNT_R,// 0x918 - "INTR_BRF_ERROR_WDT_TIMER2_TIMEOUT_INTR_COUNT_R": SOCIFC_BASE + `SOC_IFC_REG_INTR_BLOCK_RF_ERROR_WDT_TIMER2_TIMEOUT_INTR_COUNT_R,// 0x91c + "INTR_BRF_ERROR_INTERNAL_INTR_COUNT_R" : SOCIFC_BASE + `SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_COUNT_R, // 0x900 + "INTR_BRF_ERROR_INV_DEV_INTR_COUNT_R" : SOCIFC_BASE + `SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INV_DEV_INTR_COUNT_R, // 0x904 + "INTR_BRF_ERROR_CMD_FAIL_INTR_COUNT_R" : SOCIFC_BASE + `SOC_IFC_REG_INTR_BLOCK_RF_ERROR_CMD_FAIL_INTR_COUNT_R, // 0x908 + "INTR_BRF_ERROR_BAD_FUSE_INTR_COUNT_R" : SOCIFC_BASE + `SOC_IFC_REG_INTR_BLOCK_RF_ERROR_BAD_FUSE_INTR_COUNT_R, // 0x90c + "INTR_BRF_ERROR_ICCM_BLOCKED_INTR_COUNT_R" : SOCIFC_BASE + `SOC_IFC_REG_INTR_BLOCK_RF_ERROR_ICCM_BLOCKED_INTR_COUNT_R, // 0x910 + "INTR_BRF_ERROR_MBOX_ECC_UNC_INTR_COUNT_R" : SOCIFC_BASE + `SOC_IFC_REG_INTR_BLOCK_RF_ERROR_MBOX_ECC_UNC_INTR_COUNT_R, // 0x914 + "INTR_BRF_ERROR_WDT_TIMER1_TIMEOUT_INTR_COUNT_R": SOCIFC_BASE + `SOC_IFC_REG_INTR_BLOCK_RF_ERROR_WDT_TIMER1_TIMEOUT_INTR_COUNT_R, // 0x918 + "INTR_BRF_ERROR_WDT_TIMER2_TIMEOUT_INTR_COUNT_R": SOCIFC_BASE + `SOC_IFC_REG_INTR_BLOCK_RF_ERROR_WDT_TIMER2_TIMEOUT_INTR_COUNT_R, // 0x91c // 0x920..0x97c - "INTR_BRF_NOTIF_CMD_AVAIL_INTR_COUNT_R" : SOCIFC_BASE + `SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_CMD_AVAIL_INTR_COUNT_R, // 0x980 - "INTR_BRF_NOTIF_MBOX_ECC_COR_INTR_COUNT_R" : SOCIFC_BASE + `SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_MBOX_ECC_COR_INTR_COUNT_R, // 0x984 - "INTR_BRF_NOTIF_DEBUG_LOCKED_INTR_COUNT_R" : SOCIFC_BASE + `SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_DEBUG_LOCKED_INTR_COUNT_R, // 0x988 - "INTR_BRF_NOTIF_SOC_REQ_LOCK_INTR_COUNT_R" : SOCIFC_BASE + `SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_SOC_REQ_LOCK_INTR_COUNT_R, // 0x98c - // 0x990..0x9fc - "INTR_BRF_ERROR_INTERNAL_INTR_COUNT_INCR_R" : SOCIFC_BASE + `SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_COUNT_INCR_R, // 0xa00 - "INTR_BRF_ERROR_INV_DEV_INTR_COUNT_INCR_R" : SOCIFC_BASE + `SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INV_DEV_INTR_COUNT_INCR_R, // 0xa04 - "INTR_BRF_ERROR_CMD_FAIL_INTR_COUNT_INCR_R" : SOCIFC_BASE + `SOC_IFC_REG_INTR_BLOCK_RF_ERROR_CMD_FAIL_INTR_COUNT_INCR_R, // 0xa08 - "INTR_BRF_ERROR_BAD_FUSE_INTR_COUNT_INCR_R" : SOCIFC_BASE + `SOC_IFC_REG_INTR_BLOCK_RF_ERROR_BAD_FUSE_INTR_COUNT_INCR_R, // 0xa0c - "INTR_BRF_ERROR_ICCM_BLOCKED_INTR_COUNT_INCR_R" : SOCIFC_BASE + `SOC_IFC_REG_INTR_BLOCK_RF_ERROR_ICCM_BLOCKED_INTR_COUNT_INCR_R, // 0xa10 - "INTR_BRF_ERROR_MBOX_ECC_UNC_INTR_COUNT_INCR_R" : SOCIFC_BASE + `SOC_IFC_REG_INTR_BLOCK_RF_ERROR_MBOX_ECC_UNC_INTR_COUNT_INCR_R, // 0xa14 - "INTR_BRF_ERROR_WDT_TIMER1_TIMEOUT_INTR_COUNT_INCR_R" : SOCIFC_BASE + `SOC_IFC_REG_INTR_BLOCK_RF_ERROR_WDT_TIMER1_TIMEOUT_INTR_COUNT_INCR_R, // 0xa18 - "INTR_BRF_ERROR_WDT_TIMER2_TIMEOUT_INTR_COUNT_INCR_R" : SOCIFC_BASE + `SOC_IFC_REG_INTR_BLOCK_RF_ERROR_WDT_TIMER2_TIMEOUT_INTR_COUNT_INCR_R, // 0xa1c - "INTR_BRF_NOTIF_CMD_AVAIL_INTR_COUNT_INCR_R" : SOCIFC_BASE + `SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_CMD_AVAIL_INTR_COUNT_INCR_R, // 0xa20 - "INTR_BRF_NOTIF_MBOX_ECC_COR_INTR_COUNT_INCR_R" : SOCIFC_BASE + `SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_MBOX_ECC_COR_INTR_COUNT_INCR_R, // 0xa24 - "INTR_BRF_NOTIF_DEBUG_LOCKED_INTR_COUNT_INCR_R" : SOCIFC_BASE + `SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_DEBUG_LOCKED_INTR_COUNT_INCR_R, // 0xa28 - "INTR_BRF_NOTIF_SOC_REQ_LOCK_INTR_COUNT_INCR_R" : SOCIFC_BASE + `SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_SOC_REQ_LOCK_INTR_COUNT_INCR_R // 0xa2c + "INTR_BRF_NOTIF_CMD_AVAIL_INTR_COUNT_R" : SOCIFC_BASE + `SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_CMD_AVAIL_INTR_COUNT_R, // 0x980 + "INTR_BRF_NOTIF_MBOX_ECC_COR_INTR_COUNT_R" : SOCIFC_BASE + `SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_MBOX_ECC_COR_INTR_COUNT_R, // 0x984 + "INTR_BRF_NOTIF_DEBUG_LOCKED_INTR_COUNT_R" : SOCIFC_BASE + `SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_DEBUG_LOCKED_INTR_COUNT_R, // 0x988 + "INTR_BRF_NOTIF_SCAN_MODE_INTR_COUNT_R" : SOCIFC_BASE + `SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_SCAN_MODE_INTR_COUNT_R, // 0x98c + "INTR_BRF_NOTIF_SOC_REQ_LOCK_INTR_COUNT_R" : SOCIFC_BASE + `SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_SOC_REQ_LOCK_INTR_COUNT_R, // 0x990 + "INTR_BRF_NOTIF_GEN_IN_TOGGLE_INTR_COUNT_R" : SOCIFC_BASE + `SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_GEN_IN_TOGGLE_INTR_COUNT_R, // 0x994 + // 0x998..0x9fc + "INTR_BRF_ERROR_INTERNAL_INTR_COUNT_INCR_R" : SOCIFC_BASE + `SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_COUNT_INCR_R, // 0xa00 + "INTR_BRF_ERROR_INV_DEV_INTR_COUNT_INCR_R" : SOCIFC_BASE + `SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INV_DEV_INTR_COUNT_INCR_R, // 0xa04 + "INTR_BRF_ERROR_CMD_FAIL_INTR_COUNT_INCR_R" : SOCIFC_BASE + `SOC_IFC_REG_INTR_BLOCK_RF_ERROR_CMD_FAIL_INTR_COUNT_INCR_R, // 0xa08 + "INTR_BRF_ERROR_BAD_FUSE_INTR_COUNT_INCR_R" : SOCIFC_BASE + `SOC_IFC_REG_INTR_BLOCK_RF_ERROR_BAD_FUSE_INTR_COUNT_INCR_R, // 0xa0c + "INTR_BRF_ERROR_ICCM_BLOCKED_INTR_COUNT_INCR_R" : SOCIFC_BASE + `SOC_IFC_REG_INTR_BLOCK_RF_ERROR_ICCM_BLOCKED_INTR_COUNT_INCR_R, // 0xa10 + "INTR_BRF_ERROR_MBOX_ECC_UNC_INTR_COUNT_INCR_R" : SOCIFC_BASE + `SOC_IFC_REG_INTR_BLOCK_RF_ERROR_MBOX_ECC_UNC_INTR_COUNT_INCR_R, // 0xa14 + "INTR_BRF_ERROR_WDT_TIMER1_TIMEOUT_INTR_COUNT_INCR_R" : SOCIFC_BASE + `SOC_IFC_REG_INTR_BLOCK_RF_ERROR_WDT_TIMER1_TIMEOUT_INTR_COUNT_INCR_R, // 0xa18 + "INTR_BRF_ERROR_WDT_TIMER2_TIMEOUT_INTR_COUNT_INCR_R" : SOCIFC_BASE + `SOC_IFC_REG_INTR_BLOCK_RF_ERROR_WDT_TIMER2_TIMEOUT_INTR_COUNT_INCR_R, // 0xa1c + "INTR_BRF_NOTIF_CMD_AVAIL_INTR_COUNT_INCR_R" : SOCIFC_BASE + `SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_CMD_AVAIL_INTR_COUNT_INCR_R, // 0xa20 + "INTR_BRF_NOTIF_MBOX_ECC_COR_INTR_COUNT_INCR_R" : SOCIFC_BASE + `SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_MBOX_ECC_COR_INTR_COUNT_INCR_R, // 0xa24 + "INTR_BRF_NOTIF_DEBUG_LOCKED_INTR_COUNT_INCR_R" : SOCIFC_BASE + `SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_DEBUG_LOCKED_INTR_COUNT_INCR_R, // 0xa28 + "INTR_BRF_NOTIF_SOC_REQ_LOCK_INTR_COUNT_INCR_R" : SOCIFC_BASE + `SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_SOC_REQ_LOCK_INTR_COUNT_INCR_R, // 0xa2c + + // SHA Accelerator Interrupt Block Registers + "SHA_ACC_INTR_BRF_GLOBAL_INTR_EN_R" : SHAACC_BASE + `SHA512_ACC_CSR_INTR_BLOCK_RF_GLOBAL_INTR_EN_R, // 0x800 Per-Type Intr Enable Reg + "SHA_ACC_INTR_BRF_ERROR_INTR_EN_R" : SHAACC_BASE + `SHA512_ACC_CSR_INTR_BLOCK_RF_ERROR_INTR_EN_R, // 0x804 Per-Event Intr Enable Reg + "SHA_ACC_INTR_BRF_NOTIF_INTR_EN_R" : SHAACC_BASE + `SHA512_ACC_CSR_INTR_BLOCK_RF_NOTIF_INTR_EN_R, // 0x808 Per-Event Intr Enable Reg + "SHA_ACC_INTR_BRF_ERROR_GLOBAL_INTR_R" : SHAACC_BASE + `SHA512_ACC_CSR_INTR_BLOCK_RF_ERROR_GLOBAL_INTR_R, // 0x80C Intr Status Agg Reg type def + "SHA_ACC_INTR_BRF_NOTIF_GLOBAL_INTR_R" : SHAACC_BASE + `SHA512_ACC_CSR_INTR_BLOCK_RF_NOTIF_GLOBAL_INTR_R, // 0x810 Intr Status Agg Reg type def + "SHA_ACC_INTR_BRF_ERROR_INTERNAL_INTR_R" : SHAACC_BASE + `SHA512_ACC_CSR_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R, // 0x814 Intr Status Reg type def + "SHA_ACC_INTR_BRF_NOTIF_INTERNAL_INTR_R" : SHAACC_BASE + `SHA512_ACC_CSR_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R, // 0x818 Intr Status Reg type def + "SHA_ACC_INTR_BRF_ERROR_INTR_TRIG_R" : SHAACC_BASE + `SHA512_ACC_CSR_INTR_BLOCK_RF_ERROR_INTR_TRIG_R, // 0x81C Intr Trigger Reg type def + "SHA_ACC_INTR_BRF_NOTIF_INTR_TRIG_R" : SHAACC_BASE + `SHA512_ACC_CSR_INTR_BLOCK_RF_NOTIF_INTR_TRIG_R, // 0x820 Intr Trigger Reg type def + // 0x824..0x8fc + "SHA_ACC_INTR_BRF_ERROR0_INTR_COUNT_R" : SHAACC_BASE + `SHA512_ACC_CSR_INTR_BLOCK_RF_ERROR0_INTR_COUNT_R, // 0x900 Intr Event Counter + "SHA_ACC_INTR_BRF_ERROR1_INTR_COUNT_R" : SHAACC_BASE + `SHA512_ACC_CSR_INTR_BLOCK_RF_ERROR1_INTR_COUNT_R, // 0x904 Intr Event Counter + "SHA_ACC_INTR_BRF_ERROR2_INTR_COUNT_R" : SHAACC_BASE + `SHA512_ACC_CSR_INTR_BLOCK_RF_ERROR2_INTR_COUNT_R, // 0x908 Intr Event Counter + "SHA_ACC_INTR_BRF_ERROR3_INTR_COUNT_R" : SHAACC_BASE + `SHA512_ACC_CSR_INTR_BLOCK_RF_ERROR3_INTR_COUNT_R, // 0x90C Intr Event Counter + // 0x910..0x97c + "SHA_ACC_INTR_BRF_NOTIF_CMD_DONE_INTR_COUNT_R" : SHAACC_BASE + `SHA512_ACC_CSR_INTR_BLOCK_RF_NOTIF_CMD_DONE_INTR_COUNT_R, // 0x980 Intr Event Counter + // 0x984..0x9fc + "SHA_ACC_INTR_BRF_ERROR0_INTR_COUNT_INCR_R" : SHAACC_BASE + `SHA512_ACC_CSR_INTR_BLOCK_RF_ERROR0_INTR_COUNT_INCR_R, // 0xa00 Intr Event Count Incr + "SHA_ACC_INTR_BRF_ERROR1_INTR_COUNT_INCR_R" : SHAACC_BASE + `SHA512_ACC_CSR_INTR_BLOCK_RF_ERROR1_INTR_COUNT_INCR_R, // 0xa04 Intr Event Count Incr + "SHA_ACC_INTR_BRF_ERROR2_INTR_COUNT_INCR_R" : SHAACC_BASE + `SHA512_ACC_CSR_INTR_BLOCK_RF_ERROR2_INTR_COUNT_INCR_R, // 0xa08 Intr Event Count Incr + "SHA_ACC_INTR_BRF_ERROR3_INTR_COUNT_INCR_R" : SHAACC_BASE + `SHA512_ACC_CSR_INTR_BLOCK_RF_ERROR3_INTR_COUNT_INCR_R, // 0xa0C Intr Event Count Incr + "SHA_ACC_INTR_BRF_NOTIF_CMD_DONE_INTR_COUNT_INCR_R": SHAACC_BASE + `SHA512_ACC_CSR_INTR_BLOCK_RF_NOTIF_CMD_DONE_INTR_COUNT_INCR_R // 0xa10 Intr Event Count Incr }; - - + + // These address ranges (inclusive) in each extent have no definition extent_t _undefined_addr_ranges [$] = { - '{addr_min: SOCIFC_BASE + 16'h0104, addr_max: SOCIFC_BASE + 16'h01fc}, - '{addr_min: SOCIFC_BASE + 16'h0340, addr_max: SOCIFC_BASE + 16'h05fc}, - '{addr_min: SOCIFC_BASE + 16'h0630, addr_max: SOCIFC_BASE + 16'h07fc}, + '{addr_min: SOCIFC_BASE + 16'h0128, addr_max: SOCIFC_BASE + 16'h01fc}, + '{addr_min: SOCIFC_BASE + 16'h034c, addr_max: SOCIFC_BASE + 16'h05fc}, + '{addr_min: SOCIFC_BASE + 16'h0650, addr_max: SOCIFC_BASE + 16'h07fc}, '{addr_min: SOCIFC_BASE + 16'h0824, addr_max: SOCIFC_BASE + 16'h08fc}, '{addr_min: SOCIFC_BASE + 16'h0920, addr_max: SOCIFC_BASE + 16'h097c}, - '{addr_min: SOCIFC_BASE + 16'h0990, addr_max: SOCIFC_BASE + 16'h09fc} + '{addr_min: SOCIFC_BASE + 16'h0998, addr_max: SOCIFC_BASE + 16'h09fc} }; @@ -223,29 +278,48 @@ package soc_ifc_tb_pkg; "INTERNAL_FW_UPDATE_RESET_WAIT_CYCLES" : 32'h5, "CPTRA_HW_REV_ID" : 32'h1, "CPTRA_WDT_TIMER1_TIMEOUT_PERIOD" : 32'hffff_ffff, - "CPTRA_WDT_TIMER2_TIMEOUT_PERIOD" : 32'hffff_ffff + "CPTRA_WDT_TIMER2_TIMEOUT_PERIOD" : 32'hffff_ffff, + "CPTRA_FUSE_VALID_PAUSER" : 32'hffff_ffff }; // Sticky registers preserve values across warm reset -- groups of regs might be populated by code // mask of all bits to be protected in case of warm reset word_addr_t _sticky_register_prefix_dict [string] = { - "FUSE_": 32'hffff_ffff, - "CPTRA_HW_ERROR_": 32'hffff_ffff, // FATAL, NON_FATAL, ENC - "CPTRA_FW_ERROR_": 32'hffff_ffff, // FATAL, NON_FATAL, ENC - "CPTRA_FW_EXTENDED_ERROR_INFO": 32'hffff_ffff, - "CPTRA_RESET_REASON": 32'h2, // field WARM_RESET - "CPTRA_FUSE_WR_DONE": 32'h1, // field 0 - "CPTRA_TIMER_CONFIG": 32'hffff_ffff, - "INTR_BRF_ERROR_INTERNAL_INTR_R": 32'h3f, // fields 5:0 - "INTR_BRF_ERROR_INTERNAL_INTR_COUNT_R": 32'hffff_ffff, - "INTR_BRF_ERROR_INV_DEV_INTR_COUNT_R": 32'hffff_ffff, - "INTR_BRF_ERROR_CMD_FAIL_INTR_COUNT_R": 32'hffff_ffff, - "INTR_BRF_ERROR_BAD_FUSE_INTR_COUNT_R": 32'hffff_ffff, - "INTR_BRF_ERROR_ICCM_BLOCKED_INTR_COUNT_R": 32'hffff_ffff, - "INTR_BRF_ERROR_MBOX_ECC_UNC_INTR_COUNT_R": 32'hffff_ffff, - "INTR_BRF_ERROR_WDT_TIMER1_TIMEOUT_INTR_COUNT_R": 32'hffff_ffff, - "INTR_BRF_ERROR_WDT_TIMER2_TIMEOUT_INTR_COUNT_R": 32'hffff_ffff + "FUSE_UDS_SEED" : 32'hffff_ffff, + "FUSE_FIELD_ENTROPY" : 32'hffff_ffff, + "FUSE_KEY_MANIFEST_PK_HASH" : 32'hffff_ffff , + "FUSE_KEY_MANIFEST_PK_HASH_MASK" : 32'hf, // field 3:0 + "FUSE_OWNER_PK_HASH" : 32'hffff_ffff, + "FUSE_FMC_KEY_MANIFEST_SVN" : 32'hffff_ffff, + "FUSE_RUNTIME_SVN" : 32'hffff_ffff, + "FUSE_ANTI_ROLLBACK_DISABLE" : 32'h1, // field 0 + "FUSE_IDEVID_CERT_ATTR" : 32'hffff_ffff, + "FUSE_IDEVID_MANUF_HSM_ID" : 32'hffff_ffff, + "FUSE_LIFE_CYCLE" : 32'h3, // field 1:0 + "FUSE_LMS_VERIFY" : 32'h1, // field 0 + "FUSE_LMS_REVOCATION" : 32'hffff_ffff, + "FUSE_SOC_STEPPING_ID" : 32'hffff, // field 15:0 + "CPTRA_HW_ERROR_" : 32'hffff_ffff, // FATAL, NON_FATAL, ENC + "CPTRA_FW_ERROR_" : 32'hffff_ffff, // FATAL, NON_FATAL, ENC + "CPTRA_FW_EXTENDED_ERROR_INFO" : 32'hffff_ffff, + "CPTRA_RESET_REASON" : 32'h2, // field WARM_RESET + "CPTRA_FUSE_WR_DONE" : 32'h1, // field 0 + "CPTRA_HW_REV_ID" : 32'hffff_ffff, // field SOC_STEPPING_ID, CPTRA_GENERATION + "CPTRA_FUSE_VALID_PAUSER" : 32'hffff_ffff, + "CPTRA_FUSE_PAUSER_LOCK" : 32'h1, + "CPTRA_TIMER_CONFIG" : 32'hffff_ffff, + "CPTRA_WDT_CFG" : 32'hffff_ffff, + "INTERNAL_RV_MTIME" : 32'hffff_ffff, // for MTIME_L/H, MTIMECMP_L/H + "INTR_BRF_ERROR_INTERNAL_INTR_R" : 32'hff, // fields 5:0 + "INTR_BRF_ERROR_INTERNAL_INTR_COUNT_R" : 32'hffff_ffff, + "INTR_BRF_ERROR_INV_DEV_INTR_COUNT_R" : 32'hffff_ffff, + "INTR_BRF_ERROR_CMD_FAIL_INTR_COUNT_R" : 32'hffff_ffff, + "INTR_BRF_ERROR_BAD_FUSE_INTR_COUNT_R" : 32'hffff_ffff, + "INTR_BRF_ERROR_ICCM_BLOCKED_INTR_COUNT_R" : 32'hffff_ffff, + "INTR_BRF_ERROR_MBOX_ECC_UNC_INTR_COUNT_R" : 32'hffff_ffff, + "INTR_BRF_ERROR_WDT_TIMER1_TIMEOUT_INTR_COUNT_R" : 32'hffff_ffff, + "INTR_BRF_ERROR_WDT_TIMER2_TIMEOUT_INTR_COUNT_R" : 32'hffff_ffff }; @@ -254,44 +328,130 @@ package soc_ifc_tb_pkg; "CPTRA_HW_CONFIG" : (`SOC_IFC_REG_CPTRA_HW_CONFIG_ITRNG_EN_MASK | `SOC_IFC_REG_CPTRA_HW_CONFIG_QSPI_EN_MASK | `SOC_IFC_REG_CPTRA_HW_CONFIG_I3C_EN_MASK), - "FUSE_ANTI_ROLLBACK_DISABLE" : `SOC_IFC_REG_FUSE_ANTI_ROLLBACK_DISABLE_DIS_MASK, - "FUSE_KEY_MANIFEST_PK_HASH_MASK" : `SOC_IFC_REG_FUSE_KEY_MANIFEST_PK_HASH_MASK_MASK_MASK, - "FUSE_LIFE_CYCLE" : `SOC_IFC_REG_FUSE_LIFE_CYCLE_LIFE_CYCLE_MASK, - "CPTRA_FLOW_STATUS" : (`SOC_IFC_REG_CPTRA_FLOW_STATUS_STATUS_MASK | - `SOC_IFC_REG_CPTRA_FLOW_STATUS_READY_FOR_FW_MASK | - `SOC_IFC_REG_CPTRA_FLOW_STATUS_READY_FOR_RUNTIME_MASK | - `SOC_IFC_REG_CPTRA_FLOW_STATUS_MAILBOX_FLOW_DONE_MASK), + "CPTRA_FLOW_STATUS" : (`SOC_IFC_REG_CPTRA_FLOW_STATUS_STATUS_MASK | + `SOC_IFC_REG_CPTRA_FLOW_STATUS_IDEVID_CSR_READY_MASK | + //`SOC_IFC_REG_CPTRA_FLOW_STATUS_BOOT_FSM_PS_MASK | + `SOC_IFC_REG_CPTRA_FLOW_STATUS_READY_FOR_FW_MASK | + `SOC_IFC_REG_CPTRA_FLOW_STATUS_READY_FOR_RUNTIME_MASK | + //`SOC_IFC_REG_CPTRA_FLOW_STATUS_READY_FOR_FUSES_MASK | + `SOC_IFC_REG_CPTRA_FLOW_STATUS_MAILBOX_FLOW_DONE_MASK), "CPTRA_MBOX_PAUSER_LOCK" : `SOC_IFC_REG_CPTRA_MBOX_PAUSER_LOCK_0_LOCK_MASK, // same for all 5 pausers "CPTRA_TRNG_PAUSER_LOCK" : `SOC_IFC_REG_CPTRA_TRNG_PAUSER_LOCK_LOCK_MASK, + "CPTRA_TRNG_CTRL" : `SOC_IFC_REG_CPTRA_TRNG_CTRL_CLEAR_MASK, "CPTRA_TRNG_STATUS.APB" : `SOC_IFC_REG_CPTRA_TRNG_STATUS_DATA_WR_DONE_MASK, "CPTRA_TRNG_STATUS.AHB" : `SOC_IFC_REG_CPTRA_TRNG_STATUS_DATA_REQ_MASK, "CPTRA_FUSE_WR_DONE" : `SOC_IFC_REG_CPTRA_FUSE_WR_DONE_DONE_MASK, "CPTRA_BOOTFSM_GO" : `SOC_IFC_REG_CPTRA_BOOTFSM_GO_GO_MASK, - - "CPTRA_CLK_GATING_EN" : `SOC_IFC_REG_CPTRA_CLK_GATING_EN_CLK_GATING_EN_MASK , + "CPTRA_CLK_GATING_EN" : `SOC_IFC_REG_CPTRA_CLK_GATING_EN_CLK_GATING_EN_MASK, + "CPTRA_HW_REV_ID" : (`SOC_IFC_REG_CPTRA_HW_REV_ID_CPTRA_GENERATION_MASK | + `SOC_IFC_REG_CPTRA_HW_REV_ID_SOC_STEPPING_ID_MASK), "CPTRA_WDT_TIMER1_EN" : `SOC_IFC_REG_CPTRA_WDT_TIMER1_EN_TIMER1_EN_MASK, "CPTRA_WDT_TIMER1_CTRL" : `SOC_IFC_REG_CPTRA_WDT_TIMER1_CTRL_TIMER1_RESTART_MASK, "CPTRA_WDT_TIMER2_EN" : `SOC_IFC_REG_CPTRA_WDT_TIMER2_EN_TIMER2_EN_MASK, "CPTRA_WDT_TIMER2_CTRL" : `SOC_IFC_REG_CPTRA_WDT_TIMER2_CTRL_TIMER2_RESTART_MASK, "CPTRA_WDT_STATUS" : (`SOC_IFC_REG_CPTRA_WDT_STATUS_T1_TIMEOUT_MASK | - `SOC_IFC_REG_CPTRA_WDT_STATUS_T2_TIMEOUT_MASK), + `SOC_IFC_REG_CPTRA_WDT_STATUS_T2_TIMEOUT_MASK), + "CPTRA_FUSE_PAUSER_LOCK" : `SOC_IFC_REG_CPTRA_FUSE_PAUSER_LOCK_LOCK_MASK, + "FUSE_ANTI_ROLLBACK_DISABLE" : `SOC_IFC_REG_FUSE_ANTI_ROLLBACK_DISABLE_DIS_MASK, + "FUSE_KEY_MANIFEST_PK_HASH_MASK" : `SOC_IFC_REG_FUSE_KEY_MANIFEST_PK_HASH_MASK_MASK_MASK, + "FUSE_LIFE_CYCLE" : `SOC_IFC_REG_FUSE_LIFE_CYCLE_LIFE_CYCLE_MASK, + "FUSE_LMS_VERIFY" : `SOC_IFC_REG_FUSE_LMS_VERIFY_LMS_VERIFY_MASK, + "FUSE_SOC_STEPPING_ID" : `SOC_IFC_REG_FUSE_SOC_STEPPING_ID_SOC_STEPPING_ID_MASK, "INTERNAL_ICCM_LOCK" : `SOC_IFC_REG_INTERNAL_ICCM_LOCK_LOCK_MASK, - "INTERNAL_FW_UPDATE_RESET" : `SOC_IFC_REG_INTERNAL_FW_UPDATE_RESET_CORE_RST_MASK , + "INTERNAL_FW_UPDATE_RESET" : `SOC_IFC_REG_INTERNAL_FW_UPDATE_RESET_CORE_RST_MASK, "INTERNAL_FW_UPDATE_RESET_WAIT_CYCLES" : `SOC_IFC_REG_INTERNAL_FW_UPDATE_RESET_WAIT_CYCLES_WAIT_CYCLES_MASK, - "INTR_BRF_ERROR_INTERNAL_INTR_COUNT_INCR_R" : `SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_COUNT_INCR_R_PULSE_MASK , - "INTR_BRF_ERROR_INV_DEV_INTR_COUNT_INCR_R" : `SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INV_DEV_INTR_COUNT_INCR_R_PULSE_MASK , - "INTR_BRF_ERROR_CMD_FAIL_INTR_COUNT_INCR_R" : `SOC_IFC_REG_INTR_BLOCK_RF_ERROR_CMD_FAIL_INTR_COUNT_INCR_R_PULSE_MASK , - "INTR_BRF_ERROR_BAD_FUSE_INTR_COUNT_INCR_R" : `SOC_IFC_REG_INTR_BLOCK_RF_ERROR_BAD_FUSE_INTR_COUNT_INCR_R_PULSE_MASK , + "INTERNAL_HW_ERROR_FATAL_MASK" : (`SOC_IFC_REG_INTERNAL_HW_ERROR_FATAL_MASK_MASK_NMI_PIN_MASK | + `SOC_IFC_REG_INTERNAL_HW_ERROR_FATAL_MASK_MASK_DCCM_ECC_UNC_MASK | + `SOC_IFC_REG_INTERNAL_HW_ERROR_FATAL_MASK_MASK_ICCM_ECC_UNC_MASK), + "INTERNAL_HW_ERROR_NON_FATAL_MASK" : (`SOC_IFC_REG_INTERNAL_HW_ERROR_NON_FATAL_MASK_MASK_MBOX_PROT_NO_LOCK_MASK | + `SOC_IFC_REG_INTERNAL_HW_ERROR_NON_FATAL_MASK_MASK_MBOX_PROT_OOO_MASK | + `SOC_IFC_REG_INTERNAL_HW_ERROR_NON_FATAL_MASK_MASK_MBOX_ECC_UNC_MASK), + "INTR_BRF_GLOBAL_INTR_EN_R" : (`SOC_IFC_REG_INTR_BLOCK_RF_GLOBAL_INTR_EN_R_ERROR_EN_MASK | + `SOC_IFC_REG_INTR_BLOCK_RF_GLOBAL_INTR_EN_R_NOTIF_EN_MASK), + "INTR_BRF_ERROR_INTR_EN_R" : (`SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTR_EN_R_ERROR_INTERNAL_EN_MASK | + `SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTR_EN_R_ERROR_INV_DEV_EN_MASK | + `SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTR_EN_R_ERROR_CMD_FAIL_EN_MASK | + `SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTR_EN_R_ERROR_BAD_FUSE_EN_MASK | + `SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTR_EN_R_ERROR_ICCM_BLOCKED_EN_MASK | + `SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTR_EN_R_ERROR_MBOX_ECC_UNC_EN_MASK | + `SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTR_EN_R_ERROR_WDT_TIMER1_TIMEOUT_EN_MASK | + `SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTR_EN_R_ERROR_WDT_TIMER2_TIMEOUT_EN_MASK ), + "INTR_BRF_NOTIF_INTR_EN_R" : (`SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTR_EN_R_NOTIF_CMD_AVAIL_EN_MASK | + `SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTR_EN_R_NOTIF_MBOX_ECC_COR_EN_MASK | + `SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTR_EN_R_NOTIF_DEBUG_LOCKED_EN_MASK | + `SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTR_EN_R_NOTIF_SCAN_MODE_EN_MASK | + `SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTR_EN_R_NOTIF_SOC_REQ_LOCK_EN_MASK | + `SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTR_EN_R_NOTIF_GEN_IN_TOGGLE_EN_MASK ), + "INTR_BRF_ERROR_GLOBAL_INTR_R" : `SOC_IFC_REG_INTR_BLOCK_RF_ERROR_GLOBAL_INTR_R_AGG_STS_MASK, + "INTR_BRF_NOTIF_GLOBAL_INTR_R" : `SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_GLOBAL_INTR_R_AGG_STS_MASK, + "INTR_BRF_ERROR_INTERNAL_INTR_R": (`SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_INTERNAL_STS_MASK | + `SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_INV_DEV_STS_MASK | + `SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_CMD_FAIL_STS_MASK | + `SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_BAD_FUSE_STS_MASK | + `SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_ICCM_BLOCKED_STS_MASK | + `SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_MBOX_ECC_UNC_STS_MASK | + `SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_WDT_TIMER1_TIMEOUT_STS_MASK | + `SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_WDT_TIMER2_TIMEOUT_STS_MASK ), + "INTR_BRF_NOTIF_INTERNAL_INTR_R": (`SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_AVAIL_STS_MASK | + `SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_MBOX_ECC_COR_STS_MASK | + `SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_DEBUG_LOCKED_STS_MASK | + `SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_SCAN_MODE_STS_MASK | + `SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_SOC_REQ_LOCK_STS_MASK | + `SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_GEN_IN_TOGGLE_STS_MASK ), + "INTR_BRF_ERROR_INTR_TRIG_R": (`SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTR_TRIG_R_ERROR_INTERNAL_TRIG_MASK | + `SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTR_TRIG_R_ERROR_INV_DEV_TRIG_MASK | + `SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTR_TRIG_R_ERROR_CMD_FAIL_TRIG_MASK | + `SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTR_TRIG_R_ERROR_BAD_FUSE_TRIG_MASK | + `SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTR_TRIG_R_ERROR_ICCM_BLOCKED_TRIG_MASK | + `SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTR_TRIG_R_ERROR_MBOX_ECC_UNC_TRIG_MASK | + `SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTR_TRIG_R_ERROR_WDT_TIMER1_TIMEOUT_TRIG_MASK | + `SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTR_TRIG_R_ERROR_WDT_TIMER2_TIMEOUT_TRIG_MASK ), + "INTR_BRF_NOTIF_INTR_TRIG_R": (`SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTR_TRIG_R_NOTIF_CMD_AVAIL_TRIG_MASK | + `SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTR_TRIG_R_NOTIF_MBOX_ECC_COR_TRIG_MASK | + `SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTR_TRIG_R_NOTIF_DEBUG_LOCKED_TRIG_MASK | + `SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTR_TRIG_R_NOTIF_SCAN_MODE_TRIG_MASK | + `SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTR_TRIG_R_NOTIF_SOC_REQ_LOCK_TRIG_MASK | + `SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTR_TRIG_R_NOTIF_GEN_IN_TOGGLE_TRIG_MASK ), + "INTR_BRF_ERROR_INTERNAL_INTR_COUNT_INCR_R" : `SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_COUNT_INCR_R_PULSE_MASK, + "INTR_BRF_ERROR_INV_DEV_INTR_COUNT_INCR_R" : `SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INV_DEV_INTR_COUNT_INCR_R_PULSE_MASK, + "INTR_BRF_ERROR_CMD_FAIL_INTR_COUNT_INCR_R" : `SOC_IFC_REG_INTR_BLOCK_RF_ERROR_CMD_FAIL_INTR_COUNT_INCR_R_PULSE_MASK, + "INTR_BRF_ERROR_BAD_FUSE_INTR_COUNT_INCR_R" : `SOC_IFC_REG_INTR_BLOCK_RF_ERROR_BAD_FUSE_INTR_COUNT_INCR_R_PULSE_MASK, "INTR_BRF_ERROR_ICCM_BLOCKED_INTR_COUNT_INCR_R" : `SOC_IFC_REG_INTR_BLOCK_RF_ERROR_ICCM_BLOCKED_INTR_COUNT_INCR_R_PULSE_MASK, "INTR_BRF_ERROR_MBOX_ECC_UNC_INTR_COUNT_INCR_R" : `SOC_IFC_REG_INTR_BLOCK_RF_ERROR_MBOX_ECC_UNC_INTR_COUNT_INCR_R_PULSE_MASK, "INTR_BRF_ERROR_WDT_TIMER1_TIMEOUT_INTR_COUNT_INCR_R" : `SOC_IFC_REG_INTR_BLOCK_RF_ERROR_WDT_TIMER1_TIMEOUT_INTR_COUNT_INCR_R_PULSE_MASK, "INTR_BRF_ERROR_WDT_TIMER2_TIMEOUT_INTR_COUNT_INCR_R" : `SOC_IFC_REG_INTR_BLOCK_RF_ERROR_WDT_TIMER2_TIMEOUT_INTR_COUNT_INCR_R_PULSE_MASK, - "INTR_BRF_NOTIF_CMD_AVAIL_INTR_COUNT_INCR_R" : `SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_CMD_AVAIL_INTR_COUNT_INCR_R_PULSE_MASK , + "INTR_BRF_NOTIF_CMD_AVAIL_INTR_COUNT_INCR_R" : `SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_CMD_AVAIL_INTR_COUNT_INCR_R_PULSE_MASK, "INTR_BRF_NOTIF_MBOX_ECC_COR_INTR_COUNT_INCR_R" : `SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_MBOX_ECC_COR_INTR_COUNT_INCR_R_PULSE_MASK, "INTR_BRF_NOTIF_DEBUG_LOCKED_INTR_COUNT_INCR_R" : `SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_DEBUG_LOCKED_INTR_COUNT_INCR_R_PULSE_MASK, - "INTR_BRF_NOTIF_SOC_REQ_LOCK_INTR_COUNT_INCR_R" : `SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_SOC_REQ_LOCK_INTR_COUNT_INCR_R_PULSE_MASK + "INTR_BRF_NOTIF_SOC_REQ_LOCK_INTR_COUNT_INCR_R" : `SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_SOC_REQ_LOCK_INTR_COUNT_INCR_R_PULSE_MASK, + // SHA Accelerator Interrupt Block Registers + "SHA_ACC_INTR_BRF_GLOBAL_INTR_EN_R" :(`SHA512_ACC_CSR_INTR_BLOCK_RF_GLOBAL_INTR_EN_R_ERROR_EN_MASK | + `SHA512_ACC_CSR_INTR_BLOCK_RF_GLOBAL_INTR_EN_R_NOTIF_EN_MASK ), + "SHA_ACC_INTR_BRF_ERROR_INTR_EN_R" :(`SHA512_ACC_CSR_INTR_BLOCK_RF_ERROR_INTR_EN_R_ERROR0_EN_MASK | + `SHA512_ACC_CSR_INTR_BLOCK_RF_ERROR_INTR_EN_R_ERROR1_EN_MASK | + `SHA512_ACC_CSR_INTR_BLOCK_RF_ERROR_INTR_EN_R_ERROR2_EN_MASK | + `SHA512_ACC_CSR_INTR_BLOCK_RF_ERROR_INTR_EN_R_ERROR3_EN_MASK ), + "SHA_ACC_INTR_BRF_NOTIF_INTR_EN_R" : `SHA512_ACC_CSR_INTR_BLOCK_RF_NOTIF_INTR_EN_R_NOTIF_CMD_DONE_EN_MASK, + "SHA_ACC_INTR_BRF_ERROR_GLOBAL_INTR_R" : `SHA512_ACC_CSR_INTR_BLOCK_RF_ERROR_GLOBAL_INTR_R_AGG_STS_MASK, + "SHA_ACC_INTR_BRF_NOTIF_GLOBAL_INTR_R" : `SHA512_ACC_CSR_INTR_BLOCK_RF_NOTIF_GLOBAL_INTR_R_AGG_STS_MASK, + "SHA_ACC_INTR_BRF_ERROR_INTERNAL_INTR_R" :(`SHA512_ACC_CSR_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR0_STS_MASK | + `SHA512_ACC_CSR_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR1_STS_MASK | + `SHA512_ACC_CSR_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR2_STS_MASK | + `SHA512_ACC_CSR_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR3_STS_MASK ), + "SHA_ACC_INTR_BRF_NOTIF_INTERNAL_INTR_R" : `SHA512_ACC_CSR_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_CMD_DONE_STS_MASK, + "SHA_ACC_INTR_BRF_ERROR_INTR_TRIG_R" :(`SHA512_ACC_CSR_INTR_BLOCK_RF_ERROR_INTR_TRIG_R_ERROR0_TRIG_MASK | + `SHA512_ACC_CSR_INTR_BLOCK_RF_ERROR_INTR_TRIG_R_ERROR1_TRIG_MASK | + `SHA512_ACC_CSR_INTR_BLOCK_RF_ERROR_INTR_TRIG_R_ERROR2_TRIG_MASK | + `SHA512_ACC_CSR_INTR_BLOCK_RF_ERROR_INTR_TRIG_R_ERROR3_TRIG_MASK ), + "SHA_ACC_INTR_BRF_NOTIF_INTR_TRIG_R" : `SHA512_ACC_CSR_INTR_BLOCK_RF_NOTIF_INTR_TRIG_R_NOTIF_CMD_DONE_TRIG_MASK, + "SHA_ACC_INTR_BRF_ERROR0_INTR_COUNT_INCR_R" : `SHA512_ACC_CSR_INTR_BLOCK_RF_ERROR0_INTR_COUNT_INCR_R_PULSE_MASK, + "SHA_ACC_INTR_BRF_ERROR1_INTR_COUNT_INCR_R" : `SHA512_ACC_CSR_INTR_BLOCK_RF_ERROR1_INTR_COUNT_INCR_R_PULSE_MASK, + "SHA_ACC_INTR_BRF_ERROR2_INTR_COUNT_INCR_R" : `SHA512_ACC_CSR_INTR_BLOCK_RF_ERROR2_INTR_COUNT_INCR_R_PULSE_MASK, + "SHA_ACC_INTR_BRF_ERROR3_INTR_COUNT_INCR_R" : `SHA512_ACC_CSR_INTR_BLOCK_RF_ERROR3_INTR_COUNT_INCR_R_PULSE_MASK, + "SHA_ACC_INTR_BRF_NOTIF_CMD_DONE_INTR_COUNT_INCR_R": `SHA512_ACC_CSR_INTR_BLOCK_RF_NOTIF_CMD_DONE_INTR_COUNT_INCR_R_PULSE_MASK }; + // holds addr -> name inverse map of _soc_register_dict - populated by SocRegisters instantiation string _imap_soc_register_dict [word_addr_t]; @@ -312,7 +472,8 @@ package soc_ifc_tb_pkg; "INTR_BRF_NOTIF_CMD_AVAIL_INTR_COUNT_INCR_R" , "INTR_BRF_NOTIF_MBOX_ECC_COR_INTR_COUNT_INCR_R" , "INTR_BRF_NOTIF_DEBUG_LOCKED_INTR_COUNT_INCR_R" , - "INTR_BRF_NOTIF_SOC_REQ_LOCK_INTR_COUNT_INCR_R" + "INTR_BRF_NOTIF_SOC_REQ_LOCK_INTR_COUNT_INCR_R" + // "INTR_BRF_NOTIF_GEN_IN_TOGGLE_INTR_COUNT_R" // TODO. Check for saturation! }; @@ -327,7 +488,7 @@ package soc_ifc_tb_pkg; else return -1; - endfunction + endfunction // get_ss_code function string get_ss_name(input int ss_code); @@ -340,22 +501,21 @@ package soc_ifc_tb_pkg; end return ""; - endfunction + endfunction // get_ss_name function dword_t get_mask(string addr_name); return _soc_register_mask_dict.exists(addr_name) ? _soc_register_mask_dict[addr_name] : 32'hffff_ffff; - endfunction - + endfunction // get_mask function dword_t get_initval(string addr_name); return _soc_register_initval_dict.exists(addr_name) ? _soc_register_initval_dict[addr_name] : '0; - endfunction + endfunction // get_initval function void set_initval(string addr_name, dword_t value); @@ -366,11 +526,11 @@ package soc_ifc_tb_pkg; $display("TB INFO. Adding new register init value for %s with value 0x%08x", addr_name, value); _soc_register_initval_dict[addr_name] = value; - endfunction + endfunction // set_initval // Needs RMW of register without APB or AHB writes - function dword_t update_CPTRA_SECURITY_STATE(logic scan_mode, logic debug_state, logic [1:0] lifecycle); + function automatic dword_t update_CPTRA_SECURITY_STATE(logic scan_mode, logic debug_state, logic [1:0] lifecycle); begin update_exp_regval("CPTRA_SECURITY_STATE", @@ -383,34 +543,61 @@ package soc_ifc_tb_pkg; return _exp_register_data_dict["CPTRA_SECURITY_STATE"]; end - endfunction + endfunction // update_CPTRA_SECURITY_STATE + + + // Can update only 1 GENERIC_INPUT_WIRE bus at a time + function automatic dword_t update_CPTRA_GENERIC_INPUT_WIRES(logic [31:0] generic_wires, bit upper); + + begin + if (upper) begin + update_exp_regval("CPTRA_GENERIC_INPUT_WIRES1", generic_wires, SET_DIRECT); + $display ("TB INFO. CPTRA_GENERIC_INPUT_WIRES1 changed to 0x%08x", _exp_register_data_dict["CPTRA_GENERIC_INPUT_WIRES1"]); + return _exp_register_data_dict["CPTRA_GENERIC_INPUT_WIRES1"]; + end else begin + update_exp_regval("CPTRA_GENERIC_INPUT_WIRES0", generic_wires, SET_DIRECT); + $display ("TB INFO. CPTRA_GENERIC_INPUT_WIRES0 changed to 0x%08x", _exp_register_data_dict["CPTRA_GENERIC_INPUT_WIRES0"]); + return _exp_register_data_dict["CPTRA_GENERIC_INPUT_WIRES0"]; + end + end + + endfunction // update_CPTRA_GENERIC_INPUT_WIRES // Needs RMW of register without APB or AHB writes - function logic [63:0] update_CPTRA_GENERIC_INPUT_WIRES(logic [31:0] wires1, logic [31:0] wires0); + function automatic logic [31:0] update_INTR_BRF_NOTIF_INTERNAL_INTR_R(logic gen_input_wire_toggle, logic debug_locked); + + dword_t tmp_data; begin - update_exp_regval("CPTRA_GENERIC_INPUT_WIRES0", wires0, SET_DIRECT); - update_exp_regval("CPTRA_GENERIC_INPUT_WIRES1", wires1, SET_DIRECT); - $display ("TB INFO. Fields for CPTRA_GENERIC_INPUT_WIRES0 changed to 0x%08x", _exp_register_data_dict["CPTRA_GENERIC_INPUT_WIRES0"]); - $display ("TB INFO. Fields for CPTRA_GENERIC_INPUT_WIRES1 changed to 0x%08x", _exp_register_data_dict["CPTRA_GENERIC_INPUT_WIRES1"]); - return {_exp_register_data_dict["CPTRA_GENERIC_INPUT_WIRES1"], _exp_register_data_dict["CPTRA_GENERIC_INPUT_WIRES0"]}; - end + tmp_data = _exp_register_data_dict["INTR_BRF_NOTIF_INTERNAL_INTR_R"]; + // tmp_data = tmp_data & (32'hffff_ffff ^ `SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_DEBUG_LOCKED_STS_MASK) + // & (32'hffff_ffff ^ `SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_GEN_IN_TOGGLE_STS_MASK); + tmp_data = tmp_data | mask_shifted(debug_locked, `SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_DEBUG_LOCKED_STS_MASK) + | mask_shifted(gen_input_wire_toggle, `SOC_IFC_REG_INTR_BLOCK_RF_NOTIF_INTERNAL_INTR_R_NOTIF_GEN_IN_TOGGLE_STS_MASK); + update_exp_regval("INTR_BRF_NOTIF_INTERNAL_INTR_R", tmp_data, SET_DIRECT); - endfunction + $display( "TB INFO. Updated expected value of INTR_BRF_NOTIF_INTERNAL_INTR_R = 0x%08x", _exp_register_data_dict["INTR_BRF_NOTIF_INTERNAL_INTR_R"]); + return _exp_register_data_dict["INTR_BRF_NOTIF_INTERNAL_INTR_R"]; + end + + endfunction // update_INTR_BRF_NOTIF_INTERNAL_INTR_R // Needs RMW of register without APB or AHB writes - function dword_t update_CPTRA_FLOW_STATUS(int fuse_ready_val); + function automatic dword_t update_CPTRA_FLOW_STATUS(int fuse_ready_val, logic [2:0] boot_fsm_ps); dword_t tmp_data; begin - tmp_data = _exp_register_data_dict["CPTRA_FLOW_STATUS"]; + + tmp_data = _exp_register_data_dict["CPTRA_FLOW_STATUS"]; // then preserve read-only bit fields per masks tmp_data = tmp_data & (32'hffff_ffff ^ `SOC_IFC_REG_CPTRA_FLOW_STATUS_READY_FOR_FUSES_MASK); tmp_data = tmp_data | mask_shifted(fuse_ready_val, `SOC_IFC_REG_CPTRA_FLOW_STATUS_READY_FOR_FUSES_MASK); - // $display( "TB INFO. update_CPTRA_FLOW_STATUS(%d) at time %t. new tmp_data = 0x%08x", fuse_ready_val, $realtime, tmp_data); + tmp_data = tmp_data & (32'hffff_ffff ^ `SOC_IFC_REG_CPTRA_FLOW_STATUS_BOOT_FSM_PS_MASK); + tmp_data = tmp_data | mask_shifted(boot_fsm_ps, `SOC_IFC_REG_CPTRA_FLOW_STATUS_BOOT_FSM_PS_MASK); + // $display( "TB DEBUG. update_CPTRA_FLOW_STATUS(%x, %x) at time %t. new tmp_data = 0x%08x", fuse_ready_val, boot_fsm_ps, $realtime, tmp_data); update_exp_regval("CPTRA_FLOW_STATUS", tmp_data, SET_DIRECT); @@ -418,11 +605,11 @@ package soc_ifc_tb_pkg; return _exp_register_data_dict["CPTRA_FLOW_STATUS"]; end - endfunction + endfunction // update_CPTRA_FLOW_STATUS // Needs RMW of register without APB or AHB writes - function dword_t update_CPTRA_RESET_REASON(int wrm_rst, int fw_upd); + function automatic dword_t update_CPTRA_RESET_REASON(int wrm_rst, int fw_upd); begin update_exp_regval("CPTRA_RESET_REASON", @@ -434,7 +621,7 @@ package soc_ifc_tb_pkg; return _exp_register_data_dict["CPTRA_RESET_REASON"]; end - endfunction + endfunction // update_CPTRA_RESET_REASON function void update_exp_regval(string addr_name, dword_t indata, access_t modify); @@ -451,12 +638,12 @@ package soc_ifc_tb_pkg; dword_t sscode; dword_t tmp_data; + dword_t mask; begin addr = _soc_register_dict[addr_name]; sscode = _soc_register_initval_dict["CPTRA_SECURITY_STATE"]; - // _exp_update_time = $realtime; if (modify == COLD_RESET) begin reset_exp_data(); @@ -473,14 +660,14 @@ package soc_ifc_tb_pkg; return; end - addr_name = _imap_soc_register_dict[addr]; - // With direct modification responsibility is on caller to ensure mask fields are respected!! if (modify == SET_DIRECT) begin _exp_register_data_dict[addr_name] = indata; if ((addr_name == "INTERNAL_FW_UPDATE_RESET") & (indata[0] == 1'b1)) begin - _exp_register_data_dict["INTERNAL_ICCM_LOCK"] = '0; - $display ("TB INFO: Cross modification - Writing '1' to INTERNAL_FW_UPDATE_RESET also reset INTERNAL_ICCM_LOCK"); + // NOTE. The expected value of INTERNAL_ICCM_LOCK must be updated outside of package, or at least outside of + // a function call since there could be a significant delay + // _exp_register_data_dict["INTERNAL_ICCM_LOCK"] = '0; + // $display ("TB INFO: Cross modification - Writing '1' to INTERNAL_FW_UPDATE_RESET also reset INTERNAL_ICCM_LOCK"); tmp_data = _exp_register_data_dict["CPTRA_RESET_REASON"]; tmp_data = tmp_data & (32'hffff_ffff ^ `SOC_IFC_REG_CPTRA_RESET_REASON_FW_UPD_RESET_MASK) | @@ -513,7 +700,17 @@ package soc_ifc_tb_pkg; end else if ((str_startswith(addr_name, "FUSE_UDS_SEED")) || (str_startswith(addr_name, "FUSE_FIELD_ENTROPY"))) exp_data = '0; // not accessible over APB or AHB - else if (str_startswith(addr_name, "FUSE_")) + else if (addr_name == "FUSE_SOC_STEPPING_ID") begin // Normal fuse register operation + cross modification of register + exp_data = fuses_locked ? curr_data : (ahb_rodata | apb_indata & get_mask(addr_name)); // ahb-RO + $display ("TB INFO: Cross modification - Updating FUSE_SOC_STEPPING_ID also updates CPTRA_HW_REV_ID"); + + tmp_data = _exp_register_data_dict["CPTRA_HW_REV_ID"] & + mask_shifted(16'hffff, `SOC_IFC_REG_CPTRA_HW_REV_ID_CPTRA_GENERATION_MASK); // pick out cptra_generation + _exp_register_data_dict["CPTRA_HW_REV_ID"] = + mask_shifted(tmp_data, `SOC_IFC_REG_CPTRA_HW_REV_ID_CPTRA_GENERATION_MASK) | // add back cptra_generation + mask_shifted(exp_data, `SOC_IFC_REG_CPTRA_HW_REV_ID_SOC_STEPPING_ID_MASK); // and new stepping_id + + end else if (str_startswith(addr_name, "FUSE_")) exp_data = fuses_locked ? curr_data : (ahb_rodata | apb_indata & get_mask(addr_name)); // ahb-RO else if (str_startswith(addr_name, "CPTRA_MBOX_VALID_PAUSER")) begin // find equivalent pauser lock & if set, apb-RO @@ -537,25 +734,64 @@ package soc_ifc_tb_pkg; else if (str_startswith(addr_name, "CPTRA_HW_CONFIG")) exp_data = curr_data & get_mask("CPTRA_HW_CONFIG"); // all bits are RO - else if (str_startswith(addr_name, "CPTRA_WDT_TIMER1_TIMEOUT_PERIOD")) - exp_data = ahb_indata | apb_rodata; - - else if (str_startswith(addr_name, "CPTRA_WDT_TIMER2_TIMEOUT_PERIOD")) + else if (str_startswith(addr_name, "CPTRA_WDT_TIMER1_TIMEOUT_PERIOD") || + str_startswith(addr_name, "CPTRA_WDT_TIMER2_TIMEOUT_PERIOD")) exp_data = ahb_indata | apb_rodata; else if (str_startswith(addr_name, "INTERNAL_OBF_KEY")) exp_data = '0; // not accessible over APB or AHB - else if (str_startswith(addr_name, "INTR_BRF_")) - exp_data = ahb_indata & get_mask(addr_name) | apb_rodata; + else if (str_startswith(addr_name, "SHA_ACC_INTR_BRF")) + if (str_endswith(addr_name, "INCR_R")) + exp_data = ahb_rodata | apb_rodata; + else if ((addr_name == "SHA_ACC_INTR_BRF_ERROR_GLOBAL_INTR_R") || (addr_name == "SHA_ACC_INTR_BRF_NOTIF_GLOBAL_INTR_R")) + exp_data = ahb_rodata | apb_rodata; + else + exp_data = ahb_indata & get_mask(addr_name) | apb_rodata; + + else if (str_startswith(addr_name, "INTR_BRF_")) begin // Interrupt block has its own sub-cases + + if (is_pulsed_reg(addr_name)) begin + exp_data = '0; + + end else begin + case (addr_name) + + "INTR_BRF_ERROR_GLOBAL_INTR_R":exp_data = ahb_rodata | apb_rodata; // set by HW + "INTR_BRF_NOTIF_GLOBAL_INTR_R":exp_data = ahb_rodata | apb_rodata; // set by HW + "INTR_BRF_ERROR_INTR_TRIG_R": exp_data = ((ahb_indata & get_mask(addr_name)) != 0) ? '0: apb_rodata; // TODO. Pulsed reg + "INTR_BRF_NOTIF_INTR_TRIG_R": exp_data = ((ahb_indata & get_mask(addr_name)) != 0) ? '0: apb_rodata; // TODO. Pulsed reg + "INTR_BRF_ERROR_INTERNAL_INTR_R": exp_data = apb_rodata | (~(ahb_indata & get_mask(addr_name)) & curr_data); + "INTR_BRF_NOTIF_INTERNAL_INTR_R": exp_data = apb_rodata | (~(ahb_indata & get_mask(addr_name)) & curr_data); + + default: exp_data = ahb_indata & get_mask(addr_name) | apb_rodata; + + endcase + + end - else begin + end else begin case (addr_name) + + "CPTRA_HW_ERROR_FATAL", "CPTRA_HW_ERROR_NON_FATAL": begin + exp_data = ahb_indata | apb_indata; + exp_data = '0; // write-one to clear -- effectively always 0 + end - "CPTRA_FLOW_STATUS" : exp_data = ahb_indata & get_mask(addr_name) | apb_rodata; // 32'hbfff_ffff; // apb-RO - "CPTRA_RESET_REASON" : exp_data = ahb_rodata | apb_rodata; // bit 1:0 is RO - "CPTRA_SECURITY_STATE" : exp_data = curr_data & get_mask(addr_name); // & sscode; // bit 3:0 is RO + "CPTRA_FLOW_STATUS" : begin + if (modify == SET_APB) // apb-RO + exp_data = apb_rodata; + else if (modify == SET_AHB) begin // some fields are ro + mask = get_mask(addr_name); + exp_data = (mask & ahb_indata) | (~mask & curr_data); + // $display ("TB DEBUG: for CPTRA_FLOW_STATUS ahb_indata = 0x%08x, curr_data = 0x%08x, exp_data = 0x%08x", + // ahb_indata, curr_data, exp_data); + end + end + + "CPTRA_RESET_REASON" : exp_data = ahb_rodata | apb_rodata; // bit 1:0 is RO + "CPTRA_SECURITY_STATE" : exp_data = curr_data & get_mask(addr_name); // & sscode; // bit 3:0 is RO "CPTRA_TRNG_VALID_PAUSER" : begin // find equivalent pauser lock & if set, apb-RO pauser_locked = _exp_register_data_dict["CPTRA_TRNG_PAUSER_LOCK"]; @@ -564,10 +800,12 @@ package soc_ifc_tb_pkg; "CPTRA_TRNG_PAUSER_LOCK": begin lock_mask = get_mask(addr_name); - pauser_locked = curr_data & get_mask(addr_name); // FIXME. Is it? + pauser_locked = curr_data & get_mask(addr_name); // TODO. TRNG registers may need exclusion exp_data = pauser_locked ? curr_data & lock_mask : (ahb_indata | apb_indata) & lock_mask; end + "CPTRA_TRNG_CTRL" : exp_data = apb_rodata; // pulsed w/ahb + "CPTRA_TRNG_STATUS": begin // WR_DONE REQ dword_t ahb_mask = get_mask("CPTRA_TRNG_STATUS.AHB"); dword_t apb_mask = get_mask("CPTRA_TRNG_STATUS.APB"); @@ -575,16 +813,27 @@ package soc_ifc_tb_pkg; (apb_rodata & ~apb_mask | apb_indata & apb_mask) ; // SOC Access: RW RO end - "CPTRA_HW_REV_ID" : exp_data = curr_data; - "CPTRA_WDT_TIMER1_EN" : exp_data = ahb_indata & get_mask(addr_name) | apb_rodata; - "CPTRA_WDT_TIMER1_CTRL" : exp_data = ahb_indata & get_mask(addr_name) | apb_rodata; - "CPTRA_WDT_TIMER2_EN" : exp_data = ahb_indata & get_mask(addr_name) | apb_rodata; - "CPTRA_WDT_TIMER2_CTRL" : exp_data = ahb_indata & get_mask(addr_name) | apb_rodata; - "CPTRA_WDT_STATUS" : exp_data = curr_data; - "CPTRA_FUSE_WR_DONE" : exp_data = fuses_locked ? curr_data : (ahb_rodata | apb_indata & get_mask(addr_name)); - "CPTRA_BOOTFSM_GO" : exp_data = ahb_rodata | apb_indata & get_mask(addr_name) ; - "CPTRA_BOOT_STATUS" : exp_data = ahb_indata | apb_rodata; - "CPTRA_CLK_GATING_EN" : exp_data = ahb_rodata | apb_indata & get_mask(addr_name) ; + "CPTRA_HW_REV_ID" : exp_data = curr_data; + "CPTRA_WDT_TIMER1_EN" : exp_data = ahb_indata & get_mask(addr_name) | apb_rodata; + "CPTRA_WDT_TIMER1_CTRL" : exp_data = ((ahb_indata & get_mask(addr_name)) != 0) ? '0: apb_rodata; // TODO. Pulsed reg + "CPTRA_WDT_TIMER2_EN" : exp_data = ahb_indata & get_mask(addr_name) | apb_rodata; + "CPTRA_WDT_TIMER2_CTRL" : exp_data = ((ahb_indata & get_mask(addr_name)) != 0) ? '0: apb_rodata; // TODO. Pulsed reg + "CPTRA_WDT_STATUS" : exp_data = curr_data; + "CPTRA_FUSE_WR_DONE" : exp_data = fuses_locked ? curr_data : (ahb_rodata | apb_indata & get_mask(addr_name)); + "CPTRA_BOOTFSM_GO" : exp_data = ahb_rodata | apb_indata & get_mask(addr_name) ; + "CPTRA_BOOT_STATUS" : exp_data = ahb_indata | apb_rodata; + "CPTRA_CLK_GATING_EN" : exp_data = ahb_rodata | apb_indata & get_mask(addr_name) ; + + "CPTRA_FUSE_VALID_PAUSER" : begin // find equivalent pauser lock & if set, apb-RO + pauser_locked = _exp_register_data_dict["CPTRA_FUSE_PAUSER_LOCK"]; + exp_data = pauser_locked ? curr_data : (ahb_indata | apb_indata); + end + + "CPTRA_FUSE_PAUSER_LOCK": begin + lock_mask = get_mask(addr_name); + pauser_locked = curr_data & get_mask(addr_name); + exp_data = pauser_locked ? curr_data & lock_mask : (ahb_indata | apb_indata) & lock_mask; + end "INTERNAL_ICCM_LOCK" : begin iccm_locked = curr_data & get_mask(addr_name); @@ -594,22 +843,31 @@ package soc_ifc_tb_pkg; "INTERNAL_FW_UPDATE_RESET" : begin exp_data = ahb_indata & get_mask(addr_name) | apb_rodata; - $display ("TB DEBUG: ahb_indata = 0x%x and exp_data for INTERNAL_FW_UPDATE_RESET = 0x%x", ahb_indata, exp_data); - //TODO. Remove hardcoded fields and use bit masks instead - if (exp_data[0]) begin - _exp_register_data_dict["INTERNAL_ICCM_LOCK"] = '0; - $display ("TB INFO: Cross modification - Writing '1' to INTERNAL_FW_UPDATE_RESET also reset INTERNAL_ICCM_LOCK"); + // $display ("TB DEBUG: ahb_indata = 0x%x and exp_data for INTERNAL_FW_UPDATE_RESET = 0x%x", ahb_indata, exp_data); + if (exp_data[0]) begin // write-one to clear + // NOTE. The expected value of INTERNAL_ICCM_LOCK must be updated outside of package, or at least outside of + // a function call since there could be a significant delay + // _exp_register_data_dict["INTERNAL_ICCM_LOCK"] = '0; + // $display ("TB INFO: Cross modification - Writing '1' to INTERNAL_FW_UPDATE_RESET also reset INTERNAL_ICCM_LOCK"); - _exp_register_data_dict["CPTRA_RESET_REASON"] = 32'h1; //FIXME. Ignoring warm reset for now + _exp_register_data_dict["CPTRA_RESET_REASON"] = 32'h1; //TODO. Ignoring warm reset for now $display ("-- CPTRA_RESET_REASON is now %d", _exp_register_data_dict["CPTRA_RESET_REASON"]); $display ("TB INFO: Cross modification - Writing '1' to INTERNAL_FW_UPDATE_RESET also sets CPTRA_RESET_REASON"); end end - "INTERNAL_FW_UPDATE_RESET_WAIT_CYCLES" : exp_data = ahb_indata & get_mask(addr_name) | apb_rodata; - "INTERNAL_NMI_VECTOR" : exp_data = ahb_indata | apb_rodata; + "INTERNAL_FW_UPDATE_RESET_WAIT_CYCLES" : exp_data = ahb_indata & get_mask(addr_name) | apb_rodata; + "INTERNAL_NMI_VECTOR" : exp_data = ahb_indata | apb_rodata; + "INTERNAL_HW_ERROR_FATAL_MASK" : exp_data = ahb_indata & get_mask(addr_name) | apb_rodata; + "INTERNAL_HW_ERROR_NON_FATAL_MASK" : exp_data = ahb_indata & get_mask(addr_name) | apb_rodata; + "INTERNAL_FW_ERROR_FATAL_MASK" : exp_data = ahb_indata | apb_rodata; + "INTERNAL_FW_ERROR_NON_FATAL_MASK" : exp_data = ahb_indata | apb_rodata; + "INTERNAL_RV_MTIME_L" : exp_data = ahb_indata | apb_rodata; + "INTERNAL_RV_MTIME_H" : exp_data = ahb_indata | apb_rodata; + "INTERNAL_RV_MTIMECMP_L" : exp_data = ahb_indata | apb_rodata; + "INTERNAL_RV_MTIMECMP_H" : exp_data = ahb_indata | apb_rodata; - default: exp_data = indata; + default: exp_data = indata & get_mask(addr_name); endcase @@ -621,7 +879,7 @@ package soc_ifc_tb_pkg; endfunction // update_exp_regval - function strq_t get_soc_regnames(); + function automatic strq_t get_soc_regnames(); strq_t soc_regs; @@ -631,10 +889,10 @@ package soc_ifc_tb_pkg; return soc_regs; - endfunction + endfunction // get_soc_regnames - function strq_t get_fuse_regnames(); + function automatic strq_t get_fuse_regnames(); strq_t fuse_regs; @@ -645,24 +903,52 @@ package soc_ifc_tb_pkg; return fuse_regs; - endfunction + endfunction // get_fuse_regnames - function strq_t get_intr_block_regnames(); + function automatic strq_t get_intrblk_regnames(); strq_t intr_regs; foreach (_soc_register_dict[rkey]) begin - if (rkey.substr(0,7) == "INTR_BRF") + if (str_startswith(rkey, "INTR_BRF")) intr_regs.push_back(rkey); end return intr_regs; - endfunction + endfunction // get_intrblk_regnames + + + function automatic strq_t get_sha_acc_intrblk_regnames(); + + strq_t sha_intr_regs; + + foreach (_soc_register_dict[rkey]) begin + if (str_startswith(rkey, "SHA_ACC_INTR_BRF")) + sha_intr_regs.push_back(rkey); + end + + return sha_intr_regs; + + endfunction // get_intrblk_regnames + + + function automatic strq_t get_intrblk_regnames_minus_incr(); + strq_t intr_regs; + + foreach (_soc_register_dict[rkey]) begin + if (str_startswith(rkey, "INTR_BRF") && !str_endswith(rkey, "INCR_R")) + intr_regs.push_back(rkey); + end + + return intr_regs; + + endfunction // get_intrblk_regnames_minus_incr - function strq_t get_soc_regnames_minus_fuse(); + + function automatic strq_t get_soc_regnames_minus_fuse(); strq_t soc_regs; @@ -673,10 +959,10 @@ package soc_ifc_tb_pkg; return soc_regs; - endfunction + endfunction // get_soc_regnames_minus_fuse - function strq_t get_soc_regnames_minus_intr(); + function automatic strq_t get_soc_regnames_minus_intr(); strq_t soc_regs; @@ -687,25 +973,27 @@ package soc_ifc_tb_pkg; return soc_regs; - endfunction - + endfunction // get_soc_regnames_minus_intr - function strq_t get_soc_regnames_minus_fuse_intr(); + function automatic strq_t get_soc_regnames_minus_fuse_intr(); strq_t soc_regs; foreach (_soc_register_dict[rkey]) begin - if ((rkey.substr(0,7) != "INTR_BRF") && (rkey.substr(0,3) != "FUSE")) - soc_regs.push_back(rkey); + if (str_startswith(rkey, "INTR_BRF") || + str_startswith(rkey, "SHA_ACC_INTR_BRF") || + str_startswith(rkey, "FUSE")) + continue; + soc_regs.push_back(rkey); end return soc_regs; - endfunction + endfunction // get_soc_regnames_minus_fuse_intr - function word_addrq_t get_undef_regs(); + function automatic word_addrq_t get_undef_regs(); // Just flattens and expands the extent ranges into a single queue word_addrq_t undef_addrs; @@ -727,21 +1015,22 @@ package soc_ifc_tb_pkg; return undef_addrs; - endfunction + endfunction // get_undef_regs - function void reset_exp_data(); + function automatic void reset_exp_data(); // this peforms update for power-on reset begin $display ("** Clearing all expected reg values for cold reset **"); - foreach (_soc_register_dict[rname]) + foreach (_soc_register_dict[rname]) begin _exp_register_data_dict[rname] = get_initval(rname); + end end - endfunction + endfunction // reset_exp_data - function void warm_reset_exp_data(); + function automatic void warm_reset_exp_data(); // Unlike reset_exp_data which assumes cold boot, this preserves sticky bits int wrmrst_pfx_match = 0; @@ -770,10 +1059,10 @@ package soc_ifc_tb_pkg; end end - endfunction + endfunction // warm_reset_exp_data(); - function int is_pulsed_reg(string rname); + function automatic int is_pulsed_reg(string rname); string tmplist [$]; @@ -782,116 +1071,172 @@ package soc_ifc_tb_pkg; return (tmplist.size() > 0); end - endfunction - - - /* Placeholder. Implement if we have multiple registers - function void handle_cross_reg_mods (string rname, dword_t wr_data, access_t wr_modifier); - - endfunction - */ + endfunction // is_pulsed_reg // --------------------------------------------------------------------------- // -- Generic Utility functions that have less to do with custom data types // --------------------------------------------------------------------------- - function int str_startswith(string s1, string s2); + function automatic logic str_startswith(string s1, string s2); return (s2 == s1.substr(0, s2.len() - 1)); - endfunction + endfunction // str_startswith + + + function automatic int str_endswith(string s1, string s2); + + int s1_eix = s1.len() - 1; + int s2_eix = s2.len() - 1; + + return (s2 == s1.substr(s1_eix - s2_eix, s1_eix)); + + endfunction // str_endswith + + + function automatic del_from_strq(inout strq_t mutable_strq, input string name); + // NOTE. This function works ONLY for a single name that matches one-index + + int iq [$]; + int j; + + iq = mutable_strq.find_index with (item == name); + j = iq[0]; + + mutable_strq.delete(j); + + endfunction // del_from_strq + + + function automatic delm_from_strq(inout strq_t mutable_strq, input string pfx); + // NOTE. This function works by deleting multiple names with matching prefix + + strq_t filtq; + + foreach(mutable_strq[i]) begin + if (str_startswith(mutable_strq[i], pfx)) + continue; + filtq.push_back(mutable_strq[i]); + end + + mutable_strq = {}; + mutable_strq = filtq; + + endfunction // delm_from_strq function automatic dword_t mask_shifted(dword_t v, dword_t n); - /* - Shift val by number of bits that mask n has zeros on right, eg: - mask_shifted(32'h1, 32'h100) -> 0x100 // 8-bit shift ; - mask_shifted(32'h1, 32'h8000_0000); -> 0x8000_0000 // 31-bit shift - mask_shifted(32'h2, 32'h0003_0000) -> 0x0002_0000 // 16 bit shift - mask_shifted(32'h2, 32'h0006_0000) -> 0x0004_0000 // 17 bit shift - */ - - int k; - int ones = $countones(n); - dword_t a = {ones{1'b1}}; - begin - for (k = 0; k < (32 - ones + 1); k++) begin - if ((a << k) == n) - break; + /* Shift 'v' by number of bits that mask 'n' has zeros on right. Example: + v (bin): 1001 (0x9) value to move + n (bin): 0000_0000_0001_1110_0000_0000_0000_0000 (0x1e0000) 4-bit mask + Return (bin): 0000_0000_0001_0010_0000_0000_0000_0000 (0x120000) moved to mask position + */ + + return v << count_trailing_zeros(n); + endfunction // mask_shifted + + + function automatic int count_trailing_zeros(dword_t n); + + int k = 0; + dword_t nshift = n; + + if (n == 0) + return 32; + + while (k < 32) begin + if (n[k] == 1'b1) + break; + k += 1; end + return k; + + endfunction // count_trailing_zeros - return (v << k); - end - endfunction + function automatic void print_banner(string txtstr, string s = "-"); + int L = txtstr.len(); + $display({L{s}}); + $display(txtstr); + $display({L{s}}); + endfunction // print_banner // ================================================================================ // Class definitions - // ================================================================================ */ + // ================================================================================ + // -------------------------------------------------------------------------------- class WordTransaction; + // -------------------------------------------------------------------------------- word_addr_t addr; rand dword_t data; int tid; - function void update(word_addr_t addr, dword_t data, int tid); - - this.addr = addr; - this.data = data; - this.tid = tid; - - endfunction + extern function void update(word_addr_t addr, dword_t data, int tid); + extern function void update_byname(string addr_name, dword_t data, int tid); + extern function void update_tid(int tid); + extern function void update_data(dword_t data); + extern function void display(); + extern function void copy_from(WordTransaction atrans); + endclass // WordTransaction - function void update_byname(string addr_name, dword_t data, int tid); - word_addr_t addr; + function void WordTransaction::update(word_addr_t addr, dword_t data, int tid); - this.addr = _soc_register_dict[addr_name]; - this.data = data; - this.tid = tid; + this.addr = addr; + this.data = data; + this.tid = tid; - endfunction + endfunction + + function void WordTransaction::update_byname(string addr_name, dword_t data, int tid); - function void update_tid(int tid); + word_addr_t addr; - this.tid = tid; + this.addr = _soc_register_dict[addr_name]; + this.data = data; + this.tid = tid; - endfunction + endfunction - function void update_data(dword_t data); + function void WordTransaction::update_tid(int tid); - this.data = data; + this.tid = tid; - endfunction + endfunction - function void display(); + function void WordTransaction::update_data(dword_t data); - $display("Addr: 0x%08x, Data: 0x%08x, TID: %03d", addr, data, tid); + this.data = data; - endfunction + endfunction - - function void copy_from(WordTransaction atrans); - this.update(atrans.addr, atrans.data, atrans.tid); + function void WordTransaction::display(); - endfunction + $display("Addr: 0x%08x, Data: 0x%08x, TID: %03d", addr, data, tid); + endfunction - endclass // WordTransaction + + function void WordTransaction::copy_from(WordTransaction atrans); + this.update(atrans.addr, atrans.data, atrans.tid); + endfunction - // ================================================================================ // + + // -------------------------------------------------------------------------------- class SocRegisters; + // -------------------------------------------------------------------------------- // once these static vars have been set, assoicated modifier functions should have no effect static int widereg_expanded = 0; @@ -900,391 +1245,471 @@ package soc_ifc_tb_pkg; static string security_state_name = "UNDEFINED2"; static int undef_addr_built = 0; - function new(); - if (!widereg_expanded) begin - init_regs(); - widereg_expanded = 1; - end + extern function new(); + extern function lock_fuses(); + extern function unlock_fuses(); + extern function void build_inverse_addr_map(); + extern function void init_regs(); + extern function word_addr_t get_addr(string name); + extern function string get_name(word_addr_t addr); + extern function void update_security_state(string ssname); + extern function void display_exp_regs(); + extern function dword_t get_exp_regval(string rname); - if (!imap_built) begin - build_inverse_addr_map(); - imap_built = 1; - end + endclass // SocRegisters - reset_exp_data(); - - endfunction + function SocRegisters::new(); + if (!widereg_expanded) begin + init_regs(); + widereg_expanded = 1; + end - function lock_fuses(); - // assume over APB or some other means. NOTE that CPTRA_FUSE_WR_DONE - // may be set from 1 to 0, which will have no effect on this variable. - - _fuses_locked = 1; // set this global var for now + if (!imap_built) begin + build_inverse_addr_map(); + imap_built = 1; + end - endfunction + reset_exp_data(); + + endfunction // new - function unlock_fuses(); - // unset global var; done over cold boot, warm reset or mailbox command + function SocRegisters::lock_fuses(); + // assume over APB or some other means. NOTE that CPTRA_FUSE_WR_DONE + // may be set from 1 to 0, which will have no effect on this variable. + + _fuses_locked = 1; // set this global var for now - _fuses_locked = 0; + endfunction // lock_fuses - endfunction + function SocRegisters::unlock_fuses(); + // unset global var; done over cold boot, warm reset or mailbox command - function void build_inverse_addr_map(); + _fuses_locked = 0; - if (imap_built) - return; + endfunction // unlock_fuses + - foreach (_soc_register_dict[tmpstr]) - _imap_soc_register_dict[_soc_register_dict[tmpstr]] = tmpstr; + function void SocRegisters::build_inverse_addr_map(); - endfunction // build_inverse_addr_map + if (imap_built) + return; + foreach (_soc_register_dict[tmpstr]) + _imap_soc_register_dict[_soc_register_dict[tmpstr]] = tmpstr; - function void init_regs(); - // The default _soc_register_dict only has root addr name-value mappings for - // simple 32-bit registers. Wider registers implemented as array need to be - // populated w/a function + endfunction // build_inverse_addr_map - word_addr_t start_addr; - int i; - string istr; - dword_t initval; - if (widereg_expanded) - return; + function void SocRegisters::init_regs(); + // The default _soc_register_dict only has root addr name-value mappings for + // simple 32-bit registers. Wider registers implemented as array need to be + // populated w/a function - foreach (_wide_register_dict[rname]) begin - if (_soc_register_dict.exists(rname)) begin - start_addr = _soc_register_dict[rname]; - for (i = 0; i < _wide_register_dict[rname]; i++) begin - istr.itoa(i); - _soc_register_dict[{rname, istr}] = start_addr + 4*i; - end - _soc_register_dict.delete(rname); - end else - $display ("TB ERROR. Soc register and wide register data structures incomplete!"); - end + word_addr_t start_addr; + int i; + string istr; + dword_t initval; + + if (widereg_expanded) + return; + + foreach (_wide_register_dict[rname]) begin + if (_soc_register_dict.exists(rname)) begin + start_addr = _soc_register_dict[rname]; + for (i = 0; i < _wide_register_dict[rname]; i++) begin + istr.itoa(i); + _soc_register_dict[{rname, istr}] = start_addr + 4*i; + end + _soc_register_dict.delete(rname); + end else + $display ("TB ERROR. Soc register and wide register data structures incomplete!"); + end - // The same is done for 'reset' values of registers - // Names that don't exist in _soc_register_initval_dict assume "0" values - foreach (_wide_register_dict[rname]) begin - if (_soc_register_initval_dict.exists(rname)) begin - initval = _soc_register_initval_dict[rname]; - for (i = 0; i < _wide_register_dict[rname]; i++) begin - istr.itoa(i); - _soc_register_initval_dict[{rname, istr}] = initval; - end - _soc_register_initval_dict.delete(rname); + // The same is done for 'reset' values of registers + // Names that don't exist in _soc_register_initval_dict assume "0" values + foreach (_wide_register_dict[rname]) begin + if (_soc_register_initval_dict.exists(rname)) begin + initval = _soc_register_initval_dict[rname]; + for (i = 0; i < _wide_register_dict[rname]; i++) begin + istr.itoa(i); + _soc_register_initval_dict[{rname, istr}] = initval; end + _soc_register_initval_dict.delete(rname); end + end - // foreach (_soc_register_initval_dict[rname]) - // $display ("-- INIT VAL %30s <= 0x%08x", rname, _soc_register_initval_dict[rname]); - - endfunction // init_regs + // foreach (_soc_register_initval_dict[rname]) + // $display ("-- INIT VAL %30s <= 0x%08x", rname, _soc_register_initval_dict[rname]); + endfunction // init_regs - function word_addr_t get_addr(string name); - if (_soc_register_dict.exists(name)) - return _soc_register_dict[name]; - else begin - $display("TB WARNING. Address %s not found in reg name->addr map. Returning 0", name); - return '0; - end + function word_addr_t SocRegisters::get_addr(string name); - endfunction // get_addr + if (_soc_register_dict.exists(name)) + return _soc_register_dict[name]; + else begin + $display("TB WARNING. Address %s not found in reg name->addr map. Returning 0", name); + return '0; + end + endfunction // get_addr - function string get_name(word_addr_t addr); - if (_imap_soc_register_dict.exists(addr)) - return _imap_soc_register_dict[addr]; - else begin - $display("TB WARNING. Address 0x%08x not found in reg addr->name map. Returning empty str", addr); - return ""; - end + function string SocRegisters::get_name(word_addr_t addr); - endfunction // get_name + if (_imap_soc_register_dict.exists(addr)) + return _imap_soc_register_dict[addr]; + else begin + $display("TB WARNING. Address 0x%08x not found in reg addr->name map. Returning empty str", addr); + return ""; + end + endfunction // get_name - // TODO. Separate into byname version: - // function void update_security_state_byname(string ssname); - // function void update_security_state(int sscode); - function void update_security_state(string ssname); + function void SocRegisters::update_security_state(string ssname); - security_state_name = ssname; + security_state_name = ssname; - endfunction + endfunction // update_security_state - function void display_exp_regs(); + function void SocRegisters::display_exp_regs(); - $display ("\n\n-- Current state of expected register values --\n"); - foreach (_exp_register_data_dict[rname]) begin - $display (" -- expected value of addr %-40s (0x%08x) = 0x%08x", - rname, get_addr(rname), _exp_register_data_dict[rname]); - end - $display (" ---------------------------------------------\n "); + $display ("\n\n-- Current state of expected register values --\n"); + foreach (_exp_register_data_dict[rname]) begin + $display (" -- expected value of addr %-40s (0x%08x) = 0x%08x", + rname, get_addr(rname), _exp_register_data_dict[rname]); + end + $display (" ---------------------------------------------\n "); - endfunction // displaY_exp_regs + endfunction // display_exp_regs - endclass // SocRegisters + function dword_t SocRegisters::get_exp_regval(string rname); + // $display (" -- expected value of addr %-40s (0x%08x) = 0x%08x", + // rname, get_addr(rname), _exp_register_data_dict[rname]); + return _exp_register_data_dict[rname]; + endfunction // get_exp_regval - // ================================================================================ // + // -------------------------------------------------------------------------------- class RegScoreboard; + // -------------------------------------------------------------------------------- int err_count; transq_t addr_table [word_addr_t]; // store a queue of transactions for each address - function new(); + extern function new(); + extern function void record_reset_values(tid, access_t modify); + extern function void record_entry(WordTransaction transaction, access_t modify); + extern function intpair_t find_matching_transaction(word_addr_t addr, int tid); + extern function int check_entry(WordTransaction transaction); + extern function int check_entry_inrange(WordTransaction transaction, int minval, int maxval); + extern function transq_t get_entries (string addr_name); + extern function transq_t get_entries_withtid (string addr_name, int tid); + extern function void del_entry_withtid(string addr_name, int tid); + extern function void del_entries(string addr_name); + extern function void del_all(); + extern function void display_all(); - string tmpstr; + endclass // RegScoreboard - begin - err_count = 0; - end - endfunction + function RegScoreboard::new(); - function void record_reset_values(tid, access_t modify); - // useful for reset of all registers + string tmpstr; - word_addr_t addr; - transaction_t new_trans; - dword_t sscode; + begin + err_count = 0; + end + endfunction // new - if (modify == COLD_RESET) - reset_exp_data(); - else if (modify == WARM_RESET) - warm_reset_exp_data(); - else begin - $display ("TB ERROR. Mass update of registers unsupported w/access type %s", modify.name()); - return; - end - foreach (_soc_register_dict[rname]) begin - - addr = _soc_register_dict[rname]; - new_trans = {addr: addr, data: _exp_register_data_dict[rname], tid: tid}; - - if (addr_table.exists(addr)) - addr_table[addr].push_back(new_trans); - else - addr_table[addr] = {new_trans}; - end + function void RegScoreboard::record_reset_values(tid, access_t modify); + // useful for reset of all registers - endfunction + word_addr_t addr; + transaction_t new_trans; + dword_t sscode; + if (modify == COLD_RESET) + reset_exp_data(); + else if (modify == WARM_RESET) + warm_reset_exp_data(); + else begin + $display ("TB ERROR. Mass update of registers unsupported w/access type %s", modify.name()); + return; + end - function void record_entry(WordTransaction transaction, access_t modify); - // NOTE. when an entry is recorded, instead of storing the transaction - // the expected data is stored, so that comparison can be made later on - // for a previous 'tid'. + foreach (_soc_register_dict[rname]) begin + + addr = _soc_register_dict[rname]; + new_trans = {addr: addr, data: _exp_register_data_dict[rname], tid: tid}; - word_addr_t addr = transaction.addr; - dword_t data = transaction.data; - int tid = transaction.tid; - dword_t sscode; + if (addr_table.exists(addr)) + addr_table[addr].push_back(new_trans); + else + addr_table[addr] = {new_trans}; + end - transaction_t new_trans; - dword_t exp_data; - string addr_name; + endfunction // record_reset_vaules - addr_name = _imap_soc_register_dict[addr]; - update_exp_regval(addr_name, data, modify); - exp_data = _exp_register_data_dict[addr_name]; - new_trans = {addr: addr, data: exp_data, tid: tid}; - - if (addr_table.exists(addr)) begin - // $display ("INFO. Pushing new transaction into existing queue"); - addr_table[addr].push_back(new_trans); + function void RegScoreboard::record_entry(WordTransaction transaction, access_t modify); + // NOTE. when an entry is recorded, instead of storing the transaction + // the expected data is stored, so that comparison can be made later on + // for a previous 'tid'. + + word_addr_t addr = transaction.addr; + dword_t data = transaction.data; + int tid = transaction.tid; + dword_t sscode; + + transaction_t new_trans; + dword_t exp_data; + string addr_name; + + addr_name = _imap_soc_register_dict[addr]; + update_exp_regval(addr_name, data, modify); + exp_data = _exp_register_data_dict[addr_name]; + + new_trans = {addr: addr, data: exp_data, tid: tid}; + + if (addr_table.exists(addr)) begin + // $display ("INFO. Pushing new transaction into existing queue"); + addr_table[addr].push_back(new_trans); + end else begin + // $display ("Adding transaction for addr %x", addr); + addr_table[addr] = {new_trans}; + end + + endfunction // record_entry + + + function intpair_t RegScoreboard::find_matching_transaction(word_addr_t addr, int tid); + // returns {data, valid} struct pair + // Ideally searches through scoreboard table to fine matching transaction. For + // all practical purposes, for a register model only the most recent modication matters. + // The code is kept for reference/future usage. + + transaction_t temp_trans; + intpair_t matched_p; + transq_t qr; + + int err_found = 0; + int matched_d = 0; + + if (!addr_table.exists(addr)) begin + $display ("TB fault. Address %x does not exist", addr); + err_found = 1; + end else begin + qr = addr_table[addr]; + if (qr.size() == 0) begin + $display ("TB fault. qr size is 0 for addr %x", addr); + err_found = 1; + end else if (qr.size() == 1) begin + // FIXME. This needs a better change. If a write to a register modified register model + // (_exp_register_data_dict) and then some other reg operation modified that, this + // transaction's entry in scoreboard is no longer valid! Need TIMESTAMP! + // + // temp_trans = qr[0]; + // matched_d = int'(temp_trans.data); + + matched_d = int'(_exp_register_data_dict[_imap_soc_register_dict[addr]]); end else begin - // $display ("Adding transaction for addr %x", addr); - addr_table[addr] = {new_trans}; + qr = addr_table[addr].find_first with(item.tid == tid); + if (qr.size() == 0) begin + $display ("TB fault. No transaction with id %d found for addr %x", tid, addr); + err_found = 1; + end else if (qr.size() > 1) begin + $display ("TB fault. Multiple transactions with id %d found for addr %x", tid, addr); + err_found = 1; + end else begin + // TODO. Same issue related to FIXME above. + // temp_trans = qr[0]; + // matched_d = int'(temp_trans.data); + + matched_d = int'(_exp_register_data_dict[_imap_soc_register_dict[addr]]); + end end - endfunction + if (err_found) + $display("ERROR. No matching transaction with tid %d in Reg Scoreboard for addr = %s(0x%08x)", + tid, _imap_soc_register_dict[addr], addr); + end + err_count += err_found; + matched_p = {d: matched_d, v: int'(err_found == 0)}; + return matched_p; - // TODO. Consider implementing deletion along with checking - // returns cumulative (object.)error count - // don't check tid if only one transaction - // function int check_anddel_entry(WordTransaction transaction); + endfunction // find_matching_transaction - function int check_entry(WordTransaction transaction); - // returns cumulative (object.)error count - // don't check tid if only one transaction + function int RegScoreboard::check_entry(WordTransaction transaction); + // returns cumulative (object.)error count - ignore tid if only one transaction - word_addr_t addr = transaction.addr; - dword_t data = transaction.data; - int tid = transaction.tid; + word_addr_t addr = transaction.addr; + dword_t data = transaction.data; + int tid = transaction.tid; - transaction_t temp_trans; + intpair_t matched_p; + int err_found = 1; - transq_t qr; - int err_found = 0; + matched_p = find_matching_transaction(addr, tid); - if (!addr_table.exists(addr)) - $display ("TB fault. Address %x does not exist", addr); - else begin - qr = addr_table[addr]; - if (qr.size() == 0) begin - $display ("TB fault. qr size is 0 for addr %x", addr); - err_found = 1; - end else if (qr.size() == 1) begin - temp_trans = qr[0]; - // FIXME. This needs a better change. If a write to a register modified register model - // (_exp_register_data_dict) and then some other reg operation modified that, this - // transaction's entry in scoreboard is no longer valid! - // err_found = int'(temp_trans.data != data); - err_found = int'(_exp_register_data_dict[_imap_soc_register_dict[addr]] != data); - end else begin - qr = addr_table[addr].find_first with(item.tid == tid); - if (qr.size() == 0) begin - $display ("TB fault. No transaction with id %d found for addr %x", tid, addr); - err_found = 1; - end else if (qr.size() == 0) begin - $display ("TB fault. Multiple transactions with id %d found for addr %x", tid, addr); - err_found = 1; - end else begin - temp_trans = qr[0]; - // Same issue related to FIXME above. - // err_found = int'(temp_trans.data != data); - err_found = int'(_exp_register_data_dict[_imap_soc_register_dict[addr]] != data); - end - end + if (matched_p.v) + err_found = int'(matched_p.d != data); - if (err_found) - $display("ERROR from Reg Scoreboard for addr = %s(0x%08x); observed data = 0x%08x | expected data = 0x%08x", - _imap_soc_register_dict[addr], addr, data, qr[0].data); - end + if (err_found) begin + $display("ERROR from Reg Scoreboard for addr = %s(0x%08x); observed data = 0x%08x | expected data = 0x%08x", + _imap_soc_register_dict[addr], addr, data, matched_p.d); + end - err_count += err_found; - return err_count; + err_count += err_found; + return err_count; - endfunction + endfunction // check_entry - function transq_t get_entries (string addr_name); + function int RegScoreboard::check_entry_inrange(WordTransaction transaction, int minval, int maxval); + // Just like RegScoreboard::check_entry but has range to compare against - word_addr_t addr; - transq_t entries; // queue of transactions + word_addr_t addr = transaction.addr; + dword_t data = transaction.data; + int tid = transaction.tid; - addr = _soc_register_dict[addr_name]; + intpair_t matched_p; + int err_found = 1; - if (addr_table.exists(addr)) begin - entries = addr_table[addr]; - end else - $display("TB WARNING. get_entries: No addr %s (0x%08x) found in scoreboard", addr_name, addr); + matched_p = find_matching_transaction(addr, tid); - return entries; + if (matched_p.v) // NOTE. ignore matching data since range needed + err_found = int'((data < minval) || (data > maxval)); - endfunction + if (err_found) begin + $display("ERROR from Reg Scoreboard for addr = %s(0x%08x); observed data = 0x%08x | expected data in [0x%08x, 0x%08x]", + _imap_soc_register_dict[addr], addr, data, minval, maxval); + end + err_count += err_found; + return err_count; - function transq_t get_entries_withtid (string addr_name, int tid); + endfunction // check_entry_in_range - word_addr_t addr; - transq_t entries; // queue of transactions - addr = _soc_register_dict[addr_name]; + function transq_t RegScoreboard::get_entries (string addr_name); - if (addr_table.exists(addr)) begin - entries = addr_table[addr].find with(item.tid == tid); - end else - $display("TB WARNING. get_entries_withtid: No addr %s (0x%08x) found in scoreboard", addr_name, addr); + word_addr_t addr; + transq_t entries; // queue of transactions - return entries; + addr = _soc_register_dict[addr_name]; - endfunction + if (addr_table.exists(addr)) begin + entries = addr_table[addr]; + end else + $display("TB WARNING. get_entries: No addr %s (0x%08x) found in scoreboard", addr_name, addr); + return entries; - function void del_entry_withtid(string addr_name, int tid); + endfunction // get_entries - int qi [$]; - int err_found = 0; - word_addr_t addr; + function transq_t RegScoreboard::get_entries_withtid (string addr_name, int tid); - addr = _soc_register_dict[addr_name]; + word_addr_t addr; + transq_t entries; // queue of transactions - if (!(addr_table.exists(addr))) begin - $display("TB WARNING. del_entry_withtid: No addr %s (0x%08x) found in scoreboard", addr_name, addr); - return; - end + addr = _soc_register_dict[addr_name]; - qi = addr_table[addr].find_index with(item.tid == tid); - if (qi.size() == 0) - $display("TB WARNING. No tid %d / addr (0x%08x) combination found in scoreboard", tid, addr); - else if (qi.size() == 1) - addr_table.delete(addr); - else begin - $display("TB WARNING. Multiple tid %d found for addr (0x%08x) in scoreboard", tid, addr); - foreach (qi[i]) - addr_table[addr].delete(qi[i]); - end + if (addr_table.exists(addr)) begin + entries = addr_table[addr].find with(item.tid == tid); + end else + $display("TB WARNING. get_entries_withtid: No addr %s (0x%08x) found in scoreboard", addr_name, addr); - endfunction + return entries; + endfunction // get_entries_withtid - function void del_entries(string addr_name); - - word_addr_t addr; - addr = _soc_register_dict[addr_name]; + function void RegScoreboard::del_entry_withtid(string addr_name, int tid); - if (addr_table.exists(addr)) - addr_table.delete(addr); - else - $display("TB WARNING. del_entries: No addr %s (0x%08x) found in scoreboard", addr_name, addr); + int qi [$]; + int err_found = 0; - endfunction + word_addr_t addr; + addr = _soc_register_dict[addr_name]; - function void del_all(); + if (!(addr_table.exists(addr))) begin + $display("TB WARNING. del_entry_withtid: No addr %s (0x%08x) found in scoreboard", addr_name, addr); + return; + end - foreach (addr_table[addr]) - addr_table.delete(addr); + qi = addr_table[addr].find_index with(item.tid == tid); + if (qi.size() == 0) + $display("TB WARNING. No tid %d / addr (0x%08x) combination found in scoreboard", tid, addr); + else if (qi.size() == 1) + addr_table.delete(addr); + else begin + $display("TB WARNING. Multiple tid %d found for addr (0x%08x) in scoreboard", tid, addr); + foreach (qi[i]) // Note. This works fine for a hash table, not a queue/array + addr_table[addr].delete(qi[i]); + end - endfunction + endfunction // del_entry_withtid - function void display_all(); + function void RegScoreboard::del_entries(string addr_name); + + word_addr_t addr; - int i; - word_addr_t tmpkey; - transaction_t tmptrans; - transq_t tmpq; + addr = _soc_register_dict[addr_name]; - $display ("\n\n-- Current state of scoreboard --\n"); - foreach (addr_table[tmpkey]) begin - tmpq = addr_table[tmpkey]; - foreach (tmpq[i]) begin - tmptrans = tmpq[i]; - $display (" -- Queue for addr %x[%03d]: {addr = %x, data = %x, tid = %x}", - tmpkey, i , tmptrans.addr, tmptrans.data, tmptrans.tid); - end - $display (" --------------------------------------------- "); - end + if (addr_table.exists(addr)) + addr_table.delete(addr); + else + $display("TB WARNING. del_entries: No addr %s (0x%08x) found in scoreboard", addr_name, addr); - endfunction + endfunction // del_entries - endclass // RegScoreboard + function void RegScoreboard::del_all(); + + foreach (addr_table[addr]) + addr_table.delete(addr); + + endfunction // del_all + + + function void RegScoreboard::display_all(); + + int i; + word_addr_t tmpkey; + transaction_t tmptrans; + transq_t tmpq; + + $display ("\n\n-- Current state of scoreboard --\n"); + foreach (addr_table[tmpkey]) begin + tmpq = addr_table[tmpkey]; + foreach (tmpq[i]) begin + tmptrans = tmpq[i]; + $display (" -- Queue for addr %x[%03d]: {addr = %x, data = %x, tid = %x}", + tmpkey, i , tmptrans.addr, tmptrans.data, tmptrans.tid); + end + $display (" --------------------------------------------- "); + end + + endfunction // display_all endpackage // soc_ifc_tb_pkg `endif // SOC_IFC_TB_PKG + diff --git a/src/soc_ifc/tb/soc_reg_intrblk_test.svh b/src/soc_ifc/tb/soc_reg_intrblk_test.svh new file mode 100644 index 000000000..85e92c8ef --- /dev/null +++ b/src/soc_ifc/tb/soc_reg_intrblk_test.svh @@ -0,0 +1,405 @@ +// SPDX-License-Identifier: Apache-2.0 +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +//====================================================================== + + // Keeping all declarations and assignments of internal signals for possibly future use + logic [1:0] global_intr_en_r; + logic [7:0] error_intr_en_r; + logic [5:0] notif_intr_en_r; + logic error_global_intr_r; // *RO* + logic notif_global_intr_r; // *RO* + logic [7:0] error_internal_intr_r; // *WO* + logic [5:0] notif_internal_intr_r; // *WO* + logic [7:0] error_intr_trig_r; // *WO* + logic [5:0] notif_intr_trig_r; // *WO* + logic error_internal_intr_count_r; + logic error_inv_dev_intr_count_r; + logic error_cmd_fail_intr_count_r; + logic error_bad_fuse_intr_count_r; + logic error_iccm_blocked_intr_count_r; + logic error_mbox_ecc_unc_intr_count_r; + logic error_wdt_timer1_timeout_intr_count_r; + logic error_wdt_timer2_timeout_intr_count_r; + logic notif_cmd_avail_intr_count_r; + logic notif_mbox_ecc_cor_intr_count_r; + logic notif_debug_locked_intr_count_r; + logic notif_soc_req_lock_intr_count_r; + logic notif_gen_in_toggle_intr_count_r; + // Following are already covered via other tests and implications; not needed for INTR_BLOCK + // logic error_internal_intr_count_incr_r; dut.i_soc_ifc_reg.field_storage.intr_block_rf.error_internal_intr_count_incr_r.pulse.value; + // logic error_inv_dev_intr_count_incr_r; dut.i_soc_ifc_reg.field_storage.intr_block_rf.error_inv_dev_intr_count_incr_r.pulse.value; + // logic error_cmd_fail_intr_count_incr_r; dut.i_soc_ifc_reg.field_storage.intr_block_rf.error_cmd_fail_intr_count_incr_r.pulse.value; + // logic error_bad_fuse_intr_count_incr_r; dut.i_soc_ifc_reg.field_storage.intr_block_rf.error_bad_fuse_intr_count_incr_r.pulse.value; + // logic error_iccm_blocked_intr_count_incr_r; dut.i_soc_ifc_reg.field_storage.intr_block_rf.error_iccm_blocked_intr_count_incr_r.pulse.value; + // logic error_mbox_ecc_unc_intr_count_incr_r; dut.i_soc_ifc_reg.field_storage.intr_block_rf.error_mbox_ecc_unc_intr_count_incr_r.pulse.value; + // logic error_wdt_timer1_timeout_intr_count_incr_r; dut.i_soc_ifc_reg.field_storage.intr_block_rf.error_wdt_timer1_timeout_intr_count_incr_r.pulse.value; + // logic error_wdt_timer2_timeout_intr_count_incr_r; dut.i_soc_ifc_reg.field_storage.intr_block_rf.error_wdt_timer2_timeout_intr_count_incr_r.pulse.value; + // logic notif_cmd_avail_intr_count_incr_r; dut.i_soc_ifc_reg.field_storage.intr_block_rf.notif_cmd_avail_intr_count_incr_r.pulse.value; + // logic notif_mbox_ecc_cor_intr_count_incr_r; dut.i_soc_ifc_reg.field_storage.intr_block_rf.notif_mbox_ecc_cor_intr_count_incr_r.pulse.value; + // logic notif_debug_locked_intr_count_incr_r; dut.i_soc_ifc_reg.field_storage.intr_block_rf.notif_debug_locked_intr_count_incr_r.pulse.value; + // logic notif_soc_req_lock_intr_count_incr_r; dut.i_soc_ifc_reg.field_storage.intr_block_rf.notif_soc_req_lock_intr_count_incr_r.pulse.value; + // logic notif_gen_in_toggle_intr_count_incr_r; dut.i_soc_ifc_reg.field_storage.intr_block_rf.notif_gen_in_toggle_intr_count_incr_r.pulse.value; + + assign global_intr_en_r = {dut.i_soc_ifc_reg.field_storage.intr_block_rf.global_intr_en_r.error_en.value, + dut.i_soc_ifc_reg.field_storage.intr_block_rf.global_intr_en_r.notif_en.value}; + assign error_intr_en_r = {dut.i_soc_ifc_reg.field_storage.intr_block_rf.error_intr_en_r.error_internal_en.value, + dut.i_soc_ifc_reg.field_storage.intr_block_rf.error_intr_en_r.error_inv_dev_en.value, + dut.i_soc_ifc_reg.field_storage.intr_block_rf.error_intr_en_r.error_cmd_fail_en.value, + dut.i_soc_ifc_reg.field_storage.intr_block_rf.error_intr_en_r.error_bad_fuse_en.value, + dut.i_soc_ifc_reg.field_storage.intr_block_rf.error_intr_en_r.error_iccm_blocked_en.value, + dut.i_soc_ifc_reg.field_storage.intr_block_rf.error_intr_en_r.error_mbox_ecc_unc_en.value, + dut.i_soc_ifc_reg.field_storage.intr_block_rf.error_intr_en_r.error_wdt_timer1_timeout_en.value, + dut.i_soc_ifc_reg.field_storage.intr_block_rf.error_intr_en_r.error_wdt_timer2_timeout_en}; + assign notif_intr_en_r = {dut.i_soc_ifc_reg.field_storage.intr_block_rf.notif_intr_en_r.notif_cmd_avail_en.value, + dut.i_soc_ifc_reg.field_storage.intr_block_rf.notif_intr_en_r.notif_mbox_ecc_cor_en.value, + dut.i_soc_ifc_reg.field_storage.intr_block_rf.notif_intr_en_r.notif_debug_locked_en.value, + dut.i_soc_ifc_reg.field_storage.intr_block_rf.notif_intr_en_r.notif_scan_mode_en.value, + dut.i_soc_ifc_reg.field_storage.intr_block_rf.notif_intr_en_r.notif_soc_req_lock_en.value, + dut.i_soc_ifc_reg.field_storage.intr_block_rf.notif_intr_en_r.notif_gen_in_toggle_en.value}; + assign error_global_intr_r = dut.i_soc_ifc_reg.field_storage.intr_block_rf.error_global_intr_r.agg_sts.value; // *RO* + assign notif_global_intr_r = dut.i_soc_ifc_reg.field_storage.intr_block_rf.notif_global_intr_r.agg_sts.value; // *RO* + assign error_internal_intr_r = {dut.i_soc_ifc_reg.field_storage.intr_block_rf.error_internal_intr_r.error_internal_sts.value, + dut.i_soc_ifc_reg.field_storage.intr_block_rf.error_internal_intr_r.error_inv_dev_sts.value, + dut.i_soc_ifc_reg.field_storage.intr_block_rf.error_internal_intr_r.error_cmd_fail_sts.value, + dut.i_soc_ifc_reg.field_storage.intr_block_rf.error_internal_intr_r.error_bad_fuse_sts.value, + dut.i_soc_ifc_reg.field_storage.intr_block_rf.error_internal_intr_r.error_iccm_blocked_sts.value, + dut.i_soc_ifc_reg.field_storage.intr_block_rf.error_internal_intr_r.error_mbox_ecc_unc_sts.value, + dut.i_soc_ifc_reg.field_storage.intr_block_rf.error_internal_intr_r.error_wdt_timer1_timeout_sts.value, + dut.i_soc_ifc_reg.field_storage.intr_block_rf.error_internal_intr_r.error_wdt_timer2_timeout_sts.value}; + assign notif_internal_intr_r = {dut.i_soc_ifc_reg.field_storage.intr_block_rf.notif_internal_intr_r.notif_cmd_avail_sts.value, + dut.i_soc_ifc_reg.field_storage.intr_block_rf.notif_internal_intr_r.notif_mbox_ecc_cor_sts.value, + dut.i_soc_ifc_reg.field_storage.intr_block_rf.notif_internal_intr_r.notif_debug_locked_sts.value, + dut.i_soc_ifc_reg.field_storage.intr_block_rf.notif_internal_intr_r.notif_scan_mode_sts.value, + dut.i_soc_ifc_reg.field_storage.intr_block_rf.notif_internal_intr_r.notif_soc_req_lock_sts.value, + dut.i_soc_ifc_reg.field_storage.intr_block_rf.notif_internal_intr_r.notif_gen_in_toggle_sts.value}; + assign error_intr_trig_r = {dut.i_soc_ifc_reg.field_storage.intr_block_rf.error_intr_trig_r.error_wdt_timer2_timeout_trig.value, + dut.i_soc_ifc_reg.field_storage.intr_block_rf.error_intr_trig_r.error_wdt_timer1_timeout_trig.value, + dut.i_soc_ifc_reg.field_storage.intr_block_rf.error_intr_trig_r.error_mbox_ecc_unc_trig.value, + dut.i_soc_ifc_reg.field_storage.intr_block_rf.error_intr_trig_r.error_iccm_blocked_trig.value, + dut.i_soc_ifc_reg.field_storage.intr_block_rf.error_intr_trig_r.error_bad_fuse_trig.value, + dut.i_soc_ifc_reg.field_storage.intr_block_rf.error_intr_trig_r.error_cmd_fail_trig.value, + dut.i_soc_ifc_reg.field_storage.intr_block_rf.error_intr_trig_r.error_inv_dev_trig.value, + dut.i_soc_ifc_reg.field_storage.intr_block_rf.error_intr_trig_r.error_internal_trig.value}; + assign notif_intr_trig_r = {dut.i_soc_ifc_reg.field_storage.intr_block_rf.notif_intr_trig_r.notif_gen_in_toggle_trig.value, + dut.i_soc_ifc_reg.field_storage.intr_block_rf.notif_intr_trig_r.notif_soc_req_lock_trig.value, + dut.i_soc_ifc_reg.field_storage.intr_block_rf.notif_intr_trig_r.notif_scan_mode_trig.value, + dut.i_soc_ifc_reg.field_storage.intr_block_rf.notif_intr_trig_r.notif_debug_locked_trig.value, + dut.i_soc_ifc_reg.field_storage.intr_block_rf.notif_intr_trig_r.notif_mbox_ecc_cor_trig.value, + dut.i_soc_ifc_reg.field_storage.intr_block_rf.notif_intr_trig_r.notif_cmd_avail_trig.value}; + + assign error_internal_intr_count_r = dut.i_soc_ifc_reg.field_storage.intr_block_rf.error_internal_intr_count_r.cnt.value; + assign error_inv_dev_intr_count_r = dut.i_soc_ifc_reg.field_storage.intr_block_rf.error_inv_dev_intr_count_r.cnt.value; + assign error_cmd_fail_intr_count_r = dut.i_soc_ifc_reg.field_storage.intr_block_rf.error_cmd_fail_intr_count_r.cnt.value; + assign error_bad_fuse_intr_count_r = dut.i_soc_ifc_reg.field_storage.intr_block_rf.error_bad_fuse_intr_count_r.cnt.value; + assign error_iccm_blocked_intr_count_r = dut.i_soc_ifc_reg.field_storage.intr_block_rf.error_iccm_blocked_intr_count_r.cnt.value; + assign error_mbox_ecc_unc_intr_count_r = dut.i_soc_ifc_reg.field_storage.intr_block_rf.error_mbox_ecc_unc_intr_count_r.cnt.value; + assign error_wdt_timer1_timeout_intr_count_r = dut.i_soc_ifc_reg.field_storage.intr_block_rf.error_wdt_timer1_timeout_intr_count_r.cnt.value; + assign error_wdt_timer2_timeout_intr_count_r = dut.i_soc_ifc_reg.field_storage.intr_block_rf.error_wdt_timer2_timeout_intr_count_r.cnt.value; + assign notif_cmd_avail_intr_count_r = dut.i_soc_ifc_reg.field_storage.intr_block_rf.notif_cmd_avail_intr_count_r.cnt.value; + assign notif_mbox_ecc_cor_intr_count_r = dut.i_soc_ifc_reg.field_storage.intr_block_rf.notif_mbox_ecc_cor_intr_count_r.cnt.value; + assign notif_debug_locked_intr_count_r = dut.i_soc_ifc_reg.field_storage.intr_block_rf.notif_debug_locked_intr_count_r.cnt.value; + assign notif_soc_req_lock_intr_count_r = dut.i_soc_ifc_reg.field_storage.intr_block_rf.notif_soc_req_lock_intr_count_r.cnt.value; + assign notif_gen_in_toggle_intr_count_r = dut.i_soc_ifc_reg.field_storage.intr_block_rf.notif_gen_in_toggle_intr_count_r.cnt.value; + + + //---------------------------------------------------------------- + // soc_reg_intrblk_test() + // + // Test writing & reading of all soc ifc interrupt block registers + //---------------------------------------------------------------- + task soc_reg_intrblk_test; + // SoC Register Interrupt Block Test excluding *INCR_R which are automatically tested elsewhere + + word_addr_t addr; + int tid = 0; // TID is to be updated ONLY if multiple writes to an address + strq_t intrblk_regnames; + string rname, associated_rname; + + WordTransaction wrtrans, rdtrans; + strq_t ro_regnames, wo_regnames, wo_associated_regnames; + + logic [31:0] nonzero_cyc = '0; + dword_t ahb_wrdata; + + int changeup; + int changedn; + int changeup_cyc = 0; + int changedn_cyc = 0; + dword_t nonzero_regval; + dword_t final_regval; + dword_t associated_regval; + + + begin + $display("Executing task soc_reg_intrblk_test"); + $display("-----------------------------------\n"); + + // set_security_state_byname("DEBUG_UNLOCKED_PRODCUTION"); + + tc_ctr = tc_ctr + 1; + + wrtrans = new(); + rdtrans = new(); + + intrblk_regnames = get_intrblk_regnames_minus_incr(); + + // These are read-only registers + update_exp_regval("INTR_BRF_ERROR_GLOBAL_INTR_R", error_global_intr_r, SET_DIRECT); + update_exp_regval("INTR_BRF_NOTIF_GLOBAL_INTR_R", error_global_intr_r, SET_DIRECT); + + // Write-one to clear regs need special handling + wo_regnames = { "INTR_BRF_ERROR_INTR_TRIG_R", "INTR_BRF_NOTIF_INTR_TRIG_R" }; + wo_associated_regnames = { "INTR_BRF_ERROR_INTERNAL_INTR_R", "INTR_BRF_NOTIF_INTERNAL_INTR_R" }; + + repeat (5) @(posedge clk_tb); + + + // Skip wrting & reading over AHB until post reset sequencing is done + // THEN, update scoreboard entry accordingly for a couple of registers which + // are written using APB as part of Caliptra boot. Scoreboard update not + // needed for readonly fields which are set directly by wires. + simulate_caliptra_boot(); + update_CPTRA_FLOW_STATUS(ready_for_fuses, `REG_HIER_BOOT_FSM_PS); + + repeat (20) @(posedge clk_tb); + sb.del_all(); + + + // PHASE I. 1a-d Write-Read register back2back + // ------------------------------------------------------------ + + $display ("\n------------------------------------------------------------------------------"); + $display ("1a. Writing/Reading back to back using AHB/AHB every 3 cycles"); + $display ("------------------------------------------------------------------------------"); + tphase = "1a"; + write_read_regs(SET_AHB, GET_AHB, intrblk_regnames, tid, 3); + + repeat (20) @(posedge clk_tb); + // sb.del_all(); // Keep scoreboard entries of writes for next phase 1b + + + $display ("\n------------------------------------------------------------------------------"); + $display ("1b. Read over AHB. Then Writing/Reading back to back using APB/APB every 3 cycles"); + $display ("------------------------------------------------------------------------------"); + tphase = "1b"; + + // Read out the data over AHB. Ensure APB writes cannot modify the registers + // Implicity test neither can AHB reads. + foreach (intrblk_regnames[i]) begin + $display("-- expect no modification over apb writes --"); + rname = intrblk_regnames[i]; + rdtrans.update(socregs.get_addr(rname), 32'hffff_ffff, tid); + read_reg_trans(GET_AHB, rdtrans); + update_exp_regval(rname, rdtrans.data, SET_DIRECT); // what has been just read cannot be changed by APB + write_regs(SET_APB, {rname}, tid, 3); + end + read_regs(GET_APB, intrblk_regnames, tid, 3); + + repeat (20) @(posedge clk_tb); + // sb.del_all(); // Keep scoreboard entries of AHB writes from 1a for next phase 1c + + + $display ("\n------------------------------------------------------------------------------"); + $display ("1c. Read over APB. Then Writing/Reading back to back using APB/AHB every 3 cycles"); + $display ("------------------------------------------------------------------------------"); + tphase = "1c"; + + // Read out the data over APB. Ensure APB writes cannot modify the registers either + // Implicity test neither can APB reads. + foreach (intrblk_regnames[i]) begin + $display("-- expect no modification over apb writes --"); + rname = intrblk_regnames[i]; + rname = intrblk_regnames[i]; + rdtrans.update(socregs.get_addr(rname), 32'hffff_ffff, tid); + read_reg_trans(GET_APB, rdtrans); + update_exp_regval(rname, rdtrans.data, SET_DIRECT); // what has been read cannot be changed by APB + write_regs(SET_APB, {rname}, tid, 3); + end + read_regs(GET_AHB, intrblk_regnames, tid, 3); + + repeat (20) @(posedge clk_tb); + sb.del_all(); + + // Don't need to test AHB/APB write read anymore; included in sequences above + // $display ("1d. Writing/Reading back to back using AHB/APB every 3 cycles"); + + $display ("\n------------------------------------------------------------------------------"); + $display ("2a. Handle WO special registers"); + $display ("------------------------------------------------------------------------------"); + tphase = "2a"; + + // For WO_ASSOCIATED_REGNAMES. + // First expect to clear all write-to-clear data (check it too) + // Then randomly set bits and ensure only those bits are cleared. + foreach (wo_associated_regnames[i]) begin + rname = wo_associated_regnames[i]; + addr = socregs.get_addr(rname); + $display ("\n-- Handling WO register 0x%08x (%s) --", addr, rname); + + $display ("\n -- First clear register and check --"); + wrtrans.update_byname(rname, 32'hffff_ffff, tid); + write_reg_trans(SET_AHB, wrtrans); + repeat (5) @(posedge clk_tb); + + rdtrans.update_byname(rname, 0, tid); + read_reg_trans(GET_AHB, rdtrans); + if (rdtrans.data != '0) begin + $display("TB ERROR. Expected a write ones to clear register for addr 0x%08x (%s). Instead received 0x%08x", + addr, rname, rdtrans.data); + error_ctr += 1; + continue; + end + end + + // Repeat. Longer squence for WO_REGNAMES. + // First expect to clear all write-to-clear data (check it too) + // Then randomly set bits and ensure only those bits are cleared. + foreach (wo_regnames[i]) begin + rname = wo_regnames[i]; + addr = socregs.get_addr(rname); + $display ("\n-- Handling WO register 0x%08x (%s) --", addr, rname); + + $display ("\n -- First clear register and check --"); + wrtrans.update_byname(rname, 32'hffff_ffff, tid); + write_reg_trans(SET_AHB, wrtrans); + repeat (5) @(posedge clk_tb); + + rdtrans.update_byname(rname, 0, tid); + read_reg_trans(GET_AHB, rdtrans); + if (rdtrans.data != '0) begin + $display("TB ERROR. Expected a write ones to clear register for addr 0x%08x (%s). Instead received 0x%08x", + addr, rname, rdtrans.data); + error_ctr += 1; + continue; + end + + // Now randomly set bits after reg is all clear + wrtrans.update_byname(rname, 0, tid); + wrtrans.randomize(); + ahb_wrdata = wrtrans.data & get_mask(rname); + // $display ("TB DEBUG. Now randomly set bits to write 0x%08x; w/masking expect to write 0x%08x", + // wrtrans.data, ahb_wrdata); + + $display ("\n -- Finally check for non-zero value and then transition to 0 --"); + + + fork + begin : writing_over_ahb + write_reg_trans(SET_AHB, wrtrans); + repeat (10) @(posedge clk_tb); + end + + begin : checking_for_transition + monitor_pulsed_reg(rname, 10, nonzero_regval, final_regval, changeup, changedn); + end + join + + $display("Inspecting rname %s = addr 0x%08x", rname, addr); + $display ("TB DEBUG. All said and done; from addr 0x%08x (%s). Directly probed non-zero val = 0x%08x and final val = 0x%08x| expected non-zero = 0x%08x", + addr, rname, nonzero_regval, final_regval, ahb_wrdata); + + associated_rname = "INTR_BRF_ERROR_INTR_TRIG_R" ? "INTR_BRF_ERROR_INTERNAL_INTR_R" : + "INTR_BRF_NOTIF_INTR_TRIG_R" ? "INTR_BRF_NOTIF_INTERNAL_INTR_R" : + "UNDEFINED"; + + associated_regval = probe_reg(associated_rname); + $display ("TB INFO. Checking associated address %s related to trigger %s; associaated value = 0x%08x, trigger value %08x", + associated_rname, rname, associated_regval, nonzero_regval); + + + if (changeup && changedn && (nonzero_regval == ahb_wrdata) && (final_regval == '0)) + $display ("TB INFO. Both up and down transitions noted correctly; all good with addr 0x%08x (%s)!", addr, rname); + else begin + error_ctr += 1; + if (!changeup) + $display("TB ERROR did not see a transition to non-zero value for addr 0x%08x (%s)", addr, rname); + else if (!changedn) + $display("TB ERROR did not see a transition back to a zero value for addr 0x%08x (%s) and stayed at 0x%08x", addr, rname, final_regval); + if (nonzero_regval != ahb_wrdata) + $display("TB ERROR Nonzero value noted for addr 0x%08x (%s) is 0x%08x | expected 0x%08x", addr, rname, nonzero_regval, ahb_wrdata); + end + end + + end + + endtask // soc_reg_intrblk_test; + + + + task automatic monitor_pulsed_reg(input string regname, input int num_cycles, + inout dword_t nonzero_val, inout dword_t final_val, inout up, inout dn); + + dword_t probed_val = 32'hbead_face; + dword_t latched_val = 32'hbead_face; + + begin + + up = 0; + dn = 0; + + repeat (num_cycles) begin + probed_val = probe_reg(regname); + + if (up && dn) begin + $display("TB INFO. Saw both up and dn for register %s", regname); + break; + end + + up = up | ((probed_val != latched_val) && (latched_val == '0)); // Sticky transition up + dn = dn | ((probed_val == '0) && (latched_val != '0)); // Sticky transition down + + if (probed_val != '0) + nonzero_val = probed_val; + + @(posedge clk_tb); + latched_val = probed_val; + end + + final_val = probe_reg(regname); + + // $display("TB DEBUG. For register %s Checking past initated ahb_write_trans. Probed regval = 0x%08x", rname, probed_val); + end + + endtask // monitor_pulsed_reg + + + function automatic dword_t probe_reg(string regname); + + return (regname == "INTR_BRF_ERROR_INTERNAL_INTR_R") ? error_internal_intr_r : + (regname == "INTR_BRF_NOTIF_INTERNAL_INTR_R") ? notif_internal_intr_r : + (regname == "INTR_BRF_ERROR_INTR_TRIG_R") ? error_intr_trig_r : + (regname == "INTR_BRF_NOTIF_INTR_TRIG_R") ? notif_intr_trig_r : 32'hdead_face; + + endfunction + + +/* +// Placeholder reference + +sequence remain_low__sha_acc_error_internal_intr_r; + (| ({ dut.i_sha512_acc_top.i_sha512_acc_csr.field_storage.intr_block_rf.error_internal_intr_r.error0_sts.value, + dut.i_sha512_acc_top.i_sha512_acc_csr.field_storage.intr_block_rf.error_internal_intr_r.error1_sts.value, + dut.i_sha512_acc_top.i_sha512_acc_csr.field_storage.intr_block_rf.error_internal_intr_r.error2_sts.value, + dut.i_sha512_acc_top.i_sha512_acc_csr.field_storage.intr_block_rf.error_internal_intr_r.error3_sts.value }) == 1'b0); +endsequence + +property reg_remains_low; + @(posedge clk_tb) + disable iff (reg_sva_off) remain_low__sha_acc_error_internal_intr_r; +endproperty + +monitor_trans2ones: assert property(reg_remains_low); +*/ + diff --git a/src/soc_ifc/tb/soc_reg_invalid_test.svh b/src/soc_ifc/tb/soc_reg_invalid_test.svh index cdd2f064b..bff53679f 100644 --- a/src/soc_ifc/tb/soc_reg_invalid_test.svh +++ b/src/soc_ifc/tb/soc_reg_invalid_test.svh @@ -35,6 +35,7 @@ strq_t soc_regnames; word_addrq_t undef_regs; + automatic dword_t valid_hrdata; begin $display("Executing task soc_reg_invalid_test"); @@ -109,8 +110,9 @@ write_single_word_ahb(addr, wdata); read_single_word_ahb(addr); + valid_hrdata = addr[2] ? hrdata_o_tb[`AHB64_HI] : hrdata_o_tb[`AHB64_LO]; $display("Control condtion; test over AHB to aligned address (expect read to mirro write value) : addr = 0x%08x, wdata = 0x%08x, rdata = 0x%x", - addr, wdata, hrdata_o_tb); + addr, wdata, valid_hrdata); foreach (undef_regs[i]) begin @@ -120,10 +122,11 @@ write_single_word_ahb(undef_addr, wdata); read_single_word_ahb(undef_addr); - $display("Write & read over AHB : undefined addr = 0x%08x, wdata = 0x%08x, rdata = 0x%x", undef_addr, wdata, hrdata_o_tb); + valid_hrdata = addr[2] ? hrdata_o_tb[`AHB64_HI] : hrdata_o_tb[`AHB64_LO]; + $display("Write & read over AHB : undefined addr = 0x%08x, wdata = 0x%08x, rdata = 0x%x", undef_addr, wdata, valid_hrdata); - if (hrdata_o_tb != 0) begin - $display("ERROR. undefined addr = 0x%08x, returns non-zero value 0x%08x over AHB!", undef_addr, hrdata_o_tb); + if (valid_hrdata != 0) begin + $display("ERROR. undefined addr = 0x%08x, returns non-zero value 0x%08x over AHB!", undef_addr, valid_hrdata); error_ctr += 1; end end @@ -143,10 +146,11 @@ write_single_word_ahb(unaligned_addr, wdata); read_single_word_ahb(unaligned_addr); - $display("Write & read over AHB : unaligned addr = 0x%08x, wdata = 0x%08x, rdata = %x", unaligned_addr, wdata, hrdata_o_tb); + valid_hrdata = addr[2] ? hrdata_o_tb[`AHB64_HI] : hrdata_o_tb[`AHB64_LO]; + $display("Write & read over AHB : unaligned addr = 0x%08x, wdata = 0x%08x, rdata = %x", unaligned_addr, wdata, valid_hrdata); - if (hrdata_o_tb != 0) begin - $display("ERROR. unaligned addr = 0x%08x, returns non-zero value 0x%08x over AHB!", unaligned_addr, hrdata_o_tb); + if (valid_hrdata != 0) begin + $display("ERROR. unaligned addr = 0x%08x, returns non-zero value 0x%08x over AHB!", unaligned_addr, valid_hrdata); error_ctr += 1; end diff --git a/src/soc_ifc/tb/soc_reg_reset_test.svh b/src/soc_ifc/tb/soc_reg_reset_test.svh index f7608cdd0..a73ed44fe 100644 --- a/src/soc_ifc/tb/soc_reg_reset_test.svh +++ b/src/soc_ifc/tb/soc_reg_reset_test.svh @@ -14,6 +14,7 @@ // //====================================================================== + //---------------------------------------------------------------- // soc_reg_pwron_test() // @@ -23,52 +24,73 @@ int tid = 0; // TID is to be updated ONLY if multiple writes to an address strq_t soc_regnames; + int iq [$]; logic [2:0] random_security_state; + WordTransaction rdtrans = new(); + string rname_dyn; + dword_t flow_status; + dword_t regval; + + int tmp_i = 1000; // max 1000 cycle wait time begin + print_banner("\nExecuting task soc_reg_pwron_test", "="); - $display("\nExecuting task soc_reg_pwron_test"); - $display("---------------------------------\n"); - - // set_security_state('{device_lifecycle: DEVICE_PRODUCTION, debug_locked: DEBUG_LOCKED}); - if (ss_name == "RANDOM") begin - random_security_state = $urandom_range(0, 7); - set_security_state(security_state_t'(random_security_state)); - end else begin - random_security_state = get_ss_code(ss_name); - set_security_state(security_state_t'(random_security_state)); - end + set_security_state_byname(ss_name); sim_dut_init(); tc_ctr = tc_ctr + 1; - $display("Current security state = 0b%03b", security_state); soc_regnames = get_soc_regnames_minus_intr(); + del_from_strq(soc_regnames, "INTERNAL_RV_MTIME_L"); // Exclude CPTRA_RV_MTIME_L + $display ("0a. Checking Power-on values\n"); - // --------------------------------------------------------------- - // Phase 1. Inialize soc_regs ON COLD BOOT, then check values - // --------------------------------------------------------------- - $display ("1. Init values beyond reset at start of simulation "); + print_banner("Phase 1. Inialize soc_regs ON COLD BOOT, then check values"); + // -------------------------------------------------------------------------- + sb.record_reset_values(0, COLD_RESET); + flow_status = update_CPTRA_FLOW_STATUS(ready_for_fuses, `REG_HIER_BOOT_FSM_PS); + @(posedge clk_tb); read_regs(GET_APB, soc_regnames, 0, 3); + _read_special_register(GET_APB, "INTERNAL_RV_MTIME_L", 0); // *** special register *** simulate_caliptra_boot(); + flow_status = update_CPTRA_FLOW_STATUS(ready_for_fuses, `REG_HIER_BOOT_FSM_PS); + + // *** begin - special registers GENERIC_INPUT_WIRES *** + if (cptra_noncore_rst_b_tb == 1'b0) begin + fork + begin + wait (cptra_noncore_rst_b_tb == 1'b1); + $display("TB. INFO Finished waiting for cptra_noncore_rst_b_tb; current value = 1'b%b", cptra_noncore_rst_b_tb); + end + begin + repeat(tmp_i) @(posedge clk_tb); + $display("TB. ERROR Timed out while waiting for cptra_noncore_rst_b_tb; current value = 1'b%b", cptra_noncore_rst_b_tb); + end + join_any + end + + _read_special_register(GET_APB, "CPTRA_GENERIC_INPUT_WIRES0", 0); + _read_special_register(GET_APB, "CPTRA_GENERIC_INPUT_WIRES1", 0); + // *** end - special registers *** + repeat (10) @(posedge clk_tb); // FUSE_WR_DONE and BOOTFSM_GO are both 'h1 // no point in checking over ahb; pwron is long done - // --------------------------------------------------------------- - // Phase 2. Repeat COLD BOOT, then check values - // --------------------------------------------------------------- - $display ("1. Init values after asserting new cold reset"); + + print_banner("Phase 2. Repeat COLD BOOT, init explicitly as needed, then check values"); + // --------------------------------------------------------------------------------------- + reset_dut(); sb.del_all(); @@ -76,6 +98,7 @@ sb.record_reset_values(0, COLD_RESET); read_regs(GET_APB, soc_regnames, 0, 3); + _read_special_register(GET_APB, "INTERNAL_RV_MTIME_L", 0); // *** special register *** error_ctr = sb.err_count; end @@ -92,7 +115,7 @@ task soc_reg_wrmrst_test(input string ss_name="RANDOM"); int tid = 0; // TID is to be updated ONLY if multiple writes to an address - strq_t soc_regnames; + strq_t soc_regnames, fuse_regnames; logic [2:0] random_security_state; @@ -101,51 +124,57 @@ WordTransaction transaction; + string rname_dyn; + begin - $display("\nExecuting task soc_reg_wrmrst_test"); - $display("----------------------------------\n"); + print_banner("\nExecuting task soc_reg_wrmrst_test", "="); transaction = new(); - // --------------------------------------------------------------- - // Phase 1. Inialize soc_regs ON COLD BOOT, overwrite w/new values - // --------------------------------------------------------------- - - if (ss_name == "RANDOM") begin - random_security_state = $urandom_range(0, 7); - set_security_state(security_state_t'(random_security_state)); - end else begin - random_security_state = get_ss_code(ss_name); - set_security_state(security_state_t'(random_security_state)); - end - + set_security_state_byname("RANDOM"); sim_dut_init(); tc_ctr = tc_ctr + 1; - $display ("\n1a. Write to registers after cold boot and check back writes"); - - soc_regnames = get_soc_regnames_minus_intr(); + fuse_regnames = get_fuse_regnames(); + soc_regnames = get_soc_regnames_minus_fuse_intr(); foreach (soc_regnames[ix]) begin - if (soc_regnames[ix] == "CPTRA_FUSE_WR_DONE") begin + if ((soc_regnames[ix] == "CPTRA_FUSE_WR_DONE") || (soc_regnames[ix] == "CPTRA_TRNG_STATUS") || + (soc_regnames[ix] == "CPTRA_TRNG_DATA")) begin soc_regnames.delete(ix); // can cause problem downstream if fuse_wr_done == True - break; + continue; end end - write_regs(SET_APB, soc_regnames, 0, 3); - read_regs(GET_APB, soc_regnames, 0, 3); // just so we see what was written + del_from_strq(soc_regnames, "INTERNAL_RV_MTIME_L"); // Exclude CPTRA_RV_MTIME_L + + + tphase = "1"; + print_banner("\nPhase 1. Initialize registers after cold boot, overwrite and check"); + // --------------------------------------------------------------------------------- + + write_regs(SET_APB, fuse_regnames, 0, 3); + read_regs(GET_APB, fuse_regnames, 0, 3); // just so we see what was written + + // Have to wait until after cptra_noncore_rst_b_tb is high + // write_regs(SET_APB, soc_regnames, 0, 3); + // read_regs(GET_APB, soc_regnames, 0, 3); // just so we see what was written simulate_caliptra_boot(); + wait (cptra_noncore_rst_b_tb == 1'b1); - repeat (10) @(posedge clk_tb); + repeat (5) @(posedge clk_tb); + + write_regs(SET_APB, soc_regnames, 0, 3); + read_regs(GET_APB, soc_regnames, 0, 3); // just so we see what was written + repeat (5) @(posedge clk_tb); - // ----------------------------------------------------------------- - // Phase 2. Perform Warm Reset, read values over APB & AHB - // ----------------------------------------------------------------- - $display ("\n2a. Perform a warm reset then just read regs"); + + tphase = "2a"; + print_banner("\nPhase 2a. Perform a warm reset then just read regs over APB"); + // -------------------------------------------------------------------------- sb.del_all(); warm_reset_dut(); @@ -154,9 +183,11 @@ wait (ready_for_fuses == 1'b1); // Some registers need update for specific fields - flow_status = update_CPTRA_FLOW_STATUS(ready_for_fuses); + flow_status = update_CPTRA_FLOW_STATUS(ready_for_fuses, `REG_HIER_BOOT_FSM_PS); reset_reason = update_CPTRA_RESET_REASON(1, 0); + + $display("TB DEBUG. -- caliptra flow status updated = 0x%08x --", flow_status); sb.del_entries("CPTRA_FLOW_STATUS"); transaction.update_byname("CPTRA_FLOW_STATUS", flow_status, 0); sb.record_entry(transaction, SET_DIRECT); @@ -165,18 +196,35 @@ transaction.update_byname("CPTRA_RESET_REASON", reset_reason, 0); sb.record_entry(transaction, SET_DIRECT); + // Treat GENERIC_INPUT_WIRES slightly differently + del_from_strq(soc_regnames, "CPTRA_GENERIC_INPUT_WIRES0"); + del_from_strq(soc_regnames, "CPTRA_GENERIC_INPUT_WIRES1"); + // expect old sticky values which are different from power-on values + read_regs(GET_APB, fuse_regnames, 0, 3); read_regs(GET_APB, soc_regnames, 0, 3); + // *** begin - special registers *** + _read_special_register(GET_APB, "INTERNAL_RV_MTIME_L", 0); + _read_special_register(GET_APB, "CPTRA_GENERIC_INPUT_WIRES0", 0); + _read_special_register(GET_APB, "CPTRA_GENERIC_INPUT_WIRES1", 0); + // *** end - special registers *** + + + tphase = "2b"; + print_banner("\nPhase 2b. Simulate boot and read regs over AHB adjusting for boot regs"); + // ------------------------------------------------------------------------------------- + simulate_caliptra_boot(); $display ("WRM_RST_TEST: After caliptra boot, Ready for fuses = %d, Flow status value is %x", ready_for_fuses, flow_status); // DEBUG sb.del_entries("CPTRA_FLOW_STATUS"); - flow_status = update_CPTRA_FLOW_STATUS(ready_for_fuses); + flow_status = update_CPTRA_FLOW_STATUS(ready_for_fuses, `REG_HIER_BOOT_FSM_PS); transaction.update_byname("CPTRA_FLOW_STATUS", flow_status, 0); transaction.display(); // DEBUG + sb.record_entry(transaction, SET_APB); // task above updates bootfsm_go so need to update scoreboard accordingly @@ -184,9 +232,49 @@ transaction.update_byname("CPTRA_BOOTFSM_GO", 32'h1, 0); sb.record_entry(transaction, SET_APB); + read_regs(GET_AHB, fuse_regnames, 0, 3); read_regs(GET_AHB, soc_regnames, 0, 3); + // *** begin - special registers *** + _read_special_register(GET_AHB, "INTERNAL_RV_MTIME_L", 0); + _read_special_register(GET_AHB, "CPTRA_GENERIC_INPUT_WIRES0", 0); + _read_special_register(GET_AHB, "CPTRA_GENERIC_INPUT_WIRES1", 0); + // *** end - special registers *** + error_ctr = sb.err_count; end endtask // soc_reg_wrmrst_test; + + + //---------------------------------------------------------------- + // _read_special_register() + // + // Registers that have special read outcomes. Uses on global tb-level signals + //---------------------------------------------------------------- + + task _read_special_register(access_t modifier, string regname, int tid); + + begin + case (regname) + "INTERNAL_RV_MTIME_L": read_reg_chk_inrange(modifier, regname, tid, cycle_ctr_since_pwrgood - 'd1 , cycle_ctr_since_pwrgood + 'd20); + + "CPTRA_GENERIC_INPUT_WIRES0": + if (cptra_noncore_rst_b_tb) + read_reg_chk_inrange(modifier, regname, tid, generic_input_wires0_q, generic_input_wires0_q); + else + read_reg_chk_inrange(modifier, regname, tid, '0, '0); + + "CPTRA_GENERIC_INPUT_WIRES1": + if (cptra_noncore_rst_b_tb) + read_reg_chk_inrange(modifier, regname, tid, generic_input_wires1_q, generic_input_wires1_q); + else + read_reg_chk_inrange(modifier, regname, tid, '0, '0); + + default: $display( "TB ERROR. Unsupported special register %s", regname); + + endcase + + @(posedge clk_tb); + end + endtask \ No newline at end of file diff --git a/src/soc_ifc/tb/soc_reg_test.svh b/src/soc_ifc/tb/soc_reg_test.svh index 8abc6633c..cc2fdf33c 100644 --- a/src/soc_ifc/tb/soc_reg_test.svh +++ b/src/soc_ifc/tb/soc_reg_test.svh @@ -23,19 +23,10 @@ task soc_reg_test; // SoC Register Test excluding FUSE*, TRNG_DATA* and TRNG_STATUS registers - word_addr_t addr; int tid = 0; // TID is to be updated ONLY if multiple writes to an address strq_t soc_regnames; - string rname; - logic [31:0] tmpdata; int iq [$]; - transaction_t entry; - transq_t entries; - WordTransaction wrtrans, tmptrans; - - dword_t tmpval; - begin $display("Executing task soc_reg_test"); $display("---------------------------\n"); @@ -43,23 +34,18 @@ // TODO. Randomize set_security_state('{device_lifecycle: DEVICE_PRODUCTION, debug_locked: DEBUG_UNLOCKED}); - // $display("Current security state = 0b%03b", security_state); - - tc_ctr = tc_ctr + 1; soc_regnames = get_soc_regnames_minus_fuse_intr(); - // Exclude CPTRA_TRNG_STATUS - iq = soc_regnames.find_index with (item == "CPTRA_TRNG_STATUS"); - if (iq.size() == 1) - soc_regnames.delete(iq[0]); - - // Exclude CPTRA_TRNG_DATA* - soc_regnames.find_index with (str_startswith(item, "CPTRA_TRNG_DATA")); - foreach(iq[i]) - soc_regnames.delete(iq[i]); + // Exclude registers that are covered in separate tasks - fuse and intrblk regs + // -- Exclude CPTRA_TRNG_STATUS, INTERNAL_RV_MTIME_L/H + del_from_strq(soc_regnames, "INTERNAL_RV_MTIME_L"); + del_from_strq(soc_regnames, "INTERNAL_RV_MTIME_H"); + del_from_strq(soc_regnames, "CPTRA_TRNG_STATUS"); + // -- Exclude CPTRA_TRNG_DATA* + delm_from_strq(soc_regnames, "CPTRA_TRNG_DATA"); repeat (5) @(posedge clk_tb); @@ -72,37 +58,55 @@ // PHASE I. 1a-d Write-Read register back2back // ------------------------------------------------------------ - repeat (20) @(posedge clk_tb); sb.del_all(); + error_ctr = 0; + + update_CPTRA_FLOW_STATUS(ready_for_fuses, `REG_HIER_BOOT_FSM_PS); + - update_CPTRA_FLOW_STATUS(ready_for_fuses); + $display ("\n-------------------------------------------------------------"); + $display ("1a. Writing/Reading back to back using AHB/AHB every 3 cycles"); + $display ("-------------------------------------------------------------"); - $display ("\n1a. Writing/Reading back to back using AHB/AHB every 3 cycles"); write_read_regs(SET_AHB, GET_AHB, soc_regnames, tid, 3); + //FIXME. Need to add test for delayed cross modification of INTERNAL_ICCM_LOCK + // if ((addr_name == "INTERNAL_FW_UPDATE_RESET") & (indata[0] == 1'b1)) begin repeat (20) @(posedge clk_tb); sb.del_all(); - $display ("\n1b. Writing/Reading back to back using APB/APB every 3 cycles"); - write_read_regs(SET_APB, GET_APB, soc_regnames, tid, 3); + $display ("\n-------------------------------------------------------------"); + $display ("1b. Writing/Reading back to back using APB/APB every 3 cycles"); + $display ("-------------------------------------------------------------"); + write_read_regs(SET_APB, GET_APB, soc_regnames, tid, 3); repeat (20) @(posedge clk_tb); sb.del_all(); - $display ("\n1c. Writing/Reading back to back using APB/AHB every 3 cycles"); - write_read_regs(SET_APB, GET_AHB, soc_regnames, tid, 3); + $display ("\n-------------------------------------------------------------"); + $display ("1c. Writing/Reading back to back using APB/AHB every 3 cycles"); + $display ("-------------------------------------------------------------"); + + write_read_regs(SET_APB, GET_AHB, soc_regnames, tid, 3); repeat (20) @(posedge clk_tb); sb.del_all(); - $display ("\n1d. Writing/Reading back to back using AHB/APB every 3 cycles"); + $display ("\n-------------------------------------------------------------"); + $display ("1d. Writing/Reading back to back using AHB/APB every 3 cycles"); + $display ("-------------------------------------------------------------"); + write_read_regs(SET_AHB, GET_APB, soc_regnames, tid, 3); + + //FIXME. Need to add test for delayed cross modification of INTERNAL_ICCM_LOCK + // if ((addr_name == "INTERNAL_FW_UPDATE_RESET") & (indata[0] == 1'b1)) begin + + error_ctr += sb.err_count; - error_ctr = sb.err_count; end endtask // soc_reg_test diff --git a/src/soc_ifc/uvmf_soc_ifc/config/compile.yml b/src/soc_ifc/uvmf_soc_ifc/config/compile.yml index 02b0c1f87..1f9cf8295 100644 --- a/src/soc_ifc/uvmf_soc_ifc/config/compile.yml +++ b/src/soc_ifc/uvmf_soc_ifc/config/compile.yml @@ -16,6 +16,8 @@ targets: - ${COMPILE_ROOT}/uvmf_template_output/verification_ip/interface_packages/soc_ifc_status_pkg/src - ${COMPILE_ROOT}/uvmf_template_output/verification_ip/interface_packages/cptra_status_pkg - ${COMPILE_ROOT}/uvmf_template_output/verification_ip/interface_packages/cptra_status_pkg/src + - ${COMPILE_ROOT}/uvmf_template_output/verification_ip/interface_packages/mbox_sram_pkg + - ${COMPILE_ROOT}/uvmf_template_output/verification_ip/interface_packages/mbox_sram_pkg/src - ${COMPILE_ROOT}/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg - ${COMPILE_ROOT}/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/registers files: @@ -39,6 +41,11 @@ targets: - ${COMPILE_ROOT}/uvmf_template_output/verification_ip/interface_packages/cptra_status_pkg/src/cptra_status_driver_bfm.sv - ${COMPILE_ROOT}/uvmf_template_output/verification_ip/interface_packages/cptra_status_pkg/src/cptra_status_if.sv - ${COMPILE_ROOT}/uvmf_template_output/verification_ip/interface_packages/cptra_status_pkg/src/cptra_status_monitor_bfm.sv + - ${COMPILE_ROOT}/uvmf_template_output/verification_ip/interface_packages/mbox_sram_pkg/mbox_sram_pkg_hdl.sv + - ${COMPILE_ROOT}/uvmf_template_output/verification_ip/interface_packages/mbox_sram_pkg/mbox_sram_pkg.sv + - ${COMPILE_ROOT}/uvmf_template_output/verification_ip/interface_packages/mbox_sram_pkg/src/mbox_sram_driver_bfm.sv + - ${COMPILE_ROOT}/uvmf_template_output/verification_ip/interface_packages/mbox_sram_pkg/src/mbox_sram_if.sv + - ${COMPILE_ROOT}/uvmf_template_output/verification_ip/interface_packages/mbox_sram_pkg/src/mbox_sram_monitor_bfm.sv - ${COMPILE_ROOT}/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/registers/soc_ifc_reg_model_top_pkg.sv - ${COMPILE_ROOT}/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/soc_ifc_env_pkg.sv --- diff --git a/src/soc_ifc/uvmf_soc_ifc/coverage/config/uvmf_soc_ifc_cm_hier.cfg b/src/soc_ifc/uvmf_soc_ifc/coverage/config/uvmf_soc_ifc_cm_hier.cfg index f8b1e528f..0a84804d7 100644 --- a/src/soc_ifc/uvmf_soc_ifc/coverage/config/uvmf_soc_ifc_cm_hier.cfg +++ b/src/soc_ifc/uvmf_soc_ifc/coverage/config/uvmf_soc_ifc_cm_hier.cfg @@ -1,4 +1,3 @@ begin line+tgl+fsm+cond+branch +tree hdl_top.dut 0 end - diff --git a/src/soc_ifc/uvmf_soc_ifc/mbox_sram_interface.yaml b/src/soc_ifc/uvmf_soc_ifc/mbox_sram_interface.yaml new file mode 100644 index 000000000..52470e489 --- /dev/null +++ b/src/soc_ifc/uvmf_soc_ifc/mbox_sram_interface.yaml @@ -0,0 +1,67 @@ +uvmf: + interfaces: + mbox_sram: + clock: clk + reset: dummy + reset_assertion_level: 'False' + + config_constraints: [] + config_vars: + - name: "inject_ecc_error" + type: "bit [1:0]" + isrand: "False" + value: "2'b00" + comment: "Controls injection of ECC errors for write transactions. Bit[0]: Single Bit Error. Bit[1]: Double Bit Error" + - name: "auto_clear_ecc_error_injection" + type: "bit" + isrand: "False" + value: "1'b1" + comment: "When set, causes the mbox_sram_responder_sequence to clear the variable 'inject_ecc_error' after a single ECC error is injected" + + hdl_typedefs: [] + hvl_typedefs: [] + + # NOTE: This agent will be in RESPONDER mode, which inverts + # all port's polarities + ports: + - name: mbox_sram_req + dir: output + width: '$bits(mbox_sram_req_t)' + # cs (1) + we (1) + addr (15) + data (32) + ecc (7) = 56 + - name: mbox_sram_resp + dir: input + width: '$bits(mbox_sram_resp_t)' + # data (32) + ecc (7) = 39 + + transaction_constraints: [] +# - name: wait_cycles_c +# value: '{ wait_cycles dist {[1:25] := 80, [25:100] := 15, [100:500] := 5}; }' + + transaction_vars: + - name: is_read + type: bit + iscompare: 'True' + isrand: 'True' + - name: address + type: bit [MBOX_ADDR_W-1:0] + iscompare: 'True' + isrand: 'True' + - name: data + type: bit [MBOX_DATA_W-1:0] + iscompare: 'True' + isrand: 'True' + # ECC would be generated based on data, post_randomize, in the case where + # this transaction is generated as stimulus. + # We mostly expect to use this i/f as an observer though. + - name: data_ecc + type: bit [MBOX_ECC_DATA_W-1:0] + iscompare: 'True' + isrand: 'False' + - name: ecc_single_bit_error + type: bit + iscompare: 'True' + isrand: 'True' + - name: ecc_double_bit_error + type: bit + iscompare: 'True' + isrand: 'True' diff --git a/src/soc_ifc/uvmf_soc_ifc/run_yaml_uvmf_scripts.sh b/src/soc_ifc/uvmf_soc_ifc/run_yaml_uvmf_scripts.sh index 80497eeda..f0597c4d7 100755 --- a/src/soc_ifc/uvmf_soc_ifc/run_yaml_uvmf_scripts.sh +++ b/src/soc_ifc/uvmf_soc_ifc/run_yaml_uvmf_scripts.sh @@ -4,6 +4,7 @@ python ${UVMF_HOME}/scripts/yaml2uvmf.py --merge_source uvmf_template_output \ soc_ifc_global.yaml \ soc_ifc_ctrl_interface.yaml \ soc_ifc_status_interface.yaml \ + mbox_sram_interface.yaml \ soc_ifc_util_comp_soc_ifc_predictor.yaml \ soc_ifc_util_comp_soc_ifc_scoreboard.yaml \ ../../libs/uvmf/qvip_ahb_lite_slave_dir/uvmf/qvip_ahb_lite_slave_subenv_config.yaml \ diff --git a/src/soc_ifc/uvmf_soc_ifc/soc_ifc_bench.yaml b/src/soc_ifc/uvmf_soc_ifc/soc_ifc_bench.yaml index 5b35bf45d..a5b3fbc4c 100755 --- a/src/soc_ifc/uvmf_soc_ifc/soc_ifc_bench.yaml +++ b/src/soc_ifc/uvmf_soc_ifc/soc_ifc_bench.yaml @@ -18,6 +18,8 @@ uvmf: value: ACTIVE - bfm_name: cptra_status_agent value: ACTIVE + - bfm_name: mbox_sram_agent + value: ACTIVE clock_half_period: 5ns clock_phase_offset: 0ns diff --git a/src/soc_ifc/uvmf_soc_ifc/soc_ifc_ctrl_interface.yaml b/src/soc_ifc/uvmf_soc_ifc/soc_ifc_ctrl_interface.yaml index 1f10609d8..c8e159db4 100755 --- a/src/soc_ifc/uvmf_soc_ifc/soc_ifc_ctrl_interface.yaml +++ b/src/soc_ifc/uvmf_soc_ifc/soc_ifc_ctrl_interface.yaml @@ -109,6 +109,10 @@ uvmf: dir: output width: '1' + - name: rv_ecc_sts + dir: output + width: '4' + transaction_constraints: [] transaction_vars: @@ -120,3 +124,7 @@ uvmf: type: bit iscompare: 'False' isrand: 'False' + - name: pulse_rv_ecc_error + type: rv_ecc_sts_t + iscompare: 'False' + isrand: 'False' diff --git a/src/soc_ifc/uvmf_soc_ifc/soc_ifc_environment.yaml b/src/soc_ifc/uvmf_soc_ifc/soc_ifc_environment.yaml index ca462f3c2..468989270 100755 --- a/src/soc_ifc/uvmf_soc_ifc/soc_ifc_environment.yaml +++ b/src/soc_ifc/uvmf_soc_ifc/soc_ifc_environment.yaml @@ -17,6 +17,9 @@ uvmf: - name: cptra_status_agent type: cptra_status initiator_responder: "RESPONDER" + - name: mbox_sram_agent + type: mbox_sram + initiator_responder: "RESPONDER" analysis_components: - name: soc_ifc_pred @@ -66,6 +69,8 @@ uvmf: receiver: soc_ifc_pred.soc_ifc_ctrl_agent_ae # - driver: cptra_ctrl_agent.monitored_ap # Caliptra Control receiver: soc_ifc_pred.cptra_ctrl_agent_ae # + - driver: mbox_sram_agent.monitored_ap # Mailbox SRAM i/f + receiver: soc_ifc_pred.mbox_sram_agent_ae # # - driver: qvip_ahb_lite_master_subenv.ahb_master_0.export_rw # AHB # receiver: soc_ifc_pred.ahb_master_0_ae # # - driver: qvip_apb5_master_subenv.apb5_master_0.export_rw # APB diff --git a/src/soc_ifc/uvmf_soc_ifc/soc_ifc_status_interface.yaml b/src/soc_ifc/uvmf_soc_ifc/soc_ifc_status_interface.yaml index bc4e436b1..6f69cbd21 100755 --- a/src/soc_ifc/uvmf_soc_ifc/soc_ifc_status_interface.yaml +++ b/src/soc_ifc/uvmf_soc_ifc/soc_ifc_status_interface.yaml @@ -122,6 +122,9 @@ uvmf: - name: cptra_uc_rst_b dir: output width: '1' + - name: fw_update_rst_window + dir: output + width: '1' #Obfuscated UDS and FE - name: cptra_obf_key_reg @@ -147,11 +150,17 @@ uvmf: - name: sha_notif_intr dir: output width: '1' + - name: timer_intr + dir: output + width: '1' # NMI Vector - name: nmi_vector dir: output width: '32' + - name: nmi_intr + dir: output + width: '1' # ICCM Lock - name: iccm_lock @@ -177,6 +186,10 @@ uvmf: type: bit iscompare: 'True' isrand: 'False' + - name: timer_intr_pending + type: bit + iscompare: 'True' + isrand: 'False' # Subsystem reset - name: noncore_rst_asserted @@ -187,6 +200,10 @@ uvmf: type: bit iscompare: 'True' isrand: 'False' + - name: fw_update_rst_window + type: bit + iscompare: 'True' + isrand: 'False' #Obfuscated UDS and FE - name: cptra_obf_key_reg @@ -207,6 +224,10 @@ uvmf: type: bit [31:0] iscompare: 'True' isrand: 'False' + - name: nmi_intr_pending + type: bit + iscompare: 'True' + isrand: 'False' # ICCM Lock - name: iccm_locked diff --git a/src/soc_ifc/uvmf_soc_ifc/soc_ifc_util_comp_soc_ifc_predictor.yaml b/src/soc_ifc/uvmf_soc_ifc/soc_ifc_util_comp_soc_ifc_predictor.yaml index 692d4f915..8d8ce87cb 100755 --- a/src/soc_ifc/uvmf_soc_ifc/soc_ifc_util_comp_soc_ifc_predictor.yaml +++ b/src/soc_ifc/uvmf_soc_ifc/soc_ifc_util_comp_soc_ifc_predictor.yaml @@ -7,6 +7,8 @@ uvmf: type: 'soc_ifc_ctrl_transaction' - name: cptra_ctrl_agent_ae type: 'cptra_ctrl_transaction' + - name: mbox_sram_agent_ae + type: 'mbox_sram_transaction' - name: ahb_slave_0_ae type: 'mvc_sequence_item_base' # type: 'ahb_master_burst_transfer #(ahb_lite_slave_0_params::AHB_NUM_MASTERS, diff --git a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/project_benches/soc_ifc/docs/interfaces.csv b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/project_benches/soc_ifc/docs/interfaces.csv index dd76c8f8e..e411f7a9a 100644 --- a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/project_benches/soc_ifc/docs/interfaces.csv +++ b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/project_benches/soc_ifc/docs/interfaces.csv @@ -27,4 +27,5 @@ soc_ifc_ctrl_agent, soc_ifc_ctrl_driver_bfm soc_ifc_ctrl_monitor_bfm, soc_ifc_ct cptra_ctrl_agent, cptra_ctrl_driver_bfm cptra_ctrl_monitor_bfm, cptra_ctrl_transaction, cptra_ctrl_pkg_cptra_ctrl_agent_BFM, soc_ifc_status_agent, soc_ifc_status_driver_bfm soc_ifc_status_monitor_bfm, soc_ifc_status_transaction, soc_ifc_status_pkg_soc_ifc_status_agent_BFM, cptra_status_agent, cptra_status_driver_bfm cptra_status_monitor_bfm, cptra_status_transaction, cptra_status_pkg_cptra_status_agent_BFM, +mbox_sram_agent, mbox_sram_driver_bfm mbox_sram_monitor_bfm, mbox_sram_transaction, mbox_sram_pkg_mbox_sram_agent_BFM, diff --git a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/project_benches/soc_ifc/sim/Makefile b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/project_benches/soc_ifc/sim/Makefile index 1b5fcb327..6c3120c72 100644 --- a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/project_benches/soc_ifc/sim/Makefile +++ b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/project_benches/soc_ifc/sim/Makefile @@ -87,6 +87,7 @@ include $(UVMF_VIP_LIBRARY_HOME)/interface_packages/soc_ifc_ctrl_pkg/Makefile include $(UVMF_VIP_LIBRARY_HOME)/interface_packages/cptra_ctrl_pkg/Makefile include $(UVMF_VIP_LIBRARY_HOME)/interface_packages/soc_ifc_status_pkg/Makefile include $(UVMF_VIP_LIBRARY_HOME)/interface_packages/cptra_status_pkg/Makefile +include $(UVMF_VIP_LIBRARY_HOME)/interface_packages/mbox_sram_pkg/Makefile # Include all requisite environment package targets for this bench include $(UVMF_VIP_LIBRARY_HOME)/environment_packages/soc_ifc_env_pkg/Makefile @@ -196,7 +197,7 @@ comp_hvl : comp_hvl_core comp_hvl_core : comp_qvip comp_qvip_utils_pkg \ - comp_soc_ifc_ctrl_pkg comp_cptra_ctrl_pkg comp_soc_ifc_status_pkg comp_cptra_status_pkg \ + comp_soc_ifc_ctrl_pkg comp_cptra_ctrl_pkg comp_soc_ifc_status_pkg comp_cptra_status_pkg comp_mbox_sram_pkg \ comp_soc_ifc_env_pkg \ comp_soc_ifc_parameters_pkg comp_soc_ifc_sequence_pkg comp_soc_ifc_tests_pkg @@ -204,7 +205,7 @@ comp_uvmf_core : comp_uvm_pkg comp_uvmf_base_pkg make_build: comp_soc_ifc_dut comp_uvmf_core comp_hvl comp_test_bench -hvl_build: q_comp_soc_ifc_ctrl_pkg q_comp_cptra_ctrl_pkg q_comp_soc_ifc_status_pkg q_comp_cptra_status_pkg comp_soc_ifc_env_pkg comp_soc_ifc_sequence_pkg comp_soc_ifc_tests_pkg hvl_comp_testbench link optimize +hvl_build: q_comp_soc_ifc_ctrl_pkg q_comp_cptra_ctrl_pkg q_comp_soc_ifc_status_pkg q_comp_cptra_status_pkg q_comp_mbox_sram_pkg comp_soc_ifc_env_pkg comp_soc_ifc_sequence_pkg comp_soc_ifc_tests_pkg hvl_comp_testbench link optimize vinfo_build: comp_qvip comp_soc_ifc_vhdl_dut build_hdl_vinfo build_hvl_vinfo $(VINFO_TGT) diff --git a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/project_benches/soc_ifc/sim/compile.do b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/project_benches/soc_ifc/sim/compile.do index ea7be28a2..f45e56a43 100644 --- a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/project_benches/soc_ifc/sim/compile.do +++ b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/project_benches/soc_ifc/sim/compile.do @@ -58,6 +58,7 @@ do $env(UVMF_VIP_LIBRARY_HOME)/interface_packages/soc_ifc_ctrl_pkg/compile.do do $env(UVMF_VIP_LIBRARY_HOME)/interface_packages/cptra_ctrl_pkg/compile.do do $env(UVMF_VIP_LIBRARY_HOME)/interface_packages/soc_ifc_status_pkg/compile.do do $env(UVMF_VIP_LIBRARY_HOME)/interface_packages/cptra_status_pkg/compile.do +do $env(UVMF_VIP_LIBRARY_HOME)/interface_packages/mbox_sram_pkg/compile.do ################################################################### ## UVMF ENVIRONMENT COMPILATION diff --git a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/project_benches/soc_ifc/sim/viswave.do b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/project_benches/soc_ifc/sim/viswave.do index 7fb0d70b7..58934106e 100644 --- a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/project_benches/soc_ifc/sim/viswave.do +++ b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/project_benches/soc_ifc/sim/viswave.do @@ -28,6 +28,12 @@ wave group cptra_status_agent_bus wave add -group cptra_status_agent_bus hdl_top.cptra_status_agent_bus.* -radix hexadecimal -tag F0 wave group cptra_status_agent_bus -collapse wave insertion [expr [wave index insertpoint] +1] +wave spacer -backgroundcolor Salmon { mbox_sram_agent } +wave add uvm_test_top.environment.mbox_sram_agent.mbox_sram_agent_monitor.txn_stream -radix string -tag F0 +wave group mbox_sram_agent_bus +wave add -group mbox_sram_agent_bus hdl_top.mbox_sram_agent_bus.* -radix hexadecimal -tag F0 +wave group mbox_sram_agent_bus -collapse +wave insertion [expr [wave index insertpoint] +1] wave update on WaveSetStreamView diff --git a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/project_benches/soc_ifc/sim/wave.do b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/project_benches/soc_ifc/sim/wave.do index 7e0fc1e33..1ba8a1615 100644 --- a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/project_benches/soc_ifc/sim/wave.do +++ b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/project_benches/soc_ifc/sim/wave.do @@ -15,6 +15,9 @@ add wave -noupdate -group soc_ifc_status_agent_bus /hdl_top/soc_ifc_status_agent add wave -noupdate -divider cptra_status_agent add wave -noupdate /uvm_root/uvm_test_top/environment/cptra_status_agent/cptra_status_agent_monitor/txn_stream add wave -noupdate -group cptra_status_agent_bus /hdl_top/cptra_status_agent_bus/* +add wave -noupdate -divider mbox_sram_agent +add wave -noupdate /uvm_root/uvm_test_top/environment/mbox_sram_agent/mbox_sram_agent_monitor/txn_stream +add wave -noupdate -group mbox_sram_agent_bus /hdl_top/mbox_sram_agent_bus/* TreeUpdate [SetDefaultTree] quietly wave cursor active 0 diff --git a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/project_benches/soc_ifc/soc_ifc_sve.F b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/project_benches/soc_ifc/soc_ifc_sve.F index c88496249..2114f41e2 100644 --- a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/project_benches/soc_ifc/soc_ifc_sve.F +++ b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/project_benches/soc_ifc/soc_ifc_sve.F @@ -12,6 +12,7 @@ -F ${UVMF_VIP_LIBRARY_HOME}/interface_packages/cptra_ctrl_pkg/cptra_ctrl_pkg_sve.F -F ${UVMF_VIP_LIBRARY_HOME}/interface_packages/soc_ifc_status_pkg/soc_ifc_status_pkg_sve.F -F ${UVMF_VIP_LIBRARY_HOME}/interface_packages/cptra_status_pkg/cptra_status_pkg_sve.F +-F ${UVMF_VIP_LIBRARY_HOME}/interface_packages/mbox_sram_pkg/mbox_sram_pkg_sve.F // Environment Files -F ${UVMF_VIP_LIBRARY_HOME}/environment_packages/soc_ifc_env_pkg/soc_ifc_env_pkg_sve.F diff --git a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/project_benches/soc_ifc/tb/parameters/soc_ifc_parameters_pkg.sv b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/project_benches/soc_ifc/tb/parameters/soc_ifc_parameters_pkg.sv index d6e073e1e..af3cb9a50 100644 --- a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/project_benches/soc_ifc/tb/parameters/soc_ifc_parameters_pkg.sv +++ b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/project_benches/soc_ifc/tb/parameters/soc_ifc_parameters_pkg.sv @@ -45,6 +45,7 @@ package soc_ifc_parameters_pkg; parameter string cptra_ctrl_agent_BFM = "cptra_ctrl_agent_BFM"; /* [3] */ parameter string soc_ifc_status_agent_BFM = "soc_ifc_status_agent_BFM"; /* [4] */ parameter string cptra_status_agent_BFM = "cptra_status_agent_BFM"; /* [5] */ + parameter string mbox_sram_agent_BFM = "mbox_sram_agent_BFM"; /* [6] */ // pragma uvmf custom package_item_additional begin // pragma uvmf custom package_item_additional end diff --git a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/project_benches/soc_ifc/tb/sequences/soc_ifc_sequences_pkg.compile b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/project_benches/soc_ifc/tb/sequences/soc_ifc_sequences_pkg.compile index 1243f5665..943dc7955 100644 --- a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/project_benches/soc_ifc/tb/sequences/soc_ifc_sequences_pkg.compile +++ b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/project_benches/soc_ifc/tb/sequences/soc_ifc_sequences_pkg.compile @@ -4,6 +4,7 @@ needs: - ../../../../verification_ip/interface_packages/cptra_ctrl_pkg/cptra_ctrl.compile - ../../../../verification_ip/interface_packages/soc_ifc_status_pkg/soc_ifc_status.compile - ../../../../verification_ip/interface_packages/cptra_status_pkg/cptra_status.compile + - ../../../../verification_ip/interface_packages/mbox_sram_pkg/mbox_sram.compile - ../../../../verification_ip/environment_packages/soc_ifc_env_pkg/soc_ifc_env_pkg.compile - ../parameters/soc_ifc_parameters_pkg.compile src: diff --git a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/project_benches/soc_ifc/tb/sequences/soc_ifc_sequences_pkg.sv b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/project_benches/soc_ifc/tb/sequences/soc_ifc_sequences_pkg.sv index f109f898e..2c25d7490 100644 --- a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/project_benches/soc_ifc/tb/sequences/soc_ifc_sequences_pkg.sv +++ b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/project_benches/soc_ifc/tb/sequences/soc_ifc_sequences_pkg.sv @@ -47,6 +47,8 @@ package soc_ifc_sequences_pkg; import soc_ifc_status_pkg_hdl::*; import cptra_status_pkg::*; import cptra_status_pkg_hdl::*; + import mbox_sram_pkg::*; + import mbox_sram_pkg_hdl::*; import soc_ifc_parameters_pkg::*; import soc_ifc_env_pkg::*; import qvip_ahb_lite_slave_params_pkg::*; diff --git a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/project_benches/soc_ifc/tb/sequences/soc_ifc_sequences_pkg.vinfo b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/project_benches/soc_ifc/tb/sequences/soc_ifc_sequences_pkg.vinfo index fea3885f7..035e660ea 100644 --- a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/project_benches/soc_ifc/tb/sequences/soc_ifc_sequences_pkg.vinfo +++ b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/project_benches/soc_ifc/tb/sequences/soc_ifc_sequences_pkg.vinfo @@ -3,6 +3,7 @@ @use $UVMF_VIP_LIBRARY_HOME/interface_packages/cptra_ctrl_pkg/cptra_ctrl_pkg.vinfo @use $UVMF_VIP_LIBRARY_HOME/interface_packages/soc_ifc_status_pkg/soc_ifc_status_pkg.vinfo @use $UVMF_VIP_LIBRARY_HOME/interface_packages/cptra_status_pkg/cptra_status_pkg.vinfo +@use $UVMF_VIP_LIBRARY_HOME/interface_packages/mbox_sram_pkg/mbox_sram_pkg.vinfo @use $UVMF_VIP_LIBRARY_HOME/environment_packages/soc_ifc_env_pkg/soc_ifc_env_pkg.vinfo @use $UVMF_PROJECT_DIR/tb/parameters/soc_ifc_parameters_pkg.vinfo +incdir+@vinfodir diff --git a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/project_benches/soc_ifc/tb/sequences/src/register_test_sequence.svh b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/project_benches/soc_ifc/tb/sequences/src/register_test_sequence.svh index 09993ee2a..85a802e5d 100644 --- a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/project_benches/soc_ifc/tb/sequences/src/register_test_sequence.svh +++ b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/project_benches/soc_ifc/tb/sequences/src/register_test_sequence.svh @@ -55,6 +55,7 @@ class register_test_sequence extends soc_ifc_bench_sequence_base; cptra_ctrl_agent_config.wait_for_reset(); soc_ifc_status_agent_config.wait_for_reset(); cptra_status_agent_config.wait_for_reset(); + mbox_sram_agent_config.wait_for_reset(); // pragma uvmf custom register_test_reset end join diff --git a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/project_benches/soc_ifc/tb/sequences/src/soc_ifc_bench_sequence_base.svh b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/project_benches/soc_ifc/tb/sequences/src/soc_ifc_bench_sequence_base.svh index d3465bf39..3dfaeaac9 100644 --- a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/project_benches/soc_ifc/tb/sequences/src/soc_ifc_bench_sequence_base.svh +++ b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/project_benches/soc_ifc/tb/sequences/src/soc_ifc_bench_sequence_base.svh @@ -56,6 +56,8 @@ rand soc_ifc_env_sequence_base_t soc_ifc_env_seq; soc_ifc_status_agent_responder_seq_t soc_ifc_status_agent_responder_seq; typedef cptra_status_responder_sequence cptra_status_agent_responder_seq_t; cptra_status_agent_responder_seq_t cptra_status_agent_responder_seq; + typedef mbox_sram_responder_sequence mbox_sram_agent_responder_seq_t; + mbox_sram_agent_responder_seq_t mbox_sram_agent_responder_seq; // pragma uvmf custom sequences end // Sequencer handles for each active interface in the environment @@ -67,6 +69,8 @@ rand soc_ifc_env_sequence_base_t soc_ifc_env_seq; uvm_sequencer #(soc_ifc_status_agent_transaction_t) soc_ifc_status_agent_sequencer; typedef cptra_status_transaction cptra_status_agent_transaction_t; uvm_sequencer #(cptra_status_agent_transaction_t) cptra_status_agent_sequencer; + typedef mbox_sram_transaction mbox_sram_agent_transaction_t; + uvm_sequencer #(mbox_sram_agent_transaction_t) mbox_sram_agent_sequencer; // Sequencer handles for each QVIP interface mvc_sequencer uvm_test_top_environment_qvip_ahb_lite_slave_subenv_ahb_lite_slave_0_sqr; @@ -80,6 +84,7 @@ rand soc_ifc_env_sequence_base_t soc_ifc_env_seq; cptra_ctrl_configuration cptra_ctrl_agent_config; soc_ifc_status_configuration soc_ifc_status_agent_config; cptra_status_configuration cptra_status_agent_config; + mbox_sram_configuration mbox_sram_agent_config; // Local handle to register model for convenience soc_ifc_reg_model_top reg_model; uvm_status_e status; @@ -107,12 +112,15 @@ rand soc_ifc_env_sequence_base_t soc_ifc_env_seq; `uvm_fatal("CFG" , "uvm_config_db #( soc_ifc_status_configuration )::get cannot find resource soc_ifc_status_agent_BFM" ) if( !uvm_config_db #( cptra_status_configuration )::get( null , UVMF_CONFIGURATIONS , cptra_status_agent_BFM , cptra_status_agent_config ) ) `uvm_fatal("CFG" , "uvm_config_db #( cptra_status_configuration )::get cannot find resource cptra_status_agent_BFM" ) + if( !uvm_config_db #( mbox_sram_configuration )::get( null , UVMF_CONFIGURATIONS , mbox_sram_agent_BFM , mbox_sram_agent_config ) ) + `uvm_fatal("CFG" , "uvm_config_db #( mbox_sram_configuration )::get cannot find resource mbox_sram_agent_BFM" ) // Assign the sequencer handles from the handles within agent configurations soc_ifc_ctrl_agent_sequencer = soc_ifc_ctrl_agent_config.get_sequencer(); cptra_ctrl_agent_sequencer = cptra_ctrl_agent_config.get_sequencer(); soc_ifc_status_agent_sequencer = soc_ifc_status_agent_config.get_sequencer(); cptra_status_agent_sequencer = cptra_status_agent_config.get_sequencer(); + mbox_sram_agent_sequencer = mbox_sram_agent_config.get_sequencer(); // Retrieve QVIP sequencer handles from the uvm_config_db if( !uvm_config_db #(mvc_sequencer)::get( null,UVMF_SEQUENCERS,"uvm_test_top.environment.qvip_ahb_lite_slave_subenv.ahb_lite_slave_0", uvm_test_top_environment_qvip_ahb_lite_slave_subenv_ahb_lite_slave_0_sqr) ) @@ -139,17 +147,20 @@ rand soc_ifc_env_sequence_base_t soc_ifc_env_seq; cptra_ctrl_agent_random_seq = cptra_ctrl_agent_random_seq_t::type_id::create("cptra_ctrl_agent_random_seq"); soc_ifc_status_agent_responder_seq = soc_ifc_status_agent_responder_seq_t::type_id::create("soc_ifc_status_agent_responder_seq"); cptra_status_agent_responder_seq = cptra_status_agent_responder_seq_t::type_id::create("cptra_status_agent_responder_seq"); + mbox_sram_agent_responder_seq = mbox_sram_agent_responder_seq_t::type_id::create("mbox_sram_agent_responder_seq"); fork soc_ifc_ctrl_agent_config.wait_for_reset(); cptra_ctrl_agent_config.wait_for_reset(); soc_ifc_status_agent_config.wait_for_reset(); cptra_status_agent_config.wait_for_reset(); + mbox_sram_agent_config.wait_for_reset(); join reg_model.reset(); // Start RESPONDER sequences here fork soc_ifc_status_agent_responder_seq.start(soc_ifc_status_agent_sequencer); cptra_status_agent_responder_seq.start(cptra_status_agent_sequencer); + mbox_sram_agent_responder_seq.start(mbox_sram_agent_sequencer); join_none // Start INITIATOR sequences here fork @@ -167,6 +178,7 @@ soc_ifc_env_seq.start(top_configuration.vsqr); cptra_ctrl_agent_config.wait_for_num_clocks(400); soc_ifc_status_agent_config.wait_for_num_clocks(400); cptra_status_agent_config.wait_for_num_clocks(400); + mbox_sram_agent_config.wait_for_num_clocks(400); join // pragma uvmf custom body end diff --git a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/project_benches/soc_ifc/tb/sequences/src/soc_ifc_cmdline_test_sequence.svh b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/project_benches/soc_ifc/tb/sequences/src/soc_ifc_cmdline_test_sequence.svh index 2d04e5be8..75c9e8608 100644 --- a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/project_benches/soc_ifc/tb/sequences/src/soc_ifc_cmdline_test_sequence.svh +++ b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/project_benches/soc_ifc/tb/sequences/src/soc_ifc_cmdline_test_sequence.svh @@ -36,6 +36,7 @@ class soc_ifc_cmdline_test_sequence extends soc_ifc_bench_sequence_base; rand soc_ifc_env_bringup_sequence_t soc_ifc_env_bringup_seq; rand soc_ifc_env_cptra_rst_wait_sequence_t soc_ifc_env_cptra_rst_wait_seq; + rand soc_ifc_env_cptra_init_interrupts_sequence_t soc_ifc_env_cptra_init_interrupts_seq; function new(string name = "" ); super.new(name); @@ -53,20 +54,25 @@ class soc_ifc_cmdline_test_sequence extends soc_ifc_bench_sequence_base; soc_ifc_env_bringup_seq = soc_ifc_env_bringup_sequence_t::type_id::create("soc_ifc_env_bringup_seq"); soc_ifc_env_cptra_rst_wait_seq = soc_ifc_env_cptra_rst_wait_sequence_t::type_id::create("soc_ifc_env_cptra_rst_wait_seq"); + soc_ifc_env_cptra_init_interrupts_seq = soc_ifc_env_cptra_init_interrupts_sequence_t::type_id::create("soc_ifc_env_cptra_init_interrupts_seq"); + soc_ifc_ctrl_agent_random_seq = soc_ifc_ctrl_agent_random_seq_t::type_id::create("soc_ifc_ctrl_agent_random_seq"); cptra_ctrl_agent_random_seq = cptra_ctrl_agent_random_seq_t::type_id::create("cptra_ctrl_agent_random_seq"); soc_ifc_status_agent_responder_seq = soc_ifc_status_agent_responder_seq_t::type_id::create("soc_ifc_status_agent_responder_seq"); cptra_status_agent_responder_seq = cptra_status_agent_responder_seq_t::type_id::create("cptra_status_agent_responder_seq"); + mbox_sram_agent_responder_seq = mbox_sram_agent_responder_seq_t::type_id::create("mbox_sram_agent_responder_seq"); // Handle to the responder sequence for getting response transactions soc_ifc_env_bringup_seq.soc_ifc_status_agent_rsp_seq = soc_ifc_status_agent_responder_seq; soc_ifc_env_cptra_rst_wait_seq.cptra_status_agent_rsp_seq = cptra_status_agent_responder_seq; + soc_ifc_env_cptra_init_interrupts_seq.cptra_status_agent_rsp_seq = cptra_status_agent_responder_seq; reg_model.reset(); // Start RESPONDER sequences here fork soc_ifc_status_agent_responder_seq.start(soc_ifc_status_agent_sequencer); cptra_status_agent_responder_seq.start(cptra_status_agent_sequencer); + mbox_sram_agent_responder_seq.start(mbox_sram_agent_sequencer); join_none // Start INITIATOR sequences here @@ -84,6 +90,12 @@ class soc_ifc_cmdline_test_sequence extends soc_ifc_bench_sequence_base; end join + // Always initialize interrupts + // TODO - if we make this random, we can test both interrupt-driven and + // polling behavior + soc_ifc_env_cptra_init_interrupts_seq.start(top_configuration.vsqr); + `uvm_info("SOC_IFC_CMDLINE_TEST", "Completed interrupt init", UVM_MEDIUM) + // Run cmdline provided env sequences clp = uvm_cmdline_processor::get_inst(); if (!clp.get_arg_values("+CLP_SEQ=", seq_names)) @@ -115,6 +127,7 @@ class soc_ifc_cmdline_test_sequence extends soc_ifc_bench_sequence_base; cptra_ctrl_agent_config.wait_for_num_clocks(400); soc_ifc_status_agent_config.wait_for_num_clocks(400); cptra_status_agent_config.wait_for_num_clocks(400); + mbox_sram_agent_config.wait_for_num_clocks(400); join // pragma uvmf custom body end diff --git a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/project_benches/soc_ifc/tb/sequences/src/soc_ifc_rand_test_sequence.svh b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/project_benches/soc_ifc/tb/sequences/src/soc_ifc_rand_test_sequence.svh index 0f1f2d6b9..d2ef25610 100644 --- a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/project_benches/soc_ifc/tb/sequences/src/soc_ifc_rand_test_sequence.svh +++ b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/project_benches/soc_ifc/tb/sequences/src/soc_ifc_rand_test_sequence.svh @@ -34,6 +34,7 @@ class soc_ifc_rand_test_sequence extends soc_ifc_bench_sequence_base; rand soc_ifc_env_bringup_sequence_t soc_ifc_env_bringup_seq; rand soc_ifc_env_cptra_rst_wait_sequence_t soc_ifc_env_cptra_rst_wait_seq; + rand soc_ifc_env_cptra_init_interrupts_sequence_t soc_ifc_env_cptra_init_interrupts_seq; rand soc_ifc_env_pauser_init_sequence_t soc_ifc_env_pauser_init_seq; rand soc_ifc_env_sequence_base_t soc_ifc_env_seq_ii[]; // TODO: To add new sequences to the randomized portion of this test: @@ -43,16 +44,29 @@ class soc_ifc_rand_test_sequence extends soc_ifc_bench_sequence_base; rand enum int { IDX_SOC_IFC_ENV_MBOX_TOP_RAND_SMALL, IDX_SOC_IFC_ENV_MBOX_TOP_RAND_MEDIUM, + IDX_SOC_IFC_ENV_MBOX_TOP_RAND_LARGE, + IDX_SOC_IFC_ENV_MBOX_TOP_MIN, + IDX_SOC_IFC_ENV_MBOX_TOP_MAX, IDX_SOC_IFC_ENV_MBOX_TOP_RAND_SMALL_UNLOCK, IDX_SOC_IFC_ENV_MBOX_TOP_RAND_MEDIUM_UNLOCK, + IDX_SOC_IFC_ENV_MBOX_TOP_RAND_LARGE_UNLOCK, IDX_SOC_IFC_ENV_MBOX_TOP_CONTENTION, IDX_SOC_IFC_ENV_MBOX_TOP_RAND_PAUSER_SMALL, IDX_SOC_IFC_ENV_MBOX_TOP_RAND_PAUSER_MEDIUM, + IDX_SOC_IFC_ENV_MBOX_TOP_RAND_PAUSER_LARGE, IDX_SOC_IFC_ENV_MBOX_TOP_RAND_PAUSER_SMALL_UNLOCK, IDX_SOC_IFC_ENV_MBOX_TOP_RAND_PAUSER_MEDIUM_UNLOCK, + IDX_SOC_IFC_ENV_MBOX_TOP_RAND_PAUSER_LARGE_UNLOCK, + IDX_SOC_IFC_ENV_MBOX_TOP_RAND_DELAY_SMALL, + IDX_SOC_IFC_ENV_MBOX_TOP_RAND_DELAY_MEDIUM, + IDX_SOC_IFC_ENV_MBOX_TOP_RAND_DELAY_LARGE, + IDX_SOC_IFC_ENV_MBOX_TOP_REG_AXS_INV_SMALL, + IDX_SOC_IFC_ENV_MBOX_TOP_REG_AXS_INV_MEDIUM, + IDX_SOC_IFC_ENV_MBOX_TOP_REG_AXS_INV_LARGE, IDX_SOC_IFC_ENV_MBOX_TOP_DLEN_VIOLATION, IDX_SOC_IFC_ENV_MBOX_TOP_MULTI_AGENT, IDX_SOC_IFC_ENV_CPTRA_MBOX_TOP_RAND_SMALL, + IDX_SOC_IFC_ENV_CPTRA_MBOX_TOP_REG_AXS_INV_SMALL, IDX_SOC_IFC_ENV_RST_WARM, IDX_SOC_IFC_ENV_RST_COLD, IDX_SOC_IFC_ENV_MBOX_RST_WARM_RAND_MEDIUM, @@ -66,34 +80,73 @@ class soc_ifc_rand_test_sequence extends soc_ifc_bench_sequence_base; rand_seq_idx dist { IDX_SOC_IFC_ENV_MBOX_TOP_RAND_SMALL := 25, IDX_SOC_IFC_ENV_MBOX_TOP_RAND_MEDIUM := 25, + IDX_SOC_IFC_ENV_MBOX_TOP_RAND_LARGE := 1, + IDX_SOC_IFC_ENV_MBOX_TOP_MIN := 25, + IDX_SOC_IFC_ENV_MBOX_TOP_MAX := 1, IDX_SOC_IFC_ENV_MBOX_TOP_RAND_SMALL_UNLOCK := 25, IDX_SOC_IFC_ENV_MBOX_TOP_RAND_MEDIUM_UNLOCK := 25, + IDX_SOC_IFC_ENV_MBOX_TOP_RAND_LARGE_UNLOCK := 1, IDX_SOC_IFC_ENV_MBOX_TOP_CONTENTION := 25, IDX_SOC_IFC_ENV_MBOX_TOP_RAND_PAUSER_SMALL := 25, IDX_SOC_IFC_ENV_MBOX_TOP_RAND_PAUSER_MEDIUM := 25, + IDX_SOC_IFC_ENV_MBOX_TOP_RAND_PAUSER_LARGE := 1, IDX_SOC_IFC_ENV_MBOX_TOP_RAND_PAUSER_SMALL_UNLOCK := 25, IDX_SOC_IFC_ENV_MBOX_TOP_RAND_PAUSER_MEDIUM_UNLOCK := 25, - IDX_SOC_IFC_ENV_MBOX_TOP_DLEN_VIOLATION := 0, /*FIXME re-enable this after resolving data mismatch error */ + IDX_SOC_IFC_ENV_MBOX_TOP_RAND_PAUSER_LARGE_UNLOCK := 1, + IDX_SOC_IFC_ENV_MBOX_TOP_RAND_DELAY_SMALL := 25, + IDX_SOC_IFC_ENV_MBOX_TOP_RAND_DELAY_MEDIUM := 25, + IDX_SOC_IFC_ENV_MBOX_TOP_RAND_DELAY_LARGE := 1, + IDX_SOC_IFC_ENV_MBOX_TOP_REG_AXS_INV_SMALL := 25, + IDX_SOC_IFC_ENV_MBOX_TOP_REG_AXS_INV_MEDIUM := 25, + IDX_SOC_IFC_ENV_MBOX_TOP_REG_AXS_INV_LARGE := 1, + IDX_SOC_IFC_ENV_MBOX_TOP_DLEN_VIOLATION := 25, IDX_SOC_IFC_ENV_MBOX_TOP_MULTI_AGENT := 10, IDX_SOC_IFC_ENV_CPTRA_MBOX_TOP_RAND_SMALL := 25, + IDX_SOC_IFC_ENV_CPTRA_MBOX_TOP_REG_AXS_INV_SMALL := 25, IDX_SOC_IFC_ENV_RST_WARM := 1, IDX_SOC_IFC_ENV_RST_COLD := 1, IDX_SOC_IFC_ENV_MBOX_RST_WARM_RAND_MEDIUM := 10, IDX_SOC_IFC_ENV_MBOX_RST_COLD_RAND_MEDIUM := 10 }; } + constraint disable_long_env_seqs_c { + !(rand_seq_idx inside {IDX_SOC_IFC_ENV_MBOX_TOP_RAND_LARGE, + IDX_SOC_IFC_ENV_MBOX_TOP_MAX, + IDX_SOC_IFC_ENV_MBOX_TOP_RAND_LARGE_UNLOCK, + IDX_SOC_IFC_ENV_MBOX_TOP_RAND_PAUSER_LARGE, + IDX_SOC_IFC_ENV_MBOX_TOP_RAND_PAUSER_LARGE_UNLOCK, + IDX_SOC_IFC_ENV_MBOX_TOP_RAND_DELAY_MEDIUM, + IDX_SOC_IFC_ENV_MBOX_TOP_RAND_DELAY_LARGE, + IDX_SOC_IFC_ENV_MBOX_TOP_DLEN_VIOLATION, + IDX_SOC_IFC_ENV_MBOX_TOP_REG_AXS_INV_LARGE, + IDX_SOC_IFC_ENV_MBOX_TOP_MULTI_AGENT}); + } // FIXME we're also running multiple iterations of this testcase in the regression. // What is the criteria for iteration count WITHIN the sequence? constraint iter_count_c { iteration_count inside {[1:10]}; } + constraint iter_count_short_c { + iteration_count < 5; + } function new(string name = "" ); super.new(name); + // The short test suite is used in promote pipeline to quickly check for UVM issues + if ($test$plusargs("CLP_SHORT_SUITE")) begin + this.disable_long_env_seqs_c.constraint_mode(1); + this.iter_count_short_c.constraint_mode(1); + end + else begin + this.disable_long_env_seqs_c.constraint_mode(0); + this.iter_count_short_c.constraint_mode(0); + end + // Users can manually override the number of random iterations to any desired value if ($value$plusargs("SOC_IFC_RAND_ITER=%0d", iteration_count)) begin `uvm_info("SOC_IFC_RAND_TEST", $sformatf("Received Command Line Iteration Count Argument of %0d", iteration_count), UVM_LOW); iteration_count.rand_mode(0); this.iter_count_c.constraint_mode(0); + this.iter_count_short_c.constraint_mode(0); end else begin if (!this.randomize(iteration_count)) @@ -111,20 +164,25 @@ class soc_ifc_rand_test_sequence extends soc_ifc_bench_sequence_base; uvm_object obj; int ii; bit do_pauser_init; + int unsigned mbox_ecc_single_error_burst; + int unsigned mbox_ecc_single_error_delay_clocks; soc_ifc_env_bringup_seq = soc_ifc_env_bringup_sequence_t::type_id::create("soc_ifc_env_bringup_seq"); soc_ifc_env_cptra_rst_wait_seq = soc_ifc_env_cptra_rst_wait_sequence_t::type_id::create("soc_ifc_env_cptra_rst_wait_seq"); - soc_ifc_env_pauser_init_seq = soc_ifc_env_pauser_init_sequence_t::type_id::create("soc_ifc_env_pauser_init_seq"); + soc_ifc_env_cptra_init_interrupts_seq = soc_ifc_env_cptra_init_interrupts_sequence_t::type_id::create("soc_ifc_env_cptra_init_interrupts_seq"); + soc_ifc_env_pauser_init_seq = soc_ifc_env_pauser_init_sequence_t::type_id::create("soc_ifc_env_pauser_init_seq"); soc_ifc_ctrl_agent_random_seq = soc_ifc_ctrl_agent_random_seq_t::type_id::create("soc_ifc_ctrl_agent_random_seq"); cptra_ctrl_agent_random_seq = cptra_ctrl_agent_random_seq_t::type_id::create("cptra_ctrl_agent_random_seq"); soc_ifc_status_agent_responder_seq = soc_ifc_status_agent_responder_seq_t::type_id::create("soc_ifc_status_agent_responder_seq"); cptra_status_agent_responder_seq = cptra_status_agent_responder_seq_t::type_id::create("cptra_status_agent_responder_seq"); + mbox_sram_agent_responder_seq = mbox_sram_agent_responder_seq_t::type_id::create("mbox_sram_agent_responder_seq"); // Handle to the responder sequence for getting response transactions soc_ifc_env_bringup_seq.soc_ifc_status_agent_rsp_seq = soc_ifc_status_agent_responder_seq; soc_ifc_env_cptra_rst_wait_seq.cptra_status_agent_rsp_seq = cptra_status_agent_responder_seq; + soc_ifc_env_cptra_init_interrupts_seq.cptra_status_agent_rsp_seq = cptra_status_agent_responder_seq; soc_ifc_env_pauser_init_seq.soc_ifc_status_agent_rsp_seq = soc_ifc_status_agent_responder_seq; // fork @@ -138,9 +196,25 @@ class soc_ifc_rand_test_sequence extends soc_ifc_bench_sequence_base; fork soc_ifc_status_agent_responder_seq.start(soc_ifc_status_agent_sequencer); cptra_status_agent_responder_seq.start(cptra_status_agent_sequencer); + mbox_sram_agent_responder_seq.start(mbox_sram_agent_sequencer); join_none // Start INITIATOR sequences here + fork + forever begin + if (!std::randomize(mbox_ecc_single_error_burst,mbox_ecc_single_error_delay_clocks) with {mbox_ecc_single_error_burst dist {1 :/ 1000, [2:5] :/ 100, [6:31] :/ 20, [32:131071] :/ 1, [131072:524288] :/ 1}; + mbox_ecc_single_error_delay_clocks dist {1 :/ 1, [2:31] :/ 3, [32:127] :/ 5, [128:1023] :/ 3, [1024:131072] :/ 1}; }) + `uvm_fatal("SOC_IFC_RAND_TEST", "Failed to randomize mbox ecc bit flip injection parameters") + else + `uvm_info("SOC_IFC_RAND_TEST", $sformatf("Randomized mbox ecc bit flip injection parameters: burst [%0d] delay [%0d clocks]", mbox_ecc_single_error_burst, mbox_ecc_single_error_delay_clocks), UVM_DEBUG) + soc_ifc_ctrl_agent_config.wait_for_num_clocks(mbox_ecc_single_error_delay_clocks); + `uvm_info("SOC_IFC_RAND_TEST", $sformatf("Injecting mbox ecc error with burst [%0d]", mbox_ecc_single_error_burst), UVM_DEBUG) + repeat(mbox_ecc_single_error_burst) begin + mbox_sram_agent_config.inject_ecc_error |= 2'b01; + @mbox_sram_agent_responder_seq.new_rsp; + end + end + join_none fork begin // Bringup (set pwrgood, deassert cptra_rst_b, write fuses) @@ -155,17 +229,26 @@ class soc_ifc_rand_test_sequence extends soc_ifc_bench_sequence_base; end join - // Choose whether or not to initialize/lock PAUSER valid values at random - if (!std::randomize(do_pauser_init) with { do_pauser_init dist {0:/25, 1:/75}; }) - `uvm_error("SOC_IFC_RAND_TEST", "Failed to randomize do_pauser_init") - else if (do_pauser_init) begin - if(!soc_ifc_env_pauser_init_seq.randomize()) - `uvm_fatal("SOC_IFC_RAND_TEST", "soc_ifc_rand_test_sequence::body() - soc_ifc_env_pauser_init_seq randomization failed"); - soc_ifc_env_pauser_init_seq.start(top_configuration.vsqr); - end - else begin - `uvm_info("SOC_IFC_RAND_TEST", "Skipping PAUSER init", UVM_MEDIUM) - end + fork + // Choose whether or not to initialize/lock PAUSER valid values at random + if (!std::randomize(do_pauser_init) with { do_pauser_init dist {0:/25, 1:/75}; }) + `uvm_error("SOC_IFC_RAND_TEST", "Failed to randomize do_pauser_init") + else if (do_pauser_init) begin + if(!soc_ifc_env_pauser_init_seq.randomize()) + `uvm_fatal("SOC_IFC_RAND_TEST", "soc_ifc_rand_test_sequence::body() - soc_ifc_env_pauser_init_seq randomization failed"); + soc_ifc_env_pauser_init_seq.start(top_configuration.vsqr); + end + else begin + `uvm_info("SOC_IFC_RAND_TEST", "Skipping PAUSER init", UVM_MEDIUM) + end + // Always initialize interrupts + // TODO - if we make this random, we can test both interrupt-driven and + // polling behavior + begin + soc_ifc_env_cptra_init_interrupts_seq.start(top_configuration.vsqr); + `uvm_info("SOC_IFC_RAND_TEST", "Completed interrupt init", UVM_MEDIUM) + end + join for (ii = 0; ii < iteration_count; ii++) begin: RAND_LOOP if(!this.randomize(rand_seq_idx)) `uvm_fatal("SOC_IFC_RAND_TEST", "Failed to randomize rand_seq_idx"); @@ -176,26 +259,52 @@ class soc_ifc_rand_test_sequence extends soc_ifc_bench_sequence_base; obj = soc_ifc_env_top_mbox_rand_small_sequence_t::get_type().create_object($sformatf("soc_ifc_env_seq_ii[%0d]",ii)); IDX_SOC_IFC_ENV_MBOX_TOP_RAND_MEDIUM: obj = soc_ifc_env_top_mbox_rand_medium_sequence_t::get_type().create_object($sformatf("soc_ifc_env_seq_ii[%0d]",ii)); + IDX_SOC_IFC_ENV_MBOX_TOP_RAND_LARGE: + obj = soc_ifc_env_top_mbox_rand_large_sequence_t::get_type().create_object($sformatf("soc_ifc_env_seq_ii[%0d]",ii)); + IDX_SOC_IFC_ENV_MBOX_TOP_MIN: + obj = soc_ifc_env_top_mbox_min_sequence_t::get_type().create_object($sformatf("soc_ifc_env_seq_ii[%0d]",ii)); + IDX_SOC_IFC_ENV_MBOX_TOP_MAX: + obj = soc_ifc_env_top_mbox_max_sequence_t::get_type().create_object($sformatf("soc_ifc_env_seq_ii[%0d]",ii)); IDX_SOC_IFC_ENV_MBOX_TOP_RAND_SMALL_UNLOCK: obj = soc_ifc_env_top_mbox_rand_small_unlock_sequence_t::get_type().create_object($sformatf("soc_ifc_env_seq_ii[%0d]",ii)); IDX_SOC_IFC_ENV_MBOX_TOP_RAND_MEDIUM_UNLOCK: obj = soc_ifc_env_top_mbox_rand_medium_unlock_sequence_t::get_type().create_object($sformatf("soc_ifc_env_seq_ii[%0d]",ii)); + IDX_SOC_IFC_ENV_MBOX_TOP_RAND_LARGE_UNLOCK: + obj = soc_ifc_env_top_mbox_rand_large_unlock_sequence_t::get_type().create_object($sformatf("soc_ifc_env_seq_ii[%0d]",ii)); IDX_SOC_IFC_ENV_MBOX_TOP_CONTENTION: obj = soc_ifc_env_top_mbox_contention_sequence_t::get_type().create_object($sformatf("soc_ifc_env_seq_ii[%0d]",ii)); IDX_SOC_IFC_ENV_MBOX_TOP_RAND_PAUSER_SMALL: obj = soc_ifc_env_top_mbox_rand_pauser_small_sequence_t::get_type().create_object($sformatf("soc_ifc_env_seq_ii[%0d]",ii)); IDX_SOC_IFC_ENV_MBOX_TOP_RAND_PAUSER_MEDIUM: obj = soc_ifc_env_top_mbox_rand_pauser_medium_sequence_t::get_type().create_object($sformatf("soc_ifc_env_seq_ii[%0d]",ii)); + IDX_SOC_IFC_ENV_MBOX_TOP_RAND_PAUSER_LARGE: + obj = soc_ifc_env_top_mbox_rand_pauser_large_sequence_t::get_type().create_object($sformatf("soc_ifc_env_seq_ii[%0d]",ii)); IDX_SOC_IFC_ENV_MBOX_TOP_RAND_PAUSER_SMALL_UNLOCK: obj = soc_ifc_env_top_mbox_rand_pauser_small_unlock_sequence_t::get_type().create_object($sformatf("soc_ifc_env_seq_ii[%0d]",ii)); IDX_SOC_IFC_ENV_MBOX_TOP_RAND_PAUSER_MEDIUM_UNLOCK: obj = soc_ifc_env_top_mbox_rand_pauser_medium_unlock_sequence_t::get_type().create_object($sformatf("soc_ifc_env_seq_ii[%0d]",ii)); + IDX_SOC_IFC_ENV_MBOX_TOP_RAND_PAUSER_LARGE_UNLOCK: + obj = soc_ifc_env_top_mbox_rand_pauser_large_unlock_sequence_t::get_type().create_object($sformatf("soc_ifc_env_seq_ii[%0d]",ii)); + IDX_SOC_IFC_ENV_MBOX_TOP_RAND_DELAY_SMALL: + obj = soc_ifc_env_top_mbox_rand_delay_small_sequence_t::get_type().create_object($sformatf("soc_ifc_env_seq_ii[%0d]",ii)); + IDX_SOC_IFC_ENV_MBOX_TOP_RAND_DELAY_MEDIUM: + obj = soc_ifc_env_top_mbox_rand_delay_medium_sequence_t::get_type().create_object($sformatf("soc_ifc_env_seq_ii[%0d]",ii)); + IDX_SOC_IFC_ENV_MBOX_TOP_RAND_DELAY_LARGE: + obj = soc_ifc_env_top_mbox_rand_delay_large_sequence_t::get_type().create_object($sformatf("soc_ifc_env_seq_ii[%0d]",ii)); + IDX_SOC_IFC_ENV_MBOX_TOP_REG_AXS_INV_SMALL: + obj = soc_ifc_env_top_mbox_reg_axs_invalid_small_sequence_t::get_type().create_object($sformatf("soc_ifc_env_seq_ii[%0d]",ii)); + IDX_SOC_IFC_ENV_MBOX_TOP_REG_AXS_INV_MEDIUM: + obj = soc_ifc_env_top_mbox_reg_axs_invalid_medium_sequence_t::get_type().create_object($sformatf("soc_ifc_env_seq_ii[%0d]",ii)); + IDX_SOC_IFC_ENV_MBOX_TOP_REG_AXS_INV_LARGE: + obj = soc_ifc_env_top_mbox_reg_axs_invalid_large_sequence_t::get_type().create_object($sformatf("soc_ifc_env_seq_ii[%0d]",ii)); IDX_SOC_IFC_ENV_MBOX_TOP_DLEN_VIOLATION: obj = soc_ifc_env_top_mbox_dlen_violation_sequence_t::get_type().create_object($sformatf("soc_ifc_env_seq_ii[%0d]",ii)); IDX_SOC_IFC_ENV_MBOX_TOP_MULTI_AGENT: obj = soc_ifc_env_top_mbox_multi_agent_sequence_t::get_type().create_object($sformatf("soc_ifc_env_seq_ii[%0d]",ii)); IDX_SOC_IFC_ENV_CPTRA_MBOX_TOP_RAND_SMALL: obj = soc_ifc_env_top_cptra_mbox_rand_small_sequence_t::get_type().create_object($sformatf("soc_ifc_env_seq_ii[%0d]",ii)); + IDX_SOC_IFC_ENV_CPTRA_MBOX_TOP_REG_AXS_INV_SMALL: + obj = soc_ifc_env_top_cptra_mbox_reg_axs_invalid_small_sequence_t::get_type().create_object($sformatf("soc_ifc_env_seq_ii[%0d]",ii)); IDX_SOC_IFC_ENV_RST_WARM: obj = soc_ifc_env_top_reset_warm_sequence_t::get_type().create_object($sformatf("soc_ifc_env_seq_ii[%0d]",ii)); IDX_SOC_IFC_ENV_RST_COLD: @@ -217,6 +326,20 @@ class soc_ifc_rand_test_sequence extends soc_ifc_bench_sequence_base; soc_ifc_env_seq_ii[ii].soc_ifc_status_agent_rsp_seq = soc_ifc_status_agent_responder_seq; soc_ifc_env_seq_ii[ii].cptra_status_agent_rsp_seq = cptra_status_agent_responder_seq; soc_ifc_env_seq_ii[ii].start(top_configuration.vsqr); + + // If the last run sequence triggered a reset, rerun interrupt initialization + case (rand_seq_idx) inside + IDX_SOC_IFC_ENV_RST_WARM, + IDX_SOC_IFC_ENV_RST_COLD, + IDX_SOC_IFC_ENV_MBOX_RST_WARM_RAND_MEDIUM, + IDX_SOC_IFC_ENV_MBOX_RST_COLD_RAND_MEDIUM: begin + `uvm_info("SOC_IFC_RAND_TEST", "Rerunning interrupt init after reset", UVM_MEDIUM) + soc_ifc_env_cptra_init_interrupts_seq = soc_ifc_env_cptra_init_interrupts_sequence_t::type_id::create($sformatf("soc_ifc_env_cptra_init_interrupts_seq[%0d]",ii)); + soc_ifc_env_cptra_init_interrupts_seq.cptra_status_agent_rsp_seq = cptra_status_agent_responder_seq; + soc_ifc_env_cptra_init_interrupts_seq.start(top_configuration.vsqr); + `uvm_info("SOC_IFC_RAND_TEST", "Completed interrupt init", UVM_MEDIUM) + end + endcase end // UVMF_CHANGE_ME : Extend the simulation XXX number of clocks after @@ -227,6 +350,7 @@ class soc_ifc_rand_test_sequence extends soc_ifc_bench_sequence_base; cptra_ctrl_agent_config.wait_for_num_clocks(400); soc_ifc_status_agent_config.wait_for_num_clocks(400); cptra_status_agent_config.wait_for_num_clocks(400); + mbox_sram_agent_config.wait_for_num_clocks(400); join // pragma uvmf custom body end diff --git a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/project_benches/soc_ifc/tb/sequences/src/soc_ifc_trng_test_sequence.svh b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/project_benches/soc_ifc/tb/sequences/src/soc_ifc_trng_test_sequence.svh index 0e838834a..4c9999757 100755 --- a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/project_benches/soc_ifc/tb/sequences/src/soc_ifc_trng_test_sequence.svh +++ b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/project_benches/soc_ifc/tb/sequences/src/soc_ifc_trng_test_sequence.svh @@ -75,8 +75,6 @@ class soc_ifc_trng_test_sequence extends soc_ifc_bench_sequence_base; // **************************************************************************** virtual task body(); - // pragma uvmf custom body begin - // Construct sequences here uvm_object obj; int ii; @@ -89,6 +87,7 @@ class soc_ifc_trng_test_sequence extends soc_ifc_bench_sequence_base; cptra_ctrl_agent_random_seq = cptra_ctrl_agent_random_seq_t::type_id::create("cptra_ctrl_agent_random_seq"); soc_ifc_status_agent_responder_seq = soc_ifc_status_agent_responder_seq_t::type_id::create("soc_ifc_status_agent_responder_seq"); cptra_status_agent_responder_seq = cptra_status_agent_responder_seq_t::type_id::create("cptra_status_agent_responder_seq"); + mbox_sram_agent_responder_seq = mbox_sram_agent_responder_seq_t::type_id::create("mbox_sram_agent_responder_seq"); // Handle to the responder sequence for getting response transactions soc_ifc_env_bringup_seq.soc_ifc_status_agent_rsp_seq = soc_ifc_status_agent_responder_seq; @@ -100,6 +99,7 @@ class soc_ifc_trng_test_sequence extends soc_ifc_bench_sequence_base; fork soc_ifc_status_agent_responder_seq.start(soc_ifc_status_agent_sequencer); cptra_status_agent_responder_seq.start(cptra_status_agent_sequencer); + mbox_sram_agent_responder_seq.start(mbox_sram_agent_sequencer); join_none // Start INITIATOR sequences here @@ -148,6 +148,7 @@ class soc_ifc_trng_test_sequence extends soc_ifc_bench_sequence_base; cptra_ctrl_agent_config.wait_for_num_clocks(400); soc_ifc_status_agent_config.wait_for_num_clocks(400); cptra_status_agent_config.wait_for_num_clocks(400); + mbox_sram_agent_config.wait_for_num_clocks(400); join if (1) // TODO -- how to properly choose which to print? diff --git a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/project_benches/soc_ifc/tb/testbench/hdl_top.compile b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/project_benches/soc_ifc/tb/testbench/hdl_top.compile index 9c923c2dc..408eb4545 100644 --- a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/project_benches/soc_ifc/tb/testbench/hdl_top.compile +++ b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/project_benches/soc_ifc/tb/testbench/hdl_top.compile @@ -8,5 +8,6 @@ needs: - ../../../../verification_ip/interface_packages/cptra_ctrl_pkg/cptra_ctrl_hdl.compile - ../../../../verification_ip/interface_packages/soc_ifc_status_pkg/soc_ifc_status_hdl.compile - ../../../../verification_ip/interface_packages/cptra_status_pkg/cptra_status_hdl.compile + - ../../../../verification_ip/interface_packages/mbox_sram_pkg/mbox_sram_hdl.compile src: - hdl_top.sv diff --git a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/project_benches/soc_ifc/tb/testbench/hdl_top.sv b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/project_benches/soc_ifc/tb/testbench/hdl_top.sv index 9d8d6fdb5..621ee5af9 100644 --- a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/project_benches/soc_ifc/tb/testbench/hdl_top.sv +++ b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/project_benches/soc_ifc/tb/testbench/hdl_top.sv @@ -82,28 +82,6 @@ import uvmf_base_pkg_hdl::*; // pragma uvmf custom reset_generator end // pragma uvmf custom module_item_additional begin -import soc_ifc_pkg::*; - mbox_sram_req_t mbox_sram_req; - mbox_sram_resp_t mbox_sram_resp; - - //SRAM for mbox - caliptra_sram - #( - .DATA_WIDTH(MBOX_DATA_AND_ECC_W), - .DEPTH(MBOX_DEPTH) - ) - i_mbox_ram - ( - .clk_i(clk), - - .cs_i (mbox_sram_req.cs ), - .we_i (mbox_sram_req.we ), - .addr_i (mbox_sram_req.addr ), - .wdata_i(mbox_sram_req.wdata), - - .rdata_o(mbox_sram_resp.rdata) - ); - initial i_mbox_ram.ram = '{default:8'h0}; // pragma uvmf custom module_item_additional end // Instantiate the signal bundle, monitor bfm and driver bfm for each interface. @@ -130,21 +108,28 @@ import soc_ifc_pkg::*; .clk(clk), .dummy(1'b1) // pragma uvmf custom cptra_status_agent_bus_connections end ); + mbox_sram_if mbox_sram_agent_bus( + // pragma uvmf custom mbox_sram_agent_bus_connections begin + .clk(clk), .dummy(1'b1) + // pragma uvmf custom mbox_sram_agent_bus_connections end + ); soc_ifc_ctrl_monitor_bfm soc_ifc_ctrl_agent_mon_bfm(soc_ifc_ctrl_agent_bus.monitor_port); cptra_ctrl_monitor_bfm cptra_ctrl_agent_mon_bfm(cptra_ctrl_agent_bus.monitor_port); soc_ifc_status_monitor_bfm soc_ifc_status_agent_mon_bfm(soc_ifc_status_agent_bus.monitor_port); cptra_status_monitor_bfm cptra_status_agent_mon_bfm(cptra_status_agent_bus.monitor_port); + mbox_sram_monitor_bfm mbox_sram_agent_mon_bfm(mbox_sram_agent_bus.monitor_port); soc_ifc_ctrl_driver_bfm soc_ifc_ctrl_agent_drv_bfm(soc_ifc_ctrl_agent_bus.initiator_port); cptra_ctrl_driver_bfm cptra_ctrl_agent_drv_bfm(cptra_ctrl_agent_bus.initiator_port); soc_ifc_status_driver_bfm soc_ifc_status_agent_drv_bfm(soc_ifc_status_agent_bus.responder_port); cptra_status_driver_bfm cptra_status_agent_drv_bfm(cptra_status_agent_bus.responder_port); + mbox_sram_driver_bfm mbox_sram_agent_drv_bfm(mbox_sram_agent_bus.responder_port); // pragma uvmf custom dut_instantiation begin // AHB Clock/reset assign uvm_test_top_environment_qvip_ahb_lite_slave_subenv_qvip_hdl.default_clk_gen_CLK = clk; assign uvm_test_top_environment_qvip_ahb_lite_slave_subenv_qvip_hdl.default_reset_gen_RESET = cptra_status_agent_bus.cptra_noncore_rst_b; assign uvm_test_top_environment_qvip_apb5_slave_subenv_qvip_hdl.default_clk_gen_CLK = clk; - assign uvm_test_top_environment_qvip_apb5_slave_subenv_qvip_hdl.default_reset_gen_RESET = soc_ifc_ctrl_agent_bus.cptra_rst_b; + assign uvm_test_top_environment_qvip_apb5_slave_subenv_qvip_hdl.default_reset_gen_RESET = cptra_status_agent_bus.cptra_noncore_rst_b; // DUT soc_ifc_top #( @@ -159,6 +144,9 @@ import soc_ifc_pkg::*; .clk (clk ), .clk_cg (clk ), .soc_ifc_clk_cg (clk ), + .rdc_clk_cg (clk ), + .rdc_clk_dis (), + .fw_update_rst_window (cptra_status_agent_bus.fw_update_rst_window), .cptra_pwrgood (soc_ifc_ctrl_agent_bus.cptra_pwrgood ), .cptra_rst_b (soc_ifc_ctrl_agent_bus.cptra_rst_b ), .ready_for_fuses (soc_ifc_status_agent_bus.ready_for_fuses ), @@ -168,15 +156,14 @@ import soc_ifc_pkg::*; .mailbox_flow_done (soc_ifc_status_agent_bus.mailbox_flow_done ), .security_state (soc_ifc_ctrl_agent_bus.security_state), - .scan_mode_f (1'b0), .generic_input_wires (soc_ifc_ctrl_agent_bus.generic_input_wires ), .BootFSM_BrkPoint (soc_ifc_ctrl_agent_bus.BootFSM_BrkPoint), .generic_output_wires(soc_ifc_status_agent_bus.generic_output_wires), //SRAM interface - .mbox_sram_req(mbox_sram_req), - .mbox_sram_resp(mbox_sram_resp), + .mbox_sram_req(mbox_sram_agent_bus.mbox_sram_req), + .mbox_sram_resp(mbox_sram_agent_bus.mbox_sram_resp), //APB Interface with SoC .paddr_i (uvm_test_top_environment_qvip_apb5_slave_subenv_qvip_hdl.apb5_master_0_PADDR[17:0]), @@ -209,14 +196,19 @@ import soc_ifc_pkg::*; .soc_ifc_notif_intr(cptra_status_agent_bus.soc_ifc_notif_intr), .sha_error_intr(cptra_status_agent_bus.sha_error_intr), .sha_notif_intr(cptra_status_agent_bus.sha_notif_intr), + .timer_intr(cptra_status_agent_bus.timer_intr), + // RV ECC Status Interface + .rv_ecc_sts(cptra_ctrl_agent_bus.rv_ecc_sts), //Obfuscated UDS and FE + .clear_obf_secrets(cptra_ctrl_agent_bus.clear_obf_secrets), + .scan_mode_f (1'b0), .cptra_obf_key(soc_ifc_ctrl_agent_bus.cptra_obf_key), .cptra_obf_key_reg(cptra_status_agent_bus.cptra_obf_key_reg), .obf_field_entropy(cptra_status_agent_bus.obf_field_entropy), .obf_uds_seed(cptra_status_agent_bus.obf_uds_seed), - .clear_obf_secrets(cptra_ctrl_agent_bus.clear_obf_secrets), // NMI Vector .nmi_vector(cptra_status_agent_bus.nmi_vector), + .nmi_intr(cptra_status_agent_bus.nmi_intr), // ICCM Lock .iccm_lock(cptra_status_agent_bus.iccm_lock), .iccm_axs_blocked(cptra_ctrl_agent_bus.iccm_axs_blocked), @@ -273,10 +265,12 @@ import soc_ifc_pkg::*; uvm_config_db #( virtual cptra_ctrl_monitor_bfm )::set( null , UVMF_VIRTUAL_INTERFACES , cptra_ctrl_agent_BFM , cptra_ctrl_agent_mon_bfm ); uvm_config_db #( virtual soc_ifc_status_monitor_bfm )::set( null , UVMF_VIRTUAL_INTERFACES , soc_ifc_status_agent_BFM , soc_ifc_status_agent_mon_bfm ); uvm_config_db #( virtual cptra_status_monitor_bfm )::set( null , UVMF_VIRTUAL_INTERFACES , cptra_status_agent_BFM , cptra_status_agent_mon_bfm ); + uvm_config_db #( virtual mbox_sram_monitor_bfm )::set( null , UVMF_VIRTUAL_INTERFACES , mbox_sram_agent_BFM , mbox_sram_agent_mon_bfm ); uvm_config_db #( virtual soc_ifc_ctrl_driver_bfm )::set( null , UVMF_VIRTUAL_INTERFACES , soc_ifc_ctrl_agent_BFM , soc_ifc_ctrl_agent_drv_bfm ); uvm_config_db #( virtual cptra_ctrl_driver_bfm )::set( null , UVMF_VIRTUAL_INTERFACES , cptra_ctrl_agent_BFM , cptra_ctrl_agent_drv_bfm ); uvm_config_db #( virtual soc_ifc_status_driver_bfm )::set( null , UVMF_VIRTUAL_INTERFACES , soc_ifc_status_agent_BFM , soc_ifc_status_agent_drv_bfm ); uvm_config_db #( virtual cptra_status_driver_bfm )::set( null , UVMF_VIRTUAL_INTERFACES , cptra_status_agent_BFM , cptra_status_agent_drv_bfm ); + uvm_config_db #( virtual mbox_sram_driver_bfm )::set( null , UVMF_VIRTUAL_INTERFACES , mbox_sram_agent_BFM , mbox_sram_agent_drv_bfm ); end endmodule diff --git a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/project_benches/soc_ifc/tb/testbench/hdl_top.vinfo b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/project_benches/soc_ifc/tb/testbench/hdl_top.vinfo index 684e5069f..b4204c2c8 100644 --- a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/project_benches/soc_ifc/tb/testbench/hdl_top.vinfo +++ b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/project_benches/soc_ifc/tb/testbench/hdl_top.vinfo @@ -5,4 +5,5 @@ @use $UVMF_VIP_LIBRARY_HOME/interface_packages/cptra_ctrl_pkg/cptra_ctrl_bfm.vinfo @use $UVMF_VIP_LIBRARY_HOME/interface_packages/soc_ifc_status_pkg/soc_ifc_status_bfm.vinfo @use $UVMF_VIP_LIBRARY_HOME/interface_packages/cptra_status_pkg/cptra_status_bfm.vinfo +@use $UVMF_VIP_LIBRARY_HOME/interface_packages/mbox_sram_pkg/mbox_sram_bfm.vinfo hdl_top.sv diff --git a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/project_benches/soc_ifc/tb/tests/soc_ifc_tests_pkg.compile b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/project_benches/soc_ifc/tb/tests/soc_ifc_tests_pkg.compile index a98a9e77e..863735d42 100644 --- a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/project_benches/soc_ifc/tb/tests/soc_ifc_tests_pkg.compile +++ b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/project_benches/soc_ifc/tb/tests/soc_ifc_tests_pkg.compile @@ -4,6 +4,7 @@ needs: - ../../../../verification_ip/interface_packages/cptra_ctrl_pkg/cptra_ctrl.compile - ../../../../verification_ip/interface_packages/soc_ifc_status_pkg/soc_ifc_status.compile - ../../../../verification_ip/interface_packages/cptra_status_pkg/cptra_status.compile + - ../../../../verification_ip/interface_packages/mbox_sram_pkg/mbox_sram.compile - ../../../../verification_ip/environment_packages/soc_ifc_env_pkg/soc_ifc_env_pkg.compile - ../parameters/soc_ifc_parameters_pkg.compile - ../sequences/soc_ifc_sequences_pkg.compile diff --git a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/project_benches/soc_ifc/tb/tests/soc_ifc_tests_pkg.sv b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/project_benches/soc_ifc/tb/tests/soc_ifc_tests_pkg.sv index 65cac7397..b06dc5f37 100644 --- a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/project_benches/soc_ifc/tb/tests/soc_ifc_tests_pkg.sv +++ b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/project_benches/soc_ifc/tb/tests/soc_ifc_tests_pkg.sv @@ -47,6 +47,8 @@ package soc_ifc_tests_pkg; import soc_ifc_status_pkg_hdl::*; import cptra_status_pkg::*; import cptra_status_pkg_hdl::*; + import mbox_sram_pkg::*; + import mbox_sram_pkg_hdl::*; import qvip_ahb_lite_slave_pkg::*; import qvip_apb5_slave_pkg::*; import QUESTA_MVC::*; diff --git a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/project_benches/soc_ifc/tb/tests/soc_ifc_tests_pkg.vinfo b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/project_benches/soc_ifc/tb/tests/soc_ifc_tests_pkg.vinfo index f8d3f85bb..a9a3e891c 100644 --- a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/project_benches/soc_ifc/tb/tests/soc_ifc_tests_pkg.vinfo +++ b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/project_benches/soc_ifc/tb/tests/soc_ifc_tests_pkg.vinfo @@ -3,6 +3,7 @@ @use $UVMF_VIP_LIBRARY_HOME/interface_packages/cptra_ctrl_pkg/cptra_ctrl_pkg.vinfo @use $UVMF_VIP_LIBRARY_HOME/interface_packages/soc_ifc_status_pkg/soc_ifc_status_pkg.vinfo @use $UVMF_VIP_LIBRARY_HOME/interface_packages/cptra_status_pkg/cptra_status_pkg.vinfo +@use $UVMF_VIP_LIBRARY_HOME/interface_packages/mbox_sram_pkg/mbox_sram_pkg.vinfo @use $UVMF_VIP_LIBRARY_HOME/environment_packages/soc_ifc_env_pkg/soc_ifc_env_pkg.vinfo @use $UVMF_PROJECT_DIR/tb/parameters/soc_ifc_parameters_pkg.vinfo @use $UVMF_PROJECT_DIR/tb/sequences/soc_ifc_sequences_pkg.vinfo diff --git a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/project_benches/soc_ifc/tb/tests/src/soc_ifc_cmdline_test.svh b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/project_benches/soc_ifc/tb/tests/src/soc_ifc_cmdline_test.svh index 751c66016..b58f42ed6 100644 --- a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/project_benches/soc_ifc/tb/tests/src/soc_ifc_cmdline_test.svh +++ b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/project_benches/soc_ifc/tb/tests/src/soc_ifc_cmdline_test.svh @@ -50,4 +50,18 @@ class soc_ifc_cmdline_test extends test_top; // pragma uvmf custom configuration_settings_post_randomize end endfunction + + + + virtual function void start_of_simulation_phase(uvm_phase phase); + super.start_of_simulation_phase(phase); + if ($test$plusargs("CLP_REGRESSION")) begin + uvm_top.set_report_verbosity_level_hier(UVM_NONE); +// this.environment.soc_ifc_pred.set_report_severity_action(UVM_WARNING,UVM_NO_ACTION); +// this.environment.soc_ifc_sb.set_report_severity_action(UVM_WARNING,UVM_NO_ACTION); + // Since en_sb is recently set to 0, this is unavailable and gives null-object + //this.environment.qvip_apb5_slave_subenv.apb5_master_0.get_analysis_component("checker").set_report_severity_id_action(UVM_WARNING,"scoreboard_debug",UVM_NO_ACTION); + end + endfunction + endclass diff --git a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/project_benches/soc_ifc/tb/tests/src/soc_ifc_rand_test.svh b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/project_benches/soc_ifc/tb/tests/src/soc_ifc_rand_test.svh index 14a9717fb..a8d6707ff 100644 --- a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/project_benches/soc_ifc/tb/tests/src/soc_ifc_rand_test.svh +++ b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/project_benches/soc_ifc/tb/tests/src/soc_ifc_rand_test.svh @@ -65,8 +65,3 @@ class soc_ifc_rand_test extends test_top; endfunction endclass - -// pragma uvmf custom external begin -// pragma uvmf custom external end - - diff --git a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/project_benches/soc_ifc/tb/tests/src/test_top.svh b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/project_benches/soc_ifc/tb/tests/src/test_top.svh index fa64454af..b5d8893a9 100644 --- a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/project_benches/soc_ifc/tb/tests/src/test_top.svh +++ b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/project_benches/soc_ifc/tb/tests/src/test_top.svh @@ -52,7 +52,8 @@ qvip_memory_message_handler message_handler; soc_ifc_ctrl_agent_BFM /* soc_ifc_ctrl_agent [2] */ , cptra_ctrl_agent_BFM /* cptra_ctrl_agent [3] */ , soc_ifc_status_agent_BFM /* soc_ifc_status_agent [4] */ , - cptra_status_agent_BFM /* cptra_status_agent [5] */ + cptra_status_agent_BFM /* cptra_status_agent [5] */ , + mbox_sram_agent_BFM /* mbox_sram_agent [6] */ }; uvmf_active_passive_t interface_activities[] = { @@ -61,7 +62,8 @@ uvmf_active_passive_t interface_activities[] = { ACTIVE /* soc_ifc_ctrl_agent [2] */ , ACTIVE /* cptra_ctrl_agent [3] */ , ACTIVE /* soc_ifc_status_agent [4] */ , - ACTIVE /* cptra_status_agent [5] */ }; + ACTIVE /* cptra_status_agent [5] */ , + ACTIVE /* mbox_sram_agent [6] */ }; // pragma uvmf custom class_item_additional begin // pragma uvmf custom class_item_additional end diff --git a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/project_benches/soc_ifc/yaml/soc_ifc_bench.yaml b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/project_benches/soc_ifc/yaml/soc_ifc_bench.yaml index 956ac2c87..755953538 100644 --- a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/project_benches/soc_ifc/yaml/soc_ifc_bench.yaml +++ b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/project_benches/soc_ifc/yaml/soc_ifc_bench.yaml @@ -10,6 +10,8 @@ uvmf: value: ACTIVE - bfm_name: cptra_status_agent value: ACTIVE + - bfm_name: mbox_sram_agent + value: ACTIVE active_passive_default: ACTIVE clock_half_period: 5ns clock_phase_offset: 0ns diff --git a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/registers/soc_ifc_reg_cbs_intr_block_rf_ext_error_internal_intr_r_base.svh b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/registers/soc_ifc_reg_cbs_intr_block_rf_ext_error_internal_intr_r_base.svh index 2f69c01fb..6ce03ec1d 100644 --- a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/registers/soc_ifc_reg_cbs_intr_block_rf_ext_error_internal_intr_r_base.svh +++ b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/registers/soc_ifc_reg_cbs_intr_block_rf_ext_error_internal_intr_r_base.svh @@ -21,6 +21,14 @@ class soc_ifc_reg_cbs_intr_block_rf_ext_error_internal_intr_r_base extends uvm_r string AHB_map_name = "soc_ifc_AHB_map"; string APB_map_name = "soc_ifc_APB_map"; + uvm_queue #(soc_ifc_reg_delay_job) delay_jobs; + + function new(string name = "uvm_reg_cbs"); + super.new(name); + if (!uvm_config_db#(uvm_queue#(soc_ifc_reg_delay_job))::get(null, "soc_ifc_reg_model_top", "delay_jobs", delay_jobs)) + `uvm_error("SOC_IFC_REG_CBS", "Failed to get handle for 'delay_jobs' queue from config database!") + endfunction + // Function: post_predict // // Called by the method @@ -36,7 +44,11 @@ class soc_ifc_reg_cbs_intr_block_rf_ext_error_internal_intr_r_base extends uvm_r input uvm_predict_e kind, input uvm_path_e path, input uvm_reg_map map); + soc_ifc_reg_delay_job_intr_block_rf_ext delay_job; uvm_reg_block rm; + soc_ifc_reg__intr_block_t_ext sir_intr_rm; + sha512_acc_csr__intr_block_t_ext sac_intr_rm; + bit fld_hwset_active = 1'b0; uvm_reg sts_reg; string event_name ; uvm_reg en_reg ; @@ -45,8 +57,21 @@ class soc_ifc_reg_cbs_intr_block_rf_ext_error_internal_intr_r_base extends uvm_r uvm_reg_field sts_glb; uvm_reg_field cnt_fld; + delay_job = soc_ifc_reg_delay_job_intr_block_rf_ext::type_id::create("delay_job"); + delay_job.map = map; sts_reg = fld.get_parent(); rm = sts_reg.get_parent(); /* intr_block_rf_ext */ + if (rm.get_parent().get_name() == "sha512_acc_csr_rm") begin + if (!$cast(sac_intr_rm,rm)) `uvm_fatal("SOC_IFC_REG_CBS", {"Failed to get handle of expected sub-type for parent uvm_reg_block. ", fld.get_full_name()}) + fld_hwset_active = sac_intr_rm.error_internal_intr_r_hwset_active[fld.get_lsb_pos()]; + end + else if (rm.get_parent().get_name() == "soc_ifc_reg_rm") begin + if (!$cast(sir_intr_rm,rm)) `uvm_fatal("SOC_IFC_REG_CBS", {"Failed to get handle of expected sub-type for parent uvm_reg_block. ", fld.get_full_name()}) + fld_hwset_active = sir_intr_rm.error_internal_intr_r_hwset_active[fld.get_lsb_pos()]; + end + else begin + `uvm_fatal("SOC_IFC_REG_CBS", "Callback is registered to an unrecognized register block!") + end // Get a base-name for the event by truncating the '_sts' suffix event_name = fld.get_name().substr(0,fld.get_name().len()-5); en_reg = rm.get_reg_by_name("error_intr_en_r"); @@ -56,8 +81,11 @@ class soc_ifc_reg_cbs_intr_block_rf_ext_error_internal_intr_r_base extends uvm_r cnt_fld = rm.get_reg_by_name({event_name, "_intr_count_r"}).get_field_by_name("cnt"); if (map.get_name() == this.APB_map_name) begin - if (kind == UVM_PREDICT_WRITE) - `uvm_warning("SOC_IFC_REG_CBS", "Unexpected write to interrupt register through APB interface!") + if (kind == UVM_PREDICT_WRITE) begin + `uvm_warning("SOC_IFC_REG_CBS", {"Unexpected write to interrupt register ", fld.get_full_name(), " through APB interface is blocked!"}) + value = previous; + return; + end else `uvm_info("SOC_IFC_REG_CBS", "Unexpected read to interrupt register through APB interface!", UVM_LOW) end @@ -66,36 +94,87 @@ class soc_ifc_reg_cbs_intr_block_rf_ext_error_internal_intr_r_base extends uvm_r // Predict an increment to event interrupt counter // regardless of interrupt enablement (the sts reg being // set is all that is tracked by the interrupt counter) + // FIXME if a new interrupt event occurs while the interrupt sts is already 1, + // this won't increment the counter, even though it should. if (value & ~previous) begin - `uvm_info("SOC_IFC_REG_CBS", $sformatf("Write to %s triggers increment on %s from %d to %d", fld.get_name(), cnt_fld.get_name(), cnt_fld.get_mirrored_value(), cnt_fld.get_mirrored_value() + uvm_reg_data_t'(1)), UVM_HIGH) - cnt_fld.predict(cnt_fld.get_mirrored_value() + uvm_reg_data_t'(1)); + `uvm_info("SOC_IFC_REG_CBS", $sformatf("hwset to %s triggers increment on %s from %d to %d", fld.get_name(), cnt_fld.get_name(), cnt_fld.get_mirrored_value(), cnt_fld.get_mirrored_value() + uvm_reg_data_t'(1)), UVM_HIGH) + cnt_fld.predict(cnt_fld.get_mirrored_value() + uvm_reg_data_t'(1), .kind(UVM_PREDICT_WRITE), .path(UVM_PREDICT), .map(map)); + end + + // Anytime an access intr sts register predicts a value of 1, we can treat + // that as a hwset (even if it's just an AHB/APB read) because we _know_ a + // W1C won't result in value=1, which is the case we're protecting against + // by tracking this hwset flag. + // We must track the hwset flag for all value=1 (not just the transitions + // where previous=0) because occasionally an actual hwset will occur when + // the interrupt is already pending, and we still must protect against W1C + // in that case. + if (value) begin + if (sir_intr_rm != null) begin + sir_intr_rm.error_internal_intr_r_hwset_active[fld.get_lsb_pos()] = 1'b1; + fork + begin + uvm_wait_for_nba_region(); + sir_intr_rm.error_internal_intr_r_hwset_active[fld.get_lsb_pos()] = 1'b0; + end + join_none + end + else if (sac_intr_rm != null) begin + sac_intr_rm.error_internal_intr_r_hwset_active[fld.get_lsb_pos()] = 1'b1; + fork + begin + uvm_wait_for_nba_region(); + sac_intr_rm.error_internal_intr_r_hwset_active[fld.get_lsb_pos()] = 1'b0; + end + join_none + end + else + `uvm_fatal("SOC_IFC_REG_CBS", "Bad handle") end - // On rising edge of field value, check if the interrupt output pin will + // On rising edge of field value, schedule a delay job to check if the + // interrupt output pin will // transition to high. // Global interrupt pin "agg_sts" is non-sticky - if ((value & ~previous) && - en_glb.get_mirrored_value() && - en_fld.get_mirrored_value() && - ~sts_glb.get_mirrored_value()) + if ((value & ~previous)) + begin + `uvm_info("SOC_IFC_REG_CBS", {"Predicted update to ", fld.get_name(), " triggers interrupt output pin check delay job"}, UVM_MEDIUM) + delay_job.req_fld = fld; + delay_job.sts_reg = sts_reg; + delay_job.en_reg = en_reg; + delay_job.sts_glb = sts_glb; + delay_job.en_glb = en_glb; + delay_job.grab_values(); + delay_jobs.push_back(delay_job); + end + // On falling edge of field value, caused by W1C, check if another thread + // is already attempting to perform hwset to this interrupt field (hwset is + // higher priority than W1C). + else if ((~value & previous) && fld_hwset_active) begin - `uvm_info("SOC_IFC_REG_CBS", {"Predicted update to ", fld.get_name(), " triggers interrupt output pin assertion"}, UVM_MEDIUM) - sts_glb.predict(1'b1); + `uvm_info("SOC_IFC_REG_CBS", {"Predicted update to ", fld.get_name(), " attempts to clear the interrupt bit but is preempted by an active hwset"}, UVM_MEDIUM) + value = previous; + // NOTE: No delay job is scheduled because no changes are predicted to + // other interrupt register fields based on this activity end - // On falling edge of field value, check if the interrupt output pin will + // On falling edge of field value, schedule a delay job to + // check if the interrupt output pin will // transition from high to low. // Global interrupt pin "agg_sts" is non-sticky - else if ((~value & previous) && - ~|(en_reg.get_mirrored_value() & - (sts_reg.get_mirrored_value() & ~(uvm_reg_data_t'(1) << fld.get_lsb_pos()))) && - sts_glb.get_mirrored_value()) + else if ((~value & previous)) begin - `uvm_info("SOC_IFC_REG_CBS", {"Predicted update to ", fld.get_name(), " triggers interrupt output pin deassertion"}, UVM_MEDIUM) - sts_glb.predict(1'b0); + `uvm_info("SOC_IFC_REG_CBS", {"Predicted update to ", fld.get_name(), " triggers interrupt output pin check delay job"}, UVM_MEDIUM) + delay_job.req_fld = fld; + delay_job.sts_reg = sts_reg; + delay_job.en_reg = en_reg; + delay_job.sts_glb = sts_glb; + delay_job.en_glb = en_glb; + delay_job.grab_values(); + delay_jobs.push_back(delay_job); end else begin `uvm_info("SOC_IFC_REG_CBS", - $sformatf("Write to %s does not trigger interrupt output transition due to %s: [%x], %s: [%x], masked %s: [%x], and %s: [%x]", + $sformatf("Access to %s does not trigger interrupt output transition due to %s: [%x], %s: [%x], masked %s: [%x], and %s: [%x]", fld.get_name(), en_glb.get_name(), en_glb.get_mirrored_value(), diff --git a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/registers/soc_ifc_reg_cbs_intr_block_rf_ext_error_intr_en_r_base.svh b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/registers/soc_ifc_reg_cbs_intr_block_rf_ext_error_intr_en_r_base.svh index ad0aa350b..bc171833e 100644 --- a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/registers/soc_ifc_reg_cbs_intr_block_rf_ext_error_intr_en_r_base.svh +++ b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/registers/soc_ifc_reg_cbs_intr_block_rf_ext_error_intr_en_r_base.svh @@ -21,6 +21,14 @@ class soc_ifc_reg_cbs_intr_block_rf_ext_error_intr_en_r_base extends uvm_reg_cbs string AHB_map_name = "soc_ifc_AHB_map"; string APB_map_name = "soc_ifc_APB_map"; + uvm_queue #(soc_ifc_reg_delay_job) delay_jobs; + + function new(string name = "uvm_reg_cbs"); + super.new(name); + if (!uvm_config_db#(uvm_queue#(soc_ifc_reg_delay_job))::get(null, "soc_ifc_reg_model_top", "delay_jobs", delay_jobs)) + `uvm_error("SOC_IFC_REG_CBS", "Failed to get handle for 'delay_jobs' queue from config database!") + endfunction + // Function: post_predict // // Called by the method @@ -36,6 +44,7 @@ class soc_ifc_reg_cbs_intr_block_rf_ext_error_intr_en_r_base extends uvm_reg_cbs input uvm_predict_e kind, input uvm_path_e path, input uvm_reg_map map); + soc_ifc_reg_delay_job_intr_block_rf_ext delay_job; uvm_reg en_reg; uvm_reg_block rm; string event_name; @@ -44,6 +53,8 @@ class soc_ifc_reg_cbs_intr_block_rf_ext_error_intr_en_r_base extends uvm_reg_cbs uvm_reg_field en_glb ; uvm_reg_field sts_glb; + delay_job = soc_ifc_reg_delay_job_intr_block_rf_ext::type_id::create("delay_job"); + delay_job.map = map; en_reg = fld.get_parent(); rm = en_reg.get_parent(); /* intr_block_rf_ext */ // Get a base-name for the event by truncating the '_en' suffix @@ -54,8 +65,11 @@ class soc_ifc_reg_cbs_intr_block_rf_ext_error_intr_en_r_base extends uvm_reg_cbs sts_glb = rm.get_reg_by_name("error_global_intr_r").get_field_by_name("agg_sts"); if (map.get_name() == this.APB_map_name) begin - if (kind == UVM_PREDICT_WRITE) - `uvm_warning("SOC_IFC_REG_CBS", "Unexpected write to interrupt register through APB interface!") + if (kind == UVM_PREDICT_WRITE) begin + `uvm_warning("SOC_IFC_REG_CBS", {"Unexpected write to interrupt register ", fld.get_full_name(), " through APB interface is blocked!"}) + value = previous; + return; + end else `uvm_info("SOC_IFC_REG_CBS", "Unexpected read to interrupt register through APB interface!", UVM_LOW) end @@ -64,24 +78,30 @@ class soc_ifc_reg_cbs_intr_block_rf_ext_error_intr_en_r_base extends uvm_reg_cbs // On rising edge of field value, check if the interrupt output pin will // transition to high. // Global interrupt pin "agg_sts" is non-sticky - if ((value & ~previous) && - en_glb.get_mirrored_value() && - sts_fld.get_mirrored_value() && - ~sts_glb.get_mirrored_value()) + if ((value & ~previous)) begin `uvm_info("SOC_IFC_REG_CBS", {"Predicted update to ", fld.get_name(), " triggers interrupt output pin assertion"}, UVM_MEDIUM) - sts_glb.predict(1'b1); + delay_job.req_fld = fld; + delay_job.sts_reg = sts_reg; + delay_job.en_reg = en_reg; + delay_job.sts_glb = sts_glb; + delay_job.en_glb = en_glb; + delay_job.grab_values(); + delay_jobs.push_back(delay_job); end // On falling edge of field value, check if the interrupt output pin will // transition from high to low. // Global interrupt pin "agg_sts" is non-sticky - else if ((~value & previous) && - ~|((en_reg.get_mirrored_value() & ~(value << fld.get_lsb_pos())) & - sts_reg.get_mirrored_value()) && - sts_glb.get_mirrored_value()) + else if ((~value & previous)) begin `uvm_info("SOC_IFC_REG_CBS", {"Predicted update to ", fld.get_name(), " triggers interrupt output pin deassertion"}, UVM_MEDIUM) - sts_glb.predict(1'b0); + delay_job.req_fld = fld; + delay_job.sts_reg = sts_reg; + delay_job.en_reg = en_reg; + delay_job.sts_glb = sts_glb; + delay_job.en_glb = en_glb; + delay_job.grab_values(); + delay_jobs.push_back(delay_job); end else begin `uvm_info("SOC_IFC_REG_CBS", diff --git a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/registers/soc_ifc_reg_cbs_intr_block_rf_ext_error_intr_trig_r_base.svh b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/registers/soc_ifc_reg_cbs_intr_block_rf_ext_error_intr_trig_r_base.svh index 007ffa230..b1c2a509f 100644 --- a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/registers/soc_ifc_reg_cbs_intr_block_rf_ext_error_intr_trig_r_base.svh +++ b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/registers/soc_ifc_reg_cbs_intr_block_rf_ext_error_intr_trig_r_base.svh @@ -48,8 +48,11 @@ class soc_ifc_reg_cbs_intr_block_rf_ext_error_intr_trig_r_base extends uvm_reg_c sts_fld = sts_reg.get_field_by_name({event_name, "_sts"}); if (map.get_name() == this.APB_map_name) begin - if (kind == UVM_PREDICT_WRITE) - `uvm_warning("SOC_IFC_REG_CBS", "Unexpected write to interrupt register through APB interface!") + if (kind == UVM_PREDICT_WRITE) begin + `uvm_warning("SOC_IFC_REG_CBS", {"Unexpected write to interrupt register ", fld.get_full_name(), " through APB interface is blocked!"}) + value = previous; + return; + end else `uvm_info("SOC_IFC_REG_CBS", "Unexpected read to interrupt register through APB interface!", UVM_LOW) end diff --git a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/registers/soc_ifc_reg_cbs_intr_block_rf_ext_global_intr_en_r_base.svh b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/registers/soc_ifc_reg_cbs_intr_block_rf_ext_global_intr_en_r_base.svh index 995f6fefa..0d2e20c33 100644 --- a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/registers/soc_ifc_reg_cbs_intr_block_rf_ext_global_intr_en_r_base.svh +++ b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/registers/soc_ifc_reg_cbs_intr_block_rf_ext_global_intr_en_r_base.svh @@ -51,46 +51,49 @@ class soc_ifc_reg_cbs_intr_block_rf_ext_global_intr_en_r_base extends uvm_reg_cb sts_glb = rm.get_reg_by_name({event_type, "_global_intr_r"}).get_field_by_name("agg_sts"); if (map.get_name() == this.APB_map_name) begin - if (kind == UVM_PREDICT_WRITE) - `uvm_warning("SOC_IFC_REG_CBS", "Unexpected write to interrupt register through APB interface!") + if (kind == UVM_PREDICT_WRITE) begin + `uvm_warning("SOC_IFC_REG_CBS", {"Unexpected write to interrupt register ", fld.get_full_name(), " through APB interface is blocked!"}) + value = previous; + return; + end else `uvm_info("SOC_IFC_REG_CBS", "Unexpected read to interrupt register through APB interface!", UVM_LOW) end `uvm_info("SOC_IFC_REG_CBS", $sformatf("Access to %s with path %p", fld.get_full_name(), path), UVM_FULL) - // On rising edge of field value, check if the interrupt output pin will - // transition to high. - // Global interrupt pin "agg_sts" is non-sticky - if ((value & ~previous) && - |( en_reg.get_mirrored_value() & - sts_reg.get_mirrored_value()) && - ~sts_glb.get_mirrored_value()) - begin - `uvm_info("SOC_IFC_REG_CBS", {"Predicted update to ", fld.get_name(), " triggers interrupt output pin assertion"}, UVM_MEDIUM) - sts_glb.predict(1'b1); - end - // On falling edge of field value, check if the interrupt output pin will - // transition from high to low. - // Global interrupt pin "agg_sts" is non-sticky - else if ((~value & previous) && - sts_glb.get_mirrored_value()) - begin - `uvm_info("SOC_IFC_REG_CBS", {"Predicted update to ", fld.get_name(), " triggers interrupt output pin deassertion"}, UVM_MEDIUM) - sts_glb.predict(1'b0); - end - else begin - `uvm_info("SOC_IFC_REG_CBS", - $sformatf("Write to %s with value %0d does not trigger interrupt output transition due to %s: [0x%x], %s: [0x%x], and %s: [%x]", - fld.get_name(), - value, - en_reg.get_name(), - en_reg.get_mirrored_value(), - sts_reg.get_name(), - sts_reg.get_mirrored_value(), - sts_glb.get_name(), - sts_glb.get_mirrored_value()), - UVM_HIGH) - end +// // On rising edge of field value, check if the interrupt output pin will +// // transition to high. +// // Global interrupt pin "agg_sts" is non-sticky +// if ((value & ~previous) && +// |( en_reg.get_mirrored_value() & +// sts_reg.get_mirrored_value()) && +// ~sts_glb.get_mirrored_value()) +// begin +// `uvm_info("SOC_IFC_REG_CBS", {"Predicted update to ", fld.get_name(), " triggers interrupt output pin assertion"}, UVM_MEDIUM) +// sts_glb.predict(1'b1); +// end +// // On falling edge of field value, check if the interrupt output pin will +// // transition from high to low. +// // Global interrupt pin "agg_sts" is non-sticky +// else if ((~value & previous) && +// sts_glb.get_mirrored_value()) +// begin +// `uvm_info("SOC_IFC_REG_CBS", {"Predicted update to ", fld.get_name(), " triggers interrupt output pin deassertion"}, UVM_MEDIUM) +// sts_glb.predict(1'b0); +// end +// else begin +// `uvm_info("SOC_IFC_REG_CBS", +// $sformatf("Write to %s with value %0d does not trigger interrupt output transition due to %s: [0x%x], %s: [0x%x], and %s: [%x]", +// fld.get_name(), +// value, +// en_reg.get_name(), +// en_reg.get_mirrored_value(), +// sts_reg.get_name(), +// sts_reg.get_mirrored_value(), +// sts_glb.get_name(), +// sts_glb.get_mirrored_value()), +// UVM_HIGH) +// end endfunction endclass diff --git a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/registers/soc_ifc_reg_cbs_intr_block_rf_ext_internal.svh b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/registers/soc_ifc_reg_cbs_intr_block_rf_ext_internal.svh new file mode 100644 index 000000000..0ad25c667 --- /dev/null +++ b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/registers/soc_ifc_reg_cbs_intr_block_rf_ext_internal.svh @@ -0,0 +1,69 @@ +//---------------------------------------------------------------------- +// SPDX-License-Identifier: Apache-2.0 +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +//---------------------------------------------------------------------- + +// General callback that implements the swwel=soc_req behavior for "internal" registers +class soc_ifc_reg_cbs_intr_block_rf_ext_internal extends uvm_reg_cbs; + + `uvm_object_utils(soc_ifc_reg_cbs_intr_block_rf_ext_internal) + + string AHB_map_name = "soc_ifc_AHB_map"; + string APB_map_name = "soc_ifc_APB_map"; + + uvm_queue #(soc_ifc_reg_delay_job) delay_jobs; + + function new(string name = "uvm_reg_cbs"); + super.new(name); + if (!uvm_config_db#(uvm_queue#(soc_ifc_reg_delay_job))::get(null, "soc_ifc_reg_model_top", "delay_jobs", delay_jobs)) + `uvm_error("SOC_IFC_REG_CBS", "Failed to get handle for 'delay_jobs' queue from config database!") + endfunction + + // Function: post_predict + // + // Called by the method + // after a successful UVM_PREDICT_READ or UVM_PREDICT_WRITE prediction. + // + // ~previous~ is the previous value in the mirror and + // ~value~ is the latest predicted value. Any change to ~value~ will + // modify the predicted mirror value. + // + virtual function void post_predict(input uvm_reg_field fld, + input uvm_reg_data_t previous, + inout uvm_reg_data_t value, + input uvm_predict_e kind, + input uvm_path_e path, + input uvm_reg_map map); + uvm_reg_block blk = fld.get_parent().get_parent(); /* intr_block_rf_ext */ + if (blk.get_name() != "intr_block_rf_ext") `uvm_fatal ("SOC_IFC_REG_CBS", "Failed to get valid parent class handle") + if (map.get_name() == this.AHB_map_name) begin + `uvm_info("SOC_IFC_REG_CBS", $sformatf("post_predict called with kind [%p] on map [%s] has no effect on internal register field %s", kind, map.get_name(), fld.get_full_name()), UVM_FULL) + end + else if (map.get_name() == this.APB_map_name) begin + case (kind) inside + UVM_PREDICT_WRITE: begin + `uvm_info("SOC_IFC_REG_CBS", $sformatf("post_predict blocked write attempt to internal reg field %s on map %s. value: 0x%x previous: 0x%x", fld.get_full_name(), map.get_name(), value, previous), UVM_LOW) + value = previous; + end + default: begin + `uvm_info("SOC_IFC_REG_CBS", $sformatf("post_predict called with kind [%p] on map [%s] has no effect on internal register field %s. value: 0x%x previous: 0x%x", kind, map.get_name(), fld.get_full_name(), value, previous), UVM_FULL) + end + endcase + end + else begin + `uvm_error("SOC_IFC_REG_CBS", {"post_predict called through unsupported reg map! ", map.get_name()}) + end + endfunction + +endclass diff --git a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/registers/soc_ifc_reg_cbs_intr_block_rf_ext_notif_internal_intr_r_base.svh b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/registers/soc_ifc_reg_cbs_intr_block_rf_ext_notif_internal_intr_r_base.svh index 3cdf9f807..6f194c35c 100644 --- a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/registers/soc_ifc_reg_cbs_intr_block_rf_ext_notif_internal_intr_r_base.svh +++ b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/registers/soc_ifc_reg_cbs_intr_block_rf_ext_notif_internal_intr_r_base.svh @@ -21,6 +21,14 @@ class soc_ifc_reg_cbs_intr_block_rf_ext_notif_internal_intr_r_base extends uvm_r string AHB_map_name = "soc_ifc_AHB_map"; string APB_map_name = "soc_ifc_APB_map"; + uvm_queue #(soc_ifc_reg_delay_job) delay_jobs; + + function new(string name = "uvm_reg_cbs"); + super.new(name); + if (!uvm_config_db#(uvm_queue#(soc_ifc_reg_delay_job))::get(null, "soc_ifc_reg_model_top", "delay_jobs", delay_jobs)) + `uvm_error("SOC_IFC_REG_CBS", "Failed to get handle for 'delay_jobs' queue from config database!") + endfunction + // Function: post_predict // // Called by the method @@ -36,7 +44,11 @@ class soc_ifc_reg_cbs_intr_block_rf_ext_notif_internal_intr_r_base extends uvm_r input uvm_predict_e kind, input uvm_path_e path, input uvm_reg_map map); + soc_ifc_reg_delay_job_intr_block_rf_ext delay_job; uvm_reg_block rm; + soc_ifc_reg__intr_block_t_ext sir_intr_rm; + sha512_acc_csr__intr_block_t_ext sac_intr_rm; + bit fld_hwset_active = 1'b0; uvm_reg sts_reg; string event_name ; uvm_reg en_reg ; @@ -45,8 +57,21 @@ class soc_ifc_reg_cbs_intr_block_rf_ext_notif_internal_intr_r_base extends uvm_r uvm_reg_field sts_glb; uvm_reg_field cnt_fld; + delay_job = soc_ifc_reg_delay_job_intr_block_rf_ext::type_id::create("delay_job"); + delay_job.map = map; sts_reg = fld.get_parent(); rm = sts_reg.get_parent(); /* intr_block_rf_ext */ + if (rm.get_parent().get_name() == "sha512_acc_csr_rm") begin + if (!$cast(sac_intr_rm,rm)) `uvm_fatal("SOC_IFC_REG_CBS", {"Failed to get handle of expected sub-type for parent uvm_reg_block. ", fld.get_full_name()}) + fld_hwset_active = sac_intr_rm.notif_internal_intr_r_hwset_active[fld.get_lsb_pos()]; + end + else if (rm.get_parent().get_name() == "soc_ifc_reg_rm") begin + if (!$cast(sir_intr_rm,rm)) `uvm_fatal("SOC_IFC_REG_CBS", {"Failed to get handle of expected sub-type for parent uvm_reg_block. ", fld.get_full_name()}) + fld_hwset_active = sir_intr_rm.notif_internal_intr_r_hwset_active[fld.get_lsb_pos()]; + end + else begin + `uvm_fatal("SOC_IFC_REG_CBS", "Callback is registered to an unrecognized register block!") + end // Get a base-name for the event by truncating the '_sts' suffix event_name = fld.get_name().substr(0,fld.get_name().len()-5); en_reg = rm.get_reg_by_name("notif_intr_en_r"); @@ -56,8 +81,11 @@ class soc_ifc_reg_cbs_intr_block_rf_ext_notif_internal_intr_r_base extends uvm_r cnt_fld = rm.get_reg_by_name({event_name, "_intr_count_r"}).get_field_by_name("cnt"); if (map.get_name() == this.APB_map_name) begin - if (kind == UVM_PREDICT_WRITE) - `uvm_warning("SOC_IFC_REG_CBS", "Unexpected write to interrupt register through APB interface!") + if (kind == UVM_PREDICT_WRITE) begin + `uvm_warning("SOC_IFC_REG_CBS", {"Unexpected write to interrupt register ", fld.get_full_name(), " through APB interface is blocked!"}) + value = previous; + return; + end else `uvm_info("SOC_IFC_REG_CBS", "Unexpected read to interrupt register through APB interface!", UVM_LOW) end @@ -66,36 +94,87 @@ class soc_ifc_reg_cbs_intr_block_rf_ext_notif_internal_intr_r_base extends uvm_r // Predict an increment to event interrupt counter // regardless of interrupt enablement (the sts reg being // set is all that is tracked by the interrupt counter) + // FIXME if a new interrupt event occurs while the interrupt sts is already 1, + // this won't increment the counter, even though it should. if (value & ~previous) begin - `uvm_info("SOC_IFC_REG_CBS", $sformatf("Write to %s triggers increment on %s from %d to %d", fld.get_name(), cnt_fld.get_name(), cnt_fld.get_mirrored_value(), cnt_fld.get_mirrored_value() + uvm_reg_data_t'(1)), UVM_HIGH) - cnt_fld.predict(cnt_fld.get_mirrored_value() + uvm_reg_data_t'(1)); + `uvm_info("SOC_IFC_REG_CBS", $sformatf("hwset to %s triggers increment on %s from %d to %d", fld.get_name(), cnt_fld.get_name(), cnt_fld.get_mirrored_value(), cnt_fld.get_mirrored_value() + uvm_reg_data_t'(1)), UVM_HIGH) + cnt_fld.predict(cnt_fld.get_mirrored_value() + uvm_reg_data_t'(1), .kind(UVM_PREDICT_WRITE), .path(UVM_PREDICT), .map(map)); + end + + // Anytime an access intr sts register predicts a value of 1, we can treat + // that as a hwset (even if it's just an AHB/APB read) because we _know_ a + // W1C won't result in value=1, which is the case we're protecting against + // by tracking this hwset flag. + // We must track the hwset flag for all value=1 (not just the transitions + // where previous=0) because occasionally an actual hwset will occur when + // the interrupt is already pending, and we still must protect against W1C + // in that case. + if (value) begin + if (sir_intr_rm != null) begin + sir_intr_rm.notif_internal_intr_r_hwset_active[fld.get_lsb_pos()] = 1'b1; + fork + begin + uvm_wait_for_nba_region(); + sir_intr_rm.notif_internal_intr_r_hwset_active[fld.get_lsb_pos()] = 1'b0; + end + join_none + end + else if (sac_intr_rm != null) begin + sac_intr_rm.notif_internal_intr_r_hwset_active[fld.get_lsb_pos()] = 1'b1; + fork + begin + uvm_wait_for_nba_region(); + sac_intr_rm.notif_internal_intr_r_hwset_active[fld.get_lsb_pos()] = 1'b0; + end + join_none + end + else + `uvm_fatal("SOC_IFC_REG_CBS", "Bad handle") end - // On rising edge of field value, check if the interrupt output pin will + // On rising edge of field value, schedule a delay job to check if the + // interrupt output pin will // transition to high. // Global interrupt pin "agg_sts" is non-sticky - if ((value & ~previous) && - en_glb.get_mirrored_value() && - en_fld.get_mirrored_value() && - ~sts_glb.get_mirrored_value()) + if ((value & ~previous)) + begin + delay_job.req_fld = fld; + delay_job.sts_reg = sts_reg; + delay_job.en_reg = en_reg; + delay_job.sts_glb = sts_glb; + delay_job.en_glb = en_glb; + delay_job.grab_values(); + delay_jobs.push_back(delay_job); + `uvm_info("SOC_IFC_REG_CBS", {"Predicted update to ", fld.get_name(), " triggers interrupt output pin check delay job"}, UVM_MEDIUM) + end + // On falling edge of field value, caused by W1C, check if another thread + // is already attempting to perform hwset to this interrupt field (hwset is + // higher priority than W1C). + else if ((~value & previous) && fld_hwset_active) begin - `uvm_info("SOC_IFC_REG_CBS", {"Predicted update to ", fld.get_name(), " triggers interrupt output pin assertion"}, UVM_MEDIUM) - sts_glb.predict(1'b1); + value = previous; + `uvm_info("SOC_IFC_REG_CBS", {"Predicted update to ", fld.get_name(), " attempts to clear the interrupt bit but is preempted by an active hwset"}, UVM_MEDIUM) + // NOTE: No delay job is scheduled because no changes are predicted to + // other interrupt register fields based on this activity end - // On falling edge of field value, check if the interrupt output pin will + // On falling edge of field value, schedule a delay job to + // check if the interrupt output pin will // transition from high to low. // Global interrupt pin "agg_sts" is non-sticky - else if ((~value & previous) && - ~|(en_reg.get_mirrored_value() & - (sts_reg.get_mirrored_value() & ~(uvm_reg_data_t'(1) << fld.get_lsb_pos()))) && - sts_glb.get_mirrored_value()) + else if ((~value & previous)) begin - `uvm_info("SOC_IFC_REG_CBS", {"Predicted update to ", fld.get_name(), " triggers interrupt output pin deassertion"}, UVM_MEDIUM) - sts_glb.predict(1'b0); + delay_job.req_fld = fld; + delay_job.sts_reg = sts_reg; + delay_job.en_reg = en_reg; + delay_job.sts_glb = sts_glb; + delay_job.en_glb = en_glb; + delay_job.grab_values(); + delay_jobs.push_back(delay_job); + `uvm_info("SOC_IFC_REG_CBS", {"Predicted update to ", fld.get_name(), " triggers interrupt output pin check delay job"}, UVM_MEDIUM) end else begin `uvm_info("SOC_IFC_REG_CBS", - $sformatf("Write to %s does not trigger interrupt output transition due to %s: [%x], %s: [%x], masked %s: [%x], and %s: [%x]", + $sformatf("Access to %s does not trigger interrupt output transition due to %s: [%x], %s: [%x], masked %s: [%x], and %s: [%x]", fld.get_name(), en_glb.get_name(), en_glb.get_mirrored_value(), diff --git a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/registers/soc_ifc_reg_cbs_intr_block_rf_ext_notif_intr_en_r_base.svh b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/registers/soc_ifc_reg_cbs_intr_block_rf_ext_notif_intr_en_r_base.svh index 2da22247e..bd138f03b 100644 --- a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/registers/soc_ifc_reg_cbs_intr_block_rf_ext_notif_intr_en_r_base.svh +++ b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/registers/soc_ifc_reg_cbs_intr_block_rf_ext_notif_intr_en_r_base.svh @@ -21,6 +21,14 @@ class soc_ifc_reg_cbs_intr_block_rf_ext_notif_intr_en_r_base extends uvm_reg_cbs string AHB_map_name = "soc_ifc_AHB_map"; string APB_map_name = "soc_ifc_APB_map"; + uvm_queue #(soc_ifc_reg_delay_job) delay_jobs; + + function new(string name = "uvm_reg_cbs"); + super.new(name); + if (!uvm_config_db#(uvm_queue#(soc_ifc_reg_delay_job))::get(null, "soc_ifc_reg_model_top", "delay_jobs", delay_jobs)) + `uvm_error("SOC_IFC_REG_CBS", "Failed to get handle for 'delay_jobs' queue from config database!") + endfunction + // Function: post_predict // // Called by the method @@ -36,6 +44,7 @@ class soc_ifc_reg_cbs_intr_block_rf_ext_notif_intr_en_r_base extends uvm_reg_cbs input uvm_predict_e kind, input uvm_path_e path, input uvm_reg_map map); + soc_ifc_reg_delay_job_intr_block_rf_ext delay_job; uvm_reg en_reg; uvm_reg_block rm; string event_name; @@ -44,6 +53,8 @@ class soc_ifc_reg_cbs_intr_block_rf_ext_notif_intr_en_r_base extends uvm_reg_cbs uvm_reg_field en_glb ; uvm_reg_field sts_glb; + delay_job = soc_ifc_reg_delay_job_intr_block_rf_ext::type_id::create("delay_job"); + delay_job.map = map; en_reg = fld.get_parent(); rm = en_reg.get_parent(); /* intr_block_rf_ext */ // Get a base-name for the event by truncating the '_en' suffix @@ -54,8 +65,11 @@ class soc_ifc_reg_cbs_intr_block_rf_ext_notif_intr_en_r_base extends uvm_reg_cbs sts_glb = rm.get_reg_by_name("notif_global_intr_r").get_field_by_name("agg_sts"); if (map.get_name() == this.APB_map_name) begin - if (kind == UVM_PREDICT_WRITE) - `uvm_warning("SOC_IFC_REG_CBS", "Unexpected write to interrupt register through APB interface!") + if (kind == UVM_PREDICT_WRITE) begin + `uvm_warning("SOC_IFC_REG_CBS", {"Unexpected write to interrupt register ", fld.get_full_name(), " through APB interface is blocked!"}) + value = previous; + return; + end else `uvm_info("SOC_IFC_REG_CBS", "Unexpected read to interrupt register through APB interface!", UVM_LOW) end @@ -64,24 +78,30 @@ class soc_ifc_reg_cbs_intr_block_rf_ext_notif_intr_en_r_base extends uvm_reg_cbs // On rising edge of field value, check if the interrupt output pin will // transition to high. // Global interrupt pin "agg_sts" is non-sticky - if ((value & ~previous) && - en_glb.get_mirrored_value() && - sts_fld.get_mirrored_value() && - ~sts_glb.get_mirrored_value()) + if ((value & ~previous)) begin `uvm_info("SOC_IFC_REG_CBS", {"Predicted update to ", fld.get_name(), " triggers interrupt output pin assertion"}, UVM_MEDIUM) - sts_glb.predict(1'b1); + delay_job.req_fld = fld; + delay_job.sts_reg = sts_reg; + delay_job.en_reg = en_reg; + delay_job.sts_glb = sts_glb; + delay_job.en_glb = en_glb; + delay_job.grab_values(); + delay_jobs.push_back(delay_job); end // On falling edge of field value, check if the interrupt output pin will // transition from high to low. // Global interrupt pin "agg_sts" is non-sticky - else if ((~value & previous) && - ~|((en_reg.get_mirrored_value() & ~(value << fld.get_lsb_pos())) & - sts_reg.get_mirrored_value()) && - sts_glb.get_mirrored_value()) + else if ((~value & previous)) begin `uvm_info("SOC_IFC_REG_CBS", {"Predicted update to ", fld.get_name(), " triggers interrupt output pin deassertion"}, UVM_MEDIUM) - sts_glb.predict(1'b0); + delay_job.req_fld = fld; + delay_job.sts_reg = sts_reg; + delay_job.en_reg = en_reg; + delay_job.sts_glb = sts_glb; + delay_job.en_glb = en_glb; + delay_job.grab_values(); + delay_jobs.push_back(delay_job); end else begin `uvm_info("SOC_IFC_REG_CBS", diff --git a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/registers/soc_ifc_reg_cbs_intr_block_rf_ext_notif_intr_trig_r_base.svh b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/registers/soc_ifc_reg_cbs_intr_block_rf_ext_notif_intr_trig_r_base.svh index 0c221185c..360bd46dc 100644 --- a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/registers/soc_ifc_reg_cbs_intr_block_rf_ext_notif_intr_trig_r_base.svh +++ b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/registers/soc_ifc_reg_cbs_intr_block_rf_ext_notif_intr_trig_r_base.svh @@ -48,8 +48,11 @@ class soc_ifc_reg_cbs_intr_block_rf_ext_notif_intr_trig_r_base extends uvm_reg_c sts_fld = sts_reg.get_field_by_name({event_name, "_sts"}); if (map.get_name() == this.APB_map_name) begin - if (kind == UVM_PREDICT_WRITE) - `uvm_warning("SOC_IFC_REG_CBS", "Unexpected write to interrupt register through APB interface!") + if (kind == UVM_PREDICT_WRITE) begin + `uvm_warning("SOC_IFC_REG_CBS", {"Unexpected write to interrupt register ", fld.get_full_name(), " through APB interface is blocked!"}) + value = previous; + return; + end else `uvm_info("SOC_IFC_REG_CBS", "Unexpected read to interrupt register through APB interface!", UVM_LOW) end diff --git a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/registers/soc_ifc_reg_cbs_mbox_csr.svh b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/registers/soc_ifc_reg_cbs_mbox_csr.svh index 5132ac70c..50c780d9f 100644 --- a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/registers/soc_ifc_reg_cbs_mbox_csr.svh +++ b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/registers/soc_ifc_reg_cbs_mbox_csr.svh @@ -21,6 +21,14 @@ virtual class soc_ifc_reg_cbs_mbox_csr extends uvm_reg_cbs; string AHB_map_name = "soc_ifc_AHB_map"; string APB_map_name = "soc_ifc_APB_map"; + uvm_queue #(soc_ifc_reg_delay_job) delay_jobs; + + function new(string name = "uvm_reg_cbs"); + super.new(name); + if (!uvm_config_db#(uvm_queue#(soc_ifc_reg_delay_job))::get(null, "soc_ifc_reg_model_top", "delay_jobs", delay_jobs)) + `uvm_error("SOC_IFC_REG_CBS", "Failed to get handle for 'delay_jobs' queue from config database!") + endfunction + // Shorthand methods to make the 'post_predict' logic more readable // in descendant classes virtual function uvm_reg_data_t mbox_dlen_mirrored(mbox_csr_ext rm); diff --git a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/registers/soc_ifc_reg_cbs_mbox_csr_mbox_cmd_command.svh b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/registers/soc_ifc_reg_cbs_mbox_csr_mbox_cmd_command.svh index f8253bdf2..2fc026380 100644 --- a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/registers/soc_ifc_reg_cbs_mbox_csr_mbox_cmd_command.svh +++ b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/registers/soc_ifc_reg_cbs_mbox_csr_mbox_cmd_command.svh @@ -14,6 +14,37 @@ // limitations under the License. //---------------------------------------------------------------------- +// Reg predictions that will be scheduled on AHB write to mbox_cmd +class soc_ifc_reg_delay_job_mbox_csr_mbox_cmd_command extends soc_ifc_reg_delay_job; + `uvm_object_utils( soc_ifc_reg_delay_job_mbox_csr_mbox_cmd_command ) + mbox_csr_ext rm; /* mbox_csr_rm */ + mbox_fsm_state_e state_nxt; + uvm_reg_map map; + virtual task do_job(); + `uvm_info("SOC_IFC_REG_DELAY_JOB", "Running delayed job for mbox_csr.mbox_cmd.command", UVM_HIGH) + // Check mbox_unlock before predicting FSM change, since a force unlock + // has priority over normal flow + // mbox_unlock only 'activates' on the falling edge of the pulse; if we detect + // that, bail out of this prediction job + if (rm.mbox_unlock.unlock.get_mirrored_value()) begin + uvm_wait_for_nba_region(); + if (!rm.mbox_unlock.unlock.get_mirrored_value()) begin + return; + end + end + if (rm.mbox_lock.lock.get_mirrored_value() && rm.mbox_fn_state_sigs.soc_cmd_stage) begin + rm.mbox_status.mbox_fsm_ps.predict(state_nxt, .kind(UVM_PREDICT_READ), .path(UVM_PREDICT), .map(map)); + rm.mbox_fn_state_sigs = '{soc_dlen_stage: 1'b1, default: 1'b0}; + `uvm_info("SOC_IFC_REG_DELAY_JOB", $sformatf("post_predict called through map [%p] on mbox_cmd results in state transition. Functional state tracker: [%p] mbox_fsm_ps transition [%p]", map.get_name(), rm.mbox_fn_state_sigs, state_nxt), UVM_FULL) + end + else if (rm.mbox_lock.lock.get_mirrored_value() && rm.mbox_fn_state_sigs.uc_cmd_stage) begin + rm.mbox_status.mbox_fsm_ps.predict(state_nxt, .kind(UVM_PREDICT_READ), .path(UVM_PREDICT), .map(map)); + rm.mbox_fn_state_sigs = '{uc_dlen_stage: 1'b1, default: 1'b0}; + `uvm_info("SOC_IFC_REG_DELAY_JOB", $sformatf("post_predict called through map [%p] on mbox_cmd results in state transition. Functional state tracker: [%p] mbox_fsm_ps transition [%p]", map.get_name(), rm.mbox_fn_state_sigs, state_nxt), UVM_FULL) + end + endtask +endclass + class soc_ifc_reg_cbs_mbox_csr_mbox_cmd_command extends soc_ifc_reg_cbs_mbox_csr; `uvm_object_utils(soc_ifc_reg_cbs_mbox_csr_mbox_cmd_command) @@ -34,18 +65,44 @@ class soc_ifc_reg_cbs_mbox_csr_mbox_cmd_command extends soc_ifc_reg_cbs_mbox_csr input uvm_path_e path, input uvm_reg_map map); mbox_csr_ext rm; /* mbox_csr_rm */ + soc_ifc_reg_delay_job_mbox_csr_mbox_cmd_command delay_job; + soc_ifc_reg_delay_job_mbox_csr_mbox_prot_error error_job; uvm_reg_block blk = fld.get_parent().get_parent(); /* mbox_csr_rm */ if (!$cast(rm,blk)) `uvm_fatal ("SOC_IFC_REG_CBS", "Failed to get valid class handle") if (map.get_name() == this.AHB_map_name) begin case (kind) inside UVM_PREDICT_WRITE: begin - if (rm.mbox_fn_state_sigs.uc_send_stage) begin - `uvm_info("SOC_IFC_REG_CBS", $sformatf("Predicting mbox_fsm_ps transition to [%p] on write to mbox_cmd", MBOX_RDY_FOR_DLEN), UVM_HIGH) - rm.mbox_status.mbox_fsm_ps.predict(MBOX_RDY_FOR_DLEN); - end - else begin - `uvm_warning("SOC_IFC_REG_CBS", $sformatf("Command written during unexpected mailbox state [%p]!", rm.mbox_fn_state_sigs)) + if (rm.mbox_fn_state_sigs.uc_cmd_stage) begin + delay_job = soc_ifc_reg_delay_job_mbox_csr_mbox_cmd_command::type_id::create("delay_job"); + delay_job.rm = rm; + delay_job.map = map; + delay_job.set_delay_cycles(0); + delay_job.state_nxt = MBOX_RDY_FOR_DLEN; + delay_jobs.push_back(delay_job); + `uvm_info("SOC_IFC_REG_CBS", $sformatf("Write to %s on map [%s] with value [%x] predicts a state change. Delay job is queued to update DUT model.", fld.get_name(), map.get_name(), value), UVM_HIGH) end +// else if (rm.mbox_fn_state_sigs.mbox_idle) begin +// error_job = soc_ifc_reg_delay_job_mbox_csr_mbox_prot_error::type_id::create("error_job"); +// error_job.rm = rm; +// error_job.map = map; +// error_job.fld = fld; +// error_job.set_delay_cycles(0); +// error_job.state_nxt = MBOX_IDLE; +// error_job.error = '{axs_without_lock: 1'b1, default: 1'b0}; +// delay_jobs.push_back(error_job); +// `uvm_info("SOC_IFC_REG_CBS", $sformatf("Write to %s on map [%s] with value [%x] causes a mbox no_lock protocol error. Delay job is queued to update DUT model.", fld.get_name(), map.get_name(), value), UVM_HIGH) +// end +// else begin +// error_job = soc_ifc_reg_delay_job_mbox_csr_mbox_prot_error::type_id::create("error_job"); +// error_job.rm = rm; +// error_job.map = map; +// error_job.fld = fld; +// error_job.set_delay_cycles(0); +// error_job.state_nxt = MBOX_ERROR; +// error_job.error = '{axs_incorrect_order: 1'b1, default: 1'b0}; +// delay_jobs.push_back(error_job); +// `uvm_warning("SOC_IFC_REG_CBS", $sformatf("Command written during unexpected mailbox state [%p] results in mbox ooo protocol error!", rm.mbox_fn_state_sigs)) +// end end default: begin `uvm_info("SOC_IFC_REG_CBS", $sformatf("post_predict called with kind [%p] has no effect", kind), UVM_FULL) @@ -55,12 +112,40 @@ class soc_ifc_reg_cbs_mbox_csr_mbox_cmd_command extends soc_ifc_reg_cbs_mbox_csr else if (map.get_name() == this.APB_map_name) begin case (kind) inside UVM_PREDICT_WRITE: begin - if (rm.mbox_fn_state_sigs.soc_send_stage) begin - `uvm_info("SOC_IFC_REG_CBS", $sformatf("Predicting mbox_fsm_ps transition to [%p] on write to mbox_cmd", MBOX_RDY_FOR_DLEN), UVM_HIGH) - rm.mbox_status.mbox_fsm_ps.predict(MBOX_RDY_FOR_DLEN); + if (rm.mbox_fn_state_sigs.soc_cmd_stage/* && (rm.mbox_status.mbox_fsm_ps.get_mirrored_value() == MBOX_RDY_FOR_CMD)*/) begin + delay_job = soc_ifc_reg_delay_job_mbox_csr_mbox_cmd_command::type_id::create("delay_job"); + delay_job.rm = rm; + delay_job.map = map; + delay_job.set_delay_cycles(0); + delay_job.state_nxt = MBOX_RDY_FOR_DLEN; + delay_jobs.push_back(delay_job); + `uvm_info("SOC_IFC_REG_CBS", $sformatf("Write to %s on map [%s] with value [%x] predicts a state change. Delay job is queued to update DUT model.", fld.get_name(), map.get_name(), value), UVM_HIGH) + end + else if (rm.mbox_fn_state_sigs.mbox_idle) begin + error_job = soc_ifc_reg_delay_job_mbox_csr_mbox_prot_error::type_id::create("error_job"); + error_job.rm = rm; + error_job.map = map; + error_job.fld = fld; + error_job.set_delay_cycles(0); + error_job.state_nxt = MBOX_IDLE; + error_job.error = '{axs_without_lock: 1'b1, default: 1'b0}; + delay_jobs.push_back(error_job); + `uvm_info("SOC_IFC_REG_CBS", $sformatf("Write to %s on map [%s] with value [%x] causes a mbox no_lock protocol violation. Delay job is queued to update DUT model.", fld.get_name(), map.get_name(), value), UVM_HIGH) + end + else if (rm.mbox_fn_state_sigs.mbox_error) begin + `uvm_info("SOC_IFC_REG_CBS", $sformatf("Write to %s on map [%s] with value [%x] during mailbox state [%p] has no additional side effects!", fld.get_name(), map.get_name(), value, rm.mbox_fn_state_sigs), UVM_LOW) end else begin - `uvm_warning("SOC_IFC_REG_CBS", $sformatf("Command written during unexpected mailbox state [%p]!", rm.mbox_fn_state_sigs)) + error_job = soc_ifc_reg_delay_job_mbox_csr_mbox_prot_error::type_id::create("error_job"); + error_job.rm = rm; + error_job.map = map; + error_job.fld = fld; + error_job.set_delay_cycles(0); + error_job.state_nxt = MBOX_ERROR; + error_job.error = '{axs_incorrect_order: 1'b1, default: 1'b0}; + delay_jobs.push_back(error_job); + `uvm_info("SOC_IFC_REG_CBS", $sformatf("Write to %s on map [%s] with value [%x] during unexpected mailbox state [%p] results in mbox ooo protocol violation!", fld.get_name(), map.get_name(), value, rm.mbox_fn_state_sigs), UVM_LOW) + rm.mbox_fn_state_sigs = '{mbox_error: 1'b1, default: 1'b0}; end end default: begin diff --git a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/registers/soc_ifc_reg_cbs_mbox_csr_mbox_datain_datain.svh b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/registers/soc_ifc_reg_cbs_mbox_csr_mbox_datain_datain.svh index ecab0ac35..19cc7df57 100644 --- a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/registers/soc_ifc_reg_cbs_mbox_csr_mbox_datain_datain.svh +++ b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/registers/soc_ifc_reg_cbs_mbox_csr_mbox_datain_datain.svh @@ -35,6 +35,7 @@ class soc_ifc_reg_cbs_mbox_csr_mbox_datain_datain extends soc_ifc_reg_cbs_mbox_c input uvm_reg_map map); // Maximum allowable size for data transferred via mailbox int unsigned dlen_cap_dw; + soc_ifc_reg_delay_job_mbox_csr_mbox_prot_error error_job; mbox_csr_ext rm; /* mbox_csr_rm */ uvm_mem mm; /* mbox_mem_rm "mem model" */ uvm_reg_block blk = fld.get_parent().get_parent(); /* mbox_csr_rm */ @@ -50,11 +51,12 @@ class soc_ifc_reg_cbs_mbox_csr_mbox_datain_datain extends soc_ifc_reg_cbs_mbox_c // - uC has lock (checked in soc_ifc_predictor) // - mbox state is in MBOX_RDY_FOR_DATA or EXECUTE_UC UVM_PREDICT_WRITE: begin - if (rm.mbox_fn_state_sigs.uc_send_stage) begin + if (rm.mbox_fn_state_sigs.uc_data_stage) begin `uvm_info("SOC_IFC_REG_CBS", $sformatf("post_predict called through map [%s] results in data entry push to mbox_data_q", map.get_name()), UVM_FULL) // A potential issue because uC should have set dlen prior to pushing data if (rm.mbox_data_q.size() >= dlen_cap_dw) begin - `uvm_warning("SOC_IFC_REG_CBS", "Push to datain observed when mbox_data_q already contains the same number of entries as indicated in mbox_dlen or the mailbox maximum capacity!") +// `uvm_warning("SOC_IFC_REG_CBS", "Push to datain observed when mbox_data_q already contains the same number of entries as indicated in mbox_dlen or the mailbox maximum capacity!") + `uvm_info("SOC_IFC_REG_CBS", $sformatf("Push to datain observed when mbox_data_q already contains the same number of entries [%d] as indicated in mbox_dlen [%d bytes] or the mailbox maximum capacity!", rm.mbox_data_q.size(), mbox_dlen_mirrored(rm)), UVM_LOW) end rm.mbox_data_q.push_back(value); if (rm.mbox_data_q.size() == 1) begin @@ -64,7 +66,9 @@ class soc_ifc_reg_cbs_mbox_csr_mbox_datain_datain extends soc_ifc_reg_cbs_mbox_c // The warning is safe to ignore because the mbox_dataout // callback does post-prediction from data queue accordingly rm.mbox_data_q.push_front(rm.mbox_dataout.dataout.get_mirrored_value()); /* Sacrificial entry will be immediately removed in mbox_dataout callback */ + rm.mbox_datain_to_dataout_predict.trigger(); rm.mbox_dataout.dataout.predict(value, .kind(UVM_PREDICT_READ), .path(UVM_PREDICT), .map(map)); + rm.mbox_datain_to_dataout_predict.reset(); end end else if (rm.mbox_fn_state_sigs.uc_receive_stage) begin @@ -74,17 +78,6 @@ class soc_ifc_reg_cbs_mbox_csr_mbox_datain_datain extends soc_ifc_reg_cbs_mbox_c `uvm_info("SOC_IFC_REG_CBS", "Push to datain observed when mbox_resp_q already contains the same number of entries as indicated in mbox_dlen or the mailbox maximum capacity!", UVM_HIGH) end rm.mbox_resp_q.push_back(value); - if (rm.mbox_resp_q.size() == 1) begin - `uvm_info("SOC_IFC_REG_CBS", $sformatf("post_predict called through map [%s] results in data entry updating dataout mirror", map.get_name()), UVM_FULL) - // Use UVM_PREDICT_READ to workaround the warning that gets thrown (on - // accesses while busy) when running UVM_PREDICT_DIRECT. - // The warning is safe to ignore because the mbox_dataout - // callback does post-prediction from data queue accordingly - rm.mbox_data_q.push_front(value); /* Entry is used for value prediction if mbox_data_q is not empty, which might be the case depending on the test */ - rm.mbox_data_q.push_front(rm.mbox_dataout.dataout.get_mirrored_value()); /* Sacrificial entry will be immediately removed in mbox_dataout callback */ - rm.mbox_dataout.dataout.predict(value, .kind(UVM_PREDICT_READ), .path(UVM_PREDICT), .map(map)); - rm.mbox_data_q.pop_front(); /* Remove the value we put on the queue for prediction -- receiver might continue reading from dataout even after pushing to datain ??? */ - end end else begin `uvm_error("SOC_IFC_REG_CBS", $sformatf("Attempted push to mbox_datain in unexpected mbox FSM state: [%p]", rm.mbox_fn_state_sigs)) @@ -104,10 +97,10 @@ class soc_ifc_reg_cbs_mbox_csr_mbox_datain_datain extends soc_ifc_reg_cbs_mbox_c // - mbox state is in MBOX_RDY_FOR_DATA // - if mbox state is EXECUTE_SOC, pushes not allowed because there is never resp data SOC->uC UVM_PREDICT_WRITE: begin - if (rm.mbox_fn_state_sigs.soc_send_stage) begin + if (rm.mbox_fn_state_sigs.soc_data_stage) begin `uvm_info("SOC_IFC_REG_CBS", $sformatf("post_predict called through map [%s] results in data entry push to mbox_data_q", map.get_name()), UVM_FULL) if (rm.mbox_data_q.size() >= dlen_cap_dw) begin - `uvm_info("SOC_IFC_REG_CBS", "Push to datain observed when mbox_data_q already contains the same number of entries as indicated in mbox_dlen or the mailbox maximum capacity!", UVM_HIGH) + `uvm_info("SOC_IFC_REG_CBS", $sformatf("Push to datain observed when mbox_data_q already contains the same number of entries [%d] as indicated in mbox_dlen [%d bytes] or the mailbox maximum capacity!", rm.mbox_data_q.size(), mbox_dlen_mirrored(rm)), UVM_LOW) end rm.mbox_data_q.push_back(value); if (rm.mbox_data_q.size() == 1) begin @@ -117,11 +110,39 @@ class soc_ifc_reg_cbs_mbox_csr_mbox_datain_datain extends soc_ifc_reg_cbs_mbox_c // The warning is safe to ignore because the mbox_dataout // callback does post-prediction from data queue accordingly rm.mbox_data_q.push_front(rm.mbox_dataout.dataout.get_mirrored_value()); /* Sacrificial entry will be immediately removed in mbox_dataout callback */ + rm.mbox_datain_to_dataout_predict.trigger(); rm.mbox_dataout.dataout.predict(value, .kind(UVM_PREDICT_READ), .path(UVM_PREDICT), .map(map)); + rm.mbox_datain_to_dataout_predict.reset(); end + `uvm_info("SOC_IFC_REG_CBS", $sformatf("After processing write to mbox_datain, mbox_data_q.size(): [%d]", rm.mbox_data_q.size()), UVM_DEBUG) + end + else if (rm.mbox_fn_state_sigs.mbox_idle) begin + error_job = soc_ifc_reg_delay_job_mbox_csr_mbox_prot_error::type_id::create("error_job"); + error_job.rm = rm; + error_job.map = map; + error_job.fld = fld; + error_job.set_delay_cycles(0); + error_job.state_nxt = MBOX_IDLE; + error_job.error = '{axs_without_lock: 1'b1, default: 1'b0}; + delay_jobs.push_back(error_job); + `uvm_info("SOC_IFC_REG_CBS", $sformatf("Write to [%s] on map [%s] with value [%x] causes a mbox no_lock protocol violation. Delay job is queued to update DUT model.", fld.get_name(), map.get_name(), value), UVM_HIGH) + end + else if (rm.mbox_fn_state_sigs.mbox_error) begin + `uvm_info("SOC_IFC_REG_CBS", $sformatf("Write to %s on map [%s] with value [%x] during mailbox state [%p] has no additional side effects!", fld.get_name(), map.get_name(), value, rm.mbox_fn_state_sigs), UVM_LOW) end else begin - `uvm_error("SOC_IFC_REG_CBS", $sformatf("Attempted push to mbox_datain in unexpected mbox FSM state: [%p]", rm.mbox_fn_state_sigs)) + mbox_fsm_state_e mbox_fsm_ps; + error_job = soc_ifc_reg_delay_job_mbox_csr_mbox_prot_error::type_id::create("error_job"); + error_job.rm = rm; + error_job.map = map; + error_job.fld = fld; + error_job.set_delay_cycles(0); + error_job.state_nxt = MBOX_ERROR; + error_job.error = '{axs_incorrect_order: 1'b1, default: 1'b0}; + delay_jobs.push_back(error_job); + mbox_fsm_ps = mbox_fsm_state_e'(rm.mbox_status.mbox_fsm_ps.get_mirrored_value()); + `uvm_info("SOC_IFC_REG_CBS", $sformatf("Write to %s on map [%s] with value [%x] during unexpected mailbox state [%p] [%p] results in mbox ooo protocol violation!", fld.get_name(), map.get_name(), value, rm.mbox_fn_state_sigs, mbox_fsm_ps), UVM_LOW) + rm.mbox_fn_state_sigs = '{mbox_error: 1'b1, default: 1'b0}; end end default: begin diff --git a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/registers/soc_ifc_reg_cbs_mbox_csr_mbox_dataout_dataout.svh b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/registers/soc_ifc_reg_cbs_mbox_csr_mbox_dataout_dataout.svh index 670a7123f..41a9a7c7d 100644 --- a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/registers/soc_ifc_reg_cbs_mbox_csr_mbox_dataout_dataout.svh +++ b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/registers/soc_ifc_reg_cbs_mbox_csr_mbox_dataout_dataout.svh @@ -33,28 +33,52 @@ class soc_ifc_reg_cbs_mbox_csr_mbox_dataout_dataout extends soc_ifc_reg_cbs_mbox input uvm_predict_e kind, input uvm_path_e path, input uvm_reg_map map); + soc_ifc_reg_delay_job_mbox_csr_mbox_prot_error error_job; mbox_csr_ext rm; /* mbox_csr_rm */ uvm_reg_block blk = fld.get_parent().get_parent(); /* mbox_csr_rm */ if (!$cast(rm,blk)) `uvm_fatal ("SOC_IFC_REG_CBS", "Failed to get valid class handle") - if ((map.get_name() == this.AHB_map_name) || - (map.get_name() == this.APB_map_name)) begin - // Flag unexpected accesses based on system state, leaving an exception - // for UVM_PREDICT calls via writes to mbox_datain - // (This winds up being an exception for _any_ READ from dataout, - // because this method is only called from the apb_reg_predictor - // with UVM_PREDICT. So this is not going to catch bad reads.) - case (map.get_name()) inside - this.AHB_map_name: begin - if (!rm.mbox_fn_state_sigs.uc_receive_stage && - (path != UVM_PREDICT || kind != UVM_PREDICT_READ)) - `uvm_error("SOC_IFC_REG_CBS", $sformatf("Access to dataout of kind [%p] is unexpected on map [%s]! Mailbox state tracker: %p", kind, map.get_name(), rm.mbox_fn_state_sigs)) + // Flag unexpected accesses based on system state, leaving an exception + // for UVM_PREDICT calls triggered by writes to mbox_datain + case (map.get_name()) inside + this.AHB_map_name: begin + if (!rm.mbox_fn_state_sigs.uc_receive_stage && + rm.mbox_datain_to_dataout_predict.is_off()) + `uvm_error("SOC_IFC_REG_CBS", $sformatf("Access to dataout of kind [%p] is unexpected on map [%s]! Mailbox state tracker: %p", kind, map.get_name(), rm.mbox_fn_state_sigs)) + end + this.APB_map_name: begin + if (rm.mbox_fn_state_sigs.mbox_idle && rm.mbox_datain_to_dataout_predict.is_off()) begin + error_job = soc_ifc_reg_delay_job_mbox_csr_mbox_prot_error::type_id::create("error_job"); + error_job.rm = rm; + error_job.map = map; + error_job.fld = fld; + error_job.set_delay_cycles(0); + error_job.state_nxt = MBOX_IDLE; + error_job.error = '{axs_without_lock: 1'b1, default: 1'b0}; + delay_jobs.push_back(error_job); end - this.APB_map_name: begin - if (!rm.mbox_fn_state_sigs.soc_receive_stage && !rm.mbox_fn_state_sigs.soc_done_stage && - (path != UVM_PREDICT || kind != UVM_PREDICT_READ)) - `uvm_error("SOC_IFC_REG_CBS", $sformatf("Access to dataout of kind [%p] is unexpected on map [%s]! Mailbox state tracker: %p", kind, map.get_name(), rm.mbox_fn_state_sigs)) + else if (rm.mbox_fn_state_sigs.mbox_error) begin + `uvm_info("SOC_IFC_REG_CBS", $sformatf("Write to %s on map [%s] with value [%x] during mailbox state [%p] has no additional side effects!", fld.get_name(), map.get_name(), value, rm.mbox_fn_state_sigs), UVM_LOW) end - endcase + // FIXME should we treat all writes to mbox_dataout as protocol error? + else if ((kind == UVM_PREDICT_WRITE) || + ((!rm.mbox_fn_state_sigs.soc_receive_stage && !rm.mbox_fn_state_sigs.soc_done_stage) && + rm.mbox_datain_to_dataout_predict.is_off())) begin + error_job = soc_ifc_reg_delay_job_mbox_csr_mbox_prot_error::type_id::create("error_job"); + error_job.rm = rm; + error_job.map = map; + error_job.fld = fld; + error_job.set_delay_cycles(0); + error_job.state_nxt = MBOX_ERROR; + error_job.error = '{axs_incorrect_order: 1'b1, default: 1'b0}; + delay_jobs.push_back(error_job); + `uvm_error("SOC_IFC_REG_CBS", $sformatf("Access to dataout of kind [%p] is unexpected on map [%s]! Flagging mailbox protocol violation. Mailbox state tracker: %p", kind, map.get_name(), rm.mbox_fn_state_sigs)) + rm.mbox_fn_state_sigs = '{mbox_error: 1'b1, default: 1'b0}; + end + end + endcase + // Update the data queue and modify predicted value for mbox_dataout + if ((map.get_name() == this.AHB_map_name) || + (map.get_name() == this.APB_map_name)) begin case (kind) inside UVM_PREDICT_WRITE: begin if (value != previous) begin @@ -68,6 +92,7 @@ class soc_ifc_reg_cbs_mbox_csr_mbox_dataout_dataout extends soc_ifc_reg_cbs_mbox // Next entry in the queue is the predicted value for the // subsequent access if (rm.mbox_data_q.size() > 0) begin + `uvm_info("SOC_IFC_REG_CBS", "On read from mbox_dataout, popping front entry from mbox_data_q and predicting next value of mbox_dataout register", UVM_DEBUG) if (previous != rm.mbox_data_q[0]) `uvm_error("SOC_IFC_REG_CBS", $sformatf("Current mirrored value [0x%x] in %s does not match the element at the front of the mailbox data queue [0x%x]!", previous, fld.get_full_name(), rm.mbox_data_q[0])) rm.mbox_data_q.pop_front(); @@ -78,9 +103,11 @@ class soc_ifc_reg_cbs_mbox_csr_mbox_dataout_dataout extends soc_ifc_reg_cbs_mbox end else begin `uvm_info("SOC_IFC_REG_CBS", $sformatf("Read from %s gets the last available value in the mailbox", fld.get_full_name()), UVM_HIGH) + value = 0; end + `uvm_info("SOC_IFC_REG_CBS", $sformatf("After processing read from mbox_dataout, mbox_data_q.size(): [%d]", rm.mbox_data_q.size()), UVM_DEBUG) end - else begin + else if (rm.mbox_datain_to_dataout_predict.is_off()) begin // TODO escalate to uvm_warning? // Some tests do this deliberately, we don't want those to fail `uvm_info("SOC_IFC_REG_CBS", "Attempted read from mbox_dataout when mailbox_data_q is empty!", UVM_MEDIUM) diff --git a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/registers/soc_ifc_reg_cbs_mbox_csr_mbox_dlen_length.svh b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/registers/soc_ifc_reg_cbs_mbox_csr_mbox_dlen_length.svh index 7f76bd0fb..019df9fa3 100644 --- a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/registers/soc_ifc_reg_cbs_mbox_csr_mbox_dlen_length.svh +++ b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/registers/soc_ifc_reg_cbs_mbox_csr_mbox_dlen_length.svh @@ -14,6 +14,37 @@ // limitations under the License. //---------------------------------------------------------------------- +// Reg predictions that will be scheduled on AHB write to mbox_dlen +class soc_ifc_reg_delay_job_mbox_csr_mbox_dlen_length extends soc_ifc_reg_delay_job; + `uvm_object_utils( soc_ifc_reg_delay_job_mbox_csr_mbox_dlen_length ) + mbox_csr_ext rm; /* mbox_csr_rm */ + mbox_fsm_state_e state_nxt; + uvm_reg_map map; + virtual task do_job(); + `uvm_info("SOC_IFC_REG_DELAY_JOB", "Running delayed job for mbox_csr.mbox_dlen.length", UVM_HIGH) + // Check mbox_unlock before predicting FSM change, since a force unlock + // has priority over normal flow + // mbox_unlock only 'activates' on the falling edge of the pulse; if we detect + // that, bail out of this prediction job + if (rm.mbox_unlock.unlock.get_mirrored_value()) begin + uvm_wait_for_nba_region(); + if (!rm.mbox_unlock.unlock.get_mirrored_value()) begin + return; + end + end + if (rm.mbox_lock.lock.get_mirrored_value() && rm.mbox_fn_state_sigs.soc_dlen_stage) begin + rm.mbox_status.mbox_fsm_ps.predict(state_nxt, .kind(UVM_PREDICT_READ), .path(UVM_PREDICT), .map(map)); + rm.mbox_fn_state_sigs = '{soc_data_stage: 1'b1, default: 1'b0}; + `uvm_info("SOC_IFC_REG_DELAY_JOB", $sformatf("post_predict called through map [%p] on mbox_dlen results in state transition. Functional state tracker: [%p] mbox_fsm_ps transition [%p]", map.get_name(), rm.mbox_fn_state_sigs, state_nxt), UVM_FULL) + end + else if (rm.mbox_lock.lock.get_mirrored_value() && rm.mbox_fn_state_sigs.uc_dlen_stage) begin + rm.mbox_status.mbox_fsm_ps.predict(state_nxt, .kind(UVM_PREDICT_READ), .path(UVM_PREDICT), .map(map)); + rm.mbox_fn_state_sigs = '{uc_data_stage: 1'b1, default: 1'b0}; + `uvm_info("SOC_IFC_REG_DELAY_JOB", $sformatf("post_predict called through map [%p] on mbox_dlen results in state transition. Functional state tracker: [%p] mbox_fsm_ps transition [%p]", map.get_name(), rm.mbox_fn_state_sigs, state_nxt), UVM_FULL) + end + endtask +endclass + class soc_ifc_reg_cbs_mbox_csr_mbox_dlen_length extends soc_ifc_reg_cbs_mbox_csr; `uvm_object_utils(soc_ifc_reg_cbs_mbox_csr_mbox_dlen_length) @@ -34,14 +65,22 @@ class soc_ifc_reg_cbs_mbox_csr_mbox_dlen_length extends soc_ifc_reg_cbs_mbox_csr input uvm_path_e path, input uvm_reg_map map); mbox_csr_ext rm; /* mbox_csr_rm */ + soc_ifc_reg_delay_job_mbox_csr_mbox_dlen_length delay_job; + soc_ifc_reg_delay_job_mbox_csr_mbox_prot_error error_job; uvm_reg_block blk = fld.get_parent().get_parent(); /* mbox_csr_rm */ if (!$cast(rm,blk)) `uvm_fatal ("SOC_IFC_REG_CBS", "Failed to get valid class handle") + delay_job = soc_ifc_reg_delay_job_mbox_csr_mbox_dlen_length::type_id::create("delay_job"); + delay_job.rm = rm; + delay_job.map = map; + delay_job.set_delay_cycles(0); if (map.get_name() == this.AHB_map_name) begin case (kind) inside UVM_PREDICT_WRITE: begin - if (rm.mbox_fn_state_sigs.uc_send_stage) begin + if (rm.mbox_fn_state_sigs.uc_dlen_stage) begin `uvm_info("SOC_IFC_REG_CBS", $sformatf("Predicting mbox_fsm_ps transition to [%p] on write to mbox_dlen", MBOX_RDY_FOR_DATA), UVM_HIGH) - rm.mbox_status.mbox_fsm_ps.predict(MBOX_RDY_FOR_DATA); + delay_job.state_nxt = MBOX_RDY_FOR_DATA; + delay_jobs.push_back(delay_job); + `uvm_info("SOC_IFC_REG_CBS", $sformatf("Write to mbox_dlen on map [%s] with value [%x] predicts a state change. Delay job is queued to update DUT model.", map.get_name(), value), UVM_HIGH) end // uC updates mbox_dlen to reflect size of response data else if (rm.mbox_fn_state_sigs.uc_receive_stage) begin @@ -59,12 +98,37 @@ class soc_ifc_reg_cbs_mbox_csr_mbox_dlen_length extends soc_ifc_reg_cbs_mbox_csr else if (map.get_name() == this.APB_map_name) begin case (kind) inside UVM_PREDICT_WRITE: begin - if (rm.mbox_fn_state_sigs.soc_send_stage) begin + if (rm.mbox_fn_state_sigs.soc_dlen_stage) begin `uvm_info("SOC_IFC_REG_CBS", $sformatf("Predicting mbox_fsm_ps transition to [%p] on write to mbox_dlen", MBOX_RDY_FOR_DATA), UVM_HIGH) - rm.mbox_status.mbox_fsm_ps.predict(MBOX_RDY_FOR_DATA); + delay_job.state_nxt = MBOX_RDY_FOR_DATA; + delay_jobs.push_back(delay_job); + `uvm_info("SOC_IFC_REG_CBS", $sformatf("Write to mbox_dlen on map [%s] with value [%x] predicts a state change. Delay job is queued to update DUT model.", map.get_name(), value), UVM_HIGH) + end + else if (rm.mbox_fn_state_sigs.mbox_idle) begin + error_job = soc_ifc_reg_delay_job_mbox_csr_mbox_prot_error::type_id::create("error_job"); + error_job.rm = rm; + error_job.map = map; + error_job.fld = fld; + error_job.set_delay_cycles(0); + error_job.state_nxt = MBOX_IDLE; + error_job.error = '{axs_without_lock: 1'b1, default: 1'b0}; + delay_jobs.push_back(error_job); + `uvm_info("SOC_IFC_REG_CBS", $sformatf("DLEN written during unexpected mailbox state [%p]!", rm.mbox_fn_state_sigs), UVM_LOW) + end + else if (rm.mbox_fn_state_sigs.mbox_error) begin + `uvm_info("SOC_IFC_REG_CBS", $sformatf("Write to %s on map [%s] with value [%x] during mailbox state [%p] has no additional side effects!", fld.get_name(), map.get_name(), value, rm.mbox_fn_state_sigs), UVM_LOW) end else begin - `uvm_warning("SOC_IFC_REG_CBS", $sformatf("DLEN written during unexpected mailbox state [%p]!", rm.mbox_fn_state_sigs)) + error_job = soc_ifc_reg_delay_job_mbox_csr_mbox_prot_error::type_id::create("error_job"); + error_job.rm = rm; + error_job.map = map; + error_job.fld = fld; + error_job.set_delay_cycles(0); + error_job.state_nxt = MBOX_ERROR; + error_job.error = '{axs_incorrect_order: 1'b1, default: 1'b0}; + delay_jobs.push_back(error_job); + `uvm_info("SOC_IFC_REG_CBS", $sformatf("DLEN written during unexpected mailbox state [%p]!", rm.mbox_fn_state_sigs), UVM_LOW) + rm.mbox_fn_state_sigs = '{mbox_error: 1'b1, default: 1'b0}; end end default: begin diff --git a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/registers/soc_ifc_reg_cbs_mbox_csr_mbox_execute_execute.svh b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/registers/soc_ifc_reg_cbs_mbox_csr_mbox_execute_execute.svh index d85962c04..aa25c9ad8 100644 --- a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/registers/soc_ifc_reg_cbs_mbox_csr_mbox_execute_execute.svh +++ b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/registers/soc_ifc_reg_cbs_mbox_csr_mbox_execute_execute.svh @@ -14,6 +14,96 @@ // limitations under the License. //---------------------------------------------------------------------- +// Reg predictions that will be scheduled on AHB write to mbox_execute +class soc_ifc_reg_delay_job_mbox_csr_mbox_execute_execute extends soc_ifc_reg_delay_job; + `uvm_object_utils( soc_ifc_reg_delay_job_mbox_csr_mbox_execute_execute ) + mbox_csr_ext rm; /* mbox_csr_rm */ + mbox_fsm_state_e state_nxt; + uvm_reg_map map; + virtual task do_job(); + bit skip = 0; + `uvm_info("SOC_IFC_REG_DELAY_JOB", "Running delayed job for mbox_csr.mbox_execute.execute", UVM_HIGH) + // Check mbox_unlock before predicting FSM change, since a force unlock + // has priority over normal flow + // mbox_unlock only 'activates' on the falling edge of the pulse; if we detect + // that, bail out of this prediction job + if (rm.mbox_unlock.unlock.get_mirrored_value()) begin + uvm_wait_for_nba_region(); + if (!rm.mbox_unlock.unlock.get_mirrored_value()) begin + skip = 1; + end + end + if (rm.mbox_fn_state_sigs.mbox_error) begin + skip = 1; + end + if (rm.mbox_lock.lock.get_mirrored_value() && !skip) begin + rm.mbox_status.mbox_fsm_ps.predict(state_nxt, .kind(UVM_PREDICT_READ), .path(UVM_PREDICT), .map(map)); + case (state_nxt) inside + MBOX_IDLE: begin + rm.mbox_fn_state_sigs = '{mbox_idle: 1'b1, default: 1'b0}; + rm.mbox_status.status.predict(CMD_BUSY, .kind(UVM_PREDICT_READ), .path(UVM_PREDICT), .map(map)); + rm.mbox_status.soc_has_lock.predict(1'b0, .kind(UVM_PREDICT_READ), .path(UVM_PREDICT), .map(map)); + `uvm_info("SOC_IFC_REG_DELAY_JOB", $sformatf("post_predict called through map [%p] on mbox_execute results in state transition. Functional state tracker: [%p] mbox_fsm_ps transition [%p]", map.get_name(), rm.mbox_fn_state_sigs, state_nxt), UVM_FULL) + if (rm.mbox_lock.is_busy()) begin + `uvm_info("SOC_IFC_REG_DELAY_JOB", "Delay job for mbox_execute attempted to clear mbox_lock, but hit access collision! Flagging clear event in reg-model for mbox_lock callback to handle", UVM_LOW) + rm.mbox_lock_clr_miss.trigger(null); + uvm_wait_for_nba_region(); + // If the bus transfer is still in progress (it didn't terminate on the same + // falling clock edge as when this delay job was run), then just override the + // mirrored value immediately. Clear is_busy to avoid a UVM_WARNING. + // This use-case is definitely a hack, but it is necessary to synchronize + // the mbox_lock mirror with the design, chronologically. + if (rm.mbox_lock.is_busy()) begin + rm.mbox_lock.Xset_busyX(0); + rm.mbox_lock.lock.predict(0); + rm.mbox_lock.Xset_busyX(1); + end + else begin + fork + begin + rm.mbox_lock_clr_miss.wait_off(); + disable MBOX_CLR_TIMEOUT; + end + begin: MBOX_CLR_TIMEOUT + // If it takes any amount of time for the pending lock to be cleared, that + // means we've encountered some environment bug (since the accessing i/f + // completed it's transfer, the reg prediction should be instantaneous) + uvm_wait_for_nba_region(); + `uvm_error("SOC_IFC_REG_DELAY_JOB", $sformatf("mbox_lock clear activity, originally requested by mbox_execute callback but unserviceable, was scheduled to be completed during mbox_lock callback but took longer than expected to finish!")) + end + join_any + end + end + else begin + rm.mbox_lock.lock.predict(0); + end + end + MBOX_EXECUTE_SOC: begin + rm.mbox_fn_state_sigs = '{soc_receive_stage: 1'b1, default: 1'b0}; + `uvm_info("SOC_IFC_REG_DELAY_JOB", $sformatf("post_predict called through map [%p] on mbox_execute results in state transition. Functional state tracker: [%p] mbox_fsm_ps transition [%p]", map.get_name(), rm.mbox_fn_state_sigs, state_nxt), UVM_FULL) + end + MBOX_EXECUTE_UC: begin + rm.mbox_fn_state_sigs = '{uc_receive_stage: 1'b1, default: 1'b0}; + `uvm_info("SOC_IFC_REG_DELAY_JOB", $sformatf("post_predict called through map [%p] on mbox_execute results in state transition. Functional state tracker: [%p] mbox_fsm_ps transition [%p]", map.get_name(), rm.mbox_fn_state_sigs, state_nxt), UVM_FULL) + end + default: begin + `uvm_warning("SOC_IFC_REG_DELAY_JOB", $sformatf("post_predict called through map [%p] on mbox_execute results in unexpected state transition. Functional state tracker: [%p] mbox_fsm_ps transition [%p]", map.get_name(), rm.mbox_fn_state_sigs, state_nxt)) + end + endcase + `uvm_info("SOC_IFC_REG_DELAY_JOB", $sformatf("post_predict called through map [%p] on mbox_execute finished processing", map.get_name()), UVM_FULL) + end + else begin + `uvm_info("SOC_IFC_REG_DELAY_JOB", + $sformatf("Delay job for mbox_execute does not predict any changes due to: mbox_lock mirror [%d] skip [%d] mbox_fsm_ps [%p] mbox_fn_state_sigs [%p]", + rm.mbox_lock.lock.get_mirrored_value(), + skip, /*rm.mbox_unlock.unlock.get_mirrored_value(),*/ + rm.mbox_status.mbox_fsm_ps.get_mirrored_value(), + rm.mbox_fn_state_sigs), + UVM_LOW) + end + endtask +endclass + class soc_ifc_reg_cbs_mbox_csr_mbox_execute_execute extends soc_ifc_reg_cbs_mbox_csr; `uvm_object_utils(soc_ifc_reg_cbs_mbox_csr_mbox_execute_execute) @@ -33,15 +123,19 @@ class soc_ifc_reg_cbs_mbox_csr_mbox_execute_execute extends soc_ifc_reg_cbs_mbox input uvm_predict_e kind, input uvm_path_e path, input uvm_reg_map map); + soc_ifc_reg_delay_job_mbox_csr_mbox_execute_execute delay_job; + soc_ifc_reg_delay_job_mbox_csr_mbox_prot_error error_job; mbox_csr_ext rm; /* mbox_csr_rm */ uvm_mem mm; /* mbox_mem_rm "mem model" */ - uvm_reg_block blk = fld.get_parent().get_parent(); /* mbox_csr_rm */ uvm_reg_block rm_top; - uvm_reg_field intr_fld; + uvm_reg_block blk = fld.get_parent().get_parent(); /* mbox_csr_rm */ if (!$cast(rm,blk)) `uvm_fatal ("SOC_IFC_REG_CBS", "Failed to get valid class handle") rm_top = rm.get_parent(); mm = rm_top.get_mem_by_name("mbox_mem_rm"); - intr_fld = rm_top.get_block_by_name("soc_ifc_reg_rm").get_block_by_name("intr_block_rf_ext").get_field_by_name("notif_cmd_avail_sts"); + delay_job = soc_ifc_reg_delay_job_mbox_csr_mbox_execute_execute::type_id::create("delay_job"); + delay_job.rm = rm; + delay_job.map = map; + delay_job.set_delay_cycles(0); if (map.get_name() == this.AHB_map_name) begin case (kind) inside UVM_PREDICT_WRITE: begin @@ -53,30 +147,28 @@ class soc_ifc_reg_cbs_mbox_csr_mbox_execute_execute extends soc_ifc_reg_cbs_mbox if (!rm.mbox_fn_state_sigs.uc_done_stage) begin `uvm_error("SOC_IFC_REG_CBS", $sformatf("uC is clearing mbox_execute in unexpected mbox FSM state: [%p]", rm.mbox_fn_state_sigs)) end + `uvm_info("SOC_IFC_REG_CBS", "Write to mbox_execute clears the field and ends a command", UVM_HIGH) rm.mbox_data_q.delete(); rm.mbox_resp_q.delete(); - rm.mbox_status.mbox_fsm_ps.predict(MBOX_IDLE); - rm.mbox_fn_state_sigs = '{mbox_idle: 1'b1, default: 1'b0}; - rm.mbox_lock.lock.predict(0); - `uvm_info("SOC_IFC_REG_CBS", "Write to mbox_execute clears the field and ends a command", UVM_HIGH) + delay_job.state_nxt = MBOX_IDLE; + delay_jobs.push_back(delay_job); + `uvm_info("SOC_IFC_REG_CBS", $sformatf("Write to mbox_execute on map [%s] with value [%x] predicts a state change. Delay job is queued to update DUT model.", map.get_name(), value), UVM_HIGH) end // Setting 'execute' - Expect state transition to MBOX_EXECUTE_SOC else if (value & !previous) begin // Maximum allowable size for data transferred via mailbox int unsigned dlen_cap_dw = (mbox_dlen_mirrored(rm) < (mm.get_size() * mm.get_n_bytes())) ? mbox_dlen_mirrored_dword_ceil(rm) : (mm.get_size() * mm.get_n_bytes()) >> ($clog2(MBOX_DATA_W/8)); - if (!rm.mbox_fn_state_sigs.uc_send_stage) + if (!rm.mbox_fn_state_sigs.uc_data_stage) `uvm_error("SOC_IFC_REG_CBS", $sformatf("mbox_execute is set by uC when in an unexpected state [%p]!", rm.mbox_fn_state_sigs)) - rm.mbox_status.mbox_fsm_ps.predict(MBOX_EXECUTE_SOC); - rm.mbox_fn_state_sigs = '{soc_receive_stage: 1'b1, default: 1'b0}; // Round dlen up to nearest dword boundary and compare with data queue size // On transfer of control, remove extraneous entries from data_q since // reads of these values will be gated for the receiver in DUT if ((rm.mbox_data_q.size()) != mbox_dlen_mirrored_dword_ceil(rm)) begin - `uvm_info("SOC_IFC_REG_CBS", $sformatf("Write to mbox_execute initiates mailbox command, but the data queue entry count [%0d dwords] does not match the value of dlen [%0d bytes]!", rm.mbox_data_q.size(), mbox_dlen_mirrored(rm)), UVM_MEDIUM) + `uvm_info("SOC_IFC_REG_CBS", $sformatf("Write to mbox_execute initiates mailbox command, but the data queue entry count [%0d dwords] does not match the value of dlen [%0d bytes]!", rm.mbox_data_q.size(), mbox_dlen_mirrored(rm)), UVM_LOW) end if (rm.mbox_data_q.size > dlen_cap_dw) begin - `uvm_info("SOC_IFC_REG_CBS", $sformatf("Extra entries detected in mbox_data_q on control transfer - deleting %d entries", rm.mbox_data_q.size() - dlen_cap_dw), UVM_FULL) + `uvm_info("SOC_IFC_REG_CBS", $sformatf("Extra entries detected in mbox_data_q on control transfer - deleting %d entries", rm.mbox_data_q.size() - dlen_cap_dw), UVM_LOW) while (rm.mbox_data_q.size > dlen_cap_dw) begin // Continuously remove last entry until size is equal to dlen, since entries are added with push_back rm.mbox_data_q.delete(rm.mbox_data_q.size()-1); @@ -84,12 +176,15 @@ class soc_ifc_reg_cbs_mbox_csr_mbox_execute_execute extends soc_ifc_reg_cbs_mbox end else if (rm.mbox_data_q.size < dlen_cap_dw) begin uvm_reg_data_t zeros [$]; - `uvm_info("SOC_IFC_REG_CBS", $sformatf("Insufficient entries detected in mbox_data_q on control transfer - 0-filling %d entries", dlen_cap_dw - rm.mbox_data_q.size()), UVM_FULL) + `uvm_info("SOC_IFC_REG_CBS", $sformatf("Insufficient entries detected in mbox_data_q on control transfer - 0-filling %d entries", dlen_cap_dw - rm.mbox_data_q.size()), UVM_LOW) zeros = '{MBOX_DEPTH{32'h0}}; zeros = zeros[0:dlen_cap_dw - rm.mbox_data_q.size() - 1]; rm.mbox_data_q = {rm.mbox_data_q, zeros}; end `uvm_info("SOC_IFC_REG_CBS", "Write to mbox_execute sets the field and initiates a command", UVM_HIGH) + delay_job.state_nxt = MBOX_EXECUTE_SOC; + delay_jobs.push_back(delay_job); + `uvm_info("SOC_IFC_REG_CBS", $sformatf("Write to mbox_execute on map [%s] with value [%x] predicts a state change. Delay job is queued to update DUT model.", map.get_name(), value), UVM_HIGH) end else begin `uvm_info("SOC_IFC_REG_CBS", $sformatf("post_predict called with kind [%p] has no effect", kind), UVM_FULL) @@ -103,46 +198,62 @@ class soc_ifc_reg_cbs_mbox_csr_mbox_execute_execute extends soc_ifc_reg_cbs_mbox else if (map.get_name() == this.APB_map_name) begin case (kind) inside UVM_PREDICT_WRITE: begin + // Check for protocol violations + error_job = soc_ifc_reg_delay_job_mbox_csr_mbox_prot_error::type_id::create("error_job"); + if (rm.mbox_fn_state_sigs.mbox_idle) begin + error_job.rm = rm; + error_job.map = map; + error_job.fld = fld; + error_job.set_delay_cycles(0); + error_job.state_nxt = MBOX_IDLE; + error_job.error = '{axs_without_lock: 1'b1, default: 1'b0}; + `uvm_info("SOC_IFC_REG_CBS", $sformatf("EXECUTE written during unexpected mailbox state [%p]!", rm.mbox_fn_state_sigs), UVM_LOW) + end + else if (rm.mbox_fn_state_sigs.mbox_error) begin + `uvm_info("SOC_IFC_REG_CBS", $sformatf("Write to %s on map [%s] with value [%x] during mailbox state [%p] has no additional side effects!", fld.get_name(), map.get_name(), value, rm.mbox_fn_state_sigs), UVM_LOW) + end + else if (!rm.mbox_fn_state_sigs.soc_done_stage && + !(rm.mbox_fn_state_sigs.soc_data_stage /*&& mbox_fsm_state_e'(rm.mbox_status.mbox_fsm_ps.get_mirrored_value()) == MBOX_RDY_FOR_DATA*/)) begin + error_job.rm = rm; + error_job.map = map; + error_job.fld = fld; + error_job.set_delay_cycles(0); + error_job.state_nxt = MBOX_ERROR; + error_job.error = '{axs_incorrect_order: 1'b1, default: 1'b0}; + `uvm_info("SOC_IFC_REG_CBS", $sformatf("EXECUTE written during unexpected mailbox state [%p]! FSM mirror: [%p]", rm.mbox_fn_state_sigs, rm.mbox_status.mbox_fsm_ps.get_mirrored_value()), UVM_LOW) + rm.mbox_fn_state_sigs = '{mbox_error: 1'b1, default: 1'b0}; + end + // Clearing 'execute' - Expect sts pin change if (~value & previous) begin if (rm.mbox_data_q.size() != 0 || rm.mbox_resp_q.size() != 0) begin - `uvm_warning("SOC_IFC_REG_CBS", $sformatf("Clearing mbox_execute when data queues are not empty! Did the receiver fetch the amount of data it expected to? mbox_data_q.size() [%0d] mbox_resp_q.size() [%0d]", rm.mbox_data_q.size(), rm.mbox_resp_q.size())) + `uvm_info("SOC_IFC_REG_CBS", $sformatf("Clearing mbox_execute when data queues are not empty! Did the receiver fetch the amount of data it expected to? mbox_data_q.size() [%0d] mbox_resp_q.size() [%0d]", rm.mbox_data_q.size(), rm.mbox_resp_q.size()), UVM_LOW) end if (!rm.mbox_fn_state_sigs.soc_done_stage) begin - `uvm_error("SOC_IFC_REG_CBS", $sformatf("SOC is clearing mbox_execute in unexpected mbox FSM state: [%p]", rm.mbox_fn_state_sigs)) + `uvm_info("SOC_IFC_REG_CBS", $sformatf("mbox_execute is cleared by SOC in unexpected mbox FSM state: [%p]", rm.mbox_fn_state_sigs), UVM_LOW) end + `uvm_info("SOC_IFC_REG_CBS", $sformatf("Write to mbox_execute clears the field and ends a command"), UVM_HIGH) rm.mbox_data_q.delete(); rm.mbox_resp_q.delete(); - rm.mbox_status.mbox_fsm_ps.predict(MBOX_IDLE); - rm.mbox_status.soc_has_lock.predict(1'b0); - rm.mbox_fn_state_sigs = '{mbox_idle: 1'b1, default: 1'b0}; - rm.mbox_lock.lock.predict(0); - `uvm_info("SOC_IFC_REG_CBS", $sformatf("Write to mbox_execute clears the field and ends a command"), UVM_HIGH) + delay_job.state_nxt = MBOX_IDLE; + delay_jobs.push_back(delay_job); + `uvm_info("SOC_IFC_REG_CBS", $sformatf("Write to mbox_execute on map [%s] with value [%x] predicts a state change. Delay job is queued to update DUT model.", map.get_name(), value), UVM_HIGH) end // Setting 'execute' - Expect a uC interrupt if enabled else if (value & !previous) begin // Maximum allowable size for data transferred via mailbox int unsigned dlen_cap_dw = (mbox_dlen_mirrored(rm) < (mm.get_size() * mm.get_n_bytes())) ? mbox_dlen_mirrored_dword_ceil(rm) : (mm.get_size() * mm.get_n_bytes()) >> ($clog2(MBOX_DATA_W/8)); - if (!rm.mbox_fn_state_sigs.soc_send_stage) - `uvm_error("SOC_IFC_REG_CBS", $sformatf("mbox_execute is set by SOC when in an unexpected state [%p]!", rm.mbox_fn_state_sigs)) - rm.mbox_status.mbox_fsm_ps.predict(MBOX_EXECUTE_UC); - rm.mbox_fn_state_sigs = '{uc_receive_stage: 1'b1, default: 1'b0}; - // Predict intr sts register is set - // - Use UVM_PREDICT_READ kind so that all the callbacks associated with - // notif_cmd_avail_sts are also called to detect interrupt pin assertion - // - Use UVM_PREDICT_READ instead of UVM_PREDICT_WRITE so that - // "do_predict" bypasses the access-check and does not enforce W1C - // behavior on this attempt to set interrupt status to 1 - intr_fld.predict(1'b1, -1, UVM_PREDICT_READ, UVM_PREDICT, rm_top.get_map_by_name(this.AHB_map_name)); /* Intr reg access expected only via AHB i/f */ + if (!rm.mbox_fn_state_sigs.soc_data_stage) + `uvm_info("SOC_IFC_REG_CBS", $sformatf("mbox_execute is set by SOC when in an unexpected state [%p]!", rm.mbox_fn_state_sigs), UVM_LOW) // Round dlen up to nearest dword boundary and compare with data queue size // On transfer of control, remove extraneous entries from data_q since // reads of these values will be gated for the receiver in DUT if (rm.mbox_data_q.size() != mbox_dlen_mirrored_dword_ceil(rm)) begin - `uvm_info("SOC_IFC_REG_CBS", $sformatf("Write to mbox_execute initiates mailbox command, but the data queue entry count [%0d dwords] does not match the value of dlen [%0d bytes]!", rm.mbox_data_q.size(), mbox_dlen_mirrored(rm)), UVM_MEDIUM) + `uvm_info("SOC_IFC_REG_CBS", $sformatf("Write to mbox_execute initiates mailbox command, but the data queue entry count [%0d dwords] does not match the value of dlen [%0d bytes]!", rm.mbox_data_q.size(), mbox_dlen_mirrored(rm)), UVM_LOW) end if (rm.mbox_data_q.size > dlen_cap_dw) begin - `uvm_info("SOC_IFC_REG_CBS", $sformatf("Extra entries detected in mbox_data_q on control transfer - deleting %d entries", rm.mbox_data_q.size() - dlen_cap_dw), UVM_FULL) + `uvm_info("SOC_IFC_REG_CBS", $sformatf("Extra entries detected in mbox_data_q on control transfer - deleting %d entries", rm.mbox_data_q.size() - dlen_cap_dw), UVM_LOW) while (rm.mbox_data_q.size > dlen_cap_dw) begin // Continuously remove last entry until size is equal to dlen, since entries are added with push_back rm.mbox_data_q.delete(rm.mbox_data_q.size()-1); @@ -150,16 +261,23 @@ class soc_ifc_reg_cbs_mbox_csr_mbox_execute_execute extends soc_ifc_reg_cbs_mbox end else if (rm.mbox_data_q.size < dlen_cap_dw) begin uvm_reg_data_t zeros [$]; - `uvm_info("SOC_IFC_REG_CBS", $sformatf("Insufficient entries detected in mbox_data_q on control transfer - 0-filling %d entries", dlen_cap_dw - rm.mbox_data_q.size()), UVM_FULL) + `uvm_info("SOC_IFC_REG_CBS", $sformatf("Insufficient entries detected in mbox_data_q on control transfer - 0-filling %d entries", dlen_cap_dw - rm.mbox_data_q.size()), UVM_LOW) zeros = '{MBOX_DEPTH{32'h0}}; zeros = zeros[0:dlen_cap_dw - rm.mbox_data_q.size() - 1]; rm.mbox_data_q = {rm.mbox_data_q, zeros}; end `uvm_info("SOC_IFC_REG_CBS", $sformatf("Write to mbox_execute sets the field and initiates a command"), UVM_HIGH) + delay_job.state_nxt = MBOX_EXECUTE_UC; + delay_jobs.push_back(delay_job); + `uvm_info("SOC_IFC_REG_CBS", $sformatf("Write to mbox_execute on map [%s] with value [%x] predicts a state change. Delay job is queued to update DUT model.", map.get_name(), value), UVM_HIGH) end else begin `uvm_info("SOC_IFC_REG_CBS", $sformatf("post_predict called with kind [%p] has no effect", kind), UVM_FULL) end + + // Submit error job after delay job so that it executes later and takes precedence + if (|error_job.error) + delay_jobs.push_back(error_job); end default: begin `uvm_info("SOC_IFC_REG_CBS", $sformatf("post_predict called with kind [%p] has no effect", kind), UVM_FULL) diff --git a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/registers/soc_ifc_reg_cbs_mbox_csr_mbox_lock_lock.svh b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/registers/soc_ifc_reg_cbs_mbox_csr_mbox_lock_lock.svh index 4642a2314..f77f7c932 100644 --- a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/registers/soc_ifc_reg_cbs_mbox_csr_mbox_lock_lock.svh +++ b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/registers/soc_ifc_reg_cbs_mbox_csr_mbox_lock_lock.svh @@ -14,6 +14,38 @@ // limitations under the License. //---------------------------------------------------------------------- +// Reg predictions that will be scheduled on AHB write to mbox_lock +class soc_ifc_reg_delay_job_mbox_csr_mbox_lock_lock extends soc_ifc_reg_delay_job; + `uvm_object_utils( soc_ifc_reg_delay_job_mbox_csr_mbox_lock_lock ) + mbox_csr_ext rm; /* mbox_csr_rm */ + mbox_fsm_state_e state_nxt; + uvm_reg_map map; + virtual task do_job(); + `uvm_info("SOC_IFC_REG_DELAY_JOB", "Running delayed job for mbox_csr.mbox_lock.lock", UVM_HIGH) + if (rm.mbox_lock.lock.get_mirrored_value() && rm.mbox_fn_state_sigs.mbox_idle) begin + rm.mbox_status.mbox_fsm_ps.predict(state_nxt, .kind(UVM_PREDICT_READ), .path(UVM_PREDICT), .map(map)); + if (map.get_name() == "soc_ifc_AHB_map") begin + rm.mbox_status.soc_has_lock.predict(uvm_reg_data_t'(0), .kind(UVM_PREDICT_READ), .path(UVM_PREDICT), .map(map)); + rm.mbox_fn_state_sigs = '{uc_cmd_stage: 1'b1, default: 1'b0}; + end + else if (map.get_name() == "soc_ifc_APB_map") begin + rm.mbox_status.soc_has_lock.predict(uvm_reg_data_t'(1), .kind(UVM_PREDICT_READ), .path(UVM_PREDICT), .map(map)); + rm.mbox_fn_state_sigs = '{soc_cmd_stage: 1'b1, default: 1'b0}; + end + `uvm_info("SOC_IFC_REG_DELAY_JOB", $sformatf("post_predict called through map [%p] on mbox_lock results in state transition. Functional state tracker: [%p] mbox_fsm_ps transition [%p]", map.get_name(), rm.mbox_fn_state_sigs, state_nxt), UVM_FULL) + end + else begin + `uvm_info("SOC_IFC_REG_DELAY_JOB", + $sformatf("post_predict called through map [%p] on mbox_lock skipped due to lock mirror: [%x] mbox_fn_state_sigs [%p] mbox_fsm_ps mirror [%p]", + map.get_name(), + rm.mbox_lock.lock.get_mirrored_value(), + rm.mbox_fn_state_sigs, + rm.mbox_status.mbox_fsm_ps.get_mirrored_value()), + UVM_FULL) + end + endtask +endclass + class soc_ifc_reg_cbs_mbox_csr_mbox_lock_lock extends soc_ifc_reg_cbs_mbox_csr; `uvm_object_utils(soc_ifc_reg_cbs_mbox_csr_mbox_lock_lock) @@ -34,8 +66,29 @@ class soc_ifc_reg_cbs_mbox_csr_mbox_lock_lock extends soc_ifc_reg_cbs_mbox_csr; input uvm_path_e path, input uvm_reg_map map); mbox_csr_ext rm; /* mbox_csr_rm */ + soc_ifc_reg_delay_job_mbox_csr_mbox_lock_lock delay_job; + soc_ifc_reg_delay_job_mbox_csr_mbox_prot_error error_job; uvm_reg_block blk = fld.get_parent().get_parent(); /* mbox_csr_rm */ if (!$cast(rm,blk)) `uvm_fatal ("SOC_IFC_REG_CBS", "Failed to get valid class handle") + delay_job = soc_ifc_reg_delay_job_mbox_csr_mbox_lock_lock::type_id::create("delay_job"); + delay_job.rm = rm; + delay_job.map = map; + delay_job.set_delay_cycles(0); + + // If a scheduled job wanted to predict mbox_lock to 0, but couldn't (because + // of the active bus access that led to this callback being called), that job + // will trigger a 'miss' event. Service that here. + // This happens when mbox_execute or mbox_unlock is accessed and the result + // is a prediction for mbox_lock to be cleared, but a bus access to mbox_lock is + // active. See the callbacks for those registers. + if (rm.mbox_lock_clr_miss.is_on()) begin + previous = 0; + if (kind == UVM_PREDICT_WRITE) + value = previous; + `uvm_info("SOC_IFC_REG_CBS", "Completed mbox_lock deassert prediction (scheduled by mbox_execute) prior to performing mbox_lock reg prediction due to bus access", UVM_MEDIUM) + rm.mbox_lock_clr_miss.reset(0); + end + if (map.get_name() == this.AHB_map_name) begin case (kind) inside UVM_PREDICT_READ: begin @@ -43,16 +96,24 @@ class soc_ifc_reg_cbs_mbox_csr_mbox_lock_lock extends soc_ifc_reg_cbs_mbox_csr; // Reading mbox_lock when it is already locked has no effect, so // only calculate predictions on acquiring lock if (value & ~previous) begin - rm.mbox_status.soc_has_lock.predict(uvm_reg_data_t'(0)); if (rm.mbox_fn_state_sigs.mbox_idle) begin - rm.mbox_status.mbox_fsm_ps.predict(MBOX_RDY_FOR_CMD); - rm.mbox_fn_state_sigs = '{uc_send_stage: 1'b1, default: 1'b0}; + delay_job.state_nxt = MBOX_RDY_FOR_CMD; + delay_jobs.push_back(delay_job); + `uvm_info("SOC_IFC_REG_CBS", $sformatf("Read from mbox_lock on map [%s] with value [%x] predicts a state change. Delay job is queued to update DUT model.", map.get_name(), value), UVM_HIGH) end else begin `uvm_warning("SOC_IFC_REG_CBS", $sformatf("Lock acquired during unexpected mailbox state [%p]!", rm.mbox_fn_state_sigs)) end rm.mbox_data_q.delete(); rm.mbox_resp_q.delete(); + // Emulate the rd/wr ptr reset + mbox_dataout pre-fill + // logic. Since datain writes (later in the flow) will + // trigger non-0 data to mbox_dataout (if applicable), + // all we need to do here is reset mbox_dataout to account for the + // cases where no data is written or dlen == 0. + rm.mbox_datain_to_dataout_predict.trigger(); + rm.mbox_dataout.dataout.predict(0, .kind(UVM_PREDICT_READ), .path(UVM_PREDICT), .map(map)); + rm.mbox_datain_to_dataout_predict.reset(); end else begin `uvm_info("SOC_IFC_REG_CBS", $sformatf("post_predict called with kind [%p] has no effect. value: 0x%x previous: 0x%x", kind, value, previous), UVM_FULL) @@ -66,27 +127,58 @@ class soc_ifc_reg_cbs_mbox_csr_mbox_lock_lock extends soc_ifc_reg_cbs_mbox_csr; else if (map.get_name() == this.APB_map_name) begin case (kind) inside UVM_PREDICT_READ: begin + // Reading mbox_lock when it is already locked (by uC) + // triggers a notification interrupt to the uC in Caliptra + if (value & previous) begin + if (rm.mbox_fn_state_sigs.mbox_idle) begin + `uvm_error("SOC_IFC_REG_CBS", $sformatf("Read from mbox_lock on map [%s] with value [%x] and previous [%x] is unexpected in state [%p]!", map.get_name(), value, previous, rm.mbox_fn_state_sigs)) + end + else if (!rm.mbox_status.soc_has_lock.get_mirrored_value()) begin + `uvm_info("SOC_IFC_REG_CBS", $sformatf("Read from mbox_lock on map [%s] with value [%x] and previous [%x] in state [%p] triggers a notification interrupt for soc_req_lock!", map.get_name(), value, previous, rm.mbox_fn_state_sigs), UVM_HIGH) + rm.get_parent().get_block_by_name("soc_ifc_reg_rm").get_block_by_name("intr_block_rf_ext").get_field_by_name("notif_soc_req_lock_sts").predict(1'b1, -1, UVM_PREDICT_READ, UVM_PREDICT, rm.get_parent().get_map_by_name(this.AHB_map_name)); /* AHB-access only, use AHB map*/ + end + else begin + `uvm_info("SOC_IFC_REG_CBS", $sformatf("Read from mbox_lock on map [%s] with value [%x] and previous [%x] in state [%p] has no effect due to soc_has_lock: [%0d]", map.get_name(), value, previous, rm.mbox_fn_state_sigs, rm.mbox_status.soc_has_lock.get_mirrored_value()), UVM_FULL) + end + end // Rising edge on RS - // Reading mbox_lock when it is already locked has no effect, so - // only calculate predictions on acquiring lock - if (value & ~previous) begin - rm.mbox_status.soc_has_lock.predict(uvm_reg_data_t'(1)); + // Calculate predictions on acquiring lock + else if (value & ~previous) begin if (rm.mbox_fn_state_sigs.mbox_idle) begin - rm.mbox_status.mbox_fsm_ps.predict(MBOX_RDY_FOR_CMD); - rm.mbox_fn_state_sigs = '{soc_send_stage: 1'b1, default: 1'b0}; + delay_job.state_nxt = MBOX_RDY_FOR_CMD; + delay_jobs.push_back(delay_job); + `uvm_info("SOC_IFC_REG_CBS", $sformatf("Read from mbox_lock on map [%s] with value [%x] predicts a state change. Delay job is queued to update DUT model.", map.get_name(), value), UVM_HIGH) end else begin `uvm_warning("SOC_IFC_REG_CBS", $sformatf("Lock acquired during unexpected mailbox state [%p]!", rm.mbox_fn_state_sigs)) end rm.mbox_data_q.delete(); rm.mbox_resp_q.delete(); + // Emulate the rd/wr ptr reset + mbox_dataout pre-fill + // logic. Since datain writes (later in the flow) will + // trigger non-0 data to mbox_dataout (if applicable), + // all we need to do here is reset mbox_dataout to account for the + // cases where no data is written or dlen == 0. + rm.mbox_datain_to_dataout_predict.trigger(); + rm.mbox_dataout.dataout.predict(0, .kind(UVM_PREDICT_READ), .path(UVM_PREDICT), .map(map)); + rm.mbox_datain_to_dataout_predict.reset(); end else begin `uvm_info("SOC_IFC_REG_CBS", $sformatf("post_predict called with kind [%p] has no effect. value: 0x%x previous: 0x%x", kind, value, previous), UVM_FULL) end end default: begin - `uvm_info("SOC_IFC_REG_CBS", $sformatf("post_predict called with kind [%p] has no effect", kind), UVM_FULL) + // FIXME only do an error job if not idle? + error_job = soc_ifc_reg_delay_job_mbox_csr_mbox_prot_error::type_id::create("error_job"); + error_job.rm = rm; + error_job.map = map; + error_job.fld = fld; + error_job.set_delay_cycles(0); + error_job.state_nxt = MBOX_ERROR; + error_job.error = '{axs_incorrect_order: 1'b1, default: 1'b0}; + delay_jobs.push_back(error_job); + `uvm_info("SOC_IFC_REG_CBS", $sformatf("Write attempt to %s is unexpected! mailbox state [%p], FSM mirror: [%p]", fld.get_name(), rm.mbox_fn_state_sigs, rm.mbox_status.mbox_fsm_ps.get_mirrored_value()), UVM_LOW) + rm.mbox_fn_state_sigs = '{mbox_error: 1'b1, default: 1'b0}; end endcase end diff --git a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/registers/soc_ifc_reg_cbs_mbox_csr_mbox_status_mbox_fsm_ps.svh b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/registers/soc_ifc_reg_cbs_mbox_csr_mbox_status_mbox_fsm_ps.svh new file mode 100644 index 000000000..ec8591474 --- /dev/null +++ b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/registers/soc_ifc_reg_cbs_mbox_csr_mbox_status_mbox_fsm_ps.svh @@ -0,0 +1,83 @@ +//---------------------------------------------------------------------- +// SPDX-License-Identifier: Apache-2.0 +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +//---------------------------------------------------------------------- + +// Reg predictions that will be scheduled on mbox_fsm_ps state change +class soc_ifc_reg_delay_job_mbox_csr_mbox_status_mbox_fsm_ps extends soc_ifc_reg_delay_job; + `uvm_object_utils( soc_ifc_reg_delay_job_mbox_csr_mbox_status_mbox_fsm_ps ) + + mbox_csr_ext rm; /* mbox_csr_rm */ + uvm_reg_block rm_top; + uvm_reg_field intr_fld; + virtual task do_job(); + `uvm_info("SOC_IFC_REG_DELAY_JOB", "Running delayed job for mbox_csr.mbox_status.mbox_fsm_ps", UVM_HIGH) + rm_top = rm.get_parent(); + intr_fld = rm_top.get_block_by_name("soc_ifc_reg_rm").get_block_by_name("intr_block_rf_ext").get_field_by_name("notif_cmd_avail_sts"); + + // Predict intr sts register is set + // - Use UVM_PREDICT_READ kind so that all the callbacks associated with + // notif_cmd_avail_sts are also called to detect interrupt pin assertion + // - Use UVM_PREDICT_READ instead of UVM_PREDICT_WRITE so that + // "do_predict" bypasses the access-check and does not enforce W1C + // behavior on this attempt to set interrupt status to 1 + intr_fld.predict(1'b1, -1, UVM_PREDICT_READ, UVM_PREDICT, rm_top.get_map_by_name("soc_ifc_AHB_map")); /* Intr reg access expected only via AHB i/f */ + endtask +endclass + +class soc_ifc_reg_cbs_mbox_csr_mbox_status_mbox_fsm_ps extends soc_ifc_reg_cbs_mbox_csr; + + `uvm_object_utils(soc_ifc_reg_cbs_mbox_csr_mbox_status_mbox_fsm_ps) + + // Function: post_predict + // + // Called by the method + // after a successful UVM_PREDICT_READ or UVM_PREDICT_WRITE prediction. + // + // ~previous~ is the previous value in the mirror and + // ~value~ is the latest predicted value. Any change to ~value~ will + // modify the predicted mirror value. + // + virtual function void post_predict(input uvm_reg_field fld, + input uvm_reg_data_t previous, + inout uvm_reg_data_t value, + input uvm_predict_e kind, + input uvm_path_e path, + input uvm_reg_map map); + soc_ifc_reg_delay_job_mbox_csr_mbox_status_mbox_fsm_ps delay_job; + mbox_csr_ext rm; /* mbox_csr_rm */ + mbox_fsm_state_e old_ps; + mbox_fsm_state_e new_ps; + uvm_reg_block blk = fld.get_parent().get_parent(); /* mbox_csr_rm */ + if (!$cast(rm,blk)) `uvm_fatal ("SOC_IFC_REG_CBS", "Failed to get valid class handle") + + old_ps = mbox_fsm_state_e'(previous); + new_ps = mbox_fsm_state_e'(value); + `uvm_info("SOC_IFC_REG_CBS", $sformatf("Prediction on mbox_status updates mbox_fsm_ps mirror to %p", new_ps), UVM_DEBUG) + + // State change results in notification interrupt bit being set to uC + // Only if the functional state signals tracker in the reg-model still reports + // an old state (which means this is truly the first transition to MBOX_EXECUTE_UC, + // and not some spurious transition on the reg mirror after the RTL has already + // made the state transition). + if (old_ps != new_ps && new_ps == MBOX_EXECUTE_UC && (rm.mbox_fn_state_sigs.soc_data_stage || rm.mbox_fn_state_sigs.soc_receive_stage)) begin + delay_job = soc_ifc_reg_delay_job_mbox_csr_mbox_status_mbox_fsm_ps::type_id::create("delay_job"); + delay_job.rm = rm; + delay_job.set_delay_cycles(0); + delay_jobs.push_back(delay_job); + `uvm_info("SOC_IFC_REG_CBS", $sformatf("Access to mbox_status.mbox_fsm_ps on map [%s] with value [%x] predicts a state change. Delay job is queued to update DUT model.", map.get_name(), value), UVM_HIGH) + end + endfunction + +endclass diff --git a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/registers/soc_ifc_reg_cbs_mbox_csr_mbox_status_status.svh b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/registers/soc_ifc_reg_cbs_mbox_csr_mbox_status_status.svh index b0a28bd74..0e27ee264 100644 --- a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/registers/soc_ifc_reg_cbs_mbox_csr_mbox_status_status.svh +++ b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/registers/soc_ifc_reg_cbs_mbox_csr_mbox_status_status.svh @@ -14,7 +14,7 @@ // limitations under the License. //---------------------------------------------------------------------- -// Reg predictions that will be scheduled on AHB write to mbox_unlock +// Reg predictions that will be scheduled on AHB write to mbox_status class soc_ifc_reg_delay_job_mbox_csr_mbox_status_status extends soc_ifc_reg_delay_job; `uvm_object_utils( soc_ifc_reg_delay_job_mbox_csr_mbox_status_status ) mbox_csr_ext rm; /* mbox_csr_rm */ @@ -22,7 +22,26 @@ class soc_ifc_reg_delay_job_mbox_csr_mbox_status_status extends soc_ifc_reg_dela uvm_reg_map map; virtual task do_job(); `uvm_info("SOC_IFC_REG_DELAY_JOB", "Running delayed job for mbox_csr.mbox_status.status", UVM_HIGH) - rm.mbox_status.mbox_fsm_ps.predict(state_nxt, .kind(UVM_PREDICT_READ), .path(UVM_PREDICT), .map(map)); + // Check mbox_unlock before predicting FSM change, since a force unlock + // has priority over normal flow + // mbox_unlock only 'activates' on the falling edge of the pulse; if we detect + // that, bail out of this prediction job + if (rm.mbox_unlock.unlock.get_mirrored_value()) begin + uvm_wait_for_nba_region(); + if (!rm.mbox_unlock.unlock.get_mirrored_value()) begin + return; + end + end + if (rm.mbox_lock.lock.get_mirrored_value()) begin + rm.mbox_status.mbox_fsm_ps.predict(state_nxt, .kind(UVM_PREDICT_READ), .path(UVM_PREDICT), .map(map)); + if (state_nxt == MBOX_EXECUTE_SOC) begin + rm.mbox_fn_state_sigs = '{soc_done_stage: 1'b1, default: 1'b0}; + end + else if (state_nxt == MBOX_EXECUTE_UC) begin + rm.mbox_fn_state_sigs = '{uc_done_stage: 1'b1, default: 1'b0}; + end + `uvm_info("SOC_IFC_REG_DELAY_JOB", $sformatf("post_predict called through map [%p] on mbox_status results in state transition. Functional state tracker: %p", map.get_name(), rm.mbox_fn_state_sigs), UVM_FULL) + end endtask endclass @@ -46,34 +65,46 @@ class soc_ifc_reg_cbs_mbox_csr_mbox_status_status extends soc_ifc_reg_cbs_mbox_c input uvm_path_e path, input uvm_reg_map map); soc_ifc_reg_delay_job_mbox_csr_mbox_status_status delay_job; + soc_ifc_reg_delay_job_mbox_csr_mbox_prot_error error_job; mbox_csr_ext rm; /* mbox_csr_rm */ uvm_mem mm; /* mbox_mem_rm "mem model" */ uvm_reg_block blk = fld.get_parent().get_parent(); /* mbox_csr_rm */ mm = blk.get_parent().get_mem_by_name("mbox_mem_rm"); if (!$cast(rm,blk)) `uvm_fatal ("SOC_IFC_REG_CBS", "Failed to get valid class handle") + delay_job = soc_ifc_reg_delay_job_mbox_csr_mbox_status_status::type_id::create("delay_job"); + delay_job.rm = rm; + delay_job.map = map; + delay_job.set_delay_cycles(0); if (map.get_name() == this.AHB_map_name) begin case (kind) inside UVM_PREDICT_WRITE: begin - if (mbox_status_e'(value) != mbox_status_e'(previous) && + if (rm.mbox_fn_state_sigs.uc_receive_stage && + mbox_status_e'(value) != mbox_status_e'(previous) && mbox_status_e'(value) != CMD_BUSY) begin if (!rm.mbox_status.soc_has_lock.get_mirrored_value()) begin `uvm_warning("SOC_IFC_REG_CBS", $sformatf("Write to mbox_status in state [%p] on map [%s] is unexpected!", rm.mbox_fn_state_sigs, map.get_name())) end else begin - uvm_queue #(soc_ifc_reg_delay_job) delay_jobs; // Maximum allowable size for data transferred via mailbox - int unsigned dlen_cap_dw = (mbox_dlen_mirrored(rm) < (mm.get_size() * mm.get_n_bytes())) ? mbox_dlen_mirrored_dword_ceil(rm) : + int unsigned dlen_cap_dw = (mbox_status_e'(value) != DATA_READY) ? 0 : /* ignore DLEN if the uC is not sending response data to SOC */ + (mbox_dlen_mirrored(rm) < (mm.get_size() * mm.get_n_bytes())) ? mbox_dlen_mirrored_dword_ceil(rm) : (mm.get_size() * mm.get_n_bytes()) >> ($clog2(MBOX_DATA_W/8)); if (rm.mbox_data_q.size() > 0) begin `uvm_info("SOC_IFC_REG_CBS", $sformatf("Write to mbox_status transfers control back to SOC, but mbox_data_q is not empty! Size: %0d", rm.mbox_data_q.size()), UVM_LOW) /* TODO: Make a warning that can be disabled for DLEN violation cases? */ + rm.mbox_data_q.delete(); end + //Pre populated dataout with the first entry of the resp q + rm.mbox_datain_to_dataout_predict.trigger(); + rm.mbox_dataout.dataout.predict(rm.mbox_resp_q[0], .kind(UVM_PREDICT_READ), .path(UVM_PREDICT), .map(map)); + rm.mbox_datain_to_dataout_predict.reset(); + //move resp q to data q rm.mbox_data_q = rm.mbox_resp_q; rm.mbox_resp_q.delete(); // On transfer of control, remove extraneous entries from data_q since // reads of these values will be gated for the receiver // in the DUT if (rm.mbox_data_q.size > dlen_cap_dw) begin - `uvm_info("SOC_IFC_REG_CBS", $sformatf("Extra entries detected in mbox_data_q on control transfer - deleting %d entries", rm.mbox_data_q.size() - dlen_cap_dw), UVM_FULL) + `uvm_info("SOC_IFC_REG_CBS", $sformatf("Extra entries detected in mbox_data_q on control transfer - deleting %d entries", rm.mbox_data_q.size() - dlen_cap_dw), UVM_LOW) while (rm.mbox_data_q.size > dlen_cap_dw) begin // Continuously remove last entry until size is equal to dlen, since entries are added with push_back rm.mbox_data_q.delete(rm.mbox_data_q.size()-1); @@ -81,24 +112,19 @@ class soc_ifc_reg_cbs_mbox_csr_mbox_status_status extends soc_ifc_reg_cbs_mbox_c end else if (rm.mbox_data_q.size < dlen_cap_dw) begin uvm_reg_data_t zeros [$]; - `uvm_info("SOC_IFC_REG_CBS", $sformatf("Insufficient entries detected in mbox_data_q on control transfer - 0-filling %d entries", dlen_cap_dw - rm.mbox_data_q.size()), UVM_FULL) + `uvm_info("SOC_IFC_REG_CBS", $sformatf("Insufficient entries detected in mbox_data_q on control transfer - 0-filling %d entries", dlen_cap_dw - rm.mbox_data_q.size()), UVM_LOW) zeros = '{MBOX_DEPTH{32'h0}}; zeros = zeros[0:dlen_cap_dw - rm.mbox_data_q.size() - 1]; rm.mbox_data_q = {rm.mbox_data_q, zeros}; end - if (!uvm_config_db#(uvm_queue#(soc_ifc_reg_delay_job))::get(null, "soc_ifc_reg_model_top", "delay_jobs", delay_jobs)) - `uvm_error("SOC_IFC_REG_CBS", "Failed to get handle for 'delay_jobs' queue from config database!") - delay_job = soc_ifc_reg_delay_job_mbox_csr_mbox_status_status::type_id::create("delay_job"); - delay_job.rm = rm; - delay_job.map = map; - delay_job.set_delay_cycles(1); delay_job.state_nxt = MBOX_EXECUTE_SOC; delay_jobs.push_back(delay_job); `uvm_info("SOC_IFC_REG_CBS", $sformatf("Write to mbox_status on map [%s] with value [%x] predicts a state change. Delay job is queued to update DUT model.", map.get_name(), value), UVM_HIGH) - rm.mbox_fn_state_sigs = '{soc_done_stage: 1'b1, default: 1'b0}; - `uvm_info("SOC_IFC_REG_CBS", $sformatf("post_predict called through map [%p] with kind [%p] on mbox_status results in state transition. Functional state tracker: %p", map.get_name(), kind, rm.mbox_fn_state_sigs), UVM_FULL) end end + else begin + `uvm_info("SOC_IFC_REG_CBS", $sformatf("Write to mbox_status on map [%s] with value [%x] during state [%p] does not update the status field (previous value [%x]), so no state change is predicted", map.get_name(), mbox_status_e'(value), rm.mbox_fn_state_sigs, mbox_status_e'(previous)), UVM_MEDIUM) + end end default: begin `uvm_info("SOC_IFC_REG_CBS", $sformatf("post_predict called with kind [%p] has no effect", kind), UVM_FULL) @@ -108,13 +134,13 @@ class soc_ifc_reg_cbs_mbox_csr_mbox_status_status extends soc_ifc_reg_cbs_mbox_c else if (map.get_name() == this.APB_map_name) begin case (kind) inside UVM_PREDICT_WRITE: begin - if (mbox_status_e'(value) != mbox_status_e'(previous) && + if (rm.mbox_fn_state_sigs.soc_receive_stage && + mbox_status_e'(value) != mbox_status_e'(previous) && mbox_status_e'(value) != CMD_BUSY) begin if (rm.mbox_status.soc_has_lock.get_mirrored_value()) begin - `uvm_warning("SOC_IFC_REG_CBS", $sformatf("Write to mbox_status in state [%p] on map [%s] is unexpected!", rm.mbox_fn_state_sigs, map.get_name())) + `uvm_warning("SOC_IFC_REG_CBS", $sformatf("Write to mbox_status in state [%p] on map [%s] is unexpected! soc_has_lock is %x", rm.mbox_fn_state_sigs, map.get_name(), rm.mbox_status.soc_has_lock.get_mirrored_value())) end else begin - uvm_queue #(soc_ifc_reg_delay_job) delay_jobs; if (rm.mbox_data_q.size() > 0) begin `uvm_info("SOC_IFC_REG_CBS", $sformatf("Write to mbox_status transfers control back to uC, but mbox_data_q is not empty! Size: %0d", rm.mbox_data_q.size()), UVM_LOW) /* TODO: Make a warning that can be disabled for DLEN violation cases? */ end @@ -123,19 +149,38 @@ class soc_ifc_reg_cbs_mbox_csr_mbox_status_status extends soc_ifc_reg_cbs_mbox_c end rm.mbox_data_q.delete(); rm.mbox_resp_q.delete(); - if (!uvm_config_db#(uvm_queue#(soc_ifc_reg_delay_job))::get(null, "soc_ifc_reg_model_top", "delay_jobs", delay_jobs)) - `uvm_error("SOC_IFC_REG_CBS", "Failed to get handle for 'delay_jobs' queue from config database!") - delay_job = soc_ifc_reg_delay_job_mbox_csr_mbox_status_status::type_id::create("delay_job"); - delay_job.rm = rm; - delay_job.map = map; - delay_job.set_delay_cycles(1); delay_job.state_nxt = MBOX_EXECUTE_UC; delay_jobs.push_back(delay_job); `uvm_info("SOC_IFC_REG_CBS", $sformatf("Write to mbox_status on map [%s] with value [%x] predicts a state change. Delay job is queued to update DUT model.", map.get_name(), value), UVM_HIGH) - rm.mbox_fn_state_sigs = '{uc_done_stage: 1'b1, default: 1'b0}; - `uvm_info("SOC_IFC_REG_CBS", $sformatf("post_predict called through map [%p] with kind [%p] on mbox_status results in state transition. Functional state tracker: %p", map.get_name(), kind, rm.mbox_fn_state_sigs), UVM_FULL) end end + // Check for protocol violations + if (rm.mbox_fn_state_sigs.mbox_idle) begin + error_job = soc_ifc_reg_delay_job_mbox_csr_mbox_prot_error::type_id::create("error_job"); + error_job.rm = rm; + error_job.map = map; + error_job.fld = fld; + error_job.set_delay_cycles(0); + error_job.state_nxt = MBOX_IDLE; + error_job.error = '{axs_without_lock: 1'b1, default: 1'b0}; + `uvm_info("SOC_IFC_REG_CBS", $sformatf("Write to %s on map [%s] with value [%x] causes a mbox no_lock protocol violation. Delay job is queued to update DUT model.", fld.get_name(), map.get_name(), value), UVM_HIGH) + delay_jobs.push_back(error_job); + end + else if (rm.mbox_fn_state_sigs.mbox_error) begin + `uvm_info("SOC_IFC_REG_CBS", $sformatf("Write to %s on map [%s] with value [%x] during mailbox state [%p] has no additional side effects!", fld.get_name(), map.get_name(), value, rm.mbox_fn_state_sigs), UVM_LOW) + end + else if (!rm.mbox_fn_state_sigs.soc_receive_stage) begin + error_job = soc_ifc_reg_delay_job_mbox_csr_mbox_prot_error::type_id::create("error_job"); + error_job.rm = rm; + error_job.map = map; + error_job.fld = fld; + error_job.set_delay_cycles(0); + error_job.state_nxt = MBOX_ERROR; + error_job.error = '{axs_incorrect_order: 1'b1, default: 1'b0}; + delay_jobs.push_back(error_job); + `uvm_info("SOC_IFC_REG_CBS", $sformatf("Write to %s on map [%s] with value [%x] during unexpected mailbox state [%p] results in mbox ooo protocol violation!", fld.get_name(), map.get_name(), value, rm.mbox_fn_state_sigs), UVM_LOW) + rm.mbox_fn_state_sigs = '{mbox_error: 1'b1, default: 1'b0}; + end end default: begin `uvm_info("SOC_IFC_REG_CBS", $sformatf("post_predict called with kind [%p] has no effect", kind), UVM_FULL) diff --git a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/registers/soc_ifc_reg_cbs_mbox_csr_mbox_unlock_unlock.svh b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/registers/soc_ifc_reg_cbs_mbox_csr_mbox_unlock_unlock.svh index 05fcb7e30..a4bb89cf6 100644 --- a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/registers/soc_ifc_reg_cbs_mbox_csr_mbox_unlock_unlock.svh +++ b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/registers/soc_ifc_reg_cbs_mbox_csr_mbox_unlock_unlock.svh @@ -18,14 +18,48 @@ class soc_ifc_reg_delay_job_mbox_csr_mbox_unlock_unlock extends soc_ifc_reg_delay_job; `uvm_object_utils( soc_ifc_reg_delay_job_mbox_csr_mbox_unlock_unlock ) mbox_csr_ext rm; /* mbox_csr_rm */ + uvm_reg_map map; virtual task do_job(); `uvm_info("SOC_IFC_REG_DELAY_JOB", "Running delayed job for mbox_csr.mbox_unlock.unlock", UVM_HIGH) - rm.mbox_lock.lock.predict(1'b0); - rm.mbox_execute.execute.predict(1'b0); - rm.mbox_status.status.predict(CMD_BUSY); - rm.mbox_status.mbox_fsm_ps.predict(MBOX_IDLE); - rm.mbox_status.soc_has_lock.predict(1'b0); + rm.mbox_execute.execute.predict(1'b0, .kind(UVM_PREDICT_READ), .path(UVM_PREDICT), .map(map)); + rm.mbox_status.status.predict(CMD_BUSY, .kind(UVM_PREDICT_READ), .path(UVM_PREDICT), .map(map)); + rm.mbox_status.mbox_fsm_ps.predict(MBOX_IDLE, .kind(UVM_PREDICT_READ), .path(UVM_PREDICT), .map(map)); + rm.mbox_status.soc_has_lock.predict(1'b0, .kind(UVM_PREDICT_READ), .path(UVM_PREDICT), .map(map)); rm.mbox_fn_state_sigs = '{mbox_idle: 1'b1, default: 1'b0}; + rm.mbox_unlock.unlock.predict(1'b0); + if (rm.mbox_lock.is_busy()) begin + `uvm_info("SOC_IFC_REG_DELAY_JOB", "Delay job for mbox_unlock attempted to clear mbox_lock, but hit access collision! Flagging clear event in reg-model for mbox_lock callback to handle", UVM_LOW) + rm.mbox_lock_clr_miss.trigger(null); + uvm_wait_for_nba_region(); + // If the bus transfer is still in progress (it didn't terminate on the same + // falling clock edge as when this delay job was run), then just override the + // mirrored value immediately. Clear is_busy to avoid a UVM_WARNING. + // This use-case is definitely a hack, but it is necessary to synchronize + // the mbox_lock mirror with the design, chronologically. + if (rm.mbox_lock.is_busy()) begin + rm.mbox_lock.Xset_busyX(0); + rm.mbox_lock.lock.predict(0); + rm.mbox_lock.Xset_busyX(1); + end + else begin + fork + begin + rm.mbox_lock_clr_miss.wait_off(); + disable MBOX_CLR_TIMEOUT; + end + begin: MBOX_CLR_TIMEOUT + // If it takes any amount of time for the pending lock to be cleared, that + // means we've encountered some environment bug (since the accessing i/f + // completed it's transfer, the reg prediction should be instantaneous) + uvm_wait_for_nba_region(); + `uvm_error("SOC_IFC_REG_DELAY_JOB", $sformatf("mbox_lock clear activity, originally requested by mbox_unlock callback but unserviceable, was scheduled to be completed during mbox_lock callback but took longer than expected to finish!")) + end + join_any + end + end + else begin + rm.mbox_lock.lock.predict(0); + end endtask endclass @@ -49,22 +83,23 @@ class soc_ifc_reg_cbs_mbox_csr_mbox_unlock_unlock extends soc_ifc_reg_cbs_mbox_c input uvm_path_e path, input uvm_reg_map map); soc_ifc_reg_delay_job_mbox_csr_mbox_unlock_unlock delay_job; + uvm_queue #(soc_ifc_reg_delay_job) delay_jobs; mbox_csr_ext rm; /* mbox_csr_rm */ uvm_reg_block blk = fld.get_parent().get_parent(); /* mbox_csr_rm */ if (!$cast(rm,blk)) `uvm_fatal ("SOC_IFC_REG_CBS", "Failed to get valid class handle") + if (!uvm_config_db#(uvm_queue#(soc_ifc_reg_delay_job))::get(null, "soc_ifc_reg_model_top", "delay_jobs", delay_jobs)) + `uvm_error("SOC_IFC_REG_CBS", "Failed to get handle for 'delay_jobs' queue from config database!") + delay_job = soc_ifc_reg_delay_job_mbox_csr_mbox_unlock_unlock::type_id::create("delay_job"); + delay_job.rm = rm; + delay_job.map = map; + delay_job.set_delay_cycles(0); if ((map.get_name() == this.AHB_map_name)) begin case (kind) inside UVM_PREDICT_WRITE: begin if (value) begin - uvm_queue #(soc_ifc_reg_delay_job) delay_jobs; - if (!uvm_config_db#(uvm_queue#(soc_ifc_reg_delay_job))::get(null, "soc_ifc_reg_model_top", "delay_jobs", delay_jobs)) - `uvm_error("SOC_IFC_REG_CBS", "Failed to get handle for 'delay_jobs' queue from config database!") - delay_job = soc_ifc_reg_delay_job_mbox_csr_mbox_unlock_unlock::type_id::create("delay_job"); - delay_job.rm = rm; - delay_job.set_delay_cycles(1); delay_jobs.push_back(delay_job); `uvm_info("SOC_IFC_REG_CBS", $sformatf("Write to mbox_unlock on map [%s] with value [%x] clears mbox_lock and auto-clears. Delay job is queued to update DUT model.", map.get_name(), value), UVM_HIGH) - value = previous; + //value = previous; // Delay this (field is 1 for 1-cycle) end else begin `uvm_info("SOC_IFC_REG_CBS", $sformatf("Write to mbox_unlock on map [%s] with value [%x] has no effect", map.get_name(), value), UVM_FULL) diff --git a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/registers/soc_ifc_reg_cbs_sample.svh b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/registers/soc_ifc_reg_cbs_sample.svh new file mode 100644 index 000000000..099f6e14e --- /dev/null +++ b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/registers/soc_ifc_reg_cbs_sample.svh @@ -0,0 +1,64 @@ +//---------------------------------------------------------------------- +// SPDX-License-Identifier: Apache-2.0 +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +//---------------------------------------------------------------------- + +// Callback to add to all register fields. +// This callback is used to sample coverage after every prediction +// against the register field it is called on. +// Expected to be run after any other post_predict callbacks complete + +class soc_ifc_reg_cbs_sample extends uvm_reg_cbs; + + `uvm_object_utils(soc_ifc_reg_cbs_sample) + + // Function: post_predict + // + // Called by the method + // after a successful UVM_PREDICT_READ or UVM_PREDICT_WRITE prediction. + // + // ~previous~ is the previous value in the mirror and + // ~value~ is the latest predicted value. Any change to ~value~ will + // modify the predicted mirror value. + // + virtual function void post_predict(input uvm_reg_field fld, + input uvm_reg_data_t previous, + inout uvm_reg_data_t value, + input uvm_predict_e kind, + input uvm_path_e path, + input uvm_reg_map map); + uvm_reg parent; + uvm_reg_data_t data; + uvm_reg_data_t mask; + bit is_read; + parent = fld.get_parent(); + is_read = kind == UVM_PREDICT_READ; + mask = (1 << fld.get_n_bits()) - 1; + mask <<= fld.get_lsb_pos(); + mask = ~mask; + data = (parent.get_mirrored_value() & mask) | (value << fld.get_lsb_pos()); + // Only sample coverage for the field that is being modified. + // Since post-predict is called independently for every field in a register + // by the reg predictor, this ensures that coverage is only captured for + // the register with the new value. + if (value != previous) begin + parent.XsampleX(data, -1, is_read, map); + `uvm_info("SOC_IFC_REG_SAMPLE_CBS", $sformatf("post_predict called with kind [%p] path [%p] map [%s] on fld [%s] to sample coverage", kind, path, map.get_name(), fld.get_full_name()), UVM_DEBUG) + end + else begin + `uvm_info("SOC_IFC_REG_SAMPLE_CBS", $sformatf("post_predict called with kind [%p] path [%p] map [%s] on fld [%s] does not result in coverage sampling due to no value change", kind, path, map.get_name(), fld.get_full_name()), UVM_DEBUG) + end + endfunction + +endclass diff --git a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/registers/soc_ifc_reg_cbs_sha512_acc_csr_EXECUTE_EXECUTE.svh b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/registers/soc_ifc_reg_cbs_sha512_acc_csr_EXECUTE_EXECUTE.svh new file mode 100644 index 000000000..950292c61 --- /dev/null +++ b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/registers/soc_ifc_reg_cbs_sha512_acc_csr_EXECUTE_EXECUTE.svh @@ -0,0 +1,126 @@ +//---------------------------------------------------------------------- +// SPDX-License-Identifier: Apache-2.0 +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +//---------------------------------------------------------------------- + +// Reg predictions that will be scheduled on AHB write to mbox_execute +class soc_ifc_reg_delay_job_sha512_acc_csr_EXECUTE_EXECUTE extends soc_ifc_reg_delay_job; + `uvm_object_utils( soc_ifc_reg_delay_job_sha512_acc_csr_EXECUTE_EXECUTE ) + sha512_acc_csr_ext rm; /* sha512_acc_csr_rm */ + uvm_reg_block rm_top; + uvm_reg_field intr_fld; + uvm_reg_map map; + virtual task do_job(); + `uvm_info("SOC_IFC_REG_DELAY_JOB", "Running delayed job for sha512_acc_csr.EXECUTE.EXECUTE", UVM_HIGH) + rm_top = rm.get_parent(); + intr_fld = rm_top.get_block_by_name("sha512_acc_csr_rm").get_block_by_name("intr_block_rf_ext").get_field_by_name("notif_cmd_done_sts"); + // Check LOCK before predicting interrupt occurrence + if (rm.LOCK.LOCK.get_mirrored_value()) begin + // Predict intr sts register is set to indicate operation completes + // - Use UVM_PREDICT_READ kind so that all the callbacks associated with + // notif_cmd_done_sts are also called to detect interrupt pin assertion + // - Use UVM_PREDICT_READ instead of UVM_PREDICT_WRITE so that + // "do_predict" bypasses the access-check and does not enforce W1C + // behavior on this attempt to set interrupt status to 1 + intr_fld.predict(1'b1, -1, UVM_PREDICT_READ, UVM_PREDICT, rm_top.get_map_by_name("soc_ifc_AHB_map")); /* Intr reg access expected only via AHB i/f */ + `uvm_info("SOC_IFC_REG_DELAY_JOB", $sformatf("post_predict called through map [%p] on EXECUTE results in interrupt status bit being set.", map.get_name()), UVM_FULL) + end + else begin + `uvm_error("SOC_IFC_REG_DELAY_JOB", + $sformatf("Delay job for EXECUTE does not predict any changes due to: LOCK mirror [%d]", + rm.LOCK.LOCK.get_mirrored_value())) + end + endtask +endclass + +class soc_ifc_reg_cbs_sha512_acc_csr_EXECUTE_EXECUTE extends uvm_reg_cbs; + + `uvm_object_utils(soc_ifc_reg_cbs_sha512_acc_csr_EXECUTE_EXECUTE) + + string AHB_map_name = "soc_ifc_AHB_map"; + string APB_map_name = "soc_ifc_APB_map"; + + uvm_queue #(soc_ifc_reg_delay_job) delay_jobs; + + function new(string name = "uvm_reg_cbs"); + super.new(name); + if (!uvm_config_db#(uvm_queue#(soc_ifc_reg_delay_job))::get(null, "soc_ifc_reg_model_top", "delay_jobs", delay_jobs)) + `uvm_error("SOC_IFC_REG_CBS", "Failed to get handle for 'delay_jobs' queue from config database!") + endfunction + + // Function: post_predict + // + // Called by the method + // after a successful UVM_PREDICT_READ or UVM_PREDICT_WRITE prediction. + // + // ~previous~ is the previous value in the mirror and + // ~value~ is the latest predicted value. Any change to ~value~ will + // modify the predicted mirror value. + // + virtual function void post_predict(input uvm_reg_field fld, + input uvm_reg_data_t previous, + inout uvm_reg_data_t value, + input uvm_predict_e kind, + input uvm_path_e path, + input uvm_reg_map map); + soc_ifc_reg_delay_job_sha512_acc_csr_EXECUTE_EXECUTE delay_job; + sha512_acc_csr_ext rm; /* sha512_acc_csr_rm */ + uvm_reg_block blk = fld.get_parent().get_parent(); /* sha512_acc_csr_rm */ + if (!$cast(rm,blk)) `uvm_fatal ("SOC_IFC_REG_CBS", "Failed to get valid class handle") + delay_job = soc_ifc_reg_delay_job_sha512_acc_csr_EXECUTE_EXECUTE::type_id::create("delay_job"); + delay_job.rm = rm; + delay_job.map = map; + // 82 cycle delay based on waveform analysis of minimum delay from EXECUTE->DONE + // Commentary on a more sophisticated analysis: + // ----------------------------------------------------------- + // Streaming mode - 82 or 164 clocks after setting execute. If the + // padding fits in the current block we pad and process, interrupt will + // come 82 clocks later. If padding doesn't fit, we process the current + // block and another block with the padding. 164 clocks. There may be a + // clock or two for state transitions in there. + // + // Mailbox mode - DLEN/128 should tell you how many 1024 bit blocks + // you have to process. We can read a block faster than process, so the + // long pole is the process time. Something like 32 clocks to read + // the first block + 82 clocks per block to process each. Total DLEN + // could be less than 1024, so in that case the initial read would be + // DLEN/4 clocks. There's also the case that the size requires an + // additional padding block, which may be computed if necessary. + // ----------------------------------------------------------- + delay_job.set_delay_cycles(81); + if (map.get_name() == this.AHB_map_name) begin + case (kind) inside + UVM_PREDICT_WRITE: begin + if (value & ~previous) begin + delay_jobs.push_back(delay_job); + `uvm_info("SOC_IFC_REG_CBS", $sformatf("post_predict called with kind [%p] on map [%s] results in predicted interrupt. Delay job queued. value: 0x%x previous: 0x%x", kind, map.get_name(), value, previous), UVM_FULL) + end + else begin + `uvm_info("SOC_IFC_REG_CBS", $sformatf("post_predict called with kind [%p] on map [%s] has no effect", kind, map.get_name()), UVM_FULL) + end + end + default: begin + `uvm_info("SOC_IFC_REG_CBS", $sformatf("post_predict called with kind [%p] on map [%s] has no effect", kind, map.get_name()), UVM_FULL) + end + endcase + end + else if (map.get_name() == this.APB_map_name) begin + `uvm_info("SOC_IFC_REG_CBS", $sformatf("post_predict called with kind [%p] on map [%s] has no effect", kind, map.get_name()), UVM_FULL) + end + else begin + `uvm_error("SOC_IFC_REG_CBS", $sformatf("post_predict called through unsupported reg map %s!", map.get_name())) + end + endfunction + +endclass diff --git a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/registers/soc_ifc_reg_cbs_sha512_acc_csr_LOCK_LOCK.svh b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/registers/soc_ifc_reg_cbs_sha512_acc_csr_LOCK_LOCK.svh new file mode 100644 index 000000000..18b2cbbda --- /dev/null +++ b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/registers/soc_ifc_reg_cbs_sha512_acc_csr_LOCK_LOCK.svh @@ -0,0 +1,131 @@ +//---------------------------------------------------------------------- +// SPDX-License-Identifier: Apache-2.0 +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +//---------------------------------------------------------------------- + +// Reg predictions that will be scheduled on write to clear LOCK +class soc_ifc_reg_delay_job_sha512_acc_csr_LOCK_LOCK extends soc_ifc_reg_delay_job; + `uvm_object_utils( soc_ifc_reg_delay_job_sha512_acc_csr_LOCK_LOCK ) + sha512_acc_csr_ext rm; /* sha512_acc_csr_rm */ + uvm_reg_map map; + virtual task do_job(); + `uvm_info("SOC_IFC_REG_DELAY_JOB", "Running delayed job for sha512_acc_csr.LOCK.LOCK", UVM_HIGH) + if (1) begin + rm.EXECUTE.EXECUTE.predict(1'b0, -1, UVM_PREDICT_WRITE, UVM_PREDICT, map); + `uvm_info("SOC_IFC_REG_DELAY_JOB", $sformatf("post_predict called through map [%p] on LOCK results in EXECUTE being cleared.", map.get_name()), UVM_FULL) + end + else begin + `uvm_error("SOC_IFC_REG_DELAY_JOB", + $sformatf("Delay job for LOCK does not predict any changes due to: ???")) + end + endtask +endclass + +class soc_ifc_reg_cbs_sha512_acc_csr_LOCK_LOCK extends uvm_reg_cbs; + + `uvm_object_utils(soc_ifc_reg_cbs_sha512_acc_csr_LOCK_LOCK) + + string AHB_map_name = "soc_ifc_AHB_map"; + string APB_map_name = "soc_ifc_APB_map"; + + uvm_queue #(soc_ifc_reg_delay_job) delay_jobs; + + function new(string name = "uvm_reg_cbs"); + super.new(name); + if (!uvm_config_db#(uvm_queue#(soc_ifc_reg_delay_job))::get(null, "soc_ifc_reg_model_top", "delay_jobs", delay_jobs)) + `uvm_error("SOC_IFC_REG_CBS", "Failed to get handle for 'delay_jobs' queue from config database!") + endfunction + + // Function: post_predict + // + // Called by the method + // after a successful UVM_PREDICT_READ or UVM_PREDICT_WRITE prediction. + // + // ~previous~ is the previous value in the mirror and + // ~value~ is the latest predicted value. Any change to ~value~ will + // modify the predicted mirror value. + // + virtual function void post_predict(input uvm_reg_field fld, + input uvm_reg_data_t previous, + inout uvm_reg_data_t value, + input uvm_predict_e kind, + input uvm_path_e path, + input uvm_reg_map map); + soc_ifc_reg_delay_job_sha512_acc_csr_LOCK_LOCK delay_job; + sha512_acc_csr_ext rm; /* sha512_acc_csr_rm */ + uvm_reg_block blk = fld.get_parent().get_parent(); /* sha512_acc_csr_rm */ + if (!$cast(rm,blk)) `uvm_fatal ("SOC_IFC_REG_CBS", "Failed to get valid class handle") + delay_job = soc_ifc_reg_delay_job_sha512_acc_csr_LOCK_LOCK::type_id::create("delay_job"); + delay_job.rm = rm; + delay_job.map = map; + delay_job.set_delay_cycles(0); + if (map.get_name() == this.AHB_map_name) begin + case (kind) inside + UVM_PREDICT_READ: begin + // Rising edge on RS + // Reading lock when it is already locked has no effect, so + // only calculate predictions on acquiring lock + if (value & ~previous) begin + rm.STATUS.SOC_HAS_LOCK.predict(uvm_reg_data_t'(0)); + end + else begin + `uvm_info("SOC_IFC_REG_CBS", $sformatf("post_predict called with kind [%p] has no effect. value: 0x%x previous: 0x%x", kind, value, previous), UVM_FULL) + end + end + UVM_PREDICT_WRITE: begin + if (~value & previous) begin + delay_jobs.push_back(delay_job); + `uvm_info("SOC_IFC_REG_CBS", $sformatf("post_predict called with kind [%p] on map [%s] results in predicted LOCK deassertion, which clears EXECUTE. Delay job queued. value: 0x%x previous: 0x%x", kind, map.get_name(), value, previous), UVM_FULL) + end + else begin + `uvm_info("SOC_IFC_REG_CBS", $sformatf("post_predict called with kind [%p] has no effect", kind), UVM_FULL) + end + end + default: begin + `uvm_info("SOC_IFC_REG_CBS", $sformatf("post_predict called with kind [%p] has no effect", kind), UVM_FULL) + end + endcase + end + else if (map.get_name() == this.APB_map_name) begin + case (kind) inside + UVM_PREDICT_READ: begin + // Rising edge on RS + // Reading lock when it is already locked has no effect, so + // only calculate predictions on acquiring lock + if (value & ~previous) begin + rm.STATUS.SOC_HAS_LOCK.predict(uvm_reg_data_t'(1)); + end + else begin + `uvm_info("SOC_IFC_REG_CBS", $sformatf("post_predict called with kind [%p] has no effect. value: 0x%x previous: 0x%x", kind, value, previous), UVM_FULL) + end + end + UVM_PREDICT_WRITE: begin + if (~value & previous) begin + delay_jobs.push_back(delay_job); + `uvm_info("SOC_IFC_REG_CBS", $sformatf("post_predict called with kind [%p] on map [%s] results in predicted LOCK deassertion, which clears EXECUTE. Delay job queued. value: 0x%x previous: 0x%x", kind, map.get_name(), value, previous), UVM_FULL) + end + else begin + `uvm_info("SOC_IFC_REG_CBS", $sformatf("post_predict called with kind [%p] has no effect", kind), UVM_FULL) + end end + default: begin + `uvm_info("SOC_IFC_REG_CBS", $sformatf("post_predict called with kind [%p] has no effect", kind), UVM_FULL) + end + endcase + end + else begin + `uvm_error("SOC_IFC_REG_CBS", "post_predict called through unsupported reg map!") + end + endfunction + +endclass diff --git a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/registers/soc_ifc_reg_cbs_soc_ifc_reg_CPTRA_HW_ERROR_FATAL.svh b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/registers/soc_ifc_reg_cbs_soc_ifc_reg_CPTRA_HW_ERROR_FATAL.svh new file mode 100644 index 000000000..3fd9f3f02 --- /dev/null +++ b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/registers/soc_ifc_reg_cbs_soc_ifc_reg_CPTRA_HW_ERROR_FATAL.svh @@ -0,0 +1,68 @@ +//---------------------------------------------------------------------- +// SPDX-License-Identifier: Apache-2.0 +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +//---------------------------------------------------------------------- + +class soc_ifc_reg_cbs_soc_ifc_reg_CPTRA_HW_ERROR_FATAL extends uvm_reg_cbs; + + `uvm_object_utils(soc_ifc_reg_cbs_soc_ifc_reg_CPTRA_HW_ERROR_FATAL) + + string AHB_map_name = "soc_ifc_AHB_map"; + string APB_map_name = "soc_ifc_APB_map"; + + // Function: post_predict + // + // Called by the method + // after a successful UVM_PREDICT_READ or UVM_PREDICT_WRITE prediction. + // + // ~previous~ is the previous value in the mirror and + // ~value~ is the latest predicted value. Any change to ~value~ will + // modify the predicted mirror value. + // + virtual function void post_predict(input uvm_reg_field fld, + input uvm_reg_data_t previous, + inout uvm_reg_data_t value, + input uvm_predict_e kind, + input uvm_path_e path, + input uvm_reg_map map); + soc_ifc_reg_ext rm; /* soc_ifc_reg_rm */ + uvm_reg_block blk = fld.get_parent().get_parent(); /* soc_ifc_reg_rm */ + if (!$cast(rm,blk)) `uvm_fatal ("SOC_IFC_REG_CBS", "Failed to get valid class handle") + if (map.get_name() == this.AHB_map_name) begin + case (kind) inside + default: begin + `uvm_info("SOC_IFC_REG_CBS", $sformatf("post_predict called with kind [%p] has no effect. value: 0x%x previous: 0x%x", kind, value, previous), UVM_FULL) + end + endcase + end + else if (map.get_name() == this.APB_map_name) begin + case (kind) inside +// SoC DOES have write privs +// UVM_PREDICT_WRITE: begin +// if (value != previous) begin +// value = previous; +// `uvm_info("SOC_IFC_REG_CBS", $sformatf("Writes to [%s] unsupported via map [%s], value prediction is dropped", fld.get_full_name(), map.get_name()), UVM_LOW) +// end +// end + default: begin + `uvm_info("SOC_IFC_REG_CBS", $sformatf("post_predict called with kind [%p] has no effect. value: 0x%x previous: 0x%x", kind, value, previous), UVM_FULL) + end + endcase + end + else begin + `uvm_error("SOC_IFC_REG_CBS", "post_predict called through unsupported reg map!") + end + endfunction + +endclass diff --git a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/registers/soc_ifc_reg_cbs_soc_ifc_reg_CPTRA_HW_ERROR_NON_FATAL.svh b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/registers/soc_ifc_reg_cbs_soc_ifc_reg_CPTRA_HW_ERROR_NON_FATAL.svh new file mode 100644 index 000000000..8fbb61989 --- /dev/null +++ b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/registers/soc_ifc_reg_cbs_soc_ifc_reg_CPTRA_HW_ERROR_NON_FATAL.svh @@ -0,0 +1,68 @@ +//---------------------------------------------------------------------- +// SPDX-License-Identifier: Apache-2.0 +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +//---------------------------------------------------------------------- + +class soc_ifc_reg_cbs_soc_ifc_reg_CPTRA_HW_ERROR_NON_FATAL extends uvm_reg_cbs; + + `uvm_object_utils(soc_ifc_reg_cbs_soc_ifc_reg_CPTRA_HW_ERROR_NON_FATAL) + + string AHB_map_name = "soc_ifc_AHB_map"; + string APB_map_name = "soc_ifc_APB_map"; + + // Function: post_predict + // + // Called by the method + // after a successful UVM_PREDICT_READ or UVM_PREDICT_WRITE prediction. + // + // ~previous~ is the previous value in the mirror and + // ~value~ is the latest predicted value. Any change to ~value~ will + // modify the predicted mirror value. + // + virtual function void post_predict(input uvm_reg_field fld, + input uvm_reg_data_t previous, + inout uvm_reg_data_t value, + input uvm_predict_e kind, + input uvm_path_e path, + input uvm_reg_map map); + soc_ifc_reg_ext rm; /* soc_ifc_reg_rm */ + uvm_reg_block blk = fld.get_parent().get_parent(); /* soc_ifc_reg_rm */ + if (!$cast(rm,blk)) `uvm_fatal ("SOC_IFC_REG_CBS", "Failed to get valid class handle") + if (map.get_name() == this.AHB_map_name) begin + case (kind) inside + default: begin + `uvm_info("SOC_IFC_REG_CBS", $sformatf("post_predict called with kind [%p] has no effect. value: 0x%x previous: 0x%x", kind, value, previous), UVM_FULL) + end + endcase + end + else if (map.get_name() == this.APB_map_name) begin + case (kind) inside +// SoC DOES have write privs +// UVM_PREDICT_WRITE: begin +// if (value != previous) begin +// value = previous; +// `uvm_info("SOC_IFC_REG_CBS", $sformatf("Writes to [%s] unsupported via map [%s], value prediction is dropped", fld.get_full_name(), map.get_name()), UVM_LOW) +// end +// end + default: begin + `uvm_info("SOC_IFC_REG_CBS", $sformatf("post_predict called with kind [%p] has no effect. value: 0x%x previous: 0x%x", kind, value, previous), UVM_FULL) + end + endcase + end + else begin + `uvm_error("SOC_IFC_REG_CBS", "post_predict called through unsupported reg map!") + end + endfunction + +endclass diff --git a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/registers/soc_ifc_reg_cbs_soc_ifc_reg_CPTRA_TRNG_CTRL_CLEAR.svh b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/registers/soc_ifc_reg_cbs_soc_ifc_reg_CPTRA_TRNG_CTRL_CLEAR.svh new file mode 100644 index 000000000..6949ef358 --- /dev/null +++ b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/registers/soc_ifc_reg_cbs_soc_ifc_reg_CPTRA_TRNG_CTRL_CLEAR.svh @@ -0,0 +1,119 @@ +//---------------------------------------------------------------------- +// SPDX-License-Identifier: Apache-2.0 +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +//---------------------------------------------------------------------- + +// Reg predictions that will be scheduled on AHB write to internal_fw_update_reset +class soc_ifc_reg_delay_job_soc_ifc_reg_CPTRA_TRNG_CTRL_CLEAR extends soc_ifc_reg_delay_job; + `uvm_object_utils( soc_ifc_reg_delay_job_soc_ifc_reg_CPTRA_TRNG_CTRL_CLEAR ) + soc_ifc_reg_ext rm; /* soc_ifc_reg_rm */ + uvm_reg_block rm_top; + uvm_reg_map map; + bit clear_trng_data_regs; + int i; + + virtual task do_job(); + `uvm_info("SOC_IFC_REG_DELAY_JOB", "Running delayed job for soc_ifc_reg.CPTRA_TRNG_CTRL.clear", UVM_LOW) + rm_top = rm.get_parent(); + for (i=0; i<$size(rm.CPTRA_TRNG_DATA); i++) begin + `uvm_info("SOC_IFC_REG_CBS", $sformatf("Before clear: TRNG data[%0d] value 0x%x", i, rm.CPTRA_TRNG_DATA[i].DATA.get_mirrored_value()), UVM_DEBUG) + end + if (clear_trng_data_regs) begin + for (i=0; i<$size(rm.CPTRA_TRNG_DATA); i++) begin + rm.CPTRA_TRNG_DATA[i].DATA.predict(uvm_reg_data_t'(0)); + end + end + for (i=0; i<$size(rm.CPTRA_TRNG_DATA); i++) begin + `uvm_info("SOC_IFC_REG_CBS", $sformatf("After clear: TRNG data[%0d] value 0x%x", i, rm.CPTRA_TRNG_DATA[i].DATA.get_mirrored_value()), UVM_DEBUG) + end + endtask +endclass + +// Callback for CPTRA TRNG CTRL register +class soc_ifc_reg_cbs_soc_ifc_reg_CPTRA_TRNG_CTRL_CLEAR extends uvm_reg_cbs; + + `uvm_object_utils(soc_ifc_reg_cbs_soc_ifc_reg_CPTRA_TRNG_CTRL_CLEAR) + + string AHB_map_name = "soc_ifc_AHB_map"; + string APB_map_name = "soc_ifc_APB_map"; + uvm_queue #(soc_ifc_reg_delay_job) delay_jobs; + + function new(string name = "uvm_reg_cbs"); + super.new(name); + if (!uvm_config_db#(uvm_queue#(soc_ifc_reg_delay_job))::get(null, "soc_ifc_reg_model_top", "delay_jobs", delay_jobs)) + `uvm_error("SOC_IFC_REG_CBS", "Failed to get handle for 'delay_jobs' queue from config database!") + endfunction + + // Function: post_predict + // + // Called by the method + // after a successful UVM_PREDICT_READ or UVM_PREDICT_WRITE prediction. + // + // ~previous~ is the previous value in the mirror and + // ~value~ is the latest predicted value. Any change to ~value~ will + // modify the predicted mirror value. + // + virtual function void post_predict(input uvm_reg_field fld, + input uvm_reg_data_t previous, + inout uvm_reg_data_t value, + input uvm_predict_e kind, + input uvm_path_e path, + input uvm_reg_map map); + + soc_ifc_reg_delay_job_soc_ifc_reg_CPTRA_TRNG_CTRL_CLEAR delay_job_clear_trng_data_regs; + soc_ifc_reg_ext rm; /* soc_ifc_reg_rm */ + uvm_reg_block blk = fld.get_parent().get_parent(); /* soc_ifc_reg_rm */ + if (!$cast(rm,blk)) `uvm_fatal ("SOC_IFC_REG_CBS", "Failed to get valid class handle") + delay_job_clear_trng_data_regs = soc_ifc_reg_delay_job_soc_ifc_reg_CPTRA_TRNG_CTRL_CLEAR::type_id::create("delay_job_clear_trng_data_regs"); + delay_job_clear_trng_data_regs.rm = rm; + delay_job_clear_trng_data_regs.map = map; + delay_job_clear_trng_data_regs.clear_trng_data_regs = 1; + //account for state transitions + variable wait cycle time + delay_job_clear_trng_data_regs.set_delay_cycles(1); + + if (map.get_name() == this.AHB_map_name) begin + case (kind) inside + UVM_PREDICT_WRITE: begin + if (value & !previous) begin + //push a delayed job for clearing of TRNG data regs + `uvm_info("SOC_IFC_REG_CBS", $sformatf("Sending delay job for internal register field %s with %0d clk delay", fld.get_full_name(), delay_job_clear_trng_data_regs.get_delay_cycles()), UVM_LOW) + value = 1'b0; //TRNG_CTRL.clear is a pulse + delay_jobs.push_back(delay_job_clear_trng_data_regs); + end else begin + `uvm_info("SOC_IFC_REG_CBS", $sformatf("post_predict called with kind [%p] on map [%s] has no effect on internal register field %s", kind, map.get_name(), fld.get_full_name()), UVM_FULL) + end + end + default: begin + `uvm_info("SOC_IFC_REG_CBS", $sformatf("post_predict called with kind [%p] on map [%s] has no effect on internal register field %s", kind, map.get_name(), fld.get_full_name()), UVM_FULL) + + end + endcase + end + else if (map.get_name() == this.APB_map_name) begin + case (kind) inside + UVM_PREDICT_WRITE: begin + `uvm_info("SOC_IFC_REG_CBS", $sformatf("post_predict blocked write attempt to internal reg field %s on map %s. value: 0x%x previous: 0x%x", fld.get_full_name(), map.get_name(), value, previous), UVM_LOW) + value = previous; + end + default: begin + `uvm_info("SOC_IFC_REG_CBS", $sformatf("post_predict called with kind [%p] on map [%s] has no effect on internal register field %s. value: 0x%x previous: 0x%x", kind, map.get_name(), fld.get_full_name(), value, previous), UVM_FULL) + end + endcase + end + else begin + `uvm_error("SOC_IFC_REG_CBS", {"post_predict called through unsupported reg map! ", map.get_name()}) + end + endfunction + +endclass diff --git a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/registers/soc_ifc_reg_cbs_soc_ifc_reg_CPTRA_WDT_TIMER1_CTRL_TIMER1_RESTART.svh b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/registers/soc_ifc_reg_cbs_soc_ifc_reg_CPTRA_WDT_TIMER1_CTRL_TIMER1_RESTART.svh new file mode 100644 index 000000000..bb2af36b0 --- /dev/null +++ b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/registers/soc_ifc_reg_cbs_soc_ifc_reg_CPTRA_WDT_TIMER1_CTRL_TIMER1_RESTART.svh @@ -0,0 +1,82 @@ +//---------------------------------------------------------------------- +// SPDX-License-Identifier: Apache-2.0 +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +//---------------------------------------------------------------------- + +class soc_ifc_reg_cbs_soc_ifc_reg_CPTRA_WDT_TIMER1_CTRL_TIMER1_RESTART extends uvm_reg_cbs; + + `uvm_object_utils(soc_ifc_reg_cbs_soc_ifc_reg_CPTRA_WDT_TIMER1_CTRL_TIMER1_RESTART) + + string AHB_map_name = "soc_ifc_AHB_map"; + string APB_map_name = "soc_ifc_APB_map"; + + // Function: post_predict + // + // Called by the method + // after a successful UVM_PREDICT_READ or UVM_PREDICT_WRITE prediction. + // + // ~previous~ is the previous value in the mirror and + // ~value~ is the latest predicted value. Any change to ~value~ will + // modify the predicted mirror value. + // + virtual function void post_predict(input uvm_reg_field fld, + input uvm_reg_data_t previous, + inout uvm_reg_data_t value, + input uvm_predict_e kind, + input uvm_path_e path, + input uvm_reg_map map); + // uvm_reg_block rm; + // string event_name; + // uvm_reg sts_reg; + // uvm_reg_field sts_fld; + + // rm = fld.get_parent().get_parent(); /* intr_block_rf_ext */ + // // Get a base-name for the event by truncating the '_trig' suffix + // event_name = fld.get_name().substr(0,fld.get_name().len()-6); + // sts_reg = rm.get_reg_by_name("error_internal_intr_r"); + // sts_fld = sts_reg.get_field_by_name({event_name, "_sts"}); + + if (map.get_name() == this.APB_map_name) begin + if (kind == UVM_PREDICT_WRITE) + `uvm_warning("SOC_IFC_REG_CBS", "Unexpected write to WDT_TIMER1_CTRL register through APB interface!") + else + `uvm_info("SOC_IFC_REG_CBS", "Unexpected read to WDT_TIMER1_CTRL register through APB interface!", UVM_LOW) + end + `uvm_info("SOC_IFC_REG_CBS", $sformatf("Access to %s with path %p", fld.get_full_name(), path), UVM_FULL) + + if (kind == UVM_PREDICT_WRITE) begin + // On rising edge of field trigger value, predict interrupt status will + // be set + if (value & ~previous) begin + `uvm_info("SOC_IFC_REG_CBS", {"Predicted update to ", fld.get_name()}, UVM_MEDIUM) + // - Use UVM_PREDICT_READ kind so that all the callbacks associated with + // notif__sts are also called to detect interrupt pin assertion + // - Use UVM_PREDICT_READ instead of UVM_PREDICT_WRITE so that + // "do_predict" bypasses the access-check and does not enforce W1C + // behavior on this attempt to set interrupt status to 1 + end + + // Because WDT timer restart is single-pulse, it should auto-clear immediately on + // being written. + // So set predicted value to 0. + value = 0; + `uvm_info("SOC_IFC_REG_CBS", + $sformatf("Write to %s results in mirrored value forcibly predicted to [%x]", + fld.get_name(), + value), + UVM_HIGH) + end + endfunction + +endclass diff --git a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/registers/soc_ifc_reg_cbs_soc_ifc_reg_CPTRA_WDT_TIMER2_CTRL_TIMER2_RESTART.svh b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/registers/soc_ifc_reg_cbs_soc_ifc_reg_CPTRA_WDT_TIMER2_CTRL_TIMER2_RESTART.svh new file mode 100644 index 000000000..129a5e19c --- /dev/null +++ b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/registers/soc_ifc_reg_cbs_soc_ifc_reg_CPTRA_WDT_TIMER2_CTRL_TIMER2_RESTART.svh @@ -0,0 +1,82 @@ +//---------------------------------------------------------------------- +// SPDX-License-Identifier: Apache-2.0 +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +//---------------------------------------------------------------------- + +class soc_ifc_reg_cbs_soc_ifc_reg_CPTRA_WDT_TIMER2_CTRL_TIMER2_RESTART extends uvm_reg_cbs; + + `uvm_object_utils(soc_ifc_reg_cbs_soc_ifc_reg_CPTRA_WDT_TIMER2_CTRL_TIMER2_RESTART) + + string AHB_map_name = "soc_ifc_AHB_map"; + string APB_map_name = "soc_ifc_APB_map"; + + // Function: post_predict + // + // Called by the method + // after a successful UVM_PREDICT_READ or UVM_PREDICT_WRITE prediction. + // + // ~previous~ is the previous value in the mirror and + // ~value~ is the latest predicted value. Any change to ~value~ will + // modify the predicted mirror value. + // + virtual function void post_predict(input uvm_reg_field fld, + input uvm_reg_data_t previous, + inout uvm_reg_data_t value, + input uvm_predict_e kind, + input uvm_path_e path, + input uvm_reg_map map); + // uvm_reg_block rm; + // string event_name; + // uvm_reg sts_reg; + // uvm_reg_field sts_fld; + + // rm = fld.get_parent().get_parent(); /* intr_block_rf_ext */ + // // Get a base-name for the event by truncating the '_trig' suffix + // event_name = fld.get_name().substr(0,fld.get_name().len()-6); + // sts_reg = rm.get_reg_by_name("error_internal_intr_r"); + // sts_fld = sts_reg.get_field_by_name({event_name, "_sts"}); + + if (map.get_name() == this.APB_map_name) begin + if (kind == UVM_PREDICT_WRITE) + `uvm_warning("SOC_IFC_REG_CBS", "Unexpected write to WDT_TIMER2_CTRL register through APB interface!") + else + `uvm_info("SOC_IFC_REG_CBS", "Unexpected read to WDT_TIMER2_CTRL register through APB interface!", UVM_LOW) + end + `uvm_info("SOC_IFC_REG_CBS", $sformatf("Access to %s with path %p", fld.get_full_name(), path), UVM_FULL) + + if (kind == UVM_PREDICT_WRITE) begin + // On rising edge of field trigger value, predict interrupt status will + // be set + if (value & ~previous) begin + `uvm_info("SOC_IFC_REG_CBS", {"Predicted update to ", fld.get_name(), " triggers interrupt output pin assertion"}, UVM_MEDIUM) + // - Use UVM_PREDICT_READ kind so that all the callbacks associated with + // notif__sts are also called to detect interrupt pin assertion + // - Use UVM_PREDICT_READ instead of UVM_PREDICT_WRITE so that + // "do_predict" bypasses the access-check and does not enforce W1C + // behavior on this attempt to set interrupt status to 1 + end + + // Because WDT timer restart is single-pulse, it should auto-clear immediately on + // being written. + // So set predicted value to 0. + value = 0; + `uvm_info("SOC_IFC_REG_CBS", + $sformatf("Write to %s results in mirrored value forcibly predicted to [%x]", + fld.get_name(), + value), + UVM_HIGH) + end + endfunction + +endclass diff --git a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/registers/soc_ifc_reg_cbs_soc_ifc_reg_fuse.svh b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/registers/soc_ifc_reg_cbs_soc_ifc_reg_fuse.svh new file mode 100644 index 000000000..24c76f02a --- /dev/null +++ b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/registers/soc_ifc_reg_cbs_soc_ifc_reg_fuse.svh @@ -0,0 +1,67 @@ +//---------------------------------------------------------------------- +// SPDX-License-Identifier: Apache-2.0 +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +//---------------------------------------------------------------------- + +class soc_ifc_reg_cbs_soc_ifc_reg_fuse extends uvm_reg_cbs; + + `uvm_object_utils(soc_ifc_reg_cbs_soc_ifc_reg_fuse) + + string AHB_map_name = "soc_ifc_AHB_map"; + string APB_map_name = "soc_ifc_APB_map"; + + // Function: post_predict + // + // Called by the method + // after a successful UVM_PREDICT_READ or UVM_PREDICT_WRITE prediction. + // + // ~previous~ is the previous value in the mirror and + // ~value~ is the latest predicted value. Any change to ~value~ will + // modify the predicted mirror value. + // + virtual function void post_predict(input uvm_reg_field fld, + input uvm_reg_data_t previous, + inout uvm_reg_data_t value, + input uvm_predict_e kind, + input uvm_path_e path, + input uvm_reg_map map); + soc_ifc_reg_ext rm; /* soc_ifc_reg_rm */ + uvm_reg_block blk = fld.get_parent().get_parent(); /* soc_ifc_reg_rm */ + if (!$cast(rm,blk)) `uvm_fatal ("SOC_IFC_REG_CBS", "Failed to get valid class handle") + if (map.get_name() == this.AHB_map_name || + map.get_name() == this.APB_map_name) begin + case (kind) inside + UVM_PREDICT_READ: begin + `uvm_info("SOC_IFC_REG_CBS", $sformatf("post_predict called with kind [%p] has no effect. value: 0x%x previous: 0x%x", kind, value, previous), UVM_FULL) + end + UVM_PREDICT_WRITE: begin + if (rm.CPTRA_FUSE_WR_DONE.done.get_mirrored_value()) begin + `uvm_info("SOC_IFC_REG_CBS", $sformatf("post_predict blocked write attempt to field %s due to CPTRA_FUSE_WR_DONE. value: 0x%x previous: 0x%x", fld.get_full_name(), value, previous), UVM_LOW) + value = previous; + end + else begin + `uvm_info("SOC_IFC_REG_CBS", $sformatf("post_predict called with kind [%p] has no effect. value: 0x%x previous: 0x%x", kind, value, previous), UVM_FULL) + end + end + default: begin + `uvm_info("SOC_IFC_REG_CBS", $sformatf("post_predict called with kind [%p] has no effect", kind), UVM_FULL) + end + endcase + end + else begin + `uvm_error("SOC_IFC_REG_CBS", "post_predict called through unsupported reg map!") + end + endfunction + +endclass diff --git a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/registers/soc_ifc_reg_cbs_soc_ifc_reg_internal.svh b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/registers/soc_ifc_reg_cbs_soc_ifc_reg_internal.svh new file mode 100644 index 000000000..4dcdc22ed --- /dev/null +++ b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/registers/soc_ifc_reg_cbs_soc_ifc_reg_internal.svh @@ -0,0 +1,70 @@ +//---------------------------------------------------------------------- +// SPDX-License-Identifier: Apache-2.0 +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +//---------------------------------------------------------------------- + +// General callback that implements the swwel=soc_req behavior for "internal" registers +class soc_ifc_reg_cbs_soc_ifc_reg_internal extends uvm_reg_cbs; + + `uvm_object_utils(soc_ifc_reg_cbs_soc_ifc_reg_internal) + + string AHB_map_name = "soc_ifc_AHB_map"; + string APB_map_name = "soc_ifc_APB_map"; + + uvm_queue #(soc_ifc_reg_delay_job) delay_jobs; + + function new(string name = "uvm_reg_cbs"); + super.new(name); + if (!uvm_config_db#(uvm_queue#(soc_ifc_reg_delay_job))::get(null, "soc_ifc_reg_model_top", "delay_jobs", delay_jobs)) + `uvm_error("SOC_IFC_REG_CBS", "Failed to get handle for 'delay_jobs' queue from config database!") + endfunction + + // Function: post_predict + // + // Called by the method + // after a successful UVM_PREDICT_READ or UVM_PREDICT_WRITE prediction. + // + // ~previous~ is the previous value in the mirror and + // ~value~ is the latest predicted value. Any change to ~value~ will + // modify the predicted mirror value. + // + virtual function void post_predict(input uvm_reg_field fld, + input uvm_reg_data_t previous, + inout uvm_reg_data_t value, + input uvm_predict_e kind, + input uvm_path_e path, + input uvm_reg_map map); + soc_ifc_reg_ext rm; /* soc_ifc_reg_rm */ + uvm_reg_block blk = fld.get_parent().get_parent(); /* soc_ifc_reg_rm */ + if (!$cast(rm,blk)) `uvm_fatal ("SOC_IFC_REG_CBS", "Failed to get valid class handle") + if (map.get_name() == this.AHB_map_name) begin + `uvm_info("SOC_IFC_REG_CBS", $sformatf("post_predict called with kind [%p] on map [%s] has no effect on internal register field %s", kind, map.get_name(), fld.get_full_name()), UVM_FULL) + end + else if (map.get_name() == this.APB_map_name) begin + case (kind) inside + UVM_PREDICT_WRITE: begin + `uvm_info("SOC_IFC_REG_CBS", $sformatf("post_predict blocked write attempt to internal reg field %s on map %s. value: 0x%x previous: 0x%x", fld.get_full_name(), map.get_name(), value, previous), UVM_LOW) + value = previous; + end + default: begin + `uvm_info("SOC_IFC_REG_CBS", $sformatf("post_predict called with kind [%p] on map [%s] has no effect on internal register field %s. value: 0x%x previous: 0x%x", kind, map.get_name(), fld.get_full_name(), value, previous), UVM_FULL) + end + endcase + end + else begin + `uvm_error("SOC_IFC_REG_CBS", {"post_predict called through unsupported reg map! ", map.get_name()}) + end + endfunction + +endclass diff --git a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/registers/soc_ifc_reg_cbs_soc_ifc_reg_internal_fw_update_reset.svh b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/registers/soc_ifc_reg_cbs_soc_ifc_reg_internal_fw_update_reset.svh new file mode 100644 index 000000000..71d04dbff --- /dev/null +++ b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/registers/soc_ifc_reg_cbs_soc_ifc_reg_internal_fw_update_reset.svh @@ -0,0 +1,179 @@ +//---------------------------------------------------------------------- +// SPDX-License-Identifier: Apache-2.0 +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +//---------------------------------------------------------------------- + +// Reg predictions that will be scheduled on AHB write to internal_fw_update_reset +class soc_ifc_reg_delay_job_soc_ifc_reg_internal_fw_update_reset_core_rst extends soc_ifc_reg_delay_job; + `uvm_object_utils( soc_ifc_reg_delay_job_soc_ifc_reg_internal_fw_update_reset_core_rst ) + soc_ifc_reg_ext rm; /* soc_ifc_reg_rm */ + uvm_reg_block rm_top; + uvm_reg_map map; + bit iccm_unlock = 1'b0; + bit fsm_done_to_rst = 1'b0; + bit fsm_rst_to_wait = 1'b0; + bit fsm_wait_to_done = 1'b0; + + virtual task do_job(); + `uvm_info("SOC_IFC_REG_DELAY_JOB", "Running delayed job for soc_ifc_reg.internal_fw_update_reset.core_rst", UVM_LOW) + rm_top = rm.get_parent(); + `uvm_info("SOC_IFC_REG_CBS", $sformatf("iccm_lock value 0x%x, boot FSM tracker: [%p]", rm.internal_iccm_lock.lock.get_mirrored_value(), rm.boot_fn_state_sigs), UVM_LOW) + if (fsm_done_to_rst) begin + rm.boot_fn_state_sigs = '{boot_fw_rst: 1'b1, default: 1'b0}; + `uvm_info("SOC_IFC_REG_CBS", $sformatf("iccm_lock value 0x%x, boot FSM tracker: [%p]", rm.internal_iccm_lock.lock.get_mirrored_value(), rm.boot_fn_state_sigs), UVM_LOW) + end + else if (fsm_rst_to_wait && rm.boot_fn_state_sigs.boot_fw_rst) begin + rm.boot_fn_state_sigs = '{boot_wait: 1'b1, default: 1'b0}; + `uvm_info("SOC_IFC_REG_CBS", $sformatf("iccm_lock value 0x%x, boot FSM tracker: [%p]", rm.internal_iccm_lock.lock.get_mirrored_value(), rm.boot_fn_state_sigs), UVM_LOW) + // This delay job should also trigger the assertion of uC reset in the predictor + end + else if (fsm_wait_to_done && rm.boot_fn_state_sigs.boot_wait) begin + rm.boot_fn_state_sigs = '{boot_done: 1'b1, default: 1'b0}; + `uvm_info("SOC_IFC_REG_CBS", $sformatf("iccm_lock value 0x%x, boot FSM tracker: [%p]", rm.internal_iccm_lock.lock.get_mirrored_value(), rm.boot_fn_state_sigs), UVM_LOW) + // This delay job should also trigger the de-assertion of fw_update_rst_window in the predictor + end + else if (iccm_unlock && rm.boot_fn_state_sigs.boot_done) begin + rm.internal_iccm_lock.lock.predict(uvm_reg_data_t'(0)); + `uvm_info("SOC_IFC_REG_CBS", $sformatf("iccm_lock value 0x%x, boot FSM tracker: [%p]", rm.internal_iccm_lock.lock.get_mirrored_value(), rm.boot_fn_state_sigs), UVM_LOW) + // This delay job should also trigger the de-assertion of iccm_lock in the predictor + end + else if (rm.boot_fn_state_sigs.boot_done) begin + `uvm_info("SOC_IFC_REG_CBS", $sformatf("Delay job should trigger uC reset deassertion. iccm_lock value 0x%x, boot FSM tracker: [%p]", rm.internal_iccm_lock.lock.get_mirrored_value(), rm.boot_fn_state_sigs), UVM_LOW) + // This delay job should also trigger the de-assertion of uC reset in the predictor + end + else begin + `uvm_error("SOC_IFC_REG_CBS", + $sformatf("Delay job for internal_fw_update_reset_core_rst ran with unexpected options and Boot FSM state! options: [iccm:%0x fwrst:%0x wait:%0x done:%0x] iccm_lock value 0x%x, boot FSM tracker: [%p]", + iccm_unlock , + fsm_done_to_rst , + fsm_rst_to_wait , + fsm_wait_to_done, + rm.internal_iccm_lock.lock.get_mirrored_value(), + rm.boot_fn_state_sigs)) + end + endtask +endclass + +// Callback for fw update reset register +class soc_ifc_reg_cbs_soc_ifc_reg_internal_fw_update_reset extends soc_ifc_reg_cbs_soc_ifc_reg_internal; + + `uvm_object_utils(soc_ifc_reg_cbs_soc_ifc_reg_internal_fw_update_reset) + + string AHB_map_name = "soc_ifc_AHB_map"; + string APB_map_name = "soc_ifc_APB_map"; + + // Function: post_predict + // + // Called by the method + // after a successful UVM_PREDICT_READ or UVM_PREDICT_WRITE prediction. + // + // ~previous~ is the previous value in the mirror and + // ~value~ is the latest predicted value. Any change to ~value~ will + // modify the predicted mirror value. + // + virtual function void post_predict(input uvm_reg_field fld, + input uvm_reg_data_t previous, + inout uvm_reg_data_t value, + input uvm_predict_e kind, + input uvm_path_e path, + input uvm_reg_map map); + + soc_ifc_reg_delay_job_soc_ifc_reg_internal_fw_update_reset_core_rst delay_job_boot_fsm_fwrst; + soc_ifc_reg_delay_job_soc_ifc_reg_internal_fw_update_reset_core_rst delay_job_boot_fsm_wait; + soc_ifc_reg_delay_job_soc_ifc_reg_internal_fw_update_reset_core_rst delay_job_rst_window; + soc_ifc_reg_delay_job_soc_ifc_reg_internal_fw_update_reset_core_rst delay_job_iccm_unlock; + soc_ifc_reg_delay_job_soc_ifc_reg_internal_fw_update_reset_core_rst delay_job_uc_rst; + soc_ifc_reg_ext rm; /* soc_ifc_reg_rm */ + uvm_reg_block blk = fld.get_parent().get_parent(); /* soc_ifc_reg_rm */ + if (!$cast(rm,blk)) `uvm_fatal ("SOC_IFC_REG_CBS", "Failed to get valid class handle") + + delay_job_boot_fsm_fwrst = soc_ifc_reg_delay_job_soc_ifc_reg_internal_fw_update_reset_core_rst::type_id::create("delay_job_boot_fsm_fwrst"); + delay_job_boot_fsm_fwrst.rm = rm; + delay_job_boot_fsm_fwrst.map = map; + delay_job_boot_fsm_fwrst.fsm_done_to_rst = 1; + delay_job_boot_fsm_fwrst.set_delay_cycles(0); // transition to state boot_fw_rst occurs 1 clock after the reg write + + delay_job_boot_fsm_wait = soc_ifc_reg_delay_job_soc_ifc_reg_internal_fw_update_reset_core_rst::type_id::create("delay_job_boot_fsm_wait"); + delay_job_boot_fsm_wait.rm = rm; + delay_job_boot_fsm_wait.map = map; + delay_job_boot_fsm_wait.fsm_rst_to_wait = 1; + delay_job_boot_fsm_wait.set_delay_cycles(delay_job_boot_fsm_fwrst.get_delay_cycles() + 2); //transition to state boot_wait (and uC reset assertion) occurs 2 clocks after the boot_fw_rst state + + delay_job_rst_window = soc_ifc_reg_delay_job_soc_ifc_reg_internal_fw_update_reset_core_rst::type_id::create("delay_job_rst_window"); + delay_job_rst_window.rm = rm; + delay_job_rst_window.map = map; + delay_job_rst_window.fsm_wait_to_done = 1; + delay_job_rst_window.set_delay_cycles(delay_job_boot_fsm_wait.get_delay_cycles()+1+rm.internal_fw_update_reset_wait_cycles.wait_cycles.get_mirrored_value()); //calculate total delay until transition to state boot_done and deassertion of fw_update_rst_window + + delay_job_iccm_unlock = soc_ifc_reg_delay_job_soc_ifc_reg_internal_fw_update_reset_core_rst::type_id::create("delay_job_iccm_unlock"); + delay_job_iccm_unlock.rm = rm; + delay_job_iccm_unlock.map = map; + delay_job_iccm_unlock.iccm_unlock = 1; + delay_job_iccm_unlock.set_delay_cycles(delay_job_rst_window.get_delay_cycles()+1); //this iccm unlock comes 1 clock after state transition + + delay_job_uc_rst = soc_ifc_reg_delay_job_soc_ifc_reg_internal_fw_update_reset_core_rst::type_id::create("delay_job_uc_rst"); + delay_job_uc_rst.rm = rm; + delay_job_uc_rst.map = map; + delay_job_uc_rst.set_delay_cycles(delay_job_iccm_unlock.get_delay_cycles()+1); // Deassertion of uC reset is the last event triggered by this reg access + + if (map.get_name() == this.AHB_map_name) begin + case (kind) inside + UVM_PREDICT_WRITE: begin + if (value & !previous) begin + //push a job to catch transition to boot_fw_rst state 1 clock later + delay_jobs.push_back(delay_job_boot_fsm_fwrst); + //push a job to catch transition to boot_wait state and assertion of uC reset 1 clock later + delay_jobs.push_back(delay_job_boot_fsm_wait); + //push another job to catch de-assertion of fw_update_rst_window on state transition to boot_done + delay_jobs.push_back(delay_job_rst_window); + //push a delayed job for de-assertion of iccm lock 1 clock later + delay_jobs.push_back(delay_job_iccm_unlock); + //push another job to catch de-assertion of reset 1 clock later + delay_jobs.push_back(delay_job_uc_rst); + `uvm_info("SOC_IFC_REG_CBS", + $sformatf("Sending 5 delay jobs for internal register field %s with clk delays: [%0d] [%0d] [%0d] [%0d] [%0d]", + fld.get_full_name(), + delay_job_boot_fsm_fwrst.get_delay_cycles(), + delay_job_boot_fsm_wait.get_delay_cycles(), + delay_job_rst_window.get_delay_cycles(), + delay_job_iccm_unlock.get_delay_cycles(), + delay_job_uc_rst.get_delay_cycles()), + UVM_LOW) + end else begin + `uvm_info("SOC_IFC_REG_CBS", $sformatf("post_predict called with kind [%p] on map [%s] has no effect on internal register field %s", kind, map.get_name(), fld.get_full_name()), UVM_FULL) + end + end + default: begin + `uvm_info("SOC_IFC_REG_CBS", $sformatf("post_predict called with kind [%p] on map [%s] has no effect on internal register field %s", kind, map.get_name(), fld.get_full_name()), UVM_FULL) + + end + endcase + end + else if (map.get_name() == this.APB_map_name) begin + case (kind) inside + UVM_PREDICT_WRITE: begin + `uvm_info("SOC_IFC_REG_CBS", $sformatf("post_predict blocked write attempt to internal reg field %s on map %s. value: 0x%x previous: 0x%x", fld.get_full_name(), map.get_name(), value, previous), UVM_LOW) + value = previous; + end + default: begin + `uvm_info("SOC_IFC_REG_CBS", $sformatf("post_predict called with kind [%p] on map [%s] has no effect on internal register field %s. value: 0x%x previous: 0x%x", kind, map.get_name(), fld.get_full_name(), value, previous), UVM_FULL) + end + endcase + end + else begin + `uvm_error("SOC_IFC_REG_CBS", {"post_predict called through unsupported reg map! ", map.get_name()}) + end + endfunction + +endclass diff --git a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/registers/soc_ifc_reg_cbs_soc_ifc_reg_key.svh b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/registers/soc_ifc_reg_cbs_soc_ifc_reg_key.svh new file mode 100644 index 000000000..c981cba52 --- /dev/null +++ b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/registers/soc_ifc_reg_cbs_soc_ifc_reg_key.svh @@ -0,0 +1,62 @@ +//---------------------------------------------------------------------- +// SPDX-License-Identifier: Apache-2.0 +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +//---------------------------------------------------------------------- + +class soc_ifc_reg_cbs_soc_ifc_reg_key extends uvm_reg_cbs; + + `uvm_object_utils(soc_ifc_reg_cbs_soc_ifc_reg_key) + + string AHB_map_name = "soc_ifc_AHB_map"; + string APB_map_name = "soc_ifc_APB_map"; + + // Function: post_predict + // + // Called by the method + // after a successful UVM_PREDICT_READ or UVM_PREDICT_WRITE prediction. + // + // ~previous~ is the previous value in the mirror and + // ~value~ is the latest predicted value. Any change to ~value~ will + // modify the predicted mirror value. + // + virtual function void post_predict(input uvm_reg_field fld, + input uvm_reg_data_t previous, + inout uvm_reg_data_t value, + input uvm_predict_e kind, + input uvm_path_e path, + input uvm_reg_map map); + soc_ifc_reg_ext rm; /* soc_ifc_reg_rm */ + uvm_reg_block blk = fld.get_parent().get_parent(); /* soc_ifc_reg_rm */ + if (!$cast(rm,blk)) `uvm_fatal ("SOC_IFC_REG_CBS", "Failed to get valid class handle") + if (map.get_name() == this.AHB_map_name || + map.get_name() == this.APB_map_name) begin + case (kind) inside + UVM_PREDICT_READ: begin + `uvm_info("SOC_IFC_REG_CBS", $sformatf("post_predict called with kind [%p] has no effect. value: 0x%x previous: 0x%x", kind, value, previous), UVM_FULL) + end + UVM_PREDICT_WRITE: begin + `uvm_info("SOC_IFC_REG_CBS", $sformatf("post_predict blocked write attempt to field %s since it is an unwritable key. value: 0x%x previous: 0x%x", fld.get_full_name(), value, previous), UVM_LOW) + value = previous; + end + default: begin + `uvm_info("SOC_IFC_REG_CBS", $sformatf("post_predict called with kind [%p] has no effect", kind), UVM_FULL) + end + endcase + end + else begin + `uvm_error("SOC_IFC_REG_CBS", "post_predict called through unsupported reg map!") + end + endfunction + +endclass diff --git a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/registers/soc_ifc_reg_cbs_soc_ifc_reg_secret.svh b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/registers/soc_ifc_reg_cbs_soc_ifc_reg_secret.svh new file mode 100644 index 000000000..8a72664cc --- /dev/null +++ b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/registers/soc_ifc_reg_cbs_soc_ifc_reg_secret.svh @@ -0,0 +1,67 @@ +//---------------------------------------------------------------------- +// SPDX-License-Identifier: Apache-2.0 +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +//---------------------------------------------------------------------- + +class soc_ifc_reg_cbs_soc_ifc_reg_secret extends uvm_reg_cbs; + + `uvm_object_utils(soc_ifc_reg_cbs_soc_ifc_reg_secret) + + string AHB_map_name = "soc_ifc_AHB_map"; + string APB_map_name = "soc_ifc_APB_map"; + + // Function: post_predict + // + // Called by the method + // after a successful UVM_PREDICT_READ or UVM_PREDICT_WRITE prediction. + // + // ~previous~ is the previous value in the mirror and + // ~value~ is the latest predicted value. Any change to ~value~ will + // modify the predicted mirror value. + // + virtual function void post_predict(input uvm_reg_field fld, + input uvm_reg_data_t previous, + inout uvm_reg_data_t value, + input uvm_predict_e kind, + input uvm_path_e path, + input uvm_reg_map map); + soc_ifc_reg_ext rm; /* soc_ifc_reg_rm */ + uvm_reg_block blk = fld.get_parent().get_parent(); /* soc_ifc_reg_rm */ + if (!$cast(rm,blk)) `uvm_fatal ("SOC_IFC_REG_CBS", "Failed to get valid class handle") + if (map.get_name() == this.AHB_map_name || + map.get_name() == this.APB_map_name) begin + case (kind) inside + UVM_PREDICT_READ: begin + `uvm_info("SOC_IFC_REG_CBS", $sformatf("post_predict called with kind [%p] has no effect. value: 0x%x previous: 0x%x", kind, value, previous), UVM_FULL) + end + UVM_PREDICT_WRITE: begin + if (rm.CPTRA_FUSE_WR_DONE.done.get_mirrored_value()) begin + `uvm_info("SOC_IFC_REG_CBS", $sformatf("post_predict blocked write attempt to field %s due to CPTRA_FUSE_WR_DONE. value: 0x%x previous: 0x%x", fld.get_full_name(), value, previous), UVM_LOW) + value = previous; + end + else begin + `uvm_info("SOC_IFC_REG_CBS", $sformatf("post_predict called with kind [%p] has no effect. value: 0x%x previous: 0x%x", kind, value, previous), UVM_FULL) + end + end + default: begin + `uvm_info("SOC_IFC_REG_CBS", $sformatf("post_predict called with kind [%p] has no effect", kind), UVM_FULL) + end + endcase + end + else begin + `uvm_error("SOC_IFC_REG_CBS", "post_predict called through unsupported reg map!") + end + endfunction + +endclass diff --git a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/registers/soc_ifc_reg_delay_job.svh b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/registers/soc_ifc_reg_delay_job.svh index 9d2c35010..79b0ef63c 100644 --- a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/registers/soc_ifc_reg_delay_job.svh +++ b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/registers/soc_ifc_reg_delay_job.svh @@ -28,6 +28,7 @@ class soc_ifc_reg_delay_job extends uvm_object; `uvm_object_utils( soc_ifc_reg_delay_job ) + // 0's based value (1-cycle delay minimum imposed in soc_ifc_predictor) int unsigned delay_cycles = 0; virtual function void set_delay_cycles(int unsigned value); diff --git a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/registers/soc_ifc_reg_delay_job_intr_block_rf_ext.svh b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/registers/soc_ifc_reg_delay_job_intr_block_rf_ext.svh new file mode 100644 index 000000000..bc8f55aaf --- /dev/null +++ b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/registers/soc_ifc_reg_delay_job_intr_block_rf_ext.svh @@ -0,0 +1,85 @@ +//---------------------------------------------------------------------- +// SPDX-License-Identifier: Apache-2.0 +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +//---------------------------------------------------------------------- + +// Reg predictions that will be scheduled on value change in notif_internal_intr_r +class soc_ifc_reg_delay_job_intr_block_rf_ext extends soc_ifc_reg_delay_job; + `uvm_object_utils( soc_ifc_reg_delay_job_intr_block_rf_ext ) + + uvm_reg_field req_fld; /* used to report the reg field that caused the delay job */ + uvm_reg sts_reg; + uvm_reg en_reg ; + uvm_reg_field en_glb ; + uvm_reg_field sts_glb; + uvm_reg_map map; + + uvm_reg_data_t val_sts_reg; + uvm_reg_data_t val_en_reg ; + uvm_reg_data_t val_en_glb ; + uvm_reg_data_t val_sts_glb; + + virtual function void grab_values(); + fork + begin + // Wait for all predictor callbacks to run for every intr bit accessed + // during the current clock cycle, so mirrors are up to date + uvm_wait_for_nba_region(); + // Snapshot of current value, since next cycle may see value changes again + val_sts_reg = sts_reg.get_mirrored_value(); + val_en_reg = en_reg .get_mirrored_value(); + val_en_glb = en_glb .get_mirrored_value(); + val_sts_glb = sts_glb.get_mirrored_value(); + end + join_none + endfunction + + virtual task do_job(); + `uvm_info("SOC_IFC_REG_DELAY_JOB", $sformatf("Running delayed job for %s", req_fld.get_full_name()), UVM_MEDIUM) + if (!/*val_sts_glb*/sts_glb.get_mirrored_value() && |(val_sts_reg/*sts_reg.get_mirrored_value()*/ & val_en_reg/*en_reg.get_mirrored_value()*/) /*&& val_en_glb / * en_glb.get_mirrored_value()*/) begin + sts_glb.predict(1'b1); + `uvm_info("SOC_IFC_REG_DELAY_JOB", + $sformatf("post_predict called through map [%p] on %s results in interrupt status bit being set to 0x%0x. Values: en_reg(latched) [0x%0x(0x%0x)] sts_reg [0x%0x(0x%0x)] en_glb [0x%0x(0x%0x)] sts_glb [0x%0x(0x%0x)]", + map.get_name(), req_fld.get_full_name(), sts_glb.get_mirrored_value(), + en_reg.get_mirrored_value(), val_en_reg , + sts_reg.get_mirrored_value(), val_sts_reg, + en_glb.get_mirrored_value(), val_en_glb , + sts_glb.get_mirrored_value(), val_sts_glb), + UVM_MEDIUM) + end + else if (/*val_sts_glb*/sts_glb.get_mirrored_value() && !(|(val_sts_reg/*sts_reg.get_mirrored_value()*/ & val_en_reg/*en_reg.get_mirrored_value()*/) /*&& val_en_glb / * en_glb.get_mirrored_value()*/)) begin + sts_glb.predict(1'b0); + `uvm_info("SOC_IFC_REG_DELAY_JOB", + $sformatf("post_predict called through map [%p] on %s results in interrupt status bit being cleared to 0x%0x. Values: en_reg(latched) [0x%0x(0x%0x)] sts_reg [0x%0x(0x%0x)] en_glb [0x%0x(0x%0x)] sts_glb [0x%0x(0x%0x)]", + map.get_name(), req_fld.get_full_name(), sts_glb.get_mirrored_value(), + en_reg.get_mirrored_value(), val_en_reg , + sts_reg.get_mirrored_value(), val_sts_reg, + en_glb.get_mirrored_value(), val_en_glb , + sts_glb.get_mirrored_value(), val_sts_glb), + UVM_MEDIUM) + end + else begin + `uvm_info("SOC_IFC_REG_DELAY_JOB", + $sformatf("Delay job for %s does not predict any changes due to: en_reg(latched) [0x%0x(0x%0x)] sts_reg [0x%0x(0x%0x)] en_glb [0x%0x(0x%0x)] sts_glb [0x%0x(0x%0x)]", + req_fld.get_full_name(), + en_reg.get_mirrored_value(), val_en_reg , + sts_reg.get_mirrored_value(), val_sts_reg, + en_glb.get_mirrored_value(), val_en_glb , + sts_glb.get_mirrored_value(), val_sts_glb), + UVM_HIGH) + end + endtask +endclass + + diff --git a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/registers/soc_ifc_reg_delay_job_mbox_csr_mbox_prot_error.svh b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/registers/soc_ifc_reg_delay_job_mbox_csr_mbox_prot_error.svh new file mode 100644 index 000000000..bd57d181e --- /dev/null +++ b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/registers/soc_ifc_reg_delay_job_mbox_csr_mbox_prot_error.svh @@ -0,0 +1,63 @@ +//---------------------------------------------------------------------- +// SPDX-License-Identifier: Apache-2.0 +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +//---------------------------------------------------------------------- + +// Reg predictions that will be scheduled on any invalid access to trigger errors +class soc_ifc_reg_delay_job_mbox_csr_mbox_prot_error extends soc_ifc_reg_delay_job; + `uvm_object_utils( soc_ifc_reg_delay_job_mbox_csr_mbox_prot_error ) + mbox_csr_ext rm; /* mbox_csr_rm */ + uvm_reg_field fld; + mbox_fsm_state_e state_nxt; + uvm_reg_map map; + mbox_protocol_error_t error = '{default: 1'b0}; + virtual task do_job(); + if (fld == null || map == null || rm == null) + `uvm_fatal("SOC_IFC_REG_DELAY_JOB", "Missing handle for fld, map, or rm") + + `uvm_info("SOC_IFC_REG_DELAY_JOB", "Running delayed job for mbox_csr due to detected protocol error", UVM_HIGH) + if (error.axs_without_lock && (rm.mbox_lock.lock.get_mirrored_value() || !rm.mbox_fn_state_sigs.mbox_idle)) begin + `uvm_fatal("SOC_IFC_REG_DELAY_JOB", "no_lock mbox error while mbox is locked or not-idle! This shouldn't happen and I haven't thought of how to deal with this yet! FIXME!") + end + else if (error.axs_without_lock) begin + uvm_reg_block top; + uvm_reg_field intr_fld; + uvm_reg_field non_fatal_fld; + + top = rm.get_parent(); + intr_fld = top.get_block_by_name("soc_ifc_reg_rm").get_block_by_name("intr_block_rf_ext").get_field_by_name("error_cmd_fail_sts"); + non_fatal_fld = top.get_block_by_name("soc_ifc_reg_rm").get_reg_by_name("CPTRA_HW_ERROR_NON_FATAL").get_field_by_name("mbox_prot_no_lock"); + + intr_fld .predict(1'b1, .kind(UVM_PREDICT_READ), .path(UVM_PREDICT), .map(map.get_parent().get_map_by_name("soc_ifc_AHB_map"))); + non_fatal_fld.predict(1'b1, .kind(UVM_PREDICT_READ), .path(UVM_PREDICT), .map(map)); + + `uvm_info("SOC_IFC_REG_DELAY_JOB", $sformatf("delay_job scheduled for access through map [%p] on [%s] results in Access Without Lock Error, and no state change. Functional state tracker: [%p] mbox_fsm_ps transition (ignored) [%p]", map.get_name(), fld.get_full_name(), rm.mbox_fn_state_sigs, state_nxt), UVM_FULL) + end + else if (error.axs_incorrect_order && rm.mbox_lock.lock.get_mirrored_value() && !rm.mbox_unlock.unlock.get_mirrored_value()) begin + uvm_reg_block top; + uvm_reg_field intr_fld; + uvm_reg_field non_fatal_fld; + + top = rm.get_parent(); + intr_fld = top.get_block_by_name("soc_ifc_reg_rm").get_block_by_name("intr_block_rf_ext").get_field_by_name("error_cmd_fail_sts"); + non_fatal_fld = top.get_block_by_name("soc_ifc_reg_rm").get_reg_by_name("CPTRA_HW_ERROR_NON_FATAL").get_field_by_name("mbox_prot_ooo"); + + intr_fld .predict(1'b1, .kind(UVM_PREDICT_READ), .path(UVM_PREDICT), .map(map.get_parent().get_map_by_name("soc_ifc_AHB_map"))); + non_fatal_fld.predict(1'b1, .kind(UVM_PREDICT_READ), .path(UVM_PREDICT), .map(map)); + + rm.mbox_status.mbox_fsm_ps.predict(state_nxt, .kind(UVM_PREDICT_READ), .path(UVM_PREDICT), .map(map)); + `uvm_info("SOC_IFC_REG_DELAY_JOB", $sformatf("delay_job scheduled for access through map [%p] on [%s] results in state transition. Functional state tracker: [%p] mbox_fsm_ps transition [%p]", map.get_name(), fld.get_full_name(), rm.mbox_fn_state_sigs, state_nxt), UVM_FULL) + end + endtask +endclass diff --git a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/registers/soc_ifc_reg_model_top_pkg.sv b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/registers/soc_ifc_reg_model_top_pkg.sv index 57f4ef900..ed868206a 100644 --- a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/registers/soc_ifc_reg_model_top_pkg.sv +++ b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/registers/soc_ifc_reg_model_top_pkg.sv @@ -49,14 +49,27 @@ package soc_ifc_reg_model_top_pkg; apb5_master_0_params::APB3_PWDATA_BIT_WIDTH, apb5_master_0_params::APB3_PRDATA_BIT_WIDTH) apb_reg_adapter_t; + typedef struct packed { + bit boot_idle; + bit boot_fuse; + bit boot_fw_rst; + bit boot_wait; + bit boot_done; + } boot_fn_state_s; + typedef struct packed { bit mbox_idle; - bit uc_send_stage; + bit uc_cmd_stage; + bit uc_dlen_stage; + bit uc_data_stage; bit uc_receive_stage; bit uc_done_stage; - bit soc_send_stage; + bit soc_cmd_stage; + bit soc_dlen_stage; + bit soc_data_stage; bit soc_receive_stage; bit soc_done_stage; + bit mbox_error; } mbox_fn_state_s; // pragma uvmf custom additional_imports end @@ -65,50 +78,120 @@ package soc_ifc_reg_model_top_pkg; /* DEFINE REGISTER CLASSES */ // pragma uvmf custom define_register_classes begin + + // These macros are used to copy the "HARD" reset value to a new reset type, "NONCORE", + // and then track the configuration of the provided register. + // When called, these macros expect that a queue has already been created called "blk_flds". + // The queue tracks all extant registers within the enclosing uvm_reg_block. + // This macro removes from that queue the uvm_reg_field that was provided as an arguement. + // This allows the calling context to check that the queue of blk_flds is empty at the end, + // and thus enforce that a custom reset configuration is defined for all register fields. + // The "NO_CP" macros do not create a "NONCORE" reset type (e.g for regs on pwrgood domain) + // but they still remove the field from the check to confirm that a reset + // configuration has been assigned. + `define FLD_DO_CP_NONCORE_RST(fld_h) begin \ + if (fld_h.has_reset("HARD")) \ + fld_h.set_reset(fld_h.get_reset("HARD"), "NONCORE"); \ + end + `define REG____CP_NONCORE_RST(reg_h) begin \ + uvm_reg_field reg_flds[$]; \ + reg_h.get_fields(reg_flds); \ + foreach (reg_flds[ii]) begin \ + int del_idx[$]; \ + `FLD_DO_CP_NONCORE_RST(reg_flds[ii]) \ + del_idx = blk_flds.find_first_index(fl) with (fl == reg_flds[ii]); \ + blk_flds.delete(del_idx.pop_front()); \ + end \ + end + `define REG_NO_CP_NONCORE_RST(reg_h) begin \ + uvm_reg_field reg_flds[$]; \ + reg_h.get_fields(reg_flds); \ + foreach (reg_flds[ii]) begin \ + int del_idx[$]; \ + del_idx = blk_flds.find_first_index(fl) with (fl == reg_flds[ii]); \ + blk_flds.delete(del_idx.pop_front()); \ + end \ + end + `define FLD____CP_NONCORE_RST(fld_h) begin \ + int del_idx[$]; \ + `FLD_DO_CP_NONCORE_RST(fld_h) \ + del_idx = blk_flds.find_first_index(fl) with (fl == fld_h); \ + blk_flds.delete(del_idx.pop_front()); \ + end + `define FLD_NO_CP_NONCORE_RST(fld_h) begin \ + int del_idx[$]; \ + del_idx = blk_flds.find_first_index(fl) with (fl == fld_h); \ + blk_flds.delete(del_idx.pop_front()); \ + end + // ------------------ END of reset config macros ------------------ // + class soc_ifc_reg__intr_block_t_ext extends soc_ifc_reg__intr_block_t; uvm_reg_map soc_ifc_reg_intr_AHB_map; uvm_reg_map soc_ifc_reg_intr_APB_map; + // HWSET has precedence over SW W1C, so use these variables to track + // active hwset activity in case contention must be resolved + bit [31:0] notif_internal_intr_r_hwset_active = 0; + bit [31:0] error_internal_intr_r_hwset_active = 0; + function new(string name = "soc_ifc_reg__intr_block_t_ext"); super.new(name); endfunction : new // FIXME Manually maintaining a list here of registers that are configured // as soft-resettable (i.e. cptra_rst_b instead of cptra_pwrgood) + // or noncore-resettable (i.e. cptra_noncore_rst_b instead of cptra_pwrgood) // Ideally would be auto-generated. - virtual function void set_soft_reset_values(); - if ( this.global_intr_en_r .has_reset("HARD" )) this.global_intr_en_r .set_reset(this.global_intr_en_r .get_reset("HARD"), "SOFT"); - if ( this.error_intr_en_r .has_reset("HARD" )) this.error_intr_en_r .set_reset(this.error_intr_en_r .get_reset("HARD"), "SOFT"); - if ( this.notif_intr_en_r .has_reset("HARD" )) this.notif_intr_en_r .set_reset(this.notif_intr_en_r .get_reset("HARD"), "SOFT"); - if ( this.error_global_intr_r .has_reset("HARD" )) this.error_global_intr_r .set_reset(this.error_global_intr_r .get_reset("HARD"), "SOFT"); - if ( this.notif_global_intr_r .has_reset("HARD" )) this.notif_global_intr_r .set_reset(this.notif_global_intr_r .get_reset("HARD"), "SOFT"); -// this.error_internal_intr_r .set_reset(this.error_internal_intr_r .get_reset("HARD"), "SOFT"); - if ( this.notif_internal_intr_r .has_reset("HARD" )) this.notif_internal_intr_r .set_reset(this.notif_internal_intr_r .get_reset("HARD"), "SOFT"); - if ( this.error_intr_trig_r .has_reset("HARD" )) this.error_intr_trig_r .set_reset(this.error_intr_trig_r .get_reset("HARD"), "SOFT"); - if ( this.notif_intr_trig_r .has_reset("HARD" )) this.notif_intr_trig_r .set_reset(this.notif_intr_trig_r .get_reset("HARD"), "SOFT"); -// if ( this.error_internal_intr_count_r .has_reset("HARD" )) this.error_internal_intr_count_r .set_reset(this.error_internal_intr_count_r .get_reset("HARD"), "SOFT"); -// if ( this.error_inv_dev_intr_count_r .has_reset("HARD" )) this.error_inv_dev_intr_count_r .set_reset(this.error_inv_dev_intr_count_r .get_reset("HARD"), "SOFT"); -// if ( this.error_cmd_fail_intr_count_r .has_reset("HARD" )) this.error_cmd_fail_intr_count_r .set_reset(this.error_cmd_fail_intr_count_r .get_reset("HARD"), "SOFT"); -// if ( this.error_bad_fuse_intr_count_r .has_reset("HARD" )) this.error_bad_fuse_intr_count_r .set_reset(this.error_bad_fuse_intr_count_r .get_reset("HARD"), "SOFT"); -// if ( this.error_iccm_blocked_intr_count_r .has_reset("HARD" )) this.error_iccm_blocked_intr_count_r .set_reset(this.error_iccm_blocked_intr_count_r .get_reset("HARD"), "SOFT"); -// if ( this.error_mbox_ecc_unc_intr_count_r .has_reset("HARD" )) this.error_mbox_ecc_unc_intr_count_r .set_reset(this.error_mbox_ecc_unc_intr_count_r .get_reset("HARD"), "SOFT"); - if ( this.notif_cmd_avail_intr_count_r .has_reset("HARD" )) this.notif_cmd_avail_intr_count_r .set_reset(this.notif_cmd_avail_intr_count_r .get_reset("HARD"), "SOFT"); - if ( this.notif_mbox_ecc_cor_intr_count_r .has_reset("HARD" )) this.notif_mbox_ecc_cor_intr_count_r .set_reset(this.notif_mbox_ecc_cor_intr_count_r .get_reset("HARD"), "SOFT"); - if ( this.notif_debug_locked_intr_count_r .has_reset("HARD" )) this.notif_debug_locked_intr_count_r .set_reset(this.notif_debug_locked_intr_count_r .get_reset("HARD"), "SOFT"); - if ( this.error_internal_intr_count_incr_r .has_reset("HARD" )) this.error_internal_intr_count_incr_r .set_reset(this.error_internal_intr_count_incr_r .get_reset("HARD"), "SOFT"); - if ( this.error_inv_dev_intr_count_incr_r .has_reset("HARD" )) this.error_inv_dev_intr_count_incr_r .set_reset(this.error_inv_dev_intr_count_incr_r .get_reset("HARD"), "SOFT"); - if ( this.error_cmd_fail_intr_count_incr_r .has_reset("HARD" )) this.error_cmd_fail_intr_count_incr_r .set_reset(this.error_cmd_fail_intr_count_incr_r .get_reset("HARD"), "SOFT"); - if ( this.error_bad_fuse_intr_count_incr_r .has_reset("HARD" )) this.error_bad_fuse_intr_count_incr_r .set_reset(this.error_bad_fuse_intr_count_incr_r .get_reset("HARD"), "SOFT"); - if ( this.error_iccm_blocked_intr_count_incr_r .has_reset("HARD" )) this.error_iccm_blocked_intr_count_incr_r .set_reset(this.error_iccm_blocked_intr_count_incr_r.get_reset("HARD"), "SOFT"); - if ( this.error_mbox_ecc_unc_intr_count_incr_r .has_reset("HARD" )) this.error_mbox_ecc_unc_intr_count_incr_r .set_reset(this.error_mbox_ecc_unc_intr_count_incr_r.get_reset("HARD"), "SOFT"); - if ( this.notif_cmd_avail_intr_count_incr_r .has_reset("HARD" )) this.notif_cmd_avail_intr_count_incr_r .set_reset(this.notif_cmd_avail_intr_count_incr_r .get_reset("HARD"), "SOFT"); - if ( this.notif_mbox_ecc_cor_intr_count_incr_r .has_reset("HARD" )) this.notif_mbox_ecc_cor_intr_count_incr_r .set_reset(this.notif_mbox_ecc_cor_intr_count_incr_r.get_reset("HARD"), "SOFT"); - if ( this.notif_debug_locked_intr_count_incr_r .has_reset("HARD" )) this.notif_debug_locked_intr_count_incr_r .set_reset(this.notif_debug_locked_intr_count_incr_r.get_reset("HARD"), "SOFT"); + virtual function void configure_reset_values(); + // Track reset configuration against a queue of all registers in this block, to ensure each register is handled + uvm_reg_field blk_flds[$]; + get_fields(blk_flds, UVM_NO_HIER); + `REG____CP_NONCORE_RST(this.global_intr_en_r ) + `REG____CP_NONCORE_RST(this.error_intr_en_r ) + `REG____CP_NONCORE_RST(this.notif_intr_en_r ) + `REG____CP_NONCORE_RST(this.error_global_intr_r ) + `REG____CP_NONCORE_RST(this.notif_global_intr_r ) + `REG_NO_CP_NONCORE_RST(this.error_internal_intr_r ) + `REG____CP_NONCORE_RST(this.notif_internal_intr_r ) + `REG____CP_NONCORE_RST(this.error_intr_trig_r ) + `REG____CP_NONCORE_RST(this.notif_intr_trig_r ) + `REG_NO_CP_NONCORE_RST(this.error_internal_intr_count_r ) + `REG_NO_CP_NONCORE_RST(this.error_inv_dev_intr_count_r ) + `REG_NO_CP_NONCORE_RST(this.error_cmd_fail_intr_count_r ) + `REG_NO_CP_NONCORE_RST(this.error_bad_fuse_intr_count_r ) + `REG_NO_CP_NONCORE_RST(this.error_iccm_blocked_intr_count_r ) + `REG_NO_CP_NONCORE_RST(this.error_mbox_ecc_unc_intr_count_r ) + `REG_NO_CP_NONCORE_RST(this.error_wdt_timer1_timeout_intr_count_r ) + `REG_NO_CP_NONCORE_RST(this.error_wdt_timer2_timeout_intr_count_r ) + `REG____CP_NONCORE_RST(this.notif_cmd_avail_intr_count_r ) + `REG____CP_NONCORE_RST(this.notif_mbox_ecc_cor_intr_count_r ) + `REG____CP_NONCORE_RST(this.notif_debug_locked_intr_count_r ) + `REG____CP_NONCORE_RST(this.notif_scan_mode_intr_count_r ) + `REG____CP_NONCORE_RST(this.notif_soc_req_lock_intr_count_r ) + `REG____CP_NONCORE_RST(this.notif_gen_in_toggle_intr_count_r ) + `REG____CP_NONCORE_RST(this.error_internal_intr_count_incr_r ) + `REG____CP_NONCORE_RST(this.error_inv_dev_intr_count_incr_r ) + `REG____CP_NONCORE_RST(this.error_cmd_fail_intr_count_incr_r ) + `REG____CP_NONCORE_RST(this.error_bad_fuse_intr_count_incr_r ) + `REG____CP_NONCORE_RST(this.error_iccm_blocked_intr_count_incr_r ) + `REG____CP_NONCORE_RST(this.error_mbox_ecc_unc_intr_count_incr_r ) + `REG____CP_NONCORE_RST(this.error_wdt_timer1_timeout_intr_count_incr_r ) + `REG____CP_NONCORE_RST(this.error_wdt_timer2_timeout_intr_count_incr_r ) + `REG____CP_NONCORE_RST(this.notif_cmd_avail_intr_count_incr_r ) + `REG____CP_NONCORE_RST(this.notif_mbox_ecc_cor_intr_count_incr_r ) + `REG____CP_NONCORE_RST(this.notif_debug_locked_intr_count_incr_r ) + `REG____CP_NONCORE_RST(this.notif_scan_mode_intr_count_incr_r ) + `REG____CP_NONCORE_RST(this.notif_soc_req_lock_intr_count_incr_r ) + `REG____CP_NONCORE_RST(this.notif_gen_in_toggle_intr_count_incr_r ) + while (blk_flds.size() != 0) begin + uvm_reg_field cur_fld = blk_flds.pop_front(); + `uvm_error("SOC_IFC_REG__INTR_BLOCK_T_EXT", {"No extended reset configuration defined for ", cur_fld.get_full_name()}) + end endfunction virtual function void build(); super.build(); - this.set_soft_reset_values(); + this.configure_reset_values(); this.soc_ifc_reg_intr_AHB_map = create_map("intr_AHB_reg_map", 0, 4, UVM_LITTLE_ENDIAN); this.soc_ifc_reg_intr_APB_map = create_map("intr_APB_reg_map", 0, 4, UVM_LITTLE_ENDIAN); endfunction @@ -141,93 +224,113 @@ package soc_ifc_reg_model_top_pkg; // should never be used in practice rand soc_ifc_reg__intr_block_t_ext intr_block_rf_ext; + // Tracks functional state of Boot FSM internally, without reference to + // the value read from CPTRA_FLOW_STATUS + boot_fn_state_s boot_fn_state_sigs; + + extern virtual function void reset(string kind = "HARD"); function new(string name = "soc_ifc_reg_ext"); super.new(name); + boot_fn_state_sigs = '{boot_idle: 1'b1, default: 1'b0}; endfunction : new // FIXME Manually maintaining a list here of registers that are configured // as soft-resettable (i.e. cptra_rst_b instead of cptra_pwrgood) + // or noncore-resettable (i.e. cptra_noncore_rst_b instead of cptra_pwrgood) // Ideally would be auto-generated. - virtual function void set_soft_reset_values(); - byte ii; -// this.CPTRA_HW_ERROR_FATAL. set_reset(this.CPTRA_HW_ERROR_FATAL. get_reset("HARD"), "SOFT"); -// this.CPTRA_HW_ERROR_NON_FATAL. set_reset(this.CPTRA_HW_ERROR_NON_FATAL. get_reset("HARD"), "SOFT"); -// this.CPTRA_FW_ERROR_FATAL. set_reset(this.CPTRA_FW_ERROR_FATAL. get_reset("HARD"), "SOFT"); -// this.CPTRA_FW_ERROR_NON_FATAL. set_reset(this.CPTRA_FW_ERROR_NON_FATAL. get_reset("HARD"), "SOFT"); -// this.CPTRA_HW_ERROR_ENC. set_reset(this.CPTRA_HW_ERROR_ENC. get_reset("HARD"), "SOFT"); -// this.CPTRA_FW_ERROR_ENC. set_reset(this.CPTRA_FW_ERROR_ENC. get_reset("HARD"), "SOFT"); -// this.CPTRA_FW_EXTENDED_ERROR_INFO[8]. set_reset(this.CPTRA_FW_EXTENDED_ERROR_INFO[8]. get_reset("HARD"), "SOFT"); - if ( this.CPTRA_BOOT_STATUS. has_reset("HARD" )) this.CPTRA_BOOT_STATUS. set_reset(this.CPTRA_BOOT_STATUS. get_reset("HARD"), "SOFT"); - if ( this.CPTRA_FLOW_STATUS.status. has_reset("HARD" )) this.CPTRA_FLOW_STATUS.status. set_reset(this.CPTRA_FLOW_STATUS.status. get_reset("HARD"), "SOFT"); - if ( this.CPTRA_FLOW_STATUS.ready_for_fw. has_reset("HARD" )) this.CPTRA_FLOW_STATUS.ready_for_fw. set_reset(this.CPTRA_FLOW_STATUS.ready_for_fw. get_reset("HARD"), "SOFT"); - if ( this.CPTRA_FLOW_STATUS.ready_for_runtime. has_reset("HARD" )) this.CPTRA_FLOW_STATUS.ready_for_runtime. set_reset(this.CPTRA_FLOW_STATUS.ready_for_runtime. get_reset("HARD"), "SOFT"); - if ( this.CPTRA_FLOW_STATUS.ready_for_fuses. has_reset("HARD" )) this.CPTRA_FLOW_STATUS.ready_for_fuses. set_reset(this.CPTRA_FLOW_STATUS.ready_for_fuses. get_reset("HARD"), "SOFT"); - if ( this.CPTRA_FLOW_STATUS.mailbox_flow_done. has_reset("HARD" )) this.CPTRA_FLOW_STATUS.mailbox_flow_done. set_reset(this.CPTRA_FLOW_STATUS.mailbox_flow_done. get_reset("HARD"), "SOFT"); - if ( this.CPTRA_RESET_REASON.FW_UPD_RESET. has_reset("HARD" )) this.CPTRA_RESET_REASON.FW_UPD_RESET. set_reset(this.CPTRA_RESET_REASON.FW_UPD_RESET. get_reset("HARD"), "SOFT"); -// this.CPTRA_RESET_REASON.WARM_RESET. set_reset(this.CPTRA_RESET_REASON.WARM_RESET. get_reset("HARD"), "SOFT"); - if ( this.CPTRA_SECURITY_STATE.device_lifecycle.has_reset("HARD" )) this.CPTRA_SECURITY_STATE.device_lifecycle.set_reset(this.CPTRA_SECURITY_STATE.device_lifecycle.get_reset("HARD"), "SOFT"); - if ( this.CPTRA_SECURITY_STATE.debug_locked. has_reset("HARD" )) this.CPTRA_SECURITY_STATE.debug_locked. set_reset(this.CPTRA_SECURITY_STATE.debug_locked. get_reset("HARD"), "SOFT"); - if ( this.CPTRA_SECURITY_STATE.scan_mode. has_reset("HARD" )) this.CPTRA_SECURITY_STATE.scan_mode. set_reset(this.CPTRA_SECURITY_STATE.scan_mode. get_reset("HARD"), "SOFT"); - if ( this.CPTRA_SECURITY_STATE.rsvd. has_reset("HARD" )) this.CPTRA_SECURITY_STATE.rsvd. set_reset(this.CPTRA_SECURITY_STATE.rsvd. get_reset("HARD"), "SOFT"); - for (ii=0; ii<$size(this.CPTRA_MBOX_VALID_PAUSER); ii++) begin - if ( this.CPTRA_MBOX_VALID_PAUSER[ii]. has_reset("HARD" )) this.CPTRA_MBOX_VALID_PAUSER[ii]. set_reset(this.CPTRA_MBOX_VALID_PAUSER[ii]. get_reset("HARD"), "SOFT"); - if ( this.CPTRA_MBOX_PAUSER_LOCK[ii]. has_reset("HARD" )) this.CPTRA_MBOX_PAUSER_LOCK[ii]. set_reset(this.CPTRA_MBOX_PAUSER_LOCK[ii]. get_reset("HARD"), "SOFT"); - end - if ( this.CPTRA_TRNG_VALID_PAUSER. has_reset("HARD" )) this.CPTRA_TRNG_VALID_PAUSER. set_reset(this.CPTRA_TRNG_VALID_PAUSER. get_reset("HARD"), "SOFT"); - if ( this.CPTRA_TRNG_PAUSER_LOCK. has_reset("HARD" )) this.CPTRA_TRNG_PAUSER_LOCK. set_reset(this.CPTRA_TRNG_PAUSER_LOCK. get_reset("HARD"), "SOFT"); - for (ii=0; ii<$size(this.CPTRA_TRNG_DATA); ii++) begin - if ( this.CPTRA_TRNG_DATA[ii]. has_reset("HARD" )) this.CPTRA_TRNG_DATA[ii]. set_reset(this.CPTRA_TRNG_DATA[ii]. get_reset("HARD"), "SOFT"); + virtual function void configure_reset_values(); + // Track reset configuration against a queue of all fields in this block, to ensure each register is handled + uvm_reg_field blk_flds[$]; + get_fields(blk_flds, UVM_NO_HIER); + `REG_NO_CP_NONCORE_RST(this.CPTRA_HW_ERROR_FATAL ) + `REG_NO_CP_NONCORE_RST(this.CPTRA_HW_ERROR_NON_FATAL ) + `REG_NO_CP_NONCORE_RST(this.CPTRA_FW_ERROR_FATAL ) + `REG_NO_CP_NONCORE_RST(this.CPTRA_FW_ERROR_NON_FATAL ) + `REG_NO_CP_NONCORE_RST(this.CPTRA_HW_ERROR_ENC ) + `REG_NO_CP_NONCORE_RST(this.CPTRA_FW_ERROR_ENC ) + foreach(this.CPTRA_FW_EXTENDED_ERROR_INFO[ii]) `REG_NO_CP_NONCORE_RST(this.CPTRA_FW_EXTENDED_ERROR_INFO[ii] ) + `REG____CP_NONCORE_RST(this.CPTRA_BOOT_STATUS ) + `FLD____CP_NONCORE_RST(this.CPTRA_FLOW_STATUS.status ) + `FLD____CP_NONCORE_RST(this.CPTRA_FLOW_STATUS.idevid_csr_ready ) + `FLD____CP_NONCORE_RST(this.CPTRA_FLOW_STATUS.boot_fsm_ps ) + `FLD____CP_NONCORE_RST(this.CPTRA_FLOW_STATUS.ready_for_fw ) + `FLD____CP_NONCORE_RST(this.CPTRA_FLOW_STATUS.ready_for_runtime ) + `FLD____CP_NONCORE_RST(this.CPTRA_FLOW_STATUS.ready_for_fuses ) + `FLD____CP_NONCORE_RST(this.CPTRA_FLOW_STATUS.mailbox_flow_done ) + `FLD____CP_NONCORE_RST(this.CPTRA_RESET_REASON.FW_UPD_RESET ) + `FLD_NO_CP_NONCORE_RST(this.CPTRA_RESET_REASON.WARM_RESET ) + `FLD____CP_NONCORE_RST(this.CPTRA_SECURITY_STATE.device_lifecycle) + `FLD____CP_NONCORE_RST(this.CPTRA_SECURITY_STATE.debug_locked ) + `FLD____CP_NONCORE_RST(this.CPTRA_SECURITY_STATE.scan_mode ) + `FLD____CP_NONCORE_RST(this.CPTRA_SECURITY_STATE.rsvd ) + foreach(this.CPTRA_MBOX_VALID_PAUSER[ii]) `REG____CP_NONCORE_RST(this.CPTRA_MBOX_VALID_PAUSER[ii] ) + foreach(this.CPTRA_MBOX_PAUSER_LOCK[ii]) `REG____CP_NONCORE_RST(this.CPTRA_MBOX_PAUSER_LOCK[ii] ) + `REG____CP_NONCORE_RST(this.CPTRA_TRNG_VALID_PAUSER ) + `REG____CP_NONCORE_RST(this.CPTRA_TRNG_PAUSER_LOCK ) + foreach(this.CPTRA_TRNG_DATA[ii]) `REG____CP_NONCORE_RST(this.CPTRA_TRNG_DATA[ii] ) + `FLD____CP_NONCORE_RST(this.CPTRA_TRNG_CTRL.clear ) + `FLD____CP_NONCORE_RST(this.CPTRA_TRNG_STATUS.DATA_REQ ) + `FLD____CP_NONCORE_RST(this.CPTRA_TRNG_STATUS.DATA_WR_DONE ) + `REG_NO_CP_NONCORE_RST(this.CPTRA_FUSE_WR_DONE ) + `REG_NO_CP_NONCORE_RST(this.CPTRA_TIMER_CONFIG ) + `REG____CP_NONCORE_RST(this.CPTRA_BOOTFSM_GO ) + `REG____CP_NONCORE_RST(this.CPTRA_DBG_MANUF_SERVICE_REG ) + `REG____CP_NONCORE_RST(this.CPTRA_CLK_GATING_EN ) + foreach(this.CPTRA_GENERIC_INPUT_WIRES[ii]) `REG____CP_NONCORE_RST(this.CPTRA_GENERIC_INPUT_WIRES[ii] ) + foreach(this.CPTRA_GENERIC_OUTPUT_WIRES[ii]) `REG____CP_NONCORE_RST(this.CPTRA_GENERIC_OUTPUT_WIRES[ii] ) + `FLD____CP_NONCORE_RST(this.CPTRA_HW_REV_ID.CPTRA_GENERATION ) + `FLD____CP_NONCORE_RST(this.CPTRA_HW_REV_ID.SOC_STEPPING_ID ) + foreach(this.CPTRA_FW_REV_ID[ii]) `REG____CP_NONCORE_RST(this.CPTRA_FW_REV_ID[ii] ) + `REG____CP_NONCORE_RST(this.CPTRA_HW_CONFIG ) + `REG____CP_NONCORE_RST(this.CPTRA_WDT_TIMER1_EN ) + `REG____CP_NONCORE_RST(this.CPTRA_WDT_TIMER1_CTRL ) + foreach(this.CPTRA_WDT_TIMER1_TIMEOUT_PERIOD[ii]) `REG____CP_NONCORE_RST(this.CPTRA_WDT_TIMER1_TIMEOUT_PERIOD[ii] ) + `REG____CP_NONCORE_RST(this.CPTRA_WDT_TIMER2_EN ) + `REG____CP_NONCORE_RST(this.CPTRA_WDT_TIMER2_CTRL ) + foreach(this.CPTRA_WDT_TIMER2_TIMEOUT_PERIOD[ii]) `REG____CP_NONCORE_RST(this.CPTRA_WDT_TIMER2_TIMEOUT_PERIOD[ii] ) + `REG____CP_NONCORE_RST(this.CPTRA_WDT_STATUS ) + `REG_NO_CP_NONCORE_RST(this.CPTRA_FUSE_VALID_PAUSER ) + `REG_NO_CP_NONCORE_RST(this.CPTRA_FUSE_PAUSER_LOCK ) + foreach(this.CPTRA_WDT_CFG[ii]) `REG_NO_CP_NONCORE_RST(this.CPTRA_WDT_CFG[ii] ) + `REG____CP_NONCORE_RST(this.CPTRA_iTRNG_ENTROPY_CONFIG_0 ) + `REG____CP_NONCORE_RST(this.CPTRA_iTRNG_ENTROPY_CONFIG_1 ) + foreach(this.CPTRA_RSVD_REG[ii]) `REG____CP_NONCORE_RST(this.CPTRA_RSVD_REG[ii] ) + foreach(this.fuse_uds_seed[ii]) `REG_NO_CP_NONCORE_RST(this.fuse_uds_seed[ii] ) + foreach(this.fuse_field_entropy[ii]) `REG_NO_CP_NONCORE_RST(this.fuse_field_entropy[ii] ) + foreach(this.fuse_key_manifest_pk_hash[ii]) `REG_NO_CP_NONCORE_RST(this.fuse_key_manifest_pk_hash[ii] ) + `REG_NO_CP_NONCORE_RST(this.fuse_key_manifest_pk_hash_mask ) + foreach(this.fuse_owner_pk_hash[ii]) `REG_NO_CP_NONCORE_RST(this.fuse_owner_pk_hash[ii] ) + `REG_NO_CP_NONCORE_RST(this.fuse_fmc_key_manifest_svn ) + foreach(this.fuse_runtime_svn[ii]) `REG_NO_CP_NONCORE_RST(this.fuse_runtime_svn[ii] ) + `REG_NO_CP_NONCORE_RST(this.fuse_anti_rollback_disable ) + foreach(this.fuse_idevid_cert_attr[ii]) `REG_NO_CP_NONCORE_RST(this.fuse_idevid_cert_attr[ii] ) + foreach(this.fuse_idevid_manuf_hsm_id[ii]) `REG_NO_CP_NONCORE_RST(this.fuse_idevid_manuf_hsm_id[ii] ) + `REG_NO_CP_NONCORE_RST(this.fuse_life_cycle ) + `REG_NO_CP_NONCORE_RST(this.fuse_lms_verify ) + `REG_NO_CP_NONCORE_RST(this.fuse_lms_revocation ) + `REG_NO_CP_NONCORE_RST(this.fuse_soc_stepping_id ) + foreach(this.internal_obf_key[ii]) `REG_NO_CP_NONCORE_RST(this.internal_obf_key[ii] ) + `REG____CP_NONCORE_RST(this.internal_iccm_lock )/* TODO also FW reset */ + `REG____CP_NONCORE_RST(this.internal_fw_update_reset ) + `REG____CP_NONCORE_RST(this.internal_fw_update_reset_wait_cycles ) + `REG____CP_NONCORE_RST(this.internal_nmi_vector ) + `REG____CP_NONCORE_RST(this.internal_hw_error_fatal_mask ) + `REG____CP_NONCORE_RST(this.internal_hw_error_non_fatal_mask ) + `REG____CP_NONCORE_RST(this.internal_fw_error_fatal_mask ) + `REG____CP_NONCORE_RST(this.internal_fw_error_non_fatal_mask ) + `REG_NO_CP_NONCORE_RST(this.internal_rv_mtime_l ) + `REG_NO_CP_NONCORE_RST(this.internal_rv_mtime_h ) + `REG_NO_CP_NONCORE_RST(this.internal_rv_mtimecmp_l ) + `REG_NO_CP_NONCORE_RST(this.internal_rv_mtimecmp_h ) + while (blk_flds.size() != 0) begin + uvm_reg_field cur_fld = blk_flds.pop_front(); + `uvm_error("SOC_IFC_REG_EXT", {"No extended reset configuration defined for ", cur_fld.get_full_name()}) end - if ( this.CPTRA_TRNG_STATUS.DATA_REQ. has_reset("HARD" )) this.CPTRA_TRNG_STATUS.DATA_REQ. set_reset(this.CPTRA_TRNG_STATUS.DATA_REQ. get_reset("HARD"), "SOFT"); - if ( this.CPTRA_TRNG_STATUS.DATA_WR_DONE. has_reset("HARD" )) this.CPTRA_TRNG_STATUS.DATA_WR_DONE. set_reset(this.CPTRA_TRNG_STATUS.DATA_WR_DONE. get_reset("HARD"), "SOFT"); -// this.CPTRA_FUSE_WR_DONE. set_reset(this.CPTRA_FUSE_WR_DONE. get_reset("HARD"), "SOFT"); -// this.CPTRA_TIMER_CONFIG. set_reset(this.CPTRA_TIMER_CONFIG. get_reset("HARD"), "SOFT"); - if ( this.CPTRA_BOOTFSM_GO. has_reset("HARD" )) this.CPTRA_BOOTFSM_GO. set_reset(this.CPTRA_BOOTFSM_GO. get_reset("HARD"), "SOFT"); - if ( this.CPTRA_DBG_MANUF_SERVICE_REG. has_reset("HARD" )) this.CPTRA_DBG_MANUF_SERVICE_REG. set_reset(this.CPTRA_DBG_MANUF_SERVICE_REG. get_reset("HARD"), "SOFT"); - if ( this.CPTRA_CLK_GATING_EN. has_reset("HARD" )) this.CPTRA_CLK_GATING_EN. set_reset(this.CPTRA_CLK_GATING_EN. get_reset("HARD"), "SOFT"); - for (ii=0; ii<$size(this.CPTRA_GENERIC_INPUT_WIRES); ii++) begin - if ( this.CPTRA_GENERIC_INPUT_WIRES[ii]. has_reset("HARD" )) this.CPTRA_GENERIC_INPUT_WIRES[ii]. set_reset(this.CPTRA_GENERIC_INPUT_WIRES[ii]. get_reset("HARD"), "SOFT"); - end - for (ii=0; ii<$size(this.CPTRA_GENERIC_OUTPUT_WIRES); ii++) begin - if ( this.CPTRA_GENERIC_OUTPUT_WIRES[ii]. has_reset("HARD" )) this.CPTRA_GENERIC_OUTPUT_WIRES[ii]. set_reset(this.CPTRA_GENERIC_OUTPUT_WIRES[ii]. get_reset("HARD"), "SOFT"); - end -// for (ii=0; ii<$size(this.fuse_uds_seed); ii++) begin -// if ( this.fuse_uds_seed[ii]. has_reset("HARD" )) this.fuse_uds_seed[ii]. set_reset(this.fuse_uds_seed[ii]. get_reset("HARD"), "SOFT"); -// end -// for (ii=0; ii<$size(this.fuse_field_entropy); ii++) begin -// if ( this.fuse_field_entropy[ii]. has_reset("HARD" )) this.fuse_field_entropy[ii]. set_reset(this.fuse_field_entropy[ii]. get_reset("HARD"), "SOFT"); -// end -// for (ii=0; ii<$size(this.fuse_key_manifest_pk_hash); ii++) begin -// if ( this.fuse_key_manifest_pk_hash[ii]. has_reset("HARD" )) this.fuse_key_manifest_pk_hash[ii]. set_reset(this.fuse_key_manifest_pk_hash[ii]. get_reset("HARD"), "SOFT"); -// end -// if ( this.fuse_key_manifest_pk_hash_mask. has_reset("HARD" )) this.fuse_key_manifest_pk_hash_mask. set_reset(this.fuse_key_manifest_pk_hash_mask. get_reset("HARD"), "SOFT"); -// for (ii=0; ii<$size(this.fuse_owner_pk_hash); ii++) begin -// if ( this.fuse_owner_pk_hash[ii]. has_reset("HARD" )) this.fuse_owner_pk_hash[ii]. set_reset(this.fuse_owner_pk_hash[ii]. get_reset("HARD"), "SOFT"); -// end -// if ( this.fuse_fmc_key_manifest_svn. has_reset("HARD" )) this.fuse_fmc_key_manifest_svn. set_reset(this.fuse_fmc_key_manifest_svn. get_reset("HARD"), "SOFT"); -// for (ii=0; ii<$size(this.fuse_runtime_svn); ii++) begin -// if ( this.fuse_runtime_svn[ii]. has_reset("HARD" )) this.fuse_runtime_svn[ii]. set_reset(this.fuse_runtime_svn[ii]. get_reset("HARD"), "SOFT"); -// end -// if ( this.fuse_anti_rollback_disable. has_reset("HARD" )) this.fuse_anti_rollback_disable. set_reset(this.fuse_anti_rollback_disable. get_reset("HARD"), "SOFT"); -// for (ii=0; ii<$size(this.fuse_idevid_cert_attr); ii++) begin -// if ( this.fuse_idevid_cert_attr[ii]. has_reset("HARD" )) this.fuse_idevid_cert_attr[ii]. set_reset(this.fuse_idevid_cert_attr[ii]. get_reset("HARD"), "SOFT"); -// end -// for (ii=0; ii<$size(this.fuse_idevid_manuf_hsm_id); ii++) begin -// if ( this.fuse_idevid_manuf_hsm_id[ii]. has_reset("HARD" )) this.fuse_idevid_manuf_hsm_id[ii]. set_reset(this.fuse_idevid_manuf_hsm_id[ii]. get_reset("HARD"), "SOFT"); -// end -// if ( this.fuse_life_cycle. has_reset("HARD" )) this.fuse_life_cycle. set_reset(this.fuse_life_cycle. get_reset("HARD"), "SOFT"); -// for (ii=0; ii<$size(this.internal_obf_key); ii++) begin -// if ( this.internal_obf_key[ii]. has_reset("HARD" )) this.internal_obf_key[ii]. set_reset(this.internal_obf_key[ii]. get_reset("HARD"), "SOFT"); /* requires manual prediction based on a set of reset conditions */ -// end - if ( this.internal_iccm_lock. has_reset("HARD" )) this.internal_iccm_lock. set_reset(this.internal_iccm_lock. get_reset("HARD"), "SOFT"); /* TODO also FW reset */ - if ( this.internal_fw_update_reset. has_reset("HARD" )) this.internal_fw_update_reset. set_reset(this.internal_fw_update_reset. get_reset("HARD"), "SOFT"); - if ( this.internal_fw_update_reset_wait_cycles. has_reset("HARD" )) this.internal_fw_update_reset_wait_cycles. set_reset(this.internal_fw_update_reset_wait_cycles. get_reset("HARD"), "SOFT"); - if ( this.internal_nmi_vector. has_reset("HARD" )) this.internal_nmi_vector. set_reset(this.internal_nmi_vector. get_reset("HARD"), "SOFT"); endfunction virtual function void build(); super.build(); - this.set_soft_reset_values(); + this.configure_reset_values(); this.intr_block_rf_ext = new("intr_block_rf_ext"); this.intr_block_rf_ext.configure(this); this.intr_block_rf_ext.build(); // This configures the default_map, which is used to find reg offsets for other maps @@ -266,10 +369,23 @@ package soc_ifc_reg_model_top_pkg; endclass : soc_ifc_reg_ext + function void soc_ifc_reg_ext::reset(string kind = "HARD"); + super.reset(kind); + // BOOT FSM State Changes + // "NONCORE" does not cause a state change - it results FROM state changes + // TODO what to do for FW update? + if (kind inside {"HARD", "SOFT"}) begin + boot_fn_state_sigs = '{boot_idle: 1'b1, default: 1'b0}; + end + endfunction + class mbox_csr_ext extends mbox_csr; uvm_reg_map mbox_csr_AHB_map; uvm_reg_map mbox_csr_APB_map; + uvm_event mbox_lock_clr_miss; + uvm_event mbox_datain_to_dataout_predict; + // This tracks expected functionality of the mailbox in a way that is // agnostic to the internal state machine implementation and strictly // observes the mailbox specification. This is what a more rigorous @@ -285,26 +401,36 @@ package soc_ifc_reg_model_top_pkg; function new(string name = "mbox_csr_ext"); super.new(name); mbox_fn_state_sigs = '{mbox_idle: 1'b1, default: 1'b0}; + mbox_lock_clr_miss = new("mbox_lock_clr_miss"); + mbox_datain_to_dataout_predict = new("mbox_datain_to_dataout_predict"); endfunction : new // FIXME Manually maintaining a list here of registers that are configured // as soft-resettable (i.e. cptra_rst_b instead of cptra_pwrgood) + // or noncore-resettable (i.e. cptra_noncore_rst_b instead of cptra_pwrgood) // Ideally would be auto-generated. - virtual function void set_soft_reset_values(); - if ( this.mbox_lock .has_reset("HARD" )) this.mbox_lock .set_reset(this.mbox_lock .get_reset("HARD"), "SOFT"); - if ( this.mbox_user .has_reset("HARD" )) this.mbox_user .set_reset(this.mbox_user .get_reset("HARD"), "SOFT"); - if ( this.mbox_cmd .has_reset("HARD" )) this.mbox_cmd .set_reset(this.mbox_cmd .get_reset("HARD"), "SOFT"); - if ( this.mbox_dlen .has_reset("HARD" )) this.mbox_dlen .set_reset(this.mbox_dlen .get_reset("HARD"), "SOFT"); - if ( this.mbox_datain .has_reset("HARD" )) this.mbox_datain .set_reset(this.mbox_datain .get_reset("HARD"), "SOFT"); - if ( this.mbox_dataout.has_reset("HARD" )) this.mbox_dataout.set_reset(this.mbox_dataout.get_reset("HARD"), "SOFT"); - if ( this.mbox_execute.has_reset("HARD" )) this.mbox_execute.set_reset(this.mbox_execute.get_reset("HARD"), "SOFT"); - if ( this.mbox_status .has_reset("HARD" )) this.mbox_status .set_reset(this.mbox_status .get_reset("HARD"), "SOFT"); - if ( this.mbox_unlock .has_reset("HARD" )) this.mbox_unlock .set_reset(this.mbox_unlock .get_reset("HARD"), "SOFT"); + virtual function void configure_reset_values(); + // Track reset configuration against a queue of all registers in this block, to ensure each register is handled + uvm_reg_field blk_flds[$]; + get_fields(blk_flds, UVM_NO_HIER); + `REG____CP_NONCORE_RST(this.mbox_lock ) + `REG____CP_NONCORE_RST(this.mbox_user ) + `REG____CP_NONCORE_RST(this.mbox_cmd ) + `REG____CP_NONCORE_RST(this.mbox_dlen ) + `REG____CP_NONCORE_RST(this.mbox_datain ) + `REG____CP_NONCORE_RST(this.mbox_dataout) + `REG____CP_NONCORE_RST(this.mbox_execute) + `REG____CP_NONCORE_RST(this.mbox_status ) + `REG____CP_NONCORE_RST(this.mbox_unlock ) + while (blk_flds.size() != 0) begin + uvm_reg_field cur_fld = blk_flds.pop_front(); + `uvm_error("MBOX_CSR_EXT", {"No extended reset configuration defined for ", cur_fld.get_full_name()}) + end endfunction virtual function void build(); super.build(); - this.set_soft_reset_values(); + this.configure_reset_values(); this.mbox_csr_AHB_map = create_map("AHB_reg_map", 0, 4, UVM_LITTLE_ENDIAN); this.mbox_csr_APB_map = create_map("APB_reg_map", 0, 4, UVM_LITTLE_ENDIAN); endfunction @@ -325,12 +451,19 @@ package soc_ifc_reg_model_top_pkg; function void mbox_csr_ext::reset(string kind = "HARD"); super.reset(kind); - mbox_data_q.delete(); - mbox_resp_q.delete(); - - // Mailbox State Changes - // TODO what to do for FW update? - mbox_fn_state_sigs = '{mbox_idle: 1'b1, default: 1'b0}; + // "SOFT" reset doesn't impact mbox registers until it propagates to the NONCORE reset. + // Since there's a delay, wait until the NONCORE reset is called to clobber data queues and + // reg model internal semaphores + if (kind inside {"HARD", "NONCORE"}) begin + mbox_data_q.delete(); + mbox_resp_q.delete(); + mbox_lock_clr_miss.reset(); + mbox_datain_to_dataout_predict.reset(); + + // Mailbox State Changes + // TODO what to do for FW update? + mbox_fn_state_sigs = '{mbox_idle: 1'b1, default: 1'b0}; + end endfunction @@ -338,38 +471,51 @@ package soc_ifc_reg_model_top_pkg; uvm_reg_map sha512_acc_csr_intr_AHB_map; uvm_reg_map sha512_acc_csr_intr_APB_map; + // HWSET has precedence over SW W1C, so use these variables to track + // active hwset activity in case contention must be resolved + bit [31:0] notif_internal_intr_r_hwset_active = 0; + bit [31:0] error_internal_intr_r_hwset_active = 0; + function new(string name = "sha512_acc_csr__intr_block_t_ext"); super.new(name); endfunction : new // FIXME Manually maintaining a list here of registers that are configured // as soft-resettable (i.e. cptra_rst_b instead of cptra_pwrgood) + // or noncore-resettable (i.e. cptra_noncore_rst_b instead of cptra_pwrgood) // Ideally would be auto-generated. - virtual function void set_soft_reset_values(); - if ( this.global_intr_en_r .has_reset("HARD" )) this.global_intr_en_r .set_reset(this.global_intr_en_r .get_reset("HARD"), "SOFT"); - if ( this.error_intr_en_r .has_reset("HARD" )) this.error_intr_en_r .set_reset(this.error_intr_en_r .get_reset("HARD"), "SOFT"); - if ( this.notif_intr_en_r .has_reset("HARD" )) this.notif_intr_en_r .set_reset(this.notif_intr_en_r .get_reset("HARD"), "SOFT"); - if ( this.error_global_intr_r .has_reset("HARD" )) this.error_global_intr_r .set_reset(this.error_global_intr_r .get_reset("HARD"), "SOFT"); - if ( this.notif_global_intr_r .has_reset("HARD" )) this.notif_global_intr_r .set_reset(this.notif_global_intr_r .get_reset("HARD"), "SOFT"); -// this.error_internal_intr_r .set_reset(this.error_internal_intr_r .get_reset("HARD"), "SOFT"); - if ( this.notif_internal_intr_r .has_reset("HARD" )) this.notif_internal_intr_r .set_reset(this.notif_internal_intr_r .get_reset("HARD"), "SOFT"); - if ( this.error_intr_trig_r .has_reset("HARD" )) this.error_intr_trig_r .set_reset(this.error_intr_trig_r .get_reset("HARD"), "SOFT"); - if ( this.notif_intr_trig_r .has_reset("HARD" )) this.notif_intr_trig_r .set_reset(this.notif_intr_trig_r .get_reset("HARD"), "SOFT"); -// if ( this.error0_intr_count_r .has_reset("HARD" )) this.error0_intr_count_r .set_reset(this.error0_intr_count_r .get_reset("HARD"), "SOFT"); -// if ( this.error1_intr_count_r .has_reset("HARD" )) this.error1_intr_count_r .set_reset(this.error1_intr_count_r .get_reset("HARD"), "SOFT"); -// if ( this.error2_intr_count_r .has_reset("HARD" )) this.error2_intr_count_r .set_reset(this.error2_intr_count_r .get_reset("HARD"), "SOFT"); -// if ( this.error3_intr_count_r .has_reset("HARD" )) this.error3_intr_count_r .set_reset(this.error3_intr_count_r .get_reset("HARD"), "SOFT"); - if ( this.notif_cmd_done_intr_count_r .has_reset("HARD" )) this.notif_cmd_done_intr_count_r .set_reset(this.notif_cmd_done_intr_count_r .get_reset("HARD"), "SOFT"); - if ( this.error0_intr_count_incr_r .has_reset("HARD" )) this.error0_intr_count_incr_r .set_reset(this.error0_intr_count_incr_r .get_reset("HARD"), "SOFT"); - if ( this.error1_intr_count_incr_r .has_reset("HARD" )) this.error1_intr_count_incr_r .set_reset(this.error1_intr_count_incr_r .get_reset("HARD"), "SOFT"); - if ( this.error2_intr_count_incr_r .has_reset("HARD" )) this.error2_intr_count_incr_r .set_reset(this.error2_intr_count_incr_r .get_reset("HARD"), "SOFT"); - if ( this.error3_intr_count_incr_r .has_reset("HARD" )) this.error3_intr_count_incr_r .set_reset(this.error3_intr_count_incr_r .get_reset("HARD"), "SOFT"); - if ( this.notif_cmd_done_intr_count_incr_r .has_reset("HARD" )) this.notif_cmd_done_intr_count_incr_r .set_reset(this.notif_cmd_done_intr_count_incr_r .get_reset("HARD"), "SOFT"); + virtual function void configure_reset_values(); + // Track reset configuration against a queue of all registers in this block, to ensure each register is handled + uvm_reg_field blk_flds[$]; + get_fields(blk_flds, UVM_NO_HIER); + `REG____CP_NONCORE_RST(this.global_intr_en_r ) + `REG____CP_NONCORE_RST(this.error_intr_en_r ) + `REG____CP_NONCORE_RST(this.notif_intr_en_r ) + `REG____CP_NONCORE_RST(this.error_global_intr_r ) + `REG____CP_NONCORE_RST(this.notif_global_intr_r ) + `REG_NO_CP_NONCORE_RST(this.error_internal_intr_r ) + `REG____CP_NONCORE_RST(this.notif_internal_intr_r ) + `REG____CP_NONCORE_RST(this.error_intr_trig_r ) + `REG____CP_NONCORE_RST(this.notif_intr_trig_r ) + `REG_NO_CP_NONCORE_RST(this.error0_intr_count_r ) + `REG_NO_CP_NONCORE_RST(this.error1_intr_count_r ) + `REG_NO_CP_NONCORE_RST(this.error2_intr_count_r ) + `REG_NO_CP_NONCORE_RST(this.error3_intr_count_r ) + `REG____CP_NONCORE_RST(this.notif_cmd_done_intr_count_r ) + `REG____CP_NONCORE_RST(this.error0_intr_count_incr_r ) + `REG____CP_NONCORE_RST(this.error1_intr_count_incr_r ) + `REG____CP_NONCORE_RST(this.error2_intr_count_incr_r ) + `REG____CP_NONCORE_RST(this.error3_intr_count_incr_r ) + `REG____CP_NONCORE_RST(this.notif_cmd_done_intr_count_incr_r ) + while (blk_flds.size() != 0) begin + uvm_reg_field cur_fld = blk_flds.pop_front(); + `uvm_error("SHA512_ACC_CSR__INTR_BLOCK_T_EXT", {"No extended reset configuration defined for ", cur_fld.get_full_name()}) + end endfunction virtual function void build(); super.build(); - this.set_soft_reset_values(); + this.configure_reset_values(); this.sha512_acc_csr_intr_AHB_map = create_map("intr_AHB_reg_map", 0, 4, UVM_LITTLE_ENDIAN); this.sha512_acc_csr_intr_APB_map = create_map("intr_APB_reg_map", 0, 4, UVM_LITTLE_ENDIAN); endfunction @@ -408,26 +554,31 @@ package soc_ifc_reg_model_top_pkg; // FIXME Manually maintaining a list here of registers that are configured // as soft-resettable (i.e. cptra_rst_b instead of cptra_pwrgood) + // or noncore-resettable (i.e. cptra_noncore_rst_b instead of cptra_pwrgood) // Ideally would be auto-generated. - virtual function void set_soft_reset_values(); - byte ii; - if ( this.LOCK .has_reset("HARD" )) this.LOCK .set_reset(this.LOCK .get_reset("HARD"), "SOFT"); - if ( this.USER .has_reset("HARD" )) this.USER .set_reset(this.USER .get_reset("HARD"), "SOFT"); - if ( this.MODE .has_reset("HARD" )) this.MODE .set_reset(this.MODE .get_reset("HARD"), "SOFT"); - if ( this.START_ADDRESS .has_reset("HARD" )) this.START_ADDRESS .set_reset(this.START_ADDRESS .get_reset("HARD"), "SOFT"); - if ( this.DLEN .has_reset("HARD" )) this.DLEN .set_reset(this.DLEN .get_reset("HARD"), "SOFT"); - if ( this.DATAIN .has_reset("HARD" )) this.DATAIN .set_reset(this.DATAIN .get_reset("HARD"), "SOFT"); - if ( this.EXECUTE .has_reset("HARD" )) this.EXECUTE .set_reset(this.EXECUTE .get_reset("HARD"), "SOFT"); - if ( this.STATUS .has_reset("HARD" )) this.STATUS .set_reset(this.STATUS .get_reset("HARD"), "SOFT"); - for (ii=0; ii<$size(this.DIGEST); ii++) begin - if ( this.DIGEST[ii] .has_reset("HARD" )) this.DIGEST[ii] .set_reset(this.DIGEST[ii] .get_reset("HARD"), "SOFT"); + virtual function void configure_reset_values(); + // Track reset configuration against a queue of all fields in this block, to ensure each register is handled + uvm_reg_field blk_flds[$]; + get_fields(blk_flds, UVM_NO_HIER); + `REG____CP_NONCORE_RST(this.LOCK ) + `REG____CP_NONCORE_RST(this.USER ) + `REG____CP_NONCORE_RST(this.MODE ) + `REG____CP_NONCORE_RST(this.START_ADDRESS ) + `REG____CP_NONCORE_RST(this.DLEN ) + `REG____CP_NONCORE_RST(this.DATAIN ) + `REG____CP_NONCORE_RST(this.EXECUTE ) + `REG____CP_NONCORE_RST(this.STATUS ) + foreach(this.DIGEST[ii]) `REG____CP_NONCORE_RST(this.DIGEST[ii] ) + `REG____CP_NONCORE_RST(this.CONTROL ) + while (blk_flds.size() != 0) begin + uvm_reg_field cur_fld = blk_flds.pop_front(); + `uvm_error("SHA512_ACC_CSR_EXT", {"No extended reset configuration defined for ", cur_fld.get_full_name()}) end - if ( this.CONTROL .has_reset("HARD" )) this.CONTROL .set_reset(this.CONTROL .get_reset("HARD"), "SOFT"); endfunction virtual function void build(); super.build(); - this.set_soft_reset_values(); + this.configure_reset_values(); this.intr_block_rf_ext = new("intr_block_rf_ext"); this.intr_block_rf_ext.configure(this); this.intr_block_rf_ext.build(); // This configures the default_map, which is used to find reg offsets for other maps @@ -469,6 +620,8 @@ package soc_ifc_reg_model_top_pkg; // Scheduling helper class for delayed callback tasks `include "soc_ifc_reg_delay_job.svh" + `include "soc_ifc_reg_delay_job_mbox_csr_mbox_prot_error.svh" + `include "soc_ifc_reg_delay_job_intr_block_rf_ext.svh" // Callbacks for predicting reg-field updates `include "soc_ifc_reg_cbs_mbox_csr.svh" @@ -478,6 +631,7 @@ package soc_ifc_reg_model_top_pkg; `include "soc_ifc_reg_cbs_mbox_csr_mbox_datain_datain.svh" `include "soc_ifc_reg_cbs_mbox_csr_mbox_dataout_dataout.svh" `include "soc_ifc_reg_cbs_mbox_csr_mbox_status_status.svh" + `include "soc_ifc_reg_cbs_mbox_csr_mbox_status_mbox_fsm_ps.svh" `include "soc_ifc_reg_cbs_mbox_csr_mbox_execute_execute.svh" `include "soc_ifc_reg_cbs_mbox_csr_mbox_unlock_unlock.svh" `include "soc_ifc_reg_cbs_intr_block_rf_ext_global_intr_en_r_base.svh" @@ -487,27 +641,81 @@ package soc_ifc_reg_model_top_pkg; `include "soc_ifc_reg_cbs_intr_block_rf_ext_notif_internal_intr_r_base.svh" `include "soc_ifc_reg_cbs_intr_block_rf_ext_notif_intr_en_r_base.svh" `include "soc_ifc_reg_cbs_intr_block_rf_ext_notif_intr_trig_r_base.svh" + `include "soc_ifc_reg_cbs_intr_block_rf_ext_internal.svh" + `include "soc_ifc_reg_cbs_soc_ifc_reg_CPTRA_HW_ERROR_FATAL.svh" + `include "soc_ifc_reg_cbs_soc_ifc_reg_CPTRA_HW_ERROR_NON_FATAL.svh" `include "soc_ifc_reg_cbs_soc_ifc_reg_CPTRA_TRNG_DATA_DATA.svh" `include "soc_ifc_reg_cbs_soc_ifc_reg_CPTRA_TRNG_PAUSER_LOCK_LOCK.svh" + `include "soc_ifc_reg_cbs_soc_ifc_reg_CPTRA_TRNG_CTRL_CLEAR.svh" `include "soc_ifc_reg_cbs_soc_ifc_reg_CPTRA_TRNG_STATUS_DATA_REQ.svh" `include "soc_ifc_reg_cbs_soc_ifc_reg_CPTRA_TRNG_STATUS_DATA_WR_DONE.svh" `include "soc_ifc_reg_cbs_soc_ifc_reg_CPTRA_TRNG_VALID_PAUSER_PAUSER.svh" + `include "soc_ifc_reg_cbs_soc_ifc_reg_CPTRA_WDT_TIMER1_CTRL_TIMER1_RESTART.svh" + `include "soc_ifc_reg_cbs_soc_ifc_reg_CPTRA_WDT_TIMER2_CTRL_TIMER2_RESTART.svh" + `include "soc_ifc_reg_cbs_soc_ifc_reg_secret.svh" + `include "soc_ifc_reg_cbs_soc_ifc_reg_fuse.svh" + `include "soc_ifc_reg_cbs_soc_ifc_reg_key.svh" + `include "soc_ifc_reg_cbs_soc_ifc_reg_internal.svh" + `include "soc_ifc_reg_cbs_soc_ifc_reg_internal_fw_update_reset.svh" + `include "soc_ifc_reg_cbs_sha512_acc_csr_LOCK_LOCK.svh" + `include "soc_ifc_reg_cbs_sha512_acc_csr_EXECUTE_EXECUTE.svh" + + // Callback for sampling coverage + `include "soc_ifc_reg_cbs_sample.svh" // pragma uvmf custom define_register_classes end // pragma uvmf custom define_block_map_coverage_class begin //-------------------------------------------------------------------- - // Class: soc_ifc_fixme_map_coverage + // Class: soc_ifc_AHB_map_coverage + // + // Coverage for the 'AHB_map' in 'soc_ifc_reg_model' + //-------------------------------------------------------------------- + class soc_ifc_AHB_map_coverage extends uvm_object; + `uvm_object_utils(soc_ifc_AHB_map_coverage) + + covergroup ra_cov(string name) with function sample(uvm_reg_addr_t addr, bit is_read); + + option.per_instance = 1; + option.name = name; + + // FIXME + ADDR: coverpoint addr { + bins example_reg0 = {'h0}; + bins example_reg1 = {'h1}; + } + + RW: coverpoint is_read { + bins RD = {1}; + bins WR = {0}; + } + + ACCESS: cross ADDR, RW; + + endgroup: ra_cov + + function new(string name = "soc_ifc_AHB_map_coverage"); + ra_cov = new(name); + endfunction: new + + function void sample(uvm_reg_addr_t offset, bit is_read); + ra_cov.sample(offset, is_read); + endfunction: sample + + endclass: soc_ifc_AHB_map_coverage + //-------------------------------------------------------------------- + // Class: soc_ifc_APB_map_coverage // - // Coverage for the 'fixme_map' in 'soc_ifc_reg_model' + // Coverage for the 'APB_map' in 'soc_ifc_reg_model' //-------------------------------------------------------------------- - class soc_ifc_fixme_map_coverage extends uvm_object; - `uvm_object_utils(soc_ifc_fixme_map_coverage) + class soc_ifc_APB_map_coverage extends uvm_object; + `uvm_object_utils(soc_ifc_APB_map_coverage) covergroup ra_cov(string name) with function sample(uvm_reg_addr_t addr, bit is_read); option.per_instance = 1; option.name = name; + // FIXME ADDR: coverpoint addr { bins example_reg0 = {'h0}; bins example_reg1 = {'h1}; @@ -522,7 +730,7 @@ package soc_ifc_reg_model_top_pkg; endgroup: ra_cov - function new(string name = "soc_ifc_fixme_map_coverage"); + function new(string name = "soc_ifc_APB_map_coverage"); ra_cov = new(name); endfunction: new @@ -530,7 +738,7 @@ package soc_ifc_reg_model_top_pkg; ra_cov.sample(offset, is_read); endfunction: sample - endclass: soc_ifc_fixme_map_coverage + endclass: soc_ifc_APB_map_coverage // pragma uvmf custom define_block_map_coverage_class end //-------------------------------------------------------------------- @@ -556,6 +764,7 @@ package soc_ifc_reg_model_top_pkg; soc_ifc_reg_cbs_intr_block_rf_ext_notif_internal_intr_r_base soc_ifc_reg_intr_block_rf_ext_notif_internal_intr_r_base_cb; soc_ifc_reg_cbs_intr_block_rf_ext_notif_intr_en_r_base soc_ifc_reg_intr_block_rf_ext_notif_intr_en_r_base_cb; soc_ifc_reg_cbs_intr_block_rf_ext_notif_intr_trig_r_base soc_ifc_reg_intr_block_rf_ext_notif_intr_trig_r_base_cb; + soc_ifc_reg_cbs_intr_block_rf_ext_internal soc_ifc_reg_intr_block_rf_ext_internal_cb; soc_ifc_reg_cbs_intr_block_rf_ext_global_intr_en_r_base sha512_acc_csr_intr_block_rf_ext_global_intr_en_r_base_cb; soc_ifc_reg_cbs_intr_block_rf_ext_error_internal_intr_r_base sha512_acc_csr_intr_block_rf_ext_error_internal_intr_r_base_cb; @@ -564,34 +773,58 @@ package soc_ifc_reg_model_top_pkg; soc_ifc_reg_cbs_intr_block_rf_ext_notif_internal_intr_r_base sha512_acc_csr_intr_block_rf_ext_notif_internal_intr_r_base_cb; soc_ifc_reg_cbs_intr_block_rf_ext_notif_intr_en_r_base sha512_acc_csr_intr_block_rf_ext_notif_intr_en_r_base_cb; soc_ifc_reg_cbs_intr_block_rf_ext_notif_intr_trig_r_base sha512_acc_csr_intr_block_rf_ext_notif_intr_trig_r_base_cb; + soc_ifc_reg_cbs_intr_block_rf_ext_internal sha512_acc_csr_intr_block_rf_ext_internal_cb; - soc_ifc_reg_cbs_mbox_csr_mbox_lock_lock mbox_csr_mbox_lock_lock_cb; - soc_ifc_reg_cbs_mbox_csr_mbox_cmd_command mbox_csr_mbox_cmd_command_cb; - soc_ifc_reg_cbs_mbox_csr_mbox_dlen_length mbox_csr_mbox_dlen_length_cb; - soc_ifc_reg_cbs_mbox_csr_mbox_datain_datain mbox_csr_mbox_datain_datain_cb; - soc_ifc_reg_cbs_mbox_csr_mbox_dataout_dataout mbox_csr_mbox_dataout_dataout_cb; - soc_ifc_reg_cbs_mbox_csr_mbox_status_status mbox_csr_mbox_status_status_cb; - soc_ifc_reg_cbs_mbox_csr_mbox_execute_execute mbox_csr_mbox_execute_execute_cb; - soc_ifc_reg_cbs_mbox_csr_mbox_unlock_unlock mbox_csr_mbox_unlock_unlock_cb; + soc_ifc_reg_cbs_mbox_csr_mbox_lock_lock mbox_csr_mbox_lock_lock_cb; + soc_ifc_reg_cbs_mbox_csr_mbox_cmd_command mbox_csr_mbox_cmd_command_cb; + soc_ifc_reg_cbs_mbox_csr_mbox_dlen_length mbox_csr_mbox_dlen_length_cb; + soc_ifc_reg_cbs_mbox_csr_mbox_datain_datain mbox_csr_mbox_datain_datain_cb; + soc_ifc_reg_cbs_mbox_csr_mbox_dataout_dataout mbox_csr_mbox_dataout_dataout_cb; + soc_ifc_reg_cbs_mbox_csr_mbox_status_status mbox_csr_mbox_status_status_cb; + soc_ifc_reg_cbs_mbox_csr_mbox_status_mbox_fsm_ps mbox_csr_mbox_status_mbox_fsm_ps_cb; + soc_ifc_reg_cbs_mbox_csr_mbox_execute_execute mbox_csr_mbox_execute_execute_cb; + soc_ifc_reg_cbs_mbox_csr_mbox_unlock_unlock mbox_csr_mbox_unlock_unlock_cb; + + soc_ifc_reg_cbs_soc_ifc_reg_CPTRA_HW_ERROR_FATAL soc_ifc_reg_CPTRA_HW_ERROR_FATAL_cb; + soc_ifc_reg_cbs_soc_ifc_reg_CPTRA_HW_ERROR_NON_FATAL soc_ifc_reg_CPTRA_HW_ERROR_NON_FATAL_cb; soc_ifc_reg_cbs_soc_ifc_reg_CPTRA_TRNG_DATA_DATA soc_ifc_reg_CPTRA_TRNG_DATA_DATA_cb; soc_ifc_reg_cbs_soc_ifc_reg_CPTRA_TRNG_PAUSER_LOCK_LOCK soc_ifc_reg_CPTRA_TRNG_PAUSER_LOCK_LOCK_cb; + soc_ifc_reg_cbs_soc_ifc_reg_CPTRA_TRNG_CTRL_CLEAR soc_ifc_reg_CPTRA_TRNG_CTRL_CLEAR_cb; soc_ifc_reg_cbs_soc_ifc_reg_CPTRA_TRNG_STATUS_DATA_REQ soc_ifc_reg_CPTRA_TRNG_STATUS_DATA_REQ_cb; soc_ifc_reg_cbs_soc_ifc_reg_CPTRA_TRNG_STATUS_DATA_WR_DONE soc_ifc_reg_CPTRA_TRNG_STATUS_DATA_WR_DONE_cb; soc_ifc_reg_cbs_soc_ifc_reg_CPTRA_TRNG_VALID_PAUSER_PAUSER soc_ifc_reg_CPTRA_TRNG_VALID_PAUSER_PAUSER_cb; + soc_ifc_reg_cbs_soc_ifc_reg_CPTRA_WDT_TIMER1_CTRL_TIMER1_RESTART soc_ifc_reg_CPTRA_WDT_TIMER1_CTRL_TIMER1_RESTART_cb; + soc_ifc_reg_cbs_soc_ifc_reg_CPTRA_WDT_TIMER2_CTRL_TIMER2_RESTART soc_ifc_reg_CPTRA_WDT_TIMER2_CTRL_TIMER2_RESTART_cb; + + soc_ifc_reg_cbs_soc_ifc_reg_secret soc_ifc_reg_secret_cb; + soc_ifc_reg_cbs_soc_ifc_reg_fuse soc_ifc_reg_fuse_cb; + soc_ifc_reg_cbs_soc_ifc_reg_key soc_ifc_reg_key_cb; + soc_ifc_reg_cbs_soc_ifc_reg_internal soc_ifc_reg_internal_cb; + soc_ifc_reg_cbs_soc_ifc_reg_internal_fw_update_reset soc_ifc_reg_internal_fw_update_reset_cb; + soc_ifc_reg_cbs_sha512_acc_csr_LOCK_LOCK sha512_acc_csr_LOCK_LOCK_cb; + soc_ifc_reg_cbs_sha512_acc_csr_EXECUTE_EXECUTE sha512_acc_csr_EXECUTE_EXECUTE_cb; + + soc_ifc_reg_cbs_sample sample_cb; + + uvm_reg_field cptra_fatal_flds[$]; + uvm_reg_field cptra_non_fatal_flds[$]; uvm_reg_field error_en_flds[$]; uvm_reg_field notif_en_flds[$]; uvm_reg_field error_sts_flds[$]; uvm_reg_field notif_sts_flds[$]; uvm_reg_field error_trig_flds[$]; uvm_reg_field notif_trig_flds[$]; + uvm_reg_field all_fields[$]; + uvm_reg all_regs[$]; uvm_queue #(soc_ifc_reg_delay_job) delay_jobs; // pragma uvmf custom instantiate_registers_within_block end - soc_ifc_fixme_map_coverage fixme_map_cg; + soc_ifc_AHB_map_coverage AHB_map_cg; + soc_ifc_APB_map_coverage APB_map_cg; // Function: new // @@ -599,12 +832,25 @@ package soc_ifc_reg_model_top_pkg; super.new(name, build_coverage(UVM_CVR_ALL)); endfunction + // Function: reset + // + function void reset(string kind = "HARD"); + super.reset(kind); + if (kind inside {"HARD", "NONCORE"}) begin + // Purge all pending jobs to update the register model + `uvm_info("SOC_IFC_REG_MODEL_TOP", {"Reset of kind ", kind, " results in delay_jobs being cleared"}, UVM_HIGH) + delay_jobs.delete(); + end + endfunction + // Function: build // virtual function void build(); if(has_coverage(UVM_CVR_ADDR_MAP)) begin - fixme_map_cg = soc_ifc_fixme_map_coverage::type_id::create("fixme_map_cg"); - fixme_map_cg.ra_cov.set_inst_name(this.get_full_name()); + AHB_map_cg = soc_ifc_AHB_map_coverage::type_id::create("AHB_map_cg"); + APB_map_cg = soc_ifc_APB_map_coverage::type_id::create("APB_map_cg"); + AHB_map_cg.ra_cov.set_inst_name({this.get_full_name(),"_AHB_cg"}); + APB_map_cg.ra_cov.set_inst_name({this.get_full_name(),"_APB_cg"}); void'(set_coverage(UVM_CVR_ADDR_MAP)); end @@ -640,6 +886,7 @@ package soc_ifc_reg_model_top_pkg; soc_ifc_reg_intr_block_rf_ext_notif_internal_intr_r_base_cb = soc_ifc_reg_cbs_intr_block_rf_ext_notif_internal_intr_r_base::type_id::create("soc_ifc_reg_intr_block_rf_ext_notif_internal_intr_r_base_cb"); soc_ifc_reg_intr_block_rf_ext_notif_intr_en_r_base_cb = soc_ifc_reg_cbs_intr_block_rf_ext_notif_intr_en_r_base ::type_id::create("soc_ifc_reg_intr_block_rf_ext_notif_intr_en_r_base_cb" ); soc_ifc_reg_intr_block_rf_ext_notif_intr_trig_r_base_cb = soc_ifc_reg_cbs_intr_block_rf_ext_notif_intr_trig_r_base ::type_id::create("soc_ifc_reg_intr_block_rf_ext_notif_intr_trig_r_base_cb" ); + soc_ifc_reg_intr_block_rf_ext_internal_cb = soc_ifc_reg_cbs_intr_block_rf_ext_internal ::type_id::create("soc_ifc_reg_intr_block_rf_ext_internal_cb" ); sha512_acc_csr_intr_block_rf_ext_global_intr_en_r_base_cb = soc_ifc_reg_cbs_intr_block_rf_ext_global_intr_en_r_base ::type_id::create("sha512_acc_csr_intr_block_rf_ext_global_intr_en_r_base_cb" ); sha512_acc_csr_intr_block_rf_ext_error_internal_intr_r_base_cb = soc_ifc_reg_cbs_intr_block_rf_ext_error_internal_intr_r_base::type_id::create("sha512_acc_csr_intr_block_rf_ext_error_internal_intr_r_base_cb"); @@ -648,21 +895,39 @@ package soc_ifc_reg_model_top_pkg; sha512_acc_csr_intr_block_rf_ext_notif_internal_intr_r_base_cb = soc_ifc_reg_cbs_intr_block_rf_ext_notif_internal_intr_r_base::type_id::create("sha512_acc_csr_intr_block_rf_ext_notif_internal_intr_r_base_cb"); sha512_acc_csr_intr_block_rf_ext_notif_intr_en_r_base_cb = soc_ifc_reg_cbs_intr_block_rf_ext_notif_intr_en_r_base ::type_id::create("sha512_acc_csr_intr_block_rf_ext_notif_intr_en_r_base_cb" ); sha512_acc_csr_intr_block_rf_ext_notif_intr_trig_r_base_cb = soc_ifc_reg_cbs_intr_block_rf_ext_notif_intr_trig_r_base ::type_id::create("sha512_acc_csr_intr_block_rf_ext_notif_intr_trig_r_base_cb" ); - - mbox_csr_mbox_lock_lock_cb = soc_ifc_reg_cbs_mbox_csr_mbox_lock_lock ::type_id::create("mbox_csr_mbox_lock_lock_cb" ); - mbox_csr_mbox_cmd_command_cb = soc_ifc_reg_cbs_mbox_csr_mbox_cmd_command ::type_id::create("mbox_csr_mbox_cmd_command_cb" ); - mbox_csr_mbox_dlen_length_cb = soc_ifc_reg_cbs_mbox_csr_mbox_dlen_length ::type_id::create("mbox_csr_mbox_dlen_length_cb" ); - mbox_csr_mbox_datain_datain_cb = soc_ifc_reg_cbs_mbox_csr_mbox_datain_datain ::type_id::create("mbox_csr_mbox_datain_datain_cb" ); - mbox_csr_mbox_dataout_dataout_cb = soc_ifc_reg_cbs_mbox_csr_mbox_dataout_dataout::type_id::create("mbox_csr_mbox_dataout_dataout_cb"); - mbox_csr_mbox_status_status_cb = soc_ifc_reg_cbs_mbox_csr_mbox_status_status ::type_id::create("mbox_csr_mbox_status_status_cb" ); - mbox_csr_mbox_execute_execute_cb = soc_ifc_reg_cbs_mbox_csr_mbox_execute_execute::type_id::create("mbox_csr_mbox_execute_execute_cb"); - mbox_csr_mbox_unlock_unlock_cb = soc_ifc_reg_cbs_mbox_csr_mbox_unlock_unlock ::type_id::create("mbox_csr_mbox_unlock_unlock_cb" ); - + sha512_acc_csr_intr_block_rf_ext_internal_cb = soc_ifc_reg_cbs_intr_block_rf_ext_internal ::type_id::create("sha512_acc_csr_intr_block_rf_ext_internal_cb" ); + + mbox_csr_mbox_lock_lock_cb = soc_ifc_reg_cbs_mbox_csr_mbox_lock_lock ::type_id::create("mbox_csr_mbox_lock_lock_cb" ); + mbox_csr_mbox_cmd_command_cb = soc_ifc_reg_cbs_mbox_csr_mbox_cmd_command ::type_id::create("mbox_csr_mbox_cmd_command_cb" ); + mbox_csr_mbox_dlen_length_cb = soc_ifc_reg_cbs_mbox_csr_mbox_dlen_length ::type_id::create("mbox_csr_mbox_dlen_length_cb" ); + mbox_csr_mbox_datain_datain_cb = soc_ifc_reg_cbs_mbox_csr_mbox_datain_datain ::type_id::create("mbox_csr_mbox_datain_datain_cb" ); + mbox_csr_mbox_dataout_dataout_cb = soc_ifc_reg_cbs_mbox_csr_mbox_dataout_dataout ::type_id::create("mbox_csr_mbox_dataout_dataout_cb" ); + mbox_csr_mbox_status_status_cb = soc_ifc_reg_cbs_mbox_csr_mbox_status_status ::type_id::create("mbox_csr_mbox_status_status_cb" ); + mbox_csr_mbox_status_mbox_fsm_ps_cb = soc_ifc_reg_cbs_mbox_csr_mbox_status_mbox_fsm_ps::type_id::create("mbox_csr_mbox_status_mbox_fsm_ps_cb"); + mbox_csr_mbox_execute_execute_cb = soc_ifc_reg_cbs_mbox_csr_mbox_execute_execute ::type_id::create("mbox_csr_mbox_execute_execute_cb" ); + mbox_csr_mbox_unlock_unlock_cb = soc_ifc_reg_cbs_mbox_csr_mbox_unlock_unlock ::type_id::create("mbox_csr_mbox_unlock_unlock_cb" ); + + soc_ifc_reg_CPTRA_HW_ERROR_FATAL_cb = soc_ifc_reg_cbs_soc_ifc_reg_CPTRA_HW_ERROR_FATAL ::type_id::create("soc_ifc_reg_CPTRA_HW_ERROR_FATAL_cb" ); + soc_ifc_reg_CPTRA_HW_ERROR_NON_FATAL_cb = soc_ifc_reg_cbs_soc_ifc_reg_CPTRA_HW_ERROR_NON_FATAL ::type_id::create("soc_ifc_reg_CPTRA_HW_ERROR_NON_FATAL_cb" ); soc_ifc_reg_CPTRA_TRNG_DATA_DATA_cb = soc_ifc_reg_cbs_soc_ifc_reg_CPTRA_TRNG_DATA_DATA ::type_id::create("soc_ifc_reg_CPTRA_TRNG_DATA_DATA_cb" ); soc_ifc_reg_CPTRA_TRNG_PAUSER_LOCK_LOCK_cb = soc_ifc_reg_cbs_soc_ifc_reg_CPTRA_TRNG_PAUSER_LOCK_LOCK ::type_id::create("soc_ifc_reg_CPTRA_TRNG_PAUSER_LOCK_LOCK_cb" ); + soc_ifc_reg_CPTRA_TRNG_CTRL_CLEAR_cb = soc_ifc_reg_cbs_soc_ifc_reg_CPTRA_TRNG_CTRL_CLEAR ::type_id::create("soc_ifc_reg_CPTRA_TRNG_CTRL_CLEAR_cb" ); soc_ifc_reg_CPTRA_TRNG_STATUS_DATA_REQ_cb = soc_ifc_reg_cbs_soc_ifc_reg_CPTRA_TRNG_STATUS_DATA_REQ ::type_id::create("soc_ifc_reg_CPTRA_TRNG_STATUS_DATA_REQ_cb" ); soc_ifc_reg_CPTRA_TRNG_STATUS_DATA_WR_DONE_cb = soc_ifc_reg_cbs_soc_ifc_reg_CPTRA_TRNG_STATUS_DATA_WR_DONE::type_id::create("soc_ifc_reg_CPTRA_TRNG_STATUS_DATA_WR_DONE_cb"); soc_ifc_reg_CPTRA_TRNG_VALID_PAUSER_PAUSER_cb = soc_ifc_reg_cbs_soc_ifc_reg_CPTRA_TRNG_VALID_PAUSER_PAUSER::type_id::create("soc_ifc_reg_CPTRA_TRNG_VALID_PAUSER_PAUSER_cb"); + soc_ifc_reg_CPTRA_WDT_TIMER1_CTRL_TIMER1_RESTART_cb = soc_ifc_reg_cbs_soc_ifc_reg_CPTRA_WDT_TIMER1_CTRL_TIMER1_RESTART::type_id::create("soc_ifc_reg_CPTRA_WDT_TIMER1_CTRL_TIMER1_RESTART_cb"); + soc_ifc_reg_CPTRA_WDT_TIMER2_CTRL_TIMER2_RESTART_cb = soc_ifc_reg_cbs_soc_ifc_reg_CPTRA_WDT_TIMER2_CTRL_TIMER2_RESTART::type_id::create("soc_ifc_reg_CPTRA_WDT_TIMER2_CTRL_TIMER2_RESTART_cb"); + + soc_ifc_reg_secret_cb = soc_ifc_reg_cbs_soc_ifc_reg_secret ::type_id::create("soc_ifc_reg_secret_cb"); + soc_ifc_reg_fuse_cb = soc_ifc_reg_cbs_soc_ifc_reg_fuse ::type_id::create("soc_ifc_reg_fuse_cb"); + soc_ifc_reg_key_cb = soc_ifc_reg_cbs_soc_ifc_reg_key ::type_id::create("soc_ifc_reg_key_cb"); + soc_ifc_reg_internal_cb = soc_ifc_reg_cbs_soc_ifc_reg_internal::type_id::create("soc_ifc_reg_internal_cb"); + soc_ifc_reg_internal_fw_update_reset_cb = soc_ifc_reg_cbs_soc_ifc_reg_internal_fw_update_reset::type_id::create("soc_ifc_reg_internal_fw_update_reset_cb"); + + sha512_acc_csr_LOCK_LOCK_cb = soc_ifc_reg_cbs_sha512_acc_csr_LOCK_LOCK::type_id::create("sha512_acc_csr_LOCK_LOCK_cb"); + sha512_acc_csr_EXECUTE_EXECUTE_cb = soc_ifc_reg_cbs_sha512_acc_csr_EXECUTE_EXECUTE::type_id::create("sha512_acc_csr_EXECUTE_EXECUTE_cb"); + + sample_cb = soc_ifc_reg_cbs_sample::type_id::create("sample_cb"); // Callbacks compute side-effects to other registers in the reg-model // in response to 'do_predict'. @@ -684,6 +949,34 @@ package soc_ifc_reg_model_top_pkg; foreach (notif_sts_flds [ii]) uvm_reg_field_cb::add(notif_sts_flds [ii], soc_ifc_reg_intr_block_rf_ext_notif_internal_intr_r_base_cb); foreach (error_trig_flds[ii]) uvm_reg_field_cb::add(error_trig_flds[ii], soc_ifc_reg_intr_block_rf_ext_error_intr_trig_r_base_cb ); foreach (notif_trig_flds[ii]) uvm_reg_field_cb::add(notif_trig_flds[ii], soc_ifc_reg_intr_block_rf_ext_notif_intr_trig_r_base_cb ); + uvm_reg_field_cb::add(this.soc_ifc_reg_rm.intr_block_rf_ext.error_internal_intr_count_r .cnt, soc_ifc_reg_intr_block_rf_ext_internal_cb); + uvm_reg_field_cb::add(this.soc_ifc_reg_rm.intr_block_rf_ext.error_inv_dev_intr_count_r .cnt, soc_ifc_reg_intr_block_rf_ext_internal_cb); + uvm_reg_field_cb::add(this.soc_ifc_reg_rm.intr_block_rf_ext.error_cmd_fail_intr_count_r .cnt, soc_ifc_reg_intr_block_rf_ext_internal_cb); + uvm_reg_field_cb::add(this.soc_ifc_reg_rm.intr_block_rf_ext.error_bad_fuse_intr_count_r .cnt, soc_ifc_reg_intr_block_rf_ext_internal_cb); + uvm_reg_field_cb::add(this.soc_ifc_reg_rm.intr_block_rf_ext.error_iccm_blocked_intr_count_r .cnt, soc_ifc_reg_intr_block_rf_ext_internal_cb); + uvm_reg_field_cb::add(this.soc_ifc_reg_rm.intr_block_rf_ext.error_mbox_ecc_unc_intr_count_r .cnt, soc_ifc_reg_intr_block_rf_ext_internal_cb); + uvm_reg_field_cb::add(this.soc_ifc_reg_rm.intr_block_rf_ext.error_wdt_timer1_timeout_intr_count_r .cnt, soc_ifc_reg_intr_block_rf_ext_internal_cb); + uvm_reg_field_cb::add(this.soc_ifc_reg_rm.intr_block_rf_ext.error_wdt_timer2_timeout_intr_count_r .cnt, soc_ifc_reg_intr_block_rf_ext_internal_cb); + uvm_reg_field_cb::add(this.soc_ifc_reg_rm.intr_block_rf_ext.notif_cmd_avail_intr_count_r .cnt, soc_ifc_reg_intr_block_rf_ext_internal_cb); + uvm_reg_field_cb::add(this.soc_ifc_reg_rm.intr_block_rf_ext.notif_mbox_ecc_cor_intr_count_r .cnt, soc_ifc_reg_intr_block_rf_ext_internal_cb); + uvm_reg_field_cb::add(this.soc_ifc_reg_rm.intr_block_rf_ext.notif_debug_locked_intr_count_r .cnt, soc_ifc_reg_intr_block_rf_ext_internal_cb); + uvm_reg_field_cb::add(this.soc_ifc_reg_rm.intr_block_rf_ext.notif_scan_mode_intr_count_r .cnt, soc_ifc_reg_intr_block_rf_ext_internal_cb); + uvm_reg_field_cb::add(this.soc_ifc_reg_rm.intr_block_rf_ext.notif_soc_req_lock_intr_count_r .cnt, soc_ifc_reg_intr_block_rf_ext_internal_cb); + uvm_reg_field_cb::add(this.soc_ifc_reg_rm.intr_block_rf_ext.notif_gen_in_toggle_intr_count_r .cnt, soc_ifc_reg_intr_block_rf_ext_internal_cb); + uvm_reg_field_cb::add(this.soc_ifc_reg_rm.intr_block_rf_ext.error_internal_intr_count_incr_r .pulse, soc_ifc_reg_intr_block_rf_ext_internal_cb); + uvm_reg_field_cb::add(this.soc_ifc_reg_rm.intr_block_rf_ext.error_inv_dev_intr_count_incr_r .pulse, soc_ifc_reg_intr_block_rf_ext_internal_cb); + uvm_reg_field_cb::add(this.soc_ifc_reg_rm.intr_block_rf_ext.error_cmd_fail_intr_count_incr_r .pulse, soc_ifc_reg_intr_block_rf_ext_internal_cb); + uvm_reg_field_cb::add(this.soc_ifc_reg_rm.intr_block_rf_ext.error_bad_fuse_intr_count_incr_r .pulse, soc_ifc_reg_intr_block_rf_ext_internal_cb); + uvm_reg_field_cb::add(this.soc_ifc_reg_rm.intr_block_rf_ext.error_iccm_blocked_intr_count_incr_r .pulse, soc_ifc_reg_intr_block_rf_ext_internal_cb); + uvm_reg_field_cb::add(this.soc_ifc_reg_rm.intr_block_rf_ext.error_mbox_ecc_unc_intr_count_incr_r .pulse, soc_ifc_reg_intr_block_rf_ext_internal_cb); + uvm_reg_field_cb::add(this.soc_ifc_reg_rm.intr_block_rf_ext.error_wdt_timer1_timeout_intr_count_incr_r.pulse, soc_ifc_reg_intr_block_rf_ext_internal_cb); + uvm_reg_field_cb::add(this.soc_ifc_reg_rm.intr_block_rf_ext.error_wdt_timer2_timeout_intr_count_incr_r.pulse, soc_ifc_reg_intr_block_rf_ext_internal_cb); + uvm_reg_field_cb::add(this.soc_ifc_reg_rm.intr_block_rf_ext.notif_cmd_avail_intr_count_incr_r .pulse, soc_ifc_reg_intr_block_rf_ext_internal_cb); + uvm_reg_field_cb::add(this.soc_ifc_reg_rm.intr_block_rf_ext.notif_mbox_ecc_cor_intr_count_incr_r .pulse, soc_ifc_reg_intr_block_rf_ext_internal_cb); + uvm_reg_field_cb::add(this.soc_ifc_reg_rm.intr_block_rf_ext.notif_debug_locked_intr_count_incr_r .pulse, soc_ifc_reg_intr_block_rf_ext_internal_cb); + uvm_reg_field_cb::add(this.soc_ifc_reg_rm.intr_block_rf_ext.notif_scan_mode_intr_count_incr_r .pulse, soc_ifc_reg_intr_block_rf_ext_internal_cb); + uvm_reg_field_cb::add(this.soc_ifc_reg_rm.intr_block_rf_ext.notif_soc_req_lock_intr_count_incr_r .pulse, soc_ifc_reg_intr_block_rf_ext_internal_cb); + uvm_reg_field_cb::add(this.soc_ifc_reg_rm.intr_block_rf_ext.notif_gen_in_toggle_intr_count_incr_r .pulse, soc_ifc_reg_intr_block_rf_ext_internal_cb); /* -- sha512_acc_csr interrupts -- */ uvm_reg_field_cb::add(sha512_acc_csr_rm.intr_block_rf_ext.global_intr_en_r.error_en, sha512_acc_csr_intr_block_rf_ext_global_intr_en_r_base_cb ); @@ -706,23 +999,81 @@ package soc_ifc_reg_model_top_pkg; foreach (notif_sts_flds [ii]) uvm_reg_field_cb::add(notif_sts_flds [ii], sha512_acc_csr_intr_block_rf_ext_notif_internal_intr_r_base_cb); foreach (error_trig_flds[ii]) uvm_reg_field_cb::add(error_trig_flds[ii], sha512_acc_csr_intr_block_rf_ext_error_intr_trig_r_base_cb ); foreach (notif_trig_flds[ii]) uvm_reg_field_cb::add(notif_trig_flds[ii], sha512_acc_csr_intr_block_rf_ext_notif_intr_trig_r_base_cb ); + uvm_reg_field_cb::add(this.sha512_acc_csr_rm.intr_block_rf_ext.error0_intr_count_r .cnt, sha512_acc_csr_intr_block_rf_ext_internal_cb); + uvm_reg_field_cb::add(this.sha512_acc_csr_rm.intr_block_rf_ext.error1_intr_count_r .cnt, sha512_acc_csr_intr_block_rf_ext_internal_cb); + uvm_reg_field_cb::add(this.sha512_acc_csr_rm.intr_block_rf_ext.error2_intr_count_r .cnt, sha512_acc_csr_intr_block_rf_ext_internal_cb); + uvm_reg_field_cb::add(this.sha512_acc_csr_rm.intr_block_rf_ext.error3_intr_count_r .cnt, sha512_acc_csr_intr_block_rf_ext_internal_cb); + uvm_reg_field_cb::add(this.sha512_acc_csr_rm.intr_block_rf_ext.notif_cmd_done_intr_count_r .cnt, sha512_acc_csr_intr_block_rf_ext_internal_cb); + uvm_reg_field_cb::add(this.sha512_acc_csr_rm.intr_block_rf_ext.error0_intr_count_incr_r .pulse, sha512_acc_csr_intr_block_rf_ext_internal_cb); + uvm_reg_field_cb::add(this.sha512_acc_csr_rm.intr_block_rf_ext.error1_intr_count_incr_r .pulse, sha512_acc_csr_intr_block_rf_ext_internal_cb); + uvm_reg_field_cb::add(this.sha512_acc_csr_rm.intr_block_rf_ext.error2_intr_count_incr_r .pulse, sha512_acc_csr_intr_block_rf_ext_internal_cb); + uvm_reg_field_cb::add(this.sha512_acc_csr_rm.intr_block_rf_ext.error3_intr_count_incr_r .pulse, sha512_acc_csr_intr_block_rf_ext_internal_cb); + uvm_reg_field_cb::add(this.sha512_acc_csr_rm.intr_block_rf_ext.notif_cmd_done_intr_count_incr_r .pulse, sha512_acc_csr_intr_block_rf_ext_internal_cb); /* -- mbox_csr -- */ - uvm_reg_field_cb::add(mbox_csr_rm.mbox_lock .lock , mbox_csr_mbox_lock_lock_cb ); - uvm_reg_field_cb::add(mbox_csr_rm.mbox_cmd .command , mbox_csr_mbox_cmd_command_cb ); - uvm_reg_field_cb::add(mbox_csr_rm.mbox_dlen .length , mbox_csr_mbox_dlen_length_cb ); - uvm_reg_field_cb::add(mbox_csr_rm.mbox_datain .datain , mbox_csr_mbox_datain_datain_cb ); - uvm_reg_field_cb::add(mbox_csr_rm.mbox_dataout.dataout , mbox_csr_mbox_dataout_dataout_cb ); - uvm_reg_field_cb::add(mbox_csr_rm.mbox_status .status , mbox_csr_mbox_status_status_cb ); - uvm_reg_field_cb::add(mbox_csr_rm.mbox_execute.execute , mbox_csr_mbox_execute_execute_cb ); - uvm_reg_field_cb::add(mbox_csr_rm.mbox_unlock .unlock , mbox_csr_mbox_unlock_unlock_cb ); + uvm_reg_field_cb::add(mbox_csr_rm.mbox_lock .lock , mbox_csr_mbox_lock_lock_cb ); + uvm_reg_field_cb::add(mbox_csr_rm.mbox_cmd .command , mbox_csr_mbox_cmd_command_cb ); + uvm_reg_field_cb::add(mbox_csr_rm.mbox_dlen .length , mbox_csr_mbox_dlen_length_cb ); + uvm_reg_field_cb::add(mbox_csr_rm.mbox_datain .datain , mbox_csr_mbox_datain_datain_cb ); + uvm_reg_field_cb::add(mbox_csr_rm.mbox_dataout.dataout , mbox_csr_mbox_dataout_dataout_cb ); + uvm_reg_field_cb::add(mbox_csr_rm.mbox_status .status , mbox_csr_mbox_status_status_cb ); + uvm_reg_field_cb::add(mbox_csr_rm.mbox_status .mbox_fsm_ps, mbox_csr_mbox_status_mbox_fsm_ps_cb); + uvm_reg_field_cb::add(mbox_csr_rm.mbox_execute.execute , mbox_csr_mbox_execute_execute_cb ); + uvm_reg_field_cb::add(mbox_csr_rm.mbox_unlock .unlock , mbox_csr_mbox_unlock_unlock_cb ); /* -- soc_ifc_reg -- */ + soc_ifc_reg_rm.CPTRA_HW_ERROR_FATAL .get_fields(cptra_fatal_flds ); + soc_ifc_reg_rm.CPTRA_HW_ERROR_NON_FATAL.get_fields(cptra_non_fatal_flds); + foreach (cptra_fatal_flds [ii]) if (cptra_fatal_flds [ii].get_name() == "rsvd") cptra_fatal_flds .delete(ii); + foreach (cptra_non_fatal_flds[ii]) if (cptra_non_fatal_flds[ii].get_name() == "rsvd") cptra_non_fatal_flds.delete(ii); + + foreach (cptra_fatal_flds [ii]) uvm_reg_field_cb::add(cptra_fatal_flds [ii] , soc_ifc_reg_CPTRA_HW_ERROR_FATAL_cb ); + foreach (cptra_non_fatal_flds[ii]) uvm_reg_field_cb::add(cptra_non_fatal_flds[ii] , soc_ifc_reg_CPTRA_HW_ERROR_NON_FATAL_cb); + uvm_reg_field_cb::add(soc_ifc_reg_rm.CPTRA_BOOT_STATUS.status , soc_ifc_reg_internal_cb ); foreach (soc_ifc_reg_rm.CPTRA_TRNG_DATA[ii]) uvm_reg_field_cb::add(soc_ifc_reg_rm.CPTRA_TRNG_DATA[ii].DATA, soc_ifc_reg_CPTRA_TRNG_DATA_DATA_cb); uvm_reg_field_cb::add(soc_ifc_reg_rm.CPTRA_TRNG_PAUSER_LOCK .LOCK , soc_ifc_reg_CPTRA_TRNG_PAUSER_LOCK_LOCK_cb ); uvm_reg_field_cb::add(soc_ifc_reg_rm.CPTRA_TRNG_STATUS .DATA_REQ , soc_ifc_reg_CPTRA_TRNG_STATUS_DATA_REQ_cb ); uvm_reg_field_cb::add(soc_ifc_reg_rm.CPTRA_TRNG_STATUS .DATA_WR_DONE, soc_ifc_reg_CPTRA_TRNG_STATUS_DATA_WR_DONE_cb ); uvm_reg_field_cb::add(soc_ifc_reg_rm.CPTRA_TRNG_VALID_PAUSER .PAUSER , soc_ifc_reg_CPTRA_TRNG_VALID_PAUSER_PAUSER_cb ); + uvm_reg_field_cb::add(soc_ifc_reg_rm.CPTRA_TRNG_CTRL .clear , soc_ifc_reg_CPTRA_TRNG_CTRL_CLEAR_cb ); + uvm_reg_field_cb::add(soc_ifc_reg_rm.CPTRA_WDT_TIMER1_CTRL .timer1_restart, soc_ifc_reg_CPTRA_WDT_TIMER1_CTRL_TIMER1_RESTART_cb ); + uvm_reg_field_cb::add(soc_ifc_reg_rm.CPTRA_WDT_TIMER2_CTRL .timer2_restart, soc_ifc_reg_CPTRA_WDT_TIMER2_CTRL_TIMER2_RESTART_cb ); + + foreach (soc_ifc_reg_rm.fuse_uds_seed[ii]) uvm_reg_field_cb::add(soc_ifc_reg_rm.fuse_uds_seed[ii].seed , soc_ifc_reg_secret_cb); + foreach (soc_ifc_reg_rm.fuse_field_entropy[ii]) uvm_reg_field_cb::add(soc_ifc_reg_rm.fuse_field_entropy[ii].seed , soc_ifc_reg_secret_cb); + foreach (soc_ifc_reg_rm.fuse_key_manifest_pk_hash[ii]) uvm_reg_field_cb::add(soc_ifc_reg_rm.fuse_key_manifest_pk_hash[ii].hash , soc_ifc_reg_fuse_cb); + uvm_reg_field_cb::add(soc_ifc_reg_rm.fuse_key_manifest_pk_hash_mask.mask, soc_ifc_reg_fuse_cb); + foreach (soc_ifc_reg_rm.fuse_owner_pk_hash[ii]) uvm_reg_field_cb::add(soc_ifc_reg_rm.fuse_owner_pk_hash[ii].hash , soc_ifc_reg_fuse_cb); + uvm_reg_field_cb::add(soc_ifc_reg_rm.fuse_fmc_key_manifest_svn.svn , soc_ifc_reg_fuse_cb); + foreach (soc_ifc_reg_rm.fuse_runtime_svn[ii]) uvm_reg_field_cb::add(soc_ifc_reg_rm.fuse_runtime_svn[ii].svn , soc_ifc_reg_fuse_cb); + uvm_reg_field_cb::add(soc_ifc_reg_rm.fuse_anti_rollback_disable.dis , soc_ifc_reg_fuse_cb); + foreach (soc_ifc_reg_rm.fuse_idevid_cert_attr[ii]) uvm_reg_field_cb::add(soc_ifc_reg_rm.fuse_idevid_cert_attr[ii].cert , soc_ifc_reg_fuse_cb); + foreach (soc_ifc_reg_rm.fuse_idevid_manuf_hsm_id[ii]) uvm_reg_field_cb::add(soc_ifc_reg_rm.fuse_idevid_manuf_hsm_id[ii].hsm_id, soc_ifc_reg_fuse_cb); + uvm_reg_field_cb::add(soc_ifc_reg_rm.fuse_life_cycle.life_cycle , soc_ifc_reg_fuse_cb); + uvm_reg_field_cb::add(soc_ifc_reg_rm.fuse_lms_verify.lms_verify , soc_ifc_reg_fuse_cb); + uvm_reg_field_cb::add(soc_ifc_reg_rm.fuse_lms_revocation.lms_revocation , soc_ifc_reg_fuse_cb); + uvm_reg_field_cb::add(soc_ifc_reg_rm.fuse_soc_stepping_id.soc_stepping_id, soc_ifc_reg_fuse_cb); + foreach (soc_ifc_reg_rm.internal_obf_key[ii]) uvm_reg_field_cb::add(soc_ifc_reg_rm.internal_obf_key[ii].key , soc_ifc_reg_key_cb); + uvm_reg_field_cb::add(soc_ifc_reg_rm.internal_iccm_lock.lock , soc_ifc_reg_internal_cb); + uvm_reg_field_cb::add(soc_ifc_reg_rm.internal_fw_update_reset.core_rst , soc_ifc_reg_internal_fw_update_reset_cb) ; + uvm_reg_field_cb::add(soc_ifc_reg_rm.internal_rv_mtime_l.count_l , soc_ifc_reg_internal_cb); + uvm_reg_field_cb::add(soc_ifc_reg_rm.internal_rv_mtime_h.count_h , soc_ifc_reg_internal_cb); + uvm_reg_field_cb::add(soc_ifc_reg_rm.internal_rv_mtimecmp_l.compare_l , soc_ifc_reg_internal_cb); + uvm_reg_field_cb::add(soc_ifc_reg_rm.internal_rv_mtimecmp_h.compare_h , soc_ifc_reg_internal_cb); + /* -- sha512_acc_csr -- */ + uvm_reg_field_cb::add(sha512_acc_csr_rm.LOCK.LOCK, sha512_acc_csr_LOCK_LOCK_cb); + uvm_reg_field_cb::add(sha512_acc_csr_rm.EXECUTE.EXECUTE, sha512_acc_csr_EXECUTE_EXECUTE_cb); + + /* -- Coverage sampling callback for all registers */ + // Add this callback after all other callbacks so it runs AFTER the prediction is finalized + get_registers(all_regs, UVM_HIER); + foreach (all_regs[ii]) begin + all_fields.delete(); + all_regs[ii].get_fields(all_fields); + foreach (all_fields[jj]) begin + uvm_reg_field_cb::add(all_fields[jj], sample_cb); + end + end // pragma uvmf custom construct_configure_build_registers_within_block end // pragma uvmf custom add_registers_to_block_map begin @@ -762,6 +1113,7 @@ package soc_ifc_reg_model_top_pkg; this.soc_ifc_AHB_map.add_submap(this.sha512_acc_csr_rm.sha512_acc_csr_AHB_map, 'h2_1000); this.soc_ifc_AHB_map.add_submap(this.soc_ifc_reg_rm.soc_ifc_reg_AHB_map, 'h3_0000); + void'(set_coverage(get_coverage() | UVM_CVR_REG_BITS | UVM_CVR_FIELD_VALS)); // pragma uvmf custom add_registers_to_block_map end @@ -771,8 +1123,11 @@ package soc_ifc_reg_model_top_pkg; // function void sample(uvm_reg_addr_t offset, bit is_read, uvm_reg_map map); if(get_coverage(UVM_CVR_ADDR_MAP)) begin - if(map.get_name() == "fixme_map_cg") begin - fixme_map_cg.sample(offset, is_read); + if(map.get_name() == "soc_ifc_AHB_map") begin + AHB_map_cg.sample(offset, is_read); + end + if(map.get_name() == "soc_ifc_APB_map") begin + APB_map_cg.sample(offset, is_read); end end endfunction: sample diff --git a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/sequences/bringup/cptra/soc_ifc_env_cptra_init_interrupts_sequence.svh b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/sequences/bringup/cptra/soc_ifc_env_cptra_init_interrupts_sequence.svh new file mode 100644 index 000000000..e830f1173 --- /dev/null +++ b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/sequences/bringup/cptra/soc_ifc_env_cptra_init_interrupts_sequence.svh @@ -0,0 +1,87 @@ +//---------------------------------------------------------------------- +// Created with uvmf_gen version 2022.3 +//---------------------------------------------------------------------- +// SPDX-License-Identifier: Apache-2.0 +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// pragma uvmf custom header begin +// pragma uvmf custom header end +//---------------------------------------------------------------------- +//---------------------------------------------------------------------- +// +// DESCRIPTION: Sequence to initialize Caliptra SOC_IFC interrupts +// +//---------------------------------------------------------------------- +//---------------------------------------------------------------------- +// +class soc_ifc_env_cptra_init_interrupts_sequence extends soc_ifc_env_sequence_base #(.CONFIG_T(soc_ifc_env_configuration_t)); + + + `uvm_object_utils( soc_ifc_env_cptra_init_interrupts_sequence ); + + + uvm_status_e reg_sts; + + function new(string name = "" ); + super.new(name); + + endfunction + + virtual task body(); + + uvm_reg_data_t data; + uvm_reg_field flds[$]; + int sts_rsp_count = 0; + reg_model = configuration.soc_ifc_rm; + + if (cptra_status_agent_rsp_seq == null) + `uvm_fatal("CPTRA_INIT_INTR", "SOC_IFC ENV caliptra reset wait sequence expected a handle to the cptra status agent responder sequence (from bench-level sequence) but got null!") + fork + forever begin + @(cptra_status_agent_rsp_seq.new_rsp) sts_rsp_count++; + end + join_none + + // Clear debug locked interrupt + data = (uvm_reg_data_t'(1) << reg_model.soc_ifc_reg_rm.intr_block_rf_ext.notif_internal_intr_r.notif_debug_locked_sts.get_lsb_pos()); + reg_model.soc_ifc_reg_rm.intr_block_rf_ext.notif_internal_intr_r.write(reg_sts, data, UVM_FRONTDOOR, reg_model.soc_ifc_AHB_map, this); + + // Interrupt Enable (Global) + data = (uvm_reg_data_t'(1) << reg_model.soc_ifc_reg_rm.intr_block_rf_ext.global_intr_en_r.error_en.get_lsb_pos()) | + (uvm_reg_data_t'(1) << reg_model.soc_ifc_reg_rm.intr_block_rf_ext.global_intr_en_r.notif_en.get_lsb_pos()); + reg_model.soc_ifc_reg_rm.intr_block_rf_ext.global_intr_en_r.write(reg_sts, data, UVM_FRONTDOOR, reg_model.soc_ifc_AHB_map, this); + if (reg_sts != UVM_IS_OK) + `uvm_error("CPTRA_INIT_INTR", $sformatf("Register access failed (%s)", "global_intr_en_r")) + + // Interrupt Enable (Errors) + reg_model.soc_ifc_reg_rm.intr_block_rf_ext.error_intr_en_r.get_fields(flds); + data = 0; + foreach (flds[ii]) data |= (uvm_reg_data_t'(1) << flds[ii].get_lsb_pos()); + flds.delete(); + reg_model.soc_ifc_reg_rm.intr_block_rf_ext.error_intr_en_r.write(reg_sts, data, UVM_FRONTDOOR, reg_model.soc_ifc_AHB_map, this); + if (reg_sts != UVM_IS_OK) + `uvm_error("CPTRA_INIT_INTR", $sformatf("Register access failed (%s)", "error_intr_en_r")) + + // Interrupt Enable (Notifications) + reg_model.soc_ifc_reg_rm.intr_block_rf_ext.notif_intr_en_r.get_fields(flds); + data = 0; + foreach (flds[ii]) data |= (uvm_reg_data_t'(1) << flds[ii].get_lsb_pos()); + flds.delete(); + reg_model.soc_ifc_reg_rm.intr_block_rf_ext.notif_intr_en_r.write(reg_sts, data, UVM_FRONTDOOR, reg_model.soc_ifc_AHB_map, this); + if (reg_sts != UVM_IS_OK) + `uvm_error("CPTRA_INIT_INTR", $sformatf("Register access failed (%s)", "notif_intr_en_r")) + + endtask + +endclass diff --git a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/sequences/bringup/soc_ifc/soc_ifc_env_reset_sequence_base.svh b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/sequences/bringup/soc_ifc/soc_ifc_env_reset_sequence_base.svh index 85fc555b1..5253bd642 100644 --- a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/sequences/bringup/soc_ifc/soc_ifc_env_reset_sequence_base.svh +++ b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/sequences/bringup/soc_ifc/soc_ifc_env_reset_sequence_base.svh @@ -36,14 +36,24 @@ class soc_ifc_env_reset_sequence_base extends soc_ifc_env_sequence_base #(.CONFI caliptra_apb_user apb_user_obj; typedef struct packed { - bit set_bootfsm_breakpoint; + bit set_bootfsm_breakpoint; + security_state_t security_state; } ctrl_reset_seq_context_t; rand uvm_reg_data_t uds_seed_rand [12]; rand uvm_reg_data_t field_entropy_rand [32]; + rand uvm_reg_data_t owner_pk_hash_rand [12]; + rand uvm_reg_data_t key_manifest_pk_hash_rand [12]; + rand uvm_reg_data_t idevid_cert_attr_rand [24]; + rand uvm_reg_data_t soc_stepping_id_rand; rand struct packed { bit uds; bit field_entropy; + bit [0:11] key_manifest_pk_hash; + bit [0:11] owner_pk_hash; + bit soc_stepping_id; + bit [0:23] idevid_cert_attr; + bit lms_verify; } fuses_to_set; @@ -71,6 +81,8 @@ class soc_ifc_env_reset_sequence_base extends soc_ifc_env_sequence_base #(.CONFI else `uvm_error("SOC_IFC_RST", "soc_ifc_ctrl_agent_config.sequencer is null!") ctx.set_bootfsm_breakpoint = soc_ifc_ctrl_seq.set_bootfsm_breakpoint; + ctx.security_state = soc_ifc_ctrl_seq.security_state; + endtask @@ -90,16 +102,18 @@ class soc_ifc_env_reset_sequence_base extends soc_ifc_env_sequence_base #(.CONFI end join_none - wait(sts_rsp_count > 0); - `uvm_info("SOC_IFC_RST", "Received response from status agent", UVM_MEDIUM) - if (sts_rsp_count > 1) - `uvm_error("SOC_IFC_RST", "Missed response activity during reset sequence") - fuse_ready = soc_ifc_status_agent_rsp_seq.rsp.ready_for_fuses; - sts_rsp_count--; - if (!fuse_ready) - `uvm_error("SOC_IFC_RST", "Unexpected status transition while waiting for Mailbox readiness for fuses") - else - `uvm_info("SOC_IFC_RST", "Fuse ready, initiating fuse download", UVM_LOW) + while (!fuse_ready) begin + wait(sts_rsp_count > 0); + `uvm_info("SOC_IFC_RST", "Received response from status agent", UVM_MEDIUM) + if (sts_rsp_count > 1) + `uvm_error("SOC_IFC_RST", "Missed response activity during reset sequence") + fuse_ready = soc_ifc_status_agent_rsp_seq.rsp.ready_for_fuses; + sts_rsp_count--; + if (!fuse_ready) + `uvm_info("SOC_IFC_RST", "Received status transition while waiting for Mailbox ready_for_fuses, ready_for_fuses still not set", UVM_MEDIUM) + else + `uvm_info("SOC_IFC_RST", $sformatf("Fuse ready, initiating fuse download with fuses_to_set: [%p]", this.fuses_to_set), UVM_LOW) + end // Write UDS if (this.fuses_to_set.uds) begin @@ -119,6 +133,48 @@ class soc_ifc_env_reset_sequence_base extends soc_ifc_env_sequence_base #(.CONFI end end + // Key Manifest PK Hash (Vendor) + foreach (this.fuses_to_set.key_manifest_pk_hash[ii]) begin + if (this.fuses_to_set.key_manifest_pk_hash[ii]) begin + `uvm_info("SOC_IFC_RST", $sformatf("Writing Key Manifest PK Hash [%d] to fuse bank with value 0x%0x", ii, key_manifest_pk_hash_rand[ii]), UVM_LOW) + reg_model.soc_ifc_reg_rm.fuse_key_manifest_pk_hash[ii].write(sts, key_manifest_pk_hash_rand[ii], UVM_FRONTDOOR, reg_model.soc_ifc_APB_map, this, .extension(apb_user_obj)); + if (sts != UVM_IS_OK) `uvm_error("SOC_IFC_RST", $sformatf("Failed when writing to Key Manifest PK Hash [%d]", ii)) + end + end + + // Owner PK Hash + foreach (this.fuses_to_set.owner_pk_hash[ii]) begin + if (this.fuses_to_set.owner_pk_hash[ii]) begin + `uvm_info("SOC_IFC_RST", $sformatf("Writing Owner PK Hash [%d] to fuse bank with value 0x%0x", ii, owner_pk_hash_rand[ii]), UVM_LOW) + reg_model.soc_ifc_reg_rm.fuse_owner_pk_hash[ii].write(sts, owner_pk_hash_rand[ii], UVM_FRONTDOOR, reg_model.soc_ifc_APB_map, this, .extension(apb_user_obj)); + if (sts != UVM_IS_OK) `uvm_error("SOC_IFC_RST", $sformatf("Failed when writing to Owner PK Hash [%d]", ii)) + end + end + + // Write SoC Stepping ID + if (this.fuses_to_set.soc_stepping_id) begin + `uvm_info("SOC_IFC_RST", "Writing SOC Stepping ID to fuse bank", UVM_LOW) + reg_model.soc_ifc_reg_rm.fuse_soc_stepping_id.write(sts, {16'h0, soc_stepping_id_rand[15:0]}, UVM_FRONTDOOR, reg_model.soc_ifc_APB_map, this, .extension(apb_user_obj)); + if (sts != UVM_IS_OK) `uvm_error("SOC_IFC_RST", "Failed when writing to soc_stepping_id") + end + + // iDevID Cert Attr + foreach (this.fuses_to_set.idevid_cert_attr[ii]) begin + if (this.fuses_to_set.idevid_cert_attr[ii]) begin + `uvm_info("SOC_IFC_RST", $sformatf("Writing iDevID Certificate Attribute [%d] to fuse bank", ii), UVM_LOW) + reg_model.soc_ifc_reg_rm.fuse_idevid_cert_attr[ii].write(sts, idevid_cert_attr_rand[ii], UVM_FRONTDOOR, reg_model.soc_ifc_APB_map, this, .extension(apb_user_obj)); + if (sts != UVM_IS_OK) `uvm_error("SOC_IFC_RST", $sformatf("Failed when writing to iDevID Certificate Attribute [%d]", ii)) + end + end + + // Write LMS Verify Bit + if (this.fuses_to_set.lms_verify) begin + uvm_reg_data_t lms_verify_data = 1 << reg_model.soc_ifc_reg_rm.fuse_lms_verify.lms_verify.get_lsb_pos(); + `uvm_info("SOC_IFC_RST", "Writing LMS Verify=1 to fuse bank", UVM_LOW) + reg_model.soc_ifc_reg_rm.fuse_lms_verify.write(sts, lms_verify_data, UVM_FRONTDOOR, reg_model.soc_ifc_APB_map, this, .extension(apb_user_obj)); + if (sts != UVM_IS_OK) `uvm_error("SOC_IFC_RST", "Failed when writing to lms_verify") + end + // Set Fuse Done reg_model.soc_ifc_reg_rm.CPTRA_FUSE_WR_DONE.write(sts, `UVM_REG_DATA_WIDTH'(1), UVM_FRONTDOOR, reg_model.soc_ifc_APB_map, this, .extension(apb_user_obj)); `uvm_info("SOC_IFC_RST", $sformatf("Fuse download completed, status: %p", sts), UVM_MEDIUM) @@ -132,14 +188,31 @@ class soc_ifc_env_reset_sequence_base extends soc_ifc_env_sequence_base #(.CONFI //========================================== virtual task configure_breakpoint(input ctrl_reset_seq_context_t ctrl_rst_ctx); uvm_status_e sts; + uvm_reg_data_t data; + uvm_reg_data_t data_mask; + uvm_reg_data_t data_check; + + //create a mask for the read data, just for boot_fsm_ps + data_mask = (1 << reg_model.soc_ifc_reg_rm.CPTRA_FLOW_STATUS.boot_fsm_ps.get_n_bits()) - 1; + data_mask <<= reg_model.soc_ifc_reg_rm.CPTRA_FLOW_STATUS.boot_fsm_ps.get_lsb_pos(); + //create a valid data for checking that matches masked read data + data_check = BOOT_WAIT << reg_model.soc_ifc_reg_rm.CPTRA_FLOW_STATUS.boot_fsm_ps.get_lsb_pos(); + // If set_bootfsm_breakpoint is randomized to 1, we need to release bootfsm by writing GO - if (ctrl_rst_ctx.set_bootfsm_breakpoint) begin - `uvm_info("SOC_IFC_RST", "BootFSM Breakpoint is set, writing GO", UVM_MEDIUM) - reg_model.soc_ifc_reg_rm.CPTRA_BOOTFSM_GO.write(sts, `UVM_REG_DATA_WIDTH'(1), UVM_FRONTDOOR, reg_model.soc_ifc_APB_map, this, .extension(apb_user_obj)); - `uvm_info("SOC_IFC_RST", $sformatf("Write to BootFSM GO completed, status: %p", sts), UVM_MEDIUM) + // bootfsm_breakpoint is qualified by debug mode and device_lifecycle, so incorporate that here + if (ctrl_rst_ctx.set_bootfsm_breakpoint && (!ctrl_rst_ctx.security_state.debug_locked || (ctrl_rst_ctx.security_state.debug_locked && ctrl_rst_ctx.security_state.device_lifecycle == DEVICE_MANUFACTURING))) begin + //Poll boot status until we are in FSM state BOOT_WAIT + reg_model.soc_ifc_reg_rm.CPTRA_FLOW_STATUS.read(sts, data, UVM_FRONTDOOR, reg_model.soc_ifc_APB_map, this, .extension(apb_user_obj)); + while ((data & data_mask) != data_check) begin + configuration.soc_ifc_ctrl_agent_config.wait_for_num_clocks(20); + reg_model.soc_ifc_reg_rm.CPTRA_FLOW_STATUS.read(sts, data, UVM_FRONTDOOR, reg_model.soc_ifc_APB_map, this, .extension(apb_user_obj)); + end + `uvm_info("SOC_IFC_RST", "BootFSM Breakpoint is set, writing GO", UVM_MEDIUM) + reg_model.soc_ifc_reg_rm.CPTRA_BOOTFSM_GO.write(sts, `UVM_REG_DATA_WIDTH'(1), UVM_FRONTDOOR, reg_model.soc_ifc_APB_map, this, .extension(apb_user_obj)); + `uvm_info("SOC_IFC_RST", $sformatf("Write to BootFSM GO completed, status: %p", sts), UVM_MEDIUM) end else begin - `uvm_info("SOC_IFC_RST", "BootFSM Breakpoint not set, reset sequence complete", UVM_MEDIUM) + `uvm_info("SOC_IFC_RST", "BootFSM Breakpoint not set (or disabled based on security_state), reset sequence complete", UVM_MEDIUM) end endtask diff --git a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/sequences/bringup/soc_ifc/soc_ifc_env_rom_bringup_sequence.svh b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/sequences/bringup/soc_ifc/soc_ifc_env_rom_bringup_sequence.svh new file mode 100644 index 000000000..ac1f522f8 --- /dev/null +++ b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/sequences/bringup/soc_ifc/soc_ifc_env_rom_bringup_sequence.svh @@ -0,0 +1,85 @@ +//---------------------------------------------------------------------- +// Created with uvmf_gen version 2022.3 +//---------------------------------------------------------------------- +// SPDX-License-Identifier: Apache-2.0 +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// pragma uvmf custom header begin +// pragma uvmf custom header end +//---------------------------------------------------------------------- +//---------------------------------------------------------------------- +// +// DESCRIPTION: Bringup sequence for the SOC_IFC environment +// (essentially just a cold-reset sequence) +// +//---------------------------------------------------------------------- +//---------------------------------------------------------------------- +// +class soc_ifc_env_rom_bringup_sequence extends soc_ifc_env_reset_sequence_base; + + + `uvm_object_utils( soc_ifc_env_rom_bringup_sequence ) + + typedef soc_ifc_ctrl_rom_poweron_sequence soc_ifc_ctrl_agent_poweron_sequence_t; + + // Decide which fuses to initialize + constraint always_set_uds_c { this.fuses_to_set.uds == 1'b1; } + constraint always_set_fe_c { this.fuses_to_set.field_entropy == 1'b1; } + // Roughly once per week, assuming the nightly Directed regression isn't running every day (since it is triggered by a PR) + constraint infrequently_set_lms_verify_c { this.fuses_to_set.lms_verify dist {0 :/ 4, 1 :/ 1}; } + constraint always_set_key_manifest_pk_hash_c { this.fuses_to_set.key_manifest_pk_hash == {12{1'b1}}; } + constraint always_set_owner_pk_hash_c { this.fuses_to_set.owner_pk_hash == {12{1'b1}}; } + constraint always_set_idevid_c { this.fuses_to_set.idevid_cert_attr[0] == 1'b1; + this.fuses_to_set.idevid_cert_attr[6] == 1'b1; + this.fuses_to_set.idevid_cert_attr[7] == 1'b1; } + // Configure the values to set to initialized fuses + constraint key_manifest_pk_hash_values_c { key_manifest_pk_hash_rand[0] == 32'h6DC8DE16; + key_manifest_pk_hash_rand[1] == 32'hD559D129; + key_manifest_pk_hash_rand[2] == 32'h7BAB1E43; + key_manifest_pk_hash_rand[3] == 32'hEBD7C533; + key_manifest_pk_hash_rand[4] == 32'hDFE57001; + key_manifest_pk_hash_rand[5] == 32'h1AA56220; + key_manifest_pk_hash_rand[6] == 32'h0F66AD6D; + key_manifest_pk_hash_rand[7] == 32'h87051086; + key_manifest_pk_hash_rand[8] == 32'hC785E930; + key_manifest_pk_hash_rand[9] == 32'hD3D947B4; + key_manifest_pk_hash_rand[10] == 32'h7495822E; + key_manifest_pk_hash_rand[11] == 32'hCB643FF1; + solve this.fuses_to_set before this.key_manifest_pk_hash_rand; } + constraint owner_pk_hash_values_c { owner_pk_hash_rand[0] == 32'hF58D4920; + owner_pk_hash_rand[1] == 32'hBA65DA44; + owner_pk_hash_rand[2] == 32'hB0F728BC; + owner_pk_hash_rand[3] == 32'hFB893202; + owner_pk_hash_rand[4] == 32'hCFAAA942; + owner_pk_hash_rand[5] == 32'hBC66A0C0; + owner_pk_hash_rand[6] == 32'h007A2CE2; + owner_pk_hash_rand[7] == 32'h29A8E08F; + owner_pk_hash_rand[8] == 32'h9E8EEBAE; + owner_pk_hash_rand[9] == 32'hB36E9CC0; + owner_pk_hash_rand[10] == 32'h962E4B7A; + owner_pk_hash_rand[11] == 32'h50214999; + solve this.fuses_to_set before this.owner_pk_hash_rand; } + constraint idevid_values_c { idevid_cert_attr_rand[0] == '0; /* SHA1 */ + idevid_cert_attr_rand[6] == 32'hFFFF_FFFF; /* UEID LSWord */ + idevid_cert_attr_rand[7] == 32'hFFFF_FFFF; /* MSWord */} + + function new(string name = "" ); + uvm_object obj; + super.new(name); + obj = soc_ifc_ctrl_agent_poweron_sequence_t::get_type().create_object("soc_ifc_ctrl_agent_poweron_seq"); + if (!$cast(soc_ifc_ctrl_seq,obj)) + `uvm_fatal("SOC_IFC_BRINGUP", "Failed to cast object as poweron sequence!") + endfunction + +endclass diff --git a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/sequences/mbox/cptra/soc_ifc_env_cptra_mbox_dlen_overread_handler_sequence.svh b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/sequences/mbox/cptra/soc_ifc_env_cptra_mbox_dlen_overread_handler_sequence.svh index 8ff817a80..67ee7411b 100644 --- a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/sequences/mbox/cptra/soc_ifc_env_cptra_mbox_dlen_overread_handler_sequence.svh +++ b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/sequences/mbox/cptra/soc_ifc_env_cptra_mbox_dlen_overread_handler_sequence.svh @@ -45,8 +45,9 @@ task soc_ifc_env_cptra_mbox_dlen_overread_handler_sequence::mbox_pop_dataout(); int unsigned overrun_bytes; uvm_reg_data_t data; - if (!std::randomize(overrun_bytes) with {overrun_bytes + op.dlen <= (reg_model.mbox_mem_rm.get_size() * reg_model.mbox_mem_rm.get_n_bytes()); overrun_bytes < op.dlen * 4;}) - `uvm_error("CPTRA_MBOX_HANDLER", "Failed to randomize overrun bytes") + if (!std::randomize(overrun_bytes) with {overrun_bytes >= 4; //always overrun by at least 1 dword + overrun_bytes <= (op.dlen+1)*4;}) //overrun small dlens by smaller amounts + `uvm_error("CPTRA_MBOX_HANDLER", "Failed to randomize overrun bytes") else `uvm_info("CPTRA_MBOX_HANDLER", $sformatf("Randomized overrun bytes to %d", overrun_bytes), UVM_MEDIUM) diff --git a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/sequences/mbox/cptra/soc_ifc_env_cptra_mbox_dlen_underread_handler_sequence.svh b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/sequences/mbox/cptra/soc_ifc_env_cptra_mbox_dlen_underread_handler_sequence.svh index 0068d5cdd..2a12920a0 100644 --- a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/sequences/mbox/cptra/soc_ifc_env_cptra_mbox_dlen_underread_handler_sequence.svh +++ b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/sequences/mbox/cptra/soc_ifc_env_cptra_mbox_dlen_underread_handler_sequence.svh @@ -43,15 +43,25 @@ endclass task soc_ifc_env_cptra_mbox_dlen_underread_handler_sequence::mbox_pop_dataout(); int ii; int unsigned underrun_bytes; + int unsigned bytes_to_read; uvm_reg_data_t data; // minimum 5 bytes so we can grab the resp dlen - if (!std::randomize(underrun_bytes) with {underrun_bytes < op.dlen - 4;}) + if (!std::randomize(underrun_bytes) with {if (op.dlen > 4) underrun_bytes < op.dlen - 4; + else underrun_bytes == 0;}) `uvm_error("CPTRA_MBOX_HANDLER", "Failed to randomize overrun bytes") else `uvm_info("CPTRA_MBOX_HANDLER", $sformatf("Randomized underrun bytes to %d", underrun_bytes), UVM_MEDIUM) - for (ii=0; ii < op.dlen-underrun_bytes; ii+=4) begin + bytes_to_read = op.dlen-underrun_bytes; + if (bytes_to_read > 32'h8000_0000) begin + `uvm_warning("MBOX_SEQ", $sformatf("Bytes to read is calculated as a huge number - was this intentional? bytes_to_read: %d (0x%x)", bytes_to_read, bytes_to_read)) + end + else begin + `uvm_info("MBOX_SEQ", $sformatf("Bytes to read is calculated as %d (0x%x)", bytes_to_read, bytes_to_read), UVM_HIGH) + end + + for (ii=0; ii < bytes_to_read; ii+=4) begin reg_model.mbox_csr_rm.mbox_dataout.read(reg_sts, data, UVM_FRONTDOOR, reg_model.soc_ifc_AHB_map, this); if (reg_sts != UVM_IS_OK) `uvm_error("MBOX_SEQ", "Register access failed (mbox_dataout)") diff --git a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/sequences/mbox/cptra/soc_ifc_env_cptra_mbox_handler_sequence.svh b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/sequences/mbox/cptra/soc_ifc_env_cptra_mbox_handler_sequence.svh index 8d33810d9..608f241e2 100644 --- a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/sequences/mbox/cptra/soc_ifc_env_cptra_mbox_handler_sequence.svh +++ b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/sequences/mbox/cptra/soc_ifc_env_cptra_mbox_handler_sequence.svh @@ -31,6 +31,9 @@ class soc_ifc_env_cptra_mbox_handler_sequence extends soc_ifc_env_sequence_base `uvm_object_utils( soc_ifc_env_cptra_mbox_handler_sequence ) + int sts_rsp_count = 0; + int ntf_rsp_count = 0; + int err_rsp_count = 0; mbox_op_s op; int mbox_resp_expected_dlen = 0; // Number of response data bytes to provide uvm_status_e reg_sts; @@ -38,9 +41,11 @@ class soc_ifc_env_cptra_mbox_handler_sequence extends soc_ifc_env_sequence_base rand longint unsigned force_unlock_delay_cycles; bit unlock_proc_active = 1'b0; + bit op_active = 1'b0; bit seq_done = 1'b0; uvm_event in_report_reg_sts; + extern virtual task handler_setup(); extern virtual task mbox_wait_for_command(output op_sts_e op_sts); extern virtual task mbox_get_command(); extern virtual task mbox_pop_dataout(); @@ -91,7 +96,6 @@ class soc_ifc_env_cptra_mbox_handler_sequence extends soc_ifc_env_sequence_base //========================================== virtual task body(); - int sts_rsp_count = 0; op_sts_e op_sts; reg_model = configuration.soc_ifc_rm; @@ -99,10 +103,17 @@ class soc_ifc_env_cptra_mbox_handler_sequence extends soc_ifc_env_sequence_base `uvm_fatal("CPTRA_MBOX_HANDLER", "SOC_IFC ENV caliptra mailbox handler sequence expected a handle to the cptra status agent responder sequence (from bench-level sequence) but got null!") fork forever begin - @(cptra_status_agent_rsp_seq.new_rsp) sts_rsp_count++; + @(cptra_status_agent_rsp_seq.new_rsp) begin + sts_rsp_count += (cptra_status_agent_rsp_seq.rsp.soc_ifc_notif_intr_pending || + cptra_status_agent_rsp_seq.rsp.soc_ifc_err_intr_pending) ? 0 : 1; + ntf_rsp_count += cptra_status_agent_rsp_seq.rsp.soc_ifc_notif_intr_pending; + err_rsp_count += cptra_status_agent_rsp_seq.rsp.soc_ifc_err_intr_pending; + end end join_none + handler_setup(); + fork begin: ALL_TIME_CONSUMING_TASKS // Wait for a mailbox command to be received @@ -119,7 +130,15 @@ class soc_ifc_env_cptra_mbox_handler_sequence extends soc_ifc_env_sequence_base // If resp data is required, set DATAIN if (op.cmd.cmd_s.resp_reqd) begin - mbox_push_datain(); + if (mbox_resp_expected_dlen == 0) begin + // We should only have 'resp_reqd' and 'exp_dlen == 0' if + // a spurious write triggered MBOX_ERROR and caused us to fail + // on reading back the dataout + mbox_check_fsm(); + end + else begin + mbox_push_datain(); + end end // Set STATUS @@ -131,9 +150,15 @@ class soc_ifc_env_cptra_mbox_handler_sequence extends soc_ifc_env_sequence_base // Wait for the command to complete. // Either we clear the lock (via force_unlock), or the SOC requestor does. + // If the SOC requestor triggered a mbox protocol violation and this sequence + // is not randomly injecting force_unlock, the force_unlock thread will still set + // mbox_unlock to reset the mailbox state machine and service the error. + `uvm_info("CPTRA_MBOX_HANDLER", "Waiting for mbox_lock to deassert, indicating end of mailbox flow", UVM_MEDIUM) while (reg_model.mbox_csr_rm.mbox_lock.lock.get_mirrored_value()) begin configuration.soc_ifc_ctrl_agent_config.wait_for_num_clocks(1); end + + `uvm_info("CPTRA_MBOX_HANDLER", "Observed mbox_lock deassertion, indicating end of mailbox flow", UVM_MEDIUM) seq_done = 1; end: ALL_TIME_CONSUMING_TASKS begin: DO_FORCE_UNLOCK @@ -141,12 +166,16 @@ class soc_ifc_env_cptra_mbox_handler_sequence extends soc_ifc_env_sequence_base // After forcibly unlocking mailbox, kill any remaining activity. // If force unlock is randomized to "off" for this run // of the sequence, this won't ever run. - in_report_reg_sts.wait_on(); /* Wait for pending bus transfers (in ALL_TIME_CONSUMING_TASKS) to finish to avoid deadlock */ + if (op_active) + in_report_reg_sts.wait_on(); /* Wait for pending bus transfers (in ALL_TIME_CONSUMING_TASKS) to finish to avoid deadlock */ disable ALL_TIME_CONSUMING_TASKS; `uvm_info("CPTRA_MBOX_HANDLER", "Disabled ALL_TIME_CONSUMING_TASKS", UVM_HIGH) end: DO_FORCE_UNLOCK join_any - if (unlock_proc_active) in_report_reg_sts.wait_trigger(); /* Wait for pending bus transfers (in DO_FORCE_UNLOCK) to finish to avoid deadlock */ + if (unlock_proc_active) begin + `uvm_info("CPTRA_MBOX_HANDLER", "Detected force-unlock in progress, waiting for current bus transfer to finish before continuing", UVM_MEDIUM) + in_report_reg_sts.wait_trigger(); /* Wait for pending bus transfers (in DO_FORCE_UNLOCK) to finish to avoid deadlock */ + end disable DO_FORCE_UNLOCK; // Check new responses (might be an interrupt? Nothing else expected) @@ -159,6 +188,46 @@ class soc_ifc_env_cptra_mbox_handler_sequence extends soc_ifc_env_sequence_base endclass +//========================================== +// Task: handler_setup +// Description: Prep the system to receive a new mailbox command. +// This includes servicing/clearing any interrupts already +// pending on sequence entry (except new command intr) +//========================================== +task soc_ifc_env_cptra_mbox_handler_sequence::handler_setup(); + uvm_reg_data_t data; + + if (sts_rsp_count) begin + `uvm_warning("CPTRA_MBOX_HANDLER", "Did not expect to receive any new cptra_status transactions at sequence entry!") + sts_rsp_count = 0; + end + + // Clear notifications + if (ntf_rsp_count) begin + `uvm_warning("CPTRA_MBOX_HANDLER", "Did not expect to receive any new cptra_status notification interrupt transactions at sequence entry!") + ntf_rsp_count = 0; + end + reg_model.soc_ifc_reg_rm.intr_block_rf_ext.notif_internal_intr_r.read(reg_sts, data, UVM_FRONTDOOR, reg_model.soc_ifc_AHB_map, this); + report_reg_sts(reg_sts, "notif_internal_intr_r"); + if (data[reg_model.soc_ifc_reg_rm.intr_block_rf_ext.notif_internal_intr_r.notif_cmd_avail_sts.get_lsb_pos()] && + cptra_status_agent_rsp_seq.rsp.soc_ifc_notif_intr_pending) begin + ntf_rsp_count = 1; // Roll this interrupt event forward to 'mbox_wait_for_command' + end + // Clear all interrupts except for cmd available + data &= ~(uvm_reg_data_t'(1) << reg_model.soc_ifc_reg_rm.intr_block_rf_ext.notif_internal_intr_r.notif_cmd_avail_sts.get_lsb_pos()); + reg_model.soc_ifc_reg_rm.intr_block_rf_ext.notif_internal_intr_r.write(reg_sts, data, UVM_FRONTDOOR, reg_model.soc_ifc_AHB_map, this); + report_reg_sts(reg_sts, "notif_internal_intr_r"); + // Clear errors + if (err_rsp_count) begin + `uvm_warning("CPTRA_MBOX_HANDLER", "Did not expect to receive any new cptra_status err interrupt transactions at sequence entry!") + err_rsp_count = 0; + end + reg_model.soc_ifc_reg_rm.intr_block_rf_ext.error_internal_intr_r.read(reg_sts, data, UVM_FRONTDOOR, reg_model.soc_ifc_AHB_map, this); + report_reg_sts(reg_sts, "error_internal_intr_r"); + reg_model.soc_ifc_reg_rm.intr_block_rf_ext.error_internal_intr_r.write(reg_sts, data, UVM_FRONTDOOR, reg_model.soc_ifc_AHB_map, this); + report_reg_sts(reg_sts, "error_internal_intr_r"); +endtask + //========================================== // Task: mbox_wait_for_command // Description: Poll for availability of new @@ -169,12 +238,20 @@ endclass task soc_ifc_env_cptra_mbox_handler_sequence::mbox_wait_for_command(output op_sts_e op_sts); uvm_reg_data_t data; op_sts = CPTRA_TIMEOUT; + // Wait for notification interrupt indicating command is available + while (ntf_rsp_count == 0) begin + configuration.soc_ifc_ctrl_agent_config.wait_for_num_clocks(1); + if (ntf_rsp_count != 0 && !cptra_status_agent_rsp_seq.rsp.soc_ifc_notif_intr_pending) begin + ntf_rsp_count = 0; + end + end + ntf_rsp_count = 0; + op_active = 1; + // Clear interrupt reg_model.soc_ifc_reg_rm.intr_block_rf_ext.notif_internal_intr_r.read(reg_sts, data, UVM_FRONTDOOR, reg_model.soc_ifc_AHB_map, this); report_reg_sts(reg_sts, "notif_internal_intr_r"); - while (!data[reg_model.soc_ifc_reg_rm.intr_block_rf_ext.notif_internal_intr_r.notif_cmd_avail_sts.get_lsb_pos()]) begin - configuration.soc_ifc_ctrl_agent_config.wait_for_num_clocks(200); - reg_model.soc_ifc_reg_rm.intr_block_rf_ext.notif_internal_intr_r.read(reg_sts, data, UVM_FRONTDOOR, reg_model.soc_ifc_AHB_map, this); - report_reg_sts(reg_sts, "notif_internal_intr_r"); + if (!data[reg_model.soc_ifc_reg_rm.intr_block_rf_ext.notif_internal_intr_r.notif_cmd_avail_sts.get_lsb_pos()]) begin + `uvm_error("CPTRA_MBOX_HANDLER", "After receiving notification interrupt, notif_cmd_avail_sts is not set!") end data &= uvm_reg_data_t'(1) << reg_model.soc_ifc_reg_rm.intr_block_rf_ext.notif_internal_intr_r.notif_cmd_avail_sts.get_lsb_pos(); reg_model.soc_ifc_reg_rm.intr_block_rf_ext.notif_internal_intr_r.write(reg_sts, data, UVM_FRONTDOOR, reg_model.soc_ifc_AHB_map, this); @@ -265,7 +342,13 @@ task soc_ifc_env_cptra_mbox_handler_sequence::mbox_check_fsm(); report_reg_sts(reg_sts, "mbox_status"); fsm_state = mbox_fsm_state_e'(data >> reg_model.mbox_csr_rm.mbox_status.mbox_fsm_ps.get_lsb_pos()); - if (op.cmd.cmd_s.resp_reqd && fsm_state != MBOX_EXECUTE_SOC) begin + // In the error state, simply wait for the force-unlock to reset the mailbox and end the sequence (killing this routine in the process) + if (fsm_state == MBOX_ERROR) begin + `uvm_info("CPTRA_MBOX_HANDLER", $sformatf("On detecting mailbox FSM state: %p, wait for force_unlock to end the sequence", fsm_state), UVM_MEDIUM) + op_active = 1'b0; // So the force-unlock branch knows it's safe to terminate this task + forever configuration.soc_ifc_ctrl_agent_config.wait_for_num_clocks(10000); + end + else if (op.cmd.cmd_s.resp_reqd && fsm_state != MBOX_EXECUTE_SOC) begin `uvm_error("CPTRA_MBOX_HANDLER", $sformatf("Unexpected mailbox FSM state: %p", fsm_state)) end endtask @@ -278,13 +361,41 @@ endtask //========================================== task soc_ifc_env_cptra_mbox_handler_sequence::mbox_wait_and_force_unlock(); uvm_reg_data_t data; + mbox_fsm_state_e state; // Wait... - if (!inject_force_unlock) begin - // This task never exits if force unlock is disabled - forever configuration.soc_ifc_ctrl_agent_config.wait_for_num_clocks(1000); + // If force unlock is disabled, this task will only exit upon detecting + // an ERROR that requires servicing, whereupon force_unlock will still + // be set to recover. In either case, only an event resulting in force + // unlock causes this routine to break + while(!inject_force_unlock) begin + if (err_rsp_count > 0 && cptra_status_agent_rsp_seq.rsp.soc_ifc_err_intr_pending) begin + `uvm_info("CPTRA_MBOX_HANDLER", "Received soc_ifc_err_intr, clearing and (if needed) proceeding to mbox_unlock", UVM_MEDIUM) + // Read and clear any error interrupts + reg_model.soc_ifc_reg_rm.intr_block_rf_ext.error_internal_intr_r.read(reg_sts, data, UVM_FRONTDOOR, reg_model.soc_ifc_AHB_map, this); + report_reg_sts(reg_sts, "error_internal_intr_r"); + configuration.soc_ifc_ctrl_agent_config.wait_for_num_clocks(10/*TODO rand delays*/); + reg_model.soc_ifc_reg_rm.intr_block_rf_ext.error_internal_intr_r.write(reg_sts, data, UVM_FRONTDOOR, reg_model.soc_ifc_AHB_map, this); + report_reg_sts(reg_sts, "error_internal_intr_r"); + err_rsp_count = 0; + // Next, check if we need to proceed to mbox_unlock step + if (!data[reg_model.soc_ifc_reg_rm.intr_block_rf_ext.error_internal_intr_r.error_cmd_fail_sts.get_lsb_pos()]) begin + continue; + end + reg_model.mbox_csr_rm.mbox_status.read(reg_sts, data, UVM_FRONTDOOR, reg_model.soc_ifc_AHB_map, this); + report_reg_sts(reg_sts, "mbox_status"); + state = mbox_fsm_state_e'(data >> reg_model.mbox_csr_rm.mbox_status.mbox_fsm_ps.get_lsb_pos()); + // If we're in the error state, the only recovery is by mbox_unlock - proceed to that step + if (state == MBOX_ERROR) begin + `uvm_info("CPTRA_MBOX_HANDLER", "After servicing soc_ifc_err_intr, proceeding with mbox_unlock", UVM_MEDIUM) + break; + end + end + configuration.soc_ifc_ctrl_agent_config.wait_for_num_clocks(10/*TODO rand delays*/); + end + if (inject_force_unlock) begin + configuration.soc_ifc_ctrl_agent_config.wait_for_num_clocks(force_unlock_delay_cycles); end - configuration.soc_ifc_ctrl_agent_config.wait_for_num_clocks(force_unlock_delay_cycles); // Start the unlock proc unlock_proc_active = 1'b1; diff --git a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/sequences/mbox/cptra/soc_ifc_env_cptra_mbox_interference_handler_sequence.svh b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/sequences/mbox/cptra/soc_ifc_env_cptra_mbox_interference_handler_sequence.svh index d1be3b659..755c60628 100644 --- a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/sequences/mbox/cptra/soc_ifc_env_cptra_mbox_interference_handler_sequence.svh +++ b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/sequences/mbox/cptra/soc_ifc_env_cptra_mbox_interference_handler_sequence.svh @@ -32,6 +32,8 @@ class soc_ifc_env_cptra_mbox_interference_handler_sequence extends soc_ifc_env_c `uvm_object_utils( soc_ifc_env_cptra_mbox_interference_handler_sequence ) extern virtual task mbox_wait_for_command(output op_sts_e op_sts); + extern virtual task mbox_wait_and_force_unlock(); + extern virtual task burst_random_reg_accesses(uvm_event stop); rand uvm_reg_data_t data; rand uvm_reg_addr_t mem_offset; @@ -41,22 +43,39 @@ class soc_ifc_env_cptra_mbox_interference_handler_sequence extends soc_ifc_env_c endclass +//========================================== +// Task: mbox_wait_for_command +// Description: Poll for availability of new +// mailbox request, indicated by: +// - mbox_execute = 1 +// - intr status = 1 +//========================================== task soc_ifc_env_cptra_mbox_interference_handler_sequence::mbox_wait_for_command(output op_sts_e op_sts); byte ii; + uvm_reg_data_t data; op_sts = CPTRA_TIMEOUT; - reg_model.soc_ifc_reg_rm.intr_block_rf_ext.notif_internal_intr_r.read(reg_sts, data, UVM_FRONTDOOR, reg_model.soc_ifc_AHB_map, this); - report_reg_sts(reg_sts, "notif_internal_intr_r"); - while (!data[reg_model.soc_ifc_reg_rm.intr_block_rf_ext.notif_internal_intr_r.notif_cmd_avail_sts.get_lsb_pos()]) begin + op_active = 1; + // Wait for notification interrupt indicating command is available + while (ntf_rsp_count == 0) begin + uvm_reg_data_t dlen; + byte unsigned mem_n_bytes; + + dlen = reg_model.mbox_csr_rm.mbox_dlen.length.get_mirrored_value(); + mem_n_bytes = reg_model.mbox_mem_rm.get_n_bytes(); + if(!this.randomize(xfers) with {xfers inside {[1:20]}; }) begin `uvm_error("CPTRA_MBOX_HANDLER", "Failed to randomize memory AHB transfer count in mbox_wait_for_command") end else begin for (ii=0; ii 0 && cptra_status_agent_rsp_seq.rsp.soc_ifc_err_intr_pending) begin + `uvm_info("CPTRA_MBOX_HANDLER", "Received soc_ifc_err_intr, clearing and (if needed) proceeding to mbox_unlock", UVM_MEDIUM) + // Read and clear any error interrupts + reg_model.soc_ifc_reg_rm.intr_block_rf_ext.error_internal_intr_r.read(reg_sts, data, UVM_FRONTDOOR, reg_model.soc_ifc_AHB_map, this); + report_reg_sts(reg_sts, "error_internal_intr_r"); + configuration.soc_ifc_ctrl_agent_config.wait_for_num_clocks(10/*TODO rand delays*/); + reg_model.soc_ifc_reg_rm.intr_block_rf_ext.error_internal_intr_r.write(reg_sts, data, UVM_FRONTDOOR, reg_model.soc_ifc_AHB_map, this); + report_reg_sts(reg_sts, "error_internal_intr_r"); + err_rsp_count = 0; + // Next, check if we need to proceed to mbox_unlock step + if (!data[reg_model.soc_ifc_reg_rm.intr_block_rf_ext.error_internal_intr_r.error_cmd_fail_sts.get_lsb_pos()]) begin + continue; + end + reg_model.mbox_csr_rm.mbox_status.read(reg_sts, data, UVM_FRONTDOOR, reg_model.soc_ifc_AHB_map, this); + report_reg_sts(reg_sts, "mbox_status"); + state = mbox_fsm_state_e'(data >> reg_model.mbox_csr_rm.mbox_status.mbox_fsm_ps.get_lsb_pos()); + // If we're in the error state, the only recovery is by mbox_unlock - proceed to that step + if (state == MBOX_ERROR) begin + `uvm_info("CPTRA_MBOX_HANDLER", "After servicing soc_ifc_err_intr, proceeding with mbox_unlock", UVM_MEDIUM) + break; + end + end + else begin + configuration.soc_ifc_ctrl_agent_config.wait_for_num_clocks(10/*TODO rand delays*/); + end + end + end + force_unlock_delay_complete.trigger(); + end + burst_random_reg_accesses(force_unlock_delay_complete); + join + + // After waiting the requisite number of cycles, check mbox_status. + // If SOC doesn't currently have the lock, doing a force-unlock has no + // effect. Poll until soc_has_lock is set. + // NOTE: Making this check the reg-model mirror instead of actual polling + // might be beneficial? + reg_model.mbox_csr_rm.mbox_status.read(reg_sts, data, UVM_FRONTDOOR, reg_model.soc_ifc_AHB_map, this); + report_reg_sts(reg_sts, "mbox_status"); + while (!data[reg_model.mbox_csr_rm.mbox_status.soc_has_lock.get_lsb_pos()]) begin + configuration.soc_ifc_ctrl_agent_config.wait_for_num_clocks(50); /* short 500ns between reads */ + reg_model.mbox_csr_rm.mbox_status.read(reg_sts, data, UVM_FRONTDOOR, reg_model.soc_ifc_AHB_map, this); + report_reg_sts(reg_sts, "mbox_status"); + end + + // Write unlock reg + `uvm_info("CPTRA_MBOX_HANDLER","Executing force unlock of mailbox. CPTRA mbox flow handler will exit after unlock.", UVM_MEDIUM) + reg_model.mbox_csr_rm.mbox_unlock.write(reg_sts, uvm_reg_data_t'(1) << reg_model.mbox_csr_rm.mbox_unlock.unlock.get_lsb_pos(), UVM_FRONTDOOR, reg_model.soc_ifc_AHB_map, this); + report_reg_sts(reg_sts, "mbox_unlock"); + + // Clear any interrupts as well, if they weren't cleared before unlock + data = uvm_reg_data_t'(1) << reg_model.soc_ifc_reg_rm.intr_block_rf_ext.notif_internal_intr_r.notif_cmd_avail_sts.get_lsb_pos(); + `uvm_info("CPTRA_MBOX_HANDLER", "Doing clear notif intr", UVM_LOW) + reg_model.soc_ifc_reg_rm.intr_block_rf_ext.notif_internal_intr_r.write(reg_sts, data, UVM_FRONTDOOR, reg_model.soc_ifc_AHB_map, this); + report_reg_sts(reg_sts, "notif_internal_intr_r"); + in_report_reg_sts.reset(); /* Clear the trigger from report_reg_sts so that DO_FORCE_UNLOCK can catch the end of a reg-write from ALL_TIME_CONSUMING_TASKS */ + + // End + unlock_proc_active = 1'b0; + seq_done = 1'b1; + `uvm_info("CPTRA_MBOX_HANDLER", "Done clearing notif intr", UVM_LOW) +endtask + +//========================================== +// Task: burst_random_reg_accesses +// Description: Continuously issue bursts (of random length) +// of bus reads to randomly selected SOC_IFC registers, +// intermixed with random delays, until the input event +// is triggered. +//========================================== +task soc_ifc_env_cptra_mbox_interference_handler_sequence::burst_random_reg_accesses(uvm_event stop); + int unsigned burst_length; + int unsigned delay_cycles; + + uvm_reg regs[$]; + uvm_reg blocklist[]; + int del_idx[$]; + + byte unsigned ii; + int reg_select; + ahb_rnw_e rand_RnW; + uvm_reg_data_t rand_data; + uvm_status_e rand_sts; + + reg_model.soc_ifc_AHB_map.get_registers(regs, UVM_HIER); + + // Registers we won't randomly access due to side-effects + // Don't include any mailbox registers + blocklist = '{reg_model.mbox_csr_rm.mbox_lock, + reg_model.mbox_csr_rm.mbox_user, + reg_model.mbox_csr_rm.mbox_cmd, + reg_model.mbox_csr_rm.mbox_dlen, + reg_model.mbox_csr_rm.mbox_datain, + reg_model.mbox_csr_rm.mbox_dataout, + reg_model.mbox_csr_rm.mbox_execute, + reg_model.mbox_csr_rm.mbox_status, + reg_model.mbox_csr_rm.mbox_unlock, + reg_model.sha512_acc_csr_rm.LOCK}; + foreach (blocklist[idx]) begin + del_idx = regs.find_first_index(found_reg) with (found_reg == blocklist[idx]); + regs.delete(del_idx.pop_front()); + end + + forever begin + if (!std::randomize(burst_length, delay_cycles) with {burst_length inside {[1:100]}; + delay_cycles inside {[1:500]};}) + `uvm_error("CPTRA_MBOX_HANDLER", "Failed to randomize burst_length and delay_cycles") + else begin + for (ii=0; ii 0; ii--) begin + configuration.soc_ifc_ctrl_agent_config.wait_for_num_clocks(1); + if (stop.is_on()) return; + end + end +endtask diff --git a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/sequences/mbox/cptra/soc_ifc_env_cptra_mbox_req_sequence_base.svh b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/sequences/mbox/cptra/soc_ifc_env_cptra_mbox_req_sequence_base.svh index 37a9b8e6a..46863df42 100644 --- a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/sequences/mbox/cptra/soc_ifc_env_cptra_mbox_req_sequence_base.svh +++ b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/sequences/mbox/cptra/soc_ifc_env_cptra_mbox_req_sequence_base.svh @@ -39,6 +39,7 @@ class soc_ifc_env_cptra_mbox_req_sequence_base extends soc_ifc_env_sequence_base rand mbox_op_s mbox_op_rand; int sts_rsp_count; uvm_status_e reg_sts; + bit mbox_sts_is_error = 0; rand bit do_ahb_lock_check; rand bit retry_failed_reg_axs; // Certain random sequences force the command to be outside of the defined @@ -58,7 +59,7 @@ class soc_ifc_env_cptra_mbox_req_sequence_base extends soc_ifc_env_sequence_base extern virtual task mbox_set_cmd(input mbox_op_s op); extern virtual task mbox_push_datain(); extern virtual task mbox_execute(); - extern virtual task mbox_check_status(output mbox_status_e data); + extern virtual task mbox_check_status(output mbox_status_e data, output mbox_fsm_state_e state); extern virtual task mbox_poll_status(); extern virtual task mbox_clr_execute(); extern virtual task mbox_teardown(); @@ -171,7 +172,32 @@ endclass // - Any functionality implemented in derived classes //========================================== task soc_ifc_env_cptra_mbox_req_sequence_base::mbox_setup(); - // TODO nothing to do yet + uvm_reg_data_t data; + uvm_reg_field flds[$]; + + // Clear any interrupts already asserted at sequence start + // Notifications + reg_model.soc_ifc_reg_rm.intr_block_rf_ext.notif_internal_intr_r.read(reg_sts, data, UVM_FRONTDOOR, reg_model.soc_ifc_AHB_map, this); + report_reg_sts(reg_sts, "notif_internal_intr_r"); + reg_model.soc_ifc_reg_rm.intr_block_rf_ext.notif_internal_intr_r.write(reg_sts, data, UVM_FRONTDOOR, reg_model.soc_ifc_AHB_map, this); + report_reg_sts(reg_sts, "notif_internal_intr_r"); + reg_model.soc_ifc_reg_rm.intr_block_rf_ext.notif_internal_intr_r.get_fields(flds); + foreach (flds[ii]) begin + if (data[flds[ii].get_lsb_pos()]) + `uvm_info("CPTRA_MBOX_SEQ", {"At sequence start, observed notification_interrupt for bit: ", flds[ii].get_name()}, UVM_HIGH) + end + + // Errors + reg_model.soc_ifc_reg_rm.intr_block_rf_ext.error_internal_intr_r.read(reg_sts, data, UVM_FRONTDOOR, reg_model.soc_ifc_AHB_map, this); + report_reg_sts(reg_sts, "error_internal_intr_r"); + reg_model.soc_ifc_reg_rm.intr_block_rf_ext.error_internal_intr_r.write(reg_sts, data, UVM_FRONTDOOR, reg_model.soc_ifc_AHB_map, this); + report_reg_sts(reg_sts, "error_internal_intr_r"); + flds.delete(); + reg_model.soc_ifc_reg_rm.intr_block_rf_ext.error_internal_intr_r.get_fields(flds); + foreach (flds[ii]) begin + if (data[flds[ii].get_lsb_pos()]) + `uvm_info("CPTRA_MBOX_SEQ", {"At sequence start, observed error_interrupt for bit: ", flds[ii].get_name()}, UVM_HIGH) + end endtask //========================================== @@ -313,7 +339,7 @@ endtask // Task: mbox_check_status // Description: Read mbox_status //========================================== -task soc_ifc_env_cptra_mbox_req_sequence_base::mbox_check_status(output mbox_status_e data); +task soc_ifc_env_cptra_mbox_req_sequence_base::mbox_check_status(output mbox_status_e data, output mbox_fsm_state_e state); uvm_reg_data_t reg_data; reg_model.mbox_csr_rm.mbox_status.read(reg_sts, reg_data, UVM_FRONTDOOR, reg_model.soc_ifc_AHB_map, this); report_reg_sts(reg_sts, "mbox_status"); @@ -323,6 +349,7 @@ task soc_ifc_env_cptra_mbox_req_sequence_base::mbox_check_status(output mbox_sta end else begin data = mbox_status_e'(reg_data >> reg_model.mbox_csr_rm.mbox_status.status.get_lsb_pos()); + state = mbox_fsm_state_e'(reg_data >> reg_model.mbox_csr_rm.mbox_status.mbox_fsm_ps.get_lsb_pos()); end endtask @@ -330,17 +357,28 @@ endtask // Task: mbox_poll_status // Description: Issue calls to mbox_check_status // until status change indicates control is -// returned to SOC. +// returned to uC. //========================================== task soc_ifc_env_cptra_mbox_req_sequence_base::mbox_poll_status(); mbox_status_e data; + mbox_fsm_state_e state; uvm_reg_data_t mask; // Poll mbox_status register do begin configuration.soc_ifc_ctrl_agent_config.wait_for_num_clocks(200); - mbox_check_status(data); - end while (data == CMD_BUSY); + mbox_check_status(data, state); + end while (data == CMD_BUSY && !(state inside {MBOX_IDLE, MBOX_ERROR})); + + // We should have an error interrupt in response to the ERROR state, which + // will be serviced at a later step. + // We do not expect the cmd_avail_sts interrupt, and there is no point in + // continuing this task (to report on the mbox_status field) when we've hit + // a protocol error. + if (state == MBOX_ERROR) begin + mbox_sts_is_error = 1; + return; + end // Clear Interrupt Status, which is set on transfer SOC->uC mask = uvm_reg_data_t'(1) << reg_model.soc_ifc_reg_rm.intr_block_rf_ext.notif_internal_intr_r.notif_cmd_avail_sts.get_lsb_pos(); @@ -351,25 +389,50 @@ task soc_ifc_env_cptra_mbox_req_sequence_base::mbox_poll_status(); // Evaluate status field if (data == DATA_READY) begin - `uvm_error("CPTRA_MBOX_SEQ", $sformatf("Received status %p when not expecting any bytes of response data!", data)) + `uvm_info("CPTRA_MBOX_SEQ", $sformatf("Received status %p when not expecting any bytes of response data!", data), UVM_LOW) end else if (data == CMD_FAILURE) begin - `uvm_error("CPTRA_MBOX_SEQ", $sformatf("Received unexpected mailbox status %p", data)) + `uvm_info("CPTRA_MBOX_SEQ", $sformatf("Received unexpected mailbox status %p", data), UVM_LOW) end else if (data == CMD_COMPLETE) begin `uvm_info("CPTRA_MBOX_SEQ", $sformatf("Received status %p from SOC in response to command", data), UVM_FULL) end else begin - `uvm_error("CPTRA_MBOX_SEQ", $sformatf("Received unexpected mailbox status %p", data)) + `uvm_info("CPTRA_MBOX_SEQ", $sformatf("Received unexpected mailbox status %p", data), UVM_LOW) end endtask //========================================== // Task: mbox_clr_execute // Description: End the mailbox flow by writing -// 0 to mbox_execute register +// 0 to mbox_execute register (or +// by force-unlock if necessary) //========================================== task soc_ifc_env_cptra_mbox_req_sequence_base::mbox_clr_execute(); + uvm_reg_data_t data; + // We have to stall a couple clocks to allow interrupts to assert in case + // we read the MBOX_ERROR status, since there is a small delay as the signal + // propagates through registers. + configuration.soc_ifc_ctrl_agent_config.wait_for_num_clocks(2); + // Now, check for the expected error interrupt + if (sts_rsp_count > 0 && cptra_status_agent_rsp_seq.rsp.soc_ifc_err_intr_pending) begin + reg_model.soc_ifc_reg_rm.intr_block_rf_ext.error_internal_intr_r.read(reg_sts, data, UVM_FRONTDOOR, reg_model.soc_ifc_AHB_map, this); + report_reg_sts(reg_sts, "error_internal_intr_r"); + reg_model.soc_ifc_reg_rm.intr_block_rf_ext.error_internal_intr_r.write(reg_sts, data, UVM_FRONTDOOR, reg_model.soc_ifc_AHB_map, this); + report_reg_sts(reg_sts, "error_internal_intr_r"); + if (data[reg_model.soc_ifc_reg_rm.intr_block_rf_ext.error_internal_intr_r.error_cmd_fail_sts.get_lsb_pos()]) begin + // Force unlock to recover from error and reset mailbox to IDLE state + reg_model.mbox_csr_rm.mbox_unlock.write(reg_sts, uvm_reg_data_t'(1 << reg_model.mbox_csr_rm.mbox_unlock.unlock.get_lsb_pos()), UVM_FRONTDOOR, reg_model.soc_ifc_AHB_map, this); + report_reg_sts(reg_sts, "mbox_unlock"); + return; /* force unlock trumps the write to mbox_execute, so we're done at this point */ + end + else if (mbox_sts_is_error) begin + `uvm_error("CPTRA_MBOX_SEQ", "Error interrupt following cmd failure does not have cmd_fail bit set!") + end + end + else if (mbox_sts_is_error) begin + `uvm_error("CPTRA_MBOX_SEQ", "Error encountered but no interrupt received") + end reg_model.mbox_csr_rm.mbox_execute.write(reg_sts, uvm_reg_data_t'(0), UVM_FRONTDOOR, reg_model.soc_ifc_AHB_map, this); report_reg_sts(reg_sts, "mbox_execute"); endtask @@ -380,7 +443,26 @@ endtask // to add any end-of-sequence functionality. //========================================== task soc_ifc_env_cptra_mbox_req_sequence_base::mbox_teardown(); + uvm_reg_data_t data, mask; + + // Clear any pending notification interrupts that made it through to the end of the sequence + reg_model.soc_ifc_reg_rm.intr_block_rf_ext.notif_internal_intr_r.read(reg_sts, data, UVM_FRONTDOOR, reg_model.soc_ifc_AHB_map, this); + report_reg_sts(reg_sts, "notif_internal_intr_r"); + // Any unexpected interrupts should trigger a tb error + mask = ~((1 << reg_model.soc_ifc_reg_rm.intr_block_rf_ext.notif_internal_intr_r.notif_mbox_ecc_cor_sts.get_lsb_pos()) | + (1 << reg_model.soc_ifc_reg_rm.intr_block_rf_ext.notif_internal_intr_r.notif_debug_locked_sts.get_lsb_pos()) | + (1 << reg_model.soc_ifc_reg_rm.intr_block_rf_ext.notif_internal_intr_r.notif_soc_req_lock_sts.get_lsb_pos())); + if (data & mask) begin + `uvm_error("CPTRA_MBOX_SEQ", $sformatf("Received notification interrupt for unexpected event: 0x%0x", data)) + end + else begin + reg_model.soc_ifc_reg_rm.intr_block_rf_ext.notif_internal_intr_r.write(reg_sts, data, UVM_FRONTDOOR, reg_model.soc_ifc_AHB_map, this); + report_reg_sts(reg_sts, "notif_internal_intr_r"); + `uvm_info("CPTRA_MBOX_SEQ", $sformatf("Received and cleared notification interrupt for events: 0x%0x", data), UVM_HIGH) + end + // Summary at sequence end + `uvm_info("CPTRA_MBOX_SEQ", $sformatf("uC initiated mailbox flow is completed. Ending status: %s", mbox_sts_is_error ? "hit protocol violation" : "no protocol violation"), UVM_LOW) endtask //========================================== diff --git a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/sequences/mbox/soc_ifc/soc_ifc_env_mbox_dir_read_sequence.svh b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/sequences/mbox/soc_ifc/soc_ifc_env_mbox_dir_read_sequence.svh new file mode 100644 index 000000000..bc4aba89e --- /dev/null +++ b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/sequences/mbox/soc_ifc/soc_ifc_env_mbox_dir_read_sequence.svh @@ -0,0 +1,42 @@ +//---------------------------------------------------------------------- +// Created with uvmf_gen version 2022.3 +//---------------------------------------------------------------------- +// SPDX-License-Identifier: Apache-2.0 +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +//---------------------------------------------------------------------- +//---------------------------------------------------------------------- +// +// DESCRIPTION: Extended from mbox_base sequence to provide additional +// functionality in a test that sends mailbox commands +// of a size that exceeds mailbox capacity. +// +//---------------------------------------------------------------------- +//---------------------------------------------------------------------- +// +class soc_ifc_env_mbox_dir_read_sequence extends soc_ifc_env_mbox_sequence_base; + + `uvm_object_utils( soc_ifc_env_mbox_dir_read_sequence ) + + // Constrain command to undefined opcode + constraint mbox_cmd_dir_read_c { (mbox_op_rand.cmd.cmd_e == MBOX_CMD_DIR_RD); } + + // Constrain size to something reasonable + constraint mbox_dlen_max_c { mbox_op_rand.dlen <= 2000; } + + function new(string name = "" ); + super.new(name); + endfunction + +endclass diff --git a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/sequences/mbox/soc_ifc/soc_ifc_env_mbox_dlen_invalid_sequence.svh b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/sequences/mbox/soc_ifc/soc_ifc_env_mbox_dlen_invalid_sequence.svh new file mode 100644 index 000000000..7a19c843b --- /dev/null +++ b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/sequences/mbox/soc_ifc/soc_ifc_env_mbox_dlen_invalid_sequence.svh @@ -0,0 +1,50 @@ +//---------------------------------------------------------------------- +// Created with uvmf_gen version 2022.3 +//---------------------------------------------------------------------- +// SPDX-License-Identifier: Apache-2.0 +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +//---------------------------------------------------------------------- +//---------------------------------------------------------------------- +// +// DESCRIPTION: Extended from mbox_base sequence to provide additional +// functionality in a test that sends mailbox commands +// of a size that exceeds mailbox capacity. +// +//---------------------------------------------------------------------- +//---------------------------------------------------------------------- +// +class soc_ifc_env_mbox_dlen_invalid_sequence extends soc_ifc_env_mbox_sequence_base; + + `uvm_object_utils( soc_ifc_env_mbox_dlen_invalid_sequence ) + + // Constrain command to undefined opcode + constraint mbox_cmd_undef_c { !(mbox_op_rand.cmd.cmd_s inside {defined_cmds}); } + + // Constrain size to greater than 128KiB to test a command with invalid + // size (larger than mailbox). + // But keep a reasonable-ish size so the test can run to completion + constraint mbox_dlen_max_c { mbox_op_rand.dlen <= 4*MBOX_SIZE_BYTES; } + constraint mbox_dlen_min_c { mbox_op_rand.dlen > MBOX_SIZE_BYTES; } + // Response data is only non-zero if a response is requested, and also must + // be large enough to exceed the mailbox capacity + constraint mbox_resp_dlen_c { mbox_resp_expected_dlen <= 4*MBOX_SIZE_BYTES; + !mbox_op_rand.cmd.cmd_s.resp_reqd -> mbox_resp_expected_dlen == 0; + mbox_op_rand.cmd.cmd_s.resp_reqd -> mbox_resp_expected_dlen > MBOX_SIZE_BYTES; } + + function new(string name = "" ); + super.new(name); + endfunction + +endclass diff --git a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/sequences/mbox/soc_ifc/soc_ifc_env_mbox_dlen_overflow_sequence.svh b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/sequences/mbox/soc_ifc/soc_ifc_env_mbox_dlen_overflow_sequence.svh index 801570ba2..9f06602ab 100644 --- a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/sequences/mbox/soc_ifc/soc_ifc_env_mbox_dlen_overflow_sequence.svh +++ b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/sequences/mbox/soc_ifc/soc_ifc_env_mbox_dlen_overflow_sequence.svh @@ -44,8 +44,10 @@ task soc_ifc_env_mbox_dlen_overflow_sequence::mbox_push_datain(); uvm_reg_data_t data; int unsigned overflow_bytes; - // Still fits inside the mailbox - if (!std::randomize(overflow_bytes) with {overflow_bytes <= (reg_model.mbox_mem_rm.get_size() * reg_model.mbox_mem_rm.get_n_bytes()) - mbox_op_rand.dlen; overflow_bytes < mbox_op_rand.dlen * 4;}) + // Overflow the programmed DLEN by at least 1 dword, up to 4x the programmed DLEN + // Ensure the constraint is solvable with dlen 0 + if (!std::randomize(overflow_bytes) with {overflow_bytes >= 4; + overflow_bytes <= (mbox_op_rand.dlen+1) * 4;}) `uvm_error("MBOX_OVERFLOW_SEQ", "Failed to randomize overflow bytes") else `uvm_info("MBOX_OVERFLOW_SEQ", $sformatf("Randomized overflow bytes to %0d", overflow_bytes), UVM_MEDIUM) diff --git a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/sequences/mbox/soc_ifc/soc_ifc_env_mbox_fw_upd_sequence.svh b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/sequences/mbox/soc_ifc/soc_ifc_env_mbox_fw_upd_sequence.svh new file mode 100644 index 000000000..af320de47 --- /dev/null +++ b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/sequences/mbox/soc_ifc/soc_ifc_env_mbox_fw_upd_sequence.svh @@ -0,0 +1,36 @@ +//---------------------------------------------------------------------- +// Created with uvmf_gen version 2022.3 +//---------------------------------------------------------------------- +// SPDX-License-Identifier: Apache-2.0 +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +//---------------------------------------------------------------------- +//---------------------------------------------------------------------- +// +// DESCRIPTION: Extended from mbox_base sequence to provide additional +// functionality that emulates the expected format of a +// FW update transfer. +// +//---------------------------------------------------------------------- +//---------------------------------------------------------------------- +// +class soc_ifc_env_mbox_fw_upd_sequence extends soc_ifc_env_mbox_real_fw_sequence; + + `uvm_object_utils( soc_ifc_env_mbox_fw_upd_sequence ) + + //Just send a RT update sequence + constraint mbox_cmd_c { mbox_op_rand.cmd.cmd_e == MBOX_CMD_RT_UPDATE; } + +endclass + diff --git a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/sequences/mbox/soc_ifc/soc_ifc_env_mbox_max_sequence.svh b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/sequences/mbox/soc_ifc/soc_ifc_env_mbox_max_sequence.svh new file mode 100644 index 000000000..a57976374 --- /dev/null +++ b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/sequences/mbox/soc_ifc/soc_ifc_env_mbox_max_sequence.svh @@ -0,0 +1,63 @@ +//---------------------------------------------------------------------- +// Created with uvmf_gen version 2022.3 +//---------------------------------------------------------------------- +// SPDX-License-Identifier: Apache-2.0 +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +//---------------------------------------------------------------------- +//---------------------------------------------------------------------- +// +// DESCRIPTION: Extended from mbox_base sequence to provide additional +// functionality in a test that sends small mailbox commands. +// +//---------------------------------------------------------------------- +//---------------------------------------------------------------------- +// +class soc_ifc_env_mbox_max_sequence extends soc_ifc_env_mbox_sequence_base; + + `uvm_object_utils( soc_ifc_env_mbox_max_sequence ) + + extern virtual task mbox_push_datain(); + + // Constrain command to undefined opcodes with no response required. + constraint mbox_cmd_c { mbox_op_rand.cmd.cmd_e == MBOX_CMD_UC_OVERRUN;} + + // Constrain dlen to reach max or max-1 + constraint mbox_dlen_minmax_c { mbox_op_rand.dlen inside {32'h0002_0000,32'h0001_FFFF,32'h0001_FFFE,32'h0001_FFFD, + 32'h0001_FFFC,32'h0001_FFFB,32'h0001_FFFA,32'h0001_FFF9}; } + +endclass + +//========================================== +// Task: mbox_push_datain +// Description: Write data in a loop to mbox_datain register +// NOTE: This should be overridden with real data to write +//========================================== +task soc_ifc_env_mbox_max_sequence::mbox_push_datain(); + int ii; + uvm_reg_data_t data; + for (ii=0; ii < this.mbox_op_rand.dlen; ii+=4) begin + + if (!std::randomize(data)) `uvm_error("MBOX_SEQ", "Failed to randomize data") + + `uvm_info("MBOX_SEQ", $sformatf("[Iteration: %0d] Sending datain: 0x%x", ii/4, data), UVM_DEBUG) + reg_model.mbox_csr_rm.mbox_datain.write(reg_sts, uvm_reg_data_t'(data), UVM_FRONTDOOR, reg_model.soc_ifc_APB_map, this, .extension(get_rand_user(PAUSER_PROB_DATAIN))); + report_reg_sts(reg_sts, "mbox_datain"); + if (!pauser_used_is_valid() && retry_failed_reg_axs) begin + `uvm_info("MBOX_SEQ", "Re-do datain write with valid PAUSER", UVM_HIGH) + reg_model.mbox_csr_rm.mbox_datain.write(reg_sts, uvm_reg_data_t'(data), UVM_FRONTDOOR, reg_model.soc_ifc_APB_map, this, .extension(get_rand_user(FORCE_VALID_PAUSER))); + report_reg_sts(reg_sts, "mbox_datain"); + end + end +endtask \ No newline at end of file diff --git a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/sequences/mbox/soc_ifc/soc_ifc_env_mbox_min_sequence.svh b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/sequences/mbox/soc_ifc/soc_ifc_env_mbox_min_sequence.svh new file mode 100644 index 000000000..1cb78434c --- /dev/null +++ b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/sequences/mbox/soc_ifc/soc_ifc_env_mbox_min_sequence.svh @@ -0,0 +1,62 @@ +//---------------------------------------------------------------------- +// Created with uvmf_gen version 2022.3 +//---------------------------------------------------------------------- +// SPDX-License-Identifier: Apache-2.0 +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +//---------------------------------------------------------------------- +//---------------------------------------------------------------------- +// +// DESCRIPTION: Extended from mbox_base sequence to provide additional +// functionality in a test that sends small mailbox commands. +// +//---------------------------------------------------------------------- +//---------------------------------------------------------------------- +// +class soc_ifc_env_mbox_min_sequence extends soc_ifc_env_mbox_sequence_base; + + `uvm_object_utils( soc_ifc_env_mbox_min_sequence ) + + extern virtual task mbox_push_datain(); + + // Constrain command to undefined opcodes with no response required. + constraint mbox_cmd_c { mbox_op_rand.cmd.cmd_e == MBOX_CMD_UC_OVERRUN;} + + // Constrain dlen to be 0-1 dword + constraint mbox_dlen_minmax_c { mbox_op_rand.dlen inside {32'h0000_0000,32'h0000_0001,32'h0000_0002,32'h0000_0003}; } + +endclass + +//========================================== +// Task: mbox_push_datain +// Description: Write data in a loop to mbox_datain register +// NOTE: This should be overridden with real data to write +//========================================== +task soc_ifc_env_mbox_min_sequence::mbox_push_datain(); + int ii; + uvm_reg_data_t data; + for (ii=0; ii < this.mbox_op_rand.dlen; ii+=4) begin + + if (!std::randomize(data)) `uvm_error("MBOX_SEQ", "Failed to randomize data") + + `uvm_info("MBOX_SEQ", $sformatf("[Iteration: %0d] Sending datain: 0x%x", ii/4, data), UVM_DEBUG) + reg_model.mbox_csr_rm.mbox_datain.write(reg_sts, uvm_reg_data_t'(data), UVM_FRONTDOOR, reg_model.soc_ifc_APB_map, this, .extension(get_rand_user(PAUSER_PROB_DATAIN))); + report_reg_sts(reg_sts, "mbox_datain"); + if (!pauser_used_is_valid() && retry_failed_reg_axs) begin + `uvm_info("MBOX_SEQ", "Re-do datain write with valid PAUSER", UVM_HIGH) + reg_model.mbox_csr_rm.mbox_datain.write(reg_sts, uvm_reg_data_t'(data), UVM_FRONTDOOR, reg_model.soc_ifc_APB_map, this, .extension(get_rand_user(FORCE_VALID_PAUSER))); + report_reg_sts(reg_sts, "mbox_datain"); + end + end +endtask \ No newline at end of file diff --git a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/sequences/mbox/soc_ifc/soc_ifc_env_mbox_rand_delay_large_sequence.svh b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/sequences/mbox/soc_ifc/soc_ifc_env_mbox_rand_delay_large_sequence.svh new file mode 100644 index 000000000..9b46df7c9 --- /dev/null +++ b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/sequences/mbox/soc_ifc/soc_ifc_env_mbox_rand_delay_large_sequence.svh @@ -0,0 +1,39 @@ +//---------------------------------------------------------------------- +// Created with uvmf_gen version 2022.3 +//---------------------------------------------------------------------- +// SPDX-License-Identifier: Apache-2.0 +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +//---------------------------------------------------------------------- +//---------------------------------------------------------------------- +// +// DESCRIPTION: Extended from mbox delay sequence to exercise rand delays +// throughout the test. +// Tests large sized mailbox commands with delays. +// +//---------------------------------------------------------------------- +//---------------------------------------------------------------------- +// +class soc_ifc_env_mbox_rand_delay_large_sequence extends soc_ifc_env_mbox_rand_delay_sequence; + + `uvm_object_utils( soc_ifc_env_mbox_rand_delay_large_sequence ) + + // Constrain size to a large command + // Min. size: 16KiB + constraint mbox_dlen_min_large_c { mbox_op_rand.dlen > 32'h0000_4000; } + // Constrain response data size to also be large + // Min. size: 16KiB + constraint mbox_resp_dlen_min_large_c { mbox_op_rand.cmd.cmd_s.resp_reqd -> mbox_resp_expected_dlen >= 32'h0000_4000; } + +endclass diff --git a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/sequences/mbox/soc_ifc/soc_ifc_env_mbox_rand_delay_medium_sequence.svh b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/sequences/mbox/soc_ifc/soc_ifc_env_mbox_rand_delay_medium_sequence.svh new file mode 100644 index 000000000..fca42cd4c --- /dev/null +++ b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/sequences/mbox/soc_ifc/soc_ifc_env_mbox_rand_delay_medium_sequence.svh @@ -0,0 +1,43 @@ +//---------------------------------------------------------------------- +// Created with uvmf_gen version 2022.3 +//---------------------------------------------------------------------- +// SPDX-License-Identifier: Apache-2.0 +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +//---------------------------------------------------------------------- +//---------------------------------------------------------------------- +// +// DESCRIPTION: Extended from mbox delay sequence to exercise rand delays +// throughout the test. +// Tests medium sized mailbox commands with delays. +// +//---------------------------------------------------------------------- +//---------------------------------------------------------------------- +// +class soc_ifc_env_mbox_rand_delay_medium_sequence extends soc_ifc_env_mbox_rand_delay_sequence; + + `uvm_object_utils( soc_ifc_env_mbox_rand_delay_medium_sequence ) + + // Constrain dlen to be a medium command + // Max. size: 4096B + constraint mbox_dlen_max_medium_c { mbox_op_rand.dlen <= 32'h0000_1000; } + // Minimum 512B + constraint mbox_dlen_min_medium_c { mbox_op_rand.dlen >= 32'h0000_0200; } + // Constrain response data size to also be medium + // Max. size: 4096B + // Min. size: 512B + constraint mbox_resp_dlen_max_medium_c { mbox_resp_expected_dlen <= 32'h0000_1000; } + constraint mbox_resp_dlen_min_medium_c { mbox_op_rand.cmd.cmd_s.resp_reqd -> mbox_resp_expected_dlen >= 32'h0000_0200; } + +endclass diff --git a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/sequences/mbox/soc_ifc/soc_ifc_env_mbox_rand_delay_sequence.svh b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/sequences/mbox/soc_ifc/soc_ifc_env_mbox_rand_delay_sequence.svh new file mode 100644 index 000000000..1c8d75a96 --- /dev/null +++ b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/sequences/mbox/soc_ifc/soc_ifc_env_mbox_rand_delay_sequence.svh @@ -0,0 +1,75 @@ +//---------------------------------------------------------------------- +// Created with uvmf_gen version 2022.3 +//---------------------------------------------------------------------- +// SPDX-License-Identifier: Apache-2.0 +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +//---------------------------------------------------------------------- +//---------------------------------------------------------------------- +// +// DESCRIPTION: Extended from mbox_base sequence to provide additional +// functionality in a test that sends small mailbox commands. +// +//---------------------------------------------------------------------- +//---------------------------------------------------------------------- +// +class soc_ifc_env_mbox_rand_delay_sequence extends soc_ifc_env_mbox_sequence_base; + + `uvm_object_utils( soc_ifc_env_mbox_rand_delay_sequence ) + + + // Constrain command to undefined opcode + constraint mbox_cmd_undef_c { !(mbox_op_rand.cmd.cmd_s inside {defined_cmds}); } + + // Force delays to be injected at every step + constraint rand_delay_en_c { rand_delay_en == 1'b1; }; + + extern virtual task do_rand_delay(input bit do_delay_randomize=1, input delay_scale_e scale=DLY_SMALL); + + //========================================== + // Function: new + // Description: Constructor + //========================================== + function new(string name = "" ); + super.new(name); + // Disable this constraint to allow wider coverage on + // delay types in delay sequences + this.delay_scale_c.constraint_mode(0); + endfunction + +endclass + +//========================================== +// Function: do_rand_delay +// Description: Use the class variable "rand_delay" +// to inject random stalls between various stages +// of the sequence. +// If do_delay_randomize is set to 1, the value +// of rand_delay is re-randomized (according to +// class constraints), otherwise the previous value +// is used. +// --------- +// This sequence extends functionality of this task to also +// re-randomize the _scales_ that are used throughout the sequence +// to give even wider delay coverage. +//========================================== +task soc_ifc_env_mbox_rand_delay_sequence::do_rand_delay(input bit do_delay_randomize=1, input delay_scale_e scale=DLY_SMALL); + super.do_rand_delay(do_delay_randomize, scale); + if (do_delay_randomize) begin + if (!this.randomize(poll_delay, step_delay, data_delay)) + `uvm_error("MBOX_SEQ", $sformatf("Failed to randomize delay scales")) + else + `uvm_info("MBOX_SEQ", $sformatf("Generated new delay scales: poll [%p] step [%p] data [%p]", poll_delay, step_delay, data_delay), UVM_DEBUG) + end +endtask diff --git a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/sequences/mbox/soc_ifc/soc_ifc_env_mbox_rand_delay_small_sequence.svh b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/sequences/mbox/soc_ifc/soc_ifc_env_mbox_rand_delay_small_sequence.svh new file mode 100644 index 000000000..efe1606bf --- /dev/null +++ b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/sequences/mbox/soc_ifc/soc_ifc_env_mbox_rand_delay_small_sequence.svh @@ -0,0 +1,39 @@ +//---------------------------------------------------------------------- +// Created with uvmf_gen version 2022.3 +//---------------------------------------------------------------------- +// SPDX-License-Identifier: Apache-2.0 +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +//---------------------------------------------------------------------- +//---------------------------------------------------------------------- +// +// DESCRIPTION: Extended from mbox delay sequence to exercise rand delays +// throughout the test. +// Tests small sized mailbox commands with delays. +// +//---------------------------------------------------------------------- +//---------------------------------------------------------------------- +// +class soc_ifc_env_mbox_rand_delay_small_sequence extends soc_ifc_env_mbox_rand_delay_sequence; + + `uvm_object_utils( soc_ifc_env_mbox_rand_delay_small_sequence ) + + // Constrain dlen to be a small command + // Max. size: 512B + constraint mbox_dlen_max_small_c { mbox_op_rand.dlen <= 32'h0000_0200; } + // Constrain response data size to also be small + // Max. size: 512B + constraint mbox_resp_dlen_max_small_c { mbox_resp_expected_dlen < 32'h0000_0200; } + +endclass diff --git a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/sequences/mbox/soc_ifc/soc_ifc_env_mbox_rand_medium_interference_sequence.svh b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/sequences/mbox/soc_ifc/soc_ifc_env_mbox_rand_medium_interference_sequence.svh index 3c561da64..058454ca9 100644 --- a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/sequences/mbox/soc_ifc/soc_ifc_env_mbox_rand_medium_interference_sequence.svh +++ b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/sequences/mbox/soc_ifc/soc_ifc_env_mbox_rand_medium_interference_sequence.svh @@ -73,6 +73,7 @@ task soc_ifc_env_mbox_rand_medium_interference_sequence::mbox_poll_status(); `uvm_error("MBOX_SEQ", "Failed to randomize memory APB transfer in mbox_wait_for_command") end else begin + `uvm_info("MBOX_SEQ", $sformatf("Doing random APB access of type %p to %s, which has is_busy(): %d", RnW, regs[reg_select].get_name(), regs[reg_select].is_busy()), UVM_DEBUG) if (RnW == APB3_TRANS_READ) regs[reg_select].read (reg_sts, data, UVM_FRONTDOOR, reg_model.soc_ifc_APB_map, this, .extension(get_rand_user(PAUSER_PROB_STATUS))); else regs[reg_select].write(reg_sts, data, UVM_FRONTDOOR, reg_model.soc_ifc_APB_map, this, .extension(get_rand_user(PAUSER_PROB_STATUS))); end diff --git a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/sequences/mbox/soc_ifc/soc_ifc_env_mbox_rand_multi_agent_sequence.svh b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/sequences/mbox/soc_ifc/soc_ifc_env_mbox_rand_multi_agent_sequence.svh index 7916d98b4..fb54f67a7 100644 --- a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/sequences/mbox/soc_ifc/soc_ifc_env_mbox_rand_multi_agent_sequence.svh +++ b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/sequences/mbox/soc_ifc/soc_ifc_env_mbox_rand_multi_agent_sequence.svh @@ -126,6 +126,17 @@ function soc_ifc_env_mbox_rand_multi_agent_sequence::create_seqs(); SMALL, MEDIUM, LARGE, + OVERFLOW_SMALL, + OVERFLOW_MEDIUM, + OVERFLOW_LARGE, + UNDERFLOW_SMALL, + UNDERFLOW_MEDIUM, + UNDERFLOW_LARGE, + MIN, + MAX, + DELAY_SMALL, + DELAY_MEDIUM, + DELAY_LARGE, PAUSER_SMALL, PAUSER_MEDIUM, PAUSER_LARGE, @@ -138,7 +149,18 @@ function soc_ifc_env_mbox_rand_multi_agent_sequence::create_seqs(); void'(std::randomize(seq_type) with { seq_type dist { SMALL := 100, MEDIUM := 50, LARGE := 1, - PAUSER_SMALL := 20, + OVERFLOW_SMALL := 50, + OVERFLOW_MEDIUM := 30, + OVERFLOW_LARGE := 1, + UNDERFLOW_SMALL := 50, + UNDERFLOW_MEDIUM := 30, + UNDERFLOW_LARGE := 1, + MIN := 50, + MAX := 50, + DELAY_SMALL := 100, + DELAY_MEDIUM := 50, + DELAY_LARGE := 1, + PAUSER_SMALL := 50, PAUSER_MEDIUM := 20, PAUSER_LARGE := 1, INTERFERENCE_MEDIUM := 10 }; }); @@ -148,7 +170,29 @@ function soc_ifc_env_mbox_rand_multi_agent_sequence::create_seqs(); MEDIUM: obj = soc_ifc_env_mbox_rand_medium_sequence_t::get_type().create_object($sformatf("soc_ifc_env_mbox_multi_agent_seq[%0d]",ii)); LARGE: - obj = soc_ifc_env_mbox_rand_small_sequence_t::get_type().create_object($sformatf("soc_ifc_env_mbox_multi_agent_seq[%0d]",ii)); + obj = soc_ifc_env_mbox_rand_large_sequence_t::get_type().create_object($sformatf("soc_ifc_env_mbox_multi_agent_seq[%0d]",ii)); + OVERFLOW_SMALL: + obj = soc_ifc_env_mbox_dlen_overflow_small_sequence_t::get_type().create_object($sformatf("soc_ifc_env_mbox_multi_agent_seq[%0d]",ii)); + OVERFLOW_MEDIUM: + obj = soc_ifc_env_mbox_dlen_overflow_medium_sequence_t::get_type().create_object($sformatf("soc_ifc_env_mbox_multi_agent_seq[%0d]",ii)); + OVERFLOW_LARGE: + obj = soc_ifc_env_mbox_dlen_overflow_large_sequence_t::get_type().create_object($sformatf("soc_ifc_env_mbox_multi_agent_seq[%0d]",ii)); + UNDERFLOW_SMALL: + obj = soc_ifc_env_mbox_dlen_underflow_small_sequence_t::get_type().create_object($sformatf("soc_ifc_env_mbox_multi_agent_seq[%0d]",ii)); + UNDERFLOW_MEDIUM: + obj = soc_ifc_env_mbox_dlen_underflow_medium_sequence_t::get_type().create_object($sformatf("soc_ifc_env_mbox_multi_agent_seq[%0d]",ii)); + UNDERFLOW_LARGE: + obj = soc_ifc_env_mbox_dlen_underflow_large_sequence_t::get_type().create_object($sformatf("soc_ifc_env_mbox_multi_agent_seq[%0d]",ii)); + MIN: + obj = soc_ifc_env_mbox_min_sequence_t::get_type().create_object($sformatf("soc_ifc_env_mbox_multi_agent_seq[%0d]",ii)); + MAX: + obj = soc_ifc_env_mbox_max_sequence_t::get_type().create_object($sformatf("soc_ifc_env_mbox_multi_agent_seq[%0d]",ii)); + DELAY_SMALL: + obj = soc_ifc_env_mbox_rand_delay_small_sequence_t::get_type().create_object($sformatf("soc_ifc_env_mbox_multi_agent_seq[%0d]",ii)); + DELAY_MEDIUM: + obj = soc_ifc_env_mbox_rand_delay_medium_sequence_t::get_type().create_object($sformatf("soc_ifc_env_mbox_multi_agent_seq[%0d]",ii)); + DELAY_LARGE: + obj = soc_ifc_env_mbox_rand_delay_large_sequence_t::get_type().create_object($sformatf("soc_ifc_env_mbox_multi_agent_seq[%0d]",ii)); PAUSER_SMALL: obj = soc_ifc_env_mbox_rand_pauser_small_sequence_t::get_type().create_object($sformatf("soc_ifc_env_mbox_multi_agent_seq[%0d]",ii)); PAUSER_MEDIUM: @@ -183,7 +227,7 @@ task soc_ifc_env_mbox_rand_multi_agent_sequence::start_seqs(); `uvm_info("SOC_IFC_MBOX", $sformatf("Initiating [%0d] mailbox sequences in parallel", agents), UVM_LOW) foreach (soc_ifc_env_mbox_multi_agent_seq[ii]) begin - if (!std::randomize(delay_clks[ii]) with {delay_clks[ii] < 4*soc_ifc_env_mbox_multi_agent_seq[ii].mbox_op_rand.dlen;}) begin + if (!std::randomize(delay_clks[ii]) with {delay_clks[ii] < 4*(soc_ifc_env_mbox_multi_agent_seq[ii].mbox_op_rand.dlen+20); delay_clks[ii] > 0;}) begin `uvm_fatal("SOC_IFC_MBOX", $sformatf("soc_ifc_env_mbox_rand_multi_agent_sequence::body() - %s randomization failed", "delay_clks")); end else diff --git a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/sequences/mbox/soc_ifc/soc_ifc_env_mbox_real_fw_sequence.svh b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/sequences/mbox/soc_ifc/soc_ifc_env_mbox_real_fw_sequence.svh index 5bb57d966..3b8134b3f 100644 --- a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/sequences/mbox/soc_ifc/soc_ifc_env_mbox_real_fw_sequence.svh +++ b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/sequences/mbox/soc_ifc/soc_ifc_env_mbox_real_fw_sequence.svh @@ -76,7 +76,7 @@ task soc_ifc_env_mbox_real_fw_sequence::mbox_push_datain(); `uvm_info("MBOX_SEQ", $sformatf("Starting FW push_datain, ICCM region ends at [0x%x] and DCCM region ends at [0x%x]", firmware_iccm_end, firmware_end), UVM_LOW) for (ii=0; ii < firmware_end_dw; ii++) begin data = uvm_reg_data_t'({fw_img[ii][3],fw_img[ii][2],fw_img[ii][1],fw_img[ii][0]}); - `uvm_info("MBOX_SEQ", $sformatf("[Iteration: %0d] Sending datain: 0x%x", ii/4, data), UVM_DEBUG) + `uvm_info("MBOX_SEQ", $sformatf("[Iteration: %0d] Sending datain: 0x%x", ii, data), UVM_DEBUG) reg_model.mbox_csr_rm.mbox_datain.write(reg_sts, uvm_reg_data_t'(data), UVM_FRONTDOOR, reg_model.soc_ifc_APB_map, this, .extension(get_rand_user(PAUSER_PROB_DATAIN))); report_reg_sts(reg_sts, "mbox_datain"); end diff --git a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/sequences/mbox/soc_ifc/soc_ifc_env_mbox_reg_axs_invalid_large_sequence.svh b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/sequences/mbox/soc_ifc/soc_ifc_env_mbox_reg_axs_invalid_large_sequence.svh new file mode 100644 index 000000000..3be9c04ba --- /dev/null +++ b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/sequences/mbox/soc_ifc/soc_ifc_env_mbox_reg_axs_invalid_large_sequence.svh @@ -0,0 +1,41 @@ +//---------------------------------------------------------------------- +// Created with uvmf_gen version 2022.3 +//---------------------------------------------------------------------- +// SPDX-License-Identifier: Apache-2.0 +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +//---------------------------------------------------------------------- +//---------------------------------------------------------------------- +// +// DESCRIPTION: Extended from mbox_base sequence to provide additional +// functionality in a test that sends large commands. +// +//---------------------------------------------------------------------- +//---------------------------------------------------------------------- +// +class soc_ifc_env_mbox_reg_axs_invalid_large_sequence extends soc_ifc_env_mbox_reg_axs_invalid_sequence; + + `uvm_object_utils( soc_ifc_env_mbox_reg_axs_invalid_large_sequence ) + + // Constrain size to a large command + // Min. size: 16KiB + constraint mbox_dlen_min_large_c { mbox_op_rand.dlen > 32'h0000_4000; } + // Constrain response data size to also be large + // Min. size: 16KiB + constraint mbox_resp_dlen_min_large_c { mbox_op_rand.cmd.cmd_s.resp_reqd -> mbox_resp_expected_dlen >= 32'h0000_4000; } + // Valid solution for the custom delay ruleset, to control random delays while + // waiting to inject random error accesses + constraint custom_delay_c { rand_delay > 0; rand_delay < (mbox_op_rand.dlen * 5); } + +endclass diff --git a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/sequences/mbox/soc_ifc/soc_ifc_env_mbox_reg_axs_invalid_medium_sequence.svh b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/sequences/mbox/soc_ifc/soc_ifc_env_mbox_reg_axs_invalid_medium_sequence.svh new file mode 100644 index 000000000..674413d75 --- /dev/null +++ b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/sequences/mbox/soc_ifc/soc_ifc_env_mbox_reg_axs_invalid_medium_sequence.svh @@ -0,0 +1,45 @@ +//---------------------------------------------------------------------- +// Created with uvmf_gen version 2022.3 +//---------------------------------------------------------------------- +// SPDX-License-Identifier: Apache-2.0 +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +//---------------------------------------------------------------------- +//---------------------------------------------------------------------- +// +// DESCRIPTION: Extended from mbox_base sequence to provide additional +// functionality in a test that sends medium-sized mailbox commands. +// +//---------------------------------------------------------------------- +//---------------------------------------------------------------------- +// +class soc_ifc_env_mbox_reg_axs_invalid_medium_sequence extends soc_ifc_env_mbox_reg_axs_invalid_sequence; + + `uvm_object_utils( soc_ifc_env_mbox_reg_axs_invalid_medium_sequence ) + + // Constrain dlen to be a medium command + // Max. size: 4096B + constraint mbox_dlen_max_medium_c { mbox_op_rand.dlen <= 32'h0000_1000; } + // Minimum 512B + constraint mbox_dlen_min_medium_c { mbox_op_rand.dlen >= 32'h0000_0200; } + // Constrain response data size to also be medium + // Max. size: 4096B + // Min. size: 512B + constraint mbox_resp_dlen_max_medium_c { mbox_resp_expected_dlen <= 32'h0000_1000; } + constraint mbox_resp_dlen_min_medium_c { mbox_op_rand.cmd.cmd_s.resp_reqd -> mbox_resp_expected_dlen >= 32'h0000_0200; } + // Valid solution for the custom delay ruleset, to control random delays while + // waiting to inject random error accesses + constraint custom_delay_c { rand_delay > 0; rand_delay < (mbox_op_rand.dlen * 12); } + +endclass diff --git a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/sequences/mbox/soc_ifc/soc_ifc_env_mbox_reg_axs_invalid_sequence.svh b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/sequences/mbox/soc_ifc/soc_ifc_env_mbox_reg_axs_invalid_sequence.svh new file mode 100644 index 000000000..e0112ea05 --- /dev/null +++ b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/sequences/mbox/soc_ifc/soc_ifc_env_mbox_reg_axs_invalid_sequence.svh @@ -0,0 +1,194 @@ +//---------------------------------------------------------------------- +// Created with uvmf_gen version 2022.3 +//---------------------------------------------------------------------- +// SPDX-License-Identifier: Apache-2.0 +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +//---------------------------------------------------------------------- +//---------------------------------------------------------------------- +// +// DESCRIPTION: Extended from mbox_base sequence to provide additional +// functionality in a test that sends mailbox commands +// of a size that exceeds mailbox capacity. +// +//---------------------------------------------------------------------- +//---------------------------------------------------------------------- +// +class soc_ifc_env_mbox_reg_axs_invalid_sequence extends soc_ifc_env_mbox_sequence_base; + + `uvm_object_utils( soc_ifc_env_mbox_reg_axs_invalid_sequence ) + + // Constrain command to undefined opcode + constraint mbox_cmd_undef_c { !(mbox_op_rand.cmd.cmd_s inside {defined_cmds}); } + + extern virtual task mbox_do_random_reg_write(process mainline); + extern virtual function uvm_reg_data_t get_rand_wr_data(uvm_reg axs_reg); + + function new(string name = "" ); + super.new(name); + endfunction + + //========================================== + // Task: body + // Description: Implement main functionality for + // SOC-side transmission of mailbox request. + // Override default body to inject random + // (deliberately erroneous) register accesses + // throughout a normal test flow. + //========================================== + virtual task body(); + + op_sts_e op_sts; + process mbox_flow_proc; + + sts_rsp_count = 0; + + fork + forever begin + @(soc_ifc_status_agent_rsp_seq.new_rsp) sts_rsp_count++; + end + join_none + + `uvm_info("MBOX_SEQ", $sformatf("Initiating command sequence to mailbox with cmd: [%p] dlen: [%p] resp_dlen: [%p]", mbox_op_rand.cmd.cmd_e, mbox_op_rand.dlen, mbox_resp_expected_dlen), UVM_MEDIUM) + + fork + begin: MBOX_FLOW + mbox_flow_proc = process::self(); + mbox_setup(); if (rand_delay_en) do_rand_delay(1, step_delay); + mbox_acquire_lock(op_sts); if (rand_delay_en) do_rand_delay(1, step_delay); + mbox_set_cmd(mbox_op_rand); if (rand_delay_en) do_rand_delay(1, step_delay); + mbox_push_datain(); if (rand_delay_en) do_rand_delay(1, step_delay); + mbox_execute(); if (rand_delay_en) do_rand_delay(1, step_delay); + mbox_poll_status(); if (rand_delay_en) do_rand_delay(1, step_delay); + end + begin: ERR_INJECT_FLOW + wait(mbox_flow_proc != null); + mbox_do_random_reg_write(mbox_flow_proc); + end + join + mbox_clr_execute(); if (rand_delay_en) do_rand_delay(1, step_delay); + mbox_teardown(); + + endtask + +endclass + +//========================================== +// Task: mbox_do_random_reg_write +// Description: Do some random reg write that will +// (most likely) be invalid and trigger +// the protocol error violation. +//========================================== +task soc_ifc_env_mbox_reg_axs_invalid_sequence::mbox_do_random_reg_write(process mainline); + uvm_reg mbox_regs[$]; + int unsigned rand_idx; + uvm_reg_data_t rand_wr_data; + caliptra_apb_user local_apb_user_obj; + uvm_status_e local_reg_sts; + + mbox_regs.push_back(reg_model.mbox_csr_rm.mbox_cmd ); + mbox_regs.push_back(reg_model.mbox_csr_rm.mbox_dlen ); + mbox_regs.push_back(reg_model.mbox_csr_rm.mbox_datain ); + mbox_regs.push_back(reg_model.mbox_csr_rm.mbox_dataout); + mbox_regs.push_back(reg_model.mbox_csr_rm.mbox_execute); + mbox_regs.push_back(reg_model.mbox_csr_rm.mbox_status ); + + if (!std::randomize(rand_idx) with {rand_idx < mbox_regs.size(); }) + `uvm_fatal("MBOX_SEQ", "Failed to randomize reg idx") + + // Wait and do the reg write at some random point in the sequence + do_rand_delay(1, DLY_CUSTOM); + // Data used depends on which reg is being accessed to force invalid contents + rand_wr_data = get_rand_wr_data(mbox_regs[rand_idx]); + // Get a randomized PAUSER for this transaction - 50% chance of being valid + local_apb_user_obj = new(); + if (!local_apb_user_obj.randomize() with {if (pauser_locked.locked) + (addr_user == pauser_locked.pauser) dist + {1 :/ 1, + 0 :/ 1}; + else + (addr_user inside {mbox_valid_users}) dist + {1 :/ 1, + 0 :/ 1}; }) + `uvm_error("MBOX_SEQ", "Failed to randomize APB PAUSER override value") + else + `uvm_info("MBOX_SEQ", $sformatf("Randomized APB PAUSER override value to 0x%x", local_apb_user_obj.addr_user), UVM_HIGH) + // Pause the main mailbox flow to prevent race conditions (on accesses to the same register, triggering is_busy UVM_WARNING) + if (mainline.status() inside {process::RUNNING,process::WAITING}) begin + in_report_reg_sts.wait_on(); + `uvm_info("MBOX_SEQ", $sformatf("Pausing main mailbox flow to allow random reg access injection"), UVM_HIGH) + mainline.suspend(); + in_report_reg_sts.reset(); + end + else begin + `uvm_info("MBOX_SEQ", $sformatf("Main mailbox flow is in state [%s], so it will not be suspended for random reg access injection", mainline.status().name()), UVM_HIGH) + end + if (mbox_regs[rand_idx].get_name() == "mbox_dataout") begin + `uvm_info("MBOX_SEQ", {"Performing random register access to ", mbox_regs[rand_idx].get_name()}, UVM_LOW) + mbox_regs[rand_idx].read(local_reg_sts, rand_wr_data, UVM_FRONTDOOR, reg_model.soc_ifc_APB_map, this, .extension(local_apb_user_obj)); + report_reg_sts(local_reg_sts, mbox_regs[rand_idx].get_name(), local_apb_user_obj); + end + else if (mbox_regs[rand_idx].get_name() == "mbox_datain") begin + `uvm_info("MBOX_SEQ", {"Performing random register access to ", mbox_regs[rand_idx].get_name()}, UVM_LOW) + mbox_regs[rand_idx].write(local_reg_sts, rand_wr_data, UVM_FRONTDOOR, reg_model.soc_ifc_APB_map, this, .extension(local_apb_user_obj)); + report_reg_sts(local_reg_sts, mbox_regs[rand_idx].get_name(), local_apb_user_obj); + end + else begin + `uvm_info("MBOX_SEQ", {"Performing random register access to ", mbox_regs[rand_idx].get_name()}, UVM_LOW) + mbox_regs[rand_idx].write(local_reg_sts, rand_wr_data, UVM_FRONTDOOR, reg_model.soc_ifc_APB_map, this, .extension(local_apb_user_obj)); + report_reg_sts(local_reg_sts, mbox_regs[rand_idx].get_name(), local_apb_user_obj); + end + if (mainline.status() == process::SUSPENDED) begin + `uvm_info("MBOX_SEQ", $sformatf("Resuming main mailbox flow after random reg access injection"), UVM_HIGH) + mainline.resume(); + end +endtask + +//========================================== +// Task: get_rand_wr_data +// Description: Generate random data according +// to a set of rules related to which register +// is being accessed, with intent to cause +// a protocol violation. +//========================================== +function uvm_reg_data_t soc_ifc_env_mbox_reg_axs_invalid_sequence::get_rand_wr_data(uvm_reg axs_reg); + uvm_reg_data_t tmp_data; + case (axs_reg.get_name()) inside + "mbox_cmd": begin + tmp_data = mbox_op_rand.cmd; + end + "mbox_dlen": begin + tmp_data = mbox_op_rand.dlen; + end + "mbox_datain", + "mbox_dataout": begin + std::randomize(tmp_data); + end + "mbox_execute": begin + uvm_reg_data_t msk; + msk = ~(uvm_reg_data_t'(1) << reg_model.mbox_csr_rm.mbox_execute.execute.get_lsb_pos()); + std::randomize(tmp_data) with {(tmp_data & msk) == 0;}; + end + "mbox_status": begin + uvm_reg_data_t msk; + msk = ((uvm_reg_data_t'(1) << reg_model.mbox_csr_rm.mbox_status.status.get_n_bits()) - 1) << reg_model.mbox_csr_rm.mbox_status.status.get_lsb_pos(); + msk = ~msk; + std::randomize(tmp_data) with {(tmp_data & msk) == 0;}; + end + default: begin + `uvm_fatal("MBOX_SEQ", "Bad reg") + end + endcase + return tmp_data; +endfunction diff --git a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/sequences/mbox/soc_ifc/soc_ifc_env_mbox_reg_axs_invalid_small_sequence.svh b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/sequences/mbox/soc_ifc/soc_ifc_env_mbox_reg_axs_invalid_small_sequence.svh new file mode 100644 index 000000000..33429c4e8 --- /dev/null +++ b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/sequences/mbox/soc_ifc/soc_ifc_env_mbox_reg_axs_invalid_small_sequence.svh @@ -0,0 +1,41 @@ +//---------------------------------------------------------------------- +// Created with uvmf_gen version 2022.3 +//---------------------------------------------------------------------- +// SPDX-License-Identifier: Apache-2.0 +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +//---------------------------------------------------------------------- +//---------------------------------------------------------------------- +// +// DESCRIPTION: Extended from mbox_base sequence to provide additional +// functionality in a test that sends small mailbox commands. +// +//---------------------------------------------------------------------- +//---------------------------------------------------------------------- +// +class soc_ifc_env_mbox_reg_axs_invalid_small_sequence extends soc_ifc_env_mbox_reg_axs_invalid_sequence; + + `uvm_object_utils( soc_ifc_env_mbox_reg_axs_invalid_small_sequence ) + + // Constrain dlen to be a small command + // Max. size: 512B + constraint mbox_dlen_max_small_c { mbox_op_rand.dlen <= 32'h0000_0200; } + // Constrain response data size to also be small + // Max. size: 512B + constraint mbox_resp_dlen_max_small_c { mbox_resp_expected_dlen < 32'h0000_0200; } + // Valid solution for the custom delay ruleset, to control random delays while + // waiting to inject random error accesses + constraint custom_delay_c { rand_delay > 0; rand_delay < (mbox_op_rand.dlen * 25); } + +endclass diff --git a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/sequences/mbox/soc_ifc/soc_ifc_env_mbox_rom_fw_sequence.svh b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/sequences/mbox/soc_ifc/soc_ifc_env_mbox_rom_fw_sequence.svh new file mode 100644 index 000000000..5e265b325 --- /dev/null +++ b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/sequences/mbox/soc_ifc/soc_ifc_env_mbox_rom_fw_sequence.svh @@ -0,0 +1,73 @@ +//---------------------------------------------------------------------- +// Created with uvmf_gen version 2022.3 +//---------------------------------------------------------------------- +// SPDX-License-Identifier: Apache-2.0 +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +//---------------------------------------------------------------------- +//---------------------------------------------------------------------- +// +// DESCRIPTION: Extended from mbox_base sequence to complete a FW update +// against the actual (FW-team developed) ROM. +// +//---------------------------------------------------------------------- +//---------------------------------------------------------------------- +// +class soc_ifc_env_mbox_rom_fw_sequence extends soc_ifc_env_mbox_sequence_base; + + `uvm_object_utils( soc_ifc_env_mbox_rom_fw_sequence ) + + // 128KiB memory, with 32768 single-dword entries + bit [7:0] fw_img [soc_ifc_pkg::MBOX_DEPTH][soc_ifc_pkg::MBOX_DATA_W/8-1:0]; + + extern virtual task mbox_setup(); + extern virtual task mbox_push_datain(); + + // This shouldn't be randomized, specify it + constraint mbox_cmd_c { mbox_op_rand.cmd == mbox_cmd_e'(MBOX_CMD_ROM_FW_UPD); } + constraint mbox_dlen_c { mbox_op_rand.dlen == 13708; } + // Response data is only non-zero if a response is requested, and also must + // be small enough to fit in the mailbox + // Firmware team encodes commands differently from this environment; response + // bit is different, and ROM doesn't expect to provide a response for fw update. + // Override to force this to 0. + constraint mbox_resp_dlen_c { mbox_resp_expected_dlen == 0; } + +endclass + +task soc_ifc_env_mbox_rom_fw_sequence::mbox_setup(); + super.mbox_setup(); + //read FW from file to write to mailbox + $readmemh("fw_update.hex", fw_img); +endtask + +// This should be overridden with real data to write +task soc_ifc_env_mbox_rom_fw_sequence::mbox_push_datain(); + int ii; + int firmware_end_dw; + uvm_reg_data_t data; + + firmware_end_dw = this.mbox_op_rand.dlen / 4 + (this.mbox_op_rand.dlen%4 ? 1 : 0); + + `uvm_info("MBOX_SEQ", $sformatf("Starting FW push_datain. Size: [0x%x] dwords", firmware_end_dw), UVM_LOW) + for (ii=0; ii < firmware_end_dw; ii++) begin + data = uvm_reg_data_t'({fw_img[ii][3],fw_img[ii][2],fw_img[ii][1],fw_img[ii][0]}); + if (ii < 10) + `uvm_info("MBOX_SEQ", $sformatf("[Iteration: %0d] Sending datain: 0x%x", ii, data), UVM_LOW) + else + `uvm_info("MBOX_SEQ", $sformatf("[Iteration: %0d] Sending datain: 0x%x", ii, data), UVM_DEBUG) + reg_model.mbox_csr_rm.mbox_datain.write(reg_sts, uvm_reg_data_t'(data), UVM_FRONTDOOR, reg_model.soc_ifc_APB_map, this, .extension(get_rand_user(PAUSER_PROB_DATAIN))); + report_reg_sts(reg_sts, "mbox_datain"); + end +endtask diff --git a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/sequences/mbox/soc_ifc/soc_ifc_env_mbox_sequence_base.svh b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/sequences/mbox/soc_ifc/soc_ifc_env_mbox_sequence_base.svh index db657059f..166e40bc7 100644 --- a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/sequences/mbox/soc_ifc/soc_ifc_env_mbox_sequence_base.svh +++ b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/sequences/mbox/soc_ifc/soc_ifc_env_mbox_sequence_base.svh @@ -38,8 +38,22 @@ class soc_ifc_env_mbox_sequence_base extends soc_ifc_env_sequence_base #(.CONFIG rand int mbox_resp_expected_dlen; // Number of response data bytes to expect int sts_rsp_count; uvm_status_e reg_sts; + uvm_event in_report_reg_sts; rand bit do_apb_lock_check; rand bit retry_failed_reg_axs; + + typedef enum byte { + DLY_ZERO, + DLY_SMALL, + DLY_MEDIUM, + DLY_LARGE, + DLY_CUSTOM + } delay_scale_e; + + rand delay_scale_e poll_delay, step_delay, data_delay; + rand bit rand_delay_en = 0; + rand int unsigned rand_delay = 0; + // Certain random sequences force the command to be outside of the defined // options from mbox_cmd_e, such that truly random behavior does not violate // expected activity for the command opcode. To do this, we need to be able @@ -78,10 +92,11 @@ class soc_ifc_env_mbox_sequence_base extends soc_ifc_env_sequence_base #(.CONFIG extern virtual task mbox_clr_execute(); extern virtual task mbox_teardown(); + extern virtual task do_rand_delay(input bit do_delay_randomize=1, input delay_scale_e scale=DLY_SMALL); extern virtual function void set_pauser_prob_vals(); - extern virtual function bit pauser_used_is_valid(); + extern virtual function bit pauser_used_is_valid(caliptra_apb_user user_handle = null); extern virtual function caliptra_apb_user get_rand_user(int unsigned invalid_prob = FORCE_VALID_PAUSER); - extern virtual function void report_reg_sts(uvm_status_e reg_sts, string name); + extern virtual task report_reg_sts(uvm_status_e reg_sts, string name, caliptra_apb_user user_handle = null); // Constrain command to not be firmware or uC-initiated constraint mbox_cmd_c { mbox_op_rand.cmd.cmd_s.fw == 1'b0; @@ -89,13 +104,13 @@ class soc_ifc_env_mbox_sequence_base extends soc_ifc_env_sequence_base #(.CONFIG // Constrain size to less than 128KiB for now (mailbox size), but we will // recalculate this based on the command being sent - constraint mbox_dlen_max_c { mbox_op_rand.dlen <= 32'h0002_0000; } + constraint mbox_dlen_max_c { mbox_op_rand.dlen <= MBOX_SIZE_BYTES; } // Minimum 2 dwords to include dlen/mbox_resp_expected_dlen at the beginning // IFF the response data is required constraint mbox_dlen_min_c { mbox_op_rand.cmd.cmd_s.resp_reqd -> mbox_op_rand.dlen >= 32'h8; } // Response data is only non-zero if a response is requested, and also must // be small enough to fit in the mailbox - constraint mbox_resp_dlen_c { mbox_resp_expected_dlen <= 32'h0002_0000; + constraint mbox_resp_dlen_c { mbox_resp_expected_dlen <= MBOX_SIZE_BYTES; !mbox_op_rand.cmd.cmd_s.resp_reqd -> mbox_resp_expected_dlen == 0; mbox_op_rand.cmd.cmd_s.resp_reqd -> mbox_resp_expected_dlen > 0; } @@ -106,6 +121,36 @@ class soc_ifc_env_mbox_sequence_base extends soc_ifc_env_sequence_base #(.CONFIG constraint apb_reg_check_c {do_apb_lock_check dist {0:/1, 1:/1};} constraint retry_failed_reg_c {retry_failed_reg_axs == 1'b1;} + // Constraint on the random delays injected between each step of the flow. + // By default, delays minimal to avoid protracting the test too much. + // Targeted sequences may override this constraint. + constraint delay_scale_c { poll_delay == DLY_MEDIUM; + step_delay == DLY_SMALL; + data_delay == DLY_ZERO; } + // Should not be overridden + constraint delay_scale_valid_c { poll_delay != DLY_CUSTOM; + step_delay != DLY_CUSTOM; + data_delay != DLY_CUSTOM; } + // These constraints conflict with each other - only the one that is applicable + // should be enabled; this is done in the definition of do_rand_delay + constraint zero_delay_c { rand_delay == 0;} + constraint small_delay_c { rand_delay dist { 0 :/ 1000, + [1:3] :/ 100, + [4:7] :/ 25, + [8:31]:/ 1};} + constraint medium_delay_c { rand_delay dist { 0 :/ 10, + [1:7] :/ 50, + [8:31] :/ 100, + [32:255]:/ 50};} + constraint large_delay_c { rand_delay dist { 15 :/ 1, + [ 16 : 255] :/ 50, + [ 256:1023] :/ 100, + [1024:8191] :/ 25};} + // This deliberately intractable constraint must be overridden + // by a child sequence if random delays are expected to be driven + // by some custom rule set. + constraint custom_delay_c { rand_delay == 0; rand_delay == 1; } + //========================================== // Function: new // Description: Constructor @@ -124,6 +169,16 @@ class soc_ifc_env_mbox_sequence_base extends soc_ifc_env_sequence_base #(.CONFIG // Assign probabilties of generating invalid PAUSER at different stages set_pauser_prob_vals(); + + // Default constraint mode is SMALL random delays, updated when doing + // the delay + this.zero_delay_c .constraint_mode(0); + this.small_delay_c .constraint_mode(1); + this.medium_delay_c.constraint_mode(0); + this.large_delay_c .constraint_mode(0); + this.custom_delay_c.constraint_mode(0); + + in_report_reg_sts = new("in_report_reg_sts"); endfunction //========================================== @@ -153,8 +208,10 @@ class soc_ifc_env_mbox_sequence_base extends soc_ifc_env_sequence_base #(.CONFIG // Randomization checker requires a valid handle to reg-model, which it gets // from the configuration object (which is not set until pre_body()) - assert(mbox_op_rand.dlen <= (reg_model.mbox_mem_rm.get_size() * reg_model.mbox_mem_rm.get_n_bytes())) else - `uvm_error("MBOX_SEQ", $sformatf("Randomized SOC_IFC environment mailbox base sequence with bad dlen. Max: [0x%x] Got: [0x%x]. Cmd randomized to %p", (reg_model.mbox_mem_rm.get_size() * reg_model.mbox_mem_rm.get_n_bytes()), mbox_op_rand.dlen, mbox_op_rand.cmd.cmd_e)) + // This is only an 'info' instead of an error because some tests do this + // deliberately + if (mbox_op_rand.dlen > (reg_model.mbox_mem_rm.get_size() * reg_model.mbox_mem_rm.get_n_bytes())) + `uvm_info("MBOX_SEQ", $sformatf("Randomized SOC_IFC environment mailbox base sequence with invalid dlen. Max: [0x%x] Got: [0x%x]. Cmd randomized to %p", (reg_model.mbox_mem_rm.get_size() * reg_model.mbox_mem_rm.get_n_bytes()), mbox_op_rand.dlen, mbox_op_rand.cmd.cmd_e), UVM_LOW) endtask //========================================== @@ -176,13 +233,13 @@ class soc_ifc_env_mbox_sequence_base extends soc_ifc_env_sequence_base #(.CONFIG `uvm_info("MBOX_SEQ", $sformatf("Initiating command sequence to mailbox with cmd: [%p] dlen: [%p] resp_dlen: [%p]", mbox_op_rand.cmd.cmd_e, mbox_op_rand.dlen, mbox_resp_expected_dlen), UVM_MEDIUM) - mbox_setup(); - mbox_acquire_lock(op_sts); - mbox_set_cmd(mbox_op_rand); - mbox_push_datain(); - mbox_execute(); - mbox_poll_status(); - mbox_clr_execute(); + mbox_setup(); if (rand_delay_en) do_rand_delay(1, step_delay); + mbox_acquire_lock(op_sts); if (rand_delay_en) do_rand_delay(1, step_delay); + mbox_set_cmd(mbox_op_rand); if (rand_delay_en) do_rand_delay(1, step_delay); + mbox_push_datain(); if (rand_delay_en) do_rand_delay(1, step_delay); + mbox_execute(); if (rand_delay_en) do_rand_delay(1, step_delay); + mbox_poll_status(); if (rand_delay_en) do_rand_delay(1, step_delay); + mbox_clr_execute(); if (rand_delay_en) do_rand_delay(1, step_delay); mbox_teardown(); endtask @@ -240,7 +297,7 @@ task soc_ifc_env_mbox_sequence_base::mbox_acquire_lock(output op_sts_e op_sts); report_reg_sts(reg_sts, "mbox_lock"); // Wait for read data to return with '0', indicating no other agent has lock while (data[reg_model.mbox_csr_rm.mbox_lock.lock.get_lsb_pos()]) begin - configuration.soc_ifc_ctrl_agent_config.wait_for_num_clocks(200); // FIXME add more randomization on delay + do_rand_delay(1, poll_delay); reg_model.mbox_csr_rm.mbox_lock.read(reg_sts, data, UVM_FRONTDOOR, reg_model.soc_ifc_APB_map, this, .extension(get_rand_user(PAUSER_PROB_LOCK))); report_reg_sts(reg_sts, "mbox_lock"); end @@ -279,7 +336,7 @@ task soc_ifc_env_mbox_sequence_base::mbox_acquire_lock(output op_sts_e op_sts); report_reg_sts(reg_sts, "mbox_lock"); // Wait for read data to return with '0', indicating no other agent has lock while (data[reg_model.mbox_csr_rm.mbox_lock.lock.get_lsb_pos()]) begin - configuration.soc_ifc_ctrl_agent_config.wait_for_num_clocks(200); + do_rand_delay(1, poll_delay); reg_model.mbox_csr_rm.mbox_lock.read(reg_sts, data, UVM_FRONTDOOR, reg_model.soc_ifc_APB_map, this, .extension(this.apb_user_obj)); report_reg_sts(reg_sts, "mbox_lock"); end @@ -328,14 +385,16 @@ endtask // mbox_cmd and mbox_dlen registers //========================================== task soc_ifc_env_mbox_sequence_base::mbox_set_cmd(input mbox_op_s op); - uvm_reg_data_t data; + uvm_reg_data_t data, prev_data; + prev_data = reg_model.mbox_csr_rm.mbox_cmd.get_mirrored_value(); reg_model.mbox_csr_rm.mbox_cmd.write(reg_sts, uvm_reg_data_t'(op.cmd), UVM_FRONTDOOR, reg_model.soc_ifc_APB_map, this, .extension(get_rand_user(PAUSER_PROB_CMD))); report_reg_sts(reg_sts, "mbox_cmd"); if (!pauser_used_is_valid()) begin + if (rand_delay_en) do_rand_delay(1, step_delay); reg_model.mbox_csr_rm.mbox_cmd.read(reg_sts, data, UVM_FRONTDOOR, reg_model.soc_ifc_APB_map, this, .extension(get_rand_user(FORCE_VALID_PAUSER))); report_reg_sts(reg_sts, "mbox_cmd"); - if (mbox_cmd_u'(data) == op.cmd) + if (data != prev_data) `uvm_error("MBOX_SEQ", "Write to mbox_cmd succeeded unexpectedly with invalid PAUSER!") else if (retry_failed_reg_axs) begin reg_model.mbox_csr_rm.mbox_cmd.write(reg_sts, uvm_reg_data_t'(op.cmd), UVM_FRONTDOOR, reg_model.soc_ifc_APB_map, this, .extension(get_rand_user(FORCE_VALID_PAUSER))); @@ -343,12 +402,16 @@ task soc_ifc_env_mbox_sequence_base::mbox_set_cmd(input mbox_op_s op); end end + if (rand_delay_en) do_rand_delay(1, step_delay); + + prev_data = reg_model.mbox_csr_rm.mbox_dlen.get_mirrored_value(); reg_model.mbox_csr_rm.mbox_dlen.write(reg_sts, uvm_reg_data_t'(op.dlen), UVM_FRONTDOOR, reg_model.soc_ifc_APB_map, this, .extension(get_rand_user(PAUSER_PROB_CMD))); report_reg_sts(reg_sts, "mbox_dlen"); if (!pauser_used_is_valid()) begin + if (rand_delay_en) do_rand_delay(1, step_delay); reg_model.mbox_csr_rm.mbox_dlen.read(reg_sts, data, UVM_FRONTDOOR, reg_model.soc_ifc_APB_map, this, .extension(get_rand_user(FORCE_VALID_PAUSER))); report_reg_sts(reg_sts, "mbox_dlen"); - if (32'(data) == op.dlen) + if (32'(data) != prev_data) `uvm_error("MBOX_SEQ", "Write to mbox_dlen succeeded unexpectedly with invalid PAUSER!") else if (retry_failed_reg_axs) begin reg_model.mbox_csr_rm.mbox_dlen.write(reg_sts, uvm_reg_data_t'(op.dlen), UVM_FRONTDOOR, reg_model.soc_ifc_APB_map, this, .extension(get_rand_user(FORCE_VALID_PAUSER))); @@ -379,10 +442,12 @@ task soc_ifc_env_mbox_sequence_base::mbox_push_datain(); reg_model.mbox_csr_rm.mbox_datain.write(reg_sts, uvm_reg_data_t'(data), UVM_FRONTDOOR, reg_model.soc_ifc_APB_map, this, .extension(get_rand_user(PAUSER_PROB_DATAIN))); report_reg_sts(reg_sts, "mbox_datain"); if (!pauser_used_is_valid() && retry_failed_reg_axs) begin + if (rand_delay_en) do_rand_delay(1, data_delay); `uvm_info("MBOX_SEQ", "Re-do datain write with valid PAUSER", UVM_HIGH) reg_model.mbox_csr_rm.mbox_datain.write(reg_sts, uvm_reg_data_t'(data), UVM_FRONTDOOR, reg_model.soc_ifc_APB_map, this, .extension(get_rand_user(FORCE_VALID_PAUSER))); report_reg_sts(reg_sts, "mbox_datain"); end + if (rand_delay_en) do_rand_delay(1, data_delay); end endtask @@ -396,6 +461,7 @@ task soc_ifc_env_mbox_sequence_base::mbox_execute(); reg_model.mbox_csr_rm.mbox_execute.write(reg_sts, data, UVM_FRONTDOOR, reg_model.soc_ifc_APB_map, this, .extension(get_rand_user(PAUSER_PROB_EXECUTE))); report_reg_sts(reg_sts, "mbox_execute"); if (!pauser_used_is_valid() && retry_failed_reg_axs) begin + if (rand_delay_en) do_rand_delay(1, step_delay); reg_model.mbox_csr_rm.mbox_execute.write(reg_sts, data, UVM_FRONTDOOR, reg_model.soc_ifc_APB_map, this, .extension(get_rand_user(FORCE_VALID_PAUSER))); report_reg_sts(reg_sts, "mbox_execute"); end @@ -430,15 +496,34 @@ endtask //========================================== task soc_ifc_env_mbox_sequence_base::mbox_read_resp_data(); uvm_reg_data_t data; + uvm_reg_data_t dlen; int ii; - for (ii=0; ii < mbox_resp_expected_dlen; ii+=4) begin + reg_model.mbox_csr_rm.mbox_dlen.read(reg_sts, dlen, UVM_FRONTDOOR, reg_model.soc_ifc_APB_map, this, .extension(get_rand_user(PAUSER_PROB_DATAOUT))); + report_reg_sts(reg_sts, "mbox_dlen"); + if (!pauser_used_is_valid() && retry_failed_reg_axs) begin + reg_model.mbox_csr_rm.mbox_dlen.read(reg_sts, dlen, UVM_FRONTDOOR, reg_model.soc_ifc_APB_map, this, .extension(get_rand_user(FORCE_VALID_PAUSER))); + report_reg_sts(reg_sts, "mbox_dlen"); + end + if (dlen != mbox_resp_expected_dlen) begin + if (this.get_type_name() inside {"soc_ifc_env_mbox_reg_axs_invalid_sequence", + "soc_ifc_env_mbox_reg_axs_invalid_small_sequence", + "soc_ifc_env_mbox_reg_axs_invalid_medium_sequence", + "soc_ifc_env_mbox_reg_axs_invalid_large_sequence"}) + `uvm_info("MBOX_SEQ", $sformatf("SOC received response data with mbox_dlen [%0d] that does not match the expected data amount [%0d]! Not flagging err since this is an invalid reg-access sequence [%s]", dlen, mbox_resp_expected_dlen, this.get_type_name()), UVM_LOW) + else + `uvm_error("MBOX_SEQ", $sformatf("SOC received response data with mbox_dlen [%0d] that does not match the expected data amount [%0d]!", dlen, mbox_resp_expected_dlen)) + end + if (rand_delay_en) do_rand_delay(1, step_delay); + for (ii=0; ii < dlen; ii+=4) begin reg_model.mbox_csr_rm.mbox_dataout.read(reg_sts, data, UVM_FRONTDOOR, reg_model.soc_ifc_APB_map, this, .extension(get_rand_user(PAUSER_PROB_DATAOUT))); report_reg_sts(reg_sts, "mbox_dataout"); if (!pauser_used_is_valid() && retry_failed_reg_axs) begin + if (rand_delay_en) do_rand_delay(1, data_delay); `uvm_info("MBOX_SEQ", "Re-do dataout read with valid PAUSER", UVM_HIGH) reg_model.mbox_csr_rm.mbox_dataout.read(reg_sts, data, UVM_FRONTDOOR, reg_model.soc_ifc_APB_map, this, .extension(get_rand_user(FORCE_VALID_PAUSER))); report_reg_sts(reg_sts, "mbox_dataout"); end + if (rand_delay_en) do_rand_delay(1, data_delay); end endtask @@ -456,7 +541,7 @@ task soc_ifc_env_mbox_sequence_base::mbox_poll_status(); // A force-unlock would cause state->MBOX_IDLE, so we exit the polling loop do begin - configuration.soc_ifc_ctrl_agent_config.wait_for_num_clocks(200); + do_rand_delay(1, poll_delay); mbox_check_status(data, state); end while (data == CMD_BUSY && state != MBOX_IDLE); @@ -464,21 +549,34 @@ task soc_ifc_env_mbox_sequence_base::mbox_poll_status(); `uvm_info("MBOX_SEQ", "Detected mailbox state transition to IDLE - was mbox_unlock expected?", UVM_HIGH) end else if (data == DATA_READY) begin - if (mbox_resp_expected_dlen == 0) + if (mbox_resp_expected_dlen == 0 && sts_rsp_count > 0 && soc_ifc_status_agent_rsp_seq.rsp.cptra_error_non_fatal_intr_pending) begin + `uvm_info("MBOX_SEQ", $sformatf("Unexpected status [%p] likely is the result of a spurious reg access injection specifically intended to cause a protocol violation", data), UVM_HIGH) + end + else if (mbox_resp_expected_dlen == 0) `uvm_error("MBOX_SEQ", $sformatf("Received status %p when not expecting any bytes of response data!", data)) else begin mbox_read_resp_data(); end end else if (data == CMD_FAILURE) begin - `uvm_error("MBOX_SEQ", $sformatf("Received unexpected mailbox status %p", data)) + if (sts_rsp_count > 0 && soc_ifc_status_agent_rsp_seq.rsp.cptra_error_non_fatal_intr_pending) begin + `uvm_info("MBOX_SEQ", $sformatf("Unexpected mailbox status [%p] likely is the result of a spurious reg access injection specifically intended to cause a protocol violation or a mailbox SRAM double bit flip", data), UVM_HIGH) + end + else begin + `uvm_error("MBOX_SEQ", $sformatf("Received mailbox status %p unexpectedly, since there is no pending non_fatal error interrupt", data)) + end end else if (data == CMD_COMPLETE) begin - if (mbox_resp_expected_dlen != 0) + if (mbox_resp_expected_dlen != 0 && sts_rsp_count > 0 && soc_ifc_status_agent_rsp_seq.rsp.cptra_error_non_fatal_intr_pending) + `uvm_info("MBOX_SEQ", $sformatf("Unexpected status [%p] when expecting 0x%x bytes of response data likely is the result of a spurious reg access injection specifically intended to cause a protocol violation", data, mbox_resp_expected_dlen), UVM_HIGH) + else if (mbox_resp_expected_dlen != 0) `uvm_error("MBOX_SEQ", $sformatf("Received status %p when expecting 0x%x bytes of response data!", data, mbox_resp_expected_dlen)) end else begin - `uvm_error("MBOX_SEQ", $sformatf("Received unexpected mailbox status %p", data)) + if (sts_rsp_count > 0 && soc_ifc_status_agent_rsp_seq.rsp.cptra_error_non_fatal_intr_pending) + `uvm_info("MBOX_SEQ", $sformatf("Unexpected mailbox status [%p] likely is the result of a spurious reg access injection specifically intended to cause a protocol violation", data), UVM_HIGH) + else + `uvm_error("MBOX_SEQ", $sformatf("Received unexpected mailbox status [%p]", data)) end endtask @@ -488,12 +586,32 @@ endtask // 0 to mbox_execute register //========================================== task soc_ifc_env_mbox_sequence_base::mbox_clr_execute(); + uvm_reg_data_t err; + + // Write 0 to mbox_execute to clear mbox_lock and end the test reg_model.mbox_csr_rm.mbox_execute.write(reg_sts, uvm_reg_data_t'(0), UVM_FRONTDOOR, reg_model.soc_ifc_APB_map, this, .extension(get_rand_user(PAUSER_PROB_EXECUTE))); report_reg_sts(reg_sts, "mbox_execute"); if (!pauser_used_is_valid() && retry_failed_reg_axs) begin + if (rand_delay_en) do_rand_delay(1, step_delay); reg_model.mbox_csr_rm.mbox_execute.write(reg_sts, uvm_reg_data_t'(0), UVM_FRONTDOOR, reg_model.soc_ifc_APB_map, this, .extension(get_rand_user(FORCE_VALID_PAUSER))); report_reg_sts(reg_sts, "mbox_execute"); end + + if (rand_delay_en) do_rand_delay(1, step_delay); + + // Check for any non-fatal mailbox protocol or sram errors that occurred during the test + reg_model.soc_ifc_reg_rm.CPTRA_HW_ERROR_NON_FATAL.read(reg_sts, err, UVM_FRONTDOOR, reg_model.soc_ifc_APB_map, this, .extension(get_rand_user(500))); + // don't use report_reg_sts since this isn't a mbox reg and doesn't have pauser requirements + if (reg_sts != UVM_IS_OK) begin + `uvm_error("MBOX_SEQ", "Unexpected error on read from CPTRA_HW_ERROR_NON_FATAL") + end + if (|err) begin + `uvm_info("MBOX_SEQ", "Detected non-fatal errors at end of mailbox flow. Clearing.", UVM_LOW) + reg_model.soc_ifc_reg_rm.CPTRA_HW_ERROR_NON_FATAL.write(reg_sts, err, UVM_FRONTDOOR, reg_model.soc_ifc_APB_map, this, .extension(get_rand_user(500))); + if (reg_sts != UVM_IS_OK) begin + `uvm_error("MBOX_SEQ", "Unexpected error on write to CPTRA_HW_ERROR_NON_FATAL") + end + end endtask //========================================== @@ -507,6 +625,33 @@ task soc_ifc_env_mbox_sequence_base::mbox_teardown(); `uvm_info("MBOX_SEQ", $sformatf("Count of mailbox accesses performed with invalid PAUSER: %0d", hit_invalid_pauser_count), UVM_MEDIUM) endtask +//========================================== +// Function: do_rand_delay +// Description: Use the class variable "rand_delay" +// to inject random stalls between various stages +// of the sequence. +// If do_delay_randomize is set to 1, the value +// of rand_delay is re-randomized (according to +// class constraints), otherwise the previous value +// is used. +//========================================== +task soc_ifc_env_mbox_sequence_base::do_rand_delay(input bit do_delay_randomize=1, input delay_scale_e scale=DLY_SMALL); + if (do_delay_randomize) begin + // Update delay constraint based on delay mode + this.zero_delay_c .constraint_mode(scale == DLY_ZERO); + this.small_delay_c .constraint_mode(scale == DLY_SMALL); + this.medium_delay_c.constraint_mode(scale == DLY_MEDIUM); + this.large_delay_c .constraint_mode(scale == DLY_LARGE); + this.custom_delay_c.constraint_mode(scale == DLY_CUSTOM); + if (!this.randomize(rand_delay)) + `uvm_error("MBOX_SEQ", $sformatf("Failed to randomize rand_delay with scale %p", scale)) + else + `uvm_info("MBOX_SEQ", $sformatf("Generated rand delay value: [%0d] cycles from constraint scale %p", rand_delay, scale), UVM_DEBUG) + end + if (rand_delay != 0) + configuration.soc_ifc_ctrl_agent_config.wait_for_num_clocks(rand_delay); +endtask + //========================================== // Function: set_pauser_prob_vals // Description: Assign values to class variables @@ -563,11 +708,14 @@ endfunction // Description: Assess whether the most recent APB // transfer used a valid PAUSER or not //========================================== -function bit soc_ifc_env_mbox_sequence_base::pauser_used_is_valid(); +function bit soc_ifc_env_mbox_sequence_base::pauser_used_is_valid(caliptra_apb_user user_handle = null); + caliptra_apb_user user; + if (user_handle == null) user = this.apb_user_obj; + else user = user_handle; if (this.pauser_locked.locked) - return this.apb_user_obj.get_addr_user() == this.pauser_locked.pauser; + return user.get_addr_user() == this.pauser_locked.pauser; else - return this.apb_user_obj.get_addr_user() inside mbox_valid_users; + return user.get_addr_user() inside mbox_valid_users; endfunction //========================================== @@ -576,20 +724,29 @@ endfunction // of the most recent APB transfer, accounting for // the PAUSER value that was used. //========================================== -function void soc_ifc_env_mbox_sequence_base::report_reg_sts(uvm_status_e reg_sts, string name); +task soc_ifc_env_mbox_sequence_base::report_reg_sts(uvm_status_e reg_sts, string name, caliptra_apb_user user_handle = null); + caliptra_apb_user user; + int waiters = in_report_reg_sts.get_num_waiters(); + in_report_reg_sts.trigger(); + if (user_handle == null) user = this.apb_user_obj; + else user = user_handle; // APB error is flagged only for PAUSER that doesn't match the registered // values, it does not check that PAUSER matches the exact value in // mbox_user that was stored when lock was acquired (this results in a // silent error but a successful reg read). // Ergo, check against mbox_valid_users instead of pauser_locked. - if (reg_sts != UVM_IS_OK && this.apb_user_obj.get_addr_user() inside mbox_valid_users) + if (reg_sts != UVM_IS_OK && user.get_addr_user() inside mbox_valid_users) `uvm_error("MBOX_SEQ", - $sformatf("Register access failed unexpectedly with valid PAUSER! 0x%x (%s)", this.apb_user_obj.get_addr_user(), name)) - else if (reg_sts == UVM_IS_OK && !(this.apb_user_obj.get_addr_user() inside mbox_valid_users)) + $sformatf("Register access failed unexpectedly with valid PAUSER! 0x%x (%s)", user.get_addr_user(), name)) + else if (reg_sts == UVM_IS_OK && !(user.get_addr_user() inside mbox_valid_users)) `uvm_error("MBOX_SEQ", - $sformatf("Register access passed unexpectedly with invalid PAUSER! 0x%x (%s)", this.apb_user_obj.get_addr_user(), name)) + $sformatf("Register access passed unexpectedly with invalid PAUSER! 0x%x (%s)", user.get_addr_user(), name)) else `uvm_info("MBOX_SEQ", - $sformatf("Register access to (%s) with pauser_used_is_valid: %b and reg_sts: %p", name, this.pauser_used_is_valid(), reg_sts), + $sformatf("Register access to (%s) with pauser_used_is_valid: %b and reg_sts: %p", name, this.pauser_used_is_valid(user), reg_sts), UVM_HIGH) -endfunction + if (waiters) + in_report_reg_sts.wait_off(); + else + in_report_reg_sts.reset(); +endtask diff --git a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/sequences/mbox/soc_ifc/soc_ifc_env_mbox_sha_accel_sequence.svh b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/sequences/mbox/soc_ifc/soc_ifc_env_mbox_sha_accel_sequence.svh index f86d996f6..aa6f609cf 100644 --- a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/sequences/mbox/soc_ifc/soc_ifc_env_mbox_sha_accel_sequence.svh +++ b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/sequences/mbox/soc_ifc/soc_ifc_env_mbox_sha_accel_sequence.svh @@ -67,6 +67,15 @@ class soc_ifc_env_mbox_sha_accel_sequence extends soc_ifc_env_mbox_sequence_base constraint start_addr_c {start_addr inside { [4:131068] }; start_addr[1:0] == '0; } + //========================================== + // Function: new + // Description: Constructor + //========================================== + function new(string name = "" ); + super.new(name); + this.mbox_dlen_min_c.constraint_mode(0); + endfunction + endclass task soc_ifc_env_mbox_sha_accel_sequence::mbox_setup(); @@ -127,15 +136,24 @@ task soc_ifc_env_mbox_sha_accel_sequence::mbox_setup(); byte_shift = 'd4 - this.dlen[1:0]; sha_block_data = sha_block_data << (byte_shift * 8); - // Restrict the start addr so that we don't overflow the mailbox - if ( (this.start_addr + this.dlen) > MBOX_SIZE_BYTES ) begin - //if we would have overflowed, just lower start address so the data fits in the mailbox at the end - this.start_addr = MBOX_SIZE_BYTES - (this.dlen); - //round it down to match the alignment of the data - this.start_addr[1:0] = '0; + // Override dlen to reflect the size of the SHA data + the start address dword + this.mbox_op_rand.dlen = 4 + this.dlen; + + // Ensure that the start address is after the data + if ( (this.start_addr <= this.mbox_op_rand.dlen) || ( (this.start_addr + this.dlen) > MBOX_SIZE_BYTES )) begin + // Re-randomize start address to ensure it is after the valid data + // and still meets alignment requirements. + // Restrict the start addr so that we don't overflow the mailbox + this.randomize(this.start_addr) with { this.start_addr >= this.mbox_op_rand.dlen + 4; + this.start_addr + this.dlen <= MBOX_SIZE_BYTES; + this.start_addr[1:0] == 2'b00; }; + end + // This shouldn't happen - if it does we bail out + // Check that re-randomizing start_addr for overlow didn't cause us to + // overlap. Key would have to be like half the mailbox in length which is impossible + if ( (this.start_addr < this.mbox_op_rand.dlen)) begin + `uvm_error("SHA_ACCEL_SEQ",$sformatf("Can't place the key in the mailbox properly Start_Addr: %x Dlen: %x", this.start_addr, this.mbox_op_rand.dlen)) end - // Override dlen to reflect the size of the SHA data - this.mbox_op_rand.dlen = this.start_addr + this.dlen; endtask // This should be overridden with real data to write @@ -143,20 +161,20 @@ task soc_ifc_env_mbox_sha_accel_sequence::mbox_push_datain(); int ii; reg [31:0] data; int most_sig_dword; - int sha_block_start_dw; + //int sha_block_start_dw; //write 0's until the start address - sha_block_start_dw = this.start_addr >> 2; + //sha_block_start_dw = this.start_addr >> 2; //write the start address into the first dword reg_model.mbox_csr_rm.mbox_datain.write(reg_sts, uvm_reg_data_t'(this.start_addr), UVM_FRONTDOOR, reg_model.soc_ifc_APB_map, this, .extension(get_rand_user(PAUSER_PROB_DATAIN))); report_reg_sts(reg_sts, "mbox_datain"); //pad the data until start address - for (ii=1; ii < sha_block_start_dw; ii++) begin - reg_model.mbox_csr_rm.mbox_datain.write(reg_sts, uvm_reg_data_t'('0), UVM_FRONTDOOR, reg_model.soc_ifc_APB_map, this, .extension(get_rand_user(PAUSER_PROB_DATAIN))); - report_reg_sts(reg_sts, "mbox_datain"); - end + //for (ii=1; ii < sha_block_start_dw; ii++) begin + // reg_model.mbox_csr_rm.mbox_datain.write(reg_sts, uvm_reg_data_t'('0), UVM_FRONTDOOR, reg_model.soc_ifc_APB_map, this, .extension(get_rand_user(PAUSER_PROB_DATAIN))); + // report_reg_sts(reg_sts, "mbox_datain"); + //end //write the sha block most_sig_dword = (this.dlen[1:0] == 2'b00) ? (this.dlen >> 2) - 1 : (this.dlen >> 2); @@ -190,4 +208,4 @@ task soc_ifc_env_mbox_sha_accel_sequence::mbox_read_resp_data(); `uvm_error("SHA_ACCEL_SEQ",$sformatf("SHA512 Digest Mismatch - Digest[%x] Expected: %x Actual: %x", ii, sha_digest[digest_dwords-1-ii], data)) end end -endtask \ No newline at end of file +endtask diff --git a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/sequences/mbox/soc_ifc/soc_ifc_env_mbox_sram_double_bit_flip_large_sequence.svh b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/sequences/mbox/soc_ifc/soc_ifc_env_mbox_sram_double_bit_flip_large_sequence.svh new file mode 100644 index 000000000..b26f72ab5 --- /dev/null +++ b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/sequences/mbox/soc_ifc/soc_ifc_env_mbox_sram_double_bit_flip_large_sequence.svh @@ -0,0 +1,44 @@ +//---------------------------------------------------------------------- +// Created with uvmf_gen version 2022.3 +//---------------------------------------------------------------------- +// SPDX-License-Identifier: Apache-2.0 +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +//---------------------------------------------------------------------- +//---------------------------------------------------------------------- +// +// DESCRIPTION: Extended from Mailbox SRAM double bit flip injection +// sequence for the special 'large' test case +// +//---------------------------------------------------------------------- +//---------------------------------------------------------------------- +// +class soc_ifc_env_mbox_sram_double_bit_flip_large_sequence extends soc_ifc_env_mbox_sram_double_bit_flip_sequence; + + `uvm_object_utils( soc_ifc_env_mbox_sram_double_bit_flip_large_sequence ) + + // Constrain size to a large command + // Min. size: 16KiB + constraint mbox_dlen_min_large_c { mbox_op_rand.dlen > 32'h0000_4000; } + // Constrain response data size to also be large + // Min. size: 16KiB + constraint mbox_resp_dlen_min_large_c { mbox_op_rand.cmd.cmd_s.resp_reqd -> mbox_resp_expected_dlen >= 32'h0000_4000; } + // Valid solution for the custom delay ruleset, to control random delays while + // waiting to inject random error accesses + constraint custom_delay_c { rand_delay > 0; + rand_delay dist {[1 :mbox_op_rand.dlen*2 -1] :/ 250, + [mbox_op_rand.dlen*2 :mbox_op_rand.dlen*5 -1] :/ 100, + [mbox_op_rand.dlen*5 :mbox_op_rand.dlen*15-1] :/ 25}; } + +endclass diff --git a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/sequences/mbox/soc_ifc/soc_ifc_env_mbox_sram_double_bit_flip_medium_sequence.svh b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/sequences/mbox/soc_ifc/soc_ifc_env_mbox_sram_double_bit_flip_medium_sequence.svh new file mode 100644 index 000000000..35c7e14ca --- /dev/null +++ b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/sequences/mbox/soc_ifc/soc_ifc_env_mbox_sram_double_bit_flip_medium_sequence.svh @@ -0,0 +1,48 @@ +//---------------------------------------------------------------------- +// Created with uvmf_gen version 2022.3 +//---------------------------------------------------------------------- +// SPDX-License-Identifier: Apache-2.0 +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +//---------------------------------------------------------------------- +//---------------------------------------------------------------------- +// +// DESCRIPTION: Extended from Mailbox SRAM double bit flip injection +// sequence for the special 'medium' test case +// +//---------------------------------------------------------------------- +//---------------------------------------------------------------------- +// +class soc_ifc_env_mbox_sram_double_bit_flip_medium_sequence extends soc_ifc_env_mbox_sram_double_bit_flip_sequence; + + `uvm_object_utils( soc_ifc_env_mbox_sram_double_bit_flip_medium_sequence ) + + // Constrain dlen to be a medium command + // Max. size: 4096B + constraint mbox_dlen_max_medium_c { mbox_op_rand.dlen <= 32'h0000_1000; } + // Minimum 512B + constraint mbox_dlen_min_medium_c { mbox_op_rand.dlen >= 32'h0000_0200; } + // Constrain response data size to also be medium + // Max. size: 4096B + // Min. size: 512B + constraint mbox_resp_dlen_max_medium_c { mbox_resp_expected_dlen <= 32'h0000_1000; } + constraint mbox_resp_dlen_min_medium_c { mbox_op_rand.cmd.cmd_s.resp_reqd -> mbox_resp_expected_dlen >= 32'h0000_0200; } + // Valid solution for the custom delay ruleset, to control random delays while + // waiting to inject random error accesses + constraint custom_delay_c { rand_delay > 0; + rand_delay dist {[1 :mbox_op_rand.dlen*2 -1] :/ 250, + [mbox_op_rand.dlen*2 :mbox_op_rand.dlen*5 -1] :/ 100, + [mbox_op_rand.dlen*5 :mbox_op_rand.dlen*15-1] :/ 25}; } + +endclass diff --git a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/sequences/mbox/soc_ifc/soc_ifc_env_mbox_sram_double_bit_flip_sequence.svh b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/sequences/mbox/soc_ifc/soc_ifc_env_mbox_sram_double_bit_flip_sequence.svh new file mode 100644 index 000000000..22f0a3134 --- /dev/null +++ b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/sequences/mbox/soc_ifc/soc_ifc_env_mbox_sram_double_bit_flip_sequence.svh @@ -0,0 +1,105 @@ +//---------------------------------------------------------------------- +// Created with uvmf_gen version 2022.3 +//---------------------------------------------------------------------- +// SPDX-License-Identifier: Apache-2.0 +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +//---------------------------------------------------------------------- +//---------------------------------------------------------------------- +// +// DESCRIPTION: Extended from mbox sequence base to exercise double-bit flips +// on the mailbox SRAM. +// Desired result is to observe the internal error interrupt and +// assertion of the cptra_error_non_fatal pin. +// After responding to the error by clearing the interrupts, the +// mailbox flow will be terminated. +// NOTES: +// - SOC may respond with any of: +// 1. Wait for uC to clear the internal interrupt / reset the mbox +// FSM (or proceed with the cmd as normal), then proceed to +// clear the cptra_error_non_fatal pin +// 2. Clear the cptra_error_non_fatal pin immediately, issue a new command +// (still requires waiting for LOCK) +// 3. Reset Caliptra +// +//---------------------------------------------------------------------- +//---------------------------------------------------------------------- +// +class soc_ifc_env_mbox_sram_double_bit_flip_sequence extends soc_ifc_env_mbox_sequence_base; + + `uvm_object_utils( soc_ifc_env_mbox_sram_double_bit_flip_sequence ) + + // Constrain command to undefined opcode + constraint mbox_cmd_undef_c { !(mbox_op_rand.cmd.cmd_s inside {defined_cmds}); } + + function new(string name = "" ); + super.new(name); + endfunction + + //========================================== + // Task: body + // Description: Implement main functionality for + // SOC-side transmission of mailbox request. + // Override default body to inject double + // bit flips into the Mailbox SRAM at random + // throughout a normal test flow. + //========================================== + virtual task body(); + + op_sts_e op_sts; + process mbox_flow_proc; + process err_proc; + + sts_rsp_count = 0; + + fork + forever begin + @(soc_ifc_status_agent_rsp_seq.new_rsp) sts_rsp_count++; + end + join_none + + `uvm_info("MBOX_SEQ", $sformatf("Initiating command sequence to mailbox with cmd: [%p] dlen: [%p] resp_dlen: [%p]", mbox_op_rand.cmd.cmd_e, mbox_op_rand.dlen, mbox_resp_expected_dlen), UVM_MEDIUM) + + fork + begin: MBOX_FLOW + mbox_setup(); if (rand_delay_en) do_rand_delay(1, step_delay); + mbox_acquire_lock(op_sts); if (rand_delay_en) do_rand_delay(1, step_delay); + mbox_flow_proc = process::self(); + mbox_set_cmd(mbox_op_rand); if (rand_delay_en) do_rand_delay(1, step_delay); + mbox_push_datain(); if (rand_delay_en) do_rand_delay(1, step_delay); + mbox_execute(); if (rand_delay_en) do_rand_delay(1, step_delay); + mbox_poll_status(); if (rand_delay_en) do_rand_delay(1, step_delay); + if (err_proc.status() == process::WAITING) begin + `uvm_info("MBOX_SEQ", "Ending SRAM bit flip injection thread before it has completed!", UVM_LOW) + disable ERR_INJECT_FLOW; + end + else if (err_proc.status() != process::FINISHED) begin + `uvm_error("MBOX_SEQ", $sformatf("Error process is in unexpected state %s!", err_proc.status().name())) + end + end + begin: ERR_INJECT_FLOW + err_proc = process::self(); + wait(mbox_flow_proc != null); + // Wait and do the SRAM error injection at some random point in the sequence + do_rand_delay(1, DLY_CUSTOM); + `uvm_info("MBOX_SEQ", "Triggering Mailbox SRAM double-bit flip injection", UVM_LOW) + set_mbox_sram_ecc_double_error_injection(); + end + join + mbox_clr_execute(); if (rand_delay_en) do_rand_delay(1, step_delay); + mbox_teardown(); + + endtask + +endclass diff --git a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/sequences/mbox/soc_ifc/soc_ifc_env_mbox_sram_double_bit_flip_small_sequence.svh b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/sequences/mbox/soc_ifc/soc_ifc_env_mbox_sram_double_bit_flip_small_sequence.svh new file mode 100644 index 000000000..37e77b4b1 --- /dev/null +++ b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/sequences/mbox/soc_ifc/soc_ifc_env_mbox_sram_double_bit_flip_small_sequence.svh @@ -0,0 +1,44 @@ +//---------------------------------------------------------------------- +// Created with uvmf_gen version 2022.3 +//---------------------------------------------------------------------- +// SPDX-License-Identifier: Apache-2.0 +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +//---------------------------------------------------------------------- +//---------------------------------------------------------------------- +// +// DESCRIPTION: Extended from Mailbox SRAM double bit flip injection +// sequence for the special 'small' test case +// +//---------------------------------------------------------------------- +//---------------------------------------------------------------------- +// +class soc_ifc_env_mbox_sram_double_bit_flip_small_sequence extends soc_ifc_env_mbox_sram_double_bit_flip_sequence; + + `uvm_object_utils( soc_ifc_env_mbox_sram_double_bit_flip_small_sequence ) + + // Constrain dlen to be a small command + // Max. size: 512B + constraint mbox_dlen_max_small_c { mbox_op_rand.dlen <= 32'h0000_0200; } + // Constrain response data size to also be small + // Max. size: 512B + constraint mbox_resp_dlen_max_small_c { mbox_resp_expected_dlen < 32'h0000_0200; } + // Valid solution for the custom delay ruleset, to control random delays while + // waiting to inject random error accesses + constraint custom_delay_c { rand_delay > 0; + rand_delay dist {[1 :mbox_op_rand.dlen*2 -1] :/ 250, + [mbox_op_rand.dlen*2 :mbox_op_rand.dlen*5 -1] :/ 100, + [mbox_op_rand.dlen*5 :mbox_op_rand.dlen*15-1] :/ 25}; } + +endclass diff --git a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/sequences/mbox/soc_ifc/soc_ifc_env_mbox_uc_reg_access_sequence.svh b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/sequences/mbox/soc_ifc/soc_ifc_env_mbox_uc_reg_access_sequence.svh index 6a04950c9..6b46cd035 100644 --- a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/sequences/mbox/soc_ifc/soc_ifc_env_mbox_uc_reg_access_sequence.svh +++ b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/sequences/mbox/soc_ifc/soc_ifc_env_mbox_uc_reg_access_sequence.svh @@ -63,6 +63,9 @@ class soc_ifc_env_mbox_uc_reg_access_sequence extends soc_ifc_env_mbox_sequence_ out_of_bounds == 1 -> mbox_op_rand.dlen == 32'h8; //min dlen for "resp req" command solve out_of_bounds before mbox_op_rand; solve num_reg before mbox_op_rand; } + + // Response dlen should be the same as the dlen since we read once for each reg access + constraint mbox_resp_dlen_c {mbox_resp_expected_dlen == mbox_op_rand.dlen;} // pick a slave to select an address in a valid range constraint slave_sel_c { slave_sel.size() == num_reg; diff --git a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/sequences/mbox/soc_ifc/soc_ifc_env_soc_mbox_handler_sequence.svh b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/sequences/mbox/soc_ifc/soc_ifc_env_soc_mbox_handler_sequence.svh index 4941d69a1..028e280af 100644 --- a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/sequences/mbox/soc_ifc/soc_ifc_env_soc_mbox_handler_sequence.svh +++ b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/sequences/mbox/soc_ifc/soc_ifc_env_soc_mbox_handler_sequence.svh @@ -36,6 +36,7 @@ class soc_ifc_env_soc_mbox_handler_sequence extends soc_ifc_env_sequence_base #( mbox_op_s op; uvm_status_e reg_sts; int sts_rsp_count = 0; + uvm_event in_report_reg_sts; // PAUSER tracking/override bit [apb5_master_0_params::PAUSER_WIDTH-1:0] mbox_valid_users [6]; @@ -48,9 +49,10 @@ class soc_ifc_env_soc_mbox_handler_sequence extends soc_ifc_env_sequence_base #( extern virtual task mbox_pop_dataout(); extern virtual task mbox_set_status(); extern virtual task mbox_check_fsm(); + extern virtual task mbox_wait_done(); extern virtual task mbox_teardown(); - extern virtual function void report_reg_sts(uvm_status_e sts, string name); + extern virtual task report_reg_sts(uvm_status_e sts, string name, caliptra_apb_user user_handle = null); //========================================== @@ -63,6 +65,9 @@ class soc_ifc_env_soc_mbox_handler_sequence extends soc_ifc_env_sequence_base #( // Setup a User object to override PAUSER apb_user_obj = new(); + // Event + in_report_reg_sts = new(); + endfunction //========================================== @@ -106,16 +111,13 @@ class soc_ifc_env_soc_mbox_handler_sequence extends soc_ifc_env_sequence_base #( // Get COMMAND mbox_get_command(); - - // Get DATAOUT mbox_pop_dataout(); - // Set STATUS + // Return control to uC mbox_set_status(); - - // Check FSM status configuration.soc_ifc_ctrl_agent_config.wait_for_num_clocks(2); // Takes a few cycles for FSM update to propagate into register mbox_check_fsm(); + mbox_wait_done(); // End of Sequence mbox_teardown(); @@ -272,11 +274,48 @@ task soc_ifc_env_soc_mbox_handler_sequence::mbox_check_fsm(); report_reg_sts(reg_sts,"mbox_status"); fsm_state = mbox_fsm_state_e'(data >> reg_model.mbox_csr_rm.mbox_status.mbox_fsm_ps.get_lsb_pos()); - if (fsm_state != MBOX_EXECUTE_UC) begin + if (fsm_state inside {MBOX_IDLE, MBOX_ERROR} && (sts_rsp_count > 0) && soc_ifc_status_agent_rsp_seq.rsp.cptra_error_non_fatal_intr_pending) begin + `uvm_info("SOC_MBOX_HANDLER", $sformatf("Observed mailbox FSM state: %p, which is not a failure since it corresponds with non_fatal HW interrupt", fsm_state), UVM_MEDIUM) + end + else if (fsm_state != MBOX_EXECUTE_UC) begin `uvm_error("SOC_MBOX_HANDLER", $sformatf("Unexpected mailbox FSM state: %p", fsm_state)) end endtask +//========================================== +// Task: mbox_wait_done +// Description: Wait for uC to end the mailbox flow as indicated +// by mbox_lock being relinquished. +// If necessary, service any cptra HW error (fatal or +// non_fatal) that occurred. +//========================================== +task soc_ifc_env_soc_mbox_handler_sequence::mbox_wait_done(); + uvm_reg_data_t non_fatal, fatal; + + // Wait for lock to clear + while(reg_model.mbox_csr_rm.mbox_lock.get_mirrored_value()) + configuration.soc_ifc_ctrl_agent_config.wait_for_num_clocks(1); + + // Check for interrupts + if (sts_rsp_count && (soc_ifc_status_agent_rsp_seq.rsp.cptra_error_non_fatal_intr_pending || + soc_ifc_status_agent_rsp_seq.rsp.cptra_error_fatal_intr_pending)) begin + // Read status + reg_model.soc_ifc_reg_rm.CPTRA_HW_ERROR_NON_FATAL.read(reg_sts, non_fatal, UVM_FRONTDOOR, reg_model.soc_ifc_APB_map, this, .extension(apb_user_obj)); + report_reg_sts(reg_sts, "CPTRA_HW_ERROR_NON_FATAL"); + reg_model.soc_ifc_reg_rm.CPTRA_HW_ERROR_FATAL.read(reg_sts, fatal, UVM_FRONTDOOR, reg_model.soc_ifc_APB_map, this, .extension(apb_user_obj)); + report_reg_sts(reg_sts, "CPTRA_HW_ERROR_FATAL"); + + if (~|fatal && ~|non_fatal) + `uvm_error("SOC_MBOX_HANDLER", $sformatf("Received status response transaction with cptra error asserted [%s] but both fatal and non_fatal registers are 0!", soc_ifc_status_agent_rsp_seq.rsp.convert2string())) + + // Write 1 to clear + reg_model.soc_ifc_reg_rm.CPTRA_HW_ERROR_NON_FATAL.write(reg_sts, non_fatal, UVM_FRONTDOOR, reg_model.soc_ifc_APB_map, this, .extension(apb_user_obj)); + report_reg_sts(reg_sts, "CPTRA_HW_ERROR_NON_FATAL"); + reg_model.soc_ifc_reg_rm.CPTRA_HW_ERROR_FATAL.write(reg_sts, fatal, UVM_FRONTDOOR, reg_model.soc_ifc_APB_map, this, .extension(apb_user_obj)); + report_reg_sts(reg_sts, "CPTRA_HW_ERROR_FATAL"); + end +endtask + //========================================== // Task: mbox_teardown // Description: Placeholder task to allow derived classes @@ -293,20 +332,29 @@ endtask // of the most recent APB transfer, accounting for // the PAUSER value that was used. //========================================== -function void soc_ifc_env_soc_mbox_handler_sequence::report_reg_sts(uvm_status_e sts, string name); +task soc_ifc_env_soc_mbox_handler_sequence::report_reg_sts(uvm_status_e sts, string name, caliptra_apb_user user_handle = null); + caliptra_apb_user user; + int waiters = in_report_reg_sts.get_num_waiters(); + in_report_reg_sts.trigger(); + if (user_handle == null) user = this.apb_user_obj; + else user = user_handle; // APB error is flagged only for PAUSER that doesn't match the registered // values, it does not check that PAUSER matches the exact value in // mbox_user that was stored when lock was acquired (this results in a // silent error but a successful reg read). // Ergo, check against mbox_valid_users instead of pauser_locked. - if (sts != UVM_IS_OK && this.apb_user_obj.get_addr_user() inside mbox_valid_users) + if (sts != UVM_IS_OK && user.get_addr_user() inside mbox_valid_users) `uvm_error("SOC_MBOX_HANDLER", - $sformatf("Register access failed unexpectedly with valid PAUSER! 0x%x (%s)", this.apb_user_obj.get_addr_user(), name)) - else if (sts == UVM_IS_OK && !(this.apb_user_obj.get_addr_user() inside mbox_valid_users)) + $sformatf("Register access failed unexpectedly with valid PAUSER! 0x%x (%s)", user.get_addr_user(), name)) + else if (sts == UVM_IS_OK && !(user.get_addr_user() inside mbox_valid_users)) `uvm_error("SOC_MBOX_HANDLER", - $sformatf("Register access passed unexpectedly with invalid PAUSER! 0x%x (%s)", this.apb_user_obj.get_addr_user(), name)) + $sformatf("Register access passed unexpectedly with invalid PAUSER! 0x%x (%s)", user.get_addr_user(), name)) else `uvm_info("SOC_MBOX_HANDLER", $sformatf("Register access to (%s) with pauser_used_is_valid: %b and sts: %p", name, 1/* this.pauser_used_is_valid()*/, sts), UVM_HIGH) -endfunction + if (waiters) + in_report_reg_sts.wait_off(); + else + in_report_reg_sts.reset(); +endtask diff --git a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/sequences/mbox/soc_ifc/soc_ifc_env_soc_mbox_reg_axs_invalid_handler_sequence.svh b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/sequences/mbox/soc_ifc/soc_ifc_env_soc_mbox_reg_axs_invalid_handler_sequence.svh new file mode 100644 index 000000000..9c5b1a209 --- /dev/null +++ b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/sequences/mbox/soc_ifc/soc_ifc_env_soc_mbox_reg_axs_invalid_handler_sequence.svh @@ -0,0 +1,207 @@ +//---------------------------------------------------------------------- +// Created with uvmf_gen version 2022.3 +//---------------------------------------------------------------------- +// SPDX-License-Identifier: Apache-2.0 +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// pragma uvmf custom header begin +// pragma uvmf custom header end +//---------------------------------------------------------------------- +//---------------------------------------------------------------------- +// +// DESCRIPTION: Sequence to wait for Mailbox commands (from uC) and +// respond/handle the command. +// This sequence also injects protocol errors into the mailbox +// by performing out-of-order register accesses. +// +//---------------------------------------------------------------------- +//---------------------------------------------------------------------- +// +class soc_ifc_env_soc_mbox_reg_axs_invalid_handler_sequence extends soc_ifc_env_soc_mbox_handler_sequence; + + + `uvm_object_utils( soc_ifc_env_soc_mbox_reg_axs_invalid_handler_sequence ) + + extern virtual task mbox_do_random_reg_write(process mainline); + extern virtual function uvm_reg_data_t get_rand_wr_data(uvm_reg axs_reg); + + //========================================== + // Task: body + // Description: Implement main functionality for + // Caliptra-side handling of received + // mailbox request. + //========================================== + virtual task body(); + + op_sts_e op_sts; + bit do_fsm_chk = 1; + process mbox_flow_proc; + reg_model = configuration.soc_ifc_rm; + + if (soc_ifc_status_agent_rsp_seq == null) + `uvm_fatal("SOC_MBOX_HANDLER", "SOC_IFC ENV SOC mailbox handler sequence expected a handle to the soc_ifc status agent responder sequence (from bench-level sequence) but got null!") + fork + forever begin + @(soc_ifc_status_agent_rsp_seq.new_rsp) sts_rsp_count++; + end + join_none + + // Setup + mbox_setup(); + + fork + begin: HANDLER_FLOW + mbox_flow_proc = process::self(); + // Wait for a mailbox command to be received + mbox_wait_for_command(op_sts); + if (op_sts != CPTRA_SUCCESS) begin + `uvm_error("SOC_MBOX_HANDLER", "Unsuccessful return code from wait_for_command_avail()") + end + + // Get COMMAND + mbox_get_command(); + mbox_pop_dataout(); + + // Return control to uC + if (sts_rsp_count && !soc_ifc_status_agent_rsp_seq.rsp.mailbox_data_avail) begin + // Our random_reg_write may write to mbox_status and cause us to exit EXECUTE_SOC early... + do_fsm_chk = 0; + end + mbox_set_status(); + configuration.soc_ifc_ctrl_agent_config.wait_for_num_clocks(2); // Takes a few cycles for FSM update to propagate into register + if (do_fsm_chk) + mbox_check_fsm(); + end + begin: ERR_INJECT_FLOW + wait(mbox_flow_proc != null); + mbox_do_random_reg_write(mbox_flow_proc); + end + join + mbox_wait_done(); + + // End of Sequence + mbox_teardown(); + + endtask + +endclass + +//========================================== +// Task: mbox_do_random_reg_write +// Description: Do some random reg write that will +// (most likely) be invalid and trigger +// the protocol error violation. +//========================================== +task soc_ifc_env_soc_mbox_reg_axs_invalid_handler_sequence::mbox_do_random_reg_write(process mainline); + uvm_reg mbox_regs[$]; + int unsigned rand_idx; + int unsigned rand_delay; + uvm_reg_data_t rand_wr_data; + caliptra_apb_user local_apb_user_obj; + + mbox_regs.push_back(reg_model.mbox_csr_rm.mbox_cmd ); + mbox_regs.push_back(reg_model.mbox_csr_rm.mbox_dlen ); + mbox_regs.push_back(reg_model.mbox_csr_rm.mbox_datain ); + mbox_regs.push_back(reg_model.mbox_csr_rm.mbox_dataout); + mbox_regs.push_back(reg_model.mbox_csr_rm.mbox_execute); + mbox_regs.push_back(reg_model.mbox_csr_rm.mbox_status ); + + if (!std::randomize(rand_idx) with {rand_idx < mbox_regs.size(); }) + `uvm_fatal("SOC_MBOX_HANDLER", "Failed to randomize reg idx") + + // Wait to do the reg write at some random point in the sequence + std::randomize(rand_delay) with {rand_delay dist {[1:255] :/ 5, [256:1023] :/ 3, [1024:65535] :/ 1};}; + configuration.soc_ifc_ctrl_agent_config.wait_for_num_clocks(rand_delay); + + // Data used depends on which reg is being accessed to force invalid contents + rand_wr_data = get_rand_wr_data(mbox_regs[rand_idx]); + + // Get a randomized PAUSER for this transaction - 50% chance of being valid + local_apb_user_obj = new(); + if (!local_apb_user_obj.randomize() with {(addr_user inside {mbox_valid_users}) dist + {1 :/ 1, + 0 :/ 1}; }) + `uvm_error("SOC_MBOX_HANDLER", "Failed to randomize APB PAUSER override value") + else + `uvm_info("SOC_MBOX_HANDLER", $sformatf("Randomized APB PAUSER override value to 0x%x", local_apb_user_obj.addr_user), UVM_HIGH) + + // Pause the main mailbox responder flow to prevent race conditions (on accesses to the same register, triggering is_busy UVM_WARNING) + if (mainline.status() inside {process::RUNNING,process::WAITING}) begin + in_report_reg_sts.wait_on(); + `uvm_info("SOC_MBOX_HANDLER", $sformatf("Pausing main mailbox flow to allow random reg access injection"), UVM_HIGH) + mainline.suspend(); + in_report_reg_sts.reset(); + end + else begin + `uvm_info("SOC_MBOX_HANDLER", $sformatf("Main mailbox flow is in state [%s], so it will not be suspended for random reg access injection", mainline.status().name()), UVM_HIGH) + end + + // Do the access + `uvm_info("SOC_MBOX_HANDLER", {"Performing random register access to ", mbox_regs[rand_idx].get_name()}, UVM_LOW) + if (mbox_regs[rand_idx].get_name() == "mbox_dataout") begin + mbox_regs[rand_idx].read(reg_sts, rand_wr_data, UVM_FRONTDOOR, reg_model.soc_ifc_APB_map, this, .extension(local_apb_user_obj)); + report_reg_sts(reg_sts, mbox_regs[rand_idx].get_name(), local_apb_user_obj); + end + else if (mbox_regs[rand_idx].get_name() == "mbox_datain") begin + wait(reg_model.mbox_csr_rm.mbox_fn_state_sigs.uc_receive_stage == 1'b0); + mbox_regs[rand_idx].write(reg_sts, rand_wr_data, UVM_FRONTDOOR, reg_model.soc_ifc_APB_map, this, .extension(local_apb_user_obj)); + report_reg_sts(reg_sts, mbox_regs[rand_idx].get_name(), local_apb_user_obj); + end + else begin + mbox_regs[rand_idx].write(reg_sts, rand_wr_data, UVM_FRONTDOOR, reg_model.soc_ifc_APB_map, this, .extension(local_apb_user_obj)); + report_reg_sts(reg_sts, mbox_regs[rand_idx].get_name(), local_apb_user_obj); + end + if (mainline.status() == process::SUSPENDED) begin + `uvm_info("SOC_MBOX_HANDLER", $sformatf("Resuming main mailbox flow after random reg access injection"), UVM_HIGH) + mainline.resume(); + end +endtask + +//========================================== +// Task: get_rand_wr_data +// Description: Generate random data according +// to a set of rules related to which register +// is being accessed, with intent to cause +// a protocol violation. +//========================================== +function uvm_reg_data_t soc_ifc_env_soc_mbox_reg_axs_invalid_handler_sequence::get_rand_wr_data(uvm_reg axs_reg); + uvm_reg_data_t tmp_data; + case (axs_reg.get_name()) inside + "mbox_cmd": begin + tmp_data = op.cmd; + end + "mbox_dlen": begin + tmp_data = op.dlen; + end + "mbox_datain", + "mbox_dataout": begin + std::randomize(tmp_data); + end + "mbox_execute": begin + uvm_reg_data_t msk; + msk = ~(uvm_reg_data_t'(1) << reg_model.mbox_csr_rm.mbox_execute.execute.get_lsb_pos()); + std::randomize(tmp_data) with {(tmp_data & msk) == 0;}; + end + "mbox_status": begin + uvm_reg_data_t msk; + msk = (uvm_reg_data_t'(1) << reg_model.mbox_csr_rm.mbox_status.status.get_n_bits()) - 1; + msk = ~msk; + std::randomize(tmp_data) with {(tmp_data & msk) == 0;}; + end + default: begin + `uvm_fatal("SOC_MBOX_HANDLER", "Bad reg") + end + endcase + return tmp_data; +endfunction diff --git a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/sequences/mbox/soc_ifc_env_top_cptra_mbox_reg_axs_invalid_small_sequence.svh b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/sequences/mbox/soc_ifc_env_top_cptra_mbox_reg_axs_invalid_small_sequence.svh new file mode 100644 index 000000000..e97196520 --- /dev/null +++ b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/sequences/mbox/soc_ifc_env_top_cptra_mbox_reg_axs_invalid_small_sequence.svh @@ -0,0 +1,44 @@ +//---------------------------------------------------------------------- +// Created with uvmf_gen version 2022.3 +//---------------------------------------------------------------------- +// SPDX-License-Identifier: Apache-2.0 +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +//---------------------------------------------------------------------- +//---------------------------------------------------------------------- +// +// DESCRIPTION: Sequence to initiate (and respond) to mailbox command +// "TOP" sequence because it invokes lower level env sequences +// to facilitate the uC/SoC sides of mailbox command handling +// and this sequence defines the whole mailbox flow. +// +//---------------------------------------------------------------------- +//---------------------------------------------------------------------- +// +class soc_ifc_env_top_cptra_mbox_reg_axs_invalid_small_sequence extends soc_ifc_env_top_cptra_mbox_sequence_base; + + + `uvm_object_utils( soc_ifc_env_top_cptra_mbox_reg_axs_invalid_small_sequence ) + + extern virtual function create_seqs(); + +endclass + +function soc_ifc_env_top_cptra_mbox_reg_axs_invalid_small_sequence::create_seqs(); + uvm_object obj; + obj = soc_ifc_env_cptra_mbox_req_rand_small_sequence_t::get_type().create_object("soc_ifc_env_cptra_mbox_seq"); + if(!$cast(soc_ifc_env_cptra_mbox_seq,obj)) `uvm_fatal("SOC_IFC_TOP_MBOX_REG_AXS_INVALID_SMALL", "soc_ifc_env_top_cptra_mbox_reg_axs_invalid_small_sequence::create_seqs() - .create_object() failed") + obj = soc_ifc_env_soc_mbox_reg_axs_invalid_handler_sequence_t::get_type().create_object("soc_ifc_env_soc_handler_seq"); + if(!$cast(soc_ifc_env_soc_handler_seq,obj)) `uvm_fatal("SOC_IFC_TOP_MBOX_REG_AXS_INVALID_SMALL", "soc_ifc_env_top_cptra_mbox_reg_axs_invalid_small_sequence::create_seqs() - .create_object() failed") +endfunction diff --git a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/sequences/mbox/soc_ifc_env_top_mbox_dlen_violation_sequence.svh b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/sequences/mbox/soc_ifc_env_top_mbox_dlen_violation_sequence.svh index 0ef5560b3..4d754b25e 100644 --- a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/sequences/mbox/soc_ifc_env_top_mbox_dlen_violation_sequence.svh +++ b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/sequences/mbox/soc_ifc_env_top_mbox_dlen_violation_sequence.svh @@ -39,27 +39,38 @@ function soc_ifc_env_top_mbox_dlen_violation_sequence::create_seqs(); uvm_object obj; enum { + MBOX_MIN, + MBOX_MAX, MBOX_UNDERFLOW_SMALL, MBOX_UNDERFLOW_MEDIUM, MBOX_UNDERFLOW_LARGE, MBOX_OVERFLOW_SMALL, MBOX_OVERFLOW_MEDIUM, - MBOX_OVERFLOW_LARGE + MBOX_OVERFLOW_LARGE, + MBOX_INVALID } mbox_sel; enum { + CPTRA_STANDARD, CPTRA_UNDERREAD, CPTRA_OVERREAD } cptra_sel; - if (!std::randomize(mbox_sel,cptra_sel) with {mbox_sel dist {MBOX_UNDERFLOW_SMALL :/ 100, + if (!std::randomize(mbox_sel,cptra_sel) with {mbox_sel dist {MBOX_MIN :/ 100, + MBOX_MAX :/ 100, + MBOX_UNDERFLOW_SMALL :/ 100, MBOX_UNDERFLOW_MEDIUM :/ 100, - MBOX_UNDERFLOW_LARGE :/ 1, + MBOX_UNDERFLOW_LARGE :/ 10, MBOX_OVERFLOW_SMALL :/ 100, MBOX_OVERFLOW_MEDIUM :/ 100, - MBOX_OVERFLOW_LARGE :/ 1};}) + MBOX_OVERFLOW_LARGE :/ 10, + MBOX_INVALID :/ 10};}) `uvm_fatal("SOC_IFC_MBOX_TOP", "Failed to randomize sub-sequence types") case (mbox_sel) inside + MBOX_MIN: + obj = soc_ifc_env_mbox_min_sequence_t::get_type().create_object("soc_ifc_env_mbox_seq"); + MBOX_MAX: + obj = soc_ifc_env_mbox_max_sequence_t::get_type().create_object("soc_ifc_env_mbox_seq"); MBOX_UNDERFLOW_SMALL: obj = soc_ifc_env_mbox_dlen_underflow_small_sequence_t::get_type().create_object("soc_ifc_env_mbox_seq"); MBOX_UNDERFLOW_MEDIUM: @@ -72,11 +83,15 @@ function soc_ifc_env_top_mbox_dlen_violation_sequence::create_seqs(); obj = soc_ifc_env_mbox_dlen_overflow_medium_sequence_t::get_type().create_object("soc_ifc_env_mbox_seq"); MBOX_OVERFLOW_LARGE: obj = soc_ifc_env_mbox_dlen_overflow_large_sequence_t::get_type().create_object("soc_ifc_env_mbox_seq"); + MBOX_INVALID: + obj = soc_ifc_env_mbox_dlen_invalid_sequence_t::get_type().create_object("soc_ifc_env_mbox_seq"); default: `uvm_fatal("SOC_IFC_MBOX_TOP","Bad mbox_sel") endcase if(!$cast(soc_ifc_env_mbox_seq,obj)) `uvm_fatal("SOC_IFC_TOP_MBOX", "soc_ifc_env_top_mbox_dlen_violation::create_seqs() - .create_object() failed") case (cptra_sel) inside + CPTRA_STANDARD: + obj = soc_ifc_env_cptra_mbox_handler_sequence_t::get_type().create_object("soc_ifc_env_cptra_handler_seq"); CPTRA_UNDERREAD: obj = soc_ifc_env_cptra_mbox_dlen_underread_handler_sequence_t::get_type().create_object("soc_ifc_env_cptra_handler_seq"); CPTRA_OVERREAD: diff --git a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/sequences/mbox/soc_ifc_env_top_mbox_max_sequence.svh b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/sequences/mbox/soc_ifc_env_top_mbox_max_sequence.svh new file mode 100644 index 000000000..0203322de --- /dev/null +++ b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/sequences/mbox/soc_ifc_env_top_mbox_max_sequence.svh @@ -0,0 +1,43 @@ +//---------------------------------------------------------------------- +// Created with uvmf_gen version 2022.3 +//---------------------------------------------------------------------- +// SPDX-License-Identifier: Apache-2.0 +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +//---------------------------------------------------------------------- +//---------------------------------------------------------------------- +// +// DESCRIPTION: Sequence to initiate (and respond) to mailbox command +// "TOP" sequence because it invokes lower level env sequences +// to facilitate the uC/SoC sides of mailbox command handling +// and this sequence defines the whole mailbox flow. +// +//---------------------------------------------------------------------- +//---------------------------------------------------------------------- +// +class soc_ifc_env_top_mbox_max_sequence extends soc_ifc_env_top_mbox_sequence_base; + + + `uvm_object_utils( soc_ifc_env_top_mbox_max_sequence ) + + extern virtual function create_seqs(); + +endclass + +function soc_ifc_env_top_mbox_max_sequence::create_seqs(); + uvm_object obj; + obj = soc_ifc_env_mbox_max_sequence_t::get_type().create_object("soc_ifc_env_mbox_seq"); + if(!$cast(soc_ifc_env_mbox_seq,obj)) `uvm_fatal("SOC_IFC_TOP_MBOX_RAND_SMALL", "soc_ifc_env_top_mbox_max_sequence::create_seqs() - .create_object() failed") + soc_ifc_env_cptra_handler_seq = soc_ifc_env_cptra_mbox_dlen_overread_handler_sequence_t::type_id::create("soc_ifc_env_cptra_handler_seq"); +endfunction diff --git a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/sequences/mbox/soc_ifc_env_top_mbox_min_sequence.svh b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/sequences/mbox/soc_ifc_env_top_mbox_min_sequence.svh new file mode 100644 index 000000000..2e9b3d567 --- /dev/null +++ b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/sequences/mbox/soc_ifc_env_top_mbox_min_sequence.svh @@ -0,0 +1,43 @@ +//---------------------------------------------------------------------- +// Created with uvmf_gen version 2022.3 +//---------------------------------------------------------------------- +// SPDX-License-Identifier: Apache-2.0 +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +//---------------------------------------------------------------------- +//---------------------------------------------------------------------- +// +// DESCRIPTION: Sequence to initiate (and respond) to mailbox command +// "TOP" sequence because it invokes lower level env sequences +// to facilitate the uC/SoC sides of mailbox command handling +// and this sequence defines the whole mailbox flow. +// +//---------------------------------------------------------------------- +//---------------------------------------------------------------------- +// +class soc_ifc_env_top_mbox_min_sequence extends soc_ifc_env_top_mbox_sequence_base; + + + `uvm_object_utils( soc_ifc_env_top_mbox_min_sequence ) + + extern virtual function create_seqs(); + +endclass + +function soc_ifc_env_top_mbox_min_sequence::create_seqs(); + uvm_object obj; + obj = soc_ifc_env_mbox_min_sequence_t::get_type().create_object("soc_ifc_env_mbox_seq"); + if(!$cast(soc_ifc_env_mbox_seq,obj)) `uvm_fatal("SOC_IFC_TOP_MBOX_RAND_SMALL", "soc_ifc_env_top_mbox_min_sequence::create_seqs() - .create_object() failed") + soc_ifc_env_cptra_handler_seq = soc_ifc_env_cptra_mbox_dlen_overread_handler_sequence_t::type_id::create("soc_ifc_env_cptra_handler_seq"); +endfunction diff --git a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/sequences/mbox/soc_ifc_env_top_mbox_rand_delay_large_sequence.svh b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/sequences/mbox/soc_ifc_env_top_mbox_rand_delay_large_sequence.svh new file mode 100644 index 000000000..d0e10e8f8 --- /dev/null +++ b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/sequences/mbox/soc_ifc_env_top_mbox_rand_delay_large_sequence.svh @@ -0,0 +1,43 @@ +//---------------------------------------------------------------------- +// Created with uvmf_gen version 2022.3 +//---------------------------------------------------------------------- +// SPDX-License-Identifier: Apache-2.0 +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +//---------------------------------------------------------------------- +//---------------------------------------------------------------------- +// +// DESCRIPTION: Sequence to initiate (and respond) to mailbox command +// "TOP" sequence because it invokes lower level env sequences +// to facilitate the uC/SoC sides of mailbox command handling +// and this sequence defines the whole mailbox flow. +// +//---------------------------------------------------------------------- +//---------------------------------------------------------------------- +// +class soc_ifc_env_top_mbox_rand_delay_large_sequence extends soc_ifc_env_top_mbox_sequence_base; + + + `uvm_object_utils( soc_ifc_env_top_mbox_rand_delay_large_sequence ) + + extern virtual function create_seqs(); + +endclass + +function soc_ifc_env_top_mbox_rand_delay_large_sequence::create_seqs(); + uvm_object obj; + obj = soc_ifc_env_mbox_rand_delay_large_sequence_t::get_type().create_object("soc_ifc_env_mbox_seq"); + if(!$cast(soc_ifc_env_mbox_seq,obj)) `uvm_fatal("SOC_IFC_TOP_MBOX_RAND_DELAY", "soc_ifc_env_top_mbox_rand_delay_large_sequence::create_seqs() - .create_object() failed") + soc_ifc_env_cptra_handler_seq = soc_ifc_env_cptra_mbox_handler_sequence_t::type_id::create("soc_ifc_env_cptra_handler_seq"); +endfunction diff --git a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/sequences/mbox/soc_ifc_env_top_mbox_rand_delay_medium_sequence.svh b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/sequences/mbox/soc_ifc_env_top_mbox_rand_delay_medium_sequence.svh new file mode 100644 index 000000000..1efff8dd4 --- /dev/null +++ b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/sequences/mbox/soc_ifc_env_top_mbox_rand_delay_medium_sequence.svh @@ -0,0 +1,43 @@ +//---------------------------------------------------------------------- +// Created with uvmf_gen version 2022.3 +//---------------------------------------------------------------------- +// SPDX-License-Identifier: Apache-2.0 +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +//---------------------------------------------------------------------- +//---------------------------------------------------------------------- +// +// DESCRIPTION: Sequence to initiate (and respond) to mailbox command +// "TOP" sequence because it invokes lower level env sequences +// to facilitate the uC/SoC sides of mailbox command handling +// and this sequence defines the whole mailbox flow. +// +//---------------------------------------------------------------------- +//---------------------------------------------------------------------- +// +class soc_ifc_env_top_mbox_rand_delay_medium_sequence extends soc_ifc_env_top_mbox_sequence_base; + + + `uvm_object_utils( soc_ifc_env_top_mbox_rand_delay_medium_sequence ) + + extern virtual function create_seqs(); + +endclass + +function soc_ifc_env_top_mbox_rand_delay_medium_sequence::create_seqs(); + uvm_object obj; + obj = soc_ifc_env_mbox_rand_delay_medium_sequence_t::get_type().create_object("soc_ifc_env_mbox_seq"); + if(!$cast(soc_ifc_env_mbox_seq,obj)) `uvm_fatal("SOC_IFC_TOP_MBOX_RAND_DELAY", "soc_ifc_env_top_mbox_rand_delay_medium_sequence::create_seqs() - .create_object() failed") + soc_ifc_env_cptra_handler_seq = soc_ifc_env_cptra_mbox_handler_sequence_t::type_id::create("soc_ifc_env_cptra_handler_seq"); +endfunction diff --git a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/sequences/mbox/soc_ifc_env_top_mbox_rand_delay_small_sequence.svh b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/sequences/mbox/soc_ifc_env_top_mbox_rand_delay_small_sequence.svh new file mode 100644 index 000000000..3e036c9e4 --- /dev/null +++ b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/sequences/mbox/soc_ifc_env_top_mbox_rand_delay_small_sequence.svh @@ -0,0 +1,43 @@ +//---------------------------------------------------------------------- +// Created with uvmf_gen version 2022.3 +//---------------------------------------------------------------------- +// SPDX-License-Identifier: Apache-2.0 +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +//---------------------------------------------------------------------- +//---------------------------------------------------------------------- +// +// DESCRIPTION: Sequence to initiate (and respond) to mailbox command +// "TOP" sequence because it invokes lower level env sequences +// to facilitate the uC/SoC sides of mailbox command handling +// and this sequence defines the whole mailbox flow. +// +//---------------------------------------------------------------------- +//---------------------------------------------------------------------- +// +class soc_ifc_env_top_mbox_rand_delay_small_sequence extends soc_ifc_env_top_mbox_sequence_base; + + + `uvm_object_utils( soc_ifc_env_top_mbox_rand_delay_small_sequence ) + + extern virtual function create_seqs(); + +endclass + +function soc_ifc_env_top_mbox_rand_delay_small_sequence::create_seqs(); + uvm_object obj; + obj = soc_ifc_env_mbox_rand_delay_small_sequence_t::get_type().create_object("soc_ifc_env_mbox_seq"); + if(!$cast(soc_ifc_env_mbox_seq,obj)) `uvm_fatal("SOC_IFC_TOP_MBOX_RAND_DELAY", "soc_ifc_env_top_mbox_rand_delay_small_sequence::create_seqs() - .create_object() failed") + soc_ifc_env_cptra_handler_seq = soc_ifc_env_cptra_mbox_handler_sequence_t::type_id::create("soc_ifc_env_cptra_handler_seq"); +endfunction diff --git a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/sequences/mbox/soc_ifc_env_top_mbox_rand_large_sequence.svh b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/sequences/mbox/soc_ifc_env_top_mbox_rand_large_sequence.svh new file mode 100644 index 000000000..c9b5f5629 --- /dev/null +++ b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/sequences/mbox/soc_ifc_env_top_mbox_rand_large_sequence.svh @@ -0,0 +1,43 @@ +//---------------------------------------------------------------------- +// Created with uvmf_gen version 2022.3 +//---------------------------------------------------------------------- +// SPDX-License-Identifier: Apache-2.0 +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +//---------------------------------------------------------------------- +//---------------------------------------------------------------------- +// +// DESCRIPTION: Sequence to initiate (and respond) to mailbox command +// "TOP" sequence because it invokes lower level env sequences +// to facilitate the uC/SoC sides of mailbox command handling +// and this sequence defines the whole mailbox flow. +// +//---------------------------------------------------------------------- +//---------------------------------------------------------------------- +// +class soc_ifc_env_top_mbox_rand_large_sequence extends soc_ifc_env_top_mbox_sequence_base; + + + `uvm_object_utils( soc_ifc_env_top_mbox_rand_large_sequence ) + + extern virtual function create_seqs(); + +endclass + +function soc_ifc_env_top_mbox_rand_large_sequence::create_seqs(); + uvm_object obj; + obj = soc_ifc_env_mbox_rand_large_sequence_t::get_type().create_object("soc_ifc_env_mbox_seq"); + if(!$cast(soc_ifc_env_mbox_seq,obj)) `uvm_fatal("SOC_IFC_TOP_MBOX_RAND_LARGE", "soc_ifc_env_top_mbox_rand_large_sequence::create_seqs() - .create_object() failed") + soc_ifc_env_cptra_handler_seq = soc_ifc_env_cptra_mbox_handler_sequence_t::type_id::create("soc_ifc_env_cptra_handler_seq"); +endfunction diff --git a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/sequences/mbox/soc_ifc_env_top_mbox_rand_large_unlock_sequence.svh b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/sequences/mbox/soc_ifc_env_top_mbox_rand_large_unlock_sequence.svh new file mode 100644 index 000000000..db69abf2a --- /dev/null +++ b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/sequences/mbox/soc_ifc_env_top_mbox_rand_large_unlock_sequence.svh @@ -0,0 +1,51 @@ +//---------------------------------------------------------------------- +// Created with uvmf_gen version 2022.3 +//---------------------------------------------------------------------- +// SPDX-License-Identifier: Apache-2.0 +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +//---------------------------------------------------------------------- +//---------------------------------------------------------------------- +// +// DESCRIPTION: Sequence to initiate (and respond) to mailbox command +// "TOP" sequence because it invokes lower level env sequences +// to facilitate the uC/SoC sides of mailbox command handling +// and this sequence defines the whole mailbox flow. +// +//---------------------------------------------------------------------- +//---------------------------------------------------------------------- +// +class soc_ifc_env_top_mbox_rand_large_unlock_sequence extends soc_ifc_env_top_mbox_sequence_base; + + + `uvm_object_utils( soc_ifc_env_top_mbox_rand_large_unlock_sequence ) + + extern virtual function create_seqs(); + extern virtual function randomize_seqs(); + +endclass + +function soc_ifc_env_top_mbox_rand_large_unlock_sequence::create_seqs(); + uvm_object obj; + obj = soc_ifc_env_mbox_rand_large_sequence_t::get_type().create_object("soc_ifc_env_mbox_seq"); + if(!$cast(soc_ifc_env_mbox_seq,obj)) `uvm_fatal("SOC_IFC_TOP_MBOX_RAND_LARGE", "soc_ifc_env_top_mbox_rand_large_unlock_sequence::create_seqs() - .create_object() failed") + soc_ifc_env_cptra_handler_seq = soc_ifc_env_cptra_mbox_handler_sequence_t::type_id::create("soc_ifc_env_cptra_handler_seq"); +endfunction + +function soc_ifc_env_top_mbox_rand_large_unlock_sequence::randomize_seqs(); + if(!soc_ifc_env_mbox_seq.randomize()) + `uvm_fatal("SOC_IFC_MBOX_TOP", $sformatf("soc_ifc_env_top_mbox_rand_large_unlock_sequence::body() - %s randomization failed", soc_ifc_env_mbox_seq.get_type_name())); + if(!soc_ifc_env_cptra_handler_seq.randomize() with { inject_force_unlock == 1'b1; }) + `uvm_fatal("SOC_IFC_MBOX_TOP", $sformatf("soc_ifc_env_top_mbox_rand_large_unlock_sequence::body() - %s randomization failed", soc_ifc_env_cptra_handler_seq.get_type_name())); +endfunction diff --git a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/sequences/mbox/soc_ifc_env_top_mbox_reg_axs_invalid_large_sequence.svh b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/sequences/mbox/soc_ifc_env_top_mbox_reg_axs_invalid_large_sequence.svh new file mode 100644 index 000000000..5576ddb0c --- /dev/null +++ b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/sequences/mbox/soc_ifc_env_top_mbox_reg_axs_invalid_large_sequence.svh @@ -0,0 +1,53 @@ +//---------------------------------------------------------------------- +// Created with uvmf_gen version 2022.3 +//---------------------------------------------------------------------- +// SPDX-License-Identifier: Apache-2.0 +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +//---------------------------------------------------------------------- +//---------------------------------------------------------------------- +// +// DESCRIPTION: Sequence to initiate (and respond) to mailbox command +// "TOP" sequence because it invokes lower level env sequences +// to facilitate the uC/SoC sides of mailbox command handling +// and this sequence defines the whole mailbox flow. +// +//---------------------------------------------------------------------- +//---------------------------------------------------------------------- +// +class soc_ifc_env_top_mbox_reg_axs_invalid_large_sequence extends soc_ifc_env_top_mbox_sequence_base; + + + `uvm_object_utils( soc_ifc_env_top_mbox_reg_axs_invalid_large_sequence ) + + extern virtual function create_seqs(); + +endclass + +function soc_ifc_env_top_mbox_reg_axs_invalid_large_sequence::create_seqs(); + uvm_object obj; + enum { + BASE, + INTRFR + } handler_type; + obj = soc_ifc_env_mbox_reg_axs_invalid_large_sequence_t::get_type().create_object("soc_ifc_env_mbox_seq"); + if(!$cast(soc_ifc_env_mbox_seq,obj)) `uvm_fatal("SOC_IFC_TOP_MBOX_REG_AXS_INVALID", "soc_ifc_env_top_mbox_reg_axs_invalid_large_sequence::create_seqs() - .create_object() failed") + void'(std::randomize(handler_type)); + case (handler_type) inside + BASE: obj = soc_ifc_env_cptra_mbox_handler_sequence_t::get_type().create_object("soc_ifc_env_cptra_handler_seq"); + INTRFR: obj = soc_ifc_env_cptra_mbox_interference_handler_sequence_t::get_type().create_object("soc_ifc_env_cptra_handler_seq"); + default: `uvm_fatal("SOC_IFC_TOP_MBOX_REG_AXS_INVALID", $sformatf("Bad handler type - %p", handler_type)) + endcase + if(!$cast(soc_ifc_env_cptra_handler_seq,obj)) `uvm_fatal("SOC_IFC_TOP_MBOX_REG_AXS_INVALID", "soc_ifc_env_top_mbox_reg_axs_invalid_large_sequence::create_seqs() - .create_object() failed") +endfunction diff --git a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/sequences/mbox/soc_ifc_env_top_mbox_reg_axs_invalid_medium_sequence.svh b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/sequences/mbox/soc_ifc_env_top_mbox_reg_axs_invalid_medium_sequence.svh new file mode 100644 index 000000000..bf207b577 --- /dev/null +++ b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/sequences/mbox/soc_ifc_env_top_mbox_reg_axs_invalid_medium_sequence.svh @@ -0,0 +1,53 @@ +//---------------------------------------------------------------------- +// Created with uvmf_gen version 2022.3 +//---------------------------------------------------------------------- +// SPDX-License-Identifier: Apache-2.0 +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +//---------------------------------------------------------------------- +//---------------------------------------------------------------------- +// +// DESCRIPTION: Sequence to initiate (and respond) to mailbox command +// "TOP" sequence because it invokes lower level env sequences +// to facilitate the uC/SoC sides of mailbox command handling +// and this sequence defines the whole mailbox flow. +// +//---------------------------------------------------------------------- +//---------------------------------------------------------------------- +// +class soc_ifc_env_top_mbox_reg_axs_invalid_medium_sequence extends soc_ifc_env_top_mbox_sequence_base; + + + `uvm_object_utils( soc_ifc_env_top_mbox_reg_axs_invalid_medium_sequence ) + + extern virtual function create_seqs(); + +endclass + +function soc_ifc_env_top_mbox_reg_axs_invalid_medium_sequence::create_seqs(); + uvm_object obj; + enum { + BASE, + INTRFR + } handler_type; + obj = soc_ifc_env_mbox_reg_axs_invalid_medium_sequence_t::get_type().create_object("soc_ifc_env_mbox_seq"); + if(!$cast(soc_ifc_env_mbox_seq,obj)) `uvm_fatal("SOC_IFC_TOP_MBOX_REG_AXS_INVALID", "soc_ifc_env_top_mbox_reg_axs_invalid_medium_sequence::create_seqs() - .create_object() failed") + void'(std::randomize(handler_type)); + case (handler_type) inside + BASE: obj = soc_ifc_env_cptra_mbox_handler_sequence_t::get_type().create_object("soc_ifc_env_cptra_handler_seq"); + INTRFR: obj = soc_ifc_env_cptra_mbox_interference_handler_sequence_t::get_type().create_object("soc_ifc_env_cptra_handler_seq"); + default: `uvm_fatal("SOC_IFC_TOP_MBOX_REG_AXS_INVALID", $sformatf("Bad handler type - %p", handler_type)) + endcase + if(!$cast(soc_ifc_env_cptra_handler_seq,obj)) `uvm_fatal("SOC_IFC_TOP_MBOX_REG_AXS_INVALID", "soc_ifc_env_top_mbox_reg_axs_invalid_large_sequence::create_seqs() - .create_object() failed") +endfunction diff --git a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/sequences/mbox/soc_ifc_env_top_mbox_reg_axs_invalid_small_sequence.svh b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/sequences/mbox/soc_ifc_env_top_mbox_reg_axs_invalid_small_sequence.svh new file mode 100644 index 000000000..fbe6034ec --- /dev/null +++ b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/sequences/mbox/soc_ifc_env_top_mbox_reg_axs_invalid_small_sequence.svh @@ -0,0 +1,53 @@ +//---------------------------------------------------------------------- +// Created with uvmf_gen version 2022.3 +//---------------------------------------------------------------------- +// SPDX-License-Identifier: Apache-2.0 +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +//---------------------------------------------------------------------- +//---------------------------------------------------------------------- +// +// DESCRIPTION: Sequence to initiate (and respond) to mailbox command +// "TOP" sequence because it invokes lower level env sequences +// to facilitate the uC/SoC sides of mailbox command handling +// and this sequence defines the whole mailbox flow. +// +//---------------------------------------------------------------------- +//---------------------------------------------------------------------- +// +class soc_ifc_env_top_mbox_reg_axs_invalid_small_sequence extends soc_ifc_env_top_mbox_sequence_base; + + + `uvm_object_utils( soc_ifc_env_top_mbox_reg_axs_invalid_small_sequence ) + + extern virtual function create_seqs(); + +endclass + +function soc_ifc_env_top_mbox_reg_axs_invalid_small_sequence::create_seqs(); + uvm_object obj; + enum { + BASE, + INTRFR + } handler_type; + obj = soc_ifc_env_mbox_reg_axs_invalid_small_sequence_t::get_type().create_object("soc_ifc_env_mbox_seq"); + if(!$cast(soc_ifc_env_mbox_seq,obj)) `uvm_fatal("SOC_IFC_TOP_MBOX_REG_AXS_INVALID", "soc_ifc_env_top_mbox_reg_axs_invalid_small_sequence::create_seqs() - .create_object() failed") + void'(std::randomize(handler_type)); + case (handler_type) inside + BASE: obj = soc_ifc_env_cptra_mbox_handler_sequence_t::get_type().create_object("soc_ifc_env_cptra_handler_seq"); + INTRFR: obj = soc_ifc_env_cptra_mbox_interference_handler_sequence_t::get_type().create_object("soc_ifc_env_cptra_handler_seq"); + default: `uvm_fatal("SOC_IFC_TOP_MBOX_REG_AXS_INVALID", $sformatf("Bad handler type - %p", handler_type)) + endcase + if(!$cast(soc_ifc_env_cptra_handler_seq,obj)) `uvm_fatal("SOC_IFC_TOP_MBOX_REG_AXS_INVALID", "soc_ifc_env_top_mbox_reg_axs_invalid_large_sequence::create_seqs() - .create_object() failed") +endfunction diff --git a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/sequences/sha_accel/soc_ifc_env_sha_accel_sequence.svh b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/sequences/sha_accel/soc_ifc_env_sha_accel_sequence.svh index 74290e01b..5ac1f3a6d 100644 --- a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/sequences/sha_accel/soc_ifc_env_sha_accel_sequence.svh +++ b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/sequences/sha_accel/soc_ifc_env_sha_accel_sequence.svh @@ -181,6 +181,10 @@ task soc_ifc_env_sha_accel_sequence::sha_accel_acquire_lock(output op_sts_e op_s reg_model.sha512_acc_csr_rm.LOCK.read(reg_sts, data, UVM_FRONTDOOR, reg_model.soc_ifc_APB_map, this, .extension(apb_user_obj)); report_reg_sts(reg_sts, "LOCK"); end + //Read the lock again to test predictor + configuration.soc_ifc_ctrl_agent_config.wait_for_num_clocks(200); // FIXME add more randomization on delay + reg_model.sha512_acc_csr_rm.LOCK.read(reg_sts, data, UVM_FRONTDOOR, reg_model.soc_ifc_APB_map, this, .extension(apb_user_obj)); + report_reg_sts(reg_sts, "LOCK"); op_sts = CPTRA_SUCCESS; endtask @@ -197,6 +201,14 @@ task soc_ifc_env_sha_accel_sequence::sha_accel_set_cmd(input sha_accel_op_s op); reg_model.sha512_acc_csr_rm.DLEN.write(reg_sts, data, UVM_FRONTDOOR, reg_model.soc_ifc_APB_map, this, .extension(apb_user_obj)); report_reg_sts(reg_sts, "DLEN"); + + //read back some fields to test predictor + reg_model.sha512_acc_csr_rm.USER.read(reg_sts, data, UVM_FRONTDOOR, reg_model.soc_ifc_APB_map, this, .extension(apb_user_obj)); + report_reg_sts(reg_sts, "USER"); + reg_model.sha512_acc_csr_rm.MODE.read(reg_sts, data, UVM_FRONTDOOR, reg_model.soc_ifc_APB_map, this, .extension(apb_user_obj)); + report_reg_sts(reg_sts, "MODE"); + reg_model.sha512_acc_csr_rm.DLEN.read(reg_sts, data, UVM_FRONTDOOR, reg_model.soc_ifc_APB_map, this, .extension(apb_user_obj)); + report_reg_sts(reg_sts, "DLEN"); endtask task soc_ifc_env_sha_accel_sequence::sha_accel_push_datain(reg [3199:0][31:0] sha_block_data); diff --git a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/sequences/trng/cptra/soc_ifc_env_cptra_trng_data_req_sequence.svh b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/sequences/trng/cptra/soc_ifc_env_cptra_trng_data_req_sequence.svh index 7f86f5e15..bcfebf76f 100755 --- a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/sequences/trng/cptra/soc_ifc_env_cptra_trng_data_req_sequence.svh +++ b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/sequences/trng/cptra/soc_ifc_env_cptra_trng_data_req_sequence.svh @@ -114,4 +114,11 @@ task soc_ifc_env_cptra_trng_data_req_sequence::soc_ifc_ext_trng_clear_req(); reg_model.soc_ifc_reg_rm.CPTRA_TRNG_STATUS.write(reg_sts, data, UVM_FRONTDOOR, reg_model.soc_ifc_AHB_map, this); if (reg_sts != UVM_IS_OK) `uvm_error("TRNG_REQ_SEQ", "Register access failed to write TRNG_STATUS register") + + //Set TRNG CTRL clear bit to clear data regs + reg_model.soc_ifc_reg_rm.CPTRA_TRNG_CTRL.write(reg_sts, uvm_reg_data_t'(1), UVM_FRONTDOOR, reg_model.soc_ifc_AHB_map, this); + + if (reg_sts != UVM_IS_OK) + `uvm_error("TRNG_REQ_SEQ", "Register access failed to write TRNG_CTRL register") + endtask diff --git a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/sequences/trng/soc_ifc/soc_ifc_env_trng_write_data_sequence.svh b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/sequences/trng/soc_ifc/soc_ifc_env_trng_write_data_sequence.svh index d2acca98a..5f4a8b35e 100755 --- a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/sequences/trng/soc_ifc/soc_ifc_env_trng_write_data_sequence.svh +++ b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/sequences/trng/soc_ifc/soc_ifc_env_trng_write_data_sequence.svh @@ -31,6 +31,7 @@ class soc_ifc_env_trng_write_data_sequence extends soc_ifc_env_sequence_base #(. rand bit trng_write_done; rand bit [3:0] trng_num_dwords; + int sts_rsp_count; bit trng_data_req; bit [apb5_master_0_params::PAUSER_WIDTH-1:0] trng_valid_user; @@ -69,15 +70,24 @@ class soc_ifc_env_trng_write_data_sequence extends soc_ifc_env_sequence_base #(. virtual task body(); + sts_rsp_count = 0; + + fork + forever begin + @(soc_ifc_status_agent_rsp_seq.new_rsp) sts_rsp_count++; + end + join_none + soc_ifc_env_trng_setup(); - `uvm_info("TRNG_REQ_SEQ", $sformatf("Responding to TRNG_DATA_REQ with %0d dwords", trng_num_dwords), UVM_DEBUG) if (this.trng_data_req == 1'b0) soc_ifc_env_trng_poll_data_req(); if (this.trng_data_req) begin + `uvm_info("TRNG_REQ_SEQ", $sformatf("Responding to TRNG_DATA_REQ with %0d dwords", trng_num_dwords), UVM_FULL) soc_ifc_env_trng_write_data(); soc_ifc_env_trng_write_done(); soc_ifc_env_trng_wait_idle(); end + `uvm_info("TRNG_REQ_SEQ", "TRNG write data sequence completed", UVM_HIGH) endtask @@ -108,6 +118,7 @@ task soc_ifc_env_trng_write_data_sequence::soc_ifc_env_trng_setup(); // Assign user and use throughout sequence apb_user_obj.set_addr_user(trng_valid_user); + `uvm_info("TRNG_REQ_SEQ", $sformatf("trng_valid_user initialized to value 0x%x", trng_valid_user), UVM_HIGH) endtask @@ -120,10 +131,15 @@ task soc_ifc_env_trng_write_data_sequence::soc_ifc_env_trng_poll_data_req(); soc_ifc_env_trng_check_data_req(data_req); while (data_req == 1'b0) begin - configuration.soc_ifc_ctrl_agent_config.wait_for_num_clocks(200); - soc_ifc_env_trng_check_data_req(data_req); + wait (sts_rsp_count != 0); + data_req = soc_ifc_status_agent_rsp_seq.rsp.trng_req_pending; + sts_rsp_count = 0; end + soc_ifc_env_trng_check_data_req(data_req); + if (!data_req) + `uvm_error("TRNG_REQ_SEQ", "Got status transaction with trng_req_pending, but read from CPTRA_TRNG_STATUS.DATA_REQ returned 0!") this.trng_data_req = data_req; + `uvm_info("TRNG_REQ_SEQ", $sformatf("Got status transaction with trng_req_pending, read from CPTRA_TRNG_STATUS.DATA_REQ returned %d", data_req), UVM_MEDIUM) endtask //========================================== @@ -152,7 +168,7 @@ task soc_ifc_env_trng_write_data_sequence::soc_ifc_env_trng_write_data(); uvm_reg_data_t data; for (ii = 0; ii < this.trng_num_dwords; ii++) begin if (!std::randomize(data)) `uvm_error("TRNG_REQ_SEQ", "Failed to randomize data") - `uvm_info("TRNG_REQ_SEQ", $sformatf("Sending TRNG_DATA[%0d]: 0x%0x", ii, data), UVM_DEBUG) + `uvm_info("TRNG_REQ_SEQ", $sformatf("Sending TRNG_DATA[%0d]: 0x%0x", ii, data), UVM_HIGH) reg_model.soc_ifc_reg_rm.CPTRA_TRNG_DATA[ii].write(reg_sts, uvm_reg_data_t'(data), UVM_FRONTDOOR, reg_model.soc_ifc_APB_map, this, .extension(apb_user_obj)); if (reg_sts != UVM_IS_OK) `uvm_error("TRNG_REQ_SEQ", "Register access failed (TRNG_DATA)") @@ -165,7 +181,7 @@ endtask //========================================== task soc_ifc_env_trng_write_data_sequence::soc_ifc_env_trng_write_done(); uvm_status_e reg_sts; - `uvm_info("TRNG_REQ_SEQ", "Sending TRNG_DONE", UVM_DEBUG) + `uvm_info("TRNG_REQ_SEQ", "Sending TRNG_DONE", UVM_MEDIUM) reg_model.soc_ifc_reg_rm.CPTRA_TRNG_STATUS.write(reg_sts, uvm_reg_data_t'(trng_write_done) << reg_model.soc_ifc_reg_rm.CPTRA_TRNG_STATUS.DATA_WR_DONE.get_lsb_pos(), UVM_FRONTDOOR, reg_model.soc_ifc_APB_map, this, .extension(apb_user_obj)); if (reg_sts != UVM_IS_OK) `uvm_error("TRNG_REQ_SEQ", "Register access failed (TRNG_DONE)") @@ -191,4 +207,5 @@ task soc_ifc_env_trng_write_data_sequence::soc_ifc_env_trng_wait_idle(); if (reg_sts != UVM_IS_OK) `uvm_error("TRNG_REQ_SEQ", "Register access failed (CPTRA_TRNG_STATUS)") end + `uvm_info("TRNG_REQ_SEQ", "Observed TRNG_DONE cleared to 0", UVM_HIGH) endtask diff --git a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/sequences/wdt/cptra/soc_ifc_env_cptra_wdt_cascade_sequence.svh b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/sequences/wdt/cptra/soc_ifc_env_cptra_wdt_cascade_sequence.svh new file mode 100644 index 000000000..58822372a --- /dev/null +++ b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/sequences/wdt/cptra/soc_ifc_env_cptra_wdt_cascade_sequence.svh @@ -0,0 +1,49 @@ +//---------------------------------------------------------------------- +// Created with uvmf_gen version 2022.3 +//---------------------------------------------------------------------- +// SPDX-License-Identifier: Apache-2.0 +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// pragma uvmf custom header begin +// pragma uvmf custom header end +//---------------------------------------------------------------------- +//---------------------------------------------------------------------- +// +// DESCRIPTION: Bringup sequence for the SOC_IFC environment +// (essentially just a cold-reset sequence) +// +//---------------------------------------------------------------------- +//---------------------------------------------------------------------- +// +class soc_ifc_env_cptra_wdt_cascade_sequence extends soc_ifc_env_wdt_sequence_base; + + + `uvm_object_utils( soc_ifc_env_cptra_wdt_cascade_sequence ) + + // typedef soc_ifc_ctrl_sequence_base soc_ifc_ctrl_sequence_t; + // soc_ifc_ctrl_sequence_t soc_ifc_ctrl_seq; + + typedef soc_ifc_ctrl_wdt_cascade_sequence soc_ifc_ctrl_wdt_cascade_sequence_t; + + function new(string name = "" ); + uvm_object obj; + super.new(name); + // soc_ifc_ctrl_seq = soc_ifc_ctrl_sequence_t::type_id::create("soc_ifc_ctrl_seq"); + obj = soc_ifc_ctrl_wdt_cascade_sequence_t::get_type().create_object("soc_ifc_ctrl_wdt_cascade_seq"); + if (!$cast(soc_ifc_ctrl_seq,obj)) + `uvm_fatal("SOC_IFC_WDT", "Failed to cast object as WDT sequence!") + endfunction + + endclass + \ No newline at end of file diff --git a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/sequences/wdt/cptra/soc_ifc_env_cptra_wdt_independent_sequence.svh b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/sequences/wdt/cptra/soc_ifc_env_cptra_wdt_independent_sequence.svh new file mode 100644 index 000000000..9334e1004 --- /dev/null +++ b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/sequences/wdt/cptra/soc_ifc_env_cptra_wdt_independent_sequence.svh @@ -0,0 +1,49 @@ +//---------------------------------------------------------------------- +// Created with uvmf_gen version 2022.3 +//---------------------------------------------------------------------- +// SPDX-License-Identifier: Apache-2.0 +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// pragma uvmf custom header begin +// pragma uvmf custom header end +//---------------------------------------------------------------------- +//---------------------------------------------------------------------- +// +// DESCRIPTION: Bringup sequence for the SOC_IFC environment +// (essentially just a cold-reset sequence) +// +//---------------------------------------------------------------------- +//---------------------------------------------------------------------- +// +class soc_ifc_env_cptra_wdt_independent_sequence extends soc_ifc_env_wdt_sequence_base; + + + `uvm_object_utils( soc_ifc_env_cptra_wdt_independent_sequence ) + + // typedef soc_ifc_ctrl_sequence_base soc_ifc_ctrl_sequence_t; + // soc_ifc_ctrl_sequence_t soc_ifc_ctrl_seq; + + typedef soc_ifc_ctrl_wdt_independent_sequence soc_ifc_ctrl_wdt_independent_sequence_t; + + function new(string name = "" ); + uvm_object obj; + super.new(name); + // soc_ifc_ctrl_seq = soc_ifc_ctrl_sequence_t::type_id::create("soc_ifc_ctrl_seq"); + obj = soc_ifc_ctrl_wdt_independent_sequence_t::get_type().create_object("soc_ifc_ctrl_wdt_independent_seq"); + if (!$cast(soc_ifc_ctrl_seq,obj)) + `uvm_fatal("SOC_IFC_WDT", "Failed to cast object as WDT sequence!") + endfunction + + endclass + \ No newline at end of file diff --git a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/sequences/wdt/cptra/soc_ifc_env_wdt_sequence_base.svh b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/sequences/wdt/cptra/soc_ifc_env_wdt_sequence_base.svh new file mode 100644 index 000000000..940209c2f --- /dev/null +++ b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/sequences/wdt/cptra/soc_ifc_env_wdt_sequence_base.svh @@ -0,0 +1,120 @@ +//---------------------------------------------------------------------- +// Created with uvmf_gen version 2022.3 +//---------------------------------------------------------------------- +// SPDX-License-Identifier: Apache-2.0 +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// pragma uvmf custom header begin +// pragma uvmf custom header end +//---------------------------------------------------------------------- +//---------------------------------------------------------------------- +// +// DESCRIPTION: Issue a reset in the soc_ifc environment +// +//---------------------------------------------------------------------- +//---------------------------------------------------------------------- +// +class soc_ifc_env_wdt_sequence_base extends soc_ifc_env_sequence_base #(.CONFIG_T(soc_ifc_env_configuration_t)); + + + `uvm_object_utils( soc_ifc_env_wdt_sequence_base ) + + typedef soc_ifc_ctrl_sequence_base soc_ifc_ctrl_sequence_t; + soc_ifc_ctrl_sequence_t soc_ifc_ctrl_seq; + + // caliptra_apb_user apb_user_obj; + + // typedef struct packed { + // bit set_bootfsm_breakpoint; + // security_state_t security_state; + // } ctrl_reset_seq_context_t; + + // rand uvm_reg_data_t uds_seed_rand [12]; + // rand uvm_reg_data_t field_entropy_rand [32]; + // rand uvm_reg_data_t owner_pk_hash_rand [12]; + // rand uvm_reg_data_t key_manifest_pk_hash_rand [12]; + // rand uvm_reg_data_t idevid_cert_attr_rand [24]; + // rand uvm_reg_data_t soc_stepping_id_rand; + // rand struct packed { + // bit uds; + // bit field_entropy; + // bit [0:11] key_manifest_pk_hash; + // bit [0:11] owner_pk_hash; + // bit soc_stepping_id; + // bit [0:23] idevid_cert_attr; + // bit lms_verify; + // } fuses_to_set; + + + //========================================== + // Name: new + // Description: Constructor + //========================================== + function new(string name = "" ); + super.new(name); + soc_ifc_ctrl_seq = soc_ifc_ctrl_sequence_t::type_id::create("soc_ifc_ctrl_seq"); + + // Setup a User object to override PAUSER + // apb_user_obj = new(); + + endfunction + + + //========================================== + // Name: run_ctrl_seq + // Description: Run low-level soc_ifc_ctrl sequence to wiggle gen input wires to let RT fw know which mode of WDT to enable + //========================================== + virtual task run_ctrl_seq(); + if ( configuration.soc_ifc_ctrl_agent_config.sequencer != null ) + soc_ifc_ctrl_seq.start(configuration.soc_ifc_ctrl_agent_config.sequencer); + else + `uvm_error("SOC_IFC_WDT", "soc_ifc_ctrl_agent_config.sequencer is null!") + + endtask + + + + + //========================================== + // Name: pre_body + // Description: Setup tasks to: + // - get a reg model handle + // - check for a valid responder handle + //========================================== + virtual task pre_body(); + super.pre_body(); + reg_model = configuration.soc_ifc_rm; + if (soc_ifc_status_agent_rsp_seq == null) + `uvm_fatal("SOC_IFC_WDT", "SOC_IFC ENV wdt sequence expected a handle to the soc_ifc status agent responder sequence (from bench-level sequence) but got null!") + // apb_user_obj.set_addr_user(reg_model.soc_ifc_reg_rm.CPTRA_MBOX_VALID_PAUSER[0].PAUSER.get_reset("HARD")); + endtask + + + //========================================== + // Name: body + // Description: Run the main functionality + //========================================== + virtual task body(); + + + // Run ctrl seq + run_ctrl_seq(); + + + + endtask + + endclass + + \ No newline at end of file diff --git a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/soc_ifc_env_pkg.compile b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/soc_ifc_env_pkg.compile index 8f6852326..57aedbdc2 100644 --- a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/soc_ifc_env_pkg.compile +++ b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/soc_ifc_env_pkg.compile @@ -4,6 +4,7 @@ needs: - ../../../verification_ip/interface_packages/cptra_ctrl_pkg/cptra_ctrl_hvl.compile - ../../../verification_ip/interface_packages/soc_ifc_status_pkg/soc_ifc_status_hvl.compile - ../../../verification_ip/interface_packages/cptra_status_pkg/cptra_status_hvl.compile + - ../../../verification_ip/interface_packages/mbox_sram_pkg/mbox_sram_hvl.compile src: - registers/soc_ifc_reg_model_top_pkg.sv diff --git a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/soc_ifc_env_pkg.sv b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/soc_ifc_env_pkg.sv index 9e93f03ff..38fae2c2f 100644 --- a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/soc_ifc_env_pkg.sv +++ b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/soc_ifc_env_pkg.sv @@ -50,6 +50,8 @@ package soc_ifc_env_pkg; import soc_ifc_status_pkg_hdl::*; import cptra_status_pkg::*; import cptra_status_pkg_hdl::*; + import mbox_sram_pkg::*; + import mbox_sram_pkg_hdl::*; import soc_ifc_reg_model_top_pkg::*; import qvip_ahb_lite_slave_pkg::*; import qvip_ahb_lite_slave_params_pkg::*; @@ -58,6 +60,7 @@ package soc_ifc_env_pkg; `uvm_analysis_imp_decl(_soc_ifc_ctrl_agent_ae) `uvm_analysis_imp_decl(_cptra_ctrl_agent_ae) + `uvm_analysis_imp_decl(_mbox_sram_agent_ae) `uvm_analysis_imp_decl(_ahb_slave_0_ae) `uvm_analysis_imp_decl(_apb5_slave_0_ae) `uvm_analysis_imp_decl(_expected_analysis_export) @@ -68,6 +71,14 @@ package soc_ifc_env_pkg; `uvm_analysis_imp_decl(_expected_apb_analysis_export) `uvm_analysis_imp_decl(_actual_ahb_analysis_export) `uvm_analysis_imp_decl(_actual_apb_analysis_export) + + `uvm_analysis_imp_decl(_cov_soc_ifc_ctrl_ae) + `uvm_analysis_imp_decl(_cov_soc_ifc_status_ae) + `uvm_analysis_imp_decl(_cov_apb_ae) + `uvm_analysis_imp_decl(_cov_cptra_ctrl_ae) + `uvm_analysis_imp_decl(_cov_cptra_status_ae) + `uvm_analysis_imp_decl(_cov_ahb_ae) + `uvm_analysis_imp_decl(_cov_mbox_sram_ae) // pragma uvmf custom package_imports_additional begin import soc_ifc_pkg::*; @@ -80,6 +91,8 @@ package soc_ifc_env_pkg; `include "src/soc_ifc_env_configuration.svh" `include "src/soc_ifc_predictor.svh" `include "src/soc_ifc_scoreboard.svh" + `include "src/soc_ifc_reg_cov_subscriber.svh" + `include "src/soc_ifc_env_cov_subscriber.svh" `include "src/soc_ifc_environment.svh" `include "src/soc_ifc_env_sequence_base.svh" @@ -100,6 +113,8 @@ package soc_ifc_env_pkg; typedef soc_ifc_env_reset_sequence_base soc_ifc_env_reset_sequence_base_t; `include "sequences/bringup/soc_ifc/soc_ifc_env_bringup_sequence.svh" typedef soc_ifc_env_bringup_sequence soc_ifc_env_bringup_sequence_t; + `include "sequences/bringup/soc_ifc/soc_ifc_env_rom_bringup_sequence.svh" + typedef soc_ifc_env_rom_bringup_sequence soc_ifc_env_rom_bringup_sequence_t; `include "sequences/bringup/soc_ifc/soc_ifc_env_pauser_init_sequence.svh" typedef soc_ifc_env_pauser_init_sequence soc_ifc_env_pauser_init_sequence_t; `include "sequences/bringup/soc_ifc/soc_ifc_env_reset_warm_sequence.svh" @@ -112,8 +127,16 @@ package soc_ifc_env_pkg; typedef soc_ifc_env_mbox_rand_fw_sequence soc_ifc_env_mbox_rand_fw_sequence_t; `include "sequences/mbox/soc_ifc/soc_ifc_env_mbox_real_fw_sequence.svh" typedef soc_ifc_env_mbox_real_fw_sequence soc_ifc_env_mbox_real_fw_sequence_t; + `include "sequences/mbox/soc_ifc/soc_ifc_env_mbox_fw_upd_sequence.svh" + typedef soc_ifc_env_mbox_fw_upd_sequence soc_ifc_env_mbox_fw_upd_sequence_t; + `include "sequences/mbox/soc_ifc/soc_ifc_env_mbox_rom_fw_sequence.svh" + typedef soc_ifc_env_mbox_rom_fw_sequence soc_ifc_env_mbox_rom_fw_sequence_t; `include "sequences/mbox/soc_ifc/soc_ifc_env_mbox_rand_small_sequence.svh" typedef soc_ifc_env_mbox_rand_small_sequence soc_ifc_env_mbox_rand_small_sequence_t; + `include "sequences/mbox/soc_ifc/soc_ifc_env_mbox_min_sequence.svh" + typedef soc_ifc_env_mbox_min_sequence soc_ifc_env_mbox_min_sequence_t; + `include "sequences/mbox/soc_ifc/soc_ifc_env_mbox_max_sequence.svh" + typedef soc_ifc_env_mbox_max_sequence soc_ifc_env_mbox_max_sequence_t; `include "sequences/mbox/soc_ifc/soc_ifc_env_mbox_rand_medium_sequence.svh" typedef soc_ifc_env_mbox_rand_medium_sequence soc_ifc_env_mbox_rand_medium_sequence_t; `include "sequences/mbox/soc_ifc/soc_ifc_env_mbox_rand_large_sequence.svh" @@ -128,8 +151,26 @@ package soc_ifc_env_pkg; typedef soc_ifc_env_mbox_rand_pauser_medium_sequence soc_ifc_env_mbox_rand_pauser_medium_sequence_t; `include "sequences/mbox/soc_ifc/soc_ifc_env_mbox_rand_pauser_large_sequence.svh" typedef soc_ifc_env_mbox_rand_pauser_large_sequence soc_ifc_env_mbox_rand_pauser_large_sequence_t; - `include "sequences/mbox/soc_ifc/soc_ifc_env_mbox_rand_multi_agent_sequence.svh" - typedef soc_ifc_env_mbox_rand_multi_agent_sequence soc_ifc_env_mbox_rand_multi_agent_sequence_t; + `include "sequences/mbox/soc_ifc/soc_ifc_env_mbox_rand_delay_sequence.svh" + typedef soc_ifc_env_mbox_rand_delay_sequence soc_ifc_env_mbox_rand_delay_sequence_t; + `include "sequences/mbox/soc_ifc/soc_ifc_env_mbox_rand_delay_small_sequence.svh" + typedef soc_ifc_env_mbox_rand_delay_small_sequence soc_ifc_env_mbox_rand_delay_small_sequence_t; + `include "sequences/mbox/soc_ifc/soc_ifc_env_mbox_rand_delay_medium_sequence.svh" + typedef soc_ifc_env_mbox_rand_delay_medium_sequence soc_ifc_env_mbox_rand_delay_medium_sequence_t; + `include "sequences/mbox/soc_ifc/soc_ifc_env_mbox_rand_delay_large_sequence.svh" + typedef soc_ifc_env_mbox_rand_delay_large_sequence soc_ifc_env_mbox_rand_delay_large_sequence_t; + `include "sequences/mbox/soc_ifc/soc_ifc_env_mbox_reg_axs_invalid_sequence.svh" + typedef soc_ifc_env_mbox_reg_axs_invalid_sequence soc_ifc_env_mbox_reg_axs_invalid_sequence_t; + `include "sequences/mbox/soc_ifc/soc_ifc_env_mbox_reg_axs_invalid_small_sequence.svh" + typedef soc_ifc_env_mbox_reg_axs_invalid_small_sequence soc_ifc_env_mbox_reg_axs_invalid_small_sequence_t; + `include "sequences/mbox/soc_ifc/soc_ifc_env_mbox_reg_axs_invalid_medium_sequence.svh" + typedef soc_ifc_env_mbox_reg_axs_invalid_medium_sequence soc_ifc_env_mbox_reg_axs_invalid_medium_sequence_t; + `include "sequences/mbox/soc_ifc/soc_ifc_env_mbox_reg_axs_invalid_large_sequence.svh" + typedef soc_ifc_env_mbox_reg_axs_invalid_large_sequence soc_ifc_env_mbox_reg_axs_invalid_large_sequence_t; + `include "sequences/mbox/soc_ifc/soc_ifc_env_mbox_dlen_invalid_sequence.svh" + typedef soc_ifc_env_mbox_dlen_invalid_sequence soc_ifc_env_mbox_dlen_invalid_sequence_t; + `include "sequences/mbox/soc_ifc/soc_ifc_env_mbox_dir_read_sequence.svh" + typedef soc_ifc_env_mbox_dir_read_sequence soc_ifc_env_mbox_dir_read_sequence_t; `include "sequences/mbox/soc_ifc/soc_ifc_env_mbox_dlen_overflow_sequence.svh" typedef soc_ifc_env_mbox_dlen_overflow_sequence soc_ifc_env_mbox_dlen_overflow_sequence_t; `include "sequences/mbox/soc_ifc/soc_ifc_env_mbox_dlen_overflow_small_sequence.svh" @@ -146,6 +187,16 @@ package soc_ifc_env_pkg; typedef soc_ifc_env_mbox_dlen_underflow_medium_sequence soc_ifc_env_mbox_dlen_underflow_medium_sequence_t; `include "sequences/mbox/soc_ifc/soc_ifc_env_mbox_dlen_underflow_large_sequence.svh" typedef soc_ifc_env_mbox_dlen_underflow_large_sequence soc_ifc_env_mbox_dlen_underflow_large_sequence_t; + `include "sequences/mbox/soc_ifc/soc_ifc_env_mbox_sram_double_bit_flip_sequence.svh" + typedef soc_ifc_env_mbox_sram_double_bit_flip_sequence soc_ifc_env_mbox_sram_double_bit_flip_sequence_t; + `include "sequences/mbox/soc_ifc/soc_ifc_env_mbox_sram_double_bit_flip_small_sequence.svh" + typedef soc_ifc_env_mbox_sram_double_bit_flip_small_sequence soc_ifc_env_mbox_sram_double_bit_flip_small_sequence_t; + `include "sequences/mbox/soc_ifc/soc_ifc_env_mbox_sram_double_bit_flip_medium_sequence.svh" + typedef soc_ifc_env_mbox_sram_double_bit_flip_medium_sequence soc_ifc_env_mbox_sram_double_bit_flip_medium_sequence_t; + `include "sequences/mbox/soc_ifc/soc_ifc_env_mbox_sram_double_bit_flip_large_sequence.svh" + typedef soc_ifc_env_mbox_sram_double_bit_flip_large_sequence soc_ifc_env_mbox_sram_double_bit_flip_large_sequence_t; + `include "sequences/mbox/soc_ifc/soc_ifc_env_mbox_rand_multi_agent_sequence.svh" + typedef soc_ifc_env_mbox_rand_multi_agent_sequence soc_ifc_env_mbox_rand_multi_agent_sequence_t; `include "sequences/mbox/soc_ifc/soc_ifc_env_mbox_rst_sequence.svh" typedef soc_ifc_env_mbox_rst_sequence soc_ifc_env_mbox_rst_sequence_t; `include "sequences/mbox/soc_ifc/soc_ifc_env_mbox_rst_warm_rand_medium_sequence.svh" @@ -162,6 +213,14 @@ package soc_ifc_env_pkg; typedef soc_ifc_env_trng_write_data_sequence soc_ifc_env_trng_write_data_sequence_t; `include "sequences/mbox/soc_ifc/soc_ifc_env_soc_mbox_handler_sequence.svh" typedef soc_ifc_env_soc_mbox_handler_sequence soc_ifc_env_soc_mbox_handler_sequence_t; + `include "sequences/mbox/soc_ifc/soc_ifc_env_soc_mbox_reg_axs_invalid_handler_sequence.svh" + typedef soc_ifc_env_soc_mbox_reg_axs_invalid_handler_sequence soc_ifc_env_soc_mbox_reg_axs_invalid_handler_sequence_t; + `include "sequences/wdt/cptra/soc_ifc_env_wdt_sequence_base.svh" + typedef soc_ifc_env_wdt_sequence_base soc_ifc_env_wdt_sequence_base_t; + `include "sequences/wdt/cptra/soc_ifc_env_cptra_wdt_independent_sequence.svh" + typedef soc_ifc_env_cptra_wdt_independent_sequence soc_ifc_env_cptra_wdt_independent_sequence_t; + `include "sequences/wdt/cptra/soc_ifc_env_cptra_wdt_cascade_sequence.svh" + typedef soc_ifc_env_cptra_wdt_cascade_sequence soc_ifc_env_cptra_wdt_cascade_sequence_t; ///////////////////// Sequences usable from soc_ifc bench only ///////////////////// // These sequences include stimulus for the internal/caliptra-side of the @@ -169,6 +228,8 @@ package soc_ifc_env_pkg; /* TODO: If desired in top-level rand sequence, add this to the rand_seq_idx enum/avail_env_seqs_c constraint */ `include "sequences/bringup/cptra/soc_ifc_env_cptra_rst_wait_sequence.svh" typedef soc_ifc_env_cptra_rst_wait_sequence soc_ifc_env_cptra_rst_wait_sequence_t; + `include "sequences/bringup/cptra/soc_ifc_env_cptra_init_interrupts_sequence.svh" + typedef soc_ifc_env_cptra_init_interrupts_sequence soc_ifc_env_cptra_init_interrupts_sequence_t; `include "sequences/bringup/soc_ifc_env_top_reset_warm_sequence.svh" typedef soc_ifc_env_top_reset_warm_sequence soc_ifc_env_top_reset_warm_sequence_t; `include "sequences/bringup/soc_ifc_env_top_reset_cold_sequence.svh" @@ -187,14 +248,22 @@ package soc_ifc_env_pkg; typedef soc_ifc_env_cptra_mbox_req_rand_small_sequence soc_ifc_env_cptra_mbox_req_rand_small_sequence_t; `include "sequences/mbox/soc_ifc_env_top_mbox_sequence_base.svh" typedef soc_ifc_env_top_mbox_sequence_base soc_ifc_env_top_mbox_sequence_base_t; + `include "sequences/mbox/soc_ifc_env_top_mbox_min_sequence.svh" + typedef soc_ifc_env_top_mbox_min_sequence soc_ifc_env_top_mbox_min_sequence_t; + `include "sequences/mbox/soc_ifc_env_top_mbox_max_sequence.svh" + typedef soc_ifc_env_top_mbox_max_sequence soc_ifc_env_top_mbox_max_sequence_t; `include "sequences/mbox/soc_ifc_env_top_mbox_rand_small_sequence.svh" typedef soc_ifc_env_top_mbox_rand_small_sequence soc_ifc_env_top_mbox_rand_small_sequence_t; `include "sequences/mbox/soc_ifc_env_top_mbox_rand_medium_sequence.svh" typedef soc_ifc_env_top_mbox_rand_medium_sequence soc_ifc_env_top_mbox_rand_medium_sequence_t; + `include "sequences/mbox/soc_ifc_env_top_mbox_rand_large_sequence.svh" + typedef soc_ifc_env_top_mbox_rand_large_sequence soc_ifc_env_top_mbox_rand_large_sequence_t; `include "sequences/mbox/soc_ifc_env_top_mbox_rand_small_unlock_sequence.svh" typedef soc_ifc_env_top_mbox_rand_small_unlock_sequence soc_ifc_env_top_mbox_rand_small_unlock_sequence_t; `include "sequences/mbox/soc_ifc_env_top_mbox_rand_medium_unlock_sequence.svh" typedef soc_ifc_env_top_mbox_rand_medium_unlock_sequence soc_ifc_env_top_mbox_rand_medium_unlock_sequence_t; + `include "sequences/mbox/soc_ifc_env_top_mbox_rand_large_unlock_sequence.svh" + typedef soc_ifc_env_top_mbox_rand_large_unlock_sequence soc_ifc_env_top_mbox_rand_large_unlock_sequence_t; `include "sequences/mbox/soc_ifc_env_top_mbox_contention_sequence.svh" typedef soc_ifc_env_top_mbox_contention_sequence soc_ifc_env_top_mbox_contention_sequence_t; `include "sequences/mbox/soc_ifc_env_top_mbox_rand_pauser_sequence.svh" @@ -217,6 +286,18 @@ package soc_ifc_env_pkg; typedef soc_ifc_env_top_mbox_rand_pauser_medium_unlock_sequence soc_ifc_env_top_mbox_rand_pauser_medium_unlock_sequence_t; `include "sequences/mbox/soc_ifc_env_top_mbox_rand_pauser_large_unlock_sequence.svh" typedef soc_ifc_env_top_mbox_rand_pauser_large_unlock_sequence soc_ifc_env_top_mbox_rand_pauser_large_unlock_sequence_t; + `include "sequences/mbox/soc_ifc_env_top_mbox_rand_delay_small_sequence.svh" + typedef soc_ifc_env_top_mbox_rand_delay_small_sequence soc_ifc_env_top_mbox_rand_delay_small_sequence_t; + `include "sequences/mbox/soc_ifc_env_top_mbox_rand_delay_medium_sequence.svh" + typedef soc_ifc_env_top_mbox_rand_delay_medium_sequence soc_ifc_env_top_mbox_rand_delay_medium_sequence_t; + `include "sequences/mbox/soc_ifc_env_top_mbox_rand_delay_large_sequence.svh" + typedef soc_ifc_env_top_mbox_rand_delay_large_sequence soc_ifc_env_top_mbox_rand_delay_large_sequence_t; + `include "sequences/mbox/soc_ifc_env_top_mbox_reg_axs_invalid_small_sequence.svh" + typedef soc_ifc_env_top_mbox_reg_axs_invalid_small_sequence soc_ifc_env_top_mbox_reg_axs_invalid_small_sequence_t; + `include "sequences/mbox/soc_ifc_env_top_mbox_reg_axs_invalid_medium_sequence.svh" + typedef soc_ifc_env_top_mbox_reg_axs_invalid_medium_sequence soc_ifc_env_top_mbox_reg_axs_invalid_medium_sequence_t; + `include "sequences/mbox/soc_ifc_env_top_mbox_reg_axs_invalid_large_sequence.svh" + typedef soc_ifc_env_top_mbox_reg_axs_invalid_large_sequence soc_ifc_env_top_mbox_reg_axs_invalid_large_sequence_t; `include "sequences/mbox/soc_ifc_env_top_mbox_multi_agent_sequence.svh" typedef soc_ifc_env_top_mbox_multi_agent_sequence soc_ifc_env_top_mbox_multi_agent_sequence_t; `include "sequences/mbox/soc_ifc_env_top_mbox_dlen_violation_sequence.svh" @@ -231,6 +312,8 @@ package soc_ifc_env_pkg; typedef soc_ifc_env_top_cptra_mbox_sequence_base soc_ifc_env_top_cptra_mbox_sequence_base_t; `include "sequences/mbox/soc_ifc_env_top_cptra_mbox_rand_small_sequence.svh" typedef soc_ifc_env_top_cptra_mbox_rand_small_sequence soc_ifc_env_top_cptra_mbox_rand_small_sequence_t; + `include "sequences/mbox/soc_ifc_env_top_cptra_mbox_reg_axs_invalid_small_sequence.svh" + typedef soc_ifc_env_top_cptra_mbox_reg_axs_invalid_small_sequence soc_ifc_env_top_cptra_mbox_reg_axs_invalid_small_sequence_t; // pragma uvmf custom package_item_additional end endpackage diff --git a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/soc_ifc_env_pkg.vinfo b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/soc_ifc_env_pkg.vinfo index e54e883b1..ae707c7ab 100644 --- a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/soc_ifc_env_pkg.vinfo +++ b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/soc_ifc_env_pkg.vinfo @@ -3,6 +3,7 @@ @use $UVMF_VIP_LIBRARY_HOME/interface_packages/cptra_ctrl_pkg/cptra_ctrl_pkg.vinfo @use $UVMF_VIP_LIBRARY_HOME/interface_packages/soc_ifc_status_pkg/soc_ifc_status_pkg.vinfo @use $UVMF_VIP_LIBRARY_HOME/interface_packages/cptra_status_pkg/cptra_status_pkg.vinfo +@use $UVMF_VIP_LIBRARY_HOME/interface_packages/mbox_sram_pkg/mbox_sram_pkg.vinfo registers/soc_ifc_reg_model_top_pkg.sv +incdir+@vinfodir soc_ifc_env_pkg.sv diff --git a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/src/soc_ifc_env_configuration.svh b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/src/soc_ifc_env_configuration.svh index ce2ce0eb6..fbf7ef959 100644 --- a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/src/soc_ifc_env_configuration.svh +++ b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/src/soc_ifc_env_configuration.svh @@ -57,6 +57,9 @@ extends uvmf_environment_configuration_base; typedef cptra_status_configuration cptra_status_agent_config_t; rand cptra_status_agent_config_t cptra_status_agent_config; + typedef mbox_sram_configuration mbox_sram_agent_config_t; + rand mbox_sram_agent_config_t mbox_sram_agent_config; + qvip_ahb_lite_slave_env_configuration qvip_ahb_lite_slave_subenv_config; @@ -90,6 +93,7 @@ extends uvmf_environment_configuration_base; cptra_ctrl_agent_config = cptra_ctrl_agent_config_t::type_id::create("cptra_ctrl_agent_config"); soc_ifc_status_agent_config = soc_ifc_status_agent_config_t::type_id::create("soc_ifc_status_agent_config"); cptra_status_agent_config = cptra_status_agent_config_t::type_id::create("cptra_status_agent_config"); + mbox_sram_agent_config = mbox_sram_agent_config_t::type_id::create("mbox_sram_agent_config"); qvip_ahb_lite_slave_subenv_config = qvip_ahb_lite_slave_env_configuration::type_id::create("qvip_ahb_lite_slave_subenv_config"); qvip_apb5_slave_subenv_config = qvip_apb5_slave_env_configuration::type_id::create("qvip_apb5_slave_subenv_config"); @@ -133,6 +137,7 @@ extends uvmf_environment_configuration_base; "\n", cptra_ctrl_agent_config.convert2string, "\n", soc_ifc_status_agent_config.convert2string, "\n", cptra_status_agent_config.convert2string, + "\n", mbox_sram_agent_config.convert2string, "\n", qvip_ahb_lite_slave_subenv_config.convert2string, "\n", qvip_apb5_slave_subenv_config.convert2string @@ -176,20 +181,24 @@ extends uvmf_environment_configuration_base; // Interface initialization for local agents soc_ifc_ctrl_agent_config.initialize( interface_activity[2], {environment_path,".soc_ifc_ctrl_agent"}, interface_names[2]); soc_ifc_ctrl_agent_config.initiator_responder = INITIATOR; - // soc_ifc_ctrl_agent_config.has_coverage = 1; + soc_ifc_ctrl_agent_config.has_coverage = 1; cptra_ctrl_agent_config.initialize( interface_activity[3], {environment_path,".cptra_ctrl_agent"}, interface_names[3]); cptra_ctrl_agent_config.initiator_responder = INITIATOR; - // cptra_ctrl_agent_config.has_coverage = 1; + cptra_ctrl_agent_config.has_coverage = 1; soc_ifc_status_agent_config.initialize( interface_activity[4], {environment_path,".soc_ifc_status_agent"}, interface_names[4]); soc_ifc_status_agent_config.initiator_responder = RESPONDER; - // soc_ifc_status_agent_config.has_coverage = 1; + soc_ifc_status_agent_config.has_coverage = 1; cptra_status_agent_config.initialize( interface_activity[5], {environment_path,".cptra_status_agent"}, interface_names[5]); cptra_status_agent_config.initiator_responder = RESPONDER; - // cptra_status_agent_config.has_coverage = 1; + cptra_status_agent_config.has_coverage = 1; + mbox_sram_agent_config.initialize( interface_activity[6], {environment_path,".mbox_sram_agent"}, interface_names[6]); + mbox_sram_agent_config.initiator_responder = RESPONDER; + mbox_sram_agent_config.has_coverage = 1; // pragma uvmf custom reg_model_config_initialize begin // Register model creation and configuation if (register_model == null) begin + uvm_reg::include_coverage("*", UVM_CVR_ALL); // Register coverage config with resource DB, used later by build_coverage() soc_ifc_rm = soc_ifc_reg_model_top::type_id::create("soc_ifc_rm"); soc_ifc_rm.build(); soc_ifc_rm.lock_model(); @@ -208,7 +217,12 @@ extends uvmf_environment_configuration_base; // pragma uvmf custom initialize begin + qvip_ahb_lite_slave_subenv_config.ahb_lite_slave_0_cfg.agent_cfg.en_cvg.slave = 1'b1; + qvip_ahb_lite_slave_subenv_config.ahb_lite_slave_0_cfg.agent_cfg.en_cvg.master = 1'b1; + qvip_ahb_lite_slave_subenv_config.ahb_lite_slave_0_cfg.agent_cfg.en_cvg.response = 1'b1; + qvip_apb5_slave_subenv_config.apb5_master_0_cfg.agent_cfg.en_sb = 1'b0; /* FIXME -- apb scoreboard flags ERRORs when read_data != write_data to a given address, which happens frequently (non-erroneously) in this environment */ + qvip_apb5_slave_subenv_config.apb5_master_0_cfg.agent_cfg.en_cvg = 1'b1; // Add analysis ports to send Bus traffic to the scoreboard, so that the predictor/scoreboard can check read transfer data void'(qvip_ahb_lite_slave_subenv_config.ahb_lite_slave_0_cfg.set_monitor_item( "burst_transfer_sb" , ahb_master_burst_transfer #(ahb_lite_slave_0_params::AHB_NUM_MASTERS, ahb_lite_slave_0_params::AHB_NUM_MASTER_BITS, @@ -220,6 +234,17 @@ extends uvmf_environment_configuration_base; apb5_master_0_params::APB3_PADDR_BIT_WIDTH, apb5_master_0_params::APB3_PWDATA_BIT_WIDTH, apb5_master_0_params::APB3_PRDATA_BIT_WIDTH)::type_id::get() )); + // Add analysis ports to send Bus traffic to the coverage subscriber + void'(qvip_ahb_lite_slave_subenv_config.ahb_lite_slave_0_cfg.set_monitor_item( "burst_transfer_cov" , ahb_master_burst_transfer #(ahb_lite_slave_0_params::AHB_NUM_MASTERS, + ahb_lite_slave_0_params::AHB_NUM_MASTER_BITS, + ahb_lite_slave_0_params::AHB_NUM_SLAVES, + ahb_lite_slave_0_params::AHB_ADDRESS_WIDTH, + ahb_lite_slave_0_params::AHB_WDATA_WIDTH, + ahb_lite_slave_0_params::AHB_RDATA_WIDTH)::type_id::get() )); + void'(qvip_apb5_slave_subenv_config.apb5_master_0_cfg.set_monitor_item( "trans_ap_cov" , apb3_host_apb3_transaction #(apb5_master_0_params::APB3_SLAVE_COUNT, + apb5_master_0_params::APB3_PADDR_BIT_WIDTH, + apb5_master_0_params::APB3_PWDATA_BIT_WIDTH, + apb5_master_0_params::APB3_PRDATA_BIT_WIDTH)::type_id::get() )); // pragma uvmf custom initialize end endfunction diff --git a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/src/soc_ifc_env_cov_subscriber.svh b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/src/soc_ifc_env_cov_subscriber.svh new file mode 100644 index 000000000..b77ae11d4 --- /dev/null +++ b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/src/soc_ifc_env_cov_subscriber.svh @@ -0,0 +1,614 @@ +// SPDX-License-Identifier: Apache-2.0 +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +//------------------------------------------------------------------------------ +// +// CLASS: soc_ifc_env_cov_subscriber +// +// This class provides an analysis export for receiving transactions from a +// connected analysis export. Making such a connection "subscribes" this +// component to any transactions emitted by the connected analysis port. +// +// This extended class provides a coverage subscriber that receives uvm_reg_item +// objects exported from the uvm_reg_predictor and calls the sample_values +// function for the associated register. +//------------------------------------------------------------------------------ + +//------------------------------------------------------------------------------ +// +// CLASS: soc_ifc_env_cov_subscriber +// +// This class instantiates externally defined analysis exports for receiving +// transactions from connected monitors. +// +// This extended class provides a coverage subscriber that receives transaction +// items from all interfaces and leverages the reg-model and predictor state +// to calculate functional coverage for UVM stimulus. +// +// In the environment build flow, connections are made from monitors to the +// analysis exports from this subscriber _last_, so that any prediction tasks +// will complete prior to the coverage model being called. This allows coverage +// to be computed on the updated current state of the system, with reference +// to expected changes. +// +//------------------------------------------------------------------------------ + +class soc_ifc_env_cov_subscriber #( + type PRED_T = soc_ifc_predictor, + type CONFIG_T, + type BASE_T = uvm_component + ) + extends BASE_T; + + typedef soc_ifc_env_cov_subscriber #( PRED_T, CONFIG_T, BASE_T) this_type; + + // Factory registration of this class + `uvm_component_param_utils( this_type ) + + PRED_T pred; + CONFIG_T configuration; + soc_ifc_reg_model_top c_soc_ifc_rm; + + + //------------------------------------------------------------------------------------------ + // Coverage Signals + //------------------------------------------------------------------------------------------ + mbox_steps_by_if_s prev_step_sampled = '{is_ahb: NOT_AHB_REQ, step:{null_action: 1'b1, default: 1'b0}}; + + + //------------------------------------------------------------------------------------------ + // Covergroups + //------------------------------------------------------------------------------------------ + covergroup soc_ifc_env_mbox_steps_cg with function sample (input bit is_ahb, input mbox_steps_s next_step); + option.per_instance = 1; + step_lock_acquire : coverpoint (next_step.lock_acquire); + step_cmd_wr : coverpoint (next_step.cmd_wr); + step_dlen_wr : coverpoint (next_step.dlen_wr); + step_datain_wr : coverpoint (next_step.datain_wr); + step_exec_set : coverpoint (next_step.exec_set); + step_cmd_rd : coverpoint (next_step.cmd_rd); + step_dlen_rd : coverpoint (next_step.dlen_rd); + step_dataout_rd : coverpoint (next_step.dataout_rd); + step_resp_datain_wr : coverpoint (next_step.resp_datain_wr); + step_resp_dlen_wr : coverpoint (next_step.resp_dlen_wr); + step_resp_dlen_rd : coverpoint (next_step.resp_dlen_rd); + step_resp_dataout_rd: coverpoint (next_step.resp_dataout_rd); + step_status_wr : coverpoint (next_step.status_wr); + step_status_rd : coverpoint (next_step.status_rd); + step_exec_clr : coverpoint (next_step.exec_clr); + step_force_unlock : coverpoint (next_step.force_unlock); + step_reset : coverpoint (next_step.reset); + /* + *steps_all_mbox_flow : coverpoint (next_step) { + * bins mbox_flow = (MBOX_STEP_LOCK_ACQUIRE => + * MBOX_STEP_CMD_WR [=1] => + * MBOX_STEP_DLEN_WR [=1] => + * MBOX_STEP_DATAIN_WR [=1:511] => + * MBOX_STEP_EXEC_SET [=1] => + * MBOX_STEP_CMD_RD [=1] => + * MBOX_STEP_DLEN_RD [=1] => + * MBOX_STEP_DATAOUT_RD [=1:511] => + * MBOX_STEP_STATUS_WR [=1] => + * MBOX_STEP_STATUS_RD [=1:511] => + * MBOX_STEP_EXEC_CLR); + * bins mbox_resp_flow = (MBOX_STEP_LOCK_ACQUIRE => + * MBOX_STEP_CMD_WR [=1] => + * MBOX_STEP_DLEN_WR [=1] => + * MBOX_STEP_DATAIN_WR [=1:511] => + * MBOX_STEP_EXEC_SET [=1] => + * MBOX_STEP_CMD_RD [=1] => + * MBOX_STEP_DLEN_RD [=1] => + * MBOX_STEP_DATAOUT_RD [=1:511] => + * MBOX_STEP_RESP_DATAIN_WR,MBOX_STEP_RESP_DLEN_WR [=2:511] => + * MBOX_STEP_STATUS_WR [=1] => + * MBOX_STEP_RESP_DLEN_RD,MBOX_STEP_RESP_DATAOUT_RD,MBOX_STEP_STATUS_RD[=3:511] => + * MBOX_STEP_EXEC_CLR); + *} + */ + which_lock_acquire : cross step_lock_acquire , is_ahb; + which_cmd_wr : cross step_cmd_wr , is_ahb; + which_dlen_wr : cross step_dlen_wr , is_ahb; + which_datain_wr : cross step_datain_wr , is_ahb; + which_exec_set : cross step_exec_set , is_ahb; + which_cmd_rd : cross step_cmd_rd , is_ahb; + which_dlen_rd : cross step_dlen_rd , is_ahb; + which_dataout_rd : cross step_dataout_rd , is_ahb; + which_resp_datain_wr : cross step_resp_datain_wr , is_ahb { ignore_bins ignore_apb = binsof(is_ahb) intersect {1'b0}; } + which_resp_dlen_wr : cross step_resp_dlen_wr , is_ahb { ignore_bins ignore_apb = binsof(is_ahb) intersect {1'b0}; } + which_resp_dlen_rd : cross step_resp_dlen_rd , is_ahb { ignore_bins ignore_ahb = binsof(is_ahb) intersect {1'b1}; } + which_resp_dataout_rd: cross step_resp_dataout_rd, is_ahb { ignore_bins ignore_ahb = binsof(is_ahb) intersect {1'b1}; } + which_status_wr : cross step_status_wr , is_ahb; + which_status_rd : cross step_status_rd , is_ahb; + which_exec_clr : cross step_exec_clr , is_ahb; + which_force_unlock : cross step_force_unlock , is_ahb { ignore_bins ignore_apb = binsof(is_ahb) intersect {1'b0}; } + endgroup + + covergroup soc_ifc_env_mbox_scenarios_cg with function sample (mbox_steps_by_if_s step_by_if); + option.per_instance = 1; + mbox_steps_by_if : coverpoint (step_by_if) { + bins step_lock_acquire_ahb = {{ AHB_REQ,MBOX_STEP_LOCK_ACQUIRE}}; + bins step_cmd_wr_ahb = {{ AHB_REQ,MBOX_STEP_CMD_WR}}; + bins step_dlen_wr_ahb = {{ AHB_REQ,MBOX_STEP_DLEN_WR}}; + bins step_datain_wr_ahb = {{ AHB_REQ,MBOX_STEP_DATAIN_WR}}; + bins step_exec_set_ahb = {{ AHB_REQ,MBOX_STEP_EXEC_SET}}; + bins step_cmd_rd_ahb = {{ AHB_REQ,MBOX_STEP_CMD_RD}}; + bins step_dlen_rd_ahb = {{ AHB_REQ,MBOX_STEP_DLEN_RD}}; + bins step_dataout_rd_ahb = {{ AHB_REQ,MBOX_STEP_DATAOUT_RD}}; + bins step_resp_datain_wr_ahb = {{ AHB_REQ,MBOX_STEP_RESP_DATAIN_WR}}; + bins step_resp_dlen_wr_ahb = {{ AHB_REQ,MBOX_STEP_RESP_DLEN_WR}}; + bins step_status_wr_ahb = {{ AHB_REQ,MBOX_STEP_STATUS_WR}}; + bins step_status_rd_ahb = {{ AHB_REQ,MBOX_STEP_STATUS_RD}}; + bins step_exec_clr_ahb = {{ AHB_REQ,MBOX_STEP_EXEC_CLR}}; + bins step_force_unlock_ahb = {{ AHB_REQ,MBOX_STEP_FORCE_UNLOCK}}; + bins step_lock_acquire_apb = {{NOT_AHB_REQ,MBOX_STEP_LOCK_ACQUIRE}}; + bins step_cmd_wr_apb = {{NOT_AHB_REQ,MBOX_STEP_CMD_WR}}; + bins step_dlen_wr_apb = {{NOT_AHB_REQ,MBOX_STEP_DLEN_WR}}; + bins step_datain_wr_apb = {{NOT_AHB_REQ,MBOX_STEP_DATAIN_WR}}; + bins step_exec_set_apb = {{NOT_AHB_REQ,MBOX_STEP_EXEC_SET}}; + bins step_cmd_rd_apb = {{NOT_AHB_REQ,MBOX_STEP_CMD_RD}}; + bins step_dlen_rd_apb = {{NOT_AHB_REQ,MBOX_STEP_DLEN_RD}}; + bins step_dataout_rd_apb = {{NOT_AHB_REQ,MBOX_STEP_DATAOUT_RD}}; + bins step_resp_dlen_rd_apb = {{NOT_AHB_REQ,MBOX_STEP_RESP_DLEN_RD}}; + bins step_resp_dataout_rd_apb = {{NOT_AHB_REQ,MBOX_STEP_RESP_DATAOUT_RD}}; + bins step_status_wr_apb = {{NOT_AHB_REQ,MBOX_STEP_STATUS_WR}}; + bins step_status_rd_apb = {{NOT_AHB_REQ,MBOX_STEP_STATUS_RD}}; + bins step_exec_clr_apb = {{NOT_AHB_REQ,MBOX_STEP_EXEC_CLR}}; + bins step_reset = {{NOT_AHB_REQ,MBOX_STEP_RESET}}; + } + /* + *mbox_flow_by_if : coverpoint (step_by_if) { + * bins uc_to_soc_flow = ( + * { AHB_REQ,MBOX_STEP_LOCK_ACQUIRE} => + * { AHB_REQ,MBOX_STEP_CMD_WR } [=1] => + * { AHB_REQ,MBOX_STEP_DLEN_WR } [=1] => + * { AHB_REQ,MBOX_STEP_DATAIN_WR } [=1:511] => + * { AHB_REQ,MBOX_STEP_EXEC_SET } [=1] => + * {NOT_AHB_REQ,MBOX_STEP_CMD_RD } [=1] => + * {NOT_AHB_REQ,MBOX_STEP_DLEN_RD } [=1] => + * {NOT_AHB_REQ,MBOX_STEP_DATAOUT_RD } [=1:511] => + * {NOT_AHB_REQ,MBOX_STEP_STATUS_WR } [=1] => + * { AHB_REQ,MBOX_STEP_STATUS_RD } [=1:511] => + * { AHB_REQ,MBOX_STEP_EXEC_CLR }); + * bins soc_to_uc_flow = ( + * {NOT_AHB_REQ,MBOX_STEP_LOCK_ACQUIRE} => + * {NOT_AHB_REQ,MBOX_STEP_CMD_WR } [=1] => + * {NOT_AHB_REQ,MBOX_STEP_DLEN_WR } [=1] => + * {NOT_AHB_REQ,MBOX_STEP_DATAIN_WR } [=1:511] => + * {NOT_AHB_REQ,MBOX_STEP_EXEC_SET } [=1] => + * { AHB_REQ,MBOX_STEP_CMD_RD } [=1] => + * { AHB_REQ,MBOX_STEP_DLEN_RD } [=1] => + * { AHB_REQ,MBOX_STEP_DATAOUT_RD } [=1:511] => + * { AHB_REQ,MBOX_STEP_RESP_DATAIN_WR},{AHB_REQ,MBOX_STEP_RESP_DLEN_WR} [=2:511] => + * { AHB_REQ,MBOX_STEP_STATUS_WR } [=1] => + * {NOT_AHB_REQ,MBOX_STEP_RESP_DLEN_RD},{NOT_AHB_REQ,MBOX_STEP_RESP_DATAOUT_RD},{NOT_AHB_REQ,MBOX_STEP_STATUS_RD} [=3:511] => + * {NOT_AHB_REQ,MBOX_STEP_EXEC_CLR }); + *} + *mbox_flow_uc_to_soc_with_rst_by_if : coverpoint (step_by_if) { + * bins uc_to_soc_rst_after_lock = ( + * { AHB_REQ,MBOX_STEP_LOCK_ACQUIRE} => + * {NOT_AHB_REQ,MBOX_STEP_RESET }); + * bins uc_to_soc_rst_after_cmd = ( + * { AHB_REQ,MBOX_STEP_LOCK_ACQUIRE} => + * { AHB_REQ,MBOX_STEP_CMD_WR } [->1] => + * {NOT_AHB_REQ,MBOX_STEP_RESET }); + * bins uc_to_soc_rst_after_dlen = ( + * { AHB_REQ,MBOX_STEP_LOCK_ACQUIRE} => + * { AHB_REQ,MBOX_STEP_CMD_WR } [=1] => + * { AHB_REQ,MBOX_STEP_DLEN_WR } [->1] => + * {NOT_AHB_REQ,MBOX_STEP_RESET }); + * bins uc_to_soc_rst_after_datain = ( + * { AHB_REQ,MBOX_STEP_LOCK_ACQUIRE} => + * { AHB_REQ,MBOX_STEP_CMD_WR } [=1] => + * { AHB_REQ,MBOX_STEP_DLEN_WR } [=1] => + * { AHB_REQ,MBOX_STEP_DATAIN_WR } [->1:511] => + * {NOT_AHB_REQ,MBOX_STEP_RESET }); + * bins uc_to_soc_rst_after_exec_set = ( + * { AHB_REQ,MBOX_STEP_LOCK_ACQUIRE} => + * { AHB_REQ,MBOX_STEP_CMD_WR } [=1] => + * { AHB_REQ,MBOX_STEP_DLEN_WR } [=1] => + * { AHB_REQ,MBOX_STEP_DATAIN_WR } [=1:511] => + * { AHB_REQ,MBOX_STEP_EXEC_SET } [->1] => + * {NOT_AHB_REQ,MBOX_STEP_RESET }); + * bins uc_to_soc_rst_after_cmd_rd = ( + * { AHB_REQ,MBOX_STEP_LOCK_ACQUIRE} => + * { AHB_REQ,MBOX_STEP_CMD_WR } [=1] => + * { AHB_REQ,MBOX_STEP_DLEN_WR } [=1] => + * { AHB_REQ,MBOX_STEP_DATAIN_WR } [=1:511] => + * { AHB_REQ,MBOX_STEP_EXEC_SET } [=1] => + * {NOT_AHB_REQ,MBOX_STEP_CMD_RD } [->1] => + * {NOT_AHB_REQ,MBOX_STEP_RESET }); + * bins uc_to_soc_rst_after_dlen_rd = ( + * { AHB_REQ,MBOX_STEP_LOCK_ACQUIRE} => + * { AHB_REQ,MBOX_STEP_CMD_WR } [=1] => + * { AHB_REQ,MBOX_STEP_DLEN_WR } [=1] => + * { AHB_REQ,MBOX_STEP_DATAIN_WR } [=1:511] => + * { AHB_REQ,MBOX_STEP_EXEC_SET } [=1] => + * {NOT_AHB_REQ,MBOX_STEP_CMD_RD } [=1] => + * {NOT_AHB_REQ,MBOX_STEP_DLEN_RD } [->1] => + * {NOT_AHB_REQ,MBOX_STEP_RESET }); + * bins uc_to_soc_rst_after_dataout_rd = ( + * { AHB_REQ,MBOX_STEP_LOCK_ACQUIRE} => + * { AHB_REQ,MBOX_STEP_CMD_WR } [=1] => + * { AHB_REQ,MBOX_STEP_DLEN_WR } [=1] => + * { AHB_REQ,MBOX_STEP_DATAIN_WR } [=1:511] => + * { AHB_REQ,MBOX_STEP_EXEC_SET } [=1] => + * {NOT_AHB_REQ,MBOX_STEP_CMD_RD } [=1] => + * {NOT_AHB_REQ,MBOX_STEP_DLEN_RD } [=1] => + * {NOT_AHB_REQ,MBOX_STEP_DATAOUT_RD } [->1:511] => + * {NOT_AHB_REQ,MBOX_STEP_RESET }); + * bins uc_to_soc_rst_after_status_wr = ( + * { AHB_REQ,MBOX_STEP_LOCK_ACQUIRE} => + * { AHB_REQ,MBOX_STEP_CMD_WR } [=1] => + * { AHB_REQ,MBOX_STEP_DLEN_WR } [=1] => + * { AHB_REQ,MBOX_STEP_DATAIN_WR } [=1:511] => + * { AHB_REQ,MBOX_STEP_EXEC_SET } [=1] => + * {NOT_AHB_REQ,MBOX_STEP_CMD_RD } [=1] => + * {NOT_AHB_REQ,MBOX_STEP_DLEN_RD } [=1] => + * {NOT_AHB_REQ,MBOX_STEP_DATAOUT_RD } [=1:511] => + * {NOT_AHB_REQ,MBOX_STEP_STATUS_WR } [->1] => + * {NOT_AHB_REQ,MBOX_STEP_RESET }); + * bins uc_to_soc_rst_after_status_rd = ( + * { AHB_REQ,MBOX_STEP_LOCK_ACQUIRE} => + * { AHB_REQ,MBOX_STEP_CMD_WR } [=1] => + * { AHB_REQ,MBOX_STEP_DLEN_WR } [=1] => + * { AHB_REQ,MBOX_STEP_DATAIN_WR } [=1:511] => + * { AHB_REQ,MBOX_STEP_EXEC_SET } [=1] => + * {NOT_AHB_REQ,MBOX_STEP_CMD_RD } [=1] => + * {NOT_AHB_REQ,MBOX_STEP_DLEN_RD } [=1] => + * {NOT_AHB_REQ,MBOX_STEP_DATAOUT_RD } [=1:511] => + * {NOT_AHB_REQ,MBOX_STEP_STATUS_WR } [=1] => + * { AHB_REQ,MBOX_STEP_STATUS_RD } [->1:511] => + * {NOT_AHB_REQ,MBOX_STEP_RESET }); + * bins uc_to_soc_rst_after_exec_clr = ( + * { AHB_REQ,MBOX_STEP_LOCK_ACQUIRE} => + * { AHB_REQ,MBOX_STEP_CMD_WR } [=1] => + * { AHB_REQ,MBOX_STEP_DLEN_WR } [=1] => + * { AHB_REQ,MBOX_STEP_DATAIN_WR } [=1:511] => + * { AHB_REQ,MBOX_STEP_EXEC_SET } [=1] => + * {NOT_AHB_REQ,MBOX_STEP_CMD_RD } [=1] => + * {NOT_AHB_REQ,MBOX_STEP_DLEN_RD } [=1] => + * {NOT_AHB_REQ,MBOX_STEP_DATAOUT_RD } [=1:511] => + * {NOT_AHB_REQ,MBOX_STEP_STATUS_WR } [=1] => + * { AHB_REQ,MBOX_STEP_STATUS_RD } [=1:511] => + * { AHB_REQ,MBOX_STEP_EXEC_CLR } [->1] => + * {NOT_AHB_REQ,MBOX_STEP_RESET }); + *} + *mbox_flow_soc_to_uc_with_rst_by_if : coverpoint (step_by_if) { + * bins soc_to_uc_rst_after_lock = ( + * {NOT_AHB_REQ,MBOX_STEP_LOCK_ACQUIRE} => + * {NOT_AHB_REQ,MBOX_STEP_RESET }); + * bins soc_to_uc_rst_after_cmd_wr = ( + * {NOT_AHB_REQ,MBOX_STEP_LOCK_ACQUIRE} => + * {NOT_AHB_REQ,MBOX_STEP_CMD_WR } [->1] => + * {NOT_AHB_REQ,MBOX_STEP_RESET }); + * bins soc_to_uc_rst_after_dlen_wr = ( + * {NOT_AHB_REQ,MBOX_STEP_LOCK_ACQUIRE} => + * {NOT_AHB_REQ,MBOX_STEP_CMD_WR } [=1] => + * {NOT_AHB_REQ,MBOX_STEP_DLEN_WR } [->1] => + * {NOT_AHB_REQ,MBOX_STEP_RESET }); + * bins soc_to_uc_rst_after_datain_wr = ( + * {NOT_AHB_REQ,MBOX_STEP_LOCK_ACQUIRE} => + * {NOT_AHB_REQ,MBOX_STEP_CMD_WR } [=1] => + * {NOT_AHB_REQ,MBOX_STEP_DLEN_WR } [=1] => + * {NOT_AHB_REQ,MBOX_STEP_DATAIN_WR } [->1:511] => + * {NOT_AHB_REQ,MBOX_STEP_RESET }); + * bins soc_to_uc_rst_after_exec_set = ( + * {NOT_AHB_REQ,MBOX_STEP_LOCK_ACQUIRE} => + * {NOT_AHB_REQ,MBOX_STEP_CMD_WR } [=1] => + * {NOT_AHB_REQ,MBOX_STEP_DLEN_WR } [=1] => + * {NOT_AHB_REQ,MBOX_STEP_DATAIN_WR } [=1:511] => + * {NOT_AHB_REQ,MBOX_STEP_EXEC_SET } [->1] => + * {NOT_AHB_REQ,MBOX_STEP_RESET }); + * bins soc_to_uc_rst_after_cmd_rd = ( + * {NOT_AHB_REQ,MBOX_STEP_LOCK_ACQUIRE} => + * {NOT_AHB_REQ,MBOX_STEP_CMD_WR } [=1] => + * {NOT_AHB_REQ,MBOX_STEP_DLEN_WR } [=1] => + * {NOT_AHB_REQ,MBOX_STEP_DATAIN_WR } [=1:511] => + * {NOT_AHB_REQ,MBOX_STEP_EXEC_SET } [=1] => + * { AHB_REQ,MBOX_STEP_CMD_RD } [->1] => + * {NOT_AHB_REQ,MBOX_STEP_RESET }); + * bins soc_to_uc_rst_after_dlen_rd = ( + * {NOT_AHB_REQ,MBOX_STEP_LOCK_ACQUIRE} => + * {NOT_AHB_REQ,MBOX_STEP_CMD_WR } [=1] => + * {NOT_AHB_REQ,MBOX_STEP_DLEN_WR } [=1] => + * {NOT_AHB_REQ,MBOX_STEP_DATAIN_WR } [=1:511] => + * {NOT_AHB_REQ,MBOX_STEP_EXEC_SET } [=1] => + * { AHB_REQ,MBOX_STEP_CMD_RD } [=1] => + * { AHB_REQ,MBOX_STEP_DLEN_RD } [->1] => + * {NOT_AHB_REQ,MBOX_STEP_RESET }); + * bins soc_to_uc_rst_after_dataout_rd = ( + * {NOT_AHB_REQ,MBOX_STEP_LOCK_ACQUIRE} => + * {NOT_AHB_REQ,MBOX_STEP_CMD_WR } [=1] => + * {NOT_AHB_REQ,MBOX_STEP_DLEN_WR } [=1] => + * {NOT_AHB_REQ,MBOX_STEP_DATAIN_WR } [=1:511] => + * {NOT_AHB_REQ,MBOX_STEP_EXEC_SET } [=1] => + * { AHB_REQ,MBOX_STEP_CMD_RD } [=1] => + * { AHB_REQ,MBOX_STEP_DLEN_RD } [=1] => + * { AHB_REQ,MBOX_STEP_DATAOUT_RD } [->1:511] => + * {NOT_AHB_REQ,MBOX_STEP_RESET }); + * bins soc_to_uc_rst_after_resp_dlen_wr = ( + * {NOT_AHB_REQ,MBOX_STEP_LOCK_ACQUIRE} => + * {NOT_AHB_REQ,MBOX_STEP_CMD_WR } [=1] => + * {NOT_AHB_REQ,MBOX_STEP_DLEN_WR } [=1] => + * {NOT_AHB_REQ,MBOX_STEP_DATAIN_WR } [=1:511] => + * {NOT_AHB_REQ,MBOX_STEP_EXEC_SET } [=1] => + * { AHB_REQ,MBOX_STEP_CMD_RD } [=1] => + * { AHB_REQ,MBOX_STEP_DLEN_RD } [=1] => + * { AHB_REQ,MBOX_STEP_DATAOUT_RD } [=1:511] => + * { AHB_REQ,MBOX_STEP_RESP_DATAIN_WR},{AHB_REQ,MBOX_STEP_RESP_DLEN_WR} [->2:511] => + * {NOT_AHB_REQ,MBOX_STEP_RESET }); + * bins soc_to_uc_rst_after_status_wr = ( + * {NOT_AHB_REQ,MBOX_STEP_LOCK_ACQUIRE} => + * {NOT_AHB_REQ,MBOX_STEP_CMD_WR } [=1] => + * {NOT_AHB_REQ,MBOX_STEP_DLEN_WR } [=1] => + * {NOT_AHB_REQ,MBOX_STEP_DATAIN_WR } [=1:511] => + * {NOT_AHB_REQ,MBOX_STEP_EXEC_SET } [=1] => + * { AHB_REQ,MBOX_STEP_CMD_RD } [=1] => + * { AHB_REQ,MBOX_STEP_DLEN_RD } [=1] => + * { AHB_REQ,MBOX_STEP_DATAOUT_RD } [=1:511] => + * { AHB_REQ,MBOX_STEP_RESP_DATAIN_WR},{AHB_REQ,MBOX_STEP_RESP_DLEN_WR} [=2:511] => + * { AHB_REQ,MBOX_STEP_STATUS_WR } [->1] => + * {NOT_AHB_REQ,MBOX_STEP_RESET }); + * bins soc_to_uc_rst_after_status_rd = ( + * {NOT_AHB_REQ,MBOX_STEP_LOCK_ACQUIRE} => + * {NOT_AHB_REQ,MBOX_STEP_CMD_WR } [=1] => + * {NOT_AHB_REQ,MBOX_STEP_DLEN_WR } [=1] => + * {NOT_AHB_REQ,MBOX_STEP_DATAIN_WR } [=1:511] => + * {NOT_AHB_REQ,MBOX_STEP_EXEC_SET } [=1] => + * { AHB_REQ,MBOX_STEP_CMD_RD } [=1] => + * { AHB_REQ,MBOX_STEP_DLEN_RD } [=1] => + * { AHB_REQ,MBOX_STEP_DATAOUT_RD } [=1:511] => + * { AHB_REQ,MBOX_STEP_RESP_DATAIN_WR},{AHB_REQ,MBOX_STEP_RESP_DLEN_WR} [=2:511] => + * { AHB_REQ,MBOX_STEP_STATUS_WR } [=1] => + * {NOT_AHB_REQ,MBOX_STEP_RESP_DLEN_RD},{NOT_AHB_REQ,MBOX_STEP_RESP_DATAOUT_RD},{NOT_AHB_REQ,MBOX_STEP_STATUS_RD} [->3:511] => + * {NOT_AHB_REQ,MBOX_STEP_RESET }); + * bins soc_to_uc_rst_after_exec_clr = ( + * {NOT_AHB_REQ,MBOX_STEP_LOCK_ACQUIRE} => + * {NOT_AHB_REQ,MBOX_STEP_CMD_WR } [=1] => + * {NOT_AHB_REQ,MBOX_STEP_DLEN_WR } [=1] => + * {NOT_AHB_REQ,MBOX_STEP_DATAIN_WR } [=1:511] => + * {NOT_AHB_REQ,MBOX_STEP_EXEC_SET } [=1] => + * { AHB_REQ,MBOX_STEP_CMD_RD } [=1] => + * { AHB_REQ,MBOX_STEP_DLEN_RD } [=1] => + * { AHB_REQ,MBOX_STEP_DATAOUT_RD } [=1:511] => + * { AHB_REQ,MBOX_STEP_RESP_DATAIN_WR},{AHB_REQ,MBOX_STEP_RESP_DLEN_WR} [=2:511] => + * { AHB_REQ,MBOX_STEP_STATUS_WR } [=1] => + * {NOT_AHB_REQ,MBOX_STEP_RESP_DLEN_RD},{NOT_AHB_REQ,MBOX_STEP_RESP_DATAOUT_RD},{NOT_AHB_REQ,MBOX_STEP_STATUS_RD} [=3:511] => + * {NOT_AHB_REQ,MBOX_STEP_EXEC_CLR } [->1] => + * {NOT_AHB_REQ,MBOX_STEP_RESET }); + *} + */ + endgroup + /* TODO: + * covergroup soc_ifc_env_resets; + * covergroup soc_ifc_env_trng; // Incl. TRNG PAUSER cases + * covergroup soc_ifc_env_pauser; + * covergroup soc_ifc_env_iccm_lock; + * covergroup soc_ifc_env_wdt; + * covergroup soc_ifc_env_mtime; + * covergroup soc_ifc_env_fuses; // Writes, resets, blocked writes + * covergroup soc_ifc_env_errors; // E.g. NMI, MBOX PROT, ECC + * covergroup soc_ifc_env_interrupts; + * covergroup soc_ifc_env_boot; + * covergroup soc_ifc_env_security_state; + * covergroup soc_ifc_env_clk_gate; + * covergroup soc_ifc_env_sha_accel; + * covergroup soc_ifc_env_ahb_apb_arb; // Cover access contention + */ + + + //------------------------------------------------------------------------------------------ + // Member Variables + //------------------------------------------------------------------------------------------ + typedef ahb_master_burst_transfer #(ahb_lite_slave_0_params::AHB_NUM_MASTERS, + ahb_lite_slave_0_params::AHB_NUM_MASTER_BITS, + ahb_lite_slave_0_params::AHB_NUM_SLAVES, + ahb_lite_slave_0_params::AHB_ADDRESS_WIDTH, + ahb_lite_slave_0_params::AHB_WDATA_WIDTH, + ahb_lite_slave_0_params::AHB_RDATA_WIDTH) ahb_transaction_t; + typedef apb3_host_apb3_transaction #(apb5_master_0_params::APB3_SLAVE_COUNT, + apb5_master_0_params::APB3_PADDR_BIT_WIDTH, + apb5_master_0_params::APB3_PWDATA_BIT_WIDTH, + apb5_master_0_params::APB3_PRDATA_BIT_WIDTH) apb_transaction_t; + + // Instantiate the analysis exports + uvm_analysis_imp_cov_soc_ifc_ctrl_ae #(soc_ifc_ctrl_transaction, this_type) soc_ifc_ctrl_ae; + uvm_analysis_imp_cov_soc_ifc_status_ae #(soc_ifc_status_transaction, this_type) soc_ifc_status_ae; + uvm_analysis_imp_cov_apb_ae #(mvc_sequence_item_base, this_type) apb_ae; + uvm_analysis_imp_cov_cptra_ctrl_ae #(cptra_ctrl_transaction, this_type) cptra_ctrl_ae; + uvm_analysis_imp_cov_cptra_status_ae #(cptra_status_transaction, this_type) cptra_status_ae; + uvm_analysis_imp_cov_ahb_ae #(mvc_sequence_item_base, this_type) ahb_ae; + uvm_analysis_imp_cov_mbox_sram_ae #(mbox_sram_transaction, this_type) mbox_sram_ae; + + //------------------------------------------------------------------------------------------ + // Constructor + //------------------------------------------------------------------------------------------ + function new (string name, uvm_component parent); + super.new(name, parent); + soc_ifc_env_mbox_steps_cg = new; + soc_ifc_env_mbox_scenarios_cg = new; + endfunction + + //------------------------------------------------------------------------------------------ + // build_phase + //------------------------------------------------------------------------------------------ + virtual function void build_phase (uvm_phase phase); + soc_ifc_ctrl_ae = new("soc_ifc_ctrl_ae" , this); + soc_ifc_status_ae = new("soc_ifc_status_ae", this); + apb_ae = new("apb_ae" , this); + cptra_ctrl_ae = new("cptra_ctrl_ae" , this); + cptra_status_ae = new("cptra_status_ae" , this); + ahb_ae = new("ahb_ae" , this); + mbox_sram_ae = new("mbox_sram_ae" , this); + + c_soc_ifc_rm = configuration.soc_ifc_rm; + soc_ifc_env_mbox_steps_cg.set_inst_name($sformatf("soc_ifc_env_mbox_steps_cg_%s",get_full_name())); + soc_ifc_env_mbox_scenarios_cg.set_inst_name($sformatf("soc_ifc_env_mbox_scenarios_cg_%s",get_full_name())); + endfunction + + //------------------------------------------------------------------------------------------ + // CPTRA CTRL - write + //------------------------------------------------------------------------------------------ + virtual function void write_cov_cptra_ctrl_ae(cptra_ctrl_transaction txn); +// `uvm_fatal("FIXME", "FIXME") + endfunction + + //------------------------------------------------------------------------------------------ + // CPTRA STATUS - write + //------------------------------------------------------------------------------------------ + virtual function void write_cov_cptra_status_ae(cptra_status_transaction txn); +// `uvm_fatal("FIXME", "FIXME") + endfunction + + //------------------------------------------------------------------------------------------ + // SOC_IFC CTRL - write + //------------------------------------------------------------------------------------------ + virtual function void write_cov_soc_ifc_ctrl_ae(soc_ifc_ctrl_transaction txn); + `uvm_info("SOC_IFC_COV_SOC_IFC_CTRL", {"Collecting coverage on transaction: ", txn.convert2string()}, UVM_HIGH) + if (!txn.set_pwrgood || txn.assert_rst) begin + `uvm_info("SOC_IFC_COV_SOC_IFC_CTRL", $sformatf("Got next_step [%p]", pred.next_step), UVM_FULL) + soc_ifc_env_mbox_steps_cg.sample(.is_ahb(NOT_AHB_REQ), .next_step(pred.next_step)); + soc_ifc_env_mbox_scenarios_cg.sample({NOT_AHB_REQ,pred.next_step}); + prev_step_sampled = {is_ahb:NOT_AHB_REQ,step:pred.next_step}; + end + endfunction + + //------------------------------------------------------------------------------------------ + // SOC_IFC STATUS - write + //------------------------------------------------------------------------------------------ + virtual function void write_cov_soc_ifc_status_ae(soc_ifc_status_transaction txn); +// `uvm_fatal("FIXME", "FIXME") + endfunction + + //------------------------------------------------------------------------------------------ + // MBOX SRAM - write + //------------------------------------------------------------------------------------------ + virtual function void write_cov_mbox_sram_ae(mbox_sram_transaction txn); +// `uvm_fatal("FIXME", "FIXME") + endfunction + + //------------------------------------------------------------------------------------------ + // AHB - write + //------------------------------------------------------------------------------------------ + virtual function void write_cov_ahb_ae(mvc_sequence_item_base txn); + ahb_transaction_t ahb_txn; + uvm_reg axs_reg; + uvm_mem axs_mem; + + // Decode argument to access type + if (!$cast(ahb_txn,txn)) + `uvm_fatal("SOC_IFC_ENV_COV", "AHB coverage analysis import received invalid transaction") + if (c_soc_ifc_rm.soc_ifc_AHB_map.get_mem_by_offset(ahb_txn.address) != null) begin: MEM_HANDLE + `uvm_info("SOC_IFC_COV_AHB", $sformatf("Detected access to mailbox at address: 0x%x", ahb_txn.address), UVM_HIGH) + axs_mem = c_soc_ifc_rm.soc_ifc_AHB_map.get_mem_by_offset(ahb_txn.address); + end: MEM_HANDLE + else begin: REG_HANDLE + axs_reg = c_soc_ifc_rm.soc_ifc_AHB_map.get_reg_by_offset(ahb_txn.address); + if (axs_reg == null) begin + `uvm_error("SOC_IFC_COV_AHB", $sformatf("AHB transaction to address: 0x%x decodes to null from soc_ifc_AHB_map", ahb_txn.address)) + end + end: REG_HANDLE + + // Calculate coverage impact from register access + if (axs_mem != null) begin: MEM_AXS + `uvm_info("SOC_IFC_COV_AHB", $sformatf("Not calculating any system coverage for access to mailbox at address: 0x%x", ahb_txn.address), UVM_FULL) + end// MEM_AXS + else if (axs_reg == null) begin + `uvm_error("SOC_IFC_COV_AHB", $sformatf("AHB transaction to address: 0x%x decodes to null from soc_ifc_AHB_map", ahb_txn.address)) + end + else begin: REG_AXS + `uvm_info("SOC_IFC_COV_AHB", {"Collecting coverage on access to register: ", axs_reg.get_full_name()}, UVM_HIGH) + // Non-interrupt registers have 2-levels of ancestry back to reg_model top + if (axs_reg.get_parent().get_parent().get_name() == "soc_ifc_rm") begin + case (axs_reg.get_name()) inside + "mbox_lock", + "mbox_user", + "mbox_cmd", + "mbox_dlen", + "mbox_datain", + "mbox_dataout", + "mbox_execute", + "mbox_status", + "mbox_unlock": begin + `uvm_info("SOC_IFC_COV_AHB", $sformatf("Got next_step [%p]", pred.next_step), UVM_FULL) + // Skip coverage on repeated steps, as a memory optimization (large rep. operators are onerous) + if (pred.next_step inside {MBOX_STEP_DATAIN_WR, + MBOX_STEP_DATAOUT_RD, + MBOX_STEP_STATUS_RD, + MBOX_STEP_RESP_DATAIN_WR, + MBOX_STEP_RESP_DATAOUT_RD/*shouldn't happen*/} && + pred.next_step == prev_step_sampled.step && + prev_step_sampled.is_ahb) begin + `uvm_info("SOC_IFC_COV_AHB", "Skipping sample for step [%p] as it is a repetition", UVM_DEBUG) + end + else begin + soc_ifc_env_mbox_steps_cg.sample(.is_ahb(AHB_REQ), .next_step(pred.next_step)); + soc_ifc_env_mbox_scenarios_cg.sample({AHB_REQ,pred.next_step}); + prev_step_sampled = '{is_ahb:AHB_REQ, step:pred.next_step}; + end + end + endcase + end + end + endfunction + + //------------------------------------------------------------------------------------------ + // APB - write + //------------------------------------------------------------------------------------------ + virtual function void write_cov_apb_ae(mvc_sequence_item_base txn); + apb_transaction_t apb_txn; + uvm_reg axs_reg; + + // Extract info + if (!$cast(apb_txn,txn)) `uvm_fatal("SOC_IFC_COV_APB", "APB coverage analysis import received invalid transaction") + axs_reg = c_soc_ifc_rm.soc_ifc_APB_map.get_reg_by_offset(apb_txn.addr); + + // Calculate coverage impact from register access + if (axs_reg == null) begin + `uvm_error("SOC_IFC_COV_APB", $sformatf("APB transaction to address: 0x%x decodes to null from soc_ifc_APB_map", apb_txn.addr)) + end + else begin: REG_AXS + `uvm_info("SOC_IFC_COV_APB", {"Collecting coverage on access to register: ", axs_reg.get_full_name()}, UVM_HIGH) + case (axs_reg.get_name()) inside + "mbox_lock", + "mbox_user", + "mbox_cmd", + "mbox_dlen", + "mbox_datain", + "mbox_dataout", + "mbox_execute", + "mbox_status", + "mbox_unlock": begin + `uvm_info("SOC_IFC_COV_APB", $sformatf("Got next_step [%p]", pred.next_step), UVM_FULL) + // Skip coverage on repeated steps, as a memory optimization (large rep. operators are onerous) + if (pred.next_step inside {MBOX_STEP_DATAIN_WR, + MBOX_STEP_DATAOUT_RD, + MBOX_STEP_STATUS_RD, + MBOX_STEP_RESP_DATAIN_WR/*shouldn't happen*/, + MBOX_STEP_RESP_DATAOUT_RD} && + pred.next_step == prev_step_sampled.step && + !prev_step_sampled.is_ahb) begin + `uvm_info("SOC_IFC_COV_APB", "Skipping sample for step [%p] as it is a repetition", UVM_DEBUG) + end + else begin + soc_ifc_env_mbox_steps_cg.sample(.is_ahb(NOT_AHB_REQ), .next_step(pred.next_step)); + soc_ifc_env_mbox_scenarios_cg.sample({NOT_AHB_REQ,pred.next_step}); + prev_step_sampled = '{is_ahb: NOT_AHB_REQ, step:pred.next_step}; + end + end + endcase + end + endfunction + +endclass diff --git a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/src/soc_ifc_env_sequence_base.svh b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/src/soc_ifc_env_sequence_base.svh index 3a7ba5eb4..1cb88c7da 100644 --- a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/src/soc_ifc_env_sequence_base.svh +++ b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/src/soc_ifc_env_sequence_base.svh @@ -55,6 +55,7 @@ class soc_ifc_env_sequence_base #( // Responder agent sequencers in soc_ifc_environment: // configuration.soc_ifc_status_agent_config.sequencer // configuration.cptra_status_agent_config.sequencer + // configuration.mbox_sram_agent_config.sequencer typedef soc_ifc_ctrl_random_sequence soc_ifc_ctrl_agent_random_sequence_t; @@ -76,6 +77,18 @@ class soc_ifc_env_sequence_base #( `uvm_info(this.get_type_name(), "In: pre_start() for sequence", UVM_NONE) endtask + virtual function get_mbox_sram_ecc_error_injection(); + return this.configuration.mbox_sram_agent_config.inject_ecc_error; + endfunction + virtual function set_mbox_sram_ecc_single_error_injection(); + this.configuration.mbox_sram_agent_config.inject_ecc_error |= 2'b01; + endfunction + virtual function set_mbox_sram_ecc_double_error_injection(); + this.configuration.mbox_sram_agent_config.inject_ecc_error |= 2'b10; + endfunction + virtual function clr_mbox_sram_ecc_error_injection(); + this.configuration.mbox_sram_agent_config.inject_ecc_error = 2'b00; + endfunction // pragma uvmf custom class_item_additional end function new(string name = "" ); diff --git a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/src/soc_ifc_env_typedefs.svh b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/src/soc_ifc_env_typedefs.svh index 3fb908c12..bcc8dd5d8 100644 --- a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/src/soc_ifc_env_typedefs.svh +++ b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/src/soc_ifc_env_typedefs.svh @@ -45,14 +45,17 @@ * [29]: uC->SoC command */ typedef enum logic [31:0] { + MBOX_CMD_DIR_RD = 32'h01000000, MBOX_CMD_UC_BASIC = 32'h20000000, + MBOX_CMD_UC_OVERRUN = 32'h20000001, MBOX_CMD_RESP_BASIC = 32'h40000000, MBOX_CMD_REG_ACCESS = 32'h40000001, MBOX_CMD_OOB_ACCESS = 32'h40000002, MBOX_CMD_FMC_UPDATE = 32'hba5eba11, MBOX_CMD_RT_UPDATE = 32'hbabecafe, MBOX_CMD_SHA384_REQ = 32'h40C0FFEE, - MBOX_CMD_SHA512_REQ = 32'h41C0FFEE + MBOX_CMD_SHA512_REQ = 32'h41C0FFEE, + MBOX_CMD_ROM_FW_UPD = 32'h46574C44 } mbox_cmd_e; typedef union packed { @@ -75,5 +78,50 @@ logic sha512_mode; } sha_accel_op_s; + typedef struct packed { + bit null_action; /* no-effect reads or writes to mbox regs, or resets when mbox is idle */ + bit lock_acquire; + bit cmd_wr; + bit dlen_wr; + bit datain_wr; + bit exec_set; + bit cmd_rd; + bit dlen_rd; + bit dataout_rd; + bit resp_datain_wr; + bit resp_dlen_wr; + bit resp_dlen_rd; + bit resp_dataout_rd; + bit status_wr; + bit status_rd; + bit exec_clr; + bit force_unlock; + bit reset; /* should be triggered by a soc_ifc_ctrl transaction to indicate that an _active_ mailbox flow was interrupted by reset */ + } mbox_steps_s; + localparam mbox_steps_s MBOX_STEP_NULL_ACTION = '{null_action : 1'b1, default: 1'b0}; + localparam mbox_steps_s MBOX_STEP_LOCK_ACQUIRE = '{lock_acquire : 1'b1, default: 1'b0}; + localparam mbox_steps_s MBOX_STEP_CMD_WR = '{cmd_wr : 1'b1, default: 1'b0}; + localparam mbox_steps_s MBOX_STEP_DLEN_WR = '{dlen_wr : 1'b1, default: 1'b0}; + localparam mbox_steps_s MBOX_STEP_DATAIN_WR = '{datain_wr : 1'b1, default: 1'b0}; + localparam mbox_steps_s MBOX_STEP_EXEC_SET = '{exec_set : 1'b1, default: 1'b0}; + localparam mbox_steps_s MBOX_STEP_CMD_RD = '{cmd_rd : 1'b1, default: 1'b0}; + localparam mbox_steps_s MBOX_STEP_DLEN_RD = '{dlen_rd : 1'b1, default: 1'b0}; + localparam mbox_steps_s MBOX_STEP_DATAOUT_RD = '{dataout_rd : 1'b1, default: 1'b0}; + localparam mbox_steps_s MBOX_STEP_RESP_DATAIN_WR = '{resp_datain_wr : 1'b1, default: 1'b0}; + localparam mbox_steps_s MBOX_STEP_RESP_DLEN_WR = '{resp_dlen_wr : 1'b1, default: 1'b0}; + localparam mbox_steps_s MBOX_STEP_RESP_DLEN_RD = '{resp_dlen_rd : 1'b1, default: 1'b0}; + localparam mbox_steps_s MBOX_STEP_RESP_DATAOUT_RD = '{resp_dataout_rd: 1'b1, default: 1'b0}; + localparam mbox_steps_s MBOX_STEP_STATUS_WR = '{status_wr : 1'b1, default: 1'b0}; + localparam mbox_steps_s MBOX_STEP_STATUS_RD = '{status_rd : 1'b1, default: 1'b0}; + localparam mbox_steps_s MBOX_STEP_EXEC_CLR = '{exec_clr : 1'b1, default: 1'b0}; + localparam mbox_steps_s MBOX_STEP_FORCE_UNLOCK = '{force_unlock : 1'b1, default: 1'b0}; + localparam mbox_steps_s MBOX_STEP_RESET = '{reset : 1'b1, default: 1'b0}; + + localparam bit AHB_REQ = 1'b1; + localparam bit NOT_AHB_REQ = 1'b0; + typedef struct packed { + bit is_ahb; + mbox_steps_s step; + } mbox_steps_by_if_s; // pragma uvmf custom additional end diff --git a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/src/soc_ifc_environment.svh b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/src/soc_ifc_environment.svh index ea05dda33..0b2c30b66 100644 --- a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/src/soc_ifc_environment.svh +++ b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/src/soc_ifc_environment.svh @@ -54,6 +54,9 @@ class soc_ifc_environment extends uvmf_environment_base #( typedef cptra_status_agent cptra_status_agent_t; cptra_status_agent_t cptra_status_agent; + typedef mbox_sram_agent mbox_sram_agent_t; + mbox_sram_agent_t mbox_sram_agent; + @@ -67,6 +70,17 @@ class soc_ifc_environment extends uvmf_environment_base #( ) soc_ifc_sb_t; soc_ifc_sb_t soc_ifc_sb; + typedef soc_ifc_env_cov_subscriber #( + .PRED_T(soc_ifc_pred_t), + .CONFIG_T(CONFIG_T) + ) + soc_ifc_env_cov_sub_t; + soc_ifc_env_cov_sub_t soc_ifc_env_cov_sub; + typedef soc_ifc_reg_cov_subscriber #( + .CONFIG_T(CONFIG_T) + ) + soc_ifc_reg_cov_sub_t; + soc_ifc_reg_cov_sub_t soc_ifc_reg_cov_sub; // UVMF_CHANGE_ME: QVIP_AGENT_USED_FOR_REG_MAP: @@ -161,11 +175,18 @@ class soc_ifc_environment extends uvmf_environment_base #( soc_ifc_status_agent.set_config(configuration.soc_ifc_status_agent_config); cptra_status_agent = cptra_status_agent_t::type_id::create("cptra_status_agent",this); cptra_status_agent.set_config(configuration.cptra_status_agent_config); + mbox_sram_agent = mbox_sram_agent_t::type_id::create("mbox_sram_agent",this); + mbox_sram_agent.set_config(configuration.mbox_sram_agent_config); soc_ifc_pred = soc_ifc_pred_t::type_id::create("soc_ifc_pred",this); soc_ifc_pred.configuration = configuration; soc_ifc_sb = soc_ifc_sb_t::type_id::create("soc_ifc_sb",this); soc_ifc_sb.configuration = configuration; soc_ifc_sb.enable_wait_for_scoreboard_empty(); + soc_ifc_env_cov_sub = soc_ifc_env_cov_sub_t::type_id::create("soc_ifc_env_cov_sub",this); + soc_ifc_env_cov_sub.configuration = configuration; + soc_ifc_env_cov_sub.pred = soc_ifc_pred; + soc_ifc_reg_cov_sub = soc_ifc_reg_cov_sub_t::type_id::create("soc_ifc_reg_cov_sub",this); + soc_ifc_reg_cov_sub.configuration = configuration; // pragma uvmf custom reg_model_build_phase begin // Build register model predictor if prediction is enabled if (configuration.enable_reg_prediction) begin @@ -185,7 +206,7 @@ class soc_ifc_environment extends uvmf_environment_base #( // **************************************************************************** // FUNCTION: connect_phase() // This function makes all connections within this environment. Connections -// typically inclue agent to predictor, predictor to scoreboard and scoreboard +// typically include agent to predictor, predictor to scoreboard and scoreboard // to agent. // virtual function void connect_phase(uvm_phase phase); @@ -194,6 +215,7 @@ class soc_ifc_environment extends uvmf_environment_base #( super.connect_phase(phase); soc_ifc_ctrl_agent.monitored_ap.connect(soc_ifc_pred.soc_ifc_ctrl_agent_ae); cptra_ctrl_agent.monitored_ap.connect(soc_ifc_pred.cptra_ctrl_agent_ae); + mbox_sram_agent.monitored_ap.connect(soc_ifc_pred.mbox_sram_agent_ae); soc_ifc_pred.soc_ifc_sb_ap.connect(soc_ifc_sb.expected_analysis_export); soc_ifc_pred.cptra_sb_ap.connect(soc_ifc_sb.expected_cptra_analysis_export); soc_ifc_pred.soc_ifc_sb_ahb_ap.connect(soc_ifc_sb.expected_ahb_analysis_export); @@ -211,6 +233,15 @@ class soc_ifc_environment extends uvmf_environment_base #( if ( configuration.qvip_apb5_slave_subenv_interface_activity[0] == ACTIVE ) uvm_config_db #(mvc_sequencer)::set(null,UVMF_SEQUENCERS,configuration.qvip_apb5_slave_subenv_interface_names[0],qvip_apb5_slave_subenv.apb5_master_0.m_sequencer ); // pragma uvmf custom reg_model_connect_phase begin + /*if (TODO) */begin:connect_coverage + soc_ifc_pred.soc_ifc_cov_ap .connect (soc_ifc_env_cov_sub.soc_ifc_ctrl_ae ); + soc_ifc_pred.cptra_cov_ap .connect (soc_ifc_env_cov_sub.cptra_ctrl_ae ); + soc_ifc_status_agent.monitored_ap.connect (soc_ifc_env_cov_sub.soc_ifc_status_ae); + cptra_status_agent .monitored_ap.connect (soc_ifc_env_cov_sub.cptra_status_ae ); + mbox_sram_agent .monitored_ap.connect (soc_ifc_env_cov_sub.mbox_sram_ae ); + qvip_ahb_lite_slave_subenv_ahb_lite_slave_0_ap["burst_transfer_cov"].connect(soc_ifc_env_cov_sub.ahb_ae ); + qvip_apb5_slave_subenv_apb5_master_0_ap ["trans_ap_cov"] .connect(soc_ifc_env_cov_sub.apb_ae ); + end:connect_coverage // Create register model adapter if required if (configuration.enable_reg_prediction || configuration.enable_reg_adaptation) begin @@ -246,6 +277,8 @@ class soc_ifc_environment extends uvmf_environment_base #( // of the sub-maps must be done manually. soc_ifc_pred.soc_ifc_ahb_reg_ap.connect(ahb_reg_predictor.bus_item_export); soc_ifc_pred.soc_ifc_apb_reg_ap.connect(apb_reg_predictor.bus_item_export); + ahb_reg_predictor.reg_ap.connect(soc_ifc_reg_cov_sub.analysis_export); + apb_reg_predictor.reg_ap.connect(soc_ifc_reg_cov_sub.analysis_export); // qvip_ahb_lite_slave_subenv_ahb_lite_slave_0_ap["burst_transfer"].connect(ahb_reg_predictor.bus_item_export); // qvip_apb5_slave_subenv_apb5_master_0_ap["trans_ap"].connect(apb_reg_predictor.bus_item_export); end @@ -286,15 +319,47 @@ function void soc_ifc_environment::set_can_handle_reset(bit en = 1'b1); endfunction task soc_ifc_environment::handle_reset(string kind = "HARD"); + uvm_object obj; + uvm_event reset_synchro; + reset_flag rst_sync_flag; + // Reset status agents (needed to reset monitor transaction keys) this.cptra_status_agent.handle_reset(kind); this.soc_ifc_status_agent.handle_reset(kind); + // Reset mbox_sram agent (needed to reset the ECC error injection) + this.mbox_sram_agent.handle_reset(kind); + // Reset scoreboard according to kind this.soc_ifc_sb.handle_reset(kind); // Reset predictor according to kind - this.soc_ifc_pred.handle_reset(kind); + this.soc_ifc_pred.handle_reset(kind, reset_synchro); + + // A "SOFT" reset (cptra_rst_b) is followed by noncore reset assertion; we + // need to time the assertion of the reset to all the soc_ifc_env components + // based on the predictor + if (kind == "SOFT") begin + `uvm_info("SOC_IFC_ENV_HANDLE_RESET", "After receiving SOFT reset, waiting for predictor to signal the NONCORE reset so environment can be reset", UVM_LOW) + + reset_synchro.wait_trigger_data(obj); + $cast(rst_sync_flag, obj); + if (rst_sync_flag.get_name() != "noncore_reset_flag") + `uvm_error("SOC_IFC_ENV_HANDLE_RESET", {"Reset synchronization event returned a reset event of unexpected type! ", rst_sync_flag.get_name()}) + + // Reset status agents (needed to reset monitor transaction keys) + this.cptra_status_agent.handle_reset("NONCORE"); + this.soc_ifc_status_agent.handle_reset("NONCORE"); + + // Reset mbox_sram agent (needed to reset the ECC error injection) + this.mbox_sram_agent.handle_reset("NONCORE"); + + // Reset scoreboard according to kind + this.soc_ifc_sb.handle_reset("NONCORE"); + + `uvm_info("SOC_IFC_ENV_HANDLE_RESET", "After receiving NONCORE reset signal from soc_ifc_predictor, completed environment-level NONCORE reset prerequisites and continuing with reset prediction", UVM_LOW) + reset_synchro.reset(); + end // TODO does this happen naturally from hdl_top driving reset? // Reset APB diff --git a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/src/soc_ifc_predictor.svh b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/src/soc_ifc_predictor.svh index 58008bdee..9e1465f0f 100644 --- a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/src/soc_ifc_predictor.svh +++ b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/src/soc_ifc_predictor.svh @@ -29,6 +29,7 @@ // // soc_ifc_ctrl_agent_ae receives transactions of type soc_ifc_ctrl_transaction // cptra_ctrl_agent_ae receives transactions of type cptra_ctrl_transaction +// mbox_sram_agent_ae receives transactions of type mbox_sram_transaction // ahb_slave_0_ae receives transactions of type mvc_sequence_item_base // apb5_slave_0_ae receives transactions of type mvc_sequence_item_base // @@ -81,6 +82,11 @@ class soc_ifc_predictor #( .BASE_T(BASE_T) ) ) cptra_ctrl_agent_ae; + uvm_analysis_imp_mbox_sram_agent_ae #(mbox_sram_transaction, soc_ifc_predictor #( + .CONFIG_T(CONFIG_T), + .BASE_T(BASE_T) + ) +) mbox_sram_agent_ae; uvm_analysis_imp_ahb_slave_0_ae #(mvc_sequence_item_base, soc_ifc_predictor #( .CONFIG_T(CONFIG_T), .BASE_T(BASE_T) @@ -99,6 +105,9 @@ class soc_ifc_predictor #( uvm_analysis_port #(mvc_sequence_item_base) soc_ifc_sb_ahb_ap; uvm_analysis_port #(mvc_sequence_item_base) soc_ifc_sb_apb_ap; + uvm_analysis_port #(soc_ifc_ctrl_transaction) soc_ifc_cov_ap; + uvm_analysis_port #(cptra_ctrl_transaction ) cptra_cov_ap; + // Transaction variable for predicted values to be sent out soc_ifc_sb_ap // Once a transaction is sent through an analysis_port, another transaction should @@ -143,6 +152,7 @@ class soc_ifc_predictor #( // Define transaction handles for debug visibility soc_ifc_ctrl_transaction soc_ifc_ctrl_agent_ae_debug; cptra_ctrl_transaction cptra_ctrl_agent_ae_debug; + mbox_sram_transaction mbox_sram_agent_ae_debug; mvc_sequence_item_base ahb_slave_0_ae_debug; mvc_sequence_item_base apb5_slave_0_ae_debug; @@ -151,28 +161,43 @@ class soc_ifc_predictor #( uvm_analysis_port #(mvc_sequence_item_base) soc_ifc_ahb_reg_ap; uvm_analysis_port #(mvc_sequence_item_base) soc_ifc_apb_reg_ap; + process running_dly_jobs[$]; + int unsigned job_end_count[time]; + bit cptra_pwrgood_asserted = 1'b0; bit soc_ifc_rst_in_asserted = 1'b1; bit noncore_rst_out_asserted = 1'b1; bit uc_rst_out_asserted = 1'b1; + bit fw_update_rst_window = 1'b0; bit soc_ifc_error_intr_pending = 1'b0; bit soc_ifc_notif_intr_pending = 1'b0; bit sha_err_intr_pending = 1'b0; // TODO bit sha_notif_intr_pending = 1'b0; // TODO + bit timer_intr_pending = 1'b1; + bit nmi_intr_pending = 1'b0; + bit cptra_error_fatal = 1'b0; + bit cptra_error_non_fatal = 1'b0; bit fuse_update_enabled = 1'b1; bit ready_for_fw_push = 1'b0; // TODO - bit ready_for_runtime = 1'b0; // TODO + bit ready_for_runtime = 1'b0; bit mailbox_flow_done = 1'b0; + bit clk_gate_active = 1'b1; // TODO + bit rdc_clk_gate_active = 1'b1; + bit soc_ifc_clk_gate_active = 1'b1; // TODO bit mailbox_data_avail = 1'b0; int datain_count = 0; int dataout_count = 0; + bit dataout_mismatch_expected = 1'b0; + bit [31:0] nmi_vector = 32'h0; - bit iccm_locked = 1'b0; // TODO + bit iccm_locked = 1'b0; bit [`CLP_OBF_KEY_DWORDS-1:0] [31:0] cptra_obf_key_reg = '{default:32'h0}; // FIXME use reg-model value? - security_state_t security_state = '{debug_locked: 1'b1, device_lifecycle: DEVICE_UNPROVISIONED}; + security_state_t security_state = '{debug_locked: 1'b1, device_lifecycle: DEVICE_UNPROVISIONED}; // FIXME unused bit bootfsm_breakpoint = 1'b0; + bit cptra_in_dbg_or_manuf_mode = 1'b0; + int unsigned fw_update_wait_count = 0; bit [63:0] generic_output_wires = 64'h0; @@ -182,6 +207,10 @@ class soc_ifc_predictor #( bit trng_data_req = 1'b0; bit [apb5_master_0_params::APB3_PWDATA_BIT_WIDTH-1:0] trng_data [12] = '{default: '0}; // FIXME what is this used for? Can we just use the reg-model mirrors instead? + // For collecting coverage + mbox_steps_s prev_step = '{null_action: 1'b1, default: 1'b0}; + mbox_steps_s next_step = '{null_action: 1'b1, default: 1'b0}; + soc_ifc_reg_model_top p_soc_ifc_rm; uvm_reg_map p_soc_ifc_APB_map; // Block map uvm_reg_map p_soc_ifc_AHB_map; // Block map @@ -194,12 +223,34 @@ class soc_ifc_predictor #( reset_flag hard_reset_flag; reset_flag soft_reset_flag; + reset_flag noncore_reset_flag; + + //WDT vars: + bit [63:0] t1_count, t2_count; + bit wdt_error_intr_sent; + bit wdt_t2_error_intr_sent; + bit wdt_nmi_intr_sent; + bit reset_wdt_count; + bit wdt_t1_restart; + bit wdt_t2_restart; extern task poll_and_run_delay_jobs(); + extern function void send_delayed_expected_transactions(); + extern function bit check_mbox_no_lock_error(soc_ifc_sb_apb_ap_output_transaction_t txn, uvm_reg axs_reg); + extern function bit check_mbox_ooo_error(soc_ifc_sb_apb_ap_output_transaction_t txn, uvm_reg axs_reg); + extern function bit check_mbox_inv_user_error(soc_ifc_sb_apb_ap_output_transaction_t txn, uvm_reg axs_reg); + extern task update_mtime_mirrors(); + extern task mtime_counter_task(); + extern function bit mtime_lt_mtimecmp(); + extern task wdt_counter_task(); extern function bit valid_requester(input uvm_transaction txn); extern function bit valid_receiver(input uvm_transaction txn); - extern task handle_reset(input string kind = "HARD"); + extern function bit sha_valid_user(input uvm_transaction txn); + extern function void predict_boot_wait_boot_done(); + extern task handle_reset(input string kind = "HARD", output uvm_event reset_synchro); extern function void predict_reset(input string kind = "HARD"); + extern function bit soc_ifc_status_txn_expected_after_noncore_reset(); + extern function bit cptra_status_txn_expected_after_noncore_reset(); extern function bit soc_ifc_status_txn_expected_after_warm_reset(); extern function bit cptra_status_txn_expected_after_warm_reset(); extern function bit soc_ifc_status_txn_expected_after_cold_reset(); @@ -213,7 +264,6 @@ class soc_ifc_predictor #( // FUNCTION: new function new(string name, uvm_component parent); super.new(name,parent); - `uvm_info("PREDICTOR_REVIEW", "This predictor has been created either through generation or re-generation with merging. Remove this message after the predictor has been reviewed. (manually downgraded to uvm_info)", UVM_LOW) // pragma uvmf custom new begin // pragma uvmf custom new end endfunction @@ -224,6 +274,7 @@ class soc_ifc_predictor #( soc_ifc_ctrl_agent_ae = new("soc_ifc_ctrl_agent_ae", this); cptra_ctrl_agent_ae = new("cptra_ctrl_agent_ae", this); + mbox_sram_agent_ae = new("mbox_sram_agent_ae", this); ahb_slave_0_ae = new("ahb_slave_0_ae", this); apb5_slave_0_ae = new("apb5_slave_0_ae", this); soc_ifc_sb_ap = new("soc_ifc_sb_ap", this ); @@ -232,6 +283,8 @@ class soc_ifc_predictor #( soc_ifc_sb_apb_ap = new("soc_ifc_sb_apb_ap", this ); soc_ifc_ahb_reg_ap = new("soc_ifc_ahb_reg_ap", this); soc_ifc_apb_reg_ap = new("soc_ifc_apb_reg_ap", this); + soc_ifc_cov_ap = new("soc_ifc_cov_ap", this ); + cptra_cov_ap = new("cptra_cov_ap", this ); // pragma uvmf custom build_phase begin p_soc_ifc_rm = configuration.soc_ifc_rm; p_soc_ifc_AHB_map = p_soc_ifc_rm.get_map_by_name("soc_ifc_AHB_map"); @@ -240,12 +293,15 @@ class soc_ifc_predictor #( reset_handled = new("reset_handled"); hard_reset_flag = new("hard_reset_flag"); // Used as trigger data for reset events. In UVM 1.2, data changes from a uvm_object to a string soft_reset_flag = new("soft_reset_flag"); // Used as trigger data for reset events. In UVM 1.2, data changes from a uvm_object to a string + noncore_reset_flag = new("noncore_reset_flag"); // Used as trigger data for reset events. In UVM 1.2, data changes from a uvm_object to a string // pragma uvmf custom build_phase end endfunction task run_phase(uvm_phase phase); fork poll_and_run_delay_jobs(); + mtime_counter_task(); + wdt_counter_task(); join_none super.run_phase(phase); endtask @@ -263,7 +319,7 @@ class soc_ifc_predictor #( soc_ifc_ctrl_agent_ae_debug = t; `uvm_info("PRED_SOC_IFC_CTRL", "Transaction Received through soc_ifc_ctrl_agent_ae", UVM_MEDIUM) - `uvm_info("PRED_SOC_IFC_CTRL", {" Data: ",t.convert2string()}, UVM_FULL) + `uvm_info("PRED_SOC_IFC_CTRL", {" Data: ",t.convert2string()}, UVM_HIGH) // Construct one of each output transaction type. soc_ifc_sb_ap_output_transaction = soc_ifc_sb_ap_output_transaction_t::type_id::create("soc_ifc_sb_ap_output_transaction"); cptra_sb_ap_output_transaction = cptra_sb_ap_output_transaction_t::type_id::create("cptra_sb_ap_output_transaction"); @@ -273,6 +329,8 @@ class soc_ifc_predictor #( // FIXME account for security_state/scan_mode below + cptra_pwrgood_asserted = t.set_pwrgood; + // Initial boot if (!t.set_pwrgood && soc_ifc_rst_in_asserted) begin cptra_obf_key_reg = t.cptra_obf_key_rand; @@ -282,16 +340,20 @@ class soc_ifc_predictor #( end if (!t.assert_rst) `uvm_fatal("PRED_SOC_IFC_CTRL", "Bad initial boot with cptra_rst_b deasserted") + if (!p_soc_ifc_rm.soc_ifc_reg_rm.boot_fn_state_sigs.boot_idle) + `uvm_fatal("PRED_SOC_IFC_CTRL", $sformatf("Bad initial boot FSM prediction: %p", p_soc_ifc_rm.soc_ifc_reg_rm.boot_fn_state_sigs)) if (reset_handled.is_on()) begin `uvm_error("PRED_SOC_IFC_CTRL", "reset_handled event unexpectedly set on receiving soc_ifc_ctrl_transaction for initial boot reset") reset_handled.reset(); end predict_reset("HARD"); + reset_predicted.trigger(hard_reset_flag/*"HARD"*/); end // Cold reset assertion else if (!t.set_pwrgood) begin // FIXME // Catch obf_key, uds_seed, field_entropy reset on cold-reset + if (!t.assert_rst) begin `uvm_fatal("PRED_SOC_IFC_CTRL", "Bad cold rst") end @@ -332,6 +394,12 @@ class soc_ifc_predictor #( send_cptra_sts_txn |= (t.cptra_obf_key_rand[ii] != cptra_obf_key_reg[ii]); end cptra_obf_key_reg = t.cptra_obf_key_rand; + reset_predicted.reset(); + // No new signal predictions since it was all done on Cold reset assertion. + // But trigger the soft reset event to indicate to the predict_reset delay spinoff task + // that the soft reset is done (once cptra_rst_b deasserts) + reset_predicted.trigger(soft_reset_flag/*"SOFT"*/); + `uvm_info("PRED_SOC_IFC_CTRL", $sformatf("In response to cold_reset deassertion, send_cptra_sts_txn: %d", send_cptra_sts_txn), UVM_NONE) end // Warm reset assertion else if (t.assert_rst && !soc_ifc_rst_in_asserted) begin @@ -351,19 +419,24 @@ class soc_ifc_predictor #( if (soc_ifc_rst_in_asserted) begin // Todo check for breakpoint assertion and flag an expected AHB write to clear it soc_ifc_rst_in_asserted = 1'b0; - p_soc_ifc_rm.soc_ifc_reg_rm.CPTRA_FLOW_STATUS.ready_for_fuses.predict(1'b1); - noncore_rst_out_asserted = 1'b1; - uc_rst_out_asserted = 1'b1; - bootfsm_breakpoint = t.set_bootfsm_breakpoint; - send_soc_ifc_sts_txn = 1; + cptra_in_dbg_or_manuf_mode = ~t.security_state.debug_locked || t.security_state.device_lifecycle == DEVICE_MANUFACTURING; + bootfsm_breakpoint = t.set_bootfsm_breakpoint && cptra_in_dbg_or_manuf_mode; + reset_predicted.reset(); + send_soc_ifc_sts_txn = 0; // prediction for ready_for_fuses done in predict_reset after noncore reset deassertion send_cptra_sts_txn = 0; // cptra sts transaction not expected until after CPTRA_FUSE_WR_DONE + reset_wdt_count = 1'b0; + `uvm_info("PRED_SOC_IFC_CTRL", $sformatf("In response to warm_reset deassertion, send_soc_ifc_sts_txn: %d", send_soc_ifc_sts_txn), UVM_NONE) end // Normal operation else begin - //TODO beyond detecting uc_rst_asserted, this block needs more logic - noncore_rst_out_asserted = 1'b0; // <-- all status transactions after the first one should reflect Caliptra reset deasserted - uc_rst_out_asserted = 1'b1; // FIXME - send_cptra_sts_txn = 1; + //TODO this block needs more logic + if (t.generic_input_val ^ {SOC_IFC_DATA_W'(p_soc_ifc_rm.soc_ifc_reg_rm.CPTRA_GENERIC_INPUT_WIRES[1].generic_wires.get_mirrored_value()), SOC_IFC_DATA_W'(p_soc_ifc_rm.soc_ifc_reg_rm.CPTRA_GENERIC_INPUT_WIRES[0].generic_wires.get_mirrored_value())}) begin + `uvm_info("PRED_SOC_IFC_CTRL", "Detected toggle in generic_input_wires", UVM_HIGH) + p_soc_ifc_rm.soc_ifc_reg_rm.intr_block_rf_ext.notif_internal_intr_r.notif_gen_in_toggle_sts.predict(1'b1, -1, UVM_PREDICT_READ, UVM_PREDICT, p_soc_ifc_AHB_map); /* AHB-access only, use AHB map*/ + //Update reg model with the generic_input_val + p_soc_ifc_rm.soc_ifc_reg_rm.CPTRA_GENERIC_INPUT_WIRES[0].generic_wires.predict(t.generic_input_val[31:0], -1, UVM_PREDICT_READ, UVM_PREDICT, p_soc_ifc_AHB_map); + p_soc_ifc_rm.soc_ifc_reg_rm.CPTRA_GENERIC_INPUT_WIRES[1].generic_wires.predict(t.generic_input_val[63:32], -1, UVM_PREDICT_READ, UVM_PREDICT, p_soc_ifc_AHB_map); + end end end @@ -377,7 +450,6 @@ class soc_ifc_predictor #( soc_ifc_sb_ap.write(soc_ifc_sb_ap_output_transaction); `uvm_info("PRED_SOC_IFC_CTRL", "Transaction submitted through soc_ifc_sb_ap", UVM_MEDIUM) end - // TODO // Code for sending output transaction out through cptra_sb_ap // Please note that each broadcasted transaction should be a different object than previously // broadcasted transactions. Creation of a different object is done by constructing the transaction @@ -406,6 +478,12 @@ class soc_ifc_predictor #( soc_ifc_sb_apb_ap.write(soc_ifc_sb_apb_ap_output_transaction); `uvm_error("PRED_SOC_IFC_CTRL", "NULL Transaction submitted through soc_ifc_sb_apb_ap") end + + if (1/*FIXME*/) begin + // Forward the received transaction on to the coverage subscriber + soc_ifc_cov_ap.write(t); + `uvm_info("PRED_SOC_IFC_CTRL", "Transaction submitted through soc_ifc_cov_ap", UVM_MEDIUM) + end // pragma uvmf custom soc_ifc_ctrl_agent_ae_predictor end endfunction @@ -422,7 +500,7 @@ class soc_ifc_predictor #( cptra_ctrl_agent_ae_debug = t; `uvm_info("PRED_CPTRA_CTRL", "Transaction Received through cptra_ctrl_agent_ae", UVM_MEDIUM) - `uvm_info("PRED_CPTRA_CTRL", {" Data: ",t.convert2string()}, UVM_FULL) + `uvm_info("PRED_CPTRA_CTRL", {" Data: ",t.convert2string()}, UVM_HIGH) // Construct one of each output transaction type. soc_ifc_sb_ap_output_transaction = soc_ifc_sb_ap_output_transaction_t::type_id::create("soc_ifc_sb_ap_output_transaction"); cptra_sb_ap_output_transaction = cptra_sb_ap_output_transaction_t::type_id::create("cptra_sb_ap_output_transaction"); @@ -437,13 +515,17 @@ class soc_ifc_predictor #( // "do_predict" bypasses the access-check and does not enforce W1C // behavior on this attempt to set interrupt status to 1 p_soc_ifc_rm.soc_ifc_reg_rm.intr_block_rf_ext.error_internal_intr_r.error_iccm_blocked_sts.predict(1'b1, -1, UVM_PREDICT_READ, UVM_PREDICT, p_soc_ifc_AHB_map); /* AHB-access only, use AHB map*/ - if (!soc_ifc_error_intr_pending && p_soc_ifc_rm.soc_ifc_reg_rm.intr_block_rf_ext.error_global_intr_r.agg_sts.get_mirrored_value()) begin - soc_ifc_error_intr_pending = 1'b1; - send_cptra_sts_txn = 1'b1; - end end if (t.assert_clear_secrets) begin - `uvm_error("PRED_CPTRA_CTRL", "Unimplemented predictor for clearing secrets") + foreach (p_soc_ifc_rm.soc_ifc_reg_rm.internal_obf_key[ii]) p_soc_ifc_rm.soc_ifc_reg_rm.internal_obf_key[ii].key.reset(); + foreach (p_soc_ifc_rm.soc_ifc_reg_rm.fuse_field_entropy[ii]) p_soc_ifc_rm.soc_ifc_reg_rm.fuse_field_entropy[ii].seed.reset(); + foreach (p_soc_ifc_rm.soc_ifc_reg_rm.fuse_uds_seed[ii]) p_soc_ifc_rm.soc_ifc_reg_rm.fuse_uds_seed[ii].seed.reset; + this.cptra_obf_key_reg = '{default:32'h0}; + send_cptra_sts_txn = 1'b1; + `uvm_info("PRED_CPTRA_CTRL", "Received transaction with clear secrets set! Resetting Caliptra model secrets", UVM_MEDIUM) + end + if (t.pulse_rv_ecc_error) begin + `uvm_error("PRED_CPTRA_CTRL", "Unimplemented predictor for signaling RISCV SRAM ECC Errors") end // Code for sending output transaction out through soc_ifc_sb_ap @@ -484,9 +566,95 @@ class soc_ifc_predictor #( soc_ifc_sb_apb_ap.write(soc_ifc_sb_apb_ap_output_transaction); `uvm_error("PRED_CPTRA_CTRL", "NULL Transaction submitted through soc_ifc_sb_apb_ap") end + + if (1/*FIXME*/) begin + // Forward the received transaction on to the coverage subscriber + cptra_cov_ap.write(t); + `uvm_info("PRED_CPTRA_CTRL", "Transaction submitted through cptra_cov_ap", UVM_MEDIUM) + end // pragma uvmf custom cptra_ctrl_agent_ae_predictor end endfunction + // FUNCTION: write_mbox_sram_agent_ae + // Transactions received through mbox_sram_agent_ae initiate the execution of this function. + // This function performs prediction of DUT output values based on DUT input, configuration and state + virtual function void write_mbox_sram_agent_ae(mbox_sram_transaction t); + // pragma uvmf custom mbox_sram_agent_ae_predictor begin + // Flags control whether each transaction is sent to scoreboard + bit send_soc_ifc_sts_txn = 0; + bit send_cptra_sts_txn = 0; + bit send_ahb_txn = 0; + bit send_apb_txn = 0; + + mbox_sram_agent_ae_debug = t; + `uvm_info("PRED_MBOX_SRAM", "Transaction Received through mbox_sram_agent_ae", UVM_MEDIUM) + `uvm_info("PRED_MBOX_SRAM", {" Data: ",t.convert2string()}, UVM_HIGH) + // Construct one of each output transaction type. + soc_ifc_sb_ap_output_transaction = soc_ifc_sb_ap_output_transaction_t::type_id::create("soc_ifc_sb_ap_output_transaction"); + cptra_sb_ap_output_transaction = cptra_sb_ap_output_transaction_t::type_id::create("cptra_sb_ap_output_transaction"); + soc_ifc_sb_ahb_ap_output_transaction = soc_ifc_sb_ahb_ap_output_transaction_t::type_id::create("soc_ifc_sb_ahb_ap_output_transaction"); + soc_ifc_sb_apb_ap_output_transaction = soc_ifc_sb_apb_ap_output_transaction_t::type_id::create("soc_ifc_sb_apb_ap_output_transaction"); + + if (rdc_clk_gate_active || noncore_rst_out_asserted) begin + `uvm_info("PRED_MBOX_SRAM", "Received transaction while RDC clock gate is active, no system prediction to do since interrupt bits cannot be set", UVM_MEDIUM) + end + else if (t.is_read && t.ecc_double_bit_error) begin + p_soc_ifc_rm.soc_ifc_reg_rm.intr_block_rf_ext.error_internal_intr_r.error_mbox_ecc_unc_sts.predict(1'b1, -1, UVM_PREDICT_READ, UVM_PREDICT, p_soc_ifc_AHB_map); /* AHB-access only, use AHB map*/ + p_soc_ifc_rm.soc_ifc_reg_rm.CPTRA_HW_ERROR_NON_FATAL.mbox_ecc_unc.predict(1'b1, -1, UVM_PREDICT_READ, UVM_PREDICT, p_soc_ifc_AHB_map); + dataout_mismatch_expected = 1'b1; + cptra_error_non_fatal = 1'b1; + send_soc_ifc_sts_txn = 1'b1; + `uvm_info("PRED_MBOX_SRAM", "Received read transaction with Double bit ECC corruption, triggering the err interrupt", UVM_MEDIUM) + end + else if (t.is_read && t.ecc_single_bit_error) begin + p_soc_ifc_rm.soc_ifc_reg_rm.intr_block_rf_ext.notif_internal_intr_r.notif_mbox_ecc_cor_sts.predict(1'b1, -1, UVM_PREDICT_READ, UVM_PREDICT, p_soc_ifc_AHB_map); /* AHB-access only, use AHB map*/ + `uvm_info("PRED_MBOX_SRAM", "Received read transaction with Single bit ECC corruption, triggering the notification interrupt", UVM_MEDIUM) + end + else begin + `uvm_info("PRED_MBOX_SRAM", "Received mailbox SRAM transaction does not cause a system state change prediction", UVM_FULL) + end + + // Code for sending output transaction out through soc_ifc_sb_ap + // Please note that each broadcasted transaction should be a different object than previously + // broadcasted transactions. Creation of a different object is done by constructing the transaction + // using either new() or create(). Broadcasting a transaction object more than once to either the + // same subscriber or multiple subscribers will result in unexpected and incorrect behavior. + if (send_soc_ifc_sts_txn) begin + populate_expected_soc_ifc_status_txn(soc_ifc_sb_ap_output_transaction); + soc_ifc_sb_ap.write(soc_ifc_sb_ap_output_transaction); + `uvm_info("PRED_MBOX_SRAM", "Transaction submitted through soc_ifc_sb_ap", UVM_MEDIUM) + end + // Code for sending output transaction out through cptra_sb_ap + // Please note that each broadcasted transaction should be a different object than previously + // broadcasted transactions. Creation of a different object is done by constructing the transaction + // using either new() or create(). Broadcasting a transaction object more than once to either the + // same subscriber or multiple subscribers will result in unexpected and incorrect behavior. + if (send_cptra_sts_txn) begin + populate_expected_cptra_status_txn(cptra_sb_ap_output_transaction); + cptra_sb_ap.write(cptra_sb_ap_output_transaction); + `uvm_error("PRED_MBOX_SRAM", "NULL Transaction submitted through cptra_sb_ap") + end + // Code for sending output transaction out through soc_ifc_sb_ahb_ap + // Please note that each broadcasted transaction should be a different object than previously + // broadcasted transactions. Creation of a different object is done by constructing the transaction + // using either new() or create(). Broadcasting a transaction object more than once to either the + // same subscriber or multiple subscribers will result in unexpected and incorrect behavior. + if (send_ahb_txn) begin + soc_ifc_sb_ahb_ap.write(soc_ifc_sb_ahb_ap_output_transaction); + `uvm_error("PRED_MBOX_SRAM", "NULL Transaction submitted through soc_ifc_sb_ahb_ap") + end + // Code for sending output transaction out through soc_ifc_sb_apb_ap + // Please note that each broadcasted transaction should be a different object than previously + // broadcasted transactions. Creation of a different object is done by constructing the transaction + // using either new() or create(). Broadcasting a transaction object more than once to either the + // same subscriber or multiple subscribers will result in unexpected and incorrect behavior. + if (send_apb_txn) begin + soc_ifc_sb_apb_ap.write(soc_ifc_sb_apb_ap_output_transaction); + `uvm_error("PRED_MBOX_SRAM", "NULL Transaction submitted through soc_ifc_sb_apb_ap") + end + // pragma uvmf custom mbox_sram_agent_ae_predictor end + endfunction + // FUNCTION: write_ahb_slave_0_ae // Transactions received through ahb_slave_0_ae initiate the execution of this function. // This function performs prediction of DUT output values based on DUT input, configuration and state @@ -503,10 +671,14 @@ class soc_ifc_predictor #( bit send_cptra_sts_txn = 0; bit send_ahb_txn = 1; bit send_apb_txn = 0; + bit wdt_cascade = 0; + bit wdt_independent = 0; + bit wdt_t1_timeout = 0; + bit wdt_t2_timeout = 0; ahb_slave_0_ae_debug = t; `uvm_info("PRED_AHB", "Transaction Received through ahb_slave_0_ae", UVM_MEDIUM) - `uvm_info("PRED_AHB", {" Data: ",t.convert2string()}, UVM_FULL) + `uvm_info("PRED_AHB", {" Data: ",t.convert2string()}, UVM_HIGH) // Construct one of each output transaction type. soc_ifc_sb_ap_output_transaction = soc_ifc_sb_ap_output_transaction_t::type_id::create("soc_ifc_sb_ap_output_transaction"); @@ -539,13 +711,30 @@ class soc_ifc_predictor #( if (!configuration.enable_reg_prediction) begin do_reg_prediction = 1'b0; end + else if (rdc_clk_gate_active || noncore_rst_out_asserted) begin + do_reg_prediction = 1'b0; + if (ahb_txn.RnW == AHB_READ) + soc_ifc_sb_ahb_ap_output_transaction.data[0] = 0; + end else if (axs_mem != null) begin do_reg_prediction = 1'b0; end else if (axs_reg != null) begin // Mailbox accesses are discarded based on valid_requester/valid_receiver case (axs_reg.get_name()) inside - "mbox_lock", + "mbox_lock": begin + if (ahb_txn.RnW == AHB_READ && ahb_txn.resp[0] != AHB_OKAY) begin + do_reg_prediction = 1'b0; + // "Expected" read data is 0 + soc_ifc_sb_ahb_ap_output_transaction.data[0] = 0; + // Complete any scheduled predictions to 0 (due to other delay jobs) + if (p_soc_ifc_rm.mbox_csr_rm.mbox_lock_clr_miss.is_on()) begin + p_soc_ifc_rm.mbox_csr_rm.mbox_lock.lock.predict(0); + `uvm_info("PRED_AHB", "Completed mbox_lock deassert prediction (scheduled by mbox_execute) since mbox_lock reg prediction is disabled, due to failed AHB transfer", UVM_MEDIUM) + p_soc_ifc_rm.mbox_csr_rm.mbox_lock_clr_miss.reset(0); + end + end + end "mbox_user": begin if (ahb_txn.RnW == AHB_READ && ahb_txn.resp[0] != AHB_OKAY) begin do_reg_prediction = 1'b0; @@ -599,6 +788,14 @@ class soc_ifc_predictor #( // "Expected" read data for scoreboard is current // mirrored value prior to running do_predict soc_ifc_sb_ahb_ap_output_transaction.data[0] = axs_reg.get_mirrored_value() << 8*(address_aligned % (ahb_lite_slave_0_params::AHB_WDATA_WIDTH/8)); + // ... unless it's an ECC double bit error, just use the + // observed data to avoid a scoreboard error (since the + // mismatch is anticipated) + if (dataout_mismatch_expected) begin + `uvm_info("PRED_AHB", "Ignoring mbox_dataout predicted contents and using observed AHB data due to prior ECC double bit flip", UVM_HIGH) + dataout_mismatch_expected = 1'b0; + soc_ifc_sb_ahb_ap_output_transaction.data[0] = ahb_txn.data[0]; + end dataout_count++; end else begin @@ -614,13 +811,58 @@ class soc_ifc_predictor #( if (ahb_txn.RnW == AHB_WRITE) begin if (!valid_receiver(ahb_txn) || ahb_txn.resp[0] != AHB_OKAY) begin do_reg_prediction = 1'b0; - `uvm_warning("PRED_AHB", $sformatf("Write to mbox_status in state [%p] is unexpected! mbox_lock.lock: %0d, soc_has_lock: %0d, valid_receiver: %0d", - p_soc_ifc_rm.mbox_csr_rm.mbox_fn_state_sigs, - p_soc_ifc_rm.mbox_csr_rm.mbox_lock.lock.get_mirrored_value(), - p_soc_ifc_rm.mbox_csr_rm.mbox_status.soc_has_lock.get_mirrored_value(), - valid_receiver(ahb_txn))) + // NOTE: This might happen if a force-unlock is in progress when the mbox_status write is initiated + `uvm_info("PRED_AHB", + $sformatf("Write to mbox_status in state [%p] is unexpected! mbox_lock.lock: %0d, soc_has_lock: %0d, valid_receiver: %0d", + p_soc_ifc_rm.mbox_csr_rm.mbox_fn_state_sigs, + p_soc_ifc_rm.mbox_csr_rm.mbox_lock.lock.get_mirrored_value(), + p_soc_ifc_rm.mbox_csr_rm.mbox_status.soc_has_lock.get_mirrored_value(), + valid_receiver(ahb_txn)), + UVM_LOW) + end + end + else begin + if (ahb_txn.resp[0] != AHB_OKAY) begin + do_reg_prediction = 1'b0; + // "Expected" read data is 0 + soc_ifc_sb_ahb_ap_output_transaction.data[0] = 0; + end + end + end + //SHA Accelerator Functions + "LOCK", + "USER": begin + if (ahb_txn.RnW == AHB_READ && ahb_txn.resp[0] != AHB_OKAY) begin + do_reg_prediction = 1'b0; + // "Expected" read data is 0 + soc_ifc_sb_ahb_ap_output_transaction.data[0] = 0; + end + end + "MODE", + "START_ADDRESS", + "DLEN": begin + if (ahb_txn.RnW == AHB_WRITE) begin + do_reg_prediction = sha_valid_user(ahb_txn) && (ahb_txn.resp[0] == AHB_OKAY); + end + else begin + if (ahb_txn.resp[0] != AHB_OKAY) begin + do_reg_prediction = 1'b0; + // "Expected" read data is 0 + soc_ifc_sb_ahb_ap_output_transaction.data[0] = 0; end end + end + "DATAIN": begin + if (ahb_txn.resp[0] != AHB_OKAY) begin + do_reg_prediction = 1'b0; + // "Expected" read data is 0 + soc_ifc_sb_ahb_ap_output_transaction.data[0] = 0; + end + end + "EXECUTE": begin + if (ahb_txn.RnW == AHB_WRITE) begin + do_reg_prediction = sha_valid_user(ahb_txn) && (ahb_txn.resp[0] == AHB_OKAY); + end else begin if (ahb_txn.resp[0] != AHB_OKAY) begin do_reg_prediction = 1'b0; @@ -629,6 +871,17 @@ class soc_ifc_predictor #( end end end + "STATUS", + ["DIGEST[0]":"DIGEST[9]"], + ["DIGEST[10]":"DIGEST[15]"]: begin + if (ahb_txn.resp[0] != AHB_OKAY) begin + do_reg_prediction = 1'b0; + // "Expected" read data is 0 + soc_ifc_sb_ahb_ap_output_transaction.data[0] = 0; + end + end + "CONTROL": begin + end default: begin `uvm_info("PRED_AHB", {"Enable reg prediction on access to ", axs_reg.get_name()}, UVM_FULL) end @@ -642,7 +895,10 @@ class soc_ifc_predictor #( end // Calculate any other system effects from the register access - if (axs_mem != null) begin: MEM_AXS + if (rdc_clk_gate_active || noncore_rst_out_asserted) begin + `uvm_info("PRED_AHB", {"On access to register: ", axs_reg.get_full_name(), " reset is asserted, skipping system prediction"}, UVM_MEDIUM) + end + else if (axs_mem != null) begin: MEM_AXS `uvm_info("PRED_AHB", $sformatf("Not performing any system prediction for access to mailbox at address: 0x%x", ahb_txn.address), UVM_FULL) end// MEM_AXS else if (axs_reg != null) begin: REG_AXS @@ -666,9 +922,15 @@ class soc_ifc_predictor #( // Reset counters at beginning of command datain_count = 0; dataout_count = 0; + // Log the step for coverage + next_step = '{lock_acquire: 1'b1, default: 1'b0}; + `uvm_info("PRED_AHB", $sformatf("Logged mailbox step [%p]", next_step), UVM_HIGH) end else begin `uvm_info("PRED_AHB", $sformatf("Access to mbox_lock of type %p has no effect", ahb_txn.RnW), UVM_MEDIUM) + // Log the step for coverage + next_step = '{null_action: 1'b1, default: 1'b0}; + `uvm_info("PRED_AHB", $sformatf("Logged mailbox step [%p]", next_step), UVM_HIGH) end end "mbox_user": begin @@ -678,67 +940,194 @@ class soc_ifc_predictor #( else begin `uvm_info("PRED_AHB", {"Read to ", axs_reg.get_name(), " has no effect on system"}, UVM_MEDIUM) end + // Log the step for coverage + next_step = '{null_action: 1'b1, default: 1'b0}; + `uvm_info("PRED_AHB", $sformatf("Logged mailbox step [%p]", next_step), UVM_HIGH) + end + "mbox_cmd": begin + if (ahb_txn.RnW == AHB_WRITE && do_reg_prediction) begin + // Log the step for coverage + next_step = '{cmd_wr: 1'b1, default: 1'b0}; + `uvm_info("PRED_AHB", $sformatf("Logged mailbox step [%p]", next_step), UVM_HIGH) + end + else if (ahb_txn.RnW == AHB_READ && p_soc_ifc_rm.mbox_csr_rm.mbox_fn_state_sigs.uc_receive_stage) begin + // Log the step for coverage + next_step = '{cmd_rd: 1'b1, default: 1'b0}; + `uvm_info("PRED_AHB", $sformatf("Logged mailbox step [%p]", next_step), UVM_HIGH) + end + else begin + // Log the step for coverage + next_step = '{null_action: 1'b1, default: 1'b0}; + `uvm_info("PRED_AHB", $sformatf("Logged mailbox step [%p]", next_step), UVM_HIGH) + end end - "mbox_cmd", "mbox_dlen": begin - `uvm_info("PRED_AHB", "Nothing to do", UVM_DEBUG) + if (ahb_txn.RnW == AHB_WRITE && do_reg_prediction) begin + // Log the step for coverage + if (p_soc_ifc_rm.mbox_csr_rm.mbox_fn_state_sigs.uc_dlen_stage) + next_step = '{dlen_wr: 1'b1, default: 1'b0}; + else if (p_soc_ifc_rm.mbox_csr_rm.mbox_fn_state_sigs.uc_receive_stage) + next_step = '{resp_dlen_wr: 1'b1, default: 1'b0}; + `uvm_info("PRED_AHB", $sformatf("Logged mailbox step [%p]", next_step), UVM_HIGH) + end + else if (ahb_txn.RnW == AHB_READ && p_soc_ifc_rm.mbox_csr_rm.mbox_fn_state_sigs.uc_receive_stage) begin + // Log the step for coverage + next_step = '{dlen_rd: 1'b1, default: 1'b0}; + `uvm_info("PRED_AHB", $sformatf("Logged mailbox step [%p]", next_step), UVM_HIGH) + end + else begin + // Log the step for coverage + next_step = '{null_action: 1'b1, default: 1'b0}; + `uvm_info("PRED_AHB", $sformatf("Logged mailbox step [%p]", next_step), UVM_HIGH) + end end "mbox_datain": begin `uvm_info("PRED_AHB", $sformatf("Access to mailbox datain, write count: %d", datain_count), UVM_FULL) + if (ahb_txn.RnW == AHB_WRITE && do_reg_prediction) begin + // Log the step for coverage + if (p_soc_ifc_rm.mbox_csr_rm.mbox_fn_state_sigs.uc_data_stage) + next_step = '{datain_wr: 1'b1, default: 1'b0}; + else if (p_soc_ifc_rm.mbox_csr_rm.mbox_fn_state_sigs.uc_receive_stage) + next_step = '{resp_datain_wr: 1'b1, default: 1'b0}; + else + next_step = '{null_action: 1'b1, default: 1'b0}; + `uvm_info("PRED_AHB", $sformatf("Logged mailbox step [%p]", next_step), UVM_HIGH) + end + else begin + // Log the step for coverage + next_step = '{null_action: 1'b1, default: 1'b0}; + `uvm_info("PRED_AHB", $sformatf("Logged mailbox step [%p]", next_step), UVM_HIGH) + end end "mbox_dataout": begin `uvm_info("PRED_AHB", $sformatf("Access to mailbox dataout, read count: %d", dataout_count), UVM_FULL) + // Log the step for coverage + next_step = '{null_action: 1'b1, default: 1'b0}; + if (ahb_txn.RnW == AHB_READ && do_reg_prediction) begin + // Log the step for coverage + if (p_soc_ifc_rm.mbox_csr_rm.mbox_fn_state_sigs.uc_receive_stage) begin + next_step = '{dataout_rd: 1'b1, default: 1'b0}; + end + end + `uvm_info("PRED_AHB", $sformatf("Logged mailbox step [%p]", next_step), UVM_HIGH) end "mbox_execute": begin - // Expect a status transition on mailbox_data_avail - // whenever an AHB write changes the value of mbox_execute - if (mailbox_data_avail ^ p_soc_ifc_rm.mbox_csr_rm.mbox_execute.execute.get_mirrored_value()) begin - `uvm_info("PRED_AHB", "Write to mbox_execute triggers mailbox_data_avail transition", UVM_LOW) - send_soc_ifc_sts_txn = 1'b1; - mailbox_data_avail = p_soc_ifc_rm.mbox_csr_rm.mbox_execute.execute.get_mirrored_value(); + // Log the step for coverage + next_step = '{null_action: 1'b1, default: 1'b0}; + if (ahb_txn.RnW == AHB_WRITE && do_reg_prediction) begin + // Log the step for coverage + if (p_soc_ifc_rm.mbox_csr_rm.mbox_fn_state_sigs.uc_data_stage && p_soc_ifc_rm.mbox_csr_rm.mbox_execute.execute.get_mirrored_value()) begin + next_step = '{exec_set: 1'b1, default: 1'b0}; + end + else if (p_soc_ifc_rm.mbox_csr_rm.mbox_fn_state_sigs.uc_done_stage && !p_soc_ifc_rm.mbox_csr_rm.mbox_execute.execute.get_mirrored_value()) begin + next_step = '{exec_clr: 1'b1, default: 1'b0}; + end end + `uvm_info("PRED_AHB", $sformatf("Logged mailbox step [%p]", next_step), UVM_HIGH) end "mbox_status": begin - // Write to mbox_status hands control back to SOC - if (ahb_txn.RnW == AHB_WRITE && !mailbox_data_avail && p_soc_ifc_rm.mbox_csr_rm.mbox_fn_state_sigs.soc_done_stage) begin - mailbox_data_avail = 1'b1; - send_soc_ifc_sts_txn = 1'b1; + if (ahb_txn.RnW == AHB_WRITE && do_reg_prediction) begin + // Log the step for coverage + next_step = '{status_wr: 1'b1, default: 1'b0}; + `uvm_info("PRED_AHB", $sformatf("Logged mailbox step [%p]", next_step), UVM_HIGH) + end + else if (ahb_txn.RnW == AHB_READ && do_reg_prediction) begin + // Log the step for coverage + next_step = '{status_rd: 1'b1, default: 1'b0}; + `uvm_info("PRED_AHB", $sformatf("Logged mailbox step [%p]", next_step), UVM_HIGH) + end + else begin + // Log the step for coverage + next_step = '{null_action: 1'b1, default: 1'b0}; + `uvm_info("PRED_AHB", $sformatf("Logged mailbox step [%p]", next_step), UVM_HIGH) end end "mbox_unlock": begin - // Reg prediction handled in callback - `uvm_info("PRED_AHB", $sformatf("Handling access to %s.", axs_reg.get_name()), UVM_HIGH) - if (data_active[p_soc_ifc_rm.mbox_csr_rm.mbox_unlock.unlock.get_lsb_pos()]) begin -// NOTE: This is all delayed now... -// if (p_soc_ifc_rm.mbox_csr_rm.mbox_lock.lock.get_mirrored_value()) begin -// `uvm_error("PRED_AHB", "Write to mbox_unlock with value 1 failed to update the predicted value on mbox_lock of 0!") -// end -// if (p_soc_ifc_rm.mbox_csr_rm.mbox_execute.execute.get_mirrored_value()) begin -// `uvm_error("PRED_AHB", "Write to mbox_unlock with value 1 failed to update the predicted value on mbox_execute of 0!") -// end -// if (!p_soc_ifc_rm.mbox_csr_rm.mbox_fn_state_sigs.mbox_idle) begin -// `uvm_error("PRED_AHB", "Write to mbox_unlock with value 1 failed to update the predicted value on state signals back to mbox_idle!") -// end - // Force unlock will reset mailbox_data_avail, if set, but - // will not reset any pending interrupts to uC because those - // are sticky - if (mailbox_data_avail) begin - `uvm_info("PRED_AHB", $sformatf("Resetting mailbox_data_avail"), UVM_MEDIUM) - mailbox_data_avail = 1'b0; - send_soc_ifc_sts_txn = 1'b1; - end + if (ahb_txn.RnW == AHB_WRITE && do_reg_prediction && p_soc_ifc_rm.mbox_csr_rm.mbox_unlock.unlock.get_mirrored_value()) begin + // Log the step for coverage + next_step = '{force_unlock: 1'b1, default: 1'b0}; + `uvm_info("PRED_AHB", $sformatf("Logged mailbox step [%p]", next_step), UVM_HIGH) + end + else begin + // Log the step for coverage + next_step = '{null_action: 1'b1, default: 1'b0}; + `uvm_info("PRED_AHB", $sformatf("Logged mailbox step [%p]", next_step), UVM_HIGH) end end //SHA Accelerator Functions - "EXECUTE": begin - // Expect a status transition on sha_notif_intr_pending - // whenever an AHB write changes the value of SHA Accelerator Execute - if (sha_notif_intr_pending ^ p_soc_ifc_rm.sha512_acc_csr_rm.EXECUTE.EXECUTE.get_mirrored_value()) begin - `uvm_info("PRED_AHB", "Write to SHA512 Accel Execute triggers soc_ifc_notif_intr_pending transition", UVM_LOW) - send_cptra_sts_txn = 1'b1; - sha_notif_intr_pending = p_soc_ifc_rm.sha512_acc_csr_rm.EXECUTE.EXECUTE.get_mirrored_value(); + "LOCK": begin + // Reading sha_lock when it is already locked has no effect, so + // only calculate predictions on acquiring lock (rdata == 0) + // which requires that the AHB transfer was successful in + // performing the access + if (~data_active[p_soc_ifc_rm.sha512_acc_csr_rm.LOCK.LOCK.get_lsb_pos()] && + p_soc_ifc_rm.sha512_acc_csr_rm.LOCK.LOCK.get_mirrored_value() && + do_reg_prediction) + begin + // Cannot put this inside the reg callback because the post_predict + // method has no way to access the addr_user value + `uvm_info("PRED_AHB", $sformatf("Predicting new value [0x%x] for sha_user as AHB agent acquires lock",p_soc_ifc_rm.sha512_acc_csr_rm.USER.get_reset("HARD")), UVM_HIGH) + p_soc_ifc_rm.sha512_acc_csr_rm.USER.predict(p_soc_ifc_rm.sha512_acc_csr_rm.USER.get_reset("HARD")); + end + else begin + `uvm_info("PRED_AHB", $sformatf("Access to sha_lock of type %p has no effect", ahb_txn.RnW), UVM_MEDIUM) + end + end + "USER": begin + if (ahb_txn.RnW == AHB_WRITE) begin + `uvm_warning("PRED_AHB", {"Write to RO register: ", axs_reg.get_name(), " has no effect on system"}) + end + else begin + `uvm_info("PRED_AHB", {"Read to ", axs_reg.get_name(), " has no effect on system"}, UVM_MEDIUM) + end + end + "MODE", + "START_ADDRESS", + "DLEN", + "DATAIN", + "EXECUTE", + "STATUS", + ["DIGEST[0]":"DIGEST[9]"], + ["DIGEST[10]":"DIGEST[15]"], + "CONTROL": begin + `uvm_info("PRED_AHB", $sformatf("Handling access to %s. Nothing to do.", axs_reg.get_name()), UVM_FULL) + end + "CPTRA_HW_ERROR_FATAL": begin + if (ahb_txn.RnW == AHB_WRITE && |data_active && (p_soc_ifc_rm.soc_ifc_reg_rm.CPTRA_HW_ERROR_FATAL.get_mirrored_value() == 0)) begin + `uvm_info("PRED_AHB", $sformatf("Write to %s results in all bits cleared, but has no effect on cptra_error_fatal (requires reset)", axs_reg.get_name()), UVM_MEDIUM) + end + end + "CPTRA_HW_ERROR_NON_FATAL": begin + if (p_soc_ifc_rm.soc_ifc_reg_rm.CPTRA_HW_ERROR_NON_FATAL.get_mirrored_value() == 0) begin + cptra_error_non_fatal = 1'b0; + end + end + "CPTRA_FW_ERROR_FATAL": begin + if (ahb_txn.RnW == AHB_WRITE && |(data_active && ~p_soc_ifc_rm.soc_ifc_reg_rm.CPTRA_FW_ERROR_FATAL.get_mirrored_value())) begin + `uvm_info("PRED_AHB", $sformatf("Write to %s set a new bit, trigger cptra_error_fatal interrupt", axs_reg.get_name()), UVM_MEDIUM) + cptra_error_fatal = 1'b1; + send_soc_ifc_sts_txn = 1'b1; + end + if (ahb_txn.RnW == AHB_WRITE && |data_active && (p_soc_ifc_rm.soc_ifc_reg_rm.CPTRA_FW_ERROR_FATAL.get_mirrored_value() == 0)) begin + `uvm_info("PRED_AHB", $sformatf("Write to %s results in all bits cleared, but has no effect on cptra_error_fatal (requires reset)", axs_reg.get_name()), UVM_MEDIUM) + end + end + "CPTRA_FW_ERROR_NON_FATAL": begin + if (p_soc_ifc_rm.soc_ifc_reg_rm.CPTRA_FW_ERROR_NON_FATAL.get_mirrored_value() == 0) begin + cptra_error_non_fatal = 1'b0; + end + end + "CPTRA_HW_ERROR_ENC", + "CPTRA_FW_ERROR_ENC", + ["CPTRA_FW_EXTENDED_ERROR_INFO[0]":"CPTRA_FW_EXTENDED_ERROR_INFO[7]"]: begin + if (ahb_txn.RnW == AHB_WRITE) begin + `uvm_error("PRED_AHB", {"Add prediction for write to ",axs_reg.get_name()," register on AHB interface"}) // TODO end end + "CPTRA_BOOT_STATUS": begin + // Handled in callbacks via reg predictor + `uvm_info("PRED_AHB", $sformatf("Handling access to %s. Nothing to do.", axs_reg.get_name()), UVM_DEBUG) + end "CPTRA_FLOW_STATUS": begin if (ahb_txn.RnW == AHB_WRITE && ((p_soc_ifc_rm.soc_ifc_reg_rm.CPTRA_FLOW_STATUS.ready_for_fw.get_mirrored_value() != this.ready_for_fw_push) || @@ -753,14 +1142,41 @@ class soc_ifc_predictor #( send_soc_ifc_sts_txn = 1'b0; end end - "CPTRA_RESET_REASON": begin + "CPTRA_RESET_REASON", + "CPTRA_SECURITY_STATE": begin if (ahb_txn.RnW == AHB_WRITE) `uvm_info("PRED_AHB", {"Write to ", axs_reg.get_name(), " has no effect"}, UVM_DEBUG) end + ["CPTRA_MBOX_VALID_PAUSER[0]":"CPTRA_MBOX_VALID_PAUSER[4]"]: begin + int idx = axs_reg.get_offset(p_soc_ifc_AHB_map) - p_soc_ifc_rm.soc_ifc_reg_rm.CPTRA_MBOX_VALID_PAUSER[0].get_offset(p_soc_ifc_AHB_map); + idx /= 4; + if (mbox_valid_users_locked[idx] && ahb_txn.RnW == AHB_WRITE) begin + `uvm_error("PRED_AHB", {"Write attempted to locked register: ", axs_reg.get_name()}) + end + else if (ahb_txn.RnW == AHB_WRITE) begin + `uvm_info("PRED_AHB", {"Write to ", axs_reg.get_name(), " has no effect on system until locked"}, UVM_MEDIUM) + end + end + ["CPTRA_MBOX_PAUSER_LOCK[0]":"CPTRA_MBOX_PAUSER_LOCK[4]"]: begin + int idx = axs_reg.get_offset(p_soc_ifc_AHB_map) - p_soc_ifc_rm.soc_ifc_reg_rm.CPTRA_MBOX_PAUSER_LOCK[0].get_offset(p_soc_ifc_AHB_map); + idx /= 4; + if (mbox_valid_users_locked[idx] && ahb_txn.RnW == AHB_WRITE) begin + `uvm_error("PRED_AHB", {"Write attempted to locked register: ", axs_reg.get_name()}) + end + else if (ahb_txn.RnW == AHB_WRITE) begin + mbox_valid_users[idx] = p_soc_ifc_rm.soc_ifc_reg_rm.CPTRA_MBOX_VALID_PAUSER[idx].get_mirrored_value(); // VALID_PAUSER field is only applied when locked + mbox_valid_users_locked[idx] |= data_active[p_soc_ifc_rm.soc_ifc_reg_rm.CPTRA_MBOX_PAUSER_LOCK[idx].LOCK.get_lsb_pos()]; + `uvm_info("PRED_AHB", $sformatf("mbox_valid_users_locked[%d] set to 0x%x, mbox_valid_users[%d] has value: 0x%x", idx, mbox_valid_users_locked[idx], idx, mbox_valid_users[idx]), UVM_MEDIUM) + end + else begin + `uvm_info("PRED_AHB", $sformatf("mbox_valid_users_locked[%d] read value 0x%x, mbox_valid_users[%d] has value: 0x%x", idx, mbox_valid_users_locked[idx], idx, mbox_valid_users[idx]), UVM_HIGH) + end + end "CPTRA_TRNG_VALID_PAUSER", "CPTRA_TRNG_PAUSER_LOCK", ["CPTRA_TRNG_DATA[0]" : "CPTRA_TRNG_DATA[9]"], - ["CPTRA_TRNG_DATA[10]" : "CPTRA_TRNG_DATA[11]"]: begin + ["CPTRA_TRNG_DATA[10]" : "CPTRA_TRNG_DATA[11]"], + "CPTRA_TRNG_CTRL": begin // Handled in callbacks via reg predictor `uvm_info("PRED_AHB", $sformatf("Handling access to %s. Nothing to do.", axs_reg.get_name()), UVM_DEBUG) end @@ -775,8 +1191,26 @@ class soc_ifc_predictor #( send_soc_ifc_sts_txn = 1'b0; end end - "CPTRA_FUSE_WR_DONE": begin - `uvm_error("PRED_AHB", "Unexpected write to CPTRA_FUSE_WR_DONE register on AHB interface") + "CPTRA_FUSE_WR_DONE", + "CPTRA_TIMER_CONFIG", + "CPTRA_BOOTFSM_GO": begin + if (ahb_txn.RnW == AHB_WRITE) begin + `uvm_error("PRED_AHB", $sformatf("Unexpected write to %s register on AHB interface", axs_reg.get_name())) + end + end + "CPTRA_DBG_MANUF_SERVICE_REG": begin + `uvm_info("PRED_AHB", $sformatf("Handling access to %s. Nothing to do.", axs_reg.get_name()), UVM_DEBUG) + end + "CPTRA_CLK_GATING_EN": begin + if (ahb_txn.RnW == AHB_WRITE) begin + `uvm_error("PRED_AHB", $sformatf("Unexpected write to %s register on AHB interface", axs_reg.get_name())) + end + end + "CPTRA_GENERIC_INPUT_WIRES[0]", + "CPTRA_GENERIC_INPUT_WIRES[1]": begin + if (ahb_txn.RnW == AHB_WRITE) begin + `uvm_info("PRED_AHB", $sformatf("Write to %s register on AHB interface has no effect", axs_reg.get_name()), UVM_LOW) + end end "CPTRA_GENERIC_OUTPUT_WIRES[0]": begin if (ahb_txn.RnW == AHB_WRITE) begin @@ -798,9 +1232,9 @@ class soc_ifc_predictor #( 32'hfc: `uvm_info("PRED_AHB", "Observed write to CPTRA_GENERIC_OUTPUT_WIRES [Clear the isr_active bit]", UVM_MEDIUM) 32'hfd: - `uvm_info("PRED_AHB", "Observed write to CPTRA_GENERIC_OUTPUT_WIRES [Toggle random SRAM single bit error injection]", UVM_MEDIUM) + `uvm_info("PRED_AHB", "Observed write to CPTRA_GENERIC_OUTPUT_WIRES [Toggle random SRAM single bit flip injection]", UVM_MEDIUM) 32'hfe: - `uvm_info("PRED_AHB", "Observed write to CPTRA_GENERIC_OUTPUT_WIRES [Toggle random SRAM double bit error injection]", UVM_MEDIUM) + `uvm_info("PRED_AHB", "Observed write to CPTRA_GENERIC_OUTPUT_WIRES [Toggle random SRAM double bit flip injection]", UVM_MEDIUM) 32'hff: `uvm_info("PRED_AHB", "Observed write to CPTRA_GENERIC_OUTPUT_WIRES to End the simulation with a Success status", UVM_LOW) endcase @@ -808,15 +1242,143 @@ class soc_ifc_predictor #( generic_output_wires = {generic_output_wires[63:32],data_active}; // FIXME for data width? end end + "CPTRA_GENERIC_OUTPUT_WIRES[1]": begin + if (ahb_txn.RnW == AHB_WRITE) begin + send_soc_ifc_sts_txn = data_active != generic_output_wires[63:32]; + generic_output_wires = {data_active,generic_output_wires[31:0]}; // FIXME for data width? + end + end + "CPTRA_HW_REV_ID": begin + if (ahb_txn.RnW == AHB_WRITE) begin + `uvm_warning("PRED_AHB", {"Write to RO register: ", axs_reg.get_name(), " has no effect on system"}) + end + else begin + `uvm_info("PRED_AHB", {"Read to ", axs_reg.get_name(), " has no effect on system"}, UVM_MEDIUM) + end + end + "CPTRA_FW_REV_ID[0]", + "CPTRA_FW_REV_ID[1]": begin + `uvm_info("PRED_AHB", {"Access to ", axs_reg.get_name(), " has no effect on system"}, UVM_MEDIUM) + end + "CPTRA_HW_CONFIG": begin + if (ahb_txn.RnW == AHB_WRITE) begin + `uvm_warning("PRED_AHB", {"Write to RO register: ", axs_reg.get_name(), " has no effect on system"}) + end + else begin + `uvm_info("PRED_AHB", {"Read to ", axs_reg.get_name(), " has no effect on system"}, UVM_MEDIUM) + end + end + "CPTRA_WDT_TIMER1_EN": begin + if (ahb_txn.RnW == AHB_WRITE) begin + `uvm_info("PRED_AHB", {"Detected write to ", axs_reg.get_name()," register on AHB interface, starting WDT timer1"}, UVM_MEDIUM); + end + end + "CPTRA_WDT_TIMER1_CTRL": begin + if (ahb_txn.RnW == AHB_WRITE && data_active[p_soc_ifc_rm.soc_ifc_reg_rm.CPTRA_WDT_TIMER1_CTRL.timer1_restart.get_lsb_pos()]) begin + `uvm_info("PRED_AHB", $sformatf("Handling access to %s. This will restart WDT timer1 after 1 clock cycle", axs_reg.get_name()), UVM_MEDIUM); + fork + begin + configuration.soc_ifc_ctrl_agent_config.wait_for_num_clocks(1); + //Capture restart bit so the counters can be updated + wdt_t1_restart = 1; + `uvm_info("PRED_AHB", $sformatf("After delay from access to %s - restart WDT timer1", axs_reg.get_name()), UVM_MEDIUM); + end + join_none + end + end + "CPTRA_WDT_TIMER1_TIMEOUT_PERIOD[0]", + "CPTRA_WDT_TIMER1_TIMEOUT_PERIOD[1]": begin + if (ahb_txn.RnW == AHB_WRITE) begin + `uvm_info("PRED_AHB", {"Write to ",axs_reg.get_name()," register on AHB interface has no side-effect"}, UVM_HIGH) // TODO + end + end + "CPTRA_WDT_TIMER2_EN": begin + if (ahb_txn.RnW == AHB_WRITE) begin + `uvm_info("PRED_AHB", {"Detected write to ", axs_reg.get_name(), " register on AHB interface, starting WDT timer2"}, UVM_MEDIUM); + end + end + "CPTRA_WDT_TIMER2_CTRL": begin + if (ahb_txn.RnW == AHB_WRITE && data_active[p_soc_ifc_rm.soc_ifc_reg_rm.CPTRA_WDT_TIMER2_CTRL.timer2_restart.get_lsb_pos()]) begin + `uvm_info("PRED_AHB", $sformatf("Handling access to %s. This will restart WDT timer2 after 1 clock cycle", axs_reg.get_name()), UVM_MEDIUM); + fork + begin + configuration.soc_ifc_ctrl_agent_config.wait_for_num_clocks(1); + //Capture restart bit so the counters can be updated + wdt_t2_restart = 1; + `uvm_info("PRED_AHB", $sformatf("After delay from access to %s - restart WDT timer2", axs_reg.get_name()), UVM_MEDIUM); + end + join_none + end + end + "CPTRA_WDT_TIMER2_TIMEOUT_PERIOD[0]", + "CPTRA_WDT_TIMER2_TIMEOUT_PERIOD[1]": begin + if (ahb_txn.RnW == AHB_WRITE) begin + `uvm_info("PRED_AHB", {"Write to ",axs_reg.get_name()," register on AHB interface has no side-effect"}, UVM_HIGH) // TODO + end + end + "CPTRA_WDT_STATUS": begin + `uvm_info("PRED_AHB", "AHB access of WDT status", UVM_MEDIUM); + end + "CPTRA_FUSE_VALID_PAUSER", + "CPTRA_FUSE_PAUSER_LOCK": begin + if (ahb_txn.RnW == AHB_WRITE) begin + `uvm_error("PRED_AHB", {"Add prediction for write to ",axs_reg.get_name()," register on AHB interface"}) // TODO + end + end + ["CPTRA_WDT_CFG[0]":"CPTRA_WDT_CFG[1]"], + "CPTRA_iTRNG_ENTROPY_CONFIG_0", + "CPTRA_iTRNG_ENTROPY_CONFIG_1", + ["CPTRA_RSVD_REG[0]":"CPTRA_RSVD_REG[1]"]: begin + `uvm_info("PRED_AHB", {"Access to ", axs_reg.get_name(), " has no effect on system"}, UVM_MEDIUM) + end + ["fuse_uds_seed[0]" :"fuse_uds_seed[9]" ], + ["fuse_uds_seed[10]":"fuse_uds_seed[11]"]: begin + if (fuse_update_enabled) begin + `uvm_error("PRED_AHB", {"Unexpected write to ", axs_reg.get_name(), " should not occur when fuse_update_enabled == 1!"}) + send_cptra_sts_txn = 1'b1; + end + end + ["fuse_field_entropy[0]" :"fuse_field_entropy[7]" ]: begin + if (fuse_update_enabled) begin + `uvm_error("PRED_AHB", {"Unexpected write to ", axs_reg.get_name(), " should not occur when fuse_update_enabled == 1!"}) + send_cptra_sts_txn = 1'b1; + end + end + ["fuse_key_manifest_pk_hash[0]" :"fuse_key_manifest_pk_hash[9]"], + ["fuse_key_manifest_pk_hash[10]":"fuse_key_manifest_pk_hash[11]"], + "fuse_key_manifest_pk_hash_mask", + ["fuse_owner_pk_hash[0]" :"fuse_owner_pk_hash[9]"], + ["fuse_owner_pk_hash[10]":"fuse_owner_pk_hash[11]"], + "fuse_fmc_key_manifest_svn", + ["fuse_runtime_svn[0]":"fuse_runtime_svn[3]"], + "fuse_anti_rollback_disable", + ["fuse_idevid_cert_attr[0]" :"fuse_idevid_cert_attr[9]"], + ["fuse_idevid_cert_attr[10]":"fuse_idevid_cert_attr[19]"], + ["fuse_idevid_cert_attr[20]":"fuse_idevid_cert_attr[23]"], + ["fuse_idevid_manuf_hsm_id[0]":"fuse_idevid_manuf_hsm_id[3]"], + "fuse_life_cycle", + "fuse_lms_verify", + "fuse_lms_revocation", + "fuse_soc_stepping_id", + ["internal_obf_key[0]":"internal_obf_key[7]"]: begin + // Handled in callbacks via reg predictor + `uvm_info("PRED_AHB", $sformatf("Handling access to fuse/key/secret register %s. Nothing to do.", axs_reg.get_name()), UVM_DEBUG) + end "internal_iccm_lock": begin if (ahb_txn.RnW == AHB_WRITE && !iccm_locked) begin iccm_locked = 1'b1; + `uvm_info("FW_RST_DEBUG", $sformatf("Write to set iccm lock, value is 0x%x", p_soc_ifc_rm.soc_ifc_reg_rm.internal_iccm_lock.lock.get_mirrored_value()), UVM_LOW) send_cptra_sts_txn = 1; end else if (ahb_txn.RnW == AHB_WRITE) begin `uvm_error("PRED_AHB", {"Unexpected write to ",axs_reg.get_name()," register on AHB interface"}) end end + "internal_fw_update_reset", + "internal_fw_update_reset_wait_cycles": begin + // Handled in callbacks via reg predictor + `uvm_info("PRED_AHB", $sformatf("Handling access to register %s. Nothing to do.", axs_reg.get_name()), UVM_DEBUG) + end "internal_nmi_vector": begin if (ahb_txn.RnW == AHB_WRITE) begin if (nmi_vector != data_active) begin @@ -825,26 +1387,65 @@ class soc_ifc_predictor #( end end end - default: begin - `uvm_warning("PRED_AHB", $sformatf("Prediction for accesses to register '%s' unimplemented! Fix soc_ifc_predictor", axs_reg.get_name())) + "internal_hw_error_fatal_mask", + "internal_hw_error_non_fatal_mask", + "internal_fw_error_fatal_mask", + "internal_fw_error_non_fatal_mask": begin + if (ahb_txn.RnW == AHB_WRITE) begin + `uvm_error("PRED_AHB", $sformatf("FIXME - need to add logic for error mask register %s", axs_reg.get_name())) // TODO + end + else begin + `uvm_info("PRED_AHB", {"Read from ", axs_reg.get_name(), " has no effect"}, UVM_DEBUG) + end end - endcase - end + "internal_rv_mtime_l", + "internal_rv_mtime_h", + "internal_rv_mtimecmp_l", + "internal_rv_mtimecmp_h": begin + if (ahb_txn.RnW == AHB_WRITE) begin + if (timer_intr_pending && mtime_lt_mtimecmp()) begin + `uvm_info("PRED_AHB", $sformatf("Write to %s causes immediate deassertion of timer interrupt", axs_reg.get_name()), UVM_HIGH) + timer_intr_pending = 0; +// send_cptra_sts_txn = 1; // No transaction captured on deassertion + end + else if (timer_intr_pending) begin + `uvm_info("PRED_AHB", $sformatf("Write to %s does not change the status of timer interrupt", axs_reg.get_name()), UVM_HIGH) + end + else if (!timer_intr_pending && mtime_lt_mtimecmp()) begin + `uvm_info("PRED_AHB", $sformatf("Write to %s does not change the status of timer interrupt", axs_reg.get_name()), UVM_HIGH) + end + else if (!timer_intr_pending && !mtime_lt_mtimecmp()) begin + `uvm_info("PRED_AHB", $sformatf("Write to %s causes immediate assertion of timer interrupt", axs_reg.get_name()), UVM_HIGH) + timer_intr_pending = 1; + send_cptra_sts_txn = 1; + end + end + else begin + `uvm_info("PRED_AHB", $sformatf("Read from %s does not change the status of timer interrupt", axs_reg.get_name()), UVM_FULL) + end + end + default: begin + `uvm_warning("PRED_AHB", $sformatf("Prediction for accesses to register '%s' unimplemented! Fix soc_ifc_predictor", axs_reg.get_name())) + end + endcase + end // Interrupt registers have 3-levels of ancestry back to reg_model top // 2-levels of ancestry back to unique parent else if (axs_reg.get_parent().get_parent().get_name() == "soc_ifc_reg_rm") begin case (axs_reg.get_name()) inside - "global_intr_en_r", + "global_intr_en_r": begin + if (ahb_txn.RnW == AHB_WRITE) begin + send_cptra_sts_txn = (!this.soc_ifc_error_intr_pending && p_soc_ifc_rm.soc_ifc_reg_rm.intr_block_rf_ext.error_global_intr_r.agg_sts.get_mirrored_value() && p_soc_ifc_rm.soc_ifc_reg_rm.intr_block_rf_ext.global_intr_en_r.error_en.get_mirrored_value()) || + (!this.soc_ifc_notif_intr_pending && p_soc_ifc_rm.soc_ifc_reg_rm.intr_block_rf_ext.notif_global_intr_r.agg_sts.get_mirrored_value() && p_soc_ifc_rm.soc_ifc_reg_rm.intr_block_rf_ext.global_intr_en_r.notif_en.get_mirrored_value()); + this.soc_ifc_error_intr_pending = p_soc_ifc_rm.soc_ifc_reg_rm.intr_block_rf_ext.error_global_intr_r.agg_sts.get_mirrored_value() && p_soc_ifc_rm.soc_ifc_reg_rm.intr_block_rf_ext.global_intr_en_r.error_en.get_mirrored_value(); + this.soc_ifc_notif_intr_pending = p_soc_ifc_rm.soc_ifc_reg_rm.intr_block_rf_ext.notif_global_intr_r.agg_sts.get_mirrored_value() && p_soc_ifc_rm.soc_ifc_reg_rm.intr_block_rf_ext.global_intr_en_r.notif_en.get_mirrored_value(); + end + end "error_intr_en_r", "notif_intr_en_r", "error_intr_trig_r", "notif_intr_trig_r": begin - if (ahb_txn.RnW == AHB_WRITE) begin - send_cptra_sts_txn = (!this.soc_ifc_error_intr_pending && p_soc_ifc_rm.soc_ifc_reg_rm.intr_block_rf_ext.error_global_intr_r.agg_sts.get_mirrored_value()) || - (!this.soc_ifc_notif_intr_pending && p_soc_ifc_rm.soc_ifc_reg_rm.intr_block_rf_ext.notif_global_intr_r.agg_sts.get_mirrored_value()); - this.soc_ifc_error_intr_pending = p_soc_ifc_rm.soc_ifc_reg_rm.intr_block_rf_ext.error_global_intr_r.agg_sts.get_mirrored_value(); - this.soc_ifc_notif_intr_pending = p_soc_ifc_rm.soc_ifc_reg_rm.intr_block_rf_ext.notif_global_intr_r.agg_sts.get_mirrored_value(); - end + `uvm_info("PRED_AHB", $sformatf("Write to %s handled in callback", axs_reg.get_name()), UVM_DEBUG) end "error_global_intr_r", "notif_global_intr_r": begin @@ -859,8 +1460,32 @@ class soc_ifc_predictor #( // but this does not result in a cptra status transaction because we only // capture rising edges as a transaction `uvm_info("PRED_AHB", {"Write to ", axs_reg.get_name(), " attempts to clear an interrupt"}, UVM_HIGH) - this.soc_ifc_error_intr_pending = p_soc_ifc_rm.soc_ifc_reg_rm.intr_block_rf_ext.error_global_intr_r.agg_sts.get_mirrored_value(); - this.soc_ifc_notif_intr_pending = p_soc_ifc_rm.soc_ifc_reg_rm.intr_block_rf_ext.notif_global_intr_r.agg_sts.get_mirrored_value(); + + //If the WDT timeout interrupt bits are being cleared, also reset the t1/t2 count values and the corresponding + //interrupt flags (used in wdt_counter_task) + wdt_cascade = (p_soc_ifc_rm.soc_ifc_reg_rm.CPTRA_WDT_TIMER1_EN.timer1_en.get_mirrored_value() && !(p_soc_ifc_rm.soc_ifc_reg_rm.CPTRA_WDT_TIMER2_EN.timer2_en.get_mirrored_value())); + wdt_independent = p_soc_ifc_rm.soc_ifc_reg_rm.CPTRA_WDT_TIMER2_EN.timer2_en.get_mirrored_value(); + wdt_t1_timeout = (this.t1_count == {p_soc_ifc_rm.soc_ifc_reg_rm.CPTRA_WDT_TIMER1_TIMEOUT_PERIOD[1].timer1_timeout_period.get_mirrored_value(), p_soc_ifc_rm.soc_ifc_reg_rm.CPTRA_WDT_TIMER1_TIMEOUT_PERIOD[0].timer1_timeout_period.get_mirrored_value()}); + wdt_t2_timeout = (this.t2_count == {p_soc_ifc_rm.soc_ifc_reg_rm.CPTRA_WDT_TIMER2_TIMEOUT_PERIOD[1].timer2_timeout_period.get_mirrored_value(), p_soc_ifc_rm.soc_ifc_reg_rm.CPTRA_WDT_TIMER2_TIMEOUT_PERIOD[0].timer2_timeout_period.get_mirrored_value()}); + + if (wdt_cascade && wdt_t1_timeout && data_active[`SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_WDT_TIMER1_TIMEOUT_STS_LOW]) begin + this.t1_count = 'h0; + this.t2_count = 'h0; + this.wdt_error_intr_sent = 1'b0; + end + else if (wdt_independent) begin + if (data_active[`SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_WDT_TIMER1_TIMEOUT_STS_LOW]) begin + if (wdt_t1_timeout) + this.t1_count = 'h0; + this.wdt_error_intr_sent = 1'b0; + end + if (data_active[`SOC_IFC_REG_INTR_BLOCK_RF_ERROR_INTERNAL_INTR_R_ERROR_WDT_TIMER2_TIMEOUT_STS_LOW]) begin + if (wdt_t2_timeout) + this.t2_count = 'h0; + this.wdt_t2_error_intr_sent = 1'b0; + end + end + end end "error_internal_intr_count_r", @@ -873,7 +1498,10 @@ class soc_ifc_predictor #( "error_wdt_timer2_timeout_intr_count_r", "notif_cmd_avail_intr_count_r", "notif_mbox_ecc_cor_intr_count_r", - "notif_debug_locked_intr_count_r": begin + "notif_debug_locked_intr_count_r", + "notif_scan_mode_intr_count_r", + "notif_soc_req_lock_intr_count_r", + "notif_gen_in_toggle_intr_count_r": begin if (ahb_txn.RnW == AHB_WRITE) begin `uvm_info("PRED_AHB", {"Write to ", axs_reg.get_name(), " modifies interrupt statistics count"}, UVM_HIGH) end @@ -891,7 +1519,10 @@ class soc_ifc_predictor #( "error_wdt_timer2_timeout_intr_count_incr_r", "notif_cmd_avail_intr_count_incr_r", "notif_mbox_ecc_cor_intr_count_incr_r", - "notif_debug_locked_intr_count_incr_r": begin + "notif_debug_locked_intr_count_incr_r", + "notif_scan_mode_intr_count_incr_r", + "notif_soc_req_lock_intr_count_incr_r", + "notif_gen_in_toggle_intr_count_incr_r": begin `uvm_info("PRED_AHB", {"Access to register ", axs_reg.get_name(), " will have no effect on system"}, UVM_HIGH) end default: begin @@ -903,17 +1534,19 @@ class soc_ifc_predictor #( // 2-levels of ancestry back to unique parent else if (axs_reg.get_parent().get_parent().get_name() == "sha512_acc_csr_rm") begin case (axs_reg.get_name()) inside - "global_intr_en_r", + "global_intr_en_r": begin + if (ahb_txn.RnW == AHB_WRITE) begin + send_cptra_sts_txn = (!this.sha_err_intr_pending && p_soc_ifc_rm.sha512_acc_csr_rm.intr_block_rf_ext.error_global_intr_r.agg_sts.get_mirrored_value() && p_soc_ifc_rm.sha512_acc_csr_rm.intr_block_rf_ext.global_intr_en_r.error_en.get_mirrored_value()) || + (!this.sha_notif_intr_pending && p_soc_ifc_rm.sha512_acc_csr_rm.intr_block_rf_ext.notif_global_intr_r.agg_sts.get_mirrored_value() && p_soc_ifc_rm.sha512_acc_csr_rm.intr_block_rf_ext.global_intr_en_r.notif_en.get_mirrored_value()); + this.sha_err_intr_pending = p_soc_ifc_rm.sha512_acc_csr_rm.intr_block_rf_ext.error_global_intr_r.agg_sts.get_mirrored_value() && p_soc_ifc_rm.sha512_acc_csr_rm.intr_block_rf_ext.global_intr_en_r.error_en.get_mirrored_value(); + this.sha_notif_intr_pending = p_soc_ifc_rm.sha512_acc_csr_rm.intr_block_rf_ext.notif_global_intr_r.agg_sts.get_mirrored_value() && p_soc_ifc_rm.sha512_acc_csr_rm.intr_block_rf_ext.global_intr_en_r.notif_en.get_mirrored_value(); + end + end "error_intr_en_r", "notif_intr_en_r", "error_intr_trig_r", "notif_intr_trig_r": begin - if (ahb_txn.RnW == AHB_WRITE) begin - send_cptra_sts_txn = (!this.sha_err_intr_pending && p_soc_ifc_rm.sha512_acc_csr_rm.intr_block_rf_ext.error_global_intr_r.agg_sts.get_mirrored_value()) || - (!this.sha_notif_intr_pending && p_soc_ifc_rm.sha512_acc_csr_rm.intr_block_rf_ext.notif_global_intr_r.agg_sts.get_mirrored_value()); - this.sha_err_intr_pending = p_soc_ifc_rm.sha512_acc_csr_rm.intr_block_rf_ext.error_global_intr_r.agg_sts.get_mirrored_value(); - this.sha_notif_intr_pending = p_soc_ifc_rm.sha512_acc_csr_rm.intr_block_rf_ext.notif_global_intr_r.agg_sts.get_mirrored_value(); - end + `uvm_info("PRED_AHB", $sformatf("Write to %s handled in callback", axs_reg.get_name()), UVM_DEBUG) end "error_global_intr_r", "notif_global_intr_r": begin @@ -928,10 +1561,27 @@ class soc_ifc_predictor #( // but this does not result in a cptra status transaction because we only // capture rising edges as a transaction `uvm_info("PRED_AHB", {"Write to ", axs_reg.get_name(), " attempts to clear an interrupt"}, UVM_HIGH) - this.sha_err_intr_pending = p_soc_ifc_rm.sha512_acc_csr_rm.intr_block_rf_ext.error_global_intr_r.agg_sts.get_mirrored_value(); - this.sha_notif_intr_pending = p_soc_ifc_rm.sha512_acc_csr_rm.intr_block_rf_ext.notif_global_intr_r.agg_sts.get_mirrored_value(); end end + "error0_intr_count_r", + "error1_intr_count_r", + "error2_intr_count_r", + "error3_intr_count_r", + "notif_cmd_done_intr_count_r": begin + if (ahb_txn.RnW == AHB_WRITE) begin + `uvm_info("PRED_AHB", {"Write to ", axs_reg.get_name(), " modifies interrupt statistics count"}, UVM_HIGH) + end + else begin + `uvm_info("PRED_AHB", {"Access to register ", axs_reg.get_name(), " will have no effect on system"}, UVM_HIGH) + end + end + "error0_intr_count_incr_r", + "error1_intr_count_incr_r", + "error2_intr_count_incr_r", + "error3_intr_count_incr_r", + "notif_cmd_done_intr_count_incr_r": begin + `uvm_info("PRED_AHB", {"Access to register ", axs_reg.get_name(), " will have no effect on system"}, UVM_HIGH) + end default: begin `uvm_warning("PRED_AHB", $sformatf("Prediction for accesses to register '%s' unimplemented! Fix soc_ifc_predictor", axs_reg.get_name())) end @@ -939,6 +1589,14 @@ class soc_ifc_predictor #( end end// REG_AXS + fork + begin + // This allows coverage subscriber to observe both prev_step and next_step before the transition + uvm_wait_for_nba_region(); + prev_step = next_step; + end + join_none + // Code for sending output transaction out through soc_ifc_sb_ap // Please note that each broadcasted transaction should be a different object than previously // broadcasted transactions. Creation of a different object is done by constructing the transaction @@ -998,7 +1656,7 @@ class soc_ifc_predictor #( apb5_slave_0_ae_debug = t; `uvm_info("PRED_APB", "Transaction Received through apb5_slave_0_ae", UVM_MEDIUM) - `uvm_info("PRED_APB", {" Data: ",t.convert2string()}, UVM_FULL) + `uvm_info("PRED_APB", {" Data: ",t.convert2string()}, UVM_HIGH) // Construct one of each output transaction type. soc_ifc_sb_ap_output_transaction = soc_ifc_sb_ap_output_transaction_t::type_id::create("soc_ifc_sb_ap_output_transaction"); @@ -1015,15 +1673,34 @@ class soc_ifc_predictor #( if (!configuration.enable_reg_prediction) begin do_reg_prediction = 1'b0; end + // This is because of the RDC CLK GATE disablement... + else if (rdc_clk_gate_active || noncore_rst_out_asserted) begin + do_reg_prediction = 1'b0; + soc_ifc_sb_apb_ap_output_transaction.rd_data = 0; + end else begin // Mailbox accesses are discarded based on valid_requester/valid_receiver // (i.e. PAUSER + state info) + // SHA Accelerator Functions also screened based on PAUSER case (axs_reg.get_name()) inside - "mbox_lock", - "mbox_user", - "mbox_unlock": begin + "mbox_lock": begin // RS access policy wants to update lock to 1 on a read, but if the PAUSER value is invalid // lock will not be set. It will hold the previous value. + if (!(apb_txn.addr_user inside mbox_valid_users) || apb_txn.slave_err) begin + // Access to mbox_lock is dropped if PAUSER is not valid + do_reg_prediction = 1'b0; + // "Expected" read data is 0 + soc_ifc_sb_apb_ap_output_transaction.rd_data = 0; + // Complete any scheduled predictions to 0 (due to other delay jobs) + if (p_soc_ifc_rm.mbox_csr_rm.mbox_lock_clr_miss.is_on()) begin + p_soc_ifc_rm.mbox_csr_rm.mbox_lock.lock.predict(0); + `uvm_info("PRED_APB", "Completed mbox_lock deassert prediction (scheduled by mbox_execute) since mbox_lock reg prediction is disabled, due to failed APB transfer", UVM_MEDIUM) + p_soc_ifc_rm.mbox_csr_rm.mbox_lock_clr_miss.reset(0); + end + end + end + "mbox_user", + "mbox_unlock": begin if (!(apb_txn.addr_user inside mbox_valid_users) || apb_txn.slave_err) begin // Access to mbox_lock is dropped if PAUSER is not valid do_reg_prediction = 1'b0; @@ -1077,6 +1754,14 @@ class soc_ifc_predictor #( // "Expected" read data for scoreboard is current // mirrored value prior to running do_predict soc_ifc_sb_apb_ap_output_transaction.rd_data = axs_reg.get_mirrored_value(); + // ... unless it's an ECC double bit error, just use the + // observed data to avoid a scoreboard error (since the + // mismatch is anticipated) + if (dataout_mismatch_expected) begin + `uvm_info("PRED_APB", "Ignoring mbox_dataout predicted contents and using observed APB data due to prior ECC double bit flip", UVM_HIGH) + dataout_mismatch_expected = 1'b0; + soc_ifc_sb_apb_ap_output_transaction.rd_data = apb_txn.rd_data; + end dataout_count++; end else begin @@ -1099,6 +1784,59 @@ class soc_ifc_predictor #( end end end + //SHA Accelerator Functions + "LOCK", + "USER": begin + if (apb_txn.read_or_write == APB3_TRANS_READ && apb_txn.slave_err) begin + do_reg_prediction = 1'b0; + // "Expected" read data is 0 + soc_ifc_sb_apb_ap_output_transaction.rd_data = 0; + end + end + "MODE", + "START_ADDRESS", + "DLEN": begin + if (apb_txn.read_or_write == APB3_TRANS_WRITE) begin + do_reg_prediction = sha_valid_user(apb_txn) && (!apb_txn.slave_err); + end + else begin + if (apb_txn.slave_err) begin + do_reg_prediction = 1'b0; + // "Expected" read data is 0 + soc_ifc_sb_apb_ap_output_transaction.rd_data = 0; + end + end + end + "DATAIN": begin + if (apb_txn.slave_err) begin + do_reg_prediction = 1'b0; + // "Expected" read data is 0 + soc_ifc_sb_apb_ap_output_transaction.rd_data = 0; + end + end + "EXECUTE": begin + if (apb_txn.read_or_write == APB3_TRANS_WRITE) begin + do_reg_prediction = sha_valid_user(apb_txn) && (!apb_txn.slave_err); + end + else begin + if (apb_txn.slave_err) begin + do_reg_prediction = 1'b0; + // "Expected" read data is 0 + soc_ifc_sb_apb_ap_output_transaction.rd_data = 0; + end + end + end + "STATUS", + ["DIGEST[0]":"DIGEST[9]"], + ["DIGEST[10]":"DIGEST[15]"]:begin + if (apb_txn.slave_err) begin + do_reg_prediction = 1'b0; + // "Expected" read data is 0 + soc_ifc_sb_apb_ap_output_transaction.rd_data = 0; + end + end + "CONTROL": begin + end default: begin `uvm_info("PRED_APB", {"Enable reg prediction on access to ", axs_reg.get_name()}, UVM_FULL) end @@ -1117,7 +1855,10 @@ class soc_ifc_predictor #( end // Calculate any other system effects from the register access - if (axs_reg == null) begin + if (rdc_clk_gate_active || noncore_rst_out_asserted) begin + `uvm_info("PRED_APB", {"On access to register: ", axs_reg.get_full_name(), " reset is asserted, skipping system prediction"}, UVM_MEDIUM) + end + else if (axs_reg == null) begin `uvm_error("PRED_APB", $sformatf("APB transaction to address: 0x%x decodes to null from soc_ifc_APB_map", apb_txn.addr)) end else begin @@ -1139,62 +1880,255 @@ class soc_ifc_predictor #( // Reset counters at beginning of command datain_count = 0; dataout_count = 0; + // Log the step for coverage + next_step = '{lock_acquire: 1'b1, default: 1'b0}; + `uvm_info("PRED_APB", $sformatf("Logged mailbox step [%p]", next_step), UVM_HIGH) end else begin `uvm_info("PRED_APB", $sformatf("Access to mbox_lock of type %p has no effect", apb_txn.read_or_write), UVM_MEDIUM) + // Log the step for coverage + next_step = '{null_action: 1'b1, default: 1'b0}; + `uvm_info("PRED_APB", $sformatf("Logged mailbox step [%p]", next_step), UVM_HIGH) + end + void'(check_mbox_no_lock_error(apb_txn, axs_reg)); + void'(check_mbox_ooo_error(apb_txn, axs_reg)); + void'(check_mbox_inv_user_error(apb_txn, axs_reg)); + if (mailbox_data_avail && p_soc_ifc_rm.mbox_csr_rm.mbox_fn_state_sigs.mbox_error) begin + mailbox_data_avail = 1'b0; + send_soc_ifc_sts_txn = 1'b1; end end "mbox_user": begin - if (apb_txn.read_or_write == APB3_TRANS_WRITE) begin - `uvm_warning("PRED_APB", {"Write to RO register: ", axs_reg.get_name(), " has no effect on system"}) + if (check_mbox_no_lock_error(apb_txn, axs_reg) || check_mbox_ooo_error(apb_txn, axs_reg)) begin + `uvm_warning("PRED_APB", {"Access to RO register: ", axs_reg.get_name(), " triggers mailbox protocol violation"}) + end + else if (mailbox_data_avail && p_soc_ifc_rm.mbox_csr_rm.mbox_fn_state_sigs.mbox_error) begin + mailbox_data_avail = 1'b0; + send_soc_ifc_sts_txn = 1'b1; end else begin `uvm_info("PRED_APB", {"Read to ", axs_reg.get_name(), " has no effect on system"}, UVM_MEDIUM) end + void'(check_mbox_inv_user_error(apb_txn, axs_reg)); + // Log the step for coverage + next_step = '{null_action: 1'b1, default: 1'b0}; + `uvm_info("PRED_APB", $sformatf("Logged mailbox step [%p]", next_step), UVM_HIGH) end - "mbox_execute": begin - // Clearing 'execute' - Expect sts pin change - if (mailbox_data_avail && !p_soc_ifc_rm.mbox_csr_rm.mbox_execute.execute.get_mirrored_value()) begin - send_soc_ifc_sts_txn = 1; + "mbox_cmd": begin + void'(check_mbox_no_lock_error(apb_txn, axs_reg)); + void'(check_mbox_ooo_error(apb_txn, axs_reg)); + void'(check_mbox_inv_user_error(apb_txn, axs_reg)); + if (mailbox_data_avail && p_soc_ifc_rm.mbox_csr_rm.mbox_fn_state_sigs.mbox_error) begin mailbox_data_avail = 1'b0; + send_soc_ifc_sts_txn = 1'b1; end - // Setting 'execute' - Expect a uC interrupt if enabled - if (!soc_ifc_notif_intr_pending && p_soc_ifc_rm.soc_ifc_reg_rm.intr_block_rf_ext.notif_global_intr_r.agg_sts.get_mirrored_value()) begin - `uvm_info("PRED_APB", "Write to mbox_execute triggers interrupt output", UVM_LOW) - soc_ifc_notif_intr_pending = 1'b1; - send_cptra_sts_txn = 1; + if (apb_txn.read_or_write == APB3_TRANS_WRITE && + do_reg_prediction && + p_soc_ifc_rm.mbox_csr_rm.mbox_fn_state_sigs.soc_cmd_stage) begin + // Log the step for coverage + next_step = '{cmd_wr: 1'b1, default: 1'b0}; + `uvm_info("PRED_APB", $sformatf("Logged mailbox step [%p]", next_step), UVM_HIGH) + end + else if (apb_txn.read_or_write == APB3_TRANS_READ && p_soc_ifc_rm.mbox_csr_rm.mbox_fn_state_sigs.soc_receive_stage) begin + // Log the step for coverage + next_step = '{cmd_rd: 1'b1, default: 1'b0}; + `uvm_info("PRED_APB", $sformatf("Logged mailbox step [%p]", next_step), UVM_HIGH) end else begin - if (apb_txn.read_or_write == APB3_TRANS_WRITE) begin - `uvm_info("PRED_APB", - $sformatf("Write to mbox_execute does not trigger interrupt output due to global_intr_en: [%x] notif_cmd_avail_en: [%x] soc_ifc_notif_intr_pending: [%x]", - p_soc_ifc_rm.soc_ifc_reg_rm.intr_block_rf_ext.global_intr_en_r.notif_en.get_mirrored_value(), - p_soc_ifc_rm.soc_ifc_reg_rm.intr_block_rf_ext.notif_intr_en_r.notif_cmd_avail_en.get_mirrored_value(), - soc_ifc_notif_intr_pending), - UVM_HIGH) - end + // Log the step for coverage + next_step = '{null_action: 1'b1, default: 1'b0}; + `uvm_info("PRED_APB", $sformatf("Logged mailbox step [%p]", next_step), UVM_HIGH) + end + end + "mbox_dlen": begin + void'(check_mbox_no_lock_error(apb_txn, axs_reg)); + void'(check_mbox_ooo_error(apb_txn, axs_reg)); + void'(check_mbox_inv_user_error(apb_txn, axs_reg)); + if (p_soc_ifc_rm.mbox_csr_rm.mbox_fn_state_sigs.mbox_error && mailbox_data_avail) begin + mailbox_data_avail = 1'b0; + send_soc_ifc_sts_txn = 1'b1; + end + if (apb_txn.read_or_write == APB3_TRANS_WRITE && do_reg_prediction) begin + // Log the step for coverage + if (p_soc_ifc_rm.mbox_csr_rm.mbox_fn_state_sigs.soc_dlen_stage) + next_step = '{dlen_wr: 1'b1, default: 1'b0}; + else if (p_soc_ifc_rm.mbox_csr_rm.mbox_fn_state_sigs.soc_receive_stage) + next_step = '{resp_dlen_wr: 1'b1, default: 1'b0}; + `uvm_info("PRED_APB", $sformatf("Logged mailbox step [%p]", next_step), UVM_HIGH) + end + else if (apb_txn.read_or_write == APB3_TRANS_READ) begin + // Log the step for coverage + if (p_soc_ifc_rm.mbox_csr_rm.mbox_fn_state_sigs.soc_receive_stage) + next_step = '{dlen_rd: 1'b1, default: 1'b0}; + else if (p_soc_ifc_rm.mbox_csr_rm.mbox_fn_state_sigs.soc_done_stage) + next_step = '{resp_dlen_rd: 1'b1, default: 1'b0}; + `uvm_info("PRED_APB", $sformatf("Logged mailbox step [%p]", next_step), UVM_HIGH) + end + else begin + // Log the step for coverage + next_step = '{null_action: 1'b1, default: 1'b0}; + `uvm_info("PRED_APB", $sformatf("Logged mailbox step [%p]", next_step), UVM_HIGH) end end "mbox_datain": begin `uvm_info("PRED_APB", $sformatf("Access to mailbox datain, write count: %d", datain_count), UVM_FULL) + void'(check_mbox_no_lock_error(apb_txn, axs_reg)); + void'(check_mbox_ooo_error(apb_txn, axs_reg)); + void'(check_mbox_inv_user_error(apb_txn, axs_reg)); + if (mailbox_data_avail && p_soc_ifc_rm.mbox_csr_rm.mbox_fn_state_sigs.mbox_error) begin + mailbox_data_avail = 1'b0; + send_soc_ifc_sts_txn = 1'b1; + end + if (apb_txn.read_or_write == APB3_TRANS_WRITE && do_reg_prediction) begin + // Log the step for coverage + if (p_soc_ifc_rm.mbox_csr_rm.mbox_fn_state_sigs.soc_data_stage) + next_step = '{datain_wr: 1'b1, default: 1'b0}; + else + next_step = '{null_action: 1'b1, default: 1'b0}; + `uvm_info("PRED_APB", $sformatf("Logged mailbox step [%p]", next_step), UVM_HIGH) + end + else begin + // Log the step for coverage + next_step = '{null_action: 1'b1, default: 1'b0}; + `uvm_info("PRED_APB", $sformatf("Logged mailbox step [%p]", next_step), UVM_HIGH) + end end "mbox_dataout": begin `uvm_info("PRED_APB", $sformatf("Access to mailbox dataout, read count: %d", dataout_count), UVM_FULL) + void'(check_mbox_no_lock_error(apb_txn, axs_reg)); + void'(check_mbox_ooo_error(apb_txn, axs_reg)); + void'(check_mbox_inv_user_error(apb_txn, axs_reg)); + if (mailbox_data_avail && p_soc_ifc_rm.mbox_csr_rm.mbox_fn_state_sigs.mbox_error) begin + mailbox_data_avail = 1'b0; + send_soc_ifc_sts_txn = 1'b1; + end + // Log the step for coverage + next_step = '{null_action: 1'b1, default: 1'b0}; + if (apb_txn.read_or_write == APB3_TRANS_READ && do_reg_prediction) begin + if (p_soc_ifc_rm.mbox_csr_rm.mbox_fn_state_sigs.soc_receive_stage) begin + next_step = '{dataout_rd: 1'b1, default: 1'b0}; + end + else if (p_soc_ifc_rm.mbox_csr_rm.mbox_fn_state_sigs.soc_done_stage) begin + next_step = '{resp_dataout_rd: 1'b1, default: 1'b0}; + end + end + `uvm_info("PRED_APB", $sformatf("Logged mailbox step [%p]", next_step), UVM_HIGH) + end + "mbox_execute": begin + void'(check_mbox_no_lock_error(apb_txn, axs_reg)); + void'(check_mbox_ooo_error(apb_txn, axs_reg)); + void'(check_mbox_inv_user_error(apb_txn, axs_reg)); + if (mailbox_data_avail && p_soc_ifc_rm.mbox_csr_rm.mbox_fn_state_sigs.mbox_error) begin + mailbox_data_avail = 1'b0; + send_soc_ifc_sts_txn = 1'b1; + end + // Log the step for coverage + next_step = '{null_action: 1'b1, default: 1'b0}; + if (apb_txn.read_or_write == APB3_TRANS_WRITE && do_reg_prediction) begin + // Log the step for coverage + if (p_soc_ifc_rm.mbox_csr_rm.mbox_fn_state_sigs.soc_data_stage && p_soc_ifc_rm.mbox_csr_rm.mbox_execute.execute.get_mirrored_value()) begin + next_step = '{exec_set: 1'b1, default: 1'b0}; + end + else if (p_soc_ifc_rm.mbox_csr_rm.mbox_fn_state_sigs.soc_done_stage && !p_soc_ifc_rm.mbox_csr_rm.mbox_execute.execute.get_mirrored_value()) begin + next_step = '{exec_clr: 1'b1, default: 1'b0}; + end + end + `uvm_info("PRED_APB", $sformatf("Logged mailbox step [%p]", next_step), UVM_HIGH) end - "mbox_cmd", - "mbox_dlen", "mbox_status": begin - // Write to mbox_status hands control back to uC - if (apb_txn.read_or_write == APB3_TRANS_WRITE && mailbox_data_avail && p_soc_ifc_rm.mbox_csr_rm.mbox_fn_state_sigs.uc_done_stage) begin + void'(check_mbox_no_lock_error(apb_txn, axs_reg)); + void'(check_mbox_ooo_error(apb_txn, axs_reg)); + void'(check_mbox_inv_user_error(apb_txn, axs_reg)); + if (mailbox_data_avail && p_soc_ifc_rm.mbox_csr_rm.mbox_fn_state_sigs.mbox_error) begin mailbox_data_avail = 1'b0; send_soc_ifc_sts_txn = 1'b1; end + if (apb_txn.read_or_write == APB3_TRANS_WRITE && do_reg_prediction) begin + // Log the step for coverage + next_step = '{status_wr: 1'b1, default: 1'b0}; + `uvm_info("PRED_APB", $sformatf("Logged mailbox step [%p]", next_step), UVM_HIGH) + end + else if (apb_txn.read_or_write == APB3_TRANS_READ && do_reg_prediction) begin + // Log the step for coverage + next_step = '{status_rd: 1'b1, default: 1'b0}; + `uvm_info("PRED_APB", $sformatf("Logged mailbox step [%p]", next_step), UVM_HIGH) + end + else begin + // Log the step for coverage + next_step = '{null_action: 1'b1, default: 1'b0}; + `uvm_info("PRED_APB", $sformatf("Logged mailbox step [%p]", next_step), UVM_HIGH) + end end "mbox_unlock": begin - // Handled in callback + void'(check_mbox_no_lock_error(apb_txn, axs_reg)); + void'(check_mbox_ooo_error(apb_txn, axs_reg)); + void'(check_mbox_inv_user_error(apb_txn, axs_reg)); + // Log the step for coverage + next_step = '{null_action: 1'b1, default: 1'b0}; + `uvm_info("PRED_APB", $sformatf("Logged mailbox step [%p]", next_step), UVM_HIGH) + end + //SHA Accelerator Functions + "LOCK": begin + // Reading sha_lock when it is already locked has no effect, so + // only calculate predictions on acquiring lock (rdata == 0) + // which requires that the AHB transfer was successful in + // performing the access + if (do_reg_prediction && + ~apb_txn.rd_data[p_soc_ifc_rm.sha512_acc_csr_rm.LOCK.LOCK.get_lsb_pos()] && + p_soc_ifc_rm.sha512_acc_csr_rm.LOCK.LOCK.get_mirrored_value()) + begin + // Cannot put this inside the reg callback because the post_predict + // method has no way to access the addr_user value + `uvm_info("PRED_APB", $sformatf("Predicting new value [0x%x] for sha_user as AHB agent acquires lock",apb_txn.addr_user), UVM_HIGH) + p_soc_ifc_rm.sha512_acc_csr_rm.USER.predict(uvm_reg_data_t'(apb_txn.addr_user)); + end + else begin + `uvm_info("PRED_APB", $sformatf("Access to sha_lock of type %p has no effect", apb_txn.read_or_write), UVM_MEDIUM) + end + end + "USER": begin + if (apb_txn.read_or_write == APB3_TRANS_WRITE) begin + `uvm_warning("PRED_APB", {"Write to RO register: ", axs_reg.get_name(), " has no effect on system"}) + end + else begin + `uvm_info("PRED_APB", {"Read to ", axs_reg.get_name(), " has no effect on system"}, UVM_MEDIUM) + end + end + "MODE", + "START_ADDRESS", + "DLEN", + "DATAIN", + "EXECUTE", + "STATUS", + ["DIGEST[0]":"DIGEST[9]"], + ["DIGEST[10]":"DIGEST[15]"], + "CONTROL": begin `uvm_info("PRED_APB", $sformatf("Handling access to %s. Nothing to do.", axs_reg.get_name()), UVM_FULL) end - "CPTRA_RESET_REASON": begin + "CPTRA_HW_ERROR_FATAL": begin + if (apb_txn.read_or_write == APB3_TRANS_WRITE && |apb_txn.wr_data && (p_soc_ifc_rm.soc_ifc_reg_rm.CPTRA_HW_ERROR_FATAL.get_mirrored_value() == 0)) begin + `uvm_info("PRED_APB", $sformatf("Write to %s results in all bits cleared, but has no effect on cptra_error_fatal (requires reset)", axs_reg.get_name()), UVM_MEDIUM) + end + end + "CPTRA_HW_ERROR_NON_FATAL": begin + if (p_soc_ifc_rm.soc_ifc_reg_rm.CPTRA_HW_ERROR_NON_FATAL.get_mirrored_value() == 0) begin + cptra_error_non_fatal = 1'b0; + end + end + "CPTRA_FW_ERROR_FATAL": begin + if (apb_txn.read_or_write == APB3_TRANS_WRITE && |apb_txn.wr_data && (p_soc_ifc_rm.soc_ifc_reg_rm.CPTRA_FW_ERROR_FATAL.get_mirrored_value() == 0)) begin + `uvm_info("PRED_APB", $sformatf("Write to %s results in all bits cleared, but has no effect on cptra_error_fatal (requires reset)", axs_reg.get_name()), UVM_MEDIUM) + end + end + "CPTRA_FW_ERROR_NON_FATAL": begin + if (p_soc_ifc_rm.soc_ifc_reg_rm.CPTRA_FW_ERROR_NON_FATAL.get_mirrored_value() == 0) begin + cptra_error_non_fatal = 1'b0; + end + end + "CPTRA_BOOT_STATUS", + "CPTRA_FLOW_STATUS", + "CPTRA_RESET_REASON", + "CPTRA_SECURITY_STATE": begin if (apb_txn.read_or_write == APB3_TRANS_WRITE) `uvm_info("PRED_APB", {"Write to ", axs_reg.get_name(), " has no effect"}, UVM_DEBUG) end @@ -1237,6 +2171,7 @@ class soc_ifc_predictor #( end "CPTRA_TRNG_VALID_PAUSER", "CPTRA_TRNG_PAUSER_LOCK", + "CPTRA_TRNG_CTRL", "CPTRA_TRNG_STATUS": begin // Handled in callbacks via reg predictor `uvm_info("PRED_APB", $sformatf("Handling access to %s. Nothing to do.", axs_reg.get_name()), UVM_DEBUG) @@ -1248,54 +2183,129 @@ class soc_ifc_predictor #( // end end "CPTRA_FUSE_WR_DONE": begin - if (apb_txn.wr_data != axs_reg.get() && apb_txn.read_or_write == APB3_TRANS_WRITE) - `uvm_error("PRED_APB", $sformatf("APB transaction with data: 0x%x, write: %p, may not match reg model value: %x", apb_txn.wr_data, apb_txn.read_or_write, axs_reg.get())) // Only expect a status transaction if this fuse download is occuring during boot sequence // FIXME // Even after a warm reset, we expect a write to this register (although the write is dropped) - if (noncore_rst_out_asserted && (apb_txn.wr_data == 1/*FIXME hardcoded*/) && apb_txn.read_or_write == APB3_TRANS_WRITE) begin - noncore_rst_out_asserted = bootfsm_breakpoint; - uc_rst_out_asserted = bootfsm_breakpoint; - send_cptra_sts_txn = !bootfsm_breakpoint; + // When writing fuse done, if breakpoint is set we're going to wait state where noncore reset will be de-asserted + // SoC or JTAG would check for boot fsm to be in wait state before setting GO when ready to advance and bring uc out of reset + if (p_soc_ifc_rm.soc_ifc_reg_rm.boot_fn_state_sigs.boot_fuse && + apb_txn.wr_data[p_soc_ifc_rm.soc_ifc_reg_rm.CPTRA_FUSE_WR_DONE.done.get_lsb_pos()] && + apb_txn.read_or_write == APB3_TRANS_WRITE) + begin + //predict ready for fuses de-assertion p_soc_ifc_rm.soc_ifc_reg_rm.CPTRA_FLOW_STATUS.ready_for_fuses.predict(1'b0); - send_soc_ifc_sts_txn = 1'b1; - fuse_update_enabled = 1'b0; + if (bootfsm_breakpoint) begin + // Similar logic should be tied to the fw_update_reset reg callback + p_soc_ifc_rm.soc_ifc_reg_rm.boot_fn_state_sigs = '{boot_wait: 1'b1, default: 1'b0}; +// uc_rst_out_asserted = 1; // No transition - this is already asserted on entry to boot_wait by merit of predict_reset("NONCORE") + fw_update_rst_window = 1'b1; + send_cptra_sts_txn = 1'b1; + `uvm_info("PRED_APB", $sformatf("Write to %s results in uc reset assertion and boot FSM state transition to %p", axs_reg.get_name(), p_soc_ifc_rm.soc_ifc_reg_rm.boot_fn_state_sigs), UVM_HIGH) + fork + begin + fw_update_wait_count = p_soc_ifc_rm.soc_ifc_reg_rm.internal_fw_update_reset_wait_cycles.wait_cycles.get_mirrored_value(); + repeat(32'(p_soc_ifc_rm.soc_ifc_reg_rm.internal_fw_update_reset_wait_cycles.wait_cycles.get_mirrored_value())) begin + configuration.soc_ifc_ctrl_agent_config.wait_for_num_clocks(1); + if (fw_update_wait_count == 0) + `uvm_fatal("PRED_APB", "Decrement will underflow!") + fw_update_wait_count--; + end + if (!bootfsm_breakpoint) begin + cptra_sb_ap_output_transaction_t local_cptra_sb_ap_txn; + `uvm_info("PRED_APB", $sformatf("After expiration of fw_update reset counter, bootfsm_breakpoint is already cleared. Submitting transaction prediction immediately for state change."), UVM_HIGH) + predict_boot_wait_boot_done(); + local_cptra_sb_ap_txn = cptra_sb_ap_output_transaction_t::type_id::create("local_cptra_sb_ap_txn"); + populate_expected_cptra_status_txn(local_cptra_sb_ap_txn); // fw_update_rst_window + cptra_sb_ap.write(local_cptra_sb_ap_txn); + `uvm_info("PRED_APB", "Transaction submitted through cptra_sb_ap", UVM_MEDIUM) + end + else begin + `uvm_info("PRED_APB", $sformatf("After expiration of fw_update reset counter, bootfsm_breakpoint is still set. Predicted state change and reset signal updates will be handled on BOOTFSM_GO."), UVM_HIGH) + end + end + join_none + end + else begin + predict_boot_wait_boot_done(); +// send_cptra_sts_txn = 1'b1; // fw_update_rst_window was never asserted + `uvm_info("PRED_APB", $sformatf("Write to %s results in uc reset deassertion and boot FSM state transition to %p", axs_reg.get_name(), p_soc_ifc_rm.soc_ifc_reg_rm.boot_fn_state_sigs), UVM_HIGH) + end + fuse_update_enabled = 1'b0; + send_soc_ifc_sts_txn = 1'b1; // for ready_for_fuses + end + else begin + `uvm_info("PRED_APB", $sformatf("Write to %s has no effect on boot FSM due to state [%p] breakpoint [%d] and txn type [%p]", axs_reg.get_name(), p_soc_ifc_rm.soc_ifc_reg_rm.boot_fn_state_sigs, bootfsm_breakpoint, apb_txn.read_or_write), UVM_FULL) end end "CPTRA_BOOTFSM_GO": begin // FIXME -- use reg predictor somehow? - uvm_reg_data_t fuse_wr_done = p_soc_ifc_rm.soc_ifc_reg_rm.CPTRA_FUSE_WR_DONE.get(); + //When uc reset is still asserted and we're writing to bootfsm go, expect uc to be brough out of reset + bit setting_go = apb_txn.read_or_write == APB3_TRANS_WRITE && + apb_txn.wr_data[p_soc_ifc_rm.soc_ifc_reg_rm.CPTRA_BOOTFSM_GO.GO.get_lsb_pos()]; - if (noncore_rst_out_asserted && + if (p_soc_ifc_rm.soc_ifc_reg_rm.boot_fn_state_sigs.boot_wait && bootfsm_breakpoint && - apb_txn.read_or_write == APB3_TRANS_WRITE && - (apb_txn.wr_data[p_soc_ifc_rm.soc_ifc_reg_rm.CPTRA_BOOTFSM_GO.GO.get_lsb_pos()])) begin + setting_go) begin - bootfsm_breakpoint = 1'b0; - if (fuse_wr_done[p_soc_ifc_rm.soc_ifc_reg_rm.CPTRA_FUSE_WR_DONE.done.get_lsb_pos()]) begin - noncore_rst_out_asserted = 1'b0; - uc_rst_out_asserted = 1'b0; - send_cptra_sts_txn = 1'b1; + if (fw_update_wait_count == 0) begin + `uvm_info("PRED_APB", $sformatf("Write to %s results in boot FSM state transition and uC reset deassertion", axs_reg.get_name()), UVM_MEDIUM) + predict_boot_wait_boot_done(); + send_cptra_sts_txn = 1'b1; // fw_update_rst_window + end + else begin + // State transition will be triggered in the thread spawned by CPTRA_FUSE_WR_DONE write instead + `uvm_info("PRED_APB", $sformatf("Write to %s clears bootfsm_breakpoint, but state transition is delayed by %d cycles", axs_reg.get_name(), fw_update_wait_count), UVM_HIGH) end end + else begin + `uvm_info("PRED_APB", $sformatf("Write to %s has no effect on boot FSM due to state [%p] breakpoint [%d] and 'setting_go' [%d]", axs_reg.get_name(), p_soc_ifc_rm.soc_ifc_reg_rm.boot_fn_state_sigs, bootfsm_breakpoint, setting_go), UVM_DEBUG) + end + bootfsm_breakpoint &= ~setting_go; + end + "CPTRA_DBG_MANUF_SERVICE_REG": begin + `uvm_info("PRED_APB", $sformatf("Handling access to %s. Nothing to do.", axs_reg.get_name()), UVM_DEBUG) + end + ["CPTRA_WDT_CFG[0]":"CPTRA_WDT_CFG[1]"], + "CPTRA_iTRNG_ENTROPY_CONFIG_0", + "CPTRA_iTRNG_ENTROPY_CONFIG_1", + ["CPTRA_RSVD_REG[0]":"CPTRA_RSVD_REG[1]"]: begin + `uvm_info("PRED_APB", {"Access to ", axs_reg.get_name(), " has no effect on system"}, UVM_MEDIUM) end ["fuse_uds_seed[0]" :"fuse_uds_seed[9]" ], ["fuse_uds_seed[10]":"fuse_uds_seed[11]"]: begin -// // FIXME -- use reg predictor somehow? -// uvm_reg_data_t data = p_soc_ifc_rm.soc_ifc_reg_rm.CPTRA_FUSE_WR_DONE.get(); -// if (!data[p_soc_ifc_rm.soc_ifc_reg_rm.CPTRA_FUSE_WR_DONE.done.get_lsb_pos()]) begin if (fuse_update_enabled) begin send_cptra_sts_txn = 1'b1; end end ["fuse_field_entropy[0]" :"fuse_field_entropy[7]" ]: begin -// // FIXME -- use reg predictor somehow? -// uvm_reg_data_t data = p_soc_ifc_rm.soc_ifc_reg_rm.CPTRA_FUSE_WR_DONE.get(); -// if (!data[p_soc_ifc_rm.soc_ifc_reg_rm.CPTRA_FUSE_WR_DONE.done.get_lsb_pos()]) begin if (fuse_update_enabled) begin send_cptra_sts_txn = 1'b1; end end + ["fuse_key_manifest_pk_hash[0]" :"fuse_key_manifest_pk_hash[9]"], + ["fuse_key_manifest_pk_hash[10]":"fuse_key_manifest_pk_hash[11]"], + "fuse_key_manifest_pk_hash_mask", + ["fuse_owner_pk_hash[0]" :"fuse_owner_pk_hash[9]"], + ["fuse_owner_pk_hash[10]":"fuse_owner_pk_hash[11]"], + "fuse_fmc_key_manifest_svn", + ["fuse_runtime_svn[0]":"fuse_runtime_svn[3]"], + "fuse_anti_rollback_disable", + ["fuse_idevid_cert_attr[0]" :"fuse_idevid_cert_attr[9]"], + ["fuse_idevid_cert_attr[10]":"fuse_idevid_cert_attr[19]"], + ["fuse_idevid_cert_attr[20]":"fuse_idevid_cert_attr[23]"], + ["fuse_idevid_manuf_hsm_id[0]":"fuse_idevid_manuf_hsm_id[3]"], + "fuse_life_cycle", + "fuse_lms_verify", + "fuse_lms_revocation", + "fuse_soc_stepping_id", + ["internal_obf_key[0]":"internal_obf_key[7]"]: begin + // Handled in callbacks via reg predictor + `uvm_info("PRED_APB", $sformatf("Handling access to fuse/key/secret register %s. Nothing to do.", axs_reg.get_name()), UVM_DEBUG) + end + "internal_iccm_lock": begin + // Handled in callbacks via reg predictor + `uvm_info("PRED_APB", $sformatf("Handling access to register %s. Nothing to do.", axs_reg.get_name()), UVM_DEBUG) + end "global_intr_en_r", "error_intr_en_r", "notif_intr_en_r", @@ -1311,18 +2321,28 @@ class soc_ifc_predictor #( "error_bad_fuse_intr_count_r", "error_iccm_blocked_intr_count_r", "error_mbox_ecc_unc_intr_count_r", + "error_wdt_timer1_timeout_intr_count_r", + "error_wdt_timer2_timeout_intr_count_r", "notif_cmd_avail_intr_count_r", "notif_mbox_ecc_cor_intr_count_r", "notif_debug_locked_intr_count_r", + "notif_scan_mode_intr_count_r", + "notif_soc_req_lock_intr_count_r", + "notif_gen_in_toggle_intr_count_r", "error_internal_intr_count_incr_r", "error_inv_dev_intr_count_incr_r", "error_cmd_fail_intr_count_incr_r", "error_bad_fuse_intr_count_incr_r", "error_iccm_blocked_intr_count_incr_r", "error_mbox_ecc_unc_intr_count_incr_r", + "error_wdt_timer1_timeout_intr_count_incr_r", + "error_wdt_timer2_timeout_intr_count_incr_r", "notif_cmd_avail_intr_count_incr_r", "notif_mbox_ecc_cor_intr_count_incr_r", "notif_debug_locked_intr_count_incr_r", + "notif_scan_mode_intr_count_incr_r", + "notif_soc_req_lock_intr_count_incr_r", + "notif_gen_in_toggle_intr_count_incr_r", "error0_intr_count_r", "error1_intr_count_r", "error2_intr_count_r", @@ -1351,6 +2371,14 @@ class soc_ifc_predictor #( endcase end + fork + begin + // This allows coverage subscriber to observe both prev_step and next_step before the transition + uvm_wait_for_nba_region(); + prev_step = next_step; + end + join_none + // Code for sending output transaction out through soc_ifc_sb_ap // Please note that each broadcasted transaction should be a different object than previously // broadcasted transactions. Creation of a different object is done by constructing the transaction @@ -1397,6 +2425,177 @@ endclass // pragma uvmf custom external begin +// After delay jobs run and update the mailbox model state, calculate +// any transactions that are newly expected and send to the scoreboard. +function void soc_ifc_predictor::send_delayed_expected_transactions(); + bit send_soc_ifc_sts_txn = 0; + bit send_cptra_sts_txn = 0; + + ////////////////////////////////////////////////// + // Construct one of each output transaction type. + // + soc_ifc_sb_ap_output_transaction = soc_ifc_sb_ap_output_transaction_t::type_id::create("soc_ifc_sb_ap_output_transaction"); + cptra_sb_ap_output_transaction = cptra_sb_ap_output_transaction_t::type_id::create("cptra_sb_ap_output_transaction"); + + ////////////////////////////////////////////////// + // Check for any updates that may occur as a result of delayed jobs + // from the mailbox model + // + // === mailbox_data_avail === + if (!mailbox_data_avail && p_soc_ifc_rm.mbox_csr_rm.mbox_execute.execute.get_mirrored_value() && p_soc_ifc_rm.mbox_csr_rm.mbox_fn_state_sigs.soc_receive_stage) begin + `uvm_info("PRED_DLY", "Observed mbox_execute being set after delay job, triggering mailbox_data_avail transition", UVM_HIGH) + send_soc_ifc_sts_txn = 1'b1; + mailbox_data_avail = p_soc_ifc_rm.mbox_csr_rm.mbox_execute.execute.get_mirrored_value(); + end + // Clearing 'execute' - Expect sts pin change + // Force unlock will also reset mailbox_data_avail, if set, but + // will not reset any pending interrupts to uC because those + // are sticky + else if (mailbox_data_avail && !p_soc_ifc_rm.mbox_csr_rm.mbox_fn_state_sigs.soc_receive_stage && !p_soc_ifc_rm.mbox_csr_rm.mbox_fn_state_sigs.soc_done_stage) begin + `uvm_info("PRED_DLY", $sformatf("Resetting mailbox_data_avail"), UVM_HIGH) + send_soc_ifc_sts_txn = 1'b1; + mailbox_data_avail = 1'b0; + end + // Write to mbox_status hands control back to SOC + // if the status field is updated, the mbox flow has not been + // interrupted by an unlock, and system is in + // the expected state + else if (!mailbox_data_avail && p_soc_ifc_rm.mbox_csr_rm.mbox_fn_state_sigs.soc_done_stage && + p_soc_ifc_rm.mbox_csr_rm.mbox_status.status.get_mirrored_value() != CMD_BUSY && + !p_soc_ifc_rm.mbox_csr_rm.mbox_unlock.unlock.get_mirrored_value() && p_soc_ifc_rm.mbox_csr_rm.mbox_lock.lock.get_mirrored_value()) begin + `uvm_info("PRED_DLY", "Observed transition to soc_done_stage after delay job, triggering mailbox_data_avail transition", UVM_HIGH) + mailbox_data_avail = 1'b1; + send_soc_ifc_sts_txn = 1'b1; + end + // Write to mbox_status hands control back to uC + else if (mailbox_data_avail && p_soc_ifc_rm.mbox_csr_rm.mbox_fn_state_sigs.uc_done_stage && + p_soc_ifc_rm.mbox_csr_rm.mbox_status.status.get_mirrored_value() != CMD_BUSY && + !p_soc_ifc_rm.mbox_csr_rm.mbox_unlock.unlock.get_mirrored_value() && p_soc_ifc_rm.mbox_csr_rm.mbox_lock.lock.get_mirrored_value()) begin + `uvm_info("PRED_DLY", "Observed transition to uc_done_stage after delay job, triggering mailbox_data_avail deassertion", UVM_HIGH) + mailbox_data_avail = 1'b0; + send_soc_ifc_sts_txn = 1'b1; + end + // === soc_ifc_notif_intr_pending === + // Setting 'execute' - Expect a uC interrupt if enabled + if (!soc_ifc_notif_intr_pending && p_soc_ifc_rm.soc_ifc_reg_rm.intr_block_rf_ext.notif_global_intr_r.agg_sts.get_mirrored_value() && p_soc_ifc_rm.soc_ifc_reg_rm.intr_block_rf_ext.global_intr_en_r.notif_en.get_mirrored_value()) begin + `uvm_info("PRED_DLY", "Delay job triggers soc_ifc notification interrupt output", UVM_HIGH) + soc_ifc_notif_intr_pending = 1'b1; + send_cptra_sts_txn = 1'b1; + end + else if (soc_ifc_notif_intr_pending && !(p_soc_ifc_rm.soc_ifc_reg_rm.intr_block_rf_ext.notif_global_intr_r.agg_sts.get_mirrored_value() && p_soc_ifc_rm.soc_ifc_reg_rm.intr_block_rf_ext.global_intr_en_r.notif_en.get_mirrored_value())) begin + `uvm_info("PRED_DLY", "Delay job causes soc_ifc notification interrupt deassertion", UVM_HIGH) + soc_ifc_notif_intr_pending = 1'b0; + end + +// if (!cptra_error_fatal && |p_soc_ifc_rm.soc_ifc_reg_rm.CPTRA_HW_ERROR_FATAL.get_mirrored_value()) begin +// `uvm_info("PRED_DLY", "Delay job triggers cptra_error_fatal output", UVM_HIGH) +// cptra_error_fatal = 1; +// send_soc_ifc_sts_txn = 1'b1; +// end + // mbox protocol violations + // TODO The interrupt is cleared by warm reset even though reg values are not - the assertion + // should be tied directly to the event detection instead of comparing the interrupt value with the reg mirror value + if (!cptra_error_non_fatal && |p_soc_ifc_rm.soc_ifc_reg_rm.CPTRA_HW_ERROR_NON_FATAL.get_mirrored_value()) begin + `uvm_info("PRED_DLY", "Delay job triggers cptra_error_non_fatal output", UVM_HIGH) + cptra_error_non_fatal = 1; + send_soc_ifc_sts_txn = 1'b1; + end + + // Check for any Error Interrupt + if (!soc_ifc_error_intr_pending && p_soc_ifc_rm.soc_ifc_reg_rm.intr_block_rf_ext.error_global_intr_r.agg_sts.get_mirrored_value() && p_soc_ifc_rm.soc_ifc_reg_rm.intr_block_rf_ext.global_intr_en_r.error_en.get_mirrored_value()) begin + `uvm_info("PRED_DLY", "Delay job triggers soc_ifc error_intr output", UVM_HIGH) + soc_ifc_error_intr_pending = 1'b1; + send_cptra_sts_txn = 1'b1; + end + else if (soc_ifc_error_intr_pending && !(p_soc_ifc_rm.soc_ifc_reg_rm.intr_block_rf_ext.error_global_intr_r.agg_sts.get_mirrored_value() && p_soc_ifc_rm.soc_ifc_reg_rm.intr_block_rf_ext.global_intr_en_r.error_en.get_mirrored_value())) begin + `uvm_info("PRED_DLY", "Delay job causes soc_ifc error_intr deassertion", UVM_HIGH) + soc_ifc_error_intr_pending = 1'b0; + if (p_soc_ifc_rm.soc_ifc_reg_rm.CPTRA_WDT_STATUS.t1_timeout.get_mirrored_value()) + p_soc_ifc_rm.soc_ifc_reg_rm.CPTRA_WDT_STATUS.t1_timeout.predict(1'b0, -1, UVM_PREDICT_READ, UVM_PREDICT, p_soc_ifc_AHB_map); + if (p_soc_ifc_rm.soc_ifc_reg_rm.CPTRA_WDT_STATUS.t2_timeout.get_mirrored_value()) + p_soc_ifc_rm.soc_ifc_reg_rm.CPTRA_WDT_STATUS.t2_timeout.predict(1'b0, -1, UVM_PREDICT_READ, UVM_PREDICT, p_soc_ifc_AHB_map); + end + + // Check for Timer Interrupt + if (timer_intr_pending && mtime_lt_mtimecmp()) begin + `uvm_info("PRED_DLY", $sformatf("Detected deassertion of timer interrupt"), UVM_HIGH) + timer_intr_pending = 0; +// send_cptra_sts_txn = 1; // No transaction captured on deassertion + end + else if (!timer_intr_pending && !mtime_lt_mtimecmp()) begin + `uvm_info("PRED_DLY", $sformatf("Detected assertion of timer interrupt"), UVM_HIGH) + timer_intr_pending = 1; + send_cptra_sts_txn = 1; + end + + // // Check for NMI Interrupt + // if (!nmi_intr_pending && p_soc_ifc_rm.soc_ifc_reg_rm.CPTRA_HW_ERROR_FATAL.nmi_pin.get_mirrored_value()) begin + // `uvm_info("PRED_DLY", "Delay job triggers nmi interrupt output", UVM_MEDIUM) + // nmi_intr_pending = 1'b1; + // send_cptra_sts_txn = 1'b1; + // end + + // SHA Accel Notification Interrupt + // Expect a status transition on sha_notif_intr_pending + // whenever a write changes the value of SHA Accelerator Execute + // and triggers a delayed prediction job resulting in interrupt firing + if (!sha_notif_intr_pending && p_soc_ifc_rm.sha512_acc_csr_rm.intr_block_rf_ext.notif_global_intr_r.agg_sts.get_mirrored_value() && p_soc_ifc_rm.sha512_acc_csr_rm.intr_block_rf_ext.global_intr_en_r.notif_en.get_mirrored_value()) begin + sha_notif_intr_pending = 1; + if (sha_notif_intr_pending) begin + `uvm_info("PRED_DLY", "Delay job triggers sha_notif_intr_pending transition", UVM_HIGH) + send_cptra_sts_txn = 1'b1; + end + end + else if (sha_notif_intr_pending && !(p_soc_ifc_rm.sha512_acc_csr_rm.intr_block_rf_ext.notif_global_intr_r.agg_sts.get_mirrored_value() && p_soc_ifc_rm.sha512_acc_csr_rm.intr_block_rf_ext.global_intr_en_r.notif_en.get_mirrored_value())) begin + `uvm_info("PRED_DLY", "Delay job causes sha512_acc notification interrupt deassertion", UVM_HIGH) + sha_notif_intr_pending = 1'b0; + end + + ///////////////// ORDERING MUST BE PRESERVED FOR THESE ASSIGNMENTS ///////////////// + // Check for uC reset changes (both transitions due to delay job + // scheduled from internal_fw_update_reset callback) + if (p_soc_ifc_rm.soc_ifc_reg_rm.boot_fn_state_sigs.boot_wait && !uc_rst_out_asserted) begin + uc_rst_out_asserted = 1; + send_cptra_sts_txn = 1; + end + // uC reset deassertion is delayed from iccm_lock and fw_update_rst_window transitions + else if (p_soc_ifc_rm.soc_ifc_reg_rm.boot_fn_state_sigs.boot_done && !iccm_locked && !fw_update_rst_window && uc_rst_out_asserted) begin + uc_rst_out_asserted = 0; + send_cptra_sts_txn = 1; + end + + if ((p_soc_ifc_rm.soc_ifc_reg_rm.boot_fn_state_sigs.boot_fw_rst || p_soc_ifc_rm.soc_ifc_reg_rm.boot_fn_state_sigs.boot_wait) && !fw_update_rst_window) begin + fw_update_rst_window = 1; + send_cptra_sts_txn = 1; + end + else if (p_soc_ifc_rm.soc_ifc_reg_rm.boot_fn_state_sigs.boot_done && fw_update_rst_window) begin + fw_update_rst_window = 0; + send_cptra_sts_txn = 1; + end + + // Check for iccm unlock change + if (iccm_locked && ~|p_soc_ifc_rm.soc_ifc_reg_rm.internal_iccm_lock.lock.get_mirrored_value()) begin + `uvm_info("PRED_DLY", $sformatf("Detected de-assertion of ICCM LOCK"), UVM_LOW) + iccm_locked = 0; + send_cptra_sts_txn = 1; + end + ///////////////// END ORDERED ASSIGNMENTS ///////////////// + + ////////////////////////////////////////////////// + // Send expected transactions to Scoreboard + // + if (send_soc_ifc_sts_txn) begin + populate_expected_soc_ifc_status_txn(soc_ifc_sb_ap_output_transaction); + soc_ifc_sb_ap.write(soc_ifc_sb_ap_output_transaction); + `uvm_info("PRED_DLY", "Transaction submitted through soc_ifc_sb_ap", UVM_MEDIUM) + end + if (send_cptra_sts_txn) begin + populate_expected_cptra_status_txn(cptra_sb_ap_output_transaction); + cptra_sb_ap.write(cptra_sb_ap_output_transaction); + `uvm_info("PRED_DLY", "Transaction submitted through cptra_sb_ap", UVM_MEDIUM) + end +endfunction + // Time-delay jobs may be scheduled in the register model by a callback if // it requires some time to elapse before e.g. updating mirror values. // This task detects those scheduled jobs and runs them after waiting for @@ -1406,9 +2605,28 @@ task soc_ifc_predictor::poll_and_run_delay_jobs(); while (p_soc_ifc_rm.delay_jobs.size() > 0) begin fork soc_ifc_reg_delay_job job = p_soc_ifc_rm.delay_jobs.pop_front(); - begin - configuration.soc_ifc_ctrl_agent_config.wait_for_num_clocks(job.get_delay_cycles()); + if (!noncore_rst_out_asserted) begin + int idx[$]; + time end_time; + running_dly_jobs.push_back(process::self()); // This tracks all the delay_jobs that are pending so they can be clobbered on rst + `uvm_info("PRED_DLY", $sformatf("Doing delay of %0d cycles before running delay job with signature: %s", job.get_delay_cycles(), job.get_name()), UVM_HIGH/*UVM_FULL*/) + end_time = $time + 10*job.get_delay_cycles(); + job_end_count[end_time] += 1; + // delay cycles reported as 0's based value, since 1-cycle delay + // is inherent to this forever loop + if (job.get_delay_cycles()) configuration.soc_ifc_ctrl_agent_config.wait_for_num_clocks(job.get_delay_cycles()); + uvm_wait_for_nba_region(); + idx = running_dly_jobs.find_first_index(pr) with (pr == process::self()); + running_dly_jobs.delete(idx.pop_front()); job.do_job(); + job_end_count[end_time] -= 1; +// p_soc_ifc_rm.sample_values(); /* Sample coverage after completing any delayed prediction/mirror updates */ // NOTE: Added sample post_predict callback to reg fields instead + // Aggregate the results of all delay jobs that end on the same clock cycle into a + // single method call that sends all the predited transactions + if (job_end_count[end_time] == 0) begin + job_end_count.delete(end_time); + send_delayed_expected_transactions(); + end end join_none end @@ -1416,23 +2634,461 @@ task soc_ifc_predictor::poll_and_run_delay_jobs(); end endtask -function bit soc_ifc_predictor::soc_ifc_status_txn_expected_after_warm_reset(); - /* FIXME calculate this from the reg-model somehow? */ - return p_soc_ifc_rm.soc_ifc_reg_rm.CPTRA_FLOW_STATUS.ready_for_fuses.get_mirrored_value() || ready_for_fw_push || ready_for_runtime || mailbox_data_avail || |generic_output_wires /*|| trng_req_pending*/; /* only expect a soc_ifc_status_transaction if some signal will transition */ +function bit soc_ifc_predictor::check_mbox_no_lock_error(soc_ifc_sb_apb_ap_output_transaction_t txn, uvm_reg axs_reg); + soc_ifc_reg_delay_job_mbox_csr_mbox_prot_error error_job; + uvm_reg_field fld; + bit is_error = 0; + if (!p_soc_ifc_rm.mbox_csr_rm.mbox_lock.lock.get_mirrored_value() && txn.addr_user inside mbox_valid_users) begin + case (axs_reg.get_name()) inside + "mbox_lock": begin + fld = axs_reg.get_field_by_name("lock"); + is_error = txn.read_or_write == APB3_TRANS_WRITE; + end + "mbox_user": begin + fld = axs_reg.get_field_by_name("user"); + is_error = txn.read_or_write == APB3_TRANS_WRITE; + end + "mbox_cmd": begin + fld = axs_reg.get_field_by_name("command"); + is_error = txn.read_or_write == APB3_TRANS_WRITE; + end + "mbox_dlen": begin + fld = axs_reg.get_field_by_name("length"); + is_error = txn.read_or_write == APB3_TRANS_WRITE; + end + "mbox_datain": begin + fld = axs_reg.get_field_by_name("datain"); + is_error = txn.read_or_write == APB3_TRANS_WRITE; + end + "mbox_dataout": begin + fld = axs_reg.get_field_by_name("dataout"); + is_error = 1; + end + "mbox_execute": begin + fld = axs_reg.get_field_by_name("execute"); + is_error = txn.read_or_write == APB3_TRANS_WRITE; + end + "mbox_status": begin + fld = axs_reg.get_field_by_name("status"); + is_error = txn.read_or_write == APB3_TRANS_WRITE; + end + "mbox_unlock": begin + fld = axs_reg.get_field_by_name("unlock"); + is_error = txn.read_or_write == APB3_TRANS_WRITE; + end + default: begin + `uvm_error("MBOX_NO_LOCK_CHK", "This function should not be called for access to non-mailbox regs") + end + endcase + end + if (is_error) begin + error_job = soc_ifc_reg_delay_job_mbox_csr_mbox_prot_error::type_id::create("error_job"); + error_job.rm = p_soc_ifc_rm.mbox_csr_rm; + error_job.map = p_soc_ifc_APB_map; + error_job.fld = fld; + error_job.set_delay_cycles(0); + error_job.state_nxt = MBOX_IDLE; + error_job.error = '{axs_without_lock: 1'b1, default: 1'b0}; + p_soc_ifc_rm.delay_jobs.push_back(error_job); + `uvm_info("MBOX_NO_LOCK_CHK", + $sformatf("%s to %s on map [%s] with value [%x] causes a mbox no_lock protocol violation. Delay job is queued to update DUT model.", + txn.read_or_write.name(), + fld.get_name(), + p_soc_ifc_APB_map.get_name(), + txn.read_or_write == APB3_TRANS_WRITE ? txn.wr_data : txn.rd_data), + UVM_LOW) + end + return is_error; endfunction -function bit soc_ifc_predictor::cptra_status_txn_expected_after_warm_reset(); +function bit soc_ifc_predictor::check_mbox_ooo_error(soc_ifc_sb_apb_ap_output_transaction_t txn, uvm_reg axs_reg); + soc_ifc_reg_delay_job_mbox_csr_mbox_prot_error error_job; + uvm_reg_field fld; + bit is_error = 0; + // Only check for access-out-of-order errors here that will not be caught + // by reg prediction callbacks. + // That means that register accesses where valid_requester/valid_receiver is false + // (as applicable to the register in question) might trigger an error if the inverse + // is true (valid_receiver/valid_requester). + // When !soc_has_lock, valid_receiver must be true for any writes made, + // but not necessarily valid_requester. + // Since valid_requester may be false, the reg_prediction is not done, and + // thus the callback can't catch this scenario. + if (txn.addr_user inside mbox_valid_users) begin + case (axs_reg.get_name()) inside + "mbox_lock": begin + fld = axs_reg.get_field_by_name("lock"); + is_error = txn.read_or_write == APB3_TRANS_WRITE && !p_soc_ifc_rm.mbox_csr_rm.mbox_fn_state_sigs.mbox_idle; + end + "mbox_user": begin + fld = axs_reg.get_field_by_name("user"); + is_error = txn.read_or_write == APB3_TRANS_WRITE && !p_soc_ifc_rm.mbox_csr_rm.mbox_fn_state_sigs.mbox_idle; + end + "mbox_cmd": begin + fld = axs_reg.get_field_by_name("command"); + is_error = txn.read_or_write == APB3_TRANS_WRITE && valid_receiver(txn) && !valid_requester(txn); + end + "mbox_dlen": begin + fld = axs_reg.get_field_by_name("length"); + is_error = txn.read_or_write == APB3_TRANS_WRITE && valid_receiver(txn) && !valid_requester(txn); + end + "mbox_datain": begin + fld = axs_reg.get_field_by_name("datain"); + is_error = txn.read_or_write == APB3_TRANS_WRITE && valid_receiver(txn) && !valid_requester(txn); + end + "mbox_dataout": begin + fld = axs_reg.get_field_by_name("dataout"); + is_error = !valid_receiver(txn) && valid_requester(txn); + end + "mbox_execute": begin + fld = axs_reg.get_field_by_name("execute"); + is_error = txn.read_or_write == APB3_TRANS_WRITE && valid_receiver(txn) && !valid_requester(txn); + end + "mbox_status": begin + fld = axs_reg.get_field_by_name("status"); + is_error = txn.read_or_write == APB3_TRANS_WRITE && !valid_receiver(txn) && valid_requester(txn); + end + "mbox_unlock": begin + fld = axs_reg.get_field_by_name("unlock"); + is_error = txn.read_or_write == APB3_TRANS_WRITE && !p_soc_ifc_rm.mbox_csr_rm.mbox_fn_state_sigs.mbox_idle; + end + default: begin + `uvm_error("MBOX_OOO_CHK", "This function should not be called for access to non-mailbox regs") + end + endcase + end + if (is_error && p_soc_ifc_rm.mbox_csr_rm.mbox_fn_state_sigs.mbox_error) begin + `uvm_info("MBOX_OOO_CHK", + $sformatf("%s to %s on map [%s] with value [%x] calculates as a mbox out_of_order protocol violation, but no delay job is scheduled since predictor is already in state [%p].", + txn.read_or_write.name(), + fld.get_name(), + p_soc_ifc_APB_map.get_name(), + txn.read_or_write == APB3_TRANS_WRITE ? txn.wr_data : txn.rd_data, + p_soc_ifc_rm.mbox_csr_rm.mbox_fn_state_sigs), + UVM_LOW) + end + else if (is_error) begin + error_job = soc_ifc_reg_delay_job_mbox_csr_mbox_prot_error::type_id::create("error_job"); + error_job.rm = p_soc_ifc_rm.mbox_csr_rm; + error_job.map = p_soc_ifc_APB_map; + error_job.fld = fld; + error_job.set_delay_cycles(0); + error_job.state_nxt = MBOX_ERROR; + error_job.error = '{axs_incorrect_order: 1'b1, default: 1'b0}; + p_soc_ifc_rm.delay_jobs.push_back(error_job); + `uvm_info("MBOX_OOO_CHK", $sformatf("%s to %s on map [%s] with value [%x] causes a mbox out_of_order protocol violation. Delay job is queued to update DUT model.", txn.read_or_write.name(), fld.get_name(), p_soc_ifc_APB_map.get_name(), txn.read_or_write == APB3_TRANS_WRITE ? txn.wr_data : txn.rd_data), UVM_LOW) + p_soc_ifc_rm.mbox_csr_rm.mbox_fn_state_sigs = '{mbox_error: 1'b1, default: 1'b0}; + end + return is_error; +endfunction + +function bit soc_ifc_predictor::check_mbox_inv_user_error(soc_ifc_sb_apb_ap_output_transaction_t txn, uvm_reg axs_reg); + bit is_error = 0; + // The invalid PAUSER error is only flagged for write attempts by an agent + // that is considered 'valid', but which currently doesn't have lock + // (exception: reads to mbox_dataout while not holding lock also flagged) + if (txn.addr_user inside mbox_valid_users) begin + case (axs_reg.get_name()) inside + "mbox_lock": is_error = txn.read_or_write == APB3_TRANS_WRITE && !(valid_requester(txn) ); + "mbox_user": is_error = txn.read_or_write == APB3_TRANS_WRITE && !(valid_requester(txn) ); + "mbox_cmd": is_error = txn.read_or_write == APB3_TRANS_WRITE && !(valid_requester(txn) ); + "mbox_dlen": is_error = txn.read_or_write == APB3_TRANS_WRITE && !(valid_requester(txn) || valid_receiver(txn)); + "mbox_datain": is_error = txn.read_or_write == APB3_TRANS_WRITE && !(valid_requester(txn) ); + "mbox_dataout": is_error = !(valid_requester(txn) || valid_receiver(txn)); + "mbox_execute": is_error = txn.read_or_write == APB3_TRANS_WRITE && !(valid_requester(txn) ); + "mbox_status": is_error = txn.read_or_write == APB3_TRANS_WRITE && !(valid_requester(txn) || valid_receiver(txn)); + // Unwriteable via APB, but writes still don't flag a PAUSER invalid error + "mbox_unlock": is_error = txn.read_or_write == APB3_TRANS_WRITE && !(valid_requester(txn) ); + default: `uvm_error("MBOX_INV_USER_CHK", "This function should not be called for access to non-mailbox regs") + endcase + end + if (is_error) begin + p_soc_ifc_rm.soc_ifc_reg_rm.intr_block_rf_ext.error_internal_intr_r.error_inv_dev_sts.predict(1'b1, -1, UVM_PREDICT_READ, UVM_PREDICT, p_soc_ifc_AHB_map); /* AHB-access only, use AHB map*/ + `uvm_info("MBOX_INV_USER_CHK", $sformatf("%s to %s on map [%s] with user [0x%x] causes a mbox invalid PAUSER detection.", txn.read_or_write.name(), axs_reg.get_name(), p_soc_ifc_APB_map.get_name(), txn.addr_user), UVM_LOW) + end + return is_error; +endfunction + +task soc_ifc_predictor::update_mtime_mirrors(); + typedef longint unsigned mtime_type; + mtime_type mtime; + mtime_type new_mtime; + + mtime = p_soc_ifc_rm.soc_ifc_reg_rm.internal_rv_mtime_l.count_l.get_mirrored_value() | + p_soc_ifc_rm.soc_ifc_reg_rm.internal_rv_mtime_h.count_h.get_mirrored_value() << 32; + new_mtime = mtime + 1; // In clock cycles + + fork + if (p_soc_ifc_rm.soc_ifc_reg_rm.internal_rv_mtime_l.is_busy()) begin + uvm_wait_for_nba_region(); + // If mtime_l transitions from busy to not busy on the current clock edge, leave the mirror at the value it just acquired instead of overwriting + // (unless the value was not updated by the recent transfer, e.g. because it was an APB transfer) + // Else, predict a new value (which will be overwritten later when the active transfer completes) + if (p_soc_ifc_rm.soc_ifc_reg_rm.internal_rv_mtime_l.is_busy() || (mtime[31:00] == p_soc_ifc_rm.soc_ifc_reg_rm.internal_rv_mtime_l.count_l.get_mirrored_value())) begin + p_soc_ifc_rm.soc_ifc_reg_rm.internal_rv_mtime_l.count_l.predict(new_mtime[31:00], .kind(UVM_PREDICT_WRITE), .path(UVM_PREDICT), .map(p_soc_ifc_AHB_map)); + end + new_mtime[31:00] = p_soc_ifc_rm.soc_ifc_reg_rm.internal_rv_mtime_l.count_l.get_mirrored_value(); + end + else begin + p_soc_ifc_rm.soc_ifc_reg_rm.internal_rv_mtime_l.count_l.predict(new_mtime[31:00]); + end + if (p_soc_ifc_rm.soc_ifc_reg_rm.internal_rv_mtime_h.is_busy()) begin + uvm_wait_for_nba_region(); + // If mtime_h transitions from busy to not busy on the current clock edge, leave the mirror at the value it just acquired instead of overwriting + // (unless the value was not updated by the recent transfer, e.g. because it was an APB transfer) + // Else, predict a new value (which will be overwritten later when the active transfer completes) + if (p_soc_ifc_rm.soc_ifc_reg_rm.internal_rv_mtime_h.is_busy() || (mtime[63:32] == p_soc_ifc_rm.soc_ifc_reg_rm.internal_rv_mtime_h.count_h.get_mirrored_value())) begin + p_soc_ifc_rm.soc_ifc_reg_rm.internal_rv_mtime_h.count_h.predict(new_mtime[63:32], .kind(UVM_PREDICT_WRITE), .path(UVM_PREDICT), .map(p_soc_ifc_AHB_map)); + end + new_mtime[63:32] = p_soc_ifc_rm.soc_ifc_reg_rm.internal_rv_mtime_h.count_h.get_mirrored_value(); + end + else begin + p_soc_ifc_rm.soc_ifc_reg_rm.internal_rv_mtime_h.count_h.predict(new_mtime[63:32]); + end + join + + `uvm_info("PRED", $sformatf("Updated mtime register mirrors to 0x%x", new_mtime), UVM_DEBUG) +endtask + +// Increment mtime every clock cycle +task soc_ifc_predictor::mtime_counter_task(); + forever begin + configuration.soc_ifc_ctrl_agent_config.wait_for_num_clocks(1); + if (cptra_pwrgood_asserted) begin + update_mtime_mirrors(); + send_delayed_expected_transactions(); + end + end +endtask + +function bit soc_ifc_predictor::mtime_lt_mtimecmp(); + longint unsigned mtime; + longint unsigned mtimecmp; + + mtime = p_soc_ifc_rm.soc_ifc_reg_rm.internal_rv_mtime_l.count_l.get_mirrored_value() | + p_soc_ifc_rm.soc_ifc_reg_rm.internal_rv_mtime_h.count_h.get_mirrored_value() << 32; + mtimecmp = p_soc_ifc_rm.soc_ifc_reg_rm.internal_rv_mtimecmp_l.compare_l.get_mirrored_value() | + p_soc_ifc_rm.soc_ifc_reg_rm.internal_rv_mtimecmp_h.compare_h.get_mirrored_value() << 32; + + return mtime < mtimecmp; +endfunction + +//If WDT is enabled via reg write, emulate behavior here +task soc_ifc_predictor::wdt_counter_task(); + bit timer1_debug_flag, timer2_debug_flag; + forever begin + uvm_reg_data_t wdt_reg_data; + logic wdt_t1_en; + logic wdt_t2_en; + logic cascade, independent; + logic [63:0] wdt_t1_period, wdt_t2_period; + bit wdt_t1_restart_temp; + + cptra_sb_ap_output_transaction_t local_cptra_sb_ap_txn; + soc_ifc_sb_ap_output_transaction_t local_soc_ifc_sb_ap_txn; + local_cptra_sb_ap_txn = cptra_sb_ap_output_transaction_t::type_id::create("local_cptra_sb_ap_txn"); + local_soc_ifc_sb_ap_txn = soc_ifc_sb_ap_output_transaction_t::type_id::create("local_soc_ifc_sb_ap_txn"); + + //Poll for WDT enable bits + wdt_reg_data = p_soc_ifc_rm.soc_ifc_reg_rm.CPTRA_WDT_TIMER1_EN.timer1_en.get(); //_mirrored_value(); + wdt_t1_en = wdt_reg_data[0]; + + wdt_reg_data = p_soc_ifc_rm.soc_ifc_reg_rm.CPTRA_WDT_TIMER2_EN.timer2_en.get(); //_mirrored_value(); + wdt_t2_en = wdt_reg_data[0]; + + cascade = (wdt_t1_en && !wdt_t2_en); + independent = wdt_t2_en; + + wdt_reg_data = p_soc_ifc_rm.soc_ifc_reg_rm.CPTRA_WDT_TIMER1_TIMEOUT_PERIOD[0].timer1_timeout_period.get_mirrored_value(); + wdt_t1_period[31:0] = wdt_reg_data[31:0]; + wdt_reg_data = p_soc_ifc_rm.soc_ifc_reg_rm.CPTRA_WDT_TIMER1_TIMEOUT_PERIOD[1].timer1_timeout_period.get_mirrored_value(); + wdt_t1_period[63:32] = wdt_reg_data[31:0]; + + wdt_reg_data = p_soc_ifc_rm.soc_ifc_reg_rm.CPTRA_WDT_TIMER2_TIMEOUT_PERIOD[0].timer2_timeout_period.get_mirrored_value(); + wdt_t2_period[31:0] = wdt_reg_data[31:0]; + wdt_reg_data = p_soc_ifc_rm.soc_ifc_reg_rm.CPTRA_WDT_TIMER2_TIMEOUT_PERIOD[1].timer2_timeout_period.get_mirrored_value(); + wdt_t2_period[63:32] = wdt_reg_data[31:0]; + + //Reset event + if (this.reset_wdt_count) begin + `uvm_info("PRED_WDT", "Resetting WDT t1 and t2 counts due to a reset event", UVM_HIGH) + this.t1_count = 'h0; + this.t2_count = 'h0; + this.wdt_error_intr_sent = 1'b0; + this.wdt_t2_error_intr_sent = 1'b0; + this.wdt_nmi_intr_sent = 1'b0; + p_soc_ifc_rm.soc_ifc_reg_rm.CPTRA_WDT_STATUS.t1_timeout.predict(1'b0, -1, UVM_PREDICT_READ, UVM_PREDICT, p_soc_ifc_AHB_map); + p_soc_ifc_rm.soc_ifc_reg_rm.CPTRA_WDT_STATUS.t2_timeout.predict(1'b0, -1, UVM_PREDICT_READ, UVM_PREDICT, p_soc_ifc_AHB_map); + end + + //Cascade mode + if (cascade) begin + if (this.wdt_t1_restart && !p_soc_ifc_rm.soc_ifc_reg_rm.CPTRA_WDT_STATUS.t1_timeout.get_mirrored_value()) begin + this.t1_count = 'h0; + `uvm_info("PRED_WDT", "Cascade mode, received t1 pet - restarting t1 count", UVM_MEDIUM) + this.wdt_t1_restart = 1'b0; //Reset flag so we can capture another restart event + end + else if (this.t1_count != wdt_t1_period) begin + this.t1_count++; + if (!($time % 500)) + `uvm_info("PRED_WDT", $sformatf("In cascade mode. t1_count increments to 0x%x, wdt_to_period is 0x%x", this.t1_count, wdt_t1_period), UVM_DEBUG) + end + else begin + //T1 expired, so send out soc error intr, and start t2 counter + if (!this.wdt_error_intr_sent) begin + `uvm_info("PRED_WDT", "Timer1 expired in cascade mode. Starting timer2", UVM_MEDIUM) + p_soc_ifc_rm.soc_ifc_reg_rm.intr_block_rf_ext.error_internal_intr_r.error_wdt_timer1_timeout_sts.predict(1'b1, -1, UVM_PREDICT_READ, UVM_PREDICT, p_soc_ifc_AHB_map); + p_soc_ifc_rm.soc_ifc_reg_rm.CPTRA_WDT_STATUS.t1_timeout.predict(1'b1, -1, UVM_PREDICT_READ, UVM_PREDICT, p_soc_ifc_AHB_map); + //Set a flag so we don't keep sending transactions while the timer holds value until interrupt + //is serviced or reset + this.wdt_error_intr_sent = 1'b1; + end + + if (this.wdt_t2_restart) begin + `uvm_error("PRED_WDT", "Cascade mode, received t2 pet - unexpected t2 pet!") + end + else if (this.t2_count != wdt_t2_period) begin + this.t2_count++; + if (!($time % 500)) + `uvm_info("PRED_WDT", $sformatf("In cascade mode. t2_count increments to 0x%x, wdt_to_period is 0x%x", this.t2_count, wdt_t2_period), UVM_DEBUG) + end + else begin + if (!this.wdt_nmi_intr_sent) begin + `uvm_info("PRED_WDT", "Timer2 expired in cascade mode. Expecting NMI to be handled", UVM_MEDIUM); + p_soc_ifc_rm.soc_ifc_reg_rm.CPTRA_HW_ERROR_FATAL.nmi_pin.predict(1'b1, -1, UVM_PREDICT_READ, UVM_PREDICT, p_soc_ifc_AHB_map); //TODO: use default map? + p_soc_ifc_rm.soc_ifc_reg_rm.CPTRA_WDT_STATUS.t2_timeout.predict(1'b1, -1, UVM_PREDICT_READ, UVM_PREDICT, p_soc_ifc_AHB_map); + + //Sending cptra_status_txn in the same clock as NMI + nmi_intr_pending = 1'b1; + populate_expected_cptra_status_txn(local_cptra_sb_ap_txn); + cptra_sb_ap.write(local_cptra_sb_ap_txn); + `uvm_info("PRED_WDT", "Transaction submitted through cptra_sb_ap", UVM_MEDIUM) + + // Fatal error interrupt is delayed by 1 cycle due to reg state + fork + configuration.soc_ifc_ctrl_agent_config.wait_for_num_clocks(1); + if (!noncore_rst_out_asserted) begin + `uvm_info("PRED_WDT", "Watchdog timeout triggers cptra_error_fatal output", UVM_HIGH) + cptra_error_fatal = 1; + populate_expected_soc_ifc_status_txn(local_soc_ifc_sb_ap_txn); + soc_ifc_sb_ap.write(local_soc_ifc_sb_ap_txn); + `uvm_info("PRED_WDT", "Transaction submitted through soc_ifc_sb_ap", UVM_MEDIUM) + end + join_none + + //Set a flag so we don't keep sending transactions while the timer holds value until interrupt + //is serviced or reset + this.wdt_nmi_intr_sent = 1'b1; + end + end + end + end //Cascade mode + else if (independent) begin + if (this.wdt_t1_restart && !p_soc_ifc_rm.soc_ifc_reg_rm.CPTRA_WDT_STATUS.t1_timeout.get_mirrored_value()) begin + this.t1_count = 'h0; + `uvm_info("PRED_WDT", "Independent mode, received t1 pet - restarting t1 count", UVM_MEDIUM) + this.wdt_t1_restart = 1'b0; //Reset flag so we can capture another restart event + end + else if (this.t1_count != wdt_t1_period) begin + this.t1_count++; + if (!($time % 500)) + `uvm_info("PRED_WDT", $sformatf("In independent mode. t1_count increments to 0x%x, wdt_to_period is 0x%x", this.t1_count, wdt_t1_period), UVM_DEBUG) + end + else begin + //T1 expired, so send out soc error intr + if (!this.wdt_error_intr_sent) begin + `uvm_info("PRED_WDT", "Independent mode, T1 expired", UVM_MEDIUM) + p_soc_ifc_rm.soc_ifc_reg_rm.intr_block_rf_ext.error_internal_intr_r.error_wdt_timer1_timeout_sts.predict(1'b1, -1, UVM_PREDICT_READ, UVM_PREDICT, p_soc_ifc_AHB_map); + p_soc_ifc_rm.soc_ifc_reg_rm.CPTRA_WDT_STATUS.t1_timeout.predict(1'b1, -1, UVM_PREDICT_READ, UVM_PREDICT, p_soc_ifc_AHB_map); + + //Set a flag so we don't keep sending transactions while the timer holds value until interrupt + //is serviced or reset + this.wdt_error_intr_sent = 1'b1; + timer1_debug_flag = 0; + end + else if (!timer1_debug_flag) begin + `uvm_info("PRED_WDT", "Independent mode, T1 expired, but wdt_error_intr_sent is already set!", UVM_DEBUG) + timer1_debug_flag = 1; + end + end + //------------------------------------------------- + //Timer 2 + //------------------------------------------------- + if (this.wdt_t2_restart && !p_soc_ifc_rm.soc_ifc_reg_rm.CPTRA_WDT_STATUS.t2_timeout.get_mirrored_value()) begin + this.t2_count = 'h0; + `uvm_info("PRED_WDT", "Independent mode, received t2 pet - restarting t2 count", UVM_MEDIUM) + this.wdt_t2_restart = 1'b0; //Reset flag so we can capture another restart event + end + else if (this.t2_count != wdt_t2_period) begin + this.t2_count++; + if (!($time % 500)) + `uvm_info("PRED_WDT", $sformatf("In independent mode. t2_count increments to 0x%x, wdt_to_period is 0x%x", this.t2_count, wdt_t2_period), UVM_DEBUG) + end + else begin + //T2 expired, so send out soc error intr + if (!this.wdt_t2_error_intr_sent) begin + `uvm_info("PRED_WDT", "Independent mode, T2 expired", UVM_MEDIUM) + p_soc_ifc_rm.soc_ifc_reg_rm.intr_block_rf_ext.error_internal_intr_r.error_wdt_timer2_timeout_sts.predict(1'b1, -1, UVM_PREDICT_READ, UVM_PREDICT, p_soc_ifc_AHB_map); + p_soc_ifc_rm.soc_ifc_reg_rm.CPTRA_WDT_STATUS.t2_timeout.predict(1'b1, -1, UVM_PREDICT_READ, UVM_PREDICT, p_soc_ifc_AHB_map); + + //Set a flag so we don't keep sending transactions while the timer holds value until interrupt + //is serviced or reset + this.wdt_t2_error_intr_sent = 1'b1; + timer2_debug_flag = 0; + end + else if (!timer2_debug_flag) begin + `uvm_info("PRED_WDT", "Independent mode, T2 expired, but wdt_t2_error_intr_sent is already set!", UVM_DEBUG) + timer2_debug_flag = 1; + end + end + + end //Independent mode + + configuration.soc_ifc_ctrl_agent_config.wait_for_num_clocks(1); + // Hit an issue where this task would make predictions and schedule delay jobs before poll_and_run_delay_jobs() had + // kicked off the current cycle's jobs - so delay jobs (to intr pins) were not being delayed. + // Stall until after the task poll_and_run_delay_jobs has already forked delay jobs before reentering wdt loop and predicting new updates + uvm_wait_for_nba_region(); + + end //forever +endtask + + +function bit soc_ifc_predictor::soc_ifc_status_txn_expected_after_noncore_reset(); + /* FIXME calculate all of these from the reg-model somehow? */ + return ready_for_fw_push || ready_for_runtime || mailbox_data_avail || |generic_output_wires /*|| trng_req_pending*/; /* only expect a soc_ifc_status_transaction if some signal will transition */ +endfunction + +function bit soc_ifc_predictor::cptra_status_txn_expected_after_noncore_reset(); /* FIXME calculate this from the reg-model somehow? */ - return !noncore_rst_out_asserted || - !uc_rst_out_asserted || - p_soc_ifc_rm.soc_ifc_reg_rm.intr_block_rf_ext.error_global_intr_r.agg_sts.get_mirrored_value() || - p_soc_ifc_rm.soc_ifc_reg_rm.intr_block_rf_ext.notif_global_intr_r.agg_sts.get_mirrored_value() || - sha_err_intr_pending || - sha_notif_intr_pending || - iccm_locked || + // NOTE: Interrupt signals deasserting (due to reset) will not result in a + // status transaction, because only interrupt rising edges are detected + return !noncore_rst_out_asserted || + !uc_rst_out_asserted || + iccm_locked || |nmi_vector; endfunction +function bit soc_ifc_predictor::soc_ifc_status_txn_expected_after_warm_reset(); + // Most soc_ifc_status signals are actually reset by the noncore reset assertion (later) + // instead of the cptra_rst_b + return p_soc_ifc_rm.soc_ifc_reg_rm.CPTRA_FLOW_STATUS.ready_for_fuses.get_mirrored_value(); +endfunction + +function bit soc_ifc_predictor::cptra_status_txn_expected_after_warm_reset(); + // NOTE: Almost all (maybe all?) cptra_status signals persists across warm reset + // until it cascades into the assertion of noncore reset. + return 0; +endfunction + +function bit soc_ifc_predictor::soc_ifc_status_txn_expected_after_cold_reset(); + return soc_ifc_status_txn_expected_after_warm_reset() || soc_ifc_status_txn_expected_after_noncore_reset(); /* all resets are expected in conjunction with cold */ +endfunction + +function bit soc_ifc_predictor::cptra_status_txn_expected_after_cold_reset(); + return cptra_status_txn_expected_after_warm_reset() || cptra_status_txn_expected_after_noncore_reset(); /* all resets are expected in conjunction with cold */ +endfunction + function bit soc_ifc_predictor::valid_requester(input uvm_transaction txn); soc_ifc_sb_ahb_ap_output_transaction_t ahb_txn; soc_ifc_sb_apb_ap_output_transaction_t apb_txn; @@ -1470,7 +3126,7 @@ function bit soc_ifc_predictor::valid_requester(input uvm_transaction txn); return valid_requester; end else begin - `uvm_error("PRED", "valid_requester received invalid transaction - cannot cast as AHB or APB!") + `uvm_error("PRED_VALID_REQ", "valid_requester received invalid transaction - cannot cast as AHB or APB!") valid_requester = 0; return valid_requester; end @@ -1519,13 +3175,75 @@ function bit soc_ifc_predictor::valid_receiver(input uvm_transaction txn); return valid_receiver; end else begin - `uvm_error("PRED", "valid_receiver received invalid transaction - cannot cast as AHB or APB!") + `uvm_error("PRED_VALID_RCV", "valid_receiver received invalid transaction - cannot cast as AHB or APB!") valid_receiver = 0; return valid_receiver; end endfunction -task soc_ifc_predictor::handle_reset(input string kind = "HARD"); +function bit soc_ifc_predictor::sha_valid_user(input uvm_transaction txn); + soc_ifc_sb_ahb_ap_output_transaction_t ahb_txn; + soc_ifc_sb_apb_ap_output_transaction_t apb_txn; + if ($cast(ahb_txn,txn)) begin + sha_valid_user = p_soc_ifc_rm.sha512_acc_csr_rm.LOCK.LOCK.get_mirrored_value() && + !p_soc_ifc_rm.sha512_acc_csr_rm.STATUS.SOC_HAS_LOCK.get_mirrored_value(); + if (!sha_valid_user) begin + string msg = $sformatf("sha_valid_user is false!\nsha_lock: %d\nsha_accel_status.soc_has_lock: %d", + p_soc_ifc_rm.sha512_acc_csr_rm.LOCK.LOCK.get_mirrored_value(), + p_soc_ifc_rm.sha512_acc_csr_rm.STATUS.SOC_HAS_LOCK.get_mirrored_value()); + `uvm_info("PRED_VALID_SHA", msg, UVM_HIGH) + end + else begin + `uvm_info("PRED_VALID_SHA", "sha_valid_user is true", UVM_DEBUG) + end + return sha_valid_user; + end + else if ($cast(apb_txn,txn)) begin + sha_valid_user = p_soc_ifc_rm.sha512_acc_csr_rm.LOCK.LOCK.get_mirrored_value() && + p_soc_ifc_rm.sha512_acc_csr_rm.STATUS.SOC_HAS_LOCK.get_mirrored_value() && + p_soc_ifc_rm.sha512_acc_csr_rm.USER.get_mirrored_value() == apb_txn.addr_user; + if (!sha_valid_user) begin + string msg = $sformatf("sha_valid_user is false!\nsha_lock: %d\nsha_status.soc_has_lock: %d\naddr_user: 0x%x\nsha_user: 0x%x", + p_soc_ifc_rm.sha512_acc_csr_rm.LOCK.LOCK.get_mirrored_value(), + p_soc_ifc_rm.sha512_acc_csr_rm.STATUS.SOC_HAS_LOCK.get_mirrored_value(), + apb_txn.addr_user, + p_soc_ifc_rm.sha512_acc_csr_rm.USER.get_mirrored_value()); + `uvm_info("PRED_VALID_SHA", msg, UVM_HIGH) + end + else begin + `uvm_info("PRED_VALID_SHA", "sha_valid_user is true", UVM_DEBUG) + end + return sha_valid_user; + end + else begin + `uvm_error("PRED_VALID_SHA", "sha_valid_user received invalid transaction - cannot cast as AHB or APB!") + sha_valid_user = 0; + return sha_valid_user; + end +endfunction + +function void soc_ifc_predictor::predict_boot_wait_boot_done(); + cptra_sb_ap_output_transaction_t local_cptra_sb_ap_txn; + + p_soc_ifc_rm.soc_ifc_reg_rm.boot_fn_state_sigs = '{boot_done: 1'b1, default: 1'b0}; + fw_update_rst_window = 1'b0; + + fork + begin + configuration.soc_ifc_ctrl_agent_config.wait_for_num_clocks(1); + if (uc_rst_out_asserted) begin + uc_rst_out_asserted = 1'b0; + local_cptra_sb_ap_txn = cptra_sb_ap_output_transaction_t::type_id::create("local_cptra_sb_ap_txn"); + populate_expected_cptra_status_txn(local_cptra_sb_ap_txn); + cptra_sb_ap.write(local_cptra_sb_ap_txn); + `uvm_info("PRED_BOOT", "Transaction submitted through cptra_sb_ap", UVM_MEDIUM) + end + end + join_none + +endfunction + +task soc_ifc_predictor::handle_reset(input string kind = "HARD", output uvm_event reset_synchro); uvm_object obj_triggered; reset_flag kind_predicted; reset_flag kind_handled; @@ -1534,84 +3252,250 @@ task soc_ifc_predictor::handle_reset(input string kind = "HARD"); kind == "SOFT" ? soft_reset_flag : null; reset_handled.trigger(kind_handled); + `uvm_info("PRED_HANDLE_RESET", "On call to handle_reset, waiting to receive the ctrl reset transaction", UVM_HIGH) reset_predicted.wait_trigger_data(obj_triggered); + `uvm_info("PRED_HANDLE_RESET", "In call to handle_reset, received the ctrl reset transaction", UVM_HIGH) if (!$cast(kind_predicted, obj_triggered)) - `uvm_fatal("SOC_IFC_PRED", "Failed to retrieve triggered reset_flag") + `uvm_fatal("PRED_HANDLE_RESET", "Failed to retrieve triggered reset_flag") if (kind_handled != kind_predicted) - `uvm_error("SOC_IFC_PRED", $sformatf("handle_reset called with different reset type [%s] than was processed in predictor [%s]!", kind_handled.get_name(), kind_predicted.get_name())) - reset_predicted.reset(); + `uvm_error("PRED_HANDLE_RESET", $sformatf("handle_reset called with different reset type [%s] than was processed in predictor [%s]!", kind_handled.get_name(), kind_predicted.get_name())) + // Used to synchronize the noncore reset in the reset of the environment with + // the predictor (all other components must be reset before predictor) + reset_synchro = reset_handled; endtask function void soc_ifc_predictor::predict_reset(input string kind = "HARD"); uvm_reg all_regs[$]; + reset_flag last_predicted_kind = null; - `uvm_info("SOC_IFC_PRED", $sformatf("Predicting reset of kind: %p", kind), UVM_LOW) + `uvm_info("PRED_RESET", $sformatf("Predicting reset of kind: %p", kind), UVM_LOW) + + // Monitor the assertion of internal resets, which assert instantly for HARD reset + // but are delayed slightly from SOFT resets + if (kind == "HARD") begin: IMMEDIATE_INTERNAL_RESET_ASSERTION + `uvm_info("PRED_RESET", $sformatf("Reset prediction of kind: %p results in immediate assertion of internal resets", kind), UVM_MEDIUM) + noncore_rst_out_asserted = 1'b1; + uc_rst_out_asserted = 1'b1; + rdc_clk_gate_active = 1'b1; + end + else if (kind == "SOFT") begin + fork + begin: DELAY_INTERNAL_RESET_ASSERTION + cptra_sb_ap_output_transaction_t local_cptra_sb_ap_txn; + soc_ifc_sb_ap_output_transaction_t local_soc_ifc_sb_ap_txn; + bit send_soc_ifc_sts_txn = soc_ifc_status_txn_expected_after_noncore_reset(); + + // Do the noncore reset + `uvm_info("PRED_RESET", $sformatf("Reset prediction of kind: %p results in assertion of internal resets after a delay", kind), UVM_MEDIUM) + fork + begin + // FIXME need to implement clk gating features in uvmf_soc_ifc + if (configuration.cptra_ctrl_agent_config.active_passive == PASSIVE) begin + configuration.soc_ifc_ctrl_agent_config.wait_for_num_clocks(2); + uvm_wait_for_nba_region(); + rdc_clk_gate_active = 1'b1; + `uvm_info("PRED_RESET", $sformatf("Reset prediction of kind: %p results in assertion of RDC clk gate", kind), UVM_MEDIUM) + end + end + configuration.soc_ifc_ctrl_agent_config.wait_for_num_clocks(SOC_IFC_CPTRA_RST_NONCORE_RST_DELAY); + join + // Synchronize the noncore reset with the reset of the environment and allow other + // components to reset before proceeding with predicted activity + reset_handled.trigger(noncore_reset_flag); + reset_handled.wait_off(); + predict_reset("NONCORE"); + + // Send predicted transactions + if (1) begin + local_cptra_sb_ap_txn = cptra_sb_ap_output_transaction_t::type_id::create("local_cptra_sb_ap_txn"); + populate_expected_cptra_status_txn(local_cptra_sb_ap_txn); + cptra_sb_ap.write(local_cptra_sb_ap_txn); + `uvm_info("PRED_RESET", "Transaction submitted through cptra_sb_ap", UVM_MEDIUM) + end + if (send_soc_ifc_sts_txn) begin + local_soc_ifc_sb_ap_txn = soc_ifc_sb_ap_output_transaction_t::type_id::create("local_soc_ifc_sb_ap_txn"); + populate_expected_soc_ifc_status_txn(local_soc_ifc_sb_ap_txn); + soc_ifc_sb_ap.write(local_soc_ifc_sb_ap_txn); + `uvm_info("PRED_RESET", "Transaction submitted through soc_ifc_sb_ap", UVM_MEDIUM) + end + end: DELAY_INTERNAL_RESET_ASSERTION + join_none + end + else if (kind == "NONCORE") begin: NONCORE_INTERNAL_RESET_ASSERTION + `uvm_info("PRED_RESET", $sformatf("Reset prediction of kind: %p results in assertion of internal resets", kind), UVM_MEDIUM) + noncore_rst_out_asserted = 1'b1; + uc_rst_out_asserted = 1'b1; + end + + // Track the BOOT FSM internally + if (kind inside {"HARD", "SOFT"}) begin: BOOT_FSM_THREAD + p_soc_ifc_rm.soc_ifc_reg_rm.boot_fn_state_sigs = '{boot_idle: 1'b1, default: 1'b0}; + // schedule the delayed transition to next state + // Wait for the reset deassertion transactions to be detected, indicating + // BOOT FSM can progress and subsequent + fork + begin + cptra_sb_ap_output_transaction_t local_cptra_sb_ap_txn; + soc_ifc_sb_ap_output_transaction_t local_soc_ifc_sb_ap_txn; + + // Wait for cptra_rst_b deassertion + `uvm_info("PRED_RESET", $sformatf("Reset prediction of kind: %p will result in state change after reset deasserts. Wait for cptra_rst_b==1...", kind), UVM_MEDIUM) + while (last_predicted_kind != soft_reset_flag) begin + uvm_object obj_predicted; + reset_predicted.wait_ptrigger_data(obj_predicted); + reset_predicted.wait_off(); + $cast(last_predicted_kind,obj_predicted); + `uvm_info("PRED_RESET", $sformatf("After reset_predicted was cleared, last predicted kind was: %s", last_predicted_kind.get_name()), UVM_MEDIUM) + end + + // Additional delay until RDC clock comes back alive + // NOTE: Not implemented in uvmf_soc_ifc, only occurs in caliptra_top. TODO + if (configuration.cptra_ctrl_agent_config.active_passive == PASSIVE) + configuration.soc_ifc_ctrl_agent_config.wait_for_num_clocks(4); // FIXME, correct delay value? + rdc_clk_gate_active = 1'b0; + + p_soc_ifc_rm.soc_ifc_reg_rm.boot_fn_state_sigs = '{boot_fuse: 1'b1, default: 1'b0}; + `uvm_info("PRED_RESET", $sformatf("After detecting warm reset deassertion, boot FSM state change predicted: [%p]", p_soc_ifc_rm.soc_ifc_reg_rm.boot_fn_state_sigs), UVM_MEDIUM) + // NOTE: Next state progression is triggered by write to CPTRA_FUSE_WR_DONE + + // Now, deassertion of noncore reset is delayed from state transition by 2 cycles + configuration.soc_ifc_ctrl_agent_config.wait_for_num_clocks(2); // FIXME, correct delay value? + noncore_rst_out_asserted = 1'b0; + reset_wdt_count = 1'b0; + p_soc_ifc_rm.soc_ifc_reg_rm.CPTRA_FLOW_STATUS.ready_for_fuses.predict(1'b1); + + // Send predicted transactions + if (1) begin + // cptra status is for noncore reset deassertion + local_cptra_sb_ap_txn = cptra_sb_ap_output_transaction_t::type_id::create("local_cptra_sb_ap_txn"); + populate_expected_cptra_status_txn(local_cptra_sb_ap_txn); + cptra_sb_ap.write(local_cptra_sb_ap_txn); + `uvm_info("PRED_RESET", "Transaction submitted through cptra_sb_ap", UVM_MEDIUM) + end + if (1) begin + // soc_ifc status is for ready_for_fuses + local_soc_ifc_sb_ap_txn = soc_ifc_sb_ap_output_transaction_t::type_id::create("local_soc_ifc_sb_ap_txn"); + populate_expected_soc_ifc_status_txn(local_soc_ifc_sb_ap_txn); + soc_ifc_sb_ap.write(local_soc_ifc_sb_ap_txn); + `uvm_info("PRED_RESET", "Transaction submitted through soc_ifc_sb_ap", UVM_MEDIUM) + end + end + join_none + end // Predict value changes due to reset - soc_ifc_rst_in_asserted = 1'b1; - noncore_rst_out_asserted = 1'b1; - uc_rst_out_asserted = 1'b1; - p_soc_ifc_rm.soc_ifc_reg_rm.CPTRA_FLOW_STATUS.ready_for_fuses.predict(1'b0); + fw_update_wait_count = 0; + + if (kind inside {"HARD", "SOFT"}) begin: RESET_VAL_CHANGES_HARD_SOFT + soc_ifc_rst_in_asserted = 1'b1; + p_soc_ifc_rm.soc_ifc_reg_rm.CPTRA_FLOW_STATUS.ready_for_fuses.predict(1'b0); + end: RESET_VAL_CHANGES_HARD_SOFT + + // Signals that are tied to reg values are not reset by warm reset until it + // propagates to the internal resets // FIXME: Do a reg-model reset and then extract these from the reg_model??? - ready_for_fw_push = 1'b0; - ready_for_runtime = 1'b0; - nmi_vector = '0; - iccm_locked = 1'b0; - mailbox_data_avail = 1'b0; - soc_ifc_error_intr_pending = 1'b0; - soc_ifc_notif_intr_pending = 1'b0; - sha_err_intr_pending = 1'b0; - sha_notif_intr_pending = 1'b0; - generic_output_wires = '0; - - // FIXME get rid of this variable? - mbox_valid_users = '{p_soc_ifc_rm.soc_ifc_reg_rm.CPTRA_MBOX_VALID_PAUSER[0].PAUSER.get_reset(kind), - p_soc_ifc_rm.soc_ifc_reg_rm.CPTRA_MBOX_VALID_PAUSER[1].PAUSER.get_reset(kind), - p_soc_ifc_rm.soc_ifc_reg_rm.CPTRA_MBOX_VALID_PAUSER[2].PAUSER.get_reset(kind), - p_soc_ifc_rm.soc_ifc_reg_rm.CPTRA_MBOX_VALID_PAUSER[3].PAUSER.get_reset(kind), - p_soc_ifc_rm.soc_ifc_reg_rm.CPTRA_MBOX_VALID_PAUSER[4].PAUSER.get_reset(kind), - p_soc_ifc_rm.soc_ifc_reg_rm.CPTRA_MBOX_VALID_PAUSER[0].PAUSER.get_reset(kind)/*This entry is for the non-programmable default value */}; - mbox_valid_users_locked = {p_soc_ifc_rm.soc_ifc_reg_rm.CPTRA_MBOX_PAUSER_LOCK[0].LOCK.get_reset(kind), - p_soc_ifc_rm.soc_ifc_reg_rm.CPTRA_MBOX_PAUSER_LOCK[1].LOCK.get_reset(kind), - p_soc_ifc_rm.soc_ifc_reg_rm.CPTRA_MBOX_PAUSER_LOCK[2].LOCK.get_reset(kind), - p_soc_ifc_rm.soc_ifc_reg_rm.CPTRA_MBOX_PAUSER_LOCK[3].LOCK.get_reset(kind), - p_soc_ifc_rm.soc_ifc_reg_rm.CPTRA_MBOX_PAUSER_LOCK[4].LOCK.get_reset(kind)}; - - trng_data_req = 1'b0; - - if (kind == "HARD") begin - fuse_update_enabled = 1'b1; // Fuses only latch new values from APB write after a cold-reset (which clears CPTRA_FUSE_WR_DONE) - end + if (kind inside {"HARD", "NONCORE"}) begin: RESET_VAL_CHANGES_HARD_NONCORE + ready_for_fw_push = 1'b0; + ready_for_runtime = 1'b0; + nmi_vector = '0; + iccm_locked = 1'b0; + mailbox_data_avail = 1'b0; + soc_ifc_error_intr_pending = 1'b0; + soc_ifc_notif_intr_pending = 1'b0; + sha_err_intr_pending = 1'b0; + sha_notif_intr_pending = 1'b0; + + generic_output_wires = '0; + + cptra_error_fatal = 1'b0; + cptra_error_non_fatal = 1'b0; + + //WDT + nmi_intr_pending = 1'b0; //Reset nmi_intr on reset assertion + reset_wdt_count = 1'b1; + + // FIXME get rid of this variable? + mbox_valid_users = '{p_soc_ifc_rm.soc_ifc_reg_rm.CPTRA_MBOX_VALID_PAUSER[0].PAUSER.get_reset(kind), + p_soc_ifc_rm.soc_ifc_reg_rm.CPTRA_MBOX_VALID_PAUSER[1].PAUSER.get_reset(kind), + p_soc_ifc_rm.soc_ifc_reg_rm.CPTRA_MBOX_VALID_PAUSER[2].PAUSER.get_reset(kind), + p_soc_ifc_rm.soc_ifc_reg_rm.CPTRA_MBOX_VALID_PAUSER[3].PAUSER.get_reset(kind), + p_soc_ifc_rm.soc_ifc_reg_rm.CPTRA_MBOX_VALID_PAUSER[4].PAUSER.get_reset(kind), + p_soc_ifc_rm.soc_ifc_reg_rm.CPTRA_MBOX_VALID_PAUSER[0].PAUSER.get_reset(kind)/*This entry is for the non-programmable default value */}; + mbox_valid_users_locked = {p_soc_ifc_rm.soc_ifc_reg_rm.CPTRA_MBOX_PAUSER_LOCK[0].LOCK.get_reset(kind), + p_soc_ifc_rm.soc_ifc_reg_rm.CPTRA_MBOX_PAUSER_LOCK[1].LOCK.get_reset(kind), + p_soc_ifc_rm.soc_ifc_reg_rm.CPTRA_MBOX_PAUSER_LOCK[2].LOCK.get_reset(kind), + p_soc_ifc_rm.soc_ifc_reg_rm.CPTRA_MBOX_PAUSER_LOCK[3].LOCK.get_reset(kind), + p_soc_ifc_rm.soc_ifc_reg_rm.CPTRA_MBOX_PAUSER_LOCK[4].LOCK.get_reset(kind)}; + + trng_data_req = 1'b0; + + // Mailbox 'step' represents how the current transaction affects the mailbox + // flow, and is used for coverage. + if (p_soc_ifc_rm.mbox_csr_rm.mbox_fn_state_sigs.mbox_idle) + next_step = '{null_action: 1'b1, default: 1'b0}; + else + next_step = '{reset: 1'b1, default: 1'b0}; + fork + begin + // This allows coverage subscriber to observe both prev_step and next_step before the transition + uvm_wait_for_nba_region(); + prev_step = next_step; + end + join_none + + datain_count = 0; + dataout_count = 0; + + dataout_mismatch_expected = 1'b0; - datain_count = 0; - dataout_count = 0; + end: RESET_VAL_CHANGES_HARD_NONCORE + + if (kind == "HARD") begin: RESET_VAL_CHANGES_HARD + cptra_pwrgood_asserted = 1'b0; + timer_intr_pending = 1'b1; + fuse_update_enabled = 1'b1; // Fuses only latch new values from APB write after a cold-reset (which clears CPTRA_FUSE_WR_DONE) + end: RESET_VAL_CHANGES_HARD // HARD reset is the default for a reg-model - // FIXME SOFT reset is not fully defined for our reg-model yet // FIXME move this to env? p_soc_ifc_rm.reset(kind); - // If any reg access was in progress when reset occurred, clear the busy - // flag (since the APB/AHB sequencers and any mailbox sequences were killed) - p_soc_ifc_rm.get_registers(all_regs, UVM_HIER); - foreach (all_regs[ii]) begin - if (all_regs[ii].is_busy()) begin - `uvm_info("SOC_IFC_PRED", $sformatf("After resetting the reg-model, found a busy reg: [%s]. Resetting the busy bit.", all_regs[ii].get_full_name()), UVM_FULL) - // TODO: This is not in the official API, and the 'reset' function doesn't - // automatically clear busy. Not sure how to do this properly - all_regs[ii].Xset_busyX(0); + // Kill any delay_jobs that have been initiated but not completed yet + if (kind inside {"HARD","NONCORE"}) begin: KILL_DLY_JOBS_HARD_NONCORE + if (running_dly_jobs.size() > 0) + `uvm_info("PRED_RESET", $sformatf("Terminating %0d active delayed jobs.", running_dly_jobs.size()), UVM_HIGH) + while (running_dly_jobs.size() > 0) begin + process job_to_kill = running_dly_jobs.pop_front(); + if (job_to_kill.status() inside {process::KILLED,process::SUSPENDED,process::FINISHED}) begin + `uvm_fatal("PRED_RESET", $sformatf("Found delay job in the running jobs queue with unexpected status %s", job_to_kill.status().name())) + end + else begin + job_to_kill.kill(); + end end + job_end_count.delete(); end - soc_ifc_status_txn_key = 0; - cptra_status_txn_key = 0; -endfunction - -function bit soc_ifc_predictor::soc_ifc_status_txn_expected_after_cold_reset(); - return soc_ifc_status_txn_expected_after_warm_reset(); /* warm reset is expected in conjunction with cold */ -endfunction + if (kind inside {"HARD","NONCORE"}) begin: RESET_REG_BUSY_HARD_NONCORE + // If any reg access was in progress when reset occurred, clear the busy + // flag (since the APB/AHB sequencers and any mailbox sequences were killed). + // We don't run this for warm/soft resets because cptra_rst_b doesn't immediately + // reset the AHB interface, so pending transactions might still complete. + p_soc_ifc_rm.get_registers(all_regs, UVM_HIER); + foreach (all_regs[ii]) begin + if (all_regs[ii].is_busy()) begin + `uvm_info("PRED_RESET", $sformatf("After resetting the reg-model, found a busy reg: [%s]. Resetting the busy bit.", all_regs[ii].get_full_name()), UVM_FULL) + // TODO: This is not in the official API, and the 'reset' function doesn't + // automatically clear busy. Not sure how to do this properly + all_regs[ii].Xset_busyX(0); + end + end + end: RESET_REG_BUSY_HARD_NONCORE -function bit soc_ifc_predictor::cptra_status_txn_expected_after_cold_reset(); - return cptra_status_txn_expected_after_warm_reset(); /* warm reset is expected in conjunction with cold */ + // Key keeps on rolling after a SOFT reset because activity continues until NONCORE reset asserts + if (kind inside {"HARD","NONCORE"}) begin: RESET_TXN_KEY_HARD_NONCORE + soc_ifc_status_txn_key = 0; + cptra_status_txn_key = 0; + end: RESET_TXN_KEY_HARD_NONCORE endfunction function bit [`CLP_OBF_FE_DWORDS-1:0] [31:0] soc_ifc_predictor::get_expected_obf_field_entropy(); @@ -1638,8 +3522,8 @@ function void soc_ifc_predictor::populate_expected_soc_ifc_status_txn(ref soc_if txn.ready_for_runtime = this.ready_for_runtime; txn.mailbox_data_avail = this.mailbox_data_avail; txn.mailbox_flow_done = this.mailbox_flow_done; // FIXME - txn.cptra_error_fatal_intr_pending = 1'b0; // FIXME - txn.cptra_error_non_fatal_intr_pending = 1'b0; // FIXME + txn.cptra_error_fatal_intr_pending = this.cptra_error_fatal; + txn.cptra_error_non_fatal_intr_pending = this.cptra_error_non_fatal; txn.trng_req_pending = this.trng_data_req; txn.generic_output_val = this.generic_output_wires; txn.set_key(soc_ifc_status_txn_key++); @@ -1648,17 +3532,19 @@ endfunction function void soc_ifc_predictor::populate_expected_cptra_status_txn(ref cptra_sb_ap_output_transaction_t txn); txn.noncore_rst_asserted = this.noncore_rst_out_asserted; txn.uc_rst_asserted = this.uc_rst_out_asserted; + txn.fw_update_rst_window = this.fw_update_rst_window; txn.soc_ifc_err_intr_pending = this.soc_ifc_error_intr_pending; txn.soc_ifc_notif_intr_pending = this.soc_ifc_notif_intr_pending; txn.sha_err_intr_pending = this.sha_err_intr_pending; txn.sha_notif_intr_pending = this.sha_notif_intr_pending; + txn.timer_intr_pending = this.timer_intr_pending; txn.cptra_obf_key_reg = this.cptra_obf_key_reg; txn.obf_field_entropy = this.get_expected_obf_field_entropy(); txn.obf_uds_seed = this.get_expected_obf_uds_seed(); txn.nmi_vector = this.nmi_vector; + txn.nmi_intr_pending = this.nmi_intr_pending; txn.iccm_locked = this.iccm_locked; txn.set_key(cptra_status_txn_key++); endfunction // pragma uvmf custom external end - diff --git a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/src/soc_ifc_reg_cov_subscriber.svh b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/src/soc_ifc_reg_cov_subscriber.svh new file mode 100644 index 000000000..c14aff7d5 --- /dev/null +++ b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/src/soc_ifc_reg_cov_subscriber.svh @@ -0,0 +1,58 @@ +// SPDX-License-Identifier: Apache-2.0 +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +//------------------------------------------------------------------------------ +// +// CLASS: soc_ifc_reg_cov_subscriber +// +// This class provides an analysis export for receiving transactions from a +// connected analysis export. Making such a connection "subscribes" this +// component to any transactions emitted by the connected analysis port. +// +// This extended class provides a coverage subscriber that receives uvm_reg_item +// objects exported from the uvm_reg_predictor and calls the sample_values +// function for the associated register. +//------------------------------------------------------------------------------ + +class soc_ifc_reg_cov_subscriber #( + type CONFIG_T, + type T=uvm_reg_item, + type BASE_T = uvm_subscriber #(T) + ) + extends BASE_T; + + typedef soc_ifc_reg_cov_subscriber #( CONFIG_T, T, BASE_T) this_type; + + // Factory registration of this class + `uvm_component_param_utils( this_type ) + + CONFIG_T configuration; + + function new (string name, uvm_component parent); + super.new(name, parent); + endfunction + + virtual function void write(T t); + uvm_object obj; + uvm_reg axs_reg; + obj = t.element; + if (t.element_kind == UVM_REG) + $cast(axs_reg,obj); + else + `uvm_fatal("SOC_IFC_REG_COV_SUB", "Bad object type in received item") + `uvm_info("SOC_IFC_REG_COV_SUB", $sformatf("Received reg item accessing reg %s for coverage sampling", axs_reg.get_full_name()), UVM_FULL) + axs_reg.sample_values(); + endfunction + +endclass diff --git a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/src/soc_ifc_scoreboard.svh b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/src/soc_ifc_scoreboard.svh index 761ffb179..ca05dce58 100644 --- a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/src/soc_ifc_scoreboard.svh +++ b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/src/soc_ifc_scoreboard.svh @@ -143,9 +143,10 @@ class soc_ifc_scoreboard #( bit [1:0] soc_ifc_status_monitor_toggle_count [$bits(soc_ifc_status_monitor_s)-1:0] = '{default: 0}; // Variables used to report transaction matches and mismatches - int match_count; // FIXME report this - int mismatch_count; // FIXME report this - int nothing_to_compare_against_count; // FIXME check this and report + int match_count = 0; + int mismatch_count = 0; + int nothing_to_compare_against_count = 0; + int multiple_missed_txn_count = 0; bit testcase_passed = 1'b0; // Variables used for report_phase summary output formatting using report_message() @@ -154,7 +155,7 @@ class soc_ifc_scoreboard #( // Variable used to enable end of test scoreboard empty check bit end_of_test_empty_check=1; // FIXME - int transaction_count; // FIXME check this + int transaction_count = 0; // Variable used to delay run phase completion until scoreboard empty bit wait_for_scoreboard_empty; // FIXME @@ -164,6 +165,7 @@ class soc_ifc_scoreboard #( uvm_event reset_handled; reset_flag hard_reset_flag; reset_flag soft_reset_flag; + reset_flag noncore_reset_flag; extern function void handle_reset(string kind = "HARD"); extern function void disable_wait_for_scoreboard_empty(); @@ -195,6 +197,7 @@ class soc_ifc_scoreboard #( reset_handled = new("reset_handled"); hard_reset_flag = new("hard_reset_flag"); // Used as trigger data for reset events. In UVM 1.2, data changes from a uvm_object to a string soft_reset_flag = new("soft_reset_flag"); // Used as trigger data for reset events. In UVM 1.2, data changes from a uvm_object to a string + noncore_reset_flag = new("noncore_reset_flag"); // Used as trigger data for reset events. In UVM 1.2, data changes from a uvm_object to a string // pragma uvmf custom build_phase end endfunction @@ -207,7 +210,7 @@ class soc_ifc_scoreboard #( soc_ifc_status_monitor_s soc_ifc_status_monitor_struct_rpt = '{default:0}; `uvm_info("SCBD_SOC_IFC_STS", $sformatf("Transaction Received through expected_analysis_export with key: [%0d]", t.get_key()), UVM_MEDIUM) - `uvm_info("SCBD_SOC_IFC_STS", {" Data: ",t.convert2string()}, UVM_FULL) + `uvm_info("SCBD_SOC_IFC_STS", {" Data: ",t.convert2string()}, UVM_HIGH) soc_ifc_expected_hash[t.get_key()] = t; soc_ifc_status_monitor_struct_prev = soc_ifc_status_monitor_struct; @@ -223,8 +226,10 @@ class soc_ifc_scoreboard #( soc_ifc_status_monitor_struct_rpt[sts_bit] = 1'b1; end end - if (multiple_missed_txn_error) + if (multiple_missed_txn_error) begin + multiple_missed_txn_count++; `uvm_error("SCBD_SOC_IFC_STS",$sformatf("Received multiple expected transactions without corresponding actual transaction. Problem fields: %p", soc_ifc_status_monitor_struct_rpt)) + end transaction_count++; -> entry_received; @@ -237,7 +242,7 @@ class soc_ifc_scoreboard #( virtual function void write_expected_cptra_analysis_export(cptra_status_transaction t); // pragma uvmf custom expected_cptra_analysis_export_scoreboard begin `uvm_info("SCBD_CPTRA_STS", $sformatf("Transaction Received through expected_cptra_analysis_export with key: [%0d]", t.get_key()), UVM_MEDIUM) - `uvm_info("SCBD_CPTRA_STS", {" Data: ",t.convert2string()}, UVM_FULL) + `uvm_info("SCBD_CPTRA_STS", {" Data: ",t.convert2string()}, UVM_HIGH) cptra_expected_hash[t.get_key()] = t; if (reset_handled.is_on()) begin @@ -260,7 +265,7 @@ class soc_ifc_scoreboard #( bit txn_eq; `uvm_info("SCBD_SOC_IFC_STS", $sformatf("Transaction Received through actual_analysis_export with key: [%0d]", t.get_key()), UVM_MEDIUM) - `uvm_info("SCBD_SOC_IFC_STS", {" Data: ",t.convert2string()}, UVM_FULL) + `uvm_info("SCBD_SOC_IFC_STS", {" Data: ",t.convert2string()}, UVM_HIGH) // Check for expected analysis port to receive first transaction after a reset before proceeding with the actual check // This indicates the environment level reset is finished and the predictor had time to forward an expected @@ -358,9 +363,7 @@ class soc_ifc_scoreboard #( soc_ifc_status_monitor_toggle_count = '{default:2'b00}; end else begin - `uvm_info("UNIMPLEMENTED_CUSTOM_SCOREBOARD", "******************************************************************************************************",UVM_LOW) - `uvm_info("UNIMPLEMENTED_CUSTOM_SCOREBOARD", "UVMF_CHANGE_ME: The soc_ifc_scoreboard::write_actual_analysis_export function needs to be completed with custom scoreboard functionality",UVM_LOW) - `uvm_info("UNIMPLEMENTED_CUSTOM_SCOREBOARD", "******************************************************************************************************",UVM_LOW) + `uvm_info("FIXME_CUSTOM_SCOREBOARD", "UVMF_CHANGE_ME: The soc_ifc_scoreboard::write_actual_analysis_export function needs to be completed with custom scoreboard functionality for unexpected actual transactions",UVM_LOW) `uvm_error("SCBD_SOC_IFC_STS",$sformatf("NO PREDICTED ENTRY WITH KEY [%0d] TO COMPARE AGAINST:%s", t.get_key(), t.convert2string())) nothing_to_compare_against_count++; end @@ -378,7 +381,7 @@ class soc_ifc_scoreboard #( bit txn_eq; `uvm_info("SCBD_CPTRA_STS", $sformatf("Transaction Received through actual_cptra_analysis_export with key: [%0d]", t.get_key()), UVM_MEDIUM) - `uvm_info("SCBD_CPTRA_STS", {" Data: ",t.convert2string()}, UVM_FULL) + `uvm_info("SCBD_CPTRA_STS", {" Data: ",t.convert2string()}, UVM_HIGH) // Check for expected analysis port to receive first transaction after a reset before proceeding with the actual check if (reset_handled.is_on()) @@ -397,9 +400,7 @@ class soc_ifc_scoreboard #( cptra_expected_hash.delete(t.get_key()); end else begin - `uvm_info("UNIMPLEMENTED_CUSTOM_SCOREBOARD", "******************************************************************************************************",UVM_LOW) - `uvm_info("UNIMPLEMENTED_CUSTOM_SCOREBOARD", "UVMF_CHANGE_ME: The soc_ifc_scoreboard::write_actual_cptra_analysis_export function needs to be completed with custom scoreboard functionality",UVM_LOW) - `uvm_info("UNIMPLEMENTED_CUSTOM_SCOREBOARD", "******************************************************************************************************",UVM_LOW) + `uvm_info("FIXME_CUSTOM_SCOREBOARD", "UVMF_CHANGE_ME: The soc_ifc_scoreboard::write_actual_cptra_analysis_export function needs to be completed with custom scoreboard functionality for unexpected actual transactions",UVM_LOW) `uvm_error("SCBD_CPTRA_STS",$sformatf("NO PREDICTED ENTRY WITH KEY [%0d] TO COMPARE AGAINST:%s", t.get_key(), t.convert2string())) nothing_to_compare_against_count++; end @@ -420,7 +421,7 @@ class soc_ifc_scoreboard #( `uvm_fatal("SCBD_AHB","Cast from mvc_sequence_item_base to ahb_master_burst_transfer #(ahb_lite_slave_0_params::AHB_NUM_MASTERS, ahb_lite_slave_0_params::AHB_NUM_MASTER_BITS, ahb_lite_slave_0_params::AHB_NUM_SLAVES, ahb_lite_slave_0_params::AHB_ADDRESS_WIDTH, ahb_lite_slave_0_params::AHB_WDATA_WIDTH, ahb_lite_slave_0_params::AHB_RDATA_WIDTH) in write_expected_ahb_analysis_export failed!") end `uvm_info("SCBD_AHB", "Transaction Received through expected_ahb_analysis_export", UVM_MEDIUM) - `uvm_info("SCBD_AHB",{" Data: ",t.convert2string()}, UVM_FULL) + `uvm_info("SCBD_AHB",{" Data: ",t.convert2string()}, UVM_HIGH) ahb_expected_q.push_back(t); @@ -441,7 +442,7 @@ class soc_ifc_scoreboard #( `uvm_fatal("SCBD_APB","Cast from mvc_sequence_item_base to apb3_host_apb3_transaction #(apb5_master_0_params::APB3_SLAVE_COUNT, apb5_master_0_params::APB3_PADDR_BIT_WIDTH, apb5_master_0_params::APB3_PWDATA_BIT_WIDTH, apb5_master_0_params::APB3_PRDATA_BIT_WIDTH) in write_expected_apb_analysis_export failed!") end `uvm_info("SCBD_APB", "Transaction Received through expected_apb_analysis_export", UVM_MEDIUM) - `uvm_info("SCBD_APB",{" Data: ",t.convert2string()}, UVM_FULL) + `uvm_info("SCBD_APB",{" Data: ",t.convert2string()}, UVM_HIGH) apb_expected_q.push_back(t); @@ -464,7 +465,7 @@ class soc_ifc_scoreboard #( `uvm_fatal("SCBD_AHB","Cast from mvc_sequence_item_base to ahb_master_burst_transfer #(ahb_lite_slave_0_params::AHB_NUM_MASTERS, ahb_lite_slave_0_params::AHB_NUM_MASTER_BITS, ahb_lite_slave_0_params::AHB_NUM_SLAVES, ahb_lite_slave_0_params::AHB_ADDRESS_WIDTH, ahb_lite_slave_0_params::AHB_WDATA_WIDTH, ahb_lite_slave_0_params::AHB_RDATA_WIDTH) in write_actual_ahb_analysis_export failed!") end `uvm_info("SCBD_AHB", "Transaction Received through actual_ahb_analysis_export", UVM_MEDIUM) - `uvm_info("SCBD_AHB",{" Data: ",t.convert2string()}, UVM_FULL) + `uvm_info("SCBD_AHB",{" Data: ",t.convert2string()}, UVM_HIGH) if (ahb_expected_q.size() > 0) begin t_exp = ahb_expected_q.pop_front(); @@ -479,9 +480,7 @@ class soc_ifc_scoreboard #( end end else begin - `uvm_info("UNIMPLEMENTED_CUSTOM_SCOREBOARD", "******************************************************************************************************",UVM_LOW) - `uvm_info("UNIMPLEMENTED_CUSTOM_SCOREBOARD", "UVMF_CHANGE_ME: The soc_ifc_scoreboard::write_actual_ahb_analysis_export function needs to be completed with custom scoreboard functionality",UVM_LOW) - `uvm_info("UNIMPLEMENTED_CUSTOM_SCOREBOARD", "******************************************************************************************************",UVM_LOW) + `uvm_info("FIXME_CUSTOM_SCOREBOARD", "UVMF_CHANGE_ME: The soc_ifc_scoreboard::write_actual_ahb_analysis_export function needs to be completed with custom scoreboard functionality for unexpected actual transactions",UVM_LOW) `uvm_error("SCBD_AHB",$sformatf("NO PREDICTED ENTRY TO COMPARE AGAINST:%s",t.convert2string())) nothing_to_compare_against_count++; end @@ -503,7 +502,7 @@ class soc_ifc_scoreboard #( `uvm_fatal("SCBD_APB","Cast from mvc_sequence_item_base to apb3_host_apb3_transaction #(apb5_master_0_params::APB3_SLAVE_COUNT, apb5_master_0_params::APB3_PADDR_BIT_WIDTH, apb5_master_0_params::APB3_PWDATA_BIT_WIDTH, apb5_master_0_params::APB3_PRDATA_BIT_WIDTH) in write_actual_apb_analysis_export failed!") end `uvm_info("SCBD_APB", "Transaction Received through actual_apb_analysis_export", UVM_MEDIUM) - `uvm_info("SCBD_APB",{" Data: ",t.convert2string()}, UVM_FULL) + `uvm_info("SCBD_APB",{" Data: ",t.convert2string()}, UVM_HIGH) if (apb_expected_q.size() > 0) begin t_exp = apb_expected_q.pop_front(); @@ -518,9 +517,7 @@ class soc_ifc_scoreboard #( end end else begin - `uvm_info("UNIMPLEMENTED_CUSTOM_SCOREBOARD", "******************************************************************************************************",UVM_LOW) - `uvm_info("UNIMPLEMENTED_CUSTOM_SCOREBOARD", "UVMF_CHANGE_ME: The soc_ifc_scoreboard::write_actual_apb_analysis_export function needs to be completed with custom scoreboard functionality",UVM_LOW) - `uvm_info("UNIMPLEMENTED_CUSTOM_SCOREBOARD", "******************************************************************************************************",UVM_LOW) + `uvm_info("FIXME_CUSTOM_SCOREBOARD", "UVMF_CHANGE_ME: The soc_ifc_scoreboard::write_actual_apb_analysis_export function needs to be completed with custom scoreboard functionality for unexpected actual transactions",UVM_LOW) `uvm_error("SCBD_APB",$sformatf("NO PREDICTED ENTRY TO COMPARE AGAINST:%s",t.convert2string())) nothing_to_compare_against_count++; end @@ -534,7 +531,7 @@ class soc_ifc_scoreboard #( virtual function void extract_phase(uvm_phase phase); // pragma uvmf custom extract_phase begin super.extract_phase(phase); - report_variables = {transaction_count, match_count, mismatch_count, nothing_to_compare_against_count}; + report_variables = {transaction_count, match_count, mismatch_count, nothing_to_compare_against_count, multiple_missed_txn_count}; // pragma uvmf custom extract_phase end endfunction @@ -543,7 +540,7 @@ class soc_ifc_scoreboard #( // pragma uvmf custom check_phase begin super.check_phase(phase); if (transaction_count == 0) `uvm_error("SCBD","No Transactions Scoreboarded") - if ((match_count > 0) && (mismatch_count == 0) && (nothing_to_compare_against_count == 0)) + if ((match_count > 0) && (mismatch_count == 0) && (nothing_to_compare_against_count == 0) && (multiple_missed_txn_count == 0)) testcase_passed = 1'b1; // pragma uvmf custom check_phase end endfunction @@ -552,7 +549,7 @@ class soc_ifc_scoreboard #( // Builds the report_phase message printed for scoreboards derived from this base // Provides for customization of output formatting virtual function string report_message(string header, int variables [] ); - return {$sformatf("%s PREDICTED_TRANSACTIONS=%0d MATCHES=%0d MISMATCHES=%0d NO_COMPARISON_TXN=%0d", header, variables[0], variables[1], variables[2], variables[3])}; + return {$sformatf("%s PREDICTED_TRANSACTIONS=%0d MATCHES=%0d MISMATCHES=%0d NO_COMPARISON_TXN=%0d MULTIPLE_MISSED_TXN=%0d", header, variables[0], variables[1], variables[2], variables[3], variables[4])}; endfunction // FUNCTION: report_phase @@ -575,30 +572,39 @@ endclass // Used to facilitate reset handling for different kinds of reset // that may occur in soc_ifc environment. // "SOFT" reset (aka cptra_rst_b=0) - // * Causes flush of all expected and actual transactions + // * Causes flush of all expected and actual transactions after a delay + // representing the eventual assertion of noncore reset // * Initiates an event trigger to indicate reset was called // "HARD" reset (aka cptra_pwrgood=0) // * Causes flush of all expected and actual transactions // * Initiates an event trigger to indicate reset was called + // This function is called in the soc_ifc_environment prior to handle_reset + // in the soc_ifc_predictor. function void soc_ifc_scoreboard::handle_reset(string kind = "HARD"); reset_flag kind_handled; - kind_handled = kind == "HARD" ? hard_reset_flag : - kind == "SOFT" ? soft_reset_flag : - null; - - // Flush transactions - soc_ifc_expected_hash.delete(); - cptra_expected_hash .delete(); - ahb_expected_q.delete(); - apb_expected_q.delete(); - - // Clear toggle counter - soc_ifc_status_monitor_struct = '{default:0}; - soc_ifc_status_monitor_struct_prev = '{default:0}; - soc_ifc_status_monitor_toggle_count = '{default:2'b00}; - - // Event trigger - reset_handled.trigger(kind_handled); + kind_handled = kind == "HARD" ? hard_reset_flag : + kind == "SOFT" ? soft_reset_flag : + kind == "NONCORE" ? noncore_reset_flag : + null; + + if (kind inside {"HARD","NONCORE"}) begin + `uvm_info("SCBD_HANDLE_RESET", {"On call to handle_reset of kind [", kind , "] executing scoreboard reset"}, UVM_HIGH) + + // Flush transactions + soc_ifc_expected_hash.delete(); + cptra_expected_hash .delete(); + ahb_expected_q.delete(); + apb_expected_q.delete(); + + // Clear toggle counter + soc_ifc_status_monitor_struct = '{default:0}; + soc_ifc_status_monitor_struct_prev = '{default:0}; + soc_ifc_status_monitor_toggle_count = '{default:2'b00}; + + // Event trigger + reset_handled.trigger(kind_handled); + `uvm_info("SCBD_HANDLE_RESET", "On call to handle_reset, triggered the event indicating an expected status transaction for internal resets", UVM_HIGH) + end endfunction // FUNCTION: disable_wait_for_scoreboard_empty @@ -625,6 +631,12 @@ endclass if (apb_expected_q.size() != 0) entries_remaining |= 1; while (entries_remaining) begin : while_entries_remaining `uvm_info("SOC_IFC_SCBD_DRAIN",$sformatf("Waiting for entries to drain. Remaining: soc_ifc_exp[%d] cptra_exp[%d] ahb_exp[%d] apb_exp[%d]", soc_ifc_expected_hash.size(), cptra_expected_hash.size(), ahb_expected_q.size(), apb_expected_q.size()),UVM_NONE) + begin: VERBOSE_TXN_DUMP + foreach (soc_ifc_expected_hash[ii]) begin `uvm_info("SOC_IFC_SCBD_DRAIN",$sformatf("soc_ifc_expected[%0d]: %s",ii,soc_ifc_expected_hash[ii].convert2string()), UVM_FULL) end + foreach (cptra_expected_hash [ii]) begin `uvm_info("SOC_IFC_SCBD_DRAIN",$sformatf("cptra_expected[%0d]: %s",ii,cptra_expected_hash [ii].convert2string()), UVM_FULL) end + foreach (ahb_expected_q [ii]) begin `uvm_info("SOC_IFC_SCBD_DRAIN",$sformatf("ahb_expected[%0d]: %s",ii,ahb_expected_q [ii].convert2string()), UVM_FULL) end + foreach (apb_expected_q [ii]) begin `uvm_info("SOC_IFC_SCBD_DRAIN",$sformatf("apb_expected[%0d]: %s",ii,apb_expected_q [ii].convert2string()), UVM_FULL) end + end @entry_received; entries_remaining=0; if (soc_ifc_expected_hash.size() != 0) entries_remaining |= 1; diff --git a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/yaml/soc_ifc_environment.yaml b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/yaml/soc_ifc_environment.yaml index a8ba2df23..111d254aa 100644 --- a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/yaml/soc_ifc_environment.yaml +++ b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/yaml/soc_ifc_environment.yaml @@ -14,6 +14,9 @@ uvmf: - initiator_responder: RESPONDER name: cptra_status_agent type: cptra_status + - initiator_responder: RESPONDER + name: mbox_sram_agent + type: mbox_sram analysis_components: - name: soc_ifc_pred parameters: [] @@ -67,6 +70,9 @@ uvmf: - driver: cptra_ctrl_agent.monitored_ap receiver: soc_ifc_pred.cptra_ctrl_agent_ae validate: 'True' + - driver: mbox_sram_agent.monitored_ap + receiver: soc_ifc_pred.mbox_sram_agent_ae + validate: 'True' - driver: soc_ifc_pred.soc_ifc_sb_ap receiver: soc_ifc_sb.expected_analysis_export validate: 'True' diff --git a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/yaml/soc_ifc_util_comp_soc_ifc_predictor.yaml b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/yaml/soc_ifc_util_comp_soc_ifc_predictor.yaml index ed86e0948..9b07c8789 100644 --- a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/yaml/soc_ifc_util_comp_soc_ifc_predictor.yaml +++ b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/environment_packages/soc_ifc_env_pkg/yaml/soc_ifc_util_comp_soc_ifc_predictor.yaml @@ -6,6 +6,8 @@ uvmf: type: soc_ifc_ctrl_transaction - name: cptra_ctrl_agent_ae type: cptra_ctrl_transaction + - name: mbox_sram_agent_ae + type: mbox_sram_transaction - name: ahb_slave_0_ae type: mvc_sequence_item_base - name: apb5_slave_0_ae diff --git a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/interface_packages/cptra_ctrl_pkg/cptra_ctrl_pkg.sv b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/interface_packages/cptra_ctrl_pkg/cptra_ctrl_pkg.sv index 722aa9db4..196f0b473 100644 --- a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/interface_packages/cptra_ctrl_pkg/cptra_ctrl_pkg.sv +++ b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/interface_packages/cptra_ctrl_pkg/cptra_ctrl_pkg.sv @@ -52,6 +52,7 @@ package cptra_ctrl_pkg; `include "uvm_macros.svh" // pragma uvmf custom package_imports_additional begin + import soc_ifc_pkg::*; // pragma uvmf custom package_imports_additional end `include "src/cptra_ctrl_macros.svh" diff --git a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/interface_packages/cptra_ctrl_pkg/src/cptra_ctrl_driver_bfm.sv b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/interface_packages/cptra_ctrl_pkg/src/cptra_ctrl_driver_bfm.sv index da509ea8c..e0609dcf0 100644 --- a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/interface_packages/cptra_ctrl_pkg/src/cptra_ctrl_driver_bfm.sv +++ b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/interface_packages/cptra_ctrl_pkg/src/cptra_ctrl_driver_bfm.sv @@ -110,6 +110,8 @@ end reg clear_obf_secrets_o = 'b0; tri iccm_axs_blocked_i; reg iccm_axs_blocked_o = 'b0; + tri [3:0] rv_ecc_sts_i; + reg [3:0] rv_ecc_sts_o = 'b0; // Bi-directional signals @@ -127,6 +129,8 @@ end assign clear_obf_secrets_i = bus.clear_obf_secrets; assign bus.iccm_axs_blocked = (initiator_responder == INITIATOR) ? iccm_axs_blocked_o : 'bz; assign iccm_axs_blocked_i = bus.iccm_axs_blocked; + assign bus.rv_ecc_sts = (initiator_responder == INITIATOR) ? rv_ecc_sts_o : 'bz; + assign rv_ecc_sts_i = bus.rv_ecc_sts; // Proxy handle to UVM driver cptra_ctrl_pkg::cptra_ctrl_driver proxy; @@ -160,6 +164,7 @@ end // INITIATOR mode output signals clear_obf_secrets_o <= 'b0; iccm_axs_blocked_o <= 'b0; + rv_ecc_sts_o <= 'b0; // Bi-directional signals end @@ -201,9 +206,11 @@ end // Members within the cptra_ctrl_initiator_struct: // bit assert_clear_secrets ; // bit iccm_axs_blocked ; + // rv_ecc_sts_t pulse_rv_ecc_error ; // Members within the cptra_ctrl_responder_struct: // bit assert_clear_secrets ; // bit iccm_axs_blocked ; + // rv_ecc_sts_t pulse_rv_ecc_error ; initiator_struct = cptra_ctrl_initiator_struct; // // Reference code; @@ -220,15 +227,18 @@ end // Initiator output signals // clear_obf_secrets_o <= cptra_ctrl_initiator_struct.xyz; // // iccm_axs_blocked_o <= cptra_ctrl_initiator_struct.xyz; // + // rv_ecc_sts_o <= cptra_ctrl_initiator_struct.xyz; // [3:0] // Initiator inout signals // Initiate a transfer using the data received. @(posedge clk_i); clear_obf_secrets_o <= cptra_ctrl_initiator_struct.assert_clear_secrets; iccm_axs_blocked_o <= cptra_ctrl_initiator_struct.iccm_axs_blocked; + rv_ecc_sts_o <= cptra_ctrl_initiator_struct.pulse_rv_ecc_error; // Wait for the responder to complete the transfer then place the responder data into // cptra_ctrl_responder_struct. @(posedge clk_i); iccm_axs_blocked_o <= 1'b0; + rv_ecc_sts_o <= '0; cptra_ctrl_responder_struct.assert_clear_secrets <= clear_obf_secrets_i; cptra_ctrl_responder_struct.iccm_axs_blocked <= iccm_axs_blocked_i; responder_struct = cptra_ctrl_responder_struct; @@ -256,9 +266,11 @@ bit first_transfer=1; // Variables within the cptra_ctrl_initiator_struct: // bit assert_clear_secrets ; // bit iccm_axs_blocked ; + // rv_ecc_sts_t pulse_rv_ecc_error ; // Variables within the cptra_ctrl_responder_struct: // bit assert_clear_secrets ; // bit iccm_axs_blocked ; + // rv_ecc_sts_t pulse_rv_ecc_error ; // Reference code; // How to wait for signal value // while (control_signal == 1'b1) @(posedge clk_i); @@ -268,6 +280,7 @@ bit first_transfer=1; // Responder input signals // cptra_ctrl_responder_struct.xyz = clear_obf_secrets_i; // // cptra_ctrl_responder_struct.xyz = iccm_axs_blocked_i; // + // cptra_ctrl_responder_struct.xyz = rv_ecc_sts_i; // [3:0] // Responder inout signals // How to assign a signal, named xyz, from an initiator struct member. // All available responder output and inout signals listed. diff --git a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/interface_packages/cptra_ctrl_pkg/src/cptra_ctrl_if.sv b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/interface_packages/cptra_ctrl_pkg/src/cptra_ctrl_if.sv index 7f72e3111..a19c7fe26 100644 --- a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/interface_packages/cptra_ctrl_pkg/src/cptra_ctrl_if.sv +++ b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/interface_packages/cptra_ctrl_pkg/src/cptra_ctrl_if.sv @@ -35,6 +35,7 @@ // // .dut_signal_port(cptra_ctrl_bus.clear_obf_secrets), // Agent output // .dut_signal_port(cptra_ctrl_bus.iccm_axs_blocked), // Agent output +// .dut_signal_port(cptra_ctrl_bus.rv_ecc_sts), // Agent output import uvmf_base_pkg_hdl::*; import cptra_ctrl_pkg_hdl::*; @@ -45,7 +46,8 @@ interface cptra_ctrl_if input tri clk, input tri dummy, inout tri clear_obf_secrets, - inout tri iccm_axs_blocked + inout tri iccm_axs_blocked, + inout tri [3:0] rv_ecc_sts ); modport monitor_port @@ -53,7 +55,8 @@ modport monitor_port input clk, input dummy, input clear_obf_secrets, - input iccm_axs_blocked + input iccm_axs_blocked, + input rv_ecc_sts ); modport initiator_port @@ -61,7 +64,8 @@ modport initiator_port input clk, input dummy, output clear_obf_secrets, - output iccm_axs_blocked + output iccm_axs_blocked, + output rv_ecc_sts ); modport responder_port @@ -69,7 +73,8 @@ modport responder_port input clk, input dummy, input clear_obf_secrets, - input iccm_axs_blocked + input iccm_axs_blocked, + input rv_ecc_sts ); diff --git a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/interface_packages/cptra_ctrl_pkg/src/cptra_ctrl_macros.svh b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/interface_packages/cptra_ctrl_pkg/src/cptra_ctrl_macros.svh index bfd061c78..ba6c985f7 100644 --- a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/interface_packages/cptra_ctrl_pkg/src/cptra_ctrl_macros.svh +++ b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/interface_packages/cptra_ctrl_pkg/src/cptra_ctrl_macros.svh @@ -65,6 +65,7 @@ typedef struct packed { \ `define cptra_ctrl_MONITOR_STRUCT typedef struct packed { \ bit assert_clear_secrets ; \ bit iccm_axs_blocked ; \ + rv_ecc_sts_t pulse_rv_ecc_error ; \ } cptra_ctrl_monitor_s; `define cptra_ctrl_TO_MONITOR_STRUCT_FUNCTION \ @@ -72,7 +73,8 @@ typedef struct packed { \ cptra_ctrl_monitor_struct = \ { \ this.assert_clear_secrets , \ - this.iccm_axs_blocked \ + this.iccm_axs_blocked , \ + this.pulse_rv_ecc_error \ };\ return ( cptra_ctrl_monitor_struct);\ endfunction\ @@ -81,7 +83,8 @@ typedef struct packed { \ virtual function void from_monitor_struct(cptra_ctrl_monitor_s cptra_ctrl_monitor_struct);\ {\ this.assert_clear_secrets , \ - this.iccm_axs_blocked \ + this.iccm_axs_blocked , \ + this.pulse_rv_ecc_error \ } = cptra_ctrl_monitor_struct;\ endfunction @@ -93,6 +96,7 @@ typedef struct packed { \ `define cptra_ctrl_INITIATOR_STRUCT typedef struct packed { \ bit assert_clear_secrets ; \ bit iccm_axs_blocked ; \ + rv_ecc_sts_t pulse_rv_ecc_error ; \ } cptra_ctrl_initiator_s; `define cptra_ctrl_TO_INITIATOR_STRUCT_FUNCTION \ @@ -100,7 +104,8 @@ typedef struct packed { \ cptra_ctrl_initiator_struct = \ {\ this.assert_clear_secrets , \ - this.iccm_axs_blocked \ + this.iccm_axs_blocked , \ + this.pulse_rv_ecc_error \ };\ return ( cptra_ctrl_initiator_struct);\ endfunction @@ -109,7 +114,8 @@ typedef struct packed { \ virtual function void from_initiator_struct(cptra_ctrl_initiator_s cptra_ctrl_initiator_struct);\ {\ this.assert_clear_secrets , \ - this.iccm_axs_blocked \ + this.iccm_axs_blocked , \ + this.pulse_rv_ecc_error \ } = cptra_ctrl_initiator_struct;\ endfunction @@ -121,6 +127,7 @@ typedef struct packed { \ `define cptra_ctrl_RESPONDER_STRUCT typedef struct packed { \ bit assert_clear_secrets ; \ bit iccm_axs_blocked ; \ + rv_ecc_sts_t pulse_rv_ecc_error ; \ } cptra_ctrl_responder_s; `define cptra_ctrl_TO_RESPONDER_STRUCT_FUNCTION \ @@ -128,7 +135,8 @@ typedef struct packed { \ cptra_ctrl_responder_struct = \ {\ this.assert_clear_secrets , \ - this.iccm_axs_blocked \ + this.iccm_axs_blocked , \ + this.pulse_rv_ecc_error \ };\ return ( cptra_ctrl_responder_struct);\ endfunction @@ -137,7 +145,8 @@ typedef struct packed { \ virtual function void from_responder_struct(cptra_ctrl_responder_s cptra_ctrl_responder_struct);\ {\ this.assert_clear_secrets , \ - this.iccm_axs_blocked \ + this.iccm_axs_blocked , \ + this.pulse_rv_ecc_error \ } = cptra_ctrl_responder_struct;\ endfunction // pragma uvmf custom additional begin diff --git a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/interface_packages/cptra_ctrl_pkg/src/cptra_ctrl_monitor_bfm.sv b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/interface_packages/cptra_ctrl_pkg/src/cptra_ctrl_monitor_bfm.sv index 167bae11b..32506aba6 100644 --- a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/interface_packages/cptra_ctrl_pkg/src/cptra_ctrl_monitor_bfm.sv +++ b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/interface_packages/cptra_ctrl_pkg/src/cptra_ctrl_monitor_bfm.sv @@ -85,21 +85,24 @@ end tri dummy_i; tri clear_obf_secrets_i; tri iccm_axs_blocked_i; + tri [3:0] rv_ecc_sts_i; assign clk_i = bus.clk; assign dummy_i = bus.dummy; assign clear_obf_secrets_i = bus.clear_obf_secrets; assign iccm_axs_blocked_i = bus.iccm_axs_blocked; + assign rv_ecc_sts_i = bus.rv_ecc_sts; // Proxy handle to UVM monitor cptra_ctrl_pkg::cptra_ctrl_monitor proxy; // pragma tbx oneway proxy.notify_transaction // pragma uvmf custom interface_item_additional begin - logic clear_obf_secrets_r; - logic iccm_axs_blocked_r; + logic clear_obf_secrets_r = 1'b0; + logic iccm_axs_blocked_r = 1'b0; function bit any_signal_changed(); return |(clear_obf_secrets_i ^ clear_obf_secrets_r ) || - |(iccm_axs_blocked_i ^ iccm_axs_blocked_r ); + |(iccm_axs_blocked_i ^ iccm_axs_blocked_r ) || + |(rv_ecc_sts_i /* pulse no reg-stage */); endfunction // pragma uvmf custom interface_item_additional end @@ -117,13 +120,17 @@ end // pragma uvmf custom reset_condition end endtask - //****************************************************************** - - task wait_for_num_clocks(input int unsigned count); // pragma tbx xtf + // pragma uvmf custom wait_for_num_clocks begin + //**************************************************************************** + // Inject pragmas's here to throw a warning on regeneration. + // Task must have automatic lifetime so that it can be concurrently invoked + // by multiple entities with a different wait value. + task automatic wait_for_num_clocks(input int unsigned count); // pragma tbx xtf + if (count == 0) `uvm_fatal("CFG", "wait_for_num_clocks called with count of 0 - this will lead to a hang"); @(posedge clk_i); - repeat (count-1) @(posedge clk_i); endtask + // pragma uvmf custom wait_for_num_clocks end //****************************************************************** event go; @@ -166,6 +173,7 @@ end // Available struct members: // // cptra_ctrl_monitor_struct.assert_clear_secrets // // cptra_ctrl_monitor_struct.iccm_axs_blocked + // // cptra_ctrl_monitor_struct.pulse_rv_ecc_error // // // Reference code; // How to wait for signal value @@ -175,6 +183,7 @@ end // All available input signals listed. // cptra_ctrl_monitor_struct.xyz = clear_obf_secrets_i; // // cptra_ctrl_monitor_struct.xyz = iccm_axs_blocked_i; // + // cptra_ctrl_monitor_struct.xyz = rv_ecc_sts_i; // [3:0] // pragma uvmf custom do_monitor begin // UVMF_CHANGE_ME : Implement protocol monitoring. The commented reference code // below are examples of how to capture signal values and assign them to @@ -193,6 +202,7 @@ end // Variables within the cptra_ctrl_monitor_struct: cptra_ctrl_monitor_struct.iccm_axs_blocked = iccm_axs_blocked_i; cptra_ctrl_monitor_struct.assert_clear_secrets = clear_obf_secrets_i; + cptra_ctrl_monitor_struct.pulse_rv_ecc_error = rv_ecc_sts_i; end // pragma uvmf custom do_monitor end endtask diff --git a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/interface_packages/cptra_ctrl_pkg/src/cptra_ctrl_transaction.svh b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/interface_packages/cptra_ctrl_pkg/src/cptra_ctrl_transaction.svh index fcbe42427..e756d447f 100644 --- a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/interface_packages/cptra_ctrl_pkg/src/cptra_ctrl_transaction.svh +++ b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/interface_packages/cptra_ctrl_pkg/src/cptra_ctrl_transaction.svh @@ -34,6 +34,7 @@ class cptra_ctrl_transaction extends uvmf_transaction_base; bit assert_clear_secrets ; bit iccm_axs_blocked ; + rv_ecc_sts_t pulse_rv_ecc_error ; //Constraints for the transaction variables: @@ -116,7 +117,7 @@ class cptra_ctrl_transaction extends uvmf_transaction_base; virtual function string convert2string(); // pragma uvmf custom convert2string begin // UVMF_CHANGE_ME : Customize format if desired. - return $sformatf("assert_clear_secrets:0x%x iccm_axs_blocked:0x%x ",assert_clear_secrets,iccm_axs_blocked); + return $sformatf("assert_clear_secrets:0x%x iccm_axs_blocked:0x%x pulse_rv_ecc_error:0x%x %s",assert_clear_secrets,iccm_axs_blocked,pulse_rv_ecc_error,super.convert2string); // pragma uvmf custom convert2string end endfunction @@ -160,6 +161,7 @@ class cptra_ctrl_transaction extends uvmf_transaction_base; super.do_copy(rhs); this.assert_clear_secrets = RHS.assert_clear_secrets; this.iccm_axs_blocked = RHS.iccm_axs_blocked; + this.pulse_rv_ecc_error = RHS.pulse_rv_ecc_error; // pragma uvmf custom do_copy end endfunction @@ -185,6 +187,7 @@ class cptra_ctrl_transaction extends uvmf_transaction_base; // UVMF_CHANGE_ME : Eliminate transaction variables not wanted in transaction viewing in the waveform viewer $add_attribute(transaction_view_h,assert_clear_secrets,"assert_clear_secrets"); $add_attribute(transaction_view_h,iccm_axs_blocked,"iccm_axs_blocked"); + $add_attribute(transaction_view_h,pulse_rv_ecc_error,"pulse_rv_ecc_error"); // pragma uvmf custom add_to_wave end $end_transaction(transaction_view_h,end_time); $free_transaction(transaction_view_h); diff --git a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/interface_packages/cptra_ctrl_pkg/src/cptra_ctrl_transaction_coverage.svh b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/interface_packages/cptra_ctrl_pkg/src/cptra_ctrl_transaction_coverage.svh index 35a0ecff1..8a1d6e013 100644 --- a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/interface_packages/cptra_ctrl_pkg/src/cptra_ctrl_transaction_coverage.svh +++ b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/interface_packages/cptra_ctrl_pkg/src/cptra_ctrl_transaction_coverage.svh @@ -45,6 +45,7 @@ class cptra_ctrl_transaction_coverage extends uvm_subscriber #(.T(cptra_ctrl_tr option.per_instance=1; assert_clear_secrets: coverpoint coverage_trans.assert_clear_secrets; iccm_axs_blocked: coverpoint coverage_trans.iccm_axs_blocked; + pulse_rv_ecc_error: coverpoint coverage_trans.pulse_rv_ecc_error; // pragma uvmf custom covergroup end endgroup @@ -55,7 +56,6 @@ class cptra_ctrl_transaction_coverage extends uvm_subscriber #(.T(cptra_ctrl_tr function new(string name="", uvm_component parent=null); super.new(name,parent); cptra_ctrl_transaction_cg=new; - `uvm_warning("COVERAGE_MODEL_REVIEW", "A covergroup has been constructed which may need review because of either generation or re-generation with merging. Please note that transaction variables added as a result of re-generation and merging are not automatically added to the covergroup. Remove this warning after the covergroup has been reviewed.") endfunction // **************************************************************************** diff --git a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/interface_packages/cptra_ctrl_pkg/yaml/cptra_ctrl_interface.yaml b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/interface_packages/cptra_ctrl_pkg/yaml/cptra_ctrl_interface.yaml index c379666ea..a8e49df4c 100644 --- a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/interface_packages/cptra_ctrl_pkg/yaml/cptra_ctrl_interface.yaml +++ b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/interface_packages/cptra_ctrl_pkg/yaml/cptra_ctrl_interface.yaml @@ -20,6 +20,10 @@ uvmf: name: iccm_axs_blocked reset_value: '''bz' width: '1' + - dir: output + name: rv_ecc_sts + reset_value: '''bz' + width: '4' reset: dummy reset_assertion_level: 'False' transaction_constraints: [] @@ -36,4 +40,10 @@ uvmf: name: iccm_axs_blocked type: bit unpacked_dimension: '' + - comment: '' + iscompare: 'False' + isrand: 'False' + name: pulse_rv_ecc_error + type: rv_ecc_sts_t + unpacked_dimension: '' use_dpi_link: 'False' diff --git a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/interface_packages/cptra_status_pkg/src/cptra_status_driver_bfm.sv b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/interface_packages/cptra_status_pkg/src/cptra_status_driver_bfm.sv index 1e899bb4f..fb0d7ec78 100644 --- a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/interface_packages/cptra_status_pkg/src/cptra_status_driver_bfm.sv +++ b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/interface_packages/cptra_status_pkg/src/cptra_status_driver_bfm.sv @@ -110,6 +110,8 @@ end reg cptra_noncore_rst_b_o = 'b0; tri cptra_uc_rst_b_i; reg cptra_uc_rst_b_o = 'b0; + tri fw_update_rst_window_i; + reg fw_update_rst_window_o = 'bz; tri [`CLP_OBF_KEY_DWORDS-1:0][31:0] cptra_obf_key_reg_i; reg [`CLP_OBF_KEY_DWORDS-1:0][31:0] cptra_obf_key_reg_o = 'bz; tri [`CLP_OBF_FE_DWORDS-1:0][31:0] obf_field_entropy_i; @@ -124,8 +126,12 @@ end reg sha_error_intr_o = 'bz; tri sha_notif_intr_i; reg sha_notif_intr_o = 'bz; + tri timer_intr_i; + reg timer_intr_o = 'bz; tri [31:0] nmi_vector_i; reg [31:0] nmi_vector_o = 'bz; + tri nmi_intr_i; + reg nmi_intr_o = 'bz; tri iccm_lock_i; reg iccm_lock_o = 'bz; @@ -145,6 +151,8 @@ end assign cptra_noncore_rst_b_i = bus.cptra_noncore_rst_b; assign bus.cptra_uc_rst_b = (initiator_responder == INITIATOR) ? cptra_uc_rst_b_o : 'bz; assign cptra_uc_rst_b_i = bus.cptra_uc_rst_b; + assign bus.fw_update_rst_window = (initiator_responder == INITIATOR) ? fw_update_rst_window_o : 'bz; + assign fw_update_rst_window_i = bus.fw_update_rst_window; assign bus.cptra_obf_key_reg = (initiator_responder == INITIATOR) ? cptra_obf_key_reg_o : 'bz; assign cptra_obf_key_reg_i = bus.cptra_obf_key_reg; assign bus.obf_field_entropy = (initiator_responder == INITIATOR) ? obf_field_entropy_o : 'bz; @@ -159,8 +167,12 @@ end assign sha_error_intr_i = bus.sha_error_intr; assign bus.sha_notif_intr = (initiator_responder == INITIATOR) ? sha_notif_intr_o : 'bz; assign sha_notif_intr_i = bus.sha_notif_intr; + assign bus.timer_intr = (initiator_responder == INITIATOR) ? timer_intr_o : 'bz; + assign timer_intr_i = bus.timer_intr; assign bus.nmi_vector = (initiator_responder == INITIATOR) ? nmi_vector_o : 'bz; assign nmi_vector_i = bus.nmi_vector; + assign bus.nmi_intr = (initiator_responder == INITIATOR) ? nmi_intr_o : 'bz; + assign nmi_intr_i = bus.nmi_intr; assign bus.iccm_lock = (initiator_responder == INITIATOR) ? iccm_lock_o : 'bz; assign iccm_lock_i = bus.iccm_lock; @@ -196,6 +208,7 @@ end // INITIATOR mode output signals cptra_noncore_rst_b_o <= 'b0; cptra_uc_rst_b_o <= 'b0; + fw_update_rst_window_o <= 'bz; cptra_obf_key_reg_o <= 'bz; obf_field_entropy_o <= 'bz; obf_uds_seed_o <= 'bz; @@ -203,7 +216,9 @@ end soc_ifc_notif_intr_o <= 'bz; sha_error_intr_o <= 'bz; sha_notif_intr_o <= 'bz; + timer_intr_o <= 'bz; nmi_vector_o <= 'bz; + nmi_intr_o <= 'bz; iccm_lock_o <= 'bz; // Bi-directional signals @@ -220,6 +235,7 @@ end else return |(cptra_noncore_rst_b_i ^ cptra_noncore_rst_b_o ) || |(cptra_uc_rst_b_i ^ cptra_uc_rst_b_o ) || + |(fw_update_rst_window_i ^ fw_update_rst_window_o ) || |(cptra_obf_key_reg_i ^ cptra_obf_key_reg_o ) || |(obf_field_entropy_i ^ obf_field_entropy_o ) || |(obf_uds_seed_i ^ obf_uds_seed_o ) || @@ -227,7 +243,9 @@ end |(soc_ifc_notif_intr_i & !soc_ifc_notif_intr_o ) || |(sha_error_intr_i & !sha_error_intr_o ) || |(sha_notif_intr_i & !sha_notif_intr_o ) || + |(timer_intr_i & !timer_intr_o ) || |(nmi_vector_i ^ nmi_vector_o ) || + |(nmi_intr_i & !nmi_intr_o ) || |(iccm_lock_i ^ iccm_lock_o ); endfunction // pragma uvmf custom interface_item_additional end @@ -267,24 +285,30 @@ end // bit soc_ifc_notif_intr_pending ; // bit sha_err_intr_pending ; // bit sha_notif_intr_pending ; + // bit timer_intr_pending ; // bit noncore_rst_asserted ; // bit uc_rst_asserted ; + // bit fw_update_rst_window ; // bit [`CLP_OBF_KEY_DWORDS-1:0] [31:0] cptra_obf_key_reg ; // bit [`CLP_OBF_FE_DWORDS-1:0] [31:0] obf_field_entropy ; // bit [`CLP_OBF_UDS_DWORDS-1:0] [31:0] obf_uds_seed ; // bit [31:0] nmi_vector ; + // bit nmi_intr_pending ; // bit iccm_locked ; // Members within the cptra_status_responder_struct: // bit soc_ifc_err_intr_pending ; // bit soc_ifc_notif_intr_pending ; // bit sha_err_intr_pending ; // bit sha_notif_intr_pending ; + // bit timer_intr_pending ; // bit noncore_rst_asserted ; // bit uc_rst_asserted ; + // bit fw_update_rst_window ; // bit [`CLP_OBF_KEY_DWORDS-1:0] [31:0] cptra_obf_key_reg ; // bit [`CLP_OBF_FE_DWORDS-1:0] [31:0] obf_field_entropy ; // bit [`CLP_OBF_UDS_DWORDS-1:0] [31:0] obf_uds_seed ; // bit [31:0] nmi_vector ; + // bit nmi_intr_pending ; // bit iccm_locked ; initiator_struct = cptra_status_initiator_struct; // @@ -302,6 +326,7 @@ end // Initiator output signals // cptra_noncore_rst_b_o <= cptra_status_initiator_struct.xyz; // // cptra_uc_rst_b_o <= cptra_status_initiator_struct.xyz; // + // fw_update_rst_window_o <= cptra_status_initiator_struct.xyz; // // cptra_obf_key_reg_o <= cptra_status_initiator_struct.xyz; // [`CLP_OBF_KEY_DWORDS-1:0][31:0] // obf_field_entropy_o <= cptra_status_initiator_struct.xyz; // [`CLP_OBF_FE_DWORDS-1:0][31:0] // obf_uds_seed_o <= cptra_status_initiator_struct.xyz; // [`CLP_OBF_UDS_DWORDS-1:0][31:0] @@ -309,7 +334,9 @@ end // soc_ifc_notif_intr_o <= cptra_status_initiator_struct.xyz; // // sha_error_intr_o <= cptra_status_initiator_struct.xyz; // // sha_notif_intr_o <= cptra_status_initiator_struct.xyz; // + // timer_intr_o <= cptra_status_initiator_struct.xyz; // // nmi_vector_o <= cptra_status_initiator_struct.xyz; // [31:0] + // nmi_intr_o <= cptra_status_initiator_struct.xyz; // // iccm_lock_o <= cptra_status_initiator_struct.xyz; // // Initiator inout signals // Initiate a transfer using the data received. @@ -346,24 +373,30 @@ bit first_transfer=1; // bit soc_ifc_notif_intr_pending ; // bit sha_err_intr_pending ; // bit sha_notif_intr_pending ; + // bit timer_intr_pending ; // bit noncore_rst_asserted ; // bit uc_rst_asserted ; + // bit fw_update_rst_window ; // bit [`CLP_OBF_KEY_DWORDS-1:0] [31:0] cptra_obf_key_reg ; // bit [`CLP_OBF_FE_DWORDS-1:0] [31:0] obf_field_entropy ; // bit [`CLP_OBF_UDS_DWORDS-1:0] [31:0] obf_uds_seed ; // bit [31:0] nmi_vector ; + // bit nmi_intr_pending ; // bit iccm_locked ; // Variables within the cptra_status_responder_struct: // bit soc_ifc_err_intr_pending ; // bit soc_ifc_notif_intr_pending ; // bit sha_err_intr_pending ; // bit sha_notif_intr_pending ; + // bit timer_intr_pending ; // bit noncore_rst_asserted ; // bit uc_rst_asserted ; + // bit fw_update_rst_window ; // bit [`CLP_OBF_KEY_DWORDS-1:0] [31:0] cptra_obf_key_reg ; // bit [`CLP_OBF_FE_DWORDS-1:0] [31:0] obf_field_entropy ; // bit [`CLP_OBF_UDS_DWORDS-1:0] [31:0] obf_uds_seed ; // bit [31:0] nmi_vector ; + // bit nmi_intr_pending ; // bit iccm_locked ; // Reference code; // How to wait for signal value @@ -374,6 +407,7 @@ bit first_transfer=1; // Responder input signals // cptra_status_responder_struct.xyz = cptra_noncore_rst_b_i; // // cptra_status_responder_struct.xyz = cptra_uc_rst_b_i; // + // cptra_status_responder_struct.xyz = fw_update_rst_window_i; // // cptra_status_responder_struct.xyz = cptra_obf_key_reg_i; // [`CLP_OBF_KEY_DWORDS-1:0][31:0] // cptra_status_responder_struct.xyz = obf_field_entropy_i; // [`CLP_OBF_FE_DWORDS-1:0][31:0] // cptra_status_responder_struct.xyz = obf_uds_seed_i; // [`CLP_OBF_UDS_DWORDS-1:0][31:0] @@ -381,7 +415,9 @@ bit first_transfer=1; // cptra_status_responder_struct.xyz = soc_ifc_notif_intr_i; // // cptra_status_responder_struct.xyz = sha_error_intr_i; // // cptra_status_responder_struct.xyz = sha_notif_intr_i; // + // cptra_status_responder_struct.xyz = timer_intr_i; // // cptra_status_responder_struct.xyz = nmi_vector_i; // [31:0] + // cptra_status_responder_struct.xyz = nmi_intr_i; // // cptra_status_responder_struct.xyz = iccm_lock_i; // // Responder inout signals // How to assign a signal, named xyz, from an initiator struct member. @@ -400,16 +436,19 @@ bit first_transfer=1; // end // Wait for next transfer then gather info from intiator about the transfer. // Place the data into the cptra_status_initiator_struct. - do begin + @(posedge clk_i); + while (!any_signal_changed()) begin soc_ifc_error_intr_o <= soc_ifc_error_intr_i; soc_ifc_notif_intr_o <= soc_ifc_notif_intr_i; sha_error_intr_o <= sha_error_intr_i ; sha_notif_intr_o <= sha_notif_intr_i ; + timer_intr_o <= timer_intr_i ; + nmi_intr_o <= nmi_intr_i ; @(posedge clk_i); end - while (!any_signal_changed()); cptra_noncore_rst_b_o <= cptra_noncore_rst_b_i ; cptra_uc_rst_b_o <= cptra_uc_rst_b_i ; + fw_update_rst_window_o <= fw_update_rst_window_i; cptra_obf_key_reg_o <= cptra_obf_key_reg_i ; obf_field_entropy_o <= obf_field_entropy_i ; obf_uds_seed_o <= obf_uds_seed_i ; @@ -417,7 +456,9 @@ bit first_transfer=1; soc_ifc_notif_intr_o <= soc_ifc_notif_intr_i ; sha_error_intr_o <= sha_error_intr_i ; sha_notif_intr_o <= sha_notif_intr_i ; + timer_intr_o <= timer_intr_i ; nmi_vector_o <= nmi_vector_i ; + nmi_intr_o <= nmi_intr_i ; iccm_lock_o <= iccm_lock_i ; // @(posedge clk_i); first_transfer = 0; @@ -427,12 +468,15 @@ bit first_transfer=1; cptra_status_initiator_struct.soc_ifc_notif_intr_pending = soc_ifc_notif_intr_i; cptra_status_initiator_struct.sha_err_intr_pending = sha_error_intr_i; cptra_status_initiator_struct.sha_notif_intr_pending = sha_notif_intr_i; + cptra_status_initiator_struct.timer_intr_pending = timer_intr_i; cptra_status_initiator_struct.noncore_rst_asserted = !cptra_noncore_rst_b_i; cptra_status_initiator_struct.uc_rst_asserted = !cptra_uc_rst_b_i; + cptra_status_initiator_struct.fw_update_rst_window = fw_update_rst_window_i; cptra_status_initiator_struct.cptra_obf_key_reg = cptra_obf_key_reg_i; cptra_status_initiator_struct.obf_field_entropy = obf_field_entropy_i; cptra_status_initiator_struct.obf_uds_seed = obf_uds_seed_i; cptra_status_initiator_struct.nmi_vector = nmi_vector_i; + cptra_status_initiator_struct.nmi_intr_pending = nmi_intr_i; cptra_status_initiator_struct.iccm_locked = iccm_lock_i; end endtask diff --git a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/interface_packages/cptra_status_pkg/src/cptra_status_if.sv b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/interface_packages/cptra_status_pkg/src/cptra_status_if.sv index 3835f69b7..15468ad29 100644 --- a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/interface_packages/cptra_status_pkg/src/cptra_status_if.sv +++ b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/interface_packages/cptra_status_pkg/src/cptra_status_if.sv @@ -35,6 +35,7 @@ // // .dut_signal_port(cptra_status_bus.cptra_noncore_rst_b), // Agent output // .dut_signal_port(cptra_status_bus.cptra_uc_rst_b), // Agent output +// .dut_signal_port(cptra_status_bus.fw_update_rst_window), // Agent output // .dut_signal_port(cptra_status_bus.cptra_obf_key_reg), // Agent output // .dut_signal_port(cptra_status_bus.obf_field_entropy), // Agent output // .dut_signal_port(cptra_status_bus.obf_uds_seed), // Agent output @@ -42,7 +43,9 @@ // .dut_signal_port(cptra_status_bus.soc_ifc_notif_intr), // Agent output // .dut_signal_port(cptra_status_bus.sha_error_intr), // Agent output // .dut_signal_port(cptra_status_bus.sha_notif_intr), // Agent output +// .dut_signal_port(cptra_status_bus.timer_intr), // Agent output // .dut_signal_port(cptra_status_bus.nmi_vector), // Agent output +// .dut_signal_port(cptra_status_bus.nmi_intr), // Agent output // .dut_signal_port(cptra_status_bus.iccm_lock), // Agent output import uvmf_base_pkg_hdl::*; @@ -55,6 +58,7 @@ interface cptra_status_if input tri dummy, inout tri cptra_noncore_rst_b, inout tri cptra_uc_rst_b, + inout tri fw_update_rst_window, inout tri [`CLP_OBF_KEY_DWORDS-1:0][31:0] cptra_obf_key_reg, inout tri [`CLP_OBF_FE_DWORDS-1:0][31:0] obf_field_entropy, inout tri [`CLP_OBF_UDS_DWORDS-1:0][31:0] obf_uds_seed, @@ -62,7 +66,9 @@ interface cptra_status_if inout tri soc_ifc_notif_intr, inout tri sha_error_intr, inout tri sha_notif_intr, + inout tri timer_intr, inout tri [31:0] nmi_vector, + inout tri nmi_intr, inout tri iccm_lock ); @@ -72,6 +78,7 @@ modport monitor_port input dummy, input cptra_noncore_rst_b, input cptra_uc_rst_b, + input fw_update_rst_window, input cptra_obf_key_reg, input obf_field_entropy, input obf_uds_seed, @@ -79,7 +86,9 @@ modport monitor_port input soc_ifc_notif_intr, input sha_error_intr, input sha_notif_intr, + input timer_intr, input nmi_vector, + input nmi_intr, input iccm_lock ); @@ -89,6 +98,7 @@ modport initiator_port input dummy, output cptra_noncore_rst_b, output cptra_uc_rst_b, + output fw_update_rst_window, output cptra_obf_key_reg, output obf_field_entropy, output obf_uds_seed, @@ -96,7 +106,9 @@ modport initiator_port output soc_ifc_notif_intr, output sha_error_intr, output sha_notif_intr, + output timer_intr, output nmi_vector, + output nmi_intr, output iccm_lock ); @@ -106,6 +118,7 @@ modport responder_port input dummy, input cptra_noncore_rst_b, input cptra_uc_rst_b, + input fw_update_rst_window, input cptra_obf_key_reg, input obf_field_entropy, input obf_uds_seed, @@ -113,7 +126,9 @@ modport responder_port input soc_ifc_notif_intr, input sha_error_intr, input sha_notif_intr, + input timer_intr, input nmi_vector, + input nmi_intr, input iccm_lock ); diff --git a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/interface_packages/cptra_status_pkg/src/cptra_status_macros.svh b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/interface_packages/cptra_status_pkg/src/cptra_status_macros.svh index 7afa64a0a..c17f0bbe4 100644 --- a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/interface_packages/cptra_status_pkg/src/cptra_status_macros.svh +++ b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/interface_packages/cptra_status_pkg/src/cptra_status_macros.svh @@ -67,12 +67,15 @@ typedef struct packed { \ bit soc_ifc_notif_intr_pending ; \ bit sha_err_intr_pending ; \ bit sha_notif_intr_pending ; \ + bit timer_intr_pending ; \ bit noncore_rst_asserted ; \ bit uc_rst_asserted ; \ + bit fw_update_rst_window ; \ bit [`CLP_OBF_KEY_DWORDS-1:0] [31:0] cptra_obf_key_reg ; \ bit [`CLP_OBF_FE_DWORDS-1:0] [31:0] obf_field_entropy ; \ bit [`CLP_OBF_UDS_DWORDS-1:0] [31:0] obf_uds_seed ; \ bit [31:0] nmi_vector ; \ + bit nmi_intr_pending ; \ bit iccm_locked ; \ } cptra_status_monitor_s; @@ -84,12 +87,15 @@ typedef struct packed { \ this.soc_ifc_notif_intr_pending , \ this.sha_err_intr_pending , \ this.sha_notif_intr_pending , \ + this.timer_intr_pending , \ this.noncore_rst_asserted , \ this.uc_rst_asserted , \ + this.fw_update_rst_window , \ this.cptra_obf_key_reg , \ this.obf_field_entropy , \ this.obf_uds_seed , \ this.nmi_vector , \ + this.nmi_intr_pending , \ this.iccm_locked \ };\ return ( cptra_status_monitor_struct);\ @@ -102,12 +108,15 @@ typedef struct packed { \ this.soc_ifc_notif_intr_pending , \ this.sha_err_intr_pending , \ this.sha_notif_intr_pending , \ + this.timer_intr_pending , \ this.noncore_rst_asserted , \ this.uc_rst_asserted , \ + this.fw_update_rst_window , \ this.cptra_obf_key_reg , \ this.obf_field_entropy , \ this.obf_uds_seed , \ this.nmi_vector , \ + this.nmi_intr_pending , \ this.iccm_locked \ } = cptra_status_monitor_struct;\ endfunction @@ -122,12 +131,15 @@ typedef struct packed { \ bit soc_ifc_notif_intr_pending ; \ bit sha_err_intr_pending ; \ bit sha_notif_intr_pending ; \ + bit timer_intr_pending ; \ bit noncore_rst_asserted ; \ bit uc_rst_asserted ; \ + bit fw_update_rst_window ; \ bit [`CLP_OBF_KEY_DWORDS-1:0] [31:0] cptra_obf_key_reg ; \ bit [`CLP_OBF_FE_DWORDS-1:0] [31:0] obf_field_entropy ; \ bit [`CLP_OBF_UDS_DWORDS-1:0] [31:0] obf_uds_seed ; \ bit [31:0] nmi_vector ; \ + bit nmi_intr_pending ; \ bit iccm_locked ; \ } cptra_status_initiator_s; @@ -139,12 +151,15 @@ typedef struct packed { \ this.soc_ifc_notif_intr_pending , \ this.sha_err_intr_pending , \ this.sha_notif_intr_pending , \ + this.timer_intr_pending , \ this.noncore_rst_asserted , \ this.uc_rst_asserted , \ + this.fw_update_rst_window , \ this.cptra_obf_key_reg , \ this.obf_field_entropy , \ this.obf_uds_seed , \ this.nmi_vector , \ + this.nmi_intr_pending , \ this.iccm_locked \ };\ return ( cptra_status_initiator_struct);\ @@ -157,12 +172,15 @@ typedef struct packed { \ this.soc_ifc_notif_intr_pending , \ this.sha_err_intr_pending , \ this.sha_notif_intr_pending , \ + this.timer_intr_pending , \ this.noncore_rst_asserted , \ this.uc_rst_asserted , \ + this.fw_update_rst_window , \ this.cptra_obf_key_reg , \ this.obf_field_entropy , \ this.obf_uds_seed , \ this.nmi_vector , \ + this.nmi_intr_pending , \ this.iccm_locked \ } = cptra_status_initiator_struct;\ endfunction @@ -177,12 +195,15 @@ typedef struct packed { \ bit soc_ifc_notif_intr_pending ; \ bit sha_err_intr_pending ; \ bit sha_notif_intr_pending ; \ + bit timer_intr_pending ; \ bit noncore_rst_asserted ; \ bit uc_rst_asserted ; \ + bit fw_update_rst_window ; \ bit [`CLP_OBF_KEY_DWORDS-1:0] [31:0] cptra_obf_key_reg ; \ bit [`CLP_OBF_FE_DWORDS-1:0] [31:0] obf_field_entropy ; \ bit [`CLP_OBF_UDS_DWORDS-1:0] [31:0] obf_uds_seed ; \ bit [31:0] nmi_vector ; \ + bit nmi_intr_pending ; \ bit iccm_locked ; \ } cptra_status_responder_s; @@ -194,12 +215,15 @@ typedef struct packed { \ this.soc_ifc_notif_intr_pending , \ this.sha_err_intr_pending , \ this.sha_notif_intr_pending , \ + this.timer_intr_pending , \ this.noncore_rst_asserted , \ this.uc_rst_asserted , \ + this.fw_update_rst_window , \ this.cptra_obf_key_reg , \ this.obf_field_entropy , \ this.obf_uds_seed , \ this.nmi_vector , \ + this.nmi_intr_pending , \ this.iccm_locked \ };\ return ( cptra_status_responder_struct);\ @@ -212,12 +236,15 @@ typedef struct packed { \ this.soc_ifc_notif_intr_pending , \ this.sha_err_intr_pending , \ this.sha_notif_intr_pending , \ + this.timer_intr_pending , \ this.noncore_rst_asserted , \ this.uc_rst_asserted , \ + this.fw_update_rst_window , \ this.cptra_obf_key_reg , \ this.obf_field_entropy , \ this.obf_uds_seed , \ this.nmi_vector , \ + this.nmi_intr_pending , \ this.iccm_locked \ } = cptra_status_responder_struct;\ endfunction diff --git a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/interface_packages/cptra_status_pkg/src/cptra_status_monitor.svh b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/interface_packages/cptra_status_pkg/src/cptra_status_monitor.svh index ce2b62266..50d6612ba 100644 --- a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/interface_packages/cptra_status_pkg/src/cptra_status_monitor.svh +++ b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/interface_packages/cptra_status_pkg/src/cptra_status_monitor.svh @@ -103,7 +103,8 @@ endclass // pragma uvmf custom external begin task cptra_status_monitor::handle_reset(string kind = "HARD"); - txn_key = 0; + if (kind inside {"HARD", "NONCORE"}) + txn_key = 0; endtask // pragma uvmf custom external end diff --git a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/interface_packages/cptra_status_pkg/src/cptra_status_monitor_bfm.sv b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/interface_packages/cptra_status_pkg/src/cptra_status_monitor_bfm.sv index 62ecb025a..9932169ff 100644 --- a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/interface_packages/cptra_status_pkg/src/cptra_status_monitor_bfm.sv +++ b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/interface_packages/cptra_status_pkg/src/cptra_status_monitor_bfm.sv @@ -85,6 +85,7 @@ end tri dummy_i; tri cptra_noncore_rst_b_i; tri cptra_uc_rst_b_i; + tri fw_update_rst_window_i; tri [`CLP_OBF_KEY_DWORDS-1:0][31:0] cptra_obf_key_reg_i; tri [`CLP_OBF_FE_DWORDS-1:0][31:0] obf_field_entropy_i; tri [`CLP_OBF_UDS_DWORDS-1:0][31:0] obf_uds_seed_i; @@ -92,12 +93,15 @@ end tri soc_ifc_notif_intr_i; tri sha_error_intr_i; tri sha_notif_intr_i; + tri timer_intr_i; tri [31:0] nmi_vector_i; + tri nmi_intr_i; tri iccm_lock_i; assign clk_i = bus.clk; assign dummy_i = bus.dummy; assign cptra_noncore_rst_b_i = bus.cptra_noncore_rst_b; assign cptra_uc_rst_b_i = bus.cptra_uc_rst_b; + assign fw_update_rst_window_i = bus.fw_update_rst_window; assign cptra_obf_key_reg_i = bus.cptra_obf_key_reg; assign obf_field_entropy_i = bus.obf_field_entropy; assign obf_uds_seed_i = bus.obf_uds_seed; @@ -105,7 +109,9 @@ end assign soc_ifc_notif_intr_i = bus.soc_ifc_notif_intr; assign sha_error_intr_i = bus.sha_error_intr; assign sha_notif_intr_i = bus.sha_notif_intr; + assign timer_intr_i = bus.timer_intr; assign nmi_vector_i = bus.nmi_vector; + assign nmi_intr_i = bus.nmi_intr; assign iccm_lock_i = bus.iccm_lock; // Proxy handle to UVM monitor @@ -115,6 +121,7 @@ end // pragma uvmf custom interface_item_additional begin reg cptra_noncore_rst_b_o = 'b0; reg cptra_uc_rst_b_o = 'b0; + reg fw_update_rst_window_o = 'b0; reg [`CLP_OBF_KEY_DWORDS-1:0][31:0] cptra_obf_key_reg_o = 'b0; reg [`CLP_OBF_FE_DWORDS-1:0][31:0] obf_field_entropy_o = 'b0; reg [`CLP_OBF_UDS_DWORDS-1:0][31:0] obf_uds_seed_o = 'b0; @@ -122,7 +129,9 @@ end reg soc_ifc_notif_intr_o = 'b0; reg sha_error_intr_o = 'b0; reg sha_notif_intr_o = 'b0; + reg timer_intr_o = 'b0; reg [31:0] nmi_vector_o = 'b0; + reg nmi_intr_o = 'b0; reg iccm_lock_o = 'b0; function bit any_signal_changed(); if (!cptra_noncore_rst_b_o) @@ -133,6 +142,7 @@ end else return |(cptra_noncore_rst_b_i ^ cptra_noncore_rst_b_o ) || |(cptra_uc_rst_b_i ^ cptra_uc_rst_b_o ) || + |(fw_update_rst_window_i ^ fw_update_rst_window_o ) || |(cptra_obf_key_reg_i ^ cptra_obf_key_reg_o ) || |(obf_field_entropy_i ^ obf_field_entropy_o ) || |(obf_uds_seed_i ^ obf_uds_seed_o ) || @@ -140,7 +150,9 @@ end |(soc_ifc_notif_intr_i & !soc_ifc_notif_intr_o ) || |(sha_error_intr_i & !sha_error_intr_o ) || |(sha_notif_intr_i & !sha_notif_intr_o ) || + |(timer_intr_i & !timer_intr_o ) || |(nmi_vector_i ^ nmi_vector_o ) || + |(nmi_intr_i & !nmi_intr_o ) || |(iccm_lock_i ^ iccm_lock_o ); endfunction // pragma uvmf custom interface_item_additional end @@ -159,13 +171,17 @@ end // pragma uvmf custom reset_condition end endtask - //****************************************************************** - - task wait_for_num_clocks(input int unsigned count); // pragma tbx xtf + // pragma uvmf custom wait_for_num_clocks begin + //**************************************************************************** + // Inject pragmas's here to throw a warning on regeneration. + // Task must have automatic lifetime so that it can be concurrently invoked + // by multiple entities with a different wait value. + task automatic wait_for_num_clocks(input int unsigned count); // pragma tbx xtf + if (count == 0) `uvm_fatal("CFG", "wait_for_num_clocks called with count of 0 - this will lead to a hang"); @(posedge clk_i); - repeat (count-1) @(posedge clk_i); endtask + // pragma uvmf custom wait_for_num_clocks end //****************************************************************** event go; @@ -210,12 +226,15 @@ end // // cptra_status_monitor_struct.soc_ifc_notif_intr_pending // // cptra_status_monitor_struct.sha_err_intr_pending // // cptra_status_monitor_struct.sha_notif_intr_pending + // // cptra_status_monitor_struct.timer_intr_pending // // cptra_status_monitor_struct.noncore_rst_asserted // // cptra_status_monitor_struct.uc_rst_asserted + // // cptra_status_monitor_struct.fw_update_rst_window // // cptra_status_monitor_struct.cptra_obf_key_reg // // cptra_status_monitor_struct.obf_field_entropy // // cptra_status_monitor_struct.obf_uds_seed // // cptra_status_monitor_struct.nmi_vector + // // cptra_status_monitor_struct.nmi_intr_pending // // cptra_status_monitor_struct.iccm_locked // // // Reference code; @@ -226,6 +245,7 @@ end // All available input signals listed. // cptra_status_monitor_struct.xyz = cptra_noncore_rst_b_i; // // cptra_status_monitor_struct.xyz = cptra_uc_rst_b_i; // + // cptra_status_monitor_struct.xyz = fw_update_rst_window_i; // // cptra_status_monitor_struct.xyz = cptra_obf_key_reg_i; // [`CLP_OBF_KEY_DWORDS-1:0][31:0] // cptra_status_monitor_struct.xyz = obf_field_entropy_i; // [`CLP_OBF_FE_DWORDS-1:0][31:0] // cptra_status_monitor_struct.xyz = obf_uds_seed_i; // [`CLP_OBF_UDS_DWORDS-1:0][31:0] @@ -233,7 +253,9 @@ end // cptra_status_monitor_struct.xyz = soc_ifc_notif_intr_i; // // cptra_status_monitor_struct.xyz = sha_error_intr_i; // // cptra_status_monitor_struct.xyz = sha_notif_intr_i; // + // cptra_status_monitor_struct.xyz = timer_intr_i; // // cptra_status_monitor_struct.xyz = nmi_vector_i; // [31:0] + // cptra_status_monitor_struct.xyz = nmi_intr_i; // // cptra_status_monitor_struct.xyz = iccm_lock_i; // // pragma uvmf custom do_monitor begin // UVMF_CHANGE_ME : Implement protocol monitoring. The commented reference code @@ -253,10 +275,13 @@ end soc_ifc_notif_intr_o <= soc_ifc_notif_intr_i ; sha_error_intr_o <= sha_error_intr_i ; sha_notif_intr_o <= sha_notif_intr_i ; + timer_intr_o <= timer_intr_i ; + nmi_intr_o <= nmi_intr_i ; @(posedge clk_i); end cptra_noncore_rst_b_o <= cptra_noncore_rst_b_i ; cptra_uc_rst_b_o <= cptra_uc_rst_b_i ; + fw_update_rst_window_o <= fw_update_rst_window_i; cptra_obf_key_reg_o <= cptra_obf_key_reg_i ; obf_field_entropy_o <= obf_field_entropy_i ; obf_uds_seed_o <= obf_uds_seed_i ; @@ -264,21 +289,26 @@ end soc_ifc_notif_intr_o <= soc_ifc_notif_intr_i ; sha_error_intr_o <= sha_error_intr_i ; sha_notif_intr_o <= sha_notif_intr_i ; + timer_intr_o <= timer_intr_i ; nmi_vector_o <= nmi_vector_i ; + nmi_intr_o <= nmi_intr_i ; iccm_lock_o <= iccm_lock_i ; // @(posedge clk_i); begin: build_return_struct // Variables within the cptra_status_initiator_struct: cptra_status_monitor_struct.noncore_rst_asserted = !cptra_noncore_rst_b_i; cptra_status_monitor_struct.uc_rst_asserted = !cptra_uc_rst_b_i; + cptra_status_monitor_struct.fw_update_rst_window = fw_update_rst_window_i; cptra_status_monitor_struct.soc_ifc_err_intr_pending = soc_ifc_error_intr_i; cptra_status_monitor_struct.soc_ifc_notif_intr_pending = soc_ifc_notif_intr_i; cptra_status_monitor_struct.sha_err_intr_pending = sha_error_intr_i; cptra_status_monitor_struct.sha_notif_intr_pending = sha_notif_intr_i; + cptra_status_monitor_struct.timer_intr_pending = timer_intr_i; cptra_status_monitor_struct.cptra_obf_key_reg = cptra_obf_key_reg_i; cptra_status_monitor_struct.obf_field_entropy = obf_field_entropy_i; cptra_status_monitor_struct.obf_uds_seed = obf_uds_seed_i; cptra_status_monitor_struct.nmi_vector = nmi_vector_i; + cptra_status_monitor_struct.nmi_intr_pending = nmi_intr_i; cptra_status_monitor_struct.iccm_locked = iccm_lock_i; end // pragma uvmf custom do_monitor end diff --git a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/interface_packages/cptra_status_pkg/src/cptra_status_transaction.svh b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/interface_packages/cptra_status_pkg/src/cptra_status_transaction.svh index 106311533..5e8e7edb3 100644 --- a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/interface_packages/cptra_status_pkg/src/cptra_status_transaction.svh +++ b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/interface_packages/cptra_status_pkg/src/cptra_status_transaction.svh @@ -36,12 +36,15 @@ class cptra_status_transaction extends uvmf_transaction_base; bit soc_ifc_notif_intr_pending ; bit sha_err_intr_pending ; bit sha_notif_intr_pending ; + bit timer_intr_pending ; bit noncore_rst_asserted ; bit uc_rst_asserted ; + bit fw_update_rst_window ; bit [`CLP_OBF_KEY_DWORDS-1:0] [31:0] cptra_obf_key_reg ; bit [`CLP_OBF_FE_DWORDS-1:0] [31:0] obf_field_entropy ; bit [`CLP_OBF_UDS_DWORDS-1:0] [31:0] obf_uds_seed ; bit [31:0] nmi_vector ; + bit nmi_intr_pending ; bit iccm_locked ; //Constraints for the transaction variables: @@ -125,7 +128,7 @@ class cptra_status_transaction extends uvmf_transaction_base; virtual function string convert2string(); // pragma uvmf custom convert2string begin // UVMF_CHANGE_ME : Customize format if desired. - return $sformatf("soc_ifc_err_intr_pending:0x%x soc_ifc_notif_intr_pending:0x%x sha_err_intr_pending:0x%x sha_notif_intr_pending:0x%x noncore_rst_asserted:0x%x uc_rst_asserted:0x%x cptra_obf_key_reg:0x%x obf_field_entropy:0x%x obf_uds_seed:0x%x nmi_vector:0x%x iccm_locked:0x%x ",soc_ifc_err_intr_pending,soc_ifc_notif_intr_pending,sha_err_intr_pending,sha_notif_intr_pending,noncore_rst_asserted,uc_rst_asserted,cptra_obf_key_reg,obf_field_entropy,obf_uds_seed,nmi_vector,iccm_locked); + return $sformatf("soc_ifc_err_intr_pending:0x%x soc_ifc_notif_intr_pending:0x%x sha_err_intr_pending:0x%x sha_notif_intr_pending:0x%x timer_intr_pending:0x%x noncore_rst_asserted:0x%x uc_rst_asserted:0x%x fw_update_rst_window:0x%x cptra_obf_key_reg:0x%x obf_field_entropy:0x%x obf_uds_seed:0x%x nmi_vector:0x%x nmi_intr_pending:0x%x iccm_locked:0x%x %s",soc_ifc_err_intr_pending,soc_ifc_notif_intr_pending,sha_err_intr_pending,sha_notif_intr_pending,timer_intr_pending,noncore_rst_asserted,uc_rst_asserted,fw_update_rst_window,cptra_obf_key_reg,obf_field_entropy,obf_uds_seed,nmi_vector,nmi_intr_pending,iccm_locked,super.convert2string()); // pragma uvmf custom convert2string end endfunction @@ -157,12 +160,15 @@ class cptra_status_transaction extends uvmf_transaction_base; &&(this.soc_ifc_notif_intr_pending == RHS.soc_ifc_notif_intr_pending) &&(this.sha_err_intr_pending == RHS.sha_err_intr_pending) &&(this.sha_notif_intr_pending == RHS.sha_notif_intr_pending) + &&(this.timer_intr_pending == RHS.timer_intr_pending) &&(this.noncore_rst_asserted == RHS.noncore_rst_asserted) &&(this.uc_rst_asserted == RHS.uc_rst_asserted) + &&(this.fw_update_rst_window == RHS.fw_update_rst_window) &&(this.cptra_obf_key_reg == RHS.cptra_obf_key_reg) &&(this.obf_field_entropy == RHS.obf_field_entropy) &&(this.obf_uds_seed == RHS.obf_uds_seed) &&(this.nmi_vector == RHS.nmi_vector) + &&(this.nmi_intr_pending == RHS.nmi_intr_pending) &&(this.iccm_locked == RHS.iccm_locked) ); // pragma uvmf custom do_compare end @@ -182,12 +188,15 @@ class cptra_status_transaction extends uvmf_transaction_base; this.soc_ifc_notif_intr_pending = RHS.soc_ifc_notif_intr_pending; this.sha_err_intr_pending = RHS.sha_err_intr_pending; this.sha_notif_intr_pending = RHS.sha_notif_intr_pending; + this.timer_intr_pending = RHS.timer_intr_pending; this.noncore_rst_asserted = RHS.noncore_rst_asserted; this.uc_rst_asserted = RHS.uc_rst_asserted; + this.fw_update_rst_window = RHS.fw_update_rst_window; this.cptra_obf_key_reg = RHS.cptra_obf_key_reg; this.obf_field_entropy = RHS.obf_field_entropy; this.obf_uds_seed = RHS.obf_uds_seed; this.nmi_vector = RHS.nmi_vector; + this.nmi_intr_pending = RHS.nmi_intr_pending; this.iccm_locked = RHS.iccm_locked; // pragma uvmf custom do_copy end endfunction @@ -216,12 +225,15 @@ class cptra_status_transaction extends uvmf_transaction_base; $add_attribute(transaction_view_h,soc_ifc_notif_intr_pending,"soc_ifc_notif_intr_pending"); $add_attribute(transaction_view_h,sha_err_intr_pending,"sha_err_intr_pending"); $add_attribute(transaction_view_h,sha_notif_intr_pending,"sha_notif_intr_pending"); + $add_attribute(transaction_view_h,timer_intr_pending,"timer_intr_pending"); $add_attribute(transaction_view_h,noncore_rst_asserted,"noncore_rst_asserted"); $add_attribute(transaction_view_h,uc_rst_asserted,"uc_rst_asserted"); + $add_attribute(transaction_view_h,fw_update_rst_window,"fw_update_rst_window"); $add_attribute(transaction_view_h,cptra_obf_key_reg,"cptra_obf_key_reg"); $add_attribute(transaction_view_h,obf_field_entropy,"obf_field_entropy"); $add_attribute(transaction_view_h,obf_uds_seed,"obf_uds_seed"); $add_attribute(transaction_view_h,nmi_vector,"nmi_vector"); + $add_attribute(transaction_view_h,nmi_intr_pending,"nmi_intr_pending"); $add_attribute(transaction_view_h,iccm_locked,"iccm_locked"); // pragma uvmf custom add_to_wave end $end_transaction(transaction_view_h,end_time); diff --git a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/interface_packages/cptra_status_pkg/src/cptra_status_transaction_coverage.svh b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/interface_packages/cptra_status_pkg/src/cptra_status_transaction_coverage.svh index f5ab21302..e2b53b1f5 100644 --- a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/interface_packages/cptra_status_pkg/src/cptra_status_transaction_coverage.svh +++ b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/interface_packages/cptra_status_pkg/src/cptra_status_transaction_coverage.svh @@ -28,6 +28,11 @@ //---------------------------------------------------------------------- //---------------------------------------------------------------------- // +covergroup cptra_status_transaction_bit_cg with function sample(input bit val); + option.per_instance = 1; + ea_bit: coverpoint val; +endgroup + class cptra_status_transaction_coverage extends uvm_subscriber #(.T(cptra_status_transaction )); `uvm_component_utils( cptra_status_transaction_coverage ) @@ -35,6 +40,9 @@ class cptra_status_transaction_coverage extends uvm_subscriber #(.T(cptra_statu T coverage_trans; // pragma uvmf custom class_item_additional begin + cptra_status_transaction_bit_cg cptra_obf_key_reg_bit_cg[`CLP_OBF_KEY_DWORDS-1:0] [31:0]; + cptra_status_transaction_bit_cg obf_field_entropy_bit_cg[`CLP_OBF_FE_DWORDS -1:0] [31:0]; + cptra_status_transaction_bit_cg obf_uds_seed_bit_cg [`CLP_OBF_UDS_DWORDS-1:0] [31:0]; // pragma uvmf custom class_item_additional end // **************************************************************************** @@ -44,16 +52,77 @@ class cptra_status_transaction_coverage extends uvm_subscriber #(.T(cptra_statu option.auto_bin_max=1024; option.per_instance=1; soc_ifc_err_intr_pending: coverpoint coverage_trans.soc_ifc_err_intr_pending; + soc_ifc_err_intr_transition: coverpoint coverage_trans.soc_ifc_err_intr_pending { + bins rise = (0 => 1); + bins fall = (1 => 0); + } soc_ifc_notif_intr_pending: coverpoint coverage_trans.soc_ifc_notif_intr_pending; + soc_ifc_notif_intr_transition: coverpoint coverage_trans.soc_ifc_notif_intr_pending { + bins rise = (0 => 1); + bins fall = (1 => 0); + } sha_err_intr_pending: coverpoint coverage_trans.sha_err_intr_pending; + sha_err_intr_transition: coverpoint coverage_trans.sha_err_intr_pending { + bins rise = (0 => 1); + bins fall = (1 => 0); + } sha_notif_intr_pending: coverpoint coverage_trans.sha_notif_intr_pending; + sha_notif_intr_transition: coverpoint coverage_trans.sha_notif_intr_pending { + bins rise = (0 => 1); + bins fall = (1 => 0); + } + timer_intr_pending: coverpoint coverage_trans.timer_intr_pending; + timer_intr_transition: coverpoint coverage_trans.timer_intr_pending { + bins rise = (0 => 1); + bins fall = (1 => 0); + } noncore_rst_asserted: coverpoint coverage_trans.noncore_rst_asserted; + noncore_rst_transition: coverpoint coverage_trans.noncore_rst_asserted { + bins rise = (0 => 1); + bins fall = (1 => 0); + } uc_rst_asserted: coverpoint coverage_trans.uc_rst_asserted; - cptra_obf_key_reg: coverpoint coverage_trans.cptra_obf_key_reg; - obf_field_entropy: coverpoint coverage_trans.obf_field_entropy; - obf_uds_seed: coverpoint coverage_trans.obf_uds_seed; - nmi_vector: coverpoint coverage_trans.nmi_vector; + uc_rst_transition: coverpoint coverage_trans.uc_rst_asserted { + bins rise = (0 => 1); + bins fall = (1 => 0); + } + fw_update_rst_window: coverpoint coverage_trans.fw_update_rst_window; + fw_update_rst_window_transition: coverpoint coverage_trans.fw_update_rst_window { + bins rise = (0 => 1); + bins fall = (1 => 0); + } + cptra_obf_key_reg: coverpoint coverage_trans.cptra_obf_key_reg { + bins zero_key = {0}; + bins rand_key = {[1:{`CLP_OBF_KEY_DWORDS{32'hFFFF_FFFF}}-1]}; + bins ones_key = {{`CLP_OBF_KEY_DWORDS{32'hFFFF_FFFF}}}; + } + obf_field_entropy: coverpoint coverage_trans.obf_field_entropy { + bins zero_fe = {0}; + bins rand_fe = {[1:{`CLP_OBF_FE_DWORDS{32'hFFFF_FFFF}}-1]}; + bins ones_fe = {{`CLP_OBF_FE_DWORDS{32'hFFFF_FFFF}}}; + } + obf_uds_seed: coverpoint coverage_trans.obf_uds_seed { + bins zero_uds = {0}; + bins rand_uds = {[1:{`CLP_OBF_UDS_DWORDS{32'hFFFF_FFFF}}-1]}; + bins ones_uds = {{`CLP_OBF_UDS_DWORDS{32'hFFFF_FFFF}}}; + } + nmi_vector: coverpoint coverage_trans.nmi_vector { + bins zero = {32'h0}; + wildcard bins rom = {32'h0000_????}; + wildcard bins iccm = {32'h400?_????}; + wildcard bins set = (32'h0000_0000 => 32'h400?_????); + wildcard bins clr = (32'h400?_???? => 32'h0000_0000); + } + nmi_intr_pending: coverpoint coverage_trans.nmi_intr_pending; + nmi_intr_transition: coverpoint coverage_trans.nmi_intr_pending { + bins rise = (0 => 1); + bins fall = (1 => 0); + } iccm_locked: coverpoint coverage_trans.iccm_locked; + iccm_locked_transition: coverpoint coverage_trans.iccm_locked { + bins rise = (0 => 1); + bins fall = (1 => 0); + } // pragma uvmf custom covergroup end endgroup @@ -64,7 +133,9 @@ class cptra_status_transaction_coverage extends uvm_subscriber #(.T(cptra_statu function new(string name="", uvm_component parent=null); super.new(name,parent); cptra_status_transaction_cg=new; - `uvm_warning("COVERAGE_MODEL_REVIEW", "A covergroup has been constructed which may need review because of either generation or re-generation with merging. Please note that transaction variables added as a result of re-generation and merging are not automatically added to the covergroup. Remove this warning after the covergroup has been reviewed.") + foreach (coverage_trans.cptra_obf_key_reg[dw,bt]) cptra_obf_key_reg_bit_cg[dw][bt] = new; + foreach (coverage_trans.obf_field_entropy[dw,bt]) obf_field_entropy_bit_cg[dw][bt] = new; + foreach (coverage_trans.obf_uds_seed [dw,bt]) obf_uds_seed_bit_cg [dw][bt] = new; endfunction // **************************************************************************** @@ -73,6 +144,9 @@ class cptra_status_transaction_coverage extends uvm_subscriber #(.T(cptra_statu // function void build_phase(uvm_phase phase); cptra_status_transaction_cg.set_inst_name($sformatf("cptra_status_transaction_cg_%s",get_full_name())); + foreach (coverage_trans.cptra_obf_key_reg[dw,bt]) cptra_obf_key_reg_bit_cg[dw][bt].set_inst_name($sformatf("cptra_obf_key_reg_bit_cg_%d_%d_%s",dw, bt, get_full_name())); + foreach (coverage_trans.obf_field_entropy[dw,bt]) obf_field_entropy_bit_cg[dw][bt].set_inst_name($sformatf("obf_field_entropy_bit_cg_%d_%d_%s",dw, bt, get_full_name())); + foreach (coverage_trans.obf_uds_seed [dw,bt]) obf_uds_seed_bit_cg [dw][bt].set_inst_name($sformatf("obf_uds_seed_bit_cg_%d_%d_%s",dw, bt, get_full_name())); endfunction // **************************************************************************** @@ -85,6 +159,9 @@ class cptra_status_transaction_coverage extends uvm_subscriber #(.T(cptra_statu `uvm_info("COV","Received transaction",UVM_HIGH); coverage_trans = t; cptra_status_transaction_cg.sample(); + foreach (coverage_trans.cptra_obf_key_reg[dw,bt]) cptra_obf_key_reg_bit_cg[dw][bt].sample(coverage_trans.cptra_obf_key_reg[dw][bt]); + foreach (coverage_trans.obf_field_entropy[dw,bt]) obf_field_entropy_bit_cg[dw][bt].sample(coverage_trans.obf_field_entropy[dw][bt]); + foreach (coverage_trans.obf_uds_seed [dw,bt]) obf_uds_seed_bit_cg [dw][bt].sample(coverage_trans.obf_uds_seed [dw][bt]); endfunction endclass diff --git a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/interface_packages/cptra_status_pkg/yaml/cptra_status_interface.yaml b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/interface_packages/cptra_status_pkg/yaml/cptra_status_interface.yaml index f1c95429b..9622bc4dd 100644 --- a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/interface_packages/cptra_status_pkg/yaml/cptra_status_interface.yaml +++ b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/interface_packages/cptra_status_pkg/yaml/cptra_status_interface.yaml @@ -20,6 +20,10 @@ uvmf: name: cptra_uc_rst_b reset_value: '''bz' width: '1' + - dir: output + name: fw_update_rst_window + reset_value: '''bz' + width: '1' - dir: output name: cptra_obf_key_reg reset_value: '''bz' @@ -48,10 +52,18 @@ uvmf: name: sha_notif_intr reset_value: '''bz' width: '1' + - dir: output + name: timer_intr + reset_value: '''bz' + width: '1' - dir: output name: nmi_vector reset_value: '''bz' width: '32' + - dir: output + name: nmi_intr + reset_value: '''bz' + width: '1' - dir: output name: iccm_lock reset_value: '''bz' @@ -84,6 +96,12 @@ uvmf: name: sha_notif_intr_pending type: bit unpacked_dimension: '' + - comment: '' + iscompare: 'True' + isrand: 'False' + name: timer_intr_pending + type: bit + unpacked_dimension: '' - comment: '' iscompare: 'True' isrand: 'False' @@ -96,6 +114,12 @@ uvmf: name: uc_rst_asserted type: bit unpacked_dimension: '' + - comment: '' + iscompare: 'True' + isrand: 'False' + name: fw_update_rst_window + type: bit + unpacked_dimension: '' - comment: '' iscompare: 'True' isrand: 'False' @@ -120,6 +144,12 @@ uvmf: name: nmi_vector type: bit [31:0] unpacked_dimension: '' + - comment: '' + iscompare: 'True' + isrand: 'False' + name: nmi_intr_pending + type: bit + unpacked_dimension: '' - comment: '' iscompare: 'True' isrand: 'False' diff --git a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/interface_packages/mbox_sram_pkg/.project b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/interface_packages/mbox_sram_pkg/.project new file mode 100644 index 000000000..25262dcd1 --- /dev/null +++ b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/interface_packages/mbox_sram_pkg/.project @@ -0,0 +1,30 @@ + + + mbox_sram_pkg + + + + + + org.python.pydev.PyDevBuilder + + + + + net.sf.sveditor.core.SVProjectBuilder + + + + + + net.sf.sveditor.core.SVNature + org.python.pydev.pythonNature + + + + UVMF_VIP_LIBRARY_HOME + $%7BPARENT-2-PROJECT_LOC%7D + + + + diff --git a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/interface_packages/mbox_sram_pkg/.svproject b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/interface_packages/mbox_sram_pkg/.svproject new file mode 100644 index 000000000..82ebbab03 --- /dev/null +++ b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/interface_packages/mbox_sram_pkg/.svproject @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/interface_packages/mbox_sram_pkg/Makefile b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/interface_packages/mbox_sram_pkg/Makefile new file mode 100644 index 000000000..60c82949b --- /dev/null +++ b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/interface_packages/mbox_sram_pkg/Makefile @@ -0,0 +1,66 @@ +# mbox_sram interface packages source +# pragma uvmf custom additional begin +# pragma uvmf custom additional end + +mbox_sram_PKG = \ + +incdir+$(UVMF_VIP_LIBRARY_HOME)/interface_packages/mbox_sram_pkg \ + -F $(UVMF_VIP_LIBRARY_HOME)/interface_packages/mbox_sram_pkg/mbox_sram_filelist_hvl.f + +mbox_sram_PKG_HDL = \ + +incdir+$(UVMF_VIP_LIBRARY_HOME)/interface_packages/mbox_sram_pkg \ + -F $(UVMF_VIP_LIBRARY_HOME)/interface_packages/mbox_sram_pkg/mbox_sram_filelist_hdl.f + +mbox_sram_PKG_XRTL = \ + +incdir+$(UVMF_VIP_LIBRARY_HOME)/interface_packages/mbox_sram_pkg \ + -F $(UVMF_VIP_LIBRARY_HOME)/interface_packages/mbox_sram_pkg/mbox_sram_filelist_xrtl.f + +COMP_mbox_sram_PKG_TGT_0 = q_comp_mbox_sram_pkg +COMP_mbox_sram_PKG_TGT_1 = v_comp_mbox_sram_pkg +COMP_mbox_sram_PKG_TGT = $(COMP_mbox_sram_PKG_TGT_$(USE_VELOCE)) + +comp_mbox_sram_pkg: $(COMP_mbox_sram_PKG_TGT) + +q_comp_mbox_sram_pkg: + $(HDL_COMP_CMD) $(mbox_sram_PKG_HDL) + $(HVL_COMP_CMD) $(mbox_sram_PKG) + $(HDL_COMP_CMD) $(mbox_sram_PKG_XRTL) + +v_comp_mbox_sram_pkg: + $(HVL_COMP_CMD) $(mbox_sram_PKG_HDL) + $(HVL_COMP_CMD) $(mbox_sram_PKG) + $(VELANALYZE_CMD) $(mbox_sram_PKG_HDL) + $(VELANALYZE_HVL_CMD) $(mbox_sram_PKG) + $(HDL_COMP_CMD) $(mbox_sram_PKG_XRTL) + +ifeq ($(MTI_VCO_MODE),64) + GCC_COMP_ARCH = -m64 +else + GCC_COMP_ARCH = -m32 +endif + +export mbox_sram_IF_DPI_SRC ?= $(UVMF_VIP_LIBRARY_HOME)/interface_packages/mbox_sram_pkg/dpi + +C_FILE_COMPILE_LIST_mbox_sram_pkg = \ + +O_FILE_COMPILE_LIST_mbox_sram_pkg = $(notdir $(C_FILE_COMPILE_LIST_mbox_sram_pkg:.c=.o)) + +GCC_COMP_ARGS_mbox_sram_pkg += -I$(mbox_sram_IF_DPI_SRC) \ + -fPIC + +GCC_COMP_ARGS_mbox_sram_pkg += $(mbox_sram_IF_GCC_COMP_ARGUMENTS) + +GCC_LINK_ARGS_mbox_sram_pkg += \ + \ + -o .so + +comp_mbox_sram_pkg_c_files: + @echo "--------------------------------" + @echo "Compiling Interface C source" + @echo "--------------------------------" + gcc $(GCC_COMP_ARCH) $(GCC_COMP_ARGS_mbox_sram_pkg) $(C_FILE_COMPILE_LIST_mbox_sram_pkg) + @echo "--------------------------------" + @echo "Linking Interface C objects into a shared object" + @echo "--------------------------------" + gcc $(GCC_COMP_ARCH) $(GCC_LINK_ARGS_mbox_sram_pkg) $(O_FILE_COMPILE_LIST_mbox_sram_pkg) + @echo "--------------------------------" + diff --git a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/interface_packages/mbox_sram_pkg/compile.do b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/interface_packages/mbox_sram_pkg/compile.do new file mode 100644 index 000000000..e20bed409 --- /dev/null +++ b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/interface_packages/mbox_sram_pkg/compile.do @@ -0,0 +1,14 @@ +# Tcl do file for compile of mbox_sram interface + +# pragma uvmf custom additional begin +# pragma uvmf custom additional end + + +vlog -sv -timescale 1ps/1ps -suppress 2223,2286 +incdir+$env(UVMF_VIP_LIBRARY_HOME)/interface_packages/mbox_sram_pkg \ + -F $env(UVMF_VIP_LIBRARY_HOME)/interface_packages/mbox_sram_pkg/mbox_sram_filelist_hdl.f + +vlog -sv -timescale 1ps/1ps -suppress 2223,2286 +incdir+$env(UVMF_VIP_LIBRARY_HOME)/interface_packages/mbox_sram_pkg \ + -F $env(UVMF_VIP_LIBRARY_HOME)/interface_packages/mbox_sram_pkg/mbox_sram_filelist_hvl.f + +vlog -sv -timescale 1ps/1ps -suppress 2223,2286 +incdir+$env(UVMF_VIP_LIBRARY_HOME)/interface_packages/mbox_sram_pkg \ + -F $env(UVMF_VIP_LIBRARY_HOME)/interface_packages/mbox_sram_pkg/mbox_sram_filelist_xrtl.f \ No newline at end of file diff --git a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/interface_packages/mbox_sram_pkg/mbox_sram.compile b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/interface_packages/mbox_sram_pkg/mbox_sram.compile new file mode 100644 index 000000000..b0b806055 --- /dev/null +++ b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/interface_packages/mbox_sram_pkg/mbox_sram.compile @@ -0,0 +1,3 @@ +needs: + - mbox_sram_hvl.compile + - mbox_sram_hdl.compile diff --git a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/interface_packages/mbox_sram_pkg/mbox_sram_bfm.vinfo b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/interface_packages/mbox_sram_pkg/mbox_sram_bfm.vinfo new file mode 100644 index 000000000..a738c1152 --- /dev/null +++ b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/interface_packages/mbox_sram_pkg/mbox_sram_bfm.vinfo @@ -0,0 +1,6 @@ +@use $UVMF_HOME/uvmf_base_pkg/uvmf_base_pkg_hdl.vinfo +@use mbox_sram_pkg_hdl.vinfo ++incdir+@vinfodir +src/mbox_sram_if.sv +src/mbox_sram_driver_bfm.sv +src/mbox_sram_monitor_bfm.sv diff --git a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/interface_packages/mbox_sram_pkg/mbox_sram_common.compile b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/interface_packages/mbox_sram_pkg/mbox_sram_common.compile new file mode 100644 index 000000000..f701a7be2 --- /dev/null +++ b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/interface_packages/mbox_sram_pkg/mbox_sram_common.compile @@ -0,0 +1,7 @@ +needs: + - $UVMF_HOME/uvmf_base_pkg/uvmf_base_pkg_hdl.compile +incdir: + - . + - ${uvm_path}/src +src: + - mbox_sram_pkg_hdl.sv diff --git a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/interface_packages/mbox_sram_pkg/mbox_sram_filelist_hdl.f b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/interface_packages/mbox_sram_pkg/mbox_sram_filelist_hdl.f new file mode 100644 index 000000000..91803d05e --- /dev/null +++ b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/interface_packages/mbox_sram_pkg/mbox_sram_filelist_hdl.f @@ -0,0 +1 @@ +$UVMF_VIP_LIBRARY_HOME/interface_packages/mbox_sram_pkg/mbox_sram_pkg_hdl.sv diff --git a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/interface_packages/mbox_sram_pkg/mbox_sram_filelist_hvl.f b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/interface_packages/mbox_sram_pkg/mbox_sram_filelist_hvl.f new file mode 100644 index 000000000..f4fb8adc1 --- /dev/null +++ b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/interface_packages/mbox_sram_pkg/mbox_sram_filelist_hvl.f @@ -0,0 +1 @@ +$UVMF_VIP_LIBRARY_HOME/interface_packages/mbox_sram_pkg/mbox_sram_pkg.sv \ No newline at end of file diff --git a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/interface_packages/mbox_sram_pkg/mbox_sram_filelist_xrtl.f b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/interface_packages/mbox_sram_pkg/mbox_sram_filelist_xrtl.f new file mode 100644 index 000000000..85b63fa2f --- /dev/null +++ b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/interface_packages/mbox_sram_pkg/mbox_sram_filelist_xrtl.f @@ -0,0 +1,3 @@ +$UVMF_VIP_LIBRARY_HOME/interface_packages/mbox_sram_pkg/src/mbox_sram_if.sv +$UVMF_VIP_LIBRARY_HOME/interface_packages/mbox_sram_pkg/src/mbox_sram_monitor_bfm.sv +$UVMF_VIP_LIBRARY_HOME/interface_packages/mbox_sram_pkg/src/mbox_sram_driver_bfm.sv diff --git a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/interface_packages/mbox_sram_pkg/mbox_sram_hdl.compile b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/interface_packages/mbox_sram_pkg/mbox_sram_hdl.compile new file mode 100644 index 000000000..032a5e03c --- /dev/null +++ b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/interface_packages/mbox_sram_pkg/mbox_sram_hdl.compile @@ -0,0 +1,9 @@ +needs: + - $UVMF_HOME/uvmf_base_pkg/uvmf_base_pkg_hdl.compile + - ./mbox_sram_common.compile +incdir: + - . +src: + - src/mbox_sram_if.sv + - src/mbox_sram_monitor_bfm.sv + - src/mbox_sram_driver_bfm.sv diff --git a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/interface_packages/mbox_sram_pkg/mbox_sram_hvl.compile b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/interface_packages/mbox_sram_pkg/mbox_sram_hvl.compile new file mode 100644 index 000000000..da9f7fe81 --- /dev/null +++ b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/interface_packages/mbox_sram_pkg/mbox_sram_hvl.compile @@ -0,0 +1,7 @@ +needs: + - $UVMF_HOME/uvmf_base_pkg/uvmf_base_pkg.compile + - ./mbox_sram_common.compile +incdir: + - . +src: + - mbox_sram_pkg.sv diff --git a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/interface_packages/mbox_sram_pkg/mbox_sram_pkg.sv b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/interface_packages/mbox_sram_pkg/mbox_sram_pkg.sv new file mode 100644 index 000000000..3d9b7ecf4 --- /dev/null +++ b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/interface_packages/mbox_sram_pkg/mbox_sram_pkg.sv @@ -0,0 +1,93 @@ +//---------------------------------------------------------------------- +// Created with uvmf_gen version 2022.3 +//---------------------------------------------------------------------- +// SPDX-License-Identifier: Apache-2.0 +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// pragma uvmf custom header begin +// pragma uvmf custom header end +//---------------------------------------------------------------------- +//---------------------------------------------------------------------- +// +// PACKAGE: This file defines all of the files contained in the +// interface package that will run on the host simulator. +// +// CONTAINS: +// - +// - +// - + +// - +// - +// - + +// - +// - +// - + +// - +// - +// +//---------------------------------------------------------------------- +//---------------------------------------------------------------------- +// +package mbox_sram_pkg; + + import uvm_pkg::*; + import uvmf_base_pkg_hdl::*; + import uvmf_base_pkg::*; + import mbox_sram_pkg_hdl::*; + + `include "uvm_macros.svh" + + // pragma uvmf custom package_imports_additional begin + import soc_ifc_pkg::*; + // pragma uvmf custom package_imports_additional end + `include "src/mbox_sram_macros.svh" + + export mbox_sram_pkg_hdl::*; + + + + // Parameters defined as HVL parameters + + `include "src/mbox_sram_typedefs.svh" + `include "src/mbox_sram_transaction.svh" + + `include "src/mbox_sram_configuration.svh" + `include "src/mbox_sram_driver.svh" + `include "src/mbox_sram_monitor.svh" + + `include "src/mbox_sram_transaction_coverage.svh" + `include "src/mbox_sram_sequence_base.svh" + `include "src/mbox_sram_random_sequence.svh" + + `include "src/mbox_sram_responder_sequence.svh" + `include "src/mbox_sram2reg_adapter.svh" + + `include "src/mbox_sram_agent.svh" + + // pragma uvmf custom package_item_additional begin + // UVMF_CHANGE_ME : When adding new interface sequences to the src directory + // be sure to add the sequence file here so that it will be + // compiled as part of the interface package. Be sure to place + // the new sequence after any base sequences of the new sequence. + typedef mbox_sram_responder_sequence mbox_sram_agent_responder_seq_t; + // pragma uvmf custom package_item_additional end + +endpackage + +// pragma uvmf custom external begin +// pragma uvmf custom external end + diff --git a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/interface_packages/mbox_sram_pkg/mbox_sram_pkg.vinfo b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/interface_packages/mbox_sram_pkg/mbox_sram_pkg.vinfo new file mode 100644 index 000000000..2d5289a09 --- /dev/null +++ b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/interface_packages/mbox_sram_pkg/mbox_sram_pkg.vinfo @@ -0,0 +1,4 @@ +@use $UVMF_HOME/uvmf_base_pkg/uvmf_base_pkg.vinfo +@use mbox_sram_pkg_hdl.vinfo ++incdir+@vinfodir +mbox_sram_pkg.sv diff --git a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/interface_packages/mbox_sram_pkg/mbox_sram_pkg_hdl.sv b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/interface_packages/mbox_sram_pkg/mbox_sram_pkg_hdl.sv new file mode 100644 index 000000000..82e9bb46a --- /dev/null +++ b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/interface_packages/mbox_sram_pkg/mbox_sram_pkg_hdl.sv @@ -0,0 +1,52 @@ +//---------------------------------------------------------------------- +// Created with uvmf_gen version 2022.3 +//---------------------------------------------------------------------- +// SPDX-License-Identifier: Apache-2.0 +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// pragma uvmf custom header begin +// pragma uvmf custom header end +//---------------------------------------------------------------------- +//---------------------------------------------------------------------- +// +// PACKAGE: This file defines all of the files contained in the +// interface package that needs to be compiled and synthesized +// for running on Veloce. +// +// CONTAINS: +// - +// +//---------------------------------------------------------------------- +//---------------------------------------------------------------------- +// +package mbox_sram_pkg_hdl; + + import uvmf_base_pkg_hdl::*; + + // pragma uvmf custom package_imports_additional begin + // pragma uvmf custom package_imports_additional end + + // Parameters defined as HDL parameters + + `include "src/mbox_sram_typedefs_hdl.svh" + `include "src/mbox_sram_macros.svh" + + // pragma uvmf custom package_item_additional begin + // pragma uvmf custom package_item_additional end + +endpackage + +// pragma uvmf custom external begin +// pragma uvmf custom external end + diff --git a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/interface_packages/mbox_sram_pkg/mbox_sram_pkg_hdl.vinfo b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/interface_packages/mbox_sram_pkg/mbox_sram_pkg_hdl.vinfo new file mode 100644 index 000000000..b490cd934 --- /dev/null +++ b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/interface_packages/mbox_sram_pkg/mbox_sram_pkg_hdl.vinfo @@ -0,0 +1,2 @@ +@use $UVMF_HOME/uvmf_base_pkg/uvmf_base_pkg_hdl.vinfo +mbox_sram_pkg_hdl.sv diff --git a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/interface_packages/mbox_sram_pkg/mbox_sram_pkg_sve.F b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/interface_packages/mbox_sram_pkg/mbox_sram_pkg_sve.F new file mode 100644 index 000000000..690a04c08 --- /dev/null +++ b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/interface_packages/mbox_sram_pkg/mbox_sram_pkg_sve.F @@ -0,0 +1,10 @@ +// UVM ++incdir+${UVM_HOME}/src +${UVM_HOME}/src/uvm_pkg.sv + +// Common UVMF files +-f ${UVMF_HOME}/common/common_sve.f + ++incdir+. +-f ${UVMF_VIP_LIBRARY_HOME}/interface_packages/mbox_sram_pkg/mbox_sram_filelist_hdl.f +-f ${UVMF_VIP_LIBRARY_HOME}/interface_packages/mbox_sram_pkg/mbox_sram_filelist_hvl.f diff --git a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/interface_packages/mbox_sram_pkg/src/mbox_sram2reg_adapter.svh b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/interface_packages/mbox_sram_pkg/src/mbox_sram2reg_adapter.svh new file mode 100644 index 000000000..deba1e67c --- /dev/null +++ b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/interface_packages/mbox_sram_pkg/src/mbox_sram2reg_adapter.svh @@ -0,0 +1,112 @@ +//---------------------------------------------------------------------- +// Created with uvmf_gen version 2022.3 +//---------------------------------------------------------------------- +// SPDX-License-Identifier: Apache-2.0 +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// pragma uvmf custom header begin +// pragma uvmf custom header end +//---------------------------------------------------------------------- +//---------------------------------------------------------------------- +// +// DESCRIPTION: +// This file contains the UVM register adapter for the mbox_sram interface. +// +//---------------------------------------------------------------------- +//---------------------------------------------------------------------- +// +class mbox_sram2reg_adapter extends uvm_reg_adapter; + + `uvm_object_utils( mbox_sram2reg_adapter ) + + // pragma uvmf custom class_item_additional begin + // pragma uvmf custom class_item_additional end + + //-------------------------------------------------------------------- + // new + //-------------------------------------------------------------------- + function new (string name = "mbox_sram2reg_adapter" ); + super.new(name); + // pragma uvmf custom new begin + // UVMF_CHANGE_ME : Configure the adapter regarding byte enables and provides response. + + // Does the protocol the Agent is modeling support byte enables? + // 0 = NO + // 1 = YES + supports_byte_enable = 0; + + // Does the Agent's Driver provide separate response sequence items? + // i.e. Does the driver call seq_item_port.put() + // and do the sequences call get_response()? + // 0 = NO + // 1 = YES + provides_responses = 0; + // pragma uvmf custom new end + + endfunction: new + + //-------------------------------------------------------------------- + // reg2bus + //-------------------------------------------------------------------- + virtual function uvm_sequence_item reg2bus(const ref uvm_reg_bus_op rw); + + mbox_sram_transaction trans_h = mbox_sram_transaction ::type_id::create("trans_h"); + + // pragma uvmf custom reg2bus begin + // UVMF_CHANGE_ME : Fill in the reg2bus adapter mapping registe fields to protocol fields. + + //Adapt the following for your sequence item type + // trans_h.op = (rw.kind == UVM_READ) ? WB_READ : WB_WRITE; + //Copy over address + // trans_h.addr = rw.addr; + //Copy over write data + // trans_h.data = rw.data; + + // pragma uvmf custom reg2bus end + + // Return the adapted transaction + return trans_h; + + endfunction: reg2bus + + //-------------------------------------------------------------------- + // bus2reg + //-------------------------------------------------------------------- + virtual function void bus2reg(uvm_sequence_item bus_item, + ref uvm_reg_bus_op rw); + mbox_sram_transaction trans_h; + if (!$cast(trans_h, bus_item)) begin + `uvm_fatal("ADAPT","Provided bus_item is not of the correct type") + return; + end + // pragma uvmf custom bus2reg begin + // UVMF_CHANGE_ME : Fill in the bus2reg adapter mapping protocol fields to register fields. + //Adapt the following for your sequence item type + //Copy over instruction type + // rw.kind = (trans_h.op == WB_WRITE) ? UVM_WRITE : UVM_READ; + //Copy over address + // rw.addr = trans_h.addr; + //Copy over read data + // rw.data = trans_h.data; + //Check for errors on the bus and return UVM_NOT_OK if there is an error + // rw.status = UVM_IS_OK; + // pragma uvmf custom bus2reg end + + endfunction: bus2reg + +endclass : mbox_sram2reg_adapter + +// pragma uvmf custom external begin +// pragma uvmf custom external end + diff --git a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/interface_packages/mbox_sram_pkg/src/mbox_sram_agent.svh b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/interface_packages/mbox_sram_pkg/src/mbox_sram_agent.svh new file mode 100644 index 000000000..ba0eb1e33 --- /dev/null +++ b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/interface_packages/mbox_sram_pkg/src/mbox_sram_agent.svh @@ -0,0 +1,71 @@ +//---------------------------------------------------------------------- +// Created with uvmf_gen version 2022.3 +//---------------------------------------------------------------------- +// SPDX-License-Identifier: Apache-2.0 +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// pragma uvmf custom header begin +// pragma uvmf custom header end +//---------------------------------------------------------------------- +//---------------------------------------------------------------------- +// +// DESCRIPTION: Protocol specific agent class definition +// +//---------------------------------------------------------------------- +//---------------------------------------------------------------------- +// +class mbox_sram_agent extends uvmf_parameterized_agent #( + .CONFIG_T(mbox_sram_configuration ), + .DRIVER_T(mbox_sram_driver ), + .MONITOR_T(mbox_sram_monitor ), + .COVERAGE_T(mbox_sram_transaction_coverage ), + .TRANS_T(mbox_sram_transaction ) + ); + + `uvm_component_utils( mbox_sram_agent ) + +// pragma uvmf custom class_item_additional begin + extern task handle_reset(string kind = "HARD"); +// pragma uvmf custom class_item_additional end + +// **************************************************************************** +// FUNCTION : new() +// This function is the standard SystemVerilog constructor. +// + function new( string name = "", uvm_component parent = null ); + super.new( name, parent ); + endfunction + +// **************************************************************************** + // FUNCTION: build_phase + virtual function void build_phase(uvm_phase phase); +// pragma uvmf custom build_phase_pre_super begin +// pragma uvmf custom build_phase_pre_super end + super.build_phase(phase); + if (configuration.active_passive == ACTIVE) begin + // Place sequencer handle into configuration object + // so that it may be retrieved from configuration + // rather than using uvm_config_db + configuration.sequencer = this.sequencer; + end + endfunction + +endclass + +// pragma uvmf custom external begin +task mbox_sram_agent::handle_reset(string kind = "HARD"); + configuration.handle_reset(kind); +endtask +// pragma uvmf custom external end + diff --git a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/interface_packages/mbox_sram_pkg/src/mbox_sram_configuration.svh b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/interface_packages/mbox_sram_pkg/src/mbox_sram_configuration.svh new file mode 100644 index 000000000..4b3c2e2c3 --- /dev/null +++ b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/interface_packages/mbox_sram_pkg/src/mbox_sram_configuration.svh @@ -0,0 +1,203 @@ +//---------------------------------------------------------------------- +// Created with uvmf_gen version 2022.3 +//---------------------------------------------------------------------- +// SPDX-License-Identifier: Apache-2.0 +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// pragma uvmf custom header begin +// pragma uvmf custom header end +//---------------------------------------------------------------------- +//---------------------------------------------------------------------- +// +// DESCRIPTION: This class contains all variables and functions used +// to configure the mbox_sram agent and its bfm's. It gets the +// bfm's from the uvm_config_db for use by the agent. +// +//---------------------------------------------------------------------- +//---------------------------------------------------------------------- +// +class mbox_sram_configuration extends uvmf_parameterized_agent_configuration_base #( + .DRIVER_BFM_BIND_T(virtual mbox_sram_driver_bfm ), + .MONITOR_BFM_BIND_T( virtual mbox_sram_monitor_bfm )); + + `uvm_object_utils( mbox_sram_configuration ) + + // Controls injection of ECC errors for write transactions. Bit[0]: Single Bit Error. Bit[1]: Double Bit Error + bit [1:0] inject_ecc_error = 2'b00; + // When set, causes the mbox_sram_responder_sequence to clear the variable 'inject_ecc_error' after a single ECC error is injected + bit auto_clear_ecc_error_injection = 1'b1; + + // Sequencer handle populated by agent + uvm_sequencer #(mbox_sram_transaction ) sequencer; + + //Constraints for the configuration variables: + + // pragma uvmf custom class_item_additional begin + extern task handle_reset(string kind = "HARD"); + // pragma uvmf custom class_item_additional end + + covergroup mbox_sram_configuration_cg; + // pragma uvmf custom covergroup begin + option.auto_bin_max=1024; + coverpoint inject_ecc_error; + coverpoint auto_clear_ecc_error_injection; + // pragma uvmf custom covergroup end + endgroup + + //******************************************************************* + //******************************************************************* + // Structure used to pass configuration variables to monitor and driver BFM's. + // Use to_struct function to pack variables into structure. + // Use from_struct function to unpack variables from structure. + // This structure is defined in mbox_sram_macros.svh + `mbox_sram_CONFIGURATION_STRUCT + mbox_sram_configuration_s mbox_sram_configuration_struct; + //******************************************************************* + // FUNCTION: to_struct() + // This function packs variables into a mbox_sram_configuration_s + // structure. The function returns the handle to the mbox_sram_configuration_struct. + // This function is defined in mbox_sram_macros.svh + `mbox_sram_CONFIGURATION_TO_STRUCT_FUNCTION + //******************************************************************* + // FUNCTION: from_struct() + // This function unpacks the struct provided as an argument into + // variables of this class. + // This function is defined in mbox_sram_macros.svh + `mbox_sram_CONFIGURATION_FROM_STRUCT_FUNCTION + + // **************************************************************************** + // FUNCTION : new() + // This function is the standard SystemVerilog constructor. + // + function new( string name = "" ); + super.new( name ); + // Construct the covergroup for this configuration class + mbox_sram_configuration_cg = new; + endfunction + + // **************************************************************************** + // FUNCTION: post_randomize() + // This function is automatically called after the randomize() function + // is executed. + // + function void post_randomize(); + super.post_randomize(); + mbox_sram_configuration_cg.sample(); + endfunction + + // **************************************************************************** + // FUNCTION: initialize + // This function causes the configuration to retrieve + // its virtual interface handle from the uvm_config_db. + // This function also makes itself available to its + // agent through the uvm_config_db. + // + // ARGUMENTS: + // uvmf_active_passive_t activity: + // This argument identifies the simulation level + // as either BLOCK, CHIP, SIMULATION, etc. + // + // AGENT_PATH: + // This argument identifies the path to this + // configurations agent. This configuration + // makes itself available to the agent specified + // by agent_path by placing itself into the + // uvm_config_db. + // + // INTERFACE_NAME: + // This argument identifies the string name of + // this configurations BFM's. This string + // name is used to retrieve the driver and + // monitor BFM from the uvm_config_db. + // + virtual function void initialize(uvmf_active_passive_t activity, + string agent_path, + string interface_name); + + super.initialize( activity, agent_path, interface_name); + // The covergroup is given the same name as the interface + mbox_sram_configuration_cg.set_inst_name(interface_name); + + // This configuration places itself into the uvm_config_db for the agent, identified by the agent_path variable, to retrieve. + uvm_config_db #( mbox_sram_configuration + )::set( null ,agent_path,UVMF_AGENT_CONFIG, this ); + + // This configuration also places itself in the config db using the same identifier used by the interface. This allows users to access + // configuration variables and the interface through the bfm api class rather than directly accessing the BFM. This is useful for + // accessingthe BFM when using Veloce + uvm_config_db #( mbox_sram_configuration + )::set( null ,UVMF_CONFIGURATIONS, interface_name, this ); + + mbox_sram_configuration_cg.set_inst_name($sformatf("mbox_sram_configuration_cg_%s",get_full_name())); + +// This code is to aid in debugging parameter mismatches between the BFM and its corresponding agent. +// Enable this debug by setting UVM_VERBOSITY to UVM_DEBUG +// Setting UVM_VERBOSITY to UVM_DEBUG causes all BFM's and all agents to display their parameter settings. +// All of the messages from this feature have a UVM messaging id value of "CFG" +// The transcript or run.log can be parsed to ensure BFM parameter settings match its corresponding agents parameter settings. + `uvm_info("CFG", + $psprintf("The agent at '%s' is using interface named %s has the following parameters: ", agent_path, interface_name, ), + UVM_DEBUG) + + // pragma uvmf custom initialize begin + // This controls whether or not the agent returns a transaction handle in the driver when calling + // item_done() back into the sequencer or not. If set to 1, a transaction is sent back which means + // the sequence on the other end must use the get_response() part of the driver/sequence API. If + // this doesn't occur, there will eventually be response_queue overflow errors during the test. + return_transaction_response = 1'b1; + + // pragma uvmf custom initialize end + + endfunction + + // **************************************************************************** + // TASK: wait_for_reset + // *[Required]* Blocks until reset is released. The wait_for_reset operation is performed + // by a task in the monitor bfm. + virtual task wait_for_reset(); + monitor_bfm.wait_for_reset(); + endtask + + // **************************************************************************** + // TASK: wait_for_num_clocks + // *[Required]* Blocks until specified number of clocks have elapsed. The wait_for_num_clocks + // operation is performed by a task in the monitor bfm. + virtual task wait_for_num_clocks(int clocks); + monitor_bfm.wait_for_num_clocks(clocks); + endtask + + // **************************************************************************** + // FUNCTION : convert2string() + // This function is used to convert variables in this class into a string for log messaging. + // + virtual function string convert2string (); + // pragma uvmf custom convert2string begin + return $sformatf("inject_ecc_error:0x%x auto_clear_ecc_error_injection:0x%x ",inject_ecc_error,auto_clear_ecc_error_injection); + // pragma uvmf custom convert2string end + endfunction + + // **************************************************************************** + // FUNCTION: get_sequencer + function uvm_sequencer #(mbox_sram_transaction) get_sequencer(); + return sequencer; + endfunction + +endclass + +// pragma uvmf custom external begin +task mbox_sram_configuration::handle_reset(string kind = "HARD"); + inject_ecc_error = 0; +endtask +// pragma uvmf custom external end + diff --git a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/interface_packages/mbox_sram_pkg/src/mbox_sram_driver.svh b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/interface_packages/mbox_sram_pkg/src/mbox_sram_driver.svh new file mode 100644 index 000000000..c083be2b0 --- /dev/null +++ b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/interface_packages/mbox_sram_pkg/src/mbox_sram_driver.svh @@ -0,0 +1,105 @@ +//---------------------------------------------------------------------- +// Created with uvmf_gen version 2022.3 +//---------------------------------------------------------------------- +// SPDX-License-Identifier: Apache-2.0 +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// pragma uvmf custom header begin +// pragma uvmf custom header end +//---------------------------------------------------------------------- +//---------------------------------------------------------------------- +// +// DESCRIPTION: This class passes transactions between the sequencer +// and the BFM driver interface. It accesses the driver BFM +// through the bfm handle. This driver +// passes transactions to the driver BFM through the access +// task. +// +//---------------------------------------------------------------------- +//---------------------------------------------------------------------- +// +class mbox_sram_driver extends uvmf_driver_base #( + .CONFIG_T(mbox_sram_configuration ), + .BFM_BIND_T(virtual mbox_sram_driver_bfm ), + .REQ(mbox_sram_transaction ), + .RSP(mbox_sram_transaction )); + + `uvm_component_utils( mbox_sram_driver ) +//******************************************************************* +// Macros that define structs located in mbox_sram_macros.svh +//******************************************************************* +// Initiator macro used by mbox_sram_driver and mbox_sram_driver_bfm +// to communicate initiator driven data to mbox_sram_driver_bfm. +`mbox_sram_INITIATOR_STRUCT + mbox_sram_initiator_s mbox_sram_initiator_struct; +//******************************************************************* +// Responder macro used by mbox_sram_driver and mbox_sram_driver_bfm +// to communicate Responder driven data to mbox_sram_driver_bfm. +`mbox_sram_RESPONDER_STRUCT + mbox_sram_responder_s mbox_sram_responder_struct; + +// pragma uvmf custom class_item_additional begin +// pragma uvmf custom class_item_additional end + +// **************************************************************************** +// This function is the standard SystemVerilog constructor. +// + function new( string name = "", uvm_component parent=null ); + super.new( name, parent ); + endfunction + +// **************************************************************************** +// This function sends configuration object variables to the driver BFM +// using the configuration struct. +// + virtual function void configure(input CONFIG_T cfg); + bfm.configure( cfg.to_struct() ); + endfunction + +// **************************************************************************** +// This function places a handle to this class in the proxy variable in the +// driver BFM. This allows the driver BFM to call tasks and function within this class. +// + virtual function void set_bfm_proxy_handle(); + bfm.proxy = this; endfunction + +// **************************************************************************** +// This task is called by the run_phase in uvmf_driver_base. + virtual task access( inout REQ txn ); +// pragma uvmf custom access begin + if (configuration.initiator_responder==RESPONDER) begin + // Complete current transfer and wait for next transfer + bfm.respond_and_wait_for_next_transfer( + mbox_sram_initiator_struct, + txn.to_responder_struct() + ); + // Unpack information about initiated transfer received by this responder + txn.from_initiator_struct(mbox_sram_initiator_struct); + end else begin + // Initiate a transfer and get response + bfm.initiate_and_get_response( + txn.to_initiator_struct(), + mbox_sram_responder_struct + ); + // Unpack transfer response information received by this initiator + txn.from_responder_struct(mbox_sram_responder_struct); + end +// pragma uvmf custom access end + endtask + +endclass + +// pragma uvmf custom external begin +// pragma uvmf custom external end + diff --git a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/interface_packages/mbox_sram_pkg/src/mbox_sram_driver_bfm.sv b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/interface_packages/mbox_sram_pkg/src/mbox_sram_driver_bfm.sv new file mode 100644 index 000000000..6c9359089 --- /dev/null +++ b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/interface_packages/mbox_sram_pkg/src/mbox_sram_driver_bfm.sv @@ -0,0 +1,334 @@ +//---------------------------------------------------------------------- +// Created with uvmf_gen version 2022.3 +//---------------------------------------------------------------------- +// SPDX-License-Identifier: Apache-2.0 +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// pragma uvmf custom header begin +import soc_ifc_pkg::*; +// pragma uvmf custom header end +//---------------------------------------------------------------------- +//---------------------------------------------------------------------- +// +// DESCRIPTION: +// This interface performs the mbox_sram signal driving. It is +// accessed by the uvm mbox_sram driver through a virtual interface +// handle in the mbox_sram configuration. It drives the singals passed +// in through the port connection named bus of type mbox_sram_if. +// +// Input signals from the mbox_sram_if are assigned to an internal input +// signal with a _i suffix. The _i signal should be used for sampling. +// +// The input signal connections are as follows: +// bus.signal -> signal_i +// +// This bfm drives signals with a _o suffix. These signals +// are driven onto signals within mbox_sram_if based on INITIATOR/RESPONDER and/or +// ARBITRATION/GRANT status. +// +// The output signal connections are as follows: +// signal_o -> bus.signal +// +// +// Interface functions and tasks used by UVM components: +// +// configure: +// This function gets configuration attributes from the +// UVM driver to set any required BFM configuration +// variables such as 'initiator_responder'. +// +// initiate_and_get_response: +// This task is used to perform signaling activity for initiating +// a protocol transfer. The task initiates the transfer, using +// input data from the initiator struct. Then the task captures +// response data, placing the data into the response struct. +// The response struct is returned to the driver class. +// +// respond_and_wait_for_next_transfer: +// This task is used to complete a current transfer as a responder +// and then wait for the initiator to start the next transfer. +// The task uses data in the responder struct to drive protocol +// signals to complete the transfer. The task then waits for +// the next transfer. Once the next transfer begins, data from +// the initiator is placed into the initiator struct and sent +// to the responder sequence for processing to determine +// what data to respond with. +// +//---------------------------------------------------------------------- +//---------------------------------------------------------------------- +// +import uvmf_base_pkg_hdl::*; +import mbox_sram_pkg_hdl::*; +`include "src/mbox_sram_macros.svh" + +interface mbox_sram_driver_bfm + (mbox_sram_if bus); + // The following pragma and additional ones in-lined further below are for running this BFM on Veloce + // pragma attribute mbox_sram_driver_bfm partition_interface_xif + +`ifndef XRTL +// This code is to aid in debugging parameter mismatches between the BFM and its corresponding agent. +// Enable this debug by setting UVM_VERBOSITY to UVM_DEBUG +// Setting UVM_VERBOSITY to UVM_DEBUG causes all BFM's and all agents to display their parameter settings. +// All of the messages from this feature have a UVM messaging id value of "CFG" +// The transcript or run.log can be parsed to ensure BFM parameter settings match its corresponding agents parameter settings. +import uvm_pkg::*; +`include "uvm_macros.svh" +initial begin : bfm_vs_agent_parameter_debug + `uvm_info("CFG", + $psprintf("The BFM at '%m' has the following parameters: ", ), + UVM_DEBUG) +end +`endif + + // Config value to determine if this is an initiator or a responder + uvmf_initiator_responder_t initiator_responder; + // Custom configuration variables. + // These are set using the configure function which is called during the UVM connect_phase + bit [1:0] inject_ecc_error ; + bit auto_clear_ecc_error_injection ; + + tri clk_i; + tri dummy_i; + + // Signal list (all signals are capable of being inputs and outputs for the sake + // of supporting both INITIATOR and RESPONDER mode operation. Expectation is that + // directionality in the config file was from the point-of-view of the INITIATOR + + // INITIATOR mode input signals + tri [$bits(mbox_sram_resp_t)-1:0] mbox_sram_resp_i; +// reg [$bits(mbox_sram_resp_t)-1:0] mbox_sram_resp_o = 'bz; + mbox_sram_resp_t mbox_sram_resp_o = 'bz; + + // INITIATOR mode output signals +// tri [$bits(mbox_sram_req_t)-1:0] mbox_sram_req_i; + mbox_sram_req_t mbox_sram_req_i; + reg [$bits(mbox_sram_req_t)-1:0] mbox_sram_req_o = 'bz; + + // Bi-directional signals + + + assign clk_i = bus.clk; + assign dummy_i = bus.dummy; + + // These are signals marked as 'input' by the config file, but the signals will be + // driven by this BFM if put into RESPONDER mode (flipping all signal directions around) + assign mbox_sram_resp_i = bus.mbox_sram_resp; + assign bus.mbox_sram_resp = (initiator_responder == RESPONDER) ? mbox_sram_resp_o : 'bz; + + + // These are signals marked as 'output' by the config file, but the outputs will + // not be driven by this BFM unless placed in INITIATOR mode. + assign bus.mbox_sram_req = (initiator_responder == INITIATOR) ? mbox_sram_req_o : 'bz; + assign mbox_sram_req_i = bus.mbox_sram_req; + + // Proxy handle to UVM driver + mbox_sram_pkg::mbox_sram_driver proxy; + // pragma tbx oneway proxy.my_function_name_in_uvm_driver + + // **************************************************************************** + // **************************************************************************** + // Macros that define structs located in mbox_sram_macros.svh + // **************************************************************************** + // Struct for passing configuration data from mbox_sram_driver to this BFM + // **************************************************************************** + `mbox_sram_CONFIGURATION_STRUCT + // **************************************************************************** + // Structs for INITIATOR and RESPONDER data flow + //******************************************************************* + // Initiator macro used by mbox_sram_driver and mbox_sram_driver_bfm + // to communicate initiator driven data to mbox_sram_driver_bfm. + `mbox_sram_INITIATOR_STRUCT + mbox_sram_initiator_s initiator_struct; + // Responder macro used by mbox_sram_driver and mbox_sram_driver_bfm + // to communicate Responder driven data to mbox_sram_driver_bfm. + `mbox_sram_RESPONDER_STRUCT + mbox_sram_responder_s responder_struct; + + // **************************************************************************** +// pragma uvmf custom reset_condition_and_response begin + // Always block used to return signals to reset value upon assertion of reset + always @( negedge dummy_i ) + begin + // RESPONDER mode output signals + mbox_sram_resp_o <= 'bz; + // INITIATOR mode output signals + mbox_sram_req_o <= 'bz; + // Bi-directional signals + + end +// pragma uvmf custom reset_condition_and_response end + + // pragma uvmf custom interface_item_additional begin + // pragma uvmf custom interface_item_additional end + + //****************************************************************** + // The configure() function is used to pass agent configuration + // variables to the driver BFM. It is called by the driver within + // the agent at the beginning of the simulation. It may be called + // during the simulation if agent configuration variables are updated + // and the driver BFM needs to be aware of the new configuration + // variables. + // + + function void configure(mbox_sram_configuration_s mbox_sram_configuration_arg); // pragma tbx xtf + initiator_responder = mbox_sram_configuration_arg.initiator_responder; + inject_ecc_error = mbox_sram_configuration_arg.inject_ecc_error; + auto_clear_ecc_error_injection = mbox_sram_configuration_arg.auto_clear_ecc_error_injection; + // pragma uvmf custom configure begin + // pragma uvmf custom configure end + endfunction + +// pragma uvmf custom initiate_and_get_response begin +// **************************************************************************** +// UVMF_CHANGE_ME +// This task is used by an initator. The task first initiates a transfer then +// waits for the responder to complete the transfer. + task initiate_and_get_response( + // This argument passes transaction variables used by an initiator + // to perform the initial part of a protocol transfer. The values + // come from a sequence item created in a sequence. + input mbox_sram_initiator_s mbox_sram_initiator_struct, + // This argument is used to send data received from the responder + // back to the sequence item. The sequence item is returned to the sequence. + output mbox_sram_responder_s mbox_sram_responder_struct + );// pragma tbx xtf + // + // Members within the mbox_sram_initiator_struct: + // bit is_read ; + // bit [MBOX_ADDR_W-1:0] address ; + // bit [MBOX_DATA_W-1:0] data ; + // bit [MBOX_ECC_DATA_W-1:0] data_ecc ; + // bit ecc_single_bit_error ; + // bit ecc_double_bit_error ; + // Members within the mbox_sram_responder_struct: + // bit is_read ; + // bit [MBOX_ADDR_W-1:0] address ; + // bit [MBOX_DATA_W-1:0] data ; + // bit [MBOX_ECC_DATA_W-1:0] data_ecc ; + // bit ecc_single_bit_error ; + // bit ecc_double_bit_error ; + initiator_struct = mbox_sram_initiator_struct; + // + // Reference code; + // How to wait for signal value + // while (control_signal == 1'b1) @(posedge clk_i); + // + // How to assign a responder struct member, named xyz, from a signal. + // All available initiator input and inout signals listed. + // Initiator input signals + // mbox_sram_responder_struct.xyz = mbox_sram_resp_i; // [$bits(mbox_sram_resp_t)-1:0] + // Initiator inout signals + // How to assign a signal from an initiator struct member named xyz. + // All available initiator output and inout signals listed. + // Notice the _o. Those are storage variables that allow for procedural assignment. + // Initiator output signals + // mbox_sram_req_o <= mbox_sram_initiator_struct.xyz; // [$bits(mbox_sram_req_t)-1:0] + // Initiator inout signals + // Initiate a transfer using the data received. + @(posedge clk_i); + @(posedge clk_i); + // Wait for the responder to complete the transfer then place the responder data into + // mbox_sram_responder_struct. + @(posedge clk_i); + @(posedge clk_i); + `uvm_fatal("MBOX_SRAM_DRIVER_BFM", "Unimplemented initiate_and_get_response") + responder_struct = mbox_sram_responder_struct; + endtask +// pragma uvmf custom initiate_and_get_response end + +// pragma uvmf custom respond_and_wait_for_next_transfer begin +// **************************************************************************** +// The first_transfer variable is used to prevent completing a transfer in the +// first call to this task. For the first call to this task, there is not +// current transfer to complete. +bit first_transfer=1; + +// UVMF_CHANGE_ME +// This task is used by a responder. The task first completes the current +// transfer in progress then waits for the initiator to start the next transfer. + task respond_and_wait_for_next_transfer( + // This argument is used to send data received from the initiator + // back to the sequence item. The sequence determines how to respond. + output mbox_sram_initiator_s mbox_sram_initiator_struct, + // This argument passes transaction variables used by a responder + // to complete a protocol transfer. The values come from a sequence item. + input mbox_sram_responder_s mbox_sram_responder_struct + );// pragma tbx xtf + // Variables within the mbox_sram_initiator_struct: + // bit is_read ; + // bit [MBOX_ADDR_W-1:0] address ; + // bit [MBOX_DATA_W-1:0] data ; + // bit [MBOX_ECC_DATA_W-1:0] data_ecc ; + // bit ecc_single_bit_error ; + // bit ecc_double_bit_error ; + // Variables within the mbox_sram_responder_struct: + // bit is_read ; + // bit [MBOX_ADDR_W-1:0] address ; + // bit [MBOX_DATA_W-1:0] data ; + // bit [MBOX_ECC_DATA_W-1:0] data_ecc ; + // bit ecc_single_bit_error ; + // bit ecc_double_bit_error ; + // Reference code; + // How to wait for signal value + // while (control_signal == 1'b1) @(posedge clk_i); + // + // How to assign a responder struct member, named xyz, from a signal. + // All available responder input and inout signals listed. + // Responder input signals + // mbox_sram_responder_struct.xyz = mbox_sram_req_i; // [$bits(mbox_sram_req_t)-1:0] + // Responder inout signals + // How to assign a signal, named xyz, from an initiator struct member. + // All available responder output and inout signals listed. + // Notice the _o. Those are storage variables that allow for procedural assignment. + // Responder output signals + // mbox_sram_resp_o <= mbox_sram_initiator_struct.xyz; // [$bits(mbox_sram_resp_t)-1:0] + // Responder inout signals + + responder_struct <= mbox_sram_responder_struct; + if (!first_transfer) begin + // Perform transfer response here. + // Reply using data recieved in the mbox_sram_responder_struct. + if (mbox_sram_responder_struct.is_read) begin + mbox_sram_resp_o.rdata.data <= mbox_sram_responder_struct.data; + mbox_sram_resp_o.rdata.ecc <= mbox_sram_responder_struct.data_ecc; + end + @(posedge clk_i); + end + while (mbox_sram_req_i.cs !== 1'b1) @(posedge clk_i); + // Wait for next transfer then gather info from intiator about the transfer. + // Place the data into the mbox_sram_initiator_struct. + mbox_sram_initiator_struct.is_read = ~mbox_sram_req_i.we; + mbox_sram_initiator_struct.address = mbox_sram_req_i.addr; + mbox_sram_initiator_struct.data = mbox_sram_req_i.wdata.data; + mbox_sram_initiator_struct.data_ecc = mbox_sram_req_i.wdata.ecc; + mbox_sram_initiator_struct.ecc_single_bit_error = mbox_sram_req_i.we && proxy.configuration.inject_ecc_error[0]; + mbox_sram_initiator_struct.ecc_double_bit_error = mbox_sram_req_i.we && proxy.configuration.inject_ecc_error[1]; + if (mbox_sram_initiator_struct.ecc_single_bit_error || mbox_sram_initiator_struct.ecc_double_bit_error) `uvm_info("MBOX_SRAM_DRIVER_BFM", "Injecting ECC bit flip", UVM_DEBUG) + else if (mbox_sram_req_i.we) `uvm_info("MBOX_SRAM_DRIVER_BFM", "Receiving SRAM write without ECC bit flip", UVM_DEBUG) + if (proxy.configuration.auto_clear_ecc_error_injection && |proxy.configuration.inject_ecc_error) begin + proxy.configuration.inject_ecc_error = 2'b00; + `uvm_info("MBOX_SRAM_DRIVER_BFM", "Resetting inject_ecc_error value to 0", UVM_DEBUG) + end + first_transfer = 0; + initiator_struct = mbox_sram_initiator_struct; + endtask +// pragma uvmf custom respond_and_wait_for_next_transfer end + + +endinterface + +// pragma uvmf custom external begin +// pragma uvmf custom external end + diff --git a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/interface_packages/mbox_sram_pkg/src/mbox_sram_if.sv b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/interface_packages/mbox_sram_pkg/src/mbox_sram_if.sv new file mode 100644 index 000000000..d84655f20 --- /dev/null +++ b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/interface_packages/mbox_sram_pkg/src/mbox_sram_if.sv @@ -0,0 +1,83 @@ +//---------------------------------------------------------------------- +// Created with uvmf_gen version 2022.3 +//---------------------------------------------------------------------- +// SPDX-License-Identifier: Apache-2.0 +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// pragma uvmf custom header begin +// pragma uvmf custom header end +//---------------------------------------------------------------------- +//---------------------------------------------------------------------- +// +// DESCRIPTION: This interface contains the mbox_sram interface signals. +// It is instantiated once per mbox_sram bus. Bus Functional Models, +// BFM's named mbox_sram_driver_bfm, are used to drive signals on the bus. +// BFM's named mbox_sram_monitor_bfm are used to monitor signals on the +// bus. This interface signal bundle is passed in the port list of +// the BFM in order to give the BFM access to the signals in this +// interface. +// +//---------------------------------------------------------------------- +//---------------------------------------------------------------------- +// +// This template can be used to connect a DUT to these signals +// +// .dut_signal_port(mbox_sram_bus.mbox_sram_req), // Agent output +// .dut_signal_port(mbox_sram_bus.mbox_sram_resp), // Agent input + +import uvmf_base_pkg_hdl::*; +import mbox_sram_pkg_hdl::*; + +interface mbox_sram_if + + ( + input tri clk, + input tri dummy, + inout tri [$bits(mbox_sram_req_t)-1:0] mbox_sram_req, + inout tri [$bits(mbox_sram_resp_t)-1:0] mbox_sram_resp + ); + +modport monitor_port + ( + input clk, + input dummy, + input mbox_sram_req, + input mbox_sram_resp + ); + +modport initiator_port + ( + input clk, + input dummy, + output mbox_sram_req, + input mbox_sram_resp + ); + +modport responder_port + ( + input clk, + input dummy, + input mbox_sram_req, + output mbox_sram_resp + ); + + +// pragma uvmf custom interface_item_additional begin +// pragma uvmf custom interface_item_additional end + +endinterface + +// pragma uvmf custom external begin +// pragma uvmf custom external end + diff --git a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/interface_packages/mbox_sram_pkg/src/mbox_sram_infact_coverage_strategy.csv b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/interface_packages/mbox_sram_pkg/src/mbox_sram_infact_coverage_strategy.csv new file mode 100644 index 000000000..1c218e146 --- /dev/null +++ b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/interface_packages/mbox_sram_pkg/src/mbox_sram_infact_coverage_strategy.csv @@ -0,0 +1,6 @@ +Global +auto_bin_max, 64 + +Name,Type,Include +rand_fields,coverpoint,=rand *.** + diff --git a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/interface_packages/mbox_sram_pkg/src/mbox_sram_macros.svh b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/interface_packages/mbox_sram_pkg/src/mbox_sram_macros.svh new file mode 100644 index 000000000..19d629026 --- /dev/null +++ b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/interface_packages/mbox_sram_pkg/src/mbox_sram_macros.svh @@ -0,0 +1,186 @@ +//---------------------------------------------------------------------- +// Created with uvmf_gen version 2022.3 +//---------------------------------------------------------------------- +// SPDX-License-Identifier: Apache-2.0 +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// pragma uvmf custom header begin +// pragma uvmf custom header end +//---------------------------------------------------------------------- +//---------------------------------------------------------------------- +// +// DESCRIPTION: This file contains macros used with the mbox_sram package. +// These macros include packed struct definitions. These structs are +// used to pass data between classes, hvl, and BFM's, hdl. Use of +// structs are more efficient and simpler to modify. +// +//---------------------------------------------------------------------- +//---------------------------------------------------------------------- +// + +// **************************************************************************** +// When changing the contents of this struct, be sure to update the to_struct +// and from_struct methods defined in the macros below that are used in +// the mbox_sram_configuration class. +// + `define mbox_sram_CONFIGURATION_STRUCT \ +typedef struct packed { \ + bit [1:0] inject_ecc_error;\ + bit auto_clear_ecc_error_injection;\ + uvmf_active_passive_t active_passive; \ + uvmf_initiator_responder_t initiator_responder; \ + } mbox_sram_configuration_s; + + `define mbox_sram_CONFIGURATION_TO_STRUCT_FUNCTION \ + virtual function mbox_sram_configuration_s to_struct();\ + mbox_sram_configuration_struct = \ + {\ + this.inject_ecc_error,\ + this.auto_clear_ecc_error_injection,\ + this.active_passive,\ + this.initiator_responder\ + };\ + return ( mbox_sram_configuration_struct );\ + endfunction + + `define mbox_sram_CONFIGURATION_FROM_STRUCT_FUNCTION \ + virtual function void from_struct(mbox_sram_configuration_s mbox_sram_configuration_struct);\ + {\ + this.inject_ecc_error,\ + this.auto_clear_ecc_error_injection,\ + this.active_passive,\ + this.initiator_responder \ + } = mbox_sram_configuration_struct;\ + endfunction + +// **************************************************************************** +// When changing the contents of this struct, be sure to update the to_monitor_struct +// and from_monitor_struct methods of the mbox_sram_transaction class. +// + `define mbox_sram_MONITOR_STRUCT typedef struct packed { \ + bit is_read ; \ + bit [MBOX_ADDR_W-1:0] address ; \ + bit [MBOX_DATA_W-1:0] data ; \ + bit [MBOX_ECC_DATA_W-1:0] data_ecc ; \ + bit ecc_single_bit_error ; \ + bit ecc_double_bit_error ; \ + } mbox_sram_monitor_s; + + `define mbox_sram_TO_MONITOR_STRUCT_FUNCTION \ + virtual function mbox_sram_monitor_s to_monitor_struct();\ + mbox_sram_monitor_struct = \ + { \ + this.is_read , \ + this.address , \ + this.data , \ + this.data_ecc , \ + this.ecc_single_bit_error , \ + this.ecc_double_bit_error \ + };\ + return ( mbox_sram_monitor_struct);\ + endfunction\ + + `define mbox_sram_FROM_MONITOR_STRUCT_FUNCTION \ + virtual function void from_monitor_struct(mbox_sram_monitor_s mbox_sram_monitor_struct);\ + {\ + this.is_read , \ + this.address , \ + this.data , \ + this.data_ecc , \ + this.ecc_single_bit_error , \ + this.ecc_double_bit_error \ + } = mbox_sram_monitor_struct;\ + endfunction + +// **************************************************************************** +// When changing the contents of this struct, be sure to update the to_initiator_struct +// and from_initiator_struct methods of the mbox_sram_transaction class. +// Also update the comments in the driver BFM. +// + `define mbox_sram_INITIATOR_STRUCT typedef struct packed { \ + bit is_read ; \ + bit [MBOX_ADDR_W-1:0] address ; \ + bit [MBOX_DATA_W-1:0] data ; \ + bit [MBOX_ECC_DATA_W-1:0] data_ecc ; \ + bit ecc_single_bit_error ; \ + bit ecc_double_bit_error ; \ + } mbox_sram_initiator_s; + + `define mbox_sram_TO_INITIATOR_STRUCT_FUNCTION \ + virtual function mbox_sram_initiator_s to_initiator_struct();\ + mbox_sram_initiator_struct = \ + {\ + this.is_read , \ + this.address , \ + this.data , \ + this.data_ecc , \ + this.ecc_single_bit_error , \ + this.ecc_double_bit_error \ + };\ + return ( mbox_sram_initiator_struct);\ + endfunction + + `define mbox_sram_FROM_INITIATOR_STRUCT_FUNCTION \ + virtual function void from_initiator_struct(mbox_sram_initiator_s mbox_sram_initiator_struct);\ + {\ + this.is_read , \ + this.address , \ + this.data , \ + this.data_ecc , \ + this.ecc_single_bit_error , \ + this.ecc_double_bit_error \ + } = mbox_sram_initiator_struct;\ + endfunction + +// **************************************************************************** +// When changing the contents of this struct, be sure to update the to_responder_struct +// and from_responder_struct methods of the mbox_sram_transaction class. +// Also update the comments in the driver BFM. +// + `define mbox_sram_RESPONDER_STRUCT typedef struct packed { \ + bit is_read ; \ + bit [MBOX_ADDR_W-1:0] address ; \ + bit [MBOX_DATA_W-1:0] data ; \ + bit [MBOX_ECC_DATA_W-1:0] data_ecc ; \ + bit ecc_single_bit_error ; \ + bit ecc_double_bit_error ; \ + } mbox_sram_responder_s; + + `define mbox_sram_TO_RESPONDER_STRUCT_FUNCTION \ + virtual function mbox_sram_responder_s to_responder_struct();\ + mbox_sram_responder_struct = \ + {\ + this.is_read , \ + this.address , \ + this.data , \ + this.data_ecc , \ + this.ecc_single_bit_error , \ + this.ecc_double_bit_error \ + };\ + return ( mbox_sram_responder_struct);\ + endfunction + + `define mbox_sram_FROM_RESPONDER_STRUCT_FUNCTION \ + virtual function void from_responder_struct(mbox_sram_responder_s mbox_sram_responder_struct);\ + {\ + this.is_read , \ + this.address , \ + this.data , \ + this.data_ecc , \ + this.ecc_single_bit_error , \ + this.ecc_double_bit_error \ + } = mbox_sram_responder_struct;\ + endfunction +// pragma uvmf custom additional begin +// pragma uvmf custom additional end diff --git a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/interface_packages/mbox_sram_pkg/src/mbox_sram_monitor.svh b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/interface_packages/mbox_sram_pkg/src/mbox_sram_monitor.svh new file mode 100644 index 000000000..701ca2ef4 --- /dev/null +++ b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/interface_packages/mbox_sram_pkg/src/mbox_sram_monitor.svh @@ -0,0 +1,101 @@ +//---------------------------------------------------------------------- +// Created with uvmf_gen version 2022.3 +//---------------------------------------------------------------------- +// SPDX-License-Identifier: Apache-2.0 +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// pragma uvmf custom header begin +// pragma uvmf custom header end +//---------------------------------------------------------------------- +//---------------------------------------------------------------------- +// +// DESCRIPTION: This class receives mbox_sram transactions observed by the +// mbox_sram monitor BFM and broadcasts them through the analysis port +// on the agent. It accesses the monitor BFM through the monitor +// task. This UVM component captures transactions +// for viewing in the waveform viewer if the +// enable_transaction_viewing flag is set in the configuration. +// +//---------------------------------------------------------------------- +//---------------------------------------------------------------------- +// +class mbox_sram_monitor extends uvmf_monitor_base #( + .CONFIG_T(mbox_sram_configuration ), + .BFM_BIND_T(virtual mbox_sram_monitor_bfm ), + .TRANS_T(mbox_sram_transaction )); + + `uvm_component_utils( mbox_sram_monitor ) + +// Structure used to pass data from monitor BFM to monitor class in agent. +// Use to_monitor_struct function to pack transaction variables into structure. +// Use from_monitor_struct function to unpack transaction variables from structure. +`mbox_sram_MONITOR_STRUCT + + // pragma uvmf custom class_item_additional begin + // pragma uvmf custom class_item_additional end + +// **************************************************************************** +// This function is the standard SystemVerilog constructor. +// + function new( string name = "", uvm_component parent = null ); + super.new( name, parent ); + endfunction + +// **************************************************************************** +// This function sends configuration object variables to the monitor BFM +// using the configuration struct. +// + virtual function void configure(input CONFIG_T cfg); + bfm.configure( cfg.to_struct() ); + + endfunction + +// **************************************************************************** +// This function places a handle to this class in the proxy variable in the +// monitor BFM. This allows the monitor BFM to call the notify_transaction +// function within this class. +// + virtual function void set_bfm_proxy_handle(); + bfm.proxy = this; endfunction + +// *************************************************************************** + virtual task run_phase(uvm_phase phase); + // Start monitor BFM thread and don't call super.run() in order to + // override the default monitor proxy 'pull' behavior with the more + // emulation-friendly BFM 'push' approach using the notify_transaction + // function below + bfm.start_monitoring(); + endtask + +// ************************************************************************** + +// This function is called by the monitor BFM. It receives data observed by the +// monitor BFM. Data is passed using the mbox_sram_monitor_struct. + virtual function void notify_transaction(input mbox_sram_monitor_s mbox_sram_monitor_struct); + + + trans = new("trans"); + trans.from_monitor_struct(mbox_sram_monitor_struct); + trans.start_time = time_stamp; + trans.end_time = $time; + time_stamp = trans.end_time; + + analyze(trans); + endfunction + +endclass + +// pragma uvmf custom external begin +// pragma uvmf custom external end + diff --git a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/interface_packages/mbox_sram_pkg/src/mbox_sram_monitor_bfm.sv b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/interface_packages/mbox_sram_pkg/src/mbox_sram_monitor_bfm.sv new file mode 100644 index 000000000..191287ca8 --- /dev/null +++ b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/interface_packages/mbox_sram_pkg/src/mbox_sram_monitor_bfm.sv @@ -0,0 +1,238 @@ +//---------------------------------------------------------------------- +// Created with uvmf_gen version 2022.3 +//---------------------------------------------------------------------- +// SPDX-License-Identifier: Apache-2.0 +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// pragma uvmf custom header begin +import soc_ifc_pkg::*; +// pragma uvmf custom header end +//---------------------------------------------------------------------- +//---------------------------------------------------------------------- +// +// DESCRIPTION: This interface performs the mbox_sram signal monitoring. +// It is accessed by the uvm mbox_sram monitor through a virtual +// interface handle in the mbox_sram configuration. It monitors the +// signals passed in through the port connection named bus of +// type mbox_sram_if. +// +// Input signals from the mbox_sram_if are assigned to an internal input +// signal with a _i suffix. The _i signal should be used for sampling. +// +// The input signal connections are as follows: +// bus.signal -> signal_i +// +// Interface functions and tasks used by UVM components: +// monitor(inout TRANS_T txn); +// This task receives the transaction, txn, from the +// UVM monitor and then populates variables in txn +// from values observed on bus activity. This task +// blocks until an operation on the mbox_sram bus is complete. +// +//---------------------------------------------------------------------- +//---------------------------------------------------------------------- +// +import uvmf_base_pkg_hdl::*; +import mbox_sram_pkg_hdl::*; +`include "src/mbox_sram_macros.svh" + + +interface mbox_sram_monitor_bfm + ( mbox_sram_if bus ); + // The pragma below and additional ones in-lined further down are for running this BFM on Veloce + // pragma attribute mbox_sram_monitor_bfm partition_interface_xif + +`ifndef XRTL +// This code is to aid in debugging parameter mismatches between the BFM and its corresponding agent. +// Enable this debug by setting UVM_VERBOSITY to UVM_DEBUG +// Setting UVM_VERBOSITY to UVM_DEBUG causes all BFM's and all agents to display their parameter settings. +// All of the messages from this feature have a UVM messaging id value of "CFG" +// The transcript or run.log can be parsed to ensure BFM parameter settings match its corresponding agents parameter settings. +import uvm_pkg::*; +`include "uvm_macros.svh" +initial begin : bfm_vs_agent_parameter_debug + `uvm_info("CFG", + $psprintf("The BFM at '%m' has the following parameters: ", ), + UVM_DEBUG) +end +`endif + + + // Structure used to pass transaction data from monitor BFM to monitor class in agent. +`mbox_sram_MONITOR_STRUCT + mbox_sram_monitor_s mbox_sram_monitor_struct; + + // Structure used to pass configuration data from monitor class to monitor BFM. + `mbox_sram_CONFIGURATION_STRUCT + + + // Config value to determine if this is an initiator or a responder + uvmf_initiator_responder_t initiator_responder; + // Custom configuration variables. + // These are set using the configure function which is called during the UVM connect_phase + bit [1:0] inject_ecc_error ; + bit auto_clear_ecc_error_injection ; + + tri clk_i; + tri dummy_i; + tri mbox_sram_req_t mbox_sram_req_i; + tri mbox_sram_resp_t mbox_sram_resp_i; + assign clk_i = bus.clk; + assign dummy_i = bus.dummy; + assign mbox_sram_req_i = bus.mbox_sram_req; + assign mbox_sram_resp_i = bus.mbox_sram_resp; + + // Proxy handle to UVM monitor + mbox_sram_pkg::mbox_sram_monitor proxy; + // pragma tbx oneway proxy.notify_transaction + + // pragma uvmf custom interface_item_additional begin + function bit [1:0] rvecc_decode ( input [31:0] din, input [6:0] ecc_in); + bit [6:0] ecc_check; + + // Generate the ecc bits + ecc_check[0] = ecc_in[0]^din[0]^din[1]^din[3]^din[4]^din[6]^din[8]^din[10]^din[11]^din[13]^din[15]^din[17]^din[19]^din[21]^din[23]^din[25]^din[26]^din[28]^din[30]; + ecc_check[1] = ecc_in[1]^din[0]^din[2]^din[3]^din[5]^din[6]^din[9]^din[10]^din[12]^din[13]^din[16]^din[17]^din[20]^din[21]^din[24]^din[25]^din[27]^din[28]^din[31]; + ecc_check[2] = ecc_in[2]^din[1]^din[2]^din[3]^din[7]^din[8]^din[9]^din[10]^din[14]^din[15]^din[16]^din[17]^din[22]^din[23]^din[24]^din[25]^din[29]^din[30]^din[31]; + ecc_check[3] = ecc_in[3]^din[4]^din[5]^din[6]^din[7]^din[8]^din[9]^din[10]^din[18]^din[19]^din[20]^din[21]^din[22]^din[23]^din[24]^din[25]; + ecc_check[4] = ecc_in[4]^din[11]^din[12]^din[13]^din[14]^din[15]^din[16]^din[17]^din[18]^din[19]^din[20]^din[21]^din[22]^din[23]^din[24]^din[25]; + ecc_check[5] = ecc_in[5]^din[26]^din[27]^din[28]^din[29]^din[30]^din[31]; + + // This is the parity bit + ecc_check[6] = ((^din[31:0])^(^ecc_in[6:0])); + + rvecc_decode[0] = (ecc_check[6:0] != 0) & ecc_check[6]; // Single-bit error + rvecc_decode[1] = (ecc_check[6:0] != 0) & ~ecc_check[6]; // Double-bit error + + endfunction: rvecc_decode + // pragma uvmf custom interface_item_additional end + + //****************************************************************** + task wait_for_reset();// pragma tbx xtf +// @(posedge clk_i) ; +// do_wait_for_reset(); + endtask + + // **************************************************************************** + task do_wait_for_reset(); + // pragma uvmf custom reset_condition begin + wait ( dummy_i === 1 ) ; + @(posedge clk_i) ; + // pragma uvmf custom reset_condition end + endtask + + // pragma uvmf custom wait_for_num_clocks begin + //**************************************************************************** + // Inject pragmas's here to throw a warning on regeneration. + // Task must have automatic lifetime so that it can be concurrently invoked + // by multiple entities with a different wait value. + task automatic wait_for_num_clocks(input int unsigned count); // pragma tbx xtf + if (count == 0) `uvm_fatal("CFG", "wait_for_num_clocks called with count of 0 - this will lead to a hang"); + @(posedge clk_i); + repeat (count-1) @(posedge clk_i); + endtask + // pragma uvmf custom wait_for_num_clocks end + + //****************************************************************** + event go; + function void start_monitoring();// pragma tbx xtf + -> go; + endfunction + + // **************************************************************************** + initial begin + @go; + forever begin + do_monitor( mbox_sram_monitor_struct ); + proxy.notify_transaction( mbox_sram_monitor_struct ); + // Back-to-back writes require a clock in between to avoid a 0-time forever loop. + // Reads already inject the extra clock cycle, so we can check cs again immediately. + if (!mbox_sram_monitor_struct.is_read) @(posedge clk_i); + + end + end + + //****************************************************************** + // The configure() function is used to pass agent configuration + // variables to the monitor BFM. It is called by the monitor within + // the agent at the beginning of the simulation. It may be called + // during the simulation if agent configuration variables are updated + // and the monitor BFM needs to be aware of the new configuration + // variables. + // + function void configure(mbox_sram_configuration_s mbox_sram_configuration_arg); // pragma tbx xtf + initiator_responder = mbox_sram_configuration_arg.initiator_responder; + inject_ecc_error = mbox_sram_configuration_arg.inject_ecc_error; + auto_clear_ecc_error_injection = mbox_sram_configuration_arg.auto_clear_ecc_error_injection; + // pragma uvmf custom configure begin + // pragma uvmf custom configure end + endfunction + + + // **************************************************************************** + + task do_monitor(output mbox_sram_monitor_s mbox_sram_monitor_struct); + // + // Available struct members: + // // mbox_sram_monitor_struct.is_read + // // mbox_sram_monitor_struct.address + // // mbox_sram_monitor_struct.data + // // mbox_sram_monitor_struct.data_ecc + // // mbox_sram_monitor_struct.ecc_single_bit_error + // // mbox_sram_monitor_struct.ecc_double_bit_error + // // + // Reference code; + // How to wait for signal value + // while (control_signal === 1'b1) @(posedge clk_i); + // + // How to assign a struct member, named xyz, from a signal. + // All available input signals listed. + // mbox_sram_monitor_struct.xyz = mbox_sram_req_i; // [$bits(mbox_sram_req_t)-1:0] + // mbox_sram_monitor_struct.xyz = mbox_sram_resp_i; // [$bits(mbox_sram_resp_t)-1:0] + // pragma uvmf custom do_monitor begin + // UVMF_CHANGE_ME : Implement protocol monitoring. The commented reference code + // below are examples of how to capture signal values and assign them to + // structure members. All available input signals are listed. The 'while' + // code example shows how to wait for a synchronous flow control signal. This + // task should return when a complete transfer has been observed. Once this task is + // exited with captured values, it is then called again to wait for and observe + // the next transfer. One clock cycle is consumed between calls to do_monitor. + while (mbox_sram_req_i.cs !== 1'b1) @(posedge clk_i); + mbox_sram_monitor_struct.is_read = ~mbox_sram_req_i.we; + mbox_sram_monitor_struct.address = mbox_sram_req_i.addr; + mbox_sram_monitor_struct.data = mbox_sram_req_i.wdata.data; + mbox_sram_monitor_struct.data_ecc = mbox_sram_req_i.wdata.ecc; + // For writes, the monitored transaction signals the _intent_ to inject an ECC error + // at the responder sequence + mbox_sram_monitor_struct.ecc_single_bit_error = proxy.configuration.inject_ecc_error[0]; + mbox_sram_monitor_struct.ecc_double_bit_error = proxy.configuration.inject_ecc_error[1]; + // If a write is detected, return immediately (that's the whole transaction) + if (mbox_sram_req_i.we) return; + // If a read, continue another clock cycle to capture return data + @(posedge clk_i); + mbox_sram_monitor_struct.data = mbox_sram_resp_i.rdata.data; + mbox_sram_monitor_struct.data_ecc = mbox_sram_resp_i.rdata.ecc; + // For reads, the monitored transaction signals the calculation of actual ECC errors + // observed on the data returned from the responder sequence + {mbox_sram_monitor_struct.ecc_double_bit_error, + mbox_sram_monitor_struct.ecc_single_bit_error} = rvecc_decode(mbox_sram_monitor_struct.data, mbox_sram_monitor_struct.data_ecc); + // pragma uvmf custom do_monitor end + endtask + + +endinterface + +// pragma uvmf custom external begin +// pragma uvmf custom external end + diff --git a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/interface_packages/mbox_sram_pkg/src/mbox_sram_random_sequence.svh b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/interface_packages/mbox_sram_pkg/src/mbox_sram_random_sequence.svh new file mode 100644 index 000000000..90ce2cdb4 --- /dev/null +++ b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/interface_packages/mbox_sram_pkg/src/mbox_sram_random_sequence.svh @@ -0,0 +1,67 @@ +//---------------------------------------------------------------------- +// Created with uvmf_gen version 2022.3 +//---------------------------------------------------------------------- +// SPDX-License-Identifier: Apache-2.0 +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// pragma uvmf custom header begin +// pragma uvmf custom header end +//---------------------------------------------------------------------- +//---------------------------------------------------------------------- +// +// DESCRIPTION: +// This sequences randomizes the mbox_sram transaction and sends it +// to the UVM driver. +// +// This sequence constructs and randomizes a mbox_sram_transaction. +// +//---------------------------------------------------------------------- +//---------------------------------------------------------------------- +// +class mbox_sram_random_sequence + extends mbox_sram_sequence_base ; + + `uvm_object_utils( mbox_sram_random_sequence ) + + // pragma uvmf custom class_item_additional begin + // pragma uvmf custom class_item_additional end + + //***************************************************************** + function new(string name = ""); + super.new(name); + endfunction: new + + // **************************************************************************** + // TASK : body() + // This task is automatically executed when this sequence is started using the + // start(sequencerHandle) task. + // + task body(); + + // Construct the transaction + req=mbox_sram_transaction::type_id::create("req"); + start_item(req); + // Randomize the transaction + if(!req.randomize()) `uvm_fatal("SEQ", "mbox_sram_random_sequence::body()-mbox_sram_transaction randomization failed") + // Send the transaction to the mbox_sram_driver_bfm via the sequencer and mbox_sram_driver. + finish_item(req); + `uvm_info("SEQ", {"Response:",req.convert2string()},UVM_MEDIUM) + + endtask + +endclass: mbox_sram_random_sequence + +// pragma uvmf custom external begin +// pragma uvmf custom external end + diff --git a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/interface_packages/mbox_sram_pkg/src/mbox_sram_responder_sequence.svh b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/interface_packages/mbox_sram_pkg/src/mbox_sram_responder_sequence.svh new file mode 100644 index 000000000..97e8efc3c --- /dev/null +++ b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/interface_packages/mbox_sram_pkg/src/mbox_sram_responder_sequence.svh @@ -0,0 +1,122 @@ +//---------------------------------------------------------------------- +// Created with uvmf_gen version 2022.3 +//---------------------------------------------------------------------- +// SPDX-License-Identifier: Apache-2.0 +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// pragma uvmf custom header begin +// pragma uvmf custom header end +//---------------------------------------------------------------------- +//---------------------------------------------------------------------- +// +// DESCRIPTION: This class can be used to provide stimulus when an interface +// has been configured to run in a responder mode. It +// will never finish by default, always going back to the driver +// and driver BFM for the next transaction with which to respond. +// +//---------------------------------------------------------------------- +//---------------------------------------------------------------------- +// +class mbox_sram_responder_sequence + extends mbox_sram_sequence_base ; + + `uvm_object_utils( mbox_sram_responder_sequence ) + + // pragma uvmf custom class_item_additional begin + // Implement a model of the Mailbox SRAM + localparam NUM_BYTES = MBOX_DATA_AND_ECC_W/8 + ((MBOX_DATA_AND_ECC_W % 8) ? 1 : 0); + // TODO support initialization from mailbox.hex + logic [7:0] ram [MBOX_DEPTH][NUM_BYTES-1:0] = '{default: 8'h00}; + + function bit [1:0] rvecc_decode ( input [31:0] din, input [6:0] ecc_in); + bit [6:0] ecc_check; + + // Generate the ecc bits + ecc_check[0] = ecc_in[0]^din[0]^din[1]^din[3]^din[4]^din[6]^din[8]^din[10]^din[11]^din[13]^din[15]^din[17]^din[19]^din[21]^din[23]^din[25]^din[26]^din[28]^din[30]; + ecc_check[1] = ecc_in[1]^din[0]^din[2]^din[3]^din[5]^din[6]^din[9]^din[10]^din[12]^din[13]^din[16]^din[17]^din[20]^din[21]^din[24]^din[25]^din[27]^din[28]^din[31]; + ecc_check[2] = ecc_in[2]^din[1]^din[2]^din[3]^din[7]^din[8]^din[9]^din[10]^din[14]^din[15]^din[16]^din[17]^din[22]^din[23]^din[24]^din[25]^din[29]^din[30]^din[31]; + ecc_check[3] = ecc_in[3]^din[4]^din[5]^din[6]^din[7]^din[8]^din[9]^din[10]^din[18]^din[19]^din[20]^din[21]^din[22]^din[23]^din[24]^din[25]; + ecc_check[4] = ecc_in[4]^din[11]^din[12]^din[13]^din[14]^din[15]^din[16]^din[17]^din[18]^din[19]^din[20]^din[21]^din[22]^din[23]^din[24]^din[25]; + ecc_check[5] = ecc_in[5]^din[26]^din[27]^din[28]^din[29]^din[30]^din[31]; + + // This is the parity bit + ecc_check[6] = ((^din[31:0])^(^ecc_in[6:0])); + + rvecc_decode[0] = (ecc_check[6:0] != 0) & ecc_check[6]; // Single-bit error + rvecc_decode[1] = (ecc_check[6:0] != 0) & ~ecc_check[6]; // Double-bit error + + endfunction: rvecc_decode + // pragma uvmf custom class_item_additional end + + function new(string name = "mbox_sram_responder_sequence"); + super.new(name); + endfunction + + task body(); + req=mbox_sram_transaction::type_id::create("req"); + forever begin + start_item(req); + finish_item(req); + // pragma uvmf custom body begin + // Do something here with the resulting req item. The + // finish_item() call above will block until the req transaction is ready + // to be handled by the responder sequence. + // If this was an item that required a response, the expectation is + // that the response should be populated within this transaction now. + wait(new_rsp.triggered); + if (req.compare(rsp)) `uvm_info("MBOX_SRAM_SEQ", "req and rsp are the same after finish_item", UVM_DEBUG) + else `uvm_error("MBOX_SRAM_SEQ", $sformatf("NOTE: req and rsp are different after finish_item.\nreq: %s\nrsp: %s", req.convert2string(), rsp.convert2string())) + // The 'rsp' is actually a request from the DUT, we need to create a response + if (rsp.is_read) begin + byte unsigned ii; + for (ii=0;iinew_rsp; + // Display the received response transaction + `uvm_info("SEQ", {"New response transaction:",rsp.convert2string()}, UVM_MEDIUM) + end + join_none + endtask + + // **************************************************************************** + // TASK : pre_body() + // This task is called automatically when start is called with call_pre_post set to 1 (default). + // By calling get_responses() within pre_body() any derived sequences are automatically + // processing response transactions. Only un-comment this call to get_responses() if you + // have configured the interface driver to utilize the response transaction path by setting + // the configuration variable "return_transaction_response" to 1. Otherwise it is possible + // to impact runtime performance and memory utilization. + // + virtual task pre_body(); + // pragma uvmf custom pre_body begin + get_responses(); + // pragma uvmf custom pre_body end + endtask + + // **************************************************************************** + // TASK : body() + // This task is called automatically when start is called. This sequence sends + // a req sequence item to the sequencer identified as an argument in the call + // to start. + // + virtual task body(); + // pragma uvmf custom body begin + start_item(req); + finish_item(req); + // pragma uvmf custom body end + endtask + + // **************************************************************************** + // FUNCTION : new() + // This function is the standard SystemVerilog constructor. + // + function new( string name =""); + super.new( name ); + // pragma uvmf custom new begin + req = mbox_sram_transaction_req_t::type_id::create("req"); + rsp = mbox_sram_transaction_rsp_t::type_id::create("rsp"); + // pragma uvmf custom new end + endfunction + +endclass + +// pragma uvmf custom external begin +// pragma uvmf custom external end + diff --git a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/interface_packages/mbox_sram_pkg/src/mbox_sram_transaction.svh b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/interface_packages/mbox_sram_pkg/src/mbox_sram_transaction.svh new file mode 100644 index 000000000..dd3049af0 --- /dev/null +++ b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/interface_packages/mbox_sram_pkg/src/mbox_sram_transaction.svh @@ -0,0 +1,216 @@ +//---------------------------------------------------------------------- +// Created with uvmf_gen version 2022.3 +//---------------------------------------------------------------------- +// SPDX-License-Identifier: Apache-2.0 +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// pragma uvmf custom header begin +// pragma uvmf custom header end +//---------------------------------------------------------------------- +//---------------------------------------------------------------------- +// +// DESCRIPTION: This class defines the variables required for an mbox_sram +// transaction. Class variables to be displayed in waveform transaction +// viewing are added to the transaction viewing stream in the add_to_wave +// function. +// +//---------------------------------------------------------------------- +//---------------------------------------------------------------------- +// +class mbox_sram_transaction extends uvmf_transaction_base; + + `uvm_object_utils( mbox_sram_transaction ) + + rand bit is_read ; + rand bit [MBOX_ADDR_W-1:0] address ; + rand bit [MBOX_DATA_W-1:0] data ; + bit [MBOX_ECC_DATA_W-1:0] data_ecc ; + rand bit ecc_single_bit_error ; + rand bit ecc_double_bit_error ; + + //Constraints for the transaction variables: + + // pragma uvmf custom class_item_additional begin + // pragma uvmf custom class_item_additional end + + //******************************************************************* + //******************************************************************* + // Macros that define structs and associated functions are + // located in mbox_sram_macros.svh + + //******************************************************************* + // Monitor macro used by mbox_sram_monitor and mbox_sram_monitor_bfm + // This struct is defined in mbox_sram_macros.svh + `mbox_sram_MONITOR_STRUCT + mbox_sram_monitor_s mbox_sram_monitor_struct; + //******************************************************************* + // FUNCTION: to_monitor_struct() + // This function packs transaction variables into a mbox_sram_monitor_s + // structure. The function returns the handle to the mbox_sram_monitor_struct. + // This function is defined in mbox_sram_macros.svh + `mbox_sram_TO_MONITOR_STRUCT_FUNCTION + //******************************************************************* + // FUNCTION: from_monitor_struct() + // This function unpacks the struct provided as an argument into transaction + // variables of this class. + // This function is defined in mbox_sram_macros.svh + `mbox_sram_FROM_MONITOR_STRUCT_FUNCTION + + //******************************************************************* + // Initiator macro used by mbox_sram_driver and mbox_sram_driver_bfm + // to communicate initiator driven data to mbox_sram_driver_bfm. + // This struct is defined in mbox_sram_macros.svh + `mbox_sram_INITIATOR_STRUCT + mbox_sram_initiator_s mbox_sram_initiator_struct; + //******************************************************************* + // FUNCTION: to_initiator_struct() + // This function packs transaction variables into a mbox_sram_initiator_s + // structure. The function returns the handle to the mbox_sram_initiator_struct. + // This function is defined in mbox_sram_macros.svh + `mbox_sram_TO_INITIATOR_STRUCT_FUNCTION + //******************************************************************* + // FUNCTION: from_initiator_struct() + // This function unpacks the struct provided as an argument into transaction + // variables of this class. + // This function is defined in mbox_sram_macros.svh + `mbox_sram_FROM_INITIATOR_STRUCT_FUNCTION + + //******************************************************************* + // Responder macro used by mbox_sram_driver and mbox_sram_driver_bfm + // to communicate Responder driven data to mbox_sram_driver_bfm. + // This struct is defined in mbox_sram_macros.svh + `mbox_sram_RESPONDER_STRUCT + mbox_sram_responder_s mbox_sram_responder_struct; + //******************************************************************* + // FUNCTION: to_responder_struct() + // This function packs transaction variables into a mbox_sram_responder_s + // structure. The function returns the handle to the mbox_sram_responder_struct. + // This function is defined in mbox_sram_macros.svh + `mbox_sram_TO_RESPONDER_STRUCT_FUNCTION + //******************************************************************* + // FUNCTION: from_responder_struct() + // This function unpacks the struct provided as an argument into transaction + // variables of this class. + // This function is defined in mbox_sram_macros.svh + `mbox_sram_FROM_RESPONDER_STRUCT_FUNCTION + // **************************************************************************** + // FUNCTION : new() + // This function is the standard SystemVerilog constructor. + // + function new( string name = "" ); + super.new( name ); + endfunction + + // **************************************************************************** + // FUNCTION: convert2string() + // This function converts all variables in this class to a single string for + // logfile reporting. + // + virtual function string convert2string(); + // pragma uvmf custom convert2string begin + // UVMF_CHANGE_ME : Customize format if desired. + return $sformatf("is_read:0x%x address:0x%x data:0x%x data_ecc:0x%x ecc_single_bit_error:0x%x ecc_double_bit_error:0x%x ",is_read,address,data,data_ecc,ecc_single_bit_error,ecc_double_bit_error); + // pragma uvmf custom convert2string end + endfunction + + //******************************************************************* + // FUNCTION: do_print() + // This function is automatically called when the .print() function + // is called on this class. + // + virtual function void do_print(uvm_printer printer); + // pragma uvmf custom do_print begin + // UVMF_CHANGE_ME : Current contents of do_print allows for the use of UVM 1.1d, 1.2 or P1800.2. + // Update based on your own printing preference according to your preferred UVM version + $display(convert2string()); + // pragma uvmf custom do_print end + endfunction + + //******************************************************************* + // FUNCTION: do_compare() + // This function is automatically called when the .compare() function + // is called on this class. + // + virtual function bit do_compare (uvm_object rhs, uvm_comparer comparer); + mbox_sram_transaction RHS; + if (!$cast(RHS,rhs)) return 0; + // pragma uvmf custom do_compare begin + // UVMF_CHANGE_ME : Eliminate comparison of variables not to be used for compare + return (super.do_compare(rhs,comparer) + &&(this.is_read == RHS.is_read) + &&(this.address == RHS.address) + &&(this.data == RHS.data) + &&(this.data_ecc == RHS.data_ecc) + &&(this.ecc_single_bit_error == RHS.ecc_single_bit_error) + &&(this.ecc_double_bit_error == RHS.ecc_double_bit_error) + ); + // pragma uvmf custom do_compare end + endfunction + + //******************************************************************* + // FUNCTION: do_copy() + // This function is automatically called when the .copy() function + // is called on this class. + // + virtual function void do_copy (uvm_object rhs); + mbox_sram_transaction RHS; + assert($cast(RHS,rhs)); + // pragma uvmf custom do_copy begin + super.do_copy(rhs); + this.is_read = RHS.is_read; + this.address = RHS.address; + this.data = RHS.data; + this.data_ecc = RHS.data_ecc; + this.ecc_single_bit_error = RHS.ecc_single_bit_error; + this.ecc_double_bit_error = RHS.ecc_double_bit_error; + // pragma uvmf custom do_copy end + endfunction + + // **************************************************************************** + // FUNCTION: add_to_wave() + // This function is used to display variables in this class in the waveform + // viewer. The start_time and end_time variables must be set before this + // function is called. If the start_time and end_time variables are not set + // the transaction will be hidden at 0ns on the waveform display. + // + virtual function void add_to_wave(int transaction_viewing_stream_h); + `ifdef QUESTA + if (transaction_view_h == 0) begin + transaction_view_h = $begin_transaction(transaction_viewing_stream_h,"mbox_sram_transaction",start_time); + end + super.add_to_wave(transaction_view_h); + // pragma uvmf custom add_to_wave begin + // UVMF_CHANGE_ME : Color can be applied to transaction entries based on content, example below + // case() + // 1 : $add_color(transaction_view_h,"red"); + // default : $add_color(transaction_view_h,"grey"); + // endcase + // UVMF_CHANGE_ME : Eliminate transaction variables not wanted in transaction viewing in the waveform viewer + $add_attribute(transaction_view_h,is_read,"is_read"); + $add_attribute(transaction_view_h,address,"address"); + $add_attribute(transaction_view_h,data,"data"); + $add_attribute(transaction_view_h,data_ecc,"data_ecc"); + $add_attribute(transaction_view_h,ecc_single_bit_error,"ecc_single_bit_error"); + $add_attribute(transaction_view_h,ecc_double_bit_error,"ecc_double_bit_error"); + // pragma uvmf custom add_to_wave end + $end_transaction(transaction_view_h,end_time); + $free_transaction(transaction_view_h); + `endif // QUESTA + endfunction + +endclass + +// pragma uvmf custom external begin +// pragma uvmf custom external end + diff --git a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/interface_packages/mbox_sram_pkg/src/mbox_sram_transaction_coverage.svh b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/interface_packages/mbox_sram_pkg/src/mbox_sram_transaction_coverage.svh new file mode 100644 index 000000000..9c935c889 --- /dev/null +++ b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/interface_packages/mbox_sram_pkg/src/mbox_sram_transaction_coverage.svh @@ -0,0 +1,107 @@ +//---------------------------------------------------------------------- +// Created with uvmf_gen version 2022.3 +//---------------------------------------------------------------------- +// SPDX-License-Identifier: Apache-2.0 +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// pragma uvmf custom header begin +// pragma uvmf custom header end +//---------------------------------------------------------------------- +//---------------------------------------------------------------------- +// +// DESCRIPTION: This class records mbox_sram transaction information using +// a covergroup named mbox_sram_transaction_cg. An instance of this +// coverage component is instantiated in the uvmf_parameterized_agent +// if the has_coverage flag is set. +// +//---------------------------------------------------------------------- +//---------------------------------------------------------------------- +// +covergroup mbox_sram_transaction_bit_cg with function sample(input bit val); + option.per_instance = 1; + ea_bit: coverpoint val; +endgroup + +class mbox_sram_transaction_coverage extends uvm_subscriber #(.T(mbox_sram_transaction )); + + `uvm_component_utils( mbox_sram_transaction_coverage ) + + T coverage_trans; + + // pragma uvmf custom class_item_additional begin + mbox_sram_transaction_bit_cg address_bit_cg[MBOX_ADDR_W]; + mbox_sram_transaction_bit_cg data_bit_cg[MBOX_DATA_W]; + mbox_sram_transaction_bit_cg data_ecc_bit_cg[MBOX_ECC_DATA_W]; + // pragma uvmf custom class_item_additional end + + // **************************************************************************** + covergroup mbox_sram_transaction_cg; + // pragma uvmf custom covergroup begin + // UVMF_CHANGE_ME : Add coverage bins, crosses, exclusions, etc. according to coverage needs. + option.auto_bin_max=1024; + option.per_instance=1; + is_read: coverpoint coverage_trans.is_read; + address: coverpoint coverage_trans.address; + data: coverpoint coverage_trans.data; + data_ecc: coverpoint coverage_trans.data_ecc; + ecc_single_bit_error: coverpoint coverage_trans.ecc_single_bit_error; + ecc_double_bit_error: coverpoint coverage_trans.ecc_double_bit_error; + // TODO add checks for ecc single/double errors, address='0, address='1, address alignment cases + // TODO add cross for read transaction, write transaction + // pragma uvmf custom covergroup end + endgroup + + // **************************************************************************** + // FUNCTION : new() + // This function is the standard SystemVerilog constructor. + // + function new(string name="", uvm_component parent=null); + super.new(name,parent); + mbox_sram_transaction_cg=new; + foreach (coverage_trans.address[bt]) address_bit_cg[bt] = new; + foreach (coverage_trans.data[bt]) data_bit_cg[bt] = new; + foreach (coverage_trans.data_ecc[bt]) data_ecc_bit_cg[bt] = new; + endfunction + + // **************************************************************************** + // FUNCTION : build_phase() + // This function is the standard UVM build_phase. + // + function void build_phase(uvm_phase phase); + mbox_sram_transaction_cg.set_inst_name($sformatf("mbox_sram_transaction_cg_%s",get_full_name())); + foreach (coverage_trans.address[bt]) address_bit_cg[bt].set_inst_name($sformatf("address_bit_cg_%d_%s", bt, get_full_name())); + foreach (coverage_trans.data[bt]) data_bit_cg[bt].set_inst_name($sformatf("data_bit_cg_%d_%s", bt, get_full_name())); + foreach (coverage_trans.data_ecc[bt]) data_ecc_bit_cg[bt].set_inst_name($sformatf("data_ecc_bit_cg_%d_%s", bt, get_full_name())); + endfunction + + // **************************************************************************** + // FUNCTION: write (T t) + // This function is automatically executed when a transaction arrives on the + // analysis_export. It copies values from the variables in the transaction + // to local variables used to collect functional coverage. + // + virtual function void write (T t); + `uvm_info("COV","Received transaction",UVM_HIGH); + coverage_trans = t; + mbox_sram_transaction_cg.sample(); + foreach (coverage_trans.address [bt]) address_bit_cg [bt].sample(coverage_trans.address [bt]); + foreach (coverage_trans.data [bt]) data_bit_cg [bt].sample(coverage_trans.data [bt]); + foreach (coverage_trans.data_ecc[bt]) data_ecc_bit_cg[bt].sample(coverage_trans.data_ecc[bt]); + endfunction + +endclass + +// pragma uvmf custom external begin +// pragma uvmf custom external end + diff --git a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/interface_packages/mbox_sram_pkg/src/mbox_sram_typedefs.svh b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/interface_packages/mbox_sram_pkg/src/mbox_sram_typedefs.svh new file mode 100644 index 000000000..f2a7bdb94 --- /dev/null +++ b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/interface_packages/mbox_sram_pkg/src/mbox_sram_typedefs.svh @@ -0,0 +1,34 @@ +//---------------------------------------------------------------------- +// Created with uvmf_gen version 2022.3 +//---------------------------------------------------------------------- +// SPDX-License-Identifier: Apache-2.0 +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// pragma uvmf custom header begin +// pragma uvmf custom header end +//---------------------------------------------------------------------- +//---------------------------------------------------------------------- +// +// DESCRIPTION: +// This file contains defines and typedefs to be compiled for use in +// the simulation running on the host server when using Veloce. +// +//---------------------------------------------------------------------- +//---------------------------------------------------------------------- +// + + +// pragma uvmf custom additional begin +// pragma uvmf custom additional end + diff --git a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/interface_packages/mbox_sram_pkg/src/mbox_sram_typedefs_hdl.svh b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/interface_packages/mbox_sram_pkg/src/mbox_sram_typedefs_hdl.svh new file mode 100644 index 000000000..0d58518e2 --- /dev/null +++ b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/interface_packages/mbox_sram_pkg/src/mbox_sram_typedefs_hdl.svh @@ -0,0 +1,35 @@ +//---------------------------------------------------------------------- +// Created with uvmf_gen version 2022.3 +//---------------------------------------------------------------------- +// SPDX-License-Identifier: Apache-2.0 +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// pragma uvmf custom header begin +// pragma uvmf custom header end +//---------------------------------------------------------------------- +//---------------------------------------------------------------------- +// +// DESCRIPTION: +// This file contains defines and typedefs to be compiled for use in +// the simulation running on the emulator when using Veloce. +// +//---------------------------------------------------------------------- +//---------------------------------------------------------------------- +// + + + +// pragma uvmf custom additional begin +// pragma uvmf custom additional end + diff --git a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/interface_packages/mbox_sram_pkg/yaml/mbox_sram_interface.yaml b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/interface_packages/mbox_sram_pkg/yaml/mbox_sram_interface.yaml new file mode 100644 index 000000000..903678275 --- /dev/null +++ b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/interface_packages/mbox_sram_pkg/yaml/mbox_sram_interface.yaml @@ -0,0 +1,73 @@ +uvmf: + interfaces: + mbox_sram: + clock: clk + config_constraints: [] + config_vars: + - comment: 'Controls injection of ECC errors for write transactions. Bit[0]: Single Bit Error. Bit[1]: Double Bit Error' + isrand: 'False' + name: inject_ecc_error + type: bit [1:0] + value: 1'b0 + - comment: When set, causes the mbox_sram_responder_sequence to clear the variable 'inject_ecc_error' after a single ECC error is injected + isrand: 'False' + name: auto_clear_ecc_error_injection + type: bit + value: 1'b1 + existing_library_component: 'True' + gen_inbound_streaming_driver: 'False' + hdl_pkg_parameters: [] + hdl_typedefs: [] + hvl_pkg_parameters: [] + hvl_typedefs: [] + parameters: [] + ports: + - dir: output + name: mbox_sram_req + reset_value: '''bz' + width: $bits(mbox_sram_req_t) + - dir: input + name: mbox_sram_resp + reset_value: '''bz' + width: $bits(mbox_sram_resp_t) + reset: dummy + reset_assertion_level: 'False' + transaction_constraints: [] + transaction_vars: + - comment: '' + iscompare: 'True' + isrand: 'True' + name: is_read + type: bit + unpacked_dimension: '' + - comment: '' + iscompare: 'True' + isrand: 'True' + name: address + type: bit [MBOX_ADDR_W-1:0] + unpacked_dimension: '' + - comment: '' + iscompare: 'True' + isrand: 'True' + name: data + type: bit [MBOX_DATA_W-1:0] + unpacked_dimension: '' + - comment: '' + iscompare: 'True' + isrand: 'False' + name: data_ecc + type: bit [MBOX_ECC_DATA_W-1:0] + unpacked_dimension: '' + - comment: '' + iscompare: 'True' + isrand: 'True' + name: ecc_single_bit_error + type: bit + unpacked_dimension: '' + - comment: '' + iscompare: 'True' + isrand: 'True' + name: ecc_double_bit_error + type: bit + unpacked_dimension: '' + use_dpi_link: 'False' diff --git a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/interface_packages/soc_ifc_ctrl_pkg/soc_ifc_ctrl_pkg.sv b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/interface_packages/soc_ifc_ctrl_pkg/soc_ifc_ctrl_pkg.sv index 85624b2e8..32a87187f 100644 --- a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/interface_packages/soc_ifc_ctrl_pkg/soc_ifc_ctrl_pkg.sv +++ b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/interface_packages/soc_ifc_ctrl_pkg/soc_ifc_ctrl_pkg.sv @@ -85,8 +85,11 @@ package soc_ifc_ctrl_pkg; // the new sequence after any base sequences of the new sequence. `include "src/soc_ifc_ctrl_reset_sequence_base.svh" `include "src/soc_ifc_ctrl_poweron_sequence.svh" + `include "src/soc_ifc_ctrl_rom_poweron_sequence.svh" `include "src/soc_ifc_ctrl_reset_warm_sequence.svh" `include "src/soc_ifc_ctrl_reset_cold_sequence.svh" + `include "src/soc_ifc_ctrl_wdt_cascade_sequence.svh" + `include "src/soc_ifc_ctrl_wdt_independent_sequence.svh" // pragma uvmf custom package_item_additional end endpackage diff --git a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/interface_packages/soc_ifc_ctrl_pkg/src/soc_ifc_ctrl_monitor_bfm.sv b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/interface_packages/soc_ifc_ctrl_pkg/src/soc_ifc_ctrl_monitor_bfm.sv index 6e6c1e325..171da784b 100644 --- a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/interface_packages/soc_ifc_ctrl_pkg/src/soc_ifc_ctrl_monitor_bfm.sv +++ b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/interface_packages/soc_ifc_ctrl_pkg/src/soc_ifc_ctrl_monitor_bfm.sv @@ -184,8 +184,8 @@ end // Task must have automatic lifetime so that it can be concurrently invoked // by multiple entities with a different wait value. task automatic wait_for_num_clocks(input int unsigned count); // pragma tbx xtf - @(posedge clk_i); - + if (count == 0) `uvm_fatal("CFG", "wait_for_num_clocks called with count of 0 - this will lead to a hang"); + @(posedge clk_i); repeat (count-1) @(posedge clk_i); endtask // pragma uvmf custom wait_for_num_clocks end diff --git a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/interface_packages/soc_ifc_ctrl_pkg/src/soc_ifc_ctrl_reset_sequence_base.svh b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/interface_packages/soc_ifc_ctrl_pkg/src/soc_ifc_ctrl_reset_sequence_base.svh index e93a29ef3..715992a1a 100644 --- a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/interface_packages/soc_ifc_ctrl_pkg/src/soc_ifc_ctrl_reset_sequence_base.svh +++ b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/interface_packages/soc_ifc_ctrl_pkg/src/soc_ifc_ctrl_reset_sequence_base.svh @@ -37,7 +37,7 @@ class soc_ifc_ctrl_reset_sequence_base // pragma uvmf custom class_item_additional begin bit warm_reset_only = 1'b0; bit set_bootfsm_breakpoint; - bit debug_locked = 1'b1; // Can randomize this with another sequence... + security_state_t security_state; bit [7:0] [31:0] cptra_obf_key ; // pragma uvmf custom class_item_additional end @@ -58,7 +58,6 @@ class soc_ifc_ctrl_reset_sequence_base if(!req.randomize()) `uvm_fatal("SOC_IFC_CTRL_RST", "soc_ifc_ctrl_reset_sequence_base::body()-soc_ifc_ctrl_transaction randomization failed") req.set_pwrgood = 1'b0; req.assert_rst = 1'b1; // active-low assertion - req.security_state.debug_locked = this.debug_locked; // Send the transaction to the soc_ifc_ctrl_driver_bfm via the sequencer and soc_ifc_ctrl_driver. finish_item(req); `uvm_info("SOC_IFC_CTRL_RST", {"Response:",req.convert2string()},UVM_MEDIUM) @@ -78,7 +77,6 @@ class soc_ifc_ctrl_reset_sequence_base if(!req.randomize()) `uvm_fatal("SOC_IFC_CTRL_RST", "soc_ifc_ctrl_reset_sequence_base::body()-soc_ifc_ctrl_transaction randomization failed") req.set_pwrgood = 1'b1; req.assert_rst = 1'b1; // active-low assertion - req.security_state.debug_locked = this.debug_locked; if (warm_reset_only) begin this.cptra_obf_key = req.cptra_obf_key_rand; this.set_bootfsm_breakpoint = req.set_bootfsm_breakpoint; @@ -104,12 +102,12 @@ class soc_ifc_ctrl_reset_sequence_base if(!req.randomize()) `uvm_fatal("SOC_IFC_CTRL_RST", "soc_ifc_ctrl_reset_sequence_base::body()-soc_ifc_ctrl_transaction randomization failed") req.set_pwrgood = 1'b1; req.assert_rst = 1'b0; - req.security_state.debug_locked = this.debug_locked; req.cptra_obf_key_rand = this.cptra_obf_key; req.set_bootfsm_breakpoint = this.set_bootfsm_breakpoint; req.wait_cycles = 0; // Send the transaction to the soc_ifc_ctrl_driver_bfm via the sequencer and soc_ifc_ctrl_driver. finish_item(req); + this.security_state = req.security_state; `uvm_info("SOC_IFC_CTRL_RST", {"Response:",req.convert2string()},UVM_MEDIUM) endtask diff --git a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/interface_packages/soc_ifc_ctrl_pkg/src/soc_ifc_ctrl_rom_poweron_sequence.svh b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/interface_packages/soc_ifc_ctrl_pkg/src/soc_ifc_ctrl_rom_poweron_sequence.svh new file mode 100644 index 000000000..841c92a7b --- /dev/null +++ b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/interface_packages/soc_ifc_ctrl_pkg/src/soc_ifc_ctrl_rom_poweron_sequence.svh @@ -0,0 +1,62 @@ +//---------------------------------------------------------------------- +// Created with uvmf_gen version 2022.3 +//---------------------------------------------------------------------- +// SPDX-License-Identifier: Apache-2.0 +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// pragma uvmf custom header begin +// pragma uvmf custom header end +//---------------------------------------------------------------------- +//---------------------------------------------------------------------- +// +// DESCRIPTION: +// This sequences randomizes the soc_ifc_ctrl transaction and sends it +// to the UVM driver. +// +// This sequence constructs and randomizes a soc_ifc_ctrl_transaction. +// +//---------------------------------------------------------------------- +//---------------------------------------------------------------------- +// +class soc_ifc_ctrl_rom_poweron_sequence + extends soc_ifc_ctrl_reset_sequence_base ; + + `uvm_object_utils( soc_ifc_ctrl_rom_poweron_sequence ) + + //***************************************************************** + function new(string name = ""); + super.new(name); + endfunction: new + + // **************************************************************************** + // TASK : assert_cold_rst() + // Invoked by body() + // + virtual task assert_cold_rst(); + // Initialize first transaction with pwrgood = 0, cptra_rst_b = 0 (asserted) + req=soc_ifc_ctrl_transaction::type_id::create("pwr_req"); + start_item(req); + // Randomize the transaction (must be DEVICE_UNPROVISIONED for ROM bringup) + if(!req.randomize() with {security_state.device_lifecycle != DEVICE_UNPROVISIONED;}) + `uvm_fatal("SOC_IFC_CTRL_RST", "soc_ifc_ctrl_reset_sequence_base::body()-soc_ifc_ctrl_transaction randomization failed") + req.set_pwrgood = 1'b0; + req.assert_rst = 1'b1; // active-low assertion + // Send the transaction to the soc_ifc_ctrl_driver_bfm via the sequencer and soc_ifc_ctrl_driver. + finish_item(req); + `uvm_info("SOC_IFC_CTRL_RST", {"Response:",req.convert2string()},UVM_MEDIUM) + this.cptra_obf_key = req.cptra_obf_key_rand; + this.set_bootfsm_breakpoint = req.set_bootfsm_breakpoint; + endtask + +endclass: soc_ifc_ctrl_rom_poweron_sequence diff --git a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/interface_packages/soc_ifc_ctrl_pkg/src/soc_ifc_ctrl_transaction.svh b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/interface_packages/soc_ifc_ctrl_pkg/src/soc_ifc_ctrl_transaction.svh index aa0afde7c..4266453ce 100644 --- a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/interface_packages/soc_ifc_ctrl_pkg/src/soc_ifc_ctrl_transaction.svh +++ b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/interface_packages/soc_ifc_ctrl_pkg/src/soc_ifc_ctrl_transaction.svh @@ -43,8 +43,15 @@ class soc_ifc_ctrl_transaction extends uvmf_transaction_base; //Constraints for the transaction variables: constraint wait_cycles_c { wait_cycles dist {[1:25] := 80, [25:100] := 15, [100:500] := 5}; } constraint generic_tie_zero_c { generic_input_val == 64'h0; } + constraint debug_locked_c {security_state.debug_locked == 1'b1;} //reset sequence tied this off, doing it here instead constraint device_lifecycle_const_c { if (device_lifecycle_set_static) {security_state.device_lifecycle == device_lifecycle_static; } } + //Match RTL constraint for latching bootfsm breakpoint + //we'll never set bootfsm breakpoint unless we are in the appropriate debug/device lifecycle state to latch it in RTL + constraint set_bootfsm_breakpoint_c { if ((security_state.debug_locked) & + ~((security_state.debug_locked) & (security_state.device_lifecycle == DEVICE_MANUFACTURING))) + {set_bootfsm_breakpoint == 0;} + solve security_state before set_bootfsm_breakpoint; } // pragma uvmf custom class_item_additional begin static device_lifecycle_e device_lifecycle_static = 'X; @@ -128,7 +135,7 @@ class soc_ifc_ctrl_transaction extends uvmf_transaction_base; virtual function string convert2string(); // pragma uvmf custom convert2string begin // UVMF_CHANGE_ME : Customize format if desired. - return $sformatf("cptra_obf_key_rand:0x%x set_pwrgood:0x%x assert_rst:0x%x wait_cycles:0x%x security_state:%p set_bootfsm_breakpoint:0x%x generic_input_val:0x%x ",cptra_obf_key_rand,set_pwrgood,assert_rst,wait_cycles,security_state,set_bootfsm_breakpoint,generic_input_val); + return $sformatf("cptra_obf_key_rand:0x%x set_pwrgood:0x%x assert_rst:0x%x wait_cycles:0x%x security_state:%p set_bootfsm_breakpoint:0x%x generic_input_val:0x%x %s",cptra_obf_key_rand,set_pwrgood,assert_rst,wait_cycles,security_state,set_bootfsm_breakpoint,generic_input_val,super.convert2string()); // pragma uvmf custom convert2string end endfunction @@ -219,6 +226,7 @@ endclass // pragma uvmf custom external begin function void soc_ifc_ctrl_transaction::post_randomize(); super.post_randomize(); + if (!device_lifecycle_set_static || (device_lifecycle_static == 'hX)) begin device_lifecycle_static = this.security_state.device_lifecycle; device_lifecycle_set_static = 1'b1; diff --git a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/interface_packages/soc_ifc_ctrl_pkg/src/soc_ifc_ctrl_transaction_coverage.svh b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/interface_packages/soc_ifc_ctrl_pkg/src/soc_ifc_ctrl_transaction_coverage.svh index d4d918af5..c245cbb33 100644 --- a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/interface_packages/soc_ifc_ctrl_pkg/src/soc_ifc_ctrl_transaction_coverage.svh +++ b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/interface_packages/soc_ifc_ctrl_pkg/src/soc_ifc_ctrl_transaction_coverage.svh @@ -28,6 +28,11 @@ //---------------------------------------------------------------------- //---------------------------------------------------------------------- // +covergroup soc_ifc_ctrl_transaction_bit_cg with function sample(input bit val); + option.per_instance = 1; + ea_bit: coverpoint val; +endgroup + class soc_ifc_ctrl_transaction_coverage extends uvm_subscriber #(.T(soc_ifc_ctrl_transaction )); `uvm_component_utils( soc_ifc_ctrl_transaction_coverage ) @@ -35,6 +40,8 @@ class soc_ifc_ctrl_transaction_coverage extends uvm_subscriber #(.T(soc_ifc_ctr T coverage_trans; // pragma uvmf custom class_item_additional begin + soc_ifc_ctrl_transaction_bit_cg cptra_obf_key_rand_bit_cg[`CLP_OBF_KEY_DWORDS-1:0] [31:0]; + soc_ifc_ctrl_transaction_bit_cg generic_input_val_bit_cg[63:0] ; // pragma uvmf custom class_item_additional end // **************************************************************************** @@ -43,13 +50,39 @@ class soc_ifc_ctrl_transaction_coverage extends uvm_subscriber #(.T(soc_ifc_ctr // UVMF_CHANGE_ME : Add coverage bins, crosses, exclusions, etc. according to coverage needs. option.auto_bin_max=1024; option.per_instance=1; - cptra_obf_key_rand: coverpoint coverage_trans.cptra_obf_key_rand; + cptra_obf_key_rand: coverpoint coverage_trans.cptra_obf_key_rand { + bins zero_key = {0}; + bins rand_key = {[1:{`CLP_OBF_KEY_DWORDS{32'hFFFF_FFFF}}-1]}; + bins ones_key = {{`CLP_OBF_KEY_DWORDS{32'hFFFF_FFFF}}}; + } set_pwrgood: coverpoint coverage_trans.set_pwrgood; assert_rst: coverpoint coverage_trans.assert_rst; - wait_cycles: coverpoint coverage_trans.wait_cycles; + wait_cycles: coverpoint coverage_trans.wait_cycles { + bins zero_wait = {0}; + bins one_wait = {1}; + bins small_wait = {[2:255]}; + bins med_wait = {[256:1023]}; + bins large_wait = {[1024:65535]}; + bins max_wait = {[65536:$]}; + } security_state: coverpoint coverage_trans.security_state; set_bootfsm_breakpoint: coverpoint coverage_trans.set_bootfsm_breakpoint; - generic_input_val: coverpoint coverage_trans.generic_input_val; + generic_input_val: coverpoint coverage_trans.generic_input_val { + bins byte_none = {64'h0000_0000_0000_0000}; + bins byte_0 = {[0:$]} with ($countones(item[ 7: 0] > 0)); + bins byte_1 = {[0:$]} with ($countones(item[15: 8] > 0)); + bins byte_2 = {[0:$]} with ($countones(item[23:16] > 0)); + bins byte_3 = {[0:$]} with ($countones(item[31:24] > 0)); + bins byte_4 = {[0:$]} with ($countones(item[39:32] > 0)); + bins byte_5 = {[0:$]} with ($countones(item[47:40] > 0)); + bins byte_6 = {[0:$]} with ($countones(item[55:48] > 0)); + bins byte_7 = {[0:$]} with ($countones(item[63:56] > 0)); + } + + cross_rst : cross set_pwrgood, assert_rst; + cross_brk : cross assert_rst, set_bootfsm_breakpoint { + bins brkpoint_while_rst = binsof (set_bootfsm_breakpoint) with (assert_rst == 1); + } // pragma uvmf custom covergroup end endgroup @@ -60,7 +93,8 @@ class soc_ifc_ctrl_transaction_coverage extends uvm_subscriber #(.T(soc_ifc_ctr function new(string name="", uvm_component parent=null); super.new(name,parent); soc_ifc_ctrl_transaction_cg=new; - `uvm_warning("COVERAGE_MODEL_REVIEW", "A covergroup has been constructed which may need review because of either generation or re-generation with merging. Please note that transaction variables added as a result of re-generation and merging are not automatically added to the covergroup. Remove this warning after the covergroup has been reviewed.") + foreach (coverage_trans.cptra_obf_key_rand[dw,bt]) cptra_obf_key_rand_bit_cg[dw][bt] = new; + foreach (coverage_trans.generic_input_val[bt] ) generic_input_val_bit_cg[bt] = new; endfunction // **************************************************************************** @@ -69,6 +103,8 @@ class soc_ifc_ctrl_transaction_coverage extends uvm_subscriber #(.T(soc_ifc_ctr // function void build_phase(uvm_phase phase); soc_ifc_ctrl_transaction_cg.set_inst_name($sformatf("soc_ifc_ctrl_transaction_cg_%s",get_full_name())); + foreach (coverage_trans.cptra_obf_key_rand[dw,bt]) cptra_obf_key_rand_bit_cg[dw][bt].set_inst_name($sformatf("cptra_obf_key_rand_bit_cg_%d_%d_%s",dw, bt, get_full_name())); + foreach (coverage_trans. generic_input_val[bt]) generic_input_val_bit_cg[bt] .set_inst_name($sformatf( "generic_input_val_bit_cg_%d_%s", bt, get_full_name())); endfunction // **************************************************************************** @@ -81,6 +117,8 @@ class soc_ifc_ctrl_transaction_coverage extends uvm_subscriber #(.T(soc_ifc_ctr `uvm_info("COV","Received transaction",UVM_HIGH); coverage_trans = t; soc_ifc_ctrl_transaction_cg.sample(); + foreach (coverage_trans.cptra_obf_key_rand[dw,bt]) cptra_obf_key_rand_bit_cg[dw][bt].sample(coverage_trans.cptra_obf_key_rand[dw][bt]); + foreach (coverage_trans. generic_input_val[bt]) generic_input_val_bit_cg[bt] .sample(coverage_trans.generic_input_val[bt]); endfunction endclass diff --git a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/interface_packages/soc_ifc_ctrl_pkg/src/soc_ifc_ctrl_wdt_cascade_sequence.svh b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/interface_packages/soc_ifc_ctrl_pkg/src/soc_ifc_ctrl_wdt_cascade_sequence.svh new file mode 100644 index 000000000..bd100d1dd --- /dev/null +++ b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/interface_packages/soc_ifc_ctrl_pkg/src/soc_ifc_ctrl_wdt_cascade_sequence.svh @@ -0,0 +1,70 @@ +//---------------------------------------------------------------------- +// Created with uvmf_gen version 2022.3 +//---------------------------------------------------------------------- +// SPDX-License-Identifier: Apache-2.0 +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// pragma uvmf custom header begin +// pragma uvmf custom header end +//---------------------------------------------------------------------- +//---------------------------------------------------------------------- +// +// DESCRIPTION: +// This sequences randomizes the soc_ifc_ctrl transaction and sends it +// to the UVM driver. +// +// This sequence constructs and randomizes a soc_ifc_ctrl_transaction. +// +//---------------------------------------------------------------------- +//---------------------------------------------------------------------- +// +class soc_ifc_ctrl_wdt_cascade_sequence + extends soc_ifc_ctrl_sequence_base ; + + `uvm_object_utils( soc_ifc_ctrl_wdt_cascade_sequence ) + + // pragma uvmf custom class_item_additional begin + // pragma uvmf custom class_item_additional end + + //***************************************************************** + function new(string name = ""); + super.new(name); + endfunction: new + + // **************************************************************************** + // TASK : body() + // This task is automatically executed when this sequence is started using the + // start(sequencerHandle) task. + // + task body(); + + // Construct the transaction + req=soc_ifc_ctrl_transaction::type_id::create("req"); + start_item(req); + // Randomize the transaction + if(!req.randomize()) `uvm_fatal("SEQ", "soc_ifc_ctrl_wdt_cascade_sequence::body()-soc_ifc_ctrl_transaction randomization failed") + req.generic_input_val = 64'hABAB; + req.set_pwrgood = 'b1; + req.assert_rst = 'b0; + // Send the transaction to the soc_ifc_ctrl_driver_bfm via the sequencer and soc_ifc_ctrl_driver. + finish_item(req); + `uvm_info("SEQ", {"Response:",req.convert2string()},UVM_MEDIUM) + + endtask + +endclass: soc_ifc_ctrl_wdt_cascade_sequence + +// pragma uvmf custom external begin +// pragma uvmf custom external end + diff --git a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/interface_packages/soc_ifc_ctrl_pkg/src/soc_ifc_ctrl_wdt_independent_sequence.svh b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/interface_packages/soc_ifc_ctrl_pkg/src/soc_ifc_ctrl_wdt_independent_sequence.svh new file mode 100644 index 000000000..ff420478f --- /dev/null +++ b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/interface_packages/soc_ifc_ctrl_pkg/src/soc_ifc_ctrl_wdt_independent_sequence.svh @@ -0,0 +1,84 @@ +//---------------------------------------------------------------------- +// Created with uvmf_gen version 2022.3 +//---------------------------------------------------------------------- +// SPDX-License-Identifier: Apache-2.0 +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// pragma uvmf custom header begin +// pragma uvmf custom header end +//---------------------------------------------------------------------- +//---------------------------------------------------------------------- +// +// DESCRIPTION: +// This sequences randomizes the soc_ifc_ctrl transaction and sends it +// to the UVM driver. +// +// This sequence constructs and randomizes a soc_ifc_ctrl_transaction. +// +//---------------------------------------------------------------------- +//---------------------------------------------------------------------- +// +class soc_ifc_ctrl_wdt_independent_sequence + extends soc_ifc_ctrl_sequence_base ; + + `uvm_object_utils( soc_ifc_ctrl_wdt_independent_sequence ) + + // pragma uvmf custom class_item_additional begin + // pragma uvmf custom class_item_additional end + + //***************************************************************** + function new(string name = ""); + super.new(name); + endfunction: new + + // **************************************************************************** + // TASK : body() + // This task is automatically executed when this sequence is started using the + // start(sequencerHandle) task. + // + task body(); + + // Construct the transaction + req=soc_ifc_ctrl_transaction::type_id::create("req"); + start_item(req); + // Randomize the transaction + if(!req.randomize()) `uvm_fatal("SEQ", "soc_ifc_ctrl_wdt_independent_sequence::body()-soc_ifc_ctrl_transaction randomization failed") + // req.wait_cycles = 'd1000; + req.generic_input_val = 64'h1234_5678_90AB_CDEF; + req.set_pwrgood = 'b1; + req.assert_rst = 'b0; + // Send the transaction to the soc_ifc_ctrl_driver_bfm via the sequencer and soc_ifc_ctrl_driver. + finish_item(req); + `uvm_info("SEQ", {"Response:",req.convert2string()},UVM_MEDIUM) + + // Construct the transaction + req=soc_ifc_ctrl_transaction::type_id::create("req"); + start_item(req); + // Randomize the transaction + if(!req.randomize()) `uvm_fatal("SEQ", "soc_ifc_ctrl_wdt_independent_sequence::body()-soc_ifc_ctrl_transaction randomization failed") + // req.wait_cycles = 'd1000; + req.generic_input_val = 64'hEFEF; + req.set_pwrgood = 'b1; + req.assert_rst = 'b0; + // Send the transaction to the soc_ifc_ctrl_driver_bfm via the sequencer and soc_ifc_ctrl_driver. + finish_item(req); + `uvm_info("SEQ", {"Response:",req.convert2string()},UVM_MEDIUM) + + endtask + +endclass: soc_ifc_ctrl_wdt_independent_sequence + +// pragma uvmf custom external begin +// pragma uvmf custom external end + diff --git a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/interface_packages/soc_ifc_status_pkg/src/soc_ifc_status_driver_bfm.sv b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/interface_packages/soc_ifc_status_pkg/src/soc_ifc_status_driver_bfm.sv index 308e98511..54133ce34 100644 --- a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/interface_packages/soc_ifc_status_pkg/src/soc_ifc_status_driver_bfm.sv +++ b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/interface_packages/soc_ifc_status_pkg/src/soc_ifc_status_driver_bfm.sv @@ -370,12 +370,12 @@ bit first_transfer=1; // end // Wait for next transfer then gather info from intiator about the transfer. // Place the data into the soc_ifc_status_initiator_struct. - do begin + @(posedge clk_i); + while (!any_signal_changed()) begin cptra_error_fatal_o <= cptra_error_fatal_i ; cptra_error_non_fatal_o <= cptra_error_non_fatal_i; @(posedge clk_i); end - while (!any_signal_changed()); ready_for_fuses_o <= ready_for_fuses_i ; ready_for_fw_push_o <= ready_for_fw_push_i ; ready_for_runtime_o <= ready_for_runtime_i ; @@ -394,9 +394,9 @@ bit first_transfer=1; soc_ifc_status_initiator_struct.ready_for_runtime = ready_for_runtime_i; soc_ifc_status_initiator_struct.mailbox_data_avail = mailbox_data_avail_i; soc_ifc_status_initiator_struct.mailbox_flow_done = mailbox_flow_done_i; - soc_ifc_status_responder_struct.cptra_error_fatal_intr_pending = cptra_error_fatal_i; // - soc_ifc_status_responder_struct.cptra_error_non_fatal_intr_pending = cptra_error_non_fatal_i; // - soc_ifc_status_responder_struct.trng_req_pending = trng_req_i; // + soc_ifc_status_initiator_struct.cptra_error_fatal_intr_pending = cptra_error_fatal_i; + soc_ifc_status_initiator_struct.cptra_error_non_fatal_intr_pending = cptra_error_non_fatal_i; + soc_ifc_status_initiator_struct.trng_req_pending = trng_req_i; soc_ifc_status_initiator_struct.generic_output_val = generic_output_wires_i; end endtask diff --git a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/interface_packages/soc_ifc_status_pkg/src/soc_ifc_status_monitor.svh b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/interface_packages/soc_ifc_status_pkg/src/soc_ifc_status_monitor.svh index 07a530944..ef48ed8cf 100644 --- a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/interface_packages/soc_ifc_status_pkg/src/soc_ifc_status_monitor.svh +++ b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/interface_packages/soc_ifc_status_pkg/src/soc_ifc_status_monitor.svh @@ -111,7 +111,7 @@ function void soc_ifc_status_monitor::force_advance_txn_key(int unsigned incr); endfunction task soc_ifc_status_monitor::handle_reset(string kind = "HARD"); - txn_key = 0; + if (kind inside {"HARD","NONCORE"}) + txn_key = 0; endtask // pragma uvmf custom external end - diff --git a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/interface_packages/soc_ifc_status_pkg/src/soc_ifc_status_monitor_bfm.sv b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/interface_packages/soc_ifc_status_pkg/src/soc_ifc_status_monitor_bfm.sv index d4feb990a..f4ed4b30a 100644 --- a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/interface_packages/soc_ifc_status_pkg/src/soc_ifc_status_monitor_bfm.sv +++ b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/interface_packages/soc_ifc_status_pkg/src/soc_ifc_status_monitor_bfm.sv @@ -145,13 +145,17 @@ end // pragma uvmf custom reset_condition end endtask - //****************************************************************** - - task wait_for_num_clocks(input int unsigned count); // pragma tbx xtf + // pragma uvmf custom wait_for_num_clocks begin + //**************************************************************************** + // Inject pragmas's here to throw a warning on regeneration. + // Task must have automatic lifetime so that it can be concurrently invoked + // by multiple entities with a different wait value. + task automatic wait_for_num_clocks(input int unsigned count); // pragma tbx xtf + if (count == 0) `uvm_fatal("CFG", "wait_for_num_clocks called with count of 0 - this will lead to a hang"); @(posedge clk_i); - repeat (count-1) @(posedge clk_i); endtask + // pragma uvmf custom wait_for_num_clocks end //****************************************************************** event go; @@ -254,6 +258,7 @@ end soc_ifc_status_monitor_struct.trng_req_pending = trng_req_i; soc_ifc_status_monitor_struct.generic_output_val = generic_output_wires_i; end + // pragma uvmf custom do_monitor end endtask diff --git a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/interface_packages/soc_ifc_status_pkg/src/soc_ifc_status_transaction.svh b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/interface_packages/soc_ifc_status_pkg/src/soc_ifc_status_transaction.svh index 8ef5a775d..69bcd9df8 100644 --- a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/interface_packages/soc_ifc_status_pkg/src/soc_ifc_status_transaction.svh +++ b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/interface_packages/soc_ifc_status_pkg/src/soc_ifc_status_transaction.svh @@ -123,7 +123,7 @@ class soc_ifc_status_transaction extends uvmf_transaction_base; virtual function string convert2string(); // pragma uvmf custom convert2string begin // UVMF_CHANGE_ME : Customize format if desired. - return $sformatf("ready_for_fuses:0x%x ready_for_fw_push:0x%x ready_for_runtime:0x%x mailbox_data_avail:0x%x mailbox_flow_done:0x%x cptra_error_fatal_intr_pending:0x%x cptra_error_non_fatal_intr_pending:0x%x trng_req_pending:0x%x generic_output_val:0x%x ",ready_for_fuses,ready_for_fw_push,ready_for_runtime,mailbox_data_avail,mailbox_flow_done,cptra_error_fatal_intr_pending,cptra_error_non_fatal_intr_pending,trng_req_pending,generic_output_val); + return $sformatf("ready_for_fuses:0x%x ready_for_fw_push:0x%x ready_for_runtime:0x%x mailbox_data_avail:0x%x mailbox_flow_done:0x%x cptra_error_fatal_intr_pending:0x%x cptra_error_non_fatal_intr_pending:0x%x trng_req_pending:0x%x generic_output_val:0x%x %s",ready_for_fuses,ready_for_fw_push,ready_for_runtime,mailbox_data_avail,mailbox_flow_done,cptra_error_fatal_intr_pending,cptra_error_non_fatal_intr_pending,trng_req_pending,generic_output_val,super.convert2string()); // pragma uvmf custom convert2string end endfunction diff --git a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/interface_packages/soc_ifc_status_pkg/src/soc_ifc_status_transaction_coverage.svh b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/interface_packages/soc_ifc_status_pkg/src/soc_ifc_status_transaction_coverage.svh index 3489d565a..bcb3e8445 100644 --- a/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/interface_packages/soc_ifc_status_pkg/src/soc_ifc_status_transaction_coverage.svh +++ b/src/soc_ifc/uvmf_soc_ifc/uvmf_template_output/verification_ip/interface_packages/soc_ifc_status_pkg/src/soc_ifc_status_transaction_coverage.svh @@ -28,6 +28,11 @@ //---------------------------------------------------------------------- //---------------------------------------------------------------------- // +covergroup soc_ifc_status_transaction_bit_cg with function sample(input bit val); + option.per_instance = 1; + ea_bit: coverpoint val; +endgroup + class soc_ifc_status_transaction_coverage extends uvm_subscriber #(.T(soc_ifc_status_transaction )); `uvm_component_utils( soc_ifc_status_transaction_coverage ) @@ -35,6 +40,7 @@ class soc_ifc_status_transaction_coverage extends uvm_subscriber #(.T(soc_ifc_s T coverage_trans; // pragma uvmf custom class_item_additional begin + soc_ifc_status_transaction_bit_cg generic_output_val_bit_cg[63:0] ; // pragma uvmf custom class_item_additional end // **************************************************************************** @@ -51,7 +57,20 @@ class soc_ifc_status_transaction_coverage extends uvm_subscriber #(.T(soc_ifc_s cptra_error_fatal_intr_pending: coverpoint coverage_trans.cptra_error_fatal_intr_pending; cptra_error_non_fatal_intr_pending: coverpoint coverage_trans.cptra_error_non_fatal_intr_pending; trng_req_pending: coverpoint coverage_trans.trng_req_pending; - generic_output_val: coverpoint coverage_trans.generic_output_val; + generic_output_val: coverpoint coverage_trans.generic_output_val { + bins byte_none = {64'h0000_0000_0000_0000}; + bins byte_0 = {[0:$]} with ($countones(item[ 7: 0] > 0)); + bins byte_1 = {[0:$]} with ($countones(item[15: 8] > 0)); + bins byte_2 = {[0:$]} with ($countones(item[23:16] > 0)); + bins byte_3 = {[0:$]} with ($countones(item[31:24] > 0)); + bins byte_4 = {[0:$]} with ($countones(item[39:32] > 0)); + bins byte_5 = {[0:$]} with ($countones(item[47:40] > 0)); + bins byte_6 = {[0:$]} with ($countones(item[55:48] > 0)); + bins byte_7 = {[0:$]} with ($countones(item[63:56] > 0)); + } + + cross_err : cross cptra_error_fatal_intr_pending, cptra_error_non_fatal_intr_pending; + cross_req : cross mailbox_data_avail, trng_req_pending; // pragma uvmf custom covergroup end endgroup @@ -62,7 +81,7 @@ class soc_ifc_status_transaction_coverage extends uvm_subscriber #(.T(soc_ifc_s function new(string name="", uvm_component parent=null); super.new(name,parent); soc_ifc_status_transaction_cg=new; - `uvm_warning("COVERAGE_MODEL_REVIEW", "A covergroup has been constructed which may need review because of either generation or re-generation with merging. Please note that transaction variables added as a result of re-generation and merging are not automatically added to the covergroup. Remove this warning after the covergroup has been reviewed.") + foreach (coverage_trans.generic_output_val[bt]) generic_output_val_bit_cg[bt] = new; endfunction // **************************************************************************** @@ -71,6 +90,7 @@ class soc_ifc_status_transaction_coverage extends uvm_subscriber #(.T(soc_ifc_s // function void build_phase(uvm_phase phase); soc_ifc_status_transaction_cg.set_inst_name($sformatf("soc_ifc_status_transaction_cg_%s",get_full_name())); + foreach (coverage_trans.generic_output_val[bt]) generic_output_val_bit_cg[bt].set_inst_name($sformatf("generic_output_val_bit_cg_%d_%s", bt, get_full_name())); endfunction // **************************************************************************** @@ -83,6 +103,7 @@ class soc_ifc_status_transaction_coverage extends uvm_subscriber #(.T(soc_ifc_s `uvm_info("COV","Received transaction",UVM_HIGH); coverage_trans = t; soc_ifc_status_transaction_cg.sample(); + foreach (coverage_trans.generic_output_val[bt]) generic_output_val_bit_cg[bt].sample(coverage_trans.generic_output_val[bt]); endfunction endclass diff --git a/src/spi_host/config/compile.yml b/src/spi_host/config/compile.yml index 5f7914b0e..f9ed579c7 100644 --- a/src/spi_host/config/compile.yml +++ b/src/spi_host/config/compile.yml @@ -3,7 +3,7 @@ provides: [spi_host] schema_version: 2.4.0 requires: - libs - - prim + - caliptra_prim targets: rtl: directories: [$COMPILE_ROOT/rtl] @@ -20,7 +20,39 @@ targets: - $COMPILE_ROOT/rtl/spi_host_reg_top.sv - $COMPILE_ROOT/rtl/spi_host_shift_register.sv tops: [spi_host] + tb: + directories: [$COMPILE_ROOT/rtl] + files: + - $COMPILE_ROOT/rtl/spi_host_reg_pkg.sv + - $COMPILE_ROOT/rtl/spi_host_cmd_pkg.sv +--- +provides: [spiflash] +schema_version: 2.4.0 +requires: + - spi_host +targets: + tb: + directories: [$COMPILE_ROOT/tb] + files: + - $COMPILE_ROOT/tb/spi_device_pkg.sv + - $COMPILE_ROOT/tb/spiflash.sv + tops: [spiflash] +--- +provides: [spi_host_tb] +schema_version: 2.4.0 +requires: + - spi_host + - spiflash +targets: tb: directories: [$COMPILE_ROOT/tb] files: - $COMPILE_ROOT/tb/spi_host_tb.sv + tops: [spi_host_tb] +global: + tool: + vcs: + default: + - '-assert svaext' + - +define+CLP_ASSERT_ON + - '-noinherit_timescale=1ns/1ps' diff --git a/src/spi_host/config/spi_host.vf b/src/spi_host/config/spi_host.vf index 246a36c47..1b0661420 100644 --- a/src/spi_host/config/spi_host.vf +++ b/src/spi_host/config/spi_host.vf @@ -1,48 +1,68 @@ ++incdir+${CALIPTRA_ROOT}/src/integration/rtl +incdir+${CALIPTRA_ROOT}/src/libs/rtl -+incdir+${CALIPTRA_ROOT}/src/prim/rtl ++incdir+${CALIPTRA_ROOT}/src/caliptra_prim/rtl ++incdir+${CALIPTRA_ROOT}/src/lc_ctrl/rtl ++incdir+${CALIPTRA_ROOT}/src/spi_host/rtl ++incdir+${CALIPTRA_ROOT}/src/caliptra_prim_generic/rtl +${CALIPTRA_ROOT}/src/integration/rtl/config_defines.svh +${CALIPTRA_ROOT}/src/integration/rtl/caliptra_reg_defines.svh +${CALIPTRA_ROOT}/src/libs/rtl/caliptra_sva.svh +${CALIPTRA_ROOT}/src/libs/rtl/caliptra_macros.svh +${CALIPTRA_ROOT}/src/libs/rtl/caliptra_sram.sv ${CALIPTRA_ROOT}/src/libs/rtl/ahb_defines_pkg.sv +${CALIPTRA_ROOT}/src/libs/rtl/caliptra_ahb_srom.sv +${CALIPTRA_ROOT}/src/libs/rtl/apb_slv_sif.sv ${CALIPTRA_ROOT}/src/libs/rtl/ahb_slv_sif.sv -${CALIPTRA_ROOT}/src/libs/rtl/ahb_to_reg_adapter.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_util_pkg.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_alert_pkg.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_subreg_pkg.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_mubi_pkg.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_cipher_pkg.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_pkg.sv -${CALIPTRA_ROOT}/src/prim_generic/rtl/prim_generic_buf.sv -${CALIPTRA_ROOT}/src/prim_generic/rtl/prim_generic_flop.sv -${CALIPTRA_ROOT}/src/prim_generic/rtl/prim_generic_flop_en.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_flop_en.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_flop_2sync.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_lfsr.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_mubi4_sync.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_diff_decode.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_sec_anchor_buf.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_slicer.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_count.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_sparse_fsm_flop.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_dom_and_2share.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_sec_anchor_flop.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_reg_we_check.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_packer_fifo.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_max_tree.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_subreg_arb.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_subreg.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_intr_hw.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_onehot_check.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_mubi8_sync.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_fifo_sync_cnt.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_buf.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_alert_receiver.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_flop.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_alert_sender.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_fifo_sync.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_arbiter_ppc.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_sum_tree.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_subreg_ext.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_edge_detector.sv +${CALIPTRA_ROOT}/src/libs/rtl/caliptra_icg.sv +${CALIPTRA_ROOT}/src/libs/rtl/clk_gate.sv +${CALIPTRA_ROOT}/src/libs/rtl/caliptra_2ff_sync.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_util_pkg.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_alert_pkg.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_subreg_pkg.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_mubi_pkg.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_cipher_pkg.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_pkg.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_sparse_fsm_pkg.sv +${CALIPTRA_ROOT}/src/lc_ctrl/rtl/lc_ctrl_reg_pkg.sv +${CALIPTRA_ROOT}/src/lc_ctrl/rtl/lc_ctrl_state_pkg.sv +${CALIPTRA_ROOT}/src/lc_ctrl/rtl/lc_ctrl_pkg.sv ${CALIPTRA_ROOT}/src/spi_host/rtl/spi_host_reg_pkg.sv ${CALIPTRA_ROOT}/src/spi_host/rtl/spi_host_cmd_pkg.sv +${CALIPTRA_ROOT}/src/libs/rtl/ahb_to_reg_adapter.sv +${CALIPTRA_ROOT}/src/caliptra_prim_generic/rtl/caliptra_prim_generic_flop_en.sv +${CALIPTRA_ROOT}/src/caliptra_prim_generic/rtl/caliptra_prim_generic_flop.sv +${CALIPTRA_ROOT}/src/caliptra_prim_generic/rtl/caliptra_prim_generic_buf.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_flop_en.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_cdc_rand_delay.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_flop_2sync.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_lfsr.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_mubi4_sync.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_diff_decode.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_sec_anchor_buf.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_slicer.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_count.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_sparse_fsm_flop.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_dom_and_2share.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_sec_anchor_flop.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_reg_we_check.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_packer_fifo.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_max_tree.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_subreg_arb.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_subreg.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_intr_hw.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_onehot_check.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_mubi8_sync.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_fifo_sync_cnt.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_buf.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_lc_sync.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_alert_receiver.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_flop.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_alert_sender.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_fifo_sync.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_arbiter_ppc.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_sum_tree.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_subreg_ext.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_edge_detector.sv ${CALIPTRA_ROOT}/src/spi_host/rtl/spi_host.sv ${CALIPTRA_ROOT}/src/spi_host/rtl/spi_host_byte_merge.sv ${CALIPTRA_ROOT}/src/spi_host/rtl/spi_host_byte_select.sv @@ -52,7 +72,3 @@ ${CALIPTRA_ROOT}/src/spi_host/rtl/spi_host_data_fifos.sv ${CALIPTRA_ROOT}/src/spi_host/rtl/spi_host_fsm.sv ${CALIPTRA_ROOT}/src/spi_host/rtl/spi_host_reg_top.sv ${CALIPTRA_ROOT}/src/spi_host/rtl/spi_host_shift_register.sv -${CALIPTRA_ROOT}/src/spi_host/tb/spi_device_pkg.sv -${CALIPTRA_ROOT}/src/spi_host/tb/spiflash.sv -${CALIPTRA_ROOT}/src/spi_host/tb/spi_host_tb.sv - diff --git a/src/spi_host/config/spi_host.vlt b/src/spi_host/config/spi_host.vlt index 9f196f260..5e03da9c1 100644 --- a/src/spi_host/config/spi_host.vlt +++ b/src/spi_host/config/spi_host.vlt @@ -1,3 +1,6 @@ -${CALIPTRA_ROOT}/src/prim/lint/prim_max_tree.vlt -${CALIPTRA_ROOT}/src/prim/lint/prim_sum_tree.vlt -${CALIPTRA_ROOT}/src/prim/lint/prim_onehot_check.vlt +// Licensed under the Apache License, Version 2.0, see LICENSE for details. +// SPDX-License-Identifier: Apache-2.0 +// +${CALIPTRA_ROOT}/src/caliptra_prim/lint/caliptra_prim_max_tree.vlt +${CALIPTRA_ROOT}/src/caliptra_prim/lint/caliptra_prim_sum_tree.vlt +${CALIPTRA_ROOT}/src/caliptra_prim/lint/caliptra_prim_onehot_check.vlt diff --git a/src/spi_host/config/spi_host_tb.vf b/src/spi_host/config/spi_host_tb.vf new file mode 100644 index 000000000..687e76aca --- /dev/null +++ b/src/spi_host/config/spi_host_tb.vf @@ -0,0 +1,78 @@ ++incdir+${CALIPTRA_ROOT}/src/integration/rtl ++incdir+${CALIPTRA_ROOT}/src/libs/rtl ++incdir+${CALIPTRA_ROOT}/src/caliptra_prim/rtl ++incdir+${CALIPTRA_ROOT}/src/lc_ctrl/rtl ++incdir+${CALIPTRA_ROOT}/src/spi_host/rtl ++incdir+${CALIPTRA_ROOT}/src/spi_host/tb ++incdir+${CALIPTRA_ROOT}/src/caliptra_prim_generic/rtl +${CALIPTRA_ROOT}/src/integration/rtl/config_defines.svh +${CALIPTRA_ROOT}/src/integration/rtl/caliptra_reg_defines.svh +${CALIPTRA_ROOT}/src/libs/rtl/caliptra_sva.svh +${CALIPTRA_ROOT}/src/libs/rtl/caliptra_macros.svh +${CALIPTRA_ROOT}/src/libs/rtl/caliptra_sram.sv +${CALIPTRA_ROOT}/src/libs/rtl/ahb_defines_pkg.sv +${CALIPTRA_ROOT}/src/libs/rtl/caliptra_ahb_srom.sv +${CALIPTRA_ROOT}/src/libs/rtl/apb_slv_sif.sv +${CALIPTRA_ROOT}/src/libs/rtl/ahb_slv_sif.sv +${CALIPTRA_ROOT}/src/libs/rtl/caliptra_icg.sv +${CALIPTRA_ROOT}/src/libs/rtl/clk_gate.sv +${CALIPTRA_ROOT}/src/libs/rtl/caliptra_2ff_sync.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_util_pkg.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_alert_pkg.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_subreg_pkg.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_mubi_pkg.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_cipher_pkg.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_pkg.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_sparse_fsm_pkg.sv +${CALIPTRA_ROOT}/src/lc_ctrl/rtl/lc_ctrl_reg_pkg.sv +${CALIPTRA_ROOT}/src/lc_ctrl/rtl/lc_ctrl_state_pkg.sv +${CALIPTRA_ROOT}/src/lc_ctrl/rtl/lc_ctrl_pkg.sv +${CALIPTRA_ROOT}/src/spi_host/rtl/spi_host_reg_pkg.sv +${CALIPTRA_ROOT}/src/spi_host/rtl/spi_host_cmd_pkg.sv +${CALIPTRA_ROOT}/src/spi_host/tb/spi_device_pkg.sv +${CALIPTRA_ROOT}/src/spi_host/tb/spiflash.sv +${CALIPTRA_ROOT}/src/spi_host/tb/spi_host_tb.sv +${CALIPTRA_ROOT}/src/libs/rtl/ahb_to_reg_adapter.sv +${CALIPTRA_ROOT}/src/caliptra_prim_generic/rtl/caliptra_prim_generic_flop_en.sv +${CALIPTRA_ROOT}/src/caliptra_prim_generic/rtl/caliptra_prim_generic_flop.sv +${CALIPTRA_ROOT}/src/caliptra_prim_generic/rtl/caliptra_prim_generic_buf.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_flop_en.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_cdc_rand_delay.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_flop_2sync.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_lfsr.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_mubi4_sync.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_diff_decode.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_sec_anchor_buf.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_slicer.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_count.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_sparse_fsm_flop.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_dom_and_2share.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_sec_anchor_flop.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_reg_we_check.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_packer_fifo.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_max_tree.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_subreg_arb.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_subreg.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_intr_hw.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_onehot_check.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_mubi8_sync.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_fifo_sync_cnt.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_buf.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_lc_sync.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_alert_receiver.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_flop.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_alert_sender.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_fifo_sync.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_arbiter_ppc.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_sum_tree.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_subreg_ext.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_edge_detector.sv +${CALIPTRA_ROOT}/src/spi_host/rtl/spi_host.sv +${CALIPTRA_ROOT}/src/spi_host/rtl/spi_host_byte_merge.sv +${CALIPTRA_ROOT}/src/spi_host/rtl/spi_host_byte_select.sv +${CALIPTRA_ROOT}/src/spi_host/rtl/spi_host_command_queue.sv +${CALIPTRA_ROOT}/src/spi_host/rtl/spi_host_core.sv +${CALIPTRA_ROOT}/src/spi_host/rtl/spi_host_data_fifos.sv +${CALIPTRA_ROOT}/src/spi_host/rtl/spi_host_fsm.sv +${CALIPTRA_ROOT}/src/spi_host/rtl/spi_host_reg_top.sv +${CALIPTRA_ROOT}/src/spi_host/rtl/spi_host_shift_register.sv \ No newline at end of file diff --git a/src/spi_host/config/spiflash.vf b/src/spi_host/config/spiflash.vf new file mode 100644 index 000000000..6821ad3d0 --- /dev/null +++ b/src/spi_host/config/spiflash.vf @@ -0,0 +1,77 @@ ++incdir+${CALIPTRA_ROOT}/src/integration/rtl ++incdir+${CALIPTRA_ROOT}/src/libs/rtl ++incdir+${CALIPTRA_ROOT}/src/caliptra_prim/rtl ++incdir+${CALIPTRA_ROOT}/src/lc_ctrl/rtl ++incdir+${CALIPTRA_ROOT}/src/spi_host/rtl ++incdir+${CALIPTRA_ROOT}/src/spi_host/tb ++incdir+${CALIPTRA_ROOT}/src/caliptra_prim_generic/rtl +${CALIPTRA_ROOT}/src/integration/rtl/config_defines.svh +${CALIPTRA_ROOT}/src/integration/rtl/caliptra_reg_defines.svh +${CALIPTRA_ROOT}/src/libs/rtl/caliptra_sva.svh +${CALIPTRA_ROOT}/src/libs/rtl/caliptra_macros.svh +${CALIPTRA_ROOT}/src/libs/rtl/caliptra_sram.sv +${CALIPTRA_ROOT}/src/libs/rtl/ahb_defines_pkg.sv +${CALIPTRA_ROOT}/src/libs/rtl/caliptra_ahb_srom.sv +${CALIPTRA_ROOT}/src/libs/rtl/apb_slv_sif.sv +${CALIPTRA_ROOT}/src/libs/rtl/ahb_slv_sif.sv +${CALIPTRA_ROOT}/src/libs/rtl/caliptra_icg.sv +${CALIPTRA_ROOT}/src/libs/rtl/clk_gate.sv +${CALIPTRA_ROOT}/src/libs/rtl/caliptra_2ff_sync.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_util_pkg.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_alert_pkg.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_subreg_pkg.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_mubi_pkg.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_cipher_pkg.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_pkg.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_sparse_fsm_pkg.sv +${CALIPTRA_ROOT}/src/lc_ctrl/rtl/lc_ctrl_reg_pkg.sv +${CALIPTRA_ROOT}/src/lc_ctrl/rtl/lc_ctrl_state_pkg.sv +${CALIPTRA_ROOT}/src/lc_ctrl/rtl/lc_ctrl_pkg.sv +${CALIPTRA_ROOT}/src/spi_host/rtl/spi_host_reg_pkg.sv +${CALIPTRA_ROOT}/src/spi_host/rtl/spi_host_cmd_pkg.sv +${CALIPTRA_ROOT}/src/spi_host/tb/spi_device_pkg.sv +${CALIPTRA_ROOT}/src/spi_host/tb/spiflash.sv +${CALIPTRA_ROOT}/src/libs/rtl/ahb_to_reg_adapter.sv +${CALIPTRA_ROOT}/src/caliptra_prim_generic/rtl/caliptra_prim_generic_flop_en.sv +${CALIPTRA_ROOT}/src/caliptra_prim_generic/rtl/caliptra_prim_generic_flop.sv +${CALIPTRA_ROOT}/src/caliptra_prim_generic/rtl/caliptra_prim_generic_buf.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_flop_en.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_cdc_rand_delay.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_flop_2sync.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_lfsr.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_mubi4_sync.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_diff_decode.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_sec_anchor_buf.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_slicer.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_count.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_sparse_fsm_flop.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_dom_and_2share.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_sec_anchor_flop.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_reg_we_check.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_packer_fifo.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_max_tree.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_subreg_arb.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_subreg.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_intr_hw.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_onehot_check.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_mubi8_sync.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_fifo_sync_cnt.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_buf.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_lc_sync.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_alert_receiver.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_flop.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_alert_sender.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_fifo_sync.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_arbiter_ppc.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_sum_tree.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_subreg_ext.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_edge_detector.sv +${CALIPTRA_ROOT}/src/spi_host/rtl/spi_host.sv +${CALIPTRA_ROOT}/src/spi_host/rtl/spi_host_byte_merge.sv +${CALIPTRA_ROOT}/src/spi_host/rtl/spi_host_byte_select.sv +${CALIPTRA_ROOT}/src/spi_host/rtl/spi_host_command_queue.sv +${CALIPTRA_ROOT}/src/spi_host/rtl/spi_host_core.sv +${CALIPTRA_ROOT}/src/spi_host/rtl/spi_host_data_fifos.sv +${CALIPTRA_ROOT}/src/spi_host/rtl/spi_host_fsm.sv +${CALIPTRA_ROOT}/src/spi_host/rtl/spi_host_reg_top.sv +${CALIPTRA_ROOT}/src/spi_host/rtl/spi_host_shift_register.sv \ No newline at end of file diff --git a/src/spi_host/rtl/spi_host.sv b/src/spi_host/rtl/spi_host.sv index 6fc6fc796..efe85108b 100644 --- a/src/spi_host/rtl/spi_host.sv +++ b/src/spi_host/rtl/spi_host.sv @@ -6,7 +6,7 @@ // // -`include "prim_assert.sv" +`include "caliptra_prim_assert.sv" module spi_host import spi_host_reg_pkg::*; @@ -32,8 +32,8 @@ module spi_host output logic [AHBDataWidth-1:0] hrdata_o, // Alerts - input prim_alert_pkg::alert_rx_t [NumAlerts-1:0] alert_rx_i, - output prim_alert_pkg::alert_tx_t [NumAlerts-1:0] alert_tx_o, + input caliptra_prim_alert_pkg::alert_rx_t [NumAlerts-1:0] alert_rx_i, + output caliptra_prim_alert_pkg::alert_tx_t [NumAlerts-1:0] alert_tx_o, // SPI Interface output logic cio_sck_o, @@ -88,10 +88,10 @@ module spi_host }; for (genvar i = 0; i < NumAlerts; i++) begin : gen_alert_tx - prim_alert_sender #( + caliptra_prim_alert_sender #( .AsyncOn(AlertAsyncOn[i]), .IsFatal(1'b1) - ) u_prim_alert_sender ( + ) u_caliptra_prim_alert_sender ( .clk_i, .rst_ni, .alert_test_i (alert_test[i] ), @@ -343,7 +343,7 @@ module spi_host // Note on ByteOrder and ByteSwapping. // ByteOrder == 1 is for Little-Endian transmission (i.e. LSB first), which is acheived by - // default with the prim_packer_fifo implementation. Thus we have to swap if Big-Endian + // default with the caliptra_prim_packer_fifo implementation. Thus we have to swap if Big-Endian // transmission is required (i.e. if ByteOrder == 0). spi_host_data_fifos #( .TxDepth(TxDepth), @@ -476,7 +476,7 @@ module spi_host assign event_error = |(error_vec & error_mask); assign enb_error = |sw_error_status; - prim_intr_hw #(.Width(1)) intr_hw_error ( + caliptra_prim_intr_hw #(.Width(1)) intr_hw_error ( .clk_i, .rst_ni, .event_intr_i (event_error), @@ -548,7 +548,7 @@ module spi_host end end - prim_intr_hw #(.Width(1)) intr_hw_spi_event ( + caliptra_prim_intr_hw #(.Width(1)) intr_hw_spi_event ( .clk_i, .rst_ni, .event_intr_i (event_spi_event), diff --git a/src/spi_host/rtl/spi_host_byte_merge.sv b/src/spi_host/rtl/spi_host_byte_merge.sv index faa425bdd..a4a8e17cb 100644 --- a/src/spi_host/rtl/spi_host_byte_merge.sv +++ b/src/spi_host/rtl/spi_host_byte_merge.sv @@ -47,7 +47,7 @@ module spi_host_byte_merge ( end end - prim_packer_fifo #( + caliptra_prim_packer_fifo #( .InW(8), .OutW(32) ) u_packer ( diff --git a/src/spi_host/rtl/spi_host_byte_select.sv b/src/spi_host/rtl/spi_host_byte_select.sv index 78f288ed0..775d45fae 100644 --- a/src/spi_host/rtl/spi_host_byte_select.sv +++ b/src/spi_host/rtl/spi_host_byte_select.sv @@ -34,7 +34,7 @@ module spi_host_byte_select ( assign wdata_be[9*ii +: 9] = { word_be_i[ii], word_i[8*ii +: 8] }; end : gen_map_data_be - prim_packer_fifo #( + caliptra_prim_packer_fifo #( .InW(36), .OutW(9) ) u_packer ( diff --git a/src/spi_host/rtl/spi_host_cmd_pkg.sv b/src/spi_host/rtl/spi_host_cmd_pkg.sv index 45abc0223..e8c06d14d 100644 --- a/src/spi_host/rtl/spi_host_cmd_pkg.sv +++ b/src/spi_host/rtl/spi_host_cmd_pkg.sv @@ -7,7 +7,7 @@ package spi_host_cmd_pkg; - parameter int CSW = prim_util_pkg::vbits(spi_host_reg_pkg::NumCS); + parameter int CSW = caliptra_prim_util_pkg::vbits(spi_host_reg_pkg::NumCS); parameter int CmdSize = CSW + 45; // For decoding the direction register diff --git a/src/spi_host/rtl/spi_host_command_queue.sv b/src/spi_host/rtl/spi_host_command_queue.sv index fbca9e490..66e438722 100644 --- a/src/spi_host/rtl/spi_host_command_queue.sv +++ b/src/spi_host/rtl/spi_host_command_queue.sv @@ -26,7 +26,7 @@ module spi_host_command_queue #( input sw_rst_i ); - localparam int CmdDepthW = prim_util_pkg::vbits(CmdDepth+1); + localparam int CmdDepthW = caliptra_prim_util_pkg::vbits(CmdDepth+1); logic command_ready; @@ -35,7 +35,7 @@ module spi_host_command_queue #( logic [CmdDepthW-1:0] cmd_depth; - prim_fifo_sync #( + caliptra_prim_fifo_sync #( .Width(spi_host_cmd_pkg::CmdSize), .Pass(1), .Depth(CmdDepth) diff --git a/src/spi_host/rtl/spi_host_data_fifos.sv b/src/spi_host/rtl/spi_host_data_fifos.sv index 0f1e36ee5..0fbadda37 100644 --- a/src/spi_host/rtl/spi_host_data_fifos.sv +++ b/src/spi_host/rtl/spi_host_data_fifos.sv @@ -45,8 +45,8 @@ module spi_host_data_fifos #( output logic rx_wm_o ); - localparam int RxDepthW = prim_util_pkg::vbits(RxDepth+1); - localparam int TxDepthW = prim_util_pkg::vbits(TxDepth+1); + localparam int RxDepthW = caliptra_prim_util_pkg::vbits(RxDepth+1); + localparam int TxDepthW = caliptra_prim_util_pkg::vbits(TxDepth+1); logic [31:0] tx_data_ordered; logic [3:0] tx_be_ordered; @@ -72,7 +72,7 @@ module spi_host_data_fifos #( assign tx_data_be = { tx_data_ordered, tx_be_ordered }; assign { core_tx_data_o, core_tx_be_o } = core_tx_data_be; - prim_fifo_sync #( + caliptra_prim_fifo_sync #( .Width(36), .Pass(1), .Depth(TxDepth) @@ -95,7 +95,7 @@ module spi_host_data_fifos #( assign rx_qd_o = 8'(rx_depth); - prim_fifo_sync #( + caliptra_prim_fifo_sync #( .Width(32), .Pass(1), .Depth(RxDepth) diff --git a/src/spi_host/rtl/spi_host_fsm.sv b/src/spi_host/rtl/spi_host_fsm.sv index 4f7996042..50f63c040 100644 --- a/src/spi_host/rtl/spi_host_fsm.sv +++ b/src/spi_host/rtl/spi_host_fsm.sv @@ -536,7 +536,7 @@ module spi_host_fsm assign sck_o = sck_q; - prim_flop_en u_sck_flop ( + caliptra_prim_flop_en u_sck_flop ( .clk_i, .rst_ni, .en_i(~stall), diff --git a/src/spi_host/rtl/spi_host_reg_top.sv b/src/spi_host/rtl/spi_host_reg_top.sv index 4774308ea..33f986b2f 100644 --- a/src/spi_host/rtl/spi_host_reg_top.sv +++ b/src/spi_host/rtl/spi_host_reg_top.sv @@ -4,7 +4,7 @@ // // Register Top module auto-generated by `reggen` -`include "prim_assert.sv" +`include "caliptra_prim_assert.sv" module spi_host_reg_top #( parameter AHBDataWidth = 64, @@ -70,9 +70,9 @@ module spi_host_reg_top #( // also check for spurious write enables logic reg_we_err; logic [14:0] reg_we_check; - prim_reg_we_check #( + caliptra_prim_reg_we_check #( .OneHotWidth(15) - ) u_prim_reg_we_check ( + ) u_caliptra_prim_reg_we_check ( .clk_i(clk_i), .rst_ni(rst_ni), .oh_i (reg_we_check), @@ -275,9 +275,9 @@ module spi_host_reg_top #( // Register instances // R[intr_state]: V(False) // F[error]: 0:0 - prim_subreg #( + caliptra_prim_subreg #( .DW (1), - .SwAccess(prim_subreg_pkg::SwAccessW1C), + .SwAccess(caliptra_prim_subreg_pkg::SwAccessW1C), .RESVAL (1'h0) ) u_intr_state_error ( .clk_i (clk_i), @@ -301,9 +301,9 @@ module spi_host_reg_top #( ); // F[spi_event]: 1:1 - prim_subreg #( + caliptra_prim_subreg #( .DW (1), - .SwAccess(prim_subreg_pkg::SwAccessW1C), + .SwAccess(caliptra_prim_subreg_pkg::SwAccessW1C), .RESVAL (1'h0) ) u_intr_state_spi_event ( .clk_i (clk_i), @@ -329,9 +329,9 @@ module spi_host_reg_top #( // R[intr_enable]: V(False) // F[error]: 0:0 - prim_subreg #( + caliptra_prim_subreg #( .DW (1), - .SwAccess(prim_subreg_pkg::SwAccessRW), + .SwAccess(caliptra_prim_subreg_pkg::SwAccessRW), .RESVAL (1'h0) ) u_intr_enable_error ( .clk_i (clk_i), @@ -355,9 +355,9 @@ module spi_host_reg_top #( ); // F[spi_event]: 1:1 - prim_subreg #( + caliptra_prim_subreg #( .DW (1), - .SwAccess(prim_subreg_pkg::SwAccessRW), + .SwAccess(caliptra_prim_subreg_pkg::SwAccessRW), .RESVAL (1'h0) ) u_intr_enable_spi_event ( .clk_i (clk_i), @@ -386,7 +386,7 @@ module spi_host_reg_top #( logic [1:0] intr_test_flds_we; assign intr_test_qe = &intr_test_flds_we; // F[error]: 0:0 - prim_subreg_ext #( + caliptra_prim_subreg_ext #( .DW (1) ) u_intr_test_error ( .re (1'b0), @@ -402,7 +402,7 @@ module spi_host_reg_top #( assign reg2hw.intr_test.error.qe = intr_test_qe; // F[spi_event]: 1:1 - prim_subreg_ext #( + caliptra_prim_subreg_ext #( .DW (1) ) u_intr_test_spi_event ( .re (1'b0), @@ -422,7 +422,7 @@ module spi_host_reg_top #( logic alert_test_qe; logic [0:0] alert_test_flds_we; assign alert_test_qe = &alert_test_flds_we; - prim_subreg_ext #( + caliptra_prim_subreg_ext #( .DW (1) ) u_alert_test ( .re (1'b0), @@ -440,9 +440,9 @@ module spi_host_reg_top #( // R[control]: V(False) // F[rx_watermark]: 7:0 - prim_subreg #( + caliptra_prim_subreg #( .DW (8), - .SwAccess(prim_subreg_pkg::SwAccessRW), + .SwAccess(caliptra_prim_subreg_pkg::SwAccessRW), .RESVAL (8'h7f) ) u_control_rx_watermark ( .clk_i (clk_i), @@ -466,9 +466,9 @@ module spi_host_reg_top #( ); // F[tx_watermark]: 15:8 - prim_subreg #( + caliptra_prim_subreg #( .DW (8), - .SwAccess(prim_subreg_pkg::SwAccessRW), + .SwAccess(caliptra_prim_subreg_pkg::SwAccessRW), .RESVAL (8'h0) ) u_control_tx_watermark ( .clk_i (clk_i), @@ -492,9 +492,9 @@ module spi_host_reg_top #( ); // F[output_en]: 29:29 - prim_subreg #( + caliptra_prim_subreg #( .DW (1), - .SwAccess(prim_subreg_pkg::SwAccessRW), + .SwAccess(caliptra_prim_subreg_pkg::SwAccessRW), .RESVAL (1'h0) ) u_control_output_en ( .clk_i (clk_i), @@ -518,9 +518,9 @@ module spi_host_reg_top #( ); // F[sw_rst]: 30:30 - prim_subreg #( + caliptra_prim_subreg #( .DW (1), - .SwAccess(prim_subreg_pkg::SwAccessRW), + .SwAccess(caliptra_prim_subreg_pkg::SwAccessRW), .RESVAL (1'h0) ) u_control_sw_rst ( .clk_i (clk_i), @@ -544,9 +544,9 @@ module spi_host_reg_top #( ); // F[spien]: 31:31 - prim_subreg #( + caliptra_prim_subreg #( .DW (1), - .SwAccess(prim_subreg_pkg::SwAccessRW), + .SwAccess(caliptra_prim_subreg_pkg::SwAccessRW), .RESVAL (1'h0) ) u_control_spien ( .clk_i (clk_i), @@ -572,9 +572,9 @@ module spi_host_reg_top #( // R[status]: V(False) // F[txqd]: 7:0 - prim_subreg #( + caliptra_prim_subreg #( .DW (8), - .SwAccess(prim_subreg_pkg::SwAccessRO), + .SwAccess(caliptra_prim_subreg_pkg::SwAccessRO), .RESVAL (8'h0) ) u_status_txqd ( .clk_i (clk_i), @@ -598,9 +598,9 @@ module spi_host_reg_top #( ); // F[rxqd]: 15:8 - prim_subreg #( + caliptra_prim_subreg #( .DW (8), - .SwAccess(prim_subreg_pkg::SwAccessRO), + .SwAccess(caliptra_prim_subreg_pkg::SwAccessRO), .RESVAL (8'h0) ) u_status_rxqd ( .clk_i (clk_i), @@ -624,9 +624,9 @@ module spi_host_reg_top #( ); // F[cmdqd]: 19:16 - prim_subreg #( + caliptra_prim_subreg #( .DW (4), - .SwAccess(prim_subreg_pkg::SwAccessRO), + .SwAccess(caliptra_prim_subreg_pkg::SwAccessRO), .RESVAL (4'h0) ) u_status_cmdqd ( .clk_i (clk_i), @@ -650,9 +650,9 @@ module spi_host_reg_top #( ); // F[rxwm]: 20:20 - prim_subreg #( + caliptra_prim_subreg #( .DW (1), - .SwAccess(prim_subreg_pkg::SwAccessRO), + .SwAccess(caliptra_prim_subreg_pkg::SwAccessRO), .RESVAL (1'h0) ) u_status_rxwm ( .clk_i (clk_i), @@ -676,9 +676,9 @@ module spi_host_reg_top #( ); // F[byteorder]: 22:22 - prim_subreg #( + caliptra_prim_subreg #( .DW (1), - .SwAccess(prim_subreg_pkg::SwAccessRO), + .SwAccess(caliptra_prim_subreg_pkg::SwAccessRO), .RESVAL (1'h0) ) u_status_byteorder ( .clk_i (clk_i), @@ -702,9 +702,9 @@ module spi_host_reg_top #( ); // F[rxstall]: 23:23 - prim_subreg #( + caliptra_prim_subreg #( .DW (1), - .SwAccess(prim_subreg_pkg::SwAccessRO), + .SwAccess(caliptra_prim_subreg_pkg::SwAccessRO), .RESVAL (1'h0) ) u_status_rxstall ( .clk_i (clk_i), @@ -728,9 +728,9 @@ module spi_host_reg_top #( ); // F[rxempty]: 24:24 - prim_subreg #( + caliptra_prim_subreg #( .DW (1), - .SwAccess(prim_subreg_pkg::SwAccessRO), + .SwAccess(caliptra_prim_subreg_pkg::SwAccessRO), .RESVAL (1'h0) ) u_status_rxempty ( .clk_i (clk_i), @@ -754,9 +754,9 @@ module spi_host_reg_top #( ); // F[rxfull]: 25:25 - prim_subreg #( + caliptra_prim_subreg #( .DW (1), - .SwAccess(prim_subreg_pkg::SwAccessRO), + .SwAccess(caliptra_prim_subreg_pkg::SwAccessRO), .RESVAL (1'h0) ) u_status_rxfull ( .clk_i (clk_i), @@ -780,9 +780,9 @@ module spi_host_reg_top #( ); // F[txwm]: 26:26 - prim_subreg #( + caliptra_prim_subreg #( .DW (1), - .SwAccess(prim_subreg_pkg::SwAccessRO), + .SwAccess(caliptra_prim_subreg_pkg::SwAccessRO), .RESVAL (1'h0) ) u_status_txwm ( .clk_i (clk_i), @@ -806,9 +806,9 @@ module spi_host_reg_top #( ); // F[txstall]: 27:27 - prim_subreg #( + caliptra_prim_subreg #( .DW (1), - .SwAccess(prim_subreg_pkg::SwAccessRO), + .SwAccess(caliptra_prim_subreg_pkg::SwAccessRO), .RESVAL (1'h0) ) u_status_txstall ( .clk_i (clk_i), @@ -832,9 +832,9 @@ module spi_host_reg_top #( ); // F[txempty]: 28:28 - prim_subreg #( + caliptra_prim_subreg #( .DW (1), - .SwAccess(prim_subreg_pkg::SwAccessRO), + .SwAccess(caliptra_prim_subreg_pkg::SwAccessRO), .RESVAL (1'h0) ) u_status_txempty ( .clk_i (clk_i), @@ -858,9 +858,9 @@ module spi_host_reg_top #( ); // F[txfull]: 29:29 - prim_subreg #( + caliptra_prim_subreg #( .DW (1), - .SwAccess(prim_subreg_pkg::SwAccessRO), + .SwAccess(caliptra_prim_subreg_pkg::SwAccessRO), .RESVAL (1'h0) ) u_status_txfull ( .clk_i (clk_i), @@ -884,9 +884,9 @@ module spi_host_reg_top #( ); // F[active]: 30:30 - prim_subreg #( + caliptra_prim_subreg #( .DW (1), - .SwAccess(prim_subreg_pkg::SwAccessRO), + .SwAccess(caliptra_prim_subreg_pkg::SwAccessRO), .RESVAL (1'h0) ) u_status_active ( .clk_i (clk_i), @@ -910,9 +910,9 @@ module spi_host_reg_top #( ); // F[ready]: 31:31 - prim_subreg #( + caliptra_prim_subreg #( .DW (1), - .SwAccess(prim_subreg_pkg::SwAccessRO), + .SwAccess(caliptra_prim_subreg_pkg::SwAccessRO), .RESVAL (1'h0) ) u_status_ready ( .clk_i (clk_i), @@ -939,9 +939,9 @@ module spi_host_reg_top #( // Subregister 0 of Multireg configopts // R[configopts_0]: V(False) // F[clkdiv_0]: 15:0 - prim_subreg #( + caliptra_prim_subreg #( .DW (16), - .SwAccess(prim_subreg_pkg::SwAccessRW), + .SwAccess(caliptra_prim_subreg_pkg::SwAccessRW), .RESVAL (16'h0) ) u_configopts_0_clkdiv_0 ( .clk_i (clk_i), @@ -965,9 +965,9 @@ module spi_host_reg_top #( ); // F[csnidle_0]: 19:16 - prim_subreg #( + caliptra_prim_subreg #( .DW (4), - .SwAccess(prim_subreg_pkg::SwAccessRW), + .SwAccess(caliptra_prim_subreg_pkg::SwAccessRW), .RESVAL (4'h0) ) u_configopts_0_csnidle_0 ( .clk_i (clk_i), @@ -991,9 +991,9 @@ module spi_host_reg_top #( ); // F[csntrail_0]: 23:20 - prim_subreg #( + caliptra_prim_subreg #( .DW (4), - .SwAccess(prim_subreg_pkg::SwAccessRW), + .SwAccess(caliptra_prim_subreg_pkg::SwAccessRW), .RESVAL (4'h0) ) u_configopts_0_csntrail_0 ( .clk_i (clk_i), @@ -1017,9 +1017,9 @@ module spi_host_reg_top #( ); // F[csnlead_0]: 27:24 - prim_subreg #( + caliptra_prim_subreg #( .DW (4), - .SwAccess(prim_subreg_pkg::SwAccessRW), + .SwAccess(caliptra_prim_subreg_pkg::SwAccessRW), .RESVAL (4'h0) ) u_configopts_0_csnlead_0 ( .clk_i (clk_i), @@ -1043,9 +1043,9 @@ module spi_host_reg_top #( ); // F[fullcyc_0]: 29:29 - prim_subreg #( + caliptra_prim_subreg #( .DW (1), - .SwAccess(prim_subreg_pkg::SwAccessRW), + .SwAccess(caliptra_prim_subreg_pkg::SwAccessRW), .RESVAL (1'h0) ) u_configopts_0_fullcyc_0 ( .clk_i (clk_i), @@ -1069,9 +1069,9 @@ module spi_host_reg_top #( ); // F[cpha_0]: 30:30 - prim_subreg #( + caliptra_prim_subreg #( .DW (1), - .SwAccess(prim_subreg_pkg::SwAccessRW), + .SwAccess(caliptra_prim_subreg_pkg::SwAccessRW), .RESVAL (1'h0) ) u_configopts_0_cpha_0 ( .clk_i (clk_i), @@ -1095,9 +1095,9 @@ module spi_host_reg_top #( ); // F[cpol_0]: 31:31 - prim_subreg #( + caliptra_prim_subreg #( .DW (1), - .SwAccess(prim_subreg_pkg::SwAccessRW), + .SwAccess(caliptra_prim_subreg_pkg::SwAccessRW), .RESVAL (1'h0) ) u_configopts_0_cpol_0 ( .clk_i (clk_i), @@ -1124,9 +1124,9 @@ module spi_host_reg_top #( // Subregister 1 of Multireg configopts // R[configopts_1]: V(False) // F[clkdiv_1]: 15:0 - prim_subreg #( + caliptra_prim_subreg #( .DW (16), - .SwAccess(prim_subreg_pkg::SwAccessRW), + .SwAccess(caliptra_prim_subreg_pkg::SwAccessRW), .RESVAL (16'h0) ) u_configopts_1_clkdiv_1 ( .clk_i (clk_i), @@ -1150,9 +1150,9 @@ module spi_host_reg_top #( ); // F[csnidle_1]: 19:16 - prim_subreg #( + caliptra_prim_subreg #( .DW (4), - .SwAccess(prim_subreg_pkg::SwAccessRW), + .SwAccess(caliptra_prim_subreg_pkg::SwAccessRW), .RESVAL (4'h0) ) u_configopts_1_csnidle_1 ( .clk_i (clk_i), @@ -1176,9 +1176,9 @@ module spi_host_reg_top #( ); // F[csntrail_1]: 23:20 - prim_subreg #( + caliptra_prim_subreg #( .DW (4), - .SwAccess(prim_subreg_pkg::SwAccessRW), + .SwAccess(caliptra_prim_subreg_pkg::SwAccessRW), .RESVAL (4'h0) ) u_configopts_1_csntrail_1 ( .clk_i (clk_i), @@ -1202,9 +1202,9 @@ module spi_host_reg_top #( ); // F[csnlead_1]: 27:24 - prim_subreg #( + caliptra_prim_subreg #( .DW (4), - .SwAccess(prim_subreg_pkg::SwAccessRW), + .SwAccess(caliptra_prim_subreg_pkg::SwAccessRW), .RESVAL (4'h0) ) u_configopts_1_csnlead_1 ( .clk_i (clk_i), @@ -1228,9 +1228,9 @@ module spi_host_reg_top #( ); // F[fullcyc_1]: 29:29 - prim_subreg #( + caliptra_prim_subreg #( .DW (1), - .SwAccess(prim_subreg_pkg::SwAccessRW), + .SwAccess(caliptra_prim_subreg_pkg::SwAccessRW), .RESVAL (1'h0) ) u_configopts_1_fullcyc_1 ( .clk_i (clk_i), @@ -1254,9 +1254,9 @@ module spi_host_reg_top #( ); // F[cpha_1]: 30:30 - prim_subreg #( + caliptra_prim_subreg #( .DW (1), - .SwAccess(prim_subreg_pkg::SwAccessRW), + .SwAccess(caliptra_prim_subreg_pkg::SwAccessRW), .RESVAL (1'h0) ) u_configopts_1_cpha_1 ( .clk_i (clk_i), @@ -1280,9 +1280,9 @@ module spi_host_reg_top #( ); // F[cpol_1]: 31:31 - prim_subreg #( + caliptra_prim_subreg #( .DW (1), - .SwAccess(prim_subreg_pkg::SwAccessRW), + .SwAccess(caliptra_prim_subreg_pkg::SwAccessRW), .RESVAL (1'h0) ) u_configopts_1_cpol_1 ( .clk_i (clk_i), @@ -1307,9 +1307,9 @@ module spi_host_reg_top #( // R[csid]: V(False) - prim_subreg #( + caliptra_prim_subreg #( .DW (32), - .SwAccess(prim_subreg_pkg::SwAccessRW), + .SwAccess(caliptra_prim_subreg_pkg::SwAccessRW), .RESVAL (32'h0) ) u_csid ( .clk_i (clk_i), @@ -1338,7 +1338,7 @@ module spi_host_reg_top #( logic [3:0] command_flds_we; assign command_qe = &command_flds_we; // F[len]: 8:0 - prim_subreg_ext #( + caliptra_prim_subreg_ext #( .DW (9) ) u_command_len ( .re (1'b0), @@ -1354,7 +1354,7 @@ module spi_host_reg_top #( assign reg2hw.command.len.qe = command_qe; // F[csaat]: 9:9 - prim_subreg_ext #( + caliptra_prim_subreg_ext #( .DW (1) ) u_command_csaat ( .re (1'b0), @@ -1370,7 +1370,7 @@ module spi_host_reg_top #( assign reg2hw.command.csaat.qe = command_qe; // F[speed]: 11:10 - prim_subreg_ext #( + caliptra_prim_subreg_ext #( .DW (2) ) u_command_speed ( .re (1'b0), @@ -1386,7 +1386,7 @@ module spi_host_reg_top #( assign reg2hw.command.speed.qe = command_qe; // F[direction]: 13:12 - prim_subreg_ext #( + caliptra_prim_subreg_ext #( .DW (2) ) u_command_direction ( .re (1'b0), @@ -1403,9 +1403,9 @@ module spi_host_reg_top #( // R[rxdata]: V(False) - prim_subreg #( + caliptra_prim_subreg #( .DW (32), - .SwAccess(prim_subreg_pkg::SwAccessRO), + .SwAccess(caliptra_prim_subreg_pkg::SwAccessRO), .RESVAL (32'h0) ) u_rxdata ( .clk_i (clk_i), @@ -1433,7 +1433,7 @@ module spi_host_reg_top #( logic txdata_qe; logic [0:0] txdata_flds_we; assign txdata_qe = &txdata_flds_we; - prim_subreg_ext #( + caliptra_prim_subreg_ext #( .DW (32) ) u_txdata ( .re (1'b0), @@ -1451,9 +1451,9 @@ module spi_host_reg_top #( // R[error_enable]: V(False) // F[cmdbusy]: 0:0 - prim_subreg #( + caliptra_prim_subreg #( .DW (1), - .SwAccess(prim_subreg_pkg::SwAccessRW), + .SwAccess(caliptra_prim_subreg_pkg::SwAccessRW), .RESVAL (1'h1) ) u_error_enable_cmdbusy ( .clk_i (clk_i), @@ -1477,9 +1477,9 @@ module spi_host_reg_top #( ); // F[overflow]: 1:1 - prim_subreg #( + caliptra_prim_subreg #( .DW (1), - .SwAccess(prim_subreg_pkg::SwAccessRW), + .SwAccess(caliptra_prim_subreg_pkg::SwAccessRW), .RESVAL (1'h1) ) u_error_enable_overflow ( .clk_i (clk_i), @@ -1503,9 +1503,9 @@ module spi_host_reg_top #( ); // F[underflow]: 2:2 - prim_subreg #( + caliptra_prim_subreg #( .DW (1), - .SwAccess(prim_subreg_pkg::SwAccessRW), + .SwAccess(caliptra_prim_subreg_pkg::SwAccessRW), .RESVAL (1'h1) ) u_error_enable_underflow ( .clk_i (clk_i), @@ -1529,9 +1529,9 @@ module spi_host_reg_top #( ); // F[cmdinval]: 3:3 - prim_subreg #( + caliptra_prim_subreg #( .DW (1), - .SwAccess(prim_subreg_pkg::SwAccessRW), + .SwAccess(caliptra_prim_subreg_pkg::SwAccessRW), .RESVAL (1'h1) ) u_error_enable_cmdinval ( .clk_i (clk_i), @@ -1555,9 +1555,9 @@ module spi_host_reg_top #( ); // F[csidinval]: 4:4 - prim_subreg #( + caliptra_prim_subreg #( .DW (1), - .SwAccess(prim_subreg_pkg::SwAccessRW), + .SwAccess(caliptra_prim_subreg_pkg::SwAccessRW), .RESVAL (1'h1) ) u_error_enable_csidinval ( .clk_i (clk_i), @@ -1583,9 +1583,9 @@ module spi_host_reg_top #( // R[error_status]: V(False) // F[cmdbusy]: 0:0 - prim_subreg #( + caliptra_prim_subreg #( .DW (1), - .SwAccess(prim_subreg_pkg::SwAccessW1C), + .SwAccess(caliptra_prim_subreg_pkg::SwAccessW1C), .RESVAL (1'h0) ) u_error_status_cmdbusy ( .clk_i (clk_i), @@ -1609,9 +1609,9 @@ module spi_host_reg_top #( ); // F[overflow]: 1:1 - prim_subreg #( + caliptra_prim_subreg #( .DW (1), - .SwAccess(prim_subreg_pkg::SwAccessW1C), + .SwAccess(caliptra_prim_subreg_pkg::SwAccessW1C), .RESVAL (1'h0) ) u_error_status_overflow ( .clk_i (clk_i), @@ -1635,9 +1635,9 @@ module spi_host_reg_top #( ); // F[underflow]: 2:2 - prim_subreg #( + caliptra_prim_subreg #( .DW (1), - .SwAccess(prim_subreg_pkg::SwAccessW1C), + .SwAccess(caliptra_prim_subreg_pkg::SwAccessW1C), .RESVAL (1'h0) ) u_error_status_underflow ( .clk_i (clk_i), @@ -1661,9 +1661,9 @@ module spi_host_reg_top #( ); // F[cmdinval]: 3:3 - prim_subreg #( + caliptra_prim_subreg #( .DW (1), - .SwAccess(prim_subreg_pkg::SwAccessW1C), + .SwAccess(caliptra_prim_subreg_pkg::SwAccessW1C), .RESVAL (1'h0) ) u_error_status_cmdinval ( .clk_i (clk_i), @@ -1687,9 +1687,9 @@ module spi_host_reg_top #( ); // F[csidinval]: 4:4 - prim_subreg #( + caliptra_prim_subreg #( .DW (1), - .SwAccess(prim_subreg_pkg::SwAccessW1C), + .SwAccess(caliptra_prim_subreg_pkg::SwAccessW1C), .RESVAL (1'h0) ) u_error_status_csidinval ( .clk_i (clk_i), @@ -1713,9 +1713,9 @@ module spi_host_reg_top #( ); // F[accessinval]: 5:5 - prim_subreg #( + caliptra_prim_subreg #( .DW (1), - .SwAccess(prim_subreg_pkg::SwAccessW1C), + .SwAccess(caliptra_prim_subreg_pkg::SwAccessW1C), .RESVAL (1'h0) ) u_error_status_accessinval ( .clk_i (clk_i), @@ -1741,9 +1741,9 @@ module spi_host_reg_top #( // R[event_enable]: V(False) // F[rxfull]: 0:0 - prim_subreg #( + caliptra_prim_subreg #( .DW (1), - .SwAccess(prim_subreg_pkg::SwAccessRW), + .SwAccess(caliptra_prim_subreg_pkg::SwAccessRW), .RESVAL (1'h0) ) u_event_enable_rxfull ( .clk_i (clk_i), @@ -1767,9 +1767,9 @@ module spi_host_reg_top #( ); // F[txempty]: 1:1 - prim_subreg #( + caliptra_prim_subreg #( .DW (1), - .SwAccess(prim_subreg_pkg::SwAccessRW), + .SwAccess(caliptra_prim_subreg_pkg::SwAccessRW), .RESVAL (1'h0) ) u_event_enable_txempty ( .clk_i (clk_i), @@ -1793,9 +1793,9 @@ module spi_host_reg_top #( ); // F[rxwm]: 2:2 - prim_subreg #( + caliptra_prim_subreg #( .DW (1), - .SwAccess(prim_subreg_pkg::SwAccessRW), + .SwAccess(caliptra_prim_subreg_pkg::SwAccessRW), .RESVAL (1'h0) ) u_event_enable_rxwm ( .clk_i (clk_i), @@ -1819,9 +1819,9 @@ module spi_host_reg_top #( ); // F[txwm]: 3:3 - prim_subreg #( + caliptra_prim_subreg #( .DW (1), - .SwAccess(prim_subreg_pkg::SwAccessRW), + .SwAccess(caliptra_prim_subreg_pkg::SwAccessRW), .RESVAL (1'h0) ) u_event_enable_txwm ( .clk_i (clk_i), @@ -1845,9 +1845,9 @@ module spi_host_reg_top #( ); // F[ready]: 4:4 - prim_subreg #( + caliptra_prim_subreg #( .DW (1), - .SwAccess(prim_subreg_pkg::SwAccessRW), + .SwAccess(caliptra_prim_subreg_pkg::SwAccessRW), .RESVAL (1'h0) ) u_event_enable_ready ( .clk_i (clk_i), @@ -1871,9 +1871,9 @@ module spi_host_reg_top #( ); // F[idle]: 5:5 - prim_subreg #( + caliptra_prim_subreg #( .DW (1), - .SwAccess(prim_subreg_pkg::SwAccessRW), + .SwAccess(caliptra_prim_subreg_pkg::SwAccessRW), .RESVAL (1'h0) ) u_event_enable_idle ( .clk_i (clk_i), diff --git a/src/spi_host/tb/Makefile b/src/spi_host/tb/Makefile index e65bb88cb..cbec3d6b4 100644 --- a/src/spi_host/tb/Makefile +++ b/src/spi_host/tb/Makefile @@ -1,3 +1,18 @@ +# SPDX-License-Identifier: Apache-2.0 +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + VERILATOR = verilator IPNAME = spi_host diff --git a/src/spi_host/tb/spi_host_tb.sv b/src/spi_host/tb/spi_host_tb.sv index 677285648..766a748dc 100644 --- a/src/spi_host/tb/spi_host_tb.sv +++ b/src/spi_host/tb/spi_host_tb.sv @@ -24,7 +24,7 @@ module spi_host_tb import spi_host_reg_pkg::*; import spi_device_pkg::*; - import prim_mubi_pkg::mubi8_t; + import caliptra_prim_mubi_pkg::mubi8_t; ( `ifdef VERILATOR input bit clk_tb @@ -140,7 +140,7 @@ module spi_host_tb .hrdata_o (hrdata_o_tb), // Alerts - .alert_rx_i(prim_alert_pkg::ALERT_RX_DEFAULT), + .alert_rx_i(caliptra_prim_alert_pkg::ALERT_RX_DEFAULT), .alert_tx_o(), // SPI Interface @@ -195,7 +195,7 @@ module spi_host_tb // the dut as needed. //---------------------------------------------------------------- always_ff @(posedge clk_tb) begin : sys_monitor - cycle_ctr = cycle_ctr + 1; + cycle_ctr = (~reset_n_tb) ? 0 : cycle_ctr + 1; end @@ -228,7 +228,6 @@ module spi_host_tb task init_sim; begin generate_rng = '0; - cycle_ctr = '0; error_ctr = '0; tc_ctr = '0; `ifndef VERILATOR @@ -492,9 +491,9 @@ module spi_host_tb // Configures the spi_host to request data from the spi flash // The spiflash device will return data at the requested addresses //---------------------------------------------------------------- - task run_read_test(input int host); + task automatic run_read_test(input int host); logic [31:0] rx_data; - logic [7:0] rx_bytes[$] = {}; + automatic logic [7:0] rx_bytes[$] = {}; spi_host_status_t status; logic [7:0] spi_data; logic [19:0] spi_offset; diff --git a/src/uart/config/compile.yml b/src/uart/config/compile.yml index 7a7dd3f5e..b4836131d 100644 --- a/src/uart/config/compile.yml +++ b/src/uart/config/compile.yml @@ -2,8 +2,8 @@ provides: [uart] schema_version: 2.4.0 requires: - - prim_generic - - prim + - caliptra_prim_generic + - caliptra_prim - libs targets: rtl: diff --git a/src/uart/config/uart.vf b/src/uart/config/uart.vf index 5f5cfae6b..469205a79 100644 --- a/src/uart/config/uart.vf +++ b/src/uart/config/uart.vf @@ -1,9 +1,9 @@ +incdir+${CALIPTRA_ROOT}/src/integration/rtl +incdir+${CALIPTRA_ROOT}/src/libs/rtl -+incdir+${CALIPTRA_ROOT}/src/prim/rtl ++incdir+${CALIPTRA_ROOT}/src/caliptra_prim/rtl +incdir+${CALIPTRA_ROOT}/src/lc_ctrl/rtl +incdir+${CALIPTRA_ROOT}/src/uart/rtl -+incdir+${CALIPTRA_ROOT}/src/prim_generic/rtl ++incdir+${CALIPTRA_ROOT}/src/caliptra_prim_generic/rtl ${CALIPTRA_ROOT}/src/integration/rtl/config_defines.svh ${CALIPTRA_ROOT}/src/integration/rtl/caliptra_reg_defines.svh ${CALIPTRA_ROOT}/src/libs/rtl/caliptra_sva.svh @@ -15,47 +15,53 @@ ${CALIPTRA_ROOT}/src/libs/rtl/apb_slv_sif.sv ${CALIPTRA_ROOT}/src/libs/rtl/ahb_slv_sif.sv ${CALIPTRA_ROOT}/src/libs/rtl/caliptra_icg.sv ${CALIPTRA_ROOT}/src/libs/rtl/clk_gate.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_util_pkg.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_alert_pkg.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_subreg_pkg.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_mubi_pkg.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_cipher_pkg.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_pkg.sv +${CALIPTRA_ROOT}/src/libs/rtl/caliptra_2ff_sync.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_util_pkg.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_alert_pkg.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_subreg_pkg.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_mubi_pkg.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_cipher_pkg.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_pkg.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_sparse_fsm_pkg.sv ${CALIPTRA_ROOT}/src/lc_ctrl/rtl/lc_ctrl_reg_pkg.sv ${CALIPTRA_ROOT}/src/lc_ctrl/rtl/lc_ctrl_state_pkg.sv ${CALIPTRA_ROOT}/src/lc_ctrl/rtl/lc_ctrl_pkg.sv -${CALIPTRA_ROOT}/src/prim_generic/rtl/prim_generic_flop.sv -${CALIPTRA_ROOT}/src/prim_generic/rtl/prim_generic_buf.sv +${CALIPTRA_ROOT}/src/uart/rtl/uart_reg_pkg.sv +${CALIPTRA_ROOT}/src/caliptra_prim_generic/rtl/caliptra_prim_generic_flop_en.sv +${CALIPTRA_ROOT}/src/caliptra_prim_generic/rtl/caliptra_prim_generic_flop.sv +${CALIPTRA_ROOT}/src/caliptra_prim_generic/rtl/caliptra_prim_generic_buf.sv ${CALIPTRA_ROOT}/src/libs/rtl/ahb_to_reg_adapter.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_flop_2sync.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_lfsr.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_mubi4_sync.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_diff_decode.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_sec_anchor_buf.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_slicer.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_count.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_sparse_fsm_flop.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_dom_and_2share.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_sec_anchor_flop.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_reg_we_check.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_packer_fifo.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_max_tree.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_subreg_arb.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_subreg.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_intr_hw.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_onehot_check.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_mubi8_sync.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_fifo_sync_cnt.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_buf.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_lc_sync.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_alert_receiver.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_flop.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_alert_sender.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_fifo_sync.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_arbiter_ppc.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_sum_tree.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_subreg_ext.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_edge_detector.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_flop_en.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_cdc_rand_delay.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_flop_2sync.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_lfsr.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_mubi4_sync.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_diff_decode.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_sec_anchor_buf.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_slicer.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_count.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_sparse_fsm_flop.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_dom_and_2share.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_sec_anchor_flop.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_reg_we_check.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_packer_fifo.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_max_tree.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_subreg_arb.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_subreg.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_intr_hw.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_onehot_check.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_mubi8_sync.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_fifo_sync_cnt.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_buf.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_lc_sync.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_alert_receiver.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_flop.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_alert_sender.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_fifo_sync.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_arbiter_ppc.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_sum_tree.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_subreg_ext.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_edge_detector.sv ${CALIPTRA_ROOT}/src/uart/rtl/uart_tx.sv ${CALIPTRA_ROOT}/src/uart/rtl/uart_reg_pkg.sv ${CALIPTRA_ROOT}/src/uart/rtl/uart_reg_top.sv diff --git a/src/uart/config/uart.vlt b/src/uart/config/uart.vlt index 21794084e..5e03da9c1 100644 --- a/src/uart/config/uart.vlt +++ b/src/uart/config/uart.vlt @@ -1,6 +1,6 @@ // Licensed under the Apache License, Version 2.0, see LICENSE for details. // SPDX-License-Identifier: Apache-2.0 // -${CALIPTRA_ROOT}/src/prim/lint/prim_max_tree.vlt -${CALIPTRA_ROOT}/src/prim/lint/prim_sum_tree.vlt -${CALIPTRA_ROOT}/src/prim/lint/prim_onehot_check.vlt +${CALIPTRA_ROOT}/src/caliptra_prim/lint/caliptra_prim_max_tree.vlt +${CALIPTRA_ROOT}/src/caliptra_prim/lint/caliptra_prim_sum_tree.vlt +${CALIPTRA_ROOT}/src/caliptra_prim/lint/caliptra_prim_onehot_check.vlt diff --git a/src/uart/config/uart_tb.vf b/src/uart/config/uart_tb.vf index c0cf4c1cc..4332da0e6 100644 --- a/src/uart/config/uart_tb.vf +++ b/src/uart/config/uart_tb.vf @@ -1,10 +1,10 @@ +incdir+${CALIPTRA_ROOT}/src/integration/rtl +incdir+${CALIPTRA_ROOT}/src/libs/rtl -+incdir+${CALIPTRA_ROOT}/src/prim/rtl ++incdir+${CALIPTRA_ROOT}/src/caliptra_prim/rtl +incdir+${CALIPTRA_ROOT}/src/lc_ctrl/rtl +incdir+${CALIPTRA_ROOT}/src/uart/rtl +incdir+${CALIPTRA_ROOT}/src/uart/tb -+incdir+${CALIPTRA_ROOT}/src/prim_generic/rtl ++incdir+${CALIPTRA_ROOT}/src/caliptra_prim_generic/rtl ${CALIPTRA_ROOT}/src/integration/rtl/config_defines.svh ${CALIPTRA_ROOT}/src/integration/rtl/caliptra_reg_defines.svh ${CALIPTRA_ROOT}/src/libs/rtl/caliptra_sva.svh @@ -16,51 +16,56 @@ ${CALIPTRA_ROOT}/src/libs/rtl/apb_slv_sif.sv ${CALIPTRA_ROOT}/src/libs/rtl/ahb_slv_sif.sv ${CALIPTRA_ROOT}/src/libs/rtl/caliptra_icg.sv ${CALIPTRA_ROOT}/src/libs/rtl/clk_gate.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_util_pkg.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_alert_pkg.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_subreg_pkg.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_mubi_pkg.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_cipher_pkg.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_pkg.sv +${CALIPTRA_ROOT}/src/libs/rtl/caliptra_2ff_sync.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_util_pkg.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_alert_pkg.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_subreg_pkg.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_mubi_pkg.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_cipher_pkg.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_pkg.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_sparse_fsm_pkg.sv ${CALIPTRA_ROOT}/src/lc_ctrl/rtl/lc_ctrl_reg_pkg.sv ${CALIPTRA_ROOT}/src/lc_ctrl/rtl/lc_ctrl_state_pkg.sv ${CALIPTRA_ROOT}/src/lc_ctrl/rtl/lc_ctrl_pkg.sv ${CALIPTRA_ROOT}/src/uart/rtl/uart_reg_pkg.sv ${CALIPTRA_ROOT}/src/uart/tb/uart_tb.sv -${CALIPTRA_ROOT}/src/prim_generic/rtl/prim_generic_flop.sv -${CALIPTRA_ROOT}/src/prim_generic/rtl/prim_generic_buf.sv +${CALIPTRA_ROOT}/src/caliptra_prim_generic/rtl/caliptra_prim_generic_flop_en.sv +${CALIPTRA_ROOT}/src/caliptra_prim_generic/rtl/caliptra_prim_generic_flop.sv +${CALIPTRA_ROOT}/src/caliptra_prim_generic/rtl/caliptra_prim_generic_buf.sv ${CALIPTRA_ROOT}/src/libs/rtl/ahb_to_reg_adapter.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_flop_2sync.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_lfsr.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_mubi4_sync.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_diff_decode.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_sec_anchor_buf.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_slicer.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_count.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_sparse_fsm_flop.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_dom_and_2share.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_sec_anchor_flop.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_reg_we_check.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_packer_fifo.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_max_tree.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_subreg_arb.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_subreg.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_intr_hw.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_onehot_check.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_mubi8_sync.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_fifo_sync_cnt.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_buf.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_lc_sync.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_alert_receiver.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_flop.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_alert_sender.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_fifo_sync.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_arbiter_ppc.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_sum_tree.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_subreg_ext.sv -${CALIPTRA_ROOT}/src/prim/rtl/prim_edge_detector.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_flop_en.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_cdc_rand_delay.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_flop_2sync.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_lfsr.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_mubi4_sync.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_diff_decode.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_sec_anchor_buf.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_slicer.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_count.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_sparse_fsm_flop.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_dom_and_2share.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_sec_anchor_flop.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_reg_we_check.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_packer_fifo.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_max_tree.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_subreg_arb.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_subreg.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_intr_hw.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_onehot_check.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_mubi8_sync.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_fifo_sync_cnt.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_buf.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_lc_sync.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_alert_receiver.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_flop.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_alert_sender.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_fifo_sync.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_arbiter_ppc.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_sum_tree.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_subreg_ext.sv +${CALIPTRA_ROOT}/src/caliptra_prim/rtl/caliptra_prim_edge_detector.sv ${CALIPTRA_ROOT}/src/uart/rtl/uart_tx.sv ${CALIPTRA_ROOT}/src/uart/rtl/uart_reg_top.sv ${CALIPTRA_ROOT}/src/uart/rtl/uart_rx.sv ${CALIPTRA_ROOT}/src/uart/rtl/uart.sv -${CALIPTRA_ROOT}/src/uart/rtl/uart_core.sv \ No newline at end of file +${CALIPTRA_ROOT}/src/uart/rtl/uart_core.sv diff --git a/src/uart/doc/_index.md b/src/uart/doc/_index.md index f59e7c3c7..f9e152306 100644 --- a/src/uart/doc/_index.md +++ b/src/uart/doc/_index.md @@ -1,3 +1,18 @@ +_*SPDX-License-Identifier: Apache-2.0
+
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.*_
+ --- title: "UART HWIP Technical Specification" --- diff --git a/src/uart/doc/checklist.md b/src/uart/doc/checklist.md index d6d67aa94..3a7b4abad 100644 --- a/src/uart/doc/checklist.md +++ b/src/uart/doc/checklist.md @@ -1,3 +1,18 @@ +_*SPDX-License-Identifier: Apache-2.0
+
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.*_
+ --- title: "UART Checklist" --- diff --git a/src/uart/doc/dv/index.md b/src/uart/doc/dv/index.md index e9f9d1b48..9fa501640 100644 --- a/src/uart/doc/dv/index.md +++ b/src/uart/doc/dv/index.md @@ -1,3 +1,18 @@ +_*SPDX-License-Identifier: Apache-2.0
+
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.*_
+ --- title: "UART DV document" --- diff --git a/src/uart/rtl/uart.sv b/src/uart/rtl/uart.sv index 002f016b0..c5d8806f3 100644 --- a/src/uart/rtl/uart.sv +++ b/src/uart/rtl/uart.sv @@ -4,7 +4,7 @@ // // Description: UART top level wrapper file -`include "prim_assert.sv" +`include "caliptra_prim_assert.sv" module uart import uart_reg_pkg::*; @@ -30,8 +30,8 @@ module uart output logic [AHBDataWidth-1:0] hrdata_o, // Alerts - input prim_alert_pkg::alert_rx_t [NumAlerts-1:0] alert_rx_i, - output prim_alert_pkg::alert_tx_t [NumAlerts-1:0] alert_tx_o, + input caliptra_prim_alert_pkg::alert_rx_t [NumAlerts-1:0] alert_rx_i, + output caliptra_prim_alert_pkg::alert_tx_t [NumAlerts-1:0] alert_tx_o, // Generic IO input cio_rx_i, @@ -102,10 +102,10 @@ module uart }; for (genvar i = 0; i < NumAlerts; i++) begin : gen_alert_tx - prim_alert_sender #( + caliptra_prim_alert_sender #( .AsyncOn(AlertAsyncOn[i]), .IsFatal(1'b1) - ) u_prim_alert_sender ( + ) u_caliptra_prim_alert_sender ( .clk_i, .rst_ni, .alert_test_i ( alert_test[i] ), diff --git a/src/uart/rtl/uart_core.sv b/src/uart/rtl/uart_core.sv index c0f775fd2..aed925c70 100644 --- a/src/uart/rtl/uart_core.sv +++ b/src/uart/rtl/uart_core.sv @@ -169,7 +169,7 @@ module uart_core ( assign tx_fifo_rready = tx_uart_idle & tx_fifo_rvalid & tx_enable; - prim_fifo_sync #( + caliptra_prim_fifo_sync #( .Width (8), .Pass (1'b0), .Depth (32) @@ -219,7 +219,7 @@ module uart_core ( ////////////// // sync the incoming data - prim_flop_2sync #( + caliptra_prim_flop_2sync #( .Width(1), .ResetValue(1'b1) ) sync_rx ( @@ -270,7 +270,7 @@ module uart_core ( assign rx_fifo_wvalid = rx_valid & ~event_rx_frame_err & ~event_rx_parity_err; - prim_fifo_sync #( + caliptra_prim_fifo_sync #( .Width (8), .Pass (1'b0), .Depth (32) @@ -387,7 +387,7 @@ module uart_core ( // instantiate interrupt hardware primitives - prim_intr_hw #(.Width(1)) intr_hw_tx_watermark ( + caliptra_prim_intr_hw #(.Width(1)) intr_hw_tx_watermark ( .clk_i, .rst_ni, .event_intr_i (event_tx_watermark), @@ -400,7 +400,7 @@ module uart_core ( .intr_o (intr_tx_watermark_o) ); - prim_intr_hw #(.Width(1)) intr_hw_rx_watermark ( + caliptra_prim_intr_hw #(.Width(1)) intr_hw_rx_watermark ( .clk_i, .rst_ni, .event_intr_i (event_rx_watermark), @@ -413,7 +413,7 @@ module uart_core ( .intr_o (intr_rx_watermark_o) ); - prim_intr_hw #(.Width(1)) intr_hw_tx_empty ( + caliptra_prim_intr_hw #(.Width(1)) intr_hw_tx_empty ( .clk_i, .rst_ni, .event_intr_i (event_tx_empty), @@ -426,7 +426,7 @@ module uart_core ( .intr_o (intr_tx_empty_o) ); - prim_intr_hw #(.Width(1)) intr_hw_rx_overflow ( + caliptra_prim_intr_hw #(.Width(1)) intr_hw_rx_overflow ( .clk_i, .rst_ni, .event_intr_i (event_rx_overflow), @@ -439,7 +439,7 @@ module uart_core ( .intr_o (intr_rx_overflow_o) ); - prim_intr_hw #(.Width(1)) intr_hw_rx_frame_err ( + caliptra_prim_intr_hw #(.Width(1)) intr_hw_rx_frame_err ( .clk_i, .rst_ni, .event_intr_i (event_rx_frame_err), @@ -452,7 +452,7 @@ module uart_core ( .intr_o (intr_rx_frame_err_o) ); - prim_intr_hw #(.Width(1)) intr_hw_rx_break_err ( + caliptra_prim_intr_hw #(.Width(1)) intr_hw_rx_break_err ( .clk_i, .rst_ni, .event_intr_i (event_rx_break_err), @@ -465,7 +465,7 @@ module uart_core ( .intr_o (intr_rx_break_err_o) ); - prim_intr_hw #(.Width(1)) intr_hw_rx_timeout ( + caliptra_prim_intr_hw #(.Width(1)) intr_hw_rx_timeout ( .clk_i, .rst_ni, .event_intr_i (event_rx_timeout), @@ -478,7 +478,7 @@ module uart_core ( .intr_o (intr_rx_timeout_o) ); - prim_intr_hw #(.Width(1)) intr_hw_rx_parity_err ( + caliptra_prim_intr_hw #(.Width(1)) intr_hw_rx_parity_err ( .clk_i, .rst_ni, .event_intr_i (event_rx_parity_err), diff --git a/src/uart/rtl/uart_reg_top.sv b/src/uart/rtl/uart_reg_top.sv index 66a61359a..b66a9efef 100644 --- a/src/uart/rtl/uart_reg_top.sv +++ b/src/uart/rtl/uart_reg_top.sv @@ -4,7 +4,7 @@ // // Register Top module auto-generated by `reggen` -`include "prim_assert.sv" +`include "caliptra_prim_assert.sv" module uart_reg_top #( parameter AHBDataWidth = 64, @@ -67,9 +67,9 @@ module uart_reg_top #( // also check for spurious write enables logic reg_we_err; logic [12:0] reg_we_check; - prim_reg_we_check #( + caliptra_prim_reg_we_check #( .OneHotWidth(13) - ) u_prim_reg_we_check ( + ) u_caliptra_prim_reg_we_check ( .clk_i(clk_i), .rst_ni(rst_ni), .oh_i (reg_we_check), @@ -250,9 +250,9 @@ module uart_reg_top #( // Register instances // R[intr_state]: V(False) // F[tx_watermark]: 0:0 - prim_subreg #( + caliptra_prim_subreg #( .DW (1), - .SwAccess(prim_subreg_pkg::SwAccessW1C), + .SwAccess(caliptra_prim_subreg_pkg::SwAccessW1C), .RESVAL (1'h0) ) u_intr_state_tx_watermark ( .clk_i (clk_i), @@ -276,9 +276,9 @@ module uart_reg_top #( ); // F[rx_watermark]: 1:1 - prim_subreg #( + caliptra_prim_subreg #( .DW (1), - .SwAccess(prim_subreg_pkg::SwAccessW1C), + .SwAccess(caliptra_prim_subreg_pkg::SwAccessW1C), .RESVAL (1'h0) ) u_intr_state_rx_watermark ( .clk_i (clk_i), @@ -302,9 +302,9 @@ module uart_reg_top #( ); // F[tx_empty]: 2:2 - prim_subreg #( + caliptra_prim_subreg #( .DW (1), - .SwAccess(prim_subreg_pkg::SwAccessW1C), + .SwAccess(caliptra_prim_subreg_pkg::SwAccessW1C), .RESVAL (1'h0) ) u_intr_state_tx_empty ( .clk_i (clk_i), @@ -328,9 +328,9 @@ module uart_reg_top #( ); // F[rx_overflow]: 3:3 - prim_subreg #( + caliptra_prim_subreg #( .DW (1), - .SwAccess(prim_subreg_pkg::SwAccessW1C), + .SwAccess(caliptra_prim_subreg_pkg::SwAccessW1C), .RESVAL (1'h0) ) u_intr_state_rx_overflow ( .clk_i (clk_i), @@ -354,9 +354,9 @@ module uart_reg_top #( ); // F[rx_frame_err]: 4:4 - prim_subreg #( + caliptra_prim_subreg #( .DW (1), - .SwAccess(prim_subreg_pkg::SwAccessW1C), + .SwAccess(caliptra_prim_subreg_pkg::SwAccessW1C), .RESVAL (1'h0) ) u_intr_state_rx_frame_err ( .clk_i (clk_i), @@ -380,9 +380,9 @@ module uart_reg_top #( ); // F[rx_break_err]: 5:5 - prim_subreg #( + caliptra_prim_subreg #( .DW (1), - .SwAccess(prim_subreg_pkg::SwAccessW1C), + .SwAccess(caliptra_prim_subreg_pkg::SwAccessW1C), .RESVAL (1'h0) ) u_intr_state_rx_break_err ( .clk_i (clk_i), @@ -406,9 +406,9 @@ module uart_reg_top #( ); // F[rx_timeout]: 6:6 - prim_subreg #( + caliptra_prim_subreg #( .DW (1), - .SwAccess(prim_subreg_pkg::SwAccessW1C), + .SwAccess(caliptra_prim_subreg_pkg::SwAccessW1C), .RESVAL (1'h0) ) u_intr_state_rx_timeout ( .clk_i (clk_i), @@ -432,9 +432,9 @@ module uart_reg_top #( ); // F[rx_parity_err]: 7:7 - prim_subreg #( + caliptra_prim_subreg #( .DW (1), - .SwAccess(prim_subreg_pkg::SwAccessW1C), + .SwAccess(caliptra_prim_subreg_pkg::SwAccessW1C), .RESVAL (1'h0) ) u_intr_state_rx_parity_err ( .clk_i (clk_i), @@ -460,9 +460,9 @@ module uart_reg_top #( // R[intr_enable]: V(False) // F[tx_watermark]: 0:0 - prim_subreg #( + caliptra_prim_subreg #( .DW (1), - .SwAccess(prim_subreg_pkg::SwAccessRW), + .SwAccess(caliptra_prim_subreg_pkg::SwAccessRW), .RESVAL (1'h0) ) u_intr_enable_tx_watermark ( .clk_i (clk_i), @@ -486,9 +486,9 @@ module uart_reg_top #( ); // F[rx_watermark]: 1:1 - prim_subreg #( + caliptra_prim_subreg #( .DW (1), - .SwAccess(prim_subreg_pkg::SwAccessRW), + .SwAccess(caliptra_prim_subreg_pkg::SwAccessRW), .RESVAL (1'h0) ) u_intr_enable_rx_watermark ( .clk_i (clk_i), @@ -512,9 +512,9 @@ module uart_reg_top #( ); // F[tx_empty]: 2:2 - prim_subreg #( + caliptra_prim_subreg #( .DW (1), - .SwAccess(prim_subreg_pkg::SwAccessRW), + .SwAccess(caliptra_prim_subreg_pkg::SwAccessRW), .RESVAL (1'h0) ) u_intr_enable_tx_empty ( .clk_i (clk_i), @@ -538,9 +538,9 @@ module uart_reg_top #( ); // F[rx_overflow]: 3:3 - prim_subreg #( + caliptra_prim_subreg #( .DW (1), - .SwAccess(prim_subreg_pkg::SwAccessRW), + .SwAccess(caliptra_prim_subreg_pkg::SwAccessRW), .RESVAL (1'h0) ) u_intr_enable_rx_overflow ( .clk_i (clk_i), @@ -564,9 +564,9 @@ module uart_reg_top #( ); // F[rx_frame_err]: 4:4 - prim_subreg #( + caliptra_prim_subreg #( .DW (1), - .SwAccess(prim_subreg_pkg::SwAccessRW), + .SwAccess(caliptra_prim_subreg_pkg::SwAccessRW), .RESVAL (1'h0) ) u_intr_enable_rx_frame_err ( .clk_i (clk_i), @@ -590,9 +590,9 @@ module uart_reg_top #( ); // F[rx_break_err]: 5:5 - prim_subreg #( + caliptra_prim_subreg #( .DW (1), - .SwAccess(prim_subreg_pkg::SwAccessRW), + .SwAccess(caliptra_prim_subreg_pkg::SwAccessRW), .RESVAL (1'h0) ) u_intr_enable_rx_break_err ( .clk_i (clk_i), @@ -616,9 +616,9 @@ module uart_reg_top #( ); // F[rx_timeout]: 6:6 - prim_subreg #( + caliptra_prim_subreg #( .DW (1), - .SwAccess(prim_subreg_pkg::SwAccessRW), + .SwAccess(caliptra_prim_subreg_pkg::SwAccessRW), .RESVAL (1'h0) ) u_intr_enable_rx_timeout ( .clk_i (clk_i), @@ -642,9 +642,9 @@ module uart_reg_top #( ); // F[rx_parity_err]: 7:7 - prim_subreg #( + caliptra_prim_subreg #( .DW (1), - .SwAccess(prim_subreg_pkg::SwAccessRW), + .SwAccess(caliptra_prim_subreg_pkg::SwAccessRW), .RESVAL (1'h0) ) u_intr_enable_rx_parity_err ( .clk_i (clk_i), @@ -673,7 +673,7 @@ module uart_reg_top #( logic [7:0] intr_test_flds_we; assign intr_test_qe = &intr_test_flds_we; // F[tx_watermark]: 0:0 - prim_subreg_ext #( + caliptra_prim_subreg_ext #( .DW (1) ) u_intr_test_tx_watermark ( .re (1'b0), @@ -689,7 +689,7 @@ module uart_reg_top #( assign reg2hw.intr_test.tx_watermark.qe = intr_test_qe; // F[rx_watermark]: 1:1 - prim_subreg_ext #( + caliptra_prim_subreg_ext #( .DW (1) ) u_intr_test_rx_watermark ( .re (1'b0), @@ -705,7 +705,7 @@ module uart_reg_top #( assign reg2hw.intr_test.rx_watermark.qe = intr_test_qe; // F[tx_empty]: 2:2 - prim_subreg_ext #( + caliptra_prim_subreg_ext #( .DW (1) ) u_intr_test_tx_empty ( .re (1'b0), @@ -721,7 +721,7 @@ module uart_reg_top #( assign reg2hw.intr_test.tx_empty.qe = intr_test_qe; // F[rx_overflow]: 3:3 - prim_subreg_ext #( + caliptra_prim_subreg_ext #( .DW (1) ) u_intr_test_rx_overflow ( .re (1'b0), @@ -737,7 +737,7 @@ module uart_reg_top #( assign reg2hw.intr_test.rx_overflow.qe = intr_test_qe; // F[rx_frame_err]: 4:4 - prim_subreg_ext #( + caliptra_prim_subreg_ext #( .DW (1) ) u_intr_test_rx_frame_err ( .re (1'b0), @@ -753,7 +753,7 @@ module uart_reg_top #( assign reg2hw.intr_test.rx_frame_err.qe = intr_test_qe; // F[rx_break_err]: 5:5 - prim_subreg_ext #( + caliptra_prim_subreg_ext #( .DW (1) ) u_intr_test_rx_break_err ( .re (1'b0), @@ -769,7 +769,7 @@ module uart_reg_top #( assign reg2hw.intr_test.rx_break_err.qe = intr_test_qe; // F[rx_timeout]: 6:6 - prim_subreg_ext #( + caliptra_prim_subreg_ext #( .DW (1) ) u_intr_test_rx_timeout ( .re (1'b0), @@ -785,7 +785,7 @@ module uart_reg_top #( assign reg2hw.intr_test.rx_timeout.qe = intr_test_qe; // F[rx_parity_err]: 7:7 - prim_subreg_ext #( + caliptra_prim_subreg_ext #( .DW (1) ) u_intr_test_rx_parity_err ( .re (1'b0), @@ -805,7 +805,7 @@ module uart_reg_top #( logic alert_test_qe; logic [0:0] alert_test_flds_we; assign alert_test_qe = &alert_test_flds_we; - prim_subreg_ext #( + caliptra_prim_subreg_ext #( .DW (1) ) u_alert_test ( .re (1'b0), @@ -823,9 +823,9 @@ module uart_reg_top #( // R[ctrl]: V(False) // F[tx]: 0:0 - prim_subreg #( + caliptra_prim_subreg #( .DW (1), - .SwAccess(prim_subreg_pkg::SwAccessRW), + .SwAccess(caliptra_prim_subreg_pkg::SwAccessRW), .RESVAL (1'h0) ) u_ctrl_tx ( .clk_i (clk_i), @@ -849,9 +849,9 @@ module uart_reg_top #( ); // F[rx]: 1:1 - prim_subreg #( + caliptra_prim_subreg #( .DW (1), - .SwAccess(prim_subreg_pkg::SwAccessRW), + .SwAccess(caliptra_prim_subreg_pkg::SwAccessRW), .RESVAL (1'h0) ) u_ctrl_rx ( .clk_i (clk_i), @@ -875,9 +875,9 @@ module uart_reg_top #( ); // F[nf]: 2:2 - prim_subreg #( + caliptra_prim_subreg #( .DW (1), - .SwAccess(prim_subreg_pkg::SwAccessRW), + .SwAccess(caliptra_prim_subreg_pkg::SwAccessRW), .RESVAL (1'h0) ) u_ctrl_nf ( .clk_i (clk_i), @@ -901,9 +901,9 @@ module uart_reg_top #( ); // F[slpbk]: 4:4 - prim_subreg #( + caliptra_prim_subreg #( .DW (1), - .SwAccess(prim_subreg_pkg::SwAccessRW), + .SwAccess(caliptra_prim_subreg_pkg::SwAccessRW), .RESVAL (1'h0) ) u_ctrl_slpbk ( .clk_i (clk_i), @@ -927,9 +927,9 @@ module uart_reg_top #( ); // F[llpbk]: 5:5 - prim_subreg #( + caliptra_prim_subreg #( .DW (1), - .SwAccess(prim_subreg_pkg::SwAccessRW), + .SwAccess(caliptra_prim_subreg_pkg::SwAccessRW), .RESVAL (1'h0) ) u_ctrl_llpbk ( .clk_i (clk_i), @@ -953,9 +953,9 @@ module uart_reg_top #( ); // F[parity_en]: 6:6 - prim_subreg #( + caliptra_prim_subreg #( .DW (1), - .SwAccess(prim_subreg_pkg::SwAccessRW), + .SwAccess(caliptra_prim_subreg_pkg::SwAccessRW), .RESVAL (1'h0) ) u_ctrl_parity_en ( .clk_i (clk_i), @@ -979,9 +979,9 @@ module uart_reg_top #( ); // F[parity_odd]: 7:7 - prim_subreg #( + caliptra_prim_subreg #( .DW (1), - .SwAccess(prim_subreg_pkg::SwAccessRW), + .SwAccess(caliptra_prim_subreg_pkg::SwAccessRW), .RESVAL (1'h0) ) u_ctrl_parity_odd ( .clk_i (clk_i), @@ -1005,9 +1005,9 @@ module uart_reg_top #( ); // F[rxblvl]: 9:8 - prim_subreg #( + caliptra_prim_subreg #( .DW (2), - .SwAccess(prim_subreg_pkg::SwAccessRW), + .SwAccess(caliptra_prim_subreg_pkg::SwAccessRW), .RESVAL (2'h0) ) u_ctrl_rxblvl ( .clk_i (clk_i), @@ -1031,9 +1031,9 @@ module uart_reg_top #( ); // F[nco]: 31:16 - prim_subreg #( + caliptra_prim_subreg #( .DW (16), - .SwAccess(prim_subreg_pkg::SwAccessRW), + .SwAccess(caliptra_prim_subreg_pkg::SwAccessRW), .RESVAL (16'h0) ) u_ctrl_nco ( .clk_i (clk_i), @@ -1059,7 +1059,7 @@ module uart_reg_top #( // R[status]: V(True) // F[txfull]: 0:0 - prim_subreg_ext #( + caliptra_prim_subreg_ext #( .DW (1) ) u_status_txfull ( .re (status_re), @@ -1074,7 +1074,7 @@ module uart_reg_top #( ); // F[rxfull]: 1:1 - prim_subreg_ext #( + caliptra_prim_subreg_ext #( .DW (1) ) u_status_rxfull ( .re (status_re), @@ -1089,7 +1089,7 @@ module uart_reg_top #( ); // F[txempty]: 2:2 - prim_subreg_ext #( + caliptra_prim_subreg_ext #( .DW (1) ) u_status_txempty ( .re (status_re), @@ -1104,7 +1104,7 @@ module uart_reg_top #( ); // F[txidle]: 3:3 - prim_subreg_ext #( + caliptra_prim_subreg_ext #( .DW (1) ) u_status_txidle ( .re (status_re), @@ -1119,7 +1119,7 @@ module uart_reg_top #( ); // F[rxidle]: 4:4 - prim_subreg_ext #( + caliptra_prim_subreg_ext #( .DW (1) ) u_status_rxidle ( .re (status_re), @@ -1134,7 +1134,7 @@ module uart_reg_top #( ); // F[rxempty]: 5:5 - prim_subreg_ext #( + caliptra_prim_subreg_ext #( .DW (1) ) u_status_rxempty ( .re (status_re), @@ -1150,7 +1150,7 @@ module uart_reg_top #( // R[rdata]: V(True) - prim_subreg_ext #( + caliptra_prim_subreg_ext #( .DW (8) ) u_rdata ( .re (rdata_re), @@ -1168,7 +1168,7 @@ module uart_reg_top #( // R[wdata]: V(False) logic wdata_qe; logic [0:0] wdata_flds_we; - prim_flop #( + caliptra_prim_flop #( .Width(1), .ResetValue(0) ) u_wdata0_qe ( @@ -1177,9 +1177,9 @@ module uart_reg_top #( .d_i(&wdata_flds_we), .q_o(wdata_qe) ); - prim_subreg #( + caliptra_prim_subreg #( .DW (8), - .SwAccess(prim_subreg_pkg::SwAccessWO), + .SwAccess(caliptra_prim_subreg_pkg::SwAccessWO), .RESVAL (8'h0) ) u_wdata ( .clk_i (clk_i), @@ -1207,7 +1207,7 @@ module uart_reg_top #( // R[fifo_ctrl]: V(False) logic fifo_ctrl_qe; logic [3:0] fifo_ctrl_flds_we; - prim_flop #( + caliptra_prim_flop #( .Width(1), .ResetValue(0) ) u_fifo_ctrl0_qe ( @@ -1217,9 +1217,9 @@ module uart_reg_top #( .q_o(fifo_ctrl_qe) ); // F[rxrst]: 0:0 - prim_subreg #( + caliptra_prim_subreg #( .DW (1), - .SwAccess(prim_subreg_pkg::SwAccessWO), + .SwAccess(caliptra_prim_subreg_pkg::SwAccessWO), .RESVAL (1'h0) ) u_fifo_ctrl_rxrst ( .clk_i (clk_i), @@ -1244,9 +1244,9 @@ module uart_reg_top #( assign reg2hw.fifo_ctrl.rxrst.qe = fifo_ctrl_qe; // F[txrst]: 1:1 - prim_subreg #( + caliptra_prim_subreg #( .DW (1), - .SwAccess(prim_subreg_pkg::SwAccessWO), + .SwAccess(caliptra_prim_subreg_pkg::SwAccessWO), .RESVAL (1'h0) ) u_fifo_ctrl_txrst ( .clk_i (clk_i), @@ -1271,9 +1271,9 @@ module uart_reg_top #( assign reg2hw.fifo_ctrl.txrst.qe = fifo_ctrl_qe; // F[rxilvl]: 4:2 - prim_subreg #( + caliptra_prim_subreg #( .DW (3), - .SwAccess(prim_subreg_pkg::SwAccessRW), + .SwAccess(caliptra_prim_subreg_pkg::SwAccessRW), .RESVAL (3'h0) ) u_fifo_ctrl_rxilvl ( .clk_i (clk_i), @@ -1298,9 +1298,9 @@ module uart_reg_top #( assign reg2hw.fifo_ctrl.rxilvl.qe = fifo_ctrl_qe; // F[txilvl]: 6:5 - prim_subreg #( + caliptra_prim_subreg #( .DW (2), - .SwAccess(prim_subreg_pkg::SwAccessRW), + .SwAccess(caliptra_prim_subreg_pkg::SwAccessRW), .RESVAL (2'h0) ) u_fifo_ctrl_txilvl ( .clk_i (clk_i), @@ -1327,7 +1327,7 @@ module uart_reg_top #( // R[fifo_status]: V(True) // F[txlvl]: 5:0 - prim_subreg_ext #( + caliptra_prim_subreg_ext #( .DW (6) ) u_fifo_status_txlvl ( .re (fifo_status_re), @@ -1342,7 +1342,7 @@ module uart_reg_top #( ); // F[rxlvl]: 21:16 - prim_subreg_ext #( + caliptra_prim_subreg_ext #( .DW (6) ) u_fifo_status_rxlvl ( .re (fifo_status_re), @@ -1359,9 +1359,9 @@ module uart_reg_top #( // R[ovrd]: V(False) // F[txen]: 0:0 - prim_subreg #( + caliptra_prim_subreg #( .DW (1), - .SwAccess(prim_subreg_pkg::SwAccessRW), + .SwAccess(caliptra_prim_subreg_pkg::SwAccessRW), .RESVAL (1'h0) ) u_ovrd_txen ( .clk_i (clk_i), @@ -1385,9 +1385,9 @@ module uart_reg_top #( ); // F[txval]: 1:1 - prim_subreg #( + caliptra_prim_subreg #( .DW (1), - .SwAccess(prim_subreg_pkg::SwAccessRW), + .SwAccess(caliptra_prim_subreg_pkg::SwAccessRW), .RESVAL (1'h0) ) u_ovrd_txval ( .clk_i (clk_i), @@ -1412,7 +1412,7 @@ module uart_reg_top #( // R[val]: V(True) - prim_subreg_ext #( + caliptra_prim_subreg_ext #( .DW (16) ) u_val ( .re (val_re), @@ -1429,9 +1429,9 @@ module uart_reg_top #( // R[timeout_ctrl]: V(False) // F[val]: 23:0 - prim_subreg #( + caliptra_prim_subreg #( .DW (24), - .SwAccess(prim_subreg_pkg::SwAccessRW), + .SwAccess(caliptra_prim_subreg_pkg::SwAccessRW), .RESVAL (24'h0) ) u_timeout_ctrl_val ( .clk_i (clk_i), @@ -1455,9 +1455,9 @@ module uart_reg_top #( ); // F[en]: 31:31 - prim_subreg #( + caliptra_prim_subreg #( .DW (1), - .SwAccess(prim_subreg_pkg::SwAccessRW), + .SwAccess(caliptra_prim_subreg_pkg::SwAccessRW), .RESVAL (1'h0) ) u_timeout_ctrl_en ( .clk_i (clk_i), diff --git a/src/uart/tb/uart_tb.sv b/src/uart/tb/uart_tb.sv index 5ba89aacb..e854891c1 100644 --- a/src/uart/tb/uart_tb.sv +++ b/src/uart/tb/uart_tb.sv @@ -23,7 +23,7 @@ module uart_tb import uart_reg_pkg::*; - import prim_mubi_pkg::mubi8_t; + import caliptra_prim_mubi_pkg::mubi8_t; ( `ifdef VERILATOR input bit clk_tb @@ -321,10 +321,10 @@ module uart_tb localparam logic [63:0] baud_rate = 115_200; logic [7:0] exp_data_q[$]; // queue of random input - task run_test; + task automatic run_test; logic [31:0] random_data; logic [7:0] exp_data, act_data; - logic [31:0] ctrl = '0; + logic [31:0] ctrl; logic [63:0] nco; repeat (1000) @(posedge clk_tb); @@ -347,6 +347,7 @@ module uart_tb nco = nco / 64'd100_000_000; $display("nco = %d", nco); + ctrl = '0; ctrl[31:16] = nco[15:0]; ctrl[1:0] = 2'b11; write_single_word(ADDR_CTRL, ctrl); // Enable RX/TX diff --git a/tools/scripts/Makefile b/tools/scripts/Makefile index 593f204ef..6a7efb724 100755 --- a/tools/scripts/Makefile +++ b/tools/scripts/Makefile @@ -1,5 +1,4 @@ # SPDX-License-Identifier: Apache-2.0 -# Copyright 2020 Western Digital Corporation or its affiliates. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. @@ -15,7 +14,8 @@ # PLAYBOOK_RANDOM_SEED ?= $(shell date +%s) -TEST_CFLAGS = -g -O3 -DMY_RANDOM_SEED=$(PLAYBOOK_RANDOM_SEED) +BUILD_CFLAGS ?= +TEST_CFLAGS = -g -O3 -DMY_RANDOM_SEED=$(PLAYBOOK_RANDOM_SEED) $(BUILD_CFLAGS) ABI = -mabi=ilp32 -march=rv32imc @@ -23,6 +23,14 @@ VERILATOR = verilator GCC_PREFIX = riscv64-unknown-elf BUILD_DIR = $(CURDIR) +rv_gcc_version = $(strip $(shell $(GCC_PREFIX)-gcc --version | head -1 | sed "s/$(GCC_PREFIX)-gcc (\w\+) //")) +$(info rv_gcc_version is $(rv_gcc_version)) +ifeq (12.2.0, $(rv_gcc_version)) +ABI = -mabi=ilp32 -march=rv32imc_zicsr_zifencei +else +ABI = -mabi=ilp32 -march=rv32imc +endif + # Define test name TESTNAME ?= iccm_lock TEST_DIR = $(CALIPTRA_ROOT)/src/integration/test_suites/$(TESTNAME) @@ -47,7 +55,8 @@ COMP_LIB_NAMES := aes \ datavault \ sha256 \ sha512 \ - soc_ifc + soc_ifc \ + clk_gate COMP_LIBS := $(foreach name, $(COMP_LIB_NAMES), $(CALIPTRA_ROOT)/src/integration/test_suites/libs/$(name)) HEADER_FILES := $(INCLUDES_DIR)/caliptra_defines.h \ $(INCLUDES_DIR)/defines.h \ @@ -74,12 +83,21 @@ OFILES += printf.o # Always compile the lib files - for every target OFILES += $(foreach comp_lib_name, $(COMP_LIB_NAMES), $(comp_lib_name).o) +# Verilator trace format +VERILATOR_TRACE=vcd + ifdef debug DEBUG_PLUS = +dumpon IRUN_DEBUG = -access +rc IRUN_DEBUG_RUN = -input $(RV_ROOT)/testbench/input.tcl VCS_DEBUG = -debug_access - VERILATOR_DEBUG = --trace --trace-structs + ifeq ($(VERILATOR_TRACE), vcd) + VERILATOR_DEBUG = --trace --trace-structs + else ifeq ($(VERILATOR_TRACE), fst) + VERILATOR_DEBUG = --trace-fst --trace-structs --trace-threads 2 + else + $(error Unsupported Verilator trace format '$(VERILATOR_TRACE)') + endif RIVIERA_DEBUG = +access +r endif @@ -138,15 +156,43 @@ includes = -I$(BUILD_DIR) # v v v v v v suppress = -Wno-WIDTH -Wno-UNOPTFLAT -Wno-LITENDIAN -Wno-CMPCONST -Wno-MULTIDRIVEN -Wno-UNPACKED -# CFLAGS for verilator generated Makefiles. Without -std=c++11 it +# CFLAGS for verilator generated Makefiles. Without -std=c++17 it # complains for `auto` variables -CFLAGS += "-std=c++11" +CFLAGS += -std=c++17 # Optimization for better performance; alternative is nothing for # slower runtime (faster compiles) -O2 for faster runtime (slower # compiles), or -O for balance. VERILATOR_MAKE_FLAGS = OPT_FAST="-Os" +# Testbench libs +VERILATOR_TB_LIBS = jtagdpi/jtagdpi.c \ + tcp_server/tcp_server.c + +# Testbench sources +VERILATOR_TB_SRCS = $(TBDIR)/test_caliptra_top_tb.cpp \ + $(addprefix $(CALIPTRA_ROOT)/src/integration/test_suites/libs/,$(VERILATOR_TB_LIBS)) + +# Testbench defs +VERILATOR_TB_DEFS = +define+CALIPTRA_INTERNAL_QSPI+CALIPTRA_INTERNAL_TRNG+CALIPTRA_INTERNAL_UART + +# By default debugging (JTAG) is locked in Caliptra. Add "DEBUG_UNLOCKED=1" to +# enable it. +ifdef DEBUG_UNLOCKED + VERILATOR_TB_DEFS += +define+CALIPTRA_DEBUG_UNLOCKED +endif + +# To enforce holding the RISC-V core in reset add "FORCE_CPU_RESET=1". +ifdef FORCE_CPU_RESET + VERILATOR_TB_DEFS += +define+CALIPTRA_FORCE_CPU_RESET +endif + +# Run time arguments from command line +VERILATOR_RUN_ARGS ?= "" + +# Add testbench lib include paths +CFLAGS += $(addprefix -I$(CALIPTRA_ROOT)/src/integration/test_suites/libs/,$(dir $(VERILATOR_TB_LIBS))) + # Targets all: clean verilator @@ -156,10 +202,13 @@ clean: dataset.asdb library.cfg vsimsa.cfg riviera-build wave.asdb sim.vcd \ *.h +clean_fw: + rm -rf *.o *.h + ############ Model Builds ############################### -verilator-build: $(TBFILES) $(INCLUDES_DIR)/defines.h test_caliptra_top_tb.cpp - $(VERILATOR) --cc -CFLAGS $(CFLAGS) \ +verilator-build: $(TBFILES) $(INCLUDES_DIR)/defines.h $(VERILATOR_TB_SRCS) + $(VERILATOR) $(VERILATOR_TB_SRCS) --cc -CFLAGS "$(CFLAGS)" \ +libext+.v+.sv +define+RV_OPENSOURCE \ --timescale 1ns/1ps \ --timing \ @@ -168,9 +217,8 @@ verilator-build: $(TBFILES) $(INCLUDES_DIR)/defines.h test_caliptra_top_tb.cpp -f $(TBDIR)/../config/caliptra_top_tb.vf --top-module caliptra_top_tb \ -f $(TBDIR)/../config/caliptra_top_tb.vlt \ -exe test_caliptra_top_tb.cpp --autoflush $(VERILATOR_DEBUG) \ - +define+CALIPTRA_INTERNAL_QSPI+CALIPTRA_INTERNAL_TRNG+CALIPTRA_INTERNAL_UART - cp $(TBDIR)/test_caliptra_top_tb.cpp obj_dir/ - $(MAKE) -j -e -C obj_dir/ -f Vcaliptra_top_tb.mk $(VERILATOR_MAKE_FLAGS) VM_PARALLEL_BUILDS=1 + $(VERILATOR_TB_DEFS) + $(MAKE) -j`nproc` -e -C obj_dir/ -f Vcaliptra_top_tb.mk $(VERILATOR_MAKE_FLAGS) VM_PARALLEL_BUILDS=1 touch verilator-build vcs-build: $(TBFILES) $(INCLUDES_DIR)/defines.h @@ -183,7 +231,7 @@ vcs-build: $(TBFILES) $(INCLUDES_DIR)/defines.h ############ TEST Simulation ############################### verilator: program.hex verilator-build - ./obj_dir/Vcaliptra_top_tb + ./obj_dir/Vcaliptra_top_tb $(VERILATOR_RUN_ARGS) vcs: program.hex vcs-build ./simv.caliptra_top_tb @@ -202,7 +250,7 @@ else ifneq (,$(wildcard $(TEST_DIR)/$(TESTNAME))) # Build program.hex from RUST executable program.hex: @echo "Building program.hex from $(TESTNAME) using Crypto Test rules for pre-compiled RUST executables" - -$(GCC_PREFIX)-objcopy -O verilog -R .data -R .rodata -R .bss -R .sbss -R .iccm -R .dccm -R .eh_frame --pad-to 0x8000 --gap-fill 0xFF --no-change-warnings $(TEST_DIR)/$(TESTNAME) program.hex + -$(GCC_PREFIX)-objcopy -O verilog -R .data -R .rodata -R .bss -R .sbss -R .iccm -R .dccm -R .eh_frame --pad-to 0xC000 --gap-fill 0xFF --no-change-warnings $(TEST_DIR)/$(TESTNAME) program.hex -$(GCC_PREFIX)-objcopy -O verilog -j .data -j .rodata -j .bss -j .sbss -j .dccm \ --change-section-lma .data-0x50000000 \ --change-section-lma .rodata-0x50000000 \ @@ -222,7 +270,7 @@ else program.hex: $(OFILE_CRT) $(OFILES) $(LINK) @echo Building $(TESTNAME) $(GCC_PREFIX)-gcc $(ABI) -Wl,-Map=$(TESTNAME).map -lgcc -T$(LINK) -o $(TESTNAME).exe $(OFILE_CRT) $(OFILES) -nostartfiles $(TEST_LIBS) - -$(GCC_PREFIX)-objcopy -O verilog -R .data_iccm0 -R .data_iccm1 -R .data_iccm2 -R .iccm -R .dccm -R .eh_frame --pad-to 0x8000 --no-change-warnings $(TESTNAME).exe program.hex + -$(GCC_PREFIX)-objcopy -O verilog -R .data_iccm0 -R .data_iccm1 -R .data_iccm2 -R .iccm -R .dccm -R .eh_frame --pad-to 0xC000 --no-change-warnings $(TESTNAME).exe program.hex -$(GCC_PREFIX)-objcopy -O verilog -j .data_iccm0 -j .data_iccm1 -j .data_iccm2 -j .dccm \ --change-section-lma .data_iccm0-0x50000000 \ --change-section-lma .data_iccm1-0x50000000 \ @@ -262,5 +310,5 @@ help: @echo Make sure the environment variable RV_ROOT is set. @echo Possible targets: verilator vcs irun vlog riviera help clean all verilator-build irun-build vcs-build riviera-build program.hex -.PHONY: help clean verilator vcs irun vlog riviera +.PHONY: help clean clean_fw verilator vcs irun vlog riviera diff --git a/tools/scripts/openocd/board/caliptra-verilator-rst.cfg b/tools/scripts/openocd/board/caliptra-verilator-rst.cfg new file mode 100644 index 000000000..630df5369 --- /dev/null +++ b/tools/scripts/openocd/board/caliptra-verilator-rst.cfg @@ -0,0 +1,5 @@ +source [find interface/sim-jtagdpi.cfg] +source [find target/veer-el2-rst.cfg] + +# Increase timeouts in simulation +riscv set_command_timeout_sec 300 diff --git a/tools/scripts/openocd/board/caliptra-verilator.cfg b/tools/scripts/openocd/board/caliptra-verilator.cfg new file mode 100644 index 000000000..c91718677 --- /dev/null +++ b/tools/scripts/openocd/board/caliptra-verilator.cfg @@ -0,0 +1,5 @@ +source [find interface/sim-jtagdpi.cfg] +source [find target/veer-el2.cfg] + +# Increase timeouts in simulation +riscv set_command_timeout_sec 300 diff --git a/tools/scripts/openocd/interface/sim-jtagdpi.cfg b/tools/scripts/openocd/interface/sim-jtagdpi.cfg new file mode 100644 index 000000000..7d43a4ad5 --- /dev/null +++ b/tools/scripts/openocd/interface/sim-jtagdpi.cfg @@ -0,0 +1,11 @@ +# Copyright lowRISC contributors. +# Licensed under the Apache License, Version 2.0, see LICENSE for details. +# SPDX-License-Identifier: Apache-2.0 + +# "JTAG adapter" for simulation, exposed to OpenOCD through a TCP socket +# speaking the remote_bitbang protocol. The adapter is implemented as +# SystemVerilog DPI module. + +adapter driver remote_bitbang +remote_bitbang port 5000 +remote_bitbang host localhost diff --git a/tools/scripts/openocd/target/veer-el2-rst.cfg b/tools/scripts/openocd/target/veer-el2-rst.cfg new file mode 100644 index 000000000..0f4c86fde --- /dev/null +++ b/tools/scripts/openocd/target/veer-el2-rst.cfg @@ -0,0 +1,35 @@ +if { [info exists CHIPNAME] } { + set _CHIPNAME $CHIPNAME +} else { + set _CHIPNAME riscv +} + +if { [info exists CPUTAPID ] } { + set _CPUTAPID $CPUTAPID +} else { + set _CPUTAPID 0x1000008b +} + +jtag newtap $_CHIPNAME tap -irlen 5 -expected-id $_CPUTAPID +set _TARGETNAME $_CHIPNAME.tap +target create $_TARGETNAME.0 riscv -chain-position $_TARGETNAME -rtos hwthread + +# Configure work area in on-chip SRAM +$_TARGETNAME.0 configure -work-area-phys 0x50001000 -work-area-size 0x1000 -work-area-backup 0 + +# Mem access mode +riscv set_mem_access sysbus + +# The following commands disable target examination and set explicitly the +# core parameters read from CSRs. These required a modified version of +# OpenOCD from https://github.com/antmicro/openocd/tree/riscv-nohalt +riscv set_nohalt on +riscv set_xlen 32 +riscv set_misa 0x40001104 + +# Be verbose about GDB errors +gdb_report_data_abort enable +gdb_report_register_access_error enable + +# Always use hardware breakpoints. +gdb_breakpoint_override hard diff --git a/tools/scripts/openocd/target/veer-el2.cfg b/tools/scripts/openocd/target/veer-el2.cfg new file mode 100644 index 000000000..45374886d --- /dev/null +++ b/tools/scripts/openocd/target/veer-el2.cfg @@ -0,0 +1,28 @@ +if { [info exists CHIPNAME] } { + set _CHIPNAME $CHIPNAME +} else { + set _CHIPNAME riscv +} + +if { [info exists CPUTAPID ] } { + set _CPUTAPID $CPUTAPID +} else { + set _CPUTAPID 0x1000008b +} + +jtag newtap $_CHIPNAME tap -irlen 5 -expected-id $_CPUTAPID +set _TARGETNAME $_CHIPNAME.tap +target create $_TARGETNAME.0 riscv -chain-position $_TARGETNAME -rtos hwthread + +# Configure work area in on-chip SRAM +$_TARGETNAME.0 configure -work-area-phys 0x50001000 -work-area-size 0x1000 -work-area-backup 0 + +# Mem access mode +riscv set_mem_access abstract + +# Be verbose about GDB errors +gdb_report_data_abort enable +gdb_report_register_access_error enable + +# Always use hardware breakpoints. +gdb_breakpoint_override hard diff --git a/tools/scripts/rdl_post_process.py b/tools/scripts/rdl_post_process.py index 4690f7e2f..4c86f1091 100644 --- a/tools/scripts/rdl_post_process.py +++ b/tools/scripts/rdl_post_process.py @@ -32,9 +32,12 @@ def scrub_line_by_line(fname): # and dimensions are on separate lines for line in rhandle: has_assign = re.search(r'\bassign\b', line) + has_reg_strb = re.search(r'\bdecoded_reg_strb\b', line) has_unpacked = re.search(r'\[\d+\]', line) has_struct = re.search(r'\bstruct\b\s*(?:unpacked)?', line) - if (has_assign is not None): + # Skip lines with logic assignments or references to signals; we + # only want to scrub signal definitions for unpacked arrays + if (has_assign is not None or has_reg_strb is not None): mod_lines+=line elif (has_struct is not None): line = re.sub(r'(\bstruct\b)\s*(?:unpacked)?', r'\1 packed', line) diff --git a/tools/scripts/reg_doc_gen.sh b/tools/scripts/reg_doc_gen.sh index 3a222c621..367c77598 100755 --- a/tools/scripts/reg_doc_gen.sh +++ b/tools/scripts/reg_doc_gen.sh @@ -14,7 +14,7 @@ # limitations under the License. # -python tools/scripts/reg_doc_gen.py \ +python3 tools/scripts/reg_doc_gen.py \ src/integration/rtl/caliptra_reg.rdl \ src/keyvault/rtl/kv_reg.rdl \ src/pcrvault/rtl/pv_reg.rdl \ @@ -33,7 +33,7 @@ src/csrng/data/csrng.rdl \ src/spi_host/data/spi_host.rdl \ src/uart/data/uart.rdl -python tools/scripts/reg_doc_gen.py \ +python3 tools/scripts/reg_doc_gen.py \ src/soc_ifc/rtl/caliptra_top_reg.rdl \ src/soc_ifc/rtl/soc_ifc_doc.rdl \ src/soc_ifc/rtl/mbox_csr.rdl \ diff --git a/tools/scripts/reg_gen.py b/tools/scripts/reg_gen.py index 9d48a4e39..eed084da1 100644 --- a/tools/scripts/reg_gen.py +++ b/tools/scripts/reg_gen.py @@ -98,8 +98,15 @@ def get_regfile_name(self): ) # Export a UVM register model - exporter = UVMExporter() + exporter = UVMExporter(user_template_dir=os.path.join(repo_root, "tools/templates/rdl/uvm")) exporter.export(root, os.path.join(rtl_output_dir, os.path.splitext(os.path.basename(sys.argv[1]))[0]) + "_uvm.sv") + # The below lines are used to generate a baseline/starting point for the include files "_covergroups.svh" and "_sample.svh" + # The generated files will need to be hand-edited to provide the desired functionality. + # Uncomment these lines and run this script directly on the target RDL file to generate the files. +# exporter = UVMExporter(user_template_dir=os.path.join(repo_root, "tools/templates/rdl/cov")) +# exporter.export(root, os.path.join(rtl_output_dir, os.path.splitext(os.path.basename(sys.argv[1]))[0]) + "_covergroups.svh") +# exporter = UVMExporter(user_template_dir=os.path.join(repo_root, "tools/templates/rdl/smp")) +# exporter.export(root, os.path.join(rtl_output_dir, os.path.splitext(os.path.basename(sys.argv[1]))[0]) + "_sample.svh") # Traverse the register model! walker = RDLWalker(unroll=True) @@ -108,6 +115,7 @@ def get_regfile_name(self): # Scrub the output SystemVerilog files to modify the coding style # - Change unpacked arrays to packed, unpacked structs to packed + # TODO just make a new exporter template instead of scrubbing? rdl_post_process.scrub_line_by_line(str(pkglistener.get_regfile_name() + ".sv")) rdl_post_process.scrub_line_by_line(str(pkglistener.get_regfile_name() + "_pkg.sv")) diff --git a/tools/scripts/run_verilator_l0_regression.py b/tools/scripts/run_verilator_l0_regression.py index acce0bd85..a4cbbd2ee 100644 --- a/tools/scripts/run_verilator_l0_regression.py +++ b/tools/scripts/run_verilator_l0_regression.py @@ -22,6 +22,7 @@ import subprocess import logging import datetime +from multiprocessing import Pool logger = logging.getLogger() logger.setLevel(logging.INFO) @@ -119,11 +120,19 @@ def getTestNames(): for testYml in testPaths: x = re.search(r'../test_suites/(\S+)/\S+.yml', testYml) + # Skip clk gating tests in Verilator until PC issue is resolved + # https://github.com/chipsalliance/Cores-VeeR-EL2/issues/88 + # https://github.com/chipsalliance/caliptra-rtl/issues/126 + if (re.search(r'(smoke_test_clk_gating|smoke_test_cg_wdt)',x.groups()[0])) : + continue integrationTestSuiteList.append(x.groups()[0]) return integrationTestSuiteList -def runTest(test, scratch, verilated): +def runTest(args): + + (test, scratch, verilated) = args; + testdir = os.path.join(scratch, test) # Reuse pristine verilator-build output for each test shutil.copytree(verilated, testdir) @@ -146,7 +155,7 @@ def runTest(test, scratch, verilated): # Invoke makefile for the current test mfile = os.path.join(os.environ.get('CALIPTRA_ROOT'),"tools/scripts/Makefile") testname = "TESTNAME=" + test - cmd = " ".join(["make", "-C", testdir, "-f", mfile, testname, "verilator"]) + cmd = " ".join(["make", "-C", testdir, "-f", mfile, testname, "verilator", "VERILATOR_RUN_ARGS=+CLP_REGRESSION"]) exitcode, resultout, resulterr = runBashScript(cmd) # Parse and log the results @@ -200,20 +209,22 @@ def main(): verilated = verilateTB(scratch) # Parse yaml file for test list testnames=getTestNames() - exitcode = 0 - # Run all tests and accumulate error status codes - for test in testnames: - exitcode += runTest(test, scratch, verilated) + # Run all tests in parallel and accumulate error status codes to the global failcount + failcount=0 + run_args = [(testname, scratch, verilated) for testname in testnames] + test_status_list = Pool(len(testnames)).map(runTest, run_args) + for sts in test_status_list: + failcount += sts # Ending summary infoMsg = f"############################################## SUMMARY ##############################################" logger.info(infoMsg) - if exitcode == 0: + if failcount == 0: infoMsg = f"All tests passed!" logger.info(infoMsg) else: - errorMsg = f"Regression failed! Total number of failing tests: {exitcode}" + errorMsg = f"Regression failed! Total number of failing tests: {failcount}" logger.error(errorMsg) - return exitcode + return failcount if __name__ == "__main__": sys.exit(main()) diff --git a/tools/templates/rdl/cov/main.sv b/tools/templates/rdl/cov/main.sv new file mode 100644 index 000000000..10c531d0c --- /dev/null +++ b/tools/templates/rdl/cov/main.sv @@ -0,0 +1,14 @@ +{% import 'uvm_reg.sv' as uvm_reg with context %} +{%- macro top() %} +{%- for node in top_node.descendants(in_post_order=True) -%} + {{child_cg(node)}} +{%- endfor -%} +{% endmacro -%} + +{% macro child_cg(node) -%} + {%- if isinstance(node, RegNode) -%} + {%- if not node.is_virtual -%} + {{uvm_reg.cg_definition(node)}} + {%- endif -%} + {%- endif -%} +{%- endmacro %} diff --git a/tools/templates/rdl/cov/top_pkg.sv b/tools/templates/rdl/cov/top_pkg.sv new file mode 100644 index 000000000..4502c01c3 --- /dev/null +++ b/tools/templates/rdl/cov/top_pkg.sv @@ -0,0 +1,20 @@ +{%- import 'main.sv' as main with context -%} +{%- raw -%} +// SPDX-License-Identifier: Apache-2.0 +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +{% endraw %} +{{ "`ifndef" }} {{top_node.get_path()|upper}}_COVERGROUPS + {{ "`define" }} {{top_node.get_path()|upper}}_COVERGROUPS + {{main.top()|indent}} +{{ "`endif" }} diff --git a/tools/templates/rdl/cov/uvm_reg.sv b/tools/templates/rdl/cov/uvm_reg.sv new file mode 120000 index 000000000..0d29126df --- /dev/null +++ b/tools/templates/rdl/cov/uvm_reg.sv @@ -0,0 +1 @@ +../uvm/uvm_reg.sv \ No newline at end of file diff --git a/tools/templates/rdl/smp/main.sv b/tools/templates/rdl/smp/main.sv new file mode 100644 index 000000000..f6dc1c077 --- /dev/null +++ b/tools/templates/rdl/smp/main.sv @@ -0,0 +1,16 @@ +{%- import 'uvm_reg.sv' as uvm_reg with context -%} +{%- macro top() -%} +{%- for node in top_node.descendants(in_post_order=True) -%} + {{child_smp(node)}} +{%- endfor -%} +{%- endmacro -%} + +{%- macro child_smp(node) -%} + {%- if isinstance(node, RegNode) -%} + {% if not node.is_virtual %} +{{"/*-----------------------"}} {{get_class_name(node)|upper}} {{"SAMPLE FUNCTIONS -----------------------*/"}} +{{uvm_reg.function_sample_def(node)}} +{{uvm_reg.function_sample_values_def(node)}} + {%- endif %} + {%- endif -%} +{%- endmacro %} diff --git a/tools/templates/rdl/smp/top_pkg.sv b/tools/templates/rdl/smp/top_pkg.sv new file mode 100644 index 000000000..429fcd633 --- /dev/null +++ b/tools/templates/rdl/smp/top_pkg.sv @@ -0,0 +1,20 @@ +{%- import 'main.sv' as main with context -%} +{%- raw -%} +// SPDX-License-Identifier: Apache-2.0 +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +{% endraw %} +{{ "`ifndef" }} {{top_node.get_path()|upper}}_SAMPLE + {{ "`define" }} {{top_node.get_path()|upper}}_SAMPLE + {{main.top()|indent}} +{{ "`endif" }} diff --git a/tools/templates/rdl/smp/uvm_reg.sv b/tools/templates/rdl/smp/uvm_reg.sv new file mode 120000 index 000000000..0d29126df --- /dev/null +++ b/tools/templates/rdl/smp/uvm_reg.sv @@ -0,0 +1 @@ +../uvm/uvm_reg.sv \ No newline at end of file diff --git a/tools/templates/rdl/uvm/main.sv b/tools/templates/rdl/uvm/main.sv new file mode 100644 index 000000000..e3bdff560 --- /dev/null +++ b/tools/templates/rdl/uvm/main.sv @@ -0,0 +1,37 @@ +{% import 'uvm_reg.sv' as uvm_reg with context %} +{% import 'uvm_vreg.sv' as uvm_vreg with context %} +{% import 'uvm_reg_block-mem.sv' as uvm_reg_block_mem with context %} +{% import 'uvm_reg_block.sv' as uvm_reg_block with context %} + + +{% macro top() -%} +{{include_covergroups(top_node)}} + {%- for node in top_node.descendants(in_post_order=True) -%} + {{child_def(node)}} + {%- endfor -%} + {{child_def(top_node)}} +{{include_sample(top_node)}} +{%- endmacro %} + + +{% macro child_def(node) -%} + {%- if isinstance(node, RegNode) -%} + {%- if node.is_virtual -%} + {{uvm_vreg.class_definition(node)}} + {%- else -%} + {{uvm_reg.class_definition(node)}} + {%- endif -%} + {%- elif isinstance(node, (RegfileNode, AddrmapNode)) -%} + {{uvm_reg_block.class_definition(node)}} + {%- elif isinstance(node, MemNode) -%} + {{uvm_reg_block_mem.class_definition(node)}} + {%- endif -%} +{%- endmacro %} + +{% macro include_covergroups(node) -%} +`include "{{get_class_name(node)}}_covergroups.svh" +{%- endmacro %} + +{% macro include_sample(node) -%} +`include "{{get_class_name(node)}}_sample.svh" +{%- endmacro %} diff --git a/tools/templates/rdl/uvm/uvm_reg.sv b/tools/templates/rdl/uvm/uvm_reg.sv new file mode 100644 index 000000000..bf30f1187 --- /dev/null +++ b/tools/templates/rdl/uvm/uvm_reg.sv @@ -0,0 +1,288 @@ +{% import 'utils.sv' as utils with context %} + +//------------------------------------------------------------------------------ +// uvm_reg definition +//------------------------------------------------------------------------------ +{% macro class_definition(node) -%} +{%- if class_needs_definition(node) %} +// {{get_class_friendly_name(node)}} +class {{get_class_name(node)}} extends uvm_reg; +{%- if use_uvm_factory %} + `uvm_object_utils({{get_class_name(node)}}) +{%- endif %} + protected uvm_reg_data_t m_current; + protected uvm_reg_data_t m_data; + protected bit m_is_read; +{% for field in node.fields() %} + {{bit_covergroup_name(node)|indent}} {{bit_covergroup_inst(field)}}[{{field.width}}]; +{%- endfor %} + {{fld_covergroup_name(node)|indent}} fld_cg; + {{child_insts(node)|indent}} + {{function_new(node)|indent}} + {{function_sample_values(node)|indent}} + {{function_sample(node)|indent}} + + {{function_build(node)|indent}} +endclass : {{get_class_name(node)}} +{% endif -%} +{%- endmacro %} + + +//------------------------------------------------------------------------------ +// Covergroup Definitions +//------------------------------------------------------------------------------ +{% macro cg_definition(node) %} +{{"/*-----------------------"}} {{get_class_name(node)|upper}} {{"COVERGROUPS -----------------------*/"}} +covergroup {{bit_covergroup_name(node)}} with function sample(input bit reg_bit); + option.per_instance = 1; + {{bit_coverpoint()|indent}} +endgroup +covergroup {{fld_covergroup_name(node)}} with function sample({{covergroup_inputs(node)}}); + option.per_instance = 1; + {{fld_coverpoints(node)|indent}} +endgroup +{% endmacro %} + + +//------------------------------------------------------------------------------ +// Covergroup Inputs +//------------------------------------------------------------------------------ +{% macro covergroup_inputs(node) %} +{% for field in node.fields() -%} +input bit [{{field.width}}-1:0] {{get_inst_name(field)}}{% if not loop.last %}{{","}}{% endif %} +{% endfor %} +{%- endmacro %} + + +//------------------------------------------------------------------------------ +// Coverpoint Definitions +//------------------------------------------------------------------------------ +{%- macro fld_coverpoints(node) -%} +{%- for field in node.fields() -%} +{{field_coverpoint(field)}} +{%- endfor -%} +{%- endmacro -%} + + +//------------------------------------------------------------------------------ +// Singular Coverpoint Definition +//------------------------------------------------------------------------------ +{%- macro bit_coverpoint() -%} +reg_bit_cp : coverpoint reg_bit { + bins value[2] = {0,1}; +} +reg_bit_edge_cp : coverpoint reg_bit { + bins rise = (0 => 1); + bins fall = (1 => 0); +} +{% endmacro %} +{%- macro field_coverpoint(field) -%} +{{get_inst_name(field)}}_cp : coverpoint {{get_inst_name(field)}}; +{% endmacro %} + + +//------------------------------------------------------------------------------ +// Child instances +//------------------------------------------------------------------------------ +{% macro child_insts(node) -%} +{%- for field in node.fields() -%} +rand uvm_reg_field {{get_inst_name(field)}}; +{% endfor -%} +{%- endmacro %} + + +//------------------------------------------------------------------------------ +// new() function +//------------------------------------------------------------------------------ +{% macro function_new(node) -%} +function new(string name = "{{get_class_name(node)}}"); + super.new(name, {{node.get_property('regwidth')}}, build_coverage(UVM_CVR_ALL)); +endfunction : new +{%- endmacro %} + + +//------------------------------------------------------------------------------ +// sample() function declaration +//------------------------------------------------------------------------------ +{% macro function_sample(node) -%} +extern protected virtual function void sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); +{%- endmacro %} + + +//------------------------------------------------------------------------------ +// sample_values() function declaration +//------------------------------------------------------------------------------ +{% macro function_sample_values(node) -%} +extern virtual function void sample_values(); +{%- endmacro %} + + +//------------------------------------------------------------------------------ +// sample() function definition +//------------------------------------------------------------------------------ +{%- macro function_sample_def(node) -%} +function void {{get_class_name(node)}}::sample(uvm_reg_data_t data, + uvm_reg_data_t byte_en, + bit is_read, + uvm_reg_map map); + m_current = get(); + m_data = data; + m_is_read = is_read; + if (get_coverage(UVM_CVR_REG_BITS)) begin +{%- for field in node.fields() %} + foreach({{bit_covergroup_inst(field)}}[bt]) this.{{bit_covergroup_inst(field)}}[bt].sample(data[{{field.lsb}} + bt]); +{%- endfor %} + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample({{covergroup_sample_args(node)}}); + end +endfunction +{% endmacro -%} + + +//------------------------------------------------------------------------------ +// sample_values() function definition +//------------------------------------------------------------------------------ +{%- macro function_sample_values_def(node) -%} +function void {{get_class_name(node)}}::sample_values(); + if (get_coverage(UVM_CVR_REG_BITS)) begin +{%- for field in node.fields() %} + foreach({{bit_covergroup_inst(field)}}[bt]) this.{{bit_covergroup_inst(field)}}[bt].sample({{get_inst_name(field)}}.get_mirrored_value() >> bt); +{%- endfor %} + end + if (get_coverage(UVM_CVR_FIELD_VALS)) begin + this.fld_cg.sample({{covergroup_sample_values_args(node)}}); + end +endfunction +{% endmacro %} + + +//------------------------------------------------------------------------------ +// build() function +//------------------------------------------------------------------------------ +{% macro function_build(node) -%} +virtual function void build(); + {%- for field in node.fields() %} + {%- if use_uvm_factory %} + this.{{get_inst_name(field)}} = uvm_reg_field::type_id::create("{{get_inst_name(field)}}"); + {%- else %} + this.{{get_inst_name(field)}} = new("{{get_inst_name(field)}}"); + {%- endif %} + this.{{get_inst_name(field)}}.configure(this, {{field.width}}, {{field.lsb}}, "{{get_field_access(field)}}", {{field.is_volatile|int}}, {{"'h%x" % field.get_property('reset', default=0)}}, {{field.get_property('reset') is not none|int}}, 1, 0); + {%- endfor %} + if (has_coverage(UVM_CVR_REG_BITS)) begin +{%- for field in node.fields() %} + foreach({{bit_covergroup_inst(field)}}[bt]) {{bit_covergroup_inst(field)}}[bt] = new(); +{%- endfor %} + end + if (has_coverage(UVM_CVR_FIELD_VALS)) + fld_cg = new(); +endfunction : build +{%- endmacro %} + + +//------------------------------------------------------------------------------ +// Covergroup Name +//------------------------------------------------------------------------------ +{% macro bit_covergroup_name(node) -%} {{get_class_name(node)}}_bit_cg {%- endmacro %} +{% macro bit_covergroup_inst(field) -%} {{"%s_bit_cg"|format(get_inst_name(field))}} {%- endmacro %} +{% macro fld_covergroup_name(node) -%} {{get_class_name(node)}}_fld_cg {%- endmacro %} + + +//------------------------------------------------------------------------------ +// Covergroup Constructor Arguments +//------------------------------------------------------------------------------ +{% macro covergroup_new_args(node) -%} + {%- for field in node.fields() %} {{covergroup_new_arg(field)}} {% if loop.last %} {{''}} {% else %} {{","}} {% endif %} {%- endfor %} +{%- endmacro %} +{% macro covergroup_new_arg(field) -%} + {{get_inst_name(field)}}.get_reset() +{%- endmacro %} +{% macro covergroup_sample_args(node) -%} + {%- for field in node.fields() %} {{covergroup_sample_arg(field)}} {% if loop.last %} {{''}} {% else %} {{","}} {% endif %} {%- endfor %} +{%- endmacro %} +{% macro covergroup_sample_arg(field) -%} + data[{{field.msb}}:{{field.lsb}}]{{"/*%s*/"|format(get_inst_name(field))}} +{%- endmacro %} +{% macro covergroup_sample_values_args(node) -%} + {%- for field in node.fields() %} {{covergroup_sample_values_arg(field)}} {% if loop.last %} {{''}} {% else %} {{","}} {% endif %} {%- endfor %} +{%- endmacro %} +{% macro covergroup_sample_values_arg(field) -%} + {{get_inst_name(field)}}.get_mirrored_value() +{%- endmacro %} + + +//------------------------------------------------------------------------------ +// build() actions for uvm_reg instance (called by parent) +//------------------------------------------------------------------------------ +{% macro build_instance(node) -%} +{%- if node.is_array %} +foreach(this.{{get_inst_name(node)}}[{{utils.array_iterator_list(node)}}]) begin + {%- if use_uvm_factory %} + this.{{get_inst_name(node)}}{{utils.array_iterator_suffix(node)}} = {{get_class_name(node)}}::type_id::create($sformatf("{{get_inst_name(node)}}{{utils.array_suffix_format(node)}}", {{utils.array_iterator_list(node)}})); + {%- else %} + this.{{get_inst_name(node)}}{{utils.array_iterator_suffix(node)}} = new($sformatf("{{get_inst_name(node)}}{{utils.array_suffix_format(node)}}", {{utils.array_iterator_list(node)}})); + {%- endif %} + this.{{get_inst_name(node)}}{{utils.array_iterator_suffix(node)}}.configure(this); + {{add_hdl_path_slices(node, get_inst_name(node) + utils.array_iterator_suffix(node))|trim|indent}} + this.{{get_inst_name(node)}}{{utils.array_iterator_suffix(node)}}.build(); + this.default_map.add_reg(this.{{get_inst_name(node)}}{{utils.array_iterator_suffix(node)}}, {{get_array_address_offset_expr(node)}}); +end +{%- else %} +{%- if use_uvm_factory %} +this.{{get_inst_name(node)}} = {{get_class_name(node)}}::type_id::create("{{get_inst_name(node)}}"); +{%- else %} +this.{{get_inst_name(node)}} = new("{{get_inst_name(node)}}"); +{%- endif %} +this.{{get_inst_name(node)}}.configure(this); +{{add_hdl_path_slices(node, get_inst_name(node))|trim}} +this.{{get_inst_name(node)}}.build(); +this.default_map.add_reg(this.{{get_inst_name(node)}}, {{"'h%x" % node.raw_address_offset}}); +{%- endif %} +{%- endmacro %} + +//------------------------------------------------------------------------------ +// Load HDL path slices for this reg instance +//------------------------------------------------------------------------------ +{% macro add_hdl_path_slices(node, inst_ref) -%} +{%- if node.get_property('hdl_path') %} +{{inst_ref}}.add_hdl_path_slice("{{node.get_property('hdl_path')}}", -1, -1); +{%- endif -%} + +{%- if node.get_property('hdl_path_gate') %} +{{inst_ref}}.add_hdl_path_slice("{{node.get_property('hdl_path_gate')}}", -1, -1, 0, "GATE"); +{%- endif -%} + +{%- for field in node.fields() %} +{%- if field.get_property('hdl_path_slice') is none -%} +{%- elif field.get_property('hdl_path_slice')|length == 1 %} +{{inst_ref}}.add_hdl_path_slice("{{field.get_property('hdl_path_slice')[0]}}", {{field.lsb}}, {{field.width}}); +{%- elif field.get_property('hdl_path_slice')|length == field.width %} +{%- for slice in field.get_property('hdl_path_slice') %} +{%- if field.msb > field.lsb %} +{{inst_ref}}.add_hdl_path_slice("{{slice}}", {{field.msb - loop.index0}}, 1); +{%- else %} +{{inst_ref}}.add_hdl_path_slice("{{slice}}", {{field.msb + loop.index0}}, 1); +{%- endif %} +{%- endfor %} +{%- endif %} +{%- endfor -%} + +{%- for field in node.fields() %} +{%- if field.get_property('hdl_path_gate_slice') is none -%} +{%- elif field.get_property('hdl_path_gate_slice')|length == 1 %} +{{inst_ref}}.add_hdl_path_slice("{{field.get_property('hdl_path_gate_slice')[0]}}", {{field.lsb}}, {{field.width}}, 0, "GATE"); +{%- elif field.get_property('hdl_path_gate_slice')|length == field.width %} +{%- for slice in field.get_property('hdl_path_gate_slice') %} +{%- if field.msb > field.lsb %} +{{inst_ref}}.add_hdl_path_slice("{{slice}}", {{field.msb - loop.index0}}, 1, 0, "GATE"); +{%- else %} +{{inst_ref}}.add_hdl_path_slice("{{slice}}", {{field.msb + loop.index0}}, 1, 0, "GATE"); +{%- endif %} +{%- endfor %} +{%- endif %} +{%- endfor %} +{%- endmacro %}